diff --git a/.editorconfig b/.editorconfig index 5538a2b00f..8388ebc632 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,17 +1,1262 @@ -; Top-most http://editorconfig.org/ file +; Top-most https://editorconfig.org/ file root = true +charset=utf-8 ; Unix-style newlines [*] end_of_line = LF insert_final_newline = true +trim_trailing_whitespace = true ; 4-column tab indentation -[*.cs] +[*.{cs,csproj,yaml,lua,sh,ps1}] indent_style = tab indent_size = 4 -; 4-column tab indentation -[*.yaml] -indent_style = tab -indent_size = 4 \ No newline at end of file +; .NET coding conventions +#### Code Style Rules +#### https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ + +# Severity Levels: https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/configuration-options#severity-level +# 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. + +### Language and Unnecessary Rules +### https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/language-rules + +## 'using' directive 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 + +# 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 + +# IDE0065 'using' directive placement +#csharp_using_directive_placement = outside_namespace +dotnet_diagnostic.IDE0065.severity = silent + +## 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 + +# 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 + +# IDE0200 Remove unnecessary lambda expression +#csharp_style_prefer_method_group_conversion = true +dotnet_diagnostic.IDE0200.severity = silent # Requires C# 11 + +# 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 + +# IDE0290 Use primary constructor +#csharp_style_prefer_primary_constructors = true +dotnet_diagnostic.IDE0200.severity = silent # Requires C# 12 + +# 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 + +# IDE0017 Use object initializers +#dotnet_style_object_initializer = true +dotnet_diagnostic.IDE0017.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 + +# IDE0033 Use explicitly provided tuple name +#dotnet_style_explicit_tuple_names = true +dotnet_diagnostic.IDE0033.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 + +# 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 +dotnet_diagnostic.IDE0045.severity = silent + +# IDE0046 Use conditional expression for return +#dotnet_style_prefer_conditional_expression_over_return = true +dotnet_diagnostic.IDE0046.severity = silent + +# IDE0050 Convert anonymous type to tuple +# 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 + +# 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 + +# IDE0070 Use 'System.HashCode.Combine' +# No options +dotnet_diagnostic.IDE0070.severity = warning + +# IDE0071 Simplify interpolation +#dotnet_style_prefer_simplified_interpolation = true +dotnet_diagnostic.IDE0071.severity = warning + +# IDE0075 Simplify conditional expression +#dotnet_style_prefer_simplified_boolean_expressions = true +dotnet_diagnostic.IDE0075.severity = warning + +# IDE0082 Convert 'typeof' to 'nameof' +# 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 + +# IDE0220 Add explicit cast in foreach loop +#dotnet_style_prefer_foreach_explicit_cast_in_source = when_strongly_typed +dotnet_diagnostic.IDE0220.severity = warning + +# IDE0230 Use UTF-8 string literal +#csharp_style_prefer_utf8_string_literals = true +dotnet_diagnostic.IDE0230.severity = silent # Requires C# 11 + +# IDE0240 Nullable directive is redundant +# No options +dotnet_diagnostic.IDE0240.severity = warning + +# IDE0241 Nullable directive is unnecessary +# No options +dotnet_diagnostic.IDE0241.severity = warning + +# 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 + +# IDE0300 Use collection expression for array +# From above, uses dotnet_style_prefer_collection_expression +dotnet_diagnostic.IDE0300.severity = silent # Requires C# 12 + +# IDE0301 Use collection expression for empty +# From above, uses dotnet_style_prefer_collection_expression +dotnet_diagnostic.IDE0301.severity = silent # Requires C# 12 + +# 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 + +# IDE0062 Make local function static +#csharp_prefer_static_local_function = true +dotnet_diagnostic.IDE0062.severity = warning + +# IDE0064 Make struct fields writable +# No options +dotnet_diagnostic.IDE0064.severity = warning + +# IDE0250 Struct can be made 'readonly' +#csharp_style_prefer_readonly_struct = true +dotnet_diagnostic.IDE0250.severity = warning + +# IDE0251 Member can be made 'readonly' +#csharp_style_prefer_readonly_struct_member = true +dotnet_diagnostic.IDE0251.severity = warning + +# IDE0320 Make anonymous function static +#csharp_prefer_static_anonymous_function = true +dotnet_diagnostic.IDE0320.severity = warning + +## Null-checking preferences + +# 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 + +## Parameter preferences + +# IDE0060 Remove unused parameter +dotnet_code_quality_unused_parameters = non_public +dotnet_diagnostic.IDE0060.severity = warning + +# IDE0280 Use 'nameof' +# No options +dotnet_diagnostic.IDE0280.severity = silent # Requires C# 11 + +## Parentheses preferences + +# 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 + +# IDE0019 Use pattern matching to avoid 'as' followed by a 'null' check +#csharp_style_pattern_matching_over_as_with_null_check = true +dotnet_diagnostic.IDE0019.severity = warning + +# IDE0020/IDE0038 Use pattern matching to avoid 'is' check followed by a cast (with variable)/Use pattern matching to avoid 'is' check followed by a cast (without variable) +#csharp_style_pattern_matching_over_is_with_cast_check = true +dotnet_diagnostic.IDE0020.severity = warning +dotnet_diagnostic.IDE0038.severity = warning + +# IDE0066 Use switch expression +#csharp_style_prefer_switch_expression = true +dotnet_diagnostic.IDE0066.severity = silent + +# 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 +dotnet_diagnostic.IDE0083.severity = warning + +# IDE0170 Simplify property pattern +#csharp_style_prefer_extended_property_pattern = true +dotnet_diagnostic.IDE0170.severity = silent # Requires C# 10 + +## Suppression preferences + +# IDE0079 Remove unnecessary suppression +#dotnet_remove_unnecessary_suppression_exclusions = none +dotnet_diagnostic.IDE0079.severity = warning + +## 'this' and 'Me' 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 + +## '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 + + +### Miscellaneous Rules +### https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/miscellaneous-rules + +# IDE0076 Remove invalid global 'SuppressMessageAttribute' +# No options +dotnet_diagnostic.IDE0076.severity = warning + +# IDE0077 Avoid legacy format target in global 'SuppressMessageAttribute' +# No options +dotnet_diagnostic.IDE0077.severity = warning + +### Formatting Rules (IDE0055) +### https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide0055 +dotnet_diagnostic.IDE0055.severity = warning + +#dotnet_sort_system_directives_first = true +#dotnet_separate_import_directive_groups = false + +#csharp_new_line_before_open_brace = all +#csharp_new_line_before_else = true +#csharp_new_line_before_catch = true +#csharp_new_line_before_finally = true +#csharp_new_line_before_members_in_object_initializers = true +#csharp_new_line_before_members_in_anonymous_types = true +#csharp_new_line_between_query_expression_clauses = true + +#csharp_indent_case_contents = true +#csharp_indent_switch_labels = true +#csharp_indent_labels = one_less_than_current +#csharp_indent_block_contents = true +#csharp_indent_braces = false +csharp_indent_case_contents_when_block = false + +#csharp_space_after_cast = false +#csharp_space_after_keywords_in_control_flow_statements = true +#csharp_space_between_parentheses = +#csharp_space_before_colon_in_inheritance_clause = true +#csharp_space_after_colon_in_inheritance_clause = true +#csharp_space_around_binary_operators = before_and_after +#csharp_space_between_method_declaration_parameter_list_parentheses = false +#csharp_space_between_method_declaration_empty_parameter_list_parentheses = false +#csharp_space_between_method_declaration_name_and_open_parenthesis = false +#csharp_space_between_method_call_parameter_list_parentheses = false +#csharp_space_between_method_call_empty_parameter_list_parentheses = false +#csharp_space_between_method_call_name_and_opening_parenthesis = false +#csharp_space_after_comma = true +#csharp_space_before_comma = false +#csharp_space_after_dot = false +#csharp_space_before_dot = false +#csharp_space_after_semicolon_in_for_statement = true +#csharp_space_before_semicolon_in_for_statement = false +#csharp_space_around_declaration_statements = false +#csharp_space_before_open_square_brackets = false +#csharp_space_between_empty_square_brackets = false +#csharp_space_between_square_brackets = false + +#csharp_preserve_single_line_statements = true +#csharp_preserve_single_line_blocks = true + + +### Naming Rules (IDE1006) +### https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/naming-rules +dotnet_diagnostic.IDE1006.severity = warning + +## Naming styles + +dotnet_naming_style.camel_case.capitalization = camel_case + +dotnet_naming_style.pascal_case.capitalization = pascal_case + +dotnet_naming_style.i_prefix_pascal_case.capitalization = pascal_case +dotnet_naming_style.i_prefix_pascal_case.required_prefix = I + +## Naming Symbols + +dotnet_naming_symbols.const_locals.applicable_kinds = local +dotnet_naming_symbols.const_locals.applicable_accessibilities = * +dotnet_naming_symbols.const_locals.required_modifiers = const + +dotnet_naming_symbols.const_fields.applicable_kinds = field +dotnet_naming_symbols.const_fields.applicable_accessibilities = * +dotnet_naming_symbols.const_fields.required_modifiers = const + +dotnet_naming_symbols.static_readonly_fields.applicable_kinds = field +dotnet_naming_symbols.static_readonly_fields.applicable_accessibilities = * +dotnet_naming_symbols.static_readonly_fields.required_modifiers = static, readonly + +dotnet_naming_symbols.non_private_readonly_fields.applicable_kinds = field +dotnet_naming_symbols.non_private_readonly_fields.applicable_accessibilities = public, internal, protected, protected_internal, private_protected +dotnet_naming_symbols.non_private_readonly_fields.required_modifiers = readonly + +dotnet_naming_symbols.private_or_protected_fields.applicable_kinds = field +dotnet_naming_symbols.private_or_protected_fields.applicable_accessibilities = private, protected, private_protected + +dotnet_naming_symbols.interfaces.applicable_kinds = interface +dotnet_naming_symbols.interfaces.applicable_accessibilities = * + +dotnet_naming_symbols.parameters_and_locals.applicable_kinds = parameter, local +dotnet_naming_symbols.parameters_and_locals.applicable_accessibilities = * + +dotnet_naming_symbols.most_symbols.applicable_kinds = namespace, class, struct, enum, field, property, method, local_function, event, delegate, type_parameter +dotnet_naming_symbols.most_symbols.applicable_accessibilities = * + +## Naming Rules + +dotnet_naming_rule.const_locals_should_be_pascal_case.symbols = const_locals +dotnet_naming_rule.const_locals_should_be_pascal_case.style = pascal_case +dotnet_naming_rule.const_locals_should_be_pascal_case.severity = warning + +dotnet_naming_rule.const_fields_should_be_pascal_case.symbols = const_fields +dotnet_naming_rule.const_fields_should_be_pascal_case.style = pascal_case +dotnet_naming_rule.const_fields_should_be_pascal_case.severity = warning + +dotnet_naming_rule.static_readonly_fields_should_be_pascal_case.symbols = static_readonly_fields +dotnet_naming_rule.static_readonly_fields_should_be_pascal_case.style = pascal_case +dotnet_naming_rule.static_readonly_fields_should_be_pascal_case.severity = warning + +dotnet_naming_rule.non_private_readonly_fields_should_be_pascal_case.symbols = non_private_readonly_fields +dotnet_naming_rule.non_private_readonly_fields_should_be_pascal_case.style = pascal_case +dotnet_naming_rule.non_private_readonly_fields_should_be_pascal_case.severity = warning + +dotnet_naming_rule.private_or_protected_fields_should_be_camel_case.symbols = private_or_protected_fields +dotnet_naming_rule.private_or_protected_fields_should_be_camel_case.style = camel_case +dotnet_naming_rule.private_or_protected_fields_should_be_camel_case.severity = warning + +dotnet_naming_rule.interfaces_should_be_i_prefix_pascal_case.symbols = interfaces +dotnet_naming_rule.interfaces_should_be_i_prefix_pascal_case.style = i_prefix_pascal_case +dotnet_naming_rule.interfaces_should_be_i_prefix_pascal_case.severity = warning + +dotnet_naming_rule.parameters_and_locals_should_be_camel_case.symbols = parameters_and_locals +dotnet_naming_rule.parameters_and_locals_should_be_camel_case.style = camel_case +dotnet_naming_rule.parameters_and_locals_should_be_camel_case.severity = warning + +dotnet_naming_rule.most_symbols_should_be_pascal_case.symbols = most_symbols +dotnet_naming_rule.most_symbols_should_be_pascal_case.style = pascal_case +dotnet_naming_rule.most_symbols_should_be_pascal_case.severity = warning + + +### StyleCop.Analyzers +### https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/DOCUMENTATION.md + +# Below we enable rule categories by setting severity to warning. +# We'll only list rules to disable. +# Individual rules we wish to disable are typically set to none severity. + +# Covers SAxxxx and SXxxxx rules +dotnet_analyzer_diagnostic.category-StyleCop.CSharp.DocumentationRules.severity = warning +dotnet_analyzer_diagnostic.category-StyleCop.CSharp.LayoutRules.severity = warning +dotnet_analyzer_diagnostic.category-StyleCop.CSharp.MaintainabilityRules.severity = warning +dotnet_analyzer_diagnostic.category-StyleCop.CSharp.NamingRules.severity = warning +dotnet_analyzer_diagnostic.category-StyleCop.CSharp.OrderingRules.severity = warning +dotnet_analyzer_diagnostic.category-StyleCop.CSharp.ReadabilityRules.severity = warning +dotnet_analyzer_diagnostic.category-StyleCop.CSharp.SpacingRules.severity = warning +dotnet_analyzer_diagnostic.category-StyleCop.CSharp.SpecialRules.severity = warning + +# Rules that are covered by IDE0001 Simplify name +dotnet_diagnostic.SA1125.severity = none # UseShorthandForNullableTypes + +# Rules that are covered by IDE0047 Remove unnecessary parentheses +dotnet_diagnostic.SA1119.severity = none # StatementMustNotUseUnnecessaryParenthesis + +# Rules that are covered by IDE0055 Formatting Rules +dotnet_diagnostic.SA1027.severity = none # UseTabsCorrectly + +# Rules that are covered by IDE1006 Naming Rules +dotnet_diagnostic.SA1300.severity = none # ElementMustBeginWithUpperCaseLetter +dotnet_diagnostic.SA1302.severity = none # InterfaceNamesMustBeginWithI +dotnet_diagnostic.SA1303.severity = none # ConstFieldNamesMustBeginWithUpperCaseLetter +dotnet_diagnostic.SA1304.severity = none # NonPrivateReadonlyFieldsMustBeginWithUpperCaseLetter +dotnet_diagnostic.SA1306.severity = none # FieldNamesMustBeginWithLowerCaseLetter +dotnet_diagnostic.SA1307.severity = none # AccessibleFieldsMustBeginWithUpperCaseLetter +dotnet_diagnostic.SA1311.severity = none # StaticReadonlyFieldsMustBeginWithUpperCaseLetter +dotnet_diagnostic.SA1312.severity = none # VariableNamesMustBeginWithLowerCaseLetter +dotnet_diagnostic.SA1313.severity = none # ParameterNamesMustBeginWithLowerCaseLetter + +# Rules that conflict with OpenRA project style conventions +dotnet_diagnostic.SA1101.severity = none # PrefixLocalCallsWithThis +dotnet_diagnostic.SA1107.severity = none # CodeMustNotContainMultipleStatementsOnOneLine +dotnet_diagnostic.SA1116.severity = none # SplitParametersMustStartOnLineAfterDeclaration +dotnet_diagnostic.SA1117.severity = none # ParametersMustBeOnSameLineOrSeparateLines +dotnet_diagnostic.SA1118.severity = none # ParameterMustNotSpanMultipleLines +dotnet_diagnostic.SA1122.severity = none # UseStringEmptyForEmptyStrings +dotnet_diagnostic.SA1124.severity = none # DoNotUseRegions +dotnet_diagnostic.SA1127.severity = none # GenericTypeConstraintsMustBeOnOwnLine +dotnet_diagnostic.SA1132.severity = none # DoNotCombineFields +dotnet_diagnostic.SA1135.severity = none # UsingDirectivesMustBeQualified +dotnet_diagnostic.SA1136.severity = none # EnumValuesShouldBeOnSeparateLines +dotnet_diagnostic.SA1200.severity = none # UsingDirectivesMustBePlacedCorrectly +dotnet_diagnostic.SA1201.severity = none # ElementsMustAppearInTheCorrectOrder +dotnet_diagnostic.SA1202.severity = none # ElementsMustBeOrderedByAccess +dotnet_diagnostic.SA1204.severity = none # StaticElementsMustAppearBeforeInstanceElements +dotnet_diagnostic.SA1214.severity = none # ReadonlyElementsMustAppearBeforeNonReadonlyElements +dotnet_diagnostic.SX1309.severity = none # FieldNamesMustBeginWithUnderscore +dotnet_diagnostic.SX1309S.severity = none # StaticFieldNamesMustBeginWithUnderscore +dotnet_diagnostic.SA1314.severity = none # TypeParameterNamesMustBeginWithT +dotnet_diagnostic.SA1400.severity = none # AccessModifierMustBeDeclared +dotnet_diagnostic.SA1401.severity = none # FieldsMustBePrivate +dotnet_diagnostic.SA1402.severity = none # FileMayOnlyContainASingleType +dotnet_diagnostic.SA1407.severity = none # ArithmeticExpressionsMustDeclarePrecedence +dotnet_diagnostic.SA1413.severity = none # UseTrailingCommasInMultiLineInitializers +dotnet_diagnostic.SA1501.severity = none # StatementMustNotBeOnSingleLine +dotnet_diagnostic.SA1502.severity = none # ElementMustNotBeOnSingleLine +dotnet_diagnostic.SA1503.severity = none # BracesMustNotBeOmitted +dotnet_diagnostic.SA1516.severity = none # ElementsMustBeSeparatedByBlankLine +dotnet_diagnostic.SA1519.severity = none # BracesMustNotBeOmittedFromMultiLineChildStatement +dotnet_diagnostic.SA1520.severity = none # UseBracesConsistently +dotnet_diagnostic.SA1600.severity = none # ElementsMustBeDocumented +dotnet_diagnostic.SA1601.severity = none # PartialElementsMustBeDocumented +dotnet_diagnostic.SA1602.severity = none # EnumerationItemsMustBeDocumented +dotnet_diagnostic.SA1611.severity = none # ElementParametersShouldBeDocumented +dotnet_diagnostic.SA1615.severity = none # ElementReturnValueShouldBeDocumented +dotnet_diagnostic.SA1618.severity = none # GenericTypeParametersShouldBeDocumented +dotnet_diagnostic.SA1623.severity = none # PropertySummaryDocumentationShouldMatchAccessors +dotnet_diagnostic.SA1633.severity = none # FileMustHaveHeader +dotnet_diagnostic.SA1642.severity = none # ConstructorSummaryDocumentationShouldBeginWithStandardText +dotnet_diagnostic.SA1649.severity = none # FileNameMustMatchTypeName + +#### Code Quality Rules +#### 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. + +# Rule options that apply over multiple rules are set here. +# https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/code-quality-rule-options +dotnet_code_quality.api_surface = all + +### Design Rules +### https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/design-warnings + +# Collections should implement generic interface. +#dotnet_code_quality.CA1010.additional_required_generic_interfaces = +dotnet_diagnostic.CA1010.severity = warning + +# Abstract types should not have public constructors. +dotnet_diagnostic.CA1012.severity = warning + +# Mark attributes with 'AttributeUsageAttribute'. +dotnet_diagnostic.CA1018.severity = warning + +# Override methods on comparable types. +dotnet_diagnostic.CA1036.severity = warning + +# Provide ObsoleteAttribute message. +dotnet_diagnostic.CA1041.severity = warning + +# Do not declare protected members in sealed types. +dotnet_diagnostic.CA1047.severity = warning + +# Declare types in namespaces. +dotnet_diagnostic.CA1050.severity = warning + +# Static holder types should be 'Static' or 'NotInheritable'. +dotnet_diagnostic.CA1052.severity = warning + +# Do not hide base class methods. +dotnet_diagnostic.CA1061.severity = warning + +# Exceptions should be public. +dotnet_diagnostic.CA1064.severity = warning + +# Implement 'IEquatable' when overriding 'Equals'. +dotnet_diagnostic.CA1066.severity = warning + +# Override 'Equals' when implementing 'IEquatable'. +dotnet_diagnostic.CA1067.severity = warning + +# 'CancellationToken' parameters must come last. +dotnet_diagnostic.CA1068.severity = warning + +# Do not declare event fields as virtual. +dotnet_diagnostic.CA1070.severity = warning + +### Documentation Rules +### https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/documentation-warnings + +# Avoid using 'cref' tags with a prefix. +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 + +# Do not use 'OutAttribute' on string parameters for P/Invokes. +dotnet_diagnostic.CA1417.severity = warning + +### Maintainability Rules +### https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/maintainability-warnings + +# 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 + +# Do not prefix enum values with type name. +dotnet_code_quality.CA1712.enum_values_prefix_trigger = AnyEnumValue +dotnet_diagnostic.CA1712.severity = warning + +# Flags enums should have plural names. +dotnet_diagnostic.CA1714.severity = warning + +# Only 'FlagsAttribute' enums should have plural names. +dotnet_diagnostic.CA1717.severity = warning + +### Performance Rules +### https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/performance-warnings + +# Use Literals Where Appropriate. +#dotnet_code_quality.CA1802.required_modifiers = static +dotnet_diagnostic.CA1802.severity = warning + +# Remove empty finalizers. +dotnet_diagnostic.CA1821.severity = warning + +# Mark members as static. +dotnet_code_quality.CA1822.api_surface = private,internal +dotnet_diagnostic.CA1822.severity = warning + +# Avoid unused private fields. +dotnet_diagnostic.CA1823.severity = warning + +# Avoid zero-length array allocations. +dotnet_diagnostic.CA1825.severity = warning + +# Use property instead of Linq Enumerable method. +#dotnet_code_quality.CA1826.exclude_ordefault_methods = false +dotnet_diagnostic.CA1826.severity = warning + +# Do not use Count/LongCount when Any can be used. +dotnet_diagnostic.CA1827.severity = warning + +# Do not use CountAsync/LongCountAsync when AnyAsync can be used. +dotnet_diagnostic.CA1828.severity = warning + +# Use Length/Count property instead of Enumerable.Count method. +dotnet_diagnostic.CA1829.severity = warning + +# Prefer strongly-typed Append and Insert method overloads on StringBuilder. +dotnet_diagnostic.CA1830.severity = warning + +# Use AsSpan instead of Range-based indexers for string when appropriate. +dotnet_diagnostic.CA1831.severity = warning + +# Use AsSpan or AsMemory instead of Range-based indexers for getting ReadOnlySpan or ReadOnlyMemory portion of an array. +dotnet_diagnostic.CA1832.severity = warning + +# Use AsSpan or AsMemory instead of Range-based indexers for getting Span or Memory portion of an array. +dotnet_diagnostic.CA1833.severity = warning + +# Use StringBuilder.Append(char) for single character strings. +dotnet_diagnostic.CA1834.severity = warning + +# Prefer the memory-based overloads of ReadAsync/WriteAsync methods in stream-based classes. +dotnet_diagnostic.CA1835.severity = warning + +# Prefer IsEmpty over Count when available. +dotnet_diagnostic.CA1836.severity = warning + +# Use Environment.ProcessId instead of Process.GetCurrentProcess().Id. +dotnet_diagnostic.CA1837.severity = warning + +# Avoid StringBuilder parameters for P/Invokes. +dotnet_diagnostic.CA1838.severity = warning + +# Use Environment.ProcessPath instead of Process.GetCurrentProcess().MainModule.FileName. +dotnet_diagnostic.CA1839.severity = warning + +# Use Environment.CurrentManagedThreadId instead of Thread.CurrentThread.ManagedThreadId. +dotnet_diagnostic.CA1840.severity = warning + +# Prefer Dictionary Contains methods. +dotnet_diagnostic.CA1841.severity = warning + +# Do not use 'WhenAll' with a single task. +dotnet_diagnostic.CA1842.severity = warning + +# Do not use 'WaitAll' with a single task. +dotnet_diagnostic.CA1843.severity = warning + +# Provide memory-based overrides of async methods when subclassing 'Stream'. +dotnet_diagnostic.CA1844.severity = warning + +# Use span-based 'string.Concat'. (Not available on mono) +dotnet_diagnostic.CA1845.severity = none + +# Prefer AsSpan over Substring. +dotnet_diagnostic.CA1846.severity = warning + +# Use string.Contains(char) instead of string.Contains(string) with single characters. +dotnet_diagnostic.CA1847.severity = warning + +# Call async methods when in an async method. +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 # 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 = suggestion # TODO: Change to warning once using .NET 7 or later. + +# Unnecessary call to 'Dictionary.ContainsKey(key)'. +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 = suggestion # TODO: Change to warning once using .NET 7 or later. + +# Use Span.Clear() instead of Span.Fill(). +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 + +# 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 + +# Do not assign property within its setter. +dotnet_diagnostic.CA2011.severity = warning + +# Use ValueTasks correctly. +dotnet_diagnostic.CA2012.severity = warning + +# Do not use ReferenceEquals with value types. +dotnet_diagnostic.CA2013.severity = warning + +# Do not use stackalloc in loops. +dotnet_diagnostic.CA2014.severity = warning + +# Forward the CancellationToken parameter to methods that take one. +dotnet_diagnostic.CA2016.severity = warning + +# The 'count' argument to Buffer.BlockCopy should specify the number of bytes to copy. +dotnet_diagnostic.CA2018.severity = warning + +# ThreadStatic fields should not use inline initialization. +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 + +# Do Not Use Broken Cryptographic Algorithms. +dotnet_diagnostic.CA5351.severity = warning + +### Usage Rules +### https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/usage-warnings + +# Call GC.SuppressFinalize correctly. +dotnet_diagnostic.CA1816.severity = warning + +# Rethrow to preserve stack details. +dotnet_diagnostic.CA2200.severity = warning + +# Initialize value type static fields inline. +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 + +# Disposable types should declare finalizer. +dotnet_diagnostic.CA2216.severity = warning + +# Override GetHashCode on overriding Equals. +dotnet_diagnostic.CA2218.severity = warning + +# Overload operator equals on overriding ValueType.Equals. +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 = false +dotnet_diagnostic.CA2241.severity = warning + +# Test for NaN correctly. +dotnet_diagnostic.CA2242.severity = warning + +# Attribute string literals should parse correctly. +dotnet_diagnostic.CA2243.severity = warning + +# Do not duplicate indexed element initializations. +dotnet_diagnostic.CA2244.severity = warning + +# Do not assign a property to itself. +dotnet_diagnostic.CA2245.severity = warning + +# Argument passed to TaskCompletionSource constructor should be TaskCreationOptions enum instead of TaskContinuationOptions enum. +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 = 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. + +# 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 + +# 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 + +# 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 + +# Unnecessary unsafe context. +dotnet_diagnostic.RCS1216.severity = warning + +# Simplify code branching. +dotnet_diagnostic.RCS1218.severity = warning + +# 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 + +# 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 diff --git a/.gitattributes b/.gitattributes index 949fc96771..f7150369a3 100644 --- a/.gitattributes +++ b/.gitattributes @@ -3,6 +3,7 @@ *.lua eol=lf *.cs eol=lf *.csproj eol=lf +*.sh eol=lf *.sln eol=lf * text=lf diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 60b304705f..41577feb72 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -4,14 +4,25 @@ on: push: pull_request: +permissions: + contents: read # to fetch code (actions/checkout) + jobs: - linux-mono: - name: Linux (mono) - runs-on: ubuntu-20.04 + linux: + name: Linux (.NET 6.0) + runs-on: ubuntu-22.04 steps: + - name: Remove System .NET + run: sudo apt-get remove -y dotnet* + - name: Clone Repository - uses: actions/checkout@v2 + uses: actions/checkout@v6 + + - name: Install .NET 6.0 + uses: actions/setup-dotnet@v5 + with: + dotnet-version: '6.0.x' - name: Prepare Environment run: | @@ -27,25 +38,56 @@ jobs: run: | sudo apt-get install lua5.1 make check-scripts - make test + make TREAT_WARNINGS_AS_ERRORS=true test + + linux-mono: + name: Linux (mono) + runs-on: ubuntu-22.04 + + steps: + - name: Clone Repository + uses: actions/checkout@v6 + + - name: Prepare Environment + run: | + . mod.config; + awk '/\r$$/ { exit(1); }' mod.config || (printf "Invalid mod.config format. File must be saved using unix-style (LF, not CRLF or CR) line endings.\n"; exit 1); + + - name: Check Code + run: | + # check-packaging-scripts does not depend on .net/mono, so is not needed here + mono --version + make RUNTIME=mono check + + - name: Check Mod + run: | + # check-scripts does not depend on .net/mono, so is not needed here + make RUNTIME=mono TREAT_WARNINGS_AS_ERRORS=true test windows: - name: Windows (Framework 4.7) - runs-on: windows-2019 + name: Windows (.NET 6.0) + runs-on: windows-2022 steps: - name: Clone Repository - uses: actions/checkout@v2 + uses: actions/checkout@v6 + + - name: Install .NET 6.0 + uses: actions/setup-dotnet@v5 + with: + dotnet-version: '6.0.x' - name: Check Code shell: powershell run: | - dotnet nuget locals all --clear + # Work around runtime failures on the GH Actions runner + dotnet nuget add source https://api.nuget.org/v3/index.json -n nuget.org .\make.ps1 check - name: Check Mods run: | - chocolatey install lua --version 5.1.5.52 + choco install lua --version 5.1.5.52 $ENV:Path = $ENV:Path + ";C:\Program Files (x86)\Lua\5.1\" + $ENV:TREAT_WARNINGS_AS_ERRORS = "true" .\make.ps1 check-scripts .\make.ps1 test diff --git a/.github/workflows/packaging.yml b/.github/workflows/packaging.yml index dd82905508..94aeb7b406 100644 --- a/.github/workflows/packaging.yml +++ b/.github/workflows/packaging.yml @@ -5,14 +5,39 @@ on: tags: - '*' +permissions: + contents: write # for release creation + jobs: + create-release: + name: Create Release + runs-on: ubuntu-22.04 + steps: + - name: Create Release + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + if ! gh release view ${{ github.ref_name }} --repo ${{ github.repository }} > /dev/null 2>&1; then + gh release create ${{ github.ref_name }} \ + --repo ${{ github.repository }} \ + --title "${{ github.ref_name }}" \ + --generate-notes + else + echo "Release ${{ github.ref_name }} already exists, skipping creation." + fi + linux: name: Linux AppImages - runs-on: ubuntu-20.04 - + runs-on: ubuntu-22.04 + needs: create-release steps: - name: Clone Repository - uses: actions/checkout@v2 + uses: actions/checkout@v6 + + - name: Install .NET 6.0 + uses: actions/setup-dotnet@v5 + with: + dotnet-version: '6.0.x' - name: Prepare Environment run: echo "GIT_TAG=${GITHUB_REF#refs/tags/}" >> ${GITHUB_ENV} @@ -21,29 +46,33 @@ jobs: run: | make engine mkdir -p build/linux + sudo apt-get install -y desktop-file-utils ./packaging/linux/buildpackage.sh "${GIT_TAG}" "${PWD}/build/linux" - name: Upload Packages - uses: svenstaro/upload-release-action@v2 - with: - repo_token: ${{ secrets.GITHUB_TOKEN }} - tag: ${{ github.ref }} - overwrite: true - file_glob: true - file: build/linux/* + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + shell: bash + run: | + gh release upload ${{ github.ref_name }} build/linux/* macos: - name: macOS Disk Images - runs-on: macos-10.15 - + name: macOS Disk Image + runs-on: macos-14 + needs: create-release steps: - name: Clone Repository - uses: actions/checkout@v2 + uses: actions/checkout@v6 + + - name: Install .NET 6.0 + uses: actions/setup-dotnet@v5 + with: + dotnet-version: '6.0.x' - name: Prepare Environment run: echo "GIT_TAG=${GITHUB_REF#refs/tags/}" >> ${GITHUB_ENV} - - name: Package Disk Images + - name: Package Disk Image env: MACOS_DEVELOPER_IDENTITY: ${{ secrets.MACOS_DEVELOPER_IDENTITY }} MACOS_DEVELOPER_CERTIFICATE_BASE64: ${{ secrets.MACOS_DEVELOPER_CERTIFICATE_BASE64 }} @@ -55,28 +84,31 @@ jobs: mkdir -p build/macos ./packaging/macos/buildpackage.sh "${GIT_TAG}" "${PWD}/build/macos" - - name: Upload Packages - uses: svenstaro/upload-release-action@v2 - with: - repo_token: ${{ secrets.GITHUB_TOKEN }} - tag: ${{ github.ref }} - overwrite: true - file_glob: true - file: build/macos/* + - name: Upload Package + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + shell: bash + run: | + gh release upload ${{ github.ref_name }} build/macos/* windows: name: Windows Installers - runs-on: ubuntu-20.04 - + runs-on: ubuntu-22.04 + needs: create-release steps: - name: Clone Repository - uses: actions/checkout@v2 + uses: actions/checkout@v6 + + - name: Install .NET 6.0 + uses: actions/setup-dotnet@v5 + with: + dotnet-version: '6.0.x' - name: Prepare Environment run: | echo "GIT_TAG=${GITHUB_REF#refs/tags/}" >> ${GITHUB_ENV} sudo apt-get update - sudo apt-get install nsis + sudo apt-get install nsis wine64 - name: Package Installers run: | @@ -85,10 +117,8 @@ jobs: ./packaging/windows/buildpackage.sh "${GIT_TAG}" "${PWD}/build/windows" - name: Upload Packages - uses: svenstaro/upload-release-action@v2 - with: - repo_token: ${{ secrets.GITHUB_TOKEN }} - tag: ${{ github.ref }} - overwrite: true - file_glob: true - file: build/windows/* + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + shell: bash + run: | + gh release upload ${{ github.ref_name }} build/windows/* diff --git a/.gitignore b/.gitignore index d710bf027e..443c5ea0d3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,48 @@ +engine-1.02 user.config engine + +# Visual Studio +Release bin obj +*.ncb +*.vcproj* +*.suo +*.user +*.sln.cache +*.manifest +*.CodeAnalysisLog.xml +*.lastcodeanalysissucceeded +_ReSharper.*/ +/.vs + +# Visual Studio Code +/.vscode/settings.json + +# backup files by various editors +*~ +*.orig +\#* +.*.sw? + +# Monodevelop +*.pidb +*.userprefs + +# Mac OS X .DS_Store -.idea -.vs \ No newline at end of file + +# SublimeText +*.sublime-project +*.sublime-workspace + +# NUnit +/TestResult.xml +/lib/ + +# Support directory +/Support + +# IntelliJ files +.idea \ No newline at end of file diff --git a/.vs/CombinedArms/DesignTimeBuild/.dtbcache.v2 b/.vs/CombinedArms/DesignTimeBuild/.dtbcache.v2 index 9daddeb98f..076abfb73b 100644 Binary files a/.vs/CombinedArms/DesignTimeBuild/.dtbcache.v2 and b/.vs/CombinedArms/DesignTimeBuild/.dtbcache.v2 differ diff --git a/AUTHORS b/AUTHORS index 4119846a9e..fd14367a78 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1,54 +1,58 @@ -The Combined Arms Mod has grown from a small personal -modding project, to a small, but passionate community. - -However It wouldn't be what it is today without the help of the -talented wider OpenRA community. +The Combined Arms mod has grown from a +small, personal modding project into +a content-rich homage to the +Command & Conquer series. Combined Arms developers: - * Inq (Project lead) - * Darkademic (Art & Balanace) - + * Inq (Project Lead) + * Darkademic + Contributors & special thanks to: * GraionDilach (C#) * MustaphaTR (C#) * Boolbada (C#) * Gerseras (C#) - * Nooze (Tileset Art) - * Messiah (Tileset Art) - * Tschokky (Tileset Art) - * Katzsmile (UAV) - * AchromicWhite (Mortar, BDRM Turret) - * Nyerguds (Cameos) - * Allen262 (Beta Ships) - * Kilkakon (Fuel truck) - - -Of course Combined Arms wouldn't exist today without OpenRA & the -hard work of the many OpenRA contributors. + * Nooze (tileset art) + * Messiah (tileset art) + * Tschokky (tileset art) + * Katzsmile (UAV sprite) + * AchromicWhite (mortar sprite) + * Nyerguds (cameos) + * Allen262 (RA1 Beta ship sprites) + * Kilkakon (fuel truck sprite) + * DonutArnold (radar scan sprite) + +-- + +Of course Combined Arms wouldn't exist today +without OpenRA & the hard work of its many +contributors. The OpenRA developers are: - * Chris Forbes (chrisf) + * Gustas Kažukauskas (PunkPun) * Lukas Franke (abcdefg30) - * Paul Chote (pchote) - * Reaperrr + * Matthias Mailänder (Mailaender) Previous developers included: * Alli Witheford (alzeih) * Caleb Anderson (RobotCaleb) + * Chris Forbes (chrisf) * Curtis Shmyr (hamb) * Daniel Hernandez (Mancano) * Igor Popov (ihptru) - * Matthias Mailänder (Mailaender) * Megan Bowra-Dean (beedee) * Mike Bundy (kehaar) * Oliver Brakmann (obrakmann) + * Paul Chote (pchote) * Pavel Penev (penev92) + * Reaperrr * Robert Pepperell (ytinasni) * ScottNZ * Tom Roostan (RoosterDragon) Also thanks to: * abmyii + * anvilvapre (anvilvapre) * Adam Valy (Tschokky) * Akseli Virtanen (RAGEQUIT) * Alexander Fast (mizipzor) @@ -62,14 +66,17 @@ Also thanks to: * Arik Lirette (Angusm3) * Barnaby Smith (mvi) * Bellator + * Bernd Stellwag (burned42) * Biofreak * Braxton Williams (Buddytex) * Brendan Gluth (Mechanical_Man) + * Brent Gardner (bggardner) * Bryan Wilbur * Bugra Cuhadaroglu (BugraC) * Chris Cameron (Vesuvian) * Chris Grant (Unit158) * Christer Ulfsparre (Holloweye) + * Christoph Lahner (chlah) * clem * Cody Brittain (Generalcamo) * Constantin Helmig (CH4Code) @@ -82,6 +89,7 @@ Also thanks to: * DeadlySurprise * Dmitri Suvorov (suvjunmd) * dtluna + * Eduardo Cáceres (eduherminio) * Erasmus Schroder (rasco) * Eric Bajumpaa (SteelPhase) * Evgeniy Sergeev (evgeniysergeev) @@ -99,6 +107,7 @@ Also thanks to: * Imago * Iran * Ishan Bhargava (ishantheperson) + * Ivaylo Draganov (dragunoff) * Jacob Dufault (jacobdufault) * James Dunne (jsd) * James Gilbert (DSUK) @@ -159,19 +168,22 @@ Also thanks to: * Rikhardur Bjarni Einarsson (WolfGaming) * Sascha Biedermann (bidifx) * Sean Hunt (coppro) - * Sebastien Kerguen (xanax) * Shawn Collins (UberWaffe) * Simon Verbeke (Saticmotion) + * Stuart McHattie (SDJMcHattie) * Taryn Hill (Phrohdoh) * Teemu Nieminen (Temeez) + * Thomas Christlieb (ThomasChr) * Tim Mylemans (gecko) * Tirili * Tomas Einarsson (Mesacer) * Tom van Leth (tovl) + * Trevor Nichols (ocdi) * Tristan Keating (Kilkakon) * Tristan Mühlbacher (MicroBit) * UnknownProgrammer * Vladimir Komarov (VrKomarov) + * Wojciech Walaszek (Voidwalker) * Wuschel Using GNU FreeFont distributed under the GNU GPL @@ -185,9 +197,6 @@ FreeType License. Using OpenAL Soft distributed under the GNU LGPL. -Using MaxMind GeoIP2 .NET API distributed under -the Apache 2.0 license. - Using SDL2-CS and OpenAL-CS created by Ethan Lee and released under the zlib license. @@ -197,9 +206,17 @@ under the MIT license. Using FuzzyLogicLibrary (fuzzynet) by Dmitry Kaluzhny and released under the GNU GPL terms. -Using Open.Nat by Lucas Ontivero, based on the work -of Alan McGovern and Ben Motmans and distributed -under the MIT license. +Using Mono.Nat by Alan McGovern, Ben Motmans, +Nicholas Terry distributed under the MIT license. + +Using MP3Sharp by Robert Bruke and Zane Wagner +licensed under the GNU LGPL Version 3. + +Using TagLib# by Stephen Shaw licensed under the +GNU LGPL Version 2.1. + +Using NVorbis by Andrew Ward distributed under +the MIT license. Using ICSharpCode.SharpZipLib initially by Mike Krueger and distributed under the GNU GPL terms. @@ -207,6 +224,23 @@ Krueger and distributed under the GNU GPL terms. Using rix0rrr.BeaconLib developed by Rico Huijbers distributed under MIT License. +Using DiscordRichPresence developed by Lachee +distributed under MIT License. + +Using Json.NET developed by James Newton-King +distributed under MIT License. + +Using ANGLE distributed under the BS3 3-Clause license. + +Using Pfim developed by Nick Babcock +distributed under the MIT license. + +Using Linguini by the Space Station 14 team +licensed under Apache and MIT terms. + +This site or product includes IP2Location LITE data +available from http://www.ip2location.com. + Finally, special thanks goes to the original teams at Westwood Studios and EA for creating the classic games which OpenRA aims to reimagine. diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 18c4b5ed99..6d83d19044 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -56,8 +56,8 @@ further defined and clarified by project maintainers. Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by private-messaging a project team member (users with a + in front -of their name) via our IRC channel (#openra on freenode – -[webchat](http://webchat.freenode.net/?channels=openra)). All +of their name) via our IRC channel (#openra on Libera – +[webchat](https://web.libera.chat/#openra)). All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. @@ -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/ \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 14ee84ec28..a2c430c03f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -7,9 +7,9 @@ Please note that this repository is specifically for the scripts and infrastruct When developing new features, it is important to make sure that they work on all our supported platforms. Right now, this means Windows >= 7 (with PowerShell >= 3), macOS >= 10.7, and Linux. We would like to also support *BSD, but do not currently have a means to test this. Some issues to be aware of include: -* Use http://www.shellcheck.net/ to confirm POSIX compatibility of *.sh scripts. +* Use https://www.shellcheck.net/ to confirm POSIX compatibility of *.sh scripts. * Avoid non-standard gnu extensions to common Unix tools (e.g. the `-f` flag from GNU `readlink`) While your pull-request is in review it will be helpful if you join IRC to discuss the changes. -See also the in-depth guide on [contributing](https://github.com/OpenRA/OpenRA/wiki/Contributing) on the main OpenRA project wiki. Most of the content on this page also applies to the Mod SDK. \ No newline at end of file +See also the in-depth guide on [contributing](https://github.com/OpenRA/OpenRA/wiki/Contributing) on the main OpenRA project wiki. Most of the content on this page also applies to the Mod SDK. diff --git a/COPYING b/COPYING index 94a9ed024d..e60008693e 100644 --- a/COPYING +++ b/COPYING @@ -1,7 +1,7 @@ GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 - Copyright (C) 2007 Free Software Foundation, Inc. + Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @@ -645,7 +645,7 @@ the "copyright" line and a pointer to where the full notice is found. GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program. If not, see . + along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. @@ -664,11 +664,11 @@ might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see -. +. The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read -. +. diff --git a/Makefile b/Makefile index 5a9dcb6863..9452a97989 100644 --- a/Makefile +++ b/Makefile @@ -3,6 +3,12 @@ # to compile, run: # make # +# to compile using Mono (version 6.12 or greater) instead of .NET 6, run: +# make RUNTIME=mono +# +# to compile using system libraries for native dependencies, run: +# make [RUNTIME=net6] TARGETPLATFORM=unix-generic +# # to remove the files created by compiling, run: # make clean # @@ -13,7 +19,10 @@ # make check-scripts # # to check the engine and your mod dlls for StyleCop violations, run: -# make check +# make [RUNTIME=net6] check +# +# to check your mod yaml for errors, run: +# make [RUNTIME=net6] [TREAT_WARNINGS_AS_ERRORS=false] test # # the following are internal sdk helpers that are not intended to be run directly: # make check-variables @@ -36,31 +45,40 @@ MOD_ID = $(shell cat user.config mod.config 2> /dev/null | awk -F= '/MOD_ID/ { p ENGINE_DIRECTORY = $(shell cat user.config mod.config 2> /dev/null | awk -F= '/ENGINE_DIRECTORY/ { print $$2; exit }') MOD_SEARCH_PATHS = "$(shell $(PYTHON) -c "import os; print(os.path.realpath('.'))")/mods,./mods" -WHITELISTED_OPENRA_ASSEMBLIES = "$(shell cat user.config mod.config 2> /dev/null | awk -F= '/WHITELISTED_OPENRA_ASSEMBLIES/ { print $$2; exit }')" -WHITELISTED_THIRDPARTY_ASSEMBLIES = "$(shell cat user.config mod.config 2> /dev/null | awk -F= '/WHITELISTED_THIRDPARTY_ASSEMBLIES/ { print $$2; exit }')" -WHITELISTED_CORE_ASSEMBLIES = "$(shell cat user.config mod.config 2> /dev/null | awk -F= '/WHITELISTED_CORE_ASSEMBLIES/ { print $$2; exit }')" -WHITELISTED_MOD_ASSEMBLIES = "$(shell cat user.config mod.config 2> /dev/null | awk -F= '/WHITELISTED_MOD_ASSEMBLIES/ { print $$2; exit }')" - MANIFEST_PATH = "mods/$(MOD_ID)/mod.yaml" HAS_LUAC = $(shell command -v luac 2> /dev/null) LUA_FILES = $(shell find mods/*/maps/* -iname '*.lua' 2> /dev/null) MOD_SOLUTION_FILES = $(shell find . -maxdepth 1 -iname '*.sln' 2> /dev/null) MSBUILD = msbuild -verbosity:m -nologo +DOTNET = dotnet + +RUNTIME ?= net6 +CONFIGURATION ?= Release +DOTNET_RID = $(shell ${DOTNET} --info | grep RID: | cut -w -f3) +ARCH_X64 = $(shell echo ${DOTNET_RID} | grep x64) ifndef TARGETPLATFORM UNAME_S := $(shell uname -s) UNAME_M := $(shell uname -m) ifeq ($(UNAME_S),Darwin) +ifeq ($(ARCH_X64),) +TARGETPLATFORM = osx-arm64 +else TARGETPLATFORM = osx-x64 +endif else ifeq ($(UNAME_M),x86_64) TARGETPLATFORM = linux-x64 else +ifeq ($(UNAME_M),aarch64) +TARGETPLATFORM = linux-arm64 +else TARGETPLATFORM = unix-generic endif endif endif +endif check-sdk-scripts: @awk '/\r$$/ { exit(1); }' mod.config || (printf "Invalid mod.config format: file must be saved using unix-style (CR, not CRLF) line endings.\n"; exit 1) @@ -123,18 +141,25 @@ check-variables: engine: check-variables check-sdk-scripts @./fetch-engine.sh || (printf "Unable to continue without engine files\n"; exit 1) - @cd $(ENGINE_DIRECTORY) && make TARGETPLATFORM=$(TARGETPLATFORM) all + @cd $(ENGINE_DIRECTORY) && make RUNTIME=$(RUNTIME) TARGETPLATFORM=$(TARGETPLATFORM) all all: engine - @command -v $(MSBUILD) >/dev/null || (echo "OpenRA requires the '$(MSBUILD)' tool provided by Mono >= 5.18."; exit 1) +ifeq ($(RUNTIME), mono) + @command -v $(MSBUILD) >/dev/null || (echo "OpenRA requires the '$(MSBUILD)' tool provided by Mono >= 6.12."; exit 1) ifneq ("$(MOD_SOLUTION_FILES)","") - @find . -maxdepth 1 -name '*.sln' -exec $(MSBUILD) -t:Build -restore -p:Configuration=Release -p:TargetPlatform=$(TARGETPLATFORM) \; + @find . -maxdepth 1 -name '*.sln' -exec $(MSBUILD) -t:Build -restore -p:Configuration=${CONFIGURATION} -p:TargetPlatform=$(TARGETPLATFORM) -p:Mono=true \; +endif +else + @find . -maxdepth 1 -name '*.sln' -exec $(DOTNET) build -c ${CONFIGURATION} -p:TargetPlatform=$(TARGETPLATFORM) \; endif clean: engine - @command -v $(MSBUILD) >/dev/null || (echo "OpenRA requires the '$(MSBUILD)' tool provided by Mono >= 5.18."; exit 1) ifneq ("$(MOD_SOLUTION_FILES)","") +ifeq ($(RUNTIME), mono) @find . -maxdepth 1 -name '*.sln' -exec $(MSBUILD) -t:clean \; +else + @find . -maxdepth 1 -name '*.sln' -exec $(DOTNET) clean \; +endif endif @cd $(ENGINE_DIRECTORY) && make clean @@ -154,11 +179,14 @@ endif check: engine ifneq ("$(MOD_SOLUTION_FILES)","") - @echo "Compiling in debug mode..." - @find . -maxdepth 1 -name '*.sln' -exec $(MSBUILD) -t:Build -restore -p:Configuration=Debug -p:TargetPlatform=$(TARGETPLATFORM) \; + @echo "Compiling in Debug mode..." +ifeq ($(RUNTIME), mono) + @$(MSBUILD) -t:clean\;build -restore -p:Configuration=Debug -warnaserror -p:TargetPlatform=$(TARGETPLATFORM) +else + @$(DOTNET) clean -c Debug --nologo --verbosity minimal + @$(DOTNET) build -c Debug -nologo -warnaserror -p:TargetPlatform=$(TARGETPLATFORM) +endif endif - @echo "Checking runtime assemblies..." - @./utility.sh --check-runtime-assemblies $(WHITELISTED_OPENRA_ASSEMBLIES) $(WHITELISTED_THIRDPARTY_ASSEMBLIES) $(WHITELISTED_CORE_ASSEMBLIES) $(WHITELISTED_MOD_ASSEMBLIES) @echo "Checking for explicit interface violations..." @./utility.sh --check-explicit-interfaces @echo "Checking for incorrect conditional trait interface overrides..." diff --git a/OpenRA.Mods.CA/AIUtils.cs b/OpenRA.Mods.CA/AIUtils.cs new file mode 100644 index 0000000000..8e6401e002 --- /dev/null +++ b/OpenRA.Mods.CA/AIUtils.cs @@ -0,0 +1,328 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Linq; +using OpenRA.Mods.Common; +using OpenRA.Mods.Common.Pathfinder; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA +{ + public enum BuildingType { Building, Defense, Refinery, Fragile } + + public enum WaterCheck { NotChecked, EnoughWater, NotEnoughWater, DontCheck } + + public static class AIUtils + { + public static bool IsAreaAvailable(World world, Player player, Map map, int radius, HashSet terrainTypes) + { + var cells = world.ActorsHavingTrait().Where(a => a.Owner == player); + + // TODO: Properly check building foundation rather than 3x3 area. + return cells.Select(a => map.FindTilesInCircle(a.Location, radius) + .Count(c => map.Contains(c) && terrainTypes.Contains(map.GetTerrainInfo(c).Type) && + Util.AdjacentCells(world, Target.FromCell(world, c)) + .All(ac => terrainTypes.Contains(map.GetTerrainInfo(ac).Type)))) + .Any(availableCells => availableCells > 0); + } + + public static IEnumerable FindQueues(Player player, string category) + { + return player.World.ActorsWithTrait() + .Where(a => a.Actor.Owner == player && a.Trait.Info.Type == category && a.Trait.Enabled) + .Select(a => a.Trait); + } + + public static ILookup FindQueuesByCategory(Player player) + { + return player.World.ActorsWithTrait() + .Where(a => a.Actor.Owner == player && a.Trait.Enabled) + .Select(a => a.Trait) + .ToLookup(pq => pq.Info.Type); + } + + public static ILookup FindQueuesByCategory(IEnumerable players) + { + var player = players.First(); + + return player.World.ActorsWithTrait() + .Where(a => players.Contains(a.Actor.Owner) && a.Trait.Enabled) + .Select(a => a.Trait) + .ToLookup(pq => pq.Info.Type); + } + + public static IEnumerable GetActorsWithTrait(World world) + { + return world.ActorsHavingTrait(); + } + + public static int CountActorsWithTrait(string actorName, Player owner) + { + return GetActorsWithTrait(owner.World).Count(a => a.Owner == owner && a.Info.Name == actorName); + } + + public static int CountActorByCommonName(HashSet commonNames, Player owner) + { + return owner.World.Actors.Count(a => !a.IsDead && a.Owner == owner && + commonNames.Contains(a.Info.Name)); + } + + public static int CountActorByCommonName( + ActorIndex.OwnerAndNamesAndTrait actorIndex) where TTraitInfo : ITraitInfoInterface + { + return actorIndex.Actors.Count(a => !a.IsDead); + } + + public static int CountBuildingByCommonName(HashSet buildings, Player owner) + { + return GetActorsWithTrait(owner.World) + .Count(a => a.Owner == owner && buildings.Contains(a.Info.Name)); + } + + public static List FindEnemiesByCommonName(HashSet commonNames, Player player) + { + return player.World.Actors.Where(a => !a.IsDead && player.RelationshipWith(a.Owner) == PlayerRelationship.Enemy && + commonNames.Contains(a.Info.Name)).ToList(); + } + + public static ActorInfo GetInfoByCommonName(HashSet names, Player owner) + { + return owner.World.Map.Rules.Actors.Where(k => names.Contains(k.Key)).Random(owner.World.LocalRandom).Value; + } + + public static void BotDebug(string s, params object[] args) + { + if (Game.Settings.Debug.BotDebug) + TextNotificationsManager.Debug(s, args); + } + + // temporarily added here (they were removed from WorldUtils) + public static Actor ClosestTo(this IEnumerable actors, WPos pos) + { + return actors.MinByOrDefault(a => (a.CenterPosition - pos).LengthSquared); + } + + public static WPos PositionClosestTo_Old(this IEnumerable positions, WPos pos) + { + return positions.MinByOrDefault(p => (p - pos).LengthSquared); + } + + // Finds multiple distinct routes between source and target for a given locomotor. + public static List> FindDistinctRoutes( + World world, + Locomotor locomotor, + CPos source, + CPos target, + int maxRoutes = 3, + BlockedByActor check = BlockedByActor.None) + { + var routes = new List>(); + + // Get the PathFinder trait from the world actor + var pathFinder = world.WorldActor.TraitOrDefault(); + if (pathFinder == null) + return routes; + + // Get the abstract graph data from the hierarchical pathfinder + var (abstractGraph, abstractDomains) = pathFinder.GetOverlayDataForLocomotor(locomotor, check); + if (abstractGraph == null || abstractDomains == null) + return routes; + + // Map source and target to their abstract nodes + var sourceAbstract = FindAbstractNodeForCell(source, abstractGraph, abstractDomains); + var targetAbstract = FindAbstractNodeForCell(target, abstractGraph, abstractDomains); + + if (sourceAbstract == null || targetAbstract == null) + return routes; + + // Check if source and target are in the same domain (connected) + if (!abstractDomains.TryGetValue(sourceAbstract.Value, out var sourceDomain) || + !abstractDomains.TryGetValue(targetAbstract.Value, out var targetDomain) || + sourceDomain != targetDomain) + return routes; + + // Track nodes that have been used in previous routes + var excludedNodes = new HashSet(); + + for (var i = 0; i < maxRoutes; i++) + { + var route = FindAbstractPath(sourceAbstract.Value, targetAbstract.Value, abstractGraph, excludedNodes); + if (route == null || route.Count == 0) + break; // No more valid routes available + + routes.Add(route); + + // Exclude all nodes in this route (except source and target) for future routes + foreach (var node in route) + { + if (node != sourceAbstract.Value + && node != targetAbstract.Value + && node != route.ElementAtOrDefault(1) + && node != route.ElementAtOrDefault(2) + && node != route.ElementAtOrDefault(route.Count - 2)) + excludedNodes.Add(node); + } + } + + return routes; + } + + // Finds the abstract node that corresponds to a given cell position. + static CPos? FindAbstractNodeForCell( + CPos cell, + IReadOnlyDictionary> abstractGraph, + IReadOnlyDictionary abstractDomains) + { + // If the cell itself is an abstract node, return it + if (abstractDomains.ContainsKey(cell)) + return cell; + + // Otherwise, find the nearest abstract node + CPos? nearestNode = null; + var minDistSq = int.MaxValue; + + foreach (var abstractNode in abstractDomains.Keys) + { + var distSq = (abstractNode - cell).LengthSquared; + if (distSq < minDistSq) + { + minDistSq = distSq; + nearestNode = abstractNode; + } + } + + return nearestNode; + } + + // Performs A* pathfinding on the abstract graph to find a route from source to target, + // avoiding any nodes in the excluded set. + static List FindAbstractPath( + CPos source, + CPos target, + IReadOnlyDictionary> abstractGraph, + HashSet excludedNodes) + { + var openSet = new Dictionary(); + var closedSet = new HashSet(); + + // Initialize the starting node + var startNode = new PathNode + { + Position = source, + CostFromStart = 0, + EstimatedTotalCost = Heuristic(source, target), + Parent = null + }; + + openSet[source] = startNode; + + while (openSet.Count > 0) + { + // Find the node in openSet with the lowest estimated total cost + var current = openSet.Values.MinBy(n => n.EstimatedTotalCost); + if (current == null) + break; + + // Check if we've reached the target + if (current.Position == target) + return ReconstructPath(current); + + openSet.Remove(current.Position); + closedSet.Add(current.Position); + + // Explore neighbors + if (!abstractGraph.TryGetValue(current.Position, out var connections)) + continue; + + foreach (var connection in connections) + { + var neighbor = connection.Destination; + + // Skip if already evaluated or excluded (unless it's the target) + if (closedSet.Contains(neighbor) || (excludedNodes.Contains(neighbor) && neighbor != target)) + continue; + + var newCost = current.CostFromStart + connection.Cost; + + // If this is a new node or we found a better path to it + if (!openSet.TryGetValue(neighbor, out var neighborNode)) + { + neighborNode = new PathNode + { + Position = neighbor, + CostFromStart = newCost, + EstimatedTotalCost = newCost + Heuristic(neighbor, target), + Parent = current + }; + openSet[neighbor] = neighborNode; + } + else if (newCost < neighborNode.CostFromStart) + { + neighborNode.CostFromStart = newCost; + neighborNode.EstimatedTotalCost = newCost + Heuristic(neighbor, target); + neighborNode.Parent = current; + } + } + } + + // No path found + return null; + } + + // Reconstructs the path by following parent pointers from target back to source. + static List ReconstructPath(PathNode targetNode) + { + var path = new List(); + var current = targetNode; + + while (current != null) + { + path.Add(current.Position); + current = current.Parent; + } + + path.Reverse(); + return path; + } + + // Simple heuristic function for A* pathfinding (Manhattan distance). + static int Heuristic(CPos from, CPos to) + { + var delta = from - to; + return Math.Abs(delta.X) + Math.Abs(delta.Y); + } + + // Helper class to represent a node in the A* pathfinding algorithm. + class PathNode + { + public CPos Position; + public int CostFromStart; + public int EstimatedTotalCost; + public PathNode Parent; + } + + public static bool PathExistsForLocomotor( + World world, + Locomotor locomotor, + CPos source, + CPos target) + { + var pathFinder = world.WorldActor.TraitOrDefault(); + + if (pathFinder == null) + return false; + + return pathFinder.PathExistsForLocomotor(locomotor, source, target); + } + } +} diff --git a/OpenRA.Mods.CA/Activities/Attach.cs b/OpenRA.Mods.CA/Activities/Attach.cs new file mode 100644 index 0000000000..7739c6d349 --- /dev/null +++ b/OpenRA.Mods.CA/Activities/Attach.cs @@ -0,0 +1,147 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.Activities; +using OpenRA.Mods.CA.Traits; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Activities +{ + enum AttachState { Approaching, Attaching, Finished } + + public class Attach : Activity + { + Target target; + Attachable attachable; + AttachableTo attachableTo; + IMove move; + readonly Color targetLineColor; + AttachState state; + + bool TargetIsValid => target.Actor != null && target.Type == TargetType.Actor && target.Actor.IsInWorld && !target.Actor.IsDead && attachableTo.CanAttach(attachable); + + public Attach(Actor self, in Target target, Attachable attachable, Color? targetLineColor) + { + this.target = target; + this.attachable = attachable; + move = self.TraitOrDefault(); + var moveInfo = self.Info.TraitInfoOrDefault(); + attachableTo = target.Actor.TraitsImplementing().FirstOrDefault(a => a.CanAttach(attachable)); + this.targetLineColor = targetLineColor ?? moveInfo.GetTargetLineColor(); + state = AttachState.Approaching; + } + + public override bool Tick(Actor self) + { + if (IsCanceling) + { + return true; + } + + if (!TargetIsValid) + return true; + + bool isCloseEnough; + + if (attachable.Info.MinAttachDistance < WDist.Zero) + isCloseEnough = true; + else + isCloseEnough = (target.CenterPosition - self.CenterPosition).HorizontalLengthSquared <= attachable.Info.MinAttachDistance.LengthSquared; + + if (isCloseEnough) + { + if (state == AttachState.Approaching) + { + OnMinimumDistanceReached(self); + } + } + else if (state != AttachState.Attaching && state != AttachState.Finished) + { + QueueChild(move.MoveWithinRange(target, attachable.Info.MinAttachDistance, targetLineColor: targetLineColor)); + return false; + } + + if (state == AttachState.Finished) + { + return true; + } + + return false; + } + + void OnMinimumDistanceReached(Actor self) + { + BeginAttachment(self); + } + + void BeginAttachment(Actor self) + { + state = AttachState.Attaching; + + if (!attachableTo.CanAttach(attachable)) + { + state = AttachState.Finished; + return; + } + + attachableTo.Reserve(); + + if (attachable.Info.OnAttachTransformInto != null) + { + var faction = self.Owner.Faction.InternalName; + var transform = new InstantTransform(self, attachable.Info.OnAttachTransformInto) + { + ForceHealthPercentage = 0, + Faction = faction, + OnComplete = a => CompleteAttachment(a), + SkipMakeAnims = true, + }; + + QueueChild(transform); + } + else + CompleteAttachment(self); + } + + void CompleteAttachment(Actor a) + { + state = AttachState.Finished; + var attachable = a.TraitOrDefault(); + if (attachable == null) + return; + + var attached = attachableTo.Attach(a, attachable, true); + + if (attached && attachable.Info.AttachSound != null && !a.World.FogObscures(a.CenterPosition)) + Game.Sound.Play(SoundType.World, attachable.Info.AttachSound, a.CenterPosition); + } + + public override IEnumerable TargetLineNodes(Actor self) + { + if (ChildActivity == null) + yield return new TargetLineNode(target, targetLineColor); + else + { + var current = ChildActivity; + while (current != null) + { + foreach (var n in current.TargetLineNodes(self)) + yield return n; + + current = current.NextActivity; + } + } + } + } +} diff --git a/OpenRA.Mods.CA/Activities/AttackCharged.cs b/OpenRA.Mods.CA/Activities/AttackCharged.cs new file mode 100644 index 0000000000..5afcc636fe --- /dev/null +++ b/OpenRA.Mods.CA/Activities/AttackCharged.cs @@ -0,0 +1,43 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.Mods.CA.Traits; +using OpenRA.Mods.Common.Activities; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Activities +{ + public class AttackCharged : Attack + { + readonly AttackFrontalCharged attackFrontalChargesTrait; + readonly IFacing facing; + + public AttackCharged(Actor self, in Target target, bool allowMovement, bool forceAttack, Color? targetLineColor = null) + : base(self, target, allowMovement, forceAttack, targetLineColor) + { + attackFrontalChargesTrait = self.TraitsImplementing().ToArray().Where(t => !t.IsTraitDisabled).First(); + facing = self.Trait(); + } + + protected override void DoAttack(Actor self, AttackFrontal attack, IEnumerable armaments) + { + if (!attackFrontalChargesTrait.IsCharged) + return; + + if (!attack.IsTraitPaused) + foreach (var a in armaments) + a.CheckFire(self, facing, target); + } + } +} diff --git a/OpenRA.Mods.CA/Activities/AttackFrontalFollowActivity.cs b/OpenRA.Mods.CA/Activities/AttackFrontalFollowActivity.cs new file mode 100644 index 0000000000..012fffd640 --- /dev/null +++ b/OpenRA.Mods.CA/Activities/AttackFrontalFollowActivity.cs @@ -0,0 +1,198 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Linq; +using OpenRA.Activities; +using OpenRA.Mods.Common; +using OpenRA.Mods.Common.Traits; +using OpenRA.Mods.CA.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Activities +{ + public class AttackFrontalFollowActivity : Activity, IActivityNotifyStanceChanged + { + readonly AttackFollowFrontal attack; + readonly RevealsShroud[] revealsShroud; + readonly IMove move; + readonly bool forceAttack; + readonly Color? targetLineColor; + readonly IFacing facing; + + Target target; + Target lastVisibleTarget; + bool useLastVisibleTarget; + WDist lastVisibleMaximumRange; + WDist lastVisibleMinimumRange; + BitSet lastVisibleTargetTypes; + Player lastVisibleOwner; + bool wasMovingWithinRange; + bool hasTicked; + + public AttackFrontalFollowActivity(Actor self, in Target target, bool allowMove, bool forceAttack, Color? targetLineColor = null) + { + attack = self.Trait(); + move = allowMove ? self.TraitOrDefault() : null; + revealsShroud = self.TraitsImplementing().ToArray(); + facing = self.Trait(); + + this.target = target; + this.forceAttack = forceAttack; + this.targetLineColor = targetLineColor; + + // The target may become hidden between the initial order request and the first tick (e.g. if queued) + // Moving to any position (even if quite stale) is still better than immediately giving up + if ((target.Type == TargetType.Actor && target.Actor.CanBeViewedByPlayer(self.Owner)) + || target.Type == TargetType.FrozenActor || target.Type == TargetType.Terrain) + { + lastVisibleTarget = Target.FromPos(target.CenterPosition); + lastVisibleMaximumRange = attack.GetMaximumRangeVersusTarget(target); + lastVisibleMinimumRange = attack.GetMinimumRangeVersusTarget(target); + + if (target.Type == TargetType.Actor) + { + lastVisibleOwner = target.Actor.Owner; + lastVisibleTargetTypes = target.Actor.GetEnabledTargetTypes(); + } + else if (target.Type == TargetType.FrozenActor) + { + lastVisibleOwner = target.FrozenActor.Owner; + lastVisibleTargetTypes = target.FrozenActor.TargetTypes; + } + } + } + + public override bool Tick(Actor self) + { + if (IsCanceling) + return true; + + // Check that AttackFollow hasn't cancelled the target by modifying attack.Target + // Having both this and AttackFollow modify that field is a horrible hack. + if (hasTicked && attack.RequestedTarget.Type == TargetType.Invalid) + return true; + + if (attack.IsTraitPaused) + return false; + + target = target.Recalculate(self.Owner, out var targetIsHiddenActor); + attack.SetRequestedTarget(self, target, forceAttack); + hasTicked = true; + + if (!targetIsHiddenActor && target.Type == TargetType.Actor) + { + lastVisibleTarget = Target.FromTargetPositions(target); + lastVisibleMaximumRange = attack.GetMaximumRangeVersusTarget(target); + lastVisibleMinimumRange = attack.GetMinimumRange(); + lastVisibleOwner = target.Actor.Owner; + lastVisibleTargetTypes = target.Actor.GetEnabledTargetTypes(); + + var leeway = attack.Info.RangeMargin.Length; + if (leeway != 0 && move != null && target.Actor.Info.HasTraitInfo()) + { + var preferMinRange = Math.Min(lastVisibleMinimumRange.Length + leeway, lastVisibleMaximumRange.Length); + var preferMaxRange = Math.Max(lastVisibleMaximumRange.Length - leeway, lastVisibleMinimumRange.Length); + lastVisibleMaximumRange = new WDist((lastVisibleMaximumRange.Length - leeway).Clamp(preferMinRange, preferMaxRange)); + } + } + + // The target may become hidden in the same tick the AttackActivity constructor is called, + // causing lastVisible* to remain uninitialized. + // Fix the fallback values based on the frozen actor properties + else if (target.Type == TargetType.FrozenActor && !lastVisibleTarget.IsValidFor(self)) + { + lastVisibleTarget = Target.FromTargetPositions(target); + lastVisibleMaximumRange = attack.GetMaximumRangeVersusTarget(target); + lastVisibleOwner = target.FrozenActor.Owner; + lastVisibleTargetTypes = target.FrozenActor.TargetTypes; + } + + var maxRange = lastVisibleMaximumRange; + var minRange = lastVisibleMinimumRange; + useLastVisibleTarget = targetIsHiddenActor || !target.IsValidFor(self); + + // Most actors want to be able to see their target before shooting + if (target.Type == TargetType.FrozenActor && !attack.Info.TargetFrozenActors && !forceAttack) + { + var rs = revealsShroud + .Where(Exts.IsTraitEnabled) + .MaxByOrDefault(s => s.Range); + + // Default to 2 cells if there are no active traits + var sightRange = rs != null ? rs.Range : WDist.FromCells(2); + if (sightRange < maxRange) + maxRange = sightRange; + } + + // If we are ticking again after previously sequencing a MoveWithRange then that move must have completed + // Either we are in range and can see the target, or we've lost track of it and should give up + if (wasMovingWithinRange && targetIsHiddenActor) + return true; + + // Target is hidden or dead, and we don't have a fallback position to move towards + if (useLastVisibleTarget && !lastVisibleTarget.IsValidFor(self)) + return true; + + var pos = self.CenterPosition; + var checkTarget = useLastVisibleTarget ? lastVisibleTarget : target; + + // We've reached the required range - if the target is visible and valid then we wait + // otherwise if it is hidden or dead we give up + if (checkTarget.IsInRange(pos, maxRange) && !checkTarget.IsInRange(pos, minRange)) + { + var extraTurning = attack.Info.MustFaceTarget ? WAngle.Zero : attack.Info.FacingTolerance; + if (!attack.TargetInFiringArc(self, checkTarget, extraTurning)) + { + var desiredFacing = (attack.GetTargetPosition(pos, checkTarget) - pos).Yaw; + facing.Facing = Util.TickFacing(facing.Facing, desiredFacing, facing.TurnSpeed); + } + + if (useLastVisibleTarget) + return true; + + return false; + } + + // We can't move into range, so give up + if (move == null || maxRange == WDist.Zero || maxRange < minRange) + return true; + + wasMovingWithinRange = true; + QueueChild(move.MoveWithinRange(target, minRange, maxRange, checkTarget.CenterPosition)); + return false; + } + + protected override void OnLastRun(Actor self) + { + // Cancel the requested target, but keep firing on it while in range + attack.ClearRequestedTarget(); + } + + void IActivityNotifyStanceChanged.StanceChanged(Actor self, AutoTarget autoTarget, UnitStance oldStance, UnitStance newStance) + { + // Cancel non-forced targets when switching to a more restrictive stance if they are no longer valid for auto-targeting + if (newStance > oldStance || forceAttack) + return; + + // If lastVisibleTarget is invalid we could never view the target in the first place, so we just drop it here too + if (!lastVisibleTarget.IsValidFor(self) || !autoTarget.HasValidTargetPriority(self, lastVisibleOwner, lastVisibleTargetTypes)) + attack.ClearRequestedTarget(); + } + + public override IEnumerable TargetLineNodes(Actor self) + { + if (targetLineColor != null) + yield return new TargetLineNode(useLastVisibleTarget ? lastVisibleTarget : target, targetLineColor.Value); + } + } +} diff --git a/OpenRA.Mods.CA/Activities/BallisticMissileFly.cs b/OpenRA.Mods.CA/Activities/BallisticMissileFly.cs index 29a335f695..a13b72f6b0 100644 --- a/OpenRA.Mods.CA/Activities/BallisticMissileFly.cs +++ b/OpenRA.Mods.CA/Activities/BallisticMissileFly.cs @@ -1,11 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2007-2018 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -37,6 +36,7 @@ public BallisticMissileFly(Actor self, Target t, BallisticMissile sbm = null) targetPos = t.CenterPosition; // fixed position == no homing length = Math.Max((targetPos - initPos).Length / this.sbm.Info.Speed, 1); facing = (targetPos - initPos).Yaw; + sbm.Facing = GetEffectiveFacing(); } WAngle GetEffectiveFacing() @@ -57,7 +57,7 @@ WAngle GetEffectiveFacing() return new WAngle(effective); } - public void FlyToward(Actor self, BallisticMissile sbm) + void FlyToward(Actor self, BallisticMissile sbm) { var pos = WPos.LerpQuadratic(initPos, targetPos, sbm.Info.LaunchAngle, ticks, length); sbm.SetPosition(self, pos); @@ -72,7 +72,7 @@ public override bool Tick(Actor self) var move = sbm.FlyStep(sbm.Facing); // Destruct so that Explodes will be called - if (d.HorizontalLengthSquared < move.HorizontalLengthSquared) + if (d.HorizontalLengthSquared < move.HorizontalLengthSquared || self.CenterPosition.Z <= 0) { Queue(new CallFunc(() => self.Kill(self))); return true; diff --git a/OpenRA.Mods.CA/Activities/ChronoResourceTeleport.cs b/OpenRA.Mods.CA/Activities/ChronoResourceTeleport.cs index b2e12df4b6..582fb12431 100644 --- a/OpenRA.Mods.CA/Activities/ChronoResourceTeleport.cs +++ b/OpenRA.Mods.CA/Activities/ChronoResourceTeleport.cs @@ -1,10 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -19,15 +19,22 @@ namespace OpenRA.Mods.CA.Activities { public class ChronoResourceTeleport : Activity { + readonly Actor refinery; readonly CPos destination; readonly ChronoResourceDeliveryInfo info; readonly CPos harvestedField; + readonly WAngle dockAngle; - public ChronoResourceTeleport(CPos destination, ChronoResourceDeliveryInfo info, CPos harvestedField) + public ChronoResourceTeleport(CPos destination, ChronoResourceDeliveryInfo info, CPos harvestedField, Actor refinery) { this.destination = destination; this.info = info; this.harvestedField = harvestedField; + this.refinery = refinery; + + var refInfo = refinery.Info.TraitInfoOrDefault(); + if (refInfo != null) + dockAngle = refInfo.DockAngle; } public override bool Tick(Actor self) @@ -45,6 +52,10 @@ public override bool Tick(Actor self) self.Trait().SetPosition(self, destination); self.Generation++; + var facing = self.TraitOrDefault(); + if (facing != null) + facing.Facing = dockAngle; + var destinationpos = self.CenterPosition; if (info.WarpOutSequence != null) @@ -53,6 +64,7 @@ public override bool Tick(Actor self) if (info.WarpOutSound != null && (info.AudibleThroughFog || !self.World.FogObscures(sourcepos))) Game.Sound.Play(SoundType.World, info.WarpOutSound, self.CenterPosition, info.SoundVolume); + self.QueueActivity(new MoveToDock(self, refinery)); self.QueueActivity(new FindAndDeliverResources(self, harvestedField)); return true; diff --git a/OpenRA.Mods.CA/Activities/ConvertActor.cs b/OpenRA.Mods.CA/Activities/ConvertActor.cs index c3d9e28047..b2d1cbe162 100644 --- a/OpenRA.Mods.CA/Activities/ConvertActor.cs +++ b/OpenRA.Mods.CA/Activities/ConvertActor.cs @@ -1,17 +1,14 @@ #region Copyright & License Information - -/* - * Copyright 2016-2021 The CA Developers (see AUTHORS) - * This file is part of CA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ - #endregion -using OpenRA.Mods.CA.Traits.UnitConverter; +using OpenRA.Mods.CA.Traits; using OpenRA.Mods.Common.Activities; using OpenRA.Primitives; using OpenRA.Traits; diff --git a/OpenRA.Mods.CA/Activities/CrashLand.cs b/OpenRA.Mods.CA/Activities/CrashLand.cs deleted file mode 100644 index 7367db0749..0000000000 --- a/OpenRA.Mods.CA/Activities/CrashLand.cs +++ /dev/null @@ -1,65 +0,0 @@ -#region Copyright & License Information -/* - * Copyright 2007-2019 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. - */ -#endregion - -using System.Linq; -using OpenRA.Activities; -using OpenRA.Mods.CA.Traits; -using OpenRA.Mods.Common.Activities; -using OpenRA.Mods.Common.Traits; -using OpenRA.Traits; - -namespace OpenRA.Mods.CA.Activities -{ - public class CrashLand : Activity - { - readonly Aircraft aircraft; - readonly CrashLandingInfo info; - int acceleration = 0; - int spin = 0; - - public CrashLand(Actor self, CrashLandingInfo info) - { - this.info = info; - IsInterruptible = false; - aircraft = self.Trait(); - if (info.Spins) - acceleration = self.World.SharedRandom.Next(2) * 2 - 1; - } - - public override bool Tick(Actor self) - { - if (self.World.Map.DistanceAboveTerrain(self.CenterPosition).Length <= 0) - { - if (info.ExplosionWeapon != null) - { - // Use .FromPos since this actor is killed. Cannot use Target.FromActor - info.ExplosionWeapon.Impact(Target.FromPos(self.CenterPosition), self); - } - - QueueChild(new RemoveSelf()); - - return true; - } - - if (info.Spins) - { - spin += acceleration; - aircraft.Facing = new WAngle(aircraft.Facing.Angle + spin); - } - - var move = info.Moves ? aircraft.FlyStep(aircraft.Facing) : WVec.Zero; - move -= new WVec(WDist.Zero, WDist.Zero, info.Velocity); - aircraft.SetPosition(self, aircraft.CenterPosition + move); - - return false; - } - } -} diff --git a/OpenRA.Mods.CA/Activities/CruiseMissileFly.cs b/OpenRA.Mods.CA/Activities/CruiseMissileFly.cs new file mode 100644 index 0000000000..3257e4b205 --- /dev/null +++ b/OpenRA.Mods.CA/Activities/CruiseMissileFly.cs @@ -0,0 +1,152 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using OpenRA.Activities; +using OpenRA.Mods.CA.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Activities +{ + public class CruiseMissileFly : Activity + { + readonly CruiseMissile cm; + readonly WPos launchPos; + WPos initTargetPos; + WPos targetPos; + WPos currentPos; + int length; + int ticks; + WAngle facing; + readonly Target target; + WDist maxAltitude; + WDist maxTargetMovement; + bool trackingActive; + int launchAngleDegrees; + double launchAngleRad; + + public CruiseMissileFly(Actor self, Target t, WPos initialTargetPos, CruiseMissile cm, WDist maxAltitude, WDist maxTargetMovement, bool trackTarget) + { + if (cm == null) + this.cm = self.Trait(); + else + this.cm = cm; + + if (t.Type == TargetType.Invalid) + target = Target.FromPos(initialTargetPos); + else + target = t; + + launchPos = currentPos = self.CenterPosition; + initTargetPos = targetPos = target.CenterPosition; + length = Math.Max((targetPos - launchPos).Length / this.cm.Info.Speed, 1); + facing = (targetPos - launchPos).Yaw; + cm.Facing = GetEffectiveFacing(); + trackingActive = trackTarget; + this.maxAltitude = maxAltitude; + this.maxTargetMovement = maxTargetMovement; + launchAngleDegrees = (int)(cm.Info.LaunchAngle.Angle / (1024f / 360f)); + launchAngleRad = Math.PI * launchAngleDegrees / 180.0; + cm.SetState(CruiseMissileState.Ascending); + } + + WAngle GetEffectiveFacing() + { + var at = (float)ticks / (length - 1); + var attitude = cm.Info.LaunchAngle.Tan() * (1 - 2 * at) / (4 * 1024); + if (cm.State == CruiseMissileState.Cruising) + { + attitude = 0f; + } + else if (cm.State == CruiseMissileState.Descending) + { + attitude *= 1.2f; + } + + var u = facing.Angle % 512 / 512f; + var scale = 2048 * u * (1 - u); + + var effective = (int)(facing.Angle < 512 + ? facing.Angle - scale * attitude + : facing.Angle + scale * attitude); + + return new WAngle(effective); + } + + void FlyToward(Actor self, CruiseMissile cm) + { + currentPos = GetInterpolatedPos(launchPos, targetPos, launchAngleRad, ticks, length); + cm.SetPosition(self, currentPos); + cm.Facing = GetEffectiveFacing(); + } + + public override bool Tick(Actor self) + { + if (trackingActive && maxTargetMovement > WDist.Zero && target.Type == TargetType.Actor && (initTargetPos - target.CenterPosition).Length > maxTargetMovement.Length) + trackingActive = false; + + if (trackingActive && ((target.Type == TargetType.Actor && !target.Actor.IsDead) || (target.Type == TargetType.FrozenActor && target.FrozenActor != null))) + targetPos = target.CenterPosition; + + var d = targetPos - self.CenterPosition; + + // The next move would overshoot, so consider it close enough + var move = cm.FlyStep(cm.Facing); + + // Destruct so that Explodes will be called + if (d.HorizontalLengthSquared < move.HorizontalLengthSquared || currentPos.Z <= 0) + { + Queue(new CallFunc(() => self.Kill(self))); + return true; + } + + var previousZ = currentPos.Z; + FlyToward(self, cm); + + if (currentPos.Z < previousZ) + cm.SetState(CruiseMissileState.Descending); + + ticks++; + return false; + } + + public override IEnumerable GetTargets(Actor self) + { + yield return Target.FromPos(targetPos); + } + + private WPos GetInterpolatedPos(WPos start, WPos end, double launchAngleRad, int tick, int maxTick) + { + if (maxTick < 1) + throw new ArgumentException("maxTick should be at least 1."); + + double t = (double)tick / maxTick; + + int interpolatedX = (int)(start.X + t * (end.X - start.X)); + int interpolatedY = (int)(start.Y + t * (end.Y - start.Y)); + + // Bézier curve for the Z-coordinate + double controlPointZ = start.Z + Math.Tan(launchAngleRad) * Math.Sqrt((end.X - start.X) * (end.X - start.X) + (end.Y - start.Y) * (end.Y - start.Y)) / 2.0; + double interpolatedZ = (1 - t) * (1 - t) * start.Z + 2 * (1 - t) * t * controlPointZ + t * t * end.Z; + var clampedZ = (int)interpolatedZ.Clamp(int.MinValue, int.MaxValue); + + var wasCruising = cm.State == CruiseMissileState.Cruising; + if (clampedZ > maxAltitude.Length) + cm.SetState(CruiseMissileState.Cruising); + else if (wasCruising) + cm.SetState(CruiseMissileState.Descending); + + var finalZ = cm.State == CruiseMissileState.Cruising ? maxAltitude.Length : clampedZ; + + return new WPos(interpolatedX, interpolatedY, finalZ); + } + } +} diff --git a/OpenRA.Mods.CA/Activities/DeployForGrantedConditionTurreted.cs b/OpenRA.Mods.CA/Activities/DeployForGrantedConditionTurreted.cs new file mode 100644 index 0000000000..75be07e920 --- /dev/null +++ b/OpenRA.Mods.CA/Activities/DeployForGrantedConditionTurreted.cs @@ -0,0 +1,124 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using OpenRA.Activities; +using OpenRA.Mods.CA.Traits; +using OpenRA.Mods.Common.Activities; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Activities +{ + public class DeployForGrantedConditionTurreted : Activity + { + readonly GrantConditionOnDeployTurreted deploy; + readonly bool canTurn; + readonly bool moving; + readonly IFacing facing; + readonly Action onComplete; + + public DeployForGrantedConditionTurreted(Actor self, GrantConditionOnDeployTurreted deploy, bool moving = false, Action onComplete = null) + { + this.deploy = deploy; + this.moving = moving; + canTurn = self.Info.HasTraitInfo(); + facing = self.TraitOrDefault(); + this.onComplete = onComplete; + } + + protected override void OnFirstRun(Actor self) + { + // Turn to the required facing. + if (deploy.DeployState == DeployState.Undeployed && deploy.Info.ValidFacings.Length > 0 && canTurn && !moving) + { + var desiredFacing = deploy.Info.ValidFacings[0]; + + // Choose the nearest facing to the current facing. + if (facing != null) + { + var currentFacing = facing.Facing; + var nearestFacingDiff = int.MaxValue; + + foreach (var validDeployFacing in deploy.Info.ValidFacings) + { + int diff1 = Math.Abs(validDeployFacing.Facing - currentFacing.Facing); + int diff2 = 256 - diff1; + int diff = Math.Min(diff1, diff2); + + if (diff < nearestFacingDiff) + { + desiredFacing = validDeployFacing; + nearestFacingDiff = diff; + } + } + } + + QueueChild(new Turn(self, desiredFacing)); + } + } + + protected override void OnLastRun(Actor self) + { + onComplete?.Invoke(); + } + + public override bool Tick(Actor self) + { + if (IsCanceling || (deploy.DeployState != DeployState.Deployed && moving)) + return true; + + QueueChild(new DeployInner(deploy)); + return true; + } + + public override IEnumerable TargetLineNodes(Actor self) + { + if (NextActivity != null) + foreach (var n in NextActivity.TargetLineNodes(self)) + yield return n; + + yield break; + } + } + + public class DeployInner : Activity + { + readonly GrantConditionOnDeployTurreted deployment; + bool initiated; + + public DeployInner(GrantConditionOnDeployTurreted deployment) + { + this.deployment = deployment; + + // Once deployment animation starts, the animation must finish. + IsInterruptible = false; + } + + public override bool Tick(Actor self) + { + // Wait for deployment + if (deployment.DeployState == DeployState.Deploying || deployment.DeployState == DeployState.Undeploying) + return false; + + if (initiated) + return true; + + if (deployment.DeployState == DeployState.Undeployed) + deployment.Deploy(); + else + deployment.Undeploy(); + + initiated = true; + return false; + } + } +} diff --git a/OpenRA.Mods.CA/Activities/Dive.cs b/OpenRA.Mods.CA/Activities/Dive.cs new file mode 100644 index 0000000000..4ddec337e3 --- /dev/null +++ b/OpenRA.Mods.CA/Activities/Dive.cs @@ -0,0 +1,84 @@ +#region Copyright & License Information +/* + * Copyright (c) The OpenRA Developers and Contributors + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. For more + * information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using OpenRA.Activities; +using OpenRA.Mods.Common; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Activities +{ + public class Dive : Activity + { + readonly Aircraft aircraft; + readonly int speed; + readonly Target target; + readonly Action onDiveComplete; + + WPos origin, targetPosition; + int length; + bool canceled = false; + bool jumpComplete = false; + int ticks = 0; + + public Dive(in Target target, Aircraft aircraft, int speed, Action onDiveComplete = null) + { + this.aircraft = aircraft; + this.target = target; + this.speed = speed; + this.onDiveComplete = onDiveComplete; + } + + protected override void OnFirstRun(Actor self) + { + if (target.Type == TargetType.Invalid || (target.Type == TargetType.Actor && target.Actor.IsDead)) + { + canceled = true; + return; + } + + origin = self.CenterPosition; + targetPosition = target.CenterPosition; + length = Math.Max((origin - targetPosition).Length / speed, 1); + IsInterruptible = false; + } + + public override bool Tick(Actor self) + { + if (canceled || jumpComplete) + return true; + + if (target.Type != TargetType.Invalid) + targetPosition = target.CenterPosition; + + var position = length > 1 ? WPos.Lerp(origin, targetPosition, ticks, length - 1) : targetPosition; + aircraft.SetCenterPosition(self, position); + + var desiredFacing = (targetPosition - position).Yaw; + aircraft.Facing = Util.TickFacing(aircraft.Facing, desiredFacing, aircraft.TurnSpeed); + + if (++ticks >= length) + { + jumpComplete = true; + onDiveComplete?.Invoke(); + } + + return false; + } + + public override IEnumerable GetTargets(Actor self) + { + yield return Target.FromPos(ticks < length / 2 ? origin : targetPosition); + } + } +} diff --git a/OpenRA.Mods.CA/Activities/DiveApproach.cs b/OpenRA.Mods.CA/Activities/DiveApproach.cs new file mode 100644 index 0000000000..37029de72f --- /dev/null +++ b/OpenRA.Mods.CA/Activities/DiveApproach.cs @@ -0,0 +1,135 @@ +#region Copyright & License Information +/* + * Copyright (c) The OpenRA Developers and Contributors + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. For more + * information, see COPYING. + */ +#endregion + +using System; +using OpenRA.Activities; +using OpenRA.Mods.Common; +using OpenRA.Mods.Common.Activities; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Activities +{ + public class DiveApproach : Activity + { + readonly Aircraft aircraft; + readonly Target target; + + WPos targetPosition; + bool initialized; + + public DiveApproach(in Target target, Aircraft aircraft) + { + this.target = target; + this.aircraft = aircraft; + } + + protected override void OnFirstRun(Actor self) + { + if (target.Type == TargetType.Invalid || (target.Type == TargetType.Actor && target.Actor.IsDead)) + { + Cancel(self); + return; + } + + targetPosition = target.CenterPosition; + initialized = true; + } + + public override bool Tick(Actor self) + { + if (IsCanceling) + return true; + + if (target.Type == TargetType.Invalid || (target.Type == TargetType.Actor && target.Actor.IsDead)) + return true; + + if (!initialized) + { + targetPosition = target.CenterPosition; + initialized = true; + } + + targetPosition = target.CenterPosition; + + // Ensure we are airborne before attempting fixed-wing approach. + var dat = self.World.Map.DistanceAboveTerrain(aircraft.CenterPosition); + var isLanded = dat <= aircraft.LandAltitude; + if (isLanded) + { + QueueChild(new TakeOff(self)); + return false; + } + + // If the aircraft is paused (e.g. EMP), we can't meaningfully maneuver. + if (aircraft.IsTraitPaused) + return false; + + var altitude = dat.Length; + var pitchTan = aircraft.Info.MaximumPitch.Tan(); + var requiredDistance = pitchTan != 0 ? altitude * 1024 / pitchTan : 0; + + // Maintain some slack so minor pathing/turning doesn't oscillate the activity state. + const int Slack = 256; + var minRange = Math.Max(requiredDistance - Slack, 0); + var maxRange = requiredDistance + Slack; + + var pos = self.CenterPosition; + var delta = targetPosition - pos; + if (delta.HorizontalLengthSquared == 0) + return true; + + var toTargetYaw = delta.Yaw; + + // Check whether we are at a suitable distance to begin a MaximumPitch-limited descent. + var hsq = delta.HorizontalLengthSquared; + var minSq = (long)minRange * minRange; + var maxSq = (long)maxRange * maxRange; + var inRange = maxRange > 0 && hsq >= minSq && hsq <= maxSq; + + // Check whether we are facing towards the dive location. + var diff = Math.Abs(toTargetYaw.Angle - aircraft.Facing.Angle); + if (diff > 512) + diff = 1024 - diff; + + var facingOk = diff <= WAngle.FromDegrees(10).Angle; + if (inRange && facingOk) + return true; + + // Steer continuously without stopping. Fixed-wing aircraft cannot turn in place, + // so we use Fly.FlyTick to keep moving forward while rotating. + var desiredFacing = toTargetYaw; + + // If we're too close, turn away and fly forward to open distance. + if (hsq < minSq) + desiredFacing = toTargetYaw + new WAngle(512); + + // Avoid attempting an unreachable immediate turn (same heuristic as Fly). + if (!aircraft.Info.CanSlide) + { + var turnRadius = Fly.CalculateTurnRadius(aircraft.MovementSpeed, aircraft.TurnSpeed); + if (turnRadius > 0) + { + var turnCenterFacing = aircraft.Facing + new WAngle(Util.GetTurnDirection(aircraft.Facing, desiredFacing) * 256); + var turnCenterDir = new WVec(0, -1024, 0).Rotate(WRot.FromYaw(turnCenterFacing)); + turnCenterDir *= turnRadius; + turnCenterDir /= 1024; + var turnCenter = aircraft.CenterPosition + turnCenterDir; + if ((targetPosition - turnCenter).HorizontalLengthSquared < (long)turnRadius * turnRadius) + desiredFacing = aircraft.Facing; + } + } + + Fly.FlyTick(self, aircraft, desiredFacing, aircraft.Info.CruiseAltitude); + return false; + } + } +} diff --git a/OpenRA.Mods.CA/Activities/EnterAirstrikeMaster.cs b/OpenRA.Mods.CA/Activities/EnterAirstrikeMaster.cs index ba859dd75c..aeed3a7039 100644 --- a/OpenRA.Mods.CA/Activities/EnterAirstrikeMaster.cs +++ b/OpenRA.Mods.CA/Activities/EnterAirstrikeMaster.cs @@ -1,10 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -38,6 +38,9 @@ public override bool Tick(Actor self) if (self.IsDead || master.IsDead) return; + if (spawnerMaster == null || !spawnerMaster.SlaveEntries.Select(se => se.Actor).Contains(self)) + return; + spawnerMaster.PickupSlave(master, self); w.Remove(self); diff --git a/OpenRA.Mods.CA/Activities/EnterCarrierMaster.cs b/OpenRA.Mods.CA/Activities/EnterCarrierMaster.cs index d3c04bec8d..dcff11492b 100644 --- a/OpenRA.Mods.CA/Activities/EnterCarrierMaster.cs +++ b/OpenRA.Mods.CA/Activities/EnterCarrierMaster.cs @@ -1,15 +1,13 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion -using System.Collections.Generic; -using System.Drawing; using System.Linq; using OpenRA.Mods.CA.Traits; using OpenRA.Mods.Common.Activities; @@ -55,6 +53,10 @@ protected override void OnEnterComplete(Actor self, Actor targetActor) foreach (var pool in ammoPools) while (pool.GiveAmmo(self, 1)) { } + + var aircraft = self.TraitOrDefault(); + if (aircraft != null) + aircraft.RemoveInfluence(); }); } } diff --git a/OpenRA.Mods.CA/Activities/EnterTeleportNetwork.cs b/OpenRA.Mods.CA/Activities/EnterTeleportNetwork.cs index e910a0ddf9..8a9a6fcdce 100644 --- a/OpenRA.Mods.CA/Activities/EnterTeleportNetwork.cs +++ b/OpenRA.Mods.CA/Activities/EnterTeleportNetwork.cs @@ -1,11 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2019-2020 The OpenHV Developers (see CREDITS) - * This file is part of OpenHV, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -63,7 +62,7 @@ protected override void OnEnterComplete(Actor self, Actor target) if (primary == null || manager.RandomExit) { - var nodes = self.World.ActorsWithTrait().Where(p => p.Trait.Info.Type == type && p.Actor.Owner == self.Owner && p.Actor != target).ToList(); + var nodes = self.World.ActorsWithTrait().Where(p => p.Trait.Info.Type == type && p.Actor.Owner == target.Owner && p.Actor != target).ToList(); if (nodes.Count == 0) return; @@ -205,7 +204,7 @@ public override bool Tick(Actor self) case EnterState.Entering: { // Check that we reached the requested position - var targetPos = target.Positions.PositionClosestTo(self.CenterPosition); + var targetPos = target.Positions.ClosestToIgnoringPath(self.CenterPosition); if (!IsCanceling && self.CenterPosition == targetPos && target.Type == TargetType.Actor) OnEnterComplete(self, target.Actor); diff --git a/OpenRA.Mods.CA/Activities/FallDown.cs b/OpenRA.Mods.CA/Activities/FallDown.cs index 98c2c88274..98000dbf0b 100644 --- a/OpenRA.Mods.CA/Activities/FallDown.cs +++ b/OpenRA.Mods.CA/Activities/FallDown.cs @@ -1,14 +1,16 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion using OpenRA.Activities; +using OpenRA.Mods.CA.Traits; +using OpenRA.Mods.Common.Traits; using OpenRA.Traits; namespace OpenRA.Mods.CA.Activities @@ -16,23 +18,25 @@ namespace OpenRA.Mods.CA.Activities public class FallDown : Activity { readonly IPositionable pos; + readonly IFacing facing; readonly WVec fallVector; WPos dropPosition; WPos currentPosition; - public FallDown(Actor self, WPos dropPosition, int fallRate, Actor ignoreActor = null) + public FallDown(Actor self, WPos dropPosition, int fallRate, int speed = 0) { - pos = self.TraitOrDefault(); IsInterruptible = false; - fallVector = new WVec(0, 0, fallRate); + pos = self.TraitOrDefault(); + facing = self.TraitOrDefault(); this.dropPosition = dropPosition; + fallVector = CalculateFallVector(fallRate, speed, facing != null ? facing.Facing : WAngle.Zero); } public override bool Tick(Actor self) { - currentPosition -= fallVector; - pos.SetVisualPosition(self, currentPosition); + currentPosition += fallVector; + pos.SetCenterPosition(self, currentPosition); // If the unit has landed, this will be the last tick if (self.World.Map.DistanceAboveTerrain(currentPosition).Length <= 0) @@ -40,6 +44,9 @@ public override bool Tick(Actor self) var dat = self.World.Map.DistanceAboveTerrain(currentPosition); pos.SetPosition(self, currentPosition - new WVec(WDist.Zero, WDist.Zero, dat)); + foreach (var nfd in self.TraitsImplementing()) + nfd.OnLanded(self); + return true; } @@ -52,5 +59,12 @@ protected override void OnFirstRun(Actor self) pos.SetPosition(self, dropPosition); currentPosition = self.CenterPosition; } + + WVec CalculateFallVector(int fallRate, int speed, WAngle facing) + { + var dir = new WVec(0, -1024, 0).Rotate(WRot.FromYaw(facing)); + var vec = speed * dir / 1024; + return new WVec(vec.X, vec.Y, -fallRate); + } } } diff --git a/OpenRA.Mods.CA/Activities/GuidedMissileFly.cs b/OpenRA.Mods.CA/Activities/GuidedMissileFly.cs new file mode 100644 index 0000000000..dfc07e3500 --- /dev/null +++ b/OpenRA.Mods.CA/Activities/GuidedMissileFly.cs @@ -0,0 +1,91 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using OpenRA.Activities; +using OpenRA.Mods.CA.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Activities +{ + public class GuidedMissileFly : Activity + { + readonly GuidedMissile gm; + readonly WPos launchPos; + WPos initTargetPos; + WPos targetPos; + readonly Target target; + WDist maxTargetMovement; + bool trackingActive; + + public GuidedMissileFly(Actor self, Target t, WPos initialTargetPos, GuidedMissile gm, WDist maxTargetMovement) + { + if (gm == null) + this.gm = self.Trait(); + else + this.gm = gm; + + if (t.Type == TargetType.Invalid && t.Actor != null && (t.Actor.IsDead || !t.Actor.IsInWorld)) + target = Target.FromPos(initialTargetPos); + else + target = t; + + trackingActive = true; + launchPos = self.CenterPosition; + initTargetPos = targetPos = target.CenterPosition; + gm.Facing = (targetPos - launchPos).Yaw; + this.maxTargetMovement = maxTargetMovement; + } + + public override bool Tick(Actor self) + { + if (trackingActive && maxTargetMovement > WDist.Zero && target.Type == TargetType.Actor && (initTargetPos - target.CenterPosition).HorizontalLengthSquared > maxTargetMovement.LengthSquared) + trackingActive = false; + + if (trackingActive && ((target.Type == TargetType.Actor && !target.Actor.IsDead) || (target.Type == TargetType.FrozenActor && target.FrozenActor != null))) + targetPos = target.CenterPosition; + + var d = targetPos - self.CenterPosition; + var move = gm.FlyStep(gm.Facing); + var overshoot = d.HorizontalLengthSquared < move.HorizontalLengthSquared; + + // Destruct so that Explodes will be called + if (overshoot || self.CenterPosition.Z <= 0) + { + // Snap to target + if (overshoot) + gm.SetPosition(self, targetPos); + + Queue(new CallFunc(() => self.Kill(self))); + return true; + } + + gm.Facing = d.Yaw; + var newPosition = self.CenterPosition + move; + var ticksToTarget = (targetPos - newPosition).HorizontalLength / gm.Info.Speed; + var altitudeDifference = targetPos.Z - newPosition.Z; + var newZ = ticksToTarget > 0 ? altitudeDifference / ticksToTarget : targetPos.Z; + newPosition += new WVec(0, 0, newZ); + + if (newPosition.Z < gm.Info.MinAltitude.Length && ticksToTarget > 0) + newPosition = new WPos(newPosition.X, newPosition.Y, gm.Info.MinAltitude.Length); + + gm.SetPosition(self, newPosition); + + return false; + } + + public override IEnumerable GetTargets(Actor self) + { + yield return Target.FromPos(targetPos); + } + } +} diff --git a/OpenRA.Mods.CA/Activities/HuntCA.cs b/OpenRA.Mods.CA/Activities/HuntCA.cs new file mode 100644 index 0000000000..0e1c8d669c --- /dev/null +++ b/OpenRA.Mods.CA/Activities/HuntCA.cs @@ -0,0 +1,62 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.Activities; +using OpenRA.Mods.Common; +using OpenRA.Mods.Common.Activities; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Activities +{ + public class HuntCA : Activity + { + readonly IEnumerable targets; + readonly IMove move; + int ticks; + int scanInterval; + + public HuntCA(Actor self) + { + ticks = 0; + scanInterval = self.World.SharedRandom.Next(20, 40); + move = self.Trait(); + var attack = self.Trait(); + targets = self.World.ActorsHavingTrait().Where( + a => self != a && !a.IsDead && a.IsInWorld && a.AppearsHostileTo(self) + && a.IsTargetableBy(self) && attack.HasAnyValidWeapons(Target.FromActor(a))); + } + + public override bool Tick(Actor self) + { + if (IsCanceling) + return true; + + ticks++; + + var targetActor = ticks % scanInterval == 0 ? targets.ClosestToWithPathFrom(self) : null; + + if (targetActor != null) + { + scanInterval = self.World.SharedRandom.Next(20, 40); + + // We want to keep 2 cells of distance from the target to prevent the pathfinder from thinking the target position is blocked. + QueueChild(new AttackMoveActivity(self, () => move.MoveWithinRange(Target.FromCell(self.World, targetActor.Location), WDist.FromCells(2)))); + QueueChild(new Wait(25)); + } + else if (ticks > 375) + scanInterval = self.World.SharedRandom.Next(250, 500); + + return false; + } + } +} diff --git a/OpenRA.Mods.CA/Activities/InstantTransform.cs b/OpenRA.Mods.CA/Activities/InstantTransform.cs index 1506247b84..8ea2c7930b 100644 --- a/OpenRA.Mods.CA/Activities/InstantTransform.cs +++ b/OpenRA.Mods.CA/Activities/InstantTransform.cs @@ -1,14 +1,14 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion +using System; using System.Collections.Generic; using OpenRA.Activities; using OpenRA.Mods.CA.Traits; @@ -25,13 +25,12 @@ public class InstantTransform : Activity { public readonly string ToActor; public CVec Offset = CVec.Zero; - public WAngle Facing = new WAngle(384); - public WPos Altitude = WPos.Zero; public string[] Sounds = { }; public string Notification = null; public int ForceHealthPercentage = 0; public bool SkipMakeAnims = false; public string Faction = null; + public Action OnComplete; public InstantTransform(Actor self, string toActor) { @@ -39,8 +38,9 @@ public InstantTransform(Actor self, string toActor) } protected override void OnFirstRun(Actor self) - { - } + { + IsInterruptible = false; + } public override bool Tick(Actor self) { @@ -58,9 +58,6 @@ public override bool Tick(Actor self) var makeAnimation = self.TraitOrDefault(); if (!SkipMakeAnims && makeAnimation != null) { - // Once the make animation starts the activity must not be stopped anymore. - IsInterruptible = false; - // Wait forever QueueChild(new WaitFor(() => false)); makeAnimation.Reverse(self, () => DoTransform(self)); @@ -86,7 +83,7 @@ void DoTransform(Actor self) nt.OnTransform(self); var selected = w.Selection.Contains(self); - var controlgroup = w.Selection.GetControlGroupForActor(self); + var controlgroup = w.ControlGroups.GetControlGroupForActor(self); self.Dispose(); foreach (var s in Sounds) @@ -94,14 +91,29 @@ void DoTransform(Actor self) Game.Sound.PlayNotification(self.World.Map.Rules, self.Owner, "Speech", Notification, self.Owner.Faction.InternalName); + var cell = self.Location + Offset; + WPos centerPos; + + if (self.Info.TraitInfoOrDefault() != null && self.World.Map.Rules.Actors[ToActor].TraitInfoOrDefault() != null) + centerPos = self.CenterPosition; + else + centerPos = self.World.Map.CenterOfCell(cell) + new WVec(0, 0, self.CenterPosition.Z); + var init = new TypeDictionary { - new LocationInit(self.Location + Offset), + new LocationInit(cell), new OwnerInit(self.Owner), - new FacingInit(Facing), - new CenterPositionInit(Altitude), + new CenterPositionInit(centerPos), }; + var facing = self.TraitOrDefault(); + if (facing != null) + init.Add(new FacingInit(facing.Facing)); + + var turreted = self.TraitsImplementing().FirstEnabledTraitOrDefault(); + if (turreted != null) + init.Add(new TurretFacingInit(turreted.LocalOrientation.Yaw)); + if (SkipMakeAnims) init.Add(new SkipMakeAnimsInit()); @@ -136,11 +148,17 @@ void DoTransform(Actor self) self.ReplacedByActor = a; - if (selected) - w.Selection.Add(a); + if (a.TraitOrDefault() != null) + { + if (selected) + w.Selection.Add(a); + + if (controlgroup.HasValue) + w.ControlGroups.AddToControlGroup(a, controlgroup.Value); + } - if (controlgroup.HasValue) - w.Selection.AddToControlGroup(a, controlgroup.Value); + if (OnComplete != null) + OnComplete(a); }); } } diff --git a/OpenRA.Mods.CA/Activities/MassRideTransport.cs b/OpenRA.Mods.CA/Activities/MassRideTransport.cs new file mode 100644 index 0000000000..1eb86be337 --- /dev/null +++ b/OpenRA.Mods.CA/Activities/MassRideTransport.cs @@ -0,0 +1,88 @@ +#region Copyright & License Information +/* + * Copyright (c) The OpenRA Developers and Contributors + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. For more + * information, see COPYING. + */ +#endregion + +using OpenRA.Mods.Common.Activities; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Activities +{ + public class MassRideTransport : Enter + { + readonly Passenger passenger; + + Actor enterActor; + Cargo enterCargo; + Aircraft enterAircraft; + + public MassRideTransport(Actor self, in Target target, Color? targetLineColor) + : base(self, target, targetLineColor) + { + passenger = self.Trait(); + } + + protected override bool TryStartEnter(Actor self, Actor targetActor) + { + enterActor = targetActor; + enterCargo = targetActor.TraitOrDefault(); + enterAircraft = targetActor.TraitOrDefault(); + + // Make sure we can still enter the transport + // (but not before, because this may stop the actor in the middle of nowhere) + if (enterCargo == null || !passenger.Reserve(self, enterCargo)) + { + Cancel(self, true); + return false; + } + + if (enterAircraft != null && !enterAircraft.AtLandAltitude) + return false; + + return true; + } + + protected override void OnEnterComplete(Actor self, Actor targetActor) + { + self.World.AddFrameEndTask(w => + { + if (self.IsDead) + return; + + // Make sure the target hasn't changed while entering + // OnEnterComplete is only called if targetActor is alive + if (targetActor != enterActor) + return; + + if (!enterCargo.CanLoad(self)) + return; + + foreach (var inl in targetActor.TraitsImplementing()) + inl.Loading(self); + + enterCargo.Load(enterActor, self); + w.Remove(self); + }); + } + + protected override void OnLastRun(Actor self) + { + passenger.Unreserve(self); + } + + public override void Cancel(Actor self, bool keepQueue = false) + { + passenger.Unreserve(self); + + base.Cancel(self, keepQueue); + } + } +} diff --git a/OpenRA.Mods.CA/Activities/ParadropCargo.cs b/OpenRA.Mods.CA/Activities/ParadropCargo.cs new file mode 100644 index 0000000000..f67c8a9908 --- /dev/null +++ b/OpenRA.Mods.CA/Activities/ParadropCargo.cs @@ -0,0 +1,139 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Linq; +using OpenRA.Activities; +using OpenRA.Mods.Common; +using OpenRA.Mods.Common.Activities; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Activities +{ + public class ParadropCargo : Activity + { + readonly Aircraft aircraft; + readonly AttackAircraft attackAircraft; + readonly Cargo cargo; + readonly INotifyUnloadCargo[] notifiers; + readonly bool assignTargetOnFirstRun; + readonly bool returnToBase; + readonly int dropInterval; + readonly WDist dropRange; + + Target destination; + int dropDelay; + bool exitParadrop; + bool inDropRange; + + public ParadropCargo(Actor self, int dropInterval, WDist dropRange, bool returnToBase) + : this(self, Target.Invalid, dropInterval, dropRange, returnToBase) + { + assignTargetOnFirstRun = true; + } + + public ParadropCargo(Actor self, in Target destination, int dropInterval, WDist dropRange, bool returnToBase) + { + cargo = self.Trait(); + notifiers = self.TraitsImplementing().ToArray(); + this.destination = destination; + this.dropInterval = dropInterval; + this.dropRange = dropRange; + this.returnToBase = returnToBase; + ChildHasPriority = false; + aircraft = self.Trait(); + attackAircraft = self.Trait(); + } + + protected override void OnFirstRun(Actor self) + { + if (assignTargetOnFirstRun) + destination = Target.FromCell(self.World, self.Location); + + QueueChild(new FlyForward(self, -1)); + } + + public override bool Tick(Actor self) + { + TickChild(self); + + if (dropDelay > 0) + { + dropDelay--; + return false; + } + + if (IsCanceling) + return true; + + var wasInDropRange = inDropRange; + inDropRange = destination.IsInRange(self.CenterPosition, dropRange); + + // We have troops, we are not near the DZ & the troops can't get out; Turn around + if (!cargo.IsEmpty() && !inDropRange && !cargo.CanUnload()) + { + var pos = self.CenterPosition; + var delta = attackAircraft.GetTargetPosition(pos, destination) - pos; + var desiredFacing = delta.HorizontalLengthSquared != 0 ? delta.Yaw : aircraft.Facing; + aircraft.Facing = Util.TickFacing(aircraft.Facing, desiredFacing, aircraft.TurnSpeed); + } + + // Empty; lets go home + if (cargo.IsEmpty()) + { + if (exitParadrop) + return ChildActivity == null; + + ChildActivity?.Cancel(self); + + if (returnToBase) + { + QueueChild(new ReturnToBase(self)); + } + else + { + QueueChild(new FlyIdle(self)); + } + + exitParadrop = true; + } + + // Else; everybody out + if (cargo.CanUnload()) + { + foreach (var inu in notifiers) + inu.Unloading(self); + + var spawn = self.CenterPosition; + var dropActor = cargo.Peek(); + var dropCell = self.Location; + var dropPositionable = dropActor.Trait(); + var dropSubCell = dropPositionable.GetAvailableSubCell(dropCell); + + cargo.Unload(self); + self.World.AddFrameEndTask(w => + { + if (dropActor.Disposed) + return; + + dropPositionable.SetPosition(dropActor, dropCell, dropSubCell); + + var dropPosition = dropActor.CenterPosition + new WVec(0, 0, self.CenterPosition.Z - dropActor.CenterPosition.Z); + dropPositionable.SetPosition(dropActor, dropPosition); + w.Add(dropActor); + }); + Game.Sound.Play(SoundType.World, self.Info.TraitInfo().ChuteSound, spawn); + dropDelay = dropInterval; + } + + return false; + } + } +} diff --git a/OpenRA.Mods.CA/Activities/ProductionAirdropDeliver.cs b/OpenRA.Mods.CA/Activities/ProductionAirdropDeliver.cs new file mode 100644 index 0000000000..f36108d8b5 --- /dev/null +++ b/OpenRA.Mods.CA/Activities/ProductionAirdropDeliver.cs @@ -0,0 +1,158 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using OpenRA.Activities; +using OpenRA.Mods.Common.Activities; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Activities +{ + /// + /// A simplified landing activity for production airdrop delivery. + /// Instead of fully landing (0 altitude), descends to altitude 1, + /// avoiding blocking actor checks since the aircraft never touches the ground. + /// + public class ProductionAirdropDeliver : Activity + { + readonly Aircraft aircraft; + readonly WVec offset; + readonly WAngle? desiredFacing; + readonly Color? targetLineColor; + + readonly Target target; + WPos targetPosition; + bool approachComplete; + + /// + /// Minimum altitude to descend to (1 unit above ground). + /// + static readonly WDist DeliverAltitude = new(1); + + public ProductionAirdropDeliver(Actor self, in Target target, WVec offset, WAngle? facing = null, Color? targetLineColor = null) + { + aircraft = self.Trait(); + this.target = target; + this.offset = offset; + this.targetLineColor = targetLineColor; + desiredFacing = facing; + } + + public override bool Tick(Actor self) + { + if (IsCanceling || target.Type == TargetType.Invalid) + return true; + + var pos = aircraft.GetPosition(); + + // Reevaluate target position in case the target has moved. + targetPosition = target.CenterPosition + offset; + + // Move towards target position + if (aircraft.Info.VTOL) + { + if ((pos - targetPosition).HorizontalLengthSquared != 0) + { + QueueChild(new Fly(self, Target.FromPos(targetPosition))); + return false; + } + + if (desiredFacing.HasValue && desiredFacing.Value != aircraft.Facing) + { + QueueChild(new Turn(self, desiredFacing.Value)); + return false; + } + + // Descend to delivery altitude (1 unit above ground) + var deliverAltitude = self.World.Map.DistanceAboveTerrain(targetPosition) + DeliverAltitude; + if (Fly.VerticalTakeOffOrLandTick(self, aircraft, aircraft.Facing, deliverAltitude)) + return false; + + return true; + } + + // Non-VTOL aircraft approach + if (!approachComplete) + { + // Calculate approach trajectory + var altitude = aircraft.Info.CruiseAltitude.Length; + + // Distance required for descent. + var landDistance = altitude * 1024 / aircraft.Info.MaximumPitch.Tan(); + + // Approach from the opposite direction of the desired facing + var rotation = WRot.None; + if (desiredFacing.HasValue) + rotation = WRot.FromYaw(desiredFacing.Value); + + var approachStart = targetPosition + new WVec(0, landDistance, altitude).Rotate(rotation); + + var speed = aircraft.MovementSpeed * 32 / 35; + var turnRadius = Fly.CalculateTurnRadius(speed, aircraft.TurnSpeed); + + var angle = aircraft.Facing; + var fwd = -new WVec(angle.Sin(), angle.Cos(), 0); + + var side = new WVec(-fwd.Y, fwd.X, fwd.Z); + var approachDelta = self.CenterPosition - approachStart; + var sideTowardBase = new[] { side, -side } + .MinBy(a => WVec.Dot(a, approachDelta)); + + var cp = self.CenterPosition + turnRadius * sideTowardBase / 1024; + var posCenter = new WPos(cp.X, cp.Y, altitude); + var approachCenter = approachStart + new WVec(0, turnRadius * System.Math.Sign(self.CenterPosition.Y - approachStart.Y), 0); + var tangentDirection = approachCenter - posCenter; + var tangentLength = tangentDirection.Length; + var tangentOffset = WVec.Zero; + if (tangentLength != 0) + tangentOffset = new WVec(-tangentDirection.Y, tangentDirection.X, 0) * turnRadius / tangentLength; + + if (tangentOffset.X > 0) + tangentOffset = -tangentOffset; + + var w1 = posCenter + tangentOffset; + var w2 = approachCenter + tangentOffset; + var w3 = approachStart; + + turnRadius = Fly.CalculateTurnRadius(aircraft.Info.Speed, aircraft.TurnSpeed); + + QueueChild(new Fly(self, Target.FromPos(w1), WDist.Zero, new WDist(turnRadius * 3))); + QueueChild(new Fly(self, Target.FromPos(w2))); + QueueChild(new Fly(self, Target.FromPos(w3), WDist.Zero, new WDist(turnRadius / 2))); + approachComplete = true; + return false; + } + + var d = targetPosition - pos; + + // The next move would overshoot, so just set the final position + var move = aircraft.FlyStep(aircraft.Facing); + if (d.HorizontalLengthSquared < move.HorizontalLengthSquared) + { + var deliverAltVec = new WVec(WDist.Zero, WDist.Zero, DeliverAltitude); + aircraft.SetPosition(self, targetPosition + deliverAltVec); + return true; + } + + var deliverAlt = self.World.Map.DistanceAboveTerrain(targetPosition) + DeliverAltitude; + Fly.FlyTick(self, aircraft, d.Yaw, deliverAlt); + + return false; + } + + public override IEnumerable TargetLineNodes(Actor self) + { + if (targetLineColor != null) + yield return new TargetLineNode(target, targetLineColor.Value); + } + } +} diff --git a/OpenRA.Mods.CA/Activities/SpawnActor.cs b/OpenRA.Mods.CA/Activities/SpawnActor.cs new file mode 100644 index 0000000000..c16c333051 --- /dev/null +++ b/OpenRA.Mods.CA/Activities/SpawnActor.cs @@ -0,0 +1,189 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Linq; +using System.Collections.Generic; +using OpenRA.Activities; +using OpenRA.Mods.Common; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Activities +{ + public class SpawnActor : Activity + { + readonly CPos targetCell; + readonly WAngle? initFacing; + readonly bool skipMakeAnims; + readonly string[]types; + readonly string[] spawnSounds; + readonly AmmoPool ammoPool; + readonly int range; + readonly bool avoidActors; + readonly WDist maxRange; + readonly bool spawnInShroud; + readonly HashSet allowedTerrainTypes; + readonly Action onActorSpawned; + + public SpawnActor(string[] types, CPos targetCell, WAngle? initFacing, bool skipMakeAnims, string[] spawnSounds, + AmmoPool ammoPool, int range, bool avoidActors, WDist maxRange, bool spawnInShroud, HashSet allowedTerrainTypes, + Action onActorSpawned = null) + { + this.targetCell = targetCell; + this.initFacing = initFacing; + this.skipMakeAnims = skipMakeAnims; + this.types = types; + this.spawnSounds = spawnSounds; + this.ammoPool = ammoPool; + this.range = range; + this.avoidActors = avoidActors; + this.maxRange = maxRange; + this.spawnInShroud = spawnInShroud; + this.allowedTerrainTypes = allowedTerrainTypes; + this.onActorSpawned = onActorSpawned; + + IsInterruptible = false; + } + + public override bool Tick(Actor self) + { + if (IsCanceling) + return true; + + Spawn(self); + return true; + } + + void Spawn(Actor self) + { + var map = self.World.Map; + var targetCells = map.FindTilesInCircle(targetCell, range); + var cell = targetCells.GetEnumerator(); + var soundPlayed = false; + + foreach (var type in types) + { + var actorType = type.ToLowerInvariant(); + var ai = map.Rules.Actors[actorType]; + var td = CreateTypeDictionary(self, targetCell); + var placed = false; + + self.World.AddFrameEndTask(w => + { + Actor unit = null; + cell = targetCells.GetEnumerator(); + + if (!ai.HasTraitInfo()) + { + if (avoidActors) + { + while (cell.MoveNext() && !placed) + { + if (!IsValidTargetCell(cell.Current, self)) + continue; + + var actorsInCell = self.World.ActorMap.GetActorsAt(cell.Current); + + if (actorsInCell.Any()) + continue; + + placed = true; + td = CreateTypeDictionary(self, cell.Current); + } + } + else + placed = true; + + if (placed) + unit = self.World.CreateActor(type, td); + } + else + { + unit = self.World.CreateActor(false, actorType, td); + var positionable = unit.TraitOrDefault(); + + while (cell.MoveNext() && !placed) + { + var subCell = positionable.GetAvailableSubCell(cell.Current); + + if (ai.HasTraitInfo() + && ai.TraitInfo().CanEnterCell(self.World, unit, cell.Current, SubCell.FullCell, null, BlockedByActor.None)) + subCell = SubCell.FullCell; + + if (!IsValidTargetCell(cell.Current, self)) + continue; + + if (subCell != SubCell.Invalid) + { + positionable.SetPosition(unit, cell.Current, subCell); + + var pos = unit.CenterPosition; + + positionable.SetCenterPosition(unit, pos); + w.Add(unit); + + unit.QueueActivity(new FallDown(unit, pos, 130)); + + placed = true; + } + } + + if (!placed) + unit.Dispose(); + } + + if (placed && unit != null) + { + if (ammoPool != null) + ammoPool.TakeAmmo(self, 1); + + if (!soundPlayed && spawnSounds.Length > 0) + { + Game.Sound.Play(SoundType.World, spawnSounds, self.World, unit.CenterPosition); + soundPlayed = true; + } + + onActorSpawned?.Invoke(self, unit); + } + }); + } + } + + bool IsValidTargetCell(CPos cell, Actor self) + { + var targetPos = self.World.Map.CenterOfCell(cell); + var sourcePos = self.CenterPosition; + + return ((maxRange == WDist.Zero || (targetPos - sourcePos).Length <= maxRange.Length) + && (spawnInShroud || self.Owner.Shroud.IsExplored(cell)) + && (allowedTerrainTypes.Count == 0 || allowedTerrainTypes.Contains(self.World.Map.GetTerrainInfo(cell).Type))); + } + + TypeDictionary CreateTypeDictionary(Actor self, CPos targetCell) + { + var td = new TypeDictionary + { + new FactionInit(self.Owner.Faction.InternalName), + new OwnerInit(self.Owner), + new LocationInit(targetCell) + }; + + if (initFacing.HasValue) + td.Add(new FacingInit(initFacing.Value)); + + if (skipMakeAnims) + td.Add(new SkipMakeAnimsInit()); + + return td; + } + } +} diff --git a/OpenRA.Mods.CA/Activities/TargetedLeap.cs b/OpenRA.Mods.CA/Activities/TargetedLeap.cs new file mode 100644 index 0000000000..37bcceeaaf --- /dev/null +++ b/OpenRA.Mods.CA/Activities/TargetedLeap.cs @@ -0,0 +1,181 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Linq; +using OpenRA.Activities; +using OpenRA.Mods.CA.Traits; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Activities +{ + public class TargetedLeap : Activity + { + readonly TargetedLeapAbility ability; + readonly Mobile mobile; + readonly int speed; + readonly CPos targetCell; // original target + + WPos originPos; + CPos destinationCell; // actual target + WPos destinationPos; + SubCell destinationSubCell = SubCell.Any; + + int length; + bool jumpComplete = false; + int ticks = 0; + IFacing facing; + WAngle angle; + int delayTicks; + string[] takeOffSounds; + string[] landingSounds; + string condition; + bool jumpStarted = false; + bool canceling = false; + int token = Actor.InvalidConditionToken; + + public TargetedLeap(Actor self, CPos targetCell, TargetedLeapAbility ability, Mobile mobile, IFacing facing, WAngle angle) + { + this.ability = ability; + this.mobile = mobile; + speed = ability.Info.Speed; + this.targetCell = destinationCell = targetCell; + this.facing = facing; + this.angle = angle; + takeOffSounds = ability.Info.TakeOffSounds; + landingSounds = ability.Info.LandingSounds; + condition = ability.Info.LeapCondition; + delayTicks = self.World.SharedRandom.Next(0, 15); + } + + protected override void OnFirstRun(Actor self) + { + if (!ability.CanPerformMovement) + { + canceling = true; + return; + } + + originPos = self.CenterPosition; + + var cell = ChooseBestDestinationCell(self, targetCell); + if (cell.HasValue) + { + destinationCell = cell.Value; + } + else + { + canceling = true; + return; + } + + var subCell = mobile.GetAvailableSubCell(destinationCell); + if (subCell != SubCell.Invalid) + { + destinationSubCell = subCell; + } + else + { + canceling = true; + return; + } + + destinationPos = self.World.Map.CenterOfSubCell(destinationCell, destinationSubCell); + length = Math.Max((originPos - destinationPos).Length / speed, 1); + + if (facing != null) + facing.Facing = (destinationPos - originPos).Yaw; + + mobile.SetLocation(destinationCell, destinationSubCell, destinationCell, destinationSubCell); + + IsInterruptible = false; + } + + public override bool Tick(Actor self) + { + // Correct the visual position after we jumped + if (jumpComplete || canceling) + { + if (token != Actor.InvalidConditionToken) + token = self.RevokeCondition(token); + + return true; + } + + if (--delayTicks > 0) + return false; + + if (!jumpStarted) + { + if (takeOffSounds != null && takeOffSounds.Length > 0) + Game.Sound.Play(SoundType.World, takeOffSounds, self.World, self.CenterPosition); + + if (token == Actor.InvalidConditionToken && condition != null) + token = self.GrantCondition(condition); + + jumpStarted = true; + ability.ConsumeCharge(); + } + + var position = length > 1 ? WPos.LerpQuadratic(originPos, destinationPos, angle, ticks, length - 1) : destinationPos; + mobile.SetCenterPosition(self, position); + + // We are at the destination + if (++ticks >= length) + { + // Update movement which results in movementType set to MovementType.None. + // This is needed to prevent the move animation from playing. + mobile.UpdateMovement(); + + if (landingSounds != null && landingSounds.Length > 0) + Game.Sound.Play(SoundType.World, landingSounds, self.World, self.CenterPosition); + + jumpComplete = true; + QueueChild(mobile.LocalMove(self, position, self.World.Map.CenterOfSubCell(destinationCell, destinationSubCell))); + } + + return false; + } + + public override IEnumerable GetTargets(Actor self) + { + yield return Target.FromPos(ticks < length / 2 ? originPos : destinationPos); + } + + CPos? ChooseBestDestinationCell(Actor self, CPos destination) + { + var maxDistance = ability.Info.MaxDistance; + var restrictTo = self.World.Map.FindTilesInCircle(self.Location, maxDistance).ToList(); + var pos = self.Trait(); + + // Check if the original destination is within MaxDistance and is valid + if ((destination - self.Location).LengthSquared <= maxDistance * maxDistance && + restrictTo.Contains(destination) && + pos.CanEnterCell(destination) && + self.Owner.Shroud.IsExplored(destination)) + { + return destination; + } + + // Find the closest valid cell within MaxDistance + var closestValidCell = restrictTo + .Where(tile => pos.CanEnterCell(tile) && self.Owner.Shroud.IsExplored(tile)) + .OrderBy(tile => (tile - destination).LengthSquared) + .FirstOrDefault(); + + if (closestValidCell != default) + return closestValidCell; + + return null; + } + } +} diff --git a/OpenRA.Mods.CA/Activities/TeleportCA.cs b/OpenRA.Mods.CA/Activities/TeleportCA.cs index aebcf11bf9..1331e4b9f2 100644 --- a/OpenRA.Mods.CA/Activities/TeleportCA.cs +++ b/OpenRA.Mods.CA/Activities/TeleportCA.cs @@ -1,11 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2007-2018 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -21,6 +20,7 @@ namespace OpenRA.Mods.CA.Activities { + [Desc("Same as Teleport but can be made to require an empty destination.")] public class TeleportCA : Activity { readonly Actor teleporter; @@ -28,17 +28,24 @@ public class TeleportCA : Activity readonly bool killOnFailure; readonly BitSet killDamageTypes; CPos destination; - bool killCargo; - bool screenFlash; - string sound; + readonly bool killCargo; + readonly bool screenFlash; + readonly string sound; + readonly bool requireEmptyDestination; + int delayRemaining; + readonly Func calculatePreChargeTicks; + readonly Action onPreChargeStart; + readonly Action onPreChargeComplete; public TeleportCA(Actor teleporter, CPos destination, int? maximumDistance, bool killCargo, bool screenFlash, string sound, bool interruptable = true, - bool killOnFailure = false, BitSet killDamageTypes = default(BitSet)) + bool killOnFailure = false, BitSet killDamageTypes = default, + bool requireEmptyDestination = false, Func calculatePreChargeTicks = null, + Action onPreChargeStart = null, Action onPreChargeComplete = null) { var max = teleporter.World.Map.Grid.MaximumTileSearchRange; if (maximumDistance > max) - throw new InvalidOperationException("Teleport distance cannot exceed the value of MaximumTileSearchRange ({0}).".F(max)); + throw new InvalidOperationException($"Teleport distance cannot exceed the value of MaximumTileSearchRange ({max})."); this.teleporter = teleporter; this.destination = destination; @@ -48,13 +55,28 @@ public TeleportCA(Actor teleporter, CPos destination, int? maximumDistance, this.sound = sound; this.killOnFailure = killOnFailure; this.killDamageTypes = killDamageTypes; + this.requireEmptyDestination = requireEmptyDestination; + this.calculatePreChargeTicks = calculatePreChargeTicks; + this.onPreChargeStart = onPreChargeStart; + this.onPreChargeComplete = onPreChargeComplete; if (!interruptable) IsInterruptible = false; } + protected override void OnFirstRun(Actor self) + { + delayRemaining = calculatePreChargeTicks?.Invoke(self, destination) ?? 0; + onPreChargeStart?.Invoke(self, delayRemaining); + } + public override bool Tick(Actor self) { + if (delayRemaining-- > 0) + return false; + else + onPreChargeComplete?.Invoke(self); + var pc = self.TraitOrDefault(); if (teleporter == self && pc != null && !pc.CanTeleport) { @@ -78,7 +100,15 @@ public override bool Tick(Actor self) Game.Sound.Play(SoundType.World, sound, self.CenterPosition); Game.Sound.Play(SoundType.World, sound, self.World.Map.CenterOfCell(destination)); - self.Trait().SetPosition(self, destination); + var positionable = self.Trait(); + var aircraft = self.TraitOrDefault(); + + var subCell = positionable.GetAvailableSubCell(destination); + if (subCell != SubCell.Invalid) + positionable.SetPosition(self, destination, subCell); + else if (aircraft != null) + positionable.SetPosition(self, destination); + self.Generation++; if (killCargo) @@ -86,7 +116,7 @@ public override bool Tick(Actor self) var cargo = self.TraitOrDefault(); if (cargo != null && teleporter != null) { - while (!cargo.IsEmpty(self)) + while (!cargo.IsEmpty()) { var a = cargo.Unload(self); @@ -100,13 +130,13 @@ public override bool Tick(Actor self) // Consume teleport charges if this wasn't triggered via chronosphere if (teleporter == self && pc != null) { - pc.ResetChargeTime(); + pc.ConsumeCharge(); pc.GrantCondition(self); } // Trigger screen desaturate effect if (screenFlash) - foreach (var a in self.World.ActorsWithTrait()) + foreach (var a in self.World.ActorsWithTrait()) a.Trait.Enable(); if (teleporter != null && self != teleporter && !teleporter.Disposed) @@ -130,7 +160,9 @@ public override bool Tick(Actor self) destination = restrictTo.MinBy(x => (x - destination).LengthSquared); var pos = self.Trait(); - if (pos.CanEnterCell(destination) && teleporter.Owner.Shroud.IsExplored(destination)) + if (pos.CanEnterCell(destination) + && teleporter.Owner.Shroud.IsExplored(destination) + && (!requireEmptyDestination || !self.World.ActorMap.GetActorsAt(destination).Any())) return destination; var max = maximumDistance != null ? maximumDistance.Value : teleporter.World.Map.Grid.MaximumTileSearchRange; @@ -138,7 +170,8 @@ public override bool Tick(Actor self) { if (teleporter.Owner.Shroud.IsExplored(tile) && (restrictTo == null || (restrictTo != null && restrictTo.Contains(tile))) - && pos.CanEnterCell(tile)) + && pos.CanEnterCell(tile) + && (!requireEmptyDestination || !self.World.ActorMap.GetActorsAt(tile).Any())) return tile; } diff --git a/OpenRA.Mods.CA/Activities/Upgrade.cs b/OpenRA.Mods.CA/Activities/Upgrade.cs new file mode 100644 index 0000000000..05a82fd9d9 --- /dev/null +++ b/OpenRA.Mods.CA/Activities/Upgrade.cs @@ -0,0 +1,262 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Linq; +using OpenRA.Activities; +using OpenRA.Mods.CA.Traits; +using OpenRA.Mods.Common.Activities; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Activities +{ + [Desc("Activity whereby an actor searches for a location it can upgrade,", + "moves to that location, and receives the upgrade.")] + public class Upgrade : Activity + { + readonly PlayerResources playerResources; + readonly Upgradeable upgradeable; + + int upgradeTicksRemaining; + int upgradeCostRemaining; + int upgradingConditionToken; + + Target host; + INotifyResupply[] notifyResupplies; + IMove move; + IMoveInfo moveInfo; + readonly Color targetLineColor; + Action updateTicksRemaining; + + bool upgradeInProgress = false; + + public Upgrade(Actor self, in Target target, Upgradeable upgradeable, PlayerResources playerResources, Action updateTicksRemaining, Color? targetLineColor) + { + host = target; + this.upgradeable = upgradeable; + this.playerResources = playerResources; + this.updateTicksRemaining = updateTicksRemaining; + upgradeTicksRemaining = upgradeable.UpgradeInfo.BuildDuration; + upgradeCostRemaining = upgradeable.UpgradeInfo.Cost; + upgradingConditionToken = Actor.InvalidConditionToken; + move = self.TraitOrDefault(); + moveInfo = self.Info.TraitInfoOrDefault(); + this.targetLineColor = targetLineColor ?? moveInfo.GetTargetLineColor(); + } + + protected override void OnFirstRun(Actor self) + { + // Host might be self if order issued via hotkey or upgrade button + var hostActor = host.Type != TargetType.Actor || host.Actor == self ? FindNearestHost(self) : host.Actor; + + if (hostActor != null) + { + host = Target.FromActor(hostActor); + notifyResupplies = host.Actor.TraitsImplementing().ToArray(); + } + else + notifyResupplies = Array.Empty(); + } + + /* Return true to complete. */ + public override bool Tick(Actor self) + { + if (IsCanceling || !upgradeable.CanUpgrade) + { + CancelUpgrade(self); + return true; + } + + updateTicksRemaining(upgradeTicksRemaining); + var isHostInvalid = upgradeable.Info.UpgradeAtActors.Any() && (host.Actor == null || host.Type != TargetType.Actor || !host.Actor.IsInWorld || host.Actor == self); + + if (isHostInvalid) + { + CancelUpgrade(self); + // This ensures transports are also cancelled when the host becomes invalid + Cancel(self, true); + return true; + } + + bool isCloseEnough; + + // Negative means there's no distance limit. + // If RepairableNear, use TargetablePositions instead of CenterPosition + // to ensure the actor moves close enough to the host. + // Otherwise check against host CenterPosition. + if (upgradeable.Info.UpgradeAtRange < WDist.Zero) + isCloseEnough = true; + else + isCloseEnough = (host.CenterPosition - self.CenterPosition).HorizontalLengthSquared <= upgradeable.Info.UpgradeAtRange.LengthSquared; + + if (!isCloseEnough) + { + if (move == null) + return true; + + QueueChild(move.MoveWithinRange(host, upgradeable.Info.UpgradeAtRange - WDist.FromCells(1), targetLineColor: targetLineColor)); + return false; + } + + UpgradeInProgressTick(self); + + if (!upgradeInProgress) + return true; + + return false; + } + + Actor FindNearestHost(Actor self) + { + if (!upgradeable.Info.UpgradeAtActors.Any()) + return null; + + var upgradeAtActor = upgradeable.GetValidHosts() + .OrderBy(a => a.Owner == self.Owner ? 0 : 1) + .ThenBy(p => (self.Location - p.Location).LengthSquared); + + return upgradeAtActor.FirstOrDefault(); + } + + void UpgradeInProgressTick(Actor self) + { + if (!upgradeInProgress) + { + upgradeInProgress = true; + + if (!string.IsNullOrEmpty(upgradeable.Info.UpgradingCondition) && upgradingConditionToken == Actor.InvalidConditionToken) + upgradingConditionToken = self.GrantCondition(upgradeable.Info.UpgradingCondition); + + upgradeable.UpdateManager(); + } + + var expectedRemainingCost = upgradeTicksRemaining == 1 ? 0 : upgradeable.UpgradeInfo.Cost * upgradeTicksRemaining / Math.Max(1, upgradeable.UpgradeInfo.BuildDuration); + var costThisFrame = upgradeCostRemaining - expectedRemainingCost; + + if (costThisFrame > 0) + { + /* Insufficient funds. */ + if (!playerResources.TakeCash(costThisFrame, true)) + return; + + upgradeCostRemaining -= costThisFrame; + } + else if (costThisFrame < 0) + { + playerResources.GiveCash(-costThisFrame); + upgradeCostRemaining -= costThisFrame; + } + + foreach (var notifyResupply in notifyResupplies) + notifyResupply.ResupplyTick(host.Actor, self, ResupplyType.Rearm); + + if (--upgradeTicksRemaining > 0) + return; + + ApplyUpgrade(self); + } + + void ApplyUpgrade(Actor self) + { + if (self.IsDead || !self.IsInWorld) + return; + + var faction = self.Owner.Faction.InternalName; + + var cargo = self.TraitOrDefault(); + if (cargo != null && !cargo.IsEmpty()) + { + if (cargo.CanUnload()) + QueueChild(new UnloadCargo(self, cargo.Info.LoadRange)); + else + { + CancelUpgrade(self); + return; + } + } + + if (upgradeable.Info.Actor != null) + Transform(self, faction); + else if (upgradeable.Info.Condition != null) + { + self.GrantCondition(upgradeable.Info.Condition); + CompleteUpgrade(self, faction); + } + } + + void Transform(Actor self, string faction) + { + var transform = new InstantTransform(self, upgradeable.Info.Actor) + { + ForceHealthPercentage = 0, + Faction = faction, + OnComplete = (Actor a) => { CompleteUpgrade(self, faction); }, + SkipMakeAnims = upgradeable.Info.SkipMakeAnims + }; + QueueChild(transform); + } + + void CompleteUpgrade(Actor self, string faction) + { + if (self.IsDead || !self.IsInWorld) + return; + + upgradeInProgress = false; + upgradeable.Complete(); + + if (upgradingConditionToken != Actor.InvalidConditionToken) + upgradingConditionToken = self.RevokeCondition(upgradingConditionToken); + + if (upgradeable.Info.UpgradeCompleteSpeechNotification != null) + Game.Sound.PlayNotification(self.World.Map.Rules, self.Owner, "Speech", upgradeable.Info.UpgradeCompleteSpeechNotification, faction); + + Cancel(self, true); + } + + void CancelUpgrade(Actor self) + { + if (!upgradeInProgress) + return; + + if (upgradeTicksRemaining > 0) + playerResources.GiveCash(upgradeable.UpgradeInfo.Cost - upgradeCostRemaining); + + upgradeTicksRemaining = upgradeable.UpgradeInfo.BuildDuration; + upgradeCostRemaining = upgradeable.UpgradeInfo.Cost; + upgradeInProgress = false; + upgradeable.UpdateManager(); + + if (upgradingConditionToken != Actor.InvalidConditionToken) + upgradingConditionToken = self.RevokeCondition(upgradingConditionToken); + } + + public override IEnumerable TargetLineNodes(Actor self) + { + if (ChildActivity == null) + { + yield return new TargetLineNode(host, targetLineColor); + } + else + { + var current = ChildActivity; + while (current != null) + { + foreach (var n in current.TargetLineNodes(self)) + yield return n; + + current = current.NextActivity; + } + } + } + } +} diff --git a/OpenRA.Mods.CA/Effects/Countdown.cs b/OpenRA.Mods.CA/Effects/Countdown.cs new file mode 100644 index 0000000000..ea2b2a01d3 --- /dev/null +++ b/OpenRA.Mods.CA/Effects/Countdown.cs @@ -0,0 +1,41 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using OpenRA.Effects; +using OpenRA.Graphics; + +namespace OpenRA.Mods.CA.Effects +{ + class Countdown : IEffect + { + readonly int ticks; + int ticksRemaining; + + public int TicksRemaining => ticksRemaining; + public int Ticks => ticks; + + public Countdown(int ticks) + { + this.ticks = ticksRemaining = ticks; + } + + public void Tick(World world) + { + if (--ticksRemaining <= 0) + world.AddFrameEndTask(w => w.Remove(this)); + } + + public IEnumerable Render(WorldRenderer wr) + { + yield break; + } + } +} diff --git a/OpenRA.Mods.CA/Effects/GPSRadarDotEffect.cs b/OpenRA.Mods.CA/Effects/GPSRadarDotEffect.cs index dc8a99bb57..a5ca7e7274 100644 --- a/OpenRA.Mods.CA/Effects/GPSRadarDotEffect.cs +++ b/OpenRA.Mods.CA/Effects/GPSRadarDotEffect.cs @@ -1,10 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -13,7 +13,6 @@ using OpenRA.Effects; using OpenRA.Graphics; using OpenRA.Mods.CA.Traits; -using OpenRA.Primitives; using OpenRA.Traits; namespace OpenRA.Mods.CA.Effects @@ -24,10 +23,13 @@ class GpsRadarDotEffect : IEffect, IEffectAnnotation readonly GpsRadarDot trait; readonly Animation anim; - readonly PlayerDictionary dotStates; + readonly DotState dotState; readonly IDefaultVisibility visibility; readonly IVisibilityModifier[] visibilityModifiers; + readonly int ticksBetweenRenderChecks = 5; + int ticksUntilRenderCheck = 0; + class DotState { public readonly GpsRadarWatcher Watcher; @@ -50,9 +52,11 @@ public GpsRadarDotEffect(Actor actor, GpsRadarDot trait) visibility = actor.Trait(); visibilityModifiers = actor.TraitsImplementing().ToArray(); + ticksUntilRenderCheck = ticksBetweenRenderChecks; - dotStates = new PlayerDictionary(actor.World, - p => new DotState(actor, p.PlayerActor.Trait(), p.FrozenActorLayer)); + var renderPlayer = actor.World.RenderPlayer; + if (renderPlayer != null) + dotState = new DotState(actor, renderPlayer.PlayerActor.Trait(), renderPlayer.FrozenActorLayer); } bool ShouldRender(DotState state, Player toPlayer) @@ -88,11 +92,14 @@ bool ShouldRender(DotState state, Player toPlayer) void IEffect.Tick(World world) { - for (var playerIndex = 0; playerIndex < dotStates.Count; playerIndex++) - { - var state = dotStates[playerIndex]; - state.Visible = ShouldRender(state, world.Players[playerIndex]); - } + // PERF: delay between checking if icon should be rendered + if (--ticksUntilRenderCheck > 0) + return; + + if (dotState != null && world.RenderPlayer != null) + dotState.Visible = ShouldRender(dotState, world.RenderPlayer); + + ticksUntilRenderCheck = ticksBetweenRenderChecks; } IEnumerable IEffect.Render(WorldRenderer wr) @@ -102,7 +109,7 @@ IEnumerable IEffect.Render(WorldRenderer wr) IEnumerable IEffectAnnotation.RenderAnnotation(WorldRenderer wr) { - if (actor.World.RenderPlayer == null || !dotStates[actor.World.RenderPlayer].Visible) + if (actor.World.RenderPlayer == null || dotState == null || !dotState.Visible) return SpriteRenderable.None; var effectiveOwner = actor.EffectiveOwner != null && actor.EffectiveOwner.Owner != null ? diff --git a/OpenRA.Mods.CA/Effects/GpsSatelliteCA.cs b/OpenRA.Mods.CA/Effects/GpsSatelliteCA.cs index e9aa76c107..c46218ca98 100644 --- a/OpenRA.Mods.CA/Effects/GpsSatelliteCA.cs +++ b/OpenRA.Mods.CA/Effects/GpsSatelliteCA.cs @@ -1,18 +1,16 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion using System.Collections.Generic; using OpenRA.Effects; using OpenRA.Graphics; -using OpenRA.Mods.CA.Traits; namespace OpenRA.Mods.CA.Effects { @@ -21,16 +19,16 @@ class GpsSatelliteCA : IEffect, ISpatiallyPartitionable readonly Player launcher; readonly Animation anim; readonly string palette; - readonly int revealDelay; + readonly int animationDuration; WPos pos; int tick; - public GpsSatelliteCA(World world, WPos pos, string image, string sequence, string palette, int revealDelay, Player launcher) + public GpsSatelliteCA(World world, WPos pos, string image, string sequence, string palette, int animationDuration, Player launcher) { this.palette = palette; this.pos = pos; this.launcher = launcher; - this.revealDelay = revealDelay; + this.animationDuration = animationDuration; anim = new Animation(world, image); anim.PlayRepeating(sequence); @@ -42,7 +40,7 @@ public void Tick(World world) anim.Tick(); pos += new WVec(0, 0, 427); - if (++tick > revealDelay) + if (++tick > animationDuration) { world.AddFrameEndTask(w => { w.Remove(this); w.ScreenMap.Remove(this); }); } diff --git a/OpenRA.Mods.CA/Effects/LinkedProducerIndicator.cs b/OpenRA.Mods.CA/Effects/LinkedProducerIndicator.cs new file mode 100644 index 0000000000..16e555d041 --- /dev/null +++ b/OpenRA.Mods.CA/Effects/LinkedProducerIndicator.cs @@ -0,0 +1,138 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.Effects; +using OpenRA.Graphics; +using OpenRA.Primitives; +using OpenRA.Mods.Common.Traits; + +namespace OpenRA.Mods.Common.Effects +{ + public class LinkedProducerIndicator : IEffect, IEffectAboveShroud, IEffectAnnotation + { + readonly Actor building; + readonly LinkedProducerTarget lpt; + readonly LinkedProducerSource lps; + + readonly List targetLineNodes = new() { }; + List cachedNodes; + + public LinkedProducerIndicator(Actor building, LinkedProducerTarget lpt) + { + this.building = building; + this.lpt = lpt; + this.lps = null; + UpdateTargetLineNodes(building.World); + } + + public LinkedProducerIndicator(Actor building, LinkedProducerSource lps) + { + this.building = building; + this.lpt = null; + this.lps = lps; + UpdateTargetLineNodes(building.World); + } + + void IEffect.Tick(World world) + { + if (lpt != null) + { + if (cachedNodes == null || !cachedNodes.SequenceEqual(lpt.LinkNodes)) + { + UpdateTargetLineNodes(world); + } + } + else if (lps != null) + { + // For sources, we need to update if the target changes + UpdateTargetLineNodes(world); + } + + if (!building.IsInWorld || building.IsDead) + world.AddFrameEndTask(w => w.Remove(this)); + } + + void UpdateTargetLineNodes(World world) + { + targetLineNodes.Clear(); + + if (lpt != null) + { + // Target mode: show connections to all sources + cachedNodes = new List(lpt.LinkNodes); + + // Add the building position first + targetLineNodes.Add(building.CenterPosition); + + // Add all source positions + foreach (var n in cachedNodes) + targetLineNodes.Add(n); + } + else if (lps != null) + { + // Source mode: show connection to target + targetLineNodes.Add(building.CenterPosition); + + if (lps.HasTarget) + { + targetLineNodes.Add(lps.Target.Actor.CenterPosition); + } + } + } + + IEnumerable IEffect.Render(WorldRenderer wr) { return SpriteRenderable.None; } + + IEnumerable IEffectAboveShroud.RenderAboveShroud(WorldRenderer wr) + { + if (!building.IsInWorld || !building.Owner.IsAlliedWith(building.World.LocalPlayer)) + return SpriteRenderable.None; + + if (!building.World.Selection.Contains(building)) + return SpriteRenderable.None; + + return SpriteRenderable.None; + } + + IEnumerable IEffectAnnotation.RenderAnnotation(WorldRenderer wr) + { + if (Game.Settings.Game.TargetLines == TargetLinesType.Disabled) + return SpriteRenderable.None; + + if (!building.IsInWorld || !building.Owner.IsAlliedWith(building.World.LocalPlayer)) + return SpriteRenderable.None; + + if (!building.World.Selection.Contains(building)) + return SpriteRenderable.None; + + if (targetLineNodes.Count == 0) + return SpriteRenderable.None; + + return RenderInner(); + } + + IEnumerable RenderInner() + { + if (targetLineNodes.Count < 2) + yield break; + + var targetPos = targetLineNodes[0]; // Building position + + // Draw lines from target to each source + foreach (var sourcePos in targetLineNodes.Skip(1)) + { + var targetLine = new[] { targetPos, sourcePos }; + yield return new TargetLineRenderable(targetLine, Color.DarkGreen, 4, 7); + yield return new TargetLineRenderable(targetLine, Color.Lime, 2, 5); + } + } + } +} diff --git a/OpenRA.Mods.CA/Effects/MultiWeaponImpactEffect.cs b/OpenRA.Mods.CA/Effects/MultiWeaponImpactEffect.cs new file mode 100644 index 0000000000..d0572de01d --- /dev/null +++ b/OpenRA.Mods.CA/Effects/MultiWeaponImpactEffect.cs @@ -0,0 +1,77 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.Effects; +using OpenRA.Graphics; +using OpenRA.Mods.CA.Traits; +using OpenRA.Mods.Common; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Effects +{ + class MultiWeaponImpactEffect : IEffect, ISync + { + readonly Actor invoker; + readonly World world; + readonly IMultiWeaponImpactInfo info; + + [Sync] + WPos pos; + int explosionInterval; + List impacts; + + public MultiWeaponImpactEffect(Actor invoker, IMultiWeaponImpactInfo info, WPos pos) + { + world = invoker.World; + this.invoker = invoker; + this.pos = pos; + this.info = info; + + impacts = info.ImpactOffsets.ToList(); + + if (info.RandomImpactSequence) + impacts = impacts.Shuffle(world.SharedRandom).ToList(); + } + + public void Tick(World world) + { + if (impacts.Count == 0) + { + world.AddFrameEndTask(w => { w.Remove(this); w.ScreenMap.Remove(this); }); + return; + } + + if (--explosionInterval < 0) + { + var nextImpactOffset = impacts.First(); + impacts.RemoveAt(0); + + var impactCell = world.Map.CellContaining(pos) + nextImpactOffset; + var impactPos = world.Map.CenterOfCell(impactCell); + impactPos += new WVec(0, 0, pos.Z); + + if (info.RandomOffset != WDist.Zero) + impactPos += new WVec(world.SharedRandom.Next(-info.RandomOffset.Length, info.RandomOffset.Length), world.SharedRandom.Next(-info.RandomOffset.Length, info.RandomOffset.Length), 0); + + var nextInterval = info.Interval != null ? info.Interval.Length == 2 ? world.SharedRandom.Next(info.Interval[0], info.Interval[1]) : info.Interval[0] : info.Weapon.ReloadDelay; + + info.Weapon.Impact(Target.FromPos(impactPos), invoker); + explosionInterval = nextInterval; + } + } + + public IEnumerable Render(WorldRenderer wr) + { + yield break; + } + } +} diff --git a/OpenRA.Mods.CA/Effects/SatelliteLaunchCA.cs b/OpenRA.Mods.CA/Effects/SatelliteLaunchCA.cs index 7b3330a09e..be575f207e 100644 --- a/OpenRA.Mods.CA/Effects/SatelliteLaunchCA.cs +++ b/OpenRA.Mods.CA/Effects/SatelliteLaunchCA.cs @@ -1,11 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -45,7 +44,7 @@ public void Tick(World world) if (++frame == 19) { var palette = info.SatellitePaletteIsPlayerPalette ? info.SatellitePalette + launcher.Owner.InternalName : info.SatellitePalette; - world.AddFrameEndTask(w => w.Add(new GpsSatelliteCA(world, pos, info.SatelliteImage, info.SatelliteSequence, palette, info.RevealDelay, launcher.Owner))); + world.AddFrameEndTask(w => w.Add(new GpsSatelliteCA(world, pos, info.SatelliteImage, info.SatelliteSequence, palette, info.AnimationDuration, launcher.Owner))); } } diff --git a/OpenRA.Mods.CA/Effects/SmokeParticle.cs b/OpenRA.Mods.CA/Effects/SmokeParticle.cs index 863ad2c6f5..b769fd98ce 100644 --- a/OpenRA.Mods.CA/Effects/SmokeParticle.cs +++ b/OpenRA.Mods.CA/Effects/SmokeParticle.cs @@ -1,14 +1,13 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion -using System; using System.Collections.Generic; using OpenRA.Effects; using OpenRA.Graphics; diff --git a/OpenRA.Mods.CA/Graphics/ArcRenderable.cs b/OpenRA.Mods.CA/Graphics/ArcRenderable.cs index 294b130178..1a96195095 100644 --- a/OpenRA.Mods.CA/Graphics/ArcRenderable.cs +++ b/OpenRA.Mods.CA/Graphics/ArcRenderable.cs @@ -1,15 +1,13 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion -using System.Collections.Generic; -using System.Linq; using OpenRA.Graphics; using OpenRA.Primitives; @@ -42,7 +40,7 @@ public ArcRenderable(WPos a, WPos b, int zOffset, WAngle angle, Color color, WDi public IRenderable WithPalette(PaletteReference newPalette) { return new ArcRenderable(a, b, zOffset, angle, color, width, segments); } public IRenderable WithZOffset(int newOffset) { return new ArcRenderable(a, b, zOffset, angle, color, width, segments); } - public IRenderable OffsetBy(WVec vec) { return new ArcRenderable(a + vec, b + vec, zOffset, angle, color, width, segments); } + public IRenderable OffsetBy(in WVec offset) { var offsetBy = offset; return new ArcRenderable(a + offsetBy, b + offsetBy, zOffset, angle, color, width, segments); } public IRenderable AsDecoration() { return this; } public IFinalizedRenderable PrepareRender(WorldRenderer wr) { return this; } diff --git a/OpenRA.Mods.CA/Graphics/CapsuleAnnotationRenderable.cs b/OpenRA.Mods.CA/Graphics/CapsuleAnnotationRenderable.cs new file mode 100644 index 0000000000..e9525f0544 --- /dev/null +++ b/OpenRA.Mods.CA/Graphics/CapsuleAnnotationRenderable.cs @@ -0,0 +1,50 @@ +#region Copyright & License Information +/* + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using OpenRA.Graphics; +using OpenRA.Mods.Common.Graphics; +using OpenRA.Primitives; + +namespace OpenRA.Mods.CA.Graphics +{ + /// + /// Renders a capsule shape using the same pattern as Capsule HitShape: + /// Two circles connected by parallel lines. Much simpler and crash-safe. + /// + public static class CapsuleAnnotationRenderable + { + public static IEnumerable Create(WPos capsuleStart, WPos capsuleEnd, WDist radius, int width, Color color) + { + // Render two circles at the ends + yield return new CircleAnnotationRenderable(capsuleStart, radius, width, color); + yield return new CircleAnnotationRenderable(capsuleEnd, radius, width, color); + + if (capsuleStart != capsuleEnd) + { + // Calculate perpendicular offset for the connecting lines (like Capsule HitShape does) + var capsuleVec = capsuleEnd - capsuleStart; + var perpVec = new WVec(-capsuleVec.Y, capsuleVec.X, 0); + if (perpVec.Length > 0) + { + var radiusVec = perpVec * radius.Length / perpVec.Length; + + var topStart = capsuleStart + radiusVec; + var topEnd = capsuleEnd + radiusVec; + var bottomStart = capsuleStart - radiusVec; + var bottomEnd = capsuleEnd - radiusVec; + + yield return new LineAnnotationRenderable(topStart, topEnd, width, color); + yield return new LineAnnotationRenderable(bottomStart, bottomEnd, width, color); + } + } + } + } +} diff --git a/OpenRA.Mods.CA/Graphics/ElectricBoltRenderable.cs b/OpenRA.Mods.CA/Graphics/ElectricBoltRenderable.cs index 5aa9922cc7..29393c756b 100644 --- a/OpenRA.Mods.CA/Graphics/ElectricBoltRenderable.cs +++ b/OpenRA.Mods.CA/Graphics/ElectricBoltRenderable.cs @@ -1,10 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -36,7 +36,7 @@ public ElectricBoltRenderable(WPos[] offsets, int zOffset, WDist width, Color co public IRenderable WithPalette(PaletteReference newPalette) { return this; } public IRenderable WithZOffset(int newOffset) { return new ElectricBoltRenderable(offsets, newOffset, width, color); } - public IRenderable OffsetBy(WVec vec) { return new ElectricBoltRenderable(offsets.Select(offset => offset + vec).ToArray(), zOffset, width, color); } + public IRenderable OffsetBy(in WVec offset) { var offsetBy = offset; return new ElectricBoltRenderable(offsets.Select(o => o + offsetBy).ToArray(), zOffset, width, color); } public IRenderable AsDecoration() { return this; } public IFinalizedRenderable PrepareRender(WorldRenderer wr) { return this; } diff --git a/OpenRA.Mods.CA/Graphics/KKNDLaserRenderable.cs b/OpenRA.Mods.CA/Graphics/KKNDLaserRenderable.cs index 0ee9d99bcd..c5ac047fc5 100644 --- a/OpenRA.Mods.CA/Graphics/KKNDLaserRenderable.cs +++ b/OpenRA.Mods.CA/Graphics/KKNDLaserRenderable.cs @@ -1,10 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -36,7 +36,7 @@ public KKNDLaserRenderable(WPos[] offsets, int zOffset, WDist width, Color color public IRenderable WithPalette(PaletteReference newPalette) { return this; } public IRenderable WithZOffset(int newOffset) { return new KKNDLaserRenderable(offsets, newOffset, width, color); } - public IRenderable OffsetBy(WVec vec) { return new KKNDLaserRenderable(offsets.Select(offset => offset + vec).ToArray(), zOffset, width, color); } + public IRenderable OffsetBy(in WVec offset) { var offsetBy = offset; return new KKNDLaserRenderable(offsets.Select(o => o + offsetBy).ToArray(), zOffset, width, color); } public IRenderable AsDecoration() { return this; } public IFinalizedRenderable PrepareRender(WorldRenderer wr) { return this; } diff --git a/OpenRA.Mods.CA/Graphics/MindControlArc.cs b/OpenRA.Mods.CA/Graphics/MindControlArc.cs index feced06d95..47310d0c34 100644 --- a/OpenRA.Mods.CA/Graphics/MindControlArc.cs +++ b/OpenRA.Mods.CA/Graphics/MindControlArc.cs @@ -1,24 +1,28 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion -using System; using System.Collections.Generic; +using System.Linq; using OpenRA.Graphics; -using OpenRA.Mods.CA.Graphics; +using OpenRA.Mods.CA.Traits; using OpenRA.Primitives; using OpenRA.Traits; -namespace OpenRA.Mods.CA.Traits +namespace OpenRA.Mods.CA.Graphics { public class WithMindControlArcInfo : TraitInfo { + [FieldLoader.Require] + [Desc("Named type of mind control. Must match that of MindController.")] + public readonly string ControlType = null; + [Desc("Color of the arc")] public readonly Color Color = Color.Red; @@ -57,31 +61,31 @@ public WithMindControlArc(Actor self, WithMindControlArcInfo info) void INotifyCreated.Created(Actor self) { - mindController = self.TraitOrDefault(); - mindControllable = self.TraitOrDefault(); + mindController = self.TraitsImplementing().FirstOrDefault(mc => mc.Info.ControlType == info.ControlType); + mindControllable = self.TraitsImplementing().FirstOrDefault(mc => mc.Info.ControlType == info.ControlType); } void INotifySelected.Selected(Actor a) { } IEnumerable IRenderAboveShroudWhenSelected.RenderAboveShroud(Actor self, WorldRenderer wr) { - var color = Color.FromArgb(info.Transparency, info.UsePlayerColor ? self.Owner.Color : info.Color); + var color = Color.FromArgb(info.Transparency, info.UsePlayerColor ? self.OwnerColor() : info.Color); if (mindController != null) { foreach (var s in mindController.Slaves) yield return new ArcRenderable( self.CenterPosition + info.Offset, - s.CenterPosition + info.Offset, + s.Actor.CenterPosition + info.Offset, info.ZOffset, info.Angle, color, info.Width, info.QuantizedSegments); yield break; } - if (mindControllable == null || mindControllable.Master == null || !mindControllable.Master.IsInWorld) + if (mindControllable == null || mindControllable.Master == null || !mindControllable.Master.Value.Actor.IsInWorld) yield break; yield return new ArcRenderable( - mindControllable.Master.CenterPosition + info.Offset, + mindControllable.Master.Value.Actor.CenterPosition + info.Offset, self.CenterPosition + info.Offset, info.ZOffset, info.Angle, color, info.Width, info.QuantizedSegments); } diff --git a/OpenRA.Mods.CA/Graphics/RadBeamRenderable.cs b/OpenRA.Mods.CA/Graphics/RadBeamRenderable.cs index 20f00e6809..3574bd84a6 100644 --- a/OpenRA.Mods.CA/Graphics/RadBeamRenderable.cs +++ b/OpenRA.Mods.CA/Graphics/RadBeamRenderable.cs @@ -1,10 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -54,7 +54,7 @@ public IRenderable WithPalette(PaletteReference newPalette) public IRenderable WithZOffset(int newOffset) { return new RadBeamRenderable(pos, zOffset, sourceToTarget, width, color, amplitude, wavelength, quantizationCount); } - public IRenderable OffsetBy(WVec vec) { return new RadBeamRenderable(pos + vec, zOffset, sourceToTarget, width, color, amplitude, wavelength, quantizationCount); } + public IRenderable OffsetBy(in WVec offset) { return new RadBeamRenderable(pos + offset, zOffset, sourceToTarget, width, color, amplitude, wavelength, quantizationCount); } public IRenderable AsDecoration() { return this; } @@ -64,6 +64,11 @@ public void Render(WorldRenderer wr) if (sourceToTarget == WVec.Zero) return; + var roll90 = false; + var facing = sourceToTarget.Yaw.Facing; + if (facing < 16 || (facing > 112 && facing < 144) || facing > 240) + roll90 = true; + // WAngle.Sin(x) = 1024 * Math.Sin(2pi/1024 * x) // forward step, pointing from src to target. @@ -84,7 +89,8 @@ public void Render(WorldRenderer wr) var last = wr.Screen3DPosition(pos); // we start from the shooter for (var i = 0; i < cycleCnt * quantizationCount; i++) { - var y = new WVec(0, 0, amplitude.Length * angle.Sin() / 1024); + var y = new WVec(roll90 ? amplitude.Length * angle.Sin() / 1024 : 0, 0, roll90 ? 0 : amplitude.Length * angle.Sin() / 1024); + var end = wr.Screen3DPosition(pos + y); Game.Renderer.WorldRgbaColorRenderer.DrawLine(last, end, screenWidth, color); diff --git a/OpenRA.Mods.CA/Graphics/RailgunHelixRenderableCA.cs b/OpenRA.Mods.CA/Graphics/RailgunHelixRenderableCA.cs new file mode 100644 index 0000000000..c75007e361 --- /dev/null +++ b/OpenRA.Mods.CA/Graphics/RailgunHelixRenderableCA.cs @@ -0,0 +1,83 @@ +#region Copyright & License Information +/* + * Copyright (c) The OpenRA Developers and Contributors + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. For more + * information, see COPYING. + */ +#endregion + +using OpenRA.Graphics; +using OpenRA.Mods.CA.Projectiles; +using OpenRA.Primitives; + +namespace OpenRA.Mods.CA.Graphics +{ + [Desc("Exact copy of base version just replacing Railgun with RailgunCA.")] + public class RailgunHelixRenderableCA : IRenderable, IFinalizedRenderable + { + readonly RailgunCA railgun; + readonly RailgunCAInfo info; + readonly WDist helixRadius; + readonly int alpha; + readonly int ticks; + + WAngle angle; + + public RailgunHelixRenderableCA(WPos pos, int zOffset, RailgunCA railgun, RailgunCAInfo railgunInfo, int ticks) + { + Pos = pos; + ZOffset = zOffset; + this.railgun = railgun; + info = railgunInfo; + this.ticks = ticks; + + helixRadius = info.HelixRadius + new WDist(ticks * info.HelixRadiusDeltaPerTick); + alpha = (railgun.HelixColor.A + ticks * info.HelixAlphaDeltaPerTick).Clamp(0, 255); + angle = new WAngle(ticks * info.HelixAngleDeltaPerTick.Angle); + } + + public WPos Pos { get; } + public int ZOffset { get; } + public bool IsDecoration => true; + + public IRenderable WithZOffset(int newOffset) { return new RailgunHelixRenderableCA(Pos, newOffset, railgun, info, ticks); } + public IRenderable OffsetBy(in WVec vec) { return new RailgunHelixRenderableCA(Pos + vec, ZOffset, railgun, info, ticks); } + public IRenderable AsDecoration() { return this; } + + public IFinalizedRenderable PrepareRender(WorldRenderer wr) { return this; } + public void Render(WorldRenderer wr) + { + if (railgun.ForwardStep == WVec.Zero) + return; + + var screenWidth = wr.ScreenVector(new WVec(info.HelixThickness.Length, 0, 0))[0]; + + // Move forward from self to target to draw helix + var centerPos = Pos; + var points = new float3[railgun.CycleCount * info.QuantizationCount]; + for (var i = points.Length - 1; i >= 0; i--) + { + // Make it narrower near the end. + var rad = i < info.QuantizationCount ? helixRadius / 4 : + i < 2 * info.QuantizationCount ? helixRadius / 2 : + helixRadius; + + // Note: WAngle.Sin(x) = 1024 * Math.Sin(2pi/1024 * x) + var u = rad.Length * angle.Cos() * railgun.LeftVector / (1024 * 1024) + + rad.Length * angle.Sin() * railgun.UpVector / (1024 * 1024); + points[i] = wr.Screen3DPosition(centerPos + u); + + centerPos += railgun.ForwardStep; + angle += railgun.AngleStep; + } + + Game.Renderer.WorldRgbaColorRenderer.DrawLine(points, screenWidth, Color.FromArgb(alpha, railgun.HelixColor)); + } + + public void RenderDebugGeometry(WorldRenderer wr) { } + public Rectangle ScreenBounds(WorldRenderer wr) { return Rectangle.Empty; } + } +} diff --git a/OpenRA.Mods.CA/Graphics/TeslaZapRenderableCA.cs b/OpenRA.Mods.CA/Graphics/TeslaZapRenderableCA.cs new file mode 100644 index 0000000000..7ec76907c0 --- /dev/null +++ b/OpenRA.Mods.CA/Graphics/TeslaZapRenderableCA.cs @@ -0,0 +1,169 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Linq; +using OpenRA.Graphics; +using OpenRA.Primitives; + +namespace OpenRA.Mods.CA.Graphics +{ + [Desc("Exact copy of base version to get around protection level in TelsaZapCA.")] + class TeslaZapRenderableCA : IPalettedRenderable, IFinalizedRenderable + { + static readonly int[][] Steps = new[] + { + new int[] { 8, 8, 4, 4, 0 }, + new int[] { -8, -8, -4, -4, 0 }, + new int[] { 8, 0, 4, 4, 1 }, + new int[] { -8, 0, -4, 4, 1 }, + new int[] { 0, 8, 4, 4, 2 }, + new int[] { 0, -8, 4, -4, 2 }, + new int[] { -8, 8, -4, 4, 3 }, + new int[] { 8, -8, 4, -4, 3 } + }; + + readonly WPos pos; + readonly int zOffset; + readonly WVec length; + readonly string image; + readonly string palette; + readonly string dimSequence; + readonly string brightSequence; + readonly int brightZaps, dimZaps; + + readonly WPos cachedPos; + readonly WVec cachedLength; + IEnumerable cache; + + public TeslaZapRenderableCA(WPos pos, int zOffset, in WVec length, string image, + string brightSequence, int brightZaps, + string dimSequence, int dimZaps, + string palette) + { + this.pos = pos; + this.zOffset = zOffset; + this.length = length; + this.image = image; + this.palette = palette; + this.brightZaps = brightZaps; + this.dimZaps = dimZaps; + this.dimSequence = dimSequence; + this.brightSequence = brightSequence; + + cachedPos = WPos.Zero; + cachedLength = WVec.Zero; + cache = Array.Empty(); + } + + public WPos Pos => pos; + public PaletteReference Palette => null; + public int ZOffset => zOffset; + public bool IsDecoration => true; + + public IPalettedRenderable WithPalette(PaletteReference newPalette) + { + return new TeslaZapRenderableCA(pos, zOffset, length, image, brightSequence, brightZaps, dimSequence, dimZaps, palette); + } + + public IRenderable WithZOffset(int newOffset) => + new TeslaZapRenderableCA(Pos, ZOffset, length, image, brightSequence, brightZaps, dimSequence, dimZaps, palette); + public IRenderable OffsetBy(in WVec vec) => + new TeslaZapRenderableCA(Pos + vec, ZOffset, length, image, brightSequence, brightZaps, dimSequence, dimZaps, palette); + public IRenderable AsDecoration() { return this; } + + public IFinalizedRenderable PrepareRender(WorldRenderer wr) { return this; } + public void RenderDebugGeometry(WorldRenderer wr) { } + public void Render(WorldRenderer wr) + { + if (wr.World.FogObscures(pos) && wr.World.FogObscures(pos + length)) + return; + + if (!cache.Any() || length != cachedLength || pos != cachedPos) + cache = GenerateRenderables(wr); + + foreach (var renderable in cache) + renderable.Render(wr); + } + + public Rectangle ScreenBounds(WorldRenderer wr) { return Rectangle.Empty; } + + public IEnumerable GenerateRenderables(WorldRenderer wr) + { + var bright = wr.World.Map.Sequences.GetSequence(image, brightSequence); + var dim = wr.World.Map.Sequences.GetSequence(image, dimSequence); + + var source = wr.ScreenPosition(pos); + var target = wr.ScreenPosition(pos + length); + + for (var n = 0; n < dimZaps; n++) + foreach (var z in DrawZapWandering(wr, source, target, dim, palette)) + yield return z; + for (var n = 0; n < brightZaps; n++) + foreach (var z in DrawZapWandering(wr, source, target, bright, palette)) + yield return z; + } + + static IEnumerable DrawZapWandering(WorldRenderer wr, float2 from, float2 to, ISpriteSequence s, string pal) + { + var dist = to - from; + var norm = (1f / dist.Length) * new float2(-dist.Y, dist.X); + + var renderables = new List(); + if (Game.CosmeticRandom.Next(2) != 0) + { + var p1 = from + (1 / 3f) * dist + WDist.FromPDF(Game.CosmeticRandom, 2).Length * dist.Length / 4096 * norm; + var p2 = from + (2 / 3f) * dist + WDist.FromPDF(Game.CosmeticRandom, 2).Length * dist.Length / 4096 * norm; + + renderables.AddRange(DrawZap(wr, from, p1, s, out p1, pal)); + renderables.AddRange(DrawZap(wr, p1, p2, s, out p2, pal)); + renderables.AddRange(DrawZap(wr, p2, to, s, out _, pal)); + } + else + { + var p1 = from + (1 / 2f) * dist + WDist.FromPDF(Game.CosmeticRandom, 2).Length * dist.Length / 4096 * norm; + + renderables.AddRange(DrawZap(wr, from, p1, s, out p1, pal)); + renderables.AddRange(DrawZap(wr, p1, to, s, out _, pal)); + } + + return renderables; + } + + static IEnumerable DrawZap(WorldRenderer wr, float2 from, float2 to, ISpriteSequence s, out float2 p, string palette) + { + var dist = to - from; + var q = new float2(-dist.Y, dist.X); + var c = -float2.Dot(from, q); + var rs = new List(); + var z = from; + var pal = wr.Palette(palette); + + while ((to - z).X > 5 || (to - z).X < -5 || (to - z).Y > 5 || (to - z).Y < -5) + { + var step = Steps.Where(t => (to - (z + new float2(t[0], t[1]))).LengthSquared < (to - z).LengthSquared) + .MinBy(t => Math.Abs(float2.Dot(z + new float2(t[0], t[1]), q) + c)); + + var pos = wr.ProjectedPosition((z + new float2(step[2], step[3])).ToInt2()); + var tintModifiers = s.IgnoreWorldTint ? TintModifiers.IgnoreWorldTint : TintModifiers.None; + rs.Add(new SpriteRenderable(s.GetSprite(step[4]), pos, WVec.Zero, 0, pal, 1f, s.GetAlpha(step[4]), float3.Ones, tintModifiers, true).PrepareRender(wr)); + + z += new float2(step[0], step[1]); + if (rs.Count >= 1000) + break; + } + + p = z; + + return rs; + } + } +} diff --git a/OpenRA.Mods.CA/Graphics/TintedCell.cs b/OpenRA.Mods.CA/Graphics/TintedCell.cs index db130a1979..151612644b 100644 --- a/OpenRA.Mods.CA/Graphics/TintedCell.cs +++ b/OpenRA.Mods.CA/Graphics/TintedCell.cs @@ -1,10 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -45,7 +45,7 @@ public TintedCell(TintedCell src) public IRenderable WithPalette(PaletteReference newPalette) { return this; } public IRenderable WithZOffset(int newOffset) { return this; } - public IRenderable OffsetBy(WVec vec) { return this; } + public IRenderable OffsetBy(in WVec vec) { return this; } public IRenderable AsDecoration() { return this; } public PaletteReference Palette { get { return null; } } @@ -63,14 +63,14 @@ public void Render(WorldRenderer wr) if (firstTime) { var map = wr.World.Map; - var tileSet = wr.World.Map.Rules.TileSet; + var terrainInfo = wr.World.Map.Rules.TerrainInfo; var uv = cpos.ToMPos(map); if (!map.Height.Contains(uv)) return; var tile = map.Tiles[uv]; - var ti = tileSet.GetTileInfo(tile); + var ti = terrainInfo.GetTerrainInfo(tile); var ramp = ti != null ? ti.RampType : 0; var corners = map.Grid.Ramps[ramp].Corners; diff --git a/OpenRA.Mods.CA/Graphics/UIModifyableSpriteRenderable.cs b/OpenRA.Mods.CA/Graphics/UIModifyableSpriteRenderable.cs new file mode 100644 index 0000000000..d9cc3ca13c --- /dev/null +++ b/OpenRA.Mods.CA/Graphics/UIModifyableSpriteRenderable.cs @@ -0,0 +1,151 @@ +#region Copyright & License Information +/* + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Graphics; +using OpenRA.Primitives; + +namespace OpenRA.Mods.CA.Graphics +{ + public sealed class UIModifyableSpriteRenderable : IPalettedRenderable, IModifyableRenderable, IFinalizedRenderable + { + readonly Sprite sprite; + readonly int2 screenPos; + readonly float scale; + readonly float rotation; + readonly Size tileSize; + readonly int tileScale; + + public UIModifyableSpriteRenderable( + Sprite sprite, + WPos effectiveWorldPos, + int2 screenPos, + int zOffset, + PaletteReference palette, + float scale, + float alpha, + in float3 tint, + TintModifiers tintModifiers, + bool isDecoration, + float rotation, + Size tileSize, + int tileScale) + { + this.sprite = sprite; + Pos = effectiveWorldPos; + this.screenPos = screenPos; + ZOffset = zOffset; + Palette = palette; + this.scale = scale; + Alpha = alpha; + Tint = tint; + TintModifiers = tintModifiers; + IsDecoration = isDecoration; + this.rotation = rotation; + this.tileSize = tileSize; + this.tileScale = tileScale; + + // PERF: Remove useless palette assignments for RGBA sprites + // HACK: This is working around the fact that palettes are defined on traits rather than sequences + // and can be removed once this has been fixed + if (sprite.Channel == TextureChannel.RGBA && !(palette?.HasColorShift ?? false)) + Palette = null; + } + + public WPos Pos { get; } + public WVec Offset => WVec.Zero; + public bool IsDecoration { get; } + + public PaletteReference Palette { get; } + public int ZOffset { get; } + + public float Alpha { get; } + public float3 Tint { get; } + public TintModifiers TintModifiers { get; } + + public IPalettedRenderable WithPalette(PaletteReference newPalette) + { + return new UIModifyableSpriteRenderable( + sprite, Pos, screenPos, ZOffset, newPalette, scale, + Alpha, Tint, TintModifiers, IsDecoration, rotation, + tileSize, tileScale); + } + + public IRenderable WithZOffset(int newOffset) + { + return new UIModifyableSpriteRenderable( + sprite, Pos, screenPos, newOffset, Palette, scale, + Alpha, Tint, TintModifiers, IsDecoration, rotation, + tileSize, tileScale); + } + + public IRenderable OffsetBy(in WVec vec) + { + // Convert world offset to screen pixel offset. + // This mirrors WorldRenderer.ScreenPxOffset but avoids needing a WorldRenderer reference here. + var dx = (int)System.Math.Round((float)tileSize.Width * vec.X / tileScale); + var dy = (int)System.Math.Round((float)tileSize.Height * (vec.Y - vec.Z) / tileScale); + return new UIModifyableSpriteRenderable( + sprite, Pos + vec, screenPos + new int2(dx, dy), ZOffset, Palette, scale, + Alpha, Tint, TintModifiers, IsDecoration, rotation, + tileSize, tileScale); + } + + public IRenderable AsDecoration() + { + return new UIModifyableSpriteRenderable( + sprite, Pos, screenPos, ZOffset, Palette, scale, + Alpha, Tint, TintModifiers, true, rotation, + tileSize, tileScale); + } + + public IModifyableRenderable WithAlpha(float newAlpha) + { + return new UIModifyableSpriteRenderable( + sprite, Pos, screenPos, ZOffset, Palette, scale, + newAlpha, Tint, TintModifiers, IsDecoration, rotation, + tileSize, tileScale); + } + + public IModifyableRenderable WithTint(in float3 newTint, TintModifiers newTintModifiers) + { + return new UIModifyableSpriteRenderable( + sprite, Pos, screenPos, ZOffset, Palette, scale, + Alpha, newTint, newTintModifiers, IsDecoration, rotation, + tileSize, tileScale); + } + + public IFinalizedRenderable PrepareRender(WorldRenderer wr) { return this; } + + public void Render(WorldRenderer wr) + { + var t = Alpha * Tint; + var a = Alpha; + if ((TintModifiers & TintModifiers.ReplaceColor) != 0) + a *= -1; + + Game.Renderer.SpriteRenderer.DrawSprite(sprite, Palette, screenPos, scale, t, a, rotation); + } + + public void RenderDebugGeometry(WorldRenderer wr) + { + var offset = screenPos + sprite.Offset.XY; + if (rotation == 0f) + Game.Renderer.RgbaColorRenderer.DrawRect(offset, offset + sprite.Size.XY, 1, Color.Red); + else + Game.Renderer.RgbaColorRenderer.DrawPolygon(Util.RotateQuad(offset, sprite.Size, rotation), 1, Color.Red); + } + + public Rectangle ScreenBounds(WorldRenderer wr) + { + var offset = screenPos + sprite.Offset; + return Util.BoundingRectangle(offset, sprite.Size, rotation); + } + } +} diff --git a/OpenRA.Mods.CA/LoadScreens/ImageLoadScreen.cs b/OpenRA.Mods.CA/LoadScreens/ImageLoadScreen.cs index 54eb686918..ac147a0b03 100644 --- a/OpenRA.Mods.CA/LoadScreens/ImageLoadScreen.cs +++ b/OpenRA.Mods.CA/LoadScreens/ImageLoadScreen.cs @@ -1,15 +1,13 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion -using System; using System.Collections.Generic; using OpenRA.Graphics; using OpenRA.Mods.Common.LoadScreens; diff --git a/OpenRA.Mods.CA/OpenRA.Mods.CA.csproj b/OpenRA.Mods.CA/OpenRA.Mods.CA.csproj index 5df7df6bcf..c47003a0f9 100644 --- a/OpenRA.Mods.CA/OpenRA.Mods.CA.csproj +++ b/OpenRA.Mods.CA/OpenRA.Mods.CA.csproj @@ -1,43 +1,17 @@ - net472 - true - true - 7.2 - true - true - ../engine/bin - false - AnyCPU - false - ../engine/OpenRA.ruleset + ../engine + - - - - - DEBUG;TRACE - false - - - + False - + False - + False - - - - - - - - - - + \ No newline at end of file diff --git a/OpenRA.Mods.CA/Orders/ConvertibleOrderTargeter.cs b/OpenRA.Mods.CA/Orders/ConvertibleOrderTargeter.cs index 317420c5d6..9c1da15cc5 100644 --- a/OpenRA.Mods.CA/Orders/ConvertibleOrderTargeter.cs +++ b/OpenRA.Mods.CA/Orders/ConvertibleOrderTargeter.cs @@ -1,17 +1,15 @@ #region Copyright & License Information -/* - * Copyright 2016-2021 The CA Developers (see AUTHORS) - * This file is part of CA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion -using OpenRA.Mods.CA.Traits.UnitConverter; +using OpenRA.Mods.CA.Traits; using OpenRA.Mods.Common.Orders; -using OpenRA.Mods.Common.Traits; using OpenRA.Traits; namespace OpenRA.Mods.CA.Orders @@ -38,9 +36,6 @@ public override bool CanTargetActor(Actor self, Actor target, TargetModifiers mo if (target.Trait().IsTraitDisabled) return false; - if (self.Owner.PlayerActor.Trait().Cash <= 0) - return false; - if (self.Owner != target.Owner) return false; diff --git a/OpenRA.Mods.CA/Orders/MassEnterCargoOrderTargeter.cs b/OpenRA.Mods.CA/Orders/MassEnterCargoOrderTargeter.cs new file mode 100644 index 0000000000..e83f581bd8 --- /dev/null +++ b/OpenRA.Mods.CA/Orders/MassEnterCargoOrderTargeter.cs @@ -0,0 +1,51 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Mods.CA.Traits; +using OpenRA.Mods.Common.Orders; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Orders +{ + class MassEnterCargoOrderTargeter : UnitOrderTargeter + { + public const string Id = "MassEnterCargo"; + + private string cursor; + + public MassEnterCargoOrderTargeter(string cursor) + : base(Id, 6, cursor, false, true) + { + this.cursor = cursor; + } + + public override bool CanTargetActor(Actor self, Actor target, TargetModifiers modifiers, ref string cursor) + { + cursor = null; + + if (!target.Info.HasTraitInfo()) + return false; + + if (target.Trait().IsTraitDisabled) + return false; + + if (self.Owner != target.Owner) + return false; + + cursor = this.cursor; + return true; + } + + public override bool CanTargetFrozenActor(Actor self, FrozenActor target, TargetModifiers modifiers, ref string cursor) + { + return false; + } + } +} diff --git a/OpenRA.Mods.CA/Orders/ReleaseSlaveOrderTargeter.cs b/OpenRA.Mods.CA/Orders/ReleaseSlaveOrderTargeter.cs new file mode 100644 index 0000000000..c49872e73a --- /dev/null +++ b/OpenRA.Mods.CA/Orders/ReleaseSlaveOrderTargeter.cs @@ -0,0 +1,46 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using OpenRA.Mods.CA.Traits; +using OpenRA.Mods.Common.Orders; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Orders +{ + public class ReleaseSlaveOrderTargeter : UnitOrderTargeter + { + readonly string releaseCursor; + readonly Func canTarget; + + public ReleaseSlaveOrderTargeter(string order, int priority, string releaseCursor, + Func canTarget) + : base(order, priority, releaseCursor, false, true) + { + this.releaseCursor = releaseCursor; + this.canTarget = canTarget; + } + + public override bool CanTargetActor(Actor self, Actor target, TargetModifiers modifiers, ref string cursor) + { + if (!self.Owner.IsAlliedWith(target.Owner) || !target.Info.HasTraitInfo() || !canTarget(target, modifiers)) + return false; + + cursor = releaseCursor; + return true; + } + + public override bool CanTargetFrozenActor(Actor self, FrozenActor target, TargetModifiers modifiers, ref string cursor) + { + // Allied actors are never frozen + return false; + } + } +} diff --git a/OpenRA.Mods.CA/Orders/ShootableBallisticMissileMoveOrderTargeter.cs b/OpenRA.Mods.CA/Orders/ShootableBallisticMissileMoveOrderTargeter.cs index ec132448ca..b40228f22e 100644 --- a/OpenRA.Mods.CA/Orders/ShootableBallisticMissileMoveOrderTargeter.cs +++ b/OpenRA.Mods.CA/Orders/ShootableBallisticMissileMoveOrderTargeter.cs @@ -1,17 +1,15 @@ #region Copyright & License Information -/* - * Copyright 2007-2018 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion using System.Collections.Generic; using OpenRA.Mods.CA.Traits; -using OpenRA.Mods.Common.Traits; using OpenRA.Traits; namespace OpenRA.Mods.CA.Orders @@ -25,13 +23,13 @@ public bool TargetOverridesSelection(Actor self, in Target target, List a return modifiers.HasModifier(TargetModifiers.ForceMove); } - public ShootableBallisticMissileMoveOrderTargeter(BallisticMissileInfo info) + public ShootableBallisticMissileMoveOrderTargeter(MissileBaseInfo info) { OrderID = "Move"; OrderPriority = 4; } - public virtual bool CanTarget(Actor self, in Target target, List othersAtTarget, ref TargetModifiers modifiers, ref string cursor) + public virtual bool CanTarget(Actor self, in Target target, ref TargetModifiers modifiers, ref string cursor) { // BMs can always move return true; diff --git a/OpenRA.Mods.CA/Orders/UpgradeOrderGenerator.cs b/OpenRA.Mods.CA/Orders/UpgradeOrderGenerator.cs new file mode 100644 index 0000000000..a268c4b9c1 --- /dev/null +++ b/OpenRA.Mods.CA/Orders/UpgradeOrderGenerator.cs @@ -0,0 +1,72 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.Graphics; +using OpenRA.Mods.CA.Traits; +using OpenRA.Mods.Common; +using OpenRA.Mods.Common.Orders; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Orders +{ + public class UpgradeOrderGenerator : OrderGenerator + { + protected override IEnumerable OrderInner(World world, CPos cell, int2 worldPixel, MouseInput mi) + { + if (mi.Button == MouseButton.Right) + world.CancelInputMode(); + + return OrderInner(world, mi); + } + + static IEnumerable OrderInner(World world, MouseInput mi) + { + if (mi.Button != MouseButton.Left) + yield break; + + var underCursor = world.ScreenMap.ActorsAtMouse(mi) + .Select(a => a.Actor) + .FirstOrDefault(a => a.AppearsFriendlyTo(world.LocalPlayer.PlayerActor) && !world.FogObscures(a)); + + if (underCursor == null) + yield break; + + var upgradeable = underCursor.TraitsImplementing().Where(u => u.CanUpgrade).FirstOrDefault(); + if (upgradeable == null || !upgradeable.GetValidHosts().Any()) + yield break; + + // Don't command allied units + if (underCursor.Owner != world.LocalPlayer) + yield break; + + yield return new Order("Upgrade", underCursor, Target.FromActor(underCursor), mi.Modifiers.HasModifier(Modifiers.Shift)) { TargetString = upgradeable.Info.Type }; + } + + protected override void Tick(World world) + { + if (world.LocalPlayer != null && + world.LocalPlayer.WinState != WinState.Undefined) + world.CancelInputMode(); + } + + protected override IEnumerable Render(WorldRenderer wr, World world) { yield break; } + protected override IEnumerable RenderAboveShroud(WorldRenderer wr, World world) { yield break; } + protected override IEnumerable RenderAnnotations(WorldRenderer wr, World world) { yield break; } + + protected override string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi) + { + mi.Button = MouseButton.Left; + return OrderInner(world, mi).Any() + ? "upgrade" : "upgrade-blocked"; + } + } +} diff --git a/OpenRA.Mods.CA/Projectiles/ArcLaserZap.cs b/OpenRA.Mods.CA/Projectiles/ArcLaserZap.cs index 1abf6ffca7..ebd0904e1f 100644 --- a/OpenRA.Mods.CA/Projectiles/ArcLaserZap.cs +++ b/OpenRA.Mods.CA/Projectiles/ArcLaserZap.cs @@ -1,10 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -53,7 +53,7 @@ public class ArcLaserZapInfo : IProjectileInfo public readonly string HitAnim = null; [Desc("Sequence of impact animation to use.")] - [SequenceReference("HitAnim")] + [SequenceReference(nameof(HitAnim), allowNullImage: true)] public readonly string HitAnimSequence = "idle"; [PaletteReference] @@ -61,7 +61,7 @@ public class ArcLaserZapInfo : IProjectileInfo public IProjectile Create(ProjectileArgs args) { - var c = UsePlayerColor ? args.SourceActor.Owner.Color : Color; + var c = UsePlayerColor ? args.SourceActor.OwnerColor() : Color; return new ArcLaserZap(this, args, c); } } @@ -74,7 +74,7 @@ public class ArcLaserZap : IProjectile, ISync readonly Color color; [Sync] - readonly WPos source; + WPos source; int ticks = 0; bool doneDamage; @@ -104,13 +104,15 @@ public ArcLaserZap(ArcLaserZapInfo info, ProjectileArgs args, Color color) public void Tick(World world) { + source = args.CurrentSource(); + // 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 WPos blockedPos; - if (info.Blockable && BlocksProjectiles.AnyBlockingActorsBetween(world, source, target, + if (info.Blockable && BlocksProjectiles.AnyBlockingActorsBetween(world, args.SourceActor.Owner, source, target, info.Width, out blockedPos)) target = blockedPos; @@ -121,7 +123,13 @@ public void Tick(World world) else animationComplete = true; - args.Weapon.Impact(Target.FromPos(target), new WarheadArgs(args)); + var warheadArgs = new WarheadArgs(args) + { + ImpactOrientation = new WRot(WAngle.Zero, Common.Util.GetVerticalAngle(source, target), args.CurrentMuzzleFacing()), + ImpactPosition = target, + }; + + args.Weapon.Impact(Target.FromPos(target), warheadArgs); doneDamage = true; } @@ -135,13 +143,13 @@ public void Tick(World world) public IEnumerable Render(WorldRenderer wr) { if (wr.World.FogObscures(target) && - wr.World.FogObscures(args.Source)) + wr.World.FogObscures(source)) yield break; if (ticks < info.Duration) { var rc = Color.FromArgb((info.Duration - ticks) * color.A / info.Duration, color); - yield return new ArcRenderable(args.Source, target, info.ZOffset, info.Angle, rc, info.Width, info.QuantizedSegments); + yield return new ArcRenderable(source, target, info.ZOffset, info.Angle, rc, info.Width, info.QuantizedSegments); } if (hitanim != null) diff --git a/OpenRA.Mods.CA/Projectiles/AreaBeamCA.cs b/OpenRA.Mods.CA/Projectiles/AreaBeamCA.cs new file mode 100644 index 0000000000..52f8ed262b --- /dev/null +++ b/OpenRA.Mods.CA/Projectiles/AreaBeamCA.cs @@ -0,0 +1,306 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Linq; +using OpenRA.GameRules; +using OpenRA.Graphics; +using OpenRA.Mods.Common; +using OpenRA.Mods.Common.Graphics; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Projectiles +{ + public class AreaBeamCAInfo : IProjectileInfo + { + [Desc("Projectile speed in WDist / tick, two values indicate a randomly picked velocity per beam.")] + public readonly WDist[] Speed = { new(128) }; + + [Desc("The maximum duration (in ticks) of each beam burst.")] + public readonly int Duration = 10; + + [Desc("The number of ticks between the beam causing warhead impacts in its area of effect.")] + public readonly int DamageInterval = 3; + + [Desc("The width of the beam.")] + public readonly WDist Width = new WDist(512); + + [Desc("The shape of the beam. Accepts values Cylindrical or Flat.")] + public readonly BeamRenderableShape Shape = BeamRenderableShape.Cylindrical; + + [Desc("How far beyond the target the projectile keeps on travelling.")] + public readonly WDist BeyondTargetRange = new WDist(0); + + [Desc("The minimum distance the beam travels.")] + public readonly WDist MinDistance = WDist.Zero; + + [Desc("Damage modifier applied at each range step.")] + public readonly int[] Falloff = { 100, 100 }; + + [Desc("Ranges at which each Falloff step is defined.")] + public readonly WDist[] Range = { WDist.Zero, new WDist(int.MaxValue) }; + + [Desc("The maximum/constant/incremental inaccuracy used in conjunction with the InaccuracyType property.")] + public readonly WDist Inaccuracy = WDist.Zero; + + [Desc("Controls the way inaccuracy is calculated. Possible values are " + + "'Maximum' - scale from 0 to max with range, " + + "'PerCellIncrement' - scale from 0 with range, " + + "'Absolute' - use set value regardless of range.")] + public readonly InaccuracyType InaccuracyType = InaccuracyType.Maximum; + + [Desc("Can this projectile be blocked when hitting actors with an IBlocksProjectiles trait.")] + public readonly bool Blockable = false; + + [Desc("Does the beam follow the target.")] + public readonly bool TrackTarget = false; + + [Desc("Should the beam be visually rendered? False = Beam is invisible.")] + public readonly bool RenderBeam = true; + + [Desc("Equivalent to sequence ZOffset. Controls Z sorting.")] + public readonly int ZOffset = 0; + + [Desc("Color of the beam.")] + public readonly Color Color = Color.Red; + + [Desc("Beam color is the player's color.")] + public readonly bool UsePlayerColor = false; + + public IProjectile Create(ProjectileArgs args) + { + var c = UsePlayerColor ? args.SourceActor.OwnerColor() : Color; + return new AreaBeamCA(this, args, c); + } + } + + public class AreaBeamCA : IProjectile, ISync + { + readonly AreaBeamCAInfo info; + readonly ProjectileArgs args; + readonly AttackBase actorAttackBase; + readonly Color color; + readonly WDist speed; + readonly WDist weaponRange; + + [Sync] + WPos headPos; + + [Sync] + WPos tailPos; + + [Sync] + WPos target; + + int length; + WAngle towardsTargetFacing; + int headTicks; + int tailTicks; + bool isHeadTravelling = true; + bool isTailTravelling; + bool continueTracking = true; + + bool IsBeamComplete + { + get + { + return !isHeadTravelling && headTicks >= length && !isTailTravelling && tailTicks >= length; + } + } + + public AreaBeamCA(AreaBeamCAInfo info, ProjectileArgs args, Color color) + { + this.info = info; + this.args = args; + this.color = color; + actorAttackBase = args.SourceActor.Trait(); + + var world = args.SourceActor.World; + if (info.Speed.Length > 1) + speed = new WDist(world.SharedRandom.Next(info.Speed[0].Length, info.Speed[1].Length)); + else + speed = info.Speed[0]; + + // Both the head and tail start at the source actor, but initially only the head is travelling. + headPos = args.Source; + tailPos = headPos; + + target = args.PassiveTarget; + if (info.Inaccuracy.Length > 0) + { + var maxInaccuracyOffset = OpenRA.Mods.Common.Util.GetProjectileInaccuracy(info.Inaccuracy.Length, info.InaccuracyType, args); + target += WVec.FromPDF(world.SharedRandom, 2) * maxInaccuracyOffset / 1024; + } + + towardsTargetFacing = (target - headPos).Yaw; + + // Update the target position with the range we shoot beyond the target by + // I.e. we can deliberately overshoot, so aim for that position + var dir = new WVec(0, -1024, 0).Rotate(WRot.FromYaw(towardsTargetFacing)); + var dist = (args.SourceActor.CenterPosition - target).Length; + int extraDist; + if (info.MinDistance.Length > dist) + { + if (info.MinDistance.Length - dist < info.BeyondTargetRange.Length) + extraDist = info.BeyondTargetRange.Length; + else + extraDist = info.MinDistance.Length - dist; + } + else + extraDist = info.BeyondTargetRange.Length; + + target += dir * extraDist / 1024; + + length = Math.Max((target - headPos).Length / speed.Length, 1); + weaponRange = new WDist(OpenRA.Mods.Common.Util.ApplyPercentageModifiers(args.Weapon.Range.Length, args.RangeModifiers)); + } + + void TrackTarget() + { + if (!continueTracking) + return; + + if (args.GuidedTarget.IsValidFor(args.SourceActor)) + { + var guidedTargetPos = args.Weapon.TargetActorCenter ? args.GuidedTarget.CenterPosition : args.GuidedTarget.Positions.ClosestToIgnoringPath(args.Source); + var targetDistance = new WDist((guidedTargetPos - args.Source).Length); + + // Only continue tracking target if it's within weapon range + + // BeyondTargetRange to avoid edge case stuttering (start firing and immediately stop again). + if (targetDistance > weaponRange + info.BeyondTargetRange) + StopTargeting(); + else + { + target = guidedTargetPos; + towardsTargetFacing = (target - args.Source).Yaw; + + // Update the target position with the range we shoot beyond the target by + // I.e. we can deliberately overshoot, so aim for that position + var dir = new WVec(0, -1024, 0).Rotate(WRot.FromYaw(towardsTargetFacing)); + target += dir * info.BeyondTargetRange.Length / 1024; + } + } + } + + void StopTargeting() + { + continueTracking = false; + isTailTravelling = true; + } + + public void Tick(World world) + { + if (info.TrackTarget) + TrackTarget(); + + if (++headTicks >= length) + { + headPos = target; + isHeadTravelling = false; + } + else if (isHeadTravelling) + headPos = WPos.LerpQuadratic(args.Source, target, WAngle.Zero, headTicks, length); + + if (tailTicks <= 0 && args.SourceActor.IsInWorld && !args.SourceActor.IsDead) + { + args.Source = args.CurrentSource(); + tailPos = args.Source; + } + + // Allow for leniency to avoid edge case stuttering (start firing and immediately stop again). + var outOfWeaponRange = weaponRange + info.BeyondTargetRange < new WDist((args.PassiveTarget - args.Source).Length); + + // While the head is travelling, the tail must start to follow Duration ticks later. + // Alternatively, also stop emitting the beam if source actor dies or is ordered to stop. + if ((headTicks >= info.Duration && !isTailTravelling) || args.SourceActor.IsDead || + !actorAttackBase.IsAiming || outOfWeaponRange) + StopTargeting(); + + if (isTailTravelling) + { + if (++tailTicks >= length) + { + tailPos = target; + isTailTravelling = false; + } + else + tailPos = WPos.LerpQuadratic(args.Source, target, WAngle.Zero, tailTicks, length); + } + + // Check for blocking actors + if (info.Blockable && BlocksProjectiles.AnyBlockingActorsBetween(world, args.SourceActor.Owner, tailPos, headPos, info.Width, out var blockedPos)) + { + headPos = blockedPos; + target = headPos; + length = Math.Min(headTicks, length); + } + + // Damage is applied to intersected actors every DamageInterval ticks + if (headTicks % info.DamageInterval == 0) + { + var actors = world.FindActorsOnLine(tailPos, headPos, info.Width); + foreach (var a in actors) + { + var adjustedModifiers = args.DamageModifiers.Append(GetFalloff((args.Source - a.CenterPosition).Length)); + + var warheadArgs = new WarheadArgs(args) + { + ImpactOrientation = new WRot(WAngle.Zero, OpenRA.Mods.Common.Util.GetVerticalAngle(args.Source, target), args.CurrentMuzzleFacing()), + + // Calculating an impact position is bogus for line damage. + // FindActorsOnLine guarantees that the beam touches the target's HitShape, + // so we just assume a center hit to avoid bogus warhead recalculations. + ImpactPosition = a.CenterPosition, + DamageModifiers = adjustedModifiers.ToArray(), + }; + + args.Weapon.Impact(Target.FromActor(a), warheadArgs); + } + } + + if (IsBeamComplete) + world.AddFrameEndTask(w => w.Remove(this)); + } + + public IEnumerable Render(WorldRenderer wr) + { + if (!IsBeamComplete && info.RenderBeam && !(wr.World.FogObscures(tailPos) && wr.World.FogObscures(headPos))) + { + var zOffset = info.ZOffset; + var verticalDiff = target.Y - args.Source.Y; + if (verticalDiff > 0) + zOffset += verticalDiff; + + var beamRender = new BeamRenderable(headPos, zOffset, tailPos - headPos, info.Shape, info.Width, color); + return new[] { (IRenderable)beamRender }; + } + + return SpriteRenderable.None; + } + + int GetFalloff(int distance) + { + var inner = info.Range[0].Length; + for (var i = 1; i < info.Range.Length; i++) + { + var outer = info.Range[i].Length; + if (outer > distance) + return int2.Lerp(info.Falloff[i - 1], info.Falloff[i], distance - inner, outer - inner); + + inner = outer; + } + + return 0; + } + } +} diff --git a/OpenRA.Mods.CA/Projectiles/AthenaProjectile.cs b/OpenRA.Mods.CA/Projectiles/AthenaProjectile.cs index bb395df12c..f2a2f7f361 100644 --- a/OpenRA.Mods.CA/Projectiles/AthenaProjectile.cs +++ b/OpenRA.Mods.CA/Projectiles/AthenaProjectile.cs @@ -1,10 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion diff --git a/OpenRA.Mods.CA/Projectiles/BulletCA.cs b/OpenRA.Mods.CA/Projectiles/BulletCA.cs index 74f4fe005f..74cf6bfa02 100644 --- a/OpenRA.Mods.CA/Projectiles/BulletCA.cs +++ b/OpenRA.Mods.CA/Projectiles/BulletCA.cs @@ -1,11 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -27,12 +26,15 @@ namespace OpenRA.Mods.CA.Projectiles public class BulletCAInfo : IProjectileInfo { [Desc("Projectile speed in WDist / tick, two values indicate variable velocity.")] - public readonly WDist[] Speed = { new WDist(17) }; + public readonly WDist[] Speed = { new(17) }; [Desc("The maximum/constant/incremental inaccuracy used in conjunction with the InaccuracyType property.")] public readonly WDist Inaccuracy = WDist.Zero; - [Desc("Controls the way inaccuracy is calculated. Possible values are 'Maximum' - scale from 0 to max with range, 'PerCellIncrement' - scale from 0 with range and 'Absolute' - use set value regardless of range.")] + [Desc("Controls the way inaccuracy is calculated. Possible values are " + + "'Maximum' - scale from 0 to max with range, " + + "'PerCellIncrement' - scale from 0 with range, " + + "'Absolute' - use set value regardless of range.")] public readonly InaccuracyType InaccuracyType = InaccuracyType.Maximum; [Desc("Image to display.")] @@ -52,9 +54,8 @@ public class BulletCAInfo : IProjectileInfo [Desc("Does this projectile have a shadow?")] public readonly bool Shadow = false; - [PaletteReference] - [Desc("Palette to use for this projectile's shadow if Shadow is true.")] - public readonly string ShadowPalette = "shadow"; + [Desc("Color to draw shadow if Shadow is true.")] + public readonly Color ShadowColor = Color.FromArgb(140, 0, 0, 0); [Desc("Trail animation.")] public readonly string TrailImage = null; @@ -101,8 +102,8 @@ public class BulletCAInfo : IProjectileInfo [Desc("Terrain where the projectile explodes instead of bouncing.")] public readonly HashSet InvalidBounceTerrain = new HashSet(); - [Desc("If projectile touches an actor with one of these stances during or after the first bounce, trigger explosion.")] - public readonly PlayerRelationship ValidBounceBlockerStances = PlayerRelationship.Enemy | PlayerRelationship.Neutral; + [Desc("Trigger the explosion if the projectile touches an actor thats owner has these player relationships.")] + public readonly PlayerRelationship ValidBounceBlockerRelationships = PlayerRelationship.Enemy | PlayerRelationship.Neutral; [Desc("Altitude above terrain below which to explode. Zero effectively deactivates airburst.")] public readonly WDist AirburstAltitude = WDist.Zero; @@ -110,40 +111,80 @@ public class BulletCAInfo : IProjectileInfo [Desc("Type defined for point-defense logic.")] public readonly string PointDefenseType = null; + [Desc("When set, display a line behind the actor. Length is measured in ticks after appearing.")] public readonly int ContrailLength = 0; - public readonly int ContrailZOffset = 2047; - public readonly Color ContrailColor = Color.White; - public readonly bool ContrailUsePlayerColor = false; + + [Desc("Time (in ticks) after which the line should appear. Controls the distance to the actor.")] public readonly int ContrailDelay = 1; - public readonly WDist ContrailWidth = new WDist(64); - public IProjectile Create(ProjectileArgs args) { return new BulletCA(this, args); } + [Desc("Equivalent to sequence ZOffset. Controls Z sorting.")] + public readonly int ContrailZOffset = 2047; + + [Desc("Thickness of the emitted line at the start of the contrail.")] + public readonly WDist ContrailStartWidth = new(64); + + [Desc("Thickness of the emitted line at the end of the contrail. Will default to " + nameof(ContrailStartWidth) + " if left undefined")] + public readonly WDist? ContrailEndWidth = null; + + [Desc("RGB color at the contrail start.")] + public readonly Color ContrailStartColor = Color.White; + + [Desc("Use player remap color instead of a custom color at the contrail the start.")] + public readonly bool ContrailStartColorUsePlayerColor = false; + + [Desc("The alpha value [from 0 to 255] of color at the contrail the start.")] + public readonly int ContrailStartColorAlpha = 255; + + [Desc("RGB color at the contrail end. Set to start color if undefined")] + public readonly Color? ContrailEndColor; + + [Desc("Use player remap color instead of a custom color at the contrail end.")] + public readonly bool ContrailEndColorUsePlayerColor = false; + + [Desc("The alpha value [from 0 to 255] of color at the contrail end.")] + public readonly int ContrailEndColorAlpha = 0; + + [Desc("If true, projectile will pass through targets to max range (subject to minimum distance).")] + public readonly bool PassthroughToMaxRange = false; + + [Desc("Target must be this far away for a full passthrough, otherwise the projectile stops at the target.")] + public readonly WDist PassthroughMinDistance = WDist.Zero; + + [Desc("If true, full passthroughs will travel parallel to the weapon muzzle offset.")] + public readonly bool PassthroughParallelToMuzzleOffset = false; + + public virtual IProjectile Create(ProjectileArgs args) { return new BulletCA(this, args); } } public class BulletCA : IProjectile, ISync { readonly BulletCAInfo info; - readonly ProjectileArgs args; - readonly Animation anim; + protected readonly ProjectileArgs Args; + protected readonly Animation Animation; readonly WAngle facing; readonly WAngle angle; readonly WDist speed; readonly string trailPalette; - ContrailRenderable contrail; + readonly float3 shadowColor; + readonly float shadowAlpha; + + readonly ContrailRenderable contrail; [Sync] - WPos pos, lastPos, target, source; + protected WPos pos, lastPos, target, source; int length; int ticks, smokeTicks; int remainingBounces; List trailItems = new List(); + protected bool FlightLengthReached => ticks >= length; + public BulletCA(BulletCAInfo info, ProjectileArgs args) { this.info = info; - this.args = args; + Args = args; pos = args.Source; source = args.Source; @@ -169,19 +210,41 @@ public BulletCA(BulletCAInfo info, ProjectileArgs args) if (info.AirburstAltitude > WDist.Zero) target += new WVec(WDist.Zero, WDist.Zero, info.AirburstAltitude); + if (info.PassthroughToMaxRange && (info.PassthroughMinDistance.Length == 0 || (target - args.Source).Length >= info.PassthroughMinDistance.Length)) + { + var rangeModifiers = args.SourceActor.TraitsImplementing().ToArray().Select(m => m.GetRangeModifier()); + var weaponRange = new WDist(Common.Util.ApplyPercentageModifiers(args.Weapon.Range.Length, rangeModifiers)); + var speed = new WVec(0, -weaponRange.Length, 0); + + if (info.PassthroughParallelToMuzzleOffset) + { + var offsetFromCenter = args.Source - args.SourceActor.CenterPosition; + target += offsetFromCenter; + } + + var fullRangeVector = speed.Rotate(WRot.FromYaw((target - args.Source).Yaw)); + target = args.Source + fullRangeVector; + } + facing = (target - pos).Yaw; length = Math.Max((target - pos).Length / speed.Length, 1); if (!string.IsNullOrEmpty(info.Image)) { - anim = new Animation(world, info.Image, new Func(GetEffectiveFacing)); - anim.PlayRepeating(info.Sequences.Random(world.SharedRandom)); + Animation = new Animation(world, info.Image, new Func(GetEffectiveFacing)); + Animation.PlayRepeating(info.Sequences.Random(world.SharedRandom)); } if (info.ContrailLength > 0) { - var color = info.ContrailUsePlayerColor ? ContrailRenderable.ChooseColor(args.SourceActor) : info.ContrailColor; - contrail = new ContrailRenderable(world, color, info.ContrailWidth, info.ContrailLength, info.ContrailDelay, info.ContrailZOffset); + var startcolor = info.ContrailStartColorUsePlayerColor ? Color.FromArgb(info.ContrailStartColorAlpha, args.SourceActor.OwnerColor()) : Color.FromArgb(info.ContrailStartColorAlpha, info.ContrailStartColor); + var endcolor = info.ContrailEndColorUsePlayerColor ? Color.FromArgb(info.ContrailEndColorAlpha, args.SourceActor.OwnerColor()) : Color.FromArgb(info.ContrailEndColorAlpha, info.ContrailEndColor ?? startcolor); + contrail = new ContrailRenderable(world, args.SourceActor, + startcolor, info.ContrailStartColorUsePlayerColor, + endcolor, info.ContrailEndColor == null ? info.ContrailStartColorUsePlayerColor : info.ContrailEndColorUsePlayerColor, + info.ContrailStartWidth, + info.ContrailEndWidth ?? info.ContrailStartWidth, + info.ContrailLength, info.ContrailDelay, info.ContrailZOffset); } trailPalette = info.TrailPalette; @@ -190,6 +253,9 @@ public BulletCA(BulletCAInfo info, ProjectileArgs args) smokeTicks = info.TrailDelay; remainingBounces = info.BounceCount; + + shadowColor = new float3(info.ShadowColor.R, info.ShadowColor.G, info.ShadowColor.B) / 255f; + shadowAlpha = info.ShadowColor.A / 255f; } WAngle GetEffectiveFacing() @@ -207,9 +273,9 @@ WAngle GetEffectiveFacing() return new WAngle(effective); } - public void Tick(World world) + public virtual void Tick(World world) { - anim?.Tick(); + Animation?.Tick(); foreach (var t in trailItems) t.Tick(); @@ -224,7 +290,7 @@ public void Tick(World world) bool ShouldExplode(World world) { // Check for walls or other blocking obstacles - if (info.Blockable && BlocksProjectiles.AnyBlockingActorsBetween(world, lastPos, pos, info.Width, out var blockedPos)) + if (info.Blockable && BlocksProjectiles.AnyBlockingActorsBetween(world, Args.SourceActor.Owner, lastPos, pos, info.Width, out var blockedPos)) { pos = blockedPos; return true; @@ -264,7 +330,7 @@ bool ShouldExplode(World world) if (info.InvalidBounceTerrain.Contains(world.Map.GetTerrainInfo(cell).Type)) return true; - if (AnyValidTargetsInRadius(world, pos, info.Width, args.SourceActor, true)) + if (AnyValidTargetsInRadius(world, pos, info.Width, Args.SourceActor, true)) return true; target += (pos - source) * info.BounceRangeModifier / 100; @@ -287,69 +353,88 @@ bool ShouldExplode(World world) return true; // After first bounce, check for targets each tick - if (remainingBounces < info.BounceCount && AnyValidTargetsInRadius(world, pos, info.Width, args.SourceActor, true)) + if (remainingBounces < info.BounceCount && AnyValidTargetsInRadius(world, pos, info.Width, Args.SourceActor, true)) return true; - if (!string.IsNullOrEmpty(info.PointDefenseType) && world.ActorsWithTrait().Any(x => x.Trait.Destroy(pos, args.SourceActor.Owner, info.PointDefenseType))) + if (!string.IsNullOrEmpty(info.PointDefenseType) && world.ActorsWithTrait().Any(x => x.Trait.Destroy(pos, Args.SourceActor.Owner, info.PointDefenseType, Args))) return true; return false; } - public IEnumerable Render(WorldRenderer wr) + public virtual IEnumerable Render(WorldRenderer wr) { if (info.ContrailLength > 0) yield return contrail; - if (anim == null || ticks >= length) + if (FlightLengthReached) yield break; - var world = args.SourceActor.World; + foreach (var r in RenderAnimation(wr)) + yield return r; + } + + protected IEnumerable RenderAnimation(WorldRenderer wr) + { + if (Animation == null) + yield break; + + var world = Args.SourceActor.World; if (!world.FogObscures(pos)) { + var paletteName = info.Palette; + if (paletteName != null && info.IsPlayerPalette) + paletteName += Args.SourceActor.Owner.InternalName; + + var palette = wr.Palette(paletteName); + if (info.Shadow) { var dat = world.Map.DistanceAboveTerrain(pos); var shadowPos = pos - new WVec(0, 0, dat.Length); - foreach (var r in anim.Render(shadowPos, wr.Palette(info.ShadowPalette))) - yield return r; + foreach (var r in Animation.Render(shadowPos, palette)) + yield return ((IModifyableRenderable)r) + .WithTint(shadowColor, ((IModifyableRenderable)r).TintModifiers | TintModifiers.ReplaceColor) + .WithAlpha(shadowAlpha); } - var palette = wr.Palette(info.Palette + (info.IsPlayerPalette ? args.SourceActor.Owner.InternalName : "")); - foreach (var r in anim.Render(pos, palette)) + foreach (var r in Animation.Render(pos, palette)) yield return r; - var trailPalette = wr.Palette(info.TrailPalette + (info.TrailUsePlayerPalette ? args.SourceActor.Owner.InternalName : "")); - var trailMult = 1; - - for (var i = trailItems.Count - 1; i >= 0; i--) + if (trailItems.Count > 0) { - var trailOffset = new WVec(0, info.TrailSpacing.Length, 0); - trailOffset = trailOffset.Rotate(WRot.FromYaw(facing)); - var trailPos = pos + (trailOffset * trailMult); + var trailPalette = wr.Palette(info.TrailPalette + (info.TrailUsePlayerPalette ? Args.SourceActor.Owner.InternalName : "")); + var trailMult = 1; - foreach (var r in trailItems[i].Render(trailPos, trailPalette)) - yield return r; + for (var i = trailItems.Count - 1; i >= 0; i--) + { + var trailOffset = new WVec(0, info.TrailSpacing.Length, 0); + trailOffset = trailOffset.Rotate(WRot.FromYaw(facing)); + var trailPos = pos + (trailOffset * trailMult); - trailMult++; + foreach (var r in trailItems[i].Render(trailPos, trailPalette)) + yield return r; + + trailMult++; + } } } } - void Explode(World world) + protected virtual void Explode(World world) { if (info.ContrailLength > 0) world.AddFrameEndTask(w => w.Add(new ContrailFader(pos, contrail))); world.AddFrameEndTask(w => w.Remove(this)); - var warheadArgs = new WarheadArgs(args) + var warheadArgs = new WarheadArgs(Args) { - ImpactOrientation = new WRot(WAngle.Zero, Common.Util.GetVerticalAngle(lastPos, pos), args.Facing), + ImpactOrientation = new WRot(WAngle.Zero, Common.Util.GetVerticalAngle(lastPos, pos), Args.Facing), ImpactPosition = pos, }; - args.Weapon.Impact(Target.FromPos(pos), warheadArgs); + Args.Weapon.Impact(Target.FromPos(pos), warheadArgs); } bool AnyValidTargetsInRadius(World world, WPos pos, WDist radius, Actor firedBy, bool checkTargetType) @@ -359,13 +444,15 @@ bool AnyValidTargetsInRadius(World world, WPos pos, WDist radius, Actor firedBy, if (checkTargetType && !Target.FromActor(victim).IsValidFor(firedBy)) continue; - if (!info.ValidBounceBlockerStances.HasStance(firedBy.Owner.RelationshipWith(victim.Owner))) + if (victim != Args.GuidedTarget.Actor && !info.ValidBounceBlockerRelationships.HasRelationship(firedBy.Owner.RelationshipWith(victim.Owner))) continue; // If the impact position is within any actor's HitShape, we have a direct hit - var activeShapes = victim.TraitsImplementing().Where(Exts.IsTraitEnabled); - if (activeShapes.Any(i => i.DistanceFromEdge(victim, pos).Length <= 0)) - return true; + // PERF: Avoid using TraitsImplementing that needs to find the actor in the trait dictionary. + foreach (var targetPos in victim.EnabledTargetablePositions) + if (targetPos is HitShape h) + if (h.DistanceFromEdge(victim, pos).Length <= 0) + return true; } return false; diff --git a/OpenRA.Mods.CA/Projectiles/ElectricBolt.cs b/OpenRA.Mods.CA/Projectiles/ElectricBolt.cs index 9680c85d3d..143cc54a04 100644 --- a/OpenRA.Mods.CA/Projectiles/ElectricBolt.cs +++ b/OpenRA.Mods.CA/Projectiles/ElectricBolt.cs @@ -1,24 +1,27 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion using System; using System.Collections.Generic; +using System.Linq; using OpenRA.GameRules; using OpenRA.Graphics; using OpenRA.Mods.CA.Graphics; +using OpenRA.Mods.Common; using OpenRA.Mods.Common.Effects; +using OpenRA.Mods.Common.Traits; using OpenRA.Primitives; using OpenRA.Support; using OpenRA.Traits; -namespace OpenRA.Mods.AS.Projectiles +namespace OpenRA.Mods.CA.Projectiles { [Desc("Not a sprite, but an engine effect.")] public class ElectricBoltInfo : IProjectileInfo @@ -29,9 +32,21 @@ public class ElectricBoltInfo : IProjectileInfo [Desc("Equivalent to sequence ZOffset. Controls Z sorting.")] public readonly int ZOffset = 0; + [Desc("Beam can be blocked.")] + public readonly bool Blockable = false; + [Desc("The maximum duration (in ticks) of the beam's existence.")] public readonly int Duration = 5; + [Desc("The maximum/constant/incremental inaccuracy used in conjunction with the InaccuracyType property.")] + public readonly WDist Inaccuracy = WDist.Zero; + + [Desc("Controls the way inaccuracy is calculated. Possible values are " + + "'Maximum' - scale from 0 to max with range, " + + "'PerCellIncrement' - scale from 0 with range, " + + "'Absolute' - use set value regardless of range.")] + public readonly InaccuracyType InaccuracyType = InaccuracyType.Maximum; + [Desc("Colors of the zaps. The amount of zaps are the amount of colors listed here and PlayerColorZaps.")] public readonly Color[] Colors = { @@ -43,8 +58,14 @@ public class ElectricBoltInfo : IProjectileInfo [Desc("Additional zaps colored with the player's color.")] public readonly int PlayerColorZaps = 0; - [Desc("Distortion offset.")] - public readonly int Distortion = 128; + [Desc("Alpha to apply to player colored zaps. If two values are specified randomly select a value between the two values.")] + public readonly int[] PlayerColorZapAlpha = { 255 }; + + [Desc("Initial distortion offset.")] + public readonly int Distortion = 0; + + [Desc("Distortion added per tick for duration of beam.")] + public readonly int DistortionAnimation = 0; [Desc("The maximum angle of the arc of the bolt.")] public readonly WAngle Angle = WAngle.FromDegrees(90); @@ -63,6 +84,9 @@ public class ElectricBoltInfo : IProjectileInfo [PaletteReference] public readonly string LaunchEffectPalette = "effect"; + [Desc("Does the beam follow the target.")] + public readonly bool TrackTarget = false; + public IProjectile Create(ProjectileArgs args) { return new ElectricBolt(this, args); @@ -71,37 +95,93 @@ public IProjectile Create(ProjectileArgs args) public class ElectricBolt : IProjectile, ISync { - readonly ProjectileArgs args; readonly ElectricBoltInfo info; - readonly WVec leftVector; - readonly WVec upVector; + readonly ProjectileArgs args; readonly MersenneTwister random; + readonly HashSet<(Color Color, WPos[] Positions, WVec[] Distortions)> zaps; readonly bool hasLaunchEffect; - readonly HashSet<(Color Color, WPos[] Positions)> zaps; - - [Sync] - readonly WPos target, source; + readonly int numSegments; int ticks = 0; + WVec leftVector; + WVec upVector; + WVec inaccuracyOffset; + + [Sync] + WPos target, source, lastTarget, lastSource; public ElectricBolt(ElectricBoltInfo info, ProjectileArgs args) { this.args = args; this.info = info; - var playerColors = args.SourceActor.Owner.Color; - var colors = info.Colors; + + var playerColor = args.SourceActor.OwnerColor(); + var colors = info.Colors.ToList(); + for (int i = 0; i < info.PlayerColorZaps; i++) - colors.Append(playerColors); + colors.Add(Color.FromArgb(info.PlayerColorZapAlpha.Length != 2 ? info.PlayerColorZapAlpha[0] : OpenRA.Mods.Common.Util.RandomInRange(args.SourceActor.World.SharedRandom, info.PlayerColorZapAlpha), playerColor.R, playerColor.G, playerColor.B)); + + source = lastSource = args.Source; + target = lastTarget = args.PassiveTarget; + random = args.SourceActor.World.SharedRandom; + + // Apply inaccuracy to target + if (info.Inaccuracy.Length > 0) + { + var maxInaccuracyOffset = OpenRA.Mods.Common.Util.GetProjectileInaccuracy(info.Inaccuracy.Length, info.InaccuracyType, args); + inaccuracyOffset = WVec.FromPDF(random, 2) * maxInaccuracyOffset / 1024; + target += inaccuracyOffset; + } - target = args.PassiveTarget; - source = args.Source; - random = args.SourceActor.World.LocalRandom; + var direction = target - source; + numSegments = (direction.Length - 1) / info.SegmentLength.Length + 1; + zaps = new HashSet<(Color, WPos[], WVec[])>(); + foreach (var c in colors) + { + var numSegments = (direction.Length - 1) / info.SegmentLength.Length + 1; + var offsets = new WPos[numSegments + 1]; + var distortions = new WVec[numSegments + 1]; + + var angle = new WAngle((-info.Angle.Angle / 2) + random.Next(info.Angle.Angle)); + + for (var i = 1; i < numSegments; i++) + offsets[i] = WPos.LerpQuadratic(source, target, angle, i, numSegments); + + zaps.Add((c, offsets, distortions)); + } + + CalculateDistortion(direction); + CalculateBeam(direction); + + // Do the beam impact (warheads) + var warheadArgs = new WarheadArgs(args) + { + ImpactOrientation = new WRot(WAngle.Zero, Common.Util.GetVerticalAngle(source, target), args.CurrentMuzzleFacing()), + ImpactPosition = target, + }; + + args.Weapon.Impact(Target.FromPos(target), warheadArgs); + + // Do launch effect hasLaunchEffect = !string.IsNullOrEmpty(info.LaunchEffectImage) && !string.IsNullOrEmpty(info.LaunchEffectSequence); + if (hasLaunchEffect) + { + Func getMuzzleFacing = () => args.CurrentMuzzleFacing(); + args.SourceActor.World.AddFrameEndTask(w => w.Add(new SpriteEffect(args.CurrentSource, getMuzzleFacing, args.SourceActor.World, + info.LaunchEffectImage, info.LaunchEffectSequence, info.LaunchEffectPalette))); + } + } - var direction = args.PassiveTarget - args.Source; + void CheckBlocked() + { + if (info.Blockable && BlocksProjectiles.AnyBlockingActorsBetween(args.SourceActor.World, args.SourceActor.Owner, source, target, info.Width, out var blockedPos)) + target = blockedPos; + } - if (info.Distortion != 0) + void CalculateDistortion(WVec direction) + { + if (info.Distortion != 0 || info.DistortionAnimation != 0) { leftVector = new WVec(direction.Y, -direction.X, 0); if (leftVector.Length != 0) @@ -116,46 +196,68 @@ public ElectricBolt(ElectricBoltInfo info, ProjectileArgs args) if (upVector.Length != 0) upVector = 1024 * upVector / upVector.Length; } + } - zaps = new HashSet<(Color, WPos[])>(); - foreach (var c in colors) - { - var numSegments = (direction.Length - 1) / info.SegmentLength.Length + 1; - var offsets = new WPos[numSegments + 1]; - offsets[0] = args.Source; - offsets[offsets.Length - 1] = args.PassiveTarget; - - var angle = new WAngle((-info.Angle.Angle / 2) + random.Next(info.Angle.Angle)); + void TrackTarget() + { + if (!info.TrackTarget || ticks == 0) + return; - for (var i = 1; i < numSegments; i++) - offsets[i] = WPos.LerpQuadratic(source, target, angle, i, numSegments); + if (!args.GuidedTarget.IsValidFor(args.SourceActor)) + return; - zaps.Add((c, offsets)); - } + var guidedTargetPos = args.Weapon.TargetActorCenter ? args.GuidedTarget.CenterPosition : args.GuidedTarget.Positions.ClosestToIgnoringPath(args.Source); + target = guidedTargetPos + inaccuracyOffset; } - public void Tick(World world) + void CalculateBeam(WVec direction) { - if (hasLaunchEffect && ticks == 0) - { - Func getMuzzleFacing = () => args.CurrentMuzzleFacing(); - world.AddFrameEndTask(w => w.Add(new SpriteEffect(args.CurrentSource, getMuzzleFacing, world, - info.LaunchEffectImage, info.LaunchEffectSequence, info.LaunchEffectPalette))); - } + var shouldDistort = (ticks == 0 && info.Distortion != 0) || (ticks > 0 && info.DistortionAnimation != 0); - if (ticks == 0) + foreach (var zap in zaps) { - var warheadArgs = new WarheadArgs(args) + var offsets = zap.Positions; + var distortions = zap.Distortions; + offsets[0] = source; + offsets[offsets.Length - 1] = target; + + for (var i = 1; i < offsets.Length - 1; i++) { - ImpactOrientation = new WRot(WAngle.Zero, Common.Util.GetVerticalAngle(source, target), args.CurrentMuzzleFacing()), - ImpactPosition = target, - }; + // If initialising or source/target have moved set segment base positions + if (ticks == 0 || lastSource != source || target != lastTarget) + { + var segmentStart = direction / numSegments * i; + offsets[i] = source + segmentStart + distortions[i]; + } - args.Weapon.Impact(Target.FromPos(target), warheadArgs); + if (shouldDistort) + { + var angle = WAngle.FromDegrees(random.Next(360)); + var distortion = random.Next(ticks > 0 ? info.DistortionAnimation : info.Distortion); + + var distOffset = distortion * angle.Cos() * leftVector / (1024 * 1024) + + distortion * angle.Sin() * upVector / (1024 * 1024); + + offsets[i] += distOffset; + distortions[i] += distOffset; + } + } } + } + + public void Tick(World world) + { + source = args.CurrentSource(); + TrackTarget(); + CheckBlocked(); if (++ticks >= info.Duration) world.AddFrameEndTask(w => w.Remove(this)); + else + CalculateBeam(target - source); + + lastSource = source; + lastTarget = target; } public IEnumerable Render(WorldRenderer wr) @@ -166,21 +268,15 @@ public IEnumerable Render(WorldRenderer wr) if (ticks < info.Duration) { + var zOffset = info.ZOffset; + var verticalDiff = target.Y - args.Source.Y; + if (verticalDiff > 0) + zOffset += verticalDiff; + foreach (var zap in zaps) { var offsets = zap.Positions; - for (var i = 1; i < offsets.Length - 1; i++) - { - var angle = WAngle.FromDegrees(random.Next(360)); - var distortion = random.Next(info.Distortion); - - var offset = distortion * angle.Cos() * leftVector / (1024 * 1024) - + distortion * angle.Sin() * upVector / (1024 * 1024); - - offsets[i] += offset; - } - - yield return new ElectricBoltRenderable(offsets, info.ZOffset, info.Width, zap.Color); + yield return new ElectricBoltRenderable(offsets, zOffset, info.Width, zap.Color); } } } diff --git a/OpenRA.Mods.CA/Projectiles/InstantExplode.cs b/OpenRA.Mods.CA/Projectiles/InstantExplode.cs index 077f738f65..b3827e90b9 100644 --- a/OpenRA.Mods.CA/Projectiles/InstantExplode.cs +++ b/OpenRA.Mods.CA/Projectiles/InstantExplode.cs @@ -1,10 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion diff --git a/OpenRA.Mods.CA/Projectiles/KKNDLaser.cs b/OpenRA.Mods.CA/Projectiles/KKNDLaser.cs index 6467ab54a3..d9fd41271b 100644 --- a/OpenRA.Mods.CA/Projectiles/KKNDLaser.cs +++ b/OpenRA.Mods.CA/Projectiles/KKNDLaser.cs @@ -1,10 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -12,7 +12,6 @@ using OpenRA.GameRules; using OpenRA.Graphics; using OpenRA.Mods.CA.Graphics; -using OpenRA.Mods.Common.Graphics; using OpenRA.Primitives; using OpenRA.Support; using OpenRA.Traits; diff --git a/OpenRA.Mods.CA/Projectiles/LaserZapCA.cs b/OpenRA.Mods.CA/Projectiles/LaserZapCA.cs new file mode 100644 index 0000000000..7fdb77962b --- /dev/null +++ b/OpenRA.Mods.CA/Projectiles/LaserZapCA.cs @@ -0,0 +1,253 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.GameRules; +using OpenRA.Graphics; +using OpenRA.Mods.Common; +using OpenRA.Mods.Common.Effects; +using OpenRA.Mods.Common.Graphics; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Projectiles +{ + [Desc("Not a sprite, but an engine effect.", + "CA version adds to ZOffset for targets below the source.")] + public class LaserZapCAInfo : IProjectileInfo + { + [Desc("The width of the zap.")] + public readonly WDist Width = new WDist(86); + + [Desc("The shape of the beam. Accepts values Cylindrical or Flat.")] + public readonly BeamRenderableShape Shape = BeamRenderableShape.Cylindrical; + + [Desc("Equivalent to sequence ZOffset. Controls Z sorting.")] + public readonly int ZOffset = 0; + + [Desc("The maximum duration (in ticks) of the beam's existence.")] + public readonly int Duration = 10; + + [Desc("Total time-frame in ticks that the beam deals damage every DamageInterval.")] + public readonly int DamageDuration = 1; + + [Desc("The number of ticks between the beam causing warhead impacts in its area of effect.")] + public readonly int DamageInterval = 1; + + public readonly bool UsePlayerColor = false; + + [Desc("Color of the beam.")] + public readonly Color Color = Color.Red; + + [Desc("Beam follows the target.")] + public readonly bool TrackTarget = true; + + [Desc("The maximum/constant/incremental inaccuracy used in conjunction with the InaccuracyType property.")] + public readonly WDist Inaccuracy = WDist.Zero; + + [Desc("Controls the way inaccuracy is calculated. Possible values are " + + "'Maximum' - scale from 0 to max with range, " + + "'PerCellIncrement' - scale from 0 with range, " + + "'Absolute' - use set value regardless of range.")] + public readonly InaccuracyType InaccuracyType = InaccuracyType.Maximum; + + [Desc("Beam can be blocked.")] + public readonly bool Blockable = false; + + [Desc("Draw a second beam (for 'glow' effect).")] + public readonly bool SecondaryBeam = false; + + [Desc("The width of the zap.")] + public readonly WDist SecondaryBeamWidth = new WDist(86); + + [Desc("The shape of the beam. Accepts values Cylindrical or Flat.")] + public readonly BeamRenderableShape SecondaryBeamShape = BeamRenderableShape.Cylindrical; + + [Desc("Equivalent to sequence ZOffset. Controls Z sorting.")] + public readonly int SecondaryBeamZOffset = 0; + + public readonly bool SecondaryBeamUsePlayerColor = false; + + [Desc("Color of the secondary beam.")] + public readonly Color SecondaryBeamColor = Color.Red; + + [Desc("Impact animation.")] + public readonly string HitAnim = null; + + [SequenceReference(nameof(HitAnim), allowNullImage: true)] + [Desc("Sequence of impact animation to use.")] + public readonly string HitAnimSequence = "idle"; + + [PaletteReference] + public readonly string HitAnimPalette = "effect"; + + [Desc("Image containing launch effect sequence.")] + public readonly string LaunchEffectImage = null; + + [SequenceReference(nameof(LaunchEffectImage), allowNullImage: true)] + [Desc("Launch effect sequence to play.")] + public readonly string LaunchEffectSequence = null; + + [PaletteReference] + [Desc("Palette to use for launch effect.")] + public readonly string LaunchEffectPalette = "effect"; + + [Desc("If true, projectile will pass through targets to max range (subject to minimum distance).")] + public readonly bool PassthroughToMaxRange = false; + + [Desc("Target must be this far away for a full passthrough, otherwise the projectile stops at the target.")] + public readonly WDist PassthroughMinDistance = WDist.Zero; + + [Desc("If true, full passthroughs will travel parallel to the weapon muzzle offset.")] + public readonly bool PassthroughParallelToMuzzleOffset = false; + + public IProjectile Create(ProjectileArgs args) + { + var c = UsePlayerColor ? args.SourceActor.OwnerColor() : Color; + return new LaserZapCA(this, args, c); + } + } + + public class LaserZapCA : IProjectile, ISync + { + readonly ProjectileArgs args; + readonly LaserZapCAInfo info; + readonly Animation hitanim; + readonly Color color; + readonly Color secondaryColor; + readonly bool hasLaunchEffect; + int ticks; + int interval; + bool showHitAnim; + + [Sync] + WPos target; + + [Sync] + WPos source; + + public LaserZapCA(LaserZapCAInfo info, ProjectileArgs args, Color color) + { + this.args = args; + this.info = info; + this.color = color; + secondaryColor = info.SecondaryBeamUsePlayerColor ? args.SourceActor.OwnerColor() : info.SecondaryBeamColor; + target = args.PassiveTarget; + source = args.Source; + + if (info.Inaccuracy.Length > 0) + { + var maxInaccuracyOffset = Common.Util.GetProjectileInaccuracy(info.Inaccuracy.Length, info.InaccuracyType, args); + target += WVec.FromPDF(args.SourceActor.World.SharedRandom, 2) * maxInaccuracyOffset / 1024; + } + + if (!string.IsNullOrEmpty(info.HitAnim)) + { + hitanim = new Animation(args.SourceActor.World, info.HitAnim); + showHitAnim = true; + } + + hasLaunchEffect = !string.IsNullOrEmpty(info.LaunchEffectImage) && !string.IsNullOrEmpty(info.LaunchEffectSequence); + + if (info.PassthroughToMaxRange && (info.PassthroughMinDistance.Length == 0 || (target - args.Source).Length >= info.PassthroughMinDistance.Length)) + { + var rangeModifiers = args.SourceActor.TraitsImplementing().ToArray().Select(m => m.GetRangeModifier()); + var weaponRange = new WDist(Common.Util.ApplyPercentageModifiers(args.Weapon.Range.Length, rangeModifiers)); + var speed = new WVec(0, -weaponRange.Length, 0); + + if (info.PassthroughParallelToMuzzleOffset) + { + var offsetFromCenter = args.Source - args.SourceActor.CenterPosition; + target += offsetFromCenter; + } + + var fullRangeVector = speed.Rotate(WRot.FromYaw((target - args.Source).Yaw)); + target = args.Source + fullRangeVector; + } + } + + public void Tick(World world) + { + source = args.CurrentSource(); + + if (hasLaunchEffect && ticks == 0) + world.AddFrameEndTask(w => w.Add(new SpriteEffect(args.CurrentSource, args.CurrentMuzzleFacing, world, + info.LaunchEffectImage, info.LaunchEffectSequence, info.LaunchEffectPalette))); + + // Beam tracks target + if (info.TrackTarget && args.GuidedTarget.IsValidFor(args.SourceActor)) + 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, info.Width, out var blockedPos)) + { + target = blockedPos; + } + + if (ticks < info.DamageDuration && --interval <= 0) + { + var warheadArgs = new WarheadArgs(args) + { + ImpactOrientation = new WRot(WAngle.Zero, OpenRA.Mods.Common.Util.GetVerticalAngle(source, target), args.CurrentMuzzleFacing()), + ImpactPosition = target, + }; + + args.Weapon.Impact(Target.FromPos(target), warheadArgs); + interval = info.DamageInterval; + } + + if (showHitAnim) + { + if (ticks == 0) + hitanim.PlayThen(info.HitAnimSequence, () => showHitAnim = false); + + hitanim.Tick(); + } + + if (++ticks >= info.Duration && !showHitAnim) + world.AddFrameEndTask(w => w.Remove(this)); + } + + public IEnumerable Render(WorldRenderer wr) + { + if (wr.World.FogObscures(target) && + wr.World.FogObscures(source)) + yield break; + + if (ticks < info.Duration) + { + var zOffset = info.ZOffset; + var secondaryBeamZOffset = info.SecondaryBeamZOffset; + var verticalDiff = target.Y - args.Source.Y; + if (verticalDiff > 0) + { + zOffset += verticalDiff; + secondaryBeamZOffset += verticalDiff; + } + + var rc = Color.FromArgb((info.Duration - ticks) * color.A / info.Duration, color); + yield return new BeamRenderable(source, zOffset, target - source, info.Shape, info.Width, rc); + + if (info.SecondaryBeam) + { + var src = Color.FromArgb((info.Duration - ticks) * secondaryColor.A / info.Duration, secondaryColor); + yield return new BeamRenderable(source, secondaryBeamZOffset, target - source, + info.SecondaryBeamShape, info.SecondaryBeamWidth, src); + } + } + + if (showHitAnim) + foreach (var r in hitanim.Render(target, wr.Palette(info.HitAnimPalette))) + yield return r; + } + } +} diff --git a/OpenRA.Mods.CA/Projectiles/LinearPulse.cs b/OpenRA.Mods.CA/Projectiles/LinearPulse.cs index c710e49011..8fc2afc643 100644 --- a/OpenRA.Mods.CA/Projectiles/LinearPulse.cs +++ b/OpenRA.Mods.CA/Projectiles/LinearPulse.cs @@ -1,29 +1,232 @@ #region Copyright & License Information /* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion using System; using System.Collections.Generic; +using System.Linq; using OpenRA.GameRules; using OpenRA.Graphics; +using OpenRA.Mods.CA.Traits; using OpenRA.Mods.Common; +using OpenRA.Mods.Common.Effects; +using OpenRA.Mods.Common.Graphics; +using OpenRA.Mods.Common.Traits; +using OpenRA.Mods.Common.Warheads; +using OpenRA.Primitives; using OpenRA.Traits; namespace OpenRA.Mods.CA.Projectiles { + public enum LinearPulseImpactType + { + StandardImpact, + Rectangle, + Cone, + Trapezoid + } + + public enum FalloffBasis + { + DistanceFromCenter, + DistanceFromCenterLine, + DistanceFromSource + } + + public enum LinearPulseForceGroundType + { + None, + DamageOnly, + DamageAndVisual + } + + public class ProjectileAnimation + { + [Desc("Projectile animation image.")] + public readonly string Image = null; + + [Desc("Sequences of projectile animation to use, one will be picked randomly for each shot.")] + [SequenceReference(nameof(Image), allowNullImage: true)] + public readonly string[] Sequences = { "idle" }; + + [PaletteReference] + [Desc("Palette to use for the projectile animation.")] + public readonly string Palette = "effect"; + + [Desc("Visual speed of this projectile animation. Set to zero to use the same speed as the pulse.")] + public readonly WDist Speed = WDist.Zero; + + [Desc("Maximum distance travelled by this projectile animation. Zero falls back to weapon range.")] + public readonly WDist Range = WDist.Zero; + + [Desc("Delay before this projectile animation starts.")] + public readonly int[] Delay = { 0 }; + + [Desc("Does this projectile animation have a shadow?")] + public readonly bool Shadow = false; + + [Desc("Should this projectile animation repeat?")] + public readonly bool RepeatAnimation = true; + + [PaletteReference] + [Desc("Palette to use for this projectile animation's shadow if Shadow is true.")] + public readonly string ShadowPalette = "shadow"; + + [Desc("Offset of the projectile target.")] + public readonly WVec TargetOffset = WVec.Zero; + + [Desc("The maximum/constant/incremental inaccuracy used in conjunction with the InaccuracyType property.")] + public readonly WDist Inaccuracy = WDist.Zero; + + [Desc("Controls the way inaccuracy is calculated. Possible values are " + + "'Maximum' - scale from 0 to max with range, " + + "'PerCellIncrement' - scale from 0 with range, " + + "'Absolute' - use set value regardless of range.")] + public readonly InaccuracyType InaccuracyType = InaccuracyType.Maximum; + + [Desc("When set, display a line behind the actor. Length is measured in ticks after appearing.")] + public readonly int ContrailLength = 0; + + [Desc("Time (in ticks) after which the line should appear. Controls the distance to the actor.")] + public readonly int ContrailDelay = 1; + + [Desc("Equivalent to sequence ZOffset. Controls Z sorting.")] + public readonly int ContrailZOffset = 2047; + + [Desc("Thickness of the emitted line at the start of the contrail.")] + public readonly WDist ContrailStartWidth = new(64); + + [Desc("Thickness of the emitted line at the end of the contrail. Will default to " + nameof(ContrailStartWidth) + " if left undefined")] + public readonly WDist? ContrailEndWidth = null; + + [Desc("RGB color at the contrail start.")] + public readonly Color ContrailStartColor = Color.White; + + [Desc("Use player remap color instead of a custom color at the contrail the start.")] + public readonly bool ContrailStartColorUsePlayerColor = false; + + [Desc("The alpha value [from 0 to 255] of color at the contrail the start.")] + public readonly int ContrailStartColorAlpha = 255; + + [Desc("RGB color at the contrail end. Set to start color if undefined")] + public readonly Color? ContrailEndColor; + + [Desc("Use player remap color instead of a custom color at the contrail end.")] + public readonly bool ContrailEndColorUsePlayerColor = false; + + [Desc("The alpha value [from 0 to 255] of color at the contrail end.")] + public readonly int ContrailEndColorAlpha = 0; + + [Desc("Final impact animation.")] + public readonly string HitAnim = null; + + [SequenceReference(nameof(HitAnim), allowNullImage: true)] + [Desc("Sequence of impact animation to use.")] + public readonly string HitAnimSequence = "idle"; + + [PaletteReference] + public readonly string HitAnimPalette = "effect"; + + /// + /// This constructor is used solely for documentation generation. + /// + public ProjectileAnimation() { } + + public ProjectileAnimation(MiniYaml content) + { + FieldLoader.Load(this, content); + } + } + + public class ImpactAnimation + { + [Desc("Impact animation image.")] + public readonly string Image = null; + + [Desc("Sequences of impact animation to use, one will be picked randomly for each impact.")] + [SequenceReference(nameof(Image), allowNullImage: true)] + public readonly string[] Sequences = { "idle" }; + + [PaletteReference] + [Desc("Palette to use for the impact animation.")] + public readonly string Palette = "effect"; + + /// + /// This constructor is used solely for documentation generation. + /// + public ImpactAnimation() { } + + public ImpactAnimation(MiniYaml content) + { + FieldLoader.Load(this, content); + } + } + + public class DamageFalloff + { + [Desc("Damage modifier applied at each range step for Rectangle, Cone, and Trapezoid impact types.")] + public readonly int[] Falloff = { 100, 100 }; + + [Desc("Range between falloff steps for Rectangle, Cone, and Trapezoid impact types.")] + public readonly WDist Spread = new(43); + + [Desc("Ranges at which each Falloff step is defined for Rectangle and Cone impact types. Overrides Spread.")] + public readonly WDist[] Range = null; + + [Desc("Determines what distance is used for damage falloff calculation for Rectangle and Cone impact types.")] + public readonly FalloffBasis FalloffBasis = FalloffBasis.DistanceFromCenterLine; + + [Desc("Controls the way damage is calculated. Possible values are 'HitShape', 'ClosestTargetablePosition' and 'CenterPosition'.")] + public readonly DamageCalculationType DamageCalculationType = DamageCalculationType.HitShape; + + /// + /// This constructor is used solely for documentation generation. + /// + public DamageFalloff() { } + + public DamageFalloff(MiniYaml content) + { + FieldLoader.Load(this, content); + } + } + public class LinearPulseInfo : IProjectileInfo { - [Desc("Ticks between pulse impacts.")] - public readonly int ImpactInterval = 2; + [Desc("Type of impact for the pulse.")] + public readonly LinearPulseImpactType ImpactType = LinearPulseImpactType.StandardImpact; + + [Desc("Rectangle impact area length (parallel to the projectile path). Used with Rectangle impact type.")] + public readonly WDist RectangleLength = new(1024); + + [Desc("Rectangle impact area width (perpendicular to the projectile path). Used with Rectangle impact type.")] + public readonly WDist RectangleWidth = new(1024); + + [Desc("Cone angle in degrees for cone impact type. Used with Cone impact type.")] + public readonly int ConeAngle = 90; + + [Desc("Length of each cone segment for cone impact type. Used with Cone impact type.")] + public readonly WDist ConeSegmentLength = new(512); + + [Desc("Starting width of trapezoid at source position. Used with Trapezoid impact type.")] + public readonly WDist TrapezoidStartWidth = new(512); + + [Desc("Ending width of trapezoid at maximum range. Used with Trapezoid impact type.")] + public readonly WDist TrapezoidEndWidth = new(2048); + + [Desc("Length of each trapezoid segment. Used with Trapezoid impact type.")] + public readonly WDist TrapezoidSegmentLength = new(512); + + [Desc("Distance between pulse impacts. If zero, defaults to Speed")] + public readonly WDist ImpactInterval = WDist.Zero; [Desc("Speed the pulse travels.")] - public readonly WDist Speed = new WDist(384); + public readonly WDist Speed = WDist.FromCells(6); [Desc("Minimum distance travelled before doing damage.")] public readonly WDist MinimumImpactDistance = WDist.Zero; @@ -31,59 +234,186 @@ public class LinearPulseInfo : IProjectileInfo [Desc("Maximum distance travelled after which no more damage occurs. Zero falls back to weapon range.")] public readonly WDist MaximumImpactDistance = WDist.Zero; - [Desc("Maximum distance travelled by projectile visual (if present). Zero falls back to weapon range.")] - public readonly WDist ProjectileVisualRange = WDist.Zero; - - [Desc("Whether to ignore range modifiers, as these can mess up the relationship between ImpactSpacing, Speed and max range.")] + [Desc("Whether to ignore range modifiers, as these can mess up the relationship between ImpactInterval, Speed and max range.")] public readonly bool IgnoreRangeModifiers = true; [Desc("The maximum/constant/incremental inaccuracy used in conjunction with the InaccuracyType property.")] public readonly WDist Inaccuracy = WDist.Zero; - [Desc("Controls the way inaccuracy is calculated. Possible values are 'Maximum' - scale from 0 to max with range, 'PerCellIncrement' - scale from 0 with range and 'Absolute' - use set value regardless of range.")] + [Desc("Controls the way inaccuracy is calculated. Possible values are " + + "'Maximum' - scale from 0 to max with range, " + + "'PerCellIncrement' - scale from 0 with range, " + + "'Absolute' - use set value regardless of range.")] public readonly InaccuracyType InaccuracyType = InaccuracyType.Maximum; - [Desc("Image to display.")] - public readonly string Image = null; + [Desc("Whether to force the pulse to ground level. Possible values are " + + "'None' - neither damage nor visuals are forced to ground level, " + + "'DamageOnly' - damage is forced to ground level, but visuals are not, " + + "'DamageAndVisual' - the damage and visual effects (projectile and impact animations) are forced to ground level.")] + public readonly LinearPulseForceGroundType ForceGround = LinearPulseForceGroundType.None; - [SequenceReference(nameof(Image), allowNullImage: true)] - [Desc("Loop a randomly chosen sequence of Image from this list while this projectile is moving.")] - public readonly string[] Sequences = { "idle" }; + [Desc("If true (and not using Warhead impact type) then the same actor can only be impacted once.")] + public readonly bool SingleHitPerActor = false; - [Desc("The palette used to draw this projectile.")] - public readonly string Palette = "effect"; + [Desc("The minimum range at which friendly actors can be impacted (relative to source).")] + public readonly WDist MinimumFriendlyFireRange = WDist.Zero; - [Desc("Does this projectile have a shadow?")] - public readonly bool Shadow = false; + [Desc("Is this blocked by actors with BlocksProjectiles trait.")] + public readonly bool Blockable = false; - [Desc("Should the projectile animation repeat?")] - public readonly bool RepeatAnimation = true; + [Desc("Width of projectile (used for finding blocking actors).")] + public readonly WDist BlockableWidth = new(1); - [Desc("If true, forces pulse position to start at ground level.")] - public readonly bool ForceGround = false; + [Desc("Size of the area. A smudge will be created in each tile.", "Provide 2 values for a ring effect (outer/inner).")] + public readonly int[] SmudgeSize = { 0, 0 }; - [PaletteReference] - [Desc("Palette to use for this projectile's shadow if Shadow is true.")] - public readonly string ShadowPalette = "shadow"; + [Desc("Type of smudge to apply to terrain.")] + public readonly HashSet SmudgeType = new(); + + [Desc("Percentage chance the smudge is created.")] + public readonly int SmudgeChance = 100; + + [FieldLoader.LoadUsing(nameof(LoadImpactAnimations))] + public readonly List ImpactAnimations = new(); public IProjectile Create(ProjectileArgs args) { return new LinearPulse(this, args); } + + static object LoadImpactAnimations(MiniYaml yaml) + { + var retList = new List(); + foreach (var node in yaml.Nodes.Where(n => n.Key.StartsWith("ImpactAnimation", StringComparison.Ordinal))) + { + var impactAnim = new ImpactAnimation(node.Value); + retList.Add(impactAnim); + } + + return retList; + } + + [FieldLoader.LoadUsing(nameof(LoadProjectileAnimations))] + public readonly List ProjectileAnimations = new(); + + static object LoadProjectileAnimations(MiniYaml yaml) + { + var retList = new List(); + foreach (var node in yaml.Nodes.Where(n => n.Key.StartsWith("ProjectileAnimation", StringComparison.Ordinal))) + { + var projectileAnim = new ProjectileAnimation(node.Value); + retList.Add(projectileAnim); + } + + return retList; + } + + [FieldLoader.LoadUsing(nameof(LoadDamageFalloffs))] + public readonly List DamageFalloffs = new(); + + static object LoadDamageFalloffs(MiniYaml yaml) + { + var retList = new List(); + foreach (var node in yaml.Nodes.Where(n => n.Key.StartsWith("DamageFalloff", StringComparison.Ordinal))) + { + var falloff = new DamageFalloff(node.Value); + retList.Add(falloff); + } + + return retList; + } + + // To suppress errors + public readonly ImpactAnimation ImpactAnimation = null; + public readonly DamageFalloff DamageFalloff = null; + public readonly ProjectileAnimation ProjectileAnimation = null; + } + + public class ProjectileAnimationState + { + public readonly ProjectileAnimation Config; + public readonly Animation Animation; + public readonly WVec DirectionalSpeed; + public readonly int Range; + public readonly ContrailRenderable Contrail; + public WPos Position; + public int TotalDistanceTravelled; + public bool TravelComplete; + public int RemainingDelay; + public bool HitAnimationCreated; + + public ProjectileAnimationState(ProjectileAnimation config, Animation animation, WVec directionalSpeed, int range, WPos startPos, ContrailRenderable contrail = null) + { + Config = config; + Animation = animation; + DirectionalSpeed = directionalSpeed; + Range = range; + Position = startPos; + Contrail = contrail; + TotalDistanceTravelled = 0; + TravelComplete = false; + RemainingDelay = 0; + HitAnimationCreated = false; + } + + public void UpdatePosition(bool blocked) + { + if (RemainingDelay > 0) + { + RemainingDelay--; + return; + } + + if (!TravelComplete && !blocked) + { + var remainingRange = Range - TotalDistanceTravelled; + var speedLength = DirectionalSpeed.Length; + + if (remainingRange <= 0) + { + TravelComplete = true; + } + else if (speedLength <= remainingRange) + { + Position += DirectionalSpeed; + TotalDistanceTravelled += speedLength; + } + else + { + var partialMove = DirectionalSpeed * remainingRange / speedLength; + Position += partialMove; + TotalDistanceTravelled = Range; + TravelComplete = true; + } + } + + TravelComplete = TravelComplete || TotalDistanceTravelled >= Range || blocked; + } + + public void SetBlockedPosition(WPos blockedPos, WPos source) + { + Position = blockedPos; + TotalDistanceTravelled = (blockedPos - source).Length; + } } public class LinearPulse : IProjectile, ISync { readonly LinearPulseInfo info; readonly ProjectileArgs args; - readonly WDist speed; + readonly WVec speed; + readonly WVec directionalSpeed; + readonly WDist impactInterval; + readonly WAngle facing; - readonly Animation anim; + readonly List projectileAnimations = new(); [Sync] WPos pos, target, source; int ticks; - int intervalTicks; int totalDistanceTravelled; - int range; - int projectileRange; + bool travelComplete; + bool blocked; + readonly int range; + readonly WPos[] impactPositions; + readonly HashSet impactedActors = new(); public Actor SourceActor { get { return args.SourceActor; } } @@ -91,7 +421,11 @@ public LinearPulse(LinearPulseInfo info, ProjectileArgs args) { this.info = info; this.args = args; - speed = info.Speed; + + speed = new WVec(0, -info.Speed.Length, 0); + + impactInterval = info.ImpactInterval > WDist.Zero ? info.ImpactInterval : info.Speed; + source = args.Source; var world = args.SourceActor.World; @@ -99,110 +433,1315 @@ public LinearPulse(LinearPulseInfo info, ProjectileArgs args) // projectile starts at the source position pos = args.Source; - if (info.ForceGround) - pos = new WPos(pos.X, pos.Y, 0); - // initially no distance has been travelled by the pulse totalDistanceTravelled = 0; // the weapon range (total distance to be travelled) - range = args.Weapon.Range.Length; - projectileRange = info.ProjectileVisualRange == WDist.Zero ? range : info.ProjectileVisualRange.Length; + range = info.MaximumImpactDistance.Length > args.Weapon.Range.Length ? info.MaximumImpactDistance.Length : args.Weapon.Range.Length; if (!info.IgnoreRangeModifiers) - range = OpenRA.Mods.Common.Util.ApplyPercentageModifiers(range, args.RangeModifiers); + { + range = Common.Util.ApplyPercentageModifiers(range, args.RangeModifiers); + } target = args.PassiveTarget; // get the offset of the source compared to source actor's center and apply the same offset to the target (so the linear pulse always travels parallel to the source actor's facing) var offsetFromCenter = source - args.SourceActor.CenterPosition; - target = target + offsetFromCenter; + target += offsetFromCenter; if (info.Inaccuracy.Length > 0) { - var maxInaccuracyOffset = OpenRA.Mods.Common.Util.GetProjectileInaccuracy(info.Inaccuracy.Length, info.InaccuracyType, args); + var maxInaccuracyOffset = Common.Util.GetProjectileInaccuracy(info.Inaccuracy.Length, info.InaccuracyType, args); target += WVec.FromPDF(world.SharedRandom, 2) * maxInaccuracyOffset / 1024; } facing = (target - pos).Yaw; - if (!string.IsNullOrEmpty(info.Image)) + // calculate the vectors for travel + directionalSpeed = speed.Rotate(WRot.FromYaw(facing)); + + // calculate impact positions + var impactCount = range / impactInterval.Length; + var impactVector = new WVec(0, -impactInterval.Length, 0).Rotate(WRot.FromYaw(facing)); + + impactPositions = Enumerable.Range(0, impactCount) + .Select(i => pos + impactVector * (i + 1)) + .ToArray(); + + foreach (var projectileAnim in info.ProjectileAnimations) { - anim = new Animation(world, info.Image, new Func(GetEffectiveFacing)); + if (!string.IsNullOrEmpty(projectileAnim.Image)) + { + var projectileRange = projectileAnim.Range == WDist.Zero ? range : projectileAnim.Range.Length; - if (info.RepeatAnimation) - anim.PlayRepeating(info.Sequences.Random(world.SharedRandom)); - else - anim.Play(info.Sequences.Random(world.SharedRandom)); + // calculate target with offset and inaccuracy for this animation + // convert TargetOffset to forward, right, up format like Armament does + var convertedOffset = new WVec(projectileAnim.TargetOffset.Y, -projectileAnim.TargetOffset.X, projectileAnim.TargetOffset.Z); + var rotatedOffset = convertedOffset.Rotate(WRot.FromYaw(facing)); + + // create a target at maximum range to ensure consistent offset spacing + var maxRangeTarget = pos + new WVec(0, -projectileRange, 0).Rotate(WRot.FromYaw(facing)); + var animTarget = maxRangeTarget + rotatedOffset; + var distanceToAnimTarget = (animTarget - pos).Length; + + if (projectileAnim.Inaccuracy.Length > 0) + { + var maxInaccuracyOffset = Common.Util.GetProjectileInaccuracy(projectileAnim.Inaccuracy.Length, projectileAnim.InaccuracyType, args); + animTarget += WVec.FromPDF(world.SharedRandom, 2) * maxInaccuracyOffset / 1024; + } + + var animFacing = (animTarget - pos).Yaw; + + var animation = new Animation(world, projectileAnim.Image, new Func(() => GetEffectiveFacingForAnimation(animFacing))); + + if (projectileAnim.RepeatAnimation) + animation.PlayRepeating(projectileAnim.Sequences.Random(world.SharedRandom)); + else + animation.Play(projectileAnim.Sequences.Random(world.SharedRandom)); + + var projectileSpeed = projectileAnim.Speed != WDist.Zero ? new WVec(0, -projectileAnim.Speed.Length, 0) : speed; + var projectileDirectionalSpeed = projectileSpeed.Rotate(WRot.FromYaw(animFacing)); + + var animRange = distanceToAnimTarget; + if (!info.IgnoreRangeModifiers) + { + animRange = Common.Util.ApplyPercentageModifiers(animRange, args.RangeModifiers); + } + + ContrailRenderable contrail = null; + if (projectileAnim.ContrailLength > 0) + { + var startcolor = projectileAnim.ContrailStartColorUsePlayerColor + ? Color.FromArgb(projectileAnim.ContrailStartColorAlpha, args.SourceActor.OwnerColor()) + : Color.FromArgb(projectileAnim.ContrailStartColorAlpha, projectileAnim.ContrailStartColor); + + var endcolor = projectileAnim.ContrailEndColorUsePlayerColor + ? Color.FromArgb(projectileAnim.ContrailEndColorAlpha, args.SourceActor.OwnerColor()) + : Color.FromArgb(projectileAnim.ContrailEndColorAlpha, projectileAnim.ContrailEndColor ?? startcolor); + + contrail = new ContrailRenderable(world, args.SourceActor, + startcolor, projectileAnim.ContrailStartColorUsePlayerColor, + endcolor, projectileAnim.ContrailEndColor == null ? projectileAnim.ContrailStartColorUsePlayerColor : projectileAnim.ContrailEndColorUsePlayerColor, + projectileAnim.ContrailStartWidth, + projectileAnim.ContrailEndWidth ?? projectileAnim.ContrailStartWidth, + projectileAnim.ContrailLength, projectileAnim.ContrailDelay, projectileAnim.ContrailZOffset); + } + + var visualGrounded = info.ForceGround == LinearPulseForceGroundType.DamageAndVisual; + var initialPosition = visualGrounded ? new WPos(args.Source.X, args.Source.Y, 0) : args.Source; + + var animState = new ProjectileAnimationState(projectileAnim, animation, projectileDirectionalSpeed, animRange, initialPosition, contrail); + + if (projectileAnim.Delay.Length == 1) + animState.RemainingDelay = projectileAnim.Delay[0]; + else if (projectileAnim.Delay.Length >= 2) + animState.RemainingDelay = world.SharedRandom.Next(projectileAnim.Delay[0], projectileAnim.Delay[1] + 1); + + projectileAnimations.Add(animState); + } } } public void Tick(World world) { - anim?.Tick(); + foreach (var animState in projectileAnimations) + { + if (animState.RemainingDelay == 0) + animState.Animation?.Tick(); + + if (animState.Contrail != null && animState.RemainingDelay == 0) + animState.Contrail.Update(animState.Position); + } var lastPos = pos; - var convertedVelocity = new WVec(0, -speed.Length, 0); - var velocity = convertedVelocity.Rotate(WRot.FromYaw(facing)); - pos = pos + velocity; - totalDistanceTravelled += speed.Length; - intervalTicks++; + if (!travelComplete && !blocked) + pos += directionalSpeed; + + foreach (var animState in projectileAnimations) + animState.UpdatePosition(blocked); - if (intervalTicks >= info.ImpactInterval) + if (info.Blockable && !blocked && BlocksProjectiles.AnyBlockingActorsBetween(world, args.SourceActor.Owner, lastPos, pos, info.BlockableWidth, out var blockedPos)) { - intervalTicks = 0; - if (totalDistanceTravelled >= info.MinimumImpactDistance.Length && (info.MaximumImpactDistance == WDist.Zero || totalDistanceTravelled <= info.MaximumImpactDistance.Length)) - Explode(world); + pos = blockedPos; + blocked = true; + totalDistanceTravelled = (blockedPos - source).Length; + + foreach (var animState in projectileAnimations) + animState.SetBlockedPosition(blockedPos, source); + } + else + { + totalDistanceTravelled += info.Speed.Length; + } + + if (!travelComplete) + { + for (var idx = 0; idx < impactPositions.Length; idx++) + { + var impactDistance = (idx + 1) * impactInterval.Length; + + if (impactDistance < info.MinimumImpactDistance.Length) + continue; + + if (impactDistance > totalDistanceTravelled || (info.MaximumImpactDistance.Length > 0 && impactDistance > info.MaximumImpactDistance.Length)) + break; + + if (impactDistance > totalDistanceTravelled - speed.Length) + Explode(impactPositions[idx]); + } + } + + travelComplete = totalDistanceTravelled >= range || blocked; + + // Create hit animations for individual projectiles when they complete + foreach (var animState in projectileAnimations) + { + if (animState.TravelComplete && !animState.HitAnimationCreated && !string.IsNullOrEmpty(animState.Config.HitAnim)) + { + animState.HitAnimationCreated = true; + var palette = animState.Config.HitAnimPalette; + var animFacing = animState.DirectionalSpeed.Yaw; + world.AddFrameEndTask(w => w.Add(new SpriteEffect(animState.Position, w, animState.Config.HitAnim, animState.Config.HitAnimSequence, palette))); + } } - if (totalDistanceTravelled >= range) + // Check if all projectile animations are complete + var allProjectileTravelComplete = projectileAnimations.Count == 0 || projectileAnimations.All(a => a.TravelComplete); + + if (travelComplete && allProjectileTravelComplete) + { + // Add contrail faders for all animations that have contrails + foreach (var animState in projectileAnimations) + { + if (animState.Contrail != null) + world.AddFrameEndTask(w => w.Add(new ContrailFader(animState.Position, animState.Contrail))); + } + world.AddFrameEndTask(w => w.Remove(this)); + } ticks++; } - WAngle GetEffectiveFacing() + WAngle GetEffectiveFacingForAnimation(WAngle animFacing) { var angle = WAngle.Zero; var at = (float)ticks / (speed.Length - 1); var attitude = angle.Tan() * (1 - 2 * at) / (4 * 1024); - var u = (facing.Angle % 512) / 512f; + var u = animFacing.Angle % 512 / 512f; var scale = 2048 * u * (1 - u); - var effective = (int)(facing.Angle < 512 - ? facing.Angle - scale * attitude - : facing.Angle + scale * attitude); + var effective = (int)(animFacing.Angle < 512 + ? animFacing.Angle - scale * attitude + : animFacing.Angle + scale * attitude); return new WAngle(effective); } public IEnumerable Render(WorldRenderer wr) { - if (anim == null || totalDistanceTravelled >= projectileRange) - yield break; + var world = args.SourceActor.World; + + foreach (var animState in projectileAnimations) + { + // Don't render animations that are still delayed + if (animState.RemainingDelay > 0) + continue; + + // Render contrail first if this animation has one + if (animState.Contrail != null) + yield return animState.Contrail; + + if (animState.Animation == null || animState.TravelComplete) + continue; + + if (!world.FogObscures(animState.Position)) + { + // Find the corresponding ProjectileAnimation config for this animation state + var projectileAnim = animState.Config; + if (animState.Config != null) + { + if (projectileAnim.Shadow) + { + var dat = world.Map.DistanceAboveTerrain(animState.Position); + var shadowPos = animState.Position - new WVec(0, 0, dat.Length); + foreach (var r in animState.Animation.Render(shadowPos, wr.Palette(projectileAnim.ShadowPalette))) + yield return r; + } + + var palette = wr.Palette(projectileAnim.Palette); + foreach (var r in animState.Animation.Render(animState.Position, palette)) + yield return r; + } + } + } + } + + void Explode(WPos impactPos) + { + // Create hit animations if specified + var world = args.SourceActor.World; + var damageGrounded = info.ForceGround != LinearPulseForceGroundType.None; + var visualGrounded = info.ForceGround == LinearPulseForceGroundType.DamageAndVisual; + var impactPosForDamage = damageGrounded ? new WPos(impactPos.X, impactPos.Y, 0) : impactPos; + var impactPosForVisual = visualGrounded ? new WPos(impactPos.X, impactPos.Y, 0) : impactPos; + + foreach (var impactAnim in info.ImpactAnimations) + { + if (!string.IsNullOrEmpty(impactAnim.Image)) + { + // Pick a random sequence for this impact + var sequence = impactAnim.Sequences.Random(world.SharedRandom); + + // Create SpriteEffect with facing + world.AddFrameEndTask(w => w.Add(new SpriteEffect(impactPosForVisual, facing, w, impactAnim.Image, sequence, impactAnim.Palette))); + } + } + + if (info.SmudgeType.Any()) + { + DoSmudge(Target.FromPos(impactPosForDamage), new WarheadArgs(args)); + } + + switch (info.ImpactType) + { + case LinearPulseImpactType.StandardImpact: + args.Weapon.Impact(Target.FromPos(impactPosForDamage), new WarheadArgs(args)); + break; + case LinearPulseImpactType.Rectangle: + ExplodeRectangle(impactPosForDamage); + break; + case LinearPulseImpactType.Cone: + ExplodeCone(impactPosForDamage); + break; + case LinearPulseImpactType.Trapezoid: + ExplodeTrapezoid(impactPosForDamage); + break; + } + } + void ExplodeRectangle(WPos impactPos) + { var world = args.SourceActor.World; - if (!world.FogObscures(pos)) + + // Calculate rectangle dimensions and orientation + var halfLength = info.RectangleLength.Length / 2; + var halfWidth = info.RectangleWidth.Length / 2; + + // Rectangle is oriented along the projectile's path + var direction = target - source; + if (direction.Length == 0) + return; + + var forwardDir = direction * 1024 / direction.Length; // Normalized forward direction + var rightDir = new WVec(-forwardDir.Y, forwardDir.X, 0); // Perpendicular direction + + // Calculate rectangle corners centered on impact position + var lengthOffset = forwardDir * halfLength / 1024; + var widthOffset = rightDir * halfWidth / 1024; + + var corner1 = impactPos - lengthOffset - widthOffset; + var corner2 = impactPos - lengthOffset + widthOffset; + var corner3 = impactPos + lengthOffset + widthOffset; + var corner4 = impactPos + lengthOffset - widthOffset; + + // Debug visualization - use the actual rectangle corners for grounded visualization + var debugVis = world.WorldActor.TraitOrDefault(); + if (debugVis != null && debugVis.CombatGeometry) + { + var caDebug = world.WorldActor.TraitOrDefault(); + if (caDebug != null) + { + // Use grounded corners if ForceGround is set for damage + WPos[] vizCorners; + if (info.ForceGround != LinearPulseForceGroundType.None) + { + // Ground the corners for visualization to match damage area + vizCorners = new WPos[] + { + new(corner1.X, corner1.Y, 0), + new(corner2.X, corner2.Y, 0), + new(corner3.X, corner3.Y, 0), + new(corner4.X, corner4.Y, 0) + }; + } + else + { + vizCorners = new WPos[] { corner1, corner2, corner3, corner4 }; + } + + caDebug.AddPolygonOutline(vizCorners, Color.Red); + } + } + + // Find all actors intersecting with the rectangle + var searchRadius = new WDist(Math.Max(halfLength, halfWidth) + 512); // Add buffer for safety + var nearbyActors = world.FindActorsInCircle(impactPos, searchRadius); + + foreach (var actor in nearbyActors) { - if (info.Shadow) + // Skip if SingleHitPerActor is enabled and we've already hit this actor + if (info.SingleHitPerActor && impactedActors.Contains(actor)) + continue; + + // Skip friendly actors if they are too close to the source + if (info.MinimumFriendlyFireRange > WDist.Zero) { - var dat = world.Map.DistanceAboveTerrain(pos); - var shadowPos = pos - new WVec(0, 0, dat.Length); - foreach (var r in anim.Render(shadowPos, wr.Palette(info.ShadowPalette))) - yield return r; + var actorDistanceFromSource = (actor.CenterPosition - source).Length; + if (actorDistanceFromSource < info.MinimumFriendlyFireRange.Length && + args.SourceActor.Owner.RelationshipWith(actor.Owner).HasRelationship(PlayerRelationship.Ally)) + continue; } - var palette = wr.Palette(info.Palette); - foreach (var r in anim.Render(pos, palette)) - yield return r; + // Check if actor intersects with the rectangle + if (IsActorInRectangle(actor, corner1, corner2, corner3, corner4)) + { + // Calculate falloff data for all configured DamageFalloff settings + var falloffData = new List<(DamageFalloff Falloff, int FalloffDistance)>(); + + // If no DamageFalloffs are configured, apply damage without any falloff + if (info.DamageFalloffs.Count == 0) + { + ApplyDamageToActor(actor, impactPos, falloffData); + } + else + { + foreach (var damageFalloff in info.DamageFalloffs) + { + // Find the closest HitShape to the reference point for this falloff + HitShape closestActiveShape = null; + var closestDistance = int.MaxValue; + + // PERF: Avoid using TraitsImplementing that needs to find the actor in the trait dictionary. + foreach (var targetPos in actor.EnabledTargetablePositions) + { + if (targetPos is HitShape h) + { + var referencePoint = GetReferencePoint(actor, impactPos, damageFalloff); + var distance = h.DistanceFromEdge(actor, referencePoint).Length; + if (distance < closestDistance) + { + closestDistance = distance; + closestActiveShape = h; + } + } + } + + // Cannot be damaged without an active HitShape for HitShape calculation type + if (damageFalloff.DamageCalculationType == DamageCalculationType.HitShape && closestActiveShape == null) + continue; + + // Calculate damage falloff distance based on the selected calculation type + var falloffDistance = damageFalloff.DamageCalculationType switch + { + DamageCalculationType.HitShape => closestDistance, + DamageCalculationType.ClosestTargetablePosition => actor.GetTargetablePositions() + .Where(x => IsPointInRectangle(x, corner1, corner2, corner3, corner4)) + .DefaultIfEmpty(actor.CenterPosition) + .Min(x => CalculateFalloffDistance(x, impactPos, damageFalloff)), + DamageCalculationType.CenterPosition => CalculateFalloffDistance(actor.CenterPosition, impactPos, damageFalloff), + _ => CalculateFalloffDistance(actor.CenterPosition, impactPos, damageFalloff) + }; + + falloffData.Add((damageFalloff, falloffDistance)); + } + + // If we have falloff data, apply damage + if (falloffData.Count > 0) + { + ApplyDamageToActor(actor, impactPos, falloffData); + } + } + + if (info.SingleHitPerActor) + impactedActors.Add(actor); + } } } - void Explode(World world) + void ApplyDamageToActor(Actor actor, WPos impactPos, List<(DamageFalloff Falloff, int FalloffDistance)> falloffData) { - args.Weapon.Impact(Target.FromPos(pos), new WarheadArgs(args)); + // Calculate all damage modifiers from the falloffs + var damageModifiers = new List(args.DamageModifiers); + + foreach (var (falloff, distance) in falloffData) + { + var modifier = GetFalloffModifier(falloff, distance); + damageModifiers.Add(modifier); + } + + // If the sum of all modifiers is zero, we can skip applying damage + if (damageModifiers.Sum() == 0) + return; + + var impactOrientation = new WRot(WAngle.Zero, WAngle.Zero, facing); + + // If a warhead lands outside the victim's area, calculate impact angles + // Use the first falloff's distance for impact angle calculation + if (falloffData.Count > 0 && falloffData[0].FalloffDistance > 0) + { + var referencePoint = GetReferencePoint(actor, impactPos, falloffData[0].Falloff); + var towardsTargetYaw = (actor.CenterPosition - referencePoint).Yaw; + impactOrientation = new WRot(WAngle.Zero, WAngle.Zero, towardsTargetYaw); + } + + var warheadArgs = new WarheadArgs(args) + { + ImpactOrientation = impactOrientation, + ImpactPosition = actor.CenterPosition, + DamageModifiers = damageModifiers.ToArray(), + }; + + args.Weapon.Impact(Target.FromActor(actor), warheadArgs); + } + + void ExplodeCone(WPos impactPos) + { + var world = args.SourceActor.World; + + // Calculate distance from source to impact position (respecting damage grounding) + var distanceFromSource = (impactPos - source).Length; // Grounded distance calculation + + // Calculate the radius of the cone at this distance + var halfConeAngleRadians = info.ConeAngle * Math.PI / 360.0; // Convert degrees to radians and divide by 2 + + // Calculate the cone segment boundaries, clamped to [0, range] + var segmentHalf = info.ConeSegmentLength.Length / 2; + var segmentStart = Math.Max(0, distanceFromSource - segmentHalf); + var segmentEnd = Math.Min(range, distanceFromSource + segmentHalf); + + // In 2D top-down, the cone is a wedge from the apex: arcs are centered at the apex with radius equal to distance from source + var startRadius = segmentStart; + var endRadius = segmentEnd; + var maxRadius = Math.Max(startRadius, endRadius); + + // Use the fixed projectile direction, not the direction to current impact + var forwardDir = directionalSpeed; + if (forwardDir.Length == 0) + return; + + var normalizedForwardDir = forwardDir * 1024 / forwardDir.Length; + + // Debug visualization + var debugVis = world.WorldActor.TraitOrDefault(); + if (debugVis != null && debugVis.CombatGeometry) + { + var caDebug = world.WorldActor.TraitOrDefault(); + if (caDebug != null) + { + // When ForceGround is true, visualize the cone at ground level + var vizSource = info.ForceGround != LinearPulseForceGroundType.None ? new WPos(source.X, source.Y, 0) : source; + + // Visualize the overall cone as a single large segment from 0..range + var maxRange = range; + var maxConeRadius = maxRange; + caDebug.AddConeSegmentImpact(vizSource, normalizedForwardDir, 0, maxRange, 0, maxConeRadius, info.ConeAngle, Color.Yellow); + + // Visualize the individual cone segment in red + // Create a cone segment showing the actual truncated section + caDebug.AddConeSegmentImpact(vizSource, normalizedForwardDir, segmentStart, segmentEnd, startRadius, endRadius, info.ConeAngle, Color.Red); + } + } + + // Find all actors within the cone segment + var searchRadius = new WDist(maxRadius + 512); // Add buffer for safety + var segMid = (segmentStart + segmentEnd) / 2; + var segCenter = source + normalizedForwardDir * segMid / 1024; + var nearbyActors = world.FindActorsInCircle(segCenter, searchRadius); + + foreach (var actor in nearbyActors) + { + // Skip if SingleHitPerActor is enabled and we've already hit this actor + if (info.SingleHitPerActor && impactedActors.Contains(actor)) + continue; + + // Skip friendly actors if they are too close to the source + if (info.MinimumFriendlyFireRange > WDist.Zero) + { + var actorDistanceFromSource = (actor.CenterPosition - source).Length; + if (actorDistanceFromSource < info.MinimumFriendlyFireRange.Length && + args.SourceActor.Owner.RelationshipWith(actor.Owner).HasRelationship(PlayerRelationship.Ally)) + continue; + } + + // Check if actor is within the cone segment using the fixed forward direction + if (IsActorInConeSegment(actor, source, normalizedForwardDir, segmentStart, segmentEnd, halfConeAngleRadians)) + { + // Calculate falloff data for all configured DamageFalloff settings + var falloffData = new List<(DamageFalloff Falloff, int FalloffDistance)>(); + + // If no DamageFalloffs are configured, apply damage without any falloff + if (info.DamageFalloffs.Count == 0) + { + ApplyDamageToActor(actor, impactPos, falloffData); + } + else + { + foreach (var damageFalloff in info.DamageFalloffs) + { + // Find the closest HitShape to the reference point for this falloff + HitShape closestActiveShape = null; + var closestDistance = int.MaxValue; + + // PERF: Avoid using TraitsImplementing that needs to find the actor in the trait dictionary. + foreach (var targetPos in actor.EnabledTargetablePositions) + { + if (targetPos is HitShape h) + { + var referencePoint = GetReferencePoint(actor, impactPos, damageFalloff); + var distance = h.DistanceFromEdge(actor, referencePoint).Length; + if (distance < closestDistance) + { + closestDistance = distance; + closestActiveShape = h; + } + } + } + + // Cannot be damaged without an active HitShape for HitShape calculation type + if (damageFalloff.DamageCalculationType == DamageCalculationType.HitShape && closestActiveShape == null) + continue; + + // Calculate damage falloff distance based on the selected calculation type + var falloffDistance = damageFalloff.DamageCalculationType switch + { + DamageCalculationType.HitShape => closestDistance, + DamageCalculationType.ClosestTargetablePosition => actor.GetTargetablePositions() + .Min(x => CalculateFalloffDistance(x, impactPos, damageFalloff)), + DamageCalculationType.CenterPosition => CalculateFalloffDistance(actor.CenterPosition, impactPos, damageFalloff), + _ => CalculateFalloffDistance(actor.CenterPosition, impactPos, damageFalloff) + }; + + falloffData.Add((damageFalloff, falloffDistance)); + } + + // If we have falloff data, apply damage + if (falloffData.Count > 0) + { + ApplyDamageToActor(actor, impactPos, falloffData); + } + } + + if (info.SingleHitPerActor) + impactedActors.Add(actor); + } + } + } + + void ExplodeTrapezoid(WPos impactPos) + { + var world = args.SourceActor.World; + + // When ForceGround is enabled, use grounded source for all calculations to match visualization + var effectiveSource = info.ForceGround != LinearPulseForceGroundType.None ? new WPos(source.X, source.Y, 0) : source; + + // Calculate distance from source to impact position using XY only to avoid Z-component errors + var distanceFromSource = (impactPos - effectiveSource).Length; + + // Use the trapezoid segment length to determine how many segments we need + var segmentLength = info.TrapezoidSegmentLength.Length; + + // Calculate the forward direction vector + var forwardDir = directionalSpeed; + if (forwardDir.Length == 0) + { + // Fallback: use the direction from source to impact + forwardDir = impactPos - source; + } + + // Debug visualization (overall trapezoid outline) + var debugVis = world.WorldActor.TraitOrDefault(); + if (debugVis != null && debugVis.CombatGeometry) + { + var caDebug = world.WorldActor.TraitOrDefault(); + if (caDebug != null) + { + // Use exact overall trapezoid from start (0) to full range with configured widths + GetTrapezoidCorners(effectiveSource, forwardDir, 0, range, info.TrapezoidStartWidth.Length, info.TrapezoidEndWidth.Length, + out var o1, out var o2, out var o3, out var o4); + caDebug.AddPolygonOutline(new[] { o1, o2, o3, o4 }, Color.Yellow, 1); + } + } + + // Compute the single active segment around the current impact distance + var segStart = Math.Max(0, distanceFromSource - segmentLength / 2); + var segEnd = Math.Min(range, distanceFromSource + segmentLength / 2); + + // Calculate trapezoid width at start and end of this segment using integer math + // to ensure consistent results at segment boundaries + var startWidthAtSeg = GetTrapezoidWidthAtDistance(segStart); + var endWidthAtSeg = GetTrapezoidWidthAtDistance(segEnd); + + // Debug visualization for this segment (exact trapezoid outline) + if (debugVis != null && debugVis.CombatGeometry) + { + var caDebug = world.WorldActor.TraitOrDefault(); + if (caDebug != null) + { + GetTrapezoidCorners(effectiveSource, forwardDir, segStart, segEnd, startWidthAtSeg, endWidthAtSeg, + out var corner1, out var corner2, out var corner3, out var corner4); + caDebug.AddPolygonOutline(new[] { corner1, corner2, corner3, corner4 }, Color.Red, 1); + } + } + + // Find actors in this trapezoid segment + { + var maxWidth = Math.Max(startWidthAtSeg, endWidthAtSeg); + var halfMaxWidth = maxWidth / 2; + var segMid = (segStart + segEnd) / 2; + var normalizedForwardDir = Normalize1024OrDefault(forwardDir); + var segCenter = effectiveSource + normalizedForwardDir * segMid / 1024; + var searchRadius = new WDist((segEnd - segStart) / 2 + halfMaxWidth + 512); + + foreach (var actor in world.FindActorsInCircle(segCenter, searchRadius)) + { + if (info.SingleHitPerActor && impactedActors.Contains(actor)) + continue; + + // Skip friendly actors if they are too close to the source + if (info.MinimumFriendlyFireRange > WDist.Zero) + { + var actorDistanceFromSource = (actor.CenterPosition - source).Length; + if (actorDistanceFromSource < info.MinimumFriendlyFireRange.Length && + args.SourceActor.Owner.RelationshipWith(actor.Owner).HasRelationship(PlayerRelationship.Ally)) + continue; + } + + if (IsActorInTrapezoidSegment(actor, effectiveSource, forwardDir, segStart, segEnd, startWidthAtSeg, endWidthAtSeg)) + { + // Calculate falloff data for all configured DamageFalloff settings + var falloffData = new List<(DamageFalloff Falloff, int FalloffDistance)>(); + + // If no DamageFalloffs are configured, apply damage without any falloff + if (info.DamageFalloffs.Count == 0) + { + ApplyDamageToActor(actor, impactPos, falloffData); + } + else + { + foreach (var damageFalloff in info.DamageFalloffs) + { + // Calculate damage falloff distance similar to rectangle/cone + var closestDistance = int.MaxValue; + HitShape closestActiveShape = null; + + foreach (var targetPos in actor.EnabledTargetablePositions) + { + if (targetPos is HitShape h && h.IsTraitEnabled()) + { + var referencePoint = GetReferencePoint(actor, impactPos, damageFalloff); + var distance = h.DistanceFromEdge(actor, referencePoint).Length; + if (distance < closestDistance) + { + closestDistance = distance; + closestActiveShape = h; + } + } + } + + // Skip actors without active HitShape for HitShape calculation type + if (damageFalloff.DamageCalculationType == DamageCalculationType.HitShape && closestActiveShape == null) + continue; + + // Calculate damage falloff distance based on the selected calculation type + var falloffDistance = damageFalloff.DamageCalculationType switch + { + DamageCalculationType.HitShape => closestDistance, + DamageCalculationType.ClosestTargetablePosition => actor.GetTargetablePositions() + .Where(x => IsPositionInTrapezoidSegment(x, effectiveSource, forwardDir, segStart, segEnd, startWidthAtSeg, endWidthAtSeg)) + .DefaultIfEmpty(actor.CenterPosition) + .Min(x => CalculateFalloffDistance(x, impactPos, damageFalloff)), + DamageCalculationType.CenterPosition => CalculateFalloffDistance(actor.CenterPosition, impactPos, damageFalloff), + _ => CalculateFalloffDistance(actor.CenterPosition, impactPos, damageFalloff) + }; + + falloffData.Add((damageFalloff, falloffDistance)); + } + + // If we have falloff data, apply damage + if (falloffData.Count > 0) + { + ApplyDamageToActor(actor, impactPos, falloffData); + } + } + + if (info.SingleHitPerActor) + impactedActors.Add(actor); + } + } + } + } + + static bool ActorHasHitShape(Actor actor) + { + foreach (var targetPos in actor.EnabledTargetablePositions) + { + if (targetPos is HitShape) + return true; + } + + return false; + } + + static bool IsActorInConeSegment(Actor actor, WPos source, WVec forwardDir, int segmentStart, int segmentEnd, double halfConeAngleRadians) + { + // Check if cone segment intersects with actor's HitShape + if (ActorHasHitShape(actor)) + { + // For HitShape-enabled actors, check both intersection and containment + foreach (var targetPos in actor.EnabledTargetablePositions) + { + if (targetPos is HitShape h) + { + // First check: Is the HitShape fully within the segment? + // Test if the actor's center is within the segment - if so, the HitShape might be fully contained + if (IsPositionInConeSegment(actor.CenterPosition, source, forwardDir, segmentStart, segmentEnd, halfConeAngleRadians)) + { + // Check if all edges of the segment are outside or on the HitShape boundary + // If the center is in and no segment edges penetrate the HitShape, then HitShape is fully contained + var closestPoint = FindClosestPointOnConeSegmentOutline(actor.CenterPosition, source, forwardDir, segmentStart, segmentEnd, halfConeAngleRadians); + var distanceToOutline = h.DistanceFromEdge(actor, closestPoint); + + // If center is in segment and closest outline point is outside HitShape, then HitShape is fully within segment + if (distanceToOutline.Length > 0) + return true; + } + + // Second check: Does the segment outline intersect with the HitShape? + var closestPoint2 = FindClosestPointOnConeSegmentOutline(actor.CenterPosition, source, forwardDir, segmentStart, segmentEnd, halfConeAngleRadians); + var distance = h.DistanceFromEdge(actor, closestPoint2); + + // Check if the closest point is inside the HitShape OR if HitShape is very close (intersecting) + if (distance == WDist.Zero || distance.Length <= 64) // Small tolerance for edge intersection + return true; + } + } + + return false; + } + + // Fallback: center position only for actors without HitShapes + return IsPositionInConeSegment(actor.CenterPosition, source, forwardDir, segmentStart, segmentEnd, halfConeAngleRadians); + } + + static bool IsPositionInConeSegment(WPos position, WPos source, WVec forwardDir, int segmentStart, int segmentEnd, double halfConeAngleRadians) + { + // Use XY-only vector from source to position + var toPosition = new WVec(position.X - source.X, position.Y - source.Y, 0); + + // Check if position is within the distance range of the segment + var distanceToPosition = toPosition.Length; + if (distanceToPosition < segmentStart || distanceToPosition > segmentEnd) + return false; + + // Check if position is within the cone angle + if (toPosition.Length == 0) + return true; // Position is at source position + + // Calculate the angle between forward direction and direction to position + var dotProduct = (long)forwardDir.X * toPosition.X + (long)forwardDir.Y * toPosition.Y; // Use long to prevent overflow + var cosAngleToPosition = dotProduct / (1024.0 * toPosition.Length); // forwardDir is normalized to 1024 and toPosition is XY-only + + // Clamp to avoid floating point errors in acos + cosAngleToPosition = Math.Max(-1.0, Math.Min(1.0, cosAngleToPosition)); + var angleToPosition = Math.Acos(cosAngleToPosition); + + return angleToPosition <= halfConeAngleRadians; + } + + static bool IsActorInRectangle(Actor actor, WPos corner1, WPos corner2, WPos corner3, WPos corner4) + { + // First check if the actor has any HitShapes + var hasHitShape = ActorHasHitShape(actor); + + // If no HitShape, fall back to center position check + if (!hasHitShape) + { + var actorPos = actor.CenterPosition; + return IsPointInRectangle(actorPos, corner1, corner2, corner3, corner4); + } + + // For HitShape-enabled actors, check both intersection and containment + foreach (var targetPos in actor.EnabledTargetablePositions) + { + if (targetPos is HitShape h) + { + // First check: Is the HitShape fully within the rectangle? + // Test if the actor's center is within the rectangle - if so, the HitShape might be fully contained + if (IsPointInRectangle(actor.CenterPosition, corner1, corner2, corner3, corner4)) + { + // Check if all edges of the rectangle are outside or on the HitShape boundary + // If the center is in and no rectangle edges penetrate the HitShape, then HitShape is fully contained + var closestPoint = FindClosestPointOnRectangleOutline(actor.CenterPosition, corner1, corner2, corner3, corner4); + var distanceToOutline = h.DistanceFromEdge(actor, closestPoint); + + // If center is in rectangle and closest outline point is outside HitShape, then HitShape is fully within rectangle + if (distanceToOutline.Length > 0) + return true; + } + + // Second check: Does the rectangle outline intersect with the HitShape? + var closestPoint2 = FindClosestPointOnRectangleOutline(actor.CenterPosition, corner1, corner2, corner3, corner4); + var distance = h.DistanceFromEdge(actor, closestPoint2); + + // Check if closest point is inside the HitShape OR if HitShape is very close (intersecting) + if (distance == WDist.Zero || distance.Length <= 64) // Small tolerance for edge intersection + return true; + } + } + + return false; + } + + static bool IsPointInRectangle(WPos point, WPos corner1, WPos corner2, WPos corner3, WPos corner4) + { + // Use the cross product method to determine if point is inside rectangle + // Rectangle corners should be in order (counter-clockwise or clockwise) + return IsPointInsideQuadrilateral(point, corner1, corner2, corner3, corner4); + } + + static bool IsPointInsideQuadrilateral(WPos point, WPos p1, WPos p2, WPos p3, WPos p4) + { + // Check if point is on the same side of each edge + var d1 = CrossProduct2D(p2 - p1, point - p1); + var d2 = CrossProduct2D(p3 - p2, point - p2); + var d3 = CrossProduct2D(p4 - p3, point - p3); + var d4 = CrossProduct2D(p1 - p4, point - p4); + + // All cross products should have the same sign (or be zero) + var hasNeg = d1 < 0 || d2 < 0 || d3 < 0 || d4 < 0; + var hasPos = d1 > 0 || d2 > 0 || d3 > 0 || d4 > 0; + + return !(hasNeg && hasPos); + } + + static long CrossProduct2D(WVec a, WVec b) + { + return (long)a.X * b.Y - (long)a.Y * b.X; + } + + /// + /// Calculates the trapezoid width at a given distance from the source using integer arithmetic + /// to ensure consistent results at segment boundaries. + /// + int GetTrapezoidWidthAtDistance(int distance) + { + var startWidth = info.TrapezoidStartWidth.Length; + var endWidth = info.TrapezoidEndWidth.Length; + var widthDelta = endWidth - startWidth; + + // Use integer arithmetic with proper rounding: startWidth + (distance * widthDelta + range/2) / range + // The + range/2 ensures we round to nearest rather than truncate + return startWidth + (int)(((long)distance * widthDelta + range / 2) / range); + } + + static WVec Normalize1024OrDefault(WVec v) + { + return v.Length > 0 ? v * 1024 / v.Length : new WVec(1024, 0, 0); + } + + static WVec PerpendicularXY(WVec v) + { + return new WVec(-v.Y, v.X, 0); + } + + static void GetTrapezoidCorners(WPos source, WVec forwardDir, int segmentStart, int segmentEnd, int startWidth, int endWidth, + out WPos corner1, out WPos corner2, out WPos corner3, out WPos corner4) + { + var n = Normalize1024OrDefault(forwardDir); + var perp = PerpendicularXY(n); + + var startCenter = source + n * segmentStart / 1024; + var endCenter = source + n * segmentEnd / 1024; + + var startHalfWidth = startWidth / 2; + var endHalfWidth = endWidth / 2; + + corner1 = startCenter - perp * startHalfWidth / 1024; // Start left + corner2 = startCenter + perp * startHalfWidth / 1024; // Start right + corner3 = endCenter + perp * endHalfWidth / 1024; // End right + corner4 = endCenter - perp * endHalfWidth / 1024; // End left + } + + // Shared helper: project an XY position onto the pulse center line from source to (source + range * dir) + // Returns true on success, false when directionalSpeed/line is degenerate. Keeps the Z of the input. + bool TryProjectOntoCenterLine(WPos input, out WPos projection) + { + var centerLineDirection = directionalSpeed; + if (centerLineDirection.Length == 0) + { + projection = input; + return false; + } + + var normalizedDirection = centerLineDirection * 1024 / centerLineDirection.Length; + var centerLineEnd = source + normalizedDirection * range / 1024; + + var p = new int2(input.X, input.Y); + var a = new int2(source.X, source.Y); + var b = new int2(centerLineEnd.X, centerLineEnd.Y); + + var ab = b - a; + var abLenSqDiv = ab.LengthSquared / 1024; + if (abLenSqDiv == 0) + { + projection = input; + return false; + } + + var t = int2.Dot(p - a, ab) / abLenSqDiv; + if (t < 0) t = 0; + else if (t > 1024) t = 1024; + + var proj2D = a + new int2(ab.X * t / 1024, ab.Y * t / 1024); + projection = new WPos(proj2D.X, proj2D.Y, input.Z); + return true; + } + + WPos GetReferencePoint(Actor actor, WPos impactPos, DamageFalloff falloff) + { + // The reference point depends on the falloff basis + switch (falloff.FalloffBasis) + { + case FalloffBasis.DistanceFromCenter: + var finalImpactPos = source + directionalSpeed * range / directionalSpeed.Length; + return new WPos((source.X + finalImpactPos.X) / 2, (source.Y + finalImpactPos.Y) / 2, (source.Z + finalImpactPos.Z) / 2); + + case FalloffBasis.DistanceFromCenterLine: + return TryProjectOntoCenterLine(actor.CenterPosition, out var proj) + ? proj + : impactPos; + + case FalloffBasis.DistanceFromSource: + return source; + + default: + return impactPos; + } + } + + int CalculateFalloffDistance(WPos position, WPos impactPos, DamageFalloff falloff) + { + switch (falloff.FalloffBasis) + { + case FalloffBasis.DistanceFromCenter: + var finalImpactPos = source + directionalSpeed * range / directionalSpeed.Length; + var centerPoint = new WPos((source.X + finalImpactPos.X) / 2, (source.Y + finalImpactPos.Y) / 2, (source.Z + finalImpactPos.Z) / 2); + return (position - centerPoint).Length; + + case FalloffBasis.DistanceFromCenterLine: + return TryProjectOntoCenterLine(position, out var proj2) + ? (proj2 - position).Length + : (position - impactPos).Length; + + case FalloffBasis.DistanceFromSource: + return (position - source).Length; + + default: + return (position - impactPos).Length; + } + } + + static int GetFalloffModifier(DamageFalloff falloff, int distance) + { + // Calculate effective range for this falloff (either from explicit Range or from Spread) + WDist[] effectiveRange; + if (falloff.Range != null && falloff.Range.Length > 1 && falloff.Range[1] != new WDist(int.MaxValue)) + { + // Use explicit Range values + effectiveRange = falloff.Range; + } + else + { + // Calculate ranges from Spread and Falloff array + effectiveRange = new WDist[falloff.Falloff.Length]; + effectiveRange[0] = WDist.Zero; + for (var i = 1; i < falloff.Falloff.Length; i++) + effectiveRange[i] = new WDist(falloff.Spread.Length * i); + } + + // The range to target is more than the range this falloff covers + if (distance > effectiveRange[^1].Length) + return 0; + + var inner = effectiveRange[0].Length; + for (var i = 1; i < effectiveRange.Length; i++) + { + var outer = effectiveRange[i].Length; + if (outer > distance) + return int2.Lerp(falloff.Falloff[i - 1], falloff.Falloff[i], distance - inner, outer - inner); + + inner = outer; + } + + return 0; + } + + static bool IsActorInTrapezoidSegment(Actor actor, WPos source, WVec forwardDir, int segmentStart, int segmentEnd, int startWidth, int endWidth) + { + // Check if trapezoid segment intersects with actor's HitShape + if (ActorHasHitShape(actor)) + { + // For HitShape-enabled actors, check both intersection and containment + foreach (var targetPos in actor.EnabledTargetablePositions) + { + if (targetPos is HitShape h) + { + // First check: Is the HitShape fully within the trapezoid segment? + // Test if the actor's center is within the segment - if so, the HitShape might be fully contained + if (IsPositionInTrapezoidSegment(actor.CenterPosition, source, forwardDir, segmentStart, segmentEnd, startWidth, endWidth)) + { + // Check if all edges of the trapezoid are outside or on the HitShape boundary + // If the center is in and no trapezoid edges penetrate the HitShape, then HitShape is fully contained + var closestPoint = FindClosestPointOnTrapezoidOutline(actor.CenterPosition, source, forwardDir, segmentStart, segmentEnd, startWidth, endWidth); + var distanceToOutline = h.DistanceFromEdge(actor, closestPoint); + + // If center is in segment and closest outline point is outside HitShape, then HitShape is fully within segment + if (distanceToOutline.Length > 0) + return true; + } + + // Second check: Does the trapezoid outline intersect with the HitShape? + var closestPoint2 = FindClosestPointOnTrapezoidOutline(actor.CenterPosition, source, forwardDir, segmentStart, segmentEnd, startWidth, endWidth); + var distance = h.DistanceFromEdge(actor, closestPoint2); + + // Check if closest point is inside the HitShape OR if HitShape is very close (intersecting) + if (distance == WDist.Zero || distance.Length <= 64) // Small tolerance for edge intersection + return true; + } + } + + return false; + } + + // Fallback: center position only for actors without HitShapes + return IsPositionInTrapezoidSegment(actor.CenterPosition, source, forwardDir, segmentStart, segmentEnd, startWidth, endWidth); + } + + static bool IsPositionInTrapezoidSegment(WPos position, WPos source, WVec forwardDir, int segmentStart, int segmentEnd, int startWidth, int endWidth) + { + // Calculate the four corners of the trapezoid segment + GetTrapezoidCorners(source, forwardDir, segmentStart, segmentEnd, startWidth, endWidth, + out var corner1, out var corner2, out var corner3, out var corner4); + + // Use the existing quadrilateral point-in-polygon test + return IsPointInsideQuadrilateral(position, corner1, corner2, corner3, corner4); + } + + /// + /// Finds the closest point on a rectangle's outline to a given position. + /// + static WPos FindClosestPointOnRectangleOutline(WPos position, WPos corner1, WPos corner2, WPos corner3, WPos corner4) + { + var closestPoint = corner1; + var closestDistance = (position - corner1).LengthSquared; + + // Check all four edges of the rectangle + var edges = new (WPos Start, WPos End)[] + { + (corner1, corner2), + (corner2, corner3), + (corner3, corner4), + (corner4, corner1) + }; + + foreach (var (start, end) in edges) + { + var pointOnEdge = FindClosestPointOnLineSegment(position, start, end); + var distanceSquared = (position - pointOnEdge).LengthSquared; + + if (distanceSquared < closestDistance) + { + closestDistance = distanceSquared; + closestPoint = pointOnEdge; + } + } + + return closestPoint; + } + + /// + /// Finds the closest point on a cone segment's outline to a given position. + /// + static WPos FindClosestPointOnConeSegmentOutline(WPos position, WPos source, WVec forwardDir, int segmentStart, int segmentEnd, double halfConeAngleRadians) + { + var normalizedForwardDir = Normalize1024OrDefault(forwardDir); + var perpDir = PerpendicularXY(normalizedForwardDir); + + var closestPoint = source; + var closestDistance = (position - source).LengthSquared; + + // Sample points along the cone segment outline (both edges and the arc) + const int SampleCount = 8; // Number of samples along each arc + + // Left arc from segmentStart to segmentEnd + for (var i = 0; i <= SampleCount; i++) + { + var t = (double)i / SampleCount; + var distance = (int)(segmentStart + t * (segmentEnd - segmentStart)); + var cos = Math.Cos(-halfConeAngleRadians); + var sin = Math.Sin(-halfConeAngleRadians); + + var direction = new WVec( + (int)(normalizedForwardDir.X * cos - perpDir.X * sin), + (int)(normalizedForwardDir.Y * cos - perpDir.Y * sin), + 0); + + var samplePoint = source + direction * distance / 1024; + var distanceSquared = (position - samplePoint).LengthSquared; + + if (distanceSquared < closestDistance) + { + closestDistance = distanceSquared; + closestPoint = samplePoint; + } + } + + // Right arc from segmentStart to segmentEnd + for (var i = 0; i <= SampleCount; i++) + { + var t = (double)i / SampleCount; + var distance = (int)(segmentStart + t * (segmentEnd - segmentStart)); + var cos = Math.Cos(halfConeAngleRadians); + var sin = Math.Sin(halfConeAngleRadians); + + var direction = new WVec( + (int)(normalizedForwardDir.X * cos - perpDir.X * sin), + (int)(normalizedForwardDir.Y * cos - perpDir.Y * sin), + 0); + + var samplePoint = source + direction * distance / 1024; + var distanceSquared = (position - samplePoint).LengthSquared; + + if (distanceSquared < closestDistance) + { + closestDistance = distanceSquared; + closestPoint = samplePoint; + } + } + + // Inner arc at segmentStart (if not at source) + if (segmentStart > 0) + { + for (var i = 0; i <= SampleCount; i++) + { + var t = (double)i / SampleCount; + var angle = -halfConeAngleRadians + t * (2 * halfConeAngleRadians); + var cos = Math.Cos(angle); + var sin = Math.Sin(angle); + + var direction = new WVec( + (int)(normalizedForwardDir.X * cos - perpDir.X * sin), + (int)(normalizedForwardDir.Y * cos - perpDir.Y * sin), + 0); + + var samplePoint = source + direction * segmentStart / 1024; + var distanceSquared = (position - samplePoint).LengthSquared; + + if (distanceSquared < closestDistance) + { + closestDistance = distanceSquared; + closestPoint = samplePoint; + } + } + } + + // Outer arc at segmentEnd + for (var i = 0; i <= SampleCount; i++) + { + var t = (double)i / SampleCount; + var angle = -halfConeAngleRadians + t * (2 * halfConeAngleRadians); + var cos = Math.Cos(angle); + var sin = Math.Sin(angle); + + var direction = new WVec( + (int)(normalizedForwardDir.X * cos - perpDir.X * sin), + (int)(normalizedForwardDir.Y * cos - perpDir.Y * sin), + 0); + + var samplePoint = source + direction * segmentEnd / 1024; + var distanceSquared = (position - samplePoint).LengthSquared; + + if (distanceSquared < closestDistance) + { + closestDistance = distanceSquared; + closestPoint = samplePoint; + } + } + + return closestPoint; + } + + /// + /// Finds the closest point on a trapezoid's outline to a given position. + /// + static WPos FindClosestPointOnTrapezoidOutline(WPos position, WPos source, WVec forwardDir, int segmentStart, int segmentEnd, int startWidth, int endWidth) + { + GetTrapezoidCorners(source, forwardDir, segmentStart, segmentEnd, startWidth, endWidth, + out var corner1, out var corner2, out var corner3, out var corner4); + + // Use the same logic as rectangle - find closest point on the trapezoid's edges + return FindClosestPointOnRectangleOutline(position, corner1, corner2, corner3, corner4); + } + + /// + /// Finds the closest point on a line segment to a given position. + /// + static WPos FindClosestPointOnLineSegment(WPos position, WPos lineStart, WPos lineEnd) + { + var line = lineEnd - lineStart; + var lineLength = line.Length; + + if (lineLength == 0) + return lineStart; // Degenerate line segment + + var toPosition = position - lineStart; + var projectionLength = WVec.Dot(toPosition, line) / lineLength; + + // Clamp to line segment bounds + if (projectionLength <= 0) + return lineStart; + if (projectionLength >= lineLength) + return lineEnd; + + // Calculate the point on the line segment + var projectionVector = line * projectionLength / lineLength; + return lineStart + projectionVector; + } + + void DoSmudge(in Target target, WarheadArgs args) + { + if (target.Type == TargetType.Invalid) + return; + + var firedBy = args.SourceActor; + var world = firedBy.World; + + if (info.SmudgeChance < world.SharedRandom.Next(100)) + return; + + var pos = target.CenterPosition; + var targetTile = world.Map.CellContaining(pos); + var smudgeLayers = world.WorldActor.TraitsImplementing().ToDictionary(x => x.Info.Type); + + var minRange = (info.SmudgeSize.Length > 1 && info.SmudgeSize[1] > 0) ? info.SmudgeSize[1] : 0; + var allCells = world.Map.FindTilesInAnnulus(targetTile, minRange, info.SmudgeSize[0]); + + // Draw the smudges: + foreach (var sc in allCells) + { + var smudgeType = world.Map.GetTerrainInfo(sc).AcceptsSmudgeType.FirstOrDefault(info.SmudgeType.Contains); + if (smudgeType == null) + continue; + + if (!smudgeLayers.TryGetValue(smudgeType, out var smudgeLayer)) + throw new NotImplementedException($"Unknown smudge type `{smudgeType}`"); + + smudgeLayer.AddSmudge(sc); + } } } } diff --git a/OpenRA.Mods.CA/Projectiles/MeteorStrike.cs b/OpenRA.Mods.CA/Projectiles/MeteorStrike.cs new file mode 100644 index 0000000000..814f4695de --- /dev/null +++ b/OpenRA.Mods.CA/Projectiles/MeteorStrike.cs @@ -0,0 +1,160 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.Effects; +using OpenRA.GameRules; +using OpenRA.Graphics; +using OpenRA.Mods.Common.Effects; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Projectiles +{ + public class MeteorStrike : IProjectile, ISpatiallyPartitionable + { + readonly Player firedBy; + readonly Animation anim; + readonly WeaponInfo weapon; + readonly string weaponPalette; + readonly string downSequence; + + readonly WPos descendSource; + readonly WPos descendTarget; + readonly WDist detonationAltitude; + readonly bool removeOnDetonation; + readonly int impactDelay; + readonly string trailImage; + readonly string[] trailSequences; + readonly string trailPalette; + readonly int trailInterval; + readonly int trailDelay; + + WPos pos; + int ticks, trailTicks; + bool isLaunched; + bool detonated; + + public MeteorStrike(Player firedBy, string image, WeaponInfo weapon, string weaponPalette, string downSequence, + WPos targetPos, WDist detonationAltitude, bool removeOnDetonation, WDist velocity, int impactDelay, + string trailImage, string[] trailSequences, string trailPalette, bool trailUsePlayerPalette, int trailDelay, int trailInterval) + { + this.firedBy = firedBy; + this.weapon = weapon; + this.weaponPalette = weaponPalette; + this.downSequence = downSequence; + this.impactDelay = impactDelay; + this.trailImage = trailImage; + this.trailSequences = trailSequences; + this.trailPalette = trailPalette; + if (trailUsePlayerPalette) + this.trailPalette += firedBy.InternalName; + + this.trailInterval = trailInterval; + this.trailDelay = trailDelay; + trailTicks = trailDelay; + + var offset = new WVec(WDist.Zero, WDist.Zero, velocity * impactDelay); + + // Rotate pitch 20 degrees (counterlockwise), causing meteor to descend from the left of the target + offset = offset.Rotate(new WRot( + new WAngle(0), + WAngle.FromDegrees(20), + new WAngle(0) + ));; + + descendSource = targetPos + offset; + descendTarget = targetPos; + this.detonationAltitude = detonationAltitude; + this.removeOnDetonation = removeOnDetonation; + + if (!string.IsNullOrEmpty(image)) + anim = new Animation(firedBy.World, image); + + pos = descendSource; + } + + public void Tick(World world) + { + if (!isLaunched) + { + if (weapon.Report != null && weapon.Report.Length > 0) + Game.Sound.Play(SoundType.World, weapon.Report, world, pos); + + if (anim != null) + { + anim.PlayRepeating(downSequence); + world.ScreenMap.Add(this, pos, anim.Image); + } + + isLaunched = true; + } + + if (anim != null) + { + anim.Tick(); + } + + var isDescending = true; + pos = WPos.LerpQuadratic(descendSource, descendTarget, WAngle.Zero, ticks, impactDelay); + + if (!string.IsNullOrEmpty(trailImage) && --trailTicks < 0) + { + var trailPos = WPos.LerpQuadratic(descendSource, descendTarget, WAngle.Zero, ticks - trailDelay, impactDelay); + + world.AddFrameEndTask(w => w.Add(new SpriteEffect(trailPos, w, trailImage, trailSequences.Random(world.SharedRandom), + trailPalette))); + + trailTicks = trailInterval; + } + + var dat = world.Map.DistanceAboveTerrain(pos); + if (ticks == impactDelay || (isDescending && dat <= detonationAltitude)) + Explode(world, ticks == impactDelay || removeOnDetonation); + + if (anim != null) + world.ScreenMap.Update(this, pos, anim.Image); + + ticks++; + } + + void Explode(World world, bool removeProjectile) + { + if (removeProjectile) + world.AddFrameEndTask(w => { w.Remove(this); w.ScreenMap.Remove(this); }); + + if (detonated) + return; + + var target = Target.FromPos(pos); + var warheadArgs = new WarheadArgs + { + Weapon = weapon, + Source = target.CenterPosition, + SourceActor = firedBy.PlayerActor, + WeaponTarget = target + }; + + weapon.Impact(target, warheadArgs); + + detonated = true; + } + + public IEnumerable Render(WorldRenderer wr) + { + if (!isLaunched || anim == null) + return Enumerable.Empty(); + + return anim.Render(pos, wr.Palette(weaponPalette)); + } + + public float FractionComplete => ticks * 1f / impactDelay; + } +} diff --git a/OpenRA.Mods.CA/Projectiles/MissileCA.cs b/OpenRA.Mods.CA/Projectiles/MissileCA.cs index e82f2d1476..24168d10dd 100644 --- a/OpenRA.Mods.CA/Projectiles/MissileCA.cs +++ b/OpenRA.Mods.CA/Projectiles/MissileCA.cs @@ -1,11 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -40,9 +39,12 @@ public class MissileCAInfo : IProjectileInfo [Desc("Palette is a player palette BaseName")] public readonly bool IsPlayerPalette = false; - [Desc("Should the projectile's shadow be rendered?")] + [Desc("Does this projectile have a shadow?")] public readonly bool Shadow = false; + [Desc("Color to draw shadow if Shadow is true.")] + public readonly Color ShadowColor = Color.FromArgb(140, 0, 0, 0); + [Desc("Minimum vertical launch angle (pitch).")] public readonly WAngle MinimumLaunchAngle = new WAngle(-64); @@ -76,10 +78,13 @@ public class MissileCAInfo : IProjectileInfo [Desc("The maximum/constant/incremental inaccuracy used in conjunction with the InaccuracyType property.")] public readonly WDist Inaccuracy = WDist.Zero; - [Desc("Controls the way inaccuracy is calculated. Possible values are 'Maximum' - scale from 0 to max with range, 'PerCellIncrement' - scale from 0 with range and 'Absolute' - use set value regardless of range.")] + [Desc("Controls the way inaccuracy is calculated. Possible values are " + + "'Maximum' - scale from 0 to max with range, " + + "'PerCellIncrement' - scale from 0 with range, " + + "'Absolute' - use set value regardless of range.")] public readonly InaccuracyType InaccuracyType = InaccuracyType.Absolute; - [Desc("Inaccuracy override when sucessfully locked onto target. Defaults to Inaccuracy if negative.")] + [Desc("Inaccuracy override when successfully locked onto target. Defaults to Inaccuracy if negative.")] public readonly WDist LockOnInaccuracy = new WDist(-1); [Desc("Probability of locking onto and following target.")] @@ -123,23 +128,47 @@ public class MissileCAInfo : IProjectileInfo [Desc("Use the Player Palette to render the trail sequence.")] public readonly bool TrailUsePlayerPalette = false; + [Desc("Fixed distance between Trail animations. Overrides the distance calculated using projectile speed.")] + public readonly WDist TrailSpacing = WDist.Zero; + [Desc("Interval in ticks between spawning trail animation.")] public readonly int TrailInterval = 2; [Desc("Should trail animation be spawned when the propulsion is not activated.")] public readonly bool TrailWhenDeactivated = false; + [Desc("When set, display a line behind the actor. Length is measured in ticks after appearing.")] public readonly int ContrailLength = 0; + [Desc("Time (in ticks) after which the line should appear. Controls the distance to the actor.")] + public readonly int ContrailDelay = 1; + + [Desc("Equivalent to sequence ZOffset. Controls Z sorting.")] public readonly int ContrailZOffset = 2047; - public readonly WDist ContrailWidth = new WDist(64); + [Desc("Thickness of the emitted line at the start of the contrail.")] + public readonly WDist ContrailStartWidth = new(64); - public readonly Color ContrailColor = Color.White; + [Desc("Thickness of the emitted line at the end of the contrail. Will default to " + nameof(ContrailStartWidth) + " if left undefined")] + public readonly WDist? ContrailEndWidth = null; - public readonly bool ContrailUsePlayerColor = false; + [Desc("RGB color at the contrail start.")] + public readonly Color ContrailStartColor = Color.White; - public readonly int ContrailDelay = 1; + [Desc("Use player remap color instead of a custom color at the contrail the start.")] + public readonly bool ContrailStartColorUsePlayerColor = false; + + [Desc("The alpha value [from 0 to 255] of color at the contrail the start.")] + public readonly int ContrailStartColorAlpha = 255; + + [Desc("RGB color at the contrail end. Set to start color if undefined")] + public readonly Color? ContrailEndColor; + + [Desc("Use player remap color instead of a custom color at the contrail end.")] + public readonly bool ContrailEndColorUsePlayerColor = false; + + [Desc("The alpha value [from 0 to 255] of color at the contrail end.")] + public readonly int ContrailEndColorAlpha = 0; [Desc("Should missile targeting be thrown off by nearby actors with JamsMissiles.")] public readonly bool Jammable = true; @@ -162,6 +191,9 @@ public class MissileCAInfo : IProjectileInfo [Desc("Type defined for point-defense logic.")] public readonly string PointDefenseType = null; + [Desc("Ignore variable launch angle and speed when target is below this distance.")] + public readonly WDist DirectFireMaxRange = WDist.Zero; + public IProjectile Create(ProjectileArgs args) { return new MissileCA(this, args); } } @@ -186,19 +218,22 @@ enum States readonly WAngle minLaunchAngle; readonly WAngle maxLaunchAngle; + readonly float3 shadowColor; + readonly float shadowAlpha; + int ticks; int ticksToNextSmoke; - ContrailRenderable contrail; - string trailPalette; + readonly ContrailRenderable contrail; + readonly string trailPalette; States state; bool targetPassedBy; - bool lockOn; + readonly bool lockOn; bool allowPassBy; // TODO: use this also with high minimum launch angle settings WPos targetPosition; - WVec offset; + readonly WVec offset; WVec tarVel; WVec predVel; @@ -210,7 +245,7 @@ enum States int speed; int loopRadius; WDist distanceCovered; - WDist rangeLimit; + readonly WDist rangeLimit; WAngle renderFacing; @@ -220,6 +255,8 @@ enum States [Sync] int vFacing; + List trailItems = new List(); + public MissileCA(MissileCAInfo info, ProjectileArgs args) { this.info = info; @@ -231,11 +268,17 @@ public MissileCA(MissileCAInfo info, ProjectileArgs args) targetPosition = args.PassiveTarget; var limit = info.RangeLimit != WDist.Zero ? info.RangeLimit : args.Weapon.Range; rangeLimit = new WDist(Util.ApplyPercentageModifiers(limit.Length, args.RangeModifiers)); - minLaunchSpeed = info.MinimumLaunchSpeed.Length > -1 ? info.MinimumLaunchSpeed.Length : info.Speed.Length; - maxLaunchSpeed = info.MaximumLaunchSpeed.Length > -1 ? info.MaximumLaunchSpeed.Length : info.Speed.Length; + + var directFire = info.DirectFireMaxRange > WDist.Zero && (targetPosition - pos).HorizontalLength < info.DirectFireMaxRange.Length; + + minLaunchSpeed = info.MinimumLaunchSpeed.Length > -1 && !directFire ? info.MinimumLaunchSpeed.Length : info.Speed.Length; + maxLaunchSpeed = info.MaximumLaunchSpeed.Length > -1 && !directFire ? info.MaximumLaunchSpeed.Length : info.Speed.Length; maxSpeed = info.Speed.Length; - minLaunchAngle = info.MinimumLaunchAngle; - maxLaunchAngle = info.MaximumLaunchAngle; + minLaunchAngle = directFire ? WAngle.Zero : info.MinimumLaunchAngle; + maxLaunchAngle = directFire ? WAngle.Zero : info.MaximumLaunchAngle; + + // Make sure the projectile on being spawned is approximately looking at the correct direction. + renderFacing = args.Facing; var world = args.SourceActor.World; @@ -245,7 +288,7 @@ public MissileCA(MissileCAInfo info, ProjectileArgs args) var inaccuracy = lockOn && info.LockOnInaccuracy.Length > -1 ? info.LockOnInaccuracy.Length : info.Inaccuracy.Length; if (inaccuracy > 0) { - var maxInaccuracyOffset = Util.GetProjectileInaccuracy(info.Inaccuracy.Length, info.InaccuracyType, args); + var maxInaccuracyOffset = Util.GetProjectileInaccuracy(inaccuracy, info.InaccuracyType, args); offset = WVec.FromPDF(world.SharedRandom, 2) * maxInaccuracyOffset / 1024; } @@ -263,13 +306,22 @@ public MissileCA(MissileCAInfo info, ProjectileArgs args) if (info.ContrailLength > 0) { - var color = info.ContrailUsePlayerColor ? ContrailRenderable.ChooseColor(args.SourceActor) : info.ContrailColor; - contrail = new ContrailRenderable(world, color, info.ContrailWidth, info.ContrailLength, info.ContrailDelay, info.ContrailZOffset); + var startcolor = info.ContrailStartColorUsePlayerColor ? Color.FromArgb(info.ContrailStartColorAlpha, args.SourceActor.OwnerColor()) : Color.FromArgb(info.ContrailStartColorAlpha, info.ContrailStartColor); + var endcolor = info.ContrailEndColorUsePlayerColor ? Color.FromArgb(info.ContrailEndColorAlpha, args.SourceActor.OwnerColor()) : Color.FromArgb(info.ContrailEndColorAlpha, info.ContrailEndColor ?? startcolor); + contrail = new ContrailRenderable(world, args.SourceActor, + startcolor, info.ContrailStartColorUsePlayerColor, + endcolor, info.ContrailEndColor == null ? info.ContrailStartColorUsePlayerColor : info.ContrailEndColorUsePlayerColor, + info.ContrailStartWidth, + info.ContrailEndWidth ?? info.ContrailStartWidth, + info.ContrailLength, info.ContrailDelay, info.ContrailZOffset); } trailPalette = info.TrailPalette; if (info.TrailUsePlayerPalette) trailPalette += args.SourceActor.Owner.InternalName; + + shadowColor = new float3(info.ShadowColor.R, info.ShadowColor.G, info.ShadowColor.B) / 255f; + shadowAlpha = info.ShadowColor.A / 255f; } static int LoopRadius(int speed, int rot) @@ -332,13 +384,12 @@ void DetermineLaunchSpeedAndAngle(World world, out int speed, out int vFacing) var tarDistVec = targetPosition + offset - pos; var relTarHorDist = tarDistVec.HorizontalLength; - int predClfHgt = 0; - int predClfDist = 0; - int lastHtChg = 0; - int lastHt = 0; + var predClfHgt = 0; + var predClfDist = 0; + var lastHt = 0; if (info.TerrainHeightAware) - InclineLookahead(world, relTarHorDist, out predClfHgt, out predClfDist, out lastHtChg, out lastHt); + InclineLookahead(world, relTarHorDist, out predClfHgt, out predClfDist, out _, out lastHt); // Height difference between the incline height and missile height var diffClfMslHgt = predClfHgt - pos.Z; @@ -435,7 +486,7 @@ bool JammedBy(TraitPair tp) if ((tp.Actor.CenterPosition - pos).HorizontalLengthSquared > tp.Trait.Range.LengthSquared) return false; - if (!tp.Trait.DeflectionStances.HasStance(tp.Actor.Owner.RelationshipWith(args.SourceActor.Owner))) + if (!tp.Trait.DeflectionStances.HasRelationship(tp.Actor.Owner.RelationshipWith(args.SourceActor.Owner))) return false; return tp.Actor.World.SharedRandom.Next(100) < tp.Trait.Chance; @@ -471,8 +522,8 @@ void InclineLookahead(World world, int distCheck, out int predClfHgt, out int pr lastHt = 0; // Height just before the last height change // NOTE: Might be desired to unhardcode the lookahead step size - var stepSize = 32; - var step = new WVec(0, -stepSize, 0) + const int StepSize = 32; + var step = new WVec(0, -StepSize, 0) .Rotate(new WRot(WAngle.Zero, WAngle.Zero, WAngle.FromFacing(hFacing))); // Step vector of length 128 // Probe terrain ahead of the missile @@ -480,7 +531,7 @@ void InclineLookahead(World world, int distCheck, out int predClfHgt, out int pr var maxLookaheadDistance = loopRadius * 4; var posProbe = pos; var curDist = 0; - var tickLimit = System.Math.Min(maxLookaheadDistance, distCheck) / stepSize; + var tickLimit = System.Math.Min(maxLookaheadDistance, distCheck) / StepSize; var prevHt = 0; // TODO: Make sure cell on map!!! @@ -492,7 +543,7 @@ void InclineLookahead(World world, int distCheck, out int predClfHgt, out int pr var ht = world.Map.Height[world.Map.CellContaining(posProbe)] * 512; - curDist += stepSize; + curDist += StepSize; if (ht > predClfHgt) { predClfHgt = ht; @@ -543,7 +594,7 @@ int IncreaseAltitude(int predClfDist, int diffClfMslHgt, int relTarHorDist, int // Attained height after ascent as predicted from upper part of incline surmounting manoeuvre var predAttHght = loopRadius * (1024 - WAngle.FromFacing(vFacing).Cos()) / 1024 - diffClfMslHgt; - // Should the missile be slowed down in order to make it more manoeuverable + // Should the missile be slowed down in order to make it more maneuverable var slowDown = info.Acceleration.Length != 0 // Possible to decelerate && ((desiredVFacing != 0 // Lower part of incline surmounting manoeuvre @@ -567,7 +618,7 @@ int IncreaseAltitude(int predClfDist, int diffClfMslHgt, int relTarHorDist, int int HomingInnerTick(int predClfDist, int diffClfMslHgt, int relTarHorDist, int lastHtChg, int lastHt, int nxtRelTarHorDist, int relTarHgt, int vFacing, bool targetPassedBy) { - int desiredVFacing = vFacing; + int desiredVFacing; // Incline coming up -> attempt to reach the incline so that after predClfDist // the height above the terrain is positive but as close to 0 as possible @@ -609,7 +660,7 @@ int HomingInnerTick(int predClfDist, int diffClfMslHgt, int relTarHorDist, int l desiredVFacing = desiredVFacing.Clamp(-info.VerticalRateOfTurn.Facing, info.VerticalRateOfTurn.Facing); else if (lastHt == 0) { // Before the target is passed by, missile speed should be changed - // Target's height above loop's center + // Target's height above loop's center var tarHgt = (loopRadius * WAngle.FromFacing(vFacing).Cos() / 1024 - System.Math.Abs(relTarHgt)).Clamp(0, loopRadius); // Target's horizontal distance from loop's center @@ -736,7 +787,7 @@ int HomingInnerTick(int predClfDist, int diffClfMslHgt, int relTarHorDist, int l return desiredVFacing; } - WVec HomingTick(World world, WVec tarDistVec, int relTarHorDist) + WVec HomingTick(World world, in WVec tarDistVec, int relTarHorDist) { int predClfHgt = 0; int predClfDist = 0; @@ -783,7 +834,7 @@ WVec HomingTick(World world, WVec tarDistVec, int relTarHorDist) desiredVFacing = vFacing + world.SharedRandom.Next(-info.JammedDiversionRange, info.JammedDiversionRange + 1); } else if (!args.GuidedTarget.IsValidFor(args.SourceActor)) - desiredHFacing = hFacing; + desiredHFacing = tarDistVec.HorizontalLengthSquared != 0 ? tarDistVec.Yaw.Facing : hFacing; // Compute new direction the projectile will be facing hFacing = Util.TickFacing(hFacing, desiredHFacing, info.HorizontalRateOfTurn.Facing); @@ -822,15 +873,22 @@ public void Tick(World world) // Check if target position should be updated (actor visible & locked on) var newTarPos = targetPosition; - if (args.GuidedTarget.IsValidFor(args.SourceActor) && lockOn) - newTarPos = (args.Weapon.TargetActorCenter ? args.GuidedTarget.CenterPosition : args.GuidedTarget.Positions.PositionClosestTo(args.Source)) + var targetWasValid = args.GuidedTarget.IsValidFor(args.SourceActor); + if (targetWasValid && lockOn) + newTarPos = (args.Weapon.TargetActorCenter ? args.GuidedTarget.CenterPosition : args.GuidedTarget.Positions.ClosestToIgnoringPath(args.Source)) + new WVec(WDist.Zero, WDist.Zero, info.AirburstAltitude); // Compute target's predicted velocity vector (assuming uniform circular motion) var yaw1 = tarVel.HorizontalLengthSquared != 0 ? tarVel.Yaw : WAngle.FromFacing(hFacing); tarVel = newTarPos - targetPosition; var yaw2 = tarVel.HorizontalLengthSquared != 0 ? tarVel.Yaw : WAngle.FromFacing(hFacing); - predVel = tarVel.Rotate(WRot.FromYaw(yaw2 - yaw1)); + + // Clear predicted velocity when target is invalid to prevent erratic behavior + if (!targetWasValid) + predVel = WVec.Zero; + else + predVel = tarVel.Rotate(WRot.FromYaw(yaw2 - yaw1)); + targetPosition = newTarPos; // Compute current distance from target position @@ -855,17 +913,29 @@ public void Tick(World world) // Check for walls or other blocking obstacles var shouldExplode = false; - if (info.Blockable && BlocksProjectiles.AnyBlockingActorsBetween(world, lastPos, pos, info.Width, out var blockedPos)) + if (info.Blockable && BlocksProjectiles.AnyBlockingActorsBetween(world, args.SourceActor.Owner, lastPos, pos, info.Width, out var blockedPos)) { pos = blockedPos; shouldExplode = true; } + foreach (var t in trailItems) + t.Tick(); + // Create the sprite trail effect if (!string.IsNullOrEmpty(info.TrailImage) && --ticksToNextSmoke < 0 && (state != States.Freefall || info.TrailWhenDeactivated)) { - world.AddFrameEndTask(w => w.Add(new SpriteEffect(pos - 3 * move / 2, renderFacing, w, - info.TrailImage, info.TrailSequences.Random(world.SharedRandom), trailPalette))); + if (info.TrailSpacing != WDist.Zero) + { + var trailAnim = new Animation(world, info.TrailImage, () => renderFacing); + trailItems.Add(trailAnim); + trailAnim.PlayThen(info.TrailSequences.Random(world.SharedRandom), () => world.AddFrameEndTask(w => { trailItems.Remove(trailAnim); })); + } + else + { + world.AddFrameEndTask(w => w.Add(new SpriteEffect(pos - 3 * move / 2, renderFacing, w, + info.TrailImage, info.TrailSequences.Random(world.SharedRandom), trailPalette))); + } ticksToNextSmoke = info.TrailInterval; } @@ -884,7 +954,7 @@ public void Tick(World world) || (height.Length < info.AirburstAltitude.Length && relTarHorDist < info.CloseEnough.Length); // Airburst if (!shouldExplode && !string.IsNullOrEmpty(info.PointDefenseType)) - shouldExplode |= world.ActorsWithTrait().Any(x => x.Trait.Destroy(pos, args.SourceActor.Owner, info.PointDefenseType)); + shouldExplode |= world.ActorsWithTrait().Any(x => x.Trait.Destroy(pos, args.SourceActor.Owner, info.PointDefenseType, args)); if (shouldExplode) Explode(world); @@ -921,17 +991,42 @@ public IEnumerable Render(WorldRenderer wr) var world = args.SourceActor.World; if (!world.FogObscures(pos)) { + var paletteName = info.Palette; + if (paletteName != null && info.IsPlayerPalette) + paletteName += args.SourceActor.Owner.InternalName; + + var palette = wr.Palette(paletteName); + if (info.Shadow) { var dat = world.Map.DistanceAboveTerrain(pos); var shadowPos = pos - new WVec(0, 0, dat.Length); - foreach (var r in anim.Render(shadowPos, wr.Palette("shadow"))) - yield return r; + foreach (var r in anim.Render(shadowPos, palette)) + yield return ((IModifyableRenderable)r) + .WithTint(shadowColor, ((IModifyableRenderable)r).TintModifiers | TintModifiers.ReplaceColor) + .WithAlpha(shadowAlpha); } - var palette = wr.Palette(info.Palette + (info.IsPlayerPalette ? args.SourceActor.Owner.InternalName : "")); foreach (var r in anim.Render(pos, palette)) yield return r; + + if (trailItems.Count > 0) + { + var trailPalette = wr.Palette(info.TrailPalette + (info.TrailUsePlayerPalette ? args.SourceActor.Owner.InternalName : "")); + var trailMult = 1; + + for (var i = trailItems.Count - 1; i >= 0; i--) + { + var trailOffset = new WVec(0, info.TrailSpacing.Length, 0); + trailOffset = trailOffset.Rotate(WRot.FromYaw(renderFacing)); + var trailPos = pos + (trailOffset * trailMult); + + foreach (var r in trailItems[i].Render(trailPos, trailPalette)) + yield return r; + + trailMult++; + } + } } } } diff --git a/OpenRA.Mods.CA/Projectiles/PlasmaBeam.cs b/OpenRA.Mods.CA/Projectiles/PlasmaBeam.cs index 14426da45e..1cc486087e 100644 --- a/OpenRA.Mods.CA/Projectiles/PlasmaBeam.cs +++ b/OpenRA.Mods.CA/Projectiles/PlasmaBeam.cs @@ -1,15 +1,16 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion using System; using System.Collections.Generic; +using System.Linq; using OpenRA.GameRules; using OpenRA.Graphics; using OpenRA.Mods.CA.Graphics; @@ -62,7 +63,10 @@ public class PlasmaBeamInfo : IProjectileInfo [Desc("The maximum/constant/incremental inaccuracy used in conjunction with the InaccuracyType property.")] public readonly WDist Inaccuracy = WDist.Zero; - [Desc("Controls the way inaccuracy is calculated. Possible values are 'Maximum' - scale from 0 to max with range, 'PerCellIncrement' - scale from 0 with range and 'Absolute' - use set value regardless of range.")] + [Desc("Controls the way inaccuracy is calculated. Possible values are " + + "'Maximum' - scale from 0 to max with range, " + + "'PerCellIncrement' - scale from 0 with range, " + + "'Absolute' - use set value regardless of range.")] public readonly InaccuracyType InaccuracyType = InaccuracyType.Maximum; [Desc("Draw primary center beam.")] @@ -97,60 +101,134 @@ public class PlasmaBeamInfo : IProjectileInfo [Desc("Palette to use for launch effect.")] public readonly string LaunchEffectPalette = "effect"; + [Desc("Does the beam follow the target.")] + public readonly bool TrackTarget = false; + + [Desc("If true will recalculate colours every tick.")] + public readonly bool RecalculateColors = false; + + [Desc("If greater than zero will recalculate distortions at this interval.")] + public readonly int RecalculateDistortionInterval = 0; + + [Desc("Beam will begin with this offset.")] + public readonly WVec StartOffset = WVec.Zero; + + [Desc("Each tick this offset will be added to the beam.")] + public readonly WVec FollowingOffset = WVec.Zero; + + [Desc("Ticks at which do do warhead impacts.")] + public readonly int[] ImpactTicks = { 0 }; + + [Desc("If greater than zero will do warhead impacts at this interval.")] + public readonly int ImpactInterval = 0; + + [Desc("If target direction angle changes this much then beam will shut off.")] + public readonly WAngle MaxFacingDeviation = new WAngle(512); + + [Desc("To use the basic logic without a visual.")] + public readonly bool Invisible = false; + public IProjectile Create(ProjectileArgs args) { return new PlasmaBeam(args, this); } } public class PlasmaBeam : IProjectile, ISync { - private readonly PlasmaBeamInfo info; - private readonly Color[] colors; - private WPos[] offsets; - + readonly PlasmaBeamInfo info; readonly ProjectileArgs args; - private WVec leftVector; - private WVec upVector; readonly MersenneTwister random; readonly bool hasLaunchEffect; + readonly int numSegments; + + Color[] colors; + int ticks = 0; + WPos[] offsets; + WVec[] distortions; + WVec leftVector; + WVec upVector; + WVec inaccuracyOffset; + WVec targetOffset; + bool trackingTarget; + WAngle initialMuzzleFacing; + bool recalculateOffsets; [Sync] - WPos target; - - [Sync] - WPos source; - - [Sync] - WPos lastSource; - - int ticks; + WPos target, source, lastTarget, lastSource; public PlasmaBeam(ProjectileArgs args, PlasmaBeamInfo info) { this.args = args; this.info = info; + trackingTarget = info.TrackTarget; - source = args.Source; - lastSource = args.Source; + // Set the initial source and target positions + source = lastSource = args.Source; if (info.ForceVertical) - target = new WPos(source.X, source.Y, 0); + target = lastTarget = new WPos(source.X, source.Y, 0); else - target = args.PassiveTarget; + target = lastTarget = args.PassiveTarget; - var world = args.SourceActor.World; + random = args.SourceActor.World.SharedRandom; + // Apply inaccuracy to target if (info.Inaccuracy.Length > 0) { var maxInaccuracyOffset = OpenRA.Mods.Common.Util.GetProjectileInaccuracy(info.Inaccuracy.Length, info.InaccuracyType, args); - target += WVec.FromPDF(args.SourceActor.World.SharedRandom, 2) * maxInaccuracyOffset / 1024; + inaccuracyOffset = WVec.FromPDF(random, 2) * maxInaccuracyOffset / 1024; + target += inaccuracyOffset; + } + + var direction = target - source; + targetOffset = WVec.Zero; + initialMuzzleFacing = direction.Yaw; // args.CurrentMuzzleFacing(); + + // Apply initial offset + if (info.StartOffset != WVec.Zero) + { + var muzzleFacing = initialMuzzleFacing; + var muzzleOrientation = WRot.FromYaw(muzzleFacing); + var initialOffset = new WVec(info.StartOffset.Y, -info.StartOffset.X, info.StartOffset.Z).Rotate(muzzleOrientation); + target += initialOffset; + targetOffset += initialOffset; } + numSegments = info.SegmentLength > WDist.Zero ? (direction.Length - 1) / info.SegmentLength.Length + 1 : 1; + offsets = new WPos[numSegments + 1]; + distortions = new WVec[numSegments + 1]; + // Check for blocking actors - if (info.Blockable && BlocksProjectiles.AnyBlockingActorsBetween(world, source, target, info.CenterBeamWidth, out var blockedPos)) + CheckBlocked(); + CalculateColors(direction); + CalculateBeam(direction); + DoImpacts(); + + // Do launch effect + hasLaunchEffect = !string.IsNullOrEmpty(info.LaunchEffectImage) && !string.IsNullOrEmpty(info.LaunchEffectSequence); + if (hasLaunchEffect) + { + Func getMuzzleFacing = () => args.CurrentMuzzleFacing(); + args.SourceActor.World.AddFrameEndTask(w => w.Add(new SpriteEffect(args.CurrentSource, getMuzzleFacing, args.SourceActor.World, + info.LaunchEffectImage, info.LaunchEffectSequence, info.LaunchEffectPalette))); + } + } + + void CheckBlocked() + { + if (info.Blockable && BlocksProjectiles.AnyBlockingActorsBetween(args.SourceActor.World, args.SourceActor.Owner, source, target, info.CenterBeamWidth, out var blockedPos)) target = blockedPos; + } + + void CalculateColors(WVec direction) + { + if (info.Invisible) + return; + + if (ticks > 0 && !info.RecalculateColors) + return; - var direction = target - source; var rangeBonusAlpha = GetRangeBonusAlpha(direction); + // Set colours for beam center to beam edge (from InnerLightness to OuterLightness) colors = new Color[info.Radius]; for (var i = 0; i < info.Radius; i++) { @@ -162,108 +240,152 @@ public PlasmaBeam(ProjectileArgs args, PlasmaBeamInfo info) var dstB = bw > .5 ? 1 - (1 - 2 * (bw - .5)) * (1 - (float)color.B / 0xff) : 2 * bw * ((float)color.B / 0xff); colors[i] = Color.FromArgb((int)(alpha), (int)(dstR * 0xff), (int)(dstG * 0xff), (int)(dstB * 0xff)); } + } - if (info.Distortion != 0 || info.DistortionAnimation != 0) - random = args.SourceActor.World.SharedRandom; - - CalculateMainBeam(direction); + void CalculateDistortion(WVec direction) + { + if (info.Distortion == 0 && info.DistortionAnimation == 0) + return; - if (ticks < 1) + if (ticks == 0 || (info.RecalculateDistortionInterval > 0 && (ticks + 1) % info.RecalculateDistortionInterval == 0)) { - var warheadArgs = new WarheadArgs(args) + offsets = new WPos[numSegments + 1]; + distortions = new WVec[numSegments + 1]; + recalculateOffsets = true; + + if (ticks == 0) { - ImpactOrientation = new WRot(WAngle.Zero, OpenRA.Mods.Common.Util.GetVerticalAngle(source, target), args.CurrentMuzzleFacing()), - ImpactPosition = target, - }; + leftVector = new WVec(direction.Y, -direction.X, 0); + if (leftVector.Length != 0) + leftVector = 1024 * leftVector / leftVector.Length; + + upVector = leftVector.Length != 0 + ? new WVec( + -direction.X * direction.Z, + -direction.Z * direction.Y, + direction.X * direction.X + direction.Y * direction.Y) + : new WVec(direction.Z, direction.Z, 0); + if (upVector.Length != 0) + upVector = 1024 * upVector / upVector.Length; + } + } + } + + void TrackTarget() + { + if (!trackingTarget || ticks == 0) + return; - args.Weapon.Impact(Target.FromPos(target), warheadArgs); + if (!args.GuidedTarget.IsValidFor(args.SourceActor)) + { + trackingTarget = false; + return; } - hasLaunchEffect = !string.IsNullOrEmpty(info.LaunchEffectImage) && !string.IsNullOrEmpty(info.LaunchEffectSequence); + var guidedTargetPos = args.Weapon.TargetActorCenter ? args.GuidedTarget.CenterPosition : args.GuidedTarget.Positions.ClosestToIgnoringPath(args.Source); + target = guidedTargetPos + inaccuracyOffset; } - private void CalculateMainBeam(WVec direction) + void UpdateOffset(WVec direction) { - if (info.Distortion != 0 || info.DistortionAnimation != 0) + if (info.FollowingOffset != WVec.Zero && ticks > 0) { - leftVector = new WVec(direction.Y, -direction.X, 0); - if (leftVector.Length != 0) - leftVector = 1024 * leftVector / leftVector.Length; - - upVector = leftVector.Length != 0 - ? new WVec( - -direction.X * direction.Z, - -direction.Z * direction.Y, - direction.X * direction.X + direction.Y * direction.Y) - : new WVec(direction.Z, direction.Z, 0); - if (upVector.Length != 0) - upVector = 1024 * upVector / upVector.Length; + var muzzleFacing = direction.Yaw; // args.CurrentMuzzleFacing(); + var muzzleOrientation = WRot.FromYaw(muzzleFacing); + var followingOffset = new WVec(info.FollowingOffset.Y, -info.FollowingOffset.X, info.FollowingOffset.Z).Rotate(muzzleOrientation); + + // if tracking target we need to reapply any offset previously added + if (trackingTarget) + target += targetOffset; + + target += followingOffset; + targetOffset += followingOffset; } + } - if (info.SegmentLength == WDist.Zero) - offsets = new[] { source, target }; - else - { - var numSegments = (direction.Length - 1) / info.SegmentLength.Length + 1; - offsets = new WPos[numSegments + 1]; - offsets[0] = source; - offsets[offsets.Length - 1] = target; + void CalculateBeam(WVec direction) + { + if (info.Invisible) + return; + + CalculateDistortion(direction); + + var shouldDistort = (ticks == 0 && info.Distortion != 0) || (ticks > 0 && info.DistortionAnimation != 0); + + // Always keep the beam starting at source and ending at target + offsets[0] = source; + offsets[offsets.Length - 1] = target; - for (var i = 1; i < numSegments; i++) + // For each offset between the start and end, set positions and apply any distortion + for (var i = 1; i < numSegments; i++) + { + // If initialising or source/target have moved set segment base positions + if (ticks == 0 || lastSource != source || target != lastTarget || recalculateOffsets) { var segmentStart = direction / numSegments * i; - offsets[i] = source + segmentStart; + offsets[i] = source + segmentStart + distortions[i]; + } - if (info.Distortion != 0) - { - var angle = WAngle.FromDegrees(random.Next(360)); - var distortion = random.Next(info.Distortion); + // Apply distortion to each offset. + if (shouldDistort) + { + var angle = WAngle.FromDegrees(random.Next(360)); + var distortion = random.Next(ticks > 0 ? info.DistortionAnimation : info.Distortion); - var offset = distortion * angle.Cos() * leftVector / (1024 * 1024) - + distortion * angle.Sin() * upVector / (1024 * 1024); + var distOffset = distortion * angle.Cos() * leftVector / (1024 * 1024) + + distortion * angle.Sin() * upVector / (1024 * 1024); - offsets[i] += offset; - } + offsets[i] += distOffset; + distortions[i] += distOffset; } } + + recalculateOffsets = false; } - public void Tick(World world) + void DoImpacts() { - source = args.CurrentSource(); + if (info.ImpactTicks.Contains(ticks) || (info.ImpactInterval > 0 && (ticks + 1) % info.ImpactInterval == 0)) + { + // Do the beam impact (warheads) + var warheadArgs = new WarheadArgs(args) + { + ImpactOrientation = new WRot(WAngle.Zero, OpenRA.Mods.Common.Util.GetVerticalAngle(source, target), args.CurrentMuzzleFacing()), + ImpactPosition = target, + }; - if (hasLaunchEffect && ticks == 0) - world.AddFrameEndTask(w => w.Add(new SpriteEffect(args.CurrentSource, args.CurrentMuzzleFacing, world, - info.LaunchEffectImage, info.LaunchEffectSequence, info.LaunchEffectPalette))); + if (info.TrackTarget && args.Weapon.TargetActorCenter) + args.Weapon.Impact(args.GuidedTarget, warheadArgs); + else + args.Weapon.Impact(Target.FromPos(target), warheadArgs); + } + } - // Check for blocking actors - if (info.Blockable && BlocksProjectiles.AnyBlockingActorsBetween(world, source, target, info.CenterBeamWidth, out var blockedPos)) - target = blockedPos; + public void Tick(World world) + { + source = args.CurrentSource(); - if (++ticks >= info.Duration) + if (info.MaxFacingDeviation.Angle < 512 && !OpenRA.Mods.Common.Util.FacingWithinTolerance(args.CurrentMuzzleFacing(), initialMuzzleFacing, info.MaxFacingDeviation)) world.AddFrameEndTask(w => w.Remove(this)); - else if (info.DistortionAnimation != 0) - { - if (source != lastSource) - CalculateMainBeam(target - source); - else - { - offsets[0] = source; - for (var i = 1; i < offsets.Length - 1; i++) - { - var angle = WAngle.FromDegrees(random.Next(360)); - var distortion = random.Next(info.DistortionAnimation); + var direction = target - source; - var offset = distortion * angle.Cos() * leftVector / (1024 * 1024) - + distortion * angle.Sin() * upVector / (1024 * 1024); + TrackTarget(); + UpdateOffset(direction); + CheckBlocked(); + CalculateColors(direction); - offsets[i] += offset; - } - } + if (++ticks >= info.Duration || args.SourceActor.IsDead) + { + world.AddFrameEndTask(w => w.Remove(this)); + return; } + CalculateBeam(direction); + DoImpacts(); + lastSource = source; + lastTarget = target; } // workaround to stop closer targets resulting in beam with lower alpha @@ -279,28 +401,36 @@ private int GetRangeBonusAlpha(WVec direction) public IEnumerable Render(WorldRenderer worldRenderer) { + if (info.Invisible) + yield break; + if (worldRenderer.World.FogObscures(target) && worldRenderer.World.FogObscures(source)) yield break; if (ticks < info.Duration) { + var zOffset = info.ZOffset; + var verticalDiff = target.Y - source.Y; + if (verticalDiff > 0) + zOffset += verticalDiff; + if (info.CenterBeam) { var rc = Color.FromArgb((info.Duration - ticks) * info.CenterBeamColor.A / info.Duration, info.CenterBeamColor); - yield return new BeamRenderable(source, info.ZOffset + 2, target - source, info.CenterBeamShape, info.CenterBeamWidth, rc); + yield return new BeamRenderable(source, zOffset + 2, target - source, info.CenterBeamShape, info.CenterBeamWidth, rc); if (info.SecondaryCenterBeam) { var src = Color.FromArgb((info.Duration - ticks) * info.SecondaryCenterBeamColor.A / info.Duration, info.SecondaryCenterBeamColor); - yield return new BeamRenderable(source, info.ZOffset + 1, target - source, + yield return new BeamRenderable(source, zOffset + 1, target - source, info.CenterBeamShape, info.SecondaryCenterBeamWidth, src); } } for (var i = 0; i < offsets.Length - 1; i++) for (var j = 0; j < info.Radius; j++) - yield return new KKNDLaserRenderable(offsets, info.ZOffset, new WDist(32 + (info.Radius - j - 1) * 64), colors[j]); + yield return new KKNDLaserRenderable(offsets, zOffset, new WDist(32 + (info.Radius - j - 1) * 64), colors[j]); } } } diff --git a/OpenRA.Mods.CA/Projectiles/ProjectileHusk.cs b/OpenRA.Mods.CA/Projectiles/ProjectileHusk.cs new file mode 100644 index 0000000000..834029724e --- /dev/null +++ b/OpenRA.Mods.CA/Projectiles/ProjectileHusk.cs @@ -0,0 +1,253 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using OpenRA.GameRules; +using OpenRA.Graphics; +using OpenRA.Mods.Common.Effects; +using OpenRA.Mods.CA.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; +using Util = OpenRA.Mods.Common.Util; + +namespace OpenRA.Mods.CA.Projectiles +{ + [Desc("Projectile with customisable acceleration vector, recieve dead actor speed by using range modifier, used as aircraft husk.")] + public class ProjectileHuskInfo : IProjectileInfo + { + public readonly string Image = null; + + [SequenceReference(nameof(Image), allowNullImage: true)] + [Desc("Loop a randomly chosen sequence of Image from this list while falling.")] + public readonly string[] Sequences = { "idle" }; + + [PaletteReference] + [Desc("The palette used to draw this projectile.")] + public readonly string Palette = "effect"; + + [Desc("Palette is a player palette BaseName")] + public readonly bool IsPlayerPalette = false; + + [Desc("Does this projectile have a shadow?")] + public readonly bool Shadow = false; + + [Desc("Color to draw shadow if Shadow is true.")] + public readonly Color ShadowColor = Color.FromArgb(140, 0, 0, 0); + + [Desc("Projectile movement vector per tick (forward, right, up), use negative values for opposite directions.")] + public readonly WVec Velocity = WVec.Zero; + + [Desc("The X of the speed becomes dead actor speed by using range modifier, coop with " + nameof(SpawnHuskEffectOnDeath) + ".")] + public readonly bool UseRangeModifierAsVelocityX = true; + + [Desc("Movement random factor on Velocity.")] + public readonly WVec? VelocityRandomFactor = null; + + [Desc("Value added to Velocity every tick when spin is activated.")] + public readonly WVec AccelerationWhenSpin = new(0, 0, -10); + + [Desc("Value added to Velocity every tickwhen spin is NOT activated.")] + public readonly WVec Acceleration = new(0, 0, -10); + + [Desc("Chance of Spin. Activate Spin.")] + public readonly int SpinChance = 100; + + [Desc("Limit the maximum spin (in angle units per tick) that can be achieved.", + "0 Disables spinning.")] + public readonly int MaximumSpinSpeed = 0; + + [Desc("Spin acceleration.")] + public readonly int SpinAcc = 0; + + [Desc("begin spin speed.")] + public readonly int Spin = 0; + + [Desc("Revert the Y of the speed, and X, Y of acceleration at 50% randomness.")] + public readonly bool HorizontalRevert = false; + + [Desc("Trail animation.")] + public readonly string TrailImage = null; + + [SequenceReference(nameof(TrailImage), allowNullImage: true)] + [Desc("Loop a randomly chosen sequence of TrailImage from this list while this projectile is moving.")] + public readonly string[] TrailSequences = { "idle" }; + + [Desc("Interval in ticks between each spawned Trail animation.")] + public readonly int TrailInterval = 2; + + [Desc("Delay in ticks until trail animation is spawned.")] + public readonly int TrailDelay = 0; + + [PaletteReference(nameof(TrailUsePlayerPalette))] + [Desc("Palette used to render the trail sequence.")] + public readonly string TrailPalette = "effect"; + + [Desc("Use the Player Palette to render the trail sequence.")] + public readonly bool TrailUsePlayerPalette = false; + + public IProjectile Create(ProjectileArgs args) { return new ProjectileHusk(this, args); } + } + + public class ProjectileHusk : IProjectile, ISync + { + readonly ProjectileHuskInfo info; + readonly Animation anim; + readonly ProjectileArgs args; + readonly string trailPalette; + + readonly float3 shadowColor; + readonly float shadowAlpha; + readonly int spinAcc; + readonly int maxSpin; + + WVec velocity; + WVec acceleration; + WAngle facing; + int spin; + WDist dat; + + [Sync] + WPos pos, lastPos; + int smokeTicks; + + public ProjectileHusk(ProjectileHuskInfo info, ProjectileArgs args) + { + this.info = info; + this.args = args; + pos = args.Source; + facing = args.Facing; + var world = args.SourceActor.World; + dat = world.Map.DistanceAboveTerrain(pos); + + var vx = info.UseRangeModifierAsVelocityX && args.RangeModifiers.Length > 0 ? args.RangeModifiers[0] : info.Velocity.X; + var vec = info.VelocityRandomFactor != null ? new WVec(vx + world.SharedRandom.Next(info.VelocityRandomFactor.Value.X), info.Velocity.Y + world.SharedRandom.Next(info.VelocityRandomFactor.Value.Y), info.Velocity.Z + world.SharedRandom.Next(info.VelocityRandomFactor.Value.Z)) : new WVec(vx, info.Velocity.Y, info.Velocity.Z); + + if (info.HorizontalRevert && world.SharedRandom.Next(2) == 0) + { + velocity = new WVec(-vec.Y, -vec.X, vec.Z); + if (info.MaximumSpinSpeed > 0 && world.SharedRandom.Next(1, 101) <= info.SpinChance) + { + acceleration = new WVec(-info.AccelerationWhenSpin.Y, info.AccelerationWhenSpin.X, info.AccelerationWhenSpin.Z); + spin = -info.Spin; + spinAcc = -info.SpinAcc; + maxSpin = -info.MaximumSpinSpeed; + } + else + acceleration = new WVec(-info.Acceleration.Y, info.Acceleration.X, info.Acceleration.Z); + } + else + { + velocity = new WVec(vec.Y, -vec.X, vec.Z); + if (info.MaximumSpinSpeed > 0 && world.SharedRandom.Next(1, 101) <= info.SpinChance) + { + acceleration = new WVec(info.AccelerationWhenSpin.Y, -info.AccelerationWhenSpin.X, info.AccelerationWhenSpin.Z); + spin = info.Spin; + spinAcc = info.SpinAcc; + maxSpin = info.MaximumSpinSpeed; + } + else + acceleration = new WVec(info.Acceleration.Y, -info.Acceleration.X, info.Acceleration.Z); + } + + velocity = velocity.Rotate(WRot.FromYaw(facing)); + acceleration = acceleration.Rotate(WRot.FromYaw(facing)); + + if (!string.IsNullOrEmpty(info.Image)) + { + anim = new Animation(args.SourceActor.World, info.Image, GetEffectiveFacing); + anim.PlayRepeating(info.Sequences.Random(args.SourceActor.World.SharedRandom)); + } + + shadowColor = new float3(info.ShadowColor.R, info.ShadowColor.G, info.ShadowColor.B) / 255f; + shadowAlpha = info.ShadowColor.A / 255f; + + trailPalette = info.TrailPalette; + if (info.TrailUsePlayerPalette) + trailPalette += args.SourceActor.Owner.InternalName; + smokeTicks = info.TrailDelay; + } + + public void Tick(World world) + { + lastPos = pos; + pos += velocity; + dat = world.Map.DistanceAboveTerrain(pos); + + if (maxSpin != 0) + { + var spinAngle = new WAngle(spin); + facing += spinAngle; + acceleration = acceleration.Rotate(WRot.FromYaw(spinAngle)); + spin = Math.Abs(spin) < Math.Abs(maxSpin) ? spin + spinAcc : maxSpin; + } + + velocity += acceleration; + + // Explodes + if (dat.Length <= 0) + { + pos -= new WVec(0, 0, dat.Length); + world.AddFrameEndTask(w => w.Remove(this)); + + var warheadArgs = new WarheadArgs(args) + { + ImpactOrientation = new WRot(WAngle.Zero, Util.GetVerticalAngle(lastPos, pos), args.Facing), + ImpactPosition = pos, + }; + + args.Weapon.Impact(Target.FromPos(pos), warheadArgs); + } + + if (!string.IsNullOrEmpty(info.TrailImage) && --smokeTicks < 0) + { + world.AddFrameEndTask(w => w.Add(new SpriteEffect(pos, GetEffectiveFacing(), w, + info.TrailImage, info.TrailSequences.Random(world.SharedRandom), trailPalette))); + + smokeTicks = info.TrailInterval; + } + + anim?.Tick(); + } + + WAngle GetEffectiveFacing() + { + return facing; + } + + public IEnumerable Render(WorldRenderer wr) + { + if (anim == null) + yield break; + + var world = args.SourceActor.World; + if (!world.FogObscures(pos)) + { + var paletteName = info.Palette; + if (paletteName != null && info.IsPlayerPalette) + paletteName += args.SourceActor.Owner.InternalName; + + var palette = wr.Palette(paletteName); + + if (info.Shadow) + { + var shadowPos = pos - new WVec(0, 0, dat.Length); + foreach (var r in anim.Render(shadowPos, palette)) + yield return ((IModifyableRenderable)r) + .WithTint(shadowColor, ((IModifyableRenderable)r).TintModifiers | TintModifiers.ReplaceColor) + .WithAlpha(shadowAlpha); + } + + foreach (var r in anim.Render(pos, palette)) + yield return r; + } + } + } +} diff --git a/OpenRA.Mods.CA/Projectiles/RadBeam.cs b/OpenRA.Mods.CA/Projectiles/RadBeam.cs index 5a3ebd4b73..9d25c3494b 100644 --- a/OpenRA.Mods.CA/Projectiles/RadBeam.cs +++ b/OpenRA.Mods.CA/Projectiles/RadBeam.cs @@ -1,10 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -57,7 +57,7 @@ public class RadBeamInfo : IProjectileInfo public IProjectile Create(ProjectileArgs args) { - var c = UsePlayerColor ? args.SourceActor.Owner.Color : Color; + var c = UsePlayerColor ? args.SourceActor.OwnerColor() : Color; return new RadBeam(args, this, c); } } @@ -122,10 +122,15 @@ public IEnumerable Render(WorldRenderer wr) if (ticks < info.BeamDuration) { + var zOffset = info.ZOffset; + var verticalDiff = target.Y - args.Source.Y; + if (verticalDiff > 0) + zOffset += verticalDiff; + WDist amp = info.ScaleAmplitudeWithDuration ? info.Amplitude * ticks / info.BeamDuration : info.Amplitude; - yield return new RadBeamRenderable(args.Source, info.ZOffset, target - args.Source, info.Thickness, color, amp, info.WaveLength, info.QuantizationCount); + yield return new RadBeamRenderable(args.Source, zOffset, target - args.Source, info.Thickness, color, amp, info.WaveLength, info.QuantizationCount); } if (hitanim != null) diff --git a/OpenRA.Mods.CA/Projectiles/RailgunCA.cs b/OpenRA.Mods.CA/Projectiles/RailgunCA.cs new file mode 100644 index 0000000000..1e8cd731a5 --- /dev/null +++ b/OpenRA.Mods.CA/Projectiles/RailgunCA.cs @@ -0,0 +1,291 @@ +#region Copyright & License Information +/* + * Copyright (c) The OpenRA Developers and Contributors + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. For more + * information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.GameRules; +using OpenRA.Graphics; +using OpenRA.Mods.CA.Graphics; +using OpenRA.Mods.Common; +using OpenRA.Mods.Common.Graphics; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Projectiles +{ + [Desc("Laser effect with helix coiling around.")] + public class RailgunCAInfo : IProjectileInfo + { + [Desc("Damage all units hit by the beam instead of just the target?")] + public readonly bool DamageActorsInLine = false; + + [Desc("The maximum/constant/incremental inaccuracy used in conjunction with the InaccuracyType property.")] + public readonly WDist Inaccuracy = WDist.Zero; + + [Desc("Controls the way inaccuracy is calculated. Possible values are " + + "'Maximum' - scale from 0 to max with range, " + + "'PerCellIncrement' - scale from 0 with range, " + + "'Absolute' - use set value regardless of range.")] + public readonly InaccuracyType InaccuracyType = InaccuracyType.Maximum; + + [Desc("Can this projectile be blocked when hitting actors with an IBlocksProjectiles trait.")] + public readonly bool Blockable = false; + + [Desc("Duration of the beam and helix")] + public readonly int Duration = 15; + + [Desc("Equivalent to sequence ZOffset. Controls Z sorting.")] + public readonly int ZOffset = 0; + + [Desc("The width of the main trajectory. (\"beam\").")] + public readonly WDist BeamWidth = new(86); + + [Desc("The shape of the beam. Accepts values Cylindrical or Flat.")] + public readonly BeamRenderableShape BeamShape = BeamRenderableShape.Cylindrical; + + [Desc("Beam color in (A),R,G,B.")] + public readonly Color BeamColor = Color.FromArgb(128, 255, 255, 255); + + [Desc("When true, this will override BeamColor parameter and draw the laser with player color." + + " (Still uses BeamColor's alpha information)")] + public readonly bool BeamPlayerColor = false; + + [Desc("Beam alpha gets + this value per tick during drawing; hence negative value makes it fade over time.")] + public readonly int BeamAlphaDeltaPerTick = -8; + + [Desc("Thickness of the helix")] + public readonly WDist HelixThickness = new(32); + + [Desc("The radius of the spiral effect. (WDist)")] + public readonly WDist HelixRadius = new(64); + + [Desc("Height of one complete helix turn, measured parallel to the axis of the helix (WDist)")] + public readonly WDist HelixPitch = new(512); + + [Desc("Helix radius gets + this value per tick during drawing")] + public readonly int HelixRadiusDeltaPerTick = 8; + + [Desc("Helix alpha gets + this value per tick during drawing; hence negative value makes it fade over time.")] + public readonly int HelixAlphaDeltaPerTick = -8; + + [Desc("Helix spins by this much over time each tick.")] + public readonly WAngle HelixAngleDeltaPerTick = new(16); + + [Desc("Draw each cycle of helix with this many quantization steps")] + public readonly int QuantizationCount = 16; + + [Desc("Helix color in (A),R,G,B.")] + public readonly Color HelixColor = Color.FromArgb(128, 255, 255, 255); + + [Desc("Draw helix in PlayerColor? Overrides RGB part of the HelixColor. (Still uses HelixColor's alpha information)")] + public readonly bool HelixPlayerColor = false; + + [Desc("Impact animation.")] + public readonly string HitAnim = null; + + [Desc("Sequence of impact animation to use.")] + [SequenceReference(nameof(HitAnim), allowNullImage: true)] + public readonly string HitAnimSequence = "idle"; + + [PaletteReference] + public readonly string HitAnimPalette = "effect"; + + [Desc("If true, projectile will pass through targets to max range (subject to minimum distance).")] + public readonly bool PassthroughToMaxRange = false; + + [Desc("Target must be this far away for a full passthrough, otherwise the projectile stops at the target.")] + public readonly WDist PassthroughMinDistance = WDist.Zero; + + [Desc("If true, full passthroughs will travel parallel to the weapon muzzle offset.")] + public readonly bool PassthroughParallelToMuzzleOffset = false; + + [Desc("If true, the projectile will not be rendered.")] + public readonly bool Invisible = false; + + public IProjectile Create(ProjectileArgs args) + { + var bc = BeamPlayerColor ? Color.FromArgb(BeamColor.A, args.SourceActor.OwnerColor()) : BeamColor; + var hc = HelixPlayerColor ? Color.FromArgb(HelixColor.A, args.SourceActor.OwnerColor()) : HelixColor; + return new RailgunCA(args, this, bc, hc); + } + } + + public class RailgunCA : IProjectile, ISync + { + readonly ProjectileArgs args; + readonly RailgunCAInfo info; + readonly Animation hitanim; + public readonly Color BeamColor; + public readonly Color HelixColor; + + int ticks; + bool animationComplete; + + [Sync] + WPos target; + + // Computing these in Railgun instead of RailgunRenderable saves Info.Duration ticks of computation. + // Fortunately, railguns don't track the target. + public int CycleCount { get; private set; } + public WVec SourceToTarget { get; private set; } + public WVec ForwardStep { get; private set; } + public WVec LeftVector { get; private set; } + public WVec UpVector { get; private set; } + public WAngle AngleStep { get; private set; } + + public RailgunCA(ProjectileArgs args, RailgunCAInfo info, Color beamColor, Color helixColor) + { + this.args = args; + this.info = info; + target = args.PassiveTarget; + + BeamColor = beamColor; + HelixColor = helixColor; + + if (info.Inaccuracy.Length > 0) + { + var maxInaccuracyOffset = Common.Util.GetProjectileInaccuracy(info.Inaccuracy.Length, info.InaccuracyType, args); + target += WVec.FromPDF(args.SourceActor.World.SharedRandom, 2) * maxInaccuracyOffset / 1024; + } + + if (!string.IsNullOrEmpty(info.HitAnim)) + hitanim = new Animation(args.SourceActor.World, info.HitAnim); + + CalculateVectors(); + } + + void CalculateVectors() + { + if (info.PassthroughToMaxRange && (info.PassthroughMinDistance.Length == 0 || (target - args.Source).Length >= info.PassthroughMinDistance.Length)) + { + var rangeModifiers = args.SourceActor.TraitsImplementing().ToArray().Select(m => m.GetRangeModifier()); + var weaponRange = new WDist(Common.Util.ApplyPercentageModifiers(args.Weapon.Range.Length, rangeModifiers)); + var speed = new WVec(0, -weaponRange.Length, 0); + + if (info.PassthroughParallelToMuzzleOffset) + { + var offsetFromCenter = args.Source - args.SourceActor.CenterPosition; + target += offsetFromCenter; + } + + var fullRangeVector = speed.Rotate(WRot.FromYaw((target - args.Source).Yaw)); + target = args.Source + fullRangeVector; + } + + // Check for blocking actors + if (info.Blockable && BlocksProjectiles.AnyBlockingActorsBetween(args.SourceActor.World, args.SourceActor.Owner, target, args.Source, + info.BeamWidth, out var blockedPos)) + target = blockedPos; + + // Note: WAngle.Sin(x) = 1024 * Math.Sin(2pi/1024 * x) + AngleStep = new WAngle(1024 / info.QuantizationCount); + + SourceToTarget = target - args.Source; + + // Forward step, pointing from src to target. + // QuantizationCont * forwardStep == One cycle of beam in src2target direction. + ForwardStep = info.HelixPitch.Length * SourceToTarget / (info.QuantizationCount * SourceToTarget.Length); + + // An easy vector to find which is perpendicular vector to forwardStep, with 0 Z component + LeftVector = new WVec(ForwardStep.Y, -ForwardStep.X, 0); + if (LeftVector.LengthSquared != 0) + LeftVector = 1024 * LeftVector / LeftVector.Length; + + // Vector that is pointing upwards from the ground + UpVector = new WVec( + -ForwardStep.X * ForwardStep.Z, + -ForwardStep.Z * ForwardStep.Y, + ForwardStep.X * ForwardStep.X + ForwardStep.Y * ForwardStep.Y); + + if (UpVector.LengthSquared != 0) + UpVector = 1024 * UpVector / UpVector.Length; + + //// LeftVector and UpVector are unit vectors of size 1024. + + CycleCount = SourceToTarget.Length / info.HelixPitch.Length; + if (SourceToTarget.Length % info.HelixPitch.Length != 0) + CycleCount++; // math.ceil, int version. + + // Using ForwardStep * CycleCount, the helix and the main beam gets "out of sync" + // if drawn from source to target. Instead, the main beam is drawn from source to end point of helix. + // Trade-off between computation vs Railgun weapon range. + // Modders must not have too large range for railgun weapons. + SourceToTarget = info.QuantizationCount * CycleCount * ForwardStep; + } + + public void Tick(World world) + { + if (ticks == 0) + { + if (hitanim != null) + hitanim.PlayThen(info.HitAnimSequence, () => animationComplete = true); + else + animationComplete = true; + + if (!info.DamageActorsInLine) + { + var warheadArgs = new WarheadArgs(args) + { + ImpactOrientation = new WRot(WAngle.Zero, Common.Util.GetVerticalAngle(args.Source, target), args.Facing), + ImpactPosition = target, + }; + + args.Weapon.Impact(Target.FromPos(target), warheadArgs); + } + else + { + var actors = world.FindActorsOnLine(args.Source, target, info.BeamWidth); + foreach (var a in actors) + { + var warheadArgs = new WarheadArgs(args) + { + ImpactOrientation = new WRot(WAngle.Zero, Common.Util.GetVerticalAngle(args.Source, target), args.Facing), + + // Calculating an impact position is bogus for line damage. + // FindActorsOnLine guarantees that the beam touches the target's HitShape, + // so we just assume a center hit to avoid bogus warhead recalculations. + ImpactPosition = a.CenterPosition, + }; + + args.Weapon.Impact(Target.FromActor(a), warheadArgs); + } + } + } + + hitanim?.Tick(); + + if (ticks++ > info.Duration && animationComplete) + world.AddFrameEndTask(w => w.Remove(this)); + } + + public IEnumerable Render(WorldRenderer wr) + { + if (info.Invisible) + yield break; + + if (wr.World.FogObscures(target) && + wr.World.FogObscures(args.Source)) + yield break; + + if (ticks < info.Duration) + { + yield return new RailgunHelixRenderableCA(args.Source, info.ZOffset, this, info, ticks); + yield return new BeamRenderable(args.Source, info.ZOffset, SourceToTarget, info.BeamShape, info.BeamWidth, + Color.FromArgb(BeamColor.A + info.BeamAlphaDeltaPerTick * ticks, BeamColor)); + } + + if (hitanim != null) + foreach (var r in hitanim.Render(target, wr.Palette(info.HitAnimPalette))) + yield return r; + } + } +} diff --git a/OpenRA.Mods.CA/Projectiles/TeslaZapCA.cs b/OpenRA.Mods.CA/Projectiles/TeslaZapCA.cs new file mode 100644 index 0000000000..739bd109ec --- /dev/null +++ b/OpenRA.Mods.CA/Projectiles/TeslaZapCA.cs @@ -0,0 +1,91 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using OpenRA.GameRules; +using OpenRA.Graphics; +using OpenRA.Mods.CA.Graphics; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Projectiles +{ + [Desc("Copy of TeslaZap. CA version adds to ZOffset for targets below the source.")] + public class TeslaZapCAInfo : IProjectileInfo + { + public readonly string Image = "litning"; + + [SequenceReference(nameof(Image))] + public readonly string BrightSequence = "bright"; + + [SequenceReference(nameof(Image))] + public readonly string DimSequence = "dim"; + + [PaletteReference] + public readonly string Palette = "effect"; + + public readonly int BrightZaps = 1; + public readonly int DimZaps = 2; + + public readonly int Duration = 2; + + public readonly int DamageDuration = 1; + + public readonly bool TrackTarget = true; + + public IProjectile Create(ProjectileArgs args) { return new TeslaZapCA(this, args); } + } + + public class TeslaZapCA : IProjectile, ISync + { + readonly ProjectileArgs args; + readonly TeslaZapCAInfo info; + TeslaZapRenderableCA zap; + int ticksUntilRemove; + int damageDuration; + + [Sync] + WPos target; + + public TeslaZapCA(TeslaZapCAInfo info, ProjectileArgs args) + { + this.args = args; + this.info = info; + ticksUntilRemove = info.Duration; + damageDuration = info.DamageDuration > info.Duration ? info.Duration : info.DamageDuration; + target = args.PassiveTarget; + } + + public void Tick(World world) + { + if (ticksUntilRemove-- <= 0) + world.AddFrameEndTask(w => w.Remove(this)); + + // Zap tracks target + if (info.TrackTarget && args.GuidedTarget.IsValidFor(args.SourceActor)) + target = args.Weapon.TargetActorCenter ? args.GuidedTarget.CenterPosition : args.GuidedTarget.Positions.ClosestToIgnoringPath(args.Source); + + if (damageDuration-- > 0) + args.Weapon.Impact(Target.FromPos(target), new WarheadArgs(args)); + } + + public IEnumerable Render(WorldRenderer wr) + { + var zOffset = 0; + var verticalDiff = target.Y - args.Source.Y; + if (verticalDiff > 0) + zOffset += verticalDiff; + + zap = new TeslaZapRenderableCA(args.Source, zOffset, target - args.Source, + info.Image, info.BrightSequence, info.BrightZaps, info.DimSequence, info.DimZaps, info.Palette); + + yield return zap; + } + } +} diff --git a/OpenRA.Mods.CA/Scripting/ActorCAGlobal.cs b/OpenRA.Mods.CA/Scripting/ActorCAGlobal.cs new file mode 100644 index 0000000000..4bbdc161b9 --- /dev/null +++ b/OpenRA.Mods.CA/Scripting/ActorCAGlobal.cs @@ -0,0 +1,35 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using Eluant; +using OpenRA.Mods.Common.Traits; +using OpenRA.Scripting; + +namespace OpenRA.Mods.Common.Scripting +{ + [ScriptGlobal("ActorCA")] + public class ActorCAGlobal : ScriptGlobal + { + public ActorCAGlobal(ScriptContext context) + : base(context) { } + + public int CostOrDefault(string type, int defaultCost = 0) + { + if (!Context.World.Map.Rules.Actors.TryGetValue(type, out var ai)) + throw new LuaException($"Unknown actor type '{type}'"); + + var vi = ai.TraitInfoOrDefault(); + if (vi == null) + return defaultCost; + + return vi.Cost; + } + } +} diff --git a/OpenRA.Mods.CA/Scripting/AirstrikeCAProperties.cs b/OpenRA.Mods.CA/Scripting/AirstrikeCAProperties.cs new file mode 100644 index 0000000000..76a08e5328 --- /dev/null +++ b/OpenRA.Mods.CA/Scripting/AirstrikeCAProperties.cs @@ -0,0 +1,35 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Linq; +using OpenRA.Mods.CA.Traits; +using OpenRA.Scripting; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Scripting +{ + [ScriptPropertyGroup("Support Powers")] + public class AirstrikeCAProperties : ScriptActorProperties, Requires + { + readonly AirstrikePowerCA ap; + + public AirstrikeCAProperties(ScriptContext context, Actor self) + : base(context, self) + { + ap = self.TraitsImplementing().First(); + } + + [Desc("Activate the actor's Airstrike Power. Returns the aircraft that will attack.")] + public Actor[] TargetAirstrike(WPos target, WAngle? facing = null) + { + return ap.SendAirstrike(Self, target, facing); + } + } +} diff --git a/OpenRA.Mods.CA/Scripting/BuildingProperties.cs b/OpenRA.Mods.CA/Scripting/BuildingProperties.cs new file mode 100644 index 0000000000..9226b69562 --- /dev/null +++ b/OpenRA.Mods.CA/Scripting/BuildingProperties.cs @@ -0,0 +1,32 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Mods.Common.Traits; +using OpenRA.Scripting; +using OpenRA.Traits; +using System.Linq; + +namespace OpenRA.Mods.CA.Scripting +{ + [ScriptPropertyGroup("Building")] + public class BuildingProperties : ScriptActorProperties, Requires + { + readonly Building building; + + public BuildingProperties(ScriptContext context, Actor self) + : base(context, self) + { + building = self.Trait(); + } + + [Desc("Returns the building's footprint cells.")] + public CPos[] FootprintCells => building.Info.Tiles(Self.Location).OrderBy(t => t.Y).ThenBy(t => t.X).ToArray(); + } +} diff --git a/OpenRA.Mods.CA/Scripting/CombatCAProperties.cs b/OpenRA.Mods.CA/Scripting/CombatCAProperties.cs new file mode 100644 index 0000000000..23b24bbf10 --- /dev/null +++ b/OpenRA.Mods.CA/Scripting/CombatCAProperties.cs @@ -0,0 +1,31 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Mods.CA.Activities; +using OpenRA.Mods.Common.Traits; +using OpenRA.Scripting; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Scripting +{ + [ScriptPropertyGroup("Combat")] + public class CombatCAProperties : ScriptActorProperties, Requires, Requires + { + public CombatCAProperties(ScriptContext context, Actor self) + : base(context, self) {} + + [ScriptActorPropertyActivity] + [Desc("Ignoring visibility, find the closest hostile target and attack move to within 2 cells of it.")] + public void HuntCA() + { + Self.QueueActivity(new HuntCA(Self)); + } + } +} diff --git a/OpenRA.Mods.CA/Scripting/MadTankCAGlobal.cs b/OpenRA.Mods.CA/Scripting/MadTankCAGlobal.cs new file mode 100644 index 0000000000..344eeab0fc --- /dev/null +++ b/OpenRA.Mods.CA/Scripting/MadTankCAGlobal.cs @@ -0,0 +1,35 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Mods.CA.Traits; +using OpenRA.Scripting; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Scripting +{ + [ScriptPropertyGroup("MadTankCA")] + public class MadTankCAProperties : ScriptActorProperties, Requires + { + readonly MadTankCA madTank; + + public MadTankCAProperties(ScriptContext context, Actor self) + : base(context, self) + { + madTank = self.Trait(); + } + + [ScriptActorPropertyActivity] + [Desc("Queue MAD Tank detonation.")] + public void MadTankDetonate() + { + Self.QueueActivity(true, new MadTankCA.DetonationSequence(Self, madTank)); + } + } +} diff --git a/OpenRA.Mods.CA/Scripting/MediaCAGlobal.cs b/OpenRA.Mods.CA/Scripting/MediaCAGlobal.cs new file mode 100644 index 0000000000..4b5a6713a1 --- /dev/null +++ b/OpenRA.Mods.CA/Scripting/MediaCAGlobal.cs @@ -0,0 +1,39 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Scripting; + +namespace OpenRA.Mods.CA.Scripting +{ + [Desc("PlaySound includes a volume modifier.")] + [ScriptGlobal("MediaCA")] + public class MediaCAGlobal : ScriptGlobal + { + readonly World world; + + public MediaCAGlobal(ScriptContext context) + : base(context) + { + world = context.World; + } + + [Desc("Play a sound file")] + public void PlaySound(string file, double volumeModifier) + { + Game.Sound.Play(SoundType.World, file, (float)volumeModifier); + } + + [Desc("Play a sound file at specific world position")] + public void PlaySoundAtPos(string file, double volumeModifier, WPos pos) + { + Game.Sound.Play(SoundType.World, file, pos, (float)volumeModifier); + } + } +} diff --git a/OpenRA.Mods.CA/Scripting/PlayerCAProperties.cs b/OpenRA.Mods.CA/Scripting/PlayerCAProperties.cs new file mode 100644 index 0000000000..5b4e4a8e0f --- /dev/null +++ b/OpenRA.Mods.CA/Scripting/PlayerCAProperties.cs @@ -0,0 +1,70 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.Mods.CA.Traits; +using OpenRA.Mods.Common.Traits; +using OpenRA.Scripting; + +namespace OpenRA.Mods.Common.Scripting +{ + [ScriptPropertyGroup("PlayerCA")] + public class PlayerCAProperties : ScriptPlayerProperties + { + public PlayerCAProperties(ScriptContext context, Player player) + : base(context, player) { } + + [Desc("Returns all living actors of the specified target types of this player.")] + public Actor[] GetActorsByTargetTypes(string[] targetTypes) + { + var result = new List(); + + result.AddRange(Player.World.Actors + .Where(actor => actor.Owner == Player && !actor.IsDead && actor.IsInWorld && + actor.GetEnabledTargetTypes().Any(t => targetTypes.Contains(t.ToString())))); + + return result.ToArray(); + } + + [Desc("Returns all living actors of the specified armor types of this player.")] + public Actor[] GetActorsByArmorTypes(string[] armorType) + { + var result = new List(); + + result.AddRange(Player.World.Actors + .Where(actor => actor.Owner == Player && !actor.IsDead && actor.IsInWorld && + actor.Info.TraitInfos().Any(ai => armorType.Contains(ai.Type.ToString())))); + + return result.ToArray(); + } + + [Desc("True if the player has not surrendered or disconnected.")] + public bool PlayerIsActive + { + get + { + if (Player == null) + return false; + + if (Player.Spectating) + return false; + + if (Player.WinState == WinState.Lost) + return false; + + if (Player.PlayerActor.TraitOrDefault()?.IsConnected != true) + return false; + + return true; + } + } + } +} diff --git a/OpenRA.Mods.CA/Scripting/PortableChronoCAGlobal.cs b/OpenRA.Mods.CA/Scripting/PortableChronoCAGlobal.cs new file mode 100644 index 0000000000..e72668c465 --- /dev/null +++ b/OpenRA.Mods.CA/Scripting/PortableChronoCAGlobal.cs @@ -0,0 +1,36 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Mods.CA.Traits; +using OpenRA.Scripting; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Scripting +{ + [ScriptPropertyGroup("PortableChronoCA")] + public class PortableChronoCAProperties : ScriptActorProperties, Requires + { + readonly PortableChronoCA PortableChrono; + + public PortableChronoCAProperties(ScriptContext context, Actor self) + : base(context, self) + { + PortableChrono = self.Trait(); + } + + [ScriptActorPropertyActivity] + [Desc("Queue portable chrono teleport.")] + public void PortableChronoTeleport(CPos targetCell, bool queued = false) + { + var target = Target.FromCell(Self.World, targetCell); + PortableChrono.ResolveOrder(Self, new Order("PortableChronoTeleport", Self, target, queued)); + } + } +} diff --git a/OpenRA.Mods.CA/Scripting/ReinforcementsCAGlobal.cs b/OpenRA.Mods.CA/Scripting/ReinforcementsCAGlobal.cs new file mode 100644 index 0000000000..2270ae991b --- /dev/null +++ b/OpenRA.Mods.CA/Scripting/ReinforcementsCAGlobal.cs @@ -0,0 +1,161 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using Eluant; +using OpenRA.Activities; +using OpenRA.Mods.Common; +using OpenRA.Mods.Common.Activities; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Scripting; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Scripting +{ + // Copy of ReinforcementsGlobal, but supports Carryall + [ScriptGlobal("ReinforcementsCA")] + public class ReinforcementsCAGlobal : ScriptGlobal + { + public ReinforcementsCAGlobal(ScriptContext context) + : base(context) + { + } + + Actor CreateActor(Player owner, string actorType, bool addToWorld, CPos? entryLocation = null, CPos? nextLocation = null) + { + if (!Context.World.Map.Rules.Actors.TryGetValue(actorType, out var ai)) + throw new LuaException($"Unknown actor type '{actorType}'"); + + var initDict = new TypeDictionary + { + new OwnerInit(owner) + }; + + if (entryLocation.HasValue) + { + initDict.Add(new LocationInit(entryLocation.Value)); + + var pi = ai.TraitInfoOrDefault(); + if (pi != null) + initDict.Add(new CenterPositionInit(owner.World.Map.CenterOfCell(entryLocation.Value) + new WVec(0, 0, pi.CruiseAltitude.Length))); + } + + if (entryLocation.HasValue && nextLocation.HasValue) + { + var facing = Context.World.Map.FacingBetween(CPos.Zero, CPos.Zero + (nextLocation.Value - entryLocation.Value), WAngle.Zero); + initDict.Add(new FacingInit(facing)); + } + + return Context.World.CreateActor(addToWorld, actorType, initDict); + } + + void Move(Actor actor, CPos dest) + { + var move = actor.TraitOrDefault(); + if (move == null) + return; + + actor.QueueActivity(move.MoveTo(dest, 2)); + } + + [Desc("Send reinforcements in a transport. A transport can be a ground unit (APC etc.), ships and aircraft. " + + "The first member of the entryPath array will be the spawnpoint for the transport, " + + "while the last one will be its destination. The last member of the exitPath array " + + "is be the place where the transport will be removed from the game. When the transport " + + "has reached the destination, it will unload its cargo unless a custom actionFunc has " + + "been supplied. Afterwards, the transport will follow the exitPath and leave the map, " + + "unless a custom exitFunc has been supplied. actionFunc will be called as " + + "actionFunc(Actor transport, Actor[] cargo). exitFunc will be called as exitFunc(Actor transport). " + + "dropRange determines how many cells away the transport will try to land " + + "if the actual destination is blocked (if the transport is an aircraft). " + + "Returns a table in which the first value is the transport, " + + "and the second a table containing the deployed units.")] + public LuaTable ReinforceWithTransport(Player owner, string actorType, string[] cargoTypes, CPos[] entryPath, CPos[] exitPath = null, + LuaFunction actionFunc = null, LuaFunction exitFunc = null, int dropRange = 3) + { + var transport = CreateActor(owner, actorType, true, entryPath[0], entryPath.Length > 1 ? entryPath[1] : (CPos?)null); + var cargo = transport.TraitOrDefault(); + + var passengers = new List(); + if (cargo != null && cargoTypes != null) + { + foreach (var cargoType in cargoTypes) + { + var passenger = CreateActor(owner, cargoType, false, entryPath[0]); + passengers.Add(passenger); + cargo.Load(transport, passenger); + } + } + + for (var i = 1; i < entryPath.Length; i++) + Move(transport, entryPath[i]); + + if (actionFunc != null) + { + var af = (LuaFunction)actionFunc.CopyReference(); + transport.QueueActivity(new CallFunc(() => + { + using (af) + using (LuaValue t = transport.ToLuaValue(Context), p = passengers.ToArray().ToLuaValue(Context)) + af.Call(t, p); + })); + } + else + { + var aircraft = transport.TraitOrDefault(); + var carryall = transport.TraitOrDefault(); + + // Scripted cargo aircraft must turn to default position before unloading. + // TODO: pass facing through UnloadCargo instead. + if (aircraft != null) + transport.QueueActivity(new Land(transport, Target.FromCell(transport.World, entryPath.Last()), WDist.FromCells(dropRange), aircraft.Info.InitialFacing)); + + if (cargo != null) + transport.QueueActivity(new UnloadCargo(transport, WDist.FromCells(dropRange))); + + if (carryall != null) + transport.QueueActivity(new DeliverUnit(transport, WDist.FromCells(5), Color.Yellow)); + } + + if (exitFunc != null) + { + var ef = (LuaFunction)exitFunc.CopyReference(); + transport.QueueActivity(new CallFunc(() => + { + using (ef) + using (var t = transport.ToLuaValue(Context)) + ef.Call(t); + })); + } + else if (exitPath != null) + { + foreach (var wpt in exitPath) + Move(transport, wpt); + + transport.QueueActivity(new RemoveSelf()); + } + + var ret = Context.CreateTable(); + using (LuaValue + tKey = 1, + tValue = transport.ToLuaValue(Context), + pKey = 2, + pValue = passengers.ToArray().ToLuaValue(Context)) + { + ret.Add(tKey, tValue); + ret.Add(pKey, pValue); + } + + return ret; + } + } +} diff --git a/OpenRA.Mods.CA/Scripting/ScriptTriggersCA.cs b/OpenRA.Mods.CA/Scripting/ScriptTriggersCA.cs new file mode 100644 index 0000000000..37410dcc38 --- /dev/null +++ b/OpenRA.Mods.CA/Scripting/ScriptTriggersCA.cs @@ -0,0 +1,120 @@ +#region Copyright & License Information +/* + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using Eluant; +using OpenRA.Scripting; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Scripting +{ + public enum TriggerCA + { + OnPlayerDisconnected + } + + [Desc("Allows map scripts to attach CA-specific triggers to this actor via the TriggerCA global.")] + public class ScriptTriggersCAInfo : TraitInfo + { + public override object Create(ActorInitializer init) { return new ScriptTriggersCA(init.World, init.Self); } + } + + public sealed class ScriptTriggersCA : INotifyPlayerDisconnected, INotifyActorDisposing + { + readonly World world; + readonly Actor self; + + readonly List[] triggerables = Exts.MakeArray(Enum.GetValues(typeof(TriggerCA)).Length, _ => new List()); + + readonly struct Triggerable : IDisposable + { + public readonly LuaFunction Function; + public readonly ScriptContext Context; + public readonly LuaValue Self; + + public Triggerable(LuaFunction function, ScriptContext context, Actor self) + { + Function = (LuaFunction)function.CopyReference(); + Context = context; + Self = self.ToLuaValue(Context); + } + + public void Dispose() + { + Function.Dispose(); + Self.Dispose(); + } + } + + public ScriptTriggersCA(World world, Actor self) + { + this.world = world; + this.self = self; + } + + List Triggerables(TriggerCA trigger) + { + return triggerables[(int)trigger]; + } + + public void RegisterCallback(TriggerCA trigger, LuaFunction func, ScriptContext context) + { + Triggerables(trigger).Add(new Triggerable(func, context, self)); + } + + public bool HasAnyCallbacksFor(TriggerCA trigger) + { + return Triggerables(trigger).Count > 0; + } + + void INotifyPlayerDisconnected.PlayerDisconnected(Actor self, Player p) + { + if (world.Disposing) + return; + + foreach (var f in Triggerables(TriggerCA.OnPlayerDisconnected)) + { + try + { + using (var player = p.ToLuaValue(f.Context)) + f.Function.Call(player).Dispose(); + } + catch (Exception ex) + { + f.Context.FatalError(ex); + return; + } + } + } + + public void Clear(TriggerCA trigger) + { + world.AddFrameEndTask(w => + { + var triggerables = Triggerables(trigger); + foreach (var f in triggerables) + f.Dispose(); + triggerables.Clear(); + }); + } + + public void ClearAll() + { + foreach (TriggerCA t in Enum.GetValues(typeof(TriggerCA))) + Clear(t); + } + + void INotifyActorDisposing.Disposing(Actor self) + { + ClearAll(); + } + } +} diff --git a/OpenRA.Mods.CA/Scripting/TargetableCAProperties.cs b/OpenRA.Mods.CA/Scripting/TargetableCAProperties.cs new file mode 100644 index 0000000000..8da48c4a65 --- /dev/null +++ b/OpenRA.Mods.CA/Scripting/TargetableCAProperties.cs @@ -0,0 +1,29 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Mods.Common.Traits; +using OpenRA.Scripting; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Scripting +{ + [ScriptPropertyGroup("TargetableCA")] + public class TargetableCAProperties : ScriptActorProperties, Requires + { + public TargetableCAProperties(ScriptContext context, Actor self) + : base(context, self) { } + + [Desc("Whether the actor has the specified target type.")] + public bool HasTargetType(string targetType) + { + return Self.GetEnabledTargetTypes().Contains(targetType); + } + } +} diff --git a/OpenRA.Mods.CA/Scripting/TargetedLeapAbilityGlobal.cs b/OpenRA.Mods.CA/Scripting/TargetedLeapAbilityGlobal.cs new file mode 100644 index 0000000000..b3590660ca --- /dev/null +++ b/OpenRA.Mods.CA/Scripting/TargetedLeapAbilityGlobal.cs @@ -0,0 +1,36 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Mods.CA.Traits; +using OpenRA.Scripting; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Scripting +{ + [ScriptPropertyGroup("TargetableLeapAbility")] + public class TargetableLeapAbilityProperties : ScriptActorProperties, Requires + { + readonly TargetedLeapAbility LeapAbility; + + public TargetableLeapAbilityProperties(ScriptContext context, Actor self) + : base(context, self) + { + LeapAbility = self.Trait(); + } + + [ScriptActorPropertyActivity] + [Desc("Queue targeted leap.")] + public void TargetedLeap(CPos targetCell) + { + var target = Target.FromCell(Self.World, targetCell); + LeapAbility.ResolveOrder(Self, new Order("TargetedLeapOrderLeap", Self, target, true)); + } + } +} diff --git a/OpenRA.Mods.CA/Scripting/TriggerCAGlobal.cs b/OpenRA.Mods.CA/Scripting/TriggerCAGlobal.cs new file mode 100644 index 0000000000..9de6df5c2a --- /dev/null +++ b/OpenRA.Mods.CA/Scripting/TriggerCAGlobal.cs @@ -0,0 +1,39 @@ +#region Copyright & License Information +/* + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using Eluant; +using OpenRA.Mods.CA.Scripting; +using OpenRA.Scripting; + +namespace OpenRA.Mods.Common.Scripting +{ + [ScriptGlobal("TriggerCA")] + public class TriggerCAGlobal : ScriptGlobal + { + public TriggerCAGlobal(ScriptContext context) + : base(context) { } + + public static ScriptTriggersCA GetScriptTriggersCA(Actor actor) + { + var triggers = actor.TraitOrDefault(); + if (triggers == null) + throw new LuaException($"Actor '{actor.Info.Name}' requires the ScriptTriggersCA trait before attaching a CA trigger"); + + return triggers; + } + + [Desc("Call a function when a player disconnects. " + + "The callback function will be called as func(player: player).")] + public void OnPlayerDisconnected(Player player, [ScriptEmmyTypeOverride("fun(player: player)")] LuaFunction func) + { + GetScriptTriggersCA(player.PlayerActor).RegisterCallback(TriggerCA.OnPlayerDisconnected, func, Context); + } + } +} diff --git a/OpenRA.Mods.CA/Scripting/UtilsCAGlobal.cs b/OpenRA.Mods.CA/Scripting/UtilsCAGlobal.cs new file mode 100644 index 0000000000..0cf1aa278a --- /dev/null +++ b/OpenRA.Mods.CA/Scripting/UtilsCAGlobal.cs @@ -0,0 +1,98 @@ + + +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Mods.Common.Traits; +using OpenRA.Mods.Common.Widgets; +using OpenRA.Scripting; +using System.Linq; + +namespace OpenRA.Mods.CA.Scripting +{ + [ScriptGlobal("UtilsCA")] + public class UtilsCAGlobal : ScriptGlobal + { + readonly World world; + + public UtilsCAGlobal(ScriptContext context) + : base(context) + { + world = context.World; + } + + [Desc("Returns game speed.")] + public string GameSpeed() + { + var gameSpeeds = Game.ModData.Manifest.Get(); + return world.LobbyInfo.GlobalSettings.OptionOrDefault("gamespeed", gameSpeeds.DefaultSpeed); + } + + [Desc("Returns whether fog of war is enabled.")] + public bool FogEnabled() + { + return world.LobbyInfo.GlobalSettings.OptionOrDefault("fog", true); + } + + [Desc("Returns a number of ticks as formatted time for the current game speed.")] + public string FormatTimeForGameSpeed(int ticks) + { + return WidgetUtils.FormatTime(ticks, world.Timestep); + } + + [Desc("Returns hotkey for a specified hotkey name.")] + public string Hotkey(string hotkeyName) + { + var reference = Game.ModData.Hotkeys[hotkeyName]; + var hotkey = reference.GetValue(); + return hotkey.DisplayString(); + } + + [Desc("Returns whether a specified building type can be placed at a given cell location.")] + public bool CanPlaceBuilding(string type, CPos cell) + { + var ai = world.Map.Rules.Actors[type]; + var bi = ai.TraitInfoOrDefault(); + + if (bi == null) + return false; + + return BuildingUtils.CanPlaceBuilding(world, cell, ai, bi, null); + } + + [Desc("Returns whether shroud obscures a given cell location.")] + public bool ShroudObscures(CPos loc) + { + return world.ShroudObscures(loc); + } + + [Desc("Returns whether fog of war obscures a given cell location.")] + public bool FogObscures(CPos loc) + { + return world.FogObscures(loc); + } + + [Desc("Returns whether a path exists between source and target for given locomotor.")] + public bool PathExistsForLocomotor(string locomotorName, CPos source, CPos target) + { + var pathFinder = world.WorldActor.TraitOrDefault(); + + if (pathFinder == null) + return false; + + var locomotor = world.WorldActor.TraitsImplementing().SingleOrDefault(l => l.Info.Name == locomotorName); + + if (locomotor == null) + return false; + + return pathFinder.PathExistsForLocomotor(locomotor, source, target); + } + } +} diff --git a/OpenRA.Mods.CA/SpriteLoaders/R8Loader.cs b/OpenRA.Mods.CA/SpriteLoaders/R8Loader.cs index b123f3adc8..7436927bc2 100644 --- a/OpenRA.Mods.CA/SpriteLoaders/R8Loader.cs +++ b/OpenRA.Mods.CA/SpriteLoaders/R8Loader.cs @@ -1,19 +1,17 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion using System.Collections.Generic; using System.IO; -using System.Linq; using OpenRA.Graphics; -using OpenRA.Mods.Common.Graphics; +using OpenRA.Mods.Common.SpriteLoaders; using OpenRA.Primitives; namespace OpenRA.Mods.CA.SpriteLoaders @@ -22,12 +20,12 @@ public class R8Loader : ISpriteLoader { class R8Frame : ISpriteFrame { - public SpriteFrameType Type { get; set; } + public SpriteFrameType Type => SpriteFrameType.Indexed8; public Size Size { get; private set; } public Size FrameSize { get; private set; } public float2 Offset { get; private set; } public byte[] Data { get; set; } - public bool DisableExportPadding { get { return true; } } + public bool DisableExportPadding => true; public readonly uint[] Palette = null; @@ -51,7 +49,7 @@ public R8Frame(Stream s) var paletteOffset = s.ReadInt32(); var bpp = s.ReadUInt8(); if (bpp != 8) - throw new InvalidDataException("Error: {0} bits per pixel are not supported.".F(bpp)); + throw new InvalidDataException($"Error: {bpp} bits per pixel are not supported."); var frameHeight = s.ReadUInt8(); var frameWidth = s.ReadUInt8(); @@ -98,7 +96,7 @@ bool IsR8(Stream s) return d == 8; } - public bool TryParseSprite(Stream s, out ISpriteFrame[] frames, out TypeDictionary metadata) + public bool TryParseSprite(Stream s, string filename, out ISpriteFrame[] frames, out TypeDictionary metadata) { metadata = null; if (!IsR8(s)) @@ -121,7 +119,7 @@ public bool TryParseSprite(Stream s, out ISpriteFrame[] frames, out TypeDictiona s.Position = start; frames = tmp.ToArray(); - if (palettes.Any()) + if (palettes.Count > 0) metadata = new TypeDictionary { new EmbeddedSpritePalette(framePalettes: palettes) }; return true; diff --git a/OpenRA.Mods.CA/Traits/AIUtils.cs b/OpenRA.Mods.CA/Traits/AIUtils.cs deleted file mode 100644 index bf7bd1a1b1..0000000000 --- a/OpenRA.Mods.CA/Traits/AIUtils.cs +++ /dev/null @@ -1,84 +0,0 @@ -#region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. - */ -#endregion - -using System.Collections.Generic; -using System.Linq; -using OpenRA.Mods.Common; -using OpenRA.Mods.Common.Traits; -using OpenRA.Traits; - -namespace OpenRA.Mods.CA -{ - public enum BuildingType { Building, Defense, Refinery, Fragile } - - public enum WaterCheck { NotChecked, EnoughWater, NotEnoughWater } - - public static class AIUtils - { - public static bool IsAreaAvailable(World world, Player player, Map map, int radius, HashSet terrainTypes) - { - var cells = world.ActorsHavingTrait().Where(a => a.Owner == player); - - // TODO: Properly check building foundation rather than 3x3 area. - return cells.Select(a => map.FindTilesInCircle(a.Location, radius) - .Count(c => map.Contains(c) && terrainTypes.Contains(map.GetTerrainInfo(c).Type) && - Util.AdjacentCells(world, Target.FromCell(world, c)) - .All(ac => terrainTypes.Contains(map.GetTerrainInfo(ac).Type)))) - .Any(availableCells => availableCells > 0); - } - - public static IEnumerable FindQueues(Player player, string category) - { - return player.World.ActorsWithTrait() - .Where(a => a.Actor.Owner == player && a.Trait.Info.Type == category && a.Trait.Enabled) - .Select(a => a.Trait); - } - - public static IEnumerable GetActorsWithTrait(World world) - { - return world.ActorsHavingTrait(); - } - - public static int CountActorsWithTrait(string actorName, Player owner) - { - return GetActorsWithTrait(owner.World).Count(a => a.Owner == owner && a.Info.Name == actorName); - } - - public static int CountActorByCommonName(HashSet commonNames, Player owner) - { - return owner.World.Actors.Count(a => !a.IsDead && a.Owner == owner && - commonNames.Contains(a.Info.Name)); - } - - public static int CountBuildingByCommonName(HashSet buildings, Player owner) - { - return GetActorsWithTrait(owner.World) - .Count(a => a.Owner == owner && buildings.Contains(a.Info.Name)); - } - - public static List FindEnemiesByCommonName(HashSet commonNames, Player player) - { - return player.World.Actors.Where(a => !a.IsDead && player.RelationshipWith(a.Owner) == PlayerRelationship.Enemy && - commonNames.Contains(a.Info.Name)).ToList(); - } - - public static ActorInfo GetInfoByCommonName(HashSet names, Player owner) - { - return owner.World.Map.Rules.Actors.Where(k => names.Contains(k.Key)).Random(owner.World.LocalRandom).Value; - } - - public static void BotDebug(string s, params object[] args) - { - if (Game.Settings.Debug.BotDebug) - Game.Debug(s, args); - } - } -} diff --git a/OpenRA.Mods.CA/Traits/AddsToReclaimableValue.cs b/OpenRA.Mods.CA/Traits/AddsToReclaimableValue.cs new file mode 100644 index 0000000000..5907b2ad5c --- /dev/null +++ b/OpenRA.Mods.CA/Traits/AddsToReclaimableValue.cs @@ -0,0 +1,76 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Linq; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("When killed, this actor adds value to the owner's reclaimable value pool.")] + public class AddsToReclaimableValueInfo : ConditionalTraitInfo + { + [FieldLoader.Require] + [Desc("The type of reclaimable value pool to add to.")] + public readonly string Type = null; + + [Desc("Percentage of the killed actor's Cost or CustomSellValue to be added to the pool.")] + public readonly int ValuePercentage = 100; + + [Desc("DeathTypes for which value should be added.", + "Use an empty list (the default) to allow all DeathTypes.")] + public readonly BitSet DeathTypes = default; + + public override object Create(ActorInitializer init) { return new AddsToReclaimableValue(this); } + } + + public class AddsToReclaimableValue : ConditionalTrait, INotifyKilled, INotifyCreated, INotifyOwnerChanged + { + ReclaimableValueProducer producerTrait; + + public AddsToReclaimableValue(AddsToReclaimableValueInfo info) + : base(info) { } + + protected override void Created(Actor self) + { + base.Created(self); + producerTrait = self.Owner.PlayerActor.TraitsImplementing().SingleOrDefault(t => t.Info.Type == Info.Type); + } + + int GetReclaimableValue(Actor self) + { + return self.GetSellValue() * Info.ValuePercentage / 100; + } + + void INotifyKilled.Killed(Actor self, AttackInfo e) + { + if (IsTraitDisabled) + return; + + if (!Info.DeathTypes.IsEmpty && !e.Damage.DamageTypes.Overlaps(Info.DeathTypes)) + return; + + if (producerTrait == null) + return; + + var value = GetReclaimableValue(self); + if (value <= 0) + return; + + producerTrait.AddValue(value); + } + + void INotifyOwnerChanged.OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) + { + producerTrait = newOwner.PlayerActor.TraitsImplementing().SingleOrDefault(t => t.Info.Type == Info.Type); + } + } +} \ No newline at end of file diff --git a/OpenRA.Mods.CA/Traits/AdvancesTimeline.cs b/OpenRA.Mods.CA/Traits/AdvancesTimeline.cs new file mode 100644 index 0000000000..6c5b2924d6 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/AdvancesTimeline.cs @@ -0,0 +1,47 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Traits; +using System.Linq; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("On creation, adds specified number of ticks to a specified `ProvidesPrerequisitesOnTimeline` trait.")] + public class AdvancesTimelineInfo : TraitInfo + { + [FieldLoader.Require] + [Desc("Timeline type to advance.")] + public readonly string Type = null; + + [Desc("Number of ticks to advance.")] + public readonly int Ticks = 1500; + + public override object Create(ActorInitializer init) { return new AdvancesTimeline(init, this); } + } + + public class AdvancesTimeline : INotifyCreated + { + public AdvancesTimelineInfo Info { get; set; } + + public AdvancesTimeline(ActorInitializer init, AdvancesTimelineInfo info) + { + Info = info; + } + + void INotifyCreated.Created(Actor self) + { + var timeline = self.Owner.PlayerActor.TraitsImplementing() + .FirstOrDefault(c => c.Info.Type == Info.Type); + + if (timeline != null) + timeline.AddTicks(Info.Ticks); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Air/AttackAircraftCA.cs b/OpenRA.Mods.CA/Traits/Air/AttackAircraftCA.cs new file mode 100644 index 0000000000..057924be24 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Air/AttackAircraftCA.cs @@ -0,0 +1,55 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("CA version adds a separate facing tolerance against air targets.")] + public class AttackAircraftCAInfo : AttackAircraftInfo, Requires + { + [Desc("Tolerance for attack angle against air targets. Range [0, 128], 128 covers 360 degrees.")] + public readonly WAngle AirFacingTolerance = new WAngle(512); + + public override object Create(ActorInitializer init) { return new AttackAircraftCA(init.Self, this); } + } + + public class AttackAircraftCA : AttackAircraft + { + public new readonly AttackAircraftCAInfo Info; + readonly AircraftInfo aircraftInfo; + + public AttackAircraftCA(Actor self, AttackAircraftCAInfo info) + : base(self, info) + { + Info = info; + aircraftInfo = self.Info.TraitInfo(); + } + + protected override bool CanAttack(Actor self, in Target target) + { + // Don't fire while landed or when outside the map. + if (self.World.Map.DistanceAboveTerrain(self.CenterPosition).Length < aircraftInfo.MinAirborneAltitude + || !self.World.Map.Contains(self.Location)) + return false; + + if (!base.CanAttack(self, target)) + return false; + + var facingTolerance = Info.FacingTolerance; + + if (self.World.Map.DistanceAboveTerrain(target.CenterPosition).Length >= aircraftInfo.MinAirborneAltitude) + facingTolerance = Info.AirFacingTolerance; + + return TargetInFiringArc(self, target, facingTolerance); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/AttackBomberCA.cs b/OpenRA.Mods.CA/Traits/Air/AttackBomberCA.cs similarity index 80% rename from OpenRA.Mods.CA/Traits/AttackBomberCA.cs rename to OpenRA.Mods.CA/Traits/Air/AttackBomberCA.cs index 7ebed4aab7..ac3792a5f8 100644 --- a/OpenRA.Mods.CA/Traits/AttackBomberCA.cs +++ b/OpenRA.Mods.CA/Traits/Air/AttackBomberCA.cs @@ -1,11 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2007-2019 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -21,12 +20,10 @@ namespace OpenRA.Mods.CA.Traits { public class AttackBomberCAInfo : AttackBaseInfo { - [Desc("Tolerance for attack angle. Range [0, 512], 512 covers 360 degrees.")] - public readonly new WAngle FacingTolerance = new WAngle(8); - public override object Create(ActorInitializer init) { return new AttackBomberCA(init.Self, this); } } + [Desc("CA version makes FacingTolerance take effect and allows AttackMove activity to be used.")] public class AttackBomberCA : AttackBase, ITick, ISync, INotifyRemovedFromWorld { readonly AttackBomberCAInfo info; @@ -53,11 +50,8 @@ public AttackBomberCA(Actor self, AttackBomberCAInfo info) void ITick.Tick(Actor self) { var wasInAttackRange = inAttackRange; - inAttackRange = false; - facingTarget = TargetInFiringArc(self, target, info.FacingTolerance); - if (self.IsInWorld) { var dat = self.World.Map.DistanceAboveTerrain(target.CenterPosition); @@ -72,7 +66,9 @@ void ITick.Tick(Actor self) continue; inAttackRange = true; - a.CheckFire(self, facing, target); + + if (facingTarget) + a.CheckFire(self, facing, target); } // Actors without armaments may want to trigger an action when it passes the target diff --git a/OpenRA.Mods.CA/Traits/Air/DiveOnAttack.cs b/OpenRA.Mods.CA/Traits/Air/DiveOnAttack.cs new file mode 100644 index 0000000000..d9e57fa3c8 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Air/DiveOnAttack.cs @@ -0,0 +1,67 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Mods.CA.Activities; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("When aircraft attacks, dive into the target.")] + public class DiveOnAttackInfo : AttackAircraftInfo, Requires + { + [Desc("Dive speed (in WDist units/tick).")] + public readonly WDist Speed = new(426); + + [Desc("Condition to grant on diving.")] + [GrantedConditionReference] + public readonly string DiveCondition = null; + + [NotificationReference("Speech")] + [Desc("Speech notification to play if shot down by enemy while diving.")] + public readonly string Notification = "UnitLost"; + + public override object Create(ActorInitializer init) { return new DiveOnAttack(init.Self, this); } + } + + public class DiveOnAttack : INotifyAttack, INotifyKilled + { + readonly DiveOnAttackInfo Info; + readonly Aircraft aircraft; + bool isDiving; + + public DiveOnAttack(Actor self, DiveOnAttackInfo info) + { + Info = info; + aircraft = self.Trait(); + } + + void INotifyAttack.Attacking(Actor self, in Target target, Armament a, Barrel barrel) + { + self.QueueActivity(false, new Dive(target, aircraft, Info.Speed.Length, () => + { + self.Kill(self); + })); + + if (Info.DiveCondition != null) + self.GrantCondition(Info.DiveCondition); + + isDiving = true; + } + + void INotifyAttack.PreparingAttack(Actor self, in Target target, Armament a, Barrel barrel) {} + + void INotifyKilled.Killed(Actor self, AttackInfo e) + { + if (isDiving && Info.Notification != null && e.Attacker.Owner != self.Owner) + Game.Sound.PlayNotification(self.World.Map.Rules, self.Owner, "Speech", Info.Notification, self.Owner.Faction.InternalName); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Air/FallsDownAndTransforms.cs b/OpenRA.Mods.CA/Traits/Air/FallsDownAndTransforms.cs new file mode 100644 index 0000000000..c52b422f6b --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Air/FallsDownAndTransforms.cs @@ -0,0 +1,85 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Mods.CA.Activities; +using OpenRA.Mods.CA.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.Common.Traits +{ + [Desc("Falls to the ground then transforms into a different actor.")] + public class FallsDownAndTransformsInfo : TraitInfo, Requires + { + [ActorReference] + [FieldLoader.Require] + [Desc("Velocity (per tick) the actor falls.")] + public readonly string Actor = null; + + [Desc("Secondary actor to spawn on landing.")] + public readonly string SpawnActor = null; + + [Desc("Velocity (per tick) the actor falls.")] + public readonly WDist FallVelocity = new WDist(43); + + [Desc("Velocity (per tick) the actor moves forwards.")] + public readonly WDist ForwardVelocity = new WDist(43); + + public override object Create(ActorInitializer init) { return new FallsDownAndTransforms(init, this); } + } + + public class FallsDownAndTransforms : INotifyCreated, INotifyFallDown + { + readonly FallsDownAndTransformsInfo info; + readonly IPositionable positionable; + IFacing facing; + + public FallsDownAndTransforms(ActorInitializer init, FallsDownAndTransformsInfo info) + { + this.info = info; + positionable = init.Self.Trait(); + facing = init.Self.TraitOrDefault(); + } + + void INotifyCreated.Created(Actor self) + { + facing = self.TraitOrDefault(); + self.QueueActivity(false, new FallDown(self, positionable.CenterPosition, info.FallVelocity.Length, info.ForwardVelocity.Length)); + } + + void INotifyFallDown.OnLanded(Actor self) + { + Transform(self); + + if (info.SpawnActor != null) + { + var td = new TypeDictionary + { + new ParentActorInit(self), + new LocationInit(self.Location), + new CenterPositionInit(self.CenterPosition), + new OwnerInit(self.Owner) + }; + + if (facing != null) + td.Add(new FacingInit(facing.Facing)); + + self.World.AddFrameEndTask(w => w.CreateActor(info.SpawnActor, td)); + } + } + + void Transform(Actor self) + { + var transform = new InstantTransform(self, info.Actor); + transform.SkipMakeAnims = true; + self.CurrentActivity.QueueChild(transform); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Air/Interceptor.cs b/OpenRA.Mods.CA/Traits/Air/Interceptor.cs new file mode 100644 index 0000000000..61b855f8e2 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Air/Interceptor.cs @@ -0,0 +1,122 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using OpenRA.Mods.Common.Activities; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + enum InterceptorState + { + Approaching, + Returning, + Guarding, + Exiting + } + + public class InterceptorInfo : AttackBaseInfo + { + public override object Create(ActorInitializer init) { return new Interceptor(init.Self, this); } + } + + [Desc("Used for actors spawned by InterceptorsPower.")] + public class Interceptor : INotifyCreated, ITick, INotifyAddedToWorld, INotifyRemovedFromWorld + { + WPos targetPos; + WVec targetOffset; + WPos exitPos; + WDist guardRadius; + int guardDuration; + InterceptorState state; + int guardTicksRemaining; + AutoTarget autoTarget; + + public event Action OnRemovedFromWorld = self => { }; + public event Action OnEnteredAttackRange = self => { }; + public event Action OnExitedAttackRange = self => { }; + + public Interceptor(Actor self, InterceptorInfo info) {} + + void INotifyCreated.Created(Actor self) + { + autoTarget = self.TraitOrDefault(); + } + + public void Initialize(World w, WPos targetPos, WVec targetOffset, WPos exitPos, WDist guardRadius, int guardDuration) + { + this.targetPos = targetPos; + this.targetOffset = targetOffset; + this.exitPos = exitPos; + this.guardRadius = guardRadius; + this.guardDuration = guardDuration; + } + + void INotifyAddedToWorld.AddedToWorld(Actor self) + { + state = InterceptorState.Approaching; + self.QueueActivity(new Fly(self, Target.FromPos(targetPos + targetOffset))); + } + + void INotifyRemovedFromWorld.RemovedFromWorld(Actor self) + { + OnRemovedFromWorld(self); + } + + void ITick.Tick(Actor self) + { + if (state == InterceptorState.Approaching) + { + var distanceToTarget = (targetPos + targetOffset - self.CenterPosition).HorizontalLength; + if (distanceToTarget <= guardRadius.Length) + { + state = InterceptorState.Guarding; + guardTicksRemaining = guardDuration; + self.QueueActivity(false, new AttackMoveActivity(self, () => new Fly(self, Target.FromPos(targetPos + targetOffset)))); + self.QueueActivity(new AttackMoveActivity(self, () => new FlyIdle(self))); + OnEnteredAttackRange(self); + } + } + else if (state == InterceptorState.Guarding) + { + if (--guardTicksRemaining <= 0) + { + state = InterceptorState.Exiting; + self.QueueActivity(false, new Fly(self, Target.FromPos(exitPos))); + self.QueueActivity(new RemoveSelf()); + OnExitedAttackRange(self); + return; + } + + var distanceToTarget = (targetPos - self.CenterPosition).HorizontalLength; + var distanceToInitialTarget = (targetPos + targetOffset - self.CenterPosition).HorizontalLength; + if (distanceToTarget > guardRadius.Length && distanceToInitialTarget > guardRadius.Length) + { + state = InterceptorState.Returning; + autoTarget?.SetStance(self, UnitStance.Defend); + self.QueueActivity(false, new Fly(self, Target.FromPos(targetPos))); + } + } + else if (state == InterceptorState.Returning) + { + guardTicksRemaining--; + + var distanceToTarget = (targetPos - self.CenterPosition).HorizontalLength; + if (distanceToTarget <= WDist.FromCells(2).Length) + { + autoTarget?.SetStance(self, UnitStance.HoldFire); + self.QueueActivity(false, new AttackMoveActivity(self, () => new FlyIdle(self))); + state = InterceptorState.Guarding; + } + } + } + } +} diff --git a/OpenRA.Mods.CA/Traits/AirstrikeMaster.cs b/OpenRA.Mods.CA/Traits/AirstrikeMaster.cs index 19dccd7926..5bd358b218 100644 --- a/OpenRA.Mods.CA/Traits/AirstrikeMaster.cs +++ b/OpenRA.Mods.CA/Traits/AirstrikeMaster.cs @@ -1,16 +1,17 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion using System; using System.Collections.Generic; using System.Linq; +using OpenRA.Mods.CA.Activities; using OpenRA.Mods.Common; using OpenRA.Mods.Common.Traits; using OpenRA.Traits; @@ -18,7 +19,7 @@ namespace OpenRA.Mods.CA.Traits { [Desc("This actor can send in other actors to deliver an airstrike.")] - public class AirstrikeMasterInfo : BaseSpawnerMasterInfo + public class AirstrikeMasterInfo : SpawnerMasterBaseInfo { [Desc("Just send the spawnee and forget it.")] public readonly bool SendAndForget = false; @@ -54,15 +55,17 @@ public class AirstrikeMasterInfo : BaseSpawnerMasterInfo public readonly int QuantizedFacings = 32; public readonly WDist Cordon = new WDist(5120); + public readonly WDist SpawnDistance = WDist.Zero; + [GrantedConditionReference] public IEnumerable LinterSpawnContainConditions { get { return SpawnContainConditions.Values; } } public override object Create(ActorInitializer init) { return new AirstrikeMaster(init, this); } } - public class AirstrikeMaster : BaseSpawnerMaster, ITick, INotifyAttack, IResolveOrder + public class AirstrikeMaster : SpawnerMasterBase, ITick, INotifyAttack, IResolveOrder { - class AirstrikeSlaveEntry : BaseSpawnerSlaveEntry + class AirstrikeSlaveEntry : SpawnerSlaveBaseEntry { public int RearmTicks = 0; public new AirstrikeSlave SpawnerSlave; @@ -73,7 +76,7 @@ class AirstrikeSlaveEntry : BaseSpawnerSlaveEntry readonly Stack loadedTokens = new Stack(); - WPos finishEdge; + WPos finishPos; WVec spawnOffset; int launchCondition = Actor.InvalidConditionToken; @@ -81,6 +84,9 @@ class AirstrikeSlaveEntry : BaseSpawnerSlaveEntry int respawnTicks = 0; + Target lastTarget; + WPos lastTargetPosition; + public AirstrikeMaster(ActorInitializer init, AirstrikeMasterInfo info) : base(init, info) { @@ -97,7 +103,7 @@ protected override void Created(Actor self) Replenish(self, SlaveEntries); } - public override BaseSpawnerSlaveEntry[] CreateSlaveEntries(BaseSpawnerMasterInfo info) + public override SpawnerSlaveBaseEntry[] CreateSlaveEntries(SpawnerMasterBaseInfo info) { var slaveEntries = new AirstrikeSlaveEntry[info.Actors.Length]; // For this class to use @@ -107,7 +113,7 @@ public override BaseSpawnerSlaveEntry[] CreateSlaveEntries(BaseSpawnerMasterInfo return slaveEntries; // For the base class to use } - public override void InitializeSlaveEntry(Actor slave, BaseSpawnerSlaveEntry entry) + public override void InitializeSlaveEntry(Actor slave, SpawnerSlaveBaseEntry entry) { var se = entry as AirstrikeSlaveEntry; base.InitializeSlaveEntry(slave, se); @@ -126,6 +132,9 @@ void INotifyAttack.Attacking(Actor self, in Target target, Armament a, Barrel ba if (IsTraitDisabled || IsTraitPaused || !Info.ArmamentNames.Contains(a.Info.Name)) return; + lastTarget = target; + lastTargetPosition = target.CenterPosition; + // Issue retarget order for already launched ones foreach (var slave in SlaveEntries) if (slave.IsLaunched && slave.IsValid) @@ -147,7 +156,7 @@ void INotifyAttack.Attacking(Actor self, in Target target, Armament a, Barrel ba SpawnIntoWorld(self, se.Actor, self.CenterPosition); - se.SpawnerSlave.SetSpawnInfo(finishEdge, spawnOffset); + se.SpawnerSlave.SetSpawnInfo(finishPos, spawnOffset); // Lambdas can't use 'in' variables, so capture a copy for later var delayedTarget = target; @@ -175,21 +184,37 @@ public override void SpawnIntoWorld(Actor self, Actor slave, WPos centerPosition for (var i = -AirstrikeMasterInfo.SquadSize / 2; i <= AirstrikeMasterInfo.SquadSize / 2; i++) { - var attackFacing = 256 * self.World.SharedRandom.Next(AirstrikeMasterInfo.QuantizedFacings) / AirstrikeMasterInfo.QuantizedFacings; + var aircraftInfo = self.World.Map.Rules.Actors[slave.Info.Name].TraitInfo(); + var altitude = aircraftInfo.CruiseAltitude.Length; + + int attackFacing; + + if (AirstrikeMasterInfo.SpawnDistance != WDist.Zero) + attackFacing = (lastTarget.CenterPosition - centerPosition).Yaw.Facing; + else + attackFacing = 256 * self.World.SharedRandom.Next(AirstrikeMasterInfo.QuantizedFacings) / AirstrikeMasterInfo.QuantizedFacings; - var altitude = self.World.Map.Rules.Actors[slave.Info.Name].TraitInfo().CruiseAltitude.Length; var attackRotation = WRot.FromFacing(attackFacing); + attackRotation = attackRotation.Rotate(WRot.FromFacing(self.World.SharedRandom.Next(30) - 15)); var delta = new WVec(0, -1024, 0).Rotate(attackRotation); target += new WVec(0, 0, altitude); - var startEdge = target - (self.World.Map.DistanceToEdge(target, -delta) + AirstrikeMasterInfo.Cordon).Length * delta / 1024; - var finishEdge = target + (self.World.Map.DistanceToEdge(target, delta) + AirstrikeMasterInfo.Cordon).Length * delta / 1024; + + WPos startPos; + WPos finishPos; + + if (AirstrikeMasterInfo.SpawnDistance != WDist.Zero) + startPos = target - AirstrikeMasterInfo.SpawnDistance.Length * delta / 1024; + else + startPos = target - (self.World.Map.DistanceToEdge(target, -delta) + AirstrikeMasterInfo.Cordon).Length * delta / 1024; + + finishPos = target + (self.World.Map.DistanceToEdge(target, delta) + AirstrikeMasterInfo.Cordon).Length * delta / 1024; var so = AirstrikeMasterInfo.SquadOffset; var spawnOffset = new WVec(i * so.Y, -Math.Abs(i) * so.X, 0).Rotate(attackRotation); var targetOffset = new WVec(i * so.Y, 0, 0).Rotate(attackRotation); this.spawnOffset = spawnOffset; - this.finishEdge = finishEdge; + this.finishPos = finishPos; w.AddFrameEndTask(_ => { @@ -197,6 +222,11 @@ public override void SpawnIntoWorld(Actor self, Actor slave, WPos centerPosition w.Add(slave); var attack = slave.Trait(); + + slave.Trait().SetCenterPosition(slave, startPos + spawnOffset); + var facing = slave.TraitOrDefault(); + facing.Facing = WAngle.FromFacing(attackFacing); + attack.AttackTarget(Target.FromPos(target + targetOffset), AttackSource.Default, false, true); }); } @@ -209,7 +239,10 @@ void Recall() { var childSlave = se as AirstrikeSlaveEntry; if (se.IsLaunched && se.IsValid) + { + childSlave.SpawnerSlave.Stop(se.Actor); childSlave.SpawnerSlave.LeaveMap(se.Actor); + } } } @@ -236,11 +269,13 @@ public void PickupSlave(Actor self, Actor a) { AirstrikeSlaveEntry slaveEntry = null; foreach (var se in SlaveEntries) + { if (se.Actor == a) { slaveEntry = se as AirstrikeSlaveEntry; break; } + } if (slaveEntry == null) throw new InvalidOperationException("An actor that isn't my slave entered me?"); @@ -276,12 +311,23 @@ void ITick.Tick(Actor self) } } - // Rearm + // Rearm & remove slaves that have gone further than the spawn distance (so a new slave spawns) foreach (var se in SlaveEntries) { var slaveEntry = se as AirstrikeSlaveEntry; if (slaveEntry.RearmTicks > 0) slaveEntry.RearmTicks--; + + if (AirstrikeMasterInfo.SpawnDistance > WDist.Zero && slaveEntry.IsValid && slaveEntry.IsLaunched && slaveEntry.Actor.CurrentActivity is ReturnAirstrikeMaster) + { + var dist = (lastTargetPosition - slaveEntry.Actor.CenterPosition).Length; + + if (dist > AirstrikeMasterInfo.SpawnDistance.Length) + { + slaveEntry.Actor = null; + respawnTicks = Util.ApplyPercentageModifiers(Info.RespawnTicks, reloadModifiers.Select(rm => rm.GetReloadModifier())); + } + } } } @@ -292,7 +338,7 @@ protected override void TraitPaused(Actor self) public void ResolveOrder(Actor self, Order order) { - if (order.OrderString == "Stop") + if (order.Target != lastTarget) Recall(); } } diff --git a/OpenRA.Mods.CA/Traits/AirstrikeSlave.cs b/OpenRA.Mods.CA/Traits/AirstrikeSlave.cs index 41ca702461..1e079bca1e 100644 --- a/OpenRA.Mods.CA/Traits/AirstrikeSlave.cs +++ b/OpenRA.Mods.CA/Traits/AirstrikeSlave.cs @@ -1,34 +1,26 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion using System.Linq; using OpenRA.Mods.CA.Activities; -using OpenRA.Mods.Common.Traits; using OpenRA.Traits; namespace OpenRA.Mods.CA.Traits { [Desc("Can be slaved to a spawner.")] - public class AirstrikeSlaveInfo : BaseSpawnerSlaveInfo + public class AirstrikeSlaveInfo : SpawnerSlaveBaseInfo { - [Desc("Move this close to the spawner, before entering it.")] - public readonly WDist LandingDistance = new WDist(5 * 1024); - - [Desc("We consider this is close enought to the spawner and enter it, instead of trying to reach 0 distance." + - "This allows the spawned unit to enter the spawner while the spawner is moving.")] - public readonly WDist CloseEnoughDistance = new WDist(128); - public override object Create(ActorInitializer init) { return new AirstrikeSlave(init, this); } } - public class AirstrikeSlave : BaseSpawnerSlave, INotifyIdle + public class AirstrikeSlave : SpawnerSlaveBase, INotifyIdle { public readonly AirstrikeSlaveInfo Info; @@ -63,7 +55,7 @@ public void LeaveMap(Actor self) self.QueueActivity(false, new ReturnAirstrikeMaster(Master, spawnerMaster, finishEdge + spawnOffset)); } - public override void LinkMaster(Actor self, Actor master, BaseSpawnerMaster spawnerMaster) + public override void LinkMaster(Actor self, Actor master, SpawnerMasterBase spawnerMaster) { base.LinkMaster(self, master, spawnerMaster); this.spawnerMaster = spawnerMaster as AirstrikeMaster; @@ -71,6 +63,12 @@ public override void LinkMaster(Actor self, Actor master, BaseSpawnerMaster spaw void INotifyIdle.TickIdle(Actor self) { + if (!spawnerMaster.SlaveEntries.Select(se => se.Actor).Contains(self)) + { + self.Dispose(); + return; + } + LeaveMap(self); } } diff --git a/OpenRA.Mods.CA/Traits/AttachOnCreation.cs b/OpenRA.Mods.CA/Traits/AttachOnCreation.cs index 09bfd4edad..b221e8bac8 100644 --- a/OpenRA.Mods.CA/Traits/AttachOnCreation.cs +++ b/OpenRA.Mods.CA/Traits/AttachOnCreation.cs @@ -1,14 +1,14 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion +using System.Linq; using OpenRA.Mods.Common; using OpenRA.Mods.Common.Traits; using OpenRA.Primitives; @@ -39,27 +39,43 @@ public AttachOnCreation(ActorInitializer init, AttachOnCreationInfo info) protected override void Created(Actor self) { - if (IsTraitDisabled) - return; + Attach(self); + } + void Attach(Actor self) + { var map = self.World.Map; var targetCell = map.CellContaining(self.CenterPosition); + var facing = self.TraitOrDefault(); + var attachedFacing = WAngle.Zero; + if (facing != null) + attachedFacing = facing.Facing; + self.World.AddFrameEndTask(w => { + if (IsTraitDisabled) + return; + var actorToAttach = self.World.CreateActor(Info.Actor.ToLowerInvariant(), new TypeDictionary { new LocationInit(targetCell), new OwnerInit(self.Owner), - new FacingInit(WAngle.Zero) + new FacingInit(attachedFacing) }); var attachable = actorToAttach.TraitOrDefault(); if (attachable == null) return; - var attachableToTrait = self.Trait(); - var attached = attachableToTrait.Attach(attachable); + var attachableToTrait = self.TraitsImplementing().FirstOrDefault(a => a.CanAttach(attachable)); + if (attachableToTrait == null) + { + actorToAttach.Dispose(); + return; + } + + var attached = attachableToTrait.Attach(actorToAttach, attachable); if (!attached) actorToAttach.Dispose(); diff --git a/OpenRA.Mods.CA/Traits/AttachOnTransform.cs b/OpenRA.Mods.CA/Traits/AttachOnTransform.cs new file mode 100644 index 0000000000..05308e752a --- /dev/null +++ b/OpenRA.Mods.CA/Traits/AttachOnTransform.cs @@ -0,0 +1,89 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Mods.Common; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Attach an actor when actor is transformed.")] + public class AttachOnTransformInfo : ConditionalTraitInfo, Requires + { + [ActorReference(typeof(AttachableInfo))] + [FieldLoader.Require] + [Desc("Actor to attach.")] + public readonly string Actor = null; + + public override object Create(ActorInitializer init) { return new AttachOnTransform(init, this); } + } + + public class AttachOnTransform : ConditionalTrait, INotifyTransform + { + public new readonly AttachOnTransformInfo Info; + IFacing facing; + + public AttachOnTransform(ActorInitializer init, AttachOnTransformInfo info) + : base(info) + { + Info = info; + } + + protected override void Created(Actor self) + { + base.Created(self); + facing = self.TraitOrDefault(); + } + + void INotifyTransform.OnTransform(Actor self) { } + void INotifyTransform.BeforeTransform(Actor self) { } + void INotifyTransform.AfterTransform(Actor toActor) + { + Attach(toActor); + } + + void Attach(Actor self) + { + var map = self.World.Map; + var targetCell = map.CellContaining(self.CenterPosition); + var attachedFacing = WAngle.Zero; + + if (facing != null) + attachedFacing = facing.Facing; + + self.World.AddFrameEndTask(w => + { + if (IsTraitDisabled) + return; + + var actorToAttach = self.World.CreateActor(Info.Actor.ToLowerInvariant(), new TypeDictionary + { + new LocationInit(targetCell), + new OwnerInit(self.Owner), + new FacingInit(attachedFacing) + }); + + var attachable = actorToAttach.TraitOrDefault(); + if (attachable == null) + return; + + var attachableTo = self.TraitOrDefault(); + if (attachableTo == null) + return; + + var attached = attachableTo.Attach(actorToAttach, attachable); + + if (!attached) + actorToAttach.Dispose(); + }); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Attachable.cs b/OpenRA.Mods.CA/Traits/Attachable.cs index eeffacb669..657f64daeb 100644 --- a/OpenRA.Mods.CA/Traits/Attachable.cs +++ b/OpenRA.Mods.CA/Traits/Attachable.cs @@ -1,21 +1,66 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion +using System; +using System.Collections.Generic; +using System.Linq; +using OpenRA.Mods.CA.Activities; +using OpenRA.Mods.Common.Orders; using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; using OpenRA.Traits; namespace OpenRA.Mods.CA.Traits { - [Desc("Use on an actor to make it attachable to other actors with the AttachableTo trait.")] + public enum OnDetachBehavior + { + Dispose, + None, + Transform + } + + [Desc("Use on an actor to make it attachable to other actors with the AttachableTo trait.", + "An actor should only have one Attachable trait.")] public class AttachableInfo : TraitInfo, Requires { + [Desc("The attachment type (matches that of the `" + nameof(AttachableTo) + "` trait).")] + [FieldLoader.Require] + public readonly string Type = null; + + [Desc("The `TargetTypes` from `Targetable` that can be attached to.")] + public readonly BitSet TargetTypes = default; + + [VoiceReference] + public readonly string Voice = "Action"; + + [Desc("Color to use for the target line.")] + public readonly Color TargetLineColor = Color.Yellow; + + [Desc("Player relationships the owner of the attachment target needs.")] + public readonly PlayerRelationship ValidRelationships = PlayerRelationship.Neutral | PlayerRelationship.Enemy; + + [CursorReference] + [Desc("Cursor to display when able to attach to target actor.")] + public readonly string EnterCursor = "enter"; + + [CursorReference] + [Desc("Cursor to display when able to attach to multiple actors.")] + public readonly string EnterMultiCursor = "enter-multi"; + + [CursorReference] + [Desc("Cursor to display when unable to attach the target actor.")] + public readonly string BlockedCursor = "enter-blocked"; + + [Desc("Sounds played on being attached.")] + public readonly string AttachSound = null; + [GrantedConditionReference] [Desc("The condition to grant when attached.")] public readonly string AttachedCondition = null; @@ -24,18 +69,31 @@ public class AttachableInfo : TraitInfo, Requires [Desc("The condition to grant when detached.")] public readonly string DetachedCondition = null; - [Desc("Attachable type to use to check for limits.")] - public readonly string AttachableType = null; + [Desc("On attaching, transform into this actor.")] + public readonly string OnAttachTransformInto = null; + + [Desc("On detaching, transform into this actor.")] + public readonly string OnDetachTransformInto = null; + + [Desc("If true, detatch on host being killed/captured, otherwise dispose.")] + public readonly OnDetachBehavior OnDetachBehavior = OnDetachBehavior.Dispose; + + [Desc("The range at which the actor can attach.")] + public readonly WDist MinAttachDistance = WDist.Zero; public override object Create(ActorInitializer init) { return new Attachable(init, this); } } - public class Attachable : INotifyKilled, INotifyActorDisposing + public class Attachable : INotifyCreated, INotifyKilled, INotifyActorDisposing, INotifyOwnerChanged, INotifyAiming, + IIssueOrder, IResolveOrder, IOrderVoice { public readonly AttachableInfo Info; AttachableTo attachedTo; + AutoTarget autoTarget; + AttackBase[] attackBases; int attachedConditionToken; int detachedConditionToken; + Target lastTarget; readonly IPositionable positionable; readonly Actor self; @@ -43,16 +101,23 @@ public Attachable(ActorInitializer init, AttachableInfo info) { self = init.Self; Info = info; - positionable = self.TraitOrDefault(); + positionable = self.Trait(); attachedConditionToken = Actor.InvalidConditionToken; detachedConditionToken = Actor.InvalidConditionToken; } + void INotifyCreated.Created(Actor self) + { + autoTarget = self.TraitOrDefault(); + attackBases = self.TraitsImplementing().ToArray(); + } + public bool IsValid { get { return self != null && !self.IsDead; } } + /** Called from AttachableTo.Attach() */ public void AttachTo(AttachableTo attachableTo, WPos pos) { - Detach(); + CompleteDetach(); attachedTo = attachableTo; SetPosition(pos); @@ -63,32 +128,125 @@ public void AttachTo(AttachableTo attachableTo, WPos pos) detachedConditionToken = self.RevokeCondition(detachedConditionToken); } - public void AttachedToLost() + public void HostLost() + { + InitDetach(); + } + + public void HostEnteredCargo() + { + if (!IsValid || !self.IsInWorld) + return; + + self.World.AddFrameEndTask(w => + { + w.Remove(self); + }); + } + + public void HostExitedCargo() { - self.Dispose(); + if (!IsValid || self.IsInWorld) + return; + + self.World.AddFrameEndTask(w => + { + SetPosition(attachedTo.CenterPosition); + w.Add(self); + }); } - public void SetPosition(WPos pos) + public void HostTransformed(Actor newActor) { - positionable.SetPosition(self, pos); - positionable.SetVisualPosition(self, pos); + var newAttachableTo = newActor.TraitsImplementing().FirstOrDefault(a => a.CanAttach(this)); + if (newAttachableTo != null && newAttachableTo.Attach(self, this)) + return; + + InitDetach(); + } + + public void HostPositionChanged() + { + if (!IsValid || attachedTo == null) + return; + + if (!self.IsInWorld) + return; + + SetPosition(attachedTo.CenterPosition); + } + + void SetPosition(WPos pos) + { + if (attachedTo.CenterPosition.X == self.CenterPosition.X && attachedTo.CenterPosition.Y == self.CenterPosition.Y) + return; + + var newPosition = new WPos(pos.X, pos.Y, self.CenterPosition.Z); + positionable.SetPosition(self, newPosition); + positionable.SetCenterPosition(self, newPosition); } void INotifyActorDisposing.Disposing(Actor self) { - Detach(); + CompleteDetach(); } void INotifyKilled.Killed(Actor self, AttackInfo e) { - Detach(); + CompleteDetach(); } - void Detach() + void INotifyOwnerChanged.OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) + { + InitDetach(); + } + + void InitDetach() + { + switch (Info.OnDetachBehavior) + { + case OnDetachBehavior.Dispose: + CompleteDetach(); + self.Dispose(); + break; + + case OnDetachBehavior.None: + CompleteDetach(); + break; + + case OnDetachBehavior.Transform: + Transform(); + break; + } + } + + void Transform() + { + if (Info.OnDetachTransformInto == null) + throw new InvalidOperationException($"No actor defined for {self.Info.Name} to transform into on detaching."); + + var faction = self.Owner.Faction.InternalName; + var transform = new InstantTransform(self, Info.OnDetachTransformInto) + { + ForceHealthPercentage = 0, + Faction = faction, + SkipMakeAnims = true, + Offset = new CVec(0, 1), + OnComplete = a => CompleteDetach() + }; + + self.World.AddFrameEndTask(w => + { + self.QueueActivity(false, transform); + }); + } + + /** Updates AttachedTo and updates conditions. */ + void CompleteDetach() { if (attachedTo != null) { - attachedTo.Detach(this); + attachedTo.Detach(self, this); attachedTo = null; } @@ -98,5 +256,246 @@ void Detach() if (Info.DetachedCondition != null && detachedConditionToken == Actor.InvalidConditionToken) detachedConditionToken = self.GrantCondition(Info.DetachedCondition); } + + public int GrantConditionFromAttachedTo(string condition) + { + return self.GrantCondition(condition); + } + + public void RevokeConditionFromAttachedTo(int token) + { + self.RevokeCondition(token); + } + + public void Stop() + { + if (attackBases.Count() == 0) + return; + + self.CancelActivity(); + self.World.IssueOrder(new Order("Stop", self, false)); + } + + public void Attack(Target target, bool force) + { + if (attackBases.Count() == 0) + return; + + if (!TargetSwitched(lastTarget, target)) + return; + + lastTarget = target; + self.World.AddFrameEndTask(w => + { + var orderString = force ? "ForceAttack" : "Attack"; + self.World.IssueOrder(new Order(orderString, self, target, false, null, null)); + }); + } + + public void SetStance(UnitStance value) + { + if (autoTarget != null) + autoTarget.SetStance(self, value); + } + + bool TargetSwitched(Target lastTarget, Target newTarget) + { + if (newTarget.Type != lastTarget.Type) + return true; + + if (newTarget.Type == TargetType.Terrain) + return newTarget.CenterPosition != lastTarget.CenterPosition; + + if (newTarget.Type == TargetType.Actor) + return lastTarget.Actor != newTarget.Actor; + + return false; + } + + void INotifyAiming.StartedAiming(Actor self, AttackBase attack) { } + void INotifyAiming.StoppedAiming(Actor self, AttackBase attack) + { + if (attachedTo != null) + Stop(); + } + + public IEnumerable Orders + { + get + { + yield return new AttachOrderTargeter(this, true); + yield return new AttachOrderTargeter(this); + } + } + + public Order IssueOrder(Actor self, IOrderTargeter order, in Target target, bool queued) + { + if (order.OrderID != "Attach" && order.OrderID != "MassAttach") + return null; + + return new Order(order.OrderID, self, target, queued); + } + + string IOrderVoice.VoicePhraseForOrder(Actor self, Order order) + { + return (order.OrderString == "Attach" || order.OrderString != "MassAttach") && CanAttachToTarget(self, order.Target) + ? Info.Voice : null; + } + + public bool CanAttachToTarget(Actor self, in Target target) + { + switch (target.Type) + { + case TargetType.Actor: + return CanAttachToActor(self, target); + case TargetType.FrozenActor: + return CanAttachToFrozenActor(self, target); + default: + return false; + } + } + + bool CanAttachToActor(Actor self, in Target target) + { + return (!Info.TargetTypes.Any() || Info.TargetTypes.Overlaps(target.Actor.GetEnabledTargetTypes())) + && Info.ValidRelationships.HasRelationship(self.Owner.RelationshipWith(target.Actor.Owner)) + && target.Actor.TraitsImplementing().Any(x => x.CanAttach(this)); + } + + bool CanAttachToFrozenActor(Actor self, in Target target) + { + return target.FrozenActor.IsValid + && (!Info.TargetTypes.Any() || Info.TargetTypes.Overlaps(target.FrozenActor.TargetTypes)) + && Info.ValidRelationships.HasRelationship(self.Owner.RelationshipWith(target.FrozenActor.Owner)) + && target.FrozenActor.Actor.TraitsImplementing().Any(x => x.CanAttach(this)); + } + + public void ResolveOrder(Actor self, Order order) + { + switch (order.OrderString) + { + case "Attach": + if (!CanAttachToTarget(self, order.Target)) + return; + + self.QueueActivity(order.Queued, new Attach(self, order.Target, this, Info.TargetLineColor)); + break; + + case "MassAttach": + ResolveMassAttachOrder(self, order); + break; + } + + self.ShowTargetLines(); + } + + void ResolveMassAttachOrder(Actor self, Order order) + { + // Enter orders are only valid for own/allied actors, + // which are guaranteed to never be frozen. + if (order.Target.Type != TargetType.Actor) + return; + + var targetActor = order.Target.Actor; + + var selectedWithTrait = self.World.Selection.Actors + .Where(a => a.Info.TraitInfos().Any(ai => ai.Type == Info.Type) + && a.Owner == self.Owner + && !a.IsDead) + .OrderBy(a => (a.CenterPosition - targetActor.CenterPosition).LengthSquared) + .Select(a => new TraitPair(a, a.TraitsImplementing().FirstOrDefault(a => a.Info.Type == Info.Type))); + + // Find the closest actor to the target transport + var closestActor = selectedWithTrait.FirstOrDefault(); + + // Only perform allocation if the current actor is the closest actor + if (closestActor.Actor != self) + return; + + // Create a list of available transports + var availableTargets = self.World.Actors + .Where(a => a.Info.TraitInfos().Any(ai => ai.Type == Info.Type) + && a.Info.Name == targetActor.Info.Name + && a.Owner == targetActor.Owner + && !a.IsDead + && (a.CenterPosition - targetActor.CenterPosition).HorizontalLengthSquared <= WDist.FromCells(10).LengthSquared) + .Select(a => new TraitPair(a, a.TraitsImplementing().FirstOrDefault(a => a.Info.Type == Info.Type))) + .Where(t => closestActor.Trait.CanAttachToActor(closestActor.Actor, Target.FromActor(t.Actor))) + .ToList(); + + // Allocate passengers to the closest available transport + foreach (var pair in selectedWithTrait) + { + if (availableTargets.Count == 0) + break; + + var closestTarget = availableTargets + .OrderBy(t => (t.Actor.CenterPosition - pair.Actor.CenterPosition).LengthSquared) + .FirstOrDefault(); + + // can't queue an activity here because the selected units aren't known by all clients so causes a de-sync + // pair.Actor.QueueActivity(false, new Attach(pair.Actor, Target.FromActor(closestTarget.Actor), pair.Trait, Info.TargetLineColor)); + self.World.IssueOrder(new Order("Attach", pair.Actor, Target.FromActor(closestTarget.Actor), order.Queued)); + pair.Actor.ShowTargetLines(); + // todo: take into account AttachableTo.Info.Limit in the same way MassEntersCargo takes MaxWeight into account + + availableTargets.Remove(closestTarget); + } + } + } + + sealed class AttachOrderTargeter : UnitOrderTargeter + { + readonly Attachable attachable; + readonly bool forceMove; + + public AttachOrderTargeter(Attachable attachable, bool forceMove = false) + : base(forceMove ? "MassAttach" : "Attach", 7, attachable.Info.EnterCursor, true, true) + { + this.attachable = attachable; + this.forceMove = forceMove; + } + + public override bool CanTargetActor(Actor self, Actor target, TargetModifiers modifiers, ref string cursor) + { + if (forceMove && !modifiers.HasModifier(TargetModifiers.ForceMove)) + return false; + + if (!forceMove && modifiers.HasModifier(TargetModifiers.ForceMove)) + return false; + + var stance = self.Owner.RelationshipWith(target.Owner); + if (!attachable.Info.ValidRelationships.HasRelationship(stance)) + return false; + + if (attachable.Info.TargetTypes.Any() && !attachable.Info.TargetTypes.Overlaps(target.GetEnabledTargetTypes())) + return false; + + var attachCursor = modifiers.HasModifier(TargetModifiers.ForceMove) ? attachable.Info.EnterMultiCursor : attachable.Info.EnterCursor; + + cursor = target.TraitsImplementing().Any(x => x.CanAttach(attachable)) ? attachCursor : attachable.Info.BlockedCursor; + return true; + } + + public override bool CanTargetFrozenActor(Actor self, FrozenActor target, TargetModifiers modifiers, ref string cursor) + { + if (forceMove && !modifiers.HasModifier(TargetModifiers.ForceMove)) + return false; + + if (!forceMove && modifiers.HasModifier(TargetModifiers.ForceMove)) + return false; + + var stance = self.Owner.RelationshipWith(target.Owner); + if (!attachable.Info.ValidRelationships.HasRelationship(stance)) + return false; + + if (attachable.Info.TargetTypes.Any() && !attachable.Info.TargetTypes.Overlaps(target.Info.GetAllTargetTypes())) + return false; + + var attachCursor = modifiers.HasModifier(TargetModifiers.ForceMove) ? attachable.Info.EnterMultiCursor : attachable.Info.EnterCursor; + + cursor = target.Actor.TraitsImplementing().Any(x => x.CanAttach(attachable)) ? attachCursor : attachable.Info.BlockedCursor; + return true; + } } } diff --git a/OpenRA.Mods.CA/Traits/AttachableTo.cs b/OpenRA.Mods.CA/Traits/AttachableTo.cs index 81db3fe633..73ffc37fd9 100644 --- a/OpenRA.Mods.CA/Traits/AttachableTo.cs +++ b/OpenRA.Mods.CA/Traits/AttachableTo.cs @@ -1,14 +1,15 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion using System.Collections.Generic; +using System.Linq; using OpenRA.Mods.Common.Traits; using OpenRA.Traits; @@ -17,114 +18,236 @@ namespace OpenRA.Mods.CA.Traits [Desc("Allows actor to have actors with Attachable trait attached to it.")] public class AttachableToInfo : TraitInfo { + [Desc("The attachment type (matches that of the `" + nameof(Attachable) + "` trait).")] + [FieldLoader.Require] + public readonly string Type = null; + [Desc("Limit how many specific actors can be attached.")] - public readonly Dictionary Limits = new Dictionary(); + public readonly int Limit = 0; - [ActorReference(dictionaryReference: LintDictionaryReference.Keys)] - [Desc("Conditions to apply when reaching limits.")] - public readonly Dictionary LimitConditions = new Dictionary(); + [Desc("Conditions to apply when attached to.")] + [GrantedConditionReference] + public readonly string AttachedCondition = null; + [Desc("Conditions to apply when reaching limits.")] [GrantedConditionReference] - public IEnumerable LinterLimitConditions { get { return LimitConditions.Values; } } + public readonly string LimitCondition = null; public override object Create(ActorInitializer init) { return new AttachableTo(init, this); } } - public class AttachableTo : INotifyKilled, INotifyActorDisposing, INotifyVisualPositionChanged + public class AttachableTo : INotifyKilled, INotifyOwnerChanged, IResolveOrder, INotifyStanceChanged, + INotifyExitedCargo, INotifyEnteredCargo, INotifyCreated, INotifyTransform, INotifyRemovedFromWorld, INotifyAddedToWorld, + INotifyCenterPositionChanged, INotifySold { public readonly AttachableToInfo Info; + INotifyAttachedTo[] notifyAttached; + public Carryable Carryable { get; private set; } readonly Actor self; readonly HashSet attached = new HashSet(); - Dictionary attachedCounts = new Dictionary(); - Dictionary limitTokens = new Dictionary(); + readonly HashSet attachedToTransfer = new HashSet(); + int attachedCount = 0; + int attachedToken = Actor.InvalidConditionToken; + int limitToken = Actor.InvalidConditionToken; + bool reserved; + + public Actor Actor => self; + public HashSet Attached => attached; public AttachableTo(ActorInitializer init, AttachableToInfo info) { Info = info; self = init.Self; + } - foreach (var type in Info.Limits) - { - attachedCounts[type.Key] = 0; - limitTokens[type.Key] = Actor.InvalidConditionToken; - } + public WPos CenterPosition { get { return self.CenterPosition; } } + public bool IsInWorld { get { return self.IsInWorld; } } + + public bool Reserve() + { + if (reserved) + return false; + + reserved = true; + return reserved; } - void INotifyVisualPositionChanged.VisualPositionChanged(Actor self, byte oldLayer, byte newLayer) + void INotifyCreated.Created(Actor self) { - if (!self.IsInWorld) + Carryable = self.TraitOrDefault(); + notifyAttached = self.TraitsImplementing().ToArray(); + } + + void IResolveOrder.ResolveOrder(Actor self, Order order) + { + if (attached.Count == 0) return; - var pos = self.CenterPosition; + var attackOrders = new HashSet { "Attack", "ForceAttack" }; + + if (attackOrders.Contains(order.OrderString)) + { + foreach (var attachable in attached) + { + if (attachable.IsValid) + attachable.Attack(order.Target, order.OrderString == "ForceAttack"); + } + } + + var otherOrders = new HashSet { "Stop" }; + + if (!otherOrders.Contains(order.OrderString)) + return; foreach (var attachable in attached) { if (attachable.IsValid) - attachable.SetPosition(pos); + attachable.Stop(); } } - void INotifyActorDisposing.Disposing(Actor self) + void INotifyKilled.Killed(Actor self, AttackInfo e) { Terminate(); } - void INotifyKilled.Killed(Actor self, AttackInfo e) + void INotifyOwnerChanged.OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) + { + Terminate(); + } + + void INotifySold.Selling(Actor self) { } + void INotifySold.Sold(Actor self) { Terminate(); } void Terminate() + { + foreach (var attachable in attached.ToArray()) + { + if (attachable.IsValid) + attachable.HostLost(); + } + } + + void INotifyTransform.BeforeTransform(Actor self) {} + void INotifyTransform.OnTransform(Actor self) { foreach (var attachable in attached) { if (attachable.IsValid) - attachable.AttachedToLost(); + attachedToTransfer.Add(attachable); + } + } + void INotifyTransform.AfterTransform(Actor toActor) + { + foreach (var attachable in attachedToTransfer) + { + if (attachable.IsValid) + attachable.HostTransformed(toActor); } } - public bool Attach(Attachable attachable) + void INotifyCenterPositionChanged.CenterPositionChanged(Actor self, byte oldLayer, byte newLayer) { + foreach (var attachable in attached) + { + if (attachable.IsValid) + attachable.HostPositionChanged(); + } + } + + public bool CanAttach(Attachable attachable, bool ignoreReservation = false) + { + if (attachable.Info.Type != Info.Type) + return false; + + if (reserved && !ignoreReservation) + return false; + if (!attachable.IsValid) return false; - if ( - attachedCounts.ContainsKey(attachable.Info.AttachableType) - && Info.LimitConditions.ContainsKey(attachable.Info.AttachableType) - && attachedCounts[attachable.Info.AttachableType] >= Info.Limits[attachable.Info.AttachableType]) + if (Info.Limit > 0 && attachedCount >= Info.Limit) + return false; + + return true; + } + + public bool Attach(Actor attachedActor, Attachable attachable, bool ignoreReservation = false) + { + if (!CanAttach(attachable, ignoreReservation)) return false; attached.Add(attachable); attachable.AttachTo(this, self.CenterPosition); + attachedCount++; - if (attachedCounts.ContainsKey(attachable.Info.AttachableType)) - { - attachedCounts[attachable.Info.AttachableType]++; + if (Info.AttachedCondition != null && attachedToken == Actor.InvalidConditionToken) + attachedToken = self.GrantCondition(Info.AttachedCondition); - if ( - Info.LimitConditions.ContainsKey(attachable.Info.AttachableType) - && attachedCounts[attachable.Info.AttachableType] >= Info.Limits[attachable.Info.AttachableType] - && limitTokens[attachable.Info.AttachableType] == Actor.InvalidConditionToken) - limitTokens[attachable.Info.AttachableType] = self.GrantCondition(Info.LimitConditions[attachable.Info.AttachableType]); - } + if (Info.LimitCondition != null && limitToken == Actor.InvalidConditionToken && Info.Limit > 0 && attachedCount >= Info.Limit) + limitToken = self.GrantCondition(Info.LimitCondition); + + reserved = false; + + foreach (var notify in notifyAttached) + notify.Attached(self, attachedActor, attachable); return true; } - public void Detach(Attachable attachable) + public void Detach(Actor detachedActor, Attachable attachable) { attached.Remove(attachable); + attachedCount--; - if (attachedCounts.ContainsKey(attachable.Info.AttachableType)) - { - attachedCounts[attachable.Info.AttachableType]--; + if (attachedToken != Actor.InvalidConditionToken && attached.Count == 0) + attachedToken = self.RevokeCondition(attachedToken); + + if (limitToken != Actor.InvalidConditionToken && (Info.Limit == 0 || attachedCount < Info.Limit)) + limitToken = self.RevokeCondition(limitToken); - if ( - Info.LimitConditions.ContainsKey(attachable.Info.AttachableType) - && attachedCounts[attachable.Info.AttachableType] < Info.Limits[attachable.Info.AttachableType] - && limitTokens[attachable.Info.AttachableType] != Actor.InvalidConditionToken) - limitTokens[attachable.Info.AttachableType] = self.RevokeCondition(limitTokens[attachable.Info.AttachableType]); + foreach (var notify in notifyAttached) + notify.Detached(self, detachedActor, attachable); + } + + void INotifyStanceChanged.StanceChanged(Actor self, AutoTarget autoTarget, UnitStance oldStance, UnitStance newStance) + { + foreach (var attachable in attached) + { + if (attachable.IsValid) + attachable.SetStance(newStance); } } + + void INotifyEnteredCargo.OnEnteredCargo(Actor self, Actor cargo) + { + foreach (var attachable in attached) + attachable.HostEnteredCargo(); + } + + void INotifyExitedCargo.OnExitedCargo(Actor self, Actor cargo) + { + foreach (var attachable in attached) + attachable.HostExitedCargo(); + } + + void INotifyRemovedFromWorld.RemovedFromWorld(Actor self) + { + var carryable = self.TraitOrDefault(); + if (carryable != null && carryable.Carrier != null) + foreach (var attachable in attached) + attachable.HostEnteredCargo(); + } + + void INotifyAddedToWorld.AddedToWorld(Actor self) + { + var carryable = self.TraitOrDefault(); + if (carryable != null && carryable.Carrier != null) + foreach (var attachable in attached) + attachable.HostExitedCargo(); + } } } diff --git a/OpenRA.Mods.CA/Traits/AttachedAircraft.cs b/OpenRA.Mods.CA/Traits/AttachedAircraft.cs new file mode 100644 index 0000000000..bc86448d4f --- /dev/null +++ b/OpenRA.Mods.CA/Traits/AttachedAircraft.cs @@ -0,0 +1,47 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Activities; +using OpenRA.Mods.Common.Activities; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Extends Aircraft. Primarily for attached actors so they don't trigger TakeOff or AssociateWithAirfield activities.")] + public class AttachedAircraftInfo : AircraftInfo + { + public override object Create(ActorInitializer init) { return new AttachedAircraft(init, this); } + } + + public class AttachedAircraft : Aircraft, ICreationActivity + { + readonly Actor self; + + public AttachedAircraft(ActorInitializer init, AttachedAircraftInfo info) + : base(init, info) + { + self = init.Self; + } + + protected override void Created(Actor self) + { + var newPosition = new WPos(self.CenterPosition.X, self.CenterPosition.Y, Info.CruiseAltitude.Length); + SetPosition(self, newPosition); + SetCenterPosition(self, newPosition); + base.Created(self); + } + + Activity ICreationActivity.GetCreationActivity() + { + return new FlyIdle(self); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Attack/AttackFollowFrontal.cs b/OpenRA.Mods.CA/Traits/Attack/AttackFollowFrontal.cs new file mode 100644 index 0000000000..93735742c3 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Attack/AttackFollowFrontal.cs @@ -0,0 +1,201 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Activities; +using OpenRA.Mods.Common; +using OpenRA.Mods.Common.Traits; +using OpenRA.Mods.CA.Activities; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + public class AttackFollowFrontalInfo : AttackFollowInfo + { + [Desc("Actor will turn directly to target regardless the FacingTolerance to catch its target in full fire angle.")] + public readonly bool MustFaceTarget = false; + + public override object Create(ActorInitializer init) { return new AttackFollowFrontal(init.Self, this); } + } + + public class AttackFollowFrontal : AttackBase, INotifyOwnerChanged, INotifyStanceChanged + { + public new readonly AttackFollowFrontalInfo Info; + public Target RequestedTarget { get; private set; } + public Target OpportunityTarget { get; private set; } + + Mobile mobile; + AutoTarget autoTarget; + bool requestedForceAttack; + Activity requestedTargetPresetForActivity; + bool opportunityForceAttack; + + public void SetRequestedTarget(Actor self, in Target target, bool isForceAttack = false) + { + RequestedTarget = target; + requestedForceAttack = isForceAttack; + requestedTargetPresetForActivity = null; + } + + public void ClearRequestedTarget() + { + if (Info.PersistentTargeting) + { + OpportunityTarget = RequestedTarget; + opportunityForceAttack = requestedForceAttack; + } + + RequestedTarget = Target.Invalid; + requestedTargetPresetForActivity = null; + } + + public AttackFollowFrontal(Actor self, AttackFollowFrontalInfo info) + : base(self, info) + { + Info = info; + } + + protected override void Created(Actor self) + { + mobile = self.TraitOrDefault(); + autoTarget = self.TraitOrDefault(); + base.Created(self); + } + + protected bool CanAimAtTarget(Actor self, in Target target, bool forceAttack) + { + if (target.Type == TargetType.Actor && !target.Actor.CanBeViewedByPlayer(self.Owner)) + return false; + + if (target.Type == TargetType.FrozenActor && !target.FrozenActor.IsValid) + return false; + + var pos = self.CenterPosition; + var armaments = ChooseArmamentsForTarget(target, forceAttack); + foreach (var a in armaments) + if (target.IsInRange(pos, a.MaxRange()) && (a.Weapon.MinRange == WDist.Zero || !target.IsInRange(pos, a.Weapon.MinRange))) + if (TargetInFiringArc(self, target, Info.FacingTolerance)) + return true; + + return false; + } + + protected override void Tick(Actor self) + { + if (IsTraitDisabled) + { + RequestedTarget = OpportunityTarget = Target.Invalid; + } + + if (requestedTargetPresetForActivity != null) + { + // RequestedTarget was set by OnQueueAttackActivity in preparation for a queued activity + // requestedTargetPresetForActivity will be cleared once the activity starts running and calls UpdateRequestedTarget + if (self.CurrentActivity != null && self.CurrentActivity.NextActivity == requestedTargetPresetForActivity) + { + RequestedTarget = RequestedTarget.Recalculate(self.Owner, out _); + } + + // Requested activity has been canceled + else + ClearRequestedTarget(); + } + + // Can't fire on anything + if (mobile != null && !mobile.CanInteractWithGroundLayer(self)) + return; + + if (RequestedTarget.Type != TargetType.Invalid) + { + IsAiming = CanAimAtTarget(self, RequestedTarget, requestedForceAttack); + if (IsAiming) + DoAttack(self, RequestedTarget); + } + else + { + IsAiming = false; + + if (OpportunityTarget.Type != TargetType.Invalid) + IsAiming = CanAimAtTarget(self, OpportunityTarget, opportunityForceAttack); + + if (!IsAiming && Info.OpportunityFire && autoTarget != null && + !autoTarget.IsTraitDisabled && autoTarget.Stance >= UnitStance.Defend) + { + OpportunityTarget = autoTarget.ScanForTarget(self, false, false); + opportunityForceAttack = false; + + if (OpportunityTarget.Type != TargetType.Invalid) + IsAiming = CanAimAtTarget(self, OpportunityTarget, opportunityForceAttack); + } + + if (IsAiming) + DoAttack(self, OpportunityTarget); + } + + base.Tick(self); + } + + public override Activity GetAttackActivity(Actor self, AttackSource source, in Target newTarget, bool allowMove, bool forceAttack, Color? targetLineColor = null) + { + return new AttackFrontalFollowActivity(self, newTarget, allowMove, forceAttack, targetLineColor); + } + + public override void OnResolveAttackOrder(Actor self, Activity activity, in Target target, bool queued, bool forceAttack) + { + // We can improve responsiveness for turreted actors by preempting + // the last order (usually a move) and setting the target immediately + if (!queued) + { + RequestedTarget = target; + requestedForceAttack = forceAttack; + requestedTargetPresetForActivity = activity; + } + } + + public override void OnStopOrder(Actor self) + { + RequestedTarget = OpportunityTarget = Target.Invalid; + base.OnStopOrder(self); + } + + void INotifyOwnerChanged.OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) + { + RequestedTarget = OpportunityTarget = Target.Invalid; + } + + void INotifyStanceChanged.StanceChanged(Actor self, AutoTarget autoTarget, UnitStance oldStance, UnitStance newStance) + { + // Cancel opportunity targets when switching to a more restrictive stance if they are no longer valid for auto-targeting + if (newStance > oldStance || opportunityForceAttack) + return; + + if (OpportunityTarget.Type == TargetType.Actor) + { + var a = OpportunityTarget.Actor; + if (!autoTarget.HasValidTargetPriority(self, a.Owner, a.GetEnabledTargetTypes())) + OpportunityTarget = Target.Invalid; + } + else if (OpportunityTarget.Type == TargetType.FrozenActor) + { + var fa = OpportunityTarget.FrozenActor; + if (!autoTarget.HasValidTargetPriority(self, fa.Owner, fa.TargetTypes)) + OpportunityTarget = Target.Invalid; + } + } + + protected override bool CanAttack(Actor self, in Target target) + { + if (!base.CanAttack(self, target)) + return false; + + return TargetInFiringArc(self, target, Info.FacingTolerance); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Attack/AttackFrontalCharged.cs b/OpenRA.Mods.CA/Traits/Attack/AttackFrontalCharged.cs new file mode 100644 index 0000000000..7b8047de67 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Attack/AttackFrontalCharged.cs @@ -0,0 +1,212 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.Activities; +using OpenRA.Mods.CA.Activities; +using OpenRA.Mods.Common.Activities; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Unit must face the target and charge up to fire. ", + "Note: All armaments will share the charge, so its best suited for units with a single weapon.")] + public class AttackFrontalChargedInfo : AttackFrontalInfo, Requires + { + [Desc("Amount of charge required to attack. Use two numbers to represent a random number in a range (lower value included, upper excluded).")] + public readonly int[] ChargeLevel = { 25 }; + + [Desc("Amount to increase the charge level each tick with a valid target.")] + public readonly int ChargeRate = 1; + + [Desc("Amount to decrease the charge level each tick without a valid target.")] + public readonly int DischargeRate = 1; + + [GrantedConditionReference] + [Desc("The condition to grant to self while the charge level is greater than zero.")] + public readonly string ChargingCondition = null; + + [Desc("Array of charge levels on which to add a stack of ChargingCondition.")] + public readonly int[] ConditionChargeLevels = null; + + [Desc("Number of shots that can be fired after charging.")] + public readonly int ShotsPerCharge = 1; + + [Desc("Armaments that count towards shots per charge. Leave empty for all.")] + public readonly string[] ChargeConsumingArmaments = default; + + [Desc("If true, charge will be lost while turning.")] + public readonly bool LosesChargeWhileTurning = false; + + public readonly bool ShowSelectionBar = false; + public readonly Color SelectionBarColor = Color.FromArgb(128, 200, 255); + + public override object Create(ActorInitializer init) { return new AttackFrontalCharged(init.Self, this); } + } + + public class AttackFrontalCharged : AttackFrontal, INotifyAttack, INotifySold, ISelectionBar + { + public new readonly AttackFrontalChargedInfo Info; + IMove movement; + readonly Stack chargingTokens = new Stack(); + + bool charging; + int shotsFired; + int requiredChargeLevel; + + public int ChargeLevel { get; private set; } + + int StackCount + { + get + { + if (Info.ConditionChargeLevels == null) + return ChargeLevel > 0 ? 1 : 0; + + var stackCount = 0; + + foreach (var level in Info.ConditionChargeLevels) + { + if (ChargeLevel >= level) + stackCount++; + } + + return stackCount; + } + } + + public bool IsCharged + { + get + { + return ChargeLevel >= requiredChargeLevel; + } + } + + public bool IsTurning + { + get + { + return movement != null && (movement.CurrentMovementTypes & MovementType.Turn) != 0; + } + } + + public AttackFrontalCharged(Actor self, AttackFrontalChargedInfo info) + : base(self, info) + { + Info = info; + shotsFired = 0; + requiredChargeLevel = Common.Util.RandomInRange(self.World.SharedRandom, info.ChargeLevel); + } + + protected override void Created(Actor self) + { + base.Created(self); + movement = self.TraitOrDefault(); + } + + protected override void TraitEnabled(Actor self) + { + if (self.CurrentActivity is Attack && !(self.CurrentActivity is AttackCharged)) + self.CurrentActivity.Cancel(self); + } + + protected override void Tick(Actor self) + { + if (IsTraitDisabled || IsTraitPaused) + return; + + if (!IsAiming && ChargeLevel == 0) + return; + + var reloading = false; + foreach (var armament in Armaments) + { + if (!armament.IsTraitDisabled && armament.IsReloading && armament.Burst == armament.Weapon.Burst) + { + reloading = true; + break; + } + } + + // Stop charging when we lose our target + bool isTurning = IsTurning; + + charging = + (self.CurrentActivity is AttackCharged || self.CurrentActivity is AttackMoveActivity || self.CurrentActivity is Hunt || self.CurrentActivity is HuntCA) + && !reloading + && IsAiming + && (!isTurning || (isTurning && ChargeLevel > 0 && !Info.LosesChargeWhileTurning)); + + var delta = charging ? Info.ChargeRate : -Info.DischargeRate; + ChargeLevel = (ChargeLevel + delta).Clamp(0, requiredChargeLevel); + + if (!charging) + shotsFired = 0; + + UpdateConditionInstances(self); + + base.Tick(self); + } + + void UpdateConditionInstances(Actor self) + { + if (string.IsNullOrEmpty(Info.ChargingCondition)) + return; + + while (chargingTokens.Count > StackCount) + self.RevokeCondition(chargingTokens.Pop()); + + while (chargingTokens.Count < StackCount) + chargingTokens.Push(self.GrantCondition(Info.ChargingCondition)); + } + + public override Activity GetAttackActivity(Actor self, AttackSource source, in Target newTarget, bool allowMove, bool forceAttack, Color? targetLineColor = null) + { + return new AttackCharged(self, newTarget, allowMove, forceAttack, targetLineColor); + } + + void INotifyAttack.Attacking(Actor self, in Target target, Armament a, Barrel barrel) + { + if (IsTraitDisabled || IsTraitPaused) + return; + + if (Info.ChargeConsumingArmaments != null && !Info.ChargeConsumingArmaments.Contains(a.Info.Name)) + return; + + shotsFired++; + if (shotsFired >= Info.ShotsPerCharge) + { + shotsFired = 0; + ChargeLevel = 0; + requiredChargeLevel = Common.Util.RandomInRange(self.World.SharedRandom, Info.ChargeLevel); + } + } + + void INotifyAttack.PreparingAttack(Actor self, in Target target, Armament a, Barrel barrel) { } + void INotifySold.Selling(Actor self) { ChargeLevel = 0; } + void INotifySold.Sold(Actor self) { } + + float ISelectionBar.GetValue() + { + if (!Info.ShowSelectionBar || ChargeLevel == requiredChargeLevel) + return 0; + + return (float)ChargeLevel / requiredChargeLevel; + } + + bool ISelectionBar.DisplayWhenEmpty { get { return false; } } + + Color ISelectionBar.GetColor() { return Info.SelectionBarColor; } + } +} diff --git a/OpenRA.Mods.CA/Traits/AttackOpenTopped.cs b/OpenRA.Mods.CA/Traits/Attack/AttackOpenTopped.cs similarity index 83% rename from OpenRA.Mods.CA/Traits/AttackOpenTopped.cs rename to OpenRA.Mods.CA/Traits/Attack/AttackOpenTopped.cs index 52db721bd3..36f0c27222 100644 --- a/OpenRA.Mods.CA/Traits/AttackOpenTopped.cs +++ b/OpenRA.Mods.CA/Traits/Attack/AttackOpenTopped.cs @@ -1,10 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -43,7 +43,7 @@ public class AttackOpenTopped : AttackFollow, IRender, INotifyPassengerEntered, readonly Lazy coords; readonly List actors; readonly List armaments; - readonly HashSet<(AnimationWithOffset MuzzleFlash, string Palette)> muzzles; + readonly HashSet<(AnimationWithOffset Animation, string Sequence)> muzzles; readonly Dictionary paxFacing; readonly Dictionary paxPos; readonly Dictionary paxRender; @@ -55,7 +55,7 @@ public AttackOpenTopped(Actor self, AttackOpenToppedInfo info) coords = Exts.Lazy(() => self.Trait()); actors = new List(); armaments = new List(); - muzzles = new HashSet<(AnimationWithOffset, string)>(); + muzzles = new HashSet<(AnimationWithOffset Animation, string Sequence)>(); paxFacing = new Dictionary(); paxPos = new Dictionary(); paxRender = new Dictionary(); @@ -109,7 +109,7 @@ WVec SelectFirePort(Actor self, Actor firer) WVec PortOffset(Actor self, WVec offset) { - var bodyOrientation = coords.Value.QuantizeOrientation(self, self.Orientation); + var bodyOrientation = coords.Value.QuantizeOrientation(self.Orientation); return coords.Value.LocalToWorld(offset.Rotate(bodyOrientation)); } @@ -131,10 +131,9 @@ public override void DoAttack(Actor self, in Target target) var muzzleFacing = targetYaw; paxFacing[a.Actor].Facing = muzzleFacing; - paxPos[a.Actor].SetVisualPosition(a.Actor, pos + PortOffset(self, port)); + paxPos[a.Actor].SetCenterPosition(a.Actor, pos + PortOffset(self, port)); - var barrel = a.CheckFire(a.Actor, facing, target); - if (barrel == null) + if (!a.CheckFire(a.Actor, facing, target)) continue; if (a.Info.MuzzleSequence != null) @@ -153,9 +152,6 @@ public override void DoAttack(Actor self, in Target target) muzzles.Add(pair); muzzleAnim.PlayThen(sequence, () => muzzles.Remove(pair)); } - - foreach (var npa in self.TraitsImplementing()) - npa.Attacking(self, target, a, barrel); } } @@ -163,7 +159,7 @@ IEnumerable IRender.Render(Actor self, WorldRenderer wr) { // Display muzzle flashes foreach (var m in muzzles) - foreach (var r in m.MuzzleFlash.Render(self, wr, wr.Palette(m.Palette), 1f)) + foreach (var r in m.Animation.Render(self, wr.Palette(m.Sequence))) yield return r; } @@ -179,7 +175,7 @@ protected override void Tick(Actor self) // Take a copy so that Tick() can remove animations foreach (var m in muzzles.ToArray()) - m.MuzzleFlash.Animation.Tick(); + m.Animation.Animation.Tick(); } } } diff --git a/OpenRA.Mods.CA/Traits/AttackPrism.cs b/OpenRA.Mods.CA/Traits/Attack/AttackPrism.cs similarity index 93% rename from OpenRA.Mods.CA/Traits/AttackPrism.cs rename to OpenRA.Mods.CA/Traits/Attack/AttackPrism.cs index dce7647146..136a9c81b5 100644 --- a/OpenRA.Mods.CA/Traits/AttackPrism.cs +++ b/OpenRA.Mods.CA/Traits/Attack/AttackPrism.cs @@ -1,11 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion diff --git a/OpenRA.Mods.CA/Traits/AttackPrismSupported.cs b/OpenRA.Mods.CA/Traits/Attack/AttackPrismSupported.cs similarity index 96% rename from OpenRA.Mods.CA/Traits/AttackPrismSupported.cs rename to OpenRA.Mods.CA/Traits/Attack/AttackPrismSupported.cs index d91bd18495..6914aa6700 100644 --- a/OpenRA.Mods.CA/Traits/AttackPrismSupported.cs +++ b/OpenRA.Mods.CA/Traits/Attack/AttackPrismSupported.cs @@ -1,13 +1,10 @@ #region Copyright & License Information -/* - * OpenRA License: - * - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -19,11 +16,11 @@ using OpenRA.Primitives; using OpenRA.Traits; -/* +/** * I tried implementing distance vector routing algorithm * but now I think it is an overkill, * because they take memory for each actor and they need to eachange information. - * Also, C&C games, people just sell towers when they are done with it so + * Also people just sell towers when they are done with it so * that makes these overheads less worthy. */ diff --git a/OpenRA.Mods.CA/Traits/Attack/AttackTurretedCharged.cs b/OpenRA.Mods.CA/Traits/Attack/AttackTurretedCharged.cs new file mode 100644 index 0000000000..72493f7d17 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Attack/AttackTurretedCharged.cs @@ -0,0 +1,205 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Actor has a visual turret used to attack and must charge before firing. ", + "Note: All armaments will share the charge, so its best suited for units with a single weapon.")] + public class AttackTurretedChargedInfo : AttackTurretedInfo, Requires + { + [Desc("Amount of charge required to attack.")] + public readonly int ChargeLevel = 25; + + [Desc("Amount to increase the charge level each tick with a valid target.")] + public readonly int ChargeRate = 1; + + [Desc("Amount to decrease the charge level each tick without a valid target.")] + public readonly int DischargeRate = 1; + + [GrantedConditionReference] + [Desc("The condition to grant to self while the charge level is greater than zero.")] + public readonly string ChargingCondition = null; + + [Desc("Array of charge levels on which to add a stack of ChargingCondition.")] + public readonly int[] ConditionChargeLevels = null; + + [Desc("Number of shots that can be fired after charging.")] + public readonly int ShotsPerCharge = 1; + + [Desc("Charging sounds.")] + public readonly string[] ChargingSounds = null; + + [Desc("Charging sound audible through fog.")] + public readonly bool ChargeAudibleThroughFog = true; + + [Desc("If true, will charge while turret is turning to face the target.")] + public readonly bool ChargeWhileTurning = false; + + public readonly bool ShowSelectionBar = false; + public readonly Color SelectionBarColor = Color.FromArgb(128, 200, 255); + + public override object Create(ActorInitializer init) { return new AttackTurretedCharged(init.Self, this); } + } + + public class AttackTurretedCharged : AttackTurreted, INotifyAttack, INotifySold, ISelectionBar + { + public new readonly AttackTurretedChargedInfo Info; + + readonly Stack chargingTokens = new Stack(); + + bool turretReady; + bool charging; + int shotsFired; + + public int ChargeLevel { get; private set; } + + int StackCount + { + get + { + if (Info.ConditionChargeLevels == null) + return ChargeLevel > 0 ? 1 : 0; + + var stackCount = 0; + + foreach (var level in Info.ConditionChargeLevels) + { + if (ChargeLevel >= level) + stackCount++; + } + + return stackCount; + } + } + + public bool IsCharged + { + get + { + return ChargeLevel >= Info.ChargeLevel; + } + } + + public AttackTurretedCharged(Actor self, AttackTurretedChargedInfo info) + : base(self, info) + { + Info = info; + shotsFired = 0; + turretReady = false; + } + + protected override void Tick(Actor self) + { + if (IsTraitDisabled || IsTraitPaused) + return; + + var reloading = false; + foreach (var armament in Armaments) + { + if (armament.IsTraitEnabled() && armament.FireDelay > 0 && armament.Burst == armament.Weapon.Burst) + { + reloading = true; + break; + } + } + + // Stop charging when we lose our target + charging = !reloading && IsAiming && (Info.ChargeWhileTurning || turretReady); + + if (charging && ChargeLevel == 0) + ChargeSound(self); + + var delta = charging ? Info.ChargeRate : -Info.DischargeRate; + ChargeLevel = (ChargeLevel + delta).Clamp(0, Info.ChargeLevel); + + if (!charging) + shotsFired = 0; + + UpdateConditionInstances(self); + + base.Tick(self); + } + + void UpdateConditionInstances(Actor self) + { + if (string.IsNullOrEmpty(Info.ChargingCondition)) + return; + + while (chargingTokens.Count > StackCount) + self.RevokeCondition(chargingTokens.Pop()); + + while (chargingTokens.Count < StackCount) + chargingTokens.Push(self.GrantCondition(Info.ChargingCondition)); + } + + void INotifyAttack.Attacking(Actor self, in Target target, Armament a, Barrel barrel) + { + if (IsTraitDisabled || IsTraitPaused) + return; + + shotsFired++; + if (shotsFired >= Info.ShotsPerCharge) + { + shotsFired = 0; + ChargeLevel = 0; + } + } + + void INotifyAttack.PreparingAttack(Actor self, in Target target, Armament a, Barrel barrel) { } + void INotifySold.Selling(Actor self) { ChargeLevel = 0; } + void INotifySold.Sold(Actor self) { } + + float ISelectionBar.GetValue() + { + if (!Info.ShowSelectionBar || ChargeLevel == Info.ChargeLevel) + return 0; + + return (float)ChargeLevel / Info.ChargeLevel; + } + + bool ISelectionBar.DisplayWhenEmpty { get { return false; } } + + Color ISelectionBar.GetColor() { return Info.SelectionBarColor; } + + // Main change with AttackTurreted, also checks if charged here + protected override bool CanAttack(Actor self, in Target target) + { + if (target.Type == TargetType.Invalid) + return false; + + // Don't break early from this loop - we want to bring all turrets to bear! + turretReady = false; + foreach (var t in turrets) + if (t.FaceTarget(self, target)) + turretReady = true; + + return turretReady && base.CanAttack(self, target) && IsCharged; + } + + void ChargeSound(Actor self) + { + if (Info.ChargingSounds == null) + return; + + var sound = Info.ChargingSounds.RandomOrDefault(Game.CosmeticRandom); + var shouldStart = Info.ChargeAudibleThroughFog || (!self.World.ShroudObscures(self.CenterPosition) && !self.World.FogObscures(self.CenterPosition)); + + if (!shouldStart) + return; + + Game.Sound.Play(SoundType.World, sound, self.CenterPosition); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/AutoDeployer.cs b/OpenRA.Mods.CA/Traits/AutoDeployer.cs new file mode 100644 index 0000000000..21cab307b6 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/AutoDeployer.cs @@ -0,0 +1,156 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Linq; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Flags] + public enum DeployTriggers + { + None = 0, + Attack = 1, + Damage = 2, + Heal = 4, + Periodically = 8, + BecomingIdle = 16 + } + + [Desc("Allow this actor to automatically issue deploy orders on selected events. Require the AutoDeployManager trait on the player actor.")] + public class AutoDeployerInfo : ConditionalTraitInfo + { + [Desc("Events leading to the actor getting uncloaked. Possible values are: None, Attack, Damage, Heal, Periodically, BecomingIdle.")] + public readonly DeployTriggers DeployTrigger = DeployTriggers.Attack | DeployTriggers.Damage; + + [Desc("Chance of deploying when the trigger activates.")] + public readonly int DeployChance = 50; + + [Desc("Delay between two successful deploy orders.")] + public readonly int DeployTicks = 2500; + + [Desc("Delay to wait for the actor to undeploy (if capable to) after a successful deploy.")] + public readonly int UndeployTicks = 450; + + public override object Create(ActorInitializer init) { return new AutoDeployer(this); } + } + + // TO-DO: Pester OpenRA to allow INotifyDeployTrigger to be used for other traits besides WithMakeAnimation. Like this one. + public class AutoDeployer : ConditionalTrait, INotifyAttack, ITick, INotifyDamage, INotifyCreated, ISync, INotifyOwnerChanged, INotifyDeployComplete, INotifyBecomingIdle + { + public const string PrimaryBuildingOrderID = "PrimaryProducer"; + + [Sync] + int undeployTicks = -1, deployTicks; + + bool deployed; + public bool PrimaryBuilding; + public IIssueDeployOrder[] DeployTraits; + AutoDeployManager autoDeployManager; + + public AutoDeployer(AutoDeployerInfo info) + : base(info) { } + + protected override void Created(Actor self) + { + DeployTraits = self.TraitsImplementing().ToArray(); + PrimaryBuilding = self.Info.HasTraitInfo(); + autoDeployManager = self.Owner.PlayerActor.Trait(); + } + + void TryDeploy(Actor self) + { + if (deployTicks > 0 || autoDeployManager.IsTraitDisabled) + return; + + autoDeployManager.AddEntry(new TraitPair(self, this)); + + deployTicks = Info.DeployTicks; + undeployTicks = Info.UndeployTicks; + } + + void Undeploy(Actor self) + { + if (autoDeployManager.IsTraitDisabled) + return; + + autoDeployManager.AddUndeployOrders(new Order("GrantConditionOnDeploy", self, false)); + } + + void INotifyAttack.Attacking(Actor self, in Target target, Armament a, Barrel barrel) + { + if (IsTraitDisabled || autoDeployManager.IsTraitDisabled) + return; + + if (Info.DeployTrigger.HasFlag(DeployTriggers.Attack)) + TryDeploy(self); + } + + void INotifyAttack.PreparingAttack(Actor self, in Target target, Armament a, Barrel barrel) { } + + void ITick.Tick(Actor self) + { + if (IsTraitDisabled || autoDeployManager.IsTraitDisabled) + return; + + if (deployed) + { + if (--undeployTicks < 0) + { + Undeploy(self); + deployed = false; + } + + return; + } + + if (Info.DeployTrigger.HasFlag(DeployTriggers.Periodically) && --deployTicks < 0) + TryDeploy(self); + } + + void INotifyDamage.Damaged(Actor self, AttackInfo e) + { + if (IsTraitDisabled || autoDeployManager.IsTraitDisabled) + return; + + if (e.Damage.Value > 0 && Info.DeployTrigger.HasFlag(DeployTriggers.Damage)) + TryDeploy(self); + + if (e.Damage.Value < 0 && Info.DeployTrigger.HasFlag(DeployTriggers.Heal)) + TryDeploy(self); + } + + void INotifyOwnerChanged.OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) + { + autoDeployManager = newOwner.PlayerActor.Trait(); + } + + void INotifyDeployComplete.FinishedDeploy(Actor self) + { + deployed = true; + } + + void INotifyDeployComplete.FinishedUndeploy(Actor self) + { + deployed = false; + } + + void INotifyBecomingIdle.OnBecomingIdle(Actor self) + { + if (IsTraitDisabled || autoDeployManager.IsTraitDisabled) + return; + + if (Info.DeployTrigger.HasFlag(DeployTriggers.BecomingIdle)) + TryDeploy(self); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/BallisticMissile.cs b/OpenRA.Mods.CA/Traits/BallisticMissile.cs index af505085a9..db3d936bb0 100644 --- a/OpenRA.Mods.CA/Traits/BallisticMissile.cs +++ b/OpenRA.Mods.CA/Traits/BallisticMissile.cs @@ -1,10 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -20,266 +20,27 @@ namespace OpenRA.Mods.CA.Traits { [Desc("This unit, when ordered to move, will fly in ballistic path then will detonate itself upon reaching target.")] - public class BallisticMissileInfo : TraitInfo, IMoveInfo, IPositionableInfo, IFacingInfo + public class BallisticMissileInfo : MissileBaseInfo { - [Desc("Projectile speed in WDist / tick, two values indicate variable velocity.")] - public readonly int Speed = 17; - - [Desc("In angle. Missile is launched at this pitch and the intial tangential line of the ballistic path will be this.")] - public readonly WAngle LaunchAngle = WAngle.Zero; - - [Desc("Minimum altitude where this missile is considered airborne")] - public readonly int MinAirborneAltitude = 5; - - [Desc("Types of damage missile explosion is triggered with. Leave empty for no damage types.")] - public readonly BitSet DamageTypes = default; - - [GrantedConditionReference] - [Desc("The condition to grant to self while airborne.")] - public readonly string AirborneCondition = null; - - [Desc("Color to use for the target line.")] - public readonly Color TargetLineColor = Color.Crimson; - public override object Create(ActorInitializer init) { return new BallisticMissile(init, this); } - - public IReadOnlyDictionary OccupiedCells(ActorInfo info, CPos location, SubCell subCell = SubCell.Any) { return new ReadOnlyDictionary(); } - bool IOccupySpaceInfo.SharesCell { get { return false; } } - public bool CanEnterCell(World world, Actor self, CPos cell, SubCell subCell = SubCell.FullCell, Actor ignoreActor = null, BlockedByActor check = BlockedByActor.All) - { - // SBMs may not land. - return false; - } - - // set by spawned logic, not this. - public WAngle GetInitialFacing() { return WAngle.Zero; } - - public Color GetTargetLineColor() { return TargetLineColor; } } - public class BallisticMissile : ISync, IFacing, IMove, IPositionable, - INotifyCreated, INotifyAddedToWorld, INotifyRemovedFromWorld, IOccupySpace + public class BallisticMissile : MissileBase { - static readonly (CPos, SubCell)[] NoCells = { }; - - public readonly BallisticMissileInfo Info; - readonly Actor self; - public Target Target; - - IEnumerable speedModifiers; - - [Sync] - public WAngle Facing - { - get { return Orientation.Yaw; } - set { Orientation = Orientation.WithYaw(value); } - } - - public WAngle Pitch - { - get { return Orientation.Pitch; } - set { Orientation = Orientation.WithPitch(value); } - } - - public WRot Orientation { get; private set; } - - [Sync] - public WPos CenterPosition { get; private set; } - - public CPos TopLeft { get { return self.World.Map.CellContaining(CenterPosition); } } - - bool airborne; - int airborneToken = Actor.InvalidConditionToken; - public BallisticMissile(ActorInitializer init, BallisticMissileInfo info) + : base(init, info) { - Info = info; - self = init.Self; - - var locationInit = init.GetOrDefault(info); - if (locationInit != null) - SetPosition(self, locationInit.Value); - - var centerPositionInit = init.GetOrDefault(info); - if (centerPositionInit != null) - SetPosition(self, centerPositionInit.Value); - - // I need facing but initial facing doesn't matter, they are determined by the spawner's facing. - Facing = init.GetValue(info, WAngle.Zero); - } - - // This kind of missile will not turn anyway. Hard-coding here. - public WAngle TurnSpeed { get { return new WAngle(40); } } - - void INotifyCreated.Created(Actor self) - { - speedModifiers = self.TraitsImplementing().ToArray().Select(sm => sm.GetSpeedModifier()); - } - - void INotifyAddedToWorld.AddedToWorld(Actor self) - { - self.World.AddToMaps(self, this); - self.QueueActivity(new BallisticMissileFly(self, Target, this)); - - var altitude = self.World.Map.DistanceAboveTerrain(CenterPosition); - if (altitude.Length >= Info.MinAirborneAltitude) - OnAirborneAltitudeReached(); - } - - public (CPos Cell, SubCell SubCell)[] OccupiedCells() - { - return NoCells; - } - - public int MovementSpeed - { - get { return Util.ApplyPercentageModifiers(Info.Speed, speedModifiers); } - } - - public WVec FlyStep(WAngle facing) - { - return FlyStep(MovementSpeed, facing); - } - - public WVec FlyStep(int speed, WAngle facing) - { - var dir = new WVec(0, -1024, 0).Rotate(WRot.FromFacing(facing.Facing)); - return speed * dir / 1024; - } - - #region Implement IPositionable - - public bool CanExistInCell(CPos cell) { return true; } - public bool IsLeavingCell(CPos location, SubCell subCell = SubCell.Any) { return false; } // TODO: Handle landing - public bool CanEnterCell(CPos location, Actor ignoreActor = null, BlockedByActor check = BlockedByActor.All) { return true; } - public SubCell GetValidSubCell(SubCell preferred) { return SubCell.Invalid; } - public SubCell GetAvailableSubCell(CPos location, SubCell preferredSubCell = SubCell.Any, Actor ignoreActor = null, BlockedByActor check = BlockedByActor.All) - { - // Does not use any subcell - return SubCell.Invalid; - } - - public void SetVisualPosition(Actor self, WPos pos) { SetPosition(self, pos); } - - // Changes position, but not altitude - public void SetPosition(Actor self, CPos cell, SubCell subCell = SubCell.Any) - { - SetPosition(self, self.World.Map.CenterOfCell(cell) + new WVec(0, 0, CenterPosition.Z)); - } - - public void SetPosition(Actor self, WPos pos) - { - CenterPosition = pos; - - if (!self.IsInWorld) - return; - - self.World.UpdateMaps(self, this); - - var altitude = self.World.Map.DistanceAboveTerrain(CenterPosition); - var isAirborne = altitude.Length >= Info.MinAirborneAltitude; - if (isAirborne && !airborne) - OnAirborneAltitudeReached(); - else if (!isAirborne && airborne) - OnAirborneAltitudeLeft(); - } - - #endregion - - #region Implement IMove - - public Activity MoveTo(CPos cell, int nearEnough = 0, Actor ignoreActor = null, - bool evaluateNearestMovableCell = false, Color? targetLineColor = null) - { - return new BallisticMissileFly(self, Target.FromCell(self.World, cell), this); + // } - public Activity MoveWithinRange(in Target target, WDist range, - WPos? initialTargetPosition = null, Color? targetLineColor = null) + public override void SetTarget(Target target) { - return new BallisticMissileFly(self, target, this); + Target = Target.FromPos(target.CenterPosition); } - public Activity MoveWithinRange(in Target target, WDist minRange, WDist maxRange, - WPos? initialTargetPosition = null, Color? targetLineColor = null) + protected override Activity GetActivity(Actor self, Target target) { return new BallisticMissileFly(self, target, this); } - - public Activity MoveFollow(Actor self, in Target target, WDist minRange, WDist maxRange, - WPos? initialTargetPosition = null, Color? targetLineColor = null) - { - return null; - } - - public Activity ReturnToCell(Actor self) - { - return null; - } - - public Activity MoveToTarget(Actor self, in Target target, - WPos? initialTargetPosition = null, Color? targetLineColor = null) - { - return new BallisticMissileFly(self, target, this); - } - - public Activity MoveIntoTarget(Actor self, in Target target) - { - return new BallisticMissileFly(self, target, this); - } - - public Activity VisualMove(Actor self, WPos fromPos, WPos toPos) - { - return new BallisticMissileFly(self, Target.FromPos(toPos), this); - } - - public int EstimatedMoveDuration(Actor self, WPos fromPos, WPos toPos) - { - var speed = MovementSpeed; - return speed > 0 ? (toPos - fromPos).Length / speed : 0; - } - - public CPos NearestMoveableCell(CPos cell) { return cell; } - - // Actors with BallisticMissile always move - public MovementType CurrentMovementTypes { get { return MovementType.Horizontal | MovementType.Vertical; } set { } } - - public bool CanEnterTargetNow(Actor self, in Target target) - { - // you can never control ballistic missiles anyway - return false; - } - - #endregion - - void INotifyRemovedFromWorld.RemovedFromWorld(Actor self) - { - self.World.RemoveFromMaps(self, this); - OnAirborneAltitudeLeft(); - } - - #region Airborne conditions - - void OnAirborneAltitudeReached() - { - if (airborne) - return; - - airborne = true; - if (airborneToken == Actor.InvalidConditionToken) - airborneToken = self.GrantCondition(Info.AirborneCondition); - } - - void OnAirborneAltitudeLeft() - { - if (!airborne) - return; - - airborne = false; - if (airborneToken != Actor.InvalidConditionToken) - airborneToken = self.RevokeCondition(airborneToken); - } - - #endregion } } diff --git a/OpenRA.Mods.CA/Traits/BaseSpawnerMaster.cs b/OpenRA.Mods.CA/Traits/BaseSpawnerMaster.cs deleted file mode 100644 index 3bb2655948..0000000000 --- a/OpenRA.Mods.CA/Traits/BaseSpawnerMaster.cs +++ /dev/null @@ -1,315 +0,0 @@ -#region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. - */ -#endregion - -using System; -using System.Collections.Generic; -using System.Linq; -using OpenRA.Mods.Common.Traits; -using OpenRA.Primitives; -using OpenRA.Traits; - -namespace OpenRA.Mods.CA.Traits -{ - // What to do when master is killed or mind controlled - public enum SpawnerSlaveDisposal - { - DoNothing, - KillSlaves, - GiveSlavesToAttacker - } - - public class BaseSpawnerSlaveEntry - { - public string ActorName = null; - public Actor Actor = null; - public BaseSpawnerSlave SpawnerSlave = null; - public bool IsLaunched; - - public bool IsValid { get { return Actor != null && !Actor.IsDead; } } - } - - [Desc("This actor can spawn actors.")] - public class BaseSpawnerMasterInfo : PausableConditionalTraitInfo - { - [Desc("Spawn these units. Define this like paradrop support power.")] - public readonly string[] Actors; - - [Desc("Slave actors to contain upon creation. Set to -1 to start with full slaves.")] - public readonly int InitialActorCount = -1; - - [Desc("Name of the armaments that grant this condition.")] - public readonly HashSet ArmamentNames = new HashSet() { "primary" }; - - [Desc("What happens to the slaves when the master is killed?")] - public readonly SpawnerSlaveDisposal SlaveDisposalOnKill = SpawnerSlaveDisposal.KillSlaves; - - [Desc("What happens to the slaves when the master is mind controlled?")] - public readonly SpawnerSlaveDisposal SlaveDisposalOnOwnerChange = SpawnerSlaveDisposal.GiveSlavesToAttacker; - - [Desc("Only spawn initial load of slaves?")] - public readonly bool NoRegeneration = false; - - [Desc("Spawn all slaves at once when regenerating slaves, instead of one by one?")] - public readonly bool SpawnAllAtOnce = false; - - [Desc("Spawn regen delay, in ticks")] - public readonly int RespawnTicks = 150; - - public override void RulesetLoaded(Ruleset rules, ActorInfo ai) - { - base.RulesetLoaded(rules, ai); - - if (Actors == null || Actors.Length == 0) - throw new YamlException("Actors is null or empty for a spawner trait in actor type {0}!".F(ai.Name)); - - if (InitialActorCount > Actors.Length) - throw new YamlException("InitialActorCount can't be larger than the actors defined! (Actor type = {0})".F(ai.Name)); - - if (InitialActorCount < -1) - throw new YamlException("InitialActorCount must be -1 or non-negative. Actor type = {0}".F(ai.Name)); - } - - public override object Create(ActorInitializer init) { return new BaseSpawnerMaster(init, this); } - } - - public class BaseSpawnerMaster : PausableConditionalTrait, INotifyKilled, INotifyOwnerChanged, INotifyActorDisposing - { - readonly Actor self; - - IFacing facing; - - protected IReloadModifier[] reloadModifiers; - - public readonly BaseSpawnerSlaveEntry[] SlaveEntries; - - public BaseSpawnerMaster(ActorInitializer init, BaseSpawnerMasterInfo info) - : base(info) - { - self = init.Self; - - // Initialize slave entries (doesn't instantiate the slaves yet) - SlaveEntries = CreateSlaveEntries(info); - - for (var i = 0; i < info.Actors.Length; i++) - { - var entry = SlaveEntries[i]; - entry.ActorName = info.Actors[i].ToLowerInvariant(); - } - } - - public virtual BaseSpawnerSlaveEntry[] CreateSlaveEntries(BaseSpawnerMasterInfo info) - { - var slaveEntries = new BaseSpawnerSlaveEntry[info.Actors.Length]; - - for (var i = 0; i < slaveEntries.Length; i++) - slaveEntries[i] = new BaseSpawnerSlaveEntry(); - - return slaveEntries; - } - - protected override void Created(Actor self) - { - base.Created(self); - - facing = self.TraitOrDefault(); - - reloadModifiers = self.TraitsImplementing().ToArray(); - } - - /// - /// Replenish destoyed slaves or create new ones from nothing. - /// Follows policy defined by Info.OneShotSpawn. - /// - public void Replenish(Actor self, BaseSpawnerSlaveEntry[] slaveEntries) - { - if (Info.SpawnAllAtOnce) - { - foreach (var se in slaveEntries) - { - if (!se.IsValid) - Replenish(self, se); - } - } - else - { - var entry = SelectEntryToSpawn(slaveEntries); - - // All are alive and well. - if (entry == null) - return; - - Replenish(self, entry); - } - } - - /// - /// Replenish one slave entry. - /// - public virtual void Replenish(Actor self, BaseSpawnerSlaveEntry entry) - { - if (entry.IsValid) - throw new InvalidOperationException("Replenish must not be run on a valid entry!"); - - // Some members are missing. Create a new one. - var slave = self.World.CreateActor(false, entry.ActorName, - new TypeDictionary { new OwnerInit(self.Owner) }); - - // Initialize slave entry - InitializeSlaveEntry(slave, entry); - entry.SpawnerSlave.LinkMaster(entry.Actor, self, this); - } - - /// - /// Slave entry initializer function. - /// Override this function from derived classes to initialize their own specific stuff. - /// - public virtual void InitializeSlaveEntry(Actor slave, BaseSpawnerSlaveEntry entry) - { - entry.Actor = slave; - entry.SpawnerSlave = slave.Trait(); - - if (IsTraitDisabled) - entry.SpawnerSlave.GrantMasterDisabledCondition(entry.Actor); - - if (IsTraitPaused) - entry.SpawnerSlave.GrantMasterPausedCondition(entry.Actor); - } - - protected BaseSpawnerSlaveEntry SelectEntryToSpawn(BaseSpawnerSlaveEntry[] slaveEntries) - { - // If any thing is marked dead or null, that's a candidate. - var candidates = slaveEntries.Where(m => !m.IsValid); - if (!candidates.Any()) - return null; - - return candidates.Random(self.World.SharedRandom); - } - - public virtual void OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) - { - self.World.AddFrameEndTask(w => - { - foreach (var slaveEntry in SlaveEntries) - { - if (slaveEntry.IsValid) - slaveEntry.SpawnerSlave.OnMasterOwnerChanged(slaveEntry.Actor, oldOwner, newOwner, Info.SlaveDisposalOnOwnerChange); - } - }); - } - - void INotifyActorDisposing.Disposing(Actor self) - { - foreach (var slaveEntry in SlaveEntries) - { - if (slaveEntry.IsValid) - slaveEntry.SpawnerSlave.OnMasterKilled(slaveEntry.Actor, self.Owner.PlayerActor, Info.SlaveDisposalOnKill); - } - } - - public virtual void SpawnIntoWorld(Actor self, Actor slave, WPos centerPosition) - { - var exit = self.RandomExitOrDefault(self.World, null); - SetSpawnedFacing(slave, exit); - - self.World.AddFrameEndTask(w => - { - if (self.IsDead) - return; - - var spawnOffset = exit == null ? WVec.Zero : exit.Info.SpawnOffset; - slave.Trait().SetVisualPosition(slave, centerPosition + spawnOffset); - - var location = self.World.Map.CellContaining(centerPosition + spawnOffset); - - var mv = slave.Trait(); - slave.QueueActivity(mv.ReturnToCell(slave)); - - slave.QueueActivity(mv.MoveTo(location, 2)); - - w.Add(slave); - }); - } - - protected void SetSpawnedFacing(Actor spawned, Exit exit) - { - WAngle facingOffset = facing == null ? WAngle.Zero : facing.Facing; - - var exitFacing = exit != null && exit.Info.Facing != null ? exit.Info.Facing : WAngle.Zero; - - var spawnFacing = spawned.TraitOrDefault(); - if (spawnFacing != null) - spawnFacing.Facing = facingOffset + exitFacing.Value; - } - - public void StopSlaves() - { - foreach (var slaveEntry in SlaveEntries) - { - if (!slaveEntry.IsValid) - continue; - - slaveEntry.SpawnerSlave.Stop(slaveEntry.Actor); - } - } - - public virtual void OnSlaveKilled(Actor self, Actor slave) { } - - void INotifyKilled.Killed(Actor self, AttackInfo e) - { - Killed(self, e); - } - - protected virtual void Killed(Actor self, AttackInfo e) - { - // Notify slaves. - foreach (var slaveEntry in SlaveEntries) - { - if (slaveEntry.IsValid) - slaveEntry.SpawnerSlave.OnMasterKilled(slaveEntry.Actor, e.Attacker, Info.SlaveDisposalOnKill); - } - } - - protected override void TraitEnabled(Actor self) - { - foreach (var slaveEntry in SlaveEntries) - { - if (slaveEntry.IsValid) - slaveEntry.SpawnerSlave.RevokeMasterDisabledCondition(slaveEntry.Actor); - } - } - - protected override void TraitDisabled(Actor self) - { - foreach (var slaveEntry in SlaveEntries) - { - if (slaveEntry.IsValid) - slaveEntry.SpawnerSlave.GrantMasterDisabledCondition(slaveEntry.Actor); - } - } - - protected override void TraitResumed(Actor self) - { - foreach (var slaveEntry in SlaveEntries) - { - if (slaveEntry.IsValid) - slaveEntry.SpawnerSlave.RevokeMasterPausedCondition(slaveEntry.Actor); - } - } - - protected override void TraitPaused(Actor self) - { - foreach (var slaveEntry in SlaveEntries) - { - if (slaveEntry.IsValid) - slaveEntry.SpawnerSlave.GrantMasterPausedCondition(slaveEntry.Actor); - } - } - } -} diff --git a/OpenRA.Mods.CA/Traits/BaseSpawnerSlave.cs b/OpenRA.Mods.CA/Traits/BaseSpawnerSlave.cs deleted file mode 100644 index d06804cb77..0000000000 --- a/OpenRA.Mods.CA/Traits/BaseSpawnerSlave.cs +++ /dev/null @@ -1,221 +0,0 @@ -#region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. - */ -#endregion - -using System.Linq; -using OpenRA.Mods.Common.Activities; -using OpenRA.Mods.Common.Traits; -using OpenRA.Primitives; -using OpenRA.Traits; - -namespace OpenRA.Mods.CA.Traits -{ - [Desc("Can be slaved to a SpawnerMaster.")] - public class BaseSpawnerSlaveInfo : TraitInfo - { - [GrantedConditionReference] - [Desc("The condition to grant to slaves when the master actor is killed.")] - public readonly string MasterDeadCondition = null; - - [Desc("Can these actors be mind controlled or captured?")] - public readonly bool AllowOwnerChange = false; - - [Desc("Types of damage this actor explodes with due to an unallowed slave action. Leave empty for no damage types.")] - public readonly BitSet DamageTypes = default(BitSet); - - [GrantedConditionReference] - [Desc("The condition to grant when the master trait is disabled.")] - public readonly string GrantConditionWhenMasterIsDisabled = null; - - [GrantedConditionReference] - [Desc("The condition to grant when the master trait is paused.")] - public readonly string GrantConditionWhenMasterIsPaused = null; - - public override object Create(ActorInitializer init) { return new BaseSpawnerSlave(init, this); } - } - - public class BaseSpawnerSlave : INotifyCreated, INotifyKilled, INotifyOwnerChanged - { - protected AttackBase[] attackBases; - - readonly BaseSpawnerSlaveInfo info; - - public bool HasFreeWill = false; - - BaseSpawnerMaster spawnerMaster = null; - - public Actor Master { get; private set; } - - // Make this actor attack a target. - Target lastTarget; - - int masterTraitDisabledConditionToken = Actor.InvalidConditionToken; - int masterTraitPausedConditionToken = Actor.InvalidConditionToken; - - public BaseSpawnerSlave(ActorInitializer init, BaseSpawnerSlaveInfo info) - { - this.info = info; - } - - void INotifyCreated.Created(Actor self) - { - Created(self); - } - - protected virtual void Created(Actor self) - { - attackBases = self.TraitsImplementing().ToArray(); - } - - void INotifyKilled.Killed(Actor self, AttackInfo e) - { - if (Master == null || Master.IsDead) - return; - - spawnerMaster.OnSlaveKilled(Master, self); - } - - public virtual void LinkMaster(Actor self, Actor master, BaseSpawnerMaster spawnerMaster) - { - Master = master; - this.spawnerMaster = spawnerMaster; - } - - bool TargetSwitched(Target lastTarget, Target newTarget) - { - if (newTarget.Type != lastTarget.Type) - return true; - - if (newTarget.Type == TargetType.Terrain) - return newTarget.CenterPosition != lastTarget.CenterPosition; - - if (newTarget.Type == TargetType.Actor) - return lastTarget.Actor != newTarget.Actor; - - return false; - } - - // Stop what self was doing. - public virtual void Stop(Actor self) - { - // Drop the target so that Attack() feels the need to assign target for this slave. - lastTarget = Target.Invalid; - - self.CancelActivity(); - } - - public virtual void Attack(Actor self, Target target) - { - // Don't have to change target or alter current activity. - if (!TargetSwitched(lastTarget, target)) - return; - - if (!target.IsValidFor(self)) - { - Stop(self); - return; - } - - lastTarget = target; - - foreach (var ab in attackBases) - { - if (ab.IsTraitDisabled) - continue; - - ab.AttackTarget(target, AttackSource.Default, false, true, true); - } - } - - public virtual void OnMasterKilled(Actor self, Actor attacker, SpawnerSlaveDisposal disposal) - { - // Grant MasterDead condition. - self.GrantCondition(info.MasterDeadCondition); - - switch (disposal) - { - case SpawnerSlaveDisposal.KillSlaves: - self.Kill(attacker, info.DamageTypes); - break; - case SpawnerSlaveDisposal.GiveSlavesToAttacker: - self.CancelActivity(); - self.ChangeOwner(attacker.Owner); - break; - case SpawnerSlaveDisposal.DoNothing: - // fall through - default: - break; - } - } - - // What if the master gets mind controlled? - public virtual void OnMasterOwnerChanged(Actor self, Player oldOwner, Player newOwner, SpawnerSlaveDisposal disposal) - { - switch (disposal) - { - case SpawnerSlaveDisposal.KillSlaves: - self.Kill(self, info.DamageTypes); - break; - case SpawnerSlaveDisposal.GiveSlavesToAttacker: - self.CancelActivity(); - self.ChangeOwner(newOwner); - break; - case SpawnerSlaveDisposal.DoNothing: - // fall through - default: - break; - } - } - - // What if the slave gets mind controlled? - // Slaves aren't good without master so, kill it. - void INotifyOwnerChanged.OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) - { - // In this case, the slave will be disposed, one way or other. - if (Master == null || !Master.IsDead) - return; - - // This function got triggered because the master got mind controlled and - // thus triggered slave.ChangeOwner(). - // In this case, do nothing. - if (Master.Owner == newOwner) - return; - - // These are independent, so why not let it be controlled? - if (info.AllowOwnerChange) - return; - - self.Kill(self, info.DamageTypes); - } - - public void GrantMasterPausedCondition(Actor self) - { - if (masterTraitPausedConditionToken == Actor.InvalidConditionToken) - masterTraitPausedConditionToken = self.GrantCondition(info.GrantConditionWhenMasterIsPaused); - } - - public void RevokeMasterPausedCondition(Actor self) - { - if (masterTraitPausedConditionToken != Actor.InvalidConditionToken) - masterTraitPausedConditionToken = self.RevokeCondition(masterTraitPausedConditionToken); - } - - public void GrantMasterDisabledCondition(Actor self) - { - if (masterTraitDisabledConditionToken == Actor.InvalidConditionToken) - masterTraitDisabledConditionToken = self.GrantCondition(info.GrantConditionWhenMasterIsDisabled); - } - - public void RevokeMasterDisabledCondition(Actor self) - { - if (masterTraitDisabledConditionToken != Actor.InvalidConditionToken) - masterTraitDisabledConditionToken = self.RevokeCondition(masterTraitDisabledConditionToken); - } - } -} diff --git a/OpenRA.Mods.CA/Traits/Berserkable.cs b/OpenRA.Mods.CA/Traits/Berserkable.cs index 806da6a4d8..96edf3e89d 100644 --- a/OpenRA.Mods.CA/Traits/Berserkable.cs +++ b/OpenRA.Mods.CA/Traits/Berserkable.cs @@ -1,16 +1,19 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion +using System.Collections.Generic; +using System.Data; using System.Linq; using OpenRA.Mods.Common.Activities; using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; using OpenRA.Traits; namespace OpenRA.Mods.CA.Traits @@ -18,41 +21,59 @@ namespace OpenRA.Mods.CA.Traits [Desc("When enabled, the actor will randomly try to attack nearby other actors.")] public class BerserkableInfo : ConditionalTraitInfo { + [Desc("Will only attack units with these target types.")] + public readonly BitSet InvalidTargets = new BitSet(); + + [Desc("Maximum scan range. If zero, uses the maximum range of the unit's weapons and auto-target traits.")] + public readonly WDist MaxRange = WDist.Zero; + public override object Create(ActorInitializer init) { return new Berserkable(init.Self, this); } } class Berserkable : ConditionalTrait, INotifyIdle { + Mobile mobile; + IEnumerable autoTargets; + IEnumerable attackBases; + Harvester harvester; + public Berserkable(Actor self, BerserkableInfo info) - : base(info) { } + : base(info) {} + + protected override void Created(Actor self) + { + base.Created(self); + mobile = self.TraitOrDefault(); + autoTargets = self.TraitsImplementing(); + attackBases = self.TraitsImplementing(); + harvester = self.TraitOrDefault(); + } void Blink(Actor self) { - self.World.AddFrameEndTask(w => + if (self.IsInWorld) { - if (self.IsInWorld) - { - var stop = new Order("Stop", self, false); - foreach (var t in self.TraitsImplementing()) - t.ResolveOrder(self, stop); - - w.Remove(self); - self.Generation++; - w.Add(self); - } - }); + var stop = new Order("Stop", self, false); + foreach (var t in self.TraitsImplementing()) + t.ResolveOrder(self, stop); + } } protected override void TraitEnabled(Actor self) { - // Getting enraged cancels current activity. - Blink(self); + self.World.AddFrameEndTask(w => Blink(self)); } protected override void TraitDisabled(Actor self) { - // Getting unraged should drop the target, too. - Blink(self); + self.World.AddFrameEndTask(w => + { + Blink(self); + + if (harvester != null) + self.QueueActivity(false, new FindAndDeliverResources(self)); + }); + } WDist GetScanRange(Actor self, AttackBase[] atbs) @@ -60,8 +81,7 @@ WDist GetScanRange(Actor self, AttackBase[] atbs) WDist range = WDist.Zero; // Get max value of autotarget scan range. - var autoTargets = self.TraitsImplementing().Where(a => !a.IsTraitDisabled).ToArray(); - foreach (var at in autoTargets) + foreach (var at in autoTargets.Where(a => !a.IsTraitDisabled)) { var r = at.Info.ScanRadius; if (r > range.Length) @@ -76,6 +96,9 @@ WDist GetScanRange(Actor self, AttackBase[] atbs) range = r; } + if (Info.MaxRange.Length != 0 && Info.MaxRange.Length < range.Length) + range = Info.MaxRange; + return range; } @@ -84,27 +107,37 @@ void INotifyIdle.TickIdle(Actor self) if (IsTraitDisabled) return; - var atbs = self.TraitsImplementing().Where(a => !a.IsTraitDisabled && !a.IsTraitPaused).ToArray(); - if (atbs.Length == 0) + var activeAttackBases = attackBases.Where(a => !a.IsTraitDisabled && !a.IsTraitPaused).ToArray(); + if (activeAttackBases.Length == 0) { + if (mobile != null) + self.QueueActivity(false, new Nudge(self)); + self.QueueActivity(new Wait(15)); return; } - WDist range = GetScanRange(self, atbs); + WDist range = GetScanRange(self, activeAttackBases); var targets = self.World.FindActorsInCircle(self.CenterPosition, range) - .Where(a => !a.Owner.NonCombatant && a != self && a.IsTargetableBy(self)); + .Where(a => !a.Owner.NonCombatant + && a != self + && a.IsTargetableBy(self) + && activeAttackBases.Any(ab => ab.HasAnyValidWeapons(Target.FromActor(a))) + && !Info.InvalidTargets.Overlaps(a.GetEnabledTargetTypes())); if (!targets.Any()) { + if (mobile != null) + self.QueueActivity(false, new Nudge(self)); + self.QueueActivity(new Wait(15)); return; } // Attack a random target. var target = Target.FromActor(targets.Random(self.World.SharedRandom)); - self.QueueActivity(atbs.First().GetAttackActivity(self, AttackSource.AutoTarget, target, true, true)); + self.QueueActivity(activeAttackBases.First().GetAttackActivity(self, AttackSource.AutoTarget, target, true, true)); } } } diff --git a/OpenRA.Mods.CA/Traits/BotModules/BaseBuilderBotModuleCA.cs b/OpenRA.Mods.CA/Traits/BotModules/BaseBuilderBotModuleCA.cs index 02e30a7578..bcad07bf2e 100644 --- a/OpenRA.Mods.CA/Traits/BotModules/BaseBuilderBotModuleCA.cs +++ b/OpenRA.Mods.CA/Traits/BotModules/BaseBuilderBotModuleCA.cs @@ -1,19 +1,19 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion using System; -using System.Collections; using System.Collections.Generic; using System.Linq; +using OpenRA.Mods.Common; using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; using OpenRA.Traits; namespace OpenRA.Mods.CA.Traits @@ -22,37 +22,37 @@ namespace OpenRA.Mods.CA.Traits public class BaseBuilderBotModuleCAInfo : ConditionalTraitInfo { [Desc("Tells the AI what building types are considered construction yards.")] - public readonly HashSet ConstructionYardTypes = new HashSet(); + public readonly HashSet ConstructionYardTypes = new(); [Desc("Tells the AI what building types are considered vehicle production facilities.")] - public readonly HashSet VehiclesFactoryTypes = new HashSet(); + public readonly HashSet VehiclesFactoryTypes = new(); [Desc("Tells the AI what building types are considered refineries.")] - public readonly HashSet RefineryTypes = new HashSet(); + public readonly HashSet RefineryTypes = new(); [Desc("Tells the AI what building types are considered power plants.")] - public readonly HashSet PowerTypes = new HashSet(); + public readonly HashSet PowerTypes = new(); [Desc("Tells the AI what building types are considered infantry production facilities.")] - public readonly HashSet BarracksTypes = new HashSet(); + public readonly HashSet BarracksTypes = new(); - [Desc("Tells the AI what building types are considered anti-air defenses.")] - public readonly HashSet AntiAirTypes = new HashSet(); + [Desc("Tells the AI what building types are considered defenses.")] + public readonly HashSet DefenseTypes = new(); [Desc("Tells the AI what building types are considered production facilities.")] - public readonly HashSet ProductionTypes = new HashSet(); + public readonly HashSet ProductionTypes = new(); [Desc("Tells the AI what building types are considered naval production facilities.")] - public readonly HashSet NavalProductionTypes = new HashSet(); + public readonly HashSet NavalProductionTypes = new(); [Desc("Tells the AI what building types are considered silos (resource storage).")] - public readonly HashSet SiloTypes = new HashSet(); + public readonly HashSet SiloTypes = new(); [Desc("Production queues AI uses for buildings.")] - public readonly HashSet BuildingQueues = new HashSet { "Building" }; + public readonly HashSet BuildingQueues = new() { "Building" }; [Desc("Production queues AI uses for defenses.")] - public readonly HashSet DefenseQueues = new HashSet { "Defense" }; + public readonly HashSet DefenseQueues = new() { "Defense" }; [Desc("Minimum distance in cells from center of the base when checking for building placement.")] public readonly int MinBaseRadius = 2; @@ -60,9 +60,6 @@ public class BaseBuilderBotModuleCAInfo : ConditionalTraitInfo [Desc("Radius in cells around the center of the base to expand.")] public readonly int MaxBaseRadius = 20; - [Desc("Maximum number of refineries to build.")] - public readonly int MaxRefineries = 4; - [Desc("Minimum excess power the AI should try to maintain.")] public readonly int MinimumExcessPower = 0; @@ -80,8 +77,8 @@ public class BaseBuilderBotModuleCAInfo : ConditionalTraitInfo public readonly int StructureProductionInactiveDelay = 125; [Desc("Additional delay (in ticks) added between structure production checks when actively building things.", - "Note: The total delay is gamespeed OrderLatency x 4 + this + StructureProductionRandomBonusDelay.")] - public readonly int StructureProductionActiveDelay = 0; + "Note: this should be at least as large as the typical order latency to avoid duplicated build choices.")] + public readonly int StructureProductionActiveDelay = 25; [Desc("A random delay (in ticks) of up to this is added to active/inactive production delays.")] public readonly int StructureProductionRandomBonusDelay = 10; @@ -109,7 +106,7 @@ public class BaseBuilderBotModuleCAInfo : ConditionalTraitInfo public readonly int MaximumDefenseRadius = 20; [Desc("Try to build another production building if there is too much cash.")] - public readonly int NewProductionCashThreshold = 5000; + public readonly int NewProductionCashThreshold = 10000; // CA: Increased from 5000 [Desc("Radius in cells around a factory scanned for rally points by the AI.")] public readonly int RallyPointScanRadius = 8; @@ -120,7 +117,7 @@ public class BaseBuilderBotModuleCAInfo : ConditionalTraitInfo public readonly int CheckForWaterRadius = 8; [Desc("Terrain types which are considered water for base building purposes.")] - public readonly HashSet WaterTerrainTypes = new HashSet { "Water" }; + public readonly HashSet WaterTerrainTypes = new() { "Water" }; [Desc("What buildings to the AI should build.", "What integer percentage of the total base must be this type of building.")] public readonly Dictionary BuildingFractions = null; @@ -131,63 +128,123 @@ public class BaseBuilderBotModuleCAInfo : ConditionalTraitInfo [Desc("When should the AI start building specific buildings.")] public readonly Dictionary BuildingDelays = null; + [Desc("Delay (in ticks) between reassigning rally points.")] + public readonly int AssignRallyPointsInterval = 100; + + // ============================== + // === CA-SPECIFIC PROPERTIES === + // ============================== + + [Desc("Tells the AI what building types are considered anti-air defenses.")] + public readonly HashSet AntiAirTypes = new(); + + [Desc("Maximum number of extra refineries to build (in addition to 2 per construction yard).")] + public readonly int MaxExtraRefineries = 1; + + [Desc("Minimum number of refineries to build before building a barracks and a factory.")] + public readonly int InitialMinimumRefineryCount = 1; + + [Desc("Minimum number of refineries to build after building a barracks and a factory.")] + public readonly int NormalMinimumRefineryCount = 2; + + [Desc("Only queue construction of a new building when above this requirement.")] + public readonly int BuildingProductionMinCashRequirement = 1750; + + [Desc("Only queue construction of a new defense when above this requirement.")] + public readonly int DefenseProductionMinCashRequirement = 2250; + + [Desc("Minimum duration between building specific buildings.")] + public readonly Dictionary BuildingIntervals = null; + + [Desc("Enemy building target types I can ignore construction distance from.")] + public readonly BitSet IgnoredEnemyBuildingTargetTypes = default; + + [Desc("Unit target types I should not count when scanning for sell condition .")] + public readonly BitSet IgnoredUnitTargetTypes = default; + + [Desc("Radius in cells around building being considered for sale to scan for units")] + public readonly int SellScanRadius = 8; + public override object Create(ActorInitializer init) { return new BaseBuilderBotModuleCA(init.Self, this); } } public class BaseBuilderBotModuleCA : ConditionalTrait, IGameSaveTraitData, - IBotTick, IBotPositionsUpdated, IBotRespondToAttack, IBotRequestPauseUnitProduction + IBotTick, IBotPositionsUpdated, IBotRespondToAttack, IBotRequestPauseUnitProduction, INotifyActorDisposing { public CPos GetRandomBaseCenter() { - var randomConstructionYard = world.Actors.Where(a => a.Owner == player && - Info.ConstructionYardTypes.Contains(a.Info.Name)) + var randomConstructionYard = constructionYardBuildings.Actors .RandomOrDefault(world.LocalRandom); - return randomConstructionYard != null ? randomConstructionYard.Location : initialBaseCenter; + return randomConstructionYard?.Location ?? initialBaseCenter; } - public CPos DefenseCenter { get { return defenseCenter; } } + public CPos DefenseCenter { get; private set; } + + /// Actor, ActorCount. + public Dictionary BuildingsBeingProduced = new(); readonly World world; readonly Player player; PowerManager playerPower; PlayerResources playerResources; + IResourceLayer resourceLayer; + IPathFinder pathFinder; IBotPositionsUpdated[] positionsUpdatedModules; - BitArray resourceTypeIndices; CPos initialBaseCenter; - CPos defenseCenter; - List builders = new List(); + readonly Stack> rallyPoints = new(); + int assignRallyPointsTicks; + + readonly BaseBuilderQueueManagerCA[] builders; // CA: Uses CA queue manager instead of engine version + int currentBuilderIndex = 0; + + readonly ActorIndex.OwnerAndNamesAndTrait refineryBuildings; + readonly ActorIndex.OwnerAndNamesAndTrait powerBuildings; + readonly ActorIndex.OwnerAndNamesAndTrait constructionYardBuildings; + readonly ActorIndex.OwnerAndNamesAndTrait barracksBuildings; + readonly ActorIndex.OwnerAndNamesAndTrait vehicleFactoryBuildings; // CA: Additional building tracker public BaseBuilderBotModuleCA(Actor self, BaseBuilderBotModuleCAInfo info) : base(info) { world = self.World; player = self.Owner; + builders = new BaseBuilderQueueManagerCA[info.BuildingQueues.Count + info.DefenseQueues.Count]; + refineryBuildings = new ActorIndex.OwnerAndNamesAndTrait(world, info.RefineryTypes, player); + powerBuildings = new ActorIndex.OwnerAndNamesAndTrait(world, info.PowerTypes, player); + constructionYardBuildings = new ActorIndex.OwnerAndNamesAndTrait(world, info.ConstructionYardTypes, player); + barracksBuildings = new ActorIndex.OwnerAndNamesAndTrait(world, info.BarracksTypes, player); + vehicleFactoryBuildings = new ActorIndex.OwnerAndNamesAndTrait(world, info.VehiclesFactoryTypes, player); // CA: Additional building tracker } protected override void Created(Actor self) { - // Special case handling is required for the Player actor. - // Created is called before Player.PlayerActor is assigned, - // so we must query player traits from self, which refers - // for bot modules always to the Player actor. - playerPower = self.TraitOrDefault(); - playerResources = self.Trait(); - positionsUpdatedModules = self.TraitsImplementing().ToArray(); + playerPower = self.Owner.PlayerActor.TraitOrDefault(); + playerResources = self.Owner.PlayerActor.Trait(); + resourceLayer = self.World.WorldActor.TraitOrDefault(); + pathFinder = self.World.WorldActor.TraitOrDefault(); + positionsUpdatedModules = self.Owner.PlayerActor.TraitsImplementing().ToArray(); } protected override void TraitEnabled(Actor self) { - var tileset = world.Map.Rules.TileSet; - resourceTypeIndices = new BitArray(tileset.TerrainInfo.Length); // Big enough - foreach (var t in world.Map.Rules.Actors["world"].TraitInfos()) - resourceTypeIndices.Set(tileset.GetTerrainIndex(t.TerrainType), true); + // Avoid all AIs reevaluating assignments on the same tick, randomize their initial evaluation delay. + assignRallyPointsTicks = world.LocalRandom.Next(0, Info.AssignRallyPointsInterval); + + var i = 0; foreach (var building in Info.BuildingQueues) - builders.Add(new BaseBuilderQueueManagerCA(this, building, player, playerPower, playerResources, resourceTypeIndices)); + { + builders[i] = new BaseBuilderQueueManagerCA(this, building, player, playerPower, playerResources, resourceLayer); + i++; + } + foreach (var defense in Info.DefenseQueues) - builders.Add(new BaseBuilderQueueManagerCA(this, defense, player, playerPower, playerResources, resourceTypeIndices)); + { + builders[i] = new BaseBuilderQueueManagerCA(this, defense, player, playerPower, playerResources, resourceLayer); + i++; + } } void IBotPositionsUpdated.UpdatedBaseCenter(CPos newLocation) @@ -197,22 +254,77 @@ void IBotPositionsUpdated.UpdatedBaseCenter(CPos newLocation) void IBotPositionsUpdated.UpdatedDefenseCenter(CPos newLocation) { - defenseCenter = newLocation; + DefenseCenter = newLocation; } - bool IBotRequestPauseUnitProduction.PauseUnitProduction - { - get { return !IsTraitDisabled && !HasAdequateRefineryCount; } - } + bool IBotRequestPauseUnitProduction.PauseUnitProduction => !IsTraitDisabled && !HasAdequateRefineryCount(); void IBotTick.BotTick(IBot bot) { - SetRallyPointsForNewProductionBuildings(bot); + if (--assignRallyPointsTicks <= 0) + { + assignRallyPointsTicks = Math.Max(2, Info.AssignRallyPointsInterval); + foreach (var rp in world.ActorsWithTrait().Where(rp => rp.Actor.Owner == player)) + rallyPoints.Push(rp); + } + else + { + // PERF: Spread out rally point assignments updates across multiple ticks. + var updateCount = Exts.IntegerDivisionRoundingAwayFromZero(rallyPoints.Count, assignRallyPointsTicks); + for (var i = 0; i < updateCount; i++) + { + if (rallyPoints.Count == 0) + break; + var rp = rallyPoints.Pop(); + if (rp.Actor.Owner == player && !rp.Actor.Disposed) + SetRallyPoint(bot, rp); + } + } + + BuildingsBeingProduced.Clear(); - foreach (var b in builders) - b.Tick(bot); + // PERF: We tick only one type of valid queue at a time + // if AI gets enough cash, it can fill all of its queues with enough ticks + var findQueue = false; + var queuesByCategory = AIUtils.FindQueuesByCategory(player); + for (int i = 0, builderIndex = currentBuilderIndex; i < builders.Length; i++) + { + if (++builderIndex >= builders.Length) + builderIndex = 0; + + --builders[builderIndex].WaitTicks; + + var queues = queuesByCategory[builders[builderIndex].Category].ToArray(); + if (queues.Length != 0) + { + if (!findQueue) + { + currentBuilderIndex = builderIndex; + findQueue = true; + } + + // Refresh "BuildingsBeingProduced" only when AI can produce + if (playerResources.GetCashAndResources() >= GetMinCashRequirement(builders[builderIndex].Category)) + { + foreach (var queue in queues) + { + var producing = queue.AllQueued().FirstOrDefault(); + if (producing == null) + continue; + + if (BuildingsBeingProduced.TryGetValue(producing.Item, out var number)) + BuildingsBeingProduced[producing.Item] = number + 1; + else + BuildingsBeingProduced.Add(producing.Item, 1); + } + } + } + } + + builders[currentBuilderIndex].Tick(bot, queuesByCategory); } + // CA: Modified to add selling capability to protect buildings void IBotRespondToAttack.RespondToAttack(IBot bot, Actor self, AttackInfo e) { if (e.Attacker == null || e.Attacker.Disposed) @@ -224,116 +336,281 @@ void IBotRespondToAttack.RespondToAttack(IBot bot, Actor self, AttackInfo e) if (!e.Attacker.Info.HasTraitInfo()) return; - // Protect buildings - if (self.Info.HasTraitInfo()) - foreach (var n in positionsUpdatedModules) - n.UpdatedDefenseCenter(e.Attacker.Location); + if (!self.Info.HasTraitInfo()) + return; + + // CA: Sell buildings under heavy attack if conditions are met + if (ShouldSell(self, e)) + { + bot.QueueOrder(new Order("Sell", self, Target.FromActor(self), false) + { + SuppressVisualFeedback = true + }); + AIUtils.BotDebug("AI ({0}): Decided to sell {1}", player.ClientIndex, self); + return; + } + + // Protect buildings not suitable for selling + foreach (var n in positionsUpdatedModules) + n.UpdatedDefenseCenter(e.Attacker.Location); } - void SetRallyPointsForNewProductionBuildings(IBot bot) + void SetRallyPoint(IBot bot, TraitPair rp) { - foreach (var rp in world.ActorsWithTrait()) + var needsRallyPoint = rp.Trait.Path.Count == 0; + + if (!needsRallyPoint) { - if (rp.Actor.Owner != player) - continue; + var locomotors = LocomotorsForProducibles(rp.Actor); + needsRallyPoint = !IsRallyPointValid(rp.Actor.Location, rp.Trait.Path[0], locomotors, rp.Actor.Info.TraitInfoOrDefault()); + } - if (rp.Trait.Path.Count == 0 || !IsRallyPointValid(rp.Trait.Path[0], rp.Actor.Info.TraitInfoOrDefault())) + if (needsRallyPoint) + { + bot.QueueOrder(new Order("SetRallyPoint", rp.Actor, Target.FromCell(world, ChooseRallyLocationNear(rp.Actor)), false) { - bot.QueueOrder(new Order("SetRallyPoint", rp.Actor, Target.FromCell(world, ChooseRallyLocationNear(rp.Actor)), false) - { - SuppressVisualFeedback = true - }); - } + SuppressVisualFeedback = true + }); } } // Won't work for shipyards... CPos ChooseRallyLocationNear(Actor producer) { + var locomotors = LocomotorsForProducibles(producer); var possibleRallyPoints = world.Map.FindTilesInCircle(producer.Location, Info.RallyPointScanRadius) - .Where(c => IsRallyPointValid(c, producer.Info.TraitInfoOrDefault())); + .Where(c => IsRallyPointValid(producer.Location, c, locomotors, producer.Info.TraitInfoOrDefault())) + .ToList(); - if (!possibleRallyPoints.Any()) + if (possibleRallyPoints.Count == 0) { - AIUtils.BotDebug("Bot Bug: No possible rallypoint near {0}", producer.Location); + AIUtils.BotDebug("{0} has no possible rallypoint near {1}", producer.Owner, producer.Location); return producer.Location; } return possibleRallyPoints.Random(world.LocalRandom); } - bool IsRallyPointValid(CPos x, BuildingInfo info) + Locomotor[] LocomotorsForProducibles(Actor producer) { - return info != null && world.IsCellBuildable(x, null, info); + // Per-actor production + var productions = producer.TraitsImplementing(); + + // Player-wide production + if (!productions.Any()) + productions = producer.World.ActorsWithTrait().Where(x => x.Actor.Owner != producer.Owner).Select(x => x.Trait); + + var produces = productions.SelectMany(p => p.Info.Produces).ToHashSet(); + var locomotors = Array.Empty(); + if (produces.Count > 0) + { + // Per-actor production + var productionQueues = producer.TraitsImplementing(); + + // Player-wide production + if (!productionQueues.Any()) + productionQueues = producer.Owner.PlayerActor.TraitsImplementing(); + + productionQueues = productionQueues.Where(pq => produces.Contains(pq.Info.Type)); + + var producibles = productionQueues.SelectMany(pq => pq.BuildableItems()); + var locomotorNames = producibles + .Select(p => p.TraitInfoOrDefault()) + .Where(mi => mi != null) + .Select(mi => mi.Locomotor) + .ToHashSet(); + + if (locomotorNames.Count != 0) + locomotors = world.WorldActor.TraitsImplementing() + .Where(l => locomotorNames.Contains(l.Info.Name)) + .ToArray(); + } + + return locomotors; } + bool IsRallyPointValid(CPos producerLocation, CPos rallyPointLocation, Locomotor[] locomotors, BuildingInfo buildingInfo) + { + return + (pathFinder == null || + locomotors.All(l => pathFinder.PathMightExistForLocomotorBlockedByImmovable(l, producerLocation, rallyPointLocation))) + && + (buildingInfo == null || + world.IsCellBuildable(rallyPointLocation, null, buildingInfo)); + } + + // Require at least one refinery, unless we can't build it. + public bool HasAdequateRefineryCount() => HasMinimumRefineryCount; + + int MinimumRefineryCount() => + AIUtils.CountActorByCommonName(barracksBuildings) > 0 + ? Info.NormalMinimumRefineryCount + : Info.InitialMinimumRefineryCount; + + List IGameSaveTraitData.IssueTraitData(Actor self) + { + if (IsTraitDisabled) + return null; + + return new List() + { + new("InitialBaseCenter", FieldSaver.FormatValue(initialBaseCenter)), + new("DefenseCenter", FieldSaver.FormatValue(DefenseCenter)) + }; + } + + void IGameSaveTraitData.ResolveTraitData(Actor self, MiniYaml data) + { + if (self.World.IsReplay) + return; + + var initialBaseCenterNode = data.NodeWithKeyOrDefault("InitialBaseCenter"); + if (initialBaseCenterNode != null) + initialBaseCenter = FieldLoader.GetValue("InitialBaseCenter", initialBaseCenterNode.Value.Value); + + var defenseCenterNode = data.NodeWithKeyOrDefault("DefenseCenter"); + if (defenseCenterNode != null) + DefenseCenter = FieldLoader.GetValue("DefenseCenter", defenseCenterNode.Value.Value); + } + + void INotifyActorDisposing.Disposing(Actor self) + { + refineryBuildings?.Dispose(); + powerBuildings?.Dispose(); + constructionYardBuildings?.Dispose(); + barracksBuildings?.Dispose(); + vehicleFactoryBuildings?.Dispose(); + } + + // ============================================= + // === CA-SPECIFIC METHODS === + // ============================================= + + // CA: Building selling decision logic - not in engine version + bool ShouldSell(Actor self, AttackInfo e) + { + if (!self.Info.HasTraitInfo()) + return false; + + if (Info.DefenseTypes.Contains(self.Info.Name)) + return false; + + if (e.DamageState == DamageState.Dead || e.DamageState < DamageState.Medium || e.DamageState == e.PreviousDamageState) + return false; + + var inMainBase = (self.CenterPosition - self.World.Map.CenterOfCell(initialBaseCenter)).Length < WDist.FromCells(28).Length; + var chanceThreshold = inMainBase ? 95 : 70; + + if (self.World.LocalRandom.Next(100) < chanceThreshold) + return false; + + if (Info.ConstructionYardTypes.Contains(self.Info.Name) && AIUtils.CountActorByCommonName(constructionYardBuildings) <= 1) + return false; + + if (Info.BarracksTypes.Contains(self.Info.Name) && AIUtils.CountActorByCommonName(barracksBuildings) <= 1) + return false; + + if (Info.VehiclesFactoryTypes.Contains(self.Info.Name) && AIUtils.CountActorByCommonName(vehicleFactoryBuildings) <= 1) + return false; + + var enemyUnits = self.World.FindActorsInCircle(self.CenterPosition, WDist.FromCells(Info.SellScanRadius)).Where(IsEnemyGroundUnit).ToList(); + + if (enemyUnits.Count > 5) + { + var allyUnits = self.World.FindActorsInCircle(self.CenterPosition, WDist.FromCells(Info.SellScanRadius)).Where(IsAllyGroundUnit).ToList(); + + if (enemyUnits.Count >= allyUnits.Count * 2) + return true; + } + + return false; + } + + // CA: Different minimum cash requirements for different building types - not in engine version + int GetMinCashRequirement(string category) + { + return Info.DefenseQueues.Contains(category) ? Info.DefenseProductionMinCashRequirement : Info.BuildingProductionMinCashRequirement; + } + + // CA: Enhanced refinery count with max refineries logic - modified from engine version public bool HasMaxRefineries { get { - return AIUtils.CountBuildingByCommonName(Info.RefineryTypes, player) >= Info.MaxRefineries; + var currentRefineryCount = AIUtils.CountActorByCommonName(refineryBuildings); + + foreach (var r in Info.RefineryTypes) + { + if (BuildingsBeingProduced != null && BuildingsBeingProduced.ContainsKey(r)) + currentRefineryCount += BuildingsBeingProduced[r]; + } + + var currentConstructionYardCount = AIUtils.CountActorByCommonName(constructionYardBuildings); + return currentRefineryCount >= currentConstructionYardCount * 2 + Info.MaxExtraRefineries; } } - public bool HasAdequateRefineryCount + // CA: Unit detection for selling logic - not in engine version + public bool IsEnemyGroundUnit(Actor a) + { + if (a == null || a.IsDead || player.RelationshipWith(a.Owner) != PlayerRelationship.Enemy || + a.Info.HasTraitInfo() || a.Info.HasTraitInfo() || + a.Info.HasTraitInfo()) + return false; + + var targetTypes = a.GetEnabledTargetTypes(); + return !targetTypes.IsEmpty && !targetTypes.Overlaps(Info.IgnoredUnitTargetTypes); + } + + // CA: Ally unit detection for selling logic - not in engine version + public bool IsAllyGroundUnit(Actor a) + { + if (a == null || a.IsDead || player.RelationshipWith(a.Owner) != PlayerRelationship.Ally || + a.Info.HasTraitInfo() || a.Info.HasTraitInfo() || + a.Info.HasTraitInfo()) + return false; + + var targetTypes = a.GetEnabledTargetTypes(); + return !targetTypes.IsEmpty && !targetTypes.Overlaps(Info.IgnoredUnitTargetTypes); + } + + public bool HasMinimumRefineryCount { get { + var desiredAmount = HasAdequateBarracksCount && HasAdequateFactoryCount ? Info.NormalMinimumRefineryCount : Info.InitialMinimumRefineryCount; + // Require at least one refinery, unless we can't build it. - return AIUtils.CountBuildingByCommonName(Info.RefineryTypes, player) >= 1 || + return AIUtils.CountBuildingByCommonName(Info.RefineryTypes, player) >= desiredAmount || AIUtils.CountBuildingByCommonName(Info.PowerTypes, player) == 0 || AIUtils.CountBuildingByCommonName(Info.ConstructionYardTypes, player) == 0; } } + // CA: Barracks requirement logic - not in engine version public bool HasAdequateBarracksCount { get { // Require at least one barracks, unless we can't build it. - return AIUtils.CountBuildingByCommonName(Info.BarracksTypes, player) >= 1 || - AIUtils.CountBuildingByCommonName(Info.PowerTypes, player) == 0 || - AIUtils.CountBuildingByCommonName(Info.RefineryTypes, player) == 0 || - AIUtils.CountBuildingByCommonName(Info.ConstructionYardTypes, player) == 0; + return AIUtils.CountActorByCommonName(barracksBuildings) >= 1 || + AIUtils.CountActorByCommonName(powerBuildings) == 0 || + AIUtils.CountActorByCommonName(refineryBuildings) == 0 || + AIUtils.CountActorByCommonName(constructionYardBuildings) == 0; } } + // CA: Factory requirement logic - not in engine version public bool HasAdequateFactoryCount { get { // Require at least one factory, unless we can't build it. - return AIUtils.CountBuildingByCommonName(Info.VehiclesFactoryTypes, player) >= 1 || - AIUtils.CountBuildingByCommonName(Info.PowerTypes, player) == 0 || - AIUtils.CountBuildingByCommonName(Info.RefineryTypes, player) == 0 || - AIUtils.CountBuildingByCommonName(Info.ConstructionYardTypes, player) == 0; + return AIUtils.CountActorByCommonName(vehicleFactoryBuildings) >= 1 || + AIUtils.CountActorByCommonName(powerBuildings) == 0 || + AIUtils.CountActorByCommonName(refineryBuildings) == 0 || + AIUtils.CountActorByCommonName(constructionYardBuildings) == 0; } } - - List IGameSaveTraitData.IssueTraitData(Actor self) - { - if (IsTraitDisabled) - return null; - - return new List() - { - new MiniYamlNode("InitialBaseCenter", FieldSaver.FormatValue(initialBaseCenter)), - new MiniYamlNode("DefenseCenter", FieldSaver.FormatValue(defenseCenter)) - }; - } - - void IGameSaveTraitData.ResolveTraitData(Actor self, List data) - { - if (self.World.IsReplay) - return; - - var initialBaseCenterNode = data.FirstOrDefault(n => n.Key == "InitialBaseCenter"); - if (initialBaseCenterNode != null) - initialBaseCenter = FieldLoader.GetValue("InitialBaseCenter", initialBaseCenterNode.Value.Value); - - var defenseCenterNode = data.FirstOrDefault(n => n.Key == "DefenseCenter"); - if (defenseCenterNode != null) - defenseCenter = FieldLoader.GetValue("DefenseCenter", defenseCenterNode.Value.Value); - } } } diff --git a/OpenRA.Mods.CA/Traits/BotModules/BotModuleLogic/BaseBuilderQueueManagerCA.cs b/OpenRA.Mods.CA/Traits/BotModules/BotModuleLogic/BaseBuilderQueueManagerCA.cs index 4ebe09aa78..b686ff624f 100644 --- a/OpenRA.Mods.CA/Traits/BotModules/BotModuleLogic/BaseBuilderQueueManagerCA.cs +++ b/OpenRA.Mods.CA/Traits/BotModules/BotModuleLogic/BaseBuilderQueueManagerCA.cs @@ -1,16 +1,14 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion using System; -using System.Collections; using System.Collections.Generic; using System.Linq; using OpenRA.Mods.Common; @@ -21,15 +19,16 @@ namespace OpenRA.Mods.CA.Traits { class BaseBuilderQueueManagerCA { - readonly string category; + public readonly string Category; + public int WaitTicks; readonly BaseBuilderBotModuleCA baseBuilder; readonly World world; readonly Player player; readonly PowerManager playerPower; readonly PlayerResources playerResources; + readonly IResourceLayer resourceLayer; - int waitTicks; Actor[] playerBuildings; int failCount; int failRetryTicks; @@ -37,26 +36,45 @@ class BaseBuilderQueueManagerCA int cachedBases; int cachedBuildings; int minimumExcessPower; - BitArray resourceTypeIndices; + int minCashRequirement; // CA: Different cash requirements per category + + bool itemQueuedThisTick = false; WaterCheck waterState = WaterCheck.NotChecked; + readonly Dictionary activeBuildingIntervals = new Dictionary(); // CA: Building intervals system public BaseBuilderQueueManagerCA(BaseBuilderBotModuleCA baseBuilder, string category, Player p, PowerManager pm, - PlayerResources pr, BitArray resourceTypeIndices) + PlayerResources pr, IResourceLayer rl) { this.baseBuilder = baseBuilder; world = p.World; player = p; playerPower = pm; playerResources = pr; - this.category = category; + resourceLayer = rl; + Category = category; failRetryTicks = baseBuilder.Info.StructureProductionResumeDelay; minimumExcessPower = baseBuilder.Info.MinimumExcessPower; - this.resourceTypeIndices = resourceTypeIndices; + + // CA: Different minimum cash requirements based on category + minCashRequirement = baseBuilder.Info.DefenseQueues.Contains(Category) + ? baseBuilder.Info.DefenseProductionMinCashRequirement + : baseBuilder.Info.BuildingProductionMinCashRequirement; + + if (baseBuilder.Info.NavalProductionTypes.Count == 0) + waterState = WaterCheck.DontCheck; } - public void Tick(IBot bot) + public void Tick(IBot bot, ILookup queuesByCategory) { + // CA: Update building intervals countdown + foreach (KeyValuePair i in activeBuildingIntervals.ToList()) + { + activeBuildingIntervals[i.Key]--; + if (activeBuildingIntervals[i.Key] <= 0) + activeBuildingIntervals.Remove(i.Key); + } + // If failed to place something N consecutive times, wait M ticks until resuming building production if (failCount >= baseBuilder.Info.MaximumFailedPlacementAttempts && --failRetryTicks <= 0) { @@ -95,24 +113,31 @@ public void Tick(IBot bot) } // Only update once per second or so - if (--waitTicks > 0) + if (WaitTicks > 0) return; playerBuildings = world.ActorsHavingTrait().Where(a => a.Owner == player).ToArray(); - var excessPowerBonus = baseBuilder.Info.ExcessPowerIncrement * (playerBuildings.Count() / baseBuilder.Info.ExcessPowerIncreaseThreshold.Clamp(1, int.MaxValue)); - minimumExcessPower = (baseBuilder.Info.MinimumExcessPower + excessPowerBonus).Clamp(baseBuilder.Info.MinimumExcessPower, baseBuilder.Info.MaximumExcessPower); - + var excessPowerBonus = + baseBuilder.Info.ExcessPowerIncrement * + (playerBuildings.Length / baseBuilder.Info.ExcessPowerIncreaseThreshold.Clamp(1, int.MaxValue)); + minimumExcessPower = + (baseBuilder.Info.MinimumExcessPower + excessPowerBonus) + .Clamp(baseBuilder.Info.MinimumExcessPower, baseBuilder.Info.MaximumExcessPower); + + // PERF: Queue only one actor at a time per category + itemQueuedThisTick = false; var active = false; - foreach (var queue in AIUtils.FindQueues(player, category)) + foreach (var queue in queuesByCategory[Category]) + { if (TickQueue(bot, queue)) active = true; + } // Add a random factor so not every AI produces at the same tick early in the game. // Minimum should not be negative as delays in HackyAI could be zero. var randomFactor = world.LocalRandom.Next(0, baseBuilder.Info.StructureProductionRandomBonusDelay); - // Needs to be at least 4 * OrderLatency because otherwise the AI frequently duplicates build orders (i.e. makes the same build decision twice) - waitTicks = active ? 4 * world.LobbyInfo.GlobalSettings.OrderLatency + baseBuilder.Info.StructureProductionActiveDelay + randomFactor + WaitTicks = active ? baseBuilder.Info.StructureProductionActiveDelay + randomFactor : baseBuilder.Info.StructureProductionInactiveDelay + randomFactor; } @@ -127,7 +152,15 @@ bool TickQueue(IBot bot, ProductionQueue queue) if (item == null) return false; + // CA: Modified cash requirement check - excludes refineries from low cash restrictions + if ((playerResources.GetCashAndResources() < minCashRequirement && !baseBuilder.Info.RefineryTypes.Contains(item.Name)) || itemQueuedThisTick) + return false; + bot.QueueOrder(Order.StartProduction(queue.Actor, item.Name, 1)); + itemQueuedThisTick = true; + + // CA: Set building interval for this building type + SetBuildingInterval(item.Name); } else if (currentBuilding != null && currentBuilding.Done) { @@ -141,15 +174,26 @@ bool TickQueue(IBot bot, ProductionQueue queue) CPos? location = null; string orderString = "PlaceBuilding"; + // Check if we've hit the limit for this building already, if so cancel it + if (baseBuilder.Info.BuildingLimits.ContainsKey(currentBuilding.Item)) + { + if ((AIUtils.CountBuildingByCommonName(new HashSet { currentBuilding.Item }, player) >= baseBuilder.Info.BuildingLimits[currentBuilding.Item]) + || (baseBuilder.Info.RefineryTypes.Contains(currentBuilding.Item) && baseBuilder.HasMaxRefineries)) + { + AIUtils.BotDebug($"{player} has already has enough {currentBuilding.Item}; cancelling production"); + bot.QueueOrder(Order.CancelProduction(queue.Actor, currentBuilding.Item, 1)); + } + } + // Check if Building is a plug for other Building var actorInfo = world.Map.Rules.Actors[currentBuilding.Item]; var plugInfo = actorInfo.TraitInfoOrDefault(); if (plugInfo != null) { var possibleBuilding = world.ActorsWithTrait().FirstOrDefault(a => - a.Actor.Owner == player && a.Trait.AcceptsPlug(a.Actor, plugInfo.Type)); + a.Actor.Owner == player && a.Trait.AcceptsPlug(plugInfo.Type)); - if (possibleBuilding != null) + if (possibleBuilding.Actor != null) { orderString = "PlacePlug"; location = possibleBuilding.Actor.Location + possibleBuilding.Trait.Info.Offset; @@ -176,7 +220,7 @@ bool TickQueue(IBot bot, ProductionQueue queue) if (location == null) { - AIUtils.BotDebug("AI: {0} has nowhere to place {1}".F(player, currentBuilding.Item)); + AIUtils.BotDebug($"{player} has nowhere to place {currentBuilding.Item}"); bot.QueueOrder(Order.CancelProduction(queue.Actor, currentBuilding.Item, 1)); failCount += failCount; @@ -190,6 +234,7 @@ bool TickQueue(IBot bot, ProductionQueue queue) else { failCount = 0; + bot.QueueOrder(new Order(orderString, player.PlayerActor, Target.FromCell(world, location.Value), false) { // Building to place @@ -199,8 +244,6 @@ bool TickQueue(IBot bot, ProductionQueue queue) ExtraData = queue.Actor.ActorID, SuppressVisualFeedback = true }); - - return true; } } @@ -218,7 +261,8 @@ ActorInfo GetProducibleBuilding(HashSet actors, IEnumerable b if (!baseBuilder.Info.BuildingLimits.ContainsKey(actor.Name)) return true; - return playerBuildings.Count(a => a.Info.Name == actor.Name) < baseBuilder.Info.BuildingLimits[actor.Name]; + var count = playerBuildings.Count(a => a.Info.Name == actor.Name) + (baseBuilder.BuildingsBeingProduced != null ? (baseBuilder.BuildingsBeingProduced.ContainsKey(actor.Name) ? baseBuilder.BuildingsBeingProduced[actor.Name] : 0) : 0); + return count < baseBuilder.Info.BuildingLimits[actor.Name]; }); if (orderBy != null) @@ -246,18 +290,18 @@ ActorInfo ChooseBuildingToBuild(ProductionQueue queue) { if (power != null && power.TraitInfos().Where(i => i.EnabledByDefault).Sum(p => p.Amount) > 0) { - AIUtils.BotDebug("AI: {0} decided to build {1}: Priority override (low power)", queue.Actor.Owner, power.Name); + AIUtils.BotDebug("{0} decided to build {1}: Priority override (low power)", queue.Actor.Owner, power.Name); return power; } } // Next is to build up a strong economy - if (!baseBuilder.HasAdequateRefineryCount) + if (!baseBuilder.HasAdequateRefineryCount()) { var refinery = GetProducibleBuilding(baseBuilder.Info.RefineryTypes, buildableThings); if (refinery != null && HasSufficientPowerForActor(refinery)) { - AIUtils.BotDebug("AI: {0} decided to build {1}: Priority override (refinery)", queue.Actor.Owner, refinery.Name); + AIUtils.BotDebug("{0} decided to build {1}: Priority override (refinery)", queue.Actor.Owner, refinery.Name); return refinery; } @@ -268,7 +312,7 @@ ActorInfo ChooseBuildingToBuild(ProductionQueue queue) } } - // Should always have a barracks + // CA: Should always have a barracks - not in engine version if (!baseBuilder.HasAdequateBarracksCount) { var barracks = GetProducibleBuilding(baseBuilder.Info.BarracksTypes, buildableThings); @@ -285,7 +329,7 @@ ActorInfo ChooseBuildingToBuild(ProductionQueue queue) } } - // Should always have a vehicles factory + // CA: Should always have a vehicles factory - not in engine version if (!baseBuilder.HasAdequateFactoryCount) { var factory = GetProducibleBuilding(baseBuilder.Info.VehiclesFactoryTypes, buildableThings); @@ -308,7 +352,7 @@ ActorInfo ChooseBuildingToBuild(ProductionQueue queue) var production = GetProducibleBuilding(baseBuilder.Info.ProductionTypes, buildableThings); if (production != null && HasSufficientPowerForActor(production)) { - AIUtils.BotDebug("AI: {0} decided to build {1}: Priority override (production)", queue.Actor.Owner, production.Name); + AIUtils.BotDebug("{0} decided to build {1}: Priority override (production)", queue.Actor.Owner, production.Name); return production; } @@ -327,7 +371,7 @@ ActorInfo ChooseBuildingToBuild(ProductionQueue queue) var navalproduction = GetProducibleBuilding(baseBuilder.Info.NavalProductionTypes, buildableThings); if (navalproduction != null && HasSufficientPowerForActor(navalproduction)) { - AIUtils.BotDebug("AI: {0} decided to build {1}: Priority override (navalproduction)", queue.Actor.Owner, navalproduction.Name); + AIUtils.BotDebug("{0} decided to build {1}: Priority override (navalproduction)", queue.Actor.Owner, navalproduction.Name); return navalproduction; } @@ -344,7 +388,7 @@ ActorInfo ChooseBuildingToBuild(ProductionQueue queue) var silo = GetProducibleBuilding(baseBuilder.Info.SiloTypes, buildableThings); if (silo != null && HasSufficientPowerForActor(silo)) { - AIUtils.BotDebug("AI: {0} decided to build {1}: Priority override (silo)", queue.Actor.Owner, silo.Name); + AIUtils.BotDebug("{0} decided to build {1}: Priority override (silo)", queue.Actor.Owner, silo.Name); return silo; } @@ -366,18 +410,34 @@ ActorInfo ChooseBuildingToBuild(ProductionQueue queue) baseBuilder.Info.BuildingDelays[name] > world.WorldTick) continue; + // CA: Does this building have an interval which hasn't elapsed yet? + if (baseBuilder.Info.BuildingIntervals != null && + baseBuilder.Info.BuildingIntervals.ContainsKey(name) && + activeBuildingIntervals.ContainsKey(name)) + continue; + // Can we build this structure? if (!buildableThings.Any(b => b.Name == name)) continue; + // Check the number of this structure and its variants + var actorInfo = world.Map.Rules.Actors[name]; + var buildingVariantInfo = actorInfo.TraitInfoOrDefault(); + var variants = buildingVariantInfo?.Actors ?? Array.Empty(); + + var count = playerBuildings.Count(a => a.Info.Name == name || variants.Contains(a.Info.Name)) + (baseBuilder.BuildingsBeingProduced != null ? (baseBuilder.BuildingsBeingProduced.ContainsKey(name) ? baseBuilder.BuildingsBeingProduced[name] : 0) : 0); + // Do we want to build this structure? - var count = playerBuildings.Count(a => a.Info.Name == name); if (count * 100 > frac.Value * playerBuildings.Length) continue; - if (baseBuilder.Info.BuildingLimits.ContainsKey(name) && baseBuilder.Info.BuildingLimits[name] <= count) + if (baseBuilder.Info.BuildingLimits.ContainsKey(name) && count >= baseBuilder.Info.BuildingLimits[name]) + { + AIUtils.BotDebug("{0} decided to build {1} but limit of {2} already reached)", queue.Actor.Owner, name, baseBuilder.Info.BuildingLimits[name]); continue; + } + // CA: Check max refineries limit if (baseBuilder.Info.RefineryTypes.Contains(name) && baseBuilder.HasMaxRefineries) continue; @@ -464,15 +524,18 @@ ActorInfo ChooseBuildingToBuild(ProductionQueue queue) case BuildingType.Refinery: // Try and place the refinery near a resource field - var nearbyResources = world.Map.FindTilesInAnnulus(baseCenter, baseBuilder.Info.MinBaseRadius, baseBuilder.Info.MaxBaseRadius) - .Where(a => resourceTypeIndices.Get(world.Map.GetTerrainIndex(a))) - .Shuffle(world.LocalRandom).Take(baseBuilder.Info.MaxResourceCellsToCheck); - - foreach (var r in nearbyResources) + if (resourceLayer != null) { - var found = findPos(baseCenter, r, baseBuilder.Info.MinBaseRadius, baseBuilder.Info.MaxBaseRadius); - if (found != null) - return found; + var nearbyResources = world.Map.FindTilesInAnnulus(baseCenter, baseBuilder.Info.MinBaseRadius, baseBuilder.Info.MaxBaseRadius) + .Where(a => resourceLayer.GetResource(a).Type != null) + .Shuffle(world.LocalRandom).Take(baseBuilder.Info.MaxResourceCellsToCheck); + + foreach (var r in nearbyResources) + { + var found = findPos(baseCenter, r, baseBuilder.Info.MinBaseRadius, baseBuilder.Info.MaxBaseRadius); + if (found != null) + return found; + } } // Try and find a free spot somewhere else in the base @@ -486,5 +549,17 @@ ActorInfo ChooseBuildingToBuild(ProductionQueue queue) // Can't find a build location return null; } + + // ============================================= + // === CA-SPECIFIC METHODS === + // ============================================= + + void SetBuildingInterval(string name) + { + if (baseBuilder.Info.BuildingIntervals == null || !baseBuilder.Info.BuildingIntervals.ContainsKey(name)) + return; + + activeBuildingIntervals[name] = baseBuilder.Info.BuildingIntervals[name]; + } } } diff --git a/OpenRA.Mods.CA/Traits/BotModules/BuildingRepairBotModuleCA.cs b/OpenRA.Mods.CA/Traits/BotModules/BuildingRepairBotModuleCA.cs new file mode 100644 index 0000000000..38da583505 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/BotModules/BuildingRepairBotModuleCA.cs @@ -0,0 +1,54 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Manages AI repairing base buildings.")] + public class BuildingRepairBotModuleCAInfo : ConditionalTraitInfo + { + public override object Create(ActorInitializer init) { return new BuildingRepairBotModuleCA(init.Self, this); } + } + + public class BuildingRepairBotModuleCA : ConditionalTrait, IBotRespondToAttack + { + RepairableBuilding rb; + + public BuildingRepairBotModuleCA(Actor self, BuildingRepairBotModuleCAInfo info) + : base(info) { } + + protected override void Created(Actor self) + { + base.Created(self); + rb = self.TraitOrDefault(); + } + + void IBotRespondToAttack.RespondToAttack(IBot bot, Actor self, AttackInfo e) + { + // HACK: We don't want D2k bots to repair all their buildings on placement + // where half their HP is removed via neutral terrain damage. + // TODO: Implement concrete placement for D2k bots and remove this hack on players relationship check. + if (self.IsDead || self.Owner.RelationshipWith(e.Attacker.Owner) == PlayerRelationship.Neutral) + return; + + if (rb != null) + { + if (e.DamageState > DamageState.Undamaged && e.PreviousDamageState < e.DamageState && !rb.RepairActive) + { + AIUtils.BotDebug("{0} noticed damage {1} {2}->{3}, repairing.", + self.Owner, self, e.PreviousDamageState, e.DamageState); + bot.QueueOrder(new Order("RepairBuilding", self.Owner.PlayerActor, Target.FromActor(self), false)); + } + } + } + } +} diff --git a/OpenRA.Mods.CA/Traits/BotModules/CaptureManagerBotModuleCA.cs b/OpenRA.Mods.CA/Traits/BotModules/CaptureManagerBotModuleCA.cs deleted file mode 100644 index 3c0fa63f77..0000000000 --- a/OpenRA.Mods.CA/Traits/BotModules/CaptureManagerBotModuleCA.cs +++ /dev/null @@ -1,194 +0,0 @@ -#region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. - */ -#endregion - -using System; -using System.Collections.Generic; -using System.Linq; -using OpenRA.Mods.Common.Pathfinder; -using OpenRA.Mods.Common.Traits; -using OpenRA.Traits; - -namespace OpenRA.Mods.CA.Traits -{ - [Desc("Manages AI capturing logic.")] - public class CaptureManagerBotModuleCAInfo : ConditionalTraitInfo - { - [Desc("Actor types that can capture other actors (via `Captures`).", - "Leave this empty to disable capturing.")] - public readonly HashSet CapturingActorTypes = new HashSet(); - - [Desc("Actor types that can be targeted for capturing.", - "Leave this empty to include all actors.")] - public readonly HashSet CapturableActorTypes = new HashSet(); - - [Desc("Avoid enemy actors nearby when searching for capture opportunities. Should be somewhere near the max weapon range.")] - public readonly WDist EnemyAvoidanceRadius = WDist.FromCells(8); - - [Desc("Minimum delay (in ticks) between trying to capture with CapturingActorTypes.")] - public readonly int MinimumCaptureDelay = 375; - - [Desc("Maximum number of options to consider for capturing.", - "If a value less than 1 is given 1 will be used instead.")] - public readonly int MaximumCaptureTargetOptions = 10; - - [Desc("Should visibility (Shroud, Fog, Cloak, etc) be considered when searching for capturable targets?")] - public readonly bool CheckCaptureTargetsForVisibility = true; - - [Desc("Player stances that capturers should attempt to target.")] - public readonly PlayerRelationship CapturableStances = PlayerRelationship.Enemy | PlayerRelationship.Neutral; - - public override object Create(ActorInitializer init) { return new CaptureManagerBotModuleCA(init.Self, this); } - } - - public class CaptureManagerBotModuleCA : ConditionalTrait, IBotTick - { - readonly World world; - readonly Player player; - readonly Predicate unitCannotBeOrderedOrIsIdle; - readonly int maximumCaptureTargetOptions; - - // Units that the bot already knows about and has given a capture order. Any unit not on this list needs to be given a new order. - readonly List activeCapturers = new List(); - - int minCaptureDelayTicks; - IPathFinder pathfinder; - DomainIndex domainIndex; - - public CaptureManagerBotModuleCA(Actor self, CaptureManagerBotModuleCAInfo info) - : base(info) - { - world = self.World; - player = self.Owner; - - if (world.Type == WorldType.Editor) - return; - - unitCannotBeOrderedOrIsIdle = a => a.Owner != player || a.IsDead || !a.IsInWorld || a.IsIdle; - - maximumCaptureTargetOptions = Math.Max(1, Info.MaximumCaptureTargetOptions); - } - - protected override void TraitEnabled(Actor self) - { - // Avoid all AIs reevaluating assignments on the same tick, randomize their initial evaluation delay. - minCaptureDelayTicks = world.LocalRandom.Next(0, Info.MinimumCaptureDelay); - - pathfinder = world.WorldActor.Trait(); - domainIndex = world.WorldActor.Trait(); - } - - void IBotTick.BotTick(IBot bot) - { - if (--minCaptureDelayTicks <= 0) - { - minCaptureDelayTicks = Info.MinimumCaptureDelay; - QueueCaptureOrders(bot); - } - } - - IEnumerable GetVisibleActorsBelongingToPlayer(Player owner) - { - foreach (var actor in GetActorsThatCanBeOrderedByPlayer(owner)) - if (actor.CanBeViewedByPlayer(player)) - yield return actor; - } - - IEnumerable GetActorsThatCanBeOrderedByPlayer(Player owner) - { - foreach (var actor in world.Actors) - if (actor.Owner == owner && !actor.IsDead && actor.IsInWorld) - yield return actor; - } - - void QueueCaptureOrders(IBot bot) - { - if (!Info.CapturingActorTypes.Any() || player.WinState != WinState.Undefined) - return; - - activeCapturers.RemoveAll(unitCannotBeOrderedOrIsIdle); - - var newUnits = world.ActorsHavingTrait() - .Where(a => a.Owner == player && !activeCapturers.Contains(a)); - - var capturers = newUnits - .Where(a => a.IsIdle && Info.CapturingActorTypes.Contains(a.Info.Name) && a.Info.HasTraitInfo()) - .Select(a => new TraitPair(a, a.TraitOrDefault())) - .Where(tp => tp.Trait != null) - .ToArray(); - - if (capturers.Length == 0) - return; - - var randomPlayer = world.Players.Where(p => !p.Spectating - && Info.CapturableStances.HasStance(player.RelationshipWith(p))).Random(world.LocalRandom); - - var targetOptions = Info.CheckCaptureTargetsForVisibility - ? GetVisibleActorsBelongingToPlayer(randomPlayer) - : GetActorsThatCanBeOrderedByPlayer(randomPlayer); - - var capturableTargetOptions = targetOptions - .Where(target => - { - var captureManager = target.TraitOrDefault(); - if (captureManager == null) - return false; - - return capturers.Any(tp => captureManager.CanBeTargetedBy(target, tp.Actor, tp.Trait)); - }) - .OrderByDescending(target => target.GetSellValue()) - .Take(maximumCaptureTargetOptions); - - if (Info.CapturableActorTypes.Any()) - capturableTargetOptions = capturableTargetOptions.Where(target => Info.CapturableActorTypes.Contains(target.Info.Name.ToLowerInvariant())); - - if (!capturableTargetOptions.Any()) - return; - - foreach (var capturer in capturers) - { - var nearestTargetActors = capturableTargetOptions.OrderBy(target => (target.CenterPosition - capturer.Actor.CenterPosition).LengthSquared); - foreach (var nearestTargetActor in nearestTargetActors) - { - if (activeCapturers.Contains(capturer.Actor)) - continue; - - var safeTarget = SafePath(capturer.Actor, nearestTargetActor); - if (safeTarget.Type == TargetType.Invalid) - continue; - - bot.QueueOrder(new Order("CaptureActor", capturer.Actor, safeTarget, true)); - AIUtils.BotDebug("AI ({0}): Ordered {1} to capture {2}", player.ClientIndex, capturer.Actor, nearestTargetActor); - activeCapturers.Add(capturer.Actor); - } - } - } - - Target SafePath(Actor capturer, Actor target) - { - var locomotor = capturer.Trait().Locomotor; - - if (!domainIndex.IsPassable(capturer.Location, target.Location, locomotor)) - return Target.Invalid; - - var path = pathfinder.FindPath( - PathSearch.FromPoint(world, locomotor, capturer, capturer.Location, target.Location, BlockedByActor.None) - .WithCustomCost(loc => world.FindActorsInCircle(world.Map.CenterOfCell(loc), Info.EnemyAvoidanceRadius) - .Where(u => !u.IsDead && capturer.Owner.RelationshipWith(u.Owner) == PlayerRelationship.Enemy && capturer.IsTargetableBy(u)) - .Sum(u => Math.Max(WDist.Zero.Length, Info.EnemyAvoidanceRadius.Length - (world.Map.CenterOfCell(loc) - u.CenterPosition).Length))) - .FromPoint(capturer.Location)); - - if (path.Count == 0) - return Target.Invalid; - - return Target.FromActor(target); - } - } -} diff --git a/OpenRA.Mods.CA/Traits/BotModules/HarvesterBotModuleCA.cs b/OpenRA.Mods.CA/Traits/BotModules/HarvesterBotModuleCA.cs index add25ff926..89f79b5a74 100644 --- a/OpenRA.Mods.CA/Traits/BotModules/HarvesterBotModuleCA.cs +++ b/OpenRA.Mods.CA/Traits/BotModules/HarvesterBotModuleCA.cs @@ -1,31 +1,31 @@ #region Copyright & License Information -/* - * Copyright 2007-2019 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion using System; using System.Collections.Generic; using System.Linq; +using OpenRA.Graphics; using OpenRA.Mods.Common; using OpenRA.Mods.Common.Activities; -using OpenRA.Mods.Common.Pathfinder; using OpenRA.Mods.Common.Traits; using OpenRA.Traits; namespace OpenRA.Mods.CA.Traits { + [TraitLocation(SystemActors.Player)] [Desc("Put this on the Player actor. Manages bot harvesters to ensure they always continue harvesting as long as there are resources on the map.")] - public class HarvesterBotModuleCAInfo : ConditionalTraitInfo + public class HarvesterBotModuleCAInfo : ConditionalTraitInfo, NotBefore { [Desc("Actor types that are considered harvesters. If harvester count drops below RefineryTypes count, a new harvester is built.", "Leave empty to disable harvester replacement. Currently only needed by harvester replacement system.")] - public readonly HashSet HarvesterTypes = new HashSet(); + public readonly HashSet HarvesterTypes = new(); [Desc("Number of harvesters per refinery to maintain.")] public readonly int HarvestersPerRefinery = 2; @@ -34,45 +34,57 @@ public class HarvesterBotModuleCAInfo : ConditionalTraitInfo public readonly int MaxHarvesters = 8; [Desc("Actor types that are counted as refineries. Currently only needed by harvester replacement system.")] - public readonly HashSet RefineryTypes = new HashSet(); + public readonly HashSet RefineryTypes = new(); [Desc("Interval (in ticks) between giving out orders to idle harvesters.")] - public readonly int ScanForIdleHarvestersInterval = 75; + public readonly int ScanForIdleHarvestersInterval = 50; + + [Desc("When an idle harvester cannot find resources, increase the wait to this many scan intervals.")] + public readonly int ScanIntervalMultiplerWhenNoResources = 5; [Desc("Interval (in ticks) between checking whether to produce new harvesters.")] public readonly int ProduceHarvestersInterval = 375; [Desc("Avoid enemy actors nearby when searching for a new resource patch. Should be somewhere near the max weapon range.")] - public readonly WDist HarvesterEnemyAvoidanceRadius = WDist.FromCells(8); + public readonly WDist HarvesterEnemyAvoidanceRadius = WDist.FromCells(10); + + [Desc("For each enemy within the threat radius, apply the following cost multiplier for every cell that needs to be moved through.")] + public readonly int HarvesterEnemyAvoidanceCostMultipler = 20; public override object Create(ActorInitializer init) { return new HarvesterBotModuleCA(init.Self, this); } } - public class HarvesterBotModuleCA : ConditionalTrait, IBotTick + public class HarvesterBotModuleCA : ConditionalTrait, IBotTick, INotifyActorDisposing, IWorldLoaded { - class HarvesterTraitWrapper + sealed class HarvesterTraitWrapper { public readonly Actor Actor; public readonly Harvester Harvester; - public readonly Locomotor Locomotor; + public readonly DockClientManager DockClientManager; + public readonly Parachutable Parachutable; + public readonly Mobile Mobile; + public int NoResourcesCooldown { get; set; } public HarvesterTraitWrapper(Actor actor) { Actor = actor; Harvester = actor.Trait(); - var mobile = actor.Trait(); - Locomotor = mobile.Locomotor; + DockClientManager = actor.Trait(); + Parachutable = actor.TraitOrDefault(); + Mobile = actor.TraitOrDefault(); } } readonly World world; readonly Player player; readonly Func unitCannotBeOrdered; - readonly Dictionary harvesters = new Dictionary(); + readonly Dictionary harvesters = new(); + readonly Stack harvestersNeedingOrders = new(); + readonly ActorIndex.OwnerAndNamesAndTrait refineries; + readonly ActorIndex.OwnerAndNamesAndTrait harvestersIndex; + readonly Dictionary resourceTypesByCell = new(); - IPathFinder pathfinder; - DomainIndex domainIndex; - ResourceLayer resLayer; + IResourceLayer resourceLayer; ResourceClaimLayer claimLayer; IBotRequestUnitProduction[] requestUnitProduction; int scanForIdleHarvestersTicks; @@ -84,113 +96,208 @@ public HarvesterBotModuleCA(Actor self, HarvesterBotModuleCAInfo info) world = self.World; player = self.Owner; unitCannotBeOrdered = a => a.Owner != self.Owner || a.IsDead || !a.IsInWorld; + refineries = new ActorIndex.OwnerAndNamesAndTrait(world, info.RefineryTypes, player); + harvestersIndex = new ActorIndex.OwnerAndNamesAndTrait(world, info.HarvesterTypes, player); } protected override void Created(Actor self) { - // Special case handling is required for the Player actor. - // Created is called before Player.PlayerActor is assigned, - // so we must query player traits from self, which refers - // for bot modules always to the Player actor. - requestUnitProduction = self.TraitsImplementing().ToArray(); + requestUnitProduction = self.Owner.PlayerActor.TraitsImplementing().ToArray(); + resourceLayer = world.WorldActor.TraitOrDefault(); + claimLayer = world.WorldActor.TraitOrDefault(); } - protected override void TraitEnabled(Actor self) + public void WorldLoaded(World w, WorldRenderer wr) { - pathfinder = world.WorldActor.Trait(); - domainIndex = world.WorldActor.Trait(); - resLayer = world.WorldActor.TraitOrDefault(); - claimLayer = world.WorldActor.TraitOrDefault(); - scanForIdleHarvestersTicks = Info.ScanForIdleHarvestersInterval; + if (resourceLayer != null) + { + foreach (var cell in w.Map.AllCells) + { + var resource = resourceLayer.GetResource(cell); + if (resource.Type != null) + resourceTypesByCell.Add(cell, resource.Type); + } + + resourceLayer.CellChanged += ResourceCellChanged; + } + } + void ResourceCellChanged(CPos cell, string resourceType) + { + if (resourceType == null) + resourceTypesByCell.Remove(cell); + else + resourceTypesByCell[cell] = resourceType; + } + + protected override void TraitEnabled(Actor self) + { + // Avoid all AIs scanning for idle harvesters on the same tick, randomize their initial scan delay. + scanForIdleHarvestersTicks = world.LocalRandom.Next(Info.ScanForIdleHarvestersInterval); scanForEnoughHarvestersTicks = Info.ProduceHarvestersInterval; } void IBotTick.BotTick(IBot bot) { - if (resLayer == null || resLayer.IsResourceLayerEmpty) + if (resourceLayer == null || resourceLayer.IsEmpty) return; - if (--scanForIdleHarvestersTicks > 0) - { - OrderHarvesters(bot); - scanForIdleHarvestersTicks = Info.ScanForIdleHarvestersInterval; - } - - if (--scanForEnoughHarvestersTicks > 0) - { - ProduceHarvesters(bot); - scanForEnoughHarvestersTicks = Info.ProduceHarvestersInterval; - } + OrderHarvesters(bot); + ProduceHarvesters(bot); } protected void OrderHarvesters(IBot bot) { + // Find idle harvesters and give them orders: + // PERF: FindNextResource is expensive, so only perform one search per tick. + var searchedForResources = false; + while (harvestersNeedingOrders.TryPop(out var hno) && !searchedForResources) + searchedForResources = HarvestIfAble(bot, hno); + + if (--scanForIdleHarvestersTicks > 0) + return; + var toRemove = harvesters.Keys.Where(unitCannotBeOrdered).ToList(); foreach (var a in toRemove) harvesters.Remove(a); + scanForIdleHarvestersTicks = Info.ScanForIdleHarvestersInterval; + // Find new harvesters - // TODO: Look for a more performance-friendly way to update this list - var newHarvesters = world.ActorsHavingTrait().Where(a => a.Owner == player && !harvesters.ContainsKey(a)); + var newHarvesters = world.ActorsHavingTrait().Where(a => !unitCannotBeOrdered(a) && !harvesters.ContainsKey(a)); foreach (var a in newHarvesters) harvesters[a] = new HarvesterTraitWrapper(a); - // Find idle harvesters and give them orders: + harvestersNeedingOrders.Clear(); foreach (var h in harvesters) - { - if (!h.Key.IsIdle) - { - var act = h.Key.CurrentActivity as FindAndDeliverResources; + harvestersNeedingOrders.Push(h.Value); + } - // Ignore this actor if FindAndDeliverResources is working fine or it is performing a different activity - if (act == null || !act.LastSearchFailed) - continue; - } + // Returns true if FindNextResource was called. + bool HarvestIfAble(IBot bot, HarvesterTraitWrapper h) + { + if (h.Actor.IsDead || !h.Actor.IsInWorld || h.Mobile == null) + return false; + + if (!h.Actor.IsIdle) + { + // Ignore this actor if FindAndDeliverResources is working fine or it is performing a different activity + if (h.Actor.CurrentActivity is not FindAndDeliverResources act || !act.LastSearchFailed) + return false; + } - // Tell the idle harvester to quit slacking: - var newSafeResourcePatch = FindNextResource(h.Key, h.Value); - AIUtils.BotDebug("AI: Harvester {0} is idle. Ordering to {1} in search for new resources.".F(h.Key, newSafeResourcePatch)); - bot.QueueOrder(new Order("Harvest", h.Key, newSafeResourcePatch, false)); + if (h.NoResourcesCooldown > 1) + { + h.NoResourcesCooldown--; + return false; } + + if (h.Parachutable != null && h.Parachutable.IsInAir) + return false; + + // Tell the idle harvester to quit slacking: + var newSafeResourcePatch = FindNextResource(h.Actor, h); + AIUtils.BotDebug($"AI: Harvester {h.Actor} is idle. Ordering to {newSafeResourcePatch} in search for new resources."); + if (newSafeResourcePatch.Type != TargetType.Invalid) + bot.QueueOrder(new Order("Harvest", h.Actor, newSafeResourcePatch, false)); + else + h.NoResourcesCooldown = Info.ScanIntervalMultiplerWhenNoResources; + + return true; } protected void ProduceHarvesters(IBot bot) { + if (--scanForEnoughHarvestersTicks > 0) + return; + + scanForEnoughHarvestersTicks = Info.ProduceHarvestersInterval; + // Less harvesters than refineries - build a new harvester - var unitBuilder = requestUnitProduction.FirstOrDefault(Exts.IsTraitEnabled); - if (unitBuilder != null && Info.HarvesterTypes.Any()) + var unitBuilder = requestUnitProduction.FirstEnabledTraitOrDefault(); + if (unitBuilder != null && Info.HarvesterTypes.Count > 0) { - var harvInfo = AIUtils.GetInfoByCommonName(Info.HarvesterTypes, player); - var numHarvesters = AIUtils.CountActorByCommonName(Info.HarvesterTypes, player); + var numHarvesters = AIUtils.CountActorByCommonName(harvestersIndex); if (numHarvesters >= Info.MaxHarvesters) return; - var harvCountTooLow = numHarvesters < AIUtils.CountBuildingByCommonName(Info.RefineryTypes, player) * Info.HarvestersPerRefinery; - if (harvCountTooLow && unitBuilder.RequestedProductionCount(bot, harvInfo.Name) == 0) - unitBuilder.RequestUnitProduction(bot, harvInfo.Name); + var harvCountTooLow = numHarvesters < AIUtils.CountActorByCommonName(refineries) * Info.HarvestersPerRefinery; + var harvesterType = Info.HarvesterTypes.Random(world.LocalRandom); + if (harvCountTooLow && unitBuilder.RequestedProductionCount(bot, harvesterType) == 0) + unitBuilder.RequestUnitProduction(bot, harvesterType); } } Target FindNextResource(Actor actor, HarvesterTraitWrapper harv) { - Func isValidResource = cell => - domainIndex.IsPassable(actor.Location, cell, harv.Locomotor) && - harv.Harvester.CanHarvestCell(actor, cell) && - claimLayer.CanClaimCell(actor, cell); - - var path = pathfinder.FindPath( - PathSearch.Search(world, harv.Locomotor, actor, BlockedByActor.Stationary, isValidResource) - .WithCustomCost(loc => world.FindActorsInCircle(world.Map.CenterOfCell(loc), Info.HarvesterEnemyAvoidanceRadius) - .Where(u => !u.IsDead && actor.Owner.RelationshipWith(u.Owner) == PlayerRelationship.Enemy) - .Sum(u => Math.Max(WDist.Zero.Length, Info.HarvesterEnemyAvoidanceRadius.Length - (world.Map.CenterOfCell(loc) - u.CenterPosition).Length))) - .FromPoint(actor.Location)); + // Prefer resource nearby to the nearest drop off point, otherwise scan from the current location. + var scanFromActor = harv.DockClientManager.ClosestDock(null, ignoreOccupancy: true)?.Actor ?? actor; + + var targets = resourceTypesByCell + .Where(kvp => + harv.Harvester.Info.Resources.Contains(kvp.Value) && + claimLayer.CanClaimCell(actor, kvp.Key)) + .Select(kvp => kvp.Key); + + var avoidanceCostForBin = new Dictionary(); + var cellRadius = Info.HarvesterEnemyAvoidanceRadius.Length / 1024; + var minCellCost = harv.Mobile.Locomotor.Info.TerrainSpeeds.Values.Min(ti => ti.Cost); + var cellCostMultiplier = Info.HarvesterEnemyAvoidanceCostMultipler; + + static int2 CellToBin(CPos cell, int cellRadius) + { + return new int2( + cell.X / cellRadius, + cell.Y / cellRadius); + } + + static int CalculateAvoidanceCostForBin(World world, int2 bin, int cellRadius, Actor actor, int minCellCost, int cellCostMultipler) + { + // Bins are overlapping, this allows actors to apply threat in both directions when they're at the edge. + // If the bins didn't overlap, actors along the edge of a bin only affect that bin, and not the bin next to it, + // despite the fact the are an equal risk to both. + var r = WDist.FromCells(cellRadius); + var vec = new WVec(r, r, WDist.Zero); + var originCell = new CPos(bin.X * cellRadius + cellRadius / 2, bin.Y * cellRadius + cellRadius / 2); + var origin = world.Map.CenterOfCell(originCell); + var threatActors = world.ActorMap.ActorsInBox(origin - vec, origin + vec) + .Where(u => !u.IsDead && actor.Owner.RelationshipWith(u.Owner) == PlayerRelationship.Enemy); + + // For each actor in the threat radius, every cell we want to move is an extra cost than a threat-free area. + return threatActors.Count() * minCellCost * cellCostMultipler; + } + + var path = harv.Mobile.PathFinder.FindPathToTargetCells( + actor, scanFromActor.Location, targets, BlockedByActor.Stationary, + loc => + { + // Avoid areas with enemies. + var bin = CellToBin(loc, cellRadius); + if (avoidanceCostForBin.TryGetValue(bin, out var avoidanceCost)) + return avoidanceCost; + + // PERF: Calculate a "bin" for a threat area. + // This allows future custom cost checks to reuse the result for that area, + // rather than calculating it fresh for every cell explored for the path. + avoidanceCost = CalculateAvoidanceCostForBin(world, bin, cellRadius, actor, minCellCost, cellCostMultiplier); + avoidanceCostForBin.Add(bin, avoidanceCost); + return avoidanceCost; + }); if (path.Count == 0) return Target.Invalid; return Target.FromCell(world, path[0]); } + + void INotifyActorDisposing.Disposing(Actor self) + { + refineries.Dispose(); + harvestersIndex.Dispose(); + + if (resourceLayer != null) + resourceLayer.CellChanged -= ResourceCellChanged; + } } } diff --git a/OpenRA.Mods.CA/Traits/BotModules/MCVManagerBotModuleCA.cs b/OpenRA.Mods.CA/Traits/BotModules/MCVManagerBotModuleCA.cs index 6580c83b2d..c08b7da02e 100644 --- a/OpenRA.Mods.CA/Traits/BotModules/MCVManagerBotModuleCA.cs +++ b/OpenRA.Mods.CA/Traits/BotModules/MCVManagerBotModuleCA.cs @@ -1,11 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -60,11 +59,12 @@ public CPos GetRandomBaseCenter(bool distanceToBaseIsImportant) if (distanceToBaseIsImportant == false) return initialBaseCenter; - var tileset = world.Map.Rules.TileSet; - var resourceTypeIndices = new BitArray(tileset.TerrainInfo.Length); + var ti = world.Map.Rules.TerrainInfo; + var resourceTypeIndices = new BitArray(ti.TerrainTypes.Length); - foreach (var t in world.Map.Rules.Actors["world"].TraitInfos()) - resourceTypeIndices.Set(tileset.GetTerrainIndex(t.TerrainType), true); + foreach (var i in world.Map.Rules.Actors["world"].TraitInfos()) + foreach (var t in i.ResourceTypes) + resourceTypeIndices.Set(ti.GetTerrainIndex(t.Value.TerrainType), true); var randomConstructionYard = world.Actors.Where(a => a.Owner == player && Info.ConstructionYardTypes.Contains(a.Info.Name)) @@ -261,12 +261,12 @@ List IGameSaveTraitData.IssueTraitData(Actor self) }; } - void IGameSaveTraitData.ResolveTraitData(Actor self, List data) + void IGameSaveTraitData.ResolveTraitData(Actor self, MiniYaml data) { if (self.World.IsReplay) return; - var initialBaseCenterNode = data.FirstOrDefault(n => n.Key == "InitialBaseCenter"); + var initialBaseCenterNode = data.NodeWithKeyOrDefault("InitialBaseCenter"); if (initialBaseCenterNode != null) initialBaseCenter = FieldLoader.GetValue("InitialBaseCenter", initialBaseCenterNode.Value.Value); } diff --git a/OpenRA.Mods.CA/Traits/BotModules/PowerDownBotModuleCA.cs b/OpenRA.Mods.CA/Traits/BotModules/PowerDownBotModuleCA.cs index ccdb69f780..a5a9b8a3c8 100644 --- a/OpenRA.Mods.CA/Traits/BotModules/PowerDownBotModuleCA.cs +++ b/OpenRA.Mods.CA/Traits/BotModules/PowerDownBotModuleCA.cs @@ -1,11 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -17,30 +16,31 @@ namespace OpenRA.Mods.CA.Traits { - [Desc("Manages AI powerdown.")] + [TraitLocation(SystemActors.Player)] + [Desc("Manages AI powerdown.", + "You need to use PowerMultiplier on toggle control only on related buildings, for calculation of this bot module")] public class PowerDownBotModuleCAInfo : ConditionalTraitInfo { [Desc("Delay (in ticks) between toggling powerdown.")] public readonly int Interval = 150; - [Desc("Order string that used for powerdown.")] - public readonly string OrderName = "PowerDown"; - public override object Create(ActorInitializer init) { return new PowerDownBotModuleCA(init.Self, this); } } - public class PowerDownBotModuleCA : ConditionalTrait, IBotTick + public class PowerDownBotModuleCA : ConditionalTrait, IBotTick, IGameSaveTraitData { readonly World world; readonly Player player; + PowerManager playerPower; int toggleTick; + readonly Func isToggledBuildingsValid; // We keep a list to track toggled buildings for performance. - List toggledBuildings; + List toggledBuildings = new List(); - class BuildingPowerWrapper + sealed class BuildingPowerWrapper { public int ExpectedPowerChanging; public Actor Actor; @@ -57,30 +57,25 @@ public PowerDownBotModuleCA(Actor self, PowerDownBotModuleCAInfo info) { world = self.World; player = self.Owner; - toggledBuildings = new List(); - isToggledBuildingsValid = a => a.Owner == self.Owner && !a.IsDead && a.IsInWorld; + + isToggledBuildingsValid = a => a != null && a.Owner == self.Owner && !a.IsDead && a.IsInWorld; } protected override void Created(Actor self) { - // Special case handling is required for the Player actor. - // Created is called before Player.PlayerActor is assigned, - // so we must query player traits from self, which refers - // for bot modules always to the Player actor. - playerPower = self.TraitOrDefault(); + playerPower = self.Owner.PlayerActor.TraitOrDefault(); } protected override void TraitEnabled(Actor self) { toggleTick = world.LocalRandom.Next(Info.Interval); - toggledBuildings = new List(); } - int GetTogglePowerChanging(Actor a) + static int GetTogglePowerChanging(Actor a) { var powerChangingIfToggled = 0; var powerTraits = a.TraitsImplementing().Where(t => !t.IsTraitDisabled).ToArray(); - if (powerTraits.Any()) + if (powerTraits.Length > 0) { var powerMulTraits = a.TraitsImplementing().ToArray(); powerChangingIfToggled = powerTraits.Sum(p => p.Info.Amount) * (powerMulTraits.Sum(p => p.Info.Modifier) - 100) / 100; @@ -101,7 +96,7 @@ IEnumerable GetToggleableBuildings(IBot bot) IEnumerable GetOnlineBuildings(IBot bot) { - List toggleableBuildings = new List(); + var toggleableBuildings = new List(); foreach (var a in GetToggleableBuildings(bot)) { @@ -122,13 +117,13 @@ void IBotTick.BotTick(IBot bot) } var power = playerPower.ExcessPower; - List togglingBuildings = new List(); + var togglingBuildings = new List(); // When there is extra power, check if AI can toggle on if (power > 0) { toggledBuildings = toggledBuildings.Where(bpw => isToggledBuildingsValid(bpw.Actor)).OrderByDescending(bpw => bpw.ExpectedPowerChanging).ToList(); - for (int i = 0; i < toggledBuildings.Count; i++) + for (var i = 0; i < toggledBuildings.Count; i++) { var bpw = toggledBuildings[i]; if (power + bpw.ExpectedPowerChanging < 0) @@ -157,11 +152,42 @@ void IBotTick.BotTick(IBot bot) } if (togglingBuildings.Count > 0) - { - bot.QueueOrder(new Order(Info.OrderName, null, false, groupedActors: togglingBuildings.ToArray())); - } + bot.QueueOrder(new Order("PowerDown", null, false, groupedActors: togglingBuildings.ToArray())); toggleTick = Info.Interval; } + + List IGameSaveTraitData.IssueTraitData(Actor self) + { + if (IsTraitDisabled) + return null; + + var data = new List(); + foreach (var tb in toggledBuildings.Where(td => isToggledBuildingsValid(td.Actor))) + data.Add(new MiniYamlNode(FieldSaver.FormatValue(tb.Actor.ActorID), FieldSaver.FormatValue(tb.ExpectedPowerChanging))); + + return new List() + { + new MiniYamlNode("ToggledBuildings", new MiniYaml("", data)) + }; + } + + void IGameSaveTraitData.ResolveTraitData(Actor self, MiniYaml data) + { + if (self.World.IsReplay) + return; + + var toggledBuildingsNode = data.NodeWithKeyOrDefault("ToggledBuildings"); + if (toggledBuildingsNode != null) + { + foreach (var n in toggledBuildingsNode.Value.Nodes) + { + var a = self.World.GetActorById(FieldLoader.GetValue(n.Key, n.Key)); + + if (isToggledBuildingsValid(a)) + toggledBuildings.Add(new BuildingPowerWrapper(a, FieldLoader.GetValue(n.Key, n.Value.Value))); + } + } + } } } diff --git a/OpenRA.Mods.CA/Traits/BotModules/SquadManagerBotModuleCA.cs b/OpenRA.Mods.CA/Traits/BotModules/SquadManagerBotModuleCA.cs index b511641efb..410df716f5 100644 --- a/OpenRA.Mods.CA/Traits/BotModules/SquadManagerBotModuleCA.cs +++ b/OpenRA.Mods.CA/Traits/BotModules/SquadManagerBotModuleCA.cs @@ -1,11 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -13,6 +12,7 @@ using System.Collections.Generic; using System.Linq; using OpenRA.Mods.CA.Traits.BotModules.Squads; +using OpenRA.Mods.Common; using OpenRA.Mods.Common.Traits; using OpenRA.Primitives; using OpenRA.Traits; @@ -22,29 +22,36 @@ namespace OpenRA.Mods.CA.Traits [Desc("Manages AI squads.")] public class SquadManagerBotModuleCAInfo : ConditionalTraitInfo { + [ActorReference] [Desc("Actor types that are valid for naval squads.")] public readonly HashSet NavalUnitsTypes = new HashSet(); + [ActorReference] + [Desc("Actor types that are excluded from ground attacks.")] + public readonly HashSet AirUnitsTypes = new HashSet(); + + [ActorReference] + [Desc("Actor types that are valid for harasser squads.")] + public readonly HashSet HarasserTypes = new HashSet(); + + [ActorReference] [Desc("Actor types that should generally be excluded from attack squads.")] public readonly HashSet ExcludeFromSquadsTypes = new HashSet(); - [Desc("Actor types that should generally be excluded from air squads.")] - public readonly HashSet ExcludeFromAirSquadsTypes = new HashSet(); - + [ActorReference] [Desc("Actor types that are considered construction yards (base builders).")] public readonly HashSet ConstructionYardTypes = new HashSet(); + [ActorReference] [Desc("Enemy building types around which to scan for targets for naval squads.")] public readonly HashSet NavalProductionTypes = new HashSet(); - [Desc("Limit target types for specific air unit squads.")] - public readonly Dictionary> AirSquadTargetTypes = null; - - [Desc("Minimum number of units AI must have before attacking.")] - public readonly int SquadSize = 8; + [ActorReference] + [Desc("Own actor types that are prioritized when defending.")] + public readonly HashSet ProtectionTypes = new(); - [Desc("Random number of up to this many units is added to squad size when creating an attack squad.")] - public readonly int SquadSizeRandomBonus = 30; + [Desc("Target types are used for identifying aircraft.")] + public readonly BitSet AircraftTargetType = new("Air"); [Desc("Delay (in ticks) between giving out orders to units.")] public readonly int AssignRolesInterval = 50; @@ -80,11 +87,48 @@ public class SquadManagerBotModuleCAInfo : ConditionalTraitInfo [Desc("Radius in cells that protecting squads should scan for enemies around their position.")] public readonly int ProtectionScanRadius = 8; + [Desc("Enemy target types to never target.")] + public readonly BitSet IgnoredEnemyTargetTypes = default; + + // ============================== + // === CA-SPECIFIC PROPERTIES === + // ============================== + + [Desc("Delay (in ticks) between issuing a protection order.")] + public readonly int ProtectInterval = 50; + + [Desc("Minimum value of units AI must have before attacking.")] + public readonly int SquadValue = 0; + + [Desc("Random number of up to this value units is added to squad value when creating an attack squad.")] + public readonly int SquadValueMaxEarlyBonus = 0; + + [Desc("The random number added to squad value increases to this value over the first 20 minutes.")] + public readonly int SquadValueMinLateBonus = 0; + + [Desc("The random number added to squad value increases to this value over the first 20 minutes.")] + public readonly int SquadValueMaxLateBonus = 0; + + [Desc("Percent change for ground squads to attack a random priority target rather than the closest enemy.")] + public readonly int HighValueTargetPriority = 0; + + [Desc("Actor types to prioritise based on HighValueTargetPriority.")] + public readonly HashSet HighValueTargetTypes = new HashSet(); + [Desc("Percent change for air squads (that can attack aircraft) to prioritise enemy aircraft.")] - public readonly int AirToAirPriority = 80; + public readonly int AirToAirPriority = 85; - [Desc("Enemy target types to never target.")] - public readonly BitSet IgnoredEnemyTargetTypes = default(BitSet); + [Desc("Limit target types for specific air unit squads.")] + public readonly Dictionary> AirSquadTargetArmorTypes = null; + + [Desc("Enemy building types around which to scan for targets for naval squads.")] + public readonly HashSet StaticAntiAirTypes = new HashSet(); + + [Desc("Air threats to prioritise above all others.")] + public readonly HashSet BigAirThreats = new HashSet(); + + [Desc("Percent chance to take a less direct route to targets.")] + public readonly int IndirectRouteChance = 50; public override void RulesetLoaded(Ruleset rules, ActorInfo ai) { @@ -92,36 +136,46 @@ public override void RulesetLoaded(Ruleset rules, ActorInfo ai) if (DangerScanRadius <= 0) throw new YamlException("DangerScanRadius must be greater than zero."); + + if (SquadValueMaxEarlyBonus > SquadValueMaxLateBonus) + throw new YamlException("SquadValueMaxEarlyBonus cannot be greater than SquadValueMaxLateBonus."); + + if (SquadValueMinLateBonus > SquadValueMaxLateBonus) + throw new YamlException("SquadValueMinLateBonus cannot be greater than SquadValueMaxLateBonus."); } public override object Create(ActorInitializer init) { return new SquadManagerBotModuleCA(init.Self, this); } } - public class SquadManagerBotModuleCA : ConditionalTrait, IBotEnabled, IBotTick, IBotRespondToAttack, IBotPositionsUpdated, IGameSaveTraitData + public class SquadManagerBotModuleCA : ConditionalTrait, IBotEnabled, IBotTick, + IBotRespondToAttack, IBotPositionsUpdated, IGameSaveTraitData, INotifyActorDisposing { public CPos GetRandomBaseCenter() { - var randomConstructionYard = World.Actors.Where(a => a.Owner == Player && - Info.ConstructionYardTypes.Contains(a.Info.Name)) + var randomConstructionYard = constructionYardBuildings.Actors + .Where(a => a.Owner == Player) .RandomOrDefault(World.LocalRandom); - return randomConstructionYard != null ? randomConstructionYard.Location : initialBaseCenter; + return randomConstructionYard?.Location ?? initialBaseCenter; } public readonly World World; public readonly Player Player; readonly Predicate unitCannotBeOrdered; - readonly List unitsHangingAroundTheBase = new List(); + readonly List unitsHangingAroundTheBase = new(); // Units that the bot already knows about. Any unit not on this list needs to be given a role. - readonly List activeUnits = new List(); + readonly HashSet activeUnits = new(); - public List Squads = new List(); + public List Squads = new(); + readonly Stack squadsPendingUpdate = new(); + readonly ActorIndex.NamesAndTrait constructionYardBuildings; IBot bot; IBotPositionsUpdated[] notifyPositionsUpdated; IBotNotifyIdleBaseUnits[] notifyIdleBaseUnits; + IBotAircraftBuilder[] aircraftBuilders; CPos initialBaseCenter; @@ -130,6 +184,13 @@ public CPos GetRandomBaseCenter() int attackForceTicks; int minAttackForceDelayTicks; + int protectOwnTicks; // CA: Protection interval timing + Actor protectOwnFrom; // CA: Track what we're protecting from + + int desiredAttackForceValue; // CA: Value-based squad thresholds + + Dictionary cachedUnitValues = new(); + public SquadManagerBotModuleCA(Actor self, SquadManagerBotModuleCAInfo info) : base(info) { @@ -137,39 +198,13 @@ public SquadManagerBotModuleCA(Actor self, SquadManagerBotModuleCAInfo info) Player = self.Owner; unitCannotBeOrdered = a => a == null || a.Owner != Player || a.IsDead || !a.IsInWorld; + constructionYardBuildings = new ActorIndex.NamesAndTrait(World, info.ConstructionYardTypes); } // Use for proactive targeting. public bool IsPreferredEnemyUnit(Actor a) { - if (a == null || a.IsDead || Player.RelationshipWith(a.Owner) != PlayerRelationship.Enemy || a.Info.HasTraitInfo() || a.Info.HasTraitInfo()) - return false; - - var targetTypes = a.GetEnabledTargetTypes(); - return !targetTypes.IsEmpty && !targetTypes.Overlaps(Info.IgnoredEnemyTargetTypes); - } - - public bool IsPreferredEnemyAircraft(Actor a) - { - if (a == null || a.IsDead || Player.RelationshipWith(a.Owner) != PlayerRelationship.Enemy || a.Info.HasTraitInfo() || !a.Info.HasTraitInfo() || !a.Info.HasTraitInfo() || a.Info.HasTraitInfo()) - return false; - - var targetTypes = a.GetEnabledTargetTypes(); - return !targetTypes.IsEmpty && !targetTypes.Overlaps(Info.IgnoredEnemyTargetTypes); - } - - public bool IsAirSquadTargetType(Actor a, SquadCA owner) - { - var airSquadUnitType = owner.Units.First().Info.Name; - if (owner.SquadManager.Info.AirSquadTargetTypes.ContainsKey(airSquadUnitType)) - { - var targetTypes = a.GetEnabledTargetTypes(); - - if (targetTypes.IsEmpty || !targetTypes.Overlaps(owner.SquadManager.Info.AirSquadTargetTypes[airSquadUnitType])) - return false; - } - - return true; + return IsValidEnemyUnit(a) && !a.Info.HasTraitInfo(); } public bool IsNotHiddenUnit(Actor a) @@ -191,14 +226,11 @@ protected override void Created(Actor self) { notifyPositionsUpdated = self.Owner.PlayerActor.TraitsImplementing().ToArray(); notifyIdleBaseUnits = self.Owner.PlayerActor.TraitsImplementing().ToArray(); + aircraftBuilders = self.Owner.PlayerActor.TraitsImplementing().ToArray(); } protected override void TraitEnabled(Actor self) { - // Avoid all AIs trying to rush in the same tick, randomize their initial rush a little. - var smallFractionOfRushInterval = Info.RushInterval / 20; - rushTicks = World.LocalRandom.Next(Info.RushInterval - smallFractionOfRushInterval, Info.RushInterval + smallFractionOfRushInterval); - // Avoid all AIs reevaluating assignments on the same tick, randomize their initial evaluation delay. assignRolesTicks = World.LocalRandom.Next(0, Info.AssignRolesInterval); attackForceTicks = World.LocalRandom.Next(0, Info.AttackForceInterval); @@ -215,22 +247,136 @@ void IBotTick.BotTick(IBot bot) AssignRolesToIdleUnits(bot); } - internal Actor FindClosestEnemy(WPos pos) + internal static Actor ClosestTo(IEnumerable ownActors, Actor targetActor) + { + // Return actors that can get within weapons range of the target. + // First, let's determine the max weapons range for each of the actors. + var target = Target.FromActor(targetActor); + var ownActorsAndTheirAttackRanges = ownActors + .Select(a => (Actor: a, AttackBases: a.TraitsImplementing().Where(Exts.IsTraitEnabled) + .Where(ab => ab.HasAnyValidWeapons(target)).ToList())) + .Where(x => x.AttackBases.Count > 0) + .Select(x => (x.Actor, Range: x.AttackBases.Max(ab => ab.GetMaximumRangeVersusTarget(target)))) + .ToDictionary(x => x.Actor, x => x.Range); + + // Now determine if each actor can either path directly to the target, + // or if it can path to a nearby location at the edge of its weapon range to the target + // A thorough check would check each position within the circle, but for performance + // we'll only check 8 positions around the edge of the circle. + // We need to account for the weapons range here to account for units such as boats. + // They can't path directly to a land target, + // but might be able to get close enough to shore to attack the target from range. + return ownActorsAndTheirAttackRanges.Keys + .ClosestToWithPathToAny(targetActor.World, a => + { + var range = ownActorsAndTheirAttackRanges[a].Length; + var rangeDiag = Exts.MultiplyBySqrtTwoOverTwo(range); + return new[] + { + targetActor.CenterPosition, + targetActor.CenterPosition + new WVec(range, 0, 0), + targetActor.CenterPosition + new WVec(-range, 0, 0), + targetActor.CenterPosition + new WVec(0, range, 0), + targetActor.CenterPosition + new WVec(0, -range, 0), + targetActor.CenterPosition + new WVec(rangeDiag, rangeDiag, 0), + targetActor.CenterPosition + new WVec(-rangeDiag, rangeDiag, 0), + targetActor.CenterPosition + new WVec(-rangeDiag, -rangeDiag, 0), + targetActor.CenterPosition + new WVec(rangeDiag, -rangeDiag, 0), + }; + }); + } + + internal IEnumerable<(Actor Actor, WVec Offset)> FindEnemies(IEnumerable actors, Actor sourceActor) + { + // Check units are in fact enemies and not hidden. + // Then check which are in weapons range of the source. + var activeAttackBases = sourceActor.TraitsImplementing().Where(Exts.IsTraitEnabled).ToArray(); + var enemiesAndSourceAttackRanges = actors + .Where(IsPreferredEnemyUnit) + .Select(a => (Actor: a, AttackBases: activeAttackBases.Where(ab => ab.HasAnyValidWeapons(Target.FromActor(a))).ToList())) + .Where(x => x.AttackBases.Count > 0) + .Select(x => (x.Actor, Range: x.AttackBases.Max(ab => ab.GetMaximumRangeVersusTarget(Target.FromActor(x.Actor))))) + .ToDictionary(x => x.Actor, x => x.Range); + + // Now determine if the source actor can path directly to the target, + // or if it can path to a nearby location at the edge of its weapon range to the target + // A thorough check would check each position within the circle, but for performance + // we'll only check 8 positions around the edge of the circle. + // We need to account for the weapons range here to account for units such as boats. + // They can't path directly to a land target, + // but might be able to get close enough to shore to attack the target from range. + return enemiesAndSourceAttackRanges.Keys + .WithPathFrom(sourceActor, a => + { + var range = enemiesAndSourceAttackRanges[a].Length; + var rangeDiag = Exts.MultiplyBySqrtTwoOverTwo(range); + return new[] + { + WVec.Zero, + new WVec(range, 0, 0), + new WVec(-range, 0, 0), + new WVec(0, range, 0), + new WVec(0, -range, 0), + new WVec(rangeDiag, rangeDiag, 0), + new WVec(-rangeDiag, rangeDiag, 0), + new WVec(-rangeDiag, -rangeDiag, 0), + new WVec(rangeDiag, -rangeDiag, 0), + }; + }) + .Select(x => (x.Actor, x.ReachableOffsets.MinBy(o => o.LengthSquared))); + } + + internal (Actor Actor, WVec Offset) FindClosestEnemy(Actor sourceActor, bool highValueCheck = false) { - var units = World.Actors.Where(IsPreferredEnemyUnit); - return units.Where(IsNotHiddenUnit).ClosestTo(pos) ?? units.ClosestTo(pos); + return FindClosestEnemy(World.Actors, sourceActor, highValueCheck); } - internal Actor FindClosestEnemy(WPos pos, WDist radius) + internal (Actor Actor, WVec Offset) FindClosestEnemy(Actor sourceActor, WDist radius, bool highValueCheck = false) { - return World.FindActorsInCircle(pos, radius).Where(a => IsPreferredEnemyUnit(a) && IsNotHiddenUnit(a)).ClosestTo(pos); + return FindClosestEnemy(World.FindActorsInCircle(sourceActor.CenterPosition, radius), sourceActor, highValueCheck); + } + + (Actor Actor, WVec Offset) FindClosestEnemy(IEnumerable actors, Actor sourceActor, bool highValueCheck = false) + { + if (highValueCheck) + { + var highValueTargetRoll = World.LocalRandom.Next(0, 100); + + if (Info.HighValueTargetPriority > highValueTargetRoll) + { + var highValueTarget = FindHighValueTarget(sourceActor); + if (highValueTarget != null) + return (highValueTarget, WVec.Zero); + } + } + + // CA: Prioritize buildings over other enemy units + // First try to find closest building + var buildings = FindEnemies(actors.Where(IsPreferredEnemyBuilding), sourceActor); + var closestBuilding = WorldUtils.ClosestToIgnoringPath(buildings, x => x.Actor, sourceActor); + + if (closestBuilding.Actor != null) + return closestBuilding; + + // Fall back to any enemy if no buildings found + return WorldUtils.ClosestToIgnoringPath(FindEnemies(actors, sourceActor), x => x.Actor, sourceActor); } void CleanSquads() { - Squads.RemoveAll(s => !s.IsValid); foreach (var s in Squads) - s.Units.RemoveAll(unitCannotBeOrdered); + { + s.Units.RemoveWhere(unitCannotBeOrdered); + + if (s.Type == SquadCAType.Air) + { + s.NewUnits.RemoveWhere(unitCannotBeOrdered); + s.RearmingUnits.RemoveWhere(unitCannotBeOrdered); + s.WaitingUnits.RemoveWhere(unitCannotBeOrdered); + } + } + + Squads.RemoveAll(s => !s.IsValid); } // HACK: Use of this function requires that there is one squad of this type. @@ -239,33 +385,46 @@ SquadCA GetSquadOfType(SquadCAType type) return Squads.FirstOrDefault(s => s.Type == type); } - SquadCA RegisterNewSquad(IBot bot, SquadCAType type, Actor target = null) + SquadCA RegisterNewSquad(IBot bot, SquadCAType type, (Actor Actor, WVec Offset) target = default) { var ret = new SquadCA(bot, this, type, target); Squads.Add(ret); return ret; } + internal void UnregisterSquad(SquadCA squad) + { + activeUnits.ExceptWith(squad.Units); + squad.Units.Clear(); + + // CleanSquads will remove the squad from the Squads list. + // We can't do that here as this is designed to be called from within Squad.Update + // and thus would mutate the Squads list we are iterating over. + } + void AssignRolesToIdleUnits(IBot bot) { CleanSquads(); - activeUnits.RemoveAll(unitCannotBeOrdered); + activeUnits.RemoveWhere(unitCannotBeOrdered); unitsHangingAroundTheBase.RemoveAll(unitCannotBeOrdered); foreach (var n in notifyIdleBaseUnits) n.UpdatedIdleBaseUnits(unitsHangingAroundTheBase); - if (--rushTicks <= 0) - { - rushTicks = Info.RushInterval; - TryToRushAttack(bot); - } - if (--attackForceTicks <= 0) { attackForceTicks = Info.AttackForceInterval; foreach (var s in Squads) - s.Update(); + squadsPendingUpdate.Push(s); + } + + // PERF: Spread out squad updates across multiple ticks. + var updateCount = Exts.IntegerDivisionRoundingAwayFromZero(squadsPendingUpdate.Count, attackForceTicks); + for (var i = 0; i < updateCount; i++) + { + var squadPendingUpdate = squadsPendingUpdate.Pop(); + if (squadPendingUpdate.IsValid) + squadPendingUpdate.Update(); } if (--assignRolesTicks <= 0) @@ -279,6 +438,9 @@ void AssignRolesToIdleUnits(IBot bot) minAttackForceDelayTicks = Info.MinimumAttackForceDelay; CreateAttackForce(bot); } + + if (--protectOwnTicks <= 0 && protectOwnFrom != null) + ProtectOwn(bot, protectOwnFrom); } void FindNewUnits(IBot bot) @@ -290,34 +452,70 @@ void FindNewUnits(IBot bot) foreach (var a in newUnits) { - if (a.Info.HasTraitInfo() && a.Info.HasTraitInfo() && !Info.ExcludeFromAirSquadsTypes.Contains(a.Info.Name)) + if (Info.AirUnitsTypes.Contains(a.Info.Name)) { var airSquads = Squads.Where(s => s.Type == SquadCAType.Air); - var matchingSquadFound = false; + var matchingAirSquadFound = false; foreach (var airSquad in airSquads) { if (airSquad.Units.Any(u => u.Info.Name == a.Info.Name)) { airSquad.Units.Add(a); - matchingSquadFound = true; + airSquad.NewUnits.Add(a); + matchingAirSquadFound = true; break; } } - if (!matchingSquadFound) + if (!matchingAirSquadFound) { var newAirSquad = RegisterNewSquad(bot, SquadCAType.Air); newAirSquad.Units.Add(a); + newAirSquad.NewUnits.Add(a); } } else if (Info.NavalUnitsTypes.Contains(a.Info.Name)) { - var ships = GetSquadOfType(SquadCAType.Naval); - if (ships == null) - ships = RegisterNewSquad(bot, SquadCAType.Naval); + var navalSquads = Squads.Where(s => s.Type == SquadCAType.Naval); + var matchingNavalSquadFound = false; - ships.Units.Add(a); + foreach (var navalSquad in navalSquads) + { + if (navalSquad.Units.Any(u => u.Info.Name == a.Info.Name)) + { + navalSquad.Units.Add(a); + matchingNavalSquadFound = true; + break; + } + } + + if (!matchingNavalSquadFound) + { + var newNavalSquad = RegisterNewSquad(bot, SquadCAType.Naval); + newNavalSquad.Units.Add(a); + } + } + else if (Info.HarasserTypes.Contains(a.Info.Name)) + { + var harasserSquads = Squads.Where(s => s.Type == SquadCAType.Harass); + var matchingHarasserSquadFound = false; + + foreach (var harasserSquad in harasserSquads) + { + if (harasserSquad.Units.Any(u => u.Info.Name == a.Info.Name)) + { + harasserSquad.Units.Add(a); + matchingHarasserSquadFound = true; + break; + } + } + + if (!matchingHarasserSquadFound) + { + var newHarasserSquad = RegisterNewSquad(bot, SquadCAType.Harass); + newHarasserSquad.Units.Add(a); + } } else unitsHangingAroundTheBase.Add(a); @@ -334,9 +532,23 @@ void CreateAttackForce(IBot bot) { // Create an attack force when we have enough units around our base. // (don't bother leaving any behind for defense) - var randomizedSquadSize = Info.SquadSize + World.LocalRandom.Next(Info.SquadSizeRandomBonus); + var idleUnitsValue = 0; - if (unitsHangingAroundTheBase.Count >= randomizedSquadSize) + if (Info.SquadValue > 0) // CA: Value-based squad creation instead of just unit count + { + foreach (var a in unitsHangingAroundTheBase) + { + if (!cachedUnitValues.TryGetValue(a.Info.Name, out var unitCost)) + { + unitCost = a.Info.TraitInfoOrDefault()?.Cost ?? 0; + cachedUnitValues[a.Info.Name] = unitCost; + } + + idleUnitsValue += unitCost; + } + } + + if (idleUnitsValue >= desiredAttackForceValue) { var attackForce = RegisterNewSquad(bot, SquadCAType.Assault); @@ -346,59 +558,47 @@ void CreateAttackForce(IBot bot) unitsHangingAroundTheBase.Clear(); foreach (var n in notifyIdleBaseUnits) n.UpdatedIdleBaseUnits(unitsHangingAroundTheBase); + + SetNextDesiredAttackForce(); } } - void TryToRushAttack(IBot bot) + void SetNextDesiredAttackForce() { - var allEnemyBaseBuilder = AIUtils.FindEnemiesByCommonName(Info.ConstructionYardTypes, Player); - - // TODO: This should use common names & ExcludeFromSquads instead of hardcoding TraitInfo checks - var ownUnits = activeUnits - .Where(unit => unit.IsIdle && unit.Info.HasTraitInfo() - && !unit.Info.HasTraitInfo() && !Info.NavalUnitsTypes.Contains(unit.Info.Name) && !unit.Info.HasTraitInfo()).ToList(); - - if (!allEnemyBaseBuilder.Any() || ownUnits.Count < Info.SquadSize) - return; - - foreach (var b in allEnemyBaseBuilder) - { - // Don't rush enemy aircraft! - var enemies = World.FindActorsInCircle(b.CenterPosition, WDist.FromCells(Info.RushAttackScanRadius)) - .Where(unit => IsPreferredEnemyUnit(unit) && unit.Info.HasTraitInfo() && !unit.Info.HasTraitInfo() && !Info.NavalUnitsTypes.Contains(unit.Info.Name)).ToList(); - - if (AttackOrFleeFuzzyCA.Rush.CanAttack(ownUnits, enemies)) - { - var target = enemies.Any() ? enemies.Random(World.LocalRandom) : b; - var rush = GetSquadOfType(SquadCAType.Rush); - if (rush == null) - rush = RegisterNewSquad(bot, SquadCAType.Rush, target); - - foreach (var a3 in ownUnits) - rush.Units.Add(a3); - - return; - } - } + desiredAttackForceValue = Info.SquadValue; + + // Add a random bonus between a min and max that scale over the first 20 minutes. + // Min scales from 0 to SquadValueMinLateBonus; max scales from SquadValueMaxEarlyBonus to SquadValueMaxLateBonus. + var t = Math.Min(1f, World.WorldTick / (20f * 60f * 25f)); + var minBonus = (int)(Info.SquadValueMinLateBonus * t); + var maxBonus = (int)(Info.SquadValueMaxEarlyBonus + (Info.SquadValueMaxLateBonus - Info.SquadValueMaxEarlyBonus) * t); + + if (maxBonus <= minBonus) + desiredAttackForceValue += minBonus; + else + desiredAttackForceValue += World.LocalRandom.Next(minBonus, maxBonus); } void ProtectOwn(IBot bot, Actor attacker) { + protectOwnFrom = null; + protectOwnTicks = Info.ProtectInterval; + var protectSq = GetSquadOfType(SquadCAType.Protection); - if (protectSq == null) - protectSq = RegisterNewSquad(bot, SquadCAType.Protection, attacker); + protectSq ??= RegisterNewSquad(bot, SquadCAType.Protection, (attacker, WVec.Zero)); + protectSq.Units.RemoveWhere(unitCannotBeOrdered); - if (!protectSq.IsTargetValid) - protectSq.TargetActor = attacker; + if (protectSq.IsValid && !protectSq.IsTargetValid(protectSq.CenterUnit())) + protectSq.SetActorToTarget((attacker, WVec.Zero)); if (!protectSq.IsValid) { var ownUnits = World.FindActorsInCircle(World.Map.CenterOfCell(GetRandomBaseCenter()), WDist.FromCells(Info.ProtectUnitScanRadius)) - .Where(unit => unit.Owner == Player && !unit.Info.HasTraitInfo() && !unit.Info.HasTraitInfo() - && unit.Info.HasTraitInfo()); + .Where(unit => unit.Owner == Player && unit.Info.HasTraitInfo() && !unit.Info.HasTraitInfo() + && !unit.Info.HasTraitInfo() && !unit.Info.HasTraitInfo()) + .WithPathTo(World, attacker.CenterPosition); - foreach (var a in ownUnits) - protectSq.Units.Add(a); + protectSq.Units.UnionWith(ownUnits); } } @@ -421,82 +621,151 @@ void IBotRespondToAttack.RespondToAttack(IBot bot, Actor self, AttackInfo e) foreach (var n in notifyPositionsUpdated) n.UpdatedDefenseCenter(e.Attacker.Location); - ProtectOwn(bot, e.Attacker); + protectOwnFrom = e.Attacker; } } - List IGameSaveTraitData.IssueTraitData(Actor self) + List IGameSaveTraitData.IssueTraitData(Actor self) { if (IsTraitDisabled) return null; return new List() { - new MiniYamlNode("Squads", "", Squads.Select(s => new MiniYamlNode("Squad", s.Serialize())).ToList()), - new MiniYamlNode("InitialBaseCenter", FieldSaver.FormatValue(initialBaseCenter)), - new MiniYamlNode("UnitsHangingAroundTheBase", FieldSaver.FormatValue(unitsHangingAroundTheBase + new("Squads", "", Squads.ConvertAll(s => new MiniYamlNode("Squad", s.Serialize()))), + new("InitialBaseCenter", FieldSaver.FormatValue(initialBaseCenter)), + new("UnitsHangingAroundTheBase", FieldSaver.FormatValue(unitsHangingAroundTheBase .Where(a => !unitCannotBeOrdered(a)) .Select(a => a.ActorID) .ToArray())), - new MiniYamlNode("ActiveUnits", FieldSaver.FormatValue(activeUnits + new("ActiveUnits", FieldSaver.FormatValue(activeUnits .Where(a => !unitCannotBeOrdered(a)) .Select(a => a.ActorID) .ToArray())), - new MiniYamlNode("RushTicks", FieldSaver.FormatValue(rushTicks)), - new MiniYamlNode("AssignRolesTicks", FieldSaver.FormatValue(assignRolesTicks)), - new MiniYamlNode("AttackForceTicks", FieldSaver.FormatValue(attackForceTicks)), - new MiniYamlNode("MinAttackForceDelayTicks", FieldSaver.FormatValue(minAttackForceDelayTicks)), + new("RushTicks", FieldSaver.FormatValue(rushTicks)), + new("AssignRolesTicks", FieldSaver.FormatValue(assignRolesTicks)), + new("AttackForceTicks", FieldSaver.FormatValue(attackForceTicks)), + new("MinAttackForceDelayTicks", FieldSaver.FormatValue(minAttackForceDelayTicks)), }; } - void IGameSaveTraitData.ResolveTraitData(Actor self, List data) + void IGameSaveTraitData.ResolveTraitData(Actor self, MiniYaml data) { if (self.World.IsReplay) return; - var initialBaseCenterNode = data.FirstOrDefault(n => n.Key == "InitialBaseCenter"); - if (initialBaseCenterNode != null) - initialBaseCenter = FieldLoader.GetValue("InitialBaseCenter", initialBaseCenterNode.Value.Value); + var nodes = data.ToDictionary(); - var unitsHangingAroundTheBaseNode = data.FirstOrDefault(n => n.Key == "UnitsHangingAroundTheBase"); - if (unitsHangingAroundTheBaseNode != null) + if (nodes.TryGetValue("InitialBaseCenter", out var initialBaseCenterNode)) + initialBaseCenter = FieldLoader.GetValue("InitialBaseCenter", initialBaseCenterNode.Value); + + if (nodes.TryGetValue("UnitsHangingAroundTheBase", out var unitsHangingAroundTheBaseNode)) { unitsHangingAroundTheBase.Clear(); - unitsHangingAroundTheBase.AddRange(FieldLoader.GetValue("UnitsHangingAroundTheBase", unitsHangingAroundTheBaseNode.Value.Value) + unitsHangingAroundTheBase.AddRange(FieldLoader.GetValue("UnitsHangingAroundTheBase", unitsHangingAroundTheBaseNode.Value) .Select(a => self.World.GetActorById(a)).Where(a => a != null)); } - var activeUnitsNode = data.FirstOrDefault(n => n.Key == "ActiveUnits"); - if (activeUnitsNode != null) + if (nodes.TryGetValue("ActiveUnits", out var activeUnitsNode)) { activeUnits.Clear(); - activeUnits.AddRange(FieldLoader.GetValue("ActiveUnits", activeUnitsNode.Value.Value) + activeUnits.UnionWith(FieldLoader.GetValue("ActiveUnits", activeUnitsNode.Value) .Select(a => self.World.GetActorById(a)).Where(a => a != null)); } - var rushTicksNode = data.FirstOrDefault(n => n.Key == "RushTicks"); - if (rushTicksNode != null) - rushTicks = FieldLoader.GetValue("RushTicks", rushTicksNode.Value.Value); + if (nodes.TryGetValue("RushTicks", out var rushTicksNode)) + rushTicks = FieldLoader.GetValue("RushTicks", rushTicksNode.Value); - var assignRolesTicksNode = data.FirstOrDefault(n => n.Key == "AssignRolesTicks"); - if (assignRolesTicksNode != null) - assignRolesTicks = FieldLoader.GetValue("AssignRolesTicks", assignRolesTicksNode.Value.Value); + if (nodes.TryGetValue("AssignRolesTicks", out var assignRolesTicksNode)) + assignRolesTicks = FieldLoader.GetValue("AssignRolesTicks", assignRolesTicksNode.Value); - var attackForceTicksNode = data.FirstOrDefault(n => n.Key == "AttackForceTicks"); - if (attackForceTicksNode != null) - attackForceTicks = FieldLoader.GetValue("AttackForceTicks", attackForceTicksNode.Value.Value); + if (nodes.TryGetValue("AttackForceTicks", out var attackForceTicksNode)) + attackForceTicks = FieldLoader.GetValue("AttackForceTicks", attackForceTicksNode.Value); - var minAttackForceDelayTicksNode = data.FirstOrDefault(n => n.Key == "MinAttackForceDelayTicks"); - if (minAttackForceDelayTicksNode != null) - minAttackForceDelayTicks = FieldLoader.GetValue("MinAttackForceDelayTicks", minAttackForceDelayTicksNode.Value.Value); + if (nodes.TryGetValue("MinAttackForceDelayTicks", out var minAttackForceDelayTicksNode)) + minAttackForceDelayTicks = FieldLoader.GetValue("MinAttackForceDelayTicks", minAttackForceDelayTicksNode.Value); - var squadsNode = data.FirstOrDefault(n => n.Key == "Squads"); - if (squadsNode != null) + if (nodes.TryGetValue("Squads", out var squadsNode)) { Squads.Clear(); - foreach (var n in squadsNode.Value.Nodes) + foreach (var n in squadsNode.Nodes) Squads.Add(SquadCA.Deserialize(bot, this, n.Value)); } } + + void INotifyActorDisposing.Disposing(Actor self) + { + constructionYardBuildings?.Dispose(); + } + + // =========================== + // === CA-SPECIFIC METHODS === + // =========================== + + bool IsValidEnemyUnit(Actor a) + { + if (a == null || a.IsDead || Player.RelationshipWith(a.Owner) != PlayerRelationship.Enemy || + a.Info.HasTraitInfo() || a.Info.HasTraitInfo()) + return false; + + var targetTypes = a.GetEnabledTargetTypes(); + if (targetTypes.IsEmpty || targetTypes.Overlaps(Info.IgnoredEnemyTargetTypes)) + return false; + + return IsNotHiddenUnit(a); + } + + public bool IsPreferredEnemyBuilding(Actor a) + { + return IsValidEnemyUnit(a) && a.Info.HasTraitInfo(); + } + + public bool IsPreferredEnemyAircraft(Actor a) + { + return IsValidEnemyUnit(a) && a.Info.HasTraitInfo() && a.Info.HasTraitInfo(); + } + + public bool IsHighValueTarget(Actor a) + { + return IsValidEnemyUnit(a) && Info.HighValueTargetTypes.Contains(a.Info.Name); + } + + public bool IsAirSquadTargetArmorType(Actor a, SquadCA owner) + { + if (a == null || a.IsDead) + return false; + + var airSquadUnitType = owner.Units.First().Info.Name; + if (owner.SquadManager.Info.AirSquadTargetArmorTypes.ContainsKey(airSquadUnitType)) + { + var desiredArmorTypes = owner.SquadManager.Info.AirSquadTargetArmorTypes[airSquadUnitType]; + return a.Info.TraitInfos().Any(ai => desiredArmorTypes.Contains(ai.Type.ToString())); + } + + return true; + } + + internal Actor FindHighValueTarget(Actor sourceActor) // CA: High-value target prioritization system + { + var highValueActors = World.Actors.Where(IsHighValueTarget); + var reachableHighValueTargets = FindEnemies(highValueActors, sourceActor).ToList(); + return reachableHighValueTargets.Count > 0 + ? reachableHighValueTargets.RandomOrDefault(World.LocalRandom).Actor + : null; + } + + public bool CanBuildMoreOfAircraft(ActorInfo actorInfo) // CA: Aircraft builder integration + { + foreach (var aircraftBuilder in aircraftBuilders) + { + if (!aircraftBuilder.IsTraitEnabled()) + continue; + + if (aircraftBuilder.CanBuildMoreOfAircraft(actorInfo)) + return true; + } + + return false; + } } } diff --git a/OpenRA.Mods.CA/Traits/BotModules/Squads/AttackOrFleeFuzzyCA.cs b/OpenRA.Mods.CA/Traits/BotModules/Squads/AttackOrFleeFuzzyCA.cs index 40457eafc0..14d2661c0f 100644 --- a/OpenRA.Mods.CA/Traits/BotModules/Squads/AttackOrFleeFuzzyCA.cs +++ b/OpenRA.Mods.CA/Traits/BotModules/Squads/AttackOrFleeFuzzyCA.cs @@ -1,11 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion diff --git a/OpenRA.Mods.CA/Traits/BotModules/Squads/SquadCA.cs b/OpenRA.Mods.CA/Traits/BotModules/Squads/SquadCA.cs index 8a01b0ee4a..665d46bd38 100644 --- a/OpenRA.Mods.CA/Traits/BotModules/Squads/SquadCA.cs +++ b/OpenRA.Mods.CA/Traits/BotModules/Squads/SquadCA.cs @@ -1,49 +1,116 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion using System.Collections.Generic; using System.Linq; using OpenRA.Mods.Common.Traits; -using OpenRA.Mods.Common.Traits.BotModules.Squads; using OpenRA.Support; using OpenRA.Traits; namespace OpenRA.Mods.CA.Traits.BotModules.Squads { - public enum SquadCAType { Assault, Air, Rush, Protection, Naval } + public enum SquadCAType { Assault, Air, Rush, Protection, Naval, Harass } public class SquadCA { - public List Units = new List(); + public HashSet Units = new(); public SquadCAType Type; internal IBot Bot; internal World World; internal SquadManagerBotModuleCA SquadManager; internal MersenneTwister Random; - - internal Target Target; internal StateMachineCA FuzzyStateMachine; + /// + /// Target location to attack. This will be either the targeted actor, + /// or a position close to that actor sufficient to get within weapons range. + /// + internal Target Target { get; set; } + + /// + /// Actor that is targeted, for any actor based checks. Use for a targeting location. + /// + internal Actor TargetActor; + + // lists used for air squads to determine what members should be doing + public HashSet NewUnits = new HashSet(); + public HashSet WaitingUnits = new HashSet(); + public HashSet RearmingUnits = new HashSet(); + + // squad leader + Actor leader; + public Locomotor LeaderLocomotor { get; private set; } + + /// + /// Elects a unit to lead the squad, other units in the squad will regroup to the leader if they start to spread out. + /// The leader remains the same unless a new one is forced or the leader is no longer part of the squad. + /// + public Actor GetLeader() + { + if (leader == null || !Units.Contains(leader)) + { + leader = NewLeader(this); + LeaderLocomotor = leader?.TraitOrDefault()?.Locomotor; + } + + return leader; + } + + static Actor NewLeader(SquadCA owner) + { + IEnumerable units = owner.Units; + + // Identify the Locomotor with the most restrictive passable terrain list. For squads with mixed + // locomotors, we hope to choose the most restrictive option. This means we won't nominate a leader who has + // more options. This avoids situations where we would nominate a hovercraft as the leader and tanks would + // fail to follow it because they can't go over water. By forcing us to choose a unit with limited movement + // options, we maximise the chance other units will be able to follow it. We could still be screwed if the + // squad has a mix of units with disparate movement, e.g. land units and naval units. We must trust the + // squad has been formed from a set of units that don't suffer this problem. + + // not really necessary for CA + /* + var leastCommonDenominator = units + .Select(a => a.TraitOrDefault()?.Locomotor) + .Where(l => l != null) + .MinByOrDefault(l => l.Info.TerrainSpeeds.Count) + ?.Info.TerrainSpeeds.Count; + + if (leastCommonDenominator != null) + units = units.Where(a => a.TraitOrDefault()?.Locomotor.Info.TerrainSpeeds.Count == leastCommonDenominator).ToList(); + */ + + var minSpeed = units + .Select(a => a.TraitOrDefault()?.Info.Speed) + .MinByOrDefault(s => s ?? int.MaxValue); + + if (minSpeed != null) + units = units.Where(a => a.TraitOrDefault()?.Info.Speed == minSpeed).ToList(); + + // Choosing a unit in the center reduces the need for an immediate regroup. + var centerPosition = units.Select(a => a.CenterPosition).Average(); + return units.MinBy(a => (a.CenterPosition - centerPosition).LengthSquared); + } + public SquadCA(IBot bot, SquadManagerBotModuleCA squadManager, SquadCAType type) - : this(bot, squadManager, type, null) { } + : this(bot, squadManager, type, default) { } - public SquadCA(IBot bot, SquadManagerBotModuleCA squadManager, SquadCAType type, Actor target) + public SquadCA(IBot bot, SquadManagerBotModuleCA squadManager, SquadCAType type, (Actor Actor, WVec Offset) target) { Bot = bot; SquadManager = squadManager; World = bot.Player.PlayerActor.World; Random = World.LocalRandom; Type = type; - Target = Target.FromActor(target); + SetActorToTarget(target); FuzzyStateMachine = new StateMachineCA(); switch (type) @@ -61,6 +128,9 @@ public SquadCA(IBot bot, SquadManagerBotModuleCA squadManager, SquadCAType type, case SquadCAType.Naval: FuzzyStateMachine.ChangeState(this, new NavyUnitsIdleState(), true); break; + case SquadCAType.Harass: + FuzzyStateMachine.ChangeState(this, new HarasserUnitsIdleStateCA(), true); + break; } } @@ -70,58 +140,105 @@ public void Update() FuzzyStateMachine.Update(this); } - public bool IsValid { get { return Units.Any(); } } + public bool IsValid => Units.Count > 0; - public Actor TargetActor + public void SetActorToTarget((Actor Actor, WVec Offset) target) { - get { return Target.Actor; } - set { Target = Target.FromActor(value); } + TargetActor = target.Actor; + if (TargetActor == null) + { + Target = Target.Invalid; + return; + } + + if (target.Offset == WVec.Zero) + Target = Target.FromActor(TargetActor); + else + Target = Target.FromPos(TargetActor.CenterPosition + target.Offset); } - public bool IsTargetValid + /// + /// Checks the target is still valid, and updates the location if it is still valid. + /// + public bool IsTargetValid(Actor squadUnit) { - get { return Target.IsValidFor(Units.FirstOrDefault()) && !Target.Actor.Info.HasTraitInfo(); } + var valid = + TargetActor != null && + TargetActor.IsInWorld && + !TargetActor.IsDead && + Units.Any(Target.IsValidFor) && + !TargetActor.Info.HasTraitInfo(); + if (!valid) + return false; + + // Refresh the target location. + // If the actor moved out of reach then we'll mark it invalid. + // e.g. a ship targeting a land unit that moves inland out of weapons range. + // or the target crossed a bridge which is then destroyed. + // If it is still in range but we have to target a nearby location, we can update that location. + // e.g. a ship targeting a land unit, but the land unit moved north. + // We need to update our location to move north as well. + // If we can reach the actor directly, we'll just target it directly. + var target = SquadManager.FindEnemies(new[] { TargetActor }, squadUnit).FirstOrDefault(); + SetActorToTarget(target); + return target.Actor != null; } - public bool IsTargetVisible + public bool IsTargetVisible => + TargetActor != null && + TargetActor.CanBeViewedByPlayer(Bot.Player); + + public WPos CenterPosition() { - get { return TargetActor.CanBeViewedByPlayer(Bot.Player); } + return Units.Select(u => u.CenterPosition).Average(); } - public WPos CenterPosition { get { return Units.Select(u => u.CenterPosition).Average(); } } + public Actor CenterUnit() + { + var centerPosition = CenterPosition(); + return Units.MinByOrDefault(a => (a.CenterPosition - centerPosition).LengthSquared); + } public MiniYaml Serialize() { - var nodes = new MiniYaml("", new List() + var nodes = new List() { - new MiniYamlNode("Type", FieldSaver.FormatValue(Type)), - new MiniYamlNode("Units", FieldSaver.FormatValue(Units.Select(a => a.ActorID).ToArray())), - }); + new("Type", FieldSaver.FormatValue(Type)), + new("Units", FieldSaver.FormatValue(Units.Select(a => a.ActorID).ToArray())) + }; - if (Target.Type == TargetType.Actor) - nodes.Nodes.Add(new MiniYamlNode("Target", FieldSaver.FormatValue(Target.Actor.ActorID))); + if (Target.Type != TargetType.Invalid) + { + nodes.Add(new MiniYamlNode("ActorToTarget", FieldSaver.FormatValue(TargetActor.ActorID))); + nodes.Add(new MiniYamlNode("TargetOffset", FieldSaver.FormatValue(Target.CenterPosition - TargetActor.CenterPosition))); + } - return nodes; + return new MiniYaml("", nodes); } public static SquadCA Deserialize(IBot bot, SquadManagerBotModuleCA squadManager, MiniYaml yaml) { var type = SquadCAType.Rush; - Actor targetActor = null; + var target = ((Actor)null, WVec.Zero); - var typeNode = yaml.Nodes.FirstOrDefault(n => n.Key == "Type"); + var typeNode = yaml.NodeWithKeyOrDefault("Type"); if (typeNode != null) type = FieldLoader.GetValue("Type", typeNode.Value.Value); - var targetNode = yaml.Nodes.FirstOrDefault(n => n.Key == "Target"); - if (targetNode != null) - targetActor = squadManager.World.GetActorById(FieldLoader.GetValue("ActiveUnits", targetNode.Value.Value)); + var actorToTargetNode = yaml.NodeWithKeyOrDefault("ActorToTarget"); + var targetOffsetNode = yaml.NodeWithKeyOrDefault("TargetOffset"); + if (actorToTargetNode != null && targetOffsetNode != null) + { + var actorToTarget = squadManager.World.GetActorById(FieldLoader.GetValue("ActorToTarget", actorToTargetNode.Value.Value)); + var targetOffset = FieldLoader.GetValue("TargetOffset", targetOffsetNode.Value.Value); + target = (actorToTarget, targetOffset); + } - var squad = new SquadCA(bot, squadManager, type, targetActor); + var squad = new SquadCA(bot, squadManager, type, target); - var unitsNode = yaml.Nodes.FirstOrDefault(n => n.Key == "Units"); + var unitsNode = yaml.NodeWithKeyOrDefault("Units"); if (unitsNode != null) - squad.Units.AddRange(FieldLoader.GetValue("Units", unitsNode.Value.Value) + squad.Units.UnionWith(FieldLoader.GetValue("Units", unitsNode.Value.Value) .Select(a => squadManager.World.GetActorById(a))); return squad; diff --git a/OpenRA.Mods.CA/Traits/BotModules/Squads/StateMachineCA.cs b/OpenRA.Mods.CA/Traits/BotModules/Squads/StateMachineCA.cs index 5c5867550c..c6a69d9400 100644 --- a/OpenRA.Mods.CA/Traits/BotModules/Squads/StateMachineCA.cs +++ b/OpenRA.Mods.CA/Traits/BotModules/Squads/StateMachineCA.cs @@ -1,11 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2007-2019 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -16,6 +15,8 @@ class StateMachineCA IState currentState; IState previousState; + public IState CurrentState => currentState; + public void Update(SquadCA squad) { if (currentState != null) diff --git a/OpenRA.Mods.CA/Traits/BotModules/Squads/States/AirStatesCA.cs b/OpenRA.Mods.CA/Traits/BotModules/Squads/States/AirStatesCA.cs index 0487082e76..31bdaa4fa4 100644 --- a/OpenRA.Mods.CA/Traits/BotModules/Squads/States/AirStatesCA.cs +++ b/OpenRA.Mods.CA/Traits/BotModules/Squads/States/AirStatesCA.cs @@ -1,17 +1,18 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion +using System; using System.Collections.Generic; using System.Linq; using OpenRA.Mods.Common; +using OpenRA.Mods.Common.Activities; using OpenRA.Mods.Common.Traits; using OpenRA.Primitives; using OpenRA.Traits; @@ -20,46 +21,24 @@ namespace OpenRA.Mods.CA.Traits.BotModules.Squads { abstract class AirStateBaseCA : StateBaseCA { - static readonly BitSet AirTargetTypes = new BitSet("Air"); + static readonly BitSet AirTargetTypes = new("Air"); - protected const int MissileUnitMultiplier = 3; + protected const int StaticAntiAirMultiplier = 4; - protected static int CountAntiAirUnits(IEnumerable units) + protected static int CountStaticAntiAir(IEnumerable units, SquadCA owner) { if (!units.Any()) return 0; - var missileUnitsCount = 0; - foreach (var unit in units) - { - if (unit == null || unit.Info.HasTraitInfo()) - continue; - - foreach (var ab in unit.TraitsImplementing()) - { - if (ab.IsTraitDisabled || ab.IsTraitPaused) - continue; - - foreach (var a in ab.Armaments) - { - if (a.Weapon.IsValidTarget(AirTargetTypes)) - { - missileUnitsCount++; - break; - } - } - } - } - - return missileUnitsCount; + return units.Count(a => owner.SquadManager.Info.StaticAntiAirTypes.Contains(a.Info.Name)) * StaticAntiAirMultiplier; } protected static Actor FindAirTarget(SquadCA owner) { Actor target = null; - var airPriorityChance = owner.World.LocalRandom.Next(0, 100); + var groundTargetPriority = owner.World.LocalRandom.Next(0, 100); - if (airPriorityChance > owner.SquadManager.Info.AirToAirPriority) + if (groundTargetPriority > owner.SquadManager.Info.AirToAirPriority) return target; var leader = owner.Units.FirstOrDefault(); @@ -82,6 +61,24 @@ protected static Actor FindAirTarget(SquadCA owner) if (canAttackAir) { var pos = leader.CenterPosition; + + if (owner.SquadManager.Info.BigAirThreats.Count > 0) + { + var regularTargetPriority = owner.World.LocalRandom.Next(0, 100); + + if (owner.SquadManager.Info.AirToAirPriority > regularTargetPriority) + { + target = owner.World.Actors.Where(a => owner.SquadManager.IsPreferredEnemyAircraft(a) && + owner.SquadManager.IsNotHiddenUnit(a) && + a.IsTargetableBy(leader) && + owner.SquadManager.Info.BigAirThreats.Contains(a.Info.Name)) + .ClosestTo(pos); + } + } + + if (target != null) + return target; + target = owner.World.Actors.Where(a => owner.SquadManager.IsPreferredEnemyAircraft(a) && owner.SquadManager.IsNotHiddenUnit(a) && a.IsTargetableBy(leader)) @@ -93,9 +90,7 @@ protected static Actor FindAirTarget(SquadCA owner) protected static Actor FindDefenselessTarget(SquadCA owner) { - Actor target = null; - - target = FindAirTarget(owner); + var target = FindAirTarget(owner); if (target != null) return target; @@ -115,7 +110,7 @@ protected static Actor FindDefenselessTarget(SquadCA owner) var checkIndices = Exts.MakeArray(columnCount * rowCount, i => i).Shuffle(owner.World.LocalRandom); foreach (var i in checkIndices) { - var pos = new MPos((i % columnCount) * dangerRadius + dangerRadius / 2, (i / columnCount) * dangerRadius + dangerRadius / 2).ToCPos(map); + var pos = new MPos(i % columnCount * dangerRadius + dangerRadius / 2, i / columnCount * dangerRadius + dangerRadius / 2).ToCPos(map); if (NearToPosSafely(owner, map.CenterOfCell(pos), out detectedEnemyTarget)) { @@ -139,14 +134,19 @@ protected static bool NearToPosSafely(SquadCA owner, WPos loc, out Actor detecte detectedEnemyTarget = null; var dangerRadius = owner.SquadManager.Info.DangerScanRadius; var unitsAroundPos = owner.World.FindActorsInCircle(loc, WDist.FromCells(dangerRadius)) - .Where(a => owner.SquadManager.IsPreferredEnemyUnit(a) && owner.SquadManager.IsAirSquadTargetType(a, owner)).ToList(); + .Where(owner.SquadManager.IsPreferredEnemyUnit).ToList(); - if (!unitsAroundPos.Any()) + if (unitsAroundPos.Count == 0) return true; - if (CountAntiAirUnits(unitsAroundPos) * MissileUnitMultiplier < owner.Units.Count) + var possibleTargets = unitsAroundPos.Where(a => owner.SquadManager.IsAirSquadTargetArmorType(a, owner)).ToList(); + var possibleAntiAir = unitsAroundPos.ToList(); + + if (CountStaticAntiAir(possibleAntiAir, owner) < owner.Units.Count) { - detectedEnemyTarget = unitsAroundPos.Random(owner.Random); + if (possibleTargets.Count > 0) + detectedEnemyTarget = possibleTargets.Random(owner.Random); + return true; } @@ -156,7 +156,7 @@ protected static bool NearToPosSafely(SquadCA owner, WPos loc, out Actor detecte // Checks the number of anti air enemies around units protected virtual bool ShouldFlee(SquadCA owner) { - return ShouldFlee(owner, enemies => CountAntiAirUnits(enemies) * MissileUnitMultiplier > owner.Units.Count); + return ShouldFlee(owner, enemies => CountStaticAntiAir(enemies.ToList(), owner) > owner.Units.Count); } } @@ -192,24 +192,31 @@ public void Activate(SquadCA owner) { } public void Tick(SquadCA owner) { + var newTarget = false; + if (!owner.IsValid) return; - if (!owner.IsTargetValid) + var leader = owner.CenterUnit(); + + // target is no longer valid, find a new target + if (!owner.IsTargetValid(leader)) { var closestEnemy = FindAirTarget(owner); - if (closestEnemy == null) { var a = owner.Units.Random(owner.Random); - // copied from FindClosestEnemy() so that non-air squads don't check IsAirSquadTargetType unnecessarily - var units = a.World.Actors.Where(t => owner.SquadManager.IsPreferredEnemyUnit(t) && owner.SquadManager.IsAirSquadTargetType(t, owner)); + // copied from FindClosestEnemy() so that non-air squads don't check IsAirSquadTargetArmorType unnecessarily + var units = a.World.Actors.Where(t => owner.SquadManager.IsPreferredEnemyUnit(t) && owner.SquadManager.IsAirSquadTargetArmorType(t, owner)); closestEnemy = units.Where(owner.SquadManager.IsNotHiddenUnit).ClosestTo(a.CenterPosition) ?? units.ClosestTo(a.CenterPosition); } if (closestEnemy != null) + { owner.TargetActor = closestEnemy; + newTarget = true; + } else { owner.FuzzyStateMachine.ChangeState(owner, new AirFleeStateCA(), true); @@ -225,24 +232,83 @@ public void Tick(SquadCA owner) foreach (var a in owner.Units) { - if (BusyAttack(a)) - continue; + var currentActivity = a.CurrentActivity; + var activityType = currentActivity?.GetType(); var ammoPools = a.TraitsImplementing().ToArray(); if (!ReloadsAutomatically(ammoPools, a.TraitOrDefault())) { - if (IsRearming(a)) + if (!HasAmmo(ammoPools) && !owner.RearmingUnits.Contains(a)) + { + owner.RearmingUnits.Add(a); + owner.WaitingUnits.Remove(a); + owner.NewUnits.Remove(a); + owner.Bot.QueueOrder(new Order("ReturnToBase", a, false)); + continue; + } + + if (owner.NewUnits.Contains(a)) + { + owner.WaitingUnits.Add(a); + owner.NewUnits.Remove(a); + owner.Bot.QueueOrder(new Order("Move", a, Target.FromCell(owner.World, RandomBuildingLocation(owner)), false)); + } + + if (owner.WaitingUnits.Contains(a)) continue; - if (!HasAmmo(ammoPools)) + if (owner.RearmingUnits.Contains(a)) { - owner.Bot.QueueOrder(new Order("ReturnToBase", a, false)); + if (FullAmmo(ammoPools)) + { + owner.RearmingUnits.Remove(a); + owner.WaitingUnits.Add(a); + owner.Bot.QueueOrder(new Order("Move", a, Target.FromCell(owner.World, RandomBuildingLocation(owner)), false)); + } + else + owner.Bot.QueueOrder(new Order("ReturnToBase", a, false)); + continue; } + + // target switched or not attacking, attack the target + if ((newTarget || activityType != typeof(FlyAttack)) && CanAttackTarget(a, owner.TargetActor)) + owner.Bot.QueueOrder(new Order("Attack", a, Target.FromActor(owner.TargetActor), false)); + else if (activityType == typeof(FlyIdle)) + { + owner.RearmingUnits.Add(a); + owner.Bot.QueueOrder(new Order("ReturnToBase", a, false)); + } } + else + owner.WaitingUnits.Add(a); + } + + var firstUnit = owner.Units.FirstOrDefault(); + var buildableInfo = firstUnit.Info.TraitInfoOrDefault(); + var limitOne = buildableInfo != null && buildableInfo.BuildLimit == 1; + + var waitingCount = owner.WaitingUnits.Count; + + var waitingPatience = 99; + if (waitingCount > 7) + waitingPatience = 65; + else if (waitingCount > 3) + waitingPatience = 85; + else if (waitingCount > 1) + waitingPatience = 95; + + var impatience = owner.World.LocalRandom.Next(100); + var noPatience = impatience > waitingPatience; + Func canBuildMoreOfAircraft = () => firstUnit != null && !limitOne && owner.SquadManager.CanBuildMoreOfAircraft(firstUnit.Info); + + if (owner.WaitingUnits.Count > 0 && owner.WaitingUnits.Count >= owner.RearmingUnits.Count && (noPatience || !canBuildMoreOfAircraft())) + { + foreach (var a in owner.WaitingUnits) + if (CanAttackTarget(a, owner.TargetActor)) + owner.Bot.QueueOrder(new Order("Attack", a, Target.FromActor(owner.TargetActor), false)); - if (CanAttackTarget(a, owner.TargetActor)) - owner.Bot.QueueOrder(new Order("Attack", a, Target.FromActor(owner.TargetActor), false)); + owner.WaitingUnits.Clear(); } } diff --git a/OpenRA.Mods.CA/Traits/BotModules/Squads/States/GroundStatesCA.cs b/OpenRA.Mods.CA/Traits/BotModules/Squads/States/GroundStatesCA.cs index 248f8d7c9a..c114b5d934 100644 --- a/OpenRA.Mods.CA/Traits/BotModules/Squads/States/GroundStatesCA.cs +++ b/OpenRA.Mods.CA/Traits/BotModules/Squads/States/GroundStatesCA.cs @@ -1,33 +1,54 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion +using System; +using System.Collections.Generic; using System.Linq; +using OpenRA.Mods.Common.Traits; using OpenRA.Traits; namespace OpenRA.Mods.CA.Traits.BotModules.Squads { - abstract class GroundStateBaseCA : StateBaseCA + public class SquadRouteInfo + { + public List CurrentRoute { get; set; } + public List> AlternativeRoutes { get; set; } + public int CurrentWaypointIndex { get; set; } + } + + public abstract class GroundStateBaseCA : StateBaseCA { protected virtual bool ShouldFlee(SquadCA owner) { return ShouldFlee(owner, enemies => !AttackOrFleeFuzzyCA.Default.CanAttack(owner.Units, enemies)); } - protected Actor FindClosestEnemy(SquadCA owner) + protected (Actor Actor, WVec Offset) NewLeaderAndFindClosestEnemy(SquadCA owner, bool highValueCheck = false) + { + return owner.SquadManager.FindClosestEnemy(owner.GetLeader(), highValueCheck); + } + + protected IEnumerable<(Actor Actor, WVec Offset)> FindEnemies(SquadCA owner, IEnumerable actors) + { + return owner.SquadManager.FindEnemies( + actors, + owner.GetLeader()); + } + + protected static Actor ClosestToEnemy(SquadCA owner) { - return owner.SquadManager.FindClosestEnemy(owner.Units.First().CenterPosition); + return SquadManagerBotModuleCA.ClosestTo(owner.Units, owner.TargetActor); } } - class GroundUnitsIdleStateCA : GroundStateBaseCA, IState + sealed class GroundUnitsIdleStateCA : GroundStateBaseCA, IState { public void Activate(SquadCA owner) { } @@ -36,40 +57,65 @@ public void Tick(SquadCA owner) if (!owner.IsValid) return; - if (!owner.IsTargetValid) + var leader = owner.GetLeader(); + + if (!owner.IsTargetValid(leader)) { - var closestEnemy = FindClosestEnemy(owner); - if (closestEnemy == null) + var closestEnemy = NewLeaderAndFindClosestEnemy(owner, true); + owner.SetActorToTarget(closestEnemy); + if (closestEnemy.Actor == null) return; - - owner.TargetActor = closestEnemy; } - var enemyUnits = owner.World.FindActorsInCircle(owner.TargetActor.CenterPosition, WDist.FromCells(owner.SquadManager.Info.IdleScanRadius)) - .Where(owner.SquadManager.IsPreferredEnemyUnit).ToList(); + owner.FuzzyStateMachine.ChangeState(owner, new GroundUnitsAttackMoveStateCA(), true); + + /* + var enemyUnits = + FindEnemies(owner, + owner.World.FindActorsInCircle(owner.Target.CenterPosition, WDist.FromCells(owner.SquadManager.Info.IdleScanRadius))) + .Select(x => x.Actor) + .ToList(); if (enemyUnits.Count == 0) return; if (AttackOrFleeFuzzyCA.Default.CanAttack(owner.Units, enemyUnits)) { - owner.Bot.QueueOrder(new Order("AttackMove", null, Target.FromCell(owner.World, owner.TargetActor.Location), false, groupedActors: owner.Units.ToArray())); + owner.Bot.QueueOrder(new Order("AttackMove", null, owner.Target, false, groupedActors: owner.Units.ToArray())); // We have gathered sufficient units. Attack the nearest enemy unit. owner.FuzzyStateMachine.ChangeState(owner, new GroundUnitsAttackMoveStateCA(), true); } else owner.FuzzyStateMachine.ChangeState(owner, new GroundUnitsFleeStateCA(), true); + */ } public void Deactivate(SquadCA owner) { } } - class GroundUnitsAttackMoveStateCA : GroundStateBaseCA, IState + public sealed class GroundUnitsAttackMoveStateCA : GroundStateBaseCA, IState { int lastUpdatedTick; CPos? lastLeaderLocation; Actor lastTarget; + List currentRoute; + List> allRoutes; + int currentWaypointIndex; + int lastWaypointUpdateTick; + + public SquadRouteInfo GetRouteInfo() + { + if (currentRoute == null || allRoutes == null) + return new SquadRouteInfo(); + + return new SquadRouteInfo + { + CurrentRoute = currentRoute, + AlternativeRoutes = allRoutes.Where(r => r != currentRoute).ToList(), + CurrentWaypointIndex = currentWaypointIndex + }; + } public void Activate(SquadCA owner) { } @@ -78,67 +124,137 @@ public void Tick(SquadCA owner) if (!owner.IsValid) return; - if (!owner.IsTargetValid) + var leader = owner.GetLeader(); + + if (!owner.IsTargetValid(leader)) { - var closestEnemy = FindClosestEnemy(owner); - if (closestEnemy != null) - owner.TargetActor = closestEnemy; - else + var closestEnemy = NewLeaderAndFindClosestEnemy(owner, owner.Type == SquadCAType.Harass); + owner.SetActorToTarget(closestEnemy); + if (closestEnemy.Actor == null) { owner.FuzzyStateMachine.ChangeState(owner, new GroundUnitsFleeStateCA(), true); return; } } - var leader = owner.Units.ClosestTo(owner.TargetActor.CenterPosition); - if (leader == null) - return; - if (leader.Location != lastLeaderLocation) { lastLeaderLocation = leader.Location; lastUpdatedTick = owner.World.WorldTick; } + var targetChanged = false; if (owner.TargetActor != lastTarget) { lastTarget = owner.TargetActor; lastUpdatedTick = owner.World.WorldTick; + targetChanged = true; } - // HACK: Drop back to the idle state if we haven't moved in 2.5 seconds + // HACK: Drop back to the idle state if we haven't moved in 4 seconds // This works around the squad being stuck trying to attack-move to a location // that they cannot path to, generating expensive pathfinding calls each tick. - if (owner.World.WorldTick > lastUpdatedTick + 63) + if (owner.World.WorldTick > lastUpdatedTick + 100) { owner.FuzzyStateMachine.ChangeState(owner, new GroundUnitsIdleStateCA(), true); return; } - var ownUnits = owner.World.FindActorsInCircle(leader.CenterPosition, WDist.FromCells(owner.Units.Count) / 3) - .Where(a => a.Owner == owner.Units.First().Owner && owner.Units.Contains(a)).ToHashSet(); + // If there are enemies within attack scan radius, attack them + var opportunityTarget = owner.SquadManager.FindClosestEnemy(leader, WDist.FromCells(owner.SquadManager.Info.AttackScanRadius)); + if (opportunityTarget.Actor != null) + { + owner.SetActorToTarget(opportunityTarget); + owner.FuzzyStateMachine.ChangeState(owner, new GroundUnitsAttackState(), true); + return; + } - if (ownUnits.Count < owner.Units.Count) + // Calculate less direct routes + if ((currentRoute == null || targetChanged) && owner.LeaderLocomotor != null) { - // Since units have different movement speeds, they get separated while approaching the target. - // Let them regroup into tighter formation. - owner.Bot.QueueOrder(new Order("Stop", leader, false)); + // Get the closest friendly building to the target to use as the starting point + var friendlyBuildings = owner.World.Actors.Where(a => a.Owner == owner.Bot.Player && a.Info.HasTraitInfo()); + var possibleStartActors = friendlyBuildings.Concat(new[] { owner.GetLeader() }); + var startActor = WorldUtils.ClosestToIgnoringPath(possibleStartActors, owner.TargetActor); + var startLocation = startActor != null ? startActor.Location : leader.Location; + var maxRoutes = 2; + var useIndirectRoutes = false; + + if (owner.Type == SquadCAType.Harass) { + maxRoutes = 12; + } else if (owner.SquadManager.Info.IndirectRouteChance > 0 && owner.World.LocalRandom.Next(100) < owner.SquadManager.Info.IndirectRouteChance) { + useIndirectRoutes = true; + maxRoutes = 7; + } - var units = owner.Units.Where(a => !ownUnits.Contains(a)).ToArray(); - owner.Bot.QueueOrder(new Order("AttackMove", null, Target.FromCell(owner.World, leader.Location), false, groupedActors: units)); + var routes = AIUtils.FindDistinctRoutes( + owner.World, + owner.LeaderLocomotor, + startLocation, + owner.TargetActor.Location, + maxRoutes: maxRoutes, + BlockedByActor.None); + + // Store all routes for the overlay + allRoutes = new List>(); + foreach (var r in routes) + allRoutes.Add(r.Skip(1).ToList()); + + // For harass squads, randomly select from the 2 last routes in the list + if (owner.Type == SquadCAType.Harass) + routes = routes.Skip(Math.Max(0, routes.Count - 2)).Take(2).ToList(); + // If we're using indirect routes, exclude the first (most direct) route + else if (useIndirectRoutes) + routes = routes.Skip(1).ToList(); + + if (routes.Count > 0) + { + currentRoute = routes.Random(owner.World.LocalRandom); + currentRoute = currentRoute.Skip(1).ToList(); + + if (currentRoute.Count == 0) + { + currentRoute = null; + allRoutes = null; + } + else + { + currentWaypointIndex = 0; + lastWaypointUpdateTick = owner.World.WorldTick; + } + } + else + { + currentRoute = null; + allRoutes = null; + } } - else + + // Follow waypoints in the route if we have one + if (currentRoute != null + && currentRoute.Count > 2 + && currentWaypointIndex < currentRoute.Count - 1) { - var enemies = owner.World.FindActorsInCircle(leader.CenterPosition, WDist.FromCells(owner.SquadManager.Info.AttackScanRadius)) - .Where(owner.SquadManager.IsPreferredEnemyUnit); - var target = enemies.ClosestTo(leader.CenterPosition); - if (target != null) + // Move to next waypoint if close enough to current one (4 cells) + if ((leader.Location - currentRoute[currentWaypointIndex]).LengthSquared < 16 + || owner.World.WorldTick > lastWaypointUpdateTick + 625) // or stuck for 25 seconds { - owner.TargetActor = target; - owner.FuzzyStateMachine.ChangeState(owner, new GroundUnitsAttackState(), true); + currentWaypointIndex++; + lastWaypointUpdateTick = owner.World.WorldTick; } - else - owner.Bot.QueueOrder(new Order("AttackMove", null, Target.FromCell(owner.World, owner.TargetActor.Location), false, groupedActors: owner.Units.ToArray())); + + var waypoint = currentRoute[currentWaypointIndex]; + + owner.Bot.QueueOrder(new Order("AttackMove", null, Target.FromCell(owner.World, waypoint), false, + groupedActors: owner.Units.ToArray())); + } + else + { + currentRoute = null; + + // No route available or route too short, use direct attack move + owner.Bot.QueueOrder(new Order("AttackMove", null, owner.Target, false, + groupedActors: owner.Units.ToArray())); } if (ShouldFlee(owner)) @@ -148,7 +264,7 @@ public void Tick(SquadCA owner) public void Deactivate(SquadCA owner) { } } - class GroundUnitsAttackState : GroundStateBaseCA, IState + sealed class GroundUnitsAttackState : GroundStateBaseCA, IState { int lastUpdatedTick; CPos? lastLeaderLocation; @@ -161,19 +277,20 @@ public void Tick(SquadCA owner) if (!owner.IsValid) return; - if (!owner.IsTargetValid) + var leader = owner.GetLeader(); + + if (!owner.IsTargetValid(leader)) { - var closestEnemy = FindClosestEnemy(owner); - if (closestEnemy != null) - owner.TargetActor = closestEnemy; - else + var opportunityTarget = owner.SquadManager.FindClosestEnemy(leader, WDist.FromCells(owner.SquadManager.Info.AttackScanRadius)); + if (opportunityTarget.Actor == null) { - owner.FuzzyStateMachine.ChangeState(owner, new GroundUnitsFleeStateCA(), true); + owner.FuzzyStateMachine.ChangeState(owner, new GroundUnitsAttackMoveStateCA(), true); return; } + + owner.SetActorToTarget(opportunityTarget); } - var leader = owner.Units.ClosestTo(owner.TargetActor.CenterPosition); if (leader.Location != lastLeaderLocation) { lastLeaderLocation = leader.Location; @@ -186,10 +303,10 @@ public void Tick(SquadCA owner) lastUpdatedTick = owner.World.WorldTick; } - // HACK: Drop back to the idle state if we haven't moved in 2.5 seconds + // HACK: Drop back to the idle state if we haven't moved in 4 seconds // This works around the squad being stuck trying to attack-move to a location // that they cannot path to, generating expensive pathfinding calls each tick. - if (owner.World.WorldTick > lastUpdatedTick + 63) + if (owner.World.WorldTick > lastUpdatedTick + 100) { owner.FuzzyStateMachine.ChangeState(owner, new GroundUnitsIdleStateCA(), true); return; @@ -197,7 +314,7 @@ public void Tick(SquadCA owner) foreach (var a in owner.Units) if (!BusyAttack(a)) - owner.Bot.QueueOrder(new Order("Attack", a, Target.FromActor(owner.TargetActor), false)); + owner.Bot.QueueOrder(new Order("AttackMove", a, owner.Target, false)); if (ShouldFlee(owner)) owner.FuzzyStateMachine.ChangeState(owner, new GroundUnitsFleeStateCA(), true); @@ -206,7 +323,7 @@ public void Tick(SquadCA owner) public void Deactivate(SquadCA owner) { } } - class GroundUnitsFleeStateCA : GroundStateBaseCA, IState + sealed class GroundUnitsFleeStateCA : GroundStateBaseCA, IState { public void Activate(SquadCA owner) { } @@ -219,6 +336,52 @@ public void Tick(SquadCA owner) owner.FuzzyStateMachine.ChangeState(owner, new GroundUnitsIdleStateCA(), true); } - public void Deactivate(SquadCA owner) { owner.Units.Clear(); } + public void Deactivate(SquadCA owner) { owner.SquadManager.UnregisterSquad(owner); } + } + + sealed class HarasserUnitsIdleStateCA : GroundStateBaseCA, IState + { + public void Activate(SquadCA owner) { } + + public void Tick(SquadCA owner) + { + if (!owner.IsValid) + return; + + var leader = owner.GetLeader(); + + if (!ShouldHarass(owner)) + return; + + if (!owner.IsTargetValid(leader)) + { + var closestEnemy = NewLeaderAndFindClosestEnemy(owner, true); + owner.SetActorToTarget(closestEnemy); + if (closestEnemy.Actor == null) + return; + } + + owner.FuzzyStateMachine.ChangeState(owner, new GroundUnitsAttackMoveStateCA(), true); + } + + bool ShouldHarass(SquadCA owner) + { + switch (owner.Units.Count) + { + case 0: + case 1: + case 2: + return false; + case 3: + return owner.World.LocalRandom.Next(100) < 5; + case 4: + return owner.World.LocalRandom.Next(100) < 10; + case 5: + default: + return true; + } + } + + public void Deactivate(SquadCA owner) { } } } diff --git a/OpenRA.Mods.CA/Traits/BotModules/Squads/States/NavyStatesCA.cs b/OpenRA.Mods.CA/Traits/BotModules/Squads/States/NavyStatesCA.cs index 1e610a2780..a2b1c3639d 100644 --- a/OpenRA.Mods.CA/Traits/BotModules/Squads/States/NavyStatesCA.cs +++ b/OpenRA.Mods.CA/Traits/BotModules/Squads/States/NavyStatesCA.cs @@ -1,11 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -30,17 +29,16 @@ protected Actor FindClosestEnemy(SquadCA owner) // Navy squad AI can exploit enemy naval production to find path, if any. // (Way better than finding a nearest target which is likely to be on Ground) // You might be tempted to move these lookups into Activate() but that causes null reference exception. - var domainIndex = first.World.WorldActor.Trait(); - var locomotor = first.Trait().Locomotor; + var mobile = first.Trait(); var navalProductions = owner.World.ActorsHavingTrait().Where(a => owner.SquadManager.Info.NavalProductionTypes.Contains(a.Info.Name) - && domainIndex.IsPassable(first.Location, a.Location, locomotor) + && mobile.PathFinder.PathExistsForLocomotor(mobile.Locomotor, first.Location, a.Location) && a.AppearsHostileTo(first)); if (navalProductions.Any()) { - var nearest = navalProductions.ClosestTo(first); + var nearest = navalProductions.ClosestTo(first.CenterPosition); // Return nearest when it is FAR enough. // If the naval production is within MaxBaseRadius, it implies that @@ -50,7 +48,7 @@ protected Actor FindClosestEnemy(SquadCA owner) return nearest; } - return owner.SquadManager.FindClosestEnemy(first.CenterPosition); + return owner.SquadManager.FindClosestEnemy(first).Actor; } } @@ -63,7 +61,8 @@ public void Tick(SquadCA owner) if (!owner.IsValid) return; - if (!owner.IsTargetValid) + var leader = owner.CenterUnit(); + if (!owner.IsTargetValid(leader)) { var closestEnemy = FindClosestEnemy(owner); if (closestEnemy == null) @@ -105,7 +104,8 @@ public void Tick(SquadCA owner) if (!owner.IsValid) return; - if (!owner.IsTargetValid) + var leader = owner.CenterUnit(); + if (!owner.IsTargetValid(leader)) { var closestEnemy = FindClosestEnemy(owner); if (closestEnemy != null) @@ -117,13 +117,13 @@ public void Tick(SquadCA owner) } } - var leader = owner.Units.ClosestTo(owner.TargetActor.CenterPosition); - if (leader == null) + var attackLeader = owner.Units.ClosestTo(owner.TargetActor.CenterPosition); + if (attackLeader == null) return; - if (leader.Location != lastLeaderLocation) + if (attackLeader.Location != lastLeaderLocation) { - lastLeaderLocation = leader.Location; + lastLeaderLocation = attackLeader.Location; lastUpdatedTick = owner.World.WorldTick; } @@ -145,28 +145,16 @@ public void Tick(SquadCA owner) var ownUnits = owner.World.FindActorsInCircle(leader.CenterPosition, WDist.FromCells(owner.Units.Count) / 3) .Where(a => a.Owner == owner.Units.First().Owner && owner.Units.Contains(a)).ToHashSet(); - if (ownUnits.Count < owner.Units.Count) - { - // Since units have different movement speeds, they get separated while approaching the target. - // Let them regroup into tighter formation. - owner.Bot.QueueOrder(new Order("Stop", leader, false)); - - var units = owner.Units.Where(a => !ownUnits.Contains(a)).ToArray(); - owner.Bot.QueueOrder(new Order("AttackMove", null, Target.FromCell(owner.World, leader.Location), false, groupedActors: units)); - } - else - { - var enemies = owner.World.FindActorsInCircle(leader.CenterPosition, WDist.FromCells(owner.SquadManager.Info.AttackScanRadius)) - .Where(owner.SquadManager.IsPreferredEnemyUnit); - var target = enemies.ClosestTo(leader.CenterPosition); - if (target != null) + var enemies = owner.World.FindActorsInCircle(leader.CenterPosition, WDist.FromCells(owner.SquadManager.Info.AttackScanRadius)) + .Where(owner.SquadManager.IsPreferredEnemyUnit); + var target = enemies.ClosestTo(leader.CenterPosition); + if (target != null) { owner.TargetActor = target; owner.FuzzyStateMachine.ChangeState(owner, new NavyUnitsAttackStateCA(), true); } else owner.Bot.QueueOrder(new Order("AttackMove", null, Target.FromCell(owner.World, owner.TargetActor.Location), false, groupedActors: owner.Units.ToArray())); - } if (ShouldFlee(owner)) owner.FuzzyStateMachine.ChangeState(owner, new NavyUnitsFleeStateCA(), true); @@ -188,7 +176,8 @@ public void Tick(SquadCA owner) if (!owner.IsValid) return; - if (!owner.IsTargetValid) + var leader = owner.CenterUnit(); + if (!owner.IsTargetValid(leader)) { var closestEnemy = FindClosestEnemy(owner); if (closestEnemy != null) @@ -200,10 +189,10 @@ public void Tick(SquadCA owner) } } - var leader = owner.Units.ClosestTo(owner.TargetActor.CenterPosition); - if (leader.Location != lastLeaderLocation) + var attackLeader = owner.Units.ClosestTo(owner.TargetActor.CenterPosition); + if (attackLeader.Location != lastLeaderLocation) { - lastLeaderLocation = leader.Location; + lastLeaderLocation = attackLeader.Location; lastUpdatedTick = owner.World.WorldTick; } diff --git a/OpenRA.Mods.CA/Traits/BotModules/Squads/States/ProtectionStatesCA.cs b/OpenRA.Mods.CA/Traits/BotModules/Squads/States/ProtectionStatesCA.cs index d19111c15a..0fcd82f123 100644 --- a/OpenRA.Mods.CA/Traits/BotModules/Squads/States/ProtectionStatesCA.cs +++ b/OpenRA.Mods.CA/Traits/BotModules/Squads/States/ProtectionStatesCA.cs @@ -1,15 +1,14 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion -using OpenRA.Traits; +using System.Linq; namespace OpenRA.Mods.CA.Traits.BotModules.Squads { @@ -32,10 +31,12 @@ public void Tick(SquadCA owner) if (!owner.IsValid) return; - if (!owner.IsTargetValid) - { - owner.TargetActor = owner.SquadManager.FindClosestEnemy(owner.CenterPosition, WDist.FromCells(owner.SquadManager.Info.ProtectionScanRadius)); + var leader = owner.GetLeader(); + if (!owner.IsTargetValid(leader)) + { + var target = owner.SquadManager.FindClosestEnemy(leader, WDist.FromCells(owner.SquadManager.Info.ProtectionScanRadius)); + owner.SetActorToTarget(target); if (owner.TargetActor == null) { owner.FuzzyStateMachine.ChangeState(owner, new UnitsForProtectionFleeState(), true); @@ -55,7 +56,7 @@ public void Tick(SquadCA owner) Backoff--; } else - owner.Bot.QueueOrder(new Order("AttackMove", null, Target.FromCell(owner.World, owner.TargetActor.Location), false, groupedActors: owner.Units.ToArray())); + owner.Bot.QueueOrder(new Order("AttackMove", null, owner.Target, false, groupedActors: owner.Units.ToArray())); } public void Deactivate(SquadCA owner) { } diff --git a/OpenRA.Mods.CA/Traits/BotModules/Squads/States/StateBaseCA.cs b/OpenRA.Mods.CA/Traits/BotModules/Squads/States/StateBaseCA.cs index 75d08d3bc2..27b636b6de 100644 --- a/OpenRA.Mods.CA/Traits/BotModules/Squads/States/StateBaseCA.cs +++ b/OpenRA.Mods.CA/Traits/BotModules/Squads/States/StateBaseCA.cs @@ -1,11 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -18,13 +17,13 @@ namespace OpenRA.Mods.CA.Traits.BotModules.Squads { - abstract class StateBaseCA + public abstract class StateBaseCA { protected static void GoToRandomOwnBuilding(SquadCA squad) { var loc = RandomBuildingLocation(squad); foreach (var a in squad.Units) - squad.Bot.QueueOrder(new Order("Move", a, Target.FromCell(squad.World, loc), false)); + squad.Bot.QueueOrder(new Order("AttackMove", a, Target.FromCell(squad.World, loc), false)); } protected static CPos RandomBuildingLocation(SquadCA squad) @@ -86,18 +85,19 @@ protected virtual bool ShouldFlee(SquadCA squad, Func, bool> if (!squad.IsValid) return false; - var randomSquadUnit = squad.Units.Random(squad.Random); var dangerRadius = squad.SquadManager.Info.DangerScanRadius; - var units = squad.World.FindActorsInCircle(randomSquadUnit.CenterPosition, WDist.FromCells(dangerRadius)).ToList(); + var units = squad.World.FindActorsInCircle(squad.CenterPosition(), WDist.FromCells(dangerRadius)).ToList(); // If there are any own buildings within the DangerRadius, don't flee // PERF: Avoid LINQ foreach (var u in units) - if ((u.Owner == squad.Bot.Player && u.Info.HasTraitInfo())) + if (u.Owner == squad.Bot.Player && u.Info.HasTraitInfo()) return false; - var enemyAroundUnit = units.Where(unit => squad.SquadManager.IsPreferredEnemyUnit(unit) && unit.Info.HasTraitInfo()); - if (!enemyAroundUnit.Any()) + var enemyAroundUnit = units + .Where(unit => squad.SquadManager.IsPreferredEnemyUnit(unit) && unit.Info.HasTraitInfo()) + .ToList(); + if (enemyAroundUnit.Count == 0) return false; return flee(enemyAroundUnit); @@ -105,21 +105,7 @@ protected virtual bool ShouldFlee(SquadCA squad, Func, bool> protected static bool IsRearming(Actor a) { - if (a.IsIdle) - return false; - - var activity = a.CurrentActivity; - if (activity.GetType() == typeof(Resupply)) - return true; - - var next = activity.NextActivity; - if (next == null) - return false; - - if (next.GetType() == typeof(Resupply)) - return true; - - return false; + return !a.IsIdle && (a.CurrentActivity.ActivitiesImplementing().Any() || a.CurrentActivity.ActivitiesImplementing().Any()); } protected static bool FullAmmo(IEnumerable ammoPools) @@ -134,10 +120,10 @@ protected static bool FullAmmo(IEnumerable ammoPools) protected static bool HasAmmo(IEnumerable ammoPools) { foreach (var ap in ammoPools) - if (!ap.HasAmmo) - return false; + if (ap.HasAmmo) + return true; - return true; + return false; } protected static bool ReloadsAutomatically(IEnumerable ammoPools, Rearmable rearmable) @@ -146,7 +132,7 @@ protected static bool ReloadsAutomatically(IEnumerable ammoPools, Rear return true; foreach (var ap in ammoPools) - if (!rearmable.Info.AmmoPools.Contains(ap.Info.Name)) + if (rearmable.Info.AmmoPools.Contains(ap.Info.Name)) return false; return true; diff --git a/OpenRA.Mods.CA/Traits/BotModules/UnitBuilderBotModuleCA.cs b/OpenRA.Mods.CA/Traits/BotModules/UnitBuilderBotModuleCA.cs index 0856ad3e27..5c62fb1090 100644 --- a/OpenRA.Mods.CA/Traits/BotModules/UnitBuilderBotModuleCA.cs +++ b/OpenRA.Mods.CA/Traits/BotModules/UnitBuilderBotModuleCA.cs @@ -1,14 +1,14 @@ #region Copyright & License Information -/* - * Copyright 2007-2019 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion +using System; using System.Collections.Generic; using System.Linq; using OpenRA.Mods.Common; @@ -27,9 +27,9 @@ public class UnitBuilderBotModuleCAInfo : ConditionalTraitInfo public readonly int IdleBaseUnitsMaximum = 12; [Desc("Production queues AI uses for producing units.")] - public readonly HashSet UnitQueues = new HashSet { "Vehicle", "Infantry", "Plane", "Ship", "Aircraft" }; + public readonly string[] UnitQueues = { "VehicleSQ", "InfantrySQ", "AircraftSQ", "ShipSQ", "VehicleMQ", "InfantryMQ", "AircraftMQ", "ShipMQ" }; - [Desc("What units to the AI should build.", "What relative share of the total army must be this type of unit.")] + [Desc("Fallback unit shares used when CompositionsBotModule is missing or empty.")] public readonly Dictionary UnitsToBuild = null; [Desc("What units should the AI have a maximum limit to train.")] @@ -38,29 +38,74 @@ public class UnitBuilderBotModuleCAInfo : ConditionalTraitInfo [Desc("When should the AI start train specific units.")] public readonly Dictionary UnitDelays = null; + [Desc("Minimum duration between building a specific unit.")] + public readonly Dictionary UnitIntervals = null; + [Desc("How often should the unit builder check to build more units")] public readonly int UnitBuilderInterval = 0; - [Desc("Mininum amount of credits in reserve for the Unit Builder to be active.")] - public readonly int UnitBuilderMinCredits = 2000; + [Desc("Only queue construction of a new unit when above this requirement.")] + public readonly int ProductionMinCashRequirement = 2000; + + [Desc("Only queue construction of a new unit when above this requirement.")] + public readonly int MaximiseProductionCashRequirement = 10000; - [Desc("Maximum number of aircraft AI can build.")] + [Desc("Maximum number of aircraft AI can build.", + "If MaintainAirSuperiority is true this only applies to units not listed in AirToAirUnits.")] public readonly int MaxAircraft = 4; + [Desc("If true, will always attempt to match the number of enemy air threats.")] + public readonly bool MaintainAirSuperiority = false; + + [Desc("If MaintainAirSuperiority is true and this is non-zero,", + "sets an upper limit for the number of air superiority aircraft.")] + public readonly int MaxAirSuperiority = 0; + + [Desc("List of actor types to be used for air superiority.")] + public readonly HashSet AirToAirUnits = new HashSet(); + + [Desc("List of actor types to measure against for air superiority.")] + public readonly HashSet AirThreatUnits = new HashSet(); + + [Desc("If true, the bot will use compositions defined in the UnitCompositionsBotModule to determine what units to build.", + "If false, the bot will ignore compositions and just use UnitsToBuild.")] + public readonly bool UseCompositions = true; + + [Desc("Minimum ticks before selecting a new non-baseline composition.")] + public readonly int MinCompositionSelectInterval = 750; + + [Desc("Maximum ticks before selecting a new non-baseline composition.")] + public readonly int MaxCompositionSelectInterval = 7500; + public override object Create(ActorInitializer init) { return new UnitBuilderBotModuleCA(init.Self, this); } } - public class UnitBuilderBotModuleCA : ConditionalTrait, IBotTick, IBotNotifyIdleBaseUnits, IBotRequestUnitProduction, IGameSaveTraitData + public class UnitBuilderBotModuleCA : ConditionalTrait, IBotTick, IBotNotifyIdleBaseUnits, + IBotRequestUnitProduction, IGameSaveTraitData, IBotAircraftBuilder, INotifyActorDisposing { public const int FeedbackTime = 30; // ticks; = a bit over 1s. must be >= netlag. readonly World world; readonly Player player; + UnitComposition baselineComposition = null; + UnitComposition activeComposition = null; + int activeCompositionProducedValue = 0; + int activeCompositionSelectedTick; + int nextCompositionSelectTick; + readonly Dictionary compositionLastUsedTickById = new(); - readonly List queuedBuildRequests = new List(); + readonly List queuedBuildRequests = new(); + readonly Dictionary activeUnitIntervals = new(); + ActorIndex.OwnerAndNames unitsToBuild; + + UnitCompositionsBotModule compositionsModule; + List possibleActiveCompositions = null; + TechTree techTree; IBotRequestPauseUnitProduction[] requestPause; int idleUnitCount; + int currentQueueIndex = 0; + PlayerResources playerResources; int ticks; @@ -73,11 +118,31 @@ public UnitBuilderBotModuleCA(Actor self, UnitBuilderBotModuleCAInfo info) protected override void Created(Actor self) { - // Special case handling is required for the Player actor. - // Created is called before Player.PlayerActor is assigned, - // so we must query player traits from self, which refers - // for bot modules always to the Player actor. - requestPause = self.TraitsImplementing().ToArray(); + requestPause = self.Owner.PlayerActor.TraitsImplementing().ToArray(); + playerResources = self.Owner.PlayerActor.Trait(); + techTree = self.Owner.PlayerActor.TraitOrDefault(); + compositionsModule = Info.UseCompositions ? self.World.WorldActor.TraitOrDefault() : null; + + var referencedUnitTypes = new HashSet(StringComparer.OrdinalIgnoreCase); + if (Info.UnitsToBuild != null) + referencedUnitTypes.UnionWith(Info.UnitsToBuild.Keys); + + if (compositionsModule != null) + { + baselineComposition = compositionsModule != null ? compositionsModule.UnitCompositions.FirstOrDefault(c => c != null && c.IsBaseline) : null; + + foreach (var c in compositionsModule.UnitCompositions) + if (c?.UnitsToBuild != null) + referencedUnitTypes.UnionWith(c.UnitsToBuild.Keys); + + possibleActiveCompositions = compositionsModule.UnitCompositions.Where(c => c != null + && !c.IsBaseline + && (c.EnabledChance == 100 || self.World.LocalRandom.Next(100) < c.EnabledChance)).ToList(); + + nextCompositionSelectTick = GetNextCompositionSelectTick(); + } + + unitsToBuild = new ActorIndex.OwnerAndNames(world, referencedUnitTypes, player); } void IBotNotifyIdleBaseUnits.UpdatedIdleBaseUnits(List idleUnits) @@ -87,23 +152,55 @@ void IBotNotifyIdleBaseUnits.UpdatedIdleBaseUnits(List idleUnits) void IBotTick.BotTick(IBot bot) { - if (requestPause.Any(rp => rp.PauseUnitProduction)) + // Decrement any active unit intervals, removing any that reach zero + foreach (var i in activeUnitIntervals.ToList()) + { + activeUnitIntervals[i.Key]--; + if (activeUnitIntervals[i.Key] <= 0) + activeUnitIntervals.Remove(i.Key); + } + + // PERF: We shouldn't be queueing new units when we're low on cash + if (playerResources.GetCashAndResources() < Info.ProductionMinCashRequirement || requestPause.Any(rp => rp.PauseUnitProduction)) return; ticks++; if (ticks % (FeedbackTime + Info.UnitBuilderInterval) == 0) { + UpdateComposition(); + + ILookup queuesByCategory = null; + var buildRequest = queuedBuildRequests.FirstOrDefault(); if (buildRequest != null) { - BuildUnit(bot, buildRequest); + queuesByCategory ??= AIUtils.FindQueuesByCategory(player); + BuildUnit(bot, buildRequest, queuesByCategory); queuedBuildRequests.Remove(buildRequest); } - if (player.PlayerActor.Trait().Cash + player.PlayerActor.Trait().Resources >= Info.UnitBuilderMinCredits) - foreach (var q in Info.UnitQueues) - BuildUnit(bot, q, idleUnitCount < Info.IdleBaseUnitsMaximum); + if (idleUnitCount < Info.IdleBaseUnitsMaximum) + { + queuesByCategory ??= AIUtils.FindQueuesByCategory(player); + for (var i = 0; i < Info.UnitQueues.Length; i++) + { + if (++currentQueueIndex >= Info.UnitQueues.Length) + currentQueueIndex = 0; + + var category = Info.UnitQueues[currentQueueIndex]; + var queues = queuesByCategory[category].ToArray(); + if (queues.Length != 0) + { + // PERF: We tick only one type of valid queue at a time + // if AI gets enough cash, it can fill all of its queues with enough ticks + BuildRandomUnit(bot, queues); + + if (playerResources.GetCashAndResources() < Info.MaximiseProductionCashRequirement) + break; + } + } + } } } @@ -117,40 +214,31 @@ int IBotRequestUnitProduction.RequestedProductionCount(IBot bot, string requeste return queuedBuildRequests.Count(r => r == requestedActor); } - void BuildUnit(IBot bot, string category, bool buildRandom) + void BuildRandomUnit(IBot bot, ProductionQueue[] queues) { + if (!HasAnyUnitCompositionOrFallback()) + return; + // Pick a free queue - var queue = AIUtils.FindQueues(player, category).FirstOrDefault(q => !q.AllQueued().Any()); + var queue = queues.FirstOrDefault(q => !q.AllQueued().Any()); if (queue == null) return; - var unit = buildRandom ? - ChooseRandomUnitToBuild(queue) : - ChooseUnitToBuild(queue); - + var unit = ChooseRandomUnitToBuild(queue, false); if (unit == null) + { + RevertToBaselineComposition(); return; + } - var name = unit.Name; - - if (Info.UnitsToBuild != null && !Info.UnitsToBuild.ContainsKey(name)) - return; - - if (Info.UnitDelays != null && - Info.UnitDelays.ContainsKey(name) && - Info.UnitDelays[name] > world.WorldTick) - return; - - if (Info.UnitLimits != null && - Info.UnitLimits.ContainsKey(name) && - world.Actors.Count(a => a.Owner == player && a.Info.Name == name) >= Info.UnitLimits[name]) - return; + AddToActiveCompositionProducedValue(unit); - bot.QueueOrder(Order.StartProduction(queue.Actor, name, 1)); + SetUnitInterval(unit.Name); + bot.QueueOrder(Order.StartProduction(queue.Actor, unit.Name, 1)); } // In cases where we want to build a specific unit but don't know the queue name (because there's more than one possibility) - void BuildUnit(IBot bot, string name) + void BuildUnit(IBot bot, string name, ILookup queuesByCategory) { var actorInfo = world.Map.Rules.Actors[name]; if (actorInfo == null) @@ -160,58 +248,361 @@ void BuildUnit(IBot bot, string name) if (buildableInfo == null) return; + if (!ShouldBuild(name, true)) + return; + ProductionQueue queue = null; foreach (var pq in buildableInfo.Queue) { - queue = AIUtils.FindQueues(player, pq).FirstOrDefault(q => !q.AllQueued().Any()); + queue = queuesByCategory[pq].FirstOrDefault(q => !q.AllQueued().Any()); if (queue != null) break; } - if (queue != null) + if (queue != null && queue.BuildableItems().Any(b => b.Name == name)) { + SetUnitInterval(name); bot.QueueOrder(Order.StartProduction(queue.Actor, name, 1)); AIUtils.BotDebug("AI: {0} decided to build {1} (external request)", queue.Actor.Owner, name); } } - ActorInfo ChooseRandomUnitToBuild(ProductionQueue queue) + void SetUnitInterval(string name) { - var buildableThings = queue.BuildableItems(); - if (!buildableThings.Any()) + if (Info.UnitIntervals == null || !Info.UnitIntervals.ContainsKey(name)) + return; + + activeUnitIntervals[name] = Info.UnitIntervals[name]; + } + + bool ShouldBuild(string name, bool ignoreUnitsToBuild) + { + if (!ignoreUnitsToBuild && Info.UnitsToBuild != null && !Info.UnitsToBuild.ContainsKey(name)) + return false; + + if (Info.UnitDelays != null && + Info.UnitDelays.ContainsKey(name) && + Info.UnitDelays[name] > world.WorldTick) + return false; + + if (Info.UnitIntervals != null && + Info.UnitIntervals.ContainsKey(name) && + activeUnitIntervals.ContainsKey(name)) + return false; + + if (Info.UnitLimits != null && + Info.UnitLimits.ContainsKey(name) && + world.Actors.Count(a => !a.IsDead && a.Owner == player && a.Info.Name == name) >= Info.UnitLimits[name]) + return false; + + return true; + } + + ActorInfo ChooseRandomUnitToBuild(ProductionQueue queue, bool excludeLimited) + { + var unitsToBuildShares = GetUnitsToBuildForCategory(queue.Info.Type); + if (unitsToBuildShares == null || unitsToBuildShares.Count == 0) + return null; + + var buildableThings = queue.BuildableItems().Shuffle(world.LocalRandom).ToArray(); + if (buildableThings.Length == 0) return null; - var unit = buildableThings.Random(world.LocalRandom); - return CanBuildMoreOfAircraft(unit) ? unit : null; + var allUnits = unitsToBuild != null ? unitsToBuild.Actors.Where(a => !a.IsDead).ToArray() : world.Actors.Where(a => !a.IsDead && a.Owner == player).ToArray(); + + ActorInfo desiredUnit = null; + var desiredError = int.MaxValue; + foreach (var unit in buildableThings) + { + if (!unitsToBuildShares.TryGetValue(unit.Name, out var share) || + (Info.UnitDelays != null && Info.UnitDelays.TryGetValue(unit.Name, out var delay) && delay > world.WorldTick)) + continue; + + if (Info.UnitIntervals != null && + Info.UnitIntervals.ContainsKey(unit.Name) && + activeUnitIntervals.ContainsKey(unit.Name)) + continue; + + var unitCount = allUnits.Count(a => a.Info.Name == unit.Name); + if (!excludeLimited && Info.UnitLimits != null && Info.UnitLimits.TryGetValue(unit.Name, out var count) && unitCount >= count) + continue; + + var error = allUnits.Length > 0 ? unitCount * 100 / allUnits.Length - share : -1; + if (error < 0) + return CanBuildMoreOfAircraft(unit) ? unit : null; + + if (error < desiredError) + { + desiredError = error; + desiredUnit = unit; + } + } + + return desiredUnit != null ? (CanBuildMoreOfAircraft(desiredUnit) ? desiredUnit : null) : null; + } + + bool HasAnyUnitCompositionOrFallback() + { + var hasCompositions = compositionsModule != null && compositionsModule.UnitCompositions.Count != 0; + var hasFallback = Info.UnitsToBuild != null && Info.UnitsToBuild.Count != 0; + return hasCompositions || hasFallback; + } + + Dictionary GetUnitsToBuildForCategory(string queueCategory) + { + if (compositionsModule == null || compositionsModule.UnitCompositions.Count == 0) + return Info.UnitsToBuild; + + if (activeComposition != null && CompositionAppliesToCategory(activeComposition, queueCategory)) + return activeComposition.UnitsToBuild; + + if (baselineComposition != null && CompositionAppliesToCategory(baselineComposition, queueCategory)) + return baselineComposition.UnitsToBuild; + + return Info.UnitsToBuild; + } + + void UpdateComposition() + { + if (compositionsModule == null || compositionsModule.UnitCompositions.Count == 0) + return; + + // If a non-baseline composition is active, then keep it until it expires. + if (activeComposition != null) + { + var exceededDuration = activeComposition.MaxDuration > 0 && world.WorldTick - activeCompositionSelectedTick >= activeComposition.MaxDuration; + var exceededValue = activeComposition.MaxProducedValue > 0 && activeCompositionProducedValue >= activeComposition.MaxProducedValue; + + if (exceededDuration || exceededValue) + RevertToBaselineComposition(); + } + else if (world.WorldTick >= nextCompositionSelectTick) + { + var newActiveComposition = ChooseActiveComposition(); + if (newActiveComposition != null) + { + activeComposition = newActiveComposition; + activeCompositionProducedValue = 0; + activeCompositionSelectedTick = world.WorldTick; + if (!string.IsNullOrEmpty(activeComposition.Id)) + compositionLastUsedTickById[activeComposition.Id] = world.WorldTick; + } + } + } + + void RevertToBaselineComposition() + { + activeComposition = null; + activeCompositionProducedValue = 0; + nextCompositionSelectTick = GetNextCompositionSelectTick(); } - ActorInfo ChooseUnitToBuild(ProductionQueue queue) + UnitComposition ChooseActiveComposition() { - var buildableThings = queue.BuildableItems(); - if (!buildableThings.Any()) + if (compositionsModule == null || possibleActiveCompositions.Count == 0) return null; - var myUnits = player.World - .ActorsHavingTrait() - .Where(a => a.Owner == player) - .Select(a => a.Info.Name).ToList(); + nextCompositionSelectTick = GetNextCompositionSelectTick(); + + var playerQueues = AIUtils.FindQueuesByCategory(player); + + var candidates = possibleActiveCompositions + .Where(c => c != null && !c.IsBaseline + && IsCompositionTimeValid(c) + && IsCompositionIntervalValid(c) + && AreCompositionPrerequisitesMet(c) + && CanProduceAnyUnitInCompositionForEachQueueCategory(c, playerQueues)) + .ToArray(); + + return candidates.Length != 0 ? candidates.Random(world.LocalRandom) : null; + } + + bool IsCompositionIntervalValid(UnitComposition composition) + { + if (composition == null) + return false; + + if (composition.MinInterval <= 0) + return true; + + if (string.IsNullOrEmpty(composition.Id)) + return true; + + if (!compositionLastUsedTickById.TryGetValue(composition.Id, out var lastTick)) + return true; + + return world.WorldTick - lastTick >= composition.MinInterval; + } + + bool IsCompositionTimeValid(UnitComposition composition) + { + if (composition == null) + return false; + + var tick = world.WorldTick; + if (composition.MinTime > 0 && tick < composition.MinTime) + return false; + if (composition.MaxTime > 0 && tick > composition.MaxTime) + return false; + + return true; + } + + bool CanProduceAnyUnitInCompositionForQueueCategory(UnitComposition composition, string queueCategory) + { + if (composition == null || string.IsNullOrEmpty(queueCategory)) + return false; + + if (techTree == null) + return true; + + var byQueue = composition.UnitPrerequisitesByQueue; + if (byQueue == null || !byQueue.TryGetValue(queueCategory, out var unitPrereqs) || unitPrereqs == null || unitPrereqs.Count == 0) + return false; - foreach (var unit in Info.UnitsToBuild.Shuffle(world.LocalRandom)) - if (buildableThings.Any(b => b.Name == unit.Key)) - if (myUnits.Count(a => a == unit.Key) * 100 < unit.Value * myUnits.Count) - if (CanBuildMoreOfAircraft(world.Map.Rules.Actors[unit.Key])) - return world.Map.Rules.Actors[unit.Key]; + foreach (var prereqs in unitPrereqs.Values) + { + if (prereqs == null || prereqs.Length == 0 || techTree.HasPrerequisites(prereqs)) + return true; + } - return null; + return false; + } + + bool CanProduceAnyUnitInCompositionForEachQueueCategory(UnitComposition composition, ILookup playerQueues) + { + if (composition == null) + return false; + + var byQueue = composition.UnitPrerequisitesByQueue; + if (byQueue == null || byQueue.Count == 0) + return false; + + foreach (var queueCategory in byQueue.Keys) + { + if (!playerQueues.Contains(queueCategory)) + continue; + + if (!CanProduceAnyUnitInCompositionForQueueCategory(composition, queueCategory)) + return false; + } + + return true; + } + + bool CompositionAppliesToCategory(UnitComposition composition, string queueCategory) + { + if (composition.UnitQueues == null || composition.UnitQueues.Length == 0) + return true; + return composition.UnitQueues.Any(q => q.Equals(queueCategory, StringComparison.OrdinalIgnoreCase)); + } + + bool AreCompositionPrerequisitesMet(UnitComposition composition) + { + if (composition.Prerequisites == null || composition.Prerequisites.Length == 0) + return true; + return techTree == null || techTree.HasPrerequisites(composition.Prerequisites); + } + + int GetNextCompositionSelectTick() + { + var min = Math.Max(0, Info.MinCompositionSelectInterval); + var max = Math.Max(0, Info.MaxCompositionSelectInterval); + + if (min == 0 && max == 0) + return int.MaxValue / 4; + + if (max < min) + max = min; + + var interval = min == max ? min : world.LocalRandom.Next(min, max + 1); + return world.WorldTick + interval; + } + + void AddToActiveCompositionProducedValue(ActorInfo builtUnit) + { + if (activeComposition == null || compositionsModule == null || builtUnit == null) + return; + + compositionsModule.UnitCosts.TryGetValue(builtUnit.Name, out var unitCost); + if (unitCost <= 0) + return; + + activeCompositionProducedValue += unitCost; + } + + bool IBotAircraftBuilder.CanBuildMoreOfAircraft(ActorInfo actorInfo) + { + return CanBuildMoreOfAircraft(actorInfo); } bool CanBuildMoreOfAircraft(ActorInfo actorInfo) { - var attackAircraftInfo = actorInfo.TraitInfoOrDefault(); + var attackAircraftInfo = actorInfo.TraitInfoOrDefault(); if (attackAircraftInfo == null) return true; - var numAirUnits = AIUtils.GetActorsWithTrait(player.World).Count(a => a.Owner == player); - return numAirUnits < Info.MaxAircraft; + + int currentCount; + var limit = Info.MaxAircraft; + var isAirToAir = Info.AirToAirUnits.Contains(actorInfo.Name); + + if (Info.MaintainAirSuperiority && isAirToAir) + { + // Get all production queues to count queued aircraft (for allies as well) + var queues = AIUtils.FindQueuesByCategory(player.World.Players.Where(p => p.IsAlliedWith(player))); + + // Count queued air-to-air units across all queues + var queuedAirToAirCount = queues.SelectMany(g => g).SelectMany(q => q.AllQueued()) + .Count(item => Info.AirToAirUnits.Contains(item.Item)); + + var friendlyAirToAirCount = player.World.Actors.Count(a => a.Owner.RelationshipWith(player) == PlayerRelationship.Ally + && Info.AirToAirUnits.Contains(a.Info.Name)); + + var enemyAirThreatCount = player.World.Actors.Count(a => a.Owner.RelationshipWith(player) == PlayerRelationship.Enemy + && Info.AirThreatUnits.Contains(a.Info.Name)); + + currentCount = friendlyAirToAirCount + queuedAirToAirCount; + limit = Math.Max(enemyAirThreatCount + 1, limit); + + if (Info.MaxAirSuperiority > 0) + limit = Math.Min(Info.MaxAirSuperiority, limit); + } + else + { + // Get all production queues to count queued aircraft + var queues = AIUtils.FindQueuesByCategory(player); + + // Non air-to-air aircraft uses the standard aircraft limit + if (Info.MaintainAirSuperiority) + { + var existingNonAirToAirCount = player.World.Actors.Count(a => + a.Owner == player && + a.Info.HasTraitInfo() && + a.Info.HasTraitInfo() && + !Info.AirToAirUnits.Contains(a.Info.Name)); + + var queuedNonAirToAirCount = queues.SelectMany(g => g).SelectMany(q => q.AllQueued()) + .Count(item => !Info.AirToAirUnits.Contains(item.Item) && + world.Map.Rules.Actors[item.Item].HasTraitInfo()); + + currentCount = existingNonAirToAirCount + queuedNonAirToAirCount; + } + else + { + var existingAircraftCount = player.World.Actors.Count(a => + a.Owner == player && + a.Info.HasTraitInfo() && + a.Info.HasTraitInfo()); + + // Count all queued aircraft + var queuedAircraft = queues.SelectMany(g => g).SelectMany(q => q.AllQueued()) + .Count(item => world.Map.Rules.Actors[item.Item].HasTraitInfo()); + + currentCount = existingAircraftCount + queuedAircraft; + } + } + + return currentCount < limit; } List IGameSaveTraitData.IssueTraitData(Actor self) @@ -222,25 +613,41 @@ List IGameSaveTraitData.IssueTraitData(Actor self) return new List() { new MiniYamlNode("QueuedBuildRequests", FieldSaver.FormatValue(queuedBuildRequests.ToArray())), - new MiniYamlNode("IdleUnitCount", FieldSaver.FormatValue(idleUnitCount)) + new MiniYamlNode("IdleUnitCount", FieldSaver.FormatValue(idleUnitCount)), + new("CompositionLastUsed", "", compositionLastUsedTickById + .Select(kvp => new MiniYamlNode(kvp.Key, FieldSaver.FormatValue(kvp.Value))) + .ToList()) }; } - void IGameSaveTraitData.ResolveTraitData(Actor self, List data) + void IGameSaveTraitData.ResolveTraitData(Actor self, MiniYaml data) { if (self.World.IsReplay) return; - var queuedBuildRequestsNode = data.FirstOrDefault(n => n.Key == "QueuedBuildRequests"); + var queuedBuildRequestsNode = data.NodeWithKeyOrDefault("QueuedBuildRequests"); if (queuedBuildRequestsNode != null) { queuedBuildRequests.Clear(); queuedBuildRequests.AddRange(FieldLoader.GetValue("QueuedBuildRequests", queuedBuildRequestsNode.Value.Value)); } - var idleUnitCountNode = data.FirstOrDefault(n => n.Key == "IdleUnitCount"); + var idleUnitCountNode = data.NodeWithKeyOrDefault("IdleUnitCount"); if (idleUnitCountNode != null) idleUnitCount = FieldLoader.GetValue("IdleUnitCount", idleUnitCountNode.Value.Value); + + var compositionLastUsedNode = data.NodeWithKeyOrDefault("CompositionLastUsed"); + if (compositionLastUsedNode != null) + { + compositionLastUsedTickById.Clear(); + foreach (var n in compositionLastUsedNode.Value.Nodes) + compositionLastUsedTickById[n.Key] = FieldLoader.GetValue("CompositionLastUsed", n.Value.Value); + } + } + + void INotifyActorDisposing.Disposing(Actor self) + { + unitsToBuild?.Dispose(); } } } diff --git a/OpenRA.Mods.CA/Traits/BotModules/UnitCompositionsBotModule.cs b/OpenRA.Mods.CA/Traits/BotModules/UnitCompositionsBotModule.cs new file mode 100644 index 0000000000..47e8c67260 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/BotModules/UnitCompositionsBotModule.cs @@ -0,0 +1,148 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Linq; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + public class UnitComposition + { + [Desc("Production queues the composition is applicable to. Omit to apply to all queues")] + public readonly string[] UnitQueues = Array.Empty(); + + [Desc("What units to the AI should build.", "What relative share of the total army must be this type of unit.")] + public readonly Dictionary UnitsToBuild = new(); + + [Desc("If true, the AI can use this as a baseline/fallback composition (MaxDuration, MaxProducedValue and EnabledChance will be ignored).")] + public readonly bool IsBaseline = false; + + [Desc("If non-zero, the maximum number of ticks the composition should remain active before reverting to baseline.")] + public readonly int MaxDuration = 0; + + [Desc("If non-zero, the maximum value to produce before reverting to baseline.")] + public readonly int MaxProducedValue = 0; + + [Desc("Minimum ticks into the game before compositon can be selected.")] + public readonly int MinTime = 0; + + [Desc("Maximum ticks into the game the compositon can be selected.")] + public readonly int MaxTime = 0; + + [Desc("Maximum ticks into the game the compositon can be selected.")] + public readonly int MinInterval = 7500; + + [Desc("Percentage chance this composition will be available to a given bot (determinated at the start of the game).")] + public readonly int EnabledChance = 100; + + [Desc("List of prerequisites that must be met for the composition to be chosen.")] + public readonly string[] Prerequisites = Array.Empty(); + + // Populated at runtime for quick lookup of unit prerequisites by queue when evaluating compositions + public Dictionary> UnitPrerequisitesByQueue { get; set; } + public string Id { get; set; } + + /// + /// This constructor is used solely for documentation generation. + /// + public UnitComposition() { } + + public UnitComposition(MiniYaml content) + { + FieldLoader.Load(this, content); + } + } + + [TraitLocation(SystemActors.World)] + public class UnitCompositionsBotModuleInfo : ConditionalTraitInfo + { + [FieldLoader.LoadUsing(nameof(LoadUnitCompositions))] + public readonly List UnitCompositions = new(); + + /// To suppress errors + public readonly UnitComposition Composition = null; + + public override object Create(ActorInitializer init) { return new UnitCompositionsBotModule(init.Self, this); } + + static object LoadUnitCompositions(MiniYaml yaml) + { + var retList = new List(); + foreach (var node in yaml.Nodes.Where(n => n.Key.StartsWith("Composition", StringComparison.Ordinal))) + { + var unitComposition = new UnitComposition(node.Value); + // Use the YAML key as a stable id so runtime state (e.g. MinInterval tracking) can persist. + unitComposition.Id = node.Key; + retList.Add(unitComposition); + } + + return retList; + } + } + + public class UnitCompositionsBotModule : ConditionalTrait + { + public List UnitCompositions { get; } + public Dictionary UnitPrerequisites { get; } = new(); + public Dictionary UnitQueues { get; } = new(); + public Dictionary UnitCosts { get; } = new(); + + public UnitCompositionsBotModule(Actor self, UnitCompositionsBotModuleInfo info) + : base(info) + { + UnitCompositions = info.UnitCompositions; + + foreach (var unit in UnitCompositions.SelectMany(c => c.UnitsToBuild.Keys).Distinct()) + { + var unitInfo = self.World.Map.Rules.Actors[unit]; + if (unitInfo == null) + throw new Exception($"Unit {unit} in UnitCompositionsBotModule does not exist."); + + var buildable = unitInfo.TraitInfoOrDefault(); + if (buildable == null) + continue; + + UnitQueues[unit] = buildable.Queue.ToArray(); + UnitPrerequisites[unit] = buildable.Prerequisites; + var valued = unitInfo.TraitInfoOrDefault(); + UnitCosts[unit] = valued?.Cost ?? 0; + } + + // Populate the UnitPrerequisitesByQueue for each composition, so the bot doesn't have to look them up repeatedly + foreach (var composition in UnitCompositions) + { + // Fallback for compositions that were not assigned an id during loading. + if (string.IsNullOrEmpty(composition.Id)) + composition.Id = Guid.NewGuid().ToString(); + + composition.UnitPrerequisitesByQueue = new Dictionary>(); + + foreach (var unit in composition.UnitsToBuild.Keys) + { + if (!UnitQueues.TryGetValue(unit, out var queues)) + continue; + + foreach (var queue in queues) + { + if (!composition.UnitPrerequisitesByQueue.TryGetValue(queue, out var unitPrerequisites)) + { + unitPrerequisites = new Dictionary(); + composition.UnitPrerequisitesByQueue[queue] = unitPrerequisites; + } + + unitPrerequisites[unit] = UnitPrerequisites[unit]; + } + } + } + } + } +} diff --git a/OpenRA.Mods.CA/Traits/CancelActivityOnPickup.cs b/OpenRA.Mods.CA/Traits/CancelActivityOnPickup.cs new file mode 100644 index 0000000000..e822652005 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/CancelActivityOnPickup.cs @@ -0,0 +1,43 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("When picked up, cancels any activities.")] + class CancelActivityOnPickupInfo : ConditionalTraitInfo + { + public override object Create(ActorInitializer init) { return new CancelActivityOnPickup(init, this); } + } + + class CancelActivityOnPickup : ConditionalTrait, INotifyRemovedFromWorld + { + Carryable carryable; + + public CancelActivityOnPickup(ActorInitializer init, CancelActivityOnPickupInfo info) + : base(info) { } + + protected override void Created(Actor self) + { + base.Created(self); + carryable = self.TraitOrDefault(); + } + + void INotifyRemovedFromWorld.RemovedFromWorld(Actor self) + { + if (carryable != null && carryable.Carrier != null) + { + self.CancelActivity(); + } + } + } +} diff --git a/OpenRA.Mods.CA/Traits/CargoBlocked.cs b/OpenRA.Mods.CA/Traits/CargoBlocked.cs new file mode 100644 index 0000000000..705d5b7472 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/CargoBlocked.cs @@ -0,0 +1,92 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Attach to a transport to override the unload order.")] + class CargoBlockedInfo : ConditionalTraitInfo, Requires + { + [CursorReference] + [Desc("Cursor to display when hovering over the transport.")] + public readonly string Cursor = "deploy-blocked"; + + public override object Create(ActorInitializer init) { return new CargoBlocked(init, this); } + } + + class CargoBlocked : ConditionalTrait, IIssueOrder, IResolveOrder + { + public CargoBlocked(ActorInitializer init, CargoBlockedInfo info) + : base(info) { } + + IEnumerable IIssueOrder.Orders + { + get + { + if (IsTraitDisabled) + yield break; + + yield return new CargoBlockedOrderTargeter(Info.Cursor); + } + } + + Order IIssueOrder.IssueOrder(Actor self, IOrderTargeter order, in Target target, bool queued) + { + if (order is CargoBlockedOrderTargeter) + return new Order(order.OrderID, self, target, queued); + + return null; + } + + void IResolveOrder.ResolveOrder(Actor self, Order order) + { + if (order.OrderString == "CargoBlocked") + { + // do nothing + } + } + + class CargoBlockedOrderTargeter : IOrderTargeter + { + readonly string cursor; + + public CargoBlockedOrderTargeter(string cursor) + { + this.cursor = cursor; + } + + public string OrderID => "CargoBlocked"; + public int OrderPriority => 100; + public bool TargetOverridesSelection(Actor self, in Target target, List actorsAt, CPos xy, TargetModifiers modifiers) { return true; } + + bool CanTargetActor(Actor self, in Target target, ref string cursor) + { + cursor = this.cursor; + return self == target.Actor; + } + + public bool CanTarget(Actor self, in Target target, ref TargetModifiers modifiers, ref string cursor) + { + switch (target.Type) + { + case TargetType.Actor: + return CanTargetActor(self, target, ref cursor); + default: + return false; + } + } + + public bool IsQueued { get; protected set; } + } + } +} diff --git a/OpenRA.Mods.CA/Traits/CargoCloner.cs b/OpenRA.Mods.CA/Traits/CargoCloner.cs new file mode 100644 index 0000000000..01a09cb223 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/CargoCloner.cs @@ -0,0 +1,308 @@ +#region Copyright & License Information +/* + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Linq; +using OpenRA.Mods.Common.Activities; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.Common.Traits +{ + [Desc("Continuously produces the passenger actor at no cost. Assumes only one passenger.")] + public class CargoClonerInfo : PausableConditionalTraitInfo, Requires + { + [FieldLoader.Require] + [Desc("Production types (must share one or more values of the `Produces` property of the source's Production trait).")] + public readonly string[] Types = Array.Empty(); + + [Desc("List of actors to ignore.")] + public readonly string[] InvalidActors = Array.Empty(); + + [Desc("Actors to use instead of specific source actors.")] + public readonly Dictionary CloneActors = new(); + + [Desc("Ticks between producing actors. Use zero to calculate based on cost.")] + public readonly int BuildTime = 0; + + [Desc("Percentage of conversion cost to use as duration in ticks to convert (if actor has none defined in Buildable).")] + public readonly int BuildDurationModifier = 60; + + [Desc("If true, BuildDurationModifier will override the equivalent value in Buildable.")] + public readonly bool OverrideUnitBuildDurationModifier = false; + + [ActorReference] + [Desc("If set, when actor has no cargo, clone this actor instead.")] + public readonly string EmptyFallbackActor = null; + + [NotificationReference("Speech")] + [Desc("Notification played when production is complete.", + "The filename of the audio is defined per faction in notifications.yaml.")] + public readonly string ReadyAudio = null; + + [FluentReference(optional: true)] + [Desc("Notification displayed when production is complete.")] + public readonly string ReadyTextNotification = null; + + [NotificationReference("Speech")] + [Desc("Notification played when you can't train another actor", + "when the build limit exceeded or the exit is jammed.", + "The filename of the audio is defined per faction in notifications.yaml.")] + public readonly string BlockedAudio = null; + + [FluentReference(optional: true)] + [Desc("Notification displayed when you can't train another actor", + "when the build limit exceeded or the exit is jammed.")] + public readonly string BlockedTextNotification = null; + + public readonly bool ShowSelectionBar = false; + public readonly Color SelectionBarColor = Color.SkyBlue; + + [Desc("Defines to which players the bar is to be shown.")] + public readonly PlayerRelationship SelectionBarDisplayRelationships = PlayerRelationship.Ally; + + public override object Create(ActorInitializer init) { return new CargoCloner(init.Self, this); } + } + + public class CargoCloner : PausableConditionalTrait, ITick, INotifyPassengerEntered, INotifyPassengerExited, ISelectionBar, INotifyPowerLevelChanged, INotifyOwnerChanged + { + readonly Actor self; + readonly CargoClonerInfo info; + int totalTicksToClone; + int ticksUntilCloned; + public string[] Types => info.Types; + + PowerState previousPowerState; + PowerManager playerPower; + Actor passengerToClone; + BuildableInfo bi; + Cargo cargo; + RallyPoint rallyPoint; + bool exitOnCompletion = false; + + string ActorTypeToClone => passengerToClone != null ? passengerToClone.Info.Name : info.EmptyFallbackActor; + ActorInfo ActorInfoToClone => ActorTypeToClone != null ? self.World.Map.Rules.Actors[ActorTypeToClone] : null; + + public CargoCloner(Actor self, CargoClonerInfo info) + : base(info) + { + this.info = info; + this.self = self; + ticksUntilCloned = 0; + passengerToClone = null; + } + + protected override void Created(Actor self) + { + base.Created(self); + playerPower = self.Owner.PlayerActor.Trait(); + cargo = self.Trait(); + previousPowerState = playerPower.PowerState; + rallyPoint = self.TraitOrDefault(); + + if (info.EmptyFallbackActor != null) + { + totalTicksToClone = ticksUntilCloned = CalculateBuildTime(); + } + } + + void INotifyPassengerEntered.OnPassengerEntered(Actor self, Actor passenger) + { + if (passengerToClone == null) + { + bi = passenger.Info.TraitInfoOrDefault(); + + if (bi == null) + return; + + var existingCount = GetExistingCount(passenger.Info.Name); + + if (bi.BuildLimit > 0) + { + if (existingCount >= bi.BuildLimit + 1 || passenger.Owner != self.Owner) + { + Unload(); + Game.Sound.PlayNotification(self.World.Map.Rules, self.Owner, "Speech", info.BlockedAudio, self.Owner.Faction.InternalName); + return; + } + else if (existingCount >= bi.BuildLimit) + { + exitOnCompletion = true; + } + } + + passengerToClone = passenger; + totalTicksToClone = ticksUntilCloned = CalculateBuildTime(); + } + } + + void INotifyPassengerExited.OnPassengerExited(Actor self, Actor passenger) + { + if (passengerToClone == passenger) + { + passengerToClone = null; + bi = null; + totalTicksToClone = ticksUntilCloned = 0; + } + } + + void INotifyPowerLevelChanged.PowerLevelChanged(Actor self) + { + totalTicksToClone = CalculateBuildTime(); + + if (playerPower.PowerState == PowerState.Normal && previousPowerState != PowerState.Normal) + { + ticksUntilCloned /= 2; + } + else if (playerPower.PowerState != PowerState.Normal && previousPowerState == PowerState.Normal) + { + ticksUntilCloned *= 2; + } + + previousPowerState = playerPower.PowerState; + } + + void INotifyOwnerChanged.OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) + { + playerPower = newOwner.PlayerActor.Trait(); + } + + void ITick.Tick(Actor self) + { + if (IsTraitDisabled || self.IsDead || ActorTypeToClone == null) + { + ticksUntilCloned = 0; + return; + } + + if (IsTraitPaused) + return; + + if (--ticksUntilCloned > 0) + return; + + ProduceClone(); + + if (exitOnCompletion) + { + Unload(); + exitOnCompletion = false; + } + else + totalTicksToClone = ticksUntilCloned = CalculateBuildTime(); + } + + int GetExistingCount(string actorType) + { + return self.Owner.World.ActorsHavingTrait() + .Count(a => a.Info.Name == actorType && a.Owner == self.Owner); + } + + void Unload() + { + if (cargo != null && !cargo.IsEmpty()) + self.QueueActivity(new UnloadCargo(self, cargo.Info.LoadRange)); + } + + int CalculateBuildTime() + { + if (ActorTypeToClone == null) + return 0; + + if (info.BuildTime > 0) + return info.BuildTime; + + var cost = GetUnitCost(ActorInfoToClone); + if (cost == 0) + return 0; + + // Check if we should use Buildable trait's BuildDurationModifier + var buildDurationModifier = info.BuildDurationModifier; + + if (!info.OverrideUnitBuildDurationModifier && bi != null) + buildDurationModifier = bi.BuildDurationModifier; + + var powerStateBuildDurationModifier = playerPower.PowerState != PowerState.Normal ? 200 : 100; + return Util.ApplyPercentageModifiers(cost, new int[] { buildDurationModifier, powerStateBuildDurationModifier }); + } + + int GetUnitCost(ActorInfo unit) + { + var valued = unit.TraitInfoOrDefault(); + + if (valued == null) + return 0; + + return valued.Cost; + } + + void ProduceClone() + { + if (IsTraitDisabled || self.IsDead || ActorTypeToClone == null) + return; + + var actorName = ActorTypeToClone.ToLowerInvariant(); + + if (info.InvalidActors.Contains(actorName)) + return; + + var cloneActor = self.World.Map.Rules.Actors[info.CloneActors.ContainsKey(actorName) ? info.CloneActors[actorName] : actorName]; + + var sp = self.TraitsImplementing() + .FirstOrDefault(p => !p.IsTraitDisabled && !p.IsTraitPaused && p.Info.Produces.Any(produces => info.Types.Contains(produces))); + + var cloned = false; + + if (bi != null && bi.BuildLimit > 0 && GetExistingCount(ActorTypeToClone) >= bi.BuildLimit + 1) + { + passengerToClone = null; + bi = null; + totalTicksToClone = ticksUntilCloned = 0; + return; + } + + if (ActorTypeToClone != null && sp != null) + { + var inits = new TypeDictionary + { + new OwnerInit(self.Owner), + new FactionInit(sp.Faction) + }; + + cloned |= sp.Produce(self, cloneActor, sp.Info.Produces[0], inits, 0); + } + + if (exitOnCompletion || !cloned) + Game.Sound.PlayNotification(self.World.Map.Rules, self.Owner, "Speech", info.BlockedAudio, self.Owner.Faction.InternalName); + else + Game.Sound.PlayNotification(self.World.Map.Rules, self.Owner, "Speech", info.ReadyAudio, self.Owner.Faction.InternalName); + } + + float ISelectionBar.GetValue() + { + if (!info.ShowSelectionBar || IsTraitDisabled || totalTicksToClone == 0) + return 0f; + + var viewer = self.World.RenderPlayer ?? self.World.LocalPlayer; + if (viewer != null && !Info.SelectionBarDisplayRelationships.HasRelationship(self.Owner.RelationshipWith(viewer))) + return 0f; + + return (float)(totalTicksToClone - ticksUntilCloned) / totalTicksToClone; + } + + Color ISelectionBar.GetColor() + { + return info.SelectionBarColor; + } + + bool ISelectionBar.DisplayWhenEmpty => false; + } +} diff --git a/OpenRA.Mods.CA/Traits/CarrierMaster.cs b/OpenRA.Mods.CA/Traits/CarrierMaster.cs index dbdaed2e47..7d1d659e93 100644 --- a/OpenRA.Mods.CA/Traits/CarrierMaster.cs +++ b/OpenRA.Mods.CA/Traits/CarrierMaster.cs @@ -1,16 +1,17 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion using System; using System.Collections.Generic; using System.Linq; +using OpenRA.Mods.CA.Activities; using OpenRA.Mods.Common; using OpenRA.Mods.Common.Traits; using OpenRA.Traits; @@ -18,7 +19,7 @@ namespace OpenRA.Mods.CA.Traits { [Desc("This actor can spawn actors.")] - public class CarrierMasterInfo : BaseSpawnerMasterInfo + public class CarrierMasterInfo : SpawnerMasterBaseInfo { [Desc("Spawn is a missile that dies and not return.")] public readonly bool SpawnIsMissile = false; @@ -27,9 +28,13 @@ public class CarrierMasterInfo : BaseSpawnerMasterInfo public readonly int RearmTicks = 150; [GrantedConditionReference] - [Desc("The condition to grant to self right after launching a spawned unit. (Used by V3 to make immobile.)")] + [Desc("The condition to grant to self right after launching a spawned unit.")] public readonly string LaunchingCondition = null; + [GrantedConditionReference] + [Desc("The condition to grant to self when slaves are entering.)")] + public readonly string BeingEnteredCondition = null; + [Desc("After this many ticks, we remove the condition.")] public readonly int LaunchingTicks = 15; @@ -42,6 +47,9 @@ public class CarrierMasterInfo : BaseSpawnerMasterInfo [Desc("Instantly repair spawners when they return?")] public readonly bool InstantRepair = true; + [Desc("If true, all slaves must be inside carrier before rearming.")] + public readonly bool RearmAsGroup = false; + [GrantedConditionReference] [Desc("The condition to grant to self while spawned units are loaded.", "Condition can stack with multiple spawns.")] @@ -57,9 +65,9 @@ public class CarrierMasterInfo : BaseSpawnerMasterInfo public override object Create(ActorInitializer init) { return new CarrierMaster(init, this); } } - public class CarrierMaster : BaseSpawnerMaster, ITick, IResolveOrder, INotifyAttack + public class CarrierMaster : SpawnerMasterBase, ITick, IResolveOrder, INotifyAttack { - class CarrierSlaveEntry : BaseSpawnerSlaveEntry + class CarrierSlaveEntry : SpawnerSlaveBaseEntry { public int RearmTicks = 0; public new CarrierSlave SpawnerSlave; @@ -74,8 +82,11 @@ class CarrierSlaveEntry : BaseSpawnerSlaveEntry int launchCondition = Actor.InvalidConditionToken; int launchConditionTicks; + int beingEnteredToken = Actor.InvalidConditionToken; + Target currentTarget; int maxDistanceCheckTicks; + int numLaunched = 0; public CarrierMaster(ActorInitializer init, CarrierMasterInfo info) : base(init, info) @@ -93,7 +104,7 @@ protected override void Created(Actor self) Replenish(self, SlaveEntries); } - public override BaseSpawnerSlaveEntry[] CreateSlaveEntries(BaseSpawnerMasterInfo info) + public override SpawnerSlaveBaseEntry[] CreateSlaveEntries(SpawnerMasterBaseInfo info) { var slaveEntries = new CarrierSlaveEntry[info.Actors.Length]; // For this class to use @@ -103,7 +114,7 @@ public override BaseSpawnerSlaveEntry[] CreateSlaveEntries(BaseSpawnerMasterInfo return slaveEntries; // For the base class to use } - public override void InitializeSlaveEntry(Actor slave, BaseSpawnerSlaveEntry entry) + public override void InitializeSlaveEntry(Actor slave, SpawnerSlaveBaseEntry entry) { base.InitializeSlaveEntry(slave, entry); @@ -139,8 +150,6 @@ void INotifyAttack.Attacking(Actor self, in Target target, Armament a, Barrel ba if (carrierSlaveEntry == null) return; - carrierSlaveEntry.IsLaunched = true; // mark as launched - if (CarrierMasterInfo.LaunchingCondition != null) { if (launchCondition == Actor.InvalidConditionToken) @@ -150,11 +159,13 @@ void INotifyAttack.Attacking(Actor self, in Target target, Armament a, Barrel ba } SpawnIntoWorld(self, carrierSlaveEntry.Actor, self.CenterPosition); + carrierSlaveEntry.IsLaunched = true; // mark as launched + numLaunched = SlaveEntries.Count(a => a.IsLaunched); - if (spawnContainTokens.TryGetValue(a.Info.Name, out var spawnContainToken) && spawnContainToken.Any()) + if (spawnContainTokens.TryGetValue(a.Info.Name, out var spawnContainToken) && spawnContainToken.Count > 0) self.RevokeCondition(spawnContainToken.Pop()); - if (loadedTokens.Any() && CarrierMasterInfo.LoadedCondition != null) + if (loadedTokens.Count > 0 && CarrierMasterInfo.LoadedCondition != null) self.RevokeCondition(loadedTokens.Pop()); // Lambdas can't use 'in' variables, so capture a copy for later @@ -215,6 +226,7 @@ public void PickupSlave(Actor self, Actor a) throw new InvalidOperationException("An actor that isn't my slave entered me?"); slaveEntry.IsLaunched = false; + numLaunched = SlaveEntries.Count(a => a.IsLaunched); // setup rearm slaveEntry.RearmTicks = Util.ApplyPercentageModifiers(CarrierMasterInfo.RearmTicks, reloadModifiers.Select(rm => rm.GetReloadModifier())); @@ -226,7 +238,7 @@ public void PickupSlave(Actor self, Actor a) loadedTokens.Push(self.GrantCondition(CarrierMasterInfo.LoadedCondition)); } - public override void Replenish(Actor self, BaseSpawnerSlaveEntry entry) + public override void Replenish(Actor self, SpawnerSlaveBaseEntry entry) { base.Replenish(self, entry); @@ -257,20 +269,37 @@ void ITick.Tick(Actor self) } } + var slaveIsEntering = false; + var numLaunched = SlaveEntries.Count(a => a.IsLaunched); + // Rearm foreach (var slaveEntry in SlaveEntries) { var carrierSlaveEntry = slaveEntry as CarrierSlaveEntry; + if (carrierSlaveEntry.Actor.IsInWorld && carrierSlaveEntry.Actor.CurrentActivity is EnterCarrierMaster) + slaveIsEntering = true; + + if (CarrierMasterInfo.RearmAsGroup && numLaunched > 0) + continue; + if (carrierSlaveEntry.RearmTicks > 0) carrierSlaveEntry.RearmTicks--; } + if (slaveIsEntering && beingEnteredToken == Actor.InvalidConditionToken) + beingEnteredToken = self.GrantCondition(CarrierMasterInfo.BeingEnteredCondition); + else if (!slaveIsEntering && beingEnteredToken != Actor.InvalidConditionToken) + beingEnteredToken = self.RevokeCondition(beingEnteredToken); + // range check RangeCheck(self); } protected void RangeCheck(Actor self) { + if (numLaunched == 0) + return; + if (--maxDistanceCheckTicks > 0) return; @@ -286,5 +315,10 @@ protected override void TraitPaused(Actor self) { Recall(); } + + protected override void TraitDisabled(Actor self) + { + Recall(); + } } } diff --git a/OpenRA.Mods.CA/Traits/CarrierSlave.cs b/OpenRA.Mods.CA/Traits/CarrierSlave.cs index 20850a4502..e9d3e4e790 100644 --- a/OpenRA.Mods.CA/Traits/CarrierSlave.cs +++ b/OpenRA.Mods.CA/Traits/CarrierSlave.cs @@ -1,31 +1,27 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion using System.Linq; using OpenRA.Mods.CA.Activities; -using OpenRA.Mods.Common.Activities; using OpenRA.Mods.Common.Traits; using OpenRA.Traits; namespace OpenRA.Mods.CA.Traits { [Desc("Can be slaved to a spawner.")] - public class CarrierSlaveInfo : BaseSpawnerSlaveInfo + public class CarrierSlaveInfo : SpawnerSlaveBaseInfo { - [Desc("Move this close to the spawner, before entering it.")] - public readonly WDist LandingDistance = new WDist(5 * 1024); - public override object Create(ActorInitializer init) { return new CarrierSlave(init, this); } } - public class CarrierSlave : BaseSpawnerSlave, INotifyIdle + public class CarrierSlave : SpawnerSlaveBase, INotifyIdle { readonly AmmoPool[] ammoPools; public readonly CarrierSlaveInfo Info; @@ -54,7 +50,7 @@ public void EnterSpawner(Actor self) self.QueueActivity(false, new EnterCarrierMaster(self, Master, spawnerMaster)); } - public override void LinkMaster(Actor self, Actor master, BaseSpawnerMaster spawnerMaster) + public override void LinkMaster(Actor self, Actor master, SpawnerMasterBase spawnerMaster) { base.LinkMaster(self, master, spawnerMaster); this.spawnerMaster = spawnerMaster as CarrierMaster; diff --git a/OpenRA.Mods.CA/Traits/CashHackable.cs b/OpenRA.Mods.CA/Traits/CashHackable.cs index 31300cdbfe..059d1c009d 100644 --- a/OpenRA.Mods.CA/Traits/CashHackable.cs +++ b/OpenRA.Mods.CA/Traits/CashHackable.cs @@ -1,16 +1,14 @@ #region Copyright & License Information -/* - * Copyright 2007-2017 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion using System.Collections.Generic; -using OpenRA.Mods.Common.Traits; using OpenRA.Traits; namespace OpenRA.Mods.CA.Traits diff --git a/OpenRA.Mods.CA/Traits/ChangesHealthVersus.cs b/OpenRA.Mods.CA/Traits/ChangesHealthVersus.cs index 003f2a6c8e..d7dd0d8870 100644 --- a/OpenRA.Mods.CA/Traits/ChangesHealthVersus.cs +++ b/OpenRA.Mods.CA/Traits/ChangesHealthVersus.cs @@ -1,11 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion diff --git a/OpenRA.Mods.CA/Traits/ChargingSelfDestruct.cs b/OpenRA.Mods.CA/Traits/ChargingSelfDestruct.cs index 1a42e53bbc..c8eb88ac88 100644 --- a/OpenRA.Mods.CA/Traits/ChargingSelfDestruct.cs +++ b/OpenRA.Mods.CA/Traits/ChargingSelfDestruct.cs @@ -1,11 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2007-2019 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -21,7 +20,7 @@ namespace OpenRA.Mods.CA.Traits { - class ChargingSelfDestructInfo : TraitInfo, IRulesetLoaded, Requires, Requires + class ChargingSelfDestructInfo : TraitInfo, IRulesetLoaded, Requires, Requires { [SequenceReference] public readonly string ChargingSequence = "charging"; @@ -47,6 +46,9 @@ class ChargingSelfDestructInfo : TraitInfo, IRulesetLoaded, Requires Orders get { yield return new TargetTypeOrderTargeter(new BitSet("DetonateAttack"), "DetonateAttack", 5, "attack", true, false) { ForceAttack = false }; - yield return new DeployOrderTargeter("Detonate", 5); + yield return new DeployOrderTargeter("Detonate", 5, () => info.DeployCursor); } } diff --git a/OpenRA.Mods.CA/Traits/ChronoResourceDelivery.cs b/OpenRA.Mods.CA/Traits/ChronoResourceDelivery.cs index f0cf9b74dd..ec09a4711e 100644 --- a/OpenRA.Mods.CA/Traits/ChronoResourceDelivery.cs +++ b/OpenRA.Mods.CA/Traits/ChronoResourceDelivery.cs @@ -1,10 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -50,8 +50,9 @@ public class ChronoResourceDeliveryInfo : ConditionalTraitInfo, Requires, INotifyHarvesterAction, ITick + public class ChronoResourceDelivery : ConditionalTrait, INotifyHarvestAction, INotifyDockClientMoving, ITick { + Actor destRefinery = null; CPos? destination = null; CPos harvestedField; int ticksTillCheck = 0; @@ -74,31 +75,34 @@ void ITick.Tick(Actor self) ticksTillCheck--; } - public void MovingToResources(Actor self, CPos targetCell) + void INotifyHarvestAction.MovingToResources(Actor self, CPos targetCell) { Reset(); } - public void MovingToRefinery(Actor self, Actor refineryActor) + void INotifyDockClientMoving.MovingToDock(Actor self, Actor hostActor, IDockHost host) { - var deliverypos = refineryActor.Location + refineryActor.Trait().DeliveryOffset; - + var deliverypos = hostActor.World.Map.CellContaining(hostActor.Trait().DockPosition); if (destination != null && destination.Value != deliverypos) ticksTillCheck = 0; harvestedField = self.World.Map.CellContaining(self.CenterPosition); destination = deliverypos; + destRefinery = hostActor; + } + + void INotifyHarvestAction.MovementCancelled(Actor self) + { + Reset(); } - public void MovementCancelled(Actor self) + void INotifyDockClientMoving.MovementCancelled(Actor self) { Reset(); } - public void Harvested(Actor self, ResourceType resource) { } - public void Docked() { } - public void Undocked() { } + void INotifyHarvestAction.Harvested(Actor self, string resourceType) { } void TeleportIfPossible(Actor self) { @@ -112,7 +116,7 @@ void TeleportIfPossible(Actor self) var pos = self.Trait(); if (pos.CanEnterCell(destination.Value)) { - self.QueueActivity(false, new ChronoResourceTeleport(destination.Value, Info, harvestedField)); + self.QueueActivity(false, new ChronoResourceTeleport(destination.Value, Info, harvestedField, destRefinery)); Reset(); } } @@ -121,6 +125,7 @@ void Reset() { ticksTillCheck = 0; destination = null; + destRefinery = null; } } } diff --git a/OpenRA.Mods.CA/Traits/ChronoshiftableCA.cs b/OpenRA.Mods.CA/Traits/ChronoshiftableCA.cs new file mode 100644 index 0000000000..9a367b2256 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/ChronoshiftableCA.cs @@ -0,0 +1,412 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.Mods.CA.Activities; +using OpenRA.Mods.Common; +using OpenRA.Mods.Common.Activities; +using OpenRA.Mods.Common.Effects; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Can be teleported via Chronoshift power.", + "Copy of base version, adding the ability to return to avoid death,", + "and adding warp to/from sprite effects.")] + public class ChronoshiftableCAInfo : ConditionalTraitInfo + { + [Desc("Should the actor die instead of being teleported?")] + public readonly bool ExplodeInstead = false; + + [Desc("Types of damage that this trait causes to self when 'ExplodeInstead' is true", + "or the return-to-origin is blocked. Leave empty for no damage types.")] + public readonly BitSet DamageTypes = default; + + public readonly string ChronoshiftSound = "chrono2.aud"; + + [Desc("Should the actor return to its previous location after the chronoshift wore out?")] + public readonly bool ReturnToOrigin = true; + + [Desc("The color the bar of the 'return-to-origin' logic has.")] + public readonly Color TimeBarColor = Color.White; + + [Desc("Image used for the teleport effects. Defaults to the actor's type.")] + public readonly string Image = null; + + [Desc("Sequence used for the effect played where the unit jumped from initially.")] + [SequenceReference("Image")] + public readonly string InitialWarpFromSequence = null; + + [Desc("Sequence used for the effect played where the unit jumped to initially.")] + [SequenceReference("Image")] + public readonly string InitialWarpToSequence = null; + + [Desc("Sequence used for the effect played where the unit jumped from when returning.")] + [SequenceReference("Image")] + public readonly string ReturnWarpFromSequence = null; + + [Desc("Sequence used for the effect played where the unit jumped to when returning.")] + [SequenceReference("Image")] + public readonly string ReturnWarpToSequence = null; + + [Desc("Palette to render the warp in/out sprites in.")] + [PaletteReference] + public readonly string Palette = "effect"; + + [GrantedConditionReference] + [Desc("Condition to apply while chronoshifted.")] + public readonly string Condition = null; + + [Desc("If true, if the actor will return to origin instead of being killed while chronoshifted.", + "ReturnToOrigin must also be true.")] + public readonly bool ReturnToAvoidDeath = false; + + [Desc("Sound to apply when returning on would-be-death.")] + public readonly string ReturnToAvoidDeathSound = null; + + [Desc("Relationships that benefit from returning to avoid death.")] + public readonly PlayerRelationship ReturnToAvoidDeathRelationships = PlayerRelationship.Ally | PlayerRelationship.Neutral | PlayerRelationship.Enemy; + + [Desc("If ReturnToAvoidDeath is true the amount of HP restored on return.")] + public readonly int ReturnToAvoidDeathHealthPercent = 10; + + [Desc("If ReturnToAvoidDeath is true, the actor to replace the normal husk with.")] + public readonly string ReturnToAvoidDeathHuskActor = "camera.dummy"; + + public override void RulesetLoaded(Ruleset rules, ActorInfo ai) + { + if (!ai.HasTraitInfo() && !ai.HasTraitInfo()) + throw new YamlException("Chronoshiftable requires actors to have the Mobile or Husk traits."); + } + + public override object Create(ActorInitializer init) { return new ChronoshiftableCA(init, this); } + } + + public class ChronoshiftableCA : ConditionalTrait, ITick, ISync, ISelectionBar, + IDeathActorInitModifier, ITransformActorInitModifier, INotifyRemovedFromWorld, + INotifyKilled, IHuskModifier + { + readonly Actor self; + Actor chronosphere; + bool killCargo; + int duration; + IPositionable iPositionable; + + // Return-to-origin logic + [Sync] + public CPos Origin; + + [Sync] + public int ReturnTicks = 0; + + readonly ChronoshiftableCAInfo info; + readonly string faction; + IFacing facing; + Cargo cargo; + List cachedPassengers; + int conditionToken = Actor.InvalidConditionToken; + bool returnToAvoidDeath; + + public ChronoshiftableCA(ActorInitializer init, ChronoshiftableCAInfo info) + : base(info) + { + self = init.Self; + + var returnInit = init.GetOrDefault(); + if (returnInit != null) + { + ReturnTicks = returnInit.Ticks; + duration = returnInit.Duration; + Origin = returnInit.Origin; + + // Defer to the end of tick as the lazy value may reference an actor that hasn't been created yet + if (returnInit.Chronosphere != null) + init.World.AddFrameEndTask(w => chronosphere = returnInit.Chronosphere.Actor(init.World).Value); + } + + this.info = info; + + if (info.ReturnToAvoidDeath) + faction = init.GetValue(init.Self.Owner.Faction.InternalName); + } + + protected override void Created(Actor self) + { + iPositionable = self.OccupiesSpace as IPositionable; + base.Created(self); + + if (info.ReturnToAvoidDeath) + { + cargo = self.TraitOrDefault(); + facing = self.TraitOrDefault(); + } + } + + public bool Teleport(Actor self, CPos targetLocation, int duration, bool killCargo, Actor chronosphere) + { + if (info.ReturnToOrigin && info.Condition != null && ReturnTicks <= 0 && conditionToken == Actor.InvalidConditionToken) + conditionToken = self.GrantCondition(info.Condition); + + var teleported = InnerTeleport(self, targetLocation, duration, killCargo, chronosphere); + + if (teleported) + { + var warpFromPos = self.CenterPosition; + var warpToPos = self.World.Map.CenterOfCell(targetLocation); + WarpEffect(warpFromPos, warpToPos, false); + + if (info.ReturnToAvoidDeath && !killCargo && cargo != null) + { + cachedPassengers = new List(); + foreach (var p in cargo.Passengers) + cachedPassengers.Add(p); + } + } + + return teleported; + } + + // Copy of Teleport from Chronoshiftable but using TeleportCA + bool InnerTeleport(Actor self, CPos targetLocation, int duration, bool killCargo, Actor chronosphere) + { + if (IsTraitDisabled) + return false; + + // Some things appear chronoshiftable, but instead they just die. + if (Info.ExplodeInstead) + { + self.World.AddFrameEndTask(w => + { + // Damage is inflicted by the chronosphere + if (!self.Disposed) + self.Kill(chronosphere, Info.DamageTypes); + }); + return true; + } + + // Set up return-to-origin info + // If this actor is already counting down to return to + // an existing location then we shouldn't override it + if (ReturnTicks <= 0) + { + Origin = self.Location; + ReturnTicks = duration; + } + + this.duration = duration; + this.chronosphere = chronosphere; + this.killCargo = killCargo; + + // Set up the teleport + self.World.AddFrameEndTask(w => + { + self.QueueActivity(false, new TeleportCA(chronosphere, targetLocation, null, killCargo, true, Info.ChronoshiftSound, false)); + }); + + return true; + } + + void ITick.Tick(Actor self) + { + if (IsTraitDisabled || !Info.ReturnToOrigin || ReturnTicks <= 0) + return; + + // Return to original location + if (--ReturnTicks == 0) + { + // The Move activity is not immediately cancelled, which, combined + // with Activity.Cancel discarding NextActivity without checking the + // IsInterruptable flag, means that a well timed order can cancel the + // Teleport activity queued below - an exploit / cheat of the return mechanic. + // The Teleport activity queued below is guaranteed to either complete + // (force-resetting the actor to the middle of the target cell) or kill + // the actor. It is therefore safe to force-erase the Move activity to + // work around the cancellation bug. + // HACK: this is manipulating private internal actor state + if (self.CurrentActivity != null + && (self.CurrentActivity is Move + || self.CurrentActivity is Attack + || self.CurrentActivity is AttackMoveActivity + || self.CurrentActivity.ToString() == "OpenRA.Mods.Common.Traits.AttackFollow+AttackActivity")) + typeof(Actor).GetProperty(nameof(Actor.CurrentActivity)).SetValue(self, null); + + if (conditionToken != Actor.InvalidConditionToken) + conditionToken = self.RevokeCondition(conditionToken); + + self.World.AddFrameEndTask(w => + { + WarpEffect(self.CenterPosition, self.World.Map.CenterOfCell(Origin), true); + }); + + // The actor is killed using Info.DamageTypes if the teleport fails + self.QueueActivity(false, new TeleportCA(chronosphere ?? self, Origin, null, killCargo, true, Info.ChronoshiftSound, + false, true, Info.DamageTypes)); + } + } + + // Can't be used in synced code, except with ignoreVis. + public virtual bool CanChronoshiftTo(Actor self, CPos targetLocation) + { + // TODO: Allow enemy units to be chronoshifted into bad terrain to kill them + return !IsTraitDisabled && iPositionable != null && iPositionable.CanEnterCell(targetLocation); + } + + // Show the remaining time as a bar + float ISelectionBar.GetValue() + { + if (IsTraitDisabled || !Info.ReturnToOrigin) + return 0f; + + // Otherwise an empty bar is rendered all the time + if (ReturnTicks == 0 || !self.Owner.IsAlliedWith(self.World.RenderPlayer)) + return 0f; + + return (float)ReturnTicks / duration; + } + + Color ISelectionBar.GetColor() { return Info.TimeBarColor; } + bool ISelectionBar.DisplayWhenEmpty => false; + + void ModifyActorInit(TypeDictionary init) + { + if (IsTraitDisabled || !Info.ReturnToOrigin || ReturnTicks <= 0) + return; + + init.Add(new ChronoshiftReturnInit(ReturnTicks, duration, Origin, chronosphere)); + } + + void IDeathActorInitModifier.ModifyDeathActorInit(Actor self, TypeDictionary init) { ModifyActorInit(init); } + void ITransformActorInitModifier.ModifyTransformActorInit(Actor self, TypeDictionary init) { ModifyActorInit(init); } + + void INotifyKilled.Killed(Actor self, AttackInfo e) + { + if (!IsTraitDisabled + && Info.ReturnToOrigin + && info.ReturnToAvoidDeath + && ReturnTicks > 0 + && (chronosphere == null || info.ReturnToAvoidDeathRelationships.HasRelationship(self.Owner.RelationshipWith(chronosphere.Owner)))) + { + returnToAvoidDeath = true; + self.World.AddFrameEndTask(w => + { + self.World.Remove(self); + }); + } + } + + string IHuskModifier.HuskActor(Actor self) + { + if (!returnToAvoidDeath || IsTraitDisabled) + return null; + + return info.ReturnToAvoidDeathHuskActor; + } + + void INotifyRemovedFromWorld.RemovedFromWorld(Actor self) + { + if (!returnToAvoidDeath || IsTraitDisabled) + return; + + var defeated = self.Owner.WinState == WinState.Lost; + if (defeated) + return; + + var originLocation = self.World.Map.CenterOfCell(Origin); + + var td = new TypeDictionary + { + new ParentActorInit(self), + new FactionInit(faction), + new EffectiveOwnerInit(self.Owner), + new OwnerInit(self.Owner), + new SkipMakeAnimsInit(), + new HealthInit(info.ReturnToAvoidDeathHealthPercent), + new LocationInit(self.Location) + }; + + if (!killCargo && cargo != null) + { + var passengers = new List(); + foreach (var passenger in cachedPassengers) + { + if (passenger.IsInWorld || !passenger.IsDead) + continue; + + passengers.Add(passenger.Info.Name.ToLowerInvariant()); + } + + td.Add(new CargoInit(new CargoInfo(), passengers.ToArray())); + } + + if (facing != null) + td.Add(new FacingInit(facing.Facing)); + + self.World.AddFrameEndTask(w => + { + WarpEffect(self.CenterPosition, originLocation, true); + var a = w.CreateActor(self.Info.Name, td); + a.QueueActivity(false, new TeleportCA(chronosphere ?? a, Origin, null, killCargo, false, Info.ChronoshiftSound, + false, true, Info.DamageTypes)); + + // set ownership of passengers + var cargo = a.TraitOrDefault(); + if (cargo != null) + { + var i = 0; + foreach (var p in cargo.Passengers) + { + var cachedPassenger = cachedPassengers.ElementAtOrDefault(i); + + if (cachedPassenger != null && !p.IsDead && p.Owner != cachedPassenger.Owner) + p.ChangeOwner(cachedPassenger.Owner); + + i++; + } + } + + returnToAvoidDeath = false; + }); + } + + void WarpEffect(WPos warpFromPos, WPos warpToPos, bool isReturning) + { + var image = info.Image ?? self.Info.Name; + var w = self.World; + + var warpFromSequence = isReturning ? info.ReturnWarpFromSequence : info.InitialWarpFromSequence; + var warpToSequence = isReturning ? info.ReturnWarpToSequence : info.InitialWarpToSequence; + + if (warpFromSequence != null) + w.Add(new SpriteEffect(warpFromPos, w, image, warpFromSequence, info.Palette)); + + if (warpToSequence != null) + w.Add(new SpriteEffect(warpToPos, w, image, warpToSequence, info.Palette)); + } + } + + public class ChronoshiftReturnInit : CompositeActorInit, ISingleInstanceInit + { + public readonly int Ticks; + public readonly int Duration; + public readonly CPos Origin; + public readonly ActorInitActorReference Chronosphere; + + public ChronoshiftReturnInit(int ticks, int duration, CPos origin, Actor chronosphere) + { + Ticks = ticks; + Duration = duration; + Origin = origin; + Chronosphere = chronosphere; + } + } +} diff --git a/OpenRA.Mods.CA/Traits/ChronoshiftableWithSpriteEffect.cs b/OpenRA.Mods.CA/Traits/ChronoshiftableWithSpriteEffect.cs deleted file mode 100644 index f5764d7494..0000000000 --- a/OpenRA.Mods.CA/Traits/ChronoshiftableWithSpriteEffect.cs +++ /dev/null @@ -1,68 +0,0 @@ -#region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. - */ -#endregion - -using OpenRA.Mods.Cnc.Traits; -using OpenRA.Mods.Common.Effects; -using OpenRA.Traits; - -namespace OpenRA.Mods.CA.Traits -{ - [Desc("Can be teleported via Chronoshift power.")] - public class ChronoshiftableWithSpriteEffectInfo : ChronoshiftableInfo - { - [Desc("Image used for the teleport effects. Defaults to the actor's type.")] - public readonly string Image = null; - - [Desc("Sequence used for the effect played where the unit jumped from.")] - [SequenceReference("Image")] - public readonly string WarpInSequence = null; - - [Desc("Sequence used for the effect played where the unit jumped to.")] - [SequenceReference("Image")] - public readonly string WarpOutSequence = null; - - [Desc("Palette to render the warp in/out sprites in.")] - [PaletteReference] - public readonly string Palette = "effect"; - - public override object Create(ActorInitializer init) { return new ChronoshiftableWithSpriteEffect(init, this); } - } - - public class ChronoshiftableWithSpriteEffect : Chronoshiftable - { - readonly ChronoshiftableWithSpriteEffectInfo info; - - public ChronoshiftableWithSpriteEffect(ActorInitializer init, ChronoshiftableWithSpriteEffectInfo info) - : base(init, info) - { - this.info = info; - } - - public override bool Teleport(Actor self, CPos targetLocation, int duration, bool killCargo, Actor chronosphere) - { - var image = info.Image ?? self.Info.Name; - - var cachedSourcePosition = self.CenterPosition; - var cachedTargetPosition = self.World.Map.CenterOfCell(targetLocation); - - self.World.AddFrameEndTask(w => - { - if (info.WarpInSequence != null) - w.Add(new SpriteEffect(cachedSourcePosition, w, image, info.WarpInSequence, info.Palette)); - - if (info.WarpOutSequence != null) - w.Add(new SpriteEffect(cachedTargetPosition, w, image, info.WarpOutSequence, info.Palette)); - }); - - return base.Teleport(self, targetLocation, duration, killCargo, chronosphere); - } - } -} diff --git a/OpenRA.Mods.CA/Traits/Conditions/DummyConditionConsumer.cs b/OpenRA.Mods.CA/Traits/Conditions/DummyConditionConsumer.cs new file mode 100644 index 0000000000..e542e48b54 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Conditions/DummyConditionConsumer.cs @@ -0,0 +1,29 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Just to prevent YAML errors when a condition isn't used (sometimes cleaner than removing a large number of traits/properties).")] + public class DummyConditionConsumerInfo : TraitInfo + { + [ConsumedConditionReference] + [FieldLoader.Require] + public readonly string Condition = null; + + public override object Create(ActorInitializer init) { return new DummyConditionConsumer(); } + } + + public class DummyConditionConsumer + { + + } +} diff --git a/OpenRA.Mods.CA/Traits/Conditions/DummyConditionGranter.cs b/OpenRA.Mods.CA/Traits/Conditions/DummyConditionGranter.cs new file mode 100644 index 0000000000..dee091cb98 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Conditions/DummyConditionGranter.cs @@ -0,0 +1,29 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Just to prevent YAML errors when a condition is consumed but not granted (sometimes cleaner than removing a large number of traits/properties).")] + public class DummyConditionGranterInfo : TraitInfo + { + [GrantedConditionReference] + [FieldLoader.Require] + public readonly string Condition = null; + + public override object Create(ActorInitializer init) { return new DummyConditionGranter(); } + } + + public class DummyConditionGranter + { + + } +} diff --git a/OpenRA.Mods.CA/Traits/Conditions/GrantChargingCondition.cs b/OpenRA.Mods.CA/Traits/Conditions/GrantChargingCondition.cs new file mode 100644 index 0000000000..c9df9ad53b --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Conditions/GrantChargingCondition.cs @@ -0,0 +1,161 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Gives a condition to the actor that charges when enabled,", + "drains gradually when paused, and is revoked when fully drained or disabled.")] + public class GrantChargingConditionInfo : PausableConditionalTraitInfo + { + [FieldLoader.Require] + [GrantedConditionReference] + [Desc("The condition type to grant.")] + public readonly string Condition = null; + + [Desc("Initial charge.")] + public readonly int InitialCharge = 0; + + [Desc("Maximum charge.")] + public readonly int MaxCharge = 100; + + [Desc("Charge amount per tick when trait is enabled.")] + public readonly int ChargeRate = 1; + + [Desc("Charge drained per tick when trait is paused.")] + public readonly int DischargeRate = 1; + + [Desc("Delay in ticks before charging after being enabled.")] + public readonly int ChargeDelay = 0; + + [Desc("Minimum charge before reactivating after being disabled.")] + public readonly int MinReactivationCharge = 0; + + public readonly bool ShowSelectionBar = true; + public readonly bool ShowSelectionBarWhenFull = true; + public readonly bool ShowSelectionBarWhenEmpty = true; + public readonly Color ChargingColor = Color.DarkRed; + public readonly Color DischargingColor = Color.DarkMagenta; + + public override object Create(ActorInitializer init) { return new GrantChargingCondition(init, this); } + } + + public class GrantChargingCondition : PausableConditionalTrait, INotifyCreated, ITick, ISelectionBar + { + int token = Actor.InvalidConditionToken; + int chargeDelay; + bool forceCharging = false; + + [Sync] + int charge; + + public GrantChargingCondition(ActorInitializer init, GrantChargingConditionInfo info) + : base(info) { } + + protected override void Created(Actor self) + { + charge = Info.InitialCharge; + chargeDelay = Info.ChargeDelay; + + if (charge == Info.MaxCharge) + GrantCondition(self); + } + + void ITick.Tick(Actor self) + { + if (IsTraitDisabled) + return; + + if (!IsTraitPaused || (forceCharging && charge < Info.MinReactivationCharge)) + { + if (charge == Info.MaxCharge) + return; + + if (chargeDelay > 0 && --chargeDelay > 0) + return; + + charge += Info.ChargeRate; + + if (charge > Info.MaxCharge) + charge = Info.MaxCharge; + + if (forceCharging && charge < Info.MinReactivationCharge) + { + RevokeCondition(self); + return; + } + + GrantCondition(self); + } + else + { + if (charge == 0) + return; + + charge -= Info.DischargeRate; + + if (charge <= 0) + { + charge = 0; + RevokeCondition(self); + } + } + } + + void GrantCondition(Actor self) + { + forceCharging = false; + + if (token == Actor.InvalidConditionToken) + token = self.GrantCondition(Info.Condition); + } + + void RevokeCondition(Actor self) + { + forceCharging = true; + + if (token == Actor.InvalidConditionToken) + return; + + token = self.RevokeCondition(token); + } + + protected override void TraitDisabled(Actor self) + { + charge = 0; + chargeDelay = Info.ChargeDelay; + RevokeCondition(self); + } + + protected override void TraitPaused(Actor self) + { + chargeDelay = Info.ChargeDelay; + forceCharging = true; + } + + float ISelectionBar.GetValue() + { + if (!Info.ShowSelectionBar || IsTraitDisabled) + return 0f; + + if (!Info.ShowSelectionBarWhenFull && charge == Info.MaxCharge) + return 0f; + + return (float)charge / Info.MaxCharge; + } + + bool ISelectionBar.DisplayWhenEmpty { get { return charge == Info.MaxCharge ? Info.ShowSelectionBarWhenFull : Info.ShowSelectionBarWhenEmpty; } } + + Color ISelectionBar.GetColor() { return IsTraitPaused ? Info.DischargingColor : Info.ChargingColor; } + } +} diff --git a/OpenRA.Mods.CA/Traits/Conditions/GrantConditionIfOwnerIsNeutral.cs b/OpenRA.Mods.CA/Traits/Conditions/GrantConditionIfOwnerIsNeutral.cs index 18f202909a..7fdd0de819 100644 --- a/OpenRA.Mods.CA/Traits/Conditions/GrantConditionIfOwnerIsNeutral.cs +++ b/OpenRA.Mods.CA/Traits/Conditions/GrantConditionIfOwnerIsNeutral.cs @@ -1,10 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion diff --git a/OpenRA.Mods.CA/Traits/Conditions/GrantConditionOnActivity.cs b/OpenRA.Mods.CA/Traits/Conditions/GrantConditionOnActivity.cs index 78d6b8d504..4a8e1722f6 100644 --- a/OpenRA.Mods.CA/Traits/Conditions/GrantConditionOnActivity.cs +++ b/OpenRA.Mods.CA/Traits/Conditions/GrantConditionOnActivity.cs @@ -1,14 +1,10 @@ #region Copyright & License Information -/* - * By Boolbada of OP Mod - * Follows OpenRA's license as follows: - * - * Copyright 2007-2017 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion diff --git a/OpenRA.Mods.CA/Traits/Conditions/GrantConditionOnAttackCA.cs b/OpenRA.Mods.CA/Traits/Conditions/GrantConditionOnAttackCA.cs index a38dc812ff..d7e01155f8 100644 --- a/OpenRA.Mods.CA/Traits/Conditions/GrantConditionOnAttackCA.cs +++ b/OpenRA.Mods.CA/Traits/Conditions/GrantConditionOnAttackCA.cs @@ -1,11 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -15,6 +14,7 @@ namespace OpenRA.Mods.CA.Traits { + [Desc("CA version can require the target to be an actor.")] public class GrantConditionOnAttackCAInfo : PausableConditionalTraitInfo { [FieldLoader.Require] @@ -94,32 +94,37 @@ void ITick.Tick(Actor self) } } - bool TargetChanged(in Target lastTarget, in Target target) + static bool TargetChanged(in Target lastTarget, in Target target) { // Invalidate reveal changing the target. - if (lastTarget.Type == TargetType.FrozenActor && target.Type == TargetType.Actor) - if (lastTarget.FrozenActor.Actor == target.Actor) - return false; + if (lastTarget.Type == TargetType.FrozenActor && + target.Type == TargetType.Actor && + lastTarget.FrozenActor.Actor == target.Actor) + return false; - if (lastTarget.Type == TargetType.Actor && target.Type == TargetType.FrozenActor) - if (target.FrozenActor.Actor == lastTarget.Actor) - return false; + if (lastTarget.Type == TargetType.Actor && + target.Type == TargetType.FrozenActor && + target.FrozenActor.Actor == lastTarget.Actor) + return false; if (lastTarget.Type != target.Type) return true; // Invalidate attacking different targets with shared target types. - if (lastTarget.Type == TargetType.Actor && target.Type == TargetType.Actor) - if (lastTarget.Actor != target.Actor) - return true; + if (lastTarget.Type == TargetType.Actor && + target.Type == TargetType.Actor && + lastTarget.Actor != target.Actor) + return true; - if (lastTarget.Type == TargetType.FrozenActor && target.Type == TargetType.FrozenActor) - if (lastTarget.FrozenActor != target.FrozenActor) - return true; + if (lastTarget.Type == TargetType.FrozenActor && + target.Type == TargetType.FrozenActor && + lastTarget.FrozenActor != target.FrozenActor) + return true; - if (lastTarget.Type == TargetType.Terrain && target.Type == TargetType.Terrain) - if (lastTarget.CenterPosition != target.CenterPosition) - return true; + if (lastTarget.Type == TargetType.Terrain && + target.Type == TargetType.Terrain && + lastTarget.CenterPosition != target.CenterPosition) + return true; return false; } @@ -132,7 +137,7 @@ void INotifyAttack.Attacking(Actor self, in Target target, Armament a, Barrel ba if (!Info.ArmamentNames.Contains(a.Info.Name)) return; - if (Info.RequiresActorTarget && target.Type != TargetType.Actor) + if (Info.RequiresActorTarget && target.Type != TargetType.Actor && target.Type != TargetType.FrozenActor) return; if (Info.RevokeOnNewTarget) diff --git a/OpenRA.Mods.CA/Traits/Conditions/GrantConditionOnCapture.cs b/OpenRA.Mods.CA/Traits/Conditions/GrantConditionOnCapture.cs new file mode 100644 index 0000000000..22c452bec1 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Conditions/GrantConditionOnCapture.cs @@ -0,0 +1,84 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Linq; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Grants a condition when this actor is captured.")] + class GrantConditionOnCaptureInfo : ConditionalTraitInfo + { + public readonly BitSet Types = default; + + [FieldLoader.Require] + [GrantedConditionReference] + public readonly string Condition = null; + + [Desc("Use `TimedConditionBar` for visualization.")] + public readonly int Duration = 0; + + [Desc("Grant condition only if the capturer's CaptureTypes overlap with these types. Leave empty to allow all types.")] + public readonly BitSet CaptureTypes = default(BitSet); + + public override object Create(ActorInitializer init) { return new GrantConditionOnCapture(this); } + } + + class GrantConditionOnCapture : ConditionalTrait, INotifyCapture, INotifyCreated, ITick + { + int conditionToken = Actor.InvalidConditionToken; + int duration; + IConditionTimerWatcher[] watchers; + + public GrantConditionOnCapture(GrantConditionOnCaptureInfo info) + : base(info) { } + + void INotifyCapture.OnCapture(Actor self, Actor infiltrator, Player oldOwner, Player newOwner, BitSet captureTypes) + { + if (IsTraitDisabled) + return; + + if (!Info.CaptureTypes.IsEmpty && !Info.CaptureTypes.Overlaps(captureTypes)) + return; + + duration = Info.Duration; + + if (conditionToken == Actor.InvalidConditionToken) + conditionToken = self.GrantCondition(Info.Condition); + } + + bool Notifies(IConditionTimerWatcher watcher) { return watcher.Condition == Info.Condition; } + + protected override void Created(Actor self) + { + watchers = self.TraitsImplementing().Where(Notifies).ToArray(); + + base.Created(self); + } + + void ITick.Tick(Actor self) + { + if (conditionToken != Actor.InvalidConditionToken && Info.Duration > 0) + { + if (--duration < 0) + { + conditionToken = self.RevokeCondition(conditionToken); + foreach (var w in watchers) + w.Update(0, 0); + } + else + foreach (var w in watchers) + w.Update(Info.Duration, duration); + } + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Conditions/GrantConditionOnDamage.cs b/OpenRA.Mods.CA/Traits/Conditions/GrantConditionOnDamage.cs new file mode 100644 index 0000000000..514a9fa135 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Conditions/GrantConditionOnDamage.cs @@ -0,0 +1,91 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Grants a timed condition to the actor on taking damage.")] + public class GrantConditionOnDamageInfo : ConditionalTraitInfo, Requires + { + [FieldLoader.Require] + [GrantedConditionReference] + [Desc("The condition to grant.")] + public readonly string Condition = null; + + [Desc("Damage types that apply the condition.")] + public readonly BitSet DamageTypes = default; + + [Desc("Number of ticks the condition lasts.")] + public readonly int Duration = 25; + + [Desc("Valid relationships of the attacker for triggering the condition.")] + public readonly PlayerRelationship ValidRelationships = PlayerRelationship.Neutral | PlayerRelationship.Enemy; + + public override object Create(ActorInitializer init) { return new GrantConditionOnDamage(init.Self, this); } + } + + public class GrantConditionOnDamage : ConditionalTrait, ITick, INotifyDamage + { + public readonly new GrantConditionOnDamageInfo Info; + int token = Actor.InvalidConditionToken; + int ticksRemaining; + + public GrantConditionOnDamage(Actor self, GrantConditionOnDamageInfo info) + : base(info) + { + Info = info; + ticksRemaining = 0; + } + + void INotifyDamage.Damaged(Actor self, AttackInfo ai) + { + if (IsTraitDisabled) + return; + + if (!Info.ValidRelationships.HasRelationship(ai.Attacker.Owner.RelationshipWith(self.Owner))) + return; + + if (ai.Damage.Value <= 0 || (!Info.DamageTypes.IsEmpty && !ai.Damage.DamageTypes.Overlaps(Info.DamageTypes))) + return; + + ticksRemaining = Info.Duration; + GrantCondition(self); + } + + void ITick.Tick(Actor self) + { + if (IsTraitDisabled) + return; + + if (ticksRemaining > 0 && --ticksRemaining == 0) + RevokeCondition(self); + } + + protected override void TraitDisabled(Actor self) + { + RevokeCondition(self); + } + + void GrantCondition(Actor self) + { + if (token == Actor.InvalidConditionToken) + token = self.GrantCondition(Info.Condition); + } + + void RevokeCondition(Actor self) + { + if (token != Actor.InvalidConditionToken) + token = self.RevokeCondition(token); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Conditions/GrantConditionOnDeployTurreted.cs b/OpenRA.Mods.CA/Traits/Conditions/GrantConditionOnDeployTurreted.cs new file mode 100644 index 0000000000..bdc6731e55 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Conditions/GrantConditionOnDeployTurreted.cs @@ -0,0 +1,380 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.Activities; +using OpenRA.Mods.CA.Activities; +using OpenRA.Mods.Common.Orders; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Grants a condition when a deploy order is issued." + + "Can be paused with the granted condition to disable undeploying.")] + public class GrantConditionOnDeployTurretedInfo : PausableConditionalTraitInfo, IEditorActorOptions + { + [GrantedConditionReference] + [Desc("The condition to grant while the actor is undeployed.")] + public readonly string UndeployedCondition = null; + + [FieldLoader.Require] + [GrantedConditionReference] + [Desc("The condition to grant after deploying and revoke before undeploying.")] + public readonly string DeployedCondition = null; + + [Desc("The terrain types that this actor can deploy on. Leave empty to allow any.")] + public readonly HashSet AllowedTerrainTypes = new(); + + [Desc("Can this actor deploy on slopes?")] + public readonly bool CanDeployOnRamps = false; + + [Desc("Does this actor need to synchronize it's deployment with other actors?")] + public readonly bool SmartDeploy = false; + + [CursorReference] + [Desc("Cursor to display when able to (un)deploy the actor.")] + public readonly string DeployCursor = "deploy"; + + [CursorReference] + [Desc("Cursor to display when unable to (un)deploy the actor.")] + public readonly string DeployBlockedCursor = "deploy-blocked"; + + [Desc("Facings that the actor can face before deploying. Leave undefined to deploy regardless of facing.")] + public readonly WAngle[] ValidFacings = { }; + + [Desc("Play a randomly selected sound from this list when deploying.")] + public readonly string[] DeploySounds = null; + + [Desc("Play a randomly selected sound from this list when undeploying.")] + public readonly string[] UndeploySounds = null; + + [Desc("Skip make/deploy animation?")] + public readonly bool SkipMakeAnimation = false; + + [Desc("Undeploy before the actor tries to move?")] + public readonly bool UndeployOnMove = false; + + [Desc("Undeploy before the actor is picked up by a Carryall?")] + public readonly bool UndeployOnPickup = false; + + [VoiceReference] + public readonly string Voice = "Action"; + + [Desc("Display order for the deployed checkbox in the map editor")] + public readonly int EditorDeployedDisplayOrder = 4; + + IEnumerable IEditorActorOptions.ActorOptions(ActorInfo ai, World world) + { + yield return new EditorActorCheckbox("Deployed", EditorDeployedDisplayOrder, + actor => + { + var init = actor.GetInitOrDefault(); + if (init != null) + return init.Value == DeployState.Deployed; + + return false; + }, + (actor, value) => + actor.ReplaceInit(new DeployStateInit(value ? DeployState.Deployed : DeployState.Undeployed))); + } + + public override object Create(ActorInitializer init) { return new GrantConditionOnDeployTurreted(init, this); } + } + + public class GrantConditionOnDeployTurreted : PausableConditionalTrait, IResolveOrder, IIssueOrder, + INotifyDeployComplete, IIssueDeployOrder, IOrderVoice, IWrapMove, IDelayCarryallPickup + { + readonly Actor self; + readonly bool checkTerrainType; + INotifyDeployTriggered[] notify; + int deployedToken = Actor.InvalidConditionToken; + int undeployedToken = Actor.InvalidConditionToken; + int pendingDeployNotifiers; + int pendingUndeployNotifiers; + + public DeployState DeployState { get; private set; } + + public GrantConditionOnDeployTurreted(ActorInitializer init, GrantConditionOnDeployTurretedInfo info) + : base(info) + { + self = init.Self; + checkTerrainType = info.AllowedTerrainTypes.Count > 0; + DeployState = init.GetValue(DeployState.Undeployed); + } + + protected override void Created(Actor self) + { + notify = self.TraitsImplementing().ToArray(); + base.Created(self); + + if (Info.ValidFacings.Length > 0 && DeployState != DeployState.Undeployed) + { + var facing = self.TraitOrDefault(); + if (facing != null) + facing.Facing = Info.ValidFacings.First(); + } + + switch (DeployState) + { + case DeployState.Undeployed: + OnUndeployCompleted(); + break; + case DeployState.Deploying: + Deploy(true); + break; + case DeployState.Deployed: + OnDeployCompleted(); + break; + case DeployState.Undeploying: + Undeploy(true); + break; + } + } + + Activity IWrapMove.WrapMove(Activity moveInner) + { + // Note: We can't assume anything about the current deploy state + // because WrapMove may be called for a queued order + if (!Info.UndeployOnMove) + return moveInner; + + var activity = new DeployForGrantedConditionTurreted(self, this, true); + activity.Queue(moveInner); + return activity; + } + + bool IDelayCarryallPickup.TryLockForPickup(Actor self, Actor carrier) + { + if (!Info.UndeployOnPickup || DeployState == DeployState.Undeployed || IsTraitDisabled) + return true; + + if (DeployState == DeployState.Deployed && !IsTraitPaused) + Undeploy(); + + return false; + } + + IEnumerable IIssueOrder.Orders + { + get + { + if (!IsTraitDisabled) + yield return new DeployOrderTargeter("GrantConditionOnDeployTurreted", 5, + () => CanDeploy() ? Info.DeployCursor : Info.DeployBlockedCursor); + } + } + + public Order IssueOrder(Actor self, IOrderTargeter order, in Target target, bool queued) + { + if (order.OrderID == "GrantConditionOnDeployTurreted") + return new Order(order.OrderID, self, target, queued); + + return null; + } + + Order IIssueDeployOrder.IssueDeployOrder(Actor self, bool queued) + { + return new Order("GrantConditionOnDeployTurreted", self, queued); + } + + bool IIssueDeployOrder.CanIssueDeployOrder(Actor self, bool queued) { return !IsTraitPaused && !IsTraitDisabled && IsGroupDeployNeeded(self); } + + bool IsGroupDeployNeeded(Actor self) + { + if (!Info.SmartDeploy) + return true; + + var actors = self.World.Selection.Actors; + + bool hasDeployedActors = false; + bool hasUndeployedActors = false; + + foreach (var a in actors) + { + GrantConditionOnDeployTurreted gcod = null; + if (!a.IsDead && a.IsInWorld) + gcod = a.TraitOrDefault(); + + if (!hasDeployedActors && gcod != null && (gcod.DeployState == DeployState.Deploying || gcod.DeployState == DeployState.Deployed)) + hasDeployedActors = true; + + if (!hasUndeployedActors && gcod != null && (gcod.DeployState == DeployState.Undeploying || gcod.DeployState == DeployState.Undeployed)) + hasUndeployedActors = true; + + if (!self.IsDead && !self.Disposed && hasDeployedActors && hasUndeployedActors) + { + if (DeployState == DeployState.Undeploying || DeployState == DeployState.Undeployed) + return true; + + return false; + } + } + + return true; + } + + public void ResolveOrder(Actor self, Order order) + { + if (IsTraitDisabled || IsTraitPaused) + return; + + if (order.OrderString != "GrantConditionOnDeployTurreted") + return; + + self.QueueActivity(order.Queued, new DeployForGrantedConditionTurreted(self, this)); + } + + public string VoicePhraseForOrder(Actor self, Order order) + { + return order.OrderString == "GrantConditionOnDeployTurreted" ? Info.Voice : null; + } + + bool CanDeploy() + { + if (IsTraitPaused || IsTraitDisabled) + return false; + + return IsValidTerrain(self.Location) || (DeployState == DeployState.Deployed); + } + + public bool IsValidTerrain(CPos location) + { + return IsValidTerrainType(location) && IsValidRampType(location); + } + + bool IsValidTerrainType(CPos location) + { + if (!self.World.Map.Contains(location)) + return false; + + if (!checkTerrainType) + return true; + + var terrainType = self.World.Map.GetTerrainInfo(location).Type; + + return Info.AllowedTerrainTypes.Contains(terrainType); + } + + bool IsValidRampType(CPos location) + { + if (Info.CanDeployOnRamps) + return true; + + var map = self.World.Map; + return !map.Ramp.Contains(location) || map.Ramp[location] == 0; + } + + void INotifyDeployComplete.FinishedDeploy(Actor self) + { + if (--pendingDeployNotifiers > 0) + return; + + OnDeployCompleted(); + } + + void INotifyDeployComplete.FinishedUndeploy(Actor self) + { + if (--pendingUndeployNotifiers > 0) + return; + + OnUndeployCompleted(); + } + + /// Play deploy sound and animation. + public void Deploy() { Deploy(false); } + void Deploy(bool init) + { + // Something went wrong, most likely due to deploy order spam and the fact that this is a delayed action. + if (!init && DeployState != DeployState.Undeployed) + return; + + if (!IsValidTerrain(self.Location)) + return; + + if (Info.DeploySounds != null && Info.DeploySounds.Length > 0) + Game.Sound.Play(SoundType.World, Info.DeploySounds, self.World, self.CenterPosition); + + // Revoke condition that is applied while undeployed. + if (!init) + OnDeployStarted(); + + // If there is no animation to play just grant the condition that is used while deployed. + // Alternatively, play the deploy animation and then grant the condition. + if (notify.Length == 0) + OnDeployCompleted(); + else + { + pendingDeployNotifiers = notify.Length; + foreach (var n in notify) + n.Deploy(self, Info.SkipMakeAnimation); + } + } + + /// Play undeploy sound and animation and after that revoke the condition. + public void Undeploy() { Undeploy(false); } + void Undeploy(bool init) + { + // Something went wrong, most likely due to deploy order spam and the fact that this is a delayed action. + if (!init && DeployState != DeployState.Deployed) + return; + + if (Info.UndeploySounds != null && Info.UndeploySounds.Length > 0) + Game.Sound.Play(SoundType.World, Info.UndeploySounds, self.World, self.CenterPosition); + + if (!init) + OnUndeployStarted(); + + // If there is no animation to play just grant the condition that is used while undeployed. + // Alternatively, play the undeploy animation and then grant the condition. + if (notify.Length == 0) + OnUndeployCompleted(); + else + { + pendingUndeployNotifiers = notify.Length; + foreach (var n in notify) + n.Undeploy(self, Info.SkipMakeAnimation); + } + } + + void OnDeployStarted() + { + if (undeployedToken != Actor.InvalidConditionToken) + undeployedToken = self.RevokeCondition(undeployedToken); + + DeployState = DeployState.Deploying; + } + + void OnDeployCompleted() + { + if (deployedToken == Actor.InvalidConditionToken) + deployedToken = self.GrantCondition(Info.DeployedCondition); + + DeployState = DeployState.Deployed; + } + + void OnUndeployStarted() + { + if (deployedToken != Actor.InvalidConditionToken) + deployedToken = self.RevokeCondition(deployedToken); + + DeployState = DeployState.Undeploying; + } + + void OnUndeployCompleted() + { + if (undeployedToken == Actor.InvalidConditionToken) + undeployedToken = self.GrantCondition(Info.UndeployedCondition); + + DeployState = DeployState.Undeployed; + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Conditions/GrantConditionOnFogEnabled.cs b/OpenRA.Mods.CA/Traits/Conditions/GrantConditionOnFogEnabled.cs deleted file mode 100644 index 5338764ec7..0000000000 --- a/OpenRA.Mods.CA/Traits/Conditions/GrantConditionOnFogEnabled.cs +++ /dev/null @@ -1,51 +0,0 @@ -#region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. - */ -#endregion - -using OpenRA.Traits; - -namespace OpenRA.Mods.CA.Traits -{ - [Desc("Grants a condition to the actor when created if fog is enabled.")] - public class GrantConditionOnFogEnabledInfo : TraitInfo - { - [FieldLoader.Require] - [GrantedConditionReference] - [Desc("Condition to grant.")] - public readonly string Condition = null; - - public override object Create(ActorInitializer init) { return new GrantConditionOnFogEnabled(init.Self, this); } - } - - public class GrantConditionOnFogEnabled : INotifyCreated - { - readonly GrantConditionOnFogEnabledInfo info; - - public GrantConditionOnFogEnabled(Actor self, GrantConditionOnFogEnabledInfo info) - { - this.info = info; - } - - void INotifyCreated.Created(Actor self) - { - if (info.Condition == null) - return; - - var gs = self.World.LobbyInfo.GlobalSettings; - var fogEnabled = gs.OptionOrDefault("fog", true); - - if (!fogEnabled) - return; - - if (!string.IsNullOrEmpty(info.Condition)) - self.GrantCondition(info.Condition); - } - } -} diff --git a/OpenRA.Mods.CA/Traits/Conditions/GrantConditionOnFullHarvester.cs b/OpenRA.Mods.CA/Traits/Conditions/GrantConditionOnFullHarvester.cs deleted file mode 100644 index d36dbaefd7..0000000000 --- a/OpenRA.Mods.CA/Traits/Conditions/GrantConditionOnFullHarvester.cs +++ /dev/null @@ -1,63 +0,0 @@ -#region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. - */ -#endregion - -using OpenRA.Mods.Common.Traits; -using OpenRA.Traits; - -namespace OpenRA.Mods.CA.Traits -{ - public class GrantConditionOnFullHarvesterInfo : TraitInfo, Requires - { - [FieldLoader.Require] - [GrantedConditionReference] - [Desc("Condition to grant.")] - public readonly string Condition = null; - - public override object Create(ActorInitializer init) { return new GrantConditionOnFullHarvester(init, this); } - } - - public class GrantConditionOnFullHarvester : INotifyHarvesterAction - { - readonly Harvester harvester; - readonly string conditionToGrant; - readonly Actor self; - int token = Actor.InvalidConditionToken; - - public GrantConditionOnFullHarvester(ActorInitializer init, GrantConditionOnFullHarvesterInfo info) - { - conditionToGrant = info.Condition; - self = init.Self; - harvester = init.Self.Trait(); - } - - void INotifyHarvesterAction.Harvested(Actor self, ResourceType resource) - { - if (harvester.IsFull) - token = self.GrantCondition(conditionToGrant); - } - - void INotifyHarvesterAction.MovingToResources(Actor self, CPos targetCell) { } - void INotifyHarvesterAction.MovingToRefinery(Actor self, Actor refineryActor) { } - void INotifyHarvesterAction.MovementCancelled(Actor self) { } - - void INotifyHarvesterAction.Docked() - { - if (!harvester.IsFull && token != Actor.InvalidConditionToken) - token = self.RevokeCondition(token); - } - - void INotifyHarvesterAction.Undocked() - { - if (!harvester.IsFull && token != Actor.InvalidConditionToken) - token = self.RevokeCondition(token); - } - } -} diff --git a/OpenRA.Mods.CA/Traits/Conditions/GrantConditionOnHealingReceived.cs b/OpenRA.Mods.CA/Traits/Conditions/GrantConditionOnHealingReceived.cs new file mode 100644 index 0000000000..5362389431 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Conditions/GrantConditionOnHealingReceived.cs @@ -0,0 +1,197 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + public enum RequiredHealingType + { + Absolute, + Percentage + } + + [Desc("Gives a condition to the actor after being healed a given amount or number of times in a given timeframe.")] + public class GrantConditionOnHealingReceivedInfo : ConditionalTraitInfo, Requires + { + [FieldLoader.Require] + [GrantedConditionReference] + [Desc("The condition to grant.")] + public readonly string Condition = null; + + [Desc("Damage types that count for healing purposes.")] + public readonly BitSet DamageTypes = default; + + [Desc("Number of stacks required for condition to apply.")] + public readonly int RequiredStacks = 1; + + [Desc("If a positive number, ignore RequiredStacks and require an amount of healing.")] + public readonly int RequiredHealing = 0; + + [Desc("If using RequiredHealing, whether to use an absolute amount or a percentage of maximum HP.")] + public readonly RequiredHealingType RequiredHealingType = RequiredHealingType.Absolute; + + [Desc("Minimum amount of healing that applies a stack.")] + public readonly int MinimumHealing = 1000; + + [Desc("Number of ticks one stack lasts.")] + public readonly int StackDuration = 250; + + public readonly bool ShowSelectionBar = true; + public readonly Color SelectionBarColor = Color.White; + + public override object Create(ActorInitializer init) { return new GrantConditionOnHealingReceived(init.Self, this); } + } + + public class GrantConditionOnHealingReceived : ConditionalTrait, ITick, INotifyDamage, ISelectionBar + { + public readonly new GrantConditionOnHealingReceivedInfo Info; + int token = Actor.InvalidConditionToken; + int initialDuration; + List stacks; + bool worthShowingBar; + + readonly int requiredStacks; + readonly int requiredHealing; + + int AmountHealed { get { return stacks.Sum(s => s.AmountHealed); } } + bool ThresholdMet { get { return stacks.Count > 0 && ((Info.RequiredHealing <= 0 && stacks.Count >= requiredStacks) || (Info.RequiredHealing > 0 && AmountHealed >= requiredHealing)); } } + + int ThresholdStackDuration + { + get + { + if (Info.RequiredHealing <= 0) + return stacks[stacks.Count - requiredStacks].RemainingDuration; + + var thresholdStackNumber = 0; + var amountHealed = 0; + + for (int i = stacks.Count - 1; i >= 0; i--) + { + amountHealed += stacks[i].AmountHealed; + if (amountHealed >= requiredHealing) + { + thresholdStackNumber = i; + } + } + + return stacks[thresholdStackNumber].RemainingDuration; + } + } + + public GrantConditionOnHealingReceived(Actor self, GrantConditionOnHealingReceivedInfo info) + : base(info) + { + Info = info; + stacks = new List(); + initialDuration = Info.StackDuration; + + if (Info.RequiredHealing > 0) + { + if (Info.RequiredHealingType == RequiredHealingType.Percentage) + { + var healthInfo = self.Info.TraitInfo(); + requiredHealing = healthInfo.HP * (Info.RequiredHealing / 100); + } + else + requiredHealing = Info.RequiredHealing; + } + else + requiredStacks = Info.RequiredStacks; + } + + void INotifyDamage.Damaged(Actor self, AttackInfo ai) + { + if (IsTraitDisabled) + return; + + if (ai.Damage.Value >= 0 || (!Info.DamageTypes.IsEmpty && !ai.Damage.DamageTypes.Overlaps(Info.DamageTypes))) + return; + + if (ai.Damage.Value * -1 >= Info.MinimumHealing) + AddStack(ai.Damage.Value * -1); + + if (ThresholdMet) + { + // Set to the remaining duration of the highest stack required for the condition to be active + initialDuration = ThresholdStackDuration; + worthShowingBar = initialDuration > 30; + GrantCondition(self); + } + } + + void ITick.Tick(Actor self) + { + if (IsTraitDisabled) + return; + + if (stacks.Count == 0) + return; + + for (int i = 0; i < stacks.Count; i++) + stacks[i].RemainingDuration--; + + stacks.RemoveAll(s => s.RemainingDuration <= 0); + + if (!ThresholdMet) + RevokeCondition(self); + } + + protected override void TraitDisabled(Actor self) + { + stacks = new List(); + RevokeCondition(self); + } + + void AddStack(int amountHealed) + { + stacks.Add(new HealingStack + { + RemainingDuration = Info.StackDuration, + AmountHealed = amountHealed + }); + } + + void GrantCondition(Actor self) + { + if (token == Actor.InvalidConditionToken) + token = self.GrantCondition(Info.Condition); + } + + void RevokeCondition(Actor self) + { + if (token != Actor.InvalidConditionToken) + token = self.RevokeCondition(token); + } + + float ISelectionBar.GetValue() + { + if (IsTraitDisabled || !Info.ShowSelectionBar || token == Actor.InvalidConditionToken || !worthShowingBar) + return 0f; + + return (float)ThresholdStackDuration / initialDuration; + } + + bool ISelectionBar.DisplayWhenEmpty { get { return false; } } + + Color ISelectionBar.GetColor() { return Info.SelectionBarColor; } + } + + class HealingStack + { + public int RemainingDuration { get; set; } + public int AmountHealed { get; set; } + } +} diff --git a/OpenRA.Mods.CA/Traits/Conditions/GrantConditionOnLobbyOption.cs b/OpenRA.Mods.CA/Traits/Conditions/GrantConditionOnLobbyOption.cs new file mode 100644 index 0000000000..7ea392d1a6 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Conditions/GrantConditionOnLobbyOption.cs @@ -0,0 +1,71 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Linq; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Grants a condition to the actor when created if fog is enabled.")] + public class GrantConditionOnLobbyOptionInfo : TraitInfo + { + [FieldLoader.Require] + [GrantedConditionReference] + [Desc("Condition to grant.")] + public readonly string Condition = null; + + [FieldLoader.Require] + [Desc("Name of the lobby option.")] + public readonly string Name = null; + + [Desc("Whether value is boolean (condition is enabled if option value is true).")] + public readonly bool IsBoolean = false; + + [Desc("If not boolean, list of string values that enable the condition.")] + public readonly string[] Values = new string[] {}; + + public override object Create(ActorInitializer init) { return new GrantConditionOnLobbyOption(init.Self, this); } + } + + public class GrantConditionOnLobbyOption : INotifyCreated + { + readonly GrantConditionOnLobbyOptionInfo info; + + public GrantConditionOnLobbyOption(Actor self, GrantConditionOnLobbyOptionInfo info) + { + this.info = info; + } + + void INotifyCreated.Created(Actor self) + { + if (info.Condition == null) + return; + + var gs = self.World.LobbyInfo.GlobalSettings; + bool enabled; + + if (info.IsBoolean) + { + enabled = gs.OptionOrDefault(info.Name, false); + } + else + { + var value = gs.OptionOrDefault(info.Name, ""); + enabled = info.Values.Contains(value); + } + + if (!enabled) + return; + + if (!string.IsNullOrEmpty(info.Condition)) + self.GrantCondition(info.Condition); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Conditions/GrantConditionOnOrders.cs b/OpenRA.Mods.CA/Traits/Conditions/GrantConditionOnOrders.cs new file mode 100644 index 0000000000..48328f77b0 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Conditions/GrantConditionOnOrders.cs @@ -0,0 +1,114 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Toggles a condition on and off when a specified order type is received.")] + public class GrantConditionOnOrdersInfo : PausableConditionalTraitInfo + { + [FieldLoader.Require] + [GrantedConditionReference] + [Desc("Condition to grant.")] + public readonly string Condition = null; + + [FieldLoader.Require] + [Desc("Order name that toggles the condition.")] + public readonly HashSet OrderNames = new HashSet { }; + + [Desc("Only grant condition if the target is an actor?")] + public readonly bool RequiresActorTarget = false; + + [Desc("Sound to play when condition is granted.")] + public readonly string ActiveSound = null; + + [Desc("Will apply if the order is queued.")] + public readonly bool IncludeQueued = false; + + [Desc("Valid relationships of the attacker for triggering the condition.")] + public readonly PlayerRelationship ValidTargetRelationships = PlayerRelationship.Ally | PlayerRelationship.Neutral | PlayerRelationship.Enemy; + + public override object Create(ActorInitializer init) { return new GrantConditionOnOrders(init.Self, this); } + } + + public class GrantConditionOnOrders : PausableConditionalTrait, IResolveOrder, INotifyBecomingIdle + { + int conditionToken = Actor.InvalidConditionToken; + + public GrantConditionOnOrders(Actor self, GrantConditionOnOrdersInfo info) + : base(info) { } + + void IResolveOrder.ResolveOrder(Actor self, Order order) + { + if (IsTraitDisabled || IsTraitPaused) + return; + + if (Info.OrderNames.Contains(order.OrderString)) + { + if (order.Queued && !Info.IncludeQueued) + return; + + if (Info.RequiresActorTarget && order.Target.Type != TargetType.Actor && order.Target.Type != TargetType.FrozenActor) + return; + + Actor targetActor = null; + if (order.Target.Type == TargetType.Actor) + targetActor = order.Target.Actor; + else if (order.Target.Type == TargetType.FrozenActor) + targetActor = order.Target.FrozenActor.Actor; + + if (targetActor != null && !Info.ValidTargetRelationships.HasRelationship(targetActor.Owner.RelationshipWith(self.Owner))) + return; + + if (Info.OrderNames.Contains(order.OrderString)) + GrantCondition(self); + } + else if (!order.Queued) + RevokeCondition(self); + } + + void INotifyBecomingIdle.OnBecomingIdle(Actor self) + { + RevokeCondition(self); + } + + void GrantCondition(Actor self) + { + if (conditionToken == Actor.InvalidConditionToken) + { + conditionToken = self.GrantCondition(Info.Condition); + + if (!string.IsNullOrEmpty(Info.ActiveSound)) + Game.Sound.Play(SoundType.World, Info.ActiveSound, self.CenterPosition); + } + } + + void RevokeCondition(Actor self) + { + if (conditionToken == Actor.InvalidConditionToken) + return; + + conditionToken = self.RevokeCondition(conditionToken); + } + + protected override void TraitDisabled(Actor self) + { + RevokeCondition(self); + } + + protected override void TraitPaused(Actor self) + { + RevokeCondition(self); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Conditions/GrantConditionOnPlayerFunds.cs b/OpenRA.Mods.CA/Traits/Conditions/GrantConditionOnPlayerFunds.cs new file mode 100644 index 0000000000..6d97da00b5 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Conditions/GrantConditionOnPlayerFunds.cs @@ -0,0 +1,65 @@ +#region Copyright & License Information +/* + * Copyright (c) The OpenRA Developers and Contributors + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. For more + * information, see COPYING. + */ +#endregion + +using OpenRA.Traits; +using OpenRA.Mods.Common.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Grants a condition to this actor when the player has stored funds (cash plus resources).")] + public class GrantConditionOnPlayerFundsInfo : TraitInfo + { + [FieldLoader.Require] + [GrantedConditionReference] + [Desc("Condition to grant.")] + public readonly string Condition = null; + + [Desc("Enable condition when funds are greater than this.")] + public readonly int Threshold = 0; + + public override object Create(ActorInitializer init) { return new GrantConditionOnPlayerFunds(this); } + } + + public class GrantConditionOnPlayerFunds : INotifyCreated, INotifyOwnerChanged, ITick + { + readonly GrantConditionOnPlayerFundsInfo info; + PlayerResources playerResources; + + int conditionToken = Actor.InvalidConditionToken; + + public GrantConditionOnPlayerFunds(GrantConditionOnPlayerFundsInfo info) + { + this.info = info; + } + + void INotifyCreated.Created(Actor self) + { + playerResources = self.Owner.PlayerActor.Trait(); + } + + void INotifyOwnerChanged.OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) + { + playerResources = newOwner.PlayerActor.Trait(); + } + + void ITick.Tick(Actor self) + { + if (string.IsNullOrEmpty(info.Condition)) + return; + + var enabled = playerResources.GetCashAndResources() > info.Threshold; + if (enabled && conditionToken == Actor.InvalidConditionToken) + conditionToken = self.GrantCondition(info.Condition); + else if (!enabled && conditionToken != Actor.InvalidConditionToken) + conditionToken = self.RevokeCondition(conditionToken); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Conditions/GrantConditionOnPrerequisiteCA.cs b/OpenRA.Mods.CA/Traits/Conditions/GrantConditionOnPrerequisiteCA.cs new file mode 100644 index 0000000000..a16048e4f1 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Conditions/GrantConditionOnPrerequisiteCA.cs @@ -0,0 +1,82 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Grants a condition to the actor this is attached to when prerequisites are available.")] + public class GrantConditionOnPrerequisiteCAInfo : TraitInfo + { + [FieldLoader.Require] + [GrantedConditionReference] + [Desc("The condition to grant.")] + public readonly string Condition = null; + + [FieldLoader.Require] + [Desc("List of required prerequisites.")] + public readonly string[] Prerequisites = { }; + + public override object Create(ActorInitializer init) { return new GrantConditionOnPrerequisiteCA(init.Self, this); } + } + + public class GrantConditionOnPrerequisiteCA : INotifyCreated, INotifyAddedToWorld, INotifyRemovedFromWorld, INotifyOwnerChanged + { + readonly GrantConditionOnPrerequisiteCAInfo info; + + bool wasAvailable; + GrantConditionOnPrerequisiteManagerCA globalManager; + int conditionToken = Actor.InvalidConditionToken; + + public GrantConditionOnPrerequisiteCA(Actor self, GrantConditionOnPrerequisiteCAInfo info) + { + this.info = info; + } + + void INotifyCreated.Created(Actor self) + { + globalManager = self.Owner.PlayerActor.Trait(); + } + + void INotifyAddedToWorld.AddedToWorld(Actor self) + { + if (info.Prerequisites.Length > 0) + globalManager.Register(self, this, info.Prerequisites); + } + + void INotifyRemovedFromWorld.RemovedFromWorld(Actor self) + { + if (info.Prerequisites.Length > 0) + globalManager.Unregister(self, this, info.Prerequisites); + } + + void INotifyOwnerChanged.OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) + { + globalManager = newOwner.PlayerActor.Trait(); + } + + public void PrerequisitesUpdated(Actor self, bool available) + { + // fix for CA - only difference to standard GrantConditionOnPrerequisite is this part is wrapped in an AddFrameEndTask + self.World.AddFrameEndTask(w => + { + if (available == wasAvailable) + return; + + if (available && conditionToken == Actor.InvalidConditionToken) + conditionToken = self.GrantCondition(info.Condition); + else if (!available && conditionToken != Actor.InvalidConditionToken) + conditionToken = self.RevokeCondition(conditionToken); + + wasAvailable = available; + }); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Conditions/GrantConditionOnResupply.cs b/OpenRA.Mods.CA/Traits/Conditions/GrantConditionOnResupply.cs new file mode 100644 index 0000000000..1cd3c85155 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Conditions/GrantConditionOnResupply.cs @@ -0,0 +1,75 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Grants a condition when being resupplied.")] + public class GrantConditionOnResupplyInfo : PausableConditionalTraitInfo + { + [FieldLoader.Require] + [GrantedConditionReference] + [Desc("Condition to grant.")] + public readonly string Condition = null; + + [Desc("Order name that toggles the condition.")] + public readonly bool GrantPermanently = false; + + public override object Create(ActorInitializer init) { return new GrantConditionOnResupply(init.Self, this); } + } + + public class GrantConditionOnResupply : PausableConditionalTrait, INotifyDockClient + { + int conditionToken = Actor.InvalidConditionToken; + + public GrantConditionOnResupply(Actor self, GrantConditionOnResupplyInfo info) + : base(info) { } + + void INotifyDockClient.Docked(Actor self, Actor host) + { + if (IsTraitDisabled || IsTraitPaused) + return; + + GrantCondition(self); + } + + void INotifyDockClient.Undocked(Actor self, Actor host) + { + if (!Info.GrantPermanently) + RevokeCondition(self); + } + + void GrantCondition(Actor self) + { + if (conditionToken == Actor.InvalidConditionToken) + conditionToken = self.GrantCondition(Info.Condition); + } + + void RevokeCondition(Actor self) + { + if (conditionToken == Actor.InvalidConditionToken) + return; + + conditionToken = self.RevokeCondition(conditionToken); + } + + protected override void TraitDisabled(Actor self) + { + RevokeCondition(self); + } + + protected override void TraitPaused(Actor self) + { + RevokeCondition(self); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Conditions/GrantConditionOnResupplying.cs b/OpenRA.Mods.CA/Traits/Conditions/GrantConditionOnResupplying.cs new file mode 100644 index 0000000000..df9a1f075c --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Conditions/GrantConditionOnResupplying.cs @@ -0,0 +1,81 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Grants a condition when resupplying another actor.")] + public class GrantConditionOnResupplyingInfo : PausableConditionalTraitInfo + { + [FieldLoader.Require] + [GrantedConditionReference] + [Desc("Condition to grant.")] + public readonly string Condition = null; + + public override object Create(ActorInitializer init) { return new GrantConditionOnResupplying(init.Self, this); } + } + + public class GrantConditionOnResupplying : PausableConditionalTrait, INotifyResupply + { + int conditionToken = Actor.InvalidConditionToken; + bool repairing; + bool rearming; + + public GrantConditionOnResupplying(Actor self, GrantConditionOnResupplyingInfo info) + : base(info) { } + + void INotifyResupply.BeforeResupply(Actor self, Actor target, ResupplyType types) + { + if (IsTraitDisabled || IsTraitPaused) + return; + + repairing = types.HasFlag(ResupplyType.Repair); + rearming = types.HasFlag(ResupplyType.Rearm); + + if (repairing || rearming) + GrantCondition(self); + } + + void INotifyResupply.ResupplyTick(Actor self, Actor target, ResupplyType types) + { + repairing = types.HasFlag(ResupplyType.Repair); + rearming = types.HasFlag(ResupplyType.Rearm); + + if (!repairing && !rearming) + RevokeCondition(self); + } + + void GrantCondition(Actor self) + { + if (conditionToken == Actor.InvalidConditionToken) + conditionToken = self.GrantCondition(Info.Condition); + } + + void RevokeCondition(Actor self) + { + if (conditionToken == Actor.InvalidConditionToken) + return; + + conditionToken = self.RevokeCondition(conditionToken); + } + + protected override void TraitDisabled(Actor self) + { + RevokeCondition(self); + } + + protected override void TraitPaused(Actor self) + { + RevokeCondition(self); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Conditions/GrantConditionToAttached.cs b/OpenRA.Mods.CA/Traits/Conditions/GrantConditionToAttached.cs new file mode 100644 index 0000000000..985b20c52c --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Conditions/GrantConditionToAttached.cs @@ -0,0 +1,81 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Grants a condition to any attached actors.")] + public class GrantConditionToAttachedInfo : ConditionalTraitInfo, Requires + { + [FieldLoader.Require] + [Desc("The condition to grant.")] + public readonly string Condition = null; + + public override object Create(ActorInitializer init) { return new GrantConditionToAttached(init.Self, this); } + } + + public class GrantConditionToAttached : ConditionalTrait, INotifyAttachedTo + { + public readonly new GrantConditionToAttachedInfo Info; + Dictionary attachedTokens = new(); + + public GrantConditionToAttached(Actor self, GrantConditionToAttachedInfo info) + : base(info) + { + Info = info; + } + + protected override void TraitEnabled(Actor self) + { + foreach (var kv in attachedTokens) + { + attachedTokens[kv.Key] = kv.Key.GrantConditionFromAttachedTo(Info.Condition); + } + } + + protected override void TraitDisabled(Actor self) + { + foreach (var kv in attachedTokens) + { + kv.Key.RevokeConditionFromAttachedTo(attachedTokens[kv.Key]); + } + } + + void INotifyAttachedTo.Attached(Actor self, Actor attachedActor, Attachable attachable) + { + if (!attachedTokens.ContainsKey(attachable)) + attachedTokens.Add(attachable, Actor.InvalidConditionToken); + + if (IsTraitDisabled) + return; + + attachedTokens[attachable] = attachable.GrantConditionFromAttachedTo(Info.Condition); + } + + void INotifyAttachedTo.Detached(Actor self, Actor detachedActor, Attachable attachable) + { + attachedTokens.Remove(attachable); + + if (IsTraitDisabled) + return; + + if (attachedTokens.ContainsKey(attachable)) + { + if (attachedTokens[attachable] != Actor.InvalidConditionToken) + attachable.RevokeConditionFromAttachedTo(attachedTokens[attachable]); + + attachedTokens.Remove(attachable); + } + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Conditions/GrantConditionWhileProducing.cs b/OpenRA.Mods.CA/Traits/Conditions/GrantConditionWhileProducing.cs new file mode 100644 index 0000000000..69aed8bf25 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Conditions/GrantConditionWhileProducing.cs @@ -0,0 +1,107 @@ +#region Copyright & License Information +/* + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Linq; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Grants a condition while the actor is producing something.")] + public class GrantConditionWhileProducingInfo : ConditionalTraitInfo, Requires + { + [FieldLoader.Require] + [Desc("Production queue type, for actors with multiple queues.")] + public readonly string ProductionType = null; + + [GrantedConditionReference] + [Desc("The condition to grant while producing.")] + public readonly string Condition = null; + + public override object Create(ActorInitializer init) { return new GrantConditionWhileProducing(init, this); } + } + + public class GrantConditionWhileProducing : ConditionalTrait, ITick, INotifyOwnerChanged, INotifyCreated + { + readonly GrantConditionWhileProducingInfo info; + readonly Actor self; + + ProductionQueue queue; + int conditionToken = Actor.InvalidConditionToken; + bool wasProducing = false; + + public GrantConditionWhileProducing(ActorInitializer init, GrantConditionWhileProducingInfo info) + : base(info) + { + this.info = info; + self = init.Self; + } + + void INotifyCreated.Created(Actor self) + { + FindQueue(); + } + + void FindQueue() + { + // Per-actor queue + queue = self.TraitsImplementing() + .FirstOrDefault(q => info.ProductionType == q.Info.Type); + + // If no queues available - check for classic production queues + queue ??= self.Owner.PlayerActor.TraitsImplementing() + .FirstOrDefault(q => info.ProductionType == q.Info.Type); + } + + bool IsProducing() + { + if (queue == null) + return false; + + var current = queue.AllQueued().Where(i => i.Started).MinByOrDefault(i => i.RemainingTime); + return current != null; + } + + void GrantCondition() + { + if (string.IsNullOrEmpty(info.Condition) || conditionToken != Actor.InvalidConditionToken) + return; + + conditionToken = self.GrantCondition(info.Condition); + } + + void RevokeCondition() + { + if (conditionToken == Actor.InvalidConditionToken) + return; + + conditionToken = self.RevokeCondition(conditionToken); + } + + void ITick.Tick(Actor self) + { + var isProducing = !IsTraitDisabled && IsProducing(); + + if (!isProducing && wasProducing) + RevokeCondition(); + else if (isProducing && !wasProducing) + GrantCondition(); + + wasProducing = isProducing; + } + + void INotifyOwnerChanged.OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) + { + RevokeCondition(); + wasProducing = false; + FindQueue(); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Conditions/GrantDelayedCondition.cs b/OpenRA.Mods.CA/Traits/Conditions/GrantDelayedCondition.cs index 7e8324c7ce..6889963dad 100644 --- a/OpenRA.Mods.CA/Traits/Conditions/GrantDelayedCondition.cs +++ b/OpenRA.Mods.CA/Traits/Conditions/GrantDelayedCondition.cs @@ -1,13 +1,14 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion +using OpenRA.Mods.Common; using OpenRA.Mods.Common.Traits; using OpenRA.Traits; @@ -21,8 +22,9 @@ public class GrantDelayedConditionInfo : PausableConditionalTraitInfo [Desc("The condition to grant.")] public readonly string Condition = null; - [Desc("Number of ticks to wait before granting the condition.")] - public readonly int Delay = 50; + [Desc("Number of ticks to wait before granting the condition.", + "Two values indicate a random delay range.")] + public readonly int[] Delay = { 50 }; [Desc("If the trait is disabled, revoke the condition and reset the delay.")] public readonly bool RevokeOnDisabled = false; @@ -30,7 +32,7 @@ public class GrantDelayedConditionInfo : PausableConditionalTraitInfo [Desc("If the trait is paused, revoke the condition and reset the delay.")] public readonly bool RevokeOnPaused = false; - public override object Create(ActorInitializer init) { return new GrantDelayedCondition(this); } + public override object Create(ActorInitializer init) { return new GrantDelayedCondition(init.Self, this); } } public class GrantDelayedCondition : PausableConditionalTrait, ITick @@ -38,12 +40,14 @@ public class GrantDelayedCondition : PausableConditionalTrait, INotifyRemovedFromWorld, INotifyAddedToWorld, INotifyOwnerChanged, INotifyKilled + { + int conditionToken = Actor.InvalidConditionToken; + ExternalCondition playerConditionTrait; + + public GrantExternalConditionToOwner(GrantExternalConditionToOwnerInfo info) + : base(info) { } + + protected override void Created(Actor self) + { + base.Created(self); + + UpdatePlayerConditionReference(self); + } + + void INotifyOwnerChanged.OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) + { + UpdatePlayerConditionReference(self); + } + + protected override void TraitEnabled(Actor self) + { + if (!self.IsDead && self.IsInWorld && conditionToken == Actor.InvalidConditionToken) + conditionToken = playerConditionTrait.GrantCondition(self.Owner.PlayerActor, self); + } + + protected override void TraitDisabled(Actor self) + { + if (!self.IsDead && self.IsInWorld && conditionToken != Actor.InvalidConditionToken) + if (playerConditionTrait.TryRevokeCondition(self.Owner.PlayerActor, self, conditionToken)) + conditionToken = Actor.InvalidConditionToken; + } + + void UpdatePlayerConditionReference(Actor self) + { + playerConditionTrait = self.Owner.PlayerActor.TraitsImplementing() + .FirstOrDefault(t => t.Info.Condition == Info.Condition); + } + + void INotifyAddedToWorld.AddedToWorld(Actor self) + { + if (!self.IsDead && !IsTraitDisabled && conditionToken == Actor.InvalidConditionToken) + conditionToken = playerConditionTrait.GrantCondition(self.Owner.PlayerActor, self); + } + + void INotifyRemovedFromWorld.RemovedFromWorld(Actor self) + { + if (!self.IsDead && !IsTraitDisabled && conditionToken != Actor.InvalidConditionToken) + if (playerConditionTrait.TryRevokeCondition(self.Owner.PlayerActor, self, conditionToken)) + conditionToken = Actor.InvalidConditionToken; + } + + void INotifyKilled.Killed(Actor self, AttackInfo e) + { + if (conditionToken != Actor.InvalidConditionToken) + if (playerConditionTrait.TryRevokeCondition(self.Owner.PlayerActor, self, conditionToken)) + conditionToken = Actor.InvalidConditionToken; + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Conditions/GrantPeriodicCondition.cs b/OpenRA.Mods.CA/Traits/Conditions/GrantPeriodicCondition.cs index be9d68fc11..4b306a9cf1 100644 --- a/OpenRA.Mods.CA/Traits/Conditions/GrantPeriodicCondition.cs +++ b/OpenRA.Mods.CA/Traits/Conditions/GrantPeriodicCondition.cs @@ -1,10 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -31,9 +31,12 @@ public class GrantPeriodicConditionInfo : PausableConditionalTraitInfo public readonly bool StartsGranted = false; public readonly bool ShowSelectionBar = false; + public readonly bool ShowSelectionBarWhenEmpty = true; public readonly Color CooldownColor = Color.DarkRed; public readonly Color ActiveColor = Color.DarkMagenta; + public bool ResetTimeOnReenable = true; + public override object Create(ActorInitializer init) { return new GrantPeriodicCondition(init, this); } } @@ -47,6 +50,7 @@ public class GrantPeriodicCondition : PausableConditionalTrait, INotifyCreated, ITick, ISelectionBar + { + int token = Actor.InvalidConditionToken; + int delay; + bool forceCooling; + + [Sync] + int temp; + + public GrantThermalCondition(ActorInitializer init, GrantThermalConditionInfo info) + : base(info) { } + + protected override void Created(Actor self) + { + temp = Info.InitialTemp; + delay = Info.TransitionDelay; + + if (temp < Info.MaxTemp && temp <= Info.MaxReactivationTemp) + GrantCondition(self); + } + + void ITick.Tick(Actor self) + { + if (IsTraitDisabled) + return; + + if (IsTraitPaused || (temp > Info.MaxReactivationTemp)) + { + if (delay > 0 && --delay > 0) + return; + + if (temp == 0) + return; + + temp -= Info.CoolingRate; + + if (temp < 0) + temp = 0; + + if (forceCooling && temp > Info.MaxReactivationTemp) + { + RevokeCondition(self); + return; + } + + GrantCondition(self); + } + else + { + if (temp == Info.MaxTemp) + return; + + if (delay > 0 && --delay > 0) + return; + + temp += Info.HeatingRate; + + if (temp > Info.MaxTemp) + temp = Info.MaxTemp; + + if (temp >= Info.MaxTemp) + RevokeCondition(self); + } + } + + void GrantCondition(Actor self) + { + forceCooling = false; + if (token == Actor.InvalidConditionToken) + token = self.GrantCondition(Info.Condition); + } + + void RevokeCondition(Actor self) + { + forceCooling = true; + + if (token == Actor.InvalidConditionToken) + return; + + token = self.RevokeCondition(token); + } + + protected override void TraitDisabled(Actor self) + { + temp = 0; + delay = Info.TransitionDelay; + RevokeCondition(self); + } + + protected override void TraitPaused(Actor self) + { + delay = Info.TransitionDelay; + forceCooling = true; + } + + protected override void TraitResumed(Actor self) + { + delay = Info.TransitionDelay; + } + + float Temperature { get { return (float)temp / Info.MaxTemp; } } + + float ISelectionBar.GetValue() + { + if (!Info.ShowSelectionBar || IsTraitDisabled) + return 0f; + + return Temperature; + } + + bool ISelectionBar.DisplayWhenEmpty { get { return Info.ShowSelectionBarWhenEmpty; } } + + Color ISelectionBar.GetColor() + { + if (Temperature > 0.75) + return Info.CriticalHeatColor; + else if (Temperature > 0.5) + return Info.HighHeatColor; + else if (Temperature > 0.25) + return Info.MediumHeatColor; + + return Info.LowHeatColor; + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Conditions/GrantTimedCondition.cs b/OpenRA.Mods.CA/Traits/Conditions/GrantTimedCondition.cs index ec375f1fdd..8c33f9d374 100644 --- a/OpenRA.Mods.CA/Traits/Conditions/GrantTimedCondition.cs +++ b/OpenRA.Mods.CA/Traits/Conditions/GrantTimedCondition.cs @@ -1,10 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -25,6 +25,9 @@ public class GrantTimedConditionInfo : PausableConditionalTraitInfo [Desc("Number of ticks to wait before revoking the condition.")] public readonly int Duration = 50; + [Desc("If true, condition will last for full duration once enabled, even if trait is subsequently disabled/paused.")] + public readonly bool ForceFullDuration = false; + public override object Create(ActorInitializer init) { return new GrantTimedCondition(this); } } @@ -68,11 +71,14 @@ void RevokeCondition(Actor self) void ITick.Tick(Actor self) { - if (IsTraitDisabled && token != Actor.InvalidConditionToken) - RevokeCondition(self); + if (!Info.ForceFullDuration || Ticks <= 0) + { + if (IsTraitDisabled && token != Actor.InvalidConditionToken) + RevokeCondition(self); - if (IsTraitPaused || IsTraitDisabled) - return; + if (IsTraitPaused || IsTraitDisabled) + return; + } foreach (var w in watchers) w.Update(info.Duration, Ticks); diff --git a/OpenRA.Mods.CA/Traits/Conditions/GrantTimedConditionOnCargoAction.cs b/OpenRA.Mods.CA/Traits/Conditions/GrantTimedConditionOnCargoAction.cs new file mode 100644 index 0000000000..79c3b1f713 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Conditions/GrantTimedConditionOnCargoAction.cs @@ -0,0 +1,111 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Linq; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Flags] + public enum CargoActionType + { + Load = 1, + Unload = 2, + } + + [Desc("Gives a condition to the actor for a limited time if a passenger enters/exits.")] + public class GrantTimedConditionOnCargoActionInfo : PausableConditionalTraitInfo + { + [FieldLoader.Require] + [GrantedConditionReference] + [Desc("The condition to grant.")] + public readonly string Condition = null; + + [Desc("Number of ticks to wait before revoking the condition.")] + public readonly int Duration = 50; + + [Desc("Events leading to the condition being granted. Possible values are: Load and Unload.")] + public readonly CargoActionType Actions = CargoActionType.Load | CargoActionType.Unload; + + public override object Create(ActorInitializer init) { return new GrantTimedConditionOnCargoAction(this); } + } + + public class GrantTimedConditionOnCargoAction : PausableConditionalTrait, ITick, ISync, INotifyCreated, INotifyPassengerEntered, INotifyPassengerExited + { + readonly GrantTimedConditionOnCargoActionInfo info; + int token = Actor.InvalidConditionToken; + IConditionTimerWatcher[] watchers; + + [Sync] + public int Ticks { get; private set; } + + public GrantTimedConditionOnCargoAction(GrantTimedConditionOnCargoActionInfo info) + : base(info) + { + this.info = info; + Ticks = info.Duration; + } + + protected override void Created(Actor self) + { + watchers = self.TraitsImplementing().Where(Notifies).ToArray(); + + base.Created(self); + } + + void GrantCondition(Actor self, string condition) + { + Ticks = info.Duration; + + if (token == Actor.InvalidConditionToken) + token = self.GrantCondition(condition); + } + + void RevokeCondition(Actor self) + { + if (token != Actor.InvalidConditionToken) + token = self.RevokeCondition(token); + } + + void ITick.Tick(Actor self) + { + if (IsTraitDisabled && token != Actor.InvalidConditionToken) + RevokeCondition(self); + + if (IsTraitPaused || IsTraitDisabled) + return; + + foreach (var w in watchers) + w.Update(info.Duration, Ticks); + + if (token == Actor.InvalidConditionToken) + return; + + if (--Ticks < 1) + RevokeCondition(self); + } + + void INotifyPassengerEntered.OnPassengerEntered(Actor self, Actor passenger) + { + if (!IsTraitDisabled && Info.Actions.HasFlag(CargoActionType.Load)) + GrantCondition(self, info.Condition); + } + + void INotifyPassengerExited.OnPassengerExited(Actor self, Actor passenger) + { + if (!IsTraitDisabled && Info.Actions.HasFlag(CargoActionType.Unload)) + GrantCondition(self, info.Condition); + } + + bool Notifies(IConditionTimerWatcher watcher) { return watcher.Condition == Info.Condition; } + } +} diff --git a/OpenRA.Mods.CA/Traits/Conditions/GrantTimedConditionOnCrushWarning.cs b/OpenRA.Mods.CA/Traits/Conditions/GrantTimedConditionOnCrushWarning.cs new file mode 100644 index 0000000000..abcde837fe --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Conditions/GrantTimedConditionOnCrushWarning.cs @@ -0,0 +1,92 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Linq; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Gives a condition to the actor for a limited time when something tries to crush it.")] + public class GrantTimedConditionOnCrushWarningInfo : PausableConditionalTraitInfo + { + [FieldLoader.Require] + [GrantedConditionReference] + [Desc("The condition to grant.")] + public readonly string Condition = null; + + [Desc("Number of ticks to wait before revoking the condition.")] + public readonly int Duration = 50; + + public override object Create(ActorInitializer init) { return new GrantTimedConditionOnCrushWarning(this); } + } + + public class GrantTimedConditionOnCrushWarning : PausableConditionalTrait, ITick, INotifyCrushed + { + readonly GrantTimedConditionOnCrushWarningInfo info; + int token = Actor.InvalidConditionToken; + IConditionTimerWatcher[] watchers; + public int Ticks { get; private set; } + + public GrantTimedConditionOnCrushWarning(GrantTimedConditionOnCrushWarningInfo info) + : base(info) + { + this.info = info; + } + + protected override void Created(Actor self) + { + watchers = self.TraitsImplementing().Where(Notifies).ToArray(); + base.Created(self); + } + + void GrantCondition(Actor self, string condition) + { + Ticks = info.Duration; + + if (token == Actor.InvalidConditionToken) + token = self.GrantCondition(condition); + } + + void RevokeCondition(Actor self) + { + if (token != Actor.InvalidConditionToken) + token = self.RevokeCondition(token); + } + + void ITick.Tick(Actor self) + { + if (IsTraitDisabled && token != Actor.InvalidConditionToken) + RevokeCondition(self); + + if (IsTraitPaused || IsTraitDisabled) + return; + + foreach (var w in watchers) + w.Update(info.Duration, Ticks); + + if (token == Actor.InvalidConditionToken) + return; + + if (--Ticks < 1) + RevokeCondition(self); + } + + bool Notifies(IConditionTimerWatcher watcher) { return watcher.Condition == Info.Condition; } + + void INotifyCrushed.OnCrush(Actor self, Actor crusher, BitSet crushClasses) { } + + void INotifyCrushed.WarnCrush(Actor self, Actor crusher, BitSet crushClasses) + { + GrantCondition(self, info.Condition); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Conditions/GrantTimedConditionOnDeploy.cs b/OpenRA.Mods.CA/Traits/Conditions/GrantTimedConditionOnDeploy.cs index 323812646b..bc2bc2fe77 100644 --- a/OpenRA.Mods.CA/Traits/Conditions/GrantTimedConditionOnDeploy.cs +++ b/OpenRA.Mods.CA/Traits/Conditions/GrantTimedConditionOnDeploy.cs @@ -1,10 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -31,6 +31,10 @@ public class GrantTimedConditionOnDeployInfo : PausableConditionalTraitInfo [Desc("The condition granted after deploying.")] public readonly string DeployedCondition = null; + [GrantedConditionReference] + [Desc("The condition granted after deploying.")] + public readonly string ChargingCondition = null; + [Desc("Cooldown in ticks until the unit can deploy.")] public readonly int CooldownTicks; @@ -63,12 +67,26 @@ public class GrantTimedConditionOnDeployInfo : PausableConditionalTraitInfo [Desc("Sound to play when undeploying.")] public readonly string UndeploySound = null; + [Desc("If true, deploy/undeploy sounds will be audible through fog of war.")] + public readonly bool AudibleThroughFog = true; + public readonly bool StartsFullyCharged = false; + [Desc("If true, the condition will be granted instantly (not delayed by animations/activities).")] + public readonly bool Instant = false; + [VoiceReference] public readonly string Voice = "Action"; + [Desc("If true, after deploying the condition will only start to drain after the actor attacks.")] + public readonly bool DischargeOnAttack = false; + + [Desc("If DischargeOnAttack is true, maximum ticks before the condition will begin to drain regardless.")] + public readonly int MaxTicksBeforeDischarge = 0; + public readonly bool ShowSelectionBar = true; + public readonly bool ShowSelectionBarWhenFull = true; + public readonly bool ShowSelectionBarWhenEmpty = true; public readonly Color ChargingColor = Color.DarkRed; public readonly Color DischargingColor = Color.DarkMagenta; @@ -78,25 +96,31 @@ public class GrantTimedConditionOnDeployInfo : PausableConditionalTraitInfo public enum TimedDeployState { Charging, Ready, Active, Deploying, Undeploying } public class GrantTimedConditionOnDeploy : PausableConditionalTrait, - IResolveOrder, IIssueOrder, ISelectionBar, IOrderVoice, ISync, ITick, IIssueDeployOrder + IResolveOrder, IIssueOrder, ISelectionBar, IOrderVoice, ISync, ITick, IIssueDeployOrder, INotifyAttack { readonly Actor self; readonly bool canTurn; int deployedToken = Actor.InvalidConditionToken; int deployingToken = Actor.InvalidConditionToken; + int chargingToken = Actor.InvalidConditionToken; + bool attacked; WithSpriteBody[] wsbs; [Sync] int ticks; + int ticksUntilForcedDischarge; TimedDeployState deployState; + public TimedDeployState DeployState { get { return deployState; } } + public GrantTimedConditionOnDeploy(Actor self, GrantTimedConditionOnDeployInfo info) : base(info) { this.self = self; canTurn = self.Info.HasTraitInfo(); + attacked = false; } protected override void Created(Actor self) @@ -112,8 +136,10 @@ protected override void Created(Actor self) { ticks = Info.CooldownTicks; deployState = TimedDeployState.Charging; + chargingToken = self.GrantCondition(Info.ChargingCondition); } + ticksUntilForcedDischarge = Info.MaxTicksBeforeDischarge; base.Created(self); } @@ -148,7 +174,15 @@ void IResolveOrder.ResolveOrder(Actor self, Order order) return; if (!order.Queued) - self.CancelActivity(); + { + if (Info.Instant) + { + Deploy(); + return; + } + else + self.CancelActivity(); + } // Turn to the required facing. if (Info.Facing != -1 && canTurn) @@ -167,7 +201,7 @@ string IOrderVoice.VoicePhraseForOrder(Actor self, Order order) return order.OrderString == "GrantTimedConditionOnDeploy" && deployState == TimedDeployState.Ready ? Info.Voice : null; } - void Deploy() + public void Deploy() { // Something went wrong, most likely due to deploy order spam and the fact that this is a delayed action. if (deployState != TimedDeployState.Ready) @@ -175,15 +209,21 @@ void Deploy() deployState = TimedDeployState.Deploying; - if (!string.IsNullOrEmpty(Info.DeploySound)) + if (!string.IsNullOrEmpty(Info.DeploySound) && (Info.AudibleThroughFog || !self.World.FogObscures(self.CenterPosition))) Game.Sound.Play(SoundType.World, Info.DeploySound, self.CenterPosition); var wsb = wsbs.FirstEnabledTraitOrDefault(); + var hasDeployAnimation = wsb != null && !string.IsNullOrEmpty(Info.DeployAnimation); // If there is no animation to play just grant the upgrades that are used while deployed. // Alternatively, play the deploy animation and then grant the upgrades. - if (string.IsNullOrEmpty(Info.DeployAnimation) || wsb == null) + if (Info.Instant || !hasDeployAnimation) + { OnDeployCompleted(); + + if (hasDeployAnimation) + wsb.PlayCustomAnimation(self, Info.DeployAnimation); + } else { if (deployingToken == Actor.InvalidConditionToken) @@ -197,17 +237,17 @@ void OnDeployCompleted() if (deployedToken == Actor.InvalidConditionToken) deployedToken = self.GrantCondition(Info.DeployedCondition); - if (deployingToken != Actor.InvalidConditionToken) - deployingToken = self.RevokeCondition(deployingToken); + RevokeDeployingCondition(); deployState = TimedDeployState.Active; + ticksUntilForcedDischarge = Info.MaxTicksBeforeDischarge; } void RevokeDeploy() { deployState = TimedDeployState.Undeploying; - if (!string.IsNullOrEmpty(Info.UndeploySound)) + if (!string.IsNullOrEmpty(Info.UndeploySound) && (Info.AudibleThroughFog || !self.World.FogObscures(self.CenterPosition))) Game.Sound.Play(SoundType.World, Info.UndeploySound, self.CenterPosition); var wsb = wsbs.FirstEnabledTraitOrDefault(); @@ -222,16 +262,41 @@ void RevokeDeploy() } } - void OnUndeployCompleted() + void RevokeDeployingCondition() + { + attacked = false; + if (deployingToken != Actor.InvalidConditionToken) + deployingToken = self.RevokeCondition(deployingToken); + } + + void RevokeDeployedCondition() { if (deployedToken != Actor.InvalidConditionToken) deployedToken = self.RevokeCondition(deployedToken); + } - if (deployingToken != Actor.InvalidConditionToken) - deployingToken = self.RevokeCondition(deployingToken); + void RevokeChargingCondition() + { + if (chargingToken != Actor.InvalidConditionToken) + chargingToken = self.RevokeCondition(chargingToken); + } + + void OnUndeployCompleted() + { + RevokeDeployingCondition(); + RevokeDeployedCondition(); deployState = TimedDeployState.Charging; ticks = Info.CooldownTicks; + + if (chargingToken == Actor.InvalidConditionToken) + chargingToken = self.GrantCondition(Info.ChargingCondition); + } + + protected override void TraitDisabled(Actor self) + { + base.TraitDisabled(self); + RevokeDeploy(); } void ITick.Tick(Actor self) @@ -242,23 +307,40 @@ void ITick.Tick(Actor self) if (deployState == TimedDeployState.Ready || deployState == TimedDeployState.Deploying || deployState == TimedDeployState.Undeploying) return; + if (deployState == TimedDeployState.Active && Info.DischargeOnAttack && !attacked && (Info.MaxTicksBeforeDischarge == 0 || --ticksUntilForcedDischarge > 0)) + return; + if (--ticks < 0) { if (deployState == TimedDeployState.Charging) { ticks = Info.DeployedTicks; deployState = TimedDeployState.Ready; + RevokeChargingCondition(); } else RevokeDeploy(); } } + void INotifyAttack.Attacking(Actor self, in Target target, Armament a, Barrel barrel) + { + if (IsTraitDisabled || IsTraitPaused) + return; + + attacked = true; + } + + void INotifyAttack.PreparingAttack(Actor self, in Target target, Armament a, Barrel barrel) { } + float ISelectionBar.GetValue() { if (IsTraitDisabled || !Info.ShowSelectionBar || deployState == TimedDeployState.Undeploying) return 0f; + if (!Info.ShowSelectionBarWhenFull && deployState == TimedDeployState.Ready) + return 0f; + if (deployState == TimedDeployState.Deploying || deployState == TimedDeployState.Ready) return 1f; @@ -267,7 +349,7 @@ float ISelectionBar.GetValue() : (float)ticks / Info.DeployedTicks; } - bool ISelectionBar.DisplayWhenEmpty { get { return !IsTraitDisabled && Info.ShowSelectionBar; } } + bool ISelectionBar.DisplayWhenEmpty { get { return Info.ShowSelectionBar ? (deployState == TimedDeployState.Ready ? Info.ShowSelectionBarWhenFull : Info.ShowSelectionBarWhenEmpty) : false; } } Color ISelectionBar.GetColor() { return deployState == TimedDeployState.Charging ? Info.ChargingColor : Info.DischargingColor; } } diff --git a/OpenRA.Mods.CA/Traits/Conditions/GrantTimedConditionOnPointDefenseHit.cs b/OpenRA.Mods.CA/Traits/Conditions/GrantTimedConditionOnPointDefenseHit.cs new file mode 100644 index 0000000000..811b78b7c5 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Conditions/GrantTimedConditionOnPointDefenseHit.cs @@ -0,0 +1,94 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Linq; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Gives a condition to the actor for a limited time when point defense destroys an incoming projectile.")] + public class GrantTimedConditionOnPointDefenseHitInfo : PausableConditionalTraitInfo + { + [FieldLoader.Require] + [GrantedConditionReference] + [Desc("The condition to grant.")] + public readonly string Condition = null; + + [Desc("The amount of damage required to add 1 tick of charging time.")] + public readonly int ScaleChargeTimeWithDamageAmount = 10; + + public override object Create(ActorInitializer init) { return new GrantTimedConditionOnPointDefenseHit(this, init); } + } + + public class GrantTimedConditionOnPointDefenseHit : PausableConditionalTrait, ITick, INotifyPointDefenseHit + { + readonly GrantTimedConditionOnPointDefenseHitInfo info; + int token = Actor.InvalidConditionToken; + IConditionTimerWatcher[] watchers; + public int Ticks { get; private set; } + int maxTicks; + Actor self; + + public GrantTimedConditionOnPointDefenseHit(GrantTimedConditionOnPointDefenseHitInfo info, ActorInitializer init) + : base(info) + { + this.info = info; + maxTicks = 0; + self = init.Self; + } + + protected override void Created(Actor self) + { + watchers = self.TraitsImplementing().Where(Notifies).ToArray(); + base.Created(self); + } + + void GrantCondition(string condition, int damageAvoided) + { + maxTicks = damageAvoided / info.ScaleChargeTimeWithDamageAmount; + Ticks = maxTicks; + + if (token == Actor.InvalidConditionToken) + token = self.GrantCondition(condition); + } + + void RevokeCondition() + { + if (token != Actor.InvalidConditionToken) + token = self.RevokeCondition(token); + } + + void ITick.Tick(Actor self) + { + if (IsTraitDisabled && token != Actor.InvalidConditionToken) + RevokeCondition(); + + if (IsTraitPaused || IsTraitDisabled) + return; + + foreach (var w in watchers) + w.Update(maxTicks, Ticks); + + if (token == Actor.InvalidConditionToken) + return; + + if (--Ticks < 1) + RevokeCondition(); + } + + bool Notifies(IConditionTimerWatcher watcher) { return watcher.Condition == Info.Condition; } + + void INotifyPointDefenseHit.Hit(int damagePrevented) + { + GrantCondition(info.Condition, damagePrevented); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Conditions/ParachuteCargoOnCondition.cs b/OpenRA.Mods.CA/Traits/Conditions/ParachuteCargoOnCondition.cs new file mode 100644 index 0000000000..d1e62c4786 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Conditions/ParachuteCargoOnCondition.cs @@ -0,0 +1,46 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + public class ParachuteCargoOnConditionInfo : ConditionalTraitInfo, Requires, Requires + { + public override object Create(ActorInitializer init) { return new ParachuteCargoOnCondition(init, this); } + + [Desc("Wait at least this many ticks between each drop.")] + public readonly int DropInterval = 5; + + [Desc("Distance around the drop-point to unload troops.")] + public readonly WDist DropRange = WDist.FromCells(5); + + [Desc("Return to base when drop complete?")] + public readonly bool ReturnToBase = true; + } + + public class ParachuteCargoOnCondition : ConditionalTrait + { + readonly ParachuteCargoOnConditionInfo info; + + public ParachuteCargoOnCondition(ActorInitializer init, ParachuteCargoOnConditionInfo info) + : base(info) + { + this.info = info; + } + + protected override void TraitEnabled(Actor self) + { + self.CancelActivity(); + self.QueueActivity(new Activities.ParadropCargo(self, info.DropInterval, info.DropRange, info.ReturnToBase)); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Conditions/TransformOnCondition.cs b/OpenRA.Mods.CA/Traits/Conditions/TransformOnCondition.cs index df2ac839f8..bdb380498c 100644 --- a/OpenRA.Mods.CA/Traits/Conditions/TransformOnCondition.cs +++ b/OpenRA.Mods.CA/Traits/Conditions/TransformOnCondition.cs @@ -1,16 +1,15 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion using OpenRA.Mods.CA.Activities; using OpenRA.Mods.Common; -using OpenRA.Mods.Common.Activities; using OpenRA.Mods.Common.Traits; using OpenRA.Traits; @@ -40,11 +39,8 @@ public TransformOnCondition(ActorInitializer init, TransformOnConditionInfo info protected override void TraitEnabled(Actor self) { - var facing = self.TraitOrDefault(); var transform = new InstantTransform(self, info.IntoActor) { ForceHealthPercentage = info.ForceHealthPercentage, Faction = faction }; - if (facing != null) transform.Facing = facing.Facing; transform.SkipMakeAnims = info.SkipMakeAnims; - transform.Altitude = self.CenterPosition; self.CancelActivity(); self.QueueActivity(transform); } diff --git a/OpenRA.Mods.CA/Traits/Conditions/UnloadOnCondition.cs b/OpenRA.Mods.CA/Traits/Conditions/UnloadOnCondition.cs index 2f69d3f40a..94889b866b 100644 --- a/OpenRA.Mods.CA/Traits/Conditions/UnloadOnCondition.cs +++ b/OpenRA.Mods.CA/Traits/Conditions/UnloadOnCondition.cs @@ -1,17 +1,15 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion -using System.Linq; using OpenRA.Mods.Common.Activities; using OpenRA.Mods.Common.Traits; -using OpenRA.Traits; namespace OpenRA.Mods.CA.Traits { @@ -37,13 +35,7 @@ protected override void TraitEnabled(Actor self) { int unloadRange = 5; - if (self.Owner.IsBot && info.BotOnly) - { - self.CancelActivity(); - self.QueueActivity(new UnloadCargo(self, WDist.FromCells(unloadRange))); - } - - if (!info.BotOnly) + if ((info.BotOnly && self.Owner.IsBot) || !info.BotOnly) { self.CancelActivity(); self.QueueActivity(new UnloadCargo(self, WDist.FromCells(unloadRange))); diff --git a/OpenRA.Mods.CA/Traits/Convertible.cs b/OpenRA.Mods.CA/Traits/Convertible.cs index 1d011b3864..42f7669adf 100644 --- a/OpenRA.Mods.CA/Traits/Convertible.cs +++ b/OpenRA.Mods.CA/Traits/Convertible.cs @@ -1,11 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2016-2021 The CA Developers (see AUTHORS) - * This file is part of CA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -16,7 +15,7 @@ using OpenRA.Primitives; using OpenRA.Traits; -namespace OpenRA.Mods.CA.Traits.UnitConverter +namespace OpenRA.Mods.CA.Traits { [Desc("This Actor can be converted into another actor (or actors) through the UnitConverter trait.")] class ConvertibleInfo : TraitInfo diff --git a/OpenRA.Mods.CA/Traits/ConvertsDamageToHealth.cs b/OpenRA.Mods.CA/Traits/ConvertsDamageToHealth.cs index a7db6e14e8..ea6abd29e6 100644 --- a/OpenRA.Mods.CA/Traits/ConvertsDamageToHealth.cs +++ b/OpenRA.Mods.CA/Traits/ConvertsDamageToHealth.cs @@ -1,15 +1,13 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion -using System; using OpenRA.Mods.Common.Traits; using OpenRA.Primitives; using OpenRA.Traits; @@ -22,25 +20,37 @@ public class ConvertsDamageToHealthInfo : ConditionalTraitInfo [Desc("Percentage of damage dealt that is converted to health.")] public readonly int DamagePercentConverted = 100; + [Desc("The `TargetTypes` from `Targetable` that won't result in damage being converted.")] + public readonly BitSet InvalidTargetTypes = default; + public override object Create(ActorInitializer init) { return new ConvertsDamageToHealth(init, this); } } public class ConvertsDamageToHealth : ConditionalTrait, INotifyAppliedDamage { + IHealth health; + public ConvertsDamageToHealth(ActorInitializer init, ConvertsDamageToHealthInfo info) : base(info) { } + protected override void Created(Actor self) + { + base.Created(self); + health = self.TraitOrDefault(); + } + void INotifyAppliedDamage.AppliedDamage(Actor self, Actor damaged, AttackInfo e) { if (IsTraitDisabled) return; - if (e.Damage.Value <= 0 || damaged == self) + if (health == null) return; - var health = self.TraitOrDefault(); + if (e.Damage.Value <= 0 || damaged == self) + return; - if (health == null) + if (Info.InvalidTargetTypes.Overlaps(damaged.GetEnabledTargetTypes())) return; var healthAmt = (e.Damage.Value / 100) * Info.DamagePercentConverted; diff --git a/OpenRA.Mods.CA/Traits/ConvertsResources.cs b/OpenRA.Mods.CA/Traits/ConvertsResources.cs new file mode 100644 index 0000000000..bfe88da50e --- /dev/null +++ b/OpenRA.Mods.CA/Traits/ConvertsResources.cs @@ -0,0 +1,132 @@ +#region Copyright & License Information +/* + * Copyright (c) The OpenRA Developers and Contributors + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. For more + * information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Linq; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Gradually converts resources within a given radius.")] + sealed class ConvertsResourcesInfo : ConditionalTraitInfo + { + public readonly string[] ConvertFrom = { "Ore", "Tiberium", "Gems", "BlueTiberium" }; + public readonly int Interval = 75; + public readonly string ConvertTo = "BlackTiberium"; + public readonly WDist Range = WDist.FromCells(5); + public readonly int Amount = 1; + + public override object Create(ActorInitializer init) { return new ConvertsResources(init.Self, this); } + } + + sealed class ConvertsResources : ConditionalTrait, ITick + { + readonly ConvertsResourcesInfo info; + readonly IResourceLayer resourceLayer; + readonly Dictionary cellsToConvert; + + public ConvertsResources(Actor self, ConvertsResourcesInfo info) + : base(info) + { + this.info = info; + resourceLayer = self.World.WorldActor.Trait(); + cellsToConvert = new Dictionary(); + ticks = info.Interval; + } + + int ticks; + + void ITick.Tick(Actor self) + { + if (IsTraitDisabled) + return; + + if (--ticks <= 0) + { + Convert(self); + ticks = info.Interval; + } + } + + void Convert(Actor self) + { + // Find cells with convertible resources within range + var cells = self.World.Map.FindTilesInCircle(self.Location, info.Range.Length / 1024) + .Where(c => + { + var resource = resourceLayer.GetResource(c); + return resource.Type != null && + info.ConvertFrom.Contains(resource.Type) && + (resource.Density > 0 || cellsToConvert.ContainsKey(c)); + }); + + if (cells.Any()) + Remove(cells.Random(self.World.SharedRandom)); + + // Only try to add resources to cells that are ready for conversion + var convertedCells = cellsToConvert + .Where(kv => resourceLayer.GetResource(kv.Key).Type == null || resourceLayer.GetResource(kv.Key).Type == info.ConvertTo) + .Select(kv => kv.Key) + .ToList(); + + if (convertedCells.Count > 0) + Add(convertedCells.Random(self.World.SharedRandom)); + } + + void Remove(CPos cell) + { + var resource = resourceLayer.GetResource(cell); + var amountRemoved = resourceLayer.RemoveResource(resource.Type, cell, info.Amount); + + // Remove some of the original resource + if (amountRemoved > 0) + { + // Track how much we've removed from this cell + if (!cellsToConvert.ContainsKey(cell)) + cellsToConvert[cell] = 0; + + cellsToConvert[cell] += amountRemoved; + var updatedResource = resourceLayer.GetResource(cell); + + // If none of the original resource is left, mark it as converted + if (updatedResource.Density == 0) + Add(cell); + } + } + + void Add(CPos cell) + { + if (!resourceLayer.CanAddResource(info.ConvertTo, cell)) + return; + + var toConvert = cellsToConvert[cell]; + var maxDensity = resourceLayer.GetMaxDensity(info.ConvertTo); + var currentDensity = resourceLayer.GetResource(cell).Density; + + // Only try to add info.Amount, limited by remaining space + var amountToAdd = Math.Min(info.Amount, maxDensity - currentDensity); + var amountAdded = resourceLayer.AddResource(info.ConvertTo, cell, amountToAdd); + + if (amountAdded > 0) + { + var remaining = toConvert - amountAdded; + if (remaining > 0) + cellsToConvert[cell] = remaining; + else + cellsToConvert.Remove(cell); + } + else if (currentDensity >= maxDensity) + cellsToConvert.Remove(cell); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/CrashLanding.cs b/OpenRA.Mods.CA/Traits/CrashLanding.cs deleted file mode 100644 index b16be7bdc1..0000000000 --- a/OpenRA.Mods.CA/Traits/CrashLanding.cs +++ /dev/null @@ -1,83 +0,0 @@ -#region Copyright & License Information -/* - * Copyright 2007-2019 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. - */ -#endregion - -using OpenRA.GameRules; -using OpenRA.Mods.CA.Activities; -using OpenRA.Mods.Common; -using OpenRA.Mods.Common.Traits; -using OpenRA.Traits; - -namespace OpenRA.Mods.CA.Traits -{ - [Desc("Causes aircraft husks that are spawned in the air to crash to the ground.")] - public class CrashLandingInfo : TraitInfo, IRulesetLoaded, Requires - { - [WeaponReference] - public readonly string Explosion = "UnitExplode"; - - public readonly bool Spins = true; - public readonly bool Moves = false; - public readonly WDist Velocity = new WDist(43); - - public WeaponInfo ExplosionWeapon { get; private set; } - - public override object Create(ActorInitializer init) { return new CrashLanding(init, this); } - public void RulesetLoaded(Ruleset rules, ActorInfo ai) - { - if (string.IsNullOrEmpty(Explosion)) - return; - - WeaponInfo weapon; - var weaponToLower = Explosion.ToLowerInvariant(); - if (!rules.Weapons.TryGetValue(weaponToLower, out weapon)) - throw new YamlException("Weapons Ruleset does not contain an entry '{0}'".F(weaponToLower)); - - ExplosionWeapon = weapon; - } - } - - public class CrashLanding : IEffectiveOwner, INotifyCreated - { - readonly CrashLandingInfo info; - readonly Player effectiveOwner; - private Actor a; - private object podDropCellPos; - private Actor a1; - private CrashLandingInfo podDropCellPos1; - - public CrashLanding(ActorInitializer init, CrashLandingInfo info) - { - this.info = info; - effectiveOwner = init.GetValue(info, init.Self.Owner); - } - - public CrashLanding(Actor a, object podDropCellPos) - { - this.a = a; - this.podDropCellPos = podDropCellPos; - } - - public CrashLanding(Actor a1, CrashLandingInfo podDropCellPos1) - { - this.a1 = a1; - this.podDropCellPos1 = podDropCellPos1; - } - - // We return init.Self.Owner if there's no effective owner - bool IEffectiveOwner.Disguised { get { return true; } } - Player IEffectiveOwner.Owner { get { return effectiveOwner; } } - - void INotifyCreated.Created(Actor self) - { - self.QueueActivity(false, new CrashLand(self, info)); - } - } -} diff --git a/OpenRA.Mods.CA/Traits/CrateCA.cs b/OpenRA.Mods.CA/Traits/CrateCA.cs new file mode 100644 index 0000000000..1ce2ca7250 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/CrateCA.cs @@ -0,0 +1,274 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.Mods.Common.Activities; +using OpenRA.Mods.Common.Traits.Render; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.Common.Traits +{ + [Desc("Copy of base version with a crash fix for when location is set before crate is added to world.")] + public class CrateCAInfo : TraitInfo, IPositionableInfo, Requires + { + [Desc("Length of time (in ticks) until the crate gets removed automatically. " + + "A value of zero disables auto-removal.")] + public readonly int Duration = 0; + + [Desc("Allowed to land on.")] + public readonly HashSet TerrainTypes = new(); + + [Desc("Define actors that can collect crates by setting this into the Crushes field from the Mobile trait.")] + public readonly string CrushClass = "crate"; + + public override object Create(ActorInitializer init) { return new CrateCA(init, this); } + + public IReadOnlyDictionary OccupiedCells(ActorInfo info, CPos location, SubCell subCell = SubCell.Any) + { + return new Dictionary() { { location, SubCell.FullCell } }; + } + + bool IOccupySpaceInfo.SharesCell => false; + + public bool CanEnterCell(World world, Actor self, CPos cell, + SubCell subCell = SubCell.FullCell, Actor ignoreActor = null, BlockedByActor check = BlockedByActor.All) + { + // Since crates don't share cells and GetAvailableSubCell only returns SubCell.Full or SubCell.Invalid, we ignore the subCell parameter + return GetAvailableSubCell(world, cell, ignoreActor, check) != SubCell.Invalid; + } + + public bool CanExistInCell(World world, CPos cell) + { + if (!world.Map.Contains(cell)) + return false; + + var type = world.Map.GetTerrainInfo(cell).Type; + if (!TerrainTypes.Contains(type)) + return false; + + return true; + } + + public SubCell GetAvailableSubCell(World world, CPos cell, Actor ignoreActor = null, BlockedByActor check = BlockedByActor.All) + { + if (!CanExistInCell(world, cell)) + return SubCell.Invalid; + + if (check == BlockedByActor.None) + return SubCell.FullCell; + + return !world.ActorMap.GetActorsAt(cell).Any(x => x != ignoreActor) + ? SubCell.FullCell : SubCell.Invalid; + } + } + + public class CrateCA : ITick, IPositionable, ICrushable, ISync, INotifyCreated, + INotifyParachute, INotifyAddedToWorld, INotifyRemovedFromWorld, INotifyCrushed + { + readonly Actor self; + readonly CrateCAInfo info; + bool collected; + INotifyCenterPositionChanged[] notifyCenterPositionChanged; + + [Sync] + int ticks; + + [Sync] + public CPos Location; + + public CrateCA(ActorInitializer init, CrateCAInfo info) + { + self = init.Self; + this.info = info; + + var locationInit = init.GetOrDefault(); + if (locationInit != null) + Location = locationInit.Value; + } + + void INotifyCreated.Created(Actor self) + { + SetPosition(self, Location); + notifyCenterPositionChanged = self.TraitsImplementing().ToArray(); + } + + void INotifyCrushed.WarnCrush(Actor self, Actor crusher, BitSet crushClasses) { } + + void INotifyCrushed.OnCrush(Actor self, Actor crusher, BitSet crushClasses) + { + if (!crushClasses.Contains(info.CrushClass)) + return; + + OnCrushInner(crusher); + } + + void INotifyParachute.OnParachute(Actor self) { } + void INotifyParachute.OnLanded(Actor self) + { + // Check whether the crate landed on anything + var anyOtherActors = false; + Actor collector = null; + foreach (var otherActor in self.World.ActorMap.GetActorsAt(self.Location)) + { + if (self == otherActor) + continue; + + anyOtherActors = true; + + // Mobile is (currently) the only trait that supports crushing + var mi = otherActor.Info.TraitInfoOrDefault(); + if (mi == null) + continue; + + // Make sure that the actor can collect this crate type + // Crate can only be crushed if it is not in the air. + if (self.IsAtGroundLevel() && mi.LocomotorInfo.Crushes.Contains(info.CrushClass)) + { + collector = otherActor; + break; + } + } + + // The crate can land unhindered. + if (!anyOtherActors) + return; + + // Destroy the crate if none of the units in the cell are valid collectors + if (collector != null) + OnCrushInner(collector); + else + self.Dispose(); + } + + void OnCrushInner(Actor crusher) + { + if (collected) + return; + + var crateActions = self.TraitsImplementing(); + + self.Dispose(); + collected = true; + + var shares = crateActions + .Select(a => (Action: a, Shares: a.GetSelectionSharesOuter(crusher))) + .ToList(); + if (shares.Count != 0) + { + var totalShares = shares.Sum(a => a.Shares); + var n = self.World.SharedRandom.Next(totalShares); + + foreach (var (action, share) in shares) + { + if (n < share) + { + action.Activate(crusher); + return; + } + + n -= share; + } + } + } + + void ITick.Tick(Actor self) + { + if (info.Duration != 0 && self.IsInWorld && ++ticks >= info.Duration) + self.Dispose(); + } + + public CPos TopLeft => Location; + public (CPos, SubCell)[] OccupiedCells() { return new[] { (Location, SubCell.FullCell) }; } + + public WPos CenterPosition { get; private set; } + + // Sets the location (Location) and position (CenterPosition) + public void SetPosition(Actor self, WPos pos) + { + var cell = self.World.Map.CellContaining(pos); + SetLocation(self, cell); + SetCenterPosition(self, self.World.Map.CenterOfCell(cell) + new WVec(WDist.Zero, WDist.Zero, self.World.Map.DistanceAboveTerrain(pos))); + } + + // Sets the location (Location) and position (CenterPosition) + public void SetPosition(Actor self, CPos cell, SubCell subCell = SubCell.Any) + { + SetLocation(self, cell); + SetCenterPosition(self, self.World.Map.CenterOfCell(cell)); + } + + // Sets only the CenterPosition + public void SetCenterPosition(Actor self, WPos pos) + { + CenterPosition = pos; + self.World.UpdateMaps(self, this); + + // This can be called from the constructor before notifyCenterPositionChanged is assigned. + if (notifyCenterPositionChanged != null) + foreach (var n in notifyCenterPositionChanged) + n.CenterPositionChanged(self, 0, 0); + } + + // Sets only the location (Location) + void SetLocation(Actor self, CPos cell) + { + if (self.IsInWorld) + self.World.ActorMap.RemoveInfluence(self, this); + + Location = cell; + + if (self.IsInWorld) + self.World.ActorMap.AddInfluence(self, this); + } + + public bool IsLeavingCell(CPos location, SubCell subCell = SubCell.Any) { return self.Location == location && ticks + 1 == info.Duration; } + public SubCell GetValidSubCell(SubCell preferred = SubCell.Any) { return SubCell.FullCell; } + public SubCell GetAvailableSubCell(CPos cell, SubCell preferredSubCell = SubCell.Any, Actor ignoreActor = null, BlockedByActor check = BlockedByActor.All) + { + return info.GetAvailableSubCell(self.World, cell, ignoreActor, check); + } + + public bool CanExistInCell(CPos cell) { return info.CanExistInCell(self.World, cell); } + + public bool CanEnterCell(CPos a, Actor ignoreActor = null, BlockedByActor check = BlockedByActor.All) + { + return GetAvailableSubCell(a, SubCell.Any, ignoreActor, check) != SubCell.Invalid; + } + + bool ICrushable.CrushableBy(Actor self, Actor crusher, BitSet crushClasses) + { + return crushClasses.Contains(info.CrushClass); + } + + LongBitSet ICrushable.CrushableBy(Actor self, BitSet crushClasses) + { + return crushClasses.Contains(info.CrushClass) ? self.World.AllPlayersMask : self.World.NoPlayersMask; + } + + void INotifyAddedToWorld.AddedToWorld(Actor self) + { + self.World.AddToMaps(self, this); + + self.World.WorldActor.TraitOrDefault()?.IncrementCrates(); + + if (self.World.Map.DistanceAboveTerrain(CenterPosition) > WDist.Zero && self.TraitOrDefault() != null) + self.QueueActivity(new Parachute(self)); + } + + void INotifyRemovedFromWorld.RemovedFromWorld(Actor self) + { + self.World.RemoveFromMaps(self, this); + + self.World.WorldActor.TraitOrDefault()?.DecrementCrates(); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/CreateProxyActorForAllies.cs b/OpenRA.Mods.CA/Traits/CreateProxyActorForAllies.cs new file mode 100644 index 0000000000..783a63e269 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/CreateProxyActorForAllies.cs @@ -0,0 +1,202 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.Mods.Common; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + public enum FactionMatchType { None, Actor, Player, PlayerOrActor } + + [Desc("Creates a proxy actor on creation for each allied player.")] + class CreateProxyActorForAlliesInfo : ConditionalTraitInfo + { + [ActorReference] + public readonly string Proxy = null; + + [Desc("If set, will prefix the current actor's name to get the name of the proxy actor.")] + public readonly string ProxyNamePrefix = null; + + [Desc("If true, spawn at the same location.")] + public readonly bool UseLocation = false; + + [Desc("If true, spawn at the same position.")] + public readonly bool UseCenterPosition = false; + + [Desc("If true, the spawned actor is destroyed if the parent actor dies, is sold, or is captured.")] + public readonly bool LinkedToParent = false; + + [Desc("If true, only create for allies with the same faction.")] + public readonly FactionMatchType RequireSameFactionAs = FactionMatchType.None; + + [Desc("If true, only create the proxy if ally faction matches a faction listed as valid for the actor.")] + public readonly bool RequireValidFaction = false; + + [Desc("If true, only creates proxy when owner is a playable (human) player.")] + public readonly bool RequiresPlayableOwner = false; + + public override object Create(ActorInitializer init) { return new CreateProxyActorForAllies(init, this); } + } + + class CreateProxyActorForAllies : ConditionalTrait, INotifyCreated, INotifyKilled, INotifyOwnerChanged, INotifySold, INotifyTransform + { + readonly Actor self; + readonly CreateProxyActorForAlliesInfo info; + readonly Dictionary spawnedActorsByPlayer; + HashSet spawnedActors; + readonly string actorFaction; + readonly string proxyActorName; + readonly HashSet validFactions; + + public CreateProxyActorForAllies(ActorInitializer init, CreateProxyActorForAlliesInfo info) + : base(info) + { + this.info = info; + self = init.Self; + spawnedActors = new HashSet(); + spawnedActorsByPlayer = new Dictionary(); + actorFaction = init.GetValue(self.Owner.Faction.InternalName); + + if (!string.IsNullOrEmpty(info.ProxyNamePrefix)) + proxyActorName = info.ProxyNamePrefix + self.Info.Name; + else + proxyActorName = info.Proxy; + + if (info.RequireValidFaction) + { + var validFactionsInfo = self.Info.TraitInfoOrDefault(); + if (validFactionsInfo != null) + { + validFactions = new HashSet(validFactionsInfo.Factions); + } + } + } + + protected override void TraitEnabled(Actor self) + { + CreateProxies(); + } + + protected override void TraitDisabled(Actor self) + { + DestroyProxies(); + } + + void INotifyKilled.Killed(Actor self, AttackInfo e) + { + DestroyProxies(); + } + + void INotifyOwnerChanged.OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) + { + DestroyProxies(); + CreateProxies(); + } + + void INotifySold.Selling(Actor self) {} + + void INotifySold.Sold(Actor self) + { + DestroyProxies(); + } + + void INotifyTransform.AfterTransform(Actor toActor) + { + DestroyProxies(); + } + + void INotifyTransform.BeforeTransform(Actor fromActor) {} + + void INotifyTransform.OnTransform(Actor self) {} + + void CreateProxies() + { + if (IsTraitDisabled) + return; + + if (info.RequiresPlayableOwner && !self.Owner.Playable) + return; + + if (self.World.Map.Rules.Actors.GetValueOrDefault(proxyActorName) == null) + return; + + var allies = self.World.Players.Where(p => p.IsAlliedWith(self.Owner) + && p != self.Owner + && p.Playable); + + switch (info.RequireSameFactionAs) + { + case FactionMatchType.Actor: + allies = allies.Where(p => p.Faction.InternalName == actorFaction); + break; + case FactionMatchType.Player: + allies = allies.Where(p => p.Faction.InternalName == self.Owner.Faction.InternalName); + break; + case FactionMatchType.PlayerOrActor: + allies = allies.Where(p => p.Faction.InternalName == self.Owner.Faction.InternalName || p.Faction.InternalName == actorFaction); + break; + } + + if (info.RequireValidFaction) + { + allies = allies.Where(p => validFactions == null || validFactions.Contains(p.Faction.InternalName)); + } + + foreach (var ally in allies) + { + var td = new TypeDictionary + { + new FactionInit(actorFaction), + new OwnerInit(ally) + }; + + if (info.UseCenterPosition) + { + td.Add(new CenterPositionInit(self.CenterPosition)); + + if (info.UseLocation) + td.Add(new LocationInit(self.World.Map.CellContaining(self.CenterPosition))); + } + else if (info.UseLocation) + td.Add(new LocationInit(self.Location)); + + var allyPlayer = ally; + self.World.AddFrameEndTask(w => + { + var actor = w.CreateActor(proxyActorName, td); + spawnedActors.Add(actor); + spawnedActorsByPlayer[allyPlayer] = actor; + }); + } + } + + void DestroyProxies() + { + spawnedActorsByPlayer.Clear(); + foreach (var a in spawnedActors) + { + if (!a.IsDead) + a.Dispose(); + } + } + + public Actor GetProxyForPlayer(Player player) + { + if (spawnedActorsByPlayer.TryGetValue(player, out var actor) && actor != null && !actor.IsDead && actor.IsInWorld) + return actor; + + return null; + } + } +} diff --git a/OpenRA.Mods.CA/Traits/CruiseMissile.cs b/OpenRA.Mods.CA/Traits/CruiseMissile.cs new file mode 100644 index 0000000000..c447ee2358 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/CruiseMissile.cs @@ -0,0 +1,96 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.Activities; +using OpenRA.Mods.CA.Activities; +using OpenRA.Mods.Common; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + public enum CruiseMissileState { Ascending, Cruising, Descending } + + [Desc("This unit, when ordered to move, will fly up to its maximum altitude, fly straight, then descend and detonate itself upon reaching target.")] + public class CruiseMissileInfo : MissileBaseInfo + { + [Desc("Missile will cruise straight at this altitude.")] + public readonly WDist MaxAltitude = WDist.Zero; + + [Desc("If a mobile target moves further than this beyond its initial location, the missile will lose tracking. Zero means infinite tracking.")] + public readonly WDist MaxTargetMovement = WDist.Zero; + + [GrantedConditionReference] + [Desc("The condition to grant when the missile is ascending.")] + public readonly string AscendingCondition = null; + + [GrantedConditionReference] + [Desc("The condition to grant when the missile is descending.")] + public readonly string DescendingCondition = null; + + [Desc("If true, missile will track target.")] + public readonly bool TrackTarget = false; + + public override object Create(ActorInitializer init) { return new CruiseMissile(init, this); } + } + + public class CruiseMissile : MissileBase + { + private readonly CruiseMissileInfo cruiseMissileInfo; + int ascendingToken = Actor.InvalidConditionToken; + int descendingToken = Actor.InvalidConditionToken; + Actor self; + WPos initialTargetPos; + + public CruiseMissileState State { get; private set; } + + public CruiseMissile(ActorInitializer init, CruiseMissileInfo info) + : base(init, info) + { + cruiseMissileInfo = info; + self = init.Self; + } + + public void SetState(CruiseMissileState newState) + { + State = newState; + + if (cruiseMissileInfo.AscendingCondition != null) + { + if (State == CruiseMissileState.Ascending && ascendingToken == Actor.InvalidConditionToken) + ascendingToken = self.GrantCondition(cruiseMissileInfo.AscendingCondition); + else if (State != CruiseMissileState.Ascending && ascendingToken != Actor.InvalidConditionToken) + ascendingToken = self.RevokeCondition(ascendingToken); + } + + if (cruiseMissileInfo.DescendingCondition != null) + { + if (State == CruiseMissileState.Descending && descendingToken == Actor.InvalidConditionToken) + descendingToken = self.GrantCondition(cruiseMissileInfo.DescendingCondition); + else if (State != CruiseMissileState.Descending && descendingToken != Actor.InvalidConditionToken) + descendingToken = self.RevokeCondition(descendingToken); + } + } + + public override void SetTarget(Target target) + { + Target = target; + initialTargetPos = target.CenterPosition; + } + + protected override Activity GetActivity(Actor self, Target target) + { + return new CruiseMissileFly(self, target, initialTargetPos, this, cruiseMissileInfo.MaxAltitude, cruiseMissileInfo.MaxTargetMovement, cruiseMissileInfo.TrackTarget); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/CustomRadarColor.cs b/OpenRA.Mods.CA/Traits/CustomRadarColor.cs new file mode 100644 index 0000000000..2b3dbb1511 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/CustomRadarColor.cs @@ -0,0 +1,40 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Define a custom radar color used regardless of owner.")] + public class CustomRadarColorInfo : TraitInfo + { + [Desc("Color to use")] + public readonly Color Color = Color.White; + + public override object Create(ActorInitializer init) { return new CustomRadarColor(init, this); } + } + + public class CustomRadarColor : IRadarColorModifier + { + public CustomRadarColorInfo Info { get; set; } + + public CustomRadarColor(ActorInitializer init, CustomRadarColorInfo info) + { + Info = info; + } + + Color IRadarColorModifier.RadarColorOverride(Actor self, Color color) + { + return Info.Color; + } + } +} diff --git a/OpenRA.Mods.CA/Traits/DamagedByTintedCells.cs b/OpenRA.Mods.CA/Traits/DamagedByTintedCells.cs index 588a2ffa96..3856b332e5 100644 --- a/OpenRA.Mods.CA/Traits/DamagedByTintedCells.cs +++ b/OpenRA.Mods.CA/Traits/DamagedByTintedCells.cs @@ -1,10 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion diff --git a/OpenRA.Mods.CA/Traits/DelayedWeaponAttachable.cs b/OpenRA.Mods.CA/Traits/DelayedWeaponAttachable.cs index f72de6862f..cb872bac34 100644 --- a/OpenRA.Mods.CA/Traits/DelayedWeaponAttachable.cs +++ b/OpenRA.Mods.CA/Traits/DelayedWeaponAttachable.cs @@ -1,10 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -38,9 +38,9 @@ public class DelayedWeaponAttachableInfo : ConditionalTraitInfo public override object Create(ActorInitializer init) { return new DelayedWeaponAttachable(init.Self, this); } } - public class DelayedWeaponAttachable : ConditionalTrait, ITick, INotifyKilled, ISelectionBar, INotifyTransform + public class DelayedWeaponAttachable : ConditionalTrait, ITick, INotifyKilled, ISelectionBar, INotifyTransform, INotifyRemovedFromWorld { - public HashSet Container { get; private set; } + public List Container { get; private set; } readonly Actor self; readonly HashSet detectors = new HashSet(); @@ -52,7 +52,7 @@ public DelayedWeaponAttachable(Actor self, DelayedWeaponAttachableInfo info) : base(info) { this.self = self; - Container = new HashSet(); + Container = new List(); } void ITick.Tick(Actor self) @@ -62,7 +62,7 @@ void ITick.Tick(Actor self) foreach (var trigger in Container) trigger.Tick(self); - Container.RemoveWhere(p => !p.IsValid); + Container.RemoveAll(p => !p.IsValid); while (tokens.Count > Container.Count) self.RevokeCondition(tokens.Pop()); @@ -81,7 +81,7 @@ void INotifyKilled.Killed(Actor self, AttackInfo e) trigger.Activate(self); } - Container.RemoveWhere(p => !p.IsValid); + Container.RemoveAll(p => !p.IsValid); } } @@ -107,6 +107,13 @@ public void RemoveDetector(Actor detector) detectors.Remove(detector); } + protected override void TraitDisabled(Actor self) + { + Container.Clear(); + while (tokens.Count > Container.Count) + self.RevokeCondition(tokens.Pop()); + } + bool ISelectionBar.DisplayWhenEmpty { get { return false; } } float ISelectionBar.GetValue() @@ -129,6 +136,13 @@ Color ISelectionBar.GetColor() return Info.ProgressBarColor; } + void INotifyRemovedFromWorld.RemovedFromWorld(Actor self) + { + Container.Clear(); + while (tokens.Count > Container.Count) + self.RevokeCondition(tokens.Pop()); + } + void INotifyTransform.BeforeTransform(Actor self) { if (!IsTraitDisabled) @@ -136,9 +150,9 @@ void INotifyTransform.BeforeTransform(Actor self) foreach (var trigger in Container) trigger.Activate(self); - Container.RemoveWhere(p => !p.IsValid); + Container.RemoveAll(p => !p.IsValid); - while (tokens.Count > 0 && !Container.Any()) + while (tokens.Count > 0 && Container.Count == 0) self.RevokeCondition(tokens.Pop()); } } diff --git a/OpenRA.Mods.CA/Traits/DelayedWeaponDetector.cs b/OpenRA.Mods.CA/Traits/DelayedWeaponDetector.cs index 42de3a8240..cc78be56c8 100644 --- a/OpenRA.Mods.CA/Traits/DelayedWeaponDetector.cs +++ b/OpenRA.Mods.CA/Traits/DelayedWeaponDetector.cs @@ -1,10 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion diff --git a/OpenRA.Mods.CA/Traits/DelayedWeaponTrigger.cs b/OpenRA.Mods.CA/Traits/DelayedWeaponTrigger.cs index cc8a1b4398..06b6b37e99 100644 --- a/OpenRA.Mods.CA/Traits/DelayedWeaponTrigger.cs +++ b/OpenRA.Mods.CA/Traits/DelayedWeaponTrigger.cs @@ -1,15 +1,14 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion using OpenRA.GameRules; -using OpenRA.Mods.AS.Warheads; using OpenRA.Mods.CA.Warheads; using OpenRA.Primitives; using OpenRA.Traits; @@ -35,7 +34,7 @@ public class DelayedWeaponTrigger public DelayedWeaponTrigger(AttachDelayedWeaponWarhead warhead, WarheadArgs args) { this.args = args; - TriggerTime = warhead.TriggerTime; + TriggerTime = warhead.CalculatedTriggerTime; RemainingTime = TriggerTime; DeathTypes = warhead.DeathTypes; weaponInfo = warhead.WeaponInfo; diff --git a/OpenRA.Mods.CA/Traits/DeployOnAttack.cs b/OpenRA.Mods.CA/Traits/DeployOnAttack.cs index 2ac15d1bac..e4e1821544 100644 --- a/OpenRA.Mods.CA/Traits/DeployOnAttack.cs +++ b/OpenRA.Mods.CA/Traits/DeployOnAttack.cs @@ -1,37 +1,79 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion +using System.Collections.Generic; +using OpenRA.Mods.CA.Activities; +using OpenRA.Mods.Common.Activities; using OpenRA.Mods.Common.Traits; using OpenRA.Traits; namespace OpenRA.Mods.CA.Traits { - public class DeployOnAttackInfo : PausableConditionalTraitInfo, Requires + public class DeployOnAttackInfo : PausableConditionalTraitInfo { + [Desc("Name of the armaments that trigger deployment.")] + public readonly HashSet ArmamentNames = new() { "primary" }; + public override object Create(ActorInitializer init) { return new DeployOnAttack(init, this); } } public class DeployOnAttack : PausableConditionalTrait, INotifyAttack { + private readonly GrantConditionOnDeploy trait; + private readonly GrantConditionOnDeployTurreted turretedTrait; + private readonly GrantTimedConditionOnDeploy timedTrait; + bool pending; + public DeployOnAttack(ActorInitializer init, DeployOnAttackInfo info) - : base(info) { } + : base(info) + { + trait = init.Self.TraitOrDefault(); + turretedTrait = init.Self.TraitOrDefault(); + timedTrait = init.Self.TraitOrDefault(); + pending = false; + } void INotifyAttack.Attacking(Actor self, in Target target, Armament a, Barrel barrel) { + if (!Info.ArmamentNames.Contains(a.Info.Name)) + return; + if (IsTraitDisabled || IsTraitPaused) return; - var trait = self.Trait(); - if (trait.DeployState == DeployState.Undeployed) - trait.Deploy(); + if (trait != null && trait.DeployState == DeployState.Undeployed) + { + if (self.CurrentActivity == null || !self.CurrentActivity.ChildHasPriority) + self.QueueActivity(false, new DeployForGrantedCondition(self, trait)); + else + self.CurrentActivity.QueueChild(new DeployForGrantedCondition(self, trait)); + return; + } + + if (turretedTrait != null && turretedTrait.DeployState == DeployState.Undeployed) + { + if (self.CurrentActivity == null || !self.CurrentActivity.ChildHasPriority) + self.QueueActivity(false, new DeployForGrantedConditionTurreted(self, turretedTrait)); + else if (!pending) + { + pending = true; + self.CurrentActivity.QueueChild(new DeployForGrantedConditionTurreted(self, turretedTrait, false, () => pending = false)); + } + return; + } + + if (timedTrait != null && timedTrait.DeployState == TimedDeployState.Ready) + { + timedTrait.Deploy(); + return; + } } void INotifyAttack.PreparingAttack(Actor self, in Target target, Armament a, Barrel barrel) { } diff --git a/OpenRA.Mods.CA/Traits/DetonateWeaponOnDeploy.cs b/OpenRA.Mods.CA/Traits/DetonateWeaponOnDeploy.cs index a625338cb9..9819e6dcc4 100644 --- a/OpenRA.Mods.CA/Traits/DetonateWeaponOnDeploy.cs +++ b/OpenRA.Mods.CA/Traits/DetonateWeaponOnDeploy.cs @@ -1,10 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -76,7 +76,7 @@ public override void RulesetLoaded(Ruleset rules, ActorInfo ai) { var weaponToLower = Weapon.ToLowerInvariant(); if (!rules.Weapons.TryGetValue(weaponToLower, out var weapon)) - throw new YamlException("Weapons Ruleset does not contain an entry '{0}'".F(weaponToLower)); + throw new YamlException($"Weapons Ruleset does not contain an entry '{weaponToLower}'"); WeaponInfo = weapon; } } @@ -195,7 +195,7 @@ void PlayOverlayAnimation() overlay.IsDecoration = false; var anim = new AnimationWithOffset(overlay, - () => body.LocalToWorld(Info.OverlayOffset.Rotate(body.QuantizeOrientation(self, self.Orientation))), + () => body.LocalToWorld(Info.OverlayOffset.Rotate(body.QuantizeOrientation(self.Orientation))), () => IsTraitDisabled, p => RenderUtils.ZOffsetFromCenter(self, p, 1)); diff --git a/OpenRA.Mods.CA/Traits/DoesNotBlock.cs b/OpenRA.Mods.CA/Traits/DoesNotBlock.cs new file mode 100644 index 0000000000..74001dd42b --- /dev/null +++ b/OpenRA.Mods.CA/Traits/DoesNotBlock.cs @@ -0,0 +1,44 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Actor with this trait can be passed through by actors with the specified target types.")] + public class DoesNotBlockInfo : TraitInfo + { + [Desc("Target types to allow to pass through.")] + public readonly BitSet TargetTypes = default(BitSet); + + public override object Create(ActorInitializer init) { return new DoesNotBlock(init, this); } + } + + public class DoesNotBlock : ITemporaryBlocker + { + public DoesNotBlockInfo Info { get; set; } + + public DoesNotBlock(ActorInitializer init, DoesNotBlockInfo info) + { + Info = info; + } + + bool ITemporaryBlocker.CanRemoveBlockage(Actor self, Actor blocking) + { + return Info.TargetTypes.IsEmpty || Info.TargetTypes.Overlaps(blocking.GetEnabledTargetTypes()); + } + + bool ITemporaryBlocker.IsBlocking(Actor self, CPos cell) + { + return true; + } + } +} diff --git a/OpenRA.Mods.CA/Traits/EjectOnTransform.cs b/OpenRA.Mods.CA/Traits/EjectOnTransform.cs index c9f6d03683..26107c1610 100644 --- a/OpenRA.Mods.CA/Traits/EjectOnTransform.cs +++ b/OpenRA.Mods.CA/Traits/EjectOnTransform.cs @@ -1,15 +1,13 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion -using OpenRA.Mods.Common; using OpenRA.Mods.Common.Traits; using OpenRA.Primitives; using OpenRA.Traits; @@ -46,7 +44,7 @@ void INotifyTransform.OnTransform(Actor self) }); var driverMobile = driver.TraitOrDefault(); if (driverMobile != null) - driverMobile.Nudge(driver); + self.QueueActivity(false, new Nudge(self)); }); } diff --git a/OpenRA.Mods.CA/Traits/EncyclopediaExtras.cs b/OpenRA.Mods.CA/Traits/EncyclopediaExtras.cs new file mode 100644 index 0000000000..e537b9a7d4 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/EncyclopediaExtras.cs @@ -0,0 +1,51 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("To override encyclopedia preview.")] + public class EncyclopediaExtrasInfo : TraitInfo + { + [FluentReference] + [Desc("If set, will be used instead of the tooltip name in encyclopedia.")] + public readonly string Name = null; + + [Desc("If set will override the preview with this actor.")] + public readonly string RenderPreviewActor; + + [Desc("Subfaction to disaply (with flag).")] + public readonly string Subfaction; + + [Desc("Additional info/requirements.")] + public readonly string AdditionalInfo; + + [Desc("If true, will not show anything for the production info.")] + public readonly bool HideNotProducible = false; + + [FluentReference] + [Desc("If no Buildable Description exists, this will be shown instead.")] + public readonly string Description = ""; + + [Desc("Actor name this entry is a variant of (e.g., 'IFV'). Hides entry from main list.")] + public readonly string VariantOf = null; + + [Desc("Group name for variant dropdown (e.g., 'Allies Infantry').")] + public readonly string VariantGroup = null; + + public override object Create(ActorInitializer init) { return new EncyclopediaExtras(init, this); } + } + + public class EncyclopediaExtras + { + public EncyclopediaExtras(ActorInitializer init, EncyclopediaExtrasInfo info) { } + } +} diff --git a/OpenRA.Mods.CA/Traits/FlickeringPaletteEffect.cs b/OpenRA.Mods.CA/Traits/FlickeringPaletteEffect.cs deleted file mode 100644 index 4c2a868c3f..0000000000 --- a/OpenRA.Mods.CA/Traits/FlickeringPaletteEffect.cs +++ /dev/null @@ -1,74 +0,0 @@ -#region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. - */ -#endregion - -using OpenRA.Graphics; -using OpenRA.Primitives; -using OpenRA.Traits; - -namespace OpenRA.Mods.CA.Traits -{ - public class FlickeringPaletteEffectInfo : TraitInfo - { - [Desc("The palette to apply this effect to.")] - [PaletteReference] - [FieldLoader.Require] - public readonly string PaletteName; - - [Desc("The basic color used as offset.")] - [FieldLoader.Require] - public readonly Color BaseColor; - - [Desc("Amount of maximum difference on the red channel.")] - public readonly int AmplitudeRed = 0; - [Desc("Amount of maximum difference on the green channel.")] - public readonly int AmplitudeGreen = 0; - [Desc("Amount of maximum difference on the blue channel.")] - public readonly int AmplitudeBlue = 0; - - public readonly int QuantizationCount = 16; - - public override object Create(ActorInitializer init) { return new FlickeringPaletteEffect(this); } - } - - public class FlickeringPaletteEffect : IPaletteModifier, ITick - { - readonly FlickeringPaletteEffectInfo info; - readonly int offset; - - int t; - - public FlickeringPaletteEffect(FlickeringPaletteEffectInfo info) - { - this.info = info; - offset = 1024 / info.QuantizationCount; - } - - public void AdjustPalette(IReadOnlyDictionary b) - { - // cos value is in range of [-1024, 1024]. - var red = (info.BaseColor.R + info.AmplitudeRed * WAngle.FromDegrees(t).Cos() / 1024).Clamp(0, 255); - var green = (info.BaseColor.G + info.AmplitudeGreen * WAngle.FromDegrees(t).Cos() / 1024).Clamp(0, 255); - var blue = (info.BaseColor.B + info.AmplitudeBlue * WAngle.FromDegrees(t).Cos() / 1024).Clamp(0, 255); - - var p = b[info.PaletteName]; - - for (int j = 1; j < Palette.Size; j++) - { - var color = Color.FromArgb(info.BaseColor.A, red, green, blue); - p.SetColor(j, color); - } - } - - void ITick.Tick(Actor self) - { - t = (t + offset) % 1024; - } - } -} diff --git a/OpenRA.Mods.CA/Traits/FreeActorCA.cs b/OpenRA.Mods.CA/Traits/FreeActorCA.cs new file mode 100644 index 0000000000..e0460de10e --- /dev/null +++ b/OpenRA.Mods.CA/Traits/FreeActorCA.cs @@ -0,0 +1,95 @@ +#region Copyright & License Information +/* + * Copyright (c) The OpenRA Developers and Contributors + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. For more + * information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using OpenRA.Mods.Common; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Player receives a unit for free once the building is placed. This also works for structures.", + "If you want more than one unit to appear copy this section and assign IDs like FreeActor@2, ...")] + public class FreeActorCAInfo : ConditionalTraitInfo, IEditorActorOptions + { + [ActorReference] + [FieldLoader.Require] + [Desc("Name of the actor.")] + public readonly string Actor = null; + + [Desc("Offset relative to the top-left cell of the building.")] + public readonly CVec SpawnOffset = CVec.Zero; + + [Desc("Which direction the unit should face.")] + public readonly WAngle Facing = WAngle.Zero; + + [Desc("Whether another actor should spawn upon re-enabling the trait.")] + public readonly bool AllowRespawn = false; + + [Desc("Display order for the free actor checkbox in the map editor")] + public readonly int EditorFreeActorDisplayOrder = 4; + + IEnumerable IEditorActorOptions.ActorOptions(ActorInfo ai, World world) + { + yield return new EditorActorCheckbox("Spawn Child Actor", EditorFreeActorDisplayOrder, + actor => + { + var init = actor.GetInitOrDefault(this); + if (init != null) + return init.Value; + + return true; + }, + (actor, value) => actor.ReplaceInit(new FreeActorInit(this, value), this)); + } + + public override object Create(ActorInitializer init) { return new FreeActorCA(init, this); } + } + + public class FreeActorCA : ConditionalTrait + { + protected bool allowSpawn; + + public FreeActorCA(ActorInitializer init, FreeActorCAInfo info) + : base(info) + { + allowSpawn = init.GetValue(info, true); + } + + protected override void TraitEnabled(Actor self) + { + if (!allowSpawn) + return; + + allowSpawn = Info.AllowRespawn; + + self.World.AddFrameEndTask(w => + { + var td = new TypeDictionary + { + new ParentActorInit(self), + new OwnerInit(self.Owner), + }; + + var ai = w.Map.Rules.Actors[Info.Actor.ToLowerInvariant()]; + + if (self.Info.HasTraitInfo() && ai.HasTraitInfo()) + td.Add(new LocationInit(self.Location + Info.SpawnOffset)); + + if (self.Info.HasTraitInfo() && ai.HasTraitInfo()) + td.Add(new FacingInit(Info.Facing)); + + w.CreateActor(Info.Actor, td); + }); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/FrozenUnderFogUpdatedByGpsRadar.cs b/OpenRA.Mods.CA/Traits/FrozenUnderFogUpdatedByGpsRadar.cs index abd5c0abbf..2b05ed7f6a 100644 --- a/OpenRA.Mods.CA/Traits/FrozenUnderFogUpdatedByGpsRadar.cs +++ b/OpenRA.Mods.CA/Traits/FrozenUnderFogUpdatedByGpsRadar.cs @@ -1,10 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -33,9 +33,7 @@ public class FrozenUnderFogUpdatedByGpsRadar : INotifyOwnerChanged, INotifyActor { // HACK: RefreshState updated *all* actor state, not just the owner // This is generally bogus, and specifically breaks cursors and tooltips by setting Hidden to false - var hidden = fa.Hidden; fa.RefreshState(); - fa.Hidden = hidden; fa.NeedRenderables = true; } }; diff --git a/OpenRA.Mods.CA/Traits/GPSRadarDot.cs b/OpenRA.Mods.CA/Traits/GPSRadarDot.cs index 7a709f6a3d..61d4ba5174 100644 --- a/OpenRA.Mods.CA/Traits/GPSRadarDot.cs +++ b/OpenRA.Mods.CA/Traits/GPSRadarDot.cs @@ -1,10 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -37,7 +37,7 @@ class GpsRadarDot : ConditionalTrait, INotifyAddedToWorld, INot { GpsRadarDotEffect effect; - List rangedObservers = new List(); + HashSet rangedObservers = new HashSet(); public GpsRadarDot(GpsRadarDotInfo info) : base(info) { } @@ -75,13 +75,26 @@ public void RemoveRangedObserver(Actor a) rangedObservers.Remove(a); } - public bool HasRangedObserver(Player p) + void CleanRangedObservers() { + var rangedObserversToRemove = new List(); + foreach (var rangedObserver in rangedObservers) { if (rangedObserver.Disposed || rangedObserver.IsDead) - rangedObservers.Remove(rangedObserver); + rangedObserversToRemove.Add(rangedObserver); + } + + foreach (var rangedObserver in rangedObserversToRemove) + rangedObservers.Remove(rangedObserver); + } + public bool HasRangedObserver(Player p) + { + CleanRangedObservers(); + + foreach (var rangedObserver in rangedObservers) + { if (rangedObserver.Owner == p || p.IsAlliedWith(rangedObserver.Owner)) return true; } diff --git a/OpenRA.Mods.CA/Traits/GiveCashOnCaptureCA.cs b/OpenRA.Mods.CA/Traits/GiveCashOnCaptureCA.cs new file mode 100644 index 0000000000..ae710d3dce --- /dev/null +++ b/OpenRA.Mods.CA/Traits/GiveCashOnCaptureCA.cs @@ -0,0 +1,83 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Mods.Common.Effects; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Lets the actor grant cash when captured.")] + public class GivesCashOnCaptureCAInfo : ConditionalTraitInfo + { + [Desc("Whether to show the cash tick indicators rising from the actor.")] + public readonly bool ShowTicks = true; + + [Desc("How long to show the Amount tick indicator when enabled.")] + public readonly int DisplayDuration = 30; + + [Desc("Amount of money awarded for capturing the actor.")] + public readonly int Amount = 0; + + [Desc("Award cash only if the capturer's CaptureTypes overlap with these types. Leave empty to allow all types.")] + public readonly BitSet CaptureTypes = default; + + [Desc("If set, to get the value remove this suffix and use the actor with the name that remains.")] + public readonly string SuffixToRemoveForValueActor = null; + + [Desc("Value actor percentage (if actor is used for value).")] + public readonly int ValueActorPercentage = 100; + + public override object Create(ActorInitializer init) { return new GivesCashOnCaptureCA(init.Self, this); } + } + + public class GivesCashOnCaptureCA : ConditionalTrait, INotifyCapture + { + readonly GivesCashOnCaptureCAInfo info; + readonly int cashAmount; + + public GivesCashOnCaptureCA(Actor self, GivesCashOnCaptureCAInfo info) + : base(info) + { + this.info = info; + cashAmount = info.Amount; + + if (info.SuffixToRemoveForValueActor != null) + { + var valueActorName = self.Info.Name.Replace(info.SuffixToRemoveForValueActor.ToLowerInvariant(), "").ToLowerInvariant(); + if (self.World.Map.Rules.Actors.ContainsKey(valueActorName)) + { + var valueActorValued = self.World.Map.Rules.Actors[valueActorName].TraitInfoOrDefault(); + if (valueActorValued != null) + { + cashAmount = valueActorValued.Cost * info.ValueActorPercentage / 100; + } + } + } + } + + void INotifyCapture.OnCapture(Actor self, Actor captor, Player oldOwner, Player newOwner, BitSet captureTypes) + { + if (IsTraitDisabled) + return; + + if (!info.CaptureTypes.IsEmpty && !info.CaptureTypes.Overlaps(captureTypes)) + return; + + var resources = newOwner.PlayerActor.Trait(); + var amount = resources.ChangeCash(cashAmount); + if (!info.ShowTicks && amount != 0) + return; + + self.World.AddFrameEndTask(w => w.Add( + new FloatingText(self.CenterPosition, self.OwnerColor(), FloatingText.FormatCashTick(amount), info.DisplayDuration))); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/GivesBountyCA.cs b/OpenRA.Mods.CA/Traits/GivesBountyCA.cs new file mode 100644 index 0000000000..fea8f69ebd --- /dev/null +++ b/OpenRA.Mods.CA/Traits/GivesBountyCA.cs @@ -0,0 +1,130 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Linq; +using OpenRA.Mods.CA.Traits; +using OpenRA.Mods.Common.Effects; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.Common.Traits +{ + public enum BountyPoolType + { + None, + FromLosses, + FromEnemyKills + } + + [Desc("When killed, this actor causes the attacking player to receive money.")] + sealed class GivesBountyCAInfo : ConditionalTraitInfo + { + [Desc("Percentage of the killed actor's Cost or CustomSellValue to be given.")] + public readonly int Percentage = 10; + + [Desc("Player relationships the attacking player needs to receive the bounty.")] + public readonly PlayerRelationship ValidRelationships = PlayerRelationship.Neutral | PlayerRelationship.Enemy; + + [Desc("Whether to show a floating text announcing the won bounty.")] + public readonly bool ShowBounty = true; + + [Desc("DeathTypes for which a bounty should be granted.", + "Use an empty list (the default) to allow all DeathTypes.")] + public readonly BitSet DeathTypes = default; + + public readonly BountyPoolType BountyPoolType = BountyPoolType.None; + + public override object Create(ActorInitializer init) { return new GivesBountyCA(this); } + } + + sealed class GivesBountyCA : ConditionalTrait, INotifyKilled, INotifyPassengerEntered, INotifyPassengerExited + { + readonly Dictionary passengerBounties = new(); + + public GivesBountyCA(GivesBountyCAInfo info) + : base(info) { } + + int GetBountyValue(Actor self) + { + return self.GetSellValue() * Info.Percentage / 100; + } + + int GetDisplayedBountyValue(Actor self) + { + var bounty = GetBountyValue(self); + foreach (var pb in passengerBounties) + foreach (var b in pb.Value) + if (!b.IsTraitDisabled) + bounty += b.GetDisplayedBountyValue(pb.Key); + + return bounty; + } + + void INotifyKilled.Killed(Actor self, AttackInfo e) + { + if (e.Attacker == null || e.Attacker.Disposed || IsTraitDisabled) + return; + + if (!Info.ValidRelationships.HasRelationship(e.Attacker.Owner.RelationshipWith(self.Owner))) + return; + + if (!Info.DeathTypes.IsEmpty && !e.Damage.DamageTypes.Overlaps(Info.DeathTypes)) + return; + + int displayedBounty, collectedBounty; + var attackerPool = e.Attacker.Owner.PlayerActor.Trait(); + + if (Info.BountyPoolType != BountyPoolType.None) { + var bountyValue = GetBountyValue(self); + var killedPool = self.Owner.PlayerActor.Trait(); + int availableBounty; + + if (Info.BountyPoolType == BountyPoolType.FromEnemyKills) + { + attackerPool.AddBounty(bountyValue); + availableBounty = killedPool.AvailableBounty; + collectedBounty = killedPool.CollectBounty(bountyValue); + } + else + { + killedPool.AddBounty(bountyValue); + availableBounty = attackerPool.AvailableBounty; + collectedBounty = attackerPool.CollectBounty(bountyValue); + } + + displayedBounty = Math.Min(GetDisplayedBountyValue(self), availableBounty); + } + else + { + collectedBounty = GetBountyValue(self); + displayedBounty = GetDisplayedBountyValue(self); + } + + attackerPool.AddCollectedBounty(collectedBounty); + + if (Info.ShowBounty && self.IsInWorld && displayedBounty != 0 && e.Attacker.Owner.IsAlliedWith(self.World.RenderPlayer)) + e.Attacker.World.AddFrameEndTask(w => w.Add(new FloatingText(self.CenterPosition, e.Attacker.OwnerColor(), FloatingText.FormatCashTick(displayedBounty), 30))); + + e.Attacker.Owner.PlayerActor.Trait().ChangeCash(collectedBounty); + } + + void INotifyPassengerEntered.OnPassengerEntered(Actor self, Actor passenger) + { + passengerBounties.Add(passenger, passenger.TraitsImplementing().ToArray()); + } + + void INotifyPassengerExited.OnPassengerExited(Actor self, Actor passenger) + { + passengerBounties.Remove(passenger); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/GivesExperienceCA.cs b/OpenRA.Mods.CA/Traits/GivesExperienceCA.cs new file mode 100644 index 0000000000..a11bee9ea6 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/GivesExperienceCA.cs @@ -0,0 +1,119 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Linq; +using OpenRA.Mods.Common; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("This actor gives experience to a GainsExperience actor when they are killed or damaged.")] + sealed class GivesExperienceCAInfo : TraitInfo + { + [Desc("If -1, use the value of the unit cost.")] + public readonly int Experience = -1; + + [Desc("Player relationships the attacking player needs to receive the experience.")] + public readonly PlayerRelationship ValidRelationships = PlayerRelationship.Neutral | PlayerRelationship.Enemy; + + [Desc("Percentage of the `Experience` value that is being granted to the killing actor.")] + public readonly int ActorExperienceModifier = 10000; + + [Desc("Percentage of the `Experience` value that is being granted to the player owning the killing actor.")] + public readonly int PlayerExperienceModifier = 0; + + [Desc("If true, gives experience on damage, otherwise gives experience when killed.")] + public readonly bool ActorExperienceOnDamage = false; + + public override object Create(ActorInitializer init) { return new GivesExperienceCA(this); } + } + + sealed class GivesExperienceCA : INotifyKilled, INotifyCreated, INotifyDamage + { + readonly GivesExperienceCAInfo info; + + int baseXp; + Health health; + IEnumerable experienceModifiers; + + public GivesExperienceCA(GivesExperienceCAInfo info) + { + this.info = info; + } + + void INotifyCreated.Created(Actor self) + { + health = self.TraitOrDefault(); + var valued = self.Info.TraitInfoOrDefault(); + + baseXp = info.Experience >= 0 ? info.Experience + : valued != null ? valued.Cost : 0; + + experienceModifiers = self.TraitsImplementing().ToArray().Select(m => m.GetGivesExperienceModifier()); + } + + void INotifyKilled.Killed(Actor self, AttackInfo e) + { + GiveExperience(self, e, true); + } + + void INotifyDamage.Damaged(Actor self, AttackInfo e) + { + if (!info.ActorExperienceOnDamage) + return; + + GiveExperience(self, e, false); + } + + void GiveExperience(Actor self, AttackInfo e, bool fromKill) + { + if (baseXp == 0 || e.Attacker == null || e.Attacker.Disposed) + return; + + if (!info.ValidRelationships.HasRelationship(e.Attacker.Owner.RelationshipWith(self.Owner))) + return; + + var exp = Util.ApplyPercentageModifiers(baseXp, experienceModifiers); + + if (fromKill) + e.Attacker.Owner.PlayerActor.TraitOrDefault() + ?.GiveExperience(Util.ApplyPercentageModifiers(exp, new[] { info.PlayerExperienceModifier })); + + if (info.ActorExperienceOnDamage && (fromKill || health == null)) + return; + + var attacker = e.Attacker.TraitOrDefault(); + if (attacker == null) + return; + + var killerExperienceModifiers = e.Attacker.TraitsImplementing() + .Select(x => x.GetGainsExperienceModifier()).Append(info.ActorExperienceModifier); + + // If applying based on damage, calculate the percentage of the total HP that the attack inflicted, and get that same percentage of the xp + if (info.ActorExperienceOnDamage) + { + var hpBefore = Math.Min(health.HP + e.Damage.Value, health.MaxHP); + var appliedDamage = Math.Min(e.Damage.Value, hpBefore); + + if (appliedDamage <= 0) + return; + + var damageRatio = (float)appliedDamage / (float)health.MaxHP; + killerExperienceModifiers = killerExperienceModifiers.Append((int)(damageRatio * 100)); + } + + exp = Util.ApplyPercentageModifiers(exp, killerExperienceModifiers); + attacker.GiveExperience(exp); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/GivesExperienceToMaster.cs b/OpenRA.Mods.CA/Traits/GivesExperienceToMaster.cs new file mode 100644 index 0000000000..87078f97c9 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/GivesExperienceToMaster.cs @@ -0,0 +1,101 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Linq; +using OpenRA.Mods.Common; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("This actor gives experience to any masters with GainsExperience when dealing damage.")] + class GivesExperienceToMasterInfo : TraitInfo + { + [Desc("If -1, use the value of the unit cost.")] + public readonly int Experience = -1; + + [Desc("Player relationships the attacking player needs to receive the experience.")] + public readonly PlayerRelationship ValidRelationships = PlayerRelationship.Neutral | PlayerRelationship.Enemy; + + [Desc("Percentage of the `Experience` value that is being granted to the killing actor.")] + public readonly int ActorExperienceModifier = 10000; + + public override object Create(ActorInitializer init) { return new GivesExperienceToMaster(init.Self, this); } + } + + class GivesExperienceToMaster : INotifyAppliedDamage, INotifyCreated + { + readonly GivesExperienceToMasterInfo info; + + IEnumerable mindControllables; + IEnumerable spawnerSlaveBases; + + public GivesExperienceToMaster(Actor self, GivesExperienceToMasterInfo info) + { + this.info = info; + } + + void INotifyCreated.Created(Actor self) + { + mindControllables = self.TraitsImplementing(); + spawnerSlaveBases = self.TraitsImplementing(); + } + + void INotifyAppliedDamage.AppliedDamage(Actor self, Actor damaged, AttackInfo e) + { + // Don't notify suicides + if (damaged == e.Attacker) + return; + + if (!info.ValidRelationships.HasRelationship(damaged.Owner.RelationshipWith(self.Owner))) + return; + + var health = damaged.TraitOrDefault(); + if (health == null) + return; + + var appliedDamage = Math.Min(e.Damage.Value, health.HP); + if (appliedDamage == 0) + return; + + var valued = damaged.Info.TraitInfoOrDefault(); + var exp = info.Experience >= 0 ? info.Experience + : valued != null ? valued.Cost : 0; + + var experienceModifiers = damaged.TraitsImplementing().ToArray().Select(m => m.GetGivesExperienceModifier()).Append(info.ActorExperienceModifier); + experienceModifiers = experienceModifiers.Append((int)(((float)e.Damage.Value / (float)health.MaxHP) * 100)); + + foreach (var mindControllable in mindControllables) + if (mindControllable.Master.HasValue) + GiveExperience(mindControllable.Master.Value.Actor, exp, experienceModifiers); + + foreach (var SpawnerSlaveBase in spawnerSlaveBases) + if (SpawnerSlaveBase.Master != null) + GiveExperience(SpawnerSlaveBase.Master, exp, experienceModifiers); + } + + void GiveExperience(Actor master, int exp, IEnumerable experienceModifiers) + { + if (master.IsDead) + return; + + var gainsExperience = master.TraitOrDefault(); + if (gainsExperience == null) + return; + + experienceModifiers = experienceModifiers.Concat(master.TraitsImplementing() + .Select(x => x.GetGainsExperienceModifier())); + + gainsExperience.GiveExperience(Util.ApplyPercentageModifiers(exp, experienceModifiers)); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/GivesPlayerExperienceOnCapture.cs b/OpenRA.Mods.CA/Traits/GivesPlayerExperienceOnCapture.cs new file mode 100644 index 0000000000..dc6639912f --- /dev/null +++ b/OpenRA.Mods.CA/Traits/GivesPlayerExperienceOnCapture.cs @@ -0,0 +1,91 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using OpenRA.Mods.Common; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Grants player XP to capturing player.")] + public class GivesPlayerExperienceOnCaptureInfo : ConditionalTraitInfo + { + [Desc("Base experience to grant to the capturing player when capturing this actor.")] + public readonly int PlayerExperience = 0; + + [Desc("Relationships that the structure's previous owner needs to have for the capturing player to receive Experience.")] + public readonly PlayerRelationship PlayerExperienceRelationships = PlayerRelationship.Enemy; + + [Desc("If true, an amount of XP based on the value of the actor is added to PlayerExperience.")] + public readonly bool AddExperienceFromValue = false; + + [Desc("Types of captures that grant XP. If empty, all capture types will grant XP.")] + public readonly int ValuePercentage = 1; + + [Desc("Capture types that grant XP.")] + public readonly BitSet CaptureTypes = default; + + [Desc("List of modifiers to apply for specific relationships.")] + public readonly Dictionary RelationshipModifiers = new Dictionary(); + + [Desc("Modifier for captures after the first capture.")] + public readonly int SubsequentCaptureModifier = 100; + + public override object Create(ActorInitializer init) { return new GivesPlayerExperienceOnCapture(init, this); } + } + + public class GivesPlayerExperienceOnCapture : ConditionalTrait, INotifyCapture + { + public new readonly GivesPlayerExperienceOnCaptureInfo Info; + private int captureCount; + + public GivesPlayerExperienceOnCapture(ActorInitializer init, GivesPlayerExperienceOnCaptureInfo info) + : base(info) + { + Info = info; + captureCount = 0; + } + + void INotifyCapture.OnCapture(Actor self, Actor captor, Player oldOwner, Player newOwner, BitSet captureTypes) + { + captureCount++; + + if (IsTraitDisabled) + return; + + if (!Info.CaptureTypes.IsEmpty && !Info.CaptureTypes.Overlaps(captureTypes)) + return; + + if (!Info.PlayerExperienceRelationships.HasRelationship(newOwner.RelationshipWith(oldOwner))) + return; + + int playerExperience = Info.PlayerExperience; + var modifiers = new List(); + + if (Info.AddExperienceFromValue) + { + var value = self.Info.TraitInfoOrDefault()?.Cost ?? 0; + playerExperience += Util.ApplyPercentageModifiers(value, new[] { Info.ValuePercentage }); + } + + if (captureCount > 1) + modifiers.Add(Info.SubsequentCaptureModifier); + + if (Info.RelationshipModifiers.TryGetValue(newOwner.RelationshipWith(oldOwner), out var modifier)) + modifiers.Add(modifier); + + playerExperience = Util.ApplyPercentageModifiers(playerExperience, modifiers); + + newOwner.PlayerActor.TraitOrDefault()?.GiveExperience(playerExperience); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/GpsRadarWatcher.cs b/OpenRA.Mods.CA/Traits/GpsRadarWatcher.cs index 052ab75ecc..f08ae5294b 100644 --- a/OpenRA.Mods.CA/Traits/GpsRadarWatcher.cs +++ b/OpenRA.Mods.CA/Traits/GpsRadarWatcher.cs @@ -1,10 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion diff --git a/OpenRA.Mods.CA/Traits/GuardsSelection.cs b/OpenRA.Mods.CA/Traits/GuardsSelection.cs index e99924ec04..1f772ef56e 100644 --- a/OpenRA.Mods.CA/Traits/GuardsSelection.cs +++ b/OpenRA.Mods.CA/Traits/GuardsSelection.cs @@ -1,10 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -22,28 +22,49 @@ class GuardsSelectionInfo : ConditionalTraitInfo [Desc("Will only guard units with these target types.")] public readonly BitSet ValidTargets = new BitSet("Ground", "Water"); + [Desc("Will only guard units with these target types.")] + public readonly HashSet ValidOrders = new HashSet() { "AttackMove", "AssaultMove", "Attack", "ForceAttack", "KeepDistance" }; + + [Desc("Maximum number of guard orders to chain together.")] + public readonly int MaxTargets = 10; + + [Desc("Color to use for the target line.")] + public readonly Color TargetLineColor = Color.OrangeRed; + + [Desc("Maximum range that guarding actors will maintain.")] + public readonly WDist Range = WDist.FromCells(2); + [Desc("Maximum number of guard orders to chain together.")] - public readonly int MaxTargets = 12; + public readonly WDist MaxDistance = WDist.FromCells(15); public override object Create(ActorInitializer init) { return new GuardsSelection(init, this); } } - class GuardsSelection : ConditionalTrait, IResolveOrder + class GuardsSelection : ConditionalTrait, IResolveOrder, INotifyCreated { + IMove move; + public GuardsSelection(ActorInitializer init, GuardsSelectionInfo info) : base(info) { } + protected override void Created(Actor self) + { + move = self.Trait(); + base.Created(self); + } + void IResolveOrder.ResolveOrder(Actor self, Order order) { if (IsTraitDisabled) return; - if (order.Queued) + if (order.Target.Type == TargetType.Invalid) return; - var validOrders = new HashSet { "AttackMove", "AssaultMove", "Attack", "ForceAttack", "Move" }; + if (order.Queued) + return; - if (!validOrders.Contains(order.OrderString)) + if (!Info.ValidOrders.Contains(order.OrderString)) return; if (self.Owner.IsBot) @@ -51,15 +72,19 @@ void IResolveOrder.ResolveOrder(Actor self, Order order) var world = self.World; - if (order.Target.Type == TargetType.Actor && (order.Target.Actor.Owner == world.LocalPlayer || !order.Target.Actor.IsInWorld || order.Target.Actor.IsDead)) + if (order.Target.Type == TargetType.Actor && (order.Target.Actor.Disposed || order.Target.Actor.Owner == self.Owner || !order.Target.Actor.IsInWorld || order.Target.Actor.IsDead)) return; var guardActors = world.Selection.Actors - .Where(a => a.Owner == world.LocalPlayer && a.IsInWorld && !a.IsDead && a.Info.HasTraitInfo() - && IsValidGuardTarget(a)) + .Where(a => a.Owner == self.Owner + && !a.Disposed + && !a.IsDead + && a.IsInWorld + && a != self + && IsValidGuardTarget(self, a)) .ToArray(); - if (!guardActors.Any()) + if (guardActors.Length == 0) return; var mainGuardActor = guardActors.ClosestTo(order.Target.CenterPosition); @@ -67,16 +92,12 @@ void IResolveOrder.ResolveOrder(Actor self, Order order) return; var mainGuardTarget = Target.FromActor(mainGuardActor); - world.IssueOrder(new Order("Guard", self, mainGuardTarget, false, null, null)); var guardTargets = 0; foreach (var guardActor in guardActors) { - if (guardActor.IsDead || !guardActor.IsInWorld) - continue; - guardTargets++; world.IssueOrder(new Order("Guard", self, Target.FromActor(guardActor), true, null, null)); @@ -85,13 +106,19 @@ void IResolveOrder.ResolveOrder(Actor self, Order order) } } - bool IsValidGuardTarget(Actor targetActor) + bool IsValidGuardTarget(Actor self, Actor targetActor) { if (!Info.ValidTargets.Overlaps(targetActor.GetEnabledTargetTypes())) return false; - var guardsSelection = targetActor.Info.HasTraitInfo(); - if (guardsSelection) + if (!targetActor.Info.HasTraitInfo() || !targetActor.Info.HasTraitInfo()) + return false; + + var guardsSelection = targetActor.TraitsImplementing(); + if (guardsSelection.Any(t => !t.IsTraitDisabled)) + return false; + + if ((targetActor.CenterPosition - self.CenterPosition).HorizontalLengthSquared > Info.MaxDistance.LengthSquared) return false; return true; diff --git a/OpenRA.Mods.CA/Traits/GuidedMissile.cs b/OpenRA.Mods.CA/Traits/GuidedMissile.cs new file mode 100644 index 0000000000..4bc6ced283 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/GuidedMissile.cs @@ -0,0 +1,89 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Linq; +using OpenRA.Activities; +using OpenRA.Mods.CA.Activities; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("This unit, when ordered to move, will fly in direct path then will detonate itself upon reaching target.")] + public class GuidedMissileInfo : MissileBaseInfo + { + [Desc("Missile will not go below this altitude. If zero, the missile will crash if it hits the ground.")] + public readonly WDist MinAltitude = WDist.Zero; + + [Desc("If a mobile target moves further than this beyond its initial location, the missile will lose tracking. Zero means infinite tracking.")] + public readonly WDist MaxTargetMovement = WDist.Zero; + + [Desc("Added this value multiplied by the speed (i.e. distance travelled per tick) of the target to MaxTargetMovement.")] + public readonly int MaxTargetMovementTicks = 0; + + public override object Create(ActorInitializer init) { return new GuidedMissile(init, this); } + } + + public class GuidedMissile : MissileBase + { + public new GuidedMissileInfo Info; + WPos initialTargetPos; + + public GuidedMissile(ActorInitializer init, GuidedMissileInfo info) + : base(init, info) + { + Info = info; + } + + public override void SetTarget(Target target) + { + Target = target; + initialTargetPos = target.CenterPosition; + } + + protected override Activity GetActivity(Actor self, Target target) + { + return new GuidedMissileFly(self, target, initialTargetPos, this, CalculateMaxTargetMovement(target)); + } + + private WDist CalculateMaxTargetMovement(Target target) + { + var scaledMaxDistance = WDist.Zero; + + if (Info.MaxTargetMovementTicks > 0 && target.Type == TargetType.Actor && !target.Actor.IsDead) + { + scaledMaxDistance = GetActorSpeed(target.Actor) * Info.MaxTargetMovementTicks; + } + + return Info.MaxTargetMovement + scaledMaxDistance; + } + + private WDist GetActorSpeed(Actor actor) + { + var speedModifiers = actor.TraitsImplementing().ToArray().Select(sm => sm.GetSpeedModifier()); + + var mobileInfo = actor.Info.TraitInfoOrDefault(); + if (mobileInfo != null) + { + var speed = Common.Util.ApplyPercentageModifiers(mobileInfo.Speed, speedModifiers); + return new WDist(speed); + } + + var aircraftInfo = actor.Info.TraitInfoOrDefault(); + if (aircraftInfo != null) + { + var speed = Common.Util.ApplyPercentageModifiers(aircraftInfo.Speed, speedModifiers); + return new WDist(speed); + } + + return WDist.Zero; + } + } +} diff --git a/OpenRA.Mods.CA/Traits/HarvesterBalancer.cs b/OpenRA.Mods.CA/Traits/HarvesterBalancer.cs index b12501009a..45aaf4e1c9 100644 --- a/OpenRA.Mods.CA/Traits/HarvesterBalancer.cs +++ b/OpenRA.Mods.CA/Traits/HarvesterBalancer.cs @@ -1,14 +1,10 @@ #region Copyright & License Information -/* - * By Boolbada of OP Mod - * Follows OpenRA's license as follows: - * - * Copyright 2007-2017 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -38,7 +34,7 @@ public class HarvesterBalancerInfo : ConditionalTraitInfo public override object Create(ActorInitializer init) { return new HarvesterBalancer(this); } } - public class HarvesterBalancer : ConditionalTrait, INotifyCreated, ITick, INotifyHarvesterAction, INotifyDamage + public class HarvesterBalancer : ConditionalTrait, INotifyCreated, ITick, INotifyHarvestAction, INotifyDockClientMoving, INotifyDamage { int conditionToken = Actor.InvalidConditionToken; Actor destinationRefinery; @@ -53,6 +49,7 @@ public HarvesterBalancer(HarvesterBalancerInfo info) protected override void Created(Actor self) { + base.Created(self); movingToResources = true; unlinkedBuffTicks = Info.UnlinkedDuration; } @@ -134,24 +131,30 @@ void ITick.Tick(Actor self) unlinkedBuffTicks--; } - public void MovingToResources(Actor self, CPos targetCell) + void INotifyHarvestAction.MovingToResources(Actor self, CPos targetCell) { } - public void MovingToRefinery(Actor self, Actor refineryActor) + void INotifyDockClientMoving.MovingToDock(Actor self, Actor hostActor, IDockHost host) { movingToResources = false; movingToRefinery = true; - destinationRefinery = refineryActor; + destinationRefinery = hostActor; } - public void MovementCancelled(Actor self) + void INotifyHarvestAction.MovementCancelled(Actor self) { movingToRefinery = false; movingToResources = false; } - public void Harvested(Actor self, ResourceType resource) + void INotifyDockClientMoving.MovementCancelled(Actor self) + { + movingToRefinery = false; + movingToResources = false; + } + + void INotifyHarvestAction.Harvested(Actor self, string resourceType) { movingToRefinery = false; movingToResources = false; diff --git a/OpenRA.Mods.CA/Traits/ImmobileMultiCell.cs b/OpenRA.Mods.CA/Traits/ImmobileMultiCell.cs new file mode 100644 index 0000000000..80e621d326 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/ImmobileMultiCell.cs @@ -0,0 +1,75 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using OpenRA.Traits; + +namespace OpenRA.Mods.Common.Traits +{ + sealed class ImmobileMultiCellInfo : TraitInfo, IOccupySpaceInfo + { + public readonly bool OccupiesSpace = true; + + [Desc("Dimensions of the actor (in cells).")] + public readonly CVec Dimensions = new(1, 1); + + [Desc("Shift center of the actor by this offset.")] + public readonly WVec LocalCenterOffset = WVec.Zero; + + public override object Create(ActorInitializer init) { return new ImmobileMultiCell(init, this); } + + public IReadOnlyDictionary OccupiedCells(ActorInfo info, CPos location, SubCell subCell = SubCell.Any) + { + return OccupiesSpace ? new Dictionary() { { location, SubCell.FullCell } } : + new Dictionary(); + } + + bool IOccupySpaceInfo.SharesCell => false; + + public WVec CenterOffset(World w) + { + var off = (w.Map.CenterOfCell(new CPos(Dimensions.X, Dimensions.Y)) - w.Map.CenterOfCell(new CPos(1, 1))) / 2; + return off - new WVec(0, 0, off.Z) + LocalCenterOffset; + } + } + + sealed class ImmobileMultiCell : IOccupySpace, ISync, INotifyAddedToWorld, INotifyRemovedFromWorld + { + readonly (CPos, SubCell)[] occupied; + + public ImmobileMultiCell(ActorInitializer init, ImmobileMultiCellInfo info) + { + TopLeft = init.GetValue(); + CenterPosition = init.World.Map.CenterOfCell(TopLeft) + info.CenterOffset(init.World); + + if (info.OccupiesSpace) + occupied = new[] { (TopLeft, SubCell.FullCell) }; + else + occupied = Array.Empty<(CPos, SubCell)>(); + } + + [Sync] + public CPos TopLeft { get; } + [Sync] + public WPos CenterPosition { get; } + public (CPos, SubCell)[] OccupiedCells() { return occupied; } + + void INotifyAddedToWorld.AddedToWorld(Actor self) + { + self.World.AddToMaps(self, this); + } + + void INotifyRemovedFromWorld.RemovedFromWorld(Actor self) + { + self.World.RemoveFromMaps(self, this); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/ImmobileWithFacing.cs b/OpenRA.Mods.CA/Traits/ImmobileWithFacing.cs index cc11bbff6e..373f79aac9 100644 --- a/OpenRA.Mods.CA/Traits/ImmobileWithFacing.cs +++ b/OpenRA.Mods.CA/Traits/ImmobileWithFacing.cs @@ -1,19 +1,20 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion using System.Collections.Generic; +using OpenRA.Mods.Common; +using OpenRA.Mods.Common.Traits; using OpenRA.Primitives; using OpenRA.Traits; -namespace OpenRA.Mods.Common.Traits +namespace OpenRA.Mods.CA.Traits { class ImmobileWithFacingInfo : TraitInfo, IOccupySpaceInfo, IFacingInfo { @@ -27,7 +28,7 @@ public IReadOnlyDictionary OccupiedCells(ActorInfo info, CPos loc var occupied = OccupiesSpace ? new Dictionary() { { location, SubCell.FullCell } } : new Dictionary(); - return new ReadOnlyDictionary(occupied); + return occupied; } bool IOccupySpaceInfo.SharesCell { get { return false; } } diff --git a/OpenRA.Mods.CA/Traits/Infiltration/InfiltrateForSupportPowerCA.cs b/OpenRA.Mods.CA/Traits/Infiltration/InfiltrateForSupportPowerCA.cs deleted file mode 100644 index e66f58e253..0000000000 --- a/OpenRA.Mods.CA/Traits/Infiltration/InfiltrateForSupportPowerCA.cs +++ /dev/null @@ -1,66 +0,0 @@ -#region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. - */ -#endregion - -using OpenRA.Mods.Common; -using OpenRA.Mods.Common.Traits; -using OpenRA.Primitives; -using OpenRA.Traits; - -namespace OpenRA.Mods.Cnc.Traits -{ - class InfiltrateForSupportPowerCAInfo : TraitInfo - { - [ActorReference] - [FieldLoader.Require] - public readonly string Proxy = null; - - [Desc("The `TargetTypes` from `Targetable` that are allowed to enter.")] - public readonly BitSet Types = default(BitSet); - - [NotificationReference("Speech")] - [Desc("Sound the victim will hear when technology gets stolen.")] - public readonly string InfiltratedNotification = null; - - [NotificationReference("Speech")] - [Desc("Sound the perpetrator will hear after successful infiltration.")] - public readonly string InfiltrationNotification = null; - - public override object Create(ActorInitializer init) { return new InfiltrateForSupportPowerCA(this); } - } - - class InfiltrateForSupportPowerCA : INotifyInfiltrated - { - readonly InfiltrateForSupportPowerCAInfo info; - - public InfiltrateForSupportPowerCA(InfiltrateForSupportPowerCAInfo info) - { - this.info = info; - } - - void INotifyInfiltrated.Infiltrated(Actor self, Actor infiltrator, BitSet types) - { - if (!info.Types.Overlaps(types)) - return; - - if (info.InfiltratedNotification != null) - Game.Sound.PlayNotification(self.World.Map.Rules, self.Owner, "Speech", info.InfiltratedNotification, self.Owner.Faction.InternalName); - - if (info.InfiltrationNotification != null) - Game.Sound.PlayNotification(self.World.Map.Rules, infiltrator.Owner, "Speech", info.InfiltrationNotification, infiltrator.Owner.Faction.InternalName); - - infiltrator.World.AddFrameEndTask(w => w.CreateActor(info.Proxy, new TypeDictionary - { - new OwnerInit(infiltrator.Owner), - new FactionInit(self.Owner.Faction.InternalName) - })); - } - } -} diff --git a/OpenRA.Mods.CA/Traits/Infiltration/InfiltrateForTimedCondition.cs b/OpenRA.Mods.CA/Traits/Infiltration/InfiltrateForTimedCondition.cs new file mode 100644 index 0000000000..3e4b880803 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Infiltration/InfiltrateForTimedCondition.cs @@ -0,0 +1,121 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Linq; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("The actor gains a timed condition when infiltrated.")] + class InfiltrateForTimedConditionInfo : TraitInfo + { + [GrantedConditionReference] + [FieldLoader.Require] + public readonly string Condition = null; + + [Desc("Condition duration. Use zero for infinite duration.")] + public readonly int Duration = 0; + + [Desc("The `TargetTypes` from `Targetable` that are allowed to enter.")] + public readonly BitSet Types = default; + + [NotificationReference("Speech")] + [Desc("Sound the victim will hear when technology gets stolen.")] + public readonly string InfiltratedNotification = null; + + [NotificationReference("Speech")] + [Desc("Sound the perpetrator will hear after successful infiltration.")] + public readonly string InfiltrationNotification = null; + + [Desc("Experience to grant to the infiltrating player.")] + public readonly int PlayerExperience = 0; + + public readonly bool ShowSelectionBar = false; + public readonly Color SelectionBarColor = Color.Red; + + [Desc("If true, will also grant the condition to all actors of the same type owned by the target player.")] + public readonly bool ApplyToAllOfType = false; + + public override object Create(ActorInitializer init) { return new InfiltrateForTimedCondition(this); } + } + + class InfiltrateForTimedCondition : INotifyInfiltrated, ITick, ISelectionBar + { + public InfiltrateForTimedConditionInfo Info { get; } + int conditionToken = Actor.InvalidConditionToken; + int ticks; + + public InfiltrateForTimedCondition(InfiltrateForTimedConditionInfo info) + { + Info = info; + } + + void INotifyInfiltrated.Infiltrated(Actor self, Actor infiltrator, BitSet types) + { + if (!Info.Types.Overlaps(types)) + return; + + if (Info.InfiltratedNotification != null) + Game.Sound.PlayNotification(self.World.Map.Rules, self.Owner, "Speech", Info.InfiltratedNotification, self.Owner.Faction.InternalName); + + if (Info.InfiltrationNotification != null) + Game.Sound.PlayNotification(self.World.Map.Rules, infiltrator.Owner, "Speech", Info.InfiltrationNotification, infiltrator.Owner.Faction.InternalName); + + GrantCondition(self); + + infiltrator.Owner.PlayerActor.TraitOrDefault()?.GiveExperience(Info.PlayerExperience); + + if (Info.ApplyToAllOfType) + { + var otherActors = self.World.ActorsWithTrait() + .Where(a => a.Actor.Info.Name == self.Info.Name + && a.Actor.Owner == self.Owner + && a.Actor != self + && a.Trait.Info.Condition == Info.Condition); + + foreach (var a in otherActors) + a.Trait?.GrantCondition(a.Actor); + } + } + + public void GrantCondition(Actor self) + { + ticks = Info.Duration; + + if (conditionToken != Actor.InvalidConditionToken) + conditionToken = self.RevokeCondition(conditionToken); + + conditionToken = self.GrantCondition(Info.Condition); + } + + void ITick.Tick(Actor self) + { + if (conditionToken == Actor.InvalidConditionToken) + return; + + if (--ticks < 0) + conditionToken = self.RevokeCondition(conditionToken); + } + + float ISelectionBar.GetValue() + { + if (!Info.ShowSelectionBar || ticks <= 0) + return 0f; + + return (float)ticks / Info.Duration; + } + + bool ISelectionBar.DisplayWhenEmpty { get { return false; } } + + Color ISelectionBar.GetColor() { return Info.SelectionBarColor; } + } +} diff --git a/OpenRA.Mods.CA/Traits/Infiltration/InfiltrateToAttach.cs b/OpenRA.Mods.CA/Traits/Infiltration/InfiltrateToAttach.cs index c794eea298..7cd2109916 100644 --- a/OpenRA.Mods.CA/Traits/Infiltration/InfiltrateToAttach.cs +++ b/OpenRA.Mods.CA/Traits/Infiltration/InfiltrateToAttach.cs @@ -1,15 +1,13 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion -using System.Collections.Generic; using System.Linq; using OpenRA.Mods.Common; using OpenRA.Mods.Common.Traits; @@ -25,9 +23,12 @@ class InfiltrateToAttachInfo : TraitInfo, Requires public readonly string Actor = null; [Desc("The `TargetTypes` from `Infiltrates.Types` that are allowed to enter.")] - public readonly BitSet Types = default(BitSet); + public readonly BitSet Types = default; - [Desc("List of sounds that can be played on successful infiltration.")] + [Desc("Experience to grant to the infiltrating player.")] + public readonly int PlayerExperience = 0; + + [Desc("Sound played on successful infiltration.")] public readonly string InfiltratedSound = null; [NotificationReference("Speech")] @@ -55,7 +56,8 @@ void INotifyInfiltrated.Infiltrated(Actor self, Actor infiltrator, BitSet().FirstOrDefault(); + var attachableTrait = infiltrator.TraitOrDefault(); + var attachableToTrait = self.TraitsImplementing().FirstOrDefault(a => a.CanAttach(attachableTrait)); if (attachableToTrait == null) return; @@ -70,6 +72,8 @@ void INotifyInfiltrated.Infiltrated(Actor self, Actor infiltrator, BitSet()?.GiveExperience(Info.PlayerExperience); } void Attach(Actor self, Actor infiltrator, AttachableTo attachableToTrait) @@ -100,7 +104,7 @@ void Attach(Actor self, Actor infiltrator, AttachableTo attachableToTrait) if (attachable == null) return; - var attached = attachableToTrait.Attach(attachable); + var attached = attachableToTrait.Attach(actorToAttach, attachable); if (!attached && actorToAttach != infiltrator) actorToAttach.Dispose(); diff --git a/OpenRA.Mods.CA/Traits/Infiltration/InfiltrateToCreateProxyActor.cs b/OpenRA.Mods.CA/Traits/Infiltration/InfiltrateToCreateProxyActor.cs new file mode 100644 index 0000000000..65cf2cb96f --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Infiltration/InfiltrateToCreateProxyActor.cs @@ -0,0 +1,118 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using OpenRA.Mods.Common; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Replaces InfiltrateForSupportPower. Allows the spawned proxy actor to inherit the faction of the infiltrated actor,", + "or to be owned by the target.")] + class InfiltrateToCreateProxyActorInfo : TraitInfo + { + [ActorReference] + [FieldLoader.Require] + public readonly string Proxy = null; + + [Desc("The `TargetTypes` from `Targetable` that are allowed to enter.")] + public readonly BitSet Types = default; + + [Desc("Experience to grant to the infiltrating player.")] + public readonly int PlayerExperience = 0; + + [NotificationReference("Speech")] + [Desc("Sound the victim will hear when technology gets stolen.")] + public readonly string InfiltratedNotification = null; + + [NotificationReference("Speech")] + [Desc("Sound the perpetrator will hear after successful infiltration.")] + public readonly string InfiltrationNotification = null; + + [Desc("If true, the spawned actor will use the target's faction.")] + public readonly bool UseTargetFaction = false; + + [Desc("If true, the spawned actor will be owned by the target.")] + public readonly bool UseTargetOwner = false; + + [Desc("If true, spawn at the location of the infiltrated actor.")] + public readonly bool UseLocation = false; + + [Desc("If true, spawn at the location of the infiltrated actor.")] + public readonly bool UseCenterPosition = false; + + [Desc("If true, the spawned actor is destroyed if the parent actor dies, is sold, or is captured.")] + public readonly bool LinkedToParent = false; + + public override object Create(ActorInitializer init) { return new InfiltrateToCreateProxyActor(this); } + } + + class InfiltrateToCreateProxyActor : INotifyInfiltrated, INotifyRemovedFromWorld + { + readonly InfiltrateToCreateProxyActorInfo info; + List spawnedActors; + + public InfiltrateToCreateProxyActor(InfiltrateToCreateProxyActorInfo info) + { + this.info = info; + spawnedActors = new List(); + } + + void INotifyInfiltrated.Infiltrated(Actor self, Actor infiltrator, BitSet types) + { + if (!info.Types.Overlaps(types)) + return; + + if (info.InfiltratedNotification != null) + Game.Sound.PlayNotification(self.World.Map.Rules, self.Owner, "Speech", info.InfiltratedNotification, self.Owner.Faction.InternalName); + + if (info.InfiltrationNotification != null) + Game.Sound.PlayNotification(self.World.Map.Rules, infiltrator.Owner, "Speech", info.InfiltrationNotification, infiltrator.Owner.Faction.InternalName); + + var td = new TypeDictionary(); + + if (info.UseTargetFaction) + td.Add(new FactionInit(self.Owner.Faction.InternalName)); + + if (info.UseTargetOwner) + td.Add(new OwnerInit(self.Owner)); + else + td.Add(new OwnerInit(infiltrator.Owner)); + + if (info.UseCenterPosition) + { + td.Add(new CenterPositionInit(self.CenterPosition)); + + if (info.UseLocation) + td.Add(new LocationInit(self.World.Map.CellContaining(self.CenterPosition))); + } + else if (info.UseLocation) + td.Add(new LocationInit(self.Location)); + + infiltrator.Owner.PlayerActor.TraitOrDefault()?.GiveExperience(info.PlayerExperience); + + infiltrator.World.AddFrameEndTask(w => spawnedActors.Add(w.CreateActor(info.Proxy, td))); + } + + void INotifyRemovedFromWorld.RemovedFromWorld(Actor self) + { + if (!info.LinkedToParent) + return; + + foreach (var a in spawnedActors) + { + if (!a.IsDead) + a.Dispose(); + } + } + } +} diff --git a/OpenRA.Mods.CA/Traits/InitiallyHunts.cs b/OpenRA.Mods.CA/Traits/InitiallyHunts.cs new file mode 100644 index 0000000000..106eb017b8 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/InitiallyHunts.cs @@ -0,0 +1,33 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Mods.Common.Activities; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Hunts on creation.")] + public class InitiallyHuntsInfo : ConditionalTraitInfo + { + public override object Create(ActorInitializer init) { return new InitiallyHunts(this); } + } + + public class InitiallyHunts : ConditionalTrait, INotifyCreated + { + public InitiallyHunts(InitiallyHuntsInfo info) + : base(info) { } + + void INotifyCreated.Created(Actor self) + { + self.QueueActivity(new Hunt(self)); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/InstantTransforms.cs b/OpenRA.Mods.CA/Traits/InstantTransforms.cs index a106a53976..77dd386bbb 100644 --- a/OpenRA.Mods.CA/Traits/InstantTransforms.cs +++ b/OpenRA.Mods.CA/Traits/InstantTransforms.cs @@ -1,11 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -90,7 +89,7 @@ public bool CanDeploy() public Activity GetTransformActivity(Actor self) { - return new Transform(self, Info.IntoActor) + return new Transform(Info.IntoActor) { Offset = Info.Offset, Facing = Info.Facing, diff --git a/OpenRA.Mods.CA/Traits/KeepsDistance.cs b/OpenRA.Mods.CA/Traits/KeepsDistance.cs new file mode 100644 index 0000000000..742a794e51 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/KeepsDistance.cs @@ -0,0 +1,112 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Will keep distance from enemies that the unit can't attack.")] + class KeepsDistanceInfo : ConditionalTraitInfo + { + [Desc("Cells to keep distance.")] + public readonly WDist Distance = WDist.FromCells(7); + + [CursorReference] + [Desc("Cursor to display when targeting an actor to keep distance from.")] + public readonly string Cursor = "move"; + + public override object Create(ActorInitializer init) { return new KeepsDistance(init, this); } + } + + class KeepsDistance : ConditionalTrait, IIssueOrder, IResolveOrder + { + readonly IMove move; + readonly IMoveInfo moveInfo; + + public KeepsDistance(ActorInitializer init, KeepsDistanceInfo info) + : base(info) + { + move = init.Self.TraitOrDefault(); + moveInfo = init.Self.Info.TraitInfoOrDefault(); + } + + IEnumerable IIssueOrder.Orders + { + get + { + if (IsTraitDisabled) + yield break; + + yield return new KeepDistanceOrderTargeter(Info.Cursor); + } + } + + Order IIssueOrder.IssueOrder(Actor self, IOrderTargeter order, in Target target, bool queued) + { + if (order is KeepDistanceOrderTargeter) + return new Order(order.OrderID, self, target, queued); + + return null; + } + + void IResolveOrder.ResolveOrder(Actor self, Order order) + { + if (order.OrderString == "KeepDistance") + { + self.QueueActivity(order.Queued, move.MoveWithinRange(order.Target, Info.Distance, targetLineColor: moveInfo.GetTargetLineColor())); + self.ShowTargetLines(); + } + } + + class KeepDistanceOrderTargeter : IOrderTargeter + { + readonly string cursor; + + public KeepDistanceOrderTargeter(string cursor) + { + this.cursor = cursor; + } + + public string OrderID => "KeepDistance"; + public int OrderPriority => 5; + public bool TargetOverridesSelection(Actor self, in Target target, List actorsAt, CPos xy, TargetModifiers modifiers) { return true; } + + bool CanTargetActor(Actor self, in Target target, ref TargetModifiers modifiers, ref string cursor) + { + IsQueued = modifiers.HasModifier(TargetModifiers.ForceQueue); + + if (modifiers.HasModifier(TargetModifiers.ForceMove)) + return false; + + cursor = this.cursor; + var targetOwner = target.Type == TargetType.Actor ? target.Actor.Owner : target.FrozenActor.Owner; + return self.Owner.RelationshipWith(targetOwner) == PlayerRelationship.Enemy; + } + + public bool CanTarget(Actor self, in Target target, ref TargetModifiers modifiers, ref string cursor) + { + switch (target.Type) + { + case TargetType.Actor: + case TargetType.FrozenActor: + return CanTargetActor(self, target, ref modifiers, ref cursor); + case TargetType.Terrain: + return false; + default: + return false; + } + } + + public bool IsQueued { get; protected set; } + } + } +} diff --git a/OpenRA.Mods.CA/Traits/LaysMinefield.cs b/OpenRA.Mods.CA/Traits/LaysMinefield.cs index 5771b5fe11..fa044a494c 100644 --- a/OpenRA.Mods.CA/Traits/LaysMinefield.cs +++ b/OpenRA.Mods.CA/Traits/LaysMinefield.cs @@ -1,28 +1,35 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion using System.Collections.Generic; -using OpenRA.Effects; +using System.Linq; +using OpenRA.Mods.Common; using OpenRA.Mods.Common.Traits; using OpenRA.Primitives; using OpenRA.Traits; namespace OpenRA.Mods.CA.Traits { + public enum MineSelectionMode { Random, Ordered, Shuffled } + [Desc("This actor places mines around itself, and replenishes them after a while.")] public class LaysMinefieldInfo : PausableConditionalTraitInfo { [FieldLoader.Require] - [Desc("Types of mines to place, if multipile is defined, a random one will be selected.")] - public readonly HashSet Mines = new HashSet(); + [Desc("Types of mines to place. MineSelectionType determines how this is used.")] + public readonly List Mines = new List(); + + [Desc("Accepts values: Random, to select a mine type randomly from Mines for each location,", + "Ordered, to use each mine in Mines in sequence until each location is used,", + "Shuffled to use each mine in Mines in randomised sequence until each location is used.")] + public readonly MineSelectionMode MineSelectionMode = MineSelectionMode.Random; [FieldLoader.Require] [Desc("Locations to place the mines, from top-left of the building.")] @@ -44,7 +51,7 @@ public class LaysMinefieldInfo : PausableConditionalTraitInfo public readonly BitSet DamageTypes = default(BitSet); [Desc("Ignore placement rules")] - public readonly bool PlacementIgnroesOccupiesSpace = true; + public readonly bool PlacementIgnoresOccupiesSpace = true; public override object Create(ActorInitializer init) { return new LaysMinefield(this); } } @@ -76,41 +83,50 @@ void ITick.Tick(Actor self) public void SpawnMines(Actor self) { + var mineTypes = Info.Mines; + if (Info.MineSelectionMode != MineSelectionMode.Ordered) + mineTypes = ((IEnumerable)Info.Mines).Shuffle(self.World.SharedRandom).ToList(); + + var mineTypeIdx = 0; + foreach (var offset in Info.Locations) { - var cell = self.Location + offset; + SpawnMine(self, offset, mineTypes[mineTypeIdx]); + + if (Info.MineSelectionMode == MineSelectionMode.Random || mineTypeIdx == mineTypes.Count - 1) + mineTypeIdx = 0; + else + mineTypeIdx++; + } + } + + void SpawnMine(Actor self, CVec offset, string actor) + { + var cell = self.Location + offset; + var ai = self.World.Map.Rules.Actors[actor]; + var ip = ai.TraitInfo(); + var mine = self.World.CreateActor(actor.ToLowerInvariant(), new TypeDictionary { - foreach (var actor in Info.Mines) - { - var ai = self.World.Map.Rules.Actors[actor]; - var ip = ai.TraitInfo(); - var mine = self.World.CreateActor(actor.ToLowerInvariant(), new TypeDictionary - { - new OwnerInit(self.Owner), - new LocationInit(cell) - }); - - if (Info.PlacementIgnroesOccupiesSpace) - mines.Add(mine); - else - { - if (!ip.CanEnterCell(self.World, null, cell)) - continue; - else - mines.Add(mine); - } - } - } + new OwnerInit(self.Owner), + new LocationInit(cell) + }); + + if (Info.PlacementIgnoresOccupiesSpace) + mines.Add(mine); + else + { + if (ip.CanEnterCell(self.World, null, cell)) + mines.Add(mine); } } public void RemoveMines(Actor self) { - foreach (var mine in mines) - if (Info.KillOnRemove) - mine.Kill(mine, Info.DamageTypes); + foreach (var mine in mines) + if (Info.KillOnRemove) + mine.Kill(mine, Info.DamageTypes); - mines.Clear(); + mines.Clear(); } void INotifyOwnerChanged.OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) diff --git a/OpenRA.Mods.CA/Traits/LeavesTrailsCA.cs b/OpenRA.Mods.CA/Traits/LeavesTrailsCA.cs deleted file mode 100644 index c9060b9c07..0000000000 --- a/OpenRA.Mods.CA/Traits/LeavesTrailsCA.cs +++ /dev/null @@ -1,147 +0,0 @@ -#region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. - */ -#endregion - -using System.Collections.Generic; -using OpenRA.Mods.Common.Effects; -using OpenRA.Mods.Common.Traits; -using OpenRA.Traits; - -namespace OpenRA.Mods.CA.Traits.Render -{ - public enum TrailType { Cell, CenterPosition } - - [Desc("Renders a sprite effect when leaving a cell.")] - public class LeavesTrailsCAInfo : ConditionalTraitInfo - { - [FieldLoader.Require] - public readonly string Image = null; - - [SequenceReference(nameof(Image))] - public readonly string[] Sequences = { "idle" }; - - [PaletteReference] - public readonly string Palette = "effect"; - - [Desc("Only leave trail on listed terrain types. Leave empty to leave trail on all terrain types.")] - public readonly HashSet TerrainTypes = new HashSet(); - - [Desc("Accepts values: Cell to draw the trail sprite in the center of the current cell,", - "CenterPosition to draw the trail sprite at the current position.")] - public readonly TrailType Type = TrailType.Cell; - - [Desc("Should the trail be visible through fog.")] - public readonly bool VisibleThroughFog = false; - - [Desc("Display a trail while stationary.")] - public readonly bool TrailWhileStationary = false; - - [Desc("Delay between trail updates when stationary.")] - public readonly int StationaryInterval = 0; - - [Desc("Display a trail while moving.")] - public readonly bool TrailWhileMoving = true; - - [Desc("Delay between trail updates when moving.")] - public readonly int MovingInterval = 0; - - [Desc("Delay before first trail.", - "Use negative values for falling back to the *Interval values.")] - public readonly int StartDelay = 0; - - [Desc("Trail spawn positions relative to actor position. (forward, right, up) triples")] - public readonly WVec[] Offsets = { WVec.Zero }; - - [Desc("Should the trail spawn relative to last position or current position?")] - public readonly bool SpawnAtLastPosition = true; - - public override object Create(ActorInitializer init) { return new LeavesTrailsCA(init.Self, this); } - } - - public class LeavesTrailsCA : ConditionalTrait, ITick - { - BodyOrientation body; - IFacing facing; - WAngle cachedFacing; - int cachedInterval; - - public LeavesTrailsCA(Actor self, LeavesTrailsCAInfo info) - : base(info) - { - cachedInterval = Info.StartDelay; - } - - WPos cachedPosition; - protected override void Created(Actor self) - { - body = self.Trait(); - facing = self.TraitOrDefault(); - cachedFacing = facing != null ? facing.Facing : WAngle.Zero; - cachedPosition = self.CenterPosition; - - base.Created(self); - } - - int ticks; - int offset; - bool wasStationary; - bool isMoving; - - void ITick.Tick(Actor self) - { - if (IsTraitDisabled) - return; - - wasStationary = !isMoving; - isMoving = self.CenterPosition != cachedPosition; - if ((isMoving && !Info.TrailWhileMoving) || (!isMoving && !Info.TrailWhileStationary)) - return; - - if (isMoving == wasStationary && (Info.StartDelay > -1)) - { - cachedInterval = Info.StartDelay; - ticks = 0; - } - - if (++ticks >= cachedInterval) - { - var spawnCell = Info.SpawnAtLastPosition ? self.World.Map.CellContaining(cachedPosition) : self.World.Map.CellContaining(self.CenterPosition); - - var type = self.World.Map.GetTerrainInfo(spawnCell).Type; - - if (++offset >= Info.Offsets.Length) - offset = 0; - - var offsetRotation = Info.Offsets[offset].Rotate(body.QuantizeOrientation(self, self.Orientation)); - var spawnPosition = Info.SpawnAtLastPosition ? cachedPosition : self.CenterPosition; - - var pos = Info.Type == TrailType.CenterPosition ? spawnPosition + body.LocalToWorld(offsetRotation) : - self.World.Map.CenterOfCell(spawnCell); - - var spawnFacing = Info.SpawnAtLastPosition ? cachedFacing : (facing != null ? facing.Facing : WAngle.Zero); - - if ((Info.TerrainTypes.Count == 0 || Info.TerrainTypes.Contains(type)) && !string.IsNullOrEmpty(Info.Image)) - self.World.AddFrameEndTask(w => w.Add(new SpriteEffect(pos, spawnFacing, self.World, Info.Image, - Info.Sequences.Random(Game.CosmeticRandom), Info.Palette, Info.VisibleThroughFog))); - - cachedPosition = self.CenterPosition; - cachedFacing = facing != null ? facing.Facing : WAngle.Zero; - ticks = 0; - - cachedInterval = isMoving ? Info.MovingInterval : Info.StationaryInterval; - } - } - - protected override void TraitEnabled(Actor self) - { - cachedPosition = self.CenterPosition; - } - } -} diff --git a/OpenRA.Mods.CA/Traits/LinkedProducerSource.cs b/OpenRA.Mods.CA/Traits/LinkedProducerSource.cs new file mode 100644 index 0000000000..e407d3d7b8 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/LinkedProducerSource.cs @@ -0,0 +1,240 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Linq; +using OpenRA.Mods.Common.Effects; +using OpenRA.Mods.Common.Orders; +using OpenRA.Traits; + +namespace OpenRA.Mods.Common.Traits +{ + [Desc("A possible source for a LinkedProducerTarget.")] + public class LinkedProducerSourceInfo : TraitInfo, Requires + { + [CursorReference] + [Desc("Cursor to display when selecting a target.")] + public readonly string Cursor = "chrono-target"; + + [NotificationReference("Speech")] + [Desc("Speech notification to play when setting a new target.")] + public readonly string TargetSetNotification = null; + + [Desc("Text notification to display when setting a new target.")] + public readonly string TargetSetTextNotification = null; + + public override object Create(ActorInitializer init) { return new LinkedProducerSource(init.Self, this); } + } + + public class LinkedProducerSource : INotifyProduction, INotifyOwnerChanged, INotifyKilled, INotifyActorDisposing, INotifyCreated, IIssueOrder, IResolveOrder, INotifyAddedToWorld, INotifyRemovedFromWorld + { + const string OrderID = "SetLinkedProducerTarget"; + + LinkedProducerTarget linkedTarget = null; + public IEnumerable ProductionTypes { get; } + public Actor Actor { get; } + public bool HasTarget => linkedTarget != null; + public LinkedProducerTarget Target => linkedTarget; + readonly LinkedProducerSourceInfo info; + LinkedProducerIndicator effect; + + public LinkedProducerSource(Actor self, LinkedProducerSourceInfo info) + { + Actor = self; + this.info = info; + ProductionTypes = self.Info.TraitInfos().SelectMany(p => p.Produces); + } + + public void SetTarget(LinkedProducerTarget target) + { + if (linkedTarget != null) + { + linkedTarget.RemoveLink(this); + } + + linkedTarget = target; + } + + public void RemoveTarget(LinkedProducerTarget target) + { + if (linkedTarget == target) + linkedTarget = null; + } + + void INotifyCreated.Created(Actor self) + { + effect = new LinkedProducerIndicator(self, this); + + var singleQueue = self.World.LobbyInfo.GlobalSettings.OptionOrDefault("queuetype", "") == "global.singlequeue"; + if (singleQueue) + { + self.World.AddFrameEndTask(w => + { + SingleQueueAutoLink(self); + }); + } + } + + void INotifyAddedToWorld.AddedToWorld(Actor self) + { + self.World.AddFrameEndTask(w => w.Add(effect)); + } + + void INotifyRemovedFromWorld.RemovedFromWorld(Actor self) + { + self.World.AddFrameEndTask(w => w.Remove(effect)); + } + + private void SingleQueueAutoLink(Actor self) + { + var existingSources = self.World.ActorsWithTrait() + .Where(a => !a.Actor.IsDead && a.Actor.IsInWorld && a.Actor.Owner == self.Owner + && a.Actor != self && a.Trait.HasTarget + && a.Trait.ProductionTypes.Any(pt => ProductionTypes.Contains(pt))); + + var existingSource = existingSources.FirstOrDefault(); + if (existingSource.Actor != null) + { + var target = existingSource.Trait.Target; + if (target != null) + { + target.AddLink(self, this); + } + } + } + + void INotifyKilled.Killed(Actor self, AttackInfo e) + { + SeverConnections(); + } + + void INotifyActorDisposing.Disposing(Actor self) + { + if (!self.IsDead) + SeverConnections(); + } + + void INotifyOwnerChanged.OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) + { + SeverConnections(); + } + + void INotifyProduction.UnitProduced(Actor self, Actor other, CPos exit) + { + if (linkedTarget != null) + linkedTarget.UnitProduced(other, this); + } + + private void SeverConnections() + { + if (linkedTarget != null) + { + var target = linkedTarget; + linkedTarget = null; + target.SourceInvalidated(this); + } + } + + public IEnumerable Orders + { + get { + yield return new LinkedProducerSourceAddLinkOrderTargeter(info.Cursor); + } + } + + public Order IssueOrder(Actor self, IOrderTargeter order, in Target target, bool queued) + { + if (order.OrderID == OrderID) + { + Game.Sound.PlayNotification(self.World.Map.Rules, self.Owner, "Speech", info.TargetSetNotification, self.Owner.Faction.InternalName); + TextNotificationsManager.AddTransientLine(self.Owner, info.TargetSetTextNotification); + + var selectedWithTrait = self.World.Selection.Actors + .Where(a => a.Owner == self.Owner + && !a.IsDead + && a.Info.HasTraitInfo()) + .ToArray(); + + return new Order(order.OrderID, self, target, queued, selectedWithTrait); + } + + return null; + } + + public void ResolveOrder(Actor self, Order order) + { + if (order.OrderString == OrderID) + { + var targetActor = order.Target.Actor; + var targetTrait = targetActor.Trait(); + var thisIsLinked = linkedTarget == targetTrait; + + if (order.ExtraActors.Length > 1) + { + var selectedSourceTraits = order.ExtraActors + .Select(a => a.TraitOrDefault()) + .ToArray(); + + var anyUnlinked = selectedSourceTraits.Any(t => t != this && t.Target != targetTrait); + + if (thisIsLinked && anyUnlinked) + return; + } + + self.World.AddFrameEndTask(w => + { + if (thisIsLinked) + targetTrait.RemoveLink(this, true); + else + targetTrait.AddLink(self, this); + }); + } + } + + sealed class LinkedProducerSourceAddLinkOrderTargeter : UnitOrderTargeter + { + public const string Id = "SetLinkedProducerTarget"; + + private string cursor; + + public LinkedProducerSourceAddLinkOrderTargeter(string cursor) + : base(Id, 6, cursor, false, true) + { + this.cursor = cursor; + } + + public override bool CanTargetActor(Actor self, Actor target, TargetModifiers modifiers, ref string cursor) + { + cursor = null; + + if (!target.Info.HasTraitInfo()) + return false; + + if (self.Owner != target.Owner) + return false; + + var sourceTypes = self.Trait().ProductionTypes; + var targetTypes = target.Trait().Types; + + if (!sourceTypes.Any(st => targetTypes.Contains(st))) + return false; + + cursor = this.cursor; + return true; + } + + public override bool CanTargetFrozenActor(Actor self, FrozenActor target, TargetModifiers modifiers, ref string cursor) + { + return false; + } + } + } +} diff --git a/OpenRA.Mods.CA/Traits/LinkedProducerTarget.cs b/OpenRA.Mods.CA/Traits/LinkedProducerTarget.cs new file mode 100644 index 0000000000..d3e3325d14 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/LinkedProducerTarget.cs @@ -0,0 +1,346 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Linq; +using OpenRA.Mods.Common.Activities; +using OpenRA.Mods.Common.Effects; +using OpenRA.Mods.Common.Orders; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.Common.Traits +{ + public enum LinkedProducerMode { Clone, Exit } + + [Desc("The target of a linked producer. Any units produced at the targeted source will be either cloned or redirect at the target.")] + public class LinkedProducerTargetInfo : ConditionalTraitInfo + { + [FieldLoader.Require] + [Desc("`Clone` means the produced unit is copied. `Exit` means produced units are just moved to the target.")] + public readonly LinkedProducerMode Mode = default; + + [FieldLoader.Require] + [Desc("Production types (must share one or more values of the `Produces` property of the source's Production trait).")] + public readonly string[] Types = Array.Empty(); + + [Desc("Matches the `Produces` property of the Production trait (for Clone mode only).")] + public readonly string Produces = null; + + [Desc("Maximum number of sources that can be linked. Set to 0 for unlimited sources.")] + public readonly int MaxSources = 0; + + [Desc("List of actors to ignore.")] + public readonly string[] InvalidActors = Array.Empty(); + + [Desc("Actors to use instead of specific source actors.")] + public readonly Dictionary CloneActors = new Dictionary(); + + [CursorReference] + [Desc("Cursor to display when selecting a source.")] + public readonly string Cursor = "chrono-target"; + + [NotificationReference("Speech")] + [Desc("Speech notification to play when setting a new source.")] + public readonly string SourceSetNotification = null; + + [Desc("Text notification to display when setting a new source.")] + public readonly string SourceSetTextNotification = null; + + [Desc("If true, skips anything currently being produced when link is established.")] + public readonly bool SkipCurrentlyProducing = false; + + public override object Create(ActorInitializer init) { return new LinkedProducerTarget(init.Self, this); } + } + + public class LinkedProducerTarget : ConditionalTrait, IIssueOrder, IResolveOrder, INotifyOwnerChanged, INotifyCreated, + INotifyKilled, INotifySold, INotifyAddedToWorld, INotifyRemovedFromWorld + { + const string OrderID = "SetLinkedProducerSource"; + + private readonly Actor self; + private bool singleQueue; + private readonly HashSet linkedSources = new HashSet(); + public LinkedProducerTargetInfo info; + LinkedProducerIndicator effect; + + public List LinkNodes; + private readonly HashSet delayedSources = new HashSet(); + + public string[] Types => info.Types; + public IEnumerable Sources => linkedSources; + public Actor Actor => self; + RallyPoint rallyPoint; + + public LinkedProducerTarget(Actor self, LinkedProducerTargetInfo info) + : base(info) + { + this.info = info; + this.self = self; + LinkNodes = new List(); + } + + protected override void Created(Actor self) + { + base.Created(self); + singleQueue = self.World.LobbyInfo.GlobalSettings.OptionOrDefault("queuetype", "") == "global.singlequeue"; + effect = new LinkedProducerIndicator(self, this); + rallyPoint = self.TraitOrDefault(); + } + + void INotifyAddedToWorld.AddedToWorld(Actor self) + { + self.World.AddFrameEndTask(w => w.Add(effect)); + } + + void INotifyRemovedFromWorld.RemovedFromWorld(Actor self) + { + self.World.AddFrameEndTask(w => w.Remove(effect)); + } + + public void UnitProduced(Actor unit, LinkedProducerSource source) + { + if (IsTraitDisabled || self.IsDead) + return; + + var actorName = unit.Info.Name.ToLowerInvariant(); + + if (info.InvalidActors.Contains(actorName)) + return; + + if (delayedSources.Remove(source)) + return; + + if (info.Mode == LinkedProducerMode.Clone) + { + ProduceClone(actorName); + } + else + { + if (!unit.IsInWorld) + return; + + var mobile = unit.TraitOrDefault(); + if (mobile == null) + return; + + unit.CancelActivity(); + unit.Trait().SetPosition(self, self.Location); + unit.Generation++; + + var move = unit.TraitOrDefault(); + + if (move != null && rallyPoint != null && rallyPoint.Path.Count > 0) + { + foreach (var cell in rallyPoint.Path) + unit.QueueActivity(new AttackMoveActivity(unit, () => move.MoveTo(cell, 1, evaluateNearestMovableCell: true, targetLineColor: Color.OrangeRed))); + } + else + { + unit.QueueActivity(new Nudge(unit)); + } + } + } + + void ProduceClone(string actorName) + { + var cloneActor = self.World.Map.Rules.Actors[info.CloneActors.ContainsKey(actorName) ? info.CloneActors[actorName] : actorName]; + + var sp = self.TraitsImplementing() + .FirstOrDefault(p => !p.IsTraitDisabled && !p.IsTraitPaused && p.Info.Produces.Any(p => info.Produces.Contains(p))); + + if (sp != null) + { + var inits = new TypeDictionary + { + new OwnerInit(self.Owner), + new FactionInit(sp.Faction) + }; + + sp.Produce(self, cloneActor, sp.Info.Produces.First(), inits, 0); + } + } + + public IEnumerable Orders + { + get { + yield return new LinkedProducerTargetAddLinkOrderTargeter(info.Cursor); + } + } + + public Order IssueOrder(Actor self, IOrderTargeter order, in Target target, bool queued) + { + if (order.OrderID == OrderID) + { + Game.Sound.PlayNotification(self.World.Map.Rules, self.Owner, "Speech", info.SourceSetNotification, self.Owner.Faction.InternalName); + TextNotificationsManager.AddTransientLine(self.Owner, info.SourceSetTextNotification); + + return new Order(order.OrderID, self, target, queued); + } + + return null; + } + + public void ResolveOrder(Actor self, Order order) + { + if (order.OrderString == OrderID) + { + var targetActor = order.Target.Actor; + var targetSource = targetActor.Trait(); + + if (linkedSources.Contains(targetSource)) + RemoveLink(targetSource, true); + else + AddLink(targetActor, targetSource); + } + } + + public void AddLink(Actor producer, LinkedProducerSource source) + { + if (linkedSources.Contains(source)) + return; + + if (singleQueue) + { + var sourceTypes = source.ProductionTypes.Where(t => info.Types.Contains(t)); + + var sourcesToLink = self.World.ActorsWithTrait() + .Where(a => !a.Actor.IsDead && a.Actor.IsInWorld && a.Actor.Owner == self.Owner + && a.Trait.ProductionTypes.Any(pt => sourceTypes.Contains(pt))) + .Select(a => a.Trait); + + foreach (var sourceToLink in sourcesToLink) + { + if (linkedSources.Add(sourceToLink)) + { + sourceToLink.SetTarget(this); + LinkNodes.Add(sourceToLink.Actor.CenterPosition); + } + } + } + else + { + if (info.MaxSources > 0 && linkedSources.Count >= info.MaxSources) + return; + + linkedSources.Add(source); + source.SetTarget(this); + LinkNodes.Add(producer.CenterPosition); + } + + if (info.SkipCurrentlyProducing + && !singleQueue + && producer.TraitsImplementing().Any(q => q.CurrentItem() != null)) + { + delayedSources.Add(source); + } + } + + public void RemoveLink(LinkedProducerSource source, bool manualRemoval = false) + { + if (!linkedSources.Contains(source)) + return; + + if (singleQueue && manualRemoval) + { + // Unlink all sources with shared types + var sourceTypes = source.ProductionTypes.Where(t => info.Types.Contains(t)); + + var sourcesToUnlink = linkedSources + .Where(s => s.ProductionTypes.Any(pt => sourceTypes.Contains(pt))) + .ToList(); + + foreach (var sourceToUnlink in sourcesToUnlink) + { + sourceToUnlink.RemoveTarget(this); + linkedSources.Remove(sourceToUnlink); + delayedSources.Remove(sourceToUnlink); + } + } + else + { + source.RemoveTarget(this); + linkedSources.Remove(source); + delayedSources.Remove(source); + } + + LinkNodes.Clear(); + foreach (var remainingSource in linkedSources) + LinkNodes.Add(remainingSource.Actor.CenterPosition); + } + + private void RemoveAllLinks() + { + foreach (var source in linkedSources.ToList()) + { + source.RemoveTarget(this); + linkedSources.Remove(source); + } + + delayedSources.Clear(); + LinkNodes.Clear(); + } + + public void SourceInvalidated(LinkedProducerSource linkedSource) + { + RemoveLink(linkedSource); + } + + void INotifyKilled.Killed(Actor self, AttackInfo e) + { + RemoveAllLinks(); + } + + void INotifySold.Selling(Actor self) + { + RemoveAllLinks(); + } + + void INotifySold.Sold(Actor self) {} + + void INotifyOwnerChanged.OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) + { + RemoveAllLinks(); + } + + sealed class LinkedProducerTargetAddLinkOrderTargeter : UnitOrderTargeter + { + public const string Id = "SetLinkedProducerSource"; + + private string cursor; + + public LinkedProducerTargetAddLinkOrderTargeter(string cursor) + : base(Id, 6, cursor, false, true) + { + this.cursor = cursor; + } + + public override bool CanTargetActor(Actor self, Actor target, TargetModifiers modifiers, ref string cursor) + { + cursor = null; + + if (!target.Info.HasTraitInfo()) + return false; + + if (self.Owner != target.Owner) + return false; + + cursor = this.cursor; + return true; + } + + public override bool CanTargetFrozenActor(Actor self, FrozenActor target, TargetModifiers modifiers, ref string cursor) + { + return false; + } + } + } +} diff --git a/OpenRA.Mods.CA/Traits/MadTankCA.cs b/OpenRA.Mods.CA/Traits/MadTankCA.cs new file mode 100644 index 0000000000..f0a1f6b20d --- /dev/null +++ b/OpenRA.Mods.CA/Traits/MadTankCA.cs @@ -0,0 +1,259 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.Activities; +using OpenRA.GameRules; +using OpenRA.Mods.Common; +using OpenRA.Mods.Common.Activities; +using OpenRA.Mods.Common.Orders; +using OpenRA.Mods.Common.Traits; +using OpenRA.Mods.Common.Traits.Render; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + class MadTankCAInfo : PausableConditionalTraitInfo, IRulesetLoaded, Requires, Requires + { + [SequenceReference] + public readonly string ThumpSequence = null; + + public readonly int ThumpInterval = 100; + + [WeaponReference] + public readonly string ThumpDamageWeapon = null; + + [Desc("Measured in ticks.")] + public readonly int ChargeDelay = 25; + + public readonly string ChargeSound = "madchrg2.aud"; + + [ActorReference] + public readonly string DriverActor = null; + + [VoiceReference] + public readonly string Voice = "Action"; + + [GrantedConditionReference] + [Desc("The condition to grant to self while deployed.")] + public readonly string DeployedCondition = null; + + public WeaponInfo ThumpDamageWeaponInfo { get; private set; } + + [CursorReference] + [Desc("Cursor to display when able to set up the detonation sequence.")] + public readonly string DeployCursor = "deploy"; + + public override object Create(ActorInitializer init) { return new MadTankCA(init.Self, this); } + + public override void RulesetLoaded(Ruleset rules, ActorInfo ai) + { + if (ThumpDamageWeapon != null) + { + var thumpDamageWeaponToLower = ThumpDamageWeapon.ToLowerInvariant(); + if (!rules.Weapons.TryGetValue(thumpDamageWeaponToLower, out var thumpDamageWeapon)) + throw new YamlException($"Weapons Ruleset does not contain an entry '{thumpDamageWeaponToLower}'"); + + ThumpDamageWeaponInfo = thumpDamageWeapon; + } + } + } + + class MadTankCA : PausableConditionalTrait, IIssueOrder, IResolveOrder, IOrderVoice, IIssueDeployOrder + { + readonly MadTankCAInfo info; + public bool FirstDetonationComplete { get; set; } + bool initiated; + + IReloadModifier[] reloadModifiers; + + public MadTankCA(Actor self, MadTankCAInfo info) + : base(info) + { + this.info = info; + FirstDetonationComplete = false; + } + + protected override void Created(Actor self) + { + reloadModifiers = self.TraitsImplementing().ToArray(); + base.Created(self); + } + + int GetModifiedThumpInterval() + { + return Util.ApplyPercentageModifiers(info.ThumpInterval, reloadModifiers.Select(m => m.GetReloadModifier())); + } + + public IEnumerable Orders + { + get + { + yield return + new TargetTypeOrderTargeter(new BitSet("DetonateAttack"), "DetonateAttack", 5, "attack", true, false) + { ForceAttack = false }; + + if (!initiated) + yield return new DeployOrderTargeter("Detonate", 5, () => Info.DeployCursor); + } + } + + Order IIssueOrder.IssueOrder(Actor self, IOrderTargeter order, in Target target, bool queued) + { + if (order.OrderID != "DetonateAttack" && order.OrderID != "Detonate") + return null; + + return new Order(order.OrderID, self, target, queued); + } + + Order IIssueDeployOrder.IssueDeployOrder(Actor self, bool queued) + { + return new Order("Detonate", self, queued); + } + + bool IIssueDeployOrder.CanIssueDeployOrder(Actor self, bool queued) { return !(self.CurrentActivity is DetonationSequence); } + + string IOrderVoice.VoicePhraseForOrder(Actor self, Order order) + { + if (order.OrderString != "DetonateAttack" && order.OrderString != "Detonate") + return null; + + return info.Voice; + } + + void IResolveOrder.ResolveOrder(Actor self, Order order) + { + if (order.OrderString == "DetonateAttack") + { + self.QueueActivity(order.Queued, new DetonationSequence(self, this, order.Target)); + self.ShowTargetLines(); + } + else if (order.OrderString == "Detonate") + self.QueueActivity(order.Queued, new DetonationSequence(self, this)); + } + + public class DetonationSequence : Activity + { + readonly Actor self; + readonly MadTankCA mad; + readonly IMove move; + readonly WithFacingSpriteBody wfsb; + readonly bool assignTargetOnFirstRun; + + int ticks; + Target target; + int thumpInterval; + + public DetonationSequence(Actor self, MadTankCA mad) + : this(self, mad, Target.Invalid) + { + assignTargetOnFirstRun = true; + } + + public DetonationSequence(Actor self, MadTankCA mad, in Target target) + { + this.self = self; + this.mad = mad; + this.target = target; + + move = self.Trait(); + wfsb = self.Trait(); + + // Cache interval with modifiers applied + thumpInterval = mad.GetModifiedThumpInterval(); + } + + protected override void OnFirstRun(Actor self) + { + if (assignTargetOnFirstRun) + target = Target.FromCell(self.World, self.Location); + } + + public override bool Tick(Actor self) + { + if (IsCanceling) + return true; + + if (mad.IsTraitPaused) + return false; + + if (target.Type != TargetType.Invalid && !move.CanEnterTargetNow(self, target)) + { + QueueChild(new MoveAdjacentTo(self, target, targetLineColor: Color.Red)); + return false; + } + + if (!mad.initiated) + { + // If the target has died while we were moving, we should abort detonation. + if (target.Type == TargetType.Invalid) + return true; + + self.GrantCondition(mad.info.DeployedCondition); + self.World.AddFrameEndTask(w => EjectDriver()); + IsInterruptible = false; + mad.initiated = true; + } + + if (ticks == 1 && mad.info.ChargeSound != null) + Game.Sound.Play(SoundType.World, mad.info.ChargeSound, self.CenterPosition); + + if (++ticks == mad.info.ChargeDelay) + { + if (mad.info.ThumpDamageWeapon != null) + { + var args = new WarheadArgs + { + Weapon = mad.info.ThumpDamageWeaponInfo, + SourceActor = self, + WeaponTarget = target, + DamageModifiers = self.TraitsImplementing() + .Select(a => a.GetFirepowerModifier()).ToArray() + }; + + // Use .FromPos since this weapon needs to affect more than just the MadTank actor + mad.info.ThumpDamageWeaponInfo.Impact(Target.FromPos(self.CenterPosition), args); + } + + if (mad.info.ThumpSequence != null) + wfsb.PlayCustomAnimation(self, mad.info.ThumpSequence); + } + + if (ticks == thumpInterval + mad.info.ChargeDelay) + { + thumpInterval = mad.GetModifiedThumpInterval(); + ticks = 0; + } + + return false; + } + + public override IEnumerable TargetLineNodes(Actor self) + { + yield return new TargetLineNode(target, Color.Crimson); + } + + void EjectDriver() + { + if (mad.info.DriverActor == null) + return; + + var driver = self.World.CreateActor(mad.info.DriverActor.ToLowerInvariant(), new TypeDictionary + { + new LocationInit(self.Location), + new OwnerInit(self.Owner) + }); + driver.QueueActivity(false, new Nudge(driver)); + } + } + } +} diff --git a/OpenRA.Mods.CA/Traits/MassEnterableCargo.cs b/OpenRA.Mods.CA/Traits/MassEnterableCargo.cs new file mode 100644 index 0000000000..baf5df54d6 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/MassEnterableCargo.cs @@ -0,0 +1,29 @@ + + +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Actor can be entered en masse.")] + public class MassEnterableCargoInfo : ConditionalTraitInfo, Requires + { + public override object Create(ActorInitializer init) { return new MassEnterableCargo(this); } + } + + public class MassEnterableCargo : ConditionalTrait + { + public MassEnterableCargo(MassEnterableCargoInfo info) + : base(info) { } + } +} diff --git a/OpenRA.Mods.CA/Traits/MassEntersCargo.cs b/OpenRA.Mods.CA/Traits/MassEntersCargo.cs new file mode 100644 index 0000000000..99a1f5ef22 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/MassEntersCargo.cs @@ -0,0 +1,197 @@ + + +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.Mods.CA.Activities; +using OpenRA.Mods.Common.Orders; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Actor can be entered en masse.")] + public class MassEntersCargoInfo : ConditionalTraitInfo, Requires + { + [CursorReference] + [Desc("Cursor to display when able to enter target actor.")] + public readonly string EnterCursor = "enter-multi"; + + [CursorReference] + [Desc("Cursor to display when unable to enter target actor.")] + public readonly string EnterBlockedCursor = "enter-blocked"; + + public override object Create(ActorInitializer init) { return new MassEntersCargo(init, this); } + } + + public class MassEntersCargo : ConditionalTrait, INotifyCreated, IIssueOrder, IResolveOrder, IOrderVoice + { + private readonly MassEntersCargoInfo info; + private Passenger passenger; + + public int Weight => passenger.Info.Weight; + + public MassEntersCargo(ActorInitializer init, MassEntersCargoInfo info) + : base(info) + { + this.info = info; + } + + void INotifyCreated.Created(Actor self) + { + passenger = self.Trait();; + } + + IEnumerable IIssueOrder.Orders + { + get + { + yield return new EnterAlliedActorTargeter( + "MassEnterTransport", + 10, + Info.EnterCursor, + Info.EnterBlockedCursor, + IsCorrectCargoType, + CanEnter); + } + } + + public Order IssueOrder(Actor self, IOrderTargeter order, in Target target, bool queued) + { + if (order.OrderID == "MassEnterTransport") + { + return new Order(order.OrderID, self, target, queued); + } + + return null; + } + + string IOrderVoice.VoicePhraseForOrder(Actor self, Order order) + { + if (order.OrderString != "MassEnterTransport") + return null; + + if (order.Target.Type != TargetType.Actor || !CanEnter(order.Target.Actor)) + return null; + + return passenger.Info.Voice; + } + + bool IsCorrectCargoType(Actor target, TargetModifiers modifiers) + { + if (!modifiers.HasModifier(TargetModifiers.ForceMove)) + return false; + + if (!target.Info.HasTraitInfo()) + return false; + + return IsCorrectCargoType(target); + } + + bool IsCorrectCargoType(Actor target) + { + var ci = target.Info.TraitInfo(); + return ci.Types.Contains(passenger.Info.CargoType); + } + + bool CanEnter(Cargo cargo) + { + return cargo != null && cargo.HasSpace(passenger.Info.Weight); + } + + bool CanEnter(Actor target) + { + return CanEnter(target.TraitOrDefault()); + } + + public bool IsValidForTarget(Actor target) + { + return IsCorrectCargoType(target) && CanEnter(target); + } + + void IResolveOrder.ResolveOrder(Actor self, Order order) + { + if (order.OrderString != "MassEnterTransport") + return; + + // Enter orders are only valid for own/allied actors, + // which are guaranteed to never be frozen. + if (order.Target.Type != TargetType.Actor) + return; + + var targetActor = order.Target.Actor; + + var selectedWithTrait = self.World.Selection.Actors + .Where(a => a.Info.HasTraitInfo() + && a.Owner == self.Owner + && !a.IsDead + && a.Trait().IsValidForTarget(targetActor)) + .OrderBy(a => (a.CenterPosition - targetActor.CenterPosition).LengthSquared) + .Select(a => new TraitPair(a, a.Trait())); + + // Find the closest actor to the target transport + var closestActor = selectedWithTrait.FirstOrDefault(); + + // Only perform allocation if the current actor is the closest actor + if (closestActor.Actor != self) + return; + + // Create a list of available transports + var availableTransports = self.World.Actors + .Where(a => a.Info.HasTraitInfo() + && a.Info.HasTraitInfo() + && a.Info.Name == targetActor.Info.Name + && a.Owner == targetActor.Owner + && !a.IsDead + && (a.CenterPosition - targetActor.CenterPosition).HorizontalLengthSquared <= WDist.FromCells(10).LengthSquared) + .Select(a => new TransportInfo { + Actor = a, + Cargo = a.Trait(), + UnallocatedSpace = a.Trait().Info.MaxWeight - a.Trait().Passengers.Sum(p => p.Trait().Info.Weight) + }) + .Where(t => t.Cargo != null && t.Cargo.HasSpace(1)) + .ToList(); + + // Allocate passengers to the closest available transport + foreach (var pair in selectedWithTrait) + { + if (availableTransports.Count == 0) + break; + + var closestTransport = availableTransports + .Where(t => t.UnallocatedSpace >= pair.Trait.Weight) + .OrderBy(t => (t.Actor.CenterPosition - pair.Actor.CenterPosition).LengthSquared) + .FirstOrDefault(); + + if (closestTransport == null) + continue; + + // can't queue an activity here because the selected units aren't known by all clients so causes a de-sync + // pair.Actor.QueueActivity(order.Queued, new MassRideTransport(pair.Actor, Target.FromActor(closestTransport.Actor), passenger.Info.TargetLineColor)); + self.World.IssueOrder(new Order("EnterTransport", pair.Actor, Target.FromActor(closestTransport.Actor), order.Queued)); + pair.Actor.ShowTargetLines(); + + if (!closestTransport.Cargo.HasSpace(1)) + availableTransports.Remove(closestTransport); + else + closestTransport.UnallocatedSpace -= pair.Trait.Weight; + } + } + } + + class TransportInfo + { + public Actor Actor { get; set; } + public Cargo Cargo { get; set; } + public int UnallocatedSpace { get; set; } + } +} diff --git a/OpenRA.Mods.CA/Traits/MindControllable.cs b/OpenRA.Mods.CA/Traits/MindControllable.cs index 0b0bc4971a..d44b271290 100644 --- a/OpenRA.Mods.CA/Traits/MindControllable.cs +++ b/OpenRA.Mods.CA/Traits/MindControllable.cs @@ -1,61 +1,72 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion -using System.Collections.Generic; using System.Linq; +using OpenRA.Mods.Common.Activities; using OpenRA.Mods.Common.Traits; using OpenRA.Traits; namespace OpenRA.Mods.CA.Traits { + public enum CargoBehaviour { DoNothing, Eject, Kill } + [Desc("This actor can be mind controlled by other actors.")] public class MindControllableInfo : PausableConditionalTraitInfo { + [FieldLoader.Require] + [Desc("Named type of mind control. Must match that of MindController.")] + public readonly string ControlType = null; + [Desc("The sound played when the mindcontrol is revoked.")] public readonly string[] RevokeControlSounds = { }; [Desc("Map player to transfer this actor to if the owner lost the game.")] public readonly string FallbackOwner = "Creeps"; - [ActorReference(dictionaryReference: LintDictionaryReference.Keys)] - [Desc("Condition to grant when under mindcontrol.", - "A dictionary of [actor id]: [condition].")] - public readonly Dictionary ControlledConditions = new Dictionary(); + [Desc("What happens when mind control is revoked after the original owner has already lost.", + "Allowed values are 'ChangeOwner', 'Dispose', 'Kill'.", + "'ChangeOwner' transfers the actor to FallbackOwner.")] + public readonly OwnerLostActionType OriginalOwnerLostAction = OwnerLostActionType.ChangeOwner; - [ActorReference(dictionaryReference: LintDictionaryReference.Keys)] - [Desc("Condition to grant when revoking mindcontrol.", - "A dictionary of [actor id]: [condition].")] - public readonly Dictionary RevokingConditions = new Dictionary(); + [Desc("What happens to cargo on being mind controlled, and when control is lost.")] + public readonly CargoBehaviour CargoBehaviour = CargoBehaviour.DoNothing; [GrantedConditionReference] - public IEnumerable LinterControlledConditions { get { return ControlledConditions.Values; } } + [Desc("Condition to grant when under mindcontrol.", + "A dictionary of [actor id]: [condition].")] + public readonly string ControlledCondition = null; [GrantedConditionReference] - public IEnumerable LinterRevokingConditions { get { return RevokingConditions.Values; } } + [Desc("Condition to grant when revoking mindcontrol.", + "A dictionary of [actor id]: [condition].")] + public readonly string RevokingCondition = null; public override object Create(ActorInitializer init) { return new MindControllable(init.Self, this); } } - public class MindControllable : PausableConditionalTrait, INotifyKilled, INotifyActorDisposing, INotifyOwnerChanged, INotifyTransform, ITick + public class MindControllable : PausableConditionalTrait, INotifyKilled, INotifyActorDisposing, INotifyOwnerChanged, INotifyTransform, ITick, INotifyPassengerExited { readonly MindControllableInfo info; Player creatorOwner; bool controlChanging; Actor oldSelf = null; + Cargo cargo; int controlledToken = Actor.InvalidConditionToken; int revokingToken = Actor.InvalidConditionToken; int revokeTicks; bool revoking = false; - public Actor Master { get; private set; } + INotifyMindControlled[] notifyMindControlled; + + public TraitPair? Master { get; private set; } public MindControllable(Actor self, MindControllableInfo info) : base(info) @@ -63,57 +74,77 @@ public MindControllable(Actor self, MindControllableInfo info) this.info = info; } - public void LinkMaster(Actor self, Actor master) + protected override void Created(Actor self) + { + base.Created(self); + notifyMindControlled = self.TraitsImplementing().ToArray(); + cargo = self.TraitOrDefault(); + } + + public void LinkMaster(Actor self, Actor masterActor) { self.CancelActivity(); + HandleCargo(self, masterActor); + if (Master == null) creatorOwner = self.Owner; controlChanging = true; + if (self.Owner != masterActor.Owner) + self.ChangeOwner(masterActor.Owner); - var oldOwner = self.Owner; - self.ChangeOwner(master.Owner); - - UnlinkMaster(self, Master); - Master = master; - - var mindController = Master.Trait(); + UnlinkMaster(self); + var mindController = masterActor.TraitsImplementing().Single(mc => mc.Info.ControlType == info.ControlType); + Master = new TraitPair(masterActor, mindController); - if (controlledToken == Actor.InvalidConditionToken && Info.ControlledConditions.ContainsKey(Master.Info.Name)) - controlledToken = self.GrantCondition(Info.ControlledConditions[Master.Info.Name]); + if (controlledToken == Actor.InvalidConditionToken && Info.ControlledCondition != null) + controlledToken = self.GrantCondition(Info.ControlledCondition); - if (master.Owner == creatorOwner) - UnlinkMaster(self, master); + if (masterActor.Owner == creatorOwner) + UnlinkMaster(self); self.World.AddFrameEndTask(w => { controlChanging = false; revoking = false; }); + + foreach (var notify in notifyMindControlled) + notify.MindControlled(self, masterActor); } - public void UnlinkMaster(Actor self, Actor master) + void UnlinkMaster(Actor self) { - if (master == null) + if (Master == null) return; + var master = Master.Value; + + HandleCargo(self, master.Actor); + self.World.AddFrameEndTask(_ => { - if (master.IsDead || master.Disposed) + if (master.Actor.IsDead || master.Actor.Disposed) return; - master.Trait().UnlinkSlave(master, self); + master.Trait.UnlinkSlave(master.Actor, self); }); Master = null; + + foreach (var notify in notifyMindControlled) + notify.Released(self, master.Actor); } public void RevokeMindControl(Actor self, int ticks) { controlChanging = true; - var masterName = Master.Info.Name; - UnlinkMaster(self, Master); + + if (Master == null) + return; + + UnlinkMaster(self); if (ticks == 0) RevokeComplete(self); @@ -122,8 +153,8 @@ public void RevokeMindControl(Actor self, int ticks) revokeTicks = ticks; revoking = true; - if (revokingToken == Actor.InvalidConditionToken && Info.RevokingConditions.ContainsKey(masterName)) - revokingToken = self.GrantCondition(Info.RevokingConditions[masterName]); + if (revokingToken == Actor.InvalidConditionToken && Info.RevokingCondition != null) + revokingToken = self.GrantCondition(Info.RevokingCondition); } } @@ -131,23 +162,56 @@ void RevokeComplete(Actor self) { self.CancelActivity(); - if (creatorOwner.WinState == WinState.Lost) - self.ChangeOwner(self.World.Players.First(p => p.InternalName == info.FallbackOwner)); - else - self.ChangeOwner(creatorOwner); - if (controlledToken != Actor.InvalidConditionToken) controlledToken = self.RevokeCondition(controlledToken); if (revokingToken != Actor.InvalidConditionToken) revokingToken = self.RevokeCondition(revokingToken); - if (info.RevokeControlSounds.Any()) + if (info.RevokeControlSounds.Length > 0) Game.Sound.Play(SoundType.World, info.RevokeControlSounds.Random(self.World.SharedRandom), self.CenterPosition); + if (creatorOwner.WinState == WinState.Lost) + { + switch (info.OriginalOwnerLostAction) + { + case OwnerLostActionType.Kill: + self.Kill(self); + break; + case OwnerLostActionType.Dispose: + self.Dispose(); + break; + default: + self.ChangeOwner(self.World.Players.First(p => p.InternalName == info.FallbackOwner)); + break; + } + } + else + self.ChangeOwner(creatorOwner); + self.World.AddFrameEndTask(_ => controlChanging = false); } + void HandleCargo(Actor self, Actor master) + { + if (cargo == null || cargo.IsEmpty() || master == null) + return; + + if (info.CargoBehaviour == CargoBehaviour.Kill) + { + while (!cargo.IsEmpty()) + { + var a = cargo.Unload(self); + a.Kill(master); + } + } + else if (info.CargoBehaviour == CargoBehaviour.Eject) + { + self.CancelActivity(); + self.QueueActivity(new UnloadCargo(self, WDist.FromCells(5))); + } + } + void ITick.Tick(Actor self) { if (IsTraitPaused || IsTraitDisabled) @@ -164,18 +228,29 @@ void ITick.Tick(Actor self) void INotifyKilled.Killed(Actor self, AttackInfo e) { - UnlinkMaster(self, Master); + if (Master == null) + return; + + UnlinkMaster(self); } void INotifyActorDisposing.Disposing(Actor self) { - UnlinkMaster(self, Master); + if (Master == null) + return; + + UnlinkMaster(self); } void INotifyOwnerChanged.OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) { - if (!controlChanging) - UnlinkMaster(self, Master); + if (Master == null || controlChanging) + return; + + UnlinkMaster(self); + + if (controlledToken != Actor.InvalidConditionToken) + controlledToken = self.RevokeCondition(controlledToken); } protected override void TraitDisabled(Actor self) @@ -197,16 +272,25 @@ void INotifyTransform.AfterTransform(Actor self) { if (Master != null) { - var mc = self.TraitOrDefault(); + var mc = self.TraitsImplementing().FirstOrDefault(m => m.Info.ControlType == Info.ControlType); if (mc != null) { mc.TransferMindControl(this); if (oldSelf != null) - Master.Trait().TransformSlave(Master, oldSelf, self); + Master.Value.Trait.TransformSlave(Master.Value.Actor, oldSelf, self); } else self.ChangeOwner(creatorOwner); } } + + void INotifyPassengerExited.OnPassengerExited(Actor self, Actor passenger) + { + if (Master == null || creatorOwner == null) + return; + + if (passenger.Owner != creatorOwner) + passenger.ChangeOwner(creatorOwner); + } } } diff --git a/OpenRA.Mods.CA/Traits/MindControllableProgressBar.cs b/OpenRA.Mods.CA/Traits/MindControllableProgressBar.cs index c247cb0386..6a6e52e6fc 100644 --- a/OpenRA.Mods.CA/Traits/MindControllableProgressBar.cs +++ b/OpenRA.Mods.CA/Traits/MindControllableProgressBar.cs @@ -1,11 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -20,13 +19,16 @@ namespace OpenRA.Mods.CA.Traits [RequireExplicitImplementation] public interface IMindControlProgressWatcher { - void Update(Actor self, Actor captor, Actor target, int progress, int total); + void Update(Actor self, Actor captor, Actor target, int progress, int total, string controlType); } [Desc("Visualize capture progress.")] class MindControllableProgressBarInfo : ConditionalTraitInfo, Requires { - public readonly Color Color = Color.Orange; + [FieldLoader.Require] + public readonly HashSet ControlTypes = null; + + public readonly Color Color = Color.HotPink; public override object Create(ActorInitializer init) { return new MindControllableProgressBar(init.Self, this); } } @@ -38,9 +40,9 @@ class MindControllableProgressBar : ConditionalTrait, Requires { + [FieldLoader.Require] + [Desc("Named type of mind control. Determines which progress bar is shown.")] + public readonly string ControlType = null; + [Desc("Name of the armaments that grant this condition.")] public readonly HashSet ArmamentNames = new HashSet() { "primary" }; @@ -26,20 +38,33 @@ public class MindControllerInfo : PausableConditionalTraitInfo, Requires TargetTypeTicksToControl = new Dictionary(); + + [Desc("Ticks taken for mind control to wear off after controller loses control.")] public readonly int TicksToRevoke = 0; + [Desc("Ticks taken for mind control to wear off after controller dies. Use -1 to use TicksToRevoke value.")] + public readonly int TicksToRevokeOnDeath = -1; + + [Desc("If true, undeploy when control is gained of target, or if interrupted (e.g. if target dies).")] + public readonly bool AutoUndeploy = false; + + [Desc("If true, slave will be released when attacking a new target.")] + public readonly bool ReleaseOnNewTarget = false; + + [Desc("Cursor to use for targeting slaves to deploy.")] + public readonly string DeploySlaveCursor = "mc-deploy"; + + [Desc("What happens when a slave is deployed while the master is selected (unrelated to when the master is deployed).")] + public readonly SlaveDeployEffect SlaveDeployEffect = SlaveDeployEffect.None; + + [Desc("Weapon to detonate if SlaveDeployEffect is Detonate.")] + [WeaponReference] + public readonly string SlaveDetonateWeapon = null; + + public WeaponInfo SlaveDetonateWeaponInfo { get; private set; } + + [Desc("Types of damage that this trait causes to slave if killed on deploying or when capacity exceeded. Leave empty for no damage types.")] + public readonly BitSet SlaveKillDamageTypes = default(BitSet); + + [Desc("Percentage of targets cost gained as XP when successfully mind controlled.")] + public readonly int ExperienceFromControl = 0; + + [Desc("If true, the mind controller transfer slaves to transport on entering. If the transport doesn't have a matching MindController trait, control will not be transferred.")] + public readonly bool TransferToTransport = true; + public override object Create(ActorInitializer init) { return new MindController(init.Self, this); } + + public override void RulesetLoaded(Ruleset rules, ActorInfo ai) + { + base.RulesetLoaded(rules, ai); + + if (SlaveDetonateWeapon != null) + { + WeaponInfo weaponInfo; + + var slaveDetonateWeaponToLower = (SlaveDetonateWeapon ?? string.Empty).ToLowerInvariant(); + if (!rules.Weapons.TryGetValue(slaveDetonateWeaponToLower, out weaponInfo)) + throw new YamlException($"Weapons Ruleset does not contain an entry '{slaveDetonateWeaponToLower}'"); + + SlaveDetonateWeaponInfo = weaponInfo; + } + } } - public class MindController : PausableConditionalTrait, INotifyAttack, INotifyKilled, INotifyActorDisposing, INotifyCreated, IResolveOrder, ITick + public class MindController : PausableConditionalTrait, INotifyAttack, INotifyKilled, INotifyActorDisposing, INotifyCreated, IIssueOrder, IResolveOrder, ITick, INotifyEnteredCargo, INotifyExitedCargo { - readonly List slaves = new List(); - readonly Stack controllingTokens = new Stack(); + readonly List> slaves = new List>(); + readonly Queue controllingTokens = new Queue(); - public IEnumerable Slaves { get { return slaves; } } + public List> Slaves { get { return slaves; } } + + MindControllerInfo info; + int capacity; + IEnumerable capacityModifiers; + bool refreshCapacity; + int maxControlledToken = Actor.InvalidConditionToken; // Only tracked when TicksToControl greater than zero Target lastTarget = Target.Invalid; Target currentTarget = Target.Invalid; + int lastTargetTicksToControl; + int currentTargetTicksToControl; int controlTicks; + int progressToken = Actor.InvalidConditionToken; + + GrantConditionOnDeploy deployTrait; + HashSet slaveHistory; + GainsExperience gainsExperience; + INotifyMindControlling[] notifyMindControlling; public MindController(Actor self, MindControllerInfo info) : base(info) { + this.info = info; + slaveHistory = new HashSet(); + } + + protected override void Created(Actor self) + { + base.Created(self); + gainsExperience = self.TraitOrDefault(); + capacityModifiers = self.TraitsImplementing(); + deployTrait = self.TraitOrDefault(); + notifyMindControlling = self.TraitsImplementing().ToArray(); ResetProgress(self); + UpdateCapacity(self); } - void StackControllingCondition(Actor self, string condition) + void AddControllingCondition(Actor self) { + var condition = Info.ControllingCondition; if (string.IsNullOrEmpty(condition)) return; - controllingTokens.Push(self.GrantCondition(condition)); + controllingTokens.Enqueue(self.GrantCondition(condition)); } - void UnstackControllingCondition(Actor self, string condition) + void SubtractControllingCondition(Actor self) { + var condition = Info.ControllingCondition; if (string.IsNullOrEmpty(condition)) return; - self.RevokeCondition(controllingTokens.Pop()); + self.RevokeCondition(controllingTokens.Dequeue()); } public void UnlinkSlave(Actor self, Actor slave) { - if (slaves.Contains(slave)) + if (slaves.Any(s => s.Actor == slave)) { - slaves.Remove(slave); - UnstackControllingCondition(self, Info.ControllingCondition); + slaves.Remove(slaves.First(s => s.Actor == slave)); + SubtractControllingCondition(self); + MaxControlledCheck(self); } } void ITick.Tick(Actor self) { - if (Info.TicksToControl == 0) + if (refreshCapacity) + UpdateCapacity(self); + + if (currentTargetTicksToControl == 0) return; if (currentTarget.Type != TargetType.Actor) + { + if (Info.AutoUndeploy && deployTrait != null && deployTrait.DeployState == DeployState.Deployed) + ResolveOrder(self, new Order("Stop", self, false)); // for some reason Undeploy() doesn't work properly here + return; + } - if (controlTicks < Info.TicksToControl) + if (controlTicks < currentTargetTicksToControl) controlTicks++; - if (controlTicks == 1 && Info.InitSounds.Any()) + GrantProgressCondition(self); + + if (controlTicks == 1 && Info.InitSounds.Length > 0) { if (Info.InitSoundControllerOnly) Game.Sound.PlayToPlayer(SoundType.World, self.Owner, Info.InitSounds.Random(self.World.SharedRandom), self.CenterPosition); @@ -117,49 +230,134 @@ void ITick.Tick(Actor self) Game.Sound.Play(SoundType.World, Info.InitSounds.Random(self.World.SharedRandom), self.CenterPosition); } - var currentTargetWatchers = currentTarget.Actor.TraitsImplementing().ToArray(); + UpdateProgressBar(self, currentTarget, currentTargetTicksToControl); - foreach (var w in currentTargetWatchers) - w.Update(currentTarget.Actor, self, currentTarget.Actor, controlTicks, Info.TicksToControl); + if (controlTicks == currentTargetTicksToControl) + AddSlave(self, currentTarget.Actor); + } - if (controlTicks == Info.TicksToControl) - AddSlave(self); + public void GrantProgressCondition(Actor self) + { + if (string.IsNullOrEmpty(Info.ProgressCondition)) + return; + + if (progressToken == Actor.InvalidConditionToken) + progressToken = self.GrantCondition(Info.ProgressCondition); } - public void ResolveOrder(Actor self, Order order) + public void RevokeProgressCondition(Actor self) { - if (order.Target.Actor != currentTarget.Actor) - { - ResetProgress(self); - lastTarget = currentTarget; - currentTarget = Target.Invalid; - } + if (string.IsNullOrEmpty(Info.ProgressCondition)) + return; + + if (progressToken != Actor.InvalidConditionToken) + progressToken = self.RevokeCondition(progressToken); } - void ResetProgress(Actor self) + void MaxControlledCheck(Actor self) { - if (Info.TicksToControl == 0) + if (capacity <= 0) return; - controlTicks = 0; + if (slaves.Count >= capacity) + GrantMaxControlledCondition(self); + else + RevokeMaxControlledCondition(self); + } - if (lastTarget.Type == TargetType.Actor) + public void GrantMaxControlledCondition(Actor self) + { + if (string.IsNullOrEmpty(Info.MaxControlledCondition)) + return; + + if (maxControlledToken == Actor.InvalidConditionToken) + maxControlledToken = self.GrantCondition(Info.MaxControlledCondition); + } + + public void RevokeMaxControlledCondition(Actor self) + { + if (string.IsNullOrEmpty(Info.MaxControlledCondition)) + return; + + if (maxControlledToken != Actor.InvalidConditionToken) + maxControlledToken = self.RevokeCondition(maxControlledToken); + } + + public void ResolveOrder(Actor self, Order order) + { + if (order.OrderString == "ReleaseSlave") { - var lastTargetWatchers = lastTarget.Actor.TraitsImplementing().ToArray(); + if (order.Target.Type != TargetType.Actor) + return; + + var slave = slaves.SingleOrDefault(s => s.Actor == order.Target.Actor); + slave.Trait?.RevokeMindControl(order.Target.Actor, 0); + + if (Info.SlaveDeployEffect == SlaveDeployEffect.Kill) + { + self.World.AddFrameEndTask(w => { + if (!order.Target.Actor.IsDead) + order.Target.Actor.Kill(order.Target.Actor, Info.SlaveKillDamageTypes); + }); + } + else if (Info.SlaveDeployEffect == SlaveDeployEffect.Detonate) + { + self.World.AddFrameEndTask(w => DetonateSlave(self, order.Target.Actor)); + } + + if (Info.ReleaseSounds.Length > 0) + { + if (Info.ReleaseSoundControllerOnly) + Game.Sound.PlayToPlayer(SoundType.World, self.Owner, Info.ReleaseSounds.Random(self.World.SharedRandom), self.CenterPosition); + else + Game.Sound.Play(SoundType.World, Info.ReleaseSounds.Random(self.World.SharedRandom), self.CenterPosition); + } - foreach (var w in lastTargetWatchers) - w.Update(lastTarget.Actor, self, lastTarget.Actor, 0, Info.TicksToControl); + return; } - if (currentTarget.Type == TargetType.Actor) + // For all other orders, if target has changed, reset progress + if (order.Target.Actor != currentTarget.Actor && !order.Queued) { - var currentTargetWatchers = currentTarget.Actor.TraitsImplementing().ToArray(); + if (Info.AutoUndeploy && deployTrait != null && deployTrait.DeployState == DeployState.Deployed && currentTarget.Actor != null && order.OrderString != "GrantConditionOnDeploy") + deployTrait.Undeploy(); - foreach (var w in currentTargetWatchers) - w.Update(currentTarget.Actor, self, currentTarget.Actor, 0, Info.TicksToControl); + ResetProgress(self); + ResetTarget(); } } + void ResetTarget() + { + lastTarget = currentTarget; + lastTargetTicksToControl = currentTargetTicksToControl; + currentTarget = Target.Invalid; + currentTargetTicksToControl = 0; + } + + void ResetProgress(Actor self) + { + controlTicks = 0; + RevokeProgressCondition(self); + + if (lastTargetTicksToControl > 0) + UpdateProgressBar(self, lastTarget, lastTargetTicksToControl); + + if (currentTargetTicksToControl > 0) + UpdateProgressBar(self, currentTarget, currentTargetTicksToControl); + } + + void UpdateProgressBar(Actor self, Target target, int ticksToControl) + { + if (target.Type != TargetType.Actor) + return; + + var targetWatchers = target.Actor.TraitsImplementing().ToArray(); + + foreach (var w in targetWatchers) + w.Update(target.Actor, self, target.Actor, controlTicks, ticksToControl, Info.ControlType); + } + void INotifyAttack.PreparingAttack(Actor self, in Target target, Armament a, Barrel barrel) { } void INotifyAttack.Attacking(Actor self, in Target target, Armament a, Barrel barrel) @@ -176,52 +374,99 @@ void INotifyAttack.Attacking(Actor self, in Target target, Armament a, Barrel ba lastTarget = currentTarget; currentTarget = target; - if (TargetChanged() && Info.TicksToControl > 0) + if (TargetChanged(target, lastTarget) && (Info.TicksToControl > 0 || Info.TargetTypeTicksToControl.Any())) { + lastTargetTicksToControl = currentTargetTicksToControl; + currentTargetTicksToControl = Info.TicksToControl; + + if (Info.TargetTypeTicksToControl.Any()) + { + var targetTypes = currentTarget.Actor.GetEnabledTargetTypes(); + var matchingTargetTypeTicks = Info.TargetTypeTicksToControl.Where(t => targetTypes.Contains(t.Key)); + + if (matchingTargetTypeTicks.Any()) + { + var maxTicksToControl = matchingTargetTypeTicks.Max(t => t.Value); + currentTargetTicksToControl = Math.Max(maxTicksToControl, currentTargetTicksToControl); + } + } + ResetProgress(self); - return; + + if (Info.ReleaseOnNewTarget) + ReleaseSlaves(self, Info.TicksToRevoke); + + if (currentTargetTicksToControl > 0) + return; } - AddSlave(self); + AddSlave(self, currentTarget.Actor); } - void AddSlave(Actor self) + public void AddSlave(Actor self, Actor slaveToAdd, bool transfer = false) { - if (IsTraitDisabled || IsTraitPaused) + if (!transfer && (IsTraitDisabled || IsTraitPaused)) return; - if (controlTicks < Info.TicksToControl) + if (controlTicks < currentTargetTicksToControl) return; - if (self.Owner.RelationshipWith(currentTarget.Actor.Owner) == PlayerRelationship.Ally) + if (!transfer && self.Owner.RelationshipWith(slaveToAdd.Owner) == PlayerRelationship.Ally) return; - var mindControllable = currentTarget.Actor.TraitOrDefault(); + var mindControllable = slaveToAdd.TraitsImplementing().FirstOrDefault(mc => mc.Info.ControlType == info.ControlType); if (mindControllable == null) - { - throw new InvalidOperationException( - "`{0}` tried to mindcontrol `{1}`, but the latter does not have the necessary trait!" - .F(self.Info.Name, currentTarget.Actor.Info.Name)); - } + throw new InvalidOperationException($"`{self.Info.Name}` tried to mindcontrol `{slaveToAdd.Info.Name}`, but the latter does not have the necessary trait!"); if (mindControllable.IsTraitDisabled || mindControllable.IsTraitPaused) return; - if (Info.Capacity > 0 && !Info.DiscardOldest && slaves.Count() >= Info.Capacity) + if (capacity > 0 && Info.ControlAtCapacityBehaviour == ControlAtCapacityBehaviour.BlockNew && slaves.Count >= capacity) return; - if (mindControllable.Master != null) + if (!transfer && mindControllable.Master != null) { ResetProgress(self); return; } - slaves.Add(currentTarget.Actor); - StackControllingCondition(self, Info.ControllingCondition); - mindControllable.LinkMaster(currentTarget.Actor, self); + var traitPair = new TraitPair(slaveToAdd, mindControllable); + slaves.Add(traitPair); + AddControllingCondition(self); + mindControllable.LinkMaster(slaveToAdd, self); + + if (capacity > 0 && Info.ControlAtCapacityBehaviour != ControlAtCapacityBehaviour.BlockNew && slaves.Count > capacity) + { + var oldestSlave = slaves[0]; + oldestSlave.Trait.RevokeMindControl(oldestSlave.Actor, 0); + + if (Info.ControlAtCapacityBehaviour == ControlAtCapacityBehaviour.KillOldest) + { + self.World.AddFrameEndTask(w => { + if (!oldestSlave.Actor.IsDead) + oldestSlave.Actor.Kill(oldestSlave.Actor, Info.SlaveKillDamageTypes); + }); + } + else if (Info.ControlAtCapacityBehaviour == ControlAtCapacityBehaviour.DetonateOldest) + { + self.World.AddFrameEndTask(w => DetonateSlave(self, oldestSlave.Actor)); + } + } + + if (!transfer) + GiveExperience(slaveToAdd); - if (Info.ControlSounds.Any()) + ControlComplete(self); + MaxControlledCheck(self); + + foreach (var notify in notifyMindControlling) + notify.MindControlling(self, slaveToAdd); + } + + void ControlComplete(Actor self) + { + if (Info.ControlSounds.Length > 0) { if (Info.ControlSoundControllerOnly) Game.Sound.PlayToPlayer(SoundType.World, self.Owner, Info.ControlSounds.Random(self.World.SharedRandom), self.CenterPosition); @@ -229,81 +474,237 @@ void AddSlave(Actor self) Game.Sound.Play(SoundType.World, Info.ControlSounds.Random(self.World.SharedRandom), self.CenterPosition); } - if (Info.Capacity > 0 && Info.DiscardOldest && slaves.Count() > Info.Capacity) - slaves[0].Trait().RevokeMindControl(slaves[0], 0); - - var currentTargetWatchers = currentTarget.Actor.TraitsImplementing().ToArray(); - - foreach (var w in currentTargetWatchers) - w.Update(currentTarget.Actor, self, currentTarget.Actor, 0, Info.TicksToControl); + if (Info.AutoUndeploy && deployTrait != null && deployTrait.DeployState == DeployState.Deployed) + deployTrait.Undeploy(); - currentTarget = Target.Invalid; + ResetProgress(self); + ResetTarget(); } - void ReleaseSlaves(Actor self, int ticks) + public void ReleaseSlaves(Actor self, int ticks) { foreach (var s in slaves) { - if (s.IsDead || s.Disposed) + if (s.Actor.IsDead || s.Actor.Disposed) + continue; + + if (s.Trait.Master.HasValue && s.Trait.Master.Value.Actor != self) continue; - s.Trait().RevokeMindControl(s, ticks); + s.Trait.RevokeMindControl(s.Actor, ticks); } slaves.Clear(); - while (controllingTokens.Any()) - UnstackControllingCondition(self, Info.ControllingCondition); + while (controllingTokens.Count > 0) + SubtractControllingCondition(self); + + RevokeMaxControlledCondition(self); } public void TransformSlave(Actor self, Actor oldSlave, Actor newSlave) { - if (slaves.Contains(oldSlave)) - slaves[slaves.FindIndex(o => o == oldSlave)] = newSlave; + if (slaves.Any(s => s.Actor == oldSlave)) + { + var traitPair = new TraitPair(newSlave, newSlave.TraitsImplementing().First(mc => mc.Info.ControlType == info.ControlType)); + slaves[slaves.FindIndex(o => o.Actor == oldSlave)] = traitPair; + } } void INotifyKilled.Killed(Actor self, AttackInfo e) { - ReleaseSlaves(self, Info.TicksToRevoke); + ResetProgress(self); + var ticksToRevoke = Info.TicksToRevokeOnDeath > -1 ? Info.TicksToRevokeOnDeath : Info.TicksToRevoke; + ReleaseSlaves(self, ticksToRevoke); } void INotifyActorDisposing.Disposing(Actor self) { - ReleaseSlaves(self, Info.TicksToRevoke); + ResetProgress(self); + var ticksToRevoke = Info.TicksToRevokeOnDeath > -1 ? Info.TicksToRevokeOnDeath : Info.TicksToRevoke; + ReleaseSlaves(self, ticksToRevoke); } protected override void TraitDisabled(Actor self) { - ReleaseSlaves(self, 0); + ReleaseSlaves(self, Info.TicksToRevoke); } - bool TargetChanged() + static bool TargetChanged(in Target lastTarget, in Target target) { // Invalidate reveal changing the target. - if (lastTarget.Type == TargetType.FrozenActor && currentTarget.Type == TargetType.Actor) - if (lastTarget.FrozenActor.Actor == currentTarget.Actor) - return false; + if (lastTarget.Type == TargetType.FrozenActor && + target.Type == TargetType.Actor && + lastTarget.FrozenActor.Actor == target.Actor) + return false; - if (lastTarget.Type == TargetType.Actor && currentTarget.Type == TargetType.FrozenActor) - if (currentTarget.FrozenActor.Actor == lastTarget.Actor) - return false; + if (lastTarget.Type == TargetType.Actor && + target.Type == TargetType.FrozenActor && + target.FrozenActor.Actor == lastTarget.Actor) + return false; - if (lastTarget.Type != currentTarget.Type) + if (lastTarget.Type != target.Type) return true; // Invalidate attacking different targets with shared target types. - if (lastTarget.Type == TargetType.Actor && currentTarget.Type == TargetType.Actor) - if (lastTarget.Actor != currentTarget.Actor) - return true; + if (lastTarget.Type == TargetType.Actor && + target.Type == TargetType.Actor && + lastTarget.Actor != target.Actor) + return true; - if (lastTarget.Type == TargetType.FrozenActor && currentTarget.Type == TargetType.FrozenActor) - if (lastTarget.FrozenActor != currentTarget.FrozenActor) - return true; + if (lastTarget.Type == TargetType.FrozenActor && + target.Type == TargetType.FrozenActor && + lastTarget.FrozenActor != target.FrozenActor) + return true; - if (lastTarget.Type == TargetType.Terrain && currentTarget.Type == TargetType.Terrain) - if (lastTarget.CenterPosition != currentTarget.CenterPosition) - return true; + if (lastTarget.Type == TargetType.Terrain && + target.Type == TargetType.Terrain && + lastTarget.CenterPosition != target.CenterPosition) + return true; return false; } + + void UpdateCapacity(Actor self) + { + refreshCapacity = false; + var newCapacity = info.Capacity; + + // Modifiers have no effect if the base capacity is unlimited. + if (info.Capacity <= 0) + return; + + foreach (var capacityModifier in capacityModifiers) + newCapacity += capacityModifier.Amount; + + capacity = Math.Max(newCapacity, 1); + + var currentSlaveCount = slaves.Count; + var numSlavesToRemove = currentSlaveCount - capacity; + for (var i = numSlavesToRemove; i > 0; i--) + slaves[i].Trait.RevokeMindControl(slaves[i].Actor, 0); + + MaxControlledCheck(self); + } + + public void ModifierUpdated() + { + refreshCapacity = true; + } + + void GiveExperience(Actor slave) + { + if (gainsExperience == null || info.ExperienceFromControl == 0 || slaveHistory.Contains(slave)) + return; + + var valued = slave.Info.TraitInfoOrDefault(); + if (valued == null) + return; + + slaveHistory.Add(slave); + gainsExperience.GiveExperience(Util.ApplyPercentageModifiers(valued.Cost, new int[] { 10000, info.ExperienceFromControl })); + } + + IEnumerable IIssueOrder.Orders + { + get + { + yield return new ReleaseSlaveOrderTargeter( + "ReleaseSlave", + 101, + Info.DeploySlaveCursor, + (target, modifiers) => !modifiers.HasModifier(TargetModifiers.ForceMove) && IsDeployableSlave(target)); + + yield return new ReleaseSlaveOrderTargeter( + "ReleaseSlave", + 5, + Info.DeploySlaveCursor, + (target, modifiers) => modifiers.HasModifier(TargetModifiers.ForceMove) && IsDeployableSlave(target)); + } + } + + Order IIssueOrder.IssueOrder(Actor self, IOrderTargeter order, in Target target, bool queued) + { + if (order.OrderID == "ReleaseSlave") + return new Order(order.OrderID, self, target, queued); + + return null; + } + + bool IsDeployableSlave(Actor a) + { + if (Info.SlaveDeployEffect == SlaveDeployEffect.None) + return false; + + return slaves.Any(s => s.Actor == a); + } + + void DetonateSlave(Actor self, Actor slave) + { + if (slave.IsDead && !slave.IsInWorld) + return; + + if (Info.SlaveDetonateWeapon == null) + return; + + var weapon = Info.SlaveDetonateWeaponInfo; + var pos = Target.FromPos(slave.CenterPosition); + + var args = new WarheadArgs + { + Weapon = weapon, + DamageModifiers = self.TraitsImplementing().Select(a => a.GetFirepowerModifier()).ToArray(), + Source = self.CenterPosition, + SourceActor = self, + WeaponTarget = pos + }; + + weapon.Impact(pos, args); + } + + public void TransferSlaves(Actor self, Actor newMaster) + { + if (self.IsDead || self.Disposed) + return; + + foreach (var s in slaves) + { + if (s.Actor.IsDead || s.Actor.Disposed) + continue; + + s.Trait.LinkMaster(s.Actor, newMaster); + } + } + + void INotifyEnteredCargo.OnEnteredCargo(Actor self, Actor cargo) + { + if (Info.TransferToTransport) + { + var transportMc = cargo.TraitsImplementing().FirstOrDefault(mc => mc.Info.ControlType == info.ControlType); + if (transportMc != null) + { + foreach (var s in slaves) + { + if (s.Actor.IsDead || s.Actor.Disposed) + continue; + + transportMc.AddSlave(cargo, s.Actor, true); + } + } + } + } + + void INotifyExitedCargo.OnExitedCargo(Actor self, Actor cargo) + { + if (!Info.TransferToTransport) + return; + + var transportMc = cargo.TraitsImplementing().FirstOrDefault(mc => mc.Info.ControlType == info.ControlType); + if (transportMc == null) + return; + + var slavesToTransfer = transportMc.Slaves.Where(s => !s.Actor.IsDead && !s.Actor.Disposed).ToList(); + foreach (var s in slavesToTransfer) + AddSlave(self, s.Actor, true); + } } } diff --git a/OpenRA.Mods.CA/Traits/MindControllerCapacityModifier.cs b/OpenRA.Mods.CA/Traits/MindControllerCapacityModifier.cs new file mode 100644 index 0000000000..abfdebc004 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/MindControllerCapacityModifier.cs @@ -0,0 +1,52 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("This actor can mind control other actors.")] + public class MindControllerCapacityModifierInfo : ConditionalTraitInfo, Requires + { + [Desc("Number to increase mind control capacity by (negative to reduce).")] + public readonly int Amount = 1; + + public override object Create(ActorInitializer init) { return new MindControllerCapacityModifier(init.Self, this); } + } + + public class MindControllerCapacityModifier : ConditionalTrait + { + readonly MindControllerCapacityModifierInfo info; + readonly IEnumerable mindControllers; + + public MindControllerCapacityModifier(Actor self, MindControllerCapacityModifierInfo info) + : base(info) + { + this.info = info; + mindControllers = self.TraitsImplementing(); + } + + public int Amount { get { return IsTraitDisabled ? 0 : info.Amount; } } + + protected override void TraitEnabled(Actor self) + { + foreach (var mindController in mindControllers) + mindController.ModifierUpdated(); + } + + protected override void TraitDisabled(Actor self) + { + foreach (var mindController in mindControllers) + mindController.ModifierUpdated(); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Mirage.cs b/OpenRA.Mods.CA/Traits/Mirage.cs index f5a4a49d24..e32da6ab59 100644 --- a/OpenRA.Mods.CA/Traits/Mirage.cs +++ b/OpenRA.Mods.CA/Traits/Mirage.cs @@ -1,11 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -94,8 +93,8 @@ public class MirageInfo : PausableConditionalTraitInfo public override object Create(ActorInitializer init) { return new Mirage(init, this); } } - public class Mirage : PausableConditionalTrait, INotifyDamage, IEffectiveOwner, INotifyUnload, INotifyDemolition, INotifyInfiltration, - INotifyAttack, ITick, INotifyCreated, INotifyHarvesterAction + public class Mirage : PausableConditionalTrait, INotifyDamage, IEffectiveOwner, INotifyUnloadCargo, INotifyDemolition, INotifyInfiltration, + INotifyAttack, ITick, INotifyCreated, INotifyDockClient { [Sync] private int remainingTime; @@ -113,7 +112,16 @@ public class Mirage : PausableConditionalTrait, INotifyDamage, IEffe public bool Disguised { get { return IsMirage; } } public ActorInfo ActorType { get; private set; } - public Player Owner { get { return IsMirage ? self.World.Players.First(p => p.InternalName == Info.EffectiveOwner) : null; } } + public Player Owner + { + get + { + if (Info.EffectiveOwner == "Self") + return self.Owner; + + return IsMirage ? self.World.Players.First(p => p.InternalName == Info.EffectiveOwner) : null; + } + } public Mirage(ActorInitializer init, MirageInfo info) : base(info) @@ -124,7 +132,7 @@ public Mirage(ActorInitializer init, MirageInfo info) var targets = self.World.ActorsWithTrait().Distinct(); targetTypes = targets.Select(a => a.Actor.Info).ToArray(); - if (!targetTypes.Any() && info.DefaultTargetTypes != null) + if (targetTypes.Length == 0 && info.DefaultTargetTypes != null) targetTypes = self.World.Map.Rules.Actors.Where(a => info.DefaultTargetTypes.Contains(a.Key)).Select(a => a.Value).ToArray(); ActorType = targetTypes.RandomOrDefault(self.World.SharedRandom); @@ -203,15 +211,7 @@ protected override void TraitEnabled(Actor self) protected override void TraitDisabled(Actor self) { Reveal(); } - void INotifyHarvesterAction.MovingToResources(Actor self, CPos targetCell) { } - - void INotifyHarvesterAction.MovingToRefinery(Actor self, Actor refineryActor) { } - - void INotifyHarvesterAction.MovementCancelled(Actor self) { } - - void INotifyHarvesterAction.Harvested(Actor self, ResourceType resource) { } - - void INotifyHarvesterAction.Docked() + void INotifyDockClient.Docked(Actor self, Actor host) { if (Info.RevealOn.HasFlag(MirageRevealType.Dock)) { @@ -220,12 +220,12 @@ void INotifyHarvesterAction.Docked() } } - void INotifyHarvesterAction.Undocked() + void INotifyDockClient.Undocked(Actor self, Actor host) { isDocking = false; } - void INotifyUnload.Unloading(Actor self) + void INotifyUnloadCargo.Unloading(Actor self) { if (Info.RevealOn.HasFlag(MirageRevealType.Unload)) Reveal(); diff --git a/OpenRA.Mods.CA/Traits/MissileBase.cs b/OpenRA.Mods.CA/Traits/MissileBase.cs new file mode 100644 index 0000000000..97e122e5db --- /dev/null +++ b/OpenRA.Mods.CA/Traits/MissileBase.cs @@ -0,0 +1,302 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.Activities; +using OpenRA.Mods.Common; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("This unit, when ordered to move, will fly in ballistic path then will detonate itself upon reaching target.")] + public abstract class MissileBaseInfo : TraitInfo, IMoveInfo, IPositionableInfo, IFacingInfo + { + [Desc("Projectile speed in WDist / tick, two values indicate variable velocity.")] + public readonly int Speed = 17; + + [Desc("In angle. MissileBase is launched at this pitch and the intial tangential line of the ballistic path will be this.")] + public readonly WAngle LaunchAngle = WAngle.Zero; + + [Desc("Minimum altitude where this missile is considered airborne")] + public readonly int MinAirborneAltitude = 5; + + [Desc("Types of damage missile explosion is triggered with. Leave empty for no damage types.")] + public readonly BitSet DamageTypes = default; + + [GrantedConditionReference] + [Desc("The condition to grant to self while airborne.")] + public readonly string AirborneCondition = null; + + [Desc("Color to use for the target line.")] + public readonly Color TargetLineColor = Color.Crimson; + + public abstract override object Create(ActorInitializer init); + + public IReadOnlyDictionary OccupiedCells(ActorInfo info, CPos location, SubCell subCell = SubCell.Any) { return new Dictionary(); } + bool IOccupySpaceInfo.SharesCell { get { return false; } } + public bool CanEnterCell(World world, Actor self, CPos cell, SubCell subCell = SubCell.FullCell, Actor ignoreActor = null, BlockedByActor check = BlockedByActor.All) + { + // SBMs may not land. + return false; + } + + // set by spawned logic, not this. + public WAngle GetInitialFacing() { return WAngle.Zero; } + + public Color GetTargetLineColor() { return TargetLineColor; } + } + + public abstract class MissileBase : ISync, IFacing, IMove, IPositionable, + INotifyCreated, INotifyAddedToWorld, INotifyRemovedFromWorld, IOccupySpace + { + static readonly (CPos, SubCell)[] NoCells = { }; + + public readonly MissileBaseInfo Info; + readonly Actor self; + public Target Target; + + IEnumerable speedModifiers; + INotifyCenterPositionChanged[] notifyCenterPositionChanged; + bool requiresVisibilityChecks = false; + + [Sync] + public WAngle Facing + { + get { return Orientation.Yaw; } + set { Orientation = Orientation.WithYaw(value); } + } + + public WAngle Pitch + { + get { return Orientation.Pitch; } + set { Orientation = Orientation.WithPitch(value); } + } + + public WRot Orientation { get; private set; } + + [Sync] + public WPos CenterPosition { get; private set; } + + public CPos TopLeft { get { return self.World.Map.CellContaining(CenterPosition); } } + + bool airborne; + int airborneToken = Actor.InvalidConditionToken; + + public MissileBase(ActorInitializer init, MissileBaseInfo info) + { + Info = info; + self = init.Self; + + var locationInit = init.GetOrDefault(info); + if (locationInit != null) + SetPosition(self, locationInit.Value); + + var centerPositionInit = init.GetOrDefault(info); + if (centerPositionInit != null) + SetPosition(self, centerPositionInit.Value); + + // I need facing but initial facing doesn't matter, they are determined by the spawner's facing. + Facing = init.GetValue(info, WAngle.Zero); + } + + // This kind of missile will not turn anyway. Hard-coding here. + public WAngle TurnSpeed { get { return new WAngle(40); } } + + void INotifyCreated.Created(Actor self) + { + speedModifiers = self.TraitsImplementing().ToArray().Select(sm => sm.GetSpeedModifier()); + notifyCenterPositionChanged = self.TraitsImplementing().ToArray(); + requiresVisibilityChecks = self.TraitsImplementing().Any(); + } + + void INotifyAddedToWorld.AddedToWorld(Actor self) + { + self.World.AddToMaps(self, this); + self.QueueActivity(GetActivity(self, Target)); + + var altitude = self.World.Map.DistanceAboveTerrain(CenterPosition); + if (altitude.Length >= Info.MinAirborneAltitude) + OnAirborneAltitudeReached(); + } + + public (CPos Cell, SubCell SubCell)[] OccupiedCells() + { + return NoCells; + } + + public int MovementSpeed + { + get { return Util.ApplyPercentageModifiers(Info.Speed, speedModifiers); } + } + + public WVec FlyStep(WAngle facing) + { + return FlyStep(MovementSpeed, facing); + } + + public WVec FlyStep(int speed, WAngle facing) + { + var dir = new WVec(0, -1024, 0).Rotate(WRot.FromFacing(facing.Facing)); + return speed * dir / 1024; + } + + protected abstract Activity GetActivity(Actor self, Target target); + public abstract void SetTarget(Target target); + + #region Implement IPositionable + + public bool CanExistInCell(CPos cell) { return true; } + public bool IsLeavingCell(CPos location, SubCell subCell = SubCell.Any) { return false; } // TODO: Handle landing + public bool CanEnterCell(CPos location, Actor ignoreActor = null, BlockedByActor check = BlockedByActor.All) { return true; } + public SubCell GetValidSubCell(SubCell preferred) { return SubCell.Invalid; } + public SubCell GetAvailableSubCell(CPos location, SubCell preferredSubCell = SubCell.Any, Actor ignoreActor = null, BlockedByActor check = BlockedByActor.All) + { + // Does not use any subcell + return SubCell.Invalid; + } + + public void SetCenterPosition(Actor self, WPos pos) { SetPosition(self, pos); } + + // Changes position, but not altitude + public void SetPosition(Actor self, CPos cell, SubCell subCell = SubCell.Any) + { + SetPosition(self, self.World.Map.CenterOfCell(cell) + new WVec(0, 0, CenterPosition.Z)); + } + + public void SetPosition(Actor self, WPos pos) + { + CenterPosition = pos; + + if (!self.IsInWorld) + return; + + self.World.UpdateMaps(self, this); + + var altitude = self.World.Map.DistanceAboveTerrain(CenterPosition); + var isAirborne = altitude.Length >= Info.MinAirborneAltitude; + if (isAirborne && !airborne) + OnAirborneAltitudeReached(); + else if (!isAirborne && airborne) + OnAirborneAltitudeLeft(); + + // NB: This can be called from the constructor before notifyCenterPositionChanged is assigned. + if (requiresVisibilityChecks && notifyCenterPositionChanged != null) + foreach (var n in notifyCenterPositionChanged) + n.CenterPositionChanged(self, 0, 0); + } + + #endregion + + #region Implement IMove + + public Activity MoveTo(CPos cell, int nearEnough = 0, Actor ignoreActor = null, + bool evaluateNearestMovableCell = false, Color? targetLineColor = null) + { + return GetActivity(self, Target.FromCell(self.World, cell)); + } + + public Activity MoveWithinRange(in Target target, WDist range, + WPos? initialTargetPosition = null, Color? targetLineColor = null) + { + return GetActivity(self, target); + } + + public Activity MoveWithinRange(in Target target, WDist minRange, WDist maxRange, + WPos? initialTargetPosition = null, Color? targetLineColor = null) + { + return GetActivity(self, target); + } + + public Activity MoveFollow(Actor self, in Target target, WDist minRange, WDist maxRange, + WPos? initialTargetPosition = null, Color? targetLineColor = null) + { + return null; + } + + public Activity ReturnToCell(Actor self) + { + return null; + } + + public Activity MoveToTarget(Actor self, in Target target, + WPos? initialTargetPosition = null, Color? targetLineColor = null) + { + return GetActivity(self, target); + } + + public Activity MoveIntoTarget(Actor self, in Target target) + { + return GetActivity(self, target); + } + + public Activity MoveOntoTarget(Actor self, in Target target, in WVec offset, + WAngle? facing, Color? targetLineColor = null) + { + return GetActivity(self, target); + } + + public Activity LocalMove(Actor self, WPos fromPos, WPos toPos) + { + return null; + } + + public int EstimatedMoveDuration(Actor self, WPos fromPos, WPos toPos) + { + var speed = MovementSpeed; + return speed > 0 ? (toPos - fromPos).Length / speed : 0; + } + + public CPos NearestMoveableCell(CPos cell) { return cell; } + + // Actors with MissileBase always move + public MovementType CurrentMovementTypes { get { return MovementType.Horizontal | MovementType.Vertical; } set { } } + + public bool CanEnterTargetNow(Actor self, in Target target) + { + // you can never control ballistic missiles anyway + return false; + } + + #endregion + + void INotifyRemovedFromWorld.RemovedFromWorld(Actor self) + { + self.World.RemoveFromMaps(self, this); + OnAirborneAltitudeLeft(); + } + + #region Airborne conditions + + void OnAirborneAltitudeReached() + { + if (airborne) + return; + + airborne = true; + if (airborneToken == Actor.InvalidConditionToken) + airborneToken = self.GrantCondition(Info.AirborneCondition); + } + + void OnAirborneAltitudeLeft() + { + if (!airborne) + return; + + airborne = false; + if (airborneToken != Actor.InvalidConditionToken) + airborneToken = self.RevokeCondition(airborneToken); + } + + #endregion + } +} diff --git a/OpenRA.Mods.CA/Traits/MissileSpawnerMaster.cs b/OpenRA.Mods.CA/Traits/MissileSpawnerMaster.cs index 9a9ee3f029..87cb0aab05 100644 --- a/OpenRA.Mods.CA/Traits/MissileSpawnerMaster.cs +++ b/OpenRA.Mods.CA/Traits/MissileSpawnerMaster.cs @@ -1,10 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -17,7 +17,7 @@ namespace OpenRA.Mods.CA.Traits { [Desc("This actor can spawn missile actors.")] - public class MissileSpawnerMasterInfo : BaseSpawnerMasterInfo + public class MissileSpawnerMasterInfo : SpawnerMasterBaseInfo { [GrantedConditionReference] [Desc("The condition to grant to self right after launching a spawned unit. (Used by V3 to make immobile.)")] @@ -38,14 +38,23 @@ public class MissileSpawnerMasterInfo : BaseSpawnerMasterInfo [GrantedConditionReference] public IEnumerable LinterSpawnContainConditions { get { return SpawnContainConditions.Values; } } + [Desc("Offset at which the exiting actor is spawned relative to the center of the master actor/turret.")] + public readonly WVec SpawnOffset = WVec.Zero; + + [Desc("Which turret (if present) should the missile be launched from.")] + public readonly string Turret = null; + public override object Create(ActorInitializer init) { return new MissileSpawnerMaster(init, this); } } - public class MissileSpawnerMaster : BaseSpawnerMaster, ITick, INotifyAttack + public class MissileSpawnerMaster : SpawnerMasterBase, ITick, INotifyAttack { + readonly BodyOrientation body; readonly Dictionary> spawnContainTokens = new Dictionary>(); public readonly MissileSpawnerMasterInfo MissileSpawnerMasterInfo; readonly Stack loadedTokens = new Stack(); + Turreted turreted; + WAngle spawnFacing; int respawnTicks = 0; @@ -56,11 +65,13 @@ public MissileSpawnerMaster(ActorInitializer init, MissileSpawnerMasterInfo info : base(init, info) { MissileSpawnerMasterInfo = info; + body = init.Self.TraitOrDefault(); } protected override void Created(Actor self) { base.Created(self); + turreted = self.TraitsImplementing().FirstOrDefault(t => t.Name == MissileSpawnerMasterInfo.Turret); // Spawn initial load. var burst = Info.InitialActorCount == -1 ? Info.Actors.Length : Info.InitialActorCount; @@ -83,6 +94,9 @@ void INotifyAttack.Attacking(Actor self, in Target target, Armament a, Barrel ba if (IsTraitDisabled || IsTraitPaused) return; + if (target.Type == TargetType.Invalid) + return; + if (!Info.ArmamentNames.Contains(a.Info.Name)) return; @@ -104,16 +118,22 @@ void INotifyAttack.Attacking(Actor self, in Target target, Armament a, Barrel ba } // Program the trajectory. - var bm = se.Actor.Trait(); - bm.Target = Target.FromPos(target.CenterPosition); + var missileTrait = se.Actor.TraitOrDefault(); + missileTrait.SetTarget(target); - SpawnIntoWorld(self, se.Actor, self.CenterPosition); + var spawnPos = self.CenterPosition; + if (turreted != null && body != null) + spawnPos += turreted.Position(self); + + spawnFacing = (target.CenterPosition - spawnPos).Yaw; + + SpawnIntoWorld(self, se.Actor, spawnPos); Stack spawnContainToken; - if (spawnContainTokens.TryGetValue(a.Info.Name, out spawnContainToken) && spawnContainToken.Any()) + if (spawnContainTokens.TryGetValue(a.Info.Name, out spawnContainToken) && spawnContainToken.Count > 0) self.RevokeCondition(spawnContainToken.Pop()); - if (loadedTokens.Any()) + if (loadedTokens.Count > 0) self.RevokeCondition(loadedTokens.Pop()); // Queue attack order, too. @@ -125,10 +145,10 @@ void INotifyAttack.Attacking(Actor self, in Target target, Armament a, Barrel ba // Set clock so that regen happens. if (respawnTicks <= 0) // Don't interrupt an already running timer! - respawnTicks = Info.RespawnTicks; + respawnTicks = Util.ApplyPercentageModifiers(Info.RespawnTicks, reloadModifiers.Select(rm => rm.GetReloadModifier())); } - BaseSpawnerSlaveEntry GetLaunchable() + SpawnerSlaveBaseEntry GetLaunchable() { foreach (var se in SlaveEntries) if (se.IsValid) @@ -137,7 +157,7 @@ BaseSpawnerSlaveEntry GetLaunchable() return null; } - public override void Replenish(Actor self, BaseSpawnerSlaveEntry entry) + public override void Replenish(Actor self, SpawnerSlaveBaseEntry entry) { base.Replenish(self, entry); @@ -170,20 +190,18 @@ void ITick.Tick(Actor self) } } - public override void SpawnIntoWorld(Actor self, Actor slave, WPos centerPosition) + public override void SpawnIntoWorld(Actor self, Actor slave, WPos pos) { - var exit = self.RandomExitOrDefault(self.World, null); - SetSpawnedFacing(slave, exit); + SetSpawnedFacing(slave, spawnFacing); + + var offset = body != null ? body.LocalToWorld(MissileSpawnerMasterInfo.SpawnOffset.Rotate(WRot.FromYaw(spawnFacing))) : WVec.Zero; self.World.AddFrameEndTask(w => { if (self.IsDead) return; - var spawnOffset = exit == null ? WVec.Zero : exit.Info.SpawnOffset; - slave.Trait().SetVisualPosition(slave, centerPosition + spawnOffset); - - var location = self.World.Map.CellContaining(centerPosition + spawnOffset); + slave.Trait().SetCenterPosition(slave, pos + offset); w.Add(slave); }); diff --git a/OpenRA.Mods.CA/Traits/MissileSpawnerSlave.cs b/OpenRA.Mods.CA/Traits/MissileSpawnerSlave.cs index 6768b46109..1254c1c909 100644 --- a/OpenRA.Mods.CA/Traits/MissileSpawnerSlave.cs +++ b/OpenRA.Mods.CA/Traits/MissileSpawnerSlave.cs @@ -1,37 +1,22 @@ #region Copyright & License Information -/* - * Modded by Cook Green of YR Mod - * Modded by Boolbada of OP Mod. - * Modded from cargo.cs but a lot changed. - * Copyright 2007-2017 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion -using System.Linq; -using OpenRA.Mods.Common.Activities; -using OpenRA.Mods.Common.Traits; -using OpenRA.Traits; - -/* -Works without base engine modification. -However, Mods.Common\Activities\Air\Land.cs is modified to support the air units to land "mid air!" -See landHeight private variable to track the changes. -*/ - namespace OpenRA.Mods.CA.Traits { [Desc("This unit is \"slaved\" to a missile spawner master.")] - public class MissileSpawnerSlaveInfo : BaseSpawnerSlaveInfo + public class MissileSpawnerSlaveInfo : SpawnerSlaveBaseInfo { public override object Create(ActorInitializer init) { return new MissileSpawnerSlave(init, this); } } - public class MissileSpawnerSlave : BaseSpawnerSlave + public class MissileSpawnerSlave : SpawnerSlaveBase { public CarrierSlaveInfo Info { get; set; } diff --git a/OpenRA.Mods.CA/Traits/Modifiers/WithColoredOverlayCA.cs b/OpenRA.Mods.CA/Traits/Modifiers/WithColoredOverlayCA.cs new file mode 100644 index 0000000000..7c8b6479d9 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Modifiers/WithColoredOverlayCA.cs @@ -0,0 +1,114 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.Graphics; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + /// + /// Preview-aware version of WithColoredOverlay that can show in actor previews. + /// Overlays a color tint on the actor's renderables. + /// + [Desc("Display a colored overlay when a timed condition is active. Supports preview rendering.")] + public class WithColoredOverlayCAInfo : ConditionalTraitInfo, IActorPreviewRenderModifierInfo + { + [Desc("Color to overlay.")] + public readonly Color Color = Color.FromArgb(128, 128, 0, 0); + + [Desc("Whether to show this overlay in actor previews (encyclopedia, tooltips, etc).")] + public readonly bool ShowInPreview = false; + + public override object Create(ActorInitializer init) { return new WithColoredOverlayCA(this); } + + public IActorPreviewRenderModifier GetPreviewRenderModifier(WorldRenderer wr, ActorInfo actorInfo, TypeDictionary inits, Color previewColor) + { + // ShowInPreview overrides the condition check - if true, always show in preview + if (!ShowInPreview) + return null; + + return new WithColoredOverlayPreviewModifier(this); + } + } + + public class WithColoredOverlayCA : ConditionalTrait, IRenderModifier + { + readonly float3 tint; + readonly float alpha; + + public WithColoredOverlayCA(WithColoredOverlayCAInfo info) + : base(info) + { + tint = new float3(info.Color.R, info.Color.G, info.Color.B) / 255f; + alpha = info.Color.A / 255f; + } + + IEnumerable IRenderModifier.ModifyRender(Actor self, WorldRenderer wr, IEnumerable r) + { + if (IsTraitDisabled) + return r; + + return ModifiedRender(r); + } + + IEnumerable ModifiedRender(IEnumerable r) + { + foreach (var a in r) + { + yield return a; + + if (!a.IsDecoration && a is IModifyableRenderable ma) + yield return ma.WithTint(tint, ma.TintModifiers | TintModifiers.ReplaceColor).WithAlpha(alpha); + } + } + + IEnumerable IRenderModifier.ModifyScreenBounds(Actor self, WorldRenderer wr, IEnumerable bounds) + { + return bounds; + } + } + + /// + /// Preview modifier for WithColoredOverlayCA + /// + sealed class WithColoredOverlayPreviewModifier : IActorPreviewRenderModifier + { + readonly float3 tint; + readonly float alpha; + + public WithColoredOverlayPreviewModifier(WithColoredOverlayCAInfo info) + { + tint = new float3(info.Color.R, info.Color.G, info.Color.B) / 255f; + alpha = info.Color.A / 255f; + } + + public IEnumerable ModifyPreviewRender(WorldRenderer wr, IEnumerable renderables, Rectangle bounds) + { + foreach (var r in renderables.ToList()) + { + yield return r; + + if (r is IModifyableRenderable mr) + { + var currentTintModifiers = mr.TintModifiers; + yield return mr.WithTint(tint, currentTintModifiers | TintModifiers.ReplaceColor) + .WithAlpha(alpha) + .AsDecoration(); + } + } + } + + public void Tick() { } + } +} diff --git a/OpenRA.Mods.CA/Traits/Modifiers/WithPalettedOverlay.cs b/OpenRA.Mods.CA/Traits/Modifiers/WithPalettedOverlay.cs new file mode 100644 index 0000000000..430970d4c1 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Modifiers/WithPalettedOverlay.cs @@ -0,0 +1,130 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using OpenRA.Graphics; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Overlays a copy of each renderable of the actor using the specified palette.", + "Will obscure the underlying renderables if the chosen palette has no transparency.")] + public class WithPalettedOverlayInfo : ConditionalTraitInfo, IActorPreviewRenderModifierInfo + { + [PaletteReference] + [Desc("Palette to use when rendering the overlay")] + public readonly string Palette = "invuln"; + + [Desc("Player relationships that see the overlay.")] + public readonly PlayerRelationship ValidRelationships = PlayerRelationship.Ally | PlayerRelationship.Neutral | PlayerRelationship.Enemy; + + [Desc("Whether the effect is visible through fog.")] + public readonly bool VisibleThroughFog = true; + + [Desc("Whether to show this overlay in actor previews (encyclopedia, tooltips, etc).")] + public readonly bool ShowInPreview = false; + + public override object Create(ActorInitializer init) { return new WithPalettedOverlay(init.Self, this); } + + public IActorPreviewRenderModifier GetPreviewRenderModifier(WorldRenderer wr, ActorInfo actorInfo, TypeDictionary inits, Color previewColor) + { + // ShowInPreview overrides the condition check - if true, always show in preview + if (!ShowInPreview) + return null; + + return new WithPalettedOverlayPreviewModifier(wr, this); + } + } + + public class WithPalettedOverlay : ConditionalTrait, IRenderModifier, INotifyOwnerChanged + { + bool validRelationship; + + public WithPalettedOverlay(Actor self, WithPalettedOverlayInfo info) + : base(info) + { + Update(self); + } + + IEnumerable IRenderModifier.ModifyRender(Actor self, WorldRenderer wr, IEnumerable r) + { + if (IsTraitDisabled) + return r; + + return ModifiedRender(self, wr, r); + } + + IEnumerable ModifiedRender(Actor self, WorldRenderer wr, IEnumerable r) + { + if (IsTraitDisabled) + yield break; + + var palette = string.IsNullOrEmpty(Info.Palette) ? null : wr.Palette(Info.Palette); + + foreach (var a in r) + { + yield return a; + + if (validRelationship && palette != null && !a.IsDecoration && a is IPalettedRenderable && (Info.VisibleThroughFog || !self.World.FogObscures(self.CenterPosition))) + yield return ((IPalettedRenderable)a).WithPalette(palette) + .WithZOffset(a.ZOffset + 1) + .AsDecoration(); + } + } + + IEnumerable IRenderModifier.ModifyScreenBounds(Actor self, WorldRenderer wr, IEnumerable bounds) + { + return bounds; + } + + void INotifyOwnerChanged.OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) + { + Update(self); + } + + void Update(Actor self) + { + var relationship = self.World.RenderPlayer != null ? self.Owner.RelationshipWith(self.World.RenderPlayer) : PlayerRelationship.None; + validRelationship = Info.ValidRelationships.HasRelationship(relationship); + } + } + + /// + /// Preview modifier for WithPalettedOverlay + /// + sealed class WithPalettedOverlayPreviewModifier : IActorPreviewRenderModifier + { + readonly PaletteReference palette; + + public WithPalettedOverlayPreviewModifier(WorldRenderer wr, WithPalettedOverlayInfo info) + { + palette = string.IsNullOrEmpty(info.Palette) ? null : wr.Palette(info.Palette); + } + + public IEnumerable ModifyPreviewRender(WorldRenderer wr, IEnumerable renderables, Rectangle bounds) + { + foreach (var r in renderables) + { + yield return r; + + // For preview rendering, apply palette swap to all paletted renderables + // (unlike in-game where we skip decorations, because the colored overlay used for customising the actor color is a decoration) + if (palette != null && r is IPalettedRenderable pr) + yield return pr.WithPalette(palette) + .WithZOffset(r.ZOffset + 1) + .AsDecoration(); + } + } + + public void Tick() { } + } +} diff --git a/OpenRA.Mods.CA/Traits/MothershipAttackBehaviour.cs b/OpenRA.Mods.CA/Traits/MothershipAttackBehaviour.cs deleted file mode 100644 index 6bc7a97b3f..0000000000 --- a/OpenRA.Mods.CA/Traits/MothershipAttackBehaviour.cs +++ /dev/null @@ -1,101 +0,0 @@ -#region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. - */ -#endregion - -using OpenRA.Mods.Common.Activities; -using OpenRA.Mods.Common.Traits; -using OpenRA.Traits; - -namespace OpenRA.Mods.CA.Traits -{ - [Desc("Attack replaced by force attack if actor is not mobile. Stop on ammo empty.")] - class MothershipAttackBehaviourInfo : ConditionalTraitInfo - { - [Desc("Issue stop command if ammo is empty.")] - public readonly bool StopOnEmpty = true; - - public override object Create(ActorInitializer init) { return new MothershipAttackBehaviour(init, this); } - } - - class MothershipAttackBehaviour : ConditionalTrait, IResolveOrder, ITick, INotifyAttack - { - bool attackStarted; - bool ammoActive; - bool issueStopOrder; - - public MothershipAttackBehaviour(ActorInitializer init, MothershipAttackBehaviourInfo info) - : base(info) - { - attackStarted = false; - ammoActive = false; - issueStopOrder = false; - } - - void IResolveOrder.ResolveOrder(Actor self, Order order) - { - if (IsTraitDisabled) - return; - - if ((order.OrderString == "Attack" || order.OrderString == "ForceAttack") && order.Target.Type == TargetType.Actor) - { - if (order.Target.Actor.TraitOrDefault() != null) - return; - - var target = Target.FromPos(order.Target.Actor.CenterPosition); - self.World.IssueOrder(new Order("ForceAttack", self, target, false, null, null)); - } - } - - void ITick.Tick(Actor self) - { - if (issueStopOrder) - { - var rejectsOrders = false; - foreach (var r in self.TraitsImplementing()) - { - if (!r.IsTraitDisabled) - { - rejectsOrders = true; - break; - } - } - - if (!rejectsOrders) - { - self.World.IssueOrder(new Order("Stop", self, false)); - issueStopOrder = false; - } - } - - if (!Info.StopOnEmpty || !attackStarted) - return; - - var ammoPools = self.TraitsImplementing(); - var ammoCount = 0; - foreach (var ammoPool in ammoPools) - ammoCount += ammoPool.CurrentAmmoCount; - - if (ammoActive && ammoCount == 0 && attackStarted) - { - issueStopOrder = true; - attackStarted = false; - ammoActive = false; - } - else if (ammoCount > 0) - ammoActive = true; - } - - void INotifyAttack.Attacking(Actor self, in Target target, Armament a, Barrel barrel) - { - attackStarted = true; - } - - void INotifyAttack.PreparingAttack(Actor self, in Target target, Armament a, Barrel barrel) { } - } -} diff --git a/OpenRA.Mods.CA/Traits/Multipliers/DamageTypeDamageMultiplier.cs b/OpenRA.Mods.CA/Traits/Multipliers/DamageTypeDamageMultiplier.cs new file mode 100644 index 0000000000..a15afe1174 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Multipliers/DamageTypeDamageMultiplier.cs @@ -0,0 +1,43 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Modifies the damage applied to this actor.", + "Use 0 to make actor invulnerable.")] + public class DamageTypeDamageMultiplierInfo : ConditionalTraitInfo + { + [FieldLoader.Require] + [Desc("Percentage modifier to apply.")] + public readonly int Modifier = 100; + + [FieldLoader.Require] + [Desc("DamageType(s) that trigger the modifier.")] + public readonly BitSet DamageTypes = default(BitSet); + + public override object Create(ActorInitializer init) { return new DamageTypeDamageMultiplier(this); } + } + + public class DamageTypeDamageMultiplier : ConditionalTrait, IDamageModifier + { + public DamageTypeDamageMultiplier(DamageTypeDamageMultiplierInfo info) + : base(info) { } + + int IDamageModifier.GetDamageModifier(Actor attacker, Damage damage) + { + var validDamageType = !Info.DamageTypes.IsEmpty && damage.DamageTypes.Overlaps(Info.DamageTypes); + return IsTraitDisabled || !validDamageType ? 100 : Info.Modifier; + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Multipliers/DynamicSpeedMultiplier.cs b/OpenRA.Mods.CA/Traits/Multipliers/DynamicSpeedMultiplier.cs index f01ff0c190..687b06952a 100644 --- a/OpenRA.Mods.CA/Traits/Multipliers/DynamicSpeedMultiplier.cs +++ b/OpenRA.Mods.CA/Traits/Multipliers/DynamicSpeedMultiplier.cs @@ -1,11 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion diff --git a/OpenRA.Mods.CA/Traits/Multipliers/FlatHealthDamageMultiplier.cs b/OpenRA.Mods.CA/Traits/Multipliers/FlatHealthDamageMultiplier.cs new file mode 100644 index 0000000000..634bd2f881 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Multipliers/FlatHealthDamageMultiplier.cs @@ -0,0 +1,46 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Modifies the damage taken by the actor to emulate a specified amount of additional health.")] + public class FlatHealthDamageMultiplierInfo : ConditionalTraitInfo + { + [Desc("Extra health to emulate.")] + public readonly int HP = 1000; + + public override object Create(ActorInitializer init) { return new FlatHealthDamageMultiplier(init.Self, this); } + } + + public class FlatHealthDamageMultiplier : ConditionalTrait, IDamageModifier + { + readonly int modifier; + + public FlatHealthDamageMultiplier(Actor self, FlatHealthDamageMultiplierInfo info) + : base(info) + { + modifier = 100; + var healthInfo = self.Info.TraitInfoOrDefault(); + + if (healthInfo == null) + return; + + modifier = (int)((float)healthInfo.HP / (healthInfo.HP + info.HP) * 100); + } + + int IDamageModifier.GetDamageModifier(Actor attacker, Damage damage) + { + return IsTraitDisabled ? 100 : modifier; + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Multipliers/HealthCapDamageMultiplier.cs b/OpenRA.Mods.CA/Traits/Multipliers/HealthCapDamageMultiplier.cs new file mode 100644 index 0000000000..73c8b97c86 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Multipliers/HealthCapDamageMultiplier.cs @@ -0,0 +1,47 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Modifies the damage taken by the actor to emulate specified maximum health.")] + public class HealthCapDamageMultiplierInfo : ConditionalTraitInfo + { + [Desc("Maximum health to emulate.")] + public readonly int MaxHealthEquivalent = 40000; + + public override object Create(ActorInitializer init) { return new HealthCapDamageMultiplier(init.Self, this); } + } + + public class HealthCapDamageMultiplier : ConditionalTrait, IDamageModifier + { + readonly int modifier; + + public HealthCapDamageMultiplier(Actor self, HealthCapDamageMultiplierInfo info) + : base(info) + { + modifier = 100; + var healthInfo = self.Info.TraitInfoOrDefault(); + + if (healthInfo == null) + return; + + if (healthInfo.HP > info.MaxHealthEquivalent) + modifier = (int)(((float)healthInfo.HP / (float)info.MaxHealthEquivalent) * 100); + } + + int IDamageModifier.GetDamageModifier(Actor attacker, Damage damage) + { + return IsTraitDisabled ? 100 : modifier; + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Multipliers/LayeredDamageMultiplier.cs b/OpenRA.Mods.CA/Traits/Multipliers/LayeredDamageMultiplier.cs new file mode 100644 index 0000000000..8bccfd0c34 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Multipliers/LayeredDamageMultiplier.cs @@ -0,0 +1,101 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Linq; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Gives layered damage reduction to the actor. Layers are removed each time damage is taken.")] + public class LayeredDamageMultiplierInfo : ConditionalTraitInfo + { + [Desc("Layers of damage reduction.")] + public readonly int[] Layers = { 25, 50, 75 }; + + [Desc("Number of ticks to restore a layer.")] + public readonly int LayerRestoreTime = 50; + + [Desc("Minimum damage to trigger the timed damage modifier.")] + public readonly int MinimumDamage = 100; + + [Desc("If true, restoration will be reset on taking any damage.")] + public readonly bool ResetRegenOnDamage = false; + + [Desc("Damage type(s) that are affected by the damage multiplier and consume layers.")] + public readonly BitSet DamageTypes = default(BitSet); + + public override object Create(ActorInitializer init) { return new LayeredDamageMultiplier(this); } + } + + public class LayeredDamageMultiplier : ConditionalTrait, ITick, IDamageModifier, INotifyDamage + { + public new readonly LayeredDamageMultiplierInfo Info; + readonly int maxLayers; + int layersRemaining; + int ticks; + + public LayeredDamageMultiplier(LayeredDamageMultiplierInfo info) + : base(info) + { + Info = info; + maxLayers = layersRemaining = Info.Layers.Count(); + } + + int IDamageModifier.GetDamageModifier(Actor attacker, Damage damage) + { + if (IsTraitDisabled || layersRemaining == 0 || damage.Value < Info.MinimumDamage) + return 100; + + var validDamageType = Info.DamageTypes.IsEmpty || damage.DamageTypes.Overlaps(Info.DamageTypes); + var currentLayer = maxLayers - layersRemaining; + return validDamageType ? Info.Layers[currentLayer] : 100; + } + + void INotifyDamage.Damaged(Actor self, AttackInfo e) + { + if (IsTraitDisabled) + return; + + if (Info.ResetRegenOnDamage && layersRemaining < maxLayers && e.Damage.Value > 0) + ticks = Info.LayerRestoreTime; + + if (layersRemaining == 0 || e.Damage.Value < Info.MinimumDamage) + return; + + if (!Info.DamageTypes.IsEmpty && !e.Damage.DamageTypes.Overlaps(Info.DamageTypes)) + return; + + layersRemaining--; + } + + void ITick.Tick(Actor self) + { + if (IsTraitDisabled) + return; + + if (layersRemaining == maxLayers) + return; + + if (--ticks > 0) + return; + + layersRemaining++; + ticks = Info.LayerRestoreTime; + } + + protected override void TraitEnabled(Actor self) + { + layersRemaining = maxLayers; + ticks = Info.LayerRestoreTime; + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Multipliers/PortableChronoModifier.cs b/OpenRA.Mods.CA/Traits/Multipliers/PortableChronoModifier.cs new file mode 100644 index 0000000000..2019fc3a69 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Multipliers/PortableChronoModifier.cs @@ -0,0 +1,50 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Modifies the range and/or cooldown of PortableChronoCA.")] + public class PortableChronoModifierInfo : ConditionalTraitInfo, Requires + { + [Desc("Percentage modifier to apply.")] + public readonly int RangeModifier = 100; + + [Desc("Percentage modifier to apply.")] + public readonly int CooldownModifier = 100; + + [Desc("Number of extra charges to grant.")] + public readonly int ExtraCharges = 0; + + public override object Create(ActorInitializer init) { return new PortableChronoModifier(this); } + } + + public class PortableChronoModifier : ConditionalTrait, IPortableChronoModifier + { + public PortableChronoModifier(PortableChronoModifierInfo info) + : base(info) { } + + int IPortableChronoModifier.GetCooldownModifier() => IsTraitDisabled ? 100 : Info.CooldownModifier; + int IPortableChronoModifier.GetRangeModifier() => IsTraitDisabled ? 100 : Info.RangeModifier; + int IPortableChronoModifier.GetExtraCharges() => IsTraitDisabled ? 0 : Info.ExtraCharges; + + protected override void TraitEnabled(Actor self) + { + self.Trait().UpdateModifiers(); + } + + protected override void TraitDisabled(Actor self) + { + self.Trait().UpdateModifiers(); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Multipliers/SeedsResourceMultiplier.cs b/OpenRA.Mods.CA/Traits/Multipliers/SeedsResourceMultiplier.cs new file mode 100644 index 0000000000..cde0b3c7c2 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Multipliers/SeedsResourceMultiplier.cs @@ -0,0 +1,32 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Mods.Common.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Modifies the interval between seeding resources.")] + public class SeedsResourceMultiplierInfo : ConditionalTraitInfo + { + [FieldLoader.Require] + [Desc("Percentage modifier to apply.")] + public readonly int Modifier = 100; + + public override object Create(ActorInitializer init) { return new SeedsResourceMultiplier(this); } + } + + public class SeedsResourceMultiplier : ConditionalTrait, ISeedsResourceIntervalModifier + { + public SeedsResourceMultiplier(SeedsResourceMultiplierInfo info) + : base(info) { } + + int ISeedsResourceIntervalModifier.GetModifier() => IsTraitDisabled ? 100 : Info.Modifier; + } +} diff --git a/OpenRA.Mods.CA/Traits/Multipliers/SpeedCapSpeedMultiplier.cs b/OpenRA.Mods.CA/Traits/Multipliers/SpeedCapSpeedMultiplier.cs new file mode 100644 index 0000000000..2479e0b600 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Multipliers/SpeedCapSpeedMultiplier.cs @@ -0,0 +1,59 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Mods.Common.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Modifies the speed of an actor to emulate specified maximum speed.")] + public class SpeedCapSpeedMultiplierInfo : ConditionalTraitInfo + { + [Desc("Maximum speed to emulate.")] + public readonly int MaxSpeed = 100; + + public override object Create(ActorInitializer init) { return new SpeedCapSpeedMultiplier(init.Self, this); } + } + + public class SpeedCapSpeedMultiplier : ConditionalTrait, ISpeedModifier + { + readonly int modifier; + + public SpeedCapSpeedMultiplier(Actor self, SpeedCapSpeedMultiplierInfo info) + : base(info) + { + modifier = 100; + + var aircraftInfo = self.Info.TraitInfoOrDefault(); + if (aircraftInfo != null) + { + modifier = CalculateModifier(aircraftInfo.Speed, info.MaxSpeed); + } + + var mobileInfo = self.Info.TraitInfoOrDefault(); + if (mobileInfo != null) + { + modifier = CalculateModifier(mobileInfo.Speed, info.MaxSpeed); + } + } + + int CalculateModifier(int speed, int maxSpeed) + { + if (speed > maxSpeed) + return (int)(maxSpeed / (float)speed * 100); + + return 100; + } + + int ISpeedModifier.GetSpeedModifier() + { + return IsTraitDisabled ? 100 : modifier; + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Multipliers/TimedDamageMultiplier.cs b/OpenRA.Mods.CA/Traits/Multipliers/TimedDamageMultiplier.cs new file mode 100644 index 0000000000..31b929d330 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Multipliers/TimedDamageMultiplier.cs @@ -0,0 +1,236 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; +using System.Collections.Generic; + +namespace OpenRA.Mods.CA.Traits +{ + public enum TimedDamageMultiplierState + { + Ready, + Draining, + Charging + } + + [Desc("On taking damage, gives damage reduction to the actor for a limited time.", + "When disabled/paused damage will not be modified.", + "When paused the cooldown will continue to tick down.")] + public class TimedDamageMultiplierInfo : PausableConditionalTraitInfo + { + [GrantedConditionReference] + [Desc("The condition to grant.")] + public readonly string ActiveCondition = null; + + [GrantedConditionReference] + [Desc("The condition to grant.")] + public readonly string ChargingCondition = null; + + [Desc("Number of ticks to wait before revoking the condition.")] + public readonly int Duration = 50; + + [Desc("Number of ticks to wait after condition expires before reactivating.")] + public readonly int ChargeTime = 50; + + [Desc("Percentage damage modifier.")] + public readonly int Modifier = 50; + + [Desc("Minimum damage to trigger the timed damage modifier.")] + public readonly int MinimumDamage = 100; + + [Desc("Play a randomly selected sound from this list when deploying.")] + public readonly string ActivateSound = null; + + [Desc("Play a randomly selected sound from this list when undeploying.")] + public readonly string DeactivateSound = null; + + [Desc("If true, charging will be reset on taking any damage.")] + public readonly bool ResetChargingOnDamage = false; + + [Desc("If true, charge time will be 1 tick per ScaleChargeTimeWithDamageAmount points of damage.", + "ChargeTime will be ignored.")] + public readonly bool ScaleChargeTimeWithDamage = false; + + [Desc("If ScaleChargeTimeWithDamage is true, the amount of damage required to add 1 tick of charging time.")] + public readonly int ScaleChargeTimeWithDamageAmount = 10; + + [Desc("Damage type(s) that trigger and are affected by the damage multiplier.")] + public readonly BitSet DamageTypes = default(BitSet); + + public readonly bool GrantConditionWhenReady = false; + public readonly bool ShowSelectionBar = true; + public readonly bool ShowSelectionBarWhenReady = false; + public readonly Color DrainingColor = Color.LightCyan; + public readonly Color ChargingColor = Color.Cyan; + + public override object Create(ActorInitializer init) { return new TimedDamageMultiplier(this, init.Self); } + } + + public class TimedDamageMultiplier : PausableConditionalTrait, ITick, IDamageModifier, INotifyDamage, ISelectionBar + { + public new readonly TimedDamageMultiplierInfo Info; + public int Ticks { get; private set; } + int token = Actor.InvalidConditionToken; + TimedDamageMultiplierState state; + int currentChargeTime; + + public TimedDamageMultiplier(TimedDamageMultiplierInfo info, Actor self) + : base(info) + { + Info = info; + state = TimedDamageMultiplierState.Ready; + } + + int IDamageModifier.GetDamageModifier(Actor attacker, Damage damage) + { + if (IsTraitDisabled || IsTraitPaused || state == TimedDamageMultiplierState.Charging) + return 100; + + var validDamage = damage.Value >= Info.MinimumDamage && (Info.DamageTypes.IsEmpty || damage.DamageTypes.Overlaps(Info.DamageTypes)); + return validDamage ? Info.Modifier : 100; + } + + static int RemovePercentageModifiers(int number, IEnumerable percentages) + { + var a = (decimal)number; + foreach (var p in percentages) + a /= p / 100m; + + return (int)a; + } + + int GetChargeTime(int damagePrevented) + { + if (Info.ScaleChargeTimeWithDamage) + return damagePrevented / Info.ScaleChargeTimeWithDamageAmount; + + return Info.ChargeTime; + } + + void INotifyDamage.Damaged(Actor self, AttackInfo e) + { + if (IsTraitDisabled) + return; + + if (e.Damage.Value < Info.MinimumDamage || (!Info.DamageTypes.IsEmpty && !e.Damage.DamageTypes.Overlaps(Info.DamageTypes))) + return; + + if (Info.ResetChargingOnDamage && state == TimedDamageMultiplierState.Charging) + Ticks = currentChargeTime; + + if (IsTraitPaused) + return; + + if (state != TimedDamageMultiplierState.Ready) + return; + + state = TimedDamageMultiplierState.Draining; + Ticks = Info.Duration; + + var unmodifiedDamage = RemovePercentageModifiers(e.Damage.Value, new[] { Info.Modifier }); + var damagePrevented = unmodifiedDamage - e.Damage.Value; + + currentChargeTime = GetChargeTime(damagePrevented); + + GrantActiveCondition(self); + + if (Info.ActivateSound != null) + Game.Sound.Play(SoundType.World, Info.ActivateSound, self.CenterPosition); + } + + void GrantActiveCondition(Actor self) + { + if (token == Actor.InvalidConditionToken && Info.ActiveCondition != null) + token = self.GrantCondition(Info.ActiveCondition); + } + + void GrantChargingCondition(Actor self) + { + if (token == Actor.InvalidConditionToken && Info.ChargingCondition != null) + token = self.GrantCondition(Info.ChargingCondition); + } + + void RevokeCondition(Actor self) + { + if (token != Actor.InvalidConditionToken) + token = self.RevokeCondition(token); + } + + void ITick.Tick(Actor self) + { + if (IsTraitDisabled) + return; + + if (state == TimedDamageMultiplierState.Ready) + { + if (Info.GrantConditionWhenReady) + GrantActiveCondition(self); + + return; + } + + if (--Ticks > 0) + return; + + if (state == TimedDamageMultiplierState.Draining) + { + state = TimedDamageMultiplierState.Charging; + Ticks = currentChargeTime; + RevokeCondition(self); + GrantChargingCondition(self); + + if (Info.DeactivateSound != null) + Game.Sound.Play(SoundType.World, Info.DeactivateSound, self.CenterPosition); + } + else if (state == TimedDamageMultiplierState.Charging) + { + state = TimedDamageMultiplierState.Ready; + Ticks = Info.Duration; + RevokeCondition(self); + + if (Info.GrantConditionWhenReady) + GrantActiveCondition(self); + } + } + + protected override void TraitDisabled(Actor self) + { + state = TimedDamageMultiplierState.Ready; + Ticks = Info.Duration; + RevokeCondition(self); + } + + float ISelectionBar.GetValue() + { + if (!Info.ShowSelectionBar || IsTraitDisabled) + return 0f; + + if (!Info.ShowSelectionBarWhenReady && state == TimedDamageMultiplierState.Ready) + return 0f; + + if (state == TimedDamageMultiplierState.Ready) + return 1f; + + if (state == TimedDamageMultiplierState.Draining) + return (float)Ticks / Info.Duration; + + if (state == TimedDamageMultiplierState.Charging) + return (float)(currentChargeTime - Ticks) / currentChargeTime; + + return 0f; + } + + bool ISelectionBar.DisplayWhenEmpty { get { return false; } } + + Color ISelectionBar.GetColor() { return state == TimedDamageMultiplierState.Draining ? Info.DrainingColor : Info.ChargingColor; } + } +} diff --git a/OpenRA.Mods.CA/Traits/Multipliers/ValueScalingFirepowerMultiplier.cs b/OpenRA.Mods.CA/Traits/Multipliers/ValueScalingFirepowerMultiplier.cs new file mode 100644 index 0000000000..4b31d78d18 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Multipliers/ValueScalingFirepowerMultiplier.cs @@ -0,0 +1,71 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Mods.Common.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Modifies the firepower of a given actor according to its value.")] + public class ValueScalingFirepowerMultiplierInfo : ConditionalTraitInfo + { + [Desc("Minimum value in the range.")] + public readonly int MinValue = 1000; + + [Desc("Maximum value in the range.")] + public readonly int MaxValue = 2000; + + [Desc("Firepower multiplier applied at the minimum value.")] + public readonly int MinValueModifier = 100; + + [Desc("Firepower multiplier applied at the maximum value.")] + public readonly int MaxValueModifier = 200; + + public override object Create(ActorInitializer init) { return new ValueScalingFirepowerMultiplier(init.Self, this); } + } + + public class ValueScalingFirepowerMultiplier : ConditionalTrait, IFirepowerModifier + { + readonly int modifier; + + public ValueScalingFirepowerMultiplier(Actor self, ValueScalingFirepowerMultiplierInfo info) + : base(info) + { + modifier = 100; + var valuedInfo = self.Info.TraitInfoOrDefault(); + if (valuedInfo == null) + return; + + var value = valuedInfo.Cost; + + if (info.MinValue == info.MaxValue) + { + modifier = value == info.MinValue ? info.MinValueModifier : 100; + } + else + { + var valueRange = info.MaxValue - info.MinValue; + var modifierRange = info.MaxValueModifier - info.MinValueModifier; + var valueOffset = value - info.MinValue; + + if (value <= info.MinValue) + modifier = info.MinValueModifier; + else if (value >= info.MaxValue) + modifier = info.MaxValueModifier; + else + modifier = info.MinValueModifier + modifierRange * valueOffset / valueRange; + } + } + + int IFirepowerModifier.GetFirepowerModifier() + { + return IsTraitDisabled ? 100 : modifier; + } + } +} diff --git a/OpenRA.Mods.CA/Traits/NotificationOnDamage.cs b/OpenRA.Mods.CA/Traits/NotificationOnDamage.cs new file mode 100644 index 0000000000..a94cf3c316 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/NotificationOnDamage.cs @@ -0,0 +1,98 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Plays an audio notification and shows a radar ping when actor is damaged.")] + public class NotificationOnDamageInfo : TraitInfo + { + [Desc("The type of notification (interval shared by all notifications of the same type).")] + [FieldLoader.Require] + public readonly string Type = null; + + [Desc("Minimum duration (in milliseconds) between notification events.")] + public readonly int NotifyInterval = 30000; + + public readonly Color RadarPingColor = Color.Red; + + [Desc("Length of time (in ticks) to display a location ping in the minimap.")] + public readonly int RadarPingDuration = 250; + + [Desc("Minimum amount of damage required to trigger notification.")] + public readonly int MinimumDamage = 0; + + [NotificationReference("Speech")] + [Desc("Speech notification type to play.")] + public readonly string Notification = null; + + [Desc("Text notification to display.")] + public string TextNotification = null; + + public override object Create(ActorInitializer init) { return new NotificationOnDamage(init.Self, this); } + } + + public class NotificationOnDamage : INotifyDamage, INotifyOwnerChanged, INotifyCreated, INotifyDamageStateChanged + { + readonly RadarPings radarPings; + readonly NotificationOnDamageInfo info; + NotificationManager notificationManager; + + public NotificationOnDamage(Actor self, NotificationOnDamageInfo info) + { + radarPings = self.World.WorldActor.TraitOrDefault(); + this.info = info; + } + + void INotifyCreated.Created(Actor self) + { + notificationManager = self.Owner.PlayerActor.Trait(); + } + + void INotifyOwnerChanged.OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) + { + notificationManager = newOwner.PlayerActor.Trait(); + } + + void INotifyDamageStateChanged.DamageStateChanged(Actor self, AttackInfo e) + { + if (e.PreviousDamageState < e.DamageState && e.DamageState != DamageState.Dead && e.PreviousDamageState != DamageState.Undamaged) + Notify(self, e); + } + + void INotifyDamage.Damaged(Actor self, AttackInfo e) + { + if (e.Damage.Value < info.MinimumDamage) + return; + + Notify(self, e); + } + + private void Notify(Actor self, AttackInfo e) + { + // Don't track self-damage + if (e.Attacker != null && e.Attacker.Owner == self.Owner) + return; + + if (Game.RunTime > notificationManager.GetLastNotificationTime(info.Type) + info.NotifyInterval) + { + Game.Sound.PlayNotification(self.World.Map.Rules, self.Owner, "Speech", info.Notification, self.Owner.Faction.InternalName); + TextNotificationsManager.AddTransientLine(self.Owner, info.TextNotification); + + radarPings?.Add(() => self.Owner.IsAlliedWith(self.World.RenderPlayer), self.CenterPosition, info.RadarPingColor, info.RadarPingDuration); + + notificationManager.SetLastNotificationTime(info.Type, Game.RunTime); + } + } + } +} diff --git a/OpenRA.Mods.CA/Traits/PaletteEffects/CloakPaletteEffectCA.cs b/OpenRA.Mods.CA/Traits/PaletteEffects/CloakPaletteEffectCA.cs new file mode 100644 index 0000000000..0d38cc7f41 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/PaletteEffects/CloakPaletteEffectCA.cs @@ -0,0 +1,79 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.Graphics; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [TraitLocation(SystemActors.World | SystemActors.EditorWorld)] + public class CloakPaletteEffectCAInfo : TraitInfo + { + [Desc("Palette to apply cloak effect to.")] + [PaletteReference] + public readonly string Palette = "cloak"; + + public readonly int[] SkipIndexes = new int[] { 0, 4 }; + + public readonly int[] EraseIndexes = new int[] { }; + + public override object Create(ActorInitializer init) { return new CloakPaletteEffectCA(init, this); } + } + + public class CloakPaletteEffectCA : IPaletteModifier, ITick + { + float t = 0; + readonly CloakPaletteEffectCAInfo info; + + readonly Color[] colors = + { + Color.FromLinear(10, 0 / 255f, 0 / 255f, 0 / 255f), + Color.FromLinear(20, 0 / 255f, 0 / 255f, 0 / 255f), + Color.FromLinear(30, 0 / 255f, 0 / 255f, 0 / 255f), + Color.FromLinear(40, 0 / 255f, 0 / 255f, 0 / 255f) + }; + + public CloakPaletteEffectCA(ActorInitializer init, CloakPaletteEffectCAInfo info) + { + this.info = info; + } + + void IPaletteModifier.AdjustPalette(IReadOnlyDictionary b) + { + var i = (int)t; + var p = b[info.Palette]; + + for (var idx = 0; idx < 255; idx += 16) + { + for (var j = 0; j < colors.Length; j++) + { + var k = (i + j) % 16 + idx; + + if (info.SkipIndexes.Contains(k)) + continue; + + p.SetColor(k, colors[j]); + } + } + + foreach (var idx in info.EraseIndexes) + p.SetColor(idx, Color.FromArgb(0, 0, 0, 0)); + } + + void ITick.Tick(Actor self) + { + t += 0.5f; + if (t >= 256) t = 0; + } + } +} diff --git a/OpenRA.Mods.CA/Traits/PaletteEffects/PulsingPaletteEffect.cs b/OpenRA.Mods.CA/Traits/PaletteEffects/PulsingPaletteEffect.cs new file mode 100644 index 0000000000..2ffc658582 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/PaletteEffects/PulsingPaletteEffect.cs @@ -0,0 +1,111 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using OpenRA.Graphics; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [TraitLocation(SystemActors.World | SystemActors.EditorWorld)] + [Desc("Applies a pulsing effect to a specified palette.")] + public class PulsingPaletteEffectInfo : TraitInfo + { + [Desc("The palette to apply this effect to.")] + [PaletteReference] + [FieldLoader.Require] + public readonly string PaletteName; + + [Desc("Start colour.")] + [FieldLoader.Require] + public readonly Color StartColor; + + [Desc("End colour.")] + [FieldLoader.Require] + public readonly Color EndColor; + + [Desc("Number of ticks to pulse before reversing.")] + public readonly int PulseDuration = 25; + + [Desc("Number of ticks to wait on start/end colours.")] + public readonly int PulseDelay = 0; + + public readonly int? ShadowIndex = 4; + + public override object Create(ActorInitializer init) { return new PulsingPaletteEffect(this); } + } + + public class PulsingPaletteEffect : IPaletteModifier, ITick, ITickRender + { + readonly PulsingPaletteEffectInfo info; + + int ticks; + bool incrementing; + + int redDiff; + int greenDiff; + int blueDiff; + int alphaDiff; + + public PulsingPaletteEffect(PulsingPaletteEffectInfo info) + { + this.info = info; + ticks = 0; + incrementing = true; + + redDiff = (info.EndColor.R - info.StartColor.R) / info.PulseDuration; + greenDiff = (info.EndColor.G - info.StartColor.G) / info.PulseDuration; + blueDiff = (info.EndColor.B - info.StartColor.B) / info.PulseDuration; + alphaDiff = (info.EndColor.A - info.StartColor.A) / info.PulseDuration; + } + + void Advance() + { + if (incrementing) + ticks++; + else + ticks--; + + if (ticks == info.PulseDuration + (info.PulseDelay * 2) || ticks == 0) + incrementing = !incrementing; + } + + public void AdjustPalette(IReadOnlyDictionary b) + { + var pulseTick = (ticks - info.PulseDelay).Clamp(0, info.PulseDuration); + + var red = (info.StartColor.R + (redDiff * pulseTick)).Clamp(0, 255); + var green = (info.StartColor.G + (greenDiff * pulseTick)).Clamp(0, 255); + var blue = (info.StartColor.B + (blueDiff * pulseTick)).Clamp(0, 255); + var alpha = (info.StartColor.A + (alphaDiff * pulseTick)).Clamp(0, 255); + + var p = b[info.PaletteName]; + + for (int j = 1; j < Palette.Size; j++) + { + if (info.ShadowIndex != null && info.ShadowIndex == j) + continue; + + var color = Color.FromLinear((byte)alpha, red / 255f, green / 255f, blue / 255f); + p.SetColor(j, color); + } + } + + void ITick.Tick(Actor self) { Advance(); } + + void ITickRender.TickRender(WorldRenderer wr, Actor self) + { + // Continue visual-only palette animation while the game is paused. + if (self.World.Paused) + Advance(); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/WeatherPaletteEffect.cs b/OpenRA.Mods.CA/Traits/PaletteEffects/WeatherPaletteEffect.cs similarity index 85% rename from OpenRA.Mods.CA/Traits/WeatherPaletteEffect.cs rename to OpenRA.Mods.CA/Traits/PaletteEffects/WeatherPaletteEffect.cs index bd41c051e8..b548bc9945 100644 --- a/OpenRA.Mods.CA/Traits/WeatherPaletteEffect.cs +++ b/OpenRA.Mods.CA/Traits/PaletteEffects/WeatherPaletteEffect.cs @@ -1,14 +1,14 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion +using System.Collections.Generic; using System.Linq; using OpenRA.Graphics; using OpenRA.Traits; diff --git a/OpenRA.Mods.CA/Traits/Palettes/EncyclopediaColorPalette.cs b/OpenRA.Mods.CA/Traits/Palettes/EncyclopediaColorPalette.cs new file mode 100644 index 0000000000..1a2590ac7b --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Palettes/EncyclopediaColorPalette.cs @@ -0,0 +1,108 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using OpenRA.Graphics; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [TraitLocation(SystemActors.World | SystemActors.EditorWorld)] + [Desc("Create an encyclopedia preview palette that can be dynamically updated with arbitrary colors.")] + public class EncyclopediaColorPaletteInfo : TraitInfo + { + [PaletteDefinition] + [FieldLoader.Require] + [Desc("Internal palette name.")] + public readonly string Name = null; + + [PaletteReference] + [FieldLoader.Require] + [Desc("The name of the palette to base off.")] + public readonly string BasePalette = null; + + [FieldLoader.Require] + [Desc("Remap these indices to the specified color.")] + public readonly int[] RemapIndex = Array.Empty(); + + [Desc("Allow palette modifiers to change the palette.")] + public readonly bool AllowModifiers = true; + + [Desc("Lowers brightness range.")] + public readonly float Ramp = 0.125f; + + [Desc("Default color to use.")] + public readonly Color DefaultColor = Color.White; + + public override object Create(ActorInitializer init) { return new EncyclopediaColorPalette(this); } + } + + public class EncyclopediaColorPalette : ILoadsPalettes, ITickRender + { + readonly EncyclopediaColorPaletteInfo info; + Color currentColor; + + // Static color that can be set from anywhere (e.g., encyclopedia logic) + static Color requestedColor = Color.White; + + public EncyclopediaColorPalette(EncyclopediaColorPaletteInfo info) + { + this.info = info; + currentColor = info.DefaultColor; + requestedColor = info.DefaultColor; + } + + /// + /// Sets the encyclopedia preview color. This will be applied on the next render tick. + /// + public static void SetPreviewColor(Color color) + { + requestedColor = color; + } + + void ILoadsPalettes.LoadPalettes(WorldRenderer wr) + { + currentColor = requestedColor; + var pal = CreateRemappedPalette(wr, currentColor); + wr.AddPalette(info.Name, new ImmutablePalette(pal)); + } + + void ITickRender.TickRender(WorldRenderer wr, Actor self) + { + if (currentColor == requestedColor) + return; + + currentColor = requestedColor; + var pal = CreateRemappedPalette(wr, currentColor); + wr.ReplacePalette(info.Name, new ImmutablePalette(pal)); + } + + MutablePalette CreateRemappedPalette(WorldRenderer wr, Color color) + { + var pal = new MutablePalette(wr.Palette(info.BasePalette).Palette); + var r = info.Ramp; + + foreach (var i in info.RemapIndex) + { + var bw = (float)(((pal[i] & 0xff) + ((pal[i] >> 8) & 0xff) + ((pal[i] >> 16) & 0xff)) / 3) / 0xff - r; + if (bw < 0) + bw = 0; + + var dstR = bw > .5 ? 1 - (1 - 2 * (bw - .5)) * (1 - (float)color.R / 0xff) : 2 * bw * ((float)color.R / 0xff); + var dstG = bw > .5 ? 1 - (1 - 2 * (bw - .5)) * (1 - (float)color.G / 0xff) : 2 * bw * ((float)color.G / 0xff); + var dstB = bw > .5 ? 1 - (1 - 2 * (bw - .5)) * (1 - (float)color.B / 0xff) : 2 * bw * ((float)color.B / 0xff); + pal[i] = (pal[i] & 0xff000000) | ((uint)(dstR * 0xff) << 16) | ((uint)(dstG * 0xff) << 8) | (uint)(dstB * 0xff); + } + + return pal; + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Palettes/OverlayColorPickerPalette.cs b/OpenRA.Mods.CA/Traits/Palettes/OverlayColorPickerPalette.cs new file mode 100644 index 0000000000..431a12bb80 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Palettes/OverlayColorPickerPalette.cs @@ -0,0 +1,114 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using OpenRA.Graphics; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [TraitLocation(SystemActors.World | SystemActors.EditorWorld)] + [Desc("Create a color picker palette from another palette, using the overlay blend mode which increases contrast.")] + class OverlayColorPickerPaletteInfo : TraitInfo + { + [PaletteDefinition] + [FieldLoader.Require] + [Desc("Internal palette name.")] + public readonly string Name = null; + + [PaletteReference] + [FieldLoader.Require] + [Desc("The name of the palette to base off.")] + public readonly string BasePalette = null; + + [FieldLoader.Require] + [Desc("Remap these indices to player colors.")] + public readonly int[] RemapIndex = Array.Empty(); + + [Desc("Allow palette modifiers to change the palette.")] + public readonly bool AllowModifiers = true; + + [Desc("Lowers brightness range.")] + public readonly float Ramp = 0.125f; + + public override object Create(ActorInitializer init) { return new OverlayColorPickerPalette(this); } + } + + class OverlayColorPickerPalette : ILoadsPalettes, IProvidesAssetBrowserColorPickerPalettes, ITickRender + { + readonly OverlayColorPickerPaletteInfo info; + Color color; + Color preferredColor; + + public OverlayColorPickerPalette(OverlayColorPickerPaletteInfo info) + { + this.info = info; + + // All users need to use the same TraitInfo instance, chosen as the default mod rules + var colorManager = Game.ModData.DefaultRules.Actors[SystemActors.World].TraitInfo(); + colorManager.OnColorPickerColorUpdate += c => preferredColor = c; + preferredColor = Game.Settings.Player.Color; + } + + void ILoadsPalettes.LoadPalettes(WorldRenderer wr) + { + color = preferredColor; + var pal = new MutablePalette(wr.Palette(info.BasePalette).Palette); + var r = info.Ramp; + + foreach (var i in info.RemapIndex) + { + var bw = (float)(((pal[i] & 0xff) + ((pal[i] >> 8) & 0xff) + ((pal[i] >> 16) & 0xff)) / 3) / 0xff - r; + if (bw < 0) + { + bw = 0; + } + + var dstR = bw > .5 ? 1 - (1 - 2 * (bw - .5)) * (1 - (float)color.R / 0xff) : 2 * bw * ((float)color.R / 0xff); + var dstG = bw > .5 ? 1 - (1 - 2 * (bw - .5)) * (1 - (float)color.G / 0xff) : 2 * bw * ((float)color.G / 0xff); + var dstB = bw > .5 ? 1 - (1 - 2 * (bw - .5)) * (1 - (float)color.B / 0xff) : 2 * bw * ((float)color.B / 0xff); + pal[i] = (pal[i] & 0xff000000) | ((uint)(dstR * 0xff) << 16) | ((uint)(dstG * 0xff) << 8) | (uint)(dstB * 0xff); + } + + wr.AddPalette(info.Name, new ImmutablePalette(pal)); + } + + IEnumerable IProvidesAssetBrowserColorPickerPalettes.ColorPickerPaletteNames { get { yield return info.Name; } } + + void ITickRender.TickRender(WorldRenderer wr, Actor self) + { + if (color == preferredColor) + return; + + color = preferredColor; + var pal = new MutablePalette(wr.Palette(info.BasePalette).Palette); + var r = info.Ramp; + + foreach (var i in info.RemapIndex) + { + var bw = (float)(((pal[i] & 0xff) + ((pal[i] >> 8) & 0xff) + ((pal[i] >> 16) & 0xff)) / 3) / 0xff - r; + if (bw < 0) + { + bw = 0; + } + + var dstR = bw > .5 ? 1 - (1 - 2 * (bw - .5)) * (1 - (float)color.R / 0xff) : 2 * bw * ((float)color.R / 0xff); + var dstG = bw > .5 ? 1 - (1 - 2 * (bw - .5)) * (1 - (float)color.G / 0xff) : 2 * bw * ((float)color.G / 0xff); + var dstB = bw > .5 ? 1 - (1 - 2 * (bw - .5)) * (1 - (float)color.B / 0xff) : 2 * bw * ((float)color.B / 0xff); + pal[i] = (pal[i] & 0xff000000) | ((uint)(dstR * 0xff) << 16) | ((uint)(dstG * 0xff) << 8) | (uint)(dstB * 0xff); + } + + wr.ReplacePalette(info.Name, new ImmutablePalette(pal)); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Palettes/OverlayPlayerColorPalette.cs b/OpenRA.Mods.CA/Traits/Palettes/OverlayPlayerColorPalette.cs new file mode 100644 index 0000000000..6871780870 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Palettes/OverlayPlayerColorPalette.cs @@ -0,0 +1,99 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.Graphics; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [TraitLocation(SystemActors.World | SystemActors.EditorWorld)] + [Desc("Variant of the PlayerColorPalette using the overlay blend mode which increases contrast.")] + public class OverlayPlayerColorPaletteInfo : TraitInfo + { + [Desc("The name of the palette to base off.")] + [PaletteReference] + public readonly string BasePalette = null; + + [Desc("The prefix for the resulting player palettes")] + [PaletteDefinition(true)] + public readonly string BaseName = "player"; + + [Desc("Remap these indices to player colors.")] + public readonly int[] RemapIndex = { }; + + [Desc("Allow palette modifiers to change the palette.")] + public readonly bool AllowModifiers = true; + + [Desc("Lowers brightness range.")] + public readonly float Ramp = 0.125f; + + [Desc("If player name is set here, remap to these colours instead.")] + public readonly Dictionary PlayerColors; + + [Desc("If faction is set here, remap to these colors instead.")] + public readonly Dictionary FactionColors; + + [Desc("Players listed here will have their colors determined by their faction color if set.")] + public readonly HashSet FactionColorPlayers = new(); + + public override object Create(ActorInitializer init) { return new OverlayPlayerColorPalette(init, this); } + } + + public class OverlayPlayerColorPalette : ILoadsPlayerPalettes + { + readonly OverlayPlayerColorPaletteInfo info; + readonly World world; + + public OverlayPlayerColorPalette(ActorInitializer init, OverlayPlayerColorPaletteInfo info) + { + this.info = info; + world = init.Self.World; + } + + public void LoadPlayerPalettes(WorldRenderer wr, string playerName, Color c, bool replaceExisting) + { + var basePalette = wr.Palette(info.BasePalette).Palette; + var player = world.Players.FirstOrDefault(p => p.InternalName == playerName); + + if (player != null + && info.FactionColors != null + && info.FactionColors.TryGetValue(player.Faction.InternalName, out var factionColor) + && (!info.FactionColorPlayers.Any() || info.FactionColorPlayers.Contains(playerName))) + { + c = factionColor; + } + + if (info.PlayerColors != null && info.PlayerColors.TryGetValue(playerName, out var playerColor)) + c = playerColor; + + var pal = new MutablePalette(basePalette); + var r = info.Ramp; + + foreach (var i in info.RemapIndex) + { + var bw = (float)(((pal[i] & 0xff) + ((pal[i] >> 8) & 0xff) + ((pal[i] >> 16) & 0xff)) / 3) / 0xff - r; + if (bw < 0) + { + bw = 0; + } + + var dstR = bw > .5 ? 1 - (1 - 2 * (bw - .5)) * (1 - (float)c.R / 0xff) : 2 * bw * ((float)c.R / 0xff); + var dstG = bw > .5 ? 1 - (1 - 2 * (bw - .5)) * (1 - (float)c.G / 0xff) : 2 * bw * ((float)c.G / 0xff); + var dstB = bw > .5 ? 1 - (1 - 2 * (bw - .5)) * (1 - (float)c.B / 0xff) : 2 * bw * ((float)c.B / 0xff); + pal[i] = (pal[i] & 0xff000000) | ((uint)(dstR * 0xff) << 16) | ((uint)(dstG * 0xff) << 8) | (uint)(dstB * 0xff); + } + + wr.AddPalette(info.BaseName + playerName, new ImmutablePalette(pal), info.AllowModifiers, replaceExisting); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/PassengerBlocked.cs b/OpenRA.Mods.CA/Traits/PassengerBlocked.cs new file mode 100644 index 0000000000..51f2906fe0 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/PassengerBlocked.cs @@ -0,0 +1,102 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Attach to a transport to override the unload order.")] + class PassengerBlockedInfo : ConditionalTraitInfo, Requires + { + [CursorReference] + [Desc("Cursor to display when hovering over the transport.")] + public readonly string Cursor = "enter-blocked"; + + public override object Create(ActorInitializer init) { return new PassengerBlocked(init, this); } + } + + class PassengerBlocked : ConditionalTrait, IIssueOrder, IResolveOrder + { + public PassengerBlocked(ActorInitializer init, PassengerBlockedInfo info) + : base(info) { } + + IEnumerable IIssueOrder.Orders + { + get + { + if (IsTraitDisabled) + yield break; + + yield return new PassengerBlockedOrderTargeter(Info.Cursor); + } + } + + Order IIssueOrder.IssueOrder(Actor self, IOrderTargeter order, in Target target, bool queued) + { + if (order is PassengerBlockedOrderTargeter) + return new Order(order.OrderID, self, target, queued); + + return null; + } + + void IResolveOrder.ResolveOrder(Actor self, Order order) + { + if (order.OrderString == "PassengerBlocked") + { + // do nothing + } + } + + class PassengerBlockedOrderTargeter : IOrderTargeter + { + readonly string cursor; + + public PassengerBlockedOrderTargeter(string cursor) + { + this.cursor = cursor; + } + + public string OrderID => "PassengerBlocked"; + public int OrderPriority => 100; + public bool TargetOverridesSelection(Actor self, in Target target, List actorsAt, CPos xy, TargetModifiers modifiers) { return true; } + + bool CanTargetActor(Actor self, in Target target, ref TargetModifiers modifiers, ref string cursor) + { + if (modifiers.HasModifier(TargetModifiers.ForceAttack)) + return false; + + if (!target.Actor.Owner.IsAlliedWith(self.Owner)) + return false; + + var cargoBlocked = target.Actor.TraitOrDefault(); + if (cargoBlocked == null || cargoBlocked.IsTraitDisabled) + return false; + + cursor = this.cursor; + return true; + } + + public bool CanTarget(Actor self, in Target target, ref TargetModifiers modifiers, ref string cursor) + { + switch (target.Type) + { + case TargetType.Actor: + return CanTargetActor(self, target, ref modifiers, ref cursor); + default: + return false; + } + } + + public bool IsQueued { get; protected set; } + } + } +} diff --git a/OpenRA.Mods.CA/Traits/PeriodicExplosion.cs b/OpenRA.Mods.CA/Traits/PeriodicExplosion.cs index f20a3f4d29..694080a70c 100644 --- a/OpenRA.Mods.CA/Traits/PeriodicExplosion.cs +++ b/OpenRA.Mods.CA/Traits/PeriodicExplosion.cs @@ -1,11 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2007-2018 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -15,7 +14,6 @@ using OpenRA.GameRules; using OpenRA.Mods.Common; using OpenRA.Mods.Common.Traits; -using OpenRA.Primitives; using OpenRA.Traits; namespace OpenRA.Mods.CA.Traits @@ -42,6 +40,9 @@ public class PeriodicExplosionInfo : ConditionalTraitInfo, IRulesetLoaded [Desc("Initial Delay")] public readonly int InitialDelay = 0; + [Desc("If true, will apply firepower/reload modifiers.")] + public readonly bool ApplyModifiers = false; + public override object Create(ActorInitializer init) { return new PeriodicExplosion(init.Self, this); } public override void RulesetLoaded(Ruleset rules, ActorInfo ai) @@ -52,7 +53,7 @@ public override void RulesetLoaded(Ruleset rules, ActorInfo ai) var weaponToLower = Weapon.ToLowerInvariant(); if (!rules.Weapons.TryGetValue(weaponToLower, out weaponInfo)) - throw new YamlException("Weapons Ruleset does not contain an entry '{0}'".F(weaponToLower)); + throw new YamlException($"Weapons Ruleset does not contain an entry '{weaponToLower}'"); WeaponInfo = weaponInfo; } @@ -62,14 +63,18 @@ class PeriodicExplosion : ConditionalTrait, ITick, INotif { readonly PeriodicExplosionInfo info; readonly WeaponInfo weapon; - readonly BodyOrientation body; + BodyOrientation body; int fireDelay; int burst; + int initialDelay; AmmoPool ammoPool; List<(int Tick, Action Action)> delayedActions = new List<(int, Action)>(); + IFirepowerModifier[] firepowerModifiers; + IReloadModifier[] reloadModifiers; + public PeriodicExplosion(Actor self, PeriodicExplosionInfo info) : base(info) { @@ -77,13 +82,25 @@ public PeriodicExplosion(Actor self, PeriodicExplosionInfo info) weapon = info.WeaponInfo; burst = weapon.Burst; - body = self.TraitOrDefault(); + initialDelay = info.InitialDelay; } protected override void Created(Actor self) { + body = self.TraitOrDefault(); ammoPool = self.TraitsImplementing().FirstOrDefault(la => la.Info.Name == Info.AmmoPoolName); + if (info.ApplyModifiers) + { + firepowerModifiers = self.TraitsImplementing().ToArray(); + reloadModifiers = self.TraitsImplementing().ToArray(); + } + else + { + firepowerModifiers = Array.Empty(); + reloadModifiers = Array.Empty(); + } + base.Created(self); } @@ -102,30 +119,32 @@ void ITick.Tick(Actor self) if (IsTraitDisabled) return; - if (--fireDelay + Info.InitialDelay < 0) + if (--fireDelay + initialDelay < 0) { if (ammoPool != null && !ammoPool.TakeAmmo(self, 1)) return; var localoffset = body != null - ? body.LocalToWorld(info.LocalOffset.Rotate(body.QuantizeOrientation(self, self.Orientation))) + ? body.LocalToWorld(info.LocalOffset.Rotate(body.QuantizeOrientation(self.Orientation))) : info.LocalOffset; var args = new WarheadArgs { Weapon = weapon, - DamageModifiers = self.TraitsImplementing().Select(a => a.GetFirepowerModifier()).ToArray(), Source = self.CenterPosition, SourceActor = self, WeaponTarget = Target.FromPos(self.CenterPosition + localoffset) }; + if (info.ApplyModifiers) + args.DamageModifiers = firepowerModifiers.Select(a => a.GetFirepowerModifier()).ToArray(); + weapon.Impact(Target.FromPos(self.CenterPosition + localoffset), args); - if (weapon.Report != null && weapon.Report.Any()) + if (weapon.Report != null && weapon.Report.Length > 0) Game.Sound.Play(SoundType.World, weapon.Report.Random(self.World.SharedRandom), self.CenterPosition); - if (burst == weapon.Burst && weapon.StartBurstReport != null && weapon.StartBurstReport.Any()) + if (burst == weapon.Burst && weapon.StartBurstReport != null && weapon.StartBurstReport.Length > 0) Game.Sound.Play(SoundType.World, weapon.StartBurstReport.Random(self.World.SharedRandom), self.CenterPosition); if (--burst > 0) @@ -137,12 +156,17 @@ void ITick.Tick(Actor self) } else { - var modifiers = self.TraitsImplementing() - .Select(m => m.GetReloadModifier()); - fireDelay = Util.ApplyPercentageModifiers(weapon.ReloadDelay, modifiers); + if (info.ApplyModifiers) + { + var modifiers = reloadModifiers.Select(m => m.GetReloadModifier()); + fireDelay = Util.ApplyPercentageModifiers(weapon.ReloadDelay, modifiers); + } + else + fireDelay = weapon.ReloadDelay; + burst = weapon.Burst; - if (weapon.AfterFireSound != null && weapon.AfterFireSound.Any()) + if (weapon.AfterFireSound != null && weapon.AfterFireSound.Length > 0) { ScheduleDelayedAction(weapon.AfterFireSoundDelay, () => { @@ -150,11 +174,15 @@ void ITick.Tick(Actor self) }); } } + + initialDelay = 0; } } protected override void TraitEnabled(Actor self) { + initialDelay = info.InitialDelay; + if (info.ResetReloadWhenEnabled) { burst = weapon.Burst; diff --git a/OpenRA.Mods.CA/Traits/PeriodicExplosionOnSlaves.cs b/OpenRA.Mods.CA/Traits/PeriodicExplosionOnSlaves.cs new file mode 100644 index 0000000000..6eaa9a9066 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/PeriodicExplosionOnSlaves.cs @@ -0,0 +1,227 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Linq; +using OpenRA.GameRules; +using OpenRA.Mods.Common; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + public enum ExplodedSlaveAction + { + DoNothing, + Neutralize, + Unlink + } + + [Desc("Explodes a weapon at the actor's position when enabled." + + "Reload/BurstDelays are used as explosion intervals.")] + public class PeriodicExplosionOnSlavesInfo : ConditionalTraitInfo, IRulesetLoaded, Requires + { + [FieldLoader.Require] + [Desc("Named type of mind control. Must match that of MindController.")] + public readonly string ControlType = null; + + [WeaponReference] + [FieldLoader.Require] + [Desc("Weapon to be used for explosion.")] + public readonly string Weapon = null; + + public readonly bool ResetReloadWhenEnabled = true; + + [Desc("Which limited ammo pool should this weapon be assigned to.")] + public readonly string AmmoPoolName = ""; + + public WeaponInfo WeaponInfo { get; private set; } + + [Desc("Explosion offset relative to actor's position.")] + public readonly WVec LocalOffset = WVec.Zero; + + [Desc("Initial Delay")] + public readonly int InitialDelay = 0; + + [Desc("Types of slave that are killed when explosion is triggered.")] + public readonly BitSet KillSlaveTypes = default(BitSet); + + [Desc("If true, slave dies when explosion is triggered.")] + public readonly BitSet KillSlavesDamageTypes = default(BitSet); + + [Desc("What happens to surviving slaves after the explosion?")] + public readonly ExplodedSlaveAction PostExplosionAction = ExplodedSlaveAction.DoNothing; + + public override object Create(ActorInitializer init) { return new PeriodicExplosionOnSlaves(init.Self, this); } + + public override void RulesetLoaded(Ruleset rules, ActorInfo ai) + { + base.RulesetLoaded(rules, ai); + + WeaponInfo weaponInfo; + + var weaponToLower = Weapon.ToLowerInvariant(); + if (!rules.Weapons.TryGetValue(weaponToLower, out weaponInfo)) + throw new YamlException($"Weapons Ruleset does not contain an entry '{weaponToLower}'"); + + WeaponInfo = weaponInfo; + } + } + + class PeriodicExplosionOnSlaves : ConditionalTrait, ITick, INotifyCreated + { + readonly PeriodicExplosionOnSlavesInfo info; + readonly WeaponInfo weapon; + BodyOrientation body; + MindController mc; + + int fireDelay; + int burst; + AmmoPool ammoPool; + + List<(int Tick, Action Action)> delayedActions = new List<(int, Action)>(); + + public PeriodicExplosionOnSlaves(Actor self, PeriodicExplosionOnSlavesInfo info) + : base(info) + { + this.info = info; + + weapon = info.WeaponInfo; + burst = weapon.Burst; + } + + protected override void Created(Actor self) + { + body = self.TraitOrDefault(); + mc = self.TraitsImplementing().First(mc => mc.Info.ControlType == info.ControlType); + ammoPool = self.TraitsImplementing().FirstOrDefault(la => la.Info.Name == Info.AmmoPoolName); + base.Created(self); + } + + void ITick.Tick(Actor self) + { + for (var i = 0; i < delayedActions.Count; i++) + { + var x = delayedActions[i]; + if (--x.Tick <= 0) + x.Action(); + delayedActions[i] = x; + } + + delayedActions.RemoveAll(a => a.Item1 <= 0); + + if (IsTraitDisabled) + return; + + if (--fireDelay + Info.InitialDelay < 0) + { + if (!mc.Slaves.Any()) + return; + + if (ammoPool != null && !ammoPool.TakeAmmo(self, 1)) + return; + + var slaves = mc.Slaves; + + for (int i = 0; i < slaves.Count; i++) + { + var slave = slaves[i]; + var initialBurst = burst; + var initialFireDelay = fireDelay; + + var localoffset = body != null + ? body.LocalToWorld(info.LocalOffset.Rotate(body.QuantizeOrientation(self.Orientation))) + : info.LocalOffset; + + var args = new WarheadArgs + { + Weapon = weapon, + DamageModifiers = self.TraitsImplementing().Select(a => a.GetFirepowerModifier()).ToArray(), + Source = self.CenterPosition, + SourceActor = self, + WeaponTarget = Target.FromPos(slave.Actor.CenterPosition + localoffset) + }; + + weapon.Impact(Target.FromPos(slave.Actor.CenterPosition + localoffset), args); + + if (weapon.Report != null && weapon.Report.Length > 0) + Game.Sound.Play(SoundType.World, weapon.Report.Random(self.World.SharedRandom), slave.Actor.CenterPosition); + + if (burst == weapon.Burst && weapon.StartBurstReport != null && weapon.StartBurstReport.Length > 0) + Game.Sound.Play(SoundType.World, weapon.StartBurstReport.Random(self.World.SharedRandom), slave.Actor.CenterPosition); + + if (--burst > 0) + { + if (weapon.BurstDelays.Length == 1) + fireDelay = weapon.BurstDelays[0]; + else + fireDelay = weapon.BurstDelays[weapon.Burst - (burst + 1)]; + } + else + { + var modifiers = self.TraitsImplementing() + .Select(m => m.GetReloadModifier()); + fireDelay = Util.ApplyPercentageModifiers(weapon.ReloadDelay, modifiers); + burst = weapon.Burst; + + if (weapon.AfterFireSound != null && weapon.AfterFireSound.Length > 0) + { + ScheduleDelayedAction(weapon.AfterFireSoundDelay, () => + { + Game.Sound.Play(SoundType.World, weapon.AfterFireSound.Random(self.World.SharedRandom), slave.Actor.CenterPosition); + }); + } + } + + if (i < slaves.Count - 1) + { + burst = initialBurst; + fireDelay = initialFireDelay; + } + + var targetTypes = slaves[i].Actor.GetEnabledTargetTypes(); + if (Info.KillSlaveTypes.Overlaps(targetTypes)) + slaves[i].Actor.Kill(slaves[i].Actor, Info.KillSlavesDamageTypes); + } + + if (Info.PostExplosionAction == ExplodedSlaveAction.Unlink || Info.PostExplosionAction == ExplodedSlaveAction.Neutralize) + mc.ReleaseSlaves(self, 0); + + if (Info.PostExplosionAction == ExplodedSlaveAction.Neutralize) + { + for (int i = 0; i < slaves.Count; i++) + { + slaves[i].Actor.ChangeOwner(self.World.Players.First(p => p.InternalName == "Neutral")); + slaves[i].Actor.CancelActivity(); + } + } + } + } + + protected override void TraitEnabled(Actor self) + { + if (info.ResetReloadWhenEnabled) + { + burst = weapon.Burst; + fireDelay = 0; + } + } + + protected void ScheduleDelayedAction(int t, Action a) + { + if (t > 0) + delayedActions.Add((t, a)); + else + a(); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/PeriodicProducerCA.cs b/OpenRA.Mods.CA/Traits/PeriodicProducerCA.cs index bb5fc2d3c5..71b5c83dba 100644 --- a/OpenRA.Mods.CA/Traits/PeriodicProducerCA.cs +++ b/OpenRA.Mods.CA/Traits/PeriodicProducerCA.cs @@ -1,10 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -39,17 +39,25 @@ public class PeriodicProducerCAInfo : PausableConditionalTraitInfo [Desc("Duration between productions.")] public readonly int ChargeDuration = 1000; + [Desc("If greater than -1, overrides the initial time.")] + public readonly int InitialChargeDuration = -1; + public readonly bool ResetTraitOnEnable = false; + public readonly bool ResetTraitOnOwnerChange = false; public readonly bool ShowSelectionBar = false; public readonly Color ChargeColor = Color.DarkOrange; + [Desc("Defines to which players the bar is to be shown.")] + public readonly PlayerRelationship SelectionBarDisplayRelationships = PlayerRelationship.Ally; + public override object Create(ActorInitializer init) { return new PeriodicProducerCA(init, this); } } - public class PeriodicProducerCA : PausableConditionalTrait, ISelectionBar, ITick, ISync + public class PeriodicProducerCA : PausableConditionalTrait, ISelectionBar, ITick, ISync, INotifyOwnerChanged { readonly PeriodicProducerCAInfo info; + Actor self; [Sync] int ticks; @@ -58,17 +66,23 @@ public PeriodicProducerCA(ActorInitializer init, PeriodicProducerCAInfo info) : base(info) { this.info = info; - ticks = info.ChargeDuration; + self = init.Self; + SetInitialCharge(); + } + + void SetInitialCharge() + { + ticks = info.InitialChargeDuration > -1 ? info.InitialChargeDuration : info.ChargeDuration; } void ITick.Tick(Actor self) { - if (IsTraitPaused) + if (IsTraitDisabled || IsTraitPaused) return; - if (!IsTraitDisabled && --ticks < 0) + if (--ticks < 0) { - var sp = self.TraitsImplementing() + var sp = self.TraitsImplementing() .FirstOrDefault(p => !p.IsTraitDisabled && !p.IsTraitPaused && p.Info.Produces.Contains(info.Type)); var activated = false; @@ -99,7 +113,12 @@ void ITick.Tick(Actor self) protected override void TraitEnabled(Actor self) { if (info.ResetTraitOnEnable) - ticks = info.ChargeDuration; + SetInitialCharge(); + } + + void INotifyOwnerChanged.OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) + { + SetInitialCharge(); } float ISelectionBar.GetValue() @@ -107,6 +126,10 @@ float ISelectionBar.GetValue() if (!info.ShowSelectionBar || IsTraitDisabled) return 0f; + var viewer = self.World.RenderPlayer ?? self.World.LocalPlayer; + if (viewer != null && !Info.SelectionBarDisplayRelationships.HasRelationship(self.Owner.RelationshipWith(viewer))) + return 0f; + return (float)(info.ChargeDuration - ticks) / info.ChargeDuration; } @@ -117,7 +140,17 @@ Color ISelectionBar.GetColor() bool ISelectionBar.DisplayWhenEmpty { - get { return info.ShowSelectionBar && !IsTraitDisabled; } + get + { + if (!info.ShowSelectionBar || IsTraitDisabled) + return false; + + var viewer = self.World.RenderPlayer ?? self.World.LocalPlayer; + if (viewer != null && !Info.SelectionBarDisplayRelationships.HasRelationship(self.Owner.RelationshipWith(viewer))) + return false; + + return true; + } } } } diff --git a/OpenRA.Mods.CA/Traits/Player/AutoDeployManager.cs b/OpenRA.Mods.CA/Traits/Player/AutoDeployManager.cs new file mode 100644 index 0000000000..d76c745e9a --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Player/AutoDeployManager.cs @@ -0,0 +1,79 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [TraitLocation(SystemActors.Player)] + [Desc("Allows the player to issue the orders the AutoDeployer traits trigger.")] + public class AutoDeployManagerInfo : ConditionalTraitInfo + { + public override object Create(ActorInitializer init) { return new AutoDeployManager(init.Self, this); } + } + + public class AutoDeployManager : ConditionalTrait, IBotTick + { + readonly HashSet> active = new HashSet>(); + readonly HashSet undeployOrders = new HashSet(); + readonly World world; + + public AutoDeployManager(Actor self, AutoDeployManagerInfo info) + : base(info) + { + world = self.World; + } + + public void AddEntry(TraitPair entry) + { + active.Add(entry); + } + + public void AddUndeployOrders(Order order) + { + undeployOrders.Add(order); + } + + void IBotTick.BotTick(IBot bot) + { + foreach (var entry in active) + { + if (entry.Actor.IsDead || !entry.Actor.IsInWorld) + continue; + + if (world.LocalRandom.Next(100) > entry.Trait.Info.DeployChance) + continue; + + var orders = entry.Trait.DeployTraits.Where(d => d.CanIssueDeployOrder(entry.Actor, false)).Select(d => d.IssueDeployOrder(entry.Actor, false)); + + foreach (var order in orders) + bot.QueueOrder(order); + + if (entry.Trait.PrimaryBuilding) + bot.QueueOrder(new Order(AutoDeployer.PrimaryBuildingOrderID, entry.Actor, false)); + } + + active.Clear(); + + foreach (var order in undeployOrders) + { + if (order.Subject.IsDead || !order.Subject.IsInWorld) + continue; + + bot.QueueOrder(order); + } + + undeployOrders.Clear(); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Player/CampaignProgressTracker.cs b/OpenRA.Mods.CA/Traits/Player/CampaignProgressTracker.cs new file mode 100644 index 0000000000..87e14379e2 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Player/CampaignProgressTracker.cs @@ -0,0 +1,264 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Security.Cryptography; +using Newtonsoft.Json; +using OpenRA.Mods.Common.Traits; +using OpenRA.Mods.Common.Widgets; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [TraitLocation(SystemActors.Player)] + [Desc("Stores campaign progress.")] + public class CampaignProgressTrackerInfo : TraitInfo + { + public override object Create(ActorInitializer init) { return new CampaignProgressTracker(); } + } + + public class CampaignProgressTracker : INotifyWinStateChanged, IResolveOrder + { + private const string encryptionKey = "b14ca5898a4e4133bbce2ea2315a1916"; + private static string oldCampaignProgressFilePath = Path.Combine(Platform.SupportDir + "Logs", "ca-campaign.log"); + private static string campaignProgressFilePath = Path.Combine(Platform.SupportDir + "Logs", "ca-progress.log"); + private bool developerCommandUsed = false; + + void INotifyWinStateChanged.OnPlayerWon(Player player) + { + if (developerCommandUsed) + return; + + if (player != player.World.LocalPlayer) + return; + + if (player.World.Players.Count(p => p.Playable) > 1) + return; + + if (!player.World.Map.Categories.Contains("Campaign")) + return; + + var missionTitle = GetMapTitleWithoutNumber(player.World.Map.Title); + var worldActor = player.World.WorldActor; + var difficulty = worldActor.TraitsImplementing() + .FirstOrDefault(sld => sld.Info.ID == "difficulty"); + + var shroud = player.PlayerActor.TraitOrDefault(); + bool? fogEnabled = shroud?.FogEnabled; + + var mapBuildRadius = player.World.WorldActor.TraitOrDefault(); + bool? buildRadiusEnabled = mapBuildRadius?.BuildRadiusEnabled; + + var respawnDropdown = worldActor.TraitsImplementing() + .FirstOrDefault(sld => sld.Info.ID == "respawn"); + + bool? respawnEnabled = respawnDropdown != null ? respawnDropdown.Value == "enabled" : null; + + var campaignProgress = GetCampaignProgress(); + campaignProgress.TryGetValue(missionTitle, out var existingMissionResult); + + if (existingMissionResult != null) + { + if (difficulty != null) + { + var currentDifficultyIndex = -1; + var existingDifficultyIndex = -1; + + var optionsList = difficulty.Info.Values.ToList(); + for (int i = 0; i < optionsList.Count; i++) + { + if (optionsList[i].Key == difficulty.Value) + currentDifficultyIndex = i; + + if (optionsList[i].Key == existingMissionResult.Difficulty) + existingDifficultyIndex = i; + } + + // If existing result is on higher difficulty don't overwrite + if (existingDifficultyIndex >= 0 && existingDifficultyIndex > currentDifficultyIndex) + return; + + // If same difficulty, only store if new time is better + if (currentDifficultyIndex == existingDifficultyIndex && existingMissionResult.Ticks <= player.World.WorldTick) + return; + } + else if (existingMissionResult.Ticks <= player.World.WorldTick) + return; + } + + var speed = FluentProvider.GetMessage(player.World.GameSpeed.Name); + + campaignProgress[missionTitle] = new MissionVictoryResult() + { + Uid = player.World.Map.Uid, + Version = Game.ModData.Manifest.Metadata.Version, + MissionTitle = missionTitle, + Difficulty = difficulty?.Value, + Time = WidgetUtils.FormatTime(player.World.WorldTick, player.World.Timestep), + Ticks = player.World.WorldTick, + DateCompleted = DateTime.Now, + Speed = speed, + FogEnabled = fogEnabled, + BuildRadiusEnabled = buildRadiusEnabled, + RespawnEnabled = respawnEnabled + }; + + SaveCampaignProgress(campaignProgress); + } + + void INotifyWinStateChanged.OnPlayerLost(Player player) { } + + void IResolveOrder.ResolveOrder(Actor self, Order order) + { + if (order.OrderString.StartsWith("Dev")) + developerCommandUsed = true; + } + + public static string GetMapTitleWithoutNumber(string mapTitle) + { + var firstColonIndex = mapTitle.IndexOf(": "); + var firstPeriodIndex = mapTitle.IndexOf(". "); + var splitIndex = firstColonIndex >= 0 ? firstColonIndex : firstPeriodIndex; + + string result; + if (splitIndex >= 0) + result = mapTitle.Substring(splitIndex + 2); + else + result = mapTitle; + + var bracketIndex = result.IndexOf('('); + if (bracketIndex >= 0) + result = result.Substring(0, bracketIndex); + + return result.TrimEnd(); + } + + public static Dictionary GetCampaignProgress() + { + var campaignProgress = new Dictionary(); + + if (File.Exists(campaignProgressFilePath)) + { + try + { + var campaignProgressFileContents = File.ReadAllText(campaignProgressFilePath); + var decryptedJson = DecryptString(campaignProgressFileContents, encryptionKey); + campaignProgress = JsonConvert.DeserializeObject>(decryptedJson); + } + catch + { + // do nothing + } + } + // backwards compatibility + else if (File.Exists(oldCampaignProgressFilePath)) + { + try + { + var oldFileContents = File.ReadAllText(oldCampaignProgressFilePath); + File.WriteAllText(campaignProgressFilePath, oldFileContents); + var decryptedJson = DecryptString(oldFileContents, encryptionKey); + campaignProgress = JsonConvert.DeserializeObject>(decryptedJson); + } + catch + { + // do nothing + } + } + + return campaignProgress; + } + + static void SaveCampaignProgress(Dictionary campaignProgress) + { + try + { + var json = JsonConvert.SerializeObject(campaignProgress); + var encryptedJson = EncryptString(json, encryptionKey); + File.WriteAllText(campaignProgressFilePath, encryptedJson); + } + catch + { + // do nothing + } + } + + static string EncryptString(string plainText, string key) + { + byte[] iv = new byte[16]; + byte[] array; + + using (Aes aes = Aes.Create()) + { + aes.Key = System.Text.Encoding.UTF8.GetBytes(key); + aes.IV = iv; + + ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV); + + using (MemoryStream memoryStream = new MemoryStream()) + { + using (CryptoStream cryptoStream = new CryptoStream((Stream)memoryStream, encryptor, CryptoStreamMode.Write)) + { + using (StreamWriter streamWriter = new StreamWriter((Stream)cryptoStream)) + { + streamWriter.Write(plainText); + } + + array = memoryStream.ToArray(); + } + } + } + + return Convert.ToBase64String(array); + } + + static string DecryptString(string cipherText, string key) + { + byte[] iv = new byte[16]; + byte[] buffer = Convert.FromBase64String(cipherText); + + using (Aes aes = Aes.Create()) + { + aes.Key = System.Text.Encoding.UTF8.GetBytes(key); + aes.IV = iv; + ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV); + + using (MemoryStream memoryStream = new MemoryStream(buffer)) + { + using (CryptoStream cryptoStream = new CryptoStream((Stream)memoryStream, decryptor, CryptoStreamMode.Read)) + { + using (StreamReader streamReader = new StreamReader((Stream)cryptoStream)) + { + return streamReader.ReadToEnd(); + } + } + } + } + } + } + + public class MissionVictoryResult + { + public string Uid; + public string Version; + public string MissionTitle; + public string Difficulty; + public string Time; + public int Ticks; + public DateTime DateCompleted; + public string Speed; + public bool? FogEnabled; + public bool? BuildRadiusEnabled; + public bool? RespawnEnabled; + } +} diff --git a/OpenRA.Mods.CA/Traits/Player/CapturedFactionsManager.cs b/OpenRA.Mods.CA/Traits/Player/CapturedFactionsManager.cs new file mode 100644 index 0000000000..202821ac51 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Player/CapturedFactionsManager.cs @@ -0,0 +1,42 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [TraitLocation(SystemActors.Player)] + [Desc("Attached to player to track what factions conyards or factories have been captured.")] + public class CapturedFactionsManagerInfo : TraitInfo + { + public override object Create(ActorInitializer init) { return new CapturedFactionsManager(this); } + } + + public class CapturedFactionsManager + { + public HashSet Factions { get; private set; } + + public CapturedFactionsManager(CapturedFactionsManagerInfo info) + { + Factions = new HashSet(); + } + + public void AddFaction(string faction) + { + Factions.Add(faction); + } + + public bool HasFaction(string faction) + { + return Factions.Contains(faction); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Player/ClassicProductionQueueCA.cs b/OpenRA.Mods.CA/Traits/Player/ClassicProductionQueueCA.cs index a4dd1c891f..7b2f79b1f1 100644 --- a/OpenRA.Mods.CA/Traits/Player/ClassicProductionQueueCA.cs +++ b/OpenRA.Mods.CA/Traits/Player/ClassicProductionQueueCA.cs @@ -1,24 +1,32 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion +using System; using System.Linq; +using OpenRA.Mods.Common; using OpenRA.Mods.Common.Traits; namespace OpenRA.Mods.CA.Traits { [Desc("Attach this to the player actor (not a building!) to define a new shared build queue.", "Will only work together with the Production: trait on the actor that actually does the production.", - "You will also want to add PrimaryBuildings: to let the user choose where new units should exit.")] + "You will also want to add PrimaryBuildings: to let the user choose where new units should exit.", + "CA version allows build speed reduction to take into account all buildings for a type if BuildAtProductionType is set,", + "and allows excluding certain types from that calculation.")] public class ClassicProductionQueueCAInfo : ClassicProductionQueueInfo { + [Desc("If true, ignore BuildAtProductionType when calculating build duration, so all structures for this queue are counted.")] + public readonly bool CombinedBuildSpeedReduction = false; + + public readonly string[] BuildSpeedReductionExcludedTypes = Array.Empty(); + public override object Create(ActorInitializer init) { return new ClassicProductionQueueCA(init, this); } } @@ -39,14 +47,19 @@ public override int GetBuildTime(ActorInfo unit, BuildableInfo bi) if (developerMode.FastBuild) return 0; - var time = base.GetBuildTime(unit, bi); + var time = GetBaseBuildTime(unit, bi); if (Info.SpeedUp) { - var type = Info.Type; // difference with ClassicProductionQueue is this line, so BuildAtProductionType no longer overrides the type + var type = bi.BuildAtProductionType ?? Info.Type; + + // difference with ClassicProductionQueue, prevents BuildAtProductionType from overriding the type + if (Info.CombinedBuildSpeedReduction) + type = Info.Type; var selfsameProductionsCount = self.World.ActorsWithTrait() - .Count(p => !p.Trait.IsTraitDisabled && !p.Trait.IsTraitPaused && p.Actor.Owner == self.Owner && p.Trait.Info.Produces.Contains(type)); + .Count(p => !p.Trait.IsTraitDisabled && !p.Trait.IsTraitPaused && p.Actor.Owner == self.Owner && p.Trait.Info.Produces.Contains(type) + && !Info.BuildSpeedReductionExcludedTypes.Contains(p.Actor.Info.Name)); var speedModifier = selfsameProductionsCount.Clamp(1, Info.BuildTimeSpeedReduction.Length) - 1; time = (time * Info.BuildTimeSpeedReduction[speedModifier]) / 100; @@ -54,5 +67,23 @@ public override int GetBuildTime(ActorInfo unit, BuildableInfo bi) return time; } + + // copied from ProductionQueue to bypass ClassicProductionQueue.GetBuildTime() + public virtual int GetBaseBuildTime(ActorInfo unit, BuildableInfo bi) + { + if (developerMode.FastBuild) + return 0; + + var time = bi.BuildDuration; + if (time == -1) + time = GetProductionCost(unit); + + var modifiers = unit.TraitInfos() + .Select(t => t.GetProductionTimeModifier(techTree, Info.Type)) + .Append(bi.BuildDurationModifier) + .Append(Info.BuildDurationModifier); + + return Util.ApplyPercentageModifiers(time, modifiers); + } } } diff --git a/OpenRA.Mods.CA/Traits/Player/CountManager.cs b/OpenRA.Mods.CA/Traits/Player/CountManager.cs new file mode 100644 index 0000000000..ae832558ed --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Player/CountManager.cs @@ -0,0 +1,64 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [TraitLocation(SystemActors.Player)] + [Desc("Allows arbitrary counts.")] + public class CountManagerInfo : TraitInfo + { + [Desc("Maximum count for specific count types.")] + public readonly Dictionary MaxCounts = new(); + + public override object Create(ActorInitializer init) { return new CountManager(this); } + } + + public class CountManager + { + public Dictionary Counts { get; } + public CountManagerInfo Info { get; } + public event Action Incremented; + public event Action Decremented; + + public CountManager(CountManagerInfo info) + { + Counts = new Dictionary(); + Info = info; + } + + public void Increment(string type) + { + if (!Counts.ContainsKey(type)) + Counts[type] = 0; + + if (Info.MaxCounts.TryGetValue(type, out var maxCount) && Counts[type] >= maxCount) + return; + + Counts[type]++; + Incremented?.Invoke(type, Counts[type]); + } + + public void Decrement(string type) + { + if (!Counts.TryGetValue(type, out var value)) + return; + + if (value <= 0) + return; + + Counts[type] = --value; + Decremented?.Invoke(type, value); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Player/GrantConditionOnPrerequisiteManagerCA.cs b/OpenRA.Mods.CA/Traits/Player/GrantConditionOnPrerequisiteManagerCA.cs new file mode 100644 index 0000000000..eed58e7f12 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Player/GrantConditionOnPrerequisiteManagerCA.cs @@ -0,0 +1,91 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [TraitLocation(SystemActors.Player)] + [Desc("Attach this to the player actor. Exactly the same as standard version just with naming changes.")] + public class GrantConditionOnPrerequisiteManagerCAInfo : TraitInfo, Requires + { + public override object Create(ActorInitializer init) { return new GrantConditionOnPrerequisiteManagerCA(init); } + } + + public class GrantConditionOnPrerequisiteManagerCA : ITechTreeElement + { + readonly Actor self; + readonly Dictionary> upgradables = new Dictionary>(); + readonly TechTree techTree; + + public GrantConditionOnPrerequisiteManagerCA(ActorInitializer init) + { + self = init.Self; + techTree = self.Trait(); + } + + static string MakeKey(string[] prerequisites) + { + return "condition_" + string.Join("_", prerequisites.OrderBy(a => a)); + } + + public void Register(Actor actor, GrantConditionOnPrerequisiteCA u, string[] prerequisites) + { + var key = MakeKey(prerequisites); + if (!upgradables.TryGetValue(key, out var list)) + { + upgradables.Add(key, list = new List<(Actor, GrantConditionOnPrerequisiteCA)>()); + techTree.Add(key, prerequisites, 0, this); + } + + list.Add((actor, u)); + + // Notify the current state + u.PrerequisitesUpdated(actor, techTree.HasPrerequisites(prerequisites)); + } + + public void Unregister(Actor actor, GrantConditionOnPrerequisiteCA u, string[] prerequisites) + { + var key = MakeKey(prerequisites); + var list = upgradables[key]; + + list.RemoveAll(x => x.Actor == actor && x.GrantConditionOnPrerequisiteCA == u); + if (list.Count == 0) + { + upgradables.Remove(key); + techTree.Remove(key); + } + } + + public void PrerequisitesAvailable(string key) + { + if (!upgradables.TryGetValue(key, out var list)) + return; + + foreach (var u in list) + u.GrantConditionOnPrerequisiteCA.PrerequisitesUpdated(u.Actor, true); + } + + public void PrerequisitesUnavailable(string key) + { + if (!upgradables.TryGetValue(key, out var list)) + return; + + foreach (var u in list) + u.GrantConditionOnPrerequisiteCA.PrerequisitesUpdated(u.Actor, false); + } + + public void PrerequisitesItemHidden(string key) { } + public void PrerequisitesItemVisible(string key) { } + } +} diff --git a/OpenRA.Mods.CA/Traits/Player/LobbyPrerequisiteDropdown.cs b/OpenRA.Mods.CA/Traits/Player/LobbyPrerequisiteDropdown.cs new file mode 100644 index 0000000000..1d09af9200 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Player/LobbyPrerequisiteDropdown.cs @@ -0,0 +1,85 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [TraitLocation(SystemActors.Player | SystemActors.EditorPlayer)] + [Desc("Selectable dropdown of prerequisites.")] + public class LobbyPrerequisiteDropdownInfo : TraitInfo, ILobbyOptions, ITechTreePrerequisiteInfo + { + [FieldLoader.Require] + [Desc("Internal id for this checkbox.")] + public readonly string ID = null; + + [FieldLoader.Require] + [FluentReference] + [Desc("Descriptive label for this dropdown.")] + public readonly string Label = null; + + [FluentReference] + [Desc("Tooltip description for this dropdown.")] + public readonly string Description = null; + + [FieldLoader.Require] + [Desc("Default option key in the `Values` list.")] + public readonly string Default = null; + + [FieldLoader.Require] + [FluentReference(dictionaryReference: LintDictionaryReference.Values)] + [Desc("Options to choose from.")] + public readonly Dictionary Values = null; + + [Desc("Prevent the dropdown value from being changed in the lobby.")] + public readonly bool Locked = false; + + [Desc("Whether to display the dropdown in the lobby.")] + public readonly bool Visible = true; + + [Desc("Display order for the dropdown in the lobby.")] + public readonly int DisplayOrder = 0; + + public HashSet Prerequisites { get { return Values.Keys.ToHashSet(); } } + + IEnumerable ITechTreePrerequisiteInfo.Prerequisites(ActorInfo info) { return Prerequisites; } + + IEnumerable ILobbyOptions.LobbyOptions(MapPreview map) + { + yield return new LobbyOption(map, ID, Label, Description, Visible, DisplayOrder, + Values, Default, Locked); + } + + public override object Create(ActorInitializer init) { return new LobbyPrerequisiteDropdown(init.Self, this); } + } + + public class LobbyPrerequisiteDropdown : ITechTreePrerequisite, INotifyCreated + { + readonly LobbyPrerequisiteDropdownInfo info; + HashSet prerequisites = new HashSet(); + + public LobbyPrerequisiteDropdown(Actor self, LobbyPrerequisiteDropdownInfo info) + { + this.info = info; + } + + void INotifyCreated.Created(Actor self) + { + var selectedPrerequisite = self.World.LobbyInfo.GlobalSettings + .OptionOrDefault(info.ID, info.Default); + + prerequisites.Add(selectedPrerequisite); + } + + IEnumerable ITechTreePrerequisite.ProvidesPrerequisites => prerequisites; + } +} diff --git a/OpenRA.Mods.CA/Traits/Player/NotificationManager.cs b/OpenRA.Mods.CA/Traits/Player/NotificationManager.cs new file mode 100644 index 0000000000..db696898e7 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Player/NotificationManager.cs @@ -0,0 +1,42 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using OpenRA.Traits; + +namespace OpenRA.Mods.Common.Traits +{ + [TraitLocation(SystemActors.Player)] + [Desc("Tracks last notification times.")] + public class NotificationManagerInfo : TraitInfo + { + public override object Create(ActorInitializer init) { return new NotificationManager(); } + } + + public class NotificationManager + { + readonly Dictionary lastNotificationTimes; + + public NotificationManager() + { + lastNotificationTimes = new Dictionary(); + } + + public void SetLastNotificationTime(string notificationType, long time) + { + lastNotificationTimes[notificationType] = time; + } + + public long GetLastNotificationTime(string notificationType) + { + return lastNotificationTimes.ContainsKey(notificationType) ? lastNotificationTimes[notificationType] : 0; + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Player/PlayerBountyPool.cs b/OpenRA.Mods.CA/Traits/Player/PlayerBountyPool.cs new file mode 100644 index 0000000000..16e2005aa6 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Player/PlayerBountyPool.cs @@ -0,0 +1,66 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [TraitLocation(SystemActors.Player)] + [Desc("Tracks and provides access to player bounty pool.")] + public class PlayerBountyPoolInfo : TraitInfo + { + public override object Create(ActorInitializer init) { return new PlayerBountyPool(); } + } + + public class PlayerBountyPool + { + // The amount of bounty available to be collected by other players + int availableBounty; + + // The amount of bounty this player has collected from other players + int collectedBounty; + + public int CollectedBounty => collectedBounty; + + public int AvailableBounty + { + get { return availableBounty; } + } + + public PlayerBountyPool() + { + availableBounty = 0; + collectedBounty = 0; + } + + public void AddBounty(int amount) + { + availableBounty += amount; + } + + // Collect bounty from this players + public int CollectBounty(int amount) + { + if (availableBounty < amount) + { + amount = availableBounty; + } + + availableBounty -= amount; + return amount; + } + + // Add to the amount of bounty this player has collected from other players + public void AddCollectedBounty(int amount) + { + collectedBounty += amount; + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Player/PlayerConnectionStatus.cs b/OpenRA.Mods.CA/Traits/Player/PlayerConnectionStatus.cs new file mode 100644 index 0000000000..4ca5b884e1 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Player/PlayerConnectionStatus.cs @@ -0,0 +1,40 @@ +#region Copyright & License Information +/* + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [TraitLocation(SystemActors.Player)] + [Desc("Tracks player connection status.")] + public class PlayerConnectionStatusInfo : TraitInfo + { + public override object Create(ActorInitializer init) { return new PlayerConnectionStatus(init, this); } + } + + public class PlayerConnectionStatus : INotifyPlayerDisconnected + { + bool isConnected; + public bool IsConnected => isConnected; + + public PlayerConnectionStatus(ActorInitializer init, PlayerConnectionStatusInfo info) + { + isConnected = true; + } + + void INotifyPlayerDisconnected.PlayerDisconnected(Actor self, Player p) + { + if (p != self.Owner) + return; + + isConnected = false; + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Player/PlayerExperienceLevels.cs b/OpenRA.Mods.CA/Traits/Player/PlayerExperienceLevels.cs new file mode 100644 index 0000000000..7de299f1db --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Player/PlayerExperienceLevels.cs @@ -0,0 +1,168 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Linq; +using OpenRA.Mods.Common; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [TraitLocation(SystemActors.Player)] + [Desc("Tracks player experience and sets grants prerequisites based on it.")] + public class PlayerExperienceLevelsInfo : ConditionalTraitInfo, Requires, Requires, ITechTreePrerequisiteInfo + { + [Desc("Experience required to reach each level above level 0.")] + public readonly int[] LevelXpRequirements = { 50, 250, 500 }; + + public readonly string[] LevelPrerequisites = { }; + + [Desc("List of factions that can have levels.")] + public readonly string[] Factions = { }; + + [NotificationReference("Speech")] + [Desc("Speech notification to play when player levels up.")] + public readonly string LevelUpNotification = null; + + [Desc("Text notification to display when player levels up.")] + public readonly string LevelUpTextNotification = null; + + [NotificationReference("Sounds")] + [Desc("Sound notification to play when player levels up.")] + public readonly string LevelUpSound = null; + + [Desc("Ticks before playing notification.")] + public readonly int NotificationDelay = 0; + + [Desc("Actor to spawn when player levels up.")] + [ActorReference] + public readonly string DummyActor = null; + + IEnumerable ITechTreePrerequisiteInfo.Prerequisites(ActorInfo info) + { + return LevelPrerequisites; + } + + public override object Create(ActorInitializer init) { return new PlayerExperienceLevels(init.Self, this); } + } + + public class PlayerExperienceLevels : ConditionalTrait, ITick, ITechTreePrerequisite, INotifyCreated + { + PlayerExperience playerExperience; + TechTree techTree; + UpgradesManager upgradesManager; + readonly int maxLevel; + readonly bool validFaction; + int currentLevel; + int nextLevelXpRequired; + bool notificationQueued; + int ticksUntilNotification; + bool dummyActorQueued; + int ticksUntilSpawnDummyActor; + + public event Action LevelledUp; + + public PlayerExperienceLevels(Actor self, PlayerExperienceLevelsInfo info) + : base(info) + { + var player = self.Owner; + validFaction = info.Factions.Length == 0 || info.Factions.Contains(player.Faction.InternalName); + + currentLevel = 0; + maxLevel = info.LevelXpRequirements.Length; + nextLevelXpRequired = info.LevelXpRequirements[currentLevel]; + ticksUntilNotification = info.NotificationDelay; + } + + public bool Enabled => validFaction; + + public int? CurrentLevel => currentLevel; + + public int? XpRequiredForNextLevel => currentLevel >= maxLevel ? null : nextLevelXpRequired; + + IEnumerable ITechTreePrerequisite.ProvidesPrerequisites => currentLevel > 0 ? Info.LevelPrerequisites.Take(currentLevel) : Enumerable.Empty(); + + protected override void Created(Actor self) + { + // Special case handling is required for the Player actor. + // Created is called before Player.PlayerActor is assigned, + // so we must query other player traits from self, knowing that + // it refers to the same actor as self.Owner.PlayerActor + var playerActor = self.Info.Name == "player" ? self : self.Owner.PlayerActor; + playerExperience = playerActor.Trait(); + techTree = playerActor.Trait(); + upgradesManager = playerActor.Trait(); + base.Created(self); + } + + void ITick.Tick(Actor self) + { + if (Enabled && currentLevel < maxLevel && playerExperience.Experience >= nextLevelXpRequired) + { + LevelUp(self); + } + + if (notificationQueued && --ticksUntilNotification <= 0) + { + if (Info.LevelUpNotification != null) + Game.Sound.PlayNotification(self.World.Map.Rules, self.Owner, "Speech", Info.LevelUpNotification, self.Owner.Faction.InternalName); + + if (Info.LevelUpTextNotification != null) + TextNotificationsManager.AddTransientLine(self.Owner, string.Format(Info.LevelUpTextNotification, currentLevel)); + + notificationQueued = false; + ticksUntilNotification = Info.NotificationDelay; + } + + if (dummyActorQueued && --ticksUntilSpawnDummyActor <= 0) + { + self.World.AddFrameEndTask(w => + { + w.CreateActor(Info.DummyActor, new TypeDictionary + { + new ParentActorInit(self), + new LocationInit(CPos.Zero), + new OwnerInit(self.Owner), + new FacingInit(WAngle.Zero), + }); + }); + } + } + + void LevelUp(Actor self) + { + if (Info.LevelUpSound != null) + Game.Sound.PlayNotification(self.World.Map.Rules, self.Owner, "Sounds", Info.LevelUpSound, self.Owner.Faction.InternalName); + + currentLevel++; + + LevelledUp?.Invoke(currentLevel); + + if (currentLevel < maxLevel) + nextLevelXpRequired = Info.LevelXpRequirements[currentLevel]; + + techTree.ActorChanged(self); + notificationQueued = true; + + // if there's an actor that represents the prerequisite, add it to the build order + if (self.World.Map.Rules.Actors.ContainsKey(Info.LevelPrerequisites[currentLevel - 1])) + upgradesManager.UpgradeProviderCreated(Info.LevelPrerequisites[currentLevel - 1]); + + if (Info.DummyActor != null) + { + dummyActorQueued = true; + ticksUntilSpawnDummyActor = 1; + } + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Player/PopController.cs b/OpenRA.Mods.CA/Traits/Player/PopController.cs new file mode 100644 index 0000000000..016552f517 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Player/PopController.cs @@ -0,0 +1,88 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Linq; +using System.Collections.Generic; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [TraitLocation(SystemActors.Player)] + [Desc("Works with PopControlled trait on actors to cull excess instances.")] + public class PopControllerInfo : TraitInfo + { + [Desc("Limits by type.")] + public readonly Dictionary Limits = new(); + + public override object Create(ActorInitializer init) { return new PopController(init.Self, this); } + } + + public class PopController + { + readonly Player player; + readonly World world; + HashSet pendingCulls; + + public PopControllerInfo Info { get; private set; } + + public PopController(Actor self, PopControllerInfo info) + { + player = self.Owner; + world = self.World; + pendingCulls = new HashSet(); + Info = info; + } + + public void Update(Actor a, string limitType) + { + if (limitType == null) + limitType = a.Info.Name.ToLowerInvariant(); + + Cull(limitType); + } + + void Cull(string limitType) + { + if (pendingCulls.Contains(limitType)) + return; + + pendingCulls.Add(limitType); + + world.AddFrameEndTask(w => { + var instances = world.ActorsWithTrait().Where(a => !a.Actor.IsDead + && a.Actor.Owner == player + && (a.Actor.IsInWorld || a.Actor.TraitOrDefault().Transport != null) + && (a.Trait.Info.Type == limitType || (a.Trait.Info.Type == null && a.Actor.Info.Name == limitType)) + ).OrderBy(a => a.Actor.ActorID).ToList(); + + var limit = (Info.Limits == null || !Info.Limits.ContainsKey(limitType)) ? 1 : Info.Limits[limitType]; + + if (instances.Count > limit) { + var numToRemove = instances.Count - limit; + + for (var i = 0; i < numToRemove; i++) + { + var instance = instances.FirstOrDefault(); + + if (instance.Trait.Info.RemoveInstead || !instance.Actor.Info.HasTraitInfo()) + instance.Actor.Dispose(); + else + instance.Actor.Kill(instance.Actor, instance.Trait.Info.DamageTypes); + + instances.Remove(instance); + } + } + + pendingCulls.Remove(limitType); + }); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Player/ProductionTracker.cs b/OpenRA.Mods.CA/Traits/Player/ProductionTracker.cs new file mode 100644 index 0000000000..2dfd1381ed --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Player/ProductionTracker.cs @@ -0,0 +1,84 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [TraitLocation(SystemActors.Player)] + [Desc("Keeps track of player's initial build order and units produced for observer stats.")] + public class ProductionTrackerInfo : TraitInfo + { + [Desc("Maximum number of build order items to track.")] + public readonly int MaxBuildOrderItems = 18; + + public override object Create(ActorInitializer init) { return new ProductionTracker(init.Self, this); } + } + + public class ProductionTracker + { + readonly ProductionTrackerInfo info; + List buildOrder; + Dictionary unitValues; + int totalValue; + public int BuildOrderCount => buildOrder.Count; + public List BuildOrder => buildOrder; + public Dictionary UnitValues => unitValues; + public int TotalValue => totalValue; + readonly World world; + + public ProductionTracker(Actor self, ProductionTrackerInfo info) + { + this.info = info; + buildOrder = new List(); + unitValues = new Dictionary(); + totalValue = 0; + world = self.World; + } + + public void BuildOrderItemCreated(string type, int limit, bool ignoreMaxItems = false) + { + if (!ignoreMaxItems && BuildOrderCount >= info.MaxBuildOrderItems) + return; + + if (limit > 0 && buildOrder.Count(i => i.Name == type) >= limit) + return; + + buildOrder.Add(new ProductionTrackerBuildOrderItem { Name = type, Ticks = world.WorldTick }); + } + + public void UnitCreated(string type, int value) + { + totalValue += value; + + if (unitValues.ContainsKey(type)) + { + unitValues[type].Value += value; + unitValues[type].Count++; + } + else + unitValues[type] = new ProductionTrackerUnitValueItem { Count = 1, Value = value }; + } + } + + public class ProductionTrackerBuildOrderItem + { + public string Name; + public int Ticks; + } + + public class ProductionTrackerUnitValueItem + { + public int Value; + public int Count; + } +} diff --git a/OpenRA.Mods.CA/Traits/Player/ProvidesDelayedPrerequisite.cs b/OpenRA.Mods.CA/Traits/Player/ProvidesDelayedPrerequisite.cs deleted file mode 100644 index b89a9a43eb..0000000000 --- a/OpenRA.Mods.CA/Traits/Player/ProvidesDelayedPrerequisite.cs +++ /dev/null @@ -1,186 +0,0 @@ -#region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. - */ -#endregion - -using System.Collections.Generic; -using System.Linq; -using OpenRA.Mods.Common; -using OpenRA.Mods.Common.Traits; -using OpenRA.Primitives; -using OpenRA.Traits; - -namespace OpenRA.Mods.CA.Traits -{ - public class ProvidesDelayedPrerequisiteInfo : ConditionalTraitInfo, ITechTreePrerequisiteInfo - { - [Desc("The prerequisite type that this provides. If left empty it defaults to the actor's name.")] - public readonly string Prerequisite = null; - - [Desc("Number of ticks to wait before granting prerequisite.")] - public readonly int Delay = 250; - - [Desc("Only grant this prerequisite when you have these prerequisites.")] - public readonly string[] RequiresPrerequisites = { }; - - [Desc("Only grant this prerequisite for certain factions.")] - public readonly HashSet Factions = new HashSet(); - - [Desc("Should it recheck everything when it is captured?")] - public readonly bool ResetOnOwnerChange = false; - - [Desc("If true, unmet conditions will disable the prerequisite entirely, otherwise the timer will be paused.")] - public readonly bool FullDisable = false; - - public readonly bool ShowSelectionBar = true; - public readonly Color SelectionBarColor = Color.FromArgb(200, 200, 200); - - [NotificationReference("Speech")] - [Desc("Sound played when prerequisite is granted.")] - public readonly string Notification = null; - - IEnumerable ITechTreePrerequisiteInfo.Prerequisites(ActorInfo info) - { - return new string[] { Prerequisite ?? info.Name }; - } - - public override object Create(ActorInitializer init) { return new ProvidesDelayedPrerequisite(init, this); } - } - - public class ProvidesDelayedPrerequisite : ConditionalTrait, ITick, ITechTreePrerequisite, INotifyOwnerChanged, INotifyCreated, ISelectionBar - { - readonly string prerequisite; - - [Sync] - int remainingDelay; - - bool enabled; - TechTree techTree; - string faction; - - public ProvidesDelayedPrerequisite(ActorInitializer init, ProvidesDelayedPrerequisiteInfo info) - : base(info) - { - prerequisite = info.Prerequisite; - - if (string.IsNullOrEmpty(prerequisite)) - prerequisite = init.Self.Info.Name; - - faction = init.GetValue(init.Self.Owner.Faction.InternalName); - } - - public IEnumerable ProvidesPrerequisites - { - get - { - if (!enabled) - yield break; - - yield return prerequisite; - } - } - - protected override void Created(Actor self) - { - // Special case handling is required for the Player actor. - // Created is called before Player.PlayerActor is assigned, - // so we must query other player traits from self, knowing that - // it refers to the same actor as self.Owner.PlayerActor - var playerActor = self.Info.Name == "player" ? self : self.Owner.PlayerActor; - - techTree = playerActor.Trait(); - - base.Created(self); - - self.World.AddFrameEndTask(w => - { - Reset(self); - }); - } - - void ITick.Tick(Actor self) - { - if (IsTraitDisabled) - return; - - if (--remainingDelay == 0) - { - Update(); - if (enabled) - techTree.ActorChanged(self); - if (Info.Notification != null && enabled) - Game.Sound.PlayNotification(self.World.Map.Rules, self.Owner, "Speech", Info.Notification, self.Owner.Faction.InternalName); - } - } - - void Reset(Actor self) - { - enabled = false; - remainingDelay = Info.Delay; - techTree.ActorChanged(self); - } - - void Update() - { - if (IsTraitDisabled && Info.FullDisable) - { - enabled = false; - return; - } - - enabled = remainingDelay <= 0; - - if (Info.Factions.Any()) - enabled = Info.Factions.Contains(faction); - - if (Info.RequiresPrerequisites.Any() && enabled) - enabled = techTree.HasPrerequisites(Info.RequiresPrerequisites); - } - - public void OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) - { - techTree = newOwner.PlayerActor.Trait(); - - if (Info.ResetOnOwnerChange) - { - faction = newOwner.Faction.InternalName; - Reset(self); - } - } - - protected override void TraitEnabled(Actor self) - { - Update(); - techTree.ActorChanged(self); - } - - protected override void TraitDisabled(Actor self) - { - Update(); - techTree.ActorChanged(self); - } - - float ISelectionBar.GetValue() - { - if (!Info.ShowSelectionBar || remainingDelay <= 0) - return 0; - - var maxTicks = Info.Delay; - - if (remainingDelay == maxTicks) - return 0; - - return (float)(maxTicks - remainingDelay) / maxTicks; - } - - bool ISelectionBar.DisplayWhenEmpty { get { return false; } } - - Color ISelectionBar.GetColor() { return Info.SelectionBarColor; } - } -} diff --git a/OpenRA.Mods.CA/Traits/Player/ProvidesPrerequisiteIfAlliesExist.cs b/OpenRA.Mods.CA/Traits/Player/ProvidesPrerequisiteIfAlliesExist.cs new file mode 100644 index 0000000000..5626f8eede --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Player/ProvidesPrerequisiteIfAlliesExist.cs @@ -0,0 +1,77 @@ +#region Copyright & License Information +/* + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Provides a prerequisite if one or more allies exist.")] + public class ProvidesPrerequisiteIfAlliesExistInfo : TraitInfo, ITechTreePrerequisiteInfo + { + [FieldLoader.Require] + [Desc("The prerequisite to provide when allies exist.")] + public readonly string Prerequisite = null; + + [Desc("Count non-playable players as allies.")] + public readonly bool CountNonPlayable = false; + + [Desc("Count bots as allies.")] + public readonly bool CountBots = false; + + [Desc("Count spectators as allies.")] + public readonly bool CountSpectators = false; + + [Desc("Minimum number of allies required to provide the prerequisite.")] + public readonly int MinimumAllies = 1; + + IEnumerable ITechTreePrerequisiteInfo.Prerequisites(ActorInfo info) + { + yield return Prerequisite; + } + + public override object Create(ActorInitializer init) { return new ProvidesPrerequisiteIfAlliesExist(init, this); } + } + + public class ProvidesPrerequisiteIfAlliesExist : ITechTreePrerequisite, INotifyCreated + { + public readonly ProvidesPrerequisiteIfAlliesExistInfo Info; + bool prerequisiteGranted; + + public ProvidesPrerequisiteIfAlliesExist(ActorInitializer init, ProvidesPrerequisiteIfAlliesExistInfo info) + { + Info = info; + prerequisiteGranted = false; + } + + public IEnumerable ProvidesPrerequisites + { + get + { + if (prerequisiteGranted) + yield return Info.Prerequisite; + } + } + + void INotifyCreated.Created(Actor self) + { + var allyCount = self.World.Players.Count(p => p != self.Owner + && p.IsAlliedWith(self.Owner) + && (Info.CountSpectators || !p.Spectating) + && (Info.CountBots || !p.IsBot) + && (Info.CountNonPlayable || p.Playable) + ); + + prerequisiteGranted = allyCount >= Info.MinimumAllies; + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Player/ProvidesPrerequisiteValidatedFaction.cs b/OpenRA.Mods.CA/Traits/Player/ProvidesPrerequisiteValidatedFaction.cs index 8f625f0b1d..79299f2e9c 100644 --- a/OpenRA.Mods.CA/Traits/Player/ProvidesPrerequisiteValidatedFaction.cs +++ b/OpenRA.Mods.CA/Traits/Player/ProvidesPrerequisiteValidatedFaction.cs @@ -1,11 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -84,10 +83,15 @@ protected override void Created(Actor self) // if ValidFactions trait is present and the current faction is not listed in it, switch the faction to a valid one if a player of that faction exists in the game if ( validFactions != null - && Info.Factions.Any() + && Info.Factions.Count > 0 && !validFactions.Info.Factions.Contains(faction)) { - var players = self.World.Players.Where(p => !p.NonCombatant && p.Playable); + var capturedFactionManager = playerActor.TraitOrDefault(); + var capturedFactions = capturedFactionManager != null ? capturedFactionManager.Factions : new HashSet(); + var players = self.World.Players + .Where(p => !p.NonCombatant && p.Playable) + .OrderByDescending(p => p.Faction.InternalName == playerActor.Owner.Faction.InternalName) + .ThenByDescending(p => capturedFactions.Contains(p.Faction.InternalName)); foreach (var p in players) { @@ -120,10 +124,10 @@ void Update() if (IsTraitDisabled) return; - if (Info.Factions.Any()) + if (Info.Factions.Count > 0) enabled = Info.Factions.Contains(faction); - if (Info.RequiresPrerequisites.Any() && enabled) + if (Info.RequiresPrerequisites.Length > 0 && enabled) enabled = techTree.HasPrerequisites(Info.RequiresPrerequisites); } diff --git a/OpenRA.Mods.CA/Traits/Player/ProvidesPrerequisitesOnCount.cs b/OpenRA.Mods.CA/Traits/Player/ProvidesPrerequisitesOnCount.cs new file mode 100644 index 0000000000..932715024a --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Player/ProvidesPrerequisitesOnCount.cs @@ -0,0 +1,300 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Linq; +using OpenRA.Mods.Common; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [TraitLocation(SystemActors.Player)] + public class ProvidesPrerequisitesOnCountInfo : TraitInfo, ITechTreePrerequisiteInfo + { + [Desc("Identifier for the counts.")] + [FieldLoader.Require] + public readonly string Type; + + [Desc("Prerequisites provided at specific counts.")] + public readonly Dictionary Prerequisites = null; + + [Desc("List of factions that can affect this count. Leave blank for any faction.")] + public readonly string[] Factions = Array.Empty(); + + [Desc("If true, prerequisites are permanent once reached.")] + public readonly bool PermanentWhenReached = false; + + [Desc("If true, prerequisites are permanent once reached if specified upgrade is acquired.")] + public readonly string[] PermanentAfterUpgrades = null; + + [Desc("Speech notifications to play when player reaches specific counts.")] + public readonly Dictionary CountReachedNotifications = null; + + [Desc("Text notifications to display when player reaches specific counts.")] + public readonly Dictionary CountReachedTextNotifications = null; + + [Desc("Ticks before playing notification.")] + public readonly int NotificationDelay = 0; + + [Desc("Actor to spawn when player reaches the required count.")] + [ActorReference] + public readonly string DummyActor = null; + + [NotificationReference("Sounds")] + [Desc("Sound notification to play when count is incremented.")] + public readonly string IncrementSound = null; + + [Desc("If true, adds the to the observer Upgrades tab.")] + public readonly bool AddToUpgradesTab = false; + + IEnumerable ITechTreePrerequisiteInfo.Prerequisites(ActorInfo info) + { + return Prerequisites.Values; + } + + public override object Create(ActorInitializer init) { return new ProvidesPrerequisitesOnCount(init, this); } + } + + public class ProvidesPrerequisitesOnCount : ITechTreePrerequisite, INotifyCreated, ITick + { + public readonly ProvidesPrerequisitesOnCountInfo Info; + readonly Actor self; + readonly HashSet prerequisitesGranted; + TechTree techTree; + CountManager countManager; + UpgradesManager upgradesManager; + + public int CurrentCount + { + get + { + if (countManager != null && countManager.Counts.TryGetValue(Info.Type, out var count)) + return count; + return 0; + } + } + + readonly HashSet thresholdsPassed; + readonly HashSet permanentPrerequisites; + + string speechNotificationQueued; + string textNotificationQueued; + int ticksUntilNotification; + bool dummyActorQueued; + int ticksUntilSpawnDummyActor; + + public event Action Incremented; + public event Action Decremented; + public event Action CountThresholdReached; + public event Action PermanentlyGranted; + + public ProvidesPrerequisitesOnCount(ActorInitializer init, ProvidesPrerequisitesOnCountInfo info) + { + Info = info; + self = init.Self; + ticksUntilNotification = info.NotificationDelay; + prerequisitesGranted = new HashSet(); + thresholdsPassed = new HashSet(); + permanentPrerequisites = new HashSet(); + + var player = self.Owner; + Enabled = info.Factions.Length == 0 || info.Factions.Contains(player.Faction.InternalName); + } + + public bool Enabled { get; } + + public string[] Factions => Info.Factions; + + public IEnumerable ProvidesPrerequisites => prerequisitesGranted; + + void INotifyCreated.Created(Actor self) + { + // Special case handling is required for the Player actor. + // Created is called before Player.PlayerActor is assigned, + // so we must query other player traits from self, knowing that + // it refers to the same actor as self.Owner.PlayerActor + var playerActor = self.Info.Name == "player" ? self : self.Owner.PlayerActor; + techTree = playerActor.Trait(); + techTree.ActorChanged(self); + countManager = playerActor.Trait(); + upgradesManager = playerActor.Trait(); + countManager.Incremented += HandleIncremented; + countManager.Decremented += HandleDecremented; + upgradesManager.UpgradeCompleted += HandleUpgrade; + } + + void ITick.Tick(Actor self) + { + if (!Enabled) + return; + + if ((speechNotificationQueued != null || textNotificationQueued != null) && --ticksUntilNotification <= 0) + { + if (speechNotificationQueued != null) + { + Game.Sound.PlayNotification(self.World.Map.Rules, self.Owner, "Speech", speechNotificationQueued, self.Owner.Faction.InternalName); + speechNotificationQueued = null; + } + + if (textNotificationQueued != null) + { + TextNotificationsManager.AddTransientLine(self.Owner, textNotificationQueued); + textNotificationQueued = null; + } + + ticksUntilNotification = Info.NotificationDelay; + } + + if (dummyActorQueued && --ticksUntilSpawnDummyActor <= 0) + { + self.World.AddFrameEndTask(w => + { + w.CreateActor(Info.DummyActor, new TypeDictionary + { + new ParentActorInit(self), + new LocationInit(CPos.Zero), + new OwnerInit(self.Owner), + new FacingInit(WAngle.Zero), + }); + }); + + dummyActorQueued = false; + } + } + + void HandleCountThreshold(int count) + { + if (Info.Prerequisites == null || !Info.Prerequisites.ContainsKey(count) || thresholdsPassed.Contains(count)) + return; + + thresholdsPassed.Add(count); + var prerequisite = Info.Prerequisites[count]; + + if (prerequisitesGranted.Add(prerequisite)) + { + techTree.ActorChanged(self); + + // If there's an actor that represents the prerequisite, add it to the build order + if (Info.AddToUpgradesTab && self.World.Map.Rules.Actors.ContainsKey(prerequisite)) + upgradesManager.UpgradeProviderCreated(prerequisite); + + CountThresholdReached?.Invoke(count); + + // Queue count-specific notifications if available + if (Info.CountReachedNotifications != null && Info.CountReachedNotifications.TryGetValue(count, out var speechNotification)) + speechNotificationQueued = speechNotification; + + if (Info.CountReachedTextNotifications != null && Info.CountReachedTextNotifications.TryGetValue(count, out var textNotification)) + textNotificationQueued = textNotification; + + // Queue notifications if we have any to play + if (speechNotificationQueued != null || textNotificationQueued != null) + { + ticksUntilNotification = Info.NotificationDelay > 0 ? Info.NotificationDelay : 1; + } + + if (Info.DummyActor != null) + { + dummyActorQueued = true; + ticksUntilSpawnDummyActor = 1; + } + + // Mark prerequisite as permanent if PermanentWhenReached is true + if (Info.PermanentWhenReached) + { + permanentPrerequisites.Add(prerequisite); + PermanentlyGranted?.Invoke(null); + } + } + } + + // Invoked by CountManager when a count is incremented + void HandleIncremented(string type, int newCount) + { + if (!Enabled || type != Info.Type) + return; + + var maxThreshold = Info.Prerequisites.Keys.Max(); + + if (newCount > maxThreshold) + return; + + // Return early if all prerequisites have been permanently unlocked + if (Info.Prerequisites != null && Info.Prerequisites.Values.All(prerequisite => permanentPrerequisites.Contains(prerequisite))) + return; + + techTree.ActorChanged(self); + + Incremented?.Invoke(); + + // Play increment sound if we haven't exceeded the maximum threshold + if (Info.IncrementSound != null && Info.Prerequisites != null) + { + Game.Sound.PlayNotification(self.World.Map.Rules, self.Owner, "Sounds", Info.IncrementSound, self.Owner.Faction.InternalName); + } + + HandleCountThreshold(newCount); + } + + // Invoked by CountManager when a count is decremented + void HandleDecremented(string type, int newCount) + { + if (!Enabled || type != Info.Type) + return; + + // Remove prerequisites that are no longer valid due to count decrease + // but keep permanent prerequisites + if (Info.Prerequisites != null) + { + var prerequisitesToRemove = new List(); + + foreach (var kvp in Info.Prerequisites) + { + var count = kvp.Key; + var prerequisite = kvp.Value; + + // If the count threshold is no longer met and the prerequisite is not permanent, remove it + if (newCount < count && prerequisitesGranted.Contains(prerequisite) && !permanentPrerequisites.Contains(prerequisite)) + { + prerequisitesToRemove.Add(prerequisite); + thresholdsPassed.Remove(count); + } + } + + foreach (var prerequisite in prerequisitesToRemove) + { + prerequisitesGranted.Remove(prerequisite); + } + + if (prerequisitesToRemove.Count > 0) + techTree.ActorChanged(self); + } + + Decremented?.Invoke(); + } + + void HandleUpgrade(string type) + { + if (!Enabled || Info.PermanentAfterUpgrades == null || !Info.PermanentAfterUpgrades.Contains(type)) + return; + + // Mark all currently granted prerequisites as permanent + foreach (var prerequisite in prerequisitesGranted.ToArray()) + { + permanentPrerequisites.Add(prerequisite); + } + + PermanentlyGranted?.Invoke(type); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Player/ProvidesPrerequisitesOnTimeline.cs b/OpenRA.Mods.CA/Traits/Player/ProvidesPrerequisitesOnTimeline.cs new file mode 100644 index 0000000000..0085adc5fd --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Player/ProvidesPrerequisitesOnTimeline.cs @@ -0,0 +1,229 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Linq; +using OpenRA.Mods.Common; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [TraitLocation(SystemActors.Player)] + public class ProvidesPrerequisitesOnTimelineInfo : PausableConditionalTraitInfo, ITechTreePrerequisiteInfo + { + [Desc("Identifier.")] + [FieldLoader.Require] + public readonly string Type = null; + + [Desc("Prerequisites provided at specific tick counts.")] + public readonly Dictionary Prerequisites = null; + + [Desc("List of factions that can affect this count. Leave blank for any faction.")] + public readonly string[] Factions = { }; + + [Desc("Speech notification to play when player reaches the required count.")] + public readonly Dictionary PrerequisiteGrantedNotifications = null; + + [Desc("Text notification to display when player reaches the required count.")] + public readonly string PrerequisiteGrantedTextNotification = null; + + [Desc("Ticks before playing notification.")] + public readonly int NotificationDelay = 0; + + [Desc("Actor to spawn when player levels up.")] + [ActorReference] + public readonly string DummyActor = null; + + [NotificationReference("Sounds")] + [Desc("Sound notification to play when count is incremented.")] + public readonly string PrerequisiteGrantedSound = null; + + IEnumerable ITechTreePrerequisiteInfo.Prerequisites(ActorInfo info) + { + return Prerequisites.Values; + } + + public override object Create(ActorInitializer init) { return new ProvidesPrerequisitesOnTimeline(init, this); } + } + + public class ProvidesPrerequisitesOnTimeline : PausableConditionalTrait, ITechTreePrerequisite, INotifyCreated, ITick + { + public readonly ProvidesPrerequisitesOnTimelineInfo info; + readonly Actor self; + readonly HashSet prerequisitesGranted; + readonly bool validFaction; + TechTree techTree; + UpgradesManager upgradesManager; + + int ticksElapsed; + HashSet thresholdsPassed; + string notificationQueued; + int ticksUntilNotification; + bool dummyActorQueued; + int ticksUntilSpawnDummyActor; + + public event Action TicksChanged; + + public ProvidesPrerequisitesOnTimeline(ActorInitializer init, ProvidesPrerequisitesOnTimelineInfo info) + : base(info) + { + this.info = info; + self = init.Self; + ticksElapsed = 0; + ticksUntilNotification = info.NotificationDelay; + prerequisitesGranted = new HashSet(); + thresholdsPassed = new HashSet(); + + var player = self.Owner; + validFaction = info.Factions.Length == 0 || info.Factions.Contains(player.Faction.InternalName); + } + + public int MaxTicks => info.Prerequisites?.Keys.Max() ?? 0; + public bool Enabled => validFaction && !IsTraitDisabled; + public int TicksElapsed => ticksElapsed; + public int TicksRemaining => MaxTicks - ticksElapsed; + public int[] Thresholds => info.Prerequisites?.Keys.ToArray() ?? Array.Empty(); + public int ThresholdsPassed => thresholdsPassed.Count; + + public int TicksUntilNextThreshold + { + get + { + if (info.Prerequisites == null || !info.Prerequisites.Any()) + return 0; + + var nextThreshold = info.Prerequisites.Keys + .Where(t => t > ticksElapsed) + .OrderBy(t => t) + .FirstOrDefault(); + + if (nextThreshold == 0) + return 0; + + return nextThreshold - ticksElapsed; + } + } + + public string[] Factions => info.Factions; + + IEnumerable ITechTreePrerequisite.ProvidesPrerequisites => prerequisitesGranted; + + void INotifyCreated.Created(Actor self) + { + // Special case handling is required for the Player actor. + // Created is called before Player.PlayerActor is assigned, + // so we must query other player traits from self, knowing that + // it refers to the same actor as self.Owner.PlayerActor + var playerActor = self.Info.Name == "player" ? self : self.Owner.PlayerActor; + techTree = playerActor.Trait(); + techTree.ActorChanged(self); + upgradesManager = playerActor.Trait(); + } + + void HandlePrerequisiteThreshold(int tick) + { + if (info.Prerequisites == null || !info.Prerequisites.ContainsKey(tick) || thresholdsPassed.Contains(tick)) + return; + + thresholdsPassed.Add(tick); + var prerequisite = info.Prerequisites[tick]; + + if (prerequisitesGranted.Add(prerequisite)) + { + techTree.ActorChanged(self); + + // if there's an actor that represents the prerequisite, add it to the build order + if (self.World.Map.Rules.Actors.ContainsKey(prerequisite)) + upgradesManager.UpgradeProviderCreated(prerequisite); + + if (info.PrerequisiteGrantedSound != null) + Game.Sound.PlayNotification(self.World.Map.Rules, self.Owner, "Sounds", + info.PrerequisiteGrantedSound, self.Owner.Faction.InternalName); + + if (info.DummyActor != null) + { + if (info.PrerequisiteGrantedNotifications != null && info.PrerequisiteGrantedNotifications.TryGetValue(tick, out var value)) + notificationQueued = value; + + dummyActorQueued = true; + ticksUntilSpawnDummyActor = 1; + } + } + } + + void ITick.Tick(Actor self) + { + if (!Enabled || IsTraitDisabled || IsTraitPaused) + return; + + var previousTicks = ticksElapsed; + + if (ticksElapsed < MaxTicks) + { + ticksElapsed++; + + if (previousTicks != ticksElapsed) + TicksChanged?.Invoke(ticksElapsed); + + HandlePrerequisiteThreshold(ticksElapsed); + } + + if (notificationQueued != null && --ticksUntilNotification <= 0) + { + Game.Sound.PlayNotification(self.World.Map.Rules, self.Owner, "Speech", notificationQueued, self.Owner.Faction.InternalName); + + if (info.PrerequisiteGrantedTextNotification != null) + TextNotificationsManager.AddTransientLine(self.Owner, info.PrerequisiteGrantedTextNotification); + + notificationQueued = null; + ticksUntilNotification = info.NotificationDelay; + } + + if (dummyActorQueued && --ticksUntilSpawnDummyActor <= 0) + { + self.World.AddFrameEndTask(w => + { + w.CreateActor(info.DummyActor, new TypeDictionary + { + new ParentActorInit(self), + new LocationInit(CPos.Zero), + new OwnerInit(self.Owner), + new FacingInit(WAngle.Zero), + }); + }); + } + } + + public void AddTicks(int ticks) + { + if (!Enabled || ticks <= 0) + return; + + var initialTicks = ticksElapsed; + + ticksElapsed = Math.Min(ticksElapsed + ticks, MaxTicks); + + if (initialTicks == ticksElapsed) + return; + + if (initialTicks != ticksElapsed) + TicksChanged?.Invoke(ticksElapsed); + + if (info.Prerequisites != null) + { + for (int t = initialTicks + 1; t <= ticksElapsed; t++) + HandlePrerequisiteThreshold(t); + } + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Player/ReclaimableExperiencePool.cs b/OpenRA.Mods.CA/Traits/Player/ReclaimableExperiencePool.cs new file mode 100644 index 0000000000..012b89f3d6 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Player/ReclaimableExperiencePool.cs @@ -0,0 +1,57 @@ +#region Copyright & License Information +/* + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.Mods.Common; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [TraitLocation(SystemActors.Player)] + [Desc("A pool of experience that can be added to and taken from.")] + public class ReclaimableExperiencePoolInfo : TraitInfo + { + [Desc("Percentage modifier to apply when adding XP to the pool.")] + public readonly int Percentage = 100; + + public override object Create(ActorInitializer init) { return new ReclaimableExperiencePool(init, this); } + } + + public class ReclaimableExperiencePool + { + public readonly ReclaimableExperiencePoolInfo Info; + Dictionary> xpPool; + + public ReclaimableExperiencePool(ActorInitializer init, ReclaimableExperiencePoolInfo info) + { + Info = info; + xpPool = new Dictionary>(); + } + + public void AddXpToPool(string type, int amount) + { + if (!xpPool.ContainsKey(type)) + xpPool[type] = new List(); + + xpPool[type].Add(Util.ApplyPercentageModifiers(amount, new[] { Info.Percentage })); + } + + public int TakeXpFromPool(string type) + { + if (!xpPool.TryGetValue(type, out var value) || value.Count == 0) + return 0; + + int xp = value.Max(); + value.Remove(xp); + return xp; + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Player/ReclaimableValueProducer.cs b/OpenRA.Mods.CA/Traits/Player/ReclaimableValueProducer.cs new file mode 100644 index 0000000000..d070b0ad3a --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Player/ReclaimableValueProducer.cs @@ -0,0 +1,120 @@ +#region Copyright & License Information +/* + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Linq; +using OpenRA.Mods.Common; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [TraitLocation(SystemActors.Player)] + [Desc("Produces actors when enough reclaimable value is accumulated for the specified type.")] + public class ReclaimableValueProducerInfo : TraitInfo + { + [FieldLoader.Require] + [Desc("The type of reclaimable value pool to monitor.")] + public readonly string Type = null; + + [FieldLoader.Require] + [Desc("Actor types that can produce the unit (searched in order).")] + public readonly string[] ProducerActors = null; + + [FieldLoader.Require] + [ActorReference] + [Desc("Actor to produce when enough value is accumulated.")] + public readonly string ActorToProduce = null; + + [Desc("Required value to produce the actor. If not set, uses the Valued trait Cost of ActorToProduce.")] + public readonly int RequiredValue = -1; + + [Desc("Production type to use")] + public readonly HashSet ProductionTypes = new HashSet(); + + public override object Create(ActorInitializer init) { return new ReclaimableValueProducer(init, this); } + } + + public class ReclaimableValueProducer : INotifyCreated + { + public readonly ReclaimableValueProducerInfo Info; + Actor self; + int requiredValue; + int currentValue; + + public ReclaimableValueProducer(ActorInitializer init, ReclaimableValueProducerInfo info) + { + Info = info; + currentValue = 0; + } + + void INotifyCreated.Created(Actor self) + { + this.self = self; + + if (Info.RequiredValue < 0) + { + var actorInfo = self.World.Map.Rules.Actors[Info.ActorToProduce]; + var valued = actorInfo.TraitInfoOrDefault(); + if (valued == null) + throw new InvalidOperationException($"ReclaimableValueProducer for type '{Info.Type}' requires " + + $"ActorToProduce '{Info.ActorToProduce}' to have a Valued trait, or RequiredValue must be explicitly set."); + + requiredValue = valued.Cost; + } + else + requiredValue = Info.RequiredValue; + } + + public void AddValue(int amount) + { + currentValue += amount; + + if (currentValue >= requiredValue) + ProduceActor(); + } + + TraitPair? FindAvailableProducer() + { + var producer = self.World.ActorsWithTrait() + .FirstOrDefault(p => !p.Actor.IsDead + && p.Actor.IsInWorld + && p.Actor.Owner == self.Owner + && Info.ProducerActors.Contains(p.Actor.Info.Name) + && !p.Trait.IsTraitDisabled + && !p.Trait.IsTraitPaused + && Info.ProductionTypes.Any(t => p.Trait.Info.Produces.Contains(t))); + + if (producer.Trait != null) + return producer; + + return null; + } + + void ProduceActor() + { + var producer = FindAvailableProducer(); + if (producer == null) + return; + + var actorInfo = self.World.Map.Rules.Actors[Info.ActorToProduce]; + var inits = new TypeDictionary + { + new OwnerInit(self.Owner), + new FactionInit(BuildableInfo.GetInitialFaction(actorInfo, self.Owner.Faction.InternalName)) + }; + + if (producer.Value.Trait.Produce(producer.Value.Actor, actorInfo, Info.ProductionTypes.First(), inits, 0)) + currentValue -= requiredValue; + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Player/SupportPowerInstanceManager.cs b/OpenRA.Mods.CA/Traits/Player/SupportPowerInstanceManager.cs new file mode 100644 index 0000000000..b02ff6f4c1 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Player/SupportPowerInstanceManager.cs @@ -0,0 +1,27 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [TraitLocation(SystemActors.Player)] + [Desc("For storing global support power properties e.g. to limit the number of times timers are modified.")] + public class SupportPowerInstanceManagerInfo : TraitInfo + { + public override object Create(ActorInitializer init) { return new SupportPowerInstanceManager(); } + } + + public class SupportPowerInstanceManager + { + public readonly HashSet InitiallyFullyChargedPowers = new HashSet(); + } +} diff --git a/OpenRA.Mods.CA/Traits/Player/TeleportNetworkManager.cs b/OpenRA.Mods.CA/Traits/Player/TeleportNetworkManager.cs index 717b2c4e0b..37bf346df0 100644 --- a/OpenRA.Mods.CA/Traits/Player/TeleportNetworkManager.cs +++ b/OpenRA.Mods.CA/Traits/Player/TeleportNetworkManager.cs @@ -1,11 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2019-2020 The OpenHV Developers (see CREDITS) - * This file is part of OpenHV, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -14,6 +13,7 @@ namespace OpenRA.Mods.CA.Traits { + [TraitLocation(SystemActors.Player)] [Desc("This must be attached to player in order for TeleportNetwork to work.")] public class TeleportNetworkManagerInfo : TraitInfo, IRulesetLoaded { @@ -30,7 +30,7 @@ public void RulesetLoaded(Ruleset rules, ActorInfo ai) if (!teleporters.Any()) throw new YamlException("TeleportNetworkManager without TeleportNetwork actors."); if (!teleporters.Any(a => a.TraitInfo().Type == Type)) - throw new YamlException("Can't find a TeleportNetwork with Type '{0}'".F(Type)); + throw new YamlException($"Can't find a TeleportNetwork with Type '{Type}'"); } public override object Create(ActorInitializer init) { return new TeleportNetworkManager(this); } diff --git a/OpenRA.Mods.CA/Traits/Player/UpgradesManager.cs b/OpenRA.Mods.CA/Traits/Player/UpgradesManager.cs new file mode 100644 index 0000000000..1a932e6d7f --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Player/UpgradesManager.cs @@ -0,0 +1,139 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Linq; +using OpenRA.Mods.Common; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [TraitLocation(SystemActors.Player)] + [Desc("Manages unit upgrades.")] + public class UpgradesManagerInfo : TraitInfo + { + public override object Create(ActorInitializer init) { return new UpgradesManager(init.Self, this); } + } + + public class UpgradesManager + { + readonly Actor self; + Dictionary upgrades; + Dictionary> unlockedUpgradeTypes; + + public int Hash { get; private set; } + + public Dictionary> UnlockedUpgradeTypes => unlockedUpgradeTypes; + + public UpgradesManager(Actor self, UpgradesManagerInfo info) + { + this.self = self; + upgrades = new Dictionary(); + unlockedUpgradeTypes = new Dictionary>(); + Hash = 0; + } + + public event Action UpgradeCompleted; + + public UpgradeInfo UpgradeableActorCreated(Upgradeable upgradeable, string upgradeType, string sourceActorType, string targetActorType, int cost, int buildDuration, int buildDurationModifier) + { + if (!upgrades.ContainsKey(upgradeType)) + { + var upgradeInfo = GetUpgradeInfo(sourceActorType, targetActorType, cost, buildDuration, buildDurationModifier); + upgrades.Add(upgradeType, upgradeInfo); + } + + if (IsUnlocked(upgradeType)) + upgradeable.Unlock(); + + return upgrades[upgradeType]; + } + + public void UpgradeProviderCreated(string type) + { + if (IsUnlocked(type)) + unlockedUpgradeTypes[type].Add(self.World.WorldTick); + else + { + unlockedUpgradeTypes.Add(type, new List { self.World.WorldTick }); + var upgradeables = self.World.ActorsWithTrait().Where(x => x.Trait.Info.Type == type && x.Actor.Owner == self.Owner).ToList(); + + foreach (var p in upgradeables) + p.Trait.Unlock(); + } + + UpgradeCompleted?.Invoke(type); + Update(); + } + + public bool IsUnlocked(string upgradeType) + { + return unlockedUpgradeTypes.ContainsKey(upgradeType); + } + + UpgradeInfo GetUpgradeInfo(string sourceActorType, string targetActorType, int cost, int buildDuration, int buildDurationModifier) + { + if (cost == -1) + cost = CalculateCost(sourceActorType, targetActorType); + + if (buildDuration == -1) + buildDuration = CalculateBuildDuration(cost, buildDurationModifier); + + var upgradeInfo = new UpgradeInfo() + { + Cost = cost, + BuildDuration = buildDuration, + }; + + if (targetActorType != null && self.World.Map.Rules.Actors.ContainsKey(targetActorType)) + { + var targetActorInfo = self.World.Map.Rules.Actors[targetActorType]; + var tooltip = targetActorInfo.TraitInfoOrDefault(); + if (tooltip != null) + upgradeInfo.ActorName = tooltip.Name; + } + + return upgradeInfo; + } + + int CalculateCost(string sourceActorType, string targetActorType) + { + if (targetActorType == null) + return 0; + + var sourceActorInfo = self.World.Map.Rules.Actors[sourceActorType]; + var sourceActorValued = sourceActorInfo.TraitInfoOrDefault(); + var sourceActorCost = sourceActorValued?.Cost ?? 0; + var targetActorInfo = self.World.Map.Rules.Actors[targetActorType]; + var targetActorValued = targetActorInfo.TraitInfoOrDefault(); + var targetActorCost = targetActorValued?.Cost ?? 0; + return targetActorCost - sourceActorCost; + } + + int CalculateBuildDuration(int cost, int buildDurationModifier) + { + return Util.ApplyPercentageModifiers(cost, new int[] { buildDurationModifier }); + } + + public void Update() + { + Hash = Hash + 1; + } + } + + public class UpgradeInfo + { + public int Cost { get; set; } + public int BuildDuration { get; set; } + public string ActorName { get; set; } + } +} diff --git a/OpenRA.Mods.CA/Traits/PointDefense.cs b/OpenRA.Mods.CA/Traits/PointDefense.cs index 095975c4e9..b0c6073c65 100644 --- a/OpenRA.Mods.CA/Traits/PointDefense.cs +++ b/OpenRA.Mods.CA/Traits/PointDefense.cs @@ -1,15 +1,18 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion using System.Linq; +using OpenRA.GameRules; +using OpenRA.Mods.Common; using OpenRA.Mods.Common.Traits; +using OpenRA.Mods.Common.Warheads; using OpenRA.Primitives; using OpenRA.Traits; @@ -24,7 +27,7 @@ public class PointDefenseInfo : ConditionalTraitInfo, Requires [FieldLoader.Require] [Desc("What kind of projectiles can this actor shoot at.")] - public readonly BitSet PointDefenseTypes = default(BitSet); + public readonly BitSet PointDefenseTypes = default; [Desc("What diplomatic stances are affected.")] public readonly PlayerRelationship ValidRelationships = PlayerRelationship.Neutral | PlayerRelationship.Enemy; @@ -37,6 +40,8 @@ public class PointDefense : ConditionalTrait, IPointDefense, I readonly Actor self; readonly PointDefenseInfo info; readonly Armament armament; + INotifyPointDefenseHit[] notifyHit; + IDamageModifier[] damageModifiers; bool hasFiredThisTick = false; @@ -48,17 +53,27 @@ public PointDefense(Actor self, PointDefenseInfo info) armament = self.TraitsImplementing().First(a => a.Info.Name == info.Armament); } + protected override void Created(Actor self) + { + base.Created(self); + notifyHit = self.TraitsImplementing().ToArray(); + damageModifiers = self.TraitsImplementing().ToArray(); + } + void ITick.Tick(Actor self) { hasFiredThisTick = false; } - bool IPointDefense.Destroy(WPos position, Player attacker, string type) + bool IPointDefense.Destroy(WPos position, Player attacker, string type, ProjectileArgs args) { if (IsTraitDisabled || armament.IsTraitDisabled || armament.IsTraitPaused || hasFiredThisTick) return false; - if (!info.ValidRelationships.HasStance(self.Owner.RelationshipWith(attacker))) + if (!info.ValidRelationships.HasRelationship(self.Owner.RelationshipWith(attacker))) + return false; + + if (!info.PointDefenseTypes.Contains(type)) return false; if (armament.IsReloading) @@ -73,9 +88,35 @@ bool IPointDefense.Destroy(WPos position, Player attacker, string type) hasFiredThisTick = true; self.World.AddFrameEndTask(w => { - if (!self.IsDead) - armament.CheckFire(self, null, Target.FromPos(position)); + if (self.IsDead) + return; + + var armor = self.TraitsImplementing().Where(a => !a.IsTraitDisabled && a.Info.Type != null); + var damage = 0; + foreach (var wh in args.Weapon.Warheads) + { + if (wh is DamageWarhead) + { + var warhead = (DamageWarhead)wh; + var armorModifiers = armor.Where(a => warhead.Versus.ContainsKey(a.Info.Type)) + .Select(a => warhead.Versus[a.Info.Type]); + + // todo: exclude point defense shield modifier in a better way + var otherModifiers = damageModifiers.Where(dm => !(dm is TimedDamageMultiplier)) + .Select(d => d.GetDamageModifier(args.SourceActor, new Damage(warhead.Damage, warhead.DamageTypes))) + .Where(d => d != 100); + + var modifiers = armorModifiers.Concat(otherModifiers).Concat(args.DamageModifiers).ToArray(); + + damage += Util.ApplyPercentageModifiers(warhead.Damage, modifiers); + } + } + + if (armament.CheckFire(self, null, Target.FromPos(position))) + foreach (var notify in notifyHit) + notify.Hit(damage); }); + return true; } } diff --git a/OpenRA.Mods.CA/Traits/PopControlled.cs b/OpenRA.Mods.CA/Traits/PopControlled.cs index 17ad58bf0b..d04a8705a2 100644 --- a/OpenRA.Mods.CA/Traits/PopControlled.cs +++ b/OpenRA.Mods.CA/Traits/PopControlled.cs @@ -1,18 +1,13 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion -using System; -using System.Collections.Generic; -using System.Linq; -using OpenRA.Mods.Common.Traits; using OpenRA.Primitives; using OpenRA.Traits; @@ -21,60 +16,45 @@ namespace OpenRA.Mods.CA.Traits [Desc("Population control for an actor type.")] public class PopControlledInfo : TraitInfo { - [Desc("Population limit.")] - public readonly int Limit = 2; + [Desc("The type of pop control (defaults to the actor name).")] + public readonly string Type = null; [Desc("Remove the actor from the world (and destroy it) instead of killing it.")] public readonly bool RemoveInstead = false; [Desc("Types of damage that this trait causes. Leave empty for no damage types.")] - public readonly BitSet DamageTypes = default(BitSet); + public readonly BitSet DamageTypes = default; - public override object Create(ActorInitializer init) { return new PopControlled(init, this); } + public override object Create(ActorInitializer init) { return new PopControlled(this); } } - public class PopControlled : INotifyCreated + public class PopControlled : INotifyCreated, INotifyOwnerChanged { - readonly PopControlledInfo i; - Actor self; + readonly PopControlledInfo info; + PopController controller; - public PopControlled(ActorInitializer init, PopControlledInfo info) + public PopControlledInfo Info => info; + + public PopControlled(PopControlledInfo info) { - i = info; - self = init.Self; + this.info = info; } void INotifyCreated.Created(Actor self) { - var instances = self.World.Actors.Where(a => !a.IsDead && a.Owner == self.Owner && - a.Info.Name == self.Info.Name).ToList(); - - if (instances.Count < i.Limit) - return; - - var numToRemove = (instances.Count + 1) - i.Limit; - - for (var i = 0; i < numToRemove; i++) - { - var instance = instances.FirstOrDefault(); - if (instance != null) - { - var popControlled = instance.TraitOrDefault(); - if (popControlled != null) - popControlled.Kill(instance); - } - } + UpdateController(self.Owner); + controller.Update(self, info.Type); } - void Kill(Actor self) + void INotifyOwnerChanged.OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) { - if (self.IsDead) - return; + UpdateController(newOwner); + controller.Update(self, info.Type); + } - if (i.RemoveInstead || !self.Info.HasTraitInfo()) - self.Dispose(); - else - self.Kill(self, i.DamageTypes); + void UpdateController(Player owner) + { + controller = owner.PlayerActor.Trait(); } } } diff --git a/OpenRA.Mods.CA/Traits/PortableChronoCA.cs b/OpenRA.Mods.CA/Traits/PortableChronoCA.cs index bcc8426506..bc88b0c358 100644 --- a/OpenRA.Mods.CA/Traits/PortableChronoCA.cs +++ b/OpenRA.Mods.CA/Traits/PortableChronoCA.cs @@ -1,17 +1,20 @@ #region Copyright & License Information -/* - * Copyright 2007-2018 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion +using System; using System.Collections.Generic; +using System.Linq; +using System.Threading; using OpenRA.Graphics; using OpenRA.Mods.CA.Activities; +using OpenRA.Mods.Common.Activities; using OpenRA.Mods.Common.Graphics; using OpenRA.Mods.Common.Orders; using OpenRA.Mods.Common.Traits; @@ -20,7 +23,8 @@ namespace OpenRA.Mods.CA.Traits { - class PortableChronoCAInfo : ConditionalTraitInfo + [Desc("CA version makes trait conditional and allows for a condition applied upon teleporting, and allows use of ammo pool for multiple charges.")] + class PortableChronoCAInfo : PausableConditionalTraitInfo, Requires { [Desc("Cooldown in ticks until the unit can teleport.")] public readonly int ChargeDelay = 500; @@ -34,15 +38,19 @@ class PortableChronoCAInfo : ConditionalTraitInfo [Desc("Sound to play when teleporting.")] public readonly string ChronoshiftSound = "chrotnk1.aud"; + [CursorReference] [Desc("Cursor to display when able to deploy the actor.")] public readonly string DeployCursor = "deploy"; + [CursorReference] [Desc("Cursor to display when unable to deploy the actor.")] public readonly string DeployBlockedCursor = "deploy-blocked"; + [CursorReference] [Desc("Cursor to display when targeting a teleport location.")] public readonly string TargetCursor = "chrono-target"; + [CursorReference] [Desc("Cursor to display when the targeted location is blocked.")] public readonly string TargetBlockedCursor = "move-blocked"; @@ -74,34 +82,151 @@ class PortableChronoCAInfo : ConditionalTraitInfo [Desc("Range circle border width.")] public readonly float CircleBorderWidth = 3; - public override object Create(ActorInitializer init) { return new PortableChronoCA(this); } + [Desc("Color to use for the target line.")] + public readonly Color TargetLineColor = Color.LawnGreen; + + [Desc("Number of charges.")] + public readonly int Charges = 1; + + [Desc("If true, gain max charges after recharging.")] + public readonly bool RechargeToMax = false; + + [Desc("If true recharge will reset any ongoing recharge on teleport.")] + public readonly bool ResetRechargeOnUse = true; + + [Desc("Cooldown between jumps (irrespective of charge).")] + public readonly int Cooldown = 0; + + public readonly bool ShowSelectionBar = true; + public readonly bool ShowSelectionBarWhenFull = true; + + [Desc("Selection bar color.")] + public readonly Color SelectionBarColor = Color.Magenta; + + public readonly bool ShowCooldownSelectionBar = false; + + [Desc("Cooldown selection bar color.")] + public readonly Color CooldownSelectionBarColor = Color.Silver; + + [Desc("Whether to allow teleporting to destination cells that contain actors.")] + public readonly bool RequireEmptyDestination = false; + + [CursorReference] + [Desc("Cursor to display when targeting a teleport location with modifier key held.")] + public readonly string TargetModifiedCursor = null; + + [Desc("The maximum distance that can be teleported instantly. Use zero to match MaxDistance.")] + public readonly int MaxInstantDistance = 0; + + [GrantedConditionReference] + [Desc("Condition to grant while charging.")] + public readonly string PreChargeCondition = null; + + [Desc("If teleporting beyond MaxInstantDistance, the ticks per cell of charge up time before teleport occurs.")] + public readonly int PreChargeTicksPerCell = 0; + + [Desc("Maximum ticks of charge up time.")] + public readonly int MaxPreChargeTicks = 0; + + [Desc("Max instant range circle color.")] + public readonly Color MaxInstantCircleColor = Color.FromArgb(128, Color.LawnGreen); + + [Desc("Max instant range circle border color.")] + public readonly Color MaxInstantCircleBorderColor = Color.FromArgb(96, Color.Black); + + [Desc("Color to use for the pre-charge selection bar.")] + public readonly Color PreChargeSelectionBarColor = Color.Cyan; + + public override object Create(ActorInitializer init) { return new PortableChronoCA(init.Self, this); } } - class PortableChronoCA : ConditionalTrait, IIssueOrder, IResolveOrder, ITick, ISelectionBar, IOrderVoice, ISync + class PortableChronoCA : PausableConditionalTrait, IIssueOrder, IResolveOrder, ITick, ISelectionBar, IOrderVoice, ISync, IIssueDeployOrder { + public readonly new PortableChronoCAInfo Info; + readonly IMove move; + [Sync] int chargeTick = 0; [Sync] int conditionTicks = 0; + int cooldownTicks = 0; + int preChargeTicks = 0; + int maxPreChargeTicks = 0; int token = Actor.InvalidConditionToken; + int preChargeToken = Actor.InvalidConditionToken; + IPortableChronoModifier[] modifiers; + + public int ChargeDelay { get; private set; } + public int MaxDistance { get; private set; } + public int MaxCharges { get; private set; } + public int Charges { get; private set; } + + public PortableChronoCA(Actor self, PortableChronoCAInfo info) + : base(info) + { + Info = info; + move = self.Trait(); + ChargeDelay = Info.ChargeDelay; + MaxDistance = Info.MaxDistance; + MaxCharges = Info.Charges; + Charges = Info.Charges; + } - public PortableChronoCA(PortableChronoCAInfo info) - : base(info) { } + protected override void Created(Actor self) + { + modifiers = self.TraitsImplementing().ToArray(); + } void ITick.Tick(Actor self) { - if (IsTraitDisabled) + if (IsTraitDisabled || IsTraitPaused) return; + if (preChargeTicks > 0) + preChargeTicks--; + + if (cooldownTicks > 0) + cooldownTicks--; + if (chargeTick > 0) + { chargeTick--; + if (chargeTick == 0) + { + if (Info.RechargeToMax) + { + Charges = MaxCharges; + } + else + { + if (Charges < MaxCharges) + Charges++; + + if (Charges < MaxCharges) + ResetChargeTime(); + } + } + } + if (--conditionTicks < 0 && token != Actor.InvalidConditionToken) token = self.RevokeCondition(token); } + Order IIssueDeployOrder.IssueDeployOrder(Actor self, bool queued) + { + // HACK: Switch the global order generator instead of actually issuing an order + if (CanTeleport) + self.World.OrderGenerator = new PortableChronoOrderGenerator(self, this); + + // HACK: We need to issue a fake order to stop the game complaining about the bodge above + return new Order("PortableChronoDeploy", self, Target.Invalid, queued); + } + + bool IIssueDeployOrder.CanIssueDeployOrder(Actor self, bool queued) { return !IsTraitPaused && !IsTraitDisabled; } + public IEnumerable Orders { get @@ -121,7 +246,7 @@ public Order IssueOrder(Actor self, IOrderTargeter order, in Target target, bool { // HACK: Switch the global order generator instead of actually issuing an order if (CanTeleport) - self.World.OrderGenerator = new PortableChronoOrderGenerator(self, Info); + self.World.OrderGenerator = new PortableChronoOrderGenerator(self, this); // HACK: We need to issue a fake order to stop the game complaining about the bodge above return new Order(order.OrderID, self, Target.Invalid, queued); @@ -137,14 +262,50 @@ public void ResolveOrder(Actor self, Order order) { if (order.OrderString == "PortableChronoTeleport" && CanTeleport && order.Target.Type != TargetType.Invalid) { - var maxDistance = Info.HasDistanceLimit ? Info.MaxDistance : (int?)null; - self.CancelActivity(); + var maxDistance = Info.HasDistanceLimit ? MaxDistance : (int?)null; + if (!order.Queued) + self.CancelActivity(); var cell = self.World.Map.CellContaining(order.Target.CenterPosition); - self.QueueActivity(new TeleportCA(self, cell, maxDistance, Info.KillCargo, Info.FlashScreen, Info.ChronoshiftSound)); + if (maxDistance != null) + self.QueueActivity(move.MoveWithinRange(order.Target, WDist.FromCells(maxDistance.Value), targetLineColor: Info.TargetLineColor)); + + self.QueueActivity(new TeleportCA(self, cell, maxDistance, Info.KillCargo, Info.FlashScreen, Info.ChronoshiftSound, + true, false, default, Info.RequireEmptyDestination, CalculatePreChargeTicks, PreChargeStarted, RevokePreChargeCondition)); + self.QueueActivity(move.MoveTo(cell, 5, targetLineColor: Info.TargetLineColor)); + self.ShowTargetLines(); } } + int CalculatePreChargeTicks(Actor self, CPos destination) + { + var distance = (destination - self.Location).Length; + var cellsBeyondInstant = Info.MaxInstantDistance > 0 ? distance - Info.MaxInstantDistance : 0; + var delay = cellsBeyondInstant * Info.PreChargeTicksPerCell; + if (Info.MaxPreChargeTicks > 0 && delay > Info.MaxPreChargeTicks) + delay = Info.MaxPreChargeTicks; + + return delay; + } + + void PreChargeStarted(Actor self, int delay) + { + maxPreChargeTicks = preChargeTicks = delay; + GrantPreChargeCondition(self); + } + + void GrantPreChargeCondition(Actor self) + { + if (!string.IsNullOrEmpty(Info.PreChargeCondition) && preChargeToken == Actor.InvalidConditionToken) + preChargeToken = self.GrantCondition(Info.PreChargeCondition); + } + + void RevokePreChargeCondition(Actor self) + { + if (preChargeToken != Actor.InvalidConditionToken) + preChargeToken = self.RevokeCondition(preChargeToken); + } + string IOrderVoice.VoicePhraseForOrder(Actor self, Order order) { return order.OrderString == "PortableChronoTeleport" && CanTeleport ? Info.Voice : null; @@ -162,26 +323,84 @@ public void GrantCondition(Actor self) } } + public void ConsumeCharge() + { + cooldownTicks = Info.Cooldown; + + Charges--; + + if (Info.ResetRechargeOnUse || chargeTick == 0) + ResetChargeTime(); + } + public void ResetChargeTime() { - chargeTick = Info.ChargeDelay; + chargeTick = ChargeDelay; } - public bool CanTeleport + public void UpdateModifiers() { - get { return chargeTick <= 0; } + MaxDistance = OpenRA.Mods.Common.Util.ApplyPercentageModifiers(Info.MaxDistance, modifiers.Select(m => m.GetRangeModifier())); + var chargePerc = Info.ChargeDelay > 0 ? (float)chargeTick / ChargeDelay : 1; + ChargeDelay = OpenRA.Mods.Common.Util.ApplyPercentageModifiers(Info.ChargeDelay, modifiers.Select(m => m.GetCooldownModifier())); + chargeTick = chargeTick > 0 ? (int)(ChargeDelay * chargePerc) : 0; + var prevMaxCharges = MaxCharges; + MaxCharges = Info.Charges + modifiers.Sum(m => m.GetExtraCharges()); + + if (prevMaxCharges < MaxCharges) + Charges += MaxCharges - prevMaxCharges; + + if (Charges < MaxCharges && chargeTick == 0) + ResetChargeTime(); + else if (Charges > MaxCharges) + Charges = MaxCharges; } + public bool CanTeleport => !IsTraitDisabled && !IsTraitPaused && Charges > 0 && cooldownTicks == 0; + float ISelectionBar.GetValue() { if (IsTraitDisabled) - return 0; + return 0f; - return (float)(Info.ChargeDelay - chargeTick) / Info.ChargeDelay; + if (preChargeTicks > 0) + return 1 - (float)preChargeTicks / maxPreChargeTicks; + + if (Info.ShowCooldownSelectionBar && cooldownTicks > 0 && Charges > 0) + return (float)(Info.Cooldown - cooldownTicks) / Info.Cooldown; + + if (!Info.ShowSelectionBar || chargeTick == ChargeDelay) + return 0f; + + if (!Info.ShowSelectionBarWhenFull && chargeTick == 0) + return 0f; + + return (float)(ChargeDelay - chargeTick) / ChargeDelay; + } + + Color ISelectionBar.GetColor() + { + if (preChargeTicks > 0) + return Info.PreChargeSelectionBarColor; + + if (Info.ShowCooldownSelectionBar && cooldownTicks > 0 && Charges > 0) + return Info.CooldownSelectionBarColor; + + return Info.SelectionBarColor; } - Color ISelectionBar.GetColor() { return Color.Magenta; } - bool ISelectionBar.DisplayWhenEmpty { get { return false; } } + bool ISelectionBar.DisplayWhenEmpty => false; + + protected override void TraitDisabled(Actor self) + { + if (self.CurrentActivity is TeleportCA) + self.CancelActivity(); + + preChargeTicks = 0; + + if (token != Actor.InvalidConditionToken) + token = self.RevokeCondition(token); + } } class PortableChronoOrderTargeter : IOrderTargeter @@ -193,12 +412,12 @@ public PortableChronoOrderTargeter(string targetCursor) this.targetCursor = targetCursor; } - public string OrderID { get { return "PortableChronoTeleport"; } } - public int OrderPriority { get { return 5; } } + public string OrderID => "PortableChronoTeleport"; + public int OrderPriority => 5; public bool IsQueued { get; protected set; } public bool TargetOverridesSelection(Actor self, in Target target, List actorsAt, CPos xy, TargetModifiers modifiers) { return true; } - public bool CanTarget(Actor self, in Target target, List othersAtTarget, ref TargetModifiers modifiers, ref string cursor) + public bool CanTarget(Actor self, in Target target, ref TargetModifiers modifiers, ref string cursor) { if (modifiers.HasModifier(TargetModifiers.ForceMove)) { @@ -211,8 +430,6 @@ public bool CanTarget(Actor self, in Target target, List othersAtTarget, cursor = targetCursor; return true; } - - return false; } return false; @@ -222,17 +439,24 @@ public bool CanTarget(Actor self, in Target target, List othersAtTarget, class PortableChronoOrderGenerator : OrderGenerator { readonly Actor self; + readonly PortableChronoCA portableChrono; readonly PortableChronoCAInfo info; + readonly IEnumerable> selectedWithAbility; - public PortableChronoOrderGenerator(Actor self, PortableChronoCAInfo info) + public PortableChronoOrderGenerator(Actor self, PortableChronoCA portableChrono) { this.self = self; - this.info = info; + this.portableChrono = portableChrono; + info = portableChrono.Info; + + selectedWithAbility = self.World.Selection.Actors + .Where(a => a.Info.HasTraitInfo() && a.Owner == self.Owner && !a.IsDead) + .Select(a => new TraitPair(a, a.Trait())); } protected override IEnumerable OrderInner(World world, CPos cell, int2 worldPixel, MouseInput mi) { - if (mi.Button == Game.Settings.Game.MouseButtonPreference.Cancel) + if (mi.Button == MouseButton.Right) { world.CancelInputMode(); yield break; @@ -242,14 +466,40 @@ protected override IEnumerable OrderInner(World world, CPos cell, int2 wo && self.Trait().CanTeleport && self.Owner.Shroud.IsExplored(cell)) { world.CancelInputMode(); - yield return new Order("PortableChronoTeleport", self, Target.FromCell(world, cell), mi.Modifiers.HasModifier(Modifiers.Shift)); + var targetCell = Target.FromCell(world, cell); + + var selectedOrderedByDistance = selectedWithAbility + .Where(a => !a.Actor.IsDead + && a.Actor.Owner == self.Owner + && a.Actor.IsInWorld + && a.Trait.CanTeleport) + .OrderBy(a => (a.Actor.CenterPosition - targetCell.CenterPosition).Length); + + if (mi.Modifiers.HasModifier(Modifiers.Ctrl)) + { + var closest = selectedOrderedByDistance.First(); + yield return new Order("PortableChronoTeleport", closest.Actor, targetCell, mi.Modifiers.HasModifier(Modifiers.Shift)); + } + else + { + foreach (var s in selectedOrderedByDistance) + yield return new Order("PortableChronoTeleport", s.Actor, targetCell, mi.Modifiers.HasModifier(Modifiers.Shift)); + } } } + protected override void SelectionChanged(World world, IEnumerable selected) + { + if (!selected.Contains(self)) + world.CancelInputMode(); + } + protected override void Tick(World world) { - if (!self.IsInWorld || self.IsDead) + if (portableChrono.IsTraitDisabled || portableChrono.IsTraitPaused) + { world.CancelInputMode(); + } } protected override IEnumerable Render(WorldRenderer wr, World world) { yield break; } @@ -261,24 +511,48 @@ protected override IEnumerable RenderAnnotations(WorldRenderer wr, if (!self.IsInWorld || self.Owner != self.World.LocalPlayer) yield break; - if (!self.Trait().Info.HasDistanceLimit) + if (!info.HasDistanceLimit && info.MaxInstantDistance == 0) yield break; - yield return new RangeCircleAnnotationRenderable( - self.CenterPosition, - WDist.FromCells(self.Trait().Info.MaxDistance), - 0, - info.CircleColor, - info.CircleWidth, - info.CircleBorderColor, - info.CircleBorderWidth); + if (info.CircleWidth > 0) + { + foreach (var s in selectedWithAbility) + { + if (s.Actor.IsInWorld && s.Trait.CanTeleport && self.Owner == self.World.LocalPlayer) + { + if (s.Trait.Info.HasDistanceLimit) + { + yield return new RangeCircleAnnotationRenderable( + s.Actor.CenterPosition + new WVec(0, s.Actor.CenterPosition.Z, 0), + WDist.FromCells(s.Trait.Info.MaxDistance), + 0, + s.Trait.Info.CircleColor, + s.Trait.Info.CircleWidth, + s.Trait.Info.CircleBorderColor, + s.Trait.Info.CircleBorderWidth); + } + + if (s.Trait.Info.MaxInstantDistance > 0) + { + yield return new RangeCircleAnnotationRenderable( + s.Actor.CenterPosition + new WVec(0, s.Actor.CenterPosition.Z, 0), + WDist.FromCells(s.Trait.Info.MaxInstantDistance), + 0, + s.Trait.Info.MaxInstantCircleColor, + s.Trait.Info.CircleWidth, + s.Trait.Info.MaxInstantCircleBorderColor, + s.Trait.Info.CircleBorderWidth); + } + } + } + } } protected override string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi) { if (self.IsInWorld && self.Location != cell - && self.Trait().CanTeleport && self.Owner.Shroud.IsExplored(cell)) - return info.TargetCursor; + && portableChrono.CanTeleport && self.Owner.Shroud.IsExplored(cell)) + return info.TargetModifiedCursor != null && mi.Modifiers.HasModifier(Modifiers.Ctrl) ? info.TargetModifiedCursor : info.TargetCursor; else return info.TargetBlockedCursor; } diff --git a/OpenRA.Mods.CA/Traits/ProductionAirdropCA.cs b/OpenRA.Mods.CA/Traits/ProductionAirdropCA.cs index a7795ddd41..3a1509a2a6 100644 --- a/OpenRA.Mods.CA/Traits/ProductionAirdropCA.cs +++ b/OpenRA.Mods.CA/Traits/ProductionAirdropCA.cs @@ -1,17 +1,17 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion using System; using System.Linq; using OpenRA.Activities; +using OpenRA.Mods.CA.Activities; using OpenRA.Mods.Common; using OpenRA.Mods.Common.Activities; using OpenRA.Mods.Common.Traits; @@ -31,7 +31,7 @@ public class ProductionAirdropCAInfo : ProductionInfo [FieldLoader.Require] [ActorReference(typeof(AircraftInfo))] - [Desc("Cargo aircraft used for delivery. Must have the `Aircraft` trait.")] + [Desc("Cargo aircraft used for delivery. Must have the `" + nameof(Aircraft) + "` trait.")] public readonly string ActorType = null; [Desc("How the spawn location/direction is calculated for the delivering actor.", @@ -43,6 +43,15 @@ public class ProductionAirdropCAInfo : ProductionInfo [Desc("Direction the aircraft should face to land.")] public readonly WAngle Facing = new WAngle(256); + [Desc("Tick that aircraft should wait before producing.")] + public readonly int WaitTickBeforeProduce = 0; + + [Desc("Tick that aircraft should wait after producing.")] + public readonly int WaitTickAfterProduce = 0; + + [Desc("Offset the aircraft used for landing.")] + public readonly WVec LandOffset = WVec.Zero; + [Desc("If true, the actor's speed will be adjusted based on the distance it needs to travel to deliver its cargo.")] public readonly bool ProportionalSpeed = false; @@ -176,7 +185,9 @@ public override bool Produce(Actor self, ActorInfo producee, string productionTy } var exitCell = self.Location + exit.ExitCell; - actor.QueueActivity(new Land(actor, Target.FromActor(self), WDist.Zero, WVec.Zero, info.Facing, clearCells: new CPos[1] { exitCell })); + actor.QueueActivity(new ProductionAirdropDeliver(actor, Target.FromActor(self), info.LandOffset, info.Facing)); + if (info.WaitTickBeforeProduce > 0) + actor.QueueActivity(new Wait(info.WaitTickBeforeProduce)); actor.QueueActivity(new CallFunc(() => { if (!self.IsInWorld || self.IsDead) @@ -190,9 +201,10 @@ public override bool Produce(Actor self, ActorInfo producee, string productionTy self.World.AddFrameEndTask(ww => DoProduction(self, producee, exit, productionType, inits)); if (info.ReadyAudio != null) - Game.Sound.PlayNotification(self.World.Map.Rules, self.Owner, "Speech", info.ReadyAudio, self.Owner.Faction.InternalName); + Game.Sound.PlayNotification(self.World.Map.Rules, self.Owner, "Speech", info.ReadyAudio, self.Owner.Faction.InternalName); })); - + if (info.WaitTickAfterProduce > 0) + actor.QueueActivity(new Wait(info.WaitTickAfterProduce)); actor.QueueActivity(new FlyOffMap(actor, Target.FromCell(w, endPos))); actor.QueueActivity(new RemoveSelf()); }); diff --git a/OpenRA.Mods.CA/Traits/ProductionQueueFromSelectionCA.cs b/OpenRA.Mods.CA/Traits/ProductionQueueFromSelectionCA.cs new file mode 100644 index 0000000000..b759045879 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/ProductionQueueFromSelectionCA.cs @@ -0,0 +1,90 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Linq; +using OpenRA.Mods.CA.Widgets; +using OpenRA.Mods.Common.Traits; +using OpenRA.Mods.Common.Widgets; +using OpenRA.Traits; +using OpenRA.Widgets; + +namespace OpenRA.Mods.CA.Traits +{ + [TraitLocation(SystemActors.World)] + class ProductionQueueFromSelectionCAInfo : TraitInfo + { + public readonly bool AllySelection = false; + public readonly string ProductionTabsWidget = null; + public readonly string ProductionPaletteWidget = null; + + public override object Create(ActorInitializer init) { return new ProductionQueueFromSelection(init.World, this); } + } + + class ProductionQueueFromSelection : INotifySelection + { + readonly World world; + readonly Lazy tabsWidget; + readonly Lazy paletteWidget; + readonly ProductionQueueFromSelectionCAInfo Info; + + public ProductionQueueFromSelection(World world, ProductionQueueFromSelectionCAInfo info) + { + this.world = world; + Info = info; + + tabsWidget = Exts.Lazy(() => Ui.Root.GetOrNull(info.ProductionTabsWidget) as ProductionTabsCAWidget); + paletteWidget = Exts.Lazy(() => Ui.Root.GetOrNull(info.ProductionPaletteWidget) as ProductionPaletteWidget); + } + + void INotifySelection.SelectionChanged() + { + // Disable for spectators + if (world.LocalPlayer == null) + return; + + // Queue-per-actor + var queue = world.Selection.Actors + .Where(a => a.IsInWorld && a.World.LocalPlayer == a.Owner) + .SelectMany(a => a.TraitsImplementing()) + .FirstOrDefault(q => q.Enabled); + + // Queue-per-player + if (queue == null) + { + var types = world.Selection.Actors.Where(a => a.IsInWorld && HasValidOwner(a)) + .SelectMany(a => a.TraitsImplementing().Where(p => !p.IsTraitDisabled)) + .SelectMany(t => t.Info.Produces) + .Concat(world.Selection.Actors.Where(a => a.IsInWorld && HasValidOwner(a)) + .SelectMany(a => a.TraitsImplementing()) + .SelectMany(t => t.Types)); + + queue = world.LocalPlayer.PlayerActor.TraitsImplementing() + .FirstOrDefault(q => q.Enabled && types.Contains(q.Info.Type)); + } + + if (queue == null || !queue.AnyItemsToBuild()) + return; + + if (tabsWidget.Value != null) + tabsWidget.Value.CurrentQueue = queue; + else if (paletteWidget.Value != null) + paletteWidget.Value.CurrentQueue = queue; + } + + private bool HasValidOwner(Actor actor) + { + if (Info.AllySelection) + return actor.World.LocalPlayer.IsAlliedWith(actor.Owner); + + return actor.World.LocalPlayer == actor.Owner; + } + } +} diff --git a/OpenRA.Mods.CA/Traits/ProvidesUpgrade.cs b/OpenRA.Mods.CA/Traits/ProvidesUpgrade.cs new file mode 100644 index 0000000000..f1dc3e23e4 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/ProvidesUpgrade.cs @@ -0,0 +1,46 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Mods.Common.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Provides a prerequisite that is used for upgrades.")] + public class ProvidesUpgradeInfo : ConditionalTraitInfo + { + [Desc("Type.")] + public readonly string Type = null; + + public override object Create(ActorInitializer init) { return new ProvidesUpgrade(init.Self, this); } + } + + public class ProvidesUpgrade : ConditionalTrait + { + public readonly new ProvidesUpgradeInfo Info; + readonly string type; + UpgradesManager upgradesManager; + + public ProvidesUpgrade(Actor self, ProvidesUpgradeInfo info) + : base(info) + { + Info = info; + upgradesManager = self.Owner.PlayerActor.Trait(); + type = Info.Type; + + if (string.IsNullOrEmpty(type)) + type = self.Info.Name; + } + + protected override void TraitEnabled(Actor self) + { + upgradesManager.UpgradeProviderCreated(type); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/RangedGpsRadarProvider.cs b/OpenRA.Mods.CA/Traits/RangedGpsRadarProvider.cs new file mode 100644 index 0000000000..605fd3cae5 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/RangedGpsRadarProvider.cs @@ -0,0 +1,147 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("This actor provides Radar GPS.")] + public class RangedGpsRadarProviderInfo : ConditionalTraitInfo + { + [Desc("Target types that can be detected. Leave empty to accept all types.")] + public readonly BitSet TargetTypes = default(BitSet); + + [Desc("Reveals within this range. Use zero for whole map.")] + public readonly WDist Range = WDist.Zero; + + [Desc("The maximum vertical range above terrain to search for actors.", + "Ignored if 0 (actors are selected regardless of vertical distance).")] + public readonly WDist MaximumVerticalOffset = WDist.Zero; + + public override object Create(ActorInitializer init) { return new RangedGpsRadarProvider(init, this); } + } + + public class RangedGpsRadarProvider : ConditionalTrait, INotifyCenterPositionChanged, + INotifyAddedToWorld, INotifyRemovedFromWorld, INotifyOtherProduction + { + readonly Actor self; + + int proximityTrigger; + WPos cachedPosition; + WDist cachedRange; + WDist desiredRange; + WDist cachedVRange; + WDist desiredVRange; + + public RangedGpsRadarProvider(ActorInitializer init, RangedGpsRadarProviderInfo info) + : base(info) + { + self = init.Self; + cachedRange = WDist.Zero; + cachedVRange = WDist.Zero; + proximityTrigger = -1; + } + + void INotifyAddedToWorld.AddedToWorld(Actor self) + { + cachedPosition = self.CenterPosition; + proximityTrigger = self.World.ActorMap.AddProximityTrigger(cachedPosition, cachedRange, cachedVRange, ActorEntered, ActorExited); + Update(); + } + + void INotifyRemovedFromWorld.RemovedFromWorld(Actor self) + { + self.World.ActorMap.RemoveProximityTrigger(proximityTrigger); + } + + protected override void TraitEnabled(Actor self) + { + desiredRange = Info.Range; + desiredVRange = Info.MaximumVerticalOffset; + Update(); + } + + protected override void TraitDisabled(Actor self) + { + desiredRange = WDist.Zero; + desiredVRange = WDist.Zero; + Update(); + } + + void INotifyCenterPositionChanged.CenterPositionChanged(Actor self, byte oldLayer, byte newLayer) + { + if (!self.IsInWorld || IsTraitDisabled) + return; + + if (self.CenterPosition != cachedPosition) + Update(); + } + + void Update() + { + if (proximityTrigger == -1) + return; + + cachedPosition = self.CenterPosition; + cachedRange = desiredRange; + cachedVRange = desiredVRange; + self.World.ActorMap.UpdateProximityTrigger(proximityTrigger, cachedPosition, cachedRange, cachedVRange); + } + + void ActorEntered(Actor a) + { + AddRangedObserver(a); + } + + public void UnitProducedByOther(Actor self, Actor producer, Actor produced, string productionType, TypeDictionary init) + { + // If the produced Actor doesn't occupy space, it can't be in range + if (produced.OccupiesSpace == null) + return; + + // Work around for actors produced within the region not triggering until the second tick + if ((produced.CenterPosition - self.CenterPosition).HorizontalLengthSquared <= Info.Range.LengthSquared) + AddRangedObserver(produced); + } + + void ActorExited(Actor a) + { + RemoveRangedObserver(a); + } + + void AddRangedObserver(Actor a) + { + if (IsTraitDisabled || a.Disposed || self.Disposed) + return; + + if (self.Owner.IsAlliedWith(a.Owner)) + return; + + var dotTrait = a.TraitOrDefault(); + if (dotTrait != null && (Info.TargetTypes.IsEmpty || a.GetEnabledTargetTypes().Overlaps(Info.TargetTypes))) + dotTrait.AddRangedObserver(self); + } + + void RemoveRangedObserver(Actor a) + { + if (a.Disposed) + return; + + if (self.Owner.IsAlliedWith(a.Owner)) + return; + + var dotTrait = a.TraitOrDefault(); + if (dotTrait != null) + dotTrait.RemoveRangedObserver(self); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/RearmsToUpgrade.cs b/OpenRA.Mods.CA/Traits/RearmsToUpgrade.cs new file mode 100644 index 0000000000..7ff8632643 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/RearmsToUpgrade.cs @@ -0,0 +1,131 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Linq; +using OpenRA.Mods.CA.Activities; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Use in conjunction with Rearmable and an AmmoPool with large reload delay.", + "Replaces with specified unit after a delay (optionally if the unit is also undamaged).")] + public class RearmsToUpgradeInfo : PausableConditionalTraitInfo + { + [Desc("Ammo pool to use to trigger upgrade.")] + public readonly string AmmoPool = "primary"; + + [ActorReference] + [Desc("Actor to upgrade into.")] + public readonly string Actor = null; + + [Desc("Ticks taken to upgrade.")] + public readonly int Delay = 50; + + [Desc("Voice to use on upgrade completion.")] + public readonly string UpgradeAudio = null; + + [Desc("If true, the unit must be at full health before triggering the upgrade process.")] + public readonly bool MustBeUndamaged = true; + + public readonly bool SkipMakeAnims = true; + + public override void RulesetLoaded(Ruleset rules, ActorInfo ai) + { + if (ai.TraitInfos().Count(ap => ap.Name == AmmoPool) != 1) + throw new YamlException("ReloadsAmmoPool.AmmoPool requires exactly one AmmoPool with matching Name!"); + + base.RulesetLoaded(rules, ai); + } + + public override object Create(ActorInitializer init) { return new RearmsToUpgrade(init.Self, this); } + } + + public class RearmsToUpgrade : PausableConditionalTrait, INotifyDockClient, ITick + { + public new RearmsToUpgradeInfo Info; + AmmoPool ammoPool; + int ticksUntilUpgrade; + bool resupplying; + + public RearmsToUpgrade(Actor self, RearmsToUpgradeInfo info) + : base(info) + { + Info = info; + } + + protected override void Created(Actor self) + { + ResetDelay(); + ammoPool = self.TraitsImplementing().Single(ap => ap.Info.Name == Info.AmmoPool); + } + + void INotifyDockClient.Docked(Actor self, Actor host) + { + resupplying = true; + } + + void INotifyDockClient.Undocked(Actor self, Actor host) + { + ResetDelay(); + resupplying = false; + } + + void ITick.Tick(Actor self) + { + if (IsTraitDisabled || IsTraitPaused || !resupplying || (Info.MustBeUndamaged && self.GetDamageState() != DamageState.Undamaged)) + return; + + if (--ticksUntilUpgrade == 0) + Transform(self); + } + + void Transform(Actor self) + { + var faction = self.Owner.Faction.InternalName; + var transform = new InstantTransform(self, Info.Actor) { ForceHealthPercentage = 0, Faction = faction }; + transform.SkipMakeAnims = Info.SkipMakeAnims; + self.CurrentActivity.QueueChild(transform); + + if (Info.UpgradeAudio != null) + Game.Sound.PlayNotification(self.World.Map.Rules, self.Owner, "Speech", Info.UpgradeAudio, faction); + + FillAmmo(self); + } + + void ResetDelay() + { + ticksUntilUpgrade = Info.Delay; + } + + protected override void TraitEnabled(Actor self) + { + EmptyAmmo(self); + } + + protected override void TraitDisabled(Actor self) + { + FillAmmo(self); + ResetDelay(); + } + + void FillAmmo(Actor self) + { + while (ammoPool.CurrentAmmoCount < ammoPool.Info.Ammo) + ammoPool.GiveAmmo(self, 1); + } + + void EmptyAmmo(Actor self) + { + while (ammoPool.CurrentAmmoCount > 0) + ammoPool.TakeAmmo(self, 1); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/ReclaimsExperience.cs b/OpenRA.Mods.CA/Traits/ReclaimsExperience.cs new file mode 100644 index 0000000000..d4816c69fd --- /dev/null +++ b/OpenRA.Mods.CA/Traits/ReclaimsExperience.cs @@ -0,0 +1,52 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Linq; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("When killed, gives to a reclaimable pool. When created takes from that pool.")] + public class ReclaimsExperienceInfo : TraitInfo, Requires + { + [Desc("Pool to use. Uses actor name if not set.")] + public readonly string Type = null; + + public override object Create(ActorInitializer init) { return new ReclaimsExperience(init, this); } + } + + public class ReclaimsExperience : INotifyCreated, INotifyKilled + { + public readonly ReclaimsExperienceInfo Info; + GainsExperience gainsExperienceTrait; + + public ReclaimsExperience(ActorInitializer init, ReclaimsExperienceInfo info) + { + Info = info; + gainsExperienceTrait = init.Self.TraitsImplementing().First(); + } + + void INotifyCreated.Created(Actor self) + { + var pool = self.Owner.PlayerActor.TraitsImplementing().SingleOrDefault(); + + if (pool != null) + gainsExperienceTrait.GiveExperience(pool.TakeXpFromPool(Info.Type ?? self.Info.Name)); + } + + void INotifyKilled.Killed(Actor self, AttackInfo e) + { + var pool = self.Owner.PlayerActor.TraitsImplementing().SingleOrDefault(); + if (pool != null) + pool.AddXpToPool(Info.Type ?? self.Info.Name, gainsExperienceTrait.Experience); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/ReflectsDamage.cs b/OpenRA.Mods.CA/Traits/ReflectsDamage.cs index 146d8c61a5..9ae81e67e1 100644 --- a/OpenRA.Mods.CA/Traits/ReflectsDamage.cs +++ b/OpenRA.Mods.CA/Traits/ReflectsDamage.cs @@ -1,11 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2016-2021 The CA Developers (see AUTHORS) - * This file is part of CA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion using System.Collections.Generic; @@ -49,6 +48,9 @@ public class ReflectsDamageInfo : ConditionalTraitInfo [Desc("If true, negative damage (repairs/heals) is also reflected.")] public readonly bool ReflectsHealing = false; + [Desc("If true, damage modifiers on the target will be ignored when reflecting damage.")] + public readonly bool IgnoreModifiers = false; + public override object Create(ActorInitializer init) { return new ReflectsDamage(init, this); } } @@ -70,7 +72,7 @@ void INotifyDamage.Damaged(Actor self, AttackInfo e) if (!Info.ReflectsHealing && e.Damage.Value < 0) return; - if (Info.InvalidAttackerActors.Any() && Info.InvalidAttackerActors.Contains(e.Attacker.Info.Name)) + if (Info.InvalidAttackerActors.Count > 0 && Info.InvalidAttackerActors.Contains(e.Attacker.Info.Name)) return; if (self == e.Attacker) @@ -91,14 +93,17 @@ void INotifyDamage.Damaged(Actor self, AttackInfo e) .ToList(); } - if (!units.Any()) + if (units.Count == 0) return; var totalDamage = e.Damage.Value; var damageTypes = e.Damage.DamageTypes; - var percentageAsList = new List(); - percentageAsList.Add(Info.DamagePercentage); + var percentageAsList = new List + { + Info.DamagePercentage + }; + var damageAmt = Util.ApplyPercentageModifiers(totalDamage, percentageAsList); if (Info.SplitDamage) @@ -111,7 +116,7 @@ void INotifyDamage.Damaged(Actor self, AttackInfo e) var health = unit.TraitOrDefault(); if (health != null) - health.InflictDamage(unit, unit, damage, true); + health.InflictDamage(unit, unit, damage, Info.IgnoreModifiers); } } @@ -120,13 +125,13 @@ public bool IsValidUnit(Actor a) if (a == null || a.IsDead) return false; - if (!Info.ValidRelationships.HasStance(a.Owner.RelationshipWith(Player))) + if (!Info.ValidRelationships.HasRelationship(a.Owner.RelationshipWith(Player))) return false; - if (Info.ValidActors.Any() && !Info.ValidActors.Contains(a.Info.Name)) + if (Info.ValidActors.Count > 0 && !Info.ValidActors.Contains(a.Info.Name)) return false; - if (Info.InvalidActors.Any() && Info.InvalidActors.Contains(a.Info.Name)) + if (Info.InvalidActors.Count > 0 && Info.InvalidActors.Contains(a.Info.Name)) return false; return true; diff --git a/OpenRA.Mods.CA/Traits/ReloadAmmoPoolCA.cs b/OpenRA.Mods.CA/Traits/ReloadAmmoPoolCA.cs index 1b0179e6eb..da7413a0a9 100644 --- a/OpenRA.Mods.CA/Traits/ReloadAmmoPoolCA.cs +++ b/OpenRA.Mods.CA/Traits/ReloadAmmoPoolCA.cs @@ -1,11 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -17,7 +16,9 @@ namespace OpenRA.Mods.CA.Traits { - [Desc("Reloads an ammo pool.")] + [Desc("Reloads an ammo pool.", + "CA version adds a progress bar, allows for reload to only begin below a certain ammo threshold", + "and allows reload to be delayed on fire/reset (as opposed to just resetting on firing).")] public class ReloadAmmoPoolCAInfo : PausableConditionalTraitInfo { [Desc("Reload ammo pool with this name.")] @@ -44,15 +45,20 @@ public class ReloadAmmoPoolCAInfo : PausableConditionalTraitInfo [Desc("Only begin reloading when ammo is equal to or less than this number. -1 means reload whenever below full ammo.")] public readonly int ReloadWhenAmmoReaches = -1; + [Desc("If greater than zero, instead of resettng the reload, the reload timer will reverse by this amount per tick.")] + public readonly int DrainAmountOnDisabled = 0; + public readonly bool ShowSelectionBar = true; public readonly Color SelectionBarColor = Color.FromArgb(128, 200, 255); - public override object Create(ActorInitializer init) { return new ReloadAmmoPoolCA(this); } + public readonly PlayerRelationship SelectionBarValidRelationships = PlayerRelationship.Ally; + + public override object Create(ActorInitializer init) { return new ReloadAmmoPoolCA(init.Self, this); } public override void RulesetLoaded(Ruleset rules, ActorInfo ai) { if (ai.TraitInfos().Count(ap => ap.Name == AmmoPool) != 1) - throw new YamlException("ReloadsAmmoPool.AmmoPool requires exactly one AmmoPool with matching Name!"); + throw new YamlException("ReloadAmmoPoolCA.AmmoPool requires exactly one AmmoPool with matching Name!"); base.RulesetLoaded(rules, ai); } @@ -62,13 +68,20 @@ public class ReloadAmmoPoolCA : PausableConditionalTrait, { AmmoPool ammoPool; IReloadAmmoModifier[] modifiers; + Actor self; [Sync] - int remainingTicks; + int reloadTicks; int remainingDelay; - public ReloadAmmoPoolCA(ReloadAmmoPoolCAInfo info) - : base(info) { } + int MaxTicks => Util.ApplyPercentageModifiers(Info.Delay, modifiers.Select(m => m.GetReloadAmmoModifier())); + int cachedMaxTicks; + + public ReloadAmmoPoolCA(Actor self, ReloadAmmoPoolCAInfo info) + : base(info) + { + this.self = self; + } protected override void Created(Actor self) { @@ -78,27 +91,26 @@ protected override void Created(Actor self) self.World.AddFrameEndTask(w => { - remainingTicks = Util.ApplyPercentageModifiers(Info.Delay, modifiers.Select(m => m.GetReloadAmmoModifier())); + reloadTicks = 0; remainingDelay = Info.DelayAfterReset; + cachedMaxTicks = MaxTicks; }); } void INotifyAttack.Attacking(Actor self, in Target target, Armament a, Barrel barrel) { - var maxTicks = Util.ApplyPercentageModifiers(Info.Delay, modifiers.Select(m => m.GetReloadAmmoModifier())); if (Info.ResetOnFire) { - remainingTicks = maxTicks; + reloadTicks = 0; remainingDelay = Info.DelayAfterReset; } else if (Info.DelayOnFire > 0) { - remainingTicks += Info.DelayOnFire; + reloadTicks -= Info.DelayOnFire; + if (reloadTicks < 0) + reloadTicks = 0; - if (remainingTicks > maxTicks) - remainingTicks = maxTicks; - - if (remainingTicks == maxTicks) + if (reloadTicks == 0) remainingDelay = Info.DelayAfterReset; } } @@ -107,9 +119,23 @@ void INotifyAttack.PreparingAttack(Actor self, in Target target, Armament a, Bar void ITick.Tick(Actor self) { - if (IsTraitPaused || IsTraitDisabled) + if (IsTraitPaused) return; + if (IsTraitDisabled) + { + if (Info.DrainAmountOnDisabled > 0) + { + if (reloadTicks > 0) + reloadTicks -= Info.DrainAmountOnDisabled; + + if (reloadTicks < 0) + reloadTicks = 0; + } + + return; + } + Reload(self, Info.Delay, Info.Count, Info.Sound); } @@ -121,9 +147,14 @@ protected virtual void Reload(Actor self, int reloadDelay, int reloadCount, stri if (Info.ReloadWhenAmmoReaches > -1 && ammoPool.CurrentAmmoCount > Info.ReloadWhenAmmoReaches) return; - if (!ammoPool.HasFullAmmo && --remainingTicks == 0) + if ((reloadCount > 0 && ammoPool.HasFullAmmo) || (reloadCount < 0 && !ammoPool.HasAmmo)) + return; + + var cachedMaxTicks = MaxTicks; + + if (++reloadTicks >= cachedMaxTicks) { - remainingTicks = Util.ApplyPercentageModifiers(reloadDelay, modifiers.Select(m => m.GetReloadAmmoModifier())); + reloadTicks = 0; if (!string.IsNullOrEmpty(sound)) Game.Sound.PlayToPlayer(SoundType.World, self.Owner, sound, self.CenterPosition); @@ -136,13 +167,13 @@ protected virtual void Reload(Actor self, int reloadDelay, int reloadCount, stri float ISelectionBar.GetValue() { - if (!Info.ShowSelectionBar || remainingDelay > 0) + if (!Info.ShowSelectionBar || remainingDelay > 0 || !Info.SelectionBarValidRelationships.HasRelationship(self.Owner.RelationshipWith(self.World.RenderPlayer))) return 0; - var maxTicks = Util.ApplyPercentageModifiers(Info.Delay, modifiers.Select(m => m.GetReloadAmmoModifier())); - if (remainingTicks == maxTicks) + + if (reloadTicks == 0) return 0; - return (float)(maxTicks - remainingTicks) / maxTicks; + return (float)reloadTicks / cachedMaxTicks; } bool ISelectionBar.DisplayWhenEmpty { get { return false; } } @@ -151,7 +182,9 @@ float ISelectionBar.GetValue() protected override void TraitDisabled(Actor self) { - remainingTicks = Util.ApplyPercentageModifiers(Info.Delay, modifiers.Select(m => m.GetReloadAmmoModifier())); + if (Info.DrainAmountOnDisabled == 0) + reloadTicks = 0; + remainingDelay = Info.DelayAfterReset; } } diff --git a/OpenRA.Mods.CA/Traits/Render/LeavesTrailsCA.cs b/OpenRA.Mods.CA/Traits/Render/LeavesTrailsCA.cs new file mode 100644 index 0000000000..f6807ba9bc --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Render/LeavesTrailsCA.cs @@ -0,0 +1,166 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using OpenRA.Mods.Common.Effects; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits.Render +{ + public enum TrailType { Cell, CenterPosition } + + [Desc("Renders a sprite effect when leaving a cell.")] + public class LeavesTrailsCAInfo : ConditionalTraitInfo + { + [FieldLoader.Require] + public readonly string Image = null; + + [SequenceReference(nameof(Image))] + public readonly string[] Sequences = { "idle" }; + + [PaletteReference] + public readonly string Palette = "effect"; + + [Desc("Only leave trail on listed terrain types. Leave empty to leave trail on all terrain types.")] + public readonly HashSet TerrainTypes = new HashSet(); + + [Desc("Accepts values: Cell to draw the trail sprite in the center of the current cell,", + "CenterPosition to draw the trail sprite at the current position.")] + public readonly TrailType Type = TrailType.Cell; + + [Desc("Should the trail be visible through fog.")] + public readonly bool VisibleThroughFog = false; + + [Desc("Display a trail while stationary.")] + public readonly bool TrailWhileStationary = false; + + [Desc("Delay between trail updates when stationary.")] + public readonly int StationaryInterval = 0; + + [Desc("Display a trail while moving.")] + public readonly bool TrailWhileMoving = true; + + [Desc("Delay between trail updates when moving.")] + public readonly int MovingInterval = 0; + + [Desc("Delay before first trail.", + "Use negative values for falling back to the *Interval values.")] + public readonly int StartDelay = 0; + + [Desc("Trail spawn positions relative to actor position. (forward, right, up) triples")] + public readonly WVec[] Offsets = { WVec.Zero }; + + [Desc("Should the trail spawn relative to last position or current position?")] + public readonly bool SpawnAtLastPosition = true; + + public override object Create(ActorInitializer init) { return new LeavesTrailsCA(init.Self, this); } + } + + public class LeavesTrailsCA : ConditionalTrait, ITick, INotifyAddedToWorld + { + BodyOrientation body; + IFacing facing; + WAngle cachedFacing; + int cachedInterval; + + public LeavesTrailsCA(Actor self, LeavesTrailsCAInfo info) + : base(info) + { + cachedInterval = Info.StartDelay; + } + + WPos cachedPosition; + protected override void Created(Actor self) + { + body = self.Trait(); + facing = self.TraitOrDefault(); + cachedFacing = facing?.Facing ?? WAngle.Zero; + cachedPosition = self.CenterPosition; + + base.Created(self); + } + + int ticks; + int offset; + bool wasStationary; + bool isMoving; + + bool previouslySpawned; + CPos previousSpawnCell; + WAngle previousSpawnFacing; + + void ITick.Tick(Actor self) + { + if (!self.IsInWorld || IsTraitDisabled) + return; + + wasStationary = !isMoving; + isMoving = self.CenterPosition != cachedPosition; + if ((isMoving && !Info.TrailWhileMoving) || (!isMoving && !Info.TrailWhileStationary)) + return; + + if (isMoving == wasStationary && (Info.StartDelay > -1)) + { + cachedInterval = Info.StartDelay; + ticks = 0; + } + + if (++ticks >= cachedInterval) + { + var spawnCell = Info.SpawnAtLastPosition ? self.World.Map.CellContaining(cachedPosition) : self.World.Map.CellContaining(self.CenterPosition); + + // For CA shootable missiles, allow for cells not contained by map + var type = "Invalid"; + if (self.World.Map.Contains(spawnCell)) + type = self.World.Map.GetTerrainInfo(spawnCell).Type; + + if (++offset >= Info.Offsets.Length) + offset = 0; + + if (Info.TerrainTypes.Count == 0 || Info.TerrainTypes.Contains(type)) + { + var spawnFacing = Info.SpawnAtLastPosition ? cachedFacing : facing?.Facing ?? WAngle.Zero; + + if (previouslySpawned && previousSpawnCell == spawnCell) + spawnFacing = previousSpawnFacing; + + var offsetRotation = Info.Offsets[offset].Rotate(body.QuantizeOrientation(self.Orientation)); + var spawnPosition = Info.SpawnAtLastPosition ? cachedPosition : self.CenterPosition; + var pos = Info.Type == TrailType.CenterPosition ? spawnPosition + body.LocalToWorld(offsetRotation) : + self.World.Map.CenterOfCell(spawnCell); + + self.World.AddFrameEndTask(w => w.Add(new SpriteEffect(pos, spawnFacing, self.World, Info.Image, + Info.Sequences.Random(Game.CosmeticRandom), Info.Palette, Info.VisibleThroughFog))); + + previouslySpawned = true; + previousSpawnCell = spawnCell; + previousSpawnFacing = spawnFacing; + } + + cachedPosition = self.CenterPosition; + cachedFacing = facing?.Facing ?? WAngle.Zero; + ticks = 0; + + cachedInterval = isMoving ? Info.MovingInterval : Info.StationaryInterval; + } + } + + protected override void TraitEnabled(Actor self) + { + cachedPosition = self.CenterPosition; + } + + void INotifyAddedToWorld.AddedToWorld(Actor self) + { + cachedPosition = self.CenterPosition; + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Render/OverlayPlayerColorPalette.cs b/OpenRA.Mods.CA/Traits/Render/OverlayPlayerColorPalette.cs deleted file mode 100644 index afc5ebc310..0000000000 --- a/OpenRA.Mods.CA/Traits/Render/OverlayPlayerColorPalette.cs +++ /dev/null @@ -1,72 +0,0 @@ -#region Copyright & License Information -/* - * Copyright 2016-2018 The KKnD Developers (see AUTHORS) - * This file is part of KKnD, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. - */ -#endregion - -using OpenRA.Graphics; -using OpenRA.Primitives; -using OpenRA.Traits; - -namespace OpenRA.Mods.CA.Traits.Render -{ - [Desc("More beautiful variant of the PlayerColorPalette by using the overlay blend mode.")] - public class OverlayPlayerColorPaletteInfo : TraitInfo - { - [Desc("The name of the palette to base off.")] - [PaletteReference] - public readonly string BasePalette = null; - - [Desc("The prefix for the resulting player palettes")] - [PaletteDefinition(true)] - public readonly string BaseName = "player"; - - [Desc("Remap these indices to player colors.")] - public readonly int[] RemapIndex = { }; - - [Desc("Allow palette modifiers to change the palette.")] - public readonly bool AllowModifiers = true; - - [Desc("Lowers brightness range.")] - public readonly float Ramp = 0; - - public override object Create(ActorInitializer init) { return new OverlayPlayerColorPalette(this); } - } - - public class OverlayPlayerColorPalette : ILoadsPlayerPalettes - { - readonly OverlayPlayerColorPaletteInfo info; - - public OverlayPlayerColorPalette(OverlayPlayerColorPaletteInfo info) - { - this.info = info; - } - - public void LoadPlayerPalettes(WorldRenderer wr, string playerName, Color c, bool replaceExisting) - { - var pal = new MutablePalette(wr.Palette(info.BasePalette).Palette); - var r = info.Ramp; - - foreach (var i in info.RemapIndex) - { - var bw = (float)(((pal[i] & 0xff) + ((pal[i] >> 8) & 0xff) + ((pal[i] >> 16) & 0xff)) / 3) / 0xff - r; - if (bw < 0) - { - bw = 0; - } - - var dstR = bw > .5 ? 1 - (1 - 2 * (bw - .5)) * (1 - (float)c.R / 0xff) : 2 * bw * ((float)c.R / 0xff); - var dstG = bw > .5 ? 1 - (1 - 2 * (bw - .5)) * (1 - (float)c.G / 0xff) : 2 * bw * ((float)c.G / 0xff); - var dstB = bw > .5 ? 1 - (1 - 2 * (bw - .5)) * (1 - (float)c.B / 0xff) : 2 * bw * ((float)c.B / 0xff); - pal[i] = (pal[i] & 0xff000000) | ((uint)(dstR * 0xff) << 16) | ((uint)(dstG * 0xff) << 8) | (uint)(dstB * 0xff); - } - - wr.AddPalette(info.BaseName + playerName, new ImmutablePalette(pal), info.AllowModifiers, replaceExisting); - } - } -} diff --git a/OpenRA.Mods.CA/Traits/Render/RenderLine.cs b/OpenRA.Mods.CA/Traits/Render/RenderLine.cs new file mode 100644 index 0000000000..5db171fdaf --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Render/RenderLine.cs @@ -0,0 +1,117 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using OpenRA.Graphics; +using OpenRA.Mods.Common.Graphics; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits.Render +{ + [Desc(".")] + public class RenderLineInfo : ConditionalTraitInfo + { + [Desc("Color of the line.")] + public readonly Color Color = Color.FromArgb(128, Color.White); + + [Desc("Line width.")] + public readonly float Width = 1; + + [Desc("Line angle.")] + public readonly WAngle Angle = WAngle.Zero; + + [Desc("Line length.")] + public readonly WDist Length = WDist.Zero; + + [Desc("Dash length.")] + public readonly WDist DashLength = WDist.Zero; + + [Desc("Fade duration in ticks.")] + public readonly int FadeTicks = 0; + + [Desc("If true, fade in as well as out.")] + public readonly bool FadeIn = true; + + public override object Create(ActorInitializer init) { return new RenderLine(init.Self, this); } + } + + public class RenderLine : ConditionalTrait, INotifyCreated, IRenderAnnotations, ITick + { + readonly RenderLineInfo info; + int currentAlpha; + int ticksUntilFaded; + int fadePerTick; + + public RenderLine(Actor self, RenderLineInfo info) + : base(info) + { + this.info = info; + currentAlpha = info.Color.ToAhsv().A; + ticksUntilFaded = info.FadeTicks; + fadePerTick = info.FadeTicks > 0 ? currentAlpha / info.FadeTicks : 0; + } + + protected override void Created(Actor self) + { + base.Created(self); + } + + void ITick.Tick(Actor self) + { + if (info.FadeTicks == 0) + return; + + if (--ticksUntilFaded <= 0) + { + ticksUntilFaded = info.FadeTicks; + + if (info.FadeIn) + fadePerTick *= -1; + else + currentAlpha = info.Color.ToAhsv().A; + } + + currentAlpha -= fadePerTick; + } + + public IEnumerable LineRenderables(Actor self, WorldRenderer wr) + { + if (!self.Owner.IsAlliedWith(self.World.RenderPlayer)) + yield break; + + if (IsTraitDisabled) + yield break; + + var dashLength = info.DashLength == WDist.Zero ? info.Length : info.DashLength; + var dashVector = new WVec(0, -dashLength.Length, 0); + dashVector = dashVector.Rotate(WRot.FromYaw(info.Angle)); + + var currentDashStartPos = self.CenterPosition; + var lengthTravelled = WDist.Zero; + var color = Color.FromArgb(currentAlpha, info.Color); + + while (lengthTravelled.Length < info.Length.Length) + { + lengthTravelled = lengthTravelled + (dashLength * 2); + yield return new LineAnnotationRenderable(currentDashStartPos, currentDashStartPos + dashVector, info.Width, color); + currentDashStartPos += (dashVector * 2); + } + } + + IEnumerable IRenderAnnotations.RenderAnnotations(Actor self, WorldRenderer wr) + { + return LineRenderables(self, wr); + } + + bool IRenderAnnotations.SpatiallyPartitionable { get { return false; } } + } +} diff --git a/OpenRA.Mods.CA/Traits/Render/RenderShroudCircleCA.cs b/OpenRA.Mods.CA/Traits/Render/RenderShroudCircleCA.cs index a0fcd8c0e8..8545ddcb1d 100644 --- a/OpenRA.Mods.CA/Traits/Render/RenderShroudCircleCA.cs +++ b/OpenRA.Mods.CA/Traits/Render/RenderShroudCircleCA.cs @@ -1,11 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -17,11 +16,12 @@ using OpenRA.Primitives; using OpenRA.Traits; -namespace OpenRA.Mods.CA.Traits +namespace OpenRA.Mods.CA.Traits.Render { public enum RangeCircleVisibility { Always, WhenSelected } - public class RenderShroudCircleCAInfo : TraitInfo + [Desc("CA version can be set to be visible either always, or only when actor is selected, and allows alpha to be defined for player color.")] + public class RenderShroudCircleCAInfo : ConditionalTraitInfo { [Desc("Color of the circle.")] public readonly Color Color = Color.FromArgb(128, Color.Cyan); @@ -38,21 +38,34 @@ public class RenderShroudCircleCAInfo : TraitInfo [Desc("Range circle border width.")] public readonly float ContrastColorWidth = 3; + [Desc("Player relationships which will be able to see the circle.", + "Valid values are combinations of `None`, `Ally`, `Enemy` and `Neutral`.")] + public readonly PlayerRelationship ValidRelationships = PlayerRelationship.Ally; + + [Desc("If set, the color of the owning player will be used instead of `Color`.")] + public readonly bool UsePlayerColor = false; + + [Desc("The alpha value [from 0 to 255] of color used for the player color.")] + public readonly int PlayerColorAlpha = 255; + public override object Create(ActorInitializer init) { return new RenderShroudCircleCA(init.Self, this); } } - public class RenderShroudCircleCA : INotifyCreated, IRenderAnnotationsWhenSelected, IRenderAnnotations + public class RenderShroudCircleCA : ConditionalTrait, INotifyCreated, IRenderAnnotationsWhenSelected, IRenderAnnotations { readonly RenderShroudCircleCAInfo info; WDist range; public RenderShroudCircleCA(Actor self, RenderShroudCircleCAInfo info) + : base(info) { this.info = info; } - void INotifyCreated.Created(Actor self) + protected override void Created(Actor self) { + base.Created(self); + range = self.TraitsImplementing() .Select(cs => cs.Info.Range) .DefaultIfEmpty(WDist.Zero) @@ -61,7 +74,12 @@ void INotifyCreated.Created(Actor self) public IEnumerable RangeCircleRenderables(Actor self, WorldRenderer wr, RangeCircleVisibility visibility) { - if (!self.Owner.IsAlliedWith(self.World.RenderPlayer)) + if (IsTraitDisabled) + yield break; + + var p = self.World.RenderPlayer; + + if (p != null && !Info.ValidRelationships.HasRelationship(self.Owner.RelationshipWith(p)) && !(p.Spectating && !p.NonCombatant)) yield break; if (info.Visible == visibility) @@ -69,7 +87,7 @@ public IEnumerable RangeCircleRenderables(Actor self, WorldRenderer self.CenterPosition, range, 0, - info.Color, + info.UsePlayerColor ? Color.FromArgb(info.PlayerColorAlpha, self.OwnerColor()) : info.Color, info.Width, info.ContrastColor, info.ContrastColorWidth); diff --git a/OpenRA.Mods.CA/Traits/Render/TimedConditionBarCA.cs b/OpenRA.Mods.CA/Traits/Render/TimedConditionBarCA.cs new file mode 100644 index 0000000000..1becddf98c --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Render/TimedConditionBarCA.cs @@ -0,0 +1,65 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.Common.Traits.Render +{ + [Desc("Visualizes the remaining time for a condition. CA version is conditional and allows relationship to be specified.")] + sealed class TimedConditionBarCAInfo : ConditionalTraitInfo + { + [FieldLoader.Require] + [Desc("Condition that this bar corresponds to")] + public readonly string Condition = null; + + public readonly Color Color = Color.Red; + + [Desc("Relationships that can see the bar.")] + public readonly PlayerRelationship ValidRelationships = PlayerRelationship.Ally; + + public override object Create(ActorInitializer init) { return new TimedConditionBarCA(init.Self, this); } + } + + sealed class TimedConditionBarCA : ConditionalTrait, ISelectionBar, IConditionTimerWatcher + { + readonly TimedConditionBarCAInfo info; + readonly Actor self; + float value; + + public TimedConditionBarCA(Actor self, TimedConditionBarCAInfo info) + : base(info) + { + this.self = self; + this.info = info; + } + + void IConditionTimerWatcher.Update(int duration, int remaining) + { + value = duration > 0 ? remaining * 1f / duration : 0; + } + + string IConditionTimerWatcher.Condition => info.Condition; + + float ISelectionBar.GetValue() + { + if (IsTraitDisabled) + return 0; + + if (Info.ValidRelationships.HasRelationship(self.Owner.RelationshipWith(self.World.RenderPlayer))) + return 0; + + return value; + } + + Color ISelectionBar.GetColor() { return info.Color; } + bool ISelectionBar.DisplayWhenEmpty => false; + } +} diff --git a/OpenRA.Mods.CA/Traits/Render/TriggersProductionDoorOverlay.cs b/OpenRA.Mods.CA/Traits/Render/TriggersProductionDoorOverlay.cs new file mode 100644 index 0000000000..f3b2119211 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Render/TriggersProductionDoorOverlay.cs @@ -0,0 +1,46 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Linq; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits.Render +{ + [Desc("Play production door animation on allied building when unit is produced.")] + public class TriggersProductionDoorOverlayInfo : TraitInfo + { + public override object Create(ActorInitializer init) { return new TriggersProductionDoorOverlay(init.Self, this); } + } + + public class TriggersProductionDoorOverlay : INotifyProduction, INotifyCreated + { + WithProductionDoorOverlayCA producerDoorTrait; + + public TriggersProductionDoorOverlay(Actor self, TriggersProductionDoorOverlayInfo info) {} + + void INotifyCreated.Created(Actor self) + { + var producer = self.World.ActorMap.GetActorsAt(self.Location) + .FirstOrDefault(a => + a != self + && a.Owner.IsAlliedWith(self.Owner) + && a.Info.HasTraitInfo()); + + if (producer != null) + producerDoorTrait = producer.Trait(); + } + + void INotifyProduction.UnitProduced(Actor self, Actor other, CPos exit) + { + producerDoorTrait?.OpenDoor(other, exit); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Render/WithActivateAnimation.cs b/OpenRA.Mods.CA/Traits/Render/WithActivateAnimation.cs index a9dc2fd8ee..4f99e67c47 100644 --- a/OpenRA.Mods.CA/Traits/Render/WithActivateAnimation.cs +++ b/OpenRA.Mods.CA/Traits/Render/WithActivateAnimation.cs @@ -1,11 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2007-2019 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion diff --git a/OpenRA.Mods.CA/Traits/Render/WithCargoHatchAnimation.cs b/OpenRA.Mods.CA/Traits/Render/WithCargoHatchAnimation.cs index 25320d891e..48710cb5db 100644 --- a/OpenRA.Mods.CA/Traits/Render/WithCargoHatchAnimation.cs +++ b/OpenRA.Mods.CA/Traits/Render/WithCargoHatchAnimation.cs @@ -1,16 +1,14 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion using System.Linq; -using OpenRA.Mods.Common.Traits; using OpenRA.Mods.Common.Traits.Render; using OpenRA.Traits; diff --git a/OpenRA.Mods.CA/Traits/Render/WithChronoshiftChargePipsDecoration.cs b/OpenRA.Mods.CA/Traits/Render/WithChronoshiftChargePipsDecoration.cs new file mode 100644 index 0000000000..5dadf5284e --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Render/WithChronoshiftChargePipsDecoration.cs @@ -0,0 +1,90 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using OpenRA.Graphics; +using OpenRA.Mods.Common.Traits.Render; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits.Render +{ + public class WithChronoshiftChargePipsDecorationInfo : WithDecorationBaseInfo, Requires + { + [Desc("Number of pips to display. Defaults to Cargo.MaxWeight.")] + public readonly int PipCount = -1; + + [Desc("If non-zero, override the spacing between adjacent pips.")] + public readonly int2 PipStride = int2.Zero; + + [Desc("Image that defines the pip sequences.")] + public readonly string Image = "pips"; + + [SequenceReference(nameof(Image))] + [Desc("Sequence used for empty pips.")] + public readonly string EmptySequence = "pip-empty"; + + [SequenceReference(nameof(Image))] + [Desc("Sequence used for full pips that aren't defined in CustomPipSequences.")] + public readonly string FullSequence = "pip-green"; + + [SequenceReference(nameof(Image), dictionaryReference: LintDictionaryReference.Values)] + [Desc("Pip sequence to use for specific passenger actors.")] + public readonly Dictionary CustomPipSequences = new Dictionary(); + + [PaletteReference] + public readonly string Palette = "chrome"; + + [Desc("Will not show anything if total pips is less than this.")] + public readonly int MinimumPips = 2; + + public override object Create(ActorInitializer init) { return new WithChronoshiftChargePipsDecoration(init.Self, this); } + } + + public class WithChronoshiftChargePipsDecoration : WithDecorationBase + { + readonly PortableChronoCA pc; + readonly Animation pips; + readonly int pipCount; + + public WithChronoshiftChargePipsDecoration(Actor self, WithChronoshiftChargePipsDecorationInfo info) + : base(self, info) + { + pc = self.Trait(); + pipCount = info.PipCount > 0 ? info.PipCount : pc.MaxCharges; + pips = new Animation(self.World, info.Image); + } + + protected override IEnumerable RenderDecoration(Actor self, WorldRenderer wr, int2 screenPos) + { + pips.PlayRepeating(Info.EmptySequence); + + var palette = wr.Palette(Info.Palette); + var pipSize = pips.Image.Size.XY.ToInt2(); + var pipStride = Info.PipStride != int2.Zero ? Info.PipStride : new int2(pipSize.X, 0); + screenPos -= pipSize / 2; + + var currentAmmo = pc.Charges; + var totalAmmo = pc.MaxCharges; + + var pipCount = Info.PipCount > 0 ? Info.PipCount : totalAmmo; + + if (pipCount < Info.MinimumPips) + yield break; + + for (var i = 0; i < pipCount; i++) + { + pips.PlayRepeating(currentAmmo * pipCount > i * totalAmmo ? Info.FullSequence : Info.EmptySequence); + yield return new UISpriteRenderable(pips.Image, self.CenterPosition, screenPos, 0, palette); + + screenPos += pipStride; + } + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Render/WithChronosphereOverlay.cs b/OpenRA.Mods.CA/Traits/Render/WithChronosphereOverlay.cs index e34863860b..42f767d33d 100644 --- a/OpenRA.Mods.CA/Traits/Render/WithChronosphereOverlay.cs +++ b/OpenRA.Mods.CA/Traits/Render/WithChronosphereOverlay.cs @@ -1,19 +1,17 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion -using OpenRA.Mods.Cnc.Traits; using OpenRA.Mods.Common.Effects; using OpenRA.Traits; -namespace OpenRA.Mods.CA.Traits +namespace OpenRA.Mods.CA.Traits.Render { [Desc("Renders the chronosphere bubble effects.")] public class WithChronosphereOverlayInfo : TraitInfo diff --git a/OpenRA.Mods.CA/Traits/Render/WithColoredSelectionBox.cs b/OpenRA.Mods.CA/Traits/Render/WithColoredSelectionBox.cs new file mode 100644 index 0000000000..026ace66cf --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Render/WithColoredSelectionBox.cs @@ -0,0 +1,153 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.Graphics; +using OpenRA.Mods.Common.Graphics; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; +using OpenRA.Widgets; + +namespace OpenRA.Mods.CA.Traits.Render +{ + public enum ColorSource { Fixed, Player, Relationship, Team } + + [Desc("Renders a player colored selection box.")] + class WithColoredSelectionBoxInfo : ConditionalTraitInfo + { + [Desc("What to base the color on.")] + public readonly ColorSource ColorSource = ColorSource.Fixed; + + [Desc("Color of the box when not using player/relationship/team color.")] + public readonly Color Color = Color.White; + + [Desc("If ColorSource is Relationship, use this color for allies.")] + public readonly Color? AllyColor = null; + + [Desc("If ColorSource is Relationship, use this color for enemies.")] + public readonly Color? EnemyColor = null; + + [Desc("If ColorSource is Relationship, use this color for neutrals.")] + public readonly Color? NeutralColor = null; + + [Desc("List of colors to use for teams.")] + public readonly Color[] TeamColors = + { + Color.FromArgb(0, 128, 255), + Color.FromArgb(255, 0, 0), + Color.FromArgb(255, 204, 0), + Color.FromArgb(0, 200, 0), + }; + + [Desc("Player relationships who can view the decoration.")] + public readonly PlayerRelationship ValidRelationships = PlayerRelationship.Ally; + + public override object Create(ActorInitializer init) { return new WithColoredSelectionBox(init.Self, this); } + } + + class WithColoredSelectionBox : ConditionalTrait, IRenderAnnotations, INotifyCreated, INotifyOwnerChanged + { + public new readonly WithColoredSelectionBoxInfo Info; + Interactable interactable; + Color color; + Color allyColor; + Color enemyColor; + Color neutralColor; + PlayerRelationship relationship; + int team; + + public WithColoredSelectionBox(Actor self, WithColoredSelectionBoxInfo info) + : base(info) + { + Info = info; + allyColor = Info.AllyColor ?? ChromeMetrics.Get("PlayerStanceColorAllies"); + enemyColor = Info.EnemyColor ?? ChromeMetrics.Get("PlayerStanceColorEnemies"); + neutralColor = Info.NeutralColor ?? ChromeMetrics.Get("PlayerStanceColorNeutrals"); + Update(self); + } + + protected override void Created(Actor self) + { + interactable = self.TraitOrDefault(); + } + + IEnumerable IRenderAnnotations.RenderAnnotations(Actor self, WorldRenderer wr) + { + if (IsTraitDisabled || interactable == null) + yield break; + + if (self.World.RenderPlayer != null) + { + if (!Info.ValidRelationships.HasRelationship(relationship)) + yield break; + } + + if (self.World.FogObscures(self)) + yield break; + + var bounds = interactable.DecorationBounds(self, wr); + var boxBounds = new Rectangle(bounds.X, bounds.Y, bounds.Width, bounds.Height); + yield return new SelectionBoxAnnotationRenderable(self, boxBounds, color); + } + + bool IRenderAnnotations.SpatiallyPartitionable { get { return false; } } + + void INotifyOwnerChanged.OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) + { + Update(self); + } + + void Update(Actor self) + { + var c = self.World.LobbyInfo.Clients.FirstOrDefault(i => i.Index == self.Owner.ClientIndex); + team = c?.Team ?? 0; + + if (self.World.RenderPlayer != null) + relationship = self.Owner.RelationshipWith(self.World.RenderPlayer); + else + relationship = PlayerRelationship.None; + + if (Info.ColorSource == ColorSource.Relationship) + { + switch (relationship) + { + case PlayerRelationship.Ally: + color = allyColor; + break; + + case PlayerRelationship.Enemy: + color = enemyColor; + break; + + default: + color = neutralColor; + break; + } + } + else if (Info.ColorSource == ColorSource.Team) + { + if (team > 0 && Info.TeamColors.Length >= team) + color = Info.TeamColors[team - 1]; + else + color = neutralColor; + } + else if (Info.ColorSource == ColorSource.Player) + { + color = self.OwnerColor(); + } + else + { + color = Info.Color; + } + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Render/WithDeliveryOverlay.cs b/OpenRA.Mods.CA/Traits/Render/WithDeliveryOverlay.cs index f9f0b04130..f12002b7be 100644 --- a/OpenRA.Mods.CA/Traits/Render/WithDeliveryOverlay.cs +++ b/OpenRA.Mods.CA/Traits/Render/WithDeliveryOverlay.cs @@ -1,11 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -54,7 +53,7 @@ public WithDeliveryOverlay(Actor self, WithDeliveryOverlayInfo info) overlay.IsDecoration = true; anim = new AnimationWithOffset(overlay, - () => body.LocalToWorld(info.Offset.Rotate(body.QuantizeOrientation(self, self.Orientation))), + () => body.LocalToWorld(info.Offset.Rotate(body.QuantizeOrientation(self.Orientation))), () => IsTraitDisabled || !delivering); rs.Add(anim, info.Palette, info.IsPlayerPalette); diff --git a/OpenRA.Mods.CA/Traits/Render/WithDetectionCircle.cs b/OpenRA.Mods.CA/Traits/Render/WithDetectionCircle.cs index dbf440e3fc..5a782e161a 100644 --- a/OpenRA.Mods.CA/Traits/Render/WithDetectionCircle.cs +++ b/OpenRA.Mods.CA/Traits/Render/WithDetectionCircle.cs @@ -1,11 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion diff --git a/OpenRA.Mods.CA/Traits/Render/WithDisguiseTargetPalette.cs b/OpenRA.Mods.CA/Traits/Render/WithDisguiseTargetPalette.cs new file mode 100644 index 0000000000..3876a30e58 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Render/WithDisguiseTargetPalette.cs @@ -0,0 +1,57 @@ +#region Copyright & License Information +/* + * Copyright (c) The OpenRA Developers and Contributors + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. For more + * information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.Graphics; +using OpenRA.Mods.Cnc.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.Common.Traits.Render +{ + [Desc(".")] + public class WithDisguiseTargetPaletteInfo : ConditionalTraitInfo + { + public override object Create(ActorInitializer init) { return new WithDisguiseTargetPalette(init.Self, this); } + } + + public class WithDisguiseTargetPalette : ConditionalTrait, IRenderModifier + { + readonly Disguise disguise; + + public WithDisguiseTargetPalette(Actor self, WithDisguiseTargetPaletteInfo info) + : base(info) + { + disguise = self.Trait(); + } + + IEnumerable IRenderModifier.ModifyRender(Actor self, WorldRenderer wr, IEnumerable r) + { + if (IsTraitDisabled || !disguise.IsTraitEnabled() || !disguise.Disguised) + return r; + + var disguisedAs = disguise.AsActor; + var renderSprites = disguisedAs.TraitInfoOrDefault(); + var palette = wr.Palette(renderSprites.Palette ?? renderSprites.PlayerPalette + disguise.Owner.InternalName); + + if (palette == null) + return r; + else + return r.Select(a => !a.IsDecoration && a is IPalettedRenderable pr ? pr.WithPalette(palette) : a); + } + + IEnumerable IRenderModifier.ModifyScreenBounds(Actor self, WorldRenderer wr, IEnumerable bounds) + { + return bounds; + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Render/WithDockingAnimationCA.cs b/OpenRA.Mods.CA/Traits/Render/WithDockingAnimationCA.cs new file mode 100644 index 0000000000..1616efc07a --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Render/WithDockingAnimationCA.cs @@ -0,0 +1,84 @@ +#region Copyright & License Information +/* + * Copyright (c) The OpenRA Developers and Contributors + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. For more + * information, see COPYING. + */ +#endregion + +using System; +using System.Linq; +using OpenRA.Traits; + +namespace OpenRA.Mods.Common.Traits.Render +{ + public class WithDockingAnimationCAInfo : TraitInfo, Requires, Requires + { + [SequenceReference] + [Desc("Displayed when docking to refinery.")] + public readonly string DockSequence = "dock"; + + [SequenceReference] + [Desc("Looped while unloading at refinery.")] + public readonly string DockLoopSequence = "dock-loop"; + + [Desc("Valid refinery types at which to play the animation.")] + public readonly string[] RefineryTypes = { }; + + public override object Create(ActorInitializer init) { return new WithDockingAnimationCA(init.Self, this); } + } + + public class WithDockingAnimationCA : IDockClientBody + { + readonly WithDockingAnimationCAInfo info; + readonly WithSpriteBody wsb; + readonly DockClientManager dockClientManager; + bool docked; + + public WithDockingAnimationCA(Actor self, WithDockingAnimationCAInfo info) + { + this.info = info; + wsb = self.Trait(); + dockClientManager = self.Trait(); + } + + bool RefineryIsValid + { + get + { + if (!info.RefineryTypes.Any()) + return true; + + if (dockClientManager.ReservedHost != null && info.RefineryTypes.Contains(dockClientManager.ReservedHostActor.Info.Name)) + return true; + + return false; + } + } + + void IDockClientBody.PlayDockAnimation(Actor self, Action after) + { + if (RefineryIsValid) + { + wsb.PlayCustomAnimation(self, info.DockSequence, () => { wsb.PlayCustomAnimationRepeating(self, info.DockLoopSequence); after(); }); + docked = true; + } + else + after(); + } + + void IDockClientBody.PlayReverseDockAnimation(Actor self, Action after) + { + if (RefineryIsValid || docked) + { + wsb.PlayCustomAnimationBackwards(self, info.DockSequence, () => after()); + docked = false; + } + else + after(); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Render/WithEnabledAnimation.cs b/OpenRA.Mods.CA/Traits/Render/WithEnabledAnimation.cs new file mode 100644 index 0000000000..91ce76a007 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Render/WithEnabledAnimation.cs @@ -0,0 +1,51 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Linq; +using OpenRA.Mods.Common.Traits; +using OpenRA.Mods.Common.Traits.Render; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits.Render +{ + [Desc("Plays an animation when trait is enabled or re-enabled, replacing the default body animation (plays once, unlike WithIdleAnimation).")] + public class WithEnabledAnimationInfo : ConditionalTraitInfo, Requires + { + [SequenceReference] + [Desc("Sequence names to use.")] + public readonly string Sequence = "make"; + + [Desc("Which sprite body to play the animation on.")] + public readonly string Body = "body"; + + public override object Create(ActorInitializer init) { return new WithEnabledAnimation(init.Self, this); } + } + + public class WithEnabledAnimation : ConditionalTrait + { + readonly WithSpriteBody wsb; + + public WithEnabledAnimation(Actor self, WithEnabledAnimationInfo info) + : base(info) + { + wsb = self.TraitsImplementing().Single(w => w.Info.Name == Info.Body); + } + + protected override void TraitEnabled(Actor self) + { + wsb.PlayCustomAnimation(self, Info.Sequence); + } + + protected override void TraitDisabled(Actor self) + { + wsb.CancelCustomAnimation(self); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Render/WithEnterExitWorldOverlay.cs b/OpenRA.Mods.CA/Traits/Render/WithEnterExitWorldOverlay.cs new file mode 100644 index 0000000000..effa4a4bd5 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Render/WithEnterExitWorldOverlay.cs @@ -0,0 +1,62 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Mods.Common.Effects; +using OpenRA.Graphics; +using OpenRA.Traits; + +namespace OpenRA.Mods.Common.Traits.Render +{ + [Desc("Draws an overlay on top of a make animation.")] + public class WithEnterExitWorldOverlayInfo : TraitInfo + { + [Desc("Image containing launch effect sequence.")] + public readonly string Image = null; + + [Desc("Launch effect sequence to play.")] + [SequenceReference(nameof(Image))] + public readonly string EnterSequence = null; + + [Desc("Launch effect sequence to play.")] + [SequenceReference(nameof(Image))] + public readonly string ExitSequence = null; + + [PaletteReference(nameof(IsPlayerPalette))] + [Desc("Custom palette name.")] + public readonly string Palette = null; + + [Desc("Custom palette is a player palette BaseName.")] + public readonly bool IsPlayerPalette = false; + + public override object Create(ActorInitializer init) { return new WithEnterExitWorldOverlay(init.Self, this); } + } + + public class WithEnterExitWorldOverlay : INotifyAddedToWorld, INotifyRemovedFromWorld + { + readonly WithEnterExitWorldOverlayInfo info; + + public WithEnterExitWorldOverlay(Actor self, WithEnterExitWorldOverlayInfo info) + { + this.info = info; + } + + void INotifyAddedToWorld.AddedToWorld(Actor self) + { + if (info.EnterSequence != null) + self.World.AddFrameEndTask(w => w.Add(new SpriteEffect(self.CenterPosition, w, info.Image, info.EnterSequence, info.Palette, delay: 0))); + } + + void INotifyRemovedFromWorld.RemovedFromWorld(Actor self) + { + if (info.ExitSequence != null) + self.World.AddFrameEndTask(w => w.Add(new SpriteEffect(self.CenterPosition, w, info.Image, info.ExitSequence, info.Palette, delay: 0))); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Render/WithFlashEffect.cs b/OpenRA.Mods.CA/Traits/Render/WithFlashEffect.cs new file mode 100644 index 0000000000..53991dfb18 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Render/WithFlashEffect.cs @@ -0,0 +1,70 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Mods.Common.Effects; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits.Render +{ + [Desc("Flashes the target at a set interval.")] + class WithFlashEffectInfo : ConditionalTraitInfo + { + [Desc("Interval in ticks between flashes.")] + public readonly int Interval = 25; + + [Desc("Flash color.")] + public readonly Color Color = Color.FromArgb(80, Color.Red); + + public override object Create(ActorInitializer init) { return new WithFlashEffect(this); } + } + + class WithFlashEffect : ConditionalTrait, ITick + { + public new readonly WithFlashEffectInfo Info; + int intervalTicks; + + public WithFlashEffect(WithFlashEffectInfo info) + : base(info) + { + Info = info; + } + + void ITick.Tick(Actor self) + { + if (IsTraitDisabled || !self.IsInWorld) + return; + + if (intervalTicks == 0) + { + self.World.AddFrameEndTask(w => + { + w.Add(new FlashTarget(self, Info.Color, 0.5f, 1, 2, 0)); + }); + } + + intervalTicks++; + + if (intervalTicks >= Info.Interval) + intervalTicks = 0; + } + + protected override void TraitEnabled(Actor self) + { + intervalTicks = 0; + } + + protected override void TraitDisabled(Actor self) + { + intervalTicks = 0; + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Render/WithHarvestAnimationCA.cs b/OpenRA.Mods.CA/Traits/Render/WithHarvestAnimationCA.cs new file mode 100644 index 0000000000..39090b723b --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Render/WithHarvestAnimationCA.cs @@ -0,0 +1,59 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Linq; +using OpenRA.Traits; + +namespace OpenRA.Mods.Common.Traits.Render +{ + [Desc("CA version fixes jerky turning caused by fewer harvest facings than normal facings.")] + public class WithHarvestAnimationCAInfo : TraitInfo, Requires, Requires + { + [SequenceReference] + [Desc("Displayed while harvesting.")] + public readonly string HarvestSequence = "harvest"; + + [Desc("Which sprite body to play the animation on.")] + public readonly string Body = "body"; + + public override object Create(ActorInitializer init) { return new WithHarvestAnimationCA(init, this); } + } + + public class WithHarvestAnimationCA : INotifyHarvestAction, INotifyMoving + { + public readonly WithHarvestAnimationCAInfo Info; + readonly WithSpriteBody wsb; + + public WithHarvestAnimationCA(ActorInitializer init, WithHarvestAnimationCAInfo info) + { + Info = info; + wsb = init.Self.TraitsImplementing().Single(w => w.Info.Name == Info.Body); + } + + void INotifyHarvestAction.Harvested(Actor self, string resourceType) + { + var sequence = wsb.NormalizeSequence(self, Info.HarvestSequence); + if (wsb.DefaultAnimation.HasSequence(sequence) && wsb.DefaultAnimation.CurrentSequence.Name != sequence) + wsb.PlayCustomAnimation(self, sequence); + } + + // ---- added for CA, prevents jerky turning due to fewer harvest facings than normal facings + void INotifyMoving.MovementTypeChanged(Actor self, MovementType type) + { + if (type == MovementType.None) + return; + + wsb.CancelCustomAnimation(self); + } + + void INotifyHarvestAction.MovingToResources(Actor self, CPos targetCell) { } + void INotifyHarvestAction.MovementCancelled(Actor self) { } + } +} diff --git a/OpenRA.Mods.CA/Traits/Render/WithHarvesterCapacityBar.cs b/OpenRA.Mods.CA/Traits/Render/WithHarvesterCapacityBar.cs index 49c861197e..82f8676a29 100644 --- a/OpenRA.Mods.CA/Traits/Render/WithHarvesterCapacityBar.cs +++ b/OpenRA.Mods.CA/Traits/Render/WithHarvesterCapacityBar.cs @@ -1,11 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -13,7 +12,7 @@ using OpenRA.Primitives; using OpenRA.Traits; -namespace OpenRA.Mods.CA.Traits +namespace OpenRA.Mods.CA.Traits.Render { [Desc("Shows a bar displaying how full the harvester is.")] public class WithHarvesterCapacityBarInfo : TraitInfo, Requires diff --git a/OpenRA.Mods.CA/Traits/Render/WithMirageSpriteBody.cs b/OpenRA.Mods.CA/Traits/Render/WithMirageSpriteBody.cs index 12f3a626ed..244e89f2e6 100644 --- a/OpenRA.Mods.CA/Traits/Render/WithMirageSpriteBody.cs +++ b/OpenRA.Mods.CA/Traits/Render/WithMirageSpriteBody.cs @@ -1,11 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -53,7 +52,7 @@ void ITick.Tick(Actor self) { var renderSprites = disguiseActor.TraitInfoOrDefault(); if (renderSprites != null) - disguiseImage = renderSprites.GetImage(disguiseActor, self.World.Map.Rules.Sequences, disguisePlayer.Faction.InternalName); + disguiseImage = renderSprites.GetImage(disguiseActor, disguisePlayer.Faction.InternalName); } var withSpriteBody = disguiseActor.TraitInfoOrDefault(); diff --git a/OpenRA.Mods.CA/Traits/Render/WithMuzzleOverlayCA.cs b/OpenRA.Mods.CA/Traits/Render/WithMuzzleOverlayCA.cs new file mode 100644 index 0000000000..1d9720b40a --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Render/WithMuzzleOverlayCA.cs @@ -0,0 +1,119 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Linq; +using OpenRA.Graphics; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.Common.Traits.Render +{ + [Desc("Renders the MuzzleSequence from the Armament trait.", + "CA version allows player color palette.")] + class WithMuzzleOverlayCAInfo : ConditionalTraitInfo, Requires, Requires, Requires + { + [Desc("Ignore the weapon position, and always draw relative to the center of the actor")] + public readonly bool IgnoreOffset = false; + + [Desc("Whether to use player palette.")] + public readonly bool IsPlayerPalette = false; + + public override object Create(ActorInitializer init) { return new WithMuzzleOverlayCA(init.Self, this); } + } + + class WithMuzzleOverlayCA : ConditionalTrait, INotifyAttack, IRender, ITick + { + readonly Dictionary visible = new Dictionary(); + readonly Dictionary anims = new Dictionary(); + readonly Func getFacing; + readonly Armament[] armaments; + + public WithMuzzleOverlayCA(Actor self, WithMuzzleOverlayCAInfo info) + : base(info) + { + var render = self.Trait(); + var facing = self.TraitOrDefault(); + + armaments = self.TraitsImplementing() + .Where(arm => arm.Info.MuzzleSequence != null) + .ToArray(); + + foreach (var arm in armaments) + { + foreach (var b in arm.Barrels) + { + var barrel = b; + var turreted = self.TraitsImplementing() + .FirstOrDefault(t => t.Name == arm.Info.Turret); + + if (turreted != null) + getFacing = () => turreted.WorldOrientation.Yaw; + else if (facing != null) + getFacing = () => facing.Facing; + else + getFacing = () => WAngle.Zero; + + var muzzleFlash = new Animation(self.World, render.GetImage(self), getFacing); + visible.Add(barrel, false); + anims.Add(barrel, + new AnimationWithOffset(muzzleFlash, + () => info.IgnoreOffset ? WVec.Zero : arm.MuzzleOffset(self, barrel), + () => IsTraitDisabled || !visible[barrel], + p => RenderUtils.ZOffsetFromCenter(self, p, 2))); + } + } + } + + void INotifyAttack.Attacking(Actor self, in Target target, Armament a, Barrel barrel) + { + if (a == null || barrel == null || !armaments.Contains(a)) + return; + + var sequence = a.Info.MuzzleSequence; + visible[barrel] = true; + anims[barrel].Animation.PlayThen(sequence, () => visible[barrel] = false); + } + + void INotifyAttack.PreparingAttack(Actor self, in Target target, Armament a, Barrel barrel) { } + + IEnumerable IRender.Render(Actor self, WorldRenderer wr) + { + foreach (var arm in armaments) + { + // CA difference here - use player palette if IsPlayerPalette is true + var paletteName = Info.IsPlayerPalette ? arm.Info.MuzzlePalette + self.Owner.InternalName : arm.Info.MuzzlePalette; + var palette = wr.Palette(paletteName); + foreach (var b in arm.Barrels) + { + var anim = anims[b]; + if (anim.DisableFunc != null && anim.DisableFunc()) + continue; + + foreach (var r in anim.Render(self, palette)) + yield return r; + } + } + } + + IEnumerable IRender.ScreenBounds(Actor self, WorldRenderer wr) + { + // Muzzle flashes don't contribute to actor bounds + yield break; + } + + void ITick.Tick(Actor self) + { + foreach (var a in anims.Values) + a.Animation.Tick(); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Render/WithNameTagDecorationCA.cs b/OpenRA.Mods.CA/Traits/Render/WithNameTagDecorationCA.cs new file mode 100644 index 0000000000..c7770f1828 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Render/WithNameTagDecorationCA.cs @@ -0,0 +1,165 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.Graphics; +using OpenRA.Mods.Common.Graphics; +using OpenRA.Mods.Common.Traits.Render; +using OpenRA.Primitives; +using OpenRA.Traits; +using OpenRA.Widgets; + +namespace OpenRA.Mods.CA.Traits.Render +{ + [Desc("Displays the player name above the unit. Copy of WithNameTagDecoration, ", + "but also allows contrast colors to be specified.")] + public class WithNameTagDecorationCAInfo : WithDecorationBaseInfo + { + public readonly int MaxLength = 10; + + public readonly string Font = "TinyBold"; + + [Desc("What to base the color on.")] + public readonly ColorSource ColorSource = ColorSource.Fixed; + + [Desc("Color of the box when not using player/relationship/team color.")] + public readonly Color Color = Color.White; + + [Desc("If ColorSource is Relationship, use this color for allies.")] + public readonly Color? AllyColor = null; + + [Desc("If ColorSource is Relationship, use this color for enemies.")] + public readonly Color? EnemyColor = null; + + [Desc("If ColorSource is Relationship, use this color for neutrals.")] + public readonly Color? NeutralColor = null; + + [Desc("List of colors to use for teams.")] + public readonly Color[] TeamColors = + { + Color.FromArgb(0, 128, 255), + Color.FromArgb(255, 0, 0), + Color.FromArgb(255, 204, 0), + Color.FromArgb(0, 200, 0), + }; + + [Desc("Dark contrast color.")] + public readonly Color? ContrastColorDark; + + [Desc("Light contrast color.")] + public readonly Color? ContrastColorLight; + + public override object Create(ActorInitializer init) { return new WithNameTagDecorationCA(init.Self, this); } + + public override void RulesetLoaded(Ruleset rules, ActorInfo ai) + { + if (!Game.ModData.Manifest.Get().FontList.ContainsKey(Font)) + throw new YamlException($"Font '{Font}' is not listed in the mod.yaml's Fonts section"); + + base.RulesetLoaded(rules, ai); + } + } + + public class WithNameTagDecorationCA : WithDecorationBase, INotifyOwnerChanged + { + readonly SpriteFont font; + string name; + Color color; + Color allyColor; + Color enemyColor; + Color neutralColor; + Color contrastColorDark; + Color contrastColorLight; + PlayerRelationship relationship; + int team; + + public WithNameTagDecorationCA(Actor self, WithNameTagDecorationCAInfo info) + : base(self, info) + { + font = Game.Renderer.Fonts[info.Font]; + allyColor = Info.AllyColor ?? ChromeMetrics.Get("PlayerStanceColorAllies"); + enemyColor = Info.EnemyColor ?? ChromeMetrics.Get("PlayerStanceColorEnemies"); + neutralColor = Info.NeutralColor ?? ChromeMetrics.Get("PlayerStanceColorNeutrals"); + contrastColorDark = Info.ContrastColorDark ?? ChromeMetrics.Get("TextContrastColorDark"); + contrastColorLight = Info.ContrastColorLight ?? ChromeMetrics.Get("TextContrastColorLight"); + Update(self); + + name = self.Owner.ResolvedPlayerName; + if (name.Length > info.MaxLength) + name = name.Substring(0, info.MaxLength); + } + + protected override IEnumerable RenderDecoration(Actor self, WorldRenderer wr, int2 screenPos) + { + if (IsTraitDisabled || self.IsDead || !self.IsInWorld || !ShouldRender(self)) + return Enumerable.Empty(); + + var size = font.Measure(name); + return new IRenderable[] + { + new UITextRenderable(font, self.CenterPosition, screenPos - size / 2, 0, color, contrastColorDark, contrastColorLight, name) + }; + } + + void INotifyOwnerChanged.OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) + { + Update(self); + + name = self.Owner.ResolvedPlayerName; + if (name.Length > Info.MaxLength) + name = name.Substring(0, Info.MaxLength); + } + + void Update(Actor self) + { + var c = self.World.LobbyInfo.Clients.FirstOrDefault(i => i.Index == self.Owner.ClientIndex); + team = c?.Team ?? 0; + + if (self.World.RenderPlayer != null) + relationship = self.Owner.RelationshipWith(self.World.RenderPlayer); + else + relationship = PlayerRelationship.None; + + if (Info.ColorSource == ColorSource.Relationship) + { + switch (relationship) + { + case PlayerRelationship.Ally: + color = allyColor; + break; + + case PlayerRelationship.Enemy: + color = enemyColor; + break; + + default: + color = neutralColor; + break; + } + } + else if (Info.ColorSource == ColorSource.Team) + { + if (team > 0 && Info.TeamColors.Length >= team) + color = Info.TeamColors[team - 1]; + else + color = neutralColor; + } + else if (Info.ColorSource == ColorSource.Player) + { + color = self.OwnerColor(); + } + else + { + color = Info.Color; + } + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Render/WithPreviewDecoration.cs b/OpenRA.Mods.CA/Traits/Render/WithPreviewDecoration.cs new file mode 100644 index 0000000000..f915acd4b4 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Render/WithPreviewDecoration.cs @@ -0,0 +1,124 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.Graphics; +using OpenRA.Mods.Common.Traits.Render; +using OpenRA.Primitives; + +namespace OpenRA.Mods.CA.Traits.Render +{ + [Desc("Displays a custom UI overlay relative to the actor's mouseover bounds. Also renders on actor previews.")] + public class WithPreviewDecorationInfo : WithDecorationInfo, IActorPreviewRenderModifierInfo + { + public override object Create(ActorInitializer init) { return new WithPreviewDecoration(init.Self, this); } + + public IActorPreviewRenderModifier GetPreviewRenderModifier(WorldRenderer wr, ActorInfo actorInfo, TypeDictionary inits, Color previewColor) + { + return new WithPreviewDecorationPreviewModifier(wr, actorInfo, this); + } + } + + public class WithPreviewDecoration : WithDecoration + { + public WithPreviewDecoration(Actor self, WithPreviewDecorationInfo info) + : base(self, info) { } + } + + public class WithPreviewDecorationPreviewModifier : IActorPreviewRenderModifier + { + readonly WithPreviewDecorationInfo info; + readonly Animation anim; + readonly PaletteReference palette; + readonly BlinkState[] blinkPattern; + + int tick; + + public WithPreviewDecorationPreviewModifier(WorldRenderer wr, ActorInfo actorInfo, WithPreviewDecorationInfo info) + { + this.info = info; + + var image = info.Image ?? actorInfo.Name; + anim = new Animation(wr.World, image); + anim.PlayRepeating(info.Sequence); + + palette = wr.Palette(info.Palette); + + // For previews, use BlinkPattern if defined, otherwise use first BlinkPatterns entry if any + if (info.BlinkPattern != null && info.BlinkPattern.Length > 0) + blinkPattern = info.BlinkPattern; + else if (info.BlinkPatterns != null && info.BlinkPatterns.Count > 0) + blinkPattern = info.BlinkPatterns.Values.First(); + else + blinkPattern = null; + } + + public void Tick() + { + tick++; + anim.Tick(); + } + + public IEnumerable ModifyPreviewRender(WorldRenderer wr, IEnumerable renderables, Rectangle bounds) + { + // Collect all renderables + var allRenderables = renderables.ToList(); + + // Yield all existing renderables first + foreach (var r in allRenderables) + yield return r; + + if (allRenderables.Count == 0) + yield break; + + // Handle blinking - check if we should render this tick + if (blinkPattern != null && blinkPattern.Length > 0) + { + var i = tick / info.BlinkInterval % blinkPattern.Length; + if (blinkPattern[i] != BlinkState.On) + yield break; + } + + // Calculate position based on Position setting + var pos = GetDecorationPosition(bounds, info.Position); + pos += info.Margin; + + // Render the decoration sprite centered on the calculated position + var sprite = anim.Image; + var screenPos = pos - (sprite.Size.XY / 2).ToInt2(); + + // Use a high ZOffset to ensure decoration renders on top of the actor + yield return new UISpriteRenderable( + sprite, + WPos.Zero, + screenPos, + int.MaxValue, + palette); + } + + static int2 GetDecorationPosition(Rectangle bounds, string position) + { + return position switch + { + "TopLeft" => new int2(bounds.Left, bounds.Top), + "TopRight" => new int2(bounds.Right, bounds.Top), + "BottomLeft" => new int2(bounds.Left, bounds.Bottom), + "BottomRight" => new int2(bounds.Right, bounds.Bottom), + "Top" => new int2(bounds.Left + bounds.Width / 2, bounds.Top), + "Bottom" => new int2(bounds.Left + bounds.Width / 2, bounds.Bottom), + "Left" => new int2(bounds.Left, bounds.Top + bounds.Height / 2), + "Right" => new int2(bounds.Right, bounds.Top + bounds.Height / 2), + "Center" => new int2(bounds.Left + bounds.Width / 2, bounds.Top + bounds.Height / 2), + _ => new int2(bounds.Left, bounds.Top) + }; + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Render/WithPrismChargeAnimation.cs b/OpenRA.Mods.CA/Traits/Render/WithPrismChargeAnimation.cs index f09259c911..16fd65a9f4 100644 --- a/OpenRA.Mods.CA/Traits/Render/WithPrismChargeAnimation.cs +++ b/OpenRA.Mods.CA/Traits/Render/WithPrismChargeAnimation.cs @@ -1,11 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion diff --git a/OpenRA.Mods.CA/Traits/Render/WithPrismLinkVisualization.cs b/OpenRA.Mods.CA/Traits/Render/WithPrismLinkVisualization.cs new file mode 100644 index 0000000000..3a4b1b3de0 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Render/WithPrismLinkVisualization.cs @@ -0,0 +1,83 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.Graphics; +using OpenRA.Mods.Common.Graphics; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; + +namespace OpenRA.Mods.CA.Traits.Render +{ + [Desc("Renders selection boxes on Prism Towers within range.")] + sealed class WithPrismLinkVisualizationInfo : ConditionalTraitInfo, IPlaceBuildingDecorationInfo + { + [Desc("Color of the circle")] + public readonly Color Color = Color.FromArgb(128, Color.Cyan); + + [Desc("Range of the circle")] + public readonly WDist Range = WDist.Zero; + + public IEnumerable RenderAnnotations(WorldRenderer wr, World w, ActorInfo ai, WPos centerPosition) + { + if (EnabledByDefault) + { + var actorsInRange = w.FindActorsInCircle(centerPosition, Range).Where(a => a.Info.HasTraitInfo());; + foreach (var a in actorsInRange) + foreach (var r in a.Trait().RenderPrismLinkageVisualization(a, wr, centerPosition)) + yield return r; + } + } + + public override object Create(ActorInitializer init) { return new WithPrismLinkVisualization(init.Self, this); } + } + + sealed class WithPrismLinkVisualization : ConditionalTrait + { + readonly Actor self; + Selectable selectable; + + public WithPrismLinkVisualization(Actor self, WithPrismLinkVisualizationInfo info) + : base(info) + { + this.self = self; + } + + protected override void Created(Actor self) + { + base.Created(self); + selectable = self.TraitOrDefault(); + } + + bool Visible + { + get + { + if (IsTraitDisabled) + return false; + + var p = self.World.RenderPlayer; + return p == null || self.Owner == p; + } + } + + public IEnumerable RenderPrismLinkageVisualization(Actor self, WorldRenderer wr, WPos source) + { + if (Visible) + { + var bounds = selectable.DecorationBounds(self, wr); + var boxBounds = new Rectangle(bounds.X, bounds.Y, bounds.Width, bounds.Height); + yield return new SelectionBoxAnnotationRenderable(self, boxBounds, Info.Color); + yield return new LineAnnotationRenderable(self.CenterPosition, source, 1, Info.Color); + } + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Render/WithProductionDoorOverlayCA.cs b/OpenRA.Mods.CA/Traits/Render/WithProductionDoorOverlayCA.cs new file mode 100644 index 0000000000..7a4d1044bb --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Render/WithProductionDoorOverlayCA.cs @@ -0,0 +1,99 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.Graphics; +using OpenRA.Mods.Common.Graphics; +using OpenRA.Mods.Common.Traits; +using OpenRA.Mods.Common.Traits.Render; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits.Render +{ + [Desc("Play an animation when a unit exits or blocks the exit after production finished.", + "CA version prevents trait being triggered by actors that don't occupy space and don't move.")] + class WithProductionDoorOverlayCAInfo : ConditionalTraitInfo, IRenderActorPreviewSpritesInfo, Requires, Requires, Requires + { + [SequenceReference] + public readonly string Sequence = "build-door"; + + public IEnumerable RenderPreviewSprites(ActorPreviewInitializer init, string image, int facings, PaletteReference p) + { + var anim = new Animation(init.World, image); + anim.PlayFetchIndex(RenderSprites.NormalizeSequence(anim, init.GetDamageState(), Sequence), () => 0); + + var bi = init.Actor.TraitInfo(); + var offset = bi.CenterOffset(init.World).Y + 512; // Additional 512 units move from center -> top of cell + yield return new SpriteActorPreview(anim, () => WVec.Zero, () => offset, p); + } + + public override object Create(ActorInitializer init) { return new WithProductionDoorOverlayCA(init.Self, this); } + } + + class WithProductionDoorOverlayCA : ConditionalTrait, ITick, INotifyProduction, INotifyDamageStateChanged + { + readonly Animation door; + int desiredFrame; + CPos openExit; + Actor exitingActor; + + public WithProductionDoorOverlayCA(Actor self, WithProductionDoorOverlayCAInfo info) + : base(info) + { + var renderSprites = self.Trait(); + door = new Animation(self.World, renderSprites.GetImage(self)); + door.PlayFetchDirection(RenderSprites.NormalizeSequence(door, self.GetDamageState(), info.Sequence), + () => desiredFrame - door.CurrentFrame); + + var buildingInfo = self.Info.TraitInfo(); + + var offset = buildingInfo.CenterOffset(self.World).Y + 512; + renderSprites.Add(new AnimationWithOffset(door, null, () => IsTraitDisabled, offset)); + } + + void ITick.Tick(Actor self) + { + if (exitingActor == null) + return; + + if (!exitingActor.IsInWorld || exitingActor.Location != openExit + || (!exitingActor.CurrentActivity?.ActivitiesImplementing().Any() ?? true)) + { + desiredFrame = 0; + exitingActor = null; + } + } + + void INotifyDamageStateChanged.DamageStateChanged(Actor self, AttackInfo e) + { + if (door.CurrentSequence != null) + door.ReplaceAnim(RenderSprites.NormalizeSequence(door, e.DamageState, door.CurrentSequence.Name)); + } + + void INotifyProduction.UnitProduced(Actor self, Actor other, CPos exit) + { + // CA change here - prevents incorporeal actors from triggering the exit (e.g. upgrades) + if (!other.Info.HasTraitInfo()) + return; + + openExit = exit; + exitingActor = other; + desiredFrame = door.CurrentSequence.Length - 1; + } + + public void OpenDoor(Actor a, CPos exit) + { + openExit = exit; + exitingActor = a; + desiredFrame = door.CurrentSequence.Length - 1; + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Render/WithRadiatingCircle.cs b/OpenRA.Mods.CA/Traits/Render/WithRadiatingCircle.cs new file mode 100644 index 0000000000..b7800ffd49 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Render/WithRadiatingCircle.cs @@ -0,0 +1,216 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Linq; +using System.Collections.Generic; +using OpenRA.Graphics; +using OpenRA.Mods.Common.Graphics; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits.Render +{ + public enum RadiatingCircleVisibility { Always, WhenSelected } + + [Desc("Radiating circle overlay with an optional outer circle.")] + class WithRadiatingCircleInfo : ConditionalTraitInfo + { + [Desc("Range circle line width.")] + public readonly int Width = 1; + + public readonly int Interval = 0; + + [Desc("Start color of the radiating circle.")] + public readonly Color Color = Color.FromArgb(80, Color.Red); + + [Desc("Range of the circle")] + public readonly WDist StartRadius = WDist.Zero; + + [Desc("Range of the circle")] + public readonly WDist EndRadius = WDist.Zero; + + public readonly int Duration = 0; + + public readonly bool AlwaysShowMaxRange = false; + + public readonly Color MaxRadiusColor = Color.FromArgb(128, Color.Red); + + public readonly Color MaxRadiusFlashColor = Color.FromArgb(128, Color.Red); + + [Desc("Player relationships which will be able to see the circle.", + "Valid values are combinations of `None`, `Ally`, `Enemy` and `Neutral`.")] + public readonly PlayerRelationship ValidRelationships = PlayerRelationship.Ally; + + [Desc("When to show the range circle. Valid values are `Always`, and `WhenSelected`")] + public readonly RadiatingCircleVisibility Visible = RadiatingCircleVisibility.WhenSelected; + + public override object Create(ActorInitializer init) { return new WithRadiatingCircle(init.Self, this); } + } + + class WithRadiatingCircle : ConditionalTrait, ITick, IRenderAnnotationsWhenSelected, IRenderAnnotations + { + public new readonly WithRadiatingCircleInfo Info; + readonly Actor self; + Queue activeCircles; + int intervalTicks; + bool flash; + WDist radiusChangePerTick; + + struct RadiatingCircle + { + public WDist CurrentRadius; + int tick; + + public RadiatingCircle(WDist startRadius) + { + CurrentRadius = startRadius; + tick = 0; + } + + public int CurrentTick + { + get { return tick; } + } + + public void Tick() + { + tick++; + } + } + + public WithRadiatingCircle(Actor self, WithRadiatingCircleInfo info) + : base(info) + { + Info = info; + this.self = self; + activeCircles = new Queue(); + intervalTicks = 0; + flash = false; + } + + bool Visible + { + get + { + if (IsTraitDisabled) + return false; + + if (Info.Duration == 0) + return false; + + var p = self.World.RenderPlayer; + return p == null || Info.ValidRelationships.HasRelationship(self.Owner.RelationshipWith(p)) || (p.Spectating && !p.NonCombatant); + } + } + + public IEnumerable RenderRadiatingCircle(Actor self, RadiatingCircleVisibility visibility) + { + if (Info.Visible == visibility && Visible) + { + foreach (var circle in activeCircles) + { + yield return new CircleAnnotationRenderable( + self.CenterPosition, + circle.CurrentRadius, + Info.Width, + Info.Color, + false); + } + + if (Info.AlwaysShowMaxRange) + { + yield return new CircleAnnotationRenderable( + self.CenterPosition, + Info.EndRadius > Info.StartRadius ? Info.EndRadius : Info.StartRadius, + Info.Width, + flash ? Info.MaxRadiusFlashColor : Info.MaxRadiusColor, + false); + } + } + } + + IEnumerable IRenderAnnotationsWhenSelected.RenderAnnotations(Actor self, WorldRenderer wr) + { + return RenderRadiatingCircle(self, RadiatingCircleVisibility.WhenSelected); + } + + bool IRenderAnnotationsWhenSelected.SpatiallyPartitionable => false; + + IEnumerable IRenderAnnotations.RenderAnnotations(Actor self, WorldRenderer wr) + { + return RenderRadiatingCircle(self, RadiatingCircleVisibility.Always); + } + + bool IRenderAnnotations.SpatiallyPartitionable => false; + + void ITick.Tick(Actor self) + { + if (!Visible) + return; + + intervalTicks++; + + // Create new circle every interval + if (intervalTicks >= Info.Interval) + { + intervalTicks = 0; + activeCircles.Enqueue(new RadiatingCircle(Info.StartRadius)); + } + + // Update all active circles + var tempCircles = new Queue(); + var circleCompleted = false; + + while (activeCircles.Count > 0) + { + var circle = activeCircles.Dequeue(); + circle.Tick(); + + // Only keep circles that haven't completed + if (circle.CurrentTick < Info.Duration) + { + circle.CurrentRadius += radiusChangePerTick; + tempCircles.Enqueue(circle); + } + else + { + circleCompleted = true; + } + } + + // Flash when a circle completes its expansion + flash = circleCompleted; + + // Replace the old queue with updated circles + activeCircles = tempCircles; + } + + protected override void TraitEnabled(Actor self) + { + if (Info.Duration > 0) + radiusChangePerTick = (Info.EndRadius - Info.StartRadius) / Info.Duration; + else + radiusChangePerTick = WDist.Zero; + + if (Info.Interval == 0 || !activeCircles.Any()) + activeCircles.Enqueue(new RadiatingCircle(Info.StartRadius)); + + intervalTicks = 0; + } + + protected override void TraitDisabled(Actor self) + { + activeCircles.Clear(); + intervalTicks = 0; + flash = false; + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Render/WithRangeCircleCA.cs b/OpenRA.Mods.CA/Traits/Render/WithRangeCircleCA.cs new file mode 100644 index 0000000000..c4f04de74f --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Render/WithRangeCircleCA.cs @@ -0,0 +1,128 @@ +#region Copyright & License Information +/* + * Copyright (c) The OpenRA Developers and Contributors + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. For more + * information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using OpenRA.Graphics; +using OpenRA.Mods.Common.Graphics; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits.Render +{ + [Desc("Renders an arbitrary circle when selected or placing a structure,", + "CA version allows alpha to be defined for player color.")] + sealed class WithRangeCircleCAInfo : ConditionalTraitInfo, IPlaceBuildingDecorationInfo + { + [Desc("Type of range circle. used to decide which circles to draw on other structures during building placement.")] + public readonly string Type = null; + + [Desc("Color of the circle")] + public readonly Color Color = Color.FromArgb(128, Color.White); + + [Desc("Border width.")] + public readonly float Width = 1; + + [Desc("Color of the border.")] + public readonly Color BorderColor = Color.FromArgb(96, Color.Black); + + [Desc("Range circle border width.")] + public readonly float BorderWidth = 3; + + [Desc("If set, the color of the owning player will be used instead of `Color`.")] + public readonly bool UsePlayerColor = false; + + [Desc("The alpha value [from 0 to 255] of color used for the player color.")] + public readonly int PlayerColorAlpha = 255; + + [Desc("Player relationships which will be able to see the circle.", + "Valid values are combinations of `None`, `Ally`, `Enemy` and `Neutral`.")] + public readonly PlayerRelationship ValidRelationships = PlayerRelationship.Ally; + + [Desc("When to show the range circle. Valid values are `Always`, and `WhenSelected`")] + public readonly RangeCircleVisibility Visible = RangeCircleVisibility.WhenSelected; + + [Desc("Range of the circle")] + public readonly WDist Range = WDist.Zero; + + public IEnumerable RenderAnnotations(WorldRenderer wr, World w, ActorInfo ai, WPos centerPosition) + { + if (EnabledByDefault) + { + yield return new RangeCircleAnnotationRenderable( + centerPosition, + Range, + 0, + Color, + Width, + BorderColor, + BorderWidth); + + foreach (var a in w.ActorsWithTrait()) + if (a.Trait.Info.Type == Type) + foreach (var r in a.Trait.RenderRangeCircle(a.Actor, RangeCircleVisibility.WhenSelected)) + yield return r; + } + } + + public override object Create(ActorInitializer init) { return new WithRangeCircleCA(init.Self, this); } + } + + sealed class WithRangeCircleCA : ConditionalTrait, IRenderAnnotationsWhenSelected, IRenderAnnotations + { + readonly Actor self; + + public WithRangeCircleCA(Actor self, WithRangeCircleCAInfo info) + : base(info) + { + this.self = self; + } + + bool Visible + { + get + { + if (IsTraitDisabled) + return false; + + var p = self.World.RenderPlayer; + return p == null || Info.ValidRelationships.HasRelationship(self.Owner.RelationshipWith(p)) || (p.Spectating && !p.NonCombatant); + } + } + + public IEnumerable RenderRangeCircle(Actor self, RangeCircleVisibility visibility) + { + if (Info.Visible == visibility && Visible) + yield return new RangeCircleAnnotationRenderable( + self.CenterPosition, + Info.Range, + 0, + Info.UsePlayerColor ? Color.FromArgb(Info.PlayerColorAlpha, self.OwnerColor()) : Info.Color, + Info.Width, + Info.BorderColor, + Info.BorderWidth); + } + + IEnumerable IRenderAnnotationsWhenSelected.RenderAnnotations(Actor self, WorldRenderer wr) + { + return RenderRangeCircle(self, RangeCircleVisibility.WhenSelected); + } + + bool IRenderAnnotationsWhenSelected.SpatiallyPartitionable => false; + + IEnumerable IRenderAnnotations.RenderAnnotations(Actor self, WorldRenderer wr) + { + return RenderRangeCircle(self, RangeCircleVisibility.Always); + } + + bool IRenderAnnotations.SpatiallyPartitionable => false; + } +} diff --git a/OpenRA.Mods.CA/Traits/Render/WithRestartableIdleOverlay.cs b/OpenRA.Mods.CA/Traits/Render/WithRestartableIdleOverlay.cs new file mode 100644 index 0000000000..8fcf12c85d --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Render/WithRestartableIdleOverlay.cs @@ -0,0 +1,121 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Graphics; +using OpenRA.Mods.Common.Traits; +using OpenRA.Mods.Common.Traits.Render; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits.Render +{ + [Desc("Renders a decorative animation on units and buildings that is restarted (and optionally only played once) each time the trait is enabled.")] + public class WithRestartableIdleOverlayInfo : ConditionalTraitInfo, Requires, Requires + { + [Desc("Image used for this decoration. Defaults to the actor's type.")] + public readonly string Image = null; + + [Desc("If true, sequence (and start sequence if set) will only play once on trait being enabled.")] + public readonly bool PlayOnce = false; + + [SequenceReference(nameof(Image), allowNullImage: true)] + [Desc("Sequence name to use")] + public readonly string Sequence = "idle-overlay"; + + [SequenceReference(nameof(Image), allowNullImage: true)] + [Desc("Animation to play on enabling when actor is first created before playing the main sequence.")] + public readonly string StartSequence = null; + + [SequenceReference(nameof(Image), allowNullImage: true)] + [Desc("Animation to play on re-enabling before playing the main sequence.")] + public readonly string RestartSequence = null; + + [Desc("Position relative to body")] + public readonly WVec Offset = WVec.Zero; + + [PaletteReference(nameof(IsPlayerPalette))] + [Desc("Custom palette name")] + public readonly string Palette = null; + + [Desc("Custom palette is a player palette BaseName")] + public readonly bool IsPlayerPalette = false; + + public readonly bool IsDecoration = false; + + public override object Create(ActorInitializer init) { return new WithRestartableIdleOverlay(init, this); } + } + + public class WithRestartableIdleOverlay : ConditionalTrait + { + readonly Animation overlay; + readonly WithRestartableIdleOverlayInfo info; + bool visible; + bool firstTime; + + public WithRestartableIdleOverlay(ActorInitializer init, WithRestartableIdleOverlayInfo info) + : base(info) + { + this.info = info; + var rs = init.Self.Trait(); + var body = init.Self.Trait(); + firstTime = true; + + var image = info.Image ?? rs.GetImage(init.Self); + overlay = new Animation(init.Self.World, image) + { + IsDecoration = info.IsDecoration + }; + + var anim = new AnimationWithOffset(overlay, + () => body.LocalToWorld(info.Offset.Rotate(body.QuantizeOrientation(init.Self.Orientation))), + () => !visible, + p => RenderUtils.ZOffsetFromCenter(init.Self, p, 1)); + + rs.Add(anim, info.Palette, info.IsPlayerPalette); + } + + protected override void TraitEnabled(Actor self) + { + visible = true; + var startSequence = firstTime ? info.StartSequence : info.RestartSequence; + firstTime = false; + + if (startSequence != null) + { + if (info.PlayOnce) + { + overlay.PlayThen(RenderSprites.NormalizeSequence(overlay, self.GetDamageState(), startSequence), + () => overlay.PlayThen(RenderSprites.NormalizeSequence(overlay, self.GetDamageState(), info.Sequence), () => visible = false)); + } + else + { + overlay.PlayThen(RenderSprites.NormalizeSequence(overlay, self.GetDamageState(), startSequence), + () => overlay.PlayRepeating(RenderSprites.NormalizeSequence(overlay, self.GetDamageState(), info.Sequence))); + } + } + else + { + if (info.PlayOnce) + { + overlay.PlayThen(RenderSprites.NormalizeSequence(overlay, self.GetDamageState(), info.Sequence), () => visible = false); + } + else + { + overlay.PlayRepeating(RenderSprites.NormalizeSequence(overlay, self.GetDamageState(), info.Sequence)); + } + } + } + + protected override void TraitDisabled(Actor self) + { + if (!info.PlayOnce) + visible = false; + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Render/WithSpawnerMasterPipsDecoration.cs b/OpenRA.Mods.CA/Traits/Render/WithSpawnerMasterPipsDecoration.cs index 64134f01b2..a7da4362ad 100644 --- a/OpenRA.Mods.CA/Traits/Render/WithSpawnerMasterPipsDecoration.cs +++ b/OpenRA.Mods.CA/Traits/Render/WithSpawnerMasterPipsDecoration.cs @@ -1,10 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -16,7 +16,7 @@ namespace OpenRA.Mods.CA.Traits.Render { - public class WithSpawnerMasterPipsDecorationInfo : WithDecorationBaseInfo, Requires + public class WithSpawnerMasterPipsDecorationInfo : WithDecorationBaseInfo, Requires { [Desc("If non-zero, override the spacing between adjacent pips.")] public readonly int2 PipStride = int2.Zero; @@ -45,13 +45,13 @@ public class WithSpawnerMasterPipsDecorationInfo : WithDecorationBaseInfo, Requi public class WithSpawnerMasterPipsDecoration : WithDecorationBase { readonly Animation pips; - readonly BaseSpawnerMaster spawner; + readonly SpawnerMasterBase spawner; public WithSpawnerMasterPipsDecoration(Actor self, WithSpawnerMasterPipsDecorationInfo info) : base(self, info) { pips = new Animation(self.World, info.Image); - spawner = self.Trait(); + spawner = self.Trait(); } protected override IEnumerable RenderDecoration(Actor self, WorldRenderer wr, int2 screenPos) diff --git a/OpenRA.Mods.CA/Traits/Render/WithUnitConverterCountDecoration.cs b/OpenRA.Mods.CA/Traits/Render/WithUnitConverterCountDecoration.cs new file mode 100644 index 0000000000..692293d442 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Render/WithUnitConverterCountDecoration.cs @@ -0,0 +1,75 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.Graphics; +using OpenRA.Mods.Common.Graphics; +using OpenRA.Mods.Common.Traits.Render; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits.Render +{ + [Desc("Displays a text overlay relative to the selection box.")] + public class WithUnitConverterCountDecorationInfo : WithDecorationBaseInfo, Requires + { + public readonly string Font = "TinyBold"; + + [Desc("Display in this color when not using the player color.")] + public readonly Color Color = Color.White; + + [Desc("Use the player color of the current owner.")] + public readonly bool UsePlayerColor = false; + + public override object Create(ActorInitializer init) { return new WithUnitConverterCountDecoration(init.Self, this); } + + public override void RulesetLoaded(Ruleset rules, ActorInfo ai) + { + if (!Game.ModData.Manifest.Get().FontList.ContainsKey(Font)) + throw new YamlException($"Font '{Font}' is not listed in the mod.yaml's Fonts section"); + + base.RulesetLoaded(rules, ai); + } + } + + public class WithUnitConverterCountDecoration : WithDecorationBase, INotifyOwnerChanged + { + readonly SpriteFont font; + Color color; + UnitConverter converter; + + public WithUnitConverterCountDecoration(Actor self, WithUnitConverterCountDecorationInfo info) + : base(self, info) + { + font = Game.Renderer.Fonts[info.Font]; + color = info.UsePlayerColor ? self.OwnerColor() : info.Color; + converter = self.Trait(); + } + + protected override IEnumerable RenderDecoration(Actor self, WorldRenderer wr, int2 screenPos) + { + if (IsTraitDisabled || self.IsDead || !self.IsInWorld || !ShouldRender(self)) + return Enumerable.Empty(); + + var size = font.Measure(converter.QueueCount.ToString()); + return new IRenderable[] + { + new UITextRenderable(font, self.CenterPosition, screenPos - size / 2, 0, color, converter.QueueCount.ToString()) + }; + } + + void INotifyOwnerChanged.OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) + { + if (Info.UsePlayerColor) + color = newOwner.Color; + } + } +} diff --git a/OpenRA.Mods.CA/Traits/RepairableNearCA.cs b/OpenRA.Mods.CA/Traits/RepairableNearCA.cs deleted file mode 100644 index d1d0dfdc54..0000000000 --- a/OpenRA.Mods.CA/Traits/RepairableNearCA.cs +++ /dev/null @@ -1,141 +0,0 @@ -#region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. - */ -#endregion - -using System.Collections.Generic; -using System.Linq; -using OpenRA.Mods.Common.Activities; -using OpenRA.Mods.Common.Orders; -using OpenRA.Mods.Common.Traits; -using OpenRA.Support; -using OpenRA.Traits; - -namespace OpenRA.Mods.CA.Traits -{ - class RepairableNearCAInfo : TraitInfo, Requires, Requires, IObservesVariablesInfo - { - [ActorReference] - [FieldLoader.Require] - public readonly HashSet RepairActors = new HashSet { }; - - public readonly WDist CloseEnough = WDist.FromCells(4); - - [VoiceReference] - public readonly string Voice = "Action"; - - [ConsumedConditionReference] - [Desc("Boolean expression defining the condition under which the regular (non-force) enter cursor is disabled.")] - public readonly BooleanExpression RequireForceMoveCondition = null; - - [Desc("Cursor to display when able to be repaired near target actor.")] - public readonly string EnterCursor = "enter"; - - [Desc("Cursor to display when unable to be repaired near target actor.")] - public readonly string EnterBlockedCursor = "enter-blocked"; - - public override object Create(ActorInitializer init) { return new RepairableNearCA(init.Self, this); } - } - - class RepairableNearCA : IIssueOrder, IResolveOrder, IOrderVoice, IObservesVariables - { - public readonly RepairableNearCAInfo Info; - readonly Actor self; - bool requireForceMove; - - public RepairableNearCA(Actor self, RepairableNearCAInfo info) - { - this.self = self; - Info = info; - } - - IEnumerable IIssueOrder.Orders - { - get - { - yield return new EnterAlliedActorTargeter( - "RepairNear", - 5, - Info.EnterCursor, - Info.EnterBlockedCursor, - CanRepairAt, - _ => ShouldRepair()); - } - } - - Order IIssueOrder.IssueOrder(Actor self, IOrderTargeter order, in Target target, bool queued) - { - if (order.OrderID == "RepairNear") - return new Order(order.OrderID, self, target, queued); - - return null; - } - - bool CanRepairAt(Actor target, TargetModifiers modifiers) - { - if (requireForceMove && !modifiers.HasModifier(TargetModifiers.ForceMove)) - return false; - - return Info.RepairActors.Contains(target.Info.Name); - } - - bool CanRepairAt(Actor target) - { - return Info.RepairActors.Contains(target.Info.Name); - } - - bool ShouldRepair() - { - return self.GetDamageState() > DamageState.Undamaged; - } - - string IOrderVoice.VoicePhraseForOrder(Actor self, Order order) - { - return order.OrderString == "RepairNear" && ShouldRepair() ? Info.Voice : null; - } - - void IResolveOrder.ResolveOrder(Actor self, Order order) - { - // RepairNear orders are only valid for own/allied actors, - // which are guaranteed to never be frozen. - if (order.OrderString != "RepairNear" || order.Target.Type != TargetType.Actor) - return; - - if (!CanRepairAt(order.Target.Actor) || !ShouldRepair()) - return; - - self.QueueActivity(order.Queued, new Resupply(self, order.Target.Actor, Info.CloseEnough)); - self.ShowTargetLines(); - } - - public Actor FindRepairBuilding(Actor self) - { - var repairBuilding = self.World.ActorsWithTrait() - .Where(a => !a.Actor.IsDead && a.Actor.IsInWorld - && a.Actor.Owner.IsAlliedWith(self.Owner) && - Info.RepairActors.Contains(a.Actor.Info.Name)) - .OrderBy(a => a.Actor.Owner == self.Owner ? 0 : 1) - .ThenBy(p => (self.Location - p.Actor.Location).LengthSquared); - - // Worst case FirstOrDefault() will return a TraitPair, which is OK. - return repairBuilding.FirstOrDefault().Actor; - } - - IEnumerable IObservesVariables.GetVariableObservers() - { - if (Info.RequireForceMoveCondition != null) - yield return new VariableObserver(RequireForceMoveConditionChanged, Info.RequireForceMoveCondition.Variables); - } - - void RequireForceMoveConditionChanged(Actor self, IReadOnlyDictionary conditions) - { - requireForceMove = Info.RequireForceMoveCondition.Evaluate(conditions); - } - } -} diff --git a/OpenRA.Mods.CA/Traits/ResourcePurifierCA.cs b/OpenRA.Mods.CA/Traits/ResourcePurifierCA.cs index 2f6dd18d54..660fd94cbd 100644 --- a/OpenRA.Mods.CA/Traits/ResourcePurifierCA.cs +++ b/OpenRA.Mods.CA/Traits/ResourcePurifierCA.cs @@ -1,11 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -66,12 +65,12 @@ protected override void Created(Actor self) base.Created(self); } - void INotifyResourceAccepted.OnResourceAccepted(Actor self, Actor refinery, int amount) + void INotifyResourceAccepted.OnResourceAccepted(Actor self, Actor refinery, string resourceType, int count, int value) { if (IsTraitDisabled) return; - amtAwaitingPurification += amount; + amtAwaitingPurification += value; } void ITick.Tick(Actor self) @@ -92,7 +91,7 @@ void ITick.Tick(Actor self) { var temp = currentDisplayValue; if (self.Owner.IsAlliedWith(self.World.RenderPlayer)) - self.World.AddFrameEndTask(w => w.Add(new FloatingText(self.CenterPosition, self.Owner.Color, FloatingText.FormatCashTick(temp), Info.TickLifetime))); + self.World.AddFrameEndTask(w => w.Add(new FloatingText(self.CenterPosition, self.OwnerColor(), FloatingText.FormatCashTick(temp), Info.TickLifetime))); currentDisplayTick = Info.TickRate; currentDisplayValue = 0; diff --git a/OpenRA.Mods.CA/Traits/ReturnsToBaseOnAmmoDepleted.cs b/OpenRA.Mods.CA/Traits/ReturnsToBaseOnAmmoDepleted.cs new file mode 100644 index 0000000000..bc8a5d79a1 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/ReturnsToBaseOnAmmoDepleted.cs @@ -0,0 +1,62 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.Mods.Common.Activities; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("For aircraft with a Strafe AttackType, which don't return to base due to using an AttackMove.")] + public class ReturnsToBaseOnAmmoDepletedInfo : TraitInfo + { + [Desc("Name of the armaments that trigger returning.")] + public readonly HashSet ArmamentNames = new() { "primary" }; + + [Desc("Name(s) of AmmoPool(s) that are checked.")] + public readonly HashSet AmmoPools = new() { "primary" }; + + public override object Create(ActorInitializer init) { return new ReturnsToBaseOnAmmoDepleted(init, this); } + } + + public class ReturnsToBaseOnAmmoDepleted : INotifyAttack, INotifyCreated + { + readonly ReturnsToBaseOnAmmoDepletedInfo info; + AmmoPool[] ammoPools; + + public ReturnsToBaseOnAmmoDepleted(ActorInitializer init, ReturnsToBaseOnAmmoDepletedInfo info) + { + this.info = info; + } + + void INotifyCreated.Created(Actor self) + { + ammoPools = self.TraitsImplementing().Where(p => info.AmmoPools.Contains(p.Info.Name)).ToArray(); + } + + void INotifyAttack.Attacking(Actor self, in Target target, Armament a, Barrel barrel) + { + if (!info.ArmamentNames.Contains(a.Info.Name)) + return; + + self.World.AddFrameEndTask(w => { + var totalAmmo = ammoPools.Sum(ap => ap.CurrentAmmoCount); + + if (ammoPools.All(ap => !ap.HasAmmo)) { + self.QueueActivity(new ReturnToBase(self)); + } + }); + } + + void INotifyAttack.PreparingAttack(Actor self, in Target target, Armament a, Barrel barrel) { } + } +} diff --git a/OpenRA.Mods.CA/Traits/RevealOnFireCA.cs b/OpenRA.Mods.CA/Traits/RevealOnFireCA.cs new file mode 100644 index 0000000000..04437683ac --- /dev/null +++ b/OpenRA.Mods.CA/Traits/RevealOnFireCA.cs @@ -0,0 +1,87 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Linq; +using OpenRA.Mods.Common.Effects; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Reveal this actor to the target's owner when attacking.", + "CA version allows specifying whether to use ground position.")] + public class RevealOnFireCAInfo : ConditionalTraitInfo + { + [Desc("The armament types which trigger revealing.")] + public readonly string[] ArmamentNames = { "primary", "secondary" }; + + [Desc("Player relationships relative to the target player this actor will be revealed to during firing.")] + public readonly PlayerRelationship RevealForRelationships = PlayerRelationship.Ally; + + [Desc("Duration of the reveal.")] + public readonly int Duration = 25; + + [Desc("Radius of the reveal around this actor.")] + public readonly WDist Radius = new WDist(1536); + + [Desc("Can this actor be revealed through shroud generated by the `" + nameof(CreatesShroud) + "` trait?")] + public readonly bool RevealGeneratedShroud = true; + + [Desc("If true, reveal at the ground position of the actor.")] + public readonly bool GroundPosition = false; + + public override object Create(ActorInitializer init) { return new RevealOnFireCA(this); } + } + + public class RevealOnFireCA : ConditionalTrait, INotifyAttack + { + readonly RevealOnFireCAInfo info; + + public RevealOnFireCA(RevealOnFireCAInfo info) + : base(info) + { + this.info = info; + } + + void INotifyAttack.Attacking(Actor self, in Target target, Armament a, Barrel barrel) + { + if (IsTraitDisabled) + return; + + if (!info.ArmamentNames.Contains(a.Info.Name)) + return; + + var targetPlayer = GetTargetPlayer(target); + + if (targetPlayer != null && targetPlayer.WinState == WinState.Undefined) + { + var position = self.CenterPosition; + if (Info.GroundPosition) + position = new WPos(position.X, position.Y, 0); + + self.World.AddFrameEndTask(w => w.Add(new RevealShroudEffect(position, info.Radius, + info.RevealGeneratedShroud ? Shroud.SourceType.Visibility : Shroud.SourceType.PassiveVisibility, + targetPlayer, info.RevealForRelationships, duration: info.Duration))); + } + } + + Player GetTargetPlayer(in Target target) + { + if (target.Type == TargetType.Actor) + return target.Actor.Owner; + else if (target.Type == TargetType.FrozenActor && target.FrozenActor.Actor != null && !target.FrozenActor.Actor.IsDead) + return target.FrozenActor.Actor.Owner; + + return null; + } + + void INotifyAttack.PreparingAttack(Actor self, in Target target, Armament a, Barrel barrel) { } + } +} diff --git a/OpenRA.Mods.CA/Traits/RevealsMapCA.cs b/OpenRA.Mods.CA/Traits/RevealsMapCA.cs deleted file mode 100644 index 062742dbd2..0000000000 --- a/OpenRA.Mods.CA/Traits/RevealsMapCA.cs +++ /dev/null @@ -1,93 +0,0 @@ -#region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. - */ -#endregion - -using OpenRA.Mods.Common.Traits; -using OpenRA.Traits; - -namespace OpenRA.Mods.CA.Traits -{ - [Desc("Reveals shroud and fog across the whole map while active.")] - public class RevealsMapCAInfo : ConditionalTraitInfo - { - [Desc("Relationships the watching player needs to see the shroud removed.")] - public readonly PlayerRelationship ValidRelationships = PlayerRelationship.Ally; - - [Desc("Can this actor reveal shroud generated by the `GeneratesShroud` trait?")] - public readonly bool RevealGeneratedShroud = true; - - public override object Create(ActorInitializer init) { return new RevealsMapCA(this); } - } - - public class RevealsMapCA : ConditionalTrait, INotifyKilled, INotifyActorDisposing - { - readonly Shroud.SourceType type; - - public RevealsMapCA(RevealsMapCAInfo info) - : base(info) - { - type = info.RevealGeneratedShroud ? Shroud.SourceType.Visibility - : Shroud.SourceType.PassiveVisibility; - } - - protected void AddCellsToPlayerShroud(Actor self, Player p, PPos[] uv) - { - if (!Info.ValidRelationships.HasStance(self.Owner.RelationshipWith(p))) - return; - - p.Shroud.AddSource(this, type, uv); - } - - protected void RemoveCellsFromPlayerShroud(Actor self, Player p) - { - if (!Info.ValidRelationships.HasStance(self.Owner.RelationshipWith(p))) - return; - - p.Shroud.RemoveSource(this); - } - - protected PPos[] ProjectedCells(Actor self) - { - return self.World.Map.ProjectedCells; - } - - void INotifyActorDisposing.Disposing(Actor self) - { - foreach (var player in self.World.Players) - { - RemoveCellsFromPlayerShroud(self, player); - } - } - - void INotifyKilled.Killed(Actor self, AttackInfo e) - { - foreach (var player in self.World.Players) - { - RemoveCellsFromPlayerShroud(self, player); - } - } - - protected override void TraitEnabled(Actor self) - { - foreach (var player in self.World.Players) - { - AddCellsToPlayerShroud(self, player, ProjectedCells(self)); - } - } - - protected override void TraitDisabled(Actor self) - { - foreach (var player in self.World.Players) - { - RemoveCellsFromPlayerShroud(self, player); - } - } - } -} diff --git a/OpenRA.Mods.CA/Traits/ScatterOnExitCargo.cs b/OpenRA.Mods.CA/Traits/ScatterOnExitCargo.cs new file mode 100644 index 0000000000..6b8ecc169a --- /dev/null +++ b/OpenRA.Mods.CA/Traits/ScatterOnExitCargo.cs @@ -0,0 +1,49 @@ + + +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Linq; +using OpenRA.Mods.Common.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("When exiting a transport the actor will scatter.")] + public class ScatterOnExitCargoInfo : ConditionalTraitInfo + { + [Desc("Scatter on exiting these actor types.")] + public readonly string[] CargoActors = {}; + + [Desc("Only scatter if the cargo is dead.")] + public readonly bool OnlyIfCargoIsDead = false; + + public override object Create(ActorInitializer init) { return new ScatterOnExitCargo(init, this); } + } + + public class ScatterOnExitCargo : ConditionalTrait, INotifyExitedCargo + { + private readonly ScatterOnExitCargoInfo info; + + public ScatterOnExitCargo(ActorInitializer init, ScatterOnExitCargoInfo info) + : base(info) + { + this.info = info; + } + + void INotifyExitedCargo.OnExitedCargo(Actor self, Actor cargo) + { + if (info.CargoActors.Any() && info.CargoActors.Contains(cargo.Info.Name) && (cargo.IsDead || !info.OnlyIfCargoIsDead)) + { + self.QueueActivity(false, new Nudge(self)); + } + } + } +} diff --git a/OpenRA.Mods.CA/Traits/SeedsResourceCA.cs b/OpenRA.Mods.CA/Traits/SeedsResourceCA.cs index 79731d4058..9b7d204388 100644 --- a/OpenRA.Mods.CA/Traits/SeedsResourceCA.cs +++ b/OpenRA.Mods.CA/Traits/SeedsResourceCA.cs @@ -1,6 +1,6 @@ -#region Copyright & License Information +#region Copyright & License Information /* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) + * Copyright (c) The OpenRA Developers and Contributors * This file is part of OpenRA, which is free software. It is made * available to you under the terms of the GNU General Public License * as published by the Free Software Foundation, either version 3 of @@ -9,7 +9,6 @@ */ #endregion -using System; using System.Linq; using OpenRA.Mods.Common; using OpenRA.Mods.Common.Traits; @@ -18,7 +17,7 @@ namespace OpenRA.Mods.CA.Traits { [Desc("Lets the actor spread resources around it in a circle.")] - class SeedsResourceCAInfo : ConditionalTraitInfo + sealed class SeedsResourceCAInfo : ConditionalTraitInfo { public readonly int Interval = 75; public readonly string ResourceType = "Ore"; @@ -27,29 +26,27 @@ class SeedsResourceCAInfo : ConditionalTraitInfo public override object Create(ActorInitializer init) { return new SeedsResourceCA(init.Self, this); } } - class SeedsResourceCA : ConditionalTrait, ITick, ISeedableResource + sealed class SeedsResourceCA : ConditionalTrait, ITick, ISeedableResource { - public new readonly SeedsResourceCAInfo Info; - - readonly ResourceType resourceType; - readonly ResourceLayer resLayer; + readonly SeedsResourceCAInfo info; + readonly IResourceLayer resourceLayer; + ISeedsResourceIntervalModifier[] seedsResourceModifiers; public SeedsResourceCA(Actor self, SeedsResourceCAInfo info) : base(info) { - Info = info; - - resourceType = self.World.WorldActor.TraitsImplementing() - .FirstOrDefault(t => t.Info.Type == info.ResourceType); - - if (resourceType == null) - throw new InvalidOperationException("No such resource type `{0}`".F(info.ResourceType)); - - resLayer = self.World.WorldActor.Trait(); + this.info = info; + resourceLayer = self.World.WorldActor.Trait(); } int ticks; + protected override void Created(Actor self) + { + base.Created(self); + seedsResourceModifiers = self.TraitsImplementing().ToArray(); + } + void ITick.Tick(Actor self) { if (IsTraitDisabled) @@ -58,20 +55,20 @@ void ITick.Tick(Actor self) if (--ticks <= 0) { Seed(self); - ticks = Info.Interval; + var seedsResourceModifier = seedsResourceModifiers.Select(x => x.GetModifier()); + ticks = Util.ApplyPercentageModifiers(info.Interval, seedsResourceModifier); } } public void Seed(Actor self) { var cell = Util.RandomWalk(self.Location, self.World.SharedRandom) - .Take(Info.MaxRange) - .SkipWhile(p => !self.World.Map.Contains(p) || - (resLayer.GetResourceType(p) == resourceType && resLayer.IsFull(p))) + .Take(info.MaxRange) + .SkipWhile(p => resourceLayer.GetResource(p).Type == info.ResourceType && !resourceLayer.CanAddResource(info.ResourceType, p)) .Cast().FirstOrDefault(); - if (cell != null && resLayer.CanSpawnResourceAt(resourceType, cell.Value)) - resLayer.AddResource(resourceType, cell.Value, 1); + if (cell != null && resourceLayer.CanAddResource(info.ResourceType, cell.Value)) + resourceLayer.AddResource(info.ResourceType, cell.Value); } } } diff --git a/OpenRA.Mods.CA/Traits/Shielded.cs b/OpenRA.Mods.CA/Traits/Shielded.cs index 41f6fe48be..e7db6e1db6 100644 --- a/OpenRA.Mods.CA/Traits/Shielded.cs +++ b/OpenRA.Mods.CA/Traits/Shielded.cs @@ -1,11 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -31,6 +30,7 @@ public class ShieldedInfo : ConditionalTraitInfo [Desc("Number of ticks between recharging.")] public readonly int RegenInterval = 25; + [GrantedConditionReference] [Desc("Condition to grant when shields are active.")] public readonly string ShieldsUpCondition = null; @@ -47,6 +47,7 @@ public class Shielded : ConditionalTrait, ITick, ISync, ISelection { int conditionToken = Actor.InvalidConditionToken; Actor self; + IHealth health; [Sync] int strength; @@ -62,6 +63,7 @@ public Shielded(ActorInitializer init, ShieldedInfo info) protected override void Created(Actor self) { base.Created(self); + health = self.TraitOrDefault(); strength = Info.MaxStrength; ResetRegen(); } @@ -109,13 +111,11 @@ void INotifyDamage.Damaged(Actor self, AttackInfo e) if (strength == 0 || e.Damage.Value == 0 || e.Attacker == self) return; - var damageAmt = Convert.ToInt32(e.Damage.Value / 0.01); + var damageAmt = e.Damage.Value * 100; var damageTypes = e.Damage.DamageTypes; var excessDamage = damageAmt - strength; strength = Math.Max(strength - damageAmt, 0); - var health = self.TraitOrDefault(); - if (health != null) { var absorbedDamage = new Damage(-e.Damage.Value, damageTypes); diff --git a/OpenRA.Mods.CA/Traits/SmokeParticleEmitter.cs b/OpenRA.Mods.CA/Traits/SmokeParticleEmitter.cs deleted file mode 100644 index f1945c241d..0000000000 --- a/OpenRA.Mods.CA/Traits/SmokeParticleEmitter.cs +++ /dev/null @@ -1,170 +0,0 @@ -#region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. - */ -#endregion - -using OpenRA.GameRules; -using OpenRA.Mods.CA.Effects; -using OpenRA.Mods.Common.Traits; -using OpenRA.Support; -using OpenRA.Traits; - -namespace OpenRA.Mods.CA.Traits -{ - public class SmokeParticleEmitterInfo : ConditionalTraitInfo, ISmokeParticleInfo, IRulesetLoaded - { - [FieldLoader.Require] - [Desc("The duration of an individual particle. Two values mean actual lifetime will vary between them.")] - public readonly int[] Duration; - - [Desc("Offset for the particle emitter.")] - public readonly WVec[] Offset = { WVec.Zero }; - - [Desc("Randomize particle forward movement.")] - public readonly WDist[] Speed = { WDist.Zero }; - - [Desc("Randomize particle gravity.")] - public readonly WDist[] Gravity = { WDist.Zero }; - - [Desc("Randomize particle facing.")] - public readonly bool RandomFacing = true; - - [Desc("Randomize particle turnrate.")] - public readonly int TurnRate = 0; - - [Desc("Rate to reset particle movement properties.")] - public readonly int RandomRate = 4; - - [Desc("How many particles should spawn.")] - public readonly int[] SpawnFrequency = { 100, 150 }; - - [Desc("Which image to use.")] - public readonly string Image = "particles"; - - [FieldLoader.Require] - [Desc("Which sequence to use.")] - [SequenceReference(nameof(Image))] - public readonly string[] Sequences = null; - - [Desc("Which palette to use.")] - [PaletteReference] - public readonly string Palette = null; - - public readonly bool IsPlayerPalette = false; - - [WeaponReference] - [Desc("Has to be defined in weapons.yaml, if defined, as well.")] - public readonly string Weapon = null; - - public WeaponInfo WeaponInfo { get; private set; } - - public override void RulesetLoaded(Ruleset rules, ActorInfo ai) - { - base.RulesetLoaded(rules, ai); - - if (string.IsNullOrEmpty(Weapon)) - return; - - WeaponInfo weaponInfo; - - var weaponToLower = Weapon.ToLowerInvariant(); - if (!rules.Weapons.TryGetValue(weaponToLower, out weaponInfo)) - throw new YamlException("Weapons Ruleset does not contain an entry '{0}'".F(weaponToLower)); - - WeaponInfo = weaponInfo; - } - - public override object Create(ActorInitializer init) { return new SmokeParticleEmitter(init.Self, this); } - - string ISmokeParticleInfo.Image - { - get { return Image; } - } - - string[] ISmokeParticleInfo.Sequences - { - get { return Sequences; } - } - - string ISmokeParticleInfo.Palette - { - get { return Palette; } - } - - WDist[] ISmokeParticleInfo.Speed - { - get { return Speed; } - } - - WDist[] ISmokeParticleInfo.Gravity - { - get { return Gravity; } - } - - int[] ISmokeParticleInfo.Duration - { - get { return Duration; } - } - - WeaponInfo ISmokeParticleInfo.Weapon - { - get { return WeaponInfo; } - } - - int ISmokeParticleInfo.TurnRate - { - get { return TurnRate; } - } - - int ISmokeParticleInfo.RandomRate - { - get { return RandomRate; } - } - } - - public class SmokeParticleEmitter : ConditionalTrait, ITick - { - readonly MersenneTwister random; - readonly WVec offset; - - IFacing facing; - int ticks; - - public SmokeParticleEmitter(Actor self, SmokeParticleEmitterInfo info) - : base(info) - { - random = self.World.SharedRandom; - - offset = Info.Offset.Length == 2 - ? new WVec(random.Next(Info.Offset[0].X, Info.Offset[1].X), random.Next(Info.Offset[0].Y, Info.Offset[1].Y), random.Next(Info.Offset[0].Z, Info.Offset[1].Z)) - : Info.Offset[0]; - } - - protected override void Created(Actor self) - { - facing = self.TraitOrDefault(); - - base.Created(self); - } - - void ITick.Tick(Actor self) - { - if (IsTraitDisabled) - return; - - if (--ticks < 0) - { - ticks = Info.SpawnFrequency.Length == 2 ? random.Next(Info.SpawnFrequency[0], Info.SpawnFrequency[1]) : Info.SpawnFrequency[0]; - - var spawnFacing = (!Info.RandomFacing && facing != null) ? facing.Facing.Facing : -1; - - self.World.AddFrameEndTask(w => w.Add(new SmokeParticle(self, Info, self.CenterPosition + offset, spawnFacing))); - } - } - } -} diff --git a/OpenRA.Mods.CA/Traits/AmbientSoundCA.cs b/OpenRA.Mods.CA/Traits/Sound/AmbientSoundCA.cs similarity index 81% rename from OpenRA.Mods.CA/Traits/AmbientSoundCA.cs rename to OpenRA.Mods.CA/Traits/Sound/AmbientSoundCA.cs index e93b2909ff..2e18972593 100644 --- a/OpenRA.Mods.CA/Traits/AmbientSoundCA.cs +++ b/OpenRA.Mods.CA/Traits/Sound/AmbientSoundCA.cs @@ -1,20 +1,22 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion using System.Collections.Generic; +using OpenRA.Mods.Common; +using OpenRA.Mods.Common.Traits; using OpenRA.Traits; -namespace OpenRA.Mods.Common.Traits.Sound +namespace OpenRA.Mods.CA.Traits.Sound { - [Desc("Plays a looping audio file at the actor position. Attach this to the `World` actor to cover the whole map.")] + [Desc("Plays a looping audio file at the actor position. Attach this to the `World` actor to cover the whole map.", + "CA version can be made to be non-audible through fog and adds inital and final sounds that play when the sound starts/stops.")] class AmbientSoundCAInfo : ConditionalTraitInfo { [FieldLoader.Require] @@ -51,14 +53,14 @@ class AmbientSoundCA : ConditionalTrait, ITick, INotifyRemov bool initialSoundComplete = false; int initialSoundTicks = 0; readonly bool loop; - HashSet currentSounds = new HashSet(); + readonly HashSet currentSounds = new HashSet(); WPos cachedPosition; int delay; public AmbientSoundCA(Actor self, AmbientSoundCAInfo info) : base(info) { - delay = Util.RandomDelay(self.World, info.Delay); + delay = Util.RandomInRange(self.World.SharedRandom, info.Delay); loop = Info.Interval.Length == 0 || (Info.Interval.Length == 1 && Info.Interval[0] == 0); } @@ -67,6 +69,9 @@ void ITick.Tick(Actor self) if (IsTraitDisabled) return; + if (self.World.IsGameOver || self.World.Paused) + StopSounds(self, false); + if (Info.InitialSound != null && !initialSoundComplete) { if (Info.InitialSoundLength > 0 && ++initialSoundTicks == Info.InitialSoundLength) @@ -113,7 +118,7 @@ void ITick.Tick(Actor self) { StartSound(self); if (!loop) - delay = Util.RandomDelay(self.World, Info.Interval); + delay = Util.RandomInRange(self.World.SharedRandom, Info.Interval); } } @@ -158,7 +163,7 @@ void PlaySound(string sound, Actor self, bool looped, bool addToCurrentSounds) currentSounds.Add(s); } - protected override void TraitEnabled(Actor self) { delay = Util.RandomDelay(self.World, Info.Delay); } + protected override void TraitEnabled(Actor self) { delay = Util.RandomInRange(self.World.SharedRandom, Info.Delay); } protected override void TraitDisabled(Actor self) { StopSounds(self, true); } void INotifyRemovedFromWorld.RemovedFromWorld(Actor self) { StopSounds(self, false); } diff --git a/OpenRA.Mods.CA/Traits/Sound/AnnounceOnCreation.cs b/OpenRA.Mods.CA/Traits/Sound/AnnounceOnCreation.cs index f006486c24..8f0adffb9e 100644 --- a/OpenRA.Mods.CA/Traits/Sound/AnnounceOnCreation.cs +++ b/OpenRA.Mods.CA/Traits/Sound/AnnounceOnCreation.cs @@ -1,11 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -18,7 +17,10 @@ namespace OpenRA.Mods.CA.Traits.Sound public class AnnounceOnCreationInfo : TraitInfo { [NotificationReference("Speech")] - public readonly string Notification = "UnitReady"; + public readonly string SpeechNotification = null; + + [NotificationReference("Sounds")] + public readonly string SoundNotification = null; [Desc("Delay in ticks.")] public readonly int Delay = 0; @@ -55,7 +57,12 @@ void ITick.Tick(Actor self) void PlaySound(Actor self) { var player = info.NotifyAll ? self.World.LocalPlayer : self.Owner; - Game.Sound.PlayNotification(self.World.Map.Rules, player, "Speech", info.Notification, self.Owner.Faction.InternalName); + + if (info.SoundNotification != null) + Game.Sound.PlayNotification(self.World.Map.Rules, player, "Sounds", info.SoundNotification, self.Owner.Faction.InternalName); + + if (info.SpeechNotification != null) + Game.Sound.PlayNotification(self.World.Map.Rules, player, "Speech", info.SpeechNotification, self.Owner.Faction.InternalName); } } } diff --git a/OpenRA.Mods.CA/Traits/Sound/AttackSoundsCA.cs b/OpenRA.Mods.CA/Traits/Sound/AttackSoundsCA.cs new file mode 100644 index 0000000000..c5e731be5f --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Sound/AttackSoundsCA.cs @@ -0,0 +1,100 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Linq; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits.Sound +{ + [Desc("Played when preparing for an attack or attacking.", + "CA version allows for sounds not audible through fog and to be armament specific.")] + public class AttackSoundsCAInfo : ConditionalTraitInfo + { + [Desc("Play a randomly selected sound from this list when preparing for an attack or attacking.")] + public readonly string[] Sounds = { }; + + [Desc("Delay in ticks before sound starts, either relative to attack preparation or attack.")] + public readonly int Delay = 0; + + [Desc("Should the sound be delayed relative to preparation or actual attack?")] + public readonly AttackDelayType DelayRelativeTo = AttackDelayType.Preparation; + + [Desc("Do the sounds play under shroud or fog.")] + public readonly bool AudibleThroughFog = false; + + [Desc("Armament names")] + public readonly string[] Armaments = { "primary", "secondary" }; + + public override object Create(ActorInitializer init) { return new AttackSoundsCA(init, this); } + } + + public class AttackSoundsCA : ConditionalTrait, INotifyAttack, ITick + { + readonly AttackSoundsCAInfo info; + int tick; + + public AttackSoundsCA(ActorInitializer init, AttackSoundsCAInfo info) + : base(info) + { + this.info = info; + } + + void PlaySound(Actor self) + { + if (info.Sounds.Length == 0) + return; + + var shouldStart = Info.AudibleThroughFog || (!self.World.ShroudObscures(self.CenterPosition) && !self.World.FogObscures(self.CenterPosition)); + + if (!shouldStart) + return; + + Game.Sound.Play(SoundType.World, info.Sounds, self.World, self.CenterPosition); + } + + void INotifyAttack.Attacking(Actor self, in Target target, Armament a, Barrel barrel) + { + if (IsTraitDisabled) + return; + + if (info.DelayRelativeTo == AttackDelayType.Attack && Info.Armaments.Contains(a.Info.Name)) + { + if (info.Delay > 0) + tick = info.Delay; + else + PlaySound(self); + } + } + + void INotifyAttack.PreparingAttack(Actor self, in Target target, Armament a, Barrel barrel) + { + if (IsTraitDisabled) + return; + + if (info.DelayRelativeTo == AttackDelayType.Preparation && Info.Armaments.Contains(a.Info.Name)) + { + if (info.Delay > 0) + tick = info.Delay; + else + PlaySound(self); + } + } + + void ITick.Tick(Actor self) + { + if (IsTraitDisabled) + return; + + if (info.Delay > 0 && --tick == 0) + PlaySound(self); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Sound/SoundOnDamageTransitionCA.cs b/OpenRA.Mods.CA/Traits/Sound/SoundOnDamageTransitionCA.cs new file mode 100644 index 0000000000..1fa2af498e --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Sound/SoundOnDamageTransitionCA.cs @@ -0,0 +1,59 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits.Sound +{ + public class SoundOnDamageTransitionCAInfo : ConditionalTraitInfo + { + [Desc("Play a random sound from this list when damaged.")] + public readonly string[] DamagedSounds = Array.Empty(); + + [Desc("Play a random sound from this list when destroyed.")] + public readonly string[] DestroyedSounds = Array.Empty(); + + [Desc("DamageType(s) that trigger the sounds. Leave empty to always trigger a sound.")] + public readonly BitSet DamageTypes = default; + + public override object Create(ActorInitializer init) { return new SoundOnDamageTransitionCA(init.Self, this); } + } + + public class SoundOnDamageTransitionCA : ConditionalTrait, INotifyDamageStateChanged + { + public SoundOnDamageTransitionCA(Actor self, SoundOnDamageTransitionCAInfo info) + : base(info) { } + + void INotifyDamageStateChanged.DamageStateChanged(Actor self, AttackInfo e) + { + if (IsTraitDisabled) + return; + + if (!Info.DamageTypes.IsEmpty && !e.Damage.DamageTypes.Overlaps(Info.DamageTypes)) + return; + + var rand = Game.CosmeticRandom; + + if (e.DamageState == DamageState.Dead) + { + var sound = Info.DestroyedSounds.RandomOrDefault(rand); + Game.Sound.Play(SoundType.World, sound, self.CenterPosition); + } + else if (e.DamageState >= DamageState.Heavy && e.PreviousDamageState < DamageState.Heavy) + { + var sound = Info.DamagedSounds.RandomOrDefault(rand); + Game.Sound.Play(SoundType.World, sound, self.CenterPosition); + } + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Sound/WithCargoSounds.cs b/OpenRA.Mods.CA/Traits/Sound/WithCargoSounds.cs new file mode 100644 index 0000000000..87ce07a4d5 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Sound/WithCargoSounds.cs @@ -0,0 +1,74 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using OpenRA.Mods.Common.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + public class WithCargoSoundsInfo : ConditionalTraitInfo + { + [Desc("Speech notification played when an actor enters this cargo.")] + public readonly string EnterNotification = null; + + [Desc("Speech notification played when an actor leaves this cargo.")] + public readonly string ExitNotification = null; + + [Desc("List of sounds to be randomly played when an actor enters this cargo.")] + public readonly string[] EnterSounds = Array.Empty(); + + [Desc("List of sounds to be randomly played when an actor exits this cargo.")] + public readonly string[] ExitSounds = Array.Empty(); + + [Desc("Does the sound play under shroud or fog.")] + public readonly bool AudibleThroughFog = false; + + [Desc("Volume the EnterSounds and ExitSounds played at.")] + public readonly float SoundVolume = 1f; + + public override object Create(ActorInitializer init) { return new WithCargoSounds(init.Self, this); } + } + + public class WithCargoSounds : ConditionalTrait, INotifyPassengerEntered, INotifyPassengerExited + { + public WithCargoSounds(Actor self, WithCargoSoundsInfo info) + : base(info) { } + + void INotifyPassengerEntered.OnPassengerEntered(Actor self, Actor passenger) + { + if (IsTraitDisabled) + return; + + if (Info.EnterSounds.Length > 0) + { + var pos = self.CenterPosition; + if (Info.AudibleThroughFog || (!self.World.ShroudObscures(pos) && !self.World.FogObscures(pos))) + Game.Sound.Play(SoundType.World, Info.EnterSounds, self.World, pos, null, Info.SoundVolume); + } + + Game.Sound.PlayNotification(self.World.Map.Rules, passenger.Owner, "Speech", Info.EnterNotification, passenger.Owner.Faction.InternalName); + } + + void INotifyPassengerExited.OnPassengerExited(Actor self, Actor passenger) + { + if (IsTraitDisabled) + return; + + if (Info.ExitSounds.Length > 0) + { + var pos = self.CenterPosition; + if (Info.AudibleThroughFog || (!self.World.ShroudObscures(pos) && !self.World.FogObscures(pos))) + Game.Sound.Play(SoundType.World, Info.ExitSounds, self.World, pos, null, Info.SoundVolume); + } + + Game.Sound.PlayNotification(self.World.Map.Rules, passenger.Owner, "Speech", Info.ExitNotification, passenger.Owner.Faction.InternalName); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/SpawnActorAbility.cs b/OpenRA.Mods.CA/Traits/SpawnActorAbility.cs new file mode 100644 index 0000000000..e1d0881ce9 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/SpawnActorAbility.cs @@ -0,0 +1,422 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Linq; +using OpenRA.Graphics; +using OpenRA.Mods.CA.Activities; +using OpenRA.Mods.Common.Graphics; +using OpenRA.Mods.Common.Orders; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + public enum SpawnActorAbilityBehavior + { + SpawnAtTarget, + SpawnAtSelfAndMoveToTarget, + SpawnAtSelfAndSlavesAndMoveToTarget, + } + + [Desc("Actor can deploy to be able to target a location and spawn an actor there.")] + public class SpawnActorAbilityInfo : PausableConditionalTraitInfo, Requires + { + [Desc("How the ability behaves.")] + public readonly SpawnActorAbilityBehavior Behavior = SpawnActorAbilityBehavior.SpawnAtTarget; + + [Desc("Range.")] + public readonly WDist Range = WDist.Zero; + + [VoiceReference] + public readonly string Voice = "Action"; + + [ActorReference] + [FieldLoader.Require] + [Desc("Actor to spawn.")] + public readonly string[] Actors = null; + + [CursorReference] + [Desc("Cursor to display when able to deploy the actor.")] + public readonly string DeployCursor = "deploy"; + + [CursorReference] + [Desc("Cursor to display when unable to deploy the actor.")] + public readonly string DeployBlockedCursor = "deploy-blocked"; + + [CursorReference] + [Desc("Cursor to display when targeting a teleport location.")] + public readonly string TargetCursor = "ability"; + + [CursorReference] + [Desc("Cursor to display when the targeted location is blocked.")] + public readonly string TargetBlockedCursor = "move-blocked"; + + [CursorReference] + [Desc("Cursor to display when targeting a teleport location with modifier key held.")] + public readonly string TargetModifiedCursor = null; + + [Desc("Range circle color.")] + public readonly Color CircleColor = Color.FromArgb(128, Color.LawnGreen); + + [Desc("Range circle line width.")] + public readonly float CircleWidth = 1; + + [Desc("Range circle border color.")] + public readonly Color CircleBorderColor = Color.FromArgb(96, Color.Black); + + [Desc("Range circle border width.")] + public readonly float CircleBorderWidth = 3; + + public readonly WDist TargetCircleRange = WDist.Zero; + public readonly Color TargetCircleColor = Color.White; + + [Desc("Color to use for the target line.")] + public readonly Color TargetLineColor = Color.LawnGreen; + + [Desc("Skips the spawned actor's make animations if true.")] + public readonly bool SkipMakeAnimations = true; + + [Desc("If true allow targeting in shroud.")] + public readonly bool CanTargetShroud = true; + + [Desc("List of valid terrain types to spawn at. Leave blank for any.")] + public readonly HashSet AllowedTerrainTypes = new(); + + [Desc("Play a randomly selected sound from this list when spawning the actor.")] + public readonly string[] SpawnSounds = Array.Empty(); + + [NotificationReference("Speech")] + [Desc("Speech notification for target selection.")] + public readonly string SelectTargetSpeechNotification = null; + + [Desc("Consume ammo from this ammo pool on use.")] + public readonly string AmmoPool = null; + + [Desc("When selecting a group, different types will not be activated together.")] + public readonly string Type = null; + + [Desc("If greater than zero, when number of actors spawned exceeds this number the oldest actor will be killed or removed.")] + public readonly int ConcurrentLimit = 0; + + [Desc("Types of damage to kill excess actors with. Leave empty to dispose instead of kill.")] + public readonly BitSet KillExcessDamageTypes = default; + + [Desc("If true, faces the target.")] + public readonly bool FaceTarget = false; + + [Desc("Avoid actors.")] + public readonly bool AvoidActors = false; + + public override object Create(ActorInitializer init) { return new SpawnActorAbility(init, this); } + } + + public class SpawnActorAbility : PausableConditionalTrait, INotifyCreated, IIssueOrder, IResolveOrder, IOrderVoice, IIssueDeployOrder + { + public new readonly SpawnActorAbilityInfo Info; + + readonly IMove move; + readonly Queue spawns; + AmmoPool ammoPool; + IEnumerable mindControllers; + + public SpawnActorAbility(ActorInitializer init, SpawnActorAbilityInfo info) + : base(info) + { + Info = info; + move = init.Self.Trait(); + spawns = new Queue(); + mindControllers = init.Self.TraitsImplementing(); + } + + protected override void Created(Actor self) + { + ammoPool = self.TraitsImplementing().SingleOrDefault(ap => ap.Info.Name == Info.AmmoPool); + base.Created(self); + } + + Order IIssueDeployOrder.IssueDeployOrder(Actor self, bool queued) + { + // HACK: Switch the global order generator instead of actually issuing an order + if (CanSpawnActor) + self.World.OrderGenerator = new SpawnActorAbilityOrderGenerator(self, this); + + // HACK: We need to issue a fake order to stop the game complaining about the bodge above + return new Order("SpawnActorAbilityDeploy", self, Target.Invalid, queued); + } + + bool IIssueDeployOrder.CanIssueDeployOrder(Actor self, bool queued) { return !IsTraitPaused && !IsTraitDisabled; } + + public IEnumerable Orders + { + get + { + if (IsTraitDisabled) + yield break; + + yield return new DeployOrderTargeter("SpawnActorAbilityDeploy", 5, + () => CanSpawnActor ? Info.DeployCursor : Info.DeployBlockedCursor); + } + } + + Order IIssueOrder.IssueOrder(Actor self, IOrderTargeter order, in Target target, bool queued) + { + if (order.OrderID == "SpawnActorAbilityDeploy") + { + // HACK: Switch the global order generator instead of actually issuing an order + if (CanSpawnActor) + self.World.OrderGenerator = new SpawnActorAbilityOrderGenerator(self, this); + + // HACK: We need to issue a fake order to stop the game complaining about the bodge above + return new Order(order.OrderID, self, Target.Invalid, queued); + } + + if (order.OrderID == "SpawnActorAbility") + return new Order(order.OrderID, self, target, queued); + + return null; + } + + void IResolveOrder.ResolveOrder(Actor self, Order order) + { + if (IsTraitDisabled || IsTraitPaused) + return; + + if (order.OrderString == "SpawnActorAbility" && order.Target.Type != TargetType.Invalid) + { + if (!order.Queued) + self.CancelActivity(); + + var cell = self.World.Map.CellContaining(order.Target.CenterPosition); + + WAngle? initFacing = null; + + if (Info.FaceTarget) + initFacing = (order.Target.CenterPosition - self.CenterPosition).Yaw; + + if (Info.Behavior == SpawnActorAbilityBehavior.SpawnAtSelfAndMoveToTarget || Info.Behavior == SpawnActorAbilityBehavior.SpawnAtSelfAndSlavesAndMoveToTarget) + { + var spawnCell = self.Location; + var spawnPos = self.CenterPosition; + + self.QueueActivity(new SpawnActor(Info.Actors, spawnCell, initFacing, Info.SkipMakeAnimations, Info.SpawnSounds, ammoPool, 3, Info.AvoidActors, WDist.Zero, Info.CanTargetShroud, Info.AllowedTerrainTypes, (actor, spawned) => + { + ActorSpawned(actor, spawned); + + var moveTrait = spawned.TraitOrDefault(); + if (moveTrait != null) + spawned.QueueActivity(moveTrait.MoveTo(self.World.Map.CellContaining(order.Target.CenterPosition))); + })); + + if (Info.Behavior == SpawnActorAbilityBehavior.SpawnAtSelfAndSlavesAndMoveToTarget) + { + foreach (var mc in mindControllers) + { + foreach (var slave in mc.Slaves) + { + if (slave.Actor.IsInWorld && !slave.Actor.IsDead) + { + var slaveCell = slave.Actor.Location; + var slavePos = slave.Actor.CenterPosition; + + self.QueueActivity(new SpawnActor(Info.Actors, slaveCell, initFacing, Info.SkipMakeAnimations, Info.SpawnSounds, ammoPool, 3, Info.AvoidActors, WDist.Zero, Info.CanTargetShroud, Info.AllowedTerrainTypes, (actor, spawned) => + { + ActorSpawned(actor, spawned); + + var moveTrait = spawned.TraitOrDefault(); + if (moveTrait != null) + spawned.QueueActivity(moveTrait.MoveTo(self.World.Map.CellContaining(order.Target.CenterPosition))); + })); + } + } + } + } + } + else + { + if (Info.Range > WDist.Zero) + self.QueueActivity(move.MoveWithinRange(order.Target, Info.Range, targetLineColor: Info.TargetLineColor)); + + self.QueueActivity(new SpawnActor(Info.Actors, cell, initFacing, Info.SkipMakeAnimations, Info.SpawnSounds, ammoPool, 3, Info.AvoidActors, Info.Range, Info.CanTargetShroud, Info.AllowedTerrainTypes, ActorSpawned)); + } + + self.ShowTargetLines(); + } + } + + string IOrderVoice.VoicePhraseForOrder(Actor self, Order order) + { + return order.OrderString == "SpawnActorAbility" ? Info.Voice : null; + } + + public bool CanSpawnActor + { + get { return ammoPool == null || ammoPool.HasAmmo; } + } + + public void ActorSpawned(Actor self, Actor spawned) + { + if (Info.ConcurrentLimit == 0) + return; + + spawns.Enqueue(spawned); + + if (spawns.Count > Info.ConcurrentLimit) + { + var oldest = spawns.Dequeue(); + + if (Info.KillExcessDamageTypes.Any()) + oldest.Kill(self, Info.KillExcessDamageTypes); + else + oldest.Dispose(); + } + } + } + + class SpawnActorAbilityOrderGenerator : OrderGenerator + { + readonly Actor self; + readonly SpawnActorAbility ability; + readonly SpawnActorAbilityInfo info; + readonly IEnumerable> selectedWithAbility; + + public SpawnActorAbilityOrderGenerator(Actor self, SpawnActorAbility ability) + { + this.self = self; + this.ability = ability; + info = ability.Info; + + if (ability.Info.SelectTargetSpeechNotification != null) + Game.Sound.PlayNotification(self.World.Map.Rules, self.Owner, "Speech", + ability.Info.SelectTargetSpeechNotification, self.Owner.Faction.InternalName); + + selectedWithAbility = self.World.Selection.Actors + .Where(a => a.Owner == self.Owner + && !a.IsDead + && a.Info.HasTraitInfo() + && a.TraitsImplementing().Any(t => t.Info.Type == ability.Info.Type)) + .Select(a => new TraitPair(a, a.TraitsImplementing().First(t => t.Info.Type == ability.Info.Type))); + } + + protected override IEnumerable OrderInner(World world, CPos cell, int2 worldPixel, MouseInput mi) + { + if (mi.Button == MouseButton.Right) + { + world.CancelInputMode(); + yield break; + } + + if (self.IsInWorld && self.Location != cell + && ability.CanSpawnActor + && (info.CanTargetShroud || self.Owner.Shroud.IsExplored(cell))) + { + world.CancelInputMode(); + var targetCell = Target.FromCell(world, cell); + + var selectedOrderedByDistance = selectedWithAbility + .Where(a => !a.Actor.IsDead + && a.Actor.Owner == self.Owner + && a.Actor.IsInWorld + && a.Trait.CanSpawnActor) + .OrderBy(a => (a.Actor.CenterPosition - targetCell.CenterPosition).Length); + + if (mi.Modifiers.HasModifier(Modifiers.Ctrl)) + { + foreach (var other in selectedOrderedByDistance) + yield return new Order("SpawnActorAbility", other.Actor, Target.FromCell(world, cell), mi.Modifiers.HasModifier(Modifiers.Shift)); + } + else + { + var closest = selectedOrderedByDistance.First(); + yield return new Order("SpawnActorAbility", closest.Actor, Target.FromCell(world, cell), mi.Modifiers.HasModifier(Modifiers.Shift)); + } + } + } + + protected override void SelectionChanged(World world, IEnumerable selected) + { + if (!selected.Contains(self)) + world.CancelInputMode(); + } + + protected override void Tick(World world) + { + if (ability.IsTraitDisabled || ability.IsTraitPaused) + { + world.CancelInputMode(); + return; + } + } + + protected override IEnumerable Render(WorldRenderer wr, World world) { yield break; } + + protected override IEnumerable RenderAboveShroud(WorldRenderer wr, World world) { yield break; } + + protected override IEnumerable RenderAnnotations(WorldRenderer wr, World world) + { + if (!self.IsInWorld || self.Owner != self.World.LocalPlayer) + yield break; + + if (info.Range == WDist.Zero) + yield break; + + yield return new RangeCircleAnnotationRenderable( + self.CenterPosition + new WVec(0, self.CenterPosition.Z, 0), + info.Range, + 0, + info.CircleColor, + info.CircleWidth, + info.CircleBorderColor, + info.CircleBorderWidth); + + foreach (var other in selectedWithAbility) + { + if (other.Actor.IsInWorld && other.Trait.CanSpawnActor && self.Owner == self.World.LocalPlayer) + { + yield return new RangeCircleAnnotationRenderable( + other.Actor.CenterPosition + new WVec(0, other.Actor.CenterPosition.Z, 0), + other.Trait.Info.Range, + 0, + other.Trait.Info.CircleColor, + other.Trait.Info.CircleWidth, + other.Trait.Info.CircleBorderColor, + other.Trait.Info.CircleBorderWidth); + } + } + + if (ability.Info.TargetCircleRange > WDist.Zero) + { + var xy = wr.Viewport.ViewToWorld(Viewport.LastMousePos); + + yield return new RangeCircleAnnotationRenderable( + world.Map.CenterOfCell(xy), + ability.Info.TargetCircleRange, + 0, + ability.Info.TargetCircleColor, + 1, + Color.FromArgb(96, Color.Black), + 3); + } + } + + protected override string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi) + { + if (self.IsInWorld && self.Location != cell + && ability.CanSpawnActor + && (info.CanTargetShroud || self.Owner.Shroud.IsExplored(cell)) + && (info.AllowedTerrainTypes.Count == 0 || info.AllowedTerrainTypes.Contains(world.Map.GetTerrainInfo(cell).Type))) + return info.TargetModifiedCursor != null && mi.Modifiers.HasModifier(Modifiers.Ctrl) ? info.TargetModifiedCursor : info.TargetCursor; + else + return info.TargetBlockedCursor; + } + } +} diff --git a/OpenRA.Mods.CA/Traits/SpawnActorOnCapture.cs b/OpenRA.Mods.CA/Traits/SpawnActorOnCapture.cs new file mode 100644 index 0000000000..e7aeae5e89 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/SpawnActorOnCapture.cs @@ -0,0 +1,117 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Linq; +using OpenRA.Mods.Common; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Spawn another actor upon being captured.")] + public class SpawnActorOnCaptureInfo : ConditionalTraitInfo + { + [ActorReference] + [FieldLoader.Require] + [Desc("Actor to spawn on death.")] + public readonly string Actor = null; + + [Desc("Probability the actor spawns.")] + public readonly int Probability = 100; + + [Desc("Map player to use when 'InternalName' is defined on 'OwnerType'.")] + public readonly string InternalOwner = "Neutral"; + + [Desc("Skips the spawned actor's make animations if true.")] + public readonly bool SkipMakeAnimations = true; + + [Desc("Offset of the spawned actor relative to the dying actor's position.", + "Warning: Spawning an actor outside the parent actor's footprint/influence might", + "lead to unexpected behaviour.")] + public readonly CVec Offset = CVec.Zero; + + [Desc("Should an actor spawn after the player has been defeated (e.g. after surrendering)?")] + public readonly bool SpawnAfterDefeat = true; + + [Desc("Delay in ticks before actor is spawned.")] + public readonly int Delay = 0; + + public override object Create(ActorInitializer init) { return new SpawnActorOnCapture(init, this); } + } + + public class SpawnActorOnCapture : ConditionalTrait, INotifyCapture, ITick + { + readonly string faction; + int delayTicks; + bool spawnPending; + WPos spawnPosition; + CPos spawnCell; + + public SpawnActorOnCapture(ActorInitializer init, SpawnActorOnCaptureInfo info) + : base(info) + { + faction = init.GetValue(init.Self.Owner.Faction.InternalName); + delayTicks = Info.Delay; + spawnPending = true; + } + + void INotifyCapture.OnCapture(Actor self, Actor captor, Player oldOwner, Player newOwner, BitSet captureTypes) + { + if (IsTraitDisabled || !self.IsInWorld) + return; + + spawnPending = true; + spawnPosition = self.CenterPosition; + spawnCell = self.Location + Info.Offset; + delayTicks = Info.Delay; + } + + void ITick.Tick(OpenRA.Actor self) + { + if (!spawnPending) + return; + + if (--delayTicks <= 0) + SpawnActor(self); + } + + void SpawnActor(Actor self) + { + if (self.World.SharedRandom.Next(100) > Info.Probability) + return; + + var defeated = self.Owner.WinState == WinState.Lost; + if (defeated && !Info.SpawnAfterDefeat) + return; + + var td = new TypeDictionary + { + new ParentActorInit(self), + new LocationInit(spawnCell), + new CenterPositionInit(spawnPosition), + new FactionInit(faction) + }; + + // Fall back to InternalOwner if the Victim was defeated, + // but only if InternalOwner is defined + if (!defeated || string.IsNullOrEmpty(Info.InternalOwner)) + td.Add(new OwnerInit(self.Owner)); + else + td.Add(new OwnerInit(self.World.Players.First(p => p.InternalName == Info.InternalOwner))); + + if (Info.SkipMakeAnimations) + td.Add(new SkipMakeAnimsInit()); + + self.World.AddFrameEndTask(w => w.CreateActor(Info.Actor, td)); + spawnPending = false; + } + } +} diff --git a/OpenRA.Mods.CA/Traits/SpawnActorOnDeathCA.cs b/OpenRA.Mods.CA/Traits/SpawnActorOnDeathCA.cs new file mode 100644 index 0000000000..f0765d3e72 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/SpawnActorOnDeathCA.cs @@ -0,0 +1,188 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Linq; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.Common.Traits +{ + [Desc("Spawn another actor immediately upon death.", + "CA version can add spawned actor to selection and/or control group.")] + public class SpawnActorOnDeathCAInfo : ConditionalTraitInfo + { + [ActorReference] + [FieldLoader.Require] + [Desc("Actor to spawn on death.")] + public readonly string Actor = null; + + [Desc("Probability the actor spawns.")] + public readonly int Probability = 100; + + [Desc("Owner of the spawned actor. Allowed keywords:" + + "'Victim', 'Killer' and 'InternalName'. " + + "Falls back to 'InternalName' if 'Victim' is used " + + "and the victim is defeated (see 'SpawnAfterDefeat').")] + public readonly OwnerType OwnerType = OwnerType.Victim; + + [Desc("Map player to use when 'InternalName' is defined on 'OwnerType'.")] + public readonly string InternalOwner = "Neutral"; + + [Desc("Changes the effective (displayed) owner of the spawned actor to the old owner (victim).")] + public readonly bool EffectiveOwnerFromOwner = false; + + [Desc("DeathType that triggers the actor spawn. " + + "Leave empty to spawn an actor ignoring the DeathTypes.")] + public readonly string DeathType = null; + + [Desc("Skips the spawned actor's make animations if true.")] + public readonly bool SkipMakeAnimations = true; + + [Desc("Should an actor only be spawned when the 'Creeps' setting is true?")] + public readonly bool RequiresLobbyCreeps = false; + + [Desc("Offset of the spawned actor relative to the dying actor's position.", + "Warning: Spawning an actor outside the parent actor's footprint/influence might", + "lead to unexpected behaviour.")] + public readonly CVec Offset = CVec.Zero; + + [Desc("Should an actor spawn after the player has been defeated (e.g. after surrendering)?")] + public readonly bool SpawnAfterDefeat = true; + + [Desc("Should the spawned actor be added to the selection?")] + public readonly bool InheritsSelection = false; + + [Desc("Should the spawned actor be added to the control group?")] + public readonly bool InheritsControlGroup = false; + + [Desc("Should the spawned actor inhert stance from the killed actor.")] + public readonly bool InheritsStance = false; + + [Desc("Should the spawned actor inhert experience from the killed actor.")] + public readonly bool InheritsExperience = false; + + public override object Create(ActorInitializer init) { return new SpawnActorOnDeathCA(init, this); } + } + + public class SpawnActorOnDeathCA : ConditionalTrait, INotifyKilled, INotifyRemovedFromWorld + { + readonly string faction; + readonly bool enabled; + + Player attackingPlayer; + + bool wasSelected; + int? controlGroup; + + public SpawnActorOnDeathCA(ActorInitializer init, SpawnActorOnDeathCAInfo info) + : base(info) + { + enabled = !info.RequiresLobbyCreeps || init.Self.World.WorldActor.Trait().Enabled; + faction = init.GetValue(init.Self.Owner.Faction.InternalName); + } + + void INotifyKilled.Killed(Actor self, AttackInfo e) + { + if (!enabled || IsTraitDisabled || !self.IsInWorld) + return; + + if (self.World.SharedRandom.Next(100) > Info.Probability) + return; + + if (Info.DeathType != null && !e.Damage.DamageTypes.Contains(Info.DeathType)) + return; + + attackingPlayer = e.Attacker.Owner; + + wasSelected = self.World.Selection.Contains(self); + controlGroup = self.World.ControlGroups.GetControlGroupForActor(self); + } + + // Don't add the new actor to the world before all RemovedFromWorld callbacks have run + void INotifyRemovedFromWorld.RemovedFromWorld(Actor self) + { + if (attackingPlayer == null) + return; + + var defeated = self.Owner.WinState == WinState.Lost; + if (defeated && !Info.SpawnAfterDefeat) + return; + + var td = new TypeDictionary + { + new ParentActorInit(self), + new LocationInit(self.Location + Info.Offset), + new CenterPositionInit(self.CenterPosition), + new FactionInit(faction) + }; + + if (self.EffectiveOwner != null && self.EffectiveOwner.Disguised) + td.Add(new EffectiveOwnerInit(self.EffectiveOwner.Owner)); + else if (Info.EffectiveOwnerFromOwner) + td.Add(new EffectiveOwnerInit(self.Owner)); + + if (Info.OwnerType == OwnerType.Victim) + { + // Fall back to InternalOwner if the Victim was defeated, + // but only if InternalOwner is defined + if (!defeated || string.IsNullOrEmpty(Info.InternalOwner)) + td.Add(new OwnerInit(self.Owner)); + else + { + td.Add(new OwnerInit(self.World.Players.First(p => p.InternalName == Info.InternalOwner))); + if (!td.Contains()) + td.Add(new EffectiveOwnerInit(self.Owner)); + } + } + else if (Info.OwnerType == OwnerType.Killer) + td.Add(new OwnerInit(attackingPlayer)); + else + td.Add(new OwnerInit(self.World.Players.First(p => p.InternalName == Info.InternalOwner))); + + if (Info.SkipMakeAnimations) + td.Add(new SkipMakeAnimsInit()); + + foreach (var modifier in self.TraitsImplementing()) + modifier.ModifyDeathActorInit(self, td); + + if (Info.InheritsStance) + { + var autoTarget = self.TraitOrDefault(); + if (autoTarget != null) + { + var stance = autoTarget.Stance; + td.Add(new StanceInit(Info, stance)); + } + } + + var oldGainsExperience = Info.InheritsExperience ? self.TraitOrDefault() : null; + + var huskActor = self.TraitsImplementing() + .Select(ihm => ihm.HuskActor(self)) + .FirstOrDefault(a => a != null); + + self.World.AddFrameEndTask(w => { + var actor = w.CreateActor(huskActor ?? Info.Actor, td); + + if (Info.InheritsSelection && wasSelected) + w.Selection.Add(actor); + + if (Info.InheritsControlGroup && controlGroup != null) + w.ControlGroups.AddToControlGroup(actor, controlGroup.Value); + + if (Info.InheritsExperience) { + var newGainsExperience = actor.TraitOrDefault(); + if (oldGainsExperience != null && newGainsExperience != null) + newGainsExperience.GiveExperience(oldGainsExperience.Experience, true); + } + }); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/SpawnActorOnMindControlled.cs b/OpenRA.Mods.CA/Traits/SpawnActorOnMindControlled.cs new file mode 100644 index 0000000000..005266e56b --- /dev/null +++ b/OpenRA.Mods.CA/Traits/SpawnActorOnMindControlled.cs @@ -0,0 +1,135 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Linq; +using OpenRA.Mods.Common; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + public enum MindControlledOwnerType { Victim, Master, InternalName } + + [Desc("Spawn another actor immediately upon being mind controlled.")] + public class SpawnActorOnMindControlledInfo : ConditionalTraitInfo + { + [ActorReference] + [FieldLoader.Require] + [Desc("Actor to spawn on being mind controlled.")] + public readonly string Actor = null; + + [Desc("Probability the actor spawns.")] + public readonly int Probability = 100; + + [Desc("Owner of the spawned actor. Allowed keywords:" + + "'Victim', 'Killer' and 'InternalName'. " + + "Falls back to 'InternalName' if 'Victim' is used " + + "and the victim is defeated (see 'SpawnAfterDefeat').")] + public readonly MindControlledOwnerType OwnerType = MindControlledOwnerType.Victim; + + [Desc("Map player to use when 'InternalName' is defined on 'OwnerType'.")] + public readonly string InternalOwner = "Neutral"; + + [Desc("Changes the effective (displayed) owner of the spawned actor to the old owner (victim).")] + public readonly bool EffectiveOwnerFromOwner = false; + + [Desc("Skips the spawned actor's make animations if true.")] + public readonly bool SkipMakeAnimations = true; + + [Desc("Should an actor only be spawned when the 'Creeps' setting is true?")] + public readonly bool RequiresLobbyCreeps = false; + + [Desc("Offset of the spawned actor relative to the dying actor's position.", + "Warning: Spawning an actor outside the parent actor's footprint/influence might", + "lead to unexpected behaviour.")] + public readonly CVec Offset = CVec.Zero; + + [Desc("Should an actor spawn after the player has been defeated (e.g. after surrendering)?")] + public readonly bool SpawnAfterDefeat = true; + + public override object Create(ActorInitializer init) { return new SpawnActorOnMindControlled(init, this); } + } + + public class SpawnActorOnMindControlled : ConditionalTrait, INotifyMindControlled + { + readonly string faction; + readonly bool enabled; + + Player attackingPlayer; + + public SpawnActorOnMindControlled(ActorInitializer init, SpawnActorOnMindControlledInfo info) + : base(info) + { + enabled = !info.RequiresLobbyCreeps || init.Self.World.WorldActor.Trait().Enabled; + faction = init.GetValue(init.Self.Owner.Faction.InternalName); + } + + void INotifyMindControlled.MindControlled(Actor self, Actor master) + { + if (!enabled || IsTraitDisabled || !self.IsInWorld) + return; + + if (self.World.SharedRandom.Next(100) > Info.Probability) + return; + + attackingPlayer = master.Owner; + + var defeated = self.Owner.WinState == WinState.Lost; + if (defeated && !Info.SpawnAfterDefeat) + return; + + var td = new TypeDictionary + { + new ParentActorInit(self), + new LocationInit(self.Location + Info.Offset), + new CenterPositionInit(self.CenterPosition), + new FactionInit(faction) + }; + + if (self.EffectiveOwner != null && self.EffectiveOwner.Disguised) + td.Add(new EffectiveOwnerInit(self.EffectiveOwner.Owner)); + else if (Info.EffectiveOwnerFromOwner) + td.Add(new EffectiveOwnerInit(self.Owner)); + + if (Info.OwnerType == MindControlledOwnerType.Victim) + { + // Fall back to InternalOwner if the Victim was defeated, + // but only if InternalOwner is defined + if (!defeated || string.IsNullOrEmpty(Info.InternalOwner)) + td.Add(new OwnerInit(self.Owner)); + else + { + td.Add(new OwnerInit(self.World.Players.First(p => p.InternalName == Info.InternalOwner))); + if (!td.Contains()) + td.Add(new EffectiveOwnerInit(self.Owner)); + } + } + else if (Info.OwnerType == MindControlledOwnerType.Master) + td.Add(new OwnerInit(attackingPlayer)); + else + td.Add(new OwnerInit(self.World.Players.First(p => p.InternalName == Info.InternalOwner))); + + if (Info.SkipMakeAnimations) + td.Add(new SkipMakeAnimsInit()); + + foreach (var modifier in self.TraitsImplementing()) + modifier.ModifyDeathActorInit(self, td); + + var huskActor = self.TraitsImplementing() + .Select(ihm => ihm.HuskActor(self)) + .FirstOrDefault(a => a != null); + + self.World.AddFrameEndTask(w => w.CreateActor(huskActor ?? Info.Actor, td)); + } + + void INotifyMindControlled.Released(Actor self, Actor master) {} + } +} diff --git a/OpenRA.Mods.CA/Traits/SpawnActorOnSell.cs b/OpenRA.Mods.CA/Traits/SpawnActorOnSell.cs new file mode 100644 index 0000000000..3e7042f09a --- /dev/null +++ b/OpenRA.Mods.CA/Traits/SpawnActorOnSell.cs @@ -0,0 +1,102 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Linq; +using OpenRA.Mods.Common; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Spawn another actor immediately upon selling.", + "Differs from SpawnActorsOnSell in that it doesn't care about value/HP.")] + public class SpawnActorOnSellInfo : ConditionalTraitInfo + { + [ActorReference] + [FieldLoader.Require] + [Desc("Actor to spawn on death.")] + public readonly string Actor = null; + + [Desc("Map player to use when 'InternalName' is defined on 'OwnerType'.")] + public readonly string InternalOwner = "Neutral"; + + [Desc("Changes the effective (displayed) owner of the spawned actor to the old owner (victim).")] + public readonly bool EffectiveOwnerFromOwner = false; + + [Desc("Skips the spawned actor's make animations if true.")] + public readonly bool SkipMakeAnimations = true; + + [Desc("Offset of the spawned actor relative to the dying actor's position.", + "Warning: Spawning an actor outside the parent actor's footprint/influence might", + "lead to unexpected behaviour.")] + public readonly CVec Offset = CVec.Zero; + + [Desc("Should an actor spawn after the player has been defeated (e.g. after surrendering)?")] + public readonly bool SpawnAfterDefeat = true; + + public override object Create(ActorInitializer init) { return new SpawnActorOnSell(init, this); } + } + + public class SpawnActorOnSell : ConditionalTrait, INotifySold + { + readonly string faction; + + public SpawnActorOnSell(ActorInitializer init, SpawnActorOnSellInfo info) + : base(info) + { + faction = init.GetValue(init.Self.Owner.Faction.InternalName); + } + + void INotifySold.Sold(Actor self) + { + if (IsTraitDisabled) + return; + + var defeated = self.Owner.WinState == WinState.Lost; + if (defeated && !Info.SpawnAfterDefeat) + return; + + var td = new TypeDictionary + { + new ParentActorInit(self), + new LocationInit(self.Location + Info.Offset), + new CenterPositionInit(self.CenterPosition), + new FactionInit(faction) + }; + + if (self.EffectiveOwner != null && self.EffectiveOwner.Disguised) + td.Add(new EffectiveOwnerInit(self.EffectiveOwner.Owner)); + else if (Info.EffectiveOwnerFromOwner) + td.Add(new EffectiveOwnerInit(self.Owner)); + + // Fall back to InternalOwner if the Victim was defeated, + // but only if InternalOwner is defined + if (!defeated || string.IsNullOrEmpty(Info.InternalOwner)) + td.Add(new OwnerInit(self.Owner)); + else + { + td.Add(new OwnerInit(self.World.Players.First(p => p.InternalName == Info.InternalOwner))); + if (!td.Contains()) + td.Add(new EffectiveOwnerInit(self.Owner)); + } + + if (Info.SkipMakeAnimations) + td.Add(new SkipMakeAnimsInit()); + + foreach (var modifier in self.TraitsImplementing()) + modifier.ModifyDeathActorInit(self, td); + + self.World.AddFrameEndTask(w => w.CreateActor(Info.Actor, td)); + } + + void INotifySold.Selling(Actor self) { } + } +} diff --git a/OpenRA.Mods.CA/Traits/SpawnActorsOnSellCA.cs b/OpenRA.Mods.CA/Traits/SpawnActorsOnSellCA.cs new file mode 100644 index 0000000000..7a4ee7721b --- /dev/null +++ b/OpenRA.Mods.CA/Traits/SpawnActorsOnSellCA.cs @@ -0,0 +1,147 @@ +#region Copyright & License Information +/* + * Copyright (c) The OpenRA Developers and Contributors + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. For more + * information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Linq; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.Common.Traits +{ + [Desc("Spawn new actors when sold.")] + public class SpawnActorsOnSellCAInfo : ConditionalTraitInfo + { + public readonly int ValuePercent = 40; + public readonly int MinHpPercent = 30; + + [ActorReference] + [FieldLoader.Require] + [Desc("Actor types to spawn on sell, amount and type based on ValuePercent. Be sure to use lowercase.")] + public readonly string[] ActorTypes = null; + + [ActorReference] + [Desc("Actors to spawn on sell. Be sure to use lowercase.")] + public readonly string[] GuaranteedActorTypes = Array.Empty(); + + [Desc("Spawns actors only if the selling player's faction is in this list. " + + "Leave empty to allow all factions by default.")] + public readonly HashSet Factions = new(); + + [Desc("If true, the actors defined by GuaranteedActorTypes will not spawn if there isn't enough value.")] + public readonly bool GuaranteedActorsLimitedByValue = false; + + public override object Create(ActorInitializer init) { return new SpawnActorsOnSellCA(init.Self, this); } + } + + public class SpawnActorsOnSellCA : ConditionalTrait, INotifySold + { + readonly bool correctFaction; + + public SpawnActorsOnSellCA(Actor self, SpawnActorsOnSellCAInfo info) + : base(info) + { + var factionsList = info.Factions; + correctFaction = factionsList.Count == 0 || factionsList.Contains(self.Owner.Faction.InternalName); + } + + void INotifySold.Selling(Actor self) { } + + void Emit(Actor self) + { + if (IsTraitDisabled || !correctFaction) + return; + + var buildingInfo = self.Info.TraitInfoOrDefault(); + if (buildingInfo == null) + return; + + var csv = self.Info.TraitInfoOrDefault(); + var valued = self.Info.TraitInfoOrDefault(); + var cost = csv?.Value ?? valued?.Cost ?? 0; + + var health = self.TraitOrDefault(); + var dudesValue = Info.ValuePercent * cost / 100; + if (health != null) + { + // Cast to long to avoid overflow when multiplying by the health + if (100L * health.HP >= Info.MinHpPercent * (long)health.MaxHP) + dudesValue = (int)((long)health.HP * dudesValue / health.MaxHP); + else + dudesValue = 0; + } + + var eligibleLocations = buildingInfo.Tiles(self.Location).ToList(); + + if (eligibleLocations.Count == 0) + return; + + if (Info.GuaranteedActorTypes.Length > 0) + { + var guaranteedActorTypes = Info.GuaranteedActorTypes.Select(a => + { + var av = self.World.Map.Rules.Actors[a].TraitInfoOrDefault(); + return new + { + Name = a, + Cost = av?.Cost ?? 0 + }; + }).ToList(); + + while (eligibleLocations.Count > 0 && guaranteedActorTypes.Count > 0 && (!Info.GuaranteedActorsLimitedByValue || guaranteedActorTypes.Any(a => a.Cost <= dudesValue))) + { + var at = guaranteedActorTypes.Where(a => !Info.GuaranteedActorsLimitedByValue || a.Cost <= dudesValue).Random(self.World.SharedRandom); + var loc = eligibleLocations.Random(self.World.SharedRandom); + + eligibleLocations.Remove(loc); + guaranteedActorTypes.Remove(at); + dudesValue -= at.Cost; + + self.World.AddFrameEndTask(w => w.CreateActor(at.Name, new TypeDictionary + { + new LocationInit(loc), + new OwnerInit(self.Owner), + })); + } + + if (eligibleLocations.Count == 0) + return; + } + + var actorTypes = Info.ActorTypes.Select(a => + { + var av = self.World.Map.Rules.Actors[a].TraitInfoOrDefault(); + return new + { + Name = a, + Cost = av?.Cost ?? 0 + }; + }).ToList(); + + while (eligibleLocations.Count > 0 && actorTypes.Any(a => a.Cost <= dudesValue)) + { + var at = actorTypes.Where(a => a.Cost <= dudesValue).Random(self.World.SharedRandom); + var loc = eligibleLocations.Random(self.World.SharedRandom); + + eligibleLocations.Remove(loc); + dudesValue -= at.Cost; + + self.World.AddFrameEndTask(w => w.CreateActor(at.Name, new TypeDictionary + { + new LocationInit(loc), + new OwnerInit(self.Owner), + })); + } + } + + void INotifySold.Sold(Actor self) { Emit(self); } + } +} diff --git a/OpenRA.Mods.CA/Traits/SpawnHuskEffectOnDeath.cs b/OpenRA.Mods.CA/Traits/SpawnHuskEffectOnDeath.cs new file mode 100644 index 0000000000..40ff038dc0 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/SpawnHuskEffectOnDeath.cs @@ -0,0 +1,138 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Linq; +using OpenRA.GameRules; +using OpenRA.Mods.Common.Activities; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Spawn projectile as husk upon death.")] + public class SpawnHuskEffectOnDeathInfo : ConditionalTraitInfo, IRulesetLoaded + { + [WeaponReference] + [FieldLoader.Require] + [Desc("Weapon to spawn on death as husk.")] + public readonly string Weapon = null; + + [Desc("DeathType(s) that trigger the effect. Leave empty to always trigger an effect.")] + public readonly BitSet DeathTypes = default; + + [Desc("Offset relative to actor's position to fire husk weapon from on death.")] + public readonly WVec LocalOffset = WVec.Zero; + + [Desc("Give random facing instead of actor facing to husk weapon.")] + public readonly bool RandomFacing = false; + + [Desc("Target offset relative to actor's position to fire husk weapon to on death.")] + public readonly WVec TargetOffset = new(200, 0, 0); + + [Desc("Always target ground level when fire at TargetOffset.")] + public readonly bool ForceToGround = true; + + [Desc("Pass current actor speed as RangeModifier to husk weapon.", + "Only supports aircraft for now.")] + public readonly bool UnitSpeedAsRangeModifier = true; + + public WeaponInfo WeaponInfo { get; private set; } + + public override void RulesetLoaded(Ruleset rules, ActorInfo ai) + { + if (string.IsNullOrEmpty(Weapon)) + return; + + var weaponToLower = Weapon.ToLowerInvariant(); + if (!rules.Weapons.TryGetValue(weaponToLower, out var weapon)) + throw new YamlException($"Weapons Ruleset does not contain an entry '{weaponToLower}'"); + + WeaponInfo = weapon; + + base.RulesetLoaded(rules, ai); + } + + public override object Create(ActorInitializer init) { return new SpawnHuskEffectOnDeath(this); } + } + + public class SpawnHuskEffectOnDeath : ConditionalTrait, INotifyKilled + { + public SpawnHuskEffectOnDeath(SpawnHuskEffectOnDeathInfo info) + : base(info) { } + + void INotifyKilled.Killed(Actor self, AttackInfo e) + { + if (IsTraitDisabled || (!Info.DeathTypes.IsEmpty && !e.Damage.DamageTypes.Overlaps(Info.DeathTypes))) + return; + + var weapon = Info.WeaponInfo; + var body = self.TraitOrDefault(); + var facing = Info.RandomFacing ? new WAngle(self.World.SharedRandom.Next(1024)) : self.TraitOrDefault()?.Facing; + if (!facing.HasValue) facing = WAngle.Zero; + + var epicenter = self.CenterPosition + (body != null + ? body.LocalToWorld(Info.LocalOffset.Rotate(body.QuantizeOrientation(self.Orientation))) + : Info.LocalOffset); + var world = self.World; + + var map = world.Map; + var targetpos = epicenter + body.LocalToWorld(new WVec(Info.TargetOffset.Length, 0, 0).Rotate(body.QuantizeOrientation(self.Orientation))); + var target = Target.FromPos(new WPos(targetpos.X, targetpos.Y, Info.ForceToGround ? map.CenterOfCell(map.CellContaining(targetpos)).Z : targetpos.Z)); + + var rangeModifiers = Array.Empty(); + if (Info.UnitSpeedAsRangeModifier) + { + var aircraft = self.TraitOrDefault(); + if (aircraft != null && !self.IsIdle) + { + if (self.CurrentActivity is FlyIdle) + rangeModifiers = new int[1] { aircraft.Info.CanHover ? 0 : aircraft.IdleMovementSpeed }; + else if (self.CurrentActivity.ActivitiesImplementing().Any()) + rangeModifiers = new int[1] { aircraft.MovementSpeed }; + } + else + rangeModifiers = new int[1] { 0 }; + } + + var projectileArgs = new ProjectileArgs + { + Weapon = weapon, + Facing = facing.Value, + CurrentMuzzleFacing = () => facing.Value, + + DamageModifiers = Array.Empty(), + + InaccuracyModifiers = Array.Empty(), + + RangeModifiers = rangeModifiers, + Source = epicenter, + CurrentSource = () => epicenter, + SourceActor = self, + GuidedTarget = target, + PassiveTarget = target.CenterPosition + }; + + if (projectileArgs.Weapon.Projectile != null) + { + var projectile = projectileArgs.Weapon.Projectile.Create(projectileArgs); + if (projectile != null) + world.AddFrameEndTask(w => w.Add(projectile)); + } + + if (weapon.Report != null && weapon.Report.Length > 0) + { + if (!self.World.ShroudObscures(epicenter) && !self.World.FogObscures(epicenter)) + Game.Sound.Play(SoundType.World, weapon.Report, world, epicenter); + } + } + } +} diff --git a/OpenRA.Mods.CA/Traits/SpawnRandomActorOnDeath.cs b/OpenRA.Mods.CA/Traits/SpawnRandomActorOnDeath.cs index d04592657d..0f0cf759b2 100644 --- a/OpenRA.Mods.CA/Traits/SpawnRandomActorOnDeath.cs +++ b/OpenRA.Mods.CA/Traits/SpawnRandomActorOnDeath.cs @@ -1,11 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion diff --git a/OpenRA.Mods.CA/Traits/SpawnedExplodes.cs b/OpenRA.Mods.CA/Traits/SpawnedExplodes.cs index 714f9a2d13..2571209e5c 100644 --- a/OpenRA.Mods.CA/Traits/SpawnedExplodes.cs +++ b/OpenRA.Mods.CA/Traits/SpawnedExplodes.cs @@ -1,10 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -16,7 +16,7 @@ namespace OpenRA.Mods.CA.Traits { [Desc("This actor explodes when killed and the kill XP goes to the Spawner.")] - public class SpawnedExplodesInfo : ExplodesInfo + public class SpawnedExplodesInfo : FireWarheadsOnDeathInfo { public override object Create(ActorInitializer init) { return new SpawnedExplodes(this, init.Self); } } @@ -54,10 +54,10 @@ void INotifyKilled.Killed(Actor self, AttackInfo e) if (weapon == null) return; - if (weapon.Report != null && weapon.Report.Any()) + if (weapon.Report != null && weapon.Report.Length > 0) Game.Sound.Play(SoundType.World, weapon.Report.Random(self.World.SharedRandom), self.CenterPosition); - var spawner = self.Trait().Master; + var spawner = self.Trait().Master ?? self; var args = new ProjectileArgs { diff --git a/OpenRA.Mods.CA/Traits/SpawnerMasterBase.cs b/OpenRA.Mods.CA/Traits/SpawnerMasterBase.cs new file mode 100644 index 0000000000..1b873625fd --- /dev/null +++ b/OpenRA.Mods.CA/Traits/SpawnerMasterBase.cs @@ -0,0 +1,337 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Linq; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + // What to do when master is killed or mind controlled + public enum SpawnerSlaveDisposal + { + DoNothing, + KillSlaves, + GiveSlavesToAttacker + } + + public class SpawnerSlaveBaseEntry + { + public string ActorName = null; + public Actor Actor = null; + public SpawnerSlaveBase SpawnerSlave = null; + public bool IsLaunched; + + public bool IsValid { get { return Actor != null && !Actor.IsDead; } } + } + + [Desc("This actor can spawn actors.")] + public abstract class SpawnerMasterBaseInfo : PausableConditionalTraitInfo + { + [Desc("Spawn these units. Define this like paradrop support power.")] + public readonly string[] Actors; + + [Desc("Slave actors to contain upon creation. Set to -1 to start with full slaves.")] + public readonly int InitialActorCount = -1; + + [Desc("Name of the armaments that grant this condition.")] + public readonly HashSet ArmamentNames = new HashSet() { "primary" }; + + [Desc("What happens to the slaves when the master is killed?")] + public readonly SpawnerSlaveDisposal SlaveDisposalOnKill = SpawnerSlaveDisposal.KillSlaves; + + [Desc("What happens to the slaves when the master is mind controlled?")] + public readonly SpawnerSlaveDisposal SlaveDisposalOnOwnerChange = SpawnerSlaveDisposal.GiveSlavesToAttacker; + + [Desc("Only spawn initial load of slaves?")] + public readonly bool NoRegeneration = false; + + [Desc("Spawn all slaves at once when regenerating slaves, instead of one by one?")] + public readonly bool SpawnAllAtOnce = false; + + [Desc("Spawn regen delay, in ticks")] + public readonly int RespawnTicks = 150; + + public override void RulesetLoaded(Ruleset rules, ActorInfo ai) + { + base.RulesetLoaded(rules, ai); + + if (Actors == null || Actors.Length == 0) + throw new YamlException($"Actors is null or empty for a spawner trait in actor type {ai.Name}!"); + + if (InitialActorCount > Actors.Length) + throw new YamlException($"InitialActorCount can't be larger than the actors defined! (Actor type = {ai.Name})"); + + if (InitialActorCount < -1) + throw new YamlException($"InitialActorCount must be -1 or non-negative. Actor type = {ai.Name}"); + } + + public abstract override object Create(ActorInitializer init); + } + + public abstract class SpawnerMasterBase : PausableConditionalTrait, INotifyKilled, INotifyOwnerChanged, INotifyActorDisposing + { + readonly Actor self; + + protected IFacing facing; + + protected IReloadModifier[] reloadModifiers; + + public readonly SpawnerSlaveBaseEntry[] SlaveEntries; + + int nextExitIndex = 0; + + public SpawnerMasterBase(ActorInitializer init, SpawnerMasterBaseInfo info) + : base(info) + { + self = init.Self; + + // Initialize slave entries (doesn't instantiate the slaves yet) + SlaveEntries = CreateSlaveEntries(info); + + for (var i = 0; i < info.Actors.Length; i++) + { + var entry = SlaveEntries[i]; + entry.ActorName = info.Actors[i].ToLowerInvariant(); + } + } + + public virtual SpawnerSlaveBaseEntry[] CreateSlaveEntries(SpawnerMasterBaseInfo info) + { + var slaveEntries = new SpawnerSlaveBaseEntry[info.Actors.Length]; + + for (var i = 0; i < slaveEntries.Length; i++) + slaveEntries[i] = new SpawnerSlaveBaseEntry(); + + return slaveEntries; + } + + protected override void Created(Actor self) + { + base.Created(self); + + facing = self.TraitOrDefault(); + + reloadModifiers = self.TraitsImplementing().ToArray(); + } + + /// + /// Replenish destoyed slaves or create new ones from nothing. + /// Follows policy defined by Info.OneShotSpawn. + /// + public void Replenish(Actor self, SpawnerSlaveBaseEntry[] slaveEntries) + { + if (Info.SpawnAllAtOnce) + { + foreach (var se in slaveEntries) + { + if (!se.IsValid) + Replenish(self, se); + } + } + else + { + var entry = SelectEntryToSpawn(slaveEntries); + + // All are alive and well. + if (entry == null) + return; + + Replenish(self, entry); + } + } + + /// + /// Replenish one slave entry. + /// + public virtual void Replenish(Actor self, SpawnerSlaveBaseEntry entry) + { + if (entry.IsValid) + throw new InvalidOperationException("Replenish must not be run on a valid entry!"); + + // Some members are missing. Create a new one. + var slave = self.World.CreateActor(false, entry.ActorName, + new TypeDictionary { new OwnerInit(self.Owner) }); + + // Initialize slave entry + InitializeSlaveEntry(slave, entry); + entry.SpawnerSlave.LinkMaster(entry.Actor, self, this); + } + + /// + /// Slave entry initializer function. + /// Override this function from derived classes to initialize their own specific stuff. + /// + public virtual void InitializeSlaveEntry(Actor slave, SpawnerSlaveBaseEntry entry) + { + entry.Actor = slave; + entry.SpawnerSlave = slave.Trait(); + + if (IsTraitDisabled) + entry.SpawnerSlave.GrantMasterDisabledCondition(entry.Actor); + + if (IsTraitPaused) + entry.SpawnerSlave.GrantMasterPausedCondition(entry.Actor); + } + + protected SpawnerSlaveBaseEntry SelectEntryToSpawn(SpawnerSlaveBaseEntry[] slaveEntries) + { + // If any thing is marked dead or null, that's a candidate. + var candidates = slaveEntries.Where(m => !m.IsValid); + if (!candidates.Any()) + return null; + + return candidates.Random(self.World.SharedRandom); + } + + public virtual void OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) + { + self.World.AddFrameEndTask(w => + { + foreach (var slaveEntry in SlaveEntries) + { + if (slaveEntry.IsValid) + slaveEntry.SpawnerSlave.OnMasterOwnerChanged(slaveEntry.Actor, oldOwner, newOwner, Info.SlaveDisposalOnOwnerChange); + } + }); + } + + void INotifyActorDisposing.Disposing(Actor self) + { + foreach (var slaveEntry in SlaveEntries) + { + if (slaveEntry.IsValid) + { + var killer = self.Owner.PlayerActor.IsDead ? slaveEntry.Actor.Owner.PlayerActor : self.Owner.PlayerActor; + slaveEntry.SpawnerSlave.OnMasterKilled(slaveEntry.Actor, killer, Info.SlaveDisposalOnKill); + } + } + } + + public virtual void SpawnIntoWorld(Actor self, Actor slave, WPos centerPosition) + { + var exits = self.Exits().ToList(); + Exit exit; + + if (exits.Count == 0) + { + exit = null; + } + else + { + exit = exits[nextExitIndex % exits.Count]; + nextExitIndex = (nextExitIndex + 1) % exits.Count; + } + + SetSpawnedFacing(slave, exit); + + self.World.AddFrameEndTask(w => + { + if (self.IsDead) + return; + + var spawnOffset = exit == null ? WVec.Zero : exit.Info.SpawnOffset; + slave.Trait().SetCenterPosition(slave, centerPosition + spawnOffset); + + var location = self.World.Map.CellContaining(centerPosition + spawnOffset); + + var mv = slave.Trait(); + slave.QueueActivity(mv.ReturnToCell(slave)); + + slave.QueueActivity(mv.MoveTo(location, 2)); + + w.Add(slave); + }); + } + + protected void SetSpawnedFacing(Actor spawned, Exit exit) + { + var exitFacing = exit != null && exit.Info.Facing != null ? exit.Info.Facing : WAngle.Zero; + + SetSpawnedFacing(spawned, exitFacing.Value); + } + + protected void SetSpawnedFacing(Actor spawned, WAngle launchFacing) + { + WAngle spawnerFacing = facing == null ? WAngle.Zero : facing.Facing; + + var spawnFacing = spawned.TraitOrDefault(); + if (spawnFacing != null) + spawnFacing.Facing = launchFacing + spawnerFacing; + } + + public void StopSlaves() + { + foreach (var slaveEntry in SlaveEntries) + { + if (!slaveEntry.IsValid) + continue; + + slaveEntry.SpawnerSlave.Stop(slaveEntry.Actor); + } + } + + public virtual void OnSlaveKilled(Actor self, Actor slave) { } + + void INotifyKilled.Killed(Actor self, AttackInfo e) + { + Killed(self, e); + } + + protected virtual void Killed(Actor self, AttackInfo e) + { + // Notify slaves. + foreach (var slaveEntry in SlaveEntries) + { + if (slaveEntry.IsValid) + slaveEntry.SpawnerSlave.OnMasterKilled(slaveEntry.Actor, e.Attacker, Info.SlaveDisposalOnKill); + } + } + + protected override void TraitEnabled(Actor self) + { + foreach (var slaveEntry in SlaveEntries) + { + if (slaveEntry.IsValid) + slaveEntry.SpawnerSlave.RevokeMasterDisabledCondition(slaveEntry.Actor); + } + } + + protected override void TraitDisabled(Actor self) + { + foreach (var slaveEntry in SlaveEntries) + { + if (slaveEntry.IsValid) + slaveEntry.SpawnerSlave.GrantMasterDisabledCondition(slaveEntry.Actor); + } + } + + protected override void TraitResumed(Actor self) + { + foreach (var slaveEntry in SlaveEntries) + { + if (slaveEntry.IsValid) + slaveEntry.SpawnerSlave.RevokeMasterPausedCondition(slaveEntry.Actor); + } + } + + protected override void TraitPaused(Actor self) + { + foreach (var slaveEntry in SlaveEntries) + { + if (slaveEntry.IsValid) + slaveEntry.SpawnerSlave.GrantMasterPausedCondition(slaveEntry.Actor); + } + } + } +} diff --git a/OpenRA.Mods.CA/Traits/SpawnerSlaveBase.cs b/OpenRA.Mods.CA/Traits/SpawnerSlaveBase.cs new file mode 100644 index 0000000000..1340f3575e --- /dev/null +++ b/OpenRA.Mods.CA/Traits/SpawnerSlaveBase.cs @@ -0,0 +1,226 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Linq; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Can be slaved to a SpawnerMaster.")] + public abstract class SpawnerSlaveBaseInfo : TraitInfo + { + [GrantedConditionReference] + [Desc("The condition to grant to slaves when the master actor is killed.")] + public readonly string MasterDeadCondition = null; + + [Desc("Can these actors be mind controlled or captured?")] + public readonly bool AllowOwnerChange = false; + + [Desc("Types of damage this actor explodes with due to an unallowed slave action. Leave empty for no damage types.")] + public readonly BitSet DamageTypes = default(BitSet); + + [GrantedConditionReference] + [Desc("The condition to grant when the master trait is disabled.")] + public readonly string GrantConditionWhenMasterIsDisabled = null; + + [GrantedConditionReference] + [Desc("The condition to grant when the master trait is paused.")] + public readonly string GrantConditionWhenMasterIsPaused = null; + + public abstract override object Create(ActorInitializer init); + } + + public abstract class SpawnerSlaveBase : INotifyCreated, INotifyKilled, INotifyOwnerChanged + { + protected AttackBase[] attackBases; + + readonly SpawnerSlaveBaseInfo info; + + public bool HasFreeWill = false; + + SpawnerMasterBase spawnerMaster = null; + + public Actor Master { get; private set; } + + // Make this actor attack a target. + Target lastTarget; + + int masterTraitDisabledConditionToken = Actor.InvalidConditionToken; + int masterTraitPausedConditionToken = Actor.InvalidConditionToken; + + public SpawnerSlaveBase(ActorInitializer init, SpawnerSlaveBaseInfo info) + { + this.info = info; + } + + void INotifyCreated.Created(Actor self) + { + Created(self); + } + + protected virtual void Created(Actor self) + { + attackBases = self.TraitsImplementing().ToArray(); + } + + void INotifyKilled.Killed(Actor self, AttackInfo e) + { + if (Master == null || Master.IsDead) + return; + + spawnerMaster.OnSlaveKilled(Master, self); + } + + public virtual void LinkMaster(Actor self, Actor master, SpawnerMasterBase spawnerMaster) + { + Master = master; + this.spawnerMaster = spawnerMaster; + } + + bool TargetSwitched(Target lastTarget, Target newTarget) + { + if (newTarget.Type != lastTarget.Type) + return true; + + if (newTarget.Type == TargetType.Terrain) + return newTarget.CenterPosition != lastTarget.CenterPosition; + + if (newTarget.Type == TargetType.Actor) + return lastTarget.Actor != newTarget.Actor; + + return false; + } + + // Stop what self was doing. + public virtual void Stop(Actor self) + { + // Drop the target so that Attack() feels the need to assign target for this slave. + lastTarget = Target.Invalid; + + self.CancelActivity(); + } + + public virtual void Attack(Actor self, Target target) + { + // Don't have to change target or alter current activity. + if (!TargetSwitched(lastTarget, target)) + return; + + if (!target.IsValidFor(self)) + { + Stop(self); + return; + } + + lastTarget = target; + + foreach (var ab in attackBases) + { + if (ab.IsTraitDisabled) + continue; + + ab.AttackTarget(target, AttackSource.Default, false, true, true); + } + } + + public virtual void OnMasterKilled(Actor self, Actor attacker, SpawnerSlaveDisposal disposal) + { + if (self.IsDead) + return; + + if (attacker.IsDead || attacker.WillDispose) + attacker = self; + + // Grant MasterDead condition. + self.GrantCondition(info.MasterDeadCondition); + + switch (disposal) + { + case SpawnerSlaveDisposal.KillSlaves: + self.Kill(attacker, info.DamageTypes); + break; + case SpawnerSlaveDisposal.GiveSlavesToAttacker: + self.CancelActivity(); + self.ChangeOwner(attacker.Owner); + break; + case SpawnerSlaveDisposal.DoNothing: + // fall through + default: + break; + } + } + + // What if the master gets mind controlled? + public virtual void OnMasterOwnerChanged(Actor self, Player oldOwner, Player newOwner, SpawnerSlaveDisposal disposal) + { + switch (disposal) + { + case SpawnerSlaveDisposal.KillSlaves: + self.Kill(self, info.DamageTypes); + break; + case SpawnerSlaveDisposal.GiveSlavesToAttacker: + self.CancelActivity(); + self.ChangeOwner(newOwner); + break; + case SpawnerSlaveDisposal.DoNothing: + // fall through + default: + break; + } + } + + // What if the slave gets mind controlled? + // Slaves aren't good without master so, kill it. + void INotifyOwnerChanged.OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) + { + // In this case, the slave will be disposed, one way or other. + if (Master == null || !Master.IsDead) + return; + + // This function got triggered because the master got mind controlled and + // thus triggered slave.ChangeOwner(). + // In this case, do nothing. + if (Master.Owner == newOwner) + return; + + // These are independent, so why not let it be controlled? + if (info.AllowOwnerChange) + return; + + self.Kill(self, info.DamageTypes); + } + + public void GrantMasterPausedCondition(Actor self) + { + if (masterTraitPausedConditionToken == Actor.InvalidConditionToken) + masterTraitPausedConditionToken = self.GrantCondition(info.GrantConditionWhenMasterIsPaused); + } + + public void RevokeMasterPausedCondition(Actor self) + { + if (masterTraitPausedConditionToken != Actor.InvalidConditionToken) + masterTraitPausedConditionToken = self.RevokeCondition(masterTraitPausedConditionToken); + } + + public void GrantMasterDisabledCondition(Actor self) + { + if (masterTraitDisabledConditionToken == Actor.InvalidConditionToken) + masterTraitDisabledConditionToken = self.GrantCondition(info.GrantConditionWhenMasterIsDisabled); + } + + public void RevokeMasterDisabledCondition(Actor self) + { + if (masterTraitDisabledConditionToken != Actor.InvalidConditionToken) + masterTraitDisabledConditionToken = self.RevokeCondition(masterTraitDisabledConditionToken); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/SquadPathOverlay.cs b/OpenRA.Mods.CA/Traits/SquadPathOverlay.cs new file mode 100644 index 0000000000..2863c09b16 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/SquadPathOverlay.cs @@ -0,0 +1,143 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.Graphics; +using OpenRA.Mods.CA.Traits.BotModules.Squads; +using OpenRA.Mods.Common.Commands; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [TraitLocation(SystemActors.World)] + [Desc("Renders a debug overlay showing the pathfinding routes of AI squads. Attach this to the world actor.")] + public class SquadPathOverlayInfo : TraitInfo + { + public Color[] RouteColors = new[] { Color.DeepPink, Color.Cyan, Color.Lime, Color.Yellow, Color.Orange, Color.Red, Color.White, Color.CornflowerBlue, Color.MediumPurple, Color.Tomato, Color.Sienna }; + + public override object Create(ActorInitializer init) { return new SquadPathOverlay(this); } + } + + public class SquadPathOverlay : IRenderAnnotations, IWorldLoaded, IChatCommand + { + readonly Color[] routeColors; + int currentColorIndex = 0; + + const string CommandName = "squadpaths"; + + [FluentReference] + const string CommandDescription = "description-squadpaths-debug-overlay"; + + public bool Enabled { get; private set; } + + public SquadPathOverlay(SquadPathOverlayInfo info) + { + routeColors = info.RouteColors; + } + + void IWorldLoaded.WorldLoaded(World w, WorldRenderer wr) + { + var console = w.WorldActor.TraitOrDefault(); + var help = w.WorldActor.TraitOrDefault(); + + if (console == null || help == null) + return; + + console.RegisterCommand(CommandName, this); + help.RegisterHelp(CommandName, CommandDescription); + } + + void IChatCommand.InvokeCommand(string name, string arg) + { + if (name == CommandName) + Enabled ^= true; + } + + IEnumerable IRenderAnnotations.RenderAnnotations(Actor self, WorldRenderer wr) + { + if (!Enabled) + yield break; + + // Find all bot players with squad managers + var squadManagers = self.World.Players + .Where(p => p.IsBot) + .Select(p => p.PlayerActor.TraitsImplementing().FirstOrDefault(t => !t.IsTraitDisabled)) + .Where(sm => sm != null); + + // Cycle through the colors + + currentColorIndex = 0; + + foreach (var squadManager in squadManagers) + { + var playerColor = squadManager.Player.Color; + + //currentColorIndex = currentColorIndex % routeColors.Length; + //var routeColor = routeColors[currentColorIndex]; + + var routeColor = playerColor; + var altRouteColor = Color.FromArgb(32, + routeColor.R, + routeColor.G, + routeColor.B); + + foreach (var squad in squadManager.Squads) + { + // Get route information from the state if it's GroundUnitsAttackMoveStateCA + var routeInfo = (squad.FuzzyStateMachine.CurrentState as GroundUnitsAttackMoveStateCA)?.GetRouteInfo(); + if (routeInfo?.CurrentRoute == null) + continue; + + // Render the current route in pink + if (routeInfo.CurrentRoute.Count >= 2) + { + var prev = self.World.Map.CenterOfCell(routeInfo.CurrentRoute[0]); + for (var i = 1; i < routeInfo.CurrentRoute.Count; i++) + { + var pos = self.World.Map.CenterOfCell(routeInfo.CurrentRoute[i]); + var targetLine = new[] { prev, pos }; + prev = pos; + yield return new TargetLineRenderable(targetLine, routeColor, 2, 2); + } + } + + foreach (var route in routeInfo.AlternativeRoutes) + { + if (route.Count < 2) + continue; + + var prev = self.World.Map.CenterOfCell(route[0]); + for (var i = 1; i < route.Count; i++) + { + var pos = self.World.Map.CenterOfCell(route[i]); + var targetLine = new[] { prev, pos }; + prev = pos; + yield return new TargetLineRenderable(targetLine, altRouteColor, 2, 2); + } + } + + + // Render current waypoint marker + if (routeInfo.CurrentWaypointIndex < routeInfo.CurrentRoute.Count) + { + var waypoint = routeInfo.CurrentRoute[routeInfo.CurrentWaypointIndex]; + yield return new MarkerTileRenderable(waypoint, routeColor); + } + + currentColorIndex++; + } + } + } + + bool IRenderAnnotations.SpatiallyPartitionable => false; + } +} diff --git a/OpenRA.Mods.CA/Traits/StoresPlayerResourcesCA.cs b/OpenRA.Mods.CA/Traits/StoresPlayerResourcesCA.cs new file mode 100644 index 0000000000..9fed01be57 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/StoresPlayerResourcesCA.cs @@ -0,0 +1,74 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Adds capacity to a player's harvested resource limit.")] + public class StoresPlayerResourcesCAInfo : TraitInfo + { + [FieldLoader.Require] + public readonly int Capacity = 0; + + public readonly bool DisableTransferFromBotOwner = false; + + public override object Create(ActorInitializer init) { return new StoresPlayerResourcesCA(init.Self, this); } + } + + public class StoresPlayerResourcesCA : INotifyOwnerChanged, INotifyCapture, INotifyKilled, INotifyAddedToWorld, INotifyRemovedFromWorld + { + readonly StoresPlayerResourcesCAInfo info; + PlayerResources player; + int storedBeforeOwnerChange; + + public int Stored => player.ResourceCapacity == 0 ? 0 : (int)((long)info.Capacity * player.Resources / player.ResourceCapacity); + + public StoresPlayerResourcesCA(Actor self, StoresPlayerResourcesCAInfo info) + { + this.info = info; + player = self.Owner.PlayerActor.Trait(); + } + + void INotifyOwnerChanged.OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) + { + storedBeforeOwnerChange = Stored; + player = newOwner.PlayerActor.Trait(); + } + + void INotifyCapture.OnCapture(Actor self, Actor captor, Player oldOwner, Player newOwner, BitSet captureTypes) + { + if (info.DisableTransferFromBotOwner && oldOwner.IsBot) + return; + + var resources = storedBeforeOwnerChange; + oldOwner.PlayerActor.Trait().TakeResources(resources); + newOwner.PlayerActor.Trait().GiveResources(resources); + } + + void INotifyKilled.Killed(Actor self, AttackInfo e) + { + // Lose the stored resources. + player.TakeResources(Stored); + } + + void INotifyAddedToWorld.AddedToWorld(Actor self) + { + player.AddStorageCapacity(info.Capacity); + } + + void INotifyRemovedFromWorld.RemovedFromWorld(Actor self) + { + player.RemoveStorageCapacity(info.Capacity); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/SupportPowers/AirReinforcementsPower.cs b/OpenRA.Mods.CA/Traits/SupportPowers/AirReinforcementsPower.cs index 64e3664b1a..960efedd01 100644 --- a/OpenRA.Mods.CA/Traits/SupportPowers/AirReinforcementsPower.cs +++ b/OpenRA.Mods.CA/Traits/SupportPowers/AirReinforcementsPower.cs @@ -1,11 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2007-2019 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -21,7 +20,7 @@ namespace OpenRA.Mods.CA.Traits { - public class AirReinforcementsPowerInfo : SupportPowerInfo + public class AirReinforcementsPowerInfo : DirectionalSupportPowerInfo { [ActorReference(typeof(AircraftInfo))] [FieldLoader.Require] @@ -39,22 +38,13 @@ public class AirReinforcementsPowerInfo : SupportPowerInfo [Desc("Amount of time to keep the camera alive after the aircraft have finished attacking")] public readonly int CameraRemoveDelay = 25; - [Desc("Enables the player directional targeting")] - public readonly bool UseDirectionalTarget = false; - - [Desc("Animation used to render the direction arrows.")] - public readonly string DirectionArrowAnimation = null; - - [Desc("Palette for direction cursor animation.")] - public readonly string DirectionArrowPalette = "chrome"; - [Desc("Weapon range offset to apply during the beacon clock calculation")] public readonly WDist BeaconDistanceOffset = WDist.FromCells(6); public override object Create(ActorInitializer init) { return new AirReinforcementsPower(init.Self, this); } } - public class AirReinforcementsPower : SupportPower + public class AirReinforcementsPower : DirectionalSupportPower { readonly AirReinforcementsPowerInfo info; @@ -64,14 +54,6 @@ public AirReinforcementsPower(Actor self, AirReinforcementsPowerInfo info) this.info = info; } - public override void SelectTarget(Actor self, string order, SupportPowerManager manager) - { - if (info.UseDirectionalTarget) - self.World.OrderGenerator = new SelectDirectionalTarget(self.World, order, manager, Info.Cursor, info.DirectionArrowAnimation, info.DirectionArrowPalette); - else - base.SelectTarget(self, order, manager); - } - public override void Activate(Actor self, Order order, SupportPowerManager manager) { base.Activate(self, order, manager); @@ -217,7 +199,6 @@ void RemoveCamera(Actor camera) camera.QueueActivity(new Wait(info.CameraRemoveDelay)); camera.QueueActivity(new RemoveSelf()); - camera = null; } void RemoveBeacon(Beacon beacon) @@ -225,11 +206,7 @@ void RemoveBeacon(Beacon beacon) if (beacon == null) return; - Self.World.AddFrameEndTask(w => - { - w.Remove(beacon); - beacon = null; - }); + Self.World.AddFrameEndTask(w => w.Remove(beacon)); } } } diff --git a/OpenRA.Mods.CA/Traits/SupportPowers/AirstrikePowerCA.cs b/OpenRA.Mods.CA/Traits/SupportPowers/AirstrikePowerCA.cs new file mode 100644 index 0000000000..b6abc86664 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/SupportPowers/AirstrikePowerCA.cs @@ -0,0 +1,241 @@ +#region Copyright & License Information +/* + * Copyright (c) The OpenRA Developers and Contributors + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. For more + * information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Linq; +using OpenRA.Mods.Common; +using OpenRA.Mods.Common.Traits; +using OpenRA.Mods.Common.Activities; +using OpenRA.Mods.Common.Effects; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Copy of AirstrikePowerCA but has MinDistance instead of Cordon.")] + public class AirstrikePowerCAInfo : DirectionalSupportPowerInfo + { + [ActorReference(typeof(AircraftInfo))] + public readonly string UnitType = "badr.bomber"; + public readonly int SquadSize = 1; + public readonly WVec SquadOffset = new(-1536, 1536, 0); + + public readonly int QuantizedFacings = 32; + + [Desc("Minimum distance from the target to spawn the planes.")] + public readonly WDist MinDistance = WDist.FromCells(32); + + [ActorReference] + [Desc("Actor to spawn when the aircraft start attacking")] + public readonly string CameraActor = null; + + [Desc("Amount of time to keep the camera alive after the aircraft have finished attacking")] + public readonly int CameraRemoveDelay = 25; + + [Desc("Weapon range offset to apply during the beacon clock calculation")] + public readonly WDist BeaconDistanceOffset = WDist.FromCells(6); + + public readonly WDist TargetCircleRange = WDist.Zero; + public readonly Color TargetCircleColor = Color.White; + public readonly bool TargetCircleUsePlayerColor = false; + + public override object Create(ActorInitializer init) { return new AirstrikePowerCA(init.Self, this); } + } + + public class AirstrikePowerCA : DirectionalSupportPower + { + readonly AirstrikePowerCAInfo info; + + public AirstrikePowerCA(Actor self, AirstrikePowerCAInfo info) + : base(self, info) + { + this.info = info; + } + + public override void SelectTarget(Actor self, string order, SupportPowerManager manager) + { + if (info.UseDirectionalTarget) + self.World.OrderGenerator = new SelectDirectionalTargetWithCircle(self.World, order, manager, info, + info.TargetCircleRange, info.TargetCircleColor, info.TargetCircleUsePlayerColor); + else + base.SelectTarget(self, order, manager); + } + + public override void Activate(Actor self, Order order, SupportPowerManager manager) + { + base.Activate(self, order, manager); + + var facing = info.UseDirectionalTarget && order.ExtraData != uint.MaxValue ? (WAngle?)WAngle.FromFacing((int)order.ExtraData) : null; + SendAirstrike(self, order.Target.CenterPosition, facing); + } + + public Actor[] SendAirstrike(Actor self, WPos target, WAngle? facing = null) + { + var aircraft = new List(); + if (!facing.HasValue) + facing = new WAngle(1024 * self.World.SharedRandom.Next(info.QuantizedFacings) / info.QuantizedFacings); + + var altitude = self.World.Map.Rules.Actors[info.UnitType].TraitInfo().CruiseAltitude.Length; + var attackRotation = WRot.FromYaw(facing.Value); + var delta = new WVec(0, -1024, 0).Rotate(attackRotation); + target += new WVec(0, 0, altitude); + + var distanceFromStartEdgeToTarget = self.World.Map.DistanceToEdge(target, -delta); + var extraDistanceToMeetMinimum = info.MinDistance > distanceFromStartEdgeToTarget ? info.MinDistance - distanceFromStartEdgeToTarget : WDist.Zero; + + var startEdge = target - (distanceFromStartEdgeToTarget + WDist.FromCells(1) + extraDistanceToMeetMinimum).Length * delta / 1024; + var finishEdge = target + (self.World.Map.DistanceToEdge(target, delta) + WDist.FromCells(5)).Length * delta / 1024; + + Actor camera = null; + Beacon beacon = null; + var aircraftInRange = new Dictionary(); + + void OnEnterRange(Actor a) + { + // Spawn a camera and remove the beacon when the first plane enters the target area + if (info.CameraActor != null && camera == null && !aircraftInRange.Any(kv => kv.Value)) + { + self.World.AddFrameEndTask(w => + { + camera = w.CreateActor(info.CameraActor, new TypeDictionary + { + new LocationInit(self.World.Map.CellContaining(target)), + new OwnerInit(self.Owner), + }); + }); + } + + RemoveBeacon(beacon); + + aircraftInRange[a] = true; + } + + void OnExitRange(Actor a) + { + aircraftInRange[a] = false; + + // Remove the camera when the final plane leaves the target area + if (!aircraftInRange.Any(kv => kv.Value)) + RemoveCamera(camera); + } + + void OnRemovedFromWorld(Actor a) + { + aircraftInRange[a] = false; + + // Checking for attack range is not relevant here because + // aircraft may be shot down before entering the range. + // If at the map's edge, they may be removed from world before leaving. + if (aircraftInRange.All(kv => !kv.Key.IsInWorld)) + { + RemoveCamera(camera); + RemoveBeacon(beacon); + } + } + + // Create the actors immediately so they can be returned + for (var i = -info.SquadSize / 2; i <= info.SquadSize / 2; i++) + { + // Even-sized squads skip the lead plane + if (i == 0 && (info.SquadSize & 1) == 0) + continue; + + // Includes the 90 degree rotation between body and world coordinates + var so = info.SquadOffset; + var spawnOffset = new WVec(i * so.Y, -Math.Abs(i) * so.X, 0).Rotate(attackRotation); + var targetOffset = new WVec(i * so.Y, 0, 0).Rotate(attackRotation); + var a = self.World.CreateActor(false, info.UnitType, new TypeDictionary + { + new CenterPositionInit(startEdge + spawnOffset), + new OwnerInit(self.Owner), + new FacingInit(facing.Value), + }); + + aircraft.Add(a); + aircraftInRange.Add(a, false); + + var attack = a.Trait(); + attack.SetTarget(target + targetOffset); + attack.OnEnteredAttackRange += OnEnterRange; + attack.OnExitedAttackRange += OnExitRange; + attack.OnRemovedFromWorld += OnRemovedFromWorld; + } + + self.World.AddFrameEndTask(w => + { + PlayLaunchSounds(); + + var j = 0; + Actor distanceTestActor = null; + for (var i = -info.SquadSize / 2; i <= info.SquadSize / 2; i++) + { + // Even-sized squads skip the lead plane + if (i == 0 && (info.SquadSize & 1) == 0) + continue; + + // Includes the 90 degree rotation between body and world coordinates + var so = info.SquadOffset; + var spawnOffset = new WVec(i * so.Y, -Math.Abs(i) * so.X, 0).Rotate(attackRotation); + + var a = aircraft[j++]; + w.Add(a); + + a.QueueActivity(new Fly(a, Target.FromPos(target + spawnOffset))); + a.QueueActivity(new Fly(a, Target.FromPos(finishEdge + spawnOffset))); + a.QueueActivity(new RemoveSelf()); + distanceTestActor = a; + } + + if (Info.DisplayBeacon) + { + var distance = (target - startEdge).HorizontalLength; + + beacon = new Beacon( + self.Owner, + target - new WVec(0, 0, altitude), + Info.BeaconPaletteIsPlayerPalette, + Info.BeaconPalette, + Info.BeaconImage, + Info.BeaconPoster, + Info.BeaconPosterPalette, + Info.BeaconSequence, + Info.ArrowSequence, + Info.CircleSequence, + Info.ClockSequence, + () => 1 - ((distanceTestActor.CenterPosition - target).HorizontalLength - info.BeaconDistanceOffset.Length) * 1f / distance, + Info.BeaconDelay); + + w.Add(beacon); + } + }); + + return aircraft.ToArray(); + } + + void RemoveCamera(Actor camera) + { + if (camera == null) + return; + + camera.QueueActivity(new Wait(info.CameraRemoveDelay)); + camera.QueueActivity(new RemoveSelf()); + } + + void RemoveBeacon(Beacon beacon) + { + if (beacon == null) + return; + + Self.World.AddFrameEndTask(w => w.Remove(beacon)); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/SupportPowers/AttackOrderPowerCA.cs b/OpenRA.Mods.CA/Traits/SupportPowers/AttackOrderPowerCA.cs new file mode 100644 index 0000000000..2286c6a79e --- /dev/null +++ b/OpenRA.Mods.CA/Traits/SupportPowers/AttackOrderPowerCA.cs @@ -0,0 +1,274 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Linq; +using OpenRA.Graphics; +using OpenRA.Mods.Common.Effects; +using OpenRA.Mods.Common.Graphics; +using OpenRA.Mods.Common.Orders; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Copy of AttackOrderPower but allows target radius indicator.")] + public class AttackOrderPowerCAInfo : SupportPowerInfo, Requires + { + [Desc("Range circle color.")] + public readonly Color CircleColor = Color.Red; + + [Desc("Range circle line width.")] + public readonly float CircleWidth = 1; + + [Desc("Range circle border color.")] + public readonly Color CircleBorderColor = Color.FromArgb(96, Color.Black); + + [Desc("Range circle border width.")] + public readonly float CircleBorderWidth = 3; + + public readonly WDist TargetCircleRadius = WDist.Zero; + public readonly Color TargetCircleColor = Color.White; + public readonly bool TargetCircleUsePlayerColor = false; + + [Desc("Assume this projectile speed to determine the beacon duration.")] + public readonly WDist BeaconAssumedProjectileSpeed = WDist.FromCells(1); + + [Desc("If set, adds an extra amount of assumed distance to account for charge up or to make the beacon disappear later.")] + public readonly int BeaconAssumedLaunchDelay = 0; + + [Desc("Beacon is removed this many ticks before impact.")] + public readonly int BeaconRemoveAdvance = 0; + + [Desc("Range of cells the camera should reveal around target cell.")] + public readonly WDist CameraRange = WDist.Zero; + + [Desc("Can the camera reveal shroud generated by the `" + nameof(CreatesShroud) + "` trait?")] + public readonly bool RevealGeneratedShroud = true; + + [Desc("Reveal cells to players with these relationships only.")] + public readonly PlayerRelationship CameraRelationships = PlayerRelationship.Ally; + + [Desc("Amount of time before detonation to spawn the camera.")] + public readonly int CameraSpawnAdvance = 25; + + [Desc("Amount of time after detonation to remove the camera.")] + public readonly int CameraRemoveDelay = 25; + + public override object Create(ActorInitializer init) { return new AttackOrderPowerCA(init.Self, this); } + } + + public class AttackOrderPowerCA : SupportPower, INotifyCreated, INotifyBurstComplete + { + readonly AttackOrderPowerCAInfo info; + AttackBase attack; + + int beaconActivationTick; + + public AttackOrderPowerCA(Actor self, AttackOrderPowerCAInfo info) + : base(self, info) + { + this.info = info; + } + + public override void SelectTarget(Actor self, string order, SupportPowerManager manager) + { + self.World.OrderGenerator = new SelectAttackOrderPowerCATarget(self, order, manager, info.Cursor, MouseButton.Left, attack, this); + } + + public override SupportPowerInstance CreateInstance(string key, SupportPowerManager manager) + { + return new SupportPowerInstanceCA(key, Info, manager); + } + + public override void Activate(Actor self, Order order, SupportPowerManager manager) + { + base.Activate(self, order, manager); + PlayLaunchSounds(); + + attack.AttackTarget(order.Target, AttackSource.Default, false, false, true); + + var distance = (order.Target.CenterPosition - self.CenterPosition).HorizontalLength; + beaconActivationTick = self.World.WorldTick; + var assumedSpeed = info.BeaconAssumedProjectileSpeed.Length; + var flightDuration = distance / assumedSpeed + info.BeaconAssumedLaunchDelay; + + if (Info.DisplayBeacon) + { + Beacon beacon = null; + + beacon = new Beacon( + self.Owner, + order.Target.CenterPosition, + Info.BeaconPaletteIsPlayerPalette, + Info.BeaconPalette, + Info.BeaconImage, + Info.BeaconPoster, + Info.BeaconPosterPalette, + Info.BeaconSequence, + Info.ArrowSequence, + Info.CircleSequence, + Info.ClockSequence, + () => + { + var ticksElapsed = self.World.WorldTick - beaconActivationTick; + if (ticksElapsed >= flightDuration - info.BeaconRemoveAdvance) + { + RemoveBeacon(beacon); + return 1f; + } + return (float)ticksElapsed / flightDuration; + }, + Info.BeaconDelay); + + self.World.Add(beacon); + } + + if (info.CameraRange != WDist.Zero) + { + var type = info.RevealGeneratedShroud ? Shroud.SourceType.Visibility + : Shroud.SourceType.PassiveVisibility; + + self.World.AddFrameEndTask(w => w.Add(new RevealShroudEffect(order.Target.CenterPosition, info.CameraRange, type, self.Owner, info.CameraRelationships, + Math.Max(flightDuration - info.CameraSpawnAdvance, 0), info.CameraSpawnAdvance + info.CameraRemoveDelay))); + } + } + + void RemoveBeacon(Beacon beacon) + { + if (beacon == null) + return; + + Self.World.AddFrameEndTask(w => w.Remove(beacon)); + } + + protected override void Created(Actor self) + { + attack = self.Trait(); + + base.Created(self); + } + + void INotifyBurstComplete.FiredBurst(Actor self, in Target target, Armament a) + { + self.World.IssueOrder(new Order("Stop", self, false)); + } + } + + public class SelectAttackOrderPowerCATarget : OrderGenerator + { + readonly SupportPowerManager manager; + readonly SupportPowerInstance instance; + readonly string order; + readonly string cursor; + readonly string cursorBlocked; + readonly MouseButton expectedButton; + readonly AttackBase attack; + readonly AttackOrderPowerCA power; + + public SelectAttackOrderPowerCATarget(Actor self, string order, SupportPowerManager manager, string cursor, MouseButton button, AttackBase attack, AttackOrderPowerCA power) + { + // Clear selection if using Left-Click Orders + if (Game.Settings.Game.UseClassicMouseStyle) + manager.Self.World.Selection.Clear(); + + instance = manager.GetPowersForActor(self).FirstOrDefault(); + this.manager = manager; + this.order = order; + this.cursor = cursor; + expectedButton = button; + this.attack = attack; + this.power = power; + cursorBlocked = cursor + "-blocked"; + } + + bool IsValidTarget(World world, CPos cell) + { + if (instance == null) + return false; + + var pos = world.Map.CenterOfCell(cell); + var range = attack.GetMaximumRange().LengthSquared; + var minRange = attack.GetMinimumRange().LengthSquared; + + return world.Map.Contains(cell) && instance.Instances.Any(a => !a.IsTraitPaused + && (a.Self.CenterPosition - pos).HorizontalLengthSquared < range + && (a.Self.CenterPosition - pos).HorizontalLengthSquared >= minRange); + } + + protected override IEnumerable OrderInner(World world, CPos cell, int2 worldPixel, MouseInput mi) + { + world.CancelInputMode(); + if (mi.Button == expectedButton && IsValidTarget(world, cell)) + yield return new Order(order, manager.Self, Target.FromCell(world, cell), false) + { + SuppressVisualFeedback = true + }; + } + + protected override void Tick(World world) + { + // Cancel the OG if we can't use the power + if (!manager.Powers.TryGetValue(order, out var p) || !p.Active || !p.Ready) + world.CancelInputMode(); + } + + protected override IEnumerable Render(WorldRenderer wr, World world) { yield break; } + protected override IEnumerable RenderAboveShroud(WorldRenderer wr, World world) { yield break; } + + protected override IEnumerable RenderAnnotations(WorldRenderer wr, World world) + { + if (instance == null) + yield break; + + var info = instance.Info as AttackOrderPowerCAInfo; + + foreach (var a in instance.Instances.Where(i => !i.IsTraitPaused)) + { + yield return new RangeCircleAnnotationRenderable( + a.Self.CenterPosition, + attack.GetMinimumRange(), + 0, + info.CircleColor, + info.CircleWidth, + info.CircleBorderColor, + info.CircleBorderWidth); + + yield return new RangeCircleAnnotationRenderable( + a.Self.CenterPosition, + attack.GetMaximumRange(), + 0, + info.CircleColor, + info.CircleWidth, + info.CircleBorderColor, + info.CircleBorderWidth); + } + + if (info.TargetCircleRadius > WDist.Zero) + { + var xy = wr.Viewport.ViewToWorld(Viewport.LastMousePos); + + yield return new RangeCircleAnnotationRenderable( + world.Map.CenterOfCell(xy), + info.TargetCircleRadius, + 0, + info.TargetCircleUsePlayerColor ? power.Self.OwnerColor() : info.TargetCircleColor, 1, + Color.FromArgb(96, Color.Black), 3); + } + } + + protected override string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi) + { + return IsValidTarget(world, cell) ? cursor : cursorBlocked; + } + } +} diff --git a/OpenRA.Mods.CA/Traits/SupportPowers/CashHackPower.cs b/OpenRA.Mods.CA/Traits/SupportPowers/CashHackPower.cs index ab1cdefa4c..8560880346 100644 --- a/OpenRA.Mods.CA/Traits/SupportPowers/CashHackPower.cs +++ b/OpenRA.Mods.CA/Traits/SupportPowers/CashHackPower.cs @@ -1,11 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2007-2019 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -14,7 +13,6 @@ using System.Linq; using OpenRA.Graphics; using OpenRA.Mods.Common.Effects; -using OpenRA.Mods.Common.Graphics; using OpenRA.Mods.Common.Orders; using OpenRA.Mods.Common.Traits; using OpenRA.Primitives; @@ -31,7 +29,7 @@ class CashHackPowerInfo : SupportPowerInfo public readonly int Minimum = 0; [Desc("Should visibility (Shroud, Fog, Cloak, etc) be considered when searching for hackable targets?")] - public readonly bool CheckHackTargetForVisibility = true; + public readonly bool RequireVisibleTarget = true; [Desc("Maximum amount of funds which will be stolen.")] public readonly int Maximum = int.MaxValue; @@ -42,9 +40,6 @@ class CashHackPowerInfo : SupportPowerInfo [Desc("Sound to instantly play at the targeted area.")] public readonly string OnFireSound = null; - [Desc("Cursor to display when unable to Cash Hack.")] - public readonly string BlockedCursor = "move-blocked"; - [NotificationReference("Speech")] [Desc("Sound the victim will hear when they get robbed.")] public readonly string Notification = null; @@ -79,7 +74,7 @@ public override void Activate(Actor self, Order order, SupportPowerManager manag Game.Sound.Play(SoundType.World, info.OnFireSound, order.Target.CenterPosition); - foreach (var a in UnitsInRange(self.World.Map.CellContaining(order.Target.CenterPosition))) + foreach (var a in UnitsInRange(self.World.Map.CellContaining(order.Target.CenterPosition), true)) { var enemyResources = a.Owner.PlayerActor.Trait(); @@ -93,11 +88,11 @@ public override void Activate(Actor self, Order order, SupportPowerManager manag Game.Sound.PlayNotification(a.World.Map.Rules, a.Owner, "Speech", info.Notification, a.Owner.Faction.InternalName); if (info.ShowTicks) - self.World.AddFrameEndTask(w => w.Add(new FloatingText(a.CenterPosition, self.Owner.Color, FloatingText.FormatCashTick(toGive), 30))); + self.World.AddFrameEndTask(w => w.Add(new FloatingText(a.CenterPosition, self.OwnerColor(), FloatingText.FormatCashTick(toGive), 30))); } } - public IEnumerable UnitsInRange(CPos xy) + public IEnumerable UnitsInRange(CPos xy, bool skipVisibilityCheck = false) { var range = 0; var tiles = Self.World.Map.FindTilesInCircle(xy, range); @@ -107,7 +102,10 @@ public IEnumerable UnitsInRange(CPos xy) return units.Distinct().Where(a => { - if (a.Owner.IsAlliedWith(Self.Owner) || a.Info.TraitInfoOrDefault() == null || (info.CheckHackTargetForVisibility == true && !(a.CanBeViewedByPlayer(Self.Owner)))) + if (a.Owner.IsAlliedWith(Self.Owner) || a.Info.TraitInfoOrDefault() == null) + return false; + + if (!skipVisibilityCheck && info.RequireVisibleTarget && !a.CanBeViewedByPlayer(Self.Owner)) return false; return a.Info.TraitInfoOrDefault().ValidTypes.Contains(info.Type); diff --git a/OpenRA.Mods.CA/Traits/SupportPowers/ChronoshiftPowerCA.cs b/OpenRA.Mods.CA/Traits/SupportPowers/ChronoshiftPowerCA.cs new file mode 100644 index 0000000000..9a91503a46 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/SupportPowers/ChronoshiftPowerCA.cs @@ -0,0 +1,482 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.Graphics; +using OpenRA.Mods.Common.Effects; +using OpenRA.Mods.Common.Graphics; +using OpenRA.Mods.Common.Orders; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + sealed class ChronoshiftPowerCAInfo : SupportPowerInfo + { + [FieldLoader.Require] + [Desc("Range in which to apply condition.")] + public readonly WDist Range = WDist.Zero; + + [Desc("Maximum number of targets. Zero for no limit.")] + public readonly int MaxTargets = 0; + + [Desc("Maximum number of enemy targets. Zero for no limit (MaxTargets still applies).")] + public readonly int MaxEnemyTargets = 0; + + [Desc("If true, keeps formation of teleported units.")] + public readonly bool KeepFormation = false; + + [Desc("Maximum distance a selected unit can move away from their initial location.")] + public readonly WDist LeashRange = WDist.FromCells(15); + + [Desc("Ticks until returning after teleportation.")] + public readonly int Duration = 750; + + [Desc("Duration for enemy units. Set to zero to use same as main duration.")] + public readonly int EnemyDuration = 375; + + public readonly bool KillCargo = true; + + [Desc("Target types that cannot be targeted for chronoshifting.")] + public readonly BitSet InvalidTargetTypes = default(BitSet); + + [CursorReference] + [Desc("Cursor to display when selecting targets for the chronoshift.")] + public readonly string SelectionCursor = "chrono-select"; + + [CursorReference] + [Desc("Cursor to display when targeting an area for the chronoshift.")] + public readonly string TargetCursor = "chrono-target"; + + [CursorReference] + [Desc("Cursor to display when the targeted area is blocked.")] + public readonly string TargetBlockedCursor = "move-blocked"; + + [Desc("Font to use for target count.")] + public readonly string TargetCountFont = "Medium"; + + public readonly bool ShowSelectionBoxes = false; + public readonly Color HoverSelectionBoxColor = Color.White; + public readonly Color SelectedSelectionBoxColor = Color.Lime; + + public readonly bool ShowTargetCircle = false; + public readonly Color TargetCircleColor = Color.White; + public readonly bool TargetCircleUsePlayerColor = false; + public readonly bool ShowDestinationCircle = false; + public readonly Color DestinationCircleColor = Color.Lime; + + [Desc("Warp from sequence sprite image.")] + public readonly string WarpFromImage = null; + + [Desc("Warp from sequence.")] + [SequenceReference(nameof(WarpFromImage))] + public readonly string WarpFromSequence = null; + + [Desc("Warp to sequence sprite image.")] + public readonly string WarpToImage = null; + + [Desc("Warp to sequence.")] + [SequenceReference(nameof(WarpToImage))] + public readonly string WarpToSequence = null; + + [PaletteReference] + public readonly string WarpEffectPalette = "effect"; + + [Desc("Target tint colour.")] + public readonly Color? TargetTintColor = null; + + public override object Create(ActorInitializer init) { return new ChronoshiftPowerCA(init.Self, this); } + } + + sealed class ChronoshiftPowerCA : SupportPower, IResolveOrder + { + readonly ChronoshiftPowerCAInfo info; + readonly IList selectedActors; + uint selectionIteration; + + public ChronoshiftPowerCA(Actor self, ChronoshiftPowerCAInfo info) + : base(self, info) + { + this.info = info; + selectedActors = new List(); + selectionIteration = 0; + } + + public override void SelectTarget(Actor self, string order, SupportPowerManager manager) + { + self.World.OrderGenerator = new SelectChronoshiftTarget(Self.World, order, manager, this); + } + + public override void Activate(Actor self, Order order, SupportPowerManager manager) + { + base.Activate(self, order, manager); + PlayLaunchSounds(); + + var info = (ChronoshiftPowerCAInfo)Info; + var targetCell = self.World.Map.CellContaining(order.Target.CenterPosition); + var sourceCell = order.ExtraLocation; + var sourcePos = self.World.Map.CenterOfCell(sourceCell); + var targetDelta = targetCell - sourceCell; + + var actorsToTeleport = selectedActors.Where(a => IsValidTarget(a)); + + foreach (var actor in actorsToTeleport) + { + var cs = actor.TraitsImplementing() + .FirstEnabledConditionalTraitOrDefault(); + + if (cs == null) + continue; + + if (info.LeashRange > WDist.Zero) + { + var unitDistMoved = actor.CenterPosition - sourcePos; + if (unitDistMoved.Length > info.LeashRange.Length) + continue; + } + + var destinationCell = info.KeepFormation ? actor.Location + targetDelta : targetCell; + var duration = info.Duration; + + if (info.EnemyDuration != info.Duration && !actor.Owner.IsAlliedWith(self.Owner)) + duration = info.EnemyDuration; + + if (self.Owner.Shroud.IsExplored(targetCell)) // && cs.CanChronoshiftTo(target, targetCell) + cs.Teleport(actor, targetCell, duration, info.KillCargo, self); + } + + if (info.WarpFromImage != null && info.WarpFromSequence != null) + self.World.Add(new SpriteEffect(sourcePos, self.World, info.WarpFromImage, info.WarpFromSequence, info.WarpEffectPalette)); + + if (info.WarpToImage != null && info.WarpToSequence != null) + self.World.Add(new SpriteEffect(order.Target.CenterPosition, self.World, info.WarpToImage, info.WarpToSequence, info.WarpEffectPalette)); + } + + public IEnumerable GetTargets(CPos xy) + { + var centerPos = Self.World.Map.CenterOfCell(xy); + + var actorsInRange = Self.World.FindActorsInCircle(centerPos, info.Range) + .Where(a => IsValidTarget(a)) + .OrderBy(a => (a.CenterPosition - centerPos).LengthSquared); + + // If we have a target limit + if (info.MaxTargets > 0) + { + // If no enemy target limit, or the overall target limit is lower + if (info.MaxEnemyTargets == 0 || info.MaxTargets < info.MaxEnemyTargets) + return actorsInRange.Take(info.MaxTargets); + else + { + var targets = new List(); + var enemyTargets = 0; + + foreach (var a in actorsInRange) + { + if (info.MaxTargets > 0 && targets.Count() >= info.MaxTargets) + break; + + if (info.MaxEnemyTargets > 0) + { + var isEnemy = !a.Owner.IsAlliedWith(Self.Owner); + + if (isEnemy && enemyTargets >= info.MaxEnemyTargets) + continue; + + if (isEnemy) + enemyTargets++; + } + + targets.Add(a); + } + + return targets; + } + } + else + return actorsInRange; + } + + public bool IsValidTarget(Actor a) + { + if (a == null || !a.IsInWorld || a.IsDead) + return false; + + if (!a.TraitsImplementing().Any(cs => !cs.IsTraitDisabled)) + return false; + + var targetTypes = a.GetEnabledTargetTypes(); + if (targetTypes.Overlaps(info.InvalidTargetTypes)) + return false; + + if (!Self.Owner.Shroud.IsVisible(a.Location)) + return false; + + if (!a.CanBeViewedByPlayer(Self.Owner)) + return false; + + return true; + } + + public void ResolveOrder(Actor self, Order order) + { + if (order.OrderString == "SelectChronoshiftTargets") + { + selectedActors.Clear(); + foreach (var a in order.ExtraActors) + selectedActors.Add(a); + + selectionIteration = order.ExtraData; + } + } + + sealed class SelectChronoshiftTarget : OrderGenerator + { + readonly ChronoshiftPowerCA power; + readonly SupportPowerManager manager; + readonly string order; + + public SelectChronoshiftTarget(World world, string order, SupportPowerManager manager, ChronoshiftPowerCA power) + { + // Clear selection if using Left-Click Orders + if (Game.Settings.Game.UseClassicMouseStyle) + manager.Self.World.Selection.Clear(); + + this.manager = manager; + this.order = order; + this.power = power; + + var info = (ChronoshiftPowerCAInfo)power.Info; + } + + protected override IEnumerable OrderInner(World world, CPos cell, int2 worldPixel, MouseInput mi) + { + world.CancelInputMode(); + if (mi.Button == MouseButton.Left) + { + var newSelectionIteration = power.selectionIteration + 1; + yield return new Order("SelectChronoshiftTargets", power.Self, false, power.GetTargets(cell).ToArray()) { + ExtraData = newSelectionIteration + }; + world.OrderGenerator = new SelectDestination(world, order, manager, power, cell, newSelectionIteration); + } + + yield break; + } + + protected override void Tick(World world) + { + // Cancel the OG if we can't use the power + if (!manager.Powers.TryGetValue(order, out var p) || !p.Active || !p.Ready) + world.CancelInputMode(); + } + + protected override IEnumerable RenderAboveShroud(WorldRenderer wr, World world) { yield break; } + + protected override IEnumerable RenderAnnotations(WorldRenderer wr, World world) + { + var xy = wr.Viewport.ViewToWorld(Viewport.LastMousePos); + var targetUnits = power.GetTargets(xy); + + if (power.info.ShowSelectionBoxes) + { + foreach (var unit in targetUnits) + { + var decorations = unit.TraitsImplementing().FirstEnabledTraitOrDefault(); + if (decorations != null) + foreach (var d in decorations.RenderSelectionAnnotations(unit, wr, power.info.HoverSelectionBoxColor)) + yield return d; + } + } + + if (power.info.ShowTargetCircle) + { + yield return new RangeCircleAnnotationRenderable( + world.Map.CenterOfCell(xy), + power.info.Range, + 0, + power.info.TargetCircleUsePlayerColor ? power.Self.OwnerColor() : power.info.TargetCircleColor, + 1, + Color.FromArgb(96, Color.Black), + 3); + } + + if (power.info.MaxTargets > 0) + { + var font = Game.Renderer.Fonts[power.info.TargetCountFont]; + var color = power.info.TargetCircleColor; + var text = targetUnits.Count() + " / " + power.info.MaxTargets; + var size = font.Measure(text); + var textPos = new int2(Viewport.LastMousePos.X - (size.X / 2), Viewport.LastMousePos.Y - (size.Y * 2) - (size.Y / 3)); + yield return new UITextRenderable(font, WPos.Zero, textPos, 0, color, text); + } + } + + protected override IEnumerable Render(WorldRenderer wr, World world) + { + var xy = wr.Viewport.ViewToWorld(Viewport.LastMousePos); + + if (power.info.TargetTintColor != null) + { + var targetUnits = power.GetTargets(xy); + + foreach (var unit in targetUnits) + { + var renderables = unit.Render(wr) + .Where(r => !r.IsDecoration && r is IModifyableRenderable) + .Select(r => + { + var mr = (IModifyableRenderable)r; + var tint = new float3(power.info.TargetTintColor.Value.R, power.info.TargetTintColor.Value.G, power.info.TargetTintColor.Value.B) / 255f; + mr = mr.WithTint(tint, mr.TintModifiers | TintModifiers.ReplaceColor).WithAlpha(power.info.TargetTintColor.Value.A / 255f); + return mr; + }); + + foreach (var r in renderables) + { + yield return r; + } + } + } + } + + protected override string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi) + { + return ((ChronoshiftPowerCAInfo)power.Info).SelectionCursor; + } + } + + sealed class SelectDestination : OrderGenerator + { + readonly ChronoshiftPowerCA power; + readonly CPos sourceLocation; + readonly SupportPowerManager manager; + readonly string order; + readonly uint expectedIteration; + + public SelectDestination(World world, string order, SupportPowerManager manager, ChronoshiftPowerCA power, CPos sourceLocation, uint expectedIteration) + { + this.manager = manager; + this.order = order; + this.power = power; + this.sourceLocation = sourceLocation; + this.expectedIteration = expectedIteration; + + var info = (ChronoshiftPowerCAInfo)power.Info; + } + + protected override IEnumerable OrderInner(World world, CPos cell, int2 worldPixel, MouseInput mi) + { + if (mi.Button == MouseButton.Right) + { + world.CancelInputMode(); + yield break; + } + + var ret = OrderInner(cell).FirstOrDefault(); + if (ret == null) + yield break; + + world.CancelInputMode(); + yield return ret; + } + + IEnumerable OrderInner(CPos xy) + { + // Cannot chronoshift into unexplored location + if (IsValidDestination(xy)) + yield return new Order(order, manager.Self, Target.FromCell(manager.Self.World, xy), false) + { + ExtraLocation = sourceLocation, + SuppressVisualFeedback = true + }; + } + + protected override void Tick(World world) + { + // Cancel the OG if we can't use the power + if (!manager.Powers.TryGetValue(order, out var p) || !p.Active || !p.Ready) + world.CancelInputMode(); + + } + + protected override IEnumerable RenderAboveShroud(WorldRenderer wr, World world) + { + yield break; + } + + protected override IEnumerable RenderAnnotations(WorldRenderer wr, World world) + { + if (expectedIteration == power.selectionIteration) + { + var xy = wr.Viewport.ViewToWorld(Viewport.LastMousePos); + + foreach (var unit in power.selectedActors.Where(a => power.IsValidTarget(a))) + { + if (!unit.CanBeViewedByPlayer(manager.Self.Owner)) + continue; + + if (power.info.LeashRange > WDist.Zero) + { + var unitDistMoved = unit.CenterPosition - world.Map.CenterOfCell(sourceLocation); + if (unitDistMoved.Length > power.info.LeashRange.Length) + continue; + } + + var decorations = unit.TraitsImplementing().FirstEnabledTraitOrDefault(); + if (decorations == null) + continue; + + foreach (var d in decorations.RenderSelectionAnnotations(unit, wr, power.info.SelectedSelectionBoxColor)) + yield return d; + } + + if (power.info.ShowDestinationCircle) + { + yield return new RangeCircleAnnotationRenderable( + world.Map.CenterOfCell(xy), + power.info.Range, + 0, + power.info.TargetCircleUsePlayerColor ? power.Self.OwnerColor() : power.info.DestinationCircleColor, + 1, + Color.FromArgb(96, Color.Black), + 3); + } + } + } + + protected override IEnumerable Render(WorldRenderer wr, World world) + { + yield break; + } + + bool IsValidDestination(CPos xy) + { + var actorsToTeleport = power.selectedActors.Where(a => power.IsValidTarget(a)); + + if (!actorsToTeleport.Any()) + return false; + + if (!manager.Self.Owner.Shroud.IsExplored(xy)) + return false; + + return true; + } + + protected override string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi) + { + var powerInfo = (ChronoshiftPowerCAInfo)power.Info; + return IsValidDestination(cell) ? powerInfo.TargetCursor : powerInfo.TargetBlockedCursor; + } + } + } +} diff --git a/OpenRA.Mods.CA/Traits/SupportPowers/ClassicAirstrikePower.cs b/OpenRA.Mods.CA/Traits/SupportPowers/ClassicAirstrikePower.cs index ccb2b7c3be..8753a0dd27 100644 --- a/OpenRA.Mods.CA/Traits/SupportPowers/ClassicAirstrikePower.cs +++ b/OpenRA.Mods.CA/Traits/SupportPowers/ClassicAirstrikePower.cs @@ -1,11 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -31,12 +30,11 @@ public class ClassicAirstrikePowerSquadMember public ClassicAirstrikePowerSquadMember(MiniYamlNode yamlNode) { - UnitType = yamlNode.Key; FieldLoader.Load(this, yamlNode.Value); } } - public class ClassicAirstrikePowerInfo : SupportPowerInfo + public class ClassicAirstrikePowerInfo : DirectionalSupportPowerInfo { [FieldLoader.LoadUsing("LoadSquad")] [Desc("A list of aircraft in the squad. Each has configurable UnitType, SpawnOffset and TargetOffset.")] @@ -52,15 +50,6 @@ public class ClassicAirstrikePowerInfo : SupportPowerInfo [Desc("Amount of time to keep the camera alive after the aircraft have finished attacking")] public readonly int CameraRemoveDelay = 25; - [Desc("Enables the player directional targeting")] - public readonly bool UseDirectionalTarget = false; - - [Desc("Animation used to render the direction arrows.")] - public readonly string DirectionArrowAnimation = null; - - [Desc("Palette for direction cursor animation.")] - public readonly string DirectionArrowPalette = "chrome"; - [Desc("Weapon range offset to apply during the beacon clock calculation")] public readonly WDist BeaconDistanceOffset = WDist.FromCells(6); @@ -86,7 +75,7 @@ static object LoadSquad(MiniYaml yaml) public override object Create(ActorInitializer init) { return new ClassicAirstrikePower(init.Self, this); } } - public class ClassicAirstrikePower : SupportPower + public class ClassicAirstrikePower : DirectionalSupportPower { readonly ClassicAirstrikePowerInfo info; @@ -96,14 +85,6 @@ public ClassicAirstrikePower(Actor self, ClassicAirstrikePowerInfo info) this.info = info; } - public override void SelectTarget(Actor self, string order, SupportPowerManager manager) - { - if (info.UseDirectionalTarget) - self.World.OrderGenerator = new SelectDirectionalTarget(self.World, order, manager, Info.Cursor, info.DirectionArrowAnimation, info.DirectionArrowPalette); - else - base.SelectTarget(self, order, manager); - } - public override void Activate(Actor self, Order order, SupportPowerManager manager) { base.Activate(self, order, manager); @@ -208,7 +189,8 @@ public Actor[] SendAirstrike(Actor self, WPos target, WAngle? facing = null) actor.Trait().SetPosition(actor, startEdge + spawnOffset); w.Add(actor); - var attack = actor.Trait(); + var attack = actor.Trait(); + attack.SetTarget(self.World, targetPos + targetOffset); attack.OnEnteredAttackRange += onEnterRange; attack.OnExitedAttackRange += onExitRange; @@ -259,7 +241,6 @@ void RemoveCamera(Actor camera) camera.QueueActivity(new Wait(info.CameraRemoveDelay)); camera.QueueActivity(new RemoveSelf()); - camera = null; } void RemoveBeacon(Beacon beacon) @@ -267,11 +248,7 @@ void RemoveBeacon(Beacon beacon) if (beacon == null) return; - Self.World.AddFrameEndTask(w => - { - w.Remove(beacon); - beacon = null; - }); + Self.World.AddFrameEndTask(w => w.Remove(beacon)); } } } diff --git a/OpenRA.Mods.CA/Traits/SupportPowers/DetonateWeaponPower.cs b/OpenRA.Mods.CA/Traits/SupportPowers/DetonateWeaponPower.cs index 0727ea6e8f..8e9f6c30fe 100644 --- a/OpenRA.Mods.CA/Traits/SupportPowers/DetonateWeaponPower.cs +++ b/OpenRA.Mods.CA/Traits/SupportPowers/DetonateWeaponPower.cs @@ -1,10 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -47,6 +47,7 @@ public class DetonateWeaponPowerInfo : SupportPowerInfo, IRulesetLoaded [Desc("Amount of time after detonation to remove the camera")] public readonly int CameraRemoveDelay = 5; + [GrantedConditionReference] [Desc("A condition to apply while active.")] public readonly string ActiveCondition = null; @@ -55,12 +56,9 @@ public class DetonateWeaponPowerInfo : SupportPowerInfo, IRulesetLoaded [SequenceReference] [Desc("Sequence to play for granting actor when activated.", - "This requires the actor to have the WithSpriteBody trait or one of its derivatives.")] + "This requires the actor to have the WithSpriteBody trait or one of its derivatives.")] public readonly string Sequence = "active"; - [Desc("Duration of the condition (in ticks). Set to 0 for a permanent condition.")] - public readonly int Duration = 0; - [Desc("Altitude above terrain below which to explode. Zero effectively deactivates airburst.")] public readonly WDist AirburstAltitude = WDist.Zero; @@ -68,11 +66,14 @@ public class DetonateWeaponPowerInfo : SupportPowerInfo, IRulesetLoaded public readonly Color TargetCircleColor = Color.White; public readonly bool TargetCircleUsePlayerColor = false; - [Desc("Amount of time to keep the actor alive in ticks. Value < 0 means this actor will not remove itself.")] - public readonly int LifeTime = 250; - public WeaponInfo WeaponInfo { get; private set; } + [Desc("If true, target must not be under shroud/fog.")] + public readonly bool TargetMustBeVisible = false; + + [Desc("If true, target must be within build range of a base provider.")] + public readonly bool TargetMustBeInBuildRadius = false; + public override object Create(ActorInitializer init) { return new DetonateWeaponPower(init.Self, this); } public override void RulesetLoaded(Ruleset rules, ActorInfo ai) { @@ -85,16 +86,31 @@ public override void RulesetLoaded(Ruleset rules, ActorInfo ai) public class DetonateWeaponPower : SupportPower, ITick { public new readonly DetonateWeaponPowerInfo Info; + WithSpriteBody wsb; [Sync] int ticks; int activeToken = Actor.InvalidConditionToken; + public bool AllyBuildEnabled { get; } public DetonateWeaponPower(Actor self, DetonateWeaponPowerInfo info) : base(self, info) { Info = info; + var mapBuildRadius = self.World.WorldActor.TraitOrDefault(); + AllyBuildEnabled = mapBuildRadius != null && mapBuildRadius.AllyBuildRadiusEnabled; + } + + protected override void Created(Actor self) + { + base.Created(self); + wsb = self.TraitOrDefault(); + } + + public override SupportPowerInstance CreateInstance(string key, SupportPowerManager manager) + { + return new SupportPowerInstanceCA(key, Info, manager); } public override void Activate(Actor self, Order order, SupportPowerManager manager) @@ -105,14 +121,13 @@ public override void Activate(Actor self, Order order, SupportPowerManager manag if (!string.IsNullOrEmpty(Info.ActiveCondition) && activeToken == Actor.InvalidConditionToken) activeToken = self.GrantCondition(Info.ActiveCondition); - var wsb = self.TraitOrDefault(); if (wsb != null && wsb.DefaultAnimation.HasSequence(Info.Sequence)) wsb.PlayCustomAnimation(self, Info.Sequence); foreach (var launchpad in self.TraitsImplementing()) launchpad.Activated(self); - ticks = Info.Duration; + ticks = Info.ActivationDelay; var targetPosition = order.Target.CenterPosition + new WVec(WDist.Zero, WDist.Zero, Info.AirburstAltitude); @@ -188,7 +203,7 @@ public override void SelectTarget(Actor self, string order, SupportPowerManager self.World.OrderGenerator = new SelectDetonateWeaponPowerTarget(order, manager, this); } - float FractionComplete { get { return ticks * 1f / Info.ActivationDelay; } } + float FractionComplete { get { return 1 - ticks * 1f / Info.ActivationDelay; } } } public class SelectDetonateWeaponPowerTarget : OrderGenerator @@ -208,10 +223,38 @@ public SelectDetonateWeaponPowerTarget(string order, SupportPowerManager manager this.power = power; } + private bool TargetCellIsValid(CPos cell, World world) + { + if (power.Info.TargetMustBeVisible && !power.Self.Owner.Shroud.IsVisible(cell)) + return false; + + if (power.Info.TargetMustBeInBuildRadius) + { + var bases = world.ActorsWithTrait().Where(b => !b.Trait.IsTraitDisabled + && (b.Actor.Owner == power.Self.Owner || (power.AllyBuildEnabled && b.Actor.Owner.IsAlliedWith(power.Self.Owner)))); + + bool inRange = false; + foreach (var b in bases) + { + var buildRadius = b.Trait.Info.Range; + var dist = (world.Map.CenterOfCell(cell) - b.Actor.CenterPosition).HorizontalLengthSquared; + if (dist <= buildRadius.LengthSquared) + { + inRange = true; + break; + } + } + if (!inRange) + return false; + } + + return world.Map.Contains(cell); + } + protected override IEnumerable OrderInner(World world, CPos cell, int2 worldPixel, MouseInput mi) { world.CancelInputMode(); - if (mi.Button == MouseButton.Left && world.Map.Contains(cell)) + if (mi.Button == MouseButton.Left && TargetCellIsValid(cell, world)) yield return new Order(order, manager.Self, Target.FromCell(world, cell), false) { SuppressVisualFeedback = true }; } @@ -240,14 +283,24 @@ protected override IEnumerable RenderAnnotations(WorldRenderer wr, world.Map.CenterOfCell(xy), power.Info.TargetCircleRange, 0, - power.Info.TargetCircleUsePlayerColor ? power.Self.Owner.Color : power.Info.TargetCircleColor, 1, + power.Info.TargetCircleUsePlayerColor ? power.Self.OwnerColor() : power.Info.TargetCircleColor, 1, Color.FromArgb(96, Color.Black), 3); } + + if (power.Info.TargetMustBeInBuildRadius) + { + var bases = world.ActorsWithTrait().Where(b => !b.Trait.IsTraitDisabled + && (b.Actor.Owner == power.Self.Owner || (power.AllyBuildEnabled && b.Actor.Owner.IsAlliedWith(power.Self.Owner)))); + + foreach (var b in bases) + foreach (var r in b.Trait.RangeCircleRenderables()) + yield return r; + } } protected override string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi) { - return world.Map.Contains(cell) ? power.Info.Cursor : "generic-blocked"; + return TargetCellIsValid(cell, world) ? power.Info.Cursor : "generic-blocked"; } } } diff --git a/OpenRA.Mods.CA/Traits/SupportPowers/DropPodsPowerCA.cs b/OpenRA.Mods.CA/Traits/SupportPowers/DropPodsPowerCA.cs index 6edc42e7a1..84da9af4c7 100644 --- a/OpenRA.Mods.CA/Traits/SupportPowers/DropPodsPowerCA.cs +++ b/OpenRA.Mods.CA/Traits/SupportPowers/DropPodsPowerCA.cs @@ -1,11 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -72,7 +71,7 @@ public override void RulesetLoaded(Ruleset rules, ActorInfo ai) { var weaponToLower = (Weapon ?? string.Empty).ToLowerInvariant(); if (!rules.Weapons.TryGetValue(weaponToLower, out var weapon)) - throw new YamlException("Weapons Ruleset does not contain an entry '{0}'".F(weaponToLower)); + throw new YamlException($"Weapons Ruleset does not contain an entry '{weaponToLower}'"); WeaponInfo = weapon; diff --git a/OpenRA.Mods.CA/Traits/SupportPowers/DummyGpsPower.cs b/OpenRA.Mods.CA/Traits/SupportPowers/DummyGpsPower.cs index 64a65a766e..153c36ad45 100644 --- a/OpenRA.Mods.CA/Traits/SupportPowers/DummyGpsPower.cs +++ b/OpenRA.Mods.CA/Traits/SupportPowers/DummyGpsPower.cs @@ -1,26 +1,25 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion -using System.Collections.Generic; -using System.Linq; using OpenRA.Mods.CA.Effects; using OpenRA.Mods.Common.Traits; using OpenRA.Traits; namespace OpenRA.Mods.CA.Traits { - class DummyGpsPowerInfo : SupportPowerInfo + public class DummyGpsPowerInfo : PausableConditionalTraitInfo { - [Desc("Delay in ticks between launching and revealing the map.")] - public readonly int RevealDelay = 0; + [Desc("Delay before launching.")] + public readonly int Delay = 0; + + public readonly int AnimationDuration = 0; public readonly string DoorImage = "atek"; @@ -46,49 +45,49 @@ class DummyGpsPowerInfo : SupportPowerInfo [Desc("Custom palette is a player palette BaseName")] public readonly bool SatellitePaletteIsPlayerPalette = true; - [Desc("Requires an actor with an online `ProvidesRadar` to show GPS dots.")] - public readonly bool RequiresActiveRadar = true; - [FieldLoader.Require] [Desc("The condition to apply. Must be included in the target actor's ExternalConditions list.")] public readonly string Condition = null; + public readonly string LaunchSound = null; + + [NotificationReference("Speech")] + public readonly string LaunchSpeechNotification = null; + + public readonly string IncomingSound = null; + + [NotificationReference("Speech")] + public readonly string IncomingSpeechNotification = null; + public override object Create(ActorInitializer init) { return new DummyGpsPower(init.Self, this); } } - class DummyGpsPower : SupportPower, INotifyKilled, INotifySold, INotifyOwnerChanged + public class DummyGpsPower : PausableConditionalTrait, ITick { Actor self; readonly DummyGpsPowerInfo info; int conditionToken = Actor.InvalidConditionToken; - - protected override void Created(Actor self) - { - // Special case handling is required for the Player actor. - // Created is called before Player.PlayerActor is assigned, - // so we must query other player traits from self, knowing that - // it refers to the same actor as self.Owner.PlayerActor - var playerActor = self.Info.Name == "player" ? self : self.Owner.PlayerActor; - - base.Created(self); - } + int ticksRemaining; public DummyGpsPower(Actor self, DummyGpsPowerInfo info) - : base(self, info) + : base(info) { this.self = self; this.info = info; + ticksRemaining = info.Delay; } - public override void Charged(Actor self, string key) + void ITick.Tick(Actor self) { - self.Owner.PlayerActor.Trait().Powers[key].Activate(new Order()); + if (IsTraitDisabled || IsTraitPaused) + return; + + if (--ticksRemaining == 0) + Activate(self); } - public override void Activate(Actor self, Order order, SupportPowerManager manager) + void Activate(Actor self) { - base.Activate(self, order, manager); - self.World.AddFrameEndTask(w => { PlayLaunchSounds(); @@ -100,16 +99,16 @@ public override void Activate(Actor self, Order order, SupportPowerManager manag }); } - void INotifyKilled.Killed(Actor self, AttackInfo e) { RemoveGps(self); } - void INotifySold.Selling(Actor self) { } - void INotifySold.Sold(Actor self) { RemoveGps(self); } - - void RemoveGps(Actor self) - { - } - - void INotifyOwnerChanged.OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) + void PlayLaunchSounds() { + var renderPlayer = self.World.RenderPlayer; + var isAllied = self.Owner.IsAlliedWith(renderPlayer); + Game.Sound.Play(SoundType.UI, isAllied ? info.LaunchSound : info.IncomingSound); + + // IsAlliedWith returns true if renderPlayer is null, so we are safe here. + var toPlayer = isAllied ? renderPlayer ?? self.Owner : renderPlayer; + var speech = isAllied ? info.LaunchSpeechNotification : info.IncomingSpeechNotification; + Game.Sound.PlayNotification(self.World.Map.Rules, toPlayer, "Speech", speech, toPlayer.Faction.InternalName); } } } diff --git a/OpenRA.Mods.CA/Traits/SupportPowers/GpsRadarProvider.cs b/OpenRA.Mods.CA/Traits/SupportPowers/GpsRadarProvider.cs index 7923bc1b05..ed95a56c53 100644 --- a/OpenRA.Mods.CA/Traits/SupportPowers/GpsRadarProvider.cs +++ b/OpenRA.Mods.CA/Traits/SupportPowers/GpsRadarProvider.cs @@ -1,10 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion diff --git a/OpenRA.Mods.CA/Traits/SupportPowers/GrantExternalConditionPowerCA.cs b/OpenRA.Mods.CA/Traits/SupportPowers/GrantExternalConditionPowerCA.cs index f96884c296..9233c161fb 100644 --- a/OpenRA.Mods.CA/Traits/SupportPowers/GrantExternalConditionPowerCA.cs +++ b/OpenRA.Mods.CA/Traits/SupportPowers/GrantExternalConditionPowerCA.cs @@ -1,11 +1,10 @@ -#region Copyright & License Information -/* - * Copyright 2007-2019 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -15,6 +14,7 @@ using OpenRA.Effects; using OpenRA.GameRules; using OpenRA.Graphics; +using OpenRA.Mods.Common.Graphics; using OpenRA.Mods.Common.Orders; using OpenRA.Mods.Common.Traits; using OpenRA.Mods.Common.Traits.Render; @@ -23,7 +23,7 @@ namespace OpenRA.Mods.CA.Traits { - class GrantExternalConditionPowerCAInfo : SupportPowerInfo + public class GrantExternalConditionPowerCAInfo : SupportPowerInfo { [FieldLoader.Require] [Desc("The condition to apply. Must be included in the target actor's ExternalConditions list.")] @@ -32,61 +32,119 @@ class GrantExternalConditionPowerCAInfo : SupportPowerInfo [Desc("Duration of the condition (in ticks). Set to 0 for a permanent condition.")] public readonly int Duration = 0; - [FieldLoader.Require] - [Desc("Size of the footprint of the affected area.")] - public readonly CVec Dimensions = CVec.Zero; - - [FieldLoader.Require] - [Desc("Actual footprint. Cells marked as x will be affected.")] - public readonly string Footprint = string.Empty; - [Desc("Sound to instantly play at the targeted area.")] public readonly string OnFireSound = null; - [Desc("Player stances which condition can be applied to.")] + [Desc("Target types that condition can be applied to. Leave empty for all types.")] + public readonly BitSet ValidTargets = default; + + [Desc("Target types that condition can be applied to. Leave empty for all types.")] + public readonly BitSet InvalidTargets = default; + + [Desc("Player relationships which condition can be applied to.")] public readonly PlayerRelationship ValidRelationships = PlayerRelationship.Ally; - [SequenceReference] - [Desc("Sequence to play for granting actor when activated.", - "This requires the actor to have the WithSpriteBody trait or one of its derivatives.")] - public readonly string Sequence = "active"; + [Desc("If true, targets must be owned by the player using the support power (overrides ValidRelationships).")] + public readonly bool OwnedTargetsOnly = false; - [Desc("Cursor to display when there are no units to apply the condition in range.")] - public readonly string BlockedCursor = "move-blocked"; + [Desc("If true, targets must not be under shroud/fog.")] + public readonly bool TargetMustBeVisible = true; + + [Desc("Maximum number of targets. Zero for no limit.")] + public readonly int MaxTargets = 0; + + [Desc("Minimum targets for power to activate.")] + public readonly int MinTargets = 1; + + [Desc("If true, targets must not be under shroud/fog.")] + public readonly bool ShowTargetCount = false; + + [Desc("Font to use for target count.")] + public readonly string TargetCountFont = "Medium"; [WeaponReference] - [FieldLoader.Require] - public readonly string Weapon = ""; + [Desc("Weapon to detonate at target location.")] + public readonly string ExplosionWeapon = null; [Desc("Delay between activation and explosion")] - public readonly int ActivationDelay = 10; + public readonly int ExplosionDelay = 0; - [Desc("Altitude above terrain below which to explode. Zero effectively deactivates airburst.")] - public readonly WDist AirburstAltitude = WDist.Zero; + [SequenceReference] + [Desc("Sequence to play for granting actor when activated.", + "This requires the actor to have the WithSpriteBody trait or one of its derivatives.")] + public readonly string ActiveSequence = "active"; + [GrantedConditionReference] [Desc("A condition to apply while active.")] public readonly string ActiveCondition = null; [Desc("Duration of the Active condition (in ticks). Set to 0 for a permanent condition.")] public readonly int ActiveDuration = 50; + public readonly bool ShowSelectionBoxes = false; + public readonly Color SelectionBoxColor = Color.Red; + + public readonly bool ShowTargetCircle = false; + public readonly Color TargetCircleColor = Color.Red; + public readonly bool TargetCircleUsePlayerColor = false; + + [Desc("Target tint colour.")] + public readonly Color? TargetTintColor = null; + + [Desc("Maximum altitude of targets.")] + public readonly WDist MaxAltitude = WDist.Zero; + public WeaponInfo WeaponInfo { get; private set; } + // Circle mode only + + [Desc("Range in which to apply condition.")] + public readonly WDist Range = WDist.Zero; + + [Desc("If true, order by value, otherwise order by distance.")] + public readonly bool PrioritizeByValue = false; + + // Footprint mode only + + [Desc("Size of the footprint of the affected area.")] + public readonly CVec Dimensions = CVec.Zero; + + [Desc("Actual footprint. Cells marked as x will be affected.")] + public readonly string Footprint = string.Empty; + + public readonly string FootprintImage = "overlay"; + + [SequenceReference(nameof(FootprintImage))] + public readonly string FootprintSequence = "target-select"; + + [Desc("Prerequisites grouped together to be referenced by the Prerequisite based overrides.")] + public readonly Dictionary PrerequisiteGroupings = new(); + + [Desc("Overrides Condition based on prerequsites being met. If multiple are met, the first is used.", + "Keys can either be a single prerequisite or be a key of PrerequisiteGroupings.")] + public readonly Dictionary PrerequisiteConditions = new(); + public override object Create(ActorInitializer init) { return new GrantExternalConditionPowerCA(init.Self, this); } + public override void RulesetLoaded(Ruleset rules, ActorInfo ai) { base.RulesetLoaded(rules, ai); - WeaponInfo = rules.Weapons[Weapon.ToLowerInvariant()]; + if (ExplosionWeapon != null) + WeaponInfo = rules.Weapons[ExplosionWeapon.ToLowerInvariant()]; } } - class GrantExternalConditionPowerCA : SupportPower, ITick, ISync, INotifyCreated + public class GrantExternalConditionPowerCA : SupportPower, ITick, INotifyCreated { readonly GrantExternalConditionPowerCAInfo info; - readonly char[] footprint; int activeToken = Actor.InvalidConditionToken; IConditionTimerWatcher[] watchers; + readonly char[] footprint; + TechTree techTree; + + IEnumerable targets; + WithSpriteBody wsb; [Sync] public int Ticks { get; private set; } @@ -96,14 +154,14 @@ public GrantExternalConditionPowerCA(Actor self, GrantExternalConditionPowerCAIn { this.info = info; footprint = info.Footprint.Where(c => !char.IsWhiteSpace(c)).ToArray(); - Ticks = info.ActiveDuration; } protected override void Created(Actor self) { - watchers = self.TraitsImplementing().Where(Notifies).ToArray(); - base.Created(self); + watchers = self.TraitsImplementing().Where(Notifies).ToArray(); + techTree = self.Owner.PlayerActor.Trait(); + wsb = self.TraitOrDefault(); } public override void SelectTarget(Actor self, string order, SupportPowerManager manager) @@ -111,6 +169,16 @@ public override void SelectTarget(Actor self, string order, SupportPowerManager self.World.OrderGenerator = new SelectConditionTarget(Self.World, order, manager, this); } + public override bool Prepare(Actor self, Order order, SupportPowerManager manager) + { + targets = GetTargets(self.World.Map.CellContaining(order.Target.CenterPosition)); + + if (targets.Count() < info.MinTargets) + return false; + + return true; + } + public override void Activate(Actor self, Order order, SupportPowerManager manager) { base.Activate(self, order, manager); @@ -122,42 +190,92 @@ public override void Activate(Actor self, Order order, SupportPowerManager manag activeToken = self.GrantCondition(info.ActiveCondition); } - var wsb = self.TraitOrDefault(); - if (wsb != null && wsb.DefaultAnimation.HasSequence(info.Sequence)) - wsb.PlayCustomAnimation(self, info.Sequence); + if (wsb != null && wsb.DefaultAnimation.HasSequence(info.ActiveSequence)) + wsb.PlayCustomAnimation(self, info.ActiveSequence); Game.Sound.Play(SoundType.World, info.OnFireSound, order.Target.CenterPosition); - foreach (var a in UnitsInRange(self.World.Map.CellContaining(order.Target.CenterPosition))) + foreach (var a in targets) a.TraitsImplementing() - .FirstOrDefault(t => t.Info.Condition == info.Condition && t.CanGrantCondition(a, self)) + .FirstOrDefault(t => t.Info.Condition == Condition && t.CanGrantCondition(self)) ?.GrantCondition(a, self, info.Duration); - if (info.Weapon != null) + if (info.ExplosionWeapon != null) { - var targetPosition = order.Target.CenterPosition + new WVec(WDist.Zero, WDist.Zero, info.AirburstAltitude); + var targetPosition = order.Target.CenterPosition; Action detonateWeapon = () => self.World.AddFrameEndTask(w => info.WeaponInfo.Impact(Target.FromPos(targetPosition), self)); - self.World.AddFrameEndTask(w => w.Add(new DelayedAction(info.ActivationDelay, detonateWeapon))); + self.World.AddFrameEndTask(w => w.Add(new DelayedAction(info.ExplosionDelay, detonateWeapon))); } } - public IEnumerable UnitsInRange(CPos xy) + private IEnumerable GetTargets(CPos xy) + { + if (info.Footprint.Length > 0) + return GetTargetsInFootprint(xy); + + return GetTargetsInCircle(xy); + } + + private IEnumerable GetTargetsInCircle(CPos xy) + { + var centerPos = Self.World.Map.CenterOfCell(xy); + + var actorsInRange = Self.World.FindActorsInCircle(centerPos, info.Range) + .Where(a => IsValidTarget(a)) + .OrderByDescending(a => info.PrioritizeByValue ? a.Info.TraitInfoOrDefault()?.Cost ?? 0 : 0) + .ThenBy(a => (a.CenterPosition - centerPos).LengthSquared); + + if (info.MaxTargets > 0) + return actorsInRange.Take(info.MaxTargets); + + return actorsInRange; + } + + private IEnumerable GetTargetsInFootprint(CPos xy) { var tiles = CellsMatching(xy, footprint, info.Dimensions); - var units = new List(); + var units = new HashSet(); foreach (var t in tiles) - units.AddRange(Self.World.ActorMap.GetActorsAt(t)); + foreach (var a in Self.World.ActorMap.GetActorsAt(t)) + units.Add(a); - return units.Distinct().Where(a => - { - if (!info.ValidRelationships.HasStance(a.Owner.RelationshipWith(Self.Owner))) - return false; + return units.Where(a => IsValidTarget(a)); + } + + bool IsValidTarget(Actor a) + { + if (a.IsDead || !a.IsInWorld) + return false; + + if (!info.ValidRelationships.HasRelationship(Self.Owner.RelationshipWith(a.Owner))) + return false; + + if (info.OwnedTargetsOnly && a.Owner != Self.Owner) + return false; + + var enabledTargetTypes = a.GetEnabledTargetTypes(); + + if (!info.ValidTargets.IsEmpty && !info.ValidTargets.Overlaps(enabledTargetTypes)) + return false; + + if (!info.InvalidTargets.IsEmpty && info.InvalidTargets.Overlaps(enabledTargetTypes)) + return false; + + if (!a.TraitsImplementing().Any(t => t.Info.Condition == Condition && t.CanGrantCondition(Self))) + return false; - return a.TraitsImplementing() - .Any(t => t.Info.Condition == info.Condition && t.CanGrantCondition(a, Self)); - }); + if (info.TargetMustBeVisible && !Self.Owner.Shroud.IsVisible(a.Location)) + return false; + + if (!a.CanBeViewedByPlayer(Self.Owner)) + return false; + + if (a.CenterPosition.Z > info.MaxAltitude.Length) + return false; + + return true; } void RevokeCondition(Actor self) @@ -186,12 +304,38 @@ void ITick.Tick(Actor self) bool Notifies(IConditionTimerWatcher watcher) { return watcher.Condition == info.ActiveCondition; } + string Condition + { + get + { + if (info.PrerequisiteConditions.Any()) + { + foreach (var item in info.PrerequisiteConditions) + { + if (techTree.HasPrerequisites(GetPrerequisitesList(item.Key))) + return item.Value; + } + } + + return info.Condition; + } + } + + string[] GetPrerequisitesList(string key) + { + if (info.PrerequisiteGroupings.TryGetValue(key, out var prerequisites)) + return prerequisites; + + return new string[] { key }; + } + class SelectConditionTarget : OrderGenerator { readonly GrantExternalConditionPowerCA power; readonly char[] footprint; readonly CVec dimensions; readonly Sprite tile; + readonly float alpha; readonly SupportPowerManager manager; readonly string order; @@ -204,15 +348,22 @@ public SelectConditionTarget(World world, string order, SupportPowerManager mana this.manager = manager; this.order = order; this.power = power; - footprint = power.info.Footprint.Where(c => !char.IsWhiteSpace(c)).ToArray(); - dimensions = power.info.Dimensions; - tile = world.Map.Rules.Sequences.GetSequence("overlay", "target-select").GetSprite(0); + + if (power.info.Footprint.Length > 0) + { + footprint = power.info.Footprint.Where(c => !char.IsWhiteSpace(c)).ToArray(); + dimensions = power.info.Dimensions; + var sequence = world.Map.Sequences.GetSequence(power.info.FootprintImage, power.info.FootprintSequence); + tile = sequence.GetSprite(0); + alpha = sequence.GetAlpha(0); + } } protected override IEnumerable OrderInner(World world, CPos cell, int2 worldPixel, MouseInput mi) { world.CancelInputMode(); - if (mi.Button == MouseButton.Left && power.UnitsInRange(cell).Any()) + var targets = power.GetTargets(cell); + if (mi.Button == MouseButton.Left && targets.Count() >= power.info.MinTargets) yield return new Order(order, manager.Self, Target.FromCell(world, cell), false) { SuppressVisualFeedback = true }; } @@ -228,27 +379,84 @@ protected override void Tick(World world) protected override IEnumerable RenderAnnotations(WorldRenderer wr, World world) { var xy = wr.Viewport.ViewToWorld(Viewport.LastMousePos); - foreach (var unit in power.UnitsInRange(xy)) + var targetUnits = power.GetTargets(xy); + + if (power.info.ShowSelectionBoxes) { - var decorations = unit.TraitsImplementing().FirstEnabledTraitOrDefault(); - if (decorations != null) - foreach (var d in decorations.RenderSelectionAnnotations(unit, wr, Color.Red)) - yield return d; + foreach (var unit in targetUnits) + { + var decorations = unit.TraitsImplementing().FirstEnabledTraitOrDefault(); + if (decorations != null) + { + foreach (var d in decorations.RenderSelectionAnnotations(unit, wr, power.info.SelectionBoxColor)) + yield return d; + } + } + } + + if (power.info.ShowTargetCircle) + { + yield return new RangeCircleAnnotationRenderable( + world.Map.CenterOfCell(xy), + power.info.Range, + 0, + power.info.TargetCircleUsePlayerColor ? power.Self.OwnerColor() : power.info.TargetCircleColor, + 1, + Color.FromArgb(96, Color.Black), + 3); + } + + if (power.info.ShowTargetCount) + { + var font = Game.Renderer.Fonts[power.info.TargetCountFont]; + var color = power.info.TargetCircleColor; + var text = power.info.MaxTargets > 0 ? $"{targetUnits.Count()} / {power.info.MaxTargets}" : targetUnits.Count().ToString(); + var size = font.Measure(text); + var textPos = new int2(Viewport.LastMousePos.X - (size.X / 2), Viewport.LastMousePos.Y + size.Y + (size.Y / 3)); + yield return new UITextRenderable(font, WPos.Zero, textPos, 0, color, text); } } protected override IEnumerable Render(WorldRenderer wr, World world) { var xy = wr.Viewport.ViewToWorld(Viewport.LastMousePos); - var pal = wr.Palette(TileSet.TerrainPaletteInternalName); - foreach (var t in power.CellsMatching(xy, footprint, dimensions)) - yield return new SpriteRenderable(tile, wr.World.Map.CenterOfCell(t), WVec.Zero, -511, pal, 1f, true, true); + if (power.info.Footprint.Length > 0) + { + var pal = wr.Palette(TileSet.TerrainPaletteInternalName); + + foreach (var t in power.CellsMatching(xy, footprint, dimensions)) + yield return new SpriteRenderable(tile, wr.World.Map.CenterOfCell(t), WVec.Zero, -511, pal, 1f, alpha, float3.Ones, TintModifiers.IgnoreWorldTint, true); + } + + if (power.info.TargetTintColor != null) + { + var targetUnits = power.GetTargets(xy); + + foreach (var unit in targetUnits) + { + var renderables = unit.Render(wr) + .Where(r => !r.IsDecoration && r is IModifyableRenderable) + .Select(r => + { + var mr = (IModifyableRenderable)r; + var tint = new float3(power.info.TargetTintColor.Value.R, power.info.TargetTintColor.Value.G, power.info.TargetTintColor.Value.B) / 255f; + mr = mr.WithTint(tint, mr.TintModifiers | TintModifiers.ReplaceColor).WithAlpha(power.info.TargetTintColor.Value.A / 255f); + return mr; + }); + + foreach (var r in renderables) + { + yield return r; + } + } + } } protected override string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi) { - return power.UnitsInRange(cell).Any() ? power.info.Cursor : power.info.BlockedCursor; + var targets = power.GetTargets(cell); + return targets.Count() >= power.info.MinTargets ? power.info.Cursor : power.info.BlockedCursor; } } } diff --git a/OpenRA.Mods.CA/Traits/SupportPowers/GrantPrerequisiteChargeDrainPowerCA.cs b/OpenRA.Mods.CA/Traits/SupportPowers/GrantPrerequisiteChargeDrainPowerCA.cs index 946505be22..e410b3a7bf 100644 --- a/OpenRA.Mods.CA/Traits/SupportPowers/GrantPrerequisiteChargeDrainPowerCA.cs +++ b/OpenRA.Mods.CA/Traits/SupportPowers/GrantPrerequisiteChargeDrainPowerCA.cs @@ -1,11 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -16,7 +15,8 @@ namespace OpenRA.Mods.CA.Traits { - [Desc("Grants a prerequisite while discharging at a configurable rate.")] + [Desc("Grants a prerequisite while discharging at a configurable rate.", + "CA version adds early deactivation penalty to prevent frequent toggling.")] public class GrantPrerequisiteChargeDrainPowerCAInfo : SupportPowerInfo, ITechTreePrerequisiteInfo { [Desc("Rate at which the power discharges compared to charging")] @@ -26,15 +26,12 @@ public class GrantPrerequisiteChargeDrainPowerCAInfo : SupportPowerInfo, ITechTr [Desc("The prerequisite type that this provides.")] public readonly string Prerequisite = null; - [Translate] [Desc("Label to display over the support power icon and in its tooltip while the power is active.")] public readonly string ActiveText = "ACTIVE"; - [Translate] [Desc("Label to display over the support power icon and in its tooltip while the power is available but not active.")] public readonly string AvailableText = "READY"; - [Translate] [Desc("If deactivating the power prior to full discharge, discharge by this additional amount to prevent frequent activation/deactivation with no penalty.")] public readonly int EarlyDeactivationPenalty = 0; @@ -49,6 +46,7 @@ IEnumerable ITechTreePrerequisiteInfo.Prerequisites(ActorInfo info) public class GrantPrerequisiteChargeDrainPowerCA : SupportPower, ITechTreePrerequisite, INotifyOwnerChanged { readonly GrantPrerequisiteChargeDrainPowerCAInfo info; + readonly string[] prerequisites; TechTree techTree; bool active; @@ -56,6 +54,7 @@ public GrantPrerequisiteChargeDrainPowerCA(Actor self, GrantPrerequisiteChargeDr : base(self, info) { this.info = info; + prerequisites = new[] { info.Prerequisite }; } protected override void Created(Actor self) @@ -88,18 +87,9 @@ public void Deactivate(Actor self, SupportPowerInstance instance) techTree.ActorChanged(self); } - IEnumerable ITechTreePrerequisite.ProvidesPrerequisites - { - get - { - if (!active) - yield break; + IEnumerable ITechTreePrerequisite.ProvidesPrerequisites => active ? prerequisites : Enumerable.Empty(); - yield return info.Prerequisite; - } - } - - public class DischargeableSupportPowerInstance : SupportPowerInstance + public class DischargeableSupportPowerInstance : SupportPowerInstanceCA { // Whether the power is available to activate (even if not fully charged) bool available; @@ -112,8 +102,13 @@ public class DischargeableSupportPowerInstance : SupportPowerInstance // Additional discharge rate accrued from damage int additionalDischargeSubTicks = 0; + int dischargeModifier; + public DischargeableSupportPowerInstance(string key, GrantPrerequisiteChargeDrainPowerCAInfo info, SupportPowerManager manager) - : base(key, info, manager) { } + : base(key, info, manager) + { + dischargeModifier = info.DischargeModifier; + } void Deactivate() { @@ -147,7 +142,7 @@ public override void Tick() if (active) { - remainingSubTicks = orig + ((GrantPrerequisiteChargeDrainPowerCAInfo)Info).DischargeModifier + additionalDischargeSubTicks; + remainingSubTicks = orig + dischargeModifier + additionalDischargeSubTicks; additionalDischargeSubTicks = 0; if (remainingSubTicks > TotalTicks * 100) @@ -195,17 +190,18 @@ public override void Activate(Order order) public override string IconOverlayTextOverride() { - var info = Info as GrantPrerequisiteChargeDrainPowerCAInfo; - if (info == null || !Active) - return null; - - return active ? info.ActiveText : available ? info.AvailableText : null; + return GetTextOverride(); } public override string TooltipTimeTextOverride() { - var info = Info as GrantPrerequisiteChargeDrainPowerCAInfo; - if (info == null || !Active) + return GetTextOverride(); + } + + string GetTextOverride() + { + // NB: Info might return null if there are no instances + if (!Active || Info is not GrantPrerequisiteChargeDrainPowerCAInfo info) return null; return active ? info.ActiveText : available ? info.AvailableText : null; diff --git a/OpenRA.Mods.CA/Traits/SupportPowers/InfiltratePower.cs b/OpenRA.Mods.CA/Traits/SupportPowers/InfiltratePower.cs new file mode 100644 index 0000000000..10977cc2d1 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/SupportPowers/InfiltratePower.cs @@ -0,0 +1,151 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.Graphics; +using OpenRA.Mods.Common.Orders; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Acts like infiltrating a targeted structure.")] + public class InfiltratePowerInfo : SupportPowerInfo + { + [FieldLoader.Require] + [Desc("The `TargetTypes` from `Targetable` that can be targeted.")] + public readonly BitSet Types = default; + + [Desc("Should visibility (Shroud, Fog, Cloak, etc) be considered when searching for targets?")] + public readonly bool RequireVisibleTarget = true; + + public override object Create(ActorInitializer init) { return new InfiltratePower(init, this); } + } + + public class InfiltratePower : SupportPower + { + readonly InfiltratePowerInfo info; + + public InfiltratePower(ActorInitializer init, InfiltratePowerInfo info) + : base(init.Self, info) + { + this.info = info; + } + + public override void SelectTarget(Actor self, string order, SupportPowerManager manager) + { + self.World.OrderGenerator = new SelectInfiltrateTarget(Self.World, order, manager, this); + } + + public override void Charged(Actor self, string key) + { + base.Charged(self, key); + + self.World.AddFrameEndTask(w => + { + var info = Info as InfiltratePowerInfo; + }); + } + + public override void Activate(Actor self, Order order, SupportPowerManager manager) + { + base.Activate(self, order, manager); + PlayLaunchSounds(); + + IOrderedEnumerable targets; + + targets = UnitsInRange(self.World.Map.CellContaining(order.Target.CenterPosition), true) + .OrderByDescending(x => x.ActorID); + + foreach (var t in targets) + { + var notifiers = t.TraitsImplementing().ToArray(); + foreach (var n in notifiers) + n.Infiltrated(t, self, info.Types); + } + } + + public IEnumerable UnitsInRange(CPos xy, bool skipVisibilityCheck = false) + { + var range = 0; + var tiles = Self.World.Map.FindTilesInCircle(xy, range); + var units = new List(); + foreach (var t in tiles) + units.AddRange(Self.World.ActorMap.GetActorsAt(t)); + + return units.Distinct().Where(a => + { + if (a.Owner.IsAlliedWith(Self.Owner)) + return false; + + if (!a.GetAllTargetTypes().Overlaps(info.Types)) + return false; + + if (!skipVisibilityCheck && info.RequireVisibleTarget && !a.CanBeViewedByPlayer(Self.Owner)) + return false; + + return true; + }); + } + + class SelectInfiltrateTarget : OrderGenerator + { + readonly InfiltratePower power; + readonly SupportPowerManager manager; + readonly string order; + + public SelectInfiltrateTarget(World world, string order, SupportPowerManager manager, InfiltratePower power) + { + // Clear selection if using Left-Click Orders + if (Game.Settings.Game.UseClassicMouseStyle) + manager.Self.World.Selection.Clear(); + + this.manager = manager; + this.order = order; + this.power = power; + } + + protected override IEnumerable OrderInner(World world, CPos cell, int2 worldPixel, MouseInput mi) + { + world.CancelInputMode(); + if (mi.Button == MouseButton.Left && power.UnitsInRange(cell).Any()) + yield return new Order(order, manager.Self, Target.FromCell(world, cell), false) { SuppressVisualFeedback = true }; + } + + protected override void Tick(World world) + { + // Cancel the OG if we can't use the power + if (!manager.Powers.ContainsKey(order)) + world.CancelInputMode(); + } + + protected override IEnumerable RenderAboveShroud(WorldRenderer wr, World world) { yield break; } + + protected override IEnumerable RenderAnnotations(WorldRenderer wr, World world) + { + var xy = wr.Viewport.ViewToWorld(Viewport.LastMousePos); + foreach (var unit in power.UnitsInRange(xy)) + { + var decorations = unit.TraitsImplementing().FirstEnabledTraitOrDefault(); + foreach (var d in decorations.RenderSelectionAnnotations(unit, wr, Color.Lime)) + yield return d; + } + } + + protected override IEnumerable Render(WorldRenderer wr, World world) { yield break; } + protected override string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi) + { + return power.UnitsInRange(cell).Any() ? power.info.Cursor : power.info.BlockedCursor; + } + } + } +} diff --git a/OpenRA.Mods.CA/Traits/SupportPowers/InterceptorPower.cs b/OpenRA.Mods.CA/Traits/SupportPowers/InterceptorPower.cs index 390dfcac2d..73741ca2bf 100644 --- a/OpenRA.Mods.CA/Traits/SupportPowers/InterceptorPower.cs +++ b/OpenRA.Mods.CA/Traits/SupportPowers/InterceptorPower.cs @@ -1,11 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2007-2019 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -21,7 +20,7 @@ namespace OpenRA.Mods.CA.Traits { - public class InterceptorPowerInfo : SupportPowerInfo + public class InterceptorPowerInfo : DirectionalSupportPowerInfo { [ActorReference(typeof(AircraftInfo))] public readonly string UnitType = "yf23"; @@ -29,7 +28,9 @@ public class InterceptorPowerInfo : SupportPowerInfo public readonly WVec SquadOffset = new WVec(-1536, 1536, 0); public readonly int QuantizedFacings = 32; - public readonly WDist Cordon = new WDist(5120); + + [Desc("Minimum distance from the target to spawn the planes.")] + public readonly WDist MinDistance = WDist.FromCells(32); [ActorReference] [Desc("Actor to spawn when the aircraft start attacking")] @@ -38,24 +39,21 @@ public class InterceptorPowerInfo : SupportPowerInfo [Desc("Amount of time to keep the camera alive after the aircraft have finished attacking")] public readonly int CameraRemoveDelay = 25; - [Desc("Enables the player directional targeting")] - public readonly bool UseDirectionalTarget = false; - - [Desc("Animation used to render the direction arrows.")] - public readonly string DirectionArrowAnimation = null; - - [Desc("Palette for direction cursor animation.")] - public readonly string DirectionArrowPalette = "chrome"; - [Desc("Weapon range offset to apply during the beacon clock calculation")] public readonly WDist BeaconDistanceOffset = WDist.FromCells(6); public readonly int GuardDuration = 150; + public readonly WDist GuardRadius = WDist.FromCells(10); + + public readonly Color TargetCircleColor = Color.White; + + public readonly bool TargetCircleUsePlayerColor = false; + public override object Create(ActorInitializer init) { return new InterceptorPower(init.Self, this); } } - public class InterceptorPower : SupportPower + public class InterceptorPower : DirectionalSupportPower { readonly InterceptorPowerInfo info; @@ -68,7 +66,8 @@ public InterceptorPower(Actor self, InterceptorPowerInfo info) public override void SelectTarget(Actor self, string order, SupportPowerManager manager) { if (info.UseDirectionalTarget) - self.World.OrderGenerator = new SelectDirectionalTarget(self.World, order, manager, Info.Cursor, info.DirectionArrowAnimation, info.DirectionArrowPalette); + self.World.OrderGenerator = new SelectDirectionalTargetWithCircle(self.World, order, manager, info, + info.GuardRadius, info.TargetCircleColor, info.TargetCircleUsePlayerColor); else base.SelectTarget(self, order, manager); } @@ -82,7 +81,7 @@ public override void Activate(Actor self, Order order, SupportPowerManager manag SendAirstrike(self, order.Target.CenterPosition, facing); } - public Actor[] SendAirstrike(Actor self, WPos target, WAngle? facing = null) + public Actor[] SendAirstrike(Actor self, WPos targetPos, WAngle? facing = null) { var aircraft = new List(); if (!facing.HasValue) @@ -91,9 +90,11 @@ public Actor[] SendAirstrike(Actor self, WPos target, WAngle? facing = null) var altitude = self.World.Map.Rules.Actors[info.UnitType].TraitInfo().CruiseAltitude.Length; var attackRotation = WRot.FromYaw(facing.Value); var delta = new WVec(0, -1024, 0).Rotate(attackRotation); - target = target + new WVec(0, 0, altitude); - var startEdge = target - (self.World.Map.DistanceToEdge(target, -delta) + info.Cordon).Length * delta / 1024; - var finishEdge = target + (self.World.Map.DistanceToEdge(target, delta) + info.Cordon).Length * delta / 1024; + targetPos += new WVec(0, 0, altitude); + + var distanceFromStartEdgeToTarget = self.World.Map.DistanceToEdge(targetPos, -delta); + var extraDistanceToMeetMinimum = info.MinDistance > distanceFromStartEdgeToTarget ? info.MinDistance - distanceFromStartEdgeToTarget : WDist.Zero; + var startEdge = targetPos - (distanceFromStartEdgeToTarget + WDist.FromCells(1) + extraDistanceToMeetMinimum).Length * delta / 1024; Actor camera = null; Beacon beacon = null; @@ -108,7 +109,7 @@ public Actor[] SendAirstrike(Actor self, WPos target, WAngle? facing = null) { camera = w.CreateActor(info.CameraActor, new TypeDictionary { - new LocationInit(self.World.Map.CellContaining(target)), + new LocationInit(self.World.Map.CellContaining(targetPos)), new OwnerInit(self.Owner), }); }); @@ -149,13 +150,19 @@ public Actor[] SendAirstrike(Actor self, WPos target, WAngle? facing = null) if (i == 0 && (info.SquadSize & 1) == 0) continue; - // Includes the 90 degree rotation between body and world coordinates var so = info.SquadOffset; - var spawnOffset = new WVec(i * so.Y, -Math.Abs(i) * so.X, 0).Rotate(attackRotation); - var targetOffset = new WVec(i * so.Y, 0, 0).Rotate(attackRotation); + + // Shift target left by 4 cells to account for counterclockwise circling behavior + var loopCompensationOffset = new WVec(WDist.FromCells(4).Length, WDist.FromCells(1).Length, 0); + + // Includes the 90 degree rotation between body and world coordinates + var spawnOffset = (new WVec(i * so.Y, -Math.Abs(i) * so.X, 0) + loopCompensationOffset).Rotate(attackRotation); + var targetOffset = (new WVec(i * so.Y, 0, 0) + loopCompensationOffset).Rotate(attackRotation); + + var spawnPos = startEdge + spawnOffset; var a = self.World.CreateActor(false, info.UnitType, new TypeDictionary { - new CenterPositionInit(startEdge + spawnOffset), + new CenterPositionInit(spawnPos), new OwnerInit(self.Owner), new FacingInit(facing.Value), }); @@ -163,11 +170,11 @@ public Actor[] SendAirstrike(Actor self, WPos target, WAngle? facing = null) aircraft.Add(a); aircraftInRange.Add(a, false); - var attack = a.Trait(); - attack.SetTarget(self.World, target + targetOffset); - attack.OnEnteredAttackRange += onEnterRange; - attack.OnExitedAttackRange += onExitRange; - attack.OnRemovedFromWorld += onRemovedFromWorld; + var interceptor = a.Trait(); + interceptor.Initialize(self.World, targetPos, targetOffset, spawnPos, info.GuardRadius, info.GuardDuration); + interceptor.OnEnteredAttackRange += onEnterRange; + interceptor.OnExitedAttackRange += onExitRange; + interceptor.OnRemovedFromWorld += onRemovedFromWorld; } self.World.AddFrameEndTask(w => @@ -186,20 +193,17 @@ public Actor[] SendAirstrike(Actor self, WPos target, WAngle? facing = null) var a = aircraft[j++]; w.Add(a); - a.QueueActivity(new Fly(a, Target.FromPos(target + spawnOffset))); - a.QueueActivity(new AttackMoveActivity(a, () => new FlyIdle(a, info.GuardDuration))); - a.QueueActivity(new FlyOffMap(a)); - a.QueueActivity(new RemoveSelf()); - distanceTestActor = a; + if (distanceTestActor == null) + distanceTestActor = a; } if (Info.DisplayBeacon) { - var distance = (target - startEdge).HorizontalLength; + var distance = (targetPos - startEdge).HorizontalLength; beacon = new Beacon( self.Owner, - target - new WVec(0, 0, altitude), + targetPos - new WVec(0, 0, altitude), Info.BeaconPaletteIsPlayerPalette, Info.BeaconPalette, Info.BeaconImage, @@ -209,7 +213,7 @@ public Actor[] SendAirstrike(Actor self, WPos target, WAngle? facing = null) Info.ArrowSequence, Info.CircleSequence, Info.ClockSequence, - () => 1 - ((distanceTestActor.CenterPosition - target).HorizontalLength - info.BeaconDistanceOffset.Length) * 1f / distance, + () => 1 - ((distanceTestActor.CenterPosition - targetPos).HorizontalLength - info.BeaconDistanceOffset.Length) * 1f / distance, Info.BeaconDelay); w.Add(beacon); @@ -226,7 +230,6 @@ void RemoveCamera(Actor camera) camera.QueueActivity(new Wait(info.CameraRemoveDelay)); camera.QueueActivity(new RemoveSelf()); - camera = null; } void RemoveBeacon(Beacon beacon) @@ -234,11 +237,7 @@ void RemoveBeacon(Beacon beacon) if (beacon == null) return; - Self.World.AddFrameEndTask(w => - { - w.Remove(beacon); - beacon = null; - }); + Self.World.AddFrameEndTask(w => w.Remove(beacon)); } } } diff --git a/OpenRA.Mods.CA/Traits/SupportPowers/MeteorPower.cs b/OpenRA.Mods.CA/Traits/SupportPowers/MeteorPower.cs new file mode 100644 index 0000000000..1c564e8523 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/SupportPowers/MeteorPower.cs @@ -0,0 +1,228 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using OpenRA.GameRules; +using OpenRA.Graphics; +using OpenRA.Mods.CA.Projectiles; +using OpenRA.Mods.Common.Effects; +using OpenRA.Mods.Common.Graphics; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + public class MeteorPowerInfo : SupportPowerInfo + { + [WeaponReference] + [FieldLoader.Require] + [Desc("Weapon to use for the impact.")] + public readonly string ImpactWeapon = ""; + + [Desc("Image to use for the meteor.")] + public readonly string MeteorImage = null; + + [SequenceReference(nameof(MeteorImage))] + [Desc("Sprite sequence for the meteor.")] + public readonly string MeteorSequence = "down"; + + [Desc("Altitude offset from the target position at which the warhead should detonate.")] + public readonly WDist DetonationAltitude = WDist.Zero; + + [Desc("Should projectile be removed on detonation above ground.", + "'False' will make the meteor continue until it hits the ground and disappears (without triggering another explosion).")] + public readonly bool RemoveMeteorOnDetonation = true; + + [PaletteReference(nameof(IsPlayerPalette))] + [Desc("Palette to use for the meteor weapon image.")] + public readonly string MeteorPalette = "effect"; + + [Desc("Custom palette is a player palette BaseName.")] + public readonly bool IsPlayerPalette = false; + + [Desc("Trail animation.")] + public readonly string TrailImage = null; + + [SequenceReference(nameof(TrailImage), allowNullImage: true)] + [Desc("Loop a randomly chosen sequence of TrailImage from this list while this projectile is moving.")] + public readonly string[] TrailSequences = Array.Empty(); + + [Desc("Interval in ticks between each spawned Trail animation.")] + public readonly int TrailInterval = 1; + + [Desc("Delay in ticks until trail animation is spawned.")] + public readonly int TrailDelay = 1; + + [PaletteReference(nameof(TrailUsePlayerPalette))] + [Desc("Palette used to render the trail sequence.")] + public readonly string TrailPalette = "effect"; + + [Desc("Use the Player Palette to render the trail sequence.")] + public readonly bool TrailUsePlayerPalette = false; + + [Desc("Travel time - split equally between ascent and descent.")] + public readonly int FlightDelay = 400; + + [Desc("Visual ascent velocity in WDist / tick.")] + public readonly WDist FlightVelocity = new(512); + + [Desc("Amount of time before detonation to remove the beacon.")] + public readonly int BeaconRemoveAdvance = 25; + + [Desc("Range of cells the camera should reveal around target cell.")] + public readonly WDist CameraRange = WDist.Zero; + + [Desc("Can the camera reveal shroud generated by the `" + nameof(CreatesShroud) + "` trait?")] + public readonly bool RevealGeneratedShroud = true; + + [Desc("Reveal cells to players with these relationships only.")] + public readonly PlayerRelationship CameraRelationships = PlayerRelationship.Ally; + + [Desc("Amount of time before detonation to spawn the camera.")] + public readonly int CameraSpawnAdvance = 25; + + [Desc("Amount of time after detonation to remove the camera.")] + public readonly int CameraRemoveDelay = 25; + + [Desc("Range circle color.")] + public readonly Color CircleColor = Color.FromArgb(128, Color.Red); + + [Desc("Range circle width in pixel.")] + public readonly float CircleWidth = 1; + + [Desc("Range circle border color.")] + public readonly Color CircleBorderColor = Color.FromArgb(64, Color.Red); + + [Desc("Range circle border width in pixel.")] + public readonly float CircleBorderWidth = 3; + + [Desc("Render circles based on these distance ranges while targeting.")] + public readonly WDist[] CircleRanges = null; + + public WeaponInfo WeaponInfo { get; private set; } + + public override object Create(ActorInitializer init) { return new MeteorPower(init.Self, this); } + public override void RulesetLoaded(Ruleset rules, ActorInfo ai) + { + if (!string.IsNullOrEmpty(TrailImage) && TrailSequences.Length == 0) + throw new YamlException("At least one entry in TrailSequences must be defined when TrailImage is defined."); + + var weaponToLower = (ImpactWeapon ?? string.Empty).ToLowerInvariant(); + if (!rules.Weapons.TryGetValue(weaponToLower, out var weapon)) + throw new YamlException($"Weapons Ruleset does not contain an entry '{weaponToLower}'"); + + WeaponInfo = weapon; + + base.RulesetLoaded(rules, ai); + } + } + + sealed class MeteorPower : SupportPower + { + readonly MeteorPowerInfo info; + + public MeteorPower(Actor self, MeteorPowerInfo info) + : base(self, info) + { + this.info = info; + } + + protected override void Created(Actor self) + { + base.Created(self); + } + + public override void Activate(Actor self, Order order, SupportPowerManager manager) + { + base.Activate(self, order, manager); + PlayLaunchSounds(); + + Activate(self, order.Target.CenterPosition); + } + + public void Activate(Actor self, WPos targetPosition) + { + var palette = info.IsPlayerPalette ? info.MeteorPalette + self.Owner.InternalName : info.MeteorPalette; + var launchPos = WPos.Zero; + + var meteor = new MeteorStrike(self.Owner, info.MeteorImage, info.WeaponInfo, palette, info.MeteorSequence, + targetPosition, info.DetonationAltitude, info.RemoveMeteorOnDetonation, + info.FlightVelocity, info.FlightDelay, + info.TrailImage, info.TrailSequences, info.TrailPalette, info.TrailUsePlayerPalette, info.TrailDelay, info.TrailInterval); + + self.World.AddFrameEndTask(w => w.Add(meteor)); + + if (info.CameraRange != WDist.Zero) + { + var type = info.RevealGeneratedShroud ? Shroud.SourceType.Visibility + : Shroud.SourceType.PassiveVisibility; + + self.World.AddFrameEndTask(w => w.Add(new RevealShroudEffect(targetPosition, info.CameraRange, type, self.Owner, info.CameraRelationships, + info.FlightDelay - info.CameraSpawnAdvance, info.CameraSpawnAdvance + info.CameraRemoveDelay))); + } + + if (Info.DisplayBeacon) + { + var beacon = new Beacon( + self.Owner, + targetPosition, + Info.BeaconPaletteIsPlayerPalette, + Info.BeaconPalette, + Info.BeaconImage, + Info.BeaconPoster, + Info.BeaconPosterPalette, + Info.BeaconSequence, + Info.ArrowSequence, + Info.CircleSequence, + Info.ClockSequence, + () => meteor.FractionComplete, + Info.BeaconDelay, + info.FlightDelay - info.BeaconRemoveAdvance); + + self.World.AddFrameEndTask(w => w.Add(beacon)); + } + } + + public override void SelectTarget(Actor self, string order, SupportPowerManager manager) + { + self.World.OrderGenerator = new SelectMeteorPowerTarget(order, manager, info, MouseButton.Left); + } + } + + public class SelectMeteorPowerTarget : SelectGenericPowerTarget + { + readonly MeteorPowerInfo info; + + public SelectMeteorPowerTarget(string order, SupportPowerManager manager, MeteorPowerInfo info, MouseButton button) + : base(order, manager, info, button) + { + this.info = info; + } + + protected override IEnumerable RenderAnnotations(WorldRenderer wr, World world) + { + if (info.CircleRanges == null) + yield break; + + var centerPosition = wr.World.Map.CenterOfCell(wr.Viewport.ViewToWorld(Viewport.LastMousePos)); + foreach (var range in info.CircleRanges) + yield return new RangeCircleAnnotationRenderable( + centerPosition, + range, + 0, + info.CircleColor, + info.CircleWidth, + info.CircleBorderColor, + info.CircleBorderWidth); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/SupportPowers/MissileStrikePower.cs b/OpenRA.Mods.CA/Traits/SupportPowers/MissileStrikePower.cs new file mode 100644 index 0000000000..77242817c3 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/SupportPowers/MissileStrikePower.cs @@ -0,0 +1,525 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Linq; +using OpenRA.Graphics; +using OpenRA.Mods.Common; +using OpenRA.Mods.Common.Graphics; +using OpenRA.Mods.Common.Orders; +using OpenRA.Mods.Common.Traits; +using OpenRA.Mods.Common.Traits.Render; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + public enum MissileStrikeSpawnDirection { + NearestMapEdge, + Launcher + } + + enum MapEdge + { + Top, + Right, + Bottom, + Left + } + + public enum PriorityType { + Distance, + Value + } + + public class MissileStrikePowerInfo : SupportPowerInfo + { + [Desc("Missile actor. Must have a trait that inherits `" + nameof(MissileBase) + "`.")] + [ActorReference] + [FieldLoader.Require] + public readonly string MissileActor = null; + + [Desc("Direction from which to spawn the missiles.")] + public readonly MissileStrikeSpawnDirection SpawnFromDirection = MissileStrikeSpawnDirection.NearestMapEdge; + + [Desc("Distance to from target to spawn the missiles (if set to zero, half map distance will be used).")] + public readonly WDist SpawnDistance = WDist.Zero; + + [Desc("Altitude to launch missiles from. If null, the target's altitude will be used.")] + public readonly WDist? LaunchAltitude = null; + + [Desc("Sound to instantly play at the targeted area.")] + public readonly string[] LaunchSounds = Array.Empty(); + + [Desc("If true, the power will target actors, otherwise it will target cells according to TargetOffsets.")] + public readonly bool TargetActors = true; + + [Desc("If TargetsActors is false, defines impact offsets. Cycled through until all missiles are launched.")] + public readonly CVec[] TargetOffsets = new CVec[] { new CVec(0, 0) }; + + [Desc("If TargetsActors is true, defines how targets are prioritized.")] + public readonly PriorityType PrioritizeTargetsBy = PriorityType.Distance; + + [Desc("Whether to shuffle the impact offsets. If false, the offsets will be used in the order they are defined.")] + public readonly bool ShuffleOffsets = false; + + [Desc("If TargetsActors is true, defines the target types that can be targeted. Leave empty for all types.")] + public readonly BitSet ValidTargets = default; + + [Desc("If TargetsActors is true, defines the target types that cannot be targeted.")] + public readonly BitSet InvalidTargets = default; + + [Desc("If TargetsActors is true, defines the player relationships of actors that can be targeted.")] + public readonly PlayerRelationship ValidRelationships = PlayerRelationship.Enemy | PlayerRelationship.Neutral; + + [Desc("If TargetsActors is true, maximum number of targets. Zero for no limit.")] + public readonly int MaxTargets = 0; + + [Desc("If TargetsActors is true, minimum targets for power to activate.")] + public readonly int MinTargets = 1; + + [Desc("Font to use for target count.")] + public readonly string TargetCountFont = "Medium"; + + [Desc("If true, targets must not be under shroud/fog.")] + public readonly bool TargetMustBeVisible = true; + + [Desc("Ticks between launches.")] + public readonly int LaunchInterval = 10; + + [Desc("Total missiles. Zero for equates to one per target/offset.", + "If positive, must be equal to or greater than MaxTargets, or TargetsActors must be false.")] + public readonly int MissileCount = 0; + + [Desc("Missiles per launch.")] + public readonly int MissilesPerLaunch = 1; + + [SequenceReference] + [Desc("Sequence to play for granting actor when activated.", + "This requires the actor to have the WithSpriteBody trait or one of its derivatives.")] + public readonly string ActiveSequence = "active"; + + [GrantedConditionReference] + [Desc("A condition to apply while active.")] + public readonly string ActiveCondition = null; + + [Desc("Duration of the Active condition (in ticks). Set to 0 for a permanent condition.")] + public readonly int ActiveDuration = 50; + + public readonly bool ShowSelectionBoxes = false; + public readonly Color SelectionBoxColor = Color.Red; + + public readonly bool ShowTargetCircle = false; + public readonly Color TargetCircleColor = Color.Red; + public readonly bool TargetCircleUsePlayerColor = false; + + [Desc("Target tint colour.")] + public readonly Color? TargetTintColor = null; + + [Desc("Target selection radius.")] + public readonly WDist Range = WDist.Zero; + + public override object Create(ActorInitializer init) { return new MissileStrikePower(init.Self, this); } + } + + public class MissileStrikePower : SupportPower, ITick, INotifyCreated + { + readonly MissileStrikePowerInfo info; + readonly int halfMapHeight; + readonly int halfMapWidth; + readonly Rectangle mapBounds; + + Queue targetQueue; + CPos targetCell; + WPos soundPos; + int ticks; + MapEdge nearestMapEdge; + WDist spawnDistance; + WithSpriteBody wsb; + + [Sync] + public int Ticks { get; private set; } + + public MissileStrikePower(Actor self, MissileStrikePowerInfo info) + : base(self, info) + { + this.info = info; + targetQueue = new Queue(); + mapBounds = self.World.Map.Bounds; + halfMapHeight = mapBounds.Height / 2; + halfMapWidth = mapBounds.Width / 2; + } + + protected override void Created(Actor self) + { + base.Created(self); + wsb = self.TraitOrDefault(); + } + + public override void SelectTarget(Actor self, string order, SupportPowerManager manager) + { + self.World.OrderGenerator = new SelectMissileStrikeTarget(Self.World, order, manager, this); + } + + public override void Activate(Actor self, Order order, SupportPowerManager manager) + { + base.Activate(self, order, manager); + PlayLaunchSounds(); + + if (wsb != null && wsb.DefaultAnimation.HasSequence(info.ActiveSequence)) + wsb.PlayCustomAnimation(self, info.ActiveSequence); + + targetCell = self.World.Map.CellContaining(order.Target.CenterPosition); + + var targets = info.TargetActors ? GetActorTargets(targetCell).Select(t => Target.FromActor(t)).ToList() : GetCellTargets(targetCell).ToList(); + var numMissiles = info.MissileCount > 0 ? info.MissileCount : targets.Count; + + if (targets.Count == 0) + return; + + for (int i = 0; i < numMissiles; i++) + targetQueue.Enqueue(targets[i % targets.Count]); + + nearestMapEdge = CalculateNearestMapEdge(); + spawnDistance = CalculateSpawnDistance(); + soundPos = CalculateLaunchSoundPos(); + } + + void ITick.Tick(Actor self) + { + if (targetQueue.Count == 0) + return; + + if (++ticks % info.LaunchInterval != 0) + return; + + var launchSound = info.LaunchSounds.RandomOrDefault(self.World.LocalRandom); + if (launchSound != null) + Game.Sound.Play(SoundType.World, launchSound, soundPos); + + var launches = 0; + while (++launches <= info.MissilesPerLaunch && targetQueue.Count > 0) + LaunchMissile(self, targetQueue.Dequeue()); + + if (targetQueue.Count == 0) + ticks = 0; + } + + private IEnumerable GetActorTargets(CPos xy) + { + return GetValidTargetActorsInCircle(xy); + } + + private IEnumerable GetCellTargets(CPos xy) + { + var numMissiles = info.MissileCount > 0 ? info.MissileCount : info.TargetOffsets.Length; + var offsets = info.TargetOffsets.ToList(); + + if (info.ShuffleOffsets) + offsets = offsets.Shuffle(Self.World.SharedRandom).ToList(); + + for (int i = 0; i < numMissiles; i++) + { + var targetCell = xy + offsets[i % offsets.Count]; + yield return Target.FromCell(Self.World, targetCell); + } + } + + private MapEdge CalculateNearestMapEdge() + { + var referenceCell = info.SpawnFromDirection == MissileStrikeSpawnDirection.NearestMapEdge ? targetCell : Self.World.Map.CellContaining(Self.CenterPosition); + + var distFromTopEdge = referenceCell.Y; + var distFromLeftEdge = referenceCell.X; + var distFromBottomEdge = mapBounds.Height - referenceCell.Y; + var distFromRightEdge = mapBounds.Width - referenceCell.X; + + if (distFromTopEdge <= distFromLeftEdge && distFromTopEdge <= distFromBottomEdge && distFromTopEdge <= distFromRightEdge) + { + return MapEdge.Top; + } + else if (distFromRightEdge <= distFromBottomEdge && distFromRightEdge <= distFromLeftEdge) + { + return MapEdge.Right; + } + else if (distFromBottomEdge <= distFromLeftEdge) + { + return MapEdge.Bottom; + } + else + { + return MapEdge.Left; + } + } + + private WDist CalculateSpawnDistance() + { + if (info.SpawnDistance.Length > 0) + return info.SpawnDistance; + + switch (nearestMapEdge) + { + case MapEdge.Top: + return new WDist(halfMapHeight); + + case MapEdge.Left: + case MapEdge.Right: + default: + return new WDist(halfMapWidth); + } + } + + private CPos CalculateLaunchCell(CPos targetCell) + { + WPos launchReferencePos; + + if (info.SpawnFromDirection == MissileStrikeSpawnDirection.Launcher && !Self.IsDead && Self.IsInWorld) + { + launchReferencePos = Self.CenterPosition; + } + else + { + CPos sourceCell; + + var scatter = Self.World.SharedRandom.Next(-25, 25); + + switch (nearestMapEdge) + { + case MapEdge.Top: + sourceCell = new CPos(targetCell.X, targetCell.Y - halfMapHeight) + new CVec(scatter, 0); + break; + + case MapEdge.Right: + sourceCell = new CPos(targetCell.X + halfMapWidth, targetCell.Y) + new CVec(0, scatter); + break; + + case MapEdge.Bottom: + sourceCell = new CPos(targetCell.X, targetCell.Y + halfMapHeight) + new CVec(scatter, 0); + break; + + case MapEdge.Left: + default: + sourceCell = new CPos(targetCell.X - halfMapWidth, targetCell.Y) + new CVec(0, scatter); + break; + } + + launchReferencePos = Self.World.Map.CenterOfCell(sourceCell); + } + + var targetPos = Self.World.Map.CenterOfCell(targetCell); + var launchFacing = (targetPos - launchReferencePos).Yaw.Facing; + var launchRotation = WRot.FromFacing(launchFacing); + + // random rotation + launchRotation = launchRotation.Rotate(WRot.FromFacing(Self.World.SharedRandom.Next(30) - 15)); + var delta = new WVec(0, -1024, 0).Rotate(launchRotation); + var launchPos = targetPos - spawnDistance.Length * delta / 1024; + return Self.World.Map.CellContaining(launchPos); + } + + private WPos CalculateLaunchSoundPos() + { + if (info.SpawnFromDirection == MissileStrikeSpawnDirection.Launcher) + return Self.CenterPosition; + + switch (nearestMapEdge) + { + case MapEdge.Top: + return Self.World.Map.CenterOfCell(new CPos(targetCell.X, 0)); + + case MapEdge.Right: + return Self.World.Map.CenterOfCell(new CPos(mapBounds.Width, targetCell.Y)); + + case MapEdge.Bottom: + return Self.World.Map.CenterOfCell(new CPos(targetCell.X, mapBounds.Height)); + + case MapEdge.Left: + default: + return Self.World.Map.CenterOfCell(new CPos(0, targetCell.Y)); + } + } + + private void LaunchMissile(Actor self, Target target) + { + self.World.AddFrameEndTask(w => + { + if (target.Type == TargetType.Invalid) + return; + + if (target.Type == TargetType.Actor && (target.Actor.IsDead || !target.Actor.IsInWorld)) + return; + + if (target.Type == TargetType.FrozenActor && (target.FrozenActor.Actor.IsDead || !target.FrozenActor.Actor.IsInWorld)) + return; + + var launchCell = CalculateLaunchCell(targetCell); + var launchPos = self.World.Map.CenterOfCell(launchCell); + + var spawnDirection = new WVec((targetCell - launchCell).X, (targetCell - launchCell).Y, 0); + var spawnFacing = spawnDirection.Yaw; + var targetAltitude = new WDist(target.CenterPosition.Z); + var spawnAltitude = info.LaunchAltitude.GetValueOrDefault(targetAltitude); + + var actor = w.CreateActor(false, info.MissileActor, new TypeDictionary + { + new CenterPositionInit(launchPos + new WVec(0, 0, spawnAltitude.Length)), + new OwnerInit(self.Owner), + new FacingInit(spawnFacing) + }); + + var gm = actor.Trait(); + gm.SetTarget(target); + w.Add(actor); + }); + } + + private IEnumerable GetValidTargetActorsInCircle(CPos xy) + { + var centerPos = Self.World.Map.CenterOfCell(xy); + + var actorsInRange = Self.World.FindActorsInCircle(centerPos, info.Range) + .Where(a => a.IsInWorld + && !a.IsDead + && info.ValidRelationships.HasRelationship(Self.Owner.RelationshipWith(a.Owner)) + && (info.ValidTargets.IsEmpty || info.ValidTargets.Overlaps(a.GetEnabledTargetTypes())) + && (info.InvalidTargets.IsEmpty || !info.InvalidTargets.Overlaps(a.GetEnabledTargetTypes())) + && (!info.TargetMustBeVisible || Self.Owner.Shroud.IsVisible(a.Location)) + && a.CanBeViewedByPlayer(Self.Owner)) + .OrderByDescending(a => { + if (info.PrioritizeTargetsBy == PriorityType.Value) + return a.Info.TraitInfoOrDefault()?.Cost ?? 0; + else + return 0; + }).ThenBy(a => (a.CenterPosition - centerPos).LengthSquared); + + if (info.MaxTargets > 0) + return actorsInRange.Take(info.MaxTargets); + + return actorsInRange; + } + + class SelectMissileStrikeTarget : OrderGenerator + { + readonly MissileStrikePower power; + readonly SupportPowerManager manager; + readonly string order; + + public SelectMissileStrikeTarget(World world, string order, SupportPowerManager manager, MissileStrikePower power) + { + // Clear selection if using Left-Click Orders + if (Game.Settings.Game.UseClassicMouseStyle) + manager.Self.World.Selection.Clear(); + + this.manager = manager; + this.order = order; + this.power = power; + } + + protected override IEnumerable OrderInner(World world, CPos cell, int2 worldPixel, MouseInput mi) + { + world.CancelInputMode(); + if (mi.Button == MouseButton.Left && (!power.info.TargetActors || power.GetActorTargets(cell).Count() >= power.info.MinTargets)) + yield return new Order(order, manager.Self, Target.FromCell(world, cell), false) { SuppressVisualFeedback = true }; + } + + protected override void Tick(World world) + { + // Cancel the OG if we can't use the power + if (!manager.Powers.TryGetValue(order, out var p) || !p.Active || !p.Ready) + world.CancelInputMode(); + } + + protected override IEnumerable RenderAboveShroud(WorldRenderer wr, World world) { yield break; } + + protected override IEnumerable RenderAnnotations(WorldRenderer wr, World world) + { + var xy = wr.Viewport.ViewToWorld(Viewport.LastMousePos); + + if (power.info.ShowTargetCircle) + { + yield return new RangeCircleAnnotationRenderable( + world.Map.CenterOfCell(xy), + power.info.Range, + 0, + power.info.TargetCircleUsePlayerColor ? power.Self.OwnerColor() : power.info.TargetCircleColor, + 1, + Color.FromArgb(96, Color.Black), + 3); + } + + if (power.info.TargetActors) + { + var targetUnits = power.GetActorTargets(xy); + + if (power.info.ShowSelectionBoxes) + { + foreach (var unit in targetUnits) + { + var decorations = unit.TraitsImplementing().FirstEnabledTraitOrDefault(); + if (decorations != null) + { + foreach (var d in decorations.RenderSelectionAnnotations(unit, wr, power.info.SelectionBoxColor)) + yield return d; + } + } + } + + if (power.info.MaxTargets > 0) + { + var font = Game.Renderer.Fonts[power.info.TargetCountFont]; + var color = power.info.TargetCircleColor; + var text = targetUnits.Count() + " / " + power.info.MaxTargets; + var size = font.Measure(text); + var textPos = new int2(Viewport.LastMousePos.X - (size.X / 2), Viewport.LastMousePos.Y + size.Y + (size.Y / 3)); + yield return new UITextRenderable(font, WPos.Zero, textPos, 0, color, text); + } + } + } + + protected override IEnumerable Render(WorldRenderer wr, World world) + { + var xy = wr.Viewport.ViewToWorld(Viewport.LastMousePos); + + if (power.info.TargetActors && power.info.TargetTintColor != null) + { + var targetUnits = power.GetActorTargets(xy); + + foreach (var unit in targetUnits) + { + var renderables = unit.Render(wr) + .Where(r => !r.IsDecoration && r is IModifyableRenderable) + .Select(r => + { + var mr = (IModifyableRenderable)r; + var tint = new float3(power.info.TargetTintColor.Value.R, power.info.TargetTintColor.Value.G, power.info.TargetTintColor.Value.B) / 255f; + mr = mr.WithTint(tint, mr.TintModifiers | TintModifiers.ReplaceColor).WithAlpha(power.info.TargetTintColor.Value.A / 255f); + return mr; + }); + + foreach (var r in renderables) + { + yield return r; + } + } + } + } + + protected override string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi) + { + if (!power.info.TargetActors) + return power.info.Cursor; + + var targets = power.GetActorTargets(cell); + return targets.Count() >= power.info.MinTargets ? power.info.Cursor : power.info.BlockedCursor; + } + } + } +} diff --git a/OpenRA.Mods.CA/Traits/SupportPowers/ParatroopersPowerCA.cs b/OpenRA.Mods.CA/Traits/SupportPowers/ParatroopersPowerCA.cs new file mode 100644 index 0000000000..372d1d6eeb --- /dev/null +++ b/OpenRA.Mods.CA/Traits/SupportPowers/ParatroopersPowerCA.cs @@ -0,0 +1,354 @@ +#region Copyright & License Information +/* + * Copyright (c) The OpenRA Developers and Contributors + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. For more + * information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Linq; +using OpenRA.Mods.Common; +using OpenRA.Mods.Common.Traits; +using OpenRA.Mods.Common.Activities; +using OpenRA.Mods.Common.Effects; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Support power that delivers paratroopers. CA version adds overrides based on prerequisites.")] + public class ParatroopersPowerCAInfo : DirectionalSupportPowerInfo + { + [ActorReference(typeof(AircraftInfo))] + public readonly string UnitType = "badr"; + public readonly int SquadSize = 1; + public readonly WVec SquadOffset = new(-1536, 1536, 0); + + [NotificationReference("Speech")] + [Desc("Speech notification to play when entering the drop zone.")] + public readonly string ReinforcementsArrivedSpeechNotification = null; + + [Desc("Text notification to display when entering the drop zone.")] + public readonly string ReinforcementsArrivedTextNotification = null; + + [Desc("Number of facings that the delivery aircraft may approach from.")] + public readonly int QuantizedFacings = 32; + + [Desc("Minimum distance from the target to spawn the planes.")] + public readonly WDist MinDistance = WDist.FromCells(48); + + [ActorReference(typeof(PassengerInfo))] + [Desc("Troops to be delivered. They will be distributed between the planes if SquadSize > 1.")] + public readonly string[] DropItems = Array.Empty(); + + [Desc("Risks stuck units when they don't have the Paratrooper trait.")] + public readonly bool AllowImpassableCells = false; + + [ActorReference] + [Desc("Actor to spawn when the paradrop starts.")] + public readonly string CameraActor = null; + + [Desc("Amount of time (in ticks) to keep the camera alive while the passengers drop.")] + public readonly int CameraRemoveDelay = 85; + + [Desc("Weapon range offset to apply during the beacon clock calculation.")] + public readonly WDist BeaconDistanceOffset = WDist.FromCells(4); + + [Desc("Prerequisites grouped together to be referenced by the Prerequisite based overrides.")] + public readonly Dictionary PrerequisiteGroupings = new(); + + [Desc("Overrides UnitType based on prerequsites being met. If multiple are met, the first is used.", + "Keys can either be a single prerequisite or be a key of PrerequisiteGroupings.")] + public readonly Dictionary PrerequisiteUnitTypes = new(); + + [Desc("Overrides SquadSize based on prerequsites being met. If multiple are met, the first is used.", + "Keys can either be a single prerequisite or be a key of PrerequisiteGroupings.")] + public readonly Dictionary PrerequisiteSquadSizes = new(); + + [Desc("Overrides DropItems based on prerequsites being met. If multiple are met, the first is used.", + "Keys can either be a single prerequisite or be a key of PrerequisiteGroupings.")] + public readonly Dictionary PrerequisiteDropItems = new(); + + public override object Create(ActorInitializer init) { return new ParatroopersPowerCA(init.Self, this); } + } + + public class ParatroopersPowerCA : DirectionalSupportPower + { + readonly ParatroopersPowerCAInfo info; + TechTree techTree; + + public ParatroopersPowerCA(Actor self, ParatroopersPowerCAInfo info) + : base(self, info) + { + this.info = info; + } + + protected override void Created(Actor self) + { + base.Created(self); + techTree = self.Owner.PlayerActor.Trait(); + } + + public override void Activate(Actor self, Order order, SupportPowerManager manager) + { + base.Activate(self, order, manager); + + var facing = info.UseDirectionalTarget && order.ExtraData != uint.MaxValue ? (WAngle?)WAngle.FromFacing((int)order.ExtraData) : null; + SendParatroopers(self, order.Target.CenterPosition, facing); + } + + public (Actor[] Aircraft, Actor[] Units) SendParatroopers(Actor self, WPos target, WAngle? facing = null) + { + var aircraft = new List(); + var units = new List(); + + if (!facing.HasValue) + facing = new WAngle(1024 * self.World.SharedRandom.Next(info.QuantizedFacings) / info.QuantizedFacings); + + var unitType = GetUnitType(); + var utLower = info.UnitType.ToLowerInvariant(); + if (!self.World.Map.Rules.Actors.TryGetValue(utLower, out var ut)) + throw new YamlException($"Actors ruleset does not include the entry '{utLower}'"); + + var altitude = ut.TraitInfo().CruiseAltitude.Length; + var dropRotation = WRot.FromYaw(facing.Value); + var delta = new WVec(0, -1024, 0).Rotate(dropRotation); + target += new WVec(0, 0, altitude); + + var distanceFromStartEdgeToTarget = self.World.Map.DistanceToEdge(target, -delta); + var extraDistanceToMeetMinimum = info.MinDistance > distanceFromStartEdgeToTarget ? info.MinDistance - distanceFromStartEdgeToTarget : WDist.Zero; + + var startEdge = target - (distanceFromStartEdgeToTarget + WDist.FromCells(1) + extraDistanceToMeetMinimum).Length * delta / 1024; + var finishEdge = target + (self.World.Map.DistanceToEdge(target, delta) + WDist.FromCells(5)).Length * delta / 1024; + + Actor camera = null; + Beacon beacon = null; + var aircraftInRange = new Dictionary(); + + void OnEnterRange(Actor a) + { + // Spawn a camera and remove the beacon when the first plane enters the target area + if (info.CameraActor != null && camera == null && !aircraftInRange.Any(kv => kv.Value)) + { + self.World.AddFrameEndTask(w => + { + camera = w.CreateActor(info.CameraActor, new TypeDictionary + { + new LocationInit(self.World.Map.CellContaining(target)), + new OwnerInit(self.Owner), + }); + }); + } + + RemoveBeacon(beacon); + + if (!aircraftInRange.Any(kv => kv.Value)) + { + Game.Sound.PlayNotification(self.World.Map.Rules, self.Owner, "Speech", + info.ReinforcementsArrivedSpeechNotification, self.Owner.Faction.InternalName); + + TextNotificationsManager.AddTransientLine(self.Owner, info.ReinforcementsArrivedTextNotification); + } + + aircraftInRange[a] = true; + } + + void OnExitRange(Actor a) + { + aircraftInRange[a] = false; + + // Remove the camera when the final plane leaves the target area + if (!aircraftInRange.Any(kv => kv.Value)) + RemoveCamera(camera); + } + + void OnRemovedFromWorld(Actor a) + { + aircraftInRange[a] = false; + + // Checking for attack range is not relevant here because + // aircraft may be shot down before entering the range. + // If at the map's edge, they may be removed from world before leaving. + if (aircraftInRange.All(kv => !kv.Key.IsInWorld)) + { + RemoveCamera(camera); + RemoveBeacon(beacon); + } + } + + var squadSize = GetSquadSize(); + + // Create the actors immediately so they can be returned + for (var i = -squadSize / 2; i <= squadSize / 2; i++) + { + // Even-sized squads skip the lead plane + if (i == 0 && (squadSize & 1) == 0) + continue; + + // Includes the 90 degree rotation between body and world coordinates + var so = info.SquadOffset; + var spawnOffset = new WVec(i * so.Y, -Math.Abs(i) * so.X, 0).Rotate(dropRotation); + + aircraft.Add(self.World.CreateActor(false, unitType, new TypeDictionary + { + new CenterPositionInit(startEdge + spawnOffset), + new OwnerInit(self.Owner), + new FacingInit(facing.Value), + })); + } + + var dropItems = GetDropItems(); + + foreach (var p in dropItems) + { + units.Add(self.World.CreateActor(false, p.ToLowerInvariant(), new TypeDictionary + { + new OwnerInit(self.Owner) + })); + } + + self.World.AddFrameEndTask(w => + { + PlayLaunchSounds(); + + Actor distanceTestActor = null; + + var passengersPerPlane = (dropItems.Length + squadSize - 1) / squadSize; + var added = 0; + var j = 0; + for (var i = -squadSize / 2; i <= squadSize / 2; i++) + { + // Even-sized squads skip the lead plane + if (i == 0 && (squadSize & 1) == 0) + continue; + + // Includes the 90 degree rotation between body and world coordinates + var so = info.SquadOffset; + var spawnOffset = new WVec(i * so.Y, -Math.Abs(i) * so.X, 0).Rotate(dropRotation); + var targetOffset = new WVec(i * so.Y, 0, 0).Rotate(dropRotation); + var a = aircraft[j++]; + w.Add(a); + + var drop = a.Trait(); + drop.SetLZ(w.Map.CellContaining(target + targetOffset), !info.AllowImpassableCells); + drop.OnEnteredDropRange += OnEnterRange; + drop.OnExitedDropRange += OnExitRange; + drop.OnRemovedFromWorld += OnRemovedFromWorld; + + var cargo = a.Trait(); + foreach (var unit in units.Skip(added).Take(passengersPerPlane)) + { + cargo.Load(a, unit); + added++; + } + + a.QueueActivity(new Fly(a, Target.FromPos(target + spawnOffset))); + a.QueueActivity(new Fly(a, Target.FromPos(finishEdge + spawnOffset))); + a.QueueActivity(new RemoveSelf()); + aircraftInRange.Add(a, false); + distanceTestActor = a; + } + + // Dispose any unused units + for (var i = added; i < units.Count; i++) + units[i].Dispose(); + + if (Info.DisplayBeacon) + { + var distance = (target - startEdge).HorizontalLength; + + beacon = new Beacon( + self.Owner, + target - new WVec(0, 0, altitude), + Info.BeaconPaletteIsPlayerPalette, + Info.BeaconPalette, + Info.BeaconImage, + Info.BeaconPoster, + Info.BeaconPosterPalette, + Info.BeaconSequence, + Info.ArrowSequence, + Info.CircleSequence, + Info.ClockSequence, + () => 1 - ((distanceTestActor.CenterPosition - target).HorizontalLength - info.BeaconDistanceOffset.Length) * 1f / distance, + Info.BeaconDelay); + + w.Add(beacon); + } + }); + + return (aircraft.ToArray(), units.ToArray()); + } + + void RemoveCamera(Actor camera) + { + if (camera == null) + return; + + camera.QueueActivity(new Wait(info.CameraRemoveDelay)); + camera.QueueActivity(new RemoveSelf()); + } + + void RemoveBeacon(Beacon beacon) + { + if (beacon == null) + return; + + Self.World.AddFrameEndTask(w => w.Remove(beacon)); + } + + string GetUnitType() + { + if (info.PrerequisiteUnitTypes.Any()) + { + foreach (var item in info.PrerequisiteUnitTypes) + { + if (techTree.HasPrerequisites(GetPrerequisitesList(item.Key))) + return item.Value; + } + } + + return info.UnitType; + } + + int GetSquadSize() + { + if (info.PrerequisiteSquadSizes.Any()) + { + foreach (var item in info.PrerequisiteSquadSizes) + { + if (techTree.HasPrerequisites(GetPrerequisitesList(item.Key))) + return item.Value; + } + } + + return info.SquadSize; + } + + string[] GetDropItems() + { + if (info.PrerequisiteDropItems.Any()) + { + foreach (var item in info.PrerequisiteDropItems) + { + if (techTree.HasPrerequisites(GetPrerequisitesList(item.Key))) + return item.Value; + } + } + + return info.DropItems; + } + + string[] GetPrerequisitesList(string key) + { + if (info.PrerequisiteGroupings.TryGetValue(key, out var prerequisites)) + return prerequisites; + + return new string[] { key }; + } + } +} diff --git a/OpenRA.Mods.CA/Traits/SupportPowers/ProduceActorPowerCA.cs b/OpenRA.Mods.CA/Traits/SupportPowers/ProduceActorPowerCA.cs index 2b8cb09cc3..a48b4d9440 100644 --- a/OpenRA.Mods.CA/Traits/SupportPowers/ProduceActorPowerCA.cs +++ b/OpenRA.Mods.CA/Traits/SupportPowers/ProduceActorPowerCA.cs @@ -1,26 +1,40 @@ #region Copyright & License Information -/* - * Copyright 2007-2019 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion +using System.Collections.Generic; using System.Linq; +using OpenRA.Graphics; using OpenRA.Mods.Common; +using OpenRA.Mods.Common.Orders; using OpenRA.Mods.Common.Traits; using OpenRA.Primitives; using OpenRA.Traits; namespace OpenRA.Mods.CA.Traits { - [Desc("Produces an actor without using the standard production queue.")] + static class PrimaryExts + { + public static bool IsPrimaryBuilding(this Actor a) + { + var pb = a.TraitOrDefault(); + return pb != null && pb.IsPrimary; + } + } + + [Desc("Produces an actor without using the standard production queue.", + "CA version allows actors to be produced immediately when charged.", + "Also removes sorting of the producing actor as this can cause a crash when multiple exist.")] public class ProduceActorPowerCAInfo : SupportPowerInfo { [ActorReference] + [FieldLoader.Require] [Desc("Actors to produce.")] public readonly string[] Actors = null; @@ -38,25 +52,38 @@ public class ProduceActorPowerCAInfo : SupportPowerInfo "The filename of the audio is defined per faction in notifications.yaml.")] public readonly string BlockedAudio = null; - [Desc("Allows the actors to be produced immediately when charged.")] + [Desc("If true, actors are produced immediately when charged (and SelectProducer is ignored).")] public readonly bool AutoFire = false; + [Desc("If true, producer must be selected, otherwise chosen automatically.")] + public readonly bool SelectProducer = true; + public override object Create(ActorInitializer init) { return new ProduceActorPowerCA(init, this); } } public class ProduceActorPowerCA : SupportPower { + readonly ProduceActorPowerCAInfo info; readonly string faction; public ProduceActorPowerCA(ActorInitializer init, ProduceActorPowerCAInfo info) : base(init.Self, info) { + this.info = info; faction = init.GetValue(init.Self.Owner.Faction.InternalName); } + public override SupportPowerInstance CreateInstance(string key, SupportPowerManager manager) + { + return new SupportPowerInstanceCA(key, Info, manager); + } + public override void SelectTarget(Actor self, string order, SupportPowerManager manager) { - self.World.IssueOrder(new Order(order, manager.Self, false)); + if (info.AutoFire || !info.SelectProducer) + self.World.IssueOrder(new Order(order, manager.Self, false)); + else + self.World.OrderGenerator = new SelectProductionTarget(Self.World, order, manager, this); } public override void Charged(Actor self, string key) @@ -76,11 +103,25 @@ public override void Activate(Actor self, Order order, SupportPowerManager manag base.Activate(self, order, manager); PlayLaunchSounds(); - var info = Info as ProduceActorPowerCAInfo; - var producers = self.World.ActorsWithTrait() - .Where(x => x.Actor.Owner == self.Owner - && !x.Trait.IsTraitDisabled - && x.Trait.Info.Produces.Contains(info.Type)); + IOrderedEnumerable> producers; + + if (info.AutoFire || !info.SelectProducer) + { + producers = self.World.ActorsWithTrait() + .Where(x => x.Actor.Owner == self.Owner + && !x.Trait.IsTraitDisabled + && x.Trait.Info.Produces.Contains(info.Type)) + .OrderByDescending(x => x.Actor.IsPrimaryBuilding()) + .ThenByDescending(x => x.Actor.ActorID); + } + else + { + producers = UnitsInRange(self.World.Map.CellContaining(order.Target.CenterPosition)) + .Select(a => new TraitPair(a, a.TraitsImplementing() + .First(p => !p.IsTraitDisabled + && p.Info.Produces.Contains(info.Type)))) + .OrderByDescending(x => x.Actor.ActorID); + } // TODO: The power should not reset if the production fails. // Fixing this will require a larger rework of the support power code @@ -109,5 +150,80 @@ public override void Activate(Actor self, Order order, SupportPowerManager manag else Game.Sound.PlayNotification(self.World.Map.Rules, manager.Self.Owner, "Speech", info.BlockedAudio, self.Owner.Faction.InternalName); } + + public IEnumerable UnitsInRange(CPos xy) + { + var range = 0; + var tiles = Self.World.Map.FindTilesInCircle(xy, range); + var units = new List(); + foreach (var t in tiles) + units.AddRange(Self.World.ActorMap.GetActorsAt(t)); + + return units.Distinct().Where(a => + { + if (a.Owner != Self.Owner) + return false; + + var production = a.TraitsImplementing() + .Where(p => !p.IsTraitDisabled + && p.Info.Produces.Contains(info.Type)); + + if (!production.Any()) + return false; + + return true; + }); + } + + class SelectProductionTarget : OrderGenerator + { + readonly ProduceActorPowerCA power; + readonly SupportPowerManager manager; + readonly string order; + + public SelectProductionTarget(World world, string order, SupportPowerManager manager, ProduceActorPowerCA power) + { + // Clear selection if using Left-Click Orders + if (Game.Settings.Game.UseClassicMouseStyle) + manager.Self.World.Selection.Clear(); + + this.manager = manager; + this.order = order; + this.power = power; + } + + protected override IEnumerable OrderInner(World world, CPos cell, int2 worldPixel, MouseInput mi) + { + world.CancelInputMode(); + if (mi.Button == MouseButton.Left && power.UnitsInRange(cell).Any()) + yield return new Order(order, manager.Self, Target.FromCell(world, cell), false) { SuppressVisualFeedback = true }; + } + + protected override void Tick(World world) + { + // Cancel the OG if we can't use the power + if (!manager.Powers.ContainsKey(order)) + world.CancelInputMode(); + } + + protected override IEnumerable RenderAboveShroud(WorldRenderer wr, World world) { yield break; } + + protected override IEnumerable RenderAnnotations(WorldRenderer wr, World world) + { + var xy = wr.Viewport.ViewToWorld(Viewport.LastMousePos); + foreach (var unit in power.UnitsInRange(xy)) + { + var decorations = unit.TraitsImplementing().FirstEnabledTraitOrDefault(); + foreach (var d in decorations.RenderSelectionAnnotations(unit, wr, Color.Lime)) + yield return d; + } + } + + protected override IEnumerable Render(WorldRenderer wr, World world) { yield break; } + protected override string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi) + { + return power.UnitsInRange(cell).Any() ? power.info.Cursor : power.info.BlockedCursor; + } + } } } diff --git a/OpenRA.Mods.CA/Traits/SupportPowers/RangedGpsRadarProvider.cs b/OpenRA.Mods.CA/Traits/SupportPowers/RangedGpsRadarProvider.cs deleted file mode 100644 index 93dc8962bb..0000000000 --- a/OpenRA.Mods.CA/Traits/SupportPowers/RangedGpsRadarProvider.cs +++ /dev/null @@ -1,135 +0,0 @@ -#region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. - */ -#endregion - -using OpenRA.Mods.Common.Traits; -using OpenRA.Primitives; -using OpenRA.Traits; - -namespace OpenRA.Mods.CA.Traits -{ - [Desc("This actor provides Radar GPS.")] - public class RangedGpsRadarProviderInfo : ConditionalTraitInfo - { - [Desc("Reveals within this range. Use zero for whole map.")] - public readonly WDist Range = WDist.Zero; - - [Desc("The maximum vertical range above terrain to search for actors.", - "Ignored if 0 (actors are selected regardless of vertical distance).")] - public readonly WDist MaximumVerticalOffset = WDist.Zero; - - public override object Create(ActorInitializer init) { return new RangedGpsRadarProvider(init, this); } - } - - public class RangedGpsRadarProvider : ConditionalTrait, INotifyVisualPositionChanged, INotifyAddedToWorld, INotifyRemovedFromWorld, INotifyOtherProduction - { - readonly Actor self; - - int proximityTrigger; - WPos cachedPosition; - WDist cachedRange; - WDist desiredRange; - WDist cachedVRange; - WDist desiredVRange; - - public RangedGpsRadarProvider(ActorInitializer init, RangedGpsRadarProviderInfo info) - : base(info) - { - self = init.Self; - cachedRange = WDist.Zero; - cachedVRange = WDist.Zero; - } - - void INotifyAddedToWorld.AddedToWorld(Actor self) - { - cachedPosition = self.CenterPosition; - proximityTrigger = self.World.ActorMap.AddProximityTrigger(cachedPosition, cachedRange, cachedVRange, ActorEntered, ActorExited); - } - - void INotifyRemovedFromWorld.RemovedFromWorld(Actor self) - { - self.World.ActorMap.RemoveProximityTrigger(proximityTrigger); - } - - protected override void TraitEnabled(Actor self) - { - desiredRange = Info.Range; - desiredVRange = Info.MaximumVerticalOffset; - Update(); - } - - protected override void TraitDisabled(Actor self) - { - desiredRange = WDist.Zero; - desiredVRange = WDist.Zero; - Update(); - } - - void INotifyVisualPositionChanged.VisualPositionChanged(Actor self, byte oldLayer, byte newLayer) - { - if (!self.IsInWorld && !IsTraitDisabled) - return; - - if (self.CenterPosition != cachedPosition) - Update(); - } - - void Update() - { - cachedPosition = self.CenterPosition; - cachedRange = desiredRange; - cachedVRange = desiredVRange; - self.World.ActorMap.UpdateProximityTrigger(proximityTrigger, cachedPosition, cachedRange, cachedVRange); - } - - void ActorEntered(Actor a) - { - if (a.Disposed || self.Disposed) - return; - - if (self.Owner.IsAlliedWith(a.Owner)) - return; - - var dotTrait = a.TraitOrDefault(); - if (dotTrait != null) - dotTrait.AddRangedObserver(self); - } - - public void UnitProducedByOther(Actor self, Actor producer, Actor produced, string productionType, TypeDictionary init) - { - // If the produced Actor doesn't occupy space, it can't be in range - if (produced.OccupiesSpace == null) - return; - - // Work around for actors produced within the region not triggering until the second tick - if ((produced.CenterPosition - self.CenterPosition).HorizontalLengthSquared <= Info.Range.LengthSquared) - { - if (self.Owner.IsAlliedWith(produced.Owner)) - return; - - var dotTrait = produced.TraitOrDefault(); - if (dotTrait != null) - dotTrait.AddRangedObserver(self); - } - } - - void ActorExited(Actor a) - { - if (a.Disposed) - return; - - if (self.Owner.IsAlliedWith(a.Owner)) - return; - - var dotTrait = a.TraitOrDefault(); - if (dotTrait != null) - dotTrait.RemoveRangedObserver(self); - } - } -} diff --git a/OpenRA.Mods.CA/Traits/SupportPowers/RecallPower.cs b/OpenRA.Mods.CA/Traits/SupportPowers/RecallPower.cs new file mode 100644 index 0000000000..34aa09da10 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/SupportPowers/RecallPower.cs @@ -0,0 +1,313 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.Graphics; +using OpenRA.Mods.CA.Activities; +using OpenRA.Mods.Common.Effects; +using OpenRA.Mods.Common.Graphics; +using OpenRA.Mods.Common.Orders; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + sealed class RecallPowerInfo : SupportPowerInfo + { + [FieldLoader.Require] + [Desc("Range in which to apply condition.")] + public readonly WDist Range = WDist.Zero; + + [Desc("Minimum targets for power to activate.")] + public readonly int MinTargets = 1; + + [Desc("Maximum number of targets. Zero for no limit.")] + public readonly int MaxTargets = 0; + + [Desc("Maximum number of enemy targets. Zero for no limit (MaxTargets still applies).")] + public readonly int MaxEnemyTargets = 0; + + [Desc("If true, keeps formation of teleported units.")] + public readonly bool KeepFormation = false; + + public readonly bool KillCargo = true; + + [Desc("Target types that can be recalled.")] + public readonly BitSet ValidTargetTypes = default(BitSet); + + [Desc("Target types that cannot be recalled.")] + public readonly BitSet InvalidTargetTypes = default(BitSet); + + [Desc("Player relationships that can be recalled.")] + public readonly PlayerRelationship ValidRelationships = PlayerRelationship.Ally; + + [CursorReference] + [Desc("Cursor to display when the targeted area is blocked.")] + public readonly string TargetBlockedCursor = "move-blocked"; + + [Desc("Font to use for target count.")] + public readonly string TargetCountFont = "Medium"; + + public readonly bool ShowSelectionBoxes = false; + public readonly Color SelectionBoxColor = Color.White; + + [Desc("Target tint colour.")] + public readonly Color? TargetTintColor = null; + + public readonly bool ShowTargetCircle = false; + public readonly Color TargetCircleColor = Color.White; + public readonly bool TargetCircleUsePlayerColor = false; + + [Desc("Warp from sequence sprite image.")] + public readonly string WarpFromImage = null; + + [Desc("Warp from sequence.")] + [SequenceReference(nameof(WarpFromImage))] + public readonly string WarpFromSequence = null; + + [Desc("Warp to sequence sprite image.")] + public readonly string WarpToImage = null; + + [Desc("Warp to sequence.")] + [SequenceReference(nameof(WarpToImage))] + public readonly string WarpToSequence = null; + + [PaletteReference] + public readonly string WarpEffectPalette = "effect"; + + public override object Create(ActorInitializer init) { return new RecallPower(init.Self, this); } + } + + sealed class RecallPower : SupportPower + { + readonly RecallPowerInfo info; + + public RecallPower(Actor self, RecallPowerInfo info) + : base(self, info) + { + this.info = info; + } + + public override void SelectTarget(Actor self, string order, SupportPowerManager manager) + { + self.World.OrderGenerator = new SelectRecallTarget(Self.World, order, manager, this); + } + + public override void Activate(Actor self, Order order, SupportPowerManager manager) + { + base.Activate(self, order, manager); + PlayLaunchSounds(); + + var info = (RecallPowerInfo)Info; + var targetCell = self.World.Map.CellContaining(order.Target.CenterPosition); + var recallCell = self.Location; + var recallPos = self.World.Map.CenterOfCell(recallCell); + + var actorsToTeleport = GetTargets(targetCell); + + var targetDelta = recallCell - targetCell; + + foreach (var actor in actorsToTeleport) + { + var destinationCell = info.KeepFormation ? actor.Location + targetDelta : recallCell; + + if (self.Owner.Shroud.IsExplored(destinationCell)) + actor.QueueActivity(false, new TeleportCA(Self, destinationCell, null, info.KillCargo, false, null)); + } + + if (info.WarpFromImage != null && info.WarpFromSequence != null) + self.World.Add(new SpriteEffect(recallPos, self.World, info.WarpFromImage, info.WarpFromSequence, info.WarpEffectPalette)); + + if (info.WarpToImage != null && info.WarpToSequence != null) + self.World.Add(new SpriteEffect(order.Target.CenterPosition, self.World, info.WarpToImage, info.WarpToSequence, info.WarpEffectPalette)); + } + + public IEnumerable GetTargets(CPos xy) + { + var centerPos = Self.World.Map.CenterOfCell(xy); + + var actorsInRange = Self.World.FindActorsInCircle(centerPos, info.Range) + .Where(a => IsValidTarget(a)) + .OrderBy(a => (a.CenterPosition - centerPos).LengthSquared); + + // If we have a target limit + if (info.MaxTargets > 0) + { + // If no enemy target limit, or the overall target limit is lower + if (info.MaxEnemyTargets == 0 || info.MaxTargets < info.MaxEnemyTargets) + return actorsInRange.Take(info.MaxTargets); + else + { + var targets = new List(); + var enemyTargets = 0; + + foreach (var a in actorsInRange) + { + if (info.MaxTargets > 0 && targets.Count() >= info.MaxTargets) + break; + + if (info.MaxEnemyTargets > 0) + { + var isEnemy = !a.Owner.IsAlliedWith(Self.Owner); + + if (isEnemy && enemyTargets >= info.MaxEnemyTargets) + continue; + + if (isEnemy) + enemyTargets++; + } + + targets.Add(a); + } + + return targets; + } + } + else + return actorsInRange; + } + + public bool IsValidTarget(Actor a) + { + if (a == null || !a.IsInWorld || a.IsDead) + return false; + + if (!info.ValidRelationships.HasRelationship(Self.Owner.RelationshipWith(a.Owner))) + return false; + + var targetTypes = a.GetEnabledTargetTypes(); + + if (!targetTypes.Overlaps(info.ValidTargetTypes)) + return false; + + if (targetTypes.Overlaps(info.InvalidTargetTypes)) + return false; + + if (!Self.Owner.Shroud.IsVisible(a.Location)) + return false; + + if (!a.CanBeViewedByPlayer(Self.Owner)) + return false; + + return true; + } + + sealed class SelectRecallTarget : OrderGenerator + { + readonly RecallPower power; + readonly SupportPowerManager manager; + readonly string order; + + public SelectRecallTarget(World world, string order, SupportPowerManager manager, RecallPower power) + { + // Clear selection if using Left-Click Orders + if (Game.Settings.Game.UseClassicMouseStyle) + manager.Self.World.Selection.Clear(); + + this.manager = manager; + this.order = order; + this.power = power; + + var info = (RecallPowerInfo)power.Info; + } + + protected override IEnumerable OrderInner(World world, CPos cell, int2 worldPixel, MouseInput mi) + { + world.CancelInputMode(); + var targets = power.GetTargets(cell); + if (mi.Button == MouseButton.Left && targets.Count() >= power.info.MinTargets) + yield return new Order(order, manager.Self, Target.FromCell(world, cell), false) { SuppressVisualFeedback = true }; + } + + protected override void Tick(World world) + { + // Cancel the OG if we can't use the power + if (!manager.Powers.TryGetValue(order, out var p) || !p.Active || !p.Ready) + world.CancelInputMode(); + } + + protected override IEnumerable RenderAboveShroud(WorldRenderer wr, World world) { yield break; } + + protected override IEnumerable RenderAnnotations(WorldRenderer wr, World world) + { + var xy = wr.Viewport.ViewToWorld(Viewport.LastMousePos); + var targetUnits = power.GetTargets(xy); + + if (power.info.ShowSelectionBoxes) + { + foreach (var unit in targetUnits) + { + var decorations = unit.TraitsImplementing().FirstEnabledTraitOrDefault(); + if (decorations != null) + foreach (var d in decorations.RenderSelectionAnnotations(unit, wr, power.info.SelectionBoxColor)) + yield return d; + } + } + + if (power.info.ShowTargetCircle) + { + yield return new RangeCircleAnnotationRenderable( + world.Map.CenterOfCell(xy), + power.info.Range, + 0, + power.info.TargetCircleUsePlayerColor ? power.Self.OwnerColor() : power.info.TargetCircleColor, + 1, + Color.FromArgb(96, Color.Black), + 3); + } + + if (power.info.MaxTargets > 0) + { + var font = Game.Renderer.Fonts[power.info.TargetCountFont]; + var color = power.info.TargetCircleColor; + var text = targetUnits.Count() + " / " + power.info.MaxTargets; + var size = font.Measure(text); + var textPos = new int2(Viewport.LastMousePos.X - (size.X / 2), Viewport.LastMousePos.Y - (size.Y * 2) - (size.Y / 3)); + yield return new UITextRenderable(font, WPos.Zero, textPos, 0, color, text); + } + } + + protected override IEnumerable Render(WorldRenderer wr, World world) + { + var xy = wr.Viewport.ViewToWorld(Viewport.LastMousePos); + + if (power.info.TargetTintColor != null) + { + var targetUnits = power.GetTargets(xy); + + foreach (var unit in targetUnits) + { + var renderables = unit.Render(wr) + .Where(r => !r.IsDecoration && r is IModifyableRenderable) + .Select(r => + { + var mr = (IModifyableRenderable)r; + var tint = new float3(power.info.TargetTintColor.Value.R, power.info.TargetTintColor.Value.G, power.info.TargetTintColor.Value.B) / 255f; + mr = mr.WithTint(tint, mr.TintModifiers | TintModifiers.ReplaceColor).WithAlpha(power.info.TargetTintColor.Value.A / 255f); + return mr; + }); + + foreach (var r in renderables) + { + yield return r; + } + } + } + } + + protected override string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi) + { + return ((RecallPowerInfo)power.Info).Cursor; + } + } + } +} diff --git a/OpenRA.Mods.CA/Traits/SupportPowers/RemoveOnPowerActivation.cs b/OpenRA.Mods.CA/Traits/SupportPowers/RemoveOnPowerActivation.cs index 1fa6e41036..80114db005 100644 --- a/OpenRA.Mods.CA/Traits/SupportPowers/RemoveOnPowerActivation.cs +++ b/OpenRA.Mods.CA/Traits/SupportPowers/RemoveOnPowerActivation.cs @@ -1,11 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion diff --git a/OpenRA.Mods.CA/Traits/SupportPowers/RevealActorsPower.cs b/OpenRA.Mods.CA/Traits/SupportPowers/RevealActorsPower.cs index 20f67ade97..eb5449179f 100644 --- a/OpenRA.Mods.CA/Traits/SupportPowers/RevealActorsPower.cs +++ b/OpenRA.Mods.CA/Traits/SupportPowers/RevealActorsPower.cs @@ -1,11 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion diff --git a/OpenRA.Mods.CA/Traits/SupportPowers/SelectDirectionalTargetWithCircle.cs b/OpenRA.Mods.CA/Traits/SupportPowers/SelectDirectionalTargetWithCircle.cs new file mode 100644 index 0000000000..8a96c3ee6a --- /dev/null +++ b/OpenRA.Mods.CA/Traits/SupportPowers/SelectDirectionalTargetWithCircle.cs @@ -0,0 +1,52 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using OpenRA.Graphics; +using OpenRA.Mods.Common.Graphics; +using OpenRA.Mods.Common.Traits; +using OpenRA.Orders; +using OpenRA.Primitives; + +namespace OpenRA.Mods.CA.Traits +{ + public class SelectDirectionalTargetWithCircle : SelectDirectionalTarget, IOrderGenerator + { + WDist targetCircleRange; + Color targetCircleColor; + bool targetCircleUsePlayerColor; + + public SelectDirectionalTargetWithCircle(World world, string order, SupportPowerManager manager, DirectionalSupportPowerInfo info, + WDist targetCircleRange, Color targetCircleColor, bool targetCircleUsePlayerColor) + : base(world, order, manager, info) + { + this.targetCircleRange = targetCircleRange; + this.targetCircleColor = targetCircleColor; + this.targetCircleUsePlayerColor = targetCircleUsePlayerColor; + } + + IEnumerable IOrderGenerator.RenderAnnotations(WorldRenderer wr, World world) + { + if (targetCircleRange == WDist.Zero) + yield break; + + var xy = wr.Viewport.ViewToWorld(Viewport.LastMousePos); + + yield return new RangeCircleAnnotationRenderable( + world.Map.CenterOfCell(xy), + targetCircleRange, + 0, + targetCircleUsePlayerColor ? world.LocalPlayer.Color : targetCircleColor, + 1, + Color.FromArgb(96, Color.Black), + 3); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/SupportPowers/SendCashPower.cs b/OpenRA.Mods.CA/Traits/SupportPowers/SendCashPower.cs new file mode 100644 index 0000000000..8fd36a39dc --- /dev/null +++ b/OpenRA.Mods.CA/Traits/SupportPowers/SendCashPower.cs @@ -0,0 +1,249 @@ +#region Copyright & License Information +/* + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Linq; +using OpenRA.Graphics; +using OpenRA.Mods.Common.Effects; +using OpenRA.Mods.Common.Orders; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Transfers money to the owner of the targeted actor.")] + public class SendCashPowerInfo : SupportPowerInfo + { + [Desc("Amount of money to send. Will send less if the player cannot afford the full amount.")] + public readonly int Amount = 1000; + + [Desc("Percentage of amount sent to be taxed away.")] + public readonly int TaxPercentage = 0; + + [Desc("If true, target player must have available capacity to receive the money.")] + public readonly bool RequireTargetCapacity = false; + + [Desc("The `TargetTypes` from `Targetable` that can be targeted.")] + public readonly BitSet ValidTargets = default; + + [Desc("Target types that cannot be targeted.")] + public readonly BitSet InvalidTargets = default; + + [Desc("Player relationships which can receive money.")] + public readonly PlayerRelationship ValidRelationships = PlayerRelationship.Ally; + + [Desc("Sound to play when sending money.")] + public readonly string OnFireSound = null; + + [Desc("If true, target player cannot have more money than the sender.")] + public readonly bool TargetMustBePoorer = false; + + [NotificationReference("Speech")] + [Desc("Speech notification to play when the player does not have any funds.")] + public readonly string InsufficientFundsNotification = null; + + [FluentReference(optional: true)] + [Desc("Text notification to display when the player does not have any funds.")] + public readonly string InsufficientFundsTextNotification = null; + + public override object Create(ActorInitializer init) { return new SendCashPower(init.Self, this); } + } + + public class SendCashPower : SupportPower + { + readonly SendCashPowerInfo info; + + public SendCashPower(Actor self, SendCashPowerInfo info) + : base(self, info) + { + this.info = info; + } + + public override void SelectTarget(Actor self, string order, SupportPowerManager manager) + { + self.World.OrderGenerator = new SelectSendCashTarget(self.World, order, manager, this); + } + + public override void Activate(Actor self, Order order, SupportPowerManager manager) + { + base.Activate(self, order, manager); + + var target = GetTargetActor(self.World.Map.CellContaining(order.Target.CenterPosition)); + if (target == null) + return; + + var playerResources = self.Owner.PlayerActor.Trait(); + + // first constrain the amount to how much the player can afford to send + var amountToSend = Math.Min(info.Amount, playerResources.GetCashAndResources()); + + if (amountToSend > 0) + { + var targetResources = target.Owner.PlayerActor.Trait(); + var localPlayer = self.World.LocalPlayer; + + // if the target must be poorer, further constrain the amount to send based on the difference between sender and target funds + if (info.TargetMustBePoorer) + { + amountToSend = Math.Max(0, Math.Min(amountToSend, playerResources.GetCashAndResources() - targetResources.GetCashAndResources())); + + if (amountToSend <= 0) + { + var message = $"Cannot send to players with more resources."; + if (localPlayer != null && localPlayer == self.Owner) + TextNotificationsManager.AddChatLine(self.Owner.ClientIndex, "[Team] " + self.Owner.ResolvedPlayerName, message, self.Owner.Color); + return; + } + } + + if (info.RequireTargetCapacity) + { + var capacityAvailable = targetResources.ResourceCapacity - targetResources.Resources; + + if (capacityAvailable <= 0) + { + var message = $"{target.Owner.ResolvedPlayerName} has no storage capacity remaining."; + if (localPlayer != null && localPlayer == self.Owner) + TextNotificationsManager.AddChatLine(self.Owner.ClientIndex, "[Team] " + self.Owner.ResolvedPlayerName, message, self.Owner.Color); + return; + } + + amountToSend = Math.Min(amountToSend, capacityAvailable); + } + + PlayLaunchSounds(); + Game.Sound.Play(SoundType.World, info.OnFireSound, order.Target.CenterPosition); + + playerResources.TakeCash(amountToSend, true); + var taxAmount = 0; + + if (info.TaxPercentage > 0) + { + taxAmount = amountToSend * info.TaxPercentage / 100; + amountToSend -= taxAmount; + amountToSend = Math.Max(1, amountToSend); + } + + if (info.RequireTargetCapacity) + targetResources.GiveResources(amountToSend); + else + targetResources.GiveCash(amountToSend); + + self.World.AddFrameEndTask(w => + { + w.Add(new FloatingText(target.CenterPosition, target.OwnerColor(), FloatingText.FormatCashTick(amountToSend), 30)); + w.Add(new FlashTarget(target, Color.Yellow)); + }); + + if (localPlayer != null && localPlayer.IsAlliedWith(self.Owner)) + { + var message = $"Sent ${amountToSend} to {target.Owner.ResolvedPlayerName}"; + + if (info.TaxPercentage > 0) + message += $" (${amountToSend + taxAmount} - ${taxAmount} tax)"; + + TextNotificationsManager.AddChatLine(self.Owner.ClientIndex, "[Team] " + self.Owner.ResolvedPlayerName, message, self.Owner.Color); + } + + } else { + Game.Sound.PlayNotification(self.World.Map.Rules, self.Owner, "Speech", info.InsufficientFundsNotification, self.Owner.Faction.InternalName); + TextNotificationsManager.AddTransientLine(self.Owner, info.InsufficientFundsTextNotification); + } + } + + public Actor GetTargetActor(CPos xy) + { + var actorsAtCell = Self.World.ActorMap.GetActorsAt(xy); + return actorsAtCell.FirstOrDefault(a => IsValidTarget(a)); + } + + bool IsValidTarget(Actor a) + { + if (a.IsDead || !a.IsInWorld) + return false; + + if (a.Owner == Self.Owner) + return false; + + if (!info.ValidRelationships.HasRelationship(Self.Owner.RelationshipWith(a.Owner))) + return false; + + var enabledTargetTypes = a.GetEnabledTargetTypes(); + + if (!info.ValidTargets.IsEmpty && !info.ValidTargets.Overlaps(enabledTargetTypes)) + return false; + + if (!info.InvalidTargets.IsEmpty && info.InvalidTargets.Overlaps(enabledTargetTypes)) + return false; + + return true; + } + + class SelectSendCashTarget : OrderGenerator + { + readonly SendCashPower power; + readonly SupportPowerManager manager; + readonly string order; + + public SelectSendCashTarget(World world, string order, SupportPowerManager manager, SendCashPower power) + { + // Clear selection if using Left-Click Orders + if (Game.Settings.Game.UseClassicMouseStyle) + world.Selection.Clear(); + + this.manager = manager; + this.order = order; + this.power = power; + } + + protected override IEnumerable OrderInner(World world, CPos cell, int2 worldPixel, MouseInput mi) + { + if (mi.Button == MouseButton.Right) + { + world.CancelInputMode(); + yield break; + } + + var target = power.GetTargetActor(cell); + if (mi.Button == MouseButton.Left && target != null) + { + yield return new Order(order, manager.Self, Target.FromCell(world, cell), false) { SuppressVisualFeedback = true }; + } + } + + protected override IEnumerable RenderAboveShroud(WorldRenderer wr, World world) { yield break; } + + protected override IEnumerable RenderAnnotations(WorldRenderer wr, World world) + { + var xy = wr.Viewport.ViewToWorld(Viewport.LastMousePos); + var target = power.GetTargetActor(xy); + + if (target != null) + { + var decorations = target.TraitsImplementing().FirstEnabledTraitOrDefault(); + if (decorations != null) + { + foreach (var d in decorations.RenderSelectionAnnotations(target, wr, Color.Yellow)) + yield return d; + } + } + } + + protected override IEnumerable Render(WorldRenderer wr, World world) { yield break; } + + protected override string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi) + { + return power.GetTargetActor(cell) != null ? power.info.Cursor : power.info.BlockedCursor; + } + } + } +} diff --git a/OpenRA.Mods.CA/Traits/SupportPowers/SpawnActorPowerCA.cs b/OpenRA.Mods.CA/Traits/SupportPowers/SpawnActorPowerCA.cs index 7aabda82b3..7732e8f0b0 100644 --- a/OpenRA.Mods.CA/Traits/SupportPowers/SpawnActorPowerCA.cs +++ b/OpenRA.Mods.CA/Traits/SupportPowers/SpawnActorPowerCA.cs @@ -1,31 +1,34 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion using System.Collections.Generic; using OpenRA.Graphics; +using OpenRA.Mods.CA.Effects; +using OpenRA.Mods.Common.Effects; using OpenRA.Mods.Common.Graphics; -using OpenRA.Mods.Common.Orders; using OpenRA.Mods.Common.Traits; using OpenRA.Primitives; -using OpenRA.Traits; namespace OpenRA.Mods.CA.Traits { - [Desc("Spawns an actor that stays for a limited amount of time.")] + [Desc("Spawns an actor that stays for a limited amount of time.", + "CA version extends the base version, adding a target circle.")] public class SpawnActorPowerCAInfo : SpawnActorPowerInfo { public readonly WDist TargetCircleRange = WDist.Zero; public readonly Color TargetCircleColor = Color.White; public readonly bool TargetCircleUsePlayerColor = false; + [Desc("Beacon duration.")] + public readonly int BeaconDuration = 0; + public override object Create(ActorInitializer init) { return new SpawnActorPowerCA(init.Self, this); } } @@ -39,46 +42,63 @@ public SpawnActorPowerCA(Actor self, SpawnActorPowerCAInfo info) Info = info; } - public override void SelectTarget(Actor self, string order, SupportPowerManager manager) + public override SupportPowerInstance CreateInstance(string key, SupportPowerManager manager) { - self.World.OrderGenerator = new SelectSpawnActorPowerCATarget(order, manager, this); + return new SupportPowerInstanceCA(key, Info, manager); } - } - - public class SelectSpawnActorPowerCATarget : OrderGenerator - { - readonly SupportPowerManager manager; - readonly string order; - readonly SpawnActorPowerCA power; - public SelectSpawnActorPowerCATarget(string order, SupportPowerManager manager, SpawnActorPowerCA power) + public override void Activate(Actor self, Order order, SupportPowerManager manager) { - // Clear selection if using Left-Click Orders - if (Game.Settings.Game.UseClassicMouseStyle) - manager.Self.World.Selection.Clear(); + base.Activate(self, order, manager); - this.manager = manager; - this.order = order; - this.power = power; + if (Info.DisplayBeacon) + { + var timer = new Countdown(Info.BeaconDuration); + + var beacon = new Beacon( + self.Owner, + order.Target.CenterPosition, + Info.BeaconPaletteIsPlayerPalette, + Info.BeaconPalette, + Info.BeaconImage, + Info.BeaconPoster, + Info.BeaconPosterPalette, + Info.BeaconSequence, + Info.ArrowSequence, + Info.CircleSequence, + Info.ClockSequence, + () => 1 - timer.TicksRemaining / (float)Info.BeaconDuration, + Info.BeaconDelay, + Info.BeaconDuration); + + self.World.AddFrameEndTask(w => { + w.Add(beacon); + w.Add(timer); + }); + } } - protected override IEnumerable OrderInner(World world, CPos cell, int2 worldPixel, MouseInput mi) + public override void SelectTarget(Actor self, string order, SupportPowerManager manager) { - world.CancelInputMode(); - if (mi.Button == MouseButton.Left && world.Map.Contains(cell)) - yield return new Order(order, manager.Self, Target.FromCell(world, cell), false) { SuppressVisualFeedback = true }; - } + Game.Sound.PlayToPlayer(SoundType.UI, manager.Self.Owner, Info.SelectTargetSound); + Game.Sound.PlayNotification(self.World.Map.Rules, self.Owner, "Speech", + Info.SelectTargetSpeechNotification, self.Owner.Faction.InternalName); - protected override void Tick(World world) - { - // Cancel the OG if we can't use the power - if (!manager.Powers.ContainsKey(order)) - world.CancelInputMode(); + TextNotificationsManager.AddTransientLine(manager.Self.Owner, Info.SelectTargetTextNotification); + + self.World.OrderGenerator = new SelectSpawnActorPowerCATarget(order, manager, this, MouseButton.Left); } + } - protected override IEnumerable Render(WorldRenderer wr, World world) { yield break; } + public class SelectSpawnActorPowerCATarget : SelectSpawnActorPowerTarget + { + readonly SpawnActorPowerCA power; - protected override IEnumerable RenderAboveShroud(WorldRenderer wr, World world) { yield break; } + public SelectSpawnActorPowerCATarget(string order, SupportPowerManager manager, SpawnActorPowerCA power, MouseButton button) + : base(order, manager, power, button) + { + this.power = power; + } protected override IEnumerable RenderAnnotations(WorldRenderer wr, World world) { @@ -94,16 +114,11 @@ protected override IEnumerable RenderAnnotations(WorldRenderer wr, world.Map.CenterOfCell(xy), power.Info.TargetCircleRange, 0, - power.Info.TargetCircleUsePlayerColor ? power.Self.Owner.Color : power.Info.TargetCircleColor, + power.Info.TargetCircleUsePlayerColor ? power.Self.OwnerColor() : power.Info.TargetCircleColor, 1, Color.FromArgb(96, Color.Black), 3); } } - - protected override string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi) - { - return world.Map.Contains(cell) ? power.Info.Cursor : "generic-blocked"; - } } } diff --git a/OpenRA.Mods.CA/Traits/SupportPowers/SupportPowerInstanceCA.cs b/OpenRA.Mods.CA/Traits/SupportPowers/SupportPowerInstanceCA.cs new file mode 100644 index 0000000000..6aedead96f --- /dev/null +++ b/OpenRA.Mods.CA/Traits/SupportPowers/SupportPowerInstanceCA.cs @@ -0,0 +1,40 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + + +using OpenRA.Mods.Common.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + // Extends the base SupportPowerInstance to allow modifying the remaining ticks. + public class SupportPowerInstanceCA : SupportPowerInstance + { + public SupportPowerInstanceCA(string key, SupportPowerInfo info, SupportPowerManager manager) + : base(key, info, manager) + { + + } + + public void SetRemainingTicks(int ticks) + { + remainingSubTicks = (ticks * 100).Clamp(0, TotalTicks * 100); + } + + public void AddToRemainingTicks(int ticks) + { + remainingSubTicks = (remainingSubTicks + ticks * 100).Clamp(0, TotalTicks * 100); + } + + public void SubtractFromRemainingTicks(int ticks) + { + remainingSubTicks = (remainingSubTicks - ticks * 100).Clamp(0, TotalTicks * 100); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/TargetSpecificOrderVoice.cs b/OpenRA.Mods.CA/Traits/TargetSpecificOrderVoice.cs new file mode 100644 index 0000000000..39174f0d68 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/TargetSpecificOrderVoice.cs @@ -0,0 +1,65 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Lists valid factions for ProvidesPrerequisiteValidatedFaction.")] + public class TargetSpecificOrderVoiceInfo : TraitInfo + { + [Desc("Order strings which trigger the custom voice line.")] + public readonly HashSet Orders = new(); + + [Desc("The `TargetTypes` from `Targetable` with their corresponding voice lines.")] + public readonly Dictionary TargetTypeVoices = default; + + [VoiceReference] + [Desc("Voice line to use if no target type is matched.")] + public readonly string DefaultVoice = null; + + public override object Create(ActorInitializer init) { return new TargetSpecificOrderVoice(init, this); } + } + + public class TargetSpecificOrderVoice : IOrderVoice + { + public readonly TargetSpecificOrderVoiceInfo Info; + + public TargetSpecificOrderVoice(ActorInitializer init, TargetSpecificOrderVoiceInfo info) + { + Info = info; + } + + string IOrderVoice.VoicePhraseForOrder(Actor self, Order order) + { + if (order.OrderString == null || !Info.Orders.Contains(order.OrderString)) + return null; + + if (order.Target.Type == TargetType.Invalid || order.Target.Type == TargetType.Terrain) + return Info.DefaultVoice; + + var actor = order.Target.Type == TargetType.Actor ? order.Target.Actor : order.Target.FrozenActor.Actor; + + if (actor == null || actor.IsDead) + return Info.DefaultVoice; + + var enabledTargetTypes = actor.GetEnabledTargetTypes(); + var matchingTargetType = enabledTargetTypes.FirstOrDefault(t => Info.TargetTypeVoices.ContainsKey(t)); + + if (matchingTargetType != null) + return Info.TargetTypeVoices[matchingTargetType]; + + return Info.DefaultVoice; + } + } +} diff --git a/OpenRA.Mods.CA/Traits/TargetedAttackAbility.cs b/OpenRA.Mods.CA/Traits/TargetedAttackAbility.cs new file mode 100644 index 0000000000..ad00ad7954 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/TargetedAttackAbility.cs @@ -0,0 +1,416 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Linq; +using OpenRA.Graphics; +using OpenRA.Mods.Common.Graphics; +using OpenRA.Mods.Common.Orders; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + public enum DefaultGroupCastBehaviour { ClosestOnly, All } + + [Desc("Actor can deploy to be able to target a location and fire a weapon at that target.", + "Relies on the armament being paused if the ActiveCondition is not applied.")] + public class TargetedAttackAbilityInfo : PausableConditionalTraitInfo, Requires + { + [VoiceReference] + public readonly string Voice = "Action"; + + [CursorReference] + [Desc("Cursor to display when able to deploy the actor.")] + public readonly string DeployCursor = "deploy"; + + [CursorReference] + [Desc("Cursor to display when unable to deploy the actor.")] + public readonly string DeployBlockedCursor = "deploy-blocked"; + + [CursorReference] + [Desc("Cursor to display when targeting a teleport location.")] + public readonly string TargetCursor = "ability"; + + [CursorReference] + [Desc("Cursor to display when the targeted location is blocked.")] + public readonly string TargetBlockedCursor = "move-blocked"; + + [CursorReference] + [Desc("Cursor to display when targeting a teleport location with modifier key held.")] + public readonly string TargetModifiedCursor = null; + + [Desc("Range circle color.")] + public readonly Color CircleColor = Color.FromArgb(128, Color.LawnGreen); + + [Desc("Range circle line width.")] + public readonly float CircleWidth = 1; + + [Desc("Range circle border color.")] + public readonly Color CircleBorderColor = Color.FromArgb(96, Color.Black); + + [Desc("Range circle border width.")] + public readonly float CircleBorderWidth = 3; + + public readonly WDist TargetCircleRange = WDist.Zero; + public readonly Color TargetCircleColor = Color.White; + + [Desc("Color to use for the target line.")] + public readonly Color TargetLineColor = Color.Magenta; + + [Desc("If true allow targeting frozen actors.")] + public readonly bool TargetFrozenActors = false; + + [Desc("If true allow targeting in shroud.")] + public readonly bool CanTargetShroud = true; + + [GrantedConditionReference] + [Desc("Condition to apply while the targeted ability attack is being carried out.")] + public readonly string ActiveCondition = null; + + [Desc("Name of the armament used to attack with.")] + public readonly string[] ArmamentNames = { "primary" }; + + [Desc("If true, the ability is usable with disabled (or reloading) armament(s).", + "Useful if the ability armament has longer range than standard armament(s) where the ability armament(s) being paused would interfere with their targeting.")] + public readonly bool UseDisabledArmaments = false; + + [Desc("Ability type. When selecting a group, different types will not be activated together.")] + public readonly string Type = null; + + [Desc("If true, the unit will stop attacking after firing the ability.")] + public readonly bool CancelAfterAttack = false; + + [Desc("If true, the condition will persist until attack is manually cancelled or target is changed, otherwise it will be removed after firing a single burst.")] + public readonly bool ActiveUntilCancelled = false; + + [Desc("Ammo pool to use for the ability. If set, having ammo will determine whether the ability can be activated,", + "otherwise this is determined by the armament being not disabled and not reloading.")] + public readonly string AmmoPool = null; + + [Desc("Use ClosestOnly so only the unit closest to the target will fire, or All so all will fire. Force firing will result in the opposite.")] + public readonly DefaultGroupCastBehaviour DefaultGroupCastBehaviour = DefaultGroupCastBehaviour.ClosestOnly; + + public override object Create(ActorInitializer init) { return new TargetedAttackAbility(init, this); } + } + + public class TargetedAttackAbility : PausableConditionalTrait, INotifyCreated, IIssueOrder, IResolveOrder, + IOrderVoice, IIssueDeployOrder, INotifyBurstComplete + { + public new readonly TargetedAttackAbilityInfo Info; + public readonly IEnumerable Armaments; + readonly AttackBase attack; + int conditionToken = Actor.InvalidConditionToken; + bool activated; + AmmoPool ammoPool; + public bool Activated => activated; + + public TargetedAttackAbility(ActorInitializer init, TargetedAttackAbilityInfo info) + : base(info) + { + Info = info; + Armaments = init.Self.TraitsImplementing() + .Where(a => Info.ArmamentNames.Contains(a.Info.Name)); + + if (Info.AmmoPool != null) + ammoPool = init.Self.TraitsImplementing().Single(a => a.Info.Name == Info.AmmoPool); + + attack = init.Self.Trait(); + activated = false; + } + + Order IIssueDeployOrder.IssueDeployOrder(Actor self, bool queued) + { + // HACK: Switch the global order generator instead of actually issuing an order + if (IsAvailable) + self.World.OrderGenerator = new TargetedAttackAbilityOrderGenerator(self, this); + + // HACK: We need to issue a fake order to stop the game complaining about the bodge above + return new Order("TargetedAttackAbilityDeploy", self, Target.Invalid, queued); + } + + bool IIssueDeployOrder.CanIssueDeployOrder(Actor self, bool queued) { return !IsTraitPaused && !IsTraitDisabled; } + + public IEnumerable Orders + { + get + { + if (IsTraitDisabled) + yield break; + + yield return new DeployOrderTargeter("TargetedAttackAbilityDeploy", 5, + () => IsAvailable ? Info.DeployCursor : Info.DeployBlockedCursor); + } + } + + Order IIssueOrder.IssueOrder(Actor self, IOrderTargeter order, in Target target, bool queued) + { + if (order.OrderID == "TargetedAttackAbilityDeploy") + { + // HACK: Switch the global order generator instead of actually issuing an order + if (IsAvailable) + self.World.OrderGenerator = new TargetedAttackAbilityOrderGenerator(self, this); + + // HACK: We need to issue a fake order to stop the game complaining about the bodge above + return new Order(order.OrderID, self, Target.Invalid, queued); + } + + if (order.OrderID == "TargetedAttackAbilityAttack") + return new Order(order.OrderID, self, target, queued); + + return null; + } + + void IResolveOrder.ResolveOrder(Actor self, Order order) + { + if (IsTraitDisabled) + return; + + if (order.OrderString == "TargetedAttackAbilityAttack" && order.Target.Type != TargetType.Invalid) + { + Enable(self); + attack.AttackTarget(order.Target, AttackSource.Default, order.Queued, true, true, Info.TargetLineColor); + } + else if (order.OrderString != "TargetedAttackAbilityDeploy") + { + Disable(self); + } + } + + string IOrderVoice.VoicePhraseForOrder(Actor self, Order order) + { + return order.OrderString == "TargetedAttackAbilityAttack" ? Info.Voice : null; + } + + public bool IsAvailable + { + get + { + return !IsTraitDisabled + && !IsTraitPaused + && ((ammoPool != null && ammoPool.HasAmmo) || (ammoPool == null && Armaments.Any(a => Info.UseDisabledArmaments || (!a.IsTraitDisabled && !a.IsReloading)))); + } + } + + void Enable(Actor self) + { + activated = true; + if (conditionToken == Actor.InvalidConditionToken) + conditionToken = self.GrantCondition(Info.ActiveCondition); + } + + void Disable(Actor self) + { + activated = false; + if (conditionToken != Actor.InvalidConditionToken) + conditionToken = self.RevokeCondition(conditionToken); + } + + void INotifyBurstComplete.FiredBurst(Actor self, in Target target, Armament a) + { + if (!Info.ArmamentNames.Contains(a.Info.Name)) + return; + + if (target.Type == TargetType.Terrain || target.Type == TargetType.Invalid || Info.CancelAfterAttack) + self.CancelActivity(); + + if (!Info.ActiveUntilCancelled) + Disable(self); + } + + protected override void TraitDisabled(Actor self) + { + Disable(self); + } + + protected override void TraitPaused(Actor self) + { + Disable(self); + } + } + + class TargetedAttackAbilityOrderGenerator : OrderGenerator + { + readonly Actor self; + readonly TargetedAttackAbility ability; + readonly TargetedAttackAbilityInfo info; + IEnumerable> currentlySelectedWithAbility; + HashSet issuedTo; + + public TargetedAttackAbilityOrderGenerator(Actor self, TargetedAttackAbility ability) + { + this.self = self; + this.ability = ability; + info = ability.Info; + issuedTo = new HashSet(); + UpdateCurrentlySelectedWithAbility(); + } + + void UpdateCurrentlySelectedWithAbility() + { + currentlySelectedWithAbility = self.World.Selection.Actors + .Where(a => a.Info.HasTraitInfo() && a.Owner == self.Owner && !a.IsDead) + .Select(a => new TraitPair(a, a.TraitOrDefault())) + .Where(s => s.Trait != null && s.Trait.Info.Type == ability.Info.Type); + } + + bool AvailableAmongSelected() + { + return currentlySelectedWithAbility.Any(t => t.Trait.IsAvailable); + } + + protected override IEnumerable OrderInner(World world, CPos cell, int2 worldPixel, MouseInput mi) + { + if (mi.Button == MouseButton.Right) + { + world.CancelInputMode(); + yield break; + } + + if (self.IsInWorld && (info.CanTargetShroud || self.Owner.Shroud.IsExplored(cell))) + { + var underCursor = world.ScreenMap.ActorsAtMouse(mi) + .Select(a => a.Actor) + .FirstOrDefault(a => !world.FogObscures(a)); + + var target = Target.Invalid; + + if (underCursor != null) + { + target = underCursor != null ? Target.FromActor(underCursor) : Target.FromCell(world, cell); + } + else if (info.TargetFrozenActors) + { + var frozenUnderCursor = world.ScreenMap.FrozenActorsAtMouse(world.RenderPlayer, mi).FirstOrDefault(); + target = frozenUnderCursor != null ? Target.FromFrozenActor(frozenUnderCursor) : Target.FromCell(world, cell); + } + else + { + target = Target.FromCell(world, cell); + } + + if (!ability.Armaments.Any(a => a.Weapon.IsValidAgainst(target, world, self))) + yield break; + + UpdateCurrentlySelectedWithAbility(); + + var selectedOrderedByDistance = currentlySelectedWithAbility + .Where(a => a.Actor.IsInWorld && a.Trait.IsAvailable && !issuedTo.Contains(a.Actor)) + .OrderBy(a => a.Trait.Activated) + .ThenBy(a => (a.Actor.CenterPosition - target.CenterPosition).Length) + .ToList(); + + var closestOnly = (info.DefaultGroupCastBehaviour == DefaultGroupCastBehaviour.ClosestOnly && !mi.Modifiers.HasModifier(Modifiers.Ctrl)) + || (info.DefaultGroupCastBehaviour == DefaultGroupCastBehaviour.All && mi.Modifiers.HasModifier(Modifiers.Ctrl)); + + if (closestOnly) + { + if (selectedOrderedByDistance.Count == 0) + { + world.CancelInputMode(); + yield break; + } + + var closest = selectedOrderedByDistance.First(); + + if (closest.Trait.Activated) + { + world.CancelInputMode(); + yield break; + } + + yield return new Order("TargetedAttackAbilityAttack", closest.Actor, target, mi.Modifiers.HasModifier(Modifiers.Shift)); + issuedTo.Add(closest.Actor); + + if (selectedOrderedByDistance.Count == 1) + world.CancelInputMode(); + } + else + { + foreach (var s in selectedOrderedByDistance) + yield return new Order("TargetedAttackAbilityAttack", s.Actor, target, mi.Modifiers.HasModifier(Modifiers.Shift)); + + world.CancelInputMode(); + } + } + } + + protected override void SelectionChanged(World world, IEnumerable selected) + { + if (!selected.Contains(self)) + world.CancelInputMode(); + } + + protected override void Tick(World world) + { + if (ability.IsTraitDisabled || ability.IsTraitPaused) + { + world.CancelInputMode(); + } + } + + protected override IEnumerable Render(WorldRenderer wr, World world) { yield break; } + + protected override IEnumerable RenderAboveShroud(WorldRenderer wr, World world) { yield break; } + + protected override IEnumerable RenderAnnotations(WorldRenderer wr, World world) + { + if (!self.IsInWorld || self.Owner != self.World.LocalPlayer) + yield break; + + if (ability.Armaments.Max(a => a.MaxRange()) == WDist.Zero) + yield break; + + if (info.CircleWidth > 0) + { + foreach (var other in currentlySelectedWithAbility) + { + if (other.Actor.IsInWorld && other.Trait.IsAvailable && self.Owner == self.World.LocalPlayer) + { + yield return new RangeCircleAnnotationRenderable( + other.Actor.CenterPosition + new WVec(0, other.Actor.CenterPosition.Z, 0), + other.Trait.Armaments.Max(a => a.MaxRange()), + 0, + other.Trait.Info.CircleColor, + other.Trait.Info.CircleWidth, + other.Trait.Info.CircleBorderColor, + other.Trait.Info.CircleBorderWidth); + } + } + } + + if (ability.Info.TargetCircleRange > WDist.Zero) + { + var xy = wr.Viewport.ViewToWorld(Viewport.LastMousePos); + + yield return new RangeCircleAnnotationRenderable( + world.Map.CenterOfCell(xy), + ability.Info.TargetCircleRange, + 0, + ability.Info.TargetCircleColor, + 1, + Color.FromArgb(96, Color.Black), + 3); + } + } + + protected override string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi) + { + if (self.IsInWorld && self.Location != cell + && AvailableAmongSelected() + && (info.CanTargetShroud || self.Owner.Shroud.IsExplored(cell))) + return info.TargetModifiedCursor != null && mi.Modifiers.HasModifier(Modifiers.Ctrl) ? info.TargetModifiedCursor : info.TargetCursor; + else + return info.TargetBlockedCursor; + } + } +} diff --git a/OpenRA.Mods.CA/Traits/TargetedDiveAbility.cs b/OpenRA.Mods.CA/Traits/TargetedDiveAbility.cs new file mode 100644 index 0000000000..50b41b1b88 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/TargetedDiveAbility.cs @@ -0,0 +1,64 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using OpenRA.Mods.CA.Activities; +using OpenRA.Mods.Common.Activities; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Allows unit to dive to a targeted location.")] + public class TargetedDiveAbilityInfo : TargetedMovementAbilityInfo, Requires + { + [ActorReference] + [Desc("Actor to transform into when the dive is complete.")] + public readonly string TransformIntoActor = null; + + public override object Create(ActorInitializer init) { return new TargetedDiveAbility(init.Self, this); } + } + + public class TargetedDiveAbility : TargetedMovementAbility + { + public readonly new TargetedDiveAbilityInfo Info; + readonly Aircraft aircraft; + + public override string DeployOrderID => "TargetedDiveOrderTargeterDeploy"; + public override string MovementOrderID => "TargetedDiveOrderDive"; + + public TargetedDiveAbility(Actor self, TargetedDiveAbilityInfo info) + : base(self, info) + { + Info = info; + aircraft = self.Trait(); + } + + protected override void QueueMovementActivity(Actor self, Target target) + { + var diveTarget = Target.FromCell(self.World, self.World.Map.CellContaining(target.CenterPosition)); + Action onDiveComplete = () => + { + if (Info.TransformIntoActor != null) + { + var transform = new InstantTransform(self, Info.TransformIntoActor); + self.CancelActivity(); + self.QueueActivity(transform); + } + }; + + // Fixed-wing aircraft must be aligned and have enough run-up to descend within MaximumPitch. + if (!aircraft.Info.CanHover) + self.QueueActivity(new DiveApproach(diveTarget, aircraft)); + + self.QueueActivity(new Dive(diveTarget, aircraft, Info.Speed, onDiveComplete)); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/TargetedLeapAbility.cs b/OpenRA.Mods.CA/Traits/TargetedLeapAbility.cs new file mode 100644 index 0000000000..9327422d7b --- /dev/null +++ b/OpenRA.Mods.CA/Traits/TargetedLeapAbility.cs @@ -0,0 +1,54 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Mods.CA.Activities; +using OpenRA.Mods.Common.Activities; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Allows unit to leap to a targeted location.")] + public class TargetedLeapAbilityInfo : TargetedMovementAbilityInfo, Requires + { + [GrantedConditionReference] + [Desc("The condition to grant while leaping.")] + public readonly string LeapCondition = null; + + public override object Create(ActorInitializer init) { return new TargetedLeapAbility(init.Self, this); } + } + + public class TargetedLeapAbility : TargetedMovementAbility + { + public readonly new TargetedLeapAbilityInfo Info; + readonly Mobile mobile; + + public override string DeployOrderID => "TargetedLeapOrderTargeterDeploy"; + public override string MovementOrderID => "TargetedLeapOrderLeap"; + + public TargetedLeapAbility(Actor self, TargetedLeapAbilityInfo info) + : base(self, info) + { + Info = info; + mobile = self.Trait(); + } + + protected override void QueueMovementActivity(Actor self, Target target) + { + if (facing != null) + { + var desiredFacing = (target.CenterPosition - self.CenterPosition).Yaw; + self.QueueActivity(new Turn(self, desiredFacing)); + } + + self.QueueActivity(new TargetedLeap(self, self.World.Map.CellContaining(target.CenterPosition), this, mobile, facing, WAngle.FromDegrees(60))); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/TargetedMovementAbility.cs b/OpenRA.Mods.CA/Traits/TargetedMovementAbility.cs new file mode 100644 index 0000000000..2313c9e700 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/TargetedMovementAbility.cs @@ -0,0 +1,427 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.Graphics; +using OpenRA.Mods.Common.Graphics; +using OpenRA.Mods.Common.Orders; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Allows unit to leap to a targeted location.")] + public abstract class TargetedMovementAbilityInfo : PausableConditionalTraitInfo, Requires, Requires + { + [Desc("Cooldown in ticks until the unit can teleport.")] + public readonly int ChargeDelay = 25; + + [Desc("The minimum distance in cells this unit can teleport.")] + public readonly int MinDistance = 0; + + [Desc("The maximum distance in cells this unit can teleport.")] + public readonly int MaxDistance = 10; + + [Desc("Leap speed (in WDist units/tick).")] + public readonly int Speed = 150; + + [Desc("Possible sounds to play when taking off.")] + public readonly string[] TakeOffSounds = null; + + [Desc("Possible sounds to play when landing.")] + public readonly string[] LandingSounds = null; + + [CursorReference] + [Desc("Cursor to display when able to deploy the actor.")] + public readonly string DeployCursor = "deploy"; + + [CursorReference] + [Desc("Cursor to display when unable to deploy the actor.")] + public readonly string DeployBlockedCursor = "deploy-blocked"; + + [CursorReference] + [Desc("Cursor to display when targeting a teleport location.")] + public readonly string TargetCursor = "ability"; + + [CursorReference] + [Desc("Cursor to display when the targeted location is blocked.")] + public readonly string TargetBlockedCursor = "move-blocked"; + + [VoiceReference] + public readonly string Voice = "Action"; + + [Desc("Range circle color.")] + public readonly Color CircleColor = Color.FromArgb(128, Color.LawnGreen); + + [Desc("Range circle line width.")] + public readonly float CircleWidth = 1; + + [Desc("Range circle border color.")] + public readonly Color CircleBorderColor = Color.FromArgb(96, Color.Black); + + [Desc("Range circle border width.")] + public readonly float CircleBorderWidth = 3; + + [Desc("Color to use for the target line.")] + public readonly Color TargetLineColor = Color.LawnGreen; + + [Desc("Number of charges.")] + public readonly int Charges = 1; + + [Desc("If true, gain max charges after recharging.")] + public readonly bool RechargeToMax = false; + + [Desc("If true recharge will reset any ongoing recharge on teleport.")] + public readonly bool ResetRechargeOnUse = true; + + [Desc("Cooldown between jumps (irrespective of charge).")] + public readonly int Cooldown = 0; + + public readonly bool ShowSelectionBar = true; + public readonly bool ShowSelectionBarWhenFull = true; + + [Desc("Selection bar color.")] + public readonly Color SelectionBarColor = Color.Magenta; + + public readonly bool ShowCooldownSelectionBar = false; + + [Desc("Cooldown selection bar color.")] + public readonly Color CooldownSelectionBarColor = Color.Silver; + + [CursorReference] + [Desc("Cursor to display when targeting a teleport location with modifier key held.")] + public readonly string TargetModifiedCursor = null; + + public abstract override object Create(ActorInitializer init); + } + + public abstract class TargetedMovementAbility : PausableConditionalTrait, IIssueOrder, IResolveOrder, ITick, ISelectionBar, IOrderVoice, ISync, IIssueDeployOrder + { + public readonly new TargetedMovementAbilityInfo Info; + readonly IPositionable positionable; + readonly IMove move; + protected IFacing facing; + + [Sync] + int chargeTick = 0; + + [Sync] + int cooldownTicks = 0; + + public int ChargeDelay { get; } + public int MaxDistance { get; } + public int MaxCharges { get; } + public int Charges { get; private set; } + + public abstract string DeployOrderID { get; } + public abstract string MovementOrderID { get; } + + public TargetedMovementAbility(Actor self, TargetedMovementAbilityInfo info) + : base(info) + { + Info = info; + positionable = self.Trait(); + move = self.Trait(); + ChargeDelay = Info.ChargeDelay; + MaxDistance = Info.MaxDistance; + MaxCharges = Info.Charges; + Charges = Info.Charges; + } + + protected override void Created(Actor self) + { + base.Created(self); + facing = self.TraitOrDefault(); + } + + void ITick.Tick(Actor self) + { + if (IsTraitDisabled || IsTraitPaused) + return; + + if (cooldownTicks > 0) + cooldownTicks--; + + if (chargeTick > 0) + { + chargeTick--; + + if (chargeTick == 0) + { + if (Info.RechargeToMax) + { + Charges = MaxCharges; + } + else + { + if (Charges < MaxCharges) + Charges++; + + if (Charges < MaxCharges) + ResetChargeTime(); + } + } + } + } + + Order IIssueDeployOrder.IssueDeployOrder(Actor self, bool queued) + { + // HACK: Switch the global order generator instead of actually issuing an order + if (CanPerformMovement) + self.World.OrderGenerator = new TargetedMovementOrderGenerator(self, this, positionable); + + // HACK: We need to issue a fake order to stop the game complaining about the bodge above + return new Order(DeployOrderID, self, Target.Invalid, queued); + } + + bool IIssueDeployOrder.CanIssueDeployOrder(Actor self, bool queued) { return !IsTraitPaused && !IsTraitDisabled; } + + public IEnumerable Orders + { + get + { + if (IsTraitDisabled) + yield break; + + yield return new TargetedMovementOrderTargeter(MovementOrderID, Info.TargetCursor); + yield return new DeployOrderTargeter(DeployOrderID, 5, + () => CanPerformMovement ? Info.DeployCursor : Info.DeployBlockedCursor); + } + } + + public Order IssueOrder(Actor self, IOrderTargeter order, in Target target, bool queued) + { + if (order.OrderID == DeployOrderID) + { + // HACK: Switch the global order generator instead of actually issuing an order + if (CanPerformMovement) + self.World.OrderGenerator = new TargetedMovementOrderGenerator(self, this, positionable); + + // HACK: We need to issue a fake order to stop the game complaining about the bodge above + return new Order(order.OrderID, self, Target.Invalid, queued); + } + + if (order.OrderID == MovementOrderID) + return new Order(order.OrderID, self, target, queued); + + return null; + } + + public void ResolveOrder(Actor self, Order order) + { + if (order.OrderString == MovementOrderID && CanPerformMovement && order.Target.Type != TargetType.Invalid) + { + if (!order.Queued) + self.CancelActivity(); + + var cell = self.World.Map.CellContaining(order.Target.CenterPosition); + + self.QueueActivity(move.MoveWithinRange(order.Target, WDist.FromCells(Info.MinDistance), WDist.FromCells(Info.MaxDistance), targetLineColor: Info.TargetLineColor)); + + QueueMovementActivity(self, order.Target); + + self.ShowTargetLines(); + } + } + + protected abstract void QueueMovementActivity(Actor self, Target target); + + string IOrderVoice.VoicePhraseForOrder(Actor self, Order order) + { + return order.OrderString == MovementOrderID && CanPerformMovement ? Info.Voice : null; + } + + public void ConsumeCharge() + { + cooldownTicks = Info.Cooldown; + + Charges--; + + if (Info.ResetRechargeOnUse || chargeTick == 0) + ResetChargeTime(); + } + + public void ResetChargeTime() + { + chargeTick = ChargeDelay; + } + + public bool CanPerformMovement => !IsTraitDisabled && !IsTraitPaused && Charges > 0 && cooldownTicks == 0; + + float ISelectionBar.GetValue() + { + if (IsTraitDisabled) + return 0f; + + if (Info.ShowCooldownSelectionBar && cooldownTicks > 0 && Charges > 0) + return (float)(Info.Cooldown - cooldownTicks) / Info.Cooldown; + + if (!Info.ShowSelectionBar || chargeTick == ChargeDelay) + return 0f; + + if (!Info.ShowSelectionBarWhenFull && chargeTick == 0) + return 0f; + + return (float)(ChargeDelay - chargeTick) / ChargeDelay; + } + + Color ISelectionBar.GetColor() { return Info.ShowCooldownSelectionBar && cooldownTicks > 0 && Charges > 0 ? Info.CooldownSelectionBarColor : Info.SelectionBarColor; } + bool ISelectionBar.DisplayWhenEmpty => false; + } + + class TargetedMovementOrderTargeter : IOrderTargeter + { + readonly string targetCursor; + + public TargetedMovementOrderTargeter(string MovementOrderID, string targetCursor) + { + OrderID = MovementOrderID; + this.targetCursor = targetCursor; + } + + public string OrderID { get; } + public int OrderPriority => 5; + public bool IsQueued { get; protected set; } + public bool TargetOverridesSelection(Actor self, in Target target, List actorsAt, CPos xy, TargetModifiers modifiers) { return true; } + + public bool CanTarget(Actor self, in Target target, ref TargetModifiers modifiers, ref string cursor) + { + if (modifiers.HasModifier(TargetModifiers.ForceMove)) + { + var xy = self.World.Map.CellContaining(target.CenterPosition); + + IsQueued = modifiers.HasModifier(TargetModifiers.ForceQueue); + + if (self.IsInWorld && self.Owner.Shroud.IsExplored(xy)) + { + cursor = targetCursor; + return true; + } + } + + return false; + } + } + + class TargetedMovementOrderGenerator : OrderGenerator + { + readonly Actor self; + readonly IPositionable positionable; + readonly TargetedMovementAbility ability; + readonly TargetedMovementAbilityInfo info; + readonly IEnumerable> selectedWithAbility; + + public TargetedMovementOrderGenerator(Actor self, TargetedMovementAbility ability, IPositionable positionable) + { + this.self = self; + this.positionable = positionable; + this.ability = ability; + info = ability.Info; + + selectedWithAbility = self.World.Selection.Actors + .Where(a => a.Info.HasTraitInfo() && a.Owner == self.Owner && !a.IsDead) + .Select(a => new TraitPair(a, a.Trait())); + } + + protected override IEnumerable OrderInner(World world, CPos cell, int2 worldPixel, MouseInput mi) + { + if (mi.Button == MouseButton.Right) + { + world.CancelInputMode(); + yield break; + } + + if (self.IsInWorld + && self.Location != cell + && self.Trait().CanPerformMovement + && self.Owner.Shroud.IsExplored(cell) + && positionable.CanEnterCell(cell) + ) { + world.CancelInputMode(); + var targetCell = Target.FromCell(world, cell); + + var selectedOrderedByDistance = selectedWithAbility + .Where(a => !a.Actor.IsDead + && a.Actor.Owner == self.Owner + && a.Actor.IsInWorld + && a.Trait.CanPerformMovement) + .OrderBy(a => (a.Actor.CenterPosition - targetCell.CenterPosition).Length); + + if (mi.Modifiers.HasModifier(Modifiers.Ctrl)) + { + var closest = selectedOrderedByDistance.First(); + yield return new Order(ability.MovementOrderID, closest.Actor, targetCell, mi.Modifiers.HasModifier(Modifiers.Shift)); + } + else + { + foreach (var s in selectedOrderedByDistance) + yield return new Order(ability.MovementOrderID, s.Actor, targetCell, mi.Modifiers.HasModifier(Modifiers.Shift)); + } + } + } + + protected override void SelectionChanged(World world, IEnumerable selected) + { + if (!selected.Contains(self)) + world.CancelInputMode(); + } + + protected override void Tick(World world) + { + if (ability.IsTraitDisabled || ability.IsTraitPaused) + { + world.CancelInputMode(); + return; + } + } + + protected override IEnumerable Render(WorldRenderer wr, World world) { yield break; } + + protected override IEnumerable RenderAboveShroud(WorldRenderer wr, World world) { yield break; } + + protected override IEnumerable RenderAnnotations(WorldRenderer wr, World world) + { + if (!self.IsInWorld || self.Owner != self.World.LocalPlayer) + yield break; + + if (info.CircleWidth > 0) + { + foreach (var s in selectedWithAbility) + { + if (s.Actor.IsInWorld && s.Trait.CanPerformMovement && self.Owner == self.World.LocalPlayer) + { + yield return new RangeCircleAnnotationRenderable( + s.Actor.CenterPosition + new WVec(0, s.Actor.CenterPosition.Z, 0), + WDist.FromCells(s.Trait.Info.MaxDistance), + 0, + s.Trait.Info.CircleColor, + s.Trait.Info.CircleWidth, + s.Trait.Info.CircleBorderColor, + s.Trait.Info.CircleBorderWidth); + } + } + } + } + + protected override string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi) + { + if (self.IsInWorld + && self.Location != cell + && ability.CanPerformMovement + && self.Owner.Shroud.IsExplored(cell) + && positionable.CanEnterCell(cell)) + return info.TargetModifiedCursor != null && mi.Modifiers.HasModifier(Modifiers.Ctrl) ? info.TargetModifiedCursor : info.TargetCursor; + else + return info.TargetBlockedCursor; + } + } +} diff --git a/OpenRA.Mods.CA/Traits/TeleportNetwork.cs b/OpenRA.Mods.CA/Traits/TeleportNetwork.cs index 54b7e39277..a6e2ad478a 100644 --- a/OpenRA.Mods.CA/Traits/TeleportNetwork.cs +++ b/OpenRA.Mods.CA/Traits/TeleportNetwork.cs @@ -1,11 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2019-2020 The OpenHV Developers (see CREDITS) - * This file is part of OpenHV, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -49,7 +48,7 @@ public class TeleportNetworkInfo : TraitInfo, IRulesetLoaded public void RulesetLoaded(Ruleset rules, ActorInfo ai) { if (!rules.Actors["player"].TraitInfos().Any(q => Type == q.Type)) - throw new YamlException("Can't find a TeleportNetworkManager with Type '{0}'".F(Type)); + throw new YamlException($"Can't find a TeleportNetworkManager with Type '{Type}'"); } public override object Create(ActorInitializer init) { return new TeleportNetwork(this); } diff --git a/OpenRA.Mods.CA/Traits/TeleportNetworkPrimaryExit.cs b/OpenRA.Mods.CA/Traits/TeleportNetworkPrimaryExit.cs index cded4914b4..6f3fb62514 100644 --- a/OpenRA.Mods.CA/Traits/TeleportNetworkPrimaryExit.cs +++ b/OpenRA.Mods.CA/Traits/TeleportNetworkPrimaryExit.cs @@ -1,11 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2019-2020 The OpenHV Developers (see CREDITS) - * This file is part of OpenHV, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -40,6 +39,9 @@ public class TeleportNetworkPrimaryExitInfo : TraitInfo, Requires Orders { - get { yield return new DeployOrderTargeter("TeleportNetworkPrimaryExit", 1); } + get { yield return new DeployOrderTargeter("TeleportNetworkPrimaryExit", 1, () => info.DeployCursor); } } Order IIssueOrder.IssueOrder(Actor self, IOrderTargeter order, in Target target, bool queued) diff --git a/OpenRA.Mods.CA/Traits/TeleportNetworkTransportable.cs b/OpenRA.Mods.CA/Traits/TeleportNetworkTransportable.cs index 9ab12bf3fa..6eaaf3470a 100644 --- a/OpenRA.Mods.CA/Traits/TeleportNetworkTransportable.cs +++ b/OpenRA.Mods.CA/Traits/TeleportNetworkTransportable.cs @@ -1,16 +1,14 @@ #region Copyright & License Information -/* - * Copyright 2019-2020 The OpenHV Developers (see CREDITS) - * This file is part of OpenHV, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion using System.Collections.Generic; -using System.Linq; using OpenRA.Mods.CA.Activities; using OpenRA.Mods.CA.Traits; using OpenRA.Mods.Common.Orders; diff --git a/OpenRA.Mods.CA/Traits/TooltipExtras.cs b/OpenRA.Mods.CA/Traits/TooltipExtras.cs new file mode 100644 index 0000000000..2770d51cec --- /dev/null +++ b/OpenRA.Mods.CA/Traits/TooltipExtras.cs @@ -0,0 +1,52 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Extra tooltip items.")] + public class TooltipExtrasInfo : ConditionalTraitInfo + { + [Desc("Description.")] + public readonly string Description = ""; + + [Desc("Strengths.")] + public readonly string Strengths = ""; + + [Desc("Weaknesses.")] + public readonly string Weaknesses = ""; + + [Desc("Attributes.")] + public readonly string Attributes = ""; + + [ActorReference] + [Desc("If set, will use name, price and description of this actor for selection tooltip.")] + public readonly string FakeActor = null; + + [Desc("If true these tooltip extras are standard (used for the production tooltip).", + "Otherwise they're only used for selection tooltip for actors where the conditions are met.")] + public readonly bool IsStandard = true; + + public override object Create(ActorInitializer init) { return new TooltipExtras(init, this); } + } + + public class TooltipExtras : ConditionalTrait + { + public new readonly TooltipExtrasInfo Info; + + public TooltipExtras(ActorInitializer init, TooltipExtrasInfo info) + : base(info) + { + Info = info; + } + } +} diff --git a/OpenRA.Mods.CA/Traits/TracksCapturedFaction.cs b/OpenRA.Mods.CA/Traits/TracksCapturedFaction.cs new file mode 100644 index 0000000000..d7d85ec506 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/TracksCapturedFaction.cs @@ -0,0 +1,35 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Saves to a list of captured factions to make captured production as accurate as possible.")] + public class TracksCapturedFactionInfo : TraitInfo + { + public override object Create(ActorInitializer init) { return new TracksCapturedFaction(this, init.Self); } + } + + public class TracksCapturedFaction : INotifyOwnerChanged + { + public TracksCapturedFaction(TracksCapturedFactionInfo info, Actor self) { } + + void INotifyOwnerChanged.OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) + { + var manager = newOwner.PlayerActor.TraitOrDefault(); + + if (manager == null) + return; + + manager.AddFaction(oldOwner.Faction.InternalName); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/TransferResourcesOnTransform.cs b/OpenRA.Mods.CA/Traits/TransferResourcesOnTransform.cs new file mode 100644 index 0000000000..d1d7f8f69b --- /dev/null +++ b/OpenRA.Mods.CA/Traits/TransferResourcesOnTransform.cs @@ -0,0 +1,59 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + public class TransferResourcesOnTransformInfo : ConditionalTraitInfo, Requires + { + public override object Create(ActorInitializer init) { return new TransferResourcesOnTransform(init, this); } + } + + public class TransferResourcesOnTransform : ConditionalTrait, INotifyTransform + { + readonly IStoresResources storesResources; + IReadOnlyDictionary contents; + + public TransferResourcesOnTransform(ActorInitializer init, TransferResourcesOnTransformInfo info) + : base(info) + { + storesResources = init.Self.TraitsImplementing().First(); + } + + void INotifyTransform.AfterTransform(Actor toActor) + { + var newHarvester = toActor.TraitOrDefault(); + + if (newHarvester == null || newHarvester.IsTraitDisabled) + return; + + foreach (var resource in contents) + { + var amt = resource.Value; + while (!newHarvester.IsFull && amt-- > 0) + newHarvester.AddResource(toActor, resource.Key); + } + } + + void INotifyTransform.BeforeTransform(Actor self) + { + if (IsTraitDisabled) + return; + + contents = storesResources.Contents; + } + + void INotifyTransform.OnTransform(Actor self) {} + } +} diff --git a/OpenRA.Mods.CA/Traits/TurnOnIdleCA.cs b/OpenRA.Mods.CA/Traits/TurnOnIdleCA.cs new file mode 100644 index 0000000000..91341a05d8 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/TurnOnIdleCA.cs @@ -0,0 +1,71 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Mods.Common; +using OpenRA.Mods.Common.Activities; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Turns actor randomly when idle.", + "CA version applies to aircraft and allows turning when mobile trait is paused.")] + class TurnOnIdleCAInfo : ConditionalTraitInfo, Requires + { + [Desc("Minimum amount of ticks the actor will wait before the turn.")] + public readonly int MinDelay = 400; + + [Desc("Maximum amount of ticks the actor will wait before the turn.")] + public readonly int MaxDelay = 800; + + [Desc("Continue turning while aircraft trait is paused.")] + public readonly bool TurnWhileAircraftPaused = false; + + public override object Create(ActorInitializer init) { return new TurnOnIdleCA(init, this); } + } + + class TurnOnIdleCA : ConditionalTrait, ITick + { + int currentDelay; + WAngle targetFacing; + readonly Aircraft aircraft; + + public TurnOnIdleCA(ActorInitializer init, TurnOnIdleCAInfo info) + : base(info) + { + currentDelay = init.World.SharedRandom.Next(Info.MinDelay, Info.MaxDelay); + aircraft = init.Self.Trait(); + targetFacing = aircraft.Facing; + } + + void ITick.Tick(Actor self) + { + if (IsTraitDisabled) + return; + + if (aircraft.IsTraitDisabled || (aircraft.IsTraitPaused && !Info.TurnWhileAircraftPaused)) + return; + + if (!(self.CurrentActivity is FlyIdle)) + return; + + if (--currentDelay > 0) + return; + + if (targetFacing == aircraft.Facing) + { + targetFacing = new WAngle(self.World.SharedRandom.Next(1024)); + currentDelay = self.World.SharedRandom.Next(Info.MinDelay, Info.MaxDelay); + } + + aircraft.Facing = Util.TickFacing(aircraft.Facing, targetFacing, aircraft.TurnSpeed); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/TurretedFloating.cs b/OpenRA.Mods.CA/Traits/TurretedFloating.cs index 5c72d25045..6a8ead9327 100644 --- a/OpenRA.Mods.CA/Traits/TurretedFloating.cs +++ b/OpenRA.Mods.CA/Traits/TurretedFloating.cs @@ -1,10 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -39,25 +39,27 @@ protected override void Tick(Actor self) if (IsTraitDisabled) return; - if (lastBodyFacing != null) + if (lastBodyFacing != facing.Facing) { - if (lastBodyFacing != facing.Facing) + if (initialChange) { - if (initialChange) - { - // Game.Debug("body facing changed from {0} to {1}", LastBodyFacing, facing.Facing); - var facingDiff = lastBodyFacing - facing.Facing; - LocalOrientation = LocalOrientation.Rotate(new WRot(WAngle.Zero, WAngle.Zero, facingDiff)); - } - else - { - initialChange = true; - } + var facingDiff = lastBodyFacing - facing.Facing; + LocalOrientation = LocalOrientation.Rotate(new WRot(WAngle.Zero, WAngle.Zero, facingDiff)); + } + else + { + initialChange = true; } } lastBodyFacing = facing.Facing; base.Tick(self); } + + protected override void TraitEnabled(Actor self) + { + base.TraitEnabled(self); + realignTick = Info.RealignDelay; + } } } diff --git a/OpenRA.Mods.CA/Traits/UndeployOnStop.cs b/OpenRA.Mods.CA/Traits/UndeployOnStop.cs new file mode 100644 index 0000000000..79ab8b29f9 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/UndeployOnStop.cs @@ -0,0 +1,54 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + public class UndeployOnStopInfo : ConditionalTraitInfo + { + public override object Create(ActorInitializer init) { return new UndeployOnStop(init, this); } + } + + public class UndeployOnStop : ConditionalTrait, IResolveOrder + { + private readonly GrantConditionOnDeploy trait; + private readonly GrantConditionOnDeployTurreted turretedTrait; + + public UndeployOnStop(ActorInitializer init, UndeployOnStopInfo info) + : base(info) + { + trait = init.Self.TraitOrDefault(); + turretedTrait = init.Self.TraitOrDefault(); + } + + void IResolveOrder.ResolveOrder(Actor self, Order order) + { + if (IsTraitDisabled) + return; + + if (order.OrderString != "Stop") + return; + + if (trait != null && trait.DeployState == DeployState.Deployed) + { + trait.Undeploy(); + return; + } + + if (turretedTrait != null && turretedTrait.DeployState == DeployState.Deployed) + { + turretedTrait.Undeploy(); + return; + } + } + } +} diff --git a/OpenRA.Mods.CA/Traits/UnitConverter.cs b/OpenRA.Mods.CA/Traits/UnitConverter.cs index ba6cf25559..1981d1b58a 100644 --- a/OpenRA.Mods.CA/Traits/UnitConverter.cs +++ b/OpenRA.Mods.CA/Traits/UnitConverter.cs @@ -1,21 +1,22 @@ #region Copyright & License Information -/* - * Copyright 2016-2021 The CA Developers (see AUTHORS) - * This file is part of CA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion +using System; using System.Collections.Generic; using System.Linq; using OpenRA.Mods.Common; +using OpenRA.Mods.Common.Orders; using OpenRA.Mods.Common.Traits; using OpenRA.Primitives; using OpenRA.Traits; -namespace OpenRA.Mods.CA.Traits.UnitConverter +namespace OpenRA.Mods.CA.Traits { [Desc("Allow convertible units to enter and spawn a new actor or actors.")] public class UnitConverterInfo : ConditionalTraitInfo @@ -40,14 +41,23 @@ public class UnitConverterInfo : ConditionalTraitInfo "The filename of the audio is defined per faction in notifications.yaml.")] public readonly string BlockedAudio = null; - [Desc("Ticks between producing actors.")] - public readonly int ProductionInterval = 100; + [Desc("Ticks between producing actors. Use zero to calculate based on cost.")] + public readonly int BuildTime = 0; + + [Desc("Percentage of conversion cost to use as duration in ticks to convert (if actor has none defined in Buildable).")] + public readonly int BuildDurationModifier = 60; + + [Desc("If true, BuildDurationModifier will override the equivalent value in Buildable.")] + public readonly bool OverrideUnitBuildDurationModifier = false; [Desc("Whether the player has to pay any difference in cost between the unit being converted and the unit it converts into.")] public readonly bool CostDifferenceRequired = false; - [Desc("Whether to eject a unit that can't be converted due to insufficient funds.")] - public readonly bool EjectOnInsufficientFunds = false; + [Desc("Whether to eject all units on deploy command.")] + public readonly bool EjectOnDeploy = false; + + [Desc("Cursor to display for ejecting.")] + public readonly string EjectCursor = "deploy"; [Desc("Whether to show a progress bar.")] public readonly bool ShowSelectionBar = true; @@ -55,21 +65,27 @@ public class UnitConverterInfo : ConditionalTraitInfo [Desc("Color of the progress bar.")] public readonly Color SelectionBarColor = Color.Red; + [GrantedConditionReference] + [Desc("Converting condition.")] + public readonly string ConvertingCondition = null; + public override object Create(ActorInitializer init) { return new UnitConverter(init, this); } } - public class UnitConverter : ConditionalTrait, ITick, INotifyOwnerChanged, INotifyKilled, INotifySold, ISelectionBar + public class UnitConverter : ConditionalTrait, ITick, INotifyOwnerChanged, INotifyKilled, INotifySold, ISelectionBar, IIssueOrder, IResolveOrder { + const string OrderID = "EjectUnitConverter"; readonly UnitConverterInfo info; - int produceIntervalTicks; Queue queue; protected PlayerResources playerResources; + int conditionToken = Actor.InvalidConditionToken; + bool eject = false; + bool blocked = false; public UnitConverter(ActorInitializer init, UnitConverterInfo info) : base(info) { this.info = info; - produceIntervalTicks = Info.ProductionInterval; queue = new Queue(); } @@ -82,26 +98,24 @@ protected override void Created(Actor self) public void Enter(Actor converting, Actor self) { var player = self.World.LocalPlayer ?? self.World.RenderPlayer; - if (converting.Owner == player && player != null) - { + if (Info.Voice != null && converting.Owner == player && player != null) converting.PlayVoice(Info.Voice); - } var sa = converting.Trait(); var spawnActors = sa.Info.SpawnActors; var sp = self.TraitsImplementing() - .FirstOrDefault(p => !p.IsTraitDisabled && !p.IsTraitPaused); + .FirstOrDefault(p => !p.IsTraitDisabled && !p.IsTraitPaused); if (sp != null && !IsTraitDisabled) { foreach (var name in spawnActors) { var inits = new TypeDictionary - { - new OwnerInit(self.Owner), - new FactionInit(sp.Faction) - }; + { + new OwnerInit(self.Owner), + new FactionInit(sp.Faction) + }; var queueItem = new UnitConverterQueueItem(); queueItem.Producer = sp; @@ -111,61 +125,87 @@ public void Enter(Actor converting, Actor self) queueItem.ProductionType = info.Type; queueItem.Inits = inits; queueItem.ConversionCost = GetConversionCost(converting.Info, queueItem.OutputActor); + queueItem.ConversionCostRemaining = queueItem.ConversionCost; + + var buildable = queueItem.OutputActor.TraitInfoOrDefault(); + queueItem.BuildDurationModifier = buildable != null && !Info.OverrideUnitBuildDurationModifier ? buildable.BuildDurationModifier : Info.BuildDurationModifier; + + queueItem.BuildDuration = Info.BuildTime > 0 ? Info.BuildTime : Util.ApplyPercentageModifiers(queueItem.ConversionCost, new int[] { queueItem.BuildDurationModifier }); + queueItem.BuildDurationRemaining = queueItem.BuildDuration; + queue.Enqueue(queueItem); + GrantCondition(self); } } } void ITick.Tick(Actor self) { - if (IsTraitDisabled || !queue.Any()) + if (IsTraitDisabled || queue.Count == 0) return; - if (produceIntervalTicks > 0) - { - produceIntervalTicks--; - return; - } - - produceIntervalTicks = Info.ProductionInterval; var nextItem = queue.Peek(); - var outputActor = nextItem.OutputActor; + var outputActor = eject ? nextItem.InputActor : nextItem.OutputActor; var exitSound = info.ReadyAudio; - if (playerResources.Cash < nextItem.ConversionCost) + if (!blocked) { - if (!Info.EjectOnInsufficientFunds) - return; + if (!eject) + { + var expectedRemainingCost = nextItem.BuildDurationRemaining == 1 ? 0 : nextItem.ConversionCost * nextItem.BuildDurationRemaining / Math.Max(1, nextItem.BuildDuration); + var costThisFrame = nextItem.ConversionCostRemaining - expectedRemainingCost; - outputActor = nextItem.InputActor; - exitSound = info.NoCashAudio; + if (costThisFrame != 0 && !playerResources.TakeCash(costThisFrame, true)) + return; + + nextItem.ConversionCostRemaining -= costThisFrame; + nextItem.BuildDurationRemaining -= 1; + if (nextItem.BuildDurationRemaining > 0) + return; + } + else + { + playerResources.GiveCash(nextItem.ConversionCost - nextItem.ConversionCostRemaining); + } } if (nextItem.Producer.Produce(nextItem.Actor, outputActor, nextItem.ProductionType, nextItem.Inits, 0)) { - playerResources.TakeCash(nextItem.ConversionCost); - Game.Sound.PlayNotification(self.World.Map.Rules, self.Owner, "Speech", exitSound, self.Owner.Faction.InternalName); + blocked = false; + + if (!eject) + Game.Sound.PlayNotification(self.World.Map.Rules, self.Owner, "Speech", exitSound, self.Owner.Faction.InternalName); + queue.Dequeue(); + + if (queue.Count == 0) + { + eject = false; + RevokeCondition(self); + } } - else + else if (!eject && !blocked) { Game.Sound.PlayNotification(self.World.Map.Rules, self.Owner, "Speech", Info.BlockedAudio, self.Owner.Faction.InternalName); + blocked = true; } } void INotifyOwnerChanged.OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) { - ClearQueue(); + ClearQueue(self); playerResources = newOwner.PlayerActor.Trait(); } - void INotifyKilled.Killed(Actor self, AttackInfo e) { ClearQueue(); } - void INotifySold.Selling(Actor self) { ClearQueue(); } + void INotifyKilled.Killed(Actor self, AttackInfo e) { ClearQueue(self); } + void INotifySold.Selling(Actor self) { ClearQueue(self); } void INotifySold.Sold(Actor self) { } - protected void ClearQueue() + protected void ClearQueue(Actor self) { queue.Clear(); + eject = false; + RevokeCondition(self); } public virtual int GetConversionCost(ActorInfo inputUnit, ActorInfo outputUnit) @@ -193,15 +233,65 @@ public virtual int GetUnitCost(ActorInfo unit) return valued.Cost; } + public int QueueCount + { + get + { + return queue.Count; + } + } + + void GrantCondition(Actor self) + { + if (string.IsNullOrEmpty(Info.ConvertingCondition) || conditionToken != Actor.InvalidConditionToken) + return; + + conditionToken = self.GrantCondition(Info.ConvertingCondition); + } + + void RevokeCondition(Actor self) + { + if (conditionToken == Actor.InvalidConditionToken) + return; + + conditionToken = self.RevokeCondition(conditionToken); + } + + IEnumerable IIssueOrder.Orders + { + get + { + if (IsTraitDisabled || !Info.EjectOnDeploy || queue.Count == 0) + yield break; + + yield return new DeployOrderTargeter(OrderID, 1, () => Info.EjectCursor); + } + } + + Order IIssueOrder.IssueOrder(Actor self, IOrderTargeter order, in Target target, bool queued) + { + if (order.OrderID == OrderID) + return new Order(order.OrderID, self, false); + + return null; + } + + void IResolveOrder.ResolveOrder(Actor self, Order order) + { + if (order.OrderString != OrderID) + return; + + eject = true; + } + float ISelectionBar.GetValue() { - if (!Info.ShowSelectionBar || !queue.Any()) - return 0; - var maxTicks = Info.ProductionInterval; - if (produceIntervalTicks == maxTicks) + if (!Info.ShowSelectionBar || queue.Count == 0) return 0; - return (float)(maxTicks - produceIntervalTicks) / maxTicks; + var nextItem = queue.Peek(); + var buildDurationElapsed = nextItem.BuildDuration - nextItem.BuildDurationRemaining; + return (float)buildDurationElapsed / nextItem.BuildDuration; } bool ISelectionBar.DisplayWhenEmpty { get { return false; } } @@ -218,5 +308,9 @@ public class UnitConverterQueueItem public string ProductionType; public TypeDictionary Inits; public int ConversionCost; + public int ConversionCostRemaining; + public int BuildDurationModifier; + public int BuildDuration; + public int BuildDurationRemaining; } } diff --git a/OpenRA.Mods.CA/Traits/UpdatesBuildOrder.cs b/OpenRA.Mods.CA/Traits/UpdatesBuildOrder.cs new file mode 100644 index 0000000000..6563fcfcb4 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/UpdatesBuildOrder.cs @@ -0,0 +1,43 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Added to build order when the actor is created.")] + public class UpdatesBuildOrderInfo : TraitInfo + { + [Desc("Won't add more than this number to the build order. Zero for unlimited.")] + public readonly int Limit = 0; + + [Desc("If true, ignores the maximum.")] + public readonly bool IgnoreMaxItems = false; + + public override object Create(ActorInitializer init) { return new UpdatesBuildOrder(init, this); } + } + + public class UpdatesBuildOrder : INotifyCreated + { + public readonly UpdatesBuildOrderInfo Info; + readonly ProductionTracker productionTracker; + + public UpdatesBuildOrder(ActorInitializer init, UpdatesBuildOrderInfo info) + { + Info = info; + productionTracker = init.Self.Owner.PlayerActor.Trait(); + } + + void INotifyCreated.Created(Actor self) + { + productionTracker.BuildOrderItemCreated(self.Info.Name, Info.Limit, Info.IgnoreMaxItems); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/UpdatesCount.cs b/OpenRA.Mods.CA/Traits/UpdatesCount.cs new file mode 100644 index 0000000000..5b211c617f --- /dev/null +++ b/OpenRA.Mods.CA/Traits/UpdatesCount.cs @@ -0,0 +1,166 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Flags] + public enum UpdateOnType + { + Owned = 1, + Killed = 2, + SoldAfterDamage = 4, + Captured = 8, + Infiltrated = 16 + } + + [Desc("Updates a counter when the actor is created/disposed or changes owner.")] + public class UpdatesCountInfo : ConditionalTraitInfo + { + [FieldLoader.Require] + [Desc("Name of the counter to update.")] + public readonly string Type = null; + + [Desc("What triggers an update.")] + public readonly UpdateOnType UpdateOn = UpdateOnType.Owned; + + [Desc("Ticks after being damaged during which selling the actor will update the counter for the damaging player(s).")] + public readonly int SoldAfterDamageCooldown = 75; + + public override object Create(ActorInitializer init) { return new UpdatesCount(this); } + } + + public class UpdatesCount : ConditionalTrait, INotifyCreated, INotifyActorDisposing, INotifyOwnerChanged, + INotifyKilled, INotifySold, INotifyDamage, INotifyCapture, INotifyInfiltrated + { + public readonly UpdatesCountInfo info; + CountManager countManager; + bool hasBeenInfiltrated = false; + public readonly Dictionary lastDamagedTicks = new(); + + public UpdatesCount(UpdatesCountInfo info) + : base(info) + { + this.info = info; + } + + void UpdateCounter(Player owner) + { + countManager = owner.PlayerActor.Trait(); + } + + void INotifyCreated.Created(Actor self) + { + UpdateCounter(self.Owner); + + if (!info.UpdateOn.HasFlag(UpdateOnType.Owned)) + return; + + if (IsTraitDisabled) + return; + + countManager.Increment(info.Type); + } + + protected override void TraitEnabled(Actor self) + { + if (info.UpdateOn.HasFlag(UpdateOnType.Owned)) + countManager.Increment(info.Type); + } + + protected override void TraitDisabled(Actor self) + { + if (info.UpdateOn.HasFlag(UpdateOnType.Owned)) + countManager.Decrement(info.Type); + } + + void INotifyOwnerChanged.OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) + { + UpdateCounter(newOwner); + + if (info.UpdateOn.HasFlag(UpdateOnType.Owned)) + { + oldOwner.PlayerActor.Trait().Decrement(info.Type); + + if (!info.UpdateOn.HasFlag(UpdateOnType.Captured)) + countManager.Increment(info.Type); + } + } + + void INotifyActorDisposing.Disposing(Actor self) + { + if (info.UpdateOn.HasFlag(UpdateOnType.Owned)) + countManager.Decrement(info.Type); + } + + void INotifyKilled.Killed(Actor self, AttackInfo e) + { + if (!info.UpdateOn.HasFlag(UpdateOnType.Killed)) + return; + + if (self.Owner.WinState != WinState.Undefined) + return; + + var attackingPlayer = e.Attacker.Owner; + + if (attackingPlayer.RelationshipWith(self.Owner) != PlayerRelationship.Enemy) + return; + + var attackerCounter = attackingPlayer.PlayerActor.Trait(); + attackerCounter.Increment(info.Type); + } + + void INotifySold.Selling(Actor self) { } + + void INotifySold.Sold(Actor self) + { + if (!info.UpdateOn.HasFlag(UpdateOnType.SoldAfterDamage)) + return; + + var currentTick = self.World.WorldTick; + foreach (var kvp in lastDamagedTicks) + { + var player = kvp.Key; + var damagedTick = kvp.Value; + if (currentTick - damagedTick <= info.SoldAfterDamageCooldown && player.RelationshipWith(self.Owner) == PlayerRelationship.Enemy) + { + var attackerCounter = player.PlayerActor.Trait(); + attackerCounter.Increment(info.Type); + } + } + } + + void INotifyDamage.Damaged(Actor self, AttackInfo e) + { + if (info.UpdateOn.HasFlag(UpdateOnType.SoldAfterDamage)) + lastDamagedTicks[e.Attacker.Owner] = self.World.WorldTick; + } + + void INotifyCapture.OnCapture(Actor self, Actor captor, Player oldOwner, Player newOwner, BitSet captureTypes) + { + if (info.UpdateOn.HasFlag(UpdateOnType.Captured)) + newOwner.PlayerActor.Trait().Increment(info.Type); + } + + void INotifyInfiltrated.Infiltrated(Actor self, Actor infiltrator, BitSet types) + { + if (!hasBeenInfiltrated && info.UpdateOn.HasFlag(UpdateOnType.Infiltrated)) + { + infiltrator.Owner.PlayerActor.Trait().Increment(info.Type); + hasBeenInfiltrated = true; + } + } + } +} diff --git a/OpenRA.Mods.CA/Traits/UpdatesSupportPowerTimer.cs b/OpenRA.Mods.CA/Traits/UpdatesSupportPowerTimer.cs new file mode 100644 index 0000000000..a4edef77a3 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/UpdatesSupportPowerTimer.cs @@ -0,0 +1,88 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Mods.Common.Traits; +using System; + +namespace OpenRA.Mods.CA.Traits +{ + public enum SupportPowerTimerUpdateType + { + Add, + Subtract, + Set + } + + [Desc("When trait is enabled the named support power will have its timer updated.")] + class UpdatesSupportPowerTimerInfo : ConditionalTraitInfo + { + [FieldLoader.Require] + [Desc("The support power to update.")] + public readonly string OrderName = null; + + [Desc("If set to true, the support power timer will be updated the first time it becomes available. " + + "Otherwise it will be updated every time the trait is enabled.")] + public readonly bool InitialOnly = false; + + public readonly int Ticks = 0; + + public readonly SupportPowerTimerUpdateType Type = SupportPowerTimerUpdateType.Set; + + public override object Create(ActorInitializer init) { return new UpdatesSupportPowerTimer(init, this); } + } + + class UpdatesSupportPowerTimer : ConditionalTrait + { + readonly SupportPowerManager supportPowerManager = null; + readonly SupportPowerInstanceManager supportPowerInstanceManager; + + public UpdatesSupportPowerTimer(ActorInitializer init, UpdatesSupportPowerTimerInfo info) + : base(info) + { + supportPowerManager = init.Self.Owner.PlayerActor.TraitOrDefault(); + supportPowerInstanceManager = init.Self.Owner.PlayerActor.TraitOrDefault(); + } + + protected override void TraitEnabled(Actor self) + { + self.World.AddFrameEndTask(w => { + if (supportPowerManager.Powers.ContainsKey(Info.OrderName)) + { + if (supportPowerManager.Powers[Info.OrderName] is SupportPowerInstanceCA instance) + { + if (Info.InitialOnly && supportPowerInstanceManager.InitiallyFullyChargedPowers.Contains(Info.OrderName)) + return; + + switch (Info.Type) + { + case SupportPowerTimerUpdateType.Add: + instance.AddToRemainingTicks(Info.Ticks); + break; + case SupportPowerTimerUpdateType.Subtract: + instance.SubtractFromRemainingTicks(Info.Ticks); + break; + case SupportPowerTimerUpdateType.Set: + instance.SetRemainingTicks(Info.Ticks); + break; + } + + if (Info.InitialOnly) + supportPowerInstanceManager.InitiallyFullyChargedPowers.Add(Info.OrderName); + + } else { + throw new InvalidOperationException( + $"UpdatesSupportPowerTimer trait requires SupportPowerInstanceCA for {Info.OrderName}, " + + $"but found {supportPowerManager.Powers[Info.OrderName].GetType().Name}."); + } + } + }); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/UpdatesUnitsProduced.cs b/OpenRA.Mods.CA/Traits/UpdatesUnitsProduced.cs new file mode 100644 index 0000000000..a4262d98d4 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/UpdatesUnitsProduced.cs @@ -0,0 +1,52 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Attach to producer actors. Updates units produced.")] + public class UpdatesUnitsProducedInfo : TraitInfo + { + public override object Create(ActorInitializer init) { return new UpdatesUnitsProduced(init, this); } + } + + public class UpdatesUnitsProduced : INotifyCreated, INotifyOwnerChanged, INotifyProduction + { + public readonly UpdatesUnitsProducedInfo Info; + ProductionTracker productionTracker; + + public UpdatesUnitsProduced(ActorInitializer init, UpdatesUnitsProducedInfo info) + { + Info = info; + productionTracker = init.Self.Owner.PlayerActor.Trait(); + } + + void INotifyCreated.Created(Actor self) + { + productionTracker = self.Owner.PlayerActor.Trait(); + } + + void INotifyOwnerChanged.OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) + { + productionTracker = newOwner.PlayerActor.Trait(); + } + + void INotifyProduction.UnitProduced(Actor self, Actor other, CPos exit) + { + var valued = other.Info.TraitInfoOrDefault(); + var name = other.Info.Name.EndsWith(".ai") ? other.Info.Name[..^3] : other.Info.Name; + + if (valued != null && valued.Cost > 0) + productionTracker.UnitCreated(name, valued.Cost); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Upgradeable.cs b/OpenRA.Mods.CA/Traits/Upgradeable.cs new file mode 100644 index 0000000000..f554bc39fd --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Upgradeable.cs @@ -0,0 +1,258 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.Activities; +using OpenRA.Mods.CA.Activities; +using OpenRA.Mods.Common.Orders; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Lists actors this actor may be upgraded to.")] + public class UpgradeableInfo : ConditionalTraitInfo + { + [FieldLoader.Require] + [Desc("Upgrade type. Upgrade takes effect when a ProvidesUpgrade with the same type is created and enabled.")] + public readonly string Type = null; + + [Desc("Actor to transform into.")] + public readonly string Actor = null; + + [GrantedConditionReference] + [Desc("Condition to apply when upgrade is complete.")] + public readonly string Condition = null; + + [Desc("Cost (-1 indicates to use the difference between source and target actor cost, or zero if no target actor).")] + public readonly int Cost = -1; + + [Desc("Base build time in frames (-1 indicates to use the unit's Value).")] + public readonly int BuildDuration = -1; + + [Desc("Percentage modifier to apply to the build duration.")] + public readonly int BuildDurationModifier = 60; + + [Desc("If true, skips make animation.")] + public readonly bool SkipMakeAnims = true; + + [GrantedConditionReference] + [Desc("Condition to apply while upgrading.")] + public readonly string UpgradingCondition = null; + + [Desc("Voice to use on upgrade completion.")] + public readonly string UpgradeCompleteSpeechNotification = "UpgradeComplete"; + + [Desc("Sound to play on upgrade completion.")] + public readonly string UpgradeSound = "voveupgr.aud"; + + [ActorReference] + [Desc("If set, must upgrade near one of these actors.")] + public readonly HashSet UpgradeAtActors = new HashSet { }; + + [Desc("If UpgradeAtActors are set, defines the max distance to upgrade.")] + public readonly WDist UpgradeAtRange = WDist.FromCells(3); + + [Desc("Color to use for the target line.")] + public readonly Color TargetLineColor = Color.Cyan; + + [CursorReference] + [Desc("Cursor to display when able to be upgraded near target actor.")] + public readonly string UpgradeCursor = "upgrade"; + + [CursorReference] + [Desc("Cursor to display when unable to be upgraded near target actor.")] + public readonly string UpgradeBlockedCursor = "upgrade-blocked"; + + [VoiceReference] + public readonly string Voice = "Action"; + + public readonly bool ShowSelectionBar = true; + public readonly bool ShowSelectionBarWhenEmpty = false; + public readonly Color SelectionBarColor = Color.Cyan; + + public override object Create(ActorInitializer init) { return new Upgradeable(init.Self, this); } + } + + public class Upgradeable : ConditionalTrait, IResolveOrder, INotifyCreated, INotifyOwnerChanged, ISelectionBar, IOrderVoice, IIssueOrder + { + public readonly new UpgradeableInfo Info; + readonly PlayerResources playerResources; + readonly Actor self; + UpgradesManager upgradesManager; + Upgrade currentUpgrade; + + public UpgradeInfo UpgradeInfo { get; private set; } + + bool unlocked; + bool upgraded; + int upgradeTicksRemaining; + + public bool CanUpgrade + { + get { return unlocked && !upgraded && !IsTraitDisabled; } + } + + public bool CanCancelUpgrade + { + get { return currentUpgrade != null && currentUpgrade.State == ActivityState.Active; } + } + + public Upgradeable(Actor self, UpgradeableInfo info) + : base(info) + { + Info = info; + this.self = self; + upgradesManager = self.Owner.PlayerActor.Trait(); + playerResources = self.Owner.PlayerActor.Trait(); + unlocked = upgraded = false; + UpgradeInfo = new UpgradeInfo(); + } + + protected override void Created(Actor self) + { + var upgradeInfo = upgradesManager.UpgradeableActorCreated(this, Info.Type, self.Info.Name, Info.Actor, Info.Cost, Info.BuildDuration, Info.BuildDurationModifier); + UpgradeInfo.BuildDuration = upgradeInfo.BuildDuration; + UpgradeInfo.Cost = upgradeInfo.Cost; + UpgradeInfo.ActorName = upgradeInfo.ActorName; + + if (upgradesManager.IsUnlocked(Info.Type)) + Unlock(); + + base.Created(self); + } + + void INotifyOwnerChanged.OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) + { + upgradesManager = newOwner.PlayerActor.Trait(); + } + + void IResolveOrder.ResolveOrder(Actor self, Order order) + { + // Ensure we're only interacting with this specific Upgradeable trait + if (order.TargetString != Info.Type) + return; + + if (order.OrderString == "Upgrade" && CanUpgrade) + { + currentUpgrade = new Upgrade(self, order.Target, this, playerResources, (int ticks) => upgradeTicksRemaining = ticks, Info.TargetLineColor); + + if (!order.Queued) + currentUpgrade.NextActivity?.Cancel(self); + + self.QueueActivity(order.Queued, currentUpgrade); + self.ShowTargetLines(); + } + else if (order.OrderString == "CancelUpgrade" && CanCancelUpgrade) + CancelUpgrade(self); + } + + public IEnumerable GetValidHosts() + { + return self.World.Actors + .Where(a => !a.IsDead + && a.IsInWorld + && a.Owner.IsAlliedWith(self.Owner) + && Info.UpgradeAtActors.Contains(a.Info.Name)); + } + + public void Unlock() + { + unlocked = true; + } + + public void Complete() + { + upgraded = true; + Game.Sound.Play(SoundType.World, Info.UpgradeSound, self.CenterPosition); + } + + public void UpdateManager() + { + upgradesManager.Update(); + } + + void CancelUpgrade(Actor self) + { + if (CanCancelUpgrade) + self.CurrentActivity.Cancel(self); + } + + protected override void TraitDisabled(Actor self) + { + CancelUpgrade(self); + } + + float ISelectionBar.GetValue() + { + if (!Info.ShowSelectionBar || !CanCancelUpgrade) + return 0f; + + return ((float)(UpgradeInfo.BuildDuration - upgradeTicksRemaining) / UpgradeInfo.BuildDuration).Clamp(0f, 1f); + } + + bool ISelectionBar.DisplayWhenEmpty { get { return Info.ShowSelectionBarWhenEmpty; } } + + Color ISelectionBar.GetColor() { return Info.SelectionBarColor; } + + string IOrderVoice.VoicePhraseForOrder(Actor self, Order order) + { + if (order.OrderString == "Upgrade") + return Info.Voice; + + return null; + } + + bool CanUpgradeAt(Actor target, TargetModifiers modifiers) + { + return CanUpgradeAt(target); + } + + bool CanUpgradeAt(Actor target) + { + return Info.UpgradeAtActors.Contains(target.Info.Name) && CanUpgrade; + } + + /* // TODO: get this to work nicely with multiple possible upgrade paths + public bool IsTooltipVisible(Player forPlayer) + { + if (!IsTraitDisabled && self.World.OrderGenerator is UpgradeOrderGenerator && CanUpgrade) + return forPlayer == self.Owner; + return false; + } + + public string TooltipText => $"Upgrade Cost: ${UpgradeInfo.Cost}"; + */ + + IEnumerable IIssueOrder.Orders + { + get + { + yield return new EnterAlliedActorTargeter( + "Upgrade", + 5, + Info.UpgradeCursor, + Info.UpgradeBlockedCursor, + CanUpgradeAt, + _ => CanUpgrade); + } + } + + Order IIssueOrder.IssueOrder(Actor self, IOrderTargeter order, in Target target, bool queued) + { + if (order.OrderID == "Upgrade") + return new Order(order.OrderID, self, target, queued) { TargetString = Info.Type }; + + return null; + } + } +} diff --git a/OpenRA.Mods.CA/Traits/ValidFactions.cs b/OpenRA.Mods.CA/Traits/ValidFactions.cs index 6ffc6c78b5..4455087de1 100644 --- a/OpenRA.Mods.CA/Traits/ValidFactions.cs +++ b/OpenRA.Mods.CA/Traits/ValidFactions.cs @@ -1,11 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion diff --git a/OpenRA.Mods.CA/Traits/WaitsForTurretAlignmentOnUndeploy.cs b/OpenRA.Mods.CA/Traits/WaitsForTurretAlignmentOnUndeploy.cs new file mode 100644 index 0000000000..167c9b46ca --- /dev/null +++ b/OpenRA.Mods.CA/Traits/WaitsForTurretAlignmentOnUndeploy.cs @@ -0,0 +1,91 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc(".")] + public class WaitsForTurretAlignmentOnUndeployInfo : TraitInfo + { + [Desc("Turret names")] + public readonly string[] Turrets = { "primary" }; + + [Desc("Condition to grant while aligning turrets.")] + public readonly string AligningCondition = null; + + public override object Create(ActorInitializer init) { return new WaitsForTurretAlignmentOnUndeploy(init, this); } + } + + public class WaitsForTurretAlignmentOnUndeploy : INotifyDeployTriggered, ITick + { + public readonly WaitsForTurretAlignmentOnUndeployInfo Info; + readonly IEnumerable turrets; + readonly IEnumerable notify; + bool deployAligning; + bool undeployAligning; + + int aligningToken = Actor.InvalidConditionToken; + + public WaitsForTurretAlignmentOnUndeploy(ActorInitializer init, WaitsForTurretAlignmentOnUndeployInfo info) + { + Info = info; + turrets = init.Self.TraitsImplementing().Where(t => info.Turrets.Contains(t.Info.Turret)); + notify = init.Self.TraitsImplementing(); + } + + bool AllTurretsAligned() + { + return turrets.All(t => t.LocalOrientation.Yaw == t.Info.InitialFacing); + } + + void ITick.Tick(Actor self) + { + if (!deployAligning && !undeployAligning) + return; + + if (AllTurretsAligned()) + { + foreach (var n in notify) + { + if (deployAligning) + n.FinishedDeploy(self); + + if (undeployAligning) + n.FinishedUndeploy(self); + } + + deployAligning = undeployAligning = false; + + if (Info.AligningCondition != null && aligningToken != Actor.InvalidConditionToken) + aligningToken = self.RevokeCondition(aligningToken); + } + } + + void INotifyDeployTriggered.Deploy(Actor self, bool skipMakeAnim) + { + deployAligning = true; + + if (Info.AligningCondition != null && aligningToken == Actor.InvalidConditionToken) + aligningToken = self.GrantCondition(Info.AligningCondition); + } + + void INotifyDeployTriggered.Undeploy(Actor self, bool skipMakeAnim) + { + undeployAligning = true; + + if (Info.AligningCondition != null && aligningToken == Actor.InvalidConditionToken) + aligningToken = self.GrantCondition(Info.AligningCondition); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/WarheadDebugOverlayCA.cs b/OpenRA.Mods.CA/Traits/WarheadDebugOverlayCA.cs new file mode 100644 index 0000000000..1edee0d2ef --- /dev/null +++ b/OpenRA.Mods.CA/Traits/WarheadDebugOverlayCA.cs @@ -0,0 +1,374 @@ +#region Copyright & License Information +/* + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using OpenRA.Graphics; +using OpenRA.Mods.CA.Graphics; +using OpenRA.Mods.Common.Graphics; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [TraitLocation(SystemActors.World)] + [Desc("Enhanced version of WarheadDebugOverlay that supports custom shapes. Attach this to the world actor.")] + public class WarheadDebugOverlayCAInfo : TraitInfo + { + public readonly int DisplayDuration = 25; + + public override object Create(ActorInitializer init) { return new WarheadDebugOverlayCA(this); } + } + + public class WarheadDebugOverlayCA : IRenderAnnotations + { + sealed class WHImpact + { + public readonly WPos CenterPosition; + public readonly WDist[] Range; + public readonly Color Color; + public int Time; + + public WDist OuterRange => Range[^1]; + + public WHImpact(WPos pos, WDist[] range, int time, Color color) + { + CenterPosition = pos; + Range = range; + Color = color; + Time = time; + } + } + + readonly WarheadDebugOverlayCAInfo info; + readonly List impacts = new(); + readonly List coneImpacts = new(); + readonly List coneSegmentImpacts = new(); + readonly List polylineImpacts = new(); + + public WarheadDebugOverlayCA(WarheadDebugOverlayCAInfo info) + { + this.info = info; + } + + public void AddImpact(WPos pos, WDist[] range, Color color) + { + impacts.Add(new WHImpact(pos, range, info.DisplayDuration, color)); + } + + sealed class WHPoylineImpact + { + public readonly WPos[] Points; + public readonly int Width; + public readonly Color Color; + public int Time; + + public WHPoylineImpact(WPos[] points, int width, int time, Color color) + { + Points = points; + Width = width; + Time = time; + Color = color; + } + } + + public void AddPolygonOutline(WPos[] points, Color color, int width = 1) + { + if (points == null || points.Length < 2) + return; + polylineImpacts.Add(new WHPoylineImpact(points, width, info.DisplayDuration, color)); + } + + sealed class WHConeImpact + { + public readonly WPos Apex; + public readonly WVec Axis; + public readonly WDist[] Range; + public readonly WDist Length; + public readonly int ConeAngle; + public readonly Color Color; + public int Time; + + public WDist OuterRange => Range[^1]; + + public WHConeImpact(WPos apex, WVec axis, WDist[] range, WDist length, int coneAngle, int time, Color color) + { + Apex = apex; + Axis = axis; + Range = range; + Length = length; + ConeAngle = coneAngle; + Time = time; + Color = color; + } + } + + sealed class WHConeSegmentImpact + { + public readonly WPos Apex; + public readonly WVec Axis; + public readonly int SegmentStart; + public readonly int SegmentEnd; + public readonly int StartRadius; + public readonly int EndRadius; + public readonly int ConeAngle; + public readonly Color Color; + public int Time; + + public WHConeSegmentImpact(WPos apex, WVec axis, int segmentStart, int segmentEnd, int startRadius, int endRadius, int coneAngle, int time, Color color) + { + Apex = apex; + Axis = axis; + SegmentStart = segmentStart; + SegmentEnd = segmentEnd; + StartRadius = startRadius; + EndRadius = endRadius; + ConeAngle = coneAngle; + Time = time; + Color = color; + } + } + + public void AddConeImpact(WPos apex, WVec axis, WDist[] range, int coneAngle, Color color) + { + // Back-compat overload: assume length equals outer range + coneImpacts.Add(new WHConeImpact(apex, axis, range, range[^1], coneAngle, info.DisplayDuration, color)); + } + + public void AddConeImpact(WPos apex, WVec axis, WDist length, WDist[] range, int coneAngle, Color color) + { + coneImpacts.Add(new WHConeImpact(apex, axis, range, length, coneAngle, info.DisplayDuration, color)); + } + + public void AddConeSegmentImpact(WPos apex, WVec axis, int segmentStart, int segmentEnd, int startRadius, int endRadius, int coneAngle, Color color) + { + coneSegmentImpacts.Add(new WHConeSegmentImpact(apex, axis, segmentStart, segmentEnd, startRadius, endRadius, coneAngle, info.DisplayDuration, color)); + } + + IEnumerable IRenderAnnotations.RenderAnnotations(Actor self, WorldRenderer wr) + { + // Render standard circular impacts + foreach (var i in impacts) + { + var alpha = 255.0f * i.Time / info.DisplayDuration; + var rangeStep = alpha / i.Range.Length; + + yield return new CircleAnnotationRenderable(i.CenterPosition, i.OuterRange, 1, Color.FromArgb((int)alpha, i.Color)); + + foreach (var r in i.Range) + { + yield return new CircleAnnotationRenderable(i.CenterPosition, r, 1, Color.FromArgb((int)alpha, i.Color), true); + alpha -= rangeStep; + } + + if (!wr.World.Paused) + i.Time--; + } + + impacts.RemoveAll(i => i.Time == 0); + + // Render polygon outlines + foreach (var p in polylineImpacts) + { + var alpha = 255.0f * p.Time / info.DisplayDuration; + var col = Color.FromArgb((int)alpha, p.Color); + + for (var i = 0; i < p.Points.Length; i++) + { + var a = p.Points[i]; + var b = p.Points[(i + 1) % p.Points.Length]; + yield return new LineAnnotationRenderable(a, b, p.Width, col); + } + + if (!wr.World.Paused) + p.Time--; + } + + polylineImpacts.RemoveAll(p => p.Time == 0); + + // Render cone impacts + foreach (var c in coneImpacts) + { + var alpha = 255.0f * c.Time / info.DisplayDuration; + var rangeStep = alpha / c.Range.Length; + + // Draw side rays up to min(length, outer range) + var maxR = c.OuterRange.Length < c.Length.Length ? c.OuterRange : c.Length; + foreach (var r in ConeSideLines(c.Apex, c.Axis, c.ConeAngle, maxR, 1, Color.FromArgb((int)alpha, c.Color))) + yield return r; + + // Draw arc at outer range (clamped by length) + foreach (var seg in ConeArcSegments(c.Apex, c.Axis, c.ConeAngle, maxR, 1, Color.FromArgb((int)alpha, c.Color))) + yield return seg; + + // Draw falloff rings as arcs (skip bands beyond length) + foreach (var r in c.Range) + { + if (r.Length > c.Length.Length) + continue; + foreach (var seg in ConeArcSegments(c.Apex, c.Axis, c.ConeAngle, r, 1, Color.FromArgb((int)alpha, c.Color))) + yield return seg; + alpha -= rangeStep; + } + + if (!wr.World.Paused) + c.Time--; + } + + coneImpacts.RemoveAll(c => c.Time == 0); + + // Render cone segment impacts + foreach (var cs in coneSegmentImpacts) + { + var alpha = 255.0f * cs.Time / info.DisplayDuration; + var color = Color.FromArgb((int)alpha, cs.Color); + + // Draw cone segment as truncated cone section + foreach (var r in ConeSegmentLines(cs.Apex, cs.Axis, cs.SegmentStart, cs.SegmentEnd, cs.StartRadius, cs.EndRadius, cs.ConeAngle, 1, color)) + yield return r; + + if (!wr.World.Paused) + cs.Time--; + } + + coneSegmentImpacts.RemoveAll(cs => cs.Time == 0); + } + + bool IRenderAnnotations.SpatiallyPartitionable => false; + + static IEnumerable ConeSideLines(WPos apex, WVec axis, int coneAngleDeg, WDist radius, int width, Color color) + { + // Normalize the axis vector + if (axis.Length == 0) + yield break; + + var axisNorm = axis * 1024 / axis.Length; + var halfAngleRad = Math.PI * (coneAngleDeg / 2.0) / 180.0; + var cos = Math.Cos(halfAngleRad); + var sin = Math.Sin(halfAngleRad); + + // Create a perpendicular vector in the XY plane + var perp = new WVec(-axisNorm.Y, axisNorm.X, 0); + if (perp.Length == 0) + perp = new WVec(1024, 0, 0); // Fallback if axis is vertical + else + perp = perp * 1024 / perp.Length; + + // Calculate the two edge directions by rotating the axis by +/- half angle + // Using 2D rotation in the plane defined by axis and perp + var leftVec = new WVec( + (int)(axisNorm.X * cos - perp.X * sin), + (int)(axisNorm.Y * cos - perp.Y * sin), + axisNorm.Z) * radius.Length / 1024; + + var rightVec = new WVec( + (int)(axisNorm.X * cos + perp.X * sin), + (int)(axisNorm.Y * cos + perp.Y * sin), + axisNorm.Z) * radius.Length / 1024; + + yield return new LineAnnotationRenderable(apex, apex + leftVec, width, color); + yield return new LineAnnotationRenderable(apex, apex + rightVec, width, color); + } + + static IEnumerable ConeArcSegments(WPos apex, WVec axis, int coneAngleDeg, WDist radius, int width, Color color) + { + const int Segments = 24; + + // Normalize the axis vector + if (axis.Length == 0) + yield break; + + var axisNorm = axis * 1024 / axis.Length; + var halfAngleRad = Math.PI * (coneAngleDeg / 2.0) / 180.0; + + // Create a perpendicular vector in the XY plane + var perp = new WVec(-axisNorm.Y, axisNorm.X, 0); + if (perp.Length == 0) + perp = new WVec(1024, 0, 0); // Fallback if axis is vertical + else + perp = perp * 1024 / perp.Length; + + WPos? prev = null; + for (var i = 0; i <= Segments; i++) + { + var t = (double)i / Segments; + var angle = -halfAngleRad + t * (2 * halfAngleRad); + var cos = Math.Cos(angle); + var sin = Math.Sin(angle); + + var vec = new WVec( + (int)(axisNorm.X * cos - perp.X * sin), + (int)(axisNorm.Y * cos - perp.Y * sin), + axisNorm.Z) * radius.Length / 1024; + + var p = apex + vec; + if (prev.HasValue) + yield return new LineAnnotationRenderable(prev.Value, p, width, color); + prev = p; + } + } + + static IEnumerable ConeSegmentLines(WPos apex, WVec axis, int segmentStart, int segmentEnd, + int startRadius, int endRadius, int coneAngleDeg, int width, Color color) + { + // Normalize the axis vector + if (axis.Length == 0) + yield break; + + var axisNorm = axis * 1024 / axis.Length; + var halfAngleRad = Math.PI * (coneAngleDeg / 2.0) / 180.0; + + // Create a perpendicular vector in the XY plane + var perp = new WVec(-axisNorm.Y, axisNorm.X, 0); + if (perp.Length == 0) + perp = new WVec(1024, 0, 0); // Fallback if axis is vertical + else + perp = perp * 1024 / perp.Length; + + // Draw the two curved arcs (near and far) + const int Segments = 24; + WPos? prevStart = null; + WPos? prevEnd = null; + + for (var i = 0; i <= Segments; i++) + { + var t = (double)i / Segments; + var angle = -halfAngleRad + t * (2 * halfAngleRad); + var cos = Math.Cos(angle); + var sin = Math.Sin(angle); + + var dirVec = new WVec( + (int)(axisNorm.X * cos - perp.X * sin), + (int)(axisNorm.Y * cos - perp.Y * sin), + axisNorm.Z); + + // Calculate points on the start and end arcs (centered at apex) + var startPoint = apex + dirVec * startRadius / 1024; + var endPoint = apex + dirVec * endRadius / 1024; + + // Draw arc segments + if (prevStart.HasValue) + { + yield return new LineAnnotationRenderable(prevStart.Value, startPoint, width, color); + yield return new LineAnnotationRenderable(prevEnd.Value, endPoint, width, color); + } + + // Draw connecting lines along cone edges (only at the two extremes for clarity) + if (i == 0 || i == Segments) + { + yield return new LineAnnotationRenderable(startPoint, endPoint, width, color); + } + + prevStart = startPoint; + prevEnd = endPoint; + } + } + } +} diff --git a/OpenRA.Mods.CA/Traits/Warpable.cs b/OpenRA.Mods.CA/Traits/Warpable.cs index b3db2c38a3..a692571a1e 100644 --- a/OpenRA.Mods.CA/Traits/Warpable.cs +++ b/OpenRA.Mods.CA/Traits/Warpable.cs @@ -1,13 +1,14 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion +using System; using OpenRA.Mods.Common.Traits; using OpenRA.Primitives; using OpenRA.Traits; @@ -24,6 +25,10 @@ public class WarpableInfo : TraitInfo, Requires [Desc("Amount of ticks required to pass without being damaged to revoke effects of the temporal weapon.")] public readonly int RevokeDelay = 1; + [Desc("Amount of warp damage revoked each tick after RevokeDelay has passed. Use -1 for all damage to be revoked.", + "Zero means damage will never be revoked.")] + public readonly int RevokeRate = -1; + [Desc("Amount required to be taken for the unit to be killed.", "Use -1 to be calculated from the actor health.")] public readonly int EraseDamage = -1; @@ -46,11 +51,12 @@ public class Warpable : ISync, ITick, ISelectionBar readonly WarpableInfo info; readonly Health health; readonly int requiredDamage; + int ScalingRequiredDamage { get { return Math.Max(100 * health.HP / health.MaxHP * requiredDamage / 100, 1); } } int token = Actor.InvalidConditionToken; [Sync] - int recievedDamage; + int receivedDamage; [Sync] int tick; @@ -65,32 +71,33 @@ public Warpable(ActorInitializer init, WarpableInfo info) public void AddDamage(int damage, Actor damager) { - recievedDamage = recievedDamage + damage; + receivedDamage = receivedDamage + damage; tick = info.RevokeDelay; if (info.ScaleWithCurrentHealthPercentage) - { - var currentRequiredDamage = 100 * health.HP / health.MaxHP * requiredDamage / 100; - - if (recievedDamage >= currentRequiredDamage) + if (receivedDamage >= ScalingRequiredDamage) self.Kill(damager, info.DamageTypes); - } else - if (recievedDamage >= requiredDamage) - self.Kill(damager, info.DamageTypes); + if (receivedDamage >= requiredDamage) + self.Kill(damager, info.DamageTypes); - if (!string.IsNullOrEmpty(info.Condition) && - token == Actor.InvalidConditionToken) + if (!string.IsNullOrEmpty(info.Condition) && token == Actor.InvalidConditionToken) token = self.GrantCondition(info.Condition); } void ITick.Tick(Actor self) { - if (--tick < 0) + if (receivedDamage > 0 && --tick < 0) { - recievedDamage = 0; + if (info.RevokeRate == -1) + receivedDamage = 0; + else + receivedDamage -= info.RevokeRate; + + if (receivedDamage < 0) + receivedDamage = 0; - if (token != Actor.InvalidConditionToken) + if (receivedDamage == 0 && token != Actor.InvalidConditionToken) token = self.RevokeCondition(token); } } @@ -100,7 +107,10 @@ float ISelectionBar.GetValue() if (!info.ShowSelectionBar) return 0; - return (float)recievedDamage / requiredDamage; + if (info.ScaleWithCurrentHealthPercentage) + return (float)receivedDamage / ScalingRequiredDamage; + + return (float)receivedDamage / requiredDamage; } bool ISelectionBar.DisplayWhenEmpty { get { return false; } } diff --git a/OpenRA.Mods.CA/Traits/WithEjectedCasings.cs b/OpenRA.Mods.CA/Traits/WithEjectedCasings.cs new file mode 100644 index 0000000000..b4af467d75 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/WithEjectedCasings.cs @@ -0,0 +1,224 @@ +#region Copyright & License Information +/* + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Linq; +using OpenRA.GameRules; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Ejects casings when the actor fires weapons.", + "Supports burst firing of casings over time using the casing weapon's Burst and BurstDelays properties,", + "or the BurstOverride and BurstDelayOverride trait properties for custom control.")] + public class WithEjectedCasingsInfo : PausableConditionalTraitInfo + { + [WeaponReference] + [Desc("Has to be defined in weapons.yaml as well.")] + public readonly string CasingWeapon = null; + + [Desc("Casing spawn position relative to turret or body, (forward, right, up) triples.", + "If multiple offsets are defined, they will be matched to armament LocalOffset entries.")] + public readonly WVec[] CasingSpawnLocalOffset = Array.Empty(); + + [Desc("Casing target position relative to turret or body, (forward, right, up) triples.", + "If multiple offsets are defined, they will be matched to armament LocalOffset entries.")] + public readonly WVec[] CasingTargetOffset = Array.Empty(); + + [Desc("Casing target position will be modified to ground level.")] + public readonly bool CasingHitGroundLevel = true; + + [Desc("Only eject casings for armaments with these names. If empty, all armaments will eject casings.")] + public readonly HashSet ArmamentNames = new(); + + [Desc("Override the casing weapon's burst count. If 0, uses the weapon's own burst setting.")] + public readonly int BurstOverride = 0; + + [Desc("Override the casing weapon's burst delays. If empty, uses the weapon's own burst delays.")] + public readonly int[] BurstDelayOverride = Array.Empty(); + + public WeaponInfo CasingWeaponInfo { get; private set; } + + public override object Create(ActorInitializer init) { return new WithEjectedCasings(init, this); } + + public override void RulesetLoaded(Ruleset rules, ActorInfo ai) + { + base.RulesetLoaded(rules, ai); + + if (CasingWeapon != null) + { + var casingWeaponToLower = CasingWeapon.ToLowerInvariant(); + if (!rules.Weapons.TryGetValue(casingWeaponToLower, out var casingWeaponInfo)) + throw new YamlException($"Weapons Ruleset does not contain an entry '{casingWeaponToLower}'"); + + CasingWeaponInfo = casingWeaponInfo; + } + } + } + + public class WithEjectedCasings : PausableConditionalTrait, INotifyCreated, INotifyAttack, ITick + { + BodyOrientation coords; + Turreted[] turrets; + + readonly Dictionary turretsByArmament = new(); + readonly List<(int Ticks, int Burst, ProjectileArgs Args)> scheduledCasings = new(); + + public WithEjectedCasings(ActorInitializer init, WithEjectedCasingsInfo info) + : base(info) { } + + void INotifyCreated.Created(Actor self) + { + coords = self.Trait(); + turrets = self.TraitsImplementing().ToArray(); + + // Map armaments to their turrets + var armaments = self.TraitsImplementing(); + foreach (var armament in armaments) + { + var turret = turrets.FirstOrDefault(t => t.Name == armament.Info.Turret); + if (turret != null) + turretsByArmament[armament.Info.Name] = turret; + } + } + + void INotifyAttack.PreparingAttack(Actor self, in Target target, Armament a, Barrel barrel) { } + + void INotifyAttack.Attacking(Actor self, in Target target, Armament a, Barrel barrel) + { + if (IsTraitDisabled || IsTraitPaused) + return; + + if (Info.CasingWeaponInfo == null) + return; + + // Check if we should eject casings for this armament + if (Info.ArmamentNames.Count > 0 && !Info.ArmamentNames.Contains(a.Info.Name)) + return; + + // Get the barrel index to determine which casing offset to use + var barrelIndex = Array.IndexOf(a.Barrels, barrel); + if (barrelIndex < 0) + barrelIndex = 0; + + var casingSpawnOffset = Info.CasingSpawnLocalOffset.Length > barrelIndex + ? Info.CasingSpawnLocalOffset[barrelIndex] + : (Info.CasingSpawnLocalOffset.Length > 0 ? Info.CasingSpawnLocalOffset[0] : WVec.Zero); + + var casingTargetOffset = Info.CasingTargetOffset.Length > barrelIndex + ? Info.CasingTargetOffset[barrelIndex] + : (Info.CasingTargetOffset.Length > 0 ? Info.CasingTargetOffset[0] : WVec.Zero); + + var casingSpawnPosition = self.CenterPosition + CalculateOffset(self, a, casingSpawnOffset); + var casingHitPosition = self.CenterPosition + CalculateOffset(self, a, casingTargetOffset); + + if (Info.CasingHitGroundLevel) + casingHitPosition -= new WVec(0, 0, self.World.Map.DistanceAboveTerrain(casingHitPosition).Length); + + var casingFacing = (casingHitPosition - casingSpawnPosition).Yaw; + + var args = new ProjectileArgs + { + Weapon = Info.CasingWeaponInfo, + Facing = casingFacing, + CurrentMuzzleFacing = () => casingFacing, + + DamageModifiers = Array.Empty(), + InaccuracyModifiers = Array.Empty(), + RangeModifiers = Array.Empty(), + + Source = casingSpawnPosition, + CurrentSource = () => casingSpawnPosition, + SourceActor = self, + PassiveTarget = casingHitPosition + }; + + // Handle casing burst + var casingWeapon = Info.CasingWeaponInfo; + var burstCount = Info.BurstOverride > 0 ? Info.BurstOverride : casingWeapon.Burst; + var burstDelays = Info.BurstDelayOverride.Length > 0 ? Info.BurstDelayOverride : casingWeapon.BurstDelays; + + if (burstCount > 1) + { + // Schedule multiple casings over time + for (var i = 0; i < burstCount; i++) + { + var delay = 0; + if (i > 0) + { + if (burstDelays.Length == 1) + delay = burstDelays[0] * i; + else if (burstDelays.Length > i - 1) + delay = burstDelays.Take(i).Sum(); + } + + scheduledCasings.Add((delay, i + 1, args)); + } + } + else + { + // Fire single casing immediately + FireCasing(args); + } + } + + void ITick.Tick(Actor self) + { + if (IsTraitDisabled) + return; + + // Process scheduled casings + for (var i = 0; i < scheduledCasings.Count; i++) + { + var scheduled = scheduledCasings[i]; + if (--scheduled.Ticks <= 0) + { + FireCasing(scheduled.Args); + scheduledCasings.RemoveAt(i--); + } + else + { + scheduledCasings[i] = scheduled; + } + } + } + + static void FireCasing(ProjectileArgs args) + { + if (args.Weapon.Projectile != null) + { + var projectile = args.Weapon.Projectile.Create(args); + if (projectile != null) + args.SourceActor.World.Add(projectile); + } + } + + WVec CalculateOffset(Actor self, Armament armament, WVec localOffset) + { + // Apply recoil (casings should spawn considering current weapon recoil) + var effectOffset = localOffset + new WVec(-armament.Recoil, WDist.Zero, WDist.Zero); + + // Get the turret for this armament + turretsByArmament.TryGetValue(armament.Info.Name, out var turret); + + // Turret coordinates to body coordinates + var bodyOrientation = coords.QuantizeOrientation(self.Orientation); + if (turret != null) + effectOffset = effectOffset.Rotate(turret.WorldOrientation) + turret.Offset.Rotate(bodyOrientation); + else + effectOffset = effectOffset.Rotate(bodyOrientation); + + // Body coordinates to world coordinates + return coords.LocalToWorld(effectOffset); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/WithReloadBar.cs b/OpenRA.Mods.CA/Traits/WithReloadBar.cs new file mode 100644 index 0000000000..8a80142e24 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/WithReloadBar.cs @@ -0,0 +1,76 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc(".")] + public class WithReloadBarInfo : TraitInfo + { + [Desc("Armament to track reload of.")] + public readonly string Armament = "primary"; + + public readonly Color Color = Color.White; + public readonly PlayerRelationship ValidRelationships = PlayerRelationship.Ally; + + public override object Create(ActorInitializer init) { return new WithReloadBar(init, this); } + } + + public class WithReloadBar : INotifyAttack, ISelectionBar, ITick + { + public readonly WithReloadBarInfo Info; + readonly Actor self; + int reloadTicks; + int reloadTicksRemaining; + + public WithReloadBar(ActorInitializer init, WithReloadBarInfo info) + { + Info = info; + self = init.Self; + reloadTicks = reloadTicksRemaining = 0; + } + + void ITick.Tick(Actor self) + { + if (reloadTicksRemaining > 0) + reloadTicksRemaining--; + } + + void INotifyAttack.Attacking(Actor self, in Target target, Armament a, Barrel barrel) + { + if (a.Info.Name != Info.Armament) + return; + + self.World.AddFrameEndTask(w => reloadTicks = reloadTicksRemaining = a.FireDelay); + } + + void INotifyAttack.PreparingAttack(Actor self, in Target target, Armament a, Barrel barrel) {} + + float ISelectionBar.GetValue() + { + if (!Info.ValidRelationships.HasRelationship(self.Owner.RelationshipWith(self.World.RenderPlayer))) + return 0; + + if (reloadTicks == 0 || reloadTicksRemaining == 0) + return 0; + + return (float)(reloadTicks - reloadTicksRemaining) / reloadTicks; + } + + bool ISelectionBar.DisplayWhenEmpty => false; + + Color ISelectionBar.GetColor() { return Info.Color; } + } +} diff --git a/OpenRA.Mods.CA/Traits/World/AllyProxyFromSelection.cs b/OpenRA.Mods.CA/Traits/World/AllyProxyFromSelection.cs new file mode 100644 index 0000000000..19388dd0bc --- /dev/null +++ b/OpenRA.Mods.CA/Traits/World/AllyProxyFromSelection.cs @@ -0,0 +1,90 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [TraitLocation(SystemActors.World)] + [Desc("Automatically adds proxy actors to selection when their parent ally building is selected.", + "This enables standard traits like RallyPoint on proxy actors to work when ally buildings are selected.")] + public class AllyProxyFromSelectionInfo : TraitInfo + { + public override object Create(ActorInitializer init) { return new AllyProxyFromSelection(init.World); } + } + + public class AllyProxyFromSelection : INotifySelection + { + readonly World world; + + // Track building -> proxy mapping so we know which proxy belongs to which building + readonly Dictionary buildingToProxy = new(); + + public AllyProxyFromSelection(World world) + { + this.world = world; + } + + void INotifySelection.SelectionChanged() + { + var localPlayer = world.LocalPlayer; + if (localPlayer == null) + return; + + var selectedBuildings = new HashSet(); + + // Find all selected ally buildings with AllyProxyProduction and get their proxies + foreach (var actor in world.Selection.Actors.ToList()) + { + if (actor.IsDead || !actor.IsInWorld) + continue; + + // Must be an ally's building, not ours + if (actor.Owner == localPlayer || !actor.Owner.IsAlliedWith(localPlayer)) + continue; + + var proxyCreator = actor.TraitOrDefault(); + if (proxyCreator == null || proxyCreator.IsTraitDisabled) + continue; + + var proxy = proxyCreator.GetProxyForPlayer(localPlayer); + if (proxy != null && !proxy.IsDead && proxy.IsInWorld && proxy.Info.HasTraitInfo()) + { + selectedBuildings.Add(actor); + + // Add proxy to selection if not already tracked + if (!buildingToProxy.ContainsKey(actor)) + { + buildingToProxy[actor] = proxy; + if (!world.Selection.Contains(proxy)) + world.Selection.Add(proxy); + } + // If proxy was somehow removed from selection, re-add it + else if (!world.Selection.Contains(proxy)) + { + world.Selection.Add(proxy); + } + } + } + + // Remove proxies for buildings that are no longer selected + var buildingsToRemove = buildingToProxy.Keys.Where(b => !selectedBuildings.Contains(b)).ToList(); + foreach (var building in buildingsToRemove) + { + var proxy = buildingToProxy[building]; + if (world.Selection.Contains(proxy)) + world.Selection.Remove(proxy); + buildingToProxy.Remove(building); + } + } + } +} diff --git a/OpenRA.Mods.CA/Traits/World/LobbyMissionInfo.cs b/OpenRA.Mods.CA/Traits/World/LobbyMissionInfo.cs new file mode 100644 index 0000000000..c8798b7641 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/World/LobbyMissionInfo.cs @@ -0,0 +1,39 @@ + + +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Displays additional info in the lobby chat after a map is selected. Requires LobbyMissionInfoLogic widget logic.")] + [TraitLocation(SystemActors.World)] + public class LobbyMissionInfoInfo : TraitInfo + { + [FieldLoader.Require] + [Desc("Text to display in the lobby chat.")] + public readonly string Text = ""; + + [Desc("Prefix to display before the info in the lobby chat.")] + public readonly string Prefix = null; + + [Desc("Color of the prefix text in the lobby chat.")] + public readonly Color PrefixColor = Color.Cyan; + + [Desc("Color of the info text in the lobby chat.")] + public readonly Color TextColor = Color.Cyan; + + public override object Create(ActorInitializer init) { return new LobbyMissionInfo(); } + } + + public class LobbyMissionInfo { } +} diff --git a/OpenRA.Mods.CA/Traits/World/RevealedPlayersManager.cs b/OpenRA.Mods.CA/Traits/World/RevealedPlayersManager.cs new file mode 100644 index 0000000000..4bbe78ad54 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/World/RevealedPlayersManager.cs @@ -0,0 +1,59 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits +{ + [Desc("Attached to the world actor to track which players are revealed (for displaying their real faction in scores panel).")] + [TraitLocation(SystemActors.World)] + public class RevealedPlayersManagerInfo : TraitInfo + { + public override object Create(ActorInitializer init) { return new RevealedPlayersManager(init.World, this); } + } + + public class RevealedPlayersManager : INotifySelection + { + readonly World world; + public HashSet Players { get; private set; } + + public RevealedPlayersManager(World world, RevealedPlayersManagerInfo info) + { + Players = new HashSet(); + this.world = world; + } + + public void RevealPlayer(Player player) + { + Players.Add(player); + } + + public bool IsRevealed(Player player) + { + return Players.Contains(player); + } + + void INotifySelection.SelectionChanged() + { + // Disable for spectators + if (world.LocalPlayer == null || world.LocalPlayer.Spectating) + return; + + var players = world.Selection.Actors + .Where(a => a.IsInWorld) + .Select(a => a.Owner); + + foreach (var player in players) + RevealPlayer(player); + } + } +} diff --git a/OpenRA.Mods.CA/Traits/World/TintedCellsLayer.cs b/OpenRA.Mods.CA/Traits/World/TintedCellsLayer.cs index 1128a2d04c..2a0b8f7012 100644 --- a/OpenRA.Mods.CA/Traits/World/TintedCellsLayer.cs +++ b/OpenRA.Mods.CA/Traits/World/TintedCellsLayer.cs @@ -1,10 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion diff --git a/OpenRA.Mods.CA/TraitsInterfaces.cs b/OpenRA.Mods.CA/TraitsInterfaces.cs index 33f41f9372..266da5e32e 100644 --- a/OpenRA.Mods.CA/TraitsInterfaces.cs +++ b/OpenRA.Mods.CA/TraitsInterfaces.cs @@ -1,26 +1,33 @@ #region Copyright & License Information -/* - * Copyright 2007-2019 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion -using System; using System.Collections.Generic; -using OpenRA.Activities; using OpenRA.GameRules; using OpenRA.Graphics; -using OpenRA.Mods.Common.Activities; -using OpenRA.Mods.Common.Graphics; using OpenRA.Primitives; using OpenRA.Traits; namespace OpenRA.Mods.CA.Traits { + // Allows modifying previews e.g. with WithColoredOverlayCA + public interface IActorPreviewRenderModifierInfo : ITraitInfoInterface + { + IActorPreviewRenderModifier GetPreviewRenderModifier(WorldRenderer wr, ActorInfo actorInfo, TypeDictionary inits, Color previewColor); + } + + public interface IActorPreviewRenderModifier + { + IEnumerable ModifyPreviewRender(WorldRenderer wr, IEnumerable renderables, Rectangle bounds); + void Tick(); + } + [RequireExplicitImplementation] public interface ISmokeParticleInfo { @@ -41,12 +48,27 @@ public interface ISmokeParticleInfo int RandomRate { get; } } + [RequireExplicitImplementation] + public interface IMultiWeaponImpactInfo + { + WeaponInfo Weapon { get; } + CVec[] ImpactOffsets { get; } + WDist RandomOffset { get; } + bool RandomImpactSequence { get; } + int[] Interval { get; } + } + public interface INotifyActivate { void Launching(Actor self); } [RequireExplicitImplementation] public interface IPointDefense { - bool Destroy(WPos position, Player attacker, string type); + bool Destroy(WPos position, Player attacker, string type, ProjectileArgs args); + } + + public interface INotifyPointDefenseHit + { + void Hit(int damagePrevented); } public interface IBotCAInfo : ITraitInfoInterface { string Name { get; } } @@ -65,4 +87,28 @@ public interface INotifyPrismCharging { void Charging(Actor self, in Target targ [RequireExplicitImplementation] public interface INotifyEnterTeleporter { void Charging(Actor self, Actor teleporter); } public interface INotifyExitTeleporter { void Arrived(Actor self); } + + [RequireExplicitImplementation] + public interface IBotAircraftBuilder { bool CanBuildMoreOfAircraft(ActorInfo actorInfo); } + + [RequireExplicitImplementation] + public interface IPortableChronoModifier { int GetCooldownModifier(); int GetRangeModifier(); int GetExtraCharges(); } + + [RequireExplicitImplementation] + public interface INotifyFallDown { void OnLanded(Actor self); } + + [RequireExplicitImplementation] + public interface INotifyMindControlled { void MindControlled(Actor self, Actor master); void Released(Actor self, Actor master); } + + [RequireExplicitImplementation] + public interface INotifyMindControlling { void MindControlling(Actor self, Actor slave); } + + [RequireExplicitImplementation] + public interface INotifyCountChanged { void Incremented(string type); void Decremented(string type); } + + [RequireExplicitImplementation] + public interface ISeedsResourceIntervalModifier { int GetModifier(); } + + [RequireExplicitImplementation] + public interface INotifyAttachedTo { void Attached(Actor self, Actor attachedActor, Attachable attachable); void Detached(Actor self, Actor detachedActor, Attachable attachable); } } diff --git a/OpenRA.Mods.CA/Warheads/AttachActorWarhead.cs b/OpenRA.Mods.CA/Warheads/AttachActorWarhead.cs index b5b086e471..04f3be5da6 100644 --- a/OpenRA.Mods.CA/Warheads/AttachActorWarhead.cs +++ b/OpenRA.Mods.CA/Warheads/AttachActorWarhead.cs @@ -1,10 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -71,43 +71,58 @@ public override void DoImpact(in Target target, WarheadArgs args) if (distance > Range) continue; - var attachableToTrait = actor.TraitsImplementing().FirstOrDefault(); - - if (attachableToTrait != null) + var actorToAttach = actor.World.CreateActor(false, Actor.ToLowerInvariant(), new TypeDictionary { - Attach(actor, firedBy, attachableToTrait); - numAttached++; + new OwnerInit(firedBy.Owner), + }); - var attachSound = AttachSounds.RandomOrDefault(world.LocalRandom); - if (attachSound != null) - Game.Sound.Play(SoundType.World, attachSound, pos); + var attachableTrait = actorToAttach.TraitOrDefault(); + if (attachableTrait == null) + { + actorToAttach.Dispose(); + continue; } - else + + var attachableToTrait = actor.TraitsImplementing().FirstOrDefault(a => a.CanAttach(attachableTrait)); + + if (attachableToTrait != null) { - var failSound = MissSounds.RandomOrDefault(world.LocalRandom); - if (failSound != null) - Game.Sound.Play(SoundType.World, failSound, pos); + Attach(actor, attachableToTrait, actorToAttach); + numAttached++; } if (numAttached > MaxTargets) break; } + + if (numAttached > 0) + { + var attachSound = AttachSounds.RandomOrDefault(world.LocalRandom); + if (attachSound != null) + Game.Sound.Play(SoundType.World, attachSound, pos); + } + else + { + var failSound = MissSounds.RandomOrDefault(world.LocalRandom); + if (failSound != null) + Game.Sound.Play(SoundType.World, failSound, pos); + } } - void Attach(Actor targetActor, Actor firedBy, AttachableTo targetTrait) + void Attach(Actor targetActor, AttachableTo targetTrait, Actor actorToAttach) { - var map = targetActor.World.Map; + var world = targetActor.World; + var map = world.Map; var targetCell = map.CellContaining(targetActor.CenterPosition); targetActor.World.AddFrameEndTask(w => { - var actorToAttach = targetActor.World.CreateActor(Actor.ToLowerInvariant(), new TypeDictionary - { - new LocationInit(targetCell), - new OwnerInit(firedBy.Owner), - }); + w.Add(actorToAttach); + var positionable = actorToAttach.TraitOrDefault(); + if (positionable != null) + positionable.SetPosition(actorToAttach, targetCell); - var attached = targetTrait.Attach(actorToAttach.Trait()); + var attached = targetTrait.Attach(actorToAttach, actorToAttach.Trait()); if (!attached) actorToAttach.Dispose(); }); diff --git a/OpenRA.Mods.CA/Warheads/AttachDelayedWeaponWarhead.cs b/OpenRA.Mods.CA/Warheads/AttachDelayedWeaponWarhead.cs index 6d1c838d14..481cd5afd5 100644 --- a/OpenRA.Mods.CA/Warheads/AttachDelayedWeaponWarhead.cs +++ b/OpenRA.Mods.CA/Warheads/AttachDelayedWeaponWarhead.cs @@ -1,17 +1,16 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion using System.Linq; using OpenRA.GameRules; using OpenRA.Mods.CA.Traits; -using OpenRA.Mods.CA.Warheads; using OpenRA.Mods.Common; using OpenRA.Mods.Common.Traits; using OpenRA.Primitives; @@ -36,6 +35,9 @@ public class AttachDelayedWeaponWarhead : WarheadAS, IRulesetLoaded [Desc("Trigger the DelayedWeapon after these amount of ticks.")] public readonly int TriggerTime = 30; + [Desc("If true, trigger time is added for every 100 value of the target.")] + public readonly bool ScaleTriggerTimeWithValue = false; + [Desc("DeathType(s) that trigger the DelayedWeapon to activate. Leave empty to always trigger the DelayedWeapon on death.")] public readonly BitSet DeathTypes = default(BitSet); @@ -45,14 +47,25 @@ public class AttachDelayedWeaponWarhead : WarheadAS, IRulesetLoaded [Desc("List of sounds that can be played if attaching is not possible.")] public readonly string[] MissSounds = new string[0]; + [WeaponReference] + public readonly string MissWeapon = null; + public WeaponInfo WeaponInfo; + public WeaponInfo MissWeaponInfo; public void RulesetLoaded(Ruleset rules, WeaponInfo info) { - if (!rules.Weapons.TryGetValue(Weapon.ToLowerInvariant(), out WeaponInfo)) - throw new YamlException("Weapons Ruleset does not contain an entry '{0}'".F(Weapon.ToLowerInvariant())); + var weaponToLower = Weapon.ToLowerInvariant(); + if (!rules.Weapons.TryGetValue(weaponToLower, out WeaponInfo)) + throw new YamlException($"Weapons Ruleset does not contain an entry '{weaponToLower}'"); + + var missWeaponToLower = Weapon.ToLowerInvariant(); + if (MissWeapon != null && !rules.Weapons.TryGetValue(missWeaponToLower, out MissWeaponInfo)) + throw new YamlException($"Weapons Ruleset does not contain an entry '{missWeaponToLower}'"); } + public int CalculatedTriggerTime { get; private set; } + public override void DoImpact(in Target target, WarheadArgs args) { var firedBy = args.SourceActor; @@ -67,6 +80,7 @@ public override void DoImpact(in Target target, WarheadArgs args) var world = firedBy.World; var availableActors = firedBy.World.FindActorsOnCircle(pos, Range); + foreach (var actor in availableActors) { if (!IsValidAgainst(actor, firedBy)) @@ -87,18 +101,34 @@ public override void DoImpact(in Target target, WarheadArgs args) var attachable = actor.TraitsImplementing().FirstOrDefault(a => a.CanAttach(Type)); if (attachable != null) { + CalculatedTriggerTime = TriggerTime; + + if (ScaleTriggerTimeWithValue) + { + var valued = actor.Info.TraitInfoOrDefault(); + if (valued != null) + CalculatedTriggerTime = (valued.Cost / 100) * TriggerTime; + } + attachable.Attach(new DelayedWeaponTrigger(this, args)); var attachSound = AttachSounds.RandomOrDefault(world.LocalRandom); if (attachSound != null) Game.Sound.Play(SoundType.World, attachSound, pos); + + return; } - else - { - var failSound = MissSounds.RandomOrDefault(world.LocalRandom); - if (failSound != null) - Game.Sound.Play(SoundType.World, failSound, pos); - } + } + + if (MissWeapon != null) + { + MissWeaponInfo.Impact(Target.FromPos(pos), args.SourceActor); + } + else + { + var failSound = MissSounds.RandomOrDefault(world.LocalRandom); + if (failSound != null) + Game.Sound.Play(SoundType.World, failSound, pos); } } } diff --git a/OpenRA.Mods.CA/Warheads/ChangeOwnerToNeutralWarhead.cs b/OpenRA.Mods.CA/Warheads/ChangeOwnerToNeutralWarhead.cs index b801c179d8..be4c0d3c44 100644 --- a/OpenRA.Mods.CA/Warheads/ChangeOwnerToNeutralWarhead.cs +++ b/OpenRA.Mods.CA/Warheads/ChangeOwnerToNeutralWarhead.cs @@ -1,47 +1,69 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion using System.Linq; using OpenRA.GameRules; +using OpenRA.Mods.Common.Traits; using OpenRA.Mods.Common.Warheads; using OpenRA.Traits; namespace OpenRA.Mods.CA.Warheads { + public enum CargoEffect { None, Kill, Block } + [Desc("Changes targets to neutral.")] public class ChangeOwnerToNeutralWarhead : Warhead { [Desc("Faction to change to.")] public readonly string Owner = "Neutral"; + [Desc("Whether cargo is killed, blocks neutralization, or has no effect.")] + public readonly CargoEffect CargoEffect = CargoEffect.Kill; + public readonly WDist Range = WDist.FromCells(1); public override void DoImpact(in Target target, WarheadArgs args) { var firedBy = args.SourceActor; + + if (target.Type == TargetType.Invalid) + return; + var actors = target.Type == TargetType.Actor ? new[] { target.Actor } : firedBy.World.FindActorsInCircle(target.CenterPosition, Range); foreach (var a in actors) { - // Don't do anything on friendly fire - if (a.Owner == firedBy.Owner) - continue; - - if (!target.IsValidFor(firedBy)) - return; if (!IsValidAgainst(a, firedBy)) continue; + if (CargoEffect != CargoEffect.None) + { + var cargo = a.TraitOrDefault(); + if (cargo != null) + { + if (CargoEffect == CargoEffect.Block && cargo.PassengerCount > 0) + continue; + + if (CargoEffect == CargoEffect.Kill) + { + while (!cargo.IsEmpty()) + { + var p = cargo.Unload(a); + p.Kill(firedBy); + } + } + } + } + a.ChangeOwner(a.World.Players.First(p => p.InternalName == Owner)); // Permanent // Stop shooting, you have new enemies diff --git a/OpenRA.Mods.CA/Warheads/ChronoFlashEffectWarhead .cs b/OpenRA.Mods.CA/Warheads/ChronoFlashEffectWarhead .cs index b1f1bb0552..8885d41e4c 100644 --- a/OpenRA.Mods.CA/Warheads/ChronoFlashEffectWarhead .cs +++ b/OpenRA.Mods.CA/Warheads/ChronoFlashEffectWarhead .cs @@ -1,10 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -27,7 +27,7 @@ public override void DoImpact(in Target target, WarheadArgs args) return; if (target.IsValidFor(firedBy)) - foreach (var a in firedBy.World.ActorsWithTrait()) + foreach (var a in firedBy.World.ActorsWithTrait()) a.Trait.Enable(); } } diff --git a/OpenRA.Mods.CA/Warheads/CreateFacingEffectWarhead.cs b/OpenRA.Mods.CA/Warheads/CreateFacingEffectWarhead.cs new file mode 100644 index 0000000000..82ae24e71c --- /dev/null +++ b/OpenRA.Mods.CA/Warheads/CreateFacingEffectWarhead.cs @@ -0,0 +1,158 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Linq; +using OpenRA.GameRules; +using OpenRA.Mods.Common; +using OpenRA.Mods.Common.Effects; +using OpenRA.Mods.Common.Traits; +using OpenRA.Mods.Common.Warheads; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Warheads +{ + [Desc("Spawn a sprite with sound. Identical to CreateEffectWarhead except it supports sprites with facings.")] + public class CreateFacingEffectWarhead : Warhead + { + [SequenceReference(nameof(Image), allowNullImage: true)] + [Desc("List of explosion sequences that can be used.")] + public readonly string[] Explosions = Array.Empty(); + + [Desc("Image containing explosion effect sequence.")] + public readonly string Image = "explosion"; + + [PaletteReference(nameof(UsePlayerPalette))] + [Desc("Palette to use for explosion effect.")] + public readonly string ExplosionPalette = "effect"; + + [Desc("Remap explosion effect to player color, if art supports it.")] + public readonly bool UsePlayerPalette = false; + + [Desc("Display explosion effect at ground level, regardless of explosion altitude.")] + public readonly bool ForceDisplayAtGroundLevel = false; + + [Desc("List of sounds that can be played on impact.")] + public readonly string[] ImpactSounds = Array.Empty(); + + [Desc("Chance of impact sound to play.")] + public readonly int ImpactSoundChance = 100; + + [Desc("Whether to consider actors in determining whether the explosion should happen. If false, only terrain will be considered.")] + public readonly bool ImpactActors = true; + + [Desc("The maximum inaccuracy of the effect spawn position relative to actual impact position.")] + public readonly WDist Inaccuracy = WDist.Zero; + + static readonly BitSet TargetTypeAir = new BitSet("Air"); + + /// Checks if there are any actors at impact position and if the warhead is valid against any of them. + ImpactActorType ActorTypeAtImpact(World world, WPos pos, Actor firedBy) + { + var anyInvalidActor = false; + + // Check whether the impact position overlaps with an actor's hitshape + foreach (var victim in world.FindActorsOnCircle(pos, WDist.Zero)) + { + if (!AffectsParent && victim == firedBy) + continue; + + var activeShapes = victim.TraitsImplementing().Where(t => !t.IsTraitDisabled); + if (!activeShapes.Any(s => s.DistanceFromEdge(victim, pos).Length <= 0)) + continue; + + if (IsValidAgainst(victim, firedBy)) + return ImpactActorType.Valid; + + anyInvalidActor = true; + } + + return anyInvalidActor ? ImpactActorType.Invalid : ImpactActorType.None; + } + + // ActorTypeAtImpact already checks AffectsParent beforehand, to avoid parent HitShape look-ups + // (and to prevent returning ImpactActorType.Invalid on AffectsParent=false) + public override bool IsValidAgainst(Actor victim, Actor firedBy) + { + var relationship = firedBy.Owner.RelationshipWith(victim.Owner); + if (!ValidRelationships.HasRelationship(relationship)) + return false; + + // A target type is valid if it is in the valid targets list, and not in the invalid targets list. + if (!IsValidTarget(victim.GetEnabledTargetTypes())) + return false; + + return true; + } + + public override void DoImpact(in Target target, WarheadArgs args) + { + if (target.Type == TargetType.Invalid) + return; + + var firedBy = args.SourceActor; + var pos = target.CenterPosition; + var world = firedBy.World; + var actorAtImpact = ImpactActors ? ActorTypeAtImpact(world, pos, firedBy) : ImpactActorType.None; + + // Ignore the impact if there are only invalid actors within range + if (actorAtImpact == ImpactActorType.Invalid) + return; + + // Ignore the impact if there are no valid actors and no valid terrain + // (impacts are allowed on valid actors sitting on invalid terrain!) + if (actorAtImpact == ImpactActorType.None && !IsValidAgainstTerrain(world, pos)) + return; + + var explosion = Explosions.RandomOrDefault(world.LocalRandom); + if (Image != null && explosion != null) + { + var initialPos = pos; + + if (Inaccuracy.Length > 0) + pos += WVec.FromPDF(world.SharedRandom, 2) * Inaccuracy.Length / 1024; + + if (ForceDisplayAtGroundLevel) + { + var dat = world.Map.DistanceAboveTerrain(pos); + pos -= new WVec(0, 0, dat.Length); + } + + var palette = ExplosionPalette; + if (UsePlayerPalette) + palette += firedBy.Owner.InternalName; + + /* Only difference with CreateEffectWarhead is here, calculating the facing and passing to SpriteEffect. */ + var source = pos; + if (args.Source.HasValue) + source = args.Source.Value; + + var facing = (initialPos - source).Yaw; + world.AddFrameEndTask(w => w.Add(new SpriteEffect(pos, facing, w, Image, explosion, palette))); + } + + var impactSound = ImpactSounds.RandomOrDefault(world.LocalRandom); + if (impactSound != null && world.LocalRandom.Next(0, 100) < ImpactSoundChance) + Game.Sound.Play(SoundType.World, impactSound, pos); + } + + /// Checks if the warhead is valid against the terrain at impact position. + bool IsValidAgainstTerrain(World world, WPos pos) + { + var cell = world.Map.CellContaining(pos); + if (!world.Map.Contains(cell)) + return false; + + var dat = world.Map.DistanceAboveTerrain(pos); + return IsValidTarget(dat > AirThreshold ? TargetTypeAir : world.Map.GetTerrainInfo(cell).TargetTypes); + } + } +} diff --git a/OpenRA.Mods.CA/Warheads/CreateTintedCellsWarhead.cs b/OpenRA.Mods.CA/Warheads/CreateTintedCellsWarhead.cs index 4831db2a09..15cca619a1 100644 --- a/OpenRA.Mods.CA/Warheads/CreateTintedCellsWarhead.cs +++ b/OpenRA.Mods.CA/Warheads/CreateTintedCellsWarhead.cs @@ -1,10 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion diff --git a/OpenRA.Mods.CA/Warheads/DetatchDelayedWeaponWarhead.cs b/OpenRA.Mods.CA/Warheads/DetatchDelayedWeaponWarhead.cs index 4e454522e0..b8fb226915 100644 --- a/OpenRA.Mods.CA/Warheads/DetatchDelayedWeaponWarhead.cs +++ b/OpenRA.Mods.CA/Warheads/DetatchDelayedWeaponWarhead.cs @@ -1,10 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -12,12 +12,11 @@ using System.Linq; using OpenRA.GameRules; using OpenRA.Mods.CA.Traits; -using OpenRA.Mods.CA.Warheads; using OpenRA.Mods.Common; using OpenRA.Mods.Common.Traits; using OpenRA.Traits; -namespace OpenRA.Mods.AS.Warheads +namespace OpenRA.Mods.CA.Warheads { [Desc("This warhead can detach a DelayedWeapon from the target. Requires an appropriate type of DelayedWeaponAttachable trait to function properly.")] public class DetachDelayedWeaponWarhead : WarheadAS diff --git a/OpenRA.Mods.CA/Warheads/DummyWarhead.cs b/OpenRA.Mods.CA/Warheads/DummyWarhead.cs index f05c605b52..e184fbaf95 100644 --- a/OpenRA.Mods.CA/Warheads/DummyWarhead.cs +++ b/OpenRA.Mods.CA/Warheads/DummyWarhead.cs @@ -1,11 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -16,7 +15,7 @@ namespace OpenRA.Mods.CA.Warheads { [Desc("Does nothing.")] - public class DummyWarhead : Warhead + public class DummyWarhead : TargetDamageWarhead { public override void DoImpact(in Target target, WarheadArgs args) { diff --git a/OpenRA.Mods.CA/Warheads/FireClusterCAWarhead.cs b/OpenRA.Mods.CA/Warheads/FireClusterCAWarhead.cs new file mode 100644 index 0000000000..d070222079 --- /dev/null +++ b/OpenRA.Mods.CA/Warheads/FireClusterCAWarhead.cs @@ -0,0 +1,123 @@ +#region Copyright & License Information +/* + * Copyright (c) The OpenRA Developers and Contributors + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. For more + * information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Linq; +using OpenRA.GameRules; +using OpenRA.Traits; + +namespace OpenRA.Mods.Common.Warheads +{ + [Desc("Fires weapons from the point of impact.")] + public class FireClusterCAWarhead : Warhead, IRulesetLoaded + { + [WeaponReference] + [FieldLoader.Require] + [Desc("Has to be defined in weapons.yaml as well.")] + public readonly string Weapon = null; + + [Desc("Number of weapons fired at random 'x' cells. Negative values will result in a number equal to 'x' footprint cells fired.")] + public readonly int RandomClusterCount = -1; + + [FieldLoader.Require] + [Desc("Size of the cluster footprint")] + public readonly CVec Dimensions = CVec.Zero; + + [FieldLoader.Require] + [Desc("Cluster footprint. Cells marked as X will be attacked.", + "Cells marked as x will be attacked randomly until RandomClusterCount is reached.")] + public readonly string Footprint = string.Empty; + + WeaponInfo weapon; + + public void RulesetLoaded(Ruleset rules, WeaponInfo info) + { + if (!rules.Weapons.TryGetValue(Weapon.ToLowerInvariant(), out weapon)) + throw new YamlException($"Weapons Ruleset does not contain an entry '{Weapon.ToLowerInvariant()}'"); + } + + public override void DoImpact(in Target target, WarheadArgs args) + { + if (target.Type == TargetType.Invalid) + return; + + var firedBy = args.SourceActor; + var map = firedBy.World.Map; + var targetCell = map.CellContaining(target.CenterPosition); + + var targetCells = CellsMatching(targetCell, false); + foreach (var c in targetCells) + FireProjectileAtCell(map, firedBy, target, c, args); + + if (RandomClusterCount != 0) + { + var randomTargetCells = CellsMatching(targetCell, true).ToList(); + var clusterCount = RandomClusterCount < 0 ? randomTargetCells.Count() : RandomClusterCount; + if (randomTargetCells.Count != 0) + { + var countExceedsCells = clusterCount > randomTargetCells.Count(); + var shuffledRandomTargetCells = randomTargetCells.Shuffle(firedBy.World.SharedRandom).ToList(); + for (var i = 0; i < clusterCount; i++) + FireProjectileAtCell(map, firedBy, target, countExceedsCells ? randomTargetCells.Random(firedBy.World.SharedRandom) : shuffledRandomTargetCells[i], args); + } + } + } + + void FireProjectileAtCell(Map map, Actor firedBy, Target target, CPos targetCell, WarheadArgs args) + { + var tc = Target.FromCell(firedBy.World, targetCell); + + if (!weapon.IsValidAgainst(tc, firedBy.World, firedBy)) + return; + + var projectileArgs = new ProjectileArgs + { + Weapon = weapon, + Facing = (map.CenterOfCell(targetCell) - target.CenterPosition).Yaw, + CurrentMuzzleFacing = () => (map.CenterOfCell(targetCell) - target.CenterPosition).Yaw, + + DamageModifiers = args.DamageModifiers, + InaccuracyModifiers = Array.Empty(), + RangeModifiers = Array.Empty(), + + Source = target.CenterPosition, + CurrentSource = () => target.CenterPosition, + SourceActor = firedBy, + PassiveTarget = map.CenterOfCell(targetCell), + GuidedTarget = tc + }; + + if (projectileArgs.Weapon.Projectile != null) + { + var projectile = projectileArgs.Weapon.Projectile.Create(projectileArgs); + if (projectile != null) + firedBy.World.AddFrameEndTask(w => w.Add(projectile)); + + if (projectileArgs.Weapon.Report != null && projectileArgs.Weapon.Report.Length > 0) + Game.Sound.Play(SoundType.World, projectileArgs.Weapon.Report, firedBy.World, target.CenterPosition); + } + } + + IEnumerable CellsMatching(CPos location, bool random) + { + var cellType = !random ? 'X' : 'x'; + var index = 0; + var footprint = Footprint.Where(c => !char.IsWhiteSpace(c)).ToArray(); + var x = location.X - (Dimensions.X - 1) / 2; + var y = location.Y - (Dimensions.Y - 1) / 2; + for (var j = 0; j < Dimensions.Y; j++) + for (var i = 0; i < Dimensions.X; i++) + if (footprint[index++] == cellType) + yield return new CPos(x + i, y + j); + } + } +} diff --git a/OpenRA.Mods.CA/Warheads/FireFragmentWarhead.cs b/OpenRA.Mods.CA/Warheads/FireFragmentWarhead.cs index 94a6d436bd..7beb2c9efe 100644 --- a/OpenRA.Mods.CA/Warheads/FireFragmentWarhead.cs +++ b/OpenRA.Mods.CA/Warheads/FireFragmentWarhead.cs @@ -1,14 +1,13 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion -using System.Collections.Generic; using System.Linq; using OpenRA.GameRules; using OpenRA.Mods.Common.Traits; @@ -39,7 +38,7 @@ public class FireFragmentWarhead : WarheadAS, IRulesetLoaded public void RulesetLoaded(Ruleset rules, WeaponInfo info) { if (!rules.Weapons.TryGetValue(Weapon.ToLowerInvariant(), out weapon)) - throw new YamlException("Weapons Ruleset does not contain an entry '{0}'".F(Weapon.ToLowerInvariant())); + throw new YamlException($"Weapons Ruleset does not contain an entry '{Weapon.ToLowerInvariant()}'"); } public override void DoImpact(in Target target, WarheadArgs args) @@ -94,7 +93,7 @@ public override void DoImpact(in Target target, WarheadArgs args) if (projectile != null) firedBy.World.AddFrameEndTask(w => w.Add(projectile)); - if (projectileArgs.Weapon.Report != null && projectileArgs.Weapon.Report.Any()) + if (projectileArgs.Weapon.Report != null && projectileArgs.Weapon.Report.Length > 0) Game.Sound.Play(SoundType.World, projectileArgs.Weapon.Report.Random(firedBy.World.SharedRandom), target.CenterPosition); } } diff --git a/OpenRA.Mods.CA/Warheads/FireRadiusWarhead.cs b/OpenRA.Mods.CA/Warheads/FireRadiusWarhead.cs index 92f660da95..8f35b4839d 100644 --- a/OpenRA.Mods.CA/Warheads/FireRadiusWarhead.cs +++ b/OpenRA.Mods.CA/Warheads/FireRadiusWarhead.cs @@ -1,17 +1,15 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion -using System.Collections.Generic; using System.Linq; using OpenRA.GameRules; -using OpenRA.Mods.Common; using OpenRA.Mods.Common.Traits; using OpenRA.Traits; @@ -36,7 +34,7 @@ public class FireRadiusWarhead : WarheadAS, IRulesetLoaded public void RulesetLoaded(Ruleset rules, WeaponInfo info) { if (!rules.Weapons.TryGetValue(Weapon.ToLowerInvariant(), out weapon)) - throw new YamlException("Weapons Ruleset does not contain an entry '{0}'".F(Weapon.ToLowerInvariant())); + throw new YamlException($"Weapons Ruleset does not contain an entry '{Weapon.ToLowerInvariant()}'"); } public override void DoImpact(in Target target, WarheadArgs args) @@ -102,7 +100,7 @@ public override void DoImpact(in Target target, WarheadArgs args) if (projectile != null) firedBy.World.AddFrameEndTask(w => w.Add(projectile)); - if (args.Weapon.Report != null && projectileArgs.Weapon.Report.Any()) + if (args.Weapon.Report != null && projectileArgs.Weapon.Report.Length > 0) Game.Sound.Play(SoundType.World, projectileArgs.Weapon.Report.Random(firedBy.World.SharedRandom), target.CenterPosition); } } diff --git a/OpenRA.Mods.CA/Warheads/FireShrapnelWarhead.cs b/OpenRA.Mods.CA/Warheads/FireShrapnelWarhead.cs index e5e1560814..b41a367367 100644 --- a/OpenRA.Mods.CA/Warheads/FireShrapnelWarhead.cs +++ b/OpenRA.Mods.CA/Warheads/FireShrapnelWarhead.cs @@ -1,13 +1,14 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion +using System; using System.Linq; using OpenRA.GameRules; using OpenRA.Mods.Common; @@ -41,12 +42,21 @@ public class FireShrapnelWarhead : WarheadAS, IRulesetLoaded [Desc("Should the weapons be fired around the intended target or at the explosion's epicenter.")] public readonly bool AroundTarget = false; + [Desc("Does this weapon aim at the target's center regardless of other targetable offsets?")] + public readonly bool TargetActorCenter = false; + + [Desc("List of sounds that can be played on impact.")] + public readonly string[] ImpactSounds = Array.Empty(); + + [Desc("Should the shrapnel target actors in order of distance?")] + public readonly bool TargetClosest = false; + WeaponInfo weapon; public void RulesetLoaded(Ruleset rules, WeaponInfo info) { if (!rules.Weapons.TryGetValue(Weapon.ToLowerInvariant(), out weapon)) - throw new YamlException("Weapons Ruleset does not contain an entry '{0}'".F(Weapon.ToLowerInvariant())); + throw new YamlException($"Weapons Ruleset does not contain an entry '{Weapon.ToLowerInvariant()}'"); } public override void DoImpact(in Target target, WarheadArgs args) @@ -83,7 +93,7 @@ public override void DoImpact(in Target target, WarheadArgs args) var availableTargetActors = world.FindActorsOnCircle(epicenter, weapon.Range) .Where(x => (AllowDirectHit || !directActors.Contains(x)) && weapon.IsValidAgainst(Target.FromActor(x), firedBy.World, firedBy) - && AimTargetStances.HasStance(firedBy.Owner.RelationshipWith(x.Owner))) + && AimTargetStances.HasRelationship(firedBy.Owner.RelationshipWith(x.Owner))) .Where(x => { var activeShapes = x.TraitsImplementing().Where(Exts.IsTraitEnabled); @@ -96,14 +106,20 @@ public override void DoImpact(in Target target, WarheadArgs args) return true; return false; - }) - .Shuffle(world.SharedRandom); + }); + + if (TargetClosest) + availableTargetActors = availableTargetActors.OrderBy(x => (x.CenterPosition - epicenter).Length); + else + availableTargetActors = availableTargetActors.Shuffle(world.SharedRandom); var targetActor = availableTargetActors.GetEnumerator(); var amount = Amount.Length == 2 ? world.SharedRandom.Next(Amount[0], Amount[1]) - : Amount[0]; + : Amount[0] == 0 ? availableTargetActors.Count() : Amount[0]; + + var targetFound = false; for (var i = 0; i < amount; i++) { @@ -125,6 +141,8 @@ public override void DoImpact(in Target target, WarheadArgs args) if (shrapnelTarget.Type == TargetType.Invalid) continue; + targetFound = true; + var shrapnelFacing = (shrapnelTarget.CenterPosition - epicenter).Yaw; // Lambdas can't use 'in' variables, so capture a copy for later @@ -149,7 +167,7 @@ public override void DoImpact(in Target target, WarheadArgs args) CurrentSource = () => centerPosition, SourceActor = firedBy, GuidedTarget = shrapnelTarget, - PassiveTarget = shrapnelTarget.CenterPosition + PassiveTarget = TargetActorCenter ? shrapnelTarget.CenterPosition : shrapnelTarget.Positions.ClosestToIgnoringPath(epicenter) }; if (projectileArgs.Weapon.Projectile != null) @@ -158,10 +176,17 @@ public override void DoImpact(in Target target, WarheadArgs args) if (projectile != null) firedBy.World.AddFrameEndTask(w => w.Add(projectile)); - if (projectileArgs.Weapon.Report != null && projectileArgs.Weapon.Report.Any()) + if (projectileArgs.Weapon.Report != null && projectileArgs.Weapon.Report.Length > 0) Game.Sound.Play(SoundType.World, projectileArgs.Weapon.Report.Random(firedBy.World.SharedRandom), target.CenterPosition); } } + + if (targetFound) + { + var impactSound = ImpactSounds.RandomOrDefault(world.LocalRandom); + if (impactSound != null) + Game.Sound.Play(SoundType.World, impactSound, target.CenterPosition); + } } } } diff --git a/OpenRA.Mods.CA/Warheads/FlashTargetWarhead.cs b/OpenRA.Mods.CA/Warheads/FlashTargetWarhead.cs new file mode 100644 index 0000000000..e32aa880e4 --- /dev/null +++ b/OpenRA.Mods.CA/Warheads/FlashTargetWarhead.cs @@ -0,0 +1,32 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.GameRules; +using OpenRA.Mods.Common.Effects; +using OpenRA.Mods.Common.Traits; +using OpenRA.Mods.Common.Warheads; +using OpenRA.Primitives; + +namespace OpenRA.Mods.CA.Warheads +{ + [Desc("Flashes the target.")] + public class FlashTargetWarhead : TargetDamageWarhead + { + public readonly Color Color = Color.White; + + protected override void InflictDamage(Actor victim, Actor firedBy, HitShape shape, WarheadArgs args) + { + victim.World.AddFrameEndTask(w => + { + w.Add(new FlashTarget(victim, Color, 0.5f, 1, 2, 0)); + }); + } + } +} diff --git a/OpenRA.Mods.CA/Warheads/GrantExternalConditionCAWarhead.cs b/OpenRA.Mods.CA/Warheads/GrantExternalConditionCAWarhead.cs new file mode 100644 index 0000000000..ced4391aac --- /dev/null +++ b/OpenRA.Mods.CA/Warheads/GrantExternalConditionCAWarhead.cs @@ -0,0 +1,84 @@ +#region Copyright & License Information +/* + * Copyright (c) The OpenRA Developers and Contributors + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. For more + * information, see COPYING. + */ +#endregion + +using System.Linq; +using OpenRA.GameRules; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.Common.Warheads +{ + [Desc("Grant an external condition to hit actors.")] + public class GrantExternalConditionCAWarhead : Warhead + { + [FieldLoader.Require] + [Desc("The condition to apply. Must be included in the target actor's ExternalConditions list.")] + public readonly string Condition = null; + + [Desc("Duration of the condition (in ticks). Set to 0 for a permanent condition.")] + public readonly int Duration = 0; + + public readonly WDist Range = WDist.FromCells(1); + + public readonly WDist RangeLimit = WDist.FromCells(2); + + public readonly bool HitShapeCheck = true; + + public override void DoImpact(in Target target, WarheadArgs args) + { + var firedBy = args.SourceActor; + + if (target.Type == TargetType.Invalid) + return; + + var rangeLimit = Range > RangeLimit ? Range : RangeLimit; + var actors = firedBy.World.FindActorsInCircle(target.CenterPosition, rangeLimit); + + foreach (var a in actors) + { + if (!IsValidAgainst(a, firedBy)) + continue; + + if (HitShapeCheck) + { + HitShape closestActiveShape = null; + var closestDistance = int.MaxValue; + + // PERF: Avoid using TraitsImplementing that needs to find the actor in the trait dictionary. + foreach (var targetPos in a.EnabledTargetablePositions) + { + if (targetPos is HitShape hitshape) + { + var distance = hitshape.DistanceFromEdge(a, target.CenterPosition).Length; + if (distance < closestDistance) + { + closestDistance = distance; + closestActiveShape = hitshape; + } + } + } + + // Cannot be damaged without an active HitShape. + if (closestActiveShape == null) + continue; + + // Cannot be damaged if HitShape is outside Spread. + if (closestDistance > Range.Length) + continue; + } + + a.TraitsImplementing() + .FirstOrDefault(t => t.Info.Condition == Condition && t.CanGrantCondition(firedBy)) + ?.GrantCondition(a, firedBy, Duration); + } + } + } +} diff --git a/OpenRA.Mods.CA/Warheads/HealthPercentageSpreadDamageWarhead.cs b/OpenRA.Mods.CA/Warheads/HealthPercentageSpreadDamageWarhead.cs new file mode 100644 index 0000000000..c337d6ef8e --- /dev/null +++ b/OpenRA.Mods.CA/Warheads/HealthPercentageSpreadDamageWarhead.cs @@ -0,0 +1,43 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.GameRules; +using OpenRA.Mods.Common; +using OpenRA.Mods.Common.Traits; +using OpenRA.Mods.Common.Warheads; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Warheads +{ + [Desc("Apply damage in a specified range.")] + public class HealthPercentageSpreadDamageWarhead : SpreadDamageWarhead, IRulesetLoaded + { + [Desc("If target health is higher than this, assume this amount instead.")] + public readonly int MaxReferenceHp = 0; + + [Desc("If target health is lower than this, assume this amount instead.")] + public readonly int MinReferenceHp = 0; + + protected override void InflictDamage(Actor victim, Actor firedBy, HitShape shape, WarheadArgs args) + { + var healthInfo = victim.Info.TraitInfo(); + var referenceHp = healthInfo.HP; + + if (MaxReferenceHp > 0 && referenceHp > MaxReferenceHp) + referenceHp = MaxReferenceHp; + + if (MinReferenceHp > 0 && referenceHp < MinReferenceHp) + referenceHp = MinReferenceHp; + + var damage = Util.ApplyPercentageModifiers(referenceHp, args.DamageModifiers.Append(Damage, DamageVersus(victim, shape, args))); + victim.InflictDamage(firedBy, new Damage(damage, DamageTypes)); + } + } +} diff --git a/OpenRA.Mods.CA/Warheads/InfiltrateWarhead.cs b/OpenRA.Mods.CA/Warheads/InfiltrateWarhead.cs new file mode 100644 index 0000000000..0e3a0c8402 --- /dev/null +++ b/OpenRA.Mods.CA/Warheads/InfiltrateWarhead.cs @@ -0,0 +1,49 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Linq; +using OpenRA.GameRules; +using OpenRA.Mods.Common.Traits; +using OpenRA.Mods.Common.Warheads; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Warheads +{ + [Desc("Does nothing.")] + public class InfiltrateWarhead : Warhead + { + [Desc("The `TargetTypes` from `Targetable` that can be targeted.")] + public readonly BitSet Types = default; + + public readonly WDist Range = WDist.FromCells(1); + + public override void DoImpact(in Target target, WarheadArgs args) + { + var firedBy = args.SourceActor; + + if (target.Type == TargetType.Invalid) + return; + + var actors = target.Type == TargetType.Actor ? new[] { target.Actor } : + firedBy.World.FindActorsInCircle(target.CenterPosition, Range); + + foreach (var a in actors) + { + if (!IsValidAgainst(a, firedBy)) + continue; + + var notifiers = a.TraitsImplementing().ToArray(); + foreach (var n in notifiers) + n.Infiltrated(a, firedBy, Types); + } + } + } +} diff --git a/OpenRA.Mods.CA/Warheads/RevealShroudWarhead.cs b/OpenRA.Mods.CA/Warheads/RevealShroudWarhead.cs index f77361fd8e..db3dfb5e81 100644 --- a/OpenRA.Mods.CA/Warheads/RevealShroudWarhead.cs +++ b/OpenRA.Mods.CA/Warheads/RevealShroudWarhead.cs @@ -1,10 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion diff --git a/OpenRA.Mods.CA/Warheads/SendAirstrikeWarhead.cs b/OpenRA.Mods.CA/Warheads/SendAirstrikeWarhead.cs index 155a88aa7b..40d982ec82 100644 --- a/OpenRA.Mods.CA/Warheads/SendAirstrikeWarhead.cs +++ b/OpenRA.Mods.CA/Warheads/SendAirstrikeWarhead.cs @@ -1,10 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion diff --git a/OpenRA.Mods.CA/Warheads/SpawnActorWarhead.cs b/OpenRA.Mods.CA/Warheads/SpawnActorWarhead.cs index 81d80287d1..a7b272393e 100644 --- a/OpenRA.Mods.CA/Warheads/SpawnActorWarhead.cs +++ b/OpenRA.Mods.CA/Warheads/SpawnActorWarhead.cs @@ -1,16 +1,18 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion +using System; using System.Linq; using OpenRA.GameRules; using OpenRA.Mods.CA.Activities; +using OpenRA.Mods.Common; using OpenRA.Mods.Common.Activities; using OpenRA.Mods.Common.Effects; using OpenRA.Mods.Common.Traits; @@ -63,8 +65,14 @@ public class SpawnActorWarhead : WarheadAS, IRulesetLoaded [Desc("For non-positionable actors only, whether to avoid spawning on top of existing actors.")] public readonly bool AvoidActors = false; + [Desc("For actors with facing, match the facing of the source (if the source also has a facing) .")] + public readonly bool MatchSourceFacing = false; + public readonly bool UsePlayerPalette = false; + [Desc("Will only spawn if the owner of the source actor has these prerequisites.")] + public readonly string[] Prerequisites = Array.Empty(); + public void RulesetLoaded(Ruleset rules, WeaponInfo info) { foreach (var a in Actors) @@ -73,13 +81,17 @@ public void RulesetLoaded(Ruleset rules, WeaponInfo info) var buildingInfo = actorInfo.TraitInfoOrDefault(); if (buildingInfo != null) - throw new YamlException("SpawnActorWarhead cannot be used to spawn building actor '{0}'!".F(a)); + throw new YamlException($"SpawnActorWarhead cannot be used to spawn building actor '{a}'!"); } } public override void DoImpact(in Target target, WarheadArgs args) { var firedBy = args.SourceActor; + + if (Prerequisites.Length > 0 && !firedBy.Owner.PlayerActor.Trait().HasPrerequisites(Prerequisites)) + return; + if (!target.IsValidFor(firedBy)) return; @@ -95,7 +107,8 @@ public override void DoImpact(in Target target, WarheadArgs args) foreach (var a in Actors) { var placed = false; - var ai = map.Rules.Actors[a.ToLowerInvariant()]; + var actorType = a.ToLowerInvariant(); + var ai = map.Rules.Actors[actorType]; var td = CreateTypeDictionary(firedBy, targetCell); // Lambdas can't use 'in' variables, so capture a copy for later @@ -103,14 +116,10 @@ public override void DoImpact(in Target target, WarheadArgs args) firedBy.World.AddFrameEndTask(w => { - var unit = firedBy.World.CreateActor(false, a.ToLowerInvariant(), td); - var positionable = unit.TraitOrDefault(); cell = targetCells.GetEnumerator(); - if (positionable == null) + if (!ai.HasTraitInfo()) { - unit.Dispose(); - if (AvoidActors) { while (cell.MoveNext() && !placed) @@ -132,6 +141,9 @@ public override void DoImpact(in Target target, WarheadArgs args) } else { + var unit = firedBy.World.CreateActor(false, actorType, td); + var positionable = unit.TraitOrDefault(); + while (cell.MoveNext() && !placed) { var subCell = positionable.GetAvailableSubCell(cell.Current); @@ -148,7 +160,7 @@ public override void DoImpact(in Target target, WarheadArgs args) if (!ForceGround) pos += new WVec(WDist.Zero, WDist.Zero, firedBy.World.Map.DistanceAboveTerrain(delayedTarget.CenterPosition)); - positionable.SetVisualPosition(unit, pos); + positionable.SetCenterPosition(unit, pos); w.Add(unit); if (Paradrop) @@ -189,6 +201,13 @@ TypeDictionary CreateTypeDictionary(Actor firedBy, CPos targetCell) td.Add(new LocationInit(targetCell)); + if (MatchSourceFacing) + { + var facing = firedBy.TraitOrDefault(); + if (facing != null) + td.Add(new FacingInit(facing.Facing)); + } + return td; } } diff --git a/OpenRA.Mods.CA/Warheads/SpawnBuildingWarhead.cs b/OpenRA.Mods.CA/Warheads/SpawnBuildingWarhead.cs index 50ef9eb512..ab69be7062 100644 --- a/OpenRA.Mods.CA/Warheads/SpawnBuildingWarhead.cs +++ b/OpenRA.Mods.CA/Warheads/SpawnBuildingWarhead.cs @@ -1,10 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion @@ -60,7 +60,7 @@ public void RulesetLoaded(Ruleset rules, WeaponInfo info) var buildingInfo = actorInfo.TraitInfoOrDefault(); if (buildingInfo == null) - throw new YamlException("SpawnBuildingWarhead cannot be used to spawn nonbuilding actor '{0}'".F(b)); + throw new YamlException($"SpawnBuildingWarhead cannot be used to spawn nonbuilding actor '{b}'"); } } diff --git a/OpenRA.Mods.CA/Warheads/SpawnMultiWeaponImpactWarhead.cs b/OpenRA.Mods.CA/Warheads/SpawnMultiWeaponImpactWarhead.cs new file mode 100644 index 0000000000..714a65d8c8 --- /dev/null +++ b/OpenRA.Mods.CA/Warheads/SpawnMultiWeaponImpactWarhead.cs @@ -0,0 +1,91 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.GameRules; +using OpenRA.Mods.CA.Effects; +using OpenRA.Mods.CA.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Warheads +{ + public class SpawnMultiWeaponImpactWarhead : WarheadAS, IRulesetLoaded, IMultiWeaponImpactInfo + { + [Desc("A pair of values (x,y) for each impact offset.")] + public readonly CVec[] ImpactOffsets = { CVec.Zero }; + + [Desc("Adds a random offset to the impact position up to this value.")] + public readonly WDist RandomOffset = WDist.Zero; + + [FieldLoader.Require] + [WeaponReference] + [Desc("Has to be defined in weapons.yaml, if defined, as well.")] + public readonly string Weapon = null; + + [Desc("Whether the sequence of the impacts should be randomized.")] + public readonly bool RandomImpactSequence = false; + + [Desc("Defines particle ownership (invoker if unset).")] + public readonly bool Neutral = false; + + [Desc("Interval between each impact. Use two values for a random range. If not set the weapon's ReloadDelay is used.")] + public readonly int[] Interval = null; + + WeaponInfo weapon; + + WeaponInfo IMultiWeaponImpactInfo.Weapon + { + get { return weapon; } + } + + CVec[] IMultiWeaponImpactInfo.ImpactOffsets + { + get { return ImpactOffsets; } + } + + WDist IMultiWeaponImpactInfo.RandomOffset + { + get { return RandomOffset; } + } + + bool IMultiWeaponImpactInfo.RandomImpactSequence + { + get { return RandomImpactSequence; } + } + + int[] IMultiWeaponImpactInfo.Interval + { + get { return Interval; } + } + + public void RulesetLoaded(Ruleset rules, WeaponInfo info) + { + if (string.IsNullOrEmpty(Weapon)) + return; + + if (!rules.Weapons.TryGetValue(Weapon.ToLowerInvariant(), out weapon)) + throw new YamlException($"Weapons Ruleset does not contain an entry '{Weapon.ToLowerInvariant()}'"); + } + + public override void DoImpact(in Target target, WarheadArgs args) + { + var firedBy = args.SourceActor; + if (!target.IsValidFor(firedBy)) + return; + + if (!IsValidImpact(target.CenterPosition, firedBy)) + return; + + // Lambdas can't use 'in' variables, so capture a copy for later + var delayedTarget = target; + + firedBy.World.AddFrameEndTask(w => w.Add(new MultiWeaponImpactEffect(Neutral || firedBy.IsDead ? firedBy.World.WorldActor : firedBy, this, delayedTarget.CenterPosition))); + } + } +} diff --git a/OpenRA.Mods.CA/Warheads/SpawnRandomActorWarhead.cs b/OpenRA.Mods.CA/Warheads/SpawnRandomActorWarhead.cs index a108074c6a..3d62b3400d 100644 --- a/OpenRA.Mods.CA/Warheads/SpawnRandomActorWarhead.cs +++ b/OpenRA.Mods.CA/Warheads/SpawnRandomActorWarhead.cs @@ -1,14 +1,13 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion -using System.Collections.Generic; using System.Linq; using OpenRA.GameRules; using OpenRA.Mods.CA.Activities; @@ -69,7 +68,7 @@ public void RulesetLoaded(Ruleset rules, WeaponInfo info) var buildingInfo = actorInfo.TraitInfoOrDefault(); if (buildingInfo != null) - throw new YamlException("SpawnActorWarhead cannot be used to spawn building actor '{0}'!".F(a)); + throw new YamlException($"SpawnActorWarhead cannot be used to spawn building actor '{a}'!"); } } @@ -120,7 +119,7 @@ public override void DoImpact(in Target target, WarheadArgs args) if (!ForceGround) pos += new WVec(WDist.Zero, WDist.Zero, firedBy.World.Map.DistanceAboveTerrain(delayedTarget.CenterPosition)); - positionable.SetVisualPosition(unit, pos); + positionable.SetCenterPosition(unit, pos); w.Add(unit); if (Paradrop) diff --git a/OpenRA.Mods.CA/Warheads/SpawnSmokeParticleWarhead.cs b/OpenRA.Mods.CA/Warheads/SpawnSmokeParticleWarhead.cs deleted file mode 100644 index 09879d1207..0000000000 --- a/OpenRA.Mods.CA/Warheads/SpawnSmokeParticleWarhead.cs +++ /dev/null @@ -1,134 +0,0 @@ -#region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. - */ -#endregion - -using OpenRA.GameRules; -using OpenRA.Mods.CA.Effects; -using OpenRA.Mods.CA.Traits; -using OpenRA.Traits; - -namespace OpenRA.Mods.CA.Warheads -{ - public class SpawnSmokeParticleWarhead : WarheadAS, IRulesetLoaded, ISmokeParticleInfo - { - [Desc("Amount of particles spawned. Two values mean actual amount will vary between them.")] - public readonly int[] Count = { 1 }; - - [FieldLoader.Require] - [Desc("The duration of an individual particle. Two values mean actual lifetime will vary between them.")] - public readonly int[] Duration; - - [Desc("Randomize particle forward movement.")] - public readonly WDist[] Speed = { WDist.Zero }; - - [Desc("Randomize particle gravity.")] - public readonly WDist[] Gravity = { WDist.Zero }; - - [Desc("Randomize particle turnrate.")] - public readonly int TurnRate = 0; - - [Desc("Rate to reset particle movement properties.")] - public readonly int RandomRate = 4; - - [Desc("Which image to use.")] - public readonly string Image = "particles"; - - [FieldLoader.Require] - [SequenceReference(nameof(Image))] - [Desc("Which sequence to use.")] - public readonly string[] Sequences = null; - - [PaletteReference] - [Desc("Which palette to use.")] - public readonly string Palette = null; - - [Desc("Defines particle ownership (invoker if unset).")] - public readonly bool Neutral = false; - - [WeaponReference] - [Desc("Has to be defined in weapons.yaml, if defined, as well.")] - public readonly string Weapon = null; - - WeaponInfo weapon; - - string ISmokeParticleInfo.Image - { - get { return Image; } - } - - string[] ISmokeParticleInfo.Sequences - { - get { return Sequences; } - } - - string ISmokeParticleInfo.Palette - { - get { return Palette; } - } - - WDist[] ISmokeParticleInfo.Speed - { - get { return Speed; } - } - - WDist[] ISmokeParticleInfo.Gravity - { - get { return Gravity; } - } - - int[] ISmokeParticleInfo.Duration - { - get { return Duration; } - } - - WeaponInfo ISmokeParticleInfo.Weapon - { - get { return weapon; } - } - - int ISmokeParticleInfo.TurnRate - { - get { return TurnRate; } - } - - int ISmokeParticleInfo.RandomRate - { - get { return RandomRate; } - } - - public void RulesetLoaded(Ruleset rules, WeaponInfo info) - { - if (string.IsNullOrEmpty(Weapon)) - return; - - if (!rules.Weapons.TryGetValue(Weapon.ToLowerInvariant(), out weapon)) - throw new YamlException("Weapons Ruleset does not contain an entry '{0}'".F(Weapon.ToLowerInvariant())); - } - - public override void DoImpact(in Target target, WarheadArgs args) - { - var firedBy = args.SourceActor; - if (!target.IsValidFor(firedBy)) - return; - - if (!IsValidImpact(target.CenterPosition, firedBy)) - return; - - var count = Count.Length == 2 - ? firedBy.World.SharedRandom.Next(Count[0], Count[1]) - : Count[0]; - - // Lambdas can't use 'in' variables, so capture a copy for later - var delayedTarget = target; - - for (var i = 0; i < count; i++) - firedBy.World.AddFrameEndTask(w => w.Add(new SmokeParticle(Neutral || firedBy.IsDead ? firedBy.World.WorldActor : firedBy, this, delayedTarget.CenterPosition))); - } - } -} diff --git a/OpenRA.Mods.CA/Warheads/WarheadAS.cs b/OpenRA.Mods.CA/Warheads/WarheadAS.cs index cee926ba75..99e3d9c93c 100644 --- a/OpenRA.Mods.CA/Warheads/WarheadAS.cs +++ b/OpenRA.Mods.CA/Warheads/WarheadAS.cs @@ -1,15 +1,14 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion using System.Linq; -using OpenRA.GameRules; using OpenRA.Mods.Common; using OpenRA.Mods.Common.Traits; using OpenRA.Mods.Common.Warheads; diff --git a/OpenRA.Mods.CA/Warheads/WarpDamageWarhead.cs b/OpenRA.Mods.CA/Warheads/WarpDamageWarhead.cs index b8769041b6..6d3f07bd9d 100644 --- a/OpenRA.Mods.CA/Warheads/WarpDamageWarhead.cs +++ b/OpenRA.Mods.CA/Warheads/WarpDamageWarhead.cs @@ -1,14 +1,13 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion -using System.Collections.Generic; using OpenRA.GameRules; using OpenRA.Mods.CA.Traits; using OpenRA.Mods.Common; diff --git a/OpenRA.Mods.CA/Warheads/WarpPercentDamageWarhead.cs b/OpenRA.Mods.CA/Warheads/WarpPercentDamageWarhead.cs index ee7806405c..dfcc93a1d6 100644 --- a/OpenRA.Mods.CA/Warheads/WarpPercentDamageWarhead.cs +++ b/OpenRA.Mods.CA/Warheads/WarpPercentDamageWarhead.cs @@ -1,14 +1,13 @@ #region Copyright & License Information -/* - * Copyright 2015- OpenRA.Mods.AS Developers (see AUTHORS) - * This file is a part of a third-party plugin for OpenRA, which is - * free software. It is made available to you under the terms of the - * GNU General Public License as published by the Free Software - * Foundation. For more information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion -using System.Collections.Generic; using OpenRA.GameRules; using OpenRA.Mods.CA.Traits; using OpenRA.Mods.Common; diff --git a/OpenRA.Mods.CA/Widgets/ActorPreviewCAWidget.cs b/OpenRA.Mods.CA/Widgets/ActorPreviewCAWidget.cs new file mode 100644 index 0000000000..ab927a08a4 --- /dev/null +++ b/OpenRA.Mods.CA/Widgets/ActorPreviewCAWidget.cs @@ -0,0 +1,244 @@ +#region Copyright & License Information +/* + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using OpenRA.Graphics; +using OpenRA.Mods.CA.Graphics; +using OpenRA.Mods.CA.Traits; +using OpenRA.Mods.Common.Graphics; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Widgets; + +namespace OpenRA.Mods.CA.Widgets +{ + /// + /// Extended ActorPreviewWidget that supports: + /// - Arbitrary player colors (not tied to map players) + /// - Preview rendering of overlay traits like WithColoredOverlay, WithPalettedOverlay + /// - Automatic palette swapping for player-colored sprites to use encyclopedia palette + /// Uses Render() instead of RenderUI() to get SpriteRenderables which already support IModifyableRenderable. + /// + public class ActorPreviewCAWidget : Widget + { + public bool Animate = false; + public Func GetScale = () => 1f; + + readonly ModData modData; + readonly WorldRenderer worldRenderer; + readonly WorldViewportSizes viewportSizes; + + IActorPreview[] preview = Array.Empty(); + readonly List previewModifiers = new(); + + public int2 PreviewOffset { get; private set; } + public int2 IdealPreviewSize { get; private set; } + + // The color to use for player-colored elements + Color previewColor = Color.White; + + [ObjectCreator.UseCtor] + public ActorPreviewCAWidget(ModData modData, WorldRenderer worldRenderer) + { + this.modData = modData; + viewportSizes = modData.Manifest.Get(); + this.worldRenderer = worldRenderer; + } + + protected ActorPreviewCAWidget(ActorPreviewCAWidget other) + : base(other) + { + modData = other.modData; + preview = other.preview; + previewModifiers = other.previewModifiers; + worldRenderer = other.worldRenderer; + viewportSizes = other.viewportSizes; + previewColor = other.previewColor; + } + + public override Widget Clone() { return new ActorPreviewCAWidget(this); } + + /// + /// Sets an arbitrary color to use for player-colored elements in the preview. + /// + public void SetPreviewColor(Color color) + { + previewColor = color; + } + + /// + /// Sets the preview with a custom color for player-colored elements. + /// + public void SetPreview(ActorInfo actor, TypeDictionary td, Color? color = null) + { + if (color.HasValue) + previewColor = color.Value; + + var init = new ActorPreviewInitializer(actor, worldRenderer, td); + + preview = actor.TraitInfos() + .SelectMany(rpi => rpi.RenderPreview(init)) + .ToArray(); + + // Collect preview-aware render modifiers + previewModifiers.Clear(); + var modifierInfos = actor.TraitInfos().ToList(); + foreach (var modifierInfo in modifierInfos) + { + var modifier = modifierInfo.GetPreviewRenderModifier(worldRenderer, actor, td, previewColor); + if (modifier != null) + previewModifiers.Add(modifier); + } + + // Calculate the preview bounds + var r = preview.SelectMany(p => p.ScreenBounds(worldRenderer, WPos.Zero)); + var b = r.Union(); + IdealPreviewSize = new int2((int)(b.Width * viewportSizes.DefaultScale), (int)(b.Height * viewportSizes.DefaultScale)); + PreviewOffset = -new int2((int)(b.Left * viewportSizes.DefaultScale), (int)(b.Top * viewportSizes.DefaultScale)) - IdealPreviewSize / 2; + } + + IFinalizedRenderable[] renderables; + readonly Dictionary paletteCache = new(); + + static readonly FieldInfo SpriteRenderableSpriteField = typeof(SpriteRenderable).GetField("sprite", BindingFlags.NonPublic | BindingFlags.Instance); + static readonly FieldInfo SpriteRenderablePosField = typeof(SpriteRenderable).GetField("pos", BindingFlags.NonPublic | BindingFlags.Instance); + static readonly FieldInfo SpriteRenderableScaleField = typeof(SpriteRenderable).GetField("scale", BindingFlags.NonPublic | BindingFlags.Instance); + static readonly FieldInfo SpriteRenderableRotationField = typeof(SpriteRenderable).GetField("rotation", BindingFlags.NonPublic | BindingFlags.Instance); + + public override void PrepareRenderables() + { + var scale = GetScale() * viewportSizes.DefaultScale; + var origin = RenderOrigin + PreviewOffset + new int2(RenderBounds.Size.Width / 2, RenderBounds.Size.Height / 2); + + // Use Render() to get SpriteRenderables (supports IModifyableRenderable), + // then convert to UI-space renderables so they are not affected by world viewport/camera. + var baseRenderables = preview + .SelectMany(p => p.Render(worldRenderer, WPos.Zero)) + .OrderBy(WorldRenderer.RenderableZPositionComparisonKey) + .Select(r => + { + if (r is not SpriteRenderable sr) + return r; + + // SpriteRenderable's sprite/pos/scale/rotation are private; extract them once here. + // These field names are stable within this engine version. + var sprite = (Sprite)SpriteRenderableSpriteField.GetValue(sr); + var basePos = (WPos)SpriteRenderablePosField.GetValue(sr); + var baseScale = (float)SpriteRenderableScaleField.GetValue(sr); + var rotation = (WAngle)SpriteRenderableRotationField.GetValue(sr); + + var totalScale = baseScale * scale; + + // Map the world-space renderable position into the encyclopedia widget UI coordinate space. + // This mirrors the semantics of Animation.RenderUI (pos + scaled offsets - half sprite size). + var baseOffsetPx = (totalScale * worldRenderer.ScreenPosition(basePos)).ToInt2(); + var offsetPx = (totalScale * worldRenderer.ScreenVectorComponents(sr.Offset)).XY.ToInt2(); + var halfSizePx = new int2((int)(totalScale * sprite.Size.X / 2), (int)(totalScale * sprite.Size.Y / 2)); + var screenPos = origin + baseOffsetPx + offsetPx - halfSizePx; + + return new UIModifyableSpriteRenderable( + sprite, + sr.Pos, + screenPos, + sr.ZOffset, + sr.Palette, + totalScale, + sr.Alpha, + sr.Tint, + sr.TintModifiers, + sr.IsDecoration, + rotation.RendererRadians(), + worldRenderer.TileSize, + worldRenderer.TileScale); + }) + .ToList(); + + // Calculate scaled bounds for modifiers + var scaledBounds = new Rectangle( + origin.X - (int)(IdealPreviewSize.X * GetScale() / 2), + origin.Y - (int)(IdealPreviewSize.Y * GetScale() / 2), + (int)(IdealPreviewSize.X * GetScale()), + (int)(IdealPreviewSize.Y * GetScale())); + + // Apply preview modifiers + foreach (var modifier in previewModifiers) + baseRenderables = modifier.ModifyPreviewRender(worldRenderer, baseRenderables, scaledBounds).ToList(); + + // Swap player palettes to encyclopedia palettes for proper coloring + renderables = baseRenderables + .Select(r => SwapPlayerPalette(r)) + .Select(r => r.PrepareRender(worldRenderer)) + .ToArray(); + } + + /// + /// Swaps player-colored palettes to encyclopedia palettes. + /// e.g., "playerGreece" -> "encyclopedia", "playertdNod" -> "encyclopediatd", "playerscrinScrin" -> "encyclopediascrin". + /// + IRenderable SwapPlayerPalette(IRenderable r) + { + if (r is IPalettedRenderable pr && pr.Palette != null) + { + var paletteName = pr.Palette.Name; + if (paletteName != null && paletteName.StartsWith("player", StringComparison.Ordinal)) + { + // Palette names are like "playerGreece", "playertdNod", "playerscrinScrin" + // We need to extract just the base palette type (player, playertd, playerscrin) + // and replace with encyclopedia equivalent + string newPaletteName; + if (paletteName.StartsWith("playerscrin", StringComparison.Ordinal)) + newPaletteName = "encyclopediascrin"; + else if (paletteName.StartsWith("playertd", StringComparison.Ordinal)) + newPaletteName = "encyclopediatd"; + else + newPaletteName = "encyclopedia"; + + if (!paletteCache.TryGetValue(newPaletteName, out var newPalette)) + { + newPalette = worldRenderer.Palette(newPaletteName); + paletteCache[newPaletteName] = newPalette; + } + + var ret = (IRenderable)pr.WithPalette(newPalette); + + if (r is IModifyableRenderable mr && ret is IModifyableRenderable retMr) + ret = retMr.WithAlpha(mr.Alpha).WithTint(mr.Tint, mr.TintModifiers); + + return ret; + } + } + + return r; + } + + public override void Draw() + { + Game.Renderer.EnableAntialiasingFilter(); + foreach (var r in renderables) + r.Render(worldRenderer); + Game.Renderer.DisableAntialiasingFilter(); + } + + public override void Tick() + { + if (Animate && preview.Length > 0) + { + foreach (var p in preview) + p.Tick(); + + foreach (var m in previewModifiers) + m.Tick(); + } + } + } +} diff --git a/OpenRA.Mods.CA/Widgets/ColoredRectangleWidget.cs b/OpenRA.Mods.CA/Widgets/ColoredRectangleWidget.cs new file mode 100644 index 0000000000..308651fae8 --- /dev/null +++ b/OpenRA.Mods.CA/Widgets/ColoredRectangleWidget.cs @@ -0,0 +1,39 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Graphics; +using OpenRA.Primitives; +using OpenRA.Widgets; + +namespace OpenRA.Mods.CA.Widgets +{ + public class ColoredRectangleWidget : Widget + { + public Color Color = Color.White; + + public ColoredRectangleWidget() { } + + protected ColoredRectangleWidget(ColoredRectangleWidget other) + : base(other) + { + Color = other.Color; + } + + public override void Draw() + { + var rect = RenderBounds; + var tl = new float3(rect.Left, rect.Top, 0); + var br = new float3(rect.Right, rect.Bottom, 0); + Game.Renderer.RgbaColorRenderer.FillRect(tl, br, Color); + } + + public override Widget Clone() { return new ColoredRectangleWidget(this); } + } +} diff --git a/OpenRA.Mods.CA/Widgets/ContainerWithTooltipWidget.cs b/OpenRA.Mods.CA/Widgets/ContainerWithTooltipWidget.cs new file mode 100644 index 0000000000..2c1516c2c1 --- /dev/null +++ b/OpenRA.Mods.CA/Widgets/ContainerWithTooltipWidget.cs @@ -0,0 +1,77 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using OpenRA.Mods.Common.Widgets; +using OpenRA.Widgets; + +namespace OpenRA.Mods.CA.Widgets +{ + public class ContainerWithTooltipWidget : Widget + { + public readonly string TooltipContainer; + public readonly string TooltipTemplate = "SIMPLE_TOOLTIP_WITH_DESC"; + + protected Lazy tooltipContainer; + + public string TooltipText; + public Func GetTooltipText; + + public string TooltipDesc; + public Func GetTooltipDesc; + + protected readonly Ruleset ModRules; + + [ObjectCreator.UseCtor] + public ContainerWithTooltipWidget(ModData modData) + { + ModRules = modData.DefaultRules; + + GetTooltipText = () => TooltipText; + GetTooltipDesc = () => TooltipDesc; + tooltipContainer = Exts.Lazy(() => + Ui.Root.Get(TooltipContainer)); + } + + protected ContainerWithTooltipWidget(ContainerWithTooltipWidget other) + : base(other) + { + ModRules = other.ModRules; + + TooltipTemplate = other.TooltipTemplate; + TooltipText = other.TooltipText; + GetTooltipText = other.GetTooltipText; + TooltipDesc = other.TooltipDesc; + GetTooltipDesc = other.GetTooltipDesc; + TooltipContainer = other.TooltipContainer; + tooltipContainer = Exts.Lazy(() => + Ui.Root.Get(TooltipContainer)); + } + + public override void MouseEntered() + { + if (TooltipContainer == null) + return; + + if (GetTooltipText != null) + tooltipContainer.Value.SetTooltip(TooltipTemplate, new WidgetArgs { { "containerWidget", this }, { "getText", GetTooltipText }, { "getDesc", GetTooltipDesc } }); + } + + public override void MouseExited() + { + if (TooltipContainer == null || !tooltipContainer.IsValueCreated) + return; + + tooltipContainer.Value.RemoveTooltip(); + } + + public override Widget Clone() { return new ContainerWithTooltipWidget(this); } + } +} diff --git a/OpenRA.Mods.CA/Widgets/CroppableImageWidget.cs b/OpenRA.Mods.CA/Widgets/CroppableImageWidget.cs new file mode 100644 index 0000000000..3eeedd30f0 --- /dev/null +++ b/OpenRA.Mods.CA/Widgets/CroppableImageWidget.cs @@ -0,0 +1,113 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using OpenRA.Mods.Common.Widgets; +using OpenRA.Primitives; +using OpenRA.Widgets; + +namespace OpenRA.Mods.CA.Widgets +{ + public class CroppableImageWidget : ImageWidget + { + public enum CropDirection + { + TopDown, + BottomUp, + LeftRight, + RightLeft + } + + public CropDirection Direction = CropDirection.BottomUp; + public float CropPercentage = 0f; + public Func GetCropPercentage; + + public CroppableImageWidget() + { + GetCropPercentage = () => CropPercentage; + } + + protected CroppableImageWidget(CroppableImageWidget other) + : base(other) + { + Direction = other.Direction; + CropPercentage = other.CropPercentage; + GetCropPercentage = other.GetCropPercentage; + } + + public override Widget Clone() + { + return new CroppableImageWidget(this); + } + + public override void Draw() + { + var sprite = GetSprite(); + if (sprite == null) + return; + + var renderBounds = RenderBounds; + var cropPercentage = Math.Clamp(GetCropPercentage(), 0f, 1f); + + if (cropPercentage <= 0f) + return; + + // Calculate the scissor rectangle based on crop direction and percentage + Rectangle scissorRect; + switch (Direction) + { + case CropDirection.BottomUp: + var visibleHeight = (int)(renderBounds.Height * cropPercentage); + scissorRect = new Rectangle( + renderBounds.Left, + renderBounds.Bottom - visibleHeight, + renderBounds.Width, + visibleHeight); + break; + + case CropDirection.TopDown: + var topVisibleHeight = (int)(renderBounds.Height * cropPercentage); + scissorRect = new Rectangle( + renderBounds.Left, + renderBounds.Top, + renderBounds.Width, + topVisibleHeight); + break; + + case CropDirection.LeftRight: + var leftVisibleWidth = (int)(renderBounds.Width * cropPercentage); + scissorRect = new Rectangle( + renderBounds.Left, + renderBounds.Top, + leftVisibleWidth, + renderBounds.Height); + break; + + case CropDirection.RightLeft: + var rightVisibleWidth = (int)(renderBounds.Width * cropPercentage); + scissorRect = new Rectangle( + renderBounds.Right - rightVisibleWidth, + renderBounds.Top, + rightVisibleWidth, + renderBounds.Height); + break; + + default: + scissorRect = renderBounds; + break; + } + + // Enable scissor test and draw the sprite + Game.Renderer.EnableScissor(scissorRect); + base.Draw(); + Game.Renderer.DisableScissor(); + } + } +} \ No newline at end of file diff --git a/OpenRA.Mods.CA/Widgets/ExternalLinkButtonWidget.cs b/OpenRA.Mods.CA/Widgets/ExternalLinkButtonWidget.cs new file mode 100644 index 0000000000..7b9838c78c --- /dev/null +++ b/OpenRA.Mods.CA/Widgets/ExternalLinkButtonWidget.cs @@ -0,0 +1,82 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Diagnostics; +using System.Runtime.InteropServices; +using OpenRA.Mods.Common.Widgets; +using OpenRA.Primitives; + +namespace OpenRA.Mods.CA.Widgets +{ + public class ExternalLinkButtonWidget : ButtonWidget + { + bool hovering = false; + public Color? TextHoverColor; + public string Url; + + [ObjectCreator.UseCtor] + public ExternalLinkButtonWidget(ModData modData) + : base(modData) + { + GetColor = () => (hovering && TextHoverColor.HasValue ? TextHoverColor.Value : TextColor); + } + + protected ExternalLinkButtonWidget(ExternalLinkButtonWidget other) + : base(other) { } + + public override void MouseEntered() + { + base.MouseEntered(); + hovering = true; + } + + public override void MouseExited() + { + base.MouseExited(); + hovering = false; + } + + public override bool HandleMouseInput(MouseInput mi) + { + if (mi.Event == MouseInputEvent.Up) + OpenUrl(Url); + + return base.HandleMouseInput(mi); + } + + private void OpenUrl(string url) + { + try + { + Process.Start(url); + } + catch + { + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + url = url.Replace("&", "^&"); + Process.Start(new ProcessStartInfo(url) { UseShellExecute = true }); + } + else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) + { + Process.Start("xdg-open", url); + } + else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + { + Process.Start("open", url); + } + else + { + // do nothing + } + } + } + } +} diff --git a/OpenRA.Mods.CA/Widgets/ImageCAWidget.cs b/OpenRA.Mods.CA/Widgets/ImageCAWidget.cs index a67d326eee..59ae8145b4 100644 --- a/OpenRA.Mods.CA/Widgets/ImageCAWidget.cs +++ b/OpenRA.Mods.CA/Widgets/ImageCAWidget.cs @@ -1,16 +1,13 @@ #region Copyright & License Information -/* - * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion -using System; -using OpenRA.Graphics; using OpenRA.Mods.Common.Widgets; namespace OpenRA.Mods.CA.Widgets diff --git a/OpenRA.Mods.CA/Widgets/ImageWithAlphaWidget.cs b/OpenRA.Mods.CA/Widgets/ImageWithAlphaWidget.cs new file mode 100644 index 0000000000..52501c4da1 --- /dev/null +++ b/OpenRA.Mods.CA/Widgets/ImageWithAlphaWidget.cs @@ -0,0 +1,102 @@ +#region Copyright & License Information +/* + * Copyright (c) The OpenRA Developers and Contributors + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. For more + * information, see COPYING. + */ +#endregion + +using System; +using OpenRA.Graphics; +using OpenRA.Primitives; +using OpenRA.Widgets; + +namespace OpenRA.Mods.Common.Widgets +{ + public class ImageWithAlphaWidget : Widget + { + public readonly string TooltipTemplate; + public readonly string TooltipContainer; + + public string ImageCollection = ""; + public string ImageName = ""; + public bool ClickThrough = true; + public Func GetImageName; + public Func GetImageCollection; + public Func GetSprite; + public Func GetAlpha = () => 1f; + + public string TooltipText; + + readonly Lazy tooltipContainer; + public Func GetTooltipText; + + readonly CachedTransform<(string, string), Sprite> getImageCache = new( + ((string Collection, string Image) args) => ChromeProvider.GetImage(args.Collection, args.Image)); + + public ImageWithAlphaWidget() + { + GetImageName = () => ImageName; + GetImageCollection = () => ImageCollection; + GetTooltipText = () => TooltipText; + tooltipContainer = Exts.Lazy(() => + Ui.Root.Get(TooltipContainer)); + + GetSprite = () => getImageCache.Update((GetImageCollection(), GetImageName())); + } + + protected ImageWithAlphaWidget(ImageWithAlphaWidget other) + : base(other) + { + ClickThrough = other.ClickThrough; + ImageName = other.ImageName; + GetImageName = other.GetImageName; + ImageCollection = other.ImageCollection; + GetImageCollection = other.GetImageCollection; + + TooltipTemplate = other.TooltipTemplate; + TooltipContainer = other.TooltipContainer; + GetTooltipText = other.GetTooltipText; + tooltipContainer = Exts.Lazy(() => + Ui.Root.Get(TooltipContainer)); + + GetSprite = () => getImageCache.Update((GetImageCollection(), GetImageName())); + } + + public override Widget Clone() { return new ImageWithAlphaWidget(this); } + + public override void Draw() + { + //WidgetUtils.DrawSprite(GetSprite(), RenderOrigin); + + //var renderable = new UISpriteRenderable(GetSprite(), WPos.Zero, RenderOrigin, 0, null, 1f, GetAlpha(), 0f); + //renderable.Render(worldRenderer); + + Game.Renderer.RgbaSpriteRenderer.DrawSprite(GetSprite(), new float3(RenderOrigin.X, RenderOrigin.Y, 0f), 1f, new float3(GetAlpha(), GetAlpha(), GetAlpha()), GetAlpha(), 0f); + } + + public override bool HandleMouseInput(MouseInput mi) + { + return !ClickThrough && RenderBounds.Contains(mi.Location); + } + + public override void MouseEntered() + { + if (TooltipContainer == null || GetTooltipText == null) + return; + + tooltipContainer.Value.SetTooltip(TooltipTemplate, new WidgetArgs() { { "getText", GetTooltipText } }); + } + + public override void MouseExited() + { + if (TooltipContainer == null) + return; + + tooltipContainer.Value.RemoveTooltip(); + } + } +} diff --git a/OpenRA.Mods.CA/Widgets/LinkableLabelWidget.cs b/OpenRA.Mods.CA/Widgets/LinkableLabelWidget.cs new file mode 100644 index 0000000000..1c99387527 --- /dev/null +++ b/OpenRA.Mods.CA/Widgets/LinkableLabelWidget.cs @@ -0,0 +1,390 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Text.RegularExpressions; +using OpenRA.Graphics; +using OpenRA.Mods.Common.Widgets; +using OpenRA.Primitives; +using OpenRA.Traits; +using OpenRA.Widgets; + +namespace OpenRA.Mods.CA.Widgets +{ + /// + /// A label widget that supports clickable cross-reference links. + /// Supports two syntaxes: + /// - [[Entry Name]] - displays and links to "Entry Name" + /// - [[Display Text|Link Target]] - displays "Display Text", links to "Link Target" + /// Links are rendered in bold with an accent color. + /// Ctrl+Left-Click on a link triggers the OnLinkClicked callback. + /// + public class LinkableLabelWidget : LabelWidget + { + /// Callback invoked when a link is Ctrl+Clicked. Receives the link target text. + public Action OnLinkClicked; + + /// Color for link text. If not set, inherits from TextColor. + public Color? LinkColor = null; + + /// Color for link text when hovering. If not set, inherits from TextColor. + public Color? LinkHoverColor = null; + + /// Font for link text. If not set, inherits from Font. + public string LinkFont = null; + + public string HoverCursor = "press"; + + public string ClickSound = ChromeMetrics.Get("ClickSound"); + + /// Validates that a link target exists. If null, all links are considered valid. + public Func IsValidLink; + + /// + /// Resolves a link target to its display text. + /// Used when only [[target]] syntax is provided (no explicit display text). + /// If null or returns null, the target itself is used as display text. + /// + public Func ResolveDisplayText; + + protected readonly Ruleset ModRules; + + // Regex to match [[link text]] or [[display text|link target]] patterns + // Group 1: Display text (or entry name if no pipe) + // Group 2: Link target (optional, defaults to display text if not provided) + static readonly Regex LinkPattern = new(@"\[\[([^\]|]+)(?:\|([^\]]+))?\]\]", RegexOptions.Compiled); + + // Cached parsed text segments + readonly List segments = new(); + readonly List linkRegions = new(); + string lastParsedText; + int lastParsedWidth; + string hoveredLink; + + // Represents a segment of text (either normal or link) + struct TextSegment + { + public string Text; // The text to display + public string LinkTarget; // The link target (null if not a link, may differ from Text) + public bool IsValid; // only relevant for links + } + + // Represents the clickable region of a link in screen coordinates + struct LinkRegion + { + public Rectangle Bounds; + public string LinkTarget; + } + + [ObjectCreator.UseCtor] + public LinkableLabelWidget(ModData modData) + : base(modData) + { + ModRules = modData.DefaultRules; + } + + protected LinkableLabelWidget(LinkableLabelWidget other) + : base(other) + { + OnLinkClicked = other.OnLinkClicked; + LinkColor = other.LinkColor; + LinkHoverColor = other.LinkHoverColor; + LinkFont = other.LinkFont; + IsValidLink = other.IsValidLink; + ResolveDisplayText = other.ResolveDisplayText; + ModRules = other.ModRules; + } + + void ParseText(string text, int wrapWidth) + { + // Check if we need to reparse + if (text == lastParsedText && wrapWidth == lastParsedWidth) + return; + + lastParsedText = text; + lastParsedWidth = wrapWidth; + segments.Clear(); + + if (string.IsNullOrEmpty(text)) + return; + + var matches = LinkPattern.Matches(text); + var lastIndex = 0; + + foreach (Match match in matches) + { + // Add text before the link + if (match.Index > lastIndex) + { + segments.Add(new TextSegment + { + Text = text[lastIndex..match.Index], + LinkTarget = null + }); + } + + // Add the link + // Group 1 is display text (or target if no pipe), Group 2 is link target (optional) + var hasExplicitDisplayText = match.Groups[2].Success; + var linkTarget = hasExplicitDisplayText ? match.Groups[2].Value : match.Groups[1].Value; + + // Resolve display text: use explicit text if provided, otherwise resolve from target + string displayText; + if (hasExplicitDisplayText) + displayText = match.Groups[1].Value; + else + displayText = ResolveDisplayText?.Invoke(linkTarget) ?? linkTarget; + + var isValid = IsValidLink?.Invoke(linkTarget) ?? true; + segments.Add(new TextSegment + { + Text = displayText, + LinkTarget = linkTarget, + IsValid = isValid + }); + + lastIndex = match.Index + match.Length; + } + + // Add remaining text after the last link + if (lastIndex < text.Length) + { + segments.Add(new TextSegment + { + Text = text[lastIndex..], + LinkTarget = null + }); + } + } + + public override void Draw() + { + if (!Game.Renderer.Fonts.TryGetValue(Font, out var normalFont)) + throw new ArgumentException($"Requested font '{Font}' was not found."); + + // Determine link font: inherit from label if not specified + SpriteFont linkFont; + if (string.IsNullOrEmpty(LinkFont)) + linkFont = normalFont; + else if (!Game.Renderer.Fonts.TryGetValue(LinkFont, out linkFont)) + linkFont = normalFont; + + var text = GetText(); + if (string.IsNullOrEmpty(text)) + return; + + // Parse the text into segments + ParseText(text, Bounds.Width); + + // If no links found, fall back to base rendering + if (segments.Count == 0 || (segments.Count == 1 && segments[0].LinkTarget == null)) + { + base.Draw(); + return; + } + + // Clear link regions for recalculation + linkRegions.Clear(); + + // Calculate base position + var position = RenderOrigin; + var offset = normalFont.TopOffset; + + // Handle word wrapping by building the full display text first + var displayText = BuildDisplayText(); + var wrappedText = WordWrap ? WidgetUtils.WrapText(displayText, Bounds.Width, normalFont) : displayText; + var textSize = normalFont.Measure(wrappedText); + + if (VAlign == TextVAlign.Top) + position += new int2(0, -offset); + else if (VAlign == TextVAlign.Middle) + position += new int2(0, (Bounds.Height - textSize.Y - offset) / 2); + else if (VAlign == TextVAlign.Bottom) + position += new int2(0, Bounds.Height - textSize.Y); + + if (Align == TextAlign.Center) + position += new int2((Bounds.Width - textSize.X) / 2, 0); + else if (Align == TextAlign.Right) + position += new int2(Bounds.Width - textSize.X, 0); + + // Draw segments + DrawSegments(position, normalFont, linkFont, wrappedText); + } + + string BuildDisplayText() + { + var sb = new System.Text.StringBuilder(); + foreach (var segment in segments) + sb.Append(segment.Text); + return sb.ToString(); + } + + void DrawSegments(int2 basePosition, SpriteFont normalFont, SpriteFont linkFont, string wrappedText) + { + var color = GetColor(); + var bgDark = GetContrastColorDark(); + var bgLight = GetContrastColorLight(); + + // Split wrapped text into lines for multi-line handling + var lines = wrappedText.Split('\n'); + var lineY = basePosition.Y; + var segmentIndex = 0; + var charIndexInSegment = 0; + + foreach (var line in lines) + { + var lineX = basePosition.X; + + // Adjust line X for alignment + if (Align == TextAlign.Center) + { + var lineWidth = normalFont.Measure(line).X; + var fullWidth = normalFont.Measure(wrappedText.Split('\n')[0]).X; + lineX = basePosition.X + (fullWidth - lineWidth) / 2; + } + else if (Align == TextAlign.Right) + { + var lineWidth = normalFont.Measure(line).X; + var fullWidth = normalFont.Measure(wrappedText.Split('\n')[0]).X; + lineX = basePosition.X + fullWidth - lineWidth; + } + + var charIndex = 0; + while (charIndex < line.Length && segmentIndex < segments.Count) + { + var segment = segments[segmentIndex]; + var remainingInSegment = segment.Text.Length - charIndexInSegment; + var remainingInLine = line.Length - charIndex; + var charsToTake = Math.Min(remainingInSegment, remainingInLine); + + if (charsToTake <= 0) + { + segmentIndex++; + charIndexInSegment = 0; + continue; + } + + var segmentText = segment.Text.Substring(charIndexInSegment, charsToTake); + + // Determine if this is a valid link + var isLink = segment.LinkTarget != null && segment.IsValid; + var font = isLink ? linkFont : normalFont; + + // Determine link color: inherit from label if not specified + Color linkTextColor; + if (segment.LinkTarget == hoveredLink) + linkTextColor = LinkHoverColor ?? color; + else + linkTextColor = LinkColor ?? color; + + var textColor = isLink ? linkTextColor : color; + + // Calculate baseline adjustment for different fonts + // Align by bottom of text (baseline) rather than top + var baselineOffset = isLink ? (normalFont.Measure("A").Y - linkFont.Measure("A").Y) : 0; + + // Draw the text segment + var pos = new int2(lineX, lineY + baselineOffset); + if (Contrast) + font.DrawTextWithContrast(segmentText, pos, textColor, bgDark, bgLight, ContrastRadius); + else if (Shadow) + font.DrawTextWithShadow(segmentText, pos, textColor, bgDark, bgLight, 1); + else + font.DrawText(segmentText, pos, textColor); + + // Measure the actual rendered text width + var segmentWidth = font.Measure(segmentText).X; + + // Track link region for click detection + if (isLink) + { + var segmentHeight = font.Measure(segmentText).Y; + // Expand clickable area vertically for easier clicking + const int verticalPadding = 3; + linkRegions.Add(new LinkRegion + { + Bounds = new Rectangle(lineX, lineY - verticalPadding, segmentWidth, segmentHeight + verticalPadding * 2), + LinkTarget = segment.LinkTarget + }); + } + + // Advance position using the actual font used for drawing + lineX += segmentWidth; + charIndex += charsToTake; + charIndexInSegment += charsToTake; + + // Move to next segment if we've consumed this one + if (charIndexInSegment >= segment.Text.Length) + { + segmentIndex++; + charIndexInSegment = 0; + } + } + + lineY += normalFont.Measure("A").Y; + + // Skip the newline character in segment tracking + if (segmentIndex < segments.Count) + { + charIndexInSegment++; + if (charIndexInSegment >= segments[segmentIndex].Text.Length) + { + segmentIndex++; + charIndexInSegment = 0; + } + } + } + } + + string GetLinkAtPosition(int2 pos) + { + foreach (var region in linkRegions) + { + if (region.Bounds.Contains(pos)) + return region.LinkTarget; + } + + return null; + } + + public override void MouseExited() + { + base.MouseExited(); + hoveredLink = null; + } + + public override bool HandleMouseInput(MouseInput mi) + { + // Update hovered link state + var linkAtPos = GetLinkAtPosition(mi.Location); + hoveredLink = linkAtPos; + + // Handle Left-Click on links + if (mi.Event == MouseInputEvent.Down && + mi.Button == MouseButton.Left && + linkAtPos != null) + { + Game.Sound.PlayNotification(ModRules, null, "Sounds", ClickSound, null); + OnLinkClicked?.Invoke(linkAtPos); + return true; + } + + return base.HandleMouseInput(mi); + } + + public override string GetCursor(int2 pos) + { + return hoveredLink != null ? HoverCursor : base.GetCursor(pos); + } + + public override Widget Clone() => new LinkableLabelWidget(this); + } +} diff --git a/OpenRA.Mods.CA/Widgets/Logic/AddFactionSuffixLogicCA.cs b/OpenRA.Mods.CA/Widgets/Logic/AddFactionSuffixLogicCA.cs new file mode 100644 index 0000000000..e7ec0aa307 --- /dev/null +++ b/OpenRA.Mods.CA/Widgets/Logic/AddFactionSuffixLogicCA.cs @@ -0,0 +1,56 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using OpenRA.Mods.Common.Widgets; +using OpenRA.Widgets; + +namespace OpenRA.Mods.CA.Widgets.Logic +{ + public class AddFactionSuffixLogicCA : ChromeLogic + { + [ObjectCreator.UseCtor] + public AddFactionSuffixLogicCA(Widget widget, World world) + { + if (world.LocalPlayer == null || world.LocalPlayer.Spectating) + return; + + if (!ChromeMetrics.TryGet("FactionSuffix-" + world.LocalPlayer.Faction.InternalName, out string faction)) + faction = world.LocalPlayer.Faction.InternalName; + var suffix = "-" + faction; + + if (widget is ButtonWidget bw) + bw.Background += suffix; + else if (widget is ImageWidget iw) + iw.ImageCollection += suffix; + else if (widget is BackgroundWidget bgw) + bgw.Background += suffix; + else if (widget is TextFieldWidget tfw) + tfw.Background += suffix; + else if (widget is ScrollPanelWidget spw) + { + spw.Button += suffix; + spw.Background += suffix; + spw.ScrollBarBackground += suffix; + spw.Decorations += suffix; + } + else if (widget is ProductionTabsCAWidget ptw) + { + ptw.TabButton += suffix; + ptw.LeftButton += suffix; + ptw.RightButton += suffix; + ptw.Background += suffix; + } + else + throw new InvalidOperationException( + "AddFactionSuffixLogic only supports ButtonWidget, ImageWidget, BackgroundWidget, TextFieldWidget, ScrollPanelWidget and ProductionTabsWidget"); + } + } +} diff --git a/OpenRA.Mods.CA/Widgets/Logic/EncyclopediaLogicCA.cs b/OpenRA.Mods.CA/Widgets/Logic/EncyclopediaLogicCA.cs new file mode 100644 index 0000000000..e19b9857c9 --- /dev/null +++ b/OpenRA.Mods.CA/Widgets/Logic/EncyclopediaLogicCA.cs @@ -0,0 +1,1771 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using OpenRA.FileFormats; +using OpenRA.Graphics; +using OpenRA.Mods.CA.Traits; +using OpenRA.Mods.Common; +using OpenRA.Mods.Common.Traits; +using OpenRA.Mods.Common.Traits.Render; +using OpenRA.Mods.Common.Widgets; +using OpenRA.Primitives; +using OpenRA.Traits; +using OpenRA.Widgets; + +namespace OpenRA.Mods.CA.Widgets.Logic +{ + public class EncyclopediaLogicCA : ChromeLogic + { + [FluentReference("prerequisites")] + const string Requires = "label-requires"; + + readonly World world; + readonly ModData modData; + readonly Dictionary info = new(); + + readonly ScrollPanelWidget descriptionPanel; + readonly LabelWidget titleLabel; + readonly LabelWidget descriptionLabel; + readonly LinkableLabelWidget prerequisitesLabel; + readonly SpriteFont descriptionFont; + readonly Widget actorDetailsContainer; + + readonly ScrollPanelWidget actorList; + readonly ScrollItemWidget headerTemplate; + readonly ScrollItemWidget template; + readonly BackgroundWidget previewBackground; + readonly ActorPreviewCAWidget previewWidget; + + readonly Widget tabContainer; + readonly ButtonWidget tabTemplate; + readonly List categoryTabs = new(); + + readonly SpriteWidget portraitWidget; + readonly Sprite portraitSprite; + readonly Png defaultPortrait; + + readonly Widget productionContainer; + readonly LabelWidget productionCost; + readonly LabelWidget productionTime; + readonly Widget productionPowerIcon; + readonly LabelWidget productionPower; + readonly Widget armorTypeIcon; + readonly LabelWidget armorTypeLabel; + readonly List sheets = new(); + + // Tooltip extras widgets + readonly LabelWidget strengthsLabel; + readonly LabelWidget weaknessesLabel; + readonly LinkableLabelWidget attributesLabel; + readonly LinkableLabelWidget encyclopediaDescriptionLabel; + + // Entry lookup for cross-reference navigation (by actor name, case-insensitive) + readonly Dictionary entryLookupByActorName = new(StringComparer.OrdinalIgnoreCase); + + // Prerequisite provider lookup - maps faction -> prerequisite name -> actor name + readonly Dictionary> prerequisiteProvidersByFaction = new(StringComparer.OrdinalIgnoreCase); + + // Subfaction widgets + readonly LabelWidget subfactionLabel; + readonly ImageWidget subfactionFlagImage; + + // Additional info widget + readonly LinkableLabelWidget additionalInfoLabel; + + // Build icon widget + readonly SpriteWidget buildIconWidget; + + // Variant dropdown widget + readonly DropDownButtonWidget variantDropdown; + + // Variant lookup - maps parent actor name to list of variant actors (case-insensitive) + readonly Dictionary> variantsByParent = new(StringComparer.OrdinalIgnoreCase); + + // Variant group order - tracks order groups were first encountered during file scan + readonly Dictionary variantGroupOrder = new(); + + // Currently selected variant (if any) + ActorInfo selectedVariant; + + // Folder structure tracking + readonly Dictionary folderNodes = new(); + readonly Dictionary folderExpanded = new(); + + // Remember last selected actor for each top-level category + readonly Dictionary lastSelectedActorByCategory = new(); + + WAngle currentFacing = new WAngle(384); + + ActorInfo selectedActor; + ActorInfo renderActor; + EncyclopediaExtrasInfo encyclopediaExtrasInfo; + + string currentCategoryPath; + string selectedTopLevelCategory; + ScrollItemWidget firstItem; + + Dictionary factions = new(); + + // Helper class to represent folder hierarchy + class FolderNode + { + public string Name; + public string FullPath; + public List Children = new(); + public List Actors = new(); + public FolderNode Parent; + public int Depth; + } + + [ObjectCreator.UseCtor] + public EncyclopediaLogicCA(Widget widget, World world, ModData modData, Action onExit) + { + this.world = world; + this.modData = modData; + + actorList = widget.Get("ACTOR_LIST"); + + headerTemplate = widget.Get("HEADER"); + template = widget.Get("TEMPLATE"); + + tabContainer = widget.Get("ENCYCLOPEDIA_TABS"); + tabTemplate = widget.Get("ENCYCLOPEDIA_TAB"); + + widget.Get("ACTOR_INFO").IsVisible = () => selectedActor != null; + + previewBackground = widget.GetOrNull("ACTOR_BG"); + previewWidget = widget.Get("ACTOR_PREVIEW"); + previewBackground.IsVisible = () => selectedActor != null && + selectedActor.TraitInfos().Count > 0; + + descriptionPanel = widget.Get("ACTOR_DESCRIPTION_PANEL"); + titleLabel = descriptionPanel.GetOrNull("ACTOR_TITLE"); + actorDetailsContainer = descriptionPanel.Get("ACTOR_DETAILS"); + descriptionLabel = actorDetailsContainer.Get("ACTOR_DESCRIPTION"); + prerequisitesLabel = actorDetailsContainer.Get("ACTOR_PREREQUISITES"); + descriptionFont = Game.Renderer.Fonts[descriptionLabel.Font]; + + // Wire up link click handler for prerequisites cross-references + prerequisitesLabel.OnLinkClicked = NavigateToEntry; + prerequisitesLabel.IsValidLink = IsValidEntryLink; + prerequisitesLabel.ResolveDisplayText = ResolveActorDisplayName; + + portraitWidget = widget.GetOrNull("ACTOR_PORTRAIT"); + if (portraitWidget != null) + { + defaultPortrait = new Png(modData.DefaultFileSystem.Open("encyclopedia/default.png")); + var spriteBounds = new Rectangle(0, 0, defaultPortrait.Width, defaultPortrait.Height); + var sheet = new Sheet(SheetType.BGRA, spriteBounds.Size.NextPowerOf2()); + sheets.Add(sheet); + sheet.CreateBuffer(); + sheet.GetTexture().ScaleFilter = TextureScaleFilter.Linear; + portraitSprite = new Sprite(sheet, spriteBounds, TextureChannel.RGBA); + portraitWidget.GetSprite = () => portraitSprite; + } + + actorList.RemoveChildren(); + + productionContainer = descriptionPanel.GetOrNull("ACTOR_PRODUCTION"); + productionCost = productionContainer?.Get("COST"); + productionTime = productionContainer?.Get("TIME"); + productionPowerIcon = productionContainer?.Get("POWER_ICON"); + productionPower = productionContainer?.Get("POWER"); + armorTypeIcon = productionContainer?.Get("ARMOR_TYPE_ICON"); + armorTypeLabel = productionContainer?.Get("ARMOR_TYPE"); + + strengthsLabel = actorDetailsContainer.Get("STRENGTHS"); + weaknessesLabel = actorDetailsContainer.Get("WEAKNESSES"); + attributesLabel = actorDetailsContainer.Get("ATTRIBUTES"); + + // Wire up link click handler for Attributes cross-references + attributesLabel.OnLinkClicked = NavigateToEntry; + attributesLabel.IsValidLink = IsValidEntryLink; + attributesLabel.ResolveDisplayText = ResolveActorDisplayName; + + encyclopediaDescriptionLabel = actorDetailsContainer.Get("ENCYCLOPEDIA_DESCRIPTION"); + + // Wire up link click handler for cross-references + encyclopediaDescriptionLabel.OnLinkClicked = NavigateToEntry; + encyclopediaDescriptionLabel.IsValidLink = IsValidEntryLink; + encyclopediaDescriptionLabel.ResolveDisplayText = ResolveActorDisplayName; + + subfactionLabel = actorDetailsContainer.GetOrNull("SUBFACTION"); + subfactionFlagImage = actorDetailsContainer.GetOrNull("SUBFACTION_FLAG"); + + additionalInfoLabel = actorDetailsContainer.GetOrNull("ADDITIONAL_INFO"); + + // Wire up link click handler for AdditionalInfo cross-references + if (additionalInfoLabel != null) + { + additionalInfoLabel.OnLinkClicked = NavigateToEntry; + additionalInfoLabel.IsValidLink = IsValidEntryLink; + additionalInfoLabel.ResolveDisplayText = ResolveActorDisplayName; + } + + buildIconWidget = widget.GetOrNull("BUILD_ICON"); + + variantDropdown = widget.GetOrNull("VARIANT_DROPDOWN"); + + foreach (var actor in modData.DefaultRules.Actors.Values) + { + var statistics = actor.TraitInfoOrDefault(); + if (statistics != null && !string.IsNullOrEmpty(statistics.OverrideActor)) + continue; + + var encyclopedia = actor.TraitInfoOrDefault(); + if (encyclopedia == null) + continue; + + info.Add(actor, encyclopedia); + } + + foreach (var faction in world.Map.Rules.Actors[SystemActors.World].TraitInfos().Where(f => f.Selectable)) + factions.Add(faction.InternalName, faction); + + // Build variant lookup - find all actors that are variants of other actors + BuildVariantLookup(); + + // Build folder hierarchy + BuildFolderHierarchy(); + + // Build lookup dictionary for entry navigation + BuildEntryLookup(); + + // Create tabs for top-level categories + CreateCategoryTabs(); + + // Create the UI from the hierarchy + CreateFolderStructure(); + + widget.Get("BACK_BUTTON").OnClick = () => + { + if (world.Type == WorldType.Shellmap) + Game.Disconnect(); + + Ui.CloseWindow(); + onExit(); + }; + } + + void SelectFirstItem() + { + // Find the first available actor in the first top-level category + var firstCategory = folderNodes.Values + .Where(n => n.Parent == null && !string.IsNullOrEmpty(n.Name)) + .OrderBy(n => GetTopLevelCategorySortOrder(n.Name)) + .FirstOrDefault(); + + if (firstCategory != null) + { + // Look for actors directly in the top-level category first + if (firstCategory.Actors.Count > 0) + { + SelectActor(firstCategory.Actors[0], firstCategory.FullPath); + return; + } + + // Then look in child categories (ordered by sort order) + foreach (var childCategory in firstCategory.Children.OrderBy(n => GetSecondLevelCategorySortOrder(n.Name))) + { + if (childCategory.Actors.Count > 0) + { + SelectActor(childCategory.Actors[0], childCategory.FullPath); + return; + } + + // Check deeper levels recursively + var firstActorInSubcategory = GetFirstActorFromAnyNode(childCategory); + if (firstActorInSubcategory.actor != null) + { + SelectActor(firstActorInSubcategory.actor, firstActorInSubcategory.categoryPath); + return; + } + } + } + } + + (ActorInfo actor, string categoryPath) GetFirstActorFromAnyNode(FolderNode node) + { + if (node.Actors.Count > 0) + return (node.Actors[0], node.FullPath); + + foreach (var child in node.Children) + { + var (actor, categoryPath) = GetFirstActorFromAnyNode(child); + if (actor != null) + return (actor, categoryPath); + } + + return (null, null); + } + + void BuildVariantLookup() + { + foreach (var actorInfo in info) + { + var actor = actorInfo.Key; + var extras = actor.TraitInfoOrDefault(); + + if (extras?.VariantOf != null) + { + if (!variantsByParent.ContainsKey(extras.VariantOf)) + variantsByParent[extras.VariantOf] = new List(); + + variantsByParent[extras.VariantOf].Add(actor); + + // Track group order based on first encounter during file scan (only for non-null groups) + if (extras.VariantGroup != null && !variantGroupOrder.ContainsKey(extras.VariantGroup)) + variantGroupOrder[extras.VariantGroup] = variantGroupOrder.Count; + } + } + } + + void BuildEntryLookup() + { + foreach (var actor in modData.DefaultRules.Actors.Values) + { + var encyclopedia = actor.TraitInfoOrDefault(); + if (encyclopedia == null) + continue; + + // Add to actor name lookup (actor names are unique) + entryLookupByActorName[actor.Name] = actor; + + // Build prerequisite provider lookup for each faction this actor belongs to + if (!string.IsNullOrEmpty(encyclopedia.Category)) + { + var factions = GetFactionsFromCategory(encyclopedia.Category); + var providesPrereqs = actor.TraitInfos(); + + foreach (var faction in factions) + { + if (!prerequisiteProvidersByFaction.ContainsKey(faction)) + prerequisiteProvidersByFaction[faction] = new Dictionary(StringComparer.OrdinalIgnoreCase); + + foreach (var provides in providesPrereqs) + { + if (!string.IsNullOrEmpty(provides.Prerequisite) && + !prerequisiteProvidersByFaction[faction].ContainsKey(provides.Prerequisite)) + { + prerequisiteProvidersByFaction[faction][provides.Prerequisite] = actor.Name; + } + } + } + } + } + } + + static IEnumerable GetFactionsFromCategory(string category) + { + if (string.IsNullOrEmpty(category)) + yield break; + + foreach (var cat in category.Split(';')) + yield return cat.Trim().Split('/')[0]; + } + + bool IsValidEntryLink(string actorName) + { + return entryLookupByActorName.ContainsKey(actorName); + } + + /// + /// Resolves an actor name to its display name (from TooltipInfo). + /// Returns null if the actor doesn't exist or has no tooltip. + /// + string ResolveActorDisplayName(string actorName) + { + if (!entryLookupByActorName.TryGetValue(actorName, out var actor)) + return null; + + var tooltip = actor.TraitInfos().FirstOrDefault(); + if (tooltip == null || string.IsNullOrEmpty(tooltip.Name)) + return null; + + return FluentProvider.GetMessage(tooltip.Name); + } + + void NavigateToEntry(string actorName) + { + if (!entryLookupByActorName.TryGetValue(actorName, out var actor)) + return; + + var encyclopedia = actor.TraitInfoOrDefault(); + if (encyclopedia == null) + return; + + // Switch to correct category tab and select actor + var categoryPath = encyclopedia.Category; + if (!string.IsNullOrEmpty(categoryPath)) + { + var topCategory = categoryPath.Split('/')[0]; + + // Find and activate the correct tab + foreach (var tab in categoryTabs) + { + if (tab.Text == topCategory) + { + tab.OnClick(); + break; + } + } + } + + SelectActor(actor, categoryPath); + } + + void BuildFolderHierarchy() + { + // Group actors by their category paths (actors can have multiple categories) + var actorsByCategory = new Dictionary>(); + + foreach (var actorInfo in info) + { + var actor = actorInfo.Key; + var encyclopedia = actorInfo.Value; + var categories = encyclopedia.Category ?? ""; + + // Skip variants - they are accessed via dropdown only + var extras = actor.TraitInfoOrDefault(); + if (extras?.VariantOf != null) + continue; + + // Split by semicolon to allow multiple categories per actor + var categoryPaths = ParseCategoryPaths(categories); + + // Skip actors without categories - they should not be shown + if (categoryPaths.Length == 0) + continue; + + // Add actor to each category + foreach (var category in categoryPaths) + { + if (!actorsByCategory.ContainsKey(category)) + actorsByCategory[category] = new List(); + + actorsByCategory[category].Add(actor); + } + } + + // Sort actors within each category by their Order + foreach (var category in actorsByCategory.Keys.ToList()) + { + actorsByCategory[category] = actorsByCategory[category] + .OrderBy(a => a.TraitInfoOrDefault()?.BuildPaletteOrder ?? 9999) + .ToList(); + } + + // Create folder nodes for each unique path + foreach (var category in actorsByCategory.Keys) + { + var pathParts = category.Split('/'); + var currentPath = ""; + FolderNode parentNode = null; + + for (int i = 0; i < pathParts.Length; i++) + { + var part = pathParts[i]; + if (i > 0) + currentPath += "/"; + currentPath += part; + + var node = GetOrCreateFolderNode(part, currentPath, parentNode, i); + parentNode = node; + } + + // Add actors to the final folder + if (parentNode != null) + { + parentNode.Actors.AddRange(actorsByCategory[category]); + } + } + + // Log final folder structure + var rootCategories = folderNodes.Values.Where(n => n.Parent == null && !string.IsNullOrEmpty(n.Name)).ToList(); + } + + FolderNode GetOrCreateFolderNode(string name, string fullPath, FolderNode parent, int depth) + { + if (folderNodes.TryGetValue(fullPath, out var existingNode)) + return existingNode; + + var node = new FolderNode + { + Name = name, + FullPath = fullPath, + Parent = parent, + Depth = depth + }; + + folderNodes[fullPath] = node; + + // Initialize folder as collapsed by default + folderExpanded[fullPath] = false; + + if (parent != null) + parent.Children.Add(node); + + return node; + } + + void CreateFolderStructure() + { + // Find the selected top-level category node + var selectedRootNode = folderNodes.Values.FirstOrDefault(n => n.FullPath == selectedTopLevelCategory); + + // If no selected category, try to select the first available one + if (selectedRootNode == null) + { + var firstCategory = folderNodes.Values + .Where(n => n.Parent == null && !string.IsNullOrEmpty(n.Name)) + .OrderBy(n => GetTopLevelCategorySortOrder(n.Name)) + .FirstOrDefault(); + if (firstCategory != null) + { + selectedTopLevelCategory = firstCategory.FullPath; + selectedRootNode = firstCategory; + } + } + + if (selectedRootNode != null) + { + // Show only the children of the selected category, not the category itself + foreach (var childNode in selectedRootNode.Children.OrderBy(n => GetSecondLevelCategorySortOrder(n.Name))) + { + CreateFolderItems(childNode); + } + + // Also show actors directly under the selected category + foreach (var actor in selectedRootNode.Actors) + { + var item = CreateActorListItem(actor, selectedRootNode.FullPath, 0); + + if (firstItem == null) + firstItem = item; + + actorList.AddChild(item); + } + } + } + + void CreateFolderItems(FolderNode node) + { + // Create folder header - adjust depth since we're not showing top-level categories + var displayDepth = node.Depth - 1; + + var folderHeader = ScrollItemWidget.Setup(headerTemplate, () => false, () => ToggleFolder(node.FullPath)); + folderHeader.IsHighlighted = () => folderHeader.EventBounds.Contains(Viewport.LastMousePos) && Ui.MouseOverWidget == folderHeader; + var label = folderHeader.Get("LABEL"); + var arrowImage = folderHeader.GetOrNull("ICON"); + + // Set folder name + label.GetText = () => $"{node.Name}"; + label.Bounds.X = 24 + displayDepth * 15; + + // Update arrow direction based on expanded state + if (arrowImage != null) + { + arrowImage.GetImageName = () => folderExpanded.GetValueOrDefault(node.FullPath, false) ? "down" : "right"; + arrowImage.Bounds.X = 4 + displayDepth * 15; + } + + actorList.AddChild(folderHeader); + + // Show child folders and actors if expanded + if (folderExpanded.GetValueOrDefault(node.FullPath, false)) + { + // Add child folders first + foreach (var childNode in node.Children.OrderBy(n => GetSecondLevelCategorySortOrder(n.Name))) + { + CreateFolderItems(childNode); + } + + // Then add actors + foreach (var actor in node.Actors) + { + var item = CreateActorListItem(actor, node.FullPath, displayDepth); + + if (firstItem == null) + firstItem = item; + + actorList.AddChild(item); + } + } + } + + void CollapseNonAncestorCategories(string targetPath) + { + // Get the top-level category of the target path + var targetTopLevelCategory = targetPath.Split('/')[0]; + + // Get all ancestor paths of the target + var ancestorPaths = new HashSet(); + var currentPath = targetPath; + + while (!string.IsNullOrEmpty(currentPath)) + { + ancestorPaths.Add(currentPath); + + // Find parent path by removing the last segment + var lastSeparator = currentPath.LastIndexOf('/'); + if (lastSeparator > 0) + currentPath = currentPath[..lastSeparator]; + else + break; + } + + // Collapse all expanded folders in the same top-level category that are not ancestors of the target + var foldersToCollapse = new List(); + foreach (var kvp in folderExpanded) + { + if (kvp.Value && !ancestorPaths.Contains(kvp.Key)) + { + // Only collapse if it's in the same top-level category + var folderTopLevelCategory = kvp.Key.Split('/')[0]; + if (folderTopLevelCategory == targetTopLevelCategory) + { + foldersToCollapse.Add(kvp.Key); + } + } + } + + foreach (var folder in foldersToCollapse) + { + folderExpanded[folder] = false; + } + } + + void ToggleFolder(string folderPath) + { + var isCurrentlyExpanded = folderExpanded.GetValueOrDefault(folderPath, false); + + if (!isCurrentlyExpanded) + { + // Expanding: collapse all other categories in the same top-level category that are not ancestors of this one + CollapseNonAncestorCategories(folderPath); + } + + // Toggle the folder state + folderExpanded[folderPath] = !isCurrentlyExpanded; + + // Rebuild the entire list + actorList.RemoveChildren(); + firstItem = null; + CreateFolderStructure(); + + // When expanding, auto-select the first actor in the expanded folder + if (!isCurrentlyExpanded && folderNodes.TryGetValue(folderPath, out var node)) + { + var firstActorResult = GetFirstActorFromAnyNode(node); + if (firstActorResult.actor != null) + SelectActor(firstActorResult.actor, firstActorResult.categoryPath); + } + } + + void SelectActor(ActorInfo actor, string categoryPath = null) + { + LoadExtras(actor); + var selectedInfo = info[actor]; + selectedActor = actor; + selectedVariant = null; + currentCategoryPath = categoryPath; + + // Remember this actor for the current top-level category + if (!string.IsNullOrEmpty(selectedTopLevelCategory)) + { + lastSelectedActorByCategory[selectedTopLevelCategory] = actor; + } + + // Setup variant dropdown + SetupVariantDropdown(actor); + + // Update the encyclopedia color palette with the faction color + var previewColor = GetPreviewColorFromCategory(categoryPath); + EncyclopediaColorPalette.SetPreviewColor(previewColor); + + var previewOwner = GetPreviewOwner(selectedInfo); + var typeDictionary = CreatePreviewTypeDictionary(previewOwner); + + if (previewBackground.IsVisible()) + { + previewWidget.SetPreview(renderActor, typeDictionary, previewColor); + previewWidget.GetScale = () => selectedInfo.Scale; + buildIconWidget.Bounds.Y = previewWidget.Bounds.Bottom + 10; + } + else + { + buildIconWidget.Bounds.Y = 0; + } + + if (portraitWidget != null) + { + // PERF: Load individual portrait images directly, bypassing ChromeProvider, + // to avoid stalls when loading a single large sheet. + // Portrait images are required to all be the same size as the "default.png" image. + var portrait = defaultPortrait; + if (modData.DefaultFileSystem.TryOpen($"encyclopedia/{actor.Name}.png", out var s)) + { + var p = new Png(s); + if (p.Width == defaultPortrait.Width && p.Height == defaultPortrait.Height) + portrait = p; + else + { + Log.Write("debug", $"Failed to parse load portrait image for {actor.Name}."); + Log.Write("debug", $"Expected size {defaultPortrait.Width}, {defaultPortrait.Height}, but found {p.Width}, {p.Height}."); + } + } + + OpenRA.Graphics.Util.FastCopyIntoSprite(portraitSprite, portrait); + portraitSprite.Sheet.CommitBufferedData(); + } + + if (titleLabel != null) + titleLabel.Text = ActorName(modData.DefaultRules, actor.Name); + + var bi = actor.TraitInfoOrDefault(); + + if (buildIconWidget != null) + { + if (bi != null && !string.IsNullOrEmpty(bi.Icon)) + { + try + { + var renderSprites = actor.TraitInfos().FirstOrDefault(); + if (renderSprites != null) + { + var iconSequence = world.Map.Sequences.GetSequence(renderSprites.Image ?? actor.Name, bi.Icon); + var iconSprite = iconSequence.GetSprite(0); + buildIconWidget.GetSprite = () => iconSprite; + buildIconWidget.GetPalette = () => bi.IconPalette ?? "chrome"; + buildIconWidget.Visible = true; + } + else + { + buildIconWidget.Visible = false; + } + } + catch + { + buildIconWidget.Visible = false; + } + } + else + { + buildIconWidget.Visible = false; + } + } + + var currentY = SetupProductionContainer(actor); + + FactionInfo subfaction = null; + var subfactionText = ""; + var subfactionHeight = 0; + if (encyclopediaExtrasInfo != null && !string.IsNullOrEmpty(encyclopediaExtrasInfo.Subfaction) && subfactionLabel != null) + { + subfaction = factions[encyclopediaExtrasInfo.Subfaction]; + subfactionText = $"{FluentProvider.GetMessage(subfaction.Name)} only."; + + // var subfactionText = FluentProvider.GetMessage(SubfactionOnly, "factionName", FluentProvider.GetMessage(subfaction.Name)); + subfactionHeight = descriptionFont.Measure(subfactionText).Y; + } + + if (subfactionLabel != null) + { + subfactionLabel.GetText = () => subfactionText; + subfactionLabel.Bounds.Height = subfactionHeight; + subfactionLabel.Visible = !string.IsNullOrEmpty(subfactionText); + } + + if (subfactionFlagImage != null) + { + if (!string.IsNullOrEmpty(subfactionText)) + { + var flagName = subfaction.InternalName; + if (!string.IsNullOrEmpty(flagName)) + { + subfactionFlagImage.GetImageName = () => flagName; + subfactionFlagImage.Visible = true; + } + else + { + subfactionFlagImage.Visible = false; + } + } + else + { + subfactionFlagImage.Visible = false; + } + } + + if (!string.IsNullOrEmpty(subfactionText)) + { + if (subfactionLabel != null) + { + subfactionLabel.Bounds.Y = currentY; + currentY += subfactionHeight + 8; + } + + if (subfactionFlagImage != null && subfactionLabel != null) + { + subfactionFlagImage.Bounds.Y = currentY - subfactionHeight - 9; + var textWidth = descriptionFont.Measure(subfactionText).X; + } + } + + var additionalInfoText = ""; + var additionalInfoHeight = 0; + if (encyclopediaExtrasInfo != null && !string.IsNullOrEmpty(encyclopediaExtrasInfo.AdditionalInfo) && additionalInfoLabel != null) + { + additionalInfoText = WidgetUtilsCA.WrapTextWithIndent( + encyclopediaExtrasInfo.AdditionalInfo.Replace("\\n", "\n"), + additionalInfoLabel.Bounds.Width, + descriptionFont); + additionalInfoHeight = descriptionFont.Measure(additionalInfoText).Y; + } + + if (additionalInfoLabel != null) + { + additionalInfoLabel.GetText = () => additionalInfoText; + additionalInfoLabel.Bounds.Height = additionalInfoHeight; + additionalInfoLabel.Visible = !string.IsNullOrEmpty(additionalInfoText); + } + + if (!string.IsNullOrEmpty(additionalInfoText) && additionalInfoLabel != null) + { + additionalInfoLabel.Bounds.Y = currentY; + currentY += additionalInfoHeight + 8; + } + + currentY = SetupDescriptionSection(actor, currentY, showEncyclopediaDescription: true); + + actorDetailsContainer.Bounds.Height = currentY; + + descriptionPanel.Layout.AdjustChildren(); + + descriptionPanel.ScrollToTop(); + } + + void SetupVariantDropdown(ActorInfo actor) + { + if (variantDropdown == null) + return; + + // Check if this actor has variants + if (!variantsByParent.TryGetValue(actor.Name, out var variants) || variants.Count == 0) + { + variantDropdown.IsDisabled = () => true; + variantDropdown.GetText = () => ""; + return; + } + + variantDropdown.IsDisabled = () => false; + variantDropdown.GetText = () => selectedVariant != null + ? GetActorDisplayName(selectedVariant) + : "Select variant..."; + + variantDropdown.OnMouseDown = _ => + { + // Include the base actor along with variants + var allVariants = new List { actor }; + allVariants.AddRange(variants); + + // Separate variants into grouped and ungrouped + var variantsWithGroups = allVariants + .Select(v => new + { + Actor = v, + Group = v.TraitInfoOrDefault()?.VariantGroup + }) + .ToList(); + + var hasAnyGroups = variantsWithGroups.Any(v => v.Group != null); + + ScrollItemWidget SetupItem(ActorInfo variantActor, ScrollItemWidget template) + { + bool IsSelected() => selectedVariant == variantActor; + void OnClick() => SelectVariant(variantActor); + + var scrollItem = ScrollItemWidget.Setup(template, IsSelected, OnClick); + var label = scrollItem.Get("LABEL"); + label.GetText = () => GetActorDisplayName(variantActor); + return scrollItem; + } + + if (!hasAnyGroups) + { + // No groups - use simple flat dropdown without headers (preserve YAML order) + var itemHeight = 25; + var totalHeight = Math.Min(allVariants.Count * itemHeight, 300) + 5; + + variantDropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", totalHeight, allVariants, SetupItem); + } + else + { + // Has groups - use grouped dropdown with headers + var groupedVariants = variantsWithGroups + .Where(v => v.Group != null) + .GroupBy(v => v.Group) + .OrderBy(g => GetVariantGroupSortOrder(g.Key)) + .ToDictionary( + g => g.Key, + g => g.Select(v => v.Actor).AsEnumerable() + ); + + // Add ungrouped variants first (with empty key, handled specially) + var ungrouped = variantsWithGroups.Where(v => v.Group == null).Select(v => v.Actor).ToList(); + if (ungrouped.Any()) + { + var orderedGrouped = new Dictionary> + { + { "", ungrouped } + }; + foreach (var kvp in groupedVariants) + orderedGrouped[kvp.Key] = kvp.Value; + groupedVariants = orderedGrouped; + } + + // Calculate dropdown height + var itemHeight = 25; + var headerHeight = 13; + var totalHeight = groupedVariants.Sum(g => (string.IsNullOrEmpty(g.Key) ? 0 : headerHeight) + g.Value.Count() * itemHeight) + 5; + totalHeight = Math.Min(totalHeight, 300); // Cap at 300px + + variantDropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", totalHeight, groupedVariants, SetupItem); + } + }; + } + + void SelectVariant(ActorInfo variant) + { + if (variant == null || selectedActor == null) + return; + + selectedVariant = variant; + + // Update the preview to show the variant + LoadExtras(variant); + var selectedInfo = info.ContainsKey(variant) ? info[variant] : info[selectedActor]; + + var previewColor = GetPreviewColorFromCategory(currentCategoryPath); + EncyclopediaColorPalette.SetPreviewColor(previewColor); + + var previewOwner = GetPreviewOwner(selectedInfo); + var typeDictionary = CreatePreviewTypeDictionary(previewOwner); + + if (previewBackground.IsVisible()) + { + previewWidget.SetPreview(renderActor, typeDictionary, previewColor); + previewWidget.GetScale = () => selectedInfo.Scale; + } + + // Update title to show variant name + if (titleLabel != null) + titleLabel.Text = GetActorDisplayName(variant); + + // Update description from variant's traits + UpdateVariantDescription(variant); + } + + void UpdateVariantDescription(ActorInfo variant) + { + var currentY = SetupProductionContainer(variant); + + // Hide subfaction info for variants + if (subfactionLabel != null) + subfactionLabel.Visible = false; + if (subfactionFlagImage != null) + subfactionFlagImage.Visible = false; + if (additionalInfoLabel != null) + additionalInfoLabel.Visible = false; + + currentY = SetupDescriptionSection(variant, currentY, showEncyclopediaDescription: false); + + actorDetailsContainer.Bounds.Height = currentY; + descriptionPanel.Layout.AdjustChildren(); + descriptionPanel.ScrollToTop(); + } + + int SetupProductionContainer(ActorInfo actor) + { + if (productionContainer == null) + return 0; + + var currentX = 0; + var productionContainerHeight = 0; + const int IconWidth = 16; + const int LabelSpacing = 4; + const int GroupSpacing = 20; + + var costIcon = productionContainer.GetOrNull("COST_ICON"); + var timeIcon = productionContainer.GetOrNull("TIME_ICON"); + var notProducibleIcon = productionContainer.GetOrNull("NOT_PRODUCIBLE_ICON"); + var notProducibleLabel = productionContainer.GetOrNull("NOT_PRODUCIBLE"); + + if (costIcon != null) costIcon.Visible = false; + if (timeIcon != null) timeIcon.Visible = false; + if (productionCost != null) productionCost.Visible = false; + if (productionTime != null) productionTime.Visible = false; + if (armorTypeIcon != null) armorTypeIcon.Visible = false; + if (armorTypeLabel != null) armorTypeLabel.Visible = false; + if (productionPowerIcon != null) productionPowerIcon.Visible = false; + if (productionPower != null) productionPower.Visible = false; + if (notProducibleIcon != null) notProducibleIcon.Visible = false; + if (notProducibleLabel != null) notProducibleLabel.Visible = false; + + // For variants without BuildableInfo/ValuedInfo, fall back to base actor + var bi = actor.TraitInfoOrDefault(); + var valued = actor.TraitInfoOrDefault(); + var actorForProduction = actor; + + if ((bi == null || valued == null) && actor != selectedActor && selectedActor != null) + { + // Variant doesn't have production info, use base actor + if (bi == null) + bi = selectedActor.TraitInfoOrDefault(); + if (valued == null) + { + valued = selectedActor.TraitInfoOrDefault(); + actorForProduction = selectedActor; + } + } + + var selectedInfo = info.ContainsKey(actor) ? info[actor] : info[selectedActor]; + + if (bi != null && !selectedInfo.HideBuildable) + { + var cost = valued?.Cost ?? 0; + if (cost > 0 && productionCost != null && costIcon != null) + { + var costText = cost.ToString(NumberFormatInfo.CurrentInfo); + productionCost.Text = costText; + costIcon.Bounds.X = currentX; + productionCost.Bounds.X = currentX + IconWidth + LabelSpacing; + var costWidth = Game.Renderer.Fonts[productionCost.Font].Measure(costText).X; + currentX += IconWidth + LabelSpacing + costWidth + GroupSpacing; + + costIcon.Visible = true; + productionCost.Visible = true; + productionContainerHeight = descriptionFont.Measure(costText).Y; + } + + var time = BuildTime(actorForProduction, selectedInfo.BuildableQueue); + if (time > 0 && productionTime != null && timeIcon != null) + { + var timeText = WidgetUtils.FormatTime(time, world.Timestep); + productionTime.Text = timeText; + timeIcon.Bounds.X = currentX; + productionTime.Bounds.X = currentX + IconWidth + LabelSpacing; + var timeWidth = Game.Renderer.Fonts[productionTime.Font].Measure(timeText).X; + currentX += IconWidth + LabelSpacing + timeWidth + GroupSpacing; + + timeIcon.Visible = true; + productionTime.Visible = true; + productionContainerHeight = Math.Max(productionContainerHeight, descriptionFont.Measure(timeText).Y); + } + } + else + { + if (encyclopediaExtrasInfo != null && encyclopediaExtrasInfo.HideNotProducible) + { + productionContainer.Visible = false; + } + else + { + notProducibleIcon.Visible = true; + notProducibleIcon.Bounds.X = currentX; + notProducibleLabel.Visible = true; + notProducibleLabel.Bounds.X = currentX + IconWidth + LabelSpacing; + var notProducibleLabelWidth = Game.Renderer.Fonts[notProducibleLabel.Font].Measure(notProducibleLabel.Text).X; + currentX += IconWidth + LabelSpacing + notProducibleLabelWidth + GroupSpacing; + productionContainerHeight = descriptionFont.Measure(notProducibleLabel.Text).Y; + } + } + + if (armorTypeLabel != null && armorTypeIcon != null) + { + var armor = actor.TraitInfos().FirstOrDefault(); + if (armor != null && !string.IsNullOrEmpty(armor.Type)) + { + SelectionTooltipLogic.GetArmorTypeLabel(armorTypeLabel, actor); + var hasArmorType = !string.IsNullOrEmpty(armorTypeLabel.Text); + if (hasArmorType) + { + armorTypeIcon.Bounds.X = currentX; + armorTypeLabel.Bounds.X = currentX + IconWidth + LabelSpacing; + var armorWidth = Game.Renderer.Fonts[armorTypeLabel.Font].Measure(armorTypeLabel.Text).X; + currentX += IconWidth + LabelSpacing + armorWidth + GroupSpacing; + + armorTypeIcon.Visible = true; + armorTypeLabel.Visible = true; + productionContainerHeight = Math.Max(productionContainerHeight, descriptionFont.Measure(armorTypeLabel.Text).Y); + } + } + } + + var power = actor.TraitInfos().Where(i => i.EnabledByDefault).Sum(i => i.Amount); + if (power != 0 && productionPower != null && productionPowerIcon != null) + { + var powerText = power.ToString(NumberFormatInfo.CurrentInfo); + productionPower.Text = powerText; + productionPowerIcon.Bounds.X = currentX; + productionPower.Bounds.X = currentX + IconWidth + LabelSpacing; + var powerWidth = Game.Renderer.Fonts[productionPower.Font].Measure(powerText).X; + currentX += IconWidth + LabelSpacing + powerWidth + GroupSpacing; + + productionPowerIcon.Visible = true; + productionPower.Visible = true; + productionContainerHeight = Math.Max(productionContainerHeight, descriptionFont.Measure(powerText).Y); + } + + // Only show the production container if it has any visible content + var hasVisibleContent = (costIcon?.Visible == true) || + (timeIcon?.Visible == true) || + (armorTypeIcon?.Visible == true) || + (productionPowerIcon?.Visible == true) || + (notProducibleIcon?.Visible == true); + + productionContainer.Visible = hasVisibleContent; + return productionContainerHeight + 10; + } + + int SetupDescriptionSection(ActorInfo actor, int currentY, bool showEncyclopediaDescription) + { + // Get prerequisites and description + var bi = actor.TraitInfoOrDefault(); + var prerequisitesText = ""; + var descriptionText = ""; + + // Get current faction for context-aware prerequisite linking + var currentFaction = ""; + if (!string.IsNullOrEmpty(currentCategoryPath)) + currentFaction = currentCategoryPath.Split('/')[0]; + + if (bi != null) + { + var prereqs = bi.Prerequisites + .Where(s => !s.StartsWith('~') && !s.StartsWith('!')) + .Select(prereqName => + { + // Find the actor name that provides this prerequisite (faction-aware) + var actorName = FindPrerequisiteActorName(prereqName, currentFaction); + if (actorName != null) + return $"[[{actorName}]]"; // Display name resolved by ResolveDisplayText callback + return ActorName(modData.DefaultRules, prereqName); + }) + .ToList(); + + if (prereqs.Count != 0) + { + prerequisitesText = WidgetUtilsCA.WrapTextWithIndent( + FluentProvider.GetMessage(Requires, "prerequisites", prereqs.JoinWith(", ")), + descriptionLabel.Bounds.Width, + descriptionFont); + } + + if (!string.IsNullOrEmpty(bi.Description)) + { + descriptionText = WidgetUtilsCA.WrapTextWithIndent( + FluentProvider.GetMessage(bi.Description.Replace("\\n", "\n")), + descriptionLabel.Bounds.Width, + descriptionFont); + } + } + + var tooltipExtras = actor.TraitInfos().FirstOrDefault(info => info.IsStandard); + + if (string.IsNullOrEmpty(descriptionText)) + { + if (tooltipExtras != null && !string.IsNullOrEmpty(tooltipExtras.Description)) + { + descriptionText = WidgetUtilsCA.WrapTextWithIndent( + FluentProvider.GetMessage(tooltipExtras.Description.Replace("\\n", "\n")), + descriptionLabel.Bounds.Width, + descriptionFont); + } + else if (encyclopediaExtrasInfo != null && !string.IsNullOrEmpty(encyclopediaExtrasInfo.Description)) + { + // Skip text with links - it will go to the LinkableLabelWidget + if (!encyclopediaExtrasInfo.Description.Contains("[[")) + { + descriptionText = WidgetUtilsCA.WrapTextWithIndent( + FluentProvider.GetMessage(encyclopediaExtrasInfo.Description.Replace("\\n", "\n")), + descriptionLabel.Bounds.Width, + descriptionFont); + } + } + } + + var prerequisitesHeight = string.IsNullOrEmpty(prerequisitesText) ? 0 : descriptionFont.Measure(prerequisitesText).Y; + prerequisitesLabel.GetText = () => prerequisitesText; + prerequisitesLabel.Bounds.Height = prerequisitesHeight; + prerequisitesLabel.Visible = !string.IsNullOrEmpty(prerequisitesText); + + var descriptionHeight = string.IsNullOrEmpty(descriptionText) ? 0 : descriptionFont.Measure(descriptionText).Y; + descriptionLabel.GetText = () => descriptionText; + descriptionLabel.Bounds.Height = descriptionHeight; + descriptionLabel.Visible = !string.IsNullOrEmpty(descriptionText); + + if (!string.IsNullOrEmpty(prerequisitesText)) + { + prerequisitesLabel.Bounds.Y = currentY; + currentY += prerequisitesHeight + 8; + } + + if (!string.IsNullOrEmpty(descriptionText)) + { + descriptionLabel.Bounds.Y = currentY; + currentY += descriptionHeight + 8; + } + + // Get strengths/weaknesses/attributes + var strengthsText = ""; + var weaknessesText = ""; + var attributesText = ""; + + if (tooltipExtras != null) + { + strengthsText = WidgetUtilsCA.WrapTextWithIndent(tooltipExtras.Strengths.Replace("\\n", "\n"), strengthsLabel.Bounds.Width, descriptionFont, 6); + weaknessesText = WidgetUtilsCA.WrapTextWithIndent(tooltipExtras.Weaknesses.Replace("\\n", "\n"), weaknessesLabel.Bounds.Width, descriptionFont, 6); + attributesText = WidgetUtilsCA.WrapTextWithIndent(tooltipExtras.Attributes.Replace("\\n", "\n"), attributesLabel.Bounds.Width, descriptionFont, 6); + } + + if (!string.IsNullOrEmpty(strengthsText) && strengthsLabel != null) + { + SetupTextLabel(strengthsLabel, strengthsText, ref currentY, 0); + } + else if (strengthsLabel != null) + { + strengthsLabel.Visible = false; + } + + if (!string.IsNullOrEmpty(weaknessesText) && weaknessesLabel != null) + { + SetupTextLabel(weaknessesLabel, weaknessesText, ref currentY, 0); + } + else if (weaknessesLabel != null) + { + weaknessesLabel.Visible = false; + } + + if (!string.IsNullOrEmpty(attributesText) && attributesLabel != null) + { + SetupTextLabel(attributesLabel, attributesText, ref currentY, 8); + } + else if (attributesLabel != null) + { + attributesLabel.Visible = false; + } + + // Show encyclopedia description only for base actors + if (showEncyclopediaDescription) + { + var selectedInfo = info.ContainsKey(actor) ? info[actor] : null; + var encyclopediaText = ""; + + // First check EncyclopediaInfo.Description + if (selectedInfo != null && !string.IsNullOrEmpty(selectedInfo.Description)) + encyclopediaText = WidgetUtils.WrapText(FluentProvider.GetMessage(selectedInfo.Description), descriptionLabel.Bounds.Width, descriptionFont); + + // Also check EncyclopediaExtrasInfo.Description for text with [[...]] links + if (string.IsNullOrEmpty(encyclopediaText) && encyclopediaExtrasInfo != null + && !string.IsNullOrEmpty(encyclopediaExtrasInfo.Description) + && encyclopediaExtrasInfo.Description.Contains("[[")) + { + encyclopediaText = WidgetUtilsCA.WrapTextWithIndent( + FluentProvider.GetMessage(encyclopediaExtrasInfo.Description.Replace("\\n", "\n")), + descriptionLabel.Bounds.Width, + descriptionFont); + } + + if (!string.IsNullOrEmpty(encyclopediaText) && encyclopediaDescriptionLabel != null) + { + SetupTextLabel(encyclopediaDescriptionLabel, encyclopediaText, ref currentY, 0); + } + else if (encyclopediaDescriptionLabel != null) + { + encyclopediaDescriptionLabel.Visible = false; + } + } + else if (encyclopediaDescriptionLabel != null) + { + encyclopediaDescriptionLabel.Visible = false; + } + + return currentY; + } + + int GetVariantGroupSortOrder(string groupName) + { + return variantGroupOrder.TryGetValue(groupName, out var order) ? order : int.MaxValue; + } + + void RotatePreview() + { + if (selectedActor == null) + return; + + currentFacing -= new WAngle(16); + } + + Player GetPreviewOwner(EncyclopediaInfo selectedInfo) + { + if (!string.IsNullOrEmpty(selectedInfo.PreviewOwner)) + { + return world.Players.FirstOrDefault(p => p.InternalName == selectedInfo.PreviewOwner); + } + else if (world.Type == WorldType.Regular && world.LocalPlayer != null) + { + return world.LocalPlayer; + } + else + { + var inferredOwner = InferPreviewOwnerFromCategory(currentCategoryPath); + if (!string.IsNullOrEmpty(inferredOwner)) + return world.Players.FirstOrDefault(p => p.InternalName == inferredOwner); + } + + return null; + } + + public override void Tick() + { + RotatePreview(); + } + + static string ActorName(Ruleset rules, string name) + { + if (rules.Actors.TryGetValue(name.ToLowerInvariant(), out var actor)) + { + var actorTooltip = actor.TraitInfos().FirstOrDefault(info => info.EnabledByDefault); + if (actorTooltip != null) + return FluentProvider.GetMessage(actorTooltip.Name).Replace("Research: ", "").Replace("Upgrade: ", ""); + } + + return name; + } + + /// + /// Finds the faction-specific building that provides a given prerequisite. + /// Returns the actor name, or null if not found. + /// + string FindPrerequisiteActorName(string prereqName, string faction) + { + // First check if the prerequisite is a direct actor name with an encyclopedia entry + if (modData.DefaultRules.Actors.TryGetValue(prereqName.ToLowerInvariant(), out var directActor)) + { + if (entryLookupByActorName.ContainsKey(directActor.Name)) + return directActor.Name; + } + + // Look up the actor that provides this prerequisite for the given faction + if (!string.IsNullOrEmpty(faction) && + prerequisiteProvidersByFaction.TryGetValue(faction, out var providers) && + providers.TryGetValue(prereqName, out var actorName)) + { + return actorName; + } + + return null; + } + + int BuildTime(ActorInfo info, string queue) + { + var bi = info.TraitInfoOrDefault(); + + if (bi == null) + return 0; + + var time = bi.BuildDuration; + if (time == -1) + { + var valued = info.TraitInfoOrDefault(); + if (valued == null) + return 0; + else + time = valued.Cost; + } + + int pbi; + if (queue != null) + { + var pqueue = modData.DefaultRules.Actors.Values.SelectMany(a => a.TraitInfos() + .Where(x => x.Type == queue)).FirstOrDefault(); + + pbi = pqueue?.BuildDurationModifier ?? 100; + } + else + { + var pqueue = modData.DefaultRules.Actors.Values.SelectMany(a => a.TraitInfos() + .Where(x => bi.Queue.Contains(x.Type))).FirstOrDefault(); + + pbi = pqueue?.BuildDurationModifier ?? 100; + } + + time = time * bi.BuildDurationModifier * pbi / 10000; + return time; + } + + protected override void Dispose(bool disposing) + { + foreach (var sheet in sheets) + sheet.Dispose(); + + base.Dispose(disposing); + } + + string InferPreviewOwnerFromCategory(string categoryPath) + { + if (string.IsNullOrEmpty(categoryPath)) + return null; + + var topLevelCategory = categoryPath.Split('/')[0]; + + if (topLevelCategory == "Nod") + { + var redUnits = new[] { "amcv", "harv.td", "harv.td.upg", "enli", "rmbc", "reap", "tplr", "shad", "scrn" }; + var parts = categoryPath.Split('/'); + if (parts.Length > 1) + { + // Nod units use no preview owner so they appear white. + var secondLevel = parts[1]; + if (!redUnits.Contains(selectedActor.Name) && (secondLevel == "Vehicles" || secondLevel == "Aircraft" || secondLevel == "Infantry")) + return null; + } + + return "Nod"; + } + + if (selectedActor.Name == "sbag" || selectedActor.Name == "fenc") + { + return "GDI"; + } + + return topLevelCategory switch + { + "Allies" => "Greece", + "Soviets" => "USSR", + "GDI" => "GDI", + "Scrin" => "Scrin", + _ => null + }; + } + + /// + /// Gets an arbitrary color for the preview based on faction/category. + /// This allows coloring actors without needing a map player. + /// + Color GetPreviewColorFromCategory(string categoryPath) + { + if (string.IsNullOrEmpty(categoryPath)) + return Color.White; + + var topLevelCategory = categoryPath.Split('/')[0]; + + if (topLevelCategory == "Nod") + { + var redUnits = new[] { "amcv", "harv.td", "harv.td.upg", "enli", "rmbc", "reap", "tplr", "shad", "scrn" }; + var parts = categoryPath.Split('/'); + if (parts.Length > 1) + { + // Most Nod units appear white/gray + var secondLevel = parts[1]; + if (!redUnits.Contains(selectedActor.Name) && (secondLevel == "Vehicles" || secondLevel == "Aircraft" || secondLevel == "Infantry")) + return Color.FromArgb(230, 230, 255); // E6E6FF + } + + return Color.FromArgb(254, 17, 0); // FE1100 + } + + if (selectedActor.Name == "sbag" || selectedActor.Name == "fenc") + { + return Color.FromArgb(242, 207, 116); // F2CF74 + } + + return topLevelCategory switch + { + "Allies" => Color.FromArgb(153, 172, 242), // 99ACF2 + "Soviets" => Color.FromArgb(254, 17, 0), // FE1100 + "GDI" => Color.FromArgb(242, 207, 116), // F2CF74 + "Scrin" => Color.FromArgb(128, 0, 200), // 7700FF + _ => Color.FromArgb(158, 166, 179) // 9EA6B3 + }; + } + + void CreateCategoryTabs() + { + // Get all top-level categories + var topLevelCategories = folderNodes.Values + .Where(n => n.Parent == null && !string.IsNullOrEmpty(n.Name)) + .OrderBy(n => GetTopLevelCategorySortOrder(n.Name)) + .ToList(); + + // If no categories, select the first one + if (selectedTopLevelCategory == null && topLevelCategories.Count > 0) + selectedTopLevelCategory = topLevelCategories[0].FullPath; + + // Calculate tab width to fill available space + var availableWidth = tabContainer.Bounds.Width; + var tabCount = topLevelCategories.Count; + var tabWidth = tabCount > 0 ? availableWidth / tabCount : 0; + + // Get the font for measuring text width + var font = Game.Renderer.Fonts[tabTemplate.Font]; + + // Create tab buttons + var tabX = 0; + foreach (var category in topLevelCategories) + { + var tabButton = (ButtonWidget)tabTemplate.Clone(); + tabButton.Bounds.X = tabX; + tabButton.Bounds.Width = tabWidth; + tabButton.IsHighlighted = () => selectedTopLevelCategory == category.FullPath; + tabButton.OnClick = () => SelectTopLevelCategory(category.FullPath); + tabButton.IsVisible = () => true; + tabButton.GetText = () => category.Name; + + // Get the flag image widget + var flagImage = tabButton.GetOrNull("TAB_FLAG"); + var flagName = GetFactionFlag(category.Name); + + if (flagImage != null && !string.IsNullOrEmpty(flagName)) + { + tabButton.GetText = () => ""; + + var tabLabel = tabButton.GetOrNull("TAB_LABEL"); + tabLabel.GetText = () => category.Name; + + var textWidth = font.Measure(category.Name).X; + var flagWidth = 30; // Width of flag as defined in YAML + var gap = 7; // Small gap between flag and text + + var contentWidth = flagWidth + gap + textWidth; + + var flagX = (tabWidth - contentWidth) / 2; + + // Position the flag + flagImage.Bounds.X = flagX; + flagImage.IsVisible = () => true; + flagImage.GetImageName = () => flagName; + + // Position the label after the flag + gap + tabLabel.Bounds.X = flagX + flagWidth + gap; + } + else + { + // No flag, center text normally + if (flagImage != null) + flagImage.IsVisible = () => false; + } + + tabContainer.AddChild(tabButton); + categoryTabs.Add(tabButton); + + tabX += tabWidth; + } + } + + static string GetFactionFlag(string categoryName) + { + return categoryName switch + { + "Allies" => "allies", + "Soviets" => "soviet", + "GDI" => "gdi", + "Nod" => "nod", + "Scrin" => "scrin", + _ => null + }; + } + + void SelectTopLevelCategory(string categoryPath) + { + selectedTopLevelCategory = categoryPath; + + // Rebuild the folder structure to show only the selected category + actorList.RemoveChildren(); + firstItem = null; + CreateFolderStructure(); + + // Try to restore the previously selected actor for this category + if (lastSelectedActorByCategory.TryGetValue(categoryPath, out var rememberedActor)) + { + // Verify the actor still exists and is in the current category + if (info.ContainsKey(rememberedActor)) + { + var encyclopedia = info[rememberedActor]; + var categories = encyclopedia.Category ?? ""; + var categoryPaths = ParseCategoryPaths(categories); + + // Check if the remembered actor belongs to the current top-level category + // and find the appropriate category path for this actor in the current context + foreach (var actorCategoryPath in categoryPaths) + { + if (actorCategoryPath.Split('/')[0] == categoryPath) + { + SelectActor(rememberedActor, actorCategoryPath); + return; + } + } + } + } + } + + // Helper methods for category sorting + static int GetTopLevelCategorySortOrder(string categoryName) + { + return categoryName switch + { + "Allies" => 0, + "Soviets" => 1, + "GDI" => 2, + "Nod" => 3, + "Scrin" => 4, + _ => 1000 + }; + } + + static int GetSecondLevelCategorySortOrder(string categoryName) + { + return categoryName switch + { + "Infantry" => 0, + "Vehicles" => 1, + "Aircraft" => 2, + "Buildings" => 3, + "Defenses" => 4, + "Naval" => 5, + "Upgrades" => 6, + "Support Powers" => 7, + "Subfactions" => 8, + "Tips" => 9, + "Buffs" => 10, + "Debuffs" => 11, + "Tech Buildings" => 12, + "Tech Units" => 13, + _ => 1000 + }; + } + + void LoadExtras(ActorInfo actor) + { + encyclopediaExtrasInfo = actor.TraitInfoOrDefault(); + + renderActor = encyclopediaExtrasInfo != null && !string.IsNullOrEmpty(encyclopediaExtrasInfo.RenderPreviewActor) ? + modData.DefaultRules.Actors.GetValueOrDefault(encyclopediaExtrasInfo.RenderPreviewActor) ?? actor : actor; + } + + static string GetActorDisplayName(ActorInfo actor) + { + // Check for EncyclopediaExtrasInfo.Name first + var extras = actor.TraitInfoOrDefault(); + if (extras != null && !string.IsNullOrEmpty(extras.Name)) + { + return FluentProvider.GetMessage(extras.Name); + } + + // Fall back to TooltipInfo + var name = actor.TraitInfos().FirstOrDefault(info => info.EnabledByDefault)?.Name; + if (!string.IsNullOrEmpty(name)) + { + return FluentProvider.GetMessage(name).Replace("Upgrade: ", "").Replace("Research: ", ""); + } + + return ""; + } + + ScrollItemWidget CreateActorListItem(ActorInfo actor, string categoryPath, int indentLevel = 0) + { + var item = ScrollItemWidget.Setup(template, + () => selectedActor != null && selectedActor.Name == actor.Name, + () => SelectActor(actor, categoryPath)); + + item.IsHighlighted = () => selectedActor != null && selectedActor.Name == actor.Name; + + var bullet = item.GetOrNull("ICON"); + if (bullet != null) + bullet.Bounds.X = 4 + indentLevel * 15; + + var label = item.Get("TITLE"); + label.Bounds.X = 26 + indentLevel * 15; + + var displayName = GetActorDisplayName(actor); + if (!string.IsNullOrEmpty(displayName)) + { + label.GetText = () => displayName; + WidgetUtils.TruncateLabelToTooltip(label, displayName); + } + + return item; + } + + TypeDictionary CreatePreviewTypeDictionary(Player previewOwner) + { + var typeDictionary = new TypeDictionary() + { + new OwnerInit(previewOwner ?? world.WorldActor.Owner), + new FactionInit(world.WorldActor.Owner.PlayerReference.Faction), + new DynamicFacingInit(() => currentFacing), + }; + + // Add DynamicTurretFacingInit for each turret so they rotate with the body + foreach (var turretInfo in renderActor.TraitInfos()) + { + // The turret facing is relative to the body, so we add body facing + initial turret facing + typeDictionary.Add(new DynamicTurretFacingInit(turretInfo, () => currentFacing + turretInfo.InitialFacing)); + } + + foreach (var actorPreviewInit in renderActor.TraitInfos()) + { + foreach (var init in actorPreviewInit.ActorPreviewInits(renderActor, ActorPreviewType.ColorPicker)) + { + // Skip FacingInit since we're using DynamicFacingInit + if (init is FacingInit) + continue; + + // Skip TurretFacingInit since we're using DynamicTurretFacingInit + if (init is TurretFacingInit) + continue; + + typeDictionary.Add(init); + } + } + + return typeDictionary; + } + + void SetupTextLabel(LabelWidget label, string text, ref int currentY, int additionalSpacing = 8) + { + if (!string.IsNullOrEmpty(text) && label != null) + { + label.Bounds.Y = currentY; + label.Visible = true; + label.GetText = () => text; + var textHeight = descriptionFont.Measure(text).Y; + label.Bounds.Height = textHeight; + currentY += textHeight + additionalSpacing; + } + else if (label != null) + { + label.Visible = false; + } + } + + static string[] ParseCategoryPaths(string categories) + { + return categories?.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries) + .Select(c => c.Trim()) + .ToArray() ?? Array.Empty(); + } + } +} diff --git a/OpenRA.Mods.CA/Widgets/Logic/ExternalLinksLogic.cs b/OpenRA.Mods.CA/Widgets/Logic/ExternalLinksLogic.cs new file mode 100644 index 0000000000..b9a9ecc946 --- /dev/null +++ b/OpenRA.Mods.CA/Widgets/Logic/ExternalLinksLogic.cs @@ -0,0 +1,26 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Widgets; + +namespace OpenRA.Mods.CA.Widgets.Logic +{ + public class ExternalLinksLogic : ChromeLogic + { + readonly Widget widget; + + [ObjectCreator.UseCtor] + public ExternalLinksLogic(Widget widget) + { + this.widget = widget; + widget.IsVisible = () => !Game.Settings.Debug.PerfGraph; + } + } +} diff --git a/OpenRA.Mods.CA/Widgets/Logic/Ingame/AlliedInfluenceIndicatorLogic.cs b/OpenRA.Mods.CA/Widgets/Logic/Ingame/AlliedInfluenceIndicatorLogic.cs new file mode 100644 index 0000000000..6afdf2bf0d --- /dev/null +++ b/OpenRA.Mods.CA/Widgets/Logic/Ingame/AlliedInfluenceIndicatorLogic.cs @@ -0,0 +1,184 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Linq; +using OpenRA.Mods.CA.Traits; +using OpenRA.Mods.Common.Widgets; +using OpenRA.Primitives; +using OpenRA.Widgets; + +namespace OpenRA.Mods.CA.Widgets.Logic +{ + class AlliedInfluenceIndicatorLogic : ChromeLogic + { + [FluentReference("level")] + const string PlayerInfluenceLevel = "label-player-influence-level"; + + [FluentReference("time")] + const string PlayerInfluenceLevelTime = "label-player-influence-level-time"; + + [FluentReference("coalition")] + const string ChosenCoalition = "label-player-influence-coalition"; + + [FluentReference("policy")] + const string ChosenPolicy = "label-player-influence-policy"; + + const string NoneImage = "none"; + const string DisabledImage = "disabled"; + + ProvidesPrerequisitesOnTimeline timeline; + + string chosenCoalition; + string chosenPolicy; + int currentTicks = 0; + + private readonly UpgradesManager upgradesManager; + private readonly ContainerWidget influenceMeter; + private readonly CroppableImageWidget influenceMeterFull; + private readonly ImageWidget influenceLevel; + + [ObjectCreator.UseCtor] + public AlliedInfluenceIndicatorLogic(Widget widget, World world) + { + timeline = world.LocalPlayer.PlayerActor.TraitsImplementing() + .FirstOrDefault(c => c.Info.Type == "AlliedInfluence"); + + var container = widget.Get("ALLIED_INFLUENCE"); + var coalitionImage = container.Get("ALLIED_COALITION_IMAGE"); + var noCoalitionImage = container.Get("ALLIED_NO_COALITION_IMAGE"); + + influenceMeter = container.Get("ALLIED_INFLUENCE_METER"); + influenceMeterFull = influenceMeter.Get("ALLIED_INFLUENCE_METER_FULL"); + influenceLevel = container.Get("ALLIED_INFLUENCE_LEVEL"); + + noCoalitionImage.IsVisible = () => false; + + // influence meter is only shown if player is an allied faction + if (world.LocalPlayer.Faction.Side != "Allies") + { + container.IsVisible = () => false; + return; + } + + upgradesManager = world.LocalPlayer.PlayerActor.Trait(); + upgradesManager.UpgradeCompleted += HandleUpgradeCompleted; + + if (timeline != null) + { + influenceMeterFull.Direction = CroppableImageWidget.CropDirection.BottomUp; + influenceMeterFull.GetCropPercentage = () => + { + var thresholds = timeline.Thresholds; + if (thresholds.Length == 0) + return 0f; + + var currentThreshold = 0; + var nextThreshold = thresholds.FirstOrDefault(t => t > currentTicks); + + for (var i = thresholds.Length - 1; i >= 0; i--) + { + if (thresholds[i] <= currentTicks) + { + currentThreshold = thresholds[i]; + break; + } + } + + if (nextThreshold == 0) + return 1f; + + var progressInThreshold = currentTicks - currentThreshold; + var thresholdSize = nextThreshold - currentThreshold; + return thresholdSize > 0 ? (float)progressInThreshold / thresholdSize : 0f; + }; + + var influenceMeterTooltipTextCached = new CachedTransform((timeCoalitionPolicy) => + { + var thresholdsPassed = timeline.ThresholdsPassed; + + var tooltip = FluentProvider.GetMessage(PlayerInfluenceLevel, "level", thresholdsPassed); + + if (timeline.TicksUntilNextThreshold > 0) + tooltip += "\n" + FluentProvider.GetMessage(PlayerInfluenceLevelTime, "time", WidgetUtils.FormatTime(timeline.TicksUntilNextThreshold, world.Timestep)); + + if (chosenCoalition != null) + tooltip += "\n" + FluentProvider.GetMessage(ChosenCoalition, "coalition", char.ToUpper(chosenCoalition[0]) + chosenCoalition[1..]); + + if (chosenPolicy != null) + tooltip += "\n" + FluentProvider.GetMessage(ChosenPolicy,"policy", char.ToUpper(chosenPolicy[0]) + chosenPolicy[1..]); + + return tooltip; + }); + + timeline.TicksChanged += HandleTicksChanged; + + influenceLevel.GetImageName = () => + { + if (chosenCoalition != null && timeline.ThresholdsPassed >= timeline.Thresholds.Length) + return "level0"; + + return timeline.ThresholdsPassed switch + { + 0 => "level0", + 1 => "level1", + 2 => "level2", + 3 => "level3", + _ => "level0", + }; + }; + + coalitionImage.GetImageName = () => + { + if (timeline.TicksElapsed >= timeline.MaxTicks) + return chosenCoalition ?? NoneImage; + + return DisabledImage; + }; + + container.GetTooltipText = () => + { + var timeCoalitionPolicy = $"{(timeline.TicksUntilNextThreshold / 25).ToString()}-{chosenCoalition}-{chosenPolicy}"; + return influenceMeterTooltipTextCached.Update(timeCoalitionPolicy); + }; + } + else + { + coalitionImage.GetImageName = () => NoneImage; + influenceMeter.IsVisible = () => false; + influenceLevel.IsVisible = () => false; + coalitionImage.IsVisible = () => false; + noCoalitionImage.IsVisible = () => true; + container.GetTooltipText = () => FluentProvider.GetMessage(PlayerInfluenceLevel, "level", "N/A");; + } + } + + private void HandleUpgradeCompleted(string upgradeName) + { + if (upgradeName.EndsWith(".coalition")) + chosenCoalition = upgradeName.Split('.')[0]; + else if (upgradeName.EndsWith(".policy")) + chosenPolicy = upgradeName.Split('.')[0]; + + if (chosenCoalition != null && chosenPolicy != null) + upgradesManager.UpgradeCompleted -= HandleUpgradeCompleted; + } + + private void HandleTicksChanged(int ticks) + { + currentTicks = ticks; + + if (ticks >= timeline.MaxTicks) + { + timeline.TicksChanged -= HandleTicksChanged; + influenceMeter.IsVisible = () => false; + } + } + } +} diff --git a/OpenRA.Mods.CA/Widgets/Logic/Ingame/ArmyTooltipLogicCA.cs b/OpenRA.Mods.CA/Widgets/Logic/Ingame/ArmyTooltipLogicCA.cs new file mode 100644 index 0000000000..6082c8c321 --- /dev/null +++ b/OpenRA.Mods.CA/Widgets/Logic/Ingame/ArmyTooltipLogicCA.cs @@ -0,0 +1,67 @@ +#region Copyright & License Information +/* + * Copyright (c) The OpenRA Developers and Contributors + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. For more + * information, see COPYING. + */ +#endregion + +using System; +using OpenRA.Mods.Common.Traits; +using OpenRA.Widgets; + +namespace OpenRA.Mods.Common.Widgets.Logic +{ + // Identical to ArmyTooltipLogic, but replaces \n with newlines (only needed where not using fluent) + public class ArmyTooltipLogicCA : ChromeLogic + { + [ObjectCreator.UseCtor] + public ArmyTooltipLogicCA(Widget widget, TooltipContainerWidget tooltipContainer, Func getTooltipUnit) + { + widget.IsVisible = () => getTooltipUnit() != null; + var nameLabel = widget.Get("NAME"); + var descLabel = widget.Get("DESC"); + + var font = Game.Renderer.Fonts[nameLabel.Font]; + var descFont = Game.Renderer.Fonts[descLabel.Font]; + + ArmyUnit lastArmyUnit = null; + var descLabelPadding = descLabel.Bounds.Height; + + tooltipContainer.BeforeRender = () => + { + var armyUnit = getTooltipUnit(); + + if (armyUnit == null || armyUnit == lastArmyUnit) + return; + + var tooltip = armyUnit.TooltipInfo; + var name = tooltip != null ? FluentProvider.GetMessage(tooltip.Name) : armyUnit.ActorInfo.Name; + var buildable = armyUnit.BuildableInfo; + + nameLabel.GetText = () => name; + var nameSize = font.Measure(name); + + var desc = string.IsNullOrEmpty(buildable.Description) ? "" : FluentProvider.GetMessage(buildable.Description).Replace("\\n", "\n"); + descLabel.GetText = () => desc; + var descSize = descFont.Measure(desc); + descLabel.Bounds.Width = descSize.X; + descLabel.Bounds.Height = descSize.Y + descLabelPadding; + + var leftWidth = Math.Max(nameSize.X, descSize.X); + + widget.Bounds.Width = leftWidth + 2 * nameLabel.Bounds.X; + + // Set the bottom margin to match the left margin + var leftHeight = descLabel.Bounds.Bottom + descLabel.Bounds.X; + + widget.Bounds.Height = leftHeight; + + lastArmyUnit = armyUnit; + }; + } + } +} diff --git a/OpenRA.Mods.CA/Widgets/Logic/Ingame/ArmyValueTooltipLogic.cs b/OpenRA.Mods.CA/Widgets/Logic/Ingame/ArmyValueTooltipLogic.cs new file mode 100644 index 0000000000..0e5ba984ac --- /dev/null +++ b/OpenRA.Mods.CA/Widgets/Logic/Ingame/ArmyValueTooltipLogic.cs @@ -0,0 +1,73 @@ +#region Copyright & License Information +/* + * Copyright (c) The OpenRA Developers and Contributors + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. For more + * information, see COPYING. + */ +#endregion + +using System; +using OpenRA.Mods.Common.Traits; +using OpenRA.Widgets; + +namespace OpenRA.Mods.Common.Widgets.Logic +{ + // Very similar to ArmyTooltipLogic + public class ArmyValueTooltipLogic : ChromeLogic + { + [ObjectCreator.UseCtor] + public ArmyValueTooltipLogic(Widget widget, TooltipContainerWidget tooltipContainer, Func getTooltipUnit, Func getDesc = null) + { + widget.IsVisible = () => getTooltipUnit() != null; + var nameLabel = widget.Get("NAME"); + var descLabel = widget.Get("DESC"); + + var font = Game.Renderer.Fonts[nameLabel.Font]; + var descFont = Game.Renderer.Fonts[descLabel.Font]; + + ArmyUnit lastArmyUnit = null; + var descLabelPadding = descLabel.Bounds.Height; + + tooltipContainer.BeforeRender = () => + { + var armyUnit = getTooltipUnit(); + + if (armyUnit == null || armyUnit == lastArmyUnit) + return; + + var tooltip = armyUnit.TooltipInfo; + var name = tooltip?.Name ?? armyUnit.ActorInfo.Name; + nameLabel.Text = name; + var nameSize = font.Measure(name); + + if (getDesc != null) + { + descLabel.Text = getDesc(); + } + else + { + var buildable = armyUnit.BuildableInfo; + descLabel.Text = buildable.Description.Replace("\\n", "\n"); + } + + var descSize = descFont.Measure(descLabel.Text); + descLabel.Bounds.Width = descSize.X; + descLabel.Bounds.Height = descSize.Y + descLabelPadding; + + var leftWidth = Math.Max(nameSize.X, descSize.X); + + widget.Bounds.Width = leftWidth + 2 * nameLabel.Bounds.X; + + // Set the bottom margin to match the left margin + var leftHeight = descLabel.Bounds.Bottom + descLabel.Bounds.X; + + widget.Bounds.Height = leftHeight; + + lastArmyUnit = armyUnit; + }; + } + } +} diff --git a/OpenRA.Mods.CA/Widgets/Logic/Ingame/GDIStrategyIndicatorLogic.cs b/OpenRA.Mods.CA/Widgets/Logic/Ingame/GDIStrategyIndicatorLogic.cs new file mode 100644 index 0000000000..b3c66bf7bd --- /dev/null +++ b/OpenRA.Mods.CA/Widgets/Logic/Ingame/GDIStrategyIndicatorLogic.cs @@ -0,0 +1,70 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using OpenRA.Mods.CA.Traits; +using OpenRA.Mods.Common.Widgets; +using OpenRA.Widgets; + +namespace OpenRA.Mods.CA.Widgets.Logic +{ + class GDIStrategyIndicatorLogic : ChromeLogic + { + const string CountType = "StrategyLevel"; + const string DisabledImage = "disabled"; + readonly CountManager countManager; + private string levelImageName; + + [ObjectCreator.UseCtor] + public GDIStrategyIndicatorLogic(Widget widget, World world) + { + var container = widget.Get("GDI_STRATEGY"); + var levelImage = container.Get("GDI_STRATEGY_LEVEL"); + + if (world.LocalPlayer.Faction.Side != "GDI") + { + levelImage.GetImageName = () => DisabledImage; + levelImage.IsVisible = () => false; + return; + } + + countManager = world.LocalPlayer.PlayerActor.Trait(); + UpdateLevelImageName(0); + + countManager.Incremented += HandleIncremented; + countManager.Decremented += HandleDecremented; + + levelImage.GetImageName = () => levelImageName; + levelImage.IsVisible = () => true; + } + + private void HandleIncremented(string type, int newCount) + { + if (type != CountType) + return; + + UpdateLevelImageName(newCount); + } + + private void HandleDecremented(string type, int newCount) + { + if (type != CountType) + return; + + UpdateLevelImageName(newCount); + } + + private void UpdateLevelImageName(int newCount) + { + var count = Math.Min(newCount, 3); + levelImageName = $"level{count}"; + } + } +} diff --git a/OpenRA.Mods.CA/Widgets/Logic/Ingame/GameInfoStatsLogicCA.cs b/OpenRA.Mods.CA/Widgets/Logic/Ingame/GameInfoStatsLogicCA.cs new file mode 100644 index 0000000000..29456024de --- /dev/null +++ b/OpenRA.Mods.CA/Widgets/Logic/Ingame/GameInfoStatsLogicCA.cs @@ -0,0 +1,359 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Linq; +using OpenRA.Graphics; +using OpenRA.Mods.CA.Traits; +using OpenRA.Mods.Common.Traits; +using OpenRA.Mods.Common.Widgets; +using OpenRA.Mods.Common.Widgets.Logic; +using OpenRA.Network; +using OpenRA.Primitives; +using OpenRA.Traits; +using OpenRA.Widgets; + +namespace OpenRA.Mods.CA.Widgets.Logic +{ + class GameInfoStatsLogicCA : ChromeLogic + { + [FluentReference] + const string Unmute = "label-unmute-player"; + + [FluentReference] + const string Mute = "label-mute-player"; + + [FluentReference] + const string Accomplished = "label-mission-accomplished"; + + [FluentReference] + const string Failed = "label-mission-failed"; + + [FluentReference] + const string InProgress = "label-mission-in-progress"; + + [FluentReference("team")] + const string TeamNumber = "label-team-name"; + + [FluentReference] + const string NoTeam = "label-no-team"; + + [FluentReference] + const string Spectators = "label-spectators"; + + [FluentReference] + const string Gone = "label-client-state-disconnected"; + + [FluentReference] + const string KickTooltip = "button-kick-player"; + + [FluentReference("player")] + const string KickTitle = "dialog-kick.title"; + + [FluentReference] + const string KickPrompt = "dialog-kick.prompt"; + + [FluentReference] + const string KickAccept = "dialog-kick.confirm"; + + [FluentReference] + const string KickVoteTooltip = "button-vote-kick-player"; + + [FluentReference("player")] + const string VoteKickTitle = "dialog-vote-kick.title"; + + [FluentReference] + const string VoteKickPrompt = "dialog-vote-kick.prompt"; + + [FluentReference("bots")] + const string VoteKickPromptBreakBots = "dialog-vote-kick.prompt-break-bots"; + + [FluentReference] + const string VoteKickVoteStart = "dialog-vote-kick.vote-start"; + + [FluentReference] + const string VoteKickVoteFor = "dialog-vote-kick.vote-for"; + + [FluentReference] + const string VoteKickVoteAgainst = "dialog-vote-kick.vote-against"; + + [FluentReference] + const string VoteKickVoteCancel = "dialog-vote-kick.vote-cancel"; + + [ObjectCreator.UseCtor] + public GameInfoStatsLogicCA(Widget widget, ModData modData, World world, + OrderManager orderManager, WorldRenderer worldRenderer, Action hideMenu, Action closeMenu) + { + var player = world.LocalPlayer; + var playerPanel = widget.Get("PLAYER_LIST"); + var statsHeader = widget.Get("STATS_HEADERS"); + + if (player != null && !player.NonCombatant) + { + var checkbox = widget.Get("STATS_CHECKBOX"); + var statusLabel = widget.Get("STATS_STATUS"); + + checkbox.IsChecked = () => player.WinState != WinState.Undefined; + checkbox.GetCheckmark = () => player.WinState == WinState.Won ? "tick" : "cross"; + + if (player.HasObjectives) + { + var mo = player.PlayerActor.Trait(); + checkbox.GetText = () => mo.Objectives[0].Description; + } + + var failed = FluentProvider.GetMessage(Failed); + var inProgress = FluentProvider.GetMessage(InProgress); + var accomplished = FluentProvider.GetMessage(Accomplished); + statusLabel.GetText = () => player.WinState == WinState.Won ? accomplished : + player.WinState == WinState.Lost ? failed : inProgress; + statusLabel.GetColor = () => player.WinState == WinState.Won ? Color.LimeGreen : + player.WinState == WinState.Lost ? Color.Red : Color.White; + } + else + { + // Expand the stats window to cover the hidden objectives + var objectiveGroup = widget.Get("OBJECTIVE"); + + objectiveGroup.Visible = false; + statsHeader.Bounds.Y -= objectiveGroup.Bounds.Height; + playerPanel.Bounds.Y -= objectiveGroup.Bounds.Height; + playerPanel.Bounds.Height += objectiveGroup.Bounds.Height; + } + + if (!orderManager.LobbyInfo.Clients.Any(c => !c.IsBot && c.Index != orderManager.LocalClient?.Index && c.State != Session.ClientState.Disconnected)) + statsHeader.Get("ACTIONS").Visible = false; + + var teamTemplate = playerPanel.Get("TEAM_TEMPLATE"); + var playerTemplate = playerPanel.Get("PLAYER_TEMPLATE"); + var spectatorTemplate = playerPanel.Get("SPECTATOR_TEMPLATE"); + var unmuteTooltip = FluentProvider.GetMessage(Unmute); + var muteTooltip = FluentProvider.GetMessage(Mute); + var kickTooltip = FluentProvider.GetMessage(KickTooltip); + var voteKickTooltip = FluentProvider.GetMessage(KickVoteTooltip); + playerPanel.RemoveChildren(); + + var teams = world.Players.Where(p => !p.NonCombatant && p.Playable) + .Select(p => (Player: p, PlayerStatistics: p.PlayerActor.TraitOrDefault())) + .OrderByDescending(p => p.PlayerStatistics?.Experience ?? 0) + .GroupBy(p => (world.LobbyInfo.ClientWithIndex(p.Player.ClientIndex) ?? new Session.Client()).Team) + .OrderByDescending(g => g.Sum(gg => gg.PlayerStatistics?.Experience ?? 0)); + + void KickAction(Session.Client client, Func isVoteKick) + { + hideMenu(true); + if (isVoteKick()) + { + var botsCount = 0; + if (client.IsAdmin) + botsCount = world.Players.Count(p => p.IsBot && p.WinState == WinState.Undefined); + + if (UnitOrders.KickVoteTarget == null) + { + ConfirmationDialogs.ButtonPrompt(modData, + title: VoteKickTitle, + text: botsCount > 0 ? VoteKickPromptBreakBots : VoteKickPrompt, + titleArguments: new object[] { "player", client.Name }, + textArguments: new object[] { "bots", botsCount }, + onConfirm: () => + { + orderManager.IssueOrder(Order.Command($"vote_kick {client.Index} {true}")); + hideMenu(false); + closeMenu(); + }, + confirmText: VoteKickVoteStart, + onCancel: () => hideMenu(false)); + return; + } + + ConfirmationDialogs.ButtonPrompt(modData, + title: VoteKickTitle, + text: botsCount > 0 ? VoteKickPromptBreakBots : VoteKickPrompt, + titleArguments: new object[] { "player", client.Name }, + textArguments: new object[] { "bots", botsCount }, + onConfirm: () => + { + orderManager.IssueOrder(Order.Command($"vote_kick {client.Index} {true}")); + hideMenu(false); + closeMenu(); + }, + confirmText: VoteKickVoteFor, + onCancel: () => hideMenu(false), + cancelText: VoteKickVoteCancel, + onOther: () => + { + Ui.CloseWindow(); + orderManager.IssueOrder(Order.Command($"vote_kick {client.Index} {false}")); + hideMenu(false); + closeMenu(); + }, + otherText: VoteKickVoteAgainst); + } + else + { + ConfirmationDialogs.ButtonPrompt(modData, + title: KickTitle, + text: KickPrompt, + titleArguments: new object[] { "player", client.Name }, + onConfirm: () => + { + orderManager.IssueOrder(Order.Command($"kick {client.Index} {false}")); + hideMenu(false); + }, + confirmText: KickAccept, + onCancel: () => hideMenu(false)); + } + } + + var localClient = orderManager.LocalClient; + var localPlayer = localClient == null ? null : world.Players.FirstOrDefault(player => player.ClientIndex == localClient.Index); + bool LocalPlayerCanKick() => localClient != null + && (Game.IsHost || ((!orderManager.LocalClient.IsObserver) && localPlayer.WinState == WinState.Undefined)); + bool CanClientBeKicked(Session.Client client, Func isVoteKick) => + client.Index != localClient.Index && client.State != Session.ClientState.Disconnected + && (!client.IsAdmin || orderManager.LobbyInfo.GlobalSettings.Dedicated) + && (!isVoteKick() || UnitOrders.KickVoteTarget == null || UnitOrders.KickVoteTarget == client.Index); + + var revealedPlayersManager = player != null ? player.World.WorldActor.TraitOrDefault() : null; + + foreach (var t in teams) + { + if (teams.Count() > 1) + { + var teamHeader = ScrollItemWidget.Setup(teamTemplate, () => false, () => { }); + var team = t.Key > 0 + ? FluentProvider.GetMessage(TeamNumber, "team", t.Key) + : FluentProvider.GetMessage(NoTeam); + teamHeader.Get("TEAM").GetText = () => team; + var teamRating = teamHeader.Get("TEAM_SCORE"); + var scoreCache = new CachedTransform(s => s.ToString()); + var teamMemberScores = t.Select(tt => tt.PlayerStatistics).Where(s => s != null).ToArray().Select(s => s.Experience); + teamRating.GetText = () => scoreCache.Update(teamMemberScores.Sum()); + + playerPanel.AddChild(teamHeader); + } + + foreach (var p in t.ToList()) + { + var pp = p.Player; + var client = world.LobbyInfo.ClientWithIndex(pp.ClientIndex); + var item = playerTemplate.Clone(); + LobbyUtils.SetupProfileWidget(item, client, orderManager, worldRenderer); + + var nameLabel = item.Get("NAME"); + WidgetUtils.BindPlayerNameAndStatus(nameLabel, pp); + nameLabel.GetColor = () => pp.Color; + + // Begin custom CA section for revealing random factions + var isRevealed = revealedPlayersManager != null && revealedPlayersManager.IsRevealed(pp); + var factionAndLabel = item.Get("FACTIONFLAGANDLABEL"); + var realFactionVisible = player == null || player.RelationshipWith(pp) == PlayerRelationship.Ally || player.WinState != WinState.Undefined || isRevealed; + + var flag = factionAndLabel.Get("FACTIONFLAG"); + flag.GetImageCollection = () => "flags"; + + var tooltipTextSplit = SplitOnFirstToken(FluentProvider.GetMessage(pp.Faction.Description), "\n"); + var factionName = FluentProvider.GetMessage(pp.DisplayFaction.Name); + + if (realFactionVisible) + { + var resolvedFactionName = FluentProvider.GetMessage(pp.Faction.Name); + flag.GetImageName = () => pp.Faction.InternalName; + factionName = resolvedFactionName != factionName ? $"{factionName} ({resolvedFactionName})" : resolvedFactionName; + factionAndLabel.GetTooltipText = () => tooltipTextSplit.First; + factionAndLabel.GetTooltipDesc = () => tooltipTextSplit.Second; + } + else + { + flag.GetImageName = () => pp.DisplayFaction.InternalName; + factionAndLabel.GetTooltipText = () => factionName; + factionAndLabel.GetTooltipDesc = () => "Select a unit belonging to this player\\nto reveal their faction/sub-faction."; + } + + var factionLabel = item.Get("FACTION"); + factionLabel.GetText = () => factionName; + // End custom CA section for revealing random factions + + var scoreCache = new CachedTransform(s => s.ToString()); + item.Get("SCORE").GetText = () => scoreCache.Update(p.PlayerStatistics?.Experience ?? 0); + + var muteCheckbox = item.Get("MUTE"); + muteCheckbox.IsChecked = () => TextNotificationsManager.MutedPlayers[pp.ClientIndex]; + muteCheckbox.OnClick = () => TextNotificationsManager.MutedPlayers[pp.ClientIndex] ^= true; + muteCheckbox.IsVisible = () => !pp.IsBot && client.State != Session.ClientState.Disconnected && pp.ClientIndex != orderManager.LocalClient?.Index; + muteCheckbox.GetTooltipText = () => muteCheckbox.IsChecked() ? unmuteTooltip : muteTooltip; + + var kickButton = item.Get("KICK"); + bool IsVoteKick() => !Game.IsHost || pp.WinState == WinState.Undefined; + kickButton.IsVisible = () => !pp.IsBot && LocalPlayerCanKick() && CanClientBeKicked(client, IsVoteKick); + kickButton.OnClick = () => KickAction(client, IsVoteKick); + kickButton.GetTooltipText = () => IsVoteKick() ? voteKickTooltip : kickTooltip; + + playerPanel.AddChild(item); + } + } + + var spectators = orderManager.LobbyInfo.Clients.Where(c => c.IsObserver).ToList(); + if (spectators.Count > 0) + { + var spectatorHeader = ScrollItemWidget.Setup(teamTemplate, () => false, () => { }); + var spectatorTeam = FluentProvider.GetMessage(Spectators); + spectatorHeader.Get("TEAM").GetText = () => spectatorTeam; + + playerPanel.AddChild(spectatorHeader); + + foreach (var client in spectators) + { + var item = spectatorTemplate.Clone(); + LobbyUtils.SetupProfileWidget(item, client, orderManager, worldRenderer); + + var nameLabel = item.Get("NAME"); + var nameFont = Game.Renderer.Fonts[nameLabel.Font]; + + var suffixLength = new CachedTransform(s => nameFont.Measure(s).X); + var name = new CachedTransform<(string Name, string Suffix), string>(c => + WidgetUtils.TruncateText(c.Name, nameLabel.Bounds.Width - suffixLength.Update(c.Suffix), nameFont) + c.Suffix); + + nameLabel.GetText = () => + { + var suffix = client.State == Session.ClientState.Disconnected ? $" ({FluentProvider.GetMessage(Gone)})" : ""; + return name.Update((client.Name, suffix)); + }; + + var kickButton = item.Get("KICK"); + bool IsVoteKick() => !Game.IsHost; + kickButton.IsVisible = () => Game.IsHost && client.Index != orderManager.LocalClient?.Index && client.State != Session.ClientState.Disconnected; + kickButton.OnClick = () => KickAction(client, IsVoteKick); + kickButton.GetTooltipText = () => IsVoteKick() ? voteKickTooltip : kickTooltip; + + var muteCheckbox = item.Get("MUTE"); + muteCheckbox.IsChecked = () => TextNotificationsManager.MutedPlayers[client.Index]; + muteCheckbox.OnClick = () => TextNotificationsManager.MutedPlayers[client.Index] ^= true; + muteCheckbox.IsVisible = () => !client.IsBot && client.State != Session.ClientState.Disconnected && client.Index != orderManager.LocalClient?.Index; + muteCheckbox.GetTooltipText = () => muteCheckbox.IsChecked() ? unmuteTooltip : muteTooltip; + + playerPanel.AddChild(item); + } + } + } + + /// Splits a string into two parts on the first instance of a given token. + static (string First, string Second) SplitOnFirstToken(string input, string token = "\\n") + { + if (string.IsNullOrEmpty(input)) + return (null, null); + + var split = input.IndexOf(token, StringComparison.Ordinal); + var first = split > 0 ? input.Substring(0, split) : input; + var second = split > 0 ? input.Substring(split + token.Length) : null; + return (first, second); + } + } +} diff --git a/OpenRA.Mods.CA/Widgets/Logic/Ingame/IngameMenuLogicCA.cs b/OpenRA.Mods.CA/Widgets/Logic/Ingame/IngameMenuLogicCA.cs new file mode 100644 index 0000000000..e20303dca9 --- /dev/null +++ b/OpenRA.Mods.CA/Widgets/Logic/Ingame/IngameMenuLogicCA.cs @@ -0,0 +1,664 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Linq; +using OpenRA.Graphics; +using OpenRA.Mods.Common; +using OpenRA.Mods.Common.Scripting; +using OpenRA.Mods.Common.Traits; +using OpenRA.Mods.Common.Widgets; +using OpenRA.Mods.Common.Widgets.Logic; +using OpenRA.Widgets; + +namespace OpenRA.Mods.CA.Widgets.Logic +{ + public class IngameMenuLogicCA : ChromeLogic + { + [FluentReference] + const string Leave = "menu-ingame.leave"; + + [FluentReference] + const string AbortMission = "menu-ingame.abort"; + + [FluentReference] + const string LeaveMissionTitle = "dialog-leave-mission.title"; + + [FluentReference] + const string LeaveMissionPrompt = "dialog-leave-mission.prompt"; + + [FluentReference] + const string LeaveMissionAccept = "dialog-leave-mission.confirm"; + + [FluentReference] + const string LeaveMissionCancel = "dialog-leave-mission.cancel"; + + [FluentReference] + const string RestartButton = "menu-ingame.restart"; + + [FluentReference] + const string RestartMissionTitle = "dialog-restart-mission.title"; + + [FluentReference] + const string RestartMissionPrompt = "dialog-restart-mission.prompt"; + + [FluentReference] + const string RestartMissionAccept = "dialog-restart-mission.confirm"; + + [FluentReference] + const string RestartMissionCancel = "dialog-restart-mission.cancel"; + + [FluentReference] + const string SurrenderButton = "menu-ingame.surrender"; + + [FluentReference] + const string SurrenderTitle = "dialog-surrender.title"; + + [FluentReference] + const string SurrenderPrompt = "dialog-surrender.prompt"; + + [FluentReference] + const string SurrenderAccept = "dialog-surrender.confirm"; + + [FluentReference] + const string SurrenderCancel = "dialog-surrender.cancel"; + + [FluentReference] + const string LoadGameButton = "menu-ingame.load-game"; + + [FluentReference] + const string SaveGameButton = "menu-ingame.save-game"; + + [FluentReference] + const string MusicButton = "menu-ingame.music"; + + [FluentReference] + const string SettingsButton = "menu-ingame.settings"; + + [FluentReference] + const string EncyclopediaButton = "menu-ingame.encyclopedia"; + + [FluentReference] + const string ReturnToMap = "menu-ingame.return-to-map"; + + [FluentReference] + const string Resume = "menu-ingame.resume"; + + [FluentReference] + const string SaveMapButton = "menu-ingame.save-map"; + + [FluentReference] + const string ErrorMaxPlayerTitle = "dialog-error-max-player.title"; + + [FluentReference("players", "max")] + const string ErrorMaxPlayerPrompt = "dialog-error-max-player.prompt"; + + [FluentReference] + const string ErrorMaxPlayerAccept = "dialog-error-max-player.confirm"; + + [FluentReference] + const string ExitMapButton = "menu-ingame.exit-map"; + + [FluentReference] + const string ExitMapEditorTitle = "dialog-exit-map-editor.title"; + + [FluentReference] + const string ExitMapEditorPromptUnsaved = "dialog-exit-map-editor.prompt-unsaved"; + + [FluentReference] + const string ExitMapEditorPromptDeleted = "dialog-exit-map-editor.prompt-deleted"; + + [FluentReference] + const string ExitMapEditorAnywayConfirm = "dialog-exit-map-editor.confirm-anyway"; + + [FluentReference] + const string ExitMapEditorConfirm = "dialog-exit-map-editor.confirm"; + + [FluentReference] + const string PlayMapWarningTitle = "dialog-play-map-warning.title"; + + [FluentReference] + const string PlayMapWarningPrompt = "dialog-play-map-warning.prompt"; + + [FluentReference] + const string PlayMapWarningCancel = "dialog-play-map-warning.cancel"; + + [FluentReference] + const string ExitToMapEditorTitle = "dialog-exit-to-map-editor.title"; + + [FluentReference] + const string ExitToMapEditorPrompt = "dialog-exit-to-map-editor.prompt"; + + [FluentReference] + const string ExitToMapEditorConfirm = "dialog-exit-to-map-editor.confirm"; + + [FluentReference] + const string ExitToMapEditorCancel = "dialog-exit-to-map-editor.cancel"; + + readonly Widget menu; + readonly Widget buttonContainer; + readonly ButtonWidget buttonTemplate; + readonly int2 buttonStride; + readonly List buttons = new(); + + readonly ModData modData; + readonly Action onExit; + readonly World world; + readonly WorldRenderer worldRenderer; + readonly MenuPostProcessEffect mpe; + readonly bool isSinglePlayer; + readonly bool hasError; + bool leaving; + bool hideMenu; + + static bool lastGameEditor = false; + + [ObjectCreator.UseCtor] + public IngameMenuLogicCA(Widget widget, ModData modData, World world, Action onExit, WorldRenderer worldRenderer, + IngameInfoPanel initialPanel, Dictionary logicArgs) + { + this.modData = modData; + this.world = world; + this.worldRenderer = worldRenderer; + this.onExit = onExit; + + var buttonHandlers = new Dictionary + { + { "ABORT_MISSION", CreateAbortMissionButton }, + { "BACK_TO_EDITOR", CreateBackToEditorButton }, + { "RESTART", CreateRestartButton }, + { "SURRENDER", CreateSurrenderButton }, + { "LOAD_GAME", CreateLoadGameButton }, + { "SAVE_GAME", CreateSaveGameButton }, + { "MUSIC", CreateMusicButton }, + { "SETTINGS", CreateSettingsButton }, + { "RESUME", CreateResumeButton }, + { "SAVE_MAP", CreateSaveMapButton }, + { "PLAY_MAP", CreatePlayMapButton }, + { "EXIT_EDITOR", CreateExitEditorButton }, + { "ENCYCLOPEDIA", CreateEncyclopediaButton }, + }; + + isSinglePlayer = !world.LobbyInfo.GlobalSettings.Dedicated && world.LobbyInfo.NonBotClients.Count() == 1; + + menu = widget.Get("INGAME_MENU"); + mpe = world.WorldActor.TraitOrDefault(); + mpe?.Fade(mpe.Info.MenuEffect); + + buttonContainer = menu.Get("MENU_BUTTONS"); + buttonTemplate = buttonContainer.Get("BUTTON_TEMPLATE"); + buttonContainer.RemoveChild(buttonTemplate); + buttonContainer.IsVisible = () => !hideMenu; + + if (logicArgs.TryGetValue("ButtonStride", out var buttonStrideNode)) + buttonStride = FieldLoader.GetValue("ButtonStride", buttonStrideNode.Value); + + var scriptContext = world.WorldActor.TraitOrDefault(); + hasError = scriptContext != null && scriptContext.FatalErrorOccurred; + + if (logicArgs.TryGetValue("Buttons", out var buttonsNode)) + { + var buttonIds = FieldLoader.GetValue("Buttons", buttonsNode.Value); + foreach (var button in buttonIds) + if (buttonHandlers.TryGetValue(button, out var createHandler)) + createHandler(); + } + + // Recenter the button container + if (buttons.Count > 0) + { + var expand = (buttons.Count - 1) * buttonStride; + buttonContainer.Bounds.X -= expand.X / 2; + buttonContainer.Bounds.Y -= expand.Y / 2; + buttonContainer.Bounds.Width += expand.X; + buttonContainer.Bounds.Height += expand.Y; + } + + var panelRoot = widget.GetOrNull("PANEL_ROOT"); + if (panelRoot != null && world.Type != WorldType.Editor) + { + Action requestHideMenu = h => hideMenu = h; + var gameInfoPanel = Game.LoadWidget(world, "GAME_INFO_PANEL", panelRoot, new WidgetArgs() + { + { "initialPanel", initialPanel }, + { "hideMenu", requestHideMenu }, + { "closeMenu", CloseMenu }, + }); + + gameInfoPanel.IsVisible = () => !hideMenu; + } + } + + public static void OnQuit(World world) + { + // TODO: Create a mechanism to do things like this cleaner. Also needed for scripted missions + if (world.Type == WorldType.Regular) + { + var moi = world.Map.Rules.Actors[SystemActors.Player].TraitInfoOrDefault(); + if (moi != null) + { + var faction = world.LocalPlayer?.Faction.InternalName; + Game.Sound.PlayNotification(world.Map.Rules, null, "Speech", moi.LeaveNotification, faction); + TextNotificationsManager.AddTransientLine(null, moi.LeaveTextNotification); + } + } + + var iop = world.WorldActor.TraitsImplementing().FirstOrDefault(); + var exitDelay = iop?.ExitDelay ?? 0; + var mpe = world.WorldActor.TraitOrDefault(); + + // HACK: Opening up skirmish menu can mess up the OrderManager. + if (!Game.IsCurrentWorld(world)) + { + Game.Disconnect(); + Ui.ResetAll(); + Game.LoadShellMap(); + return; + } + + if (mpe != null) + { + Game.RunAfterDelay(exitDelay, () => + { + if (Game.IsCurrentWorld(world)) + mpe.Fade(MenuPostProcessEffect.EffectType.Black); + }); + exitDelay += 40 * mpe.Info.FadeLength; + } + + lastGameEditor = false; + Game.RunAfterDelay(exitDelay, () => + { + if (!Game.IsCurrentWorld(world)) + return; + + Game.Disconnect(); + Ui.ResetAll(); + Game.LoadShellMap(); + }); + } + + void ShowMenu() + { + hideMenu = false; + } + + void CloseMenu() + { + Ui.CloseWindow(); + mpe?.Fade(MenuPostProcessEffect.EffectType.None); + onExit(); + Ui.ResetTooltips(); + } + + ButtonWidget AddButton(string id, string label) + { + var button = buttonTemplate.Clone() as ButtonWidget; + var lastButton = buttons.LastOrDefault(); + if (lastButton != null) + { + button.Bounds.X = lastButton.Bounds.X + buttonStride.X; + button.Bounds.Y = lastButton.Bounds.Y + buttonStride.Y; + } + + button.Id = id; + button.IsDisabled = () => leaving; + var text = FluentProvider.GetMessage(label); + button.GetText = () => text; + buttonContainer.AddChild(button); + buttons.Add(button); + + return button; + } + + void CreateAbortMissionButton() + { + if (world.Type != WorldType.Regular) + return; + + var button = AddButton("ABORT_MISSION", world.IsGameOver + ? FluentProvider.GetMessage(Leave) + : FluentProvider.GetMessage(AbortMission)); + + button.OnClick = () => + { + hideMenu = true; + + ConfirmationDialogs.ButtonPrompt(modData, + title: LeaveMissionTitle, + text: LeaveMissionPrompt, + onConfirm: () => { OnQuit(world); leaving = true; }, + confirmText: LeaveMissionAccept, + onCancel: ShowMenu, + cancelText: LeaveMissionCancel); + }; + } + + void CreateRestartButton() + { + if (world.Type != WorldType.Regular || !isSinglePlayer) + return; + + var iop = world.WorldActor.TraitsImplementing().FirstOrDefault(); + var exitDelay = iop?.ExitDelay ?? 0; + + void OnRestart() + { + Ui.CloseWindow(); + if (mpe != null) + { + if (Game.IsCurrentWorld(world)) + mpe.Fade(MenuPostProcessEffect.EffectType.Black); + exitDelay += 40 * mpe.Info.FadeLength; + } + + Game.RunAfterDelay(exitDelay, Game.RestartGame); + } + + var button = AddButton("RESTART", RestartButton); + button.IsDisabled = () => leaving; + button.OnClick = () => + { + hideMenu = true; + ConfirmationDialogs.ButtonPrompt(modData, + title: RestartMissionTitle, + text: RestartMissionPrompt, + onConfirm: OnRestart, + confirmText: RestartMissionAccept, + onCancel: ShowMenu, + cancelText: RestartMissionCancel); + }; + } + + void CreateSurrenderButton() + { + if (world.Type != WorldType.Regular || isSinglePlayer || world.LocalPlayer == null) + return; + + void OnSurrender() + { + world.IssueOrder(new Order("Surrender", world.LocalPlayer.PlayerActor, false)); + CloseMenu(); + } + + var button = AddButton("SURRENDER", SurrenderButton); + button.IsDisabled = () => world.LocalPlayer.WinState != WinState.Undefined || hasError || leaving; + button.OnClick = () => + { + hideMenu = true; + ConfirmationDialogs.ButtonPrompt(modData, + title: SurrenderTitle, + text: SurrenderPrompt, + onConfirm: OnSurrender, + confirmText: SurrenderAccept, + onCancel: ShowMenu, + cancelText: SurrenderCancel); + }; + } + + void CreateLoadGameButton() + { + if (world.Type != WorldType.Regular || !world.LobbyInfo.GlobalSettings.GameSavesEnabled || world.IsReplay) + return; + + var button = AddButton("LOAD_GAME", LoadGameButton); + button.IsDisabled = () => leaving || !GameSaveBrowserLogic.IsLoadPanelEnabled(modData.Manifest); + button.OnClick = () => + { + hideMenu = true; + Ui.OpenWindow("GAMESAVE_BROWSER_PANEL", new WidgetArgs + { + { "onExit", () => hideMenu = false }, + { "onStart", CloseMenu }, + { "isSavePanel", false }, + { "world", null } + }); + }; + } + + void CreateSaveGameButton() + { + if (world.Type != WorldType.Regular || !world.LobbyInfo.GlobalSettings.GameSavesEnabled || world.IsReplay) + return; + + var button = AddButton("SAVE_GAME", SaveGameButton); + button.IsDisabled = () => hasError || leaving || !world.Players.Any(p => p.Playable && p.WinState == WinState.Undefined); + button.OnClick = () => + { + hideMenu = true; + Ui.OpenWindow("GAMESAVE_BROWSER_PANEL", new WidgetArgs + { + { "onExit", () => hideMenu = false }, + { "onStart", () => { } }, + { "isSavePanel", true }, + { "world", world } + }); + }; + } + + void CreateMusicButton() + { + var button = AddButton("MUSIC", MusicButton); + button.OnClick = () => + { + hideMenu = true; + Ui.OpenWindow("MUSIC_PANEL", new WidgetArgs() + { + { "onExit", () => hideMenu = false }, + { "world", world } + }); + }; + } + + void CreateSettingsButton() + { + var button = AddButton("SETTINGS", SettingsButton); + button.OnClick = () => + { + hideMenu = true; + Ui.OpenWindow("SETTINGS_PANEL", new WidgetArgs() + { + { "world", world }, + { "worldRenderer", worldRenderer }, + { "onExit", () => hideMenu = false }, + }); + }; + } + + void CreateEncyclopediaButton() + { + if (world.Type != WorldType.Regular) + return; + + var button = AddButton("ENCYCLOPEDIA", EncyclopediaButton); + button.OnClick = () => + { + hideMenu = true; + Ui.OpenWindow("ENCYCLOPEDIA_PANEL", new WidgetArgs() + { + { "world", world }, + { "worldRenderer", worldRenderer }, + { "onExit", () => hideMenu = false }, + }); + }; + } + + void CreateResumeButton() + { + var button = AddButton("RESUME", world.IsGameOver ? ReturnToMap : Resume); + button.Key = modData.Hotkeys["escape"]; + button.OnClick = CloseMenu; + } + + void CreateSaveMapButton() + { + if (world.Type != WorldType.Editor) + return; + + var button = AddButton("SAVE_MAP", SaveMapButton); + button.OnClick = () => + { + hideMenu = true; + var editorActorLayer = world.WorldActor.Trait(); + var actionManager = world.WorldActor.Trait(); + + var playerDefinitions = editorActorLayer.Players.ToMiniYaml(); + + var playerCount = new MapPlayers(playerDefinitions).Players.Count; + if (playerCount > MapPlayers.MaximumPlayerCount) + { + ConfirmationDialogs.ButtonPrompt(modData, + title: ErrorMaxPlayerTitle, + text: ErrorMaxPlayerPrompt, + textArguments: new object[] { "players", playerCount, "max", MapPlayers.MaximumPlayerCount }, + onConfirm: ShowMenu, + confirmText: ErrorMaxPlayerAccept); + + return; + } + + Ui.OpenWindow("SAVE_MAP_PANEL", new WidgetArgs() + { + { "onSave", (Action)(_ => { ShowMenu(); actionManager.Modified = false; }) }, + { "onExit", CloseMenu }, + { "map", world.Map }, + { "world", world }, + { "playerDefinitions", playerDefinitions }, + { "actorDefinitions", editorActorLayer.Save() } + }); + }; + } + + void CreatePlayMapButton() + { + if (world.Type != WorldType.Editor) + return; + + var actionManager = world.WorldActor.Trait(); + AddButton("PLAY_MAP", "Play Map") + .OnClick = () => + { + hideMenu = true; + var uid = modData.MapCache.GetUpdatedMap(world.Map.Uid); + var map = uid == null ? null : modData.MapCache[uid]; + if (map == null || (map.Visibility != MapVisibility.Lobby && map.Visibility != MapVisibility.MissionSelector)) + { + ConfirmationDialogs.ButtonPrompt(modData, + title: PlayMapWarningTitle, + text: PlayMapWarningPrompt, + onCancel: ShowMenu, + cancelText: PlayMapWarningCancel); + + return; + } + + ExitEditor(actionManager, () => + { + lastGameEditor = true; + + Ui.CloseWindow(); + Ui.ResetTooltips(); + void CloseMenu() + { + mpe?.Fade(MenuPostProcessEffect.EffectType.None); + onExit(); + } + + if (map.Visibility == MapVisibility.Lobby) + { + // HACK: Server lobby should be usable without a server. + ConnectionLogic.Connect(Game.CreateLocalServer(uid), + "", + () => Game.OpenWindow("SERVER_LOBBY", new WidgetArgs + { + { "onExit", CloseMenu }, + { "onStart", () => { } }, + { "skirmishMode", true } + }), + () => Game.CloseServer()); + } + else if (map.Visibility == MapVisibility.MissionSelector) + { + Game.OpenWindow("MISSIONBROWSER_PANEL", new WidgetArgs + { + { "onExit", CloseMenu }, + { "onStart", () => { } }, + { "initialMap", uid } + }); + } + }); + }; + } + + void CreateBackToEditorButton() + { + if (world.Type != WorldType.Regular || !lastGameEditor) + return; + + AddButton("BACK_TO_EDITOR", "Back To Editor") + .OnClick = () => + { + hideMenu = true; + void OnConfirm() + { + lastGameEditor = false; + var map = modData.MapCache.GetUpdatedMap(world.Map.Uid); + if (map == null) + Game.LoadShellMap(); + else + { + DiscordService.UpdateStatus(DiscordState.InMapEditor); + Game.LoadEditor(map); + } + } + + ConfirmationDialogs.ButtonPrompt(modData, + title: ExitToMapEditorTitle, + text: ExitToMapEditorPrompt, + onConfirm: OnConfirm, + confirmText: ExitToMapEditorConfirm, + onCancel: ShowMenu, + cancelText: ExitToMapEditorCancel); + }; + } + + void CreateExitEditorButton() + { + if (world.Type != WorldType.Editor) + return; + + var actionManager = world.WorldActor.Trait(); + AddButton("EXIT_EDITOR", ExitMapButton) + .OnClick = () => ExitEditor(actionManager, () => OnQuit(world)); + } + + void ExitEditor(EditorActionManager actionManager, Action onSuccess) + { + var map = modData.MapCache.GetUpdatedMap(world.Map.Uid); + var deletedOrUnavailable = map == null || modData.MapCache[map].Status != MapStatus.Available; + if (actionManager.HasUnsavedItems() || deletedOrUnavailable) + { + hideMenu = true; + ConfirmationDialogs.ButtonPrompt(modData, + title: ExitMapEditorTitle, + text: deletedOrUnavailable ? ExitMapEditorPromptDeleted : ExitMapEditorPromptUnsaved, + onConfirm: () => { onSuccess(); leaving = true; }, + confirmText: deletedOrUnavailable ? ExitMapEditorAnywayConfirm : ExitMapEditorConfirm, + onCancel: ShowMenu); + } + else + { + onSuccess(); + leaving = true; + } + } + } +} diff --git a/OpenRA.Mods.CA/Widgets/Logic/Ingame/NodCovenantIndicatorLogic.cs b/OpenRA.Mods.CA/Widgets/Logic/Ingame/NodCovenantIndicatorLogic.cs new file mode 100644 index 0000000000..9a621050ce --- /dev/null +++ b/OpenRA.Mods.CA/Widgets/Logic/Ingame/NodCovenantIndicatorLogic.cs @@ -0,0 +1,85 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Linq; +using OpenRA.Mods.CA.Traits; +using OpenRA.Mods.Common.Widgets; +using OpenRA.Primitives; +using OpenRA.Widgets; + +namespace OpenRA.Mods.CA.Widgets.Logic +{ + class NodCovenantIndicatorLogic : ChromeLogic + { + [FluentReference("level")] + const string CovenantLevel = "label-covenant-level"; + const string CovenantDescription = "label-covenant-description"; + + const string CountType = "NodCovenant"; + const string DisabledImage = "disabled"; + + readonly ProvidesPrerequisitesOnCount counter; + + private string levelImageName; + + [ObjectCreator.UseCtor] + public NodCovenantIndicatorLogic(Widget widget, World world) + { + var container = widget.Get("NOD_COVENANT"); + var levelImage = container.Get("NOD_COVENANT_LEVEL"); + + if (world.LocalPlayer.Faction.Side != "Nod") + { + levelImage.GetImageName = () => DisabledImage; + levelImage.IsVisible = () => false; + return; + } + + counter = world.LocalPlayer.PlayerActor.TraitsImplementing() + .FirstOrDefault(c => c.Info.Type == CountType); + + if (counter == null) + { + levelImage.GetImageName = () => DisabledImage; + levelImage.IsVisible = () => true; + return; + } + + UpdateLevelImageName(); + + counter.Incremented += HandleIncremented; + + levelImage.GetImageName = () => levelImageName; + levelImage.IsVisible = () => true; + + var tooltipTextCached = new CachedTransform((CurrentCount) => + { + var tooltip = FluentProvider.GetMessage(CovenantLevel, "level", CurrentCount); + tooltip += "\n\n"; + tooltip += FluentProvider.GetMessage(CovenantDescription); + return tooltip; + }); + + levelImage.GetTooltipText = () => tooltipTextCached.Update(Math.Min(counter.CurrentCount, 3)); + } + + private void HandleIncremented() + { + UpdateLevelImageName(); + } + + private void UpdateLevelImageName() + { + var count = Math.Min(counter.CurrentCount, 3); + levelImageName = $"level{count}"; + } + } +} diff --git a/OpenRA.Mods.CA/Widgets/Logic/Ingame/ObserverStatsLogicCA.cs b/OpenRA.Mods.CA/Widgets/Logic/Ingame/ObserverStatsLogicCA.cs new file mode 100644 index 0000000000..62e29f0c34 --- /dev/null +++ b/OpenRA.Mods.CA/Widgets/Logic/Ingame/ObserverStatsLogicCA.cs @@ -0,0 +1,739 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using OpenRA.Graphics; +using OpenRA.Mods.CA.Traits; +using OpenRA.Mods.Common.Lint; +using OpenRA.Mods.Common.Traits; +using OpenRA.Mods.Common.Widgets; +using OpenRA.Network; +using OpenRA.Primitives; +using OpenRA.Widgets; + +namespace OpenRA.Mods.CA.Widgets.Logic +{ + public enum ObserverStatsPanel { None, Basic, Economy, Production, SupportPowers, Combat, Army, Upgrades, BuildOrder, UnitsProduced, Graph, ArmyGraph, TeamArmyGraph } + + [ChromeLogicArgsHotkeys("StatisticsBasicKey", + "StatisticsEconomyKey", + "StatisticsProductionKey", + "StatisticsSupportPowersKey", + "StatisticsCombatKey", + "StatisticsArmyKey", + "StatisticsGraphKey", + "StatisticsArmyGraphKey")] + public class ObserverStatsLogicCA : ChromeLogic + { + [FluentReference] + const string InformationNone = "options-observer-stats.none"; + + [FluentReference] + const string Basic = "options-observer-stats.basic"; + + [FluentReference] + const string Economy = "options-observer-stats.economy"; + + [FluentReference] + const string Production = "options-observer-stats.production"; + + [FluentReference] + const string SupportPowers = "options-observer-stats.support-powers"; + + [FluentReference] + const string Combat = "options-observer-stats.combat"; + + [FluentReference] + const string Army = "options-observer-stats.army"; + + [FluentReference] + const string Upgrades = "options-observer-stats.upgrades"; + + [FluentReference] + const string BuildOrder = "options-observer-stats.build-order"; + + [FluentReference] + const string UnitsProduced = "options-observer-stats.units-produced"; + + [FluentReference] + const string EarningsGraph = "options-observer-stats.earnings-graph"; + + [FluentReference] + const string ArmyGraph = "options-observer-stats.army-graph"; + + [FluentReference] + const string TeamArmyGraph = "options-observer-stats.team-army-graph"; + + [FluentReference("team")] + const string TeamNumber = "label-team-name"; + + [FluentReference] + const string NoTeam = "label-no-team"; + + readonly ContainerWidget basicStatsHeaders; + readonly ContainerWidget economyStatsHeaders; + readonly ContainerWidget productionStatsHeaders; + readonly ContainerWidget supportPowerStatsHeaders; + readonly ContainerWidget combatStatsHeaders; + readonly ContainerWidget armyHeaders; + readonly ContainerWidget upgradesHeaders; + readonly ContainerWidget buildOrderHeaders; + readonly ContainerWidget unitsProducedHeaders; + readonly ScrollPanelWidget playerStatsPanel; + readonly ScrollItemWidget basicPlayerTemplate; + readonly ScrollItemWidget economyPlayerTemplate; + readonly ScrollItemWidget productionPlayerTemplate; + readonly ScrollItemWidget supportPowersPlayerTemplate; + readonly ScrollItemWidget armyPlayerTemplate; + readonly ScrollItemWidget upgradesPlayerTemplate; + readonly ScrollItemWidget buildOrderPlayerTemplate; + readonly ScrollItemWidget unitsProducedPlayerTemplate; + readonly ScrollItemWidget combatPlayerTemplate; + readonly ContainerWidget incomeGraphContainer; + readonly ContainerWidget armyValueGraphContainer; + readonly ContainerWidget teamArmyValueGraphContainer; + readonly ScrollableLineGraphWidget incomeGraph; + readonly ScrollableLineGraphWidget armyValueGraph; + readonly ScrollableLineGraphWidget teamArmyValueGraph; + readonly ScrollItemWidget teamTemplate; + readonly Player[] players; + readonly IGrouping[] teams; + readonly bool hasTeams; + readonly World world; + readonly WorldRenderer worldRenderer; + + readonly string clickSound = ChromeMetrics.Get("ClickSound"); + ObserverStatsPanel activePanel; + + [ObjectCreator.UseCtor] + public ObserverStatsLogicCA(World world, ModData modData, WorldRenderer worldRenderer, Widget widget, Dictionary logicArgs) + { + this.world = world; + this.worldRenderer = worldRenderer; + + MiniYaml yaml; + var keyNames = Enum.GetNames(typeof(ObserverStatsPanel)); + var statsHotkeys = new HotkeyReference[keyNames.Length]; + for (var i = 0; i < keyNames.Length; i++) + statsHotkeys[i] = logicArgs.TryGetValue("Statistics" + keyNames[i] + "Key", out yaml) ? modData.Hotkeys[yaml.Value] : new HotkeyReference(); + + players = world.Players.Where(p => !p.NonCombatant && p.Playable).ToArray(); + teams = players + .GroupBy(p => (world.LobbyInfo.ClientWithIndex(p.ClientIndex) ?? new Session.Client()).Team) + .OrderBy(g => g.Key) + .ToArray(); + hasTeams = !(teams.Length == 1 && teams[0].Key == 0); + + basicStatsHeaders = widget.Get("BASIC_STATS_HEADERS"); + economyStatsHeaders = widget.Get("ECONOMY_STATS_HEADERS"); + productionStatsHeaders = widget.Get("PRODUCTION_STATS_HEADERS"); + supportPowerStatsHeaders = widget.Get("SUPPORT_POWERS_HEADERS"); + armyHeaders = widget.Get("ARMY_HEADERS"); + upgradesHeaders = widget.Get("UPGRADES_HEADERS"); + buildOrderHeaders = widget.Get("BUILD_ORDER_HEADERS"); + unitsProducedHeaders = widget.Get("UNITS_PRODUCED_HEADERS"); + combatStatsHeaders = widget.Get("COMBAT_STATS_HEADERS"); + + playerStatsPanel = widget.Get("PLAYER_STATS_PANEL"); + playerStatsPanel.Layout = new GridLayout(playerStatsPanel); + playerStatsPanel.IgnoreMouseOver = true; + + if (ShowScrollBar) + { + playerStatsPanel.ScrollBar = ScrollBar.Left; + + AdjustHeader(basicStatsHeaders); + AdjustHeader(economyStatsHeaders); + AdjustHeader(productionStatsHeaders); + AdjustHeader(supportPowerStatsHeaders); + AdjustHeader(combatStatsHeaders); + AdjustHeader(armyHeaders); + AdjustHeader(upgradesHeaders); + AdjustHeader(buildOrderHeaders); + } + + basicPlayerTemplate = playerStatsPanel.Get("BASIC_PLAYER_TEMPLATE"); + economyPlayerTemplate = playerStatsPanel.Get("ECONOMY_PLAYER_TEMPLATE"); + productionPlayerTemplate = playerStatsPanel.Get("PRODUCTION_PLAYER_TEMPLATE"); + supportPowersPlayerTemplate = playerStatsPanel.Get("SUPPORT_POWERS_PLAYER_TEMPLATE"); + armyPlayerTemplate = playerStatsPanel.Get("ARMY_PLAYER_TEMPLATE"); + upgradesPlayerTemplate = playerStatsPanel.Get("UPGRADES_PLAYER_TEMPLATE"); + buildOrderPlayerTemplate = playerStatsPanel.Get("BUILD_ORDER_PLAYER_TEMPLATE"); + unitsProducedPlayerTemplate = playerStatsPanel.Get("UNITS_PRODUCED_PLAYER_TEMPLATE"); + + combatPlayerTemplate = playerStatsPanel.Get("COMBAT_PLAYER_TEMPLATE"); + + incomeGraphContainer = widget.Get("INCOME_GRAPH_CONTAINER"); + incomeGraph = incomeGraphContainer.Get("INCOME_GRAPH"); + + armyValueGraphContainer = widget.Get("ARMY_VALUE_GRAPH_CONTAINER"); + armyValueGraph = armyValueGraphContainer.Get("ARMY_VALUE_GRAPH"); + + teamArmyValueGraphContainer = widget.Get("TEAM_ARMY_VALUE_GRAPH_CONTAINER"); + teamArmyValueGraph = teamArmyValueGraphContainer.Get("TEAM_ARMY_VALUE_GRAPH"); + + teamTemplate = playerStatsPanel.Get("TEAM_TEMPLATE"); + + var statsDropDown = widget.Get("STATS_DROPDOWN"); + StatsDropDownOption CreateStatsOption(string title, ObserverStatsPanel panel, ScrollItemWidget template, Action a) + { + title = FluentProvider.GetMessage(title); + return new StatsDropDownOption + { + Title = FluentProvider.GetMessage(title), + IsSelected = () => activePanel == panel, + OnClick = () => + { + ClearStats(); + playerStatsPanel.Visible = true; + statsDropDown.GetText = () => title; + activePanel = panel; + if (template != null) + AdjustStatisticsPanel(template); + + a(); + Ui.ResetTooltips(); + } + }; + } + + var statsDropDownOptions = new StatsDropDownOption[] + { + new() + { + Title = FluentProvider.GetMessage(InformationNone), + IsSelected = () => activePanel == ObserverStatsPanel.None, + OnClick = () => + { + var informationNone = FluentProvider.GetMessage(InformationNone); + statsDropDown.GetText = () => informationNone; + playerStatsPanel.Visible = false; + ClearStats(); + activePanel = ObserverStatsPanel.None; + } + }, + CreateStatsOption(Basic, ObserverStatsPanel.Basic, basicPlayerTemplate, () => DisplayStats(BasicStats)), + CreateStatsOption(Economy, ObserverStatsPanel.Economy, economyPlayerTemplate, () => DisplayStats(EconomyStats)), + CreateStatsOption(Production, ObserverStatsPanel.Production, productionPlayerTemplate, () => DisplayStats(ProductionStats)), + CreateStatsOption(SupportPowers, ObserverStatsPanel.SupportPowers, supportPowersPlayerTemplate, () => DisplayStats(SupportPowerStats)), + CreateStatsOption(Combat, ObserverStatsPanel.Combat, combatPlayerTemplate, () => DisplayStats(CombatStats)), + CreateStatsOption(Army, ObserverStatsPanel.Army, armyPlayerTemplate, () => DisplayStats(ArmyStats)), + CreateStatsOption(Upgrades, ObserverStatsPanel.Upgrades, upgradesPlayerTemplate, () => DisplayStats(UpgradeStats)), + CreateStatsOption(BuildOrder, ObserverStatsPanel.BuildOrder, buildOrderPlayerTemplate, () => DisplayStats(BuildOrderStats)), + CreateStatsOption(UnitsProduced, ObserverStatsPanel.UnitsProduced, unitsProducedPlayerTemplate, () => DisplayStats(UnitsProducedStats)), + CreateStatsOption(EarningsGraph, ObserverStatsPanel.Graph, null, () => IncomeGraph()), + CreateStatsOption(ArmyGraph, ObserverStatsPanel.ArmyGraph, null, () => ArmyValueGraph()), + CreateStatsOption(TeamArmyGraph, ObserverStatsPanel.TeamArmyGraph, null, () => TeamArmyValueGraph()) + }; + + ScrollItemWidget SetupItem(StatsDropDownOption option, ScrollItemWidget template) + { + var item = ScrollItemWidget.Setup(template, option.IsSelected, option.OnClick); + item.Get("LABEL").GetText = () => option.Title; + return item; + } + + var statsDropDownPanelTemplate = logicArgs.TryGetValue("StatsDropDownPanelTemplate", out yaml) ? yaml.Value : "LABEL_DROPDOWN_TEMPLATE"; + + statsDropDown.OnMouseDown = _ => statsDropDown.ShowDropDown(statsDropDownPanelTemplate, 230, statsDropDownOptions, SetupItem); + statsDropDownOptions[0].OnClick(); + + var keyListener = statsDropDown.Get("STATS_DROPDOWN_KEYHANDLER"); + keyListener.AddHandler(e => + { + if (e.Event == KeyInputEvent.Down && !e.IsRepeat) + { + for (var i = 0; i < statsHotkeys.Length; i++) + { + if (statsHotkeys[i].IsActivatedBy(e)) + { + Game.Sound.PlayNotification(modData.DefaultRules, null, "Sounds", clickSound, null); + statsDropDownOptions[i].OnClick(); + return true; + } + } + } + + return false; + }); + + if (logicArgs.TryGetValue("ClickSound", out yaml)) + clickSound = yaml.Value; + } + + void ClearStats() + { + playerStatsPanel.Children.Clear(); + basicStatsHeaders.Visible = false; + economyStatsHeaders.Visible = false; + productionStatsHeaders.Visible = false; + supportPowerStatsHeaders.Visible = false; + armyHeaders.Visible = false; + upgradesHeaders.Visible = false; + buildOrderHeaders.Visible = false; + unitsProducedHeaders.Visible = false; + combatStatsHeaders.Visible = false; + + incomeGraphContainer.Visible = false; + armyValueGraphContainer.Visible = false; + teamArmyValueGraphContainer.Visible = false; + + incomeGraph.GetSeries = null; + armyValueGraph.GetSeries = null; + teamArmyValueGraph.GetSeries = null; + } + + void IncomeGraph() + { + playerStatsPanel.Visible = false; + incomeGraphContainer.Visible = true; + + incomeGraph.GetSeries = () => + players.Select(p => new ScrollableLineGraphSeries( + p.ResolvedPlayerName, + p.Color, + (p.PlayerActor.TraitOrDefault() ?? new PlayerStatistics(p.PlayerActor)).IncomeSamples.Select(s => (float)s))); + } + + void ArmyValueGraph() + { + playerStatsPanel.Visible = false; + armyValueGraphContainer.Visible = true; + + armyValueGraph.GetSeries = () => + players.Select(p => new ScrollableLineGraphSeries( + p.ResolvedPlayerName, + p.Color, + (p.PlayerActor.TraitOrDefault() ?? new PlayerStatistics(p.PlayerActor)).ArmySamples.Select(s => (float)s))); + } + + void TeamArmyValueGraph() + { + playerStatsPanel.Visible = false; + teamArmyValueGraphContainer.Visible = true; + + teamArmyValueGraph.GetSeries = () => + teams.Select(t => new ScrollableLineGraphSeries( + t.Key > 0 ? FluentProvider.GetMessage(TeamNumber, "team", $"{t.Key} ({t.First().ResolvedPlayerName})") : FluentProvider.GetMessage(NoTeam), + t.First().Color, + t.Select(p => (p.PlayerActor.TraitOrDefault() ?? new PlayerStatistics(p.PlayerActor)).ArmySamples.Select(s => (float)s)).Aggregate((a, b) => a.Zip(b, (x, y) => x + y)))); + } + + void DisplayStats(Func createItem) + { + foreach (var team in teams) + { + if (hasTeams) + { + var tt = ScrollItemWidget.Setup(teamTemplate, () => false, () => { }); + tt.IgnoreMouseOver = true; + + var teamLabel = tt.Get("TEAM"); + var teamText = team.Key > 0 ? FluentProvider.GetMessage(TeamNumber, "team", team.Key) + : FluentProvider.GetMessage(NoTeam); + teamLabel.GetText = () => teamText; + tt.Bounds.Width = teamLabel.Bounds.Width = Game.Renderer.Fonts[tt.Font].Measure(teamText).X; + + var colorBlockWidget = tt.Get("TEAM_COLOR"); + var scrollBarOffset = playerStatsPanel.ScrollBar != ScrollBar.Hidden + ? playerStatsPanel.ScrollbarWidth + : 0; + var boundsWidth = tt.Parent.Bounds.Width - scrollBarOffset; + colorBlockWidget.Bounds.Width = boundsWidth - 200; + + var gradient = tt.Get("TEAM_GRADIENT"); + gradient.Bounds.X = boundsWidth - 200; + + playerStatsPanel.AddChild(tt); + } + + foreach (var p in team) + { + var player = p; + playerStatsPanel.AddChild(createItem(player)); + } + } + } + + ScrollItemWidget CombatStats(Player player) + { + combatStatsHeaders.Visible = true; + var template = SetupPlayerScrollItemWidget(combatPlayerTemplate, player); + + AddPlayerFlagAndName(template, player); + + var playerName = template.Get("PLAYER"); + playerName.GetColor = () => Color.White; + + var playerColor = template.Get("PLAYER_COLOR"); + var playerGradient = template.Get("PLAYER_GRADIENT"); + + SetupPlayerColor(player, template, playerColor, playerGradient); + + var stats = player.PlayerActor.TraitOrDefault(); + if (stats == null) + return template; + + var destroyedText = new CachedTransform(i => "$" + i.ToString(NumberFormatInfo.CurrentInfo)); + template.Get("ASSETS_DESTROYED").GetText = () => destroyedText.Update(stats.KillsCost); + + var lostText = new CachedTransform(i => "$" + i.ToString(NumberFormatInfo.CurrentInfo)); + template.Get("ASSETS_LOST").GetText = () => lostText.Update(stats.DeathsCost); + + var unitsKilledText = new CachedTransform(i => i.ToString(NumberFormatInfo.CurrentInfo)); + template.Get("UNITS_KILLED").GetText = () => unitsKilledText.Update(stats.UnitsKilled); + + var unitsDeadText = new CachedTransform(i => i.ToString(NumberFormatInfo.CurrentInfo)); + template.Get("UNITS_DEAD").GetText = () => unitsDeadText.Update(stats.UnitsDead); + + var buildingsKilledText = new CachedTransform(i => i.ToString(NumberFormatInfo.CurrentInfo)); + template.Get("BUILDINGS_KILLED").GetText = () => buildingsKilledText.Update(stats.BuildingsKilled); + + var buildingsDeadText = new CachedTransform(i => i.ToString(NumberFormatInfo.CurrentInfo)); + template.Get("BUILDINGS_DEAD").GetText = () => buildingsDeadText.Update(stats.BuildingsDead); + + var armyText = new CachedTransform(i => "$" + i.ToString(NumberFormatInfo.CurrentInfo)); + template.Get("ARMY_VALUE").GetText = () => armyText.Update(stats.ArmyValue); + + var visionText = new CachedTransform(i => Vision(i)); + template.Get("VISION").GetText = () => player.Shroud.Disabled ? "100%" : visionText.Update(player.Shroud.RevealedCells); + + return template; + } + + ScrollItemWidget ProductionStats(Player player) + { + productionStatsHeaders.Visible = true; + var template = SetupPlayerScrollItemWidget(productionPlayerTemplate, player); + + AddPlayerFlagAndName(template, player); + + var playerName = template.Get("PLAYER"); + playerName.GetColor = () => Color.White; + + var playerColor = template.Get("PLAYER_COLOR"); + var playerGradient = template.Get("PLAYER_GRADIENT"); + + SetupPlayerColor(player, template, playerColor, playerGradient); + + template.Get("PRODUCTION_ICONS").GetPlayer = () => player; + template.IgnoreChildMouseOver = false; + + return template; + } + + ScrollItemWidget SupportPowerStats(Player player) + { + supportPowerStatsHeaders.Visible = true; + var template = SetupPlayerScrollItemWidget(supportPowersPlayerTemplate, player); + + AddPlayerFlagAndName(template, player); + + var playerName = template.Get("PLAYER"); + playerName.GetColor = () => Color.White; + + var playerColor = template.Get("PLAYER_COLOR"); + var playerGradient = template.Get("PLAYER_GRADIENT"); + + SetupPlayerColor(player, template, playerColor, playerGradient); + + template.Get("SUPPORT_POWER_ICONS").GetPlayer = () => player; + template.IgnoreChildMouseOver = false; + + return template; + } + + ScrollItemWidget ArmyStats(Player player) + { + armyHeaders.Visible = true; + var template = SetupPlayerScrollItemWidget(armyPlayerTemplate, player); + + AddPlayerFlagAndName(template, player); + + var playerName = template.Get("PLAYER"); + playerName.GetColor = () => Color.White; + + var playerColor = template.Get("PLAYER_COLOR"); + var playerGradient = template.Get("PLAYER_GRADIENT"); + + SetupPlayerColor(player, template, playerColor, playerGradient); + + template.Get("ARMY_ICONS").GetPlayer = () => player; + template.IgnoreChildMouseOver = false; + + return template; + } + + ScrollItemWidget UpgradeStats(Player player) + { + upgradesHeaders.Visible = true; + var template = SetupPlayerScrollItemWidget(upgradesPlayerTemplate, player); + + AddPlayerFlagAndName(template, player); + + var playerName = template.Get("PLAYER"); + playerName.GetColor = () => Color.White; + + var playerColor = template.Get("PLAYER_COLOR"); + var playerGradient = template.Get("PLAYER_GRADIENT"); + + SetupPlayerColor(player, template, playerColor, playerGradient); + + template.Get("UPGRADES_ICONS").GetPlayer = () => player; + template.IgnoreChildMouseOver = false; + + return template; + } + + ScrollItemWidget BuildOrderStats(Player player) + { + buildOrderHeaders.Visible = true; + var template = SetupPlayerScrollItemWidget(buildOrderPlayerTemplate, player); + + AddPlayerFlagAndName(template, player); + + var playerName = template.Get("PLAYER"); + playerName.GetColor = () => Color.White; + + var playerColor = template.Get("PLAYER_COLOR"); + var playerGradient = template.Get("PLAYER_GRADIENT"); + + SetupPlayerColor(player, template, playerColor, playerGradient); + + template.Get("BUILD_ORDER_ICONS").GetPlayer = () => player; + template.IgnoreChildMouseOver = false; + + return template; + } + + ScrollItemWidget UnitsProducedStats(Player player) + { + unitsProducedHeaders.Visible = true; + var template = SetupPlayerScrollItemWidget(unitsProducedPlayerTemplate, player); + + AddPlayerFlagAndName(template, player); + + var playerName = template.Get("PLAYER"); + playerName.GetColor = () => Color.White; + + var playerColor = template.Get("PLAYER_COLOR"); + var playerGradient = template.Get("PLAYER_GRADIENT"); + + SetupPlayerColor(player, template, playerColor, playerGradient); + + template.Get("UNITS_PRODUCED_ICONS").GetPlayer = () => player; + template.IgnoreChildMouseOver = false; + + return template; + } + + ScrollItemWidget EconomyStats(Player player) + { + economyStatsHeaders.Visible = true; + var template = SetupPlayerScrollItemWidget(economyPlayerTemplate, player); + + AddPlayerFlagAndName(template, player); + + var playerName = template.Get("PLAYER"); + playerName.GetColor = () => Color.White; + + var playerColor = template.Get("PLAYER_COLOR"); + var playerGradient = template.Get("PLAYER_GRADIENT"); + + SetupPlayerColor(player, template, playerColor, playerGradient); + + var stats = player.PlayerActor.TraitOrDefault(); + if (stats == null) + return template; + + var res = player.PlayerActor.Trait(); + var cashText = new CachedTransform(i => "$" + i); + template.Get("CASH").GetText = () => cashText.Update(res.GetCashAndResources()); + + var incomeText = new CachedTransform(i => "$" + i); + template.Get("INCOME").GetText = () => incomeText.Update(stats.DisplayIncome); + + var earnedText = new CachedTransform(i => "$" + i); + template.Get("EARNED").GetText = () => earnedText.Update(res.Earned); + + var spentText = new CachedTransform(i => "$" + i); + template.Get("SPENT").GetText = () => spentText.Update(res.Spent); + + var assetsText = new CachedTransform(i => "$" + i); + template.Get("ASSETS").GetText = () => assetsText.Update(stats.AssetsValue); + + var harvesters = template.Get("HARVESTERS"); + harvesters.GetText = () => world.ActorsWithTrait() + .Count(a => a.Actor.Owner == player && !a.Actor.IsDead && !a.Trait.IsTraitDisabled).ToString(NumberFormatInfo.CurrentInfo); + + var bountyText = new CachedTransform(i => "$" + i); + template.Get("BOUNTY").GetText = () => bountyText.Update(player.PlayerActor.Trait().CollectedBounty); + + var carryalls = template.GetOrNull("CARRYALLS"); + if (carryalls != null) + carryalls.GetText = () => world.ActorsWithTrait() + .Count(a => a.Actor.Owner == player && !a.Actor.IsDead).ToString(NumberFormatInfo.CurrentInfo); + + var derricks = template.GetOrNull("DERRICKS"); + if (derricks != null) + derricks.GetText = () => world.ActorsHavingTrait() + .Count(a => a.Owner == player && !a.IsDead).ToString(NumberFormatInfo.CurrentInfo); + + return template; + } + + ScrollItemWidget BasicStats(Player player) + { + basicStatsHeaders.Visible = true; + var template = SetupPlayerScrollItemWidget(basicPlayerTemplate, player); + + AddPlayerFlagAndName(template, player); + + var playerName = template.Get("PLAYER"); + playerName.GetColor = () => Color.White; + + var playerColor = template.Get("PLAYER_COLOR"); + var playerGradient = template.Get("PLAYER_GRADIENT"); + + SetupPlayerColor(player, template, playerColor, playerGradient); + + var res = player.PlayerActor.Trait(); + var cashText = new CachedTransform(i => "$" + i); + template.Get("CASH").GetText = () => cashText.Update(res.GetCashAndResources()); + + var powerRes = player.PlayerActor.TraitOrDefault(); + if (powerRes != null) + { + var power = template.Get("POWER"); + var powerText = new CachedTransform<(int PowerDrained, int PowerProvided), string>(p => p.PowerDrained + "/" + p.PowerProvided); + power.GetText = () => powerText.Update((powerRes.PowerDrained, powerRes.PowerProvided)); + power.GetColor = () => GetPowerColor(powerRes.PowerState); + } + + var stats = player.PlayerActor.TraitOrDefault(); + if (stats == null) + return template; + + var killsText = new CachedTransform(i => i.ToString(NumberFormatInfo.CurrentInfo)); + template.Get("KILLS").GetText = () => killsText.Update(stats.UnitsKilled + stats.BuildingsKilled); + + var deathsText = new CachedTransform(i => i.ToString(NumberFormatInfo.CurrentInfo)); + template.Get("DEATHS").GetText = () => deathsText.Update(stats.UnitsDead + stats.BuildingsDead); + + var destroyedText = new CachedTransform(i => "$" + i.ToString(NumberFormatInfo.CurrentInfo)); + template.Get("ASSETS_DESTROYED").GetText = () => destroyedText.Update(stats.KillsCost); + + var lostText = new CachedTransform(i => "$" + i.ToString(NumberFormatInfo.CurrentInfo)); + template.Get("ASSETS_LOST").GetText = () => lostText.Update(stats.DeathsCost); + + var experienceText = new CachedTransform(i => i.ToString(NumberFormatInfo.CurrentInfo)); + template.Get("EXPERIENCE").GetText = () => experienceText.Update(stats.Experience); + + var actionsText = new CachedTransform(d => AverageOrdersPerMinute(d)); + template.Get("ACTIONS_MIN").GetText = () => actionsText.Update(stats.OrderCount); + + return template; + } + + static void SetupPlayerColor(Player player, ScrollItemWidget template, ColorBlockWidget colorBlockWidget, GradientColorBlockWidget gradientColorBlockWidget) + { + var pColor = player.Color; + var color = Color.FromArgb(128, pColor.R, pColor.G, pColor.B); + var hoverColor = Color.FromArgb(192, pColor.R, pColor.G, pColor.B); + + var isMouseOver = new CachedTransform(w => w == template || template.Children.Contains(w)); + + colorBlockWidget.GetColor = () => isMouseOver.Update(Ui.MouseOverWidget) ? hoverColor : color; + + gradientColorBlockWidget.GetTopLeftColor = () => isMouseOver.Update(Ui.MouseOverWidget) ? hoverColor : color; + gradientColorBlockWidget.GetBottomLeftColor = () => isMouseOver.Update(Ui.MouseOverWidget) ? hoverColor : color; + gradientColorBlockWidget.GetTopRightColor = () => isMouseOver.Update(Ui.MouseOverWidget) ? hoverColor : Color.Transparent; + gradientColorBlockWidget.GetBottomRightColor = () => isMouseOver.Update(Ui.MouseOverWidget) ? hoverColor : Color.Transparent; + } + + ScrollItemWidget SetupPlayerScrollItemWidget(ScrollItemWidget template, Player player) + { + return ScrollItemWidget.Setup(template, () => false, () => + { + var playerBase = world.ActorsHavingTrait().FirstOrDefault(a => !a.IsDead && a.Owner == player); + if (playerBase != null) + worldRenderer.Viewport.Center(playerBase.CenterPosition); + }); + } + + void AdjustStatisticsPanel(Widget itemTemplate) + { + var height = playerStatsPanel.Bounds.Height; + + var scrollbarWidth = playerStatsPanel.ScrollBar != ScrollBar.Hidden ? playerStatsPanel.ScrollbarWidth : 0; + playerStatsPanel.Bounds.Width = itemTemplate.Bounds.Width + scrollbarWidth; + + if (playerStatsPanel.Bounds.Height < height) + playerStatsPanel.ScrollToTop(); + } + + void AdjustHeader(ContainerWidget headerTemplate) + { + var offset = playerStatsPanel.ScrollbarWidth; + + headerTemplate.Get("HEADER_COLOR").Bounds.Width += offset; + headerTemplate.Get("HEADER_GRADIENT").Bounds.X += offset; + + foreach (var headerLabel in headerTemplate.Children.OfType()) + headerLabel.Bounds.X += offset; + } + + static void AddPlayerFlagAndName(ScrollItemWidget template, Player player) + { + var flag = template.Get("FLAG"); + flag.GetImageCollection = () => "flags"; + flag.GetImageName = () => player.Faction.InternalName; + + var playerName = template.Get("PLAYER"); + WidgetUtils.BindPlayerNameAndStatus(playerName, player); + + playerName.GetColor = () => player.Color; + } + + string AverageOrdersPerMinute(double orders) + { + return (world.WorldTick == 0 ? 0 : orders / (world.WorldTick / 1500.0)).ToString("F1", NumberFormatInfo.CurrentInfo); + } + + string Vision(int revealedCells) + { + return (Math.Ceiling(revealedCells * 100d / world.Map.ProjectedCells.Length) / 100).ToString("P0", NumberFormatInfo.CurrentInfo); + } + + static Color GetPowerColor(PowerState state) + { + if (state == PowerState.Critical) + return Color.Red; + + if (state == PowerState.Low) + return Color.Orange; + + return Color.LimeGreen; + } + + // HACK The height of the templates and the scrollpanel needs to be kept in synch + bool ShowScrollBar => players.Length + (hasTeams ? teams.Length : 0) > 10; + + sealed class StatsDropDownOption + { + public string Title; + public Func IsSelected; + public Action OnClick; + } + } +} diff --git a/OpenRA.Mods.CA/Widgets/Logic/Ingame/PlayerExperienceLevelIndicatorLogic.cs b/OpenRA.Mods.CA/Widgets/Logic/Ingame/PlayerExperienceLevelIndicatorLogic.cs new file mode 100644 index 0000000000..07ad918ca0 --- /dev/null +++ b/OpenRA.Mods.CA/Widgets/Logic/Ingame/PlayerExperienceLevelIndicatorLogic.cs @@ -0,0 +1,135 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Mods.CA.Traits; +using OpenRA.Mods.Common.Traits; +using OpenRA.Mods.Common.Widgets; +using OpenRA.Primitives; +using OpenRA.Widgets; + +namespace OpenRA.Mods.CA.Widgets.Logic +{ + class PlayerExperienceLevelIndicatorLogic : ChromeLogic + { + [FluentReference("level")] + const string PlayerLevel = "label-player-level"; + + [FluentReference("currentXp")] + const string PlayerLevelCurrentXp = "label-player-level-current-xp"; + + [FluentReference("nextLevelXp")] + const string PlayerLevelRequiredXp = "label-player-level-required-xp"; + + const string DisabledImage = "disabled"; + + readonly PlayerExperienceLevels playerExperienceLevels; + + int fadeInMaxTicks = 5; + int waitMaxTicks = 85; + int fadeOutMaxTicks = 15; + + int fadeInTicks = 0; + int waitTicks = 0; + int fadeOutTicks = 0; + + [ObjectCreator.UseCtor] + public PlayerExperienceLevelIndicatorLogic(Widget widget, World world) + { + var playerExperience = world.LocalPlayer.PlayerActor.Trait(); + playerExperienceLevels = world.LocalPlayer.PlayerActor.TraitOrDefault(); + var container = widget.Get("PLAYER_EXPERIENCE"); + var rankImage = container.Get("PLAYER_EXPERIENCE_LEVEL"); + var rankUpImage = container.Get("PLAYER_EXPERIENCE_LEVEL_UP"); + var rankImageGlow = container.Get("PLAYER_EXPERIENCE_LEVEL_GLOW"); + + if (playerExperienceLevels == null) + { + rankImage.GetImageName = () => DisabledImage; + rankImage.IsVisible = () => true; + rankImage.GetTooltipText = () => FluentProvider.GetMessage(PlayerLevel, "level", "N/A"); + + rankImageGlow.GetImageName = () => DisabledImage; + rankImageGlow.IsVisible = () => false; + + rankUpImage.IsVisible = () => false; + return; + } + + playerExperienceLevels.LevelledUp += (level) => + { + fadeInTicks = fadeInMaxTicks; + waitTicks = waitMaxTicks; + fadeOutTicks = fadeOutMaxTicks; + }; + + rankImage.GetImageName = () => $"level{playerExperienceLevels.CurrentLevel}"; + rankImage.IsVisible = () => playerExperienceLevels.Enabled; + + rankImageGlow.GetImageName = () => $"level{playerExperienceLevels.CurrentLevel}-glow"; + rankImageGlow.IsVisible = () => LevelUpImageAlpha > 0; + rankImageGlow.GetAlpha = () => LevelUpImageAlpha; + + rankUpImage.IsVisible = () => LevelUpImageAlpha > 0; + rankUpImage.GetAlpha = () => LevelUpImageAlpha; + + var tooltipTextCached = new CachedTransform((CurrentXp) => + { + var tooltip = FluentProvider.GetMessage( + PlayerLevel, + "level", playerExperienceLevels.CurrentLevel); + + if (playerExperienceLevels.XpRequiredForNextLevel != null) { + tooltip = tooltip + + "\n\n" + + FluentProvider.GetMessage( + PlayerLevelCurrentXp, + "currentXp", CurrentXp) + + "\n" + + FluentProvider.GetMessage( + PlayerLevelRequiredXp, + "nextLevelXp", playerExperienceLevels.XpRequiredForNextLevel); + } + + return tooltip; + }); + + rankImage.GetTooltipText = () => + { + return tooltipTextCached.Update(playerExperienceLevels.XpRequiredForNextLevel == null ? null : playerExperience.Experience); + }; + } + + public override void Tick() + { + if (playerExperienceLevels == null || !playerExperienceLevels.Enabled) + return; + + if (fadeInTicks > 0) + fadeInTicks--; + else if (waitTicks > 0) + waitTicks--; + else if (fadeOutTicks > 0) + fadeOutTicks--; + } + + public float LevelUpImageAlpha { + get { + if (fadeInTicks > 0) + return 1f - (float)fadeInTicks / fadeInMaxTicks; + else if (waitTicks > 0) + return 1f; + else if (fadeOutTicks > 0) + return (float)fadeOutTicks / fadeOutMaxTicks; + else + return 0f; + } + } + } +} diff --git a/OpenRA.Mods.CA/Widgets/Logic/Ingame/ProductionTabsLogicCA.cs b/OpenRA.Mods.CA/Widgets/Logic/Ingame/ProductionTabsLogicCA.cs new file mode 100644 index 0000000000..58a004ff1a --- /dev/null +++ b/OpenRA.Mods.CA/Widgets/Logic/Ingame/ProductionTabsLogicCA.cs @@ -0,0 +1,117 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Linq; +using OpenRA.Mods.Common.Widgets; +using OpenRA.Widgets; + +namespace OpenRA.Mods.CA.Widgets.Logic +{ + public class ProductionTabsLogicCA : ChromeLogic + { + readonly ProductionTabsCAWidget tabs; + readonly World world; + + void SetupProductionGroupButton(ProductionTypeButtonWidget button) + { + if (button == null) + return; + + Action selectTab = reverse => + { + if (tabs.QueueGroup == button.ProductionGroup) + tabs.SelectNextTab(reverse); + else + tabs.QueueGroup = button.ProductionGroup; + + tabs.PickUpCompletedBuilding(); + }; + + // hard coded to always enable upgrades tab if structures exist to build them, even if all have been acquired already + button.IsDisabled = () => !tabs.Groups[button.ProductionGroup].Tabs.Any(t => t.Queue.BuildableItems().Any() || (t.Queue.Info.Type == "Upgrade" && t.Queue.AllItems().Any())); + button.OnMouseUp = mi => selectTab(mi.Modifiers.HasModifier(Modifiers.Shift)); + button.OnKeyPress = e => selectTab(e.Modifiers.HasModifier(Modifiers.Shift)); + button.IsHighlighted = () => tabs.QueueGroup == button.ProductionGroup; + + var chromeName = button.ProductionGroup.ToLowerInvariant(); + var icon = button.Get("ICON"); + icon.GetImageName = () => button.IsDisabled() ? chromeName + "-disabled" : + tabs.Groups[button.ProductionGroup].Alert ? chromeName + "-alert" : chromeName; + + var defaultIsVisible = icon.IsVisible; + icon.IsVisible = () => + { + if (!defaultIsVisible()) + return false; + + var group = tabs.Groups[button.ProductionGroup]; + if (!group.Alert && group.HasIdleFactories + && tabs.QueueGroup != button.ProductionGroup + && Game.Settings.Game.IdleFactoryAlert) + { + // Blink by toggling visibility using sine wave + return Math.Sin(Game.LocalTick * tabs.IdleAlertBlinkRate * 2 * Math.PI) > -0.3; + } + + return true; + }; + } + + [ObjectCreator.UseCtor] + public ProductionTabsLogicCA(Widget widget, World world) + { + this.world = world; + tabs = widget.Get("PRODUCTION_TABS"); + world.ActorAdded += tabs.ActorChanged; + world.ActorRemoved += tabs.ActorChanged; + Game.BeforeGameStart += UnregisterEvents; + + var typesContainer = Ui.Root.Get(tabs.TypesContainer); + foreach (var i in typesContainer.Children) + SetupProductionGroupButton(i as ProductionTypeButtonWidget); + + var background = Ui.Root.GetOrNull(tabs.BackgroundContainer); + if (background != null) + { + var palette = tabs.Parent.Get(tabs.PaletteWidget); + var icontemplate = background.Get("ICON_TEMPLATE"); + + Action updateBackground = (oldCount, newCount) => + { + background.RemoveChildren(); + + for (var i = 0; i < newCount; i++) + { + var x = i % palette.Columns; + var y = i / palette.Columns; + + var bg = icontemplate.Clone(); + bg.Bounds.X = palette.IconSize.X * x; + bg.Bounds.Y = palette.IconSize.Y * y; + background.AddChild(bg); + } + }; + + palette.OnIconCountChanged += updateBackground; + + // Set the initial palette state + updateBackground(0, 0); + } + } + + void UnregisterEvents() + { + Game.BeforeGameStart -= UnregisterEvents; + world.ActorAdded -= tabs.ActorChanged; + world.ActorRemoved -= tabs.ActorChanged; + } + } +} diff --git a/OpenRA.Mods.CA/Widgets/Logic/Ingame/ProductionTooltipLogicCA.cs b/OpenRA.Mods.CA/Widgets/Logic/Ingame/ProductionTooltipLogicCA.cs new file mode 100644 index 0000000000..dc88a126dc --- /dev/null +++ b/OpenRA.Mods.CA/Widgets/Logic/Ingame/ProductionTooltipLogicCA.cs @@ -0,0 +1,241 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Globalization; +using System.Linq; +using OpenRA.Mods.CA.Traits; +using OpenRA.Mods.Common.Traits; +using OpenRA.Mods.Common.Widgets; +using OpenRA.Primitives; +using OpenRA.Widgets; + +namespace OpenRA.Mods.CA.Widgets.Logic +{ + public class ProductionTooltipLogicCA : ChromeLogic + { + [FluentReference("prequisites")] + const string Requires = "label-requires"; + + [ObjectCreator.UseCtor] + public ProductionTooltipLogicCA(Widget widget, TooltipContainerWidget tooltipContainer, Player player, Func getTooltipIcon) + { + var world = player.World; + var mapRules = world.Map.Rules; + var pm = player.PlayerActor.TraitOrDefault(); + var pr = player.PlayerActor.Trait(); + + widget.IsVisible = () => getTooltipIcon() != null && getTooltipIcon().Actor != null; + var nameLabel = widget.Get("NAME"); + var hotkeyLabel = widget.Get("HOTKEY"); + var requiresLabel = widget.Get("REQUIRES"); + var powerLabel = widget.Get("POWER"); + var powerIcon = widget.Get("POWER_ICON"); + var armorTypeLabel = widget.Get("ARMORTYPE"); + var armorTypeIcon = widget.Get("ARMORTYPE_ICON"); + var timeLabel = widget.Get("TIME"); + var timeIcon = widget.Get("TIME_ICON"); + var costLabel = widget.Get("COST"); + var costIcon = widget.Get("COST_ICON"); + var descLabel = widget.Get("DESC"); + var strengthsLabel = widget.Get("STRENGTHS"); + var weaknessesLabel = widget.Get("WEAKNESSES"); + var attributesLabel = widget.Get("ATTRIBUTES"); + + var iconMargin = timeIcon.Bounds.X; + + var font = Game.Renderer.Fonts[nameLabel.Font]; + var descFont = Game.Renderer.Fonts[descLabel.Font]; + var requiresFont = Game.Renderer.Fonts[requiresLabel.Font]; + var formatBuildTime = new CachedTransform(time => WidgetUtils.FormatTime(time, world.Timestep)); + var requiresFormat = requiresLabel.Text; + + ActorInfo lastActor = null; + Hotkey lastHotkey = Hotkey.Invalid; + var lastPowerState = pm == null ? PowerState.Normal : pm.PowerState; + var descLabelY = descLabel.Bounds.Y; + var descLabelPadding = descLabel.Bounds.Height; + + tooltipContainer.BeforeRender = () => + { + var tooltipIcon = getTooltipIcon(); + if (tooltipIcon == null) + return; + + var actor = tooltipIcon.Actor; + if (actor == null) + return; + + var hotkey = tooltipIcon.Hotkey != null ? tooltipIcon.Hotkey.GetValue() : Hotkey.Invalid; + if (actor == lastActor && hotkey == lastHotkey && (pm == null || pm.PowerState == lastPowerState)) + return; + + var tooltip = actor.TraitInfos().FirstOrDefault(info => info.EnabledByDefault); + var name = tooltip != null ? FluentProvider.GetMessage(tooltip.Name) : actor.Name; + var buildable = actor.TraitInfo(); + + var cost = 0; + if (tooltipIcon.ProductionQueue != null) + cost = tooltipIcon.ProductionQueue.GetProductionCost(actor); + else + { + var valued = actor.TraitInfoOrDefault(); + if (valued != null) + cost = valued.Cost; + } + + var maxLeftWidth = 300; + + nameLabel.GetText = () => name; + + var nameSize = font.Measure(name); + var hotkeyWidth = 0; + hotkeyLabel.Visible = hotkey.IsValid(); + + if (hotkeyLabel.Visible) + { + var hotkeyText = $"({hotkey.DisplayString()})"; + + hotkeyWidth = font.Measure(hotkeyText).X + 2 * nameLabel.Bounds.X; + hotkeyLabel.GetText = () => hotkeyText; + hotkeyLabel.Bounds.X = nameSize.X + 2 * nameLabel.Bounds.X; + } + + var prereqs = buildable.Prerequisites + .Select(a => ActorName(mapRules, a)) + .Where(s => !s.StartsWith('~') && !s.StartsWith('!')) + .ToList(); + + var requiresSize = int2.Zero; + if (prereqs.Count > 0) + { + var requiresText = FluentProvider.GetMessage(Requires, "prerequisites", prereqs.JoinWith(", ")); + requiresLabel.GetText = () => requiresText; + requiresSize = requiresFont.Measure(requiresText); + requiresLabel.Visible = true; + descLabel.Bounds.Y = descLabelY + requiresLabel.Bounds.Height + (descLabel.Bounds.X / 2); + } + else + { + requiresLabel.Visible = false; + descLabel.Bounds.Y = descLabelY; + } + + var buildTime = tooltipIcon.ProductionQueue == null ? 0 : tooltipIcon.ProductionQueue.GetBuildTime(actor, buildable); + var timeModifier = pm != null && pm.PowerState != PowerState.Normal ? tooltipIcon.ProductionQueue.Info.LowPowerModifier : 100; + + var timeText = formatBuildTime.Update(buildTime * timeModifier / 100); + timeLabel.GetText = () => timeText; + timeLabel.TextColor = + (pm != null && pm.PowerState != PowerState.Normal && tooltipIcon.ProductionQueue.Info.LowPowerModifier > 100) + ? Color.Red + : Color.White; + var timeSize = font.Measure(timeText); + + var costText = cost.ToString(NumberFormatInfo.CurrentInfo); + costLabel.GetText = () => costText; + costLabel.GetColor = () => pr.GetCashAndResources() >= cost ? Color.White : Color.Red; + var costSize = font.Measure(costText); + + var powerSize = new int2(0, 0); + var power = 0; + + if (pm != null) + { + power = actor.TraitInfos().Where(i => i.EnabledByDefault).Sum(i => i.Amount); + var powerText = power.ToString(NumberFormatInfo.CurrentInfo); + powerLabel.GetText = () => powerText; + powerLabel.GetColor = () => (pm.PowerProvided - pm.PowerDrained >= -power || power > 0) + ? Color.White : Color.Red; + powerLabel.Visible = power != 0; + powerIcon.Visible = power != 0; + powerSize = font.Measure(powerText); + } + + armorTypeLabel = SelectionTooltipLogic.GetArmorTypeLabel(armorTypeLabel, actor); + var armorTypeSize = armorTypeLabel.GetText() != "" ? font.Measure(armorTypeLabel.GetText()) : new int2(0, 0); + armorTypeIcon.Visible = armorTypeSize.Y > 0; + + if (armorTypeLabel.Text != "" && power != 0) + armorTypeIcon.Bounds.Y = armorTypeLabel.Bounds.Y = powerLabel.Bounds.Bottom; + else + armorTypeIcon.Bounds.Y = armorTypeLabel.Bounds.Y = timeLabel.Bounds.Bottom; + + var extrasSpacing = descLabel.Bounds.X / 2; + + var desc = string.IsNullOrEmpty(buildable.Description) ? "" : FluentProvider.GetMessage(buildable.Description); + desc = WidgetUtilsCA.WrapTextWithIndent(desc.Replace("\\n", "\n"), maxLeftWidth, descFont); + descLabel.GetText = () => desc; + + var descSize = descFont.Measure(desc); + descLabel.Bounds.Width = descSize.X; + descLabel.Bounds.Height = descSize.Y; + + var tooltipExtras = actor.TraitInfos().FirstOrDefault(info => info.IsStandard); + + var strengthsLabelText = ""; + var weaknessesLabelText = ""; + var attributesLabelText = ""; + + if (tooltipExtras != null) + { + strengthsLabelText = WidgetUtilsCA.WrapTextWithIndent(tooltipExtras.Strengths.Replace("\\n", "\n"), maxLeftWidth, descFont, 6); + weaknessesLabelText = WidgetUtilsCA.WrapTextWithIndent(tooltipExtras.Weaknesses.Replace("\\n", "\n"), maxLeftWidth, descFont, 6); + attributesLabelText = WidgetUtilsCA.WrapTextWithIndent(tooltipExtras.Attributes.Replace("\\n", "\n"), maxLeftWidth, descFont, 6); + } + + strengthsLabel.GetText = () => strengthsLabelText; + weaknessesLabel.GetText = () => weaknessesLabelText; + attributesLabel.GetText = () => attributesLabelText; + var strengthsSize = strengthsLabelText != "" ? descFont.Measure(strengthsLabelText) : new int2(0, 0); + var weaknessesSize = weaknessesLabelText != "" ? descFont.Measure(weaknessesLabelText) : new int2(0, 0); + var attributesSize = attributesLabelText != "" ? descFont.Measure(attributesLabelText) : new int2(0, 0); + + strengthsLabel.Bounds.Y = descLabel.Bounds.Bottom + extrasSpacing; + weaknessesLabel.Bounds.Y = descLabel.Bounds.Bottom + strengthsSize.Y + extrasSpacing; + attributesLabel.Bounds.Y = descLabel.Bounds.Bottom + strengthsSize.Y + weaknessesSize.Y + extrasSpacing; + + descLabel.Bounds.Height += strengthsSize.Y + weaknessesSize.Y + attributesSize.Y + descLabelPadding + extrasSpacing; + + var leftWidth = new[] { nameSize.X + hotkeyWidth, requiresSize.X, descSize.X, strengthsSize.X, weaknessesSize.X, attributesSize.X }.Aggregate(Math.Max); + var rightWidth = new[] { powerSize.X, timeSize.X, costSize.X, armorTypeSize.X }.Aggregate(Math.Max); + + timeIcon.Bounds.X = powerIcon.Bounds.X = costIcon.Bounds.X = armorTypeIcon.Bounds.X = leftWidth + 2 * nameLabel.Bounds.X; + timeLabel.Bounds.X = powerLabel.Bounds.X = costLabel.Bounds.X = armorTypeLabel.Bounds.X = timeIcon.Bounds.Right + iconMargin; + widget.Bounds.Width = leftWidth + rightWidth + 3 * nameLabel.Bounds.X + timeIcon.Bounds.Width + iconMargin; + + // Set the bottom margin to match the left margin + var leftHeight = descLabel.Bounds.Bottom + descLabel.Bounds.X; + + // Set the bottom margin to match the top margin + var rightHeight = armorTypeIcon.Bounds.Bottom + costIcon.Bounds.Top; + + widget.Bounds.Height = Math.Max(leftHeight, rightHeight); + + lastActor = actor; + lastHotkey = hotkey; + if (pm != null) + lastPowerState = pm.PowerState; + }; + } + + static string ActorName(Ruleset rules, string a) + { + if (rules.Actors.TryGetValue(a.ToLowerInvariant(), out var ai)) + { + var actorTooltip = ai.TraitInfos().FirstOrDefault(info => info.EnabledByDefault); + if (actorTooltip != null) + return FluentProvider.GetMessage(actorTooltip.Name); + } + + return a; + } + } +} diff --git a/OpenRA.Mods.CA/Widgets/Logic/Ingame/ReplayControlBarLogicCA.cs b/OpenRA.Mods.CA/Widgets/Logic/Ingame/ReplayControlBarLogicCA.cs new file mode 100644 index 0000000000..7d9ea11d55 --- /dev/null +++ b/OpenRA.Mods.CA/Widgets/Logic/Ingame/ReplayControlBarLogicCA.cs @@ -0,0 +1,113 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using OpenRA.Mods.Common.Widgets; +using OpenRA.Network; +using OpenRA.Widgets; + +namespace OpenRA.Mods.CA.Widgets.Logic +{ + public class ReplayControlBarLogicCA : ChromeLogic + { + enum PlaybackSpeed { Regular, Slow, Fast, Faster, Maximum } + + readonly Dictionary multipliers = new() + { + { PlaybackSpeed.Regular, 1 }, + { PlaybackSpeed.Slow, 2 }, + { PlaybackSpeed.Fast, 0.75f }, + { PlaybackSpeed.Faster, 0.5f }, + { PlaybackSpeed.Maximum, 0.001f }, + }; + + [ObjectCreator.UseCtor] + public ReplayControlBarLogicCA(Widget widget, World world, OrderManager orderManager) + { + if (world.IsReplay) + { + var container = widget.Get("REPLAY_PLAYER"); + var connection = (ReplayConnection)orderManager.Connection; + var replayNetTicks = connection.TickCount; + + var background = widget.Parent.GetOrNull("OBSERVER_CONTROL_BG"); + if (background != null) + background.Bounds.Height += container.Bounds.Height; + + container.Visible = true; + var speed = PlaybackSpeed.Regular; + var originalTimestep = world.Timestep; + + // In the event the replay goes out of sync, it becomes no longer usable. For polish we permanently pause the world. + bool IsWidgetDisabled() => orderManager.IsOutOfSync || orderManager.NetFrameNumber >= replayNetTicks; + + var pauseButton = widget.Get("BUTTON_PAUSE"); + pauseButton.IsVisible = () => world.ReplayTimestep != 0 && !IsWidgetDisabled(); + pauseButton.OnClick = () => world.ReplayTimestep = 0; + + var playButton = widget.Get("BUTTON_PLAY"); + playButton.IsVisible = () => world.ReplayTimestep == 0 || IsWidgetDisabled(); + playButton.OnClick = () => world.ReplayTimestep = (int)Math.Ceiling(originalTimestep * multipliers[speed]); + playButton.IsDisabled = IsWidgetDisabled; + + var slowButton = widget.Get("BUTTON_SLOW"); + slowButton.IsHighlighted = () => speed == PlaybackSpeed.Slow; + slowButton.IsDisabled = IsWidgetDisabled; + slowButton.OnClick = () => + { + speed = PlaybackSpeed.Slow; + if (world.ReplayTimestep != 0) + world.ReplayTimestep = (int)Math.Ceiling(originalTimestep * multipliers[speed]); + }; + + var normalSpeedButton = widget.Get("BUTTON_REGULAR"); + normalSpeedButton.IsHighlighted = () => speed == PlaybackSpeed.Regular; + normalSpeedButton.IsDisabled = IsWidgetDisabled; + normalSpeedButton.OnClick = () => + { + speed = PlaybackSpeed.Regular; + if (world.ReplayTimestep != 0) + world.ReplayTimestep = (int)Math.Ceiling(originalTimestep * multipliers[speed]); + }; + + var fastButton = widget.Get("BUTTON_FAST"); + fastButton.IsHighlighted = () => speed == PlaybackSpeed.Fast; + fastButton.IsDisabled = IsWidgetDisabled; + fastButton.OnClick = () => + { + speed = PlaybackSpeed.Fast; + if (world.ReplayTimestep != 0) + world.ReplayTimestep = (int)Math.Ceiling(originalTimestep * multipliers[speed]); + }; + + var fasterButton = widget.Get("BUTTON_FASTER"); + fasterButton.IsHighlighted = () => speed == PlaybackSpeed.Faster; + fasterButton.IsDisabled = IsWidgetDisabled; + fasterButton.OnClick = () => + { + speed = PlaybackSpeed.Faster; + if (world.ReplayTimestep != 0) + world.ReplayTimestep = (int)Math.Ceiling(originalTimestep * multipliers[speed]); + }; + + var maximumButton = widget.Get("BUTTON_MAXIMUM"); + maximumButton.IsHighlighted = () => speed == PlaybackSpeed.Maximum; + maximumButton.IsDisabled = IsWidgetDisabled; + maximumButton.OnClick = () => + { + speed = PlaybackSpeed.Maximum; + if (world.ReplayTimestep != 0) + world.ReplayTimestep = (int)Math.Ceiling(originalTimestep * multipliers[speed]); + }; + } + } + } +} diff --git a/OpenRA.Mods.CA/Widgets/Logic/Ingame/ScrinAllegianceIndicatorLogic.cs b/OpenRA.Mods.CA/Widgets/Logic/Ingame/ScrinAllegianceIndicatorLogic.cs new file mode 100644 index 0000000000..33e9cce927 --- /dev/null +++ b/OpenRA.Mods.CA/Widgets/Logic/Ingame/ScrinAllegianceIndicatorLogic.cs @@ -0,0 +1,127 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Linq; +using OpenRA.Mods.CA.Traits; +using OpenRA.Mods.Common.Widgets; +using OpenRA.Widgets; + +namespace OpenRA.Mods.CA.Widgets.Logic +{ + class ScrinAllegianceIndicatorLogic : ChromeLogic + { + const string CountType = "ScrinAllegiance"; + const string DisabledImage = "disabled"; + + readonly ProvidesPrerequisitesOnCount counter; + + string chosenAllegiance; + + int fadeInMaxTicks = 5; + int waitMaxTicks = 85; + int fadeOutMaxTicks = 15; + + int fadeInTicks = 0; + int waitTicks = 0; + int fadeOutTicks = 0; + + [ObjectCreator.UseCtor] + public ScrinAllegianceIndicatorLogic(Widget widget, World world) + { + counter = world.LocalPlayer.PlayerActor.TraitsImplementing() + .FirstOrDefault(c => c.Info.Type == CountType); + + var container = widget.Get("SCRIN_ALLEGIANCE"); + var countImage = container.Get("SCRIN_ALLEGIANCE_LEVEL"); + var incrementImage = container.Get("SCRIN_ALLEGIANCE_LEVEL_UP"); + var countImageGlow = container.Get("SCRIN_ALLEGIANCE_LEVEL_GLOW"); + + if (counter == null) + { + countImage.GetImageName = () => DisabledImage; + countImage.IsVisible = () => true; + + countImageGlow.GetImageName = () => DisabledImage; + countImageGlow.IsVisible = () => false; + + incrementImage.IsVisible = () => false; + return; + } + + counter.Incremented += HandleIncremented; + counter.PermanentlyGranted += HandlePermanentlyGranted; + + countImage.GetImageName = () => GetCountImageName(); + countImage.IsVisible = () => counter.Enabled; + + countImageGlow.GetImageName = () => $"{GetCountImageName()}-glow"; + countImageGlow.IsVisible = () => IncrementImageAlpha > 0; + countImageGlow.GetAlpha = () => IncrementImageAlpha; + + incrementImage.IsVisible = () => chosenAllegiance == null && IncrementImageAlpha > 0; + incrementImage.GetAlpha = () => chosenAllegiance == null ? IncrementImageAlpha : 0f; + } + + private void HandleIncremented() + { + fadeInTicks = fadeInMaxTicks; + waitTicks = waitMaxTicks; + fadeOutTicks = fadeOutMaxTicks; + } + + private void HandlePermanentlyGranted(string allegiance) + { + chosenAllegiance = allegiance.Split('.')[0]; + fadeInTicks = fadeInMaxTicks; + waitTicks = waitMaxTicks; + fadeOutTicks = fadeOutMaxTicks; + } + + private string GetCountImageName() + { + if (chosenAllegiance != null) + { + return chosenAllegiance; + } + else + { + var count = Math.Min(counter.CurrentCount, 4); + return $"level{count}"; + } + } + + public float IncrementImageAlpha { + get { + if (fadeInTicks > 0) + return 1f - (float)fadeInTicks / fadeInMaxTicks; + else if (waitTicks > 0) + return 1f; + else if (fadeOutTicks > 0) + return (float)fadeOutTicks / fadeOutMaxTicks; + else + return 0f; + } + } + + public override void Tick() + { + if (counter == null || !counter.Enabled) + return; + + if (fadeInTicks > 0) + fadeInTicks--; + else if (waitTicks > 0) + waitTicks--; + else if (fadeOutTicks > 0) + fadeOutTicks--; + } + } +} diff --git a/OpenRA.Mods.CA/Widgets/Logic/Ingame/SelectionTooltipLogic.cs b/OpenRA.Mods.CA/Widgets/Logic/Ingame/SelectionTooltipLogic.cs new file mode 100644 index 0000000000..890aeef4af --- /dev/null +++ b/OpenRA.Mods.CA/Widgets/Logic/Ingame/SelectionTooltipLogic.cs @@ -0,0 +1,262 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Linq; +using OpenRA.Mods.CA.Traits; +using OpenRA.Mods.Common.Traits; +using OpenRA.Mods.Common.Widgets; +using OpenRA.Primitives; +using OpenRA.Traits; +using OpenRA.Widgets; + +namespace OpenRA.Mods.CA.Widgets.Logic +{ + public class SelectionTooltipLogic : ChromeLogic + { + readonly World world; + int selectionHash; + readonly Widget widget; + int originalDescLabelHeight; + int iconMargin; + + [ObjectCreator.UseCtor] + public SelectionTooltipLogic(Widget widget, World world) + { + this.world = world; + this.widget = widget; + widget.IsVisible = () => Game.Settings.Game.SelectionTooltip && !Game.Settings.Debug.PerfText; + originalDescLabelHeight = -1; + iconMargin = -1; + } + + public override void Tick() + { + if (selectionHash == world.Selection.Hash) + return; + + UpdateTooltip(); + selectionHash = world.Selection.Hash; + } + + void HideTooltip() + { + widget.Bounds.X = Game.Renderer.Resolution.Width; + widget.Bounds.Y = Game.Renderer.Resolution.Height; + } + + void UpdateTooltip() + { + var selectedActors = world.Selection.Actors; + var numSelectedActors = selectedActors.Count(); + var uniqueActors = new HashSet(); + + foreach (var a in selectedActors) + { + uniqueActors.Add(a.Info.Name); + } + + if (uniqueActors.Count != 1) + { + HideTooltip(); + return; + } + + var actor = selectedActors.First(); + if (actor == null || actor.Info == null || actor.IsDead || !actor.IsInWorld || actor.Disposed) + { + HideTooltip(); + return; + } + + var mapRules = world.Map.Rules; + var nameLabel = widget.Get("NAME"); + var armorTypeLabel = widget.Get("ARMORTYPE"); + var armorTypeIcon = widget.Get("ARMORTYPE_ICON"); + var costLabel = widget.Get("COST"); + var costIcon = widget.Get("COST_ICON"); + var descLabel = widget.Get("DESC"); + var strengthsLabel = widget.Get("STRENGTHS"); + var weaknessesLabel = widget.Get("WEAKNESSES"); + var attributesLabel = widget.Get("ATTRIBUTES"); + var font = Game.Renderer.Fonts[nameLabel.Font]; + var descFont = Game.Renderer.Fonts[descLabel.Font]; + var formatBuildTime = new CachedTransform(time => WidgetUtils.FormatTime(time, world.Timestep)); + + if (originalDescLabelHeight == -1) + originalDescLabelHeight = descLabel.Bounds.Height; + + if (iconMargin == -1) + iconMargin = armorTypeIcon.Bounds.X; + + descLabel.Bounds.Height = originalDescLabelHeight; + + var descLabelPadding = descLabel.Bounds.Height; + + var actorInfo = actor.Info; + var tooltip = actor.TraitsImplementing().FirstOrDefault(t => !t.IsTraitDisabled); + var tooltipInfo = tooltip != null ? tooltip.Info : null; + var tooltipExtras = actor.TraitsImplementing().FirstOrDefault(t => !t.IsTraitDisabled); + var tooltipExtrasInfo = tooltipExtras != null ? tooltipExtras.Info : null; + + if (tooltipExtrasInfo != null && tooltipExtrasInfo.FakeActor != null) + { + var o = actor.Owner; + var stance = o == null || world.RenderPlayer == null ? PlayerRelationship.None : o.RelationshipWith(world.RenderPlayer); + if (stance == PlayerRelationship.Enemy) + { + actorInfo = mapRules.Actors[tooltipExtras.Info.FakeActor]; + tooltipExtrasInfo = actorInfo.TraitInfoOrDefault(); + tooltipInfo = actorInfo.TraitInfoOrDefault(); + } + } + + // Name + var name = tooltipInfo != null ? tooltipInfo.Name : char.ToUpper(actorInfo.Name[0]) + actorInfo.Name[1..]; + + if (numSelectedActors > 1) + name = numSelectedActors.ToString() + "x " + name; + + nameLabel.Text = name; + var nameSize = font.Measure(name); + + // Armor type + armorTypeLabel = GetArmorTypeLabel(armorTypeLabel, actorInfo); + var armorTypeSize = armorTypeLabel.Text != "" ? font.Measure(armorTypeLabel.Text) : new int2(0, 0); + armorTypeIcon.Visible = armorTypeSize.Y > 0; + armorTypeLabel.Bounds.Y = armorTypeIcon.Bounds.Y; + + // Cost + var cost = 0; + var valued = actorInfo.TraitInfoOrDefault(); + if (valued != null) + cost = valued.Cost; + + costLabel.Visible = costIcon.Visible = cost > 0; + costLabel.Text = cost.ToString(); + costLabel.GetColor = () => Color.White; + var costSize = font.Measure(costLabel.Text); + + var maxLeftWidth = 300; + + // Description + var descText = ""; + var buildable = actorInfo.TraitInfoOrDefault(); + + if (buildable != null && buildable.Description != null) + { + descText = WidgetUtilsCA.WrapTextWithIndent(buildable.Description.Replace("\\n", "\n"), maxLeftWidth, descFont); + } + + var descSize = descText != "" ? descFont.Measure(descText) : new int2(0, 0); + + descLabel.Bounds.Width = descSize.X; + descLabel.Bounds.Height = descSize.Y; + + // Strengths, weaknesses & attributes + if (tooltipExtrasInfo != null) + { + strengthsLabel.Text = WidgetUtilsCA.WrapTextWithIndent(tooltipExtrasInfo.Strengths.Replace("\\n", "\n"), maxLeftWidth, descFont, 6); + weaknessesLabel.Text = WidgetUtilsCA.WrapTextWithIndent(tooltipExtrasInfo.Weaknesses.Replace("\\n", "\n"), maxLeftWidth, descFont, 6); + attributesLabel.Text = WidgetUtilsCA.WrapTextWithIndent(tooltipExtrasInfo.Attributes.Replace("\\n", "\n"), maxLeftWidth, descFont, 6); + descText = tooltipExtrasInfo.Description != "" ? WidgetUtilsCA.WrapTextWithIndent(tooltipExtrasInfo.Description.Replace("\\n", "\n"), maxLeftWidth, descFont, 6) : descText; + } + else + { + strengthsLabel.Text = ""; + weaknessesLabel.Text = ""; + attributesLabel.Text = ""; + } + + descLabel.Text = descText; + + // Recalculate description size after potentially updating with TooltipExtras description + descSize = descText != "" ? descFont.Measure(descText) : new int2(0, 0); + descLabel.Bounds.Width = descSize.X; + descLabel.Bounds.Height = descSize.Y; + + var extrasSpacing = descLabel.Bounds.X / 2; + var strengthsSize = strengthsLabel.Text != "" ? descFont.Measure(strengthsLabel.Text) : new int2(0, 0); + var weaknessesSize = weaknessesLabel.Text != "" ? descFont.Measure(weaknessesLabel.Text) : new int2(0, 0); + var attributesSize = attributesLabel.Text != "" ? descFont.Measure(attributesLabel.Text) : new int2(0, 0); + + strengthsLabel.Bounds.Y = descLabel.Bounds.Bottom + extrasSpacing; + weaknessesLabel.Bounds.Y = descLabel.Bounds.Bottom + strengthsSize.Y + extrasSpacing; + attributesLabel.Bounds.Y = descLabel.Bounds.Bottom + strengthsSize.Y + weaknessesSize.Y + extrasSpacing; + + descLabel.Bounds.Height += strengthsSize.Y + weaknessesSize.Y + attributesSize.Y + descLabelPadding + extrasSpacing; + + var leftWidth = new[] { nameSize.X, descSize.X, strengthsSize.X, weaknessesSize.X, attributesSize.X }.Aggregate(Math.Max) + 5; + var rightWidth = new[] { armorTypeSize.X, costSize.X }.Aggregate(Math.Max); + + armorTypeIcon.Bounds.X = costIcon.Bounds.X = leftWidth + 2 * nameLabel.Bounds.X; + armorTypeLabel.Bounds.X = costLabel.Bounds.X = armorTypeIcon.Bounds.Right + iconMargin; + widget.Bounds.Width = leftWidth + rightWidth + 3 * nameLabel.Bounds.X + armorTypeIcon.Bounds.Width + iconMargin; + + // Set the bottom margin to match the left margin + var leftHeight = descLabel.Bounds.Bottom + descLabel.Bounds.X; + + // Set the bottom margin to match the top margin + var rightHeight = armorTypeIcon.Bounds.Bottom; + widget.Bounds.Height = Math.Max(leftHeight, rightHeight); + widget.Bounds.X = Game.Renderer.Resolution.Width - widget.Bounds.Width - 12; + widget.Bounds.Y = Game.Renderer.Resolution.Height - widget.Bounds.Height - 12; + } + + public static LabelWidget GetArmorTypeLabel(LabelWidget armorTypeLabel, ActorInfo actor) + { + var armor = actor.TraitInfos().FirstOrDefault(); + armorTypeLabel.Text = armor != null ? armor.Type : ""; + + // Hard coded, specific to CA - find a better way to set user-friendly names and colors for armor types + switch (armorTypeLabel.Text) + { + case "None": + armorTypeLabel.Text = "Infantry"; + armorTypeLabel.TextColor = Color.ForestGreen; + break; + + case "Light": + armorTypeLabel.TextColor = Color.MediumPurple; + break; + + case "Heavy": + armorTypeLabel.TextColor = Color.Firebrick; + break; + + case "Concrete": + armorTypeLabel.Text = "Defense"; + armorTypeLabel.TextColor = Color.RoyalBlue; + break; + + case "Wood": + armorTypeLabel.Text = "Building"; + armorTypeLabel.TextColor = Color.Peru; + break; + + case "Brick": + armorTypeLabel.Text = "Wall"; + armorTypeLabel.TextColor = Color.RosyBrown; + break; + + case "Aircraft": + armorTypeLabel.TextColor = Color.SkyBlue; + break; + + default: + armorTypeLabel.Text = ""; + break; + } + + return armorTypeLabel; + } + } +} diff --git a/OpenRA.Mods.CA/Widgets/Logic/Ingame/SpritePowerMeterLogic.cs b/OpenRA.Mods.CA/Widgets/Logic/Ingame/SpritePowerMeterLogic.cs new file mode 100644 index 0000000000..ea890071a1 --- /dev/null +++ b/OpenRA.Mods.CA/Widgets/Logic/Ingame/SpritePowerMeterLogic.cs @@ -0,0 +1,70 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using OpenRA.Mods.CA.Widgets; +using OpenRA.Mods.Common.Traits; +using OpenRA.Widgets; + +namespace OpenRA.Mods.Common.Widgets.Logic +{ + public class SpritePowerMeterLogic : ChromeLogic + { + readonly PowerManager powerManager; + readonly SpritePowerMeterWidget powerMeter; + + [ObjectCreator.UseCtor] + public SpritePowerMeterLogic(World world, Widget widget) + { + powerManager = world.LocalPlayer.PlayerActor.Trait(); + powerMeter = widget.Get("POWER_BAR"); + + powerMeter.GetTooltipText = () => "Power Usage: " + powerManager.PowerDrained.ToString() + + (powerManager.PowerProvided != 1000000 ? "/" + powerManager.PowerProvided.ToString() : ""); + } + + void CheckFlash() + { + var startWarningFlash = powerManager.PowerState != PowerState.Normal; + + if (powerMeter.LastTotalPowerDisplay != powerMeter.TotalPowerDisplay) + { + startWarningFlash = true; + powerMeter.LastTotalPowerDisplay = powerMeter.TotalPowerDisplay; + } + + if (startWarningFlash && powerMeter.WarningFlash <= 0) + powerMeter.WarningFlash = powerMeter.WarningFlashDuration; + } + + public override void Tick() + { + powerMeter.LowPower = powerManager.PowerState == PowerState.Low; + + powerMeter.TotalPowerDisplay = Math.Max(powerManager.PowerProvided, powerManager.PowerDrained); + + powerMeter.TotalPowerStep = powerMeter.TotalPowerDisplay / powerMeter.PowerUnitsPerBar; + powerMeter.PowerUsedStep = powerManager.PowerDrained / powerMeter.PowerUnitsPerBar; + powerMeter.PowerAvailableStep = powerManager.PowerProvided / powerMeter.PowerUnitsPerBar; + + // Display a percentage if the bar is maxed out + if (powerMeter.TotalPowerStep > powerMeter.NumberOfBars) + { + var powerFraction = powerMeter.NumberOfBars / powerMeter.TotalPowerStep; + powerMeter.TotalPowerDisplay = (int)(powerMeter.TotalPowerDisplay * powerFraction); + powerMeter.TotalPowerStep *= powerFraction; + powerMeter.PowerUsedStep *= powerFraction; + powerMeter.PowerAvailableStep *= powerFraction; + } + + CheckFlash(); + } + } +} diff --git a/OpenRA.Mods.CA/Widgets/Logic/Ingame/SupportPowerBinLogicCA.cs b/OpenRA.Mods.CA/Widgets/Logic/Ingame/SupportPowerBinLogicCA.cs new file mode 100644 index 0000000000..84982bd5f2 --- /dev/null +++ b/OpenRA.Mods.CA/Widgets/Logic/Ingame/SupportPowerBinLogicCA.cs @@ -0,0 +1,80 @@ +#region Copyright & License Information +/* + * Copyright (c) The OpenRA Developers and Contributors + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. For more + * information, see COPYING. + */ +#endregion + +using System; +using OpenRA.Widgets; + +namespace OpenRA.Mods.CA.Widgets.Logic +{ + public class SupportPowerBinLogicCA : ChromeLogic + { + [ObjectCreator.UseCtor] + public SupportPowerBinLogicCA(Widget widget) + { + var palette = widget.Get("SUPPORT_PALETTE"); + + var background = widget.GetOrNull("PALETTE_BACKGROUND"); + var foreground = widget.GetOrNull("PALETTE_FOREGROUND"); + if (background != null || foreground != null) + { + Widget backgroundTemplate = null; + Widget foregroundTemplate = null; + + if (background != null) + backgroundTemplate = background.Get("ICON_TEMPLATE"); + + if (foreground != null) + foregroundTemplate = foreground.Get("ICON_TEMPLATE"); + + void UpdateBackground(int _, int icons) + { + var rowHeight = palette.IconSize.Y + palette.IconMargin; + var rowWidth = palette.IconSize.X + palette.IconMargin; + + if (background != null) + { + background.RemoveChildren(); + + for (var i = 0; i < icons; i++) + { + var row = backgroundTemplate.Clone(); + if (palette.Horizontal) + row.Bounds.X += i * rowWidth; + else + row.Bounds.Y += i * rowHeight; + background.AddChild(row); + } + } + + if (foreground != null) + { + foreground.RemoveChildren(); + + for (var i = 0; i < icons; i++) + { + var row = foregroundTemplate.Clone(); + if (palette.Horizontal) + row.Bounds.X += i * rowWidth; + else + row.Bounds.Y += i * rowHeight; + foreground.AddChild(row); + } + } + } + + palette.OnIconCountChanged += UpdateBackground; + + // Set the initial palette state + UpdateBackground(0, 0); + } + } + } +} diff --git a/OpenRA.Mods.CA/Widgets/Logic/Ingame/SupportPowerTooltipLogicCA.cs b/OpenRA.Mods.CA/Widgets/Logic/Ingame/SupportPowerTooltipLogicCA.cs new file mode 100644 index 0000000000..f87b8ac363 --- /dev/null +++ b/OpenRA.Mods.CA/Widgets/Logic/Ingame/SupportPowerTooltipLogicCA.cs @@ -0,0 +1,122 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using OpenRA.Mods.Common.Traits; +using OpenRA.Mods.Common.Widgets; +using OpenRA.Primitives; +using OpenRA.Widgets; + +namespace OpenRA.Mods.CA.Widgets.Logic +{ + public class SupportPowerTooltipLogicCA : ChromeLogic + { + [ObjectCreator.UseCtor] + public SupportPowerTooltipLogicCA(Widget widget, TooltipContainerWidget tooltipContainer, + Func getTooltipIcon, World world, PlayerResources playerResources) + { + widget.IsVisible = () => getTooltipIcon() != null && getTooltipIcon().Power.Info != null; + var nameLabel = widget.Get("NAME"); + var hotkeyLabel = widget.Get("HOTKEY"); + var timeLabel = widget.Get("TIME"); + var descLabel = widget.Get("DESC"); + var costLabel = widget.Get("COST"); + var nameFont = Game.Renderer.Fonts[nameLabel.Font]; + var hotkeyFont = Game.Renderer.Fonts[hotkeyLabel.Font]; + var timeFont = Game.Renderer.Fonts[timeLabel.Font]; + var descFont = Game.Renderer.Fonts[descLabel.Font]; + var costFont = Game.Renderer.Fonts[costLabel.Font]; + var baseHeight = widget.Bounds.Height; + var timeOffset = timeLabel.Bounds.X; + var costOffset = costLabel.Bounds.X; + + SupportPowerInstance lastPower = null; + var lastHotkey = Hotkey.Invalid; + var lastRemainingSeconds = 0; + + tooltipContainer.BeforeRender = () => + { + var icon = getTooltipIcon(); + if (icon == null || icon.Power == null || icon.Power.Instances.Count == 0) + return; + + var sp = icon.Power; + + // HACK: This abuses knowledge of the internals of WidgetUtils.FormatTime + // to efficiently work when the label is going to change, requiring a panel relayout + var remainingSeconds = (int)Math.Ceiling(sp.RemainingTicks * world.Timestep / 1000f); + + var hotkey = icon.Hotkey?.GetValue() ?? Hotkey.Invalid; + if (sp == lastPower && hotkey == lastHotkey && lastRemainingSeconds == remainingSeconds) + return; + + var cost = sp.Info.Cost; + var costString = costLabel.Text + cost.ToString(); + costLabel.GetText = () => costString; + costLabel.GetColor = () => playerResources.Cash + playerResources.Resources >= cost + ? Color.White : Color.Red; + costLabel.IsVisible = () => cost != 0; + var costSize = costFont.Measure(costString); + + nameLabel.GetText = () => sp.Name; + var nameSize = nameFont.Measure(sp.Name); + + var descText = WidgetUtilsCA.WrapTextWithIndent(sp.Description.Replace("\\n", "\n"), descLabel.Bounds.Width, descFont); + descLabel.GetText = () => descText; + var descSize = descFont.Measure(descText); + + var timeText = sp.TooltipTimeTextOverride(); + if (timeText == null) + { + var remaining = WidgetUtils.FormatTime(sp.RemainingTicks, world.Timestep); + var total = WidgetUtils.FormatTime(sp.Info.ChargeInterval, world.Timestep); + timeText = $"{remaining} / {total}"; + } + + timeLabel.GetText = () => timeText; + var timeSize = timeFont.Measure(timeText); + var hotkeyWidth = 0; + hotkeyLabel.Visible = hotkey.IsValid(); + if (hotkeyLabel.Visible) + { + var hotkeyText = $"({hotkey.DisplayString()})"; + + hotkeyWidth = hotkeyFont.Measure(hotkeyText).X + 2 * nameLabel.Bounds.X; + hotkeyLabel.GetText = () => hotkeyText; + hotkeyLabel.Bounds.X = nameSize.X + 2 * nameLabel.Bounds.X; + } + + var timeWidth = timeSize.X; + var costWidth = costSize.X; + var topWidth = nameSize.X + hotkeyWidth + timeWidth + timeOffset; + + if (cost != 0) + topWidth += costWidth + costOffset; + + widget.Bounds.Width = 2 * nameLabel.Bounds.X + Math.Max(topWidth, descSize.X); + widget.Bounds.Height = baseHeight + descSize.Y; + timeLabel.Bounds.X = widget.Bounds.Width - nameLabel.Bounds.X - timeWidth; + + if (cost != 0) + { + timeLabel.Bounds.X -= costWidth + costOffset; + costLabel.Bounds.X = widget.Bounds.Width - nameLabel.Bounds.X - costWidth; + } + + lastPower = sp; + lastHotkey = hotkey; + lastRemainingSeconds = remainingSeconds; + }; + + timeLabel.GetColor = () => getTooltipIcon() != null && !getTooltipIcon().Power.Active + ? Color.Red : Color.White; + } + } +} diff --git a/OpenRA.Mods.CA/Widgets/Logic/Ingame/UpgradeOrderButtonLogic.cs b/OpenRA.Mods.CA/Widgets/Logic/Ingame/UpgradeOrderButtonLogic.cs new file mode 100644 index 0000000000..723be0f990 --- /dev/null +++ b/OpenRA.Mods.CA/Widgets/Logic/Ingame/UpgradeOrderButtonLogic.cs @@ -0,0 +1,104 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Linq; +using OpenRA.Mods.CA.Orders; +using OpenRA.Mods.CA.Traits; +using OpenRA.Mods.Common.Widgets; +using OpenRA.Traits; +using OpenRA.Widgets; + +namespace OpenRA.Mods.CA.Widgets.Logic +{ + public class UpgradeOrderButtonLogic : ChromeLogic + { + readonly World world; + + int selectionHash; + int upgradesHash; + + TraitPair[] upgradeables = Array.Empty>(); + TraitPair[] cancellables = Array.Empty>(); + UpgradesManager upgradesManager; + + [ObjectCreator.UseCtor] + public UpgradeOrderButtonLogic(Widget widget, World world) + { + this.world = world; + + upgradesManager = world.LocalPlayer.PlayerActor.Trait(); + + if (widget is ButtonWidget upgrade) + BindUpgradeButton(upgrade); + } + + void BindUpgradeButton(ButtonWidget button) + { + button.Get("ICON").GetImageName = () => GetButtonIcon(); + + button.IsVisible = () => true; + + button.IsDisabled = () => { UpdateStateIfSelectionChanged(); return false; }; + + button.IsHighlighted = () => world.OrderGenerator is UpgradeOrderGenerator; + + button.OnMouseUp = me => DoUpgrade(me.Modifiers.HasModifier(Modifiers.Shift)); + + button.OnKeyPress = e => DoUpgrade(e.Modifiers.HasModifier(Modifiers.Shift)); + } + + string GetButtonIcon() + { + return cancellables.Length > 0 ? "cancel" : (world.OrderGenerator is UpgradeOrderGenerator ? "upgrade-active" : "upgrade"); + } + + void UpdateStateIfSelectionChanged() + { + if (selectionHash == world.Selection.Hash && upgradesHash == upgradesManager.Hash) + return; + + var upgradeablesAndCancellables = world.Selection.Actors + .Where(a => a.Owner == world.LocalPlayer && a.IsInWorld) + .SelectMany(a => a.TraitsImplementing() + .Where(t => t.CanUpgrade || t.CanCancelUpgrade) + .Select(at => new TraitPair(a, at))); + + /* Limit to one upgradeable per actor. */ + upgradeables = upgradeablesAndCancellables.Where(t => t.Trait.CanUpgrade).GroupBy(t => t.Actor).Select(t => t.First()).ToArray(); + cancellables = upgradeablesAndCancellables.Where(t => t.Trait.CanCancelUpgrade).GroupBy(t => t.Actor).Select(t => t.First()).ToArray(); + selectionHash = world.Selection.Hash; + upgradesHash = upgradesManager.Hash; + } + + void DoUpgrade(bool queued) + { + /* If one or more selected units are upgrading, cancel them. */ + if (cancellables.Length > 0) + { + foreach (var u in upgradeables) + world.IssueOrder(new Order("CancelUpgrade", u.Actor, queued) { TargetString = u.Trait.Info.Type }); + + return; + } + + /* If one or more selected units can be upgraded, issue order for them to upgrade. */ + if (upgradeables.Length > 0) + { + foreach (var u in upgradeables) + world.IssueOrder(new Order("Upgrade", u.Actor, Target.FromActor(u.Actor), queued) { TargetString = u.Trait.Info.Type }); + return; + } + + /* If nothing is selected, or none of the selected units can be upgraded, toggle upgrade mode. */ + world.ToggleInputMode(); + } + } +} diff --git a/OpenRA.Mods.CA/Widgets/Logic/Lobby/LobbyMissionInfoLogic.cs b/OpenRA.Mods.CA/Widgets/Logic/Lobby/LobbyMissionInfoLogic.cs new file mode 100644 index 0000000000..6d92ffbf49 --- /dev/null +++ b/OpenRA.Mods.CA/Widgets/Logic/Lobby/LobbyMissionInfoLogic.cs @@ -0,0 +1,71 @@ +#region Copyright & License Information +/* + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using OpenRA.Mods.CA.Traits; +using OpenRA.Network; +using OpenRA.Widgets; + +namespace OpenRA.Mods.CA.Widgets.Logic +{ + public class LobbyMissionInfoLogic : ChromeLogic + { + readonly Func getMap; + string lastMapUid; + + [ObjectCreator.UseCtor] + internal LobbyMissionInfoLogic(Widget widget, OrderManager orderManager, Func getMap) + { + _ = widget; + _ = orderManager; + this.getMap = getMap; + + Game.LobbyInfoChanged += OnLobbyInfoChanged; + } + + void OnLobbyInfoChanged() + { + var map = getMap(); + if (map == null || map.WorldActorInfo == null) + return; + + var mapUid = map.Uid; + if (mapUid == lastMapUid) + return; + + lastMapUid = mapUid; + + var lobbyMissionInfos = map.WorldActorInfo.TraitInfos(); + + if (lobbyMissionInfos.Count == 0) + return; + + Game.RunAfterTick(() => { + foreach (var lobbyMissionInfo in lobbyMissionInfos) + { + var text = lobbyMissionInfo.Text; + var prefix = lobbyMissionInfo.Prefix; + var prefixColor = lobbyMissionInfo.PrefixColor; + var textColor = lobbyMissionInfo.TextColor; + + text = text.Replace("\\n", "\n"); + + TextNotificationsManager.AddChatLine(TextNotificationsManager.SystemClientId, prefix, text, prefixColor, textColor); + } + }); + } + + protected override void Dispose(bool disposing) + { + Game.LobbyInfoChanged -= OnLobbyInfoChanged; + base.Dispose(disposing); + } + } +} diff --git a/OpenRA.Mods.CA/Widgets/Logic/Lobby/LobbyOptionsLogicCA.cs b/OpenRA.Mods.CA/Widgets/Logic/Lobby/LobbyOptionsLogicCA.cs new file mode 100644 index 0000000000..dcb881a381 --- /dev/null +++ b/OpenRA.Mods.CA/Widgets/Logic/Lobby/LobbyOptionsLogicCA.cs @@ -0,0 +1,333 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using Newtonsoft.Json; +using OpenRA.Mods.Common.Widgets; +using OpenRA.Network; +using OpenRA.Primitives; +using OpenRA.Traits; +using OpenRA.Widgets; + +namespace OpenRA.Mods.CA.Widgets.Logic +{ + public class LobbyOptionsLogicCA : ChromeLogic + { + [FluentReference] + const string NotAvailable = "label-not-available"; + + readonly ScrollPanelWidget panel; + readonly Widget optionsContainer; + readonly Widget checkboxRowTemplate; + readonly Widget dropdownRowTemplate; + readonly Widget advancedHeaderTemplate; + readonly int yMargin; + + readonly Func getMap; + readonly OrderManager orderManager; + readonly Func configurationDisabled; + MapPreview mapPreview; + + readonly string savedOptionsFilePath; + private bool hasSavedOptions; + + [ObjectCreator.UseCtor] + internal LobbyOptionsLogicCA(Widget widget, OrderManager orderManager, Func getMap, Func configurationDisabled) + { + this.getMap = getMap; + this.orderManager = orderManager; + this.configurationDisabled = configurationDisabled; + + panel = (ScrollPanelWidget)widget; + optionsContainer = widget.Get("LOBBY_OPTIONS"); + yMargin = optionsContainer.Bounds.Y; + checkboxRowTemplate = optionsContainer.Get("CHECKBOX_ROW_TEMPLATE"); + dropdownRowTemplate = optionsContainer.Get("DROPDOWN_ROW_TEMPLATE"); + advancedHeaderTemplate = optionsContainer.Get("ADVANCED_HEADER_TEMPLATE"); + + var logDir = Platform.SupportDir + "Logs"; + savedOptionsFilePath = Path.Combine(logDir, "ca-lobbyoptions.log"); + hasSavedOptions = File.Exists(savedOptionsFilePath); + var loadOptions = widget.Parent.Get("LOAD_OPTIONS"); + var saveOptions = widget.Parent.Get("SAVE_OPTIONS"); + var resetOptions = widget.Parent.Get("RESET_OPTIONS"); + loadOptions.OnClick = () => LoadOptions(); + loadOptions.IsDisabled = () => !hasSavedOptions || configurationDisabled(); + saveOptions.OnClick = () => SaveOptions(); + saveOptions.IsDisabled = () => configurationDisabled(); + resetOptions.OnClick = () => ResetOptions(); + resetOptions.IsDisabled = () => configurationDisabled(); + + mapPreview = getMap(); + RebuildOptions(); + } + + public override void Tick() + { + var newMapPreview = getMap(); + if (newMapPreview == mapPreview) + return; + + // We are currently enumerating the widget tree and so can't modify any layout + // Defer it to the end of tick instead + Game.RunAfterTick(() => + { + mapPreview = newMapPreview; + RebuildOptions(); + }); + } + + void RebuildOptions() + { + if (mapPreview == null || mapPreview.WorldActorInfo == null) + return; + + optionsContainer.RemoveChildren(); + optionsContainer.Bounds.Height = 0; + var allOptions = GetOptions(); + + var regularOptions = allOptions.Where(o => o.DisplayOrder <= 999).ToArray(); + var advancedOptions = allOptions.Where(o => o.DisplayOrder > 999).ToArray(); + + AddOptionsSection(regularOptions); + + if (advancedOptions.Length > 0) + { + var divider = new ColoredRectangleWidget(); + divider.Color = Color.FromArgb(255, 32, 32, 32); + divider.Bounds.X = 10; + divider.Bounds.Y = optionsContainer.Bounds.Height + 5; + divider.Bounds.Width = optionsContainer.Bounds.Width - 20; + divider.Bounds.Height = 1; + optionsContainer.Bounds.Height += 10; + optionsContainer.AddChild(divider); + + var advancedHeader = advancedHeaderTemplate.Clone(); + advancedHeader.Bounds.Y = optionsContainer.Bounds.Height; + optionsContainer.Bounds.Height += advancedHeader.Bounds.Height; + optionsContainer.AddChild(advancedHeader); + + AddOptionsSection(advancedOptions); + } + + panel.ContentHeight = yMargin + optionsContainer.Bounds.Height; + optionsContainer.Bounds.Y = yMargin; + + panel.ScrollToTop(); + } + + void AddOptionsSection(IEnumerable options) + { + Widget row = null; + var checkboxColumns = new Queue(); + var dropdownColumns = new Queue(); + + foreach (var option in options.Where(o => o is LobbyBooleanOption)) + { + if (checkboxColumns.Count == 0) + { + row = checkboxRowTemplate.Clone(); + row.Bounds.Y = optionsContainer.Bounds.Height; + optionsContainer.Bounds.Height += row.Bounds.Height; + foreach (var child in row.Children) + if (child is CheckboxWidget childCheckbox) + checkboxColumns.Enqueue(childCheckbox); + + optionsContainer.AddChild(row); + } + + var checkbox = checkboxColumns.Dequeue(); + var optionEnabled = new PredictedCachedTransform( + gs => gs.LobbyOptions[option.Id].IsEnabled); + + var optionLocked = new CachedTransform( + gs => gs.LobbyOptions[option.Id].IsLocked); + + checkbox.GetText = () => option.Name; + checkbox.GetTooltipText = () => option.Name; + if (option.Description != null) + checkbox.GetTooltipDesc = () => option.Description; + + checkbox.IsVisible = () => true; + checkbox.IsChecked = () => optionEnabled.Update(orderManager.LobbyInfo.GlobalSettings); + checkbox.IsDisabled = () => configurationDisabled() || optionLocked.Update(orderManager.LobbyInfo.GlobalSettings); + checkbox.OnClick = () => + { + var state = !optionEnabled.Update(orderManager.LobbyInfo.GlobalSettings); + orderManager.IssueOrder(Order.Command($"option {option.Id} {state}")); + optionEnabled.Predict(state); + }; + } + + foreach (var option in options.Where(o => o is not LobbyBooleanOption)) + { + if (dropdownColumns.Count == 0) + { + row = dropdownRowTemplate.Clone(); + row.Bounds.Y = optionsContainer.Bounds.Height; + optionsContainer.Bounds.Height += row.Bounds.Height; + foreach (var child in row.Children) + if (child is DropDownButtonWidget dropDown) + dropdownColumns.Enqueue(dropDown); + + optionsContainer.AddChild(row); + } + + var dropdown = dropdownColumns.Dequeue(); + var optionValue = new CachedTransform( + gs => gs.LobbyOptions[option.Id]); + + var getOptionLabel = new CachedTransform(id => + { + if (id == null || !option.Values.TryGetValue(id, out var value)) + return FluentProvider.GetMessage(NotAvailable); + + return value; + }); + + dropdown.GetText = () => getOptionLabel.Update(optionValue.Update(orderManager.LobbyInfo.GlobalSettings).Value); + dropdown.GetTooltipText = () => option.Name; + if (option.Description != null) + dropdown.GetTooltipDesc = () => option.Description; + dropdown.IsVisible = () => true; + dropdown.IsDisabled = () => configurationDisabled() || + optionValue.Update(orderManager.LobbyInfo.GlobalSettings).IsLocked; + + dropdown.OnMouseDown = _ => + { + ScrollItemWidget SetupItem(KeyValuePair c, ScrollItemWidget template) + { + bool IsSelected() => optionValue.Update(orderManager.LobbyInfo.GlobalSettings).Value == c.Key; + void OnClick() => orderManager.IssueOrder(Order.Command($"option {option.Id} {c.Key}")); + + var item = ScrollItemWidget.Setup(template, IsSelected, OnClick); + item.Get("LABEL").GetText = () => c.Value; + return item; + } + + dropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", option.Values.Count * 30, option.Values, SetupItem); + }; + + var label = row.GetOrNull(dropdown.Id + "_DESC"); + if (label != null) + { + label.GetText = () => option.Name + ":"; + label.IsVisible = () => true; + } + } + } + + IEnumerable GetOptions() + { + return mapPreview.PlayerActorInfo.TraitInfos() + .Concat(mapPreview.WorldActorInfo.TraitInfos()) + .SelectMany(t => t.LobbyOptions(mapPreview)) + .Where(o => o.IsVisible) + .OrderBy(o => o.DisplayOrder) + .ToArray(); + } + + void LoadOptions() + { + if (!File.Exists(savedOptionsFilePath)) + return; + + try { + var savedOptionsFileContents = File.ReadAllText(savedOptionsFilePath); + var savedOptions = JsonConvert.DeserializeObject>(savedOptionsFileContents); + + foreach (var option in savedOptions) + orderManager.IssueOrder(Order.Command($"option {option.Key} {option.Value}")); + + TextNotificationsManager.AddChatLine(orderManager.Connection.LocalClientId, null, "Lobby options loaded.", Color.Lime, Color.Lime); + } + catch + { + TextNotificationsManager.AddChatLine(orderManager.Connection.LocalClientId, null, "Could not load lobby options.", Color.OrangeRed, Color.OrangeRed); + } + } + + void SaveOptions() + { + var allOptions = GetOptions(); + var options = new Dictionary(); + var previouslySavedOptions = new Dictionary(); + + if (hasSavedOptions) + { + try + { + var savedOptionsFileContents = File.ReadAllText(savedOptionsFilePath); + previouslySavedOptions = JsonConvert.DeserializeObject>(savedOptionsFileContents); + } + catch + { + // do nothing + } + } + + foreach (var option in allOptions.Where(o => o is LobbyBooleanOption)) + { + if (option.IsLocked && previouslySavedOptions.TryGetValue(option.Id, out var savedValue)) + { + options.Add(option.Id, savedValue); + continue; + } + + var optionEnabled = orderManager.LobbyInfo.GlobalSettings.OptionOrDefault(option.Id, false); + options.Add(option.Id, optionEnabled ? "True" : "False"); + } + + foreach (var option in allOptions.Where(o => o is not LobbyBooleanOption)) + { + if (option.IsLocked && previouslySavedOptions.TryGetValue(option.Id, out var savedValue)) + { + options.Add(option.Id, savedValue); + continue; + } + + var optionValue = orderManager.LobbyInfo.GlobalSettings.OptionOrDefault(option.Id, null); + if (optionValue != null) + options.Add(option.Id, optionValue); + } + + try { + var json = JsonConvert.SerializeObject(options); + File.WriteAllText(savedOptionsFilePath, json); + hasSavedOptions = true; + TextNotificationsManager.AddChatLine(orderManager.Connection.LocalClientId, null, "Lobby options saved.", Color.Lime, Color.Lime); + } + catch + { + TextNotificationsManager.AddChatLine(orderManager.Connection.LocalClientId, null, "Could not save lobby options.", Color.OrangeRed, Color.OrangeRed); + } + } + + void ResetOptions() + { + var allOptions = GetOptions(); + + foreach (var option in allOptions.Where(o => o is LobbyBooleanOption)) + { + orderManager.IssueOrder(Order.Command($"option {option.Id} {option.DefaultValue}")); + } + + foreach (var option in allOptions.Where(o => o is not LobbyBooleanOption)) + { + orderManager.IssueOrder(Order.Command($"option {option.Id} {option.DefaultValue}")); + } + + TextNotificationsManager.AddChatLine(orderManager.Connection.LocalClientId, null, "Lobby options reset.", Color.Lime, Color.Lime); + } + } +} diff --git a/OpenRA.Mods.CA/Widgets/Logic/MainMenuLogicCA.cs b/OpenRA.Mods.CA/Widgets/Logic/MainMenuLogicCA.cs new file mode 100644 index 0000000000..ddc5aa7db5 --- /dev/null +++ b/OpenRA.Mods.CA/Widgets/Logic/MainMenuLogicCA.cs @@ -0,0 +1,577 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using OpenRA.Mods.Common; +using OpenRA.Mods.Common.FileSystem; +using OpenRA.Mods.Common.Widgets; +using OpenRA.Mods.Common.Widgets.Logic; +using OpenRA.Network; +using OpenRA.Support; +using OpenRA.Widgets; + +namespace OpenRA.Mods.CA.Widgets.Logic +{ + public class MainMenuLogicCA : ChromeLogic + { + [FluentReference] + const string LoadingNews = "label-loading-news"; + + [FluentReference("message")] + const string NewsRetrivalFailed = "label-news-retrieval-failed"; + + [FluentReference("message")] + const string NewsParsingFailed = "label-news-parsing-failed"; + + [FluentReference("author", "datetime")] + const string AuthorDateTime = "label-author-datetime"; + + protected enum MenuType { Main, Singleplayer, Extras, MapEditor, StartupPrompts, None } + + protected enum MenuPanel { None, Missions, Skirmish, Multiplayer, MapEditor, Replays, GameSaves } + + protected MenuType menuType = MenuType.Main; + readonly Widget rootMenu; + readonly ScrollPanelWidget newsPanel; + readonly int maxNewsHeight; + readonly Widget newsTemplate; + readonly LabelWidget newsStatus; + readonly ModData modData; + + // Update news once per game launch + static bool fetchedNews; + + protected static MenuPanel lastGameState = MenuPanel.None; + + bool newsOpen; + + void SwitchMenu(MenuType type) + { + menuType = type; + + DiscordService.UpdateStatus(DiscordState.InMenu); + + // Update button mouseover + Game.RunAfterTick(Ui.ResetTooltips); + } + + [ObjectCreator.UseCtor] + public MainMenuLogicCA(Widget widget, World world, ModData modData) + { + this.modData = modData; + + rootMenu = widget; + + // Menu buttons + var mainMenu = widget.Get("MAIN_MENU"); + mainMenu.IsVisible = () => menuType == MenuType.Main; + + mainMenu.Get("SINGLEPLAYER_BUTTON").OnClick = () => SwitchMenu(MenuType.Singleplayer); + + mainMenu.Get("MULTIPLAYER_BUTTON").OnClick = OpenMultiplayerPanel; + + var contentButton = mainMenu.GetOrNull("CONTENT_BUTTON"); + if (contentButton != null) + { + var contentInstaller = modData.FileSystemLoader as ContentInstallerFileSystemLoader; + contentButton.Disabled = contentInstaller == null; + contentButton.OnClick = () => + { + // Switching mods changes the world state (by disposing it), + // so we can't do this inside the input handler. + Game.RunAfterTick(() => + { + if (contentInstaller != null) + Game.InitializeMod(contentInstaller.ContentInstallerMod, new Arguments()); + }); + }; + } + + mainMenu.Get("SETTINGS_BUTTON").OnClick = () => + { + SwitchMenu(MenuType.None); + Game.OpenWindow("SETTINGS_PANEL", new WidgetArgs + { + { "onExit", () => SwitchMenu(MenuType.Main) } + }); + }; + + mainMenu.Get("EXTRAS_BUTTON").OnClick = () => SwitchMenu(MenuType.Extras); + + mainMenu.Get("QUIT_BUTTON").OnClick = Game.Exit; + + // Singleplayer menu + var singleplayerMenu = widget.Get("SINGLEPLAYER_MENU"); + singleplayerMenu.IsVisible = () => menuType == MenuType.Singleplayer; + + var missionsButton = singleplayerMenu.Get("MISSIONS_BUTTON"); + missionsButton.OnClick = () => OpenMissionBrowserPanel(modData.MapCache.PickLastModifiedMap(MapVisibility.MissionSelector)); + + var hasCampaign = modData.Manifest.Missions.Length > 0; + var hasMissions = modData.MapCache + .Any(p => p.Status == MapStatus.Available && p.Visibility.HasFlag(MapVisibility.MissionSelector)); + + missionsButton.Disabled = !hasCampaign && !hasMissions; + + var hasMaps = modData.MapCache.Any(p => p.Visibility.HasFlag(MapVisibility.Lobby)); + var skirmishButton = singleplayerMenu.Get("SKIRMISH_BUTTON"); + skirmishButton.OnClick = StartSkirmishGame; + skirmishButton.Disabled = !hasMaps; + + var loadButton = singleplayerMenu.Get("LOAD_BUTTON"); + loadButton.IsDisabled = () => !GameSaveBrowserLogic.IsLoadPanelEnabled(modData.Manifest); + loadButton.OnClick = OpenGameSaveBrowserPanel; + + var encyclopediaButton = widget.GetOrNull("ENCYCLOPEDIA_BUTTON"); + if (encyclopediaButton != null) + encyclopediaButton.OnClick = OpenEncyclopediaPanel; + + singleplayerMenu.Get("BACK_BUTTON").OnClick = () => SwitchMenu(MenuType.Main); + + // Extras menu + var extrasMenu = widget.Get("EXTRAS_MENU"); + extrasMenu.IsVisible = () => menuType == MenuType.Extras; + + extrasMenu.Get("REPLAYS_BUTTON").OnClick = OpenReplayBrowserPanel; + + extrasMenu.Get("MUSIC_BUTTON").OnClick = () => + { + SwitchMenu(MenuType.None); + Ui.OpenWindow("MUSIC_PANEL", new WidgetArgs + { + { "onExit", () => SwitchMenu(MenuType.Extras) }, + { "world", world } + }); + }; + + extrasMenu.Get("MAP_EDITOR_BUTTON").OnClick = () => SwitchMenu(MenuType.MapEditor); + + var assetBrowserButton = extrasMenu.GetOrNull("ASSETBROWSER_BUTTON"); + if (assetBrowserButton != null) + assetBrowserButton.OnClick = () => + { + SwitchMenu(MenuType.None); + Game.OpenWindow("ASSETBROWSER_PANEL", new WidgetArgs + { + { "onExit", () => SwitchMenu(MenuType.Extras) }, + }); + }; + + extrasMenu.Get("CREDITS_BUTTON").OnClick = () => + { + SwitchMenu(MenuType.None); + Ui.OpenWindow("CREDITS_PANEL", new WidgetArgs + { + { "onExit", () => SwitchMenu(MenuType.Extras) }, + }); + }; + + extrasMenu.Get("BACK_BUTTON").OnClick = () => SwitchMenu(MenuType.Main); + + // Map editor menu + var mapEditorMenu = widget.Get("MAP_EDITOR_MENU"); + mapEditorMenu.IsVisible = () => menuType == MenuType.MapEditor; + + // Loading into the map editor + Game.BeforeGameStart += RemoveShellmapUI; + + var onSelect = new Action(uid => + { + if (modData.MapCache[uid].Status != MapStatus.Available) + SwitchMenu(MenuType.Extras); + else + LoadMapIntoEditor(modData.MapCache[uid].Uid); + }); + + var newMapButton = widget.Get("NEW_MAP_BUTTON"); + newMapButton.OnClick = () => + { + SwitchMenu(MenuType.None); + Game.OpenWindow("NEW_MAP_BG", new WidgetArgs() + { + { "onSelect", onSelect }, + { "onExit", () => SwitchMenu(MenuType.MapEditor) } + }); + }; + + var loadMapButton = widget.Get("LOAD_MAP_BUTTON"); + loadMapButton.OnClick = () => + { + SwitchMenu(MenuType.None); + Game.OpenWindow("MAPCHOOSER_PANEL", new WidgetArgs() + { + { "initialMap", null }, + { "remoteMapPool", null }, + { "initialTab", MapClassification.User }, + { "onExit", () => SwitchMenu(MenuType.MapEditor) }, + { "onSelect", onSelect }, + { "filter", MapVisibility.Lobby | MapVisibility.Shellmap | MapVisibility.MissionSelector }, + }); + }; + + loadMapButton.Disabled = !hasMaps; + + mapEditorMenu.Get("BACK_BUTTON").OnClick = () => SwitchMenu(MenuType.Extras); + + var newsBG = widget.GetOrNull("NEWS_BG"); + if (newsBG != null) + { + newsBG.IsVisible = () => Game.Settings.Game.FetchNews && menuType != MenuType.None && menuType != MenuType.StartupPrompts; + + newsPanel = Ui.LoadWidget("NEWS_PANEL", null, new WidgetArgs()); + newsTemplate = newsPanel.Get("NEWS_ITEM_TEMPLATE"); + newsPanel.RemoveChild(newsTemplate); + maxNewsHeight = newsPanel.Bounds.Height; + + newsStatus = newsPanel.Get("NEWS_STATUS"); + SetNewsStatus(FluentProvider.GetMessage(LoadingNews)); + } + + Game.OnRemoteDirectConnect += OnRemoteDirectConnect; + + // Check for updates in the background + var webServices = modData.Manifest.Get(); + if (Game.Settings.Debug.CheckVersion) + webServices.CheckModVersion(); + + var updateLabel = rootMenu.GetOrNull("UPDATE_NOTICE"); + if (updateLabel != null) + updateLabel.IsVisible = () => !newsOpen && menuType != MenuType.None && + menuType != MenuType.StartupPrompts && + webServices.ModVersionStatus == ModVersionStatus.Outdated; + + menuType = MenuType.StartupPrompts; + + void OnIntroductionComplete() + { + void OnSysInfoComplete() + { + LoadAndDisplayNews(webServices, newsBG); + SwitchMenu(MenuType.Main); + } + + if (SystemInfoPromptLogic.ShouldShowPrompt()) + { + Ui.OpenWindow("MAINMENU_SYSTEM_INFO_PROMPT", new WidgetArgs + { + { "onComplete", OnSysInfoComplete } + }); + } + else + OnSysInfoComplete(); + } + + if (IntroductionPromptLogic.ShouldShowPrompt()) + { + Game.OpenWindow("MAINMENU_INTRODUCTION_PROMPT", new WidgetArgs + { + { "onComplete", OnIntroductionComplete } + }); + } + else + OnIntroductionComplete(); + + Game.OnShellmapLoaded += OpenMenuBasedOnLastGame; + + DiscordService.UpdateStatus(DiscordState.InMenu); + } + + void LoadAndDisplayNews(WebServices webServices, Widget newsBG) + { + if (newsBG != null && Game.Settings.Game.FetchNews) + { + var cacheFile = Path.Combine(Platform.SupportDir, webServices.GameNewsFileName); + var currentNews = ParseNews(cacheFile); + if (currentNews != null) + DisplayNews(currentNews); + + var newsButton = newsBG.GetOrNull("NEWS_BUTTON"); + if (newsButton != null) + { + if (!fetchedNews) + { + Task.Run(async () => + { + try + { + var client = HttpClientFactory.Create(); + + // Send the mod and engine version to support version-filtered news (update prompts) + var url = new HttpQueryBuilder(webServices.GameNews) + { + { "version", Game.EngineVersion }, + { "mod", modData.Manifest.Id }, + { "modversion", modData.Manifest.Metadata.Version } + }.ToString(); + + // Parameter string is blank if the player has opted out + url += SystemInfoPromptLogic.CreateParameterString(); + + var response = await client.GetStringAsync(url); + await File.WriteAllTextAsync(cacheFile, response); + + Game.RunAfterTick(() => // run on the main thread + { + fetchedNews = true; + var newNews = ParseNews(cacheFile); + if (newNews == null) + return; + + DisplayNews(newNews); + + if (currentNews == null || newNews.Any(n => !currentNews.Select(c => c.DateTime).Contains(n.DateTime))) + OpenNewsPanel(newsButton); + }); + } + catch (Exception e) + { + Game.RunAfterTick(() => // run on the main thread + SetNewsStatus(FluentProvider.GetMessage(NewsRetrivalFailed, "message", e.Message))); + } + }); + } + + newsButton.OnClick = () => OpenNewsPanel(newsButton); + } + } + } + + void OpenNewsPanel(DropDownButtonWidget button) + { + newsOpen = true; + button.AttachPanel(newsPanel, () => newsOpen = false); + } + + void OnRemoteDirectConnect(ConnectionTarget endpoint) + { + SwitchMenu(MenuType.None); + Ui.OpenWindow("MULTIPLAYER_PANEL", new WidgetArgs + { + { "onStart", RemoveShellmapUI }, + { "onExit", () => SwitchMenu(MenuType.Main) }, + { "directConnectEndPoint", endpoint }, + }); + } + + static void LoadMapIntoEditor(string uid) + { + Game.LoadEditor(uid); + + DiscordService.UpdateStatus(DiscordState.InMapEditor); + + lastGameState = MenuPanel.MapEditor; + } + + void SetNewsStatus(string message) + { + message = WidgetUtils.WrapText(message, newsStatus.Bounds.Width, Game.Renderer.Fonts[newsStatus.Font]); + newsStatus.GetText = () => message; + } + + sealed class NewsItem + { + public string Title; + public string Author; + public DateTime DateTime; + public string Content; + } + + NewsItem[] ParseNews(string path) + { + if (!File.Exists(path)) + return null; + + try + { + return MiniYaml.FromFile(path).Select(node => + { + var nodesDict = node.Value.ToDictionary(); + return new NewsItem + { + Title = nodesDict["Title"].Value, + Author = nodesDict["Author"].Value, + DateTime = FieldLoader.GetValue("DateTime", node.Key), + Content = nodesDict["Content"].Value + }; + }).ToArray(); + } + catch (Exception ex) + { + SetNewsStatus(FluentProvider.GetMessage(NewsParsingFailed, "message", ex.Message)); + } + + return null; + } + + void DisplayNews(IEnumerable newsItems) + { + newsPanel.RemoveChildren(); + SetNewsStatus(""); + + foreach (var item in newsItems) + { + var newsItem = newsTemplate.Clone(); + + var titleLabel = newsItem.Get("TITLE"); + titleLabel.GetText = () => item.Title; + + var authorDateTimeLabel = newsItem.Get("AUTHOR_DATETIME"); + var authorDateTime = FluentProvider.GetMessage(AuthorDateTime, + "author", item.Author, + "datetime", item.DateTime.ToLocalTime().ToString(CultureInfo.CurrentCulture)); + + authorDateTimeLabel.GetText = () => authorDateTime; + + var contentLabel = newsItem.Get("CONTENT"); + var content = item.Content.Replace("\\n", "\n"); + content = WidgetUtils.WrapText(content, contentLabel.Bounds.Width, Game.Renderer.Fonts[contentLabel.Font]); + contentLabel.GetText = () => content; + contentLabel.Bounds.Height = Game.Renderer.Fonts[contentLabel.Font].Measure(content).Y; + newsItem.Bounds.Height += contentLabel.Bounds.Height; + + newsPanel.AddChild(newsItem); + newsPanel.Layout.AdjustChildren(); + newsPanel.Bounds.Height = Math.Min(newsPanel.ContentHeight, maxNewsHeight); + } + } + + void RemoveShellmapUI() + { + rootMenu.Parent.RemoveChild(rootMenu); + } + + void StartSkirmishGame() + { + SwitchMenu(MenuType.None); + + var map = modData.MapCache.ChooseInitialMap(modData.MapCache.PickLastModifiedMap(MapVisibility.Lobby) ?? Game.Settings.Server.Map, Game.CosmeticRandom); + Game.Settings.Server.Map = map; + Game.Settings.Save(); + + ConnectionLogic.Connect(Game.CreateLocalServer(map, isSkirmish: true), + "", + OpenSkirmishLobbyPanel, + () => { Game.CloseServer(); SwitchMenu(MenuType.Main); }); + } + + void OpenMissionBrowserPanel(string map) + { + SwitchMenu(MenuType.None); + Game.OpenWindow("MISSIONBROWSER_PANEL", new WidgetArgs + { + { "onExit", () => { Game.Disconnect(); SwitchMenu(MenuType.Singleplayer); } }, + { "onStart", () => { RemoveShellmapUI(); lastGameState = MenuPanel.Missions; } }, + { "initialMap", map } + }); + } + + void OpenEncyclopediaPanel() + { + SwitchMenu(MenuType.None); + Game.OpenWindow("ENCYCLOPEDIA_PANEL", new WidgetArgs + { + { "onExit", () => SwitchMenu(MenuType.Main) } + }); + } + + void OpenSkirmishLobbyPanel() + { + SwitchMenu(MenuType.None); + Game.OpenWindow("SERVER_LOBBY", new WidgetArgs + { + { "onExit", () => { Game.Disconnect(); SwitchMenu(MenuType.Singleplayer); } }, + { "onStart", () => { RemoveShellmapUI(); lastGameState = MenuPanel.Skirmish; } }, + { "skirmishMode", true } + }); + } + + void OpenMultiplayerPanel() + { + SwitchMenu(MenuType.None); + Ui.OpenWindow("MULTIPLAYER_PANEL", new WidgetArgs + { + { "onStart", () => { RemoveShellmapUI(); lastGameState = MenuPanel.Multiplayer; } }, + { "onExit", () => SwitchMenu(MenuType.Main) }, + { "directConnectEndPoint", null }, + }); + } + + void OpenReplayBrowserPanel() + { + SwitchMenu(MenuType.None); + Ui.OpenWindow("REPLAYBROWSER_PANEL", new WidgetArgs + { + { "onExit", () => SwitchMenu(MenuType.Extras) }, + { "onStart", () => { RemoveShellmapUI(); lastGameState = MenuPanel.Replays; } } + }); + } + + void OpenGameSaveBrowserPanel() + { + SwitchMenu(MenuType.None); + Ui.OpenWindow("GAMESAVE_BROWSER_PANEL", new WidgetArgs + { + { "onExit", () => SwitchMenu(MenuType.Singleplayer) }, + { "onStart", () => { RemoveShellmapUI(); lastGameState = MenuPanel.GameSaves; } }, + { "isSavePanel", false }, + { "world", null } + }); + } + + protected override void Dispose(bool disposing) + { + if (disposing) + { + Game.OnRemoteDirectConnect -= OnRemoteDirectConnect; + Game.BeforeGameStart -= RemoveShellmapUI; + } + + Game.OnShellmapLoaded -= OpenMenuBasedOnLastGame; + base.Dispose(disposing); + } + + void OpenMenuBasedOnLastGame() + { + switch (lastGameState) + { + case MenuPanel.Missions: + OpenMissionBrowserPanel(null); + break; + + case MenuPanel.Replays: + OpenReplayBrowserPanel(); + break; + + case MenuPanel.Skirmish: + StartSkirmishGame(); + break; + + case MenuPanel.Multiplayer: + OpenMultiplayerPanel(); + break; + + case MenuPanel.MapEditor: + SwitchMenu(MenuType.MapEditor); + break; + + case MenuPanel.GameSaves: + SwitchMenu(MenuType.Singleplayer); + break; + } + + lastGameState = MenuPanel.None; + } + } +} diff --git a/OpenRA.Mods.CA/Widgets/Logic/MenuNotificationsLogic.cs b/OpenRA.Mods.CA/Widgets/Logic/MenuNotificationsLogic.cs new file mode 100644 index 0000000000..4c69644393 --- /dev/null +++ b/OpenRA.Mods.CA/Widgets/Logic/MenuNotificationsLogic.cs @@ -0,0 +1,349 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net; +using System.Threading.Tasks; +using Newtonsoft.Json; +using OpenRA.Mods.Common.Widgets; +using OpenRA.Primitives; +using OpenRA.Support; +using OpenRA.Widgets; + +namespace OpenRA.Mods.CA.Widgets.Logic +{ + public enum ReleaseType { Full, PreRelease, DevTest, Invalid }; + + public class MenuNotificationsLogic : ChromeLogic + { + readonly Widget widget; + readonly string versionCheckFilePath; + readonly string currentVersion; + bool updateAvailable; + bool hasNotifications; + + Widget newVersionWidget; + Widget notificationsWidget; + LabelWidget newVersionLabel; + ExternalLinkButtonWidget downloadButton; + ScrollPanelWidget notificationsPanel; + Widget notificationTemplate; + + [ObjectCreator.UseCtor] + public MenuNotificationsLogic(Widget widget, ModData modData) + { + this.widget = widget; + var logDir = Platform.SupportDir + "Logs"; + versionCheckFilePath = Path.Combine(logDir, "ca-versioncheck.log"); + currentVersion = modData.Manifest.Metadata.Version; + + newVersionWidget = widget.Get("NEW_VERSION"); + notificationsWidget = widget.Get("NOTIFICATIONS"); + + newVersionLabel = newVersionWidget.Get("NEW_VERSION_LABEL"); + downloadButton = newVersionWidget.Get("NEW_VERSION_BUTTON"); + + notificationsPanel = notificationsWidget.Get("NOTIFICATIONS_PANEL"); + notificationTemplate = notificationsPanel.Get("NOTIFICATION_TEMPLATE"); + notificationTemplate.IsVisible = () => false; + + // Show update widget if update available, otherwise show notifications widget if available + newVersionWidget.IsVisible = () => !Game.Settings.Debug.PerfGraph && updateAvailable; + notificationsWidget.IsVisible = () => !Game.Settings.Debug.PerfGraph && !updateAvailable && hasNotifications + && widget.Parent.GetOrNull("MENUS").Children.Any(c => c.IsVisible()); + + CheckForUpdatesAndNotifications(); + } + + async void CheckForUpdatesAndNotifications() + { + var versionCheck = GetLastVersionCheck(); + if (versionCheck.FromVersion == currentVersion + && (DateTime.UtcNow - versionCheck.LastChecked).TotalHours < 3 + && versionCheck.Release != null + && versionCheck.Release.tag_name != currentVersion) + { + DisplayAvailableUpdate(versionCheck.Release); + return; + } + + await Task.Run(async () => + { + try + { + await CheckForUpdates(versionCheck); + + // Only check for notifications if no update was found + if (!updateAvailable) + await FetchNotifications(); + } + catch + { + // If version check fails, still try to fetch notifications + if (!updateAvailable) + { + try + { + await FetchNotifications(); + } + catch + { + // Silently fail - this is not critical functionality + } + } + } + }); + } + + async Task CheckForUpdates(VersionCheck versionCheck) + { + if (currentVersion == "prep-CA") + return; + + var releases = await GetReleases(false); + var currentReleaseType = GetCurrentReleaseType(); + + if (currentReleaseType == ReleaseType.DevTest) + { + var devReleases = await GetReleases(true); + releases = releases.Concat(devReleases).ToList(); + } + + releases = releases.Where(r => r.ReleaseType != ReleaseType.Invalid).OrderByDescending(r => r.created_at).ToList(); + + foreach (var release in releases) + { + if (release.draft || release.name.Contains("Draft")) + continue; + + // For devtest releases, only consider versions that are at least 30 minutes old + if (release.ReleaseType == ReleaseType.DevTest && (DateTime.UtcNow - release.created_at).TotalMinutes < 30) + continue; + + // If the current release is a full release, ignore pre-releases and dev tests + if (currentReleaseType == ReleaseType.Full && (release.ReleaseType == ReleaseType.PreRelease || release.ReleaseType == ReleaseType.DevTest)) + continue; + + // If the current release is a pre-release, ignore dev tests + if (currentReleaseType == ReleaseType.PreRelease && release.ReleaseType == ReleaseType.DevTest) + continue; + + // If the current release matches the release we are checking, we can stop here since all subsequent releases will be older + if (release.tag_name == currentVersion) + { + versionCheck.Release = release; + break; + } + + var currentRelease = releases.FirstOrDefault(r => r.tag_name == currentVersion); + + // If the current release is newer than the release we are checking, we can stop here since all subsequent releases will be older + if (currentRelease != null && release.created_at < currentRelease.created_at) + break; + + DisplayAvailableUpdate(release); + versionCheck.Release = release; + break; + } + + SetLastVersionCheck(versionCheck); + } + + async Task> GetReleases(bool dev) + { + var apiUrl = dev ? "https://api.github.com/repos/Darkademic/CAmod/releases" : "https://api.github.com/repos/Inq8/CAmod/releases"; + var client = HttpClientFactory.Create(); + client.DefaultRequestHeaders.Add("User-Agent", "OpenRA-CombinedArms"); + client.DefaultRequestHeaders.Add("Accept", "application/vnd.github+json"); + var httpResponseMessage = await client.GetAsync(apiUrl); + httpResponseMessage.EnsureSuccessStatusCode(); + var responseContent = await httpResponseMessage.Content.ReadAsStringAsync(); + return JsonConvert.DeserializeObject>(responseContent); + } + + void DisplayAvailableUpdate(Release release) + { + updateAvailable = true; + newVersionLabel.Text = "Version " + release.tag_name + " is available!"; + downloadButton.Url = release.html_url; + } + + async Task FetchNotifications() + { + var apiUrl = $"https://raw.githubusercontent.com/darkademic/ca-notifications/refs/heads/main/{currentVersion}.json"; + var client = HttpClientFactory.Create(); + client.DefaultRequestHeaders.Add("User-Agent", "OpenRA-CombinedArms"); + client.DefaultRequestHeaders.Add("Accept", "application/vnd.github+json"); + + var httpResponseMessage = await client.GetAsync(apiUrl); + + // If 404, just return silently - no notifications for this version + if (httpResponseMessage.StatusCode == HttpStatusCode.NotFound) + return; + + httpResponseMessage.EnsureSuccessStatusCode(); + var responseContent = await httpResponseMessage.Content.ReadAsStringAsync(); + var data = JsonConvert.DeserializeObject(responseContent); + + if (data?.Notifications != null && data.Notifications.Count > 0) + { + Game.RunAfterTick(() => DisplayNotifications(data.Notifications)); + } + } + + void DisplayNotifications(List notifications) + { + notificationsPanel.RemoveChildren(); + + var yOffset = 0; + foreach (var notification in notifications.OrderByDescending(n => n.Date)) + { + var template = notificationTemplate.Clone(); + template.IsVisible = () => true; + + var titleLabel = template.Get("NOTIFICATION_TITLE"); + var bodyLabel = template.Get("NOTIFICATION_BODY"); + + var titleFont = Game.Renderer.Fonts[titleLabel.Font]; + var bodyFont = Game.Renderer.Fonts[bodyLabel.Font]; + + // Measure title height + var titleTextHeight = titleFont.Measure(notification.Title).Y; + + // Measure body height with proper wrapping + var bodyWidth = bodyLabel.Bounds.Width; + var wrappedBody = WidgetUtils.WrapText(notification.Body, bodyWidth, bodyFont); + var bodyTextHeight = bodyFont.Measure(wrappedBody).Y; + + // Set text + titleLabel.GetText = () => notification.Title; + bodyLabel.GetText = () => wrappedBody; + + if (Color.TryParse(notification.TitleColor, out var color)) + titleLabel.TextColor = color; + + // Position labels + titleLabel.Bounds.Y = 0; + titleLabel.Bounds.Height = titleTextHeight + 4; + + bodyLabel.Bounds.Y = titleLabel.Bounds.Height; + bodyLabel.Bounds.Height = bodyTextHeight + 8; + + // Set container position and height + template.Bounds.Y = yOffset; + template.Bounds.Height = titleLabel.Bounds.Height + bodyLabel.Bounds.Height; + + notificationsPanel.AddChild(template); + yOffset += template.Bounds.Height; + } + + notificationsPanel.Layout.AdjustChildren(); + hasNotifications = true; + } + + ReleaseType GetCurrentReleaseType() + { + if (currentVersion.Contains("DevTest") || currentVersion == "prep-CA") + return ReleaseType.DevTest; + else if (currentVersion.Contains("PreRelease")) + return ReleaseType.PreRelease; + + return ReleaseType.Full; + } + + VersionCheck GetLastVersionCheck() + { + var versionCheck = new VersionCheck() + { + LastChecked = DateTime.MinValue + }; + + if (!File.Exists(versionCheckFilePath)) + return versionCheck; + + try + { + var lastVersionCheckFileContents = File.ReadAllText(versionCheckFilePath); + var lastVersionCheck = JsonConvert.DeserializeObject(lastVersionCheckFileContents); + if (lastVersionCheck != null) + versionCheck = lastVersionCheck; + } + catch + { + // do nothing + } + + return versionCheck; + } + + void SetLastVersionCheck(VersionCheck versionCheck) + { + versionCheck.FromVersion = currentVersion; + versionCheck.LastChecked = DateTime.UtcNow; + var json = JsonConvert.SerializeObject(versionCheck); + File.WriteAllText(versionCheckFilePath, json); + } + + class VersionCheck + { + public string FromVersion { get; set; } + public DateTime LastChecked { get; set; } + public Release Release { get; set; } + } + + class Release + { + public string name { get; set; } + public string tag_name { get; set; } + public string html_url { get; set; } + public bool prerelease { get; set; } + public bool draft { get; set; } + public DateTime created_at { get; set; } + + public ReleaseType ReleaseType + { + get + { + if (prerelease && tag_name.Contains("PreRelease")) + return ReleaseType.PreRelease; + if (prerelease && tag_name.Contains("DevTest")) + return ReleaseType.DevTest; + if (!prerelease && System.Text.RegularExpressions.Regex.IsMatch(tag_name, @"^\d+\.\d+(\.\d+)?$")) + return ReleaseType.Full; + return ReleaseType.Invalid; + } + } + } + + class NotificationsData + { + [JsonProperty("notifications")] + public List Notifications { get; set; } + } + + class Notification + { + [JsonProperty("date")] + public DateTime Date { get; set; } + + [JsonProperty("title")] + public string Title { get; set; } + + [JsonProperty("titleColor")] + public string TitleColor { get; set; } + + [JsonProperty("body")] + public string Body { get; set; } + } + } +} diff --git a/OpenRA.Mods.CA/Widgets/Logic/MissionBrowserLogicCA.cs b/OpenRA.Mods.CA/Widgets/Logic/MissionBrowserLogicCA.cs new file mode 100644 index 0000000000..c8a817a425 --- /dev/null +++ b/OpenRA.Mods.CA/Widgets/Logic/MissionBrowserLogicCA.cs @@ -0,0 +1,628 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading; +using Newtonsoft.Json; +using OpenRA.Graphics; +using OpenRA.Mods.CA.Traits; +using OpenRA.Mods.Common.Traits; +using OpenRA.Network; +using OpenRA.Traits; +using OpenRA.Widgets; + +namespace OpenRA.Mods.Common.Widgets.Logic +{ + public class MissionBrowserLogicCA : ChromeLogic + { + enum PlayingVideo { None, Info, Briefing, GameStart } + enum PanelType { MissionInfo, Options } + + [FluentReference] + const string NoVideoTitle = "dialog-no-video.title"; + + [FluentReference] + const string NoVideoPrompt = "dialog-no-video.prompt"; + + [FluentReference] + const string NoVideoCancel = "dialog-no-video.cancel"; + + [FluentReference] + const string CantPlayTitle = "dialog-cant-play-video.title"; + + [FluentReference] + const string CantPlayPrompt = "dialog-cant-play-video.prompt"; + + [FluentReference] + const string CantPlayCancel = "dialog-cant-play-video.cancel"; + + readonly ModData modData; + readonly Action onStart; + readonly Widget missionDetail; + readonly Widget optionsContainer; + readonly Widget checkboxRowTemplate; + readonly Widget dropdownRowTemplate; + readonly ScrollPanelWidget descriptionPanel; + readonly LabelWidget description; + readonly SpriteFont descriptionFont; + readonly ButtonWidget startBriefingVideoButton; + readonly ButtonWidget stopBriefingVideoButton; + readonly ButtonWidget startInfoVideoButton; + readonly ButtonWidget stopInfoVideoButton; + readonly VideoPlayerWidget videoPlayer; + readonly BackgroundWidget fullscreenVideoPlayer; + + readonly ScrollPanelWidget missionList; + readonly ScrollItemWidget headerTemplate; + readonly ScrollItemWidget template; + + MapPreview selectedMap; + PlayingVideo playingVideo; + readonly Dictionary missionOptions = new(); + PanelType panel = PanelType.MissionInfo; + readonly string savedOptionsFilePath; + Dictionary campaignProgress = new(); + + [ObjectCreator.UseCtor] + public MissionBrowserLogicCA(Widget widget, ModData modData, World world, Action onStart, Action onExit, string initialMap) + { + this.modData = modData; + this.onStart = onStart; + Game.BeforeGameStart += OnGameStart; + + var logDir = Platform.SupportDir + "Logs"; + savedOptionsFilePath = Path.Combine(logDir, "ca-missionoptions.log"); + campaignProgress = CampaignProgressTracker.GetCampaignProgress(); + + missionList = widget.Get("MISSION_LIST"); + + headerTemplate = widget.Get("HEADER"); + template = widget.Get("TEMPLATE"); + + var title = widget.GetOrNull("MISSIONBROWSER_TITLE"); + if (title != null) + { + var titleText = title.GetText(); + title.GetText = () => playingVideo != PlayingVideo.None ? selectedMap.Title : titleText; + } + + widget.Get("MISSION_INFO").IsVisible = () => selectedMap != null; + + var previewWidget = widget.Get("MISSION_PREVIEW"); + previewWidget.Preview = () => selectedMap; + previewWidget.IsVisible = () => playingVideo == PlayingVideo.None; + + videoPlayer = widget.Get("MISSION_VIDEO"); + widget.Get("MISSION_BIN").IsVisible = () => playingVideo != PlayingVideo.None; + fullscreenVideoPlayer = Ui.LoadWidget("FULLSCREEN_PLAYER", Ui.Root, new WidgetArgs { { "world", world } }); + + missionDetail = widget.Get("MISSION_DETAIL"); + + descriptionPanel = missionDetail.Get("MISSION_DESCRIPTION_PANEL"); + descriptionPanel.IsVisible = () => panel == PanelType.MissionInfo; + + description = descriptionPanel.Get("MISSION_DESCRIPTION"); + descriptionFont = Game.Renderer.Fonts[description.Font]; + + optionsContainer = missionDetail.Get("MISSION_OPTIONS"); + optionsContainer.IsVisible = () => panel == PanelType.Options; + checkboxRowTemplate = optionsContainer.Get("CHECKBOX_ROW_TEMPLATE"); + dropdownRowTemplate = optionsContainer.Get("DROPDOWN_ROW_TEMPLATE"); + + startBriefingVideoButton = widget.Get("START_BRIEFING_VIDEO_BUTTON"); + stopBriefingVideoButton = widget.Get("STOP_BRIEFING_VIDEO_BUTTON"); + stopBriefingVideoButton.IsVisible = () => playingVideo == PlayingVideo.Briefing; + stopBriefingVideoButton.OnClick = () => StopVideo(videoPlayer); + + startInfoVideoButton = widget.Get("START_INFO_VIDEO_BUTTON"); + stopInfoVideoButton = widget.Get("STOP_INFO_VIDEO_BUTTON"); + stopInfoVideoButton.IsVisible = () => playingVideo == PlayingVideo.Info; + stopInfoVideoButton.OnClick = () => StopVideo(videoPlayer); + + var allPreviews = new List(); + missionList.RemoveChildren(); + + // Add a group for each campaign + if (modData.Manifest.Missions.Length > 0) + { + var stringPool = new HashSet(); // Reuse common strings in YAML + var yaml = MiniYaml.Merge(modData.Manifest.Missions.Select( + m => MiniYaml.FromStream(modData.DefaultFileSystem.Open(m), m, stringPool: stringPool))); + + foreach (var kv in yaml) + { + var missionMapPaths = kv.Value.Nodes.Select(n => n.Key).ToList(); + + var previews = modData.MapCache + .Where(p => p.Class == MapClassification.System && p.Status == MapStatus.Available) + .Select(p => new + { + Preview = p, + Index = missionMapPaths.IndexOf(Path.GetFileName(p.Package.Name)) + }) + .Where(x => x.Index != -1) + .OrderBy(x => x.Index) + .Select(x => x.Preview) + .ToList(); + + if (previews.Count != 0) + { + CreateMissionGroup(kv.Key, previews, onExit); + allPreviews.AddRange(previews); + } + } + } + + // Add an additional group for loose missions + var loosePreviews = modData.MapCache + .Where(p => p.Status == MapStatus.Available && + p.Visibility.HasFlag(MapVisibility.MissionSelector) && + !allPreviews.Any(a => a.Uid == p.Uid)) + .ToList(); + + if (loosePreviews.Count != 0) + { + CreateMissionGroup("Missions", loosePreviews, onExit); + allPreviews.AddRange(loosePreviews); + } + + if (allPreviews.Count > 0) + { + var uid = modData.MapCache.GetUpdatedMap(initialMap); + var map = uid == null ? null : modData.MapCache[uid]; + if (map != null && map.Visibility.HasFlag(MapVisibility.MissionSelector)) + { + SelectMap(map); + missionList.ScrollToSelectedItem(); + } + else + SelectMap(allPreviews[0]); + } + + // Preload map preview to reduce jank + new Thread(() => + { + foreach (var p in allPreviews) + p.GetMinimap(); + }).Start(); + + var startButton = widget.Get("STARTGAME_BUTTON"); + startButton.OnClick = () => StartMissionClicked(onExit); + startButton.IsDisabled = () => selectedMap == null; + + widget.Get("BACK_BUTTON").OnClick = () => + { + StopVideo(videoPlayer); + Ui.CloseWindow(); + onExit(); + }; + + var tabContainer = widget.Get("MISSION_TABS"); + tabContainer.IsVisible = () => true; + + var optionsTab = tabContainer.Get("OPTIONS_TAB"); + optionsTab.IsHighlighted = () => panel == PanelType.Options; + optionsTab.IsDisabled = () => false; + optionsTab.OnClick = () => panel = PanelType.Options; + + var missionTab = tabContainer.Get("MISSIONINFO_TAB"); + missionTab.IsHighlighted = () => panel == PanelType.MissionInfo; + missionTab.IsDisabled = () => false; + missionTab.OnClick = () => panel = PanelType.MissionInfo; + } + + void OnGameStart() + { + Ui.CloseWindow(); + + DiscordService.UpdateStatus(DiscordState.PlayingCampaign); + + onStart(); + } + + bool disposed; + protected override void Dispose(bool disposing) + { + if (disposing && !disposed) + { + disposed = true; + Game.BeforeGameStart -= OnGameStart; + } + + base.Dispose(disposing); + } + + void CreateMissionGroup(string title, IEnumerable previews, Action onExit) + { + var header = ScrollItemWidget.Setup(headerTemplate, () => false, () => { }); + header.Get("LABEL").GetText = () => title; + missionList.AddChild(header); + + foreach (var preview in previews) + { + var item = ScrollItemWidget.Setup(template, + () => selectedMap != null && selectedMap.Uid == preview.Uid, + () => SelectMap(preview), + () => StartMissionClicked(onExit)); + + var label = item.Get("TITLE"); + var missionTitle = CampaignProgressTracker.GetMapTitleWithoutNumber(preview.Title); + + if (campaignProgress.ContainsKey(missionTitle)) + { + var missionProgress = campaignProgress[missionTitle]; + + var difficulty = missionProgress.Difficulty; + if (difficulty != null) + { + var firstStar = item.Get("COMPLETION_STAR"); + firstStar.IsVisible = () => true; + firstStar.GetImageName = () => + { + return difficulty switch + { + "easy" => "bronze", + "normal" => "silver", + _ => "gold" + }; + }; + + if (difficulty == "vhard" || difficulty == "brutal") + { + var secondStar = firstStar.Clone(); + secondStar.Bounds.X -= firstStar.Bounds.Width; + item.AddChild(secondStar); + } + + if (difficulty == "brutal") + { + var thirdStar = firstStar.Clone(); + thirdStar.Bounds.X -= 2 * firstStar.Bounds.Width; + item.AddChild(thirdStar); + } + } + + var difficultyCompleted = difficulty != null ? FluentProvider.GetMessage($"options-difficulty.{difficulty}") : null; + + if (difficultyCompleted != null) + item.GetTooltipText = () => $"Completed ({difficultyCompleted})"; + else + item.GetTooltipText = () => "Completed"; + + var dateCompleted = missionProgress.DateCompleted.ToString("d"); + var completionTime = missionProgress.Time; + + var details = $"• Date: {dateCompleted}\n• Version: {missionProgress.Version}\n• Duration: {completionTime}\n• Speed: {missionProgress.Speed}"; + + if (missionProgress.FogEnabled.HasValue) + details += $"\n• Fog: {(missionProgress.FogEnabled.Value ? "Enabled" : "Disabled")}"; + + if (missionProgress.BuildRadiusEnabled.HasValue) + details += $"\n• Build Radius: {(missionProgress.BuildRadiusEnabled.Value ? "Enabled" : "Disabled")}"; + + if (missionProgress.RespawnEnabled.HasValue) + details += $"\n• Respawns: {(missionProgress.RespawnEnabled.Value ? "Enabled" : "Disabled")}"; + + item.GetTooltipDesc = () => details; + + var tick = item.Get("COMPLETION_ICON"); + tick.GetImageName = () => "complete"; + } + else + { + item.GetTooltipText = () => "Not Completed"; + } + + WidgetUtils.TruncateLabelToTooltip(label, preview.Title); + + missionList.AddChild(item); + } + } + + void SelectMap(MapPreview preview) + { + selectedMap = preview; + + var briefingVideo = ""; + var briefingVideoVisible = false; + + var infoVideo = ""; + var infoVideoVisible = false; + + panel = PanelType.MissionInfo; + + new Thread(() => + { + var missionData = preview.WorldActorInfo.TraitInfoOrDefault(); + if (missionData != null) + { + briefingVideo = missionData.BriefingVideo; + briefingVideoVisible = briefingVideo != null; + + infoVideo = missionData.BackgroundVideo; + infoVideoVisible = infoVideo != null; + + var briefingText = missionData.Briefing?.Replace("\\n", "\n"); + var briefing = WidgetUtils.WrapText(briefingText, description.Bounds.Width, descriptionFont); + var height = descriptionFont.Measure(briefing).Y; + Game.RunAfterTick(() => + { + if (preview == selectedMap) + { + description.Text = briefing; + description.Bounds.Height = height; + descriptionPanel.Layout.AdjustChildren(); + } + }); + } + }).Start(); + + startBriefingVideoButton.IsVisible = () => briefingVideoVisible && playingVideo != PlayingVideo.Briefing; + startBriefingVideoButton.OnClick = () => PlayVideo(videoPlayer, briefingVideo, PlayingVideo.Briefing); + + startInfoVideoButton.IsVisible = () => infoVideoVisible && playingVideo != PlayingVideo.Info; + startInfoVideoButton.OnClick = () => PlayVideo(videoPlayer, infoVideo, PlayingVideo.Info); + + descriptionPanel.ScrollToTop(); + + RebuildOptions(); + } + + void RebuildOptions() + { + if (selectedMap == null || selectedMap.WorldActorInfo == null) + return; + + LoadSavedOptions(); + + // missionOptions.Clear(); + optionsContainer.RemoveChildren(); + + var allOptions = selectedMap.PlayerActorInfo.TraitInfos() + .Concat(selectedMap.WorldActorInfo.TraitInfos()) + .SelectMany(t => t.LobbyOptions(selectedMap)) + .Where(o => o.IsVisible) + .OrderBy(o => o.DisplayOrder).ToArray(); + + Widget row = null; + var checkboxColumns = new Queue(); + var dropdownColumns = new Queue(); + + var yOffset = 0; + foreach (var option in allOptions.Where(o => o is LobbyBooleanOption)) + { + if (!missionOptions.ContainsKey(option.Id) || !( new[] { "True", "False" }.Contains(missionOptions[option.Id]))) + missionOptions[option.Id] = option.DefaultValue; + + if (checkboxColumns.Count == 0) + { + row = checkboxRowTemplate.Clone(); + row.Bounds.Y = yOffset; + yOffset += row.Bounds.Height; + foreach (var child in row.Children) + if (child is CheckboxWidget childCheckbox) + checkboxColumns.Enqueue(childCheckbox); + + optionsContainer.AddChild(row); + } + + var checkbox = checkboxColumns.Dequeue(); + + checkbox.GetText = () => option.Name; + if (option.Description != null) + checkbox.GetTooltipText = () => option.Description; + + checkbox.IsVisible = () => true; + checkbox.IsChecked = () => missionOptions[option.Id] == "True"; + checkbox.IsDisabled = () => option.IsLocked; + checkbox.OnClick = () => + { + if (missionOptions[option.Id] == "True") + missionOptions[option.Id] = "False"; + else + missionOptions[option.Id] = "True"; + + SaveOptions(); + }; + } + + foreach (var option in allOptions.Where(o => o is not LobbyBooleanOption)) + { + if (!missionOptions.ContainsKey(option.Id) || !option.Values.Select(opt => opt.Key).Contains(missionOptions[option.Id])) + missionOptions[option.Id] = option.DefaultValue; + + if (dropdownColumns.Count == 0) + { + row = dropdownRowTemplate.Clone(); + row.Bounds.Y = yOffset; + yOffset += row.Bounds.Height; + foreach (var child in row.Children) + if (child is DropDownButtonWidget dropDown) + dropdownColumns.Enqueue(dropDown); + + optionsContainer.AddChild(row); + } + + var dropdown = dropdownColumns.Dequeue(); + + dropdown.GetText = () => option.Values[missionOptions[option.Id]]; + if (option.Description != null) + dropdown.GetTooltipText = () => option.Description; + dropdown.IsVisible = () => true; + dropdown.IsDisabled = () => option.IsLocked; + + dropdown.OnMouseDown = _ => + { + ScrollItemWidget SetupItem(KeyValuePair c, ScrollItemWidget template) + { + bool IsSelected() => missionOptions[option.Id] == c.Key; + void OnClick() + { + missionOptions[option.Id] = c.Key; + SaveOptions(); + } + + var item = ScrollItemWidget.Setup(template, IsSelected, OnClick); + item.Get("LABEL").GetText = () => c.Value; + return item; + } + + dropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", option.Values.Count * 30, option.Values, SetupItem); + }; + + var label = row.GetOrNull(dropdown.Id + "_DESC"); + if (label != null) + { + label.GetText = () => option.Name + ":"; + label.IsVisible = () => true; + } + } + } + + float cachedSoundVolume; + float cachedMusicVolume; + void MuteSounds() + { + cachedSoundVolume = Game.Sound.SoundVolume; + cachedMusicVolume = Game.Sound.MusicVolume; + Game.Sound.SoundVolume = Game.Sound.MusicVolume = 0; + } + + void UnMuteSounds() + { + if (cachedSoundVolume > 0) + Game.Sound.SoundVolume = cachedSoundVolume; + + if (cachedMusicVolume > 0) + Game.Sound.MusicVolume = cachedMusicVolume; + } + + void PlayVideo(VideoPlayerWidget player, string video, PlayingVideo pv, Action onComplete = null) + { + if (!modData.DefaultFileSystem.Exists(video)) + { + ConfirmationDialogs.ButtonPrompt(modData, + title: NoVideoTitle, + text: NoVideoPrompt, + onCancel: () => { }, + cancelText: NoVideoCancel); + } + else + { + StopVideo(player); + + playingVideo = pv; + player.LoadAndPlay(video); + + if (player.Video == null) + { + StopVideo(player); + + ConfirmationDialogs.ButtonPrompt(modData, + title: CantPlayTitle, + text: CantPlayPrompt, + onCancel: () => { }, + cancelText: CantPlayCancel); + } + else + { + // video playback runs asynchronously + player.PlayThen(() => + { + StopVideo(player); + onComplete?.Invoke(); + }); + + // Mute other distracting sounds + MuteSounds(); + } + } + } + + void StopVideo(VideoPlayerWidget player) + { + if (playingVideo == PlayingVideo.None) + return; + + UnMuteSounds(); + player.Stop(); + playingVideo = PlayingVideo.None; + } + + void StartMissionClicked(Action onExit) + { + StopVideo(videoPlayer); + + // If selected mission becomes unavailable, exit MissionBrowser to refresh + var map = modData.MapCache.GetUpdatedMap(selectedMap.Uid); + if (map == null) + { + Game.Disconnect(); + Ui.CloseWindow(); + onExit(); + return; + } + + selectedMap = modData.MapCache[map]; + var orders = new List(); + + foreach (var option in missionOptions) + orders.Add(Order.Command($"option {option.Key} {option.Value}")); + + orders.Add(Order.Command($"state {Session.ClientState.Ready}")); + + var missionData = selectedMap.WorldActorInfo.TraitInfoOrDefault(); + if (missionData != null && missionData.StartVideo != null && modData.DefaultFileSystem.Exists(missionData.StartVideo)) + { + var fsPlayer = fullscreenVideoPlayer.Get("PLAYER"); + fullscreenVideoPlayer.Visible = true; + PlayVideo(fsPlayer, missionData.StartVideo, PlayingVideo.GameStart, + () => Game.CreateAndStartLocalServer(selectedMap.Uid, orders)); + } + else + Game.CreateAndStartLocalServer(selectedMap.Uid, orders); + } + + void LoadSavedOptions() + { + if (!File.Exists(savedOptionsFilePath)) + return; + + try + { + var savedOptionsFileContents = File.ReadAllText(savedOptionsFilePath); + var savedOptions = JsonConvert.DeserializeObject>(savedOptionsFileContents); + + foreach(KeyValuePair option in savedOptions) + missionOptions[option.Key] = option.Value; + } + catch + { + // do nothing + } + } + + void SaveOptions() + { + try + { + var json = JsonConvert.SerializeObject(missionOptions); + File.WriteAllText(savedOptionsFilePath, json); + } + catch + { + // do nothing + } + } + } +} diff --git a/OpenRA.Mods.CA/Widgets/Logic/SimpleTooltipWithDescLogic.cs b/OpenRA.Mods.CA/Widgets/Logic/SimpleTooltipWithDescLogic.cs new file mode 100644 index 0000000000..f98d71a859 --- /dev/null +++ b/OpenRA.Mods.CA/Widgets/Logic/SimpleTooltipWithDescLogic.cs @@ -0,0 +1,55 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using OpenRA.Mods.Common.Widgets; +using OpenRA.Widgets; + +namespace OpenRA.Mods.CA.Widgets.Logic +{ + public class SimpleTooltipWithDescLogic : ChromeLogic + { + [ObjectCreator.UseCtor] + public SimpleTooltipWithDescLogic(Widget widget, ContainerWithTooltipWidget containerWidget, Func getText, Func getDesc) + { + var label = widget.Get("LABEL"); + var font = Game.Renderer.Fonts[label.Font]; + var text = getText(); + var labelWidth = font.Measure(text).X; + + label.GetText = () => text; + label.Bounds.Width = labelWidth; + widget.Bounds.Width = 2 * label.Bounds.X + labelWidth; + + var desc = getDesc(); + if (!string.IsNullOrEmpty(desc)) + { + var descTemplate = widget.Get("DESC"); + widget.RemoveChild(descTemplate); + + var descFont = Game.Renderer.Fonts[descTemplate.Font]; + var descWidth = 0; + var descOffset = descTemplate.Bounds.Y; + foreach (var line in desc.Split(new[] { "\\n", "\n" }, StringSplitOptions.None)) + { + descWidth = Math.Max(descWidth, descFont.Measure(line).X); + var lineLabel = (LabelWidget)descTemplate.Clone(); + lineLabel.GetText = () => line; + lineLabel.Bounds.Y = descOffset; + widget.AddChild(lineLabel); + descOffset += descTemplate.Bounds.Height; + } + + widget.Bounds.Width = Math.Max(widget.Bounds.Width, descTemplate.Bounds.X * 2 + descWidth); + widget.Bounds.Height += descOffset - descTemplate.Bounds.Y + descTemplate.Bounds.X; + } + } + } +} diff --git a/OpenRA.Mods.CA/Widgets/Logic/TemplateMenuLogic.cs b/OpenRA.Mods.CA/Widgets/Logic/TemplateMenuLogic.cs index 3c65bb788c..fb1977bd53 100644 --- a/OpenRA.Mods.CA/Widgets/Logic/TemplateMenuLogic.cs +++ b/OpenRA.Mods.CA/Widgets/Logic/TemplateMenuLogic.cs @@ -1,11 +1,10 @@ #region Copyright & License Information -/* - * Copyright 2007-2017 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. For more - * information, see COPYING. +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. */ #endregion diff --git a/OpenRA.Mods.CA/Widgets/ObserverArmyValuesWidget.cs b/OpenRA.Mods.CA/Widgets/ObserverArmyValuesWidget.cs new file mode 100644 index 0000000000..81f68a8185 --- /dev/null +++ b/OpenRA.Mods.CA/Widgets/ObserverArmyValuesWidget.cs @@ -0,0 +1,133 @@ +#region Copyright & License Information +/* + * Copyright (c) The OpenRA Developers and Contributors + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. For more + * information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.Graphics; +using OpenRA.Mods.Common.Traits; +using OpenRA.Mods.Common.Widgets; +using OpenRA.Primitives; +using OpenRA.Widgets; + +namespace OpenRA.Mods.CA.Widgets +{ + public class ObserverArmyValuesWidget : Widget + { + public readonly string HeadingText = "Selected Unit Values"; + public readonly string HeadingFont = "Regular"; + public readonly string Font = "Bold"; + public readonly TextAlign Align = TextAlign.Right; + public readonly int ReplayYPosModifier = 0; + + readonly SpriteFont font; + readonly SpriteFont headingFont; + readonly Color bgDark; + List armyValues; + + int selectionHash; + readonly World world; + + [ObjectCreator.UseCtor] + public ObserverArmyValuesWidget(World world) + { + bgDark = ChromeMetrics.Get("TextContrastColorDark"); + font = Game.Renderer.Fonts[Font]; + headingFont = Game.Renderer.Fonts[HeadingFont]; + this.world = world; + armyValues = new List(); + } + + public override void Initialize(WidgetArgs args) + { + base.Initialize(args); + + if (world.IsReplay) + Bounds.Y += ReplayYPosModifier; + } + + class ArmyValue + { + public string PlayerName; + public Color Color; + public int Value; + } + + public override void Tick() + { + if (selectionHash == world.Selection.Hash) + return; + + Update(); + selectionHash = world.Selection.Hash; + } + + void Update() + { + armyValues.Clear(); + + var selectedActorPlayers = world.Selection.Actors.GroupBy(a => a.Owner).Select(g => g.First().Owner); + + foreach (var p in selectedActorPlayers) + { + var valuedTraits = world.Selection.Actors.Where(a => a.Owner == p).SelectMany(a => a.Info.TraitInfos()); + var totalValue = 0; + foreach (var v in valuedTraits) + totalValue += v.Cost; + + var value = new ArmyValue + { + PlayerName = p.ResolvedPlayerName, + Color = p.Color, + Value = totalValue + }; + + armyValues.Add(value); + } + + armyValues = armyValues.OrderByDescending(v => v.Value).ToList(); + } + + public override void Draw() + { + if (!IsVisible() || !armyValues.Any()) + return; + + var y = 0; + var headingTextSize = headingFont.Measure(HeadingText); + var headingLocation = CalcTextLocation(y, headingTextSize); + headingFont.DrawTextWithShadow(HeadingText, headingLocation, Color.White, bgDark, bgDark, 1); + y += (headingTextSize.Y + 6); + + foreach (var v in armyValues) + { + var text = v.PlayerName + ": $" + v.Value.ToString(); + var textSize = font.Measure(text); + var location = CalcTextLocation(y, textSize); + + font.DrawTextWithShadow(text, location, v.Color, bgDark, bgDark, 1); + y += (font.Measure(text).Y + 5); + } + } + + float2 CalcTextLocation(int y, int2 textSize) + { + var location = new float2(Bounds.X, Bounds.Y + y); + + if (Align == TextAlign.Center) + location += new int2((Bounds.Width - textSize.X) / 2, 0); + + if (Align == TextAlign.Right) + location += new int2(Bounds.Width - textSize.X, 0); + + return location; + } + } +} diff --git a/OpenRA.Mods.CA/Widgets/ObserverBuildOrderIconsWidget.cs b/OpenRA.Mods.CA/Widgets/ObserverBuildOrderIconsWidget.cs new file mode 100644 index 0000000000..8082d27ba2 --- /dev/null +++ b/OpenRA.Mods.CA/Widgets/ObserverBuildOrderIconsWidget.cs @@ -0,0 +1,229 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Linq; +using OpenRA.Graphics; +using OpenRA.Mods.CA.Traits; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Widgets; + +namespace OpenRA.Mods.Common.Widgets +{ + public class ObserverBuildOrderIconsWidget : Widget + { + public Func GetPlayer; + readonly World world; + readonly WorldRenderer worldRenderer; + + public int IconWidth = 32; + public int IconHeight = 24; + public int IconSpacing = 1; + + readonly float2 iconSize; + public int MinWidth = 240; + + public ArmyUnit TooltipUnit { get; private set; } + public Func GetTooltipUnit; + + public readonly string TooltipTemplate = "ARMY_TOOLTIP"; + public readonly string TooltipContainer; + + readonly Lazy tooltipContainer; + readonly List armyIcons = new(); + + readonly CachedTransform tracker = new(player => player.PlayerActor.TraitOrDefault()); + + IEnumerable<(ArmyUnit, ProductionTrackerBuildOrderItem)> buildOrder; + int lastCount; + + int lastIconIdx; + int currentTooltipToken; + + [ObjectCreator.UseCtor] + public ObserverBuildOrderIconsWidget(World world, WorldRenderer worldRenderer) + { + this.world = world; + this.worldRenderer = worldRenderer; + GetTooltipUnit = () => TooltipUnit; + tooltipContainer = Exts.Lazy(() => + Ui.Root.Get(TooltipContainer)); + } + + protected ObserverBuildOrderIconsWidget(ObserverBuildOrderIconsWidget other) + : base(other) + { + GetPlayer = other.GetPlayer; + world = other.world; + worldRenderer = other.worldRenderer; + + IconWidth = other.IconWidth; + IconHeight = other.IconHeight; + IconSpacing = other.IconSpacing; + iconSize = new float2(IconWidth, IconHeight); + + MinWidth = other.MinWidth; + + TooltipUnit = other.TooltipUnit; + GetTooltipUnit = () => TooltipUnit; + + TooltipTemplate = other.TooltipTemplate; + TooltipContainer = other.TooltipContainer; + + tooltipContainer = Exts.Lazy(() => + Ui.Root.Get(TooltipContainer)); + } + + public override void Draw() + { + armyIcons.Clear(); + + var player = GetPlayer(); + if (player == null) + return; + + var productionTracker = tracker.Update(player); + + if (lastCount != productionTracker.BuildOrderCount) + { + buildOrder = UpdateBuildOrder(productionTracker, player); + } + + Game.Renderer.EnableAntialiasingFilter(); + + var queueCol = 0; + + if (buildOrder != null) + { + foreach (var item in buildOrder) + { + var unit = item.Item1; + var time = item.Item2.Ticks; + + var icon = unit.Icon; + var topLeftOffset = new int2(queueCol * (IconWidth + IconSpacing), 0); + + var iconTopLeft = RenderOrigin + topLeftOffset; + var centerPosition = iconTopLeft; + + var palette = unit.IconPaletteIsPlayerPalette ? unit.IconPalette + player.InternalName : unit.IconPalette; + WidgetUtils.DrawSpriteCentered(icon.Image, worldRenderer.Palette(palette), centerPosition + 0.5f * iconSize, 0.5f); + + armyIcons.Add(new ArmyIcon + { + Bounds = new Rectangle(iconTopLeft.X, iconTopLeft.Y, (int)iconSize.X, (int)iconSize.Y), + Unit = unit, + Ticks = time + }); + + queueCol++; + } + } + + var newWidth = Math.Max(queueCol * (IconWidth + IconSpacing), MinWidth); + if (newWidth != Bounds.Width) + { + var wasInBounds = EventBounds.Contains(Viewport.LastMousePos); + Bounds.Width = newWidth; + var isInBounds = EventBounds.Contains(Viewport.LastMousePos); + + // HACK: Ui.MouseOverWidget is normally only updated when the mouse moves + // Call ResetTooltips to force a fake mouse movement so the checks in Tick will work properly + if (wasInBounds != isInBounds) + Game.RunAfterTick(Ui.ResetTooltips); + } + + Game.Renderer.DisableAntialiasingFilter(); + + var tiny = Game.Renderer.Fonts["Tiny"]; + foreach (var icon in armyIcons) + { + var text = WidgetUtils.FormatTime(icon.Ticks, world.Timestep); + tiny.DrawTextWithContrast(text, + new float2(icon.Bounds.X, icon.Bounds.Y) + new float2(16, 12) - new float2(tiny.Measure(text).X / 2, 0), + Color.White, Color.Black, 1); + } + + var parentWidth = Bounds.X + Bounds.Width; + Parent.Bounds.Width = parentWidth; + + var gradient = Parent.Get("PLAYER_GRADIENT"); + + var offset = gradient.Bounds.X - Bounds.X; + var gradientWidth = Math.Max(MinWidth - offset, queueCol * (IconWidth + IconSpacing)); + + gradient.Bounds.Width = gradientWidth; + var widestChildWidth = Parent.Parent.Children.Max(x => x.Bounds.Width); + + Parent.Parent.Bounds.Width = Math.Max(25 + widestChildWidth, Bounds.Left + MinWidth); + } + + IEnumerable<(ArmyUnit, ProductionTrackerBuildOrderItem)> UpdateBuildOrder(ProductionTracker productionTracker, Player player) + { + lastCount = productionTracker.BuildOrderCount; + return productionTracker.BuildOrder + .Select(u => (new ArmyUnit(world.Map.Rules.Actors[u.Name], player), u)); + } + + public override Widget Clone() + { + return new ObserverBuildOrderIconsWidget(this); + } + + public override void Tick() + { + if (TooltipContainer == null) + return; + + if (Ui.MouseOverWidget != this) + { + if (TooltipUnit != null) + { + tooltipContainer.Value.RemoveTooltip(currentTooltipToken); + lastIconIdx = 0; + TooltipUnit = null; + } + + return; + } + + if (TooltipUnit != null && lastIconIdx < armyIcons.Count) + { + var armyIcon = armyIcons[lastIconIdx]; + if (armyIcon.Unit.ActorInfo == TooltipUnit.ActorInfo && armyIcon.Bounds.Contains(Viewport.LastMousePos)) + return; + } + + for (var i = 0; i < armyIcons.Count; i++) + { + var armyIcon = armyIcons[i]; + if (!armyIcon.Bounds.Contains(Viewport.LastMousePos)) + continue; + + lastIconIdx = i; + TooltipUnit = armyIcon.Unit; + currentTooltipToken = tooltipContainer.Value.SetTooltip(TooltipTemplate, new WidgetArgs { { "getTooltipUnit", GetTooltipUnit } }); + + return; + } + + TooltipUnit = null; + } + + sealed class ArmyIcon + { + public Rectangle Bounds { get; set; } + public ArmyUnit Unit { get; set; } + public int Ticks { get; set; } + } + } +} diff --git a/OpenRA.Mods.CA/Widgets/ObserverUnitsProducedIconsWidget.cs b/OpenRA.Mods.CA/Widgets/ObserverUnitsProducedIconsWidget.cs new file mode 100644 index 0000000000..bcfe405a41 --- /dev/null +++ b/OpenRA.Mods.CA/Widgets/ObserverUnitsProducedIconsWidget.cs @@ -0,0 +1,241 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Linq; +using OpenRA.Graphics; +using OpenRA.Mods.CA.Traits; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Widgets; + +namespace OpenRA.Mods.Common.Widgets +{ + public class ObserverUnitsProducedIconsWidget : Widget + { + public Func GetPlayer; + readonly World world; + readonly WorldRenderer worldRenderer; + + public int IconWidth = 32; + public int IconHeight = 24; + public int IconSpacing = 1; + + readonly float2 iconSize; + public int MinWidth = 240; + + public ArmyUnit TooltipUnit { get; private set; } + public Func GetTooltipUnit; + public string TooltipDesc { get; private set; } + public Func GetTooltipDesc; + + public readonly string TooltipTemplate = "ARMY_VALUE_TOOLTIP"; + public readonly string TooltipContainer; + + readonly Lazy tooltipContainer; + readonly List armyIcons = new(); + + readonly CachedTransform tracker = new(player => player.PlayerActor.TraitOrDefault()); + + IEnumerable<(ArmyUnit, ProductionTrackerUnitValueItem)> unitsProduced; + int lastTotalValue; + + int lastIconIdx; + int currentTooltipToken; + + [ObjectCreator.UseCtor] + public ObserverUnitsProducedIconsWidget(World world, WorldRenderer worldRenderer) + { + this.world = world; + this.worldRenderer = worldRenderer; + + GetTooltipUnit = () => TooltipUnit; + GetTooltipDesc = () => TooltipDesc; + + tooltipContainer = Exts.Lazy(() => + Ui.Root.Get(TooltipContainer)); + } + + protected ObserverUnitsProducedIconsWidget(ObserverUnitsProducedIconsWidget other) + : base(other) + { + GetPlayer = other.GetPlayer; + world = other.world; + worldRenderer = other.worldRenderer; + + IconWidth = other.IconWidth; + IconHeight = other.IconHeight; + IconSpacing = other.IconSpacing; + iconSize = new float2(IconWidth, IconHeight); + + MinWidth = other.MinWidth; + + TooltipUnit = other.TooltipUnit; + GetTooltipUnit = () => TooltipUnit; + TooltipDesc = other.TooltipDesc; + GetTooltipDesc = () => TooltipDesc; + + TooltipTemplate = other.TooltipTemplate; + TooltipContainer = other.TooltipContainer; + + tooltipContainer = Exts.Lazy(() => + Ui.Root.Get(TooltipContainer)); + } + + public override void Draw() + { + armyIcons.Clear(); + + var player = GetPlayer(); + if (player == null) + return; + + var productionTracker = tracker.Update(player); + + if (lastTotalValue != productionTracker.TotalValue) + { + unitsProduced = UpdateUnitsProduced(productionTracker, player); + } + + Game.Renderer.EnableAntialiasingFilter(); + + var queueCol = 0; + + if (unitsProduced != null) + { + foreach (var uv in unitsProduced) + { + var unit = uv.Item1; + + var icon = unit.Icon; + var topLeftOffset = new int2(queueCol * (IconWidth + IconSpacing), 0); + + var iconTopLeft = RenderOrigin + topLeftOffset; + var centerPosition = iconTopLeft; + + var palette = unit.IconPaletteIsPlayerPalette ? unit.IconPalette + player.InternalName : unit.IconPalette; + WidgetUtils.DrawSpriteCentered(icon.Image, worldRenderer.Palette(palette), centerPosition + 0.5f * iconSize, 0.5f); + + armyIcons.Add(new ArmyIcon + { + Bounds = new Rectangle(iconTopLeft.X, iconTopLeft.Y, (int)iconSize.X, (int)iconSize.Y), + Unit = unit, + Value = uv.Item2.Value, + Count = uv.Item2.Count + }); + + queueCol++; + } + } + + var newWidth = Math.Max(queueCol * (IconWidth + IconSpacing), MinWidth); + if (newWidth != Bounds.Width) + { + var wasInBounds = EventBounds.Contains(Viewport.LastMousePos); + Bounds.Width = newWidth; + var isInBounds = EventBounds.Contains(Viewport.LastMousePos); + + // HACK: Ui.MouseOverWidget is normally only updated when the mouse moves + // Call ResetTooltips to force a fake mouse movement so the checks in Tick will work properly + if (wasInBounds != isInBounds) + Game.RunAfterTick(Ui.ResetTooltips); + } + + Game.Renderer.DisableAntialiasingFilter(); + + var parentWidth = Bounds.X + Bounds.Width; + Parent.Bounds.Width = parentWidth; + + var gradient = Parent.Get("PLAYER_GRADIENT"); + + var offset = gradient.Bounds.X - Bounds.X; + var gradientWidth = Math.Max(MinWidth - offset, queueCol * (IconWidth + IconSpacing)); + + gradient.Bounds.Width = gradientWidth; + var widestChildWidth = Parent.Parent.Children.Max(x => x.Bounds.Width); + + Parent.Parent.Bounds.Width = Math.Max(25 + widestChildWidth, Bounds.Left + MinWidth); + } + + IEnumerable<(ArmyUnit, ProductionTrackerUnitValueItem)> UpdateUnitsProduced(ProductionTracker productionTracker, Player player) + { + lastTotalValue = productionTracker.TotalValue; + + return productionTracker.UnitValues + .OrderByDescending(u => u.Value.Value) + .Take(12) + .Select(u => (new ArmyUnit(world.Map.Rules.Actors[u.Key], player), u.Value)); + } + + public override Widget Clone() + { + return new ObserverUnitsProducedIconsWidget(this); + } + + public override void Tick() + { + if (TooltipContainer == null) + return; + + if (Ui.MouseOverWidget != this) + { + if (TooltipUnit != null) + { + tooltipContainer.Value.RemoveTooltip(currentTooltipToken); + lastIconIdx = 0; + TooltipUnit = null; + TooltipDesc = null; + } + + return; + } + + if (TooltipUnit != null && lastIconIdx < armyIcons.Count) + { + var armyIcon = armyIcons[lastIconIdx]; + if (armyIcon.Unit.ActorInfo == TooltipUnit.ActorInfo && armyIcon.Bounds.Contains(Viewport.LastMousePos)) + return; + } + + for (var i = 0; i < armyIcons.Count; i++) + { + var armyIcon = armyIcons[i]; + if (!armyIcon.Bounds.Contains(Viewport.LastMousePos)) + continue; + + lastIconIdx = i; + TooltipUnit = armyIcon.Unit; + TooltipDesc = $"x{armyIcon.Count} (${armyIcon.Value})"; + currentTooltipToken = tooltipContainer.Value.SetTooltip(TooltipTemplate, new WidgetArgs { { "getTooltipUnit", GetTooltipUnit }, { "getDesc", GetTooltipDesc } }); + + return; + } + + TooltipUnit = null; + TooltipDesc = null; + } + + sealed class UnitProduced + { + public ArmyUnit Unit { get; set; } + public int Value { get; set; } + public int Count { get; set; } + } + + sealed class ArmyIcon + { + public Rectangle Bounds { get; set; } + public ArmyUnit Unit { get; set; } + public int Value { get; set; } + public int Count { get; set; } + } + } +} diff --git a/OpenRA.Mods.CA/Widgets/ObserverUpgradeIconsWidget.cs b/OpenRA.Mods.CA/Widgets/ObserverUpgradeIconsWidget.cs new file mode 100644 index 0000000000..e7362ac182 --- /dev/null +++ b/OpenRA.Mods.CA/Widgets/ObserverUpgradeIconsWidget.cs @@ -0,0 +1,243 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Linq; +using OpenRA.Graphics; +using OpenRA.Mods.CA.Traits; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Widgets; + +namespace OpenRA.Mods.Common.Widgets +{ + public class ObserverUpgradeIconsWidget : Widget + { + public Func GetPlayer; + readonly World world; + readonly WorldRenderer worldRenderer; + + public int IconWidth = 32; + public int IconHeight = 24; + public int IconSpacing = 1; + + readonly float2 iconSize; + public int MinWidth = 240; + + public ArmyUnit TooltipUnit { get; private set; } + public Func GetTooltipUnit; + + public readonly string TooltipTemplate = "ARMY_TOOLTIP"; + public readonly string TooltipContainer; + + readonly Lazy tooltipContainer; + readonly List armyIcons = new(); + + readonly CachedTransform stats = new(player => player.PlayerActor.TraitOrDefault()); + + IOrderedEnumerable<(ArmyUnit, int)> upgrades; + int lastHash; + + int lastIconIdx; + int currentTooltipToken; + + [ObjectCreator.UseCtor] + public ObserverUpgradeIconsWidget(World world, WorldRenderer worldRenderer) + { + this.world = world; + this.worldRenderer = worldRenderer; + + GetTooltipUnit = () => TooltipUnit; + tooltipContainer = Exts.Lazy(() => + Ui.Root.Get(TooltipContainer)); + } + + protected ObserverUpgradeIconsWidget(ObserverUpgradeIconsWidget other) + : base(other) + { + GetPlayer = other.GetPlayer; + world = other.world; + worldRenderer = other.worldRenderer; + + IconWidth = other.IconWidth; + IconHeight = other.IconHeight; + IconSpacing = other.IconSpacing; + iconSize = new float2(IconWidth, IconHeight); + + MinWidth = other.MinWidth; + + TooltipUnit = other.TooltipUnit; + GetTooltipUnit = () => TooltipUnit; + + TooltipTemplate = other.TooltipTemplate; + TooltipContainer = other.TooltipContainer; + + tooltipContainer = Exts.Lazy(() => + Ui.Root.Get(TooltipContainer)); + } + + public override void Draw() + { + armyIcons.Clear(); + + var player = GetPlayer(); + if (player == null) + return; + + var upgradesManager = stats.Update(player); + + if (lastHash != upgradesManager.Hash) + { + upgrades = UpdateUpgrades(upgradesManager, player); + } + + Game.Renderer.EnableAntialiasingFilter(); + + var queueCol = 0; + + if (upgrades != null) + { + foreach (var item in upgrades) + { + var unit = item.Item1; + var time = item.Item2; + + var icon = unit.Icon; + var topLeftOffset = new int2(queueCol * (IconWidth + IconSpacing), 0); + + var iconTopLeft = RenderOrigin + topLeftOffset; + var centerPosition = iconTopLeft; + + var palette = unit.IconPaletteIsPlayerPalette ? unit.IconPalette + player.InternalName : unit.IconPalette; + WidgetUtils.DrawSpriteCentered(icon.Image, worldRenderer.Palette(palette), centerPosition + 0.5f * iconSize, 0.5f); + + armyIcons.Add(new ArmyIcon + { + Bounds = new Rectangle(iconTopLeft.X, iconTopLeft.Y, (int)iconSize.X, (int)iconSize.Y), + Unit = unit, + Ticks = time + }); + + queueCol++; + } + } + + var newWidth = Math.Max(queueCol * (IconWidth + IconSpacing), MinWidth); + if (newWidth != Bounds.Width) + { + var wasInBounds = EventBounds.Contains(Viewport.LastMousePos); + Bounds.Width = newWidth; + var isInBounds = EventBounds.Contains(Viewport.LastMousePos); + + // HACK: Ui.MouseOverWidget is normally only updated when the mouse moves + // Call ResetTooltips to force a fake mouse movement so the checks in Tick will work properly + if (wasInBounds != isInBounds) + Game.RunAfterTick(Ui.ResetTooltips); + } + + Game.Renderer.DisableAntialiasingFilter(); + + var tiny = Game.Renderer.Fonts["Tiny"]; + foreach (var armyIcon in armyIcons) + { + var text = WidgetUtils.FormatTime(armyIcon.Ticks, world.Timestep); + tiny.DrawTextWithContrast(text, + new float2(armyIcon.Bounds.X, armyIcon.Bounds.Y) + new float2(16, 12) - new float2(tiny.Measure(text).X / 2, 0), + Color.White, Color.Black, 1); + } + + var parentWidth = Bounds.X + Bounds.Width; + Parent.Bounds.Width = parentWidth; + + var gradient = Parent.Get("PLAYER_GRADIENT"); + + var offset = gradient.Bounds.X - Bounds.X; + var gradientWidth = Math.Max(MinWidth - offset, queueCol * (IconWidth + IconSpacing)); + + gradient.Bounds.Width = gradientWidth; + var widestChildWidth = Parent.Parent.Children.Max(x => x.Bounds.Width); + + Parent.Parent.Bounds.Width = Math.Max(25 + widestChildWidth, Bounds.Left + MinWidth); + } + + IOrderedEnumerable<(ArmyUnit, int)> UpdateUpgrades(UpgradesManager upgradesManager, Player player) + { + lastHash = upgradesManager.Hash; + + var upgrades = upgradesManager.UnlockedUpgradeTypes + .Select(kvp => (new ArmyUnit(world.Map.Rules.Actors[kvp.Key], player), kvp.Value)); + + var instances = new List<(ArmyUnit, int)>(); + + foreach (var upgrade in upgrades) + { + foreach (var time in upgrade.Item2) + { + instances.Add((upgrade.Item1, time)); + } + } + + return instances.OrderBy(x => x.Item2); + } + + public override Widget Clone() + { + return new ObserverUpgradeIconsWidget(this); + } + + public override void Tick() + { + if (TooltipContainer == null) + return; + + if (Ui.MouseOverWidget != this) + { + if (TooltipUnit != null) + { + tooltipContainer.Value.RemoveTooltip(currentTooltipToken); + lastIconIdx = 0; + TooltipUnit = null; + } + + return; + } + + if (TooltipUnit != null && lastIconIdx < armyIcons.Count) + { + var armyIcon = armyIcons[lastIconIdx]; + if (armyIcon.Unit.ActorInfo == TooltipUnit.ActorInfo && armyIcon.Bounds.Contains(Viewport.LastMousePos)) + return; + } + + for (var i = 0; i < armyIcons.Count; i++) + { + var armyIcon = armyIcons[i]; + if (!armyIcon.Bounds.Contains(Viewport.LastMousePos)) + continue; + + lastIconIdx = i; + TooltipUnit = armyIcon.Unit; + currentTooltipToken = tooltipContainer.Value.SetTooltip(TooltipTemplate, new WidgetArgs { { "getTooltipUnit", GetTooltipUnit } }); + + return; + } + + TooltipUnit = null; + } + + sealed class ArmyIcon + { + public Rectangle Bounds { get; set; } + public ArmyUnit Unit { get; set; } + public int Ticks { get; set; } + } + } +} diff --git a/OpenRA.Mods.CA/Widgets/ProductionPaletteCAWidget.cs b/OpenRA.Mods.CA/Widgets/ProductionPaletteCAWidget.cs new file mode 100644 index 0000000000..58b9e4c645 --- /dev/null +++ b/OpenRA.Mods.CA/Widgets/ProductionPaletteCAWidget.cs @@ -0,0 +1,31 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using OpenRA.Graphics; +using OpenRA.Mods.Common.Widgets; +using OpenRA.Network; +using OpenRA.Widgets; + +namespace OpenRA.Mods.CA.Widgets +{ + public class ProductionPaletteCAWidget : ProductionPaletteWidget + { + public string Cursor = ChromeMetrics.Get("ButtonCursor"); + + [ObjectCreator.UseCtor] + public ProductionPaletteCAWidget(ModData modData, OrderManager orderManager, World world, WorldRenderer worldRenderer) + : base(modData, orderManager, world, worldRenderer) { } + + public override string GetCursor(int2 pos) + { + return Cursor; + } + } +} diff --git a/OpenRA.Mods.CA/Widgets/ProductionTabsCAWidget.cs b/OpenRA.Mods.CA/Widgets/ProductionTabsCAWidget.cs new file mode 100644 index 0000000000..24bc3bc7d4 --- /dev/null +++ b/OpenRA.Mods.CA/Widgets/ProductionTabsCAWidget.cs @@ -0,0 +1,510 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using OpenRA.Graphics; +using OpenRA.Mods.Common.Traits; +using OpenRA.Mods.Common.Widgets; +using OpenRA.Primitives; +using OpenRA.Widgets; + +namespace OpenRA.Mods.CA.Widgets +{ + public class ProductionTabCA + { + public string Name; + public ProductionQueue Queue; + public Actor Actor; + public int IdleTicks; + public bool IsIdle; + } + + public class ProductionTabGroupCA + { + public List Tabs = new List(); + public string Group; + public bool Alert { get { return Tabs.Any(t => t.Queue.AllQueued().Any(i => i.Done)); } } + public bool HasIdleFactories { get { return Tabs.Any(t => t.IsIdle); } } + + public void Update(IEnumerable allQueues) + { + var queues = allQueues.Where(q => q.Enabled && q.Info.Group == Group).ToList(); + var tabs = new List(); + + Tabs = Tabs.OrderByDescending(t => t.Queue.AllItems().Count()).ToList(); + var count = 1; + + // Remove stale queues + foreach (var t in Tabs) + { + if (!queues.Contains(t.Queue)) + continue; + + t.Name = (count++).ToString(); + tabs.Add(t); + queues.Remove(t.Queue); + } + + // Add new queues + foreach (var queue in queues) + tabs.Add(new ProductionTabCA() + { + Name = (count++).ToString(NumberFormatInfo.CurrentInfo), + Queue = queue, + Actor = queue.GetType() == typeof(ProductionQueue) ? queue.Actor : null + }); + + Tabs = tabs; + } + } + + public class ProductionTabsCAWidget : Widget + { + readonly World world; + readonly WorldRenderer worldRenderer; + + public readonly string PaletteWidget = null; + public readonly string TypesContainer = null; + public readonly string BackgroundContainer = null; + + public readonly int TabWidth = 30; + public readonly int TabSpacing = 0; + public readonly int ArrowWidth = 20; + public readonly int MaxTabsVisible = 5; + + public readonly string ClickSound = ChromeMetrics.Get("ClickSound"); + public readonly string ClickDisabledSound = ChromeMetrics.Get("ClickDisabledSound"); + + public readonly HotkeyReference PreviousProductionTabKey = new HotkeyReference(); + public readonly HotkeyReference NextProductionTabKey = new HotkeyReference(); + + public readonly Dictionary Groups; + public string Cursor = ChromeMetrics.Get("ButtonCursor"); + + public string LeftButton = null; + public string RightButton = null; + public string TabButton = "button"; + public string Background = null; + + public readonly Color TabColor = Color.White; + public readonly Color TabColorDone = Color.Gold; + + public readonly int IdleAlertDelay = 125; + + public readonly HashSet IdleAlertGroups = new() { "Infantry", "Vehicle", "Aircraft", "Ship" }; + + public readonly float IdleAlertBlinkRate = 0.08f; + + int contentWidth = 0; + bool leftPressed = false; + bool rightPressed = false; + int pressedTabIndex = -1; + bool hoverCursor = false; + SpriteFont font; + Rectangle leftButtonRect; + Rectangle rightButtonRect; + readonly Lazy paletteWidget; + string queueGroup; + + readonly List<(ProductionQueue Queue, bool Enabled)> cachedProductionQueueEnabledStates = new(); + + int startTabIndex; + + [ObjectCreator.UseCtor] + public ProductionTabsCAWidget(World world, WorldRenderer worldRenderer) + { + this.world = world; + this.worldRenderer = worldRenderer; + + Groups = world.Map.Rules.Actors.Values.SelectMany(a => a.TraitInfos()) + .Select(q => q.Group).Distinct().ToDictionary(g => g, g => new ProductionTabGroupCA() { Group = g }); + + // Only visible if the production palette has icons to display + IsVisible = () => queueGroup != null && Groups[queueGroup].Tabs.Count > 0; + + paletteWidget = Exts.Lazy(() => Ui.Root.GetOrNull(PaletteWidget)); + } + + public override void Initialize(WidgetArgs args) + { + base.Initialize(args); + + var rb = RenderBounds; + leftButtonRect = new Rectangle(rb.X, rb.Y, ArrowWidth, rb.Height); + rightButtonRect = new Rectangle(rb.Right - ArrowWidth, rb.Y, ArrowWidth, rb.Height); + font = Game.Renderer.Fonts["TinyBold"]; + } + + public bool SelectNextTab(bool reverse) + { + if (queueGroup == null) + return true; + + // Prioritize alerted queues + var queues = Groups[queueGroup].Tabs.Select(t => t.Queue) + .OrderByDescending(q => q.AllQueued().Any(i => i.Done) ? 1 : 0) + .ToList(); + + if (reverse) queues.Reverse(); + + var newQueue = queues.SkipWhile(q => q != CurrentQueue) + .Skip(1).FirstOrDefault() ?? queues.FirstOrDefault(); + + if (newQueue == null) + return false; + + CurrentQueue = newQueue; + + return true; + } + + public void PickUpCompletedBuilding() + { + // This is called from ProductionTabsLogic + if (paletteWidget.Value?.CurrentQueue != null) + paletteWidget.Value.PickUpCompletedBuilding(); + } + + // Production Type + public string QueueGroup + { + get => queueGroup; + + set + { + queueGroup = value; + SelectNextTab(false); + if (paletteWidget.Value?.CurrentQueue != null) + paletteWidget.Value.ScrollToTop(); + } + } + + // Tab + public ProductionQueue CurrentQueue + { + get => paletteWidget.Value?.CurrentQueue; + + set + { + if (paletteWidget.Value != null) + { + paletteWidget.Value.CurrentQueue = value; + queueGroup = value != null ? value.Info.Group : null; + ForceSelectedTabVisible(); + if (paletteWidget.Value.CurrentQueue != null) + paletteWidget.Value.ScrollToTop(); + } + } + } + + public List GetTabs() + { + return Groups[queueGroup].Tabs.Where(t => t.Queue.BuildableItems().Any()).ToList(); + } + + public override void Draw() + { + var tabs = GetTabs(); + var numTabs = tabs.Count; + + if (numTabs == 0) + return; + + var rb = RenderBounds; + + hoverCursor = false; + var leftDisabled = startTabIndex == 0; + var leftHover = Ui.MouseOverWidget == this && leftButtonRect.Contains(Viewport.LastMousePos); + var rightDisabled = startTabIndex >= numTabs - MaxTabsVisible; + var rightHover = Ui.MouseOverWidget == this && rightButtonRect.Contains(Viewport.LastMousePos); + + if ((leftHover && !leftDisabled) || (rightHover && !rightDisabled)) + hoverCursor = true; + + ButtonWidget.DrawBackground(LeftButton, leftButtonRect, leftDisabled, leftPressed, leftHover, false); + ButtonWidget.DrawBackground(RightButton, rightButtonRect, rightDisabled, rightPressed, rightHover, false); + + // Draw tab buttons + Game.Renderer.EnableScissor(new Rectangle(leftButtonRect.Right, rb.Y, rightButtonRect.Left - leftButtonRect.Right, rb.Height)); + var origin = new int2(leftButtonRect.Right, leftButtonRect.Y); + contentWidth = 0; + + var tabIndex = -1; + var tabsShown = 0; + + foreach (var tab in tabs) + { + tabIndex++; + + if (tabsShown >= MaxTabsVisible) + break; + + if (tabIndex < startTabIndex) + continue; + + var rect = new Rectangle(origin.X + contentWidth, origin.Y, TabWidth, rb.Height); + var hover = !leftHover && !rightHover && Ui.MouseOverWidget == this && rect.Contains(Viewport.LastMousePos); + var highlighted = tab.Queue == CurrentQueue; + var pressed = pressedTabIndex == tabIndex; + ButtonWidget.DrawBackground(TabButton, rect, false, pressed, hover, highlighted); + + if (hover) + hoverCursor = true; + + contentWidth += TabWidth + TabSpacing; + + // Draw number label + var textSize = font.Measure(tab.Name); + var position = new int2(rect.X + (rect.Width - textSize.X) / 2, (rect.Y + (rect.Height - textSize.Y) / 2) - 1); + + Color tabTextColor; + var showText = true; + if (tab.Queue.AllQueued().Any(i => i.Done)) + tabTextColor = TabColorDone; + else if (tab.IsIdle && !highlighted) + { + tabTextColor = TabColor; + showText = Math.Sin(Game.LocalTick * IdleAlertBlinkRate * 2 * Math.PI) > -0.3; + } + else + tabTextColor = TabColor; + + if (showText) + font.DrawText(tab.Name, position, tabTextColor); + + tabsShown++; + } + + Game.Renderer.DisableScissor(); + } + + void ForceSelectedTabVisible() + { + var tabs = GetTabs(); + var tabIndex = -1; + var selectedTabIndex = 0; + + foreach (var tab in tabs) + { + tabIndex++; + + if (tab.Queue == CurrentQueue) + selectedTabIndex = tabIndex; + } + + if (selectedTabIndex < startTabIndex) + startTabIndex = selectedTabIndex; + else if (selectedTabIndex > startTabIndex + MaxTabsVisible - 1) + startTabIndex = selectedTabIndex + 1 - MaxTabsVisible; + } + + void Scroll(int amount) + { + startTabIndex += amount; + } + + // Is added to world.ActorAdded by the SidebarLogic handler + public void ActorChanged(Actor a) + { + if (a.Owner != a.World.LocalPlayer) + return; + + if (!a.Info.HasTraitInfo() && !a.Info.HasTraitInfo()) + return; + + var queues = a.World.ActorsWithTrait() + .Where(p => p.Actor.Owner == p.Actor.World.LocalPlayer && p.Actor.IsInWorld) + .Select(p => p.Trait) + .ToList(); + + cachedProductionQueueEnabledStates.Clear(); + foreach (var queue in queues) + cachedProductionQueueEnabledStates.Add((queue, queue.Enabled)); + + foreach (var g in Groups.Values) + g.Update(cachedProductionQueueEnabledStates.Select(t => t.Queue)); + + if (queues?.Count > 0 && CurrentQueue == null) + CurrentQueue = queues.First(); + + if (queueGroup == null) + return; + + // Queue destroyed, was last of type: switch to a new group + if (Groups[queueGroup].Tabs.Count == 0) + QueueGroup = Groups.Where(g => g.Value.Tabs.Count > 0) + .Select(g => g.Key).FirstOrDefault(); + + // Queue destroyed, others of same type: switch to another tab + else if (!Groups[queueGroup].Tabs.Select(t => t.Queue).Contains(CurrentQueue)) + SelectNextTab(false); + } + + public override void Tick() + { + // It is possible that production queues get enabled/disabled during their lifetime. + // This makes sure every enabled production queue always has its tab associated with it. + var shouldUpdateQueues = false; + for (var i = 0; i < cachedProductionQueueEnabledStates.Count; i++) + { + var (queue, enabled) = cachedProductionQueueEnabledStates[i]; + + if (queue.Enabled != enabled) + { + shouldUpdateQueues = true; + + // Refresh queue.Enabled value in cache + cachedProductionQueueEnabledStates[i] = (queue, queue.Enabled); + } + } + + if (shouldUpdateQueues) + foreach (var g in Groups.Values) + g.Update(cachedProductionQueueEnabledStates.Select(t => t.Queue)); + + // Track idle ticks for each tab in groups that support idle alerts + if (Game.Settings.Game.IdleFactoryAlert) + { + foreach (var g in Groups.Values) + { + if (!IdleAlertGroups.Contains(g.Group)) + continue; + + foreach (var tab in g.Tabs) + { + if (tab.Queue.Enabled && tab.Queue.CurrentItem() == null) + { + tab.IdleTicks++; + tab.IsIdle = tab.IdleTicks >= IdleAlertDelay; + } + else + { + tab.IdleTicks = 0; + tab.IsIdle = false; + } + } + } + } + else + { + foreach (var g in Groups.Values) + foreach (var tab in g.Tabs) + { + tab.IdleTicks = 0; + tab.IsIdle = false; + } + } + } + + public override bool YieldMouseFocus(MouseInput mi) + { + pressedTabIndex = -1; + leftPressed = rightPressed = false; + return base.YieldMouseFocus(mi); + } + + public override bool HandleMouseInput(MouseInput mi) + { + var leftDisabled = startTabIndex == 0; + var rightDisabled = startTabIndex >= GetTabs().Count - MaxTabsVisible; + + if (mi.Event == MouseInputEvent.Scroll) + { + if (mi.Delta.Y > 0 && !rightDisabled) + Scroll(1); + else if (mi.Delta.Y < 0 && !leftDisabled) + Scroll(-1); + + return true; + } + + if (mi.Button != MouseButton.Left) + return true; + + if (mi.Event == MouseInputEvent.Down && !TakeMouseFocus(mi)) + return true; + + if (!HasMouseFocus) + return true; + + if (HasMouseFocus && mi.Event == MouseInputEvent.Up) + return YieldMouseFocus(mi); + + leftPressed = leftButtonRect.Contains(mi.Location); + rightPressed = rightButtonRect.Contains(mi.Location); + + if (leftPressed || rightPressed) + { + if ((leftPressed && !leftDisabled) || (rightPressed && !rightDisabled)) + { + if (rightPressed) + Scroll(1); + else + Scroll(-1); + + Game.Sound.PlayNotification(world.Map.Rules, null, "Sounds", ClickSound, null); + } + else + Game.Sound.PlayNotification(world.Map.Rules, null, "Sounds", ClickDisabledSound, null); + } + + // Switch to production tab clicked on by getting location of click + var offsetloc = mi.Location - new int2(leftButtonRect.Right, leftButtonRect.Y); + if (offsetloc.X > 0 && offsetloc.X < contentWidth) + { + var tabIndex = (offsetloc.X / (TabWidth + TabSpacing)) + startTabIndex; + + if (Groups[queueGroup].Tabs.Count >= tabIndex) + { + pressedTabIndex = tabIndex; + var tab = Groups[queueGroup].Tabs[tabIndex]; + CurrentQueue = tab.Queue; + Game.Sound.PlayNotification(world.Map.Rules, null, "Sounds", ClickSound, null); + + if (mi.MultiTapCount > 1 && tab.Actor != null && tab.Actor.IsInWorld) + { + var viewport = worldRenderer.Viewport; + viewport.Center(tab.Actor.CenterPosition); + } + } + } + + return true; + } + + public override bool HandleKeyPress(KeyInput e) + { + if (e.Event != KeyInputEvent.Down) + return false; + + if (PreviousProductionTabKey.IsActivatedBy(e)) + { + Game.Sound.PlayNotification(world.Map.Rules, null, "Sounds", ClickSound, null); + return SelectNextTab(true); + } + + if (NextProductionTabKey.IsActivatedBy(e)) + { + Game.Sound.PlayNotification(world.Map.Rules, null, "Sounds", ClickSound, null); + return SelectNextTab(false); + } + + return false; + } + + public override string GetCursor(int2 pos) + { + return hoverCursor ? Cursor : null; + } + } +} diff --git a/OpenRA.Mods.CA/Widgets/ScrollableLineGraphWidget.cs b/OpenRA.Mods.CA/Widgets/ScrollableLineGraphWidget.cs new file mode 100644 index 0000000000..636a17dd6e --- /dev/null +++ b/OpenRA.Mods.CA/Widgets/ScrollableLineGraphWidget.cs @@ -0,0 +1,613 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Linq; +using OpenRA.Graphics; +using OpenRA.Primitives; +using OpenRA.Widgets; + +namespace OpenRA.Mods.Common.Widgets +{ + public class ScrollableLineGraphWidget : Widget + { + protected readonly Ruleset ModRules; + public Func> GetSeries; + public Func GetValueFormat; + public Func GetXAxisValueFormat; + public Func GetYAxisValueFormat; + public Func GetXAxisSize; + public Func GetYAxisSize; + public Func GetXAxisLabel; + public Func GetYAxisLabel; + public Func GetDisplayFirstYAxisValue; + public Func GetLabelFont; + public Func GetAxisFont; + public string ValueFormat = "{0}"; + public string XAxisValueFormat = "{0}"; + public string YAxisValueFormat = "{0}"; + public int XAxisSize = 10; + public int YAxisSize = 10; + public int XAxisTicksPerLabel = 1; + public string XAxisLabel = ""; + public string YAxisLabel = ""; + public bool DisplayFirstYAxisValue = false; + public string LabelFont; + public string AxisFont; + public Color BackgroundColorDark = ChromeMetrics.Get("TextContrastColorDark"); + public Color BackgroundColorLight = ChromeMetrics.Get("TextContrastColorLight"); + public string ClickSound = ChromeMetrics.Get("ClickSound"); + public string ClickDisabledSound = ChromeMetrics.Get("ClickDisabledSound"); + public int Padding = 5; + + // Horizontal scrolling properties + public int ScrollbarHeight = 16; + public string ScrollbarBackground = "scrollpanel-bg"; + public string ScrollbarButton = "scrollpanel-button"; + public string ScrollbarDecorations = "scrollpanel-decorations"; + public readonly string DecorationScrollLeft = "left"; + public readonly string DecorationScrollRight = "right"; + public int MinimumThumbWidth = 20; + public float SmoothScrollSpeed = 0.333f; + + readonly CachedTransform<(bool Disabled, bool Pressed, bool Hover, bool Focused, bool Highlighted), Sprite> getLeftArrowImage; + readonly CachedTransform<(bool Disabled, bool Pressed, bool Hover, bool Focused, bool Highlighted), Sprite> getRightArrowImage; + + // Scroll state + float horizontalOffset = 0; + float targetHorizontalOffset = 0; + bool leftPressed = false; + bool rightPressed = false; + bool thumbPressed = false; + bool leftDisabled = false; + bool rightDisabled = false; + bool autoScrollEnabled = true; + bool manuallyScrolled = true; + int2 lastMousePos; + Rectangle leftButtonRect; + Rectangle rightButtonRect; + Rectangle scrollbarRect; + Rectangle thumbRect; + long lastSmoothScrollTime = 0; + + [ObjectCreator.UseCtor] + public ScrollableLineGraphWidget(ModData modData) + { + ModRules = modData.DefaultRules; + GetValueFormat = () => ValueFormat; + GetXAxisValueFormat = () => XAxisValueFormat; + GetYAxisValueFormat = () => YAxisValueFormat; + GetXAxisSize = () => XAxisSize; + GetYAxisSize = () => YAxisSize; + GetXAxisLabel = () => XAxisLabel; + GetYAxisLabel = () => YAxisLabel; + GetDisplayFirstYAxisValue = () => DisplayFirstYAxisValue; + GetLabelFont = () => LabelFont; + GetAxisFont = () => AxisFont; + + getLeftArrowImage = WidgetUtils.GetCachedStatefulImage(ScrollbarDecorations, DecorationScrollLeft); + getRightArrowImage = WidgetUtils.GetCachedStatefulImage(ScrollbarDecorations, DecorationScrollRight); + } + + protected ScrollableLineGraphWidget(ScrollableLineGraphWidget other) + : base(other) + { + ModRules = other.ModRules; + GetSeries = other.GetSeries; + GetValueFormat = other.GetValueFormat; + GetXAxisValueFormat = other.GetXAxisValueFormat; + GetYAxisValueFormat = other.GetYAxisValueFormat; + GetXAxisSize = other.GetXAxisSize; + GetYAxisSize = other.GetYAxisSize; + GetXAxisLabel = other.GetXAxisLabel; + GetYAxisLabel = other.GetYAxisLabel; + GetDisplayFirstYAxisValue = other.GetDisplayFirstYAxisValue; + GetLabelFont = other.GetLabelFont; + GetAxisFont = other.GetAxisFont; + ValueFormat = other.ValueFormat; + XAxisValueFormat = other.XAxisValueFormat; + YAxisValueFormat = other.YAxisValueFormat; + XAxisSize = other.XAxisSize; + YAxisSize = other.YAxisSize; + XAxisTicksPerLabel = other.XAxisTicksPerLabel; + XAxisLabel = other.XAxisLabel; + YAxisLabel = other.YAxisLabel; + DisplayFirstYAxisValue = other.DisplayFirstYAxisValue; + LabelFont = other.LabelFont; + AxisFont = other.AxisFont; + BackgroundColorDark = other.BackgroundColorDark; + BackgroundColorLight = other.BackgroundColorLight; + Padding = other.Padding; + ScrollbarHeight = other.ScrollbarHeight; + ScrollbarBackground = other.ScrollbarBackground; + ScrollbarButton = other.ScrollbarButton; + ScrollbarDecorations = other.ScrollbarDecorations; + DecorationScrollLeft = other.DecorationScrollLeft; + DecorationScrollRight = other.DecorationScrollRight; + MinimumThumbWidth = other.MinimumThumbWidth; + SmoothScrollSpeed = other.SmoothScrollSpeed; + + getLeftArrowImage = WidgetUtils.GetCachedStatefulImage(ScrollbarDecorations, DecorationScrollLeft); + getRightArrowImage = WidgetUtils.GetCachedStatefulImage(ScrollbarDecorations, DecorationScrollRight); + } + + void SetHorizontalOffset(float value, bool smooth) + { + targetHorizontalOffset = value; + if (!smooth) + { + horizontalOffset = value; + Ui.ResetTooltips(); + } + } + + void UpdateSmoothScrolling() + { + if (lastSmoothScrollTime == 0) + { + lastSmoothScrollTime = Game.RunTime; + return; + } + + var dt = Game.RunTime - lastSmoothScrollTime; + lastSmoothScrollTime = Game.RunTime; + + var offsetDiff = targetHorizontalOffset - horizontalOffset; + var absOffsetDiff = Math.Abs(offsetDiff); + if (absOffsetDiff > 1f) + { + var speed = Math.Max(0.01f, Math.Min(1f, SmoothScrollSpeed * dt / 40f)); + horizontalOffset += offsetDiff * speed; + } + else + { + horizontalOffset = targetHorizontalOffset; + } + } + + void Scroll(float amount, bool smooth = true) + { + var newTarget = targetHorizontalOffset + amount * Game.Settings.Game.UIScrollSpeed; + SetHorizontalOffset(newTarget, smooth); + autoScrollEnabled = false; + manuallyScrolled = true; + } + + public override void Draw() + { + if (GetSeries == null || GetLabelFont == null) + return; + + var series = GetSeries(); + if (!series.Any()) + return; + + var font = GetLabelFont(); + if (font == null) + return; + + UpdateSmoothScrolling(); + + var cr = Game.Renderer.RgbaColorRenderer; + var rect = RenderBounds; + + var labelFont = Game.Renderer.Fonts[font]; + var axisFont = Game.Renderer.Fonts[GetAxisFont()]; + + var xAxisSize = GetXAxisSize(); + var yAxisSize = GetYAxisSize(); + + var xAxisLabel = GetXAxisLabel(); + var xAxisLabelSize = axisFont.Measure(xAxisLabel); + + var xAxisPointLabelHeight = labelFont.Measure("0").Y; + + var graphBottomOffset = Padding * 2 + xAxisLabelSize.Y + xAxisPointLabelHeight + ScrollbarHeight; + var height = rect.Height - (graphBottomOffset + Padding * 4); + + var maxValue = series.Select(p => p.Points).SelectMany(d => d).Concat(new[] { 0f }).Max(); + var longestName = series.Select(s => s.Key).OrderByDescending(s => s.Length).FirstOrDefault() ?? ""; + + var scaledMaxValue = Math.Max((float)Math.Ceiling(maxValue / 1000) * 1000, 5000f); + var scale = height / scaledMaxValue; + + var widthMaxValue = labelFont.Measure(GetYAxisValueFormat().FormatCurrent(scaledMaxValue)).X; + var widthLongestName = labelFont.Measure(longestName).X; + + // y axis label + var yAxisLabel = GetYAxisLabel(); + var yAxisLabelSize = axisFont.Measure(yAxisLabel); + + var width = rect.Width - (Padding * 10 + widthMaxValue + widthLongestName + yAxisLabelSize.Y); + + var pointCount = series.Max(s => s.Points.Count()); + var totalDataWidth = pointCount * (width / xAxisSize); + var maxHorizontalOffset = Math.Max(0, totalDataWidth - width); + + targetHorizontalOffset = Math.Max(-maxHorizontalOffset, Math.Min(0, targetHorizontalOffset)); + horizontalOffset = Math.Max(-maxHorizontalOffset, Math.Min(0, horizontalOffset)); + + var xStep = width / xAxisSize; + var yStep = height / yAxisSize; + + var visibleStart = Math.Max(0, (int)Math.Floor(-horizontalOffset / xStep)); + var visibleEnd = Math.Min(pointCount, visibleStart + xAxisSize + 1); + + var graphOrigin = new float2(rect.Left, rect.Bottom) + new float2(Padding * 3 + widthMaxValue + yAxisLabelSize.Y, -graphBottomOffset); + + var origin = new float2(rect.Left, rect.Bottom); + + var keyOffset = 0; + + // added sorting so that names appear in order of highest value to lowest value + series = series.OrderByDescending(s => s.Points.LastOrDefault()).ToList(); + + // Enable clipping to prevent graph lines from bleeding into Y axis labels and extending beyond bounds + // Clip both left and right sides to contain the graph within proper bounds + var graphClipRect = new Rectangle((int)graphOrigin.X, (int)(graphOrigin.Y - height), width, height); + Game.Renderer.EnableScissor(graphClipRect); + + foreach (var s in series) + { + var key = s.Key; + var color = s.Color; + var points = s.Points.ToArray(); + if (points.Length > 0) + { + var visiblePoints = new List(); + for (var i = visibleStart; i < Math.Min(visibleEnd, points.Length); i++) + { + var screenX = i * xStep + horizontalOffset; + var screenY = -points[i] * scale; + visiblePoints.Add(graphOrigin + new float3(screenX, screenY, 0)); + } + + if (visiblePoints.Count > 1) + { + cr.DrawLine(visiblePoints, 1, color); + } + } + } + + // Disable clipping before drawing labels and other elements + Game.Renderer.DisableScissor(); + + foreach (var s in series) + { + var key = s.Key; + var color = s.Color; + var points = s.Points.ToArray(); + if (points.Length > 0) + { + var visiblePoints = new List(); + for (var i = visibleStart; i < Math.Min(visibleEnd, points.Length); i++) + { + var screenX = i * xStep + horizontalOffset; + var screenY = -points[i] * scale; + + if (screenX >= -xStep && screenX <= width + xStep) + { + visiblePoints.Add(graphOrigin + new float3(screenX, screenY, 0)); + } + } + + if (visiblePoints.Count > 0) + { + var lastPoint = visiblePoints[^1]; + + if (lastPoint.X >= graphOrigin.X && lastPoint.X <= graphOrigin.X + width) + { + var lastIndex = visibleStart + visiblePoints.Count - 1; + var lastValue = points[Math.Min(lastIndex, points.Length - 1)]; + if (lastValue != 0f) + { + labelFont.DrawTextWithShadow(GetValueFormat().FormatCurrent(lastValue), + new float2(lastPoint.X, lastPoint.Y - 2), + color, BackgroundColorDark, BackgroundColorLight, 1); + } + } + } + } + + labelFont.DrawTextWithShadow(key, new float2(rect.Right, rect.Top) + new float2(-(widthLongestName + Padding), 10 * keyOffset + 3), + color, BackgroundColorDark, BackgroundColorLight, 1); + keyOffset++; + } + + var scrollbarY = rect.Bottom - ScrollbarHeight; + var scrollbarWidth = width; + var scrollbarX = graphOrigin.X; + + scrollbarRect = new Rectangle((int)scrollbarX, scrollbarY, scrollbarWidth, ScrollbarHeight); + leftButtonRect = new Rectangle((int)scrollbarX, scrollbarY, ScrollbarHeight, ScrollbarHeight); + rightButtonRect = new Rectangle((int)(scrollbarX + scrollbarWidth - ScrollbarHeight), scrollbarY, ScrollbarHeight, ScrollbarHeight); + + WidgetUtils.DrawPanel(ScrollbarBackground, scrollbarRect); + + var availableThumbSpace = scrollbarWidth - 2 * ScrollbarHeight; + var thumbWidth = maxHorizontalOffset > 0 ? + Math.Max(MinimumThumbWidth, Math.Min(availableThumbSpace - MinimumThumbWidth * 2, availableThumbSpace * width / totalDataWidth)) : + availableThumbSpace; + var actualthumbWidth = Math.Min(thumbWidth, availableThumbSpace); + + var thumbCalculationOffset = autoScrollEnabled && maxHorizontalOffset > 0 ? -maxHorizontalOffset : horizontalOffset; + var thumbPosition = maxHorizontalOffset > 0 ? + ScrollbarHeight + (int)((availableThumbSpace - actualthumbWidth) * (-thumbCalculationOffset / maxHorizontalOffset)) : + ScrollbarHeight; + + thumbRect = new Rectangle((int)scrollbarX + thumbPosition, scrollbarY, actualthumbWidth, ScrollbarHeight); + + var mouseButtonDown = leftPressed || thumbPressed || (rightPressed && !rightDisabled); + if (autoScrollEnabled && maxHorizontalOffset > 0 && !mouseButtonDown) + { + SetHorizontalOffset(-maxHorizontalOffset, false); + } + + if (!autoScrollEnabled && maxHorizontalOffset > 0 && !mouseButtonDown && rightDisabled && manuallyScrolled) + { + if (rightPressed || Math.Abs(targetHorizontalOffset + maxHorizontalOffset) < 1) + { + autoScrollEnabled = true; + manuallyScrolled = false; + } + } + + // Draw scrollbar elements + // When auto-scrolling is enabled, force the scrollbar to move to the rightmost position + var effectiveHorizontalOffset = autoScrollEnabled && maxHorizontalOffset > 0 ? -maxHorizontalOffset : horizontalOffset; + + leftDisabled = effectiveHorizontalOffset >= 0; + rightDisabled = effectiveHorizontalOffset <= -maxHorizontalOffset; + + var leftHover = Ui.MouseOverWidget == this && leftButtonRect.Contains(Viewport.LastMousePos); + var rightHover = Ui.MouseOverWidget == this && rightButtonRect.Contains(Viewport.LastMousePos); + var thumbHover = Ui.MouseOverWidget == this && thumbRect.Contains(Viewport.LastMousePos); + + ButtonWidget.DrawBackground(ScrollbarButton, leftButtonRect, leftDisabled, leftPressed, leftHover, false); + ButtonWidget.DrawBackground(ScrollbarButton, rightButtonRect, rightDisabled, rightPressed, rightHover, false); + + if (maxHorizontalOffset > 0) + ButtonWidget.DrawBackground(ScrollbarButton, thumbRect, false, thumbPressed, thumbHover, false); + + // Draw arrow decorations + var leftOffset = !leftPressed || leftDisabled ? 0 : 1; // Using 1 instead of ButtonDepth for simplicity + var rightOffset = !rightPressed || rightDisabled ? 0 : 1; + + var leftArrowImage = getLeftArrowImage.Update((leftDisabled, leftPressed, leftHover, false, false)); + WidgetUtils.DrawSprite(leftArrowImage, + new float2(leftButtonRect.Left + leftOffset, leftButtonRect.Top + leftOffset)); + + var rightArrowImage = getRightArrowImage.Update((rightDisabled, rightPressed, rightHover, false, false)); + WidgetUtils.DrawSprite(rightArrowImage, + new float2(rightButtonRect.Left + rightOffset, rightButtonRect.Top + rightOffset)); + + // Draw x axis + axisFont.DrawTextWithShadow(xAxisLabel, + new float2(graphOrigin.X, origin.Y) + new float2(width / 2 - xAxisLabelSize.X / 2, -(xAxisLabelSize.Y + Padding + ScrollbarHeight)), + Color.White, BackgroundColorDark, BackgroundColorLight, 1); + + // Enable clipping for x-axis labels to prevent them from extending beyond the right graph bound + var xAxisClipRect = new Rectangle((int)graphOrigin.X - 100, (int)(graphOrigin.Y - height), width + 100, height + xAxisPointLabelHeight + 10); + Game.Renderer.EnableScissor(xAxisClipRect); + + // Draw x axis ticks and labels + var maxDataPoints = pointCount; + var labelsToShow = Math.Max(xAxisSize + 2, maxDataPoints); + + for (var i = 0; i < labelsToShow; i++) + { + var screenX = i * xStep + horizontalOffset; + + if (screenX >= 0) + { + cr.DrawLine(graphOrigin + new float2(screenX, 0), graphOrigin + new float2(screenX, -5), 1, Color.White); + if (i % XAxisTicksPerLabel == 0) + { + var xAxisText = GetXAxisValueFormat().FormatCurrent(i / XAxisTicksPerLabel); + var xAxisTickTextWidth = labelFont.Measure(xAxisText).X; + var xLocation = screenX - xAxisTickTextWidth / 2; + labelFont.DrawTextWithShadow(xAxisText, + graphOrigin + new float2(xLocation, 2), + Color.White, BackgroundColorDark, BackgroundColorLight, 1); + } + } + } + + // Disable clipping after drawing x-axis labels + Game.Renderer.DisableScissor(); + + // Draw y axis + axisFont.DrawTextWithShadow(yAxisLabel, + new float2(origin.X, graphOrigin.Y) + new float2(5 - axisFont.TopOffset, -(height / 2 - yAxisLabelSize.X / 2)), + Color.White, BackgroundColorDark, BackgroundColorLight, 1, (float)Math.PI / 2); + + for (var y = GetDisplayFirstYAxisValue() ? 0 : yStep; y <= height; y += yStep) + { + var yValue = y / scale; + cr.DrawLine(graphOrigin + new float2(0, -y), graphOrigin + new float2(5, -y), 1, Color.White); + var text = GetYAxisValueFormat().FormatCurrent(yValue); + + var textWidth = labelFont.Measure(text); + + var yLocation = y + (textWidth.Y + labelFont.TopOffset) / 2; + + labelFont.DrawTextWithShadow(text, + graphOrigin + new float2(-(textWidth.X + 3), -yLocation), + Color.White, BackgroundColorDark, BackgroundColorLight, 1); + } + + // Bottom line + cr.DrawLine(graphOrigin, graphOrigin + new float2(width, 0), 1, Color.White); + + // Left line + cr.DrawLine(graphOrigin, graphOrigin + new float2(0, -height), 1, Color.White); + } + + public override Widget Clone() + { + return new ScrollableLineGraphWidget(this); + } + + public override bool YieldMouseFocus(MouseInput mi) + { + leftPressed = rightPressed = thumbPressed = false; + return base.YieldMouseFocus(mi); + } + + public override bool HandleMouseInput(MouseInput mi) + { + if (mi.Event == MouseInputEvent.Scroll && EventBounds.Contains(mi.Location)) + { + Scroll(mi.Delta.Y, true); + return true; + } + + if (mi.Button != MouseButton.Left) + return false; + + if (mi.Event == MouseInputEvent.Down && !TakeMouseFocus(mi)) + return false; + + if (!HasMouseFocus) + return false; + + if (mi.Event == MouseInputEvent.Up) + { + leftPressed = rightPressed = thumbPressed = false; + YieldMouseFocus(mi); + return true; + } + + if (mi.Event == MouseInputEvent.Move && thumbPressed) + { + var deltaX = mi.Location.X - lastMousePos.X; + var series = GetSeries(); + if (series.Any()) + { + var pointCount = series.Max(s => s.Points.Count()); + var rect = RenderBounds; + + var font = GetLabelFont(); + if (font == null) + return false; + + var labelFont = Game.Renderer.Fonts[font]; + var axisFont = Game.Renderer.Fonts[GetAxisFont()]; + + var maxValue = series.Select(p => p.Points).SelectMany(d => d).Concat(new[] { 0f }).Max(); + var longestName = series.Select(s => s.Key).OrderByDescending(s => s.Length).FirstOrDefault() ?? ""; + var scaledMaxValue = Math.Max((float)Math.Ceiling(maxValue / 1000) * 1000, 5000f); + + var widthMaxValue = labelFont.Measure(GetYAxisValueFormat().FormatCurrent(scaledMaxValue)).X; + var widthLongestName = labelFont.Measure(longestName).X; + var yAxisLabel = GetYAxisLabel(); + var yAxisLabelSize = axisFont.Measure(yAxisLabel); + + var width = rect.Width - (Padding * 10 + widthMaxValue + widthLongestName + yAxisLabelSize.Y); + + var totalDataWidth = pointCount * (width / GetXAxisSize()); + var maxHorizontalOffset = Math.Max(0, totalDataWidth - width); + + if (maxHorizontalOffset > 0) + { + var availableThumbSpace = scrollbarRect.Width - 2 * ScrollbarHeight; + var proportionalThumbSize = availableThumbSpace * width / totalDataWidth; + var actualThumbSize = Math.Max(MinimumThumbWidth, Math.Min(proportionalThumbSize, availableThumbSpace - MinimumThumbWidth * 2)); + var thumbRange = availableThumbSpace - actualThumbSize; + + if (thumbRange > 0) + { + var scrollAmount = deltaX / (float)thumbRange * maxHorizontalOffset; + SetHorizontalOffset(targetHorizontalOffset - scrollAmount, false); + autoScrollEnabled = false; + manuallyScrolled = true; + } + } + } + + lastMousePos = mi.Location; + return true; + } + + if (mi.Event == MouseInputEvent.Down) + { + if (leftButtonRect.Contains(mi.Location) && !leftDisabled) + { + leftPressed = true; + Scroll(1, true); + PlayClickSound(); + return true; + } + else if (rightButtonRect.Contains(mi.Location) && !rightDisabled) + { + rightPressed = true; + Scroll(-1, true); + PlayClickSound(); + return true; + } + else if (thumbRect.Contains(mi.Location)) + { + thumbPressed = true; + lastMousePos = mi.Location; + autoScrollEnabled = false; + manuallyScrolled = true; + PlayClickSound(); + return true; + } + else if (scrollbarRect.Contains(mi.Location)) + { + var clickX = mi.Location.X; + var thumbCenterX = thumbRect.Left + thumbRect.Width / 2; + + if (clickX < thumbCenterX) + Scroll(2, true); + else + Scroll(-2, true); + + return true; + } + } + + return false; + } + + void PlayClickSound() + { + if ((thumbPressed && (!rightDisabled || !leftDisabled)) || (rightPressed && !rightDisabled) || (leftPressed && !leftDisabled)) + Game.Sound.PlayNotification(ModRules, null, "Sounds", ClickSound, null); + else if ((rightPressed && rightDisabled) || (leftPressed && leftDisabled)) + Game.Sound.PlayNotification(ModRules, null, "Sounds", ClickDisabledSound, null); + } + + public override void Tick() + { + if (leftPressed && !leftDisabled) + Scroll(1, true); + + if (rightPressed && !rightDisabled) + Scroll(-1, true); + } + } + + public class ScrollableLineGraphSeries + { + public string Key; + public Color Color; + public IEnumerable Points; + + public ScrollableLineGraphSeries(string key, Color color, IEnumerable points) + { + Key = key; + Color = color; + Points = points; + } + } +} diff --git a/OpenRA.Mods.CA/Widgets/SpritePowerMeterWidget.cs b/OpenRA.Mods.CA/Widgets/SpritePowerMeterWidget.cs new file mode 100644 index 0000000000..19848a3468 --- /dev/null +++ b/OpenRA.Mods.CA/Widgets/SpritePowerMeterWidget.cs @@ -0,0 +1,138 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System; +using OpenRA.Graphics; +using OpenRA.Mods.Common.Widgets; +using OpenRA.Widgets; + +namespace OpenRA.Mods.CA.Widgets +{ + public class SpritePowerMeterWidget : Widget + { + [FieldLoader.Require] + public readonly int BarStride = 4; + + [FieldLoader.Require] + public readonly int PowerUnitsPerBar = 10; + + [FieldLoader.Require] + public readonly string ImageCollection = ""; + + [FieldLoader.Require] + public readonly string NoPowerImage = ""; + + [FieldLoader.Require] + public readonly string AvailablePowerImage = ""; + + [FieldLoader.Require] + public readonly string UsedPowerImage = ""; + + [FieldLoader.Require] + public readonly string OverUsedPowerImage = ""; + + [FieldLoader.Require] + public readonly string FlashPowerImage = ""; + + [FieldLoader.Require] + public readonly int WarningFlashDuration = 10; + + [FieldLoader.Require] + public readonly int WarningFlashBlinkRate = 80; + + public int NumberOfBars; + + public int WarningFlash; + public int TotalPowerDisplay; + public int LastTotalPowerDisplay; + + public float TotalPowerStep; + public float PowerUsedStep; + public float PowerAvailableStep; + + public bool LowPower; + + public readonly string TooltipTemplate; + public readonly string TooltipContainer; + protected Lazy tooltipContainer; + + public Func GetTooltipText = () => ""; + + [ObjectCreator.UseCtor] + public SpritePowerMeterWidget() + { + tooltipContainer = Exts.Lazy(() => + Ui.Root.Get(TooltipContainer)); + } + + public override void MouseEntered() + { + if (TooltipContainer == null) + return; + + if (GetTooltipText != null) + tooltipContainer.Value.SetTooltip(TooltipTemplate, new WidgetArgs() { { "getText", GetTooltipText } }); + } + + public override void MouseExited() + { + // Only try to remove the tooltip if we know it has been created + // This avoids a crash if the widget (and the container it refers to) are being removed + if (TooltipContainer != null && tooltipContainer.IsValueCreated) + tooltipContainer.Value.RemoveTooltip(); + } + + public override void Draw() + { + NumberOfBars = RenderBounds.Height / BarStride; + + // Cache it here, because DPI changes can happen + var noPowerImage = ChromeProvider.GetImage(ImageCollection, NoPowerImage); + var availablePowerImage = ChromeProvider.GetImage(ImageCollection, AvailablePowerImage); + var usedPowerImage = ChromeProvider.GetImage(ImageCollection, UsedPowerImage); + var overusedPowerImage = ChromeProvider.GetImage(ImageCollection, OverUsedPowerImage); + var flashPowerImage = ChromeProvider.GetImage(ImageCollection, FlashPowerImage); + + // Create a list of new bars + for (var i = 0; i < NumberOfBars; i++) + { + var image = noPowerImage; + + var targetIcon = availablePowerImage; + + if (i < PowerUsedStep) + targetIcon = usedPowerImage; + + if (i > PowerAvailableStep) + targetIcon = overusedPowerImage; + + if (i == TotalPowerStep && LowPower) + targetIcon = overusedPowerImage; + + // Flash the top bar if something is wrong + if (i == TotalPowerStep) + { + if (WarningFlash % WarningFlashBlinkRate != 0) + targetIcon = flashPowerImage; + if (WarningFlash > 0) + WarningFlash--; + } + + if (image != targetIcon) + image = targetIcon; + + var bounds = new int2(RenderBounds.X, -(i * BarStride) + RenderBounds.Height + RenderBounds.Y); + WidgetUtils.DrawSprite(image, bounds); + + Bounds.Width = image.Bounds.Width; + } + } + } +} diff --git a/OpenRA.Mods.CA/Widgets/SupportPowersScrollableWidget.cs b/OpenRA.Mods.CA/Widgets/SupportPowersScrollableWidget.cs new file mode 100644 index 0000000000..2e2523803e --- /dev/null +++ b/OpenRA.Mods.CA/Widgets/SupportPowersScrollableWidget.cs @@ -0,0 +1,336 @@ +#region Copyright & License Information +/* + * Copyright (c) The OpenRA Developers and Contributors + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. For more + * information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Linq; +using OpenRA.Graphics; +using OpenRA.Mods.Common.Lint; +using OpenRA.Mods.Common.Traits; +using OpenRA.Mods.Common.Widgets; +using OpenRA.Primitives; +using OpenRA.Widgets; + +using SupportPowerIcon = OpenRA.Mods.Common.Widgets.SupportPowersWidget.SupportPowerIcon; + +namespace OpenRA.Mods.CA.Widgets +{ + public class SupportPowersScrollableWidget : Widget + { + [FluentReference] + public string ReadyText = ""; + + [FluentReference] + public string HoldText = ""; + + public readonly string OverlayFont = "TinyBold"; + + public readonly int2 IconSize = new(64, 48); + public readonly int IconMargin = 10; + public readonly int2 IconSpriteOffset = int2.Zero; + + public readonly string TooltipContainer; + public readonly string TooltipTemplate = "SUPPORT_POWER_TOOLTIP"; + + // Note: LinterHotkeyNames assumes that these are disabled by default + public readonly string HotkeyPrefix = null; + public readonly int HotkeyCount = 0; + + public readonly string ClockAnimation = "clock"; + public readonly string ClockSequence = "idle"; + public readonly string ClockPalette = "chrome"; + + public readonly bool Horizontal = false; + + public int IconCount { get; private set; } + public event Action OnIconCountChanged = (a, b) => { }; + + readonly ModData modData; + readonly WorldRenderer worldRenderer; + readonly SupportPowerManager spm; + + Animation icon; + Animation clock; + Dictionary icons = new(); + + public SupportPowerIcon TooltipIcon { get; private set; } + public Func GetTooltipIcon; + readonly Lazy tooltipContainer; + HotkeyReference[] hotkeys; + + public readonly int MaxPowersVisible = 10; + public int CurrentStartIndex = 0; + public int VisibleIconCount { get; private set; } + public readonly string ClickSound = ChromeMetrics.Get("ClickSound"); + + Rectangle eventBounds; + public override Rectangle EventBounds => eventBounds; + SpriteFont overlayFont; + float2 iconOffset, holdOffset, readyOffset, timeOffset; + + [CustomLintableHotkeyNames] + public static IEnumerable LinterHotkeyNames(MiniYamlNode widgetNode, Action emitError) + { + var prefix = ""; + var prefixNode = widgetNode.Value.Nodes.FirstOrDefault(n => n.Key == "HotkeyPrefix"); + if (prefixNode != null) + prefix = prefixNode.Value.Value; + + var count = 0; + var countNode = widgetNode.Value.Nodes.FirstOrDefault(n => n.Key == "HotkeyCount"); + if (countNode != null) + count = FieldLoader.GetValue("HotkeyCount", countNode.Value.Value); + + if (count == 0) + return Array.Empty(); + + if (string.IsNullOrEmpty(prefix)) + emitError($"{widgetNode.Location} must define HotkeyPrefix if HotkeyCount > 0."); + + return Exts.MakeArray(count, i => prefix + (i + 1).ToString("D2")); + } + + [ObjectCreator.UseCtor] + public SupportPowersScrollableWidget(ModData modData, World world, WorldRenderer worldRenderer) + { + this.modData = modData; + this.worldRenderer = worldRenderer; + GetTooltipIcon = () => TooltipIcon; + spm = world.LocalPlayer.PlayerActor.Trait(); + tooltipContainer = Exts.Lazy(() => + Ui.Root.Get(TooltipContainer)); + + var scale = Game.Settings.Graphics.UIScale; + var usableScreenHeight = Game.Renderer.Resolution.Height - (150 / scale); + MaxPowersVisible = (int)Math.Floor((double)usableScreenHeight / (IconSize.Y + IconMargin - 2)); + } + + public override void Initialize(WidgetArgs args) + { + base.Initialize(args); + + hotkeys = Exts.MakeArray(HotkeyCount, + i => modData.Hotkeys[HotkeyPrefix + (i + 1).ToString("D2")]); + + overlayFont = Game.Renderer.Fonts[OverlayFont]; + + iconOffset = 0.5f * IconSize.ToFloat2() + IconSpriteOffset; + + HoldText = FluentProvider.GetMessage(HoldText); + holdOffset = iconOffset - overlayFont.Measure(HoldText) / 2; + ReadyText = FluentProvider.GetMessage(ReadyText); + readyOffset = iconOffset - overlayFont.Measure(ReadyText) / 2; + + clock = new Animation(worldRenderer.World, ClockAnimation); + } + + public void RefreshIcons() + { + icons = new Dictionary(); + var powers = spm.Powers.Values.Where(p => !p.Disabled && p.Info != null) + .OrderBy(p => p.Info.SupportPowerPaletteOrder); + + if (CurrentStartIndex > powers.Count() - 1) + CurrentStartIndex = 0; + + var oldVisibleIconCount = VisibleIconCount; + VisibleIconCount = 0; + IconCount = 0; + + var rb = RenderBounds; + foreach (var p in powers) + { + if (IconCount < CurrentStartIndex || IconCount >= CurrentStartIndex + MaxPowersVisible) + { + IconCount++; + continue; + } + + Rectangle rect; + if (Horizontal) + rect = new Rectangle(rb.X + VisibleIconCount * (IconSize.X + IconMargin), rb.Y, IconSize.X, IconSize.Y); + else + rect = new Rectangle(rb.X, rb.Y + VisibleIconCount * (IconSize.Y + IconMargin), IconSize.X, IconSize.Y); + + icon = new Animation(worldRenderer.World, p.Info.IconImage); + icon.Play(p.Info.Icon); + + var power = new SupportPowerIcon() + { + Power = p, + Pos = new float2(rect.Location), + Sprite = icon.Image, + Palette = worldRenderer.Palette(p.Info.IconPalette), + IconClockPalette = worldRenderer.Palette(ClockPalette), + Hotkey = VisibleIconCount < HotkeyCount ? hotkeys[VisibleIconCount] : null, + }; + + icons.Add(rect, power); + IconCount++; + VisibleIconCount++; + } + + eventBounds = icons.Keys.Union(); + + if (oldVisibleIconCount != VisibleIconCount) + OnIconCountChanged(oldVisibleIconCount, VisibleIconCount); + } + + protected void ClickIcon(SupportPowerIcon clicked) + { + if (!clicked.Power.Active) + { + if (clicked.Power.Info != null) + { + Game.Sound.PlayToPlayer(SoundType.UI, spm.Self.Owner, clicked.Power.Info.InsufficientPowerSound); + Game.Sound.PlayNotification(spm.Self.World.Map.Rules, spm.Self.Owner, "Speech", + clicked.Power.Info.InsufficientPowerSpeechNotification, spm.Self.Owner.Faction.InternalName); + + TextNotificationsManager.AddTransientLine(spm.Self.Owner, clicked.Power.Info.InsufficientPowerTextNotification); + } + } + else + clicked.Power.Target(); + } + + public override bool HandleKeyPress(KeyInput e) + { + if (e.Event == KeyInputEvent.Down) + { + var a = icons.Values.FirstOrDefault(i => i.Hotkey != null && i.Hotkey.IsActivatedBy(e)); + + if (a != null) + { + ClickIcon(a); + return true; + } + } + + return false; + } + + public override void Draw() + { + timeOffset = iconOffset - overlayFont.Measure(WidgetUtils.FormatTime(0, worldRenderer.World.Timestep)) / 2; + + // Icons + Game.Renderer.EnableAntialiasingFilter(); + foreach (var p in icons.Values) + { + WidgetUtils.DrawSpriteCentered(p.Sprite, p.Palette, p.Pos + iconOffset); + + // Charge progress + var sp = p.Power; + clock.PlayFetchIndex(ClockSequence, + () => sp.TotalTicks == 0 ? clock.CurrentSequence.Length - 1 : (sp.TotalTicks - sp.RemainingTicks) + * (clock.CurrentSequence.Length - 1) / sp.TotalTicks); + + clock.Tick(); + WidgetUtils.DrawSpriteCentered(clock.Image, p.IconClockPalette, p.Pos + iconOffset); + } + + Game.Renderer.DisableAntialiasingFilter(); + + // Overlay + foreach (var p in icons.Values) + { + var customText = p.Power.IconOverlayTextOverride(); + if (customText != null) + { + var customOffset = iconOffset - overlayFont.Measure(customText) / 2; + overlayFont.DrawTextWithContrast(customText, + p.Pos + customOffset, + Color.White, Color.Black, 1); + } + else if (p.Power.Ready) + overlayFont.DrawTextWithContrast(ReadyText, + p.Pos + readyOffset, + Color.White, Color.Black, 1); + else if (!p.Power.Active) + overlayFont.DrawTextWithContrast(HoldText, + p.Pos + holdOffset, + Color.White, Color.Black, 1); + else + overlayFont.DrawTextWithContrast(WidgetUtils.FormatTime(p.Power.RemainingTicks, worldRenderer.World.Timestep), + p.Pos + timeOffset, + Color.White, Color.Black, 1); + } + } + + public override void Tick() + { + // TODO: Only do this when the powers have changed + RefreshIcons(); + } + + public override void MouseEntered() + { + if (TooltipContainer == null) + return; + + tooltipContainer.Value.SetTooltip(TooltipTemplate, + new WidgetArgs() + { + { "world", worldRenderer.World }, { "player", spm.Self.Owner }, { "getTooltipIcon", GetTooltipIcon }, + { "playerResources", worldRenderer.World.LocalPlayer.PlayerActor.Trait() } + }); + } + + public override void MouseExited() + { + if (TooltipContainer == null) + return; + + tooltipContainer.Value.RemoveTooltip(); + } + + public override bool HandleMouseInput(MouseInput mi) + { + if (mi.Event == MouseInputEvent.Scroll) + { + if (mi.Delta.Y > 0 && CurrentStartIndex > 0 ) + Scroll(-1); + else if (mi.Delta.Y < 0 && CurrentStartIndex + MaxPowersVisible < IconCount) + Scroll(1); + + return true; + } + + if (mi.Event == MouseInputEvent.Move) + { + var icon = icons.Where(i => i.Key.Contains(mi.Location)) + .Select(i => i.Value).FirstOrDefault(); + + TooltipIcon = icon; + return false; + } + + if (mi.Event != MouseInputEvent.Down) + return false; + + var clicked = icons.Where(i => i.Key.Contains(mi.Location)) + .Select(i => i.Value).FirstOrDefault(); + + if (clicked != null) + ClickIcon(clicked); + + return true; + } + + void Scroll(int direction) + { + CurrentStartIndex += direction; + CurrentStartIndex = Math.Max(0, CurrentStartIndex); + CurrentStartIndex = Math.Min(IconCount - MaxPowersVisible, CurrentStartIndex); + Game.Sound.PlayNotification(worldRenderer.World.Map.Rules, null, "Sounds", ClickSound, null); + } + } +} diff --git a/OpenRA.Mods.CA/Widgets/WidgetUtilsCA.cs b/OpenRA.Mods.CA/Widgets/WidgetUtilsCA.cs new file mode 100644 index 0000000000..459e4fcf77 --- /dev/null +++ b/OpenRA.Mods.CA/Widgets/WidgetUtilsCA.cs @@ -0,0 +1,99 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, which is free software. + * It is made available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. For more information, see COPYING. + */ +#endregion + +using System.Linq; +using OpenRA.Graphics; + +namespace OpenRA.Mods.CA.Widgets +{ + public static class WidgetUtilsCA + { + public static string WrapTextWithIndent(string text, int width, SpriteFont font, int indent = 4) + { + var textSize = font.Measure(text); + var indentString = indent > 0 ? new string(' ', indent) : ""; + var effectiveWidth = indent > 0 ? width - font.Measure(indentString).X : width; + + if (textSize.X > width) + { + var lines = text.Split('\n').ToList(); + var isOriginalLine = new bool[lines.Count]; + + // Mark all initial lines as original + for (var i = 0; i < lines.Count; i++) + { + isOriginalLine[i] = true; + } + + for (var i = 0; i < lines.Count; i++) + { + var line = lines[i]; + var currentWidth = isOriginalLine[i] ? width : effectiveWidth; + + if (font.Measure(line).X <= currentWidth) + continue; + + // Scan forwards until we find the last word that fits + // This guarantees a small bound on the amount of string we need to search before a linebreak + var start = 0; + while (true) + { + var spaceIndex = line.IndexOf(' ', start); + if (spaceIndex == -1) + break; + + var fragmentWidth = font.Measure(line[..spaceIndex]).X; + if (fragmentWidth > currentWidth) + break; + + start = spaceIndex + 1; + } + + if (start > 0) + { + lines[i] = line[..(start - 1)]; + lines.Insert(i + 1, line[start..]); + + // Expand the isOriginalLine array and mark the new line as wrapped + var newIsOriginalLine = new bool[lines.Count]; + for (var j = 0; j <= i; j++) + { + newIsOriginalLine[j] = isOriginalLine[j]; + } + + newIsOriginalLine[i + 1] = false; // This is a wrapped line + for (var j = i + 2; j < lines.Count; j++) + { + newIsOriginalLine[j] = isOriginalLine[j - 1]; + } + + isOriginalLine = newIsOriginalLine; + } + } + + // Apply indentation only to wrapped lines (not original lines) + if (indent > 0) + { + for (var i = 0; i < lines.Count; i++) + { + if (!isOriginalLine[i]) + { + lines[i] = indentString + lines[i]; + } + } + } + + return string.Join("\n", lines); + } + + return text; + } + } +} diff --git a/fetch-engine.sh b/fetch-engine.sh index 5850bba0cd..8b4ca0f190 100755 --- a/fetch-engine.sh +++ b/fetch-engine.sh @@ -74,6 +74,10 @@ if [ "${AUTOMATIC_ENGINE_MANAGEMENT}" = "True" ]; then rmdir "${AUTOMATIC_ENGINE_EXTRACT_DIRECTORY}" rm "${AUTOMATIC_ENGINE_TEMP_ARCHIVE_NAME}" + # HACK: Remove bogus lint check that the Example mod can't possibly pass + # because to do so it would need to define a lot of excess things surrounding resources. + rm ${ENGINE_DIRECTORY}/OpenRA.Mods.Common/Lint/CheckFluentReferences.cs + echo "Compiling engine..." cd "${ENGINE_DIRECTORY}" || exit 1 make version VERSION="${ENGINE_VERSION}" diff --git a/launch-dedicated.cmd b/launch-dedicated.cmd index c78a427e34..429145c52f 100644 --- a/launch-dedicated.cmd +++ b/launch-dedicated.cmd @@ -1,11 +1,13 @@ -:: example launch script, see https://github.com/OpenRA/OpenRA/wiki/Dedicated for details +:: example launch script, see https://github.com/OpenRA/OpenRA/wiki/Dedicated-Server for details @echo on set Name="Dedicated Server" +set Map="" set ListenPort=1234 set AdvertiseOnline=True set Password="" +set RecordReplays=False set RequireAuthentication=False set ProfileIDBlacklist="" @@ -16,6 +18,12 @@ set EnableSyncReports=False set EnableGeoIP=True set ShareAnonymizedIPs=True +set FloodLimitJoinCooldown=5000 + +set QueryMapRepository=True + +set SupportDir="" + @echo off setlocal EnableDelayedExpansion @@ -33,7 +41,7 @@ if not exist %ENGINE_DIRECTORY%\bin\OpenRA.exe goto noengine cd %ENGINE_DIRECTORY% :loop -bin\OpenRA.Server.exe Game.Mod=%MOD_ID% Engine.EngineDir=".." Server.Name=%Name% Server.ListenPort=%ListenPort% Server.AdvertiseOnline=%AdvertiseOnline% Server.EnableSingleplayer=%EnableSingleplayer% Server.Password=%Password% Server.RequireAuthentication=%RequireAuthentication% Server.ProfileIDBlacklist=%ProfileIDBlacklist% Server.ProfileIDWhitelist=%ProfileIDWhitelist% Server.EnableSyncReports=%EnableSyncReports% Server.EnableGeoIP=%EnableGeoIP% Server.ShareAnonymizedIPs=%ShareAnonymizedIPs% Engine.SupportDir=%SupportDir% +bin\OpenRA.Server.exe Game.Mod=%MOD_ID% Engine.EngineDir=".." Server.Name=%Name% Server.Map=%Map% Server.ListenPort=%ListenPort% Server.AdvertiseOnline=%AdvertiseOnline% Server.EnableSingleplayer=%EnableSingleplayer% Server.Password=%Password% Server.RecordReplays=%RecordReplays% Server.RequireAuthentication=%RequireAuthentication% Server.ProfileIDBlacklist=%ProfileIDBlacklist% Server.ProfileIDWhitelist=%ProfileIDWhitelist% Server.EnableSyncReports=%EnableSyncReports% Server.EnableGeoIP=%EnableGeoIP% Server.ShareAnonymizedIPs=%ShareAnonymizedIPs% Server.FloodLimitJoinCooldown=%FloodLimitJoinCooldown% Server.QueryMapRepository=%QueryMapRepository% Engine.SupportDir=%SupportDir% goto loop :noengine diff --git a/launch-dedicated.sh b/launch-dedicated.sh index 76d741e701..7c61322ce7 100755 --- a/launch-dedicated.sh +++ b/launch-dedicated.sh @@ -5,7 +5,10 @@ # Read the file to see which settings you can override set -e -command -v mono >/dev/null 2>&1 || { echo >&2 "The OpenRA mod SDK requires mono."; exit 1; } +if ! command -v mono >/dev/null 2>&1; then + command -v dotnet >/dev/null 2>&1 || { echo >&2 "The OpenRA mod SDK requires dotnet or mono."; exit 1; } +fi + if command -v python3 >/dev/null 2>&1; then PYTHON="python3" else @@ -39,8 +42,15 @@ fi require_variables "MOD_ID" "ENGINE_VERSION" "ENGINE_DIRECTORY" +if command -v mono >/dev/null 2>&1 && [ "$(grep -c .NETCoreApp,Version= ${ENGINE_DIRECTORY}/bin/OpenRA.Server.dll)" = "0" ]; then + RUNTIME_LAUNCHER="mono --debug" +else + RUNTIME_LAUNCHER="dotnet" +fi + NAME="${Name:-"Dedicated Server"}" LAUNCH_MOD="${Mod:-"${MOD_ID}"}" +MAP="${Mod:-""}" LISTEN_PORT="${ListenPort:-"1234"}" ADVERTISE_ONLINE="${AdvertiseOnline:-"True"}" PASSWORD="${Password:-""}" @@ -54,12 +64,15 @@ ENABLE_SINGLE_PLAYER="${EnableSingleplayer:-"False"}" ENABLE_SYNC_REPORTS="${EnableSyncReports:-"False"}" ENABLE_GEOIP="${EnableGeoIP:-"True"}" SHARE_ANONYMISED_IPS="${ShareAnonymizedIPs:-"True"}" + +FLOOD_LIMIT_JOIN_COOLDOWN="${FloodLimitJoinCooldown:-"5000"}" + QUERY_MAP_REPOSITORY="${QueryMapRepository:-"True"}" SUPPORT_DIR="${SupportDir:-""}" cd "${TEMPLATE_ROOT}" -if [ ! -f "${ENGINE_DIRECTORY}/bin/OpenRA.Server.exe" ] || [ "$(cat "${ENGINE_DIRECTORY}/VERSION")" != "${ENGINE_VERSION}" ]; then +if [ ! -f "${ENGINE_DIRECTORY}/bin/OpenRA.Server.dll" ] || [ "$(cat "${ENGINE_DIRECTORY}/VERSION")" != "${ENGINE_VERSION}" ]; then echo "Required engine files not found." echo "Run \`make\` in the mod directory to fetch and build the required files, then try again."; exit 1 @@ -68,18 +81,21 @@ fi cd "${ENGINE_DIRECTORY}" while true; do - MOD_SEARCH_PATHS="${MOD_SEARCH_PATHS}" mono --debug bin/OpenRA.Server.exe Engine.EngineDir=".." Game.Mod="${LAUNCH_MOD}" \ - Server.Name="${NAME}" Server.ListenPort="${LISTEN_PORT}" \ - Server.AdvertiseOnline="${ADVERTISE_ONLINE}" \ - Server.Password="${PASSWORD}" \ - Server.RecordReplays="${RECORD_REPLAYS}" \ - Server.RequireAuthentication="${REQUIRE_AUTHENTICATION}" \ - Server.ProfileIDBlacklist="${PROFILE_ID_BLACKLIST}" \ - Server.ProfileIDWhitelist="${PROFILE_ID_WHITELIST}" \ - Server.EnableSingleplayer="${ENABLE_SINGLE_PLAYER}" \ - Server.EnableSyncReports="${ENABLE_SYNC_REPORTS}" \ - Server.EnableGeoIP="${ENABLE_GEOIP}" \ - Server.ShareAnonymizedIPs="${SHARE_ANONYMISED_IPS}" \ - Server.QueryMapRepository="${QUERY_MAP_REPOSITORY}" \ - Engine.SupportDir="${SUPPORT_DIR}" + MOD_SEARCH_PATHS="${MOD_SEARCH_PATHS}" ${RUNTIME_LAUNCHER} bin/OpenRA.Server.dll Engine.EngineDir=".." Game.Mod="${LAUNCH_MOD}" \ + Server.Name="${NAME}" \ + Server.ListenPort="${LISTEN_PORT}" \ + Server.Map="${MAP}" \ + Server.AdvertiseOnline="${ADVERTISE_ONLINE}" \ + Server.Password="${PASSWORD}" \ + Server.RecordReplays="${RECORD_REPLAYS}" \ + Server.RequireAuthentication="${REQUIRE_AUTHENTICATION}" \ + Server.ProfileIDBlacklist="${PROFILE_ID_BLACKLIST}" \ + Server.ProfileIDWhitelist="${PROFILE_ID_WHITELIST}" \ + Server.EnableSingleplayer="${ENABLE_SINGLE_PLAYER}" \ + Server.EnableSyncReports="${ENABLE_SYNC_REPORTS}" \ + Server.EnableGeoIP="${ENABLE_GEOIP}" \ + Server.ShareAnonymizedIPs="${SHARE_ANONYMISED_IPS}" \ + Server.FloodLimitJoinCooldown="${FLOOD_LIMIT_JOIN_COOLDOWN}" \ + Server.QueryMapRepository="${QUERY_MAP_REPOSITORY}" \ + Engine.SupportDir="${SUPPORT_DIR}" done diff --git a/launch-game.sh b/launch-game.sh index 1d2586f286..be9749ae12 100755 --- a/launch-game.sh +++ b/launch-game.sh @@ -1,7 +1,10 @@ #!/bin/sh set -e -command -v mono >/dev/null 2>&1 || { echo >&2 "The OpenRA mod SDK requires mono."; exit 1; } +if ! command -v mono >/dev/null 2>&1; then + command -v dotnet >/dev/null 2>&1 || { echo >&2 "The OpenRA mod SDK requires dotnet or mono."; exit 1; } +fi + if command -v python3 >/dev/null 2>&1; then PYTHON="python3" else @@ -36,11 +39,17 @@ fi require_variables "MOD_ID" "ENGINE_VERSION" "ENGINE_DIRECTORY" cd "${TEMPLATE_ROOT}" -if [ ! -f "${ENGINE_DIRECTORY}/bin/OpenRA.exe" ] || [ "$(cat "${ENGINE_DIRECTORY}/VERSION")" != "${ENGINE_VERSION}" ]; then +if [ ! -f "${ENGINE_DIRECTORY}/bin/OpenRA.dll" ] || [ "$(cat "${ENGINE_DIRECTORY}/VERSION")" != "${ENGINE_VERSION}" ]; then echo "Required engine files not found." echo "Run \`make\` in the mod directory to fetch and build the required files, then try again."; exit 1 fi +if command -v mono >/dev/null 2>&1 && [ "$(grep -c .NETCoreApp,Version= ${ENGINE_DIRECTORY}/bin/OpenRA.dll)" = "0" ]; then + RUNTIME_LAUNCHER="mono --debug" +else + RUNTIME_LAUNCHER="dotnet" +fi + cd "${ENGINE_DIRECTORY}" -mono --debug bin/OpenRA.exe Engine.EngineDir=".." Engine.LaunchPath="${TEMPLATE_LAUNCHER}" "Engine.ModSearchPaths=${MOD_SEARCH_PATHS}" Game.Mod="${MOD_ID}" "$@" +${RUNTIME_LAUNCHER} bin/OpenRA.dll Engine.EngineDir=".." Engine.LaunchPath="${TEMPLATE_LAUNCHER}" "Engine.ModSearchPaths=${MOD_SEARCH_PATHS}" Game.Mod="${MOD_ID}" "$@" diff --git a/make.ps1 b/make.ps1 index 4101b1452a..8dad44fe3b 100644 --- a/make.ps1 +++ b/make.ps1 @@ -7,6 +7,7 @@ function All-Command { If (!(Test-Path "*.sln")) { + Write-Host "No custom solution file found. Aborting." -ForegroundColor Red return } @@ -15,7 +16,9 @@ function All-Command return } - dotnet build /p:Configuration=Release /nologo + Write-Host "Building $modID in" $configuration "configuration..." -ForegroundColor Cyan + dotnet build -c $configuration --nologo -p:TargetPlatform=win-x64 + if ($lastexitcode -ne 0) { Write-Host "Build failed. If just the development tools failed to build, try installing Visual Studio. You may also still be able to run the game." -ForegroundColor Red @@ -30,6 +33,7 @@ function Clean-Command { If (!(Test-Path "*.sln")) { + Write-Host "No custom solution file found - nothing to clean. Aborting." -ForegroundColor Red return } @@ -38,6 +42,8 @@ function Clean-Command return } + Write-Host "Cleaning $modID..." -ForegroundColor Cyan + dotnet clean /nologo Remove-Item ./*/obj -Recurse -ErrorAction Ignore Remove-Item env:ENGINE_DIRECTORY/bin -Recurse -ErrorAction Ignore @@ -110,8 +116,11 @@ function Check-Command return } - Write-Host "Compiling in debug configuration..." -ForegroundColor Cyan - dotnet build /p:Configuration=Debug /nologo + Write-Host "Compiling $modID in Debug configuration..." -ForegroundColor Cyan + + dotnet clean -c Debug --nologo --verbosity minimal + dotnet build -c Debug --nologo -warnaserror -p:TargetPlatform=win-x64 + if ($lastexitcode -ne 0) { Write-Host "Build failed." -ForegroundColor Red @@ -119,13 +128,10 @@ function Check-Command if ((CheckForUtility) -eq 0) { - Write-Host "Checking runtime assemblies..." -ForegroundColor Cyan - InvokeCommand "$utilityPath $modID --check-runtime-assemblies $env:WHITELISTED_OPENRA_ASSEMBLIES $env:WHITELISTED_THIRDPARTY_ASSEMBLIES $env:WHITELISTED_CORE_ASSEMBLIES $env:WHITELISTED_MOD_ASSEMBLIES" - - Write-Host "Checking for explicit interface violations..." -ForegroundColor Cyan + Write-Host "Checking $modID for explicit interface violations..." -ForegroundColor Cyan InvokeCommand "$utilityPath $modID --check-explicit-interfaces" - Write-Host "Checking for incorrect conditional trait interface overrides..." -ForegroundColor Cyan + Write-Host "Checking $modID for incorrect conditional trait interface overrides..." -ForegroundColor Cyan InvokeCommand "$utilityPath $modID --check-conditional-trait-interface-overrides" } } @@ -160,9 +166,9 @@ function CheckForUtility function CheckForDotnet { - if ((Get-Command "dotnet" -ErrorAction SilentlyContinue) -eq $null) + if ((Get-Command "dotnet" -ErrorAction SilentlyContinue) -eq $null) { - Write-Host "The 'dotnet' tool is required to compile OpenRA. Please install the .NET Core SDK or Visual Studio and try again. https://dotnet.microsoft.com/download" -ForegroundColor Red + Write-Host "The 'dotnet' tool is required to compile OpenRA. Please install the .NET 6.0 SDK and try again. https://dotnet.microsoft.com/download/dotnet/6.0" -ForegroundColor Red return 1 } @@ -171,7 +177,7 @@ function CheckForDotnet function WaitForInput { - echo "Press enter to continue." + Write-Host "Press enter to continue." while ($true) { if ([System.Console]::KeyAvailable) @@ -194,9 +200,7 @@ function ReadConfigLine($line, $name) function ParseConfigFile($fileName) { $names = @("MOD_ID", "ENGINE_VERSION", "AUTOMATIC_ENGINE_MANAGEMENT", "AUTOMATIC_ENGINE_SOURCE", - "AUTOMATIC_ENGINE_EXTRACT_DIRECTORY", "AUTOMATIC_ENGINE_TEMP_ARCHIVE_NAME", "ENGINE_DIRECTORY", - "WHITELISTED_OPENRA_ASSEMBLIES", "WHITELISTED_THIRDPARTY_ASSEMBLIES", "WHITELISTED_CORE_ASSEMBLIES", - "WHITELISTED_MOD_ASSEMBLIES") + "AUTOMATIC_ENGINE_EXTRACT_DIRECTORY", "AUTOMATIC_ENGINE_TEMP_ARCHIVE_NAME", "ENGINE_DIRECTORY") $reader = [System.IO.File]::OpenText($fileName) while($null -ne ($line = $reader.ReadLine())) @@ -219,12 +223,12 @@ function ParseConfigFile($fileName) if ($missing) { - echo "Required mod.config variables are missing:" + Write-Host "Required mod.config variables are missing:" foreach ($m in $missing) { - echo " $m" + Write-Host " $m" } - echo "Repair your mod.config (or user.config) and try again." + Write-Host "Repair your mod.config (or user.config) and try again." WaitForInput exit } @@ -249,24 +253,24 @@ function InvokeCommand ############################################################### if ($PSVersionTable.PSVersion.Major -clt 3) { - echo "The makefile requires PowerShell version 3 or higher." - echo "Please download and install the latest Windows Management Framework version from Microsoft." + Write-Host "The makefile requires PowerShell version 3 or higher." -ForegroundColor Red + Write-Host "Please download and install the latest Windows Management Framework version from Microsoft." -ForegroundColor Red WaitForInput } if ($args.Length -eq 0) { - echo "Command list:" - echo "" - echo " all Builds the game, its development tools and the mod dlls." - echo " version Sets the version strings for all mods to the latest" - echo " version for the current Git branch." - echo " clean Removes all built and copied files." - echo " from the mods and the engine directories." - echo " test Tests the mod's MiniYAML for errors." - echo " check Checks .cs files for StyleCop violations." - echo " check-scripts Checks .lua files for syntax errors." - echo "" + Write-Host "Command list:" + Write-Host "" + Write-Host " all Builds the game, its development tools and the mod dlls." + Write-Host " version Sets the version strings for all mods to the latest" + Write-Host " version for the current Git branch." + Write-Host " clean Removes all built and copied files." + Write-Host " from the mods and the engine directories." + Write-Host " test Tests the mod's MiniYAML for errors." + Write-Host " check Checks .cs files for StyleCop violations." + Write-Host " check-scripts Checks .lua files for syntax errors." + Write-Host "" $command = (Read-Host "Enter command").Split(' ', 2) } else @@ -289,8 +293,8 @@ if (Test-Path "user.config") $modID = $env:MOD_ID -$env:MOD_SEARCH_PATHS = (Get-Item -Path ".\" -Verbose).FullName + "\mods,./mods" -$env:ENGINE_DIR = ".." +$env:MOD_SEARCH_PATHS = "./mods,$env:ENGINE_DIRECTORY/mods" +$env:ENGINE_DIR = ".." # Set to potentially be used by the Utility and different than $env:ENGINE_DIRECTORY, which is for the script. # Fetch the engine if required if ($command -eq "all" -or $command -eq "clean" -or $command -eq "check") @@ -308,34 +312,34 @@ if ($command -eq "all" -or $command -eq "clean" -or $command -eq "check") { cd $env:ENGINE_DIRECTORY Invoke-Expression ".\make.cmd $command" - echo "" + Write-Host "" cd $templateDir } elseif ($env:AUTOMATIC_ENGINE_MANAGEMENT -ne "True") { - echo "Automatic engine management is disabled." - echo "Please manually update the engine to version $env:ENGINE_VERSION." + Write-Host "Automatic engine management is disabled." + Write-Host "Please manually update the engine to version $env:ENGINE_VERSION." WaitForInput } else { - echo "OpenRA engine version $env:ENGINE_VERSION is required." + Write-Host "OpenRA engine version $env:ENGINE_VERSION is required." if (Test-Path $env:ENGINE_DIRECTORY) { if ($currentEngine -ne "") { - echo "Deleting engine version $currentEngine." + Write-Host "Deleting engine version $currentEngine." } else { - echo "Deleting existing engine (unknown version)." + Write-Host "Deleting existing engine (unknown version)." } rm $env:ENGINE_DIRECTORY -r } - echo "Downloading engine..." + Write-Host "Downloading engine..." if (Test-Path $env:AUTOMATIC_ENGINE_EXTRACT_DIRECTORY) { @@ -363,16 +367,26 @@ if ($command -eq "all" -or $command -eq "clean" -or $command -eq "check") rm $env:AUTOMATIC_ENGINE_EXTRACT_DIRECTORY -r + # HACK: Remove bogus lint check that the Example mod can't possibly pass + # because to do so it would need to define a lot of excess things surrounding resources. + rm $env:ENGINE_DIRECTORY/OpenRA.Mods.Common/Lint/CheckFluentReferences.cs + cd $env:ENGINE_DIRECTORY Invoke-Expression ".\make.cmd version $env:ENGINE_VERSION" Invoke-Expression ".\make.cmd $command" - echo "" + Write-Host "" cd $templateDir } } $utilityPath = $env:ENGINE_DIRECTORY + "/bin/OpenRA.Utility.exe" +$configuration = "Release" +if ($args.Contains("CONFIGURATION=Debug")) +{ + $configuration = "Debug" +} + $execute = $command if ($command.Length -gt 1) { @@ -387,7 +401,7 @@ switch ($execute) "test" { Test-Command } "check" { Check-Command } "check-scripts" { Check-Scripts-Command } - Default { echo ("Invalid command '{0}'" -f $command) } + Default { Write-Host ("Invalid command '{0}'" -f $command) } } # In case the script was called without any parameters we keep the window open diff --git a/mod.config b/mod.config index 194cd2379c..2fcff7f78c 100644 --- a/mod.config +++ b/mod.config @@ -9,10 +9,7 @@ MOD_ID="ca" # The OpenRA engine version to use for this project. -ENGINE_VERSION="6ef141d" - -# .dll filenames compiled by the mod solution for use by the runtime assembly check -WHITELISTED_MOD_ASSEMBLIES="OpenRA.Mods.CA.dll" +ENGINE_VERSION="ca-engine/1.09" ############################################################################## # Packaging @@ -46,17 +43,13 @@ PACKAGING_DISPLAY_NAME="Combined Arms" PACKAGING_WEBSITE_URL="https://www.moddb.com/mods/command-conquer-combined-arms" # The URL that is displayed in the crash dialog. -PACKAGING_FAQ_URL="http://wiki.openra.net/FAQ" +PACKAGING_FAQ_URL="https://wiki.openra.net/FAQ" # The human-readable project authors. # This is used in: # - Windows "Add/Remove Programs" list PACKAGING_AUTHORS="Inq" -# Space delimited list of dll files compiled by the mod, which -# should be copied from the bin directory into your installers -PACKAGING_COPY_MOD_BINARIES="OpenRA.Mods.CA.dll" - # If your mod depends on OpenRA.Mods.Cnc.dll from the engine set # this to "True" to package the dll in your installers. # Accepts values "True" or "False". @@ -72,9 +65,6 @@ PACKAGING_COPY_D2K_DLL="True" # and define the client id here and in your mod.yaml PACKAGING_DISCORD_APPID="787647352399200277" -# The git tag to use for the macOS Launcher files. -PACKAGING_OSX_MONO_TAG="osx-launcher-20200830" - # The macOS disk image icon positions, matched to the background artwork PACKAGING_OSX_DMG_MOD_ICON_POSITION="190, 210" PACKAGING_OSX_DMG_APPLICATION_ICON_POSITION="410, 210" @@ -93,12 +83,9 @@ PACKAGING_WINDOWS_REGISTRY_KEY="CombinedArms" # Path to the file containing the text to show in the Windows installer license dialog PACKAGING_WINDOWS_LICENSE_FILE="./COPYING" -# The git tag to use for the AppImage dependencies. -PACKAGING_APPIMAGE_DEPENDENCIES_TAG="20200328" - # Space delimited list of additional files/directories to copy from the engine directory -# when packaging your mod. e.g. "./mods/modcontent" -PACKAGING_COPY_ENGINE_FILES="./mods/modcontent" +# when packaging your mod. e.g. "./mods/common-content" +PACKAGING_COPY_ENGINE_FILES="./mods/common-content" # Overwrite the version in mod.yaml with the tag used for the SDK release # Accepts values "True" or "False". @@ -115,32 +102,10 @@ PACKAGING_OVERWRITE_MOD_VERSION="True" AUTOMATIC_ENGINE_MANAGEMENT="True" # The URL to download the engine files from when AUTOMATIC_ENGINE_MANAGEMENT is enabled. -AUTOMATIC_ENGINE_SOURCE="https://github.com/Inq8/OpenRA/archive/${ENGINE_VERSION}.zip" +AUTOMATIC_ENGINE_SOURCE="https://github.com/Inq8/OpenRA/archive/refs/heads/${ENGINE_VERSION}.zip" # Temporary file/directory names used by automatic engine management. # Paths outside the SDK directory are not officially supported. AUTOMATIC_ENGINE_EXTRACT_DIRECTORY="./engine_temp" AUTOMATIC_ENGINE_TEMP_ARCHIVE_NAME="engine.zip" ENGINE_DIRECTORY="./engine" - -# The url to download the OpenRA macOS mono runtime. -PACKAGING_OSX_MONO_SOURCE="https://github.com/OpenRA/OpenRALauncherOSX/releases/download/${PACKAGING_OSX_MONO_TAG}/mono.zip" - -# Temporary file name used when downloading the OpenRA macOS launcher files. -PACKAGING_OSX_MONO_TEMP_ARCHIVE_NAME="mono.zip" - -# The url to download the OpenRA AppImage dependencies. -PACKAGING_APPIMAGE_DEPENDENCIES_SOURCE="https://github.com/OpenRA/AppImageSupport/releases/download/${PACKAGING_APPIMAGE_DEPENDENCIES_TAG}/mono.tar.bz2" - -# Temporary file name used when downloading the OpenRA AppImage dependencies. -PACKAGING_APPIMAGE_DEPENDENCIES_TEMP_ARCHIVE_NAME="mono.tar.bz2" - -# List of .NET assemblies that we can guarantee exist -WHITELISTED_OPENRA_ASSEMBLIES="OpenRA.exe OpenRA.Utility.exe OpenRA.Server.exe OpenRA.Platforms.Default.dll OpenRA.Game.dll OpenRA.Mods.Common.dll OpenRA.Mods.Cnc.dll OpenRA.Mods.D2k.dll" - -# These are explicitly shipped alongside our core files by the packaging script -WHITELISTED_THIRDPARTY_ASSEMBLIES="ICSharpCode.SharpZipLib.dll FuzzyLogicLibrary.dll Eluant.dll BeaconLib.dll Open.Nat.dll SDL2-CS.dll OpenAL-CS.Core.dll DiscordRPC.dll Newtonsoft.Json.dll" - -# These are shipped in our custom minimal mono runtime and also available in the full system-installed .NET/mono stack -# This list *must* be kept in sync with the files packaged by the AppImageSupport and OpenRALauncherOSX repositories -WHITELISTED_CORE_ASSEMBLIES="mscorlib.dll System.dll System.Configuration.dll System.Core.dll System.Numerics.dll System.Security.dll System.Xml.dll Mono.Security.dll netstandard.dll" diff --git a/mods/ca-content/fluent/chrome.ftl b/mods/ca-content/fluent/chrome.ftl new file mode 100644 index 0000000000..1ce4ef8160 --- /dev/null +++ b/mods/ca-content/fluent/chrome.ftl @@ -0,0 +1,28 @@ +modcontent-installprompt = + Combined Arms requires artwork and audio from the original games. + + Quick Install will automatically download this content (without music\nor videos) from a mirror of the 2008 Command & Conquer/Red Alert + freeware release. + + Advanced Install allows you to install music and other content, + which may require original game installations or discs. + + You can also install this additional content later via the main menu. +modcontent-header = + Game content may be extracted from the original game discs or an + existing digital install. OpenRA can also download the base game + files from an online mirror of the 2008 freeware release of RA. +modcontent-package-basefiles = Base Game Files +modcontent-package-aftermathfiles = Aftermath Expansion Files +modcontent-package-deserttileset = C&C Desert Tileset +modcontent-package-basemusic = Base Game Music +modcontent-package-allied = Allied Campaign Briefings +modcontent-package-soviet = Soviet Campaign Briefings +modcontent-package-music-counterstrike = Counterstrike Music +modcontent-package-music-aftermath = Aftermath Music +modcontent-package-music-cnc = Tiberian Dawn Music +modcontent-package-music-ra = Red Alert Music +modcontent-package-music-ts = Tiberian Sun Music +modcontent-package-music-fs = Firestorm Music +modcontent-package-music-ra2 = Red Alert 2 Music +modcontent-package-music-yr = Yuri's Revenge Music \ No newline at end of file diff --git a/mods/ca-content/installer/aftermath.yaml b/mods/ca-content/installer/aftermath.yaml new file mode 100644 index 0000000000..28d8c74b98 --- /dev/null +++ b/mods/ca-content/installer/aftermath.yaml @@ -0,0 +1,65 @@ +aftermath: Aftermath Expansion Disc (English) + Type: Disc + IDFiles: + README.TXT: 9902fb74c019df1b76ff5634e68f0371d790b5e0 + SETUP/INSTALL/PATCH.RTP: 5bce93f834f9322ddaa7233242e5b6c7fea0bf17 + Install: + # Aftermath expansion files: + ContentPackage@aftermathbase: + Name: aftermathbase + Actions: + ExtractRaw: SETUP/INSTALL/PATCH.RTP + ^SupportDir|Content/ca/expand/expand2.mix: + Offset: 4712984 + Length: 469922 + ^SupportDir|Content/ca/expand/hires1.mix: + Offset: 5182981 + Length: 90264 + ^SupportDir|Content/ca/expand/lores1.mix: + Offset: 5273320 + Length: 57076 + ExtractMix@1: MAIN.MIX + ^SupportDir|Content/ca/expand/sounds.mix: sounds.mix + ExtractMix@2: ^SupportDir|Content/ca/expand/sounds.mix + ^SupportDir|Content/ca/expand/chrotnk1.aud: chrotnk1.aud + ^SupportDir|Content/ca/expand/fixit1.aud: fixit1.aud + ^SupportDir|Content/ca/expand/jburn1.aud: jburn1.aud + ^SupportDir|Content/ca/expand/jchrge1.aud: jchrge1.aud + ^SupportDir|Content/ca/expand/jcrisp1.aud: jcrisp1.aud + ^SupportDir|Content/ca/expand/jdance1.aud: jdance1.aud + ^SupportDir|Content/ca/expand/jjuice1.aud: jjuice1.aud + ^SupportDir|Content/ca/expand/jjump1.aud: jjump1.aud + ^SupportDir|Content/ca/expand/jlight1.aud: jlight1.aud + ^SupportDir|Content/ca/expand/jpower1.aud: jpower1.aud + ^SupportDir|Content/ca/expand/jshock1.aud: jshock1.aud + ^SupportDir|Content/ca/expand/jyes1.aud: jyes1.aud + ^SupportDir|Content/ca/expand/madchrg2.aud: madchrg2.aud + ^SupportDir|Content/ca/expand/madexplo.aud: madexplo.aud + ^SupportDir|Content/ca/expand/mboss1.aud: mboss1.aud + ^SupportDir|Content/ca/expand/mhear1.aud: mhear1.aud + ^SupportDir|Content/ca/expand/mhotdig1.aud: mhotdig1.aud + ^SupportDir|Content/ca/expand/mhowdy1.aud: mhowdy1.aud + ^SupportDir|Content/ca/expand/mhuh1.aud: mhuh1.aud + ^SupportDir|Content/ca/expand/mlaff1.aud: mlaff1.aud + ^SupportDir|Content/ca/expand/mrise1.aud: mrise1.aud + ^SupportDir|Content/ca/expand/mwrench1.aud: mwrench1.aud + ^SupportDir|Content/ca/expand/myeehaw1.aud: myeehaw1.aud + ^SupportDir|Content/ca/expand/myes1.aud: myes1.aud + Delete: ^SupportDir|Content/ca/expand/sounds.mix + # Aftermath music (optional): + ContentPackage@music-aftermath: + Name: music-aftermath + Actions: + ExtractMix@1: MAIN.MIX + ^SupportDir|Content/ca/expand/scores.mix: scores.mix + ExtractMix@2: ^SupportDir|Content/ca/expand/scores.mix + ^SupportDir|Content/ca/expand/await.aud: await.aud + ^SupportDir|Content/ca/expand/bog.aud: bog.aud + ^SupportDir|Content/ca/expand/float_v2.aud: float_v2.aud + ^SupportDir|Content/ca/expand/gloom_ra.aud: gloom.aud + ^SupportDir|Content/ca/expand/grndwire.aud: grndwire.aud + ^SupportDir|Content/ca/expand/rpt.aud: rpt.aud + ^SupportDir|Content/ca/expand/search.aud: search.aud + ^SupportDir|Content/ca/expand/traction.aud: traction.aud + ^SupportDir|Content/ca/expand/wastelnd.aud: wastelnd.aud + Delete: ^SupportDir|Content/ca/expand/scores.mix diff --git a/mods/ca-content/installer/allies95.yaml b/mods/ca-content/installer/allies95.yaml new file mode 100644 index 0000000000..f83a4c70ed --- /dev/null +++ b/mods/ca-content/installer/allies95.yaml @@ -0,0 +1,90 @@ +allied: Red Alert 95 (Allied Disc, English) + Type: Disc + IDFiles: + MAIN.MIX: 20ebe16f91ff79be2d672f1db5bae9048ff9357c + Length: 4096 + INSTALL/REDALERT.MIX: 0e58f4b54f44f6cd29fecf8cf379d33cf2d4caef + Install: + # Base game files: + ContentPackage@base: + Name: base + Actions: + ExtractMix@1: INSTALL/REDALERT.MIX + ^SupportDir|Content/ca/hires.mix: hires.mix + ^SupportDir|Content/ca/local.mix: local.mix + ^SupportDir|Content/ca/lores.mix: lores.mix + ^SupportDir|Content/ca/speech.mix: speech.mix + ExtractMix@2: MAIN.MIX + ^SupportDir|Content/ca/conquer.mix: conquer.mix + ^SupportDir|Content/ca/general.mix: general.mix # Is this one used? The FirstDecade and TUC installers are missing this! + ^SupportDir|Content/ca/interior.mix: interior.mix + ^SupportDir|Content/ca/snow.mix: snow.mix + ^SupportDir|Content/ca/sounds.mix: sounds.mix + ^SupportDir|Content/ca/russian.mix: russian.mix + ^SupportDir|Content/ca/allies.mix: allies.mix + ^SupportDir|Content/ca/temperat.mix: temperat.mix + # Base game music (optional): + ContentPackage@music-cnc: + Name: music-ra + Actions: + ExtractMix: MAIN.MIX + ^SupportDir|Content/ca/ra/scores.mix: scores.mix + # Allied campaign briefings (optional): + ContentPackage@movies-allied: + Name: movies-allied + Actions: + ExtractMix@1: MAIN.MIX + ^SupportDir|Content/ca/movies1.mix: movies1.mix + ExtractMix@2: ^SupportDir|Content/ca/movies1.mix + ^SupportDir|Content/ca/movies/aagun.vqa: aagun.vqa + ^SupportDir|Content/ca/movies/aftrmath.vqa: aftrmath.vqa + ^SupportDir|Content/ca/movies/ally1.vqa: ally1.vqa + ^SupportDir|Content/ca/movies/ally10.vqa: ally10.vqa + ^SupportDir|Content/ca/movies/ally10b.vqa: ally10b.vqa + ^SupportDir|Content/ca/movies/ally11.vqa: ally11.vqa + ^SupportDir|Content/ca/movies/ally12.vqa: ally12.vqa + ^SupportDir|Content/ca/movies/ally14.vqa: ally14.vqa + ^SupportDir|Content/ca/movies/ally2.vqa: ally2.vqa + ^SupportDir|Content/ca/movies/ally4.vqa: ally4.vqa + ^SupportDir|Content/ca/movies/ally5.vqa: ally5.vqa + ^SupportDir|Content/ca/movies/ally6.vqa: ally6.vqa + ^SupportDir|Content/ca/movies/ally8.vqa: ally8.vqa + ^SupportDir|Content/ca/movies/ally9.vqa: ally9.vqa + ^SupportDir|Content/ca/movies/allyend.vqa: allyend.vqa + ^SupportDir|Content/ca/movies/allymorf.vqa: allymorf.vqa + ^SupportDir|Content/ca/movies/apcescpe.vqa: apcescpe.vqa + ^SupportDir|Content/ca/movies/assess.vqa: assess.vqa + ^SupportDir|Content/ca/movies/battle.vqa: battle.vqa + ^SupportDir|Content/ca/movies/binoc.vqa: binoc.vqa + ^SupportDir|Content/ca/movies/bmap.vqa: bmap.vqa + ^SupportDir|Content/ca/movies/brdgtilt.vqa: brdgtilt.vqa + ^SupportDir|Content/ca/movies/crontest.vqa: crontest.vqa + ^SupportDir|Content/ca/movies/cronfail.vqa: cronfail.vqa + ^SupportDir|Content/ca/movies/destroyr.vqa: destroyr.vqa + ^SupportDir|Content/ca/movies/dud.vqa: dud.vqa + ^SupportDir|Content/ca/movies/elevator.vqa: elevator.vqa + ^SupportDir|Content/ca/movies/flare.vqa: flare.vqa + ^SupportDir|Content/ca/movies/frozen.vqa: frozen.vqa + ^SupportDir|Content/ca/movies/grvestne.vqa: grvestne.vqa + ^SupportDir|Content/ca/movies/landing.vqa: landing.vqa + ^SupportDir|Content/ca/movies/masasslt.vqa: masasslt.vqa + ^SupportDir|Content/ca/movies/mcv.vqa: mcv.vqa + ^SupportDir|Content/ca/movies/mcv_land.vqa: mcv_land.vqa + ^SupportDir|Content/ca/movies/montpass.vqa: montpass.vqa + ^SupportDir|Content/ca/movies/oildrum.vqa: oildrum.vqa + ^SupportDir|Content/ca/movies/overrun.vqa: overrun.vqa + ^SupportDir|Content/ca/movies/prolog.vqa: prolog.vqa + ^SupportDir|Content/ca/movies/redintro.vqa: redintro.vqa + ^SupportDir|Content/ca/movies/shipsink.vqa: shipsink.vqa + ^SupportDir|Content/ca/movies/shorbom1.vqa: shorbom1.vqa + ^SupportDir|Content/ca/movies/shorbom2.vqa: shorbom2.vqa + ^SupportDir|Content/ca/movies/shorbomb.vqa: shorbomb.vqa + ^SupportDir|Content/ca/movies/snowbomb.vqa: snowbomb.vqa + ^SupportDir|Content/ca/movies/soviet1.vqa: soviet1.vqa + ^SupportDir|Content/ca/movies/sovtstar.vqa: sovtstar.vqa + ^SupportDir|Content/ca/movies/spy.vqa: spy.vqa + ^SupportDir|Content/ca/movies/tanya1.vqa: tanya1.vqa + ^SupportDir|Content/ca/movies/tanya2.vqa: tanya2.vqa + ^SupportDir|Content/ca/movies/toofar.vqa: toofar.vqa + ^SupportDir|Content/ca/movies/trinity.vqa: trinity.vqa + Delete: ^SupportDir|Content/ca/movies1.mix diff --git a/mods/ca-content/installer/cnc95.yaml b/mods/ca-content/installer/cnc95.yaml new file mode 100644 index 0000000000..c389d3bd2d --- /dev/null +++ b/mods/ca-content/installer/cnc95.yaml @@ -0,0 +1,17 @@ +cnc95: C&C Gold (GDI or Nod Disc, English) + Type: Disc + IDFiles: + CONQUER.MIX: 833e02a09aae694659eb312d3838367f681d1b30 + Install: + # C&C Desert Tileset: + ContentPackage@cncdesert: + Name: cncdesert + Actions: + Copy: . + ^SupportDir|Content/ca/cnc/desert.mix: DESERT.MIX + # Base game music (optional): + ContentPackage@music-cnc: + Name: music-cnc + Actions: + Copy: . + ^SupportDir|Content/ca/cnc/scores.mix: SCORES.MIX \ No newline at end of file diff --git a/mods/ca-content/installer/counterstrike.yaml b/mods/ca-content/installer/counterstrike.yaml new file mode 100644 index 0000000000..8948f16e6d --- /dev/null +++ b/mods/ca-content/installer/counterstrike.yaml @@ -0,0 +1,22 @@ +counterstrike: Counterstrike Expansion Disc (English) + Type: Disc + IDFiles: + README.TXT: 0efe8087383f0b159a9633f891fb5f53c6097cd4 + SETUP/INSTALL/CSTRIKE.RTP: fae8ba82db71574f6ecd8fb4ff4026fcb65d2adc + Install: + # Counterstrike music (optional): + ContentPackage@music-counterstrike: + Name: music-counterstrike + Actions: + ExtractMix@1: MAIN.MIX + ^SupportDir|Content/ca/expand/scores.mix: scores.mix + ExtractMix@2: ^SupportDir|Content/ca/expand/scores.mix + ^SupportDir|Content/ca/expand/2nd_hand.aud: 2nd_hand.aud + ^SupportDir|Content/ca/expand/araziod.aud: araziod.aud + ^SupportDir|Content/ca/expand/backstab.aud: backstab.aud + ^SupportDir|Content/ca/expand/chaos2.aud: chaos2.aud + ^SupportDir|Content/ca/expand/shut_it.aud: shut_it.aud + ^SupportDir|Content/ca/expand/twinmix1.aud: twinmix1.aud + ^SupportDir|Content/ca/expand/under3.aud: under3.aud + ^SupportDir|Content/ca/expand/vr2.aud: vr2.aud + Delete: ^SupportDir|Content/ca/expand/scores.mix diff --git a/mods/ca-content/installer/covertops.yaml b/mods/ca-content/installer/covertops.yaml new file mode 100644 index 0000000000..dee9195563 --- /dev/null +++ b/mods/ca-content/installer/covertops.yaml @@ -0,0 +1,12 @@ +covertops: Covert Operations Expansion (English) + Type: Disc + IDFiles: + GAME/GAME.DAT: be5a6c4c0a581da09e8f34a3bbf7bd17e525085c + CONQUER.MIX: 713b53fa4c188ca9619c6bbeadbfc86513704266 + Install: + # Covert Operations music (optional): + ContentPackage@music-cnc: + Name: music-cnc + Actions: + Copy: . + ^SupportDir|Content/ca/cnc/scores-covertops.mix: SCORES.MIX diff --git a/mods/ca/installer/downloads.yaml b/mods/ca-content/installer/downloads.yaml similarity index 90% rename from mods/ca/installer/downloads.yaml rename to mods/ca-content/installer/downloads.yaml index 4d41777dc4..f99413887e 100644 --- a/mods/ca/installer/downloads.yaml +++ b/mods/ca-content/installer/downloads.yaml @@ -1,4 +1,6 @@ quickinstall: Quick Install Package + Type: ZipFile + SHA1: 44241f68e69db9511db82cf83c174737ccda300b MirrorList: http://www.openra.net/packages/ra-quickinstall-mirrors.txt Extract: ^SupportDir|Content/ca/allies.mix: allies.mix @@ -40,7 +42,10 @@ quickinstall: Quick Install Package ^SupportDir|Content/ca/expand/myeehaw1.aud: expand/myeehaw1.aud ^SupportDir|Content/ca/expand/myes1.aud: expand/myes1.aud ^SupportDir|Content/ca/cnc/desert.mix: cnc/desert.mix + basefiles: Base Freeware Content + Type: ZipFile + SHA1: aa022b208a3b45b4a45c00fdae22ccf3c6de3e5c MirrorList: http://www.openra.net/packages/ra-base-mirrors.txt Extract: ^SupportDir|Content/ca/allies.mix: allies.mix @@ -54,7 +59,10 @@ basefiles: Base Freeware Content ^SupportDir|Content/ca/sounds.mix: sounds.mix ^SupportDir|Content/ca/speech.mix: speech.mix ^SupportDir|Content/ca/temperat.mix: temperat.mix + aftermath: Aftermath Expansion Files + Type: ZipFile + SHA1: d511d4363b485e11c63eecf96d4365d42ec4ef5e MirrorList: http://www.openra.net/packages/ra-aftermath-mirrors.txt Extract: ^SupportDir|Content/ca/expand/chrotnk1.aud: expand/chrotnk1.aud @@ -84,26 +92,36 @@ aftermath: Aftermath Expansion Files ^SupportDir|Content/ca/expand/mwrench1.aud: expand/mwrench1.aud ^SupportDir|Content/ca/expand/myeehaw1.aud: expand/myeehaw1.aud ^SupportDir|Content/ca/expand/myes1.aud: expand/myes1.aud + cncdesert: C&C Desert Tileset + Type: ZipFile + SHA1: 039849f16e39e4722e8c838a393c8a0d6529fd59 MirrorList: http://www.openra.net/packages/ra-cncdesert-mirrors.txt Extract: ^SupportDir|Content/ca/cnc/desert.mix: cnc/desert.mix -music: Red Alert Music - URL: http://openra.mirror.haffdata.com/ra-music.zip - Extract: - ^SupportDir|Content/ca/ra/scores.mix: scores.mix -cncmusic: C&C Music - URL: http://openra.mirror.haffdata.com/cnc-music.zip + +music-cnc: C&C Music + Type: ZipFile + URL: https://openra.baxxster.no/openra/cnc-music.zip Extract: ^SupportDir|Content/ca/cnc/scores.mix: scores.mix -tsmusic: Tib Sun Music - URL: http://openra.mirror.haffdata.com/ts-music.zip + +music-ra: Red Alert Music + Type: ZipFile + URL: https://openra.baxxster.no/openra/ra-music.zip + Extract: + ^SupportDir|Content/ca/ra/scores.mix: scores.mix + +music-ts: Tib Sun Music + Type: ZipFile + URL: https://openra.baxxster.no/openra/ts-music.zip Extract: ^SupportDir|Content/ca/ts/scores.mix: scores.mix -fsmusic: Expansion Freeware Music +music-fs: Expansion Freeware Music + Type: ZipFile SHA1: 74b1ec47ea8c9815fb85c998963229aa0a8f8619 - URL: http://openra.mirror.haffdata.com/ts-fsmusic.zip + URL: https://openra.baxxster.no/openra/ts-fsmusic.zip Extract: ^SupportDir|Content/ca/firestorm/dmachine.aud: firestorm/dmachine.aud ^SupportDir|Content/ca/firestorm/elusive.aud: firestorm/elusive.aud @@ -114,4 +132,4 @@ fsmusic: Expansion Freeware Music ^SupportDir|Content/ca/firestorm/kmachine.aud: firestorm/kmachine.aud ^SupportDir|Content/ca/firestorm/linkup.aud: firestorm/linkup.aud ^SupportDir|Content/ca/firestorm/rainnite.aud: firestorm/rainnite.aud - ^SupportDir|Content/ca/firestorm/slavesys.aud: firestorm/slavesys.aud \ No newline at end of file + ^SupportDir|Content/ca/firestorm/slavesys.aud: firestorm/slavesys.aud diff --git a/mods/ca-content/installer/firestorm.yaml b/mods/ca-content/installer/firestorm.yaml new file mode 100644 index 0000000000..fa96cba34e --- /dev/null +++ b/mods/ca-content/installer/firestorm.yaml @@ -0,0 +1,12 @@ +firestorm: Firestorm Expansion Disc (English) + Type: Disc + IDFiles: + Install/README.TXT: f2810b540fce8f3880250213ee08c57780d81c20 + Install/Language.dll: 4df87c1a2289da57dd14d0a7299546f37357fcca + Install: + # Firestorm expansion music (optional): + ContentPackage@music-fs + Name: music-fs + Actions: + Copy: . + ^SupportDir|Content/ca/firestorm/scores01.mix: scores01.mix diff --git a/mods/ca-content/installer/firstdecade.yaml b/mods/ca-content/installer/firstdecade.yaml new file mode 100644 index 0000000000..c1f23d08fc --- /dev/null +++ b/mods/ca-content/installer/firstdecade.yaml @@ -0,0 +1,206 @@ +tfd: C&C The First Decade (English) + Type: Disc + IDFiles: + data1.hdr: bef3a08c3fc1b1caf28ca0dbb97c1f900005930e + data1.cab: 12ad6113a6890a1b4d5651a75378c963eaf513b9 + # The First Decade doesn't include the Aftermath and Counterstrike music because someone in EA forgot to add them. + # Unless a patch is installed, but we probably don't want to deal with whether or not it is. + Install: + BeforeInstall: + # This one step handles 3 packages - base (partially), aftermathbase (partially) and cncdesert. + ExtractIscab: data1.hdr + Volumes: + 2: data2.cab + 3: data3.cab + 4: data4.cab + 5: data5.cab + Extract: + ^SupportDir|Content/ca/main.mix: Red Alert\\MAIN.MIX + ^SupportDir|Content/ca/redalert.mix: Red Alert\\REDALERT.MIX + ^SupportDir|Content/ca/expand/hires1.mix: Red Alert\\HIRES1.MIX + ^SupportDir|Content/ca/expand/lores1.mix: Red Alert\\LORES1.MIX + ^SupportDir|Content/ca/expand/expand2.mix: Red Alert\\EXPAND2.MIX + ^SupportDir|Content/ca/cnc/desert.mix: CnC\\DESERT.MIX + ^SupportDir|Content/cnc/scores.mix: CnC\covert\SCORES.MIX + ^SupportDir|Content/ca/ts/scores.mix: Tiberian Sun\SUN\SCORES.MIX + ^SupportDir|Content/ca/firestorm/scores01.mix: Tiberian Sun\SUN\scores01.mix + ^SupportDir|Content/ca/ra2/theme.mix: Red Alert 2\RA2\theme.mix + ^SupportDir|Content/ca/ra2/thememd.mix: Yuri\RA2\thememd.mix + + # Base game files: + ContentPackage@base: + Name: base + Actions: + ExtractMix@1: ^SupportDir|Content/ca/redalert.mix + ^SupportDir|Content/ca/hires.mix: hires.mix + ^SupportDir|Content/ca/local.mix: local.mix + ^SupportDir|Content/ca/lores.mix: lores.mix + ^SupportDir|Content/ca/speech.mix: speech.mix + Delete: ^SupportDir|Content/ca/redalert.mix + ExtractMix@2: ^SupportDir|Content/ca/main.mix + ^SupportDir|Content/ca/interior.mix: interior.mix + ^SupportDir|Content/ca/conquer.mix: conquer.mix + ^SupportDir|Content/ca/allies.mix: allies.mix + ^SupportDir|Content/ca/temperat.mix: temperat.mix + ^SupportDir|Content/ca/sounds.mix: sounds.mix + ^SupportDir|Content/ca/snow.mix: snow.mix + ^SupportDir|Content/ca/russian.mix: russian.mix + # Base game music (optional): + ContentPackage@music-cnc: + Name: music-ra + Actions: + ExtractMix: ^SupportDir|Content/ca/main.mix + ^SupportDir|Content/ca/ra/scores.mix: scores.mix + # Allied campaign briefings (optional): + ContentPackage@movies-allied: + Name: movies-allied + Actions: + ExtractMix@1: ^SupportDir|Content/ca/main.mix + ^SupportDir|Content/ca/movies1.mix: movies1.mix + ExtractMix@2: ^SupportDir|Content/ca/movies1.mix + ^SupportDir|Content/ca/movies/aagun.vqa: aagun.vqa + ^SupportDir|Content/ca/movies/aftrmath.vqa: aftrmath.vqa + ^SupportDir|Content/ca/movies/ally12.vqa: ally12.vqa + ^SupportDir|Content/ca/movies/ally14.vqa: ally14.vqa + ^SupportDir|Content/ca/movies/allyend.vqa: allyend.vqa + ^SupportDir|Content/ca/movies/allymorf.vqa: allymorf.vqa + ^SupportDir|Content/ca/movies/apcescpe.vqa: apcescpe.vqa + ^SupportDir|Content/ca/movies/assess.vqa: assess.vqa + ^SupportDir|Content/ca/movies/battle.vqa: battle.vqa + ^SupportDir|Content/ca/movies/binoc.vqa: binoc.vqa + ^SupportDir|Content/ca/movies/bmap.vqa: bmap.vqa + ^SupportDir|Content/ca/movies/brdgtilt.vqa: brdgtilt.vqa + ^SupportDir|Content/ca/movies/cronfail.vqa: cronfail.vqa + ^SupportDir|Content/ca/movies/crontest.vqa: crontest.vqa + ^SupportDir|Content/ca/movies/destroyr.vqa: destroyr.vqa + ^SupportDir|Content/ca/movies/dud.vqa: dud.vqa + ^SupportDir|Content/ca/movies/elevator.vqa: elevator.vqa + ^SupportDir|Content/ca/movies/flare.vqa: flare.vqa + ^SupportDir|Content/ca/movies/frozen.vqa: frozen.vqa + ^SupportDir|Content/ca/movies/grvestne.vqa: grvestne.vqa + ^SupportDir|Content/ca/movies/landing.vqa: landing.vqa + ^SupportDir|Content/ca/movies/masasslt.vqa: masasslt.vqa + ^SupportDir|Content/ca/movies/mcv.vqa: mcv.vqa + ^SupportDir|Content/ca/movies/mcv_land.vqa: mcv_land.vqa + ^SupportDir|Content/ca/movies/montpass.vqa: montpass.vqa + ^SupportDir|Content/ca/movies/oildrum.vqa: oildrum.vqa + ^SupportDir|Content/ca/movies/overrun.vqa: overrun.vqa + ^SupportDir|Content/ca/movies/prolog.vqa: prolog.vqa + ^SupportDir|Content/ca/movies/redintro.vqa: redintro.vqa + ^SupportDir|Content/ca/movies/shipsink.vqa: shipsink.vqa + ^SupportDir|Content/ca/movies/shorbom1.vqa: shorbom1.vqa + ^SupportDir|Content/ca/movies/shorbom2.vqa: shorbom2.vqa + ^SupportDir|Content/ca/movies/shorbomb.vqa: shorbomb.vqa + ^SupportDir|Content/ca/movies/snowbomb.vqa: snowbomb.vqa + ^SupportDir|Content/ca/movies/soviet1.vqa: soviet1.vqa + ^SupportDir|Content/ca/movies/sovtstar.vqa: sovtstar.vqa + ^SupportDir|Content/ca/movies/spy.vqa: spy.vqa + ^SupportDir|Content/ca/movies/tanya1.vqa: tanya1.vqa + ^SupportDir|Content/ca/movies/tanya2.vqa: tanya2.vqa + ^SupportDir|Content/ca/movies/toofar.vqa: toofar.vqa + ^SupportDir|Content/ca/movies/trinity.vqa: trinity.vqa + ^SupportDir|Content/ca/movies/ally1.vqa: ally1.vqa + ^SupportDir|Content/ca/movies/ally2.vqa: ally2.vqa + ^SupportDir|Content/ca/movies/ally4.vqa: ally4.vqa + ^SupportDir|Content/ca/movies/ally5.vqa: ally5.vqa + ^SupportDir|Content/ca/movies/ally6.vqa: ally6.vqa + ^SupportDir|Content/ca/movies/ally8.vqa: ally8.vqa + ^SupportDir|Content/ca/movies/ally9.vqa: ally9.vqa + ^SupportDir|Content/ca/movies/ally10.vqa: ally10.vqa + ^SupportDir|Content/ca/movies/ally10b.vqa: ally10b.vqa + ^SupportDir|Content/ca/movies/ally11.vqa: ally11.vqa + Delete: ^SupportDir|Content/ca/movies1.mix + # Soviet campaign briefings (optional): + ContentPackage@movies-soviet: + Name: movies-soviet + Actions: + ExtractMix@1: ^SupportDir|Content/ca/main.mix + ^SupportDir|Content/ca/movies2.mix: movies2.mix + ExtractMix@2: ^SupportDir|Content/ca/movies2.mix + ^SupportDir|Content/ca/movies/double.vqa: double.vqa + ^SupportDir|Content/ca/movies/dpthchrg.vqa: dpthchrg.vqa + ^SupportDir|Content/ca/movies/execute.vqa: execute.vqa + ^SupportDir|Content/ca/movies/flare.vqa: flare.vqa + ^SupportDir|Content/ca/movies/landing.vqa: landing.vqa + ^SupportDir|Content/ca/movies/mcvbrdge.vqa: mcvbrdge.vqa + ^SupportDir|Content/ca/movies/mig.vqa: mig.vqa + ^SupportDir|Content/ca/movies/movingin.vqa: movingin.vqa + ^SupportDir|Content/ca/movies/mtnkfact.vqa: mtnkfact.vqa + ^SupportDir|Content/ca/movies/nukestok.vqa: nukestok.vqa + ^SupportDir|Content/ca/movies/onthprwl.vqa: onthprwl.vqa + ^SupportDir|Content/ca/movies/periscop.vqa: periscop.vqa + ^SupportDir|Content/ca/movies/prolog.vqa: prolog.vqa + ^SupportDir|Content/ca/movies/radrraid.vqa: radrraid.vqa + ^SupportDir|Content/ca/movies/redintro.vqa: redintro.vqa + ^SupportDir|Content/ca/movies/search.vqa: search.vqa + ^SupportDir|Content/ca/movies/sfrozen.vqa: sfrozen.vqa + ^SupportDir|Content/ca/movies/sitduck.vqa: sitduck.vqa + ^SupportDir|Content/ca/movies/slntsrvc.vqa: slntsrvc.vqa + ^SupportDir|Content/ca/movies/snowbomb.vqa: snowbomb.vqa + ^SupportDir|Content/ca/movies/snstrafe.vqa: snstrafe.vqa + ^SupportDir|Content/ca/movies/sovbatl.vqa: sovbatl.vqa + ^SupportDir|Content/ca/movies/sovcemet.vqa: sovcemet.vqa + ^SupportDir|Content/ca/movies/sovfinal.vqa: sovfinal.vqa + ^SupportDir|Content/ca/movies/soviet1.vqa: soviet1.vqa + ^SupportDir|Content/ca/movies/soviet2.vqa: soviet2.vqa + ^SupportDir|Content/ca/movies/soviet3.vqa: soviet3.vqa + ^SupportDir|Content/ca/movies/soviet4.vqa: soviet4.vqa + ^SupportDir|Content/ca/movies/soviet5.vqa: soviet5.vqa + ^SupportDir|Content/ca/movies/soviet6.vqa: soviet6.vqa + ^SupportDir|Content/ca/movies/soviet7.vqa: soviet7.vqa + ^SupportDir|Content/ca/movies/soviet8.vqa: soviet8.vqa + ^SupportDir|Content/ca/movies/soviet9.vqa: soviet9.vqa + ^SupportDir|Content/ca/movies/soviet10.vqa: soviet10.vqa + ^SupportDir|Content/ca/movies/soviet11.vqa: soviet11.vqa + ^SupportDir|Content/ca/movies/soviet12.vqa: soviet12.vqa + ^SupportDir|Content/ca/movies/soviet13.vqa: soviet13.vqa + ^SupportDir|Content/ca/movies/soviet14.vqa: soviet14.vqa + ^SupportDir|Content/ca/movies/sovmcv.vqa: sovmcv.vqa + ^SupportDir|Content/ca/movies/sovtstar.vqa: sovtstar.vqa + ^SupportDir|Content/ca/movies/spotter.vqa: spotter.vqa + ^SupportDir|Content/ca/movies/strafe.vqa: strafe.vqa + ^SupportDir|Content/ca/movies/take_off.vqa: take_off.vqa + ^SupportDir|Content/ca/movies/tesla.vqa: tesla.vqa + ^SupportDir|Content/ca/movies/v2rocket.vqa: v2rocket.vqa + ^SupportDir|Content/ca/movies/aagun.vqa: aagun.vqa + ^SupportDir|Content/ca/movies/airfield.vqa: airfield.vqa + ^SupportDir|Content/ca/movies/ally1.vqa: ally1.vqa + ^SupportDir|Content/ca/movies/allymorf.vqa: allymorf.vqa + ^SupportDir|Content/ca/movies/averted.vqa: averted.vqa + ^SupportDir|Content/ca/movies/beachead.vqa: beachead.vqa + ^SupportDir|Content/ca/movies/bmap.vqa: bmap.vqa + ^SupportDir|Content/ca/movies/bombrun.vqa: bombrun.vqa + ^SupportDir|Content/ca/movies/countdwn.vqa: countdwn.vqa + ^SupportDir|Content/ca/movies/cronfail.vqa: cronfail.vqa + Delete: ^SupportDir|Content/ca/movies2.mix + # Aftermath expansion files: + ContentPackage@aftermathbase: + Name: aftermathbase + Actions: + ExtractMix: ^SupportDir|Content/ca/sounds.mix + ^SupportDir|Content/ca/expand/chrotnk1.aud: chrotnk1.aud + ^SupportDir|Content/ca/expand/fixit1.aud: fixit1.aud + ^SupportDir|Content/ca/expand/jburn1.aud: jburn1.aud + ^SupportDir|Content/ca/expand/jchrge1.aud: jchrge1.aud + ^SupportDir|Content/ca/expand/jcrisp1.aud: jcrisp1.aud + ^SupportDir|Content/ca/expand/jdance1.aud: jdance1.aud + ^SupportDir|Content/ca/expand/jjuice1.aud: jjuice1.aud + ^SupportDir|Content/ca/expand/jjump1.aud: jjump1.aud + ^SupportDir|Content/ca/expand/jlight1.aud: jlight1.aud + ^SupportDir|Content/ca/expand/jpower1.aud: jpower1.aud + ^SupportDir|Content/ca/expand/jshock1.aud: jshock1.aud + ^SupportDir|Content/ca/expand/jyes1.aud: jyes1.aud + ^SupportDir|Content/ca/expand/madchrg2.aud: madchrg2.aud + ^SupportDir|Content/ca/expand/madexplo.aud: madexplo.aud + ^SupportDir|Content/ca/expand/mboss1.aud: mboss1.aud + ^SupportDir|Content/ca/expand/mhear1.aud: mhear1.aud + ^SupportDir|Content/ca/expand/mhotdig1.aud: mhotdig1.aud + ^SupportDir|Content/ca/expand/mhowdy1.aud: mhowdy1.aud + ^SupportDir|Content/ca/expand/mhuh1.aud: mhuh1.aud + ^SupportDir|Content/ca/expand/mlaff1.aud: mlaff1.aud + ^SupportDir|Content/ca/expand/mrise1.aud: mrise1.aud + ^SupportDir|Content/ca/expand/mwrench1.aud: mwrench1.aud + ^SupportDir|Content/ca/expand/myeehaw1.aud: myeehaw1.aud + ^SupportDir|Content/ca/expand/myes1.aud: myes1.aud + AfterInstall: + Delete: ^SupportDir|Content/ca/main.mix diff --git a/mods/ca-content/installer/origin.yaml b/mods/ca-content/installer/origin.yaml new file mode 100644 index 0000000000..55ac724ce6 --- /dev/null +++ b/mods/ca-content/installer/origin.yaml @@ -0,0 +1,468 @@ +ra-origin: C&C Ultimate Collection RA (Origin version, English) + Type: RegistryDirectory + RegistryPrefixes: HKEY_LOCAL_MACHINE\Software\, HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ + RegistryKey: EA Games\Command and Conquer Red Alert + RegistryValue: Install Dir + IDFiles: + REDALERT.MIX: 0e58f4b54f44f6cd29fecf8cf379d33cf2d4caef + Install: + # Base game files: + ContentPackage@base: + Name: base + Actions: + ExtractMix@1: REDALERT.MIX + ^SupportDir|Content/ca/hires.mix: hires.mix + ^SupportDir|Content/ca/local.mix: local.mix + ^SupportDir|Content/ca/lores.mix: lores.mix + ^SupportDir|Content/ca/speech.mix: speech.mix + ExtractMix@2: MAIN1.MIX + ^SupportDir|Content/ca/interior.mix: interior.mix + ^SupportDir|Content/ca/conquer.mix: conquer.mix + ^SupportDir|Content/ca/allies.mix: allies.mix + ^SupportDir|Content/ca/temperat.mix: temperat.mix + ^SupportDir|Content/ca/sounds.mix: sounds.mix + ^SupportDir|Content/ca/snow.mix: snow.mix + ^SupportDir|Content/ca/russian.mix: russian.mix + # Aftermath expansion files: + ContentPackage@aftermathbase: + Name: aftermathbase + Actions: + Copy: . + ^SupportDir|Content/ca/expand/expand2.mix: EXPAND2.MIX + ^SupportDir|Content/ca/expand/hires1.mix: HIRES1.MIX + ^SupportDir|Content/ca/expand/lores1.mix: LORES1.MIX + ExtractMix@1: MAIN4.MIX + ^SupportDir|Content/ca/expand/sounds.mix: sounds.mix + ExtractMix@2: ^SupportDir|Content/ca/expand/sounds.mix + ^SupportDir|Content/ca/expand/chrotnk1.aud: chrotnk1.aud + ^SupportDir|Content/ca/expand/fixit1.aud: fixit1.aud + ^SupportDir|Content/ca/expand/jburn1.aud: jburn1.aud + ^SupportDir|Content/ca/expand/jchrge1.aud: jchrge1.aud + ^SupportDir|Content/ca/expand/jcrisp1.aud: jcrisp1.aud + ^SupportDir|Content/ca/expand/jdance1.aud: jdance1.aud + ^SupportDir|Content/ca/expand/jjuice1.aud: jjuice1.aud + ^SupportDir|Content/ca/expand/jjump1.aud: jjump1.aud + ^SupportDir|Content/ca/expand/jlight1.aud: jlight1.aud + ^SupportDir|Content/ca/expand/jpower1.aud: jpower1.aud + ^SupportDir|Content/ca/expand/jshock1.aud: jshock1.aud + ^SupportDir|Content/ca/expand/jyes1.aud: jyes1.aud + ^SupportDir|Content/ca/expand/madchrg2.aud: madchrg2.aud + ^SupportDir|Content/ca/expand/madexplo.aud: madexplo.aud + ^SupportDir|Content/ca/expand/mboss1.aud: mboss1.aud + ^SupportDir|Content/ca/expand/mhear1.aud: mhear1.aud + ^SupportDir|Content/ca/expand/mhotdig1.aud: mhotdig1.aud + ^SupportDir|Content/ca/expand/mhowdy1.aud: mhowdy1.aud + ^SupportDir|Content/ca/expand/mhuh1.aud: mhuh1.aud + ^SupportDir|Content/ca/expand/mlaff1.aud: mlaff1.aud + ^SupportDir|Content/ca/expand/mrise1.aud: mrise1.aud + ^SupportDir|Content/ca/expand/mwrench1.aud: mwrench1.aud + ^SupportDir|Content/ca/expand/myeehaw1.aud: myeehaw1.aud + ^SupportDir|Content/ca/expand/myes1.aud: myes1.aud + Delete: ^SupportDir|Content/ca/expand/sounds.mix + # Base game music (optional): + ContentPackage@music-cnc: + Name: music-ra + Actions: + ExtractMix: MAIN1.MIX + ^SupportDir|Content/ca/ra/scores.mix: scores.mix + # Counterstrike music (optional): + ContentPackage@music-counterstrike: + Name: music-counterstrike + Actions: + ExtractMix@1: MAIN3.MIX + ^SupportDir|Content/ca/expand/scores.mix: scores.mix + ExtractMix@2: ^SupportDir|Content/ca/expand/scores.mix + ^SupportDir|Content/ca/expand/2nd_hand.aud: 2nd_hand.aud + ^SupportDir|Content/ca/expand/araziod.aud: araziod.aud + ^SupportDir|Content/ca/expand/backstab.aud: backstab.aud + ^SupportDir|Content/ca/expand/chaos2.aud: chaos2.aud + ^SupportDir|Content/ca/expand/shut_it.aud: shut_it.aud + ^SupportDir|Content/ca/expand/twinmix1.aud: twinmix1.aud + ^SupportDir|Content/ca/expand/under3.aud: under3.aud + ^SupportDir|Content/ca/expand/vr2.aud: vr2.aud + Delete: ^SupportDir|Content/ca/expand/scores.mix + # Aftermath music (optional): + ContentPackage@music-aftermath: + Name: music-aftermath + Actions: + ExtractMix@1: MAIN4.MIX + ^SupportDir|Content/ca/expand/scores.mix: scores.mix + ExtractMix@2: ^SupportDir|Content/ca/expand/scores.mix + ^SupportDir|Content/ca/expand/await.aud: await.aud + ^SupportDir|Content/ca/expand/bog.aud: bog.aud + ^SupportDir|Content/ca/expand/float_v2.aud: float_v2.aud + ^SupportDir|Content/ca/expand/gloom_ra.aud: gloom.aud + ^SupportDir|Content/ca/expand/grndwire.aud: grndwire.aud + ^SupportDir|Content/ca/expand/rpt.aud: rpt.aud + ^SupportDir|Content/ca/expand/search.aud: search.aud + ^SupportDir|Content/ca/expand/traction.aud: traction.aud + ^SupportDir|Content/ca/expand/wastelnd.aud: wastelnd.aud + Delete: ^SupportDir|Content/ca/expand/scores.mix + # Allied campaign briefings (optional): + ContentPackage@movies-allied: + Name: movies-allied + Actions: + ExtractMix@1: MAIN1.MIX + ^SupportDir|Content/ca/movies1.mix: movies1.mix + ExtractMix@2: ^SupportDir|Content/ca/movies1.mix + ^SupportDir|Content/ca/movies/aagun.vqa: aagun.vqa + ^SupportDir|Content/ca/movies/aftrmath.vqa: aftrmath.vqa + ^SupportDir|Content/ca/movies/ally12.vqa: ally12.vqa + ^SupportDir|Content/ca/movies/ally14.vqa: ally14.vqa + ^SupportDir|Content/ca/movies/allyend.vqa: allyend.vqa + ^SupportDir|Content/ca/movies/allymorf.vqa: allymorf.vqa + ^SupportDir|Content/ca/movies/apcescpe.vqa: apcescpe.vqa + ^SupportDir|Content/ca/movies/assess.vqa: assess.vqa + ^SupportDir|Content/ca/movies/battle.vqa: battle.vqa + ^SupportDir|Content/ca/movies/binoc.vqa: binoc.vqa + ^SupportDir|Content/ca/movies/bmap.vqa: bmap.vqa + ^SupportDir|Content/ca/movies/brdgtilt.vqa: brdgtilt.vqa + ^SupportDir|Content/ca/movies/cronfail.vqa: cronfail.vqa + ^SupportDir|Content/ca/movies/crontest.vqa: crontest.vqa + ^SupportDir|Content/ca/movies/destroyr.vqa: destroyr.vqa + ^SupportDir|Content/ca/movies/dud.vqa: dud.vqa + ^SupportDir|Content/ca/movies/elevator.vqa: elevator.vqa + ^SupportDir|Content/ca/movies/flare.vqa: flare.vqa + ^SupportDir|Content/ca/movies/frozen.vqa: frozen.vqa + ^SupportDir|Content/ca/movies/grvestne.vqa: grvestne.vqa + ^SupportDir|Content/ca/movies/landing.vqa: landing.vqa + ^SupportDir|Content/ca/movies/masasslt.vqa: masasslt.vqa + ^SupportDir|Content/ca/movies/mcv.vqa: mcv.vqa + ^SupportDir|Content/ca/movies/mcv_land.vqa: mcv_land.vqa + ^SupportDir|Content/ca/movies/montpass.vqa: montpass.vqa + ^SupportDir|Content/ca/movies/oildrum.vqa: oildrum.vqa + ^SupportDir|Content/ca/movies/overrun.vqa: overrun.vqa + ^SupportDir|Content/ca/movies/prolog.vqa: prolog.vqa + ^SupportDir|Content/ca/movies/redintro.vqa: redintro.vqa + ^SupportDir|Content/ca/movies/shipsink.vqa: shipsink.vqa + ^SupportDir|Content/ca/movies/shorbom1.vqa: shorbom1.vqa + ^SupportDir|Content/ca/movies/shorbom2.vqa: shorbom2.vqa + ^SupportDir|Content/ca/movies/shorbomb.vqa: shorbomb.vqa + ^SupportDir|Content/ca/movies/snowbomb.vqa: snowbomb.vqa + ^SupportDir|Content/ca/movies/soviet1.vqa: soviet1.vqa + ^SupportDir|Content/ca/movies/sovtstar.vqa: sovtstar.vqa + ^SupportDir|Content/ca/movies/spy.vqa: spy.vqa + ^SupportDir|Content/ca/movies/tanya1.vqa: tanya1.vqa + ^SupportDir|Content/ca/movies/tanya2.vqa: tanya2.vqa + ^SupportDir|Content/ca/movies/toofar.vqa: toofar.vqa + ^SupportDir|Content/ca/movies/trinity.vqa: trinity.vqa + ^SupportDir|Content/ca/movies/ally1.vqa: ally1.vqa + ^SupportDir|Content/ca/movies/ally2.vqa: ally2.vqa + ^SupportDir|Content/ca/movies/ally4.vqa: ally4.vqa + ^SupportDir|Content/ca/movies/ally5.vqa: ally5.vqa + ^SupportDir|Content/ca/movies/ally6.vqa: ally6.vqa + ^SupportDir|Content/ca/movies/ally8.vqa: ally8.vqa + ^SupportDir|Content/ca/movies/ally9.vqa: ally9.vqa + ^SupportDir|Content/ca/movies/ally10.vqa: ally10.vqa + ^SupportDir|Content/ca/movies/ally10b.vqa: ally10b.vqa + ^SupportDir|Content/ca/movies/ally11.vqa: ally11.vqa + Delete: ^SupportDir|Content/ca/movies1.mix + # Soviet campaign briefings (optional): + ContentPackage@movies-soviet: + Name: movies-soviet + Actions: + ExtractMix@1: MAIN2.MIX + ^SupportDir|Content/ca/movies2.mix: movies2.mix + ExtractMix@2: ^SupportDir|Content/ca/movies2.mix + ^SupportDir|Content/ca/movies/double.vqa: double.vqa + ^SupportDir|Content/ca/movies/dpthchrg.vqa: dpthchrg.vqa + ^SupportDir|Content/ca/movies/execute.vqa: execute.vqa + ^SupportDir|Content/ca/movies/flare.vqa: flare.vqa + ^SupportDir|Content/ca/movies/landing.vqa: landing.vqa + ^SupportDir|Content/ca/movies/mcvbrdge.vqa: mcvbrdge.vqa + ^SupportDir|Content/ca/movies/mig.vqa: mig.vqa + ^SupportDir|Content/ca/movies/movingin.vqa: movingin.vqa + ^SupportDir|Content/ca/movies/mtnkfact.vqa: mtnkfact.vqa + ^SupportDir|Content/ca/movies/nukestok.vqa: nukestok.vqa + ^SupportDir|Content/ca/movies/onthprwl.vqa: onthprwl.vqa + ^SupportDir|Content/ca/movies/periscop.vqa: periscop.vqa + ^SupportDir|Content/ca/movies/prolog.vqa: prolog.vqa + ^SupportDir|Content/ca/movies/radrraid.vqa: radrraid.vqa + ^SupportDir|Content/ca/movies/redintro.vqa: redintro.vqa + ^SupportDir|Content/ca/movies/search.vqa: search.vqa + ^SupportDir|Content/ca/movies/sfrozen.vqa: sfrozen.vqa + ^SupportDir|Content/ca/movies/sitduck.vqa: sitduck.vqa + ^SupportDir|Content/ca/movies/slntsrvc.vqa: slntsrvc.vqa + ^SupportDir|Content/ca/movies/snowbomb.vqa: snowbomb.vqa + ^SupportDir|Content/ca/movies/snstrafe.vqa: snstrafe.vqa + ^SupportDir|Content/ca/movies/sovbatl.vqa: sovbatl.vqa + ^SupportDir|Content/ca/movies/sovcemet.vqa: sovcemet.vqa + ^SupportDir|Content/ca/movies/sovfinal.vqa: sovfinal.vqa + ^SupportDir|Content/ca/movies/soviet1.vqa: soviet1.vqa + ^SupportDir|Content/ca/movies/soviet2.vqa: soviet2.vqa + ^SupportDir|Content/ca/movies/soviet3.vqa: soviet3.vqa + ^SupportDir|Content/ca/movies/soviet4.vqa: soviet4.vqa + ^SupportDir|Content/ca/movies/soviet5.vqa: soviet5.vqa + ^SupportDir|Content/ca/movies/soviet6.vqa: soviet6.vqa + ^SupportDir|Content/ca/movies/soviet7.vqa: soviet7.vqa + ^SupportDir|Content/ca/movies/soviet8.vqa: soviet8.vqa + ^SupportDir|Content/ca/movies/soviet9.vqa: soviet9.vqa + ^SupportDir|Content/ca/movies/soviet10.vqa: soviet10.vqa + ^SupportDir|Content/ca/movies/soviet11.vqa: soviet11.vqa + ^SupportDir|Content/ca/movies/soviet12.vqa: soviet12.vqa + ^SupportDir|Content/ca/movies/soviet13.vqa: soviet13.vqa + ^SupportDir|Content/ca/movies/soviet14.vqa: soviet14.vqa + ^SupportDir|Content/ca/movies/sovmcv.vqa: sovmcv.vqa + ^SupportDir|Content/ca/movies/sovtstar.vqa: sovtstar.vqa + ^SupportDir|Content/ca/movies/spotter.vqa: spotter.vqa + ^SupportDir|Content/ca/movies/strafe.vqa: strafe.vqa + ^SupportDir|Content/ca/movies/take_off.vqa: take_off.vqa + ^SupportDir|Content/ca/movies/tesla.vqa: tesla.vqa + ^SupportDir|Content/ca/movies/v2rocket.vqa: v2rocket.vqa + ^SupportDir|Content/ca/movies/aagun.vqa: aagun.vqa + ^SupportDir|Content/ca/movies/airfield.vqa: airfield.vqa + ^SupportDir|Content/ca/movies/ally1.vqa: ally1.vqa + ^SupportDir|Content/ca/movies/allymorf.vqa: allymorf.vqa + ^SupportDir|Content/ca/movies/averted.vqa: averted.vqa + ^SupportDir|Content/ca/movies/beachead.vqa: beachead.vqa + ^SupportDir|Content/ca/movies/bmap.vqa: bmap.vqa + ^SupportDir|Content/ca/movies/bombrun.vqa: bombrun.vqa + ^SupportDir|Content/ca/movies/countdwn.vqa: countdwn.vqa + ^SupportDir|Content/ca/movies/cronfail.vqa: cronfail.vqa + Delete: ^SupportDir|Content/ca/movies2.mix + +cnc-origin: C&C Ultimate Collection TD (Origin version, English) + Type: RegistryDirectory + RegistryPrefixes: HKEY_LOCAL_MACHINE\Software\, HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ + RegistryKey: EA Games\CNC and The Covert Operations + RegistryValue: Install Dir + IDFiles: + CONQUER.MIX: 833e02a09aae694659eb312d3838367f681d1b30 + Install: + # C&C Desert Tileset: + ContentPackage@cncdesert: + Name: cncdesert + Actions: + Copy: . + ^SupportDir|Content/ca/cnc/desert.mix: DESERT.MIX + # Base game music (optional): + ContentPackage@music-cnc: + Name: music-cnc + Actions: + Copy: . + ^SupportDir|Content/ca/cnc/scores.mix: covert/SCORES.MIX + +cncr-origin: C&C Remastered Collection (Origin version, English) + Type: RegistryDirectory + RegistryPrefixes: HKEY_LOCAL_MACHINE\Software\, HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ + RegistryKey: Petroglyph\CnCRemastered + RegistryValue: Install Dir + IDFiles: + Data/CNCDATA/RED_ALERT/CD1/REDALERT.MIX: 0e58f4b54f44f6cd29fecf8cf379d33cf2d4caef + # The Remastered Collection doesn't include the RA Soviet CD unfortunately, so we can't install Soviet campaign briefings. + Install: + # Base game files: + ContentPackage@base: + Name: base + Actions: + ExtractMix@1: Data/CNCDATA/RED_ALERT/CD1/REDALERT.MIX + ^SupportDir|Content/ca/hires.mix: hires.mix + ^SupportDir|Content/ca/local.mix: local.mix + ^SupportDir|Content/ca/lores.mix: lores.mix + ^SupportDir|Content/ca/speech.mix: speech.mix + ExtractMix@2: Data/CNCDATA/RED_ALERT/CD1/MAIN.MIX + ^SupportDir|Content/ca/conquer.mix: conquer.mix + ^SupportDir|Content/ca/general.mix: general.mix + ^SupportDir|Content/ca/interior.mix: interior.mix + ^SupportDir|Content/ca/snow.mix: snow.mix + ^SupportDir|Content/ca/sounds.mix: sounds.mix + ^SupportDir|Content/ca/russian.mix: russian.mix + ^SupportDir|Content/ca/allies.mix: allies.mix + ^SupportDir|Content/ca/temperat.mix: temperat.mix + # Aftermath expansion files: + ContentPackage@aftermathbase: + Name: aftermathbase + Actions: + Copy: Data/CNCDATA/RED_ALERT/AFTERMATH + ^SupportDir|Content/ca/expand/expand2.mix: expand2.mix + ^SupportDir|Content/ca/expand/hires1.mix: hires1.mix + ^SupportDir|Content/ca/expand/lores1.mix: lores1.mix + ExtractMix@1: Data/CNCDATA/RED_ALERT/AFTERMATH/MAIN.MIX + ^SupportDir|Content/ca/expand/sounds.mix: sounds.mix + ExtractMix@2: ^SupportDir|Content/ca/expand/sounds.mix + ^SupportDir|Content/ca/expand/chrotnk1.aud: chrotnk1.aud + ^SupportDir|Content/ca/expand/fixit1.aud: fixit1.aud + ^SupportDir|Content/ca/expand/jburn1.aud: jburn1.aud + ^SupportDir|Content/ca/expand/jchrge1.aud: jchrge1.aud + ^SupportDir|Content/ca/expand/jcrisp1.aud: jcrisp1.aud + ^SupportDir|Content/ca/expand/jdance1.aud: jdance1.aud + ^SupportDir|Content/ca/expand/jjuice1.aud: jjuice1.aud + ^SupportDir|Content/ca/expand/jjump1.aud: jjump1.aud + ^SupportDir|Content/ca/expand/jlight1.aud: jlight1.aud + ^SupportDir|Content/ca/expand/jpower1.aud: jpower1.aud + ^SupportDir|Content/ca/expand/jshock1.aud: jshock1.aud + ^SupportDir|Content/ca/expand/jyes1.aud: jyes1.aud + ^SupportDir|Content/ca/expand/madchrg2.aud: madchrg2.aud + ^SupportDir|Content/ca/expand/madexplo.aud: madexplo.aud + ^SupportDir|Content/ca/expand/mboss1.aud: mboss1.aud + ^SupportDir|Content/ca/expand/mhear1.aud: mhear1.aud + ^SupportDir|Content/ca/expand/mhotdig1.aud: mhotdig1.aud + ^SupportDir|Content/ca/expand/mhowdy1.aud: mhowdy1.aud + ^SupportDir|Content/ca/expand/mhuh1.aud: mhuh1.aud + ^SupportDir|Content/ca/expand/mlaff1.aud: mlaff1.aud + ^SupportDir|Content/ca/expand/mrise1.aud: mrise1.aud + ^SupportDir|Content/ca/expand/mwrench1.aud: mwrench1.aud + ^SupportDir|Content/ca/expand/myeehaw1.aud: myeehaw1.aud + ^SupportDir|Content/ca/expand/myes1.aud: myes1.aud + Delete: ^SupportDir|Content/ca/expand/sounds.mix + # Allied campaign briefings (optional): + ContentPackage@movies-allied: + Name: movies-allied + Actions: + ExtractMix@1: Data/CNCDATA/RED_ALERT/CD1/MAIN.MIX + ^SupportDir|Content/ca/movies1.mix: movies1.mix + ExtractMix@2: ^SupportDir|Content/ca/movies1.mix + ^SupportDir|Content/ca/movies/aagun.vqa: aagun.vqa + ^SupportDir|Content/ca/movies/aftrmath.vqa: aftrmath.vqa + ^SupportDir|Content/ca/movies/ally1.vqa: ally1.vqa + ^SupportDir|Content/ca/movies/ally10.vqa: ally10.vqa + ^SupportDir|Content/ca/movies/ally10b.vqa: ally10b.vqa + ^SupportDir|Content/ca/movies/ally11.vqa: ally11.vqa + ^SupportDir|Content/ca/movies/ally12.vqa: ally12.vqa + ^SupportDir|Content/ca/movies/ally14.vqa: ally14.vqa + ^SupportDir|Content/ca/movies/ally2.vqa: ally2.vqa + ^SupportDir|Content/ca/movies/ally4.vqa: ally4.vqa + ^SupportDir|Content/ca/movies/ally5.vqa: ally5.vqa + ^SupportDir|Content/ca/movies/ally6.vqa: ally6.vqa + ^SupportDir|Content/ca/movies/ally8.vqa: ally8.vqa + ^SupportDir|Content/ca/movies/ally9.vqa: ally9.vqa + ^SupportDir|Content/ca/movies/allyend.vqa: allyend.vqa + ^SupportDir|Content/ca/movies/allymorf.vqa: allymorf.vqa + ^SupportDir|Content/ca/movies/apcescpe.vqa: apcescpe.vqa + ^SupportDir|Content/ca/movies/assess.vqa: assess.vqa + ^SupportDir|Content/ca/movies/battle.vqa: battle.vqa + ^SupportDir|Content/ca/movies/binoc.vqa: binoc.vqa + ^SupportDir|Content/ca/movies/bmap.vqa: bmap.vqa + ^SupportDir|Content/ca/movies/brdgtilt.vqa: brdgtilt.vqa + ^SupportDir|Content/ca/movies/crontest.vqa: crontest.vqa + ^SupportDir|Content/ca/movies/cronfail.vqa: cronfail.vqa + ^SupportDir|Content/ca/movies/destroyr.vqa: destroyr.vqa + ^SupportDir|Content/ca/movies/dud.vqa: dud.vqa + ^SupportDir|Content/ca/movies/elevator.vqa: elevator.vqa + ^SupportDir|Content/ca/movies/flare.vqa: flare.vqa + ^SupportDir|Content/ca/movies/frozen.vqa: frozen.vqa + ^SupportDir|Content/ca/movies/grvestne.vqa: grvestne.vqa + ^SupportDir|Content/ca/movies/landing.vqa: landing.vqa + ^SupportDir|Content/ca/movies/masasslt.vqa: masasslt.vqa + ^SupportDir|Content/ca/movies/mcv.vqa: mcv.vqa + ^SupportDir|Content/ca/movies/mcv_land.vqa: mcv_land.vqa + ^SupportDir|Content/ca/movies/montpass.vqa: montpass.vqa + ^SupportDir|Content/ca/movies/oildrum.vqa: oildrum.vqa + ^SupportDir|Content/ca/movies/overrun.vqa: overrun.vqa + ^SupportDir|Content/ca/movies/prolog.vqa: prolog.vqa + ^SupportDir|Content/ca/movies/redintro.vqa: redintro.vqa + ^SupportDir|Content/ca/movies/shipsink.vqa: shipsink.vqa + ^SupportDir|Content/ca/movies/shorbom1.vqa: shorbom1.vqa + ^SupportDir|Content/ca/movies/shorbom2.vqa: shorbom2.vqa + ^SupportDir|Content/ca/movies/shorbomb.vqa: shorbomb.vqa + ^SupportDir|Content/ca/movies/snowbomb.vqa: snowbomb.vqa + ^SupportDir|Content/ca/movies/soviet1.vqa: soviet1.vqa + ^SupportDir|Content/ca/movies/sovtstar.vqa: sovtstar.vqa + ^SupportDir|Content/ca/movies/spy.vqa: spy.vqa + ^SupportDir|Content/ca/movies/tanya1.vqa: tanya1.vqa + ^SupportDir|Content/ca/movies/tanya2.vqa: tanya2.vqa + ^SupportDir|Content/ca/movies/toofar.vqa: toofar.vqa + ^SupportDir|Content/ca/movies/trinity.vqa: trinity.vqa + Delete: ^SupportDir|Content/ca/movies1.mix + # Base game music (optional): + ContentPackage@music-ra: + Name: music-ra + Actions: + ExtractMix: Data/CNCDATA/RED_ALERT/CD1/MAIN.MIX + ^SupportDir|Content/ca/ra/scores.mix: scores.mix + # Counterstrike music (optional): + ContentPackage: + Name: music-counterstrike + Actions: + ExtractMix@1: Data/CNCDATA/RED_ALERT/COUNTERSTRIKE/MAIN.MIX + ^SupportDir|Content/ca/expand/scores.mix: scores.mix + ExtractMix@2: ^SupportDir|Content/ca/expand/scores.mix + ^SupportDir|Content/ca/expand/2nd_hand.aud: 2nd_hand.aud + ^SupportDir|Content/ca/expand/araziod.aud: araziod.aud + ^SupportDir|Content/ca/expand/backstab.aud: backstab.aud + ^SupportDir|Content/ca/expand/chaos2.aud: chaos2.aud + ^SupportDir|Content/ca/expand/shut_it.aud: shut_it.aud + ^SupportDir|Content/ca/expand/twinmix1.aud: twinmix1.aud + ^SupportDir|Content/ca/expand/under3.aud: under3.aud + ^SupportDir|Content/ca/expand/vr2.aud: vr2.aud + Delete: ^SupportDir|Content/ca/expand/scores.mix + # Aftermath music (optional): + ContentPackage@music-aftermath: + Name: music-aftermath + Actions: + ExtractMix@1: Data/CNCDATA/RED_ALERT/AFTERMATH/MAIN.MIX + ^SupportDir|Content/ca/expand/scores.mix: scores.mix + ExtractMix@2: ^SupportDir|Content/ca/expand/scores.mix + ^SupportDir|Content/ca/expand/await.aud: await.aud + ^SupportDir|Content/ca/expand/bog.aud: bog.aud + ^SupportDir|Content/ca/expand/float_v2.aud: float_v2.aud + ^SupportDir|Content/ca/expand/gloom_ra.aud: gloom.aud + ^SupportDir|Content/ca/expand/grndwire.aud: grndwire.aud + ^SupportDir|Content/ca/expand/rpt.aud: rpt.aud + ^SupportDir|Content/ca/expand/search.aud: search.aud + ^SupportDir|Content/ca/expand/traction.aud: traction.aud + ^SupportDir|Content/ca/expand/wastelnd.aud: wastelnd.aud + Delete: ^SupportDir|Content/ca/expand/scores.mix + # C&C Desert Tileset: + ContentPackage@cncdesert: + Name: cncdesert + Actions: + Copy: Data/CNCDATA/TIBERIAN_DAWN/CD1 + ^SupportDir|Content/ca/cnc/desert.mix: DESERT.MIX + ^SupportDir|Content/ca/cnc/scores.mix: SCORES.MIX + # TD music (optional): + ContentPackage@music-cnc: + Name: music-cnc + Actions: + Copy: Data/CNCDATA/TIBERIAN_DAWN/CD3 + ^SupportDir|Content/ca/cnc/scores.mix: SCORES.MIX + +ts-origin: C&C Ultimate Collection TS (Origin version, English) + Type: RegistryDirectory + RegistryPrefixes: HKEY_LOCAL_MACHINE\Software\, HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ + RegistryKey: EA Games\Command and Conquer Tiberian Sun + RegistryValue: Install Dir + IDFiles: + GDFBinary_en_US.dll: 4bb56a449bd0003e7ae67625d90a11ae169319d6 + Install: + # Base game music (optional): + ContentPackage@music-ts: + Name: music-ts + Actions: + Copy: . + ^SupportDir|Content/ca/ts/scores.mix: SCORES.MIX + # Firestorm expansion music (optional): + ContentPackage@music-fs: + Name: music-fs + Actions: + Copy: . + ^SupportDir|Content/ca/firestorm/scores01.mix: scores01.mix + ExtractMix: ^SupportDir|Content/ca/firestorm/scores01.mix + ^SupportDir|Content/ca/firestorm/dmachine.aud: dmachine.aud + ^SupportDir|Content/ca/firestorm/elusive.aud: elusive.aud + ^SupportDir|Content/ca/firestorm/hacker.aud: hacker.aud + ^SupportDir|Content/ca/firestorm/infiltra.aud: infiltra.aud + ^SupportDir|Content/ca/firestorm/kmachine.aud: kmachine.aud + ^SupportDir|Content/ca/firestorm/linkup.aud: linkup.aud + ^SupportDir|Content/ca/firestorm/rainnite.aud: rainnite.aud + ^SupportDir|Content/ca/firestorm/slavesys.aud: slavesys.aud + Delete: ^SupportDir|Content/ca/firestorm/scores01.mix + +ra2-origin: C&C Ultimate Collection RA2 (Origin version, English) + Type: RegistryDirectory + RegistryPrefixes: HKEY_LOCAL_MACHINE\Software\, HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ + RegistryKey: EA Games\Command and Conquer Red Alert II + RegistryValue: Install Dir + IDFiles: + theme.mix: 184f99e3292ab19c71c08a1ad7097ce739396190 + Install: + ContentPackage@base: + Name: music-ra2 + Actions: + Copy: . + ^SupportDir|Content/ca/ra2/theme.mix: theme.mix + ContentPackage@music-yr: + Name: music-yr + Actions: + Copy: . + ^SupportDir|Content/ca/ra2/thememd.mix: thememd.mix diff --git a/mods/ca-content/installer/ra2.yaml b/mods/ca-content/installer/ra2.yaml new file mode 100644 index 0000000000..5de3b77821 --- /dev/null +++ b/mods/ca-content/installer/ra2.yaml @@ -0,0 +1,11 @@ +ra2: Red Alert 2 (Allied or Soviet Disc, English) + Type: Disc + IDFiles: + README.txt: e125e2742509d73b20dc4aa65b22497c805cd6f5 + Install: + # RA2 music (optional): + ContentPackage@music-ra2: + Name: music-ra2 + Actions: + Copy: . + ^SupportDir|Content/ca/ra2/theme.mix: theme.mix diff --git a/mods/ca-content/installer/ra2yr.yaml b/mods/ca-content/installer/ra2yr.yaml new file mode 100644 index 0000000000..ba5d48966e --- /dev/null +++ b/mods/ca-content/installer/ra2yr.yaml @@ -0,0 +1,11 @@ +ra2yr: Red Alert 2 Yuri's Revenge (English) + Type: Disc + IDFiles: + README.txt: ac868fc9f804deebb5a934dde341d3daad1e9622 + Install: + # YR music (optional): + ContentPackage@music-yr: + Name: music-yr + Actions: + Copy: . + ^SupportDir|Content/ca/ra2/thememd.mix: thememd.mix diff --git a/mods/ca-content/installer/soviet95.yaml b/mods/ca-content/installer/soviet95.yaml new file mode 100644 index 0000000000..fe7667442f --- /dev/null +++ b/mods/ca-content/installer/soviet95.yaml @@ -0,0 +1,94 @@ +soviet: Red Alert 95 (Soviet Disc, English) + Type: Disc + IDFiles: + MAIN.MIX: 9d108f18560716b684ab8b1da42cc7f3d1b52519 + Length: 4096 + INSTALL/REDALERT.MIX: 0e58f4b54f44f6cd29fecf8cf379d33cf2d4caef + Install: + # Base game files: + ContentPackage@base: + Name: base + Actions: + ExtractMix@1: INSTALL/REDALERT.MIX + ^SupportDir|Content/ca/hires.mix: hires.mix + ^SupportDir|Content/ca/local.mix: local.mix + ^SupportDir|Content/ca/lores.mix: lores.mix + ^SupportDir|Content/ca/speech.mix: speech.mix + ExtractMix@2: MAIN.MIX + ^SupportDir|Content/ca/conquer.mix: conquer.mix + ^SupportDir|Content/ca/general.mix: general.mix # Is this one used? The FirstDecade and TUC installers are missing this! + ^SupportDir|Content/ca/interior.mix: interior.mix + ^SupportDir|Content/ca/snow.mix: snow.mix + ^SupportDir|Content/ca/sounds.mix: sounds.mix + ^SupportDir|Content/ca/russian.mix: russian.mix + ^SupportDir|Content/ca/allies.mix: allies.mix + ^SupportDir|Content/ca/temperat.mix: temperat.mix + # Base game music (optional): + ContentPackage@music-ra: + Name: music-ra + Actions: + ExtractMix: MAIN.MIX + ^SupportDir|Content/ca/ra/scores.mix: scores.mix + # Soviet campaign briefings (optional): + ContentPackage@movies-soviet: + Name: movies-soviet + Actions: + ExtractMix@1: MAIN.MIX + ^SupportDir|Content/ca/movies2.mix: movies2.mix + ExtractMix@2: ^SupportDir|Content/ca/movies2.mix + ^SupportDir|Content/ca/movies/aagun.vqa: aagun.vqa + ^SupportDir|Content/ca/movies/cronfail.vqa: cronfail.vqa + ^SupportDir|Content/ca/movies/airfield.vqa: airfield.vqa + ^SupportDir|Content/ca/movies/ally1.vqa: ally1.vqa + ^SupportDir|Content/ca/movies/allymorf.vqa: allymorf.vqa + ^SupportDir|Content/ca/movies/averted.vqa: averted.vqa + ^SupportDir|Content/ca/movies/beachead.vqa: beachead.vqa + ^SupportDir|Content/ca/movies/bmap.vqa: bmap.vqa + ^SupportDir|Content/ca/movies/bombrun.vqa: bombrun.vqa + ^SupportDir|Content/ca/movies/countdwn.vqa: countdwn.vqa + ^SupportDir|Content/ca/movies/double.vqa: double.vqa + ^SupportDir|Content/ca/movies/dpthchrg.vqa: dpthchrg.vqa + ^SupportDir|Content/ca/movies/execute.vqa: execute.vqa + ^SupportDir|Content/ca/movies/flare.vqa: flare.vqa + ^SupportDir|Content/ca/movies/landing.vqa: landing.vqa + ^SupportDir|Content/ca/movies/mcvbrdge.vqa: mcvbrdge.vqa + ^SupportDir|Content/ca/movies/mig.vqa: mig.vqa + ^SupportDir|Content/ca/movies/movingin.vqa: movingin.vqa + ^SupportDir|Content/ca/movies/mtnkfact.vqa: mtnkfact.vqa + ^SupportDir|Content/ca/movies/nukestok.vqa: nukestok.vqa + ^SupportDir|Content/ca/movies/onthprwl.vqa: onthprwl.vqa + ^SupportDir|Content/ca/movies/periscop.vqa: periscop.vqa + ^SupportDir|Content/ca/movies/prolog.vqa: prolog.vqa + ^SupportDir|Content/ca/movies/radrraid.vqa: radrraid.vqa + ^SupportDir|Content/ca/movies/redintro.vqa: redintro.vqa + ^SupportDir|Content/ca/movies/search.vqa: search.vqa + ^SupportDir|Content/ca/movies/sfrozen.vqa: sfrozen.vqa + ^SupportDir|Content/ca/movies/sitduck.vqa: sitduck.vqa + ^SupportDir|Content/ca/movies/slntsrvc.vqa: slntsrvc.vqa + ^SupportDir|Content/ca/movies/snowbomb.vqa: snowbomb.vqa + ^SupportDir|Content/ca/movies/snstrafe.vqa: snstrafe.vqa + ^SupportDir|Content/ca/movies/sovbatl.vqa: sovbatl.vqa + ^SupportDir|Content/ca/movies/sovcemet.vqa: sovcemet.vqa + ^SupportDir|Content/ca/movies/sovfinal.vqa: sovfinal.vqa + ^SupportDir|Content/ca/movies/soviet1.vqa: soviet1.vqa + ^SupportDir|Content/ca/movies/soviet10.vqa: soviet10.vqa + ^SupportDir|Content/ca/movies/soviet11.vqa: soviet11.vqa + ^SupportDir|Content/ca/movies/soviet12.vqa: soviet12.vqa + ^SupportDir|Content/ca/movies/soviet13.vqa: soviet13.vqa + ^SupportDir|Content/ca/movies/soviet14.vqa: soviet14.vqa + ^SupportDir|Content/ca/movies/soviet2.vqa: soviet2.vqa + ^SupportDir|Content/ca/movies/soviet3.vqa: soviet3.vqa + ^SupportDir|Content/ca/movies/soviet4.vqa: soviet4.vqa + ^SupportDir|Content/ca/movies/soviet5.vqa: soviet5.vqa + ^SupportDir|Content/ca/movies/soviet6.vqa: soviet6.vqa + ^SupportDir|Content/ca/movies/soviet7.vqa: soviet7.vqa + ^SupportDir|Content/ca/movies/soviet8.vqa: soviet8.vqa + ^SupportDir|Content/ca/movies/soviet9.vqa: soviet9.vqa + ^SupportDir|Content/ca/movies/sovmcv.vqa: sovmcv.vqa + ^SupportDir|Content/ca/movies/sovtstar.vqa: sovtstar.vqa + ^SupportDir|Content/ca/movies/spotter.vqa: spotter.vqa + ^SupportDir|Content/ca/movies/strafe.vqa: strafe.vqa + ^SupportDir|Content/ca/movies/take_off.vqa: take_off.vqa + ^SupportDir|Content/ca/movies/tesla.vqa: tesla.vqa + ^SupportDir|Content/ca/movies/v2rocket.vqa: v2rocket.vqa + Delete: ^SupportDir|Content/ca/movies2.mix diff --git a/mods/ca-content/installer/steam.yaml b/mods/ca-content/installer/steam.yaml new file mode 100644 index 0000000000..1b160a13d7 --- /dev/null +++ b/mods/ca-content/installer/steam.yaml @@ -0,0 +1,459 @@ +ra-steam: C&C Ultimate Collection RA (Steam version, English) + Type: Steam + AppId: 2229840 + IDFiles: + REDALERT.MIX: 0e58f4b54f44f6cd29fecf8cf379d33cf2d4caef + Install: + # Base game files: + ContentPackage@base: + Name: base + Actions: + ExtractMix@1: REDALERT.MIX + ^SupportDir|Content/ca/hires.mix: hires.mix + ^SupportDir|Content/ca/local.mix: local.mix + ^SupportDir|Content/ca/lores.mix: lores.mix + ^SupportDir|Content/ca/speech.mix: speech.mix + ExtractMix@2: MAIN1.MIX + ^SupportDir|Content/ca/interior.mix: interior.mix + ^SupportDir|Content/ca/conquer.mix: conquer.mix + ^SupportDir|Content/ca/allies.mix: allies.mix + ^SupportDir|Content/ca/temperat.mix: temperat.mix + ^SupportDir|Content/ca/sounds.mix: sounds.mix + ^SupportDir|Content/ca/snow.mix: snow.mix + ^SupportDir|Content/ca/russian.mix: russian.mix + # Aftermath expansion files: + ContentPackage@aftermathbase: + Name: aftermathbase + Actions: + Copy: . + ^SupportDir|Content/ca/expand/expand2.mix: EXPAND2.MIX + ^SupportDir|Content/ca/expand/hires1.mix: HIRES1.MIX + ^SupportDir|Content/ca/expand/lores1.mix: LORES1.MIX + ExtractMix@1: MAIN4.MIX + ^SupportDir|Content/ca/expand/sounds-aftermath.mix: sounds.mix + ExtractMix@2: ^SupportDir|Content/ca/expand/sounds-aftermath.mix + ^SupportDir|Content/ca/expand/chrotnk1.aud: chrotnk1.aud + ^SupportDir|Content/ca/expand/fixit1.aud: fixit1.aud + ^SupportDir|Content/ca/expand/jburn1.aud: jburn1.aud + ^SupportDir|Content/ca/expand/jchrge1.aud: jchrge1.aud + ^SupportDir|Content/ca/expand/jcrisp1.aud: jcrisp1.aud + ^SupportDir|Content/ca/expand/jdance1.aud: jdance1.aud + ^SupportDir|Content/ca/expand/jjuice1.aud: jjuice1.aud + ^SupportDir|Content/ca/expand/jjump1.aud: jjump1.aud + ^SupportDir|Content/ca/expand/jlight1.aud: jlight1.aud + ^SupportDir|Content/ca/expand/jpower1.aud: jpower1.aud + ^SupportDir|Content/ca/expand/jshock1.aud: jshock1.aud + ^SupportDir|Content/ca/expand/jyes1.aud: jyes1.aud + ^SupportDir|Content/ca/expand/madchrg2.aud: madchrg2.aud + ^SupportDir|Content/ca/expand/madexplo.aud: madexplo.aud + ^SupportDir|Content/ca/expand/mboss1.aud: mboss1.aud + ^SupportDir|Content/ca/expand/mhear1.aud: mhear1.aud + ^SupportDir|Content/ca/expand/mhotdig1.aud: mhotdig1.aud + ^SupportDir|Content/ca/expand/mhowdy1.aud: mhowdy1.aud + ^SupportDir|Content/ca/expand/mhuh1.aud: mhuh1.aud + ^SupportDir|Content/ca/expand/mlaff1.aud: mlaff1.aud + ^SupportDir|Content/ca/expand/mrise1.aud: mrise1.aud + ^SupportDir|Content/ca/expand/mwrench1.aud: mwrench1.aud + ^SupportDir|Content/ca/expand/myeehaw1.aud: myeehaw1.aud + ^SupportDir|Content/ca/expand/myes1.aud: myes1.aud + Delete: ^SupportDir|Content/ca/expand/sounds-aftermath.mix + # Base game music (optional): + ContentPackage@music-ra: + Name: music-ra + Actions: + ExtractMix: MAIN1.MIX + ^SupportDir|Content/ca/ra/scores.mix: scores.mix + # Counterstrike music (optional): + ContentPackage@music-counterstrike: + Name: music-counterstrike + Actions: + ExtractMix@1: MAIN3.MIX + ^SupportDir|Content/ca/expand/scores-counterstrike.mix: scores.mix + ExtractMix@2: ^SupportDir|Content/ca/expand/scores-counterstrike.mix + ^SupportDir|Content/ca/expand/2nd_hand.aud: 2nd_hand.aud + ^SupportDir|Content/ca/expand/araziod.aud: araziod.aud + ^SupportDir|Content/ca/expand/backstab.aud: backstab.aud + ^SupportDir|Content/ca/expand/chaos2.aud: chaos2.aud + ^SupportDir|Content/ca/expand/shut_it.aud: shut_it.aud + ^SupportDir|Content/ca/expand/twinmix1.aud: twinmix1.aud + ^SupportDir|Content/ca/expand/under3.aud: under3.aud + ^SupportDir|Content/ca/expand/vr2.aud: vr2.aud + Delete: ^SupportDir|Content/ca/expand/scores-counterstrike.mix + # Aftermath music (optional): + ContentPackage@music-aftermath: + Name: music-aftermath + Actions: + ExtractMix@1: MAIN4.MIX + ^SupportDir|Content/ca/expand/scores-aftermath.mix: scores.mix + ExtractMix@2: ^SupportDir|Content/ca/expand/scores-aftermath.mix + ^SupportDir|Content/ca/expand/await.aud: await.aud + ^SupportDir|Content/ca/expand/bog.aud: bog.aud + ^SupportDir|Content/ca/expand/float_v2.aud: float_v2.aud + ^SupportDir|Content/ca/expand/gloom_ra.aud: gloom.aud + ^SupportDir|Content/ca/expand/grndwire.aud: grndwire.aud + ^SupportDir|Content/ca/expand/rpt.aud: rpt.aud + ^SupportDir|Content/ca/expand/search.aud: search.aud + ^SupportDir|Content/ca/expand/traction.aud: traction.aud + ^SupportDir|Content/ca/expand/wastelnd.aud: wastelnd.aud + Delete: ^SupportDir|Content/ca/expand/scores-aftermath.mix + # Allied campaign briefings (optional): + ContentPackage@movies-allied: + Name: movies-allied + Actions: + ExtractMix@1: MAIN1.MIX + ^SupportDir|Content/ca/movies1.mix: movies1.mix + ExtractMix@2: ^SupportDir|Content/ca/movies1.mix + ^SupportDir|Content/ca/movies/aagun.vqa: aagun.vqa + ^SupportDir|Content/ca/movies/aftrmath.vqa: aftrmath.vqa + ^SupportDir|Content/ca/movies/ally12.vqa: ally12.vqa + ^SupportDir|Content/ca/movies/ally14.vqa: ally14.vqa + ^SupportDir|Content/ca/movies/allyend.vqa: allyend.vqa + ^SupportDir|Content/ca/movies/allymorf.vqa: allymorf.vqa + ^SupportDir|Content/ca/movies/apcescpe.vqa: apcescpe.vqa + ^SupportDir|Content/ca/movies/assess.vqa: assess.vqa + ^SupportDir|Content/ca/movies/battle.vqa: battle.vqa + ^SupportDir|Content/ca/movies/binoc.vqa: binoc.vqa + ^SupportDir|Content/ca/movies/bmap.vqa: bmap.vqa + ^SupportDir|Content/ca/movies/brdgtilt.vqa: brdgtilt.vqa + ^SupportDir|Content/ca/movies/cronfail.vqa: cronfail.vqa + ^SupportDir|Content/ca/movies/crontest.vqa: crontest.vqa + ^SupportDir|Content/ca/movies/destroyr.vqa: destroyr.vqa + ^SupportDir|Content/ca/movies/dud.vqa: dud.vqa + ^SupportDir|Content/ca/movies/elevator.vqa: elevator.vqa + ^SupportDir|Content/ca/movies/flare.vqa: flare.vqa + ^SupportDir|Content/ca/movies/frozen.vqa: frozen.vqa + ^SupportDir|Content/ca/movies/grvestne.vqa: grvestne.vqa + ^SupportDir|Content/ca/movies/landing.vqa: landing.vqa + ^SupportDir|Content/ca/movies/masasslt.vqa: masasslt.vqa + ^SupportDir|Content/ca/movies/mcv.vqa: mcv.vqa + ^SupportDir|Content/ca/movies/mcv_land.vqa: mcv_land.vqa + ^SupportDir|Content/ca/movies/montpass.vqa: montpass.vqa + ^SupportDir|Content/ca/movies/oildrum.vqa: oildrum.vqa + ^SupportDir|Content/ca/movies/overrun.vqa: overrun.vqa + ^SupportDir|Content/ca/movies/prolog.vqa: prolog.vqa + ^SupportDir|Content/ca/movies/redintro.vqa: redintro.vqa + ^SupportDir|Content/ca/movies/shipsink.vqa: shipsink.vqa + ^SupportDir|Content/ca/movies/shorbom1.vqa: shorbom1.vqa + ^SupportDir|Content/ca/movies/shorbom2.vqa: shorbom2.vqa + ^SupportDir|Content/ca/movies/shorbomb.vqa: shorbomb.vqa + ^SupportDir|Content/ca/movies/snowbomb.vqa: snowbomb.vqa + ^SupportDir|Content/ca/movies/soviet1.vqa: soviet1.vqa + ^SupportDir|Content/ca/movies/sovtstar.vqa: sovtstar.vqa + ^SupportDir|Content/ca/movies/spy.vqa: spy.vqa + ^SupportDir|Content/ca/movies/tanya1.vqa: tanya1.vqa + ^SupportDir|Content/ca/movies/tanya2.vqa: tanya2.vqa + ^SupportDir|Content/ca/movies/toofar.vqa: toofar.vqa + ^SupportDir|Content/ca/movies/trinity.vqa: trinity.vqa + ^SupportDir|Content/ca/movies/ally1.vqa: ally1.vqa + ^SupportDir|Content/ca/movies/ally2.vqa: ally2.vqa + ^SupportDir|Content/ca/movies/ally4.vqa: ally4.vqa + ^SupportDir|Content/ca/movies/ally5.vqa: ally5.vqa + ^SupportDir|Content/ca/movies/ally6.vqa: ally6.vqa + ^SupportDir|Content/ca/movies/ally8.vqa: ally8.vqa + ^SupportDir|Content/ca/movies/ally9.vqa: ally9.vqa + ^SupportDir|Content/ca/movies/ally10.vqa: ally10.vqa + ^SupportDir|Content/ca/movies/ally10b.vqa: ally10b.vqa + ^SupportDir|Content/ca/movies/ally11.vqa: ally11.vqa + Delete: ^SupportDir|Content/ca/movies1.mix + # Soviet campaign briefings (optional): + ContentPackage@movies-soviet: + Name: movies-soviet + Actions: + ExtractMix@1: MAIN2.MIX + ^SupportDir|Content/ca/movies2.mix: movies2.mix + ExtractMix@2: ^SupportDir|Content/ca/movies2.mix + ^SupportDir|Content/ca/movies/double.vqa: double.vqa + ^SupportDir|Content/ca/movies/dpthchrg.vqa: dpthchrg.vqa + ^SupportDir|Content/ca/movies/execute.vqa: execute.vqa + ^SupportDir|Content/ca/movies/flare.vqa: flare.vqa + ^SupportDir|Content/ca/movies/landing.vqa: landing.vqa + ^SupportDir|Content/ca/movies/mcvbrdge.vqa: mcvbrdge.vqa + ^SupportDir|Content/ca/movies/mig.vqa: mig.vqa + ^SupportDir|Content/ca/movies/movingin.vqa: movingin.vqa + ^SupportDir|Content/ca/movies/mtnkfact.vqa: mtnkfact.vqa + ^SupportDir|Content/ca/movies/nukestok.vqa: nukestok.vqa + ^SupportDir|Content/ca/movies/onthprwl.vqa: onthprwl.vqa + ^SupportDir|Content/ca/movies/periscop.vqa: periscop.vqa + ^SupportDir|Content/ca/movies/prolog.vqa: prolog.vqa + ^SupportDir|Content/ca/movies/radrraid.vqa: radrraid.vqa + ^SupportDir|Content/ca/movies/redintro.vqa: redintro.vqa + ^SupportDir|Content/ca/movies/search.vqa: search.vqa + ^SupportDir|Content/ca/movies/sfrozen.vqa: sfrozen.vqa + ^SupportDir|Content/ca/movies/sitduck.vqa: sitduck.vqa + ^SupportDir|Content/ca/movies/slntsrvc.vqa: slntsrvc.vqa + ^SupportDir|Content/ca/movies/snowbomb.vqa: snowbomb.vqa + ^SupportDir|Content/ca/movies/snstrafe.vqa: snstrafe.vqa + ^SupportDir|Content/ca/movies/sovbatl.vqa: sovbatl.vqa + ^SupportDir|Content/ca/movies/sovcemet.vqa: sovcemet.vqa + ^SupportDir|Content/ca/movies/sovfinal.vqa: sovfinal.vqa + ^SupportDir|Content/ca/movies/soviet1.vqa: soviet1.vqa + ^SupportDir|Content/ca/movies/soviet2.vqa: soviet2.vqa + ^SupportDir|Content/ca/movies/soviet3.vqa: soviet3.vqa + ^SupportDir|Content/ca/movies/soviet4.vqa: soviet4.vqa + ^SupportDir|Content/ca/movies/soviet5.vqa: soviet5.vqa + ^SupportDir|Content/ca/movies/soviet6.vqa: soviet6.vqa + ^SupportDir|Content/ca/movies/soviet7.vqa: soviet7.vqa + ^SupportDir|Content/ca/movies/soviet8.vqa: soviet8.vqa + ^SupportDir|Content/ca/movies/soviet9.vqa: soviet9.vqa + ^SupportDir|Content/ca/movies/soviet10.vqa: soviet10.vqa + ^SupportDir|Content/ca/movies/soviet11.vqa: soviet11.vqa + ^SupportDir|Content/ca/movies/soviet12.vqa: soviet12.vqa + ^SupportDir|Content/ca/movies/soviet13.vqa: soviet13.vqa + ^SupportDir|Content/ca/movies/soviet14.vqa: soviet14.vqa + ^SupportDir|Content/ca/movies/sovmcv.vqa: sovmcv.vqa + ^SupportDir|Content/ca/movies/sovtstar.vqa: sovtstar.vqa + ^SupportDir|Content/ca/movies/spotter.vqa: spotter.vqa + ^SupportDir|Content/ca/movies/strafe.vqa: strafe.vqa + ^SupportDir|Content/ca/movies/take_off.vqa: take_off.vqa + ^SupportDir|Content/ca/movies/tesla.vqa: tesla.vqa + ^SupportDir|Content/ca/movies/v2rocket.vqa: v2rocket.vqa + ^SupportDir|Content/ca/movies/aagun.vqa: aagun.vqa + ^SupportDir|Content/ca/movies/airfield.vqa: airfield.vqa + ^SupportDir|Content/ca/movies/ally1.vqa: ally1.vqa + ^SupportDir|Content/ca/movies/allymorf.vqa: allymorf.vqa + ^SupportDir|Content/ca/movies/averted.vqa: averted.vqa + ^SupportDir|Content/ca/movies/beachead.vqa: beachead.vqa + ^SupportDir|Content/ca/movies/bmap.vqa: bmap.vqa + ^SupportDir|Content/ca/movies/bombrun.vqa: bombrun.vqa + ^SupportDir|Content/ca/movies/countdwn.vqa: countdwn.vqa + ^SupportDir|Content/ca/movies/cronfail.vqa: cronfail.vqa + Delete: ^SupportDir|Content/ca/movies2.mix + +cnc-steam: C&C Ultimate Collection TD (Steam version, English) + Type: Steam + AppId: 2229830 + IDFiles: + CONQUER.MIX: 713b53fa4c188ca9619c6bbeadbfc86513704266 + Install: + # C&C Desert Tileset: + ContentPackage@cncdesert: + Name: cncdesert + Actions: + Copy: . + ^SupportDir|Content/ca/cnc/desert.mix: DESERT.MIX + # Base game music (optional): + ContentPackage@music-cnc: + Name: music-cnc + Actions: + Copy: . + ^SupportDir|Content/ca/cnc/scores.mix: SCORES.MIX + +cncr-steam: C&C Remastered Collection (Steam version, English) + Type: Steam + AppId: 1213210 + IDFiles: + Data/CNCDATA/RED_ALERT/CD1/REDALERT.MIX: 0e58f4b54f44f6cd29fecf8cf379d33cf2d4caef + # The Remastered Collection doesn't include the RA Soviet CD unfortunately, so we can't install Soviet campaign briefings. + Install: + # Base game files: + ContentPackage@base: + Name: base + Actions: + ExtractMix@1: Data/CNCDATA/RED_ALERT/CD1/REDALERT.MIX + ^SupportDir|Content/ca/hires.mix: hires.mix + ^SupportDir|Content/ca/local.mix: local.mix + ^SupportDir|Content/ca/lores.mix: lores.mix + ^SupportDir|Content/ca/speech.mix: speech.mix + ExtractMix@2: Data/CNCDATA/RED_ALERT/CD1/MAIN.MIX + ^SupportDir|Content/ca/conquer.mix: conquer.mix + ^SupportDir|Content/ca/general.mix: general.mix # Is this one used? The FirstDecade and TUC installers are missing this! + ^SupportDir|Content/ca/interior.mix: interior.mix + ^SupportDir|Content/ca/snow.mix: snow.mix + ^SupportDir|Content/ca/sounds.mix: sounds.mix + ^SupportDir|Content/ca/russian.mix: russian.mix + ^SupportDir|Content/ca/allies.mix: allies.mix + ^SupportDir|Content/ca/temperat.mix: temperat.mix + # Aftermath expansion files: + ContentPackage@aftermathbase: + Name: aftermathbase + Actions: + Copy: Data/CNCDATA/RED_ALERT/AFTERMATH + ^SupportDir|Content/ca/expand/expand2.mix: expand2.mix + ^SupportDir|Content/ca/expand/hires1.mix: hires1.mix + ^SupportDir|Content/ca/expand/lores1.mix: lores1.mix + ExtractMix@1: Data/CNCDATA/RED_ALERT/AFTERMATH/MAIN.MIX + ^SupportDir|Content/ca/expand/sounds.mix: sounds.mix + ExtractMix@2: ^SupportDir|Content/ca/expand/sounds.mix + ^SupportDir|Content/ca/expand/chrotnk1.aud: chrotnk1.aud + ^SupportDir|Content/ca/expand/fixit1.aud: fixit1.aud + ^SupportDir|Content/ca/expand/jburn1.aud: jburn1.aud + ^SupportDir|Content/ca/expand/jchrge1.aud: jchrge1.aud + ^SupportDir|Content/ca/expand/jcrisp1.aud: jcrisp1.aud + ^SupportDir|Content/ca/expand/jdance1.aud: jdance1.aud + ^SupportDir|Content/ca/expand/jjuice1.aud: jjuice1.aud + ^SupportDir|Content/ca/expand/jjump1.aud: jjump1.aud + ^SupportDir|Content/ca/expand/jlight1.aud: jlight1.aud + ^SupportDir|Content/ca/expand/jpower1.aud: jpower1.aud + ^SupportDir|Content/ca/expand/jshock1.aud: jshock1.aud + ^SupportDir|Content/ca/expand/jyes1.aud: jyes1.aud + ^SupportDir|Content/ca/expand/madchrg2.aud: madchrg2.aud + ^SupportDir|Content/ca/expand/madexplo.aud: madexplo.aud + ^SupportDir|Content/ca/expand/mboss1.aud: mboss1.aud + ^SupportDir|Content/ca/expand/mhear1.aud: mhear1.aud + ^SupportDir|Content/ca/expand/mhotdig1.aud: mhotdig1.aud + ^SupportDir|Content/ca/expand/mhowdy1.aud: mhowdy1.aud + ^SupportDir|Content/ca/expand/mhuh1.aud: mhuh1.aud + ^SupportDir|Content/ca/expand/mlaff1.aud: mlaff1.aud + ^SupportDir|Content/ca/expand/mrise1.aud: mrise1.aud + ^SupportDir|Content/ca/expand/mwrench1.aud: mwrench1.aud + ^SupportDir|Content/ca/expand/myeehaw1.aud: myeehaw1.aud + ^SupportDir|Content/ca/expand/myes1.aud: myes1.aud + Delete: ^SupportDir|Content/ca/expand/sounds.mix + # Allied campaign briefings (optional): + ContentPackage@movies-allied: + Name: movies-allied + Actions: + ExtractMix@1: Data/CNCDATA/RED_ALERT/CD1/MAIN.MIX + ^SupportDir|Content/ca/movies1.mix: movies1.mix + ExtractMix@2: ^SupportDir|Content/ca/movies1.mix + ^SupportDir|Content/ca/movies/aagun.vqa: aagun.vqa + ^SupportDir|Content/ca/movies/aftrmath.vqa: aftrmath.vqa + ^SupportDir|Content/ca/movies/ally1.vqa: ally1.vqa + ^SupportDir|Content/ca/movies/ally10.vqa: ally10.vqa + ^SupportDir|Content/ca/movies/ally10b.vqa: ally10b.vqa + ^SupportDir|Content/ca/movies/ally11.vqa: ally11.vqa + ^SupportDir|Content/ca/movies/ally12.vqa: ally12.vqa + ^SupportDir|Content/ca/movies/ally14.vqa: ally14.vqa + ^SupportDir|Content/ca/movies/ally2.vqa: ally2.vqa + ^SupportDir|Content/ca/movies/ally4.vqa: ally4.vqa + ^SupportDir|Content/ca/movies/ally5.vqa: ally5.vqa + ^SupportDir|Content/ca/movies/ally6.vqa: ally6.vqa + ^SupportDir|Content/ca/movies/ally8.vqa: ally8.vqa + ^SupportDir|Content/ca/movies/ally9.vqa: ally9.vqa + ^SupportDir|Content/ca/movies/allyend.vqa: allyend.vqa + ^SupportDir|Content/ca/movies/allymorf.vqa: allymorf.vqa + ^SupportDir|Content/ca/movies/apcescpe.vqa: apcescpe.vqa + ^SupportDir|Content/ca/movies/assess.vqa: assess.vqa + ^SupportDir|Content/ca/movies/battle.vqa: battle.vqa + ^SupportDir|Content/ca/movies/binoc.vqa: binoc.vqa + ^SupportDir|Content/ca/movies/bmap.vqa: bmap.vqa + ^SupportDir|Content/ca/movies/brdgtilt.vqa: brdgtilt.vqa + ^SupportDir|Content/ca/movies/crontest.vqa: crontest.vqa + ^SupportDir|Content/ca/movies/cronfail.vqa: cronfail.vqa + ^SupportDir|Content/ca/movies/destroyr.vqa: destroyr.vqa + ^SupportDir|Content/ca/movies/dud.vqa: dud.vqa + ^SupportDir|Content/ca/movies/elevator.vqa: elevator.vqa + ^SupportDir|Content/ca/movies/flare.vqa: flare.vqa + ^SupportDir|Content/ca/movies/frozen.vqa: frozen.vqa + ^SupportDir|Content/ca/movies/grvestne.vqa: grvestne.vqa + ^SupportDir|Content/ca/movies/landing.vqa: landing.vqa + ^SupportDir|Content/ca/movies/masasslt.vqa: masasslt.vqa + ^SupportDir|Content/ca/movies/mcv.vqa: mcv.vqa + ^SupportDir|Content/ca/movies/mcv_land.vqa: mcv_land.vqa + ^SupportDir|Content/ca/movies/montpass.vqa: montpass.vqa + ^SupportDir|Content/ca/movies/oildrum.vqa: oildrum.vqa + ^SupportDir|Content/ca/movies/overrun.vqa: overrun.vqa + ^SupportDir|Content/ca/movies/prolog.vqa: prolog.vqa + ^SupportDir|Content/ca/movies/redintro.vqa: redintro.vqa + ^SupportDir|Content/ca/movies/shipsink.vqa: shipsink.vqa + ^SupportDir|Content/ca/movies/shorbom1.vqa: shorbom1.vqa + ^SupportDir|Content/ca/movies/shorbom2.vqa: shorbom2.vqa + ^SupportDir|Content/ca/movies/shorbomb.vqa: shorbomb.vqa + ^SupportDir|Content/ca/movies/snowbomb.vqa: snowbomb.vqa + ^SupportDir|Content/ca/movies/soviet1.vqa: soviet1.vqa + ^SupportDir|Content/ca/movies/sovtstar.vqa: sovtstar.vqa + ^SupportDir|Content/ca/movies/spy.vqa: spy.vqa + ^SupportDir|Content/ca/movies/tanya1.vqa: tanya1.vqa + ^SupportDir|Content/ca/movies/tanya2.vqa: tanya2.vqa + ^SupportDir|Content/ca/movies/toofar.vqa: toofar.vqa + ^SupportDir|Content/ca/movies/trinity.vqa: trinity.vqa + Delete: ^SupportDir|Content/ca/movies1.mix + # Base game music (optional): + ContentPackage@music-ra: + Name: music-ra + Actions: + ExtractMix: Data/CNCDATA/RED_ALERT/CD1/MAIN.MIX + ^SupportDir|Content/ca/ra/scores.mix: scores.mix + # Counterstrike music (optional): + ContentPackage@music-counterstrike: + Name: music-counterstrike + Actions: + ExtractMix@1: Data/CNCDATA/RED_ALERT/COUNTERSTRIKE/MAIN.MIX + ^SupportDir|Content/ca/expand/scores.mix: scores.mix + ExtractMix@2: ^SupportDir|Content/ca/expand/scores.mix + ^SupportDir|Content/ca/expand/2nd_hand.aud: 2nd_hand.aud + ^SupportDir|Content/ca/expand/araziod.aud: araziod.aud + ^SupportDir|Content/ca/expand/backstab.aud: backstab.aud + ^SupportDir|Content/ca/expand/chaos2.aud: chaos2.aud + ^SupportDir|Content/ca/expand/shut_it.aud: shut_it.aud + ^SupportDir|Content/ca/expand/twinmix1.aud: twinmix1.aud + ^SupportDir|Content/ca/expand/under3.aud: under3.aud + ^SupportDir|Content/ca/expand/vr2.aud: vr2.aud + Delete: ^SupportDir|Content/ca/expand/scores.mix + # Aftermath music (optional): + ContentPackage@music-aftermath: + Name: music-aftermath + Actions: + ExtractMix@1: Data/CNCDATA/RED_ALERT/AFTERMATH/MAIN.MIX + ^SupportDir|Content/ca/expand/scores.mix: scores.mix + ExtractMix@2: ^SupportDir|Content/ca/expand/scores.mix + ^SupportDir|Content/ca/expand/await.aud: await.aud + ^SupportDir|Content/ca/expand/bog.aud: bog.aud + ^SupportDir|Content/ca/expand/float_v2.aud: float_v2.aud + ^SupportDir|Content/ca/expand/gloom_ra.aud: gloom.aud + ^SupportDir|Content/ca/expand/grndwire.aud: grndwire.aud + ^SupportDir|Content/ca/expand/rpt.aud: rpt.aud + ^SupportDir|Content/ca/expand/search.aud: search.aud + ^SupportDir|Content/ca/expand/traction.aud: traction.aud + ^SupportDir|Content/ca/expand/wastelnd.aud: wastelnd.aud + Delete: ^SupportDir|Content/ca/expand/scores.mix + # C&C Desert Tileset: + ContentPackage@cncdesert: + Name: cncdesert + Actions: + Copy: Data/CNCDATA/TIBERIAN_DAWN/CD1 + ^SupportDir|Content/ca/cnc/desert.mix: DESERT.MIX + # TD music (optional): + ContentPackage@music-cnc: + Name: music-cnc + Actions: + Copy: Data/CNCDATA/TIBERIAN_DAWN/CD3 + ^SupportDir|Content/ca/cnc/scores.mix: SCORES.MIX + +ts-steam: C&C Ultimate Collection TS (Steam version, English) + Type: Steam + AppId: 2229880 + IDFiles: + TIBSUN.MIX: fd298ff16983f226c58136a5345b7d9bf2b5f2e9 + Install: + # Base game music (optional): + ContentPackage@music-ts: + Name: music-ts + Actions: + Copy: . + ^SupportDir|Content/ca/ts/scores.mix: SCORES.MIX + # Firestorm expansion music (optional): + ContentPackage@music-fs: + Name: music-fs + Actions: + Copy: . + ^SupportDir|Content/ca/firestorm/scores01.mix: SCORES01.mix + ExtractMix: ^SupportDir|Content/ca/firestorm/SCORES01.mix + ^SupportDir|Content/ca/firestorm/dmachine.aud: dmachine.aud + ^SupportDir|Content/ca/firestorm/elusive.aud: elusive.aud + ^SupportDir|Content/ca/firestorm/hacker.aud: hacker.aud + ^SupportDir|Content/ca/firestorm/infiltra.aud: infiltra.aud + ^SupportDir|Content/ca/firestorm/kmachine.aud: kmachine.aud + ^SupportDir|Content/ca/firestorm/linkup.aud: linkup.aud + ^SupportDir|Content/ca/firestorm/rainnite.aud: rainnite.aud + ^SupportDir|Content/ca/firestorm/slavesys.aud: slavesys.aud + Delete: ^SupportDir|Content/ca/firestorm/SCORES01.mix + +ra2-steam: C&C Ultimate Collection RA2 (Steam version, English) + Type: Steam + AppId: 2229850 + IDFiles: + THEME.MIX: 184f99e3292ab19c71c08a1ad7097ce739396190 + Install: + # Base game music (optional): + ContentPackage@music-ra2: + Name: music-ra2 + Actions: + Copy: . + ^SupportDir|Content/ca/ra2/theme.mix: THEME.MIX + # YR music (optional): + ContentPackage@music-yr: + Name: music-yr + Actions: + Copy: . + ^SupportDir|Content/ca/ra2/thememd.mix: thememd.MIX diff --git a/mods/ca-content/installer/tibsun.yaml b/mods/ca-content/installer/tibsun.yaml new file mode 100644 index 0000000000..2bc8216a3f --- /dev/null +++ b/mods/ca-content/installer/tibsun.yaml @@ -0,0 +1,12 @@ +tibsun: Tiberian Sun (GDI or Nod Disc, English) + Type: Disc + IDFiles: + README.TXT: 45745c4a0c888317ec900208a426472779c42bf7 + AUTOPLAY.WAV: 2dfce5d00f98b641849c29942b651f4e98d30e30 + Install: + # Base game music (optional): + ContentPackage@music-ts: + Name: music-ts + Actions: + Copy: . + ^SupportDir|Content/ca/ts/scores.mix: SCORES.MIX diff --git a/mods/ca-content/mod.yaml b/mods/ca-content/mod.yaml new file mode 100644 index 0000000000..aa2e15511c --- /dev/null +++ b/mods/ca-content/mod.yaml @@ -0,0 +1,163 @@ +Metadata: + Title: mod-title + Version: prep-CA + Hidden: true + +FileSystem: DefaultFileSystem + Packages: + ^EngineDir + ^EngineDir|mods/common-content: content + ^EngineDir|mods/common: common + $ca-content: cacontent + +Rules: + content|rules.yaml + +Cursors: + content|cursors.yaml + +Chrome: + content|chrome.yaml + +Assemblies: OpenRA.Mods.Common.dll, OpenRA.Mods.Cnc.dll, OpenRA.Mods.CA.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 + cacontent|fluent/chrome.ftl + +Fonts: + Tiny: + Font: common|FreeSans.ttf + Size: 10 + Ascender: 8 + TinyBold: + Font: common|FreeSansBold.ttf + Size: 10 + Ascender: 8 + Regular: + Font: common|FreeSans.ttf + Size: 14 + Ascender: 11 + Bold: + Font: common|FreeSansBold.ttf + Size: 14 + Ascender: 11 + MediumBold: + Font: common|FreeSansBold.ttf + Size: 18 + Ascender: 14 + BigBold: + Font: common|FreeSansBold.ttf + Size: 24 + Ascender: 18 + +ModContent: + Mod: ca + QuickDownload: quickinstall + Packages: + ContentPackage@base: + Title: modcontent-package-basefiles + Identifier: base + TestFiles: ^SupportDir|Content/ca/allies.mix, ^SupportDir|Content/ca/conquer.mix, ^SupportDir|Content/ca/interior.mix, ^SupportDir|Content/ca/hires.mix, ^SupportDir|Content/ca/lores.mix, ^SupportDir|Content/ca/local.mix, ^SupportDir|Content/ca/speech.mix, ^SupportDir|Content/ca/russian.mix, ^SupportDir|Content/ca/snow.mix, ^SupportDir|Content/ca/sounds.mix, ^SupportDir|Content/ca/temperat.mix + Sources: allied, soviet, tfd, ra-steam, cncr-steam, ra-origin, cncr-origin + Required: true + Download: basefiles + ContentPackage@aftermathbase: + Title: modcontent-package-aftermathfiles + Identifier: aftermathbase + TestFiles: ^SupportDir|Content/ca/expand/expand2.mix + Sources: aftermath, tfd, ra-steam, cncr-steam, ra-origin, cncr-origin + Required: true + Download: aftermath + ContentPackage@cncdesert: + Title: modcontent-package-deserttileset + Identifier: cncdesert + TestFiles: ^SupportDir|Content/ca/cnc/desert.mix + Sources: cnc95, tfd, cnc-steam, cncr-steam, cnc-origin, cncr-origin + Required: true + Download: cncdesert + ContentPackage@music-cnc: + Title: modcontent-package-music-cnc + Identifier: music-cnc + TestFiles: ^SupportDir|Content/ca/cnc/scores.mix + Download: music-cnc + Sources: covertops, cnc95, tfd, cnc-steam, cncr-steam, cnc-origin, cncr-origin + ContentPackage@music-ra: + Title: modcontent-package-music-ra + Identifier: music-ra + TestFiles: ^SupportDir|Content/ca/ra/scores.mix + Download: music-ra + Sources: allied, soviet, tfd, ra-steam, cncr-steam, ra-origin, cncr-origin + ContentPackage@music-counterstrike: + Title: modcontent-package-music-counterstrike + Identifier: music-counterstrike + TestFiles: ^SupportDir|Content/ca/expand/2nd_hand.aud, ^SupportDir|Content/ca/expand/araziod.aud, ^SupportDir|Content/ca/expand/backstab.aud, ^SupportDir|Content/ca/expand/chaos2.aud, ^SupportDir|Content/ca/expand/shut_it.aud, ^SupportDir|Content/ca/expand/twinmix1.aud, ^SupportDir|Content/ca/expand/under3.aud, ^SupportDir|Content/ca/expand/vr2.aud, + Sources: counterstrike, ra-steam, cncr-steam, ra-origin, cncr-origin + ContentPackage@music-aftermath: + Title: modcontent-package-music-aftermath + Identifier: music-aftermath + TestFiles: ^SupportDir|Content/ca/expand/await.aud, ^SupportDir|Content/ca/expand/bog.aud, ^SupportDir|Content/ca/expand/float_v2.aud, ^SupportDir|Content/ca/expand/gloom_ra.aud, ^SupportDir|Content/ca/expand/grndwire.aud, ^SupportDir|Content/ca/expand/rpt.aud, ^SupportDir|Content/ca/expand/search.aud, ^SupportDir|Content/ca/expand/traction.aud, ^SupportDir|Content/ca/expand/wastelnd.aud + Sources: aftermath, ra-steam, cncr-steam, ra-origin, cncr-origin + ContentPackage@music-ts: + Title: modcontent-package-music-ts + Identifier: music-ts + TestFiles: ^SupportDir|Content/ca/ts/scores.mix + Download: music-ts + Sources: tibsun, ts-steam, ts-origin + ContentPackage@music-fs: + Title: modcontent-package-music-fs + Identifier: music-fs + TestFiles: ^SupportDir|Content/ca/firestorm/dmachine.aud, ^SupportDir|Content/ca/firestorm/elusive.aud, ^SupportDir|Content/ca/firestorm/hacker.aud, ^SupportDir|Content/ca/firestorm/infiltra.aud, ^SupportDir|Content/ca/firestorm/kmachine.aud, ^SupportDir|Content/ca/firestorm/linkup.aud, ^SupportDir|Content/ca/firestorm/rainnite.aud, ^SupportDir|Content/ca/firestorm/slavesys.aud + Download: music-fs + Sources: firestorm, ts-steam, ts-origin + ContentPackage@music-ra2: + Title: modcontent-package-music-ra2 + Identifier: music-ra2 + TestFiles: ^SupportDir|Content/ca/ra2/theme.mix + Sources: ra2, ra2-steam, ra2-origin + ContentPackage@music-yr: + Title: modcontent-package-music-yr + Identifier: music-yr + TestFiles: ^SupportDir|Content/ca/ra2/thememd.mix + Sources: ra2yr, ra2-steam, ra2-origin + Downloads: + cacontent|installer/downloads.yaml + Sources: + cacontent|installer/aftermath.yaml + cacontent|installer/allies95.yaml + cacontent|installer/cnc95.yaml + cacontent|installer/counterstrike.yaml + cacontent|installer/covertops.yaml + cacontent|installer/firestorm.yaml + cacontent|installer/firstdecade.yaml + cacontent|installer/origin.yaml + cacontent|installer/ra2.yaml + cacontent|installer/ra2yr.yaml + cacontent|installer/soviet95.yaml + cacontent|installer/steam.yaml + cacontent|installer/tibsun.yaml + +SoundFormats: + +SpriteFormats: PngSheet + +TerrainFormat: DefaultTerrain + +SpriteSequenceFormat: DefaultSpriteSequence diff --git a/mods/ca/CREDITS b/mods/ca/CREDITS new file mode 100644 index 0000000000..81c8945d85 --- /dev/null +++ b/mods/ca/CREDITS @@ -0,0 +1,24 @@ +The Combined Arms mod has grown from a +small, personal modding project into +a content-rich homage to the +Command & Conquer series. + +Combined Arms developers: + * Inq (Project Lead) + * Darkademic + +Contributors & special thanks to: + * GraionDilach (C#) + * MustaphaTR (C#) + * Boolbada (C#) + * Gerseras (C#) + * Nooze (tileset art) + * Messiah (tileset art) + * Tschokky (tileset art) + * Katzsmile (UAV sprite) + * AchromicWhite (mortar sprite) + * Nyerguds (cameos) + * Allen262 (RA1 Beta ship sprites) + * Kilkakon (fuel truck sprite) + * DonutArnold (radar scan sprite) + * Ppap11404 (fuel explosion sprite) diff --git a/mods/ca/ZoodRangmah.ttf b/mods/ca/ZoodRangmah.ttf deleted file mode 100644 index 8b28063957..0000000000 Binary files a/mods/ca/ZoodRangmah.ttf and /dev/null differ diff --git a/mods/ca/audio/music.yaml b/mods/ca/audio/music.yaml index c1626eaeb2..5a94003fc3 100644 --- a/mods/ca/audio/music.yaml +++ b/mods/ca/audio/music.yaml @@ -1,4 +1,4 @@ -#Red Alert +# Red Alert await_r: Afterlife (Await) VolumeModifier: 0.7 bigf226m: Bigfoot @@ -50,7 +50,7 @@ work226m: Workmen VolumeModifier: 0.7 # Counterstrike tracks -araziod: Arazoid +arazoid: Arazoid VolumeModifier: 0.8 backstab: Backstab VolumeModifier: 0.9 @@ -67,17 +67,36 @@ vr2: Voice Rhythm 2 VolumeModifier: 0.95 # Aftermath tracks -await: Afterlife (Await) bog: Bog VolumeModifier: 0.9 float_v2: Floating -gloom: Gloom +gloom_ra: Gloom grndwire: Groundwire rpt: Running Through Pipes search: The Search traction: Traction wastelnd: Wasteland +# Retaliation tracks +hell226m_retal: Hell March (Remix) + Extension: ogg + VolumeModifier: 0.7 +radio2_retal: Radio 2 (Remix) + Extension: ogg + VolumeModifier: 0.7 +crus226m_retal: Crush (Remix) + Extension: ogg + VolumeModifier: 0.7 +mud_remix: Mud (Remix) + Extension: ogg + VolumeModifier: 0.7 +work226m_retal: Workmen (Remix) + Extension: ogg + VolumeModifier: 0.7 +fac1226m_retal: Face to the Enemy 1 (Remix) + Extension: ogg + VolumeModifier: 0.85 + # C&C aoi: Act On Instinct VolumeModifier: 0.65 @@ -191,12 +210,12 @@ recn226m: Recon voic226m: Voice Rhythm VolumeModifier: 0.8 -#Tiberian Sun +# Tiberian Sun approach: Approach defense: The Defense duskhour: Dusk Hour flurry: Flurry -gloom: Gloom +gloom: Gloom (TS) heroism: Heroism infrared: Infrared ionstorm: Ion Storm @@ -218,7 +237,7 @@ score: Win (TS) Filename: score Extension: aud -#Firestorm +# Firestorm dmachine: Deploy Machines elusive: Elusive hacker: Hacker @@ -231,66 +250,123 @@ fsmenu: Main (FS) Hidden: true fsmap: Map (FS) Hidden: true -#Bonus tracks + +# Bonus tracks stomp: Stomp initiate: Initiate -#RA2 +# RA2 grinder: Grinder Extension: wav + VolumeModifier: 0.6 power: Power Extension: wav + VolumeModifier: 0.6 fortific: Fortification Extension: wav + VolumeModifier: 0.6 indeep: In Deep Extension: wav + VolumeModifier: 0.6 tension: Tension Extension: wav + VolumeModifier: 0.6 eaglehun: Eagle Hunter Extension: wav + VolumeModifier: 0.6 industro: Industro Funk Extension: wav + VolumeModifier: 0.6 jank: Jank Extension: wav + VolumeModifier: 0.6 200meter: 200 Meters Extension: wav + VolumeModifier: 0.6 blowitup: Blow It Up Extension: wav + VolumeModifier: 0.6 destroy: Destroy Extension: wav + VolumeModifier: 0.6 burn: Burn Extension: wav + VolumeModifier: 0.6 motorize: Motorized Extension: wav + VolumeModifier: 0.6 hm2: HM 2 Extension: wav + VolumeModifier: 0.6 ra2opt: Optical Filename: ra2-opt Extension: wav Hidden: true + VolumeModifier: 0.6 mforce2: Militant Force 2 Filename: ra2-sco Extension: wav Hidden: true -#YR themes + VolumeModifier: 0.6 + +# YR themes brainfre: Brain Freeze Extension: wav + VolumeModifier: 0.6 bully: Bully Kit Extension: wav + VolumeModifier: 0.6 deceiver: Deceiver Extension: wav + VolumeModifier: 0.6 defend: Defend the Base Extension: wav + VolumeModifier: 0.6 drok: Drok Extension: wav + VolumeModifier: 0.6 phatatta: Phat Attack Extension: wav + VolumeModifier: 0.6 tactics: Tactics Extension: wav + VolumeModifier: 0.6 trancelv: Trance L. Vania Extension: wav + VolumeModifier: 0.6 optionx: Credits YR Extension: wav + VolumeModifier: 0.6 scorex: Score YR Extension: wav - Hidden: true \ No newline at end of file + Hidden: true + VolumeModifier: 0.6 + +# Darkademic themes +moi: March on Instinct + Extension: ogg + VolumeModifier: 0.7 +drill: Drill (CA Remix) + Extension: ogg + VolumeModifier: 0.7 +creep: Creeping Upon (CA Remix) + Extension: ogg + VolumeModifier: 0.7 +radio2ca: Radio 2 (CA Remix) + Extension: ogg + VolumeModifier: 0.7 +subvn: Subversion + Extension: ogg + VolumeModifier: 0.7 +recon: Recon (CA Remix) + Extension: ogg + VolumeModifier: 0.7 +moi2: March on Instinct 2 + Extension: ogg + VolumeModifier: 0.9 +gateway: Gateway + Extension: ogg + VolumeModifier: 0.7 +malev: Malevolence + Extension: ogg + VolumeModifier: 0.7 diff --git a/mods/ca/audio/notifications.yaml b/mods/ca/audio/notifications.yaml index 9507601905..261599b474 100644 --- a/mods/ca/audio/notifications.yaml +++ b/mods/ca/audio/notifications.yaml @@ -5,17 +5,21 @@ Speech: england: r_ france: r_ germany: r_ - soviet: r_ - russia: r_ - ukraine: r_ + usa: r_ + soviet: r2_ + russia: r2_ + ukraine: r2_ + iraq: r2_ + yuri: r2_ gdi: c_ - talon: c_ + talon: c2_ zocom: c_ eagle: c_ + arc: c_ nod: n_ - blackh: n_ + blackh: n2_ marked: n_ - legion: n2_ + legion: n_ shadow: n_ scrin: s_ reaper: s_ @@ -59,6 +63,7 @@ Speech: EnemyUnitsApproaching: enmyapp1 EnemyPlanesApproaching: enmyapp1 EnemyDetected: enmydet + EnemyUnitStolen: enmyunitsto1 ExplosiveChargePlaced: xploplc1 FirstObjectiveMet: 1objmet1 FourtyMinutesRemaining: 40minr @@ -91,7 +96,11 @@ Speech: ObjectiveReached: objrch1 OnHold: onhold1 OperationControlTerminated: opterm1 + OurBuildingCaptured: bldcap1 + OurTechnologyLocked: ourttechlckd1 + OurTechnologyStolen: ourtechsto1 PrimaryBuildingSelected: pribldg1 + Promoted: promtd1 ReinforcementsArrived: reinfor1 Reinforce: reinforava Repairing: repair1 @@ -111,6 +120,7 @@ Speech: SovietForcesFallen: sovforc1 SovietReinforcementsArrived: sovrein1 SpyPlaneReady: spypln1 + ReconDroneReady: rdronerdy1 StartGame: bctrinit StructureDestroyed: strckil1 StructureSold: strusld1 @@ -119,6 +129,8 @@ Speech: TanyaRescued: tanyar1 TargetFreed: targfre1 TargetRescued: targres1 + TechnologyAcquired: techacq1 + TechnologyLocked: techlckd1 TenMinutesRemaining: 10minr ThirdObjectiveMet: 3objmet1 ThirtyMinutesRemaining: 30minr @@ -143,27 +155,98 @@ Speech: WarningFourMinutesRemaining: 4minr WarningFiveMinutesRemaining: 5minr Win: misnwon1 - IonCannonCharging: ionchrg1 - IonCannonReady: ionredy1 - IonCannonApproach: ioncanapp + + AirstrikeReady: astriker1 + MissileLaunchDetected: missld1 + ForceShieldCharging: forcechg1 + ForceShieldReady: forcedr1 + + InfluenceLevel1: influencelevel1 + InfluenceLevel2: influencelevel2 + VeilOfWarReady: vowrdy1 + ClusterMinesReady: cminesrdy1 + TemporalIncursionReady: tempincrdy1 + StrafingRunReady: strafrdy1 + TimeWarpReady: twrprdy1 + CoalitionSelected: coalitionsel1 + CoalitionActive: coalitionrdy1 + CryostormReady: cryostormrdy1 + CryostormWarning: cryostormapp1 + HeliosBombReady: heliosrdy1 + BlackSkyStrikeReady: bskyrdy1 + BlackSkyStrikeWarning: bskywarn1 StormReady: stormrdy1 StormApproach: stormapp1 + + ParabombsReady: parabrdy1 + ParatroopersReady: paratrdy1 + StormtroopersReady: stmtrprdy1 + AtomicBombReady: atmbombrdy1 + AtomicShellsReady: atmshelrdy1 + CarpetBombReady: carpetrdy1 + ChaosBombsReady: chaosbombsrdy1 + GeneticMutationBombReady: gmutrdy1 + DoctrineSelected: doctrinesel1 + HeroesOfTheUnionReady: heroesrdy1 + TankDropReady: tankdroprdy1 + KillZoneReady: killzonerdy1 + + DropPodsAvailable: dpodrdy1 + NaniteShieldReady: nanrdy1 + NaniteShieldCharging: nanchg1 + InterceptorsReady: intrdy1 + NaniteRepairReady: nreprdy1 + XODropAvailable: xoavail1 + SuppliesInbound: suppinb + FireStormReady: fsready + FireStormOffline: fsoffline + Bombardment: bombardment + HoldTheLine: holdtheline + SeekAndDestroy: seekanddestroy + SurgicalStrikeReady: surgicalrdy1 EMMissileReady: emmisrdy1 - CMissileReady: cmissrdy1 - ClusMissileReady: clusrdy EMMissilePrepping: emmprep1 - MissileLaunchDetected: missld1 - ForceShieldCharging: forcechg1 - ForceShieldReady: forcedr1 + IonCannonCharging: ionchrg1 + IonCannonReady: ionredy1 + IonCannonApproach: ioncanapp + + CovenantsAvailable: covavail1 + SatelliteHackReady: sathackrdy1 + InfernoBombReady: infernordy1 + CashHackReady: cashhkrdy1 + TechHackReady: techhkrdy1 + AssassinSquadReady: assardy1 + HackerCellReady: hackrdy1 + ConfessorCabalReady: confcabrdy1 + ShadowTeamReady: shadtmrdy1 + FrenzyReady: frenzyrdy1 + ClusMissileReady: clusrdy + ClusMissileWarning: cluswarn1 ChemStealthCharging: chemstch1 ChemStealthReady: chemstrdy1 - AirstrikeReady: astriker1 - DropPodsAvailable: dpodrdy1 + ChemMissileReady: cmissrdy1 + ChemMissileWarning: cmisswarn1 + + IchorSpikeReady: ichspkrdy1 + ColonySpikeReady: cspkrdy1 + VoidSpikeReady: voidspkrdy1 + IchorSeedReady: ichsdrdy + ResourceScanReady: rscanrdy + StormSpikeReady: strmspkrdy + IonSurgeReady: ionsrgrdy + BuzzerSwarmReady: buzzrdy + GreaterCoalescenceReady: grcoalrdy + AllegianceDeclarationAvailable: aldecavail1 + OverlordsWrathReady: owrathrdy1 + OverlordsWrathWarning: owrathwarn1 + GatewayReady: gwayrdy1 + AnathemaReady: anathrdy1 + FleetRecallReady: fleetrecallrdy1 + SuppressionCharging: sprschg + SuppressionReady: sprsrdy RiftReady: riftrdy - RiftApproach: riftapp1 - FireStormReady: fsready - FireStormOffline: fsoffline - SuppliesInbound: suppinb + RiftWarning: riftwarn1 + SubjugationReady: subjrdy1 Sounds: Notifications: @@ -171,16 +254,31 @@ Sounds: RadarDown: radardn1 CashTickUp: tone15 VolumeModifier: 0.33 + InterruptType: Overlap CashTickDown: tone16 VolumeModifier: 0.33 + InterruptType: Overlap LevelUp: lvlup1 VolumeModifier: 0.33 DisablePower: powrdn1 EnablePower: gpowerup ChatLine: boop - ClickSound: clicky1 + InterruptType: Interrupt + ClickSound: click + InterruptType: Interrupt ClickDisabledSound: - Beacon: beepslct + Beacon: beacon + InterruptType: Interrupt AlertBuzzer: buzzy1 AlertBleep: bleep6 BaseSetup: bleep9 + PlayerRankUp: bleep6 + + UPG-railgun: vtitupg1 + UPG-ionmam: vmamupg1 + UPG-mdrone: vmamdupg1 + UPG-bdrone: vbdrnupg1 + UPG-hovermam: vmamupg2 + UPG-microwave: vmwtupg1 + UPG-seismic: vsukupg1 + UPG-tibcore: vtibcupg1 diff --git a/mods/ca/audio/voices.yaml b/mods/ca/audio/voices.yaml index ce308b91c7..2d4c08545b 100644 --- a/mods/ca/audio/voices.yaml +++ b/mods/ca/audio/voices.yaml @@ -4,10 +4,12 @@ GenericVoice: england: .v01,.v03 france: .v01,.v03 germany: .v01,.v03 + usa: .v01,.v03 soviet: .r01,.r03 russia: .r01,.r03 ukraine: .r01,.r03 iraq: .r01,.r03 + yuri: .r01,.r03 nod: .c01,.c03 blackh: .c01,.c03 marked: .c01,.c03 @@ -17,6 +19,7 @@ GenericVoice: talon: .c01,.c03 zocom: .c01,.c03 eagle: .c01,.c03 + arc: .c01,.c03 scrin: .s01,.s03 reaper: .s01,.s03 traveler: .s01,.s03 @@ -37,10 +40,12 @@ VehicleVoice: england: .v00,.v02 france: .v00,.v02 germany: .v00,.v02 + usa: .v00,.v02 soviet: .r00,.r02 russia: .r00,.r02 ukraine: .r00,.r02 iraq: .r00,.r02 + yuri: .r00,.r02 nod: .c00,.c02 blackh: .c00,.c02 marked: .c00,.c02 @@ -50,6 +55,75 @@ VehicleVoice: zocom: .c00,.c02 talon: .c00,.c02 eagle: .c00,.c02 + arc: .c00,.c02 + scrin: .s00,.s02 + reaper: .s00,.s02 + traveler: .s00,.s02 + harbinger: .s00,.s02 + collector: .s00,.s02 + Voices: + Select: vehic1,yessir1,report1,await1,unit1 + Action: ackno,affirm1,movout1 + Unload: movout1 + +ScrinInfantryVoice: + Variants: + allies: .s01,.s03 + england: .s01,.s03 + france: .s01,.s03 + germany: .s01,.s03 + usa: .s01,.s03 + soviet: .s01,.s03 + russia: .s01,.s03 + ukraine: .s01,.s03 + iraq: .s01,.s03 + yuri: .s01,.s03 + nod: .s01,.s03 + blackh: .s01,.s03 + marked: .s01,.s03 + legion: .s01,.s03 + shadow: .s01,.s03 + gdi: .s01,.s03 + talon: .s01,.s03 + zocom: .s01,.s03 + eagle: .s01,.s03 + arc: .s01,.s03 + scrin: .s01,.s03 + reaper: .s01,.s03 + traveler: .s01,.s03 + harbinger: .s01,.s03 + collector: .s01,.s03 + Voices: + Select: await1,ready,report1,yessir1 + Action: ackno,affirm1,noprob,overout,ritaway,roger,ugotit + Die: scrin-die1, scrin-die2, scrin-die3, scrin-die4, scrin-die5 + Burned: scrin-firedeath + Zapped: scrin-die2, scrin-die5 + Poisoned: scrin-die2, scrin-die5 + DisableVariants: Die, Burned, Zapped, Poisoned + +ScrinVehicleVoice: + Variants: + allies: .s00,.s02 + england: .s00,.s02 + france: .s00,.s02 + germany: .s00,.s02 + usa: .s00,.s02 + soviet: .s00,.s02 + russia: .s00,.s02 + ukraine: .s00,.s02 + iraq: .s00,.s02 + yuri: .s00,.s02 + nod: .s00,.s02 + blackh: .s00,.s02 + marked: .s00,.s02 + legion: .s00,.s02 + shadow: .s00,.s02 + gdi: .s00,.s02 + talon: .s00,.s02 + zocom: .s00,.s02 + eagle: .s00,.s02 + arc: .s00,.s02 scrin: .s00,.s02 reaper: .s00,.s02 traveler: .s00,.s02 @@ -68,6 +142,12 @@ VehicleVoice: Poisoned: vtoxb,vtoxc,vtoxd,vtoxe,vtoxf,vtoxh EngineerVoice: + Variants: + soviet: _sov.aud + russia: _sov.aud + ukraine: _sov.aud + iraq: _sov.aud + yuri: _sov.aud Inherits: ^InfantryDeaths Voices: Select: eengin1,eyessir1 @@ -97,7 +177,7 @@ TanyaVoice: Zapped: tandeth1 Build: laugh1 Kill: gotit1,lefty1 - Demolish: keepem1,tuffguy1 + Demolish: keepem1,bombit1 Poisoned: tandeth1 DogVoice: @@ -121,9 +201,11 @@ SpyVoice: ThiefVoice: Inherits: ^InfantryDeaths Voices: - Select: swhat1,syeah1 - Action: saffirm1,smout1,sokay1 - Attack: candy,pickclean,fivefinger + Select: ithfslt1, ithfslt2, ithfslt3, ithfslt4 + Action: ithfmov1, ithfmov2, ithfmov3, ithfmov4 + Move: ithfmov1, ithfmov2, ithfmov3, ithfmov4 + Hijack: ithfatk1, ithfatk2, ithfatk3, ithfatk4 + Steal: ithfatk1, ithfatk3, ithfatk5, ithfatk6 CivilianMaleVoice: Inherits: ^InfantryDeaths @@ -187,7 +269,7 @@ CommandoVoice: Move: rcmon1,ronit1,rgotit1 Attack: ronit1,rgotit1,rnoprblm1 Action: ronit1,rgotit1,rnoprblm1 - Demolish: rnoprblm1 + Demolish: rbombit1 Die: ramyell1 Burned: ramyell1 Zapped: ramyell1 @@ -195,6 +277,18 @@ CommandoVoice: Build: rrokroll1 Kill: rkeepem1,rlaugh1,rlefty1,rtuffguy1 +AssassinVoice: + Voices: + Select: iassslt1,iassslt2,iassslt3,iassslt4,iassslt5,iassslt6 + Move: iassmov1,iassmov2,iassmov3,iassmov4,iassmov5,iassmov6 + Attack: iassatk1,iassatk2,iassatk3,iassatk4,iassatk5 + Action: iassatk2 + Demolish: iassatk2 + Die: icfadia, icfadib, icfadic + Burned: icfadia, icfadib, icfadic + Zapped: icfadia, icfadib, icfadic + Poisoned: icfadia, icfadib, icfadic + ViceVoice: Voices: Select: fiend2 @@ -225,6 +319,13 @@ ChronoVoice: Action: ichrseb,ichrsec,ichrsed,ichrsee Build: ichrseb +ChronoPrisonVoice: + Voices: + Select: vchpsl1,vchpsl2,vchpsl3,vchpsl4,vchpsl5 + Move: vchpmo1,vchpmo2,vchpmo3,vchpmo4,vchpmo5 + Attack: vchpat1,vchpat2,vchpat3,vchpat4,vchpat5 + Action: vchpmo1,vchpmo2,vchpmo3,vchpmo4,vchpmo5 + ReaperVoice: Voices: Select: 60-n100,60-n102,60-n104 @@ -264,7 +365,7 @@ TTruckVoice: Move: vdemmoa, vdemmob, vdemmoc Attack: vdemata, vdematb, vdematc, vdematd, vdemate Action: vdemmoa, vdemmob, vdemmoc - Build: vdemmoa + Build: vdemsea AcolVoice: Inherits: ^InfantryDeaths @@ -289,8 +390,22 @@ CarryAllVoice: Select: carasea,caraseb,carased Move: caramoa,caramob,caramoc,caramod,carasec Attack: caramoc,caramoa,caramob - Action: caramoc,caramoa,caramob - Build: caraseb + Action: caramoc,caramoa,caramob + +NighthawkVoice: + Voices: + Select: vblhsea,vblhseb,vblhsec,vblhsed + Move: vblhmoa,vblhmob,vblhmoc,vblhmod + Attack: vblhata,vblhatb,vblhatc,vblhatd + Action: vblhmoa,vblhmob,vblhmoc,vblhmod + +HaloVoice: + Voices: + Select: vhaloslt1,vhaloslt2,vhaloslt3,vhaloslt4,vhaloslt5 + Move: vhalomov1,vhalomov2,vhalomov3,vhalomov4,vhalomov5 + Attack: vhalomov1,vhalomov2,vhalomov3,vhalomov4,vhalomov5 + Action: vhalomov1,vhalomov2,vhalomov3,vhalomov4,vhalomov5 + Build: vhaloslt1 TnkdVoice: Voices: @@ -344,13 +459,16 @@ YuriVoice: Build: iyursec DesVoice: - Inherits: ^InfantryDeaths Voices: Select: idesseb,idessec,idessed,idessee Move: idesmoa,idesmob,idesmoc,idesmod,idesmoe Attack: idesata,idesatb,idesatc,idesatd,idesate,idesatf Action: idesmoa,idesmob,idesmoc,idesmod,idesmoe Build: idessea + Die: idesdia, idesdib, idesdic + Burned: idesdia, idesdib, idesdic + Zapped: idesdia, idesdib, idesdic + Poisoned: idesdia, idesdib, idesdic BorisVoice: Voices: @@ -376,10 +494,9 @@ V3Voice: MirageVoice: Voices: Select: vmirsea, vmirseb, vmirsec, vmirsed, vmirsee, vmirsef - Move: vmirmoa, vmirmob, vmirmoc, vmirmod, vmirmoe, vmirmof, vmirmog + Move: vmirmoa, vmirmob, vmirmoc, vmirmod, vmirmoe, vmirmof Attack: vmirata, vmiratb, vmiratc, vmiratd, vmirate - Action: vmirmoa, vmirmob, vmirmoc, vmirmod, vmirmoe, vmirmof, vmirmog - + Action: vmirmoa, vmirmob, vmirmoc, vmirmod, vmirmoe, vmirmof PrismVoice: Voices: @@ -388,6 +505,11 @@ PrismVoice: Attack: vpriata, vpriatb, vpriatc, vpriatd, vpriate Action: vprimoa, vprimob, vprimoc, vprimod, vprimoe +PrismCannonVoice: + Inherits: PrismVoice + Voices: + Select: vpcasea, vpriseb, vprisec, vprised, vprisee + OrcaVoice: Voices: Select: 30-i000, 30-i002, 30-i004, 30-i006 @@ -417,20 +539,40 @@ GhostVoice: Attack: 14-i008, 14-i010, 14-i014, 14-i016 Action: 14-i008, 14-i010, 14-i012, 14-i014 +JuggVoice: + Voices: + Select: vjugsl1, vjugsl2, vjugsl3, vjugsl4, vjugsl5 + Move: vjugmo1, vjugmo2, vjugmo3, vjugmo4, vjugmo5, vjugmo6 + Attack: vjugat1, vjugat2, vjugat3, vjugat4, vjugat5, vjugat6 + Action: vjugmo1, vjugmo2, vjugmo3, vjugmo4, vjugmo5, vjugmo6 + +MsamVoice: + Voices: + Select: vmsamslt1, vmsamslt2, vmsamslt3, vmsamslt4, vmsamslt5, vmsamslt6 + Move: vmsammov1, vmsammov2, vmsammov3, vmsammov4, vmsammov5 + Attack: vmsamatk1, vmsamatk2, vmsamatk3, vmsamatk4, vmsamatk5 + Action: vmsammov1, vmsammov2, vmsammov3, vmsammov4, vmsammov5 + DisrVoice: Voices: - Select: 25-i000, 25-i002, 25-i004, 25-i006 - Move: 25-i012, 25-i014, 25-i016, 25-i018, 25-i022 - Attack: 25-i014, 25-i022, 25-i024, 25-i026 - Action: 25-i012, 25-i014, 25-i016, 25-i018, 25-i022 - Unload: 25-i018 + Select: vdissl1, vdissl2, vdissl3, vdissl4, vdissl5 + Move: vdismo1, vdismo2, vdismo3, vdismo4 + Attack: vdisat1, vdisat2, vdisat3, vdisat4, vdisat5 + Action: vdismo1, vdismo2, vdismo3, vdismo4 + +TitnVoice: + Voices: + Select: vtitslt1, vtitslt2, vtitslt3, vtitslt4, vtitslt5, vtitslt6 + Move: vtitmov1, vtitmov2, vtitmov3, vtitmov4, vtitmov5 + Attack: vtitatk1, vtitatk2, vtitatk3, vtitatk4, vtitatk5, vtitatk6 + Action: vtitmov1, vtitmov2, vtitmov3, vtitmov4, vtitmov5 MWTnkVoice: Voices: - Select: 42-i000, 42-i002, 42-i004 - Move: 42-i006, 42-i008, 42-i010 - Attack: 42-i012, 42-i010, 42-i006 - Action: 42-i006, 42-i008, 42-i010 + Select: vmwtslt1, vmwtslt2, vmwtslt3, vmwtslt4, vmwtslt5 + Move: vmwtmov1, vmwtmov2, vmwtmov3, vmwtmov4, vmwtmov5, vmwtmov6 + Attack: vmwtatk1, vmwtatk2, vmwtatk3, vmwtatk4, vmwtatk5, vmwtatk6 + Action: vmwtmov1, vmwtmov2, vmwtmov3, vmwtmov4, vmwtmov5, vmwtmov6 JJVoice: Inherits: ^InfantryDeaths @@ -443,48 +585,112 @@ JJVoice: BattleFortressVoice: Voices: Build: vbatseb - Select: vbatsea, vbatseb, vbatsec, vbatsed, vbatsee, vbatsef - Move: vbatmoa, vbatmob, vbatmoc, vbatmod, vbatmoe - Attack: vbatatb, vbatatc, vbatatd, vbatate - Action: vbatmoa, vbatmob, vbatmoc, vbatmod, vbatmoe + Select: vbatsea, vbatseb, vbatsec, vbatsed + Move: vbatmoa, vbatmob, vbatmoc, vbatmod + Attack: vbatata, vbatatb, vbatatc, vbatatd, vbatate + Action: vbatmoa, vbatmob, vbatmoc, vbatmod + +CryoVoice: + Voices: + Select: vcryslt1, vcryslt2, vcryslt3, vcryslt4, vcryslt5, vcryslt6 + Move: vcrymov1, vcrymov2, vcrymov3, vcrymov4 + Attack: vcryatk1, vcryatk2, vcryatk3, vcryatk4, vcryatk5 + Action: vcrymov1, vcrymov2, vcrymov3, vcrymov4 RobotTankVoice: Voices: - Build: vrobsela - Select: vrobsela - Move: vrobmova, vrobmovb - Action: vrobmova, vrobmovb - Attack: vrobatca + Build: vrobsela, vrobselb + Select: vrobsela, vrobselb + Move: vrobmova, vrobmovb, vrobmovc + Action: vrobmova, vrobmovb, vrobmovc + Attack: vrobatca, vrobatcb + Die: vrobdiea + +MiniDroneVoice: + Voices: + Build: vsenmova, vsenmovb, vsenmovc + Select: vsensela, vsenselb, vsenselc, vsenseld + Move: vsenmova, vsenmovb, vsenmovc + Action: vsenmova, vsenmovb, vsenmovc + Attack: vsenmova, vsenmovb, vsenmovc Die: vrobdiea DroneVoice: - Variants: - allies: .v00,.v01,.v02 - england: .v00,.v01,.v02 - france: .v00,.v01,.v02 - germany: .v00,.v01,.v02 - soviet: .v00,.v01,.v02 - russia: .v00,.v01,.v02 - ukraine: .v00,.v01,.v02 - iraq: .v00,.v01,.v02 - nod: .v00,.v01,.v02 - blackh: .v00,.v01,.v02 - marked: .v00,.v01,.v02 - legion: .v00,.v01,.v02 - shadow: .v00,.v01,.v02 - gdi: .v00,.v01,.v02 - zocom: .v00,.v01,.v02 - talon: .v00,.v01,.v02 - eagle: .v00,.v01,.v02 - scrin: .v00,.v01,.v02 - reaper: .v00,.v01,.v02 - traveler: .v00,.v01,.v02 - harbinger: .v00,.v01,.v02 - collector: .v00,.v01,.v02 - Voices: - Select: SEL1,SEL2,SEL3 - Action: CONF1,CONF2,CONF3 - Unload: CONF1 + Voices: + Select: vdrnslt1, vdrnslt2, vdrnslt3, vdrnslt4, vdrnslt5, vdrnslt6 + SelectEMP: vdrnslt1, vdrnslt2, vdrnslt3, vdrnslt5, vdrnslt6 + Action: vdrnmov1, vdrnmov2, vdrnmov3, vdrnmov4, vdrnmov5 + Attack: vdrnatk1, vdrnatk2, vdrnatk3, vdrnatk4, vdrnatk5 + Move: vdrnmov1, vdrnmov2, vdrnmov3, vdrnmov4, vdrnmov5 + Unload: vdrnatk1 + +MamDroneVoice: + Voices: + Select: vmamdslt1, vmamdslt2, vmamdslt3, vmamdslt4, vmamdslt5, vmamdslt6 + Action: vmamdmov1, vmamdmov2, vmamdmov3, vmamdmov4, vmamdmov5, vmamdmov6 + Attack: vmamdatk1, vmamdatk2, vmamdatk3, vmamdatk4, vmamdatk5, vmamdatk6 + Move: vmamdmov1, vmamdmov2, vmamdmov3, vmamdmov4, vmamdmov5, vmamdmov6 + +MammothVoice: + Voices: + Select: vmamslt1, vmamslt2, vmamslt3, vmamslt4, vmamslt5 + Action: vmammov1, vmammov2, vmammov3, vmammov4, vmammov5 + Attack: vmamatk1, vmamatk2, vmamatk3, vmamatk4, vmamatk5, vmamatk6 + Move: vmammov1, vmammov2, vmammov3, vmammov4, vmammov5 + +MammothRUVoice: + Voices: + Select: vmamrslt1,vmamrslt2, vmamrslt3, vmamrslt4, vmamrslt5 + Action: vmamrmov1, vmamrmov2, vmamrmov3, vmamrmov4, vmamsmov5 + Attack: vmamratk1, vmamratk2, vmamratk3, vmamratk4, vmamratk5, vmamratk6 + Move: vmamrmov1, vmamrmov2, vmamrmov3, vmamrmov4, vmamrmov5 + +OverlordVoice: + Voices: + Select: vovldslt1, vovldslt2, vovldslt3, vovldslt4 + Action: vovldmov1, vovldmov2, vovldmov3, vovldmov4, vovldmov5 + Attack: vovldatk1, vovldatk2, vovldatk3, vovldatk4, vovldatk5, vovldatk6 + Move: vovldmov1, vovldmov2, vovldmov3, vovldmov4, vovldmov5 + +TrpcVoice: + Voices: + Select: vtrpcslt1, vtrpcslt2, vtrpcslt3, vtrpcslt4 + Move: vtrpcmov1, vtrpcmov2, vtrpcmov3, vtrpcmov4, vtrpcmov5 + Attack: vtrpcmov1, vtrpcmov2, vtrpcmov3, vtrpcmov4, vtrpcmov5 + Action: vtrpcmov1, vtrpcmov2, vtrpcmov3, vtrpcmov4, vtrpcmov5 + Unload: vtrpcunl1 + +NukcVoice: + Voices: + Select: vnukcslt1, vnukcslt2, vnukcslt3, vnukcslt4, vnukcslt5, vnukcslt6 + Move: vnukcmov1, vnukcmov2, vnukcmov3, vnukcmov4, vnukcmov5 + Attack: vnukcatk1, vnukcatk2, vnukcatk3, vnukcatk4, vnukcatk5 + Action: vnukcmov1, vnukcmov2, vnukcmov3, vnukcmov4, vnukcmov5 + Deploy: vnukcdep1, vnukcdep2, vnukcdep3 + Redeploy: vnukcund1, vnukcund2, vnukcund3 + +GradVoice: + Voices: + Select: vgradslt1, vgradslt2, vgradslt3, vgradslt4, vgradslt5, vgradslt6 + Move: vgradmov1, vgradmov2, vgradmov3, vgradmov4, vgradmov5 + Attack: vgradatk1, vgradatk2, vgradatk3, vgradatk4, vgradatk5 + Action: vgradmov1, vgradmov2, vgradmov3, vgradmov4, vgradmov5 + +BtrVoice: + Voices: + Select: vflasea, vflaseb, vflasec, vflased, vflasee + Move: vflamoa, vflamob, vflamoc, vflamod, vflamoe + Attack: vflaata, vflaatb, vflaatc, vflaatd, vflaate + Action: vflamoa, vflamob, vflamoc, vflamod, vflamoe + +OfflineDroneVoice: + Voices: + Select: vrobse2a, vrobse2b, vrobse2c + SelectEMP: vrobse2a, vrobse2b, vrobse2c + Action: vrobse2a, vrobse2b, vrobse2c + Attack: vrobse2a, vrobse2b, vrobse2c + Move: vrobse2a, vrobse2b, vrobse2c + Unload: vrobse2a, vrobse2b, vrobse2c ChaosDroneVoice: Voices: @@ -516,13 +722,31 @@ TeslaTankRA2Voice: Attack: vtesata, vtesatb, vtesatc, vtesatd, vtesate Action: vtesmoa, vtesmob, vtesmoc, vtesmod, vtesmoe -SiegeTankVoice: +TeslaTrooperVoice: + Voices: + Select: itessea, itessec, itessed, itessee + Move: itesmoa, itesmob, itesmoc, itesmod, itesmoe, itesmof + Attack: itesata, itesatb, itesatc, itesatd, itesate + Action: itesmoa, itesmob, itesmoc, itesmod, itesmoe, itesmof + Die: itesdia, itesdib, itesdic, itesdid + Burned: itesdia, itesdib, itesdic, itesdid + Zapped: itesdia, itesdib, itesdic, itesdid + Poisoned: itesdia, itesdib, itesdic, itesdid + +RhinoTankVoice: Voices: Select: vgrssea, vgrsseb, vgrssec Move: vgrsmoa, vgrsmob, vgrsmoc Attack: vgrsata, vgrsatb, vgrsatc, vgrsatd Action: vgrsmoa, vgrsmob, vgrsmoc +SiegeTankVoice: + Voices: + Select: visusl1, visusl2, visusl3, visusl4 + Move: visumo1, visumo2, visumo3, visumo4, visumo5 + Attack: visuat1, visuat2, visuat3, visuat4 + Action: visumo1, visumo2, visumo3, visumo4, visumo5 + ChronoMinerVoice: Voices: Select: vchrsea, vchrseb, vchrsec, vchrsed, vchrsee @@ -531,14 +755,6 @@ ChronoMinerVoice: Harvest: vchrhaa, vchrhab, vchrhac, vchrhad, vchrhae Deliver: vchrgoa, vchrgob, vchrgoc, vchrgod, vchrgoe -ScrinInfantryVoice: - Inherits: GenericVoice - Voices: - Die: scrin-die1, scrin-die2, scrin-die3, scrin-die4, scrin-die5 - Burned: scrin-firedeath - Zapped: scrin-die2, scrin-die5 - Poisoned: scrin-die2, scrin-die5 - MastermindVoice: Voices: Select: mastermind-select1, mastermind-select2, mastermind-select3 @@ -610,9 +826,9 @@ CrazyIvanVoice: Inherits: ^InfantryDeaths Voices: Select: icrasea, icraseb, icrasec, icrased, icrasee, icrasef, icraseg - Move: icramoa, icramob, icramoc, icramod, icramoe, icramof - Attack: icraata, icraatb, icraatc, icraatd, icraate - Action: icramoa, icramob, icramoc, icramod, icramoe, icramof + Move: icramoa, icramob, icramoc, icramod, icramof + Attack: icraata, icraatb, icraatc, icraatd + Action: icramoa, icramob, icramoc, icramod, icramof Die: icradia, icradib BruteVoice: @@ -626,6 +842,17 @@ BruteVoice: Zapped: ibrudib, ibrudic Poisoned: ibrudib, ibrudic +GiantScrinVoice: + Voices: + Select: gscr-select1, gscr-select2 + Move: gscr-action1, gscr-action2, gscr-action3 + Attack: gscr-action1, gscr-action2, gscr-action3 + Action: gscr-action1, gscr-action2, gscr-action3 + Die: gscr-die1, gscr-die2 + Burned: gscr-die1, gscr-die2 + Zapped: gscr-die1, gscr-die2 + Poisoned: gscr-die1, gscr-die2 + ApocalypseVoice: Voices: Build: vaposeb, vaposec, vaposed @@ -661,8 +888,8 @@ FlameTankVoice: Voices: Select: hftk-select1, hftk-select2, hftk-select3, hftk-select4 Move: hftk-move1, hftk-move2, hftk-move3, hftk-move4 - Action: hftk-attack1, hftk-attack2, hftk-attack3 - Attack: hftk-attack1, hftk-attack2, hftk-attack3 + Action: hftk-move1, hftk-move2, hftk-move3, hftk-move4 + Attack: hftk-attack1, hftk-attack2, hftk-attack3, hftk-attack4 BlackHandVoice: Voices: @@ -678,7 +905,325 @@ BlackHandVoice: LasherTankVoice: Voices: - Select: vlassed, vlassef, vlasmod, vlashsea, vlashseb, vlashsec, vlashsed - Move: vlasmoa, vlasmoc, vlasatd, vlashmoa, vlashmob, vlashmoc, vlashmod - Attack: vlasata, vlasatc, vlasate, vlasatg, vlashata, vlashatb, vlashatc, vlashatd - Action: vlasmoa, vlasmoc, vlasatd, vlashmoa, vlashmob, vlashmoc, vlashmod \ No newline at end of file + Select: vlassed, vlassef, vlasseg + Move: vlasmoa, vlasmoc, vlasmod, vlasmof + Attack: vlasata, vlasatc, vlasatd, vlasate, vlasatf, vlasatg + Action: vlasmoa, vlasmoc, vlasmod, vlasmof + +GattlingTankVoice: + Voices: + Select: ytnkslt1, ytnkslt2, ytnkslt3, ytnkslt4, ytnkslt5 + Move: ytnkmov1, ytnkmov2, ytnkmov3, ytnkmov4, ytnkmov5 + Attack: ytnkatk1, ytnkatk2, ytnkatk3, ytnkatk4, ytnkatk5, ytnkatk6 + Action: ytnkmov1, ytnkmov2, ytnkmov3, ytnkmov4, ytnkmov5 + +GIVoice: + Inherits: ^InfantryDeaths + Voices: + Select: igisea, igiseb, igisec, igised, igisee, igisef, igiseg + Move: igimoa, igimob, igimoc, igimod, igimoe + Attack: igiata, igiatb, igiatc, igiatd, igiate, igiatf + Action: igifea, igifeb + Die: igidia, igidib, igidic, igidid, igidie + +GGIVoice: + Inherits: ^InfantryDeaths + Voices: + Select: iggisea, iggiseb, iggisec, iggised, iggisee, iggisef + Move: iggimoa, iggimob, iggimoc, iggimod, iggimoe + Attack: iggiata, iggiatb, iggiatc, iggiatd, iggiate + Deploy: iggidea, iggideb, iggidec + Action: iggidea, iggideb, iggidec + Die: iggidia, iggidib, iggidic, iggidid, iggidie + +SealVoice: + Inherits: ^InfantryDeaths + Voices: + Select: iseasea, iseaseb, iseasec, iseased + Move: iseamoa, iseamob, iseamoc + Attack: iseaata, iseaatb, iseaatc + Demolish: iseaexa, iseaexb, iseaexc + Action: iseafea + Die: iseadia, iseadib, iseadic + Build: iseasec + Kill: iseaatc, iseased + +GrizzlyVoice: + Voices: + Select: vgrasea, vgraseb, vgrasec, vgrased, vgrasee + Action: vgramoa, vgramob, vgramoc, vgramod, vgramoe, vgramof + Move: vgramoa, vgramob, vgramoc, vgramod, vgramoe, vgramof + Attack: vgraata, vgraatb, vgraatc, vgraatd, vgraate + +AcolyteVoice: + Voices: + Select: acol-select1, acol-select2, acol-select3, acol-select4, acol-select5 + Move: acol-move1, acol-move2, acol-action1, acol-action2, acol-action3 + Action: acol-action1, acol-action2, acol-action3 + Attack: acol-attack1, acol-attack2, acol-attack3, acol-action1, acol-action3 + Die: 22-n104, 22-n106, 22-n108 + Burned: 22-n104, 22-n106, 22-n108 + Zapped: 22-n104, 22-n106, 22-n108 + Poisoned: 22-n104, 22-n106, 22-n108 + +EnlightenedVoice: + Voices: + Select: enli-select1, enli-select2, enli-select3, enli-select4, enli-select5, enli-select6 + Move: enli-move1, enli-move2, enli-move3, enli-move4, enli-move5 + Action: enli-select1, enli-select2, enli-select3, enli-select4 + Attack: enli-attack1, enli-attack2, enli-attack3, enli-attack4 + Die: 22-n104, 22-n106, 22-n108 + Burned: 22-n104, 22-n106, 22-n108 + Zapped: 22-n104, 22-n106, 22-n108 + Poisoned: 22-n104, 22-n106, 22-n108 + +TemplarVoice: + Voices: + Select: tplr-select1, tplr-select2, tplr-select3, tplr-select4, tplr-select5 + Move: tplr-move1, tplr-move2, tplr-move3, tplr-move4, tplr-action1, tplr-action2 + Action: tplr-action1, tplr-action2, tplr-select4, tplr-select5 + Attack: tplr-attack1, tplr-attack2, tplr-attack3, tplr-action1, tplr-action2 + Die: 22-n104, 22-n106, 22-n108 + Burned: 22-n104, 22-n106, 22-n108 + Zapped: 22-n104, 22-n106, 22-n108 + Poisoned: 22-n104, 22-n106, 22-n108 + +MindSparkVoice: + Voices: + Select: mspk1, mspk2 + Action: mspk1, mspk2 + Move: mspk1, mspk2 + Attack: mspk1, mspk2 + +CyberscrinVoice: + Voices: + Select: cscr-select1, cscr-select2, cscr-select3, cscr-select4 + Move: cscr-action1, cscr-action2, cscr-action3, cscr-action4, cscr-action5, cscr-action6, cscr-action7 + Attack: cscr-action1, cscr-action2, cscr-action3, cscr-action4, cscr-action5, cscr-action6, cscr-action7 + Action: cscr-action1, cscr-action2, cscr-action3, cscr-action4, cscr-action5, cscr-action6, cscr-action7 + Die: scrin-die1, scrin-die2, scrin-die3, scrin-die4, scrin-die5 + Burned: scrin-firedeath + Zapped: scrin-die2, scrin-die5 + Poisoned: scrin-die2, scrin-die5 + +CyberdogVoice: + Voices: + Select: cdog-select1 + Move: cdog-action1 + Attack: cdog-attack1 + Action: cdog-action1 + Die: cdog-die2,cdog-die1 + Burned: cdog-die3 + Zapped: cdog-die3 + Poisoned: cdog-die2 + +CommissarVoice: + Inherits: ^InfantryDeaths + Voices: + Select: cmsr-select1, cmsr-select2, cmsr-select3, cmsr-select4 + Move: cmsr-action1, cmsr-action3, cmsr-action4, cmsr-action5, cmsr-action6 + Action: cmsr-action1, cmsr-action3, cmsr-action4, cmsr-action5, cmsr-action6 + Attack: cmsr-action1, cmsr-action2, cmsr-action3, cmsr-action4, cmsr-action5, cmsr-action6 + +VenomVoice: + Voices: + Select: venm-select1, venm-select2, venm-select3, venm-select4 + Move: venm-move1, venm-move2, venm-move3, venm-move4 + Action: venm-attack1, venm-attack2, venm-attack3, venm-attack4 + Attack: venm-attack1, venm-attack2, venm-attack3, venm-attack4 + +SpectreVoice: + Voices: + Select: spec-select1, spec-select2, spec-select3, spec-select4 + Move: spec-move1, spec-move2, spec-move3, spec-move4 + Action: spec-attack1, spec-attack2, spec-attack3, spec-attack4 + Attack: spec-attack1, spec-attack2, spec-attack3, spec-attack4 + +ThwkVoice: + Voices: + Select: vtomsea, vtomseb, vtomsec, vtomsed, vtomsee, vtomsef + Move: vtommoa, vtommob, vtommoc, vtommod, vtommoe + Attack: vtomata, vtomatb, vtomatc, vtomatd, vtomate, vtomatf + Action: vtommoa, vtommob, vtommoc, vtommod, vtommoe + +DiscVoice: + Voices: + Select: diskslt1,diskslt2,diskslt3,diskslt4 + Move: diskmove1,diskmove2,diskmove3 + Attack: diskatk1,diskatk2,diskatk3,diskatk4,diskatk5 + Action: diskmove1,diskmove2,diskmove3 + Steal: diskcashdraw1, diskcashdraw2, diskcashdraw3, diskdisdraw1, diskdisdraw2 + Die: diskdie1 + Build: diskmove4 + +PeaceVoice: + Voices: + Select: vpeasl1, vpeasl2, vpeasl3, vpeasl4, vpeasl5 + Move: vpeamo1, vpeamo2, vpeamo3, vpeamo4 + Attack: vpeaat1, vpeaat2, vpeaat3, vpeaat4, vpeaat5 + Action: vpeamo1, vpeamo2, vpeamo3, vpeamo4 + +SukVoice: + Voices: + Select: vsuksl1, vsuksl2, vsuksl3, vsuksl4, vsuksl5 + Move: vsukmo1, vsukmo2, vsukmo3, vsukmo4, vsukmo5 + Attack: vsukat1, vsukat2, vsukat3, vsukat4, vsukat5 + Action: vsukmo1, vsukmo2, vsukmo3, vsukmo4, vsukmo5 + +RahVoice: + Voices: + Select: vrahsl1, vrahsl2, vrahsl3, vrahsl4, vrahsl5 + Move: vrahmo1, vrahmo2, vrahmo3, vrahmo4, vrahmo5 + Attack: vrahat1, vrahat2, vrahat3, vrahat4, vrahat5, vrahat6 + Action: vrahmo1, vrahmo2, vrahmo3, vrahmo4, vrahmo5 + +EradVoice: + Voices: + Select: veraslt1, veraslt2, veraslt3, veraslt4, veraslt5 + Move: veramov1, veramov2, veramov3, veramov4, veramov5 + Attack: veraatk1, veraatk2, veraatk3, veraatk4, veraatk5 + Action: veramov1, veramov2, veramov3, veramov4, veramov5 + +XOVoice: + Voices: + Select: vxoslt1, vxoslt2, vxoslt3, vxoslt4, vxoslt5 + Move: vxomov1, vxomov2, vxomov3, vxomov4, vxomov5, vxomov6 + Attack: vxoatk1, vxoatk2, vxoatk3, vxoatk4, vxoatk5 + Action: vxoslt1, vxoslt2, vxoslt3, vxoslt4, vxoslt5 + +WolverineVoice: + Voices: + Select: wolv-select1, wolv-select2, wolv-select3, wolv-select4 + Move: wolv-move1, wolv-move2, wolv-move3, wolv-move4 + Attack: wolv-attack1, wolv-attack2, wolv-attack3, wolv-attack4 + Action: wolv-move1, wolv-move2, wolv-move3, wolv-move4 + +JackknifeVoice: + Voices: + Select: jack-select1, jack-select2 + Move: jack-move1, jack-move2, jack-move3 + Attack: jack-attack1, jack-attack2 + Action: jack-move1, jack-move2, jack-move3 + +ZoneTrooperVoice: + Voices: + Select: ztrp-select1, ztrp-select2, ztrp-select3, ztrp-select4 + Move: ztrp-move1, ztrp-move2, ztrp-move3, ztrp-move4, ztrp-move5 + Attack: ztrp-attack1, ztrp-attack2, ztrp-attack3 + Action: ztrp-attack1, ztrp-attack2, ztrp-attack3, ztrp-move4, ztrp-move5 + Die: ztrp-die1, ztrp-die2, ztrp-die3 + Burned: ztrp-die1, ztrp-die2, ztrp-die3 + Zapped: ztrp-die1, ztrp-die2, ztrp-die3 + Poisoned: ztrp-die1, ztrp-die2, ztrp-die3 + +ZoneRaiderVoice: + Voices: + Select: zrai-select1, zrai-select2, zrai-select3, zrai-select4 + Move: zrai-move1, zrai-move2, zrai-move3, zrai-move4, zrai-move5 + Attack: zrai-attack1, zrai-attack2, zrai-attack3 + Action: zrai-attack1, zrai-attack2, zrai-attack3, zrai-move4, zrai-move5 + Die: zrai-die1, zrai-die2, zrai-die3 + Burned: zrai-die1, zrai-die2, zrai-die3 + Zapped: zrai-die1, zrai-die2, zrai-die3 + Poisoned: zrai-die1, zrai-die2, zrai-die3 + +ZoneDefenderVoice: + Voices: + Select: zdef-select1, zdef-select2, zdef-select3, zdef-select4 + Move: zdef-move1, zdef-move2, zdef-move3, zdef-move4 + Attack: zdef-attack1, zdef-attack2, zdef-attack3 + Action: zdef-attack1, zdef-move2, zdef-move4 + Shield: zdef-shield1, zdef-shield2 + Die: ztrp-die1, ztrp-die2, ztrp-die3 + Burned: ztrp-die1, ztrp-die2, ztrp-die3 + Zapped: ztrp-die1, ztrp-die2, ztrp-die3 + Poisoned: ztrp-die1, ztrp-die2, ztrp-die3 + +EnforcerVoice: + Voices: + Select: enfo-select1, enfo-select2, enfo-select3, enfo-select4 + Move: enfo-move1, enfo-move2, enfo-move3, enfo-move4, enfo-move5, enfo-move6 + Attack: enfo-attack1, enfo-attack2, enfo-attack3, enfo-attack4 + Action: enfo-move3, enfo-move4, enfo-move6 + Die: enfo-die1, enfo-die2, enfo-die3 + Burned: enfo-die1, enfo-die2, enfo-die3 + Zapped: enfo-die1, enfo-die2, enfo-die3 + Poisoned: enfo-die1, enfo-die2, enfo-die3 + +TigerGuardVoice: + Inherits: ^InfantryDeaths + Voices: + Select: tigr-select1, tigr-select2, tigr-select3, tigr-select4 + Move: tigr-move1, tigr-move2, tigr-move3, tigr-move4 + Attack: tigr-attack1, tigr-attack2, tigr-attack3, tigr-attack4 + Action: tigr-move4 + +BlackEagleVoice: + Voices: + Select: vblesea, vbleseb, vblesec, vblesed, vblesee, vblesef + Move: vblemoa, vblemob, vblemoc + Attack: vbleata, vbleatb, vbleatc + Action: vblemoa, vblemob, vblemoc + +HopliteVoice: + Inherits: ^InfantryDeaths + Voices: + Select: hopl-select1, hopl-select2, hopl-select3, hopl-select4 + Move: hopl-move1, hopl-move2, hopl-move3, hopl-move4 + Attack: hopl-attack1, hopl-attack2, hopl-attack3, hopl-attack4 + Action: hopl-move2, hopl-move3 + +ZeusVoice: + Voices: + Select: zeus-select1, zeus-select2, zeus-select3, zeus-select4 + Move: zeus-move1, zeus-move2, zeus-move3, zeus-move4 + Attack: zeus-attack1, zeus-attack2, zeus-attack3, zeus-attack4 + Action: zeus-move4, zeus-attack4 + +CryoTrooperVoice: + Voices: + Select: cryt-select1, cryt-select2, cryt-select3, cryt-select4 + Move: cryt-move1, cryt-move2, cryt-move3, cryt-move4, cryt-move5 + Attack: cryt-attack1, cryt-attack2, cryt-attack3 + Action: cryt-move1, cryt-move2, cryt-move4, cryt-move5 + Die: cryt-die1, cryt-die2, cryt-die3 + Burned: cryt-die1, cryt-die2, cryt-die3 + Zapped: cryt-die1, cryt-die2, cryt-die3 + Poisoned: cryt-die1, cryt-die2, cryt-die3 + +PitbVoice: + Voices: + Select: vpitbslt1, vpitbslt2, vpitbslt3, vpitbslt4, vpitbslt5, vpitbslt6 + Move: vpitbmov1, vpitbmov2, vpitbmov3, vpitbmov4, vpitbmov5, vpitbmov6 + Attack: vpitbatk1, vpitbatk2, vpitbatk3, vpitbatk4, vpitbatk5 + Action: vpitbmov1, vpitbmov2, vpitbmov3, vpitbmov4, vpitbmov5, vpitbmov6 + +AvatarVoice: + Voices: + Select: avtr-select1, avtr-select2, avtr-select3, avtr-select4 + Move: avtr-move1, avtr-move2, avtr-move3, avtr-move4 + Attack: avtr-attack1, avtr-attack2, avtr-attack3, avtr-attack4 + Action: avtr-move3, avtr-move4, avtr-attack2, avtr-attack4 + +StnkVoice: + Voices: + Select: vstnkslt1, vstnkslt2, vstnkslt3, vstnkslt4, vstnkslt5, vstnkslt6, vstnkslt7 + Move: vstnkmov1, vstnkmov2, vstnkmov3, vstnkmov4, vstnkmov5, vstnkmov6, vstnkmov7 + Attack: vstnkatk1, vstnkatk2, vstnkatk3, vstnkatk4, vstnkatk15 + Action: vstnkmov1, vstnkmov2, vstnkmov3, vstnkmov4, vstnkmov5, vstnkmov6, vstnkmov7 + +HstkVoice: + Voices: + Select: vhstkslt1, vhstkslt2, vhstkslt3, vhstkslt4, vhstkslt5 + Move: vhstkmov1, vhstkmov2, vhstkmov3, vhstkmov4, vhstkmov5, vhstkmov6 + Attack: vhstkatk1, vhstkatk2, vhstkatk3, vhstkatk4, vhstkatk5 + Action: vhstkmov1, vhstkmov2, vhstkmov3, vhstkmov4, vhstkmov5, vhstkmov6 + +ConfessorVoice: + Inherits: ^InfantryDeaths + Voices: + Select: conf-select1, conf-select2, conf-select3, conf-select4 + Move: conf-move1, conf-move2, conf-move3, conf-move4, conf-move5 + Action: conf-move1, conf-move2, conf-move3, conf-move4 + Attack: confessor-attack1, confessor-attack2 + Build: conf-create diff --git a/mods/ca/bits/280mma.shp b/mods/ca/bits/280mma.shp new file mode 100644 index 0000000000..755c30473f Binary files /dev/null and b/mods/ca/bits/280mma.shp differ diff --git a/mods/ca/bits/280mmn.shp b/mods/ca/bits/280mmn.shp new file mode 100644 index 0000000000..0187dd89e3 Binary files /dev/null and b/mods/ca/bits/280mmn.shp differ diff --git a/mods/ca/bits/380mma.shp b/mods/ca/bits/380mma.shp new file mode 100644 index 0000000000..ad3ddd7b2a Binary files /dev/null and b/mods/ca/bits/380mma.shp differ diff --git a/mods/ca/bits/3tnkay.shp b/mods/ca/bits/3tnkay.shp new file mode 100644 index 0000000000..ad479ccf15 Binary files /dev/null and b/mods/ca/bits/3tnkay.shp differ diff --git a/mods/ca/bits/3tnkayicon.shp b/mods/ca/bits/3tnkayicon.shp new file mode 100644 index 0000000000..de0953e8f8 Binary files /dev/null and b/mods/ca/bits/3tnkayicon.shp differ diff --git a/mods/ca/bits/3tnkyicon.shp b/mods/ca/bits/3tnkyicon.shp index 4cbda8f129..72bdf37a2c 100644 Binary files a/mods/ca/bits/3tnkyicon.shp and b/mods/ca/bits/3tnkyicon.shp differ diff --git a/mods/ca/bits/4tnkerad.shp b/mods/ca/bits/4tnkerad.shp new file mode 100644 index 0000000000..d20c666460 Binary files /dev/null and b/mods/ca/bits/4tnkerad.shp differ diff --git a/mods/ca/bits/4tnkeradicon.shp b/mods/ca/bits/4tnkeradicon.shp new file mode 100644 index 0000000000..d7a3fe1c3a Binary files /dev/null and b/mods/ca/bits/4tnkeradicon.shp differ diff --git a/mods/ca/bits/4tnkeradiicon.shp b/mods/ca/bits/4tnkeradiicon.shp new file mode 100644 index 0000000000..acf1ab6b54 Binary files /dev/null and b/mods/ca/bits/4tnkeradiicon.shp differ diff --git a/mods/ca/bits/afld.shp b/mods/ca/bits/afld.shp new file mode 100644 index 0000000000..9db8366852 Binary files /dev/null and b/mods/ca/bits/afld.shp differ diff --git a/mods/ca/bits/afldgdi.shp b/mods/ca/bits/afldgdi.shp index 453797ac8d..ba044b7b2e 100644 Binary files a/mods/ca/bits/afldgdi.shp and b/mods/ca/bits/afldgdi.shp differ diff --git a/mods/ca/bits/afldgdiicnh.shp b/mods/ca/bits/afldgdiicnh.shp new file mode 100644 index 0000000000..c76b84f2a9 Binary files /dev/null and b/mods/ca/bits/afldgdiicnh.shp differ diff --git a/mods/ca/bits/afldgdiidle.shp b/mods/ca/bits/afldgdiidle.shp index ab028a001d..826530c387 100644 Binary files a/mods/ca/bits/afldgdiidle.shp and b/mods/ca/bits/afldgdiidle.shp differ diff --git a/mods/ca/bits/afldgdimake.shp b/mods/ca/bits/afldgdimake.shp index 9abccc1b33..5062865ad0 100644 Binary files a/mods/ca/bits/afldgdimake.shp and b/mods/ca/bits/afldgdimake.shp differ diff --git a/mods/ca/bits/afldidle.shp b/mods/ca/bits/afldidle.shp index 5c338d4a0d..d9fe139e21 100644 Binary files a/mods/ca/bits/afldidle.shp and b/mods/ca/bits/afldidle.shp differ diff --git a/mods/ca/bits/afldmake.shp b/mods/ca/bits/afldmake.shp new file mode 100644 index 0000000000..c5051a5b9c Binary files /dev/null and b/mods/ca/bits/afldmake.shp differ diff --git a/mods/ca/bits/airbicon.shp b/mods/ca/bits/airbicon.shp new file mode 100644 index 0000000000..95e2802c42 Binary files /dev/null and b/mods/ca/bits/airbicon.shp differ diff --git a/mods/ca/bits/alhq.shp b/mods/ca/bits/alhq.shp new file mode 100644 index 0000000000..be17738feb Binary files /dev/null and b/mods/ca/bits/alhq.shp differ diff --git a/mods/ca/bits/alhqicon.shp b/mods/ca/bits/alhqicon.shp new file mode 100644 index 0000000000..a4f1b01092 Binary files /dev/null and b/mods/ca/bits/alhqicon.shp differ diff --git a/mods/ca/bits/anto.shp b/mods/ca/bits/anto.shp new file mode 100644 index 0000000000..4de8decb6a Binary files /dev/null and b/mods/ca/bits/anto.shp differ diff --git a/mods/ca/bits/apoceradicon.shp b/mods/ca/bits/apoceradicon.shp new file mode 100644 index 0000000000..8bc85200d5 Binary files /dev/null and b/mods/ca/bits/apoceradicon.shp differ diff --git a/mods/ca/bits/apoceradiicon.shp b/mods/ca/bits/apoceradiicon.shp new file mode 100644 index 0000000000..9a1ef9f5d1 Binary files /dev/null and b/mods/ca/bits/apoceradiicon.shp differ diff --git a/mods/ca/bits/apocturi.shp b/mods/ca/bits/apocturi.shp new file mode 100644 index 0000000000..5eeac74da3 Binary files /dev/null and b/mods/ca/bits/apocturi.shp differ diff --git a/mods/ca/bits/arch.shp b/mods/ca/bits/arch.shp new file mode 100644 index 0000000000..4a996ca7c8 Binary files /dev/null and b/mods/ca/bits/arch.shp differ diff --git a/mods/ca/bits/assa.shp b/mods/ca/bits/assa.shp new file mode 100644 index 0000000000..3bf5ca7b38 Binary files /dev/null and b/mods/ca/bits/assa.shp differ diff --git a/mods/ca/bits/assaicnh.shp b/mods/ca/bits/assaicnh.shp new file mode 100644 index 0000000000..df9b5a049e Binary files /dev/null and b/mods/ca/bits/assaicnh.shp differ diff --git a/mods/ca/bits/atomicammobuff.shp b/mods/ca/bits/atomicammobuff.shp new file mode 100644 index 0000000000..f4cb7b613e Binary files /dev/null and b/mods/ca/bits/atomicammobuff.shp differ diff --git a/mods/ca/bits/atomicammoicon.shp b/mods/ca/bits/atomicammoicon.shp new file mode 100644 index 0000000000..ac7ddc5b00 Binary files /dev/null and b/mods/ca/bits/atomicammoicon.shp differ diff --git a/mods/ca/bits/atomshell.shp b/mods/ca/bits/atomshell.shp new file mode 100644 index 0000000000..446f6e9a33 Binary files /dev/null and b/mods/ca/bits/atomshell.shp differ diff --git a/mods/ca/bits/audio/acol-action1.aud b/mods/ca/bits/audio/acol-action1.aud new file mode 100644 index 0000000000..9aa00f7ca6 Binary files /dev/null and b/mods/ca/bits/audio/acol-action1.aud differ diff --git a/mods/ca/bits/audio/acol-action2.aud b/mods/ca/bits/audio/acol-action2.aud new file mode 100644 index 0000000000..02c2da9300 Binary files /dev/null and b/mods/ca/bits/audio/acol-action2.aud differ diff --git a/mods/ca/bits/audio/acol-action3.aud b/mods/ca/bits/audio/acol-action3.aud new file mode 100644 index 0000000000..b0b8779a7e Binary files /dev/null and b/mods/ca/bits/audio/acol-action3.aud differ diff --git a/mods/ca/bits/audio/acol-attack1.aud b/mods/ca/bits/audio/acol-attack1.aud new file mode 100644 index 0000000000..f7322f0e77 Binary files /dev/null and b/mods/ca/bits/audio/acol-attack1.aud differ diff --git a/mods/ca/bits/audio/acol-attack2.aud b/mods/ca/bits/audio/acol-attack2.aud new file mode 100644 index 0000000000..079c928824 Binary files /dev/null and b/mods/ca/bits/audio/acol-attack2.aud differ diff --git a/mods/ca/bits/audio/acol-attack3.aud b/mods/ca/bits/audio/acol-attack3.aud new file mode 100644 index 0000000000..1fc3a5402e Binary files /dev/null and b/mods/ca/bits/audio/acol-attack3.aud differ diff --git a/mods/ca/bits/audio/acol-move1.aud b/mods/ca/bits/audio/acol-move1.aud new file mode 100644 index 0000000000..6ce0576f26 Binary files /dev/null and b/mods/ca/bits/audio/acol-move1.aud differ diff --git a/mods/ca/bits/audio/acol-move2.aud b/mods/ca/bits/audio/acol-move2.aud new file mode 100644 index 0000000000..79e968b14a Binary files /dev/null and b/mods/ca/bits/audio/acol-move2.aud differ diff --git a/mods/ca/bits/audio/acol-select1.aud b/mods/ca/bits/audio/acol-select1.aud new file mode 100644 index 0000000000..83f9de0f4e Binary files /dev/null and b/mods/ca/bits/audio/acol-select1.aud differ diff --git a/mods/ca/bits/audio/acol-select2.aud b/mods/ca/bits/audio/acol-select2.aud new file mode 100644 index 0000000000..2309d61dd9 Binary files /dev/null and b/mods/ca/bits/audio/acol-select2.aud differ diff --git a/mods/ca/bits/audio/acol-select3.aud b/mods/ca/bits/audio/acol-select3.aud new file mode 100644 index 0000000000..362033c0fc Binary files /dev/null and b/mods/ca/bits/audio/acol-select3.aud differ diff --git a/mods/ca/bits/audio/acol-select4.aud b/mods/ca/bits/audio/acol-select4.aud new file mode 100644 index 0000000000..14628b5d97 Binary files /dev/null and b/mods/ca/bits/audio/acol-select4.aud differ diff --git a/mods/ca/bits/audio/acol-select5.aud b/mods/ca/bits/audio/acol-select5.aud new file mode 100644 index 0000000000..2dd3fd26f5 Binary files /dev/null and b/mods/ca/bits/audio/acol-select5.aud differ diff --git a/mods/ca/bits/audio/appear1md.aud b/mods/ca/bits/audio/appear1md.aud new file mode 100644 index 0000000000..4fe6e63872 Binary files /dev/null and b/mods/ca/bits/audio/appear1md.aud differ diff --git a/mods/ca/bits/audio/appear1sm.aud b/mods/ca/bits/audio/appear1sm.aud new file mode 100644 index 0000000000..cf37377a1f Binary files /dev/null and b/mods/ca/bits/audio/appear1sm.aud differ diff --git a/mods/ca/bits/audio/atomicammo.aud b/mods/ca/bits/audio/atomicammo.aud new file mode 100644 index 0000000000..9d5aa7d885 Binary files /dev/null and b/mods/ca/bits/audio/atomicammo.aud differ diff --git a/mods/ca/bits/audio/atomshell.aud b/mods/ca/bits/audio/atomshell.aud new file mode 100644 index 0000000000..61398cc995 Binary files /dev/null and b/mods/ca/bits/audio/atomshell.aud differ diff --git a/mods/ca/bits/audio/avtr-attack1.aud b/mods/ca/bits/audio/avtr-attack1.aud new file mode 100644 index 0000000000..0dfd2c48e7 Binary files /dev/null and b/mods/ca/bits/audio/avtr-attack1.aud differ diff --git a/mods/ca/bits/audio/avtr-attack2.aud b/mods/ca/bits/audio/avtr-attack2.aud new file mode 100644 index 0000000000..3e3daa82cb Binary files /dev/null and b/mods/ca/bits/audio/avtr-attack2.aud differ diff --git a/mods/ca/bits/audio/avtr-attack3.aud b/mods/ca/bits/audio/avtr-attack3.aud new file mode 100644 index 0000000000..95b021db42 Binary files /dev/null and b/mods/ca/bits/audio/avtr-attack3.aud differ diff --git a/mods/ca/bits/audio/avtr-attack4.aud b/mods/ca/bits/audio/avtr-attack4.aud new file mode 100644 index 0000000000..152affe351 Binary files /dev/null and b/mods/ca/bits/audio/avtr-attack4.aud differ diff --git a/mods/ca/bits/audio/avtr-fire1.aud b/mods/ca/bits/audio/avtr-fire1.aud new file mode 100644 index 0000000000..656b6f90c8 Binary files /dev/null and b/mods/ca/bits/audio/avtr-fire1.aud differ diff --git a/mods/ca/bits/audio/avtr-fire2.aud b/mods/ca/bits/audio/avtr-fire2.aud new file mode 100644 index 0000000000..23c61e1505 Binary files /dev/null and b/mods/ca/bits/audio/avtr-fire2.aud differ diff --git a/mods/ca/bits/audio/avtr-fire3.aud b/mods/ca/bits/audio/avtr-fire3.aud new file mode 100644 index 0000000000..375b455cbb Binary files /dev/null and b/mods/ca/bits/audio/avtr-fire3.aud differ diff --git a/mods/ca/bits/audio/avtr-move1.aud b/mods/ca/bits/audio/avtr-move1.aud new file mode 100644 index 0000000000..50143742cf Binary files /dev/null and b/mods/ca/bits/audio/avtr-move1.aud differ diff --git a/mods/ca/bits/audio/avtr-move2.aud b/mods/ca/bits/audio/avtr-move2.aud new file mode 100644 index 0000000000..74994bcf7a Binary files /dev/null and b/mods/ca/bits/audio/avtr-move2.aud differ diff --git a/mods/ca/bits/audio/avtr-move3.aud b/mods/ca/bits/audio/avtr-move3.aud new file mode 100644 index 0000000000..99861c0537 Binary files /dev/null and b/mods/ca/bits/audio/avtr-move3.aud differ diff --git a/mods/ca/bits/audio/avtr-move4.aud b/mods/ca/bits/audio/avtr-move4.aud new file mode 100644 index 0000000000..2cd15ea4e2 Binary files /dev/null and b/mods/ca/bits/audio/avtr-move4.aud differ diff --git a/mods/ca/bits/audio/avtr-select1.aud b/mods/ca/bits/audio/avtr-select1.aud new file mode 100644 index 0000000000..651630dfc2 Binary files /dev/null and b/mods/ca/bits/audio/avtr-select1.aud differ diff --git a/mods/ca/bits/audio/avtr-select2.aud b/mods/ca/bits/audio/avtr-select2.aud new file mode 100644 index 0000000000..945a13563b Binary files /dev/null and b/mods/ca/bits/audio/avtr-select2.aud differ diff --git a/mods/ca/bits/audio/avtr-select3.aud b/mods/ca/bits/audio/avtr-select3.aud new file mode 100644 index 0000000000..ef661278b9 Binary files /dev/null and b/mods/ca/bits/audio/avtr-select3.aud differ diff --git a/mods/ca/bits/audio/avtr-select4.aud b/mods/ca/bits/audio/avtr-select4.aud new file mode 100644 index 0000000000..cdff8a6772 Binary files /dev/null and b/mods/ca/bits/audio/avtr-select4.aud differ diff --git a/mods/ca/bits/audio/basiwave.aud b/mods/ca/bits/audio/basiwave.aud new file mode 100644 index 0000000000..23c1d47a3e Binary files /dev/null and b/mods/ca/bits/audio/basiwave.aud differ diff --git a/mods/ca/bits/audio/beacon.aud b/mods/ca/bits/audio/beacon.aud new file mode 100644 index 0000000000..b260babf4d Binary files /dev/null and b/mods/ca/bits/audio/beacon.aud differ diff --git a/mods/ca/bits/audio/beag-fire1.aud b/mods/ca/bits/audio/beag-fire1.aud new file mode 100644 index 0000000000..f638e9b15b Binary files /dev/null and b/mods/ca/bits/audio/beag-fire1.aud differ diff --git a/mods/ca/bits/audio/beag-fire2.aud b/mods/ca/bits/audio/beag-fire2.aud new file mode 100644 index 0000000000..fe7a08816d Binary files /dev/null and b/mods/ca/bits/audio/beag-fire2.aud differ diff --git a/mods/ca/bits/audio/beepslct.aud b/mods/ca/bits/audio/beepslct.aud deleted file mode 100644 index dbaff1b8f9..0000000000 Binary files a/mods/ca/bits/audio/beepslct.aud and /dev/null differ diff --git a/mods/ca/bits/audio/bland1.aud b/mods/ca/bits/audio/bland1.aud new file mode 100644 index 0000000000..619a8ac865 Binary files /dev/null and b/mods/ca/bits/audio/bland1.aud differ diff --git a/mods/ca/bits/audio/bland2.aud b/mods/ca/bits/audio/bland2.aud new file mode 100644 index 0000000000..a38ae0c9ff Binary files /dev/null and b/mods/ca/bits/audio/bland2.aud differ diff --git a/mods/ca/bits/audio/brrrrt1.aud b/mods/ca/bits/audio/brrrrt1.aud new file mode 100644 index 0000000000..c7b19f46c7 Binary files /dev/null and b/mods/ca/bits/audio/brrrrt1.aud differ diff --git a/mods/ca/bits/audio/brrrrt2.aud b/mods/ca/bits/audio/brrrrt2.aud new file mode 100644 index 0000000000..37e001dbc0 Binary files /dev/null and b/mods/ca/bits/audio/brrrrt2.aud differ diff --git a/mods/ca/bits/audio/bsky-fire.aud b/mods/ca/bits/audio/bsky-fire.aud new file mode 100644 index 0000000000..3d6fbc63bf Binary files /dev/null and b/mods/ca/bits/audio/bsky-fire.aud differ diff --git a/mods/ca/bits/audio/bsky-hit1.aud b/mods/ca/bits/audio/bsky-hit1.aud new file mode 100644 index 0000000000..cfbf1824d5 Binary files /dev/null and b/mods/ca/bits/audio/bsky-hit1.aud differ diff --git a/mods/ca/bits/audio/bsky-hit2.aud b/mods/ca/bits/audio/bsky-hit2.aud new file mode 100644 index 0000000000..83499aff9d Binary files /dev/null and b/mods/ca/bits/audio/bsky-hit2.aud differ diff --git a/mods/ca/bits/bspyof.aud b/mods/ca/bits/audio/bspyof.aud similarity index 100% rename from mods/ca/bits/bspyof.aud rename to mods/ca/bits/audio/bspyof.aud diff --git a/mods/ca/bits/bspyon.aud b/mods/ca/bits/audio/bspyon.aud similarity index 100% rename from mods/ca/bits/bspyon.aud rename to mods/ca/bits/audio/bspyon.aud diff --git a/mods/ca/bits/audio/btoff1.aud b/mods/ca/bits/audio/btoff1.aud new file mode 100644 index 0000000000..d81a7cbbe9 Binary files /dev/null and b/mods/ca/bits/audio/btoff1.aud differ diff --git a/mods/ca/bits/audio/btoff2.aud b/mods/ca/bits/audio/btoff2.aud new file mode 100644 index 0000000000..4b316cdaa2 Binary files /dev/null and b/mods/ca/bits/audio/btoff2.aud differ diff --git a/mods/ca/bits/audio/c2_1minr.aud b/mods/ca/bits/audio/c2_1minr.aud new file mode 100644 index 0000000000..ec29022141 Binary files /dev/null and b/mods/ca/bits/audio/c2_1minr.aud differ diff --git a/mods/ca/bits/audio/c2_2minr.aud b/mods/ca/bits/audio/c2_2minr.aud new file mode 100644 index 0000000000..c27cb92e39 Binary files /dev/null and b/mods/ca/bits/audio/c2_2minr.aud differ diff --git a/mods/ca/bits/audio/c2_3minr.aud b/mods/ca/bits/audio/c2_3minr.aud new file mode 100644 index 0000000000..a4773e4ac5 Binary files /dev/null and b/mods/ca/bits/audio/c2_3minr.aud differ diff --git a/mods/ca/bits/audio/c2_4minr.aud b/mods/ca/bits/audio/c2_4minr.aud new file mode 100644 index 0000000000..6085a9a679 Binary files /dev/null and b/mods/ca/bits/audio/c2_4minr.aud differ diff --git a/mods/ca/bits/audio/c2_5minr.aud b/mods/ca/bits/audio/c2_5minr.aud new file mode 100644 index 0000000000..e83465c49b Binary files /dev/null and b/mods/ca/bits/audio/c2_5minr.aud differ diff --git a/mods/ca/bits/audio/c2_abldgin1.aud b/mods/ca/bits/audio/c2_abldgin1.aud new file mode 100644 index 0000000000..c3af9bb238 Binary files /dev/null and b/mods/ca/bits/audio/c2_abldgin1.aud differ diff --git a/mods/ca/bits/audio/c2_alaunch1.aud b/mods/ca/bits/audio/c2_alaunch1.aud new file mode 100644 index 0000000000..49958d325e Binary files /dev/null and b/mods/ca/bits/audio/c2_alaunch1.aud differ diff --git a/mods/ca/bits/audio/c2_aprep1.aud b/mods/ca/bits/audio/c2_aprep1.aud new file mode 100644 index 0000000000..c8c46ea57a Binary files /dev/null and b/mods/ca/bits/audio/c2_aprep1.aud differ diff --git a/mods/ca/bits/audio/c2_aready1.aud b/mods/ca/bits/audio/c2_aready1.aud new file mode 100644 index 0000000000..9736cee79f Binary files /dev/null and b/mods/ca/bits/audio/c2_aready1.aud differ diff --git a/mods/ca/bits/audio/c2_armorup1.aud b/mods/ca/bits/audio/c2_armorup1.aud new file mode 100644 index 0000000000..2f360e3dc7 Binary files /dev/null and b/mods/ca/bits/audio/c2_armorup1.aud differ diff --git a/mods/ca/bits/audio/c2_astriker1.aud b/mods/ca/bits/audio/c2_astriker1.aud new file mode 100644 index 0000000000..d529d32883 Binary files /dev/null and b/mods/ca/bits/audio/c2_astriker1.aud differ diff --git a/mods/ca/bits/audio/c2_aunitl1.aud b/mods/ca/bits/audio/c2_aunitl1.aud new file mode 100644 index 0000000000..9c5c88bead Binary files /dev/null and b/mods/ca/bits/audio/c2_aunitl1.aud differ diff --git a/mods/ca/bits/audio/c2_baseatk1.aud b/mods/ca/bits/audio/c2_baseatk1.aud new file mode 100644 index 0000000000..4b8078b983 Binary files /dev/null and b/mods/ca/bits/audio/c2_baseatk1.aud differ diff --git a/mods/ca/bits/audio/c2_bct1.aud b/mods/ca/bits/audio/c2_bct1.aud new file mode 100644 index 0000000000..482bd05e0c Binary files /dev/null and b/mods/ca/bits/audio/c2_bct1.aud differ diff --git a/mods/ca/bits/audio/c2_bctrinit.aud b/mods/ca/bits/audio/c2_bctrinit.aud new file mode 100644 index 0000000000..55cb76203b Binary files /dev/null and b/mods/ca/bits/audio/c2_bctrinit.aud differ diff --git a/mods/ca/bits/audio/c2_bldcap1.aud b/mods/ca/bits/audio/c2_bldcap1.aud new file mode 100644 index 0000000000..60bf9af714 Binary files /dev/null and b/mods/ca/bits/audio/c2_bldcap1.aud differ diff --git a/mods/ca/bits/audio/c2_bldginf1.aud b/mods/ca/bits/audio/c2_bldginf1.aud new file mode 100644 index 0000000000..10fa5e3927 Binary files /dev/null and b/mods/ca/bits/audio/c2_bldginf1.aud differ diff --git a/mods/ca/bits/audio/c2_bldgprg1.aud b/mods/ca/bits/audio/c2_bldgprg1.aud new file mode 100644 index 0000000000..d94991b4b9 Binary files /dev/null and b/mods/ca/bits/audio/c2_bldgprg1.aud differ diff --git a/mods/ca/bits/audio/c2_bombardment.aud b/mods/ca/bits/audio/c2_bombardment.aud new file mode 100644 index 0000000000..057609dfca Binary files /dev/null and b/mods/ca/bits/audio/c2_bombardment.aud differ diff --git a/mods/ca/bits/audio/c2_bskywarn1.aud b/mods/ca/bits/audio/c2_bskywarn1.aud new file mode 100644 index 0000000000..1f0f9ecead Binary files /dev/null and b/mods/ca/bits/audio/c2_bskywarn1.aud differ diff --git a/mods/ca/bits/audio/c2_cancld1.aud b/mods/ca/bits/audio/c2_cancld1.aud new file mode 100644 index 0000000000..7d5248fcea Binary files /dev/null and b/mods/ca/bits/audio/c2_cancld1.aud differ diff --git a/mods/ca/bits/audio/c2_clusrdy.aud b/mods/ca/bits/audio/c2_clusrdy.aud new file mode 100644 index 0000000000..c5f40be991 Binary files /dev/null and b/mods/ca/bits/audio/c2_clusrdy.aud differ diff --git a/mods/ca/bits/audio/c2_cluswarn1.aud b/mods/ca/bits/audio/c2_cluswarn1.aud new file mode 100644 index 0000000000..2125f0efc1 Binary files /dev/null and b/mods/ca/bits/audio/c2_cluswarn1.aud differ diff --git a/mods/ca/bits/audio/c2_cmissrdy.aud b/mods/ca/bits/audio/c2_cmissrdy.aud new file mode 100644 index 0000000000..8af0906fec Binary files /dev/null and b/mods/ca/bits/audio/c2_cmissrdy.aud differ diff --git a/mods/ca/bits/audio/c2_cmisswarn1.aud b/mods/ca/bits/audio/c2_cmisswarn1.aud new file mode 100644 index 0000000000..9f69321eb9 Binary files /dev/null and b/mods/ca/bits/audio/c2_cmisswarn1.aud differ diff --git a/mods/ca/bits/audio/c2_conscmp1.aud b/mods/ca/bits/audio/c2_conscmp1.aud new file mode 100644 index 0000000000..fecba4d870 Binary files /dev/null and b/mods/ca/bits/audio/c2_conscmp1.aud differ diff --git a/mods/ca/bits/audio/c2_credit1.aud b/mods/ca/bits/audio/c2_credit1.aud new file mode 100644 index 0000000000..0b80fecb33 Binary files /dev/null and b/mods/ca/bits/audio/c2_credit1.aud differ diff --git a/mods/ca/bits/audio/c2_cryostormapp1.aud b/mods/ca/bits/audio/c2_cryostormapp1.aud new file mode 100644 index 0000000000..089d5d7f76 Binary files /dev/null and b/mods/ca/bits/audio/c2_cryostormapp1.aud differ diff --git a/mods/ca/bits/audio/c_dpodrdy1 b/mods/ca/bits/audio/c2_dpodrdy1.aud similarity index 100% rename from mods/ca/bits/audio/c_dpodrdy1 rename to mods/ca/bits/audio/c2_dpodrdy1.aud diff --git a/mods/ca/bits/audio/c2_emmisrdy1.aud b/mods/ca/bits/audio/c2_emmisrdy1.aud new file mode 100644 index 0000000000..c85541ce6d Binary files /dev/null and b/mods/ca/bits/audio/c2_emmisrdy1.aud differ diff --git a/mods/ca/bits/audio/c2_emmprep1.aud b/mods/ca/bits/audio/c2_emmprep1.aud new file mode 100644 index 0000000000..15d104a04b Binary files /dev/null and b/mods/ca/bits/audio/c2_emmprep1.aud differ diff --git a/mods/ca/bits/audio/c2_enmyapp1.aud b/mods/ca/bits/audio/c2_enmyapp1.aud new file mode 100644 index 0000000000..26d1c8295d Binary files /dev/null and b/mods/ca/bits/audio/c2_enmyapp1.aud differ diff --git a/mods/ca/bits/audio/c2_enmyunitsto1.aud b/mods/ca/bits/audio/c2_enmyunitsto1.aud new file mode 100644 index 0000000000..4b29e4f5fc Binary files /dev/null and b/mods/ca/bits/audio/c2_enmyunitsto1.aud differ diff --git a/mods/ca/bits/audio/c2_firepo1.aud b/mods/ca/bits/audio/c2_firepo1.aud new file mode 100644 index 0000000000..23c3271513 Binary files /dev/null and b/mods/ca/bits/audio/c2_firepo1.aud differ diff --git a/mods/ca/bits/audio/c2_flare1.aud b/mods/ca/bits/audio/c2_flare1.aud new file mode 100644 index 0000000000..0599f5dc9a Binary files /dev/null and b/mods/ca/bits/audio/c2_flare1.aud differ diff --git a/mods/ca/bits/audio/c2_forcechg1.aud b/mods/ca/bits/audio/c2_forcechg1.aud new file mode 100644 index 0000000000..aedd97f6e1 Binary files /dev/null and b/mods/ca/bits/audio/c2_forcechg1.aud differ diff --git a/mods/ca/bits/audio/c2_forcedr1.aud b/mods/ca/bits/audio/c2_forcedr1.aud new file mode 100644 index 0000000000..679cf21d3c Binary files /dev/null and b/mods/ca/bits/audio/c2_forcedr1.aud differ diff --git a/mods/ca/bits/audio/c2_fsoffline.aud b/mods/ca/bits/audio/c2_fsoffline.aud new file mode 100644 index 0000000000..1ef7b9d81b Binary files /dev/null and b/mods/ca/bits/audio/c2_fsoffline.aud differ diff --git a/mods/ca/bits/audio/c2_fsready.aud b/mods/ca/bits/audio/c2_fsready.aud new file mode 100644 index 0000000000..6add592ab3 Binary files /dev/null and b/mods/ca/bits/audio/c2_fsready.aud differ diff --git a/mods/ca/bits/audio/c_harvat.aud b/mods/ca/bits/audio/c2_harvatk1.aud similarity index 100% rename from mods/ca/bits/audio/c_harvat.aud rename to mods/ca/bits/audio/c2_harvatk1.aud diff --git a/mods/ca/bits/audio/c2_holdtheline.aud b/mods/ca/bits/audio/c2_holdtheline.aud new file mode 100644 index 0000000000..fa42d6f259 Binary files /dev/null and b/mods/ca/bits/audio/c2_holdtheline.aud differ diff --git a/mods/ca/bits/audio/c2_intrdy1.aud b/mods/ca/bits/audio/c2_intrdy1.aud new file mode 100644 index 0000000000..ccb794f91b Binary files /dev/null and b/mods/ca/bits/audio/c2_intrdy1.aud differ diff --git a/mods/ca/bits/audio/c2_ioncanapp.aud b/mods/ca/bits/audio/c2_ioncanapp.aud new file mode 100644 index 0000000000..5132ac029e Binary files /dev/null and b/mods/ca/bits/audio/c2_ioncanapp.aud differ diff --git a/mods/ca/bits/audio/c2_ionchrg1.aud b/mods/ca/bits/audio/c2_ionchrg1.aud new file mode 100644 index 0000000000..cf34925a0d Binary files /dev/null and b/mods/ca/bits/audio/c2_ionchrg1.aud differ diff --git a/mods/ca/bits/audio/c2_ionredy1.aud b/mods/ca/bits/audio/c2_ionredy1.aud new file mode 100644 index 0000000000..86f24e6517 Binary files /dev/null and b/mods/ca/bits/audio/c2_ionredy1.aud differ diff --git a/mods/ca/bits/audio/c2_load1.aud b/mods/ca/bits/audio/c2_load1.aud new file mode 100644 index 0000000000..35ddc1e697 Binary files /dev/null and b/mods/ca/bits/audio/c2_load1.aud differ diff --git a/mods/ca/bits/audio/c2_lopower1.aud b/mods/ca/bits/audio/c2_lopower1.aud new file mode 100644 index 0000000000..9d88bfd30b Binary files /dev/null and b/mods/ca/bits/audio/c2_lopower1.aud differ diff --git a/mods/ca/bits/audio/c2_misnlst1.aud b/mods/ca/bits/audio/c2_misnlst1.aud new file mode 100644 index 0000000000..c3e4536f72 Binary files /dev/null and b/mods/ca/bits/audio/c2_misnlst1.aud differ diff --git a/mods/ca/bits/audio/c2_misnwon1.aud b/mods/ca/bits/audio/c2_misnwon1.aud new file mode 100644 index 0000000000..a63972c56e Binary files /dev/null and b/mods/ca/bits/audio/c2_misnwon1.aud differ diff --git a/mods/ca/bits/audio/c2_missld1.aud b/mods/ca/bits/audio/c2_missld1.aud new file mode 100644 index 0000000000..a32760bbdb Binary files /dev/null and b/mods/ca/bits/audio/c2_missld1.aud differ diff --git a/mods/ca/bits/audio/c2_mocash1.aud b/mods/ca/bits/audio/c2_mocash1.aud new file mode 100644 index 0000000000..c2a070f98b Binary files /dev/null and b/mods/ca/bits/audio/c2_mocash1.aud differ diff --git a/mods/ca/bits/audio/c2_nanchg1.aud b/mods/ca/bits/audio/c2_nanchg1.aud new file mode 100644 index 0000000000..0090220c74 Binary files /dev/null and b/mods/ca/bits/audio/c2_nanchg1.aud differ diff --git a/mods/ca/bits/audio/c2_nanrdy1.aud b/mods/ca/bits/audio/c2_nanrdy1.aud new file mode 100644 index 0000000000..38582ebeb0 Binary files /dev/null and b/mods/ca/bits/audio/c2_nanrdy1.aud differ diff --git a/mods/ca/bits/audio/c2_navylst1.aud b/mods/ca/bits/audio/c2_navylst1.aud new file mode 100644 index 0000000000..d5c39a5432 Binary files /dev/null and b/mods/ca/bits/audio/c2_navylst1.aud differ diff --git a/mods/ca/bits/audio/c2_newopt1.aud b/mods/ca/bits/audio/c2_newopt1.aud new file mode 100644 index 0000000000..199dae6b08 Binary files /dev/null and b/mods/ca/bits/audio/c2_newopt1.aud differ diff --git a/mods/ca/bits/audio/c2_nobuild1.aud b/mods/ca/bits/audio/c2_nobuild1.aud new file mode 100644 index 0000000000..aeb5634234 Binary files /dev/null and b/mods/ca/bits/audio/c2_nobuild1.aud differ diff --git a/mods/ca/bits/audio/c2_nodeply1.aud b/mods/ca/bits/audio/c2_nodeply1.aud new file mode 100644 index 0000000000..481893b565 Binary files /dev/null and b/mods/ca/bits/audio/c2_nodeply1.aud differ diff --git a/mods/ca/bits/audio/c2_nofunds1.aud b/mods/ca/bits/audio/c2_nofunds1.aud new file mode 100644 index 0000000000..dd53d12d90 Binary files /dev/null and b/mods/ca/bits/audio/c2_nofunds1.aud differ diff --git a/mods/ca/bits/audio/c2_nopowr1.aud b/mods/ca/bits/audio/c2_nopowr1.aud new file mode 100644 index 0000000000..a78bedfcfc Binary files /dev/null and b/mods/ca/bits/audio/c2_nopowr1.aud differ diff --git a/mods/ca/bits/audio/c2_noredy1.aud b/mods/ca/bits/audio/c2_noredy1.aud new file mode 100644 index 0000000000..988691d2ad Binary files /dev/null and b/mods/ca/bits/audio/c2_noredy1.aud differ diff --git a/mods/ca/bits/audio/c2_nreprdy1.aud b/mods/ca/bits/audio/c2_nreprdy1.aud new file mode 100644 index 0000000000..695d6b7382 Binary files /dev/null and b/mods/ca/bits/audio/c2_nreprdy1.aud differ diff --git a/mods/ca/bits/audio/c2_onhold1.aud b/mods/ca/bits/audio/c2_onhold1.aud new file mode 100644 index 0000000000..42757e51bb Binary files /dev/null and b/mods/ca/bits/audio/c2_onhold1.aud differ diff --git a/mods/ca/bits/audio/c2_ourtechlckd1.aud b/mods/ca/bits/audio/c2_ourtechlckd1.aud new file mode 100644 index 0000000000..f63454987d Binary files /dev/null and b/mods/ca/bits/audio/c2_ourtechlckd1.aud differ diff --git a/mods/ca/bits/audio/c2_ourtechsto1.aud b/mods/ca/bits/audio/c2_ourtechsto1.aud new file mode 100644 index 0000000000..7118e24d8c Binary files /dev/null and b/mods/ca/bits/audio/c2_ourtechsto1.aud differ diff --git a/mods/ca/bits/audio/c2_owrathwarn1.aud b/mods/ca/bits/audio/c2_owrathwarn1.aud new file mode 100644 index 0000000000..f6339b3537 Binary files /dev/null and b/mods/ca/bits/audio/c2_owrathwarn1.aud differ diff --git a/mods/ca/bits/audio/c2_pribldg1.aud b/mods/ca/bits/audio/c2_pribldg1.aud new file mode 100644 index 0000000000..6c2cfd1166 Binary files /dev/null and b/mods/ca/bits/audio/c2_pribldg1.aud differ diff --git a/mods/ca/bits/audio/c2_progres1.aud b/mods/ca/bits/audio/c2_progres1.aud new file mode 100644 index 0000000000..2d5f330c57 Binary files /dev/null and b/mods/ca/bits/audio/c2_progres1.aud differ diff --git a/mods/ca/bits/audio/c2_pulse1.aud b/mods/ca/bits/audio/c2_pulse1.aud new file mode 100644 index 0000000000..2a79d5dc37 Binary files /dev/null and b/mods/ca/bits/audio/c2_pulse1.aud differ diff --git a/mods/ca/bits/audio/c2_radardn1.aud b/mods/ca/bits/audio/c2_radardn1.aud new file mode 100644 index 0000000000..a14e12602a Binary files /dev/null and b/mods/ca/bits/audio/c2_radardn1.aud differ diff --git a/mods/ca/bits/audio/c2_radaron2.aud b/mods/ca/bits/audio/c2_radaron2.aud new file mode 100644 index 0000000000..b776739033 Binary files /dev/null and b/mods/ca/bits/audio/c2_radaron2.aud differ diff --git a/mods/ca/bits/audio/c2_rdronerdy1.aud b/mods/ca/bits/audio/c2_rdronerdy1.aud new file mode 100644 index 0000000000..3b0355c4b5 Binary files /dev/null and b/mods/ca/bits/audio/c2_rdronerdy1.aud differ diff --git a/mods/ca/bits/audio/c2_reinfor1.aud b/mods/ca/bits/audio/c2_reinfor1.aud new file mode 100644 index 0000000000..c95a926d79 Binary files /dev/null and b/mods/ca/bits/audio/c2_reinfor1.aud differ diff --git a/mods/ca/bits/audio/c2_reinforava.aud b/mods/ca/bits/audio/c2_reinforava.aud new file mode 100644 index 0000000000..5ab7316112 Binary files /dev/null and b/mods/ca/bits/audio/c2_reinforava.aud differ diff --git a/mods/ca/bits/audio/c2_repair1.aud b/mods/ca/bits/audio/c2_repair1.aud new file mode 100644 index 0000000000..be2757a0a9 Binary files /dev/null and b/mods/ca/bits/audio/c2_repair1.aud differ diff --git a/mods/ca/bits/audio/c2_riftwarn1.aud b/mods/ca/bits/audio/c2_riftwarn1.aud new file mode 100644 index 0000000000..bb7a72fae6 Binary files /dev/null and b/mods/ca/bits/audio/c2_riftwarn1.aud differ diff --git a/mods/ca/bits/audio/c2_save1.aud b/mods/ca/bits/audio/c2_save1.aud new file mode 100644 index 0000000000..cd3fcddf4a Binary files /dev/null and b/mods/ca/bits/audio/c2_save1.aud differ diff --git a/mods/ca/bits/audio/c2_seekanddestroy.aud b/mods/ca/bits/audio/c2_seekanddestroy.aud new file mode 100644 index 0000000000..d2f0a68e6a Binary files /dev/null and b/mods/ca/bits/audio/c2_seekanddestroy.aud differ diff --git a/mods/ca/bits/audio/c2_silond1.aud b/mods/ca/bits/audio/c2_silond1.aud new file mode 100644 index 0000000000..0a973074b8 Binary files /dev/null and b/mods/ca/bits/audio/c2_silond1.aud differ diff --git a/mods/ca/bits/audio/c2_slcttgt1.aud b/mods/ca/bits/audio/c2_slcttgt1.aud new file mode 100644 index 0000000000..e82cbb8661 Binary files /dev/null and b/mods/ca/bits/audio/c2_slcttgt1.aud differ diff --git a/mods/ca/bits/audio/c2_spypln1.aud b/mods/ca/bits/audio/c2_spypln1.aud new file mode 100644 index 0000000000..15e2161199 Binary files /dev/null and b/mods/ca/bits/audio/c2_spypln1.aud differ diff --git a/mods/ca/bits/audio/c2_stormapp1.aud b/mods/ca/bits/audio/c2_stormapp1.aud new file mode 100644 index 0000000000..4323552b93 Binary files /dev/null and b/mods/ca/bits/audio/c2_stormapp1.aud differ diff --git a/mods/ca/bits/audio/c2_stormrdy1.aud b/mods/ca/bits/audio/c2_stormrdy1.aud new file mode 100644 index 0000000000..752204c0db Binary files /dev/null and b/mods/ca/bits/audio/c2_stormrdy1.aud differ diff --git a/mods/ca/bits/audio/c2_strckil1.aud b/mods/ca/bits/audio/c2_strckil1.aud new file mode 100644 index 0000000000..0e729a9333 Binary files /dev/null and b/mods/ca/bits/audio/c2_strckil1.aud differ diff --git a/mods/ca/bits/audio/c2_strclst1.aud b/mods/ca/bits/audio/c2_strclst1.aud new file mode 100644 index 0000000000..103b0a878b Binary files /dev/null and b/mods/ca/bits/audio/c2_strclst1.aud differ diff --git a/mods/ca/bits/audio/c2_strucap1.aud b/mods/ca/bits/audio/c2_strucap1.aud new file mode 100644 index 0000000000..aabee5ebee Binary files /dev/null and b/mods/ca/bits/audio/c2_strucap1.aud differ diff --git a/mods/ca/bits/audio/c2_strusld1.aud b/mods/ca/bits/audio/c2_strusld1.aud new file mode 100644 index 0000000000..d9e330d5a9 Binary files /dev/null and b/mods/ca/bits/audio/c2_strusld1.aud differ diff --git a/mods/ca/bits/audio/c2_suppinb.aud b/mods/ca/bits/audio/c2_suppinb.aud new file mode 100644 index 0000000000..d27747dcc3 Binary files /dev/null and b/mods/ca/bits/audio/c2_suppinb.aud differ diff --git a/mods/ca/bits/audio/c2_surgicalrdy1.aud b/mods/ca/bits/audio/c2_surgicalrdy1.aud new file mode 100644 index 0000000000..0f12ee0ee9 Binary files /dev/null and b/mods/ca/bits/audio/c2_surgicalrdy1.aud differ diff --git a/mods/ca/bits/audio/c2_techacq1.aud b/mods/ca/bits/audio/c2_techacq1.aud new file mode 100644 index 0000000000..13f3d81f2e Binary files /dev/null and b/mods/ca/bits/audio/c2_techacq1.aud differ diff --git a/mods/ca/bits/audio/c2_techlckd1.aud b/mods/ca/bits/audio/c2_techlckd1.aud new file mode 100644 index 0000000000..003002fdf9 Binary files /dev/null and b/mods/ca/bits/audio/c2_techlckd1.aud differ diff --git a/mods/ca/bits/audio/c2_train1.aud b/mods/ca/bits/audio/c2_train1.aud new file mode 100644 index 0000000000..ab5d91edfd Binary files /dev/null and b/mods/ca/bits/audio/c2_train1.aud differ diff --git a/mods/ca/bits/audio/c2_unitlst1.aud b/mods/ca/bits/audio/c2_unitlst1.aud new file mode 100644 index 0000000000..6600f5acc1 Binary files /dev/null and b/mods/ca/bits/audio/c2_unitlst1.aud differ diff --git a/mods/ca/bits/audio/c2_unitrdy1.aud b/mods/ca/bits/audio/c2_unitrdy1.aud new file mode 100644 index 0000000000..111013122b Binary files /dev/null and b/mods/ca/bits/audio/c2_unitrdy1.aud differ diff --git a/mods/ca/bits/audio/c2_unitrep1.aud b/mods/ca/bits/audio/c2_unitrep1.aud new file mode 100644 index 0000000000..f09e20e288 Binary files /dev/null and b/mods/ca/bits/audio/c2_unitrep1.aud differ diff --git a/mods/ca/bits/audio/c2_unitsld1.aud b/mods/ca/bits/audio/c2_unitsld1.aud new file mode 100644 index 0000000000..9ad06b2abe Binary files /dev/null and b/mods/ca/bits/audio/c2_unitsld1.aud differ diff --git a/mods/ca/bits/audio/c2_unitspd1.aud b/mods/ca/bits/audio/c2_unitspd1.aud new file mode 100644 index 0000000000..c1133a0635 Binary files /dev/null and b/mods/ca/bits/audio/c2_unitspd1.aud differ diff --git a/mods/ca/bits/audio/c2_unitsto.aud b/mods/ca/bits/audio/c2_unitsto.aud new file mode 100644 index 0000000000..9a5c759871 Binary files /dev/null and b/mods/ca/bits/audio/c2_unitsto.aud differ diff --git a/mods/ca/bits/audio/c2_unitupg1.aud b/mods/ca/bits/audio/c2_unitupg1.aud new file mode 100644 index 0000000000..0970c05e95 Binary files /dev/null and b/mods/ca/bits/audio/c2_unitupg1.aud differ diff --git a/mods/ca/bits/audio/c2_upgrade.aud b/mods/ca/bits/audio/c2_upgrade.aud new file mode 100644 index 0000000000..f2736c9457 Binary files /dev/null and b/mods/ca/bits/audio/c2_upgrade.aud differ diff --git a/mods/ca/bits/audio/c2_xoavail1.aud b/mods/ca/bits/audio/c2_xoavail1.aud new file mode 100644 index 0000000000..9ff0a2ccc8 Binary files /dev/null and b/mods/ca/bits/audio/c2_xoavail1.aud differ diff --git a/mods/ca/bits/audio/c_1minr.aud b/mods/ca/bits/audio/c_1minr.aud index 42d8075f1f..1ff0bb2007 100644 Binary files a/mods/ca/bits/audio/c_1minr.aud and b/mods/ca/bits/audio/c_1minr.aud differ diff --git a/mods/ca/bits/audio/c_2minr.aud b/mods/ca/bits/audio/c_2minr.aud index 2617253432..5ce39f3c11 100644 Binary files a/mods/ca/bits/audio/c_2minr.aud and b/mods/ca/bits/audio/c_2minr.aud differ diff --git a/mods/ca/bits/audio/c_3minr.aud b/mods/ca/bits/audio/c_3minr.aud index f11103be9b..43191e7ea3 100644 Binary files a/mods/ca/bits/audio/c_3minr.aud and b/mods/ca/bits/audio/c_3minr.aud differ diff --git a/mods/ca/bits/audio/c_4minr.aud b/mods/ca/bits/audio/c_4minr.aud index 854877dd03..5c6213403a 100644 Binary files a/mods/ca/bits/audio/c_4minr.aud and b/mods/ca/bits/audio/c_4minr.aud differ diff --git a/mods/ca/bits/audio/c_5minr.aud b/mods/ca/bits/audio/c_5minr.aud index 91a66e94d8..37bdd334c4 100644 Binary files a/mods/ca/bits/audio/c_5minr.aud and b/mods/ca/bits/audio/c_5minr.aud differ diff --git a/mods/ca/bits/audio/c_aavail1.aud b/mods/ca/bits/audio/c_aavail1.aud index bf94e5479d..30da8372bc 100644 Binary files a/mods/ca/bits/audio/c_aavail1.aud and b/mods/ca/bits/audio/c_aavail1.aud differ diff --git a/mods/ca/bits/audio/c_abldgin1.aud b/mods/ca/bits/audio/c_abldgin1.aud index a1f69c7e47..8617e72c52 100644 Binary files a/mods/ca/bits/audio/c_abldgin1.aud and b/mods/ca/bits/audio/c_abldgin1.aud differ diff --git a/mods/ca/bits/audio/c_alaunch1.aud b/mods/ca/bits/audio/c_alaunch1.aud index 1bece1dca5..eedaac5e27 100644 Binary files a/mods/ca/bits/audio/c_alaunch1.aud and b/mods/ca/bits/audio/c_alaunch1.aud differ diff --git a/mods/ca/bits/audio/c_aprep1.aud b/mods/ca/bits/audio/c_aprep1.aud index edb9769271..cc0edb801e 100644 Binary files a/mods/ca/bits/audio/c_aprep1.aud and b/mods/ca/bits/audio/c_aprep1.aud differ diff --git a/mods/ca/bits/audio/c_aready1.aud b/mods/ca/bits/audio/c_aready1.aud index e15760bea5..f9ef0ac8cc 100644 Binary files a/mods/ca/bits/audio/c_aready1.aud and b/mods/ca/bits/audio/c_aready1.aud differ diff --git a/mods/ca/bits/audio/c_armorup1.aud b/mods/ca/bits/audio/c_armorup1.aud index 063383cc78..4e68505c02 100644 Binary files a/mods/ca/bits/audio/c_armorup1.aud and b/mods/ca/bits/audio/c_armorup1.aud differ diff --git a/mods/ca/bits/audio/c_astriker1.aud b/mods/ca/bits/audio/c_astriker1.aud index 8b578f469f..c8cdb42127 100644 Binary files a/mods/ca/bits/audio/c_astriker1.aud and b/mods/ca/bits/audio/c_astriker1.aud differ diff --git a/mods/ca/bits/audio/c_aunitl1.aud b/mods/ca/bits/audio/c_aunitl1.aud index c04b9cb253..bad96f648e 100644 Binary files a/mods/ca/bits/audio/c_aunitl1.aud and b/mods/ca/bits/audio/c_aunitl1.aud differ diff --git a/mods/ca/bits/audio/c_baseatk1.aud b/mods/ca/bits/audio/c_baseatk1.aud index 15c375a592..8f653e0e47 100644 Binary files a/mods/ca/bits/audio/c_baseatk1.aud and b/mods/ca/bits/audio/c_baseatk1.aud differ diff --git a/mods/ca/bits/audio/c_bct1.aud b/mods/ca/bits/audio/c_bct1.aud index 80b155dca4..f960ca36a9 100644 Binary files a/mods/ca/bits/audio/c_bct1.aud and b/mods/ca/bits/audio/c_bct1.aud differ diff --git a/mods/ca/bits/audio/c_bctrinit.aud b/mods/ca/bits/audio/c_bctrinit.aud index 0b929d3dc0..31002bf2e4 100644 Binary files a/mods/ca/bits/audio/c_bctrinit.aud and b/mods/ca/bits/audio/c_bctrinit.aud differ diff --git a/mods/ca/bits/audio/c_bldcap1.aud b/mods/ca/bits/audio/c_bldcap1.aud new file mode 100644 index 0000000000..48a2b08c6b Binary files /dev/null and b/mods/ca/bits/audio/c_bldcap1.aud differ diff --git a/mods/ca/bits/audio/c_bldginf1.aud b/mods/ca/bits/audio/c_bldginf1.aud index eb56b8a2e8..57391bfa1b 100644 Binary files a/mods/ca/bits/audio/c_bldginf1.aud and b/mods/ca/bits/audio/c_bldginf1.aud differ diff --git a/mods/ca/bits/audio/c_bldgprg1.aud b/mods/ca/bits/audio/c_bldgprg1.aud index 885f2f8423..4131263b93 100644 Binary files a/mods/ca/bits/audio/c_bldgprg1.aud and b/mods/ca/bits/audio/c_bldgprg1.aud differ diff --git a/mods/ca/bits/audio/c_bombardment.aud b/mods/ca/bits/audio/c_bombardment.aud new file mode 100644 index 0000000000..ec375e9e99 Binary files /dev/null and b/mods/ca/bits/audio/c_bombardment.aud differ diff --git a/mods/ca/bits/audio/c_bskywarn1.aud b/mods/ca/bits/audio/c_bskywarn1.aud new file mode 100644 index 0000000000..fc34931d23 Binary files /dev/null and b/mods/ca/bits/audio/c_bskywarn1.aud differ diff --git a/mods/ca/bits/audio/c_cancld1.aud b/mods/ca/bits/audio/c_cancld1.aud index ff61bd32ee..255697472a 100644 Binary files a/mods/ca/bits/audio/c_cancld1.aud and b/mods/ca/bits/audio/c_cancld1.aud differ diff --git a/mods/ca/bits/audio/c_chemstch1.aud b/mods/ca/bits/audio/c_chemstch1.aud new file mode 100644 index 0000000000..17462a2130 Binary files /dev/null and b/mods/ca/bits/audio/c_chemstch1.aud differ diff --git a/mods/ca/bits/audio/c_chemstrdy1.aud b/mods/ca/bits/audio/c_chemstrdy1.aud new file mode 100644 index 0000000000..658cb94ba8 Binary files /dev/null and b/mods/ca/bits/audio/c_chemstrdy1.aud differ diff --git a/mods/ca/bits/audio/c_chrochr1.aud b/mods/ca/bits/audio/c_chrochr1.aud index 3bc856e852..c0d0789e4b 100644 Binary files a/mods/ca/bits/audio/c_chrochr1.aud and b/mods/ca/bits/audio/c_chrochr1.aud differ diff --git a/mods/ca/bits/audio/c_chrordy1.aud b/mods/ca/bits/audio/c_chrordy1.aud index 8c80d37095..e7af97e906 100644 Binary files a/mods/ca/bits/audio/c_chrordy1.aud and b/mods/ca/bits/audio/c_chrordy1.aud differ diff --git a/mods/ca/bits/audio/c_civdead1.aud b/mods/ca/bits/audio/c_civdead1.aud new file mode 100644 index 0000000000..08da316953 Binary files /dev/null and b/mods/ca/bits/audio/c_civdead1.aud differ diff --git a/mods/ca/bits/audio/c_clusrdy.aud b/mods/ca/bits/audio/c_clusrdy.aud index 564a9c653a..a9f9b5999c 100644 Binary files a/mods/ca/bits/audio/c_clusrdy.aud and b/mods/ca/bits/audio/c_clusrdy.aud differ diff --git a/mods/ca/bits/audio/c_cluswarn1.aud b/mods/ca/bits/audio/c_cluswarn1.aud new file mode 100644 index 0000000000..4f9b93dd4c Binary files /dev/null and b/mods/ca/bits/audio/c_cluswarn1.aud differ diff --git a/mods/ca/bits/audio/c_cmissrdy.aud b/mods/ca/bits/audio/c_cmissrdy.aud deleted file mode 100644 index 8e085b5787..0000000000 Binary files a/mods/ca/bits/audio/c_cmissrdy.aud and /dev/null differ diff --git a/mods/ca/bits/audio/c_cmissrdy1.aud b/mods/ca/bits/audio/c_cmissrdy1.aud new file mode 100644 index 0000000000..4238e559a8 Binary files /dev/null and b/mods/ca/bits/audio/c_cmissrdy1.aud differ diff --git a/mods/ca/bits/audio/c_cmisswarn1.aud b/mods/ca/bits/audio/c_cmisswarn1.aud new file mode 100644 index 0000000000..547fb9a178 Binary files /dev/null and b/mods/ca/bits/audio/c_cmisswarn1.aud differ diff --git a/mods/ca/bits/audio/c_conscmp1.aud b/mods/ca/bits/audio/c_conscmp1.aud index edebc3e040..4e66cd8790 100644 Binary files a/mods/ca/bits/audio/c_conscmp1.aud and b/mods/ca/bits/audio/c_conscmp1.aud differ diff --git a/mods/ca/bits/audio/c_credit1.aud b/mods/ca/bits/audio/c_credit1.aud index b658d4e2fc..d1c2a761c7 100644 Binary files a/mods/ca/bits/audio/c_credit1.aud and b/mods/ca/bits/audio/c_credit1.aud differ diff --git a/mods/ca/bits/audio/c_cryostormapp1.aud b/mods/ca/bits/audio/c_cryostormapp1.aud new file mode 100644 index 0000000000..a7e5a883df Binary files /dev/null and b/mods/ca/bits/audio/c_cryostormapp1.aud differ diff --git a/mods/ca/bits/audio/c_dpodrdy1.aud b/mods/ca/bits/audio/c_dpodrdy1.aud new file mode 100644 index 0000000000..88036b7de7 Binary files /dev/null and b/mods/ca/bits/audio/c_dpodrdy1.aud differ diff --git a/mods/ca/bits/audio/c_emmisrdy1.aud b/mods/ca/bits/audio/c_emmisrdy1.aud index 2204fb8ae7..67a7b48857 100644 Binary files a/mods/ca/bits/audio/c_emmisrdy1.aud and b/mods/ca/bits/audio/c_emmisrdy1.aud differ diff --git a/mods/ca/bits/audio/c_emmprep1.aud b/mods/ca/bits/audio/c_emmprep1.aud index fcbfa86c30..af239ff8ad 100644 Binary files a/mods/ca/bits/audio/c_emmprep1.aud and b/mods/ca/bits/audio/c_emmprep1.aud differ diff --git a/mods/ca/bits/audio/c_enmyunit.aud b/mods/ca/bits/audio/c_enmyunit.aud new file mode 100644 index 0000000000..46ab92f23b Binary files /dev/null and b/mods/ca/bits/audio/c_enmyunit.aud differ diff --git a/mods/ca/bits/audio/c_enmyunitsto1.aud b/mods/ca/bits/audio/c_enmyunitsto1.aud new file mode 100644 index 0000000000..de52cee884 Binary files /dev/null and b/mods/ca/bits/audio/c_enmyunitsto1.aud differ diff --git a/mods/ca/bits/audio/c_estrucx.aud b/mods/ca/bits/audio/c_estrucx.aud new file mode 100644 index 0000000000..345862ceaf Binary files /dev/null and b/mods/ca/bits/audio/c_estrucx.aud differ diff --git a/mods/ca/bits/audio/c_firepo1.aud b/mods/ca/bits/audio/c_firepo1.aud index 36132ec919..981a554316 100644 Binary files a/mods/ca/bits/audio/c_firepo1.aud and b/mods/ca/bits/audio/c_firepo1.aud differ diff --git a/mods/ca/bits/audio/c_flare1.aud b/mods/ca/bits/audio/c_flare1.aud new file mode 100644 index 0000000000..0e4665b2c6 Binary files /dev/null and b/mods/ca/bits/audio/c_flare1.aud differ diff --git a/mods/ca/bits/audio/c_forcechg1.aud b/mods/ca/bits/audio/c_forcechg1.aud index 2dc377991a..1ef7bb1336 100644 Binary files a/mods/ca/bits/audio/c_forcechg1.aud and b/mods/ca/bits/audio/c_forcechg1.aud differ diff --git a/mods/ca/bits/audio/c_forcedr1.aud b/mods/ca/bits/audio/c_forcedr1.aud index 2dbfa8c7d1..92dcf34fef 100644 Binary files a/mods/ca/bits/audio/c_forcedr1.aud and b/mods/ca/bits/audio/c_forcedr1.aud differ diff --git a/mods/ca/bits/audio/c_fsoffline.aud b/mods/ca/bits/audio/c_fsoffline.aud index 0c58336c43..04120ceda1 100644 Binary files a/mods/ca/bits/audio/c_fsoffline.aud and b/mods/ca/bits/audio/c_fsoffline.aud differ diff --git a/mods/ca/bits/audio/c_fsready.aud b/mods/ca/bits/audio/c_fsready.aud index ba79aa27ee..db3d631db2 100644 Binary files a/mods/ca/bits/audio/c_fsready.aud and b/mods/ca/bits/audio/c_fsready.aud differ diff --git a/mods/ca/bits/audio/c_gdicapt1.aud b/mods/ca/bits/audio/c_gdicapt1.aud new file mode 100644 index 0000000000..6493259ac9 Binary files /dev/null and b/mods/ca/bits/audio/c_gdicapt1.aud differ diff --git a/mods/ca/bits/audio/c_gdidead1.aud b/mods/ca/bits/audio/c_gdidead1.aud new file mode 100644 index 0000000000..35c21176fa Binary files /dev/null and b/mods/ca/bits/audio/c_gdidead1.aud differ diff --git a/mods/ca/bits/audio/c_gstruc1.aud b/mods/ca/bits/audio/c_gstruc1.aud new file mode 100644 index 0000000000..9118d5d9da Binary files /dev/null and b/mods/ca/bits/audio/c_gstruc1.aud differ diff --git a/mods/ca/bits/audio/c_harvatk1.aud b/mods/ca/bits/audio/c_harvatk1.aud new file mode 100644 index 0000000000..ae00b5856c Binary files /dev/null and b/mods/ca/bits/audio/c_harvatk1.aud differ diff --git a/mods/ca/bits/audio/c_holdtheline.aud b/mods/ca/bits/audio/c_holdtheline.aud new file mode 100644 index 0000000000..c1ea79583c Binary files /dev/null and b/mods/ca/bits/audio/c_holdtheline.aud differ diff --git a/mods/ca/bits/audio/c_intrdy1.aud b/mods/ca/bits/audio/c_intrdy1.aud new file mode 100644 index 0000000000..8dde2eb201 Binary files /dev/null and b/mods/ca/bits/audio/c_intrdy1.aud differ diff --git a/mods/ca/bits/audio/c_ioncanapp.aud b/mods/ca/bits/audio/c_ioncanapp.aud index 38f8b0c59f..0ac432c889 100644 Binary files a/mods/ca/bits/audio/c_ioncanapp.aud and b/mods/ca/bits/audio/c_ioncanapp.aud differ diff --git a/mods/ca/bits/audio/c_ionchg1.aud b/mods/ca/bits/audio/c_ionchg1.aud deleted file mode 100644 index 6536861901..0000000000 Binary files a/mods/ca/bits/audio/c_ionchg1.aud and /dev/null differ diff --git a/mods/ca/bits/audio/c_ionchrg1.aud b/mods/ca/bits/audio/c_ionchrg1.aud new file mode 100644 index 0000000000..c408c06d46 Binary files /dev/null and b/mods/ca/bits/audio/c_ionchrg1.aud differ diff --git a/mods/ca/bits/audio/c_ionredy1.aud b/mods/ca/bits/audio/c_ionredy1.aud index a519fb9b43..09a0cd8fc8 100644 Binary files a/mods/ca/bits/audio/c_ionredy1.aud and b/mods/ca/bits/audio/c_ionredy1.aud differ diff --git a/mods/ca/bits/audio/c_ironchg1.aud b/mods/ca/bits/audio/c_ironchg1.aud new file mode 100644 index 0000000000..aa01347cf0 Binary files /dev/null and b/mods/ca/bits/audio/c_ironchg1.aud differ diff --git a/mods/ca/bits/audio/c_ironchrg1.aud b/mods/ca/bits/audio/c_ironchrg1.aud deleted file mode 100644 index 78686bedd2..0000000000 Binary files a/mods/ca/bits/audio/c_ironchrg1.aud and /dev/null differ diff --git a/mods/ca/bits/audio/c_ironrdy1.aud b/mods/ca/bits/audio/c_ironrdy1.aud index 0e4f6d9d1d..6a042108c9 100644 Binary files a/mods/ca/bits/audio/c_ironrdy1.aud and b/mods/ca/bits/audio/c_ironrdy1.aud differ diff --git a/mods/ca/bits/audio/c_load1.aud b/mods/ca/bits/audio/c_load1.aud new file mode 100644 index 0000000000..7d6e685024 Binary files /dev/null and b/mods/ca/bits/audio/c_load1.aud differ diff --git a/mods/ca/bits/audio/c_lopower1.aud b/mods/ca/bits/audio/c_lopower1.aud index 5bfe37f58d..e27b252fb8 100644 Binary files a/mods/ca/bits/audio/c_lopower1.aud and b/mods/ca/bits/audio/c_lopower1.aud differ diff --git a/mods/ca/bits/audio/c_misnlst1.aud b/mods/ca/bits/audio/c_misnlst1.aud index b93dd978d2..1e89b283e0 100644 Binary files a/mods/ca/bits/audio/c_misnlst1.aud and b/mods/ca/bits/audio/c_misnlst1.aud differ diff --git a/mods/ca/bits/audio/c_misnwon1.aud b/mods/ca/bits/audio/c_misnwon1.aud index f532b70855..f5bd1f2f2c 100644 Binary files a/mods/ca/bits/audio/c_misnwon1.aud and b/mods/ca/bits/audio/c_misnwon1.aud differ diff --git a/mods/ca/bits/audio/c_missld1.aud b/mods/ca/bits/audio/c_missld1.aud index 1d0a57d112..9b3a2dab9b 100644 Binary files a/mods/ca/bits/audio/c_missld1.aud and b/mods/ca/bits/audio/c_missld1.aud differ diff --git a/mods/ca/bits/audio/c_mocash1.aud b/mods/ca/bits/audio/c_mocash1.aud deleted file mode 100644 index 0410642e5c..0000000000 Binary files a/mods/ca/bits/audio/c_mocash1.aud and /dev/null differ diff --git a/mods/ca/bits/audio/c_nanchg1.aud b/mods/ca/bits/audio/c_nanchg1.aud new file mode 100644 index 0000000000..b4006d4a1d Binary files /dev/null and b/mods/ca/bits/audio/c_nanchg1.aud differ diff --git a/mods/ca/bits/audio/c_nanrdy1.aud b/mods/ca/bits/audio/c_nanrdy1.aud new file mode 100644 index 0000000000..50676e1e89 Binary files /dev/null and b/mods/ca/bits/audio/c_nanrdy1.aud differ diff --git a/mods/ca/bits/audio/c_navylst1.aud b/mods/ca/bits/audio/c_navylst1.aud index c04b9cb253..3851809b16 100644 Binary files a/mods/ca/bits/audio/c_navylst1.aud and b/mods/ca/bits/audio/c_navylst1.aud differ diff --git a/mods/ca/bits/audio/c_newopt1.aud b/mods/ca/bits/audio/c_newopt1.aud index 746d76df5e..97bf1585e5 100644 Binary files a/mods/ca/bits/audio/c_newopt1.aud and b/mods/ca/bits/audio/c_newopt1.aud differ diff --git a/mods/ca/bits/audio/c_nobuild1.aud b/mods/ca/bits/audio/c_nobuild1.aud index c861674592..8c60d08bbc 100644 Binary files a/mods/ca/bits/audio/c_nobuild1.aud and b/mods/ca/bits/audio/c_nobuild1.aud differ diff --git a/mods/ca/bits/audio/c_nodcapt1.aud b/mods/ca/bits/audio/c_nodcapt1.aud new file mode 100644 index 0000000000..be474149de Binary files /dev/null and b/mods/ca/bits/audio/c_nodcapt1.aud differ diff --git a/mods/ca/bits/audio/c_noddead1.aud b/mods/ca/bits/audio/c_noddead1.aud new file mode 100644 index 0000000000..ebe923c6df Binary files /dev/null and b/mods/ca/bits/audio/c_noddead1.aud differ diff --git a/mods/ca/bits/audio/c_nodeply1.aud b/mods/ca/bits/audio/c_nodeply1.aud index 6378c282ed..acec2b7072 100644 Binary files a/mods/ca/bits/audio/c_nodeply1.aud and b/mods/ca/bits/audio/c_nodeply1.aud differ diff --git a/mods/ca/bits/audio/c_nofunds1.aud b/mods/ca/bits/audio/c_nofunds1.aud index 0410642e5c..cd55d66448 100644 Binary files a/mods/ca/bits/audio/c_nofunds1.aud and b/mods/ca/bits/audio/c_nofunds1.aud differ diff --git a/mods/ca/bits/audio/c_nopowr1.aud b/mods/ca/bits/audio/c_nopowr1.aud new file mode 100644 index 0000000000..d68b0d246c Binary files /dev/null and b/mods/ca/bits/audio/c_nopowr1.aud differ diff --git a/mods/ca/bits/audio/c_noredy1.aud b/mods/ca/bits/audio/c_noredy1.aud new file mode 100644 index 0000000000..e1264ec809 Binary files /dev/null and b/mods/ca/bits/audio/c_noredy1.aud differ diff --git a/mods/ca/bits/audio/c_nreprdy1.aud b/mods/ca/bits/audio/c_nreprdy1.aud new file mode 100644 index 0000000000..2416aee716 Binary files /dev/null and b/mods/ca/bits/audio/c_nreprdy1.aud differ diff --git a/mods/ca/bits/audio/c_nstruc1.aud b/mods/ca/bits/audio/c_nstruc1.aud new file mode 100644 index 0000000000..754b58e03e Binary files /dev/null and b/mods/ca/bits/audio/c_nstruc1.aud differ diff --git a/mods/ca/bits/audio/c_nuklnch1.aud b/mods/ca/bits/audio/c_nuklnch1.aud new file mode 100644 index 0000000000..4d8423840a Binary files /dev/null and b/mods/ca/bits/audio/c_nuklnch1.aud differ diff --git a/mods/ca/bits/audio/c_onhold1.aud b/mods/ca/bits/audio/c_onhold1.aud index 2b7a83141d..68318fe94d 100644 Binary files a/mods/ca/bits/audio/c_onhold1.aud and b/mods/ca/bits/audio/c_onhold1.aud differ diff --git a/mods/ca/bits/audio/c_ourtechlckd1.aud b/mods/ca/bits/audio/c_ourtechlckd1.aud new file mode 100644 index 0000000000..654b2ed14c Binary files /dev/null and b/mods/ca/bits/audio/c_ourtechlckd1.aud differ diff --git a/mods/ca/bits/audio/c_ourtechsto1.aud b/mods/ca/bits/audio/c_ourtechsto1.aud new file mode 100644 index 0000000000..6e0567f291 Binary files /dev/null and b/mods/ca/bits/audio/c_ourtechsto1.aud differ diff --git a/mods/ca/bits/audio/c_owrathwarn1.aud b/mods/ca/bits/audio/c_owrathwarn1.aud new file mode 100644 index 0000000000..1c651fb44e Binary files /dev/null and b/mods/ca/bits/audio/c_owrathwarn1.aud differ diff --git a/mods/ca/bits/audio/c_pribldg1.aud b/mods/ca/bits/audio/c_pribldg1.aud index 6f200da114..c1fe5fa239 100644 Binary files a/mods/ca/bits/audio/c_pribldg1.aud and b/mods/ca/bits/audio/c_pribldg1.aud differ diff --git a/mods/ca/bits/audio/c_progres1.aud b/mods/ca/bits/audio/c_progres1.aud index 885f2f8423..4131263b93 100644 Binary files a/mods/ca/bits/audio/c_progres1.aud and b/mods/ca/bits/audio/c_progres1.aud differ diff --git a/mods/ca/bits/audio/c_pulse1.aud b/mods/ca/bits/audio/c_pulse1.aud index b2ca6d1d16..999149616f 100644 Binary files a/mods/ca/bits/audio/c_pulse1.aud and b/mods/ca/bits/audio/c_pulse1.aud differ diff --git a/mods/ca/bits/audio/c_rdronerdy1.aud b/mods/ca/bits/audio/c_rdronerdy1.aud new file mode 100644 index 0000000000..4918a55944 Binary files /dev/null and b/mods/ca/bits/audio/c_rdronerdy1.aud differ diff --git a/mods/ca/bits/audio/c_reinfor1.aud b/mods/ca/bits/audio/c_reinfor1.aud index 09c4523c0e..8d860d75b0 100644 Binary files a/mods/ca/bits/audio/c_reinfor1.aud and b/mods/ca/bits/audio/c_reinfor1.aud differ diff --git a/mods/ca/bits/audio/c_reinforava.aud b/mods/ca/bits/audio/c_reinforava.aud index 2e4ac200d3..275423a2fd 100644 Binary files a/mods/ca/bits/audio/c_reinforava.aud and b/mods/ca/bits/audio/c_reinforava.aud differ diff --git a/mods/ca/bits/audio/c_repair1.aud b/mods/ca/bits/audio/c_repair1.aud index 292f04c4c1..08a7e529d4 100644 Binary files a/mods/ca/bits/audio/c_repair1.aud and b/mods/ca/bits/audio/c_repair1.aud differ diff --git a/mods/ca/bits/audio/c_riftwarn1.aud b/mods/ca/bits/audio/c_riftwarn1.aud new file mode 100644 index 0000000000..399ea9a0a3 Binary files /dev/null and b/mods/ca/bits/audio/c_riftwarn1.aud differ diff --git a/mods/ca/bits/audio/c_save1.aud b/mods/ca/bits/audio/c_save1.aud new file mode 100644 index 0000000000..b79e3262c3 Binary files /dev/null and b/mods/ca/bits/audio/c_save1.aud differ diff --git a/mods/ca/bits/audio/c_seekanddestroy.aud b/mods/ca/bits/audio/c_seekanddestroy.aud new file mode 100644 index 0000000000..92d3d1f7a8 Binary files /dev/null and b/mods/ca/bits/audio/c_seekanddestroy.aud differ diff --git a/mods/ca/bits/audio/c_silond1.aud b/mods/ca/bits/audio/c_silond1.aud index d181411c6a..9268436c74 100644 Binary files a/mods/ca/bits/audio/c_silond1.aud and b/mods/ca/bits/audio/c_silond1.aud differ diff --git a/mods/ca/bits/audio/c_slcttgt1.aud b/mods/ca/bits/audio/c_slcttgt1.aud index b71eba8443..db77f2b216 100644 Binary files a/mods/ca/bits/audio/c_slcttgt1.aud and b/mods/ca/bits/audio/c_slcttgt1.aud differ diff --git a/mods/ca/bits/audio/c_spypln1.aud b/mods/ca/bits/audio/c_spypln1.aud index 24185f9d07..4d813bfb95 100644 Binary files a/mods/ca/bits/audio/c_spypln1.aud and b/mods/ca/bits/audio/c_spypln1.aud differ diff --git a/mods/ca/bits/audio/c_stormapp1.aud b/mods/ca/bits/audio/c_stormapp1.aud index 6b514880a1..b31595b5e2 100644 Binary files a/mods/ca/bits/audio/c_stormapp1.aud and b/mods/ca/bits/audio/c_stormapp1.aud differ diff --git a/mods/ca/bits/audio/c_stormrdy1.aud b/mods/ca/bits/audio/c_stormrdy1.aud index 62369edeaf..8238932938 100644 Binary files a/mods/ca/bits/audio/c_stormrdy1.aud and b/mods/ca/bits/audio/c_stormrdy1.aud differ diff --git a/mods/ca/bits/audio/c_strckil1.aud b/mods/ca/bits/audio/c_strckil1.aud index dc453fa73d..596542449b 100644 Binary files a/mods/ca/bits/audio/c_strckil1.aud and b/mods/ca/bits/audio/c_strckil1.aud differ diff --git a/mods/ca/bits/audio/c_strclst1.aud b/mods/ca/bits/audio/c_strclst1.aud index f96e3a1ead..1acb515560 100644 Binary files a/mods/ca/bits/audio/c_strclst1.aud and b/mods/ca/bits/audio/c_strclst1.aud differ diff --git a/mods/ca/bits/audio/c_strucap1.aud b/mods/ca/bits/audio/c_strucap1.aud index b1acde6afe..34ed0738dc 100644 Binary files a/mods/ca/bits/audio/c_strucap1.aud and b/mods/ca/bits/audio/c_strucap1.aud differ diff --git a/mods/ca/bits/audio/c_strusld1.aud b/mods/ca/bits/audio/c_strusld1.aud index e8aa8743c9..675f115d66 100644 Binary files a/mods/ca/bits/audio/c_strusld1.aud and b/mods/ca/bits/audio/c_strusld1.aud differ diff --git a/mods/ca/bits/audio/c_suppinb.aud b/mods/ca/bits/audio/c_suppinb.aud index 41b2f844d2..f607b19c02 100644 Binary files a/mods/ca/bits/audio/c_suppinb.aud and b/mods/ca/bits/audio/c_suppinb.aud differ diff --git a/mods/ca/bits/audio/c_surgicalrdy1.aud b/mods/ca/bits/audio/c_surgicalrdy1.aud new file mode 100644 index 0000000000..1065e3783f Binary files /dev/null and b/mods/ca/bits/audio/c_surgicalrdy1.aud differ diff --git a/mods/ca/bits/audio/c_techacq1.aud b/mods/ca/bits/audio/c_techacq1.aud new file mode 100644 index 0000000000..6cd188177a Binary files /dev/null and b/mods/ca/bits/audio/c_techacq1.aud differ diff --git a/mods/ca/bits/audio/c_techlckd1.aud b/mods/ca/bits/audio/c_techlckd1.aud new file mode 100644 index 0000000000..6bd2aeb214 Binary files /dev/null and b/mods/ca/bits/audio/c_techlckd1.aud differ diff --git a/mods/ca/bits/audio/c_train1.aud b/mods/ca/bits/audio/c_train1.aud index 434f1f93b2..84fc1157ab 100644 Binary files a/mods/ca/bits/audio/c_train1.aud and b/mods/ca/bits/audio/c_train1.aud differ diff --git a/mods/ca/bits/audio/c_unitlst1.aud b/mods/ca/bits/audio/c_unitlst1.aud index c04b9cb253..142f5ad570 100644 Binary files a/mods/ca/bits/audio/c_unitlst1.aud and b/mods/ca/bits/audio/c_unitlst1.aud differ diff --git a/mods/ca/bits/audio/c_unitrdy1.aud b/mods/ca/bits/audio/c_unitrdy1.aud index e4e2da5d85..9f7898eda6 100644 Binary files a/mods/ca/bits/audio/c_unitrdy1.aud and b/mods/ca/bits/audio/c_unitrdy1.aud differ diff --git a/mods/ca/bits/audio/c_unitrep1.aud b/mods/ca/bits/audio/c_unitrep1.aud index 8896a55638..f4ab7217ac 100644 Binary files a/mods/ca/bits/audio/c_unitrep1.aud and b/mods/ca/bits/audio/c_unitrep1.aud differ diff --git a/mods/ca/bits/audio/c_unitsld1.aud b/mods/ca/bits/audio/c_unitsld1.aud index faf6455c9d..3e5205be19 100644 Binary files a/mods/ca/bits/audio/c_unitsld1.aud and b/mods/ca/bits/audio/c_unitsld1.aud differ diff --git a/mods/ca/bits/audio/c_unitspd1.aud b/mods/ca/bits/audio/c_unitspd1.aud index 47d3a08be1..d2557ff883 100644 Binary files a/mods/ca/bits/audio/c_unitspd1.aud and b/mods/ca/bits/audio/c_unitspd1.aud differ diff --git a/mods/ca/bits/audio/c_unitsto.aud b/mods/ca/bits/audio/c_unitsto.aud index c04b9cb253..57815df34d 100644 Binary files a/mods/ca/bits/audio/c_unitsto.aud and b/mods/ca/bits/audio/c_unitsto.aud differ diff --git a/mods/ca/bits/audio/c_unitupg1.aud b/mods/ca/bits/audio/c_unitupg1.aud index 6973a93d41..6242a27f77 100644 Binary files a/mods/ca/bits/audio/c_unitupg1.aud and b/mods/ca/bits/audio/c_unitupg1.aud differ diff --git a/mods/ca/bits/audio/c_upgrade.aud b/mods/ca/bits/audio/c_upgrade.aud index e397d308ca..9798f9f338 100644 Binary files a/mods/ca/bits/audio/c_upgrade.aud and b/mods/ca/bits/audio/c_upgrade.aud differ diff --git a/mods/ca/bits/audio/c_xoavail1.aud b/mods/ca/bits/audio/c_xoavail1.aud new file mode 100644 index 0000000000..9e47e5e60d Binary files /dev/null and b/mods/ca/bits/audio/c_xoavail1.aud differ diff --git a/mods/ca/bits/audio/cashturntd.aud b/mods/ca/bits/audio/cashturntd.aud new file mode 100644 index 0000000000..d800300dbf Binary files /dev/null and b/mods/ca/bits/audio/cashturntd.aud differ diff --git a/mods/ca/bits/audio/cdog-action1.aud b/mods/ca/bits/audio/cdog-action1.aud new file mode 100644 index 0000000000..c8fc025834 Binary files /dev/null and b/mods/ca/bits/audio/cdog-action1.aud differ diff --git a/mods/ca/bits/audio/cdog-attack1.aud b/mods/ca/bits/audio/cdog-attack1.aud new file mode 100644 index 0000000000..1ae6e76656 Binary files /dev/null and b/mods/ca/bits/audio/cdog-attack1.aud differ diff --git a/mods/ca/bits/audio/cdog-die1.aud b/mods/ca/bits/audio/cdog-die1.aud new file mode 100644 index 0000000000..98b59dd9c8 Binary files /dev/null and b/mods/ca/bits/audio/cdog-die1.aud differ diff --git a/mods/ca/bits/audio/cdog-die2.aud b/mods/ca/bits/audio/cdog-die2.aud new file mode 100644 index 0000000000..c887ff7c76 Binary files /dev/null and b/mods/ca/bits/audio/cdog-die2.aud differ diff --git a/mods/ca/bits/audio/cdog-die3.aud b/mods/ca/bits/audio/cdog-die3.aud new file mode 100644 index 0000000000..72eb9d46fa Binary files /dev/null and b/mods/ca/bits/audio/cdog-die3.aud differ diff --git a/mods/ca/bits/audio/cdog-select1.aud b/mods/ca/bits/audio/cdog-select1.aud new file mode 100644 index 0000000000..be940b4eec Binary files /dev/null and b/mods/ca/bits/audio/cdog-select1.aud differ diff --git a/mods/ca/bits/audio/chronoprep.aud b/mods/ca/bits/audio/chronoprep.aud new file mode 100644 index 0000000000..bfafe8d78c Binary files /dev/null and b/mods/ca/bits/audio/chronoprep.aud differ diff --git a/mods/ca/bits/audio/cjetbanb.aud b/mods/ca/bits/audio/cjetbanb.aud new file mode 100644 index 0000000000..03949057df Binary files /dev/null and b/mods/ca/bits/audio/cjetbanb.aud differ diff --git a/mods/ca/bits/audio/cjetbanc.aud b/mods/ca/bits/audio/cjetbanc.aud new file mode 100644 index 0000000000..43fa55e83a Binary files /dev/null and b/mods/ca/bits/audio/cjetbanc.aud differ diff --git a/mods/ca/bits/audio/click.aud b/mods/ca/bits/audio/click.aud new file mode 100644 index 0000000000..3b241c3251 Binary files /dev/null and b/mods/ca/bits/audio/click.aud differ diff --git a/mods/ca/bits/audio/cloak5md.aud b/mods/ca/bits/audio/cloak5md.aud new file mode 100644 index 0000000000..3002813956 Binary files /dev/null and b/mods/ca/bits/audio/cloak5md.aud differ diff --git a/mods/ca/bits/audio/cloak5sm.aud b/mods/ca/bits/audio/cloak5sm.aud new file mode 100644 index 0000000000..2f174fc332 Binary files /dev/null and b/mods/ca/bits/audio/cloak5sm.aud differ diff --git a/mods/ca/bits/audio/cmecrepair.aud b/mods/ca/bits/audio/cmecrepair.aud new file mode 100644 index 0000000000..31b3c23e66 Binary files /dev/null and b/mods/ca/bits/audio/cmecrepair.aud differ diff --git a/mods/ca/bits/audio/cmsr-action1.aud b/mods/ca/bits/audio/cmsr-action1.aud new file mode 100644 index 0000000000..0f35a9b3f9 Binary files /dev/null and b/mods/ca/bits/audio/cmsr-action1.aud differ diff --git a/mods/ca/bits/audio/cmsr-action2.aud b/mods/ca/bits/audio/cmsr-action2.aud new file mode 100644 index 0000000000..079c7670f7 Binary files /dev/null and b/mods/ca/bits/audio/cmsr-action2.aud differ diff --git a/mods/ca/bits/audio/cmsr-action3.aud b/mods/ca/bits/audio/cmsr-action3.aud new file mode 100644 index 0000000000..a8bf120cd6 Binary files /dev/null and b/mods/ca/bits/audio/cmsr-action3.aud differ diff --git a/mods/ca/bits/audio/cmsr-action4.aud b/mods/ca/bits/audio/cmsr-action4.aud new file mode 100644 index 0000000000..481c5a54c0 Binary files /dev/null and b/mods/ca/bits/audio/cmsr-action4.aud differ diff --git a/mods/ca/bits/audio/cmsr-action5.aud b/mods/ca/bits/audio/cmsr-action5.aud new file mode 100644 index 0000000000..b10aec27a3 Binary files /dev/null and b/mods/ca/bits/audio/cmsr-action5.aud differ diff --git a/mods/ca/bits/audio/cmsr-action6.aud b/mods/ca/bits/audio/cmsr-action6.aud new file mode 100644 index 0000000000..7f0c5127b1 Binary files /dev/null and b/mods/ca/bits/audio/cmsr-action6.aud differ diff --git a/mods/ca/bits/audio/cmsr-select1.aud b/mods/ca/bits/audio/cmsr-select1.aud new file mode 100644 index 0000000000..06c79c7cd6 Binary files /dev/null and b/mods/ca/bits/audio/cmsr-select1.aud differ diff --git a/mods/ca/bits/audio/cmsr-select2.aud b/mods/ca/bits/audio/cmsr-select2.aud new file mode 100644 index 0000000000..77b85c39d2 Binary files /dev/null and b/mods/ca/bits/audio/cmsr-select2.aud differ diff --git a/mods/ca/bits/audio/cmsr-select3.aud b/mods/ca/bits/audio/cmsr-select3.aud new file mode 100644 index 0000000000..07e84d3815 Binary files /dev/null and b/mods/ca/bits/audio/cmsr-select3.aud differ diff --git a/mods/ca/bits/audio/cmsr-select4.aud b/mods/ca/bits/audio/cmsr-select4.aud new file mode 100644 index 0000000000..bd2b9de2dc Binary files /dev/null and b/mods/ca/bits/audio/cmsr-select4.aud differ diff --git a/mods/ca/bits/audio/conf-attack1.aud b/mods/ca/bits/audio/conf-attack1.aud new file mode 100644 index 0000000000..bab258ebae Binary files /dev/null and b/mods/ca/bits/audio/conf-attack1.aud differ diff --git a/mods/ca/bits/audio/conf-attack2.aud b/mods/ca/bits/audio/conf-attack2.aud new file mode 100644 index 0000000000..d7608162e2 Binary files /dev/null and b/mods/ca/bits/audio/conf-attack2.aud differ diff --git a/mods/ca/bits/audio/conf-create.aud b/mods/ca/bits/audio/conf-create.aud new file mode 100644 index 0000000000..17bb425db4 Binary files /dev/null and b/mods/ca/bits/audio/conf-create.aud differ diff --git a/mods/ca/bits/audio/conf-fire1.aud b/mods/ca/bits/audio/conf-fire1.aud new file mode 100644 index 0000000000..d9a02d9aee Binary files /dev/null and b/mods/ca/bits/audio/conf-fire1.aud differ diff --git a/mods/ca/bits/audio/conf-fire2.aud b/mods/ca/bits/audio/conf-fire2.aud new file mode 100644 index 0000000000..82ce540a88 Binary files /dev/null and b/mods/ca/bits/audio/conf-fire2.aud differ diff --git a/mods/ca/bits/audio/conf-move1.aud b/mods/ca/bits/audio/conf-move1.aud new file mode 100644 index 0000000000..0c3509cbd2 Binary files /dev/null and b/mods/ca/bits/audio/conf-move1.aud differ diff --git a/mods/ca/bits/audio/conf-move2.aud b/mods/ca/bits/audio/conf-move2.aud new file mode 100644 index 0000000000..296bec4df7 Binary files /dev/null and b/mods/ca/bits/audio/conf-move2.aud differ diff --git a/mods/ca/bits/audio/conf-move3.aud b/mods/ca/bits/audio/conf-move3.aud new file mode 100644 index 0000000000..5e4eea7ac6 Binary files /dev/null and b/mods/ca/bits/audio/conf-move3.aud differ diff --git a/mods/ca/bits/audio/conf-move4.aud b/mods/ca/bits/audio/conf-move4.aud new file mode 100644 index 0000000000..8e94ae4913 Binary files /dev/null and b/mods/ca/bits/audio/conf-move4.aud differ diff --git a/mods/ca/bits/audio/conf-move5.aud b/mods/ca/bits/audio/conf-move5.aud new file mode 100644 index 0000000000..780e3a2fe3 Binary files /dev/null and b/mods/ca/bits/audio/conf-move5.aud differ diff --git a/mods/ca/bits/audio/conf-select1.aud b/mods/ca/bits/audio/conf-select1.aud new file mode 100644 index 0000000000..d300375789 Binary files /dev/null and b/mods/ca/bits/audio/conf-select1.aud differ diff --git a/mods/ca/bits/audio/conf-select2.aud b/mods/ca/bits/audio/conf-select2.aud new file mode 100644 index 0000000000..368cd17027 Binary files /dev/null and b/mods/ca/bits/audio/conf-select2.aud differ diff --git a/mods/ca/bits/audio/conf-select3.aud b/mods/ca/bits/audio/conf-select3.aud new file mode 100644 index 0000000000..93dc8ae42d Binary files /dev/null and b/mods/ca/bits/audio/conf-select3.aud differ diff --git a/mods/ca/bits/audio/crossrip.aud b/mods/ca/bits/audio/crossrip.aud new file mode 100644 index 0000000000..9cd8bb34f6 Binary files /dev/null and b/mods/ca/bits/audio/crossrip.aud differ diff --git a/mods/ca/bits/audio/cryobeam.aud b/mods/ca/bits/audio/cryobeam.aud new file mode 100644 index 0000000000..a53a83c6b8 Binary files /dev/null and b/mods/ca/bits/audio/cryobeam.aud differ diff --git a/mods/ca/bits/audio/cryobeamend.aud b/mods/ca/bits/audio/cryobeamend.aud new file mode 100644 index 0000000000..0b40dd03e6 Binary files /dev/null and b/mods/ca/bits/audio/cryobeamend.aud differ diff --git a/mods/ca/bits/audio/cryobeamstart.aud b/mods/ca/bits/audio/cryobeamstart.aud new file mode 100644 index 0000000000..0872441792 Binary files /dev/null and b/mods/ca/bits/audio/cryobeamstart.aud differ diff --git a/mods/ca/bits/audio/cryostorm.aud b/mods/ca/bits/audio/cryostorm.aud new file mode 100644 index 0000000000..4924b8adef Binary files /dev/null and b/mods/ca/bits/audio/cryostorm.aud differ diff --git a/mods/ca/bits/audio/cryostormstart.aud b/mods/ca/bits/audio/cryostormstart.aud new file mode 100644 index 0000000000..d58915bb12 Binary files /dev/null and b/mods/ca/bits/audio/cryostormstart.aud differ diff --git a/mods/ca/bits/audio/cryt-attack1.aud b/mods/ca/bits/audio/cryt-attack1.aud new file mode 100644 index 0000000000..353337a3bf Binary files /dev/null and b/mods/ca/bits/audio/cryt-attack1.aud differ diff --git a/mods/ca/bits/audio/cryt-attack2.aud b/mods/ca/bits/audio/cryt-attack2.aud new file mode 100644 index 0000000000..f382efb2ec Binary files /dev/null and b/mods/ca/bits/audio/cryt-attack2.aud differ diff --git a/mods/ca/bits/audio/cryt-attack3.aud b/mods/ca/bits/audio/cryt-attack3.aud new file mode 100644 index 0000000000..5ecbbfd441 Binary files /dev/null and b/mods/ca/bits/audio/cryt-attack3.aud differ diff --git a/mods/ca/bits/audio/cryt-die1.aud b/mods/ca/bits/audio/cryt-die1.aud new file mode 100644 index 0000000000..d74037330d Binary files /dev/null and b/mods/ca/bits/audio/cryt-die1.aud differ diff --git a/mods/ca/bits/audio/cryt-die2.aud b/mods/ca/bits/audio/cryt-die2.aud new file mode 100644 index 0000000000..38544f4a0b Binary files /dev/null and b/mods/ca/bits/audio/cryt-die2.aud differ diff --git a/mods/ca/bits/audio/cryt-die3.aud b/mods/ca/bits/audio/cryt-die3.aud new file mode 100644 index 0000000000..58c2b506bc Binary files /dev/null and b/mods/ca/bits/audio/cryt-die3.aud differ diff --git a/mods/ca/bits/audio/cryt-move1.aud b/mods/ca/bits/audio/cryt-move1.aud new file mode 100644 index 0000000000..c53fb5d119 Binary files /dev/null and b/mods/ca/bits/audio/cryt-move1.aud differ diff --git a/mods/ca/bits/audio/cryt-move2.aud b/mods/ca/bits/audio/cryt-move2.aud new file mode 100644 index 0000000000..170674fdf8 Binary files /dev/null and b/mods/ca/bits/audio/cryt-move2.aud differ diff --git a/mods/ca/bits/audio/cryt-move3.aud b/mods/ca/bits/audio/cryt-move3.aud new file mode 100644 index 0000000000..00f649ca99 Binary files /dev/null and b/mods/ca/bits/audio/cryt-move3.aud differ diff --git a/mods/ca/bits/audio/cryt-move4.aud b/mods/ca/bits/audio/cryt-move4.aud new file mode 100644 index 0000000000..a2e232e18c Binary files /dev/null and b/mods/ca/bits/audio/cryt-move4.aud differ diff --git a/mods/ca/bits/audio/cryt-move5.aud b/mods/ca/bits/audio/cryt-move5.aud new file mode 100644 index 0000000000..8a7f782de3 Binary files /dev/null and b/mods/ca/bits/audio/cryt-move5.aud differ diff --git a/mods/ca/bits/audio/cryt-select1.aud b/mods/ca/bits/audio/cryt-select1.aud new file mode 100644 index 0000000000..261e8510df Binary files /dev/null and b/mods/ca/bits/audio/cryt-select1.aud differ diff --git a/mods/ca/bits/audio/cryt-select2.aud b/mods/ca/bits/audio/cryt-select2.aud new file mode 100644 index 0000000000..304c89b300 Binary files /dev/null and b/mods/ca/bits/audio/cryt-select2.aud differ diff --git a/mods/ca/bits/audio/cryt-select3.aud b/mods/ca/bits/audio/cryt-select3.aud new file mode 100644 index 0000000000..d520e1f28c Binary files /dev/null and b/mods/ca/bits/audio/cryt-select3.aud differ diff --git a/mods/ca/bits/audio/cryt-select4.aud b/mods/ca/bits/audio/cryt-select4.aud new file mode 100644 index 0000000000..b1d2ae7d51 Binary files /dev/null and b/mods/ca/bits/audio/cryt-select4.aud differ diff --git a/mods/ca/bits/audio/custheal.aud b/mods/ca/bits/audio/custheal.aud new file mode 100644 index 0000000000..14a7342150 Binary files /dev/null and b/mods/ca/bits/audio/custheal.aud differ diff --git a/mods/ca/bits/audio/decoydespawn.aud b/mods/ca/bits/audio/decoydespawn.aud new file mode 100644 index 0000000000..0534f5a4f5 Binary files /dev/null and b/mods/ca/bits/audio/decoydespawn.aud differ diff --git a/mods/ca/bits/audio/decoyspawn.aud b/mods/ca/bits/audio/decoyspawn.aud new file mode 100644 index 0000000000..546582f964 Binary files /dev/null and b/mods/ca/bits/audio/decoyspawn.aud differ diff --git a/mods/ca/bits/audio/delpatk1.aud b/mods/ca/bits/audio/delpatk1.aud new file mode 100644 index 0000000000..36670bfe02 Binary files /dev/null and b/mods/ca/bits/audio/delpatk1.aud differ diff --git a/mods/ca/bits/audio/delpatk2.aud b/mods/ca/bits/audio/delpatk2.aud new file mode 100644 index 0000000000..cad842448f Binary files /dev/null and b/mods/ca/bits/audio/delpatk2.aud differ diff --git a/mods/ca/bits/audio/diskatk1.aud b/mods/ca/bits/audio/diskatk1.aud new file mode 100644 index 0000000000..6fd8601a48 Binary files /dev/null and b/mods/ca/bits/audio/diskatk1.aud differ diff --git a/mods/ca/bits/audio/diskatk2.aud b/mods/ca/bits/audio/diskatk2.aud new file mode 100644 index 0000000000..f1dd0e0b16 Binary files /dev/null and b/mods/ca/bits/audio/diskatk2.aud differ diff --git a/mods/ca/bits/audio/diskatk3.aud b/mods/ca/bits/audio/diskatk3.aud new file mode 100644 index 0000000000..b5cd130c9e Binary files /dev/null and b/mods/ca/bits/audio/diskatk3.aud differ diff --git a/mods/ca/bits/audio/diskatk4.aud b/mods/ca/bits/audio/diskatk4.aud new file mode 100644 index 0000000000..5d9940b8be Binary files /dev/null and b/mods/ca/bits/audio/diskatk4.aud differ diff --git a/mods/ca/bits/audio/diskatk5.aud b/mods/ca/bits/audio/diskatk5.aud new file mode 100644 index 0000000000..f6cd775d68 Binary files /dev/null and b/mods/ca/bits/audio/diskatk5.aud differ diff --git a/mods/ca/bits/audio/diskcashdraw1.aud b/mods/ca/bits/audio/diskcashdraw1.aud new file mode 100644 index 0000000000..beab0deb7a Binary files /dev/null and b/mods/ca/bits/audio/diskcashdraw1.aud differ diff --git a/mods/ca/bits/audio/diskcashdraw2.aud b/mods/ca/bits/audio/diskcashdraw2.aud new file mode 100644 index 0000000000..87e568c87e Binary files /dev/null and b/mods/ca/bits/audio/diskcashdraw2.aud differ diff --git a/mods/ca/bits/audio/diskcashdraw3.aud b/mods/ca/bits/audio/diskcashdraw3.aud new file mode 100644 index 0000000000..c1e25b377e Binary files /dev/null and b/mods/ca/bits/audio/diskcashdraw3.aud differ diff --git a/mods/ca/bits/audio/diskdie1.aud b/mods/ca/bits/audio/diskdie1.aud new file mode 100644 index 0000000000..9b1f5850d3 Binary files /dev/null and b/mods/ca/bits/audio/diskdie1.aud differ diff --git a/mods/ca/bits/audio/diskdisdraw1.aud b/mods/ca/bits/audio/diskdisdraw1.aud new file mode 100644 index 0000000000..68451e720d Binary files /dev/null and b/mods/ca/bits/audio/diskdisdraw1.aud differ diff --git a/mods/ca/bits/audio/diskdisdraw2.aud b/mods/ca/bits/audio/diskdisdraw2.aud new file mode 100644 index 0000000000..11bd8f01c4 Binary files /dev/null and b/mods/ca/bits/audio/diskdisdraw2.aud differ diff --git a/mods/ca/bits/audio/disklaserfs1.aud b/mods/ca/bits/audio/disklaserfs1.aud new file mode 100644 index 0000000000..0235f77920 Binary files /dev/null and b/mods/ca/bits/audio/disklaserfs1.aud differ diff --git a/mods/ca/bits/audio/diskmolp1a.aud b/mods/ca/bits/audio/diskmolp1a.aud new file mode 100644 index 0000000000..7d623750d0 Binary files /dev/null and b/mods/ca/bits/audio/diskmolp1a.aud differ diff --git a/mods/ca/bits/audio/diskmolp2a.aud b/mods/ca/bits/audio/diskmolp2a.aud new file mode 100644 index 0000000000..703ea63dcb Binary files /dev/null and b/mods/ca/bits/audio/diskmolp2a.aud differ diff --git a/mods/ca/bits/audio/diskmolp2b.aud b/mods/ca/bits/audio/diskmolp2b.aud new file mode 100644 index 0000000000..b34fe76c55 Binary files /dev/null and b/mods/ca/bits/audio/diskmolp2b.aud differ diff --git a/mods/ca/bits/audio/diskmolp3a.aud b/mods/ca/bits/audio/diskmolp3a.aud new file mode 100644 index 0000000000..f44ea29848 Binary files /dev/null and b/mods/ca/bits/audio/diskmolp3a.aud differ diff --git a/mods/ca/bits/audio/diskmove1.aud b/mods/ca/bits/audio/diskmove1.aud new file mode 100644 index 0000000000..18ddbfec7e Binary files /dev/null and b/mods/ca/bits/audio/diskmove1.aud differ diff --git a/mods/ca/bits/audio/diskmove2.aud b/mods/ca/bits/audio/diskmove2.aud new file mode 100644 index 0000000000..a9fffbadf2 Binary files /dev/null and b/mods/ca/bits/audio/diskmove2.aud differ diff --git a/mods/ca/bits/audio/diskmove3.aud b/mods/ca/bits/audio/diskmove3.aud new file mode 100644 index 0000000000..94bcdb01fe Binary files /dev/null and b/mods/ca/bits/audio/diskmove3.aud differ diff --git a/mods/ca/bits/audio/diskmove4.aud b/mods/ca/bits/audio/diskmove4.aud new file mode 100644 index 0000000000..1437e1acf5 Binary files /dev/null and b/mods/ca/bits/audio/diskmove4.aud differ diff --git a/mods/ca/bits/audio/diskslt1.aud b/mods/ca/bits/audio/diskslt1.aud new file mode 100644 index 0000000000..10d8071c7d Binary files /dev/null and b/mods/ca/bits/audio/diskslt1.aud differ diff --git a/mods/ca/bits/audio/diskslt2.aud b/mods/ca/bits/audio/diskslt2.aud new file mode 100644 index 0000000000..d952007f13 Binary files /dev/null and b/mods/ca/bits/audio/diskslt2.aud differ diff --git a/mods/ca/bits/audio/diskslt3.aud b/mods/ca/bits/audio/diskslt3.aud new file mode 100644 index 0000000000..57c5645f96 Binary files /dev/null and b/mods/ca/bits/audio/diskslt3.aud differ diff --git a/mods/ca/bits/audio/diskslt4.aud b/mods/ca/bits/audio/diskslt4.aud new file mode 100644 index 0000000000..073f9a2c6e Binary files /dev/null and b/mods/ca/bits/audio/diskslt4.aud differ diff --git a/mods/ca/bits/audio/eaffirm1_sov.aud b/mods/ca/bits/audio/eaffirm1_sov.aud new file mode 100644 index 0000000000..12d0bebc49 Binary files /dev/null and b/mods/ca/bits/audio/eaffirm1_sov.aud differ diff --git a/mods/ca/bits/audio/eengin1_sov.aud b/mods/ca/bits/audio/eengin1_sov.aud new file mode 100644 index 0000000000..243af4d8bb Binary files /dev/null and b/mods/ca/bits/audio/eengin1_sov.aud differ diff --git a/mods/ca/bits/audio/emovout1_sov.aud b/mods/ca/bits/audio/emovout1_sov.aud new file mode 100644 index 0000000000..2996fe59a4 Binary files /dev/null and b/mods/ca/bits/audio/emovout1_sov.aud differ diff --git a/mods/ca/bits/audio/enfo-attack1.aud b/mods/ca/bits/audio/enfo-attack1.aud new file mode 100644 index 0000000000..777c08bdd7 Binary files /dev/null and b/mods/ca/bits/audio/enfo-attack1.aud differ diff --git a/mods/ca/bits/audio/enfo-attack2.aud b/mods/ca/bits/audio/enfo-attack2.aud new file mode 100644 index 0000000000..cb3adc3208 Binary files /dev/null and b/mods/ca/bits/audio/enfo-attack2.aud differ diff --git a/mods/ca/bits/audio/enfo-attack3.aud b/mods/ca/bits/audio/enfo-attack3.aud new file mode 100644 index 0000000000..e585dad12a Binary files /dev/null and b/mods/ca/bits/audio/enfo-attack3.aud differ diff --git a/mods/ca/bits/audio/enfo-attack4.aud b/mods/ca/bits/audio/enfo-attack4.aud new file mode 100644 index 0000000000..136d670c57 Binary files /dev/null and b/mods/ca/bits/audio/enfo-attack4.aud differ diff --git a/mods/ca/bits/audio/enfo-die1.aud b/mods/ca/bits/audio/enfo-die1.aud new file mode 100644 index 0000000000..b3bc37171b Binary files /dev/null and b/mods/ca/bits/audio/enfo-die1.aud differ diff --git a/mods/ca/bits/audio/enfo-die2.aud b/mods/ca/bits/audio/enfo-die2.aud new file mode 100644 index 0000000000..2a3ceddd85 Binary files /dev/null and b/mods/ca/bits/audio/enfo-die2.aud differ diff --git a/mods/ca/bits/audio/enfo-die3.aud b/mods/ca/bits/audio/enfo-die3.aud new file mode 100644 index 0000000000..04fb6bf71f Binary files /dev/null and b/mods/ca/bits/audio/enfo-die3.aud differ diff --git a/mods/ca/bits/audio/enfo-fire1.aud b/mods/ca/bits/audio/enfo-fire1.aud new file mode 100644 index 0000000000..579247769d Binary files /dev/null and b/mods/ca/bits/audio/enfo-fire1.aud differ diff --git a/mods/ca/bits/audio/enfo-fire2.aud b/mods/ca/bits/audio/enfo-fire2.aud new file mode 100644 index 0000000000..1c832ef8af Binary files /dev/null and b/mods/ca/bits/audio/enfo-fire2.aud differ diff --git a/mods/ca/bits/audio/enfo-move1.aud b/mods/ca/bits/audio/enfo-move1.aud new file mode 100644 index 0000000000..453d8794d5 Binary files /dev/null and b/mods/ca/bits/audio/enfo-move1.aud differ diff --git a/mods/ca/bits/audio/enfo-move2.aud b/mods/ca/bits/audio/enfo-move2.aud new file mode 100644 index 0000000000..ec3c5960e1 Binary files /dev/null and b/mods/ca/bits/audio/enfo-move2.aud differ diff --git a/mods/ca/bits/audio/enfo-move3.aud b/mods/ca/bits/audio/enfo-move3.aud new file mode 100644 index 0000000000..102ac23970 Binary files /dev/null and b/mods/ca/bits/audio/enfo-move3.aud differ diff --git a/mods/ca/bits/audio/enfo-move4.aud b/mods/ca/bits/audio/enfo-move4.aud new file mode 100644 index 0000000000..214da43a27 Binary files /dev/null and b/mods/ca/bits/audio/enfo-move4.aud differ diff --git a/mods/ca/bits/audio/enfo-move5.aud b/mods/ca/bits/audio/enfo-move5.aud new file mode 100644 index 0000000000..5f9fdc3ed0 Binary files /dev/null and b/mods/ca/bits/audio/enfo-move5.aud differ diff --git a/mods/ca/bits/audio/enfo-move6.aud b/mods/ca/bits/audio/enfo-move6.aud new file mode 100644 index 0000000000..3b514ff5bd Binary files /dev/null and b/mods/ca/bits/audio/enfo-move6.aud differ diff --git a/mods/ca/bits/audio/enfo-select1.aud b/mods/ca/bits/audio/enfo-select1.aud new file mode 100644 index 0000000000..4217e94316 Binary files /dev/null and b/mods/ca/bits/audio/enfo-select1.aud differ diff --git a/mods/ca/bits/audio/enfo-select2.aud b/mods/ca/bits/audio/enfo-select2.aud new file mode 100644 index 0000000000..543638dc9e Binary files /dev/null and b/mods/ca/bits/audio/enfo-select2.aud differ diff --git a/mods/ca/bits/audio/enfo-select3.aud b/mods/ca/bits/audio/enfo-select3.aud new file mode 100644 index 0000000000..1958b008ae Binary files /dev/null and b/mods/ca/bits/audio/enfo-select3.aud differ diff --git a/mods/ca/bits/audio/enfo-select4.aud b/mods/ca/bits/audio/enfo-select4.aud new file mode 100644 index 0000000000..ae26e6a322 Binary files /dev/null and b/mods/ca/bits/audio/enfo-select4.aud differ diff --git a/mods/ca/bits/audio/enli-attack1.aud b/mods/ca/bits/audio/enli-attack1.aud new file mode 100644 index 0000000000..8263f294b8 Binary files /dev/null and b/mods/ca/bits/audio/enli-attack1.aud differ diff --git a/mods/ca/bits/audio/enli-attack2.aud b/mods/ca/bits/audio/enli-attack2.aud new file mode 100644 index 0000000000..1eeb454c37 Binary files /dev/null and b/mods/ca/bits/audio/enli-attack2.aud differ diff --git a/mods/ca/bits/audio/enli-attack3.aud b/mods/ca/bits/audio/enli-attack3.aud new file mode 100644 index 0000000000..4532413fac Binary files /dev/null and b/mods/ca/bits/audio/enli-attack3.aud differ diff --git a/mods/ca/bits/audio/enli-attack4.aud b/mods/ca/bits/audio/enli-attack4.aud new file mode 100644 index 0000000000..43e3f0172d Binary files /dev/null and b/mods/ca/bits/audio/enli-attack4.aud differ diff --git a/mods/ca/bits/audio/enli-empfire.aud b/mods/ca/bits/audio/enli-empfire.aud new file mode 100644 index 0000000000..9ea4f0d39c Binary files /dev/null and b/mods/ca/bits/audio/enli-empfire.aud differ diff --git a/mods/ca/bits/audio/enli-emphit.aud b/mods/ca/bits/audio/enli-emphit.aud new file mode 100644 index 0000000000..d913c8287b Binary files /dev/null and b/mods/ca/bits/audio/enli-emphit.aud differ diff --git a/mods/ca/bits/audio/enli-fire1.aud b/mods/ca/bits/audio/enli-fire1.aud new file mode 100644 index 0000000000..4b917adef4 Binary files /dev/null and b/mods/ca/bits/audio/enli-fire1.aud differ diff --git a/mods/ca/bits/audio/enli-fire2.aud b/mods/ca/bits/audio/enli-fire2.aud new file mode 100644 index 0000000000..533b0322ad Binary files /dev/null and b/mods/ca/bits/audio/enli-fire2.aud differ diff --git a/mods/ca/bits/audio/enli-fire3.aud b/mods/ca/bits/audio/enli-fire3.aud new file mode 100644 index 0000000000..97654b4af5 Binary files /dev/null and b/mods/ca/bits/audio/enli-fire3.aud differ diff --git a/mods/ca/bits/audio/enli-move1.aud b/mods/ca/bits/audio/enli-move1.aud new file mode 100644 index 0000000000..5fe322dd17 Binary files /dev/null and b/mods/ca/bits/audio/enli-move1.aud differ diff --git a/mods/ca/bits/audio/enli-move2.aud b/mods/ca/bits/audio/enli-move2.aud new file mode 100644 index 0000000000..017884aaa4 Binary files /dev/null and b/mods/ca/bits/audio/enli-move2.aud differ diff --git a/mods/ca/bits/audio/enli-move3.aud b/mods/ca/bits/audio/enli-move3.aud new file mode 100644 index 0000000000..28f3b31da5 Binary files /dev/null and b/mods/ca/bits/audio/enli-move3.aud differ diff --git a/mods/ca/bits/audio/enli-move4.aud b/mods/ca/bits/audio/enli-move4.aud new file mode 100644 index 0000000000..cc825323e4 Binary files /dev/null and b/mods/ca/bits/audio/enli-move4.aud differ diff --git a/mods/ca/bits/audio/enli-move5.aud b/mods/ca/bits/audio/enli-move5.aud new file mode 100644 index 0000000000..02c2c99f1a Binary files /dev/null and b/mods/ca/bits/audio/enli-move5.aud differ diff --git a/mods/ca/bits/audio/enli-select1.aud b/mods/ca/bits/audio/enli-select1.aud new file mode 100644 index 0000000000..9394b4ec23 Binary files /dev/null and b/mods/ca/bits/audio/enli-select1.aud differ diff --git a/mods/ca/bits/audio/enli-select2.aud b/mods/ca/bits/audio/enli-select2.aud new file mode 100644 index 0000000000..87b916b6fb Binary files /dev/null and b/mods/ca/bits/audio/enli-select2.aud differ diff --git a/mods/ca/bits/audio/enli-select3.aud b/mods/ca/bits/audio/enli-select3.aud new file mode 100644 index 0000000000..8771cfa5cc Binary files /dev/null and b/mods/ca/bits/audio/enli-select3.aud differ diff --git a/mods/ca/bits/audio/enli-select4.aud b/mods/ca/bits/audio/enli-select4.aud new file mode 100644 index 0000000000..3c75776c86 Binary files /dev/null and b/mods/ca/bits/audio/enli-select4.aud differ diff --git a/mods/ca/bits/audio/enli-select5.aud b/mods/ca/bits/audio/enli-select5.aud new file mode 100644 index 0000000000..4afdebf0e0 Binary files /dev/null and b/mods/ca/bits/audio/enli-select5.aud differ diff --git a/mods/ca/bits/audio/enli-select6.aud b/mods/ca/bits/audio/enli-select6.aud new file mode 100644 index 0000000000..4766e5237a Binary files /dev/null and b/mods/ca/bits/audio/enli-select6.aud differ diff --git a/mods/ca/bits/audio/eradcan1.aud b/mods/ca/bits/audio/eradcan1.aud new file mode 100644 index 0000000000..5090026a4b Binary files /dev/null and b/mods/ca/bits/audio/eradcan1.aud differ diff --git a/mods/ca/bits/audio/eyessir1_sov.aud b/mods/ca/bits/audio/eyessir1_sov.aud new file mode 100644 index 0000000000..40eaebf894 Binary files /dev/null and b/mods/ca/bits/audio/eyessir1_sov.aud differ diff --git a/mods/ca/bits/flak1.aud b/mods/ca/bits/audio/flak1.aud similarity index 100% rename from mods/ca/bits/flak1.aud rename to mods/ca/bits/audio/flak1.aud diff --git a/mods/ca/bits/flak2.aud b/mods/ca/bits/audio/flak2.aud similarity index 100% rename from mods/ca/bits/flak2.aud rename to mods/ca/bits/audio/flak2.aud diff --git a/mods/ca/bits/audio/floatk1.aud b/mods/ca/bits/audio/floatk1.aud new file mode 100644 index 0000000000..8ed7aea075 Binary files /dev/null and b/mods/ca/bits/audio/floatk1.aud differ diff --git a/mods/ca/bits/audio/gaploop1.aud b/mods/ca/bits/audio/gaploop1.aud new file mode 100644 index 0000000000..ab8797ed9e Binary files /dev/null and b/mods/ca/bits/audio/gaploop1.aud differ diff --git a/mods/ca/bits/audio/gaploop2.aud b/mods/ca/bits/audio/gaploop2.aud new file mode 100644 index 0000000000..da009d87ef Binary files /dev/null and b/mods/ca/bits/audio/gaploop2.aud differ diff --git a/mods/ca/bits/audio/gaploop3.aud b/mods/ca/bits/audio/gaploop3.aud new file mode 100644 index 0000000000..3325003a78 Binary files /dev/null and b/mods/ca/bits/audio/gaploop3.aud differ diff --git a/mods/ca/bits/audio/gapshot.aud b/mods/ca/bits/audio/gapshot.aud new file mode 100644 index 0000000000..6ccc002049 Binary files /dev/null and b/mods/ca/bits/audio/gapshot.aud differ diff --git a/mods/ca/bits/audio/gdrn-fire1.aud b/mods/ca/bits/audio/gdrn-fire1.aud index 159c52150f..f5ef146d4c 100644 Binary files a/mods/ca/bits/audio/gdrn-fire1.aud and b/mods/ca/bits/audio/gdrn-fire1.aud differ diff --git a/mods/ca/bits/audio/gdrn-fire2.aud b/mods/ca/bits/audio/gdrn-fire2.aud index 20dfa34abe..0462378bbc 100644 Binary files a/mods/ca/bits/audio/gdrn-fire2.aud and b/mods/ca/bits/audio/gdrn-fire2.aud differ diff --git a/mods/ca/bits/audio/genter1a.aud b/mods/ca/bits/audio/genter1a.aud new file mode 100644 index 0000000000..b65238a609 Binary files /dev/null and b/mods/ca/bits/audio/genter1a.aud differ diff --git a/mods/ca/bits/audio/gexit1a.aud b/mods/ca/bits/audio/gexit1a.aud new file mode 100644 index 0000000000..510338c77b Binary files /dev/null and b/mods/ca/bits/audio/gexit1a.aud differ diff --git a/mods/ca/bits/audio/gexpneua.aud b/mods/ca/bits/audio/gexpneua.aud new file mode 100644 index 0000000000..560cbf9f84 Binary files /dev/null and b/mods/ca/bits/audio/gexpneua.aud differ diff --git a/mods/ca/bits/audio/gexpneub.aud b/mods/ca/bits/audio/gexpneub.aud new file mode 100644 index 0000000000..96de1fde9e Binary files /dev/null and b/mods/ca/bits/audio/gexpneub.aud differ diff --git a/mods/ca/bits/audio/gexpneuc.aud b/mods/ca/bits/audio/gexpneuc.aud new file mode 100644 index 0000000000..16a9c8b99a Binary files /dev/null and b/mods/ca/bits/audio/gexpneuc.aud differ diff --git a/mods/ca/bits/audio/gexpneud.aud b/mods/ca/bits/audio/gexpneud.aud new file mode 100644 index 0000000000..4b788c2a20 Binary files /dev/null and b/mods/ca/bits/audio/gexpneud.aud differ diff --git a/mods/ca/bits/audio/gexpnuka.aud b/mods/ca/bits/audio/gexpnuka.aud new file mode 100644 index 0000000000..efbb893174 Binary files /dev/null and b/mods/ca/bits/audio/gexpnuka.aud differ diff --git a/mods/ca/bits/audio/ghitlaser1.aud b/mods/ca/bits/audio/ghitlaser1.aud new file mode 100644 index 0000000000..621a4d6731 Binary files /dev/null and b/mods/ca/bits/audio/ghitlaser1.aud differ diff --git a/mods/ca/bits/audio/ghitlaser2.aud b/mods/ca/bits/audio/ghitlaser2.aud new file mode 100644 index 0000000000..b8aca695af Binary files /dev/null and b/mods/ca/bits/audio/ghitlaser2.aud differ diff --git a/mods/ca/bits/audio/ghitlaser3.aud b/mods/ca/bits/audio/ghitlaser3.aud new file mode 100644 index 0000000000..14dd693856 Binary files /dev/null and b/mods/ca/bits/audio/ghitlaser3.aud differ diff --git a/mods/ca/bits/audio/gpowof.aud b/mods/ca/bits/audio/gpowof.aud new file mode 100644 index 0000000000..a0d7ba40af Binary files /dev/null and b/mods/ca/bits/audio/gpowof.aud differ diff --git a/mods/ca/bits/audio/grad-fire1.aud b/mods/ca/bits/audio/grad-fire1.aud new file mode 100644 index 0000000000..d30afc720e Binary files /dev/null and b/mods/ca/bits/audio/grad-fire1.aud differ diff --git a/mods/ca/bits/audio/grad-fire2.aud b/mods/ca/bits/audio/grad-fire2.aud new file mode 100644 index 0000000000..aeb3915ce2 Binary files /dev/null and b/mods/ca/bits/audio/grad-fire2.aud differ diff --git a/mods/ca/bits/audio/gshardhit1.aud b/mods/ca/bits/audio/gshardhit1.aud new file mode 100644 index 0000000000..4c460f8cf0 Binary files /dev/null and b/mods/ca/bits/audio/gshardhit1.aud differ diff --git a/mods/ca/bits/audio/gshardhit2.aud b/mods/ca/bits/audio/gshardhit2.aud new file mode 100644 index 0000000000..3eb6515b17 Binary files /dev/null and b/mods/ca/bits/audio/gshardhit2.aud differ diff --git a/mods/ca/bits/audio/gshardhitsm1.aud b/mods/ca/bits/audio/gshardhitsm1.aud new file mode 100644 index 0000000000..0ffb215dfb Binary files /dev/null and b/mods/ca/bits/audio/gshardhitsm1.aud differ diff --git a/mods/ca/bits/audio/gshardhitsm2.aud b/mods/ca/bits/audio/gshardhitsm2.aud new file mode 100644 index 0000000000..9dcb73dbcb Binary files /dev/null and b/mods/ca/bits/audio/gshardhitsm2.aud differ diff --git a/mods/ca/bits/audio/gshielddown.aud b/mods/ca/bits/audio/gshielddown.aud new file mode 100644 index 0000000000..7730f71259 Binary files /dev/null and b/mods/ca/bits/audio/gshielddown.aud differ diff --git a/mods/ca/bits/audio/gshieldup.aud b/mods/ca/bits/audio/gshieldup.aud new file mode 100644 index 0000000000..f06f73d6c3 Binary files /dev/null and b/mods/ca/bits/audio/gshieldup.aud differ diff --git a/mods/ca/bits/audio/gyrostabilizers.aud b/mods/ca/bits/audio/gyrostabilizers.aud new file mode 100644 index 0000000000..aca1c042b5 Binary files /dev/null and b/mods/ca/bits/audio/gyrostabilizers.aud differ diff --git a/mods/ca/bits/audio/heliosexplode.aud b/mods/ca/bits/audio/heliosexplode.aud new file mode 100644 index 0000000000..0729df9b02 Binary files /dev/null and b/mods/ca/bits/audio/heliosexplode.aud differ diff --git a/mods/ca/bits/audio/heroes.aud b/mods/ca/bits/audio/heroes.aud new file mode 100644 index 0000000000..ecd136ae5a Binary files /dev/null and b/mods/ca/bits/audio/heroes.aud differ diff --git a/mods/ca/bits/audio/hftk-attack1.aud b/mods/ca/bits/audio/hftk-attack1.aud index e995136ee9..df3a35680d 100644 Binary files a/mods/ca/bits/audio/hftk-attack1.aud and b/mods/ca/bits/audio/hftk-attack1.aud differ diff --git a/mods/ca/bits/audio/hftk-attack2.aud b/mods/ca/bits/audio/hftk-attack2.aud index 2692cb2138..096c18aa2d 100644 Binary files a/mods/ca/bits/audio/hftk-attack2.aud and b/mods/ca/bits/audio/hftk-attack2.aud differ diff --git a/mods/ca/bits/audio/hftk-attack3.aud b/mods/ca/bits/audio/hftk-attack3.aud index e504642561..d067e6a9f8 100644 Binary files a/mods/ca/bits/audio/hftk-attack3.aud and b/mods/ca/bits/audio/hftk-attack3.aud differ diff --git a/mods/ca/bits/audio/hftk-attack4.aud b/mods/ca/bits/audio/hftk-attack4.aud new file mode 100644 index 0000000000..154c56775b Binary files /dev/null and b/mods/ca/bits/audio/hftk-attack4.aud differ diff --git a/mods/ca/bits/audio/hftk-move1.aud b/mods/ca/bits/audio/hftk-move1.aud index 805222b414..9e13d23582 100644 Binary files a/mods/ca/bits/audio/hftk-move1.aud and b/mods/ca/bits/audio/hftk-move1.aud differ diff --git a/mods/ca/bits/audio/hftk-move2.aud b/mods/ca/bits/audio/hftk-move2.aud index d455ed0dd5..6737b43e91 100644 Binary files a/mods/ca/bits/audio/hftk-move2.aud and b/mods/ca/bits/audio/hftk-move2.aud differ diff --git a/mods/ca/bits/audio/hftk-move3.aud b/mods/ca/bits/audio/hftk-move3.aud index 0fab1190d8..e6d1c90aa6 100644 Binary files a/mods/ca/bits/audio/hftk-move3.aud and b/mods/ca/bits/audio/hftk-move3.aud differ diff --git a/mods/ca/bits/audio/hftk-move4.aud b/mods/ca/bits/audio/hftk-move4.aud index fecb620b63..a073d4503d 100644 Binary files a/mods/ca/bits/audio/hftk-move4.aud and b/mods/ca/bits/audio/hftk-move4.aud differ diff --git a/mods/ca/bits/audio/hftk-select1.aud b/mods/ca/bits/audio/hftk-select1.aud index f06dff42b9..a8ab691d66 100644 Binary files a/mods/ca/bits/audio/hftk-select1.aud and b/mods/ca/bits/audio/hftk-select1.aud differ diff --git a/mods/ca/bits/audio/hftk-select2.aud b/mods/ca/bits/audio/hftk-select2.aud index 0d2a728950..d5b79c1bc5 100644 Binary files a/mods/ca/bits/audio/hftk-select2.aud and b/mods/ca/bits/audio/hftk-select2.aud differ diff --git a/mods/ca/bits/audio/hftk-select3.aud b/mods/ca/bits/audio/hftk-select3.aud index bcd86aa9d3..9dc32b112f 100644 Binary files a/mods/ca/bits/audio/hftk-select3.aud and b/mods/ca/bits/audio/hftk-select3.aud differ diff --git a/mods/ca/bits/audio/hftk-select4.aud b/mods/ca/bits/audio/hftk-select4.aud index 48364f0a46..722867afb9 100644 Binary files a/mods/ca/bits/audio/hftk-select4.aud and b/mods/ca/bits/audio/hftk-select4.aud differ diff --git a/mods/ca/bits/audio/hind-rocket1.aud b/mods/ca/bits/audio/hind-rocket1.aud new file mode 100644 index 0000000000..16b33f0e03 Binary files /dev/null and b/mods/ca/bits/audio/hind-rocket1.aud differ diff --git a/mods/ca/bits/audio/hind-rocket2.aud b/mods/ca/bits/audio/hind-rocket2.aud new file mode 100644 index 0000000000..69be7d5eab Binary files /dev/null and b/mods/ca/bits/audio/hind-rocket2.aud differ diff --git a/mods/ca/bits/audio/hland2.aud b/mods/ca/bits/audio/hland2.aud new file mode 100644 index 0000000000..a38ae0c9ff Binary files /dev/null and b/mods/ca/bits/audio/hland2.aud differ diff --git a/mods/ca/bits/audio/hopl-attack1.aud b/mods/ca/bits/audio/hopl-attack1.aud new file mode 100644 index 0000000000..a6a760bcc5 Binary files /dev/null and b/mods/ca/bits/audio/hopl-attack1.aud differ diff --git a/mods/ca/bits/audio/hopl-attack2.aud b/mods/ca/bits/audio/hopl-attack2.aud new file mode 100644 index 0000000000..d5837cb612 Binary files /dev/null and b/mods/ca/bits/audio/hopl-attack2.aud differ diff --git a/mods/ca/bits/audio/hopl-attack3.aud b/mods/ca/bits/audio/hopl-attack3.aud new file mode 100644 index 0000000000..34ad6e840b Binary files /dev/null and b/mods/ca/bits/audio/hopl-attack3.aud differ diff --git a/mods/ca/bits/audio/hopl-attack4.aud b/mods/ca/bits/audio/hopl-attack4.aud new file mode 100644 index 0000000000..77f9c82a78 Binary files /dev/null and b/mods/ca/bits/audio/hopl-attack4.aud differ diff --git a/mods/ca/bits/audio/hopl-cfire1.aud b/mods/ca/bits/audio/hopl-cfire1.aud new file mode 100644 index 0000000000..cc4aba765f Binary files /dev/null and b/mods/ca/bits/audio/hopl-cfire1.aud differ diff --git a/mods/ca/bits/audio/hopl-fire1.aud b/mods/ca/bits/audio/hopl-fire1.aud new file mode 100644 index 0000000000..b2461d8dac Binary files /dev/null and b/mods/ca/bits/audio/hopl-fire1.aud differ diff --git a/mods/ca/bits/audio/hopl-move1.aud b/mods/ca/bits/audio/hopl-move1.aud new file mode 100644 index 0000000000..5f5e2a8792 Binary files /dev/null and b/mods/ca/bits/audio/hopl-move1.aud differ diff --git a/mods/ca/bits/audio/hopl-move2.aud b/mods/ca/bits/audio/hopl-move2.aud new file mode 100644 index 0000000000..3d1738cd77 Binary files /dev/null and b/mods/ca/bits/audio/hopl-move2.aud differ diff --git a/mods/ca/bits/audio/hopl-move3.aud b/mods/ca/bits/audio/hopl-move3.aud new file mode 100644 index 0000000000..da95974f6f Binary files /dev/null and b/mods/ca/bits/audio/hopl-move3.aud differ diff --git a/mods/ca/bits/audio/hopl-move4.aud b/mods/ca/bits/audio/hopl-move4.aud new file mode 100644 index 0000000000..c08e6fbe74 Binary files /dev/null and b/mods/ca/bits/audio/hopl-move4.aud differ diff --git a/mods/ca/bits/audio/hopl-select1.aud b/mods/ca/bits/audio/hopl-select1.aud new file mode 100644 index 0000000000..c2c604cac5 Binary files /dev/null and b/mods/ca/bits/audio/hopl-select1.aud differ diff --git a/mods/ca/bits/audio/hopl-select2.aud b/mods/ca/bits/audio/hopl-select2.aud new file mode 100644 index 0000000000..f6c1bb9155 Binary files /dev/null and b/mods/ca/bits/audio/hopl-select2.aud differ diff --git a/mods/ca/bits/audio/hopl-select3.aud b/mods/ca/bits/audio/hopl-select3.aud new file mode 100644 index 0000000000..419899d387 Binary files /dev/null and b/mods/ca/bits/audio/hopl-select3.aud differ diff --git a/mods/ca/bits/audio/hopl-select4.aud b/mods/ca/bits/audio/hopl-select4.aud new file mode 100644 index 0000000000..0ba9d5c8e2 Binary files /dev/null and b/mods/ca/bits/audio/hopl-select4.aud differ diff --git a/mods/ca/bits/audio/howi-fire1.aud b/mods/ca/bits/audio/howi-fire1.aud new file mode 100644 index 0000000000..cff39c8a55 Binary files /dev/null and b/mods/ca/bits/audio/howi-fire1.aud differ diff --git a/mods/ca/bits/audio/howi-fire2.aud b/mods/ca/bits/audio/howi-fire2.aud new file mode 100644 index 0000000000..918382c35c Binary files /dev/null and b/mods/ca/bits/audio/howi-fire2.aud differ diff --git a/mods/ca/bits/audio/htnkabur.aud b/mods/ca/bits/audio/htnkabur.aud new file mode 100644 index 0000000000..8223f86228 Binary files /dev/null and b/mods/ca/bits/audio/htnkabur.aud differ diff --git a/mods/ca/bits/audio/htoff2.aud b/mods/ca/bits/audio/htoff2.aud new file mode 100644 index 0000000000..4b316cdaa2 Binary files /dev/null and b/mods/ca/bits/audio/htoff2.aud differ diff --git a/mods/ca/bits/audio/hydra1.aud b/mods/ca/bits/audio/hydra1.aud new file mode 100644 index 0000000000..2368a84edd Binary files /dev/null and b/mods/ca/bits/audio/hydra1.aud differ diff --git a/mods/ca/bits/audio/hydra2.aud b/mods/ca/bits/audio/hydra2.aud new file mode 100644 index 0000000000..0ea223bbcc Binary files /dev/null and b/mods/ca/bits/audio/hydra2.aud differ diff --git a/mods/ca/bits/audio/hydrahit1.aud b/mods/ca/bits/audio/hydrahit1.aud new file mode 100644 index 0000000000..59f3feaaed Binary files /dev/null and b/mods/ca/bits/audio/hydrahit1.aud differ diff --git a/mods/ca/bits/audio/hydrahit2.aud b/mods/ca/bits/audio/hydrahit2.aud new file mode 100644 index 0000000000..a7ca528f99 Binary files /dev/null and b/mods/ca/bits/audio/hydrahit2.aud differ diff --git a/mods/ca/bits/audio/iassatk1.aud b/mods/ca/bits/audio/iassatk1.aud new file mode 100644 index 0000000000..58fab89131 Binary files /dev/null and b/mods/ca/bits/audio/iassatk1.aud differ diff --git a/mods/ca/bits/audio/iassatk2.aud b/mods/ca/bits/audio/iassatk2.aud new file mode 100644 index 0000000000..8434e5aad2 Binary files /dev/null and b/mods/ca/bits/audio/iassatk2.aud differ diff --git a/mods/ca/bits/audio/iassatk3.aud b/mods/ca/bits/audio/iassatk3.aud new file mode 100644 index 0000000000..5fb1786cc5 Binary files /dev/null and b/mods/ca/bits/audio/iassatk3.aud differ diff --git a/mods/ca/bits/audio/iassatk4.aud b/mods/ca/bits/audio/iassatk4.aud new file mode 100644 index 0000000000..41a705d27c Binary files /dev/null and b/mods/ca/bits/audio/iassatk4.aud differ diff --git a/mods/ca/bits/audio/iassatk5.aud b/mods/ca/bits/audio/iassatk5.aud new file mode 100644 index 0000000000..a57a6cc25b Binary files /dev/null and b/mods/ca/bits/audio/iassatk5.aud differ diff --git a/mods/ca/bits/audio/iassmov1.aud b/mods/ca/bits/audio/iassmov1.aud new file mode 100644 index 0000000000..356ff902bc Binary files /dev/null and b/mods/ca/bits/audio/iassmov1.aud differ diff --git a/mods/ca/bits/audio/iassmov2.aud b/mods/ca/bits/audio/iassmov2.aud new file mode 100644 index 0000000000..ad5472e9e5 Binary files /dev/null and b/mods/ca/bits/audio/iassmov2.aud differ diff --git a/mods/ca/bits/audio/iassmov3.aud b/mods/ca/bits/audio/iassmov3.aud new file mode 100644 index 0000000000..0ade94211c Binary files /dev/null and b/mods/ca/bits/audio/iassmov3.aud differ diff --git a/mods/ca/bits/audio/iassmov4.aud b/mods/ca/bits/audio/iassmov4.aud new file mode 100644 index 0000000000..8cda0115ba Binary files /dev/null and b/mods/ca/bits/audio/iassmov4.aud differ diff --git a/mods/ca/bits/audio/iassmov5.aud b/mods/ca/bits/audio/iassmov5.aud new file mode 100644 index 0000000000..3cb2451457 Binary files /dev/null and b/mods/ca/bits/audio/iassmov5.aud differ diff --git a/mods/ca/bits/audio/iassmov6.aud b/mods/ca/bits/audio/iassmov6.aud new file mode 100644 index 0000000000..3e31bdd515 Binary files /dev/null and b/mods/ca/bits/audio/iassmov6.aud differ diff --git a/mods/ca/bits/audio/iassslt1.aud b/mods/ca/bits/audio/iassslt1.aud new file mode 100644 index 0000000000..947ec55d48 Binary files /dev/null and b/mods/ca/bits/audio/iassslt1.aud differ diff --git a/mods/ca/bits/audio/iassslt2.aud b/mods/ca/bits/audio/iassslt2.aud new file mode 100644 index 0000000000..587bcc455f Binary files /dev/null and b/mods/ca/bits/audio/iassslt2.aud differ diff --git a/mods/ca/bits/audio/iassslt3.aud b/mods/ca/bits/audio/iassslt3.aud new file mode 100644 index 0000000000..cd0755f46b Binary files /dev/null and b/mods/ca/bits/audio/iassslt3.aud differ diff --git a/mods/ca/bits/audio/iassslt4.aud b/mods/ca/bits/audio/iassslt4.aud new file mode 100644 index 0000000000..b0ac070a53 Binary files /dev/null and b/mods/ca/bits/audio/iassslt4.aud differ diff --git a/mods/ca/bits/audio/iassslt5.aud b/mods/ca/bits/audio/iassslt5.aud new file mode 100644 index 0000000000..3d9bc62af2 Binary files /dev/null and b/mods/ca/bits/audio/iassslt5.aud differ diff --git a/mods/ca/bits/audio/iassslt6.aud b/mods/ca/bits/audio/iassslt6.aud new file mode 100644 index 0000000000..816f07019d Binary files /dev/null and b/mods/ca/bits/audio/iassslt6.aud differ diff --git a/mods/ca/bits/audio/icfadia.aud b/mods/ca/bits/audio/icfadia.aud new file mode 100644 index 0000000000..006ac93525 Binary files /dev/null and b/mods/ca/bits/audio/icfadia.aud differ diff --git a/mods/ca/bits/audio/icfadib.aud b/mods/ca/bits/audio/icfadib.aud new file mode 100644 index 0000000000..fd88e050a5 Binary files /dev/null and b/mods/ca/bits/audio/icfadib.aud differ diff --git a/mods/ca/bits/audio/icfadic.aud b/mods/ca/bits/audio/icfadic.aud new file mode 100644 index 0000000000..3b50760f93 Binary files /dev/null and b/mods/ca/bits/audio/icfadic.aud differ diff --git a/mods/ca/bits/audio/icivatta.aud b/mods/ca/bits/audio/icivatta.aud new file mode 100644 index 0000000000..75f75f8f81 Binary files /dev/null and b/mods/ca/bits/audio/icivatta.aud differ diff --git a/mods/ca/bits/audio/icivattb.aud b/mods/ca/bits/audio/icivattb.aud new file mode 100644 index 0000000000..a7c0cc8d84 Binary files /dev/null and b/mods/ca/bits/audio/icivattb.aud differ diff --git a/mods/ca/bits/audio/ifvmg1.aud b/mods/ca/bits/audio/ifvmg1.aud index 6aa3b158fd..1387851dc7 100644 Binary files a/mods/ca/bits/audio/ifvmg1.aud and b/mods/ca/bits/audio/ifvmg1.aud differ diff --git a/mods/ca/bits/audio/ifvmg2.aud b/mods/ca/bits/audio/ifvmg2.aud index fbcbbaf9a2..e0d43885fe 100644 Binary files a/mods/ca/bits/audio/ifvmg2.aud and b/mods/ca/bits/audio/ifvmg2.aud differ diff --git a/mods/ca/bits/audio/ifvmg3.aud b/mods/ca/bits/audio/ifvmg3.aud deleted file mode 100644 index ed8b2543a2..0000000000 Binary files a/mods/ca/bits/audio/ifvmg3.aud and /dev/null differ diff --git a/mods/ca/bits/audio/igenexpa.aud b/mods/ca/bits/audio/igenexpa.aud new file mode 100644 index 0000000000..a9dbfca14a Binary files /dev/null and b/mods/ca/bits/audio/igenexpa.aud differ diff --git a/mods/ca/bits/audio/iggiat2a.aud b/mods/ca/bits/audio/iggiat2a.aud new file mode 100644 index 0000000000..8961359ebf Binary files /dev/null and b/mods/ca/bits/audio/iggiat2a.aud differ diff --git a/mods/ca/bits/audio/iggiat2b.aud b/mods/ca/bits/audio/iggiat2b.aud new file mode 100644 index 0000000000..e2c8c15737 Binary files /dev/null and b/mods/ca/bits/audio/iggiat2b.aud differ diff --git a/mods/ca/bits/audio/iggiata.aud b/mods/ca/bits/audio/iggiata.aud new file mode 100644 index 0000000000..34edf0ceed Binary files /dev/null and b/mods/ca/bits/audio/iggiata.aud differ diff --git a/mods/ca/bits/audio/iggiatb.aud b/mods/ca/bits/audio/iggiatb.aud new file mode 100644 index 0000000000..ea1b5ff239 Binary files /dev/null and b/mods/ca/bits/audio/iggiatb.aud differ diff --git a/mods/ca/bits/audio/iggiatc.aud b/mods/ca/bits/audio/iggiatc.aud new file mode 100644 index 0000000000..95cc8822af Binary files /dev/null and b/mods/ca/bits/audio/iggiatc.aud differ diff --git a/mods/ca/bits/audio/iggiatd.aud b/mods/ca/bits/audio/iggiatd.aud new file mode 100644 index 0000000000..9b3c7c8e2c Binary files /dev/null and b/mods/ca/bits/audio/iggiatd.aud differ diff --git a/mods/ca/bits/audio/iggiate.aud b/mods/ca/bits/audio/iggiate.aud new file mode 100644 index 0000000000..4af0639ab8 Binary files /dev/null and b/mods/ca/bits/audio/iggiate.aud differ diff --git a/mods/ca/bits/audio/iggidea.aud b/mods/ca/bits/audio/iggidea.aud new file mode 100644 index 0000000000..e81f626f1a Binary files /dev/null and b/mods/ca/bits/audio/iggidea.aud differ diff --git a/mods/ca/bits/audio/iggideb.aud b/mods/ca/bits/audio/iggideb.aud new file mode 100644 index 0000000000..36eb0b99f7 Binary files /dev/null and b/mods/ca/bits/audio/iggideb.aud differ diff --git a/mods/ca/bits/audio/iggidec.aud b/mods/ca/bits/audio/iggidec.aud new file mode 100644 index 0000000000..05c04e1ab1 Binary files /dev/null and b/mods/ca/bits/audio/iggidec.aud differ diff --git a/mods/ca/bits/audio/iggidia.aud b/mods/ca/bits/audio/iggidia.aud new file mode 100644 index 0000000000..c0b015752a Binary files /dev/null and b/mods/ca/bits/audio/iggidia.aud differ diff --git a/mods/ca/bits/audio/iggidib.aud b/mods/ca/bits/audio/iggidib.aud new file mode 100644 index 0000000000..81a24b03db Binary files /dev/null and b/mods/ca/bits/audio/iggidib.aud differ diff --git a/mods/ca/bits/audio/iggidic.aud b/mods/ca/bits/audio/iggidic.aud new file mode 100644 index 0000000000..6d8a6bd1e0 Binary files /dev/null and b/mods/ca/bits/audio/iggidic.aud differ diff --git a/mods/ca/bits/audio/iggifea.aud b/mods/ca/bits/audio/iggifea.aud new file mode 100644 index 0000000000..404822d9e9 Binary files /dev/null and b/mods/ca/bits/audio/iggifea.aud differ diff --git a/mods/ca/bits/audio/iggifeb.aud b/mods/ca/bits/audio/iggifeb.aud new file mode 100644 index 0000000000..a9269a08de Binary files /dev/null and b/mods/ca/bits/audio/iggifeb.aud differ diff --git a/mods/ca/bits/audio/iggifec.aud b/mods/ca/bits/audio/iggifec.aud new file mode 100644 index 0000000000..95e0a3a0ea Binary files /dev/null and b/mods/ca/bits/audio/iggifec.aud differ diff --git a/mods/ca/bits/audio/iggifed.aud b/mods/ca/bits/audio/iggifed.aud new file mode 100644 index 0000000000..48eee4ef3c Binary files /dev/null and b/mods/ca/bits/audio/iggifed.aud differ diff --git a/mods/ca/bits/audio/iggifee.aud b/mods/ca/bits/audio/iggifee.aud new file mode 100644 index 0000000000..4bb030106d Binary files /dev/null and b/mods/ca/bits/audio/iggifee.aud differ diff --git a/mods/ca/bits/audio/iggifef.aud b/mods/ca/bits/audio/iggifef.aud new file mode 100644 index 0000000000..45f8e206c0 Binary files /dev/null and b/mods/ca/bits/audio/iggifef.aud differ diff --git a/mods/ca/bits/audio/iggimoa.aud b/mods/ca/bits/audio/iggimoa.aud new file mode 100644 index 0000000000..1a23f2aa0c Binary files /dev/null and b/mods/ca/bits/audio/iggimoa.aud differ diff --git a/mods/ca/bits/audio/iggimob.aud b/mods/ca/bits/audio/iggimob.aud new file mode 100644 index 0000000000..3d47e381e0 Binary files /dev/null and b/mods/ca/bits/audio/iggimob.aud differ diff --git a/mods/ca/bits/audio/iggimoc.aud b/mods/ca/bits/audio/iggimoc.aud new file mode 100644 index 0000000000..145cba8500 Binary files /dev/null and b/mods/ca/bits/audio/iggimoc.aud differ diff --git a/mods/ca/bits/audio/iggimod.aud b/mods/ca/bits/audio/iggimod.aud new file mode 100644 index 0000000000..90fe1621e3 Binary files /dev/null and b/mods/ca/bits/audio/iggimod.aud differ diff --git a/mods/ca/bits/audio/iggimoe.aud b/mods/ca/bits/audio/iggimoe.aud new file mode 100644 index 0000000000..0532446104 Binary files /dev/null and b/mods/ca/bits/audio/iggimoe.aud differ diff --git a/mods/ca/bits/audio/iggisea.aud b/mods/ca/bits/audio/iggisea.aud new file mode 100644 index 0000000000..dd2268ce6f Binary files /dev/null and b/mods/ca/bits/audio/iggisea.aud differ diff --git a/mods/ca/bits/audio/iggiseb.aud b/mods/ca/bits/audio/iggiseb.aud new file mode 100644 index 0000000000..7145b93c73 Binary files /dev/null and b/mods/ca/bits/audio/iggiseb.aud differ diff --git a/mods/ca/bits/audio/iggisec.aud b/mods/ca/bits/audio/iggisec.aud new file mode 100644 index 0000000000..50547ee805 Binary files /dev/null and b/mods/ca/bits/audio/iggisec.aud differ diff --git a/mods/ca/bits/audio/iggised.aud b/mods/ca/bits/audio/iggised.aud new file mode 100644 index 0000000000..0ea87bc042 Binary files /dev/null and b/mods/ca/bits/audio/iggised.aud differ diff --git a/mods/ca/bits/audio/iggisee.aud b/mods/ca/bits/audio/iggisee.aud new file mode 100644 index 0000000000..13be97058a Binary files /dev/null and b/mods/ca/bits/audio/iggisee.aud differ diff --git a/mods/ca/bits/audio/iggisef.aud b/mods/ca/bits/audio/iggisef.aud new file mode 100644 index 0000000000..50cfbc8dd5 Binary files /dev/null and b/mods/ca/bits/audio/iggisef.aud differ diff --git a/mods/ca/bits/audio/igiat1a.aud b/mods/ca/bits/audio/igiat1a.aud new file mode 100644 index 0000000000..f83cb3f694 Binary files /dev/null and b/mods/ca/bits/audio/igiat1a.aud differ diff --git a/mods/ca/bits/audio/igiat1b.aud b/mods/ca/bits/audio/igiat1b.aud new file mode 100644 index 0000000000..126391207b Binary files /dev/null and b/mods/ca/bits/audio/igiat1b.aud differ diff --git a/mods/ca/bits/audio/igiat1c.aud b/mods/ca/bits/audio/igiat1c.aud new file mode 100644 index 0000000000..276c6a8942 Binary files /dev/null and b/mods/ca/bits/audio/igiat1c.aud differ diff --git a/mods/ca/bits/audio/igiata.aud b/mods/ca/bits/audio/igiata.aud new file mode 100644 index 0000000000..7ebb68fe3d Binary files /dev/null and b/mods/ca/bits/audio/igiata.aud differ diff --git a/mods/ca/bits/audio/igiatb.aud b/mods/ca/bits/audio/igiatb.aud new file mode 100644 index 0000000000..fe415c8650 Binary files /dev/null and b/mods/ca/bits/audio/igiatb.aud differ diff --git a/mods/ca/bits/audio/igiatc.aud b/mods/ca/bits/audio/igiatc.aud new file mode 100644 index 0000000000..fd4b684a74 Binary files /dev/null and b/mods/ca/bits/audio/igiatc.aud differ diff --git a/mods/ca/bits/audio/igiatd.aud b/mods/ca/bits/audio/igiatd.aud new file mode 100644 index 0000000000..a654e0ebaa Binary files /dev/null and b/mods/ca/bits/audio/igiatd.aud differ diff --git a/mods/ca/bits/audio/igiate.aud b/mods/ca/bits/audio/igiate.aud new file mode 100644 index 0000000000..2f54e4750f Binary files /dev/null and b/mods/ca/bits/audio/igiate.aud differ diff --git a/mods/ca/bits/audio/igiatf.aud b/mods/ca/bits/audio/igiatf.aud new file mode 100644 index 0000000000..bcde385c64 Binary files /dev/null and b/mods/ca/bits/audio/igiatf.aud differ diff --git a/mods/ca/bits/audio/igidepa.aud b/mods/ca/bits/audio/igidepa.aud new file mode 100644 index 0000000000..4f0c9fd759 Binary files /dev/null and b/mods/ca/bits/audio/igidepa.aud differ diff --git a/mods/ca/bits/audio/igidepb.aud b/mods/ca/bits/audio/igidepb.aud new file mode 100644 index 0000000000..769f833a32 Binary files /dev/null and b/mods/ca/bits/audio/igidepb.aud differ diff --git a/mods/ca/bits/audio/igidia.aud b/mods/ca/bits/audio/igidia.aud new file mode 100644 index 0000000000..d91eac9ea5 Binary files /dev/null and b/mods/ca/bits/audio/igidia.aud differ diff --git a/mods/ca/bits/audio/igidib.aud b/mods/ca/bits/audio/igidib.aud new file mode 100644 index 0000000000..e0c9c30f98 Binary files /dev/null and b/mods/ca/bits/audio/igidib.aud differ diff --git a/mods/ca/bits/audio/igidic.aud b/mods/ca/bits/audio/igidic.aud new file mode 100644 index 0000000000..89cfd94bb0 Binary files /dev/null and b/mods/ca/bits/audio/igidic.aud differ diff --git a/mods/ca/bits/audio/igidid.aud b/mods/ca/bits/audio/igidid.aud new file mode 100644 index 0000000000..879fad2d05 Binary files /dev/null and b/mods/ca/bits/audio/igidid.aud differ diff --git a/mods/ca/bits/audio/igidie.aud b/mods/ca/bits/audio/igidie.aud new file mode 100644 index 0000000000..e0adf93c5c Binary files /dev/null and b/mods/ca/bits/audio/igidie.aud differ diff --git a/mods/ca/bits/audio/igifea.aud b/mods/ca/bits/audio/igifea.aud new file mode 100644 index 0000000000..3acd64cdeb Binary files /dev/null and b/mods/ca/bits/audio/igifea.aud differ diff --git a/mods/ca/bits/audio/igifeb.aud b/mods/ca/bits/audio/igifeb.aud new file mode 100644 index 0000000000..eee47a6b8b Binary files /dev/null and b/mods/ca/bits/audio/igifeb.aud differ diff --git a/mods/ca/bits/audio/igimoa.aud b/mods/ca/bits/audio/igimoa.aud new file mode 100644 index 0000000000..6078fef99b Binary files /dev/null and b/mods/ca/bits/audio/igimoa.aud differ diff --git a/mods/ca/bits/audio/igimob.aud b/mods/ca/bits/audio/igimob.aud new file mode 100644 index 0000000000..0789ceb6fa Binary files /dev/null and b/mods/ca/bits/audio/igimob.aud differ diff --git a/mods/ca/bits/audio/igimoc.aud b/mods/ca/bits/audio/igimoc.aud new file mode 100644 index 0000000000..016a668de7 Binary files /dev/null and b/mods/ca/bits/audio/igimoc.aud differ diff --git a/mods/ca/bits/audio/igimod.aud b/mods/ca/bits/audio/igimod.aud new file mode 100644 index 0000000000..209e98a01f Binary files /dev/null and b/mods/ca/bits/audio/igimod.aud differ diff --git a/mods/ca/bits/audio/igimoe.aud b/mods/ca/bits/audio/igimoe.aud new file mode 100644 index 0000000000..c4adbf771e Binary files /dev/null and b/mods/ca/bits/audio/igimoe.aud differ diff --git a/mods/ca/bits/audio/igimof.aud b/mods/ca/bits/audio/igimof.aud new file mode 100644 index 0000000000..77196ffc4c Binary files /dev/null and b/mods/ca/bits/audio/igimof.aud differ diff --git a/mods/ca/bits/audio/igisea.aud b/mods/ca/bits/audio/igisea.aud new file mode 100644 index 0000000000..6b42e03d79 Binary files /dev/null and b/mods/ca/bits/audio/igisea.aud differ diff --git a/mods/ca/bits/audio/igiseb.aud b/mods/ca/bits/audio/igiseb.aud new file mode 100644 index 0000000000..5a4e21984b Binary files /dev/null and b/mods/ca/bits/audio/igiseb.aud differ diff --git a/mods/ca/bits/audio/igisec.aud b/mods/ca/bits/audio/igisec.aud new file mode 100644 index 0000000000..7e4bcf8b95 Binary files /dev/null and b/mods/ca/bits/audio/igisec.aud differ diff --git a/mods/ca/bits/audio/igised.aud b/mods/ca/bits/audio/igised.aud new file mode 100644 index 0000000000..26e0de84cc Binary files /dev/null and b/mods/ca/bits/audio/igised.aud differ diff --git a/mods/ca/bits/audio/igisee.aud b/mods/ca/bits/audio/igisee.aud new file mode 100644 index 0000000000..3efde077e0 Binary files /dev/null and b/mods/ca/bits/audio/igisee.aud differ diff --git a/mods/ca/bits/audio/igisef.aud b/mods/ca/bits/audio/igisef.aud new file mode 100644 index 0000000000..a058503cf4 Binary files /dev/null and b/mods/ca/bits/audio/igisef.aud differ diff --git a/mods/ca/bits/audio/interceptors.aud b/mods/ca/bits/audio/interceptors.aud new file mode 100644 index 0000000000..a07bad0e4c Binary files /dev/null and b/mods/ca/bits/audio/interceptors.aud differ diff --git a/mods/ca/bits/audio/iok-create1.aud b/mods/ca/bits/audio/iok-create1.aud new file mode 100644 index 0000000000..c6aa4c6f75 Binary files /dev/null and b/mods/ca/bits/audio/iok-create1.aud differ diff --git a/mods/ca/bits/audio/iok-create2.aud b/mods/ca/bits/audio/iok-create2.aud new file mode 100644 index 0000000000..86b737fd07 Binary files /dev/null and b/mods/ca/bits/audio/iok-create2.aud differ diff --git a/mods/ca/bits/audio/iok-create3.aud b/mods/ca/bits/audio/iok-create3.aud new file mode 100644 index 0000000000..bc8c302cfc Binary files /dev/null and b/mods/ca/bits/audio/iok-create3.aud differ diff --git a/mods/ca/bits/audio/iok-create4.aud b/mods/ca/bits/audio/iok-create4.aud new file mode 100644 index 0000000000..867908d022 Binary files /dev/null and b/mods/ca/bits/audio/iok-create4.aud differ diff --git a/mods/ca/bits/audio/iok-create5.aud b/mods/ca/bits/audio/iok-create5.aud new file mode 100644 index 0000000000..79d9391628 Binary files /dev/null and b/mods/ca/bits/audio/iok-create5.aud differ diff --git a/mods/ca/bits/audio/iok-place.aud b/mods/ca/bits/audio/iok-place.aud new file mode 100644 index 0000000000..9020830e07 Binary files /dev/null and b/mods/ca/bits/audio/iok-place.aud differ diff --git a/mods/ca/bits/audio/ionrifle1.aud b/mods/ca/bits/audio/ionrifle1.aud new file mode 100644 index 0000000000..2f29f5d413 Binary files /dev/null and b/mods/ca/bits/audio/ionrifle1.aud differ diff --git a/mods/ca/bits/audio/ionrifle2.aud b/mods/ca/bits/audio/ionrifle2.aud new file mode 100644 index 0000000000..b3fa23228b Binary files /dev/null and b/mods/ca/bits/audio/ionrifle2.aud differ diff --git a/mods/ca/bits/audio/ionstorm1.aud b/mods/ca/bits/audio/ionstorm1.aud new file mode 100644 index 0000000000..e238ee15b7 Binary files /dev/null and b/mods/ca/bits/audio/ionstorm1.aud differ diff --git a/mods/ca/bits/audio/ionstorm2.aud b/mods/ca/bits/audio/ionstorm2.aud new file mode 100644 index 0000000000..70a92cd33a Binary files /dev/null and b/mods/ca/bits/audio/ionstorm2.aud differ diff --git a/mods/ca/bits/audio/ionstorm3.aud b/mods/ca/bits/audio/ionstorm3.aud new file mode 100644 index 0000000000..fdc79b4065 Binary files /dev/null and b/mods/ca/bits/audio/ionstorm3.aud differ diff --git a/mods/ca/bits/audio/irocataa.aud b/mods/ca/bits/audio/irocataa.aud new file mode 100644 index 0000000000..4faf3925bd Binary files /dev/null and b/mods/ca/bits/audio/irocataa.aud differ diff --git a/mods/ca/bits/audio/irocatab.aud b/mods/ca/bits/audio/irocatab.aud new file mode 100644 index 0000000000..790ae8d9b4 Binary files /dev/null and b/mods/ca/bits/audio/irocatab.aud differ diff --git a/mods/ca/bits/audio/irocatac.aud b/mods/ca/bits/audio/irocatac.aud new file mode 100644 index 0000000000..fedf7f1606 Binary files /dev/null and b/mods/ca/bits/audio/irocatac.aud differ diff --git a/mods/ca/bits/audio/irocatad.aud b/mods/ca/bits/audio/irocatad.aud new file mode 100644 index 0000000000..ee67280f59 Binary files /dev/null and b/mods/ca/bits/audio/irocatad.aud differ diff --git a/mods/ca/bits/audio/irocatta.aud b/mods/ca/bits/audio/irocatta.aud new file mode 100644 index 0000000000..3a203d6ab6 Binary files /dev/null and b/mods/ca/bits/audio/irocatta.aud differ diff --git a/mods/ca/bits/audio/irocattb.aud b/mods/ca/bits/audio/irocattb.aud new file mode 100644 index 0000000000..3cc7773cdf Binary files /dev/null and b/mods/ca/bits/audio/irocattb.aud differ diff --git a/mods/ca/bits/audio/irocattc.aud b/mods/ca/bits/audio/irocattc.aud new file mode 100644 index 0000000000..9d2b5e42c6 Binary files /dev/null and b/mods/ca/bits/audio/irocattc.aud differ diff --git a/mods/ca/bits/audio/iseaata.aud b/mods/ca/bits/audio/iseaata.aud new file mode 100644 index 0000000000..9f7d67d37e Binary files /dev/null and b/mods/ca/bits/audio/iseaata.aud differ diff --git a/mods/ca/bits/audio/iseaatb.aud b/mods/ca/bits/audio/iseaatb.aud new file mode 100644 index 0000000000..887f646dbc Binary files /dev/null and b/mods/ca/bits/audio/iseaatb.aud differ diff --git a/mods/ca/bits/audio/iseaatc.aud b/mods/ca/bits/audio/iseaatc.aud new file mode 100644 index 0000000000..4f8313a032 Binary files /dev/null and b/mods/ca/bits/audio/iseaatc.aud differ diff --git a/mods/ca/bits/audio/iseaatta.aud b/mods/ca/bits/audio/iseaatta.aud new file mode 100644 index 0000000000..b90d6781e0 Binary files /dev/null and b/mods/ca/bits/audio/iseaatta.aud differ diff --git a/mods/ca/bits/audio/iseaattb.aud b/mods/ca/bits/audio/iseaattb.aud new file mode 100644 index 0000000000..6864a29c99 Binary files /dev/null and b/mods/ca/bits/audio/iseaattb.aud differ diff --git a/mods/ca/bits/audio/iseadia.aud b/mods/ca/bits/audio/iseadia.aud new file mode 100644 index 0000000000..a55865da61 Binary files /dev/null and b/mods/ca/bits/audio/iseadia.aud differ diff --git a/mods/ca/bits/audio/iseadib.aud b/mods/ca/bits/audio/iseadib.aud new file mode 100644 index 0000000000..a4ae88c2d8 Binary files /dev/null and b/mods/ca/bits/audio/iseadib.aud differ diff --git a/mods/ca/bits/audio/iseadic.aud b/mods/ca/bits/audio/iseadic.aud new file mode 100644 index 0000000000..8b781c6ba9 Binary files /dev/null and b/mods/ca/bits/audio/iseadic.aud differ diff --git a/mods/ca/bits/audio/iseaexa.aud b/mods/ca/bits/audio/iseaexa.aud new file mode 100644 index 0000000000..986b2497ab Binary files /dev/null and b/mods/ca/bits/audio/iseaexa.aud differ diff --git a/mods/ca/bits/audio/iseaexb.aud b/mods/ca/bits/audio/iseaexb.aud new file mode 100644 index 0000000000..aa0b0a2aed Binary files /dev/null and b/mods/ca/bits/audio/iseaexb.aud differ diff --git a/mods/ca/bits/audio/iseaexc.aud b/mods/ca/bits/audio/iseaexc.aud new file mode 100644 index 0000000000..d9688f2613 Binary files /dev/null and b/mods/ca/bits/audio/iseaexc.aud differ diff --git a/mods/ca/bits/audio/iseamoa.aud b/mods/ca/bits/audio/iseamoa.aud new file mode 100644 index 0000000000..f73fb3358d Binary files /dev/null and b/mods/ca/bits/audio/iseamoa.aud differ diff --git a/mods/ca/bits/audio/iseamob.aud b/mods/ca/bits/audio/iseamob.aud new file mode 100644 index 0000000000..c80bb6e438 Binary files /dev/null and b/mods/ca/bits/audio/iseamob.aud differ diff --git a/mods/ca/bits/audio/iseamoc.aud b/mods/ca/bits/audio/iseamoc.aud new file mode 100644 index 0000000000..bd0f949354 Binary files /dev/null and b/mods/ca/bits/audio/iseamoc.aud differ diff --git a/mods/ca/bits/audio/iseasea.aud b/mods/ca/bits/audio/iseasea.aud new file mode 100644 index 0000000000..b2b99becc2 Binary files /dev/null and b/mods/ca/bits/audio/iseasea.aud differ diff --git a/mods/ca/bits/audio/iseaseb.aud b/mods/ca/bits/audio/iseaseb.aud new file mode 100644 index 0000000000..f87060634d Binary files /dev/null and b/mods/ca/bits/audio/iseaseb.aud differ diff --git a/mods/ca/bits/audio/iseasec.aud b/mods/ca/bits/audio/iseasec.aud new file mode 100644 index 0000000000..2c4a9c09e1 Binary files /dev/null and b/mods/ca/bits/audio/iseasec.aud differ diff --git a/mods/ca/bits/audio/iseased.aud b/mods/ca/bits/audio/iseased.aud new file mode 100644 index 0000000000..2c3a23b700 Binary files /dev/null and b/mods/ca/bits/audio/iseased.aud differ diff --git a/mods/ca/bits/audio/islyat1a.aud b/mods/ca/bits/audio/islyat1a.aud new file mode 100644 index 0000000000..50aa7a7a0f Binary files /dev/null and b/mods/ca/bits/audio/islyat1a.aud differ diff --git a/mods/ca/bits/audio/islyat1b.aud b/mods/ca/bits/audio/islyat1b.aud new file mode 100644 index 0000000000..ff58adbbc0 Binary files /dev/null and b/mods/ca/bits/audio/islyat1b.aud differ diff --git a/mods/ca/bits/audio/itanweaa.aud b/mods/ca/bits/audio/itanweaa.aud new file mode 100644 index 0000000000..1b3d6943fa Binary files /dev/null and b/mods/ca/bits/audio/itanweaa.aud differ diff --git a/mods/ca/bits/audio/itanweab.aud b/mods/ca/bits/audio/itanweab.aud new file mode 100644 index 0000000000..3c71070a52 Binary files /dev/null and b/mods/ca/bits/audio/itanweab.aud differ diff --git a/mods/ca/bits/audio/itanweac.aud b/mods/ca/bits/audio/itanweac.aud new file mode 100644 index 0000000000..a13061a79b Binary files /dev/null and b/mods/ca/bits/audio/itanweac.aud differ diff --git a/mods/ca/bits/audio/itesat2a.aud b/mods/ca/bits/audio/itesat2a.aud new file mode 100644 index 0000000000..11305e2445 Binary files /dev/null and b/mods/ca/bits/audio/itesat2a.aud differ diff --git a/mods/ca/bits/audio/itesat2b.aud b/mods/ca/bits/audio/itesat2b.aud new file mode 100644 index 0000000000..c612b354af Binary files /dev/null and b/mods/ca/bits/audio/itesat2b.aud differ diff --git a/mods/ca/bits/audio/itesatta.aud b/mods/ca/bits/audio/itesatta.aud new file mode 100644 index 0000000000..396eee8b75 Binary files /dev/null and b/mods/ca/bits/audio/itesatta.aud differ diff --git a/mods/ca/bits/audio/itesdia.aud b/mods/ca/bits/audio/itesdia.aud new file mode 100644 index 0000000000..34f4a809e5 Binary files /dev/null and b/mods/ca/bits/audio/itesdia.aud differ diff --git a/mods/ca/bits/audio/itesdib.aud b/mods/ca/bits/audio/itesdib.aud new file mode 100644 index 0000000000..ef1c9c8f08 Binary files /dev/null and b/mods/ca/bits/audio/itesdib.aud differ diff --git a/mods/ca/bits/audio/itesdic.aud b/mods/ca/bits/audio/itesdic.aud new file mode 100644 index 0000000000..119b8bca8a Binary files /dev/null and b/mods/ca/bits/audio/itesdic.aud differ diff --git a/mods/ca/bits/audio/itesdid.aud b/mods/ca/bits/audio/itesdid.aud new file mode 100644 index 0000000000..326785ddcf Binary files /dev/null and b/mods/ca/bits/audio/itesdid.aud differ diff --git a/mods/ca/bits/audio/itesmof.aud b/mods/ca/bits/audio/itesmof.aud new file mode 100644 index 0000000000..e1f547c015 Binary files /dev/null and b/mods/ca/bits/audio/itesmof.aud differ diff --git a/mods/ca/bits/audio/itessea.aud b/mods/ca/bits/audio/itessea.aud new file mode 100644 index 0000000000..e5dc089dca Binary files /dev/null and b/mods/ca/bits/audio/itessea.aud differ diff --git a/mods/ca/bits/audio/ithfatk1.aud b/mods/ca/bits/audio/ithfatk1.aud new file mode 100644 index 0000000000..795b824e8b Binary files /dev/null and b/mods/ca/bits/audio/ithfatk1.aud differ diff --git a/mods/ca/bits/audio/ithfatk2.aud b/mods/ca/bits/audio/ithfatk2.aud new file mode 100644 index 0000000000..94a4be247e Binary files /dev/null and b/mods/ca/bits/audio/ithfatk2.aud differ diff --git a/mods/ca/bits/audio/ithfatk3.aud b/mods/ca/bits/audio/ithfatk3.aud new file mode 100644 index 0000000000..711552b533 Binary files /dev/null and b/mods/ca/bits/audio/ithfatk3.aud differ diff --git a/mods/ca/bits/audio/ithfatk4.aud b/mods/ca/bits/audio/ithfatk4.aud new file mode 100644 index 0000000000..dc873cc225 Binary files /dev/null and b/mods/ca/bits/audio/ithfatk4.aud differ diff --git a/mods/ca/bits/audio/ithfatk5.aud b/mods/ca/bits/audio/ithfatk5.aud new file mode 100644 index 0000000000..a1affed10b Binary files /dev/null and b/mods/ca/bits/audio/ithfatk5.aud differ diff --git a/mods/ca/bits/audio/ithfatk6.aud b/mods/ca/bits/audio/ithfatk6.aud new file mode 100644 index 0000000000..9a1967df3c Binary files /dev/null and b/mods/ca/bits/audio/ithfatk6.aud differ diff --git a/mods/ca/bits/audio/ithfmov1.aud b/mods/ca/bits/audio/ithfmov1.aud new file mode 100644 index 0000000000..b369a2567c Binary files /dev/null and b/mods/ca/bits/audio/ithfmov1.aud differ diff --git a/mods/ca/bits/audio/ithfmov2.aud b/mods/ca/bits/audio/ithfmov2.aud new file mode 100644 index 0000000000..3317fe71cb Binary files /dev/null and b/mods/ca/bits/audio/ithfmov2.aud differ diff --git a/mods/ca/bits/audio/ithfmov3.aud b/mods/ca/bits/audio/ithfmov3.aud new file mode 100644 index 0000000000..263f68b1da Binary files /dev/null and b/mods/ca/bits/audio/ithfmov3.aud differ diff --git a/mods/ca/bits/audio/ithfmov4.aud b/mods/ca/bits/audio/ithfmov4.aud new file mode 100644 index 0000000000..7aa12d9f87 Binary files /dev/null and b/mods/ca/bits/audio/ithfmov4.aud differ diff --git a/mods/ca/bits/audio/ithfslt1.aud b/mods/ca/bits/audio/ithfslt1.aud new file mode 100644 index 0000000000..fbd4dd964c Binary files /dev/null and b/mods/ca/bits/audio/ithfslt1.aud differ diff --git a/mods/ca/bits/audio/ithfslt2.aud b/mods/ca/bits/audio/ithfslt2.aud new file mode 100644 index 0000000000..06cf157ec7 Binary files /dev/null and b/mods/ca/bits/audio/ithfslt2.aud differ diff --git a/mods/ca/bits/audio/ithfslt3.aud b/mods/ca/bits/audio/ithfslt3.aud new file mode 100644 index 0000000000..f436afa55d Binary files /dev/null and b/mods/ca/bits/audio/ithfslt3.aud differ diff --git a/mods/ca/bits/audio/ithfslt4.aud b/mods/ca/bits/audio/ithfslt4.aud new file mode 100644 index 0000000000..f4cebbc54f Binary files /dev/null and b/mods/ca/bits/audio/ithfslt4.aud differ diff --git a/mods/ca/bits/audio/iviratta.aud b/mods/ca/bits/audio/iviratta.aud new file mode 100644 index 0000000000..5d08f3f2d9 Binary files /dev/null and b/mods/ca/bits/audio/iviratta.aud differ diff --git a/mods/ca/bits/audio/jack-attack1.aud b/mods/ca/bits/audio/jack-attack1.aud new file mode 100644 index 0000000000..fed66b9774 Binary files /dev/null and b/mods/ca/bits/audio/jack-attack1.aud differ diff --git a/mods/ca/bits/audio/jack-attack2.aud b/mods/ca/bits/audio/jack-attack2.aud new file mode 100644 index 0000000000..c6991e71f0 Binary files /dev/null and b/mods/ca/bits/audio/jack-attack2.aud differ diff --git a/mods/ca/bits/audio/jack-move1.aud b/mods/ca/bits/audio/jack-move1.aud new file mode 100644 index 0000000000..a8b39c8eca Binary files /dev/null and b/mods/ca/bits/audio/jack-move1.aud differ diff --git a/mods/ca/bits/audio/jack-move2.aud b/mods/ca/bits/audio/jack-move2.aud new file mode 100644 index 0000000000..085d24d657 Binary files /dev/null and b/mods/ca/bits/audio/jack-move2.aud differ diff --git a/mods/ca/bits/audio/jack-move3.aud b/mods/ca/bits/audio/jack-move3.aud new file mode 100644 index 0000000000..f303864882 Binary files /dev/null and b/mods/ca/bits/audio/jack-move3.aud differ diff --git a/mods/ca/bits/audio/jack-select1.aud b/mods/ca/bits/audio/jack-select1.aud new file mode 100644 index 0000000000..5b5a8f0cd6 Binary files /dev/null and b/mods/ca/bits/audio/jack-select1.aud differ diff --git a/mods/ca/bits/audio/jack-select2.aud b/mods/ca/bits/audio/jack-select2.aud new file mode 100644 index 0000000000..54bbf0ee6e Binary files /dev/null and b/mods/ca/bits/audio/jack-select2.aud differ diff --git a/mods/ca/bits/audio/jammed.aud b/mods/ca/bits/audio/jammed.aud new file mode 100644 index 0000000000..d0fbbd4394 Binary files /dev/null and b/mods/ca/bits/audio/jammed.aud differ diff --git a/mods/ca/bits/audio/jammer.aud b/mods/ca/bits/audio/jammer.aud new file mode 100644 index 0000000000..eb175edadb Binary files /dev/null and b/mods/ca/bits/audio/jammer.aud differ diff --git a/mods/ca/bits/audio/jjgren1.aud b/mods/ca/bits/audio/jjgren1.aud new file mode 100644 index 0000000000..534571f439 Binary files /dev/null and b/mods/ca/bits/audio/jjgren1.aud differ diff --git a/mods/ca/bits/audio/jjgren2.aud b/mods/ca/bits/audio/jjgren2.aud new file mode 100644 index 0000000000..4070bfb9d7 Binary files /dev/null and b/mods/ca/bits/audio/jjgren2.aud differ diff --git a/mods/ca/bits/audio/kaboom12s.aud b/mods/ca/bits/audio/kaboom12s.aud new file mode 100644 index 0000000000..1fcf860169 Binary files /dev/null and b/mods/ca/bits/audio/kaboom12s.aud differ diff --git a/mods/ca/bits/audio/lasgun.aud b/mods/ca/bits/audio/lasgun.aud index 74130b4a4c..d287804fc6 100644 Binary files a/mods/ca/bits/audio/lasgun.aud and b/mods/ca/bits/audio/lasgun.aud differ diff --git a/mods/ca/bits/audio/lasgun2.aud b/mods/ca/bits/audio/lasgun2.aud new file mode 100644 index 0000000000..7fad6e2e49 Binary files /dev/null and b/mods/ca/bits/audio/lasgun2.aud differ diff --git a/mods/ca/bits/audio/lasgunupg.aud b/mods/ca/bits/audio/lasgunupg.aud new file mode 100644 index 0000000000..64f5b82095 Binary files /dev/null and b/mods/ca/bits/audio/lasgunupg.aud differ diff --git a/mods/ca/bits/audio/lasgunupg2.aud b/mods/ca/bits/audio/lasgunupg2.aud new file mode 100644 index 0000000000..11679dccea Binary files /dev/null and b/mods/ca/bits/audio/lasgunupg2.aud differ diff --git a/mods/ca/bits/audio/m60x5.aud b/mods/ca/bits/audio/m60x5.aud new file mode 100644 index 0000000000..c5096d00bb Binary files /dev/null and b/mods/ca/bits/audio/m60x5.aud differ diff --git a/mods/ca/bits/audio/mantis-fire1.aud b/mods/ca/bits/audio/mantis-fire1.aud new file mode 100644 index 0000000000..4ba3d2970f Binary files /dev/null and b/mods/ca/bits/audio/mantis-fire1.aud differ diff --git a/mods/ca/bits/audio/mantis-fire2.aud b/mods/ca/bits/audio/mantis-fire2.aud new file mode 100644 index 0000000000..8270a8e739 Binary files /dev/null and b/mods/ca/bits/audio/mantis-fire2.aud differ diff --git a/mods/ca/bits/audio/mcor-fire1.aud b/mods/ca/bits/audio/mcor-fire1.aud new file mode 100644 index 0000000000..9bbafb21a2 Binary files /dev/null and b/mods/ca/bits/audio/mcor-fire1.aud differ diff --git a/mods/ca/bits/audio/mcor-fire2.aud b/mods/ca/bits/audio/mcor-fire2.aud new file mode 100644 index 0000000000..040b24096c Binary files /dev/null and b/mods/ca/bits/audio/mcor-fire2.aud differ diff --git a/mods/ca/bits/audio/mdrn-attach.aud b/mods/ca/bits/audio/mdrn-attach.aud new file mode 100644 index 0000000000..9f0861976b Binary files /dev/null and b/mods/ca/bits/audio/mdrn-attach.aud differ diff --git a/mods/ca/bits/audio/n2_armorup1.aud b/mods/ca/bits/audio/n2_armorup1.aud index 447356ceef..30237c230f 100644 Binary files a/mods/ca/bits/audio/n2_armorup1.aud and b/mods/ca/bits/audio/n2_armorup1.aud differ diff --git a/mods/ca/bits/audio/n2_assardy1.aud b/mods/ca/bits/audio/n2_assardy1.aud new file mode 100644 index 0000000000..744f51c9d1 Binary files /dev/null and b/mods/ca/bits/audio/n2_assardy1.aud differ diff --git a/mods/ca/bits/audio/n2_astriker1.aud b/mods/ca/bits/audio/n2_astriker1.aud index c7a3007eec..9c38091d40 100644 Binary files a/mods/ca/bits/audio/n2_astriker1.aud and b/mods/ca/bits/audio/n2_astriker1.aud differ diff --git a/mods/ca/bits/audio/n2_strclst1.aud b/mods/ca/bits/audio/n2_bldcap1.aud similarity index 100% rename from mods/ca/bits/audio/n2_strclst1.aud rename to mods/ca/bits/audio/n2_bldcap1.aud diff --git a/mods/ca/bits/audio/n2_bskywarn1.aud b/mods/ca/bits/audio/n2_bskywarn1.aud new file mode 100644 index 0000000000..1df02266e1 Binary files /dev/null and b/mods/ca/bits/audio/n2_bskywarn1.aud differ diff --git a/mods/ca/bits/audio/n2_cashhkrdy1.aud b/mods/ca/bits/audio/n2_cashhkrdy1.aud new file mode 100644 index 0000000000..7fe49ebc9a Binary files /dev/null and b/mods/ca/bits/audio/n2_cashhkrdy1.aud differ diff --git a/mods/ca/bits/audio/n2_chemstch1.aud b/mods/ca/bits/audio/n2_chemstch1.aud index f1c9253d7d..959ffb7557 100644 Binary files a/mods/ca/bits/audio/n2_chemstch1.aud and b/mods/ca/bits/audio/n2_chemstch1.aud differ diff --git a/mods/ca/bits/audio/n2_chemstrdy1.aud b/mods/ca/bits/audio/n2_chemstrdy1.aud index 498cb18545..8ef697320f 100644 Binary files a/mods/ca/bits/audio/n2_chemstrdy1.aud and b/mods/ca/bits/audio/n2_chemstrdy1.aud differ diff --git a/mods/ca/bits/audio/n2_clusrdy.aud b/mods/ca/bits/audio/n2_clusrdy.aud index 74d2a2a2bb..24a07271bf 100644 Binary files a/mods/ca/bits/audio/n2_clusrdy.aud and b/mods/ca/bits/audio/n2_clusrdy.aud differ diff --git a/mods/ca/bits/audio/n2_cluswarn1.aud b/mods/ca/bits/audio/n2_cluswarn1.aud new file mode 100644 index 0000000000..8a020e2a02 Binary files /dev/null and b/mods/ca/bits/audio/n2_cluswarn1.aud differ diff --git a/mods/ca/bits/audio/n2_cmissrdy1.aud b/mods/ca/bits/audio/n2_cmissrdy1.aud index a6275dda0d..c3147d541f 100644 Binary files a/mods/ca/bits/audio/n2_cmissrdy1.aud and b/mods/ca/bits/audio/n2_cmissrdy1.aud differ diff --git a/mods/ca/bits/audio/n2_cmisswarn1.aud b/mods/ca/bits/audio/n2_cmisswarn1.aud new file mode 100644 index 0000000000..c45c6ff912 Binary files /dev/null and b/mods/ca/bits/audio/n2_cmisswarn1.aud differ diff --git a/mods/ca/bits/audio/n2_confcabrdy1.aud b/mods/ca/bits/audio/n2_confcabrdy1.aud new file mode 100644 index 0000000000..febfa5b545 Binary files /dev/null and b/mods/ca/bits/audio/n2_confcabrdy1.aud differ diff --git a/mods/ca/bits/audio/n2_covavail1.aud b/mods/ca/bits/audio/n2_covavail1.aud new file mode 100644 index 0000000000..c49f8cbd22 Binary files /dev/null and b/mods/ca/bits/audio/n2_covavail1.aud differ diff --git a/mods/ca/bits/audio/n2_cryostormapp1.aud b/mods/ca/bits/audio/n2_cryostormapp1.aud new file mode 100644 index 0000000000..8f26a15eb2 Binary files /dev/null and b/mods/ca/bits/audio/n2_cryostormapp1.aud differ diff --git a/mods/ca/bits/audio/n2_dpodrdy1 b/mods/ca/bits/audio/n2_dpodrdy1 deleted file mode 100644 index be97ad081f..0000000000 Binary files a/mods/ca/bits/audio/n2_dpodrdy1 and /dev/null differ diff --git a/mods/ca/bits/audio/n2_emmisrdy1.aud b/mods/ca/bits/audio/n2_emmisrdy1.aud deleted file mode 100644 index ceec6ec433..0000000000 Binary files a/mods/ca/bits/audio/n2_emmisrdy1.aud and /dev/null differ diff --git a/mods/ca/bits/audio/n2_enmyapp1.aud b/mods/ca/bits/audio/n2_enmyapp1.aud new file mode 100644 index 0000000000..b7051a492e Binary files /dev/null and b/mods/ca/bits/audio/n2_enmyapp1.aud differ diff --git a/mods/ca/bits/audio/n2_enmyunitsto1.aud b/mods/ca/bits/audio/n2_enmyunitsto1.aud new file mode 100644 index 0000000000..bcb1a54dba Binary files /dev/null and b/mods/ca/bits/audio/n2_enmyunitsto1.aud differ diff --git a/mods/ca/bits/audio/n2_firepo1.aud b/mods/ca/bits/audio/n2_firepo1.aud index a12400c9ad..d4fe684839 100644 Binary files a/mods/ca/bits/audio/n2_firepo1.aud and b/mods/ca/bits/audio/n2_firepo1.aud differ diff --git a/mods/ca/bits/audio/n2_flare1.aud b/mods/ca/bits/audio/n2_flare1.aud new file mode 100644 index 0000000000..a190f453fc Binary files /dev/null and b/mods/ca/bits/audio/n2_flare1.aud differ diff --git a/mods/ca/bits/audio/n2_forceact1.aud b/mods/ca/bits/audio/n2_forceact1.aud deleted file mode 100644 index 1a0ebe6f0e..0000000000 Binary files a/mods/ca/bits/audio/n2_forceact1.aud and /dev/null differ diff --git a/mods/ca/bits/audio/n2_forcechg1.aud b/mods/ca/bits/audio/n2_forcechg1.aud index 9ee5b7d78a..cba158d33b 100644 Binary files a/mods/ca/bits/audio/n2_forcechg1.aud and b/mods/ca/bits/audio/n2_forcechg1.aud differ diff --git a/mods/ca/bits/audio/n2_forcedr1.aud b/mods/ca/bits/audio/n2_forcedr1.aud index 9253cf0ad0..43d600f912 100644 Binary files a/mods/ca/bits/audio/n2_forcedr1.aud and b/mods/ca/bits/audio/n2_forcedr1.aud differ diff --git a/mods/ca/bits/audio/n2_frenzyrdy1.aud b/mods/ca/bits/audio/n2_frenzyrdy1.aud new file mode 100644 index 0000000000..25dafffaf0 Binary files /dev/null and b/mods/ca/bits/audio/n2_frenzyrdy1.aud differ diff --git a/mods/ca/bits/audio/n2_hackrdy1.aud b/mods/ca/bits/audio/n2_hackrdy1.aud new file mode 100644 index 0000000000..374a6eb649 Binary files /dev/null and b/mods/ca/bits/audio/n2_hackrdy1.aud differ diff --git a/mods/ca/bits/audio/n2_infernordy1.aud b/mods/ca/bits/audio/n2_infernordy1.aud new file mode 100644 index 0000000000..5ef5ed4903 Binary files /dev/null and b/mods/ca/bits/audio/n2_infernordy1.aud differ diff --git a/mods/ca/bits/audio/n2_infilrdy1.aud b/mods/ca/bits/audio/n2_infilrdy1.aud new file mode 100644 index 0000000000..2a58f0d2d1 Binary files /dev/null and b/mods/ca/bits/audio/n2_infilrdy1.aud differ diff --git a/mods/ca/bits/audio/n2_load1.aud b/mods/ca/bits/audio/n2_load1.aud new file mode 100644 index 0000000000..ea815fe4ff Binary files /dev/null and b/mods/ca/bits/audio/n2_load1.aud differ diff --git a/mods/ca/bits/audio/n2_navylst1.aud b/mods/ca/bits/audio/n2_navylst1.aud index 1d96266570..3cd4568311 100644 Binary files a/mods/ca/bits/audio/n2_navylst1.aud and b/mods/ca/bits/audio/n2_navylst1.aud differ diff --git a/mods/ca/bits/audio/n2_nopowr1.aud b/mods/ca/bits/audio/n2_nopowr1.aud new file mode 100644 index 0000000000..9e6e69143c Binary files /dev/null and b/mods/ca/bits/audio/n2_nopowr1.aud differ diff --git a/mods/ca/bits/audio/n2_ourtechlckd1.aud b/mods/ca/bits/audio/n2_ourtechlckd1.aud new file mode 100644 index 0000000000..4c01bf0693 Binary files /dev/null and b/mods/ca/bits/audio/n2_ourtechlckd1.aud differ diff --git a/mods/ca/bits/audio/n2_ourtechsto1.aud b/mods/ca/bits/audio/n2_ourtechsto1.aud new file mode 100644 index 0000000000..afefb5653f Binary files /dev/null and b/mods/ca/bits/audio/n2_ourtechsto1.aud differ diff --git a/mods/ca/bits/audio/n2_overldrdy1.aud b/mods/ca/bits/audio/n2_overldrdy1.aud new file mode 100644 index 0000000000..fa1c068105 Binary files /dev/null and b/mods/ca/bits/audio/n2_overldrdy1.aud differ diff --git a/mods/ca/bits/audio/n2_owrathwarn1.aud b/mods/ca/bits/audio/n2_owrathwarn1.aud new file mode 100644 index 0000000000..d28c0ca2fc Binary files /dev/null and b/mods/ca/bits/audio/n2_owrathwarn1.aud differ diff --git a/mods/ca/bits/audio/n2_bldgprg1.aud b/mods/ca/bits/audio/n2_progres1.aud similarity index 100% rename from mods/ca/bits/audio/n2_bldgprg1.aud rename to mods/ca/bits/audio/n2_progres1.aud diff --git a/mods/ca/bits/audio/n2_pulse1.aud b/mods/ca/bits/audio/n2_pulse1.aud index b2ca6d1d16..417caa7020 100644 Binary files a/mods/ca/bits/audio/n2_pulse1.aud and b/mods/ca/bits/audio/n2_pulse1.aud differ diff --git a/mods/ca/bits/audio/n2_riftapp1.aud b/mods/ca/bits/audio/n2_riftwarn1.aud similarity index 100% rename from mods/ca/bits/audio/n2_riftapp1.aud rename to mods/ca/bits/audio/n2_riftwarn1.aud diff --git a/mods/ca/bits/audio/n2_sathackrdy1.aud b/mods/ca/bits/audio/n2_sathackrdy1.aud new file mode 100644 index 0000000000..86e5bfb1b9 Binary files /dev/null and b/mods/ca/bits/audio/n2_sathackrdy1.aud differ diff --git a/mods/ca/bits/audio/n2_save1.aud b/mods/ca/bits/audio/n2_save1.aud new file mode 100644 index 0000000000..761d77793c Binary files /dev/null and b/mods/ca/bits/audio/n2_save1.aud differ diff --git a/mods/ca/bits/audio/n2_shadtmrdy1.aud b/mods/ca/bits/audio/n2_shadtmrdy1.aud new file mode 100644 index 0000000000..aea1e8d662 Binary files /dev/null and b/mods/ca/bits/audio/n2_shadtmrdy1.aud differ diff --git a/mods/ca/bits/audio/n2_spypln1.aud b/mods/ca/bits/audio/n2_spypln1.aud deleted file mode 100644 index acc1747ee9..0000000000 Binary files a/mods/ca/bits/audio/n2_spypln1.aud and /dev/null differ diff --git a/mods/ca/bits/audio/n2_stormapp1.aud b/mods/ca/bits/audio/n2_stormapp1.aud index badbc2e8b1..ec92c52505 100644 Binary files a/mods/ca/bits/audio/n2_stormapp1.aud and b/mods/ca/bits/audio/n2_stormapp1.aud differ diff --git a/mods/ca/bits/audio/n2_techacq1.aud b/mods/ca/bits/audio/n2_techacq1.aud new file mode 100644 index 0000000000..9ddde27c88 Binary files /dev/null and b/mods/ca/bits/audio/n2_techacq1.aud differ diff --git a/mods/ca/bits/audio/n2_techhkrdy1.aud b/mods/ca/bits/audio/n2_techhkrdy1.aud new file mode 100644 index 0000000000..18d74478cf Binary files /dev/null and b/mods/ca/bits/audio/n2_techhkrdy1.aud differ diff --git a/mods/ca/bits/audio/n2_techlckd1.aud b/mods/ca/bits/audio/n2_techlckd1.aud new file mode 100644 index 0000000000..1b42320ec7 Binary files /dev/null and b/mods/ca/bits/audio/n2_techlckd1.aud differ diff --git a/mods/ca/bits/audio/n2_timergo1.aud b/mods/ca/bits/audio/n2_timergo1.aud deleted file mode 100644 index f7c859410b..0000000000 Binary files a/mods/ca/bits/audio/n2_timergo1.aud and /dev/null differ diff --git a/mods/ca/bits/audio/n2_timerno1.aud b/mods/ca/bits/audio/n2_timerno1.aud deleted file mode 100644 index 5215f8500a..0000000000 Binary files a/mods/ca/bits/audio/n2_timerno1.aud and /dev/null differ diff --git a/mods/ca/bits/audio/n2_unitupg1.aud b/mods/ca/bits/audio/n2_unitupg1.aud index c10df3f197..19581aa8c0 100644 Binary files a/mods/ca/bits/audio/n2_unitupg1.aud and b/mods/ca/bits/audio/n2_unitupg1.aud differ diff --git a/mods/ca/bits/audio/n_alaunch1.aud b/mods/ca/bits/audio/n_alaunch1.aud index 7968b86224..1d072b4a38 100644 Binary files a/mods/ca/bits/audio/n_alaunch1.aud and b/mods/ca/bits/audio/n_alaunch1.aud differ diff --git a/mods/ca/bits/audio/n_assardy1.aud b/mods/ca/bits/audio/n_assardy1.aud new file mode 100644 index 0000000000..3577ee4d7b Binary files /dev/null and b/mods/ca/bits/audio/n_assardy1.aud differ diff --git a/mods/ca/bits/audio/n_bldcap1.aud b/mods/ca/bits/audio/n_bldcap1.aud new file mode 100644 index 0000000000..9966c6ac8b Binary files /dev/null and b/mods/ca/bits/audio/n_bldcap1.aud differ diff --git a/mods/ca/bits/audio/n_bskywarn1.aud b/mods/ca/bits/audio/n_bskywarn1.aud new file mode 100644 index 0000000000..81274c768f Binary files /dev/null and b/mods/ca/bits/audio/n_bskywarn1.aud differ diff --git a/mods/ca/bits/audio/n_cashhkrdy1.aud b/mods/ca/bits/audio/n_cashhkrdy1.aud new file mode 100644 index 0000000000..bb22f8e967 Binary files /dev/null and b/mods/ca/bits/audio/n_cashhkrdy1.aud differ diff --git a/mods/ca/bits/audio/n_cluswarn1.aud b/mods/ca/bits/audio/n_cluswarn1.aud new file mode 100644 index 0000000000..7d6acdb1d4 Binary files /dev/null and b/mods/ca/bits/audio/n_cluswarn1.aud differ diff --git a/mods/ca/bits/audio/n_cmissrdy.aud b/mods/ca/bits/audio/n_cmissrdy1.aud similarity index 100% rename from mods/ca/bits/audio/n_cmissrdy.aud rename to mods/ca/bits/audio/n_cmissrdy1.aud diff --git a/mods/ca/bits/audio/n_cmisswarn1.aud b/mods/ca/bits/audio/n_cmisswarn1.aud new file mode 100644 index 0000000000..d1f38bae27 Binary files /dev/null and b/mods/ca/bits/audio/n_cmisswarn1.aud differ diff --git a/mods/ca/bits/audio/n_confcabrdy1.aud b/mods/ca/bits/audio/n_confcabrdy1.aud new file mode 100644 index 0000000000..2a81c2953a Binary files /dev/null and b/mods/ca/bits/audio/n_confcabrdy1.aud differ diff --git a/mods/ca/bits/audio/n_covavail1.aud b/mods/ca/bits/audio/n_covavail1.aud new file mode 100644 index 0000000000..984e29c095 Binary files /dev/null and b/mods/ca/bits/audio/n_covavail1.aud differ diff --git a/mods/ca/bits/audio/n_credit1.aud b/mods/ca/bits/audio/n_credit1.aud index 2eebd77b02..4553c665d3 100644 Binary files a/mods/ca/bits/audio/n_credit1.aud and b/mods/ca/bits/audio/n_credit1.aud differ diff --git a/mods/ca/bits/audio/n_cryostormapp1.aud b/mods/ca/bits/audio/n_cryostormapp1.aud new file mode 100644 index 0000000000..a3f71e91f1 Binary files /dev/null and b/mods/ca/bits/audio/n_cryostormapp1.aud differ diff --git a/mods/ca/bits/audio/n_enmyapp1.aud b/mods/ca/bits/audio/n_enmyapp1.aud new file mode 100644 index 0000000000..92c71d2a65 Binary files /dev/null and b/mods/ca/bits/audio/n_enmyapp1.aud differ diff --git a/mods/ca/bits/audio/n_enmyunitsto1.aud b/mods/ca/bits/audio/n_enmyunitsto1.aud new file mode 100644 index 0000000000..efb2e509d7 Binary files /dev/null and b/mods/ca/bits/audio/n_enmyunitsto1.aud differ diff --git a/mods/ca/bits/audio/n_flare1.aud b/mods/ca/bits/audio/n_flare1.aud new file mode 100644 index 0000000000..4a6ef11de6 Binary files /dev/null and b/mods/ca/bits/audio/n_flare1.aud differ diff --git a/mods/ca/bits/audio/n_forcechg1.aud b/mods/ca/bits/audio/n_forcechg1.aud index 98b8638bee..759fedf19e 100644 Binary files a/mods/ca/bits/audio/n_forcechg1.aud and b/mods/ca/bits/audio/n_forcechg1.aud differ diff --git a/mods/ca/bits/audio/n_forcedr1.aud b/mods/ca/bits/audio/n_forcedr1.aud index 142f124065..ee4837c647 100644 Binary files a/mods/ca/bits/audio/n_forcedr1.aud and b/mods/ca/bits/audio/n_forcedr1.aud differ diff --git a/mods/ca/bits/audio/n_frenzyrdy1.aud b/mods/ca/bits/audio/n_frenzyrdy1.aud new file mode 100644 index 0000000000..c7beb7ddfe Binary files /dev/null and b/mods/ca/bits/audio/n_frenzyrdy1.aud differ diff --git a/mods/ca/bits/audio/n_hackrdy1.aud b/mods/ca/bits/audio/n_hackrdy1.aud new file mode 100644 index 0000000000..0c8a6695a3 Binary files /dev/null and b/mods/ca/bits/audio/n_hackrdy1.aud differ diff --git a/mods/ca/bits/audio/n_infernordy1.aud b/mods/ca/bits/audio/n_infernordy1.aud new file mode 100644 index 0000000000..c7ca622009 Binary files /dev/null and b/mods/ca/bits/audio/n_infernordy1.aud differ diff --git a/mods/ca/bits/audio/n_infilrdy1.aud b/mods/ca/bits/audio/n_infilrdy1.aud new file mode 100644 index 0000000000..3d89780d82 Binary files /dev/null and b/mods/ca/bits/audio/n_infilrdy1.aud differ diff --git a/mods/ca/bits/audio/n_ioncanapp.aud b/mods/ca/bits/audio/n_ioncanapp.aud index 3bb3e72892..1551aa1222 100644 Binary files a/mods/ca/bits/audio/n_ioncanapp.aud and b/mods/ca/bits/audio/n_ioncanapp.aud differ diff --git a/mods/ca/bits/audio/n_load1.aud b/mods/ca/bits/audio/n_load1.aud new file mode 100644 index 0000000000..d3ea43d7a3 Binary files /dev/null and b/mods/ca/bits/audio/n_load1.aud differ diff --git a/mods/ca/bits/audio/n_nopowr1.aud b/mods/ca/bits/audio/n_nopowr1.aud new file mode 100644 index 0000000000..b00a6ec349 Binary files /dev/null and b/mods/ca/bits/audio/n_nopowr1.aud differ diff --git a/mods/ca/bits/audio/n_ourtechlckd1.aud b/mods/ca/bits/audio/n_ourtechlckd1.aud new file mode 100644 index 0000000000..ef96087432 Binary files /dev/null and b/mods/ca/bits/audio/n_ourtechlckd1.aud differ diff --git a/mods/ca/bits/audio/n_ourtechsto1.aud b/mods/ca/bits/audio/n_ourtechsto1.aud new file mode 100644 index 0000000000..7bffdf4673 Binary files /dev/null and b/mods/ca/bits/audio/n_ourtechsto1.aud differ diff --git a/mods/ca/bits/audio/n_overldrdy1.aud b/mods/ca/bits/audio/n_overldrdy1.aud new file mode 100644 index 0000000000..f571a0014d Binary files /dev/null and b/mods/ca/bits/audio/n_overldrdy1.aud differ diff --git a/mods/ca/bits/audio/n_owrathwarn1.aud b/mods/ca/bits/audio/n_owrathwarn1.aud new file mode 100644 index 0000000000..0bff8c0881 Binary files /dev/null and b/mods/ca/bits/audio/n_owrathwarn1.aud differ diff --git a/mods/ca/bits/audio/n_bldgprg1.aud b/mods/ca/bits/audio/n_progres1.aud similarity index 100% rename from mods/ca/bits/audio/n_bldgprg1.aud rename to mods/ca/bits/audio/n_progres1.aud diff --git a/mods/ca/bits/audio/n_riftwarn1.aud b/mods/ca/bits/audio/n_riftwarn1.aud new file mode 100644 index 0000000000..131cf09264 Binary files /dev/null and b/mods/ca/bits/audio/n_riftwarn1.aud differ diff --git a/mods/ca/bits/audio/n_sathackrdy1.aud b/mods/ca/bits/audio/n_sathackrdy1.aud new file mode 100644 index 0000000000..0e81edc452 Binary files /dev/null and b/mods/ca/bits/audio/n_sathackrdy1.aud differ diff --git a/mods/ca/bits/audio/n_save1.aud b/mods/ca/bits/audio/n_save1.aud new file mode 100644 index 0000000000..5ee816cc71 Binary files /dev/null and b/mods/ca/bits/audio/n_save1.aud differ diff --git a/mods/ca/bits/audio/n_shadtmrdy1.aud b/mods/ca/bits/audio/n_shadtmrdy1.aud new file mode 100644 index 0000000000..0ae62f4751 Binary files /dev/null and b/mods/ca/bits/audio/n_shadtmrdy1.aud differ diff --git a/mods/ca/bits/audio/n_stormapp1.aud b/mods/ca/bits/audio/n_stormapp1.aud index f990c3efd9..db585b5b24 100644 Binary files a/mods/ca/bits/audio/n_stormapp1.aud and b/mods/ca/bits/audio/n_stormapp1.aud differ diff --git a/mods/ca/bits/audio/n_techacq1.aud b/mods/ca/bits/audio/n_techacq1.aud new file mode 100644 index 0000000000..48dc3035d4 Binary files /dev/null and b/mods/ca/bits/audio/n_techacq1.aud differ diff --git a/mods/ca/bits/audio/n_techhkrdy1.aud b/mods/ca/bits/audio/n_techhkrdy1.aud new file mode 100644 index 0000000000..c26990be70 Binary files /dev/null and b/mods/ca/bits/audio/n_techhkrdy1.aud differ diff --git a/mods/ca/bits/audio/n_techlckd1.aud b/mods/ca/bits/audio/n_techlckd1.aud new file mode 100644 index 0000000000..1b46c7dd23 Binary files /dev/null and b/mods/ca/bits/audio/n_techlckd1.aud differ diff --git a/mods/ca/bits/audio/n_unitsto.aud b/mods/ca/bits/audio/n_unitsto.aud index c3e9965ed4..8fbcb93b56 100644 Binary files a/mods/ca/bits/audio/n_unitsto.aud and b/mods/ca/bits/audio/n_unitsto.aud differ diff --git a/mods/ca/bits/audio/obelmod2.aud b/mods/ca/bits/audio/obelmod2.aud new file mode 100644 index 0000000000..b93a30c142 Binary files /dev/null and b/mods/ca/bits/audio/obelmod2.aud differ diff --git a/mods/ca/bits/audio/obelpowr2.aud b/mods/ca/bits/audio/obelpowr2.aud new file mode 100644 index 0000000000..ae3ca3cea1 Binary files /dev/null and b/mods/ca/bits/audio/obelpowr2.aud differ diff --git a/mods/ca/bits/audio/optics-disable.aud b/mods/ca/bits/audio/optics-disable.aud new file mode 100644 index 0000000000..451d236190 Binary files /dev/null and b/mods/ca/bits/audio/optics-disable.aud differ diff --git a/mods/ca/bits/audio/optics-enable.aud b/mods/ca/bits/audio/optics-enable.aud new file mode 100644 index 0000000000..9e7af4f1d3 Binary files /dev/null and b/mods/ca/bits/audio/optics-enable.aud differ diff --git a/mods/ca/bits/audio/orcabomb1.aud b/mods/ca/bits/audio/orcabomb1.aud new file mode 100644 index 0000000000..86eb2d0cb5 Binary files /dev/null and b/mods/ca/bits/audio/orcabomb1.aud differ diff --git a/mods/ca/bits/audio/orcabomb2.aud b/mods/ca/bits/audio/orcabomb2.aud new file mode 100644 index 0000000000..7e36ca1778 Binary files /dev/null and b/mods/ca/bits/audio/orcabomb2.aud differ diff --git a/mods/ca/bits/audio/overload.aud b/mods/ca/bits/audio/overload.aud new file mode 100644 index 0000000000..9d5aa7d885 Binary files /dev/null and b/mods/ca/bits/audio/overload.aud differ diff --git a/mods/ca/bits/audio/pcancharge.aud b/mods/ca/bits/audio/pcancharge.aud new file mode 100644 index 0000000000..0e6efa4b2a Binary files /dev/null and b/mods/ca/bits/audio/pcancharge.aud differ diff --git a/mods/ca/bits/audio/pitbull-fire1.aud b/mods/ca/bits/audio/pitbull-fire1.aud new file mode 100644 index 0000000000..5b6cbbc2fb Binary files /dev/null and b/mods/ca/bits/audio/pitbull-fire1.aud differ diff --git a/mods/ca/bits/audio/pitbull-fire2.aud b/mods/ca/bits/audio/pitbull-fire2.aud new file mode 100644 index 0000000000..088aa7c7e9 Binary files /dev/null and b/mods/ca/bits/audio/pitbull-fire2.aud differ diff --git a/mods/ca/bits/audio/pitbull-hit1.aud b/mods/ca/bits/audio/pitbull-hit1.aud new file mode 100644 index 0000000000..43706e8057 Binary files /dev/null and b/mods/ca/bits/audio/pitbull-hit1.aud differ diff --git a/mods/ca/bits/audio/purification.aud b/mods/ca/bits/audio/purification.aud new file mode 100644 index 0000000000..ebc6befc6e Binary files /dev/null and b/mods/ca/bits/audio/purification.aud differ diff --git a/mods/ca/bits/audio/r2_abldgin1.aud b/mods/ca/bits/audio/r2_abldgin1.aud new file mode 100644 index 0000000000..604eb9f5a3 Binary files /dev/null and b/mods/ca/bits/audio/r2_abldgin1.aud differ diff --git a/mods/ca/bits/audio/r2_alaunch1.aud b/mods/ca/bits/audio/r2_alaunch1.aud new file mode 100644 index 0000000000..2c7515cf73 Binary files /dev/null and b/mods/ca/bits/audio/r2_alaunch1.aud differ diff --git a/mods/ca/bits/audio/r2_aready1.aud b/mods/ca/bits/audio/r2_aready1.aud new file mode 100644 index 0000000000..348bd18994 Binary files /dev/null and b/mods/ca/bits/audio/r2_aready1.aud differ diff --git a/mods/ca/bits/audio/r2_atmbombrdy1.aud b/mods/ca/bits/audio/r2_atmbombrdy1.aud new file mode 100644 index 0000000000..16532f32c1 Binary files /dev/null and b/mods/ca/bits/audio/r2_atmbombrdy1.aud differ diff --git a/mods/ca/bits/audio/r2_atmshelrdy1.aud b/mods/ca/bits/audio/r2_atmshelrdy1.aud new file mode 100644 index 0000000000..10251804a5 Binary files /dev/null and b/mods/ca/bits/audio/r2_atmshelrdy1.aud differ diff --git a/mods/ca/bits/audio/r2_aunitl1.aud b/mods/ca/bits/audio/r2_aunitl1.aud new file mode 100644 index 0000000000..10f76c479a Binary files /dev/null and b/mods/ca/bits/audio/r2_aunitl1.aud differ diff --git a/mods/ca/bits/audio/r2_baseatk1.aud b/mods/ca/bits/audio/r2_baseatk1.aud new file mode 100644 index 0000000000..6e65340c22 Binary files /dev/null and b/mods/ca/bits/audio/r2_baseatk1.aud differ diff --git a/mods/ca/bits/audio/r2_bct1.aud b/mods/ca/bits/audio/r2_bct1.aud new file mode 100644 index 0000000000..7fe8f4d3f8 Binary files /dev/null and b/mods/ca/bits/audio/r2_bct1.aud differ diff --git a/mods/ca/bits/audio/r2_bctrinit.aud b/mods/ca/bits/audio/r2_bctrinit.aud new file mode 100644 index 0000000000..29a95b28ee Binary files /dev/null and b/mods/ca/bits/audio/r2_bctrinit.aud differ diff --git a/mods/ca/bits/audio/r2_bldcap1.aud b/mods/ca/bits/audio/r2_bldcap1.aud new file mode 100644 index 0000000000..533b8fe1a8 Binary files /dev/null and b/mods/ca/bits/audio/r2_bldcap1.aud differ diff --git a/mods/ca/bits/audio/r2_bldginf1.aud b/mods/ca/bits/audio/r2_bldginf1.aud new file mode 100644 index 0000000000..310a779657 Binary files /dev/null and b/mods/ca/bits/audio/r2_bldginf1.aud differ diff --git a/mods/ca/bits/audio/r2_bskywarn1.aud b/mods/ca/bits/audio/r2_bskywarn1.aud new file mode 100644 index 0000000000..ef060efa97 Binary files /dev/null and b/mods/ca/bits/audio/r2_bskywarn1.aud differ diff --git a/mods/ca/bits/audio/r2_cancld1.aud b/mods/ca/bits/audio/r2_cancld1.aud new file mode 100644 index 0000000000..7bc8fbcf35 Binary files /dev/null and b/mods/ca/bits/audio/r2_cancld1.aud differ diff --git a/mods/ca/bits/audio/r2_carpetrdy1.aud b/mods/ca/bits/audio/r2_carpetrdy1.aud new file mode 100644 index 0000000000..dfb0c26157 Binary files /dev/null and b/mods/ca/bits/audio/r2_carpetrdy1.aud differ diff --git a/mods/ca/bits/audio/r2_chaosbombsrdy1.aud b/mods/ca/bits/audio/r2_chaosbombsrdy1.aud new file mode 100644 index 0000000000..f5ce6913dc Binary files /dev/null and b/mods/ca/bits/audio/r2_chaosbombsrdy1.aud differ diff --git a/mods/ca/bits/audio/r2_cluswarn1.aud b/mods/ca/bits/audio/r2_cluswarn1.aud new file mode 100644 index 0000000000..a3b4ca7cb3 Binary files /dev/null and b/mods/ca/bits/audio/r2_cluswarn1.aud differ diff --git a/mods/ca/bits/audio/r2_cmisswarn1.aud b/mods/ca/bits/audio/r2_cmisswarn1.aud new file mode 100644 index 0000000000..b88f72d138 Binary files /dev/null and b/mods/ca/bits/audio/r2_cmisswarn1.aud differ diff --git a/mods/ca/bits/audio/r2_conscmp1.aud b/mods/ca/bits/audio/r2_conscmp1.aud new file mode 100644 index 0000000000..ef1c3a2aaa Binary files /dev/null and b/mods/ca/bits/audio/r2_conscmp1.aud differ diff --git a/mods/ca/bits/audio/r2_credit1.aud b/mods/ca/bits/audio/r2_credit1.aud new file mode 100644 index 0000000000..1bf88beaf0 Binary files /dev/null and b/mods/ca/bits/audio/r2_credit1.aud differ diff --git a/mods/ca/bits/audio/r2_cryostormapp1.aud b/mods/ca/bits/audio/r2_cryostormapp1.aud new file mode 100644 index 0000000000..8b7294b08d Binary files /dev/null and b/mods/ca/bits/audio/r2_cryostormapp1.aud differ diff --git a/mods/ca/bits/audio/r2_doctrinesel1.aud b/mods/ca/bits/audio/r2_doctrinesel1.aud new file mode 100644 index 0000000000..2f5ef669b3 Binary files /dev/null and b/mods/ca/bits/audio/r2_doctrinesel1.aud differ diff --git a/mods/ca/bits/audio/r2_enmyapp1.aud b/mods/ca/bits/audio/r2_enmyapp1.aud new file mode 100644 index 0000000000..c672b60068 Binary files /dev/null and b/mods/ca/bits/audio/r2_enmyapp1.aud differ diff --git a/mods/ca/bits/audio/r2_enmyunitsto1.aud b/mods/ca/bits/audio/r2_enmyunitsto1.aud new file mode 100644 index 0000000000..151f0a3b16 Binary files /dev/null and b/mods/ca/bits/audio/r2_enmyunitsto1.aud differ diff --git a/mods/ca/bits/audio/r2_flare1.aud b/mods/ca/bits/audio/r2_flare1.aud new file mode 100644 index 0000000000..79d054ead0 Binary files /dev/null and b/mods/ca/bits/audio/r2_flare1.aud differ diff --git a/mods/ca/bits/audio/r2_forcechg1.aud b/mods/ca/bits/audio/r2_forcechg1.aud new file mode 100644 index 0000000000..f0190878d8 Binary files /dev/null and b/mods/ca/bits/audio/r2_forcechg1.aud differ diff --git a/mods/ca/bits/audio/r2_forcedr1.aud b/mods/ca/bits/audio/r2_forcedr1.aud new file mode 100644 index 0000000000..79ca506b64 Binary files /dev/null and b/mods/ca/bits/audio/r2_forcedr1.aud differ diff --git a/mods/ca/bits/audio/r2_gmutrdy1.aud b/mods/ca/bits/audio/r2_gmutrdy1.aud new file mode 100644 index 0000000000..23e3751c7c Binary files /dev/null and b/mods/ca/bits/audio/r2_gmutrdy1.aud differ diff --git a/mods/ca/bits/audio/r2_harvatk1.aud b/mods/ca/bits/audio/r2_harvatk1.aud new file mode 100644 index 0000000000..03ceae5785 Binary files /dev/null and b/mods/ca/bits/audio/r2_harvatk1.aud differ diff --git a/mods/ca/bits/audio/r2_heroesrdy1.aud b/mods/ca/bits/audio/r2_heroesrdy1.aud new file mode 100644 index 0000000000..9fff1e8393 Binary files /dev/null and b/mods/ca/bits/audio/r2_heroesrdy1.aud differ diff --git a/mods/ca/bits/audio/r2_ioncanapp.aud b/mods/ca/bits/audio/r2_ioncanapp.aud new file mode 100644 index 0000000000..7c800f3e1d Binary files /dev/null and b/mods/ca/bits/audio/r2_ioncanapp.aud differ diff --git a/mods/ca/bits/audio/r2_ironrdy1.aud b/mods/ca/bits/audio/r2_ironrdy1.aud new file mode 100644 index 0000000000..c2182d96e2 Binary files /dev/null and b/mods/ca/bits/audio/r2_ironrdy1.aud differ diff --git a/mods/ca/bits/audio/r2_killzonerdy1.aud b/mods/ca/bits/audio/r2_killzonerdy1.aud new file mode 100644 index 0000000000..8d60da1387 Binary files /dev/null and b/mods/ca/bits/audio/r2_killzonerdy1.aud differ diff --git a/mods/ca/bits/audio/r2_load1.aud b/mods/ca/bits/audio/r2_load1.aud new file mode 100644 index 0000000000..fbcff33e61 Binary files /dev/null and b/mods/ca/bits/audio/r2_load1.aud differ diff --git a/mods/ca/bits/audio/r2_lopower1.aud b/mods/ca/bits/audio/r2_lopower1.aud new file mode 100644 index 0000000000..b607587516 Binary files /dev/null and b/mods/ca/bits/audio/r2_lopower1.aud differ diff --git a/mods/ca/bits/audio/r2_misnlst1.aud b/mods/ca/bits/audio/r2_misnlst1.aud new file mode 100644 index 0000000000..b3eb856ed3 Binary files /dev/null and b/mods/ca/bits/audio/r2_misnlst1.aud differ diff --git a/mods/ca/bits/audio/r2_misnwon1.aud b/mods/ca/bits/audio/r2_misnwon1.aud new file mode 100644 index 0000000000..791c9a260b Binary files /dev/null and b/mods/ca/bits/audio/r2_misnwon1.aud differ diff --git a/mods/ca/bits/audio/r2_navylst1.aud b/mods/ca/bits/audio/r2_navylst1.aud new file mode 100644 index 0000000000..ee8de5257e Binary files /dev/null and b/mods/ca/bits/audio/r2_navylst1.aud differ diff --git a/mods/ca/bits/audio/r2_newopt1.aud b/mods/ca/bits/audio/r2_newopt1.aud new file mode 100644 index 0000000000..d896eb6ebb Binary files /dev/null and b/mods/ca/bits/audio/r2_newopt1.aud differ diff --git a/mods/ca/bits/audio/r2_nobuild1.aud b/mods/ca/bits/audio/r2_nobuild1.aud new file mode 100644 index 0000000000..51d9cf9c1f Binary files /dev/null and b/mods/ca/bits/audio/r2_nobuild1.aud differ diff --git a/mods/ca/bits/audio/r2_nodeply1.aud b/mods/ca/bits/audio/r2_nodeply1.aud new file mode 100644 index 0000000000..6d3cdfd18b Binary files /dev/null and b/mods/ca/bits/audio/r2_nodeply1.aud differ diff --git a/mods/ca/bits/audio/r2_nofunds1.aud b/mods/ca/bits/audio/r2_nofunds1.aud new file mode 100644 index 0000000000..3cb7db14d6 Binary files /dev/null and b/mods/ca/bits/audio/r2_nofunds1.aud differ diff --git a/mods/ca/bits/audio/r2_nopowr1.aud b/mods/ca/bits/audio/r2_nopowr1.aud new file mode 100644 index 0000000000..8de4f49ea5 Binary files /dev/null and b/mods/ca/bits/audio/r2_nopowr1.aud differ diff --git a/mods/ca/bits/audio/r2_onhold1.aud b/mods/ca/bits/audio/r2_onhold1.aud new file mode 100644 index 0000000000..1ee1d466db Binary files /dev/null and b/mods/ca/bits/audio/r2_onhold1.aud differ diff --git a/mods/ca/bits/audio/r2_ourtechlckd1.aud b/mods/ca/bits/audio/r2_ourtechlckd1.aud new file mode 100644 index 0000000000..83a009ba08 Binary files /dev/null and b/mods/ca/bits/audio/r2_ourtechlckd1.aud differ diff --git a/mods/ca/bits/audio/r2_ourtechsto1.aud b/mods/ca/bits/audio/r2_ourtechsto1.aud new file mode 100644 index 0000000000..df80772fce Binary files /dev/null and b/mods/ca/bits/audio/r2_ourtechsto1.aud differ diff --git a/mods/ca/bits/audio/r2_owrathwarn1.aud b/mods/ca/bits/audio/r2_owrathwarn1.aud new file mode 100644 index 0000000000..da59173cd5 Binary files /dev/null and b/mods/ca/bits/audio/r2_owrathwarn1.aud differ diff --git a/mods/ca/bits/audio/r2_parabrdy1.aud b/mods/ca/bits/audio/r2_parabrdy1.aud new file mode 100644 index 0000000000..e73c7c5f7c Binary files /dev/null and b/mods/ca/bits/audio/r2_parabrdy1.aud differ diff --git a/mods/ca/bits/audio/r2_paratrdy1.aud b/mods/ca/bits/audio/r2_paratrdy1.aud new file mode 100644 index 0000000000..0f54f7050c Binary files /dev/null and b/mods/ca/bits/audio/r2_paratrdy1.aud differ diff --git a/mods/ca/bits/audio/r2_pribldg1.aud b/mods/ca/bits/audio/r2_pribldg1.aud new file mode 100644 index 0000000000..31479e1721 Binary files /dev/null and b/mods/ca/bits/audio/r2_pribldg1.aud differ diff --git a/mods/ca/bits/audio/r2_progres1.aud b/mods/ca/bits/audio/r2_progres1.aud new file mode 100644 index 0000000000..e7ebd7f11e Binary files /dev/null and b/mods/ca/bits/audio/r2_progres1.aud differ diff --git a/mods/ca/bits/audio/r2_promtd1.aud b/mods/ca/bits/audio/r2_promtd1.aud new file mode 100644 index 0000000000..001f23ae59 Binary files /dev/null and b/mods/ca/bits/audio/r2_promtd1.aud differ diff --git a/mods/ca/bits/audio/r2_pulse1.aud b/mods/ca/bits/audio/r2_pulse1.aud new file mode 100644 index 0000000000..b5644ce4d7 Binary files /dev/null and b/mods/ca/bits/audio/r2_pulse1.aud differ diff --git a/mods/ca/bits/audio/r2_reinfor1.aud b/mods/ca/bits/audio/r2_reinfor1.aud new file mode 100644 index 0000000000..31546903b4 Binary files /dev/null and b/mods/ca/bits/audio/r2_reinfor1.aud differ diff --git a/mods/ca/bits/audio/r2_repair1.aud b/mods/ca/bits/audio/r2_repair1.aud new file mode 100644 index 0000000000..c961b139ae Binary files /dev/null and b/mods/ca/bits/audio/r2_repair1.aud differ diff --git a/mods/ca/bits/audio/r2_riftwarn1.aud b/mods/ca/bits/audio/r2_riftwarn1.aud new file mode 100644 index 0000000000..abab2fc197 Binary files /dev/null and b/mods/ca/bits/audio/r2_riftwarn1.aud differ diff --git a/mods/ca/bits/audio/r2_satlnch1.aud b/mods/ca/bits/audio/r2_satlnch1.aud new file mode 100644 index 0000000000..3b3e354eee Binary files /dev/null and b/mods/ca/bits/audio/r2_satlnch1.aud differ diff --git a/mods/ca/bits/audio/r2_save1.aud b/mods/ca/bits/audio/r2_save1.aud new file mode 100644 index 0000000000..07f607127b Binary files /dev/null and b/mods/ca/bits/audio/r2_save1.aud differ diff --git a/mods/ca/bits/audio/r2_silond1.aud b/mods/ca/bits/audio/r2_silond1.aud new file mode 100644 index 0000000000..62770b733b Binary files /dev/null and b/mods/ca/bits/audio/r2_silond1.aud differ diff --git a/mods/ca/bits/audio/r2_slcttgt1.aud b/mods/ca/bits/audio/r2_slcttgt1.aud new file mode 100644 index 0000000000..3e9a8daf5d Binary files /dev/null and b/mods/ca/bits/audio/r2_slcttgt1.aud differ diff --git a/mods/ca/bits/audio/r2_spypln1.aud b/mods/ca/bits/audio/r2_spypln1.aud new file mode 100644 index 0000000000..6b09ff5866 Binary files /dev/null and b/mods/ca/bits/audio/r2_spypln1.aud differ diff --git a/mods/ca/bits/audio/r2_stmtrprdy1.aud b/mods/ca/bits/audio/r2_stmtrprdy1.aud new file mode 100644 index 0000000000..c2cec14acd Binary files /dev/null and b/mods/ca/bits/audio/r2_stmtrprdy1.aud differ diff --git a/mods/ca/bits/audio/r2_stormapp1.aud b/mods/ca/bits/audio/r2_stormapp1.aud new file mode 100644 index 0000000000..ebb1c20bf8 Binary files /dev/null and b/mods/ca/bits/audio/r2_stormapp1.aud differ diff --git a/mods/ca/bits/audio/r2_strucap1.aud b/mods/ca/bits/audio/r2_strucap1.aud new file mode 100644 index 0000000000..b074859ef8 Binary files /dev/null and b/mods/ca/bits/audio/r2_strucap1.aud differ diff --git a/mods/ca/bits/audio/r2_strusld1.aud b/mods/ca/bits/audio/r2_strusld1.aud new file mode 100644 index 0000000000..4e655286ca Binary files /dev/null and b/mods/ca/bits/audio/r2_strusld1.aud differ diff --git a/mods/ca/bits/audio/r2_tankdroprdy1.aud b/mods/ca/bits/audio/r2_tankdroprdy1.aud new file mode 100644 index 0000000000..3d8049182a Binary files /dev/null and b/mods/ca/bits/audio/r2_tankdroprdy1.aud differ diff --git a/mods/ca/bits/audio/r2_techacq1.aud b/mods/ca/bits/audio/r2_techacq1.aud new file mode 100644 index 0000000000..d79146c7ae Binary files /dev/null and b/mods/ca/bits/audio/r2_techacq1.aud differ diff --git a/mods/ca/bits/audio/r2_techlckd1.aud b/mods/ca/bits/audio/r2_techlckd1.aud new file mode 100644 index 0000000000..44c00e1aa3 Binary files /dev/null and b/mods/ca/bits/audio/r2_techlckd1.aud differ diff --git a/mods/ca/bits/audio/r2_train1.aud b/mods/ca/bits/audio/r2_train1.aud new file mode 100644 index 0000000000..534c0b9c38 Binary files /dev/null and b/mods/ca/bits/audio/r2_train1.aud differ diff --git a/mods/ca/bits/audio/r2_unitlst1.aud b/mods/ca/bits/audio/r2_unitlst1.aud new file mode 100644 index 0000000000..f56655a962 Binary files /dev/null and b/mods/ca/bits/audio/r2_unitlst1.aud differ diff --git a/mods/ca/bits/audio/r2_unitrdy1.aud b/mods/ca/bits/audio/r2_unitrdy1.aud new file mode 100644 index 0000000000..6870f26512 Binary files /dev/null and b/mods/ca/bits/audio/r2_unitrdy1.aud differ diff --git a/mods/ca/bits/audio/r2_unitrep1.aud b/mods/ca/bits/audio/r2_unitrep1.aud new file mode 100644 index 0000000000..7ed1eae95d Binary files /dev/null and b/mods/ca/bits/audio/r2_unitrep1.aud differ diff --git a/mods/ca/bits/audio/r2_unitsto.aud b/mods/ca/bits/audio/r2_unitsto.aud new file mode 100644 index 0000000000..96e06f42fa Binary files /dev/null and b/mods/ca/bits/audio/r2_unitsto.aud differ diff --git a/mods/ca/bits/audio/r2_unitupg1.aud b/mods/ca/bits/audio/r2_unitupg1.aud new file mode 100644 index 0000000000..9dea14d20f Binary files /dev/null and b/mods/ca/bits/audio/r2_unitupg1.aud differ diff --git a/mods/ca/bits/audio/r2_upgrade.aud b/mods/ca/bits/audio/r2_upgrade.aud new file mode 100644 index 0000000000..dcea65987f Binary files /dev/null and b/mods/ca/bits/audio/r2_upgrade.aud differ diff --git a/mods/ca/bits/audio/r_atmbombrdy1.aud b/mods/ca/bits/audio/r_atmbombrdy1.aud new file mode 100644 index 0000000000..655d66c2a6 Binary files /dev/null and b/mods/ca/bits/audio/r_atmbombrdy1.aud differ diff --git a/mods/ca/bits/audio/r_atmshelrdy1.aud b/mods/ca/bits/audio/r_atmshelrdy1.aud new file mode 100644 index 0000000000..221e7eb7f2 Binary files /dev/null and b/mods/ca/bits/audio/r_atmshelrdy1.aud differ diff --git a/mods/ca/bits/audio/r_bldcap1.aud b/mods/ca/bits/audio/r_bldcap1.aud new file mode 100644 index 0000000000..0aa2b4923f Binary files /dev/null and b/mods/ca/bits/audio/r_bldcap1.aud differ diff --git a/mods/ca/bits/audio/r_bskyrdy1.aud b/mods/ca/bits/audio/r_bskyrdy1.aud new file mode 100644 index 0000000000..0236df170f Binary files /dev/null and b/mods/ca/bits/audio/r_bskyrdy1.aud differ diff --git a/mods/ca/bits/audio/r_bskywarn1.aud b/mods/ca/bits/audio/r_bskywarn1.aud new file mode 100644 index 0000000000..107489342f Binary files /dev/null and b/mods/ca/bits/audio/r_bskywarn1.aud differ diff --git a/mods/ca/bits/audio/r_carpetrdy1.aud b/mods/ca/bits/audio/r_carpetrdy1.aud new file mode 100644 index 0000000000..d18c51261d Binary files /dev/null and b/mods/ca/bits/audio/r_carpetrdy1.aud differ diff --git a/mods/ca/bits/audio/r_chaosbombsrdy1.aud b/mods/ca/bits/audio/r_chaosbombsrdy1.aud new file mode 100644 index 0000000000..8b2337f59b Binary files /dev/null and b/mods/ca/bits/audio/r_chaosbombsrdy1.aud differ diff --git a/mods/ca/bits/audio/r_chemstrdy1.aud b/mods/ca/bits/audio/r_chemstrdy1.aud new file mode 100644 index 0000000000..a270c64d02 Binary files /dev/null and b/mods/ca/bits/audio/r_chemstrdy1.aud differ diff --git a/mods/ca/bits/audio/r_cluswarn1.aud b/mods/ca/bits/audio/r_cluswarn1.aud new file mode 100644 index 0000000000..b425f876cf Binary files /dev/null and b/mods/ca/bits/audio/r_cluswarn1.aud differ diff --git a/mods/ca/bits/audio/r_cminesrdy1.aud b/mods/ca/bits/audio/r_cminesrdy1.aud new file mode 100644 index 0000000000..ec44ce1d7b Binary files /dev/null and b/mods/ca/bits/audio/r_cminesrdy1.aud differ diff --git a/mods/ca/bits/audio/r_cmisswarn1.aud b/mods/ca/bits/audio/r_cmisswarn1.aud new file mode 100644 index 0000000000..f2e28743ef Binary files /dev/null and b/mods/ca/bits/audio/r_cmisswarn1.aud differ diff --git a/mods/ca/bits/audio/r_coalitionrdy1.aud b/mods/ca/bits/audio/r_coalitionrdy1.aud new file mode 100644 index 0000000000..199a799333 Binary files /dev/null and b/mods/ca/bits/audio/r_coalitionrdy1.aud differ diff --git a/mods/ca/bits/audio/r_coalitionsel1.aud b/mods/ca/bits/audio/r_coalitionsel1.aud new file mode 100644 index 0000000000..9d703d03cb Binary files /dev/null and b/mods/ca/bits/audio/r_coalitionsel1.aud differ diff --git a/mods/ca/bits/audio/r_cryostormapp1.aud b/mods/ca/bits/audio/r_cryostormapp1.aud new file mode 100644 index 0000000000..fac3df1544 Binary files /dev/null and b/mods/ca/bits/audio/r_cryostormapp1.aud differ diff --git a/mods/ca/bits/audio/r_cryostormrdy1.aud b/mods/ca/bits/audio/r_cryostormrdy1.aud new file mode 100644 index 0000000000..3922a73382 Binary files /dev/null and b/mods/ca/bits/audio/r_cryostormrdy1.aud differ diff --git a/mods/ca/bits/audio/r_emmisrdy1.aud b/mods/ca/bits/audio/r_emmisrdy1.aud new file mode 100644 index 0000000000..9cf5b6f8be Binary files /dev/null and b/mods/ca/bits/audio/r_emmisrdy1.aud differ diff --git a/mods/ca/bits/audio/enmydet.aud b/mods/ca/bits/audio/r_enmydet.aud similarity index 100% rename from mods/ca/bits/audio/enmydet.aud rename to mods/ca/bits/audio/r_enmydet.aud diff --git a/mods/ca/bits/audio/r_enmyunitsto1.aud b/mods/ca/bits/audio/r_enmyunitsto1.aud new file mode 100644 index 0000000000..d3cb8d3786 Binary files /dev/null and b/mods/ca/bits/audio/r_enmyunitsto1.aud differ diff --git a/mods/ca/bits/audio/r_forcechg1.aud b/mods/ca/bits/audio/r_forcechg1.aud index 2dc377991a..ef7e63facf 100644 Binary files a/mods/ca/bits/audio/r_forcechg1.aud and b/mods/ca/bits/audio/r_forcechg1.aud differ diff --git a/mods/ca/bits/audio/r_forcedr1.aud b/mods/ca/bits/audio/r_forcedr1.aud new file mode 100644 index 0000000000..cbd43bfabd Binary files /dev/null and b/mods/ca/bits/audio/r_forcedr1.aud differ diff --git a/mods/ca/bits/audio/r_forcerdr1.aud b/mods/ca/bits/audio/r_forcerdr1.aud deleted file mode 100644 index 2dbfa8c7d1..0000000000 Binary files a/mods/ca/bits/audio/r_forcerdr1.aud and /dev/null differ diff --git a/mods/ca/bits/audio/r_gmutrdy1.aud b/mods/ca/bits/audio/r_gmutrdy1.aud new file mode 100644 index 0000000000..d3a06e73c4 Binary files /dev/null and b/mods/ca/bits/audio/r_gmutrdy1.aud differ diff --git a/mods/ca/bits/audio/r_harvatk1.aud b/mods/ca/bits/audio/r_harvatk1.aud new file mode 100644 index 0000000000..9f999f1a25 Binary files /dev/null and b/mods/ca/bits/audio/r_harvatk1.aud differ diff --git a/mods/ca/bits/audio/r_heliosrdy1.aud b/mods/ca/bits/audio/r_heliosrdy1.aud new file mode 100644 index 0000000000..a4357e4042 Binary files /dev/null and b/mods/ca/bits/audio/r_heliosrdy1.aud differ diff --git a/mods/ca/bits/audio/r_influencelevel1.aud b/mods/ca/bits/audio/r_influencelevel1.aud new file mode 100644 index 0000000000..126c729aa2 Binary files /dev/null and b/mods/ca/bits/audio/r_influencelevel1.aud differ diff --git a/mods/ca/bits/audio/r_influencelevel2.aud b/mods/ca/bits/audio/r_influencelevel2.aud new file mode 100644 index 0000000000..a23b98c49c Binary files /dev/null and b/mods/ca/bits/audio/r_influencelevel2.aud differ diff --git a/mods/ca/bits/audio/r_ioncanapp.aud b/mods/ca/bits/audio/r_ioncanapp.aud index 216aebf7df..f8fb11f1ee 100644 Binary files a/mods/ca/bits/audio/r_ioncanapp.aud and b/mods/ca/bits/audio/r_ioncanapp.aud differ diff --git a/mods/ca/bits/audio/r_ourtechlckd1.aud b/mods/ca/bits/audio/r_ourtechlckd1.aud new file mode 100644 index 0000000000..6ecc80ca50 Binary files /dev/null and b/mods/ca/bits/audio/r_ourtechlckd1.aud differ diff --git a/mods/ca/bits/audio/r_ourtechsto1.aud b/mods/ca/bits/audio/r_ourtechsto1.aud new file mode 100644 index 0000000000..3fe04ebe91 Binary files /dev/null and b/mods/ca/bits/audio/r_ourtechsto1.aud differ diff --git a/mods/ca/bits/audio/r_owrathwarn1.aud b/mods/ca/bits/audio/r_owrathwarn1.aud new file mode 100644 index 0000000000..21a99480b9 Binary files /dev/null and b/mods/ca/bits/audio/r_owrathwarn1.aud differ diff --git a/mods/ca/bits/audio/r_parabrdy1.aud b/mods/ca/bits/audio/r_parabrdy1.aud new file mode 100644 index 0000000000..ba427cd4ce Binary files /dev/null and b/mods/ca/bits/audio/r_parabrdy1.aud differ diff --git a/mods/ca/bits/audio/r_paratrdy1.aud b/mods/ca/bits/audio/r_paratrdy1.aud new file mode 100644 index 0000000000..1abf07edae Binary files /dev/null and b/mods/ca/bits/audio/r_paratrdy1.aud differ diff --git a/mods/ca/bits/audio/r_riftwarn1.aud b/mods/ca/bits/audio/r_riftwarn1.aud new file mode 100644 index 0000000000..5f4ca8a00e Binary files /dev/null and b/mods/ca/bits/audio/r_riftwarn1.aud differ diff --git a/mods/ca/bits/audio/r_sprsrdy.aud b/mods/ca/bits/audio/r_sprsrdy.aud new file mode 100644 index 0000000000..66e150a3b9 Binary files /dev/null and b/mods/ca/bits/audio/r_sprsrdy.aud differ diff --git a/mods/ca/bits/audio/r_stmtrprdy1.aud b/mods/ca/bits/audio/r_stmtrprdy1.aud new file mode 100644 index 0000000000..7b05ae3caf Binary files /dev/null and b/mods/ca/bits/audio/r_stmtrprdy1.aud differ diff --git a/mods/ca/bits/audio/r_stormapp1.aud b/mods/ca/bits/audio/r_stormapp1.aud new file mode 100644 index 0000000000..dc8ad0a88d Binary files /dev/null and b/mods/ca/bits/audio/r_stormapp1.aud differ diff --git a/mods/ca/bits/audio/r_stormrdy1.aud b/mods/ca/bits/audio/r_stormrdy1.aud index 15abf1c756..37203e30da 100644 Binary files a/mods/ca/bits/audio/r_stormrdy1.aud and b/mods/ca/bits/audio/r_stormrdy1.aud differ diff --git a/mods/ca/bits/audio/r_strafrdy1.aud b/mods/ca/bits/audio/r_strafrdy1.aud new file mode 100644 index 0000000000..315ebe4902 Binary files /dev/null and b/mods/ca/bits/audio/r_strafrdy1.aud differ diff --git a/mods/ca/bits/audio/r_targfre1.aud b/mods/ca/bits/audio/r_targfre1.aud new file mode 100644 index 0000000000..f999460121 Binary files /dev/null and b/mods/ca/bits/audio/r_targfre1.aud differ diff --git a/mods/ca/bits/audio/r_techacq1.aud b/mods/ca/bits/audio/r_techacq1.aud new file mode 100644 index 0000000000..11b376f9e3 Binary files /dev/null and b/mods/ca/bits/audio/r_techacq1.aud differ diff --git a/mods/ca/bits/audio/r_techlckd1.aud b/mods/ca/bits/audio/r_techlckd1.aud new file mode 100644 index 0000000000..0281b4a32a Binary files /dev/null and b/mods/ca/bits/audio/r_techlckd1.aud differ diff --git a/mods/ca/bits/audio/r_tempincrdy1.aud b/mods/ca/bits/audio/r_tempincrdy1.aud new file mode 100644 index 0000000000..b48f9cf76b Binary files /dev/null and b/mods/ca/bits/audio/r_tempincrdy1.aud differ diff --git a/mods/ca/bits/audio/r_twrprdy1.aud b/mods/ca/bits/audio/r_twrprdy1.aud new file mode 100644 index 0000000000..8797bdfdd1 Binary files /dev/null and b/mods/ca/bits/audio/r_twrprdy1.aud differ diff --git a/mods/ca/bits/audio/r_vowrdy1.aud b/mods/ca/bits/audio/r_vowrdy1.aud new file mode 100644 index 0000000000..1fe626a48b Binary files /dev/null and b/mods/ca/bits/audio/r_vowrdy1.aud differ diff --git a/mods/ca/bits/audio/radbeam1.aud b/mods/ca/bits/audio/radbeam1.aud new file mode 100644 index 0000000000..adfa2cc7f3 Binary files /dev/null and b/mods/ca/bits/audio/radbeam1.aud differ diff --git a/mods/ca/bits/audio/rage-gen.aud b/mods/ca/bits/audio/rage-gen.aud new file mode 100644 index 0000000000..e116618d5e Binary files /dev/null and b/mods/ca/bits/audio/rage-gen.aud differ diff --git a/mods/ca/bits/audio/rbombit1.aud b/mods/ca/bits/audio/rbombit1.aud new file mode 100644 index 0000000000..c039340811 Binary files /dev/null and b/mods/ca/bits/audio/rbombit1.aud differ diff --git a/mods/ca/bits/audio/rbug-fire1.aud b/mods/ca/bits/audio/rbug-fire1.aud new file mode 100644 index 0000000000..2f77ecbfdb Binary files /dev/null and b/mods/ca/bits/audio/rbug-fire1.aud differ diff --git a/mods/ca/bits/audio/reap-explosion1.aud b/mods/ca/bits/audio/reap-explosion1.aud new file mode 100644 index 0000000000..949fe5fdeb Binary files /dev/null and b/mods/ca/bits/audio/reap-explosion1.aud differ diff --git a/mods/ca/bits/audio/reap-fire1.aud b/mods/ca/bits/audio/reap-fire1.aud new file mode 100644 index 0000000000..9c3a51ab9f Binary files /dev/null and b/mods/ca/bits/audio/reap-fire1.aud differ diff --git a/mods/ca/bits/audio/reap-fire2.aud b/mods/ca/bits/audio/reap-fire2.aud new file mode 100644 index 0000000000..72c567f767 Binary files /dev/null and b/mods/ca/bits/audio/reap-fire2.aud differ diff --git a/mods/ca/bits/audio/reap-snarefire.aud b/mods/ca/bits/audio/reap-snarefire.aud new file mode 100644 index 0000000000..d0eab1d9bc Binary files /dev/null and b/mods/ca/bits/audio/reap-snarefire.aud differ diff --git a/mods/ca/bits/audio/reap-snarehit.aud b/mods/ca/bits/audio/reap-snarehit.aud new file mode 100644 index 0000000000..0be758ec3c Binary files /dev/null and b/mods/ca/bits/audio/reap-snarehit.aud differ diff --git a/mods/ca/bits/audio/rocketshell1.aud b/mods/ca/bits/audio/rocketshell1.aud new file mode 100644 index 0000000000..250f1c48da Binary files /dev/null and b/mods/ca/bits/audio/rocketshell1.aud differ diff --git a/mods/ca/bits/audio/rocketshell2.aud b/mods/ca/bits/audio/rocketshell2.aud new file mode 100644 index 0000000000..245ef44488 Binary files /dev/null and b/mods/ca/bits/audio/rocketshell2.aud differ diff --git a/mods/ca/bits/audio/rocketshell3.aud b/mods/ca/bits/audio/rocketshell3.aud new file mode 100644 index 0000000000..2c1e00910b Binary files /dev/null and b/mods/ca/bits/audio/rocketshell3.aud differ diff --git a/mods/ca/bits/audio/s_bskywarn1.aud b/mods/ca/bits/audio/s_bskywarn1.aud new file mode 100644 index 0000000000..c630266136 Binary files /dev/null and b/mods/ca/bits/audio/s_bskywarn1.aud differ diff --git a/mods/ca/bits/audio/s_cryostormapp1.aud b/mods/ca/bits/audio/s_cryostormapp1.aud new file mode 100644 index 0000000000..97272f184e Binary files /dev/null and b/mods/ca/bits/audio/s_cryostormapp1.aud differ diff --git a/mods/ca/bits/audio/sapc-fire1.aud b/mods/ca/bits/audio/sapc-fire1.aud new file mode 100644 index 0000000000..5aa2dee536 Binary files /dev/null and b/mods/ca/bits/audio/sapc-fire1.aud differ diff --git a/mods/ca/bits/audio/sapc-fire2.aud b/mods/ca/bits/audio/sapc-fire2.aud new file mode 100644 index 0000000000..400c061dde Binary files /dev/null and b/mods/ca/bits/audio/sapc-fire2.aud differ diff --git a/mods/ca/bits/audio/sealc4tick1.aud b/mods/ca/bits/audio/sealc4tick1.aud new file mode 100644 index 0000000000..3b3bacb1fb Binary files /dev/null and b/mods/ca/bits/audio/sealc4tick1.aud differ diff --git a/mods/ca/bits/audio/sealc4tick2.aud b/mods/ca/bits/audio/sealc4tick2.aud new file mode 100644 index 0000000000..17dfc059a3 Binary files /dev/null and b/mods/ca/bits/audio/sealc4tick2.aud differ diff --git a/mods/ca/bits/audio/shktrop1.aud b/mods/ca/bits/audio/shktrop1.aud new file mode 100644 index 0000000000..58e7a67654 Binary files /dev/null and b/mods/ca/bits/audio/shktrop1.aud differ diff --git a/mods/ca/bits/audio/sidewinder.aud b/mods/ca/bits/audio/sidewinder.aud new file mode 100644 index 0000000000..e5e7b74164 Binary files /dev/null and b/mods/ca/bits/audio/sidewinder.aud differ diff --git a/mods/ca/bits/audio/sirodefa.aud b/mods/ca/bits/audio/sirodefa.aud new file mode 100644 index 0000000000..0d36cdc939 Binary files /dev/null and b/mods/ca/bits/audio/sirodefa.aud differ diff --git a/mods/ca/bits/audio/sirodefb.aud b/mods/ca/bits/audio/sirodefb.aud new file mode 100644 index 0000000000..d7604c260c Binary files /dev/null and b/mods/ca/bits/audio/sirodefb.aud differ diff --git a/mods/ca/bits/audio/sirodefc.aud b/mods/ca/bits/audio/sirodefc.aud new file mode 100644 index 0000000000..c234526630 Binary files /dev/null and b/mods/ca/bits/audio/sirodefc.aud differ diff --git a/mods/ca/bits/audio/sirodefd.aud b/mods/ca/bits/audio/sirodefd.aud new file mode 100644 index 0000000000..9b578b6685 Binary files /dev/null and b/mods/ca/bits/audio/sirodefd.aud differ diff --git a/mods/ca/bits/audio/smer-fire1.aud b/mods/ca/bits/audio/smer-fire1.aud new file mode 100644 index 0000000000..c215cfd3b0 Binary files /dev/null and b/mods/ca/bits/audio/smer-fire1.aud differ diff --git a/mods/ca/bits/audio/smer-fire2.aud b/mods/ca/bits/audio/smer-fire2.aud new file mode 100644 index 0000000000..3bd810b10d Binary files /dev/null and b/mods/ca/bits/audio/smer-fire2.aud differ diff --git a/mods/ca/bits/audio/sonicmortarhit1.aud b/mods/ca/bits/audio/sonicmortarhit1.aud new file mode 100644 index 0000000000..de51f7eb90 Binary files /dev/null and b/mods/ca/bits/audio/sonicmortarhit1.aud differ diff --git a/mods/ca/bits/audio/sonicmortarhit2.aud b/mods/ca/bits/audio/sonicmortarhit2.aud new file mode 100644 index 0000000000..832d36744d Binary files /dev/null and b/mods/ca/bits/audio/sonicmortarhit2.aud differ diff --git a/mods/ca/bits/audio/spec-attack1.aud b/mods/ca/bits/audio/spec-attack1.aud new file mode 100644 index 0000000000..1566fca240 Binary files /dev/null and b/mods/ca/bits/audio/spec-attack1.aud differ diff --git a/mods/ca/bits/audio/spec-attack2.aud b/mods/ca/bits/audio/spec-attack2.aud new file mode 100644 index 0000000000..c34b55389d Binary files /dev/null and b/mods/ca/bits/audio/spec-attack2.aud differ diff --git a/mods/ca/bits/audio/spec-attack3.aud b/mods/ca/bits/audio/spec-attack3.aud new file mode 100644 index 0000000000..e22e9c4a2d Binary files /dev/null and b/mods/ca/bits/audio/spec-attack3.aud differ diff --git a/mods/ca/bits/audio/spec-attack4.aud b/mods/ca/bits/audio/spec-attack4.aud new file mode 100644 index 0000000000..d7d5bbe8f6 Binary files /dev/null and b/mods/ca/bits/audio/spec-attack4.aud differ diff --git a/mods/ca/bits/audio/spec-move1.aud b/mods/ca/bits/audio/spec-move1.aud new file mode 100644 index 0000000000..be631c03bc Binary files /dev/null and b/mods/ca/bits/audio/spec-move1.aud differ diff --git a/mods/ca/bits/audio/spec-move2.aud b/mods/ca/bits/audio/spec-move2.aud new file mode 100644 index 0000000000..5aadb39770 Binary files /dev/null and b/mods/ca/bits/audio/spec-move2.aud differ diff --git a/mods/ca/bits/audio/spec-move3.aud b/mods/ca/bits/audio/spec-move3.aud new file mode 100644 index 0000000000..dfbf5f4d61 Binary files /dev/null and b/mods/ca/bits/audio/spec-move3.aud differ diff --git a/mods/ca/bits/audio/spec-move4.aud b/mods/ca/bits/audio/spec-move4.aud new file mode 100644 index 0000000000..520dc8e423 Binary files /dev/null and b/mods/ca/bits/audio/spec-move4.aud differ diff --git a/mods/ca/bits/audio/spec-select1.aud b/mods/ca/bits/audio/spec-select1.aud new file mode 100644 index 0000000000..dd7563653d Binary files /dev/null and b/mods/ca/bits/audio/spec-select1.aud differ diff --git a/mods/ca/bits/audio/spec-select2.aud b/mods/ca/bits/audio/spec-select2.aud new file mode 100644 index 0000000000..c7ff46c18b Binary files /dev/null and b/mods/ca/bits/audio/spec-select2.aud differ diff --git a/mods/ca/bits/audio/spec-select3.aud b/mods/ca/bits/audio/spec-select3.aud new file mode 100644 index 0000000000..09b9f5b30f Binary files /dev/null and b/mods/ca/bits/audio/spec-select3.aud differ diff --git a/mods/ca/bits/audio/spec-select4.aud b/mods/ca/bits/audio/spec-select4.aud new file mode 100644 index 0000000000..5594180cb5 Binary files /dev/null and b/mods/ca/bits/audio/spec-select4.aud differ diff --git a/mods/ca/bits/audio/subdril1.aud b/mods/ca/bits/audio/subdril1.aud new file mode 100644 index 0000000000..6e624eed95 Binary files /dev/null and b/mods/ca/bits/audio/subdril1.aud differ diff --git a/mods/ca/bits/audio/subrumble.aud b/mods/ca/bits/audio/subrumble.aud new file mode 100644 index 0000000000..43ded76929 Binary files /dev/null and b/mods/ca/bits/audio/subrumble.aud differ diff --git a/mods/ca/bits/audio/target.aud b/mods/ca/bits/audio/target.aud deleted file mode 100644 index 6907027d90..0000000000 Binary files a/mods/ca/bits/audio/target.aud and /dev/null differ diff --git a/mods/ca/bits/audio/targetpainterbeep.aud b/mods/ca/bits/audio/targetpainterbeep.aud new file mode 100644 index 0000000000..5016f15a81 Binary files /dev/null and b/mods/ca/bits/audio/targetpainterbeep.aud differ diff --git a/mods/ca/bits/audio/techhack.aud b/mods/ca/bits/audio/techhack.aud new file mode 100644 index 0000000000..2660ed5ccd Binary files /dev/null and b/mods/ca/bits/audio/techhack.aud differ diff --git a/mods/ca/bits/audio/thunder1.aud b/mods/ca/bits/audio/thunder1.aud new file mode 100644 index 0000000000..df0282c0a2 Binary files /dev/null and b/mods/ca/bits/audio/thunder1.aud differ diff --git a/mods/ca/bits/audio/thunder2.aud b/mods/ca/bits/audio/thunder2.aud new file mode 100644 index 0000000000..0906f6ddf8 Binary files /dev/null and b/mods/ca/bits/audio/thunder2.aud differ diff --git a/mods/ca/bits/audio/thunder3.aud b/mods/ca/bits/audio/thunder3.aud new file mode 100644 index 0000000000..b785a580ff Binary files /dev/null and b/mods/ca/bits/audio/thunder3.aud differ diff --git a/mods/ca/bits/audio/thunder4.aud b/mods/ca/bits/audio/thunder4.aud new file mode 100644 index 0000000000..ef3c10d008 Binary files /dev/null and b/mods/ca/bits/audio/thunder4.aud differ diff --git a/mods/ca/bits/audio/thunder5.aud b/mods/ca/bits/audio/thunder5.aud new file mode 100644 index 0000000000..167bfc57c0 Binary files /dev/null and b/mods/ca/bits/audio/thunder5.aud differ diff --git a/mods/ca/bits/audio/thunder6.aud b/mods/ca/bits/audio/thunder6.aud new file mode 100644 index 0000000000..457f625f10 Binary files /dev/null and b/mods/ca/bits/audio/thunder6.aud differ diff --git a/mods/ca/bits/audio/tibsurge.aud b/mods/ca/bits/audio/tibsurge.aud new file mode 100644 index 0000000000..588a99ee55 Binary files /dev/null and b/mods/ca/bits/audio/tibsurge.aud differ diff --git a/mods/ca/bits/audio/tigr-attack1.aud b/mods/ca/bits/audio/tigr-attack1.aud new file mode 100644 index 0000000000..959b60da0a Binary files /dev/null and b/mods/ca/bits/audio/tigr-attack1.aud differ diff --git a/mods/ca/bits/audio/tigr-attack2.aud b/mods/ca/bits/audio/tigr-attack2.aud new file mode 100644 index 0000000000..baf166a404 Binary files /dev/null and b/mods/ca/bits/audio/tigr-attack2.aud differ diff --git a/mods/ca/bits/audio/tigr-attack3.aud b/mods/ca/bits/audio/tigr-attack3.aud new file mode 100644 index 0000000000..30313969d7 Binary files /dev/null and b/mods/ca/bits/audio/tigr-attack3.aud differ diff --git a/mods/ca/bits/audio/tigr-attack4.aud b/mods/ca/bits/audio/tigr-attack4.aud new file mode 100644 index 0000000000..2cb84ea42e Binary files /dev/null and b/mods/ca/bits/audio/tigr-attack4.aud differ diff --git a/mods/ca/bits/audio/tigr-fire1.aud b/mods/ca/bits/audio/tigr-fire1.aud new file mode 100644 index 0000000000..dd782358df Binary files /dev/null and b/mods/ca/bits/audio/tigr-fire1.aud differ diff --git a/mods/ca/bits/audio/tigr-fire2.aud b/mods/ca/bits/audio/tigr-fire2.aud new file mode 100644 index 0000000000..d87ce224c3 Binary files /dev/null and b/mods/ca/bits/audio/tigr-fire2.aud differ diff --git a/mods/ca/bits/audio/tigr-move1.aud b/mods/ca/bits/audio/tigr-move1.aud new file mode 100644 index 0000000000..181d040a69 Binary files /dev/null and b/mods/ca/bits/audio/tigr-move1.aud differ diff --git a/mods/ca/bits/audio/tigr-move2.aud b/mods/ca/bits/audio/tigr-move2.aud new file mode 100644 index 0000000000..5c2b0b02ea Binary files /dev/null and b/mods/ca/bits/audio/tigr-move2.aud differ diff --git a/mods/ca/bits/audio/tigr-move3.aud b/mods/ca/bits/audio/tigr-move3.aud new file mode 100644 index 0000000000..a49bf1b9a1 Binary files /dev/null and b/mods/ca/bits/audio/tigr-move3.aud differ diff --git a/mods/ca/bits/audio/tigr-move4.aud b/mods/ca/bits/audio/tigr-move4.aud new file mode 100644 index 0000000000..941d3346cf Binary files /dev/null and b/mods/ca/bits/audio/tigr-move4.aud differ diff --git a/mods/ca/bits/audio/tigr-select1.aud b/mods/ca/bits/audio/tigr-select1.aud new file mode 100644 index 0000000000..fb55be262b Binary files /dev/null and b/mods/ca/bits/audio/tigr-select1.aud differ diff --git a/mods/ca/bits/audio/tigr-select2.aud b/mods/ca/bits/audio/tigr-select2.aud new file mode 100644 index 0000000000..ea24aaec74 Binary files /dev/null and b/mods/ca/bits/audio/tigr-select2.aud differ diff --git a/mods/ca/bits/audio/tigr-select3.aud b/mods/ca/bits/audio/tigr-select3.aud new file mode 100644 index 0000000000..60e7bf5752 Binary files /dev/null and b/mods/ca/bits/audio/tigr-select3.aud differ diff --git a/mods/ca/bits/audio/tigr-select4.aud b/mods/ca/bits/audio/tigr-select4.aud new file mode 100644 index 0000000000..79613e49cd Binary files /dev/null and b/mods/ca/bits/audio/tigr-select4.aud differ diff --git a/mods/ca/bits/audio/timeskip.aud b/mods/ca/bits/audio/timeskip.aud new file mode 100644 index 0000000000..725e08f012 Binary files /dev/null and b/mods/ca/bits/audio/timeskip.aud differ diff --git a/mods/ca/bits/audio/tnklaser.aud b/mods/ca/bits/audio/tnklaser.aud new file mode 100644 index 0000000000..2513e3ef32 Binary files /dev/null and b/mods/ca/bits/audio/tnklaser.aud differ diff --git a/mods/ca/bits/audio/tow-hit1.aud b/mods/ca/bits/audio/tow-hit1.aud new file mode 100644 index 0000000000..8bc14bf002 Binary files /dev/null and b/mods/ca/bits/audio/tow-hit1.aud differ diff --git a/mods/ca/bits/audio/tow1.aud b/mods/ca/bits/audio/tow1.aud new file mode 100644 index 0000000000..2368a84edd Binary files /dev/null and b/mods/ca/bits/audio/tow1.aud differ diff --git a/mods/ca/bits/audio/tow2.aud b/mods/ca/bits/audio/tow2.aud new file mode 100644 index 0000000000..0ea223bbcc Binary files /dev/null and b/mods/ca/bits/audio/tow2.aud differ diff --git a/mods/ca/bits/audio/tplr-action1.aud b/mods/ca/bits/audio/tplr-action1.aud new file mode 100644 index 0000000000..5a3581d8e9 Binary files /dev/null and b/mods/ca/bits/audio/tplr-action1.aud differ diff --git a/mods/ca/bits/audio/tplr-action2.aud b/mods/ca/bits/audio/tplr-action2.aud new file mode 100644 index 0000000000..5e83eed790 Binary files /dev/null and b/mods/ca/bits/audio/tplr-action2.aud differ diff --git a/mods/ca/bits/audio/tplr-attack1.aud b/mods/ca/bits/audio/tplr-attack1.aud new file mode 100644 index 0000000000..4f55ed0fdf Binary files /dev/null and b/mods/ca/bits/audio/tplr-attack1.aud differ diff --git a/mods/ca/bits/audio/tplr-attack2.aud b/mods/ca/bits/audio/tplr-attack2.aud new file mode 100644 index 0000000000..351657b8a8 Binary files /dev/null and b/mods/ca/bits/audio/tplr-attack2.aud differ diff --git a/mods/ca/bits/audio/tplr-attack3.aud b/mods/ca/bits/audio/tplr-attack3.aud new file mode 100644 index 0000000000..065b5b3ef0 Binary files /dev/null and b/mods/ca/bits/audio/tplr-attack3.aud differ diff --git a/mods/ca/bits/audio/tplr-move1.aud b/mods/ca/bits/audio/tplr-move1.aud new file mode 100644 index 0000000000..dbe63fe690 Binary files /dev/null and b/mods/ca/bits/audio/tplr-move1.aud differ diff --git a/mods/ca/bits/audio/tplr-move2.aud b/mods/ca/bits/audio/tplr-move2.aud new file mode 100644 index 0000000000..1317189b34 Binary files /dev/null and b/mods/ca/bits/audio/tplr-move2.aud differ diff --git a/mods/ca/bits/audio/tplr-move3.aud b/mods/ca/bits/audio/tplr-move3.aud new file mode 100644 index 0000000000..58ac51c69f Binary files /dev/null and b/mods/ca/bits/audio/tplr-move3.aud differ diff --git a/mods/ca/bits/audio/tplr-move4.aud b/mods/ca/bits/audio/tplr-move4.aud new file mode 100644 index 0000000000..d07c32b32c Binary files /dev/null and b/mods/ca/bits/audio/tplr-move4.aud differ diff --git a/mods/ca/bits/audio/tplr-select1.aud b/mods/ca/bits/audio/tplr-select1.aud new file mode 100644 index 0000000000..531aefed0c Binary files /dev/null and b/mods/ca/bits/audio/tplr-select1.aud differ diff --git a/mods/ca/bits/audio/tplr-select2.aud b/mods/ca/bits/audio/tplr-select2.aud new file mode 100644 index 0000000000..250539a4ad Binary files /dev/null and b/mods/ca/bits/audio/tplr-select2.aud differ diff --git a/mods/ca/bits/audio/tplr-select3.aud b/mods/ca/bits/audio/tplr-select3.aud new file mode 100644 index 0000000000..9103146d14 Binary files /dev/null and b/mods/ca/bits/audio/tplr-select3.aud differ diff --git a/mods/ca/bits/audio/tplr-select4.aud b/mods/ca/bits/audio/tplr-select4.aud new file mode 100644 index 0000000000..f7a8a62fbe Binary files /dev/null and b/mods/ca/bits/audio/tplr-select4.aud differ diff --git a/mods/ca/bits/audio/tplr-select5.aud b/mods/ca/bits/audio/tplr-select5.aud new file mode 100644 index 0000000000..870423575e Binary files /dev/null and b/mods/ca/bits/audio/tplr-select5.aud differ diff --git a/mods/ca/bits/audio/vb3blo2a.aud b/mods/ca/bits/audio/vb3blo2a.aud new file mode 100644 index 0000000000..d5eb2f1c5a Binary files /dev/null and b/mods/ca/bits/audio/vb3blo2a.aud differ diff --git a/mods/ca/bits/audio/vb3blo2b.aud b/mods/ca/bits/audio/vb3blo2b.aud new file mode 100644 index 0000000000..66b71f833e Binary files /dev/null and b/mods/ca/bits/audio/vb3blo2b.aud differ diff --git a/mods/ca/bits/audio/vb3blo2c.aud b/mods/ca/bits/audio/vb3blo2c.aud new file mode 100644 index 0000000000..f852b5f7f2 Binary files /dev/null and b/mods/ca/bits/audio/vb3blo2c.aud differ diff --git a/mods/ca/bits/audio/vbatata.aud b/mods/ca/bits/audio/vbatata.aud new file mode 100644 index 0000000000..28e219ad1d Binary files /dev/null and b/mods/ca/bits/audio/vbatata.aud differ diff --git a/mods/ca/bits/audio/vbatatb.aud b/mods/ca/bits/audio/vbatatb.aud index 18eb0bafec..2950477bc8 100644 Binary files a/mods/ca/bits/audio/vbatatb.aud and b/mods/ca/bits/audio/vbatatb.aud differ diff --git a/mods/ca/bits/audio/vbatatc.aud b/mods/ca/bits/audio/vbatatc.aud index f555412395..f9bc59b22f 100644 Binary files a/mods/ca/bits/audio/vbatatc.aud and b/mods/ca/bits/audio/vbatatc.aud differ diff --git a/mods/ca/bits/audio/vbatatd.aud b/mods/ca/bits/audio/vbatatd.aud index 12288cdb16..03e972f70a 100644 Binary files a/mods/ca/bits/audio/vbatatd.aud and b/mods/ca/bits/audio/vbatatd.aud differ diff --git a/mods/ca/bits/audio/vbatate.aud b/mods/ca/bits/audio/vbatate.aud index 0eb2483539..4a465cc049 100644 Binary files a/mods/ca/bits/audio/vbatate.aud and b/mods/ca/bits/audio/vbatate.aud differ diff --git a/mods/ca/bits/audio/vbatmoa.aud b/mods/ca/bits/audio/vbatmoa.aud index caa0a23c20..63fdd8afb4 100644 Binary files a/mods/ca/bits/audio/vbatmoa.aud and b/mods/ca/bits/audio/vbatmoa.aud differ diff --git a/mods/ca/bits/audio/vbatmob.aud b/mods/ca/bits/audio/vbatmob.aud index fad4e058ab..31e3cc0564 100644 Binary files a/mods/ca/bits/audio/vbatmob.aud and b/mods/ca/bits/audio/vbatmob.aud differ diff --git a/mods/ca/bits/audio/vbatmoc.aud b/mods/ca/bits/audio/vbatmoc.aud index 4440d831ca..209bf5fe5c 100644 Binary files a/mods/ca/bits/audio/vbatmoc.aud and b/mods/ca/bits/audio/vbatmoc.aud differ diff --git a/mods/ca/bits/audio/vbatmod.aud b/mods/ca/bits/audio/vbatmod.aud index bf90cce4fc..3447d820ef 100644 Binary files a/mods/ca/bits/audio/vbatmod.aud and b/mods/ca/bits/audio/vbatmod.aud differ diff --git a/mods/ca/bits/audio/vbatmoe.aud b/mods/ca/bits/audio/vbatmoe.aud deleted file mode 100644 index bcb4658b6e..0000000000 Binary files a/mods/ca/bits/audio/vbatmoe.aud and /dev/null differ diff --git a/mods/ca/bits/audio/vbatsea.aud b/mods/ca/bits/audio/vbatsea.aud index 7ddeea5d15..7b83e8f8c5 100644 Binary files a/mods/ca/bits/audio/vbatsea.aud and b/mods/ca/bits/audio/vbatsea.aud differ diff --git a/mods/ca/bits/audio/vbatseb.aud b/mods/ca/bits/audio/vbatseb.aud index 30fa82bc36..5564fdda5b 100644 Binary files a/mods/ca/bits/audio/vbatseb.aud and b/mods/ca/bits/audio/vbatseb.aud differ diff --git a/mods/ca/bits/audio/vbatsec.aud b/mods/ca/bits/audio/vbatsec.aud index c7447dfb0e..6d3d03e263 100644 Binary files a/mods/ca/bits/audio/vbatsec.aud and b/mods/ca/bits/audio/vbatsec.aud differ diff --git a/mods/ca/bits/audio/vbatsed.aud b/mods/ca/bits/audio/vbatsed.aud index 2ae8ef9efe..f319b6a2db 100644 Binary files a/mods/ca/bits/audio/vbatsed.aud and b/mods/ca/bits/audio/vbatsed.aud differ diff --git a/mods/ca/bits/audio/vbatsee.aud b/mods/ca/bits/audio/vbatsee.aud deleted file mode 100644 index 9db837e6dc..0000000000 Binary files a/mods/ca/bits/audio/vbatsee.aud and /dev/null differ diff --git a/mods/ca/bits/audio/vbatsef.aud b/mods/ca/bits/audio/vbatsef.aud deleted file mode 100644 index 8d90b91f52..0000000000 Binary files a/mods/ca/bits/audio/vbatsef.aud and /dev/null differ diff --git a/mods/ca/bits/audio/vbdrnupg1.aud b/mods/ca/bits/audio/vbdrnupg1.aud new file mode 100644 index 0000000000..aa31f2a268 Binary files /dev/null and b/mods/ca/bits/audio/vbdrnupg1.aud differ diff --git a/mods/ca/bits/audio/vbleata.aud b/mods/ca/bits/audio/vbleata.aud new file mode 100644 index 0000000000..f4830d9451 Binary files /dev/null and b/mods/ca/bits/audio/vbleata.aud differ diff --git a/mods/ca/bits/audio/vbleatb.aud b/mods/ca/bits/audio/vbleatb.aud new file mode 100644 index 0000000000..777aaac173 Binary files /dev/null and b/mods/ca/bits/audio/vbleatb.aud differ diff --git a/mods/ca/bits/audio/vbleatc.aud b/mods/ca/bits/audio/vbleatc.aud new file mode 100644 index 0000000000..fcb92dee15 Binary files /dev/null and b/mods/ca/bits/audio/vbleatc.aud differ diff --git a/mods/ca/bits/audio/vblediea.aud b/mods/ca/bits/audio/vblediea.aud new file mode 100644 index 0000000000..9b808d3b68 Binary files /dev/null and b/mods/ca/bits/audio/vblediea.aud differ diff --git a/mods/ca/bits/audio/vbledieb.aud b/mods/ca/bits/audio/vbledieb.aud new file mode 100644 index 0000000000..825e60781f Binary files /dev/null and b/mods/ca/bits/audio/vbledieb.aud differ diff --git a/mods/ca/bits/audio/vblelo1a.aud b/mods/ca/bits/audio/vblelo1a.aud new file mode 100644 index 0000000000..e4295f21f2 Binary files /dev/null and b/mods/ca/bits/audio/vblelo1a.aud differ diff --git a/mods/ca/bits/audio/vblelo3.aud b/mods/ca/bits/audio/vblelo3.aud new file mode 100644 index 0000000000..1d89f31ade Binary files /dev/null and b/mods/ca/bits/audio/vblelo3.aud differ diff --git a/mods/ca/bits/audio/vblemoa.aud b/mods/ca/bits/audio/vblemoa.aud new file mode 100644 index 0000000000..84a6333c15 Binary files /dev/null and b/mods/ca/bits/audio/vblemoa.aud differ diff --git a/mods/ca/bits/audio/vblemob.aud b/mods/ca/bits/audio/vblemob.aud new file mode 100644 index 0000000000..a3c10b9ceb Binary files /dev/null and b/mods/ca/bits/audio/vblemob.aud differ diff --git a/mods/ca/bits/audio/vblemoc.aud b/mods/ca/bits/audio/vblemoc.aud new file mode 100644 index 0000000000..126f1fdbde Binary files /dev/null and b/mods/ca/bits/audio/vblemoc.aud differ diff --git a/mods/ca/bits/audio/vblesea.aud b/mods/ca/bits/audio/vblesea.aud new file mode 100644 index 0000000000..4470fa4d65 Binary files /dev/null and b/mods/ca/bits/audio/vblesea.aud differ diff --git a/mods/ca/bits/audio/vbleseb.aud b/mods/ca/bits/audio/vbleseb.aud new file mode 100644 index 0000000000..9a5d723c90 Binary files /dev/null and b/mods/ca/bits/audio/vbleseb.aud differ diff --git a/mods/ca/bits/audio/vblesec.aud b/mods/ca/bits/audio/vblesec.aud new file mode 100644 index 0000000000..1ece9dc118 Binary files /dev/null and b/mods/ca/bits/audio/vblesec.aud differ diff --git a/mods/ca/bits/audio/vblesed.aud b/mods/ca/bits/audio/vblesed.aud new file mode 100644 index 0000000000..3240f67629 Binary files /dev/null and b/mods/ca/bits/audio/vblesed.aud differ diff --git a/mods/ca/bits/audio/vblesee.aud b/mods/ca/bits/audio/vblesee.aud new file mode 100644 index 0000000000..0b938dcfc8 Binary files /dev/null and b/mods/ca/bits/audio/vblesee.aud differ diff --git a/mods/ca/bits/audio/vblesef.aud b/mods/ca/bits/audio/vblesef.aud new file mode 100644 index 0000000000..4998eed59d Binary files /dev/null and b/mods/ca/bits/audio/vblesef.aud differ diff --git a/mods/ca/bits/audio/vblhata.aud b/mods/ca/bits/audio/vblhata.aud new file mode 100644 index 0000000000..cec5c13586 Binary files /dev/null and b/mods/ca/bits/audio/vblhata.aud differ diff --git a/mods/ca/bits/audio/vblhatb.aud b/mods/ca/bits/audio/vblhatb.aud new file mode 100644 index 0000000000..8e2cb194cd Binary files /dev/null and b/mods/ca/bits/audio/vblhatb.aud differ diff --git a/mods/ca/bits/audio/vblhatc.aud b/mods/ca/bits/audio/vblhatc.aud new file mode 100644 index 0000000000..42c052f047 Binary files /dev/null and b/mods/ca/bits/audio/vblhatc.aud differ diff --git a/mods/ca/bits/audio/vblhatd.aud b/mods/ca/bits/audio/vblhatd.aud new file mode 100644 index 0000000000..a5fe8a0f3a Binary files /dev/null and b/mods/ca/bits/audio/vblhatd.aud differ diff --git a/mods/ca/bits/audio/vblhdiea.aud b/mods/ca/bits/audio/vblhdiea.aud new file mode 100644 index 0000000000..6e8193ca9a Binary files /dev/null and b/mods/ca/bits/audio/vblhdiea.aud differ diff --git a/mods/ca/bits/audio/vblhmoa.aud b/mods/ca/bits/audio/vblhmoa.aud new file mode 100644 index 0000000000..51d2cb8e68 Binary files /dev/null and b/mods/ca/bits/audio/vblhmoa.aud differ diff --git a/mods/ca/bits/audio/vblhmob.aud b/mods/ca/bits/audio/vblhmob.aud new file mode 100644 index 0000000000..1f4f44bffe Binary files /dev/null and b/mods/ca/bits/audio/vblhmob.aud differ diff --git a/mods/ca/bits/audio/vblhmoc.aud b/mods/ca/bits/audio/vblhmoc.aud new file mode 100644 index 0000000000..8acc9dd01f Binary files /dev/null and b/mods/ca/bits/audio/vblhmoc.aud differ diff --git a/mods/ca/bits/audio/vblhmod.aud b/mods/ca/bits/audio/vblhmod.aud new file mode 100644 index 0000000000..6c53de7ec5 Binary files /dev/null and b/mods/ca/bits/audio/vblhmod.aud differ diff --git a/mods/ca/bits/audio/vblhsea.aud b/mods/ca/bits/audio/vblhsea.aud new file mode 100644 index 0000000000..ac6d6e5124 Binary files /dev/null and b/mods/ca/bits/audio/vblhsea.aud differ diff --git a/mods/ca/bits/audio/vblhseb.aud b/mods/ca/bits/audio/vblhseb.aud new file mode 100644 index 0000000000..188299cc74 Binary files /dev/null and b/mods/ca/bits/audio/vblhseb.aud differ diff --git a/mods/ca/bits/audio/vblhsec.aud b/mods/ca/bits/audio/vblhsec.aud new file mode 100644 index 0000000000..e9f56f781e Binary files /dev/null and b/mods/ca/bits/audio/vblhsec.aud differ diff --git a/mods/ca/bits/audio/vblhsed.aud b/mods/ca/bits/audio/vblhsed.aud new file mode 100644 index 0000000000..a7f3b24a4e Binary files /dev/null and b/mods/ca/bits/audio/vblhsed.aud differ diff --git a/mods/ca/bits/audio/vchpat1.aud b/mods/ca/bits/audio/vchpat1.aud new file mode 100644 index 0000000000..bea5a5adec Binary files /dev/null and b/mods/ca/bits/audio/vchpat1.aud differ diff --git a/mods/ca/bits/audio/vchpat2.aud b/mods/ca/bits/audio/vchpat2.aud new file mode 100644 index 0000000000..b26e6f48c7 Binary files /dev/null and b/mods/ca/bits/audio/vchpat2.aud differ diff --git a/mods/ca/bits/audio/vchpat3.aud b/mods/ca/bits/audio/vchpat3.aud new file mode 100644 index 0000000000..0e0a5d20ea Binary files /dev/null and b/mods/ca/bits/audio/vchpat3.aud differ diff --git a/mods/ca/bits/audio/vchpat4.aud b/mods/ca/bits/audio/vchpat4.aud new file mode 100644 index 0000000000..d4c44c2881 Binary files /dev/null and b/mods/ca/bits/audio/vchpat4.aud differ diff --git a/mods/ca/bits/audio/vchpat5.aud b/mods/ca/bits/audio/vchpat5.aud new file mode 100644 index 0000000000..8b63bafb4d Binary files /dev/null and b/mods/ca/bits/audio/vchpat5.aud differ diff --git a/mods/ca/bits/audio/vchpmo1.aud b/mods/ca/bits/audio/vchpmo1.aud new file mode 100644 index 0000000000..06ad0116eb Binary files /dev/null and b/mods/ca/bits/audio/vchpmo1.aud differ diff --git a/mods/ca/bits/audio/vchpmo2.aud b/mods/ca/bits/audio/vchpmo2.aud new file mode 100644 index 0000000000..c7f839ef9d Binary files /dev/null and b/mods/ca/bits/audio/vchpmo2.aud differ diff --git a/mods/ca/bits/audio/vchpmo3.aud b/mods/ca/bits/audio/vchpmo3.aud new file mode 100644 index 0000000000..d619e33c6d Binary files /dev/null and b/mods/ca/bits/audio/vchpmo3.aud differ diff --git a/mods/ca/bits/audio/vchpmo4.aud b/mods/ca/bits/audio/vchpmo4.aud new file mode 100644 index 0000000000..db8f5c71d5 Binary files /dev/null and b/mods/ca/bits/audio/vchpmo4.aud differ diff --git a/mods/ca/bits/audio/vchpmo5.aud b/mods/ca/bits/audio/vchpmo5.aud new file mode 100644 index 0000000000..3b87512731 Binary files /dev/null and b/mods/ca/bits/audio/vchpmo5.aud differ diff --git a/mods/ca/bits/audio/vchpsl1.aud b/mods/ca/bits/audio/vchpsl1.aud new file mode 100644 index 0000000000..2f6d0f8eba Binary files /dev/null and b/mods/ca/bits/audio/vchpsl1.aud differ diff --git a/mods/ca/bits/audio/vchpsl2.aud b/mods/ca/bits/audio/vchpsl2.aud new file mode 100644 index 0000000000..b37b4fbe6c Binary files /dev/null and b/mods/ca/bits/audio/vchpsl2.aud differ diff --git a/mods/ca/bits/audio/vchpsl3.aud b/mods/ca/bits/audio/vchpsl3.aud new file mode 100644 index 0000000000..ebaa6acf5c Binary files /dev/null and b/mods/ca/bits/audio/vchpsl3.aud differ diff --git a/mods/ca/bits/audio/vchpsl4.aud b/mods/ca/bits/audio/vchpsl4.aud new file mode 100644 index 0000000000..d522462703 Binary files /dev/null and b/mods/ca/bits/audio/vchpsl4.aud differ diff --git a/mods/ca/bits/audio/vchpsl5.aud b/mods/ca/bits/audio/vchpsl5.aud new file mode 100644 index 0000000000..e21e8ee5cd Binary files /dev/null and b/mods/ca/bits/audio/vchpsl5.aud differ diff --git a/mods/ca/bits/audio/vcomdi1a.aud b/mods/ca/bits/audio/vcomdi1a.aud new file mode 100644 index 0000000000..8b7043abc5 Binary files /dev/null and b/mods/ca/bits/audio/vcomdi1a.aud differ diff --git a/mods/ca/bits/audio/vcomdi2a.aud b/mods/ca/bits/audio/vcomdi2a.aud new file mode 100644 index 0000000000..ac9737d268 Binary files /dev/null and b/mods/ca/bits/audio/vcomdi2a.aud differ diff --git a/mods/ca/bits/audio/vcryatk1.aud b/mods/ca/bits/audio/vcryatk1.aud new file mode 100644 index 0000000000..a1234009d9 Binary files /dev/null and b/mods/ca/bits/audio/vcryatk1.aud differ diff --git a/mods/ca/bits/audio/vcryatk2.aud b/mods/ca/bits/audio/vcryatk2.aud new file mode 100644 index 0000000000..802e7e500c Binary files /dev/null and b/mods/ca/bits/audio/vcryatk2.aud differ diff --git a/mods/ca/bits/audio/vcryatk3.aud b/mods/ca/bits/audio/vcryatk3.aud new file mode 100644 index 0000000000..99166fdac8 Binary files /dev/null and b/mods/ca/bits/audio/vcryatk3.aud differ diff --git a/mods/ca/bits/audio/vcryatk4.aud b/mods/ca/bits/audio/vcryatk4.aud new file mode 100644 index 0000000000..7a9ccd5729 Binary files /dev/null and b/mods/ca/bits/audio/vcryatk4.aud differ diff --git a/mods/ca/bits/audio/vcryatk5.aud b/mods/ca/bits/audio/vcryatk5.aud new file mode 100644 index 0000000000..b973dfd636 Binary files /dev/null and b/mods/ca/bits/audio/vcryatk5.aud differ diff --git a/mods/ca/bits/audio/vcrymov1.aud b/mods/ca/bits/audio/vcrymov1.aud new file mode 100644 index 0000000000..1dd19c464f Binary files /dev/null and b/mods/ca/bits/audio/vcrymov1.aud differ diff --git a/mods/ca/bits/audio/vcrymov2.aud b/mods/ca/bits/audio/vcrymov2.aud new file mode 100644 index 0000000000..16ab81e692 Binary files /dev/null and b/mods/ca/bits/audio/vcrymov2.aud differ diff --git a/mods/ca/bits/audio/vcrymov3.aud b/mods/ca/bits/audio/vcrymov3.aud new file mode 100644 index 0000000000..de3f1a90ae Binary files /dev/null and b/mods/ca/bits/audio/vcrymov3.aud differ diff --git a/mods/ca/bits/audio/vcrymov4.aud b/mods/ca/bits/audio/vcrymov4.aud new file mode 100644 index 0000000000..f3562dad63 Binary files /dev/null and b/mods/ca/bits/audio/vcrymov4.aud differ diff --git a/mods/ca/bits/audio/vcryslt1.aud b/mods/ca/bits/audio/vcryslt1.aud new file mode 100644 index 0000000000..d89693974e Binary files /dev/null and b/mods/ca/bits/audio/vcryslt1.aud differ diff --git a/mods/ca/bits/audio/vcryslt2.aud b/mods/ca/bits/audio/vcryslt2.aud new file mode 100644 index 0000000000..4c72c81d99 Binary files /dev/null and b/mods/ca/bits/audio/vcryslt2.aud differ diff --git a/mods/ca/bits/audio/vcryslt3.aud b/mods/ca/bits/audio/vcryslt3.aud new file mode 100644 index 0000000000..8421874796 Binary files /dev/null and b/mods/ca/bits/audio/vcryslt3.aud differ diff --git a/mods/ca/bits/audio/vcryslt4.aud b/mods/ca/bits/audio/vcryslt4.aud new file mode 100644 index 0000000000..1e68514754 Binary files /dev/null and b/mods/ca/bits/audio/vcryslt4.aud differ diff --git a/mods/ca/bits/audio/vcryslt5.aud b/mods/ca/bits/audio/vcryslt5.aud new file mode 100644 index 0000000000..630f759b50 Binary files /dev/null and b/mods/ca/bits/audio/vcryslt5.aud differ diff --git a/mods/ca/bits/audio/vcryslt6.aud b/mods/ca/bits/audio/vcryslt6.aud new file mode 100644 index 0000000000..1cdbe80118 Binary files /dev/null and b/mods/ca/bits/audio/vcryslt6.aud differ diff --git a/mods/ca/bits/audio/vdisat1.aud b/mods/ca/bits/audio/vdisat1.aud new file mode 100644 index 0000000000..db281e425a Binary files /dev/null and b/mods/ca/bits/audio/vdisat1.aud differ diff --git a/mods/ca/bits/audio/vdisat2.aud b/mods/ca/bits/audio/vdisat2.aud new file mode 100644 index 0000000000..ebba07a1d3 Binary files /dev/null and b/mods/ca/bits/audio/vdisat2.aud differ diff --git a/mods/ca/bits/audio/vdisat3.aud b/mods/ca/bits/audio/vdisat3.aud new file mode 100644 index 0000000000..6d402f2152 Binary files /dev/null and b/mods/ca/bits/audio/vdisat3.aud differ diff --git a/mods/ca/bits/audio/vdisat4.aud b/mods/ca/bits/audio/vdisat4.aud new file mode 100644 index 0000000000..d293e2b603 Binary files /dev/null and b/mods/ca/bits/audio/vdisat4.aud differ diff --git a/mods/ca/bits/audio/vdisat5.aud b/mods/ca/bits/audio/vdisat5.aud new file mode 100644 index 0000000000..6e7d7e5e3f Binary files /dev/null and b/mods/ca/bits/audio/vdisat5.aud differ diff --git a/mods/ca/bits/audio/vdismo1.aud b/mods/ca/bits/audio/vdismo1.aud new file mode 100644 index 0000000000..043d903845 Binary files /dev/null and b/mods/ca/bits/audio/vdismo1.aud differ diff --git a/mods/ca/bits/audio/vdismo2.aud b/mods/ca/bits/audio/vdismo2.aud new file mode 100644 index 0000000000..43d1df95fc Binary files /dev/null and b/mods/ca/bits/audio/vdismo2.aud differ diff --git a/mods/ca/bits/audio/vdismo3.aud b/mods/ca/bits/audio/vdismo3.aud new file mode 100644 index 0000000000..774cff1e7e Binary files /dev/null and b/mods/ca/bits/audio/vdismo3.aud differ diff --git a/mods/ca/bits/audio/vdismo4.aud b/mods/ca/bits/audio/vdismo4.aud new file mode 100644 index 0000000000..83301958b8 Binary files /dev/null and b/mods/ca/bits/audio/vdismo4.aud differ diff --git a/mods/ca/bits/audio/vdissl1.aud b/mods/ca/bits/audio/vdissl1.aud new file mode 100644 index 0000000000..7cdbba7c53 Binary files /dev/null and b/mods/ca/bits/audio/vdissl1.aud differ diff --git a/mods/ca/bits/audio/vdissl2.aud b/mods/ca/bits/audio/vdissl2.aud new file mode 100644 index 0000000000..5bf75dcf7d Binary files /dev/null and b/mods/ca/bits/audio/vdissl2.aud differ diff --git a/mods/ca/bits/audio/vdissl3.aud b/mods/ca/bits/audio/vdissl3.aud new file mode 100644 index 0000000000..9ab56e7a2a Binary files /dev/null and b/mods/ca/bits/audio/vdissl3.aud differ diff --git a/mods/ca/bits/audio/vdissl4.aud b/mods/ca/bits/audio/vdissl4.aud new file mode 100644 index 0000000000..cc4d8ecd33 Binary files /dev/null and b/mods/ca/bits/audio/vdissl4.aud differ diff --git a/mods/ca/bits/audio/vdissl5.aud b/mods/ca/bits/audio/vdissl5.aud new file mode 100644 index 0000000000..e27666dfe5 Binary files /dev/null and b/mods/ca/bits/audio/vdissl5.aud differ diff --git a/mods/ca/bits/audio/vdrnatk1.aud b/mods/ca/bits/audio/vdrnatk1.aud new file mode 100644 index 0000000000..fa6f59447f Binary files /dev/null and b/mods/ca/bits/audio/vdrnatk1.aud differ diff --git a/mods/ca/bits/audio/vdrnatk2.aud b/mods/ca/bits/audio/vdrnatk2.aud new file mode 100644 index 0000000000..f324b8cd53 Binary files /dev/null and b/mods/ca/bits/audio/vdrnatk2.aud differ diff --git a/mods/ca/bits/audio/vdrnatk3.aud b/mods/ca/bits/audio/vdrnatk3.aud new file mode 100644 index 0000000000..6781fadf43 Binary files /dev/null and b/mods/ca/bits/audio/vdrnatk3.aud differ diff --git a/mods/ca/bits/audio/vdrnatk4.aud b/mods/ca/bits/audio/vdrnatk4.aud new file mode 100644 index 0000000000..2c4e0d4641 Binary files /dev/null and b/mods/ca/bits/audio/vdrnatk4.aud differ diff --git a/mods/ca/bits/audio/vdrnatk5.aud b/mods/ca/bits/audio/vdrnatk5.aud new file mode 100644 index 0000000000..cb8cf36e61 Binary files /dev/null and b/mods/ca/bits/audio/vdrnatk5.aud differ diff --git a/mods/ca/bits/audio/vdrnmov1.aud b/mods/ca/bits/audio/vdrnmov1.aud new file mode 100644 index 0000000000..9686089ecd Binary files /dev/null and b/mods/ca/bits/audio/vdrnmov1.aud differ diff --git a/mods/ca/bits/audio/vdrnmov2.aud b/mods/ca/bits/audio/vdrnmov2.aud new file mode 100644 index 0000000000..4c55cca30b Binary files /dev/null and b/mods/ca/bits/audio/vdrnmov2.aud differ diff --git a/mods/ca/bits/audio/vdrnmov3.aud b/mods/ca/bits/audio/vdrnmov3.aud new file mode 100644 index 0000000000..2479e72bf7 Binary files /dev/null and b/mods/ca/bits/audio/vdrnmov3.aud differ diff --git a/mods/ca/bits/audio/vdrnmov4.aud b/mods/ca/bits/audio/vdrnmov4.aud new file mode 100644 index 0000000000..a86fd43c2f Binary files /dev/null and b/mods/ca/bits/audio/vdrnmov4.aud differ diff --git a/mods/ca/bits/audio/vdrnmov5.aud b/mods/ca/bits/audio/vdrnmov5.aud new file mode 100644 index 0000000000..90b3959aeb Binary files /dev/null and b/mods/ca/bits/audio/vdrnmov5.aud differ diff --git a/mods/ca/bits/audio/vdrnslt1.aud b/mods/ca/bits/audio/vdrnslt1.aud new file mode 100644 index 0000000000..4a1070578f Binary files /dev/null and b/mods/ca/bits/audio/vdrnslt1.aud differ diff --git a/mods/ca/bits/audio/vdrnslt2.aud b/mods/ca/bits/audio/vdrnslt2.aud new file mode 100644 index 0000000000..61505f5180 Binary files /dev/null and b/mods/ca/bits/audio/vdrnslt2.aud differ diff --git a/mods/ca/bits/audio/vdrnslt3.aud b/mods/ca/bits/audio/vdrnslt3.aud new file mode 100644 index 0000000000..a2ec701ec7 Binary files /dev/null and b/mods/ca/bits/audio/vdrnslt3.aud differ diff --git a/mods/ca/bits/audio/vdrnslt4.aud b/mods/ca/bits/audio/vdrnslt4.aud new file mode 100644 index 0000000000..e0f41a1263 Binary files /dev/null and b/mods/ca/bits/audio/vdrnslt4.aud differ diff --git a/mods/ca/bits/audio/vdrnslt5.aud b/mods/ca/bits/audio/vdrnslt5.aud new file mode 100644 index 0000000000..27dc559776 Binary files /dev/null and b/mods/ca/bits/audio/vdrnslt5.aud differ diff --git a/mods/ca/bits/audio/vdrnslt6.aud b/mods/ca/bits/audio/vdrnslt6.aud new file mode 100644 index 0000000000..d997c9c9ab Binary files /dev/null and b/mods/ca/bits/audio/vdrnslt6.aud differ diff --git a/mods/ca/bits/audio/veilblast.aud b/mods/ca/bits/audio/veilblast.aud new file mode 100644 index 0000000000..d084e6663a Binary files /dev/null and b/mods/ca/bits/audio/veilblast.aud differ diff --git a/mods/ca/bits/audio/venm-attack1.aud b/mods/ca/bits/audio/venm-attack1.aud new file mode 100644 index 0000000000..3e26f3a3ca Binary files /dev/null and b/mods/ca/bits/audio/venm-attack1.aud differ diff --git a/mods/ca/bits/audio/venm-attack2.aud b/mods/ca/bits/audio/venm-attack2.aud new file mode 100644 index 0000000000..b0c8b44e35 Binary files /dev/null and b/mods/ca/bits/audio/venm-attack2.aud differ diff --git a/mods/ca/bits/audio/venm-attack3.aud b/mods/ca/bits/audio/venm-attack3.aud new file mode 100644 index 0000000000..e5205b3f78 Binary files /dev/null and b/mods/ca/bits/audio/venm-attack3.aud differ diff --git a/mods/ca/bits/audio/venm-attack4.aud b/mods/ca/bits/audio/venm-attack4.aud new file mode 100644 index 0000000000..f7655a720b Binary files /dev/null and b/mods/ca/bits/audio/venm-attack4.aud differ diff --git a/mods/ca/bits/audio/venm-move1.aud b/mods/ca/bits/audio/venm-move1.aud new file mode 100644 index 0000000000..fd34e87962 Binary files /dev/null and b/mods/ca/bits/audio/venm-move1.aud differ diff --git a/mods/ca/bits/audio/venm-move2.aud b/mods/ca/bits/audio/venm-move2.aud new file mode 100644 index 0000000000..c561b15c4a Binary files /dev/null and b/mods/ca/bits/audio/venm-move2.aud differ diff --git a/mods/ca/bits/audio/venm-move3.aud b/mods/ca/bits/audio/venm-move3.aud new file mode 100644 index 0000000000..d67b5e6dc5 Binary files /dev/null and b/mods/ca/bits/audio/venm-move3.aud differ diff --git a/mods/ca/bits/audio/venm-move4.aud b/mods/ca/bits/audio/venm-move4.aud new file mode 100644 index 0000000000..7353963d94 Binary files /dev/null and b/mods/ca/bits/audio/venm-move4.aud differ diff --git a/mods/ca/bits/audio/venm-select1.aud b/mods/ca/bits/audio/venm-select1.aud new file mode 100644 index 0000000000..d4f274ec00 Binary files /dev/null and b/mods/ca/bits/audio/venm-select1.aud differ diff --git a/mods/ca/bits/audio/venm-select2.aud b/mods/ca/bits/audio/venm-select2.aud new file mode 100644 index 0000000000..e87c45cf11 Binary files /dev/null and b/mods/ca/bits/audio/venm-select2.aud differ diff --git a/mods/ca/bits/audio/venm-select3.aud b/mods/ca/bits/audio/venm-select3.aud new file mode 100644 index 0000000000..ed702ea0f8 Binary files /dev/null and b/mods/ca/bits/audio/venm-select3.aud differ diff --git a/mods/ca/bits/audio/venm-select4.aud b/mods/ca/bits/audio/venm-select4.aud new file mode 100644 index 0000000000..23a1d394da Binary files /dev/null and b/mods/ca/bits/audio/venm-select4.aud differ diff --git a/mods/ca/bits/audio/venmfireupg1.aud b/mods/ca/bits/audio/venmfireupg1.aud new file mode 100644 index 0000000000..05661fc489 Binary files /dev/null and b/mods/ca/bits/audio/venmfireupg1.aud differ diff --git a/mods/ca/bits/audio/venmfireupg2.aud b/mods/ca/bits/audio/venmfireupg2.aud new file mode 100644 index 0000000000..84a1c2b992 Binary files /dev/null and b/mods/ca/bits/audio/venmfireupg2.aud differ diff --git a/mods/ca/bits/audio/veraatk1.aud b/mods/ca/bits/audio/veraatk1.aud new file mode 100644 index 0000000000..694d0ad264 Binary files /dev/null and b/mods/ca/bits/audio/veraatk1.aud differ diff --git a/mods/ca/bits/audio/veraatk2.aud b/mods/ca/bits/audio/veraatk2.aud new file mode 100644 index 0000000000..669d01c6e3 Binary files /dev/null and b/mods/ca/bits/audio/veraatk2.aud differ diff --git a/mods/ca/bits/audio/veraatk3.aud b/mods/ca/bits/audio/veraatk3.aud new file mode 100644 index 0000000000..4622e6e37c Binary files /dev/null and b/mods/ca/bits/audio/veraatk3.aud differ diff --git a/mods/ca/bits/audio/veraatk4.aud b/mods/ca/bits/audio/veraatk4.aud new file mode 100644 index 0000000000..fa5c9d6b35 Binary files /dev/null and b/mods/ca/bits/audio/veraatk4.aud differ diff --git a/mods/ca/bits/audio/veraatk5.aud b/mods/ca/bits/audio/veraatk5.aud new file mode 100644 index 0000000000..a813824dfe Binary files /dev/null and b/mods/ca/bits/audio/veraatk5.aud differ diff --git a/mods/ca/bits/audio/veramov1.aud b/mods/ca/bits/audio/veramov1.aud new file mode 100644 index 0000000000..7b798352e4 Binary files /dev/null and b/mods/ca/bits/audio/veramov1.aud differ diff --git a/mods/ca/bits/audio/veramov2.aud b/mods/ca/bits/audio/veramov2.aud new file mode 100644 index 0000000000..8b85e6d572 Binary files /dev/null and b/mods/ca/bits/audio/veramov2.aud differ diff --git a/mods/ca/bits/audio/veramov3.aud b/mods/ca/bits/audio/veramov3.aud new file mode 100644 index 0000000000..a8d02d18a8 Binary files /dev/null and b/mods/ca/bits/audio/veramov3.aud differ diff --git a/mods/ca/bits/audio/veramov4.aud b/mods/ca/bits/audio/veramov4.aud new file mode 100644 index 0000000000..2a909cb90d Binary files /dev/null and b/mods/ca/bits/audio/veramov4.aud differ diff --git a/mods/ca/bits/audio/veramov5.aud b/mods/ca/bits/audio/veramov5.aud new file mode 100644 index 0000000000..845e1a77aa Binary files /dev/null and b/mods/ca/bits/audio/veramov5.aud differ diff --git a/mods/ca/bits/audio/veraslt1.aud b/mods/ca/bits/audio/veraslt1.aud new file mode 100644 index 0000000000..4841fceb65 Binary files /dev/null and b/mods/ca/bits/audio/veraslt1.aud differ diff --git a/mods/ca/bits/audio/veraslt2.aud b/mods/ca/bits/audio/veraslt2.aud new file mode 100644 index 0000000000..bf1bdd527d Binary files /dev/null and b/mods/ca/bits/audio/veraslt2.aud differ diff --git a/mods/ca/bits/audio/veraslt3.aud b/mods/ca/bits/audio/veraslt3.aud new file mode 100644 index 0000000000..e8a66c6332 Binary files /dev/null and b/mods/ca/bits/audio/veraslt3.aud differ diff --git a/mods/ca/bits/audio/veraslt4.aud b/mods/ca/bits/audio/veraslt4.aud new file mode 100644 index 0000000000..7287d46786 Binary files /dev/null and b/mods/ca/bits/audio/veraslt4.aud differ diff --git a/mods/ca/bits/audio/veraslt5.aud b/mods/ca/bits/audio/veraslt5.aud new file mode 100644 index 0000000000..f460730014 Binary files /dev/null and b/mods/ca/bits/audio/veraslt5.aud differ diff --git a/mods/ca/bits/audio/vert-bomb1.aud b/mods/ca/bits/audio/vert-bomb1.aud new file mode 100644 index 0000000000..e1ac5d64a1 Binary files /dev/null and b/mods/ca/bits/audio/vert-bomb1.aud differ diff --git a/mods/ca/bits/audio/vert-bombhit1.aud b/mods/ca/bits/audio/vert-bombhit1.aud new file mode 100644 index 0000000000..5068f21b4f Binary files /dev/null and b/mods/ca/bits/audio/vert-bombhit1.aud differ diff --git a/mods/ca/bits/audio/vert-bombhit2.aud b/mods/ca/bits/audio/vert-bombhit2.aud new file mode 100644 index 0000000000..41d68c2363 Binary files /dev/null and b/mods/ca/bits/audio/vert-bombhit2.aud differ diff --git a/mods/ca/bits/audio/vflaata.aud b/mods/ca/bits/audio/vflaata.aud new file mode 100644 index 0000000000..7b1f8db61f Binary files /dev/null and b/mods/ca/bits/audio/vflaata.aud differ diff --git a/mods/ca/bits/audio/vflaatb.aud b/mods/ca/bits/audio/vflaatb.aud new file mode 100644 index 0000000000..49e639da16 Binary files /dev/null and b/mods/ca/bits/audio/vflaatb.aud differ diff --git a/mods/ca/bits/audio/vflaatc.aud b/mods/ca/bits/audio/vflaatc.aud new file mode 100644 index 0000000000..b8887423b1 Binary files /dev/null and b/mods/ca/bits/audio/vflaatc.aud differ diff --git a/mods/ca/bits/audio/vflaatd.aud b/mods/ca/bits/audio/vflaatd.aud new file mode 100644 index 0000000000..ed45d47a7f Binary files /dev/null and b/mods/ca/bits/audio/vflaatd.aud differ diff --git a/mods/ca/bits/audio/vflaate.aud b/mods/ca/bits/audio/vflaate.aud new file mode 100644 index 0000000000..05e36fb5b2 Binary files /dev/null and b/mods/ca/bits/audio/vflaate.aud differ diff --git a/mods/ca/bits/audio/vflamoa.aud b/mods/ca/bits/audio/vflamoa.aud new file mode 100644 index 0000000000..ac8d1e6048 Binary files /dev/null and b/mods/ca/bits/audio/vflamoa.aud differ diff --git a/mods/ca/bits/audio/vflamob.aud b/mods/ca/bits/audio/vflamob.aud new file mode 100644 index 0000000000..f0637f6125 Binary files /dev/null and b/mods/ca/bits/audio/vflamob.aud differ diff --git a/mods/ca/bits/audio/vflamoc.aud b/mods/ca/bits/audio/vflamoc.aud new file mode 100644 index 0000000000..a21d54bf59 Binary files /dev/null and b/mods/ca/bits/audio/vflamoc.aud differ diff --git a/mods/ca/bits/audio/vflamod.aud b/mods/ca/bits/audio/vflamod.aud new file mode 100644 index 0000000000..216df4c9cd Binary files /dev/null and b/mods/ca/bits/audio/vflamod.aud differ diff --git a/mods/ca/bits/audio/vflamoe.aud b/mods/ca/bits/audio/vflamoe.aud new file mode 100644 index 0000000000..b2c3238532 Binary files /dev/null and b/mods/ca/bits/audio/vflamoe.aud differ diff --git a/mods/ca/bits/audio/vflasea.aud b/mods/ca/bits/audio/vflasea.aud new file mode 100644 index 0000000000..5617e69952 Binary files /dev/null and b/mods/ca/bits/audio/vflasea.aud differ diff --git a/mods/ca/bits/audio/vflaseb.aud b/mods/ca/bits/audio/vflaseb.aud new file mode 100644 index 0000000000..75b483c7d6 Binary files /dev/null and b/mods/ca/bits/audio/vflaseb.aud differ diff --git a/mods/ca/bits/audio/vflasec.aud b/mods/ca/bits/audio/vflasec.aud new file mode 100644 index 0000000000..63a35648eb Binary files /dev/null and b/mods/ca/bits/audio/vflasec.aud differ diff --git a/mods/ca/bits/audio/vflased.aud b/mods/ca/bits/audio/vflased.aud new file mode 100644 index 0000000000..72ab6e9365 Binary files /dev/null and b/mods/ca/bits/audio/vflased.aud differ diff --git a/mods/ca/bits/audio/vflasee.aud b/mods/ca/bits/audio/vflasee.aud new file mode 100644 index 0000000000..8a36b135c7 Binary files /dev/null and b/mods/ca/bits/audio/vflasee.aud differ diff --git a/mods/ca/bits/audio/vfloatta.aud b/mods/ca/bits/audio/vfloatta.aud new file mode 100644 index 0000000000..77e164cc5b Binary files /dev/null and b/mods/ca/bits/audio/vfloatta.aud differ diff --git a/mods/ca/bits/audio/vflolo2a.aud b/mods/ca/bits/audio/vflolo2a.aud new file mode 100644 index 0000000000..191a3ed422 Binary files /dev/null and b/mods/ca/bits/audio/vflolo2a.aud differ diff --git a/mods/ca/bits/audio/vflolo2b.aud b/mods/ca/bits/audio/vflolo2b.aud new file mode 100644 index 0000000000..3924648c5e Binary files /dev/null and b/mods/ca/bits/audio/vflolo2b.aud differ diff --git a/mods/ca/bits/audio/vflolo4a.aud b/mods/ca/bits/audio/vflolo4a.aud new file mode 100644 index 0000000000..55665e6646 Binary files /dev/null and b/mods/ca/bits/audio/vflolo4a.aud differ diff --git a/mods/ca/bits/audio/vflolo5b.aud b/mods/ca/bits/audio/vflolo5b.aud new file mode 100644 index 0000000000..1bff2e2cd3 Binary files /dev/null and b/mods/ca/bits/audio/vflolo5b.aud differ diff --git a/mods/ca/bits/audio/vflolo6a.aud b/mods/ca/bits/audio/vflolo6a.aud new file mode 100644 index 0000000000..171a1c156a Binary files /dev/null and b/mods/ca/bits/audio/vflolo6a.aud differ diff --git a/mods/ca/bits/audio/vgatlo3a.aud b/mods/ca/bits/audio/vgatlo3a.aud new file mode 100644 index 0000000000..2e1cb0535c Binary files /dev/null and b/mods/ca/bits/audio/vgatlo3a.aud differ diff --git a/mods/ca/bits/audio/vgatlo6a.aud b/mods/ca/bits/audio/vgatlo6a.aud new file mode 100644 index 0000000000..14c7324b4f Binary files /dev/null and b/mods/ca/bits/audio/vgatlo6a.aud differ diff --git a/mods/ca/bits/audio/vgatlo9a.aud b/mods/ca/bits/audio/vgatlo9a.aud new file mode 100644 index 0000000000..62ae2d41a4 Binary files /dev/null and b/mods/ca/bits/audio/vgatlo9a.aud differ diff --git a/mods/ca/bits/audio/vgraata.aud b/mods/ca/bits/audio/vgraata.aud new file mode 100644 index 0000000000..576779cb68 Binary files /dev/null and b/mods/ca/bits/audio/vgraata.aud differ diff --git a/mods/ca/bits/audio/vgraatb.aud b/mods/ca/bits/audio/vgraatb.aud new file mode 100644 index 0000000000..1354e8ac06 Binary files /dev/null and b/mods/ca/bits/audio/vgraatb.aud differ diff --git a/mods/ca/bits/audio/vgraatc.aud b/mods/ca/bits/audio/vgraatc.aud new file mode 100644 index 0000000000..d00347be0c Binary files /dev/null and b/mods/ca/bits/audio/vgraatc.aud differ diff --git a/mods/ca/bits/audio/vgraatd.aud b/mods/ca/bits/audio/vgraatd.aud new file mode 100644 index 0000000000..3ecb9a536e Binary files /dev/null and b/mods/ca/bits/audio/vgraatd.aud differ diff --git a/mods/ca/bits/audio/vgraate.aud b/mods/ca/bits/audio/vgraate.aud new file mode 100644 index 0000000000..5bf851a3a0 Binary files /dev/null and b/mods/ca/bits/audio/vgraate.aud differ diff --git a/mods/ca/bits/audio/vgradatk1.aud b/mods/ca/bits/audio/vgradatk1.aud new file mode 100644 index 0000000000..5238307407 Binary files /dev/null and b/mods/ca/bits/audio/vgradatk1.aud differ diff --git a/mods/ca/bits/audio/vgradatk2.aud b/mods/ca/bits/audio/vgradatk2.aud new file mode 100644 index 0000000000..152bdae187 Binary files /dev/null and b/mods/ca/bits/audio/vgradatk2.aud differ diff --git a/mods/ca/bits/audio/vgradatk3.aud b/mods/ca/bits/audio/vgradatk3.aud new file mode 100644 index 0000000000..beefc4bed6 Binary files /dev/null and b/mods/ca/bits/audio/vgradatk3.aud differ diff --git a/mods/ca/bits/audio/vgradatk4.aud b/mods/ca/bits/audio/vgradatk4.aud new file mode 100644 index 0000000000..79ded7d5c0 Binary files /dev/null and b/mods/ca/bits/audio/vgradatk4.aud differ diff --git a/mods/ca/bits/audio/vgradatk5.aud b/mods/ca/bits/audio/vgradatk5.aud new file mode 100644 index 0000000000..095eeab679 Binary files /dev/null and b/mods/ca/bits/audio/vgradatk5.aud differ diff --git a/mods/ca/bits/audio/vgradmov1.aud b/mods/ca/bits/audio/vgradmov1.aud new file mode 100644 index 0000000000..33126f6436 Binary files /dev/null and b/mods/ca/bits/audio/vgradmov1.aud differ diff --git a/mods/ca/bits/audio/vgradmov2.aud b/mods/ca/bits/audio/vgradmov2.aud new file mode 100644 index 0000000000..5f8c5f6dc4 Binary files /dev/null and b/mods/ca/bits/audio/vgradmov2.aud differ diff --git a/mods/ca/bits/audio/vgradmov3.aud b/mods/ca/bits/audio/vgradmov3.aud new file mode 100644 index 0000000000..e0a3505c97 Binary files /dev/null and b/mods/ca/bits/audio/vgradmov3.aud differ diff --git a/mods/ca/bits/audio/vgradmov4.aud b/mods/ca/bits/audio/vgradmov4.aud new file mode 100644 index 0000000000..6d74a8acef Binary files /dev/null and b/mods/ca/bits/audio/vgradmov4.aud differ diff --git a/mods/ca/bits/audio/vgradmov5.aud b/mods/ca/bits/audio/vgradmov5.aud new file mode 100644 index 0000000000..9e8b083000 Binary files /dev/null and b/mods/ca/bits/audio/vgradmov5.aud differ diff --git a/mods/ca/bits/audio/vgradslt1.aud b/mods/ca/bits/audio/vgradslt1.aud new file mode 100644 index 0000000000..418ffd7b39 Binary files /dev/null and b/mods/ca/bits/audio/vgradslt1.aud differ diff --git a/mods/ca/bits/audio/vgradslt2.aud b/mods/ca/bits/audio/vgradslt2.aud new file mode 100644 index 0000000000..5b1f0f068c Binary files /dev/null and b/mods/ca/bits/audio/vgradslt2.aud differ diff --git a/mods/ca/bits/audio/vgradslt3.aud b/mods/ca/bits/audio/vgradslt3.aud new file mode 100644 index 0000000000..8acc46e6cc Binary files /dev/null and b/mods/ca/bits/audio/vgradslt3.aud differ diff --git a/mods/ca/bits/audio/vgradslt4.aud b/mods/ca/bits/audio/vgradslt4.aud new file mode 100644 index 0000000000..9c59afe244 Binary files /dev/null and b/mods/ca/bits/audio/vgradslt4.aud differ diff --git a/mods/ca/bits/audio/vgradslt5.aud b/mods/ca/bits/audio/vgradslt5.aud new file mode 100644 index 0000000000..71f442739c Binary files /dev/null and b/mods/ca/bits/audio/vgradslt5.aud differ diff --git a/mods/ca/bits/audio/vgradslt6.aud b/mods/ca/bits/audio/vgradslt6.aud new file mode 100644 index 0000000000..7a9faef48e Binary files /dev/null and b/mods/ca/bits/audio/vgradslt6.aud differ diff --git a/mods/ca/bits/audio/vgramoa.aud b/mods/ca/bits/audio/vgramoa.aud new file mode 100644 index 0000000000..09266d9ddf Binary files /dev/null and b/mods/ca/bits/audio/vgramoa.aud differ diff --git a/mods/ca/bits/audio/vgramob.aud b/mods/ca/bits/audio/vgramob.aud new file mode 100644 index 0000000000..9409649cec Binary files /dev/null and b/mods/ca/bits/audio/vgramob.aud differ diff --git a/mods/ca/bits/audio/vgramoc.aud b/mods/ca/bits/audio/vgramoc.aud new file mode 100644 index 0000000000..39ba121ad3 Binary files /dev/null and b/mods/ca/bits/audio/vgramoc.aud differ diff --git a/mods/ca/bits/audio/vgramod.aud b/mods/ca/bits/audio/vgramod.aud new file mode 100644 index 0000000000..348989f903 Binary files /dev/null and b/mods/ca/bits/audio/vgramod.aud differ diff --git a/mods/ca/bits/audio/vgramoe.aud b/mods/ca/bits/audio/vgramoe.aud new file mode 100644 index 0000000000..6821b64d4f Binary files /dev/null and b/mods/ca/bits/audio/vgramoe.aud differ diff --git a/mods/ca/bits/audio/vgramof.aud b/mods/ca/bits/audio/vgramof.aud new file mode 100644 index 0000000000..e12cb3e09d Binary files /dev/null and b/mods/ca/bits/audio/vgramof.aud differ diff --git a/mods/ca/bits/audio/vgrasea.aud b/mods/ca/bits/audio/vgrasea.aud new file mode 100644 index 0000000000..b565cc01ce Binary files /dev/null and b/mods/ca/bits/audio/vgrasea.aud differ diff --git a/mods/ca/bits/audio/vgraseb.aud b/mods/ca/bits/audio/vgraseb.aud new file mode 100644 index 0000000000..33b077f2c1 Binary files /dev/null and b/mods/ca/bits/audio/vgraseb.aud differ diff --git a/mods/ca/bits/audio/vgrasec.aud b/mods/ca/bits/audio/vgrasec.aud new file mode 100644 index 0000000000..6286efefaf Binary files /dev/null and b/mods/ca/bits/audio/vgrasec.aud differ diff --git a/mods/ca/bits/audio/vgrased.aud b/mods/ca/bits/audio/vgrased.aud new file mode 100644 index 0000000000..d897b7d8de Binary files /dev/null and b/mods/ca/bits/audio/vgrased.aud differ diff --git a/mods/ca/bits/audio/vgrasee.aud b/mods/ca/bits/audio/vgrasee.aud new file mode 100644 index 0000000000..920f3ebaf8 Binary files /dev/null and b/mods/ca/bits/audio/vgrasee.aud differ diff --git a/mods/ca/bits/audio/vhalodiea.aud b/mods/ca/bits/audio/vhalodiea.aud new file mode 100644 index 0000000000..8cf55a419f Binary files /dev/null and b/mods/ca/bits/audio/vhalodiea.aud differ diff --git a/mods/ca/bits/audio/vhalolana.aud b/mods/ca/bits/audio/vhalolana.aud new file mode 100644 index 0000000000..7f07db1ef3 Binary files /dev/null and b/mods/ca/bits/audio/vhalolana.aud differ diff --git a/mods/ca/bits/audio/vhalomov1.aud b/mods/ca/bits/audio/vhalomov1.aud new file mode 100644 index 0000000000..04b686b9fe Binary files /dev/null and b/mods/ca/bits/audio/vhalomov1.aud differ diff --git a/mods/ca/bits/audio/vhalomov2.aud b/mods/ca/bits/audio/vhalomov2.aud new file mode 100644 index 0000000000..fde7f0eabd Binary files /dev/null and b/mods/ca/bits/audio/vhalomov2.aud differ diff --git a/mods/ca/bits/audio/vhalomov3.aud b/mods/ca/bits/audio/vhalomov3.aud new file mode 100644 index 0000000000..34afbea302 Binary files /dev/null and b/mods/ca/bits/audio/vhalomov3.aud differ diff --git a/mods/ca/bits/audio/vhalomov4.aud b/mods/ca/bits/audio/vhalomov4.aud new file mode 100644 index 0000000000..82f84ac4ec Binary files /dev/null and b/mods/ca/bits/audio/vhalomov4.aud differ diff --git a/mods/ca/bits/audio/vhalomov5.aud b/mods/ca/bits/audio/vhalomov5.aud new file mode 100644 index 0000000000..b3f2b40567 Binary files /dev/null and b/mods/ca/bits/audio/vhalomov5.aud differ diff --git a/mods/ca/bits/audio/vhaloslt1.aud b/mods/ca/bits/audio/vhaloslt1.aud new file mode 100644 index 0000000000..2f98dbd2b4 Binary files /dev/null and b/mods/ca/bits/audio/vhaloslt1.aud differ diff --git a/mods/ca/bits/audio/vhaloslt2.aud b/mods/ca/bits/audio/vhaloslt2.aud new file mode 100644 index 0000000000..ca1242e778 Binary files /dev/null and b/mods/ca/bits/audio/vhaloslt2.aud differ diff --git a/mods/ca/bits/audio/vhaloslt3.aud b/mods/ca/bits/audio/vhaloslt3.aud new file mode 100644 index 0000000000..9920e3fbc8 Binary files /dev/null and b/mods/ca/bits/audio/vhaloslt3.aud differ diff --git a/mods/ca/bits/audio/vhaloslt4.aud b/mods/ca/bits/audio/vhaloslt4.aud new file mode 100644 index 0000000000..c5e25c724c Binary files /dev/null and b/mods/ca/bits/audio/vhaloslt4.aud differ diff --git a/mods/ca/bits/audio/vhaloslt5.aud b/mods/ca/bits/audio/vhaloslt5.aud new file mode 100644 index 0000000000..c1fcb7e4c3 Binary files /dev/null and b/mods/ca/bits/audio/vhaloslt5.aud differ diff --git a/mods/ca/bits/audio/vhalostaa.aud b/mods/ca/bits/audio/vhalostaa.aud new file mode 100644 index 0000000000..e1892c83a7 Binary files /dev/null and b/mods/ca/bits/audio/vhalostaa.aud differ diff --git a/mods/ca/bits/audio/vhelidi1a.aud b/mods/ca/bits/audio/vhelidi1a.aud new file mode 100644 index 0000000000..a7936372d1 Binary files /dev/null and b/mods/ca/bits/audio/vhelidi1a.aud differ diff --git a/mods/ca/bits/audio/vhelidi2a.aud b/mods/ca/bits/audio/vhelidi2a.aud new file mode 100644 index 0000000000..090e1801af Binary files /dev/null and b/mods/ca/bits/audio/vhelidi2a.aud differ diff --git a/mods/ca/bits/audio/vhelilana.aud b/mods/ca/bits/audio/vhelilana.aud new file mode 100644 index 0000000000..293f7a4e5f Binary files /dev/null and b/mods/ca/bits/audio/vhelilana.aud differ diff --git a/mods/ca/bits/audio/vhelistaa.aud b/mods/ca/bits/audio/vhelistaa.aud new file mode 100644 index 0000000000..530b88ecce Binary files /dev/null and b/mods/ca/bits/audio/vhelistaa.aud differ diff --git a/mods/ca/bits/audio/vhstkatk1.aud b/mods/ca/bits/audio/vhstkatk1.aud new file mode 100644 index 0000000000..e06fc9a304 Binary files /dev/null and b/mods/ca/bits/audio/vhstkatk1.aud differ diff --git a/mods/ca/bits/audio/vhstkatk2.aud b/mods/ca/bits/audio/vhstkatk2.aud new file mode 100644 index 0000000000..faee4aec61 Binary files /dev/null and b/mods/ca/bits/audio/vhstkatk2.aud differ diff --git a/mods/ca/bits/audio/vhstkatk3.aud b/mods/ca/bits/audio/vhstkatk3.aud new file mode 100644 index 0000000000..4fc20bcce5 Binary files /dev/null and b/mods/ca/bits/audio/vhstkatk3.aud differ diff --git a/mods/ca/bits/audio/vhstkatk4.aud b/mods/ca/bits/audio/vhstkatk4.aud new file mode 100644 index 0000000000..6e630ee63e Binary files /dev/null and b/mods/ca/bits/audio/vhstkatk4.aud differ diff --git a/mods/ca/bits/audio/vhstkatk5.aud b/mods/ca/bits/audio/vhstkatk5.aud new file mode 100644 index 0000000000..bfb9773789 Binary files /dev/null and b/mods/ca/bits/audio/vhstkatk5.aud differ diff --git a/mods/ca/bits/audio/vhstkmov1.aud b/mods/ca/bits/audio/vhstkmov1.aud new file mode 100644 index 0000000000..051613283a Binary files /dev/null and b/mods/ca/bits/audio/vhstkmov1.aud differ diff --git a/mods/ca/bits/audio/vhstkmov2.aud b/mods/ca/bits/audio/vhstkmov2.aud new file mode 100644 index 0000000000..94bb7cb3dd Binary files /dev/null and b/mods/ca/bits/audio/vhstkmov2.aud differ diff --git a/mods/ca/bits/audio/vhstkmov3.aud b/mods/ca/bits/audio/vhstkmov3.aud new file mode 100644 index 0000000000..99db652e46 Binary files /dev/null and b/mods/ca/bits/audio/vhstkmov3.aud differ diff --git a/mods/ca/bits/audio/vhstkmov4.aud b/mods/ca/bits/audio/vhstkmov4.aud new file mode 100644 index 0000000000..2b17a27c45 Binary files /dev/null and b/mods/ca/bits/audio/vhstkmov4.aud differ diff --git a/mods/ca/bits/audio/vhstkmov5.aud b/mods/ca/bits/audio/vhstkmov5.aud new file mode 100644 index 0000000000..8c083872d3 Binary files /dev/null and b/mods/ca/bits/audio/vhstkmov5.aud differ diff --git a/mods/ca/bits/audio/vhstkmov6.aud b/mods/ca/bits/audio/vhstkmov6.aud new file mode 100644 index 0000000000..99e7590e6e Binary files /dev/null and b/mods/ca/bits/audio/vhstkmov6.aud differ diff --git a/mods/ca/bits/audio/vhstkslt1.aud b/mods/ca/bits/audio/vhstkslt1.aud new file mode 100644 index 0000000000..05aa5ac174 Binary files /dev/null and b/mods/ca/bits/audio/vhstkslt1.aud differ diff --git a/mods/ca/bits/audio/vhstkslt2.aud b/mods/ca/bits/audio/vhstkslt2.aud new file mode 100644 index 0000000000..9f556add42 Binary files /dev/null and b/mods/ca/bits/audio/vhstkslt2.aud differ diff --git a/mods/ca/bits/audio/vhstkslt3.aud b/mods/ca/bits/audio/vhstkslt3.aud new file mode 100644 index 0000000000..4c28f406dc Binary files /dev/null and b/mods/ca/bits/audio/vhstkslt3.aud differ diff --git a/mods/ca/bits/audio/vhstkslt4.aud b/mods/ca/bits/audio/vhstkslt4.aud new file mode 100644 index 0000000000..5cec39e031 Binary files /dev/null and b/mods/ca/bits/audio/vhstkslt4.aud differ diff --git a/mods/ca/bits/audio/vhstkslt5.aud b/mods/ca/bits/audio/vhstkslt5.aud new file mode 100644 index 0000000000..591c3f7f06 Binary files /dev/null and b/mods/ca/bits/audio/vhstkslt5.aud differ diff --git a/mods/ca/bits/audio/vifvtran.aud b/mods/ca/bits/audio/vifvtran.aud new file mode 100644 index 0000000000..51726bdf9b Binary files /dev/null and b/mods/ca/bits/audio/vifvtran.aud differ diff --git a/mods/ca/bits/audio/vintatta.aud b/mods/ca/bits/audio/vintatta.aud new file mode 100644 index 0000000000..e777f69f02 Binary files /dev/null and b/mods/ca/bits/audio/vintatta.aud differ diff --git a/mods/ca/bits/audio/vintdiea.aud b/mods/ca/bits/audio/vintdiea.aud new file mode 100644 index 0000000000..5ef2ce10f6 Binary files /dev/null and b/mods/ca/bits/audio/vintdiea.aud differ diff --git a/mods/ca/bits/audio/vintdieb.aud b/mods/ca/bits/audio/vintdieb.aud new file mode 100644 index 0000000000..d786c33451 Binary files /dev/null and b/mods/ca/bits/audio/vintdieb.aud differ diff --git a/mods/ca/bits/audio/vintdna.aud b/mods/ca/bits/audio/vintdna.aud new file mode 100644 index 0000000000..e1ad232d15 Binary files /dev/null and b/mods/ca/bits/audio/vintdna.aud differ diff --git a/mods/ca/bits/audio/vintupa.aud b/mods/ca/bits/audio/vintupa.aud new file mode 100644 index 0000000000..c6c4993ae9 Binary files /dev/null and b/mods/ca/bits/audio/vintupa.aud differ diff --git a/mods/ca/bits/audio/viper-fire1.aud b/mods/ca/bits/audio/viper-fire1.aud new file mode 100644 index 0000000000..277db89fd4 Binary files /dev/null and b/mods/ca/bits/audio/viper-fire1.aud differ diff --git a/mods/ca/bits/audio/visuat1.aud b/mods/ca/bits/audio/visuat1.aud new file mode 100644 index 0000000000..b01784ab11 Binary files /dev/null and b/mods/ca/bits/audio/visuat1.aud differ diff --git a/mods/ca/bits/audio/visuat2.aud b/mods/ca/bits/audio/visuat2.aud new file mode 100644 index 0000000000..7601a37126 Binary files /dev/null and b/mods/ca/bits/audio/visuat2.aud differ diff --git a/mods/ca/bits/audio/visuat3.aud b/mods/ca/bits/audio/visuat3.aud new file mode 100644 index 0000000000..bde36d4f01 Binary files /dev/null and b/mods/ca/bits/audio/visuat3.aud differ diff --git a/mods/ca/bits/audio/visuat4.aud b/mods/ca/bits/audio/visuat4.aud new file mode 100644 index 0000000000..3de9229280 Binary files /dev/null and b/mods/ca/bits/audio/visuat4.aud differ diff --git a/mods/ca/bits/audio/visumo1.aud b/mods/ca/bits/audio/visumo1.aud new file mode 100644 index 0000000000..20f525ba36 Binary files /dev/null and b/mods/ca/bits/audio/visumo1.aud differ diff --git a/mods/ca/bits/audio/visumo2.aud b/mods/ca/bits/audio/visumo2.aud new file mode 100644 index 0000000000..decbb125f3 Binary files /dev/null and b/mods/ca/bits/audio/visumo2.aud differ diff --git a/mods/ca/bits/audio/visumo3.aud b/mods/ca/bits/audio/visumo3.aud new file mode 100644 index 0000000000..ceb82381b1 Binary files /dev/null and b/mods/ca/bits/audio/visumo3.aud differ diff --git a/mods/ca/bits/audio/visumo4.aud b/mods/ca/bits/audio/visumo4.aud new file mode 100644 index 0000000000..bf7295c462 Binary files /dev/null and b/mods/ca/bits/audio/visumo4.aud differ diff --git a/mods/ca/bits/audio/visumo5.aud b/mods/ca/bits/audio/visumo5.aud new file mode 100644 index 0000000000..30b643ffdd Binary files /dev/null and b/mods/ca/bits/audio/visumo5.aud differ diff --git a/mods/ca/bits/audio/visusl1.aud b/mods/ca/bits/audio/visusl1.aud new file mode 100644 index 0000000000..a08ad050b2 Binary files /dev/null and b/mods/ca/bits/audio/visusl1.aud differ diff --git a/mods/ca/bits/audio/visusl2.aud b/mods/ca/bits/audio/visusl2.aud new file mode 100644 index 0000000000..b2eb16fb15 Binary files /dev/null and b/mods/ca/bits/audio/visusl2.aud differ diff --git a/mods/ca/bits/audio/visusl3.aud b/mods/ca/bits/audio/visusl3.aud new file mode 100644 index 0000000000..c23e0d222b Binary files /dev/null and b/mods/ca/bits/audio/visusl3.aud differ diff --git a/mods/ca/bits/audio/visusl4.aud b/mods/ca/bits/audio/visusl4.aud new file mode 100644 index 0000000000..89ad5ad7e3 Binary files /dev/null and b/mods/ca/bits/audio/visusl4.aud differ diff --git a/mods/ca/bits/audio/vjugat1.aud b/mods/ca/bits/audio/vjugat1.aud new file mode 100644 index 0000000000..987320ca9a Binary files /dev/null and b/mods/ca/bits/audio/vjugat1.aud differ diff --git a/mods/ca/bits/audio/vjugat2.aud b/mods/ca/bits/audio/vjugat2.aud new file mode 100644 index 0000000000..13647b58a2 Binary files /dev/null and b/mods/ca/bits/audio/vjugat2.aud differ diff --git a/mods/ca/bits/audio/vjugat3.aud b/mods/ca/bits/audio/vjugat3.aud new file mode 100644 index 0000000000..67e480e5c9 Binary files /dev/null and b/mods/ca/bits/audio/vjugat3.aud differ diff --git a/mods/ca/bits/audio/vjugat4.aud b/mods/ca/bits/audio/vjugat4.aud new file mode 100644 index 0000000000..61a4f87dcb Binary files /dev/null and b/mods/ca/bits/audio/vjugat4.aud differ diff --git a/mods/ca/bits/audio/vjugat5.aud b/mods/ca/bits/audio/vjugat5.aud new file mode 100644 index 0000000000..b672efda27 Binary files /dev/null and b/mods/ca/bits/audio/vjugat5.aud differ diff --git a/mods/ca/bits/audio/vjugat6.aud b/mods/ca/bits/audio/vjugat6.aud new file mode 100644 index 0000000000..cff9306f1a Binary files /dev/null and b/mods/ca/bits/audio/vjugat6.aud differ diff --git a/mods/ca/bits/audio/vjugmo1.aud b/mods/ca/bits/audio/vjugmo1.aud new file mode 100644 index 0000000000..f2f14e8314 Binary files /dev/null and b/mods/ca/bits/audio/vjugmo1.aud differ diff --git a/mods/ca/bits/audio/vjugmo2.aud b/mods/ca/bits/audio/vjugmo2.aud new file mode 100644 index 0000000000..3842aa50b8 Binary files /dev/null and b/mods/ca/bits/audio/vjugmo2.aud differ diff --git a/mods/ca/bits/audio/vjugmo3.aud b/mods/ca/bits/audio/vjugmo3.aud new file mode 100644 index 0000000000..8b3d7c80bc Binary files /dev/null and b/mods/ca/bits/audio/vjugmo3.aud differ diff --git a/mods/ca/bits/audio/vjugmo4.aud b/mods/ca/bits/audio/vjugmo4.aud new file mode 100644 index 0000000000..a0d27f462f Binary files /dev/null and b/mods/ca/bits/audio/vjugmo4.aud differ diff --git a/mods/ca/bits/audio/vjugmo5.aud b/mods/ca/bits/audio/vjugmo5.aud new file mode 100644 index 0000000000..9b5fc8b716 Binary files /dev/null and b/mods/ca/bits/audio/vjugmo5.aud differ diff --git a/mods/ca/bits/audio/vjugmo6.aud b/mods/ca/bits/audio/vjugmo6.aud new file mode 100644 index 0000000000..08170d0ba2 Binary files /dev/null and b/mods/ca/bits/audio/vjugmo6.aud differ diff --git a/mods/ca/bits/audio/vjugsl1.aud b/mods/ca/bits/audio/vjugsl1.aud new file mode 100644 index 0000000000..040ab61e75 Binary files /dev/null and b/mods/ca/bits/audio/vjugsl1.aud differ diff --git a/mods/ca/bits/audio/vjugsl2.aud b/mods/ca/bits/audio/vjugsl2.aud new file mode 100644 index 0000000000..65aa994163 Binary files /dev/null and b/mods/ca/bits/audio/vjugsl2.aud differ diff --git a/mods/ca/bits/audio/vjugsl3.aud b/mods/ca/bits/audio/vjugsl3.aud new file mode 100644 index 0000000000..2dad1428a6 Binary files /dev/null and b/mods/ca/bits/audio/vjugsl3.aud differ diff --git a/mods/ca/bits/audio/vjugsl4.aud b/mods/ca/bits/audio/vjugsl4.aud new file mode 100644 index 0000000000..d523eb9eec Binary files /dev/null and b/mods/ca/bits/audio/vjugsl4.aud differ diff --git a/mods/ca/bits/audio/vjugsl5.aud b/mods/ca/bits/audio/vjugsl5.aud new file mode 100644 index 0000000000..1585068cf0 Binary files /dev/null and b/mods/ca/bits/audio/vjugsl5.aud differ diff --git a/mods/ca/bits/audio/vlasatta.aud b/mods/ca/bits/audio/vlasatta.aud new file mode 100644 index 0000000000..c36b95f7cb Binary files /dev/null and b/mods/ca/bits/audio/vlasatta.aud differ diff --git a/mods/ca/bits/audio/vmamatk1.aud b/mods/ca/bits/audio/vmamatk1.aud new file mode 100644 index 0000000000..75a00e6821 Binary files /dev/null and b/mods/ca/bits/audio/vmamatk1.aud differ diff --git a/mods/ca/bits/audio/vmamatk2.aud b/mods/ca/bits/audio/vmamatk2.aud new file mode 100644 index 0000000000..37ca10a837 Binary files /dev/null and b/mods/ca/bits/audio/vmamatk2.aud differ diff --git a/mods/ca/bits/audio/vmamatk3.aud b/mods/ca/bits/audio/vmamatk3.aud new file mode 100644 index 0000000000..1570a5143d Binary files /dev/null and b/mods/ca/bits/audio/vmamatk3.aud differ diff --git a/mods/ca/bits/audio/vmamatk4.aud b/mods/ca/bits/audio/vmamatk4.aud new file mode 100644 index 0000000000..c10d1753f6 Binary files /dev/null and b/mods/ca/bits/audio/vmamatk4.aud differ diff --git a/mods/ca/bits/audio/vmamatk5.aud b/mods/ca/bits/audio/vmamatk5.aud new file mode 100644 index 0000000000..f4e3f0c795 Binary files /dev/null and b/mods/ca/bits/audio/vmamatk5.aud differ diff --git a/mods/ca/bits/audio/vmamatk6.aud b/mods/ca/bits/audio/vmamatk6.aud new file mode 100644 index 0000000000..7ce1fe2cc3 Binary files /dev/null and b/mods/ca/bits/audio/vmamatk6.aud differ diff --git a/mods/ca/bits/audio/vmamdatk1.aud b/mods/ca/bits/audio/vmamdatk1.aud new file mode 100644 index 0000000000..618bf60812 Binary files /dev/null and b/mods/ca/bits/audio/vmamdatk1.aud differ diff --git a/mods/ca/bits/audio/vmamdatk2.aud b/mods/ca/bits/audio/vmamdatk2.aud new file mode 100644 index 0000000000..82471eacb3 Binary files /dev/null and b/mods/ca/bits/audio/vmamdatk2.aud differ diff --git a/mods/ca/bits/audio/vmamdatk3.aud b/mods/ca/bits/audio/vmamdatk3.aud new file mode 100644 index 0000000000..4463eaddb6 Binary files /dev/null and b/mods/ca/bits/audio/vmamdatk3.aud differ diff --git a/mods/ca/bits/audio/vmamdatk4.aud b/mods/ca/bits/audio/vmamdatk4.aud new file mode 100644 index 0000000000..e3be981f94 Binary files /dev/null and b/mods/ca/bits/audio/vmamdatk4.aud differ diff --git a/mods/ca/bits/audio/vmamdatk5.aud b/mods/ca/bits/audio/vmamdatk5.aud new file mode 100644 index 0000000000..7ee4dadf0c Binary files /dev/null and b/mods/ca/bits/audio/vmamdatk5.aud differ diff --git a/mods/ca/bits/audio/vmamdatk6.aud b/mods/ca/bits/audio/vmamdatk6.aud new file mode 100644 index 0000000000..f0519823f1 Binary files /dev/null and b/mods/ca/bits/audio/vmamdatk6.aud differ diff --git a/mods/ca/bits/audio/vmamdmov1.aud b/mods/ca/bits/audio/vmamdmov1.aud new file mode 100644 index 0000000000..419c8525c5 Binary files /dev/null and b/mods/ca/bits/audio/vmamdmov1.aud differ diff --git a/mods/ca/bits/audio/vmamdmov2.aud b/mods/ca/bits/audio/vmamdmov2.aud new file mode 100644 index 0000000000..d195730ed7 Binary files /dev/null and b/mods/ca/bits/audio/vmamdmov2.aud differ diff --git a/mods/ca/bits/audio/vmamdmov3.aud b/mods/ca/bits/audio/vmamdmov3.aud new file mode 100644 index 0000000000..37af2bb909 Binary files /dev/null and b/mods/ca/bits/audio/vmamdmov3.aud differ diff --git a/mods/ca/bits/audio/vmamdmov4.aud b/mods/ca/bits/audio/vmamdmov4.aud new file mode 100644 index 0000000000..2a30e951e1 Binary files /dev/null and b/mods/ca/bits/audio/vmamdmov4.aud differ diff --git a/mods/ca/bits/audio/vmamdmov5.aud b/mods/ca/bits/audio/vmamdmov5.aud new file mode 100644 index 0000000000..00a179b093 Binary files /dev/null and b/mods/ca/bits/audio/vmamdmov5.aud differ diff --git a/mods/ca/bits/audio/vmamdmov6.aud b/mods/ca/bits/audio/vmamdmov6.aud new file mode 100644 index 0000000000..dc780584c3 Binary files /dev/null and b/mods/ca/bits/audio/vmamdmov6.aud differ diff --git a/mods/ca/bits/audio/vmamdslt1.aud b/mods/ca/bits/audio/vmamdslt1.aud new file mode 100644 index 0000000000..7b53bfee5e Binary files /dev/null and b/mods/ca/bits/audio/vmamdslt1.aud differ diff --git a/mods/ca/bits/audio/vmamdslt2.aud b/mods/ca/bits/audio/vmamdslt2.aud new file mode 100644 index 0000000000..902c039f3d Binary files /dev/null and b/mods/ca/bits/audio/vmamdslt2.aud differ diff --git a/mods/ca/bits/audio/vmamdslt3.aud b/mods/ca/bits/audio/vmamdslt3.aud new file mode 100644 index 0000000000..b9fc1cd5b5 Binary files /dev/null and b/mods/ca/bits/audio/vmamdslt3.aud differ diff --git a/mods/ca/bits/audio/vmamdslt4.aud b/mods/ca/bits/audio/vmamdslt4.aud new file mode 100644 index 0000000000..d859f14a3e Binary files /dev/null and b/mods/ca/bits/audio/vmamdslt4.aud differ diff --git a/mods/ca/bits/audio/vmamdslt5.aud b/mods/ca/bits/audio/vmamdslt5.aud new file mode 100644 index 0000000000..3765be0fc0 Binary files /dev/null and b/mods/ca/bits/audio/vmamdslt5.aud differ diff --git a/mods/ca/bits/audio/vmamdslt6.aud b/mods/ca/bits/audio/vmamdslt6.aud new file mode 100644 index 0000000000..dfd965cb3b Binary files /dev/null and b/mods/ca/bits/audio/vmamdslt6.aud differ diff --git a/mods/ca/bits/audio/vmamdupg1.aud b/mods/ca/bits/audio/vmamdupg1.aud new file mode 100644 index 0000000000..c30ad60847 Binary files /dev/null and b/mods/ca/bits/audio/vmamdupg1.aud differ diff --git a/mods/ca/bits/audio/vmammov1.aud b/mods/ca/bits/audio/vmammov1.aud new file mode 100644 index 0000000000..ab631b0d96 Binary files /dev/null and b/mods/ca/bits/audio/vmammov1.aud differ diff --git a/mods/ca/bits/audio/vmammov2.aud b/mods/ca/bits/audio/vmammov2.aud new file mode 100644 index 0000000000..08c302e71d Binary files /dev/null and b/mods/ca/bits/audio/vmammov2.aud differ diff --git a/mods/ca/bits/audio/vmammov3.aud b/mods/ca/bits/audio/vmammov3.aud new file mode 100644 index 0000000000..bb98b8f7fe Binary files /dev/null and b/mods/ca/bits/audio/vmammov3.aud differ diff --git a/mods/ca/bits/audio/vmammov4.aud b/mods/ca/bits/audio/vmammov4.aud new file mode 100644 index 0000000000..f92f705a3d Binary files /dev/null and b/mods/ca/bits/audio/vmammov4.aud differ diff --git a/mods/ca/bits/audio/vmammov5.aud b/mods/ca/bits/audio/vmammov5.aud new file mode 100644 index 0000000000..7d4988bec2 Binary files /dev/null and b/mods/ca/bits/audio/vmammov5.aud differ diff --git a/mods/ca/bits/audio/vmamratk1.aud b/mods/ca/bits/audio/vmamratk1.aud new file mode 100644 index 0000000000..e46801eb09 Binary files /dev/null and b/mods/ca/bits/audio/vmamratk1.aud differ diff --git a/mods/ca/bits/audio/vmamratk2.aud b/mods/ca/bits/audio/vmamratk2.aud new file mode 100644 index 0000000000..268a281296 Binary files /dev/null and b/mods/ca/bits/audio/vmamratk2.aud differ diff --git a/mods/ca/bits/audio/vmamratk3.aud b/mods/ca/bits/audio/vmamratk3.aud new file mode 100644 index 0000000000..8151cd4e5b Binary files /dev/null and b/mods/ca/bits/audio/vmamratk3.aud differ diff --git a/mods/ca/bits/audio/vmamratk4.aud b/mods/ca/bits/audio/vmamratk4.aud new file mode 100644 index 0000000000..e524945494 Binary files /dev/null and b/mods/ca/bits/audio/vmamratk4.aud differ diff --git a/mods/ca/bits/audio/vmamratk5.aud b/mods/ca/bits/audio/vmamratk5.aud new file mode 100644 index 0000000000..2c503d27d6 Binary files /dev/null and b/mods/ca/bits/audio/vmamratk5.aud differ diff --git a/mods/ca/bits/audio/vmamratk6.aud b/mods/ca/bits/audio/vmamratk6.aud new file mode 100644 index 0000000000..f81524c9dd Binary files /dev/null and b/mods/ca/bits/audio/vmamratk6.aud differ diff --git a/mods/ca/bits/audio/vmamrmov1.aud b/mods/ca/bits/audio/vmamrmov1.aud new file mode 100644 index 0000000000..f8f96adf50 Binary files /dev/null and b/mods/ca/bits/audio/vmamrmov1.aud differ diff --git a/mods/ca/bits/audio/vmamrmov2.aud b/mods/ca/bits/audio/vmamrmov2.aud new file mode 100644 index 0000000000..b20b57837e Binary files /dev/null and b/mods/ca/bits/audio/vmamrmov2.aud differ diff --git a/mods/ca/bits/audio/vmamrmov3.aud b/mods/ca/bits/audio/vmamrmov3.aud new file mode 100644 index 0000000000..7f0f68a1fe Binary files /dev/null and b/mods/ca/bits/audio/vmamrmov3.aud differ diff --git a/mods/ca/bits/audio/vmamrmov4.aud b/mods/ca/bits/audio/vmamrmov4.aud new file mode 100644 index 0000000000..6afccddc91 Binary files /dev/null and b/mods/ca/bits/audio/vmamrmov4.aud differ diff --git a/mods/ca/bits/audio/vmamrmov5.aud b/mods/ca/bits/audio/vmamrmov5.aud new file mode 100644 index 0000000000..2f093a0571 Binary files /dev/null and b/mods/ca/bits/audio/vmamrmov5.aud differ diff --git a/mods/ca/bits/audio/vmamrslt1.aud b/mods/ca/bits/audio/vmamrslt1.aud new file mode 100644 index 0000000000..f8b6e24f54 Binary files /dev/null and b/mods/ca/bits/audio/vmamrslt1.aud differ diff --git a/mods/ca/bits/audio/vmamrslt2.aud b/mods/ca/bits/audio/vmamrslt2.aud new file mode 100644 index 0000000000..f2d8f49b7a Binary files /dev/null and b/mods/ca/bits/audio/vmamrslt2.aud differ diff --git a/mods/ca/bits/audio/vmamrslt3.aud b/mods/ca/bits/audio/vmamrslt3.aud new file mode 100644 index 0000000000..c76beda01d Binary files /dev/null and b/mods/ca/bits/audio/vmamrslt3.aud differ diff --git a/mods/ca/bits/audio/vmamrslt4.aud b/mods/ca/bits/audio/vmamrslt4.aud new file mode 100644 index 0000000000..21ae16016c Binary files /dev/null and b/mods/ca/bits/audio/vmamrslt4.aud differ diff --git a/mods/ca/bits/audio/vmamrslt5.aud b/mods/ca/bits/audio/vmamrslt5.aud new file mode 100644 index 0000000000..0e505bab48 Binary files /dev/null and b/mods/ca/bits/audio/vmamrslt5.aud differ diff --git a/mods/ca/bits/audio/vmamslt1.aud b/mods/ca/bits/audio/vmamslt1.aud new file mode 100644 index 0000000000..ed3c229c21 Binary files /dev/null and b/mods/ca/bits/audio/vmamslt1.aud differ diff --git a/mods/ca/bits/audio/vmamslt2.aud b/mods/ca/bits/audio/vmamslt2.aud new file mode 100644 index 0000000000..b7bd61844c Binary files /dev/null and b/mods/ca/bits/audio/vmamslt2.aud differ diff --git a/mods/ca/bits/audio/vmamslt3.aud b/mods/ca/bits/audio/vmamslt3.aud new file mode 100644 index 0000000000..ad71df901d Binary files /dev/null and b/mods/ca/bits/audio/vmamslt3.aud differ diff --git a/mods/ca/bits/audio/vmamslt4.aud b/mods/ca/bits/audio/vmamslt4.aud new file mode 100644 index 0000000000..9698d67458 Binary files /dev/null and b/mods/ca/bits/audio/vmamslt4.aud differ diff --git a/mods/ca/bits/audio/vmamslt5.aud b/mods/ca/bits/audio/vmamslt5.aud new file mode 100644 index 0000000000..5a956cbc8e Binary files /dev/null and b/mods/ca/bits/audio/vmamslt5.aud differ diff --git a/mods/ca/bits/audio/vmamupg1.aud b/mods/ca/bits/audio/vmamupg1.aud new file mode 100644 index 0000000000..c4bf684d81 Binary files /dev/null and b/mods/ca/bits/audio/vmamupg1.aud differ diff --git a/mods/ca/bits/audio/vmamupg2.aud b/mods/ca/bits/audio/vmamupg2.aud new file mode 100644 index 0000000000..b4940f5404 Binary files /dev/null and b/mods/ca/bits/audio/vmamupg2.aud differ diff --git a/mods/ca/bits/audio/vmirata.aud b/mods/ca/bits/audio/vmirata.aud index a7882e8676..afd7a5a397 100644 Binary files a/mods/ca/bits/audio/vmirata.aud and b/mods/ca/bits/audio/vmirata.aud differ diff --git a/mods/ca/bits/audio/vmiratb.aud b/mods/ca/bits/audio/vmiratb.aud index 6ac0d32862..839c89999e 100644 Binary files a/mods/ca/bits/audio/vmiratb.aud and b/mods/ca/bits/audio/vmiratb.aud differ diff --git a/mods/ca/bits/audio/vmiratc.aud b/mods/ca/bits/audio/vmiratc.aud index 1d689f72b2..13e3dbfacb 100644 Binary files a/mods/ca/bits/audio/vmiratc.aud and b/mods/ca/bits/audio/vmiratc.aud differ diff --git a/mods/ca/bits/audio/vmiratd.aud b/mods/ca/bits/audio/vmiratd.aud index 3ea18a1092..0e15b95061 100644 Binary files a/mods/ca/bits/audio/vmiratd.aud and b/mods/ca/bits/audio/vmiratd.aud differ diff --git a/mods/ca/bits/audio/vmirate.aud b/mods/ca/bits/audio/vmirate.aud index 507b50b070..8a89c8d509 100644 Binary files a/mods/ca/bits/audio/vmirate.aud and b/mods/ca/bits/audio/vmirate.aud differ diff --git a/mods/ca/bits/audio/vmirmoa.aud b/mods/ca/bits/audio/vmirmoa.aud index cc3c3e2657..11db4ef779 100644 Binary files a/mods/ca/bits/audio/vmirmoa.aud and b/mods/ca/bits/audio/vmirmoa.aud differ diff --git a/mods/ca/bits/audio/vmirmob.aud b/mods/ca/bits/audio/vmirmob.aud index 36f7902b21..dfc498d464 100644 Binary files a/mods/ca/bits/audio/vmirmob.aud and b/mods/ca/bits/audio/vmirmob.aud differ diff --git a/mods/ca/bits/audio/vmirmoc.aud b/mods/ca/bits/audio/vmirmoc.aud index 3784fd6d11..c8a54158a4 100644 Binary files a/mods/ca/bits/audio/vmirmoc.aud and b/mods/ca/bits/audio/vmirmoc.aud differ diff --git a/mods/ca/bits/audio/vmirmod.aud b/mods/ca/bits/audio/vmirmod.aud index 913e2ed5a5..570fdfdd1e 100644 Binary files a/mods/ca/bits/audio/vmirmod.aud and b/mods/ca/bits/audio/vmirmod.aud differ diff --git a/mods/ca/bits/audio/vmirmoe.aud b/mods/ca/bits/audio/vmirmoe.aud index 3ede8a7e1b..16f3e1afa7 100644 Binary files a/mods/ca/bits/audio/vmirmoe.aud and b/mods/ca/bits/audio/vmirmoe.aud differ diff --git a/mods/ca/bits/audio/vmirmof.aud b/mods/ca/bits/audio/vmirmof.aud index 31194e03b3..d56baf5f6b 100644 Binary files a/mods/ca/bits/audio/vmirmof.aud and b/mods/ca/bits/audio/vmirmof.aud differ diff --git a/mods/ca/bits/audio/vmirsea.aud b/mods/ca/bits/audio/vmirsea.aud index 25bf47b7ee..634b10912a 100644 Binary files a/mods/ca/bits/audio/vmirsea.aud and b/mods/ca/bits/audio/vmirsea.aud differ diff --git a/mods/ca/bits/audio/vmirseb.aud b/mods/ca/bits/audio/vmirseb.aud index 5981aa99d0..2ae0ae934c 100644 Binary files a/mods/ca/bits/audio/vmirseb.aud and b/mods/ca/bits/audio/vmirseb.aud differ diff --git a/mods/ca/bits/audio/vmirsec.aud b/mods/ca/bits/audio/vmirsec.aud index 5e7f7a170f..556d7e1746 100644 Binary files a/mods/ca/bits/audio/vmirsec.aud and b/mods/ca/bits/audio/vmirsec.aud differ diff --git a/mods/ca/bits/audio/vmirsed.aud b/mods/ca/bits/audio/vmirsed.aud index eb19065b12..981bf9e5d3 100644 Binary files a/mods/ca/bits/audio/vmirsed.aud and b/mods/ca/bits/audio/vmirsed.aud differ diff --git a/mods/ca/bits/audio/vmirsee.aud b/mods/ca/bits/audio/vmirsee.aud index e9243ddcb4..ac1e636372 100644 Binary files a/mods/ca/bits/audio/vmirsee.aud and b/mods/ca/bits/audio/vmirsee.aud differ diff --git a/mods/ca/bits/audio/vmirsef.aud b/mods/ca/bits/audio/vmirsef.aud index 23a582f466..ea16d3064d 100644 Binary files a/mods/ca/bits/audio/vmirsef.aud and b/mods/ca/bits/audio/vmirsef.aud differ diff --git a/mods/ca/bits/audio/vmsamatk1.aud b/mods/ca/bits/audio/vmsamatk1.aud new file mode 100644 index 0000000000..69adf32ff6 Binary files /dev/null and b/mods/ca/bits/audio/vmsamatk1.aud differ diff --git a/mods/ca/bits/audio/vmsamatk2.aud b/mods/ca/bits/audio/vmsamatk2.aud new file mode 100644 index 0000000000..d53e467d30 Binary files /dev/null and b/mods/ca/bits/audio/vmsamatk2.aud differ diff --git a/mods/ca/bits/audio/vmsamatk3.aud b/mods/ca/bits/audio/vmsamatk3.aud new file mode 100644 index 0000000000..09cbb2c380 Binary files /dev/null and b/mods/ca/bits/audio/vmsamatk3.aud differ diff --git a/mods/ca/bits/audio/vmsamatk4.aud b/mods/ca/bits/audio/vmsamatk4.aud new file mode 100644 index 0000000000..4ea425a97c Binary files /dev/null and b/mods/ca/bits/audio/vmsamatk4.aud differ diff --git a/mods/ca/bits/audio/vmsamatk5.aud b/mods/ca/bits/audio/vmsamatk5.aud new file mode 100644 index 0000000000..68e6cf0783 Binary files /dev/null and b/mods/ca/bits/audio/vmsamatk5.aud differ diff --git a/mods/ca/bits/audio/vmsammov1.aud b/mods/ca/bits/audio/vmsammov1.aud new file mode 100644 index 0000000000..84b2267c8d Binary files /dev/null and b/mods/ca/bits/audio/vmsammov1.aud differ diff --git a/mods/ca/bits/audio/vmsammov2.aud b/mods/ca/bits/audio/vmsammov2.aud new file mode 100644 index 0000000000..0adf92d70d Binary files /dev/null and b/mods/ca/bits/audio/vmsammov2.aud differ diff --git a/mods/ca/bits/audio/vmsammov3.aud b/mods/ca/bits/audio/vmsammov3.aud new file mode 100644 index 0000000000..05183647ff Binary files /dev/null and b/mods/ca/bits/audio/vmsammov3.aud differ diff --git a/mods/ca/bits/audio/vmsammov4.aud b/mods/ca/bits/audio/vmsammov4.aud new file mode 100644 index 0000000000..adee532e55 Binary files /dev/null and b/mods/ca/bits/audio/vmsammov4.aud differ diff --git a/mods/ca/bits/audio/vmsammov5.aud b/mods/ca/bits/audio/vmsammov5.aud new file mode 100644 index 0000000000..bc9221a76d Binary files /dev/null and b/mods/ca/bits/audio/vmsammov5.aud differ diff --git a/mods/ca/bits/audio/vmsamslt1.aud b/mods/ca/bits/audio/vmsamslt1.aud new file mode 100644 index 0000000000..3fe847fab2 Binary files /dev/null and b/mods/ca/bits/audio/vmsamslt1.aud differ diff --git a/mods/ca/bits/audio/vmsamslt2.aud b/mods/ca/bits/audio/vmsamslt2.aud new file mode 100644 index 0000000000..86b3336e31 Binary files /dev/null and b/mods/ca/bits/audio/vmsamslt2.aud differ diff --git a/mods/ca/bits/audio/vmsamslt3.aud b/mods/ca/bits/audio/vmsamslt3.aud new file mode 100644 index 0000000000..c5b9783a0a Binary files /dev/null and b/mods/ca/bits/audio/vmsamslt3.aud differ diff --git a/mods/ca/bits/audio/vmsamslt4.aud b/mods/ca/bits/audio/vmsamslt4.aud new file mode 100644 index 0000000000..0a30c34ddd Binary files /dev/null and b/mods/ca/bits/audio/vmsamslt4.aud differ diff --git a/mods/ca/bits/audio/vmsamslt5.aud b/mods/ca/bits/audio/vmsamslt5.aud new file mode 100644 index 0000000000..cc4f46c20c Binary files /dev/null and b/mods/ca/bits/audio/vmsamslt5.aud differ diff --git a/mods/ca/bits/audio/vmsamslt6.aud b/mods/ca/bits/audio/vmsamslt6.aud new file mode 100644 index 0000000000..c2bc90ff44 Binary files /dev/null and b/mods/ca/bits/audio/vmsamslt6.aud differ diff --git a/mods/ca/bits/audio/vmwtatk1.aud b/mods/ca/bits/audio/vmwtatk1.aud new file mode 100644 index 0000000000..38a9982096 Binary files /dev/null and b/mods/ca/bits/audio/vmwtatk1.aud differ diff --git a/mods/ca/bits/audio/vmwtatk2.aud b/mods/ca/bits/audio/vmwtatk2.aud new file mode 100644 index 0000000000..4ce3fc2cd0 Binary files /dev/null and b/mods/ca/bits/audio/vmwtatk2.aud differ diff --git a/mods/ca/bits/audio/vmwtatk3.aud b/mods/ca/bits/audio/vmwtatk3.aud new file mode 100644 index 0000000000..63c6ce4967 Binary files /dev/null and b/mods/ca/bits/audio/vmwtatk3.aud differ diff --git a/mods/ca/bits/audio/vmwtatk4.aud b/mods/ca/bits/audio/vmwtatk4.aud new file mode 100644 index 0000000000..3120985cc9 Binary files /dev/null and b/mods/ca/bits/audio/vmwtatk4.aud differ diff --git a/mods/ca/bits/audio/vmwtatk5.aud b/mods/ca/bits/audio/vmwtatk5.aud new file mode 100644 index 0000000000..c2a362b60f Binary files /dev/null and b/mods/ca/bits/audio/vmwtatk5.aud differ diff --git a/mods/ca/bits/audio/vmwtatk6.aud b/mods/ca/bits/audio/vmwtatk6.aud new file mode 100644 index 0000000000..ceab4ce2af Binary files /dev/null and b/mods/ca/bits/audio/vmwtatk6.aud differ diff --git a/mods/ca/bits/audio/vmwtmov1.aud b/mods/ca/bits/audio/vmwtmov1.aud new file mode 100644 index 0000000000..e2beda9d89 Binary files /dev/null and b/mods/ca/bits/audio/vmwtmov1.aud differ diff --git a/mods/ca/bits/audio/vmwtmov2.aud b/mods/ca/bits/audio/vmwtmov2.aud new file mode 100644 index 0000000000..47b5e5cdf4 Binary files /dev/null and b/mods/ca/bits/audio/vmwtmov2.aud differ diff --git a/mods/ca/bits/audio/vmwtmov3.aud b/mods/ca/bits/audio/vmwtmov3.aud new file mode 100644 index 0000000000..5398d2f43d Binary files /dev/null and b/mods/ca/bits/audio/vmwtmov3.aud differ diff --git a/mods/ca/bits/audio/vmwtmov4.aud b/mods/ca/bits/audio/vmwtmov4.aud new file mode 100644 index 0000000000..c3720071c1 Binary files /dev/null and b/mods/ca/bits/audio/vmwtmov4.aud differ diff --git a/mods/ca/bits/audio/vmwtmov5.aud b/mods/ca/bits/audio/vmwtmov5.aud new file mode 100644 index 0000000000..ce9ca3b61d Binary files /dev/null and b/mods/ca/bits/audio/vmwtmov5.aud differ diff --git a/mods/ca/bits/audio/vmwtmov6.aud b/mods/ca/bits/audio/vmwtmov6.aud new file mode 100644 index 0000000000..4712038b79 Binary files /dev/null and b/mods/ca/bits/audio/vmwtmov6.aud differ diff --git a/mods/ca/bits/audio/vmwtslt1.aud b/mods/ca/bits/audio/vmwtslt1.aud new file mode 100644 index 0000000000..bb2017f011 Binary files /dev/null and b/mods/ca/bits/audio/vmwtslt1.aud differ diff --git a/mods/ca/bits/audio/vmwtslt2.aud b/mods/ca/bits/audio/vmwtslt2.aud new file mode 100644 index 0000000000..833e4733cd Binary files /dev/null and b/mods/ca/bits/audio/vmwtslt2.aud differ diff --git a/mods/ca/bits/audio/vmwtslt3.aud b/mods/ca/bits/audio/vmwtslt3.aud new file mode 100644 index 0000000000..c9aeb7fc13 Binary files /dev/null and b/mods/ca/bits/audio/vmwtslt3.aud differ diff --git a/mods/ca/bits/audio/vmwtslt4.aud b/mods/ca/bits/audio/vmwtslt4.aud new file mode 100644 index 0000000000..b79914a5e8 Binary files /dev/null and b/mods/ca/bits/audio/vmwtslt4.aud differ diff --git a/mods/ca/bits/audio/vmwtslt5.aud b/mods/ca/bits/audio/vmwtslt5.aud new file mode 100644 index 0000000000..590cd8a46e Binary files /dev/null and b/mods/ca/bits/audio/vmwtslt5.aud differ diff --git a/mods/ca/bits/audio/vmwtupg1.aud b/mods/ca/bits/audio/vmwtupg1.aud new file mode 100644 index 0000000000..5767d66ce3 Binary files /dev/null and b/mods/ca/bits/audio/vmwtupg1.aud differ diff --git a/mods/ca/bits/audio/vnukcatk1.aud b/mods/ca/bits/audio/vnukcatk1.aud new file mode 100644 index 0000000000..3a8f3dd7db Binary files /dev/null and b/mods/ca/bits/audio/vnukcatk1.aud differ diff --git a/mods/ca/bits/audio/vnukcatk2.aud b/mods/ca/bits/audio/vnukcatk2.aud new file mode 100644 index 0000000000..3499f89fc2 Binary files /dev/null and b/mods/ca/bits/audio/vnukcatk2.aud differ diff --git a/mods/ca/bits/audio/vnukcatk3.aud b/mods/ca/bits/audio/vnukcatk3.aud new file mode 100644 index 0000000000..fb35a06a31 Binary files /dev/null and b/mods/ca/bits/audio/vnukcatk3.aud differ diff --git a/mods/ca/bits/audio/vnukcatk4.aud b/mods/ca/bits/audio/vnukcatk4.aud new file mode 100644 index 0000000000..62bb896a1c Binary files /dev/null and b/mods/ca/bits/audio/vnukcatk4.aud differ diff --git a/mods/ca/bits/audio/vnukcatk5.aud b/mods/ca/bits/audio/vnukcatk5.aud new file mode 100644 index 0000000000..1c2030d197 Binary files /dev/null and b/mods/ca/bits/audio/vnukcatk5.aud differ diff --git a/mods/ca/bits/audio/vnukcdep1.aud b/mods/ca/bits/audio/vnukcdep1.aud new file mode 100644 index 0000000000..4c67f9f187 Binary files /dev/null and b/mods/ca/bits/audio/vnukcdep1.aud differ diff --git a/mods/ca/bits/audio/vnukcdep2.aud b/mods/ca/bits/audio/vnukcdep2.aud new file mode 100644 index 0000000000..d3b1ebbf66 Binary files /dev/null and b/mods/ca/bits/audio/vnukcdep2.aud differ diff --git a/mods/ca/bits/audio/vnukcdep3.aud b/mods/ca/bits/audio/vnukcdep3.aud new file mode 100644 index 0000000000..dd84df94e6 Binary files /dev/null and b/mods/ca/bits/audio/vnukcdep3.aud differ diff --git a/mods/ca/bits/audio/vnukcmov1.aud b/mods/ca/bits/audio/vnukcmov1.aud new file mode 100644 index 0000000000..13603e8541 Binary files /dev/null and b/mods/ca/bits/audio/vnukcmov1.aud differ diff --git a/mods/ca/bits/audio/vnukcmov2.aud b/mods/ca/bits/audio/vnukcmov2.aud new file mode 100644 index 0000000000..ba360072f8 Binary files /dev/null and b/mods/ca/bits/audio/vnukcmov2.aud differ diff --git a/mods/ca/bits/audio/vnukcmov3.aud b/mods/ca/bits/audio/vnukcmov3.aud new file mode 100644 index 0000000000..afef5d5329 Binary files /dev/null and b/mods/ca/bits/audio/vnukcmov3.aud differ diff --git a/mods/ca/bits/audio/vnukcmov4.aud b/mods/ca/bits/audio/vnukcmov4.aud new file mode 100644 index 0000000000..fbea6732d7 Binary files /dev/null and b/mods/ca/bits/audio/vnukcmov4.aud differ diff --git a/mods/ca/bits/audio/vnukcmov5.aud b/mods/ca/bits/audio/vnukcmov5.aud new file mode 100644 index 0000000000..2bb21e4049 Binary files /dev/null and b/mods/ca/bits/audio/vnukcmov5.aud differ diff --git a/mods/ca/bits/audio/vnukcslt1.aud b/mods/ca/bits/audio/vnukcslt1.aud new file mode 100644 index 0000000000..42ae6a19c4 Binary files /dev/null and b/mods/ca/bits/audio/vnukcslt1.aud differ diff --git a/mods/ca/bits/audio/vnukcslt2.aud b/mods/ca/bits/audio/vnukcslt2.aud new file mode 100644 index 0000000000..140e0efd4c Binary files /dev/null and b/mods/ca/bits/audio/vnukcslt2.aud differ diff --git a/mods/ca/bits/audio/vnukcslt3.aud b/mods/ca/bits/audio/vnukcslt3.aud new file mode 100644 index 0000000000..471655f159 Binary files /dev/null and b/mods/ca/bits/audio/vnukcslt3.aud differ diff --git a/mods/ca/bits/audio/vnukcslt4.aud b/mods/ca/bits/audio/vnukcslt4.aud new file mode 100644 index 0000000000..dd182fb0e7 Binary files /dev/null and b/mods/ca/bits/audio/vnukcslt4.aud differ diff --git a/mods/ca/bits/audio/vnukcslt5.aud b/mods/ca/bits/audio/vnukcslt5.aud new file mode 100644 index 0000000000..a6c213e93d Binary files /dev/null and b/mods/ca/bits/audio/vnukcslt5.aud differ diff --git a/mods/ca/bits/audio/vnukcslt6.aud b/mods/ca/bits/audio/vnukcslt6.aud new file mode 100644 index 0000000000..8e58cc4a2a Binary files /dev/null and b/mods/ca/bits/audio/vnukcslt6.aud differ diff --git a/mods/ca/bits/audio/vnukcund1.aud b/mods/ca/bits/audio/vnukcund1.aud new file mode 100644 index 0000000000..9ad53278a0 Binary files /dev/null and b/mods/ca/bits/audio/vnukcund1.aud differ diff --git a/mods/ca/bits/audio/vnukcund2.aud b/mods/ca/bits/audio/vnukcund2.aud new file mode 100644 index 0000000000..f43b6d9717 Binary files /dev/null and b/mods/ca/bits/audio/vnukcund2.aud differ diff --git a/mods/ca/bits/audio/vnukcund3.aud b/mods/ca/bits/audio/vnukcund3.aud new file mode 100644 index 0000000000..0c7f5b4c08 Binary files /dev/null and b/mods/ca/bits/audio/vnukcund3.aud differ diff --git a/mods/ca/bits/audio/vnukde1a.aud b/mods/ca/bits/audio/vnukde1a.aud new file mode 100644 index 0000000000..6e871b6866 Binary files /dev/null and b/mods/ca/bits/audio/vnukde1a.aud differ diff --git a/mods/ca/bits/audio/vnukde2a.aud b/mods/ca/bits/audio/vnukde2a.aud new file mode 100644 index 0000000000..4c0bb6a5f6 Binary files /dev/null and b/mods/ca/bits/audio/vnukde2a.aud differ diff --git a/mods/ca/bits/audio/vnukweaa.aud b/mods/ca/bits/audio/vnukweaa.aud new file mode 100644 index 0000000000..0f3c48b1d6 Binary files /dev/null and b/mods/ca/bits/audio/vnukweaa.aud differ diff --git a/mods/ca/bits/audio/vosplana.aud b/mods/ca/bits/audio/vosplana.aud new file mode 100644 index 0000000000..9b03651a06 Binary files /dev/null and b/mods/ca/bits/audio/vosplana.aud differ diff --git a/mods/ca/bits/audio/vospstaa.aud b/mods/ca/bits/audio/vospstaa.aud new file mode 100644 index 0000000000..dd30c1a676 Binary files /dev/null and b/mods/ca/bits/audio/vospstaa.aud differ diff --git a/mods/ca/bits/audio/voveupgr.aud b/mods/ca/bits/audio/voveupgr.aud new file mode 100644 index 0000000000..8ebb1ed255 Binary files /dev/null and b/mods/ca/bits/audio/voveupgr.aud differ diff --git a/mods/ca/bits/audio/voveweaa.aud b/mods/ca/bits/audio/voveweaa.aud new file mode 100644 index 0000000000..1c97b5cb97 Binary files /dev/null and b/mods/ca/bits/audio/voveweaa.aud differ diff --git a/mods/ca/bits/audio/voveweab.aud b/mods/ca/bits/audio/voveweab.aud new file mode 100644 index 0000000000..ada1e83230 Binary files /dev/null and b/mods/ca/bits/audio/voveweab.aud differ diff --git a/mods/ca/bits/audio/voveweac.aud b/mods/ca/bits/audio/voveweac.aud new file mode 100644 index 0000000000..f8fd340b9a Binary files /dev/null and b/mods/ca/bits/audio/voveweac.aud differ diff --git a/mods/ca/bits/audio/vovldatk1.aud b/mods/ca/bits/audio/vovldatk1.aud new file mode 100644 index 0000000000..d26f442c50 Binary files /dev/null and b/mods/ca/bits/audio/vovldatk1.aud differ diff --git a/mods/ca/bits/audio/vovldatk2.aud b/mods/ca/bits/audio/vovldatk2.aud new file mode 100644 index 0000000000..e7740b7e51 Binary files /dev/null and b/mods/ca/bits/audio/vovldatk2.aud differ diff --git a/mods/ca/bits/audio/vovldatk3.aud b/mods/ca/bits/audio/vovldatk3.aud new file mode 100644 index 0000000000..5e092614fa Binary files /dev/null and b/mods/ca/bits/audio/vovldatk3.aud differ diff --git a/mods/ca/bits/audio/vovldatk4.aud b/mods/ca/bits/audio/vovldatk4.aud new file mode 100644 index 0000000000..eddb4358ee Binary files /dev/null and b/mods/ca/bits/audio/vovldatk4.aud differ diff --git a/mods/ca/bits/audio/vovldatk5.aud b/mods/ca/bits/audio/vovldatk5.aud new file mode 100644 index 0000000000..4274cd4448 Binary files /dev/null and b/mods/ca/bits/audio/vovldatk5.aud differ diff --git a/mods/ca/bits/audio/vovldatk6.aud b/mods/ca/bits/audio/vovldatk6.aud new file mode 100644 index 0000000000..1f90110a56 Binary files /dev/null and b/mods/ca/bits/audio/vovldatk6.aud differ diff --git a/mods/ca/bits/audio/vovldmov1.aud b/mods/ca/bits/audio/vovldmov1.aud new file mode 100644 index 0000000000..0183f6b9de Binary files /dev/null and b/mods/ca/bits/audio/vovldmov1.aud differ diff --git a/mods/ca/bits/audio/vovldmov2.aud b/mods/ca/bits/audio/vovldmov2.aud new file mode 100644 index 0000000000..910f8e8b4f Binary files /dev/null and b/mods/ca/bits/audio/vovldmov2.aud differ diff --git a/mods/ca/bits/audio/vovldmov3.aud b/mods/ca/bits/audio/vovldmov3.aud new file mode 100644 index 0000000000..42d220ce0e Binary files /dev/null and b/mods/ca/bits/audio/vovldmov3.aud differ diff --git a/mods/ca/bits/audio/vovldmov4.aud b/mods/ca/bits/audio/vovldmov4.aud new file mode 100644 index 0000000000..62092bbbc7 Binary files /dev/null and b/mods/ca/bits/audio/vovldmov4.aud differ diff --git a/mods/ca/bits/audio/vovldmov5.aud b/mods/ca/bits/audio/vovldmov5.aud new file mode 100644 index 0000000000..c3ac67a443 Binary files /dev/null and b/mods/ca/bits/audio/vovldmov5.aud differ diff --git a/mods/ca/bits/audio/vovldslt1.aud b/mods/ca/bits/audio/vovldslt1.aud new file mode 100644 index 0000000000..0e2fc423a9 Binary files /dev/null and b/mods/ca/bits/audio/vovldslt1.aud differ diff --git a/mods/ca/bits/audio/vovldslt2.aud b/mods/ca/bits/audio/vovldslt2.aud new file mode 100644 index 0000000000..ad8c6a9d60 Binary files /dev/null and b/mods/ca/bits/audio/vovldslt2.aud differ diff --git a/mods/ca/bits/audio/vovldslt3.aud b/mods/ca/bits/audio/vovldslt3.aud new file mode 100644 index 0000000000..38a8bc84a3 Binary files /dev/null and b/mods/ca/bits/audio/vovldslt3.aud differ diff --git a/mods/ca/bits/audio/vovldslt4.aud b/mods/ca/bits/audio/vovldslt4.aud new file mode 100644 index 0000000000..fc903563ed Binary files /dev/null and b/mods/ca/bits/audio/vovldslt4.aud differ diff --git a/mods/ca/bits/audio/vpcasea.aud b/mods/ca/bits/audio/vpcasea.aud new file mode 100644 index 0000000000..6a3ba3a6df Binary files /dev/null and b/mods/ca/bits/audio/vpcasea.aud differ diff --git a/mods/ca/bits/audio/vpeaat1.aud b/mods/ca/bits/audio/vpeaat1.aud new file mode 100644 index 0000000000..5946274bee Binary files /dev/null and b/mods/ca/bits/audio/vpeaat1.aud differ diff --git a/mods/ca/bits/audio/vpeaat2.aud b/mods/ca/bits/audio/vpeaat2.aud new file mode 100644 index 0000000000..b8bd9aa7eb Binary files /dev/null and b/mods/ca/bits/audio/vpeaat2.aud differ diff --git a/mods/ca/bits/audio/vpeaat3.aud b/mods/ca/bits/audio/vpeaat3.aud new file mode 100644 index 0000000000..dd2132fad1 Binary files /dev/null and b/mods/ca/bits/audio/vpeaat3.aud differ diff --git a/mods/ca/bits/audio/vpeaat4.aud b/mods/ca/bits/audio/vpeaat4.aud new file mode 100644 index 0000000000..9ff00d40d2 Binary files /dev/null and b/mods/ca/bits/audio/vpeaat4.aud differ diff --git a/mods/ca/bits/audio/vpeaat5.aud b/mods/ca/bits/audio/vpeaat5.aud new file mode 100644 index 0000000000..20af3ad760 Binary files /dev/null and b/mods/ca/bits/audio/vpeaat5.aud differ diff --git a/mods/ca/bits/audio/vpeamo1.aud b/mods/ca/bits/audio/vpeamo1.aud new file mode 100644 index 0000000000..23734f485f Binary files /dev/null and b/mods/ca/bits/audio/vpeamo1.aud differ diff --git a/mods/ca/bits/audio/vpeamo2.aud b/mods/ca/bits/audio/vpeamo2.aud new file mode 100644 index 0000000000..f38697f238 Binary files /dev/null and b/mods/ca/bits/audio/vpeamo2.aud differ diff --git a/mods/ca/bits/audio/vpeamo3.aud b/mods/ca/bits/audio/vpeamo3.aud new file mode 100644 index 0000000000..07b4f79838 Binary files /dev/null and b/mods/ca/bits/audio/vpeamo3.aud differ diff --git a/mods/ca/bits/audio/vpeamo4.aud b/mods/ca/bits/audio/vpeamo4.aud new file mode 100644 index 0000000000..e91b059cdd Binary files /dev/null and b/mods/ca/bits/audio/vpeamo4.aud differ diff --git a/mods/ca/bits/audio/vpeasl1.aud b/mods/ca/bits/audio/vpeasl1.aud new file mode 100644 index 0000000000..85a762a3d5 Binary files /dev/null and b/mods/ca/bits/audio/vpeasl1.aud differ diff --git a/mods/ca/bits/audio/vpeasl2.aud b/mods/ca/bits/audio/vpeasl2.aud new file mode 100644 index 0000000000..5eb365fff0 Binary files /dev/null and b/mods/ca/bits/audio/vpeasl2.aud differ diff --git a/mods/ca/bits/audio/vpeasl3.aud b/mods/ca/bits/audio/vpeasl3.aud new file mode 100644 index 0000000000..fc305f8f39 Binary files /dev/null and b/mods/ca/bits/audio/vpeasl3.aud differ diff --git a/mods/ca/bits/audio/vpeasl4.aud b/mods/ca/bits/audio/vpeasl4.aud new file mode 100644 index 0000000000..1f08c195ab Binary files /dev/null and b/mods/ca/bits/audio/vpeasl4.aud differ diff --git a/mods/ca/bits/audio/vpeasl5.aud b/mods/ca/bits/audio/vpeasl5.aud new file mode 100644 index 0000000000..0a3572e56a Binary files /dev/null and b/mods/ca/bits/audio/vpeasl5.aud differ diff --git a/mods/ca/bits/audio/vpitbatk1.aud b/mods/ca/bits/audio/vpitbatk1.aud new file mode 100644 index 0000000000..be5d7a1111 Binary files /dev/null and b/mods/ca/bits/audio/vpitbatk1.aud differ diff --git a/mods/ca/bits/audio/vpitbatk2.aud b/mods/ca/bits/audio/vpitbatk2.aud new file mode 100644 index 0000000000..fb6a4c41d0 Binary files /dev/null and b/mods/ca/bits/audio/vpitbatk2.aud differ diff --git a/mods/ca/bits/audio/vpitbatk3.aud b/mods/ca/bits/audio/vpitbatk3.aud new file mode 100644 index 0000000000..ead3feeab7 Binary files /dev/null and b/mods/ca/bits/audio/vpitbatk3.aud differ diff --git a/mods/ca/bits/audio/vpitbatk4.aud b/mods/ca/bits/audio/vpitbatk4.aud new file mode 100644 index 0000000000..cd46e5d186 Binary files /dev/null and b/mods/ca/bits/audio/vpitbatk4.aud differ diff --git a/mods/ca/bits/audio/vpitbatk5.aud b/mods/ca/bits/audio/vpitbatk5.aud new file mode 100644 index 0000000000..15d77f96bb Binary files /dev/null and b/mods/ca/bits/audio/vpitbatk5.aud differ diff --git a/mods/ca/bits/audio/vpitbmov1.aud b/mods/ca/bits/audio/vpitbmov1.aud new file mode 100644 index 0000000000..1afb50174c Binary files /dev/null and b/mods/ca/bits/audio/vpitbmov1.aud differ diff --git a/mods/ca/bits/audio/vpitbmov2.aud b/mods/ca/bits/audio/vpitbmov2.aud new file mode 100644 index 0000000000..53330c8025 Binary files /dev/null and b/mods/ca/bits/audio/vpitbmov2.aud differ diff --git a/mods/ca/bits/audio/vpitbmov3.aud b/mods/ca/bits/audio/vpitbmov3.aud new file mode 100644 index 0000000000..f9f113d7bd Binary files /dev/null and b/mods/ca/bits/audio/vpitbmov3.aud differ diff --git a/mods/ca/bits/audio/vpitbmov4.aud b/mods/ca/bits/audio/vpitbmov4.aud new file mode 100644 index 0000000000..bcc7bc1c80 Binary files /dev/null and b/mods/ca/bits/audio/vpitbmov4.aud differ diff --git a/mods/ca/bits/audio/vpitbmov5.aud b/mods/ca/bits/audio/vpitbmov5.aud new file mode 100644 index 0000000000..ae9862e7e3 Binary files /dev/null and b/mods/ca/bits/audio/vpitbmov5.aud differ diff --git a/mods/ca/bits/audio/vpitbmov6.aud b/mods/ca/bits/audio/vpitbmov6.aud new file mode 100644 index 0000000000..270f71300f Binary files /dev/null and b/mods/ca/bits/audio/vpitbmov6.aud differ diff --git a/mods/ca/bits/audio/vpitbslt1.aud b/mods/ca/bits/audio/vpitbslt1.aud new file mode 100644 index 0000000000..e983900ed3 Binary files /dev/null and b/mods/ca/bits/audio/vpitbslt1.aud differ diff --git a/mods/ca/bits/audio/vpitbslt2.aud b/mods/ca/bits/audio/vpitbslt2.aud new file mode 100644 index 0000000000..6819e0be9d Binary files /dev/null and b/mods/ca/bits/audio/vpitbslt2.aud differ diff --git a/mods/ca/bits/audio/vpitbslt3.aud b/mods/ca/bits/audio/vpitbslt3.aud new file mode 100644 index 0000000000..65c91d2cfb Binary files /dev/null and b/mods/ca/bits/audio/vpitbslt3.aud differ diff --git a/mods/ca/bits/audio/vpitbslt4.aud b/mods/ca/bits/audio/vpitbslt4.aud new file mode 100644 index 0000000000..34f608325d Binary files /dev/null and b/mods/ca/bits/audio/vpitbslt4.aud differ diff --git a/mods/ca/bits/audio/vpitbslt5.aud b/mods/ca/bits/audio/vpitbslt5.aud new file mode 100644 index 0000000000..451741c00b Binary files /dev/null and b/mods/ca/bits/audio/vpitbslt5.aud differ diff --git a/mods/ca/bits/audio/vpitbslt6.aud b/mods/ca/bits/audio/vpitbslt6.aud new file mode 100644 index 0000000000..8a0ab805a6 Binary files /dev/null and b/mods/ca/bits/audio/vpitbslt6.aud differ diff --git a/mods/ca/bits/audio/vrahat1.aud b/mods/ca/bits/audio/vrahat1.aud new file mode 100644 index 0000000000..0f2f1c6802 Binary files /dev/null and b/mods/ca/bits/audio/vrahat1.aud differ diff --git a/mods/ca/bits/audio/vrahat2.aud b/mods/ca/bits/audio/vrahat2.aud new file mode 100644 index 0000000000..178d693c96 Binary files /dev/null and b/mods/ca/bits/audio/vrahat2.aud differ diff --git a/mods/ca/bits/audio/vrahat3.aud b/mods/ca/bits/audio/vrahat3.aud new file mode 100644 index 0000000000..9f54eb2fc4 Binary files /dev/null and b/mods/ca/bits/audio/vrahat3.aud differ diff --git a/mods/ca/bits/audio/vrahat4.aud b/mods/ca/bits/audio/vrahat4.aud new file mode 100644 index 0000000000..363cc822d9 Binary files /dev/null and b/mods/ca/bits/audio/vrahat4.aud differ diff --git a/mods/ca/bits/audio/vrahat5.aud b/mods/ca/bits/audio/vrahat5.aud new file mode 100644 index 0000000000..1d020acb88 Binary files /dev/null and b/mods/ca/bits/audio/vrahat5.aud differ diff --git a/mods/ca/bits/audio/vrahat6.aud b/mods/ca/bits/audio/vrahat6.aud new file mode 100644 index 0000000000..07b9d96522 Binary files /dev/null and b/mods/ca/bits/audio/vrahat6.aud differ diff --git a/mods/ca/bits/audio/vrahmo1.aud b/mods/ca/bits/audio/vrahmo1.aud new file mode 100644 index 0000000000..273464e8b2 Binary files /dev/null and b/mods/ca/bits/audio/vrahmo1.aud differ diff --git a/mods/ca/bits/audio/vrahmo2.aud b/mods/ca/bits/audio/vrahmo2.aud new file mode 100644 index 0000000000..1471d37fc2 Binary files /dev/null and b/mods/ca/bits/audio/vrahmo2.aud differ diff --git a/mods/ca/bits/audio/vrahmo3.aud b/mods/ca/bits/audio/vrahmo3.aud new file mode 100644 index 0000000000..a70fc87be6 Binary files /dev/null and b/mods/ca/bits/audio/vrahmo3.aud differ diff --git a/mods/ca/bits/audio/vrahmo4.aud b/mods/ca/bits/audio/vrahmo4.aud new file mode 100644 index 0000000000..12a4057260 Binary files /dev/null and b/mods/ca/bits/audio/vrahmo4.aud differ diff --git a/mods/ca/bits/audio/vrahmo5.aud b/mods/ca/bits/audio/vrahmo5.aud new file mode 100644 index 0000000000..5b8fe5631a Binary files /dev/null and b/mods/ca/bits/audio/vrahmo5.aud differ diff --git a/mods/ca/bits/audio/vrahsl1.aud b/mods/ca/bits/audio/vrahsl1.aud new file mode 100644 index 0000000000..5d235facdc Binary files /dev/null and b/mods/ca/bits/audio/vrahsl1.aud differ diff --git a/mods/ca/bits/audio/vrahsl2.aud b/mods/ca/bits/audio/vrahsl2.aud new file mode 100644 index 0000000000..0e0206a27e Binary files /dev/null and b/mods/ca/bits/audio/vrahsl2.aud differ diff --git a/mods/ca/bits/audio/vrahsl3.aud b/mods/ca/bits/audio/vrahsl3.aud new file mode 100644 index 0000000000..b6384ca138 Binary files /dev/null and b/mods/ca/bits/audio/vrahsl3.aud differ diff --git a/mods/ca/bits/audio/vrahsl4.aud b/mods/ca/bits/audio/vrahsl4.aud new file mode 100644 index 0000000000..813ee837fd Binary files /dev/null and b/mods/ca/bits/audio/vrahsl4.aud differ diff --git a/mods/ca/bits/audio/vrahsl5.aud b/mods/ca/bits/audio/vrahsl5.aud new file mode 100644 index 0000000000..057e1ab4cf Binary files /dev/null and b/mods/ca/bits/audio/vrahsl5.aud differ diff --git a/mods/ca/bits/audio/vrapdiea.aud b/mods/ca/bits/audio/vrapdiea.aud new file mode 100644 index 0000000000..47c390d333 Binary files /dev/null and b/mods/ca/bits/audio/vrapdiea.aud differ diff --git a/mods/ca/bits/audio/vrapdieb.aud b/mods/ca/bits/audio/vrapdieb.aud new file mode 100644 index 0000000000..059bcfc000 Binary files /dev/null and b/mods/ca/bits/audio/vrapdieb.aud differ diff --git a/mods/ca/bits/audio/vrhiatta.aud b/mods/ca/bits/audio/vrhiatta.aud new file mode 100644 index 0000000000..b51c01a746 Binary files /dev/null and b/mods/ca/bits/audio/vrhiatta.aud differ diff --git a/mods/ca/bits/audio/vrhiattb.aud b/mods/ca/bits/audio/vrhiattb.aud new file mode 100644 index 0000000000..a9bab6e783 Binary files /dev/null and b/mods/ca/bits/audio/vrhiattb.aud differ diff --git a/mods/ca/bits/audio/vrhiattc.aud b/mods/ca/bits/audio/vrhiattc.aud new file mode 100644 index 0000000000..7d1d8d4cde Binary files /dev/null and b/mods/ca/bits/audio/vrhiattc.aud differ diff --git a/mods/ca/bits/audio/vrhiattd.aud b/mods/ca/bits/audio/vrhiattd.aud new file mode 100644 index 0000000000..7b82eea52f Binary files /dev/null and b/mods/ca/bits/audio/vrhiattd.aud differ diff --git a/mods/ca/bits/audio/vrobatca.aud b/mods/ca/bits/audio/vrobatca.aud index 53d422247e..1bd9ab9aea 100644 Binary files a/mods/ca/bits/audio/vrobatca.aud and b/mods/ca/bits/audio/vrobatca.aud differ diff --git a/mods/ca/bits/audio/vrobatcb.aud b/mods/ca/bits/audio/vrobatcb.aud new file mode 100644 index 0000000000..1545bf8af0 Binary files /dev/null and b/mods/ca/bits/audio/vrobatcb.aud differ diff --git a/mods/ca/bits/audio/vrobmova.aud b/mods/ca/bits/audio/vrobmova.aud index 4f130db93a..cbbfd715d7 100644 Binary files a/mods/ca/bits/audio/vrobmova.aud and b/mods/ca/bits/audio/vrobmova.aud differ diff --git a/mods/ca/bits/audio/vrobmovb.aud b/mods/ca/bits/audio/vrobmovb.aud index 4879bab5c4..fb98571927 100644 Binary files a/mods/ca/bits/audio/vrobmovb.aud and b/mods/ca/bits/audio/vrobmovb.aud differ diff --git a/mods/ca/bits/audio/vrobmovc.aud b/mods/ca/bits/audio/vrobmovc.aud new file mode 100644 index 0000000000..4188efbec5 Binary files /dev/null and b/mods/ca/bits/audio/vrobmovc.aud differ diff --git a/mods/ca/bits/audio/vrobsela.aud b/mods/ca/bits/audio/vrobsela.aud index 857f40fce1..a2e5f83cae 100644 Binary files a/mods/ca/bits/audio/vrobsela.aud and b/mods/ca/bits/audio/vrobsela.aud differ diff --git a/mods/ca/bits/audio/vrobselb.aud b/mods/ca/bits/audio/vrobselb.aud new file mode 100644 index 0000000000..0621865d8a Binary files /dev/null and b/mods/ca/bits/audio/vrobselb.aud differ diff --git a/mods/ca/bits/audio/vrocweaa.aud b/mods/ca/bits/audio/vrocweaa.aud new file mode 100644 index 0000000000..cf1bcc7975 Binary files /dev/null and b/mods/ca/bits/audio/vrocweaa.aud differ diff --git a/mods/ca/bits/audio/vrocweab.aud b/mods/ca/bits/audio/vrocweab.aud new file mode 100644 index 0000000000..9229c3efaa Binary files /dev/null and b/mods/ca/bits/audio/vrocweab.aud differ diff --git a/mods/ca/bits/audio/vsenmova.aud b/mods/ca/bits/audio/vsenmova.aud new file mode 100644 index 0000000000..a20cccd28b Binary files /dev/null and b/mods/ca/bits/audio/vsenmova.aud differ diff --git a/mods/ca/bits/audio/vsenmovb.aud b/mods/ca/bits/audio/vsenmovb.aud new file mode 100644 index 0000000000..32bce9cf82 Binary files /dev/null and b/mods/ca/bits/audio/vsenmovb.aud differ diff --git a/mods/ca/bits/audio/vsenmovc.aud b/mods/ca/bits/audio/vsenmovc.aud new file mode 100644 index 0000000000..583ce45a8b Binary files /dev/null and b/mods/ca/bits/audio/vsenmovc.aud differ diff --git a/mods/ca/bits/audio/vsensela.aud b/mods/ca/bits/audio/vsensela.aud new file mode 100644 index 0000000000..436ab4a7cb Binary files /dev/null and b/mods/ca/bits/audio/vsensela.aud differ diff --git a/mods/ca/bits/audio/vsenselb.aud b/mods/ca/bits/audio/vsenselb.aud new file mode 100644 index 0000000000..4383536bbc Binary files /dev/null and b/mods/ca/bits/audio/vsenselb.aud differ diff --git a/mods/ca/bits/audio/vsenselc.aud b/mods/ca/bits/audio/vsenselc.aud new file mode 100644 index 0000000000..611f1041f3 Binary files /dev/null and b/mods/ca/bits/audio/vsenselc.aud differ diff --git a/mods/ca/bits/audio/vsenseld.aud b/mods/ca/bits/audio/vsenseld.aud new file mode 100644 index 0000000000..0ad7df2316 Binary files /dev/null and b/mods/ca/bits/audio/vsenseld.aud differ diff --git a/mods/ca/bits/audio/vstnkatk1.aud b/mods/ca/bits/audio/vstnkatk1.aud new file mode 100644 index 0000000000..30b2ab98f9 Binary files /dev/null and b/mods/ca/bits/audio/vstnkatk1.aud differ diff --git a/mods/ca/bits/audio/vstnkatk2.aud b/mods/ca/bits/audio/vstnkatk2.aud new file mode 100644 index 0000000000..cb4c3a4071 Binary files /dev/null and b/mods/ca/bits/audio/vstnkatk2.aud differ diff --git a/mods/ca/bits/audio/vstnkatk3.aud b/mods/ca/bits/audio/vstnkatk3.aud new file mode 100644 index 0000000000..c9e35ff66c Binary files /dev/null and b/mods/ca/bits/audio/vstnkatk3.aud differ diff --git a/mods/ca/bits/audio/vstnkatk4.aud b/mods/ca/bits/audio/vstnkatk4.aud new file mode 100644 index 0000000000..cee3fdaf95 Binary files /dev/null and b/mods/ca/bits/audio/vstnkatk4.aud differ diff --git a/mods/ca/bits/audio/vstnkatk5.aud b/mods/ca/bits/audio/vstnkatk5.aud new file mode 100644 index 0000000000..ad0869f98b Binary files /dev/null and b/mods/ca/bits/audio/vstnkatk5.aud differ diff --git a/mods/ca/bits/audio/vstnkmov1.aud b/mods/ca/bits/audio/vstnkmov1.aud new file mode 100644 index 0000000000..3c04f9e9d9 Binary files /dev/null and b/mods/ca/bits/audio/vstnkmov1.aud differ diff --git a/mods/ca/bits/audio/vstnkmov2.aud b/mods/ca/bits/audio/vstnkmov2.aud new file mode 100644 index 0000000000..9bf8d49897 Binary files /dev/null and b/mods/ca/bits/audio/vstnkmov2.aud differ diff --git a/mods/ca/bits/audio/vstnkmov3.aud b/mods/ca/bits/audio/vstnkmov3.aud new file mode 100644 index 0000000000..4da1e17d4e Binary files /dev/null and b/mods/ca/bits/audio/vstnkmov3.aud differ diff --git a/mods/ca/bits/audio/vstnkmov4.aud b/mods/ca/bits/audio/vstnkmov4.aud new file mode 100644 index 0000000000..0a93e699aa Binary files /dev/null and b/mods/ca/bits/audio/vstnkmov4.aud differ diff --git a/mods/ca/bits/audio/vstnkmov5.aud b/mods/ca/bits/audio/vstnkmov5.aud new file mode 100644 index 0000000000..0314d09583 Binary files /dev/null and b/mods/ca/bits/audio/vstnkmov5.aud differ diff --git a/mods/ca/bits/audio/vstnkmov6.aud b/mods/ca/bits/audio/vstnkmov6.aud new file mode 100644 index 0000000000..6e376f17c9 Binary files /dev/null and b/mods/ca/bits/audio/vstnkmov6.aud differ diff --git a/mods/ca/bits/audio/vstnkmov7.aud b/mods/ca/bits/audio/vstnkmov7.aud new file mode 100644 index 0000000000..6f97a7a4c1 Binary files /dev/null and b/mods/ca/bits/audio/vstnkmov7.aud differ diff --git a/mods/ca/bits/audio/vstnkslt1.aud b/mods/ca/bits/audio/vstnkslt1.aud new file mode 100644 index 0000000000..2965a3f90b Binary files /dev/null and b/mods/ca/bits/audio/vstnkslt1.aud differ diff --git a/mods/ca/bits/audio/vstnkslt2.aud b/mods/ca/bits/audio/vstnkslt2.aud new file mode 100644 index 0000000000..3bcb2f7361 Binary files /dev/null and b/mods/ca/bits/audio/vstnkslt2.aud differ diff --git a/mods/ca/bits/audio/vstnkslt3.aud b/mods/ca/bits/audio/vstnkslt3.aud new file mode 100644 index 0000000000..9f2e290dd6 Binary files /dev/null and b/mods/ca/bits/audio/vstnkslt3.aud differ diff --git a/mods/ca/bits/audio/vstnkslt4.aud b/mods/ca/bits/audio/vstnkslt4.aud new file mode 100644 index 0000000000..8ab222ea15 Binary files /dev/null and b/mods/ca/bits/audio/vstnkslt4.aud differ diff --git a/mods/ca/bits/audio/vstnkslt5.aud b/mods/ca/bits/audio/vstnkslt5.aud new file mode 100644 index 0000000000..6de333229d Binary files /dev/null and b/mods/ca/bits/audio/vstnkslt5.aud differ diff --git a/mods/ca/bits/audio/vstnkslt6.aud b/mods/ca/bits/audio/vstnkslt6.aud new file mode 100644 index 0000000000..cc88de4571 Binary files /dev/null and b/mods/ca/bits/audio/vstnkslt6.aud differ diff --git a/mods/ca/bits/audio/vstnkslt7.aud b/mods/ca/bits/audio/vstnkslt7.aud new file mode 100644 index 0000000000..52ab0a81cf Binary files /dev/null and b/mods/ca/bits/audio/vstnkslt7.aud differ diff --git a/mods/ca/bits/audio/vsukat1.aud b/mods/ca/bits/audio/vsukat1.aud new file mode 100644 index 0000000000..9b73855389 Binary files /dev/null and b/mods/ca/bits/audio/vsukat1.aud differ diff --git a/mods/ca/bits/audio/vsukat2.aud b/mods/ca/bits/audio/vsukat2.aud new file mode 100644 index 0000000000..71cbdab717 Binary files /dev/null and b/mods/ca/bits/audio/vsukat2.aud differ diff --git a/mods/ca/bits/audio/vsukat3.aud b/mods/ca/bits/audio/vsukat3.aud new file mode 100644 index 0000000000..4287a922f0 Binary files /dev/null and b/mods/ca/bits/audio/vsukat3.aud differ diff --git a/mods/ca/bits/audio/vsukat4.aud b/mods/ca/bits/audio/vsukat4.aud new file mode 100644 index 0000000000..0101e7a267 Binary files /dev/null and b/mods/ca/bits/audio/vsukat4.aud differ diff --git a/mods/ca/bits/audio/vsukat5.aud b/mods/ca/bits/audio/vsukat5.aud new file mode 100644 index 0000000000..c03e1215c8 Binary files /dev/null and b/mods/ca/bits/audio/vsukat5.aud differ diff --git a/mods/ca/bits/audio/vsukmo1.aud b/mods/ca/bits/audio/vsukmo1.aud new file mode 100644 index 0000000000..5f283b6d73 Binary files /dev/null and b/mods/ca/bits/audio/vsukmo1.aud differ diff --git a/mods/ca/bits/audio/vsukmo2.aud b/mods/ca/bits/audio/vsukmo2.aud new file mode 100644 index 0000000000..0dae6f030e Binary files /dev/null and b/mods/ca/bits/audio/vsukmo2.aud differ diff --git a/mods/ca/bits/audio/vsukmo3.aud b/mods/ca/bits/audio/vsukmo3.aud new file mode 100644 index 0000000000..6fc11936ea Binary files /dev/null and b/mods/ca/bits/audio/vsukmo3.aud differ diff --git a/mods/ca/bits/audio/vsukmo4.aud b/mods/ca/bits/audio/vsukmo4.aud new file mode 100644 index 0000000000..289f53a180 Binary files /dev/null and b/mods/ca/bits/audio/vsukmo4.aud differ diff --git a/mods/ca/bits/audio/vsukmo5.aud b/mods/ca/bits/audio/vsukmo5.aud new file mode 100644 index 0000000000..96b301d5b1 Binary files /dev/null and b/mods/ca/bits/audio/vsukmo5.aud differ diff --git a/mods/ca/bits/audio/vsuksl1.aud b/mods/ca/bits/audio/vsuksl1.aud new file mode 100644 index 0000000000..73b99160e7 Binary files /dev/null and b/mods/ca/bits/audio/vsuksl1.aud differ diff --git a/mods/ca/bits/audio/vsuksl2.aud b/mods/ca/bits/audio/vsuksl2.aud new file mode 100644 index 0000000000..a0700c029a Binary files /dev/null and b/mods/ca/bits/audio/vsuksl2.aud differ diff --git a/mods/ca/bits/audio/vsuksl3.aud b/mods/ca/bits/audio/vsuksl3.aud new file mode 100644 index 0000000000..6254a61297 Binary files /dev/null and b/mods/ca/bits/audio/vsuksl3.aud differ diff --git a/mods/ca/bits/audio/vsuksl4.aud b/mods/ca/bits/audio/vsuksl4.aud new file mode 100644 index 0000000000..546feb9b44 Binary files /dev/null and b/mods/ca/bits/audio/vsuksl4.aud differ diff --git a/mods/ca/bits/audio/vsuksl5.aud b/mods/ca/bits/audio/vsuksl5.aud new file mode 100644 index 0000000000..008822205c Binary files /dev/null and b/mods/ca/bits/audio/vsuksl5.aud differ diff --git a/mods/ca/bits/audio/vsukupg1.aud b/mods/ca/bits/audio/vsukupg1.aud new file mode 100644 index 0000000000..51e73ee9e3 Binary files /dev/null and b/mods/ca/bits/audio/vsukupg1.aud differ diff --git a/mods/ca/bits/audio/vtibcupg1.aud b/mods/ca/bits/audio/vtibcupg1.aud new file mode 100644 index 0000000000..fcdaeec501 Binary files /dev/null and b/mods/ca/bits/audio/vtibcupg1.aud differ diff --git a/mods/ca/bits/audio/vtitatk1.aud b/mods/ca/bits/audio/vtitatk1.aud new file mode 100644 index 0000000000..6ef60e080c Binary files /dev/null and b/mods/ca/bits/audio/vtitatk1.aud differ diff --git a/mods/ca/bits/audio/vtitatk2.aud b/mods/ca/bits/audio/vtitatk2.aud new file mode 100644 index 0000000000..29473ba635 Binary files /dev/null and b/mods/ca/bits/audio/vtitatk2.aud differ diff --git a/mods/ca/bits/audio/vtitatk3.aud b/mods/ca/bits/audio/vtitatk3.aud new file mode 100644 index 0000000000..48c83bba66 Binary files /dev/null and b/mods/ca/bits/audio/vtitatk3.aud differ diff --git a/mods/ca/bits/audio/vtitatk4.aud b/mods/ca/bits/audio/vtitatk4.aud new file mode 100644 index 0000000000..2b64d02a03 Binary files /dev/null and b/mods/ca/bits/audio/vtitatk4.aud differ diff --git a/mods/ca/bits/audio/vtitatk5.aud b/mods/ca/bits/audio/vtitatk5.aud new file mode 100644 index 0000000000..1108dfc3b8 Binary files /dev/null and b/mods/ca/bits/audio/vtitatk5.aud differ diff --git a/mods/ca/bits/audio/vtitatk6.aud b/mods/ca/bits/audio/vtitatk6.aud new file mode 100644 index 0000000000..5fca82ad0b Binary files /dev/null and b/mods/ca/bits/audio/vtitatk6.aud differ diff --git a/mods/ca/bits/audio/vtitmov1.aud b/mods/ca/bits/audio/vtitmov1.aud new file mode 100644 index 0000000000..8e23455e45 Binary files /dev/null and b/mods/ca/bits/audio/vtitmov1.aud differ diff --git a/mods/ca/bits/audio/vtitmov2.aud b/mods/ca/bits/audio/vtitmov2.aud new file mode 100644 index 0000000000..b5e47d2838 Binary files /dev/null and b/mods/ca/bits/audio/vtitmov2.aud differ diff --git a/mods/ca/bits/audio/vtitmov3.aud b/mods/ca/bits/audio/vtitmov3.aud new file mode 100644 index 0000000000..06fb9a29bc Binary files /dev/null and b/mods/ca/bits/audio/vtitmov3.aud differ diff --git a/mods/ca/bits/audio/vtitmov4.aud b/mods/ca/bits/audio/vtitmov4.aud new file mode 100644 index 0000000000..1d49f36107 Binary files /dev/null and b/mods/ca/bits/audio/vtitmov4.aud differ diff --git a/mods/ca/bits/audio/vtitmov5.aud b/mods/ca/bits/audio/vtitmov5.aud new file mode 100644 index 0000000000..3e0e1d4680 Binary files /dev/null and b/mods/ca/bits/audio/vtitmov5.aud differ diff --git a/mods/ca/bits/audio/vtitslt1.aud b/mods/ca/bits/audio/vtitslt1.aud new file mode 100644 index 0000000000..8b39cf5082 Binary files /dev/null and b/mods/ca/bits/audio/vtitslt1.aud differ diff --git a/mods/ca/bits/audio/vtitslt2.aud b/mods/ca/bits/audio/vtitslt2.aud new file mode 100644 index 0000000000..162608c94a Binary files /dev/null and b/mods/ca/bits/audio/vtitslt2.aud differ diff --git a/mods/ca/bits/audio/vtitslt3.aud b/mods/ca/bits/audio/vtitslt3.aud new file mode 100644 index 0000000000..ab596e9a31 Binary files /dev/null and b/mods/ca/bits/audio/vtitslt3.aud differ diff --git a/mods/ca/bits/audio/vtitslt4.aud b/mods/ca/bits/audio/vtitslt4.aud new file mode 100644 index 0000000000..a0b531093a Binary files /dev/null and b/mods/ca/bits/audio/vtitslt4.aud differ diff --git a/mods/ca/bits/audio/vtitslt5.aud b/mods/ca/bits/audio/vtitslt5.aud new file mode 100644 index 0000000000..2f0feb7dd4 Binary files /dev/null and b/mods/ca/bits/audio/vtitslt5.aud differ diff --git a/mods/ca/bits/audio/vtitslt6.aud b/mods/ca/bits/audio/vtitslt6.aud new file mode 100644 index 0000000000..f5ee251efb Binary files /dev/null and b/mods/ca/bits/audio/vtitslt6.aud differ diff --git a/mods/ca/bits/audio/vtitupg1.aud b/mods/ca/bits/audio/vtitupg1.aud new file mode 100644 index 0000000000..5fd8f953ee Binary files /dev/null and b/mods/ca/bits/audio/vtitupg1.aud differ diff --git a/mods/ca/bits/audio/vtomata.aud b/mods/ca/bits/audio/vtomata.aud new file mode 100644 index 0000000000..a1c48f76b2 Binary files /dev/null and b/mods/ca/bits/audio/vtomata.aud differ diff --git a/mods/ca/bits/audio/vtomatb.aud b/mods/ca/bits/audio/vtomatb.aud new file mode 100644 index 0000000000..1051720964 Binary files /dev/null and b/mods/ca/bits/audio/vtomatb.aud differ diff --git a/mods/ca/bits/audio/vtomatc.aud b/mods/ca/bits/audio/vtomatc.aud new file mode 100644 index 0000000000..6d663e2c96 Binary files /dev/null and b/mods/ca/bits/audio/vtomatc.aud differ diff --git a/mods/ca/bits/audio/vtomatd.aud b/mods/ca/bits/audio/vtomatd.aud new file mode 100644 index 0000000000..e37ec1d130 Binary files /dev/null and b/mods/ca/bits/audio/vtomatd.aud differ diff --git a/mods/ca/bits/audio/vtomate.aud b/mods/ca/bits/audio/vtomate.aud new file mode 100644 index 0000000000..dcfd43c345 Binary files /dev/null and b/mods/ca/bits/audio/vtomate.aud differ diff --git a/mods/ca/bits/audio/vtomatf.aud b/mods/ca/bits/audio/vtomatf.aud new file mode 100644 index 0000000000..d97ac73821 Binary files /dev/null and b/mods/ca/bits/audio/vtomatf.aud differ diff --git a/mods/ca/bits/audio/vtommoa.aud b/mods/ca/bits/audio/vtommoa.aud new file mode 100644 index 0000000000..b37ea353b3 Binary files /dev/null and b/mods/ca/bits/audio/vtommoa.aud differ diff --git a/mods/ca/bits/audio/vtommob.aud b/mods/ca/bits/audio/vtommob.aud new file mode 100644 index 0000000000..e8c8d2d0c5 Binary files /dev/null and b/mods/ca/bits/audio/vtommob.aud differ diff --git a/mods/ca/bits/audio/vtommoc.aud b/mods/ca/bits/audio/vtommoc.aud new file mode 100644 index 0000000000..ae9a5759cd Binary files /dev/null and b/mods/ca/bits/audio/vtommoc.aud differ diff --git a/mods/ca/bits/audio/vtommod.aud b/mods/ca/bits/audio/vtommod.aud new file mode 100644 index 0000000000..c2cb271207 Binary files /dev/null and b/mods/ca/bits/audio/vtommod.aud differ diff --git a/mods/ca/bits/audio/vtommoe.aud b/mods/ca/bits/audio/vtommoe.aud new file mode 100644 index 0000000000..3ff1a1601b Binary files /dev/null and b/mods/ca/bits/audio/vtommoe.aud differ diff --git a/mods/ca/bits/audio/vtomsea.aud b/mods/ca/bits/audio/vtomsea.aud new file mode 100644 index 0000000000..344e0cff70 Binary files /dev/null and b/mods/ca/bits/audio/vtomsea.aud differ diff --git a/mods/ca/bits/audio/vtomseb.aud b/mods/ca/bits/audio/vtomseb.aud new file mode 100644 index 0000000000..4b908c97fa Binary files /dev/null and b/mods/ca/bits/audio/vtomseb.aud differ diff --git a/mods/ca/bits/audio/vtomsec.aud b/mods/ca/bits/audio/vtomsec.aud new file mode 100644 index 0000000000..a9083b74ce Binary files /dev/null and b/mods/ca/bits/audio/vtomsec.aud differ diff --git a/mods/ca/bits/audio/vtomsed.aud b/mods/ca/bits/audio/vtomsed.aud new file mode 100644 index 0000000000..82452bc053 Binary files /dev/null and b/mods/ca/bits/audio/vtomsed.aud differ diff --git a/mods/ca/bits/audio/vtomsee.aud b/mods/ca/bits/audio/vtomsee.aud new file mode 100644 index 0000000000..ffc8f35ba1 Binary files /dev/null and b/mods/ca/bits/audio/vtomsee.aud differ diff --git a/mods/ca/bits/audio/vtomsef.aud b/mods/ca/bits/audio/vtomsef.aud new file mode 100644 index 0000000000..cbc0b13c33 Binary files /dev/null and b/mods/ca/bits/audio/vtomsef.aud differ diff --git a/mods/ca/bits/audio/vtrpcmov1.aud b/mods/ca/bits/audio/vtrpcmov1.aud new file mode 100644 index 0000000000..ca4e4f9a9c Binary files /dev/null and b/mods/ca/bits/audio/vtrpcmov1.aud differ diff --git a/mods/ca/bits/audio/vtrpcmov2.aud b/mods/ca/bits/audio/vtrpcmov2.aud new file mode 100644 index 0000000000..cf2750a7e0 Binary files /dev/null and b/mods/ca/bits/audio/vtrpcmov2.aud differ diff --git a/mods/ca/bits/audio/vtrpcmov3.aud b/mods/ca/bits/audio/vtrpcmov3.aud new file mode 100644 index 0000000000..5341dfd3d0 Binary files /dev/null and b/mods/ca/bits/audio/vtrpcmov3.aud differ diff --git a/mods/ca/bits/audio/vtrpcmov4.aud b/mods/ca/bits/audio/vtrpcmov4.aud new file mode 100644 index 0000000000..4043dcca5d Binary files /dev/null and b/mods/ca/bits/audio/vtrpcmov4.aud differ diff --git a/mods/ca/bits/audio/vtrpcmov5.aud b/mods/ca/bits/audio/vtrpcmov5.aud new file mode 100644 index 0000000000..82e968b962 Binary files /dev/null and b/mods/ca/bits/audio/vtrpcmov5.aud differ diff --git a/mods/ca/bits/audio/vtrpcslt1.aud b/mods/ca/bits/audio/vtrpcslt1.aud new file mode 100644 index 0000000000..9c8c0751de Binary files /dev/null and b/mods/ca/bits/audio/vtrpcslt1.aud differ diff --git a/mods/ca/bits/audio/vtrpcslt2.aud b/mods/ca/bits/audio/vtrpcslt2.aud new file mode 100644 index 0000000000..afc4c6d015 Binary files /dev/null and b/mods/ca/bits/audio/vtrpcslt2.aud differ diff --git a/mods/ca/bits/audio/vtrpcslt3.aud b/mods/ca/bits/audio/vtrpcslt3.aud new file mode 100644 index 0000000000..75f91755e1 Binary files /dev/null and b/mods/ca/bits/audio/vtrpcslt3.aud differ diff --git a/mods/ca/bits/audio/vtrpcslt4.aud b/mods/ca/bits/audio/vtrpcslt4.aud new file mode 100644 index 0000000000..cecd1d5e78 Binary files /dev/null and b/mods/ca/bits/audio/vtrpcslt4.aud differ diff --git a/mods/ca/bits/audio/vtrpcunl1.aud b/mods/ca/bits/audio/vtrpcunl1.aud new file mode 100644 index 0000000000..386bee2086 Binary files /dev/null and b/mods/ca/bits/audio/vtrpcunl1.aud differ diff --git a/mods/ca/bits/audio/vvullo1a.aud b/mods/ca/bits/audio/vvullo1a.aud new file mode 100644 index 0000000000..16528c96b7 Binary files /dev/null and b/mods/ca/bits/audio/vvullo1a.aud differ diff --git a/mods/ca/bits/audio/vvullo2a.aud b/mods/ca/bits/audio/vvullo2a.aud new file mode 100644 index 0000000000..c121915830 Binary files /dev/null and b/mods/ca/bits/audio/vvullo2a.aud differ diff --git a/mods/ca/bits/audio/vvullo2b.aud b/mods/ca/bits/audio/vvullo2b.aud new file mode 100644 index 0000000000..2c3b4c0506 Binary files /dev/null and b/mods/ca/bits/audio/vvullo2b.aud differ diff --git a/mods/ca/bits/audio/vvullo2c.aud b/mods/ca/bits/audio/vvullo2c.aud new file mode 100644 index 0000000000..f22bdac84f Binary files /dev/null and b/mods/ca/bits/audio/vvullo2c.aud differ diff --git a/mods/ca/bits/audio/vvullo3a.aud b/mods/ca/bits/audio/vvullo3a.aud new file mode 100644 index 0000000000..4258de439b Binary files /dev/null and b/mods/ca/bits/audio/vvullo3a.aud differ diff --git a/mods/ca/bits/audio/vvullo4a.aud b/mods/ca/bits/audio/vvullo4a.aud new file mode 100644 index 0000000000..9a5394b998 Binary files /dev/null and b/mods/ca/bits/audio/vvullo4a.aud differ diff --git a/mods/ca/bits/audio/vvullo5a.aud b/mods/ca/bits/audio/vvullo5a.aud new file mode 100644 index 0000000000..5a2d314bec Binary files /dev/null and b/mods/ca/bits/audio/vvullo5a.aud differ diff --git a/mods/ca/bits/audio/vvullo5b.aud b/mods/ca/bits/audio/vvullo5b.aud new file mode 100644 index 0000000000..e72fd594de Binary files /dev/null and b/mods/ca/bits/audio/vvullo5b.aud differ diff --git a/mods/ca/bits/audio/vvullo6a.aud b/mods/ca/bits/audio/vvullo6a.aud new file mode 100644 index 0000000000..d5d762e15a Binary files /dev/null and b/mods/ca/bits/audio/vvullo6a.aud differ diff --git a/mods/ca/bits/audio/vvullo7a.aud b/mods/ca/bits/audio/vvullo7a.aud new file mode 100644 index 0000000000..5d2bd13aab Binary files /dev/null and b/mods/ca/bits/audio/vvullo7a.aud differ diff --git a/mods/ca/bits/audio/vvullo8a.aud b/mods/ca/bits/audio/vvullo8a.aud new file mode 100644 index 0000000000..ccdf274b9f Binary files /dev/null and b/mods/ca/bits/audio/vvullo8a.aud differ diff --git a/mods/ca/bits/audio/vvullo8b.aud b/mods/ca/bits/audio/vvullo8b.aud new file mode 100644 index 0000000000..4d0e82e585 Binary files /dev/null and b/mods/ca/bits/audio/vvullo8b.aud differ diff --git a/mods/ca/bits/audio/vvullo9a.aud b/mods/ca/bits/audio/vvullo9a.aud new file mode 100644 index 0000000000..e4a2651705 Binary files /dev/null and b/mods/ca/bits/audio/vvullo9a.aud differ diff --git a/mods/ca/bits/audio/vxoatk1.aud b/mods/ca/bits/audio/vxoatk1.aud new file mode 100644 index 0000000000..561c08d24e Binary files /dev/null and b/mods/ca/bits/audio/vxoatk1.aud differ diff --git a/mods/ca/bits/audio/vxoatk2.aud b/mods/ca/bits/audio/vxoatk2.aud new file mode 100644 index 0000000000..ef881f18e6 Binary files /dev/null and b/mods/ca/bits/audio/vxoatk2.aud differ diff --git a/mods/ca/bits/audio/vxoatk3.aud b/mods/ca/bits/audio/vxoatk3.aud new file mode 100644 index 0000000000..f15eba1121 Binary files /dev/null and b/mods/ca/bits/audio/vxoatk3.aud differ diff --git a/mods/ca/bits/audio/vxoatk4.aud b/mods/ca/bits/audio/vxoatk4.aud new file mode 100644 index 0000000000..c74e1fd7a6 Binary files /dev/null and b/mods/ca/bits/audio/vxoatk4.aud differ diff --git a/mods/ca/bits/audio/vxoatk5.aud b/mods/ca/bits/audio/vxoatk5.aud new file mode 100644 index 0000000000..f632ee03c8 Binary files /dev/null and b/mods/ca/bits/audio/vxoatk5.aud differ diff --git a/mods/ca/bits/audio/vxomov1.aud b/mods/ca/bits/audio/vxomov1.aud new file mode 100644 index 0000000000..7003f02476 Binary files /dev/null and b/mods/ca/bits/audio/vxomov1.aud differ diff --git a/mods/ca/bits/audio/vxomov2.aud b/mods/ca/bits/audio/vxomov2.aud new file mode 100644 index 0000000000..54c910581f Binary files /dev/null and b/mods/ca/bits/audio/vxomov2.aud differ diff --git a/mods/ca/bits/audio/vxomov3.aud b/mods/ca/bits/audio/vxomov3.aud new file mode 100644 index 0000000000..1ea29a3c32 Binary files /dev/null and b/mods/ca/bits/audio/vxomov3.aud differ diff --git a/mods/ca/bits/audio/vxomov4.aud b/mods/ca/bits/audio/vxomov4.aud new file mode 100644 index 0000000000..d5d14e05a6 Binary files /dev/null and b/mods/ca/bits/audio/vxomov4.aud differ diff --git a/mods/ca/bits/audio/vxomov5.aud b/mods/ca/bits/audio/vxomov5.aud new file mode 100644 index 0000000000..3b9db849a6 Binary files /dev/null and b/mods/ca/bits/audio/vxomov5.aud differ diff --git a/mods/ca/bits/audio/vxomov6.aud b/mods/ca/bits/audio/vxomov6.aud new file mode 100644 index 0000000000..3695063cf2 Binary files /dev/null and b/mods/ca/bits/audio/vxomov6.aud differ diff --git a/mods/ca/bits/audio/vxoslt1.aud b/mods/ca/bits/audio/vxoslt1.aud new file mode 100644 index 0000000000..4b3e6d45c0 Binary files /dev/null and b/mods/ca/bits/audio/vxoslt1.aud differ diff --git a/mods/ca/bits/audio/vxoslt2.aud b/mods/ca/bits/audio/vxoslt2.aud new file mode 100644 index 0000000000..2a41fe5101 Binary files /dev/null and b/mods/ca/bits/audio/vxoslt2.aud differ diff --git a/mods/ca/bits/audio/vxoslt3.aud b/mods/ca/bits/audio/vxoslt3.aud new file mode 100644 index 0000000000..6416fdcdf6 Binary files /dev/null and b/mods/ca/bits/audio/vxoslt3.aud differ diff --git a/mods/ca/bits/audio/vxoslt4.aud b/mods/ca/bits/audio/vxoslt4.aud new file mode 100644 index 0000000000..c6f9043c73 Binary files /dev/null and b/mods/ca/bits/audio/vxoslt4.aud differ diff --git a/mods/ca/bits/audio/vxoslt5.aud b/mods/ca/bits/audio/vxoslt5.aud new file mode 100644 index 0000000000..d0ca1abb10 Binary files /dev/null and b/mods/ca/bits/audio/vxoslt5.aud differ diff --git a/mods/ca/bits/audio/wolv-attack1.aud b/mods/ca/bits/audio/wolv-attack1.aud new file mode 100644 index 0000000000..e4845dca93 Binary files /dev/null and b/mods/ca/bits/audio/wolv-attack1.aud differ diff --git a/mods/ca/bits/audio/wolv-attack2.aud b/mods/ca/bits/audio/wolv-attack2.aud new file mode 100644 index 0000000000..595bbb4f8d Binary files /dev/null and b/mods/ca/bits/audio/wolv-attack2.aud differ diff --git a/mods/ca/bits/audio/wolv-attack3.aud b/mods/ca/bits/audio/wolv-attack3.aud new file mode 100644 index 0000000000..50b4efe677 Binary files /dev/null and b/mods/ca/bits/audio/wolv-attack3.aud differ diff --git a/mods/ca/bits/audio/wolv-attack4.aud b/mods/ca/bits/audio/wolv-attack4.aud new file mode 100644 index 0000000000..c0eabf585e Binary files /dev/null and b/mods/ca/bits/audio/wolv-attack4.aud differ diff --git a/mods/ca/bits/audio/wolv-fire1.aud b/mods/ca/bits/audio/wolv-fire1.aud new file mode 100644 index 0000000000..b68766216b Binary files /dev/null and b/mods/ca/bits/audio/wolv-fire1.aud differ diff --git a/mods/ca/bits/audio/wolv-fire2.aud b/mods/ca/bits/audio/wolv-fire2.aud new file mode 100644 index 0000000000..8664b7cf3b Binary files /dev/null and b/mods/ca/bits/audio/wolv-fire2.aud differ diff --git a/mods/ca/bits/audio/wolv-move1.aud b/mods/ca/bits/audio/wolv-move1.aud new file mode 100644 index 0000000000..d61b579374 Binary files /dev/null and b/mods/ca/bits/audio/wolv-move1.aud differ diff --git a/mods/ca/bits/audio/wolv-move2.aud b/mods/ca/bits/audio/wolv-move2.aud new file mode 100644 index 0000000000..a4048e8646 Binary files /dev/null and b/mods/ca/bits/audio/wolv-move2.aud differ diff --git a/mods/ca/bits/audio/wolv-move3.aud b/mods/ca/bits/audio/wolv-move3.aud new file mode 100644 index 0000000000..27054db06f Binary files /dev/null and b/mods/ca/bits/audio/wolv-move3.aud differ diff --git a/mods/ca/bits/audio/wolv-move4.aud b/mods/ca/bits/audio/wolv-move4.aud new file mode 100644 index 0000000000..33e9c37e13 Binary files /dev/null and b/mods/ca/bits/audio/wolv-move4.aud differ diff --git a/mods/ca/bits/audio/wolv-select1.aud b/mods/ca/bits/audio/wolv-select1.aud new file mode 100644 index 0000000000..49643b7d3a Binary files /dev/null and b/mods/ca/bits/audio/wolv-select1.aud differ diff --git a/mods/ca/bits/audio/wolv-select2.aud b/mods/ca/bits/audio/wolv-select2.aud new file mode 100644 index 0000000000..8c28b9000d Binary files /dev/null and b/mods/ca/bits/audio/wolv-select2.aud differ diff --git a/mods/ca/bits/audio/wolv-select3.aud b/mods/ca/bits/audio/wolv-select3.aud new file mode 100644 index 0000000000..e3124b1e7b Binary files /dev/null and b/mods/ca/bits/audio/wolv-select3.aud differ diff --git a/mods/ca/bits/audio/wolv-select4.aud b/mods/ca/bits/audio/wolv-select4.aud new file mode 100644 index 0000000000..3dfd761c93 Binary files /dev/null and b/mods/ca/bits/audio/wolv-select4.aud differ diff --git a/mods/ca/bits/audio/xo-coil1.aud b/mods/ca/bits/audio/xo-coil1.aud new file mode 100644 index 0000000000..7f9795f56f Binary files /dev/null and b/mods/ca/bits/audio/xo-coil1.aud differ diff --git a/mods/ca/bits/audio/xo-jump1.aud b/mods/ca/bits/audio/xo-jump1.aud new file mode 100644 index 0000000000..1a54f7de00 Binary files /dev/null and b/mods/ca/bits/audio/xo-jump1.aud differ diff --git a/mods/ca/bits/audio/xo-land1.aud b/mods/ca/bits/audio/xo-land1.aud new file mode 100644 index 0000000000..d41124423a Binary files /dev/null and b/mods/ca/bits/audio/xo-land1.aud differ diff --git a/mods/ca/bits/audio/ytnkatk1.aud b/mods/ca/bits/audio/ytnkatk1.aud new file mode 100644 index 0000000000..9e35102a7b Binary files /dev/null and b/mods/ca/bits/audio/ytnkatk1.aud differ diff --git a/mods/ca/bits/audio/ytnkatk2.aud b/mods/ca/bits/audio/ytnkatk2.aud new file mode 100644 index 0000000000..a8ed97d13d Binary files /dev/null and b/mods/ca/bits/audio/ytnkatk2.aud differ diff --git a/mods/ca/bits/audio/ytnkatk3.aud b/mods/ca/bits/audio/ytnkatk3.aud new file mode 100644 index 0000000000..c812a6e85d Binary files /dev/null and b/mods/ca/bits/audio/ytnkatk3.aud differ diff --git a/mods/ca/bits/audio/ytnkatk4.aud b/mods/ca/bits/audio/ytnkatk4.aud new file mode 100644 index 0000000000..ae8ada034a Binary files /dev/null and b/mods/ca/bits/audio/ytnkatk4.aud differ diff --git a/mods/ca/bits/audio/ytnkatk5.aud b/mods/ca/bits/audio/ytnkatk5.aud new file mode 100644 index 0000000000..65c0ed081d Binary files /dev/null and b/mods/ca/bits/audio/ytnkatk5.aud differ diff --git a/mods/ca/bits/audio/ytnkatk6.aud b/mods/ca/bits/audio/ytnkatk6.aud new file mode 100644 index 0000000000..55d37713e7 Binary files /dev/null and b/mods/ca/bits/audio/ytnkatk6.aud differ diff --git a/mods/ca/bits/audio/ytnkmov1.aud b/mods/ca/bits/audio/ytnkmov1.aud new file mode 100644 index 0000000000..0447b6b6ad Binary files /dev/null and b/mods/ca/bits/audio/ytnkmov1.aud differ diff --git a/mods/ca/bits/audio/ytnkmov2.aud b/mods/ca/bits/audio/ytnkmov2.aud new file mode 100644 index 0000000000..8f4ccb8980 Binary files /dev/null and b/mods/ca/bits/audio/ytnkmov2.aud differ diff --git a/mods/ca/bits/audio/ytnkmov3.aud b/mods/ca/bits/audio/ytnkmov3.aud new file mode 100644 index 0000000000..fa6dfdf1ee Binary files /dev/null and b/mods/ca/bits/audio/ytnkmov3.aud differ diff --git a/mods/ca/bits/audio/ytnkmov4.aud b/mods/ca/bits/audio/ytnkmov4.aud new file mode 100644 index 0000000000..ce9bc375dc Binary files /dev/null and b/mods/ca/bits/audio/ytnkmov4.aud differ diff --git a/mods/ca/bits/audio/ytnkmov5.aud b/mods/ca/bits/audio/ytnkmov5.aud new file mode 100644 index 0000000000..177857ec1f Binary files /dev/null and b/mods/ca/bits/audio/ytnkmov5.aud differ diff --git a/mods/ca/bits/audio/ytnkslt1.aud b/mods/ca/bits/audio/ytnkslt1.aud new file mode 100644 index 0000000000..b23c6264d9 Binary files /dev/null and b/mods/ca/bits/audio/ytnkslt1.aud differ diff --git a/mods/ca/bits/audio/ytnkslt2.aud b/mods/ca/bits/audio/ytnkslt2.aud new file mode 100644 index 0000000000..b0188c7702 Binary files /dev/null and b/mods/ca/bits/audio/ytnkslt2.aud differ diff --git a/mods/ca/bits/audio/ytnkslt3.aud b/mods/ca/bits/audio/ytnkslt3.aud new file mode 100644 index 0000000000..eef299ff08 Binary files /dev/null and b/mods/ca/bits/audio/ytnkslt3.aud differ diff --git a/mods/ca/bits/audio/ytnkslt4.aud b/mods/ca/bits/audio/ytnkslt4.aud new file mode 100644 index 0000000000..08902dc195 Binary files /dev/null and b/mods/ca/bits/audio/ytnkslt4.aud differ diff --git a/mods/ca/bits/audio/ytnkslt5.aud b/mods/ca/bits/audio/ytnkslt5.aud new file mode 100644 index 0000000000..88b2e85775 Binary files /dev/null and b/mods/ca/bits/audio/ytnkslt5.aud differ diff --git a/mods/ca/bits/audio/yuri-release.aud b/mods/ca/bits/audio/yuri-release.aud new file mode 100644 index 0000000000..d7eb30a18e Binary files /dev/null and b/mods/ca/bits/audio/yuri-release.aud differ diff --git a/mods/ca/bits/audio/zdef-attack1.aud b/mods/ca/bits/audio/zdef-attack1.aud new file mode 100644 index 0000000000..70c1f73962 Binary files /dev/null and b/mods/ca/bits/audio/zdef-attack1.aud differ diff --git a/mods/ca/bits/audio/zdef-attack2.aud b/mods/ca/bits/audio/zdef-attack2.aud new file mode 100644 index 0000000000..e8be7645ca Binary files /dev/null and b/mods/ca/bits/audio/zdef-attack2.aud differ diff --git a/mods/ca/bits/audio/zdef-attack3.aud b/mods/ca/bits/audio/zdef-attack3.aud new file mode 100644 index 0000000000..2481887953 Binary files /dev/null and b/mods/ca/bits/audio/zdef-attack3.aud differ diff --git a/mods/ca/bits/audio/zdef-move1.aud b/mods/ca/bits/audio/zdef-move1.aud new file mode 100644 index 0000000000..98f8e04966 Binary files /dev/null and b/mods/ca/bits/audio/zdef-move1.aud differ diff --git a/mods/ca/bits/audio/zdef-move2.aud b/mods/ca/bits/audio/zdef-move2.aud new file mode 100644 index 0000000000..703995f70a Binary files /dev/null and b/mods/ca/bits/audio/zdef-move2.aud differ diff --git a/mods/ca/bits/audio/zdef-move3.aud b/mods/ca/bits/audio/zdef-move3.aud new file mode 100644 index 0000000000..8928c4cbe1 Binary files /dev/null and b/mods/ca/bits/audio/zdef-move3.aud differ diff --git a/mods/ca/bits/audio/zdef-move4.aud b/mods/ca/bits/audio/zdef-move4.aud new file mode 100644 index 0000000000..83188d284e Binary files /dev/null and b/mods/ca/bits/audio/zdef-move4.aud differ diff --git a/mods/ca/bits/audio/zdef-select1.aud b/mods/ca/bits/audio/zdef-select1.aud new file mode 100644 index 0000000000..313c5f0b7d Binary files /dev/null and b/mods/ca/bits/audio/zdef-select1.aud differ diff --git a/mods/ca/bits/audio/zdef-select2.aud b/mods/ca/bits/audio/zdef-select2.aud new file mode 100644 index 0000000000..70d6e5c8b6 Binary files /dev/null and b/mods/ca/bits/audio/zdef-select2.aud differ diff --git a/mods/ca/bits/audio/zdef-select3.aud b/mods/ca/bits/audio/zdef-select3.aud new file mode 100644 index 0000000000..153f3e545f Binary files /dev/null and b/mods/ca/bits/audio/zdef-select3.aud differ diff --git a/mods/ca/bits/audio/zdef-select4.aud b/mods/ca/bits/audio/zdef-select4.aud new file mode 100644 index 0000000000..d272e189b8 Binary files /dev/null and b/mods/ca/bits/audio/zdef-select4.aud differ diff --git a/mods/ca/bits/audio/zdef-shield.aud b/mods/ca/bits/audio/zdef-shield.aud new file mode 100644 index 0000000000..edf254d52b Binary files /dev/null and b/mods/ca/bits/audio/zdef-shield.aud differ diff --git a/mods/ca/bits/audio/zdef-shield1.aud b/mods/ca/bits/audio/zdef-shield1.aud new file mode 100644 index 0000000000..64176fe820 Binary files /dev/null and b/mods/ca/bits/audio/zdef-shield1.aud differ diff --git a/mods/ca/bits/audio/zdef-shield2.aud b/mods/ca/bits/audio/zdef-shield2.aud new file mode 100644 index 0000000000..50e464b5db Binary files /dev/null and b/mods/ca/bits/audio/zdef-shield2.aud differ diff --git a/mods/ca/bits/audio/zeus-attack1.aud b/mods/ca/bits/audio/zeus-attack1.aud new file mode 100644 index 0000000000..4b347fea1e Binary files /dev/null and b/mods/ca/bits/audio/zeus-attack1.aud differ diff --git a/mods/ca/bits/audio/zeus-attack2.aud b/mods/ca/bits/audio/zeus-attack2.aud new file mode 100644 index 0000000000..938a999fd8 Binary files /dev/null and b/mods/ca/bits/audio/zeus-attack2.aud differ diff --git a/mods/ca/bits/audio/zeus-attack3.aud b/mods/ca/bits/audio/zeus-attack3.aud new file mode 100644 index 0000000000..9b2ac06aff Binary files /dev/null and b/mods/ca/bits/audio/zeus-attack3.aud differ diff --git a/mods/ca/bits/audio/zeus-attack4.aud b/mods/ca/bits/audio/zeus-attack4.aud new file mode 100644 index 0000000000..f1c7ef8d6a Binary files /dev/null and b/mods/ca/bits/audio/zeus-attack4.aud differ diff --git a/mods/ca/bits/audio/zeus-move1.aud b/mods/ca/bits/audio/zeus-move1.aud new file mode 100644 index 0000000000..595c1d530e Binary files /dev/null and b/mods/ca/bits/audio/zeus-move1.aud differ diff --git a/mods/ca/bits/audio/zeus-move2.aud b/mods/ca/bits/audio/zeus-move2.aud new file mode 100644 index 0000000000..d2887a9eb3 Binary files /dev/null and b/mods/ca/bits/audio/zeus-move2.aud differ diff --git a/mods/ca/bits/audio/zeus-move3.aud b/mods/ca/bits/audio/zeus-move3.aud new file mode 100644 index 0000000000..27a89e4c08 Binary files /dev/null and b/mods/ca/bits/audio/zeus-move3.aud differ diff --git a/mods/ca/bits/audio/zeus-move4.aud b/mods/ca/bits/audio/zeus-move4.aud new file mode 100644 index 0000000000..ba9830c7ec Binary files /dev/null and b/mods/ca/bits/audio/zeus-move4.aud differ diff --git a/mods/ca/bits/audio/zeus-select1.aud b/mods/ca/bits/audio/zeus-select1.aud new file mode 100644 index 0000000000..324632c849 Binary files /dev/null and b/mods/ca/bits/audio/zeus-select1.aud differ diff --git a/mods/ca/bits/audio/zeus-select2.aud b/mods/ca/bits/audio/zeus-select2.aud new file mode 100644 index 0000000000..a23e4ec50b Binary files /dev/null and b/mods/ca/bits/audio/zeus-select2.aud differ diff --git a/mods/ca/bits/audio/zeus-select3.aud b/mods/ca/bits/audio/zeus-select3.aud new file mode 100644 index 0000000000..12732d2fed Binary files /dev/null and b/mods/ca/bits/audio/zeus-select3.aud differ diff --git a/mods/ca/bits/audio/zeus-select4.aud b/mods/ca/bits/audio/zeus-select4.aud new file mode 100644 index 0000000000..16e054c9b9 Binary files /dev/null and b/mods/ca/bits/audio/zeus-select4.aud differ diff --git a/mods/ca/bits/audio/zeuscharge.aud b/mods/ca/bits/audio/zeuscharge.aud new file mode 100644 index 0000000000..b853adfb50 Binary files /dev/null and b/mods/ca/bits/audio/zeuscharge.aud differ diff --git a/mods/ca/bits/audio/zrai-attack1.aud b/mods/ca/bits/audio/zrai-attack1.aud new file mode 100644 index 0000000000..408bf9c488 Binary files /dev/null and b/mods/ca/bits/audio/zrai-attack1.aud differ diff --git a/mods/ca/bits/audio/zrai-attack2.aud b/mods/ca/bits/audio/zrai-attack2.aud new file mode 100644 index 0000000000..334d3c9a86 Binary files /dev/null and b/mods/ca/bits/audio/zrai-attack2.aud differ diff --git a/mods/ca/bits/audio/zrai-attack3.aud b/mods/ca/bits/audio/zrai-attack3.aud new file mode 100644 index 0000000000..98949613cf Binary files /dev/null and b/mods/ca/bits/audio/zrai-attack3.aud differ diff --git a/mods/ca/bits/audio/zrai-attack4.aud b/mods/ca/bits/audio/zrai-attack4.aud new file mode 100644 index 0000000000..d216e6ab17 Binary files /dev/null and b/mods/ca/bits/audio/zrai-attack4.aud differ diff --git a/mods/ca/bits/audio/zrai-die1.aud b/mods/ca/bits/audio/zrai-die1.aud new file mode 100644 index 0000000000..1978d48f6d Binary files /dev/null and b/mods/ca/bits/audio/zrai-die1.aud differ diff --git a/mods/ca/bits/audio/zrai-die2.aud b/mods/ca/bits/audio/zrai-die2.aud new file mode 100644 index 0000000000..e05bde8fa9 Binary files /dev/null and b/mods/ca/bits/audio/zrai-die2.aud differ diff --git a/mods/ca/bits/audio/zrai-die3.aud b/mods/ca/bits/audio/zrai-die3.aud new file mode 100644 index 0000000000..99f5b17573 Binary files /dev/null and b/mods/ca/bits/audio/zrai-die3.aud differ diff --git a/mods/ca/bits/audio/zrai-fire1.aud b/mods/ca/bits/audio/zrai-fire1.aud new file mode 100644 index 0000000000..f6256b4ec1 Binary files /dev/null and b/mods/ca/bits/audio/zrai-fire1.aud differ diff --git a/mods/ca/bits/audio/zrai-fire2.aud b/mods/ca/bits/audio/zrai-fire2.aud new file mode 100644 index 0000000000..ecc8f45b68 Binary files /dev/null and b/mods/ca/bits/audio/zrai-fire2.aud differ diff --git a/mods/ca/bits/audio/zrai-move1.aud b/mods/ca/bits/audio/zrai-move1.aud new file mode 100644 index 0000000000..58e4c84f06 Binary files /dev/null and b/mods/ca/bits/audio/zrai-move1.aud differ diff --git a/mods/ca/bits/audio/zrai-move2.aud b/mods/ca/bits/audio/zrai-move2.aud new file mode 100644 index 0000000000..fad83a912a Binary files /dev/null and b/mods/ca/bits/audio/zrai-move2.aud differ diff --git a/mods/ca/bits/audio/zrai-move3.aud b/mods/ca/bits/audio/zrai-move3.aud new file mode 100644 index 0000000000..e114db18b1 Binary files /dev/null and b/mods/ca/bits/audio/zrai-move3.aud differ diff --git a/mods/ca/bits/audio/zrai-move4.aud b/mods/ca/bits/audio/zrai-move4.aud new file mode 100644 index 0000000000..e9d9911fd0 Binary files /dev/null and b/mods/ca/bits/audio/zrai-move4.aud differ diff --git a/mods/ca/bits/audio/zrai-select1.aud b/mods/ca/bits/audio/zrai-select1.aud new file mode 100644 index 0000000000..1c76141215 Binary files /dev/null and b/mods/ca/bits/audio/zrai-select1.aud differ diff --git a/mods/ca/bits/audio/zrai-select2.aud b/mods/ca/bits/audio/zrai-select2.aud new file mode 100644 index 0000000000..3f28d5c46f Binary files /dev/null and b/mods/ca/bits/audio/zrai-select2.aud differ diff --git a/mods/ca/bits/audio/zrai-select3.aud b/mods/ca/bits/audio/zrai-select3.aud new file mode 100644 index 0000000000..c4d875d83f Binary files /dev/null and b/mods/ca/bits/audio/zrai-select3.aud differ diff --git a/mods/ca/bits/audio/zrai-select4.aud b/mods/ca/bits/audio/zrai-select4.aud new file mode 100644 index 0000000000..3db75997b0 Binary files /dev/null and b/mods/ca/bits/audio/zrai-select4.aud differ diff --git a/mods/ca/bits/audio/ztrp-attack1.aud b/mods/ca/bits/audio/ztrp-attack1.aud new file mode 100644 index 0000000000..86869b6e1e Binary files /dev/null and b/mods/ca/bits/audio/ztrp-attack1.aud differ diff --git a/mods/ca/bits/audio/ztrp-attack2.aud b/mods/ca/bits/audio/ztrp-attack2.aud new file mode 100644 index 0000000000..64be7f441f Binary files /dev/null and b/mods/ca/bits/audio/ztrp-attack2.aud differ diff --git a/mods/ca/bits/audio/ztrp-attack3.aud b/mods/ca/bits/audio/ztrp-attack3.aud new file mode 100644 index 0000000000..a5f8090f98 Binary files /dev/null and b/mods/ca/bits/audio/ztrp-attack3.aud differ diff --git a/mods/ca/bits/audio/ztrp-die1.aud b/mods/ca/bits/audio/ztrp-die1.aud new file mode 100644 index 0000000000..3f31e1f8f4 Binary files /dev/null and b/mods/ca/bits/audio/ztrp-die1.aud differ diff --git a/mods/ca/bits/audio/ztrp-die2.aud b/mods/ca/bits/audio/ztrp-die2.aud new file mode 100644 index 0000000000..d3dff57c73 Binary files /dev/null and b/mods/ca/bits/audio/ztrp-die2.aud differ diff --git a/mods/ca/bits/audio/ztrp-die3.aud b/mods/ca/bits/audio/ztrp-die3.aud new file mode 100644 index 0000000000..e0b2151841 Binary files /dev/null and b/mods/ca/bits/audio/ztrp-die3.aud differ diff --git a/mods/ca/bits/audio/ztrp-fire1.aud b/mods/ca/bits/audio/ztrp-fire1.aud new file mode 100644 index 0000000000..190528b90d Binary files /dev/null and b/mods/ca/bits/audio/ztrp-fire1.aud differ diff --git a/mods/ca/bits/audio/ztrp-fire2.aud b/mods/ca/bits/audio/ztrp-fire2.aud new file mode 100644 index 0000000000..90928827e7 Binary files /dev/null and b/mods/ca/bits/audio/ztrp-fire2.aud differ diff --git a/mods/ca/bits/audio/ztrp-fire3.aud b/mods/ca/bits/audio/ztrp-fire3.aud new file mode 100644 index 0000000000..0f60845aed Binary files /dev/null and b/mods/ca/bits/audio/ztrp-fire3.aud differ diff --git a/mods/ca/bits/audio/ztrp-jump1.aud b/mods/ca/bits/audio/ztrp-jump1.aud new file mode 100644 index 0000000000..e441e77882 Binary files /dev/null and b/mods/ca/bits/audio/ztrp-jump1.aud differ diff --git a/mods/ca/bits/audio/ztrp-jump2.aud b/mods/ca/bits/audio/ztrp-jump2.aud new file mode 100644 index 0000000000..5edc0d1cda Binary files /dev/null and b/mods/ca/bits/audio/ztrp-jump2.aud differ diff --git a/mods/ca/bits/audio/ztrp-land1.aud b/mods/ca/bits/audio/ztrp-land1.aud new file mode 100644 index 0000000000..6a30fa4a2e Binary files /dev/null and b/mods/ca/bits/audio/ztrp-land1.aud differ diff --git a/mods/ca/bits/audio/ztrp-land2.aud b/mods/ca/bits/audio/ztrp-land2.aud new file mode 100644 index 0000000000..e89447cc8a Binary files /dev/null and b/mods/ca/bits/audio/ztrp-land2.aud differ diff --git a/mods/ca/bits/audio/ztrp-move1.aud b/mods/ca/bits/audio/ztrp-move1.aud new file mode 100644 index 0000000000..7f01ff2ee4 Binary files /dev/null and b/mods/ca/bits/audio/ztrp-move1.aud differ diff --git a/mods/ca/bits/audio/ztrp-move2.aud b/mods/ca/bits/audio/ztrp-move2.aud new file mode 100644 index 0000000000..89e75f04f8 Binary files /dev/null and b/mods/ca/bits/audio/ztrp-move2.aud differ diff --git a/mods/ca/bits/audio/ztrp-move3.aud b/mods/ca/bits/audio/ztrp-move3.aud new file mode 100644 index 0000000000..36b222bd34 Binary files /dev/null and b/mods/ca/bits/audio/ztrp-move3.aud differ diff --git a/mods/ca/bits/audio/ztrp-move4.aud b/mods/ca/bits/audio/ztrp-move4.aud new file mode 100644 index 0000000000..ca8133d2ae Binary files /dev/null and b/mods/ca/bits/audio/ztrp-move4.aud differ diff --git a/mods/ca/bits/audio/ztrp-move5.aud b/mods/ca/bits/audio/ztrp-move5.aud new file mode 100644 index 0000000000..ccccaa2917 Binary files /dev/null and b/mods/ca/bits/audio/ztrp-move5.aud differ diff --git a/mods/ca/bits/audio/ztrp-select1.aud b/mods/ca/bits/audio/ztrp-select1.aud new file mode 100644 index 0000000000..e82211aec6 Binary files /dev/null and b/mods/ca/bits/audio/ztrp-select1.aud differ diff --git a/mods/ca/bits/audio/ztrp-select2.aud b/mods/ca/bits/audio/ztrp-select2.aud new file mode 100644 index 0000000000..daa272fb04 Binary files /dev/null and b/mods/ca/bits/audio/ztrp-select2.aud differ diff --git a/mods/ca/bits/audio/ztrp-select3.aud b/mods/ca/bits/audio/ztrp-select3.aud new file mode 100644 index 0000000000..6e5f5d571b Binary files /dev/null and b/mods/ca/bits/audio/ztrp-select3.aud differ diff --git a/mods/ca/bits/audio/ztrp-select4.aud b/mods/ca/bits/audio/ztrp-select4.aud new file mode 100644 index 0000000000..4ed43467db Binary files /dev/null and b/mods/ca/bits/audio/ztrp-select4.aud differ diff --git a/mods/ca/bits/avtrbody.shp b/mods/ca/bits/avtrbody.shp new file mode 100644 index 0000000000..8cc15ba585 Binary files /dev/null and b/mods/ca/bits/avtrbody.shp differ diff --git a/mods/ca/bits/avtricnh.shp b/mods/ca/bits/avtricnh.shp new file mode 100644 index 0000000000..770c29a147 Binary files /dev/null and b/mods/ca/bits/avtricnh.shp differ diff --git a/mods/ca/bits/avtrlegs.shp b/mods/ca/bits/avtrlegs.shp new file mode 100644 index 0000000000..f415281ce3 Binary files /dev/null and b/mods/ca/bits/avtrlegs.shp differ diff --git a/mods/ca/bits/barb.shp b/mods/ca/bits/barb.shp new file mode 100644 index 0000000000..5c03b661b7 Binary files /dev/null and b/mods/ca/bits/barb.shp differ diff --git a/mods/ca/bits/basi.shp b/mods/ca/bits/basi.shp new file mode 100644 index 0000000000..51f3b310e5 Binary files /dev/null and b/mods/ca/bits/basi.shp differ diff --git a/mods/ca/bits/basiicon.shp b/mods/ca/bits/basiicon.shp new file mode 100644 index 0000000000..d2e53eebcc Binary files /dev/null and b/mods/ca/bits/basiicon.shp differ diff --git a/mods/ca/bits/basiwave.shp b/mods/ca/bits/basiwave.shp new file mode 100644 index 0000000000..5fe9bc13f2 Binary files /dev/null and b/mods/ca/bits/basiwave.shp differ diff --git a/mods/ca/bits/beag.shp b/mods/ca/bits/beag.shp new file mode 100644 index 0000000000..d443e07534 Binary files /dev/null and b/mods/ca/bits/beag.shp differ diff --git a/mods/ca/bits/beagicon.shp b/mods/ca/bits/beagicon.shp new file mode 100644 index 0000000000..8413e395de Binary files /dev/null and b/mods/ca/bits/beagicon.shp differ diff --git a/mods/ca/bits/bh.shp b/mods/ca/bits/bh.shp index 445cc11af9..7815b8f279 100644 Binary files a/mods/ca/bits/bh.shp and b/mods/ca/bits/bh.shp differ diff --git a/mods/ca/bits/bhicon.shp b/mods/ca/bits/bhicon.shp index 570d5a7260..512e9fc802 100644 Binary files a/mods/ca/bits/bhicon.shp and b/mods/ca/bits/bhicon.shp differ diff --git a/mods/ca/bits/bigbomb.shp b/mods/ca/bits/bigbomb.shp new file mode 100644 index 0000000000..307729d644 Binary files /dev/null and b/mods/ca/bits/bigbomb.shp differ diff --git a/mods/ca/bits/bikeupg.shp b/mods/ca/bits/bikeupg.shp new file mode 100644 index 0000000000..b0fcc4e699 Binary files /dev/null and b/mods/ca/bits/bikeupg.shp differ diff --git a/mods/ca/bits/bio.shp b/mods/ca/bits/bio.shp new file mode 100644 index 0000000000..9e7a55e4a2 Binary files /dev/null and b/mods/ca/bits/bio.shp differ diff --git a/mods/ca/bits/bjet.shp b/mods/ca/bits/bjet.shp new file mode 100644 index 0000000000..92bbdaa2d0 Binary files /dev/null and b/mods/ca/bits/bjet.shp differ diff --git a/mods/ca/bits/bjeticnh.shp b/mods/ca/bits/bjeticnh.shp new file mode 100644 index 0000000000..3db0c2afea Binary files /dev/null and b/mods/ca/bits/bjeticnh.shp differ diff --git a/mods/ca/bits/blacknapalm3.shp b/mods/ca/bits/blacknapalm3.shp new file mode 100644 index 0000000000..e07f69e507 Binary files /dev/null and b/mods/ca/bits/blacknapalm3.shp differ diff --git a/mods/ca/bits/blinded.shp b/mods/ca/bits/blinded.shp new file mode 100644 index 0000000000..c9091d6395 Binary files /dev/null and b/mods/ca/bits/blinded.shp differ diff --git a/mods/ca/bits/brass.shp b/mods/ca/bits/brass.shp new file mode 100644 index 0000000000..9b0aad7545 Binary files /dev/null and b/mods/ca/bits/brass.shp differ diff --git a/mods/ca/bits/bsky.shp b/mods/ca/bits/bsky.shp new file mode 100644 index 0000000000..affae4343d Binary files /dev/null and b/mods/ca/bits/bsky.shp differ diff --git a/mods/ca/bits/bskyicon.shp b/mods/ca/bits/bskyicon.shp new file mode 100644 index 0000000000..28ecb55d04 Binary files /dev/null and b/mods/ca/bits/bskyicon.shp differ diff --git a/mods/ca/bits/btrt.shp b/mods/ca/bits/btrt.shp new file mode 100644 index 0000000000..d008f4a5e7 Binary files /dev/null and b/mods/ca/bits/btrt.shp differ diff --git a/mods/ca/bits/btrtr.shp b/mods/ca/bits/btrtr.shp new file mode 100644 index 0000000000..a6eccb843a Binary files /dev/null and b/mods/ca/bits/btrtr.shp differ diff --git a/mods/ca/bits/btryicon.shp b/mods/ca/bits/btryicon.shp new file mode 100644 index 0000000000..92cd655c6c Binary files /dev/null and b/mods/ca/bits/btryicon.shp differ diff --git a/mods/ca/bits/caneon.pal b/mods/ca/bits/caneon.pal index ba589c3591..cb25dd832f 100644 Binary files a/mods/ca/bits/caneon.pal and b/mods/ca/bits/caneon.pal differ diff --git a/mods/ca/bits/cdgas.shp b/mods/ca/bits/cdgas.shp index e5f68a266b..cef5cd4e7e 100644 Binary files a/mods/ca/bits/cdgas.shp and b/mods/ca/bits/cdgas.shp differ diff --git a/mods/ca/bits/cdog.shp b/mods/ca/bits/cdog.shp new file mode 100644 index 0000000000..4fb21670d3 Binary files /dev/null and b/mods/ca/bits/cdog.shp differ diff --git a/mods/ca/bits/cdogbullt.shp b/mods/ca/bits/cdogbullt.shp new file mode 100644 index 0000000000..a461cd7ebf Binary files /dev/null and b/mods/ca/bits/cdogbullt.shp differ diff --git a/mods/ca/bits/cdogicon.shp b/mods/ca/bits/cdogicon.shp new file mode 100644 index 0000000000..53c0b5ba5b Binary files /dev/null and b/mods/ca/bits/cdogicon.shp differ diff --git a/mods/ca/bits/chaosbombicon.shp b/mods/ca/bits/chaosbombicon.shp new file mode 100644 index 0000000000..6dcb6e42cd Binary files /dev/null and b/mods/ca/bits/chaosbombicon.shp differ diff --git a/mods/ca/bits/chaoscloud1.shp b/mods/ca/bits/chaoscloud1.shp index ec763c47bd..56851ca404 100644 Binary files a/mods/ca/bits/chaoscloud1.shp and b/mods/ca/bits/chaoscloud1.shp differ diff --git a/mods/ca/bits/chaoscloud1d.shp b/mods/ca/bits/chaoscloud1d.shp index 8b77a51fbd..71c0225a97 100644 Binary files a/mods/ca/bits/chaoscloud1d.shp and b/mods/ca/bits/chaoscloud1d.shp differ diff --git a/mods/ca/bits/chaoscloud2.shp b/mods/ca/bits/chaoscloud2.shp index 3eba932786..4a76ccaa14 100644 Binary files a/mods/ca/bits/chaoscloud2.shp and b/mods/ca/bits/chaoscloud2.shp differ diff --git a/mods/ca/bits/chaoscloud2d.shp b/mods/ca/bits/chaoscloud2d.shp index fc303a79a9..e8523e6a40 100644 Binary files a/mods/ca/bits/chaoscloud2d.shp and b/mods/ca/bits/chaoscloud2d.shp differ diff --git a/mods/ca/bits/chaosexplode.shp b/mods/ca/bits/chaosexplode.shp index 4ee7a253a5..357b50f3e0 100644 Binary files a/mods/ca/bits/chaosexplode.shp and b/mods/ca/bits/chaosexplode.shp differ diff --git a/mods/ca/bits/chronoprep.shp b/mods/ca/bits/chronoprep.shp new file mode 100644 index 0000000000..041707c8bb Binary files /dev/null and b/mods/ca/bits/chronoprep.shp differ diff --git a/mods/ca/bits/cloud1sm.shp b/mods/ca/bits/cloud1sm.shp new file mode 100644 index 0000000000..854f72a6da Binary files /dev/null and b/mods/ca/bits/cloud1sm.shp differ diff --git a/mods/ca/bits/cmec.shp b/mods/ca/bits/cmec.shp new file mode 100644 index 0000000000..1d721b870e Binary files /dev/null and b/mods/ca/bits/cmec.shp differ diff --git a/mods/ca/bits/cmecicon.shp b/mods/ca/bits/cmecicon.shp new file mode 100644 index 0000000000..7eb990aa66 Binary files /dev/null and b/mods/ca/bits/cmecicon.shp differ diff --git a/mods/ca/bits/cmiss.shp b/mods/ca/bits/cmiss.shp new file mode 100644 index 0000000000..5737dd3213 Binary files /dev/null and b/mods/ca/bits/cmiss.shp differ diff --git a/mods/ca/bits/cmsr.shp b/mods/ca/bits/cmsr.shp new file mode 100644 index 0000000000..329bcc427b Binary files /dev/null and b/mods/ca/bits/cmsr.shp differ diff --git a/mods/ca/bits/cmsricon.shp b/mods/ca/bits/cmsricon.shp new file mode 100644 index 0000000000..69a86bb44f Binary files /dev/null and b/mods/ca/bits/cmsricon.shp differ diff --git a/mods/ca/bits/coiltrail.shp b/mods/ca/bits/coiltrail.shp new file mode 100644 index 0000000000..1e5a45b38d Binary files /dev/null and b/mods/ca/bits/coiltrail.shp differ diff --git a/mods/ca/bits/conf.shp b/mods/ca/bits/conf.shp new file mode 100644 index 0000000000..7c06c4fac7 Binary files /dev/null and b/mods/ca/bits/conf.shp differ diff --git a/mods/ca/bits/confcabalicnh.shp b/mods/ca/bits/confcabalicnh.shp new file mode 100644 index 0000000000..a5b1a7ee13 Binary files /dev/null and b/mods/ca/bits/confcabalicnh.shp differ diff --git a/mods/ca/bits/covenantlevel1icon.shp b/mods/ca/bits/covenantlevel1icon.shp new file mode 100644 index 0000000000..3d763986ea Binary files /dev/null and b/mods/ca/bits/covenantlevel1icon.shp differ diff --git a/mods/ca/bits/covenantlevel2icon.shp b/mods/ca/bits/covenantlevel2icon.shp new file mode 100644 index 0000000000..c71818d5c5 Binary files /dev/null and b/mods/ca/bits/covenantlevel2icon.shp differ diff --git a/mods/ca/bits/covenantlevel3icon.shp b/mods/ca/bits/covenantlevel3icon.shp new file mode 100644 index 0000000000..564b9e0ff1 Binary files /dev/null and b/mods/ca/bits/covenantlevel3icon.shp differ diff --git a/mods/ca/bits/cryoball.shp b/mods/ca/bits/cryoball.shp new file mode 100644 index 0000000000..a8b08bdd1f Binary files /dev/null and b/mods/ca/bits/cryoball.shp differ diff --git a/mods/ca/bits/cryobeam.shp b/mods/ca/bits/cryobeam.shp new file mode 100644 index 0000000000..6018ecbc87 Binary files /dev/null and b/mods/ca/bits/cryobeam.shp differ diff --git a/mods/ca/bits/cryostorm.shp b/mods/ca/bits/cryostorm.shp new file mode 100644 index 0000000000..61ec4b2e39 Binary files /dev/null and b/mods/ca/bits/cryostorm.shp differ diff --git a/mods/ca/bits/cryostormicon.shp b/mods/ca/bits/cryostormicon.shp new file mode 100644 index 0000000000..0ef8f26c0b Binary files /dev/null and b/mods/ca/bits/cryostormicon.shp differ diff --git a/mods/ca/bits/cryt.shp b/mods/ca/bits/cryt.shp new file mode 100644 index 0000000000..5e08c2e3e8 Binary files /dev/null and b/mods/ca/bits/cryt.shp differ diff --git a/mods/ca/bits/cryticon.shp b/mods/ca/bits/cryticon.shp new file mode 100644 index 0000000000..1c89b46327 Binary files /dev/null and b/mods/ca/bits/cryticon.shp differ diff --git a/mods/ca/bits/ctranicnh.shp b/mods/ca/bits/ctranicnh.shp deleted file mode 100644 index 557381c4ff..0000000000 Binary files a/mods/ca/bits/ctranicnh.shp and /dev/null differ diff --git a/mods/ca/bits/cust.shp b/mods/ca/bits/cust.shp new file mode 100644 index 0000000000..bf1ecd37f6 Binary files /dev/null and b/mods/ca/bits/cust.shp differ diff --git a/mods/ca/bits/custbuff.shp b/mods/ca/bits/custbuff.shp new file mode 100644 index 0000000000..13fc367a34 Binary files /dev/null and b/mods/ca/bits/custbuff.shp differ diff --git a/mods/ca/bits/custhealhit.shp b/mods/ca/bits/custhealhit.shp new file mode 100644 index 0000000000..cbb2afe0ae Binary files /dev/null and b/mods/ca/bits/custhealhit.shp differ diff --git a/mods/ca/bits/custicon.shp b/mods/ca/bits/custicon.shp new file mode 100644 index 0000000000..eb6543e541 Binary files /dev/null and b/mods/ca/bits/custicon.shp differ diff --git a/mods/ca/bits/cvat.shp b/mods/ca/bits/cvat.shp new file mode 100644 index 0000000000..a3eb07958d Binary files /dev/null and b/mods/ca/bits/cvat.shp differ diff --git a/mods/ca/bits/cvaticon.shp b/mods/ca/bits/cvaticon.shp new file mode 100644 index 0000000000..8baaaf8df3 Binary files /dev/null and b/mods/ca/bits/cvaticon.shp differ diff --git a/mods/ca/bits/cvatmk.shp b/mods/ca/bits/cvatmk.shp new file mode 100644 index 0000000000..c23b739c55 Binary files /dev/null and b/mods/ca/bits/cvatmk.shp differ diff --git a/mods/ca/bits/cycp.shp b/mods/ca/bits/cycp.shp new file mode 100644 index 0000000000..da87bf3ca4 Binary files /dev/null and b/mods/ca/bits/cycp.shp differ diff --git a/mods/ca/bits/cycpicon.shp b/mods/ca/bits/cycpicon.shp new file mode 100644 index 0000000000..55b6ac7333 Binary files /dev/null and b/mods/ca/bits/cycpicon.shp differ diff --git a/mods/ca/bits/delp.shp b/mods/ca/bits/delp.shp new file mode 100644 index 0000000000..4366457949 Binary files /dev/null and b/mods/ca/bits/delp.shp differ diff --git a/mods/ca/bits/delpicon.shp b/mods/ca/bits/delpicon.shp new file mode 100644 index 0000000000..75b956fc03 Binary files /dev/null and b/mods/ca/bits/delpicon.shp differ diff --git a/mods/ca/bits/delptur.shp b/mods/ca/bits/delptur.shp new file mode 100644 index 0000000000..5df8072d7e Binary files /dev/null and b/mods/ca/bits/delptur.shp differ diff --git a/mods/ca/bits/deso.shp b/mods/ca/bits/deso.shp new file mode 100644 index 0000000000..f05aa63db0 Binary files /dev/null and b/mods/ca/bits/deso.shp differ diff --git a/mods/ca/bits/dirt.shp b/mods/ca/bits/dirt.shp new file mode 100644 index 0000000000..0c6a577cdd Binary files /dev/null and b/mods/ca/bits/dirt.shp differ diff --git a/mods/ca/bits/disc.shp b/mods/ca/bits/disc.shp new file mode 100644 index 0000000000..82c87b6976 Binary files /dev/null and b/mods/ca/bits/disc.shp differ diff --git a/mods/ca/bits/disccharge.shp b/mods/ca/bits/disccharge.shp new file mode 100644 index 0000000000..51a028a9fb Binary files /dev/null and b/mods/ca/bits/disccharge.shp differ diff --git a/mods/ca/bits/disccrash.shp b/mods/ca/bits/disccrash.shp new file mode 100644 index 0000000000..17724e0af8 Binary files /dev/null and b/mods/ca/bits/disccrash.shp differ diff --git a/mods/ca/bits/discicon.shp b/mods/ca/bits/discicon.shp new file mode 100644 index 0000000000..32e9700a28 Binary files /dev/null and b/mods/ca/bits/discicon.shp differ diff --git a/mods/ca/bits/diskray.shp b/mods/ca/bits/diskray.shp new file mode 100644 index 0000000000..277c1456e8 Binary files /dev/null and b/mods/ca/bits/diskray.shp differ diff --git a/mods/ca/bits/dronet.shp b/mods/ca/bits/dronet.shp index ffb12f8fb5..aa807805ee 100644 Binary files a/mods/ca/bits/dronet.shp and b/mods/ca/bits/dronet.shp differ diff --git a/mods/ca/bits/e8d.shp b/mods/ca/bits/e8d.shp deleted file mode 100644 index c87c96f096..0000000000 Binary files a/mods/ca/bits/e8d.shp and /dev/null differ diff --git a/mods/ca/bits/e8icon.shp b/mods/ca/bits/e8icon.shp index a96cd8c40b..2a26177183 100644 Binary files a/mods/ca/bits/e8icon.shp and b/mods/ca/bits/e8icon.shp differ diff --git a/mods/ca/bits/enfo.shp b/mods/ca/bits/enfo.shp new file mode 100644 index 0000000000..26e6c1c9ce Binary files /dev/null and b/mods/ca/bits/enfo.shp differ diff --git a/mods/ca/bits/enfoicon.shp b/mods/ca/bits/enfoicon.shp new file mode 100644 index 0000000000..63cd4bdad6 Binary files /dev/null and b/mods/ca/bits/enfoicon.shp differ diff --git a/mods/ca/bits/enli.shp b/mods/ca/bits/enli.shp new file mode 100644 index 0000000000..553ea256d5 Binary files /dev/null and b/mods/ca/bits/enli.shp differ diff --git a/mods/ca/bits/enliemphit.shp b/mods/ca/bits/enliemphit.shp new file mode 100644 index 0000000000..69acfc7c04 Binary files /dev/null and b/mods/ca/bits/enliemphit.shp differ diff --git a/mods/ca/bits/enliempproj.shp b/mods/ca/bits/enliempproj.shp new file mode 100644 index 0000000000..f6eb96e8c0 Binary files /dev/null and b/mods/ca/bits/enliempproj.shp differ diff --git a/mods/ca/bits/enliexplode.shp b/mods/ca/bits/enliexplode.shp new file mode 100644 index 0000000000..0f17695605 Binary files /dev/null and b/mods/ca/bits/enliexplode.shp differ diff --git a/mods/ca/bits/enliicnh.shp b/mods/ca/bits/enliicnh.shp new file mode 100644 index 0000000000..9f9efdc4b6 Binary files /dev/null and b/mods/ca/bits/enliicnh.shp differ diff --git a/mods/ca/bits/fire2black.shp b/mods/ca/bits/fire2black.shp new file mode 100644 index 0000000000..57a1881106 Binary files /dev/null and b/mods/ca/bits/fire2black.shp differ diff --git a/mods/ca/bits/fire3black.shp b/mods/ca/bits/fire3black.shp new file mode 100644 index 0000000000..9b66ea64f8 Binary files /dev/null and b/mods/ca/bits/fire3black.shp differ diff --git a/mods/ca/bits/flameallblack.shp b/mods/ca/bits/flameallblack.shp new file mode 100644 index 0000000000..b8fb4490ce Binary files /dev/null and b/mods/ca/bits/flameallblack.shp differ diff --git a/mods/ca/bits/flameblack.shp b/mods/ca/bits/flameblack.shp new file mode 100644 index 0000000000..a6cc395e4e Binary files /dev/null and b/mods/ca/bits/flameblack.shp differ diff --git a/mods/ca/bits/freficon.shp b/mods/ca/bits/freficon.shp new file mode 100644 index 0000000000..bdaaeb1b5b Binary files /dev/null and b/mods/ca/bits/freficon.shp differ diff --git a/mods/ca/bits/galx.shp b/mods/ca/bits/galx.shp new file mode 100644 index 0000000000..4183096c29 Binary files /dev/null and b/mods/ca/bits/galx.shp differ diff --git a/mods/ca/bits/gapmuzzle.shp b/mods/ca/bits/gapmuzzle.shp new file mode 100644 index 0000000000..4f290888ac Binary files /dev/null and b/mods/ca/bits/gapmuzzle.shp differ diff --git a/mods/ca/bits/gata.shp b/mods/ca/bits/gata.shp new file mode 100644 index 0000000000..ce5a35516e Binary files /dev/null and b/mods/ca/bits/gata.shp differ diff --git a/mods/ca/bits/gatar.shp b/mods/ca/bits/gatar.shp new file mode 100644 index 0000000000..8b517de360 Binary files /dev/null and b/mods/ca/bits/gatar.shp differ diff --git a/mods/ca/bits/gatl.shp b/mods/ca/bits/gatl.shp new file mode 100644 index 0000000000..0a01dff1ac Binary files /dev/null and b/mods/ca/bits/gatl.shp differ diff --git a/mods/ca/bits/gatlr.shp b/mods/ca/bits/gatlr.shp new file mode 100644 index 0000000000..562d25a164 Binary files /dev/null and b/mods/ca/bits/gatlr.shp differ diff --git a/mods/ca/bits/gdrn.shp b/mods/ca/bits/gdrn.shp index 9a1921cbd6..ab3a6a6123 100644 Binary files a/mods/ca/bits/gdrn.shp and b/mods/ca/bits/gdrn.shp differ diff --git a/mods/ca/bits/gdrnicon.shp b/mods/ca/bits/gdrnicon.shp index 618a4bcee8..f319c18445 100644 Binary files a/mods/ca/bits/gdrnicon.shp and b/mods/ca/bits/gdrnicon.shp differ diff --git a/mods/ca/bits/gmutationicon.shp b/mods/ca/bits/gmutationicon.shp index f4e5396731..c71c3c5b21 100644 Binary files a/mods/ca/bits/gmutationicon.shp and b/mods/ca/bits/gmutationicon.shp differ diff --git a/mods/ca/bits/gpsdot.shp b/mods/ca/bits/gpsdot.shp index 1fb56bf0b1..0bc7c4553d 100644 Binary files a/mods/ca/bits/gpsdot.shp and b/mods/ca/bits/gpsdot.shp differ diff --git a/mods/ca/bits/grad.shp b/mods/ca/bits/grad.shp new file mode 100644 index 0000000000..7ac4a04b41 Binary files /dev/null and b/mods/ca/bits/grad.shp differ diff --git a/mods/ca/bits/gradicon.shp b/mods/ca/bits/gradicon.shp new file mode 100644 index 0000000000..06edd54277 Binary files /dev/null and b/mods/ca/bits/gradicon.shp differ diff --git a/mods/ca/bits/gradtur.shp b/mods/ca/bits/gradtur.shp new file mode 100644 index 0000000000..10bf431144 Binary files /dev/null and b/mods/ca/bits/gradtur.shp differ diff --git a/mods/ca/bits/gradturupg.shp b/mods/ca/bits/gradturupg.shp new file mode 100644 index 0000000000..ef4d2aeb0a Binary files /dev/null and b/mods/ca/bits/gradturupg.shp differ diff --git a/mods/ca/bits/greyboom.shp b/mods/ca/bits/greyboom.shp new file mode 100644 index 0000000000..57976c0c68 Binary files /dev/null and b/mods/ca/bits/greyboom.shp differ diff --git a/mods/ca/bits/gsyrdicnh.shp b/mods/ca/bits/gsyrdicnh.shp new file mode 100644 index 0000000000..1c39dc2b67 Binary files /dev/null and b/mods/ca/bits/gsyrdicnh.shp differ diff --git a/mods/ca/bits/gtnk.shp b/mods/ca/bits/gtnk.shp new file mode 100644 index 0000000000..3f494e3863 Binary files /dev/null and b/mods/ca/bits/gtnk.shp differ diff --git a/mods/ca/bits/gtnkdropicon.shp b/mods/ca/bits/gtnkdropicon.shp new file mode 100644 index 0000000000..91fd46c5fa Binary files /dev/null and b/mods/ca/bits/gtnkdropicon.shp differ diff --git a/mods/ca/bits/gtnkicon.shp b/mods/ca/bits/gtnkicon.shp new file mode 100644 index 0000000000..637e1b46c3 Binary files /dev/null and b/mods/ca/bits/gtnkicon.shp differ diff --git a/mods/ca/bits/hacked.shp b/mods/ca/bits/hacked.shp index 74e9340f27..89c3c2b299 100644 Binary files a/mods/ca/bits/hacked.shp and b/mods/ca/bits/hacked.shp differ diff --git a/mods/ca/bits/hackercellicon.shp b/mods/ca/bits/hackercellicon.shp index 2a82d55262..7fcbee0163 100644 Binary files a/mods/ca/bits/hackercellicon.shp and b/mods/ca/bits/hackercellicon.shp differ diff --git a/mods/ca/bits/halo.shp b/mods/ca/bits/halo.shp new file mode 100644 index 0000000000..e3cd6b702b Binary files /dev/null and b/mods/ca/bits/halo.shp differ diff --git a/mods/ca/bits/haloicon.shp b/mods/ca/bits/haloicon.shp new file mode 100644 index 0000000000..94a0d83e36 Binary files /dev/null and b/mods/ca/bits/haloicon.shp differ diff --git a/mods/ca/bits/harv2dumpupg.shp b/mods/ca/bits/harv2dumpupg.shp new file mode 100644 index 0000000000..34c232aa0f Binary files /dev/null and b/mods/ca/bits/harv2dumpupg.shp differ diff --git a/mods/ca/bits/harv2upg.shp b/mods/ca/bits/harv2upg.shp new file mode 100644 index 0000000000..92ea90e1f2 Binary files /dev/null and b/mods/ca/bits/harv2upg.shp differ diff --git a/mods/ca/bits/harv2upgicnh.shp b/mods/ca/bits/harv2upgicnh.shp new file mode 100644 index 0000000000..66dec6bb9f Binary files /dev/null and b/mods/ca/bits/harv2upgicnh.shp differ diff --git a/mods/ca/bits/hcrate.shp b/mods/ca/bits/hcrate.shp new file mode 100644 index 0000000000..8635b60d9d Binary files /dev/null and b/mods/ca/bits/hcrate.shp differ diff --git a/mods/ca/bits/heliosbomb.shp b/mods/ca/bits/heliosbomb.shp new file mode 100644 index 0000000000..67875a6cd9 Binary files /dev/null and b/mods/ca/bits/heliosbomb.shp differ diff --git a/mods/ca/bits/heliosexplode.shp b/mods/ca/bits/heliosexplode.shp new file mode 100644 index 0000000000..a53a7619fd Binary files /dev/null and b/mods/ca/bits/heliosexplode.shp differ diff --git a/mods/ca/bits/heliosexplode2.shp b/mods/ca/bits/heliosexplode2.shp new file mode 100644 index 0000000000..2480b6f61a Binary files /dev/null and b/mods/ca/bits/heliosexplode2.shp differ diff --git a/mods/ca/bits/heliosicon.shp b/mods/ca/bits/heliosicon.shp new file mode 100644 index 0000000000..997c0d045a Binary files /dev/null and b/mods/ca/bits/heliosicon.shp differ diff --git a/mods/ca/bits/heroesicon.shp b/mods/ca/bits/heroesicon.shp new file mode 100644 index 0000000000..b2eaee12f8 Binary files /dev/null and b/mods/ca/bits/heroesicon.shp differ diff --git a/mods/ca/bits/herolight.shp b/mods/ca/bits/herolight.shp new file mode 100644 index 0000000000..973b7762e8 Binary files /dev/null and b/mods/ca/bits/herolight.shp differ diff --git a/mods/ca/bits/herostar.shp b/mods/ca/bits/herostar.shp new file mode 100644 index 0000000000..8c902003d5 Binary files /dev/null and b/mods/ca/bits/herostar.shp differ diff --git a/mods/ca/bits/hftk.shp b/mods/ca/bits/hftk.shp index 5aebe01791..d9cb83abbc 100644 Binary files a/mods/ca/bits/hftk.shp and b/mods/ca/bits/hftk.shp differ diff --git a/mods/ca/bits/hindoriginal.shp b/mods/ca/bits/hindoriginal.shp deleted file mode 100644 index fe25918193..0000000000 Binary files a/mods/ca/bits/hindoriginal.shp and /dev/null differ diff --git a/mods/ca/bits/hmmvtow.shp b/mods/ca/bits/hmmvtow.shp new file mode 100644 index 0000000000..719c975227 Binary files /dev/null and b/mods/ca/bits/hmmvtow.shp differ diff --git a/mods/ca/bits/hopl.shp b/mods/ca/bits/hopl.shp new file mode 100644 index 0000000000..098df657d9 Binary files /dev/null and b/mods/ca/bits/hopl.shp differ diff --git a/mods/ca/bits/hoplicon.shp b/mods/ca/bits/hoplicon.shp new file mode 100644 index 0000000000..f52d5fdc3d Binary files /dev/null and b/mods/ca/bits/hoplicon.shp differ diff --git a/mods/ca/bits/hosp.shp b/mods/ca/bits/hosp.shp new file mode 100644 index 0000000000..cd915108cd Binary files /dev/null and b/mods/ca/bits/hosp.shp differ diff --git a/mods/ca/bits/howi.shp b/mods/ca/bits/howi.shp index 92f2bbf787..22536dce04 100644 Binary files a/mods/ca/bits/howi.shp and b/mods/ca/bits/howi.shp differ diff --git a/mods/ca/bits/howiicnh.shp b/mods/ca/bits/howiicnh.shp index ff9b3b6bd5..82512d1e78 100644 Binary files a/mods/ca/bits/howiicnh.shp and b/mods/ca/bits/howiicnh.shp differ diff --git a/mods/ca/bits/hqr.shp b/mods/ca/bits/hqr.shp new file mode 100644 index 0000000000..1fa58aabc4 Binary files /dev/null and b/mods/ca/bits/hqr.shp differ diff --git a/mods/ca/bits/hqrmake.shp b/mods/ca/bits/hqrmake.shp new file mode 100644 index 0000000000..a2c9c6de03 Binary files /dev/null and b/mods/ca/bits/hqrmake.shp differ diff --git a/mods/ca/bits/hstk.shp b/mods/ca/bits/hstk.shp new file mode 100644 index 0000000000..e7415f8651 Binary files /dev/null and b/mods/ca/bits/hstk.shp differ diff --git a/mods/ca/bits/hstkicnh.shp b/mods/ca/bits/hstkicnh.shp new file mode 100644 index 0000000000..01d021a244 Binary files /dev/null and b/mods/ca/bits/hstkicnh.shp differ diff --git a/mods/ca/bits/hstktupg.shp b/mods/ca/bits/hstktupg.shp new file mode 100644 index 0000000000..0fd5691578 Binary files /dev/null and b/mods/ca/bits/hstktupg.shp differ diff --git a/mods/ca/bits/hvrtur.shp b/mods/ca/bits/hvrtur.shp index 706395bddb..50d2915342 100644 Binary files a/mods/ca/bits/hvrtur.shp and b/mods/ca/bits/hvrtur.shp differ diff --git a/mods/ca/bits/icbmsmoke.shp b/mods/ca/bits/icbmsmoke.shp new file mode 100644 index 0000000000..8a8bb5e5cc Binary files /dev/null and b/mods/ca/bits/icbmsmoke.shp differ diff --git a/mods/ca/bits/ifv.shp b/mods/ca/bits/ifv.shp index 68870b3bdc..e81ac4040a 100644 Binary files a/mods/ca/bits/ifv.shp and b/mods/ca/bits/ifv.shp differ diff --git a/mods/ca/bits/ifvtur.shp b/mods/ca/bits/ifvtur.shp index b3a3805000..8784c5310f 100644 Binary files a/mods/ca/bits/ifvtur.shp and b/mods/ca/bits/ifvtur.shp differ diff --git a/mods/ca/bits/infilicnh.shp b/mods/ca/bits/infilicnh.shp new file mode 100644 index 0000000000..4ce364e114 Binary files /dev/null and b/mods/ca/bits/infilicnh.shp differ diff --git a/mods/ca/bits/influencelevel1icon.shp b/mods/ca/bits/influencelevel1icon.shp new file mode 100644 index 0000000000..453fa3a165 Binary files /dev/null and b/mods/ca/bits/influencelevel1icon.shp differ diff --git a/mods/ca/bits/influencelevel2icon.shp b/mods/ca/bits/influencelevel2icon.shp new file mode 100644 index 0000000000..1d7daea2cd Binary files /dev/null and b/mods/ca/bits/influencelevel2icon.shp differ diff --git a/mods/ca/bits/influencelevel3icon.shp b/mods/ca/bits/influencelevel3icon.shp new file mode 100644 index 0000000000..1b2e03968d Binary files /dev/null and b/mods/ca/bits/influencelevel3icon.shp differ diff --git a/mods/ca/bits/invisicon.shp b/mods/ca/bits/invisicnh.shp similarity index 100% rename from mods/ca/bits/invisicon.shp rename to mods/ca/bits/invisicnh.shp diff --git a/mods/ca/bits/iok.shp b/mods/ca/bits/iok.shp new file mode 100644 index 0000000000..71924ed074 Binary files /dev/null and b/mods/ca/bits/iok.shp differ diff --git a/mods/ca/bits/iokholo.shp b/mods/ca/bits/iokholo.shp new file mode 100644 index 0000000000..919b59b25d Binary files /dev/null and b/mods/ca/bits/iokholo.shp differ diff --git a/mods/ca/bits/iokoutline.shp b/mods/ca/bits/iokoutline.shp new file mode 100644 index 0000000000..8a0b257bfb Binary files /dev/null and b/mods/ca/bits/iokoutline.shp differ diff --git a/mods/ca/bits/jack.shp b/mods/ca/bits/jack.shp new file mode 100644 index 0000000000..ca90ce7f8d Binary files /dev/null and b/mods/ca/bits/jack.shp differ diff --git a/mods/ca/bits/jackicon.shp b/mods/ca/bits/jackicon.shp new file mode 100644 index 0000000000..f75d734f99 Binary files /dev/null and b/mods/ca/bits/jackicon.shp differ diff --git a/mods/ca/bits/jamfield.shp b/mods/ca/bits/jamfield.shp new file mode 100644 index 0000000000..5b62c44059 Binary files /dev/null and b/mods/ca/bits/jamfield.shp differ diff --git a/mods/ca/bits/jamsignal.shp b/mods/ca/bits/jamsignal.shp new file mode 100644 index 0000000000..1a47a9953b Binary files /dev/null and b/mods/ca/bits/jamsignal.shp differ diff --git a/mods/ca/bits/jjet.shp b/mods/ca/bits/jjet.shp index a1caac472a..ecdcbb461b 100644 Binary files a/mods/ca/bits/jjet.shp and b/mods/ca/bits/jjet.shp differ diff --git a/mods/ca/bits/jjeticnh.shp b/mods/ca/bits/jjeticnh.shp index 11eed6dd4a..42d1c0dc5f 100644 Binary files a/mods/ca/bits/jjeticnh.shp and b/mods/ca/bits/jjeticnh.shp differ diff --git a/mods/ca/bits/kamv.shp b/mods/ca/bits/kamv.shp new file mode 100644 index 0000000000..f879929e89 Binary files /dev/null and b/mods/ca/bits/kamv.shp differ diff --git a/mods/ca/bits/kamvicon.shp b/mods/ca/bits/kamvicon.shp new file mode 100644 index 0000000000..e5f8b03929 Binary files /dev/null and b/mods/ca/bits/kamvicon.shp differ diff --git a/mods/ca/bits/kane.shp b/mods/ca/bits/kane.shp new file mode 100644 index 0000000000..e83ca69860 Binary files /dev/null and b/mods/ca/bits/kane.shp differ diff --git a/mods/ca/bits/killzone.shp b/mods/ca/bits/killzone.shp new file mode 100644 index 0000000000..d2d15f6779 Binary files /dev/null and b/mods/ca/bits/killzone.shp differ diff --git a/mods/ca/bits/killzoneicon.shp b/mods/ca/bits/killzoneicon.shp new file mode 100644 index 0000000000..fb8b68bce3 Binary files /dev/null and b/mods/ca/bits/killzoneicon.shp differ diff --git a/mods/ca/bits/laserhit.shp b/mods/ca/bits/laserhit.shp new file mode 100644 index 0000000000..de95fc1085 Binary files /dev/null and b/mods/ca/bits/laserhit.shp differ diff --git a/mods/ca/bits/lasermuzzle.shp b/mods/ca/bits/lasermuzzle.shp new file mode 100644 index 0000000000..aaf8f898f8 Binary files /dev/null and b/mods/ca/bits/lasermuzzle.shp differ diff --git a/mods/ca/bits/lores-cryostormicon.shp b/mods/ca/bits/lores-cryostormicon.shp new file mode 100644 index 0000000000..65ca32730a Binary files /dev/null and b/mods/ca/bits/lores-cryostormicon.shp differ diff --git a/mods/ca/bits/lores-ioncannonicon.shp b/mods/ca/bits/lores-ioncannonicon.shp new file mode 100644 index 0000000000..6368af53b1 Binary files /dev/null and b/mods/ca/bits/lores-ioncannonicon.shp differ diff --git a/mods/ca/bits/lores-killzoneicon.shp b/mods/ca/bits/lores-killzoneicon.shp new file mode 100644 index 0000000000..6445607741 Binary files /dev/null and b/mods/ca/bits/lores-killzoneicon.shp differ diff --git a/mods/ca/bits/lores-strafeicon.shp b/mods/ca/bits/lores-strafeicon.shp new file mode 100644 index 0000000000..acfeab7e8c Binary files /dev/null and b/mods/ca/bits/lores-strafeicon.shp differ diff --git a/mods/ca/bits/lores-substrikeicon.shp b/mods/ca/bits/lores-substrikeicon.shp new file mode 100644 index 0000000000..b4731e76fc Binary files /dev/null and b/mods/ca/bits/lores-substrikeicon.shp differ diff --git a/mods/ca/bits/lrotorhuge.shp b/mods/ca/bits/lrotorhuge.shp new file mode 100644 index 0000000000..2f40902000 Binary files /dev/null and b/mods/ca/bits/lrotorhuge.shp differ diff --git a/mods/ca/bits/ltnk.shp b/mods/ca/bits/ltnk.shp index e5cabd1469..d185b84865 100644 Binary files a/mods/ca/bits/ltnk.shp and b/mods/ca/bits/ltnk.shp differ diff --git a/mods/ca/bits/macs.shp b/mods/ca/bits/macs.shp new file mode 100644 index 0000000000..fd4befe0ba Binary files /dev/null and b/mods/ca/bits/macs.shp differ diff --git a/mods/ca/bits/mant.shp b/mods/ca/bits/mant.shp new file mode 100644 index 0000000000..0c6b33a198 Binary files /dev/null and b/mods/ca/bits/mant.shp differ diff --git a/mods/ca/bits/manticnh.shp b/mods/ca/bits/manticnh.shp new file mode 100644 index 0000000000..08feb49423 Binary files /dev/null and b/mods/ca/bits/manticnh.shp differ diff --git a/mods/ca/bits/mcor.shp b/mods/ca/bits/mcor.shp new file mode 100644 index 0000000000..bd4993ea24 Binary files /dev/null and b/mods/ca/bits/mcor.shp differ diff --git a/mods/ca/bits/mcoricnh.shp b/mods/ca/bits/mcoricnh.shp new file mode 100644 index 0000000000..f4f425aebe Binary files /dev/null and b/mods/ca/bits/mcoricnh.shp differ diff --git a/mods/ca/bits/medbomb.shp b/mods/ca/bits/medbomb.shp new file mode 100644 index 0000000000..cd69c5db48 Binary files /dev/null and b/mods/ca/bits/medbomb.shp differ diff --git a/mods/ca/bits/microwavehit.shp b/mods/ca/bits/microwavehit.shp new file mode 100644 index 0000000000..e631a7df22 Binary files /dev/null and b/mods/ca/bits/microwavehit.shp differ diff --git a/mods/ca/bits/mig.shp b/mods/ca/bits/mig.shp new file mode 100644 index 0000000000..329428fe9a Binary files /dev/null and b/mods/ca/bits/mig.shp differ diff --git a/mods/ca/bits/mindblast.shp b/mods/ca/bits/mindblast.shp new file mode 100644 index 0000000000..5e6fb9e78a Binary files /dev/null and b/mods/ca/bits/mindblast.shp differ diff --git a/mods/ca/bits/mindblastsm.shp b/mods/ca/bits/mindblastsm.shp new file mode 100644 index 0000000000..f18897531f Binary files /dev/null and b/mods/ca/bits/mindblastsm.shp differ diff --git a/mods/ca/bits/minigun16.shp b/mods/ca/bits/minigun16.shp index 00eeafbc28..c88a9fba77 100644 Binary files a/mods/ca/bits/minigun16.shp and b/mods/ca/bits/minigun16.shp differ diff --git a/mods/ca/bits/minigun16big.shp b/mods/ca/bits/minigun16big.shp new file mode 100644 index 0000000000..57736f8579 Binary files /dev/null and b/mods/ca/bits/minigun16big.shp differ diff --git a/mods/ca/bits/minigun16huge.shp b/mods/ca/bits/minigun16huge.shp new file mode 100644 index 0000000000..802ddef7ed Binary files /dev/null and b/mods/ca/bits/minigun16huge.shp differ diff --git a/mods/ca/bits/missilesm.shp b/mods/ca/bits/missilesm.shp new file mode 100644 index 0000000000..d5daa2fdca Binary files /dev/null and b/mods/ca/bits/missilesm.shp differ diff --git a/mods/ca/bits/moab.shp b/mods/ca/bits/moab.shp index a4d141f319..40f85b413a 100644 Binary files a/mods/ca/bits/moab.shp and b/mods/ca/bits/moab.shp differ diff --git a/mods/ca/bits/mole.shp b/mods/ca/bits/mole.shp new file mode 100644 index 0000000000..0c964ebb10 Binary files /dev/null and b/mods/ca/bits/mole.shp differ diff --git a/mods/ca/bits/mort.shp b/mods/ca/bits/mort.shp deleted file mode 100644 index 8986d1ec59..0000000000 Binary files a/mods/ca/bits/mort.shp and /dev/null differ diff --git a/mods/ca/bits/mortchem.shp b/mods/ca/bits/mortchem.shp new file mode 100644 index 0000000000..722f1deb42 Binary files /dev/null and b/mods/ca/bits/mortchem.shp differ diff --git a/mods/ca/bits/mortchemicon.shp b/mods/ca/bits/mortchemicon.shp new file mode 100644 index 0000000000..49e93948d6 Binary files /dev/null and b/mods/ca/bits/mortchemicon.shp differ diff --git a/mods/ca/bits/mortcryo.shp b/mods/ca/bits/mortcryo.shp new file mode 100644 index 0000000000..6a3d9ae81c Binary files /dev/null and b/mods/ca/bits/mortcryo.shp differ diff --git a/mods/ca/bits/mortcryoicon.shp b/mods/ca/bits/mortcryoicon.shp new file mode 100644 index 0000000000..75cb471bf1 Binary files /dev/null and b/mods/ca/bits/mortcryoicon.shp differ diff --git a/mods/ca/bits/morticon.shp b/mods/ca/bits/morticon.shp deleted file mode 100644 index 6aeddc221c..0000000000 Binary files a/mods/ca/bits/morticon.shp and /dev/null differ diff --git a/mods/ca/bits/mortsonic.shp b/mods/ca/bits/mortsonic.shp new file mode 100644 index 0000000000..75510b750c Binary files /dev/null and b/mods/ca/bits/mortsonic.shp differ diff --git a/mods/ca/bits/mortsonicicon.shp b/mods/ca/bits/mortsonicicon.shp new file mode 100644 index 0000000000..517fb09a61 Binary files /dev/null and b/mods/ca/bits/mortsonicicon.shp differ diff --git a/mods/ca/bits/mouse.shp b/mods/ca/bits/mouse.shp index ffce7225c9..ea8b5e0e4a 100644 Binary files a/mods/ca/bits/mouse.shp and b/mods/ca/bits/mouse.shp differ diff --git a/mods/ca/bits/mtnkicnh.shp b/mods/ca/bits/mtnkicnh.shp index 388a6875a6..9f1f7cc898 100644 Binary files a/mods/ca/bits/mtnkicnh.shp and b/mods/ca/bits/mtnkicnh.shp differ diff --git a/mods/ca/bits/mtnknod.shp b/mods/ca/bits/mtnknod.shp index e6b6810146..00f388c734 100644 Binary files a/mods/ca/bits/mtnknod.shp and b/mods/ca/bits/mtnknod.shp differ diff --git a/mods/ca/bits/munp.shp b/mods/ca/bits/munp.shp new file mode 100644 index 0000000000..a9fbd7c00d Binary files /dev/null and b/mods/ca/bits/munp.shp differ diff --git a/mods/ca/bits/munpicon.shp b/mods/ca/bits/munpicon.shp new file mode 100644 index 0000000000..7da6d29ba0 Binary files /dev/null and b/mods/ca/bits/munpicon.shp differ diff --git a/mods/ca/bits/munpmk.shp b/mods/ca/bits/munpmk.shp new file mode 100644 index 0000000000..797701d97e Binary files /dev/null and b/mods/ca/bits/munpmk.shp differ diff --git a/mods/ca/bits/music/creep.ogg b/mods/ca/bits/music/creep.ogg new file mode 100644 index 0000000000..583a7a13e5 Binary files /dev/null and b/mods/ca/bits/music/creep.ogg differ diff --git a/mods/ca/bits/music/crus226m_retal.ogg b/mods/ca/bits/music/crus226m_retal.ogg new file mode 100644 index 0000000000..ae64d65066 Binary files /dev/null and b/mods/ca/bits/music/crus226m_retal.ogg differ diff --git a/mods/ca/bits/music/drill.ogg b/mods/ca/bits/music/drill.ogg new file mode 100644 index 0000000000..8122cdaeb6 Binary files /dev/null and b/mods/ca/bits/music/drill.ogg differ diff --git a/mods/ca/bits/music/fac1226m_retal.ogg b/mods/ca/bits/music/fac1226m_retal.ogg new file mode 100644 index 0000000000..f7f8b20ec0 Binary files /dev/null and b/mods/ca/bits/music/fac1226m_retal.ogg differ diff --git a/mods/ca/bits/music/gateway.ogg b/mods/ca/bits/music/gateway.ogg new file mode 100644 index 0000000000..8b694df3d1 Binary files /dev/null and b/mods/ca/bits/music/gateway.ogg differ diff --git a/mods/ca/bits/music/hell226m_retal.ogg b/mods/ca/bits/music/hell226m_retal.ogg new file mode 100644 index 0000000000..5bbf86a0c7 Binary files /dev/null and b/mods/ca/bits/music/hell226m_retal.ogg differ diff --git a/mods/ca/bits/music/malev.ogg b/mods/ca/bits/music/malev.ogg new file mode 100644 index 0000000000..0813c57841 Binary files /dev/null and b/mods/ca/bits/music/malev.ogg differ diff --git a/mods/ca/bits/music/moi.ogg b/mods/ca/bits/music/moi.ogg new file mode 100644 index 0000000000..29264a0e5f Binary files /dev/null and b/mods/ca/bits/music/moi.ogg differ diff --git a/mods/ca/bits/music/moi2.ogg b/mods/ca/bits/music/moi2.ogg new file mode 100644 index 0000000000..4648e857d7 Binary files /dev/null and b/mods/ca/bits/music/moi2.ogg differ diff --git a/mods/ca/bits/music/mud_remix.ogg b/mods/ca/bits/music/mud_remix.ogg new file mode 100644 index 0000000000..810a8b2a9a Binary files /dev/null and b/mods/ca/bits/music/mud_remix.ogg differ diff --git a/mods/ca/bits/music/radio2_retal.ogg b/mods/ca/bits/music/radio2_retal.ogg new file mode 100644 index 0000000000..07f42b9fec Binary files /dev/null and b/mods/ca/bits/music/radio2_retal.ogg differ diff --git a/mods/ca/bits/music/radio2ca.ogg b/mods/ca/bits/music/radio2ca.ogg new file mode 100644 index 0000000000..2009bfc3f5 Binary files /dev/null and b/mods/ca/bits/music/radio2ca.ogg differ diff --git a/mods/ca/bits/music/recon.ogg b/mods/ca/bits/music/recon.ogg new file mode 100644 index 0000000000..dba9d49fcf Binary files /dev/null and b/mods/ca/bits/music/recon.ogg differ diff --git a/mods/ca/bits/music/subvn.ogg b/mods/ca/bits/music/subvn.ogg new file mode 100644 index 0000000000..ee88eb11bc Binary files /dev/null and b/mods/ca/bits/music/subvn.ogg differ diff --git a/mods/ca/bits/music/work226m_retal.ogg b/mods/ca/bits/music/work226m_retal.ogg new file mode 100644 index 0000000000..388873ea36 Binary files /dev/null and b/mods/ca/bits/music/work226m_retal.ogg differ diff --git a/mods/ca/bits/n1cicnh.shp b/mods/ca/bits/n1cicnh.shp index 514232d358..7be1914866 100644 Binary files a/mods/ca/bits/n1cicnh.shp and b/mods/ca/bits/n1cicnh.shp differ diff --git a/mods/ca/bits/n3cicnh.shp b/mods/ca/bits/n3cicnh.shp index 59c23e3d1f..7f8b84069e 100644 Binary files a/mods/ca/bits/n3cicnh.shp and b/mods/ca/bits/n3cicnh.shp differ diff --git a/mods/ca/bits/n6deploy.shp b/mods/ca/bits/n6deploy.shp new file mode 100644 index 0000000000..9fb44c11dd Binary files /dev/null and b/mods/ca/bits/n6deploy.shp differ diff --git a/mods/ca/bits/negoticon.shp b/mods/ca/bits/negoticon.shp new file mode 100644 index 0000000000..e277a7ac35 Binary files /dev/null and b/mods/ca/bits/negoticon.shp differ diff --git a/mods/ca/bits/nhaw.shp b/mods/ca/bits/nhaw.shp new file mode 100644 index 0000000000..d80f9f24ca Binary files /dev/null and b/mods/ca/bits/nhaw.shp differ diff --git a/mods/ca/bits/nhaw0.shp b/mods/ca/bits/nhaw0.shp new file mode 100644 index 0000000000..e6b9840397 Binary files /dev/null and b/mods/ca/bits/nhaw0.shp differ diff --git a/mods/ca/bits/nhaw1.shp b/mods/ca/bits/nhaw1.shp new file mode 100644 index 0000000000..0e16161837 Binary files /dev/null and b/mods/ca/bits/nhaw1.shp differ diff --git a/mods/ca/bits/nhaw2.shp b/mods/ca/bits/nhaw2.shp new file mode 100644 index 0000000000..9e692f9d9f Binary files /dev/null and b/mods/ca/bits/nhaw2.shp differ diff --git a/mods/ca/bits/nhawicon.shp b/mods/ca/bits/nhawicon.shp new file mode 100644 index 0000000000..1277260771 Binary files /dev/null and b/mods/ca/bits/nhawicon.shp differ diff --git a/mods/ca/bits/nodfactmake.shp b/mods/ca/bits/nodfactmake.shp index f37648d91f..d22611831c 100644 Binary files a/mods/ca/bits/nodfactmake.shp and b/mods/ca/bits/nodfactmake.shp differ diff --git a/mods/ca/bits/nodgtwrmake.shp b/mods/ca/bits/nodgtwrmake.shp deleted file mode 100644 index 7d5fa4d59f..0000000000 Binary files a/mods/ca/bits/nodgtwrmake.shp and /dev/null differ diff --git a/mods/ca/bits/nodhqupg.shp b/mods/ca/bits/nodhqupg.shp new file mode 100644 index 0000000000..d0351aa65e Binary files /dev/null and b/mods/ca/bits/nodhqupg.shp differ diff --git a/mods/ca/bits/nodhqupgicnh.shp b/mods/ca/bits/nodhqupgicnh.shp new file mode 100644 index 0000000000..f95b046fc8 Binary files /dev/null and b/mods/ca/bits/nodhqupgicnh.shp differ diff --git a/mods/ca/bits/nodhqupgmake.shp b/mods/ca/bits/nodhqupgmake.shp new file mode 100644 index 0000000000..de09a3d80a Binary files /dev/null and b/mods/ca/bits/nodhqupgmake.shp differ diff --git a/mods/ca/bits/nodproc.shp b/mods/ca/bits/nodproc.shp index 7d3667f185..2137cf1670 100644 Binary files a/mods/ca/bits/nodproc.shp and b/mods/ca/bits/nodproc.shp differ diff --git a/mods/ca/bits/nodspen.shp b/mods/ca/bits/nodspen.shp deleted file mode 100644 index a85041f252..0000000000 Binary files a/mods/ca/bits/nodspen.shp and /dev/null differ diff --git a/mods/ca/bits/npwr.shp b/mods/ca/bits/npwr.shp new file mode 100644 index 0000000000..7ab92de8aa Binary files /dev/null and b/mods/ca/bits/npwr.shp differ diff --git a/mods/ca/bits/npwrd.shp b/mods/ca/bits/npwrd.shp new file mode 100644 index 0000000000..74119f848d Binary files /dev/null and b/mods/ca/bits/npwrd.shp differ diff --git a/mods/ca/bits/npwricon.shp b/mods/ca/bits/npwricon.shp new file mode 100644 index 0000000000..005aa8c5c3 Binary files /dev/null and b/mods/ca/bits/npwricon.shp differ diff --git a/mods/ca/bits/npwrmake.shp b/mods/ca/bits/npwrmake.shp new file mode 100644 index 0000000000..2fb7d0a224 Binary files /dev/null and b/mods/ca/bits/npwrmake.shp differ diff --git a/mods/ca/bits/nrepair.shp b/mods/ca/bits/nrepair.shp new file mode 100644 index 0000000000..be2c221bd2 Binary files /dev/null and b/mods/ca/bits/nrepair.shp differ diff --git a/mods/ca/bits/nshield.shp b/mods/ca/bits/nshield.shp index 266d36fb2d..c08581dcb1 100644 Binary files a/mods/ca/bits/nshield.shp and b/mods/ca/bits/nshield.shp differ diff --git a/mods/ca/bits/nshieldsm.shp b/mods/ca/bits/nshieldsm.shp new file mode 100644 index 0000000000..23d5ac8243 Binary files /dev/null and b/mods/ca/bits/nshieldsm.shp differ diff --git a/mods/ca/bits/nukc.shp b/mods/ca/bits/nukc.shp new file mode 100644 index 0000000000..2a84dad41a Binary files /dev/null and b/mods/ca/bits/nukc.shp differ diff --git a/mods/ca/bits/nukcd.shp b/mods/ca/bits/nukcd.shp new file mode 100644 index 0000000000..33c1115db5 Binary files /dev/null and b/mods/ca/bits/nukcd.shp differ diff --git a/mods/ca/bits/nukcicon.shp b/mods/ca/bits/nukcicon.shp new file mode 100644 index 0000000000..8264d3721a Binary files /dev/null and b/mods/ca/bits/nukcicon.shp differ diff --git a/mods/ca/bits/nukco.shp b/mods/ca/bits/nukco.shp new file mode 100644 index 0000000000..ef980d00cb Binary files /dev/null and b/mods/ca/bits/nukco.shp differ diff --git a/mods/ca/bits/nukct.shp b/mods/ca/bits/nukct.shp new file mode 100644 index 0000000000..204dec6a79 Binary files /dev/null and b/mods/ca/bits/nukct.shp differ diff --git a/mods/ca/bits/oilb.shp b/mods/ca/bits/oilb.shp index 41f543ebe2..48a55fe1ce 100644 Binary files a/mods/ca/bits/oilb.shp and b/mods/ca/bits/oilb.shp differ diff --git a/mods/ca/bits/oilr.shp b/mods/ca/bits/oilr.shp new file mode 100644 index 0000000000..51c3491e53 Binary files /dev/null and b/mods/ca/bits/oilr.shp differ diff --git a/mods/ca/bits/opticsactive.shp b/mods/ca/bits/opticsactive.shp new file mode 100644 index 0000000000..f211cd45d5 Binary files /dev/null and b/mods/ca/bits/opticsactive.shp differ diff --git a/mods/ca/bits/orcajet.shp b/mods/ca/bits/orcajet.shp new file mode 100644 index 0000000000..f87f6d0937 Binary files /dev/null and b/mods/ca/bits/orcajet.shp differ diff --git a/mods/ca/bits/ovld.shp b/mods/ca/bits/ovld.shp new file mode 100644 index 0000000000..ed6a73b50c Binary files /dev/null and b/mods/ca/bits/ovld.shp differ diff --git a/mods/ca/bits/ovlderadicon.shp b/mods/ca/bits/ovlderadicon.shp new file mode 100644 index 0000000000..d2a21e9952 Binary files /dev/null and b/mods/ca/bits/ovlderadicon.shp differ diff --git a/mods/ca/bits/ovlderadiicon.shp b/mods/ca/bits/ovlderadiicon.shp new file mode 100644 index 0000000000..cf23f43776 Binary files /dev/null and b/mods/ca/bits/ovlderadiicon.shp differ diff --git a/mods/ca/bits/ovldi.shp b/mods/ca/bits/ovldi.shp new file mode 100644 index 0000000000..44e55e4365 Binary files /dev/null and b/mods/ca/bits/ovldi.shp differ diff --git a/mods/ca/bits/ovldicon.shp b/mods/ca/bits/ovldicon.shp new file mode 100644 index 0000000000..2011f32b3e Binary files /dev/null and b/mods/ca/bits/ovldicon.shp differ diff --git a/mods/ca/bits/ovldiicon.shp b/mods/ca/bits/ovldiicon.shp new file mode 100644 index 0000000000..d273fc5d5d Binary files /dev/null and b/mods/ca/bits/ovldiicon.shp differ diff --git a/mods/ca/bits/ovldtur.shp b/mods/ca/bits/ovldtur.shp new file mode 100644 index 0000000000..c4877161a4 Binary files /dev/null and b/mods/ca/bits/ovldtur.shp differ diff --git a/mods/ca/bits/ovldturi.shp b/mods/ca/bits/ovldturi.shp new file mode 100644 index 0000000000..fe8e8cedf4 Binary files /dev/null and b/mods/ca/bits/ovldturi.shp differ diff --git a/mods/ca/bits/p51.shp b/mods/ca/bits/p51.shp new file mode 100644 index 0000000000..77a292a6b0 Binary files /dev/null and b/mods/ca/bits/p51.shp differ diff --git a/mods/ca/bits/parach-largeshadow.shp b/mods/ca/bits/parach-largeshadow.shp new file mode 100644 index 0000000000..d980777833 Binary files /dev/null and b/mods/ca/bits/parach-largeshadow.shp differ diff --git a/mods/ca/bits/parachl.shp b/mods/ca/bits/parachl.shp index bcde02dc4a..b264f1e12c 100644 Binary files a/mods/ca/bits/parachl.shp and b/mods/ca/bits/parachl.shp differ diff --git a/mods/ca/bits/pbul.shp b/mods/ca/bits/pbul.shp new file mode 100644 index 0000000000..60d8fa31b1 Binary files /dev/null and b/mods/ca/bits/pbul.shp differ diff --git a/mods/ca/bits/pbulicnh.shp b/mods/ca/bits/pbulicnh.shp new file mode 100644 index 0000000000..d2cc0201e3 Binary files /dev/null and b/mods/ca/bits/pbulicnh.shp differ diff --git a/mods/ca/bits/pcan.shp b/mods/ca/bits/pcan.shp index 9a86127d74..eb302913c8 100644 Binary files a/mods/ca/bits/pcan.shp and b/mods/ca/bits/pcan.shp differ diff --git a/mods/ca/bits/phan.shp b/mods/ca/bits/phan.shp new file mode 100644 index 0000000000..8a3004f50a Binary files /dev/null and b/mods/ca/bits/phan.shp differ diff --git a/mods/ca/bits/phanicon.shp b/mods/ca/bits/phanicon.shp new file mode 100644 index 0000000000..e61607584f Binary files /dev/null and b/mods/ca/bits/phanicon.shp differ diff --git a/mods/ca/bits/pip-cmsr.shp b/mods/ca/bits/pip-cmsr.shp new file mode 100644 index 0000000000..c78d82441c Binary files /dev/null and b/mods/ca/bits/pip-cmsr.shp differ diff --git a/mods/ca/bits/pip-hidden.shp b/mods/ca/bits/pip-hidden.shp index 3ad0041344..f27e242858 100644 Binary files a/mods/ca/bits/pip-hidden.shp and b/mods/ca/bits/pip-hidden.shp differ diff --git a/mods/ca/bits/pip-seal.shp b/mods/ca/bits/pip-seal.shp new file mode 100644 index 0000000000..780ebba9cd Binary files /dev/null and b/mods/ca/bits/pip-seal.shp differ diff --git a/mods/ca/bits/pip-seek.shp b/mods/ca/bits/pip-seek.shp index 83f13a7b55..60fc160ee8 100644 Binary files a/mods/ca/bits/pip-seek.shp and b/mods/ca/bits/pip-seek.shp differ diff --git a/mods/ca/bits/placeholdericon.shp b/mods/ca/bits/placeholdericon.shp new file mode 100644 index 0000000000..a827bafbf9 Binary files /dev/null and b/mods/ca/bits/placeholdericon.shp differ diff --git a/mods/ca/bits/playersmoke.shp b/mods/ca/bits/playersmoke.shp index 36acc68401..e1712709a4 100644 Binary files a/mods/ca/bits/playersmoke.shp and b/mods/ca/bits/playersmoke.shp differ diff --git a/mods/ca/bits/playerxprank1icon.shp b/mods/ca/bits/playerxprank1icon.shp new file mode 100644 index 0000000000..06da7a0938 Binary files /dev/null and b/mods/ca/bits/playerxprank1icon.shp differ diff --git a/mods/ca/bits/playerxprank2icon.shp b/mods/ca/bits/playerxprank2icon.shp new file mode 100644 index 0000000000..1220615730 Binary files /dev/null and b/mods/ca/bits/playerxprank2icon.shp differ diff --git a/mods/ca/bits/playerxprank3icon.shp b/mods/ca/bits/playerxprank3icon.shp new file mode 100644 index 0000000000..71bb192921 Binary files /dev/null and b/mods/ca/bits/playerxprank3icon.shp differ diff --git a/mods/ca/bits/playerzapmuzzle.shp b/mods/ca/bits/playerzapmuzzle.shp new file mode 100644 index 0000000000..a35e531a78 Binary files /dev/null and b/mods/ca/bits/playerzapmuzzle.shp differ diff --git a/mods/ca/bits/pmak.shp b/mods/ca/bits/pmak.shp new file mode 100644 index 0000000000..f47f09f1f5 Binary files /dev/null and b/mods/ca/bits/pmak.shp differ diff --git a/mods/ca/bits/pmakicon.shp b/mods/ca/bits/pmakicon.shp new file mode 100644 index 0000000000..3248cfb80b Binary files /dev/null and b/mods/ca/bits/pmakicon.shp differ diff --git a/mods/ca/bits/poweron.shp b/mods/ca/bits/poweron.shp new file mode 100644 index 0000000000..3a417d7f56 Binary files /dev/null and b/mods/ca/bits/poweron.shp differ diff --git a/mods/ca/bits/press.shp b/mods/ca/bits/press.shp new file mode 100644 index 0000000000..9fd9a77e95 Binary files /dev/null and b/mods/ca/bits/press.shp differ diff --git a/mods/ca/bits/prismmuzzle.shp b/mods/ca/bits/prismmuzzle.shp new file mode 100644 index 0000000000..09777290d9 Binary files /dev/null and b/mods/ca/bits/prismmuzzle.shp differ diff --git a/mods/ca/bits/quake.shp b/mods/ca/bits/quake.shp new file mode 100644 index 0000000000..432279c642 Binary files /dev/null and b/mods/ca/bits/quake.shp differ diff --git a/mods/ca/bits/radball.shp b/mods/ca/bits/radball.shp new file mode 100644 index 0000000000..19ce93b1c5 Binary files /dev/null and b/mods/ca/bits/radball.shp differ diff --git a/mods/ca/bits/radburst.shp b/mods/ca/bits/radburst.shp new file mode 100644 index 0000000000..09c60480f4 Binary files /dev/null and b/mods/ca/bits/radburst.shp differ diff --git a/mods/ca/bits/radhit.shp b/mods/ca/bits/radhit.shp new file mode 100644 index 0000000000..c45559aba6 Binary files /dev/null and b/mods/ca/bits/radhit.shp differ diff --git a/mods/ca/bits/radhitsm.shp b/mods/ca/bits/radhitsm.shp new file mode 100644 index 0000000000..1e16879dbd Binary files /dev/null and b/mods/ca/bits/radhitsm.shp differ diff --git a/mods/ca/bits/radspike.shp b/mods/ca/bits/radspike.shp new file mode 100644 index 0000000000..acdd47877b Binary files /dev/null and b/mods/ca/bits/radspike.shp differ diff --git a/mods/ca/bits/rank.shp b/mods/ca/bits/rank.shp index c3e118e18c..23c5086967 100644 Binary files a/mods/ca/bits/rank.shp and b/mods/ca/bits/rank.shp differ diff --git a/mods/ca/bits/rapc.shp b/mods/ca/bits/rapc.shp new file mode 100644 index 0000000000..7aa3b4678d Binary files /dev/null and b/mods/ca/bits/rapc.shp differ diff --git a/mods/ca/bits/rapcicon.shp b/mods/ca/bits/rapcicon.shp new file mode 100644 index 0000000000..79d0056a75 Binary files /dev/null and b/mods/ca/bits/rapcicon.shp differ diff --git a/mods/ca/bits/rbug.shp b/mods/ca/bits/rbug.shp new file mode 100644 index 0000000000..bc3b2decd4 Binary files /dev/null and b/mods/ca/bits/rbug.shp differ diff --git a/mods/ca/bits/rbugicnh.shp b/mods/ca/bits/rbugicnh.shp new file mode 100644 index 0000000000..5cddccf3b5 Binary files /dev/null and b/mods/ca/bits/rbugicnh.shp differ diff --git a/mods/ca/bits/reap-snarehit.shp b/mods/ca/bits/reap-snarehit.shp new file mode 100644 index 0000000000..548bb34a6d Binary files /dev/null and b/mods/ca/bits/reap-snarehit.shp differ diff --git a/mods/ca/bits/reap-snareoverlay.shp b/mods/ca/bits/reap-snareoverlay.shp new file mode 100644 index 0000000000..daea4dcd8b Binary files /dev/null and b/mods/ca/bits/reap-snareoverlay.shp differ diff --git a/mods/ca/bits/reap.shp b/mods/ca/bits/reap.shp new file mode 100644 index 0000000000..44666e55cd Binary files /dev/null and b/mods/ca/bits/reap.shp differ diff --git a/mods/ca/bits/reapicnh.shp b/mods/ca/bits/reapicnh.shp new file mode 100644 index 0000000000..1be2bb1862 Binary files /dev/null and b/mods/ca/bits/reapicnh.shp differ diff --git a/mods/ca/bits/reck.shp b/mods/ca/bits/reck.shp new file mode 100644 index 0000000000..d96d6d8f74 Binary files /dev/null and b/mods/ca/bits/reck.shp differ diff --git a/mods/ca/bits/reckicon.shp b/mods/ca/bits/reckicon.shp new file mode 100644 index 0000000000..f982f0769e Binary files /dev/null and b/mods/ca/bits/reckicon.shp differ diff --git a/mods/ca/bits/redplasmatorp.shp b/mods/ca/bits/redplasmatorp.shp new file mode 100644 index 0000000000..15bad4a706 Binary files /dev/null and b/mods/ca/bits/redplasmatorp.shp differ diff --git a/mods/ca/bits/rhin.shp b/mods/ca/bits/rhin.shp new file mode 100644 index 0000000000..6433e9f940 Binary files /dev/null and b/mods/ca/bits/rhin.shp differ diff --git a/mods/ca/bits/rhinay.shp b/mods/ca/bits/rhinay.shp new file mode 100644 index 0000000000..39ae737e79 Binary files /dev/null and b/mods/ca/bits/rhinay.shp differ diff --git a/mods/ca/bits/rhinayicon.shp b/mods/ca/bits/rhinayicon.shp new file mode 100644 index 0000000000..7f18c60567 Binary files /dev/null and b/mods/ca/bits/rhinayicon.shp differ diff --git a/mods/ca/bits/rhini.shp b/mods/ca/bits/rhini.shp new file mode 100644 index 0000000000..bcea5ae826 Binary files /dev/null and b/mods/ca/bits/rhini.shp differ diff --git a/mods/ca/bits/rhinicon.shp b/mods/ca/bits/rhinicon.shp new file mode 100644 index 0000000000..509d263453 Binary files /dev/null and b/mods/ca/bits/rhinicon.shp differ diff --git a/mods/ca/bits/rhiniicon.shp b/mods/ca/bits/rhiniicon.shp new file mode 100644 index 0000000000..f9771d6363 Binary files /dev/null and b/mods/ca/bits/rhiniicon.shp differ diff --git a/mods/ca/bits/rhinu.shp b/mods/ca/bits/rhinu.shp new file mode 100644 index 0000000000..112ca94133 Binary files /dev/null and b/mods/ca/bits/rhinu.shp differ diff --git a/mods/ca/bits/rhinuicon.shp b/mods/ca/bits/rhinuicon.shp new file mode 100644 index 0000000000..17c18db410 Binary files /dev/null and b/mods/ca/bits/rhinuicon.shp differ diff --git a/mods/ca/bits/rhinuiicon.shp b/mods/ca/bits/rhinuiicon.shp new file mode 100644 index 0000000000..cbb44ffe1e Binary files /dev/null and b/mods/ca/bits/rhinuiicon.shp differ diff --git a/mods/ca/bits/rhiny.shp b/mods/ca/bits/rhiny.shp new file mode 100644 index 0000000000..b61042e8de Binary files /dev/null and b/mods/ca/bits/rhiny.shp differ diff --git a/mods/ca/bits/rhinyicon.shp b/mods/ca/bits/rhinyicon.shp new file mode 100644 index 0000000000..78215e4567 Binary files /dev/null and b/mods/ca/bits/rhinyicon.shp differ diff --git a/mods/ca/bits/ring1sm.shp b/mods/ca/bits/ring1sm.shp new file mode 100644 index 0000000000..169bbe7c75 Binary files /dev/null and b/mods/ca/bits/ring1sm.shp differ diff --git a/mods/ca/bits/rmbc.shp b/mods/ca/bits/rmbc.shp new file mode 100644 index 0000000000..c8d68aef16 Binary files /dev/null and b/mods/ca/bits/rmbc.shp differ diff --git a/mods/ca/bits/rmbcicnh.shp b/mods/ca/bits/rmbcicnh.shp new file mode 100644 index 0000000000..fa685846e7 Binary files /dev/null and b/mods/ca/bits/rmbcicnh.shp differ diff --git a/mods/ca/bits/rmbctorp.shp b/mods/ca/bits/rmbctorp.shp new file mode 100644 index 0000000000..bb9dae5014 Binary files /dev/null and b/mods/ca/bits/rmbctorp.shp differ diff --git a/mods/ca/bits/rmbocicnh.shp b/mods/ca/bits/rmbocicnh.shp deleted file mode 100644 index 489373dcba..0000000000 Binary files a/mods/ca/bits/rmbocicnh.shp and /dev/null differ diff --git a/mods/ca/bits/sapc.shp b/mods/ca/bits/sapc.shp new file mode 100644 index 0000000000..e92bb53fbc Binary files /dev/null and b/mods/ca/bits/sapc.shp differ diff --git a/mods/ca/bits/sapcicon.shp b/mods/ca/bits/sapcicon.shp new file mode 100644 index 0000000000..5d0b0561d8 Binary files /dev/null and b/mods/ca/bits/sapcicon.shp differ diff --git a/mods/ca/bits/sbag.shp b/mods/ca/bits/sbag.shp new file mode 100644 index 0000000000..6768abbbfc Binary files /dev/null and b/mods/ca/bits/sbag.shp differ diff --git a/mods/ca/bits/scrin/anathema.shp b/mods/ca/bits/scrin/anathema.shp new file mode 100644 index 0000000000..8bd9792344 Binary files /dev/null and b/mods/ca/bits/scrin/anathema.shp differ diff --git a/mods/ca/bits/scrin/anathemaicon.shp b/mods/ca/bits/scrin/anathemaicon.shp new file mode 100644 index 0000000000..74481d0e9d Binary files /dev/null and b/mods/ca/bits/scrin/anathemaicon.shp differ diff --git a/mods/ca/bits/scrin/arti.shp b/mods/ca/bits/scrin/arti.shp new file mode 100644 index 0000000000..3a3f8b55ff Binary files /dev/null and b/mods/ca/bits/scrin/arti.shp differ diff --git a/mods/ca/bits/scrin/artiicon.shp b/mods/ca/bits/scrin/artiicon.shp new file mode 100644 index 0000000000..7197a63325 Binary files /dev/null and b/mods/ca/bits/scrin/artiicon.shp differ diff --git a/mods/ca/bits/scrin/atomizeoverlaysm.shp b/mods/ca/bits/scrin/atomizeoverlaysm.shp new file mode 100644 index 0000000000..207be0696e Binary files /dev/null and b/mods/ca/bits/scrin/atomizeoverlaysm.shp differ diff --git a/mods/ca/bits/scrin/audio/anathema.aud b/mods/ca/bits/scrin/audio/anathema.aud new file mode 100644 index 0000000000..98b24e05bf Binary files /dev/null and b/mods/ca/bits/scrin/audio/anathema.aud differ diff --git a/mods/ca/bits/scrin/audio/atomizer-echo1.aud b/mods/ca/bits/scrin/audio/atomizer-echo1.aud new file mode 100644 index 0000000000..3a6d67946e Binary files /dev/null and b/mods/ca/bits/scrin/audio/atomizer-echo1.aud differ diff --git a/mods/ca/bits/scrin/audio/coalesce.aud b/mods/ca/bits/scrin/audio/coalesce.aud new file mode 100644 index 0000000000..5184bba739 Binary files /dev/null and b/mods/ca/bits/scrin/audio/coalesce.aud differ diff --git a/mods/ca/bits/scrin/audio/cscr-action1.aud b/mods/ca/bits/scrin/audio/cscr-action1.aud new file mode 100644 index 0000000000..e5de73ccc7 Binary files /dev/null and b/mods/ca/bits/scrin/audio/cscr-action1.aud differ diff --git a/mods/ca/bits/scrin/audio/cscr-action2.aud b/mods/ca/bits/scrin/audio/cscr-action2.aud new file mode 100644 index 0000000000..9225da7699 Binary files /dev/null and b/mods/ca/bits/scrin/audio/cscr-action2.aud differ diff --git a/mods/ca/bits/scrin/audio/cscr-action3.aud b/mods/ca/bits/scrin/audio/cscr-action3.aud new file mode 100644 index 0000000000..82bf88a9e6 Binary files /dev/null and b/mods/ca/bits/scrin/audio/cscr-action3.aud differ diff --git a/mods/ca/bits/scrin/audio/cscr-action4.aud b/mods/ca/bits/scrin/audio/cscr-action4.aud new file mode 100644 index 0000000000..db3a953fab Binary files /dev/null and b/mods/ca/bits/scrin/audio/cscr-action4.aud differ diff --git a/mods/ca/bits/scrin/audio/cscr-action5.aud b/mods/ca/bits/scrin/audio/cscr-action5.aud new file mode 100644 index 0000000000..a19a6aadb6 Binary files /dev/null and b/mods/ca/bits/scrin/audio/cscr-action5.aud differ diff --git a/mods/ca/bits/scrin/audio/cscr-action6.aud b/mods/ca/bits/scrin/audio/cscr-action6.aud new file mode 100644 index 0000000000..b88cd1a62b Binary files /dev/null and b/mods/ca/bits/scrin/audio/cscr-action6.aud differ diff --git a/mods/ca/bits/scrin/audio/cscr-action7.aud b/mods/ca/bits/scrin/audio/cscr-action7.aud new file mode 100644 index 0000000000..5d37dd49f6 Binary files /dev/null and b/mods/ca/bits/scrin/audio/cscr-action7.aud differ diff --git a/mods/ca/bits/scrin/audio/cscr-fire1.aud b/mods/ca/bits/scrin/audio/cscr-fire1.aud new file mode 100644 index 0000000000..6182678061 Binary files /dev/null and b/mods/ca/bits/scrin/audio/cscr-fire1.aud differ diff --git a/mods/ca/bits/scrin/audio/cscr-select1.aud b/mods/ca/bits/scrin/audio/cscr-select1.aud new file mode 100644 index 0000000000..782f81b1f9 Binary files /dev/null and b/mods/ca/bits/scrin/audio/cscr-select1.aud differ diff --git a/mods/ca/bits/scrin/audio/cscr-select2.aud b/mods/ca/bits/scrin/audio/cscr-select2.aud new file mode 100644 index 0000000000..270226364a Binary files /dev/null and b/mods/ca/bits/scrin/audio/cscr-select2.aud differ diff --git a/mods/ca/bits/scrin/audio/cscr-select3.aud b/mods/ca/bits/scrin/audio/cscr-select3.aud new file mode 100644 index 0000000000..cfac82ab37 Binary files /dev/null and b/mods/ca/bits/scrin/audio/cscr-select3.aud differ diff --git a/mods/ca/bits/scrin/audio/cscr-select4.aud b/mods/ca/bits/scrin/audio/cscr-select4.aud new file mode 100644 index 0000000000..5e23ef7534 Binary files /dev/null and b/mods/ca/bits/scrin/audio/cscr-select4.aud differ diff --git a/mods/ca/bits/scrin/audio/cspk.aud b/mods/ca/bits/scrin/audio/cspk.aud new file mode 100644 index 0000000000..28a22c3660 Binary files /dev/null and b/mods/ca/bits/scrin/audio/cspk.aud differ diff --git a/mods/ca/bits/scrin/audio/etpd-aggro.aud b/mods/ca/bits/scrin/audio/etpd-aggro.aud new file mode 100644 index 0000000000..026b48be7d Binary files /dev/null and b/mods/ca/bits/scrin/audio/etpd-aggro.aud differ diff --git a/mods/ca/bits/scrin/audio/etpd-fire1.aud b/mods/ca/bits/scrin/audio/etpd-fire1.aud new file mode 100644 index 0000000000..46875ccebc Binary files /dev/null and b/mods/ca/bits/scrin/audio/etpd-fire1.aud differ diff --git a/mods/ca/bits/scrin/audio/etpd-fire2.aud b/mods/ca/bits/scrin/audio/etpd-fire2.aud new file mode 100644 index 0000000000..b6d203243e Binary files /dev/null and b/mods/ca/bits/scrin/audio/etpd-fire2.aud differ diff --git a/mods/ca/bits/scrin/audio/evis-glob.aud b/mods/ca/bits/scrin/audio/evis-glob.aud new file mode 100644 index 0000000000..e01f480bee Binary files /dev/null and b/mods/ca/bits/scrin/audio/evis-glob.aud differ diff --git a/mods/ca/bits/scrin/audio/fleetrecall.aud b/mods/ca/bits/scrin/audio/fleetrecall.aud new file mode 100644 index 0000000000..6151631487 Binary files /dev/null and b/mods/ca/bits/scrin/audio/fleetrecall.aud differ diff --git a/mods/ca/bits/scrin/audio/grcl-loop1.aud b/mods/ca/bits/scrin/audio/grcl-loop1.aud new file mode 100644 index 0000000000..85ada98f5b Binary files /dev/null and b/mods/ca/bits/scrin/audio/grcl-loop1.aud differ diff --git a/mods/ca/bits/scrin/audio/grcl-loop2.aud b/mods/ca/bits/scrin/audio/grcl-loop2.aud new file mode 100644 index 0000000000..9cab913896 Binary files /dev/null and b/mods/ca/bits/scrin/audio/grcl-loop2.aud differ diff --git a/mods/ca/bits/scrin/audio/grcl-spawn.aud b/mods/ca/bits/scrin/audio/grcl-spawn.aud new file mode 100644 index 0000000000..3703c491b2 Binary files /dev/null and b/mods/ca/bits/scrin/audio/grcl-spawn.aud differ diff --git a/mods/ca/bits/scrin/audio/gscr-action1.aud b/mods/ca/bits/scrin/audio/gscr-action1.aud new file mode 100644 index 0000000000..782c581ad1 Binary files /dev/null and b/mods/ca/bits/scrin/audio/gscr-action1.aud differ diff --git a/mods/ca/bits/scrin/audio/gscr-action2.aud b/mods/ca/bits/scrin/audio/gscr-action2.aud new file mode 100644 index 0000000000..f84faca474 Binary files /dev/null and b/mods/ca/bits/scrin/audio/gscr-action2.aud differ diff --git a/mods/ca/bits/scrin/audio/gscr-action3.aud b/mods/ca/bits/scrin/audio/gscr-action3.aud new file mode 100644 index 0000000000..5894e36468 Binary files /dev/null and b/mods/ca/bits/scrin/audio/gscr-action3.aud differ diff --git a/mods/ca/bits/scrin/audio/gscr-attack1.aud b/mods/ca/bits/scrin/audio/gscr-attack1.aud new file mode 100644 index 0000000000..2e811f9c79 Binary files /dev/null and b/mods/ca/bits/scrin/audio/gscr-attack1.aud differ diff --git a/mods/ca/bits/scrin/audio/gscr-attack2.aud b/mods/ca/bits/scrin/audio/gscr-attack2.aud new file mode 100644 index 0000000000..798a68b4c4 Binary files /dev/null and b/mods/ca/bits/scrin/audio/gscr-attack2.aud differ diff --git a/mods/ca/bits/scrin/audio/gscr-die1.aud b/mods/ca/bits/scrin/audio/gscr-die1.aud new file mode 100644 index 0000000000..62bd9d726b Binary files /dev/null and b/mods/ca/bits/scrin/audio/gscr-die1.aud differ diff --git a/mods/ca/bits/scrin/audio/gscr-die2.aud b/mods/ca/bits/scrin/audio/gscr-die2.aud new file mode 100644 index 0000000000..2b506de9ab Binary files /dev/null and b/mods/ca/bits/scrin/audio/gscr-die2.aud differ diff --git a/mods/ca/bits/scrin/audio/gscr-select1.aud b/mods/ca/bits/scrin/audio/gscr-select1.aud new file mode 100644 index 0000000000..3048d16ce2 Binary files /dev/null and b/mods/ca/bits/scrin/audio/gscr-select1.aud differ diff --git a/mods/ca/bits/scrin/audio/gscr-select2.aud b/mods/ca/bits/scrin/audio/gscr-select2.aud new file mode 100644 index 0000000000..b480538f21 Binary files /dev/null and b/mods/ca/bits/scrin/audio/gscr-select2.aud differ diff --git a/mods/ca/bits/scrin/audio/hypercharge.aud b/mods/ca/bits/scrin/audio/hypercharge.aud new file mode 100644 index 0000000000..9da938690e Binary files /dev/null and b/mods/ca/bits/scrin/audio/hypercharge.aud differ diff --git a/mods/ca/bits/scrin/audio/impl-fire1.aud b/mods/ca/bits/scrin/audio/impl-fire1.aud new file mode 100644 index 0000000000..7f83b8a7d6 Binary files /dev/null and b/mods/ca/bits/scrin/audio/impl-fire1.aud differ diff --git a/mods/ca/bits/scrin/audio/lacerator-hyperfire1.aud b/mods/ca/bits/scrin/audio/lacerator-hyperfire1.aud new file mode 100644 index 0000000000..7ba24d89e7 Binary files /dev/null and b/mods/ca/bits/scrin/audio/lacerator-hyperfire1.aud differ diff --git a/mods/ca/bits/scrin/audio/lacerator-hyperfire2.aud b/mods/ca/bits/scrin/audio/lacerator-hyperfire2.aud new file mode 100644 index 0000000000..58318739c9 Binary files /dev/null and b/mods/ca/bits/scrin/audio/lacerator-hyperfire2.aud differ diff --git a/mods/ca/bits/scrin/audio/malefic.aud b/mods/ca/bits/scrin/audio/malefic.aud new file mode 100644 index 0000000000..edf26333ca Binary files /dev/null and b/mods/ca/bits/scrin/audio/malefic.aud differ diff --git a/mods/ca/bits/scrin/audio/mastermind-release.aud b/mods/ca/bits/scrin/audio/mastermind-release.aud new file mode 100644 index 0000000000..47d2726b9c Binary files /dev/null and b/mods/ca/bits/scrin/audio/mastermind-release.aud differ diff --git a/mods/ca/bits/scrin/audio/mastermind-shatter.aud b/mods/ca/bits/scrin/audio/mastermind-shatter.aud new file mode 100644 index 0000000000..5634bdab14 Binary files /dev/null and b/mods/ca/bits/scrin/audio/mastermind-shatter.aud differ diff --git a/mods/ca/bits/scrin/audio/mindspark-zap1.aud b/mods/ca/bits/scrin/audio/mindspark-zap1.aud new file mode 100644 index 0000000000..18031ced28 Binary files /dev/null and b/mods/ca/bits/scrin/audio/mindspark-zap1.aud differ diff --git a/mods/ca/bits/scrin/audio/mindspark-zap2.aud b/mods/ca/bits/scrin/audio/mindspark-zap2.aud new file mode 100644 index 0000000000..9d3abd4d7a Binary files /dev/null and b/mods/ca/bits/scrin/audio/mindspark-zap2.aud differ diff --git a/mods/ca/bits/scrin/audio/mrdr-fire1.aud b/mods/ca/bits/scrin/audio/mrdr-fire1.aud new file mode 100644 index 0000000000..deb077668c Binary files /dev/null and b/mods/ca/bits/scrin/audio/mrdr-fire1.aud differ diff --git a/mods/ca/bits/scrin/audio/mrdr-fire2.aud b/mods/ca/bits/scrin/audio/mrdr-fire2.aud new file mode 100644 index 0000000000..fa68404021 Binary files /dev/null and b/mods/ca/bits/scrin/audio/mrdr-fire2.aud differ diff --git a/mods/ca/bits/scrin/audio/mshp-stmrcharge.aud b/mods/ca/bits/scrin/audio/mshp-stmrcharge.aud new file mode 100644 index 0000000000..036e86ccff Binary files /dev/null and b/mods/ca/bits/scrin/audio/mshp-stmrcharge.aud differ diff --git a/mods/ca/bits/scrin/audio/mshp-zap1.aud b/mods/ca/bits/scrin/audio/mshp-zap1.aud new file mode 100644 index 0000000000..2d18a5f0ec Binary files /dev/null and b/mods/ca/bits/scrin/audio/mshp-zap1.aud differ diff --git a/mods/ca/bits/scrin/audio/mshp-zap2.aud b/mods/ca/bits/scrin/audio/mshp-zap2.aud new file mode 100644 index 0000000000..2bfeb91a9a Binary files /dev/null and b/mods/ca/bits/scrin/audio/mshp-zap2.aud differ diff --git a/mods/ca/bits/scrin/audio/mspk1.aud b/mods/ca/bits/scrin/audio/mspk1.aud new file mode 100644 index 0000000000..26761f0af1 Binary files /dev/null and b/mods/ca/bits/scrin/audio/mspk1.aud differ diff --git a/mods/ca/bits/scrin/audio/mspk2.aud b/mods/ca/bits/scrin/audio/mspk2.aud new file mode 100644 index 0000000000..f654dac6a6 Binary files /dev/null and b/mods/ca/bits/scrin/audio/mspk2.aud differ diff --git a/mods/ca/bits/scrin/audio/null-fire1.aud b/mods/ca/bits/scrin/audio/null-fire1.aud new file mode 100644 index 0000000000..79379eac16 Binary files /dev/null and b/mods/ca/bits/scrin/audio/null-fire1.aud differ diff --git a/mods/ca/bits/scrin/audio/null-hit1.aud b/mods/ca/bits/scrin/audio/null-hit1.aud new file mode 100644 index 0000000000..732a17e899 Binary files /dev/null and b/mods/ca/bits/scrin/audio/null-hit1.aud differ diff --git a/mods/ca/bits/scrin/audio/oblt-charge1.aud b/mods/ca/bits/scrin/audio/oblt-charge1.aud new file mode 100644 index 0000000000..b1e63c89e7 Binary files /dev/null and b/mods/ca/bits/scrin/audio/oblt-charge1.aud differ diff --git a/mods/ca/bits/scrin/audio/oblt-charge2.aud b/mods/ca/bits/scrin/audio/oblt-charge2.aud new file mode 100644 index 0000000000..d754fd7544 Binary files /dev/null and b/mods/ca/bits/scrin/audio/oblt-charge2.aud differ diff --git a/mods/ca/bits/scrin/audio/oblt-fire1.aud b/mods/ca/bits/scrin/audio/oblt-fire1.aud new file mode 100644 index 0000000000..643b073cde Binary files /dev/null and b/mods/ca/bits/scrin/audio/oblt-fire1.aud differ diff --git a/mods/ca/bits/scrin/audio/owrath-impact.aud b/mods/ca/bits/scrin/audio/owrath-impact.aud new file mode 100644 index 0000000000..4cdb812443 Binary files /dev/null and b/mods/ca/bits/scrin/audio/owrath-impact.aud differ diff --git a/mods/ca/bits/scrin/audio/owrath-launch.aud b/mods/ca/bits/scrin/audio/owrath-launch.aud new file mode 100644 index 0000000000..5a2a9e16ff Binary files /dev/null and b/mods/ca/bits/scrin/audio/owrath-launch.aud differ diff --git a/mods/ca/bits/scrin/audio/plasmatorp.aud b/mods/ca/bits/scrin/audio/plasmatorp.aud new file mode 100644 index 0000000000..b52ad0954e Binary files /dev/null and b/mods/ca/bits/scrin/audio/plasmatorp.aud differ diff --git a/mods/ca/bits/scrin/audio/plasmatorpcharge.aud b/mods/ca/bits/scrin/audio/plasmatorpcharge.aud new file mode 100644 index 0000000000..958ae4caad Binary files /dev/null and b/mods/ca/bits/scrin/audio/plasmatorpcharge.aud differ diff --git a/mods/ca/bits/scrin/audio/rtripod-cfire1.aud b/mods/ca/bits/scrin/audio/rtpd-cfire1.aud similarity index 100% rename from mods/ca/bits/scrin/audio/rtripod-cfire1.aud rename to mods/ca/bits/scrin/audio/rtpd-cfire1.aud diff --git a/mods/ca/bits/scrin/audio/rtripod-cfire2.aud b/mods/ca/bits/scrin/audio/rtpd-cfire2.aud similarity index 100% rename from mods/ca/bits/scrin/audio/rtripod-cfire2.aud rename to mods/ca/bits/scrin/audio/rtpd-cfire2.aud diff --git a/mods/ca/bits/scrin/audio/rtripod-fire1.aud b/mods/ca/bits/scrin/audio/rtpd-fire1.aud similarity index 100% rename from mods/ca/bits/scrin/audio/rtripod-fire1.aud rename to mods/ca/bits/scrin/audio/rtpd-fire1.aud diff --git a/mods/ca/bits/scrin/audio/rtripod-fire2.aud b/mods/ca/bits/scrin/audio/rtpd-fire2.aud similarity index 100% rename from mods/ca/bits/scrin/audio/rtripod-fire2.aud rename to mods/ca/bits/scrin/audio/rtpd-fire2.aud diff --git a/mods/ca/bits/scrin/audio/rtripod-fire3.aud b/mods/ca/bits/scrin/audio/rtpd-fire3.aud similarity index 100% rename from mods/ca/bits/scrin/audio/rtripod-fire3.aud rename to mods/ca/bits/scrin/audio/rtpd-fire3.aud diff --git a/mods/ca/bits/scrin/audio/s_aldecavail1.aud b/mods/ca/bits/scrin/audio/s_aldecavail1.aud new file mode 100644 index 0000000000..be4865ef62 Binary files /dev/null and b/mods/ca/bits/scrin/audio/s_aldecavail1.aud differ diff --git a/mods/ca/bits/scrin/audio/s_anathrdy1.aud b/mods/ca/bits/scrin/audio/s_anathrdy1.aud new file mode 100644 index 0000000000..5e9e2ad8bb Binary files /dev/null and b/mods/ca/bits/scrin/audio/s_anathrdy1.aud differ diff --git a/mods/ca/bits/scrin/audio/s_aunitl1.aud b/mods/ca/bits/scrin/audio/s_aunitl1.aud new file mode 100644 index 0000000000..a9a19fb187 Binary files /dev/null and b/mods/ca/bits/scrin/audio/s_aunitl1.aud differ diff --git a/mods/ca/bits/scrin/audio/s_bldcap1.aud b/mods/ca/bits/scrin/audio/s_bldcap1.aud new file mode 100644 index 0000000000..d87d3b6203 Binary files /dev/null and b/mods/ca/bits/scrin/audio/s_bldcap1.aud differ diff --git a/mods/ca/bits/scrin/audio/s_buzzrdy.aud b/mods/ca/bits/scrin/audio/s_buzzrdy.aud new file mode 100644 index 0000000000..367f188cef Binary files /dev/null and b/mods/ca/bits/scrin/audio/s_buzzrdy.aud differ diff --git a/mods/ca/bits/scrin/audio/s_cluswarn1.aud b/mods/ca/bits/scrin/audio/s_cluswarn1.aud new file mode 100644 index 0000000000..1fa7779313 Binary files /dev/null and b/mods/ca/bits/scrin/audio/s_cluswarn1.aud differ diff --git a/mods/ca/bits/scrin/audio/s_cmisswarn1.aud b/mods/ca/bits/scrin/audio/s_cmisswarn1.aud new file mode 100644 index 0000000000..cc8943cc39 Binary files /dev/null and b/mods/ca/bits/scrin/audio/s_cmisswarn1.aud differ diff --git a/mods/ca/bits/scrin/audio/s_credit1.aud b/mods/ca/bits/scrin/audio/s_credit1.aud new file mode 100644 index 0000000000..1217f611cc Binary files /dev/null and b/mods/ca/bits/scrin/audio/s_credit1.aud differ diff --git a/mods/ca/bits/scrin/audio/s_cspkrdy1.aud b/mods/ca/bits/scrin/audio/s_cspkrdy1.aud new file mode 100644 index 0000000000..4f84cedcdc Binary files /dev/null and b/mods/ca/bits/scrin/audio/s_cspkrdy1.aud differ diff --git a/mods/ca/bits/scrin/audio/s_enmydet.aud b/mods/ca/bits/scrin/audio/s_enmydet.aud deleted file mode 100644 index 1d18661fc6..0000000000 Binary files a/mods/ca/bits/scrin/audio/s_enmydet.aud and /dev/null differ diff --git a/mods/ca/bits/scrin/audio/s_enmyunitsto1.aud b/mods/ca/bits/scrin/audio/s_enmyunitsto1.aud new file mode 100644 index 0000000000..2bb5a8183d Binary files /dev/null and b/mods/ca/bits/scrin/audio/s_enmyunitsto1.aud differ diff --git a/mods/ca/bits/scrin/audio/s_flare1.aud b/mods/ca/bits/scrin/audio/s_flare1.aud new file mode 100644 index 0000000000..92bd02659c Binary files /dev/null and b/mods/ca/bits/scrin/audio/s_flare1.aud differ diff --git a/mods/ca/bits/scrin/audio/s_fleetrecallrdy1.aud b/mods/ca/bits/scrin/audio/s_fleetrecallrdy1.aud new file mode 100644 index 0000000000..6a210df148 Binary files /dev/null and b/mods/ca/bits/scrin/audio/s_fleetrecallrdy1.aud differ diff --git a/mods/ca/bits/scrin/audio/s_forcechg1.aud b/mods/ca/bits/scrin/audio/s_forcechg1.aud new file mode 100644 index 0000000000..d8aacae9b5 Binary files /dev/null and b/mods/ca/bits/scrin/audio/s_forcechg1.aud differ diff --git a/mods/ca/bits/scrin/audio/s_forcedr1.aud b/mods/ca/bits/scrin/audio/s_forcedr1.aud new file mode 100644 index 0000000000..6a608828f0 Binary files /dev/null and b/mods/ca/bits/scrin/audio/s_forcedr1.aud differ diff --git a/mods/ca/bits/scrin/audio/s_grcoalrdy.aud b/mods/ca/bits/scrin/audio/s_grcoalrdy.aud new file mode 100644 index 0000000000..35d56ebc55 Binary files /dev/null and b/mods/ca/bits/scrin/audio/s_grcoalrdy.aud differ diff --git a/mods/ca/bits/scrin/audio/s_gwayrdy1.aud b/mods/ca/bits/scrin/audio/s_gwayrdy1.aud new file mode 100644 index 0000000000..f4ff9b8057 Binary files /dev/null and b/mods/ca/bits/scrin/audio/s_gwayrdy1.aud differ diff --git a/mods/ca/bits/scrin/audio/s_ichsdrdy.aud b/mods/ca/bits/scrin/audio/s_ichsdrdy.aud new file mode 100644 index 0000000000..c27d22e3a1 Binary files /dev/null and b/mods/ca/bits/scrin/audio/s_ichsdrdy.aud differ diff --git a/mods/ca/bits/scrin/audio/s_ichspkrdy1.aud b/mods/ca/bits/scrin/audio/s_ichspkrdy1.aud new file mode 100644 index 0000000000..8654997fa8 Binary files /dev/null and b/mods/ca/bits/scrin/audio/s_ichspkrdy1.aud differ diff --git a/mods/ca/bits/scrin/audio/s_ionsrgrdy.aud b/mods/ca/bits/scrin/audio/s_ionsrgrdy.aud new file mode 100644 index 0000000000..8ce41e5239 Binary files /dev/null and b/mods/ca/bits/scrin/audio/s_ionsrgrdy.aud differ diff --git a/mods/ca/bits/scrin/audio/s_load1.aud b/mods/ca/bits/scrin/audio/s_load1.aud new file mode 100644 index 0000000000..866f17c096 Binary files /dev/null and b/mods/ca/bits/scrin/audio/s_load1.aud differ diff --git a/mods/ca/bits/scrin/audio/s_nobuild1.aud b/mods/ca/bits/scrin/audio/s_nobuild1.aud index d02793e57e..4313869649 100644 Binary files a/mods/ca/bits/scrin/audio/s_nobuild1.aud and b/mods/ca/bits/scrin/audio/s_nobuild1.aud differ diff --git a/mods/ca/bits/scrin/audio/s_nopowr1.aud b/mods/ca/bits/scrin/audio/s_nopowr1.aud new file mode 100644 index 0000000000..3c6c80236a Binary files /dev/null and b/mods/ca/bits/scrin/audio/s_nopowr1.aud differ diff --git a/mods/ca/bits/scrin/audio/s_ourtechlckd1.aud b/mods/ca/bits/scrin/audio/s_ourtechlckd1.aud new file mode 100644 index 0000000000..8526a05646 Binary files /dev/null and b/mods/ca/bits/scrin/audio/s_ourtechlckd1.aud differ diff --git a/mods/ca/bits/scrin/audio/s_ourtechsto1.aud b/mods/ca/bits/scrin/audio/s_ourtechsto1.aud new file mode 100644 index 0000000000..1ff4c459da Binary files /dev/null and b/mods/ca/bits/scrin/audio/s_ourtechsto1.aud differ diff --git a/mods/ca/bits/scrin/audio/s_owrathrdy1.aud b/mods/ca/bits/scrin/audio/s_owrathrdy1.aud new file mode 100644 index 0000000000..8052e73e0a Binary files /dev/null and b/mods/ca/bits/scrin/audio/s_owrathrdy1.aud differ diff --git a/mods/ca/bits/scrin/audio/s_owrathwarn1.aud b/mods/ca/bits/scrin/audio/s_owrathwarn1.aud new file mode 100644 index 0000000000..a9f320d4c0 Binary files /dev/null and b/mods/ca/bits/scrin/audio/s_owrathwarn1.aud differ diff --git a/mods/ca/bits/scrin/audio/s_patrwarn1.aud b/mods/ca/bits/scrin/audio/s_patrwarn1.aud new file mode 100644 index 0000000000..e44b8fc800 Binary files /dev/null and b/mods/ca/bits/scrin/audio/s_patrwarn1.aud differ diff --git a/mods/ca/bits/scrin/audio/s_bldgprg1.aud b/mods/ca/bits/scrin/audio/s_progres1.aud similarity index 100% rename from mods/ca/bits/scrin/audio/s_bldgprg1.aud rename to mods/ca/bits/scrin/audio/s_progres1.aud diff --git a/mods/ca/bits/scrin/audio/s_pulse1.aud b/mods/ca/bits/scrin/audio/s_pulse1.aud new file mode 100644 index 0000000000..a63681ed6f Binary files /dev/null and b/mods/ca/bits/scrin/audio/s_pulse1.aud differ diff --git a/mods/ca/bits/scrin/audio/s_riftrdy1.aud b/mods/ca/bits/scrin/audio/s_riftrdy1.aud deleted file mode 100644 index 737b8177db..0000000000 Binary files a/mods/ca/bits/scrin/audio/s_riftrdy1.aud and /dev/null differ diff --git a/mods/ca/bits/scrin/audio/s_riftapp1.aud b/mods/ca/bits/scrin/audio/s_riftwarn1.aud similarity index 100% rename from mods/ca/bits/scrin/audio/s_riftapp1.aud rename to mods/ca/bits/scrin/audio/s_riftwarn1.aud diff --git a/mods/ca/bits/scrin/audio/s_rscanrdy.aud b/mods/ca/bits/scrin/audio/s_rscanrdy.aud new file mode 100644 index 0000000000..2d39f25613 Binary files /dev/null and b/mods/ca/bits/scrin/audio/s_rscanrdy.aud differ diff --git a/mods/ca/bits/scrin/audio/s_satlnch1.aud b/mods/ca/bits/scrin/audio/s_satlnch1.aud new file mode 100644 index 0000000000..ca55c909a7 Binary files /dev/null and b/mods/ca/bits/scrin/audio/s_satlnch1.aud differ diff --git a/mods/ca/bits/scrin/audio/s_save1.aud b/mods/ca/bits/scrin/audio/s_save1.aud new file mode 100644 index 0000000000..16fcb0a976 Binary files /dev/null and b/mods/ca/bits/scrin/audio/s_save1.aud differ diff --git a/mods/ca/bits/scrin/audio/s_sprschg.aud b/mods/ca/bits/scrin/audio/s_sprschg.aud new file mode 100644 index 0000000000..e069dc4a14 Binary files /dev/null and b/mods/ca/bits/scrin/audio/s_sprschg.aud differ diff --git a/mods/ca/bits/scrin/audio/s_sprsrdy.aud b/mods/ca/bits/scrin/audio/s_sprsrdy.aud new file mode 100644 index 0000000000..736384a926 Binary files /dev/null and b/mods/ca/bits/scrin/audio/s_sprsrdy.aud differ diff --git a/mods/ca/bits/scrin/audio/s_stormapp1.aud b/mods/ca/bits/scrin/audio/s_stormapp1.aud index 08d71c8f90..26d7632159 100644 Binary files a/mods/ca/bits/scrin/audio/s_stormapp1.aud and b/mods/ca/bits/scrin/audio/s_stormapp1.aud differ diff --git a/mods/ca/bits/scrin/audio/s_strclst1.aud b/mods/ca/bits/scrin/audio/s_strclst1.aud index 590d986170..1ac9891563 100644 Binary files a/mods/ca/bits/scrin/audio/s_strclst1.aud and b/mods/ca/bits/scrin/audio/s_strclst1.aud differ diff --git a/mods/ca/bits/scrin/audio/s_strmspkrdy.aud b/mods/ca/bits/scrin/audio/s_strmspkrdy.aud new file mode 100644 index 0000000000..a53ac86546 Binary files /dev/null and b/mods/ca/bits/scrin/audio/s_strmspkrdy.aud differ diff --git a/mods/ca/bits/scrin/audio/s_subjrdy1.aud b/mods/ca/bits/scrin/audio/s_subjrdy1.aud new file mode 100644 index 0000000000..d4d72f958e Binary files /dev/null and b/mods/ca/bits/scrin/audio/s_subjrdy1.aud differ diff --git a/mods/ca/bits/scrin/audio/s_techacq1.aud b/mods/ca/bits/scrin/audio/s_techacq1.aud new file mode 100644 index 0000000000..eb8d42010e Binary files /dev/null and b/mods/ca/bits/scrin/audio/s_techacq1.aud differ diff --git a/mods/ca/bits/scrin/audio/s_techlckd1.aud b/mods/ca/bits/scrin/audio/s_techlckd1.aud new file mode 100644 index 0000000000..12dda36ee4 Binary files /dev/null and b/mods/ca/bits/scrin/audio/s_techlckd1.aud differ diff --git a/mods/ca/bits/scrin/audio/s_unitsto.aud b/mods/ca/bits/scrin/audio/s_unitsto.aud new file mode 100644 index 0000000000..d2f831f56b Binary files /dev/null and b/mods/ca/bits/scrin/audio/s_unitsto.aud differ diff --git a/mods/ca/bits/scrin/audio/s_voidspkrdy1.aud b/mods/ca/bits/scrin/audio/s_voidspkrdy1.aud new file mode 100644 index 0000000000..44ac3a340f Binary files /dev/null and b/mods/ca/bits/scrin/audio/s_voidspkrdy1.aud differ diff --git a/mods/ca/bits/scrin/audio/seeker-hyperfire1.aud b/mods/ca/bits/scrin/audio/seeker-hyperfire1.aud new file mode 100644 index 0000000000..91e9d96e29 Binary files /dev/null and b/mods/ca/bits/scrin/audio/seeker-hyperfire1.aud differ diff --git a/mods/ca/bits/scrin/audio/seeker-hyperfire2.aud b/mods/ca/bits/scrin/audio/seeker-hyperfire2.aud new file mode 100644 index 0000000000..4107716225 Binary files /dev/null and b/mods/ca/bits/scrin/audio/seeker-hyperfire2.aud differ diff --git a/mods/ca/bits/scrin/audio/stlk-cloak.aud b/mods/ca/bits/scrin/audio/stlk-cloak.aud new file mode 100644 index 0000000000..1099d5ee7f Binary files /dev/null and b/mods/ca/bits/scrin/audio/stlk-cloak.aud differ diff --git a/mods/ca/bits/scrin/audio/stlk-fire1.aud b/mods/ca/bits/scrin/audio/stlk-fire1.aud new file mode 100644 index 0000000000..1d2a73dc09 Binary files /dev/null and b/mods/ca/bits/scrin/audio/stlk-fire1.aud differ diff --git a/mods/ca/bits/scrin/audio/stlk-fire2.aud b/mods/ca/bits/scrin/audio/stlk-fire2.aud new file mode 100644 index 0000000000..c64b7c50d9 Binary files /dev/null and b/mods/ca/bits/scrin/audio/stlk-fire2.aud differ diff --git a/mods/ca/bits/scrin/audio/stlk-uncloak.aud b/mods/ca/bits/scrin/audio/stlk-uncloak.aud new file mode 100644 index 0000000000..4727e6b73f Binary files /dev/null and b/mods/ca/bits/scrin/audio/stlk-uncloak.aud differ diff --git a/mods/ca/bits/scrin/audio/torm-fire1.aud b/mods/ca/bits/scrin/audio/torm-fire1.aud new file mode 100644 index 0000000000..9c96691a15 Binary files /dev/null and b/mods/ca/bits/scrin/audio/torm-fire1.aud differ diff --git a/mods/ca/bits/scrin/audio/torm-fire2.aud b/mods/ca/bits/scrin/audio/torm-fire2.aud new file mode 100644 index 0000000000..32806810fc Binary files /dev/null and b/mods/ca/bits/scrin/audio/torm-fire2.aud differ diff --git a/mods/ca/bits/scrin/audio/veng-fire1.aud b/mods/ca/bits/scrin/audio/veng-fire1.aud new file mode 100644 index 0000000000..809c3be402 Binary files /dev/null and b/mods/ca/bits/scrin/audio/veng-fire1.aud differ diff --git a/mods/ca/bits/scrin/audio/veng-spawn.aud b/mods/ca/bits/scrin/audio/veng-spawn.aud new file mode 100644 index 0000000000..172c503b3f Binary files /dev/null and b/mods/ca/bits/scrin/audio/veng-spawn.aud differ diff --git a/mods/ca/bits/scrin/audio/wchr-fire1.aud b/mods/ca/bits/scrin/audio/wchr-fire1.aud new file mode 100644 index 0000000000..1d4ee82fd4 Binary files /dev/null and b/mods/ca/bits/scrin/audio/wchr-fire1.aud differ diff --git a/mods/ca/bits/scrin/audio/wchr-hit1.aud b/mods/ca/bits/scrin/audio/wchr-hit1.aud new file mode 100644 index 0000000000..6e4870a147 Binary files /dev/null and b/mods/ca/bits/scrin/audio/wchr-hit1.aud differ diff --git a/mods/ca/bits/scrin/feed.shp b/mods/ca/bits/scrin/brst.shp similarity index 100% rename from mods/ca/bits/scrin/feed.shp rename to mods/ca/bits/scrin/brst.shp diff --git a/mods/ca/bits/scrin/brsticon.shp b/mods/ca/bits/scrin/brsticon.shp new file mode 100644 index 0000000000..b6e1f3f1ce Binary files /dev/null and b/mods/ca/bits/scrin/brsticon.shp differ diff --git a/mods/ca/bits/scrin/buzz.shp b/mods/ca/bits/scrin/buzz.shp index 7b789a204c..7a0e72a665 100644 Binary files a/mods/ca/bits/scrin/buzz.shp and b/mods/ca/bits/scrin/buzz.shp differ diff --git a/mods/ca/bits/scrin/buzzmake.shp b/mods/ca/bits/scrin/buzzmake.shp new file mode 100644 index 0000000000..771d11d680 Binary files /dev/null and b/mods/ca/bits/scrin/buzzmake.shp differ diff --git a/mods/ca/bits/scrin/cscr.shp b/mods/ca/bits/scrin/cscr.shp new file mode 100644 index 0000000000..5ec76489c5 Binary files /dev/null and b/mods/ca/bits/scrin/cscr.shp differ diff --git a/mods/ca/bits/scrin/cscricon.shp b/mods/ca/bits/scrin/cscricon.shp new file mode 100644 index 0000000000..3eb35cbeb6 Binary files /dev/null and b/mods/ca/bits/scrin/cscricon.shp differ diff --git a/mods/ca/bits/scrin/cspk.shp b/mods/ca/bits/scrin/cspk.shp new file mode 100644 index 0000000000..977fa1507c Binary files /dev/null and b/mods/ca/bits/scrin/cspk.shp differ diff --git a/mods/ca/bits/scrin/cspkicon.shp b/mods/ca/bits/scrin/cspkicon.shp new file mode 100644 index 0000000000..af00d9f820 Binary files /dev/null and b/mods/ca/bits/scrin/cspkicon.shp differ diff --git a/mods/ca/bits/scrin/enrv.shp b/mods/ca/bits/scrin/enrv.shp index ff6af484af..ac0688bc7f 100644 Binary files a/mods/ca/bits/scrin/enrv.shp and b/mods/ca/bits/scrin/enrv.shp differ diff --git a/mods/ca/bits/scrin/enrvshield.shp b/mods/ca/bits/scrin/enrvshield.shp new file mode 100644 index 0000000000..cf60497a1e Binary files /dev/null and b/mods/ca/bits/scrin/enrvshield.shp differ diff --git a/mods/ca/bits/scrin/etpd.shp b/mods/ca/bits/scrin/etpd.shp new file mode 100644 index 0000000000..56128fd3af Binary files /dev/null and b/mods/ca/bits/scrin/etpd.shp differ diff --git a/mods/ca/bits/scrin/etpdshield.shp b/mods/ca/bits/scrin/etpdshield.shp new file mode 100644 index 0000000000..ab190a160c Binary files /dev/null and b/mods/ca/bits/scrin/etpdshield.shp differ diff --git a/mods/ca/bits/scrin/evis.shp b/mods/ca/bits/scrin/evis.shp new file mode 100644 index 0000000000..d96afc57da Binary files /dev/null and b/mods/ca/bits/scrin/evis.shp differ diff --git a/mods/ca/bits/scrin/evisicon.shp b/mods/ca/bits/scrin/evisicon.shp new file mode 100644 index 0000000000..6485a9d68e Binary files /dev/null and b/mods/ca/bits/scrin/evisicon.shp differ diff --git a/mods/ca/bits/scrin/fireexplodeairsm.shp b/mods/ca/bits/scrin/fireexplodeairsm.shp new file mode 100644 index 0000000000..f5023cb832 Binary files /dev/null and b/mods/ca/bits/scrin/fireexplodeairsm.shp differ diff --git a/mods/ca/bits/scrin/fleetrecall.shp b/mods/ca/bits/scrin/fleetrecall.shp new file mode 100644 index 0000000000..287466c1ff Binary files /dev/null and b/mods/ca/bits/scrin/fleetrecall.shp differ diff --git a/mods/ca/bits/scrin/fleetrecallicon.shp b/mods/ca/bits/scrin/fleetrecallicon.shp new file mode 100644 index 0000000000..709aae6045 Binary files /dev/null and b/mods/ca/bits/scrin/fleetrecallicon.shp differ diff --git a/mods/ca/bits/scrin/gatewayicon.shp b/mods/ca/bits/scrin/gatewayicon.shp new file mode 100644 index 0000000000..dd2f03c17c Binary files /dev/null and b/mods/ca/bits/scrin/gatewayicon.shp differ diff --git a/mods/ca/bits/scrin/grcl.shp b/mods/ca/bits/scrin/grcl.shp new file mode 100644 index 0000000000..8d3b06d2f9 Binary files /dev/null and b/mods/ca/bits/scrin/grcl.shp differ diff --git a/mods/ca/bits/scrin/grclmake.shp b/mods/ca/bits/scrin/grclmake.shp new file mode 100644 index 0000000000..13e8f5904c Binary files /dev/null and b/mods/ca/bits/scrin/grclmake.shp differ diff --git a/mods/ca/bits/scrin/grclpowericon.shp b/mods/ca/bits/scrin/grclpowericon.shp new file mode 100644 index 0000000000..3a9f1eaf39 Binary files /dev/null and b/mods/ca/bits/scrin/grclpowericon.shp differ diff --git a/mods/ca/bits/scrin/gscr.shp b/mods/ca/bits/scrin/gscr.shp new file mode 100644 index 0000000000..f083e9c09c Binary files /dev/null and b/mods/ca/bits/scrin/gscr.shp differ diff --git a/mods/ca/bits/scrin/impl.shp b/mods/ca/bits/scrin/impl.shp new file mode 100644 index 0000000000..a5439663fd Binary files /dev/null and b/mods/ca/bits/scrin/impl.shp differ diff --git a/mods/ca/bits/scrin/implicon.shp b/mods/ca/bits/scrin/implicon.shp new file mode 100644 index 0000000000..937be79100 Binary files /dev/null and b/mods/ca/bits/scrin/implicon.shp differ diff --git a/mods/ca/bits/scrin/intlshield.shp b/mods/ca/bits/scrin/intlshield.shp new file mode 100644 index 0000000000..83576cb7bd Binary files /dev/null and b/mods/ca/bits/scrin/intlshield.shp differ diff --git a/mods/ca/bits/scrin/ionsurgeloop.shp b/mods/ca/bits/scrin/ionsurgeloop.shp index a3c198c8d0..2ed11cd36b 100644 Binary files a/mods/ca/bits/scrin/ionsurgeloop.shp and b/mods/ca/bits/scrin/ionsurgeloop.shp differ diff --git a/mods/ca/bits/scrin/ispk.shp b/mods/ca/bits/scrin/ispk.shp new file mode 100644 index 0000000000..b0f1d6aa1c Binary files /dev/null and b/mods/ca/bits/scrin/ispk.shp differ diff --git a/mods/ca/bits/scrin/ispkicon.shp b/mods/ca/bits/scrin/ispkicon.shp new file mode 100644 index 0000000000..4dfd85803a Binary files /dev/null and b/mods/ca/bits/scrin/ispkicon.shp differ diff --git a/mods/ca/bits/scrin/lchrexplode.shp b/mods/ca/bits/scrin/lchrexplode.shp index 2fb654efdd..8e54e031dd 100644 Binary files a/mods/ca/bits/scrin/lchrexplode.shp and b/mods/ca/bits/scrin/lchrexplode.shp differ diff --git a/mods/ca/bits/scrin/lchrorb.shp b/mods/ca/bits/scrin/lchrorb.shp new file mode 100644 index 0000000000..05f2d931d9 Binary files /dev/null and b/mods/ca/bits/scrin/lchrorb.shp differ diff --git a/mods/ca/bits/scrin/leechhit.shp b/mods/ca/bits/scrin/leechhit.shp index 4682decc51..b3fdff18b5 100644 Binary files a/mods/ca/bits/scrin/leechhit.shp and b/mods/ca/bits/scrin/leechhit.shp differ diff --git a/mods/ca/bits/scrin/leechhitlg.shp b/mods/ca/bits/scrin/leechhitlg.shp index 555bc5d539..c39eb7128c 100644 Binary files a/mods/ca/bits/scrin/leechhitlg.shp and b/mods/ca/bits/scrin/leechhitlg.shp differ diff --git a/mods/ca/bits/scrin/lores-owrathicon.shp b/mods/ca/bits/scrin/lores-owrathicon.shp new file mode 100644 index 0000000000..0b9d0ddc1d Binary files /dev/null and b/mods/ca/bits/scrin/lores-owrathicon.shp differ diff --git a/mods/ca/bits/scrin/mindspark.shp b/mods/ca/bits/scrin/mindspark.shp new file mode 100644 index 0000000000..722b54a6a4 Binary files /dev/null and b/mods/ca/bits/scrin/mindspark.shp differ diff --git a/mods/ca/bits/scrin/miniriftloop.shp b/mods/ca/bits/scrin/miniriftloop.shp deleted file mode 100644 index cc8c59cfc9..0000000000 Binary files a/mods/ca/bits/scrin/miniriftloop.shp and /dev/null differ diff --git a/mods/ca/bits/scrin/mrdr.shp b/mods/ca/bits/scrin/mrdr.shp new file mode 100644 index 0000000000..f14e269f7d Binary files /dev/null and b/mods/ca/bits/scrin/mrdr.shp differ diff --git a/mods/ca/bits/scrin/mrdrdisc.shp b/mods/ca/bits/scrin/mrdrdisc.shp new file mode 100644 index 0000000000..14c255cdd7 Binary files /dev/null and b/mods/ca/bits/scrin/mrdrdisc.shp differ diff --git a/mods/ca/bits/scrin/mrdricon.shp b/mods/ca/bits/scrin/mrdricon.shp new file mode 100644 index 0000000000..55860e1225 Binary files /dev/null and b/mods/ca/bits/scrin/mrdricon.shp differ diff --git a/mods/ca/bits/scrin/mshpshield.shp b/mods/ca/bits/scrin/mshpshield.shp new file mode 100644 index 0000000000..2079dfb858 Binary files /dev/null and b/mods/ca/bits/scrin/mshpshield.shp differ diff --git a/mods/ca/bits/scrin/mshpshockwave.shp b/mods/ca/bits/scrin/mshpshockwave.shp new file mode 100644 index 0000000000..633232ec00 Binary files /dev/null and b/mods/ca/bits/scrin/mshpshockwave.shp differ diff --git a/mods/ca/bits/scrin/null.shp b/mods/ca/bits/scrin/null.shp new file mode 100644 index 0000000000..2cd6063d4c Binary files /dev/null and b/mods/ca/bits/scrin/null.shp differ diff --git a/mods/ca/bits/scrin/nullbolt.shp b/mods/ca/bits/scrin/nullbolt.shp new file mode 100644 index 0000000000..f192fa6e76 Binary files /dev/null and b/mods/ca/bits/scrin/nullbolt.shp differ diff --git a/mods/ca/bits/scrin/nullhit.shp b/mods/ca/bits/scrin/nullhit.shp new file mode 100644 index 0000000000..a34a312f5e Binary files /dev/null and b/mods/ca/bits/scrin/nullhit.shp differ diff --git a/mods/ca/bits/scrin/nullicon.shp b/mods/ca/bits/scrin/nullicon.shp new file mode 100644 index 0000000000..82a152f209 Binary files /dev/null and b/mods/ca/bits/scrin/nullicon.shp differ diff --git a/mods/ca/bits/scrin/nulltrail.shp b/mods/ca/bits/scrin/nulltrail.shp new file mode 100644 index 0000000000..ba86910194 Binary files /dev/null and b/mods/ca/bits/scrin/nulltrail.shp differ diff --git a/mods/ca/bits/scrin/oblt.shp b/mods/ca/bits/scrin/oblt.shp new file mode 100644 index 0000000000..e738b2e7a8 Binary files /dev/null and b/mods/ca/bits/scrin/oblt.shp differ diff --git a/mods/ca/bits/scrin/obltbolt.shp b/mods/ca/bits/scrin/obltbolt.shp new file mode 100644 index 0000000000..4a2ae2763e Binary files /dev/null and b/mods/ca/bits/scrin/obltbolt.shp differ diff --git a/mods/ca/bits/scrin/obltboltcharge.shp b/mods/ca/bits/scrin/obltboltcharge.shp new file mode 100644 index 0000000000..1f083c3e2e Binary files /dev/null and b/mods/ca/bits/scrin/obltboltcharge.shp differ diff --git a/mods/ca/bits/scrin/obltbolttrail.shp b/mods/ca/bits/scrin/obltbolttrail.shp new file mode 100644 index 0000000000..362c877f21 Binary files /dev/null and b/mods/ca/bits/scrin/obltbolttrail.shp differ diff --git a/mods/ca/bits/scrin/oblticon.shp b/mods/ca/bits/scrin/oblticon.shp new file mode 100644 index 0000000000..ed83131e30 Binary files /dev/null and b/mods/ca/bits/scrin/oblticon.shp differ diff --git a/mods/ca/bits/scrin/owrathicon.shp b/mods/ca/bits/scrin/owrathicon.shp new file mode 100644 index 0000000000..1040ae1e0c Binary files /dev/null and b/mods/ca/bits/scrin/owrathicon.shp differ diff --git a/mods/ca/bits/scrin/pdgy.shp b/mods/ca/bits/scrin/pdgy.shp new file mode 100644 index 0000000000..8922607b0e Binary files /dev/null and b/mods/ca/bits/scrin/pdgy.shp differ diff --git a/mods/ca/bits/scrin/pip-ion.shp b/mods/ca/bits/scrin/pip-ion.shp new file mode 100644 index 0000000000..69061e6d41 Binary files /dev/null and b/mods/ca/bits/scrin/pip-ion.shp differ diff --git a/mods/ca/bits/scrin/pip-stcr.shp b/mods/ca/bits/scrin/pip-stcr.shp deleted file mode 100644 index 7d66eeeafc..0000000000 Binary files a/mods/ca/bits/scrin/pip-stcr.shp and /dev/null differ diff --git a/mods/ca/bits/scrin/plasmatorp1.shp b/mods/ca/bits/scrin/plasmatorp1.shp new file mode 100644 index 0000000000..97c6c11d4c Binary files /dev/null and b/mods/ca/bits/scrin/plasmatorp1.shp differ diff --git a/mods/ca/bits/scrin/plasmatorp2.shp b/mods/ca/bits/scrin/plasmatorp2.shp new file mode 100644 index 0000000000..4a0251e217 Binary files /dev/null and b/mods/ca/bits/scrin/plasmatorp2.shp differ diff --git a/mods/ca/bits/scrin/plasmatorp3.shp b/mods/ca/bits/scrin/plasmatorp3.shp new file mode 100644 index 0000000000..ab1ec7ebe9 Binary files /dev/null and b/mods/ca/bits/scrin/plasmatorp3.shp differ diff --git a/mods/ca/bits/scrin/resconvsm.shp b/mods/ca/bits/scrin/resconvsm.shp new file mode 100644 index 0000000000..92bc7204d0 Binary files /dev/null and b/mods/ca/bits/scrin/resconvsm.shp differ diff --git a/mods/ca/bits/scrin/rfgn.shp b/mods/ca/bits/scrin/rfgn.shp new file mode 100644 index 0000000000..fd5ec35443 Binary files /dev/null and b/mods/ca/bits/scrin/rfgn.shp differ diff --git a/mods/ca/bits/scrin/rifticon.shp b/mods/ca/bits/scrin/rfgnicon.shp similarity index 100% rename from mods/ca/bits/scrin/rifticon.shp rename to mods/ca/bits/scrin/rfgnicon.shp diff --git a/mods/ca/bits/scrin/riftmake.shp b/mods/ca/bits/scrin/rfgnmake.shp similarity index 100% rename from mods/ca/bits/scrin/riftmake.shp rename to mods/ca/bits/scrin/rfgnmake.shp diff --git a/mods/ca/bits/scrin/rift.shp b/mods/ca/bits/scrin/rift.shp index fd5ec35443..1d2417e5f6 100644 Binary files a/mods/ca/bits/scrin/rift.shp and b/mods/ca/bits/scrin/rift.shp differ diff --git a/mods/ca/bits/scrin/riftend.shp b/mods/ca/bits/scrin/riftend.shp deleted file mode 100644 index 07e3992a31..0000000000 Binary files a/mods/ca/bits/scrin/riftend.shp and /dev/null differ diff --git a/mods/ca/bits/scrin/riftloop.shp b/mods/ca/bits/scrin/riftloop.shp deleted file mode 100644 index cb59c2ba51..0000000000 Binary files a/mods/ca/bits/scrin/riftloop.shp and /dev/null differ diff --git a/mods/ca/bits/scrin/riftstart.shp b/mods/ca/bits/scrin/riftstart.shp deleted file mode 100644 index 1aaf6735b2..0000000000 Binary files a/mods/ca/bits/scrin/riftstart.shp and /dev/null differ diff --git a/mods/ca/bits/scrin/rptp.shp b/mods/ca/bits/scrin/rtpd.shp similarity index 100% rename from mods/ca/bits/scrin/rptp.shp rename to mods/ca/bits/scrin/rtpd.shp diff --git a/mods/ca/bits/scrin/rptpicon.shp b/mods/ca/bits/scrin/rtpdicon.shp similarity index 100% rename from mods/ca/bits/scrin/rptpicon.shp rename to mods/ca/bits/scrin/rtpdicon.shp diff --git a/mods/ca/bits/scrin/s1icon.shp b/mods/ca/bits/scrin/s1icon.shp index 70977c5989..6df941a84e 100644 Binary files a/mods/ca/bits/scrin/s1icon.shp and b/mods/ca/bits/scrin/s1icon.shp differ diff --git a/mods/ca/bits/scrin/s2icon.shp b/mods/ca/bits/scrin/s2icon.shp index 006a1e0046..eb548c5257 100644 Binary files a/mods/ca/bits/scrin/s2icon.shp and b/mods/ca/bits/scrin/s2icon.shp differ diff --git a/mods/ca/bits/scrin/s3icon.shp b/mods/ca/bits/scrin/s3icon.shp index 954536294a..a4881b9f10 100644 Binary files a/mods/ca/bits/scrin/s3icon.shp and b/mods/ca/bits/scrin/s3icon.shp differ diff --git a/mods/ca/bits/scrin/s4.shp b/mods/ca/bits/scrin/s4.shp index 2385af695e..ce5ff02b64 100644 Binary files a/mods/ca/bits/scrin/s4.shp and b/mods/ca/bits/scrin/s4.shp differ diff --git a/mods/ca/bits/scrin/s4icon.shp b/mods/ca/bits/scrin/s4icon.shp index 34323bc2fe..de4b000013 100644 Binary files a/mods/ca/bits/scrin/s4icon.shp and b/mods/ca/bits/scrin/s4icon.shp differ diff --git a/mods/ca/bits/scrin/s6icon.shp b/mods/ca/bits/scrin/s6icon.shp index 19582d3784..d0782f7088 100644 Binary files a/mods/ca/bits/scrin/s6icon.shp and b/mods/ca/bits/scrin/s6icon.shp differ diff --git a/mods/ca/bits/scrin/scrinmuzz2.shp b/mods/ca/bits/scrin/scrinmuzz2.shp index 19feb18202..aa01b3b40a 100644 Binary files a/mods/ca/bits/scrin/scrinmuzz2.shp and b/mods/ca/bits/scrin/scrinmuzz2.shp differ diff --git a/mods/ca/bits/scrin/scrinmuzz4.shp b/mods/ca/bits/scrin/scrinmuzz4.shp index e5ee7ca9ea..c3e0dc471a 100644 Binary files a/mods/ca/bits/scrin/scrinmuzz4.shp and b/mods/ca/bits/scrin/scrinmuzz4.shp differ diff --git a/mods/ca/bits/scrin/scrinmuzz5.shp b/mods/ca/bits/scrin/scrinmuzz5.shp new file mode 100644 index 0000000000..bd8e077a32 Binary files /dev/null and b/mods/ca/bits/scrin/scrinmuzz5.shp differ diff --git a/mods/ca/bits/scrin/scrinmuzz6.shp b/mods/ca/bits/scrin/scrinmuzz6.shp new file mode 100644 index 0000000000..67e40ed7ae Binary files /dev/null and b/mods/ca/bits/scrin/scrinmuzz6.shp differ diff --git a/mods/ca/bits/scrin/scrinmuzz7.shp b/mods/ca/bits/scrin/scrinmuzz7.shp new file mode 100644 index 0000000000..7fb6401616 Binary files /dev/null and b/mods/ca/bits/scrin/scrinmuzz7.shp differ diff --git a/mods/ca/bits/scrin/scrinpurification.shp b/mods/ca/bits/scrin/scrinpurification.shp new file mode 100644 index 0000000000..435188a78c Binary files /dev/null and b/mods/ca/bits/scrin/scrinpurification.shp differ diff --git a/mods/ca/bits/scrin/scrinpurifier.shp b/mods/ca/bits/scrin/scrinpurifier.shp new file mode 100644 index 0000000000..54f77d009b Binary files /dev/null and b/mods/ca/bits/scrin/scrinpurifier.shp differ diff --git a/mods/ca/bits/scrin/shrw.shp b/mods/ca/bits/scrin/shrw.shp new file mode 100644 index 0000000000..b27d55831f Binary files /dev/null and b/mods/ca/bits/scrin/shrw.shp differ diff --git a/mods/ca/bits/scrin/shrwicon.shp b/mods/ca/bits/scrin/shrwicon.shp new file mode 100644 index 0000000000..3c03119de0 Binary files /dev/null and b/mods/ca/bits/scrin/shrwicon.shp differ diff --git a/mods/ca/bits/scrin/siloscrin.shp b/mods/ca/bits/scrin/siloscrin.shp index a05f907b7e..802041fefa 100644 Binary files a/mods/ca/bits/scrin/siloscrin.shp and b/mods/ca/bits/scrin/siloscrin.shp differ diff --git a/mods/ca/bits/scrin/siloscrinblue.shp b/mods/ca/bits/scrin/siloscrinblue.shp new file mode 100644 index 0000000000..0193e2666d Binary files /dev/null and b/mods/ca/bits/scrin/siloscrinblue.shp differ diff --git a/mods/ca/bits/scrin/smediicon.shp b/mods/ca/bits/scrin/smediicon.shp index b73acca1c6..f8d14fcb73 100644 Binary files a/mods/ca/bits/scrin/smediicon.shp and b/mods/ca/bits/scrin/smediicon.shp differ diff --git a/mods/ca/bits/scrin/sspk.shp b/mods/ca/bits/scrin/sspk.shp new file mode 100644 index 0000000000..5b281231cb Binary files /dev/null and b/mods/ca/bits/scrin/sspk.shp differ diff --git a/mods/ca/bits/scrin/stlk.shp b/mods/ca/bits/scrin/stlk.shp new file mode 100644 index 0000000000..9d02a17624 Binary files /dev/null and b/mods/ca/bits/scrin/stlk.shp differ diff --git a/mods/ca/bits/scrin/stlkicon.shp b/mods/ca/bits/scrin/stlkicon.shp new file mode 100644 index 0000000000..d9525e6763 Binary files /dev/null and b/mods/ca/bits/scrin/stlkicon.shp differ diff --git a/mods/ca/bits/scrin/stmr.shp b/mods/ca/bits/scrin/stmr.shp index 4743b25c74..a32001f0ea 100644 Binary files a/mods/ca/bits/scrin/stmr.shp and b/mods/ca/bits/scrin/stmr.shp differ diff --git a/mods/ca/bits/scrin/stmrshield.shp b/mods/ca/bits/scrin/stmrshield.shp new file mode 100644 index 0000000000..b90d8065dc Binary files /dev/null and b/mods/ca/bits/scrin/stmrshield.shp differ diff --git a/mods/ca/bits/scrin/tbcl.shp b/mods/ca/bits/scrin/tbcl.shp new file mode 100644 index 0000000000..dc256cd604 Binary files /dev/null and b/mods/ca/bits/scrin/tbcl.shp differ diff --git a/mods/ca/bits/scrin/terrain/alien.pal b/mods/ca/bits/scrin/terrain/alien.pal new file mode 100644 index 0000000000..7f3b831dd2 Binary files /dev/null and b/mods/ca/bits/scrin/terrain/alien.pal differ diff --git a/mods/ca/bits/scrin/terrain/scrinflora1.shp b/mods/ca/bits/scrin/terrain/scrinflora1.shp new file mode 100644 index 0000000000..57246187aa Binary files /dev/null and b/mods/ca/bits/scrin/terrain/scrinflora1.shp differ diff --git a/mods/ca/bits/scrin/terrain/scrinflora10.shp b/mods/ca/bits/scrin/terrain/scrinflora10.shp new file mode 100644 index 0000000000..0bce635576 Binary files /dev/null and b/mods/ca/bits/scrin/terrain/scrinflora10.shp differ diff --git a/mods/ca/bits/scrin/terrain/scrinflora11.shp b/mods/ca/bits/scrin/terrain/scrinflora11.shp new file mode 100644 index 0000000000..ec72cc4ac9 Binary files /dev/null and b/mods/ca/bits/scrin/terrain/scrinflora11.shp differ diff --git a/mods/ca/bits/scrin/terrain/scrinflora12.shp b/mods/ca/bits/scrin/terrain/scrinflora12.shp new file mode 100644 index 0000000000..bd5916fc6c Binary files /dev/null and b/mods/ca/bits/scrin/terrain/scrinflora12.shp differ diff --git a/mods/ca/bits/scrin/terrain/scrinflora13.shp b/mods/ca/bits/scrin/terrain/scrinflora13.shp new file mode 100644 index 0000000000..289d755475 Binary files /dev/null and b/mods/ca/bits/scrin/terrain/scrinflora13.shp differ diff --git a/mods/ca/bits/scrin/terrain/scrinflora14.shp b/mods/ca/bits/scrin/terrain/scrinflora14.shp new file mode 100644 index 0000000000..03c3048121 Binary files /dev/null and b/mods/ca/bits/scrin/terrain/scrinflora14.shp differ diff --git a/mods/ca/bits/scrin/terrain/scrinflora2.shp b/mods/ca/bits/scrin/terrain/scrinflora2.shp new file mode 100644 index 0000000000..73351b695c Binary files /dev/null and b/mods/ca/bits/scrin/terrain/scrinflora2.shp differ diff --git a/mods/ca/bits/scrin/terrain/scrinflora3.shp b/mods/ca/bits/scrin/terrain/scrinflora3.shp new file mode 100644 index 0000000000..46480b80b7 Binary files /dev/null and b/mods/ca/bits/scrin/terrain/scrinflora3.shp differ diff --git a/mods/ca/bits/scrin/terrain/scrinflora4.shp b/mods/ca/bits/scrin/terrain/scrinflora4.shp new file mode 100644 index 0000000000..65e25825a0 Binary files /dev/null and b/mods/ca/bits/scrin/terrain/scrinflora4.shp differ diff --git a/mods/ca/bits/scrin/terrain/scrinflora5.shp b/mods/ca/bits/scrin/terrain/scrinflora5.shp new file mode 100644 index 0000000000..e185384a02 Binary files /dev/null and b/mods/ca/bits/scrin/terrain/scrinflora5.shp differ diff --git a/mods/ca/bits/scrin/terrain/scrinflora6.shp b/mods/ca/bits/scrin/terrain/scrinflora6.shp new file mode 100644 index 0000000000..aefa678bb6 Binary files /dev/null and b/mods/ca/bits/scrin/terrain/scrinflora6.shp differ diff --git a/mods/ca/bits/scrin/terrain/scrinflora7.shp b/mods/ca/bits/scrin/terrain/scrinflora7.shp new file mode 100644 index 0000000000..e0485e9c71 Binary files /dev/null and b/mods/ca/bits/scrin/terrain/scrinflora7.shp differ diff --git a/mods/ca/bits/scrin/terrain/scrinflora8.shp b/mods/ca/bits/scrin/terrain/scrinflora8.shp new file mode 100644 index 0000000000..040a3808e9 Binary files /dev/null and b/mods/ca/bits/scrin/terrain/scrinflora8.shp differ diff --git a/mods/ca/bits/scrin/terrain/scrinflora9.shp b/mods/ca/bits/scrin/terrain/scrinflora9.shp new file mode 100644 index 0000000000..851b2a7768 Binary files /dev/null and b/mods/ca/bits/scrin/terrain/scrinflora9.shp differ diff --git a/mods/ca/bits/scrin/tibexplode.shp b/mods/ca/bits/scrin/tibexplode.shp deleted file mode 100644 index 11b468a745..0000000000 Binary files a/mods/ca/bits/scrin/tibexplode.shp and /dev/null differ diff --git a/mods/ca/bits/scrin/tibexplodesm.shp b/mods/ca/bits/scrin/tibexplodesm.shp deleted file mode 100644 index 41a3f93778..0000000000 Binary files a/mods/ca/bits/scrin/tibexplodesm.shp and /dev/null differ diff --git a/mods/ca/bits/scrin/tibmeteor.shp b/mods/ca/bits/scrin/tibmeteor.shp new file mode 100644 index 0000000000..9cbd32a1bc Binary files /dev/null and b/mods/ca/bits/scrin/tibmeteor.shp differ diff --git a/mods/ca/bits/scrin/tibmeteorhit.shp b/mods/ca/bits/scrin/tibmeteorhit.shp new file mode 100644 index 0000000000..0db383fab2 Binary files /dev/null and b/mods/ca/bits/scrin/tibmeteorhit.shp differ diff --git a/mods/ca/bits/scrin/torm.shp b/mods/ca/bits/scrin/torm.shp new file mode 100644 index 0000000000..675851ac93 Binary files /dev/null and b/mods/ca/bits/scrin/torm.shp differ diff --git a/mods/ca/bits/scrin/tormicon.shp b/mods/ca/bits/scrin/tormicon.shp new file mode 100644 index 0000000000..eb64eeb3ec Binary files /dev/null and b/mods/ca/bits/scrin/tormicon.shp differ diff --git a/mods/ca/bits/scrin/upg-allegianceicon.shp b/mods/ca/bits/scrin/upg-allegianceicon.shp new file mode 100644 index 0000000000..9a995d7a31 Binary files /dev/null and b/mods/ca/bits/scrin/upg-allegianceicon.shp differ diff --git a/mods/ca/bits/scrin/upg-blinkicon.shp b/mods/ca/bits/scrin/upg-blinkicon.shp new file mode 100644 index 0000000000..1f41fca373 Binary files /dev/null and b/mods/ca/bits/scrin/upg-blinkicon.shp differ diff --git a/mods/ca/bits/scrin/upg-coalescenceicon.shp b/mods/ca/bits/scrin/upg-coalescenceicon.shp new file mode 100644 index 0000000000..a74dbb26d7 Binary files /dev/null and b/mods/ca/bits/scrin/upg-coalescenceicon.shp differ diff --git a/mods/ca/bits/scrin/upg-evisicon.shp b/mods/ca/bits/scrin/upg-evisicon.shp new file mode 100644 index 0000000000..34860ee182 Binary files /dev/null and b/mods/ca/bits/scrin/upg-evisicon.shp differ diff --git a/mods/ca/bits/scrin/upg-fleetshieldsicon.shp b/mods/ca/bits/scrin/upg-fleetshieldsicon.shp index 7ffcf0c370..6e5f0dcfb2 100644 Binary files a/mods/ca/bits/scrin/upg-fleetshieldsicon.shp and b/mods/ca/bits/scrin/upg-fleetshieldsicon.shp differ diff --git a/mods/ca/bits/scrin/upg-hypericon.shp b/mods/ca/bits/scrin/upg-hypericon.shp new file mode 100644 index 0000000000..0ba1033172 Binary files /dev/null and b/mods/ca/bits/scrin/upg-hypericon.shp differ diff --git a/mods/ca/bits/scrin/upg-implicon.shp b/mods/ca/bits/scrin/upg-implicon.shp new file mode 100644 index 0000000000..a931f273f0 Binary files /dev/null and b/mods/ca/bits/scrin/upg-implicon.shp differ diff --git a/mods/ca/bits/scrin/upg-loyalisticon.shp b/mods/ca/bits/scrin/upg-loyalisticon.shp new file mode 100644 index 0000000000..01afcef859 Binary files /dev/null and b/mods/ca/bits/scrin/upg-loyalisticon.shp differ diff --git a/mods/ca/bits/scrin/upg-maleficicon.shp b/mods/ca/bits/scrin/upg-maleficicon.shp new file mode 100644 index 0000000000..3d37ce5ace Binary files /dev/null and b/mods/ca/bits/scrin/upg-maleficicon.shp differ diff --git a/mods/ca/bits/scrin/upg-rebelicon.shp b/mods/ca/bits/scrin/upg-rebelicon.shp new file mode 100644 index 0000000000..407c961180 Binary files /dev/null and b/mods/ca/bits/scrin/upg-rebelicon.shp differ diff --git a/mods/ca/bits/scrin/upg-resconvicon.shp b/mods/ca/bits/scrin/upg-resconvicon.shp index 7977ab7988..a7ec1ae5e0 100644 Binary files a/mods/ca/bits/scrin/upg-resconvicon.shp and b/mods/ca/bits/scrin/upg-resconvicon.shp differ diff --git a/mods/ca/bits/scrin/upg-shrwicon.shp b/mods/ca/bits/scrin/upg-shrwicon.shp new file mode 100644 index 0000000000..0fb8471ba0 Binary files /dev/null and b/mods/ca/bits/scrin/upg-shrwicon.shp differ diff --git a/mods/ca/bits/scrin/upg-stellaricon.shp b/mods/ca/bits/scrin/upg-stellaricon.shp new file mode 100644 index 0000000000..f39b95af36 Binary files /dev/null and b/mods/ca/bits/scrin/upg-stellaricon.shp differ diff --git a/mods/ca/bits/scrin/upg-stlkicon.shp b/mods/ca/bits/scrin/upg-stlkicon.shp new file mode 100644 index 0000000000..01402a67e1 Binary files /dev/null and b/mods/ca/bits/scrin/upg-stlkicon.shp differ diff --git a/mods/ca/bits/scrin/veng.shp b/mods/ca/bits/scrin/veng.shp new file mode 100644 index 0000000000..e9a7b67ab8 Binary files /dev/null and b/mods/ca/bits/scrin/veng.shp differ diff --git a/mods/ca/bits/scrin/voidpulse.shp b/mods/ca/bits/scrin/voidpulse.shp new file mode 100644 index 0000000000..6d41c9506e Binary files /dev/null and b/mods/ca/bits/scrin/voidpulse.shp differ diff --git a/mods/ca/bits/scrin/vspk.shp b/mods/ca/bits/scrin/vspk.shp new file mode 100644 index 0000000000..d72e6589a8 Binary files /dev/null and b/mods/ca/bits/scrin/vspk.shp differ diff --git a/mods/ca/bits/scrin/vspkicon.shp b/mods/ca/bits/scrin/vspkicon.shp new file mode 100644 index 0000000000..110553c402 Binary files /dev/null and b/mods/ca/bits/scrin/vspkicon.shp differ diff --git a/mods/ca/bits/scrin/watched.shp b/mods/ca/bits/scrin/watched.shp new file mode 100644 index 0000000000..9f91b44449 Binary files /dev/null and b/mods/ca/bits/scrin/watched.shp differ diff --git a/mods/ca/bits/scrin/wchr.shp b/mods/ca/bits/scrin/wchr.shp new file mode 100644 index 0000000000..88f4aaab39 Binary files /dev/null and b/mods/ca/bits/scrin/wchr.shp differ diff --git a/mods/ca/bits/scrin/wchrdart.shp b/mods/ca/bits/scrin/wchrdart.shp new file mode 100644 index 0000000000..dfec775c82 Binary files /dev/null and b/mods/ca/bits/scrin/wchrdart.shp differ diff --git a/mods/ca/bits/scrin/wchricon.shp b/mods/ca/bits/scrin/wchricon.shp new file mode 100644 index 0000000000..a93144d83d Binary files /dev/null and b/mods/ca/bits/scrin/wchricon.shp differ diff --git a/mods/ca/bits/scrin/wormhole.shp b/mods/ca/bits/scrin/wormhole.shp index 42642c4139..2f769b8ab9 100644 Binary files a/mods/ca/bits/scrin/wormhole.shp and b/mods/ca/bits/scrin/wormhole.shp differ diff --git a/mods/ca/bits/scrin/wormholelg.shp b/mods/ca/bits/scrin/wormholelg.shp new file mode 100644 index 0000000000..6cef1d861b Binary files /dev/null and b/mods/ca/bits/scrin/wormholelg.shp differ diff --git a/mods/ca/bits/scrin/wormholeunstable.shp b/mods/ca/bits/scrin/wormholeunstable.shp new file mode 100644 index 0000000000..a66425499c Binary files /dev/null and b/mods/ca/bits/scrin/wormholeunstable.shp differ diff --git a/mods/ca/bits/scrin/wormholexl.shp b/mods/ca/bits/scrin/wormholexl.shp new file mode 100644 index 0000000000..97e6c15068 Binary files /dev/null and b/mods/ca/bits/scrin/wormholexl.shp differ diff --git a/mods/ca/bits/scrin/wormholexxl.shp b/mods/ca/bits/scrin/wormholexxl.shp new file mode 100644 index 0000000000..1ddd75fbbb Binary files /dev/null and b/mods/ca/bits/scrin/wormholexxl.shp differ diff --git a/mods/ca/bits/scrinmouse.shp b/mods/ca/bits/scrinmouse.shp new file mode 100644 index 0000000000..826464cd1e Binary files /dev/null and b/mods/ca/bits/scrinmouse.shp differ diff --git a/mods/ca/bits/seal.shp b/mods/ca/bits/seal.shp new file mode 100644 index 0000000000..6dd8cb202b Binary files /dev/null and b/mods/ca/bits/seal.shp differ diff --git a/mods/ca/bits/sealicon.shp b/mods/ca/bits/sealicon.shp new file mode 100644 index 0000000000..c3fba94322 Binary files /dev/null and b/mods/ca/bits/sealicon.shp differ diff --git a/mods/ca/bits/sealswim.shp b/mods/ca/bits/sealswim.shp new file mode 100644 index 0000000000..27550fdf75 Binary files /dev/null and b/mods/ca/bits/sealswim.shp differ diff --git a/mods/ca/bits/sealswimidle.shp b/mods/ca/bits/sealswimidle.shp new file mode 100644 index 0000000000..ae75bc1e81 Binary files /dev/null and b/mods/ca/bits/sealswimidle.shp differ diff --git a/mods/ca/bits/sendcashicon.shp b/mods/ca/bits/sendcashicon.shp new file mode 100644 index 0000000000..6b4001d59b Binary files /dev/null and b/mods/ca/bits/sendcashicon.shp differ diff --git a/mods/ca/bits/shde.shp b/mods/ca/bits/shde.shp new file mode 100644 index 0000000000..4b01ef0cb5 Binary files /dev/null and b/mods/ca/bits/shde.shp differ diff --git a/mods/ca/bits/shdeicnh.shp b/mods/ca/bits/shdeicnh.shp new file mode 100644 index 0000000000..4f81109b12 Binary files /dev/null and b/mods/ca/bits/shdeicnh.shp differ diff --git a/mods/ca/bits/smericon.shp b/mods/ca/bits/smericon.shp new file mode 100644 index 0000000000..24b0f68974 Binary files /dev/null and b/mods/ca/bits/smericon.shp differ diff --git a/mods/ca/bits/smig.shp b/mods/ca/bits/smig.shp new file mode 100644 index 0000000000..d02055848e Binary files /dev/null and b/mods/ca/bits/smig.shp differ diff --git a/mods/ca/bits/smokestack1.shp b/mods/ca/bits/smokestack1.shp new file mode 100644 index 0000000000..0f8034f2cf Binary files /dev/null and b/mods/ca/bits/smokestack1.shp differ diff --git a/mods/ca/bits/smokestack2.shp b/mods/ca/bits/smokestack2.shp new file mode 100644 index 0000000000..b09725ecb6 Binary files /dev/null and b/mods/ca/bits/smokestack2.shp differ diff --git a/mods/ca/bits/smokestack3.shp b/mods/ca/bits/smokestack3.shp new file mode 100644 index 0000000000..fb27c747f3 Binary files /dev/null and b/mods/ca/bits/smokestack3.shp differ diff --git a/mods/ca/bits/smokey2.shp b/mods/ca/bits/smokey2.shp index bd96b10e27..82645baef2 100644 Binary files a/mods/ca/bits/smokey2.shp and b/mods/ca/bits/smokey2.shp differ diff --git a/mods/ca/bits/smokey3.shp b/mods/ca/bits/smokey3.shp new file mode 100644 index 0000000000..562fead2b1 Binary files /dev/null and b/mods/ca/bits/smokey3.shp differ diff --git a/mods/ca/bits/sniper.shp b/mods/ca/bits/sniper.shp deleted file mode 100644 index 8b672658f1..0000000000 Binary files a/mods/ca/bits/sniper.shp and /dev/null differ diff --git a/mods/ca/bits/snow/rtib1.sno b/mods/ca/bits/snow/rtib1.sno new file mode 100644 index 0000000000..87d0b1e97d Binary files /dev/null and b/mods/ca/bits/snow/rtib1.sno differ diff --git a/mods/ca/bits/snow/rtib10.sno b/mods/ca/bits/snow/rtib10.sno new file mode 100644 index 0000000000..ecf494904a Binary files /dev/null and b/mods/ca/bits/snow/rtib10.sno differ diff --git a/mods/ca/bits/snow/rtib11.sno b/mods/ca/bits/snow/rtib11.sno new file mode 100644 index 0000000000..45a3d925ec Binary files /dev/null and b/mods/ca/bits/snow/rtib11.sno differ diff --git a/mods/ca/bits/snow/rtib12.sno b/mods/ca/bits/snow/rtib12.sno new file mode 100644 index 0000000000..22ca65f165 Binary files /dev/null and b/mods/ca/bits/snow/rtib12.sno differ diff --git a/mods/ca/bits/snow/rtib2.sno b/mods/ca/bits/snow/rtib2.sno new file mode 100644 index 0000000000..8f3db46ef6 Binary files /dev/null and b/mods/ca/bits/snow/rtib2.sno differ diff --git a/mods/ca/bits/snow/rtib3.sno b/mods/ca/bits/snow/rtib3.sno new file mode 100644 index 0000000000..40331ed0a8 Binary files /dev/null and b/mods/ca/bits/snow/rtib3.sno differ diff --git a/mods/ca/bits/snow/rtib4.sno b/mods/ca/bits/snow/rtib4.sno new file mode 100644 index 0000000000..df7877be92 Binary files /dev/null and b/mods/ca/bits/snow/rtib4.sno differ diff --git a/mods/ca/bits/snow/rtib5.sno b/mods/ca/bits/snow/rtib5.sno new file mode 100644 index 0000000000..f6f6d69439 Binary files /dev/null and b/mods/ca/bits/snow/rtib5.sno differ diff --git a/mods/ca/bits/snow/rtib6.sno b/mods/ca/bits/snow/rtib6.sno new file mode 100644 index 0000000000..cd18a29490 Binary files /dev/null and b/mods/ca/bits/snow/rtib6.sno differ diff --git a/mods/ca/bits/snow/rtib7.sno b/mods/ca/bits/snow/rtib7.sno new file mode 100644 index 0000000000..0817bea8e8 Binary files /dev/null and b/mods/ca/bits/snow/rtib7.sno differ diff --git a/mods/ca/bits/snow/rtib8.sno b/mods/ca/bits/snow/rtib8.sno new file mode 100644 index 0000000000..1d6797ef5d Binary files /dev/null and b/mods/ca/bits/snow/rtib8.sno differ diff --git a/mods/ca/bits/snow/rtib9.sno b/mods/ca/bits/snow/rtib9.sno new file mode 100644 index 0000000000..160f4ce11e Binary files /dev/null and b/mods/ca/bits/snow/rtib9.sno differ diff --git a/mods/ca/bits/snow/split2.sno b/mods/ca/bits/snow/split2.sno index ee6bcae498..51bc11f1b0 100644 Binary files a/mods/ca/bits/snow/split2.sno and b/mods/ca/bits/snow/split2.sno differ diff --git a/mods/ca/bits/snow/temptdsnow.pal b/mods/ca/bits/snow/temptdsnow.pal new file mode 100644 index 0000000000..689fc170a1 Binary files /dev/null and b/mods/ca/bits/snow/temptdsnow.pal differ diff --git a/mods/ca/bits/snow/ti1.sno b/mods/ca/bits/snow/ti1.sno new file mode 100644 index 0000000000..2c2fa6f3a3 Binary files /dev/null and b/mods/ca/bits/snow/ti1.sno differ diff --git a/mods/ca/bits/snow/ti10.sno b/mods/ca/bits/snow/ti10.sno new file mode 100644 index 0000000000..2435204289 Binary files /dev/null and b/mods/ca/bits/snow/ti10.sno differ diff --git a/mods/ca/bits/snow/ti11.sno b/mods/ca/bits/snow/ti11.sno new file mode 100644 index 0000000000..ba700afb0e Binary files /dev/null and b/mods/ca/bits/snow/ti11.sno differ diff --git a/mods/ca/bits/snow/ti12.sno b/mods/ca/bits/snow/ti12.sno new file mode 100644 index 0000000000..08d63c6ba0 Binary files /dev/null and b/mods/ca/bits/snow/ti12.sno differ diff --git a/mods/ca/bits/snow/ti2.sno b/mods/ca/bits/snow/ti2.sno new file mode 100644 index 0000000000..c9fa0b15a0 Binary files /dev/null and b/mods/ca/bits/snow/ti2.sno differ diff --git a/mods/ca/bits/snow/ti3.sno b/mods/ca/bits/snow/ti3.sno new file mode 100644 index 0000000000..698829abea Binary files /dev/null and b/mods/ca/bits/snow/ti3.sno differ diff --git a/mods/ca/bits/snow/ti4.sno b/mods/ca/bits/snow/ti4.sno new file mode 100644 index 0000000000..eb873f9465 Binary files /dev/null and b/mods/ca/bits/snow/ti4.sno differ diff --git a/mods/ca/bits/snow/ti5.sno b/mods/ca/bits/snow/ti5.sno new file mode 100644 index 0000000000..0aae12f488 Binary files /dev/null and b/mods/ca/bits/snow/ti5.sno differ diff --git a/mods/ca/bits/snow/ti6.sno b/mods/ca/bits/snow/ti6.sno new file mode 100644 index 0000000000..01befdfc33 Binary files /dev/null and b/mods/ca/bits/snow/ti6.sno differ diff --git a/mods/ca/bits/snow/ti7.sno b/mods/ca/bits/snow/ti7.sno new file mode 100644 index 0000000000..256c52c3c1 Binary files /dev/null and b/mods/ca/bits/snow/ti7.sno differ diff --git a/mods/ca/bits/snow/ti8.sno b/mods/ca/bits/snow/ti8.sno new file mode 100644 index 0000000000..cd9c4cc271 Binary files /dev/null and b/mods/ca/bits/snow/ti8.sno differ diff --git a/mods/ca/bits/snow/ti9.sno b/mods/ca/bits/snow/ti9.sno new file mode 100644 index 0000000000..702b37c4c7 Binary files /dev/null and b/mods/ca/bits/snow/ti9.sno differ diff --git a/mods/ca/bits/sonicimpact.shp b/mods/ca/bits/sonicimpact.shp new file mode 100644 index 0000000000..9b06275416 Binary files /dev/null and b/mods/ca/bits/sonicimpact.shp differ diff --git a/mods/ca/bits/sonicimpactsm.shp b/mods/ca/bits/sonicimpactsm.shp new file mode 100644 index 0000000000..a102e8a730 Binary files /dev/null and b/mods/ca/bits/sonicimpactsm.shp differ diff --git a/mods/ca/bits/sonicwave.shp b/mods/ca/bits/sonicwave.shp new file mode 100644 index 0000000000..3fd7696b35 Binary files /dev/null and b/mods/ca/bits/sonicwave.shp differ diff --git a/mods/ca/bits/sonicwaveupg.shp b/mods/ca/bits/sonicwaveupg.shp new file mode 100644 index 0000000000..dd7dce2640 Binary files /dev/null and b/mods/ca/bits/sonicwaveupg.shp differ diff --git a/mods/ca/bits/stnktupg.shp b/mods/ca/bits/stnktupg.shp new file mode 100644 index 0000000000..4ba08246e9 Binary files /dev/null and b/mods/ca/bits/stnktupg.shp differ diff --git a/mods/ca/bits/strafeicon.shp b/mods/ca/bits/strafeicon.shp new file mode 100644 index 0000000000..97e07db3b5 Binary files /dev/null and b/mods/ca/bits/strafeicon.shp differ diff --git a/mods/ca/bits/substrikehole.shp b/mods/ca/bits/substrikehole.shp new file mode 100644 index 0000000000..26c7b703a7 Binary files /dev/null and b/mods/ca/bits/substrikehole.shp differ diff --git a/mods/ca/bits/substrikeicon.shp b/mods/ca/bits/substrikeicon.shp new file mode 100644 index 0000000000..148eed3e9d Binary files /dev/null and b/mods/ca/bits/substrikeicon.shp differ diff --git a/mods/ca/bits/tankdropicon.shp b/mods/ca/bits/tankdropicon.shp new file mode 100644 index 0000000000..7a472dd1ea Binary files /dev/null and b/mods/ca/bits/tankdropicon.shp differ diff --git a/mods/ca/bits/targetpainter.shp b/mods/ca/bits/targetpainter.shp new file mode 100644 index 0000000000..89e0ceb8fe Binary files /dev/null and b/mods/ca/bits/targetpainter.shp differ diff --git a/mods/ca/bits/tdogicon.shp b/mods/ca/bits/tdogicon.shp new file mode 100644 index 0000000000..ceb766155d Binary files /dev/null and b/mods/ca/bits/tdogicon.shp differ diff --git a/mods/ca/bits/techhackicon.shp b/mods/ca/bits/techhackicon.shp new file mode 100644 index 0000000000..1c5acee783 Binary files /dev/null and b/mods/ca/bits/techhackicon.shp differ diff --git a/mods/ca/bits/temp/cave01.tem b/mods/ca/bits/temp/cave01.tem new file mode 100644 index 0000000000..0a6ddc7277 Binary files /dev/null and b/mods/ca/bits/temp/cave01.tem differ diff --git a/mods/ca/bits/temp/cave02.tem b/mods/ca/bits/temp/cave02.tem new file mode 100644 index 0000000000..f0a640cc85 Binary files /dev/null and b/mods/ca/bits/temp/cave02.tem differ diff --git a/mods/ca/bits/temp/cave03.tem b/mods/ca/bits/temp/cave03.tem new file mode 100644 index 0000000000..f67b402528 Binary files /dev/null and b/mods/ca/bits/temp/cave03.tem differ diff --git a/mods/ca/bits/temp/cave04.tem b/mods/ca/bits/temp/cave04.tem new file mode 100644 index 0000000000..54e9ff5b19 Binary files /dev/null and b/mods/ca/bits/temp/cave04.tem differ diff --git a/mods/ca/bits/temp/cave05.tem b/mods/ca/bits/temp/cave05.tem new file mode 100644 index 0000000000..2b85e1bbe4 Binary files /dev/null and b/mods/ca/bits/temp/cave05.tem differ diff --git a/mods/ca/bits/temp/cave06.tem b/mods/ca/bits/temp/cave06.tem new file mode 100644 index 0000000000..a28d6342f1 Binary files /dev/null and b/mods/ca/bits/temp/cave06.tem differ diff --git a/mods/ca/bits/temp/cave07.tem b/mods/ca/bits/temp/cave07.tem new file mode 100644 index 0000000000..43d0e8c10c Binary files /dev/null and b/mods/ca/bits/temp/cave07.tem differ diff --git a/mods/ca/bits/temp/cave08.tem b/mods/ca/bits/temp/cave08.tem new file mode 100644 index 0000000000..755471f04d Binary files /dev/null and b/mods/ca/bits/temp/cave08.tem differ diff --git a/mods/ca/bits/temp/cave09.tem b/mods/ca/bits/temp/cave09.tem new file mode 100644 index 0000000000..1ff99317db Binary files /dev/null and b/mods/ca/bits/temp/cave09.tem differ diff --git a/mods/ca/bits/temp/cave10.tem b/mods/ca/bits/temp/cave10.tem new file mode 100644 index 0000000000..6ffe364319 Binary files /dev/null and b/mods/ca/bits/temp/cave10.tem differ diff --git a/mods/ca/bits/temp/cave11.tem b/mods/ca/bits/temp/cave11.tem new file mode 100644 index 0000000000..5e6378cd73 Binary files /dev/null and b/mods/ca/bits/temp/cave11.tem differ diff --git a/mods/ca/bits/temp/cave12.tem b/mods/ca/bits/temp/cave12.tem new file mode 100644 index 0000000000..f2b9cdde69 Binary files /dev/null and b/mods/ca/bits/temp/cave12.tem differ diff --git a/mods/ca/bits/temp/cave13.tem b/mods/ca/bits/temp/cave13.tem new file mode 100644 index 0000000000..e72704fdae Binary files /dev/null and b/mods/ca/bits/temp/cave13.tem differ diff --git a/mods/ca/bits/temp/cave14.tem b/mods/ca/bits/temp/cave14.tem new file mode 100644 index 0000000000..5c8f2cb415 Binary files /dev/null and b/mods/ca/bits/temp/cave14.tem differ diff --git a/mods/ca/bits/temp/cave15.tem b/mods/ca/bits/temp/cave15.tem new file mode 100644 index 0000000000..4db2bb8ec4 Binary files /dev/null and b/mods/ca/bits/temp/cave15.tem differ diff --git a/mods/ca/bits/temp/cave16.tem b/mods/ca/bits/temp/cave16.tem new file mode 100644 index 0000000000..aaaf093035 Binary files /dev/null and b/mods/ca/bits/temp/cave16.tem differ diff --git a/mods/ca/bits/temp/cave17.tem b/mods/ca/bits/temp/cave17.tem new file mode 100644 index 0000000000..7dd6ce43e3 Binary files /dev/null and b/mods/ca/bits/temp/cave17.tem differ diff --git a/mods/ca/bits/temp/cave18.tem b/mods/ca/bits/temp/cave18.tem new file mode 100644 index 0000000000..2c799d4120 Binary files /dev/null and b/mods/ca/bits/temp/cave18.tem differ diff --git a/mods/ca/bits/temp/cave19.tem b/mods/ca/bits/temp/cave19.tem new file mode 100644 index 0000000000..7eff73d3c5 Binary files /dev/null and b/mods/ca/bits/temp/cave19.tem differ diff --git a/mods/ca/bits/temp/cave20.tem b/mods/ca/bits/temp/cave20.tem new file mode 100644 index 0000000000..af166ddecc Binary files /dev/null and b/mods/ca/bits/temp/cave20.tem differ diff --git a/mods/ca/bits/temp/cave21.tem b/mods/ca/bits/temp/cave21.tem new file mode 100644 index 0000000000..0551f1e467 Binary files /dev/null and b/mods/ca/bits/temp/cave21.tem differ diff --git a/mods/ca/bits/temp/cave22.tem b/mods/ca/bits/temp/cave22.tem new file mode 100644 index 0000000000..1f87d1126e Binary files /dev/null and b/mods/ca/bits/temp/cave22.tem differ diff --git a/mods/ca/bits/temp/cave23.tem b/mods/ca/bits/temp/cave23.tem new file mode 100644 index 0000000000..af3a2c8405 Binary files /dev/null and b/mods/ca/bits/temp/cave23.tem differ diff --git a/mods/ca/bits/temp/cave24.tem b/mods/ca/bits/temp/cave24.tem new file mode 100644 index 0000000000..a8d4b2ad73 Binary files /dev/null and b/mods/ca/bits/temp/cave24.tem differ diff --git a/mods/ca/bits/temp/cave25.tem b/mods/ca/bits/temp/cave25.tem new file mode 100644 index 0000000000..0d9823a3de Binary files /dev/null and b/mods/ca/bits/temp/cave25.tem differ diff --git a/mods/ca/bits/temp/cave26.tem b/mods/ca/bits/temp/cave26.tem new file mode 100644 index 0000000000..6de90f8eb7 Binary files /dev/null and b/mods/ca/bits/temp/cave26.tem differ diff --git a/mods/ca/bits/temp/cave27.tem b/mods/ca/bits/temp/cave27.tem new file mode 100644 index 0000000000..4d31102d99 Binary files /dev/null and b/mods/ca/bits/temp/cave27.tem differ diff --git a/mods/ca/bits/temp/cave28.tem b/mods/ca/bits/temp/cave28.tem new file mode 100644 index 0000000000..72800a7951 Binary files /dev/null and b/mods/ca/bits/temp/cave28.tem differ diff --git a/mods/ca/bits/temp/cave29.tem b/mods/ca/bits/temp/cave29.tem new file mode 100644 index 0000000000..d0e3b95c3d Binary files /dev/null and b/mods/ca/bits/temp/cave29.tem differ diff --git a/mods/ca/bits/temp/cave30.tem b/mods/ca/bits/temp/cave30.tem new file mode 100644 index 0000000000..fc25ea1b1c Binary files /dev/null and b/mods/ca/bits/temp/cave30.tem differ diff --git a/mods/ca/bits/temp/cave31.tem b/mods/ca/bits/temp/cave31.tem new file mode 100644 index 0000000000..92d96eff78 Binary files /dev/null and b/mods/ca/bits/temp/cave31.tem differ diff --git a/mods/ca/bits/temp/cave32.tem b/mods/ca/bits/temp/cave32.tem new file mode 100644 index 0000000000..fb2e4931a8 Binary files /dev/null and b/mods/ca/bits/temp/cave32.tem differ diff --git a/mods/ca/bits/temp/cave33.tem b/mods/ca/bits/temp/cave33.tem new file mode 100644 index 0000000000..9777732ecd Binary files /dev/null and b/mods/ca/bits/temp/cave33.tem differ diff --git a/mods/ca/bits/temp/cave34.tem b/mods/ca/bits/temp/cave34.tem new file mode 100644 index 0000000000..83869a1baa Binary files /dev/null and b/mods/ca/bits/temp/cave34.tem differ diff --git a/mods/ca/bits/temp/cave35.tem b/mods/ca/bits/temp/cave35.tem new file mode 100644 index 0000000000..4e122a21ad Binary files /dev/null and b/mods/ca/bits/temp/cave35.tem differ diff --git a/mods/ca/bits/temp/cave36.tem b/mods/ca/bits/temp/cave36.tem new file mode 100644 index 0000000000..52204478e5 Binary files /dev/null and b/mods/ca/bits/temp/cave36.tem differ diff --git a/mods/ca/bits/temp/cave37.tem b/mods/ca/bits/temp/cave37.tem new file mode 100644 index 0000000000..14d3c5dadb Binary files /dev/null and b/mods/ca/bits/temp/cave37.tem differ diff --git a/mods/ca/bits/temp/clearcity.tem b/mods/ca/bits/temp/clearcity.tem new file mode 100644 index 0000000000..4b8a32d42c Binary files /dev/null and b/mods/ca/bits/temp/clearcity.tem differ diff --git a/mods/ca/bits/temperat.pal b/mods/ca/bits/temperat.pal new file mode 100644 index 0000000000..bb63fcdd50 Binary files /dev/null and b/mods/ca/bits/temperat.pal differ diff --git a/mods/ca/bits/tempincicon.shp b/mods/ca/bits/tempincicon.shp new file mode 100644 index 0000000000..0441141fc1 Binary files /dev/null and b/mods/ca/bits/tempincicon.shp differ diff --git a/mods/ca/bits/thwk.shp b/mods/ca/bits/thwk.shp new file mode 100644 index 0000000000..143733f6d5 Binary files /dev/null and b/mods/ca/bits/thwk.shp differ diff --git a/mods/ca/bits/thwkicnh.shp b/mods/ca/bits/thwkicnh.shp new file mode 100644 index 0000000000..6e8aed6a19 Binary files /dev/null and b/mods/ca/bits/thwkicnh.shp differ diff --git a/mods/ca/bits/thwkm.shp b/mods/ca/bits/thwkm.shp new file mode 100644 index 0000000000..621b1f5fdb Binary files /dev/null and b/mods/ca/bits/thwkm.shp differ diff --git a/mods/ca/bits/tibexplode.shp b/mods/ca/bits/tibexplode.shp new file mode 100644 index 0000000000..66f6650547 Binary files /dev/null and b/mods/ca/bits/tibexplode.shp differ diff --git a/mods/ca/bits/tibexplodeair.shp b/mods/ca/bits/tibexplodeair.shp new file mode 100644 index 0000000000..579394e5b5 Binary files /dev/null and b/mods/ca/bits/tibexplodeair.shp differ diff --git a/mods/ca/bits/tibexplodesm.shp b/mods/ca/bits/tibexplodesm.shp new file mode 100644 index 0000000000..6c72f69558 Binary files /dev/null and b/mods/ca/bits/tibexplodesm.shp differ diff --git a/mods/ca/bits/tigr.shp b/mods/ca/bits/tigr.shp new file mode 100644 index 0000000000..0d15f78f7a Binary files /dev/null and b/mods/ca/bits/tigr.shp differ diff --git a/mods/ca/bits/tigricon.shp b/mods/ca/bits/tigricon.shp new file mode 100644 index 0000000000..92c5d6fdf0 Binary files /dev/null and b/mods/ca/bits/tigricon.shp differ diff --git a/mods/ca/bits/timeskipicon.shp b/mods/ca/bits/timeskipicon.shp new file mode 100644 index 0000000000..edde0142fa Binary files /dev/null and b/mods/ca/bits/timeskipicon.shp differ diff --git a/mods/ca/bits/tplr.shp b/mods/ca/bits/tplr.shp new file mode 100644 index 0000000000..3d56aba984 Binary files /dev/null and b/mods/ca/bits/tplr.shp differ diff --git a/mods/ca/bits/tplricnh.shp b/mods/ca/bits/tplricnh.shp new file mode 100644 index 0000000000..43a7fa5e4b Binary files /dev/null and b/mods/ca/bits/tplricnh.shp differ diff --git a/mods/ca/bits/trpc.shp b/mods/ca/bits/trpc.shp new file mode 100644 index 0000000000..ba1ce41943 Binary files /dev/null and b/mods/ca/bits/trpc.shp differ diff --git a/mods/ca/bits/trpcicon.shp b/mods/ca/bits/trpcicon.shp new file mode 100644 index 0000000000..f9abab6929 Binary files /dev/null and b/mods/ca/bits/trpcicon.shp differ diff --git a/mods/ca/bits/ttrp.shp b/mods/ca/bits/ttrp.shp new file mode 100644 index 0000000000..b166bdefe3 Binary files /dev/null and b/mods/ca/bits/ttrp.shp differ diff --git a/mods/ca/bits/ttrpicon.shp b/mods/ca/bits/ttrpicon.shp new file mode 100644 index 0000000000..6a6bda2444 Binary files /dev/null and b/mods/ca/bits/ttrpicon.shp differ diff --git a/mods/ca/bits/u1icon.shp b/mods/ca/bits/u1icon.shp new file mode 100644 index 0000000000..bf7d8059a3 Binary files /dev/null and b/mods/ca/bits/u1icon.shp differ diff --git a/mods/ca/bits/u3.shp b/mods/ca/bits/u3.shp new file mode 100644 index 0000000000..d56698ef27 Binary files /dev/null and b/mods/ca/bits/u3.shp differ diff --git a/mods/ca/bits/u3bunker.shp b/mods/ca/bits/u3bunker.shp new file mode 100644 index 0000000000..8f07cbcecb Binary files /dev/null and b/mods/ca/bits/u3bunker.shp differ diff --git a/mods/ca/bits/u3bunkercr.shp b/mods/ca/bits/u3bunkercr.shp new file mode 100644 index 0000000000..aa9c09925c Binary files /dev/null and b/mods/ca/bits/u3bunkercr.shp differ diff --git a/mods/ca/bits/u3icon.shp b/mods/ca/bits/u3icon.shp new file mode 100644 index 0000000000..ba9208c5ce Binary files /dev/null and b/mods/ca/bits/u3icon.shp differ diff --git a/mods/ca/bits/u3make.shp b/mods/ca/bits/u3make.shp new file mode 100644 index 0000000000..37bcc3118c Binary files /dev/null and b/mods/ca/bits/u3make.shp differ diff --git a/mods/ca/bits/upg-aburicnh.shp b/mods/ca/bits/upg-aburicnh.shp new file mode 100644 index 0000000000..ce875b8f8a Binary files /dev/null and b/mods/ca/bits/upg-aburicnh.shp differ diff --git a/mods/ca/bits/upg-advopticsicon.shp b/mods/ca/bits/upg-advopticsicon.shp new file mode 100644 index 0000000000..741d08561e Binary files /dev/null and b/mods/ca/bits/upg-advopticsicon.shp differ diff --git a/mods/ca/bits/upg-airborneicon.shp b/mods/ca/bits/upg-airborneicon.shp new file mode 100644 index 0000000000..2c148e100e Binary files /dev/null and b/mods/ca/bits/upg-airborneicon.shp differ diff --git a/mods/ca/bits/upg-alpharahicon.shp b/mods/ca/bits/upg-alpharahicon.shp new file mode 100644 index 0000000000..fb082a11d7 Binary files /dev/null and b/mods/ca/bits/upg-alpharahicon.shp differ diff --git a/mods/ca/bits/upg-apbicon.shp b/mods/ca/bits/upg-apbicon.shp index 0f0145576a..b05fbffee6 100644 Binary files a/mods/ca/bits/upg-apbicon.shp and b/mods/ca/bits/upg-apbicon.shp differ diff --git a/mods/ca/bits/upg-apocicon.shp b/mods/ca/bits/upg-apocicon.shp new file mode 100644 index 0000000000..e7e928eec9 Binary files /dev/null and b/mods/ca/bits/upg-apocicon.shp differ diff --git a/mods/ca/bits/upg-armordoctrineicon.shp b/mods/ca/bits/upg-armordoctrineicon.shp new file mode 100644 index 0000000000..a12cc9a889 Binary files /dev/null and b/mods/ca/bits/upg-armordoctrineicon.shp differ diff --git a/mods/ca/bits/upg-artydoctrineicon.shp b/mods/ca/bits/upg-artydoctrineicon.shp new file mode 100644 index 0000000000..aa904c2d17 Binary files /dev/null and b/mods/ca/bits/upg-artydoctrineicon.shp differ diff --git a/mods/ca/bits/upg-atomicengicon.shp b/mods/ca/bits/upg-atomicengicon.shp new file mode 100644 index 0000000000..8b09305362 Binary files /dev/null and b/mods/ca/bits/upg-atomicengicon.shp differ diff --git a/mods/ca/bits/upg-avengericon.shp b/mods/ca/bits/upg-avengericon.shp new file mode 100644 index 0000000000..0ccf482a65 Binary files /dev/null and b/mods/ca/bits/upg-avengericon.shp differ diff --git a/mods/ca/bits/upg-bdroneicon.shp b/mods/ca/bits/upg-bdroneicon.shp new file mode 100644 index 0000000000..3b08354891 Binary files /dev/null and b/mods/ca/bits/upg-bdroneicon.shp differ diff --git a/mods/ca/bits/upg-bjeticon.shp b/mods/ca/bits/upg-bjeticon.shp new file mode 100644 index 0000000000..7e36549d5c Binary files /dev/null and b/mods/ca/bits/upg-bjeticon.shp differ diff --git a/mods/ca/bits/upg-blacknapalmicon.shp b/mods/ca/bits/upg-blacknapalmicon.shp new file mode 100644 index 0000000000..31a498fa92 Binary files /dev/null and b/mods/ca/bits/upg-blacknapalmicon.shp differ diff --git a/mods/ca/bits/upg-carapaceicon.shp b/mods/ca/bits/upg-carapaceicon.shp new file mode 100644 index 0000000000..ea0afb6fa4 Binary files /dev/null and b/mods/ca/bits/upg-carapaceicon.shp differ diff --git a/mods/ca/bits/upg-ceramicicnh.shp b/mods/ca/bits/upg-ceramicicnh.shp new file mode 100644 index 0000000000..5132a5641c Binary files /dev/null and b/mods/ca/bits/upg-ceramicicnh.shp differ diff --git a/mods/ca/bits/upg-covenanticnh.shp b/mods/ca/bits/upg-covenanticnh.shp new file mode 100644 index 0000000000..ea7708683f Binary files /dev/null and b/mods/ca/bits/upg-covenanticnh.shp differ diff --git a/mods/ca/bits/upg-crymicon.shp b/mods/ca/bits/upg-crymicon.shp new file mode 100644 index 0000000000..9a6bcf9af9 Binary files /dev/null and b/mods/ca/bits/upg-crymicon.shp differ diff --git a/mods/ca/bits/upg-cryricon.shp b/mods/ca/bits/upg-cryricon.shp deleted file mode 100644 index 426fd6f3dd..0000000000 Binary files a/mods/ca/bits/upg-cryricon.shp and /dev/null differ diff --git a/mods/ca/bits/upg-crywicon.shp b/mods/ca/bits/upg-crywicon.shp new file mode 100644 index 0000000000..6d31638c15 Binary files /dev/null and b/mods/ca/bits/upg-crywicon.shp differ diff --git a/mods/ca/bits/upg-custicon.shp b/mods/ca/bits/upg-custicon.shp new file mode 100644 index 0000000000..e27abe4e9c Binary files /dev/null and b/mods/ca/bits/upg-custicon.shp differ diff --git a/mods/ca/bits/upg-cyborgdmgicnh.shp b/mods/ca/bits/upg-cyborgdmgicnh.shp new file mode 100644 index 0000000000..fadfffff2d Binary files /dev/null and b/mods/ca/bits/upg-cyborgdmgicnh.shp differ diff --git a/mods/ca/bits/upg-cyborgicnh.shp b/mods/ca/bits/upg-cyborgicnh.shp deleted file mode 100644 index 22c548ae04..0000000000 Binary files a/mods/ca/bits/upg-cyborgicnh.shp and /dev/null differ diff --git a/mods/ca/bits/upg-cyborgprodicnh.shp b/mods/ca/bits/upg-cyborgprodicnh.shp new file mode 100644 index 0000000000..6f52181a23 Binary files /dev/null and b/mods/ca/bits/upg-cyborgprodicnh.shp differ diff --git a/mods/ca/bits/upg-cyborgspeedicnh.shp b/mods/ca/bits/upg-cyborgspeedicnh.shp index c53a53fb8b..9d3ba669df 100644 Binary files a/mods/ca/bits/upg-cyborgspeedicnh.shp and b/mods/ca/bits/upg-cyborgspeedicnh.shp differ diff --git a/mods/ca/bits/upg-deceiticnh.shp b/mods/ca/bits/upg-deceiticnh.shp new file mode 100644 index 0000000000..baf7d20561 Binary files /dev/null and b/mods/ca/bits/upg-deceiticnh.shp differ diff --git a/mods/ca/bits/upg-decoyicon.shp b/mods/ca/bits/upg-decoyicon.shp new file mode 100644 index 0000000000..6576534b07 Binary files /dev/null and b/mods/ca/bits/upg-decoyicon.shp differ diff --git a/mods/ca/bits/upg-defensepolicyicon.shp b/mods/ca/bits/upg-defensepolicyicon.shp new file mode 100644 index 0000000000..2be9f65ec8 Binary files /dev/null and b/mods/ca/bits/upg-defensepolicyicon.shp differ diff --git a/mods/ca/bits/upg-delpicon.shp b/mods/ca/bits/upg-delpicon.shp new file mode 100644 index 0000000000..9a8e5c9575 Binary files /dev/null and b/mods/ca/bits/upg-delpicon.shp differ diff --git a/mods/ca/bits/upg-desoicon.shp b/mods/ca/bits/upg-desoicon.shp new file mode 100644 index 0000000000..fe7a844859 Binary files /dev/null and b/mods/ca/bits/upg-desoicon.shp differ diff --git a/mods/ca/bits/upg-devpolicyicon.shp b/mods/ca/bits/upg-devpolicyicon.shp new file mode 100644 index 0000000000..53f4f2709f Binary files /dev/null and b/mods/ca/bits/upg-devpolicyicon.shp differ diff --git a/mods/ca/bits/upg-doctrine1icon.shp b/mods/ca/bits/upg-doctrine1icon.shp new file mode 100644 index 0000000000..943df7fc62 Binary files /dev/null and b/mods/ca/bits/upg-doctrine1icon.shp differ diff --git a/mods/ca/bits/upg-doctrine2icon.shp b/mods/ca/bits/upg-doctrine2icon.shp new file mode 100644 index 0000000000..5b113c690a Binary files /dev/null and b/mods/ca/bits/upg-doctrine2icon.shp differ diff --git a/mods/ca/bits/upg-droneicon.shp b/mods/ca/bits/upg-droneicon.shp deleted file mode 100644 index f90586f543..0000000000 Binary files a/mods/ca/bits/upg-droneicon.shp and /dev/null differ diff --git a/mods/ca/bits/upg-economypolicyicon.shp b/mods/ca/bits/upg-economypolicyicon.shp new file mode 100644 index 0000000000..4a933f1c05 Binary files /dev/null and b/mods/ca/bits/upg-economypolicyicon.shp differ diff --git a/mods/ca/bits/upg-entrenchicon.shp b/mods/ca/bits/upg-entrenchicon.shp new file mode 100644 index 0000000000..09d5649bc7 Binary files /dev/null and b/mods/ca/bits/upg-entrenchicon.shp differ diff --git a/mods/ca/bits/upg-eradicon.shp b/mods/ca/bits/upg-eradicon.shp new file mode 100644 index 0000000000..cb1766507e Binary files /dev/null and b/mods/ca/bits/upg-eradicon.shp differ diff --git a/mods/ca/bits/upg-eraicon.shp b/mods/ca/bits/upg-eraicon.shp new file mode 100644 index 0000000000..765380d4ae Binary files /dev/null and b/mods/ca/bits/upg-eraicon.shp differ diff --git a/mods/ca/bits/upg-flakarmoricon.shp b/mods/ca/bits/upg-flakarmoricon.shp new file mode 100644 index 0000000000..c88ef419d5 Binary files /dev/null and b/mods/ca/bits/upg-flakarmoricon.shp differ diff --git a/mods/ca/bits/upg-gattlingicon.shp b/mods/ca/bits/upg-gattlingicon.shp new file mode 100644 index 0000000000..86672ac5df Binary files /dev/null and b/mods/ca/bits/upg-gattlingicon.shp differ diff --git a/mods/ca/bits/upg-greicon.shp b/mods/ca/bits/upg-greicon.shp new file mode 100644 index 0000000000..828acccfb5 Binary files /dev/null and b/mods/ca/bits/upg-greicon.shp differ diff --git a/mods/ca/bits/upg-gyroicnh.shp b/mods/ca/bits/upg-gyroicnh.shp new file mode 100644 index 0000000000..a5e9fa6034 Binary files /dev/null and b/mods/ca/bits/upg-gyroicnh.shp differ diff --git a/mods/ca/bits/upg-hstkicon.shp b/mods/ca/bits/upg-hstkicon.shp new file mode 100644 index 0000000000..e022ae4919 Binary files /dev/null and b/mods/ca/bits/upg-hstkicon.shp differ diff --git a/mods/ca/bits/upg-impmutaicon.shp b/mods/ca/bits/upg-impmutaicon.shp new file mode 100644 index 0000000000..bf309ffa04 Binary files /dev/null and b/mods/ca/bits/upg-impmutaicon.shp differ diff --git a/mods/ca/bits/upg-impparaicon.shp b/mods/ca/bits/upg-impparaicon.shp new file mode 100644 index 0000000000..67bf9fa0c4 Binary files /dev/null and b/mods/ca/bits/upg-impparaicon.shp differ diff --git a/mods/ca/bits/upg-impstormicon.shp b/mods/ca/bits/upg-impstormicon.shp new file mode 100644 index 0000000000..d488e0c977 Binary files /dev/null and b/mods/ca/bits/upg-impstormicon.shp differ diff --git a/mods/ca/bits/upg-infdoctrineicon.shp b/mods/ca/bits/upg-infdoctrineicon.shp new file mode 100644 index 0000000000..0a6d46b617 Binary files /dev/null and b/mods/ca/bits/upg-infdoctrineicon.shp differ diff --git a/mods/ca/bits/upg-infsicon.shp b/mods/ca/bits/upg-infsicon.shp new file mode 100644 index 0000000000..3f2040c380 Binary files /dev/null and b/mods/ca/bits/upg-infsicon.shp differ diff --git a/mods/ca/bits/upg-iraqicon.shp b/mods/ca/bits/upg-iraqicon.shp deleted file mode 100644 index 95669c17d5..0000000000 Binary files a/mods/ca/bits/upg-iraqicon.shp and /dev/null differ diff --git a/mods/ca/bits/upg-koricon.shp b/mods/ca/bits/upg-koricon.shp new file mode 100644 index 0000000000..3c216707ca Binary files /dev/null and b/mods/ca/bits/upg-koricon.shp differ diff --git a/mods/ca/bits/upg-lashericon.shp b/mods/ca/bits/upg-lashericon.shp index 5e77b551ae..1f63efd7ec 100644 Binary files a/mods/ca/bits/upg-lashericon.shp and b/mods/ca/bits/upg-lashericon.shp differ diff --git a/mods/ca/bits/upg-lastnkicon.shp b/mods/ca/bits/upg-lastnkicon.shp new file mode 100644 index 0000000000..0772645a44 Binary files /dev/null and b/mods/ca/bits/upg-lastnkicon.shp differ diff --git a/mods/ca/bits/upg-mdroneicon.shp b/mods/ca/bits/upg-mdroneicon.shp new file mode 100644 index 0000000000..1ffb519907 Binary files /dev/null and b/mods/ca/bits/upg-mdroneicon.shp differ diff --git a/mods/ca/bits/upg-nukcicon.shp b/mods/ca/bits/upg-nukcicon.shp new file mode 100644 index 0000000000..713f3090b7 Binary files /dev/null and b/mods/ca/bits/upg-nukcicon.shp differ diff --git a/mods/ca/bits/upg-ovldicon.shp b/mods/ca/bits/upg-ovldicon.shp new file mode 100644 index 0000000000..a56a12c8ad Binary files /dev/null and b/mods/ca/bits/upg-ovldicon.shp differ diff --git a/mods/ca/bits/upg-pointdeficnh.shp b/mods/ca/bits/upg-pointdeficnh.shp new file mode 100644 index 0000000000..786837ff5b Binary files /dev/null and b/mods/ca/bits/upg-pointdeficnh.shp differ diff --git a/mods/ca/bits/upg-precisionicnh.shp b/mods/ca/bits/upg-precisionicnh.shp new file mode 100644 index 0000000000..10da8295fa Binary files /dev/null and b/mods/ca/bits/upg-precisionicnh.shp differ diff --git a/mods/ca/bits/upg-quantumicon.shp b/mods/ca/bits/upg-quantumicon.shp new file mode 100644 index 0000000000..52e8d50290 Binary files /dev/null and b/mods/ca/bits/upg-quantumicon.shp differ diff --git a/mods/ca/bits/upg-rahstealthicon.shp b/mods/ca/bits/upg-rahstealthicon.shp new file mode 100644 index 0000000000..370095d819 Binary files /dev/null and b/mods/ca/bits/upg-rahstealthicon.shp differ diff --git a/mods/ca/bits/upg-rapcicon.shp b/mods/ca/bits/upg-rapcicon.shp new file mode 100644 index 0000000000..60bf7246bb Binary files /dev/null and b/mods/ca/bits/upg-rapcicon.shp differ diff --git a/mods/ca/bits/upg-rbugicon.shp b/mods/ca/bits/upg-rbugicon.shp new file mode 100644 index 0000000000..9aed02b779 Binary files /dev/null and b/mods/ca/bits/upg-rbugicon.shp differ diff --git a/mods/ca/bits/upg-rocketpodsicon.shp b/mods/ca/bits/upg-rocketpodsicon.shp new file mode 100644 index 0000000000..863018887c Binary files /dev/null and b/mods/ca/bits/upg-rocketpodsicon.shp differ diff --git a/mods/ca/bits/upg-sharvicon.shp b/mods/ca/bits/upg-sharvicon.shp new file mode 100644 index 0000000000..f9157d9930 Binary files /dev/null and b/mods/ca/bits/upg-sharvicon.shp differ diff --git a/mods/ca/bits/upg-sidewindersicnh.shp b/mods/ca/bits/upg-sidewindersicnh.shp new file mode 100644 index 0000000000..687da397ec Binary files /dev/null and b/mods/ca/bits/upg-sidewindersicnh.shp differ diff --git a/mods/ca/bits/upg-smericon.shp b/mods/ca/bits/upg-smericon.shp new file mode 100644 index 0000000000..e542442c4b Binary files /dev/null and b/mods/ca/bits/upg-smericon.shp differ diff --git a/mods/ca/bits/upg-strategicicnh.shp b/mods/ca/bits/upg-strategicicnh.shp new file mode 100644 index 0000000000..0011a91231 Binary files /dev/null and b/mods/ca/bits/upg-strategicicnh.shp differ diff --git a/mods/ca/bits/upg-sweicon.shp b/mods/ca/bits/upg-sweicon.shp new file mode 100644 index 0000000000..5930d48dd4 Binary files /dev/null and b/mods/ca/bits/upg-sweicon.shp differ diff --git a/mods/ca/bits/upg-tdogicon.shp b/mods/ca/bits/upg-tdogicon.shp new file mode 100644 index 0000000000..786f131794 Binary files /dev/null and b/mods/ca/bits/upg-tdogicon.shp differ diff --git a/mods/ca/bits/upg-thwkicnh.shp b/mods/ca/bits/upg-thwkicnh.shp new file mode 100644 index 0000000000..5270590d7b Binary files /dev/null and b/mods/ca/bits/upg-thwkicnh.shp differ diff --git a/mods/ca/bits/upg-tibcoreicnh.shp b/mods/ca/bits/upg-tibcoreicnh.shp new file mode 100644 index 0000000000..b3f950bb98 Binary files /dev/null and b/mods/ca/bits/upg-tibcoreicnh.shp differ diff --git a/mods/ca/bits/upg-towicon.shp b/mods/ca/bits/upg-towicon.shp new file mode 100644 index 0000000000..ad3d2df8fa Binary files /dev/null and b/mods/ca/bits/upg-towicon.shp differ diff --git a/mods/ca/bits/upg-ttrpicon.shp b/mods/ca/bits/upg-ttrpicon.shp new file mode 100644 index 0000000000..d5252d2690 Binary files /dev/null and b/mods/ca/bits/upg-ttrpicon.shp differ diff --git a/mods/ca/bits/upg-unityicnh.shp b/mods/ca/bits/upg-unityicnh.shp new file mode 100644 index 0000000000..6fb66122ea Binary files /dev/null and b/mods/ca/bits/upg-unityicnh.shp differ diff --git a/mods/ca/bits/upg-v3rlicon.shp b/mods/ca/bits/upg-v3rlicon.shp new file mode 100644 index 0000000000..4fef7a7614 Binary files /dev/null and b/mods/ca/bits/upg-v3rlicon.shp differ diff --git a/mods/ca/bits/upg-vulcicnh.shp b/mods/ca/bits/upg-vulcicnh.shp deleted file mode 100644 index 3487cfc984..0000000000 Binary files a/mods/ca/bits/upg-vulcicnh.shp and /dev/null differ diff --git a/mods/ca/bits/upg-vulcicon.shp b/mods/ca/bits/upg-vulcicon.shp new file mode 100644 index 0000000000..2a7a4b021f Binary files /dev/null and b/mods/ca/bits/upg-vulcicon.shp differ diff --git a/mods/ca/bits/upg-wrathicnh.shp b/mods/ca/bits/upg-wrathicnh.shp new file mode 100644 index 0000000000..4a94524c62 Binary files /dev/null and b/mods/ca/bits/upg-wrathicnh.shp differ diff --git a/mods/ca/bits/upg-zdeficon.shp b/mods/ca/bits/upg-zdeficon.shp new file mode 100644 index 0000000000..d68ddccdcf Binary files /dev/null and b/mods/ca/bits/upg-zdeficon.shp differ diff --git a/mods/ca/bits/upg-zealicnh.shp b/mods/ca/bits/upg-zealicnh.shp new file mode 100644 index 0000000000..7d4dfdf5da Binary files /dev/null and b/mods/ca/bits/upg-zealicnh.shp differ diff --git a/mods/ca/bits/upg-zraiicon.shp b/mods/ca/bits/upg-zraiicon.shp new file mode 100644 index 0000000000..415d07f5fd Binary files /dev/null and b/mods/ca/bits/upg-zraiicon.shp differ diff --git a/mods/ca/bits/upgrade-complete.shp b/mods/ca/bits/upgrade-complete.shp new file mode 100644 index 0000000000..56ea1e35bc Binary files /dev/null and b/mods/ca/bits/upgrade-complete.shp differ diff --git a/mods/ca/bits/upgradecursor.shp b/mods/ca/bits/upgradecursor.shp new file mode 100644 index 0000000000..a737e8a928 Binary files /dev/null and b/mods/ca/bits/upgradecursor.shp differ diff --git a/mods/ca/bits/ussrstar.shp b/mods/ca/bits/ussrstar.shp new file mode 100644 index 0000000000..ed00c2264e Binary files /dev/null and b/mods/ca/bits/ussrstar.shp differ diff --git a/mods/ca/bits/veh-hit-alt.shp b/mods/ca/bits/veh-hit-alt.shp deleted file mode 100644 index f2e38ff3bd..0000000000 Binary files a/mods/ca/bits/veh-hit-alt.shp and /dev/null differ diff --git a/mods/ca/bits/veh-hit3-alt.shp b/mods/ca/bits/veh-hit3-alt.shp new file mode 100644 index 0000000000..781f4e941a Binary files /dev/null and b/mods/ca/bits/veh-hit3-alt.shp differ diff --git a/mods/ca/bits/veilblast.shp b/mods/ca/bits/veilblast.shp new file mode 100644 index 0000000000..3fe3feab20 Binary files /dev/null and b/mods/ca/bits/veilblast.shp differ diff --git a/mods/ca/bits/veilcloud.shp b/mods/ca/bits/veilcloud.shp new file mode 100644 index 0000000000..de7020751d Binary files /dev/null and b/mods/ca/bits/veilcloud.shp differ diff --git a/mods/ca/bits/veilcloudsm.shp b/mods/ca/bits/veilcloudsm.shp new file mode 100644 index 0000000000..6bcb12f0f2 Binary files /dev/null and b/mods/ca/bits/veilcloudsm.shp differ diff --git a/mods/ca/bits/veildebuff.shp b/mods/ca/bits/veildebuff.shp new file mode 100644 index 0000000000..5f98a19802 Binary files /dev/null and b/mods/ca/bits/veildebuff.shp differ diff --git a/mods/ca/bits/veildebuffsm.shp b/mods/ca/bits/veildebuffsm.shp new file mode 100644 index 0000000000..b406aca80b Binary files /dev/null and b/mods/ca/bits/veildebuffsm.shp differ diff --git a/mods/ca/bits/veilofwaricnh.shp b/mods/ca/bits/veilofwaricnh.shp new file mode 100644 index 0000000000..9c6e3fc16e Binary files /dev/null and b/mods/ca/bits/veilofwaricnh.shp differ diff --git a/mods/ca/bits/venm.shp b/mods/ca/bits/venm.shp index 2132090157..ae340abc7a 100644 Binary files a/mods/ca/bits/venm.shp and b/mods/ca/bits/venm.shp differ diff --git a/mods/ca/bits/vert.shp b/mods/ca/bits/vert.shp new file mode 100644 index 0000000000..fadb3173f0 Binary files /dev/null and b/mods/ca/bits/vert.shp differ diff --git a/mods/ca/bits/verticnh.shp b/mods/ca/bits/verticnh.shp new file mode 100644 index 0000000000..cc4adf3484 Binary files /dev/null and b/mods/ca/bits/verticnh.shp differ diff --git a/mods/ca/bits/vipr.shp b/mods/ca/bits/vipr.shp new file mode 100644 index 0000000000..699fa87b57 Binary files /dev/null and b/mods/ca/bits/vipr.shp differ diff --git a/mods/ca/bits/vipricnh.shp b/mods/ca/bits/vipricnh.shp new file mode 100644 index 0000000000..5c919ecb2b Binary files /dev/null and b/mods/ca/bits/vipricnh.shp differ diff --git a/mods/ca/bits/winter/cliffsl1.win b/mods/ca/bits/winter/cliffsl1.win index 5a0141f477..3adf0a037d 100644 Binary files a/mods/ca/bits/winter/cliffsl1.win and b/mods/ca/bits/winter/cliffsl1.win differ diff --git a/mods/ca/bits/winter/cliffsl2.win b/mods/ca/bits/winter/cliffsl2.win index 913110987d..a2c7c910c2 100644 Binary files a/mods/ca/bits/winter/cliffsl2.win and b/mods/ca/bits/winter/cliffsl2.win differ diff --git a/mods/ca/bits/winter/cliffsl3.win b/mods/ca/bits/winter/cliffsl3.win index a6ae51ebef..3177b251f8 100644 Binary files a/mods/ca/bits/winter/cliffsl3.win and b/mods/ca/bits/winter/cliffsl3.win differ diff --git a/mods/ca/bits/winter/cliffsl4.win b/mods/ca/bits/winter/cliffsl4.win index ddb665ace1..fb59ba8b5a 100644 Binary files a/mods/ca/bits/winter/cliffsl4.win and b/mods/ca/bits/winter/cliffsl4.win differ diff --git a/mods/ca/bits/winter/p15.win b/mods/ca/bits/winter/p15.win new file mode 100644 index 0000000000..40e1529eb9 Binary files /dev/null and b/mods/ca/bits/winter/p15.win differ diff --git a/mods/ca/bits/winter/p16.win b/mods/ca/bits/winter/p16.win new file mode 100644 index 0000000000..12990288ed Binary files /dev/null and b/mods/ca/bits/winter/p16.win differ diff --git a/mods/ca/bits/winter/p17.win b/mods/ca/bits/winter/p17.win new file mode 100644 index 0000000000..8134a93df4 Binary files /dev/null and b/mods/ca/bits/winter/p17.win differ diff --git a/mods/ca/bits/winter/p18.win b/mods/ca/bits/winter/p18.win new file mode 100644 index 0000000000..c1664cd0c3 Binary files /dev/null and b/mods/ca/bits/winter/p18.win differ diff --git a/mods/ca/bits/winter/p19.win b/mods/ca/bits/winter/p19.win new file mode 100644 index 0000000000..c6a2875488 Binary files /dev/null and b/mods/ca/bits/winter/p19.win differ diff --git a/mods/ca/bits/winter/p20.win b/mods/ca/bits/winter/p20.win new file mode 100644 index 0000000000..70d38791b5 Binary files /dev/null and b/mods/ca/bits/winter/p20.win differ diff --git a/mods/ca/bits/wolv.shp b/mods/ca/bits/wolv.shp new file mode 100644 index 0000000000..f090ef9d9d Binary files /dev/null and b/mods/ca/bits/wolv.shp differ diff --git a/mods/ca/bits/wolvicnh.shp b/mods/ca/bits/wolvicnh.shp new file mode 100644 index 0000000000..900b337f4a Binary files /dev/null and b/mods/ca/bits/wolvicnh.shp differ diff --git a/mods/ca/bits/xodropicon.shp b/mods/ca/bits/xodropicon.shp index 91f764cf3b..39d7e479eb 100644 Binary files a/mods/ca/bits/xodropicon.shp and b/mods/ca/bits/xodropicon.shp differ diff --git a/mods/ca/bits/xoicon.shp b/mods/ca/bits/xoicon.shp new file mode 100644 index 0000000000..215f8325f9 Binary files /dev/null and b/mods/ca/bits/xoicon.shp differ diff --git a/mods/ca/bits/yak.shp b/mods/ca/bits/yak.shp index c760b4eb48..d891e9038f 100644 Binary files a/mods/ca/bits/yak.shp and b/mods/ca/bits/yak.shp differ diff --git a/mods/ca/bits/yuri.shp b/mods/ca/bits/yuri.shp new file mode 100644 index 0000000000..56627f7d2b Binary files /dev/null and b/mods/ca/bits/yuri.shp differ diff --git a/mods/ca/bits/yuria.shp b/mods/ca/bits/yuria.shp new file mode 100644 index 0000000000..f005c9df83 Binary files /dev/null and b/mods/ca/bits/yuria.shp differ diff --git a/mods/ca/bits/yurib.shp b/mods/ca/bits/yurib.shp new file mode 100644 index 0000000000..e7d39eb5dd Binary files /dev/null and b/mods/ca/bits/yurib.shp differ diff --git a/mods/ca/bits/yuric.shp b/mods/ca/bits/yuric.shp new file mode 100644 index 0000000000..c53c5c1b75 Binary files /dev/null and b/mods/ca/bits/yuric.shp differ diff --git a/mods/ca/bits/yuriicon.shp b/mods/ca/bits/yuriicon.shp new file mode 100644 index 0000000000..e2ee0287b0 Binary files /dev/null and b/mods/ca/bits/yuriicon.shp differ diff --git a/mods/ca/bits/zdef.shp b/mods/ca/bits/zdef.shp new file mode 100644 index 0000000000..ec32591bf9 Binary files /dev/null and b/mods/ca/bits/zdef.shp differ diff --git a/mods/ca/bits/zdeficnh.shp b/mods/ca/bits/zdeficnh.shp new file mode 100644 index 0000000000..780af9c057 Binary files /dev/null and b/mods/ca/bits/zdeficnh.shp differ diff --git a/mods/ca/bits/zdefshield.shp b/mods/ca/bits/zdefshield.shp new file mode 100644 index 0000000000..487900f6f1 Binary files /dev/null and b/mods/ca/bits/zdefshield.shp differ diff --git a/mods/ca/bits/zeus.shp b/mods/ca/bits/zeus.shp new file mode 100644 index 0000000000..99792f6212 Binary files /dev/null and b/mods/ca/bits/zeus.shp differ diff --git a/mods/ca/bits/zeusicon.shp b/mods/ca/bits/zeusicon.shp new file mode 100644 index 0000000000..8b42178acf Binary files /dev/null and b/mods/ca/bits/zeusicon.shp differ diff --git a/mods/ca/bits/zrai.shp b/mods/ca/bits/zrai.shp new file mode 100644 index 0000000000..7467d85008 Binary files /dev/null and b/mods/ca/bits/zrai.shp differ diff --git a/mods/ca/bits/zraiicnh.shp b/mods/ca/bits/zraiicnh.shp new file mode 100644 index 0000000000..9018db11fc Binary files /dev/null and b/mods/ca/bits/zraiicnh.shp differ diff --git a/mods/ca/bits/ztrp.shp b/mods/ca/bits/ztrp.shp new file mode 100644 index 0000000000..383b236a5d Binary files /dev/null and b/mods/ca/bits/ztrp.shp differ diff --git a/mods/ca/bits/ztrpicnh.shp b/mods/ca/bits/ztrpicnh.shp new file mode 100644 index 0000000000..6d5fcb6653 Binary files /dev/null and b/mods/ca/bits/ztrpicnh.shp differ diff --git a/mods/ca/bombard.ttf b/mods/ca/bombard.ttf new file mode 100644 index 0000000000..9ff580d1a7 Binary files /dev/null and b/mods/ca/bombard.ttf differ diff --git a/mods/ca/bombardreg.ttf b/mods/ca/bombardreg.ttf new file mode 100644 index 0000000000..3b9dfbe6ef Binary files /dev/null and b/mods/ca/bombardreg.ttf differ diff --git a/mods/ca/chrome.yaml b/mods/ca/chrome.yaml index a7bf8f4787..cd7a19f974 100644 --- a/mods/ca/chrome.yaml +++ b/mods/ca/chrome.yaml @@ -1,12 +1,6 @@ ^Sidebar: Image: sidebar.png -^Sidebar2: - Image: sidebar2.png - -^Sidebar3: - Image: sidebar3.png - ^Dialog: Image: dialog.png @@ -15,310 +9,15 @@ Image2x: glyphs-2x.png Image3x: glyphs-3x.png -^LoadScreen: - Image: ca-menu-logo.png - Image2x: ca-menu-logo-2x.png - Image3x: ca-menu-logo-3x.png - -sidebar-allies: - Inherits: ^Sidebar - Regions: - radar: 290, 67, 222, 222 - background-top: 0, 185, 238, 262 - background-moneybin: 0, 85, 238, 28 - background-iconbg: 12, 227, 190, 47 - background-iconrow: 0, 116, 238, 47 - background-bottom: 0, 480, 238, 31 - background-supportoverlay: 12, 324, 64, 48 - -sidebar-button-allies: - Inherits: ^Sidebar - PanelRegion: 260, 281, 5, 5, 18, 18, 5, 5 -sidebar-button-allies-hover: - Inherits: ^Sidebar - PanelRegion: 260, 252, 5, 5, 18, 18, 5, 5 -sidebar-button-allies-pressed: - Inherits: sidebar-button-allies -sidebar-button-allies-highlighted: - Inherits: ^Sidebar - PanelRegion: 260, 339, 5, 5, 18, 18, 5, 5 -sidebar-button-allies-highlighted-hover: - Inherits: ^Sidebar - PanelRegion: 260, 310, 5, 5, 18, 18, 5, 5 -sidebar-button-allies-highlighted-pressed: - Inherits: sidebar-button-allies-highlighted -sidebar-button-allies-disabled: - Inherits: ^Sidebar - PanelRegion: 260, 484, 5, 5, 18, 18, 5, 5 -sidebar-button-allies-highlighted-disabled: - Inherits: sidebar-button-allies-disabled - -command-button-allies: - Inherits: ^Sidebar - PanelRegion: 260, 281, 3, 3, 22, 22, 3, 3 - PanelSides: Center -command-button-allies-hover: - Inherits: ^Sidebar - PanelRegion: 260, 252, 3, 3, 22, 22, 3, 3 - PanelSides: Center -command-button-allies-pressed: - Inherits: command-button-allies -command-button-allies-highlighted: - Inherits: ^Sidebar - PanelRegion: 260, 339, 3, 3, 22, 22, 3, 3 - PanelSides: Center -command-button-allies-highlighted-hover: - Inherits: ^Sidebar - PanelRegion: 260, 310, 3, 3, 22, 22, 3, 3 - PanelSides: Center -command-button-allies-highlighted-pressed: - Inherits: command-button-allies-highlighted -command-button-allies-disabled: - Inherits: command-button-allies -command-button-allies-highlighted-disabled: - Inherits: command-button-allies-highlighted - -sidebar-soviet: - Inherits: ^Sidebar - Regions: - radar: 290, 290, 222, 222 - background-top: 0, 185, 238, 262 - background-moneybin: 0, 54, 238, 28 - background-iconbg: 12, 275, 190, 47 - background-iconrow: 0, 116, 238, 47 - background-bottom: 0, 166, 238, 8 - background-supportoverlay: 77, 324, 64, 48 - -sidebar-button-soviet: - Inherits: ^Sidebar - PanelRegion: 260, 165, 5, 5, 18, 18, 5, 5 -sidebar-button-soviet-hover: - Inherits: ^Sidebar - PanelRegion: 260, 136, 5, 5, 18, 18, 5, 5 -sidebar-button-soviet-pressed: - Inherits: sidebar-button-soviet -sidebar-button-soviet-highlighted: - Inherits: ^Sidebar - PanelRegion: 260, 223, 5, 5, 18, 18, 5, 5 -sidebar-button-soviet-highlighted-hover: - Inherits: ^Sidebar - PanelRegion: 260, 194, 5, 5, 18, 18, 5, 5 -sidebar-button-soviet-highlighted-pressed: - Inherits: sidebar-button-soviet-highlighted -sidebar-button-soviet-disabled: - Inherits: sidebar-button-allies-disabled -sidebar-button-soviet-highlighted-disabled: - Inherits: sidebar-button-allies-disabled - -command-button-soviet: - Inherits: ^Sidebar - PanelRegion: 260, 165, 3, 3, 22, 22, 3, 3 - PanelSides: Center -command-button-soviet-hover: - Inherits: ^Sidebar - PanelRegion: 260, 136, 3, 3, 22, 22, 3, 3 - PanelSides: Center -command-button-soviet-pressed: - Inherits: command-button-soviet -command-button-soviet-highlighted: - Inherits: ^Sidebar - PanelRegion: 260, 223, 3, 3, 22, 22, 3, 3 - PanelSides: Center -command-button-soviet-highlighted-hover: - Inherits: ^Sidebar - PanelRegion: 260, 194, 3, 3, 22, 22, 3, 3 - PanelSides: Center -command-button-soviet-highlighted-pressed: - Inherits: command-button-soviet-highlighted -command-button-soviet-disabled: - Inherits: command-button-soviet -command-button-soviet-highlighted-disabled: - Inherits: command-button-soviet-highlighted - -sidebar-gdi: - Inherits: ^Sidebar2 - Regions: - radar: 290, 67, 222, 222 - background-top: 0, 185, 238, 262 - background-moneybin: 0, 85, 238, 28 - background-iconbg: 12, 227, 190, 47 - background-iconrow: 0, 116, 238, 47 - background-bottom: 0, 166, 238, 8 - background-supportoverlay: 12, 324, 64, 48 - -sidebar-button-gdi: - Inherits: ^Sidebar2 - PanelRegion: 260, 281, 5, 5, 18, 18, 5, 5 -sidebar-button-gdi-hover: - Inherits: ^Sidebar2 - PanelRegion: 260, 252, 5, 5, 18, 18, 5, 5 -sidebar-button-gdi-pressed: - Inherits: sidebar-button-gdi -sidebar-button-gdi-highlighted: - Inherits: ^Sidebar2 - PanelRegion: 260, 339, 5, 5, 18, 18, 5, 5 -sidebar-button-gdi-highlighted-hover: - Inherits: ^Sidebar2 - PanelRegion: 260, 310, 5, 5, 18, 18, 5, 5 -sidebar-button-gdi-highlighted-pressed: - Inherits: sidebar-button-gdi-highlighted -sidebar-button-gdi-disabled: - Inherits: sidebar-button-allies-disabled -sidebar-button-gdi-highlighted-disabled: - Inherits: sidebar-button-allies-disabled - -command-button-gdi: - Inherits: ^Sidebar2 - PanelRegion: 260, 281, 3, 3, 22, 22, 3, 3 - PanelSides: Center -command-button-gdi-hover: - Inherits: ^Sidebar2 - PanelRegion: 260, 252, 3, 3, 22, 22, 3, 3 - PanelSides: Center -command-button-gdi-pressed: - Inherits: command-button-gdi -command-button-gdi-highlighted: - Inherits: ^Sidebar2 - PanelRegion: 260, 339, 3, 3, 22, 22, 3, 3 - PanelSides: Center -command-button-gdi-highlighted-hover: - Inherits: ^Sidebar2 - PanelRegion: 260, 310, 3, 3, 22, 22, 3, 3 - PanelSides: Center -command-button-gdi-highlighted-pressed: - Inherits: command-button-gdi-highlighted -command-button-gdi-disabled: - Inherits: command-button-gdi -command-button-gdi-highlighted-disabled: - Inherits: command-button-gdi-highlighted - -sidebar-nod: - Inherits: ^Sidebar2 - Regions: - radar: 290, 290, 222, 222 - background-top: 0, 185, 238, 262 - background-moneybin: 0, 54, 238, 28 - background-iconbg: 12, 275, 190, 47 - background-iconrow: 0, 116, 238, 47 - background-bottom: 0, 166, 238, 8 - background-supportoverlay: 77, 324, 64, 48 - -sidebar-button-nod: - Inherits: ^Sidebar2 - PanelRegion: 260, 165, 5, 5, 18, 18, 5, 5 -sidebar-button-nod-hover: - Inherits: ^Sidebar2 - PanelRegion: 260, 136, 5, 5, 18, 18, 5, 5 -sidebar-button-nod-pressed: - Inherits: sidebar-button-nod -sidebar-button-nod-highlighted: - Inherits: ^Sidebar2 - PanelRegion: 260, 223, 5, 5, 18, 18, 5, 5 -sidebar-button-nod-highlighted-hover: - Inherits: ^Sidebar2 - PanelRegion: 260, 194, 5, 5, 18, 18, 5, 5 -sidebar-button-nod-highlighted-pressed: - Inherits: sidebar-button-nod-highlighted -sidebar-button-nod-disabled: - Inherits: sidebar-button-allies-disabled -sidebar-button-nod-highlighted-disabled: - Inherits: sidebar-button-allies-disabled - -command-button-nod: - Inherits: ^Sidebar2 - PanelRegion: 260, 165, 3, 3, 22, 22, 3, 3 - PanelSides: Center -command-button-nod-hover: - Inherits: ^Sidebar2 - PanelRegion: 260, 136, 3, 3, 22, 22, 3, 3 - PanelSides: Center -command-button-nod-pressed: - Inherits: command-button-nod -command-button-nod-highlighted: - Inherits: ^Sidebar2 - PanelRegion: 260, 223, 3, 3, 22, 22, 3, 3 - PanelSides: Center -command-button-nod-highlighted-hover: - Inherits: ^Sidebar2 - PanelRegion: 260, 194, 3, 3, 22, 22, 3, 3 - PanelSides: Center -command-button-nod-highlighted-pressed: - Inherits: command-button-nod-highlighted -command-button-nod-disabled: - Inherits: command-button-nod -command-button-nod-highlighted-disabled: - Inherits: command-button-nod-highlighted - -sidebar-scrin: - Inherits: ^Sidebar3 - Regions: - radar: 290, 290, 222, 222 - background-top: 0, 185, 238, 262 - background-moneybin: 0, 54, 238, 28 - background-iconbg: 12, 275, 190, 47 - background-iconrow: 0, 116, 238, 47 - background-bottom: 0, 166, 238, 8 - background-supportoverlay: 77, 324, 64, 48 - -sidebar-button-scrin: - Inherits: ^Sidebar3 - PanelRegion: 260, 165, 5, 5, 18, 18, 5, 5 -sidebar-button-scrin-hover: - Inherits: ^Sidebar3 - PanelRegion: 260, 136, 5, 5, 18, 18, 5, 5 -sidebar-button-scrin-pressed: - Inherits: sidebar-button-scrin -sidebar-button-scrin-highlighted: - Inherits: ^Sidebar3 - PanelRegion: 260, 223, 5, 5, 18, 18, 5, 5 -sidebar-button-scrin-highlighted-hover: - Inherits: ^Sidebar3 - PanelRegion: 260, 194, 5, 5, 18, 18, 5, 5 -sidebar-button-scrin-highlighted-pressed: - Inherits: sidebar-button-scrin-highlighted -sidebar-button-scrin-disabled: - Inherits: sidebar-button-allies-disabled -sidebar-button-scrin-highlighted-disabled: - Inherits: sidebar-button-allies-disabled - -command-button-scrin: - Inherits: ^Sidebar3 - PanelRegion: 260, 165, 3, 3, 22, 22, 3, 3 - PanelSides: Center -command-button-scrin-hover: - Inherits: ^Sidebar3 - PanelRegion: 260, 136, 3, 3, 22, 22, 3, 3 - PanelSides: Center -command-button-scrin-pressed: - Inherits: command-button-scrin -command-button-scrin-highlighted: - Inherits: ^Sidebar3 - PanelRegion: 260, 223, 3, 3, 22, 22, 3, 3 - PanelSides: Center -command-button-scrin-highlighted-hover: - Inherits: ^Sidebar3 - PanelRegion: 260, 194, 3, 3, 22, 22, 3, 3 - PanelSides: Center -command-button-scrin-highlighted-pressed: - Inherits: command-button-scrin-highlighted -command-button-scrin-disabled: - Inherits: command-button-scrin -command-button-scrin-highlighted-disabled: - Inherits: command-button-scrin-highlighted - sidebar-bits: Inherits: ^Glyphs Regions: production-tooltip-time: 136, 51, 16, 16 production-tooltip-power: 102, 51, 16, 16 production-tooltip-cost: 68, 51, 16, 16 + production-tooltip-armor: 17, 119, 16, 16 indicator-muted: 68, 145, 24, 24 -commandbar: - Inherits: ^Sidebar - Regions: - background: 0, 0, 434, 44 - production-icons: Inherits: ^Glyphs Regions: @@ -365,6 +64,12 @@ order-icons: stats: 204, 68, 16, 16 stats-disabled: 204, 85, 16, 16 stats-active: 204, 102, 16, 16 + upgrade: 85, 68, 16, 16 + upgrade-disabled: 85, 85, 16, 16 + upgrade-active: 85, 102, 16, 16 + cancel: 51, 119, 16, 16 + cancel-disabled: 51, 136, 16, 16 + cancel-active: 51, 153, 16, 16 power-icons: Inherits: ^Glyphs @@ -383,16 +88,20 @@ stance-icons: Regions: attack-anything: 0, 119, 16, 16 attack-anything-disabled: 0, 136, 16, 16 - attack-anything-active: 0, 153, 16, 16 defend: 17, 119, 16, 16 defend-disabled: 17, 136, 16, 16 - defend-active: 17, 153, 16, 16 return-fire: 34, 119, 16, 16 return-fire-disabled: 34, 136, 16, 16 - return-fire-active: 34, 153, 16, 16 hold-fire: 51, 119, 16, 16 hold-fire-disabled: 51, 136, 16, 16 - hold-fire-active: 51, 153, 16, 16 + +stance-icons-highlighted: + Inherits: stance-icons + Regions: + attack-anything: 0, 153, 16, 16 + defend: 17, 153, 16, 16 + return-fire: 34, 153, 16, 16 + hold-fire: 51, 153, 16, 16 command-icons: Inherits: ^Glyphs @@ -414,6 +123,9 @@ command-icons: queue-orders: 175, 207, 24, 24 queue-orders-disabled: 175, 232, 24, 24 +command-icons-highlighted: + Inherits: command-icons + sidebar-observer: Inherits: ^Sidebar Regions: @@ -421,31 +133,6 @@ sidebar-observer: replay-bottom: 0, 472, 238, 40 observer-bottom: 0, 176, 238, 8 -sidebar-button-observershroud: -sidebar-button-observershroud-pressed: -sidebar-button-observershroud-hover: - -sidebar-button-observer: - Inherits: ^Sidebar - PanelRegion: 260, 397, 5, 5, 18, 18, 5, 5 -sidebar-button-observer-hover: - Inherits: ^Sidebar - PanelRegion: 260, 368, 5, 5, 18, 18, 5, 5 -sidebar-button-observer-pressed: - Inherits: sidebar-button-observer -sidebar-button-observer-highlighted: - Inherits: ^Sidebar - PanelRegion: 260, 455, 5, 5, 18, 18, 5, 5 -sidebar-button-observer-highlighted-hover: - Inherits: ^Sidebar - PanelRegion: 260, 426, 5, 5, 18, 18, 5, 5 -sidebar-button-observer-highlighted-pressed: - Inherits: sidebar-button-observer-highlighted -sidebar-button-observer-disabled: - Inherits: sidebar-button-allies-disabled -sidebar-button-observer-highlighted-disabled: - Inherits: sidebar-button-allies-disabled - observer-scrollpanel-button: Inherits: ^Dialog PanelRegion: 769, 257, 2, 2, 122, 122, 2, 2 @@ -461,15 +148,23 @@ observer-scrollpanel-button-disabled: Inherits: ^Dialog PanelRegion: 769, 385, 2, 2, 122, 122, 2, 2 -observer-scrollheader-selected: +observer-scrollheader: Inherits: observer-scrollpanel-button-disabled -observer-scrollitem-selected: - Inherits: observer-scrollpanel-button-pressed +observer-scrollheader-highlighted: + Inherits: observer-scrollpanel-button-disabled + +observer-scrollitem: observer-scrollitem-hover: Inherits: observer-scrollpanel-button +observer-scrollitem-pressed: + Inherits: observer-scrollpanel-button + +observer-scrollitem-highlighted: + Inherits: observer-scrollpanel-button-pressed + # Used for the main menu frame dialog: Inherits: ^Dialog @@ -506,9 +201,11 @@ dialog5: lobby-bits: Inherits: ^Glyphs Regions: - spawn-unclaimed: 91, 119, 22, 22 spawn-claimed: 68, 119, 22, 22 + spawn-unclaimed: 91, 119, 22, 22 + spawn-disabled: 114, 119, 22, 22 admin: 170, 0, 6, 5 + bot: 170, 51, 16, 16 colorpicker: 68, 119, 22, 22 huepicker: 136, 0, 7, 15 kick: 153, 0, 11, 11 @@ -542,42 +239,45 @@ strategic: Inherits: ^Glyphs Regions: unowned: 68, 119, 22, 22 - critical_unowned: 114, 119, 22, 22 - enemy_owned: 137, 119, 22, 22 - player_owned: 183, 119, 22, 22 + critical_unowned: 137, 119, 22, 22 + enemy_owned: 160, 119, 22, 22 + player_owned: 160, 142, 22, 22 flags: - Inherits: ^Glyphs + Image: flags.png Regions: - england: 226, 49, 30, 15 - germany: 226, 65, 30, 15 - france: 226, 81, 30, 15 - zocom: 226, 97, 30, 15 - talon: 226, 113, 30, 15 - eagle: 226, 129, 30, 15 - ukraine: 226, 145, 30, 15 - russia: 226, 161, 30, 15 - iraq: 195, 145, 30, 15 - blackh: 195, 161, 30, 15 - legion: 133, 161, 30, 15 - marked: 164, 161, 30, 15 - shadow: 102, 161, 30, 15 - allies: 226, 177, 30, 15 - soviet: 226, 193, 30, 15 - gdi: 226, 97, 30, 15 - nod: 195, 161, 30, 15 - scrin: 164, 177, 30, 15 - reaper: 133, 177, 30, 15 - traveler: 102, 177, 30, 15 - harbinger: 164, 177, 30, 15 - collector: 71, 177, 30, 15 - RandomSoviet: 226, 209, 30, 15 - RandomAllies: 226, 225, 30, 15 - RandomGDI: 195, 177, 30, 15 - RandomNOD: 195, 193, 30, 15 - RandomScrin: 164, 193, 30,15 - Random: 226, 241, 30, 15 - spectator: 226, 241, 30, 15 + allies: 31, 16, 30, 15 + england: 62, 16, 30, 15 + germany: 93, 16, 30, 15 + france: 124, 16, 30, 15 + usa: 155, 16, 30, 15 + soviet: 31, 32, 30, 15 + russia: 62, 32, 30, 15 + ukraine: 93, 32, 30, 15 + iraq: 124, 32, 30, 15 + yuri: 155, 32, 30, 15 + gdi: 31, 48, 30, 15 + talon: 62, 48, 30, 15 + zocom: 93, 48, 30, 15 + eagle: 124, 48, 30, 15 + arc: 155, 48, 30, 15 + nod: 31, 64, 30, 15 + blackh: 62, 64, 30, 15 + marked: 93, 64, 30, 15 + legion: 124, 64, 30, 15 + shadow: 155, 64, 30, 15 + scrin: 31, 80, 30, 15 + reaper: 62, 80, 30, 15 + traveler: 93, 80, 30, 15 + harbinger: 124, 80, 30, 15 + collector: 155, 80, 30, 15 + RandomAllies: 0, 16, 30, 15 + RandomSoviet: 0, 32, 30, 15 + RandomGDI: 0, 48, 30, 15 + RandomNOD: 0, 64, 30, 15 + RandomScrin: 0, 80, 30,15 + Random: 0, 0, 30, 15 + spectator: 0, 0, 30, 15 music: Inherits: ^Glyphs @@ -685,6 +385,38 @@ scrollpanel-button-pressed: scrollpanel-button-disabled: Inherits: button +scrollitem: + +scrollitem-hover: + Inherits: ^Dialog + PanelRegion: 512, 452, 0, 0, 30, 30, 0, 0 + +scrollitem-pressed: + Inherits: ^Dialog + PanelRegion: 543, 452, 0, 0, 30, 30, 0, 0 + +scrollitem-highlighted: + Inherits: button-highlighted-pressed + +scrollitem-highlighted-hover: + Inherits: button-highlighted-pressed + +scrollitem-highlighted-pressed: + Inherits: button-highlighted-pressed + +scrollitem-nohover: + +scrollitem-nohover-highlighted: + +scrollheader: + Inherits: button + +scrollheader-highlighted: + Inherits: button + +scrollheader-highlighted-hover: + Inherits: button-hover + slider: Inherits: ^Dialog Regions: @@ -708,18 +440,46 @@ slider-thumb-disabled: checkbox: Inherits: button-pressed -checkbox-bits: +checkmark-tick: Inherits: ^Glyphs Regions: checked: 187, 0, 16, 16 - checked-disabled: 204, 0, 16, 16 - crossed: 221, 0, 16, 16 - crossed-disabled: 238, 0, 16, 16 + checked-pressed: 204, 0, 16, 16 + unchecked: 0, 0, 0, 0 + unchecked-pressed: 204, 0, 16, 16 + +checkmark-tick-highlighted: + Inherits: checkmark-tick + +checkmark-cross: + Inherits: ^Glyphs + Regions: + checked: 221, 0, 16, 16 + checked-pressed: 238, 0, 16, 16 + unchecked: 0, 0, 0, 0 + unchecked-pressed: 238, 0, 16, 16 + +checkmark-cross-highlighted: + Inherits: checkmark-cross + +checkmark-mute: + Inherits: ^Glyphs + Regions: + unchecked: 0, 170, 16, 16 + unchecked-pressed: 17, 170, 16, 16 + checked: 17, 170, 16, 16 + checked-pressed: 0, 170, 16, 16 + +checkmark-mute-highlighted: + Inherits: checkmark-mute checkbox-hover: Inherits: ^Dialog PanelRegion: 641, 129, 2, 2, 122, 122, 2, 2 +checkbox-pressed: + Inherits: checkbox-hover + checkbox-disabled: Inherits: ^Dialog PanelRegion: 641, 257, 2, 2, 122, 122, 2, 2 @@ -728,26 +488,54 @@ checkbox-highlighted: Inherits: ^Dialog PanelRegion: 897, 1, 2, 2, 122, 122, 2, 2 -scrollitem-selected: - Inherits: button-pressed +checkbox-highlighted-disabled: + Inherits: checkbox-disabled -scrollitem-hover: - Inherits: button +checkbox-highlighted-pressed: + Inherits: button-highlighted-pressed + +checkbox-toggle: -scrollheader-selected: +checkbox-toggle-hover: Inherits: button -scrollitem-nohover: +checkbox-toggle-pressed: + Inherits: checkbox-pressed + +checkbox-toggle-highlighted: + +checkbox-toggle-highlighted-hover: + Inherits: button-highlighted + +checkbox-toggle-highlighted-pressed: + Inherits: checkbox-highlighted-pressed -logos: - Inherits: ^LoadScreen +mission-completion-tick: + Inherits: ^Glyphs Regions: - logo: 0, 0, 512, 256 + incomplete: 209, 223, 16, 16 + complete: 209, 240, 16, 16 -loadscreen-stripe: - Inherits: ^LoadScreen - PanelRegion: 258, 0, 0, 0, 253, 256, 0, 0 - PanelSides: Center +mission-completion-stars: + Inherits: ^Glyphs + Regions: + bronze: 0, 256, 17, 16 + silver: 17, 256, 17, 16 + gold: 34, 256, 17, 16 + +loading-artwork: + Image: ca-loading-artwork.png + Image2x: ca-loading-artwork-2x.png + Image3x: ca-loading-artwork-3x.png + Regions: + logo: 0, 0, 1024, 256 + +menu-logo: + Image: ca-menu-logo.png + Image2x: ca-menu-logo-2x.png + Image3x: ca-menu-logo-3x.png + Regions: + logo: 0, 0, 512, 256 mainmenu-border: Inherits: ^Dialog @@ -785,3 +573,1104 @@ dropdown-separators: separator-pressed: 766, 2, 1, 19 separator-disabled: 513, 258, 1, 19 observer-separator: 769, 258, 1, 19 + +separator: + Inherits: button + +editor: + Inherits: ^Glyphs + Regions: + select: 34, 187, 16, 16 + tiles: 0, 187, 16, 16 + overlays: 17, 187, 16, 16 + actors: 34, 68, 16, 16 + tools: 136, 68, 16, 16 + history: 136, 51, 16, 16 + erase: 50, 187, 16, 16 + +tab-button: + Inherits: button + +tab-button-hover: + Inherits: button-hover + +tab-button-pressed: + Inherits: button-highlighted-pressed + +tab-button-disabled: + Inherits: button-disabled + +tab-button-highlighted: + Inherits: button-highlighted-pressed + +tab-button-highlighted-hover: + Inherits: button-highlighted-pressed + +tab-button-highlighted-pressed: + Inherits: button-highlighted-pressed + +tab-button-highlighted-disabled: + Inherits: button-highlighted-disabled + +# #### New UI + +player-ui-bits-shared: + Image: player-ui-shared.png + Regions: + power-indicator: 1, 1, 11, 2 + +power-meter: + Image: player-ui-shared.png + Regions: + red: 1,4,7,2 + yellow: 1,7,7,2 + green: 1,10,7,2 + grey: 1,13,7,2 + +unit-upgrade-buttons: + Image: unit-upgrade-button.png + Regions: + upgrade: 0, 0, 32, 32 + +^PlayerUIBits: + Regions: + background: 0, 0, 258, 597 + background-command-bar: 0, 598, 467, 47 + radar: 28, 40, 222, 222 + palette-borders-overlay: 260, 179, 194, 244 + support-power-border-overlay: 260, 179, 64, 48 + +^SidebarProductionTypeButton: + PanelRegion: 260, 7, 1, 1, 30, 24, 1, 1 +^SidebarProductionTypeButtonHover: + PanelRegion: 293, 7, 1, 1, 30, 24, 1, 1 +^SidebarProductionTypeButtonPressed: + PanelRegion: 326, 7, 1, 1, 30, 24, 1, 1 +^SidebarProductionTypeButtonHighlighted: + PanelRegion: 359, 7, 1, 1, 30, 24, 1, 1 +^SidebarProductionTypeButtonHighlightedHover: + Inherits: ^SidebarProductionTypeButtonHighlighted +^SidebarProductionTypeButtonHighlightedPressed: + Inherits: ^SidebarProductionTypeButtonPressed +^SidebarProductionTypeButtonDisabled: + PanelRegion: 392, 7, 1, 1, 30, 24, 1, 1 +^SidebarProductionTypeButtonHighlightedDisabled: + Inherits: ^SidebarProductionTypeButtonDisabled + +^SidebarProductionTabButton: + PanelRegion: 260, 34, 0, 0, 31, 24, 0, 0 +^SidebarProductionTabButtonHover: + PanelRegion: 292, 34, 0, 0, 31, 24, 0, 0 +^SidebarProductionTabButtonPressed: + PanelRegion: 324, 34, 0, 0, 31, 24, 0, 0 +^SidebarProductionTabButtonHighlighted: + PanelRegion: 356, 34, 0, 0, 31, 24, 0, 0 +^SidebarProductionTabButtonHighlightedHover: + Inherits: ^SidebarProductionTabButtonHighlighted +^SidebarProductionTabButtonHighlightedPressed: + Inherits: ^SidebarProductionTabButtonPressed +^SidebarProductionTabButtonDisabled: + PanelRegion: 388, 34, 0, 0, 31, 24, 0, 0 +^SidebarProductionTabButtonHighlightedDisabled: + Inherits: ^SidebarProductionTabButtonDisabled + +^SidebarProductionTabLeftButton: + PanelRegion: 425, 3, 0, 0, 17, 24, 0, 0 +^SidebarProductionTabLeftButtonHover: + PanelRegion: 443, 3, 0, 0, 17, 24, 0, 0 +^SidebarProductionTabLeftButtonPressed: + PanelRegion: 461, 3, 0, 0, 17, 24, 0, 0 +^SidebarProductionTabLeftButtonDisabled: + PanelRegion: 479, 3, 0, 0, 17, 24, 0, 0 + +^SidebarProductionTabRightButton: + PanelRegion: 425, 31, 0, 0, 16, 24, 0, 0 +^SidebarProductionTabRightButtonHover: + PanelRegion: 442, 31, 0, 0, 16, 24, 0, 0 +^SidebarProductionTabRightButtonPressed: + PanelRegion: 459, 31, 0, 0, 16, 24, 0, 0 +^SidebarProductionTabRightButtonDisabled: + PanelRegion: 476, 31, 0, 0, 16, 24, 0, 0 + +^SidebarTopButton: + Inherits: ^SidebarProductionTypeButton +^SidebarTopButtonHover: + Inherits: ^SidebarProductionTypeButtonHover +^SidebarTopButtonPressed: + Inherits: ^SidebarProductionTypeButtonPressed +^SidebarTopButtonHighlighted: + Inherits: ^SidebarProductionTypeButtonHighlighted +^SidebarTopButtonHighlightedHover: + Inherits: ^SidebarProductionTypeButtonHighlightedHover +^SidebarTopButtonHighlightedPressed: + Inherits: ^SidebarProductionTypeButtonPressed +^SidebarTopButtonDisabled: + Inherits: ^SidebarProductionTypeButtonDisabled +^SidebarTopButtonHighlightedDisabled: + Inherits: ^SidebarProductionTabButtonDisabled + +^SidebarScrollUpButton: + PanelRegion: 260, 84, 0, 0, 97, 18, 0, 0 +^SidebarScrollUpButtonHover: + PanelRegion: 260, 103, 0, 0, 97, 18, 0, 0 +^SidebarScrollUpButtonPressed: + PanelRegion: 260, 122, 0, 0, 97, 18, 0, 0 +^SidebarScrollUpButtonDisabled: + PanelRegion: 260, 160, 0, 0, 97, 18, 0, 0 + +^SidebarScrollDownButton: + PanelRegion: 358, 84, 0, 0, 96, 18, 0, 0 +^SidebarScrollDownButtonHover: + PanelRegion: 358, 103, 0, 0, 96, 18, 0, 0 +^SidebarScrollDownButtonPressed: + PanelRegion: 358, 122, 0, 0, 96, 18, 0, 0 +^SidebarScrollDownButtonDisabled: + PanelRegion: 358, 160, 0, 0, 96, 18, 0, 0 + +^CommandBarButton: + PanelRegion: 458, 59, 0, 0, 34, 26, 0, 0 +^CommandBarButtonHover: + PanelRegion: 458, 86, 0, 0, 34, 26, 0, 0 +^CommandBarButtonPressed: + PanelRegion: 458, 113, 0, 0, 34, 26, 0, 0 + +# ---- Allies + +player-ui-allies: + Image: player-ui-allies.png + +player-ui-bits-allies: + Inherits@IMAGE: player-ui-allies + Inherits@REGIONS: ^PlayerUIBits + +sidebar-production-type-button-allies: + Inherits@IMAGE: player-ui-allies + Inherits@PANELREGION: ^SidebarProductionTypeButton +sidebar-production-type-button-allies-hover: + Inherits@IMAGE: player-ui-allies + Inherits@PANELREGION: ^SidebarProductionTypeButtonHover +sidebar-production-type-button-allies-pressed: + Inherits@IMAGE: player-ui-allies + Inherits@PANELREGION: ^SidebarProductionTypeButtonPressed +sidebar-production-type-button-allies-highlighted: + Inherits@IMAGE: player-ui-allies + Inherits@PANELREGION: ^SidebarProductionTypeButtonHighlighted +sidebar-production-type-button-allies-highlighted-hover: + Inherits@IMAGE: player-ui-allies + Inherits@PANELREGION: ^SidebarProductionTypeButtonHighlightedHover +sidebar-production-type-button-allies-highlighted-pressed: + Inherits@IMAGE: player-ui-allies + Inherits@PANELREGION: ^SidebarProductionTypeButtonHighlightedPressed +sidebar-production-type-button-allies-disabled: + Inherits@IMAGE: player-ui-allies + Inherits@PANELREGION: ^SidebarProductionTypeButtonDisabled +sidebar-production-type-button-allies-highlighted-disabled: + Inherits@IMAGE: player-ui-allies + Inherits@PANELREGION: ^SidebarProductionTypeButtonHighlightedDisabled + +sidebar-production-tab-button-allies: + Inherits@IMAGE: player-ui-allies + Inherits@PANELREGION: ^SidebarProductionTabButton +sidebar-production-tab-button-allies-hover: + Inherits@IMAGE: player-ui-allies + Inherits@PANELREGION: ^SidebarProductionTabButtonHover +sidebar-production-tab-button-allies-pressed: + Inherits@IMAGE: player-ui-allies + Inherits@PANELREGION: ^SidebarProductionTabButtonPressed +sidebar-production-tab-button-allies-highlighted: + Inherits@IMAGE: player-ui-allies + Inherits@PANELREGION: ^SidebarProductionTabButtonHighlighted +sidebar-production-tab-button-allies-highlighted-hover: + Inherits@IMAGE: player-ui-allies + Inherits@PANELREGION: ^SidebarProductionTabButtonHighlightedHover +sidebar-production-tab-button-allies-highlighted-pressed: + Inherits@IMAGE: player-ui-allies + Inherits@PANELREGION: ^SidebarProductionTabButtonHighlightedPressed +sidebar-production-tab-button-allies-disabled: + Inherits@IMAGE: player-ui-allies + Inherits@PANELREGION: ^SidebarProductionTabButtonDisabled +sidebar-production-tab-button-allies-highlighted-disabled: + Inherits@IMAGE: player-ui-allies + Inherits@PANELREGION: ^SidebarProductionTabButtonHighlightedDisabled + +sidebar-production-tab-left-button-allies: + Inherits@IMAGE: player-ui-allies + Inherits@PANELREGION: ^SidebarProductionTabLeftButton +sidebar-production-tab-left-button-allies-hover: + Inherits@IMAGE: player-ui-allies + Inherits@PANELREGION: ^SidebarProductionTabLeftButtonHover +sidebar-production-tab-left-button-allies-pressed: + Inherits@IMAGE: player-ui-allies + Inherits@PANELREGION: ^SidebarProductionTabLeftButtonPressed +sidebar-production-tab-left-button-allies-disabled: + Inherits@IMAGE: player-ui-allies + Inherits@PANELREGION: ^SidebarProductionTabLeftButtonDisabled + +sidebar-production-tab-right-button-allies: + Inherits@IMAGE: player-ui-allies + Inherits@PANELREGION: ^SidebarProductionTabRightButton +sidebar-production-tab-right-button-allies-hover: + Inherits@IMAGE: player-ui-allies + Inherits@PANELREGION: ^SidebarProductionTabRightButtonHover +sidebar-production-tab-right-button-allies-pressed: + Inherits@IMAGE: player-ui-allies + Inherits@PANELREGION: ^SidebarProductionTabRightButtonPressed +sidebar-production-tab-right-button-allies-disabled: + Inherits@IMAGE: player-ui-allies + Inherits@PANELREGION: ^SidebarProductionTabRightButtonDisabled + +sidebar-top-button-allies: + Inherits@IMAGE: player-ui-allies + Inherits@PANELREGION: ^SidebarTopButton +sidebar-top-button-allies-hover: + Inherits@IMAGE: player-ui-allies + Inherits@PANELREGION: ^SidebarTopButtonHover +sidebar-top-button-allies-pressed: + Inherits@IMAGE: player-ui-allies + Inherits@PANELREGION: ^SidebarTopButtonPressed +sidebar-top-button-allies-highlighted: + Inherits@IMAGE: player-ui-allies + Inherits@PANELREGION: ^SidebarTopButtonHighlighted +sidebar-top-button-allies-highlighted-hover: + Inherits@IMAGE: player-ui-allies + Inherits@PANELREGION: ^SidebarTopButtonHighlightedHover +sidebar-top-button-allies-highlighted-pressed: + Inherits@IMAGE: player-ui-allies + Inherits@PANELREGION: ^SidebarTopButtonHighlightedPressed +sidebar-top-button-allies-disabled: + Inherits@IMAGE: player-ui-allies + Inherits@PANELREGION: ^SidebarTopButtonDisabled +sidebar-top-button-allies-highlighted-disabled: + Inherits@IMAGE: player-ui-allies + Inherits@PANELREGION: ^SidebarTopButtonHighlightedDisabled + +sidebar-scrollup-button-allies: + Inherits@IMAGE: player-ui-allies + Inherits@PANELREGION: ^SidebarScrollUpButton +sidebar-scrollup-button-allies-hover: + Inherits@IMAGE: player-ui-allies + Inherits@PANELREGION: ^SidebarScrollUpButtonHover +sidebar-scrollup-button-allies-pressed: + Inherits@IMAGE: player-ui-allies + Inherits@PANELREGION: ^SidebarScrollUpButtonPressed +sidebar-scrollup-button-allies-disabled: + Inherits@IMAGE: player-ui-allies + Inherits@PANELREGION: ^SidebarScrollUpButtonDisabled + +sidebar-scrolldown-button-allies: + Inherits@IMAGE: player-ui-allies + Inherits@PANELREGION: ^SidebarScrollDownButton +sidebar-scrolldown-button-allies-hover: + Inherits@IMAGE: player-ui-allies + Inherits@PANELREGION: ^SidebarScrollDownButtonHover +sidebar-scrolldown-button-allies-pressed: + Inherits@IMAGE: player-ui-allies + Inherits@PANELREGION: ^SidebarScrollDownButtonPressed +sidebar-scrolldown-button-allies-disabled: + Inherits@IMAGE: player-ui-allies + Inherits@PANELREGION: ^SidebarScrollDownButtonDisabled + +commandbar-button-allies: + Inherits@IMAGE: player-ui-allies + Inherits@PANELREGION: ^CommandBarButton +commandbar-button-allies-hover: + Inherits@IMAGE: player-ui-allies + Inherits@PANELREGION: ^CommandBarButtonHover +commandbar-button-allies-pressed: + Inherits@IMAGE: player-ui-allies + Inherits@PANELREGION: ^CommandBarButtonPressed +commandbar-button-allies-highlighted: + Inherits: commandbar-button-allies +commandbar-button-allies-disabled: + Inherits: commandbar-button-allies +commandbar-button-allies-highlighted-hover: + Inherits: commandbar-button-allies-hover +commandbar-button-allies-highlighted-pressed: + Inherits: commandbar-button-allies-pressed +commandbar-button-allies-highlighted-disabled: + Inherits: commandbar-button-allies + +# ---- Soviet + +player-ui-soviet: + Image: player-ui-soviet.png + +player-ui-bits-soviet: + Inherits@IMAGE: player-ui-soviet + Inherits@REGIONS: ^PlayerUIBits + +sidebar-production-type-button-soviet: + Inherits@IMAGE: player-ui-soviet + Inherits@PANELREGION: ^SidebarProductionTypeButton +sidebar-production-type-button-soviet-hover: + Inherits@IMAGE: player-ui-soviet + Inherits@PANELREGION: ^SidebarProductionTypeButtonHover +sidebar-production-type-button-soviet-pressed: + Inherits@IMAGE: player-ui-soviet + Inherits@PANELREGION: ^SidebarProductionTypeButtonPressed +sidebar-production-type-button-soviet-highlighted: + Inherits@IMAGE: player-ui-soviet + Inherits@PANELREGION: ^SidebarProductionTypeButtonHighlighted +sidebar-production-type-button-soviet-highlighted-hover: + Inherits@IMAGE: player-ui-soviet + Inherits@PANELREGION: ^SidebarProductionTypeButtonHighlightedHover +sidebar-production-type-button-soviet-highlighted-pressed: + Inherits@IMAGE: player-ui-soviet + Inherits@PANELREGION: ^SidebarProductionTypeButtonHighlightedPressed +sidebar-production-type-button-soviet-disabled: + Inherits@IMAGE: player-ui-soviet + Inherits@PANELREGION: ^SidebarProductionTypeButtonDisabled +sidebar-production-type-button-soviet-highlighted-disabled: + Inherits@IMAGE: player-ui-soviet + Inherits@PANELREGION: ^SidebarProductionTypeButtonHighlightedDisabled + +sidebar-production-tab-button-soviet: + Inherits@IMAGE: player-ui-soviet + Inherits@PANELREGION: ^SidebarProductionTabButton +sidebar-production-tab-button-soviet-hover: + Inherits@IMAGE: player-ui-soviet + Inherits@PANELREGION: ^SidebarProductionTabButtonHover +sidebar-production-tab-button-soviet-pressed: + Inherits@IMAGE: player-ui-soviet + Inherits@PANELREGION: ^SidebarProductionTabButtonPressed +sidebar-production-tab-button-soviet-highlighted: + Inherits@IMAGE: player-ui-soviet + Inherits@PANELREGION: ^SidebarProductionTabButtonHighlighted +sidebar-production-tab-button-soviet-highlighted-hover: + Inherits@IMAGE: player-ui-soviet + Inherits@PANELREGION: ^SidebarProductionTabButtonHighlightedHover +sidebar-production-tab-button-soviet-highlighted-pressed: + Inherits@IMAGE: player-ui-soviet + Inherits@PANELREGION: ^SidebarProductionTabButtonHighlightedPressed +sidebar-production-tab-button-soviet-disabled: + Inherits@IMAGE: player-ui-soviet + Inherits@PANELREGION: ^SidebarProductionTabButtonDisabled +sidebar-production-tab-button-soviet-highlighted-disabled: + Inherits@IMAGE: player-ui-soviet + Inherits@PANELREGION: ^SidebarProductionTabButtonHighlightedDisabled + +sidebar-production-tab-left-button-soviet: + Inherits@IMAGE: player-ui-soviet + Inherits@PANELREGION: ^SidebarProductionTabLeftButton +sidebar-production-tab-left-button-soviet-hover: + Inherits@IMAGE: player-ui-soviet + Inherits@PANELREGION: ^SidebarProductionTabLeftButtonHover +sidebar-production-tab-left-button-soviet-pressed: + Inherits@IMAGE: player-ui-soviet + Inherits@PANELREGION: ^SidebarProductionTabLeftButtonPressed +sidebar-production-tab-left-button-soviet-disabled: + Inherits@IMAGE: player-ui-soviet + Inherits@PANELREGION: ^SidebarProductionTabLeftButtonDisabled + +sidebar-production-tab-right-button-soviet: + Inherits@IMAGE: player-ui-soviet + Inherits@PANELREGION: ^SidebarProductionTabRightButton +sidebar-production-tab-right-button-soviet-hover: + Inherits@IMAGE: player-ui-soviet + Inherits@PANELREGION: ^SidebarProductionTabRightButtonHover +sidebar-production-tab-right-button-soviet-pressed: + Inherits@IMAGE: player-ui-soviet + Inherits@PANELREGION: ^SidebarProductionTabRightButtonPressed +sidebar-production-tab-right-button-soviet-disabled: + Inherits@IMAGE: player-ui-soviet + Inherits@PANELREGION: ^SidebarProductionTabRightButtonDisabled + +sidebar-top-button-soviet: + Inherits@IMAGE: player-ui-soviet + Inherits@PANELREGION: ^SidebarTopButton +sidebar-top-button-soviet-hover: + Inherits@IMAGE: player-ui-soviet + Inherits@PANELREGION: ^SidebarTopButtonHover +sidebar-top-button-soviet-pressed: + Inherits@IMAGE: player-ui-soviet + Inherits@PANELREGION: ^SidebarTopButtonPressed +sidebar-top-button-soviet-highlighted: + Inherits@IMAGE: player-ui-soviet + Inherits@PANELREGION: ^SidebarTopButtonHighlighted +sidebar-top-button-soviet-highlighted-hover: + Inherits@IMAGE: player-ui-soviet + Inherits@PANELREGION: ^SidebarTopButtonHighlightedHover +sidebar-top-button-soviet-highlighted-pressed: + Inherits@IMAGE: player-ui-soviet + Inherits@PANELREGION: ^SidebarTopButtonHighlightedPressed +sidebar-top-button-soviet-disabled: + Inherits@IMAGE: player-ui-soviet + Inherits@PANELREGION: ^SidebarTopButtonDisabled +sidebar-top-button-soviet-highlighted-disabled: + Inherits@IMAGE: player-ui-soviet + Inherits@PANELREGION: ^SidebarTopButtonHighlightedDisabled + +sidebar-scrollup-button-soviet: + Inherits@IMAGE: player-ui-soviet + Inherits@PANELREGION: ^SidebarScrollUpButton +sidebar-scrollup-button-soviet-hover: + Inherits@IMAGE: player-ui-soviet + Inherits@PANELREGION: ^SidebarScrollUpButtonHover +sidebar-scrollup-button-soviet-pressed: + Inherits@IMAGE: player-ui-soviet + Inherits@PANELREGION: ^SidebarScrollUpButtonPressed +sidebar-scrollup-button-soviet-disabled: + Inherits@IMAGE: player-ui-soviet + Inherits@PANELREGION: ^SidebarScrollUpButtonDisabled + +sidebar-scrolldown-button-soviet: + Inherits@IMAGE: player-ui-soviet + Inherits@PANELREGION: ^SidebarScrollDownButton +sidebar-scrolldown-button-soviet-hover: + Inherits@IMAGE: player-ui-soviet + Inherits@PANELREGION: ^SidebarScrollDownButtonHover +sidebar-scrolldown-button-soviet-pressed: + Inherits@IMAGE: player-ui-soviet + Inherits@PANELREGION: ^SidebarScrollDownButtonPressed +sidebar-scrolldown-button-soviet-disabled: + Inherits@IMAGE: player-ui-soviet + Inherits@PANELREGION: ^SidebarScrollDownButtonDisabled + +commandbar-button-soviet: + Inherits@IMAGE: player-ui-soviet + Inherits@PANELREGION: ^CommandBarButton +commandbar-button-soviet-hover: + Inherits@IMAGE: player-ui-soviet + Inherits@PANELREGION: ^CommandBarButtonHover +commandbar-button-soviet-pressed: + Inherits@IMAGE: player-ui-soviet + Inherits@PANELREGION: ^CommandBarButtonPressed +commandbar-button-soviet-highlighted: + Inherits: commandbar-button-soviet +commandbar-button-soviet-disabled: + Inherits: commandbar-button-soviet +commandbar-button-soviet-highlighted-hover: + Inherits: commandbar-button-soviet-hover +commandbar-button-soviet-highlighted-pressed: + Inherits: commandbar-button-soviet-pressed +commandbar-button-soviet-highlighted-disabled: + Inherits: commandbar-button-soviet + +# ---- GDI + +player-ui-gdi: + Image: player-ui-gdi.png + +player-ui-bits-gdi: + Inherits@IMAGE: player-ui-gdi + Inherits@REGIONS: ^PlayerUIBits + +sidebar-production-type-button-gdi: + Inherits@IMAGE: player-ui-gdi + Inherits@PANELREGION: ^SidebarProductionTypeButton +sidebar-production-type-button-gdi-hover: + Inherits@IMAGE: player-ui-gdi + Inherits@PANELREGION: ^SidebarProductionTypeButtonHover +sidebar-production-type-button-gdi-pressed: + Inherits@IMAGE: player-ui-gdi + Inherits@PANELREGION: ^SidebarProductionTypeButtonPressed +sidebar-production-type-button-gdi-highlighted: + Inherits@IMAGE: player-ui-gdi + Inherits@PANELREGION: ^SidebarProductionTypeButtonHighlighted +sidebar-production-type-button-gdi-highlighted-hover: + Inherits@IMAGE: player-ui-gdi + Inherits@PANELREGION: ^SidebarProductionTypeButtonHighlightedHover +sidebar-production-type-button-gdi-highlighted-pressed: + Inherits@IMAGE: player-ui-gdi + Inherits@PANELREGION: ^SidebarProductionTypeButtonHighlightedPressed +sidebar-production-type-button-gdi-disabled: + Inherits@IMAGE: player-ui-gdi + Inherits@PANELREGION: ^SidebarProductionTypeButtonDisabled +sidebar-production-type-button-gdi-highlighted-disabled: + Inherits@IMAGE: player-ui-gdi + Inherits@PANELREGION: ^SidebarProductionTypeButtonHighlightedDisabled + +sidebar-production-tab-button-gdi: + Inherits@IMAGE: player-ui-gdi + Inherits@PANELREGION: ^SidebarProductionTabButton +sidebar-production-tab-button-gdi-hover: + Inherits@IMAGE: player-ui-gdi + Inherits@PANELREGION: ^SidebarProductionTabButtonHover +sidebar-production-tab-button-gdi-pressed: + Inherits@IMAGE: player-ui-gdi + Inherits@PANELREGION: ^SidebarProductionTabButtonPressed +sidebar-production-tab-button-gdi-highlighted: + Inherits@IMAGE: player-ui-gdi + Inherits@PANELREGION: ^SidebarProductionTabButtonHighlighted +sidebar-production-tab-button-gdi-highlighted-hover: + Inherits@IMAGE: player-ui-gdi + Inherits@PANELREGION: ^SidebarProductionTabButtonHighlightedHover +sidebar-production-tab-button-gdi-highlighted-pressed: + Inherits@IMAGE: player-ui-gdi + Inherits@PANELREGION: ^SidebarProductionTabButtonHighlightedPressed +sidebar-production-tab-button-gdi-disabled: + Inherits@IMAGE: player-ui-gdi + Inherits@PANELREGION: ^SidebarProductionTabButtonDisabled +sidebar-production-tab-button-gdi-highlighted-disabled: + Inherits@IMAGE: player-ui-gdi + Inherits@PANELREGION: ^SidebarProductionTabButtonHighlightedDisabled + +sidebar-production-tab-left-button-gdi: + Inherits@IMAGE: player-ui-gdi + Inherits@PANELREGION: ^SidebarProductionTabLeftButton +sidebar-production-tab-left-button-gdi-hover: + Inherits@IMAGE: player-ui-gdi + Inherits@PANELREGION: ^SidebarProductionTabLeftButtonHover +sidebar-production-tab-left-button-gdi-pressed: + Inherits@IMAGE: player-ui-gdi + Inherits@PANELREGION: ^SidebarProductionTabLeftButtonPressed +sidebar-production-tab-left-button-gdi-disabled: + Inherits@IMAGE: player-ui-gdi + Inherits@PANELREGION: ^SidebarProductionTabLeftButtonDisabled + +sidebar-production-tab-right-button-gdi: + Inherits@IMAGE: player-ui-gdi + Inherits@PANELREGION: ^SidebarProductionTabRightButton +sidebar-production-tab-right-button-gdi-hover: + Inherits@IMAGE: player-ui-gdi + Inherits@PANELREGION: ^SidebarProductionTabRightButtonHover +sidebar-production-tab-right-button-gdi-pressed: + Inherits@IMAGE: player-ui-gdi + Inherits@PANELREGION: ^SidebarProductionTabRightButtonPressed +sidebar-production-tab-right-button-gdi-disabled: + Inherits@IMAGE: player-ui-gdi + Inherits@PANELREGION: ^SidebarProductionTabRightButtonDisabled + +sidebar-top-button-gdi: + Inherits@IMAGE: player-ui-gdi + Inherits@PANELREGION: ^SidebarTopButton +sidebar-top-button-gdi-hover: + Inherits@IMAGE: player-ui-gdi + Inherits@PANELREGION: ^SidebarTopButtonHover +sidebar-top-button-gdi-pressed: + Inherits@IMAGE: player-ui-gdi + Inherits@PANELREGION: ^SidebarTopButtonPressed +sidebar-top-button-gdi-highlighted: + Inherits@IMAGE: player-ui-gdi + Inherits@PANELREGION: ^SidebarTopButtonHighlighted +sidebar-top-button-gdi-highlighted-hover: + Inherits@IMAGE: player-ui-gdi + Inherits@PANELREGION: ^SidebarTopButtonHighlightedHover +sidebar-top-button-gdi-highlighted-pressed: + Inherits@IMAGE: player-ui-gdi + Inherits@PANELREGION: ^SidebarTopButtonHighlightedPressed +sidebar-top-button-gdi-disabled: + Inherits@IMAGE: player-ui-gdi + Inherits@PANELREGION: ^SidebarTopButtonDisabled +sidebar-top-button-gdi-highlighted-disabled: + Inherits@IMAGE: player-ui-gdi + Inherits@PANELREGION: ^SidebarTopButtonHighlightedDisabled + +sidebar-scrollup-button-gdi: + Inherits@IMAGE: player-ui-gdi + Inherits@PANELREGION: ^SidebarScrollUpButton +sidebar-scrollup-button-gdi-hover: + Inherits@IMAGE: player-ui-gdi + Inherits@PANELREGION: ^SidebarScrollUpButtonHover +sidebar-scrollup-button-gdi-pressed: + Inherits@IMAGE: player-ui-gdi + Inherits@PANELREGION: ^SidebarScrollUpButtonPressed +sidebar-scrollup-button-gdi-disabled: + Inherits@IMAGE: player-ui-gdi + Inherits@PANELREGION: ^SidebarScrollUpButtonDisabled + +sidebar-scrolldown-button-gdi: + Inherits@IMAGE: player-ui-gdi + Inherits@PANELREGION: ^SidebarScrollDownButton +sidebar-scrolldown-button-gdi-hover: + Inherits@IMAGE: player-ui-gdi + Inherits@PANELREGION: ^SidebarScrollDownButtonHover +sidebar-scrolldown-button-gdi-pressed: + Inherits@IMAGE: player-ui-gdi + Inherits@PANELREGION: ^SidebarScrollDownButtonPressed +sidebar-scrolldown-button-gdi-disabled: + Inherits@IMAGE: player-ui-gdi + Inherits@PANELREGION: ^SidebarScrollDownButtonDisabled + +commandbar-button-gdi: + Inherits@IMAGE: player-ui-gdi + Inherits@PANELREGION: ^CommandBarButton +commandbar-button-gdi-hover: + Inherits@IMAGE: player-ui-gdi + Inherits@PANELREGION: ^CommandBarButtonHover +commandbar-button-gdi-pressed: + Inherits@IMAGE: player-ui-gdi + Inherits@PANELREGION: ^CommandBarButtonPressed +commandbar-button-gdi-highlighted: + Inherits: commandbar-button-gdi +commandbar-button-gdi-disabled: + Inherits: commandbar-button-gdi +commandbar-button-gdi-highlighted-hover: + Inherits: commandbar-button-gdi-hover +commandbar-button-gdi-highlighted-pressed: + Inherits: commandbar-button-gdi-pressed +commandbar-button-gdi-highlighted-disabled: + Inherits: commandbar-button-gdi + +# ---- scrin + +player-ui-nod: + Image: player-ui-nod.png + +player-ui-bits-nod: + Inherits@IMAGE: player-ui-nod + Inherits@REGIONS: ^PlayerUIBits + +sidebar-production-type-button-nod: + Inherits@IMAGE: player-ui-nod + Inherits@PANELREGION: ^SidebarProductionTypeButton +sidebar-production-type-button-nod-hover: + Inherits@IMAGE: player-ui-nod + Inherits@PANELREGION: ^SidebarProductionTypeButtonHover +sidebar-production-type-button-nod-pressed: + Inherits@IMAGE: player-ui-nod + Inherits@PANELREGION: ^SidebarProductionTypeButtonPressed +sidebar-production-type-button-nod-highlighted: + Inherits@IMAGE: player-ui-nod + Inherits@PANELREGION: ^SidebarProductionTypeButtonHighlighted +sidebar-production-type-button-nod-highlighted-hover: + Inherits@IMAGE: player-ui-nod + Inherits@PANELREGION: ^SidebarProductionTypeButtonHighlightedHover +sidebar-production-type-button-nod-highlighted-pressed: + Inherits@IMAGE: player-ui-nod + Inherits@PANELREGION: ^SidebarProductionTypeButtonHighlightedPressed +sidebar-production-type-button-nod-disabled: + Inherits@IMAGE: player-ui-nod + Inherits@PANELREGION: ^SidebarProductionTypeButtonDisabled +sidebar-production-type-button-nod-highlighted-disabled: + Inherits@IMAGE: player-ui-nod + Inherits@PANELREGION: ^SidebarProductionTypeButtonHighlightedDisabled + +sidebar-production-tab-button-nod: + Inherits@IMAGE: player-ui-nod + Inherits@PANELREGION: ^SidebarProductionTabButton +sidebar-production-tab-button-nod-hover: + Inherits@IMAGE: player-ui-nod + Inherits@PANELREGION: ^SidebarProductionTabButtonHover +sidebar-production-tab-button-nod-pressed: + Inherits@IMAGE: player-ui-nod + Inherits@PANELREGION: ^SidebarProductionTabButtonPressed +sidebar-production-tab-button-nod-highlighted: + Inherits@IMAGE: player-ui-nod + Inherits@PANELREGION: ^SidebarProductionTabButtonHighlighted +sidebar-production-tab-button-nod-highlighted-hover: + Inherits@IMAGE: player-ui-nod + Inherits@PANELREGION: ^SidebarProductionTabButtonHighlightedHover +sidebar-production-tab-button-nod-highlighted-pressed: + Inherits@IMAGE: player-ui-nod + Inherits@PANELREGION: ^SidebarProductionTabButtonHighlightedPressed +sidebar-production-tab-button-nod-disabled: + Inherits@IMAGE: player-ui-nod + Inherits@PANELREGION: ^SidebarProductionTabButtonDisabled +sidebar-production-tab-button-nod-highlighted-disabled: + Inherits@IMAGE: player-ui-nod + Inherits@PANELREGION: ^SidebarProductionTabButtonHighlightedDisabled + +sidebar-production-tab-left-button-nod: + Inherits@IMAGE: player-ui-nod + Inherits@PANELREGION: ^SidebarProductionTabLeftButton +sidebar-production-tab-left-button-nod-hover: + Inherits@IMAGE: player-ui-nod + Inherits@PANELREGION: ^SidebarProductionTabLeftButtonHover +sidebar-production-tab-left-button-nod-pressed: + Inherits@IMAGE: player-ui-nod + Inherits@PANELREGION: ^SidebarProductionTabLeftButtonPressed +sidebar-production-tab-left-button-nod-disabled: + Inherits@IMAGE: player-ui-nod + Inherits@PANELREGION: ^SidebarProductionTabLeftButtonDisabled + +sidebar-production-tab-right-button-nod: + Inherits@IMAGE: player-ui-nod + Inherits@PANELREGION: ^SidebarProductionTabRightButton +sidebar-production-tab-right-button-nod-hover: + Inherits@IMAGE: player-ui-nod + Inherits@PANELREGION: ^SidebarProductionTabRightButtonHover +sidebar-production-tab-right-button-nod-pressed: + Inherits@IMAGE: player-ui-nod + Inherits@PANELREGION: ^SidebarProductionTabRightButtonPressed +sidebar-production-tab-right-button-nod-disabled: + Inherits@IMAGE: player-ui-nod + Inherits@PANELREGION: ^SidebarProductionTabRightButtonDisabled + +sidebar-top-button-nod: + Inherits@IMAGE: player-ui-nod + Inherits@PANELREGION: ^SidebarTopButton +sidebar-top-button-nod-hover: + Inherits@IMAGE: player-ui-nod + Inherits@PANELREGION: ^SidebarTopButtonHover +sidebar-top-button-nod-pressed: + Inherits@IMAGE: player-ui-nod + Inherits@PANELREGION: ^SidebarTopButtonPressed +sidebar-top-button-nod-highlighted: + Inherits@IMAGE: player-ui-nod + Inherits@PANELREGION: ^SidebarTopButtonHighlighted +sidebar-top-button-nod-highlighted-hover: + Inherits@IMAGE: player-ui-nod + Inherits@PANELREGION: ^SidebarTopButtonHighlightedHover +sidebar-top-button-nod-highlighted-pressed: + Inherits@IMAGE: player-ui-nod + Inherits@PANELREGION: ^SidebarTopButtonHighlightedPressed +sidebar-top-button-nod-disabled: + Inherits@IMAGE: player-ui-nod + Inherits@PANELREGION: ^SidebarTopButtonDisabled +sidebar-top-button-nod-highlighted-disabled: + Inherits@IMAGE: player-ui-nod + Inherits@PANELREGION: ^SidebarTopButtonHighlightedDisabled + +sidebar-scrollup-button-nod: + Inherits@IMAGE: player-ui-nod + Inherits@PANELREGION: ^SidebarScrollUpButton +sidebar-scrollup-button-nod-hover: + Inherits@IMAGE: player-ui-nod + Inherits@PANELREGION: ^SidebarScrollUpButtonHover +sidebar-scrollup-button-nod-pressed: + Inherits@IMAGE: player-ui-nod + Inherits@PANELREGION: ^SidebarScrollUpButtonPressed +sidebar-scrollup-button-nod-disabled: + Inherits@IMAGE: player-ui-nod + Inherits@PANELREGION: ^SidebarScrollUpButtonDisabled + +sidebar-scrolldown-button-nod: + Inherits@IMAGE: player-ui-nod + Inherits@PANELREGION: ^SidebarScrollDownButton +sidebar-scrolldown-button-nod-hover: + Inherits@IMAGE: player-ui-nod + Inherits@PANELREGION: ^SidebarScrollDownButtonHover +sidebar-scrolldown-button-nod-pressed: + Inherits@IMAGE: player-ui-nod + Inherits@PANELREGION: ^SidebarScrollDownButtonPressed +sidebar-scrolldown-button-nod-disabled: + Inherits@IMAGE: player-ui-nod + Inherits@PANELREGION: ^SidebarScrollDownButtonDisabled + +commandbar-button-nod: + Inherits@IMAGE: player-ui-nod + Inherits@PANELREGION: ^CommandBarButton +commandbar-button-nod-hover: + Inherits@IMAGE: player-ui-nod + Inherits@PANELREGION: ^CommandBarButtonHover +commandbar-button-nod-pressed: + Inherits@IMAGE: player-ui-nod + Inherits@PANELREGION: ^CommandBarButtonPressed +commandbar-button-nod-highlighted: + Inherits: commandbar-button-nod +commandbar-button-nod-disabled: + Inherits: commandbar-button-nod +commandbar-button-nod-highlighted-hover: + Inherits: commandbar-button-nod-hover +commandbar-button-nod-highlighted-pressed: + Inherits: commandbar-button-nod-pressed +commandbar-button-nod-highlighted-disabled: + Inherits: commandbar-button-nod + +# ---- Scrin + +player-ui-scrin: + Image: player-ui-scrin.png + +player-ui-bits-scrin: + Inherits@IMAGE: player-ui-scrin + Inherits@REGIONS: ^PlayerUIBits + +sidebar-production-type-button-scrin: + Inherits@IMAGE: player-ui-scrin + Inherits@PANELREGION: ^SidebarProductionTypeButton +sidebar-production-type-button-scrin-hover: + Inherits@IMAGE: player-ui-scrin + Inherits@PANELREGION: ^SidebarProductionTypeButtonHover +sidebar-production-type-button-scrin-pressed: + Inherits@IMAGE: player-ui-scrin + Inherits@PANELREGION: ^SidebarProductionTypeButtonPressed +sidebar-production-type-button-scrin-highlighted: + Inherits@IMAGE: player-ui-scrin + Inherits@PANELREGION: ^SidebarProductionTypeButtonHighlighted +sidebar-production-type-button-scrin-highlighted-hover: + Inherits@IMAGE: player-ui-scrin + Inherits@PANELREGION: ^SidebarProductionTypeButtonHighlightedHover +sidebar-production-type-button-scrin-highlighted-pressed: + Inherits@IMAGE: player-ui-scrin + Inherits@PANELREGION: ^SidebarProductionTypeButtonHighlightedPressed +sidebar-production-type-button-scrin-disabled: + Inherits@IMAGE: player-ui-scrin + Inherits@PANELREGION: ^SidebarProductionTypeButtonDisabled +sidebar-production-type-button-scrin-highlighted-disabled: + Inherits@IMAGE: player-ui-scrin + Inherits@PANELREGION: ^SidebarProductionTypeButtonHighlightedDisabled + +sidebar-production-tab-button-scrin: + Inherits@IMAGE: player-ui-scrin + Inherits@PANELREGION: ^SidebarProductionTabButton +sidebar-production-tab-button-scrin-hover: + Inherits@IMAGE: player-ui-scrin + Inherits@PANELREGION: ^SidebarProductionTabButtonHover +sidebar-production-tab-button-scrin-pressed: + Inherits@IMAGE: player-ui-scrin + Inherits@PANELREGION: ^SidebarProductionTabButtonPressed +sidebar-production-tab-button-scrin-highlighted: + Inherits@IMAGE: player-ui-scrin + Inherits@PANELREGION: ^SidebarProductionTabButtonHighlighted +sidebar-production-tab-button-scrin-highlighted-hover: + Inherits@IMAGE: player-ui-scrin + Inherits@PANELREGION: ^SidebarProductionTabButtonHighlightedHover +sidebar-production-tab-button-scrin-highlighted-pressed: + Inherits@IMAGE: player-ui-scrin + Inherits@PANELREGION: ^SidebarProductionTabButtonHighlightedPressed +sidebar-production-tab-button-scrin-disabled: + Inherits@IMAGE: player-ui-scrin + Inherits@PANELREGION: ^SidebarProductionTabButtonDisabled +sidebar-production-tab-button-scrin-highlighted-disabled: + Inherits@IMAGE: player-ui-scrin + Inherits@PANELREGION: ^SidebarProductionTabButtonHighlightedDisabled + +sidebar-production-tab-left-button-scrin: + Inherits@IMAGE: player-ui-scrin + Inherits@PANELREGION: ^SidebarProductionTabLeftButton +sidebar-production-tab-left-button-scrin-hover: + Inherits@IMAGE: player-ui-scrin + Inherits@PANELREGION: ^SidebarProductionTabLeftButtonHover +sidebar-production-tab-left-button-scrin-pressed: + Inherits@IMAGE: player-ui-scrin + Inherits@PANELREGION: ^SidebarProductionTabLeftButtonPressed +sidebar-production-tab-left-button-scrin-disabled: + Inherits@IMAGE: player-ui-scrin + Inherits@PANELREGION: ^SidebarProductionTabLeftButtonDisabled + +sidebar-production-tab-right-button-scrin: + Inherits@IMAGE: player-ui-scrin + Inherits@PANELREGION: ^SidebarProductionTabRightButton +sidebar-production-tab-right-button-scrin-hover: + Inherits@IMAGE: player-ui-scrin + Inherits@PANELREGION: ^SidebarProductionTabRightButtonHover +sidebar-production-tab-right-button-scrin-pressed: + Inherits@IMAGE: player-ui-scrin + Inherits@PANELREGION: ^SidebarProductionTabRightButtonPressed +sidebar-production-tab-right-button-scrin-disabled: + Inherits@IMAGE: player-ui-scrin + Inherits@PANELREGION: ^SidebarProductionTabRightButtonDisabled + +sidebar-top-button-scrin: + Inherits@IMAGE: player-ui-scrin + Inherits@PANELREGION: ^SidebarTopButton +sidebar-top-button-scrin-hover: + Inherits@IMAGE: player-ui-scrin + Inherits@PANELREGION: ^SidebarTopButtonHover +sidebar-top-button-scrin-pressed: + Inherits@IMAGE: player-ui-scrin + Inherits@PANELREGION: ^SidebarTopButtonPressed +sidebar-top-button-scrin-highlighted: + Inherits@IMAGE: player-ui-scrin + Inherits@PANELREGION: ^SidebarTopButtonHighlighted +sidebar-top-button-scrin-highlighted-hover: + Inherits@IMAGE: player-ui-scrin + Inherits@PANELREGION: ^SidebarTopButtonHighlightedHover +sidebar-top-button-scrin-highlighted-pressed: + Inherits@IMAGE: player-ui-scrin + Inherits@PANELREGION: ^SidebarTopButtonHighlightedPressed +sidebar-top-button-scrin-disabled: + Inherits@IMAGE: player-ui-scrin + Inherits@PANELREGION: ^SidebarTopButtonDisabled +sidebar-top-button-scrin-highlighted-disabled: + Inherits@IMAGE: player-ui-scrin + Inherits@PANELREGION: ^SidebarTopButtonHighlightedDisabled + +sidebar-scrollup-button-scrin: + Inherits@IMAGE: player-ui-scrin + Inherits@PANELREGION: ^SidebarScrollUpButton +sidebar-scrollup-button-scrin-hover: + Inherits@IMAGE: player-ui-scrin + Inherits@PANELREGION: ^SidebarScrollUpButtonHover +sidebar-scrollup-button-scrin-pressed: + Inherits@IMAGE: player-ui-scrin + Inherits@PANELREGION: ^SidebarScrollUpButtonPressed +sidebar-scrollup-button-scrin-disabled: + Inherits@IMAGE: player-ui-scrin + Inherits@PANELREGION: ^SidebarScrollUpButtonDisabled + +sidebar-scrolldown-button-scrin: + Inherits@IMAGE: player-ui-scrin + Inherits@PANELREGION: ^SidebarScrollDownButton +sidebar-scrolldown-button-scrin-hover: + Inherits@IMAGE: player-ui-scrin + Inherits@PANELREGION: ^SidebarScrollDownButtonHover +sidebar-scrolldown-button-scrin-pressed: + Inherits@IMAGE: player-ui-scrin + Inherits@PANELREGION: ^SidebarScrollDownButtonPressed +sidebar-scrolldown-button-scrin-disabled: + Inherits@IMAGE: player-ui-scrin + Inherits@PANELREGION: ^SidebarScrollDownButtonDisabled + +commandbar-button-scrin: + Inherits@IMAGE: player-ui-scrin + Inherits@PANELREGION: ^CommandBarButton +commandbar-button-scrin-hover: + Inherits@IMAGE: player-ui-scrin + Inherits@PANELREGION: ^CommandBarButtonHover +commandbar-button-scrin-pressed: + Inherits@IMAGE: player-ui-scrin + Inherits@PANELREGION: ^CommandBarButtonPressed +commandbar-button-scrin-highlighted: + Inherits: commandbar-button-scrin +commandbar-button-scrin-disabled: + Inherits: commandbar-button-scrin +commandbar-button-scrin-highlighted-hover: + Inherits: commandbar-button-scrin-hover +commandbar-button-scrin-highlighted-pressed: + Inherits: commandbar-button-scrin-pressed +commandbar-button-scrin-highlighted-disabled: + Inherits: commandbar-button-scrin + +# ---- Main Menu External Resources + +discord-icon: + Image: external-resources.png + PanelRegion: 0, 0, 0, 0, 32, 32, 0, 0 + +discord-icon-hover: + Image: external-resources.png + PanelRegion: 0, 32, 0, 0, 32, 32, 0, 0 + +discord-icon-pressed: + Inherits: discord-icon + +youtube-icon: + Image: external-resources.png + PanelRegion: 32, 0, 0, 0, 32, 32, 0, 0 + +youtube-icon-hover: + Image: external-resources.png + PanelRegion: 32, 32, 0, 0, 32, 32, 0, 0 + +youtube-icon-pressed: + Inherits: youtube-icon + +twitter-icon: + Image: external-resources.png + PanelRegion: 64, 0, 0, 0, 32, 32, 0, 0 + +twitter-icon-hover: + Image: external-resources.png + PanelRegion: 64, 32, 0, 0, 32, 32, 0, 0 + +twitter-icon-pressed: + Inherits: twitter-icon + +facebook-icon: + Image: external-resources.png + PanelRegion: 96, 0, 0, 0, 32, 32, 0, 0 + +facebook-icon-hover: + Image: external-resources.png + PanelRegion: 96, 32, 0, 0, 32, 32, 0, 0 + +facebook-icon-pressed: + Inherits: facebook-icon + +ladder-icon: + Image: external-resources.png + PanelRegion: 128, 0, 0, 0, 32, 32, 0, 0 + +ladder-icon-hover: + Image: external-resources.png + PanelRegion: 128, 32, 0, 0, 32, 32, 0, 0 + +ladder-icon-pressed: + Inherits: ladder-icon + +tree-icon: + Image: external-resources.png + PanelRegion: 160, 0, 0, 0, 32, 32, 0, 0 + +tree-icon-hover: + Image: external-resources.png + PanelRegion: 160, 32, 0, 0, 32, 32, 0, 0 + +tree-icon-pressed: + Inherits: tree-icon + +spreadsheet-icon: + Image: external-resources.png + PanelRegion: 192, 0, 0, 0, 32, 32, 0, 0 + +spreadsheet-icon-hover: + Image: external-resources.png + PanelRegion: 192, 32, 0, 0, 32, 32, 0, 0 + +spreadsheet-icon-pressed: + Inherits: spreadsheet-icon + +moddb-icon: + Image: external-resources.png + PanelRegion: 224, 0, 0, 0, 32, 32, 0, 0 + +moddb-icon-hover: + Image: external-resources.png + PanelRegion: 224, 32, 0, 0, 32, 32, 0, 0 + +moddb-icon-pressed: + Inherits: moddb-icon + +# ---- Player Rank + +allied-coalition: + Image: branch-indicators.png + Regions: + disabled: 512, 512, 1, 1 + influence-empty: 0, 0, 29, 65 + influence-full: 30, 0, 29, 65 + none: 60, 0, 29, 65 + greece: 90, 0, 29, 65 + korea: 120, 0, 29, 65 + sweden: 150, 0, 29, 65 + level0: 512, 512, 1, 1 + level1: 182, 29, 10, 9 + level2: 212, 29, 10, 9 + level3: 242, 29, 10, 9 + +soviet-player-ranks: + Image: branch-indicators.png + Regions: + disabled: 120, 66, 39, 67 + level0: 0, 66, 39, 67 + level1: 40, 66, 39, 67 + level2: 80, 66, 39, 67 + level3: 120, 66, 39, 67 + level0-glow: 512, 512, 1, 1 + level1-glow: 160, 66, 39, 67 + level2-glow: 200, 66, 39, 67 + level3-glow: 240, 66, 39, 67 + rank-up: 397, 66, 115, 54 + +gdi-strategy: + Image: branch-indicators.png + Regions: + disabled: 90, 134, 29, 65 + level0: 0, 134, 29, 65 + level1: 30, 134, 29, 65 + level2: 60, 134, 29, 65 + level3: 90, 134, 29, 65 + +nod-covenant: + Image: branch-indicators.png + Regions: + disabled: 90, 200, 29, 65 + level0: 0, 200, 29, 65 + level1: 30, 200, 29, 65 + level2: 60, 200, 29, 65 + level3: 90, 200, 29, 65 + +scrin-allegiance: + Image: branch-indicators.png + Regions: + disabled: 152, 266, 37, 71 + level0: 0, 266, 37, 71 + level1: 38, 266, 37, 71 + level2: 76, 266, 37, 71 + level3: 114, 266, 37, 71 + level4: 152, 266, 37, 71 + loyalist: 190, 266, 37, 71 + rebel: 228, 266, 37, 71 + malefic: 266, 266, 37, 71 + level0-glow: 512, 512, 1, 1 + level1-glow: 38, 338, 37, 71 + level2-glow: 76, 338, 37, 71 + level3-glow: 114, 338, 37, 71 + level4-glow: 152, 338, 37, 71 + loyalist-glow: 190, 338, 37, 71 + rebel-glow: 228, 338, 37, 71 + malefic-glow: 266, 338, 37, 71 + ref-added: 397, 267, 115, 54 diff --git a/mods/ca/chrome/color-picker.yaml b/mods/ca/chrome/color-picker.yaml new file mode 100644 index 0000000000..7f3d595b48 --- /dev/null +++ b/mods/ca/chrome/color-picker.yaml @@ -0,0 +1,140 @@ +Background@COLOR_CHOOSER: + Logic: ColorPickerLogic + PaletteColumns: 8 + PalettePresetRows: 3 + PaletteCustomRows: 1 + Background: dialog2 + Width: 326 + Height: 183 + Children: + Button@RANDOM_BUTTON: + Key: tab + X: 245 + Y: 124 + Width: 76 + Height: 25 + Text: button-color-chooser-random + Font: Bold + Button@STORE_BUTTON: + X: 245 + Y: 153 + Width: 76 + Height: 25 + Text: button-color-chooser-store + Font: Bold + ActorPreview@PREVIEW: + X: 245 + Y: 13 + Width: 76 + Height: 73 + Button@MIXER_TAB_BUTTON: + X: 5 + Y: PARENT_HEIGHT - 30 + Height: 25 + Width: 80 + Text: button-color-chooser-mixer-tab + Font: Bold + Button@PALETTE_TAB_BUTTON: + X: 85 + Y: PARENT_HEIGHT - 30 + Height: 25 + Width: 80 + Text: button-color-chooser-palette-tab + Font: Bold + Container@MIXER_TAB: + X: 5 + Y: 5 + Width: PARENT_WIDTH - 90 + Height: PARENT_HEIGHT - 34 + Children: + Background@HUEBG: + Background: dialog3 + X: 0 + Y: 0 + Width: PARENT_WIDTH + Height: 17 + Children: + HueSlider@HUE_SLIDER: + X: 2 + Y: 2 + Width: PARENT_WIDTH - 4 + Height: PARENT_HEIGHT - 4 + Ticks: 5 + Background@MIXERBG: + Background: dialog3 + X: 0 + Y: 22 + Width: PARENT_WIDTH + Height: PARENT_HEIGHT - 22 + Children: + ColorMixer@MIXER: + X: 2 + Y: 2 + Width: PARENT_WIDTH - 4 + Height: PARENT_HEIGHT - 4 + Background@PALETTE_TAB: + Background: dialog3 + X: 5 + Y: 5 + Width: PARENT_WIDTH - 90 + Height: PARENT_HEIGHT - 34 + Visible: false + Children: + Container@PALETTE_TAB_PANEL: + X: 0 + Y: 0 + Width: PARENT_WIDTH + Height: PARENT_HEIGHT + Children: + Background@PRESET_HEADER: + Background: dialog2 + Width: PARENT_WIDTH - 4 + Height: 13 + X: 2 + Y: 2 + Children: + Label@LABEL: + Font: TinyBold + Width: PARENT_WIDTH + Height: 13 + Align: Center + Text: label-preset-header + Container@PRESET_AREA: + Width: PARENT_WIDTH - 4 + Height: 87 + X: 2 + Y: 16 + Children: + ColorBlock@COLORPRESET: + X: 0 + Y: 0 + Width: 29 + Height: 29 + Visible: false + ClickSound: ClickSound + Background@CUSTOM_HEADER: + Background: dialog2 + Width: PARENT_WIDTH - 4 + Height: 13 + X: 2 + Y: 104 + Children: + Label@LABEL: + Font: TinyBold + Width: PARENT_WIDTH + Height: 13 + Align: Center + Text: label-custom-header + Container@CUSTOM_AREA: + Width: PARENT_WIDTH - 4 + Height: 31 + X: 2 + Y: 118 + Children: + ColorBlock@COLORCUSTOM: + X: 0 + Y: 0 + Width: 29 + Height: 29 + Visible: false + ClickSound: ClickSound diff --git a/mods/ca/chrome/encyclopedia.yaml b/mods/ca/chrome/encyclopedia.yaml new file mode 100644 index 0000000000..f569742884 --- /dev/null +++ b/mods/ca/chrome/encyclopedia.yaml @@ -0,0 +1,258 @@ +Background@ENCYCLOPEDIA_PANEL: + Logic: EncyclopediaLogicCA + X: (WINDOW_WIDTH - WIDTH) / 2 + Y: (WINDOW_HEIGHT - HEIGHT) / 2 + Width: 900 + Height: 600 + Children: + Container@ENCYCLOPEDIA_CONTENT: + Width: PARENT_WIDTH - 40 + Height: PARENT_HEIGHT - 40 + X: 20 + Y: 20 + Children: + Label@ENCYCLOPEDIA_TITLE: + Width: PARENT_WIDTH + Height: 25 + Text: Encyclopedia + Align: Center + Font: Bold + Container@ENCYCLOPEDIA_TABS: + X: 0 + Y: 30 + Width: PARENT_WIDTH + Height: 30 + Children: + Button@ENCYCLOPEDIA_TAB: + Width: 100 + Height: 30 + Font: Bold + Visible: false + Background: tab-button + Children: + Image@TAB_FLAG: + Y: 7 + Width: 30 + Height: 15 + ImageCollection: flags + Visible: false + Label@TAB_LABEL: + X: 0 + Height: PARENT_HEIGHT - HEIGHT + Font: Bold + ScrollPanel@ACTOR_LIST: + Y: 65 + Width: 250 + Height: PARENT_HEIGHT - 65 + Children: + ScrollItem@HEADER: + Background: scrollheader + Width: PARENT_WIDTH - 27 + Height: 26 + X: 2 + Visible: false + Children: + Image@ICON: + X: 4 + Y: 5 + Width: 16 + Height: 16 + ImageCollection: scrollpanel-decorations + ImageName: right + Label@LABEL: + Font: Regular + Width: PARENT_WIDTH + X: 24 + Height: 26 + Align: Left + ScrollItem@TEMPLATE: + Width: PARENT_WIDTH - 27 + Height: 26 + X: 2 + EnableChildMouseOver: True + Children: + Image@ICON: + X: 4 + Y: 5 + Width: 16 + Height: 16 + ImageCollection: mission-completion-tick + ImageName: incomplete + LabelWithTooltip@TITLE: + X: 26 + Width: PARENT_WIDTH - 26 - 20 + Height: 26 + TooltipContainer: TOOLTIP_CONTAINER + TooltipTemplate: SIMPLE_TOOLTIP + Container@ACTOR_INFO: + X: PARENT_WIDTH - WIDTH + Y: 65 + Width: PARENT_WIDTH - 250 - 10 + Height: PARENT_HEIGHT - 65 + Children: + DropDownButton@VARIANT_DROPDOWN: + X: 0 + Y: 0 + Width: PARENT_WIDTH - 148 - 10 + Height: 25 + Font: Regular + Text: Select Variant... + ScrollPanel@ACTOR_DESCRIPTION_PANEL: + Y: 30 + Width: PARENT_WIDTH - 148 - 10 + Height: PARENT_HEIGHT - 30 + TopBottomSpacing: 8 + Background: observer-scrollpanel-button-pressed + Children: + Label@ACTOR_TITLE: + X: 8 + Width: PARENT_WIDTH - 40 + Height: 20 + VAlign: Top + Font: Bold + Container@ACTOR_PRODUCTION: + X: 8 + Width: PARENT_WIDTH - 40 + Children: + Image@NOT_PRODUCIBLE_ICON: + X: 0 + Y: 1 + Width: 16 + Height: 16 + ImageCollection: order-icons + ImageName: cancel + Label@NOT_PRODUCIBLE: + X: 0 + Height: 16 + Font: Bold + Text: Not Producible + TextColor: a58770 + Image@COST_ICON: + Y: 1 + Width: 16 + Height: 16 + ImageCollection: sidebar-bits + ImageName: production-tooltip-cost + Label@COST: + X: 17 + Height: 16 + Font: Bold + Image@TIME_ICON: + X: 75 + Y: 1 + Width: 16 + Height: 16 + ImageCollection: sidebar-bits + ImageName: production-tooltip-time + Label@TIME: + X: 95 + Height: 16 + Font: Bold + Image@ARMOR_TYPE_ICON: + X: 160 + Y: 1 + Width: 16 + Height: 16 + ImageCollection: sidebar-bits + ImageName: production-tooltip-armor + Label@ARMOR_TYPE: + X: 179 + Height: 16 + Font: Bold + Image@POWER_ICON: + X: 245 + Y: 1 + Width: 16 + Height: 16 + ImageCollection: sidebar-bits + ImageName: production-tooltip-power + Label@POWER: + X: 262 + Height: 16 + Font: Bold + Container@ACTOR_DETAILS: + X: 8 + Width: PARENT_WIDTH - 40 + Children: + Image@SUBFACTION_FLAG: + X: 0 + Y: 0 + Width: 30 + Height: 15 + ImageCollection: flags + Label@SUBFACTION: + X: 36 + Width: PARENT_WIDTH - 25 + VAlign: Top + Font: Regular + TextColor: BBBBBB + LinkableLabel@ADDITIONAL_INFO: + X: 0 + Width: PARENT_WIDTH + VAlign: Top + Font: Regular + TextColor: BBBBBB + LinkColor: A3C5FF + LinkHoverColor: 76F9FF + LinkableLabel@ACTOR_PREREQUISITES: + X: 0 + Width: PARENT_WIDTH + VAlign: Top + Font: Regular + LinkColor: A3C5FF + LinkHoverColor: 76F9FF + Label@ACTOR_DESCRIPTION: + X: 0 + Width: PARENT_WIDTH + VAlign: Top + Font: Regular + Label@STRENGTHS: + X: 0 + Width: PARENT_WIDTH + Font: Regular + TextColor: 33DD33 + Label@WEAKNESSES: + X: 0 + Width: PARENT_WIDTH + Font: Regular + TextColor: EE5555 + LinkableLabel@ATTRIBUTES: + X: 0 + Width: PARENT_WIDTH + Font: Regular + TextColor: FFFF00 + LinkColor: A3C5FF + LinkHoverColor: 76F9FF + LinkableLabel@ENCYCLOPEDIA_DESCRIPTION: + X: 0 + Width: PARENT_WIDTH + Font: Regular + LinkColor: A3C5FF + LinkHoverColor: 76F9FF + Background@ACTOR_BG: + X: PARENT_WIDTH - 148 + Width: 148 + Height: 170 + Background: observer-scrollpanel-button-pressed + Children: + ActorPreviewCA@ACTOR_PREVIEW: + X: 1 + Y: 1 + Width: PARENT_WIDTH - 2 + Height: PARENT_HEIGHT - 2 + Animate: True + Sprite@BUILD_ICON: + X: PARENT_WIDTH - 148 + 42 + Y: 60 + 170 - 50 + Width: 64 + Height: 48 + Button@BACK_BUTTON: + Y: PARENT_HEIGHT - 25 + X: PARENT_WIDTH - 148 + Font: Bold + Width: 148 + Height: 25 + Text: button-back + Key: escape + + TooltipContainer@TOOLTIP_CONTAINER: diff --git a/mods/ca/chrome/gamesave-loading.yaml b/mods/ca/chrome/gamesave-loading.yaml index 3345e9706c..3f5f6e9490 100644 --- a/mods/ca/chrome/gamesave-loading.yaml +++ b/mods/ca/chrome/gamesave-loading.yaml @@ -1,37 +1,48 @@ Container@GAMESAVE_LOADING_SCREEN: Logic: GameSaveLoadingLogic - Width: WINDOW_RIGHT - Height: WINDOW_BOTTOM + Width: WINDOW_WIDTH + Height: WINDOW_HEIGHT Children: LogicKeyListener@CANCEL_HANDLER: - Background@STRIPE: - Y: (WINDOW_BOTTOM - HEIGHT) / 2 - Width: WINDOW_RIGHT - Height: 256 - Background: loadscreen-stripe Image@LOGO: - X: (WINDOW_RIGHT - 256) / 2 - Y: (WINDOW_BOTTOM - 256) / 2 - ImageCollection: logos + X: (WINDOW_WIDTH - 1024) / 2 + Y: (WINDOW_HEIGHT - 256) / 2 + ImageCollection: loading-artwork ImageName: logo Label@TITLE: - Width: WINDOW_RIGHT - Y: 3 * WINDOW_BOTTOM / 4 - 29 + Width: WINDOW_WIDTH + Y: 3 * WINDOW_HEIGHT / 4 - 29 Height: 25 Font: Bold Align: Center - Text: Loading Saved Game + Text: label-gamesave-loading-screen-title ProgressBar@PROGRESS: - X: (WINDOW_RIGHT - 500) / 2 - Y: 3 * WINDOW_BOTTOM / 4 + X: (WINDOW_WIDTH - 500) / 2 + Y: 3 * WINDOW_HEIGHT / 4 Width: 500 Height: 20 Background: observer-scrollpanel-button-pressed Bar: observer-scrollpanel-button Label@DESC: - Width: WINDOW_RIGHT - Y: 3 * WINDOW_BOTTOM / 4 + 19 + Width: WINDOW_WIDTH + Y: 3 * WINDOW_HEIGHT / 4 + 19 Height: 25 Font: Regular Align: Center - Text: Press Escape to cancel loading and return to the main menu + Text: label-gamesave-loading-screen-desc + Label@DESC2: + Width: WINDOW_WIDTH + Y: 3 * WINDOW_HEIGHT / 4 + 19 + 30 + Height: 25 + Font: Small + Align: Center + Text: label-gamesave-loading-screen-loadtime-line1 + TextColor: 777777 + Label@DESC3: + Width: WINDOW_WIDTH + Y: 3 * WINDOW_HEIGHT / 4 + 19 + 48 + Height: 25 + Font: Small + Align: Center + Text: label-gamesave-loading-screen-loadtime-line2 + TextColor: 777777 diff --git a/mods/ca/chrome/ingame-infostats.yaml b/mods/ca/chrome/ingame-infostats.yaml new file mode 100644 index 0000000000..c16badc487 --- /dev/null +++ b/mods/ca/chrome/ingame-infostats.yaml @@ -0,0 +1,189 @@ +Container@SKIRMISH_STATS: + Height: PARENT_HEIGHT + Width: PARENT_WIDTH + Logic: GameInfoStatsLogicCA + Children: + Container@OBJECTIVE: + Height: 75 + Children: + Label@MISSION: + X: 20 + Y: 22 + Width: 482 + Height: 25 + Font: MediumBold + Text: label-mission-objective + Label@STATS_STATUS: + X: 100 + Y: 22 + Width: PARENT_WIDTH - 10 + Height: 25 + Font: MediumBold + Checkbox@STATS_CHECKBOX: + X: 20 + Y: 55 + Width: 482 + Height: 20 + Font: Bold + Text: checkbox-stats-objective + Disabled: true + TextColorDisabled: FFFFFF + Container@STATS_HEADERS: + X: 22 + Y: 81 + Width: PARENT_WIDTH - 44 + Children: + Label@NAME: + X: 10 + Width: 210 + Height: 25 + Text: label-stats-player + Font: Bold + Label@FACTION: + X: 230 + Width: 120 + Height: 25 + Text: label-stats-faction + Font: Bold + Label@SCORE: + X: 397 + Width: 60 + Height: 25 + Text: label-stats-score + Font: Bold + Label@ACTIONS: + X: 457 + Width: 80 + Height: 25 + Text: label-stats-actions + Font: Bold + ScrollPanel@PLAYER_LIST: + X: 20 + Y: 105 + Width: PARENT_WIDTH - 40 + Height: 280 + ItemSpacing: 5 + Children: + ScrollItem@TEAM_TEMPLATE: + Background: scrollheader + Width: PARENT_WIDTH - 26 + Height: 20 + X: 2 + Visible: false + Children: + Label@TEAM: + X: 6 + Y: 0 + Width: 160 + Height: 20 + Font: Bold + Label@TEAM_SCORE: + X: 392 + Y: 0 + Width: 60 + Height: 20 + Font: Bold + Container@PLAYER_TEMPLATE: + Width: PARENT_WIDTH - 26 + Height: 25 + X: 2 + Children: + Image@PROFILE: + ImageCollection: lobby-bits + X: 8 + Y: 4 + Visible: false + ClientTooltipRegion@PROFILE_TOOLTIP: + X: 8 + Y: 4 + Width: 16 + Height: 16 + Visible: false + TooltipContainer: TOOLTIP_CONTAINER + Template: ANONYMOUS_PLAYER_TOOLTIP + Label@NAME: + X: 29 + Width: 191 + Height: 25 + Shadow: True + ContainerWithTooltip@FACTIONFLAGANDLABEL: + X: 230 + TooltipContainer: TOOLTIP_CONTAINER + TooltipTemplate: SIMPLE_TOOLTIP_WITH_DESC + IgnoreChildMouseOver: true + Children: + Image@FACTIONFLAG: + Y: 4 + Width: 32 + Height: 16 + Label@FACTION: + X: 34 + Width: 123 + Height: 25 + Shadow: True + Label@SCORE: + X: 392 + Width: 60 + Height: 25 + Shadow: True + Checkbox@MUTE: + X: 457 + Width: 25 + Height: 25 + Checkmark: mute + Background: checkbox-toggle + TooltipContainer: TOOLTIP_CONTAINER + Button@KICK: + X: 485 + Width: 25 + Height: 25 + Background: checkbox-toggle + TooltipContainer: TOOLTIP_CONTAINER + Children: + Image: + ImageCollection: lobby-bits + ImageName: kick + X: 7 + Y: 7 + Container@SPECTATOR_TEMPLATE: + Width: PARENT_WIDTH - 26 + Height: 25 + X: 2 + Children: + Image@PROFILE: + ImageCollection: lobby-bits + X: 8 + Y: 4 + Visible: false + ClientTooltipRegion@PROFILE_TOOLTIP: + X: 8 + Y: 4 + Width: 16 + Height: 16 + Visible: false + TooltipContainer: TOOLTIP_CONTAINER + Template: ANONYMOUS_PLAYER_TOOLTIP + Label@NAME: + X: 29 + Width: 191 + Height: 25 + Shadow: True + Checkbox@MUTE: + X: 457 + Width: 25 + Height: 25 + Checkmark: mute + Background: checkbox-toggle + TooltipContainer: TOOLTIP_CONTAINER + Button@KICK: + X: 485 + Width: 25 + Height: 25 + Background: checkbox-toggle + TooltipContainer: TOOLTIP_CONTAINER + Children: + Image: + ImageCollection: lobby-bits + ImageName: kick + X: 7 + Y: 7 diff --git a/mods/ca/chrome/ingame-menu.yaml b/mods/ca/chrome/ingame-menu.yaml index 69bb1eccb4..3f2d6d6e4e 100644 --- a/mods/ca/chrome/ingame-menu.yaml +++ b/mods/ca/chrome/ingame-menu.yaml @@ -1,46 +1,47 @@ Container@INGAME_MENU: - Width: WINDOW_RIGHT - Height: WINDOW_BOTTOM - Logic: IngameMenuLogic - Buttons: RESUME, LOAD_GAME, SAVE_GAME, SETTINGS, MUSIC, SURRENDER, RESTART, ABORT_MISSION, SAVE_MAP, EXIT_EDITOR + Width: WINDOW_WIDTH + Height: WINDOW_HEIGHT + Logic: IngameMenuLogicCA + Buttons: RESUME, LOAD_GAME, SAVE_GAME, SETTINGS, ENCYCLOPEDIA, MUSIC, SURRENDER, RESTART, BACK_TO_EDITOR, ABORT_MISSION, SAVE_MAP, PLAY_MAP, EXIT_EDITOR ButtonStride: 0, 40 Children: Background@BORDER: X: 0 - 15 Y: 0 - 15 - Width: WINDOW_RIGHT + 30 - Height: WINDOW_BOTTOM + 30 + Width: WINDOW_WIDTH + 30 + Height: WINDOW_HEIGHT + 30 Background: mainmenu-border Image@LOGO: - X: (WINDOW_RIGHT - 512) / 2 + X: (WINDOW_WIDTH - 512) / 2 Y: 30 - ImageCollection: logos + ImageCollection: menu-logo ImageName: logo Label@VERSION_LABEL: - X: (WINDOW_RIGHT - 512) / 2 + Logic: VersionLabelLogic + X: (WINDOW_WIDTH - 512) / 2 Y: 276 Width: 512 Height: 25 Align: Center Font: Regular - Contrast: true + Contrast: True Container@PANEL_ROOT: Background@MENU_BUTTONS: - X: 13 + (WINDOW_RIGHT - 522) / 4 - WIDTH / 2 - Y: (WINDOW_BOTTOM - HEIGHT) / 2 + X: 13 + (WINDOW_WIDTH - 522) / 4 - WIDTH / 2 + Y: (WINDOW_HEIGHT - HEIGHT) / 2 Width: 200 Height: 120 Children: Label@LABEL_TITLE: - X: (PARENT_RIGHT - WIDTH) / 2 + X: (PARENT_WIDTH - WIDTH) / 2 Y: 20 Width: 200 Height: 30 - Text: Options + Text: label-menu-buttons-title Align: Center Font: Bold Button@BUTTON_TEMPLATE: - X: (PARENT_RIGHT - WIDTH) / 2 + X: (PARENT_WIDTH - WIDTH) / 2 Y: 60 Width: 140 Height: 30 diff --git a/mods/ca/chrome/ingame-observer.yaml b/mods/ca/chrome/ingame-observer.yaml index cc21e7cd07..84b5b2fa10 100644 --- a/mods/ca/chrome/ingame-observer.yaml +++ b/mods/ca/chrome/ingame-observer.yaml @@ -1,222 +1,264 @@ Container@OBSERVER_WIDGETS: + Logic: MenuButtonsChromeLogic, LoadIngameChatLogic Children: + Background@SELECTION_TOOLTIP: + Logic: SelectionTooltipLogic + Background: dialog4 + X: WINDOW_WIDTH + Y: WINDOW_HEIGHT + Width: 200 + Height: 65 + Children: + Label@NAME: + X: 7 + Y: 3 + Height: 23 + Font: Bold + Label@DESC: + X: 7 + Y: 27 + Height: 2 + Font: TinyBold + VAlign: Top + Label@STRENGTHS: + X: 7 + Y: 29 + Height: 2 + Font: TinyBold + VAlign: Top + TextColor: 33DD33 + Label@WEAKNESSES: + X: 7 + Y: 30 + Height: 2 + Font: TinyBold + VAlign: Top + TextColor: EE5555 + Label@ATTRIBUTES: + X: 7 + Y: 31 + Height: 2 + Font: TinyBold + VAlign: Top + TextColor: FFFF00 + Image@ARMORTYPE_ICON: + X: 3 + Y: 7 + Width: 16 + Height: 16 + ImageCollection: sidebar-bits + ImageName: production-tooltip-armor + Label@ARMORTYPE: + Y: 3 + Height: 16 + Font: Bold + Image@COST_ICON: + Y: 26 + Width: 16 + Height: 16 + ImageCollection: sidebar-bits + ImageName: production-tooltip-cost + Label@COST: + Y: 22 + Height: 23 + Font: Bold + Container@CHAT_ROOT: Container@MUTE_INDICATOR: Logic: MuteIndicatorLogic - X: WINDOW_RIGHT - WIDTH - 260 + X: WINDOW_WIDTH - WIDTH - 260 Y: 10 Width: 200 Height: 25 Children: Image@ICON: - X: PARENT_RIGHT - WIDTH + X: PARENT_WIDTH - WIDTH Y: 1 Width: 24 Height: 24 ImageCollection: sidebar-bits ImageName: indicator-muted Label@LABEL: - Width: PARENT_RIGHT - 30 + Width: PARENT_WIDTH - 30 Height: 25 Align: Right - Text: Audio Muted + Text: label-mute-indicator Contrast: true - Image@SIDEBAR_BACKGROUND_TOP: - X: WINDOW_RIGHT - 250 - Y: 10 - Width: 238 - Height: 287 - ImageCollection: sidebar-observer - ImageName: background - ClickThrough: false + LogicKeyListener@OBSERVER_KEY_LISTENER: + MenuButton@OPTIONS_BUTTON: + X: 5 + Y: 5 + Width: 160 + Height: 25 + Text: Options (Esc) + Font: Bold + Key: escape + DisableWorldSounds: true + Container@GAME_TIMER_BLOCK: + Logic: GameTimerLogic + X: (WINDOW_WIDTH - WIDTH) / 2 + Width: 100 + Height: 55 + Children: + LabelWithTooltip@GAME_TIMER: + Width: PARENT_WIDTH + Height: 30 + Align: Center + Font: Title + Contrast: true + TooltipContainer: TOOLTIP_CONTAINER + TooltipTemplate: SIMPLE_TOOLTIP + Label@GAME_TIMER_STATUS: + Y: 32 + Width: PARENT_WIDTH + Height: 15 + Align: Center + Font: Bold + Contrast: true + Background@RADAR_BG: + X: WINDOW_WIDTH - 255 + Y: 5 + Width: 250 + Height: 250 Children: - Background@GAME_TIMER_BLOCK: - Logic: GameTimerLogic - X: 26 + Radar@INGAME_RADAR: + X: 10 Y: 10 - Width: 120 - Height: 22 - Background: sidebar-button-observer - Children: - LabelWithTooltip@GAME_TIMER: - Y: 0 - 1 - Width: PARENT_RIGHT - Height: PARENT_BOTTOM - Align: Center - Font: TinyBold - TooltipContainer: TOOLTIP_CONTAINER - TooltipTemplate: SIMPLE_TOOLTIP - Container@TOP_BUTTONS: - Logic: MenuButtonsChromeLogic - X: 9 - Y: 7 - Children: - LogicKeyListener@OBSERVER_KEY_LISTENER: - MenuButton@OPTIONS_BUTTON: - Key: escape - X: 192 - Width: 28 - Height: 28 - Background: sidebar-button-observer - TooltipText: Options - TooltipContainer: TOOLTIP_CONTAINER - DisableWorldSounds: true - VisualHeight: 0 - Children: - Image@ICON: - X: 6 - Y: 6 - ImageCollection: order-icons - ImageName: options - Container@RADAR: - Children: - ColorBlock: - X: 8 - Y: 40 - Width: 222 - Height: 222 - Color: 000000 - Radar@INGAME_RADAR: - WorldInteractionController: INTERACTION_CONTROLLER - X: 9 - Y: 41 - Width: 220 - Height: 220 - VqaPlayer@PLAYER: - X: 9 - Y: 41 - Width: 220 - Height: 220 - Skippable: false + Width: PARENT_WIDTH - 19 + Height: PARENT_HEIGHT - 19 + WorldInteractionController: INTERACTION_CONTROLLER + VideoPlayer@PLAYER: + X: 10 + Y: 10 + Width: PARENT_WIDTH - 20 + Height: PARENT_HEIGHT - 20 + Skippable: false + Background@OBSERVER_CONTROL_BG: + X: WINDOW_WIDTH - 255 + Y: 260 + Width: 250 + Height: 55 + Children: DropDownButton@SHROUD_SELECTOR: Logic: ObserverShroudSelectorLogic CombinedViewKey: ObserverCombinedView WorldViewKey: ObserverWorldView - X: 6 - Y: 262 - Width: 226 + X: 15 + Y: 15 + Width: 220 Height: 25 Font: Bold - VisualHeight: 0 - Background: sidebar-button-observershroud - SeparatorImage: observer-separator Children: LogicKeyListener@SHROUD_KEYHANDLER: Image@FLAG: + Width: 23 + Height: 23 X: 4 - Y: 6 - Width: 32 - Height: 16 + Y: 2 Label@LABEL: - X: 40 - Width: PARENT_RIGHT + X: 34 + Width: PARENT_WIDTH Height: 25 Shadow: True Label@NOFLAG_LABEL: X: 5 - Width: PARENT_RIGHT + Width: PARENT_WIDTH Height: 25 Shadow: True - Image@SIDEBAR_BACKGROUND_BOTTOM: - X: WINDOW_RIGHT - 250 - Y: 297 - Width: 238 - Height: 8 - ImageCollection: sidebar-observer - ImageName: observer-bottom - Image@REPLAY_PLAYER: - Logic: ReplayControlBarLogic - X: WINDOW_RIGHT - 250 - Y: 297 - Width: 238 - Height: 40 - Visible: false - ImageCollection: sidebar-observer - ImageName: replay-bottom - ClickThrough: false - Visible: false - Children: - Button@BUTTON_PAUSE: - X: 9 - Y: 5 - Width: 28 - Height: 28 - Background: sidebar-button-observer - Key: Pause - TooltipText: Pause - TooltipContainer: TOOLTIP_CONTAINER - VisualHeight: 0 - Children: - Image@IMAGE_PAUSE: - X: 6 - Y: 6 - ImageCollection: music - ImageName: pause - Button@BUTTON_PLAY: - X: 9 - Y: 5 - Width: 28 - Height: 28 - Background: sidebar-button-observer - Key: Pause - TooltipText: Play - TooltipContainer: TOOLTIP_CONTAINER - VisualHeight: 0 + Container@REPLAY_PLAYER: + Logic: ReplayControlBarLogicCA + Y: 39 + Width: 160 + Height: 35 + Visible: false Children: - Image@IMAGE_PLAY: - X: 6 - Y: 6 - ImageCollection: music - ImageName: play - Button@BUTTON_SLOW: - X: 49 - Y: 8 - Width: 42 - Height: 22 - Background: sidebar-button-observer - Key: ReplaySpeedSlow - TooltipText: Slow speed - TooltipContainer: TOOLTIP_CONTAINER - VisualHeight: 0 - Text: 50% - Font: TinyBold - Button@BUTTON_REGULAR: - X: 95 - Y: 8 - Width: 42 - Height: 22 - Background: sidebar-button-observer - Key: ReplaySpeedRegular - TooltipText: Regular speed - TooltipContainer: TOOLTIP_CONTAINER - VisualHeight: 0 - Text: 100% - Font: TinyBold - Button@BUTTON_FAST: - X: 141 - Y: 8 - Width: 42 - Height: 22 - Background: sidebar-button-observer - Key: ReplaySpeedFast - TooltipText: Fast speed - TooltipContainer: TOOLTIP_CONTAINER - VisualHeight: 0 - Text: 200% - Font: TinyBold - Button@BUTTON_MAXIMUM: - X: 187 - Y: 8 - Width: 42 - Height: 22 - Background: sidebar-button-observer - Key: ReplaySpeedMax - TooltipText: Maximum speed - TooltipContainer: TOOLTIP_CONTAINER - VisualHeight: 0 - Text: MAX - Font: TinyBold + Button@BUTTON_PAUSE: + X: 15 + Y: 10 + Width: 26 + Height: 26 + Key: Pause + TooltipText: Pause + TooltipContainer: TOOLTIP_CONTAINER + IgnoreChildMouseOver: true + Children: + Image@IMAGE_PAUSE: + X: 5 + Y: 5 + ImageCollection: music + ImageName: pause + Button@BUTTON_PLAY: + X: 15 + Y: 10 + Width: 26 + Height: 26 + Key: Pause + IgnoreChildMouseOver: true + TooltipText: Play + TooltipContainer: TOOLTIP_CONTAINER + Children: + Image@IMAGE_PLAY: + X: 5 + Y: 5 + ImageCollection: music + ImageName: play + Button@BUTTON_SLOW: + X: 52 + Y: 13 + Width: 34 + Height: 20 + Key: ReplaySpeedSlow + TooltipText: 50% speed + TooltipContainer: TOOLTIP_CONTAINER + Text: 0.5x + Font: TinyBold + Button@BUTTON_REGULAR: + X: 52 + 36 + Y: 13 + Width: 34 + Height: 20 + Key: ReplaySpeedRegular + TooltipText: 100% speed + TooltipContainer: TOOLTIP_CONTAINER + Text: 1x + Font: TinyBold + Button@BUTTON_FAST: + X: 52 + 36 * 2 + Y: 13 + Width: 34 + Height: 20 + Key: ReplaySpeedFast + TooltipText: 133% speed + TooltipContainer: TOOLTIP_CONTAINER + VisualHeight: 0 + Text: 1.33x + Font: TinyBold + Button@BUTTON_FASTER: + X: 52 + 36 * 3 + Y: 13 + Width: 34 + Height: 20 + TooltipText: 200% speed + TooltipContainer: TOOLTIP_CONTAINER + VisualHeight: 0 + Text: 2x + Font: TinyBold + Button@BUTTON_MAXIMUM: + X: 52 + 36 * 4 + Y: 13 + Width: 38 + Height: 20 + Key: ReplaySpeedMax + TooltipText: Maximum speed + TooltipContainer: TOOLTIP_CONTAINER + Text: MAX + Font: TinyBold + ObserverArmyValues: + X: WINDOW_WIDTH - WIDTH - 10 + Y: 320 + Width: 245 + ReplayYPosModifier: 35 Container@INGAME_OBSERVERSTATS_BG: - Logic: ObserverStatsLogic + Logic: ObserverStatsLogicCA StatisticsNoneKey: StatisticsNone StatisticsBasicKey: StatisticsBasic StatisticsEconomyKey: StatisticsEconomy @@ -226,124 +268,121 @@ Container@OBSERVER_WIDGETS: StatisticsArmyKey: StatisticsArmy StatisticsGraphKey: StatisticsGraph StatisticsArmyGraphKey: StatisticsArmyGraph - StatsDropDownPanelTemplate: SPECTATOR_LABEL_DROPDOWN_TEMPLATE X: 5 Y: 5 Width: 760 - Height: 240 + Height: 250 Children: DropDownButton@STATS_DROPDOWN: - X: 0 + X: 165 Y: 0 Width: 185 Height: 25 Font: Bold - Background: observer-scrollpanel-button - SeparatorImage: observer-separator Children: LogicKeyListener@STATS_DROPDOWN_KEYHANDLER: Container@GRAPH_BG: Y: 30 X: 0 - Width: PARENT_RIGHT - Height: 24 + Width: PARENT_WIDTH + Height: 25 Children: Container@BASIC_STATS_HEADERS: X: 0 Y: 0 - Width: 705 - Height: PARENT_BOTTOM + Width: 700 + 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 + X: 35 Y: 0 Width: 120 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: Player Align: Left Shadow: True Label@CASH_HEADER: - X: 160 + X: 155 Y: 0 Width: 80 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: Cash Align: Right Shadow: True Label@POWER_HEADER: - X: 240 + X: 235 Y: 0 Width: 80 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: Power Align: Center Shadow: True Label@KILLS_HEADER: - X: 320 + X: 315 Y: 0 Width: 40 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: Kills Align: Right Shadow: True Label@DEATHS_HEADER: - X: 360 + X: 355 Y: 0 Width: 60 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: Deaths Align: Right Shadow: True Label@ASSETS_DESTROYED_HEADER: - X: 420 + X: 415 Y: 0 Width: 80 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: Destroyed Align: Right Shadow: True Label@ASSETS_LOST_HEADER: - X: 500 + X: 495 Y: 0 Width: 80 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: Lost Align: Right Shadow: True Label@EXPERIENCE_HEADER: - X: 580 + X: 575 Y: 0 Width: 60 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: Score Align: Right Shadow: True Label@ACTIONS_MIN_HEADER: - X: 640 + X: 635 Y: 0 Width: 60 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: APM Align: Right @@ -351,118 +390,118 @@ Container@OBSERVER_WIDGETS: Container@ECONOMY_STATS_HEADERS: X: 0 Y: 0 - Width: 735 - Height: PARENT_BOTTOM + Width: 700 + 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 + X: 35 Width: 120 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: Player Shadow: True Label@CASH_HEADER: - X: 160 + X: 155 Width: 80 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: Cash Align: Right Shadow: True Label@INCOME_HEADER: - X: 240 + X: 235 Width: 80 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: Income Align: Right Shadow: True Label@ASSETS_HEADER: - X: 320 + X: 315 Width: 80 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: Assets Align: Right Shadow: True Label@EARNED_HEADER: - X: 400 + X: 395 Width: 80 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: Earned Align: Right Shadow: True Label@SPENT_HEADER: - X: 480 + X: 475 Width: 80 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: Spent Align: Right Shadow: True Label@HARVESTERS_HEADER: - X: 560 + X: 545 Width: 80 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold - Text: Harvesters + Text: Harvs Align: Right Shadow: True - Label@DERRICKS_HEADER: - X: 650 - Width: 80 - Height: PARENT_BOTTOM + Label@BOUNTY_HEADER: + X: 635 + Width: 60 + Height: PARENT_HEIGHT Font: Bold - Text: Oil Derricks + Text: Bounty Align: Right Shadow: True Container@PRODUCTION_STATS_HEADERS: 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 + X: 35 Y: 0 Width: 120 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: Player Align: Left Shadow: True Label@PRODUCTION_HEADER: - X: 160 + X: 155 Y: 0 Width: 100 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: Production Shadow: True @@ -470,35 +509,35 @@ 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 + X: 35 Y: 0 Width: 120 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: Player Align: Left Shadow: True Label@SUPPORT_POWERS_HEADER: - X: 160 + X: 155 Y: 0 Width: 100 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: Support Powers Shadow: True @@ -506,26 +545,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 @@ -534,516 +573,743 @@ Container@OBSERVER_WIDGETS: X: 160 Y: 0 Width: 100 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: Army Shadow: True - Container@COMBAT_STATS_HEADERS: + Container@UPGRADES_HEADERS: X: 0 Y: 0 - Width: 740 - Height: PARENT_BOTTOM + Width: 400 + 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 Shadow: True - Label@ASSETS_DESTROYED_HEADER: + Label@UPGRADES_HEADER: + X: 160 + Y: 0 + Width: 100 + Height: PARENT_HEIGHT + Font: Bold + Text: Upgrades + Shadow: True + Container@BUILD_ORDER_HEADERS: + X: 0 + Y: 0 + Width: 400 + Height: PARENT_HEIGHT + Children: + ColorBlock@HEADER_COLOR: + X: 0 + Y: 0 + Color: 00000090 + Width: PARENT_WIDTH - 200 + Height: PARENT_HEIGHT + GradientColorBlock@HEADER_GRADIENT: + X: PARENT_WIDTH - 200 + Y: 0 + TopLeftColor: 00000090 + BottomLeftColor: 00000090 + Width: 200 + Height: PARENT_HEIGHT + Label@PLAYER_HEADER: + X: 40 + Y: 0 + Width: 120 + Height: PARENT_HEIGHT + Font: Bold + Text: Player + Align: Left + Shadow: True + Label@BUILD_ORDER_HEADER: + X: 160 + Y: 0 + Width: 100 + Height: PARENT_HEIGHT + Font: Bold + Text: Initial Build Order + Shadow: True + Container@UNITS_PRODUCED_HEADERS: + X: 0 + Y: 0 + Width: 400 + Height: PARENT_HEIGHT + Children: + ColorBlock@HEADER_COLOR: + X: 0 + Y: 0 + Color: 00000090 + Width: PARENT_WIDTH - 200 + Height: PARENT_HEIGHT + GradientColorBlock@HEADER_GRADIENT: + X: PARENT_WIDTH - 200 + Y: 0 + TopLeftColor: 00000090 + BottomLeftColor: 00000090 + Width: 200 + Height: PARENT_HEIGHT + Label@PLAYER_HEADER: + X: 40 + Y: 0 + Width: 120 + Height: PARENT_HEIGHT + Font: Bold + Text: Player + Align: Left + Shadow: True + Label@UNITS_PRODUCED_HEADER: X: 160 Y: 0 + Width: 100 + Height: PARENT_HEIGHT + Font: Bold + Text: Units Produced + Shadow: True + Container@COMBAT_STATS_HEADERS: + X: 0 + Y: 0 + Width: 780 + Height: PARENT_HEIGHT + Children: + ColorBlock@HEADER_COLOR: + X: 0 + Y: 0 + Color: 00000090 + Width: PARENT_WIDTH - 200 + Height: PARENT_HEIGHT + GradientColorBlock@HEADER_GRADIENT: + X: PARENT_WIDTH - 200 + Y: 0 + TopLeftColor: 00000090 + BottomLeftColor: 00000090 + Width: 200 + Height: PARENT_HEIGHT + Label@PLAYER_HEADER: + X: 35 + Y: 0 + Width: 120 + Height: PARENT_HEIGHT + Font: Bold + Text: Player + Align: Left + Shadow: True + Label@ASSETS_DESTROYED_HEADER: + X: 155 + Y: 0 Width: 75 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: Destroyed Align: Right Shadow: True Label@ASSETS_LOST_HEADER: - X: 235 + X: 230 Y: 0 Width: 75 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: Lost Align: Right Shadow: True Label@UNITS_KILLED_HEADER: - X: 310 + X: 305 Y: 0 Width: 90 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: Units Killed Align: Right Shadow: True Label@UNITS_DEAD_HEADER: - X: 400 + X: 395 Y: 0 Width: 80 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: Units Lost Align: Right Shadow: True Label@BUILDINGS_KILLED_HEADER: - X: 480 + X: 475 Y: 0 Width: 85 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: Bldg Killed Align: Right Shadow: True Label@BUILDINGS_DEAD_HEADER: - X: 565 + X: 560 Y: 0 Width: 80 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: Bldg Lost Align: Right Shadow: True Label@ARMY_VALUE_HEADER: - X: 645 + X: 640 Y: 0 Width: 90 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: Army Value Align: Right Shadow: True + Label@VISION_HEADER: + X: 720 + Y: 0 + Width: 60 + Height: PARENT_HEIGHT + Font: Bold + Text: Vision + Align: Right + Shadow: True ScrollPanel@PLAYER_STATS_PANEL: X: 0 - Y: 54 - Width: PARENT_RIGHT - Height: 240 + Y: 55 + Width: PARENT_WIDTH + Height: 250 TopBottomSpacing: 0 BorderWidth: 0 Background: - ScrollBarBackground: observer-scrollpanel-button - Button: observer-scrollpanel-button - ScrollbarWidth: 24 + ScrollbarWidth: 25 ScrollBar: Hidden Children: ScrollItem@TEAM_TEMPLATE: X: 0 Y: 0 - Width: 650 - Height: 24 + Width: 650 #PARENT_RIGHT - 35 + Height: 25 Children: ColorBlock@TEAM_COLOR: 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: X: 0 Y: 0 - Width: 705 - Height: 24 - BaseName: scrollitem-nohover + Width: 700 + Height: 25 + Background: scrollitem-nohover Children: 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 + X: 2 + Y: 2 ImageName: random ImageCollection: flags Label@PLAYER: - X: 40 + X: 35 Y: 0 Width: 120 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Shadow: True Label@CASH: - X: 160 + X: 155 Y: 0 Width: 80 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Align: Right Shadow: True Label@POWER: - X: 240 + X: 235 Y: 0 Width: 80 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Align: Center Shadow: True Label@KILLS: - X: 320 + X: 315 Y: 0 Width: 40 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Align: Right Shadow: True Label@DEATHS: - X: 360 + X: 355 Y: 0 Width: 60 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Align: Right Shadow: True Label@ASSETS_DESTROYED: - X: 420 + X: 415 Y: 0 Width: 80 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Align: Right Shadow: True Label@ASSETS_LOST: - X: 500 + X: 495 Y: 0 Width: 80 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Align: Right Shadow: True Label@EXPERIENCE: - X: 580 + X: 575 Y: 0 Width: 60 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Align: Right Shadow: True Label@ACTIONS_MIN: - X: 640 + X: 635 Y: 0 Width: 60 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Align: Right Shadow: True ScrollItem@ECONOMY_PLAYER_TEMPLATE: X: 0 Y: 0 - Width: 735 - Height: 24 - BaseName: scrollitem-nohover + Width: 700 + Height: 25 + Background: scrollitem-nohover Children: 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 + X: 2 + Y: 2 ImageName: random ImageCollection: flags Label@PLAYER: - X: 40 + X: 35 Y: 0 Width: 120 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Shadow: True Label@CASH: - X: 160 + X: 155 Y: 0 Width: 80 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Align: Right Shadow: True Label@INCOME: - X: 240 + X: 235 Y: 0 Width: 80 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Align: Right Shadow: True Label@ASSETS: - X: 320 + X: 315 Y: 0 Width: 80 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Align: Right Shadow: True Label@EARNED: - X: 400 + X: 395 Y: 0 Width: 80 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Align: Right Shadow: True Label@SPENT: - X: 480 + X: 475 Y: 0 Width: 80 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Align: Right Shadow: True Label@HARVESTERS: - X: 560 + X: 545 Y: 0 Width: 80 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Align: Right Shadow: True - Label@DERRICKS: - X: 650 + Label@BOUNTY: + X: 635 Y: 0 - Width: 80 - Height: PARENT_BOTTOM + Width: 60 + Height: PARENT_HEIGHT Align: Right Shadow: True ScrollItem@PRODUCTION_PLAYER_TEMPLATE: X: 0 Y: 0 Width: 400 - Height: 24 - BaseName: scrollitem-nohover + Height: 25 + Background: scrollitem-nohover + Children: + ColorBlock@PLAYER_COLOR: + X: 0 + Y: 0 + Width: PARENT_WIDTH - 200 + Height: PARENT_HEIGHT + GradientColorBlock@PLAYER_GRADIENT: + X: PARENT_WIDTH - 200 + Y: 0 + Width: 200 + Height: PARENT_HEIGHT + Image@FLAG: + X: 2 + Y: 2 + ImageName: random + ImageCollection: flags + Label@PLAYER: + X: 35 + Y: 0 + Width: 120 + Height: PARENT_HEIGHT + Font: Bold + Shadow: True + ObserverProductionIcons@PRODUCTION_ICONS: + X: 155 + Y: 0 + Width: 0 + Height: PARENT_HEIGHT + TooltipContainer: TOOLTIP_CONTAINER + ScrollItem@SUPPORT_POWERS_PLAYER_TEMPLATE: + X: 0 + Y: 0 + Width: 400 + Height: 25 + Background: scrollitem-nohover Children: 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 + ImageName: random + ImageCollection: flags + Label@PLAYER: + X: 35 + Y: 0 + Width: 120 + Height: PARENT_HEIGHT + Font: Bold + Shadow: True + ObserverSupportPowerIcons@SUPPORT_POWER_ICONS: + X: 155 + Y: 0 + Width: 0 + Height: PARENT_HEIGHT + TooltipContainer: TOOLTIP_CONTAINER + ScrollItem@ARMY_PLAYER_TEMPLATE: + X: 0 + Y: 0 + Width: 400 + Height: 25 + Background: scrollitem-nohover + Children: + ColorBlock@PLAYER_COLOR: + X: 0 + Y: 0 + Width: PARENT_WIDTH - 200 + Height: PARENT_HEIGHT + GradientColorBlock@PLAYER_GRADIENT: + X: PARENT_WIDTH - 200 + Y: 0 + Width: 200 + 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: 40 + X: 35 Y: 0 Width: 120 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Shadow: True - ObserverProductionIcons@PRODUCTION_ICONS: - X: 160 + ObserverArmyIcons@ARMY_ICONS: + X: 155 Y: 0 Width: 0 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT TooltipContainer: TOOLTIP_CONTAINER - ScrollItem@SUPPORT_POWERS_PLAYER_TEMPLATE: + TooltipTemplate: ARMY_TOOLTIP + ScrollItem@UPGRADES_PLAYER_TEMPLATE: X: 0 Y: 0 Width: 400 - Height: 24 - BaseName: scrollitem-nohover + Height: 25 + Background: scrollitem-nohover Children: 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: 40 + X: 35 Y: 0 Width: 120 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Shadow: True - ObserverSupportPowerIcons@SUPPORT_POWER_ICONS: - X: 160 + ObserverUpgradeIcons@UPGRADES_ICONS: + X: 155 Y: 0 Width: 0 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT TooltipContainer: TOOLTIP_CONTAINER - ScrollItem@ARMY_PLAYER_TEMPLATE: + TooltipTemplate: ARMY_TOOLTIP + ScrollItem@BUILD_ORDER_PLAYER_TEMPLATE: X: 0 Y: 0 Width: 400 - Height: 24 - BaseName: scrollitem-nohover + Height: 25 + Background: scrollitem-nohover Children: 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: 40 + X: 35 Y: 0 Width: 120 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Shadow: True - ObserverArmyIcons@ARMY_ICONS: - X: 160 + ObserverBuildOrderIcons@BUILD_ORDER_ICONS: + X: 155 Y: 0 Width: 0 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT TooltipContainer: TOOLTIP_CONTAINER - ScrollItem@COMBAT_PLAYER_TEMPLATE: + TooltipTemplate: ARMY_TOOLTIP + ScrollItem@UNITS_PRODUCED_PLAYER_TEMPLATE: X: 0 Y: 0 - Width: 740 - Height: 24 - BaseName: scrollitem-nohover + Width: 400 + Height: 25 + Background: scrollitem-nohover Children: 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: 40 + X: 35 Y: 0 Width: 120 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT + Font: Bold + Shadow: True + ObserverUnitsProducedIcons@UNITS_PRODUCED_ICONS: + X: 155 + Y: 0 + Width: 0 + Height: PARENT_HEIGHT + TooltipContainer: TOOLTIP_CONTAINER + TooltipTemplate: ARMY_VALUE_TOOLTIP + ScrollItem@COMBAT_PLAYER_TEMPLATE: + X: 0 + Y: 0 + Width: 780 + Height: 25 + Background: scrollitem-nohover + Children: + ColorBlock@PLAYER_COLOR: + X: 0 + Y: 0 + Width: PARENT_WIDTH - 200 + Height: PARENT_HEIGHT + GradientColorBlock@PLAYER_GRADIENT: + X: PARENT_WIDTH - 200 + Y: 0 + Width: 200 + Height: PARENT_HEIGHT + Image@FLAG: + X: 2 + Y: 2 + ImageName: random + ImageCollection: flags + Label@PLAYER: + X: 35 + Y: 0 + Width: 120 + Height: PARENT_HEIGHT Font: Bold Shadow: True Label@ASSETS_DESTROYED: - X: 160 + X: 155 Y: 0 Width: 75 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Align: Right Shadow: True Label@ASSETS_LOST: - X: 235 + X: 230 Y: 0 Width: 75 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Align: Right Shadow: True Label@UNITS_KILLED: - X: 310 + X: 305 Y: 0 Width: 90 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Align: Right Shadow: True Label@UNITS_DEAD: - X: 400 + X: 395 Y: 0 Width: 80 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Align: Right Shadow: True Label@BUILDINGS_KILLED: - X: 480 + X: 475 Y: 0 Width: 85 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Align: Right Shadow: True Label@BUILDINGS_DEAD: - X: 565 + X: 560 Y: 0 Width: 80 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Align: Right Shadow: True Label@ARMY_VALUE: - X: 645 + X: 640 Y: 0 Width: 90 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT + Align: Right + Shadow: True + Label@VISION: + X: 720 + Y: 0 + Width: 60 + 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: + ScrollableLineGraph@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 @@ -1055,21 +1321,47 @@ 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_WIDTH + Height: PARENT_HEIGHT + Color: 00000090 + ScrollableLineGraph@ARMY_VALUE_GRAPH: + X: 0 + Y: 0 + Width: PARENT_WIDTH - 5 + Height: PARENT_HEIGHT + ValueFormat: ${0} + YAxisValueFormat: ${0:F0} + XAxisSize: 40 + XAxisTicksPerLabel: 2 + XAxisLabel: Game Minute + YAxisLabel: Army Value + LabelFont: TinyBold + AxisFont: TinyBold + Container@TEAM_ARMY_VALUE_GRAPH_CONTAINER: + X: 0 + Y: 30 + 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: + ScrollableLineGraph@TEAM_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/ca/chrome/ingame-player.yaml b/mods/ca/chrome/ingame-player.yaml index bad6239772..0fed983aa0 100644 --- a/mods/ca/chrome/ingame-player.yaml +++ b/mods/ca/chrome/ingame-player.yaml @@ -1,47 +1,119 @@ Container@PLAYER_WIDGETS: + Logic: LoadIngameChatLogic Children: - LogicKeyListener@CONTROLGROUP_KEYHANDLER: - Logic: ControlGroupLogic + Container@CHAT_ROOT: + LogicKeyListener@PLAYER_KEYHANDLER: + Logic: RemoveFromControlGroupHotkeyLogic + RemoveFromControlGroupKey: RemoveFromControlGroup + ControlGroups@CONTROLGROUPS: + SelectGroupKeyPrefix: ControlGroupSelect + CreateGroupKeyPrefix: ControlGroupCreate + AddToGroupKeyPrefix: ControlGroupAddTo + CombineWithGroupKeyPrefix: ControlGroupCombineWith + JumpToGroupKeyPrefix: ControlGroupJumpTo LogicTicker@SIDEBAR_TICKER: Container@SUPPORT_POWERS: - Logic: SupportPowerBinLogic + Logic: SupportPowerBinLogicCA X: 10 Y: 10 Children: - SupportPowers@SUPPORT_PALETTE: + SupportPowersScrollable@SUPPORT_PALETTE: IconSize: 62, 46 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 + HotkeyCount: 10 Container@PALETTE_FOREGROUND: Children: Image@ICON_TEMPLATE: Logic: AddFactionSuffixLogic - X: 0 - 2 - Y: 0 - 2 + X: -2 + Y: -2 Width: 62 Height: 46 IgnoreMouseOver: true - ImageCollection: sidebar - ImageName: background-supportoverlay + ImageCollection: player-ui-bits + ImageName: support-power-border-overlay + Background@SELECTION_TOOLTIP: + Logic: SelectionTooltipLogic + Background: dialog4 + X: WINDOW_WIDTH + Y: WINDOW_HEIGHT + Width: 200 + Height: 65 + Children: + Label@NAME: + X: 7 + Y: 3 + Height: 23 + Font: Bold + Label@DESC: + X: 7 + Y: 27 + Height: 2 + Font: TinyBold + VAlign: Top + Label@STRENGTHS: + X: 7 + Y: 29 + Height: 2 + Font: TinyBold + VAlign: Top + TextColor: 33DD33 + Label@WEAKNESSES: + X: 7 + Y: 30 + Height: 2 + Font: TinyBold + VAlign: Top + TextColor: EE5555 + Label@ATTRIBUTES: + X: 7 + Y: 31 + Height: 2 + Font: TinyBold + VAlign: Top + TextColor: FFFF00 + Image@ARMORTYPE_ICON: + X: 3 + Y: 7 + Width: 16 + Height: 16 + ImageCollection: sidebar-bits + ImageName: production-tooltip-armor + Label@ARMORTYPE: + Y: 3 + Height: 16 + Font: Bold + Image@COST_ICON: + Y: 26 + Width: 16 + Height: 16 + ImageCollection: sidebar-bits + ImageName: production-tooltip-cost + Label@COST: + Y: 22 + Height: 23 + Font: Bold SupportPowerTimer@SUPPORT_POWER_TIMER: X: 80 Y: 10 Order: Descending Image@COMMAND_BAR_BACKGROUND: + Logic: AddFactionSuffixLogic X: 5 - Y: WINDOW_BOTTOM - HEIGHT - 5 - Width: 416 - Height: 44 - ImageCollection: commandbar - ImageName: background + Y: WINDOW_HEIGHT - HEIGHT + Width: 467 + Height: 47 + ImageCollection: player-ui-bits + ImageName: background-command-bar + ClickThrough: False Container@COMMAND_BAR: Logic: CommandBarLogic - X: 14 - Y: WINDOW_BOTTOM - HEIGHT - 14 + X: 27 + Y: WINDOW_HEIGHT - HEIGHT - 4 Width: 275 Height: 26 Children: @@ -51,11 +123,11 @@ Container@PLAYER_WIDGETS: Width: 34 Height: 26 VisualHeight: 0 - Background: command-button + Background: commandbar-button 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: @@ -70,10 +142,10 @@ Container@PLAYER_WIDGETS: Width: 34 Height: 26 VisualHeight: 0 - Background: command-button + Background: commandbar-button 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 - Helicopters will land at the target location\n - Chrono Tanks will teleport towards 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: @@ -88,10 +160,10 @@ Container@PLAYER_WIDGETS: Width: 34 Height: 26 VisualHeight: 0 - Background: command-button + Background: commandbar-button DisableKeySound: true - TooltipText: Force Attack - TooltipDesc: Selected units will attack the targeted unit or location\n - Default activity for the target is suppressed\n - Allows targeting of own or ally forces\n - Long-range artillery units will always target the\n location, ignoring units and buildings\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: @@ -106,11 +178,11 @@ Container@PLAYER_WIDGETS: Width: 34 Height: 26 VisualHeight: 0 - Background: command-button + Background: commandbar-button 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: @@ -124,12 +196,12 @@ Container@PLAYER_WIDGETS: Width: 34 Height: 26 VisualHeight: 0 - Background: command-button + Background: commandbar-button 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 - Minelayers will deploy a mine\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: @@ -143,12 +215,12 @@ Container@PLAYER_WIDGETS: Width: 34 Height: 26 VisualHeight: 0 - Background: command-button + Background: commandbar-button 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: @@ -162,12 +234,12 @@ Container@PLAYER_WIDGETS: Width: 34 Height: 26 VisualHeight: 0 - Background: command-button + Background: commandbar-button Key: Stop DisableKeyRepeat: true DisableKeySound: true - TooltipText: Stop - TooltipDesc: Selected units will stop their current activity.\n\nActs immediately on selected units. + TooltipText: button-command-bar-stop.tooltip + TooltipDesc: button-command-bar-stop.tooltipdesc TooltipContainer: TOOLTIP_CONTAINER Children: Image@ICON: @@ -181,10 +253,10 @@ Container@PLAYER_WIDGETS: Width: 34 Height: 26 VisualHeight: 0 - Background: command-button + Background: commandbar-button 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: @@ -195,8 +267,8 @@ Container@PLAYER_WIDGETS: ImageName: queue-orders Container@STANCE_BAR: Logic: StanceSelectorLogic - X: 294 - Y: WINDOW_BOTTOM - HEIGHT - 14 + X: 315 + Y: WINDOW_HEIGHT - HEIGHT - 4 Width: 138 Height: 26 Children: @@ -205,12 +277,12 @@ Container@PLAYER_WIDGETS: Width: 34 Height: 26 VisualHeight: 0 - Background: command-button + Background: commandbar-button 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: @@ -224,12 +296,12 @@ Container@PLAYER_WIDGETS: Width: 34 Height: 26 VisualHeight: 0 - Background: command-button + Background: commandbar-button 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: @@ -243,12 +315,12 @@ Container@PLAYER_WIDGETS: Width: 34 Height: 26 VisualHeight: 0 - Background: command-button + Background: commandbar-button 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: @@ -262,12 +334,12 @@ Container@PLAYER_WIDGETS: Width: 34 Height: 26 VisualHeight: 0 - Background: command-button + Background: commandbar-button 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: @@ -277,104 +349,119 @@ Container@PLAYER_WIDGETS: ImageName: hold-fire Container@MUTE_INDICATOR: Logic: MuteIndicatorLogic - X: WINDOW_RIGHT - WIDTH - 260 + X: WINDOW_WIDTH - WIDTH - 260 Y: 10 Width: 200 Height: 25 Children: Image@ICON: - X: PARENT_RIGHT - WIDTH + X: PARENT_WIDTH - WIDTH Y: 1 Width: 24 Height: 24 ImageCollection: sidebar-bits ImageName: indicator-muted Label@LABEL: - Width: PARENT_RIGHT - 30 + Width: PARENT_WIDTH - 30 Height: 25 Align: Right Text: Audio Muted Contrast: true - Image@SIDEBAR_BACKGROUND_TOP: + Image@SIDEBAR_BACKGROUND: Logic: AddFactionSuffixLogic - X: WINDOW_RIGHT - 250 - Y: 10 - Width: 238 - Height: 262 - ImageCollection: sidebar - ImageName: background-top + X: WINDOW_WIDTH - WIDTH - 5 + Y: 5 + Width: 258 + Height: 597 + ImageCollection: player-ui-bits + ImageName: background ClickThrough: false Children: Container@TOP_BUTTONS: Logic: MenuButtonsChromeLogic - X: 9 - Y: 7 + Y: 9 Children: Button@BEACON_BUTTON: Logic: BeaconOrderButtonLogic, AddFactionSuffixLogic - Width: 28 - Height: 28 - Background: sidebar-button + X: 30 + Width: 32 + Height: 24 + Background: sidebar-top-button Key: PlaceBeacon TooltipText: Place Beacon TooltipContainer: TOOLTIP_CONTAINER VisualHeight: 0 Children: Image@ICON: - X: 6 - Y: 6 + X: 8 + Y: 4 ImageCollection: order-icons Button@SELL_BUTTON: Logic: SellOrderButtonLogic, AddFactionSuffixLogic - X: 32 - Width: 28 - Height: 28 - Background: sidebar-button + X: 61 + Width: 32 + Height: 24 + Background: sidebar-top-button Key: Sell TooltipText: Sell TooltipContainer: TOOLTIP_CONTAINER VisualHeight: 0 Children: Image@ICON: - X: 6 - Y: 6 + X: 8 + Y: 4 ImageCollection: order-icons Button@POWER_BUTTON: Logic: PowerdownOrderButtonLogic, AddFactionSuffixLogic - X: 64 - Width: 28 - Height: 28 - Background: sidebar-button + X: 92 + Width: 32 + Height: 24 + Background: sidebar-top-button Key: PowerDown TooltipText: Power Down TooltipContainer: TOOLTIP_CONTAINER VisualHeight: 0 Children: Image@ICON: - X: 6 - Y: 6 + X: 8 + Y: 4 ImageCollection: order-icons Button@REPAIR_BUTTON: Logic: RepairOrderButtonLogic, AddFactionSuffixLogic - X: 96 - Width: 28 - Height: 28 - Background: sidebar-button + X: 123 + Width: 32 + Height: 24 + Background: sidebar-top-button Key: Repair TooltipText: Repair TooltipContainer: TOOLTIP_CONTAINER VisualHeight: 0 Children: Image@ICON: - X: 6 - Y: 6 + X: 8 + Y: 4 + ImageCollection: order-icons + Button@UPGRADE_BUTTON: + Logic: UpgradeOrderButtonLogic, AddFactionSuffixLogic + X: 154 + Width: 32 + Height: 24 + Background: sidebar-top-button + Key: Upgrade + TooltipText: Upgrade + TooltipContainer: TOOLTIP_CONTAINER + VisualHeight: 0 + Children: + Image@ICON: + X: 8 + Y: 4 ImageCollection: order-icons MenuButton@OPTIONS_BUTTON: Logic: AddFactionSuffixLogic - X: 192 - Width: 28 - Height: 28 - Background: sidebar-button + X: 195 + Width: 32 + Height: 24 + Background: sidebar-top-button Key: escape TooltipText: Options TooltipContainer: TOOLTIP_CONTAINER @@ -382,15 +469,33 @@ Container@PLAYER_WIDGETS: VisualHeight: 0 Children: Image@ICON: - X: 6 - Y: 6 + X: 8 + Y: 4 ImageCollection: order-icons ImageName: options + Container@POWERBAR_PANEL: + X: 14 + Y: 36 + Width: 11 + Height: 222 + Children: + SpritePowerMeter@POWER_BAR: + Logic: SpritePowerMeterLogic + Height: 222 + Width: 7 + TooltipContainer: TOOLTIP_CONTAINER + TooltipTemplate: SIMPLE_TOOLTIP + ImageCollection: power-meter + NoPowerImage: grey + AvailablePowerImage: green + UsedPowerImage: red + OverUsedPowerImage: grey + FlashPowerImage: yellow Image@RADAR: Logic: AddFactionSuffixLogic, IngameRadarDisplayLogic - X: 8 + X: 28 Y: 40 - ImageCollection: sidebar + ImageCollection: player-ui-bits ImageName: radar Children: LogicTicker@RADAR_TICKER: @@ -406,253 +511,359 @@ Container@PLAYER_WIDGETS: SoundUp: RadarUp SoundDown: RadarDown Children: - VqaPlayer@PLAYER: + VideoPlayer@PLAYER: X: 1 Y: 1 Width: 220 Height: 220 Skippable: false - Container@SIDEBAR_PRODUCTION: - Logic: ClassicProductionLogic - X: WINDOW_RIGHT - 250 - Y: 300 - Width: 238 - Height: 250 - Children: - Container@PALETTE_BACKGROUND: - Children: - Image@ROW_TEMPLATE: - Logic: AddFactionSuffixLogic - X: 40 - Width: 190 - Height: 47 - ClickThrough: false - ImageCollection: sidebar - ImageName: background-iconbg - Image@BOTTOM_CAP: - Logic: AddFactionSuffixLogic - Width: 238 - Height: 8 - ClickThrough: false - ImageCollection: sidebar - ImageName: background-bottom - LogicTicker@PRODUCTION_TICKER: - ProductionPalette@PRODUCTION_PALETTE: - X: 42 - Y: 1 - TooltipContainer: TOOLTIP_CONTAINER - ReadyText: READY - HoldText: ON HOLD - IconSize: 62, 46 - IconMargin: 1, 1 - IconSpriteOffset: -1, -1 - HotkeyPrefix: Production - HotkeyCount: 24 - SelectProductionBuildingHotkey: SelectProductionBuilding - Container@PALETTE_FOREGROUND: - Children: - Image@ROW_TEMPLATE: - Logic: AddFactionSuffixLogic - Width: 238 - Height: 47 - IgnoreMouseOver: true - ImageCollection: sidebar - ImageName: background-iconrow - Container@PRODUCTION_TYPES: - X: 7 - Y: 0 - 2 - Width: 29 - Height: 240 + Container@SIDEBAR_MONEYBIN: + X: 9 + Y: 264 + Width: 241 + Height: 24 Children: - ProductionTypeButton@BUILDING: - Logic: AddFactionSuffixLogic - Width: 28 - Height: 28 - VisualHeight: 0 - Background: sidebar-button - TooltipText: Buildings - TooltipContainer: TOOLTIP_CONTAINER - ProductionGroup: Building - Key: ProductionTypeBuilding - Children: - Image@ICON: - X: 6 - Y: 6 - ImageCollection: production-icons - ProductionTypeButton@DEFENSE: - Logic: AddFactionSuffixLogic - Y: 27 - Width: 28 - Height: 28 - VisualHeight: 0 - Background: sidebar-button - TooltipText: Defense - TooltipContainer: TOOLTIP_CONTAINER - ProductionGroup: Defense - Key: ProductionTypeDefense - Children: - Image@ICON: - X: 6 - Y: 6 - ImageCollection: production-icons - ProductionTypeButton@INFANTRY: - Logic: AddFactionSuffixLogic - Y: 54 - Width: 28 - Height: 28 - VisualHeight: 0 - Background: sidebar-button - TooltipText: Infantry - TooltipContainer: TOOLTIP_CONTAINER - ProductionGroup: Infantry - Key: ProductionTypeInfantry - Children: - Image@ICON: - X: 6 - Y: 6 - ImageCollection: production-icons - ProductionTypeButton@VEHICLE: - Logic: AddFactionSuffixLogic - Y: 81 - Width: 28 - Height: 28 - VisualHeight: 0 - Background: sidebar-button - TooltipText: Vehicles - TooltipContainer: TOOLTIP_CONTAINER - ProductionGroup: Vehicle - Key: ProductionTypeVehicle - Children: - Image@ICON: - X: 6 - Y: 6 - ImageCollection: production-icons - ProductionTypeButton@AIRCRAFT: - Logic: AddFactionSuffixLogic - Y: 108 - Width: 28 - Height: 28 - VisualHeight: 0 - Background: sidebar-button - TooltipText: Aircraft - TooltipContainer: TOOLTIP_CONTAINER - ProductionGroup: Aircraft - Key: ProductionTypeAircraft - Children: - Image@ICON: - X: 6 - Y: 6 - ImageCollection: production-icons - ProductionTypeButton@NAVAL: - Logic: AddFactionSuffixLogic - Y: 135 - Width: 28 - Height: 28 - VisualHeight: 0 - Background: sidebar-button - TooltipText: Naval + Label@GAME_TIMER: + Logic: GameTimerLogic + X: 3 + Y: 1 + Width: PARENT_WIDTH + Height: 23 + Align: Center + Font: TinyBold + LabelWithTooltip@CASH: + Logic: IngameCashCounterLogic + X: 20 + Y: 1 + Width: 50 + Height: 23 + Font: Bold + Text: {0} TooltipContainer: TOOLTIP_CONTAINER - ProductionGroup: Ship - Key: ProductionTypeNaval + TooltipTemplate: SIMPLE_TOOLTIP Children: - Image@ICON: - X: 6 - Y: 6 - ImageCollection: production-icons - ProductionTypeButton@UPGRADE: - Logic: AddFactionSuffixLogic - Y: 162 - Width: 28 - Height: 28 - VisualHeight: 0 - Background: sidebar-button - TooltipText: Upgrades + Image@CASH_ICON: + X: -17 + Y: 4 + ImageCollection: cash-icons + ImageName: cash-normal + LabelWithTooltip@POWER: + Logic: IngamePowerCounterLogic + X: PARENT_WIDTH - WIDTH - 20 + Y: 1 + Width: 50 + Height: 23 + Align: Right + Font: Bold + Text: {0} TooltipContainer: TOOLTIP_CONTAINER - ProductionGroup: Upgrade - Key: ProductionTypeUpgrade + TooltipTemplate: SIMPLE_TOOLTIP Children: - Image@ICON: - X: 6 - Y: 6 - ImageCollection: production-icons - Button@SCROLL_UP_BUTTON: - Logic: AddFactionSuffixLogic - Y: 189 - Width: 28 - Height: 22 - VisualHeight: 0 - Background: sidebar-button - TooltipText: Scroll up + Image@POWER_ICON: + X: PARENT_WIDTH + 4 + Y: 4 + ImageCollection: power-icons + ImageName: power-normal + Container@SIDEBAR_PRODUCTION: + Logic: ClassicProductionLogic + Children: + ProductionPaletteCA@PRODUCTION_PALETTE: + Width: 194 + Height: 244 + X: 53 + Y: 326 TooltipContainer: TOOLTIP_CONTAINER - Children: - Image@ICON: - X: 6 - Y: 3 - ImageCollection: scrollpanel-decorations - ImageName: up - Button@SCROLL_DOWN_BUTTON: + ReadyText: READY + HoldText: ON HOLD + IconSize: 62, 46 + IconMargin: 3, 3 + IconSpriteOffset: -1, -1 + MinimumRows: 5 + MaximumRows: 5 + HotkeyPrefix: Production + HotkeyCount: 24 + SelectProductionBuildingHotkey: SelectProductionBuilding + LogicTicker@PRODUCTION_TICKER: + Image@PALETTE_BORDERS_OVERLAY: Logic: AddFactionSuffixLogic - Y: 214 - Width: 28 - Height: 22 - VisualHeight: 0 - Background: sidebar-button - TooltipText: Scroll down - TooltipContainer: TOOLTIP_CONTAINER + X: 51 + Y: 324 + IgnoreMouseOver: true + ImageCollection: player-ui-bits + ImageName: palette-borders-overlay + Container@PRODUCTION_TYPES: + X: 14 + Y: 295 + Width: 29 + Height: 240 Children: - Image@ICON: - X: 6 - Y: 3 - ImageCollection: scrollpanel-decorations - ImageName: down - Image@SIDEBAR_MONEYBIN: - Logic: AddFactionSuffixLogic - X: WINDOW_RIGHT - 250 - Y: 272 - Width: 238 - Height: 27 - ImageCollection: sidebar - ImageName: background-moneybin - ClickThrough: false - Children: - Label@GAME_TIMER: - Logic: GameTimerLogic - X: 3 - Y: 3 - Width: PARENT_RIGHT - Height: 23 - Align: Center - Font: TinyBold - LabelWithTooltip@CASH: - Logic: IngameCashCounterLogic - X: 35 - Y: 2 - Width: 50 - Height: 23 - Font: Bold - Text: {0} + ProductionTypeButton@BUILDING: + Logic: AddFactionSuffixLogic + Width: 32 + Height: 26 + VisualHeight: 0 + Background: sidebar-production-type-button + TooltipText: Buildings + TooltipContainer: TOOLTIP_CONTAINER + ProductionGroup: Building + Key: ProductionTypeBuilding + Children: + Image@ICON: + X: 8 + Y: 5 + ImageCollection: production-icons + ProductionTypeButton@DEFENSE: + Logic: AddFactionSuffixLogic + Y: 29 + Width: 32 + Height: 26 + VisualHeight: 0 + Background: sidebar-production-type-button + TooltipText: Defense + TooltipContainer: TOOLTIP_CONTAINER + ProductionGroup: Defense + Key: ProductionTypeDefense + Children: + Image@ICON: + X: 8 + Y: 5 + ImageCollection: production-icons + ProductionTypeButton@INFANTRY: + Logic: AddFactionSuffixLogic + Y: 58 + Width: 32 + Height: 26 + VisualHeight: 0 + Background: sidebar-production-type-button + TooltipText: Infantry + TooltipContainer: TOOLTIP_CONTAINER + ProductionGroup: Infantry + Key: ProductionTypeInfantry + Children: + Image@ICON: + X: 8 + Y: 5 + ImageCollection: production-icons + ProductionTypeButton@VEHICLE: + Logic: AddFactionSuffixLogic + Y: 87 + Width: 32 + Height: 26 + VisualHeight: 0 + Background: sidebar-production-type-button + TooltipText: Vehicles + TooltipContainer: TOOLTIP_CONTAINER + ProductionGroup: Vehicle + Key: ProductionTypeVehicle + Children: + Image@ICON: + X: 8 + Y: 5 + ImageCollection: production-icons + ProductionTypeButton@AIRCRAFT: + Logic: AddFactionSuffixLogic + Y: 116 + Width: 32 + Height: 26 + VisualHeight: 0 + Background: sidebar-production-type-button + TooltipText: Aircraft + TooltipContainer: TOOLTIP_CONTAINER + ProductionGroup: Aircraft + Key: ProductionTypeAircraft + Children: + Image@ICON: + X: 8 + Y: 5 + ImageCollection: production-icons + ProductionTypeButton@NAVAL: + Logic: AddFactionSuffixLogic + Y: 145 + Width: 32 + Height: 26 + VisualHeight: 0 + Background: sidebar-production-type-button + TooltipText: Naval + TooltipContainer: TOOLTIP_CONTAINER + ProductionGroup: Ship + Key: ProductionTypeNaval + Children: + Image@ICON: + X: 8 + Y: 5 + ImageCollection: production-icons + ProductionTypeButton@UPGRADE: + Logic: AddFactionSuffixLogic + Y: 174 + Width: 32 + Height: 26 + VisualHeight: 0 + Background: sidebar-production-type-button + TooltipText: Upgrades + TooltipContainer: TOOLTIP_CONTAINER + ProductionGroup: Upgrade + Key: ProductionTypeUpgrade + Children: + Image@ICON: + X: 8 + Y: 5 + ImageCollection: production-icons + Button@SCROLL_UP_BUTTON: + Logic: AddFactionSuffixLogic + X: 37 + Y: 274 + Width: 97 + Height: 18 + VisualHeight: 0 + Background: sidebar-scrollup-button + TooltipText: Scroll up + TooltipContainer: TOOLTIP_CONTAINER + Button@SCROLL_DOWN_BUTTON: + Logic: AddFactionSuffixLogic + X: 135 + Y: 274 + Width: 96 + Height: 18 + VisualHeight: 0 + Background: sidebar-scrolldown-button + TooltipText: Scroll down + TooltipContainer: TOOLTIP_CONTAINER + ProductionTabsCA@PRODUCTION_TABS: + RightButton: sidebar-production-tab-right-button + LeftButton: sidebar-production-tab-left-button + TabButton: sidebar-production-tab-button + TabWidth: 31 + TabSpacing: 3 + ArrowWidth: 17 + IdleAlertDelay: 125 + IdleAlertGroups: Infantry, Vehicle, Aircraft, Ship + IdleAlertBlinkRate: 0.08 + Logic: AddFactionSuffixLogicCA, ProductionTabsLogicCA + PaletteWidget: PRODUCTION_PALETTE + TypesContainer: PRODUCTION_TYPES + BackgroundContainer: PRODUCTION_TABS_BACKGROUND + PreviousProductionTabKey: PreviousProductionTab + NextProductionTabKey: NextProductionTab + X: 47 + Y: 295 + Width: 204 + Height: 24 + ContainerWithTooltip@ALLIED_INFLUENCE: + Logic: AlliedInfluenceIndicatorLogic + X: 25 + Y: 525 + Width: 29 + Height: 65 TooltipContainer: TOOLTIP_CONTAINER TooltipTemplate: SIMPLE_TOOLTIP + IgnoreChildMouseOver: true Children: - Image@CASH_ICON: - X: 0-21 - Y: 4 - ImageCollection: cash-icons - ImageName: cash-normal - LabelWithTooltip@POWER: - Logic: IngamePowerCounterLogic - X: PARENT_RIGHT - WIDTH - 30 - Y: 2 - Width: 50 - Height: 23 - Align: Right - Font: Bold - Text: {0} - TooltipContainer: TOOLTIP_CONTAINER - TooltipTemplate: SIMPLE_TOOLTIP + Container@ALLIED_INFLUENCE_METER: + Width: PARENT_WIDTH + Height: PARENT_HEIGHT + Children: + Image@ALLIED_INFLUENCE_METER_EMPTY: + Width: PARENT_WIDTH + Height: PARENT_HEIGHT + ImageCollection: allied-coalition + ImageName: influence-empty + CroppableImage@ALLIED_INFLUENCE_METER_FULL: + Width: PARENT_WIDTH + Height: PARENT_HEIGHT + ImageCollection: allied-coalition + ImageName: influence-full + Image@ALLIED_COALITION_IMAGE: + ImageCollection: allied-coalition + Image@ALLIED_NO_COALITION_IMAGE + ImageCollection: allied-coalition + ImageName: none + Image@ALLIED_INFLUENCE_LEVEL: + X: 2 + Y: 29 + Width: 10 + Height: 9 + ImageCollection: allied-coalition + Container@PLAYER_EXPERIENCE: + Logic: PlayerExperienceLevelIndicatorLogic Children: - Image@POWER_ICON: - X: PARENT_RIGHT + 4 - Y: 4 - ImageCollection: power-icons - ImageName: power-normal + Image@PLAYER_EXPERIENCE_LEVEL: + X: 18 + Y: 529 + Width: 39 + Height: 67 + ImageCollection: soviet-player-ranks + TooltipContainer: TOOLTIP_CONTAINER + TooltipTemplate: SIMPLE_TOOLTIP + ImageWithAlpha@PLAYER_EXPERIENCE_LEVEL_GLOW: + X: 18 + Y: 529 + Width: 39 + Height: 67 + ImageCollection: soviet-player-ranks + ImageWithAlpha@PLAYER_EXPERIENCE_LEVEL_UP: + X: 0 - WIDTH + 18 + Y: 532 + Width: 115 + Height: 54 + ImageCollection: soviet-player-ranks + ImageName: rank-up + Container@GDI_STRATEGY: + Logic: GDIStrategyIndicatorLogic + Children: + Image@GDI_STRATEGY_LEVEL: + X: 25 + Y: 525 + Width: 29 + Height: 65 + ImageCollection: gdi-strategy + Container@NOD_COVENANT: + Logic: NodCovenantIndicatorLogic + Children: + Image@NOD_COVENANT_LEVEL: + X: 25 + Y: 525 + Width: 29 + Height: 65 + ImageCollection: nod-covenant + TooltipContainer: TOOLTIP_CONTAINER + TooltipTemplate: SIMPLE_TOOLTIP + Container@SCRIN_ALLEGIANCE: + Logic: ScrinAllegianceIndicatorLogic + Children: + Image@SCRIN_ALLEGIANCE_LEVEL: + X: 19 + Y: 526 + Width: 37 + Height: 71 + ImageCollection: scrin-allegiance + ImageWithAlpha@SCRIN_ALLEGIANCE_LEVEL_GLOW: + X: 19 + Y: 526 + Width: 37 + Height: 71 + ImageCollection: scrin-allegiance + ImageWithAlpha@SCRIN_ALLEGIANCE_LEVEL_UP: + X: 0 - WIDTH + 18 + Y: 532 + Width: 115 + Height: 54 + ImageCollection: scrin-allegiance + ImageName: ref-added + Container@HPF_OVERLAY: + Logic: HierarchicalPathFinderOverlayLogic + X: WINDOW_WIDTH - WIDTH - 260 + Y: 40 + Width: 175 + Height: 60 + Children: + DropDownButton@HPF_OVERLAY_LOCOMOTOR: + Width: PARENT_WIDTH + Height: 25 + Text: Select Locomotor + Font: Regular + DropDownButton@HPF_OVERLAY_CHECK: + Y: 0 + 35 + Width: PARENT_WIDTH + Height: 25 + Text: Select BlockedByActor + Font: Regular diff --git a/mods/ca/chrome/ingame-transients.yaml b/mods/ca/chrome/ingame-transients.yaml new file mode 100644 index 0000000000..29e18ec4cb --- /dev/null +++ b/mods/ca/chrome/ingame-transients.yaml @@ -0,0 +1,13 @@ +Container@TRANSIENTS_PANEL: + X: 5 + Y: WINDOW_HEIGHT - HEIGHT - 55 + Width: 550 + Height: 80 + Logic: IngameTransientNotificationsLogic + Children: + TextNotificationsDisplay@TRANSIENTS_DISPLAY: + Width: PARENT_WIDTH + Height: PARENT_HEIGHT + DisplayDurationMs: 6000 + LogLength: 5 + HideOverflow: False diff --git a/mods/ca/chrome/lobby-options.yaml b/mods/ca/chrome/lobby-options.yaml new file mode 100644 index 0000000000..8d78f9d6c6 --- /dev/null +++ b/mods/ca/chrome/lobby-options.yaml @@ -0,0 +1,120 @@ +Container@LOBBY_OPTIONS_BIN: + Width: PARENT_WIDTH + Height: PARENT_HEIGHT + Children: + Label@TITLE: + Y: 0 - 24 + Width: PARENT_WIDTH + Height: 25 + Font: Bold + Align: Center + Text: Map Options + Button@RESET_OPTIONS: + X: PARENT_WIDTH - WIDTH + Y: 0 - 26 + Width: 50 + Height: 26 + TooltipText: Reset options to map defaults + TooltipContainer: TOOLTIP_CONTAINER + Text: Reset + Button@LOAD_OPTIONS: + X: PARENT_WIDTH - WIDTH - 50 + Y: 0 - 26 + Width: 44 + Height: 26 + TooltipText: Load saved options + TooltipContainer: TOOLTIP_CONTAINER + Text: Load + Button@SAVE_OPTIONS: + X: PARENT_WIDTH - WIDTH - 50 - 44 + Y: 0 - 26 + Width: 44 + Height: 26 + TooltipText: Save options + TooltipContainer: TOOLTIP_CONTAINER + Text: Save + ScrollPanel: + Logic: LobbyOptionsLogicCA, LobbyMissionInfoLogic + Width: PARENT_WIDTH + Height: PARENT_HEIGHT + Children: + Container@LOBBY_OPTIONS: + Y: 10 + Width: PARENT_WIDTH - 24 + Children: + Container@CHECKBOX_ROW_TEMPLATE: + Width: PARENT_WIDTH + Height: 30 + Children: + Checkbox@A: + X: 10 + Width: PARENT_WIDTH / 3 - 20 + Height: 20 + Visible: False + TooltipContainer: TOOLTIP_CONTAINER + Checkbox@B: + X: PARENT_WIDTH / 3 + 10 + Width: PARENT_WIDTH / 3 - 20 + Height: 20 + Visible: False + TooltipContainer: TOOLTIP_CONTAINER + Checkbox@C: + X: (PARENT_WIDTH / 3) * 2 + 10 + Width: PARENT_WIDTH / 3 - 20 + Height: 20 + Visible: False + TooltipContainer: TOOLTIP_CONTAINER + Container@DROPDOWN_ROW_TEMPLATE: + Height: 60 + Width: PARENT_WIDTH + Children: + LabelForInput@A_DESC: + X: 10 + Width: PARENT_WIDTH / 3 - 20 + Height: 20 + Visible: False + For: A + DropDownButton@A: + X: 10 + Width: PARENT_WIDTH / 3 - 20 + Y: 25 + Height: 25 + Visible: False + TooltipContainer: TOOLTIP_CONTAINER + LabelForInput@B_DESC: + X: PARENT_WIDTH / 3 + 10 + Width: PARENT_WIDTH / 3 - 20 + Height: 20 + Visible: False + For: B + DropDownButton@B: + X: PARENT_WIDTH / 3 + 10 + Width: PARENT_WIDTH / 3 - 20 + Y: 25 + Height: 25 + Visible: False + TooltipContainer: TOOLTIP_CONTAINER + LabelForInput@C_DESC: + X: (PARENT_WIDTH / 3) * 2 + 10 + Width: PARENT_WIDTH / 3 - 20 + Height: 20 + Visible: False + For: C + DropDownButton@C: + X: (PARENT_WIDTH / 3) * 2 + 10 + Width: PARENT_WIDTH / 3 - 20 + Y: 25 + Height: 25 + Visible: False + TooltipContainer: TOOLTIP_CONTAINER + Container@ADVANCED_HEADER_TEMPLATE: + Width: PARENT_WIDTH + Height: 40 + Children: + Label@ADVANCED_HEADER: + X: 10 + Y: 10 + Width: PARENT_WIDTH - 20 + Height: 20 + Font: Bold + Text: Advanced Options diff --git a/mods/ca/chrome/mainmenu.yaml b/mods/ca/chrome/mainmenu.yaml index 0e0b63deac..3523e21405 100644 --- a/mods/ca/chrome/mainmenu.yaml +++ b/mods/ca/chrome/mainmenu.yaml @@ -1,5 +1,5 @@ Container@MAINMENU: - Logic: MainMenuLogic + Logic: MainMenuLogicCA Children: LogicKeyListener@GLOBAL_KEYHANDLER: Logic: MusicHotkeyLogic, ScreenshotHotkeyLogic, MuteHotkeyLogic @@ -11,24 +11,25 @@ Container@MAINMENU: MuteAudioKey: ToggleMute Background@BORDER: Background: mainmenu-border - X: 0 - 15 - Y: 0 - 15 - Width: WINDOW_RIGHT + 30 - Height: WINDOW_BOTTOM + 30 + X: -15 + Y: -15 + Width: WINDOW_WIDTH + 30 + Height: WINDOW_HEIGHT + 30 ImageCA@LOGO: - X: (WINDOW_RIGHT - 512) / 2 + X: (WINDOW_WIDTH - 512) / 2 Y: 30 - ImageCollection: logos + ImageCollection: menu-logo ImageName: logo MinXResolution: 1680 ImageCA@LOWRESLOGO: - X: (WINDOW_RIGHT - 512) + X: (WINDOW_WIDTH - 512) Y: 30 - ImageCollection: logos + ImageCollection: menu-logo ImageName: logo MaxXResolution: 1679 Label@VERSION_LABEL: - X: (WINDOW_RIGHT) - 512 - 35 + Logic: VersionLabelLogic + X: (WINDOW_WIDTH) - 512 - 35 Y: 25 Width: 512 Height: 25 @@ -36,14 +37,14 @@ Container@MAINMENU: Font: Regular Shadow: true Container@MENUS: - X: 13 + (WINDOW_RIGHT - 522) / 4 - WIDTH / 2 - Y: WINDOW_BOTTOM / 2 - HEIGHT / 2 + X: 13 + (WINDOW_WIDTH - 522) / 4 - WIDTH / 2 + Y: WINDOW_HEIGHT / 2 - HEIGHT / 2 Width: 200 - Height: 320 + Height: 360 Children: Background@MAIN_MENU: - Width: PARENT_RIGHT - Height: PARENT_BOTTOM + Width: PARENT_WIDTH + Height: PARENT_HEIGHT Children: Label@MAINMENU_LABEL_TITLE: X: 0 @@ -52,53 +53,59 @@ Container@MAINMENU: Height: 30 Text: Combined Arms Align: Center - Font: Bold - TextColor: cccccc + Font: MediumBold Button@SINGLEPLAYER_BUTTON: - X: PARENT_RIGHT / 2 - WIDTH / 2 + X: PARENT_WIDTH / 2 - WIDTH / 2 Y: 60 Width: 140 Height: 30 Text: Singleplayer Font: Bold Button@MULTIPLAYER_BUTTON: - X: PARENT_RIGHT / 2 - WIDTH / 2 + X: PARENT_WIDTH / 2 - WIDTH / 2 Y: 100 Width: 140 Height: 30 Text: Multiplayer Font: Bold Button@SETTINGS_BUTTON: - X: PARENT_RIGHT / 2 - WIDTH / 2 + X: PARENT_WIDTH / 2 - WIDTH / 2 Y: 140 Width: 140 Height: 30 Text: Settings Font: Bold - Button@EXTRAS_BUTTON: - X: PARENT_RIGHT / 2 - WIDTH / 2 + Button@ENCYCLOPEDIA_BUTTON: + X: PARENT_WIDTH / 2 - WIDTH / 2 Y: 180 Width: 140 Height: 30 + Text: Encyclopedia + Font: Bold + Button@EXTRAS_BUTTON: + X: PARENT_WIDTH / 2 - WIDTH / 2 + Y: 220 + Width: 140 + Height: 30 Text: Extras Font: Bold Button@CONTENT_BUTTON: - X: PARENT_RIGHT / 2 - WIDTH / 2 - Y: 220 + X: PARENT_WIDTH / 2 - WIDTH / 2 + Y: 260 Width: 140 Height: 30 Text: Manage Content Font: Bold Button@QUIT_BUTTON: - X: PARENT_RIGHT / 2 - WIDTH / 2 - Y: 260 + X: PARENT_WIDTH / 2 - WIDTH / 2 + Y: 300 Width: 140 Height: 30 Text: Quit Font: Bold Background@SINGLEPLAYER_MENU: - Width: PARENT_RIGHT - Height: PARENT_BOTTOM + Width: PARENT_WIDTH + Height: PARENT_HEIGHT Children: Label@SINGLEPLAYER_MENU_TITLE: X: 0 @@ -109,37 +116,37 @@ Container@MAINMENU: Align: Center Font: Bold Button@SKIRMISH_BUTTON: - X: PARENT_RIGHT / 2 - WIDTH / 2 + X: PARENT_WIDTH / 2 - WIDTH / 2 Y: 60 Width: 140 Height: 30 Text: Skirmish Font: Bold Button@MISSIONS_BUTTON: - X: PARENT_RIGHT / 2 - WIDTH / 2 + X: PARENT_WIDTH / 2 - WIDTH / 2 Y: 100 Width: 140 Height: 30 Text: Missions Font: Bold Button@LOAD_BUTTON: - X: PARENT_RIGHT / 2 - WIDTH / 2 + X: PARENT_WIDTH / 2 - WIDTH / 2 Y: 140 Width: 140 Height: 30 Text: Load Font: Bold Button@BACK_BUTTON: - X: PARENT_RIGHT / 2 - WIDTH / 2 + X: PARENT_WIDTH / 2 - WIDTH / 2 Key: escape - Y: 260 + Y: 300 Width: 140 Height: 30 Text: Back Font: Bold Background@EXTRAS_MENU: - Width: PARENT_RIGHT - Height: PARENT_BOTTOM + Width: PARENT_WIDTH + Height: PARENT_HEIGHT Children: Label@EXTRAS_MENU_TITLE: X: 0 @@ -150,51 +157,51 @@ Container@MAINMENU: Align: Center Font: Bold Button@REPLAYS_BUTTON: - X: PARENT_RIGHT / 2 - WIDTH / 2 + X: PARENT_WIDTH / 2 - WIDTH / 2 Y: 60 Width: 140 Height: 30 Text: Replays Font: Bold Button@MUSIC_BUTTON: - X: PARENT_RIGHT / 2 - WIDTH / 2 + X: PARENT_WIDTH / 2 - WIDTH / 2 Y: 100 Width: 140 Height: 30 Text: Music Font: Bold Button@MAP_EDITOR_BUTTON: - X: PARENT_RIGHT / 2 - WIDTH / 2 + X: PARENT_WIDTH / 2 - WIDTH / 2 Y: 140 Width: 140 Height: 30 Text: Map Editor Font: Bold Button@ASSETBROWSER_BUTTON: - X: PARENT_RIGHT / 2 - WIDTH / 2 + X: PARENT_WIDTH / 2 - WIDTH / 2 Y: 180 Width: 140 Height: 30 Text: Asset Browser Font: Bold Button@CREDITS_BUTTON: - X: PARENT_RIGHT / 2 - WIDTH / 2 + X: PARENT_WIDTH / 2 - WIDTH / 2 Y: 220 Width: 140 Height: 30 Text: Credits Font: Bold Button@BACK_BUTTON: - X: PARENT_RIGHT / 2 - WIDTH / 2 + X: PARENT_WIDTH / 2 - WIDTH / 2 Key: escape - Y: 260 + Y: 300 Width: 140 Height: 30 Text: Back Font: Bold Background@MAP_EDITOR_MENU: - Width: PARENT_RIGHT - Height: PARENT_BOTTOM + Width: PARENT_WIDTH + Height: PARENT_HEIGHT Children: Label@MAP_EDITOR_MENU_TITLE: X: 0 @@ -205,23 +212,23 @@ Container@MAINMENU: Align: Center Font: Bold Button@NEW_MAP_BUTTON: - X: PARENT_RIGHT / 2 - WIDTH / 2 + X: PARENT_WIDTH / 2 - WIDTH / 2 Y: 60 Width: 140 Height: 30 Text: New Map Font: Bold Button@LOAD_MAP_BUTTON: - X: PARENT_RIGHT / 2 - WIDTH / 2 + X: PARENT_WIDTH / 2 - WIDTH / 2 Y: 100 Width: 140 Height: 30 Text: Load Map Font: Bold Button@BACK_BUTTON: - X: PARENT_RIGHT / 2 - WIDTH / 2 + X: PARENT_WIDTH / 2 - WIDTH / 2 Key: escape - Y: 260 + Y: 300 Width: 140 Height: 30 Text: Back @@ -231,15 +238,15 @@ Container@MAINMENU: Children: Label@PERF_TEXT: X: 30 - Y: WINDOW_BOTTOM - 70 + Y: WINDOW_HEIGHT - 70 Width: 170 Height: 40 Contrast: true Background@GRAPH_BG: ClickThrough: true Background: dialog4 - X: WINDOW_RIGHT - 240 - Y: WINDOW_BOTTOM - 240 + X: WINDOW_WIDTH - 240 + Y: WINDOW_HEIGHT - 240 Width: 210 Height: 210 Children: @@ -248,24 +255,165 @@ Container@MAINMENU: Y: 5 Width: 200 Height: 200 - Container@UPDATE_NOTICE: - X: (WINDOW_RIGHT - WIDTH) / 2 - Y: 95 - Width: 128 + Container@MENU_NOTIFICATIONS: + Logic: MenuNotificationsLogic + Children: + Background@NEW_VERSION: + Background: dialog4 + X: WINDOW_WIDTH - WIDTH - 25 + Y: WINDOW_HEIGHT - 32 - HEIGHT - 25 - 4 + Width: 270 + Height: 65 + Children: + Label@NEW_VERSION_LABEL: + X: 0 + Y: 2 + Width: PARENT_WIDTH + Height: 25 + Align: Center + Font: Regular + Shadow: true + TextColor: ffff00 + Text: Testing testing + ExternalLinkButton@NEW_VERSION_BUTTON: + X: PARENT_WIDTH / 2 - WIDTH / 2 + Y: PARENT_HEIGHT - HEIGHT - 8 + Width: 100 + Height: 28 + Background: button + Align: Center + Text: Download + Font: Regular + Url: null + Background@NOTIFICATIONS: + Background: dialog4 + X: WINDOW_WIDTH - WIDTH - 25 + Y: WINDOW_HEIGHT - 32 - HEIGHT - 25 - 4 + Width: 300 + Height: 200 + Children: + Label@NOTIFICATIONS_TITLE: + X: 0 + Y: 5 + Width: PARENT_WIDTH + Height: 20 + Align: Center + Font: Bold + Shadow: true + TextColor: ffff00 + Text: Notifications + ScrollPanel@NOTIFICATIONS_PANEL: + X: 10 + Y: 30 + Width: PARENT_WIDTH - 20 + Height: PARENT_HEIGHT - 40 + Background: observer-scrollpanel-button-pressed + Children: + Container@NOTIFICATION_TEMPLATE: + X: 0 + Y: 0 + Width: PARENT_WIDTH + Height: 35 + Children: + Label@NOTIFICATION_TITLE: + X: 8 + Y: 0 + Width: PARENT_WIDTH - 40 + Height: 15 + Font: Regular + TextColor: ff0000 + Label@NOTIFICATION_BODY: + X: 8 + Y: 18 + Width: PARENT_WIDTH - 40 + Height: 15 + Font: Small + Container@EXTERNAL_LINKS: + Logic: ExternalLinksLogic + X: WINDOW_WIDTH - WIDTH - 25 + Y: WINDOW_HEIGHT - HEIGHT - 25 + Width: 236 + Height: 32 Children: - Label@A: - Width: PARENT_RIGHT - Height: 25 - Align: Center - Shadow: true - Text: You are running an outdated version of OpenRA. - Label@B: - Y: 20 - Width: PARENT_RIGHT - Height: 25 - Align: Center - Shadow: true - Text: Download the latest version from www.openra.net + ExternalLinkButton@DISCORD_LINK: + X: 0 + Y: 0 + Width: 32 + Height: 32 + Background: discord-icon + Align: Left + LeftMargin: 0 + TooltipText: Discord Server + TooltipContainer: LINKS_TOOLTIP_CONTAINER + Url: https://discord.gg/2fUxXEKQhP + ExternalLinkButton@YOUTUBE_LINK: + X: 34 + Y: 0 + Width: 32 + Height: 32 + Background: youtube-icon + Align: Left + LeftMargin: 0 + TooltipText: YouTube Channel + TooltipContainer: LINKS_TOOLTIP_CONTAINER + Url: https://www.youtube.com/@openracombinedarms + ExternalLinkButton@FACEBOOK_LINK: + X: 68 + Y: 0 + Width: 32 + Height: 32 + Background: facebook-icon + Align: Left + LeftMargin: 0 + TooltipText: Facebook Page + TooltipContainer: LINKS_TOOLTIP_CONTAINER + Url: https://www.facebook.com/openracombinedarms + ExternalLinkButton@LADDER_LINK: + X: 102 + Y: 0 + Width: 32 + Height: 32 + Background: moddb-icon + Align: Left + LeftMargin: 0 + TooltipText: ModDB + TooltipContainer: LINKS_TOOLTIP_CONTAINER + Url: https://www.moddb.com/mods/command-conquer-combined-arms + ExternalLinkButton@SPREADSHEET_LINK: + X: 136 + Y: 0 + Width: 32 + Height: 32 + Background: spreadsheet-icon + Align: Left + LeftMargin: 0 + TooltipText: Unit Stats Spreadsheet + TooltipContainer: LINKS_TOOLTIP_CONTAINER + Url: https://docs.google.com/spreadsheets/d/1RDg36FKB2kTU-rlwn358B879DHYen2vcZTdE39-Fz6k + ExternalLinkButton@TECHTREE_LINK: + X: 170 + Y: 0 + Width: 32 + Height: 32 + Background: tree-icon + Align: Left + LeftMargin: 0 + TooltipText: Tech Tree + TooltipContainer: LINKS_TOOLTIP_CONTAINER + Url: https://ca.oraladder.net/tech-tree + ExternalLinkButton@MODDB_LINK: + X: 204 + Y: 0 + Width: 32 + Height: 32 + Background: ladder-icon + Align: Left + LeftMargin: 0 + TooltipText: 1v1 Ladder Website + TooltipContainer: LINKS_TOOLTIP_CONTAINER + Url: https://ca.oraladder.net + TooltipContainer@LINKS_TOOLTIP_CONTAINER: Container@PLAYER_PROFILE_CONTAINER: + Logic: LoadLocalPlayerProfileLogic X: 25 Y: 25 diff --git a/mods/ca/chrome/missionbrowser.yaml b/mods/ca/chrome/missionbrowser.yaml new file mode 100644 index 0000000000..820c11a12a --- /dev/null +++ b/mods/ca/chrome/missionbrowser.yaml @@ -0,0 +1,228 @@ +Background@MISSIONBROWSER_PANEL: + Logic: MissionBrowserLogicCA + X: (WINDOW_WIDTH - WIDTH) / 2 + Y: (WINDOW_HEIGHT - HEIGHT) / 2 + Width: 700 + Height: 530 + Children: + Label@MISSIONBROWSER_TITLE: + Y: 21 + Width: PARENT_WIDTH + Height: 25 + Text: Missions + Align: Center + Font: Bold + ScrollPanel@MISSION_LIST: + X: 22 + Y: 50 + Width: 288 + Height: PARENT_HEIGHT - 107 + Children: + ScrollItem@HEADER: + Background: scrollheader + Width: PARENT_WIDTH - 27 + Height: 22 + X: 2 + Visible: false + Children: + Label@LABEL: + Font: Regular + Width: PARENT_WIDTH + Height: 20 + Align: Center + ScrollItem@TEMPLATE: + Width: PARENT_WIDTH - 27 + Height: 26 + X: 2 + TooltipContainer: TOOLTIP_CONTAINER + TooltipTemplate: BUTTON_TOOLTIP + Children: + Image@COMPLETION_ICON: + X: 4 + Y: 5 + Width: 16 + Height: 16 + ImageCollection: mission-completion-tick + ImageName: incomplete + LabelWithTooltip@TITLE: + X: 26 + Width: PARENT_WIDTH - 20 + Height: 26 + Image@COMPLETION_STAR: + X: PARENT_WIDTH - WIDTH - 2 + Y: 4 + Width: 17 + Height: 16 + ImageCollection: mission-completion-stars + ImageName: bronze + Visible: false + Container@MISSION_INFO: + X: 318 + Y: 50 + Width: 362 + Height: PARENT_HEIGHT - 110 + Children: + Background@MISSION_BG: + Width: PARENT_WIDTH + Height: 202 + Background: dialog3 + Children: + MapPreview@MISSION_PREVIEW: + X: 1 + Y: 1 + Width: PARENT_WIDTH - 2 + Height: PARENT_HEIGHT - 2 + IgnoreMouseOver: True + IgnoreMouseInput: True + ShowSpawnPoints: False + Container@MISSION_DETAIL: + Y: 212 + Width: PARENT_WIDTH + Height: 180 + Children: + ScrollPanel@MISSION_DESCRIPTION_PANEL: + Height: PARENT_HEIGHT + Width: PARENT_WIDTH + TopBottomSpacing: 5 + Children: + Label@MISSION_DESCRIPTION: + X: 4 + Width: PARENT_WIDTH - 32 + VAlign: Top + Font: Regular + ScrollPanel@MISSION_OPTIONS: + Height: PARENT_HEIGHT + Width: PARENT_WIDTH + TopBottomSpacing: 5 + Children: + Container@CHECKBOX_ROW_TEMPLATE: + Width: PARENT_WIDTH + Height: 30 + Children: + Checkbox@A: + X: 10 + Width: PARENT_WIDTH / 2 - 25 + Height: 20 + Visible: False + TooltipContainer: TOOLTIP_CONTAINER + Checkbox@B: + X: PARENT_WIDTH / 2 + 5 + Width: PARENT_WIDTH / 2 - 25 + Height: 20 + Visible: False + TooltipContainer: TOOLTIP_CONTAINER + Container@DROPDOWN_ROW_TEMPLATE: + Height: 60 + Width: PARENT_WIDTH + Children: + LabelForInput@A_DESC: + X: 10 + Width: PARENT_WIDTH / 2 - 35 + Height: 20 + Visible: False + For: A + DropDownButton@A: + X: 10 + Width: PARENT_WIDTH / 2 - 35 + Y: 25 + Height: 25 + Visible: False + TooltipContainer: TOOLTIP_CONTAINER + LabelForInput@B_DESC: + X: PARENT_WIDTH / 2 + 5 + Width: PARENT_WIDTH / 2 - 35 + Height: 20 + Visible: False + For: B + DropDownButton@B: + X: PARENT_WIDTH / 2 + 5 + Width: PARENT_WIDTH / 2 - 35 + Y: 25 + Height: 25 + Visible: False + TooltipContainer: TOOLTIP_CONTAINER + Container@MISSION_TABS: + Width: PARENT_WIDTH + Y: PARENT_HEIGHT - 50 + Children: + Button@MISSIONINFO_TAB: + Width: PARENT_WIDTH / 2 + Y: 25 + Height: 28 + Font: Bold + Text: Briefing + Button@OPTIONS_TAB: + X: PARENT_WIDTH / 2 + Width: PARENT_WIDTH / 2 + Y: 25 + Height: 28 + Font: Bold + Text: Options + Button@START_BRIEFING_VIDEO_BUTTON: + X: 20 + Y: PARENT_HEIGHT - 45 + Width: 130 + Height: 25 + Text: Watch Briefing + Font: Bold + Button@STOP_BRIEFING_VIDEO_BUTTON: + X: 20 + Y: PARENT_HEIGHT - 45 + Width: 130 + Height: 25 + Text: Stop Briefing + Font: Bold + Button@START_INFO_VIDEO_BUTTON: + X: 160 + Y: PARENT_HEIGHT - 45 + Width: 130 + Height: 25 + Text: Watch Info Video + Font: Bold + Button@STOP_INFO_VIDEO_BUTTON: + X: 160 + Y: PARENT_HEIGHT - 45 + Width: 130 + Height: 25 + Text: Stop Info Video + Font: Bold + Button@STARTGAME_BUTTON: + X: PARENT_WIDTH - 140 - 130 + Y: PARENT_HEIGHT - 45 + Width: 120 + Height: 25 + Text: Play + Font: Bold + Button@BACK_BUTTON: + X: PARENT_WIDTH - 140 + Y: PARENT_HEIGHT - 45 + Width: 120 + Height: 25 + Text: Back + Font: Bold + Key: escape + Background@MISSION_BIN: + X: 20 + Y: 50 + Width: PARENT_WIDTH - 40 + Height: PARENT_HEIGHT - 110 + Background: dialog3 + Children: + VideoPlayer@MISSION_VIDEO: + X: 1 + Y: 1 + Width: PARENT_WIDTH - 2 + Height: PARENT_HEIGHT - 2 + TooltipContainer@TOOLTIP_CONTAINER: + +Background@FULLSCREEN_PLAYER: + Width: WINDOW_WIDTH + Height: WINDOW_HEIGHT + Background: dialog5 + Visible: False + Children: + VideoPlayer@PLAYER: + X: 0 + Y: 0 + Width: WINDOW_WIDTH + Height: WINDOW_HEIGHT diff --git a/mods/ca/chrome/settings-display.yaml b/mods/ca/chrome/settings-display.yaml new file mode 100644 index 0000000000..c137bb53f7 --- /dev/null +++ b/mods/ca/chrome/settings-display.yaml @@ -0,0 +1,387 @@ +Container@DISPLAY_PANEL: + Logic: DisplaySettingsLogic + Width: PARENT_WIDTH + Height: PARENT_HEIGHT + Children: + ScrollPanel@SETTINGS_SCROLLPANEL: + Width: PARENT_WIDTH + Height: PARENT_HEIGHT + CollapseHiddenChildren: True + TopBottomSpacing: 5 + ItemSpacing: 10 + Children: + Background@PROFILE_SECTION_HEADER: + X: 5 + Width: PARENT_WIDTH - 24 - 10 + Height: 13 + Background: separator + ClickThrough: True + Children: + Label@LABEL: + Width: PARENT_WIDTH + Height: PARENT_HEIGHT + Font: TinyBold + Align: Center + Text: Profile + Container@ROW: + Width: PARENT_WIDTH - 24 + Height: 50 + Children: + Container@PLAYER_CONTAINER: + X: 10 + Width: PARENT_WIDTH / 2 - 20 + Children: + LabelForInput@PLAYER: + Width: PARENT_WIDTH + Height: 20 + Text: Player Name: + For: PLAYERNAME + TextField@PLAYERNAME: + Y: 25 + Width: PARENT_WIDTH + Height: 25 + MaxLength: 16 + Text: Name + Container@PLAYERCOLOR_CONTAINER: + X: PARENT_WIDTH / 2 + 10 + Width: PARENT_WIDTH / 2 - 20 + Children: + LabelForInput@COLOR: + Width: PARENT_WIDTH + Height: 20 + Text: Preferred Color: + For: PLAYERCOLOR + DropDownButton@PLAYERCOLOR: + Y: 25 + Width: 75 + Height: 25 + IgnoreChildMouseOver: true + PanelAlign: Right + Children: + ColorBlock@COLORBLOCK: + X: 5 + Y: 6 + Width: PARENT_WIDTH - 35 + Height: PARENT_HEIGHT - 12 + Container@SPACER: + Background@DISPLAY_SECTION_HEADER: + X: 5 + Width: PARENT_WIDTH - 24 - 10 + Height: 13 + Background: separator + ClickThrough: True + Children: + Label@LABEL: + Width: PARENT_WIDTH + Height: PARENT_HEIGHT + Font: TinyBold + Align: Center + Text: Display + Container@ROW: + Width: PARENT_WIDTH - 24 + Height: 50 + Children: + Container@BATTLEFIELD_CAMERA_DROPDOWN_CONTAINER: + X: 10 + Width: PARENT_WIDTH / 2 - 20 + Children: + Label@BATTLEFIELD_CAMERA: + Width: PARENT_WIDTH + Height: 20 + Text: Battlefield Camera: + DropDownButton@BATTLEFIELD_CAMERA_DROPDOWN: + Y: 25 + Width: PARENT_WIDTH + Height: 25 + Font: Regular + Container@TARGET_LINES_DROPDOWN_CONTAINER: + X: PARENT_WIDTH / 2 + 10 + Width: PARENT_WIDTH / 2 - 20 + Children: + Label@TARGET_LINES: + Width: PARENT_WIDTH + Height: 20 + Text: Target Lines: + DropDownButton@TARGET_LINES_DROPDOWN: + Y: 25 + Width: PARENT_WIDTH + Height: 25 + Font: Regular + Container@ROW: + Width: PARENT_WIDTH - 24 + Height: 50 + Children: + Container@UI_SCALE_DROPDOWN_CONTAINER: + X: 10 + Width: PARENT_WIDTH / 2 - 20 + Children: + LabelForInput@UI_SCALE: + Width: PARENT_WIDTH + Height: 20 + Text: UI Scale: + For: UI_SCALE_DROPDOWN + DropDownButton@UI_SCALE_DROPDOWN: + Y: 25 + Width: PARENT_WIDTH + Height: 25 + Font: Regular + Container@STATUS_BAR_DROPDOWN_CONTAINER: + X: PARENT_WIDTH / 2 + 10 + Width: PARENT_WIDTH / 2 - 20 + Children: + Label@STATUS_BARS: + Width: PARENT_WIDTH + Height: 20 + Text: Status Bars: + DropDownButton@STATUS_BAR_DROPDOWN: + Y: 25 + Width: PARENT_WIDTH + Height: 25 + Font: Regular + Container@ROW: + Width: PARENT_WIDTH - 24 + Height: 20 + Children: + Container@CURSORDOUBLE_CHECKBOX_CONTAINER: + X: 10 + Width: PARENT_WIDTH / 2 - 20 + Children: + Checkbox@CURSORDOUBLE_CHECKBOX: + Width: PARENT_WIDTH + Height: 20 + Font: Regular + Text: Increase Cursor Size + Container@PLAYER_STANCE_COLORS_CHECKBOX_CONTAINER: + X: PARENT_WIDTH / 2 + 10 + Width: PARENT_WIDTH / 2 - 20 + Children: + Checkbox@PLAYER_STANCE_COLORS_CHECKBOX: + Width: PARENT_WIDTH + Height: 20 + Font: Regular + Text: Player Relationship Colors + TooltipText: Change minimap and health bar colors based on relationship (own, enemy, ally, neutral) + TooltipContainer: SETTINGS_TOOLTIP_CONTAINER + Container@ROW: + Width: PARENT_WIDTH - 24 + Height: 20 + Children: + Container@UI_FEEDBACK_CHECKBOX_CONTAINER: + X: 10 + Width: PARENT_WIDTH / 2 - 10 + Children: + Checkbox@UI_FEEDBACK_CHECKBOX: + Width: PARENT_WIDTH + Height: 20 + Font: Regular + Text: Show UI Feedback Notifications + TooltipText: Show transient text notifications for UI events + TooltipContainer: SETTINGS_TOOLTIP_CONTAINER + Container@TRANSIENTS_CHECKBOX_CONTAINER: + X: PARENT_WIDTH / 2 + 10 + Width: PARENT_WIDTH / 2 - 20 + Children: + Checkbox@TRANSIENTS_CHECKBOX: + Width: PARENT_WIDTH + Height: 20 + Font: Regular + Text: Show Game Event Notifications + TooltipText: Show transient text notifications for game events + TooltipContainer: SETTINGS_TOOLTIP_CONTAINER + Container@ROW: + Width: PARENT_WIDTH - 24 + Height: 20 + Children: + Container@PAUSE_SHELLMAP_CHECKBOX_CONTAINER: + X: 10 + Width: PARENT_WIDTH / 2 - 10 + Children: + Checkbox@PAUSE_SHELLMAP_CHECKBOX: + Width: PARENT_WIDTH + Height: 20 + Font: Regular + Text: Pause Menu Background + Container@HIDE_REPLAY_CHAT_CHECKBOX_CONTAINER: + X: PARENT_WIDTH / 2 + 10 + Width: PARENT_WIDTH / 2 - 10 + Children: + Checkbox@HIDE_REPLAY_CHAT_CHECKBOX: + Width: PARENT_WIDTH + Height: 20 + Font: Regular + Text: Hide Chat in Replays + Container@ROW: + Width: PARENT_WIDTH - 24 + Height: 20 + Children: + Container@SELECTIONTOOLTIP_CHECKBOX_CONTAINER: + X: 10 + Width: PARENT_WIDTH / 2 - 10 + Children: + Checkbox@SELECTIONTOOLTIP_CHECKBOX: + Width: PARENT_WIDTH + Height: 20 + Font: Regular + Text: Selected Unit Tooltip + TooltipText: When a single unit/structure is selected, show info about it in bottom right corner + TooltipContainer: SETTINGS_TOOLTIP_CONTAINER + Container@IDLE_FACTORY_ALERT_CHECKBOX_CONTAINER: + X: PARENT_WIDTH / 2 + 10 + Width: PARENT_WIDTH / 2 - 10 + Children: + Checkbox@IDLE_FACTORY_ALERT_CHECKBOX: + Width: PARENT_WIDTH + Height: 20 + Font: Regular + Text: Idle Factory Alert + TooltipText: Flash production tabs and sidebar icons when a factory is idle + TooltipContainer: SETTINGS_TOOLTIP_CONTAINER + Container@SPACER: + Background@VIDEO_SECTION_HEADER: + X: 5 + Width: PARENT_WIDTH - 24 - 10 + Height: 13 + Background: separator + ClickThrough: True + Children: + Label@LABEL: + Width: PARENT_WIDTH + Height: PARENT_HEIGHT + Font: TinyBold + Align: Center + Text: Video + Container@ROW: + Width: PARENT_WIDTH - 24 + Height: 50 + Children: + Container@VIDEO_MODE_DROPDOWN_CONTAINER: + X: 10 + Width: PARENT_WIDTH / 2 - 20 + Children: + Label@VIDEO_MODE: + Width: PARENT_WIDTH + Height: 20 + Text: Video Mode: + DropDownButton@MODE_DROPDOWN: + Y: 25 + Width: PARENT_WIDTH + Height: 25 + Font: Regular + Text: Windowed + Container@WINDOW_RESOLUTION_CONTAINER: + X: PARENT_WIDTH / 2 + 10 + Width: PARENT_WIDTH / 2 - 20 + Children: + Label@WINDOW_SIZE: + Width: PARENT_WIDTH + Height: 20 + Text: Window Size: + TextField@WINDOW_WIDTH: + Y: 25 + Width: 55 + Height: 25 + MaxLength: 5 + Type: Integer + Label@X: + X: 55 + Y: 25 + Text: x + Font: Bold + Height: 25 + Width: 15 + Align: Center + TextField@WINDOW_HEIGHT: + X: 70 + Y: 25 + Width: 55 + Height: 25 + MaxLength: 5 + Type: Integer + Container@DISPLAY_SELECTION_CONTAINER: + X: PARENT_WIDTH / 2 + 10 + Width: PARENT_WIDTH / 2 - 20 + Children: + Label@DISPLAY_SELECTION_LABEL: + Width: PARENT_WIDTH + Height: 20 + Text: Select Display: + DropDownButton@DISPLAY_SELECTION_DROPDOWN: + Y: 25 + Width: PARENT_WIDTH + Height: 25 + Font: Regular + Text: Standard + Container@ROW: + Width: PARENT_WIDTH - 24 + Height: 50 + Children: + Container@FRAME_LIMIT_CHECKBOX_CONTAINER: + X: 10 + Width: PARENT_WIDTH / 2 - 20 + Children: + Checkbox@FRAME_LIMIT_CHECKBOX: + Width: PARENT_WIDTH + Height: 20 + Font: Regular + Text: Enable Frame Limiter + Container@FRAME_LIMIT_SLIDER_CONTAINER: + Width: PARENT_WIDTH / 2 - 20 + Children: + Slider@FRAME_LIMIT_SLIDER: + X: 20 + Y: 25 + Width: PARENT_WIDTH - 20 + Height: 20 + Ticks: 20 + MinimumValue: 50 + MaximumValue: 240 + Container@VSYNC_CHECKBOX_CONTAINER: + X: PARENT_WIDTH / 2 + 10 + Width: PARENT_WIDTH / 2 - 20 + Children: + Checkbox@VSYNC_CHECKBOX: + Width: PARENT_WIDTH + Height: 20 + Font: Regular + Text: Enable VSync + Container@FRAME_LIMIT_GAMESPEED_CHECKBOX_CONTAINER: + X: PARENT_WIDTH / 2 + 10 + Y: 25 + Width: PARENT_WIDTH / 2 - 20 + Children: + Checkbox@FRAME_LIMIT_GAMESPEED_CHECKBOX: + Width: PARENT_WIDTH + Height: 20 + Font: Regular + Text: Limit framerate to game tick rate + Container@ROW: + Width: PARENT_WIDTH - 24 + Height: 50 + Children: + Container@GL_PROFILE_DROPDOWN_CONTAINER: + X: 10 + Width: PARENT_WIDTH / 2 - 20 + Children: + Label@GL_PROFILE: + Width: PARENT_WIDTH + Height: 20 + Text: OpenGL Profile: + DropDownButton@GL_PROFILE_DROPDOWN: + Y: 25 + Width: PARENT_WIDTH + Height: 25 + Font: Regular + Container@ROW: + Width: PARENT_WIDTH - 24 + Height: 30 + Children: + Container@RESTART_REQUIRED_CONTAINER: + X: 10 + Width: PARENT_WIDTH - 20 + Children: + Label@VIDEO_RESTART_REQUIRED_DESC: + Width: PARENT_WIDTH + Height: 20 + Font: Tiny + Text: Display and OpenGL changes require restart + Align: Center diff --git a/mods/ca/chrome/tooltips.yaml b/mods/ca/chrome/tooltips.yaml new file mode 100644 index 0000000000..943b3ef8f9 --- /dev/null +++ b/mods/ca/chrome/tooltips.yaml @@ -0,0 +1,427 @@ +Background@SIMPLE_TOOLTIP: + Logic: SimpleTooltipLogic + Background: dialog4 + Height: 32 + Children: + Container@LINE_HEIGHT: + Y: 3 + Height: 19 + Label@LABEL: + X: 7 + Y: -1 + Height: 23 + Font: Bold + +Background@SIMPLE_TOOLTIP_WITH_DESC: + Logic: SimpleTooltipWithDescLogic + Background: dialog4 + Height: 26 + Children: + Label@LABEL: + X: 5 + Y: 1 + Height: 23 + Font: Bold + Label@DESC: + X: 5 + Y: 26 + Height: 12 + Font: TinyBold + VAlign: Top + +Background@BUTTON_TOOLTIP: + Logic: ButtonTooltipLogic + Background: dialog4 + Height: 29 + Children: + Label@LABEL: + X: 7 + Y: 3 + Height: 23 + Font: Bold + Label@HOTKEY: + Visible: false + Y: 2 + Height: 23 + TextColor: FFFF00 + Font: Bold + Label@DESC: + X: 7 + Y: 28 + Height: 12 + Font: Small + VAlign: Top + +Background@BUTTON_WITH_DESC_HIGHLIGHT_TOOLTIP: + Logic: ButtonTooltipLogic + Background: dialog4 + Height: 29 + Children: + Label@LABEL: + X: 7 + Y: 3 + Height: 23 + Font: Bold + Label@HOTKEY: + Y: 3 + Visible: false + TextColor: FFFF00 + Height: 23 + Font: Bold + LabelWithHighlight@DESC: + X: 7 + Y: 27 + Height: 12 + Font: TinyBold + VAlign: Top + +Background@WORLD_TOOLTIP: + Logic: WorldTooltipLogic + Background: dialog4 + Children: + Container@SINGLE_HEIGHT: + Height: 29 + Container@DOUBLE_HEIGHT: + Height: 50 + Label@LABEL: + X: 7 + Y: 2 + Height: 23 + Font: Bold + Image@FLAG: + X: 7 + Y: 27 + Width: 32 + Height: 16 + Label@OWNER: + X: 45 + Y: 23 + Height: 23 + Font: Bold + Shadow: True + Label@EXTRA: + X: 7 + Y: 51 + Height: 5 + Font: Regular + +Background@SPAWN_TOOLTIP: + Logic: SpawnSelectorTooltipLogic + Background: dialog4 + Width: 7 + Children: + Container@SINGLE_HEIGHT: + Height: 29 + Container@DOUBLE_HEIGHT: + Height: 44 + Label@LABEL: + Y: 3 + Height: 23 + Font: Bold + Image@FLAG: + X: 7 + Y: 7 + Width: 32 + Height: 16 + Label@TEAM: + Y: 24 + Height: 15 + Font: TinyBold + Align: center + +Background@LATENCY_TOOLTIP: + Logic: LatencyTooltipLogic + Background: dialog4 + Height: 29 + Width: 7 + Children: + Label@LATENCY_PREFIX: + X: 7 + Y: 3 + Height: 26 + Font: Bold + Text: Latency: + Label@LATENCY: + Y: 3 + Height: 26 + Font: Bold + +Background@BOT_TOOLTIP: + Logic: BotTooltipLogic + Background: dialog4 + Height: 30 + Width: 300 + Children: + Label@NAME: + X: 7 + Y: 2 + Text: label-bot-player-tooltip-name + Width: 290 + Height: 24 + Font: Bold + +Background@ANONYMOUS_PLAYER_TOOLTIP: + Logic: AnonymousProfileTooltipLogic + Background: dialog4 + Height: 30 + Width: 200 + Children: + Label@NAME: + X: 7 + Y: 2 + Text: Anonymous Player + Height: 24 + Font: MediumBold + Label@LOCATION: + X: 7 + Y: 25 + Height: 12 + Visible: False + Font: TinyBold + Label@IP: + X: 7 + Y: 25 + Height: 12 + Visible: False + Font: TinyBold + Container@GAME_ADMIN: + X: 7 + Y: 25 + Height: 12 + Visible: False + Children: + Image@ICON: + X: 1 + Y: 4 + Width: 7 + Height: 5 + ImageCollection: lobby-bits + ImageName: admin + Label@LABEL: + X: 10 + Height: 12 + Text: Game Admin + Font: TinyBold + +Background@REGISTERED_PLAYER_TOOLTIP: + Logic: RegisteredProfileTooltipLogic + Width: 270 + Background: dialog4 + Children: + Container@HEADER: + Width: PARENT_WIDTH + Children: + Container@PROFILE_HEADER: + Height: 43 + Children: + Label@PROFILE_NAME: + X: 7 + Y: 2 + Width: PARENT_WIDTH - 20 + Height: 24 + Font: MediumBold + Label@PROFILE_RANK: + X: 7 + Y: 24 + Width: PARENT_WIDTH - 20 + Height: 12 + Font: TinyBold + Container@GAME_ADMIN: + X: 7 + Y: 36 + Width: PARENT_WIDTH - 20 + Height: 12 + Visible: False + Children: + Image@ICON: + Y: 5 + Width: 7 + Height: 5 + ImageCollection: lobby-bits + ImageName: admin + Label@LABEL: + X: 10 + Y: 1 + Width: 200 + Height: 12 + Text: Game Admin + Font: TinyBold + Container@MESSAGE_HEADER: + Height: 26 + Width: PARENT_WIDTH + Children: + Label@MESSAGE: + X: 7 + Width: PARENT_WIDTH - 14 + Height: 23 + Font: Bold + Container@BADGES_CONTAINER: + Width: PARENT_WIDTH + Visible: false + Children: + Background@SEPARATOR: + X: 10 + Height: 1 + Background: tooltip-separator + +Background@PRODUCTION_TOOLTIP: + Logic: ProductionTooltipLogicCA + Background: dialog4 + Width: 200 + Height: 65 + Children: + Label@NAME: + X: 7 + Y: 3 + Height: 23 + Font: Bold + Label@HOTKEY: + Visible: false + Y: 3 + Height: 23 + TextColor: FFFF00 + Font: Bold + Label@REQUIRES: + X: 7 + Y: 26 + Height: 15 + Font: TinyBold + Text: Requires {0} + Label@DESC: + X: 7 + Y: 27 + Height: 2 + Font: TinyBold + VAlign: Top + Label@STRENGTHS: + X: 7 + Y: 29 + Height: 2 + Font: TinyBold + VAlign: Top + TextColor: 33DD33 + Label@WEAKNESSES: + X: 7 + Y: 30 + Height: 2 + Font: TinyBold + VAlign: Top + TextColor: EE5555 + Label@ATTRIBUTES: + X: 7 + Y: 31 + Height: 2 + Font: TinyBold + VAlign: Top + TextColor: FFFF00 + Image@COST_ICON: + Y: 5 + Width: 16 + Height: 16 + ImageCollection: sidebar-bits + ImageName: production-tooltip-cost + Label@COST: + Y: 1 + Height: 23 + Font: Bold + Image@TIME_ICON: + X: 3 + Y: 26 + Width: 16 + Height: 16 + ImageCollection: sidebar-bits + ImageName: production-tooltip-time + Label@TIME: + Y: 22 + Height: 23 + Font: Bold + Image@POWER_ICON: + Y: 46 + Width: 16 + Height: 16 + ImageCollection: sidebar-bits + ImageName: production-tooltip-power + Label@POWER: + Y: 42 + Height: 23 + Font: Bold + Image@ARMORTYPE_ICON: + Y: 46 + Width: 16 + Height: 16 + ImageCollection: sidebar-bits + ImageName: production-tooltip-armor + Label@ARMORTYPE: + Y: 42 + Height: 16 + Font: Bold + +Background@SUPPORT_POWER_TOOLTIP: + Logic: SupportPowerTooltipLogicCA + Background: dialog4 + Width: 300 + Height: 32 + Children: + Label@NAME: + X: 7 + Y: 4 + Height: 20 + Font: Bold + Label@HOTKEY: + Visible: false + Y: 4 + Height: 20 + TextColor: FFFF00 + Font: Bold + Label@TIME: + Y: 10 + Font: TinyBold + VAlign: Top + Label@DESC: + X: 7 + Y: 28 + Width: 286 + Font: TinyBold + VAlign: Top + Label@COST: + X: 5 + Y: 8 + Font: TinyBold + VAlign: Top + Text: $ + +Background@ARMY_TOOLTIP: + Logic: ArmyTooltipLogicCA + Background: dialog4 + Width: 200 + Height: 65 + Children: + Label@NAME: + X: 7 + Y: 3 + Height: 23 + Font: Bold + Label@DESC: + X: 7 + Y: 27 + Height: 2 + Font: TinyBold + VAlign: Top + +Background@ARMY_VALUE_TOOLTIP: + Logic: ArmyValueTooltipLogic + Background: dialog4 + Width: 200 + Height: 65 + Children: + Label@NAME: + X: 7 + Y: 3 + Height: 23 + Font: Bold + Label@DESC: + X: 7 + Y: 27 + Height: 2 + Font: Small + VAlign: Top diff --git a/mods/ca/cursors.yaml b/mods/ca/cursors.yaml index a32e8eb955..d2965bfca5 100644 --- a/mods/ca/cursors.yaml +++ b/mods/ca/cursors.yaml @@ -113,6 +113,9 @@ Cursors: Length: 1 enter-blocked-minimap: Start: 33 + enter-multi: + Start: 277 + Length: 3 c4: Start: 116 Length: 3 @@ -218,6 +221,13 @@ Cursors: ioncannon-blocked: Start: 21 Length: 8 + press: + Start: 268 + X: -12 + Y: -12 + ability2: + Start: 269 + Length: 8 nopower.shp: cursor powerdown-blocked: Start: 0 @@ -250,3 +260,17 @@ Cursors: minecursor: Start: 0 Length: 4 + scrinmouse.shp: scrincursor + mc-deploy: + Start: 0 + Length: 9 + mc-capture: + Start: 9 + Length: 8 + upgradecursor.shp: cursor + upgrade: + Start: 0 + Length: 3 + upgrade-blocked: + Start: 3 + Length: 1 diff --git a/mods/ca/fluent/ca.ftl b/mods/ca/fluent/ca.ftl new file mode 100644 index 0000000000..c3a80d1280 --- /dev/null +++ b/mods/ca/fluent/ca.ftl @@ -0,0 +1,25 @@ +## Metadata +mod-title = Combined Arms +mod-windowtitle = OpenRA Combined Arms + +## Debug Commands +description-squadpaths-debug-overlay = Toggles visualization of AI squad pathfinding routes + +## Bots +bot-easy-ai = + .name = Easy AI + +bot-normal-ai = + .name = Normal AI + +bot-hard-ai = + .name = Hard AI + +bot-vhard-ai = + .name = Very Hard AI + +bot-brutal-ai = + .name = Brutal AI + +bot-naval-ai = + .name = Naval AI diff --git a/mods/ca/fluent/chrome.ftl b/mods/ca/fluent/chrome.ftl new file mode 100644 index 0000000000..ed65f866d5 --- /dev/null +++ b/mods/ca/fluent/chrome.ftl @@ -0,0 +1,171 @@ +## Player ranks +label-player-level = Current rank: { $level } +label-player-level-current-xp = Current XP: { $currentXp } +label-player-level-required-xp = Next rank XP: { $nextLevelXp } + +label-player-influence-level = Influence level: { $level } +label-player-influence-level-time = Next level in { $time } +label-player-influence-coalition = Coalition: { $coalition } +label-player-influence-policy = Policy: { $policy } + +label-covenant-level = Covenant level: { $level } +label-covenant-description = Gained by destroying enemy harvesters, + or by destroying/capturing/infiltrating enemy buildings. + +## ObserverStatsLogic +options-observer-stats = + .none = Information: None + .basic = Basic + .economy = Economy + .production = Production + .support-powers = Support Powers + .combat = Combat + .army = Army + .upgrades = Upgrades + .build-order = Build Order + .units-produced = Units Produced + .earnings-graph = Earnings (graph) + .army-graph = Army Value (graph) + .team-army-graph = Team Value (graph) + +## chrome/gamesave-loading.yaml +label-gamesave-loading-screen-loadtime-line1 = Sorry for the long load times, this is due to how the OpenRA engine handles saved games. +label-gamesave-loading-screen-loadtime-line2 = It replays the game from the beginning as fast as possible (so a longer game = longer time to load). + +## chrome/ingame-player.yaml +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 + - Helicopters will land at the target location + - Chrono Tanks will teleport towards 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 + - Default activity for the target is suppressed + - Allows targeting of own or ally forces + - Long-range artillery units will always target the + location, ignoring units and buildings + + 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 + - Minelayers will deploy a mine + - 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-beacon-tooltip = Place Beacon +button-top-buttons-sell-tooltip = Sell +button-top-buttons-power-tooltip = Power Down +button-top-buttons-repair-tooltip = Repair + +## SupportPowerTimerWidget +support-power-timer = { $support-power }: { $time } + +supportpowers-support-powers-palette = + .ready = READY + .hold = ON HOLD + +## IngameMenuLogic +menu-ingame = + .leave = Leave + .abort = Abort Mission + .restart = Restart + .surrender = Surrender + .load-game = Load Game + .save-game = Save Game + .music = Music + .settings = Settings + .return-to-map = Return to map + .resume = Resume + .save-map = Save Map + .exit-map = Exit Map Editor + .encyclopedia = Encyclopedia diff --git a/mods/ca/fluent/encyclopedia.ftl b/mods/ca/fluent/encyclopedia.ftl new file mode 100644 index 0000000000..8e1db5d173 --- /dev/null +++ b/mods/ca/fluent/encyclopedia.ftl @@ -0,0 +1,41 @@ +encyclopedia-tips-general-description = • Most infantry prone when they are fired upon, which makes them move more slowly but makes them take 50% less damage. + + • Primary anti-aircraft vehicles (IFV, BTR, Vulcan, Stealth Tank and Gun/Shard Walker) and static anti-aircraft defenses take 50% damage from aircraft. + + • Primary anti-aircraft units and aircraft with air-to-air capability will prioritize firing at aircraft when auto targeting or attack moving. + + • Most anti-air weapons will deal splash damage in a large radius. This is to increase the diminishing returns of massing aircraft. + + • When low power all production is reduced to half speed. + + • Units will only move to attack in Attack Anything stance. + + • Cloaked units can be detected by any adjacent infantry, as well as by scout units and certain other detectors. + + • Helipads/Airfields will repair landed aircraft if they are close to a Service Depot (or its equivalents). + + • Many units have abilities that can be used via the deploy key (F by default). + + • You can control the direction of most reinforcement/airstrike support powers by dragging the mouse. + + • The "Competitive" production type is designed to reduce the effectiveness of tier 1 spam. Each production structure has its own queue, but additional production structures of each type initially cost significantly more than the first, and the cost can then be reduced by building a Radar or Service Depot, and further reduced by building a Tech Center or Allied HQ. + + • Transports can be mass loaded using Alt-click. It will cause all selected units to fill the closest transports of the type that was clicked on. + + • Upgrades with an yellow-orange border are sidegrades, meaning they have negative as well as positive effects. + + • Upgrades with a "beaker" icon in the top right do not affect existing units, which either need to be upgraded via a Service Depot (or equivalent), or cannot be upgraded. + + • Mines and explosives attached to buildings (C4, TNT) can be disarmed by Engineers/Assimilators. + + • Bridges can be repaired by Engineers/Assimilators (they are not consumed in the process). + + • Structures that provide support powers, advanced defences, and the Radar Dome (or its equivalents) can be powered down using the power down key (X by default) or using the button in the top right. + + • Neutral structures can be captured by Engineers/Assumilators even after they have been destroyed. + + • Service Depot repairs are completely free. Vehicles can be sold while being repaired. + + • All production times are proportional to cost. The cost to time ratio is lower for Refineries, MCVs and higher for upgrades. + + • In Single Queue the maximum production speed is 2x, which requires 5 infantry/aircraft production structures, or 4 vehicle/building production structures. diff --git a/mods/ca/fluent/factions.ftl b/mods/ca/fluent/factions.ftl new file mode 100644 index 0000000000..86eb449d70 --- /dev/null +++ b/mods/ca/fluent/factions.ftl @@ -0,0 +1,413 @@ +## Factions +faction-england = + .name = England + .description = England: Subterfuge + Units: + • Sniper + • Mirage Tank (replaces Scout Tank) + • Camo Pillbox (replaces Pillbox) + + Powers: + • Veil of War + + Upgrades: + • Raufoss Ammo + + Bonuses: + • Fake Buildings + +faction-france = + .name = France + .description = France: Fortification + Units: + • Battle Fortress + • Grand Cannon (replaces Prism Tower) + + Powers: + • Cluster Mines + + Upgrades: + • Entrenchment + + Bonuses: + • Walls & Defenses (10% discount) + +faction-germany = + .name = Germany + .description = Germany: Innovation + Units: + • Chrono Prison + • Tank Destroyer + + Powers: + • Temporal Incursion + • Time Warp + + Upgrades: + • Temporal Flux + + Bonuses: + • Chrono Tanks (10% discount) + • Chronosphere (20% discount) + +faction-usa = + .name = USA + .description = USA: Airborne Forces + Units: + • SEAL + • Nighthawk (replaces Chinook) + • Guardian GI (via Airdrop) + • Grizzly Tank (via Airdrop) + + Powers: + • Strafing Run + + Upgrades: + • Advanced Airborne Training + + Bonuses: + • Airdrop Units + +faction-russia = + .name = Russia + .description = Russia: Tesla Techology + Units: + • Tesla Tank + • Tesla Reactor (replaces Advanced Power Plant) + + Powers: + • Storm Troopers + • Parabombs + + Upgrades: + • Tesla Arcing + + Bonuses: + • Tesla Coil (10% discount) + • Free Tesla Trooper Upgrade + • Kirov Tesla Bombs + +faction-ukraine = + .name = Ukraine + .description = Ukraine: Demolition + Units: + • V3 Launcher + • Siege Tank (replaces V2) + • Crazy Ivan (replaces Grenadier) + + Powers: + • Carpet Bomb + • Paratroopers + + Upgrades: + • Seismic Missiles + + Bonuses: + • Terror Dog (20% discount) + • Kirov Cluster Bombs + +faction-iraq = + .name = Iraq + .description = Iraq: Nuclear Warfare + Units: + • Rad Trooper (replaces Shock Trooper) + • Chem Tower (replaces Flame Tower) + + Powers: + • A-Bomb + • Paratroopers + + Upgrades: + • Desolator (replaces Rad Trooper) + • Eradicator (replaces Mammoth Tank) + + Bonuses: + • Heavy Hazmat Suits equipped as standard + • Missile Silo (40% discount) + • Kirov Atom Bombs + +faction-yuri = + .name = Psi-Corps + .description = Psychic Corps: Mind Control & Genetics + Units: + • Brute + • Floating Disc (replaces Kirov) + • Chaos Drone (replaces MAD Tank) + • Yuri (replaces Boris) + + Powers: + • Genetic Mutation Bomb + • Chaos Bombs + + Upgrades: + • Lasher Tank + • Gattling BTR + +faction-talon = + .name = Talon + .description = Steel Talon: Mech Warfare + Units: + • Wolverine + • Juggernaut + • Titan (replaces Mammoth Tank) + + Powers: + • X-O Drop + + Upgrades: + • Railgun Titan (replaces Titan) + • Gyro Stabilizers + + Bonuses: + • Tech Center (10% discount) + • Upgrade Center (20% discount) + +faction-zocom = + .name = ZOCOM + .description = ZOCOM: Experimental Weapons + Units: + • X-O Powersuit + • Disruptor + • Sonic Tower (replaces Advanced Guard Tower) + + Powers: + • Drop Pods + • Surgical Strike + + Upgrades: + • Ion Mammoth (replaces Mammoth Tank) + • Sonic Amplifiers + + Bonuses: + • Adv. Communication Center (40% discount) + • Hazmat Suits equipped as standard + +faction-eagle = + .name = Eagle + .description = Eagle Corps: Rapid Reaction Force + Units: + • Pitbull + • Aurora + • Hover MLRS (replaces MLRS) + + Powers: + • Reinforcements + + Upgrades: + • Hover Mammoth (replaces Mammoth Tank) + • Afterburners + + Bonuses: + • Aircraft (10% discount) + +faction-arc = + .name = ARC + .description = Advanced Robotics Command: Robotics + Units: + • Mini Drone + • Jackknife + • Guardian Drone (replaces Hum-Vee) + + Powers: + • Nanite Repair + + Upgrades: + • Mammoth Drone (replaces Mammoth Tank) + • Battle Drone (replaces Battle Tank) + + Bonuses: + • Recon Drone (-20% cooldown) + • Mobile Sensor Array (20% discount) + • Drone Carrier (10% discount) + • Additional Comms. Centers (50% discount) + • Comms. Center emergency backup power + +faction-blackh = + .name = Black Hand + .description = Black Hand: Flame Weaponry + Units: + • Black Hand Trooper + • Heavy Flame Tank (replaces Flame Tank) + + Powers: + • Inferno Bomb + • Heavy Flame Tank Drop + + Upgrades: + • Black Napalm + + Bonuses: + • SSM (10% discount) + • Free Howitzer Upgrade + +faction-marked = + .name = Marked + .description = Marked of Kane: Alien Weaponry + Units: + • Acolyte/Templar + • Venom (replaces Apache) + + Powers: + • Frenzy + • Subterranean Strike + + Upgrades: + • Quantum Capacitors + + Bonuses: + • Banshee (10% discount) + • Temple Prime (10% discount) + +faction-legion = + .name = Legion + .description = Legion: Stolen Technology + Units: + • Microwave Tank + • APC + • Battle Tank (replaces Light Tank) + + Powers: + • Cash Hack + • Technology Hack + + Upgrades: + • Intensified Microwaves + + Bonuses: + • Stolen Technology Units (10% discount) + • Hack Satellite (-33% cooldown) + +faction-shadow = + .name = Shadow + .description = Shadow Sect: Stealth Technology + Units: + • Mobile Stealth Generator + • Spectre (replaces SSM) + + Powers: + • Shadow Team + • Stealth Tank Drop + + Upgrades: + • Heavy Stealth Tank + + Bonuses: + • Comanche (10% discount) + • Stealth Generator (+4 passive range, remains cloaked during Tiberium Stealth) + +faction-reaper = + .name = Reaper-17 + .description = Reaper-17: Frontal Assault + Units: + • Stormcrawler + • Reaper Tripod (replaces Annihilator Tripod) + + Powers: + • Storm Spike + + Upgrades: + • Shard Walker + + Bonuses: + • Devourer (10% discount) + • Ichor Seed (-20% cooldown) + +faction-traveler = + .name = Traveler-59 + .description = Traveler-59: Fast Attack + Units: + • Enervator + • Lacerator (replaces Seeker) + + Powers: + • Ion Surge + + Upgrades: + • Advanced Articulators + + Bonuses: + • Fast Walkers (+15% Speed) + +faction-harbinger = + .name = Harbinger-31 + .description = Harbinger-31: Heavy Weapons + Units: + • Obliterator + • Marauder (replaces Intruder) + + Powers: + • Buzzer Swarm + + Upgrades: + • Stellar Fusion Cannon + + Bonuses: + • Devastator Warship (10% discount) + • Mothership (10% discount) + +faction-collector = + .name = Collector-73 + .description = Collector-73: Leeching & Degeneration + Units: + • Atomizer + • Leecher (replaces Corrupter) + + Powers: + • Greater Coalescence + + Upgrades: + • Coalescence + + Bonuses: + • Field Manipulator (20% discount) + • Suppression Field (-15% cooldown, +10% duration) + +faction-randomallies = + .name = Allies + .description = Random Allied Faction + A random Allied faction will be chosen when the game starts. + +faction-randomsoviet = + .name = Soviet + .description = Random Soviet Faction + A random Soviet faction will be chosen when the game starts. + +faction-randomgdi = + .name = GDI + .description = Random GDI Faction + A random GDI faction will be chosen when the game starts. + +faction-randomnod = + .name = Nod + .description = Random Nod Faction + A random Nod faction will be chosen when the game starts. + +faction-randomscrin = + .name = Scrin + .description = Random Scrin Faction + A random Scrin faction will be chosen when the game starts. + +faction-random = + .name = Any + .description = Random Faction + A random faction will be chosen when the game starts. + +faction-allies = + .name = Allies + .description = Allies + +faction-soviet = + .name = Soviet + .description = Soviet + +faction-gdi = + .name = GDI + .description = GDI + +faction-nod = + .name = Nod + .description = Nod + +faction-scrin = + .name = Scrin + .description = Scrin \ No newline at end of file diff --git a/mods/ca/fluent/hotkeys.ftl b/mods/ca/fluent/hotkeys.ftl new file mode 100644 index 0000000000..4c15ab616d --- /dev/null +++ b/mods/ca/fluent/hotkeys.ftl @@ -0,0 +1,16 @@ +hotkey-description-nextproductiontab = Next tab +hotkey-description-previousproductiontab = Previous tab +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 +hotkey-description-productiontypeupgrade = Upgrades Tab +hotkey-description-powerdown = Power-down mode +hotkey-description-upgrade = Upgrade mode + +hotkey-description-supportpower07 = Slot 07 +hotkey-description-supportpower08 = Slot 08 +hotkey-description-supportpower09 = Slot 09 +hotkey-description-supportpower10 = Slot 10 diff --git a/mods/ca/fluent/options.ftl b/mods/ca/fluent/options.ftl new file mode 100644 index 0000000000..f7bf4db389 --- /dev/null +++ b/mods/ca/fluent/options.ftl @@ -0,0 +1,61 @@ +## Player options +options-tech-level = + .infantry-only = Infantry Only + .low = Low + .medium = Medium + .high = High • Superweapons Off + .unrestricted = High • Superweapons On + +checkbox-kill-bounties = + .label = Kill Bounties + .description = Players receive cash bonuses when killing enemy units + +checkbox-redeployable-mcvs = + .label = Redeployable MCVs + .description = Allow undeploying Construction Yard + +checkbox-force-shield = + .label = Force Shield + .description = Grants all factions the Force Shield support power + +checkbox-naval-units = + .label = Naval Units + .description = Enables naval units + +checkbox-reveal-on-fire = + .label = Reveal on Fire + .description = Units reveal themselves when firing + +checkbox-balanced-harvesting = + .label = Balanced Harvesting + .description = Enables dynamic harvester speed to account for the direction of resources relative to refineries + +checkbox-fast-regrowth = + .label = Fast Regrowth + .description = Resources regrow at a faster rate + +dropdown-queuetype = + .label = Production Type + .description = Single-Queue:\n • TD / RA1 / TS / RA2 style\n • One queue per production type\n • Units created at primary building\n\nMulti-Queue:\n • C&C3 / RA3 style\n • One queue per production structure\n • Upgrades remain single-queue\n\nCompetitive:\n • Multi-Queue for units\n • Single-Queue for structures & upgrades\n • Multiple production structures of the same type have increased cost,\n which is reduced after building radar/tech center + +options-queuetype = + .singlequeue = Single-Queue + .multiqueuefull = Multi-Queue + .multiqueuescaled = Competitive + +## World options +options-starting-units = + .mcv-only = MCV Only + .light-support = Light Support + .heavy-support = Heavy Support + +dropdown-difficulty = + .label = Difficulty + .description = The difficulty of the mission + +options-difficulty = + .easy = Easy + .normal = Normal + .hard = Hard + .vhard = Very Hard + .brutal = Brutal diff --git a/mods/ca/fluent/powers.ftl b/mods/ca/fluent/powers.ftl new file mode 100644 index 0000000000..6074078f37 --- /dev/null +++ b/mods/ca/fluent/powers.ftl @@ -0,0 +1,8 @@ +supportpower-ironcurtain = + .name = Iron Curtain + .desc = Makes up to 5 selected vehicles or structures + temporarily immune to damage. + + Affected units have limited movement speed. + + Warning: Harmful to infantry. diff --git a/mods/ca/fluent/rules.ftl b/mods/ca/fluent/rules.ftl new file mode 100644 index 0000000000..9a4699b480 --- /dev/null +++ b/mods/ca/fluent/rules.ftl @@ -0,0 +1,4 @@ +## vehicles.yaml +actor-v2rl = + .name = V2 Rocket Launcher + .description = Long-range rocket artillery with low rate of fire. diff --git a/mods/ca/hotkeys.yaml b/mods/ca/hotkeys.yaml deleted file mode 100644 index d10addb9af..0000000000 --- a/mods/ca/hotkeys.yaml +++ /dev/null @@ -1,31 +0,0 @@ -ProductionTypeBuilding: E - Description: Building Tab - Types: Production, Player - -ProductionTypeDefense: R - Description: Defense Tab - Types: Production, Player - -ProductionTypeInfantry: T - Description: Infantry Tab - Types: Production, Player - -ProductionTypeVehicle: Y - Description: Vehicle Tab - Types: Production, Player - -ProductionTypeAircraft: U - Description: Aircraft Tab - Types: Production, Player - -ProductionTypeNaval: I - Description: Naval Tab - Types: Production, Player - -ProductionTypeUpgrade: O - Description: Upgrade Tab - Types: Production, Player - -PowerDown: X - Description: Power-down mode - Types: OrderGenerator, Player diff --git a/mods/ca/hotkeys/ca.yaml b/mods/ca/hotkeys/ca.yaml new file mode 100644 index 0000000000..3425570700 --- /dev/null +++ b/mods/ca/hotkeys/ca.yaml @@ -0,0 +1,74 @@ +NextProductionTab: PAGEDOWN + Description: hotkey-description-nextproductiontab + Types: Production + Contexts: player + +PreviousProductionTab: PAGEUP + Description: hotkey-description-previousproductiontab + Types: Production + Contexts: player + +ProductionTypeBuilding: E + Description: hotkey-description-productiontypebuilding + Types: Production + Contexts: player + +ProductionTypeDefense: R + Description: hotkey-description-productiontypedefense + Types: Production + Contexts: player + +ProductionTypeInfantry: T + Description: hotkey-description-productiontypeinfantry + Types: Production + Contexts: player + +ProductionTypeVehicle: Y + Description: hotkey-description-productiontypevehicle + Types: Production + Contexts: player + +ProductionTypeAircraft: U + Description: hotkey-description-productiontypeaircraft + Types: Production + Contexts: player + +ProductionTypeNaval: I + Description: hotkey-description-productiontypenaval + Types: Production + Contexts: player + +ProductionTypeUpgrade: O + Description: hotkey-description-productiontypeupgrade + Types: Production + Contexts: player + +PowerDown: X + Description: hotkey-description-powerdown + Types: OrderGenerator + Contexts: player + +Upgrade: V + Description: hotkey-description-upgrade + Types: OrderGenerator + Contexts: player + +SupportPower07: + Description: hotkey-description-supportpower07 + Types: SupportPower + Contexts: player + +SupportPower08: + Description: hotkey-description-supportpower08 + Types: SupportPower + Contexts: player + +SupportPower09: + Description: hotkey-description-supportpower09 + Types: SupportPower + Contexts: player + +SupportPower10: + Description: hotkey-description-supportpower10 + Types: SupportPower + Contexts: player diff --git a/mods/ca/icon-2x.png b/mods/ca/icon-2x.png index 61efe68419..595535045f 100644 Binary files a/mods/ca/icon-2x.png and b/mods/ca/icon-2x.png differ diff --git a/mods/ca/icon-3x.png b/mods/ca/icon-3x.png index cd36a71a28..610a9dc263 100644 Binary files a/mods/ca/icon-3x.png and b/mods/ca/icon-3x.png differ diff --git a/mods/ca/icon.png b/mods/ca/icon.png index 220da01e3b..5ee3de33a0 100644 Binary files a/mods/ca/icon.png and b/mods/ca/icon.png differ diff --git a/mods/ca/installer/aftermath.yaml b/mods/ca/installer/aftermath.yaml deleted file mode 100644 index 62483f5b23..0000000000 --- a/mods/ca/installer/aftermath.yaml +++ /dev/null @@ -1,230 +0,0 @@ -aftermath: Aftermath Expansion Disc (English) - IDFiles: - README.TXT: 9902fb74c019df1b76ff5634e68f0371d790b5e0 - SETUP/INSTALL/PATCH.RTP: 5bce93f834f9322ddaa7233242e5b6c7fea0bf17 - Install: - extract-raw: SETUP/INSTALL/PATCH.RTP - ^SupportDir|Content/ca/expand/expand2.mix: - Offset: 4712984 - Length: 469922 - ^SupportDir|Content/ca/expand/hires1.mix: - Offset: 5182981 - Length: 90264 - ^SupportDir|Content/ca/expand/lores1.mix: - Offset: 5273320 - Length: 57076 - extract-raw: MAIN.MIX - ^SupportDir|Content/ca/expand/await.aud: - Offset: 158698809 - Length: 2972788 - ^SupportDir|Content/ca/expand/bog.aud: - Offset: 244351833 - Length: 2386955 - ^SupportDir|Content/ca/expand/float_v2.aud: - Offset: 246738788 - Length: 3090115 - ^SupportDir|Content/ca/expand/gloom.aud: - Offset: 249828903 - Length: 2662851 - ^SupportDir|Content/ca/expand/grndwire.aud: - Offset: 252491754 - Length: 2573611 - ^SupportDir|Content/ca/expand/rpt.aud: - Offset: 255065365 - Length: 3092259 - ^SupportDir|Content/ca/expand/search.aud: - Offset: 258157624 - Length: 3104091 - ^SupportDir|Content/ca/expand/traction.aud: - Offset: 261261715 - Length: 2668003 - ^SupportDir|Content/ca/expand/wastelnd.aud: - Offset: 263929718 - Length: 2721563 - ^SupportDir|Content/ca/expand/chrotnk1.aud: - Offset: 267714446 - Length: 22900 - ^SupportDir|Content/ca/expand/fixit1.aud: - Offset: 267959424 - Length: 10707 - ^SupportDir|Content/ca/expand/jburn1.aud: - Offset: 268105462 - Length: 23091 - ^SupportDir|Content/ca/expand/jchrge1.aud: - Offset: 268128553 - Length: 14219 - ^SupportDir|Content/ca/expand/jcrisp1.aud: - Offset: 268142772 - Length: 18211 - ^SupportDir|Content/ca/expand/jdance1.aud: - Offset: 268160983 - Length: 14315 - ^SupportDir|Content/ca/expand/jjuice1.aud: - Offset: 268175298 - Length: 9699 - ^SupportDir|Content/ca/expand/jjump1.aud: - Offset: 268184997 - Length: 8219 - ^SupportDir|Content/ca/expand/jlight1.aud: - Offset: 268193216 - Length: 9875 - ^SupportDir|Content/ca/expand/jpower1.aud: - Offset: 268203091 - Length: 13571 - ^SupportDir|Content/ca/expand/jshock1.aud: - Offset: 268216662 - Length: 14771 - ^SupportDir|Content/ca/expand/jyes1.aud: - Offset: 268231433 - Length: 13795 - ^SupportDir|Content/ca/expand/madchrg2.aud: - Offset: 268361344 - Length: 19782 - ^SupportDir|Content/ca/expand/madexplo.aud: - Offset: 268381126 - Length: 26572 - ^SupportDir|Content/ca/expand/mboss1.aud: - Offset: 268413174 - Length: 20147 - ^SupportDir|Content/ca/expand/mhear1.aud: - Offset: 268438509 - Length: 6714 - ^SupportDir|Content/ca/expand/mhotdig1.aud: - Offset: 268445223 - Length: 10674 - ^SupportDir|Content/ca/expand/mhowdy1.aud: - Offset: 268455897 - Length: 6714 - ^SupportDir|Content/ca/expand/mhuh1.aud: - Offset: 268462611 - Length: 4117 - ^SupportDir|Content/ca/expand/mlaff1.aud: - Offset: 268527415 - Length: 24133 - ^SupportDir|Content/ca/expand/mrise1.aud: - Offset: 268564948 - Length: 13523 - ^SupportDir|Content/ca/expand/mwrench1.aud: - Offset: 268578471 - Length: 10780 - ^SupportDir|Content/ca/expand/myeehaw1.aud: - Offset: 268589251 - Length: 18912 - ^SupportDir|Content/ca/expand/myes1.aud: - Offset: 268608163 - Length: 9073 -aftermath-linux: Aftermath Expansion Disc (English) - IDFiles: - readme.txt: 9902fb74c019df1b76ff5634e68f0371d790b5e0 - setup/install/patch.rtp: 5bce93f834f9322ddaa7233242e5b6c7fea0bf17 - Install: - extract-raw: setup/install/patch.rtp - ^SupportDir|Content/ca/expand/expand2.mix: - Offset: 4712984 - Length: 469922 - ^SupportDir|Content/ca/expand/hires1.mix: - Offset: 5182981 - Length: 90264 - ^SupportDir|Content/ca/expand/lores1.mix: - Offset: 5273320 - Length: 57076 - extract-raw: main.mix - ^SupportDir|Content/ca/expand/await.aud: - Offset: 158698809 - Length: 2972788 - ^SupportDir|Content/ca/expand/bog.aud: - Offset: 244351833 - Length: 2386955 - ^SupportDir|Content/ca/expand/float_v2.aud: - Offset: 246738788 - Length: 3090115 - ^SupportDir|Content/ca/expand/gloom.aud: - Offset: 249828903 - Length: 2662851 - ^SupportDir|Content/ca/expand/grndwire.aud: - Offset: 252491754 - Length: 2573611 - ^SupportDir|Content/ca/expand/rpt.aud: - Offset: 255065365 - Length: 3092259 - ^SupportDir|Content/ca/expand/search.aud: - Offset: 258157624 - Length: 3104091 - ^SupportDir|Content/ca/expand/traction.aud: - Offset: 261261715 - Length: 2668003 - ^SupportDir|Content/ca/expand/wastelnd.aud: - Offset: 263929718 - Length: 2721563 - ^SupportDir|Content/ca/expand/chrotnk1.aud: - Offset: 267714446 - Length: 22900 - ^SupportDir|Content/ca/expand/fixit1.aud: - Offset: 267959424 - Length: 10707 - ^SupportDir|Content/ca/expand/jburn1.aud: - Offset: 268105462 - Length: 23091 - ^SupportDir|Content/ca/expand/jchrge1.aud: - Offset: 268128553 - Length: 14219 - ^SupportDir|Content/ca/expand/jcrisp1.aud: - Offset: 268142772 - Length: 18211 - ^SupportDir|Content/ca/expand/jdance1.aud: - Offset: 268160983 - Length: 14315 - ^SupportDir|Content/ca/expand/jjuice1.aud: - Offset: 268175298 - Length: 9699 - ^SupportDir|Content/ca/expand/jjump1.aud: - Offset: 268184997 - Length: 8219 - ^SupportDir|Content/ca/expand/jlight1.aud: - Offset: 268193216 - Length: 9875 - ^SupportDir|Content/ca/expand/jpower1.aud: - Offset: 268203091 - Length: 13571 - ^SupportDir|Content/ca/expand/jshock1.aud: - Offset: 268216662 - Length: 14771 - ^SupportDir|Content/ca/expand/jyes1.aud: - Offset: 268231433 - Length: 13795 - ^SupportDir|Content/ca/expand/madchrg2.aud: - Offset: 268361344 - Length: 19782 - ^SupportDir|Content/ca/expand/madexplo.aud: - Offset: 268381126 - Length: 26572 - ^SupportDir|Content/ca/expand/mboss1.aud: - Offset: 268413174 - Length: 20147 - ^SupportDir|Content/ca/expand/mhear1.aud: - Offset: 268438509 - Length: 6714 - ^SupportDir|Content/ca/expand/mhotdig1.aud: - Offset: 268445223 - Length: 10674 - ^SupportDir|Content/ca/expand/mhowdy1.aud: - Offset: 268455897 - Length: 6714 - ^SupportDir|Content/ca/expand/mhuh1.aud: - Offset: 268462611 - Length: 4117 - ^SupportDir|Content/ca/expand/mlaff1.aud: - Offset: 268527415 - Length: 24133 - ^SupportDir|Content/ca/expand/mrise1.aud: - Offset: 268564948 - Length: 13523 - ^SupportDir|Content/ca/expand/mwrench1.aud: - Offset: 268578471 - Length: 10780 - ^SupportDir|Content/ca/expand/myeehaw1.aud: - Offset: 268589251 - Length: 18912 - ^SupportDir|Content/ca/expand/myes1.aud: - Offset: 268608163 - Length: 9073 \ No newline at end of file diff --git a/mods/ca/installer/allies95.yaml b/mods/ca/installer/allies95.yaml deleted file mode 100644 index 55c03bf56d..0000000000 --- a/mods/ca/installer/allies95.yaml +++ /dev/null @@ -1,394 +0,0 @@ -allied: Red Alert 95 (Allied Disc, English) - IDFiles: - MAIN.MIX: 20ebe16f91ff79be2d672f1db5bae9048ff9357c - Length: 4096 - INSTALL/REDALERT.MIX: 0e58f4b54f44f6cd29fecf8cf379d33cf2d4caef - Install: - extract-raw: INSTALL/REDALERT.MIX - ^SupportDir|Content/ca/hires.mix: - Offset: 650612 - Length: 5817417 - ^SupportDir|Content/ca/local.mix: - Offset: 6468029 - Length: 3829837 - ^SupportDir|Content/ca/lores.mix: - Offset: 10297866 - Length: 754800 - ^SupportDir|Content/ca/speech.mix: - Offset: 23042864 - Length: 2003464 - extract-raw: MAIN.MIX - ^SupportDir|Content/ca/conquer.mix: - Offset: 236 - Length: 2177047 - ^SupportDir|Content/ca/interior.mix: - Offset: 17172192 - Length: 247425 - ^SupportDir|Content/ca/movies/aagun.vqa: - Offset: 37694331 - Length: 3295512 - ^SupportDir|Content/ca/movies/aftrmath.vqa: - Offset: 40989843 - Length: 2455774 - ^SupportDir|Content/ca/movies/ally1.vqa: - Offset: 43445617 - Length: 13536324 - ^SupportDir|Content/ca/movies/ally10.vqa: - Offset: 56981941 - Length: 21506358 - ^SupportDir|Content/ca/movies/ally10b.vqa: - Offset: 78488299 - Length: 2565152 - ^SupportDir|Content/ca/movies/ally11.vqa: - Offset: 81053451 - Length: 13600398 - ^SupportDir|Content/ca/movies/ally12.vqa: - Offset: 94653849 - Length: 7719544 - ^SupportDir|Content/ca/movies/ally14.vqa: - Offset: 102373393 - Length: 11659080 - ^SupportDir|Content/ca/movies/ally2.vqa: - Offset: 114032473 - Length: 8014018 - ^SupportDir|Content/ca/movies/ally4.vqa: - Offset: 122046491 - Length: 9441906 - ^SupportDir|Content/ca/movies/ally5.vqa: - Offset: 131488397 - Length: 21900328 - ^SupportDir|Content/ca/movies/ally6.vqa: - Offset: 153388725 - Length: 26454212 - ^SupportDir|Content/ca/movies/ally8.vqa: - Offset: 179842937 - Length: 15401062 - ^SupportDir|Content/ca/movies/ally9.vqa: - Offset: 195243999 - Length: 14901460 - ^SupportDir|Content/ca/movies/allyend.vqa: - Offset: 210145459 - Length: 27285692 - ^SupportDir|Content/ca/movies/allymorf.vqa: - Offset: 237431151 - Length: 916964 - ^SupportDir|Content/ca/movies/apcescpe.vqa: - Offset: 238348115 - Length: 1627564 - ^SupportDir|Content/ca/movies/assess.vqa: - Offset: 239975679 - Length: 2929218 - ^SupportDir|Content/ca/movies/battle.vqa: - Offset: 242904897 - Length: 2881110 - ^SupportDir|Content/ca/movies/binoc.vqa: - Offset: 245786007 - Length: 4045856 - ^SupportDir|Content/ca/movies/bmap.vqa: - Offset: 249831863 - Length: 2414312 - ^SupportDir|Content/ca/movies/brdgtilt.vqa: - Offset: 252246175 - Length: 1581318 - ^SupportDir|Content/ca/movies/crontest.vqa: - Offset: 253827493 - Length: 2036620 - ^SupportDir|Content/ca/movies/cronfail.vqa: - Offset: 255864113 - Length: 1717214 - ^SupportDir|Content/ca/movies/destroyr.vqa: - Offset: 257581327 - Length: 2178828 - ^SupportDir|Content/ca/movies/dud.vqa: - Offset: 259760155 - Length: 3110418 - ^SupportDir|Content/ca/movies/elevator.vqa: - Offset: 262870573 - Length: 1741894 - ^SupportDir|Content/ca/movies/flare.vqa: - Offset: 264612467 - Length: 1731744 - ^SupportDir|Content/ca/movies/frozen.vqa: - Offset: 266344211 - Length: 1836994 - ^SupportDir|Content/ca/movies/grvestne.vqa: - Offset: 268181205 - Length: 3155668 - ^SupportDir|Content/ca/movies/landing.vqa: - Offset: 271336873 - Length: 2374106 - ^SupportDir|Content/ca/movies/masasslt.vqa: - Offset: 273710979 - Length: 5354700 - ^SupportDir|Content/ca/movies/mcv.vqa: - Offset: 279065679 - Length: 1296036 - ^SupportDir|Content/ca/movies/mcv_land.vqa: - Offset: 280361715 - Length: 1424358 - ^SupportDir|Content/ca/movies/montpass.vqa: - Offset: 281786073 - Length: 1701852 - ^SupportDir|Content/ca/movies/oildrum.vqa: - Offset: 283487925 - Length: 2430792 - ^SupportDir|Content/ca/movies/overrun.vqa: - Offset: 285918717 - Length: 2174548 - ^SupportDir|Content/ca/movies/prolog.vqa: - Offset: 288093265 - Length: 28658198 - ^SupportDir|Content/ca/movies/redintro.vqa: - Offset: 316751463 - Length: 2269452 - ^SupportDir|Content/ca/movies/shipsink.vqa: - Offset: 319020915 - Length: 3150030 - ^SupportDir|Content/ca/movies/shorbom1.vqa: - Offset: 322170945 - Length: 4046650 - ^SupportDir|Content/ca/movies/shorbom2.vqa: - Offset: 326217595 - Length: 2150364 - ^SupportDir|Content/ca/movies/shorbomb.vqa: - Offset: 328367959 - Length: 6111616 - ^SupportDir|Content/ca/movies/snowbomb.vqa: - Offset: 334479575 - Length: 2465762 - ^SupportDir|Content/ca/movies/soviet1.vqa: - Offset: 336945337 - Length: 24112060 - ^SupportDir|Content/ca/movies/sovtstar.vqa: - Offset: 361057397 - Length: 670794 - ^SupportDir|Content/ca/movies/spy.vqa: - Offset: 361728191 - Length: 1646808 - ^SupportDir|Content/ca/movies/tanya1.vqa: - Offset: 363374999 - Length: 13389684 - ^SupportDir|Content/ca/movies/tanya2.vqa: - Offset: 376764683 - Length: 4103388 - ^SupportDir|Content/ca/movies/toofar.vqa: - Offset: 380868071 - Length: 4244572 - ^SupportDir|Content/ca/movies/trinity.vqa: - Offset: 385112643 - Length: 1669310 - ^SupportDir|Content/ca/ra/scores.mix: - Offset: 386781953 - Length: 64171360 - ^SupportDir|Content/ca/snow.mix: - Offset: 450953313 - Length: 1030861 - ^SupportDir|Content/ca/sounds.mix: - Offset: 451984174 - Length: 1006778 - ^SupportDir|Content/ca/russian.mix: - Offset: 452990952 - Length: 266077 - ^SupportDir|Content/ca/allies.mix: - Offset: 453257029 - Length: 309406 - ^SupportDir|Content/ca/temperat.mix: - Offset: 453566435 - Length: 1038859 - -allied-linux: Red Alert 95 (Allied Disc, English) - IDFiles: - eahelp.gid: 13a8a4a1e7d9d6d893c38df5a39262c4689aeba5 - install/redalert.mix: 0e58f4b54f44f6cd29fecf8cf379d33cf2d4caef - Install: - extract-raw: install/redalert.mix - ^SupportDir|Content/ca/hires.mix: - Offset: 650612 - Length: 5817417 - ^SupportDir|Content/ca/local.mix: - Offset: 6468029 - Length: 3829837 - ^SupportDir|Content/ca/lores.mix: - Offset: 10297866 - Length: 754800 - ^SupportDir|Content/ca/speech.mix: - Offset: 23042864 - Length: 2003464 - extract-raw: main.mix - ^SupportDir|Content/ca/conquer.mix: - Offset: 236 - Length: 2177047 - ^SupportDir|Content/ca/interior.mix: - Offset: 17172192 - Length: 247425 - ^SupportDir|Content/ca/movies/aagun.vqa: - Offset: 37694331 - Length: 3295512 - ^SupportDir|Content/ca/movies/aftrmath.vqa: - Offset: 40989843 - Length: 2455774 - ^SupportDir|Content/ca/movies/ally1.vqa: - Offset: 43445617 - Length: 13536324 - ^SupportDir|Content/ca/movies/ally10.vqa: - Offset: 56981941 - Length: 21506358 - ^SupportDir|Content/ca/movies/ally10b.vqa: - Offset: 78488299 - Length: 2565152 - ^SupportDir|Content/ca/movies/ally11.vqa: - Offset: 81053451 - Length: 13600398 - ^SupportDir|Content/ca/movies/ally12.vqa: - Offset: 94653849 - Length: 7719544 - ^SupportDir|Content/ca/movies/ally14.vqa: - Offset: 102373393 - Length: 11659080 - ^SupportDir|Content/ca/movies/ally2.vqa: - Offset: 114032473 - Length: 8014018 - ^SupportDir|Content/ca/movies/ally4.vqa: - Offset: 122046491 - Length: 9441906 - ^SupportDir|Content/ca/movies/ally5.vqa: - Offset: 131488397 - Length: 21900328 - ^SupportDir|Content/ca/movies/ally6.vqa: - Offset: 153388725 - Length: 26454212 - ^SupportDir|Content/ca/movies/ally8.vqa: - Offset: 179842937 - Length: 15401062 - ^SupportDir|Content/ca/movies/ally9.vqa: - Offset: 195243999 - Length: 14901460 - ^SupportDir|Content/ca/movies/allyend.vqa: - Offset: 210145459 - Length: 27285692 - ^SupportDir|Content/ca/movies/allymorf.vqa: - Offset: 237431151 - Length: 916964 - ^SupportDir|Content/ca/movies/apcescpe.vqa: - Offset: 238348115 - Length: 1627564 - ^SupportDir|Content/ca/movies/assess.vqa: - Offset: 239975679 - Length: 2929218 - ^SupportDir|Content/ca/movies/battle.vqa: - Offset: 242904897 - Length: 2881110 - ^SupportDir|Content/ca/movies/binoc.vqa: - Offset: 245786007 - Length: 4045856 - ^SupportDir|Content/ca/movies/bmap.vqa: - Offset: 249831863 - Length: 2414312 - ^SupportDir|Content/ca/movies/brdgtilt.vqa: - Offset: 252246175 - Length: 1581318 - ^SupportDir|Content/ca/movies/crontest.vqa: - Offset: 253827493 - Length: 2036620 - ^SupportDir|Content/ca/movies/cronfail.vqa: - Offset: 255864113 - Length: 1717214 - ^SupportDir|Content/ca/movies/destroyr.vqa: - Offset: 257581327 - Length: 2178828 - ^SupportDir|Content/ca/movies/dud.vqa: - Offset: 259760155 - Length: 3110418 - ^SupportDir|Content/ca/movies/elevator.vqa: - Offset: 262870573 - Length: 1741894 - ^SupportDir|Content/ca/movies/flare.vqa: - Offset: 264612467 - Length: 1731744 - ^SupportDir|Content/ca/movies/frozen.vqa: - Offset: 266344211 - Length: 1836994 - ^SupportDir|Content/ca/movies/grvestne.vqa: - Offset: 268181205 - Length: 3155668 - ^SupportDir|Content/ca/movies/landing.vqa: - Offset: 271336873 - Length: 2374106 - ^SupportDir|Content/ca/movies/masasslt.vqa: - Offset: 273710979 - Length: 5354700 - ^SupportDir|Content/ca/movies/mcv.vqa: - Offset: 279065679 - Length: 1296036 - ^SupportDir|Content/ca/movies/mcv_land.vqa: - Offset: 280361715 - Length: 1424358 - ^SupportDir|Content/ca/movies/montpass.vqa: - Offset: 281786073 - Length: 1701852 - ^SupportDir|Content/ca/movies/oildrum.vqa: - Offset: 283487925 - Length: 2430792 - ^SupportDir|Content/ca/movies/overrun.vqa: - Offset: 285918717 - Length: 2174548 - ^SupportDir|Content/ca/movies/prolog.vqa: - Offset: 288093265 - Length: 28658198 - ^SupportDir|Content/ca/movies/redintro.vqa: - Offset: 316751463 - Length: 2269452 - ^SupportDir|Content/ca/movies/shipsink.vqa: - Offset: 319020915 - Length: 3150030 - ^SupportDir|Content/ca/movies/shorbom1.vqa: - Offset: 322170945 - Length: 4046650 - ^SupportDir|Content/ca/movies/shorbom2.vqa: - Offset: 326217595 - Length: 2150364 - ^SupportDir|Content/ca/movies/shorbomb.vqa: - Offset: 328367959 - Length: 6111616 - ^SupportDir|Content/ca/movies/snowbomb.vqa: - Offset: 334479575 - Length: 2465762 - ^SupportDir|Content/ca/movies/soviet1.vqa: - Offset: 336945337 - Length: 24112060 - ^SupportDir|Content/ca/movies/sovtstar.vqa: - Offset: 361057397 - Length: 670794 - ^SupportDir|Content/ca/movies/spy.vqa: - Offset: 361728191 - Length: 1646808 - ^SupportDir|Content/ca/movies/tanya1.vqa: - Offset: 363374999 - Length: 13389684 - ^SupportDir|Content/ca/movies/tanya2.vqa: - Offset: 376764683 - Length: 4103388 - ^SupportDir|Content/ca/movies/toofar.vqa: - Offset: 380868071 - Length: 4244572 - ^SupportDir|Content/ca/movies/trinity.vqa: - Offset: 385112643 - Length: 1669310 - ^SupportDir|Content/ca/ra/scores.mix: - Offset: 386781953 - Length: 64171360 - ^SupportDir|Content/ca/snow.mix: - Offset: 450953313 - Length: 1030861 - ^SupportDir|Content/ca/sounds.mix: - Offset: 451984174 - Length: 1006778 - ^SupportDir|Content/ca/russian.mix: - Offset: 452990952 - Length: 266077 - ^SupportDir|Content/ca/allies.mix: - Offset: 453257029 - Length: 309406 - ^SupportDir|Content/ca/temperat.mix: - Offset: 453566435 - Length: 1038859 \ No newline at end of file diff --git a/mods/ca/installer/cnc95.yaml b/mods/ca/installer/cnc95.yaml deleted file mode 100644 index 0e359973e0..0000000000 --- a/mods/ca/installer/cnc95.yaml +++ /dev/null @@ -1,14 +0,0 @@ -cnc95: C&C Gold (GDI or Nod Disc, English) - IDFiles: - CONQUER.MIX: 833e02a09aae694659eb312d3838367f681d1b30 - Install: - copy: . - ^SupportDir|Content/ca/cnc/desert.mix: DESERT.MIX - ^SupportDir|Content/ca/cnc/scores.mix: SCORES.mix -cnc95-linux: C&C Gold (GDI or Nod Disc, English) - IDFiles: - conquer.mix: 833e02a09aae694659eb312d3838367f681d1b30 - Install: - copy: . - ^SupportDir|Content/ca/cnc/desert.mix: desert.mix - ^SupportDir|Content/ca/cnc/scores.mix: scores.mix \ No newline at end of file diff --git a/mods/ca/installer/counterstrike.yaml b/mods/ca/installer/counterstrike.yaml deleted file mode 100644 index 9c7c1f3d4e..0000000000 --- a/mods/ca/installer/counterstrike.yaml +++ /dev/null @@ -1,60 +0,0 @@ -counterstrike: Counterstrike Expansion Disc (English) - IDFiles: - README.TXT: 0efe8087383f0b159a9633f891fb5f53c6097cd4 - SETUP/INSTALL/CSTRIKE.RTP: fae8ba82db71574f6ecd8fb4ff4026fcb65d2adc - Install: - extract-raw: MAIN.MIX - ^SupportDir|Content/ca/expand/2nd_hand.aud: - Offset: 209070947 - Length: 3070092 - ^SupportDir|Content/ca/expand/araziod.aud: - Offset: 212141039 - Length: 2941132 - ^SupportDir|Content/ca/expand/backstab.aud: - Offset: 215082171 - Length: 3178252 - ^SupportDir|Content/ca/expand/chaos2.aud: - Offset: 218260423 - Length: 2860068 - ^SupportDir|Content/ca/expand/shut_it.aud: - Offset: 221120491 - Length: 2991979 - ^SupportDir|Content/ca/expand/twinmix1.aud: - Offset: 224112470 - Length: 2536972 - ^SupportDir|Content/ca/expand/under3.aud: - Offset: 226649442 - Length: 2812788 - ^SupportDir|Content/ca/expand/vr2.aud: - Offset: 229462230 - Length: 2920396 -counterstrike-linux: Counterstrike Expansion Disc (English) - IDFiles: - readme.txt: 0efe8087383f0b159a9633f891fb5f53c6097cd4 - setup/install/cstrike.rtp: fae8ba82db71574f6ecd8fb4ff4026fcb65d2adc - Install: - extract-raw: main.mix - ^SupportDir|Content/ca/expand/2nd_hand.aud: - Offset: 209070947 - Length: 3070092 - ^SupportDir|Content/ca/expand/araziod.aud: - Offset: 212141039 - Length: 2941132 - ^SupportDir|Content/ca/expand/backstab.aud: - Offset: 215082171 - Length: 3178252 - ^SupportDir|Content/ca/expand/chaos2.aud: - Offset: 218260423 - Length: 2860068 - ^SupportDir|Content/ca/expand/shut_it.aud: - Offset: 221120491 - Length: 2991979 - ^SupportDir|Content/ca/expand/twinmix1.aud: - Offset: 224112470 - Length: 2536972 - ^SupportDir|Content/ca/expand/under3.aud: - Offset: 226649442 - Length: 2812788 - ^SupportDir|Content/ca/expand/vr2.aud: - Offset: 229462230 - Length: 2920396 \ No newline at end of file diff --git a/mods/ca/installer/firestorm.yaml b/mods/ca/installer/firestorm.yaml deleted file mode 100644 index 0a16d55a82..0000000000 --- a/mods/ca/installer/firestorm.yaml +++ /dev/null @@ -1,7 +0,0 @@ -fstorm: Firestorm Expansion Disc (English) - IDFiles: - Install/README.TXT: f2810b540fce8f3880250213ee08c57780d81c20 - Install/Language.dll: 4df87c1a2289da57dd14d0a7299546f37357fcca - Install: - copy: . - ^SupportDir|Content/ca/firestorm/scores01.mix: Install/scores01.mix \ No newline at end of file diff --git a/mods/ca/installer/firstdecade.yaml b/mods/ca/installer/firstdecade.yaml deleted file mode 100644 index f046add6dd..0000000000 --- a/mods/ca/installer/firstdecade.yaml +++ /dev/null @@ -1,453 +0,0 @@ -tfd: C&C The First Decade (English) - IDFiles: - data1.hdr: bef3a08c3fc1b1caf28ca0dbb97c1f900005930e - data1.cab: 12ad6113a6890a1b4d5651a75378c963eaf513b9 - Install: - extract-iscab: data1.hdr - Volumes: - 2: data2.cab - 3: data3.cab - 4: data4.cab - 5: data5.cab - Extract: - ^SupportDir|Content/ca/main.mix: Red Alert\\MAIN.MIX - ^SupportDir|Content/ca/redalert.mix: Red Alert\\REDALERT.MIX - ^SupportDir|Content/ca/expand/hires1.mix: Red Alert\\HIRES1.MIX - ^SupportDir|Content/ca/expand/lores1.mix: Red Alert\\LORES1.MIX - ^SupportDir|Content/ca/expand/expand2.mix: Red Alert\\EXPAND2.MIX - ^SupportDir|Content/ca/cnc/desert.mix: CnC\\DESERT.MIX - ^SupportDir|Content/ca/cnc/scores.mix: CnC\\SCORES.MIX - ^SupportDir|Content/ca/ra2/theme.mix: Red Alert 2\RA2\theme.mix - ^SupportDir|Content/ca/ra2/thememd.mix: Yuri\RA2\thememd.mix - ^SupportDir|Content/ca/ts/scores.mix: Tiberian Sun\SUN\SCORES.MIX - ^SupportDir|Content/ca/firestorm/scores01.mix: Tiberian Sun\SUN\scores01.mix - extract-raw: ^SupportDir|Content/ca/redalert.mix - ^SupportDir|Content/ca/hires.mix: - Offset: 650612 - Length: 5817417 - ^SupportDir|Content/ca/local.mix: - Offset: 6468029 - Length: 3829837 - ^SupportDir|Content/ca/lores.mix: - Offset: 10297866 - Length: 754800 - ^SupportDir|Content/ca/speech.mix: - Offset: 23042864 - Length: 2003464 - delete: ^SupportDir|Content/ca/redalert.mix - extract-raw: ^SupportDir|Content/ca/main.mix - ^SupportDir|Content/ca/movies/aagun.vqa: - Offset: 668669829 - Length: 3295512 - ^SupportDir|Content/ca/movies/aftrmath.vqa: - Offset: 671965341 - Length: 2455774 - ^SupportDir|Content/ca/movies/ally12.vqa: - Offset: 430652277 - Length: 7719544 - ^SupportDir|Content/ca/movies/ally14.vqa: - Offset: 438371821 - Length: 11659080 - ^SupportDir|Content/ca/movies/allyend.vqa: - Offset: 450030901 - Length: 27285692 - ^SupportDir|Content/ca/movies/allymorf.vqa: - Offset: 477316593 - Length: 916964 - ^SupportDir|Content/ca/movies/apcescpe.vqa: - Offset: 483950063 - Length: 1627564 - ^SupportDir|Content/ca/movies/assess.vqa: - Offset: 485577627 - Length: 2929218 - ^SupportDir|Content/ca/movies/battle.vqa: - Offset: 488506845 - Length: 2881110 - ^SupportDir|Content/ca/movies/binoc.vqa: - Offset: 491387955 - Length: 4045856 - ^SupportDir|Content/ca/movies/bmap.vqa: - Offset: 495433811 - Length: 2411294 - ^SupportDir|Content/ca/movies/brdgtilt.vqa: - Offset: 497845105 - Length: 1581318 - ^SupportDir|Content/ca/movies/cronfail.vqa: - Offset: 499426423 - Length: 1717214 - ^SupportDir|Content/ca/movies/crontest.vqa: - Offset: 501143637 - Length: 2036620 - ^SupportDir|Content/ca/movies/destroyr.vqa: - Offset: 503180257 - Length: 2178828 - ^SupportDir|Content/ca/movies/dud.vqa: - Offset: 505359085 - Length: 3110418 - ^SupportDir|Content/ca/movies/elevator.vqa: - Offset: 508469503 - Length: 1741894 - ^SupportDir|Content/ca/movies/flare.vqa: - Offset: 511722609 - Length: 1731744 - ^SupportDir|Content/ca/movies/frozen.vqa: - Offset: 513454353 - Length: 1836994 - ^SupportDir|Content/ca/movies/grvestne.vqa: - Offset: 515291347 - Length: 3155668 - ^SupportDir|Content/ca/movies/landing.vqa: - Offset: 518447015 - Length: 2374106 - ^SupportDir|Content/ca/movies/masasslt.vqa: - Offset: 520821121 - Length: 5354700 - ^SupportDir|Content/ca/movies/mcv.vqa: - Offset: 526175821 - Length: 1296036 - ^SupportDir|Content/ca/movies/mcv_land.vqa: - Offset: 527471857 - Length: 1424358 - ^SupportDir|Content/ca/movies/montpass.vqa: - Offset: 528896215 - Length: 1701852 - ^SupportDir|Content/ca/movies/oildrum.vqa: - Offset: 530598067 - Length: 2430792 - ^SupportDir|Content/ca/movies/overrun.vqa: - Offset: 533028859 - Length: 2174548 - ^SupportDir|Content/ca/movies/prolog.vqa: - Offset: 535203407 - Length: 28658198 - ^SupportDir|Content/ca/movies/redintro.vqa: - Offset: 563861605 - Length: 2269452 - ^SupportDir|Content/ca/movies/shipsink.vqa: - Offset: 567961011 - Length: 3150030 - ^SupportDir|Content/ca/movies/shorbom1.vqa: - Offset: 571111041 - Length: 4046650 - ^SupportDir|Content/ca/movies/shorbom2.vqa: - Offset: 575157691 - Length: 2150364 - ^SupportDir|Content/ca/movies/shorbomb.vqa: - Offset: 577308055 - Length: 6111616 - ^SupportDir|Content/ca/movies/snowbomb.vqa: - Offset: 583419671 - Length: 2465762 - ^SupportDir|Content/ca/movies/soviet1.vqa: - Offset: 594906599 - Length: 24112060 - ^SupportDir|Content/ca/movies/sovtstar.vqa: - Offset: 619018659 - Length: 670794 - ^SupportDir|Content/ca/movies/spy.vqa: - Offset: 619689453 - Length: 1646808 - ^SupportDir|Content/ca/movies/tanya1.vqa: - Offset: 621336261 - Length: 13389684 - ^SupportDir|Content/ca/movies/tanya2.vqa: - Offset: 634725945 - Length: 4103388 - ^SupportDir|Content/ca/movies/toofar.vqa: - Offset: 640625425 - Length: 4244572 - ^SupportDir|Content/ca/movies/trinity.vqa: - Offset: 644869997 - Length: 1669310 - ^SupportDir|Content/ca/movies/ally1.vqa: - Offset: 674421115 - Length: 13536324 - ^SupportDir|Content/ca/movies/ally2.vqa: - Offset: 687957439 - Length: 8014018 - ^SupportDir|Content/ca/movies/ally4.vqa: - Offset: 695971457 - Length: 9441906 - ^SupportDir|Content/ca/movies/ally5.vqa: - Offset: 705413363 - Length: 21900328 - ^SupportDir|Content/ca/movies/ally6.vqa: - Offset: 727313691 - Length: 26454212 - ^SupportDir|Content/ca/movies/ally8.vqa: - Offset: 753767903 - Length: 15401062 - ^SupportDir|Content/ca/movies/ally9.vqa: - Offset: 769168965 - Length: 14901460 - ^SupportDir|Content/ca/movies/ally10.vqa: - Offset: 784070425 - Length: 21506358 - ^SupportDir|Content/ca/movies/ally10b.vqa: - Offset: 805576783 - Length: 2565152 - ^SupportDir|Content/ca/movies/ally11.vqa: - Offset: 808142713 - Length: 13600398 - ^SupportDir|Content/ca/interior.mix: - Offset: 821743111 - Length: 249490 - ^SupportDir|Content/ca/conquer.mix: - Offset: 840028549 - Length: 2192279 - ^SupportDir|Content/ca/allies.mix: - Offset: 842220828 - Length: 319181 - ^SupportDir|Content/ca/temperat.mix: - Offset: 842540009 - Length: 1043672 - ^SupportDir|Content/ca/sounds.mix: - Offset: 843583681 - Length: 1385637 - ^SupportDir|Content/ca/snow.mix: - Offset: 844969318 - Length: 1035716 - ^SupportDir|Content/ca/ra/scores.mix: - Offset: 846005034 - Length: 67742203 - ^SupportDir|Content/ca/russian.mix: - Offset: 913747237 - Length: 274732 - ^SupportDir|Content/ca/movies/double.vqa: - Offset: 915739478 - Length: 1608508 - ^SupportDir|Content/ca/movies/dpthchrg.vqa: - Offset: 917347986 - Length: 3048762 - ^SupportDir|Content/ca/movies/execute.vqa: - Offset: 920396748 - Length: 1511212 - ^SupportDir|Content/ca/movies/flare.vqa: - Offset: 921907960 - Length: 1731744 - ^SupportDir|Content/ca/movies/landing.vqa: - Offset: 923639704 - Length: 2374106 - ^SupportDir|Content/ca/movies/mcvbrdge.vqa: - Offset: 926013810 - Length: 2124412 - ^SupportDir|Content/ca/movies/mig.vqa: - Offset: 928138222 - Length: 6745398 - ^SupportDir|Content/ca/movies/movingin.vqa: - Offset: 934883620 - Length: 1185550 - ^SupportDir|Content/ca/movies/mtnkfact.vqa: - Offset: 936069170 - Length: 3168076 - ^SupportDir|Content/ca/movies/nukestok.vqa: - Offset: 939237246 - Length: 1877536 - ^SupportDir|Content/ca/movies/onthprwl.vqa: - Offset: 941114782 - Length: 2648948 - ^SupportDir|Content/ca/movies/periscop.vqa: - Offset: 943763730 - Length: 2099110 - ^SupportDir|Content/ca/movies/prolog.vqa: - Offset: 945862840 - Length: 28658198 - ^SupportDir|Content/ca/movies/radrraid.vqa: - Offset: 974521038 - Length: 1561740 - ^SupportDir|Content/ca/movies/redintro.vqa: - Offset: 976082778 - Length: 2269452 - ^SupportDir|Content/ca/movies/search.vqa: - Offset: 978352230 - Length: 2298940 - ^SupportDir|Content/ca/movies/sfrozen.vqa: - Offset: 980651170 - Length: 1829954 - ^SupportDir|Content/ca/movies/sitduck.vqa: - Offset: 982481124 - Length: 3650212 - ^SupportDir|Content/ca/movies/slntsrvc.vqa: - Offset: 986131336 - Length: 1774986 - ^SupportDir|Content/ca/movies/snowbomb.vqa: - Offset: 987906322 - Length: 2465762 - ^SupportDir|Content/ca/movies/snstrafe.vqa: - Offset: 990372084 - Length: 2473362 - ^SupportDir|Content/ca/movies/sovbatl.vqa: - Offset: 992845446 - Length: 3439876 - ^SupportDir|Content/ca/movies/sovcemet.vqa: - Offset: 996285322 - Length: 3107928 - ^SupportDir|Content/ca/movies/sovfinal.vqa: - Offset: 999393250 - Length: 35169890 - ^SupportDir|Content/ca/movies/soviet1.vqa: - Offset: 1034563140 - Length: 24112060 - ^SupportDir|Content/ca/movies/soviet2.vqa: - Offset: 1058675200 - Length: 9494814 - ^SupportDir|Content/ca/movies/soviet3.vqa: - Offset: 1068170014 - Length: 17229910 - ^SupportDir|Content/ca/movies/soviet4.vqa: - Offset: 1085399924 - Length: 7236290 - ^SupportDir|Content/ca/movies/soviet5.vqa: - Offset: 1092636214 - Length: 18986154 - ^SupportDir|Content/ca/movies/soviet6.vqa: - Offset: 1111622368 - Length: 6782016 - ^SupportDir|Content/ca/movies/soviet7.vqa: - Offset: 1118404384 - Length: 5637552 - ^SupportDir|Content/ca/movies/soviet8.vqa: - Offset: 1124041936 - Length: 28905880 - ^SupportDir|Content/ca/movies/soviet9.vqa: - Offset: 1152947816 - Length: 31809450 - ^SupportDir|Content/ca/movies/soviet10.vqa: - Offset: 1184757266 - Length: 10102944 - ^SupportDir|Content/ca/movies/soviet11.vqa: - Offset: 1194860210 - Length: 16685840 - ^SupportDir|Content/ca/movies/soviet12.vqa: - Offset: 1211546050 - Length: 11532038 - ^SupportDir|Content/ca/movies/soviet13.vqa: - Offset: 1223078088 - Length: 15210482 - ^SupportDir|Content/ca/movies/soviet14.vqa: - Offset: 1238288570 - Length: 24358232 - ^SupportDir|Content/ca/movies/sovmcv.vqa: - Offset: 1262646802 - Length: 1292126 - ^SupportDir|Content/ca/movies/sovtstar.vqa: - Offset: 1263938928 - Length: 670794 - ^SupportDir|Content/ca/movies/spotter.vqa: - Offset: 1264609722 - Length: 1346422 - ^SupportDir|Content/ca/movies/strafe.vqa: - Offset: 1265956144 - Length: 1226956 - ^SupportDir|Content/ca/movies/take_off.vqa: - Offset: 1267183100 - Length: 1419370 - ^SupportDir|Content/ca/movies/tesla.vqa: - Offset: 1268602470 - Length: 1796092 - ^SupportDir|Content/ca/movies/v2rocket.vqa: - Offset: 1270398562 - Length: 1856524 - ^SupportDir|Content/ca/movies/aagun.vqa: - Offset: 1292529084 - Length: 3295512 - ^SupportDir|Content/ca/movies/airfield.vqa: - Offset: 1295824596 - Length: 2696058 - ^SupportDir|Content/ca/movies/ally1.vqa: - Offset: 1298520654 - Length: 13536324 - ^SupportDir|Content/ca/movies/allymorf.vqa: - Offset: 1312056978 - Length: 916964 - ^SupportDir|Content/ca/movies/averted.vqa: - Offset: 1312973942 - Length: 1902556 - ^SupportDir|Content/ca/movies/beachead.vqa: - Offset: 1314876498 - Length: 4891790 - ^SupportDir|Content/ca/movies/bmap.vqa: - Offset: 1319768288 - Length: 2414312 - ^SupportDir|Content/ca/movies/bombrun.vqa: - Offset: 1322182600 - Length: 5167450 - ^SupportDir|Content/ca/movies/countdwn.vqa: - Offset: 1327350050 - Length: 2005906 - ^SupportDir|Content/ca/movies/cronfail.vqa: - Offset: 1329356707 - Length: 1717214 - ^SupportDir|Content/ca/expand/chrotnk1.aud: - Offset: 843615985 - Length: 22900 - ^SupportDir|Content/ca/expand/fixit1.aud: - Offset: 843860963 - Length: 10707 - ^SupportDir|Content/ca/expand/jburn1.aud: - Offset: 844007001 - Length: 23091 - ^SupportDir|Content/ca/expand/jchrge1.aud: - Offset: 844030092 - Length: 14219 - ^SupportDir|Content/ca/expand/jcrisp1.aud: - Offset: 844044311 - Length: 18211 - ^SupportDir|Content/ca/expand/jdance1.aud: - Offset: 844062522 - Length: 14315 - ^SupportDir|Content/ca/expand/jjuice1.aud: - Offset: 844076837 - Length: 9699 - ^SupportDir|Content/ca/expand/jjump1.aud: - Offset: 844086536 - Length: 8219 - ^SupportDir|Content/ca/expand/jlight1.aud: - Offset: 844094755 - Length: 9875 - ^SupportDir|Content/ca/expand/jpower1.aud: - Offset: 844104630 - Length: 13571 - ^SupportDir|Content/ca/expand/jshock1.aud: - Offset: 844118201 - Length: 14771 - ^SupportDir|Content/ca/expand/jyes1.aud: - Offset: 844132972 - Length: 13795 - ^SupportDir|Content/ca/expand/madchrg2.aud: - Offset: 844262883 - Length: 19782 - ^SupportDir|Content/ca/expand/madexplo.aud: - Offset: 844282665 - Length: 26572 - ^SupportDir|Content/ca/expand/mboss1.aud: - Offset: 844314713 - Length: 20147 - ^SupportDir|Content/ca/expand/mhear1.aud: - Offset: 844340048 - Length: 6714 - ^SupportDir|Content/ca/expand/mhotdig1.aud: - Offset: 844346762 - Length: 10674 - ^SupportDir|Content/ca/expand/mhowdy1.aud: - Offset: 844357436 - Length: 6714 - ^SupportDir|Content/ca/expand/mhuh1.aud: - Offset: 844364150 - Length: 4117 - ^SupportDir|Content/ca/expand/mlaff1.aud: - Offset: 844428954 - Length: 24133 - ^SupportDir|Content/ca/expand/mrise1.aud: - Offset: 844466487 - Length: 13523 - ^SupportDir|Content/ca/expand/mwrench1.aud: - Offset: 844480010 - Length: 10780 - ^SupportDir|Content/ca/expand/myeehaw1.aud: - Offset: 844490790 - Length: 18912 - ^SupportDir|Content/ca/expand/myes1.aud: - Offset: 844509702 - Length: 9073 - delete: ^SupportDir|Content/ca/main.mix \ No newline at end of file diff --git a/mods/ca/installer/origin.yaml b/mods/ca/installer/origin.yaml deleted file mode 100644 index e9d47854ff..0000000000 --- a/mods/ca/installer/origin.yaml +++ /dev/null @@ -1,505 +0,0 @@ -origin-ra: C&C The Ultimate Collection RA (Origin version, English) - Type: Install - RegistryPrefixes: HKEY_LOCAL_MACHINE\Software\, HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ - RegistryKey: EA Games\Command and Conquer Red Alert - RegistryValue: Install Dir - IDFiles: - RA95Launcher.exe: 22bf7a1f9f1c2498823e3216541e6012f291c2c0 - REDALERT.MIX: 0e58f4b54f44f6cd29fecf8cf379d33cf2d4caef - Install: - copy: . - ^SupportDir|Content/ca/expand/2nd_hand.aud: 2nd_hand.aud - ^SupportDir|Content/ca/expand/araziod.aud: araziod.aud - ^SupportDir|Content/ca/expand/await.aud: await.aud - ^SupportDir|Content/ca/expand/backstab.aud: backstab.aud - ^SupportDir|Content/ca/expand/bog.aud: bog.aud - ^SupportDir|Content/ca/expand/chaos2.aud: chaos2.aud - ^SupportDir|Content/ca/expand/float_v2.aud: float_v2.aud - ^SupportDir|Content/ca/expand/gloom.aud: gloom.aud - ^SupportDir|Content/ca/expand/grndwire.aud: grndwire.aud - ^SupportDir|Content/ca/expand/rpt.aud: rpt.aud - ^SupportDir|Content/ca/expand/search.aud: search.aud - ^SupportDir|Content/ca/expand/shut_it.aud: shut_it.aud - ^SupportDir|Content/ca/expand/traction.aud: traction.aud - ^SupportDir|Content/ca/expand/twinmix1.aud: twinmix1.aud - ^SupportDir|Content/ca/expand/under3.aud: under3.aud - ^SupportDir|Content/ca/expand/vr2.aud: vr2.aud - ^SupportDir|Content/ca/expand/wastelnd.aud: wastelnd.aud - ^SupportDir|Content/ca/expand/expand2.mix: EXPAND2.MIX - ^SupportDir|Content/ca/expand/hires1.mix: HIRES1.MIX - ^SupportDir|Content/ca/expand/lores1.mix: LORES1.MIX - extract-raw: REDALERT.MIX - ^SupportDir|Content/ca/hires.mix: - Offset: 650612 - Length: 5817417 - ^SupportDir|Content/ca/local.mix: - Offset: 6468029 - Length: 3829837 - ^SupportDir|Content/ca/lores.mix: - Offset: 10297866 - Length: 754800 - ^SupportDir|Content/ca/speech.mix: - Offset: 23042864 - Length: 2003464 - extract-raw: MAIN.MIX - ^SupportDir|Content/ca/movies/aagun.vqa: - Offset: 668669829 - Length: 3295512 - ^SupportDir|Content/ca/movies/aftrmath.vqa: - Offset: 671965341 - Length: 2455774 - ^SupportDir|Content/ca/movies/ally12.vqa: - Offset: 430652277 - Length: 7719544 - ^SupportDir|Content/ca/movies/ally14.vqa: - Offset: 438371821 - Length: 11659080 - ^SupportDir|Content/ca/movies/allyend.vqa: - Offset: 450030901 - Length: 27285692 - ^SupportDir|Content/ca/movies/allymorf.vqa: - Offset: 477316593 - Length: 916964 - ^SupportDir|Content/ca/movies/apcescpe.vqa: - Offset: 483950063 - Length: 1627564 - ^SupportDir|Content/ca/movies/assess.vqa: - Offset: 485577627 - Length: 2929218 - ^SupportDir|Content/ca/movies/battle.vqa: - Offset: 488506845 - Length: 2881110 - ^SupportDir|Content/ca/movies/binoc.vqa: - Offset: 491387955 - Length: 4045856 - ^SupportDir|Content/ca/movies/bmap.vqa: - Offset: 495433811 - Length: 2411294 - ^SupportDir|Content/ca/movies/brdgtilt.vqa: - Offset: 497845105 - Length: 1581318 - ^SupportDir|Content/ca/movies/cronfail.vqa: - Offset: 499426423 - Length: 1717214 - ^SupportDir|Content/ca/movies/crontest.vqa: - Offset: 501143637 - Length: 2036620 - ^SupportDir|Content/ca/movies/destroyr.vqa: - Offset: 503180257 - Length: 2178828 - ^SupportDir|Content/ca/movies/dud.vqa: - Offset: 505359085 - Length: 3110418 - ^SupportDir|Content/ca/movies/elevator.vqa: - Offset: 508469503 - Length: 1741894 - ^SupportDir|Content/ca/movies/flare.vqa: - Offset: 511722609 - Length: 1731744 - ^SupportDir|Content/ca/movies/frozen.vqa: - Offset: 513454353 - Length: 1836994 - ^SupportDir|Content/ca/movies/grvestne.vqa: - Offset: 515291347 - Length: 3155668 - ^SupportDir|Content/ca/movies/landing.vqa: - Offset: 518447015 - Length: 2374106 - ^SupportDir|Content/ca/movies/masasslt.vqa: - Offset: 520821121 - Length: 5354700 - ^SupportDir|Content/ca/movies/mcv.vqa: - Offset: 526175821 - Length: 1296036 - ^SupportDir|Content/ca/movies/mcv_land.vqa: - Offset: 527471857 - Length: 1424358 - ^SupportDir|Content/ca/movies/montpass.vqa: - Offset: 528896215 - Length: 1701852 - ^SupportDir|Content/ca/movies/oildrum.vqa: - Offset: 530598067 - Length: 2430792 - ^SupportDir|Content/ca/movies/overrun.vqa: - Offset: 533028859 - Length: 2174548 - ^SupportDir|Content/ca/movies/prolog.vqa: - Offset: 535203407 - Length: 28658198 - ^SupportDir|Content/ca/movies/redintro.vqa: - Offset: 563861605 - Length: 2269452 - ^SupportDir|Content/ca/movies/shipsink.vqa: - Offset: 567961011 - Length: 3150030 - ^SupportDir|Content/ca/movies/shorbom1.vqa: - Offset: 571111041 - Length: 4046650 - ^SupportDir|Content/ca/movies/shorbom2.vqa: - Offset: 575157691 - Length: 2150364 - ^SupportDir|Content/ca/movies/shorbomb.vqa: - Offset: 577308055 - Length: 6111616 - ^SupportDir|Content/ca/movies/snowbomb.vqa: - Offset: 583419671 - Length: 2465762 - ^SupportDir|Content/ca/movies/soviet1.vqa: - Offset: 594906599 - Length: 24112060 - ^SupportDir|Content/ca/movies/sovtstar.vqa: - Offset: 619018659 - Length: 670794 - ^SupportDir|Content/ca/movies/spy.vqa: - Offset: 619689453 - Length: 1646808 - ^SupportDir|Content/ca/movies/tanya1.vqa: - Offset: 621336261 - Length: 13389684 - ^SupportDir|Content/ca/movies/tanya2.vqa: - Offset: 634725945 - Length: 4103388 - ^SupportDir|Content/ca/movies/toofar.vqa: - Offset: 640625425 - Length: 4244572 - ^SupportDir|Content/ca/movies/trinity.vqa: - Offset: 644869997 - Length: 1669310 - ^SupportDir|Content/ca/movies/ally1.vqa: - Offset: 674421115 - Length: 13536324 - ^SupportDir|Content/ca/movies/ally2.vqa: - Offset: 687957439 - Length: 8014018 - ^SupportDir|Content/ca/movies/ally4.vqa: - Offset: 695971457 - Length: 9441906 - ^SupportDir|Content/ca/movies/ally5.vqa: - Offset: 705413363 - Length: 21900328 - ^SupportDir|Content/ca/movies/ally6.vqa: - Offset: 727313691 - Length: 26454212 - ^SupportDir|Content/ca/movies/ally8.vqa: - Offset: 753767903 - Length: 15401062 - ^SupportDir|Content/ca/movies/ally9.vqa: - Offset: 769168965 - Length: 14901460 - ^SupportDir|Content/ca/movies/ally10.vqa: - Offset: 784070425 - Length: 21506358 - ^SupportDir|Content/ca/movies/ally10b.vqa: - Offset: 805576783 - Length: 2565152 - ^SupportDir|Content/ca/movies/ally11.vqa: - Offset: 808142713 - Length: 13600398 - ^SupportDir|Content/ca/interior.mix: - Offset: 821743111 - Length: 249490 - ^SupportDir|Content/ca/conquer.mix: - Offset: 840028549 - Length: 2192279 - ^SupportDir|Content/ca/allies.mix: - Offset: 842220828 - Length: 319181 - ^SupportDir|Content/ca/temperat.mix: - Offset: 842540009 - Length: 1043672 - ^SupportDir|Content/ca/sounds.mix: - Offset: 843583681 - Length: 1385637 - ^SupportDir|Content/ca/snow.mix: - Offset: 844969318 - Length: 1035716 - ^SupportDir|Content/ca/ra/scores.mix: - Offset: 846005034 - Length: 67742203 - ^SupportDir|Content/ca/russian.mix: - Offset: 913747237 - Length: 274732 - ^SupportDir|Content/ca/movies/double.vqa: - Offset: 915739478 - Length: 1608508 - ^SupportDir|Content/ca/movies/dpthchrg.vqa: - Offset: 917347986 - Length: 3048762 - ^SupportDir|Content/ca/movies/execute.vqa: - Offset: 920396748 - Length: 1511212 - ^SupportDir|Content/ca/movies/flare.vqa: - Offset: 921907960 - Length: 1731744 - ^SupportDir|Content/ca/movies/landing.vqa: - Offset: 923639704 - Length: 2374106 - ^SupportDir|Content/ca/movies/mcvbrdge.vqa: - Offset: 926013810 - Length: 2124412 - ^SupportDir|Content/ca/movies/mig.vqa: - Offset: 928138222 - Length: 6745398 - ^SupportDir|Content/ca/movies/movingin.vqa: - Offset: 934883620 - Length: 1185550 - ^SupportDir|Content/ca/movies/mtnkfact.vqa: - Offset: 936069170 - Length: 3168076 - ^SupportDir|Content/ca/movies/nukestok.vqa: - Offset: 939237246 - Length: 1877536 - ^SupportDir|Content/ca/movies/onthprwl.vqa: - Offset: 941114782 - Length: 2648948 - ^SupportDir|Content/ca/movies/periscop.vqa: - Offset: 943763730 - Length: 2099110 - ^SupportDir|Content/ca/movies/prolog.vqa: - Offset: 945862840 - Length: 28658198 - ^SupportDir|Content/ca/movies/radrraid.vqa: - Offset: 974521038 - Length: 1561740 - ^SupportDir|Content/ca/movies/redintro.vqa: - Offset: 976082778 - Length: 2269452 - ^SupportDir|Content/ca/movies/search.vqa: - Offset: 978352230 - Length: 2298940 - ^SupportDir|Content/ca/movies/sfrozen.vqa: - Offset: 980651170 - Length: 1829954 - ^SupportDir|Content/ca/movies/sitduck.vqa: - Offset: 982481124 - Length: 3650212 - ^SupportDir|Content/ca/movies/slntsrvc.vqa: - Offset: 986131336 - Length: 1774986 - ^SupportDir|Content/ca/movies/snowbomb.vqa: - Offset: 987906322 - Length: 2465762 - ^SupportDir|Content/ca/movies/snstrafe.vqa: - Offset: 990372084 - Length: 2473362 - ^SupportDir|Content/ca/movies/sovbatl.vqa: - Offset: 992845446 - Length: 3439876 - ^SupportDir|Content/ca/movies/sovcemet.vqa: - Offset: 996285322 - Length: 3107928 - ^SupportDir|Content/ca/movies/sovfinal.vqa: - Offset: 999393250 - Length: 35169890 - ^SupportDir|Content/ca/movies/soviet1.vqa: - Offset: 1034563140 - Length: 24112060 - ^SupportDir|Content/ca/movies/soviet2.vqa: - Offset: 1058675200 - Length: 9494814 - ^SupportDir|Content/ca/movies/soviet3.vqa: - Offset: 1068170014 - Length: 17229910 - ^SupportDir|Content/ca/movies/soviet4.vqa: - Offset: 1085399924 - Length: 7236290 - ^SupportDir|Content/ca/movies/soviet5.vqa: - Offset: 1092636214 - Length: 18986154 - ^SupportDir|Content/ca/movies/soviet6.vqa: - Offset: 1111622368 - Length: 6782016 - ^SupportDir|Content/ca/movies/soviet7.vqa: - Offset: 1118404384 - Length: 5637552 - ^SupportDir|Content/ca/movies/soviet8.vqa: - Offset: 1124041936 - Length: 28905880 - ^SupportDir|Content/ca/movies/soviet9.vqa: - Offset: 1152947816 - Length: 31809450 - ^SupportDir|Content/ca/movies/soviet10.vqa: - Offset: 1184757266 - Length: 10102944 - ^SupportDir|Content/ca/movies/soviet11.vqa: - Offset: 1194860210 - Length: 16685840 - ^SupportDir|Content/ca/movies/soviet12.vqa: - Offset: 1211546050 - Length: 11532038 - ^SupportDir|Content/ca/movies/soviet13.vqa: - Offset: 1223078088 - Length: 15210482 - ^SupportDir|Content/ca/movies/soviet14.vqa: - Offset: 1238288570 - Length: 24358232 - ^SupportDir|Content/ca/movies/sovmcv.vqa: - Offset: 1262646802 - Length: 1292126 - ^SupportDir|Content/ca/movies/sovtstar.vqa: - Offset: 1263938928 - Length: 670794 - ^SupportDir|Content/ca/movies/spotter.vqa: - Offset: 1264609722 - Length: 1346422 - ^SupportDir|Content/ca/movies/strafe.vqa: - Offset: 1265956144 - Length: 1226956 - ^SupportDir|Content/ca/movies/take_off.vqa: - Offset: 1267183100 - Length: 1419370 - ^SupportDir|Content/ca/movies/tesla.vqa: - Offset: 1268602470 - Length: 1796092 - ^SupportDir|Content/ca/movies/v2rocket.vqa: - Offset: 1270398562 - Length: 1856524 - ^SupportDir|Content/ca/movies/aagun.vqa: - Offset: 1292529084 - Length: 3295512 - ^SupportDir|Content/ca/movies/airfield.vqa: - Offset: 1295824596 - Length: 2696058 - ^SupportDir|Content/ca/movies/ally1.vqa: - Offset: 1298520654 - Length: 13536324 - ^SupportDir|Content/ca/movies/allymorf.vqa: - Offset: 1312056978 - Length: 916964 - ^SupportDir|Content/ca/movies/averted.vqa: - Offset: 1312973942 - Length: 1902556 - ^SupportDir|Content/ca/movies/beachead.vqa: - Offset: 1314876498 - Length: 4891790 - ^SupportDir|Content/ca/movies/bmap.vqa: - Offset: 1319768288 - Length: 2414312 - ^SupportDir|Content/ca/movies/bombrun.vqa: - Offset: 1322182600 - Length: 5167450 - ^SupportDir|Content/ca/movies/countdwn.vqa: - Offset: 1327350050 - Length: 2005906 - ^SupportDir|Content/ca/movies/cronfail.vqa: - Offset: 1329356707 - Length: 1717214 - ^SupportDir|Content/ca/expand/chrotnk1.aud: - Offset: 843615985 - Length: 22900 - ^SupportDir|Content/ca/expand/fixit1.aud: - Offset: 843860963 - Length: 10707 - ^SupportDir|Content/ca/expand/jburn1.aud: - Offset: 844007001 - Length: 23091 - ^SupportDir|Content/ca/expand/jchrge1.aud: - Offset: 844030092 - Length: 14219 - ^SupportDir|Content/ca/expand/jcrisp1.aud: - Offset: 844044311 - Length: 18211 - ^SupportDir|Content/ca/expand/jdance1.aud: - Offset: 844062522 - Length: 14315 - ^SupportDir|Content/ca/expand/jjuice1.aud: - Offset: 844076837 - Length: 9699 - ^SupportDir|Content/ca/expand/jjump1.aud: - Offset: 844086536 - Length: 8219 - ^SupportDir|Content/ca/expand/jlight1.aud: - Offset: 844094755 - Length: 9875 - ^SupportDir|Content/ca/expand/jpower1.aud: - Offset: 844104630 - Length: 13571 - ^SupportDir|Content/ca/expand/jshock1.aud: - Offset: 844118201 - Length: 14771 - ^SupportDir|Content/ca/expand/jyes1.aud: - Offset: 844132972 - Length: 13795 - ^SupportDir|Content/ca/expand/madchrg2.aud: - Offset: 844262883 - Length: 19782 - ^SupportDir|Content/ca/expand/madexplo.aud: - Offset: 844282665 - Length: 26572 - ^SupportDir|Content/ca/expand/mboss1.aud: - Offset: 844314713 - Length: 20147 - ^SupportDir|Content/ca/expand/mhear1.aud: - Offset: 844340048 - Length: 6714 - ^SupportDir|Content/ca/expand/mhotdig1.aud: - Offset: 844346762 - Length: 10674 - ^SupportDir|Content/ca/expand/mhowdy1.aud: - Offset: 844357436 - Length: 6714 - ^SupportDir|Content/ca/expand/mhuh1.aud: - Offset: 844364150 - Length: 4117 - ^SupportDir|Content/ca/expand/mlaff1.aud: - Offset: 844428954 - Length: 24133 - ^SupportDir|Content/ca/expand/mrise1.aud: - Offset: 844466487 - Length: 13523 - ^SupportDir|Content/ca/expand/mwrench1.aud: - Offset: 844480010 - Length: 10780 - ^SupportDir|Content/ca/expand/myeehaw1.aud: - Offset: 844490790 - Length: 18912 - ^SupportDir|Content/ca/expand/myes1.aud: - Offset: 844509702 - Length: 9073 - -origin-cnc: Command & Conquer (Origin version, English) - Type: Install - RegistryPrefixes: HKEY_LOCAL_MACHINE\Software\, HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ - RegistryKey: EA Games\CNC and The Covert Operations - RegistryValue: Install Dir - IDFiles: - CNC95Launcher.exe: 1d711adf09ac08738b2599b3092a1b448169b32a - CONQUER.MIX: 833e02a09aae694659eb312d3838367f681d1b30 - Install: - copy: . - ^SupportDir|Content/ca/cnc/desert.mix: DESERT.MIX - ^SupportDir|Content/ca/cnc/scores.mix: SCORES.MIX - -origin-ts: C&C The Ultimate Collection TS (Origin version, English) - Type: Install - RegistryPrefixes: HKEY_LOCAL_MACHINE\Software\, HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ - RegistryKey: EA Games\Command and Conquer Tiberian Sun - RegistryValue: Install Dir - IDFiles: - GDFBinary_en_US.dll: 4bb56a449bd0003e7ae67625d90a11ae169319d6 - Install: - copy: . - ^SupportDir|Content/ca/ts/scores.mix: SCORES.MIX - ^SupportDir|Content/ca/firestorm/scores01.mix: scores01.mix - -origin-ra2: C&C The Ultimate Collection RA2 (Origin version, English) - Type: Install - RegistryPrefixes: HKEY_LOCAL_MACHINE\Software\, HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ - RegistryKey: EA Games\Command and Conquer Red Alert II - RegistryValue: Install Dir - IDFiles: - theme.mix: 184f99e3292ab19c71c08a1ad7097ce739396190 - Install: - copy: . - ^SupportDir|Content/ca/ra2/theme.mix: theme.mix - -origin-yr: C&C The Ultimate Collection YR (Origin version, English) - Type: Install - RegistryPrefixes: HKEY_LOCAL_MACHINE\Software\, HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ - RegistryKey: EA Games\Command and Conquer Red Alert II - RegistryValue: Install Dir - IDFiles: - theme.mix: 184f99e3292ab19c71c08a1ad7097ce739396190 - Install: - copy: . - ^SupportDir|Content/ca/ra2/thememd.mix: thememd.mix \ No newline at end of file diff --git a/mods/ca/installer/ra2.yaml b/mods/ca/installer/ra2.yaml deleted file mode 100644 index 29424ff062..0000000000 --- a/mods/ca/installer/ra2.yaml +++ /dev/null @@ -1,6 +0,0 @@ -ra2: Red Alert 2 (Allied or Soviet Disc, English) - IDFiles: - README.txt: e125e2742509d73b20dc4aa65b22497c805cd6f5 - Install: - copy: . - ^SupportDir|Content/ca/ra2/theme.mix: theme.mix \ No newline at end of file diff --git a/mods/ca/installer/ra2yr.yaml b/mods/ca/installer/ra2yr.yaml deleted file mode 100644 index 335560f26a..0000000000 --- a/mods/ca/installer/ra2yr.yaml +++ /dev/null @@ -1,6 +0,0 @@ -ra2yr: Red Alert 2 Yuri's Revenge Expansion (English) - IDFiles: - README.txt: ac868fc9f804deebb5a934dde341d3daad1e9622 - Install: - copy: . - ^SupportDir|Content/ca/ra2/thememd.mix: thememd.mix \ No newline at end of file diff --git a/mods/ca/installer/soviet95.yaml b/mods/ca/installer/soviet95.yaml deleted file mode 100644 index 8d7315346d..0000000000 --- a/mods/ca/installer/soviet95.yaml +++ /dev/null @@ -1,417 +0,0 @@ -soviet: Red Alert 95 (Soviet Disc, English) - IDFiles: - MAIN.MIX: 9d108f18560716b684ab8b1da42cc7f3d1b52519 - Length: 4096 - INSTALL/REDALERT.MIX: 0e58f4b54f44f6cd29fecf8cf379d33cf2d4caef - Install: - extract-raw: INSTALL/REDALERT.MIX - ^SupportDir|Content/ca/hires.mix: - Offset: 650612 - Length: 5817417 - ^SupportDir|Content/ca/local.mix: - Offset: 6468029 - Length: 3829837 - ^SupportDir|Content/ca/lores.mix: - Offset: 10297866 - Length: 754800 - ^SupportDir|Content/ca/speech.mix: - Offset: 23042864 - Length: 2003464 - extract-raw: MAIN.MIX - ^SupportDir|Content/ca/conquer.mix: - Offset: 236 - Length: 2177047 - ^SupportDir|Content/ca/interior.mix: - Offset: 17172192 - Length: 247425 - ^SupportDir|Content/ca/movies/aagun.vqa: - Offset: 37694379 - Length: 3295512 - ^SupportDir|Content/ca/movies/cronfail.vqa: - Offset: 40989891 - Length: 1717214 - ^SupportDir|Content/ca/movies/airfield.vqa: - Offset: 42707105 - Length: 2696058 - ^SupportDir|Content/ca/movies/ally1.vqa: - Offset: 45403163 - Length: 13536324 - ^SupportDir|Content/ca/movies/allymorf.vqa: - Offset: 58939487 - Length: 916964 - ^SupportDir|Content/ca/movies/averted.vqa: - Offset: 59856451 - Length: 1902556 - ^SupportDir|Content/ca/movies/beachead.vqa: - Offset: 61759007 - Length: 4891790 - ^SupportDir|Content/ca/movies/bmap.vqa: - Offset: 66650797 - Length: 2414312 - ^SupportDir|Content/ca/movies/bombrun.vqa: - Offset: 69065109 - Length: 5167450 - ^SupportDir|Content/ca/movies/countdwn.vqa: - Offset: 74232559 - Length: 2005906 - ^SupportDir|Content/ca/movies/double.vqa: - Offset: 76238465 - Length: 1608508 - ^SupportDir|Content/ca/movies/dpthchrg.vqa: - Offset: 77846973 - Length: 3048762 - ^SupportDir|Content/ca/movies/execute.vqa: - Offset: 80895735 - Length: 1511212 - ^SupportDir|Content/ca/movies/flare.vqa: - Offset: 82406947 - Length: 1731744 - ^SupportDir|Content/ca/movies/landing.vqa: - Offset: 84138691 - Length: 2374106 - ^SupportDir|Content/ca/movies/mcvbrdge.vqa: - Offset: 86512797 - Length: 2124412 - ^SupportDir|Content/ca/movies/mig.vqa: - Offset: 88637209 - Length: 6745398 - ^SupportDir|Content/ca/movies/movingin.vqa: - Offset: 95382607 - Length: 1185550 - ^SupportDir|Content/ca/movies/mtnkfact.vqa: - Offset: 96568157 - Length: 3168076 - ^SupportDir|Content/ca/movies/nukestok.vqa: - Offset: 99736233 - Length: 1877536 - ^SupportDir|Content/ca/movies/onthprwl.vqa: - Offset: 101613769 - Length: 2648948 - ^SupportDir|Content/ca/movies/periscop.vqa: - Offset: 104262717 - Length: 2099110 - ^SupportDir|Content/ca/movies/prolog.vqa: - Offset: 106361827 - Length: 28658198 - ^SupportDir|Content/ca/movies/radrraid.vqa: - Offset: 135020025 - Length: 1561740 - ^SupportDir|Content/ca/movies/redintro.vqa: - Offset: 136581765 - Length: 2269452 - ^SupportDir|Content/ca/movies/search.vqa: - Offset: 138851217 - Length: 2298940 - ^SupportDir|Content/ca/movies/sfrozen.vqa: - Offset: 141150157 - Length: 1829954 - ^SupportDir|Content/ca/movies/sitduck.vqa: - Offset: 142980111 - Length: 3650212 - ^SupportDir|Content/ca/movies/slntsrvc.vqa: - Offset: 146630323 - Length: 1774986 - ^SupportDir|Content/ca/movies/snowbomb.vqa: - Offset: 148405309 - Length: 2465762 - ^SupportDir|Content/ca/movies/snstrafe.vqa: - Offset: 150871071 - Length: 2473362 - ^SupportDir|Content/ca/movies/sovbatl.vqa: - Offset: 153344433 - Length: 3439876 - ^SupportDir|Content/ca/movies/sovcemet.vqa: - Offset: 156784309 - Length: 3107928 - ^SupportDir|Content/ca/movies/sovfinal.vqa: - Offset: 159892237 - Length: 35169890 - ^SupportDir|Content/ca/movies/soviet1.vqa: - Offset: 195062127 - Length: 24112060 - ^SupportDir|Content/ca/movies/soviet10.vqa: - Offset: 219174187 - Length: 10102944 - ^SupportDir|Content/ca/movies/soviet11.vqa: - Offset: 229277131 - Length: 16685840 - ^SupportDir|Content/ca/movies/soviet12.vqa: - Offset: 245962971 - Length: 11532038 - ^SupportDir|Content/ca/movies/soviet13.vqa: - Offset: 257495009 - Length: 15210482 - ^SupportDir|Content/ca/movies/soviet14.vqa: - Offset: 272705491 - Length: 24358232 - ^SupportDir|Content/ca/movies/soviet2.vqa: - Offset: 297063723 - Length: 9494814 - ^SupportDir|Content/ca/movies/soviet3.vqa: - Offset: 306558537 - Length: 17229910 - ^SupportDir|Content/ca/movies/soviet4.vqa: - Offset: 323788447 - Length: 7236290 - ^SupportDir|Content/ca/movies/soviet5.vqa: - Offset: 331024737 - Length: 18986154 - ^SupportDir|Content/ca/movies/soviet6.vqa: - Offset: 350010891 - Length: 6782016 - ^SupportDir|Content/ca/movies/soviet7.vqa: - Offset: 356792907 - Length: 5637552 - ^SupportDir|Content/ca/movies/soviet8.vqa: - Offset: 362430459 - Length: 28905880 - ^SupportDir|Content/ca/movies/soviet9.vqa: - Offset: 391336339 - Length: 31809450 - ^SupportDir|Content/ca/movies/sovmcv.vqa: - Offset: 423145789 - Length: 1292126 - ^SupportDir|Content/ca/movies/sovtstar.vqa: - Offset: 424437915 - Length: 670794 - ^SupportDir|Content/ca/movies/spotter.vqa: - Offset: 425108709 - Length: 1346422 - ^SupportDir|Content/ca/movies/strafe.vqa: - Offset: 426455131 - Length: 1226956 - ^SupportDir|Content/ca/movies/take_off.vqa: - Offset: 427682087 - Length: 1419370 - ^SupportDir|Content/ca/movies/tesla.vqa: - Offset: 429101457 - Length: 1796092 - ^SupportDir|Content/ca/movies/v2rocket.vqa: - Offset: 430897549 - Length: 1856524 - ^SupportDir|Content/ca/ra/scores.mix: - Offset: 432754073 - Length: 64171360 - ^SupportDir|Content/ca/snow.mix: - Offset: 496925433 - Length: 1030861 - ^SupportDir|Content/ca/russian.mix: - Offset: 497956294 - Length: 266077 - ^SupportDir|Content/ca/allies.mix: - Offset: 498222371 - Length: 309406 - ^SupportDir|Content/ca/sounds.mix: - Offset: 498531777 - Length: 1006778 - ^SupportDir|Content/ca/temperat.mix: - Offset: 499538555 - Length: 1038859 -soviet-linux: Red Alert 95 (Soviet Disc, English) - IDFiles: - automenu.apm: bb61132a492bfb37069a0139f95671da3655d916 - install/redalert.mix: 0e58f4b54f44f6cd29fecf8cf379d33cf2d4caef - Install: - extract-raw: install/redalert.mix - ^SupportDir|Content/ca/hires.mix: - Offset: 650612 - Length: 5817417 - ^SupportDir|Content/ca/local.mix: - Offset: 6468029 - Length: 3829837 - ^SupportDir|Content/ca/lores.mix: - Offset: 10297866 - Length: 754800 - ^SupportDir|Content/ca/speech.mix: - Offset: 23042864 - Length: 2003464 - extract-raw: main.mix - ^SupportDir|Content/ca/conquer.mix: - Offset: 236 - Length: 2177047 - ^SupportDir|Content/ca/interior.mix: - Offset: 17172192 - Length: 247425 - ^SupportDir|Content/ca/movies/aagun.vqa: - Offset: 37694379 - Length: 3295512 - ^SupportDir|Content/ca/movies/cronfail.vqa: - Offset: 40989891 - Length: 1717214 - ^SupportDir|Content/ca/movies/airfield.vqa: - Offset: 42707105 - Length: 2696058 - ^SupportDir|Content/ca/movies/ally1.vqa: - Offset: 45403163 - Length: 13536324 - ^SupportDir|Content/ca/movies/allymorf.vqa: - Offset: 58939487 - Length: 916964 - ^SupportDir|Content/ca/movies/averted.vqa: - Offset: 59856451 - Length: 1902556 - ^SupportDir|Content/ca/movies/beachead.vqa: - Offset: 61759007 - Length: 4891790 - ^SupportDir|Content/ca/movies/bmap.vqa: - Offset: 66650797 - Length: 2414312 - ^SupportDir|Content/ca/movies/bombrun.vqa: - Offset: 69065109 - Length: 5167450 - ^SupportDir|Content/ca/movies/countdwn.vqa: - Offset: 74232559 - Length: 2005906 - ^SupportDir|Content/ca/movies/double.vqa: - Offset: 76238465 - Length: 1608508 - ^SupportDir|Content/ca/movies/dpthchrg.vqa: - Offset: 77846973 - Length: 3048762 - ^SupportDir|Content/ca/movies/execute.vqa: - Offset: 80895735 - Length: 1511212 - ^SupportDir|Content/ca/movies/flare.vqa: - Offset: 82406947 - Length: 1731744 - ^SupportDir|Content/ca/movies/landing.vqa: - Offset: 84138691 - Length: 2374106 - ^SupportDir|Content/ca/movies/mcvbrdge.vqa: - Offset: 86512797 - Length: 2124412 - ^SupportDir|Content/ca/movies/mig.vqa: - Offset: 88637209 - Length: 6745398 - ^SupportDir|Content/ca/movies/movingin.vqa: - Offset: 95382607 - Length: 1185550 - ^SupportDir|Content/ca/movies/mtnkfact.vqa: - Offset: 96568157 - Length: 3168076 - ^SupportDir|Content/ca/movies/nukestok.vqa: - Offset: 99736233 - Length: 1877536 - ^SupportDir|Content/ca/movies/onthprwl.vqa: - Offset: 101613769 - Length: 2648948 - ^SupportDir|Content/ca/movies/periscop.vqa: - Offset: 104262717 - Length: 2099110 - ^SupportDir|Content/ca/movies/prolog.vqa: - Offset: 106361827 - Length: 28658198 - ^SupportDir|Content/ca/movies/radrraid.vqa: - Offset: 135020025 - Length: 1561740 - ^SupportDir|Content/ca/movies/redintro.vqa: - Offset: 136581765 - Length: 2269452 - ^SupportDir|Content/ca/movies/search.vqa: - Offset: 138851217 - Length: 2298940 - ^SupportDir|Content/ca/movies/sfrozen.vqa: - Offset: 141150157 - Length: 1829954 - ^SupportDir|Content/ca/movies/sitduck.vqa: - Offset: 142980111 - Length: 3650212 - ^SupportDir|Content/ca/movies/slntsrvc.vqa: - Offset: 146630323 - Length: 1774986 - ^SupportDir|Content/ca/movies/snowbomb.vqa: - Offset: 148405309 - Length: 2465762 - ^SupportDir|Content/ca/movies/snstrafe.vqa: - Offset: 150871071 - Length: 2473362 - ^SupportDir|Content/ca/movies/sovbatl.vqa: - Offset: 153344433 - Length: 3439876 - ^SupportDir|Content/ca/movies/sovcemet.vqa: - Offset: 156784309 - Length: 3107928 - ^SupportDir|Content/ca/movies/sovfinal.vqa: - Offset: 159892237 - Length: 35169890 - ^SupportDir|Content/ca/movies/soviet1.vqa: - Offset: 195062127 - Length: 24112060 - ^SupportDir|Content/ca/movies/soviet10.vqa: - Offset: 219174187 - Length: 10102944 - ^SupportDir|Content/ca/movies/soviet11.vqa: - Offset: 229277131 - Length: 16685840 - ^SupportDir|Content/ca/movies/soviet12.vqa: - Offset: 245962971 - Length: 11532038 - ^SupportDir|Content/ca/movies/soviet13.vqa: - Offset: 257495009 - Length: 15210482 - ^SupportDir|Content/ca/movies/soviet14.vqa: - Offset: 272705491 - Length: 24358232 - ^SupportDir|Content/ca/movies/soviet2.vqa: - Offset: 297063723 - Length: 9494814 - ^SupportDir|Content/ca/movies/soviet3.vqa: - Offset: 306558537 - Length: 17229910 - ^SupportDir|Content/ca/movies/soviet4.vqa: - Offset: 323788447 - Length: 7236290 - ^SupportDir|Content/ca/movies/soviet5.vqa: - Offset: 331024737 - Length: 18986154 - ^SupportDir|Content/ca/movies/soviet6.vqa: - Offset: 350010891 - Length: 6782016 - ^SupportDir|Content/ca/movies/soviet7.vqa: - Offset: 356792907 - Length: 5637552 - ^SupportDir|Content/ca/movies/soviet8.vqa: - Offset: 362430459 - Length: 28905880 - ^SupportDir|Content/ca/movies/soviet9.vqa: - Offset: 391336339 - Length: 31809450 - ^SupportDir|Content/ca/movies/sovmcv.vqa: - Offset: 423145789 - Length: 1292126 - ^SupportDir|Content/ca/movies/sovtstar.vqa: - Offset: 424437915 - Length: 670794 - ^SupportDir|Content/ca/movies/spotter.vqa: - Offset: 425108709 - Length: 1346422 - ^SupportDir|Content/ca/movies/strafe.vqa: - Offset: 426455131 - Length: 1226956 - ^SupportDir|Content/ca/movies/take_off.vqa: - Offset: 427682087 - Length: 1419370 - ^SupportDir|Content/ca/movies/tesla.vqa: - Offset: 429101457 - Length: 1796092 - ^SupportDir|Content/ca/movies/v2rocket.vqa: - Offset: 430897549 - Length: 1856524 - ^SupportDir|Content/ca/ra/scores.mix: - Offset: 432754073 - Length: 64171360 - ^SupportDir|Content/ca/snow.mix: - Offset: 496925433 - Length: 1030861 - ^SupportDir|Content/ca/russian.mix: - Offset: 497956294 - Length: 266077 - ^SupportDir|Content/ca/allies.mix: - Offset: 498222371 - Length: 309406 - ^SupportDir|Content/ca/sounds.mix: - Offset: 498531777 - Length: 1006778 - ^SupportDir|Content/ca/temperat.mix: - Offset: 499538555 - Length: 1038859 \ No newline at end of file diff --git a/mods/ca/languages/english.yaml b/mods/ca/languages/english.yaml deleted file mode 100644 index 7dee16a0f1..0000000000 --- a/mods/ca/languages/english.yaml +++ /dev/null @@ -1,2 +0,0 @@ -english: - english: English diff --git a/mods/ca/maps/Acid_Reign_CA.oramap b/mods/ca/maps/Acid_Reign_CA.oramap index 080f350a03..6ccff1e754 100644 Binary files a/mods/ca/maps/Acid_Reign_CA.oramap and b/mods/ca/maps/Acid_Reign_CA.oramap differ diff --git a/mods/ca/maps/Alert_CA.oramap b/mods/ca/maps/Alert_CA.oramap new file mode 100644 index 0000000000..d43ff66c66 Binary files /dev/null and b/mods/ca/maps/Alert_CA.oramap differ diff --git a/mods/ca/maps/Amok_CA.oramap b/mods/ca/maps/Amok_CA.oramap index 8320e69bf7..0ec74dec49 100644 Binary files a/mods/ca/maps/Amok_CA.oramap and b/mods/ca/maps/Amok_CA.oramap differ diff --git a/mods/ca/maps/Amsterdamned-2v2-CA.oramap b/mods/ca/maps/Amsterdamned-2v2-CA.oramap new file mode 100644 index 0000000000..a4341b679d Binary files /dev/null and b/mods/ca/maps/Amsterdamned-2v2-CA.oramap differ diff --git a/mods/ca/maps/Amsterdamned-3v3-CA.oramap b/mods/ca/maps/Amsterdamned-3v3-CA.oramap new file mode 100644 index 0000000000..c04b49580f Binary files /dev/null and b/mods/ca/maps/Amsterdamned-3v3-CA.oramap differ diff --git a/mods/ca/maps/Amsterdamned-4v4-CA.oramap b/mods/ca/maps/Amsterdamned-4v4-CA.oramap new file mode 100644 index 0000000000..85dffe3519 Binary files /dev/null and b/mods/ca/maps/Amsterdamned-4v4-CA.oramap differ diff --git a/mods/ca/maps/Argal_CA.oramap b/mods/ca/maps/Argal_CA.oramap index 0a23e183c4..1d5ed63dc3 100644 Binary files a/mods/ca/maps/Argal_CA.oramap and b/mods/ca/maps/Argal_CA.oramap differ diff --git a/mods/ca/maps/Armorgarden B.oramap b/mods/ca/maps/Armorgarden B.oramap index ba16b2308b..b1ed1f90eb 100644 Binary files a/mods/ca/maps/Armorgarden B.oramap and b/mods/ca/maps/Armorgarden B.oramap differ diff --git a/mods/ca/maps/Attack_CA.oramap b/mods/ca/maps/Attack_CA.oramap index 1a9f2886ba..70a342ec49 100644 Binary files a/mods/ca/maps/Attack_CA.oramap and b/mods/ca/maps/Attack_CA.oramap differ diff --git a/mods/ca/maps/Avalanche.oramap b/mods/ca/maps/Avalanche.oramap new file mode 100644 index 0000000000..0e5a0b4e9c Binary files /dev/null and b/mods/ca/maps/Avalanche.oramap differ diff --git a/mods/ca/maps/BackwoodFarms-CA.oramap b/mods/ca/maps/BackwoodFarms-CA.oramap index 19862f561b..46cd6c1cad 100644 Binary files a/mods/ca/maps/BackwoodFarms-CA.oramap and b/mods/ca/maps/BackwoodFarms-CA.oramap differ diff --git a/mods/ca/maps/BadgeredHillsCA.oramap b/mods/ca/maps/BadgeredHillsCA.oramap index d5105aa1d5..6e95256acd 100644 Binary files a/mods/ca/maps/BadgeredHillsCA.oramap and b/mods/ca/maps/BadgeredHillsCA.oramap differ diff --git a/mods/ca/maps/BattleLab2v2.oramap b/mods/ca/maps/BattleLab2v2.oramap new file mode 100644 index 0000000000..25f7bbb4b8 Binary files /dev/null and b/mods/ca/maps/BattleLab2v2.oramap differ diff --git a/mods/ca/maps/Beyond_Destruction_CA.oramap b/mods/ca/maps/Beyond_Destruction_CA.oramap index 9d22fe3658..a19c1389ab 100644 Binary files a/mods/ca/maps/Beyond_Destruction_CA.oramap and b/mods/ca/maps/Beyond_Destruction_CA.oramap differ diff --git a/mods/ca/maps/Black_Belt_CA.oramap b/mods/ca/maps/Black_Belt_CA.oramap index 32d00184d4..5ee62e1d5e 100644 Binary files a/mods/ca/maps/Black_Belt_CA.oramap and b/mods/ca/maps/Black_Belt_CA.oramap differ diff --git a/mods/ca/maps/Blood_Pit_CA.oramap b/mods/ca/maps/Blood_Pit_CA.oramap index 531865c4dd..c95ba7044b 100644 Binary files a/mods/ca/maps/Blood_Pit_CA.oramap and b/mods/ca/maps/Blood_Pit_CA.oramap differ diff --git a/mods/ca/maps/Bloody_Summer_CA.oramap b/mods/ca/maps/Bloody_Summer_CA.oramap new file mode 100644 index 0000000000..85cd5513ee Binary files /dev/null and b/mods/ca/maps/Bloody_Summer_CA.oramap differ diff --git a/mods/ca/maps/Buhayrat_Fuahat_Alburkan_CA.oramap b/mods/ca/maps/Buhayrat_Fuahat_Alburkan_CA.oramap index 138c19637b..51d683d2b5 100644 Binary files a/mods/ca/maps/Buhayrat_Fuahat_Alburkan_CA.oramap and b/mods/ca/maps/Buhayrat_Fuahat_Alburkan_CA.oramap differ diff --git a/mods/ca/maps/CaliforniaHighway.oramap b/mods/ca/maps/CaliforniaHighway.oramap new file mode 100644 index 0000000000..a581eeedec Binary files /dev/null and b/mods/ca/maps/CaliforniaHighway.oramap differ diff --git a/mods/ca/maps/Calming_Lakes_CA.oramap b/mods/ca/maps/Calming_Lakes_CA.oramap index d8b8e472bd..acdef72862 100644 Binary files a/mods/ca/maps/Calming_Lakes_CA.oramap and b/mods/ca/maps/Calming_Lakes_CA.oramap differ diff --git a/mods/ca/maps/Candyland_CA.oramap b/mods/ca/maps/Candyland_CA.oramap new file mode 100644 index 0000000000..ff8c86f7ec Binary files /dev/null and b/mods/ca/maps/Candyland_CA.oramap differ diff --git a/mods/ca/maps/Clearing_CA.oramap b/mods/ca/maps/Clearing_CA.oramap index fac3c19768..6eee678f99 100644 Binary files a/mods/ca/maps/Clearing_CA.oramap and b/mods/ca/maps/Clearing_CA.oramap differ diff --git a/mods/ca/maps/ClimateCrisisCA.oramap b/mods/ca/maps/ClimateCrisisCA.oramap index e5e46e0b56..3f79b82ad3 100644 Binary files a/mods/ca/maps/ClimateCrisisCA.oramap and b/mods/ca/maps/ClimateCrisisCA.oramap differ diff --git a/mods/ca/maps/CombinedEffortCA.oramap b/mods/ca/maps/CombinedEffortCA.oramap index 624cc9dda8..e4704e60f9 100644 Binary files a/mods/ca/maps/CombinedEffortCA.oramap and b/mods/ca/maps/CombinedEffortCA.oramap differ diff --git a/mods/ca/maps/Command_and_Control_1v1_CA.oramap b/mods/ca/maps/Command_and_Control_1v1_CA.oramap new file mode 100644 index 0000000000..9d8a37535f Binary files /dev/null and b/mods/ca/maps/Command_and_Control_1v1_CA.oramap differ diff --git a/mods/ca/maps/Command_and_Control_2v2_CA.oramap b/mods/ca/maps/Command_and_Control_2v2_CA.oramap new file mode 100644 index 0000000000..a880986902 Binary files /dev/null and b/mods/ca/maps/Command_and_Control_2v2_CA.oramap differ diff --git a/mods/ca/maps/Command_and_Control_3v3_CA.oramap b/mods/ca/maps/Command_and_Control_3v3_CA.oramap new file mode 100644 index 0000000000..55e70bbbb2 Binary files /dev/null and b/mods/ca/maps/Command_and_Control_3v3_CA.oramap differ diff --git a/mods/ca/maps/Corroder CA.oramap b/mods/ca/maps/Corroder CA.oramap index 24704e636d..1b6898abdc 100644 Binary files a/mods/ca/maps/Corroder CA.oramap and b/mods/ca/maps/Corroder CA.oramap differ diff --git a/mods/ca/maps/Countdown_CA.oramap b/mods/ca/maps/Countdown_CA.oramap new file mode 100644 index 0000000000..e26e0fe90e Binary files /dev/null and b/mods/ca/maps/Countdown_CA.oramap differ diff --git a/mods/ca/maps/Craven_CA.oramap b/mods/ca/maps/Craven_CA.oramap new file mode 100644 index 0000000000..a15dc7de85 Binary files /dev/null and b/mods/ca/maps/Craven_CA.oramap differ diff --git a/mods/ca/maps/Darkside_Aftermath_CA.oramap b/mods/ca/maps/Darkside_Aftermath_CA.oramap index 5a7a77addc..4b81dd72f6 100644 Binary files a/mods/ca/maps/Darkside_Aftermath_CA.oramap and b/mods/ca/maps/Darkside_Aftermath_CA.oramap differ diff --git a/mods/ca/maps/Decisive_CA.oramap b/mods/ca/maps/Decisive_CA.oramap new file mode 100644 index 0000000000..1ba8f3ccbd Binary files /dev/null and b/mods/ca/maps/Decisive_CA.oramap differ diff --git a/mods/ca/maps/Derisive_3v3_CA.oramap b/mods/ca/maps/Derisive_3v3_CA.oramap new file mode 100644 index 0000000000..6feb515842 Binary files /dev/null and b/mods/ca/maps/Derisive_3v3_CA.oramap differ diff --git a/mods/ca/maps/Derisive_4v4_CA.oramap b/mods/ca/maps/Derisive_4v4_CA.oramap new file mode 100644 index 0000000000..f6775096c9 Binary files /dev/null and b/mods/ca/maps/Derisive_4v4_CA.oramap differ diff --git a/mods/ca/maps/Derisive_5v5_CA.oramap b/mods/ca/maps/Derisive_5v5_CA.oramap new file mode 100644 index 0000000000..a19c2f0ffe Binary files /dev/null and b/mods/ca/maps/Derisive_5v5_CA.oramap differ diff --git a/mods/ca/maps/Descending_CA.oramap b/mods/ca/maps/Descending_CA.oramap index 01fffe162b..f1b0859df5 100644 Binary files a/mods/ca/maps/Descending_CA.oramap and b/mods/ca/maps/Descending_CA.oramap differ diff --git a/mods/ca/maps/Dryland_CA.oramap b/mods/ca/maps/Dryland_CA.oramap index 9ff1310903..ee4126af5a 100644 Binary files a/mods/ca/maps/Dryland_CA.oramap and b/mods/ca/maps/Dryland_CA.oramap differ diff --git a/mods/ca/maps/Duel-Islands-CA.oramap b/mods/ca/maps/Duel-Islands-CA.oramap new file mode 100644 index 0000000000..cdef812c2e Binary files /dev/null and b/mods/ca/maps/Duel-Islands-CA.oramap differ diff --git a/mods/ca/maps/Entanglements_CA.oramap b/mods/ca/maps/Entanglements_CA.oramap index fe933ea23c..362479dd46 100644 Binary files a/mods/ca/maps/Entanglements_CA.oramap and b/mods/ca/maps/Entanglements_CA.oramap differ diff --git a/mods/ca/maps/ErpNrthfrc.oramap b/mods/ca/maps/ErpNrthfrc.oramap index 66257ca11c..045f0d7947 100644 Binary files a/mods/ca/maps/ErpNrthfrc.oramap and b/mods/ca/maps/ErpNrthfrc.oramap differ diff --git a/mods/ca/maps/EruptingPlains_CA.oramap b/mods/ca/maps/EruptingPlains_CA.oramap new file mode 100644 index 0000000000..0fe4d89819 Binary files /dev/null and b/mods/ca/maps/EruptingPlains_CA.oramap differ diff --git a/mods/ca/maps/Eternal-Warriors-CA.oramap b/mods/ca/maps/Eternal-Warriors-CA.oramap index 260c2e731a..aa916de4cd 100644 Binary files a/mods/ca/maps/Eternal-Warriors-CA.oramap and b/mods/ca/maps/Eternal-Warriors-CA.oramap differ diff --git a/mods/ca/maps/Excavations_CA.oramap b/mods/ca/maps/Excavations_CA.oramap index 9cbe6d1734..451816141b 100644 Binary files a/mods/ca/maps/Excavations_CA.oramap and b/mods/ca/maps/Excavations_CA.oramap differ diff --git a/mods/ca/maps/Far_Out_CA.oramap b/mods/ca/maps/Far_Out_CA.oramap index 4c925e7aed..abc1d8deda 100644 Binary files a/mods/ca/maps/Far_Out_CA.oramap and b/mods/ca/maps/Far_Out_CA.oramap differ diff --git a/mods/ca/maps/Feral_Forests_CA.oramap b/mods/ca/maps/Feral_Forests_CA.oramap index ff91c2f2e2..6275252f8c 100644 Binary files a/mods/ca/maps/Feral_Forests_CA.oramap and b/mods/ca/maps/Feral_Forests_CA.oramap differ diff --git a/mods/ca/maps/Flowerbowl_CA.oramap b/mods/ca/maps/Flowerbowl_CA.oramap new file mode 100644 index 0000000000..fee49acb38 Binary files /dev/null and b/mods/ca/maps/Flowerbowl_CA.oramap differ diff --git a/mods/ca/maps/Focal_Point_CA.oramap b/mods/ca/maps/Focal_Point_CA.oramap index b38b06da0f..8b1a0dc18a 100644 Binary files a/mods/ca/maps/Focal_Point_CA.oramap and b/mods/ca/maps/Focal_Point_CA.oramap differ diff --git a/mods/ca/maps/Forgotten-Plains_CA.oramap b/mods/ca/maps/Forgotten-Plains_CA.oramap index 6a3713c300..49c68c7b57 100644 Binary files a/mods/ca/maps/Forgotten-Plains_CA.oramap and b/mods/ca/maps/Forgotten-Plains_CA.oramap differ diff --git a/mods/ca/maps/Frozen_Forests_1v1_CA.oramap b/mods/ca/maps/Frozen_Forests_1v1_CA.oramap new file mode 100644 index 0000000000..ba1b450bf1 Binary files /dev/null and b/mods/ca/maps/Frozen_Forests_1v1_CA.oramap differ diff --git a/mods/ca/maps/Frozen_Forests_2v2_CA.oramap b/mods/ca/maps/Frozen_Forests_2v2_CA.oramap new file mode 100644 index 0000000000..20925d8be7 Binary files /dev/null and b/mods/ca/maps/Frozen_Forests_2v2_CA.oramap differ diff --git a/mods/ca/maps/Frozen_Forests_3v3_CA.oramap b/mods/ca/maps/Frozen_Forests_3v3_CA.oramap new file mode 100644 index 0000000000..3a21459b1e Binary files /dev/null and b/mods/ca/maps/Frozen_Forests_3v3_CA.oramap differ diff --git a/mods/ca/maps/Frozen_Forests_4v4_CA.oramap b/mods/ca/maps/Frozen_Forests_4v4_CA.oramap new file mode 100644 index 0000000000..532db1c55e Binary files /dev/null and b/mods/ca/maps/Frozen_Forests_4v4_CA.oramap differ diff --git a/mods/ca/maps/Frozen_Forests_5v5_CA.oramap b/mods/ca/maps/Frozen_Forests_5v5_CA.oramap new file mode 100644 index 0000000000..127d691f0f Binary files /dev/null and b/mods/ca/maps/Frozen_Forests_5v5_CA.oramap differ diff --git a/mods/ca/maps/Gateways_CA.oramap b/mods/ca/maps/Gateways_CA.oramap index 8ac2983114..7a7fbdc39a 100644 Binary files a/mods/ca/maps/Gateways_CA.oramap and b/mods/ca/maps/Gateways_CA.oramap differ diff --git a/mods/ca/maps/Gold_Rush_CA.oramap b/mods/ca/maps/Gold_Rush_CA.oramap new file mode 100644 index 0000000000..c65344139e Binary files /dev/null and b/mods/ca/maps/Gold_Rush_CA.oramap differ diff --git a/mods/ca/maps/GrandCanyonCA.oramap b/mods/ca/maps/GrandCanyonCA.oramap index d459f03525..65148ad96d 100644 Binary files a/mods/ca/maps/GrandCanyonCA.oramap and b/mods/ca/maps/GrandCanyonCA.oramap differ diff --git a/mods/ca/maps/Hidebound_CA.oramap b/mods/ca/maps/Hidebound_CA.oramap index dd213bc24b..76e8205b0c 100644 Binary files a/mods/ca/maps/Hidebound_CA.oramap and b/mods/ca/maps/Hidebound_CA.oramap differ diff --git a/mods/ca/maps/Icebergs.oramap b/mods/ca/maps/Icebergs.oramap index efbe26269e..915bd2a523 100644 Binary files a/mods/ca/maps/Icebergs.oramap and b/mods/ca/maps/Icebergs.oramap differ diff --git a/mods/ca/maps/In_Crosshairs_CA.oramap b/mods/ca/maps/In_Crosshairs_CA.oramap index 5f6853c87c..4a48af3f0a 100644 Binary files a/mods/ca/maps/In_Crosshairs_CA.oramap and b/mods/ca/maps/In_Crosshairs_CA.oramap differ diff --git a/mods/ca/maps/Innocence_CA.oramap b/mods/ca/maps/Innocence_CA.oramap new file mode 100644 index 0000000000..8178dabe8b Binary files /dev/null and b/mods/ca/maps/Innocence_CA.oramap differ diff --git a/mods/ca/maps/Island Hoppers/map.yaml b/mods/ca/maps/Island Hoppers/map.yaml index 8af25a61d9..f955c78774 100644 --- a/mods/ca/maps/Island Hoppers/map.yaml +++ b/mods/ca/maps/Island Hoppers/map.yaml @@ -156,10 +156,10 @@ Actors: Owner: Neutral Location: 59,63 Actor35: brl3 - Owner: Neutral + Owner: Creeps Location: 59,65 Actor36: brl3 - Owner: Neutral + Owner: Creeps Location: 63,63 Actor37: arco Owner: Neutral diff --git a/mods/ca/maps/Jungle_Crossing_CA.oramap b/mods/ca/maps/Jungle_Crossing_CA.oramap new file mode 100644 index 0000000000..e22fcee48a Binary files /dev/null and b/mods/ca/maps/Jungle_Crossing_CA.oramap differ diff --git a/mods/ca/maps/Keep Off The Grass II J.oramap b/mods/ca/maps/Keep Off The Grass II J.oramap index 52c2f32fc2..72af8a5804 100644 Binary files a/mods/ca/maps/Keep Off The Grass II J.oramap and b/mods/ca/maps/Keep Off The Grass II J.oramap differ diff --git a/mods/ca/maps/Kholodnyy_Kholm_CA.oramap b/mods/ca/maps/Kholodnyy_Kholm_CA.oramap index cbdfed3cea..b6abef9299 100644 Binary files a/mods/ca/maps/Kholodnyy_Kholm_CA.oramap and b/mods/ca/maps/Kholodnyy_Kholm_CA.oramap differ diff --git a/mods/ca/maps/Kinahmi_CA.oramap b/mods/ca/maps/Kinahmi_CA.oramap index 29d2d5c656..e2dcdcd818 100644 Binary files a/mods/ca/maps/Kinahmi_CA.oramap and b/mods/ca/maps/Kinahmi_CA.oramap differ diff --git a/mods/ca/maps/Kitsunegari_CA.oramap b/mods/ca/maps/Kitsunegari_CA.oramap index 6a8e5f5495..6594d7ceeb 100644 Binary files a/mods/ca/maps/Kitsunegari_CA.oramap and b/mods/ca/maps/Kitsunegari_CA.oramap differ diff --git a/mods/ca/maps/Kosovo_5v5_CA.oramap b/mods/ca/maps/Kosovo_5v5_CA.oramap new file mode 100644 index 0000000000..fc546b1178 Binary files /dev/null and b/mods/ca/maps/Kosovo_5v5_CA.oramap differ diff --git a/mods/ca/maps/Labyrinthine_CA.oramap b/mods/ca/maps/Labyrinthine_CA.oramap index 2b468cd814..1e250b2378 100644 Binary files a/mods/ca/maps/Labyrinthine_CA.oramap and b/mods/ca/maps/Labyrinthine_CA.oramap differ diff --git a/mods/ca/maps/Land_Locked_CA.oramap b/mods/ca/maps/Land_Locked_CA.oramap index 639f6b6195..93e3938971 100644 Binary files a/mods/ca/maps/Land_Locked_CA.oramap and b/mods/ca/maps/Land_Locked_CA.oramap differ diff --git a/mods/ca/maps/Manan_Majat_CA.oramap b/mods/ca/maps/Manan_Majat_CA.oramap index dee1edcca9..b917733e22 100644 Binary files a/mods/ca/maps/Manan_Majat_CA.oramap and b/mods/ca/maps/Manan_Majat_CA.oramap differ diff --git a/mods/ca/maps/MapleSeeds_CA.oramap b/mods/ca/maps/MapleSeeds_CA.oramap new file mode 100644 index 0000000000..a56660a727 Binary files /dev/null and b/mods/ca/maps/MapleSeeds_CA.oramap differ diff --git a/mods/ca/maps/MarigoldTown-CA.oramap b/mods/ca/maps/MarigoldTown-CA.oramap deleted file mode 100644 index fad203b946..0000000000 Binary files a/mods/ca/maps/MarigoldTown-CA.oramap and /dev/null differ diff --git a/mods/ca/maps/MarigoldTown_2v2_CA.oramap b/mods/ca/maps/MarigoldTown_2v2_CA.oramap new file mode 100644 index 0000000000..f28f234bfe Binary files /dev/null and b/mods/ca/maps/MarigoldTown_2v2_CA.oramap differ diff --git a/mods/ca/maps/MarigoldTown_3v3_CA.oramap b/mods/ca/maps/MarigoldTown_3v3_CA.oramap new file mode 100644 index 0000000000..7824a74b1c Binary files /dev/null and b/mods/ca/maps/MarigoldTown_3v3_CA.oramap differ diff --git a/mods/ca/maps/Marigold_Town_4v4_CA.oramap b/mods/ca/maps/Marigold_Town_4v4_CA.oramap new file mode 100644 index 0000000000..0a01c9e246 Binary files /dev/null and b/mods/ca/maps/Marigold_Town_4v4_CA.oramap differ diff --git a/mods/ca/maps/Marigold_Town_5v5_CA.oramap b/mods/ca/maps/Marigold_Town_5v5_CA.oramap new file mode 100644 index 0000000000..481bb532d8 Binary files /dev/null and b/mods/ca/maps/Marigold_Town_5v5_CA.oramap differ diff --git a/mods/ca/maps/Marigold_Town_CA.oramap b/mods/ca/maps/Marigold_Town_CA.oramap new file mode 100644 index 0000000000..9d760cd1e5 Binary files /dev/null and b/mods/ca/maps/Marigold_Town_CA.oramap differ diff --git a/mods/ca/maps/Megara_CA.oramap b/mods/ca/maps/Megara_CA.oramap index f43b5f48d2..d1f59bdd0b 100644 Binary files a/mods/ca/maps/Megara_CA.oramap and b/mods/ca/maps/Megara_CA.oramap differ diff --git a/mods/ca/maps/Moldova_6v6_CA.oramap b/mods/ca/maps/Moldova_6v6_CA.oramap new file mode 100644 index 0000000000..6d9885fff3 Binary files /dev/null and b/mods/ca/maps/Moldova_6v6_CA.oramap differ diff --git a/mods/ca/maps/Negligent_Management_CA.oramap b/mods/ca/maps/Negligent_Management_CA.oramap index 4e9d0df42e..e8e9bb08a6 100644 Binary files a/mods/ca/maps/Negligent_Management_CA.oramap and b/mods/ca/maps/Negligent_Management_CA.oramap differ diff --git a/mods/ca/maps/Nomad_CA.oramap b/mods/ca/maps/Nomad_CA.oramap index 1d47645455..8691286464 100644 Binary files a/mods/ca/maps/Nomad_CA.oramap and b/mods/ca/maps/Nomad_CA.oramap differ diff --git a/mods/ca/maps/Off-my-lawn-punks-ca.oramap b/mods/ca/maps/Off-my-lawn-punks-ca.oramap index 30300c4a6d..d3974941dd 100644 Binary files a/mods/ca/maps/Off-my-lawn-punks-ca.oramap and b/mods/ca/maps/Off-my-lawn-punks-ca.oramap differ diff --git a/mods/ca/maps/Ordeal_By_Fire_2v2_CA.oramap b/mods/ca/maps/Ordeal_By_Fire_2v2_CA.oramap new file mode 100644 index 0000000000..c7a130a105 Binary files /dev/null and b/mods/ca/maps/Ordeal_By_Fire_2v2_CA.oramap differ diff --git a/mods/ca/maps/Ordeal_By_Fire_3v3_CA.oramap b/mods/ca/maps/Ordeal_By_Fire_3v3_CA.oramap new file mode 100644 index 0000000000..3410368a26 Binary files /dev/null and b/mods/ca/maps/Ordeal_By_Fire_3v3_CA.oramap differ diff --git a/mods/ca/maps/Ordeal_By_Fire_4v4_CA.oramap b/mods/ca/maps/Ordeal_By_Fire_4v4_CA.oramap new file mode 100644 index 0000000000..66760b2415 Binary files /dev/null and b/mods/ca/maps/Ordeal_By_Fire_4v4_CA.oramap differ diff --git a/mods/ca/maps/Over_the_Edge_CA.oramap b/mods/ca/maps/Over_the_Edge_CA.oramap index 4f887ce2b7..db879520ef 100644 Binary files a/mods/ca/maps/Over_the_Edge_CA.oramap and b/mods/ca/maps/Over_the_Edge_CA.oramap differ diff --git a/mods/ca/maps/Paradisio_CA.oramap b/mods/ca/maps/Paradisio_CA.oramap index 23e494d85b..c8b15faa1f 100644 Binary files a/mods/ca/maps/Paradisio_CA.oramap and b/mods/ca/maps/Paradisio_CA.oramap differ diff --git a/mods/ca/maps/Raided_Seas_CA.oramap b/mods/ca/maps/Raided_Seas_CA.oramap index 1971744b83..e0d0d011f3 100644 Binary files a/mods/ca/maps/Raided_Seas_CA.oramap and b/mods/ca/maps/Raided_Seas_CA.oramap differ diff --git a/mods/ca/maps/Reign_in_Hell_CA.oramap b/mods/ca/maps/Reign_in_Hell_CA.oramap index 976e8bf0d4..c182cd92da 100644 Binary files a/mods/ca/maps/Reign_in_Hell_CA.oramap and b/mods/ca/maps/Reign_in_Hell_CA.oramap differ diff --git a/mods/ca/maps/Retaliation_X_CA.oramap b/mods/ca/maps/Retaliation_X_CA.oramap index bfecf4b374..adcfe128fb 100644 Binary files a/mods/ca/maps/Retaliation_X_CA.oramap and b/mods/ca/maps/Retaliation_X_CA.oramap differ diff --git a/mods/ca/maps/RidgesCA.oramap b/mods/ca/maps/RidgesCA.oramap index 4255b0e0ea..ad8b328af0 100644 Binary files a/mods/ca/maps/RidgesCA.oramap and b/mods/ca/maps/RidgesCA.oramap differ diff --git a/mods/ca/maps/Saddleback_CA.oramap b/mods/ca/maps/Saddleback_CA.oramap new file mode 100644 index 0000000000..4bb56ddaa1 Binary files /dev/null and b/mods/ca/maps/Saddleback_CA.oramap differ diff --git a/mods/ca/maps/Seal_Shore_CA.oramap b/mods/ca/maps/Seal_Shore_CA.oramap index d1f5fa8fae..31e873888b 100644 Binary files a/mods/ca/maps/Seal_Shore_CA.oramap and b/mods/ca/maps/Seal_Shore_CA.oramap differ diff --git a/mods/ca/maps/Seventh_Woods_3v3_CA.oramap b/mods/ca/maps/Seventh_Woods_3v3_CA.oramap new file mode 100644 index 0000000000..ecc843adfa Binary files /dev/null and b/mods/ca/maps/Seventh_Woods_3v3_CA.oramap differ diff --git a/mods/ca/maps/Seventh_Woods_4v4_CA.oramap b/mods/ca/maps/Seventh_Woods_4v4_CA.oramap new file mode 100644 index 0000000000..791a470366 Binary files /dev/null and b/mods/ca/maps/Seventh_Woods_4v4_CA.oramap differ diff --git a/mods/ca/maps/Seventh_Woods_5v5_CA.oramap b/mods/ca/maps/Seventh_Woods_5v5_CA.oramap new file mode 100644 index 0000000000..cdc72ef5df Binary files /dev/null and b/mods/ca/maps/Seventh_Woods_5v5_CA.oramap differ diff --git a/mods/ca/maps/Seventh_Woods_CA.oramap b/mods/ca/maps/Seventh_Woods_CA.oramap index e6b7c5f055..7cafcccd50 100644 Binary files a/mods/ca/maps/Seventh_Woods_CA.oramap and b/mods/ca/maps/Seventh_Woods_CA.oramap differ diff --git a/mods/ca/maps/Shadegrown_CA.oramap b/mods/ca/maps/Shadegrown_CA.oramap index 03a853dccd..52bcda527a 100644 Binary files a/mods/ca/maps/Shadegrown_CA.oramap and b/mods/ca/maps/Shadegrown_CA.oramap differ diff --git a/mods/ca/maps/Shadowfiend_2v2_CA.oramap b/mods/ca/maps/Shadowfiend_2v2_CA.oramap new file mode 100644 index 0000000000..6c4c88ebce Binary files /dev/null and b/mods/ca/maps/Shadowfiend_2v2_CA.oramap differ diff --git a/mods/ca/maps/Shadowfiend_3v3_CA.oramap b/mods/ca/maps/Shadowfiend_3v3_CA.oramap new file mode 100644 index 0000000000..1381a55dbd Binary files /dev/null and b/mods/ca/maps/Shadowfiend_3v3_CA.oramap differ diff --git a/mods/ca/maps/Shadowfiend_4v4_CA.oramap b/mods/ca/maps/Shadowfiend_4v4_CA.oramap new file mode 100644 index 0000000000..dd84982f96 Binary files /dev/null and b/mods/ca/maps/Shadowfiend_4v4_CA.oramap differ diff --git a/mods/ca/maps/Shadowfiend_II_CA.oramap b/mods/ca/maps/Shadowfiend_II_CA.oramap index 4a3568c572..83b90a5ce1 100644 Binary files a/mods/ca/maps/Shadowfiend_II_CA.oramap and b/mods/ca/maps/Shadowfiend_II_CA.oramap differ diff --git a/mods/ca/maps/Siberian-Pass.oramap b/mods/ca/maps/Siberian-Pass.oramap index e42619bbae..9488d1a7f0 100644 Binary files a/mods/ca/maps/Siberian-Pass.oramap and b/mods/ca/maps/Siberian-Pass.oramap differ diff --git a/mods/ca/maps/Sleet_CA.oramap b/mods/ca/maps/Sleet_CA.oramap new file mode 100644 index 0000000000..74d6e935d0 Binary files /dev/null and b/mods/ca/maps/Sleet_CA.oramap differ diff --git a/mods/ca/maps/Slippery_Slopes_CA.oramap b/mods/ca/maps/Slippery_Slopes_CA.oramap index 59dc0bd5ea..cd3433311b 100644 Binary files a/mods/ca/maps/Slippery_Slopes_CA.oramap and b/mods/ca/maps/Slippery_Slopes_CA.oramap differ diff --git a/mods/ca/maps/Snake_Woods_2v2_CA.oramap b/mods/ca/maps/Snake_Woods_2v2_CA.oramap new file mode 100644 index 0000000000..d3ff82a739 Binary files /dev/null and b/mods/ca/maps/Snake_Woods_2v2_CA.oramap differ diff --git a/mods/ca/maps/Snake_Woods_3v3_CA.oramap b/mods/ca/maps/Snake_Woods_3v3_CA.oramap new file mode 100644 index 0000000000..cd8819b35f Binary files /dev/null and b/mods/ca/maps/Snake_Woods_3v3_CA.oramap differ diff --git a/mods/ca/maps/Snake_Woods_4v4_CA.oramap b/mods/ca/maps/Snake_Woods_4v4_CA.oramap new file mode 100644 index 0000000000..ec04e5260f Binary files /dev/null and b/mods/ca/maps/Snake_Woods_4v4_CA.oramap differ diff --git a/mods/ca/maps/Snake_Woods_5v5_CA.oramap b/mods/ca/maps/Snake_Woods_5v5_CA.oramap new file mode 100644 index 0000000000..216bb3d340 Binary files /dev/null and b/mods/ca/maps/Snake_Woods_5v5_CA.oramap differ diff --git a/mods/ca/maps/Snake_Woods_CA.oramap b/mods/ca/maps/Snake_Woods_CA.oramap index e622dff78e..bb8af163fe 100644 Binary files a/mods/ca/maps/Snake_Woods_CA.oramap and b/mods/ca/maps/Snake_Woods_CA.oramap differ diff --git a/mods/ca/maps/Snowy Island/rules.yaml b/mods/ca/maps/Snowy Island/rules.yaml index 551470f81f..4bba4f8d15 100644 --- a/mods/ca/maps/Snowy Island/rules.yaml +++ b/mods/ca/maps/Snowy Island/rules.yaml @@ -1,15 +1,11 @@ -World: +^Palettes: WeatherOverlay: - ParticleDensityFactor: 7 - ChangingWindLevel: true - WindLevels: -2, 0, 2 - WindTick: 150, 550 - InstantWindChanges: false - UseSquares: true + ParticleDensityFactor: 6 + WindLevels: -5, 0, 5 + WindTick: 150, 425 ParticleSize: 1, 3 - ScatterDirection: 0, 0 - Gravity: 0.50, 1.50 - SwingOffset: 1, 2 - SwingSpeed: 0.01, 0.02 + ScatterDirection: -12, 12 + Gravity: 16, 24 + SwingSpeed: 0.01, 0.05 SwingAmplitude: 0, 0 ParticleColors: fbfbfb90, f4f4f480, f1f1f1, ffffff50 diff --git a/mods/ca/maps/Solace-CA.oramap b/mods/ca/maps/Solace-CA.oramap index fb62f10332..f46dfa1d64 100644 Binary files a/mods/ca/maps/Solace-CA.oramap and b/mods/ca/maps/Solace-CA.oramap differ diff --git a/mods/ca/maps/Strashno_CA.oramap b/mods/ca/maps/Strashno_CA.oramap index 739345fe07..0c464a28e3 100644 Binary files a/mods/ca/maps/Strashno_CA.oramap and b/mods/ca/maps/Strashno_CA.oramap differ diff --git a/mods/ca/maps/Sunny_Sands_CA.oramap b/mods/ca/maps/Sunny_Sands_CA.oramap index ae390dfad8..66b3447ef6 100644 Binary files a/mods/ca/maps/Sunny_Sands_CA.oramap and b/mods/ca/maps/Sunny_Sands_CA.oramap differ diff --git a/mods/ca/maps/Syzygy_CA.oramap b/mods/ca/maps/Syzygy_CA.oramap index 62a1832425..8fac19d915 100644 Binary files a/mods/ca/maps/Syzygy_CA.oramap and b/mods/ca/maps/Syzygy_CA.oramap differ diff --git a/mods/ca/maps/Terracotta_CA.oramap b/mods/ca/maps/Terracotta_CA.oramap new file mode 100644 index 0000000000..2a5ca81311 Binary files /dev/null and b/mods/ca/maps/Terracotta_CA.oramap differ diff --git a/mods/ca/maps/Terran_Thrasher_CA.oramap b/mods/ca/maps/Terran_Thrasher_CA.oramap index 19f1984e16..41268e7d8f 100644 Binary files a/mods/ca/maps/Terran_Thrasher_CA.oramap and b/mods/ca/maps/Terran_Thrasher_CA.oramap differ diff --git a/mods/ca/maps/Teufelsberg_CA.oramap b/mods/ca/maps/Teufelsberg_CA.oramap index 088e4faba3..d7ce27f038 100644 Binary files a/mods/ca/maps/Teufelsberg_CA.oramap and b/mods/ca/maps/Teufelsberg_CA.oramap differ diff --git a/mods/ca/maps/The Waste Must Flow/map.yaml b/mods/ca/maps/The Waste Must Flow/map.yaml index a31c711a63..571eb3447b 100644 --- a/mods/ca/maps/The Waste Must Flow/map.yaml +++ b/mods/ca/maps/The Waste Must Flow/map.yaml @@ -440,25 +440,4 @@ Actors: Owner: Neutral Location: 34,31 -Rules: - World: - WeatherOverlay@RAIN: - ParticleDensityFactor: 2 - ChangingWindLevel: true - WindLevels: -3, -2, 0, 2, 3 - WindTick: 150, 550 - InstantWindChanges: false - UseSquares: false - ParticleSize: 0, 0 - ScatterDirection: 0, 0 - Gravity: 12.00, 16.00 - SwingOffset: 0, 0 - SwingSpeed: 0, 0 - SwingAmplitude: 0, 0 - ParticleColors: a5ab7d, a3ab87, 94a37a, 8d9c81, 95a391 - LineTailAlphaValue: 150 - GlobalLightingPaletteEffect: - Red: 0.9 - Green: 1 - Blue: 0.85 - Ambient: 1.15 +Rules: rules.yaml diff --git a/mods/ca/maps/The Waste Must Flow/rules.yaml b/mods/ca/maps/The Waste Must Flow/rules.yaml new file mode 100644 index 0000000000..a5efdabdd5 --- /dev/null +++ b/mods/ca/maps/The Waste Must Flow/rules.yaml @@ -0,0 +1,19 @@ +^Palettes: + WeatherOverlay: + ParticleDensityFactor: 2 + WindLevels: -8, -5, 0, 5, 8 + WindTick: 150, 425 + UseSquares: false + ParticleSize: 1, 1 + ScatterDirection: 0, 0 + Gravity: 45.00, 55.00 + SwingOffset: 0, 0 + SwingSpeed: 0, 0 + SwingAmplitude: 0, 0 + ParticleColors: a5ab7d, a3ab87, 94a37a, 8d9c81, 95a391 + LineTailAlphaValue: 50 + TintPostProcessEffect: + Red: 0.9 + Green: 1 + Blue: 0.85 + Ambient: 1.15 diff --git a/mods/ca/maps/The_Ravine_CA.oramap b/mods/ca/maps/The_Ravine_CA.oramap index b087c32d7f..fa7d87d613 100644 Binary files a/mods/ca/maps/The_Ravine_CA.oramap and b/mods/ca/maps/The_Ravine_CA.oramap differ diff --git a/mods/ca/maps/Three-and-a-half-woods_CA.oramap b/mods/ca/maps/Three-and-a-half-woods_CA.oramap index 707bf4664d..4bf7cea7a8 100644 Binary files a/mods/ca/maps/Three-and-a-half-woods_CA.oramap and b/mods/ca/maps/Three-and-a-half-woods_CA.oramap differ diff --git a/mods/ca/maps/TimianCA.oramap b/mods/ca/maps/TimianCA.oramap index 0439997001..286389929d 100644 Binary files a/mods/ca/maps/TimianCA.oramap and b/mods/ca/maps/TimianCA.oramap differ diff --git a/mods/ca/maps/Tortuous_3v3_CA.oramap b/mods/ca/maps/Tortuous_3v3_CA.oramap new file mode 100644 index 0000000000..b5263f30a8 Binary files /dev/null and b/mods/ca/maps/Tortuous_3v3_CA.oramap differ diff --git a/mods/ca/maps/Tortuous_4v4_CA.oramap b/mods/ca/maps/Tortuous_4v4_CA.oramap new file mode 100644 index 0000000000..5698122ddc Binary files /dev/null and b/mods/ca/maps/Tortuous_4v4_CA.oramap differ diff --git a/mods/ca/maps/Tortuous_5v5_CA.oramap b/mods/ca/maps/Tortuous_5v5_CA.oramap new file mode 100644 index 0000000000..5e9a49c1f3 Binary files /dev/null and b/mods/ca/maps/Tortuous_5v5_CA.oramap differ diff --git a/mods/ca/maps/Tortuous_6v6_CA.oramap b/mods/ca/maps/Tortuous_6v6_CA.oramap new file mode 100644 index 0000000000..71093eb0d5 Binary files /dev/null and b/mods/ca/maps/Tortuous_6v6_CA.oramap differ diff --git a/mods/ca/maps/Toxicity_CA.oramap b/mods/ca/maps/Toxicity_CA.oramap index 12b3098ce4..fb8eb00363 100644 Binary files a/mods/ca/maps/Toxicity_CA.oramap and b/mods/ca/maps/Toxicity_CA.oramap differ diff --git a/mods/ca/maps/Trapped-CA.oramap b/mods/ca/maps/Trapped-CA.oramap index babc93907b..fe6cc415e0 100644 Binary files a/mods/ca/maps/Trapped-CA.oramap and b/mods/ca/maps/Trapped-CA.oramap differ diff --git a/mods/ca/maps/Tuonela_CA.oramap b/mods/ca/maps/Tuonela_CA.oramap index d480eddbc2..980cc7f795 100644 Binary files a/mods/ca/maps/Tuonela_CA.oramap and b/mods/ca/maps/Tuonela_CA.oramap differ diff --git a/mods/ca/maps/TwinPeaks3v3CA.oramap b/mods/ca/maps/TwinPeaks3v3CA.oramap index d9ba0994c7..4b299c8db0 100644 Binary files a/mods/ca/maps/TwinPeaks3v3CA.oramap and b/mods/ca/maps/TwinPeaks3v3CA.oramap differ diff --git a/mods/ca/maps/TwinPeaksCA.oramap b/mods/ca/maps/TwinPeaksCA.oramap index 592e2eb196..312a252648 100644 Binary files a/mods/ca/maps/TwinPeaksCA.oramap and b/mods/ca/maps/TwinPeaksCA.oramap differ diff --git a/mods/ca/maps/Up_For_A_Night_Disaster_2v2_CA.oramap b/mods/ca/maps/Up_For_A_Night_Disaster_2v2_CA.oramap new file mode 100644 index 0000000000..2f1f428218 Binary files /dev/null and b/mods/ca/maps/Up_For_A_Night_Disaster_2v2_CA.oramap differ diff --git a/mods/ca/maps/Up_For_A_Night_Disaster_3v3_CA.oramap b/mods/ca/maps/Up_For_A_Night_Disaster_3v3_CA.oramap new file mode 100644 index 0000000000..bea37741b0 Binary files /dev/null and b/mods/ca/maps/Up_For_A_Night_Disaster_3v3_CA.oramap differ diff --git a/mods/ca/maps/Up_For_A_Night_Disaster_4v4_CA.oramap b/mods/ca/maps/Up_For_A_Night_Disaster_4v4_CA.oramap new file mode 100644 index 0000000000..562158a5d7 Binary files /dev/null and b/mods/ca/maps/Up_For_A_Night_Disaster_4v4_CA.oramap differ diff --git a/mods/ca/maps/Up_For_A_Night_Disaster_5v5_CA.oramap b/mods/ca/maps/Up_For_A_Night_Disaster_5v5_CA.oramap new file mode 100644 index 0000000000..18d62b6de4 Binary files /dev/null and b/mods/ca/maps/Up_For_A_Night_Disaster_5v5_CA.oramap differ diff --git a/mods/ca/maps/Utter_Darkness_CA.oramap b/mods/ca/maps/Utter_Darkness_CA.oramap index 45f8100024..c71c0cba1c 100644 Binary files a/mods/ca/maps/Utter_Darkness_CA.oramap and b/mods/ca/maps/Utter_Darkness_CA.oramap differ diff --git a/mods/ca/maps/Wild_West_CA.oramap b/mods/ca/maps/Wild_West_CA.oramap index a038a1bda3..8700b84f1a 100644 Binary files a/mods/ca/maps/Wild_West_CA.oramap and b/mods/ca/maps/Wild_West_CA.oramap differ diff --git a/mods/ca/maps/Ysmir_CA.oramap b/mods/ca/maps/Ysmir_CA.oramap index 5f5f1a146a..dc7188a6e8 100644 Binary files a/mods/ca/maps/Ysmir_CA.oramap and b/mods/ca/maps/Ysmir_CA.oramap differ diff --git a/mods/ca/maps/a-nuclear-winter.oramap b/mods/ca/maps/a-nuclear-winter.oramap index 7a2595c00f..64b9c3a911 100644 Binary files a/mods/ca/maps/a-nuclear-winter.oramap and b/mods/ca/maps/a-nuclear-winter.oramap differ diff --git a/mods/ca/maps/a-path-beyond.oramap b/mods/ca/maps/a-path-beyond.oramap index 683f4391f2..7518a9bbb0 100644 Binary files a/mods/ca/maps/a-path-beyond.oramap and b/mods/ca/maps/a-path-beyond.oramap differ diff --git a/mods/ca/maps/abendland-ca.oramap b/mods/ca/maps/abendland-ca.oramap new file mode 100644 index 0000000000..f99e081951 Binary files /dev/null and b/mods/ca/maps/abendland-ca.oramap differ diff --git a/mods/ca/maps/abrasion-3v3.oramap b/mods/ca/maps/abrasion-3v3.oramap new file mode 100644 index 0000000000..6bf959014f Binary files /dev/null and b/mods/ca/maps/abrasion-3v3.oramap differ diff --git a/mods/ca/maps/abrasion-4v4.oramap b/mods/ca/maps/abrasion-4v4.oramap new file mode 100644 index 0000000000..dbfe1955a0 Binary files /dev/null and b/mods/ca/maps/abrasion-4v4.oramap differ diff --git a/mods/ca/maps/acropolis-ca.oramap b/mods/ca/maps/acropolis-ca.oramap index ffd3bb6782..e7b195fb9b 100644 Binary files a/mods/ca/maps/acropolis-ca.oramap and b/mods/ca/maps/acropolis-ca.oramap differ diff --git a/mods/ca/maps/agenda.oramap b/mods/ca/maps/agenda.oramap index 352cc1f312..f0a2ff8e26 100644 Binary files a/mods/ca/maps/agenda.oramap and b/mods/ca/maps/agenda.oramap differ diff --git a/mods/ca/maps/agita-ca.oramap b/mods/ca/maps/agita-ca.oramap index f443f02268..da0460f2f5 100644 Binary files a/mods/ca/maps/agita-ca.oramap and b/mods/ca/maps/agita-ca.oramap differ diff --git a/mods/ca/maps/alaska-anarchy-redux.oramap b/mods/ca/maps/alaska-anarchy-redux.oramap index 6cbadf7603..84695c3b93 100644 Binary files a/mods/ca/maps/alaska-anarchy-redux.oramap and b/mods/ca/maps/alaska-anarchy-redux.oramap differ diff --git a/mods/ca/maps/algeria-ca.oramap b/mods/ca/maps/algeria-ca.oramap new file mode 100644 index 0000000000..cf2f65c6f9 Binary files /dev/null and b/mods/ca/maps/algeria-ca.oramap differ diff --git a/mods/ca/maps/all-connected.oramap b/mods/ca/maps/all-connected.oramap index 50dfe09bd5..a66b94f781 100644 Binary files a/mods/ca/maps/all-connected.oramap and b/mods/ca/maps/all-connected.oramap differ diff --git a/mods/ca/maps/altercation-5v5-ca.oramap b/mods/ca/maps/altercation-5v5-ca.oramap new file mode 100644 index 0000000000..4f024f28bf Binary files /dev/null and b/mods/ca/maps/altercation-5v5-ca.oramap differ diff --git a/mods/ca/maps/amsterdamned-ca.oramap b/mods/ca/maps/amsterdamned-ca.oramap index 03ed0d795e..94eac7fd0b 100644 Binary files a/mods/ca/maps/amsterdamned-ca.oramap and b/mods/ca/maps/amsterdamned-ca.oramap differ diff --git a/mods/ca/maps/anar-ca.oramap b/mods/ca/maps/anar-ca.oramap new file mode 100644 index 0000000000..6d89b7f5c1 Binary files /dev/null and b/mods/ca/maps/anar-ca.oramap differ diff --git a/mods/ca/maps/annihilate-ca.oramap b/mods/ca/maps/annihilate-ca.oramap index 892d6a1fda..ff9d1b4a63 100644 Binary files a/mods/ca/maps/annihilate-ca.oramap and b/mods/ca/maps/annihilate-ca.oramap differ diff --git a/mods/ca/maps/anomaly16-ca.oramap b/mods/ca/maps/anomaly16-ca.oramap index 512972e000..2659d2b28f 100644 Binary files a/mods/ca/maps/anomaly16-ca.oramap and b/mods/ca/maps/anomaly16-ca.oramap differ diff --git a/mods/ca/maps/aqueducts-ca.oramap b/mods/ca/maps/aqueducts-ca.oramap index d8b557c0c3..710064894a 100644 Binary files a/mods/ca/maps/aqueducts-ca.oramap and b/mods/ca/maps/aqueducts-ca.oramap differ diff --git a/mods/ca/maps/ardennes-ca.oramap b/mods/ca/maps/ardennes-ca.oramap index b35e7af049..97ac6f654c 100644 Binary files a/mods/ca/maps/ardennes-ca.oramap and b/mods/ca/maps/ardennes-ca.oramap differ diff --git a/mods/ca/maps/ascent.oramap b/mods/ca/maps/ascent.oramap index 54ca838a7a..d3f87eb3aa 100644 Binary files a/mods/ca/maps/ascent.oramap and b/mods/ca/maps/ascent.oramap differ diff --git a/mods/ca/maps/ascribed-admonition-ca.oramap b/mods/ca/maps/ascribed-admonition-ca.oramap new file mode 100644 index 0000000000..9fe94c4602 Binary files /dev/null and b/mods/ca/maps/ascribed-admonition-ca.oramap differ diff --git a/mods/ca/maps/assault-ca.oramap b/mods/ca/maps/assault-ca.oramap new file mode 100644 index 0000000000..2adf12b216 Binary files /dev/null and b/mods/ca/maps/assault-ca.oramap differ diff --git a/mods/ca/maps/asymmetric-battle-ca.oramap b/mods/ca/maps/asymmetric-battle-ca.oramap index 33d2f34482..39774efb9a 100644 Binary files a/mods/ca/maps/asymmetric-battle-ca.oramap and b/mods/ca/maps/asymmetric-battle-ca.oramap differ diff --git a/mods/ca/maps/asymmetric-battle.oramap b/mods/ca/maps/asymmetric-battle.oramap index e161dd7242..fc9c9c3833 100644 Binary files a/mods/ca/maps/asymmetric-battle.oramap and b/mods/ca/maps/asymmetric-battle.oramap differ diff --git a/mods/ca/maps/autumn-mix-ca.oramap b/mods/ca/maps/autumn-mix-ca.oramap new file mode 100644 index 0000000000..5629c04f25 Binary files /dev/null and b/mods/ca/maps/autumn-mix-ca.oramap differ diff --git a/mods/ca/maps/backup-ca.oramap b/mods/ca/maps/backup-ca.oramap index 06b57d7f80..7e4e42e934 100644 Binary files a/mods/ca/maps/backup-ca.oramap and b/mods/ca/maps/backup-ca.oramap differ diff --git a/mods/ca/maps/badcompany-ca.oramap b/mods/ca/maps/badcompany-ca.oramap index ae6627fdb9..8aa885ae8a 100644 Binary files a/mods/ca/maps/badcompany-ca.oramap and b/mods/ca/maps/badcompany-ca.oramap differ diff --git a/mods/ca/maps/barracuda.oramap b/mods/ca/maps/barracuda.oramap index 1bfe77e040..553db0e65f 100644 Binary files a/mods/ca/maps/barracuda.oramap and b/mods/ca/maps/barracuda.oramap differ diff --git a/mods/ca/maps/basalt-badlands-ca.oramap b/mods/ca/maps/basalt-badlands-ca.oramap new file mode 100644 index 0000000000..b60a221c01 Binary files /dev/null and b/mods/ca/maps/basalt-badlands-ca.oramap differ diff --git a/mods/ca/maps/behind-the-curtain-ca.oramap b/mods/ca/maps/behind-the-curtain-ca.oramap index bdc69ae4ac..d3bc587266 100644 Binary files a/mods/ca/maps/behind-the-curtain-ca.oramap and b/mods/ca/maps/behind-the-curtain-ca.oramap differ diff --git a/mods/ca/maps/behind-the-veil.oramap b/mods/ca/maps/behind-the-veil.oramap index 4875d27ba7..8bc0c4b9e0 100644 Binary files a/mods/ca/maps/behind-the-veil.oramap and b/mods/ca/maps/behind-the-veil.oramap differ diff --git a/mods/ca/maps/belligerent-ca.oramap b/mods/ca/maps/belligerent-ca.oramap index effd293b7e..b27ac49078 100644 Binary files a/mods/ca/maps/belligerent-ca.oramap and b/mods/ca/maps/belligerent-ca.oramap differ diff --git a/mods/ca/maps/belowzero-ca.oramap b/mods/ca/maps/belowzero-ca.oramap index 736b00845a..fa25e7efe6 100644 Binary files a/mods/ca/maps/belowzero-ca.oramap and b/mods/ca/maps/belowzero-ca.oramap differ diff --git a/mods/ca/maps/bloody-winter-ca.oramap b/mods/ca/maps/bloody-winter-ca.oramap new file mode 100644 index 0000000000..1986949660 Binary files /dev/null and b/mods/ca/maps/bloody-winter-ca.oramap differ diff --git a/mods/ca/maps/bloodybrawl-ca.oramap b/mods/ca/maps/bloodybrawl-ca.oramap index adb6588e07..c8ff2a5a16 100644 Binary files a/mods/ca/maps/bloodybrawl-ca.oramap and b/mods/ca/maps/bloodybrawl-ca.oramap differ diff --git a/mods/ca/maps/bogland-ca.oramap b/mods/ca/maps/bogland-ca.oramap new file mode 100644 index 0000000000..d32c4ce2a9 Binary files /dev/null and b/mods/ca/maps/bogland-ca.oramap differ diff --git a/mods/ca/maps/bonecage-extended.oramap b/mods/ca/maps/bonecage-extended.oramap index 72a5fab480..25c209caa9 100644 Binary files a/mods/ca/maps/bonecage-extended.oramap and b/mods/ca/maps/bonecage-extended.oramap differ diff --git a/mods/ca/maps/bonecage.oramap b/mods/ca/maps/bonecage.oramap index 7e01a0eaf2..d092254b39 100644 Binary files a/mods/ca/maps/bonecage.oramap and b/mods/ca/maps/bonecage.oramap differ diff --git a/mods/ca/maps/bosnia-4v4-ca.oramap b/mods/ca/maps/bosnia-4v4-ca.oramap new file mode 100644 index 0000000000..bd891420e9 Binary files /dev/null and b/mods/ca/maps/bosnia-4v4-ca.oramap differ diff --git a/mods/ca/maps/bossman-ca.oramap b/mods/ca/maps/bossman-ca.oramap new file mode 100644 index 0000000000..de4c9b3323 Binary files /dev/null and b/mods/ca/maps/bossman-ca.oramap differ diff --git a/mods/ca/maps/breaking-bad-ca.oramap b/mods/ca/maps/breaking-bad-ca.oramap index 5b90c4bc1c..dddad55ab0 100644 Binary files a/mods/ca/maps/breaking-bad-ca.oramap and b/mods/ca/maps/breaking-bad-ca.oramap differ diff --git a/mods/ca/maps/bucharest-1v1-ca.oramap b/mods/ca/maps/bucharest-1v1-ca.oramap new file mode 100644 index 0000000000..1d6c6a6dbe Binary files /dev/null and b/mods/ca/maps/bucharest-1v1-ca.oramap differ diff --git a/mods/ca/maps/bucharest-2v2-ca.oramap b/mods/ca/maps/bucharest-2v2-ca.oramap new file mode 100644 index 0000000000..cc1678e408 Binary files /dev/null and b/mods/ca/maps/bucharest-2v2-ca.oramap differ diff --git a/mods/ca/maps/bucharest-3v3-ca.oramap b/mods/ca/maps/bucharest-3v3-ca.oramap new file mode 100644 index 0000000000..2b70e8dc06 Binary files /dev/null and b/mods/ca/maps/bucharest-3v3-ca.oramap differ diff --git a/mods/ca/maps/bucharest-4v4-ca.oramap b/mods/ca/maps/bucharest-4v4-ca.oramap new file mode 100644 index 0000000000..f4e81e4833 Binary files /dev/null and b/mods/ca/maps/bucharest-4v4-ca.oramap differ diff --git a/mods/ca/maps/ca-composition-tester/composition-tester.lua b/mods/ca/maps/ca-composition-tester/composition-tester.lua new file mode 100644 index 0000000000..976ece96b2 --- /dev/null +++ b/mods/ca/maps/ca-composition-tester/composition-tester.lua @@ -0,0 +1,320 @@ +SavedCompositions = { } +SavedCash = { } + +WorldLoaded = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + + if Multi0 ~= nil then + StartingCash = Multi0.Cash + elseif Multi1 ~= nil then + StartingCash = Multi1.Cash + else + StartingCash = 20000 + end + + Trigger.OnEnteredFootprint({ ResetWH.Location }, function(a, id) + Media.DisplayMessage("Resetting players 1/2...", "Notification", HSLColor.FromHex("FF0000")) + Reset({ Multi0, Multi1 }) + end) + + Trigger.OnEnteredFootprint({ SaveWH.Location }, function(a, id) + Media.DisplayMessage("Player 1/2 compositions saved.", "Notification", HSLColor.FromHex("00FF00")) + Save({ Multi0, Multi1 }) + end) + + Trigger.OnEnteredFootprint({ RestoreWH.Location }, function(a, id) + Media.DisplayMessage("Restoring player 1/2 compositions...", "Notification", HSLColor.FromHex("00FFFF")) + Restore({ Multi0, Multi1 }) + end) + + Trigger.OnEnteredFootprint({ ResetCashWH.Location }, function(a, id) + Media.DisplayMessage("Resetting player 1/2 cash...", "Notification", HSLColor.FromHex("FFFF00")) + ResetCash({ Multi0, Multi1 }) + RestoreTrucks({ Multi0, Multi1 }) + end) + + Trigger.OnEnteredFootprint({ Reset1WH.Location }, function(a, id) + Media.DisplayMessage("Resetting player 1...", "Notification", HSLColor.FromHex("FF0000")) + Reset({ Multi0 }) + end) + + Trigger.OnEnteredFootprint({ Save1WH.Location }, function(a, id) + Media.DisplayMessage("Player 1 composition saved.", "Notification", HSLColor.FromHex("00FF00")) + Save({ Multi0 }) + end) + + Trigger.OnEnteredFootprint({ Restore1WH.Location }, function(a, id) + Media.DisplayMessage("Restoring player 1 composition...", "Notification", HSLColor.FromHex("00FFFF")) + Restore({ Multi0 }) + end) + + Trigger.OnEnteredFootprint({ ResetCash1WH.Location }, function(a, id) + Media.DisplayMessage("Resetting player 1 cash...", "Notification", HSLColor.FromHex("FFFF00")) + ResetCash({ Multi0 }) + RestoreTrucks({ Multi0, Multi1 }) + end) + + Trigger.OnEnteredFootprint({ Reset2WH.Location }, function(a, id) + Media.DisplayMessage("Resetting player 2...", "Notification", HSLColor.FromHex("FF0000")) + Reset({ Multi1 }) + end) + + Trigger.OnEnteredFootprint({ Save2WH.Location }, function(a, id) + Media.DisplayMessage("Player 2 composition saved.", "Notification", HSLColor.FromHex("00FF00")) + Save({ Multi1 }) + end) + + Trigger.OnEnteredFootprint({ Restore2WH.Location }, function(a, id) + Media.DisplayMessage("Restoring player 2 composition...", "Notification", HSLColor.FromHex("00FFFF")) + Restore({ Multi1 }) + end) + + Trigger.OnEnteredFootprint({ ResetCash2WH.Location }, function(a, id) + Media.DisplayMessage("Resetting player 2 cash...", "Notification", HSLColor.FromHex("FFFF00")) + ResetCash({ Multi1 }) + RestoreTrucks({ Multi0, Multi1 }) + end) + + RestoreTrucks({ Multi0, Multi1 }) +end + +Tick = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + -- Do nothing + end +end + +IsUpgrade = function(a) + return string.find(a.Type, ".upgrade") or string.find(a.Type, ".strat") +end + +KillTrucks = function(players) + Utils.Do(players, function(p) + if p ~= nil then + local trucks = p.GetActorsByType("truk") + Utils.Do(trucks, function(a) + a.Destroy() + end) + end + end) +end + +RestoreTrucks = function(players) + Utils.Do(players, function(p) + if p ~= nil and p == Multi0 then + Actor.Create("truk", true, { Owner = Multi0, Location = Truck1A.Location, Facing = Angle.South }) + Actor.Create("truk", true, { Owner = Multi0, Location = Truck1B.Location, Facing = Angle.South }) + Actor.Create("truk", true, { Owner = Multi0, Location = Truck1C.Location, Facing = Angle.South }) + Actor.Create("truk", true, { Owner = Multi0, Location = Truck1D.Location, Facing = Angle.South }) + Actor.Create("truk", true, { Owner = Multi0, Location = Truck1E.Location, Facing = Angle.South }) + Actor.Create("truk", true, { Owner = Multi0, Location = Truck1F.Location, Facing = Angle.South }) + Actor.Create("truk", true, { Owner = Multi0, Location = Truck1G.Location, Facing = Angle.South }) + Actor.Create("truk", true, { Owner = Multi0, Location = Truck1H.Location, Facing = Angle.South }) + Actor.Create("truk", true, { Owner = Multi0, Location = Truck1I.Location, Facing = Angle.South }) + Actor.Create("truk", true, { Owner = Multi0, Location = Truck1J.Location, Facing = Angle.South }) + Actor.Create("truk", true, { Owner = Multi0, Location = Truck1K.Location, Facing = Angle.South }) + Actor.Create("truk", true, { Owner = Multi0, Location = Truck1L.Location, Facing = Angle.South }) + end + + if p ~= nil and p == Multi1 then + Actor.Create("truk", true, { Owner = Multi1, Location = Truck2A.Location, Facing = Angle.North }) + Actor.Create("truk", true, { Owner = Multi1, Location = Truck2B.Location, Facing = Angle.North }) + Actor.Create("truk", true, { Owner = Multi1, Location = Truck2C.Location, Facing = Angle.North }) + Actor.Create("truk", true, { Owner = Multi1, Location = Truck2D.Location, Facing = Angle.North }) + Actor.Create("truk", true, { Owner = Multi1, Location = Truck2E.Location, Facing = Angle.North }) + Actor.Create("truk", true, { Owner = Multi1, Location = Truck2F.Location, Facing = Angle.North }) + Actor.Create("truk", true, { Owner = Multi1, Location = Truck2G.Location, Facing = Angle.North }) + Actor.Create("truk", true, { Owner = Multi1, Location = Truck2H.Location, Facing = Angle.North }) + Actor.Create("truk", true, { Owner = Multi1, Location = Truck2I.Location, Facing = Angle.North }) + Actor.Create("truk", true, { Owner = Multi1, Location = Truck2J.Location, Facing = Angle.North }) + Actor.Create("truk", true, { Owner = Multi1, Location = Truck2K.Location, Facing = Angle.North }) + Actor.Create("truk", true, { Owner = Multi1, Location = Truck2L.Location, Facing = Angle.North }) + end + end) +end + +KillUnits = function(players) + Utils.Do(players, function(p) + if p ~= nil then + local actors = p.GetActors() + + Utils.Do(actors, function(a) + KillUnit(a) + end) + end + end) +end + +ResetCash = function(players) + Utils.Do(players, function(p) + if p ~= nil then + p.Cash = 0 + p.Resources = 0 + Trigger.AfterDelay(DateTime.Seconds(1), function() + p.Cash = StartingCash + p.Resources = 0 + end) + end + end) +end + +ResetBuildings = function(players) + Utils.Do(players, function(p) + if p ~= nil then + local buildings = p.GetActorsByTypes({ "weap", "tent", "afld", "syrd", "fact" }) + Utils.Do(buildings, function(b) + local loc = b.Location + Trigger.AfterDelay(5, function() + b.Destroy() + Trigger.AfterDelay(DateTime.Seconds(1), function() + Actor.Create(b.Type, true, { Owner = p, Location = loc }) + end) + end) + end) + end + end) +end + +KillUnit = function(a) + if IsIgnoredUnit(a.Type) then + return + end + + if not a.HasProperty("StartBuildingRepairs") and a.Type ~= "player" and a.HasProperty("Kill") and not a.IsDead then + a.Stop() + a.Destroy() + Trigger.AfterDelay(5, function() + KillUnit(a) + end) + elseif IsUpgrade(a) then + Trigger.AfterDelay(5, function() + a.Destroy() + end) + end +end + +Reset = function(players) + ResetCash(players) + ResetBuildings(players) + KillUnits(players) + RestoreTrucks(players) +end + +Save = function(players) + KillTrucks(players) + RestoreTrucks(players) + + Utils.Do(players, function(p) + if p ~= nil then + SavedCompositions[p.InternalName] = { } + SavedCash[p.InternalName] = p.Resources + p.Cash + + local units = p.GetActors() + + Utils.Do(units, function(a) + if IsIgnoredUnit(a.Type) then + return + end + + if not a.HasProperty("StartBuildingRepairs") and a.Type ~= "player" and a.HasProperty("Kill") and a.HasProperty("Move") and not a.IsDead and a.Type ~= "truk" then + local unit = { + Type = a.Type, + Location = a.Location, + CenterPosition = a.CenterPosition, + Facing = a.Facing, + } + + if a.HasProperty("HasPassengers") and a.HasPassengers then + unit.Cargo = {} + Utils.Do(a.Passengers, function(c) + table.insert(unit.Cargo, c.Type) + end) + end + + table.insert(SavedCompositions[p.InternalName], unit) + elseif IsUpgrade(a) then + local upg = { + Type = a.Type, + } + + table.insert(SavedCompositions[p.InternalName], upg) + end + end) + end + end) +end + +Restore = function(players) + KillUnits(players) + ResetBuildings(players) + + Trigger.AfterDelay(DateTime.Seconds(1) + 10, function() + Utils.Do(players, function(p) + if p ~= nil then + if SavedCompositions[p.InternalName] ~= nil and #SavedCompositions[p.InternalName] > 0 then + Utils.Do(SavedCompositions[p.InternalName], function(u) + if u.Location ~= nil then + local newActor = Actor.Create(u.Type, true, { Owner = p, Location = u.Location, CenterPosition = u.CenterPosition, Facing = u.Facing }) + + if u.Cargo ~= nil then + Utils.Do(u.Cargo, function(c) + local passenger = Actor.Create(c, false, { Owner = p }) + newActor.LoadPassenger(passenger) + end) + end + else + Actor.Create(u.Type, true, { Owner = p }) + end + end) + end + + if SavedCash[p.InternalName] ~= nil then + p.Cash = SavedCash[p.InternalName] + p.Resources = 0 + end + end + end) + RestoreTrucks(players) + end) +end + +IgnoredUnits = { + "badr", + "badr.bomber", + "badr.cbomber", + "badr.nbomber", + "badr.mbomber", + "badr.chaosbomber", + "b2b", + "p51", + "tran.paradrop", + "halo.paradrop", + "nhaw.paradrop", + "u2", + "smig", + "a10.bomber", + "c17", + "c17.cargo", + "c17.clustermines", + "c17.xo", + "uav", + "ocar.reinforce", + "ocar.xo", + "ocar.pod", + "horn", + "inva", + "yf23.bomber", + "pod", + "pod2", + "pod3", +} + +IsIgnoredUnit = function(a) + for _, value in pairs(IgnoredUnits) do + if value == a then + return true + end + end + return false +end diff --git a/mods/ca/maps/ca-composition-tester/map.bin b/mods/ca/maps/ca-composition-tester/map.bin new file mode 100644 index 0000000000..f7b39fac6a Binary files /dev/null and b/mods/ca/maps/ca-composition-tester/map.bin differ diff --git a/mods/ca/maps/ca-composition-tester/map.png b/mods/ca/maps/ca-composition-tester/map.png new file mode 100644 index 0000000000..1f442b6fca Binary files /dev/null and b/mods/ca/maps/ca-composition-tester/map.png differ diff --git a/mods/ca/maps/ca-composition-tester/map.yaml b/mods/ca/maps/ca-composition-tester/map.yaml new file mode 100644 index 0000000000..2265fcc586 --- /dev/null +++ b/mods/ca/maps/ca-composition-tester/map.yaml @@ -0,0 +1,1127 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: Composition Tester + +Author: Darkademic + +Tileset: TEMPERAT + +MapSize: 195,195 + +Bounds: 1,1,193,193 + +Visibility: Lobby + +Categories: Testing + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: england + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: england + Enemies: Multi0, Multi1 + PlayerReference@Multi0: + Name: Multi0 + Playable: True + Required: True + Faction: Random + LockSpawn: True + Spawn: 1 + Enemies: Creeps + PlayerReference@Multi1: + Name: Multi1 + Playable: True + Faction: Random + LockSpawn: True + Spawn: 2 + Enemies: Creeps + PlayerReference@Reset: + Name: Reset + NonCombatant: True + Faction: england + Color: FF0000 + PlayerReference@Save: + Name: Save + NonCombatant: True + Faction: england + Color: 00FF00 + PlayerReference@Restore: + Name: Restore + NonCombatant: True + Faction: england + Color: 00FFFF + PlayerReference@RestoreCash: + Name: RestoreCash + NonCombatant: True + Faction: england + Color: FFFF00 + +Actors: + Actor268: mpspawn + Owner: Neutral + Location: 94,170 + Actor269: mpspawn + Owner: Neutral + Location: 100,170 + Actor296: syrd + Owner: Multi0 + Location: 76,111 + Actor502: syrd + Owner: Multi1 + Location: 116,111 + Actor589: weap + Owner: Multi0 + Location: 59,137 + Actor591: weap + Owner: Multi1 + Location: 132,137 + Actor408: afld + Owner: Multi0 + Location: 54,141 + Actor409: weap + Owner: Multi0 + Location: 59,141 + Actor410: tent + Owner: Multi0 + Location: 64,141 + Actor439: tent + Owner: Multi1 + Location: 129,141 + Actor440: weap + Owner: Multi1 + Location: 132,141 + Actor441: afld + Owner: Multi1 + Location: 137,141 + Actor411: fix + Owner: Multi0 + Location: 50,142 + Actor442: fix + Owner: Multi1 + Location: 141,142 + Actor412: afld + Owner: Multi0 + Location: 54,144 + Actor413: camera + Owner: Multi1 + Location: 58,144 + Actor443: camera + Owner: Multi0 + Location: 135,144 + Actor444: afld + Owner: Multi1 + Location: 137,144 + Actor503: fact + Owner: Multi0 + Location: 29,145 + Actor414: nuk2 + Owner: Multi0 + Location: 36,145 + Actor415: nuk2 + Owner: Multi0 + Location: 38,145 + Actor416: nuk2 + Owner: Multi0 + Location: 40,145 + Actor417: nuk2 + Owner: Multi0 + Location: 42,145 + Actor418: nuk2 + Owner: Multi0 + Location: 44,145 + Actor419: nuk2 + Owner: Multi0 + Location: 46,145 + Actor420: weap + Owner: Multi0 + Location: 59,145 + Actor421: tent + Owner: Multi0 + Location: 64,145 + Actor445: tent + Owner: Multi1 + Location: 129,145 + Actor446: weap + Owner: Multi1 + Location: 132,145 + Actor447: nuk2 + Owner: Multi1 + Location: 146,145 + Actor448: nuk2 + Owner: Multi1 + Location: 148,145 + Actor449: nuk2 + Owner: Multi1 + Location: 150,145 + Actor450: nuk2 + Owner: Multi1 + Location: 152,145 + Actor451: nuk2 + Owner: Multi1 + Location: 154,145 + Actor452: nuk2 + Owner: Multi1 + Location: 156,145 + Actor504: fact + Location: 162,145 + Owner: Multi1 + Actor742: patr + Owner: Multi0 + TurretFacing: 192 + Location: 26,146 + Actor422: dome + Owner: Multi0 + Location: 33,146 + Actor423: fix + Owner: Multi0 + Location: 50,146 + Actor453: fix + Owner: Multi1 + Location: 141,146 + Actor454: dome + Owner: Multi1 + Location: 159,146 + Actor743: patr + Owner: Multi1 + Location: 166,146 + Actor424: afld + Owner: Multi0 + Location: 54,147 + Actor455: afld + Owner: Multi1 + Location: 137,147 + Actor425: nuk2 + Owner: Multi0 + Location: 36,148 + Actor426: nuk2 + Owner: Multi0 + Location: 38,148 + Actor427: nuk2 + Owner: Multi0 + Location: 40,148 + Actor428: nuk2 + Owner: Multi0 + Location: 42,148 + Actor429: nuk2 + Owner: Multi0 + Location: 44,148 + Actor430: nuk2 + Owner: Multi0 + Location: 46,148 + Actor456: nuk2 + Owner: Multi1 + Location: 146,148 + Actor457: nuk2 + Owner: Multi1 + Location: 148,148 + Actor458: nuk2 + Owner: Multi1 + Location: 150,148 + Actor459: nuk2 + Owner: Multi1 + Location: 152,148 + Actor460: nuk2 + Owner: Multi1 + Location: 154,148 + Actor461: nuk2 + Owner: Multi1 + Location: 156,148 + Actor431: weap + Owner: Multi0 + Location: 59,149 + Actor432: tent + Owner: Multi0 + Location: 64,149 + Actor462: tent + Owner: Multi1 + Location: 129,149 + Actor463: weap + Owner: Multi1 + Location: 132,149 + Actor433: fix + Owner: Multi0 + Location: 50,150 + Actor434: afld + Owner: Multi0 + Location: 54,150 + Actor464: afld + Owner: Multi1 + Location: 137,150 + Actor465: fix + Owner: Multi1 + Location: 141,150 + Actor435: camera + Owner: Multi1 + Location: 58,152 + Actor466: camera + Owner: Multi0 + Location: 135,152 + Actor436: afld + Owner: Multi0 + Location: 54,153 + Actor437: weap + Owner: Multi0 + Location: 59,153 + Actor438: tent + Owner: Multi0 + Location: 64,153 + Actor467: tent + Owner: Multi1 + Location: 129,153 + Actor468: weap + Owner: Multi1 + Location: 132,153 + Actor469: afld + Owner: Multi1 + Location: 137,153 + Actor590: weap + Owner: Multi0 + Location: 59,157 + Actor592: weap + Owner: Multi1 + Location: 132,157 + Actor266: split2 + Owner: Neutral + Location: 91,166 + Actor267: split2 + Owner: Neutral + Location: 103,166 + Actor304: swal + Owner: Neutral + Location: 90,173 + Actor305: swal + Owner: Neutral + Location: 91,173 + Actor306: swal + Owner: Neutral + Location: 92,173 + Actor307: swal + Owner: Neutral + Location: 94,173 + Actor308: swal + Owner: Neutral + Location: 95,173 + Actor309: swal + Owner: Neutral + Location: 96,173 + Actor310: swal + Owner: Neutral + Location: 98,173 + Actor311: swal + Owner: Neutral + Location: 99,173 + Actor312: swal + Owner: Neutral + Location: 100,173 + Actor313: swal + Owner: Neutral + Location: 102,173 + Actor314: swal + Owner: Neutral + Location: 103,173 + Actor315: swal + Owner: Neutral + Location: 104,173 + Actor316: swal + Owner: Neutral + Location: 90,174 + Truck1E: waypoint + Owner: Neutral + Location: 91,174 + Actor318: swal + Owner: Neutral + Location: 92,174 + Actor319: swal + Owner: Neutral + Location: 94,174 + Truck1F: waypoint + Owner: Neutral + Location: 95,174 + Actor321: swal + Owner: Neutral + Location: 96,174 + Actor322: swal + Owner: Neutral + Location: 98,174 + Truck1G: waypoint + Owner: Neutral + Location: 99,174 + Actor324: swal + Owner: Neutral + Location: 100,174 + Actor325: swal + Owner: Neutral + Location: 102,174 + Truck1H: waypoint + Owner: Neutral + Location: 103,174 + Actor327: swal + Owner: Neutral + Location: 104,174 + Actor328: swal + Owner: Neutral + Location: 90,175 + Actor329: swal + Owner: Neutral + Location: 92,175 + Actor330: swal + Owner: Neutral + Location: 94,175 + Actor331: swal + Owner: Neutral + Location: 96,175 + Actor332: swal + Owner: Neutral + Location: 98,175 + Actor333: swal + Owner: Neutral + Location: 100,175 + Actor334: swal + Owner: Neutral + Location: 102,175 + Actor335: swal + Owner: Neutral + Location: 104,175 + Actor336: swal + Owner: Neutral + Location: 90,176 + Actor338: swal + Owner: Neutral + Location: 92,176 + Actor339: swal + Owner: Neutral + Location: 94,176 + RestoreWH: restorewormhole + Owner: Restore + Location: 95,176 + Actor341: swal + Owner: Neutral + Location: 96,176 + Actor342: swal + Owner: Neutral + Location: 98,176 + SaveWH: savewormhole + Owner: Save + Location: 99,176 + Actor344: swal + Owner: Neutral + Location: 100,176 + Actor345: swal + Owner: Neutral + Location: 102,176 + ResetWH: resetwormhole + Owner: Reset + Location: 103,176 + Actor347: swal + Owner: Neutral + Location: 104,176 + Actor348: swal + Owner: Neutral + Location: 90,177 + Actor349: swal + Owner: Neutral + Location: 92,177 + Actor350: swal + Owner: Neutral + Location: 94,177 + Actor351: swal + Owner: Neutral + Location: 96,177 + Actor352: swal + Owner: Neutral + Location: 98,177 + Actor353: swal + Owner: Neutral + Location: 100,177 + Actor354: swal + Owner: Neutral + Location: 102,177 + Actor355: swal + Owner: Neutral + Location: 104,177 + Actor356: swal + Owner: Neutral + Location: 90,178 + Truck2E: waypoint + Owner: Neutral + Location: 91,178 + Actor358: swal + Owner: Neutral + Location: 92,178 + Actor359: swal + Owner: Neutral + Location: 94,178 + Truck2F: waypoint + Owner: Neutral + Location: 95,178 + Actor361: swal + Owner: Neutral + Location: 96,178 + Actor362: swal + Owner: Neutral + Location: 98,178 + Truck2G: waypoint + Owner: Neutral + Location: 99,178 + Actor364: swal + Owner: Neutral + Location: 100,178 + Actor365: swal + Owner: Neutral + Location: 102,178 + Truck2H: waypoint + Owner: Neutral + Location: 103,178 + Actor367: swal + Owner: Neutral + Location: 104,178 + Actor368: swal + Owner: Neutral + Location: 90,179 + Actor369: swal + Owner: Neutral + Location: 91,179 + Actor370: swal + Owner: Neutral + Location: 92,179 + Actor371: swal + Owner: Neutral + Location: 94,179 + Actor372: swal + Owner: Neutral + Location: 95,179 + Actor373: swal + Owner: Neutral + Location: 96,179 + Actor374: swal + Owner: Neutral + Location: 98,179 + Actor375: swal + Owner: Neutral + Location: 99,179 + Actor376: swal + Owner: Neutral + Location: 100,179 + Actor377: swal + Owner: Neutral + Location: 102,179 + Actor378: swal + Owner: Neutral + Location: 103,179 + Actor379: swal + Owner: Neutral + Location: 104,179 + Actor303: brik + Owner: Neutral + Location: 74,175 + Actor337: brik + Owner: Neutral + Location: 75,175 + Actor340: brik + Owner: Neutral + Location: 76,175 + Actor343: brik + Owner: Neutral + Location: 78,175 + Actor346: brik + Owner: Neutral + Location: 79,175 + Actor380: brik + Owner: Neutral + Location: 80,175 + Actor381: brik + Owner: Neutral + Location: 82,175 + Actor382: brik + Owner: Neutral + Location: 83,175 + Actor383: brik + Owner: Neutral + Location: 84,175 + Actor384: brik + Owner: Neutral + Location: 86,175 + Actor385: brik + Owner: Neutral + Location: 87,175 + Actor386: brik + Owner: Neutral + Location: 88,175 + Actor387: brik + Owner: Neutral + Location: 74,176 + Truck1A: waypoint + Owner: Neutral + Location: 75,176 + Actor389: brik + Owner: Neutral + Location: 76,176 + Actor390: brik + Owner: Neutral + Location: 78,176 + Truck1B: waypoint + Owner: Neutral + Location: 79,176 + Actor392: brik + Owner: Neutral + Location: 80,176 + Actor393: brik + Owner: Neutral + Location: 82,176 + Truck1C: waypoint + Owner: Neutral + Location: 83,176 + Actor395: brik + Owner: Neutral + Location: 84,176 + Actor396: brik + Owner: Neutral + Location: 86,176 + Truck1D: waypoint + Owner: Neutral + Location: 87,176 + Actor398: brik + Owner: Neutral + Location: 88,176 + Actor399: brik + Owner: Neutral + Location: 74,177 + Actor400: brik + Owner: Neutral + Location: 76,177 + Actor401: brik + Owner: Neutral + Location: 78,177 + Actor402: brik + Owner: Neutral + Location: 80,177 + Actor403: brik + Owner: Neutral + Location: 82,177 + Actor404: brik + Owner: Neutral + Location: 84,177 + Actor405: brik + Owner: Neutral + Location: 86,177 + Actor406: brik + Owner: Neutral + Location: 88,177 + Actor407: brik + Owner: Neutral + Location: 74,178 + ResetCash1WH: cashwormhole1 + Owner: RestoreCash + Location: 75,178 + Actor471: brik + Owner: Neutral + Location: 76,178 + Actor472: brik + Owner: Neutral + Location: 78,178 + Restore1WH: restorewormhole1 + Owner: Restore + Location: 79,178 + Actor474: brik + Owner: Neutral + Location: 80,178 + Actor475: brik + Owner: Neutral + Location: 82,178 + Save1WH: savewormhole1 + Owner: Save + Location: 83,178 + Actor477: brik + Owner: Neutral + Location: 84,178 + Actor478: brik + Owner: Neutral + Location: 86,178 + Reset1WH: resetwormhole1 + Owner: Reset + Location: 87,178 + Actor480: brik + Owner: Neutral + Location: 88,178 + Actor481: brik + Owner: Neutral + Location: 74,179 + Actor482: brik + Owner: Neutral + Location: 76,179 + Actor483: brik + Owner: Neutral + Location: 78,179 + Actor484: brik + Owner: Neutral + Location: 80,179 + Actor485: brik + Owner: Neutral + Location: 82,179 + Actor486: brik + Owner: Neutral + Location: 84,179 + Actor487: brik + Owner: Neutral + Location: 86,179 + Actor488: brik + Owner: Neutral + Location: 88,179 + Actor489: brik + Owner: Neutral + Location: 74,180 + Truck2A: waypoint + Owner: Neutral + Location: 75,180 + Actor491: brik + Owner: Neutral + Location: 76,180 + Actor492: brik + Owner: Neutral + Location: 78,180 + Truck2B: waypoint + Owner: Neutral + Location: 79,180 + Actor494: brik + Owner: Neutral + Location: 80,180 + Actor495: brik + Owner: Neutral + Location: 82,180 + Truck2C: waypoint + Owner: Neutral + Location: 83,180 + Actor497: brik + Owner: Neutral + Location: 84,180 + Actor498: brik + Owner: Neutral + Location: 86,180 + Truck2D: waypoint + Owner: Neutral + Location: 87,180 + Actor500: brik + Owner: Neutral + Location: 88,180 + Actor501: brik + Owner: Neutral + Location: 74,181 + Actor505: brik + Owner: Neutral + Location: 75,181 + Actor506: brik + Owner: Neutral + Location: 76,181 + Actor507: brik + Owner: Neutral + Location: 78,181 + Actor508: brik + Owner: Neutral + Location: 79,181 + Actor509: brik + Owner: Neutral + Location: 80,181 + Actor510: brik + Owner: Neutral + Location: 82,181 + Actor511: brik + Owner: Neutral + Location: 83,181 + Actor512: brik + Owner: Neutral + Location: 84,181 + Actor513: brik + Owner: Neutral + Location: 86,181 + Actor514: brik + Owner: Neutral + Location: 87,181 + Actor515: brik + Owner: Neutral + Location: 88,181 + Actor516: swal + Owner: Neutral + Location: 90,181 + Actor517: swal + Owner: Neutral + Location: 90,180 + Actor518: swal + Owner: Neutral + Location: 91,181 + Actor519: swal + Owner: Neutral + Location: 91,180 + Actor520: swal + Owner: Neutral + Location: 92,180 + Actor521: swal + Owner: Neutral + Location: 92,181 + Actor522: swal + Owner: Neutral + Location: 94,180 + Actor523: swal + Owner: Neutral + Location: 94,181 + Actor524: swal + Owner: Neutral + Location: 95,181 + Actor525: swal + Owner: Neutral + Location: 95,180 + Actor526: swal + Owner: Neutral + Location: 96,180 + Actor527: swal + Owner: Neutral + Location: 96,181 + Actor528: swal + Owner: Neutral + Location: 98,181 + Actor529: swal + Owner: Neutral + Location: 98,180 + Actor530: swal + Owner: Neutral + Location: 99,180 + Actor531: swal + Owner: Neutral + Location: 99,181 + Actor532: swal + Owner: Neutral + Location: 100,180 + Actor533: swal + Owner: Neutral + Location: 100,181 + Actor534: swal + Owner: Neutral + Location: 102,181 + Actor535: swal + Owner: Neutral + Location: 102,180 + Actor536: swal + Owner: Neutral + Location: 103,180 + Actor537: swal + Owner: Neutral + Location: 103,181 + Actor538: swal + Owner: Neutral + Location: 104,180 + Actor539: swal + Owner: Neutral + Location: 104,181 + Actor540: swal + Owner: Neutral + Location: 90,172 + Actor541: swal + Owner: Neutral + Location: 91,172 + Actor542: swal + Owner: Neutral + Location: 92,172 + Actor543: swal + Owner: Neutral + Location: 94,172 + Actor544: swal + Owner: Neutral + Location: 95,172 + Actor545: swal + Owner: Neutral + Location: 96,172 + Actor546: swal + Owner: Neutral + Location: 98,172 + Actor547: swal + Owner: Neutral + Location: 99,172 + Actor548: swal + Owner: Neutral + Location: 100,172 + Actor549: swal + Owner: Neutral + Location: 102,172 + Actor550: swal + Owner: Neutral + Location: 103,172 + Actor551: swal + Owner: Neutral + Location: 104,172 + Actor552: swal + Owner: Neutral + Location: 90,171 + Actor553: swal + Owner: Neutral + Location: 91,171 + Actor554: swal + Owner: Neutral + Location: 92,171 + Actor555: swal + Owner: Neutral + Location: 94,171 + Actor556: swal + Owner: Neutral + Location: 95,171 + Actor557: swal + Owner: Neutral + Location: 96,171 + Actor558: swal + Owner: Neutral + Location: 98,171 + Actor559: swal + Owner: Neutral + Location: 99,171 + Actor560: swal + Owner: Neutral + Location: 100,171 + Actor561: swal + Owner: Neutral + Location: 102,171 + Actor568: swal + Owner: Neutral + Location: 103,171 + Actor569: swal + Owner: Neutral + Location: 104,171 + Actor470: brik + Owner: Neutral + Location: 106,175 + Actor473: brik + Owner: Neutral + Location: 107,175 + Actor476: brik + Owner: Neutral + Location: 108,175 + Actor479: brik + Owner: Neutral + Location: 110,175 + Actor562: brik + Owner: Neutral + Location: 111,175 + Actor563: brik + Owner: Neutral + Location: 112,175 + Actor564: brik + Owner: Neutral + Location: 114,175 + Actor565: brik + Owner: Neutral + Location: 115,175 + Actor566: brik + Owner: Neutral + Location: 116,175 + Actor567: brik + Owner: Neutral + Location: 118,175 + Actor570: brik + Owner: Neutral + Location: 119,175 + Actor571: brik + Owner: Neutral + Location: 120,175 + Actor572: brik + Owner: Neutral + Location: 106,176 + Truck1I: waypoint + Owner: Neutral + Location: 107,176 + Actor580: brik + Owner: Neutral + Location: 108,176 + Actor581: brik + Owner: Neutral + Location: 110,176 + Truck1J: waypoint + Owner: Neutral + Location: 111,176 + Actor583: brik + Owner: Neutral + Location: 112,176 + Actor584: brik + Owner: Neutral + Location: 114,176 + Truck1K: waypoint + Owner: Neutral + Location: 115,176 + Actor586: brik + Owner: Neutral + Location: 116,176 + Actor587: brik + Owner: Neutral + Location: 118,176 + Truck1L: waypoint + Owner: Neutral + Location: 119,176 + Actor593: brik + Owner: Neutral + Location: 120,176 + Actor594: brik + Owner: Neutral + Location: 106,177 + Actor595: brik + Owner: Neutral + Location: 108,177 + Actor596: brik + Owner: Neutral + Location: 110,177 + Actor597: brik + Owner: Neutral + Location: 112,177 + Actor598: brik + Owner: Neutral + Location: 114,177 + Actor599: brik + Owner: Neutral + Location: 116,177 + Actor600: brik + Owner: Neutral + Location: 118,177 + Actor601: brik + Owner: Neutral + Location: 120,177 + Actor602: brik + Owner: Neutral + Location: 106,178 + ResetCash2WH: cashwormhole2 + Owner: RestoreCash + Location: 107,178 + Actor604: brik + Owner: Neutral + Location: 108,178 + Actor605: brik + Owner: Neutral + Location: 110,178 + Restore2WH: restorewormhole2 + Owner: Restore + Location: 111,178 + Actor607: brik + Owner: Neutral + Location: 112,178 + Actor608: brik + Owner: Neutral + Location: 114,178 + Save2WH: savewormhole2 + Owner: Save + Location: 115,178 + Actor610: brik + Owner: Neutral + Location: 116,178 + Actor611: brik + Owner: Neutral + Location: 118,178 + Reset2WH: resetwormhole2 + Owner: Reset + Location: 119,178 + Actor613: brik + Owner: Neutral + Location: 120,178 + Actor614: brik + Owner: Neutral + Location: 106,179 + Actor615: brik + Owner: Neutral + Location: 108,179 + Actor616: brik + Owner: Neutral + Location: 110,179 + Actor617: brik + Owner: Neutral + Location: 112,179 + Actor618: brik + Owner: Neutral + Location: 114,179 + Actor619: brik + Owner: Neutral + Location: 116,179 + Actor620: brik + Owner: Neutral + Location: 118,179 + Actor621: brik + Owner: Neutral + Location: 120,179 + Actor622: brik + Owner: Neutral + Location: 106,180 + Truck2I: waypoint + Owner: Neutral + Location: 107,180 + Actor624: brik + Owner: Neutral + Location: 108,180 + Actor625: brik + Owner: Neutral + Location: 110,180 + Truck2J: waypoint + Owner: Neutral + Location: 111,180 + Actor627: brik + Owner: Neutral + Location: 112,180 + Actor628: brik + Owner: Neutral + Location: 114,180 + Truck2K: waypoint + Owner: Neutral + Location: 115,180 + Actor630: brik + Owner: Neutral + Location: 116,180 + Actor631: brik + Owner: Neutral + Location: 118,180 + Truck2L: waypoint + Owner: Neutral + Location: 119,180 + Actor633: brik + Owner: Neutral + Location: 120,180 + Actor634: brik + Owner: Neutral + Location: 106,181 + Actor635: brik + Owner: Neutral + Location: 107,181 + Actor636: brik + Owner: Neutral + Location: 108,181 + Actor637: brik + Owner: Neutral + Location: 110,181 + Actor638: brik + Owner: Neutral + Location: 111,181 + Actor639: brik + Owner: Neutral + Location: 112,181 + Actor640: brik + Owner: Neutral + Location: 114,181 + Actor641: brik + Owner: Neutral + Location: 115,181 + Actor642: brik + Owner: Neutral + Location: 116,181 + Actor643: brik + Owner: Neutral + Location: 118,181 + Actor644: brik + Owner: Neutral + Location: 119,181 + Actor645: brik + Owner: Neutral + Location: 120,181 + ResetCashWH: cashwormhole + Owner: RestoreCash + Location: 91,176 + +Rules: ca|rules/custom/composition-tester.yaml, ca|rules/custom/composition-tester-powers.yaml, rules.yaml diff --git a/mods/ca/maps/ca-composition-tester/rules.yaml b/mods/ca/maps/ca-composition-tester/rules.yaml new file mode 100644 index 0000000000..1482a89667 --- /dev/null +++ b/mods/ca/maps/ca-composition-tester/rules.yaml @@ -0,0 +1,246 @@ + +World: + LuaScript: + Scripts: composition-tester.lua + MissionData: + Briefing: Map for testing fixed value army compositions against each other. Requires 2+ players. Move the trucks into wormholes to reset/save/restore. + +Player: + -ModularBot@BrutalAI: + -ModularBot@VeryHardAI: + -ModularBot@HardAI: + -ModularBot@NormalAI: + -ModularBot@EasyAI: + -ModularBot@NavalAI: + +PATR: + AttackOrderPowerCA@EMPMISSILE: + ChargeInterval: 1 + +FACT: + DamageMultiplier@1: + Modifier: 0 + -Sellable: + -SpawnActorsOnSellCA: + -SpawnActorOnDeath: + -SpawnRandomActorOnDeath: + Capturable: + Types: None + RequiresCondition: being-captured + Targetable@TEMPORAL: + TargetTypes: None + Targetable@HACKABLE: + TargetTypes: None + +WEAP: + DamageMultiplier@1: + Modifier: 0 + -Sellable: + -SpawnActorsOnSellCA: + -SpawnActorOnDeath: + -SpawnRandomActorOnDeath: + Capturable: + Types: None + RequiresCondition: being-captured + Targetable@TEMPORAL: + TargetTypes: None + Targetable@HACKABLE: + TargetTypes: None + +TENT: + DamageMultiplier@1: + Modifier: 0 + -Sellable: + -SpawnActorsOnSellCA: + -SpawnActorOnDeath: + -SpawnRandomActorOnDeath: + Capturable: + Types: None + RequiresCondition: being-captured + Targetable@TEMPORAL: + TargetTypes: None + Targetable@HACKABLE: + TargetTypes: None + +AFLD: + DamageMultiplier@1: + Modifier: 0 + -Sellable: + -SpawnActorsOnSellCA: + -SpawnActorOnDeath: + -SpawnRandomActorOnDeath: + Capturable: + Types: None + RequiresCondition: being-captured + Targetable@TEMPORAL: + TargetTypes: None + Targetable@HACKABLE: + TargetTypes: None + +DOME: + DamageMultiplier@1: + Modifier: 0 + -Sellable: + -SpawnActorsOnSellCA: + -SpawnActorOnDeath: + -SpawnRandomActorOnDeath: + Capturable: + Types: None + RequiresCondition: being-captured + Targetable@TEMPORAL: + TargetTypes: None + Targetable@HACKABLE: + TargetTypes: None + GpsRadarProvider: + RequiresCondition: gps-active + GrantDelayedCondition@GPS: + Condition: gps-active + Delay: 1 + +FIX: + DamageMultiplier@1: + Modifier: 0 + -Sellable: + -SpawnActorsOnSellCA: + -SpawnActorOnDeath: + -SpawnRandomActorOnDeath: + -GrantConditionOnResupplying@Resupplying: + Capturable: + Types: None + RequiresCondition: being-captured + Targetable@TEMPORAL: + TargetTypes: None + Targetable@HACKABLE: + TargetTypes: None + +NUK2: + DamageMultiplier@1: + Modifier: 0 + -Sellable: + -SpawnActorsOnSellCA: + -SpawnActorOnDeath: + -SpawnRandomActorOnDeath: + Capturable: + Types: None + RequiresCondition: being-captured + Targetable@TEMPORAL: + TargetTypes: None + Targetable@HACKABLE: + TargetTypes: None + DummyConditionConsumer@build-incomplete: + Condition: build-incomplete + +SYRD: + DamageMultiplier@1: + Modifier: 0 + -Sellable: + Capturable: + Types: None + RequiresCondition: being-captured + Targetable@TEMPORAL: + TargetTypes: None + Targetable@HACKABLE: + TargetTypes: None + +INDP: + Valued: + Cost: 0 + Buildable: + Prerequisites: ~player.soviet + +MUNP: + Valued: + Cost: 0 + Buildable: + Prerequisites: ~player.soviet + +CVAT: + Valued: + Cost: 0 + Buildable: + Prerequisites: ~player.soviet + +TRUK: + Mobile: + Speed: 300 + TurnSpeed: 256 + +CONFIGWORMHOLE: + Inherits: WORMHOLE + -Targetable: + -RallyPoint: + -TeleportNetwork: + -Exit: + Immobile: + OccupiesSpace: false + WithTextDecoration: + Text: Reset + Position: Top + Font: Bold + ValidRelationships: Ally, Enemy, Neutral + RenderSprites: + Image: wormhole + +RESETWORMHOLE: + Inherits: CONFIGWORMHOLE + WithTextDecoration: + Text: Reset + Color: FF0000 + +SAVEWORMHOLE: + Inherits: CONFIGWORMHOLE + WithTextDecoration: + Text: Save + Color: 00FF00 + +RESTOREWORMHOLE: + Inherits: CONFIGWORMHOLE + WithTextDecoration: + Text: Restore + Color: 00FFFF + +CASHWORMHOLE: + Inherits: CONFIGWORMHOLE + WithTextDecoration: + Text: Cash + Color: FFFF00 + +RESETWORMHOLE1: + Inherits: RESETWORMHOLE + WithTextDecoration: + Text: Reset P1 + +SAVEWORMHOLE1: + Inherits: SAVEWORMHOLE + WithTextDecoration: + Text: Save P1 + +RESTOREWORMHOLE1: + Inherits: RESTOREWORMHOLE + WithTextDecoration: + Text: Restore P1 + +RESETWORMHOLE2: + Inherits: RESETWORMHOLE + WithTextDecoration: + Text: Reset P2 + +SAVEWORMHOLE2: + Inherits: SAVEWORMHOLE + WithTextDecoration: + Text: Save P2 + +RESTOREWORMHOLE2: + Inherits: RESTOREWORMHOLE + WithTextDecoration: + Text: Restore P2 + +CASHWORMHOLE1: + Inherits: CASHWORMHOLE + WithTextDecoration: + Text: Cash P1 + +CASHWORMHOLE2: + Inherits: CASHWORMHOLE + WithTextDecoration: + Text: Cash P2 diff --git a/mods/ca/maps/ca-testing-grounds/map.bin b/mods/ca/maps/ca-testing-grounds/map.bin new file mode 100644 index 0000000000..8ecf8b8daa Binary files /dev/null and b/mods/ca/maps/ca-testing-grounds/map.bin differ diff --git a/mods/ca/maps/ca-testing-grounds/map.png b/mods/ca/maps/ca-testing-grounds/map.png new file mode 100644 index 0000000000..f9b476676a Binary files /dev/null and b/mods/ca/maps/ca-testing-grounds/map.png differ diff --git a/mods/ca/maps/ca-testing-grounds/map.yaml b/mods/ca/maps/ca-testing-grounds/map.yaml new file mode 100644 index 0000000000..6f17856b92 --- /dev/null +++ b/mods/ca/maps/ca-testing-grounds/map.yaml @@ -0,0 +1,5560 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: Testing Grounds + +Author: Darkademic + +Tileset: TEMPERAT + +MapSize: 194,210 + +Bounds: 1,1,192,208 + +Visibility: Lobby + +Categories: Testing + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: england + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: england + Enemies: Dummy, HostileDummy, Multi0 + PlayerReference@Dummy: + Name: Dummy + Bot: dormant + Faction: england + Color: FFFFFF + PlayerReference@Multi0: + Name: Multi0 + Playable: True + Faction: Random + Enemies: Dummy, HostileDummy, Creeps + PlayerReference@HostileDummy: + Name: HostileDummy + Bot: dormant + Faction: england + Color: FFFFFF + Enemies: Multi0, Creeps + +Actors: + Actor2437: apwr + Owner: Multi0 + Location: 173,189 + Actor2438: apwr + Owner: Multi0 + Location: 176,189 + Actor2439: apwr + Owner: Multi0 + Location: 179,189 + Actor2440: apwr + Owner: Multi0 + Location: 183,189 + Actor2441: apwr + Owner: Multi0 + Location: 186,189 + Actor2442: apwr + Owner: Multi0 + Location: 189,189 + Actor2443: apwr + Owner: Multi0 + Location: 173,192 + Actor2444: apwr + Owner: Multi0 + Location: 176,192 + Actor2445: apwr + Owner: Multi0 + Location: 179,192 + Actor2446: apwr + Owner: Multi0 + Location: 183,192 + Actor2447: apwr + Owner: Multi0 + Location: 186,192 + Actor2448: apwr + Owner: Multi0 + Location: 189,192 + Actor2449: apwr + Owner: Multi0 + Location: 173,195 + Actor2450: apwr + Owner: Multi0 + Location: 176,195 + Actor2451: apwr + Owner: Multi0 + Location: 179,195 + Actor2452: apwr + Owner: Multi0 + Location: 183,195 + Actor2453: apwr + Owner: Multi0 + Location: 186,195 + Actor2454: apwr + Owner: Multi0 + Location: 189,195 + Actor2455: apwr + Owner: Multi0 + Location: 173,199 + Actor2456: apwr + Owner: Multi0 + Location: 176,199 + Actor2457: apwr + Owner: Multi0 + Location: 179,199 + Actor2458: apwr + Owner: Multi0 + Location: 183,199 + Actor2459: apwr + Owner: Multi0 + Location: 186,199 + Actor2460: apwr + Owner: Multi0 + Location: 189,199 + Actor2461: apwr + Owner: Multi0 + Location: 173,202 + Actor2462: apwr + Owner: Multi0 + Location: 176,202 + Actor2463: apwr + Owner: Multi0 + Location: 179,202 + Actor2464: apwr + Owner: Multi0 + Location: 183,202 + Actor2465: apwr + Owner: Multi0 + Location: 186,202 + Actor2466: apwr + Owner: Multi0 + Location: 189,202 + Actor2467: apwr + Owner: Multi0 + Location: 173,205 + Actor2468: apwr + Owner: Multi0 + Location: 176,205 + Actor2469: apwr + Owner: Multi0 + Location: 179,205 + Actor2470: apwr + Owner: Multi0 + Location: 183,205 + Actor2471: apwr + Owner: Multi0 + Location: 186,205 + Actor2472: apwr + Owner: Multi0 + Location: 189,205 + Actor2415: t06 + Owner: Neutral + Location: 150,172 + Actor2416: t14 + Owner: Neutral + Location: 152,170 + Actor2417: tc02 + Owner: Neutral + Location: 153,174 + Actor2418: v01 + Owner: Neutral + Location: 150,168 + Actor1238: heli + Owner: Dummy + Facing: 384 + Location: 33,94 + Actor1239: heli + Owner: Dummy + Facing: 384 + Location: 41,94 + Actor1240: heli + Owner: Dummy + Facing: 384 + Location: 32,95 + Actor1241: heli + Owner: Dummy + Facing: 384 + Location: 33,95 + Actor1242: heli + Owner: Dummy + Facing: 384 + Location: 34,95 + Actor1243: heli + Owner: Dummy + Facing: 384 + Location: 40,95 + Actor1244: heli + Owner: Dummy + Facing: 384 + Location: 41,95 + Actor1245: heli + Owner: Dummy + Facing: 384 + Location: 42,95 + Actor1246: heli + Owner: Dummy + Facing: 384 + Location: 31,96 + Actor1247: heli + Owner: Dummy + Facing: 384 + Location: 32,96 + Actor1248: heli + Owner: Dummy + Facing: 384 + Location: 33,96 + Actor1249: camera + Owner: Multi0 + Location: 33,96 + Actor1250: heli + Owner: Dummy + Facing: 384 + Location: 34,96 + Actor1251: heli + Owner: Dummy + Facing: 384 + Location: 35,96 + Actor1252: heli + Owner: Dummy + Facing: 384 + Location: 39,96 + Actor1253: heli + Owner: Dummy + Facing: 384 + Location: 40,96 + Actor1254: heli + Owner: Dummy + Facing: 384 + Location: 41,96 + Actor1255: camera + Owner: Multi0 + Location: 41,96 + Actor1256: heli + Owner: Dummy + Facing: 384 + Location: 42,96 + Actor1257: heli + Owner: Dummy + Facing: 384 + Location: 43,96 + Actor1258: heli + Owner: Dummy + Facing: 384 + Location: 32,97 + Actor1259: heli + Owner: Dummy + Facing: 384 + Location: 33,97 + Actor1260: heli + Owner: Dummy + Facing: 384 + Location: 34,97 + Actor1261: heli + Owner: Dummy + Facing: 384 + Location: 40,97 + Actor1262: heli + Owner: Dummy + Facing: 384 + Location: 41,97 + Actor1263: heli + Owner: Dummy + Facing: 384 + Location: 42,97 + Actor1264: heli + Owner: Dummy + Facing: 384 + Location: 33,98 + Actor1265: heli + Owner: Dummy + Facing: 384 + Location: 41,98 + Actor1398: s6 + Owner: Multi0 + SubCell: 3 + Facing: 384 + Location: 73,142 + Actor1411: s3 + Owner: Multi0 + SubCell: 3 + Facing: 384 + Location: 75,142 + Actor1413: s1 + Owner: Multi0 + SubCell: 3 + Facing: 384 + Location: 77,142 + Actor1414: harv.scrin + Owner: Multi0 + Facing: 384 + Location: 79,142 + Actor1415: gunw + Owner: Multi0 + Facing: 384 + Location: 81,142 + Actor1946: syrf + Owner: Dummy + Location: 178,145 + Actor1947: syrd + Owner: Dummy + Location: 174,145 + Actor1950: camera + Owner: Multi0 + Location: 177,146 + Actor1953: sgen.shadow + Owner: HostileDummy + Location: 162,127 + Actor1954: nuk2 + Owner: HostileDummy + Location: 163,130 + Actor1955: nuk2 + Owner: HostileDummy + Location: 163,123 + Actor1956: nuk2 + Owner: HostileDummy + Location: 159,126 + Actor1957: nuk2 + Owner: HostileDummy + Location: 166,126 + Actor2047: agun + Owner: HostileDummy + Location: 174,181 + Actor2048: agun + Owner: HostileDummy + Location: 176,181 + Actor2049: agun + Owner: HostileDummy + Location: 178,181 + Actor2059: agun + Owner: HostileDummy + Location: 177,182 + Actor2060: agun + Owner: HostileDummy + Location: 175,182 + Actor2061: agun + Owner: HostileDummy + Location: 173,182 + Actor2063: agun + Owner: HostileDummy + Location: 172,183 + Actor2064: agun + Owner: HostileDummy + Location: 174,183 + Actor2065: agun + Owner: HostileDummy + Location: 176,183 + Actor2066: apwr + Owner: HostileDummy + Location: 180,181 + Actor2067: apwr + Owner: HostileDummy + Location: 183,181 + Actor2068: apwr + Owner: HostileDummy + Location: 186,181 + Actor2069: apwr + Owner: HostileDummy + Location: 189,181 + Actor2070: apwr + Owner: HostileDummy + Location: 189,178 + Actor2071: apwr + Owner: HostileDummy + Location: 189,175 + Actor2072: syrd.gdi + Location: 163,155 + Owner: Multi0 + Actor2046: agun + Owner: HostileDummy + Location: 172,181 + Actor2062: agun + Owner: HostileDummy + Location: 171,182 + Actor2045: agun + Owner: HostileDummy + Location: 170,181 + Actor2073: syrd.gdi + Owner: Multi0 + Location: 168,155 + Actor1960: reck + Owner: Multi0 + Facing: 384 + Location: 79,145 + Actor2083: cscr + Owner: Multi0 + SubCell: 3 + Facing: 384 + Location: 77,145 + Actor2085: mort.chem + Owner: Multi0 + Facing: 384 + Location: 76,145 + SubCell: 3 + Actor2086: mort.sonic + Owner: Multi0 + Facing: 384 + Location: 75,145 + SubCell: 3 + Actor2087: cdog + Owner: Multi0 + Facing: 384 + Location: 74,145 + SubCell: 3 + Actor2088: mort.cryo + Owner: Multi0 + SubCell: 3 + Facing: 384 + Location: 73,145 + Actor1399: agun + Owner: HostileDummy + Location: 151,202 + TurretFacing: 832 + Actor1408: v3rl + Owner: Multi0 + Facing: 512 + Stance: HoldFire + Location: 151,187 + Actor1403: v3rl + Owner: Multi0 + Facing: 512 + Stance: HoldFire + Location: 139,187 + Actor1407: cram + Owner: HostileDummy + Location: 139,202 + Actor1402: v3rl + Owner: Multi0 + Facing: 512 + Stance: HoldFire + Location: 127,187 + Actor1406: sam + Owner: HostileDummy + Location: 126,202 + Actor1400: v3rl + Owner: Multi0 + Facing: 512 + Stance: HoldFire + Location: 101,187 + Actor1401: v3rl + Owner: Multi0 + Facing: 512 + Stance: HoldFire + Location: 114,187 + Actor1404: shar + Owner: HostileDummy + Location: 101,202 + Actor1405: nsam + Owner: HostileDummy + Location: 113,202 + Actor2142: mpspawn + Owner: Neutral + Location: 83,130 + Actor2144: mpspawn + Owner: Neutral + Location: 85,130 + Actor1282: camera + Owner: Multi0 + Location: 117,122 + Actor1379: apwr + Owner: Dummy + Location: 186,48 + Actor1380: apwr + Owner: Dummy + Location: 189,48 + Actor1381: apwr + Owner: Dummy + Location: 186,51 + Actor1382: apwr + Owner: Dummy + Location: 189,51 + Actor1383: apwr + Owner: Dummy + Location: 186,54 + Actor1384: apwr + Owner: Dummy + Location: 189,54 + Actor1385: apwr + Owner: Dummy + Location: 186,57 + Actor1386: apwr + Owner: Dummy + Location: 189,57 + Actor1387: apwr + Owner: Dummy + Location: 186,60 + Actor1388: apwr + Owner: Dummy + Location: 189,60 + Actor1470: apwr + Owner: Dummy + Location: 186,63 + Actor1471: apwr + Owner: Dummy + Location: 189,63 + Actor1958: apwr + Owner: Dummy + Location: 186,66 + Actor2031: apwr + Owner: Dummy + Location: 189,66 + Actor2032: apwr + Owner: Dummy + Location: 186,69 + Actor2050: apwr + Owner: Dummy + Location: 189,69 + Actor2051: apwr + Owner: Dummy + Location: 186,72 + Actor2052: apwr + Owner: Dummy + Location: 189,72 + Actor2053: apwr + Owner: Dummy + Location: 186,75 + Actor2054: apwr + Owner: Dummy + Location: 189,75 + Actor1430: tent + Owner: Multi0 + Location: 61,123 + Actor1431: tent + Owner: Multi0 + Location: 64,123 + Actor1432: tent + Owner: Multi0 + Location: 67,123 + Actor1433: tent + Owner: Multi0 + Location: 70,123 + Actor1434: tent + Owner: Multi0 + Location: 73,123 + Actor1435: tent + Owner: Multi0 + Location: 76,123 + Actor1776: gap + Owner: Dummy + Location: 180,120 + Actor2688: weap + Owner: Multi0 + Location: 108,123 + Actor2689: weap + Owner: Multi0 + Location: 103,123 + Actor2690: weap + Owner: Multi0 + Location: 98,123 + Actor2691: weap + Owner: Multi0 + Location: 93,123 + Actor2692: weap + Owner: Multi0 + Location: 88,123 + Actor2693: weap + Owner: Multi0 + Location: 83,123 + Actor1941: cycp + Owner: Multi0 + Facing: 384 + Location: 81,145 + Actor1942: basi + Owner: Multi0 + Facing: 384 + Location: 83,145 + Actor1943: mant + Owner: Multi0 + Facing: 384 + Location: 85,145 + Actor1944: vipr + Owner: Multi0 + Facing: 384 + Location: 87,145 + Actor1934: e6 + Owner: Multi0 + Facing: 384 + TurretFacing: 0 + SubCell: 3 + Location: 73,140 + Actor1961: n1 + Owner: Multi0 + Facing: 384 + TurretFacing: 0 + SubCell: 3 + Location: 77,140 + Actor2147: bggy + Owner: Multi0 + TurretFacing: 0 + Facing: 384 + Location: 81,140 + Actor1428: e6 + Owner: Multi0 + TurretFacing: 0 + SubCell: 3 + Facing: 384 + Location: 73,138 + Actor1456: n1 + Owner: Multi0 + Facing: 384 + TurretFacing: 0 + SubCell: 3 + Location: 77,138 + Actor1935: harv.td + Owner: Multi0 + Facing: 384 + Location: 79,138 + Actor1936: hmmv + Owner: Multi0 + TurretFacing: 0 + Facing: 384 + Location: 81,138 + Actor1952: gdrn + Owner: Multi0 + Facing: 384 + Location: 83,138 + Actor1970: mtnk + Owner: Multi0 + TurretFacing: 0 + Facing: 384 + Location: 85,138 + Actor1307: e6 + Owner: Multi0 + Facing: 384 + TurretFacing: 0 + SubCell: 3 + Location: 73,134 + Actor1308: e3 + Owner: Multi0 + Facing: 384 + TurretFacing: 0 + SubCell: 3 + Location: 75,134 + Actor1309: e1 + Owner: Multi0 + Facing: 384 + TurretFacing: 0 + SubCell: 3 + Location: 77,134 + Actor1310: harv.chrono + Owner: Multi0 + Facing: 384 + Location: 79,134 + Actor1311: jeep + Owner: Multi0 + TurretFacing: 0 + Facing: 384 + Location: 81,134 + Actor1312: 1tnk + Owner: Multi0 + TurretFacing: 0 + Facing: 384 + Location: 83,134 + Actor1342: e6 + Owner: Multi0 + Facing: 384 + TurretFacing: 0 + SubCell: 3 + Location: 73,136 + Actor1343: e4 + Owner: Multi0 + Facing: 384 + TurretFacing: 0 + SubCell: 3 + Location: 74,136 + Actor1344: e3 + Owner: Multi0 + Facing: 384 + TurretFacing: 0 + SubCell: 3 + Location: 75,136 + Actor1648: e2 + Owner: Multi0 + Facing: 384 + TurretFacing: 0 + SubCell: 3 + Location: 76,136 + Actor1655: e1 + Owner: Multi0 + TurretFacing: 0 + SubCell: 3 + Facing: 384 + Location: 77,136 + Actor1656: harv + Owner: Multi0 + Facing: 384 + Location: 79,136 + Actor1937: btr + Owner: Multi0 + TurretFacing: 0 + Facing: 384 + Location: 81,136 + Actor1949: 3tnk + Owner: Multi0 + TurretFacing: 0 + Facing: 384 + Location: 83,136 + Actor1481: wormhole.enable.hazmat + Owner: Multi0 + Location: 24,116 + Actor1487: wormhole.disable.hazmat + Owner: Multi0 + Location: 24,119 + Actor1877: wormhole.enable.flakarmor + Owner: Multi0 + Location: 24,122 + Actor1878: wormhole.disable.flakarmor + Owner: Multi0 + Location: 24,125 + Actor1879: wormhole.enable.cyborgarmor + Owner: Multi0 + Location: 24,128 + Actor1893: wormhole.disable.cyborgarmor + Owner: Multi0 + Location: 24,131 + Actor1890: ifv + Owner: HostileDummy + Facing: 384 + Stance: AttackAnything + Location: 90,27 + Actor1891: btr + Facing: 384 + Owner: HostileDummy + Stance: AttackAnything + Location: 101,27 + Actor1892: vulc + Owner: HostileDummy + Facing: 384 + Stance: AttackAnything + Location: 112,27 + Actor1894: stnk.nod + Owner: HostileDummy + Facing: 384 + Stance: AttackAnything + Location: 123,27 + Actor1895: gunw + Owner: HostileDummy + Facing: 384 + Stance: AttackAnything + Location: 134,27 + Actor1896: e3 + Owner: HostileDummy + SubCell: 3 + Facing: 384 + Stance: AttackAnything + Location: 145,27 + Actor1917: s3 + Owner: HostileDummy + SubCell: 3 + Facing: 384 + Stance: AttackAnything + Location: 156,27 + Actor1496: splitblue + Owner: Neutral + Location: 98,45 + Actor1596: split2 + Owner: Neutral + Location: 118,45 + Actor1642: mine + Owner: Neutral + Location: 108,50 + Actor1643: gmine + Owner: Neutral + Location: 98,56 + Actor1654: split2 + Owner: Neutral + Location: 118,56 + Actor1657: brik + Owner: Dummy + Location: 37,153 + Actor1880: brik + Owner: Dummy + Location: 38,153 + Actor1881: brik + Owner: Dummy + Location: 39,153 + Actor1887: brik + Owner: Dummy + Location: 37,154 + Actor1888: brik + Owner: Dummy + Location: 38,154 + Actor1889: brik + Owner: Dummy + Location: 39,154 + Actor1918: brik + Owner: Dummy + Location: 37,155 + Actor1962: brik + Owner: Dummy + Location: 38,155 + Actor1963: brik + Owner: Dummy + Location: 39,155 + Actor1964: chain + Owner: Dummy + Location: 37,156 + Actor1965: chain + Owner: Dummy + Location: 38,156 + Actor1966: chain + Owner: Dummy + Location: 39,156 + Actor1967: chain + Owner: Dummy + Location: 37,157 + Actor1968: chain + Owner: Dummy + Location: 38,157 + Actor1969: chain + Owner: Dummy + Location: 39,157 + Actor1979: chain + Owner: Dummy + Location: 37,158 + Actor1980: chain + Owner: Dummy + Location: 38,158 + Actor1981: chain + Owner: Dummy + Location: 39,158 + Actor1982: fenc + Owner: Dummy + Location: 37,159 + Actor1983: fenc + Owner: Dummy + Location: 38,159 + Actor1984: fenc + Owner: Dummy + Location: 39,159 + Actor1985: fenc + Owner: Dummy + Location: 37,160 + Actor1986: fenc + Owner: Dummy + Location: 38,160 + Actor1987: fenc + Owner: Dummy + Location: 39,160 + Actor1988: fenc + Owner: Dummy + Location: 37,161 + Actor1989: fenc + Owner: Dummy + Location: 38,161 + Actor1990: fenc + Owner: Dummy + Location: 39,161 + Actor1991: sbag + Owner: Dummy + Location: 37,162 + Actor1992: sbag + Owner: Dummy + Location: 38,162 + Actor1993: sbag + Owner: Dummy + Location: 39,162 + Actor1994: sbag + Owner: Dummy + Location: 37,163 + Actor1995: sbag + Owner: Dummy + Location: 38,163 + Actor1996: sbag + Owner: Dummy + Location: 39,163 + Actor1997: sbag + Owner: Dummy + Location: 37,164 + Actor1998: sbag + Owner: Dummy + Location: 38,164 + Actor1999: sbag + Owner: Dummy + Location: 39,164 + Actor2000: barb + Owner: Dummy + Location: 37,165 + Actor2001: barb + Owner: Dummy + Location: 38,165 + Actor2002: barb + Owner: Dummy + Location: 39,165 + Actor2009: barb + Owner: Dummy + Location: 37,166 + Actor2010: barb + Owner: Dummy + Location: 38,166 + Actor2011: barb + Owner: Dummy + Location: 39,166 + Actor2012: barb + Owner: Dummy + Location: 37,167 + Actor2013: barb + Owner: Dummy + Location: 38,167 + Actor2014: barb + Owner: Dummy + Location: 39,167 + Actor2015: barl + Owner: Neutral + Location: 37,169 + Actor2016: brl3 + Owner: Neutral + Location: 38,169 + Actor2017: barl + Owner: Neutral + Location: 39,169 + Actor2018: barl + Owner: Neutral + Location: 38,170 + Actor2019: barl + Owner: Dummy + Location: 37,173 + Actor2020: brl3 + Owner: Dummy + Location: 38,173 + Actor2021: barl + Owner: Dummy + Location: 39,173 + Actor2022: barl + Owner: Dummy + Location: 38,174 + Actor2023: minv + Owner: HostileDummy + Location: 37,176 + Actor2024: minv + Owner: HostileDummy + Location: 38,176 + Actor2025: minv + Owner: HostileDummy + Location: 39,176 + Actor2026: minv + Owner: HostileDummy + Location: 37,177 + Actor2027: minv + Owner: HostileDummy + Location: 38,177 + Actor2028: minv + Owner: HostileDummy + Location: 39,177 + Actor1489: afld + Owner: Multi0 + Location: 42,122 + Actor1490: afld + Owner: Multi0 + Location: 47,122 + Actor1634: afld + Owner: Multi0 + Location: 42,125 + Actor1635: afld + Owner: Multi0 + Location: 47,125 + Actor1636: fix + Owner: Multi0 + Location: 44,127 + Actor1637: afld + Owner: Multi0 + Location: 42,130 + Actor1638: afld + Owner: Multi0 + Location: 47,130 + Actor1639: afld + Owner: Multi0 + Location: 42,133 + Actor1640: afld + Owner: Multi0 + Location: 47,133 + Actor1646: batf + Owner: Dummy + Facing: 384 + Location: 10,106 + Actor1647: batf + Owner: Dummy + Facing: 384 + Location: 15,106 + Actor1777: batf + Owner: Dummy + Facing: 384 + Location: 20,106 + Actor1778: batf + Owner: Dummy + Facing: 384 + Location: 25,106 + Actor1779: htnk + Owner: Dummy + Facing: 384 + Location: 30,106 + Actor1780: htnk + Owner: Dummy + Facing: 384 + Location: 35,106 + Actor2029: htnk + Owner: Dummy + Facing: 384 + Location: 40,106 + Actor2030: htnk + Owner: Dummy + Facing: 384 + Location: 45,106 + Actor496: apwr + Owner: Dummy + Location: 110,90 + Actor497: apwr + Owner: Dummy + Location: 120,90 + Actor498: hmmv + Owner: Dummy + Facing: 384 + Location: 54,91 + Actor499: seek + Owner: Dummy + Facing: 384 + Location: 55,91 + Actor500: ftnk + Owner: Dummy + Facing: 384 + Location: 56,91 + Actor501: seek + Owner: Dummy + Facing: 384 + Location: 57,91 + Actor502: hmmv + Owner: Dummy + Facing: 384 + Location: 58,91 + Actor503: hmmv + Owner: Dummy + Facing: 384 + Location: 63,91 + Actor504: seek + Owner: Dummy + Facing: 384 + Location: 64,91 + Actor505: ftnk + Owner: Dummy + Facing: 384 + Location: 65,91 + Actor506: seek + Owner: Dummy + Facing: 384 + Location: 66,91 + Actor507: hmmv + Owner: Dummy + Facing: 384 + Location: 67,91 + Actor508: 1tnk + Owner: Dummy + Facing: 384 + Location: 72,91 + Actor509: 3tnk + Owner: Dummy + Facing: 384 + Location: 73,91 + Actor510: 2tnk + Owner: Dummy + Facing: 384 + Location: 74,91 + Actor511: 3tnk + Owner: Dummy + Facing: 384 + Location: 75,91 + Actor512: 1tnk + Owner: Dummy + Facing: 384 + Location: 76,91 + Actor513: 1tnk + Owner: Dummy + Facing: 384 + Location: 81,91 + Actor514: 3tnk + Owner: Dummy + Facing: 384 + Location: 82,91 + Actor515: 2tnk + Owner: Dummy + Facing: 384 + Location: 83,91 + Actor516: 3tnk + Owner: Dummy + Facing: 384 + Location: 84,91 + Actor517: 1tnk + Owner: Dummy + Facing: 384 + Location: 85,91 + Actor518: e1 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 91,91 + Actor519: e1 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 91,91 + Actor520: e1 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 91,91 + Actor521: e1 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 91,91 + Actor522: e1 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 91,91 + Actor523: s4 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 92,91 + Actor524: s4 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 92,91 + Actor525: s4 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 92,91 + Actor526: s4 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 92,91 + Actor527: s4 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 92,91 + Actor528: e1 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 93,91 + Actor529: e1 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 93,91 + Actor530: e1 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 93,91 + Actor531: e1 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 93,91 + Actor532: e1 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 93,91 + Actor533: e1 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 100,91 + Actor534: e1 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 100,91 + Actor535: e1 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 100,91 + Actor536: e1 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 100,91 + Actor537: e1 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 100,91 + Actor538: s4 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 101,91 + Actor539: s4 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 101,91 + Actor540: s4 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 101,91 + Actor541: s4 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 101,91 + Actor542: s4 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 101,91 + Actor543: e1 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 102,91 + Actor544: e1 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 102,91 + Actor545: e1 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 102,91 + Actor546: e1 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 102,91 + Actor547: e1 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 102,91 + Actor548: tsla + Faction: Random + Owner: Dummy + Location: 130,91 + Actor549: tsla + Faction: Random + Owner: Dummy + Location: 138,91 + Actor550: fact + Faction: Random + Owner: Dummy + Location: 144,91 + Actor551: fact + Faction: Random + Owner: Dummy + Location: 150,91 + Actor552: proc + Location: 178,91 + Owner: Dummy + Actor553: seek + Owner: Dummy + Facing: 384 + Location: 54,92 + Actor554: gunw + Owner: Dummy + Facing: 384 + Location: 55,92 + Actor555: ctnk + Owner: Dummy + Facing: 384 + Location: 56,92 + Actor556: gunw + Owner: Dummy + Facing: 384 + Location: 57,92 + Actor557: seek + Owner: Dummy + Facing: 384 + Location: 58,92 + Actor558: seek + Owner: Dummy + Facing: 384 + Location: 63,92 + Actor559: gunw + Owner: Dummy + Facing: 384 + Location: 64,92 + Actor560: ctnk + Owner: Dummy + Facing: 384 + Location: 65,92 + Actor561: gunw + Owner: Dummy + Facing: 384 + Location: 66,92 + Actor562: seek + Owner: Dummy + Facing: 384 + Location: 67,92 + Actor563: 3tnk + Owner: Dummy + Facing: 384 + Location: 72,92 + Actor564: 2tnk + Owner: Dummy + Facing: 384 + Location: 73,92 + Actor565: 4tnk + Owner: Dummy + Facing: 384 + Location: 74,92 + Actor566: 2tnk + Owner: Dummy + Facing: 384 + Location: 75,92 + Actor567: 3tnk + Owner: Dummy + Facing: 384 + Location: 76,92 + Actor568: 3tnk + Owner: Dummy + Facing: 384 + Location: 81,92 + Actor569: 2tnk + Owner: Dummy + Facing: 384 + Location: 82,92 + Actor570: 4tnk + Owner: Dummy + Facing: 384 + Location: 83,92 + Actor571: 2tnk + Owner: Dummy + Facing: 384 + Location: 84,92 + Actor572: 3tnk + Owner: Dummy + Facing: 384 + Location: 85,92 + Actor573: e1 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 90,92 + Actor574: e1 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 90,92 + Actor575: e1 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 90,92 + Actor576: e1 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 90,92 + Actor577: e1 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 90,92 + Actor578: ttrp + Owner: Dummy + SubCell: 3 + Facing: 384 + Location: 91,92 + Actor579: ttrp + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 91,92 + Actor580: ttrp + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 91,92 + Actor581: ttrp + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 91,92 + Actor582: ttrp + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 91,92 + Actor583: e1 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 92,92 + Actor584: e1 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 92,92 + Actor585: e1 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 92,92 + Actor586: e1 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 92,92 + Actor587: e1 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 92,92 + Actor588: ttrp + Owner: Dummy + SubCell: 3 + Facing: 384 + Location: 93,92 + Actor589: ttrp + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 93,92 + Actor590: ttrp + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 93,92 + Actor591: ttrp + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 93,92 + Actor592: ttrp + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 93,92 + Actor593: e1 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 94,92 + Actor594: e1 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 94,92 + Actor595: e1 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 94,92 + Actor596: e1 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 94,92 + Actor597: e1 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 94,92 + Actor598: e1 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 99,92 + Actor599: e1 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 99,92 + Actor600: e1 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 99,92 + Actor601: e1 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 99,92 + Actor602: e1 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 99,92 + Actor603: ttrp + Owner: Dummy + SubCell: 3 + Facing: 384 + Location: 100,92 + Actor604: ttrp + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 100,92 + Actor605: ttrp + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 100,92 + Actor606: ttrp + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 100,92 + Actor607: ttrp + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 100,92 + Actor608: e1 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 101,92 + Actor609: e1 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 101,92 + Actor610: e1 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 101,92 + Actor611: e1 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 101,92 + Actor612: e1 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 101,92 + Actor613: ttrp + Owner: Dummy + SubCell: 3 + Facing: 384 + Location: 102,92 + Actor614: ttrp + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 102,92 + Actor615: ttrp + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 102,92 + Actor616: ttrp + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 102,92 + Actor617: ttrp + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 102,92 + Actor618: e1 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 103,92 + Actor619: e1 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 103,92 + Actor620: e1 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 103,92 + Actor621: e1 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 103,92 + Actor622: e1 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 103,92 + Actor623: powr + Faction: Random + Owner: Dummy + Location: 108,92 + Actor624: powr + Faction: Random + Owner: Dummy + Location: 113,92 + Actor625: powr + Faction: Random + Owner: Dummy + Location: 118,92 + Actor626: powr + Faction: Random + Owner: Dummy + Location: 123,92 + Actor627: atwr + Owner: Dummy + Location: 129,92 + Actor628: gtwr + Owner: Dummy + Location: 130,92 + Actor629: atwr + Owner: Dummy + Location: 131,92 + Actor630: atwr + Owner: Dummy + Location: 137,92 + Actor631: gtwr + Owner: Dummy + Location: 138,92 + Actor632: atwr + Owner: Dummy + Location: 139,92 + Actor633: dome + Owner: Dummy + Location: 156,92 + Actor634: dome + Owner: Dummy + Location: 161,92 + Actor635: powr + Owner: Dummy + Location: 167,92 + Actor636: powr + Owner: Dummy + Location: 172,92 + Actor637: ftnk + Owner: Dummy + Facing: 384 + Location: 54,93 + Actor638: ctnk + Owner: Dummy + Facing: 384 + Location: 55,93 + Actor639: ptnk + Owner: Dummy + Facing: 384 + Location: 56,93 + Actor640: camera + Owner: Multi0 + Location: 56,93 + Actor641: ctnk + Owner: Dummy + Facing: 384 + Location: 57,93 + Actor642: ftnk + Owner: Dummy + Facing: 384 + Location: 58,93 + Actor643: ftnk + Owner: Dummy + Facing: 384 + Location: 63,93 + Actor644: ctnk + Owner: Dummy + Facing: 384 + Location: 64,93 + Actor645: ptnk + Owner: Dummy + Facing: 384 + Location: 65,93 + Actor646: camera + Owner: Multi0 + Location: 65,93 + Actor647: ctnk + Owner: Dummy + Facing: 384 + Location: 66,93 + Actor648: ftnk + Owner: Dummy + Facing: 384 + Location: 67,93 + Actor649: 2tnk + Owner: Dummy + Facing: 384 + Location: 72,93 + Actor650: 4tnk + Owner: Dummy + Facing: 384 + Location: 73,93 + Actor651: 3tnk + Owner: Dummy + Facing: 384 + Location: 74,93 + Actor652: camera + Owner: Multi0 + Location: 74,93 + Actor653: 4tnk + Owner: Dummy + Facing: 384 + Location: 75,93 + Actor654: 2tnk + Owner: Dummy + Facing: 384 + Location: 76,93 + Actor655: 2tnk + Owner: Dummy + Facing: 384 + Location: 81,93 + Actor656: 4tnk + Owner: Dummy + Facing: 384 + Location: 82,93 + Actor657: 3tnk + Owner: Dummy + Facing: 384 + Location: 83,93 + Actor658: camera + Owner: Multi0 + Location: 83,93 + Actor659: 4tnk + Owner: Dummy + Facing: 384 + Location: 84,93 + Actor660: 2tnk + Owner: Dummy + Facing: 384 + Location: 85,93 + Actor661: s4 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 90,93 + Actor662: s4 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 90,93 + Actor663: s4 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 90,93 + Actor664: s4 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 90,93 + Actor665: s4 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 90,93 + Actor666: e1 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 91,93 + Actor667: e1 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 91,93 + Actor668: e1 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 91,93 + Actor669: e1 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 91,93 + Actor670: e1 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 91,93 + Actor671: tplr + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 92,93 + Actor672: tplr + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 92,93 + Actor673: tplr + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 92,93 + Actor674: tplr + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 92,93 + Actor675: tplr + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 92,93 + Actor676: camera + Owner: Multi0 + Location: 92,93 + Actor677: e1 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 93,93 + Actor678: e1 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 93,93 + Actor679: e1 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 93,93 + Actor680: e1 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 93,93 + Actor681: e1 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 93,93 + Actor682: s4 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 94,93 + Actor683: s4 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 94,93 + Actor684: s4 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 94,93 + Actor685: s4 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 94,93 + Actor686: s4 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 94,93 + Actor687: s4 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 99,93 + Actor688: s4 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 99,93 + Actor689: s4 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 99,93 + Actor690: s4 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 99,93 + Actor691: s4 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 99,93 + Actor692: e1 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 100,93 + Actor693: e1 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 100,93 + Actor694: e1 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 100,93 + Actor695: e1 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 100,93 + Actor696: e1 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 100,93 + Actor697: tplr + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 101,93 + Actor698: tplr + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 101,93 + Actor699: tplr + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 101,93 + Actor700: tplr + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 101,93 + Actor701: tplr + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 101,93 + Actor702: camera + Owner: Multi0 + Location: 101,93 + Actor703: e1 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 102,93 + Actor704: e1 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 102,93 + Actor705: e1 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 102,93 + Actor706: e1 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 102,93 + Actor707: e1 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 102,93 + Actor708: s4 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 103,93 + Actor709: s4 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 103,93 + Actor710: s4 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 103,93 + Actor711: s4 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 103,93 + Actor712: s4 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 103,93 + Actor713: apwr + Faction: Random + Owner: Dummy + Location: 110,93 + Actor714: camera + Owner: Multi0 + Location: 111,93 + Actor715: apwr + Faction: Random + Owner: Dummy + Location: 120,93 + Actor716: camera + Owner: Multi0 + Location: 121,93 + Actor717: tsla + Faction: Random + Owner: Dummy + Location: 128,93 + Actor718: gtwr + Owner: Dummy + Location: 129,93 + Actor719: camera + Owner: Multi0 + Location: 130,93 + Actor720: obli + Owner: Dummy + Location: 130,93 + Actor721: gtwr + Owner: Dummy + Location: 131,93 + Actor722: tsla + Faction: Random + Owner: Dummy + Location: 132,93 + Actor723: tsla + Faction: Random + Owner: Dummy + Location: 136,93 + Actor724: gtwr + Owner: Dummy + Location: 137,93 + Actor725: camera + Owner: Multi0 + Location: 138,93 + Actor726: obli + Owner: Dummy + Location: 138,93 + Actor727: gtwr + Owner: Dummy + Location: 139,93 + Actor728: tsla + Faction: Random + Owner: Dummy + Location: 140,93 + Actor729: camera + Owner: Multi0 + Location: 145,93 + Actor730: camera + Owner: Multi0 + Location: 151,93 + Actor731: camera + Owner: Multi0 + Location: 157,93 + Actor732: camera + Owner: Multi0 + Location: 162,93 + Actor733: camera + Owner: Multi0 + Location: 168,93 + Actor734: camera + Owner: Multi0 + Location: 173,93 + Actor735: seek + Owner: Dummy + Facing: 384 + Location: 54,94 + Actor736: gunw + Owner: Dummy + Facing: 384 + Location: 55,94 + Actor737: ctnk + Owner: Dummy + Facing: 384 + Location: 56,94 + Actor738: gunw + Owner: Dummy + Facing: 384 + Location: 57,94 + Actor739: seek + Owner: Dummy + Facing: 384 + Location: 58,94 + Actor740: seek + Owner: Dummy + Facing: 384 + Location: 63,94 + Actor741: gunw + Owner: Dummy + Facing: 384 + Location: 64,94 + Actor742: ctnk + Owner: Dummy + Facing: 384 + Location: 65,94 + Actor743: gunw + Owner: Dummy + Facing: 384 + Location: 66,94 + Actor744: seek + Owner: Dummy + Facing: 384 + Location: 67,94 + Actor745: 3tnk + Owner: Dummy + Facing: 384 + Location: 72,94 + Actor746: 2tnk + Owner: Dummy + Facing: 384 + Location: 73,94 + Actor747: 4tnk + Owner: Dummy + Facing: 384 + Location: 74,94 + Actor748: 2tnk + Owner: Dummy + Facing: 384 + Location: 75,94 + Actor749: 3tnk + Owner: Dummy + Facing: 384 + Location: 76,94 + Actor750: 3tnk + Owner: Dummy + Facing: 384 + Location: 81,94 + Actor751: 2tnk + Owner: Dummy + Facing: 384 + Location: 82,94 + Actor752: 4tnk + Owner: Dummy + Facing: 384 + Location: 83,94 + Actor753: 2tnk + Owner: Dummy + Facing: 384 + Location: 84,94 + Actor754: 3tnk + Owner: Dummy + Facing: 384 + Location: 85,94 + Actor755: e1 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 90,94 + Actor756: e1 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 90,94 + Actor757: e1 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 90,94 + Actor758: e1 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 90,94 + Actor759: e1 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 90,94 + Actor760: shok + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 91,94 + Actor761: shok + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 91,94 + Actor762: shok + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 91,94 + Actor763: shok + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 91,94 + Actor764: shok + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 91,94 + Actor765: e1 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 92,94 + Actor766: e1 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 92,94 + Actor767: e1 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 92,94 + Actor768: e1 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 92,94 + Actor769: e1 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 92,94 + Actor770: shok + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 93,94 + Actor771: shok + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 93,94 + Actor772: shok + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 93,94 + Actor773: shok + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 93,94 + Actor774: shok + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 93,94 + Actor775: e1 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 94,94 + Actor776: e1 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 94,94 + Actor777: e1 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 94,94 + Actor778: e1 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 94,94 + Actor779: e1 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 94,94 + Actor780: e1 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 99,94 + Actor781: e1 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 99,94 + Actor782: e1 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 99,94 + Actor783: e1 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 99,94 + Actor784: e1 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 99,94 + Actor785: shok + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 100,94 + Actor786: shok + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 100,94 + Actor787: shok + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 100,94 + Actor788: shok + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 100,94 + Actor789: shok + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 100,94 + Actor790: e1 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 101,94 + Actor791: e1 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 101,94 + Actor792: e1 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 101,94 + Actor793: e1 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 101,94 + Actor794: e1 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 101,94 + Actor795: shok + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 102,94 + Actor796: shok + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 102,94 + Actor797: shok + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 102,94 + Actor798: shok + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 102,94 + Actor799: shok + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 102,94 + Actor800: e1 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 103,94 + Actor801: e1 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 103,94 + Actor802: e1 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 103,94 + Actor803: e1 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 103,94 + Actor804: e1 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 103,94 + Actor805: atwr + Owner: Dummy + Location: 129,94 + Actor806: gtwr + Owner: Dummy + Location: 130,94 + Actor807: atwr + Owner: Dummy + Location: 131,94 + Actor808: atwr + Owner: Dummy + Location: 137,94 + Actor809: gtwr + Owner: Dummy + Location: 138,94 + Actor810: atwr + Owner: Dummy + Location: 139,94 + Actor811: hmmv + Owner: Dummy + Facing: 384 + Location: 54,95 + Actor812: seek + Owner: Dummy + Facing: 384 + Location: 55,95 + Actor813: ftnk + Owner: Dummy + Facing: 384 + Location: 56,95 + Actor814: seek + Owner: Dummy + Facing: 384 + Location: 57,95 + Actor815: hmmv + Owner: Dummy + Facing: 384 + Location: 58,95 + Actor816: hmmv + Owner: Dummy + Facing: 384 + Location: 63,95 + Actor817: seek + Owner: Dummy + Facing: 384 + Location: 64,95 + Actor818: ftnk + Owner: Dummy + Facing: 384 + Location: 65,95 + Actor819: seek + Owner: Dummy + Facing: 384 + Location: 66,95 + Actor820: hmmv + Owner: Dummy + Facing: 384 + Location: 67,95 + Actor821: 1tnk + Owner: Dummy + Facing: 384 + Location: 72,95 + Actor822: 3tnk + Owner: Dummy + Facing: 384 + Location: 73,95 + Actor823: 2tnk + Owner: Dummy + Facing: 384 + Location: 74,95 + Actor824: 3tnk + Owner: Dummy + Facing: 384 + Location: 75,95 + Actor825: 1tnk + Owner: Dummy + Facing: 384 + Location: 76,95 + Actor826: 1tnk + Owner: Dummy + Facing: 384 + Location: 81,95 + Actor827: 3tnk + Owner: Dummy + Facing: 384 + Location: 82,95 + Actor828: 2tnk + Owner: Dummy + Facing: 384 + Location: 83,95 + Actor829: 3tnk + Owner: Dummy + Facing: 384 + Location: 84,95 + Actor830: 1tnk + Owner: Dummy + Facing: 384 + Location: 85,95 + Actor831: e1 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 91,95 + Actor832: e1 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 91,95 + Actor833: e1 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 91,95 + Actor834: e1 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 91,95 + Actor835: e1 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 91,95 + Actor836: s4 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 92,95 + Actor837: s4 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 92,95 + Actor838: s4 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 92,95 + Actor839: s4 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 92,95 + Actor840: s4 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 92,95 + Actor841: e1 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 93,95 + Actor842: e1 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 93,95 + Actor843: e1 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 93,95 + Actor844: e1 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 93,95 + Actor845: e1 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 93,95 + Actor846: e1 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 100,95 + Actor847: e1 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 100,95 + Actor848: e1 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 100,95 + Actor849: e1 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 100,95 + Actor850: e1 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 100,95 + Actor851: s4 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 101,95 + Actor852: s4 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 101,95 + Actor853: s4 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 101,95 + Actor854: s4 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 101,95 + Actor855: s4 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 101,95 + Actor856: e1 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 102,95 + Actor857: e1 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 102,95 + Actor858: e1 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 102,95 + Actor859: e1 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 102,95 + Actor860: e1 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 102,95 + Actor861: tsla + Faction: Random + Owner: Dummy + Location: 130,95 + Actor862: tsla + Faction: Random + Owner: Dummy + Location: 138,95 + Actor863: apwr + Owner: Dummy + Location: 110,104 + Actor864: apwr + Owner: Dummy + Location: 120,104 + Actor865: hmmv + Owner: Dummy + Facing: 384 + Location: 54,105 + Actor866: seek + Owner: Dummy + Facing: 384 + Location: 55,105 + Actor867: ftnk + Owner: Dummy + Facing: 384 + Location: 56,105 + Actor868: seek + Owner: Dummy + Facing: 384 + Location: 57,105 + Actor869: hmmv + Owner: Dummy + Facing: 384 + Location: 58,105 + Actor870: hmmv + Owner: Dummy + Facing: 384 + Location: 63,105 + Actor871: seek + Owner: Dummy + Facing: 384 + Location: 64,105 + Actor872: ftnk + Owner: Dummy + Facing: 384 + Location: 65,105 + Actor873: seek + Owner: Dummy + Facing: 384 + Location: 66,105 + Actor874: hmmv + Owner: Dummy + Facing: 384 + Location: 67,105 + Actor875: 1tnk + Owner: Dummy + Facing: 384 + Location: 72,105 + Actor876: 3tnk + Owner: Dummy + Facing: 384 + Location: 73,105 + Actor877: 2tnk + Owner: Dummy + Facing: 384 + Location: 74,105 + Actor878: 3tnk + Owner: Dummy + Facing: 384 + Location: 75,105 + Actor879: 1tnk + Owner: Dummy + Facing: 384 + Location: 76,105 + Actor880: 1tnk + Owner: Dummy + Facing: 384 + Location: 81,105 + Actor881: 3tnk + Owner: Dummy + Facing: 384 + Location: 82,105 + Actor882: 2tnk + Owner: Dummy + Facing: 384 + Location: 83,105 + Actor883: 3tnk + Owner: Dummy + Facing: 384 + Location: 84,105 + Actor884: 1tnk + Owner: Dummy + Facing: 384 + Location: 85,105 + Actor885: e1 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 91,105 + Actor886: e1 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 91,105 + Actor887: e1 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 91,105 + Actor888: e1 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 91,105 + Actor889: e1 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 91,105 + Actor890: s4 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 92,105 + Actor891: s4 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 92,105 + Actor892: s4 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 92,105 + Actor893: s4 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 92,105 + Actor894: s4 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 92,105 + Actor895: e1 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 93,105 + Actor896: e1 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 93,105 + Actor897: e1 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 93,105 + Actor898: e1 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 93,105 + Actor899: e1 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 93,105 + Actor900: e1 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 100,105 + Actor901: e1 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 100,105 + Actor902: e1 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 100,105 + Actor903: e1 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 100,105 + Actor904: e1 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 100,105 + Actor905: s4 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 101,105 + Actor906: s4 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 101,105 + Actor907: s4 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 101,105 + Actor908: s4 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 101,105 + Actor909: s4 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 101,105 + Actor910: e1 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 102,105 + Actor911: e1 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 102,105 + Actor912: e1 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 102,105 + Actor913: e1 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 102,105 + Actor914: e1 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 102,105 + Actor915: tsla + Faction: Random + Owner: Dummy + Location: 130,105 + Actor916: tsla + Faction: Random + Owner: Dummy + Location: 138,105 + Actor917: fact + Faction: Random + Owner: Dummy + Location: 144,105 + Actor918: fact + Faction: Random + Owner: Dummy + Location: 150,105 + Actor919: proc + Location: 178,105 + Owner: Dummy + Actor920: seek + Owner: Dummy + Facing: 384 + Location: 54,106 + Actor921: gunw + Owner: Dummy + Facing: 384 + Location: 55,106 + Actor922: ctnk + Owner: Dummy + Facing: 384 + Location: 56,106 + Actor923: gunw + Owner: Dummy + Facing: 384 + Location: 57,106 + Actor924: seek + Owner: Dummy + Facing: 384 + Location: 58,106 + Actor925: seek + Owner: Dummy + Facing: 384 + Location: 63,106 + Actor926: gunw + Owner: Dummy + Facing: 384 + Location: 64,106 + Actor927: ctnk + Owner: Dummy + Facing: 384 + Location: 65,106 + Actor928: gunw + Owner: Dummy + Facing: 384 + Location: 66,106 + Actor929: seek + Owner: Dummy + Facing: 384 + Location: 67,106 + Actor930: 3tnk + Owner: Dummy + Facing: 384 + Location: 72,106 + Actor931: 2tnk + Owner: Dummy + Facing: 384 + Location: 73,106 + Actor932: 4tnk + Owner: Dummy + Facing: 384 + Location: 74,106 + Actor933: 2tnk + Owner: Dummy + Facing: 384 + Location: 75,106 + Actor934: 3tnk + Owner: Dummy + Facing: 384 + Location: 76,106 + Actor935: 3tnk + Owner: Dummy + Facing: 384 + Location: 81,106 + Actor936: 2tnk + Owner: Dummy + Facing: 384 + Location: 82,106 + Actor937: 4tnk + Owner: Dummy + Facing: 384 + Location: 83,106 + Actor938: 2tnk + Owner: Dummy + Facing: 384 + Location: 84,106 + Actor939: 3tnk + Owner: Dummy + Facing: 384 + Location: 85,106 + Actor940: e1 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 90,106 + Actor941: e1 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 90,106 + Actor942: e1 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 90,106 + Actor943: e1 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 90,106 + Actor944: e1 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 90,106 + Actor945: ttrp + Owner: Dummy + SubCell: 3 + Facing: 384 + Location: 91,106 + Actor946: ttrp + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 91,106 + Actor947: ttrp + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 91,106 + Actor948: ttrp + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 91,106 + Actor949: ttrp + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 91,106 + Actor950: e1 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 92,106 + Actor951: e1 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 92,106 + Actor952: e1 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 92,106 + Actor953: e1 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 92,106 + Actor954: e1 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 92,106 + Actor955: ttrp + Owner: Dummy + SubCell: 3 + Facing: 384 + Location: 93,106 + Actor956: ttrp + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 93,106 + Actor957: ttrp + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 93,106 + Actor958: ttrp + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 93,106 + Actor959: ttrp + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 93,106 + Actor960: e1 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 94,106 + Actor961: e1 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 94,106 + Actor962: e1 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 94,106 + Actor963: e1 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 94,106 + Actor964: e1 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 94,106 + Actor965: e1 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 99,106 + Actor966: e1 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 99,106 + Actor967: e1 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 99,106 + Actor968: e1 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 99,106 + Actor969: e1 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 99,106 + Actor970: ttrp + Owner: Dummy + SubCell: 3 + Facing: 384 + Location: 100,106 + Actor971: ttrp + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 100,106 + Actor972: ttrp + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 100,106 + Actor973: ttrp + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 100,106 + Actor974: ttrp + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 100,106 + Actor975: e1 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 101,106 + Actor976: e1 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 101,106 + Actor977: e1 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 101,106 + Actor978: e1 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 101,106 + Actor979: e1 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 101,106 + Actor980: ttrp + Owner: Dummy + SubCell: 3 + Facing: 384 + Location: 102,106 + Actor981: ttrp + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 102,106 + Actor982: ttrp + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 102,106 + Actor983: ttrp + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 102,106 + Actor984: ttrp + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 102,106 + Actor985: e1 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 103,106 + Actor986: e1 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 103,106 + Actor987: e1 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 103,106 + Actor988: e1 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 103,106 + Actor989: e1 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 103,106 + Actor990: powr + Faction: Random + Owner: Dummy + Location: 108,106 + Actor991: powr + Faction: Random + Owner: Dummy + Location: 113,106 + Actor992: powr + Faction: Random + Owner: Dummy + Location: 118,106 + Actor993: powr + Faction: Random + Owner: Dummy + Location: 123,106 + Actor994: atwr + Owner: Dummy + Location: 129,106 + Actor995: gtwr + Owner: Dummy + Location: 130,106 + Actor996: atwr + Owner: Dummy + Location: 131,106 + Actor997: atwr + Owner: Dummy + Location: 137,106 + Actor998: gtwr + Owner: Dummy + Location: 138,106 + Actor999: atwr + Owner: Dummy + Location: 139,106 + Actor1000: dome + Owner: Dummy + Location: 156,106 + Actor1001: dome + Owner: Dummy + Location: 161,106 + Actor1002: powr + Owner: Dummy + Location: 167,106 + Actor1003: powr + Owner: Dummy + Location: 172,106 + Actor1004: ftnk + Owner: Dummy + Facing: 384 + Location: 54,107 + Actor1005: ctnk + Owner: Dummy + Facing: 384 + Location: 55,107 + Actor1006: ptnk + Owner: Dummy + Facing: 384 + Location: 56,107 + Actor1007: camera + Owner: Multi0 + Location: 56,107 + Actor1008: ctnk + Owner: Dummy + Facing: 384 + Location: 57,107 + Actor1009: ftnk + Owner: Dummy + Facing: 384 + Location: 58,107 + Actor1010: ftnk + Owner: Dummy + Facing: 384 + Location: 63,107 + Actor1011: ctnk + Owner: Dummy + Facing: 384 + Location: 64,107 + Actor1012: ptnk + Owner: Dummy + Facing: 384 + Location: 65,107 + Actor1013: camera + Owner: Multi0 + Location: 65,107 + Actor1014: ctnk + Owner: Dummy + Facing: 384 + Location: 66,107 + Actor1015: ftnk + Owner: Dummy + Facing: 384 + Location: 67,107 + Actor1016: 2tnk + Owner: Dummy + Facing: 384 + Location: 72,107 + Actor1017: 4tnk + Owner: Dummy + Facing: 384 + Location: 73,107 + Actor1018: 3tnk + Owner: Dummy + Facing: 384 + Location: 74,107 + Actor1019: camera + Owner: Multi0 + Location: 74,107 + Actor1020: 4tnk + Owner: Dummy + Facing: 384 + Location: 75,107 + Actor1021: 2tnk + Owner: Dummy + Facing: 384 + Location: 76,107 + Actor1022: 2tnk + Owner: Dummy + Facing: 384 + Location: 81,107 + Actor1023: 4tnk + Owner: Dummy + Facing: 384 + Location: 82,107 + Actor1024: 3tnk + Owner: Dummy + Facing: 384 + Location: 83,107 + Actor1025: camera + Owner: Multi0 + Location: 83,107 + Actor1026: 4tnk + Owner: Dummy + Facing: 384 + Location: 84,107 + Actor1027: 2tnk + Owner: Dummy + Facing: 384 + Location: 85,107 + Actor1028: s4 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 90,107 + Actor1029: s4 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 90,107 + Actor1030: s4 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 90,107 + Actor1031: s4 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 90,107 + Actor1032: s4 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 90,107 + Actor1033: e1 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 91,107 + Actor1034: e1 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 91,107 + Actor1035: e1 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 91,107 + Actor1036: e1 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 91,107 + Actor1037: e1 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 91,107 + Actor1038: tplr + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 92,107 + Actor1039: tplr + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 92,107 + Actor1040: tplr + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 92,107 + Actor1041: tplr + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 92,107 + Actor1042: tplr + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 92,107 + Actor1043: camera + Owner: Multi0 + Location: 92,107 + Actor1044: e1 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 93,107 + Actor1045: e1 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 93,107 + Actor1046: e1 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 93,107 + Actor1047: e1 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 93,107 + Actor1048: e1 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 93,107 + Actor1049: s4 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 94,107 + Actor1050: s4 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 94,107 + Actor1051: s4 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 94,107 + Actor1052: s4 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 94,107 + Actor1053: s4 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 94,107 + Actor1054: s4 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 99,107 + Actor1055: s4 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 99,107 + Actor1056: s4 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 99,107 + Actor1057: s4 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 99,107 + Actor1058: s4 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 99,107 + Actor1059: e1 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 100,107 + Actor1060: e1 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 100,107 + Actor1061: e1 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 100,107 + Actor1062: e1 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 100,107 + Actor1063: e1 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 100,107 + Actor1064: tplr + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 101,107 + Actor1065: tplr + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 101,107 + Actor1066: tplr + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 101,107 + Actor1067: tplr + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 101,107 + Actor1068: tplr + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 101,107 + Actor1069: camera + Owner: Multi0 + Location: 101,107 + Actor1070: e1 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 102,107 + Actor1071: e1 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 102,107 + Actor1072: e1 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 102,107 + Actor1073: e1 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 102,107 + Actor1074: e1 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 102,107 + Actor1075: s4 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 103,107 + Actor1076: s4 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 103,107 + Actor1077: s4 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 103,107 + Actor1078: s4 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 103,107 + Actor1079: s4 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 103,107 + Actor1080: apwr + Faction: Random + Owner: Dummy + Location: 110,107 + Actor1081: camera + Owner: Multi0 + Location: 111,107 + Actor1082: apwr + Faction: Random + Owner: Dummy + Location: 120,107 + Actor1083: camera + Owner: Multi0 + Location: 121,107 + Actor1084: tsla + Faction: Random + Owner: Dummy + Location: 128,107 + Actor1085: gtwr + Owner: Dummy + Location: 129,107 + Actor1086: camera + Owner: Multi0 + Location: 130,107 + Actor1087: obli + Owner: Dummy + Location: 130,107 + Actor1088: gtwr + Owner: Dummy + Location: 131,107 + Actor1089: tsla + Faction: Random + Owner: Dummy + Location: 132,107 + Actor1090: tsla + Faction: Random + Owner: Dummy + Location: 136,107 + Actor1091: gtwr + Owner: Dummy + Location: 137,107 + Actor1092: camera + Owner: Multi0 + Location: 138,107 + Actor1093: obli + Owner: Dummy + Location: 138,107 + Actor1094: gtwr + Owner: Dummy + Location: 139,107 + Actor1095: tsla + Faction: Random + Owner: Dummy + Location: 140,107 + Actor1096: camera + Owner: Multi0 + Location: 145,107 + Actor1097: camera + Owner: Multi0 + Location: 151,107 + Actor1098: camera + Owner: Multi0 + Location: 157,107 + Actor1099: camera + Owner: Multi0 + Location: 162,107 + Actor1100: camera + Owner: Multi0 + Location: 168,107 + Actor1101: camera + Owner: Multi0 + Location: 173,107 + Actor1102: seek + Owner: Dummy + Facing: 384 + Location: 54,108 + Actor1103: gunw + Owner: Dummy + Facing: 384 + Location: 55,108 + Actor1104: ctnk + Owner: Dummy + Facing: 384 + Location: 56,108 + Actor1105: gunw + Owner: Dummy + Facing: 384 + Location: 57,108 + Actor1106: seek + Owner: Dummy + Facing: 384 + Location: 58,108 + Actor1107: seek + Owner: Dummy + Facing: 384 + Location: 63,108 + Actor1108: gunw + Owner: Dummy + Facing: 384 + Location: 64,108 + Actor1109: ctnk + Owner: Dummy + Facing: 384 + Location: 65,108 + Actor1110: gunw + Owner: Dummy + Facing: 384 + Location: 66,108 + Actor1111: seek + Owner: Dummy + Facing: 384 + Location: 67,108 + Actor1112: 3tnk + Owner: Dummy + Facing: 384 + Location: 72,108 + Actor1113: 2tnk + Owner: Dummy + Facing: 384 + Location: 73,108 + Actor1114: 4tnk + Owner: Dummy + Facing: 384 + Location: 74,108 + Actor1115: 2tnk + Owner: Dummy + Facing: 384 + Location: 75,108 + Actor1116: 3tnk + Owner: Dummy + Facing: 384 + Location: 76,108 + Actor1117: 3tnk + Owner: Dummy + Facing: 384 + Location: 81,108 + Actor1118: 2tnk + Owner: Dummy + Facing: 384 + Location: 82,108 + Actor1119: 4tnk + Owner: Dummy + Facing: 384 + Location: 83,108 + Actor1120: 2tnk + Owner: Dummy + Facing: 384 + Location: 84,108 + Actor1121: 3tnk + Owner: Dummy + Facing: 384 + Location: 85,108 + Actor1122: e1 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 90,108 + Actor1123: e1 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 90,108 + Actor1124: e1 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 90,108 + Actor1125: e1 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 90,108 + Actor1126: e1 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 90,108 + Actor1127: shok + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 91,108 + Actor1128: shok + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 91,108 + Actor1129: shok + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 91,108 + Actor1130: shok + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 91,108 + Actor1131: shok + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 91,108 + Actor1132: e1 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 92,108 + Actor1133: e1 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 92,108 + Actor1134: e1 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 92,108 + Actor1135: e1 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 92,108 + Actor1136: e1 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 92,108 + Actor1137: shok + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 93,108 + Actor1138: shok + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 93,108 + Actor1139: shok + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 93,108 + Actor1140: shok + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 93,108 + Actor1141: shok + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 93,108 + Actor1142: e1 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 94,108 + Actor1143: e1 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 94,108 + Actor1144: e1 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 94,108 + Actor1145: e1 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 94,108 + Actor1146: e1 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 94,108 + Actor1147: e1 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 99,108 + Actor1148: e1 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 99,108 + Actor1149: e1 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 99,108 + Actor1150: e1 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 99,108 + Actor1151: e1 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 99,108 + Actor1152: shok + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 100,108 + Actor1153: shok + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 100,108 + Actor1154: shok + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 100,108 + Actor1155: shok + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 100,108 + Actor1156: shok + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 100,108 + Actor1157: e1 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 101,108 + Actor1158: e1 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 101,108 + Actor1159: e1 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 101,108 + Actor1160: e1 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 101,108 + Actor1161: e1 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 101,108 + Actor1162: shok + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 102,108 + Actor1163: shok + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 102,108 + Actor1164: shok + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 102,108 + Actor1165: shok + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 102,108 + Actor1166: shok + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 102,108 + Actor1167: e1 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 103,108 + Actor1168: e1 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 103,108 + Actor1169: e1 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 103,108 + Actor1170: e1 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 103,108 + Actor1171: e1 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 103,108 + Actor1172: atwr + Owner: Dummy + Location: 129,108 + Actor1173: gtwr + Owner: Dummy + Location: 130,108 + Actor1174: atwr + Owner: Dummy + Location: 131,108 + Actor1175: atwr + Owner: Dummy + Location: 137,108 + Actor1176: gtwr + Owner: Dummy + Location: 138,108 + Actor1177: atwr + Owner: Dummy + Location: 139,108 + Actor1178: hmmv + Owner: Dummy + Facing: 384 + Location: 54,109 + Actor1179: seek + Owner: Dummy + Facing: 384 + Location: 55,109 + Actor1180: ftnk + Owner: Dummy + Facing: 384 + Location: 56,109 + Actor1181: seek + Owner: Dummy + Facing: 384 + Location: 57,109 + Actor1182: hmmv + Owner: Dummy + Facing: 384 + Location: 58,109 + Actor1183: hmmv + Owner: Dummy + Facing: 384 + Location: 63,109 + Actor1184: seek + Owner: Dummy + Facing: 384 + Location: 64,109 + Actor1185: ftnk + Owner: Dummy + Facing: 384 + Location: 65,109 + Actor1186: seek + Owner: Dummy + Facing: 384 + Location: 66,109 + Actor1187: hmmv + Owner: Dummy + Facing: 384 + Location: 67,109 + Actor1188: 1tnk + Owner: Dummy + Facing: 384 + Location: 72,109 + Actor1189: 3tnk + Owner: Dummy + Facing: 384 + Location: 73,109 + Actor1190: 2tnk + Owner: Dummy + Facing: 384 + Location: 74,109 + Actor1191: 3tnk + Owner: Dummy + Facing: 384 + Location: 75,109 + Actor1192: 1tnk + Owner: Dummy + Facing: 384 + Location: 76,109 + Actor1193: 1tnk + Owner: Dummy + Facing: 384 + Location: 81,109 + Actor1194: 3tnk + Owner: Dummy + Facing: 384 + Location: 82,109 + Actor1195: 2tnk + Owner: Dummy + Facing: 384 + Location: 83,109 + Actor1196: 3tnk + Owner: Dummy + Facing: 384 + Location: 84,109 + Actor1197: 1tnk + Owner: Dummy + Facing: 384 + Location: 85,109 + Actor1198: e1 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 91,109 + Actor1199: e1 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 91,109 + Actor1200: e1 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 91,109 + Actor1201: e1 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 91,109 + Actor1202: e1 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 91,109 + Actor1203: s4 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 92,109 + Actor1204: s4 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 92,109 + Actor1205: s4 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 92,109 + Actor1206: s4 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 92,109 + Actor1207: s4 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 92,109 + Actor1208: e1 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 93,109 + Actor1209: e1 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 93,109 + Actor1210: e1 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 93,109 + Actor1211: e1 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 93,109 + Actor1212: e1 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 93,109 + Actor1213: e1 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 100,109 + Actor1214: e1 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 100,109 + Actor1215: e1 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 100,109 + Actor1216: e1 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 100,109 + Actor1217: e1 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 100,109 + Actor1218: s4 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 101,109 + Actor1219: s4 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 101,109 + Actor1220: s4 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 101,109 + Actor1221: s4 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 101,109 + Actor1222: s4 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 101,109 + Actor1223: e1 + Owner: Dummy + Facing: 384 + SubCell: 3 + Location: 102,109 + Actor1224: e1 + Owner: Dummy + Facing: 384 + SubCell: 1 + Location: 102,109 + Actor1225: e1 + Owner: Dummy + Facing: 384 + SubCell: 2 + Location: 102,109 + Actor1226: e1 + Owner: Dummy + Facing: 384 + SubCell: 4 + Location: 102,109 + Actor1227: e1 + Owner: Dummy + Facing: 384 + SubCell: 5 + Location: 102,109 + Actor1228: tsla + Faction: Random + Owner: Dummy + Location: 130,109 + Actor1229: tsla + Faction: Random + Owner: Dummy + Location: 138,109 + Actor1230: rmbc + SubCell: 3 + Faction: Random + Owner: Dummy + Facing: 384 + Location: 56,78 + Actor1231: rmbc + SubCell: 1 + Faction: Random + Facing: 384 + Owner: Dummy + Location: 56,78 + Actor1232: rmbc + SubCell: 3 + Faction: Random + Owner: Dummy + Facing: 384 + Location: 64,78 + Actor1233: rmbc + SubCell: 1 + Faction: Random + Facing: 384 + Owner: Dummy + Location: 64,78 + Actor1234: rmbc + SubCell: 3 + Faction: Random + Owner: Dummy + Facing: 384 + Location: 55,79 + Actor1235: rmbc + SubCell: 1 + Faction: Random + Facing: 384 + Owner: Dummy + Location: 55,79 + Actor1236: rmbc + SubCell: 3 + Faction: Random + Owner: Dummy + Facing: 384 + Location: 56,79 + Actor1237: rmbc + SubCell: 1 + Faction: Random + Facing: 384 + Owner: Dummy + Location: 56,79 + Actor1266: rmbc + SubCell: 3 + Faction: Random + Owner: Dummy + Facing: 384 + Location: 57,79 + Actor1267: rmbc + SubCell: 1 + Faction: Random + Facing: 384 + Owner: Dummy + Location: 57,79 + Actor1268: rmbc + SubCell: 3 + Faction: Random + Owner: Dummy + Facing: 384 + Location: 63,79 + Actor1269: rmbc + SubCell: 1 + Faction: Random + Facing: 384 + Owner: Dummy + Location: 63,79 + Actor1270: rmbc + SubCell: 3 + Faction: Random + Owner: Dummy + Facing: 384 + Location: 64,79 + Actor1271: rmbc + SubCell: 1 + Faction: Random + Facing: 384 + Owner: Dummy + Location: 64,79 + Actor1272: rmbc + SubCell: 3 + Faction: Random + Owner: Dummy + Facing: 384 + Location: 65,79 + Actor1273: rmbc + SubCell: 1 + Faction: Random + Facing: 384 + Owner: Dummy + Location: 65,79 + Actor1274: rmbc + SubCell: 3 + Faction: Random + Owner: Dummy + Facing: 384 + Location: 54,80 + Actor1275: rmbc + SubCell: 1 + Faction: Random + Facing: 384 + Owner: Dummy + Location: 54,80 + Actor1276: rmbc + SubCell: 3 + Faction: Random + Owner: Dummy + Facing: 384 + Location: 55,80 + Actor1277: rmbc + SubCell: 1 + Faction: Random + Facing: 384 + Owner: Dummy + Location: 55,80 + Actor1278: rmbc + SubCell: 3 + Faction: Random + Owner: Dummy + Facing: 384 + Location: 56,80 + Actor1279: rmbc + SubCell: 1 + Faction: Random + Owner: Dummy + Facing: 384 + Location: 56,80 + Actor1280: rmbc + SubCell: 2 + Faction: Random + Owner: Dummy + Facing: 384 + Location: 56,80 + Actor1281: rmbc + SubCell: 4 + Faction: Random + Facing: 384 + Owner: Dummy + Location: 56,80 + Actor1283: rmbc + SubCell: 5 + Faction: Random + Owner: Dummy + Facing: 384 + Location: 56,80 + Actor1284: camera + Owner: Multi0 + Location: 56,80 + Actor1285: rmbc + SubCell: 3 + Faction: Random + Owner: Dummy + Facing: 384 + Location: 57,80 + Actor1286: rmbc + SubCell: 1 + Faction: Random + Facing: 384 + Owner: Dummy + Location: 57,80 + Actor1287: rmbc + SubCell: 3 + Faction: Random + Owner: Dummy + Facing: 384 + Location: 58,80 + Actor1288: rmbc + SubCell: 1 + Faction: Random + Facing: 384 + Owner: Dummy + Location: 58,80 + Actor1289: rmbc + SubCell: 3 + Faction: Random + Owner: Dummy + Facing: 384 + Location: 62,80 + Actor1290: rmbc + SubCell: 1 + Faction: Random + Facing: 384 + Owner: Dummy + Location: 62,80 + Actor1291: rmbc + SubCell: 3 + Faction: Random + Owner: Dummy + Facing: 384 + Location: 63,80 + Actor1292: rmbc + SubCell: 1 + Faction: Random + Facing: 384 + Owner: Dummy + Location: 63,80 + Actor1293: rmbc + SubCell: 3 + Faction: Random + Owner: Dummy + Facing: 384 + Location: 64,80 + Actor1294: rmbc + SubCell: 1 + Faction: Random + Owner: Dummy + Facing: 384 + Location: 64,80 + Actor1295: rmbc + SubCell: 2 + Faction: Random + Owner: Dummy + Facing: 384 + Location: 64,80 + Actor1296: rmbc + SubCell: 4 + Faction: Random + Facing: 384 + Owner: Dummy + Location: 64,80 + Actor1345: rmbc + SubCell: 5 + Faction: Random + Owner: Dummy + Facing: 384 + Location: 64,80 + Actor1346: camera + Owner: Multi0 + Location: 64,80 + Actor1347: rmbc + SubCell: 3 + Faction: Random + Owner: Dummy + Facing: 384 + Location: 65,80 + Actor1348: rmbc + SubCell: 1 + Faction: Random + Facing: 384 + Owner: Dummy + Location: 65,80 + Actor1349: rmbc + SubCell: 3 + Faction: Random + Owner: Dummy + Facing: 384 + Location: 66,80 + Actor1350: rmbc + SubCell: 1 + Faction: Random + Facing: 384 + Owner: Dummy + Location: 66,80 + Actor1351: rmbc + SubCell: 3 + Faction: Random + Owner: Dummy + Facing: 384 + Location: 55,81 + Actor1352: rmbc + SubCell: 1 + Faction: Random + Facing: 384 + Owner: Dummy + Location: 55,81 + Actor1353: rmbc + SubCell: 3 + Faction: Random + Owner: Dummy + Facing: 384 + Location: 56,81 + Actor1354: rmbc + SubCell: 1 + Faction: Random + Facing: 384 + Owner: Dummy + Location: 56,81 + Actor1355: rmbc + SubCell: 3 + Faction: Random + Owner: Dummy + Facing: 384 + Location: 57,81 + Actor1356: rmbc + SubCell: 1 + Faction: Random + Owner: Dummy + Facing: 384 + Location: 57,81 + Actor1357: rmbc + SubCell: 3 + Faction: Random + Owner: Dummy + Facing: 384 + Location: 63,81 + Actor1358: rmbc + SubCell: 1 + Faction: Random + Facing: 384 + Owner: Dummy + Location: 63,81 + Actor1359: rmbc + SubCell: 3 + Faction: Random + Owner: Dummy + Facing: 384 + Location: 64,81 + Actor1360: rmbc + SubCell: 1 + Faction: Random + Facing: 384 + Owner: Dummy + Location: 64,81 + Actor1361: rmbc + SubCell: 3 + Faction: Random + Owner: Dummy + Facing: 384 + Location: 65,81 + Actor1362: rmbc + SubCell: 1 + Faction: Random + Owner: Dummy + Facing: 384 + Location: 65,81 + Actor1363: rmbc + SubCell: 3 + Faction: Random + Owner: Dummy + Facing: 384 + Location: 56,82 + Actor1364: rmbc + SubCell: 1 + Faction: Random + Facing: 384 + Owner: Dummy + Location: 56,82 + Actor1365: rmbc + SubCell: 3 + Faction: Random + Owner: Dummy + Facing: 384 + Location: 64,82 + Actor1366: rmbc + SubCell: 1 + Faction: Random + Facing: 384 + Owner: Dummy + Location: 64,82 + Actor1367: wormhole.respawn + Owner: Multi0 + Location: 31,116 + Actor1368: wormhole.clear.upgrades + Owner: Multi0 + Location: 31,119 + Actor1369: dome + Owner: Multi0 + Location: 36,141 + Actor1370: fact + Owner: Multi0 + Location: 32,140 + Actor1372: tmpl + Owner: Multi0 + Location: 28,141 + Actor1373: eye + Owner: Multi0 + Location: 25,141 + Actor1371: mslo + Owner: Multi0 + Location: 22,143 + Actor1375: weat + Owner: Multi0 + Location: 19,142 + Actor1376: mslo.nod + Owner: Multi0 + Location: 22,141 + Actor1377: rfgn + Owner: Multi0 + Location: 16,142 + Actor1378: alhq + Owner: Multi0 + Location: 39,141 + Actor1409: sign + Owner: Multi0 + Location: 12,141 + Actor1410: spen + Owner: Multi0 + Location: 163,160 + Actor1436: spen + Owner: Multi0 + Location: 168,160 + Actor1437: camera + Owner: Multi0 + Location: 42,106 + Actor1438: camera + Owner: Multi0 + Location: 27,106 + Actor1439: camera + Owner: Multi0 + Location: 12,106 + Actor1443: katy + Owner: Multi0 + Facing: 384 + Location: 85,136 + Actor1468: mcv + Owner: Multi0 + Facing: 384 + Location: 147,134 + Actor1505: mcv + Owner: Multi0 + Facing: 384 + Location: 147,136 + Actor1519: amcv + Owner: Multi0 + Facing: 384 + Location: 147,138 + Actor1521: amcv + Owner: Multi0 + Facing: 384 + Location: 147,140 + Actor1522: smcv + Owner: Multi0 + Facing: 384 + Location: 147,142 + Actor1329: v2rl + Owner: Multi0 + Facing: 384 + Location: 95,136 + Actor1330: isu + Owner: Multi0 + Facing: 384 + Location: 97,136 + Actor1440: ttnk + Owner: Multi0 + Facing: 384 + Location: 99,136 + Actor1441: 3tnk.yuri + Owner: Multi0 + Facing: 384 + Location: 101,136 + Actor1442: btr.yuri + Faction: england + Facing: 384 + Owner: Multi0 + Location: 103,136 + Actor1444: trpc + Owner: Multi0 + Facing: 384 + Location: 105,136 + Actor1445: 3tnk.rhino + Owner: Multi0 + Facing: 384 + Location: 107,136 + Actor1446: grad + Owner: Multi0 + Facing: 384 + Location: 109,136 + Actor1447: 3tnk.atomic + Owner: Multi0 + Facing: 384 + Location: 113,136 + Actor1448: 3tnk.atomicyuri + Owner: Multi0 + Facing: 384 + Location: 115,136 + Actor1449: 4tnk + Owner: Multi0 + TurretFacing: 0 + Facing: 384 + Location: 117,136 + Actor1450: 4tnk.atomic + Owner: Multi0 + Facing: 384 + Location: 119,136 + Actor1451: 4tnk.erad + Owner: Multi0 + Facing: 384 + Location: 121,136 + Actor1452: 4tnk.erad.atomic + Owner: Multi0 + Facing: 384 + Location: 123,136 + Actor1453: ttra + Owner: Multi0 + Facing: 384 + Location: 125,136 + Actor1454: v3rl + Owner: Multi0 + Facing: 384 + Stance: HoldFire + Location: 127,136 + Actor1457: qtnk + Owner: Multi0 + Facing: 384 + Location: 129,136 + Actor1458: cdrn + Owner: Multi0 + Facing: 384 + Location: 131,136 + Actor1459: ovld + Owner: Multi0 + Facing: 384 + Location: 133,136 + Actor1460: ovld.erad + Owner: Multi0 + Facing: 384 + Location: 135,136 + Actor1461: apoc + Owner: Multi0 + Facing: 384 + Location: 137,136 + Actor1462: apoc.erad + Owner: Multi0 + Facing: 384 + Location: 139,136 + Actor1463: nukc + Owner: Multi0 + Facing: 384 + Location: 141,136 + Actor1464: dtrk + Owner: Multi0 + Facing: 384 + Location: 143,136 + Actor1465: vulc + Owner: Multi0 + Facing: 384 + TurretFacing: 0 + Location: 95,138 + Actor1472: wolv + Owner: Multi0 + Facing: 384 + Location: 113,138 + Actor1473: xo + Owner: Multi0 + Facing: 384 + Location: 115,138 + Actor1474: pbul + Owner: Multi0 + Facing: 384 + Location: 117,138 + Actor1488: ftnk + Owner: Multi0 + Facing: 384 + Location: 95,140 + Actor1491: hftk + Owner: Multi0 + Facing: 384 + Location: 97,140 + Actor1492: stnk.nod + Owner: Multi0 + TurretFacing: 0 + Facing: 384 + Location: 99,140 + Actor1495: mlrs + Owner: Multi0 + TurretFacing: 0 + Facing: 384 + Location: 113,140 + Actor1497: spec + Owner: Multi0 + Facing: 384 + Location: 115,140 + Actor1498: sapc + Owner: Multi0 + Facing: 384 + Location: 117,140 + Actor1499: corr + Owner: Multi0 + Facing: 384 + Location: 95,142 + Actor1500: lchr + Owner: Multi0 + Facing: 384 + Location: 97,142 + Actor1501: stcr + Owner: Multi0 + Facing: 384 + Location: 99,142 + Actor1502: devo + Owner: Multi0 + Facing: 384 + TurretFacing: 0 + Location: 101,142 + Actor1503: dark + Owner: Multi0 + Facing: 384 + TurretFacing: 0 + Location: 103,142 + Actor1504: ruin + Owner: Multi0 + Facing: 384 + Location: 113,142 + Actor1506: atmz + Owner: Multi0 + Facing: 384 + Location: 115,142 + Actor1507: null + Faction: england + Facing: 384 + Owner: Multi0 + Location: 117,142 + Actor1508: oblt + Faction: england + Facing: 384 + Owner: Multi0 + Location: 119,142 + Actor1509: tpod + Owner: Multi0 + Facing: 384 + TurretFacing: 0 + Location: 121,142 + Actor1510: rtpd + Owner: Multi0 + TurretFacing: 0 + Facing: 384 + Location: 123,142 + Actor1314: 2tnk + Owner: Multi0 + TurretFacing: 0 + Facing: 384 + Location: 87,134 + Actor1315: arty + Owner: Multi0 + Facing: 384 + Location: 89,134 + Actor1511: apc + Owner: Multi0 + Facing: 384 + Location: 91,134 + Actor1313: rtnk + Owner: Multi0 + TurretFacing: 0 + Facing: 384 + Location: 85,134 + Actor1316: ifv + Owner: Multi0 + TurretFacing: 0 + Facing: 384 + Location: 95,134 + Actor1318: tnkd + Owner: Multi0 + TurretFacing: 0 + Facing: 384 + Location: 99,134 + Actor1466: msam + Owner: Multi0 + TurretFacing: 0 + Facing: 384 + Location: 97,138 + Actor1467: hsam + Owner: Multi0 + TurretFacing: 0 + Facing: 384 + Location: 99,138 + Actor1469: mdrn + Owner: Multi0 + Facing: 384 + SubCell: 3 + Location: 101,138 + Actor1513: shrw + Owner: Multi0 + Facing: 384 + Location: 105,142 + Actor1416: seek + Owner: Multi0 + Facing: 384 + TurretFacing: 0 + Location: 83,142 + Actor1417: lace + Owner: Multi0 + Facing: 384 + TurretFacing: 0 + Location: 85,142 + Actor1418: intl + Owner: Multi0 + Facing: 384 + Location: 87,142 + Actor1317: ptnk + Owner: Multi0 + TurretFacing: 0 + Facing: 384 + Location: 97,134 + Actor1319: delp + Owner: Multi0 + Facing: 384 + Location: 101,134 + Actor1321: ctnk + Owner: Multi0 + Facing: 384 + Location: 113,134 + Actor1322: cryo + Owner: Multi0 + Facing: 384 + Location: 115,134 + Actor1323: mgg + Owner: Multi0 + Facing: 384 + Location: 117,134 + Actor1324: mrj + Owner: Multi0 + Facing: 384 + Location: 119,134 + Actor1327: batf.ai + Owner: Multi0 + Facing: 384 + Location: 125,134 + Actor1328: chpr + Owner: Multi0 + Facing: 384 + TurretFacing: 0 + Location: 127,134 + Actor1326: zeus + Owner: Multi0 + Facing: 384 + Location: 123,134 + Actor1325: pcan + Owner: Multi0 + Facing: 384 + Location: 121,134 + Actor1320: htnk + Owner: Multi0 + TurretFacing: 0 + Facing: 384 + Location: 121,138 + Actor1419: titn + Owner: Multi0 + TurretFacing: 0 + Facing: 384 + Location: 123,138 + Actor1476: disr + Owner: Multi0 + TurretFacing: 0 + Facing: 384 + Location: 125,138 + Actor1477: jugg + Owner: Multi0 + TurretFacing: 0 + Facing: 384 + Location: 127,138 + Actor1478: titn.rail + Owner: Multi0 + Facing: 384 + Location: 129,138 + Actor1479: htnk.ion + Owner: Multi0 + TurretFacing: 0 + Facing: 384 + Location: 131,138 + Actor1480: htnk.hover + Owner: Multi0 + Facing: 384 + Location: 133,138 + Actor1482: htnk.drone + Owner: Multi0 + Facing: 384 + Location: 135,138 + Actor1483: thwk + Owner: Multi0 + Facing: 384 + Location: 137,138 + Actor1484: memp + Owner: Multi0 + Facing: 384 + Location: 139,138 + Actor1485: msar + Owner: Multi0 + Facing: 384 + Location: 141,138 + Actor1475: mtnk.drone + Owner: Multi0 + Facing: 384 + TurretFacing: 0 + Location: 119,138 + Actor1486: apc2 + Owner: Multi0 + Facing: 384 + TurretFacing: 0 + Location: 87,138 + Actor1524: avtr + Owner: Multi0 + Facing: 384 + Location: 119,140 + Actor1512: msg + Owner: Multi0 + Facing: 384 + Location: 103,140 + Actor1493: wtnk + Owner: Multi0 + TurretFacing: 0 + Facing: 384 + Location: 105,140 + Actor1494: howi + Owner: Multi0 + Facing: 384 + TurretFacing: 0 + Location: 107,140 + Actor1526: hstk + Owner: Multi0 + Facing: 384 + Location: 101,140 + Actor1527: upgc + Owner: Multi0 + Location: 42,141 + Actor1374: patr + Owner: Multi0 + Location: 46,142 + Actor1429: n2 + Owner: Multi0 + Facing: 384 + SubCell: 3 + Location: 76,138 + Actor1455: n3 + Owner: Multi0 + Facing: 384 + SubCell: 3 + Location: 75,140 + Actor1528: n3 + Owner: Multi0 + SubCell: 3 + Location: 75,138 + Facing: 384 + Actor1529: n4 + Owner: Multi0 + Facing: 384 + Location: 74,140 + SubCell: 3 + Actor1305: spy + Owner: Multi0 + Facing: 384 + TurretFacing: 0 + SubCell: 3 + Location: 68,134 + Actor1531: conf + Owner: Multi0 + Facing: 384 + SubCell: 3 + Location: 66,140 + Actor1532: assa + Owner: Multi0 + Facing: 384 + SubCell: 3 + Location: 67,140 + Actor1533: hack + Owner: Multi0 + Facing: 384 + SubCell: 3 + Location: 68,140 + Actor1543: wchr + SubCell: 3 + Faction: england + Facing: 384 + Owner: Multi0 + Location: 68,142 + Actor1306: medi + Owner: Multi0 + Facing: 384 + TurretFacing: 0 + SubCell: 3 + Location: 72,134 + Actor1391: medi + Owner: Multi0 + TurretFacing: 0 + SubCell: 3 + Facing: 384 + Location: 72,138 + Actor1422: smedi + Owner: Multi0 + SubCell: 3 + TurretFacing: 0 + Facing: 384 + Location: 72,142 + Actor1331: s2 + Owner: Multi0 + SubCell: 3 + Facing: 384 + Location: 74,142 + Actor1537: mrdr + Owner: Multi0 + SubCell: 3 + Facing: 384 + Location: 69,142 + Actor1538: s4 + Owner: Multi0 + SubCell: 3 + Facing: 384 + Location: 70,142 + Actor1539: dog + Owner: Multi0 + Facing: 384 + SubCell: 3 + Location: 72,136 + Actor1389: ivan + Owner: Multi0 + Facing: 384 + SubCell: 3 + Location: 68,136 + Actor1540: e8 + Owner: Multi0 + Facing: 384 + TurretFacing: 0 + SubCell: 3 + Location: 69,136 + Actor1541: shok + Owner: Multi0 + Facing: 384 + TurretFacing: 0 + SubCell: 3 + Location: 70,136 + Actor1542: bh + Owner: Multi0 + SubCell: 3 + Facing: 384 + Location: 70,140 + Actor1545: acol + Owner: Multi0 + Facing: 384 + TurretFacing: 0 + SubCell: 3 + Location: 69,140 + Actor1421: bjet + Owner: Multi0 + Facing: 384 + Location: 69,138 + Actor1523: jjet + Owner: Multi0 + Facing: 384 + Location: 70,138 + Actor1332: mech + Owner: Multi0 + Facing: 384 + TurretFacing: 0 + SubCell: 3 + Location: 69,134 + Actor1341: snip + Owner: Multi0 + Facing: 384 + TurretFacing: 0 + SubCell: 3 + Location: 70,134 + Actor1303: u3 + Owner: Multi0 + Facing: 384 + SubCell: 3 + Location: 67,134 + Actor1297: thf + Owner: Multi0 + Facing: 384 + SubCell: 3 + Location: 66,136 + Actor1339: brut + Owner: Multi0 + SubCell: 3 + Facing: 384 + Location: 67,136 + Actor1304: e7 + Owner: Multi0 + Facing: 384 + TurretFacing: 0 + SubCell: 3 + Location: 61,134 + Actor1337: yuri + Owner: Multi0 + Facing: 384 + SubCell: 3 + Location: 60,136 + Actor1338: bori + Owner: Multi0 + Facing: 384 + TurretFacing: 0 + SubCell: 3 + Location: 61,136 + Actor1340: zdef + Owner: Multi0 + Facing: 384 + SubCell: 3 + Location: 57,138 + Actor1390: zrai + Owner: Multi0 + Facing: 384 + SubCell: 3 + Location: 58,138 + Actor1392: ztrp + Owner: Multi0 + Facing: 384 + SubCell: 3 + Location: 59,138 + Actor1393: rmbo + Owner: Multi0 + TurretFacing: 0 + SubCell: 3 + Facing: 384 + Location: 61,138 + Actor1394: rmbc + Owner: Multi0 + SubCell: 3 + Facing: 384 + Location: 52,140 + Actor1395: reap + Owner: Multi0 + Facing: 384 + SubCell: 3 + Location: 53,140 + Actor1396: enli + Owner: Multi0 + Facing: 384 + SubCell: 3 + Location: 54,140 + Actor1397: cmec + Owner: Multi0 + Facing: 384 + SubCell: 3 + Location: 55,140 + Actor1412: n5 + Owner: Multi0 + Facing: 384 + TurretFacing: 0 + SubCell: 3 + Location: 56,140 + Actor1420: n3c + Owner: Multi0 + Facing: 384 + SubCell: 3 + Location: 57,140 + Actor1423: n1c + Owner: Multi0 + Facing: 384 + SubCell: 3 + Location: 58,140 + Actor1424: tplr + Owner: Multi0 + Facing: 384 + SubCell: 3 + Location: 59,140 + Actor1425: rmbo + Owner: Multi0 + Facing: 384 + TurretFacing: 0 + SubCell: 3 + Location: 61,140 + Actor1517: brst + SubCell: 3 + Faction: england + Facing: 384 + Owner: Multi0 + Location: 59,142 + Actor1518: mast + Owner: Multi0 + SubCell: 3 + Facing: 384 + Location: 61,142 + Actor1520: arti + Owner: Multi0 + SubCell: 3 + Facing: 384 + Location: 67,142 + Actor1534: sab + Owner: Multi0 + Facing: 384 + TurretFacing: 0 + SubCell: 3 + Location: 63,140 + Actor1535: mech + Owner: Multi0 + Facing: 384 + TurretFacing: 0 + SubCell: 3 + Location: 64,140 + Actor1536: shad + Owner: Multi0 + Facing: 384 + SubCell: 3 + Location: 65,140 + Actor1525: stlk + Owner: Multi0 + Facing: 384 + SubCell: 3 + Location: 64,142 + Actor1530: impl + Owner: Multi0 + SubCell: 3 + Facing: 384 + Location: 65,142 + Actor1544: evis + SubCell: 3 + Faction: england + Facing: 384 + Owner: Multi0 + Location: 66,142 + Actor1514: pdgy + Owner: Multi0 + SubCell: 3 + Facing: 384 + Location: 58,142 + Actor1336: ttrp + Owner: Multi0 + Facing: 384 + SubCell: 3 + Location: 58,136 + Actor1426: cmsr + Owner: Multi0 + Facing: 384 + SubCell: 3 + Location: 59,136 + Actor1335: deso + Owner: Multi0 + SubCell: 3 + Facing: 384 + Location: 57,136 + Actor1298: hopl + Owner: Multi0 + Facing: 384 + SubCell: 3 + Location: 56,134 + Actor1299: cryt + Owner: Multi0 + Facing: 384 + SubCell: 3 + Location: 57,134 + Actor1300: tigr + Owner: Multi0 + Facing: 384 + SubCell: 3 + Location: 58,134 + Actor1301: enfo + Owner: Multi0 + Facing: 384 + SubCell: 3 + Location: 59,134 + Actor1302: seal + Owner: Multi0 + SubCell: 3 + Facing: 384 + Location: 60,134 + Actor1333: gscr + Owner: Multi0 + Facing: 384 + SubCell: 3 + Location: 71,145 + Actor1334: pbox + Owner: Dummy + Location: 76,82 + Actor1427: gun + Owner: Dummy + Location: 76,77 + Actor1515: ftur + Owner: Dummy + Location: 81,82 + Actor1546: tsla + Owner: Dummy + Location: 81,72 + Actor1516: ttur + Owner: Dummy + Location: 81,77 + Actor1547: htur + Owner: Dummy + Location: 75,66 + Actor1548: pris + Owner: Dummy + Location: 76,72 + Actor1549: gap + Owner: Dummy + Location: 76,61 + Actor1550: gtwr + Owner: Dummy + Location: 86,82 + Actor1552: atwr + Owner: Dummy + Location: 86,77 + Actor1551: stwr + Owner: Dummy + Location: 86,72 + Actor1553: obli + Owner: Dummy + Location: 91,72 + Actor1554: gun.nod + Owner: Dummy + Location: 91,77 + Actor1555: ltur + Owner: Dummy + Location: 91,82 + Actor1556: ptur + Owner: Dummy + Location: 96,82 + Actor1557: scol + Owner: Dummy + Location: 96,77 + Actor1558: fpwr + Location: 129,79 + Owner: HostileDummy + Actor1559: fref + Location: 132,78 + Owner: HostileDummy + Actor1560: weaf + Location: 136,79 + Owner: HostileDummy + Actor1561: domf + Location: 140,79 + Owner: HostileDummy + Actor1562: facf + Location: 143,78 + Owner: HostileDummy + Actor1563: syrf + Owner: Dummy + Location: 182,168 + Actor1564: fcom + Owner: Neutral + Location: 27,153 + Actor1565: hosp + Owner: Neutral + Location: 27,157 + Actor1566: macs + Owner: Neutral + Location: 30,157 + Actor1567: bio + Owner: Neutral + Location: 30,154 + Actor1568: oilr + Owner: Neutral + Location: 21,154 + Actor1569: oilb + Owner: Neutral + Location: 17,154 + Actor1570: miss + Owner: Neutral + Location: 19,158 + Actor1571: v01 + Owner: Neutral + Location: 25,161 + Actor1572: afld.gdi + Owner: Dummy + Location: 112,77 + Actor1573: afld + Owner: Dummy + Location: 112,80 + Actor1574: hpad + Owner: Dummy + Location: 109,79 + Actor1575: hpad.td + Owner: Dummy + Location: 109,75 + Actor1576: grav + Owner: Dummy + Location: 116,76 + Actor1577: cust + Owner: Multi0 + Facing: 384 + Location: 121,140 + Actor1578: harv.td.upg + Owner: Multi0 + Facing: 384 + Location: 79,140 + Actor2150: arty.nod + Owner: Multi0 + Facing: 384 + Location: 89,140 + Actor2149: bike + Owner: Multi0 + Facing: 384 + Location: 87,140 + Actor2148: ltnk + Owner: Multi0 + TurretFacing: 0 + Facing: 384 + Location: 85,140 + Actor1579: rbug + Owner: Multi0 + Facing: 384 + Location: 83,140 + +Rules: ca|rules/custom/composition-tester.yaml, ca|rules/custom/composition-tester-powers.yaml, rules.yaml + +Weapons: weapons.yaml diff --git a/mods/ca/maps/ca-testing-grounds/rules.yaml b/mods/ca/maps/ca-testing-grounds/rules.yaml new file mode 100644 index 0000000000..2bcf4d8b11 --- /dev/null +++ b/mods/ca/maps/ca-testing-grounds/rules.yaml @@ -0,0 +1,330 @@ + +World: + LuaScript: + Scripts: testing-grounds.lua + MapOptions: + TechLevel: buildanything + MapBuildRadius: + BuildRadiusCheckboxEnabled: False + +Player: + PlayerResources: + SelectableCash: 50000000 + DefaultCash: 50000000 + DeveloperMode: + CheckboxEnabled: True + CheckboxLocked: True + CheckboxVisible: False + ModularBot@DormantAI: + Name: Dormant AI + Type: dormant + -ModularBot@BrutalAI: + -ModularBot@VeryHardAI: + -ModularBot@HardAI: + -ModularBot@NormalAI: + -ModularBot@EasyAI: + -ModularBot@NavalAI: + ChronoshiftPowerCA@TestingGroundsChrono: + OrderName: testmapchrono + Duration: 10000000 + EnemyDuration: 10000000 + Icon: chrono + ChargeInterval: 1 + Name: Chronoshift + Description: Teleports units. + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + KillCargo: false + Range: 4c512 + MaxTargets: 50 + InvalidTargetTypes: Husk, ChronoshiftImmune + SupportPowerPaletteOrder: 1 + ShowSelectionBoxes: true + HoverSelectionBoxColor: b6f4ff + ShowTargetCircle: true + TargetCircleColor: b6f4ff + TargetTintColor: b6f4ff33 + ShowDestinationCircle: true + +^Vehicle-NOUPG: + GrantConditionOnBotOwner@immobile: + Condition: dormant + Bots: dormant + GrantCondition@notmobile: + Condition: notmobile + RequiresCondition: dormant + SpeedMultiplier@immobile: + Modifier: 0 + RequiresCondition: dormant + +^Infantry: + Inherits@Chronoshiftable: ^Chronoshiftable + GrantConditionOnBotOwner@immobile: + Condition: dormant + Bots: dormant + Mobile: + PauseOnCondition: being-warped || dormant + SpeedMultiplier@immobile: + Modifier: 0 + RequiresCondition: dormant + +MDRN: + DummyConditionConsumer@notmobile: + Condition: notmobile + +MOLE: + DummyConditionConsumer@notmobile: + Condition: notmobile + +TSLA: + AttackTesla: + PauseOnCondition: build-incomplete || disabled || empdisable || being-warped || dormant + GrantConditionOnBotOwner@dormant: + Condition: dormant + Bots: dormant + +ATWR: + AttackTurreted: + PauseOnCondition: build-incomplete || disabled || empdisable || being-warped || dormant + GrantConditionOnBotOwner@dormant: + Condition: dormant + Bots: dormant + +OBLI: + AttackCharges: + PauseOnCondition: build-incomplete || disabled || empdisable || being-warped || dormant + GrantConditionOnBotOwner@dormant: + Condition: dormant + Bots: dormant + +GTWR: + AttackTurreted: + PauseOnCondition: build-incomplete || empdisable || being-warped || dormant + GrantConditionOnBotOwner@dormant: + Condition: dormant + Bots: dormant + +FTUR: + AttackTurreted: + PauseOnCondition: build-incomplete || empdisable || being-warped || dormant + GrantConditionOnBotOwner@dormant: + Condition: dormant + Bots: dormant + +PDGY: + Inherits: MAST + RenderSprites: + Image: mast + GrantCondition@Elite: + Condition: rank-elite + +4TNK: + ChangesHealth: + RequiresCondition: !dormant + +HTNK: + ChangesHealth: + RequiresCondition: !dormant + +E7: + Buildable: + BuildLimit: 0 + +BORI: + Buildable: + BuildLimit: 0 + +RMBO: + Buildable: + BuildLimit: 0 + +YURI: + Buildable: + BuildLimit: 0 + +MAST: + Buildable: + BuildLimit: 0 + +bombard.strat: + Buildable: + Prerequisites: ~player.gdi + +bombard2.strat: + Buildable: + Prerequisites: ~player.gdi, ~bombard.strat + +seek.strat: + Buildable: + Prerequisites: ~player.gdi + +seek2.strat: + Buildable: + Prerequisites: ~player.gdi, ~seek.strat + +hold.strat: + Buildable: + Prerequisites: ~player.gdi + +hold2.strat: + Buildable: + Prerequisites: ~player.gdi, ~hold.strat + +##################### + +ActionWormhole: + Inherits: WORMHOLE + Targetable: + TargetTypes: None + -RallyPoint: + -TeleportNetwork: + WithTextDecoration: + Text: Action + Position: Top + Font: Small + ValidRelationships: Ally, Enemy, Neutral + Margin: 0, -15 + RenderSprites: + Image: wormhole + GrantTimedConditionOnDeploy@Deploy: + DeployedCondition: deployed + CooldownTicks: 25 + DeployedTicks: 1 + StartsFullyCharged: true + ChargingColor: ff0000 + DischargingColor: ffffff + ShowSelectionBarWhenFull: false + WithColoredOverlay@Deployed: + RequiresCondition: deployed + Color: ff0000aa + Production@Upgrade: + Produces: Upgrade + PeriodicProducerCA@Produce: + Actors: action.respawn + Type: Upgrade + ChargeDuration: 26 + RequiresCondition: deployed + InitialChargeDuration: 0 + ReadyAudio: UpgradeComplete + BlockedAudio: BuildingCannotPlaceAudio + ResetTraitOnEnable: true + +^InvisibleAction: + Inherits: ^InvisibleDummy + Buildable: + Queue: Upgrade + IconPalette: chrometd + RenderSprites: + Image: strategic.upgrade + PopControlled: + Tooltip: + Name: Invisible Action + +### -------- + +wormhole.respawn: + Inherits: ActionWormhole + WithTextDecoration: + Text: Respawn Dummies + Color: 00FFFF + PeriodicProducerCA@Produce: + Actors: action.respawn + ReadyAudio: Building + +action.respawn: + Inherits: ^InvisibleAction + +### -------- + +wormhole.clear.upgrades: + Inherits: ActionWormhole + WithTextDecoration: + Text: Clear Player Upgrades + Color: FF8800 + PeriodicProducerCA@Produce: + Actors: action.clear.upgrades + ReadyAudio: Cancelled + +action.clear.upgrades: + Inherits: ^InvisibleAction + +### -------- + +wormhole.enable.hazmat: + Inherits: ActionWormhole + WithTextDecoration: + Text: Enable Dummy Hazmat + Color: 00FF00 + PeriodicProducerCA@Produce: + Actors: action.enable.hazmat + +action.enable.hazmat: + Inherits: ^InvisibleAction + +### + +wormhole.disable.hazmat: + Inherits: ActionWormhole + WithTextDecoration: + Text: Disable Dummy Hazmat + Color: FF0000 + PeriodicProducerCA@Produce: + Actors: action.disable.hazmat + ReadyAudio: Cancelled + +action.disable.hazmat: + Inherits: ^InvisibleAction + +### -------- + +wormhole.enable.flakarmor: + Inherits: ActionWormhole + WithTextDecoration: + Text: Enable Dummy Flak Armor + Color: 00FF00 + PeriodicProducerCA@Produce: + Actors: action.enable.flakarmor + +action.enable.flakarmor: + Inherits: ^InvisibleAction + +### + +wormhole.disable.flakarmor: + Inherits: ActionWormhole + WithTextDecoration: + Text: Disable Dummy Flak Armor + Color: FF0000 + PeriodicProducerCA@Produce: + Actors: action.disable.flakarmor + ReadyAudio: Cancelled + +action.disable.flakarmor: + Inherits: ^InvisibleAction + +### -------- + +wormhole.enable.cyborgarmor: + Inherits: ActionWormhole + WithTextDecoration: + Text: Enable Dummy Cyborg Armor + Color: 00FF00 + PeriodicProducerCA@Produce: + Actors: action.enable.cyborgarmor + +action.enable.cyborgarmor: + Inherits: ^InvisibleAction + +### + +wormhole.disable.cyborgarmor: + Inherits: ActionWormhole + WithTextDecoration: + Text: Disable Dummy Cyborg Armor + Color: FF0000 + PeriodicProducerCA@Produce: + Actors: action.disable.cyborgarmor + ReadyAudio: Cancelled + +action.disable.cyborgarmor: + Inherits: ^InvisibleAction diff --git a/mods/ca/maps/ca-testing-grounds/testing-grounds.lua b/mods/ca/maps/ca-testing-grounds/testing-grounds.lua new file mode 100644 index 0000000000..d4e8eeef52 --- /dev/null +++ b/mods/ca/maps/ca-testing-grounds/testing-grounds.lua @@ -0,0 +1,136 @@ +DeadDummies = { } + +WorldLoaded = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Dummy = Player.GetPlayer("Dummy") + + local dummyActors = GetDummyActors() + + Utils.Do(dummyActors, function(a) + if a.HasProperty("Kill") then + Trigger.OnKilled(a, function(self, killer) + StoreDeadDummy(self) + end) + end + end) + + Trigger.OnAnyProduction(function(producer, produced, productionType) + + if produced.Type == "action.respawn" then + Media.DisplayMessage("Regenerating dummies.", "Notification", HSLColor.FromHex("00FFFF")) + RespawnDummies() + end + + if produced.Type == "action.clear.upgrades" then + Media.DisplayMessage("Clearing upgrades.", "Notification", HSLColor.FromHex("FF8800")) + ClearUpgrades() + end + + if produced.Type == "action.enable.hazmat" then + Actor.Create("hazmat.upgrade", true, { Owner = Dummy }) + Media.DisplayMessage("Hazmat applied to dummies.", "Notification", HSLColor.FromHex("00FF00")) + end + + if produced.Type == "action.disable.hazmat" then + Media.DisplayMessage("Hazmat removed from dummies.", "Notification", HSLColor.FromHex("FF0000")) + Utils.Do(Dummy.GetActorsByType("hazmat.upgrade"), function(a) + a.Destroy() + end) + end + + if produced.Type == "action.enable.flakarmor" then + Actor.Create("flakarmor.upgrade", true, { Owner = Dummy }) + Media.DisplayMessage("Flak armor applied to dummies.", "Notification", HSLColor.FromHex("00FF00")) + end + + if produced.Type == "action.disable.flakarmor" then + Media.DisplayMessage("Flak armor removed from dummies.", "Notification", HSLColor.FromHex("FF0000")) + Utils.Do(Dummy.GetActorsByType("flakarmor.upgrade"), function(a) + a.Destroy() + end) + end + + if produced.Type == "action.enable.cyborgarmor" then + Actor.Create("cyborgarmor.upgrade", true, { Owner = Dummy }) + Media.DisplayMessage("Cyborg armor applied to dummies.", "Notification", HSLColor.FromHex("00FF00")) + end + + if produced.Type == "action.disable.cyborgarmor" then + Media.DisplayMessage("Cyborg armor removed from dummies.", "Notification", HSLColor.FromHex("FF0000")) + Utils.Do(Dummy.GetActorsByType("cyborgarmor.upgrade"), function(a) + a.Destroy() + end) + end + end) +end + +StoreDeadDummy = function(a) + local actorDetails = { + Type = a.Type, + Location = a.Location, + CenterPosition = a.CenterPosition, + } + + if not a.HasProperty("StartBuildingRepairs") and a.Type ~= "fenc" and a.Type ~= "barb" and a.Type ~= "chain" and a.Type ~= "brik" and a.Type ~= "sbag" and a.Type ~= "minv" and a.Type ~= "barl" and a.Type ~= "brl3" then + actorDetails.Facing = a.Facing + end + + table.insert(DeadDummies, actorDetails) +end + +RespawnDummies = function() + Utils.Do(DeadDummies, function(d) + local randomDelay = Utils.RandomInteger(1, 100) + + Trigger.AfterDelay(randomDelay, function() + local respawnedActor + + if d.Facing ~= nil then + respawnedActor = Actor.Create(d.Type, true, { Owner = Dummy, Location = d.Location, CenterPosition = d.CenterPosition, Facing = d.Facing }) + else + respawnedActor = Actor.Create(d.Type, true, { Owner = Dummy, Location = d.Location, CenterPosition = d.CenterPosition }) + end + + Trigger.OnKilled(respawnedActor, function(self, killer) + StoreDeadDummy(self) + end) + end) + end) + + local dummyActors = GetDummyActors() + Utils.Do(dummyActors, function(a) + if a.HasProperty("Health") then + if a.Health < a.MaxHealth then + a.Health = a.MaxHealth + end + end + end) + + DeadDummies = { } +end + +GetDummyActors = function() + local dummyActors = Utils.Where(Dummy.GetActors(), function(a) + return a.Type ~= "minv" and a.Type ~= "player" + end) + return dummyActors +end + +ClearUpgrades = function() + local p = Player.GetPlayer("Multi0") + local actors = p.GetActors() + + Utils.Do(actors, function(a) + if IsUpgrade(a) then + a.Destroy() + end + end) +end + +IsUpgrade = function(a) + if a.Type == "wormhole.clear.upgrades" then + return + end + return string.find(a.Type, ".upgrade") or string.find(a.Type, ".strat") +end diff --git a/mods/ca/maps/ca-testing-grounds/weapons.yaml b/mods/ca/maps/ca-testing-grounds/weapons.yaml new file mode 100644 index 0000000000..b5c5fe9ace --- /dev/null +++ b/mods/ca/maps/ca-testing-grounds/weapons.yaml @@ -0,0 +1,143 @@ +^AntiAirMissile: + Warhead@1Dam: SpreadDamage + ValidRelationships: Enemy, Neutral, Ally + Warhead@smallDamage: SpreadDamage + ValidRelationships: Enemy, Neutral, Ally + +IFVRocketsE.CRYO: + Warhead@chill: GrantExternalConditionCA + ValidRelationships: Enemy, Neutral, Ally + +IFVRocketsAAE.CRYO: + Warhead@chill: GrantExternalConditionCA + ValidRelationships: Enemy, Neutral, Ally + +RedEye.CRYO: + Warhead@chill: GrantExternalConditionCA + ValidRelationships: Enemy, Neutral, Ally + +HellfireAG.Cryo: + Warhead@chill: GrantExternalConditionCA + ValidRelationships: Enemy, Neutral, Ally + +HellfireAA.Cryo: + Warhead@chill: GrantExternalConditionCA + ValidRelationships: Enemy, Neutral, Ally + +DisintegratorBeamAA: + Warhead@1Dam: SpreadDamage + ValidRelationships: Enemy, Neutral, Ally + Warhead@smallDamage: SpreadDamage + ValidRelationships: Enemy, Neutral, Ally + +GunWalkerZapAA: + Warhead@1Dam: SpreadDamage + ValidRelationships: Enemy, Neutral, Ally + Warhead@smallDamage: SpreadDamage + ValidRelationships: Enemy, Neutral, Ally + +StormRiderZapAA: + Warhead@1Dam: SpreadDamage + ValidRelationships: Enemy, Neutral, Ally + Warhead@smallDamage: SpreadDamage + ValidRelationships: Enemy, Neutral, Ally + +EnervatorBoltsAA: + Warhead@1Dam: SpreadDamage + ValidRelationships: Enemy, Neutral, Ally + Warhead@smallDamage: SpreadDamage + ValidRelationships: Enemy, Neutral, Ally + +ShardLauncher: + Warhead@1Dam: SpreadDamage + ValidRelationships: Enemy, Neutral, Ally + Warhead@smallDamage: SpreadDamage + ValidRelationships: Enemy, Neutral, Ally + +InvaderZapAA: + Warhead@1Dam: SpreadDamage + ValidRelationships: Enemy, Neutral, Ally + +^AACannon: + Warhead@1Dam: SpreadDamage + ValidRelationships: Enemy, Neutral, Ally + Warhead@smallDamage: SpreadDamage + ValidRelationships: Enemy, Neutral, Ally + +ChainGun.Yak.AA: + Warhead@1Dam: SpreadDamage + ValidRelationships: Enemy, Neutral, Ally + Warhead@smallDamage: SpreadDamage + ValidRelationships: Enemy, Neutral, Ally + +StingerAA: + Warhead@1Dam: SpreadDamage + ValidRelationships: Enemy, Neutral, Ally + Warhead@smallDamage: SpreadDamage + ValidRelationships: Enemy, Neutral, Ally + +MammothTusk: + Warhead@smallDamage: SpreadDamage + ValidRelationships: Enemy, Neutral, Ally + +Dragon.CRYO: + Warhead@chill: GrantExternalConditionCA + ValidRelationships: Enemy, Neutral, Ally + +MiniRift: + Warhead@1Dam: SpreadDamage + ValidRelationships: Enemy, Neutral, Ally + -Warhead@2Dam: + Warhead@4Slow: GrantExternalConditionCA + ValidRelationships: Enemy, Neutral, Ally + +CryoMissile: + Warhead@chill1: GrantExternalConditionCA + ValidRelationships: Enemy, Neutral, Ally + Warhead@chill2: GrantExternalConditionCA + ValidRelationships: Enemy, Neutral, Ally + Warhead@chill3: GrantExternalConditionCA + ValidRelationships: Enemy, Neutral, Ally + Warhead@chillally: GrantExternalConditionCA + ValidRelationships: None + +TTrackZap.UPG: + Warhead@Arc: FireShrapnel + AimTargetStances: Enemy, Neutral, Ally + +TTankZap.UPG: + Warhead@Arc: FireShrapnel + AimTargetStances: Enemy, Neutral, Ally + +AtomizerBolts: + Warhead@Arc: FireShrapnel + AimTargetStances: Enemy, Neutral, Ally + Warhead@ArcInfantry: FireShrapnel + AimTargetStances: Enemy, Neutral, Ally + +EnlightenedBeam: + Warhead@1Dam: HealthPercentageSpreadDamage + ValidRelationships: Enemy, Neutral, Ally + -Warhead@friendlyFire: + +BlackEagleMissiles: + Warhead@VeiledCondition: GrantExternalConditionCA + ValidRelationships: Enemy, Neutral, Ally + +BlackEagleMissilesAA: + Warhead@VeiledCondition: GrantExternalConditionCA + ValidRelationships: Enemy, Neutral, Ally + +TitanRailgun: + Warhead@1Dam: SpreadDamage + ValidRelationships: Enemy, Neutral, Ally + Warhead@2Dam: SpreadDamage + Damage: 0 + +StalkerShards: + Warhead@1Dam: SpreadDamage + ValidRelationships: Enemy, Neutral, Ally + +PhantomMissilesAA: + Warhead@Blind: GrantExternalConditionCA + ValidRelationships: Enemy, Neutral, Ally diff --git a/mods/ca/maps/caffeinated.oramap b/mods/ca/maps/caffeinated.oramap index aba4fd5907..af03038b13 100644 Binary files a/mods/ca/maps/caffeinated.oramap and b/mods/ca/maps/caffeinated.oramap differ diff --git a/mods/ca/maps/castles-in-the-grave-ca.oramap b/mods/ca/maps/castles-in-the-grave-ca.oramap new file mode 100644 index 0000000000..0a0f30d276 Binary files /dev/null and b/mods/ca/maps/castles-in-the-grave-ca.oramap differ diff --git a/mods/ca/maps/catalyst-4v4.oramap b/mods/ca/maps/catalyst-4v4.oramap new file mode 100644 index 0000000000..ab78e8be9e Binary files /dev/null and b/mods/ca/maps/catalyst-4v4.oramap differ diff --git a/mods/ca/maps/catalyst-5v5.oramap b/mods/ca/maps/catalyst-5v5.oramap new file mode 100644 index 0000000000..851e7ea453 Binary files /dev/null and b/mods/ca/maps/catalyst-5v5.oramap differ diff --git a/mods/ca/maps/ceasefire-3v3.oramap b/mods/ca/maps/ceasefire-3v3.oramap new file mode 100644 index 0000000000..cd79172edc Binary files /dev/null and b/mods/ca/maps/ceasefire-3v3.oramap differ diff --git a/mods/ca/maps/ceasefire-4v4.oramap b/mods/ca/maps/ceasefire-4v4.oramap new file mode 100644 index 0000000000..a1b64e5f43 Binary files /dev/null and b/mods/ca/maps/ceasefire-4v4.oramap differ diff --git a/mods/ca/maps/champion-ca.oramap b/mods/ca/maps/champion-ca.oramap new file mode 100644 index 0000000000..5811c122cd Binary files /dev/null and b/mods/ca/maps/champion-ca.oramap differ diff --git a/mods/ca/maps/chaos-canyon.oramap b/mods/ca/maps/chaos-canyon.oramap index 1117093994..6f73927d7d 100644 Binary files a/mods/ca/maps/chaos-canyon.oramap and b/mods/ca/maps/chaos-canyon.oramap differ diff --git a/mods/ca/maps/chernobyl-1v1-ca.oramap b/mods/ca/maps/chernobyl-1v1-ca.oramap new file mode 100644 index 0000000000..2fa8149849 Binary files /dev/null and b/mods/ca/maps/chernobyl-1v1-ca.oramap differ diff --git a/mods/ca/maps/chernobyl-2v2-ca.oramap b/mods/ca/maps/chernobyl-2v2-ca.oramap new file mode 100644 index 0000000000..42f7c8d87c Binary files /dev/null and b/mods/ca/maps/chernobyl-2v2-ca.oramap differ diff --git a/mods/ca/maps/chernobyl-3v3-ca.oramap b/mods/ca/maps/chernobyl-3v3-ca.oramap new file mode 100644 index 0000000000..0a3991510e Binary files /dev/null and b/mods/ca/maps/chernobyl-3v3-ca.oramap differ diff --git a/mods/ca/maps/chernobyl-ca.oramap b/mods/ca/maps/chernobyl-ca.oramap deleted file mode 100644 index e2c0e61ff7..0000000000 Binary files a/mods/ca/maps/chernobyl-ca.oramap and /dev/null differ diff --git a/mods/ca/maps/chernobyl3v3-ca.oramap b/mods/ca/maps/chernobyl3v3-ca.oramap deleted file mode 100644 index bf7b105a18..0000000000 Binary files a/mods/ca/maps/chernobyl3v3-ca.oramap and /dev/null differ diff --git a/mods/ca/maps/circulate-ca.oramap b/mods/ca/maps/circulate-ca.oramap new file mode 100644 index 0000000000..1310af4d45 Binary files /dev/null and b/mods/ca/maps/circulate-ca.oramap differ diff --git a/mods/ca/maps/climax-rev15.oramap b/mods/ca/maps/climax-rev15.oramap index 39dbff4ff0..6e718d27f3 100644 Binary files a/mods/ca/maps/climax-rev15.oramap and b/mods/ca/maps/climax-rev15.oramap differ diff --git a/mods/ca/maps/clover-ca.oramap b/mods/ca/maps/clover-ca.oramap index d8791da290..c95c68e1d8 100644 Binary files a/mods/ca/maps/clover-ca.oramap and b/mods/ca/maps/clover-ca.oramap differ diff --git a/mods/ca/maps/coastal-influence.oramap b/mods/ca/maps/coastal-influence.oramap index 9fa077590c..6560037a74 100644 Binary files a/mods/ca/maps/coastal-influence.oramap and b/mods/ca/maps/coastal-influence.oramap differ diff --git a/mods/ca/maps/cold-front.oramap b/mods/ca/maps/cold-front.oramap index dd34ea3d95..a3cfc46781 100644 Binary files a/mods/ca/maps/cold-front.oramap and b/mods/ca/maps/cold-front.oramap differ diff --git a/mods/ca/maps/collaboration-ca.oramap b/mods/ca/maps/collaboration-ca.oramap index d40ce2e89c..8703da76fe 100644 Binary files a/mods/ca/maps/collaboration-ca.oramap and b/mods/ca/maps/collaboration-ca.oramap differ diff --git a/mods/ca/maps/confinement-ca.oramap b/mods/ca/maps/confinement-ca.oramap index 386392074e..6211cd1610 100644 Binary files a/mods/ca/maps/confinement-ca.oramap and b/mods/ca/maps/confinement-ca.oramap differ diff --git a/mods/ca/maps/conflagration.oramap b/mods/ca/maps/conflagration.oramap index ac2ac7788f..e9fe5efecf 100644 Binary files a/mods/ca/maps/conflagration.oramap and b/mods/ca/maps/conflagration.oramap differ diff --git a/mods/ca/maps/constantconflict-ca.oramap b/mods/ca/maps/constantconflict-ca.oramap index a0ed8624dc..d972015752 100644 Binary files a/mods/ca/maps/constantconflict-ca.oramap and b/mods/ca/maps/constantconflict-ca.oramap differ diff --git a/mods/ca/maps/contestation-ca.oramap b/mods/ca/maps/contestation-ca.oramap index dba9ef83d7..9ee7ba14e3 100644 Binary files a/mods/ca/maps/contestation-ca.oramap and b/mods/ca/maps/contestation-ca.oramap differ diff --git a/mods/ca/maps/conyard-ca.oramap b/mods/ca/maps/conyard-ca.oramap new file mode 100644 index 0000000000..d07c0c3561 Binary files /dev/null and b/mods/ca/maps/conyard-ca.oramap differ diff --git a/mods/ca/maps/countercross.oramap b/mods/ca/maps/countercross.oramap index ef3ab525dd..1271b202a9 100644 Binary files a/mods/ca/maps/countercross.oramap and b/mods/ca/maps/countercross.oramap differ diff --git a/mods/ca/maps/cow-level-ca.oramap b/mods/ca/maps/cow-level-ca.oramap new file mode 100644 index 0000000000..b75ada438d Binary files /dev/null and b/mods/ca/maps/cow-level-ca.oramap differ diff --git a/mods/ca/maps/crestfells-ca.oramap b/mods/ca/maps/crestfells-ca.oramap index a5c017f51b..13af6aed6c 100644 Binary files a/mods/ca/maps/crestfells-ca.oramap and b/mods/ca/maps/crestfells-ca.oramap differ diff --git a/mods/ca/maps/crossfire.oramap b/mods/ca/maps/crossfire.oramap index 92fb849011..a423495854 100644 Binary files a/mods/ca/maps/crossfire.oramap and b/mods/ca/maps/crossfire.oramap differ diff --git a/mods/ca/maps/crossroads-ca.oramap b/mods/ca/maps/crossroads-ca.oramap new file mode 100644 index 0000000000..f213b12218 Binary files /dev/null and b/mods/ca/maps/crossroads-ca.oramap differ diff --git a/mods/ca/maps/crownsbury-ca.oramap b/mods/ca/maps/crownsbury-ca.oramap index 1a06c783c3..e4fe375509 100644 Binary files a/mods/ca/maps/crownsbury-ca.oramap and b/mods/ca/maps/crownsbury-ca.oramap differ diff --git a/mods/ca/maps/crusade-ca.oramap b/mods/ca/maps/crusade-ca.oramap index df5ddda529..fb3b6a6c86 100644 Binary files a/mods/ca/maps/crusade-ca.oramap and b/mods/ca/maps/crusade-ca.oramap differ diff --git a/mods/ca/maps/darker-woods-ca.oramap b/mods/ca/maps/darker-woods-ca.oramap new file mode 100644 index 0000000000..b950031dc1 Binary files /dev/null and b/mods/ca/maps/darker-woods-ca.oramap differ diff --git a/mods/ca/maps/dash-ca.oramap b/mods/ca/maps/dash-ca.oramap new file mode 100644 index 0000000000..01437dedc9 Binary files /dev/null and b/mods/ca/maps/dash-ca.oramap differ diff --git a/mods/ca/maps/deadly-dunes-ca.oramap b/mods/ca/maps/deadly-dunes-ca.oramap new file mode 100644 index 0000000000..d6b4df2c27 Binary files /dev/null and b/mods/ca/maps/deadly-dunes-ca.oramap differ diff --git a/mods/ca/maps/deciduous-ring-ca.oramap b/mods/ca/maps/deciduous-ring-ca.oramap new file mode 100644 index 0000000000..792151610f Binary files /dev/null and b/mods/ca/maps/deciduous-ring-ca.oramap differ diff --git a/mods/ca/maps/decrepit-isles.oramap b/mods/ca/maps/decrepit-isles.oramap index 3923875248..6b416ce4cb 100644 Binary files a/mods/ca/maps/decrepit-isles.oramap and b/mods/ca/maps/decrepit-isles.oramap differ diff --git a/mods/ca/maps/delirium-3v3.oramap b/mods/ca/maps/delirium-3v3.oramap new file mode 100644 index 0000000000..e7b1edf61a Binary files /dev/null and b/mods/ca/maps/delirium-3v3.oramap differ diff --git a/mods/ca/maps/delirium-4v4.oramap b/mods/ca/maps/delirium-4v4.oramap new file mode 100644 index 0000000000..54f76e694d Binary files /dev/null and b/mods/ca/maps/delirium-4v4.oramap differ diff --git a/mods/ca/maps/delirium-extended.oramap b/mods/ca/maps/delirium-extended.oramap deleted file mode 100644 index bb334c8d25..0000000000 Binary files a/mods/ca/maps/delirium-extended.oramap and /dev/null differ diff --git a/mods/ca/maps/delirium.oramap b/mods/ca/maps/delirium.oramap deleted file mode 100644 index d26b1bf31b..0000000000 Binary files a/mods/ca/maps/delirium.oramap and /dev/null differ diff --git a/mods/ca/maps/desert-rats.oramap b/mods/ca/maps/desert-rats.oramap index 272b7a4cb0..d5b7da75b2 100644 Binary files a/mods/ca/maps/desert-rats.oramap and b/mods/ca/maps/desert-rats.oramap differ diff --git a/mods/ca/maps/desert-shellmap/desert-shellmap.lua b/mods/ca/maps/desert-shellmap/desert-shellmap.lua deleted file mode 100644 index dc6603b87c..0000000000 --- a/mods/ca/maps/desert-shellmap/desert-shellmap.lua +++ /dev/null @@ -1,176 +0,0 @@ ---[[ - Copyright 2007-2020 The OpenRA Developers (see AUTHORS) - This file is part of OpenRA, which is free software. It is made - available to you under the terms of the GNU General Public License - as published by the Free Software Foundation, either version 3 of - the License, or (at your option) any later version. For more - information, see COPYING. -]] -UnitTypes = { "3tnk.iraq", "btr.ai", "ttnk", "btr.ai" } -BeachUnitTypes = { "e1", "e2", "e3", "e8", "e1", "e2", "e3", "e8", "e1", "e2", "e3", "e4", "e1", "e2", "e3", "e4" } -ProxyType = "powerproxy.paratroopers" -ProducedUnitTypes = -{ - { factory = AlliedBarracks1, types = { "n1", "n3" } }, - { factory = AlliedBarracks2, types = { "n1", "n3" } }, - { factory = SovietBarracks1, types = { "dog", "e1", "e2", "e3", "e8", "shok" } }, - { factory = SovietBarracks2, types = { "dog", "e1", "e4", "e3", "e8", "shok" } }, - { factory = SovietBarracks3, types = { "dog", "e1", "e2", "e3", "e8", "shok" } }, - { factory = AlliedWarFactory1, types = { "htnk.ion", "mtnk", "htnk.ion", "titn.rail", "titn.rail" } }, - { factory = SovietWarFactory1, types = { "3tnk.iraq", "4tnk.iraq", "apoc.iraq", "ttnk", "v2rl" } } -} - -ShipUnitTypes = { "mtnk", "vulc.ai", "hmmv", "mtnk", "msam" } -HelicopterUnitTypes = { "n1", "n1", "n1", "n2", "n3", "n3" }; - -ParadropWaypoints = { Paradrop1, Paradrop2, Paradrop3, Paradrop4, Paradrop5, Paradrop6, Paradrop7, Paradrop8 } - -Mig1Waypoints = { Mig11, Mig12, Mig13, Mig14 } -Mig2Waypoints = { Mig21, Mig22, Mig23, Mig24 } - -BindActorTriggers = function(a) - if a.HasProperty("Hunt") then - if a.Owner == allies then - Trigger.OnIdle(a, function(a) - if a.IsInWorld then - a.Hunt() - end - end) - else - Trigger.OnIdle(a, function(a) - if a.IsInWorld then - a.AttackMove(AlliedTechnologyCenter.Location) - end - end) - end - end - - if a.HasProperty("HasPassengers") then - Trigger.OnPassengerExited(a, function(t, p) - BindActorTriggers(p) - end) - - Trigger.OnDamaged(a, function() - if a.HasPassengers then - a.Stop() - a.UnloadPassengers() - end - end) - end -end - -SendSovietUnits = function(entryCell, unitTypes, interval) - local units = Reinforcements.Reinforce(soviets, unitTypes, { entryCell }, interval) - Utils.Do(units, function(unit) - BindActorTriggers(unit) - end) - Trigger.OnAllKilled(units, function() SendSovietUnits(entryCell, unitTypes, interval) end) -end - -SendMigs = function(waypoints) - local migEntryPath = { waypoints[1].Location, waypoints[2].Location } - local migs = Reinforcements.Reinforce(soviets, { "suk" }, migEntryPath, 4) - Utils.Do(migs, function(mig) - mig.Move(waypoints[3].Location) - mig.Move(waypoints[4].Location) - mig.Destroy() - end) - - Trigger.AfterDelay(DateTime.Seconds(40), function() SendMigs(waypoints) end) -end - -ShipAlliedUnits = function() - local units = Reinforcements.ReinforceWithTransport(allies, "lst", - ShipUnitTypes, { LstEntry.Location, LstUnload.Location }, { LstEntry.Location })[2] - - Utils.Do(units, function(unit) - BindActorTriggers(unit) - end) - - Trigger.AfterDelay(DateTime.Seconds(60), ShipAlliedUnits) -end - -InsertAlliedChinookReinforcements = function(entry, hpad) - local units = Reinforcements.ReinforceWithTransport(allies, "ocar.pod", - HelicopterUnitTypes, { entry.Location, hpad.Location + CVec.New(1, 2) }, { entry.Location })[2] - - Utils.Do(units, function(unit) - BindActorTriggers(unit) - end) - - Trigger.AfterDelay(DateTime.Seconds(60), function() InsertAlliedChinookReinforcements(entry, hpad) end) -end - -ParadropSovietUnits = function() - local lz = Utils.Random(ParadropWaypoints) - local aircraft = powerproxy.TargetParatroopers(lz.CenterPosition) - - Utils.Do(aircraft, function(a) - Trigger.OnPassengerExited(a, function(t, p) - BindActorTriggers(p) - end) - end) - - Trigger.AfterDelay(DateTime.Seconds(35), ParadropSovietUnits) -end - -ProduceUnits = function(t) - local factory = t.factory - if not factory.IsDead then - local unitType = t.types[Utils.RandomInteger(1, #t.types + 1)] - factory.Wait(Actor.BuildTime(unitType)) - factory.Produce(unitType) - factory.CallFunc(function() ProduceUnits(t) end) - end -end - -SetupAlliedUnits = function() - Utils.Do(Map.NamedActors, function(a) - if a.Owner == allies and a.HasProperty("AcceptsCondition") and a.AcceptsCondition("unkillable") then - a.GrantCondition("unkillable") - a.Stance = "Defend" - end - end) -end - -SetupFactories = function() - Utils.Do(ProducedUnitTypes, function(production) - Trigger.OnProduction(production.factory, function(_, a) BindActorTriggers(a) end) - end) -end - -ticks = 0 -speed = 5 - -Tick = function() - ticks = ticks + 1 - - local t = (ticks + 45) % (360 * speed) * (math.pi / 180) / speed; - Camera.Position = viewportOrigin + WVec.New(19200 * math.sin(t), 20480 * math.cos(t), 0) -end - -WorldLoaded = function() - allies = Player.GetPlayer("Allies") - soviets = Player.GetPlayer("Soviets") - viewportOrigin = Camera.Position - - SetupAlliedUnits() - SetupFactories() - ShipAlliedUnits() - InsertAlliedChinookReinforcements(Chinook1Entry, HeliPad1) - InsertAlliedChinookReinforcements(Chinook2Entry, HeliPad2) - powerproxy = Actor.Create(ProxyType, false, { Owner = soviets }) - ParadropSovietUnits() - Utils.Do(ProducedUnitTypes, ProduceUnits) - - Trigger.AfterDelay(DateTime.Seconds(30), function() SendMigs(Mig1Waypoints) end) - Trigger.AfterDelay(DateTime.Seconds(30), function() SendMigs(Mig2Waypoints) end) - - SendSovietUnits(Entry1.Location, UnitTypes, 50) - SendSovietUnits(Entry2.Location, UnitTypes, 50) - SendSovietUnits(Entry3.Location, UnitTypes, 50) - SendSovietUnits(Entry4.Location, UnitTypes, 50) - SendSovietUnits(Entry5.Location, UnitTypes, 50) - SendSovietUnits(Entry6.Location, UnitTypes, 50) - SendSovietUnits(Entry7.Location, BeachUnitTypes, 15) -end diff --git a/mods/ca/maps/desert-shellmap/map.bin b/mods/ca/maps/desert-shellmap/map.bin deleted file mode 100644 index f8ded86b13..0000000000 Binary files a/mods/ca/maps/desert-shellmap/map.bin and /dev/null differ diff --git a/mods/ca/maps/desert-shellmap/map.png b/mods/ca/maps/desert-shellmap/map.png deleted file mode 100644 index 34e9d0ce4d..0000000000 Binary files a/mods/ca/maps/desert-shellmap/map.png and /dev/null differ diff --git a/mods/ca/maps/desert-shellmap/map.yaml b/mods/ca/maps/desert-shellmap/map.yaml deleted file mode 100644 index ae78ee474b..0000000000 --- a/mods/ca/maps/desert-shellmap/map.yaml +++ /dev/null @@ -1,1347 +0,0 @@ -MapFormat: 11 - -RequiresMod: ca - -Title: Desert Shellmap - -Author: Scott_NZ + Inq - -Tileset: DESERT - -MapSize: 128,128 - -Bounds: 1,1,126,126 - -Visibility: Shellmap - -Categories: Shellmap - -Players: - PlayerReference@Neutral: - Name: Neutral - OwnsWorld: True - NonCombatant: True - Faction: allies - PlayerReference@Creeps: - Name: Creeps - NonCombatant: True - Faction: allies - PlayerReference@Allies: - Name: Allies - Faction: allies - Color: F5D378 - Enemies: Soviets - PlayerReference@Soviets: - Name: Soviets - Faction: soviet - Color: FE1100 - Enemies: Allies - -Actors: - Actor0: rock6 - Location: 51,30 - Owner: Neutral - Actor1: rock4 - Location: 38,30 - Owner: Neutral - Actor2: rock5 - Location: 64,20 - Owner: Neutral - Actor3: rock1 - Location: 31,20 - Owner: Neutral - Actor4: rock4 - Location: 25,45 - Owner: Neutral - Actor307: brik - Location: 40,74 - Owner: Allies - Actor5: rock6 - Location: 34,45 - Owner: Neutral - Actor7: t08 - Location: 46,34 - Owner: Neutral - Actor24: v22 - Location: 31,52 - Owner: Neutral - Actor23: v23 - Location: 22,51 - Owner: Neutral - Actor12: oilb - Location: 49,42 - Owner: Neutral - Actor13: oilb - Location: 60,46 - Owner: Neutral - Actor16: oilb - Location: 41,46 - Owner: Neutral - Actor17: brl3 - Location: 51,42 - Owner: Neutral - Actor18: barl - Location: 43,48 - Owner: Neutral - Actor19: barl - Location: 60,48 - Owner: Neutral - Actor20: barl - Location: 59,48 - Owner: Neutral - Actor21: brl3 - Location: 59,49 - Owner: Neutral - Actor8: v25 - Location: 26,55 - Owner: Neutral - Actor11: v30 - Location: 29,49 - Owner: Neutral - Actor22: v29 - Location: 26,49 - Owner: Neutral - Actor14: oilb - Location: 26,37 - Owner: Neutral - Actor26: barl - Location: 63,35 - Owner: Neutral - Actor27: barl - Location: 42,45 - Owner: Neutral - Actor53: brik - Location: 70,63 - Owner: Allies - Actor90: brik - Location: 92,70 - Owner: Allies - Actor49: brik - Location: 71,63 - Owner: Allies - Actor40: dome - Location: 55,19 - Owner: Soviets - Actor41: brl3 - Location: 56,43 - Owner: Neutral - Actor71: brik - Location: 70,64 - Owner: Allies - Actor325: e3 - Location: 76,70 - Owner: Allies - Actor50: apwr - Location: 51,15 - Owner: Soviets - Actor63: tsla - Location: 48,32 - Owner: Soviets - Actor56: v23 - Location: 24,36 - Owner: Neutral - Actor57: v27 - Location: 25,34 - Owner: Neutral - Actor59: v29 - Location: 21,28 - Owner: Neutral - Actor58: v21 - Location: 13,26 - Owner: Neutral - Actor61: powr - Location: 36,19 - Owner: Soviets - Actor60: hpad - Location: 46,28 - Owner: Soviets - Actor69: kenn - Location: 43,29 - Owner: Soviets - Actor68: ftur - Location: 34,23 - Owner: Soviets - Actor70: afld - Location: 47,24 - Owner: Soviets - Actor81: rock7 - Location: 53,19 - Owner: Neutral - Actor48: brik - Location: 72,63 - Owner: Allies - Actor85: powr - Location: 49,14 - Owner: Soviets - Actor83: fcom - Location: 42,18 - Owner: Soviets - Actor52: powr - Location: 54,14 - Owner: Soviets - Actor74: brik - Location: 89,70 - Owner: Allies - Actor88: t08 - Location: 87,47 - Owner: Neutral - Actor65: brik - Location: 69,64 - Owner: Allies - Actor87: tc01 - Location: 92,50 - Owner: Neutral - Actor306: brik - Location: 40,75 - Owner: Allies - Actor15: oilb - Location: 56,33 - Owner: Neutral - Actor62: apwr - Location: 38,18 - Owner: Soviets - Actor72: brik - Location: 87,70 - Owner: Allies - Actor64: brik - Location: 69,63 - Owner: Allies - Actor47: brik - Location: 73,63 - Owner: Allies - Actor116: mine - Location: 78,21 - Owner: Neutral - Actor95: rock6 - Location: 10,76 - Owner: Neutral - Actor97: rock2 - Location: 12,75 - Owner: Neutral - Actor73: brik - Location: 88,70 - Owner: Allies - Actor51: brik - Location: 86,70 - Owner: Allies - Actor176: brik - Location: 85,70 - Owner: Allies - Actor175: brik - Location: 85,71 - Owner: Allies - Actor37: rock5 - Location: 35,43 - Owner: Neutral - Actor67: t08 - Location: 25,44 - Owner: Neutral - Actor109: stek - Location: 113,32 - Owner: Soviets - Actor102: proc - Location: 94,28 - Owner: Soviets - Actor103: apwr - Location: 118,37 - Owner: Soviets - Actor101: apwr - Location: 115,39 - Owner: Soviets - Actor106: fact - Location: 114,43 - Owner: Soviets - Actor104: apwr - Location: 115,36 - Owner: Soviets - Actor91: apwr - Location: 118,40 - Owner: Soviets - Actor108: tsla - Location: 95,34 - Owner: Soviets - Actor112: ftur - Location: 93,29 - Owner: Soviets - Actor113: ftur - Location: 90,33 - Owner: Soviets - Actor114: ftur - Location: 37,28 - Owner: Soviets - Actor115: tsla - Location: 40,25 - Owner: Soviets - Actor117: fix - Location: 106,34 - Owner: Soviets - Actor136: v2rl - Location: 91,40 - Owner: Soviets - Facing: 360 - Actor122: afld - Location: 116,49 - Owner: Soviets - Actor107: hpad - Location: 112,49 - Owner: Soviets - Actor126: tsla - Location: 110,28 - Owner: Soviets - Actor124: dome - Location: 118,46 - Owner: Soviets - Actor125: tsla - Location: 111,44 - Owner: Soviets - Actor127: rock2 - Location: 103,54 - Owner: Neutral - Actor128: rock6 - Location: 99,59 - Owner: Neutral - Actor129: hpad - Location: 99,28 - Owner: Soviets - Actor130: apwr - Location: 119,34 - Owner: Soviets - Actor131: t08 - Location: 121,43 - Owner: Neutral - Actor132: apwr - Location: 116,33 - Owner: Soviets - Actor133: oilb - Location: 76,37 - Owner: Soviets - Actor134: e1 - Location: 74,37 - Owner: Soviets - Actor135: e1 - Location: 77,39 - Owner: Soviets - Actor123: afld - Location: 119,49 - Owner: Soviets - Actor138: 4tnk - Location: 112,46 - Owner: Soviets - Actor139: 3tnk - Location: 89,32 - Owner: Soviets - Facing: 256 - Actor140: 3tnk - Location: 92,29 - Owner: Soviets - Facing: 80 - Actor141: 3tnk - Location: 36,23 - Owner: Soviets - Facing: 531 - Actor142: e1 - Location: 40,27 - Owner: Soviets - Actor143: e1 - Location: 49,17 - Owner: Soviets - Actor144: e1 - Location: 113,40 - Owner: Soviets - Actor145: e1 - Location: 102,33 - Owner: Soviets - Actor146: rock2 - Location: 125,37 - Owner: Neutral - Actor147: rock1 - Location: 118,54 - Owner: Neutral - Actor300: brik - Location: 48,77 - Owner: Allies - Actor186: 3tnk - Location: 107,50 - Owner: Soviets - Facing: 320 - Actor174: tc01 - Location: 98,37 - Owner: Neutral - Actor105: brik - Location: 94,70 - Owner: Allies - Actor170: kenn - Location: 104,41 - Owner: Soviets - Actor162: e1 - Location: 82,74 - Owner: Allies - Actor182: rock6 - Location: 96,45 - Owner: Neutral - Actor298: brik - Location: 48,78 - Owner: Allies - Actor343: brik - Location: 82,93 - Owner: Allies - Actor187: ftur - Location: 104,47 - Owner: Soviets - Actor342: lst - Location: 67,98 - Owner: Allies - Actor86: brik - Location: 91,70 - Owner: Allies - Actor216: brik - Location: 57,80 - Owner: Allies - Actor188: ftur - Location: 107,52 - Owner: Soviets - Actor213: brik - Location: 60,80 - Owner: Allies - Actor183: rock2 - Location: 93,41 - Owner: Neutral - Actor185: 3tnk - Location: 105,47 - Owner: Soviets - Facing: 570 - TurretFacing: 911 - Actor199: e1 - Location: 72,83 - Owner: Allies - Actor84: apwr - Location: 38,10 - Owner: Soviets - Actor96: apwr - Location: 38,13 - Owner: Soviets - Actor98: apwr - Location: 34,13 - Owner: Soviets - Actor99: apwr - Location: 34,10 - Owner: Soviets - Actor100: apwr - Location: 30,13 - Owner: Soviets - Actor189: apwr - Location: 30,10 - Owner: Soviets - Actor190: apwr - Location: 26,13 - Owner: Soviets - Actor191: apwr - Location: 26,10 - Owner: Soviets - Actor120: brik - Location: 95,70 - Owner: Allies - Actor9: brik - Location: 94,71 - Owner: Allies - Actor80: brik - Location: 90,70 - Owner: Allies - Actor92: brik - Location: 93,70 - Owner: Allies - Actor214: brik - Location: 59,80 - Owner: Allies - Actor38: brik - Location: 72,67 - Owner: Allies - Actor209: e1 - Location: 41,79 - Owner: Allies - Facing: 626 - Actor210: e1 - Location: 46,80 - Owner: Allies - Facing: 388 - Actor36: brik - Location: 72,66 - Owner: Allies - Actor255: e1 - Location: 67,76 - Owner: Allies - Actor77: e1 - Location: 78,74 - Owner: Allies - Actor217: sbag - Location: 43,67 - Owner: Allies - Actor158: mine - Location: 110,78 - Owner: Neutral - Actor299: e1 - Location: 50,70 - Owner: Allies - Actor297: brik - Location: 49,78 - Owner: Allies - Actor234: sbag - Location: 53,63 - Owner: Allies - Actor223: sbag - Location: 53,62 - Owner: Allies - Actor31: t08 - Location: 56,58 - Owner: Neutral - Actor311: brik - Location: 41,74 - Owner: Allies - Actor302: brik - Location: 41,75 - Owner: Allies - Actor215: brik - Location: 58,80 - Owner: Allies - Actor240: sbag - Location: 54,62 - Owner: Allies - Actor241: sbag - Location: 55,62 - Owner: Allies - Actor242: sbag - Location: 56,62 - Owner: Allies - Actor243: sbag - Location: 57,62 - Owner: Allies - Actor244: sbag - Location: 58,62 - Owner: Allies - Actor245: sbag - Location: 58,63 - Owner: Allies - Actor250: sbag - Location: 44,67 - Owner: Allies - Actor218: sbag - Location: 43,68 - Owner: Allies - Actor264: v27 - Location: 20,49 - Owner: Neutral - Actor265: v20 - Location: 26,52 - Owner: Neutral - Actor266: v21 - Location: 32,54 - Owner: Neutral - Actor267: v27 - Location: 21,48 - Owner: Neutral - Actor268: v24 - Location: 26,58 - Owner: Neutral - Actor269: v26 - Location: 21,54 - Owner: Neutral - Actor270: v28 - Location: 18,49 - Owner: Neutral - Actor271: oilb - Location: 18,59 - Owner: Neutral - Actor272: brl3 - Location: 19,61 - Owner: Neutral - Actor273: barl - Location: 19,58 - Owner: Neutral - Actor274: delphi - Location: 19,51 - Owner: Neutral - Actor275: chan - Location: 28,50 - Owner: Neutral - Actor276: c1 - Location: 30,57 - Owner: Neutral - Actor277: c2 - Location: 20,50 - Owner: Neutral - Actor278: c3 - Location: 24,53 - Owner: Neutral - Actor279: c7 - Location: 29,51 - Owner: Neutral - Actor280: c10 - Location: 23,55 - Owner: Neutral - Actor283: e1 - Location: 47,63 - Owner: Allies - Actor284: e1 - Location: 61,63 - Owner: Allies - Actor285: e1 - Location: 67,65 - Owner: Allies - Actor286: e1 - Location: 39,67 - Owner: Allies - Actor287: brik - Location: 50,62 - Owner: Allies - Actor288: e3 - Location: 40,63 - Owner: Allies - Actor289: brik - Location: 60,60 - Owner: Allies - Actor291: brik - Location: 59,61 - Owner: Allies - Actor290: brik - Location: 60,61 - Owner: Allies - Actor292: e3 - Location: 68,64 - Owner: Allies - Actor293: e3 - Location: 36,69 - Owner: Allies - Actor219: brik - Location: 57,79 - Owner: Allies - Actor45: brik - Location: 73,64 - Owner: Allies - Actor304: e1 - Location: 57,72 - Owner: Allies - Actor305: e1 - Location: 61,70 - Owner: Allies - Actor43: brik - Location: 73,65 - Owner: Allies - Actor34: brik - Location: 73,66 - Owner: Allies - Actor220: brik - Location: 57,78 - Owner: Allies - Actor222: brik - Location: 57,77 - Owner: Allies - Actor230: brik - Location: 56,77 - Owner: Allies - Actor231: brik - Location: 55,77 - Owner: Allies - Actor232: brik - Location: 54,77 - Owner: Allies - Actor246: brik - Location: 52,77 - Owner: Allies - Actor160: brik - Location: 86,71 - Owner: Allies - Actor179: brik - Location: 68,84 - Owner: Allies - Actor180: brik - Location: 69,84 - Owner: Allies - Actor181: brik - Location: 69,83 - Owner: Allies - Actor192: brik - Location: 68,83 - Owner: Allies - Actor198: brik - Location: 68,82 - Owner: Allies - Actor321: e1 - Location: 45,76 - Owner: Allies - Facing: 475 - Actor344: e1 - Location: 78,69 - Owner: Allies - Actor301: brik - Location: 49,77 - Owner: Allies - Actor313: brik - Location: 37,70 - Owner: Allies - Actor46: tc01 - Location: 49,79 - Owner: Neutral - Actor258: brik - Location: 76,94 - Owner: Allies - Actor259: rock6 - Location: 53,81 - Owner: Neutral - Actor260: rock2 - Location: 46,85 - Owner: Neutral - Actor168: brik - Location: 95,71 - Owner: Allies - Actor322: oilb - Location: 58,78 - Owner: Allies - Actor121: mine - Location: 103,76 - Owner: Neutral - Actor329: mine - Location: 90,21 - Owner: Neutral - Actor166: wood - Location: 17,52 - Owner: Neutral - Actor281: brik - Location: 50,78 - Owner: Allies - Actor235: brik - Location: 53,77 - Owner: Allies - Actor200: brik - Location: 68,81 - Owner: Allies - Actor201: brik - Location: 67,81 - Owner: Allies - Actor202: brik - Location: 66,81 - Owner: Allies - Actor203: brik - Location: 65,81 - Owner: Allies - Actor204: brik - Location: 64,81 - Owner: Allies - Actor205: brik - Location: 63,81 - Owner: Allies - Actor324: e3 - Location: 73,68 - Owner: Allies - Facing: 753 - Actor206: brik - Location: 63,80 - Owner: Allies - Actor207: brik - Location: 62,80 - Owner: Allies - Actor263: brik - Location: 51,78 - Owner: Allies - Actor247: brik - Location: 51,77 - Owner: Allies - Actor212: brik - Location: 61,80 - Owner: Allies - Actor345: e1 - Location: 80,69 - Owner: Allies - Actor6: brik - Location: 73,67 - Owner: Allies - Actor312: brik - Location: 40,73 - Owner: Allies - Actor314: brik - Location: 37,69 - Owner: Allies - Actor319: brik - Location: 38,69 - Owner: Allies - Actor316: brik - Location: 38,73 - Owner: Allies - Actor315: brik - Location: 39,73 - Owner: Allies - Actor317: brik - Location: 37,73 - Owner: Allies - Actor318: brik - Location: 37,72 - Owner: Allies - Actor44: brik - Location: 37,71 - Owner: Allies - Actor320: brik - Location: 38,70 - Owner: Allies - Actor330: brik - Location: 79,94 - Owner: Allies - Actor328: brik - Location: 78,94 - Owner: Allies - Actor327: brik - Location: 77,94 - Owner: Allies - Actor331: brik - Location: 80,94 - Owner: Allies - Actor332: brik - Location: 80,93 - Owner: Allies - Actor157: brik - Location: 81,93 - Owner: Allies - Actor346: brik - Location: 75,94 - Owner: Allies - Actor347: brik - Location: 75,93 - Owner: Allies - Actor348: brik - Location: 75,92 - Owner: Allies - Actor349: brik - Location: 75,91 - Owner: Allies - Actor350: brik - Location: 75,90 - Owner: Allies - Actor351: brik - Location: 74,90 - Owner: Allies - Actor352: brik - Location: 73,90 - Owner: Allies - Actor353: brik - Location: 72,90 - Owner: Allies - Actor354: brik - Location: 72,89 - Owner: Allies - Actor355: brik - Location: 71,89 - Owner: Allies - Actor356: brik - Location: 72,88 - Owner: Allies - Actor357: brik - Location: 71,88 - Owner: Allies - Actor358: brik - Location: 82,92 - Owner: Allies - Actor359: brik - Location: 82,91 - Owner: Allies - Actor360: brik - Location: 82,90 - Owner: Allies - Actor362: brik - Location: 81,90 - Owner: Allies - Actor363: brik - Location: 81,91 - Owner: Allies - Actor366: brik - Location: 59,60 - Owner: Allies - Actor367: brik - Location: 58,60 - Owner: Allies - Actor368: brik - Location: 57,60 - Owner: Allies - Actor369: brik - Location: 56,60 - Owner: Allies - Actor370: brik - Location: 55,60 - Owner: Allies - Actor371: brik - Location: 54,60 - Owner: Allies - Actor372: brik - Location: 53,60 - Owner: Allies - Actor373: brik - Location: 52,60 - Owner: Allies - Actor374: brik - Location: 52,61 - Owner: Allies - Actor375: brik - Location: 51,61 - Owner: Allies - Actor376: brik - Location: 50,61 - Owner: Allies - Actor377: brik - Location: 49,61 - Owner: Allies - Actor378: brik - Location: 49,62 - Owner: Allies - Actor171: wood - Location: 17,53 - Owner: Neutral - Actor172: wood - Location: 17,54 - Owner: Neutral - Actor173: wood - Location: 17,55 - Owner: Neutral - Actor177: wood - Location: 17,56 - Owner: Neutral - SovietWarFactory1: weap - Location: 106,29 - Owner: Soviets - SovietBarracks1: barr - Location: 109,48 - Owner: Soviets - SovietBarracks2: barr - Location: 102,30 - Owner: Soviets - SovietBarracks3: barr - Location: 41,27 - Owner: Soviets - IronCurtain: iron - Location: 110,40 - Owner: Soviets - HeliPad1: hpad - Location: 70,76 - Owner: Allies - HeliPad2: hpad - Location: 64,78 - Owner: Allies - Entry1: waypoint - Location: 1,50 - Owner: Neutral - Entry2: waypoint - Location: 1,27 - Owner: Neutral - Entry3: waypoint - Location: 10,1 - Owner: Neutral - Entry4: waypoint - Location: 84,1 - Owner: Neutral - Entry5: waypoint - Location: 126,27 - Owner: Neutral - Entry6: waypoint - Location: 46,1 - Owner: Neutral - Entry7: waypoint - Location: 1,79 - Owner: Neutral - AttackDest: waypoint - Location: 55,69 - Owner: Neutral - LstEntry: waypoint - Location: 33,126 - Owner: Neutral - LstUnload: waypoint - Location: 60,93 - Owner: Neutral - Paradrop1: waypoint - Location: 70,50 - Owner: Neutral - Paradrop2: waypoint - Location: 39,50 - Owner: Neutral - Paradrop3: waypoint - Location: 81,60 - Owner: Neutral - Paradrop4: waypoint - Location: 28,64 - Owner: Neutral - Paradrop5: waypoint - Location: 63,89 - Owner: Neutral - Paradrop6: waypoint - Location: 22,77 - Owner: Neutral - Paradrop7: waypoint - Location: 64,69 - Owner: Neutral - Paradrop8: waypoint - Location: 80,78 - Owner: Neutral - ChronoshiftLocation: waypoint - Location: 80,65 - Owner: Neutral - Mig11: waypoint - Location: 94,1 - Owner: Neutral - Mig12: waypoint - Location: 68,33 - Owner: Neutral - Mig13: waypoint - Location: 41,38 - Owner: Neutral - Mig14: waypoint - Location: 1,26 - Owner: Neutral - Mig21: waypoint - Location: 96,3 - Owner: Neutral - Mig22: waypoint - Location: 70,35 - Owner: Neutral - Mig23: waypoint - Location: 41,40 - Owner: Neutral - Mig24: waypoint - Location: 1,28 - Owner: Neutral - Actor400: hq - Owner: Allies - Location: 64,72 - Actor398: cram - Owner: Allies - Location: 68,67 - Actor399: cram - Owner: Allies - Location: 46,70 - Actor401: gtwr - Owner: Allies - Location: 42,75 - Actor402: gtwr - Owner: Allies - Location: 47,77 - Actor403: atwr - Owner: Allies - Location: 37,68 - Actor404: atwr - Owner: Allies - Location: 48,61 - Actor406: atwr - Owner: Allies - Location: 74,67 - Actor397: gtek - Owner: Allies - Location: 75,87 - Actor396: cram - Owner: Allies - Location: 76,93 - TurretFacing: 380 - Chronosphere: eye - Owner: Allies - Location: 78,90 - Actor407: afac - Owner: Allies - Location: 86,85 - Actor389: nuk2 - Owner: Allies - Location: 92,93 - Actor390: nuk2 - Owner: Allies - Location: 94,93 - Actor391: nuk2 - Owner: Allies - Location: 94,90 - Actor392: nuk2 - Owner: Allies - Location: 92,90 - Actor393: nuk2 - Owner: Allies - Location: 92,87 - Actor394: nuk2 - Owner: Allies - Location: 90,87 - Actor387: nuke - Owner: Allies - Location: 90,90 - Actor388: brik - Owner: Allies - Location: 92,97 - Actor395: brik - Owner: Allies - Location: 92,96 - Actor408: brik - Owner: Allies - Location: 93,96 - Actor409: brik - Owner: Allies - Location: 93,97 - Actor410: brik - Owner: Allies - Location: 94,97 - Actor411: brik - Owner: Allies - Location: 95,97 - Actor412: brik - Owner: Allies - Location: 97,97 - Actor413: brik - Owner: Allies - Location: 95,97 - Actor414: brik - Owner: Allies - Location: 96,97 - Actor415: brik - Owner: Allies - Location: 98,97 - Actor416: brik - Owner: Allies - Location: 98,96 - Actor417: brik - Owner: Allies - Location: 97,96 - Actor418: gtwr - Owner: Allies - Location: 95,79 - Actor419: proc.td - Owner: Allies - Location: 90,72 - AlliedBarracks1: pyle - Owner: Allies - Location: 84,75 - Actor420: gtwr - Owner: Allies - Location: 71,95 - Actor421: gtwr - Owner: Allies - Location: 70,89 - Actor422: gtwr - Owner: Allies - Location: 68,85 - Actor423: syrd.gdi - Owner: Allies - Location: 67,95 - Actor424: dd2 - Owner: Allies - Location: 54,92 - Facing: 610 - Actor425: carr - Owner: Allies - Location: 41,91 - Facing: 245 - Actor426: carr - Owner: Allies - Location: 21,87 - Facing: 253 - Actor427: dd2 - Owner: Allies - Location: 30,89 - Facing: 253 - Actor428: rep - Owner: Allies - Location: 69,71 - Actor429: nuke - Owner: Allies - Location: 51,74 - Actor430: nuke - Owner: Allies - Location: 53,74 - Actor431: nuke - Owner: Allies - Location: 55,74 - Actor432: gtwr - Owner: Allies - Location: 52,71 - Actor433: atwr - Owner: Allies - Location: 85,69 - Actor434: rmbo - Owner: Allies - SubCell: 3 - Location: 37,81 - Facing: 222 - Actor435: hmmv - Owner: Allies - Facing: 384 - Location: 40,83 - Actor436: mtnk - Owner: Allies - Location: 37,65 - Facing: 237 - TurretFacing@SECONDARY: 71 - TurretFacing: 856 - Actor437: mtnk - Owner: Allies - Location: 41,62 - TurretFacing@SECONDARY: 31 - TurretFacing: 174 - Facing: 1023 - Actor438: hmmv - Owner: Allies - Location: 36,67 - Facing: 269 - Actor439: mtnk.drone - Owner: Allies - Location: 44,65 - Facing: 245 - TurretFacing: 793 - Actor440: vulc - Owner: Allies - Location: 45,62 - TurretFacing: 309 - Facing: 904 - Actor441: msar - Owner: Allies - Location: 49,63 - Facing: 261 - Actor442: jugg - Owner: Allies - Location: 54,63 - Facing: 103 - Actor443: jugg - Owner: Allies - Location: 57,63 - Facing: 0 - TurretFacing: 896 - Actor445: disr - Owner: Allies - Location: 67,62 - Facing: 1023 - Actor444: disr - Owner: Allies - Location: 62,61 - Facing: 753 - TurretFacing: 198 - Actor446: vulc - Owner: Allies - Location: 62,63 - Facing: 753 - TurretFacing: 198 - Actor405: sbag - Owner: Allies - Location: 67,68 - Actor447: sbag - Owner: Allies - Location: 68,68 - Actor448: sbag - Owner: Allies - Location: 69,68 - Actor449: sbag - Owner: Allies - Location: 69,67 - Actor450: sbag - Owner: Allies - Location: 69,66 - Actor451: sbag - Owner: Allies - Location: 68,66 - Actor452: sbag - Owner: Allies - Location: 67,66 - Actor453: sbag - Owner: Allies - Location: 67,67 - Actor454: sbag - Owner: Allies - Location: 46,71 - Actor455: sbag - Owner: Allies - Location: 47,71 - Actor456: sbag - Owner: Allies - Location: 47,70 - Actor457: sbag - Owner: Allies - Location: 47,69 - Actor458: sbag - Owner: Allies - Location: 46,69 - Actor459: sbag - Owner: Allies - Location: 45,69 - Actor460: sbag - Owner: Allies - Location: 45,70 - Actor461: sbag - Owner: Allies - Location: 45,71 - Actor462: stwr - Owner: Allies - Location: 64,63 - TurretFacing: 959 - AlliedBarracks2: pyle - Owner: Allies - Location: 50,66 - Actor463: mtnk - Owner: Allies - Location: 59,66 - Facing: 769 - TurretFacing@SECONDARY: 769 - TurretFacing: 126 - Actor464: msam - Owner: Allies - Location: 72,68 - Facing: 769 - TurretFacing: 79 - Actor465: htnk.ion - Owner: Allies - Location: 77,68 - Facing: 1023 - TurretFacing: 983 - Actor466: htnk.ion - Owner: Allies - Location: 82,69 - Facing: 1023 - Actor467: gtwr - Owner: Allies - Location: 76,75 - Actor468: msam - Owner: Allies - Location: 44,68 - Facing: 261 - Actor469: tpwr - Owner: Soviets - Location: 106,44 - Actor470: apoc - Owner: Soviets - Facing: 384 - Location: 104,34 - AlliedWarFactory1: weap.td - Owner: Allies - Location: 57,68 - AlliedTechnologyCenter: upgc - Owner: Allies - Location: 74,82 - TurretFacing: 384 - Actor471: v3rl - Owner: Soviets - Location: 21,57 - Facing: 753 - Actor472: e1 - Owner: Soviets - Facing: 384 - SubCell: 3 - Location: 22,59 - Actor473: e1 - Owner: Soviets - SubCell: 3 - Location: 24,57 - Facing: 689 - Actor474: dog - Owner: Soviets - SubCell: 3 - Location: 24,58 - Facing: 618 - Actor475: memp - Owner: Allies - Facing: 384 - Location: 72,80 - Actor476: hmmv - Owner: Allies - Facing: 384 - Location: 69,87 - Chinook2Entry: waypoint - Owner: Neutral - Location: 67,126 - Chinook1Entry: waypoint - Owner: Neutral - Location: 75,126 - -Rules: rules.yaml diff --git a/mods/ca/maps/desert-shellmap/rules.yaml b/mods/ca/maps/desert-shellmap/rules.yaml deleted file mode 100644 index 99c69dbeaf..0000000000 --- a/mods/ca/maps/desert-shellmap/rules.yaml +++ /dev/null @@ -1,81 +0,0 @@ -Player: - -ConquestVictoryConditions: - LobbyPrerequisiteCheckbox@GLOBALBOUNTY: - Enabled: False - Locked: True - -World: - -CrateSpawner: - -SpawnMPUnits: - -MPStartLocations: - MusicPlaylist: - BackgroundMusic: target - AllowMuteBackgroundMusic: true - DisableWorldSounds: true - ResourceType@ore: - ValuePerUnit: 0 - LuaScript: - Scripts: desert-shellmap.lua - -StartGameNotification: - -^ExistsInWorld: - GivesExperience: - ActorExperienceModifier: 0 - DamageMultiplier@UNKILLABLE: - RequiresCondition: unkillable - Modifier: 0 - ExternalCondition@UNKILLABLE: - Condition: unkillable - -^Bridge: - DamageMultiplier: - Modifier: 0 - -^Wall: - DamageMultiplier: - Modifier: 0 - -OILB: - CashTrickler: - ShowTicks: false - -TRAN.Husk2: - WithIdleOverlay@Burns: - Image: fire - Sequence: 1 - IsDecoration: True - -MISS: - DamageMultiplier@INVULNERABLE: - Modifier: 0 - -MTNK: - GrantCondition: - Condition: pointlaser-upgrade - -MSAM: - GrantCondition: - Condition: hailstorm-upgrade - -TTNK: - GrantCondition: - Condition: tarc-upgrade - -MSAR: - GrantCondition: - Condition: deployed - WithSpriteBody@deployed: - RequiresCondition: real-actor - -UPGC: - GrantCondition: - Condition: tower.drop - PeriodicProducerCA@DROP: - ChargeDuration: 300 - ProductionAirdropCA: - SpawnType: ClosestEdgeToDestination - -powerproxy.paratroopers: - ParatroopersPower: - DisplayBeacon: false - DropItems: SHOK,SHOK,SHOK,SHOK,SHOK diff --git a/mods/ca/maps/desert-strike-ca.oramap b/mods/ca/maps/desert-strike-ca.oramap new file mode 100644 index 0000000000..810c296cde Binary files /dev/null and b/mods/ca/maps/desert-strike-ca.oramap differ diff --git a/mods/ca/maps/desertsun-ca.oramap b/mods/ca/maps/desertsun-ca.oramap index 4d5ee5200d..6a04ea9303 100644 Binary files a/mods/ca/maps/desertsun-ca.oramap and b/mods/ca/maps/desertsun-ca.oramap differ diff --git a/mods/ca/maps/desertsun3v3-ca.oramap b/mods/ca/maps/desertsun3v3-ca.oramap index 8edf67ef6b..4b9d1ab159 100644 Binary files a/mods/ca/maps/desertsun3v3-ca.oramap and b/mods/ca/maps/desertsun3v3-ca.oramap differ diff --git a/mods/ca/maps/desolate-ca.oramap b/mods/ca/maps/desolate-ca.oramap index 7086a4b90a..f710cf750e 100644 Binary files a/mods/ca/maps/desolate-ca.oramap and b/mods/ca/maps/desolate-ca.oramap differ diff --git a/mods/ca/maps/devils-marsh-ca.oramap b/mods/ca/maps/devils-marsh-ca.oramap index 644fb5d44c..9f2a44b141 100644 Binary files a/mods/ca/maps/devils-marsh-ca.oramap and b/mods/ca/maps/devils-marsh-ca.oramap differ diff --git a/mods/ca/maps/dirge-ca.oramap b/mods/ca/maps/dirge-ca.oramap new file mode 100644 index 0000000000..f45b6f4a8a Binary files /dev/null and b/mods/ca/maps/dirge-ca.oramap differ diff --git a/mods/ca/maps/discovery-ca.oramap b/mods/ca/maps/discovery-ca.oramap index bb95389323..f3c0f86153 100644 Binary files a/mods/ca/maps/discovery-ca.oramap and b/mods/ca/maps/discovery-ca.oramap differ diff --git a/mods/ca/maps/divided-ca.oramap b/mods/ca/maps/divided-ca.oramap index 53250986a9..d11de07d68 100644 Binary files a/mods/ca/maps/divided-ca.oramap and b/mods/ca/maps/divided-ca.oramap differ diff --git a/mods/ca/maps/donssacks.oramap b/mods/ca/maps/donssacks.oramap new file mode 100644 index 0000000000..9832c060e1 Binary files /dev/null and b/mods/ca/maps/donssacks.oramap differ diff --git a/mods/ca/maps/doubles.oramap b/mods/ca/maps/doubles.oramap index bd1a397281..cb0a1d6736 100644 Binary files a/mods/ca/maps/doubles.oramap and b/mods/ca/maps/doubles.oramap differ diff --git a/mods/ca/maps/doublestep.oramap b/mods/ca/maps/doublestep.oramap index a500251adf..d3e9fb6484 100644 Binary files a/mods/ca/maps/doublestep.oramap and b/mods/ca/maps/doublestep.oramap differ diff --git a/mods/ca/maps/doughnut.oramap b/mods/ca/maps/doughnut.oramap index cffa44f405..eca37b5e6c 100644 Binary files a/mods/ca/maps/doughnut.oramap and b/mods/ca/maps/doughnut.oramap differ diff --git a/mods/ca/maps/dover-ca.oramap b/mods/ca/maps/dover-ca.oramap new file mode 100644 index 0000000000..61d5844884 Binary files /dev/null and b/mods/ca/maps/dover-ca.oramap differ diff --git a/mods/ca/maps/downgrade-ca.oramap b/mods/ca/maps/downgrade-ca.oramap index 6a43fe66ae..c98cceab7f 100644 Binary files a/mods/ca/maps/downgrade-ca.oramap and b/mods/ca/maps/downgrade-ca.oramap differ diff --git a/mods/ca/maps/dragonking-ca.oramap b/mods/ca/maps/dragonking-ca.oramap new file mode 100644 index 0000000000..4c813688f3 Binary files /dev/null and b/mods/ca/maps/dragonking-ca.oramap differ diff --git a/mods/ca/maps/drycreekrun-ca.oramap b/mods/ca/maps/drycreekrun-ca.oramap new file mode 100644 index 0000000000..9417b29112 Binary files /dev/null and b/mods/ca/maps/drycreekrun-ca.oramap differ diff --git a/mods/ca/maps/dual-cold-front.oramap b/mods/ca/maps/dual-cold-front.oramap index eb2a6e888b..9e026440d8 100644 Binary files a/mods/ca/maps/dual-cold-front.oramap and b/mods/ca/maps/dual-cold-front.oramap differ diff --git a/mods/ca/maps/duskwood-ca.oramap b/mods/ca/maps/duskwood-ca.oramap new file mode 100644 index 0000000000..313e8ced89 Binary files /dev/null and b/mods/ca/maps/duskwood-ca.oramap differ diff --git a/mods/ca/maps/dystopia-4v4.oramap b/mods/ca/maps/dystopia-4v4.oramap new file mode 100644 index 0000000000..657b857e63 Binary files /dev/null and b/mods/ca/maps/dystopia-4v4.oramap differ diff --git a/mods/ca/maps/dystopia-5v5.oramap b/mods/ca/maps/dystopia-5v5.oramap new file mode 100644 index 0000000000..feb59ff64f Binary files /dev/null and b/mods/ca/maps/dystopia-5v5.oramap differ diff --git a/mods/ca/maps/dystopia-6v6.oramap b/mods/ca/maps/dystopia-6v6.oramap new file mode 100644 index 0000000000..d2d2fc9b7f Binary files /dev/null and b/mods/ca/maps/dystopia-6v6.oramap differ diff --git a/mods/ca/maps/dystopia-8v8.oramap b/mods/ca/maps/dystopia-8v8.oramap new file mode 100644 index 0000000000..9c1d4f05d0 Binary files /dev/null and b/mods/ca/maps/dystopia-8v8.oramap differ diff --git a/mods/ca/maps/dystopia-extended.oramap b/mods/ca/maps/dystopia-extended.oramap deleted file mode 100644 index 4dbd0b34dd..0000000000 Binary files a/mods/ca/maps/dystopia-extended.oramap and /dev/null differ diff --git a/mods/ca/maps/dystopia.oramap b/mods/ca/maps/dystopia.oramap deleted file mode 100644 index 87fca0ab65..0000000000 Binary files a/mods/ca/maps/dystopia.oramap and /dev/null differ diff --git a/mods/ca/maps/east-vs-west.oramap b/mods/ca/maps/east-vs-west.oramap index 5745de512b..0418481bb7 100644 Binary files a/mods/ca/maps/east-vs-west.oramap and b/mods/ca/maps/east-vs-west.oramap differ diff --git a/mods/ca/maps/edenlake-ca.oramap b/mods/ca/maps/edenlake-ca.oramap index dd16ef076c..a45bff072d 100644 Binary files a/mods/ca/maps/edenlake-ca.oramap and b/mods/ca/maps/edenlake-ca.oramap differ diff --git a/mods/ca/maps/edensprings-ca.oramap b/mods/ca/maps/edensprings-ca.oramap index cf729676ff..c4bce030ac 100644 Binary files a/mods/ca/maps/edensprings-ca.oramap and b/mods/ca/maps/edensprings-ca.oramap differ diff --git a/mods/ca/maps/eggsplosive-ca.oramap b/mods/ca/maps/eggsplosive-ca.oramap index 2afa54897c..3dd5c884a0 100644 Binary files a/mods/ca/maps/eggsplosive-ca.oramap and b/mods/ca/maps/eggsplosive-ca.oramap differ diff --git a/mods/ca/maps/elazahar-ca.oramap b/mods/ca/maps/elazahar-ca.oramap index b59143af45..76bc24d04d 100644 Binary files a/mods/ca/maps/elazahar-ca.oramap and b/mods/ca/maps/elazahar-ca.oramap differ diff --git a/mods/ca/maps/eleusinianmysteries-ca.oramap b/mods/ca/maps/eleusinianmysteries-ca.oramap index a1f135e5e3..c49b0e815c 100644 Binary files a/mods/ca/maps/eleusinianmysteries-ca.oramap and b/mods/ca/maps/eleusinianmysteries-ca.oramap differ diff --git a/mods/ca/maps/elevation-ca.oramap b/mods/ca/maps/elevation-ca.oramap new file mode 100644 index 0000000000..ae3188b86a Binary files /dev/null and b/mods/ca/maps/elevation-ca.oramap differ diff --git a/mods/ca/maps/enclosure-ca.oramap b/mods/ca/maps/enclosure-ca.oramap index a83e1e72a8..0846c78fdb 100644 Binary files a/mods/ca/maps/enclosure-ca.oramap and b/mods/ca/maps/enclosure-ca.oramap differ diff --git a/mods/ca/maps/encounter.oramap b/mods/ca/maps/encounter.oramap index d7bd43fe78..bdd0bd7d2c 100644 Binary files a/mods/ca/maps/encounter.oramap and b/mods/ca/maps/encounter.oramap differ diff --git a/mods/ca/maps/encumbrance-ca.oramap b/mods/ca/maps/encumbrance-ca.oramap index 8b5d778866..cbceca6e5c 100644 Binary files a/mods/ca/maps/encumbrance-ca.oramap and b/mods/ca/maps/encumbrance-ca.oramap differ diff --git a/mods/ca/maps/endrainbow-ca.oramap b/mods/ca/maps/endrainbow-ca.oramap index 25f4c30b87..5968702488 100644 Binary files a/mods/ca/maps/endrainbow-ca.oramap and b/mods/ca/maps/endrainbow-ca.oramap differ diff --git a/mods/ca/maps/engagement.oramap b/mods/ca/maps/engagement.oramap index fac97f49a9..92586c58fb 100644 Binary files a/mods/ca/maps/engagement.oramap and b/mods/ca/maps/engagement.oramap differ diff --git a/mods/ca/maps/enhanced-snakes-and-ladders-ca.oramap b/mods/ca/maps/enhanced-snakes-and-ladders-ca.oramap new file mode 100644 index 0000000000..d76412e3fc Binary files /dev/null and b/mods/ca/maps/enhanced-snakes-and-ladders-ca.oramap differ diff --git a/mods/ca/maps/ensio-kaivo.oramap b/mods/ca/maps/ensio-kaivo.oramap index 8cba43df8e..9ca4ca33a0 100644 Binary files a/mods/ca/maps/ensio-kaivo.oramap and b/mods/ca/maps/ensio-kaivo.oramap differ diff --git a/mods/ca/maps/enthrall-ca.oramap b/mods/ca/maps/enthrall-ca.oramap new file mode 100644 index 0000000000..7a6bbcf604 Binary files /dev/null and b/mods/ca/maps/enthrall-ca.oramap differ diff --git a/mods/ca/maps/europe.oramap b/mods/ca/maps/europe.oramap new file mode 100644 index 0000000000..da222e818c Binary files /dev/null and b/mods/ca/maps/europe.oramap differ diff --git a/mods/ca/maps/fallen-ca.oramap b/mods/ca/maps/fallen-ca.oramap new file mode 100644 index 0000000000..4a064d63ad Binary files /dev/null and b/mods/ca/maps/fallen-ca.oramap differ diff --git a/mods/ca/maps/fallen-mountain-5v5-ca.oramap b/mods/ca/maps/fallen-mountain-5v5-ca.oramap new file mode 100644 index 0000000000..956efe1429 Binary files /dev/null and b/mods/ca/maps/fallen-mountain-5v5-ca.oramap differ diff --git a/mods/ca/maps/flattop-ca.oramap b/mods/ca/maps/flattop-ca.oramap new file mode 100644 index 0000000000..483237625d Binary files /dev/null and b/mods/ca/maps/flattop-ca.oramap differ diff --git a/mods/ca/maps/forestfight-ca.oramap b/mods/ca/maps/forestfight-ca.oramap index 87f415d1b4..490c406ffa 100644 Binary files a/mods/ca/maps/forestfight-ca.oramap and b/mods/ca/maps/forestfight-ca.oramap differ diff --git a/mods/ca/maps/forgotten-land.oramap b/mods/ca/maps/forgotten-land.oramap new file mode 100644 index 0000000000..f8120fa284 Binary files /dev/null and b/mods/ca/maps/forgotten-land.oramap differ diff --git a/mods/ca/maps/fracture.oramap b/mods/ca/maps/fracture.oramap index 27f92d2a20..ef529c517c 100644 Binary files a/mods/ca/maps/fracture.oramap and b/mods/ca/maps/fracture.oramap differ diff --git a/mods/ca/maps/fractured-flows.oramap b/mods/ca/maps/fractured-flows.oramap new file mode 100644 index 0000000000..548651506f Binary files /dev/null and b/mods/ca/maps/fractured-flows.oramap differ diff --git a/mods/ca/maps/fragility-4v4.oramap b/mods/ca/maps/fragility-4v4.oramap new file mode 100644 index 0000000000..370a1afd1f Binary files /dev/null and b/mods/ca/maps/fragility-4v4.oramap differ diff --git a/mods/ca/maps/fragility-5v5.oramap b/mods/ca/maps/fragility-5v5.oramap new file mode 100644 index 0000000000..ff444f088a Binary files /dev/null and b/mods/ca/maps/fragility-5v5.oramap differ diff --git a/mods/ca/maps/frostblight-5v5.oramap b/mods/ca/maps/frostblight-5v5.oramap new file mode 100644 index 0000000000..97489a0daf Binary files /dev/null and b/mods/ca/maps/frostblight-5v5.oramap differ diff --git a/mods/ca/maps/frostblight-7v7.oramap b/mods/ca/maps/frostblight-7v7.oramap new file mode 100644 index 0000000000..bef6103b99 Binary files /dev/null and b/mods/ca/maps/frostblight-7v7.oramap differ diff --git a/mods/ca/maps/frozen_rift_ca.oramap b/mods/ca/maps/frozen_rift_ca.oramap new file mode 100644 index 0000000000..e8af655d15 Binary files /dev/null and b/mods/ca/maps/frozen_rift_ca.oramap differ diff --git a/mods/ca/maps/fury_sands_2_ca.oramap b/mods/ca/maps/fury_sands_2_ca.oramap index 9e8f26a1be..af404f4a6f 100644 Binary files a/mods/ca/maps/fury_sands_2_ca.oramap and b/mods/ca/maps/fury_sands_2_ca.oramap differ diff --git a/mods/ca/maps/genocide-ca.oramap b/mods/ca/maps/genocide-ca.oramap index 419601ca7f..94b87f27f8 100644 Binary files a/mods/ca/maps/genocide-ca.oramap and b/mods/ca/maps/genocide-ca.oramap differ diff --git a/mods/ca/maps/glittering-gully-ca.oramap b/mods/ca/maps/glittering-gully-ca.oramap new file mode 100644 index 0000000000..c0f92a44b5 Binary files /dev/null and b/mods/ca/maps/glittering-gully-ca.oramap differ diff --git a/mods/ca/maps/great-sahara-2.oramap b/mods/ca/maps/great-sahara-2.oramap index e6ad05c3d5..087a82ddbd 100644 Binary files a/mods/ca/maps/great-sahara-2.oramap and b/mods/ca/maps/great-sahara-2.oramap differ diff --git a/mods/ca/maps/greater-pastures-ca.oramap b/mods/ca/maps/greater-pastures-ca.oramap new file mode 100644 index 0000000000..ab2222a170 Binary files /dev/null and b/mods/ca/maps/greater-pastures-ca.oramap differ diff --git a/mods/ca/maps/green-belt.oramap b/mods/ca/maps/green-belt.oramap index afc4b24913..d79ed4ee29 100644 Binary files a/mods/ca/maps/green-belt.oramap and b/mods/ca/maps/green-belt.oramap differ diff --git a/mods/ca/maps/greener-pastures-ca.oramap b/mods/ca/maps/greener-pastures-ca.oramap new file mode 100644 index 0000000000..9fc8490cae Binary files /dev/null and b/mods/ca/maps/greener-pastures-ca.oramap differ diff --git a/mods/ca/maps/haos-ridges.oramap b/mods/ca/maps/haos-ridges.oramap index 9a10532bd7..363093af60 100644 Binary files a/mods/ca/maps/haos-ridges.oramap and b/mods/ca/maps/haos-ridges.oramap differ diff --git a/mods/ca/maps/harmony-ca.oramap b/mods/ca/maps/harmony-ca.oramap new file mode 100644 index 0000000000..f27e834ffe Binary files /dev/null and b/mods/ca/maps/harmony-ca.oramap differ diff --git a/mods/ca/maps/hazardous-hills.oramap b/mods/ca/maps/hazardous-hills.oramap new file mode 100644 index 0000000000..820c85c688 Binary files /dev/null and b/mods/ca/maps/hazardous-hills.oramap differ diff --git a/mods/ca/maps/heartland-ca.oramap b/mods/ca/maps/heartland-ca.oramap index 9b05515489..afc4a4f7bc 100644 Binary files a/mods/ca/maps/heartland-ca.oramap and b/mods/ca/maps/heartland-ca.oramap differ diff --git a/mods/ca/maps/heatedhostility-ca.oramap b/mods/ca/maps/heatedhostility-ca.oramap index 303ce5d59a..67a55fd19b 100644 Binary files a/mods/ca/maps/heatedhostility-ca.oramap and b/mods/ca/maps/heatedhostility-ca.oramap differ diff --git a/mods/ca/maps/heaven-hell.oramap b/mods/ca/maps/heaven-hell.oramap new file mode 100644 index 0000000000..16d842bbb7 Binary files /dev/null and b/mods/ca/maps/heaven-hell.oramap differ diff --git a/mods/ca/maps/hexodus.oramap b/mods/ca/maps/hexodus.oramap index 0f8916b6ca..bad21537f5 100644 Binary files a/mods/ca/maps/hexodus.oramap and b/mods/ca/maps/hexodus.oramap differ diff --git a/mods/ca/maps/hiddensector-ca.oramap b/mods/ca/maps/hiddensector-ca.oramap index 738bc132af..c5323c8112 100644 Binary files a/mods/ca/maps/hiddensector-ca.oramap and b/mods/ca/maps/hiddensector-ca.oramap differ diff --git a/mods/ca/maps/highlands-ca.oramap b/mods/ca/maps/highlands-ca.oramap index 7c18bc6431..adb97deb09 100644 Binary files a/mods/ca/maps/highlands-ca.oramap and b/mods/ca/maps/highlands-ca.oramap differ diff --git a/mods/ca/maps/hillside-offensive-ca.oramap b/mods/ca/maps/hillside-offensive-ca.oramap index 77b0e0b239..f4e8d05a1b 100644 Binary files a/mods/ca/maps/hillside-offensive-ca.oramap and b/mods/ca/maps/hillside-offensive-ca.oramap differ diff --git a/mods/ca/maps/hinterlands-ca.oramap b/mods/ca/maps/hinterlands-ca.oramap index 24d99303ef..b354468441 100644 Binary files a/mods/ca/maps/hinterlands-ca.oramap and b/mods/ca/maps/hinterlands-ca.oramap differ diff --git a/mods/ca/maps/hypothermia.oramap b/mods/ca/maps/hypothermia.oramap index 57068b528c..41b8282324 100644 Binary files a/mods/ca/maps/hypothermia.oramap and b/mods/ca/maps/hypothermia.oramap differ diff --git a/mods/ca/maps/icy-ridge.oramap b/mods/ca/maps/icy-ridge.oramap index be35e9bc61..666d75c232 100644 Binary files a/mods/ca/maps/icy-ridge.oramap and b/mods/ca/maps/icy-ridge.oramap differ diff --git a/mods/ca/maps/illmetbymoonlight-ca.oramap b/mods/ca/maps/illmetbymoonlight-ca.oramap index bc4de41b65..79ae4e702b 100644 Binary files a/mods/ca/maps/illmetbymoonlight-ca.oramap and b/mods/ca/maps/illmetbymoonlight-ca.oramap differ diff --git a/mods/ca/maps/illusions-of-granduer-ca.oramap b/mods/ca/maps/illusions-of-granduer-ca.oramap new file mode 100644 index 0000000000..fcc72fc1d9 Binary files /dev/null and b/mods/ca/maps/illusions-of-granduer-ca.oramap differ diff --git a/mods/ca/maps/imminent-destruction.oramap b/mods/ca/maps/imminent-destruction.oramap index bc0e9a4f4b..d534cc7cbc 100644 Binary files a/mods/ca/maps/imminent-destruction.oramap and b/mods/ca/maps/imminent-destruction.oramap differ diff --git a/mods/ca/maps/infection-ca.oramap b/mods/ca/maps/infection-ca.oramap new file mode 100644 index 0000000000..e668a13a30 Binary files /dev/null and b/mods/ca/maps/infection-ca.oramap differ diff --git a/mods/ca/maps/inhospitality-ca.oramap b/mods/ca/maps/inhospitality-ca.oramap index eaeb79a1d1..e466731be7 100644 Binary files a/mods/ca/maps/inhospitality-ca.oramap and b/mods/ca/maps/inhospitality-ca.oramap differ diff --git a/mods/ca/maps/intensity-ca.oramap b/mods/ca/maps/intensity-ca.oramap index 80ef6d4443..ec3c7e5022 100644 Binary files a/mods/ca/maps/intensity-ca.oramap and b/mods/ca/maps/intensity-ca.oramap differ diff --git a/mods/ca/maps/intersection-ca.oramap b/mods/ca/maps/intersection-ca.oramap index 137c7d68cb..3b272228e9 100644 Binary files a/mods/ca/maps/intersection-ca.oramap and b/mods/ca/maps/intersection-ca.oramap differ diff --git a/mods/ca/maps/investation-ca.oramap b/mods/ca/maps/investation-ca.oramap new file mode 100644 index 0000000000..f13455441a Binary files /dev/null and b/mods/ca/maps/investation-ca.oramap differ diff --git a/mods/ca/maps/island-fight-ca.oramap b/mods/ca/maps/island-fight-ca.oramap new file mode 100644 index 0000000000..dcda6e4828 Binary files /dev/null and b/mods/ca/maps/island-fight-ca.oramap differ diff --git a/mods/ca/maps/isle-of-wight-ca.oramap b/mods/ca/maps/isle-of-wight-ca.oramap new file mode 100644 index 0000000000..fcba15fbf8 Binary files /dev/null and b/mods/ca/maps/isle-of-wight-ca.oramap differ diff --git a/mods/ca/maps/jungle-boogie-ca.oramap b/mods/ca/maps/jungle-boogie-ca.oramap new file mode 100644 index 0000000000..6d5ec89ee7 Binary files /dev/null and b/mods/ca/maps/jungle-boogie-ca.oramap differ diff --git a/mods/ca/maps/jungle-law.oramap b/mods/ca/maps/jungle-law.oramap index 891d54b19b..d97d798619 100644 Binary files a/mods/ca/maps/jungle-law.oramap and b/mods/ca/maps/jungle-law.oramap differ diff --git a/mods/ca/maps/jungle-warfare.oramap b/mods/ca/maps/jungle-warfare.oramap new file mode 100644 index 0000000000..e83a857b0c Binary files /dev/null and b/mods/ca/maps/jungle-warfare.oramap differ diff --git a/mods/ca/maps/kosovo-1v1-ca.oramap b/mods/ca/maps/kosovo-1v1-ca.oramap new file mode 100644 index 0000000000..d303f0a374 Binary files /dev/null and b/mods/ca/maps/kosovo-1v1-ca.oramap differ diff --git a/mods/ca/maps/kosovo-2v2-ca.oramap b/mods/ca/maps/kosovo-2v2-ca.oramap new file mode 100644 index 0000000000..7229196b20 Binary files /dev/null and b/mods/ca/maps/kosovo-2v2-ca.oramap differ diff --git a/mods/ca/maps/kosovo-3v3-ca.oramap b/mods/ca/maps/kosovo-3v3-ca.oramap new file mode 100644 index 0000000000..c127da1274 Binary files /dev/null and b/mods/ca/maps/kosovo-3v3-ca.oramap differ diff --git a/mods/ca/maps/kosovo-4v4-ca.oramap b/mods/ca/maps/kosovo-4v4-ca.oramap new file mode 100644 index 0000000000..1d8ae76875 Binary files /dev/null and b/mods/ca/maps/kosovo-4v4-ca.oramap differ diff --git a/mods/ca/maps/kosovo_1v1_ca.oramap b/mods/ca/maps/kosovo_1v1_ca.oramap deleted file mode 100644 index f507af4dd0..0000000000 Binary files a/mods/ca/maps/kosovo_1v1_ca.oramap and /dev/null differ diff --git a/mods/ca/maps/krakow-1v1-ca.oramap b/mods/ca/maps/krakow-1v1-ca.oramap new file mode 100644 index 0000000000..009e31c38b Binary files /dev/null and b/mods/ca/maps/krakow-1v1-ca.oramap differ diff --git a/mods/ca/maps/krakow-2v2-ca.oramap b/mods/ca/maps/krakow-2v2-ca.oramap new file mode 100644 index 0000000000..eee359d449 Binary files /dev/null and b/mods/ca/maps/krakow-2v2-ca.oramap differ diff --git a/mods/ca/maps/krakow-3v3-ca.oramap b/mods/ca/maps/krakow-3v3-ca.oramap new file mode 100644 index 0000000000..1c26f2be64 Binary files /dev/null and b/mods/ca/maps/krakow-3v3-ca.oramap differ diff --git a/mods/ca/maps/krakow-4v4-ca.oramap b/mods/ca/maps/krakow-4v4-ca.oramap new file mode 100644 index 0000000000..68cd35f074 Binary files /dev/null and b/mods/ca/maps/krakow-4v4-ca.oramap differ diff --git a/mods/ca/maps/krakow_1v1_CA.oramap b/mods/ca/maps/krakow_1v1_CA.oramap deleted file mode 100644 index d0fad87c7b..0000000000 Binary files a/mods/ca/maps/krakow_1v1_CA.oramap and /dev/null differ diff --git a/mods/ca/maps/lost-temple-ca.oramap b/mods/ca/maps/lost-temple-ca.oramap new file mode 100644 index 0000000000..6cc24f216e Binary files /dev/null and b/mods/ca/maps/lost-temple-ca.oramap differ diff --git a/mods/ca/maps/lostinspace-ca.oramap b/mods/ca/maps/lostinspace-ca.oramap new file mode 100644 index 0000000000..ff2a7f2988 Binary files /dev/null and b/mods/ca/maps/lostinspace-ca.oramap differ diff --git a/mods/ca/maps/mad-science.oramap b/mods/ca/maps/mad-science.oramap index b499682735..9d234a035a 100644 Binary files a/mods/ca/maps/mad-science.oramap and b/mods/ca/maps/mad-science.oramap differ diff --git a/mods/ca/maps/maelstrom.oramap b/mods/ca/maps/maelstrom.oramap index 2a03b3eb80..24c335fd75 100644 Binary files a/mods/ca/maps/maelstrom.oramap and b/mods/ca/maps/maelstrom.oramap differ diff --git a/mods/ca/maps/malevolence-ca.oramap b/mods/ca/maps/malevolence-ca.oramap new file mode 100644 index 0000000000..d446100eb1 Binary files /dev/null and b/mods/ca/maps/malevolence-ca.oramap differ diff --git a/mods/ca/maps/mar-sara-ca.oramap b/mods/ca/maps/mar-sara-ca.oramap new file mode 100644 index 0000000000..8b3ceb2f95 Binary files /dev/null and b/mods/ca/maps/mar-sara-ca.oramap differ diff --git a/mods/ca/maps/mass-confliction.oramap b/mods/ca/maps/mass-confliction.oramap index 43c5bd5c74..0120abfef9 100644 Binary files a/mods/ca/maps/mass-confliction.oramap and b/mods/ca/maps/mass-confliction.oramap differ diff --git a/mods/ca/maps/mastermind-madness.oramap b/mods/ca/maps/mastermind-madness.oramap deleted file mode 100644 index 2463de0928..0000000000 Binary files a/mods/ca/maps/mastermind-madness.oramap and /dev/null differ diff --git a/mods/ca/maps/mastermind-madness/map.bin b/mods/ca/maps/mastermind-madness/map.bin new file mode 100644 index 0000000000..cf16c5554f Binary files /dev/null and b/mods/ca/maps/mastermind-madness/map.bin differ diff --git a/mods/ca/maps/mastermind-madness/map.png b/mods/ca/maps/mastermind-madness/map.png new file mode 100644 index 0000000000..11a2fdc8f6 Binary files /dev/null and b/mods/ca/maps/mastermind-madness/map.png differ diff --git a/mods/ca/maps/mastermind-madness/map.yaml b/mods/ca/maps/mastermind-madness/map.yaml new file mode 100644 index 0000000000..e018ace5c6 --- /dev/null +++ b/mods/ca/maps/mastermind-madness/map.yaml @@ -0,0 +1,1391 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: Mastermind Madness + +Author: Darkademic + +Tileset: INTERIOR + +MapSize: 50,50 + +Bounds: 1,1,48,48 + +Visibility: Lobby + +Categories: Minigame + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: england + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: england + Enemies: Multi0, Multi1, Multi2, Multi3 + PlayerReference@Multi0: + Name: Multi0 + AllowBots: False + Playable: True + LockFaction: True + Faction: RandomScrin + Enemies: Creeps, Neutral + PlayerReference@Multi1: + Name: Multi1 + AllowBots: False + Playable: True + LockFaction: True + Faction: RandomScrin + Enemies: Creeps, Neutral + PlayerReference@Multi2: + Name: Multi2 + AllowBots: False + Playable: True + LockFaction: True + Faction: RandomScrin + Enemies: Creeps, Neutral + PlayerReference@Multi3: + Name: Multi3 + AllowBots: False + Playable: True + LockFaction: True + Faction: RandomScrin + Enemies: Creeps, Neutral + +Actors: + Actor0: mpspawn + Owner: Neutral + Location: 8,41 + Actor3: mpspawn + Owner: Neutral + Location: 41,41 + Actor6: mpspawn + Owner: Neutral + Location: 41,8 + Actor7: mpspawn + Owner: Neutral + Location: 8,8 + Actor13: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 6,41 + Actor14: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 7,42 + Actor15: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 8,43 + Actor18: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 6,8 + Actor12: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 7,7 + Actor16: e1 + Owner: Neutral + Facing: 384 + Location: 8,6 + SubCell: 3 + Actor17: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 42,7 + Actor19: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 41,6 + Actor20: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 43,8 + Actor21: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 42,42 + Actor22: e1 + Owner: Neutral + Facing: 384 + Location: 43,41 + SubCell: 3 + Actor23: e1 + Owner: Neutral + Facing: 384 + Location: 41,43 + SubCell: 3 + Actor24: e4 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 11,37 + Actor25: e4 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 12,38 + Actor26: e4 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 37,38 + Actor27: e4 + Owner: Neutral + Facing: 384 + Location: 38,37 + SubCell: 3 + Actor28: e4 + Owner: Neutral + SubCell: 3 + Location: 38,12 + Facing: 384 + Actor29: e4 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 37,11 + Actor30: e4 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 11,12 + Actor31: e4 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 12,11 + Actor32: medi + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 5,44 + Actor33: medi + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 5,5 + Actor34: medi + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 44,5 + Actor35: medi + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 44,44 + Actor36: arty + Owner: Neutral + Location: 14,35 + Facing: 896 + Actor37: arty + Owner: Neutral + Location: 14,14 + Facing: 640 + Actor38: arty + Owner: Neutral + Facing: 384 + Location: 35,14 + Actor39: arty + Owner: Neutral + Location: 35,35 + Facing: 128 + Actor40: 2tnk + Owner: Neutral + Location: 14,46 + Facing: 896 + Actor41: 2tnk + Owner: Neutral + Location: 46,35 + Facing: 128 + Actor42: 2tnk + Owner: Neutral + Location: 3,35 + Facing: 896 + Actor43: 2tnk + Owner: Neutral + Location: 35,46 + Facing: 128 + Actor44: 2tnk + Owner: Neutral + Facing: 384 + Location: 35,3 + Actor45: 2tnk + Owner: Neutral + Facing: 384 + Location: 46,14 + Actor46: 2tnk + Owner: Neutral + Location: 3,14 + Facing: 640 + Actor47: 2tnk + Owner: Neutral + Location: 14,3 + Facing: 640 + Actor48: seek + Owner: Neutral + Location: 9,40 + Facing: 896 + Actor49: seek + Owner: Neutral + Location: 9,9 + Facing: 640 + Actor50: seek + Owner: Neutral + Facing: 384 + Location: 40,9 + Actor51: seek + Owner: Neutral + Location: 40,40 + Facing: 128 + Actor56: s4 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 5,37 + Actor57: s4 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 12,44 + Actor58: s4 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 37,44 + Actor59: s4 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 44,37 + Actor60: s4 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 37,5 + Actor61: s4 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 44,12 + Actor62: s4 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 5,12 + Actor63: s4 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 12,5 + Actor64: s2 + Owner: Neutral + Facing: 384 + Location: 12,6 + SubCell: 3 + Actor65: s2 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 6,12 + Actor66: s2 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 43,12 + Actor67: s2 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 37,6 + Actor68: s2 + Owner: Neutral + Facing: 384 + Location: 37,43 + SubCell: 3 + Actor69: s2 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 43,37 + Actor70: s2 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 6,37 + Actor71: s2 + Owner: Neutral + Facing: 384 + Location: 12,43 + SubCell: 3 + Actor72: cryo + Owner: Neutral + Location: 3,46 + Facing: 896 + Actor73: cryo + Owner: Neutral + Location: 46,46 + Facing: 128 + Actor74: cryo + Owner: Neutral + Facing: 384 + Location: 46,3 + Actor75: cryo + Owner: Neutral + Location: 3,3 + Facing: 640 + Actor87: bike + Owner: Neutral + Location: 3,44 + Facing: 896 + Actor89: bike + Owner: Neutral + Location: 5,46 + Facing: 896 + Actor90: bike + Owner: Neutral + Location: 44,46 + Facing: 128 + Actor91: bike + Owner: Neutral + Location: 46,44 + Facing: 128 + Actor92: bike + Owner: Neutral + Facing: 384 + Location: 46,5 + Actor93: bike + Owner: Neutral + Facing: 384 + Location: 44,3 + Actor94: bike + Owner: Neutral + Location: 5,3 + Facing: 640 + Actor95: bike + Owner: Neutral + Location: 3,5 + Facing: 640 + Actor102: e1 + Owner: Neutral + Facing: 384 + Location: 8,26 + SubCell: 3 + Actor103: e1 + Owner: Neutral + Facing: 384 + Location: 8,26 + SubCell: 1 + Actor104: e1 + Owner: Neutral + Facing: 384 + Location: 8,26 + SubCell: 2 + Actor99: e1 + Owner: Neutral + SubCell: 3 + Facing: 384 + Location: 8,23 + Actor100: e1 + Owner: Neutral + Facing: 384 + Location: 8,23 + SubCell: 1 + Actor101: e1 + Owner: Neutral + Facing: 384 + Location: 8,23 + SubCell: 2 + Actor98: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 41,23 + Actor105: e1 + Owner: Neutral + Facing: 384 + Location: 41,23 + SubCell: 1 + Actor106: e1 + Owner: Neutral + Facing: 384 + Location: 41,23 + SubCell: 2 + Actor109: e1 + Owner: Neutral + Facing: 384 + Location: 41,26 + SubCell: 2 + Actor110: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 23,8 + Actor111: e1 + Owner: Neutral + Facing: 384 + Location: 23,8 + SubCell: 1 + Actor112: e1 + Owner: Neutral + Facing: 384 + Location: 23,8 + SubCell: 2 + Actor113: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 26,8 + Actor114: e1 + Owner: Neutral + Facing: 384 + Location: 26,8 + SubCell: 1 + Actor115: e1 + Owner: Neutral + Facing: 384 + Location: 26,8 + SubCell: 2 + Actor116: e1 + Owner: Neutral + Facing: 384 + Location: 23,41 + SubCell: 3 + Actor117: e1 + Owner: Neutral + Facing: 384 + Location: 23,41 + SubCell: 1 + Actor118: e1 + Owner: Neutral + Facing: 384 + Location: 23,41 + SubCell: 2 + Actor119: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 26,41 + Actor120: e1 + Owner: Neutral + Facing: 384 + Location: 26,41 + SubCell: 1 + Actor121: e1 + Owner: Neutral + Facing: 384 + Location: 26,41 + SubCell: 2 + Actor122: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 22,35 + Actor123: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 27,35 + Actor124: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 35,27 + Actor125: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 35,22 + Actor126: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 15,22 + Actor127: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 15,27 + Actor128: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 22,15 + Actor129: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 27,15 + Actor130: acol + Owner: Neutral + SubCell: 3 + Facing: 384 + Location: 22,25 + Actor131: acol + Owner: Neutral + Facing: 384 + Location: 22,24 + SubCell: 3 + Actor132: acol + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 27,25 + Actor133: acol + Owner: Neutral + Facing: 384 + Location: 27,24 + SubCell: 3 + Actor134: acol + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 25,22 + Actor135: acol + Owner: Neutral + Facing: 384 + Location: 24,22 + SubCell: 3 + Actor136: acol + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 24,27 + Actor137: acol + Owner: Neutral + Facing: 384 + Location: 25,27 + SubCell: 3 + Actor138: bh + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 5,38 + Actor139: bh + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 11,44 + Actor140: bh + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 38,44 + Actor141: bh + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 44,38 + Actor142: bh + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 44,11 + Actor143: bh + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 38,5 + Actor144: bh + Owner: Neutral + Facing: 384 + Location: 11,5 + SubCell: 3 + Actor145: bh + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 5,11 + Actor146: ivan + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 15,15 + Actor147: ivan + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 34,15 + Actor148: ivan + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 34,34 + Actor149: ivan + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 15,34 + Actor154: rndb + Owner: Neutral + Location: 23,23 + Facing: 128 + Actor155: rndb + Owner: Neutral + Facing: 384 + Location: 23,26 + Actor156: rndb + Owner: Neutral + Location: 26,26 + Facing: 640 + Actor157: rndb + Owner: Neutral + Location: 26,23 + Facing: 896 + Actor150: rndb + Owner: Neutral + Facing: 384 + Location: 21,28 + Actor151: rndb + Owner: Neutral + Location: 21,21 + Facing: 128 + Actor152: rndb + Owner: Neutral + Location: 28,21 + Facing: 896 + Actor153: rndb + Owner: Neutral + Location: 28,28 + Facing: 640 + Actor107: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 41,26 + Actor108: e1 + Owner: Neutral + Facing: 384 + Location: 41,26 + SubCell: 1 + Actor158: rndv + Owner: Neutral + Location: 23,9 + Facing: 640 + Actor159: rndv + Owner: Neutral + Facing: 384 + Location: 26,9 + Actor160: rndv + Owner: Neutral + Location: 40,26 + Facing: 128 + Actor161: rndv + Owner: Neutral + Facing: 384 + Location: 40,23 + Actor162: rndv + Owner: Neutral + Location: 9,26 + Facing: 896 + Actor163: rndv + Owner: Neutral + Location: 9,23 + Facing: 640 + Actor164: rndv + Owner: Neutral + Location: 23,40 + Facing: 896 + Actor165: rndv + Owner: Neutral + Location: 26,40 + Facing: 128 + Actor166: rndv + Owner: Neutral + Location: 19,30 + Facing: 896 + Actor167: rndv + Owner: Neutral + Location: 30,30 + Facing: 128 + Actor168: rndv + Owner: Neutral + Facing: 384 + Location: 30,19 + Actor169: rndv + Owner: Neutral + Location: 19,19 + Facing: 640 + Actor170: rndv + Owner: Neutral + Location: 9,20 + Facing: 640 + Actor171: rndv + Owner: Neutral + Location: 9,29 + Facing: 896 + Actor172: rndv + Owner: Neutral + Facing: 384 + Location: 40,20 + Actor174: rndv + Owner: Neutral + Location: 40,29 + Facing: 128 + Actor173: rndv + Owner: Neutral + Location: 29,40 + Facing: 128 + Actor175: rndv + Owner: Neutral + Location: 20,40 + Facing: 896 + Actor176: rndv + Owner: Neutral + Location: 20,9 + Facing: 640 + Actor177: rndv + Owner: Neutral + Facing: 384 + Location: 29,9 + Actor182: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 44,40 + Actor183: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 40,44 + Actor184: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 9,44 + Actor185: e1 + Owner: Neutral + Facing: 384 + Location: 5,40 + SubCell: 3 + Actor186: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 5,9 + Actor187: e1 + Owner: Neutral + Facing: 384 + Location: 9,5 + SubCell: 3 + Actor188: e3 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 5,7 + Actor189: e3 + Owner: Neutral + Facing: 384 + Location: 6,6 + SubCell: 3 + Actor190: e3 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 7,5 + Actor191: e3 + Owner: Neutral + Facing: 384 + Location: 42,5 + SubCell: 3 + Actor192: e3 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 43,6 + Actor193: e3 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 44,7 + Actor194: e3 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 42,44 + Actor195: e3 + Owner: Neutral + Facing: 384 + Location: 43,43 + SubCell: 3 + Actor196: e3 + Owner: Neutral + Facing: 384 + Location: 44,42 + SubCell: 3 + Actor197: e3 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 7,44 + Actor198: e3 + Owner: Neutral + Facing: 384 + Location: 6,43 + SubCell: 3 + Actor199: e3 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 5,42 + Actor200: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 44,9 + Actor201: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 40,5 + Actor202: e2 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 10,11 + Actor203: e2 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 11,10 + Actor204: e2 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 39,11 + Actor205: e2 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 38,10 + Actor206: e2 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 38,39 + Actor207: e2 + Owner: Neutral + Facing: 384 + Location: 39,38 + SubCell: 3 + Actor208: e2 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 10,38 + Actor209: e2 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 11,39 + Actor210: rmbc + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 24,24 + Actor211: rmbc + Owner: Neutral + Facing: 384 + Location: 24,25 + SubCell: 3 + Actor212: rmbc + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 25,25 + Actor213: rmbc + Owner: Neutral + Facing: 384 + Location: 25,24 + SubCell: 3 + Actor216: mech + Owner: Neutral + Facing: 384 + Location: 46,43 + SubCell: 3 + Actor215: mech + Owner: Neutral + Facing: 384 + Location: 43,46 + SubCell: 3 + Actor217: mech + Owner: Neutral + Facing: 384 + Location: 6,46 + SubCell: 3 + Actor214: mech + Owner: Neutral + Facing: 384 + Location: 3,43 + SubCell: 3 + Actor220: mech + Owner: Neutral + Facing: 384 + Location: 43,3 + SubCell: 3 + Actor221: mech + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 46,6 + Actor222: mech + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 3,6 + Actor223: mech + Owner: Neutral + Facing: 384 + Location: 6,3 + SubCell: 3 + Actor218: chain + Owner: Neutral + Location: 20,20 + Actor219: chain + Owner: Neutral + Location: 20,21 + Actor224: chain + Owner: Neutral + Location: 20,22 + Actor225: chain + Owner: Neutral + Location: 20,23 + Actor226: chain + Owner: Neutral + Location: 20,24 + Actor227: chain + Owner: Neutral + Location: 20,25 + Actor228: chain + Owner: Neutral + Location: 20,26 + Actor229: chain + Owner: Neutral + Location: 20,27 + Actor230: chain + Owner: Neutral + Location: 20,28 + Actor231: chain + Owner: Neutral + Location: 20,29 + Actor232: chain + Owner: Neutral + Location: 21,29 + Actor233: chain + Owner: Neutral + Location: 22,29 + Actor234: chain + Owner: Neutral + Location: 23,29 + Actor235: chain + Owner: Neutral + Location: 24,29 + Actor236: chain + Owner: Neutral + Location: 25,29 + Actor237: chain + Owner: Neutral + Location: 26,29 + Actor238: chain + Owner: Neutral + Location: 21,20 + Actor239: chain + Owner: Neutral + Location: 22,20 + Actor240: chain + Owner: Neutral + Location: 23,20 + Actor241: chain + Owner: Neutral + Location: 24,20 + Actor242: chain + Owner: Neutral + Location: 25,20 + Actor243: chain + Owner: Neutral + Location: 26,20 + Actor244: chain + Owner: Neutral + Location: 27,20 + Actor245: chain + Owner: Neutral + Location: 28,20 + Actor246: chain + Owner: Neutral + Location: 29,20 + Actor247: chain + Owner: Neutral + Location: 29,22 + Actor248: chain + Owner: Neutral + Location: 29,21 + Actor249: chain + Owner: Neutral + Location: 29,23 + Actor250: chain + Owner: Neutral + Location: 29,24 + Actor251: chain + Owner: Neutral + Location: 29,25 + Actor252: chain + Owner: Neutral + Location: 29,26 + Actor253: chain + Owner: Neutral + Location: 29,27 + Actor254: chain + Owner: Neutral + Location: 29,28 + Actor255: chain + Owner: Neutral + Location: 29,29 + Actor256: chain + Owner: Neutral + Location: 28,29 + Actor257: chain + Owner: Neutral + Location: 27,29 + Actor258: barb + Owner: Neutral + Location: 34,27 + Actor259: barb + Owner: Neutral + Location: 34,26 + Actor260: barb + Owner: Neutral + Location: 34,25 + Actor261: barb + Owner: Neutral + Location: 34,24 + Actor262: barb + Owner: Neutral + Location: 34,23 + Actor263: barb + Owner: Neutral + Location: 34,22 + Actor264: barb + Owner: Neutral + Location: 27,16 + Actor265: barb + Owner: Neutral + Location: 26,16 + Actor266: barb + Owner: Neutral + Location: 25,16 + Actor267: barb + Owner: Neutral + Location: 24,16 + Actor268: barb + Owner: Neutral + Location: 23,16 + Actor269: barb + Owner: Neutral + Location: 22,16 + Actor270: barb + Owner: Neutral + Location: 16,22 + Actor271: barb + Owner: Neutral + Location: 16,23 + Actor272: barb + Owner: Neutral + Location: 16,24 + Actor273: barb + Owner: Neutral + Location: 16,25 + Actor274: barb + Owner: Neutral + Location: 16,26 + Actor275: barb + Owner: Neutral + Location: 16,27 + Actor276: barb + Owner: Neutral + Location: 22,34 + Actor277: barb + Owner: Neutral + Location: 23,34 + Actor278: barb + Owner: Neutral + Location: 24,34 + Actor279: barb + Owner: Neutral + Location: 25,34 + Actor280: barb + Owner: Neutral + Location: 26,34 + Actor281: barb + Owner: Neutral + Location: 27,34 + Actor282: gun + Owner: Neutral + Location: 37,12 + TurretFacing: 384 + Actor283: gun + Owner: Neutral + Location: 12,12 + TurretFacing: 640 + Actor284: gun + Owner: Neutral + Location: 12,37 + TurretFacing: 896 + Actor285: gun + Owner: Neutral + Location: 37,37 + TurretFacing: 128 + Actor286: brik + Owner: Neutral + Location: 18,18 + Actor287: brik + Owner: Neutral + Location: 18,19 + Actor288: brik + Owner: Neutral + Location: 18,20 + Actor289: brik + Owner: Neutral + Location: 18,21 + Actor290: brik + Owner: Neutral + Location: 18,22 + Actor291: brik + Owner: Neutral + Location: 18,23 + Actor292: brik + Owner: Neutral + Location: 18,24 + Actor293: brik + Owner: Neutral + Location: 18,25 + Actor294: brik + Owner: Neutral + Location: 18,26 + Actor295: brik + Owner: Neutral + Location: 18,27 + Actor296: brik + Owner: Neutral + Location: 18,28 + Actor297: brik + Owner: Neutral + Location: 18,29 + Actor298: brik + Owner: Neutral + Location: 18,30 + Actor299: brik + Owner: Neutral + Location: 18,31 + Actor300: brik + Owner: Neutral + Location: 19,31 + Actor301: brik + Owner: Neutral + Location: 20,31 + Actor302: brik + Owner: Neutral + Location: 21,31 + Actor303: brik + Owner: Neutral + Location: 22,31 + Actor304: brik + Owner: Neutral + Location: 23,31 + Actor305: brik + Owner: Neutral + Location: 24,31 + Actor306: brik + Owner: Neutral + Location: 25,31 + Actor307: brik + Owner: Neutral + Location: 26,31 + Actor308: brik + Owner: Neutral + Location: 27,31 + Actor309: brik + Owner: Neutral + Location: 28,31 + Actor310: brik + Owner: Neutral + Location: 29,31 + Actor311: brik + Owner: Neutral + Location: 30,31 + Actor312: brik + Owner: Neutral + Location: 31,31 + Actor313: brik + Owner: Neutral + Location: 31,30 + Actor314: brik + Owner: Neutral + Location: 31,29 + Actor315: brik + Owner: Neutral + Location: 31,28 + Actor316: brik + Owner: Neutral + Location: 31,27 + Actor317: brik + Owner: Neutral + Location: 31,26 + Actor318: brik + Owner: Neutral + Location: 31,25 + Actor319: brik + Owner: Neutral + Location: 31,24 + Actor320: brik + Owner: Neutral + Location: 31,23 + Actor321: brik + Owner: Neutral + Location: 31,22 + Actor322: brik + Owner: Neutral + Location: 31,21 + Actor323: brik + Owner: Neutral + Location: 31,20 + Actor324: brik + Owner: Neutral + Location: 31,19 + Actor325: brik + Owner: Neutral + Location: 31,18 + Actor326: brik + Owner: Neutral + Location: 19,18 + Actor327: brik + Owner: Neutral + Location: 20,18 + Actor328: brik + Owner: Neutral + Location: 21,18 + Actor329: brik + Owner: Neutral + Location: 22,18 + Actor330: brik + Owner: Neutral + Location: 23,18 + Actor331: brik + Owner: Neutral + Location: 25,18 + Actor332: brik + Owner: Neutral + Location: 24,18 + Actor333: brik + Owner: Neutral + Location: 26,18 + Actor334: brik + Owner: Neutral + Location: 27,18 + Actor335: brik + Owner: Neutral + Location: 28,18 + Actor336: brik + Owner: Neutral + Location: 29,18 + Actor337: brik + Owner: Neutral + Location: 30,18 + Actor338: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 15,23 + Actor339: e1 + Owner: Neutral + Facing: 384 + Location: 15,24 + SubCell: 3 + Actor340: e1 + Owner: Neutral + Facing: 384 + Location: 15,25 + SubCell: 3 + Actor341: e1 + Owner: Neutral + Facing: 384 + Location: 15,26 + SubCell: 3 + Actor342: e1 + Owner: Neutral + Facing: 384 + Location: 35,26 + SubCell: 3 + Actor343: e1 + Owner: Neutral + Facing: 384 + Location: 35,25 + SubCell: 3 + Actor344: e1 + Owner: Neutral + Facing: 384 + Location: 35,24 + SubCell: 3 + Actor345: e1 + Owner: Neutral + Facing: 384 + Location: 35,23 + SubCell: 3 + Actor346: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 23,15 + Actor347: e1 + Owner: Neutral + Facing: 384 + Location: 24,15 + SubCell: 3 + Actor348: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 26,15 + Actor349: e1 + Owner: Neutral + Facing: 384 + Location: 25,15 + SubCell: 3 + Actor350: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 23,35 + Actor351: e1 + Owner: Neutral + Facing: 384 + Location: 24,35 + SubCell: 3 + Actor352: e1 + Owner: Neutral + Facing: 384 + Location: 25,35 + SubCell: 3 + Actor353: e1 + Owner: Neutral + Facing: 384 + Location: 26,35 + SubCell: 3 + +Rules: ca|rules/custom/mastermind-madness.yaml + +Weapons: ca|weapons/custom/mastermind-madness.yaml diff --git a/mods/ca/maps/maze-jungle.oramap b/mods/ca/maps/maze-jungle.oramap new file mode 100644 index 0000000000..6c8b0698ab Binary files /dev/null and b/mods/ca/maps/maze-jungle.oramap differ diff --git a/mods/ca/maps/medusa-ca.oramap b/mods/ca/maps/medusa-ca.oramap index c57f6dc5ae..6064724ec2 100644 Binary files a/mods/ca/maps/medusa-ca.oramap and b/mods/ca/maps/medusa-ca.oramap differ diff --git a/mods/ca/maps/meetmehalfway-ca.oramap b/mods/ca/maps/meetmehalfway-ca.oramap index d33fdba579..a5e28f0a3e 100644 Binary files a/mods/ca/maps/meetmehalfway-ca.oramap and b/mods/ca/maps/meetmehalfway-ca.oramap differ diff --git a/mods/ca/maps/mega-mastermind-madness.oramap b/mods/ca/maps/mega-mastermind-madness.oramap deleted file mode 100644 index 3d5b43cc6f..0000000000 Binary files a/mods/ca/maps/mega-mastermind-madness.oramap and /dev/null differ diff --git a/mods/ca/maps/mega-mastermind-madness/map.bin b/mods/ca/maps/mega-mastermind-madness/map.bin new file mode 100644 index 0000000000..86bda49419 Binary files /dev/null and b/mods/ca/maps/mega-mastermind-madness/map.bin differ diff --git a/mods/ca/maps/mega-mastermind-madness/map.png b/mods/ca/maps/mega-mastermind-madness/map.png new file mode 100644 index 0000000000..8101198037 Binary files /dev/null and b/mods/ca/maps/mega-mastermind-madness/map.png differ diff --git a/mods/ca/maps/mega-mastermind-madness/map.yaml b/mods/ca/maps/mega-mastermind-madness/map.yaml new file mode 100644 index 0000000000..4c128f44e2 --- /dev/null +++ b/mods/ca/maps/mega-mastermind-madness/map.yaml @@ -0,0 +1,2324 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: Mega Mastermind Madness + +Author: Darkademic + +Tileset: INTERIOR + +MapSize: 77,77 + +Bounds: 1,1,75,75 + +Visibility: Lobby + +Categories: Minigame + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: england + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: england + Enemies: Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Multi6, Multi7 + PlayerReference@Multi0: + Name: Multi0 + AllowBots: False + Playable: True + LockFaction: True + Faction: RandomScrin + Enemies: Creeps, Neutral + PlayerReference@Multi1: + Name: Multi1 + AllowBots: False + Playable: True + LockFaction: True + Faction: RandomScrin + Enemies: Creeps, Neutral + PlayerReference@Multi2: + Name: Multi2 + AllowBots: False + Playable: True + LockFaction: True + Faction: RandomScrin + Enemies: Creeps, Neutral + PlayerReference@Multi3: + Name: Multi3 + AllowBots: False + Playable: True + LockFaction: True + Faction: RandomScrin + Enemies: Creeps, Neutral + PlayerReference@Multi4: + Name: Multi4 + AllowBots: False + Playable: True + LockFaction: True + Faction: RandomScrin + Enemies: Creeps, Neutral + PlayerReference@Multi5: + Name: Multi5 + AllowBots: False + Playable: True + LockFaction: True + Faction: RandomScrin + Enemies: Creeps, Neutral + PlayerReference@Multi6: + Name: Multi6 + AllowBots: False + Playable: True + LockFaction: True + Faction: RandomScrin + Enemies: Creeps, Neutral + PlayerReference@Multi7: + Name: Multi7 + AllowBots: False + Playable: True + LockFaction: True + Faction: RandomScrin + Enemies: Creeps, Neutral + +Actors: + Actor13: mpspawn + Owner: Neutral + Location: 8,8 + Actor14: mpspawn + Owner: Neutral + Location: 38,8 + Actor15: mpspawn + Owner: Neutral + Location: 68,8 + Actor16: mpspawn + Owner: Neutral + Location: 68,38 + Actor17: mpspawn + Owner: Neutral + Location: 68,68 + Actor18: mpspawn + Owner: Neutral + Location: 38,68 + Actor19: mpspawn + Owner: Neutral + Location: 8,68 + Actor20: mpspawn + Owner: Neutral + Location: 8,38 + Actor28: rndv + Owner: Neutral + Facing: 384 + Location: 22,48 + Actor29: rndv + Owner: Neutral + Facing: 384 + Location: 25,48 + Actor30: rndv + Owner: Neutral + Facing: 384 + Location: 28,48 + Actor31: rndv + Owner: Neutral + Facing: 384 + Location: 28,51 + Actor32: rndv + Owner: Neutral + Facing: 384 + Location: 25,51 + Actor33: rndv + Owner: Neutral + Facing: 384 + Location: 22,51 + Actor34: rndv + Owner: Neutral + Facing: 384 + Location: 22,54 + Actor35: rndv + Owner: Neutral + Facing: 384 + Location: 25,54 + Actor36: rndv + Owner: Neutral + Facing: 384 + Location: 28,54 + Actor37: rndv + Owner: Neutral + Location: 48,54 + Facing: 640 + Actor38: rndv + Owner: Neutral + Location: 48,51 + Facing: 640 + Actor39: rndv + Owner: Neutral + Location: 48,48 + Facing: 640 + Actor40: rndv + Owner: Neutral + Location: 51,48 + Facing: 640 + Actor41: rndv + Owner: Neutral + Location: 54,48 + Facing: 640 + Actor42: rndv + Owner: Neutral + Location: 54,51 + Facing: 640 + Actor43: rndv + Owner: Neutral + Location: 51,51 + Facing: 640 + Actor44: rndv + Owner: Neutral + Location: 51,54 + Facing: 640 + Actor45: rndv + Owner: Neutral + Location: 54,54 + Facing: 640 + Actor46: rndv + Owner: Neutral + Location: 48,28 + Facing: 896 + Actor47: rndv + Owner: Neutral + Location: 48,25 + Facing: 896 + Actor48: rndv + Owner: Neutral + Location: 48,22 + Facing: 896 + Actor49: rndv + Owner: Neutral + Location: 51,22 + Facing: 896 + Actor50: rndv + Owner: Neutral + Location: 51,25 + Facing: 896 + Actor51: rndv + Owner: Neutral + Location: 51,28 + Facing: 896 + Actor52: rndv + Owner: Neutral + Location: 54,28 + Facing: 896 + Actor53: rndv + Owner: Neutral + Location: 54,25 + Facing: 896 + Actor54: rndv + Owner: Neutral + Location: 54,22 + Facing: 896 + Actor55: rndv + Owner: Neutral + Location: 22,28 + Facing: 128 + Actor56: rndv + Owner: Neutral + Location: 22,25 + Facing: 128 + Actor57: rndv + Owner: Neutral + Location: 22,22 + Facing: 128 + Actor58: rndv + Owner: Neutral + Location: 25,22 + Facing: 128 + Actor59: rndv + Owner: Neutral + Location: 25,25 + Facing: 128 + Actor60: rndv + Owner: Neutral + Location: 25,28 + Facing: 128 + Actor61: rndv + Owner: Neutral + Location: 28,28 + Facing: 128 + Actor62: rndv + Owner: Neutral + Location: 28,25 + Facing: 128 + Actor63: rndv + Owner: Neutral + Location: 28,22 + Facing: 128 + Actor64: rndb + Owner: Neutral + Facing: 384 + Location: 35,41 + Actor65: rndb + Owner: Neutral + Location: 35,38 + Facing: 256 + Actor66: rndb + Owner: Neutral + Location: 35,35 + Facing: 128 + Actor67: rndb + Owner: Neutral + Location: 38,35 + Facing: 0 + Actor68: rndb + Owner: Neutral + Location: 41,35 + Facing: 896 + Actor69: rndb + Owner: Neutral + Location: 41,38 + Facing: 768 + Actor71: rndb + Owner: Neutral + Location: 38,41 + Facing: 512 + Actor72: rndb + Owner: Neutral + Location: 41,41 + Facing: 640 + Actor73: rndv + Owner: Neutral + Location: 4,25 + Facing: 640 + Actor74: rndv + Owner: Neutral + Location: 4,21 + Facing: 640 + Actor75: rndv + Owner: Neutral + Location: 21,4 + Facing: 640 + Actor76: rndv + Owner: Neutral + Location: 25,4 + Facing: 640 + Actor77: rndv + Owner: Neutral + Facing: 384 + Location: 51,4 + Actor78: rndv + Owner: Neutral + Facing: 384 + Location: 55,4 + Actor79: rndv + Owner: Neutral + Facing: 384 + Location: 72,25 + Actor80: rndv + Owner: Neutral + Facing: 384 + Location: 72,21 + Actor81: rndv + Owner: Neutral + Location: 72,51 + Facing: 128 + Actor82: rndv + Owner: Neutral + Location: 72,55 + Facing: 128 + Actor83: rndv + Owner: Neutral + Location: 51,72 + Facing: 128 + Actor84: rndv + Owner: Neutral + Location: 55,72 + Facing: 128 + Actor85: rndv + Owner: Neutral + Location: 21,72 + Facing: 896 + Actor86: rndv + Owner: Neutral + Location: 25,72 + Facing: 896 + Actor87: rndv + Owner: Neutral + Location: 4,55 + Facing: 896 + Actor88: rndv + Owner: Neutral + Location: 4,51 + Facing: 896 + Actor101: ftur + Owner: Neutral + Location: 43,55 + Actor102: ftur + Owner: Neutral + Location: 33,55 + Actor103: ftur + Owner: Neutral + Location: 55,43 + Actor104: ftur + Owner: Neutral + Location: 55,33 + Actor105: ftur + Owner: Neutral + Location: 21,33 + Actor106: ftur + Owner: Neutral + Location: 21,43 + Actor107: ftur + Owner: Neutral + Location: 33,21 + Actor108: ftur + Owner: Neutral + Location: 43,21 + Actor109: chain + Owner: Neutral + Location: 33,43 + Actor110: chain + Owner: Neutral + Location: 33,42 + Actor111: chain + Owner: Neutral + Location: 34,43 + Actor112: chain + Owner: Neutral + Location: 33,41 + Actor113: chain + Owner: Neutral + Location: 33,40 + Actor114: chain + Owner: Neutral + Location: 33,39 + Actor115: chain + Owner: Neutral + Location: 33,38 + Actor116: chain + Owner: Neutral + Location: 33,37 + Actor117: chain + Owner: Neutral + Location: 33,36 + Actor118: chain + Owner: Neutral + Location: 33,35 + Actor119: chain + Owner: Neutral + Location: 33,34 + Actor120: chain + Owner: Neutral + Location: 33,33 + Actor121: chain + Owner: Neutral + Location: 34,33 + Actor122: chain + Owner: Neutral + Location: 35,33 + Actor123: chain + Owner: Neutral + Location: 36,33 + Actor124: chain + Owner: Neutral + Location: 37,33 + Actor125: chain + Owner: Neutral + Location: 38,33 + Actor126: chain + Owner: Neutral + Location: 39,33 + Actor127: chain + Owner: Neutral + Location: 40,33 + Actor128: chain + Owner: Neutral + Location: 41,33 + Actor129: chain + Owner: Neutral + Location: 42,33 + Actor130: chain + Owner: Neutral + Location: 43,33 + Actor131: chain + Owner: Neutral + Location: 43,34 + Actor132: chain + Owner: Neutral + Location: 43,35 + Actor133: chain + Owner: Neutral + Location: 43,36 + Actor134: chain + Owner: Neutral + Location: 43,37 + Actor135: chain + Owner: Neutral + Location: 43,38 + Actor136: chain + Owner: Neutral + Location: 43,39 + Actor137: chain + Owner: Neutral + Location: 43,40 + Actor138: chain + Owner: Neutral + Location: 43,41 + Actor139: chain + Owner: Neutral + Location: 43,42 + Actor140: chain + Owner: Neutral + Location: 43,43 + Actor141: chain + Owner: Neutral + Location: 42,43 + Actor142: chain + Owner: Neutral + Location: 41,43 + Actor143: chain + Owner: Neutral + Location: 40,43 + Actor144: chain + Owner: Neutral + Location: 39,43 + Actor145: chain + Owner: Neutral + Location: 38,43 + Actor146: chain + Owner: Neutral + Location: 37,43 + Actor147: chain + Owner: Neutral + Location: 36,43 + Actor148: chain + Owner: Neutral + Location: 35,43 + Actor149: barb + Owner: Neutral + Location: 28,41 + Actor150: barb + Owner: Neutral + Location: 28,42 + Actor151: barb + Owner: Neutral + Location: 28,43 + Actor152: barb + Owner: Neutral + Location: 28,35 + Actor153: barb + Owner: Neutral + Location: 28,34 + Actor154: barb + Owner: Neutral + Location: 28,33 + Actor155: barb + Owner: Neutral + Location: 33,48 + Actor156: barb + Owner: Neutral + Location: 34,48 + Actor157: barb + Owner: Neutral + Location: 35,48 + Actor158: barb + Owner: Neutral + Location: 41,48 + Actor159: barb + Owner: Neutral + Location: 42,48 + Actor160: barb + Owner: Neutral + Location: 43,48 + Actor161: barb + Owner: Neutral + Location: 48,43 + Actor162: barb + Owner: Neutral + Location: 48,42 + Actor163: barb + Owner: Neutral + Location: 48,41 + Actor164: barb + Owner: Neutral + Location: 48,35 + Actor165: barb + Owner: Neutral + Location: 48,34 + Actor166: barb + Owner: Neutral + Location: 48,33 + Actor167: barb + Owner: Neutral + Location: 43,28 + Actor168: barb + Owner: Neutral + Location: 42,28 + Actor169: barb + Owner: Neutral + Location: 41,28 + Actor170: barb + Owner: Neutral + Location: 35,28 + Actor171: barb + Owner: Neutral + Location: 34,28 + Actor172: barb + Owner: Neutral + Location: 33,28 + Actor173: miss + Owner: Neutral + Location: 37,37 + Actor174: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 5,10 + Actor175: e1 + Owner: Neutral + Facing: 384 + Location: 6,10 + SubCell: 3 + Actor176: e1 + Owner: Neutral + Facing: 384 + Location: 7,10 + SubCell: 3 + Actor177: e1 + Owner: Neutral + Facing: 384 + Location: 8,10 + SubCell: 3 + Actor178: e1 + Owner: Neutral + Facing: 384 + Location: 9,10 + SubCell: 3 + Actor179: e1 + Owner: Neutral + Facing: 384 + Location: 10,10 + SubCell: 3 + Actor180: e1 + Owner: Neutral + Facing: 384 + Location: 11,10 + SubCell: 3 + Actor181: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 35,10 + Actor182: e1 + Owner: Neutral + Facing: 384 + Location: 36,10 + SubCell: 3 + Actor183: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 37,10 + Actor184: e1 + Owner: Neutral + Facing: 384 + Location: 38,10 + SubCell: 3 + Actor185: e1 + Owner: Neutral + Facing: 384 + Location: 39,10 + SubCell: 3 + Actor186: e1 + Owner: Neutral + Facing: 384 + Location: 40,10 + SubCell: 3 + Actor187: e1 + Owner: Neutral + Facing: 384 + Location: 41,10 + SubCell: 3 + Actor188: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 65,10 + Actor189: e1 + Owner: Neutral + Facing: 384 + Location: 66,10 + SubCell: 3 + Actor190: e1 + Owner: Neutral + Facing: 384 + Location: 67,10 + SubCell: 3 + Actor191: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 69,10 + Actor192: e1 + Owner: Neutral + Facing: 384 + Location: 70,10 + SubCell: 3 + Actor193: e1 + Owner: Neutral + Facing: 384 + Location: 71,10 + SubCell: 3 + Actor194: e1 + Owner: Neutral + Facing: 384 + Location: 68,10 + SubCell: 3 + Actor195: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 66,41 + Actor196: e1 + Owner: Neutral + Facing: 384 + Location: 66,40 + SubCell: 3 + Actor197: e1 + Owner: Neutral + Facing: 384 + Location: 66,39 + SubCell: 3 + Actor199: e1 + Owner: Neutral + Facing: 384 + Location: 66,37 + SubCell: 3 + Actor200: e1 + Owner: Neutral + Facing: 384 + Location: 66,36 + SubCell: 3 + Actor201: e1 + Owner: Neutral + Facing: 384 + Location: 66,35 + SubCell: 3 + Actor202: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 10,41 + Actor203: e1 + Owner: Neutral + Facing: 384 + Location: 10,40 + SubCell: 3 + Actor204: e1 + Owner: Neutral + Facing: 384 + Location: 10,39 + SubCell: 3 + Actor205: e1 + Owner: Neutral + Facing: 384 + Location: 10,38 + SubCell: 3 + Actor206: e1 + Owner: Neutral + Facing: 384 + Location: 10,37 + SubCell: 3 + Actor207: e1 + Owner: Neutral + Facing: 384 + Location: 10,36 + SubCell: 3 + Actor208: e1 + Owner: Neutral + Facing: 384 + Location: 10,35 + SubCell: 3 + Actor209: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 5,66 + Actor210: e1 + Owner: Neutral + Facing: 384 + Location: 6,66 + SubCell: 3 + Actor211: e1 + Owner: Neutral + Facing: 384 + Location: 7,66 + SubCell: 3 + Actor212: e1 + Owner: Neutral + Facing: 384 + Location: 8,66 + SubCell: 3 + Actor213: e1 + Owner: Neutral + Facing: 384 + Location: 9,66 + SubCell: 3 + Actor214: e1 + Owner: Neutral + Facing: 384 + Location: 10,66 + SubCell: 3 + Actor215: e1 + Owner: Neutral + Facing: 384 + Location: 11,66 + SubCell: 3 + Actor216: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 35,66 + Actor217: e1 + Owner: Neutral + Facing: 384 + Location: 36,66 + SubCell: 3 + Actor218: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 38,66 + Actor219: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 40,66 + Actor220: e1 + Owner: Neutral + Facing: 384 + Location: 39,66 + SubCell: 3 + Actor221: e1 + Owner: Neutral + Facing: 384 + Location: 41,66 + SubCell: 3 + Actor222: e1 + Owner: Neutral + Facing: 384 + Location: 37,66 + SubCell: 3 + Actor223: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 65,66 + Actor224: e1 + Owner: Neutral + Facing: 384 + Location: 66,66 + SubCell: 3 + Actor225: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 67,66 + Actor226: e1 + Owner: Neutral + Facing: 384 + Location: 68,66 + SubCell: 3 + Actor227: e1 + Owner: Neutral + Facing: 384 + Location: 69,66 + SubCell: 3 + Actor228: e1 + Owner: Neutral + Facing: 384 + Location: 70,66 + SubCell: 3 + Actor229: e1 + Owner: Neutral + Facing: 384 + Location: 71,66 + SubCell: 3 + Actor230: e3 + Owner: Neutral + SubCell: 3 + Facing: 384 + Location: 65,70 + Actor231: e3 + Owner: Neutral + Facing: 384 + Location: 66,70 + SubCell: 3 + Actor232: e3 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 35,70 + Actor233: e3 + Owner: Neutral + Facing: 384 + Location: 36,70 + SubCell: 3 + Actor234: e3 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 5,70 + Actor235: e3 + Owner: Neutral + Facing: 384 + Location: 6,70 + SubCell: 3 + Actor236: e3 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 70,41 + Actor237: e3 + Owner: Neutral + Facing: 384 + Location: 70,40 + SubCell: 3 + Actor238: e3 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 6,41 + Actor239: e3 + Owner: Neutral + Facing: 384 + Location: 6,40 + SubCell: 3 + Actor240: e3 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 65,6 + Actor241: e3 + Owner: Neutral + Facing: 384 + Location: 66,6 + SubCell: 3 + Actor242: e3 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 5,6 + Actor243: e3 + Owner: Neutral + Facing: 384 + Location: 6,6 + SubCell: 3 + Actor244: e3 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 35,6 + Actor245: e3 + Owner: Neutral + Facing: 384 + Location: 36,6 + SubCell: 3 + Actor246: e4 + Owner: Neutral + SubCell: 3 + Facing: 384 + Location: 67,70 + Actor247: e4 + Owner: Neutral + Facing: 384 + Location: 68,70 + SubCell: 3 + Actor248: e4 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 7,70 + Actor249: e4 + Owner: Neutral + Facing: 384 + Location: 8,70 + SubCell: 3 + Actor250: e4 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 6,39 + Actor251: e4 + Owner: Neutral + Facing: 384 + Location: 6,38 + SubCell: 3 + Actor252: e4 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 70,39 + Actor253: e4 + Owner: Neutral + Facing: 384 + Location: 70,38 + SubCell: 3 + Actor254: e4 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 67,6 + Actor255: e4 + Owner: Neutral + Facing: 384 + Location: 68,6 + SubCell: 3 + Actor256: e4 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 37,6 + Actor257: e4 + Owner: Neutral + Facing: 384 + Location: 38,6 + SubCell: 3 + Actor258: e4 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 7,6 + Actor259: e4 + Owner: Neutral + Facing: 384 + Location: 8,6 + SubCell: 3 + Actor260: mech + Owner: Neutral + SubCell: 3 + Facing: 384 + Location: 4,23 + Actor261: mech + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 23,4 + Actor262: mech + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 53,4 + Actor263: mech + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 72,23 + Actor264: mech + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 72,53 + Actor265: mech + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 53,72 + Actor266: mech + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 23,72 + Actor267: mech + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 4,53 + Actor268: medi + Owner: Neutral + SubCell: 3 + Facing: 384 + Location: 9,6 + Actor269: medi + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 39,6 + Actor270: medi + Owner: Neutral + Facing: 384 + Location: 69,6 + SubCell: 3 + Actor271: medi + Owner: Neutral + Facing: 384 + Location: 70,37 + SubCell: 3 + Actor272: medi + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 69,70 + Actor273: medi + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 39,70 + Actor274: medi + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 9,70 + Actor275: medi + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 6,37 + Actor276: e4 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 37,70 + Actor277: e4 + Owner: Neutral + Facing: 384 + Location: 38,70 + SubCell: 3 + Actor278: shok + Owner: Neutral + SubCell: 3 + Facing: 384 + Location: 40,70 + Actor279: shok + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 10,70 + Actor280: shok + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 70,70 + Actor281: shok + Owner: Neutral + Facing: 384 + Location: 70,36 + SubCell: 3 + Actor282: shok + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 6,36 + Actor283: shok + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 10,6 + Actor284: shok + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 70,6 + Actor285: e2 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 5,71 + Actor286: e2 + Owner: Neutral + Facing: 384 + Location: 6,71 + SubCell: 3 + Actor287: e2 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 5,41 + Actor288: e2 + Owner: Neutral + Facing: 384 + Location: 5,40 + SubCell: 3 + Actor289: e2 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 65,71 + Actor290: e2 + Owner: Neutral + Facing: 384 + Location: 66,71 + SubCell: 3 + Actor291: e2 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 35,71 + Actor292: e2 + Owner: Neutral + Facing: 384 + Location: 36,71 + SubCell: 3 + Actor293: e2 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 71,41 + Actor294: e2 + Owner: Neutral + Facing: 384 + Location: 71,40 + SubCell: 3 + Actor295: e2 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 5,5 + Actor296: e2 + Owner: Neutral + Facing: 384 + Location: 6,5 + SubCell: 3 + Actor297: e2 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 35,5 + Actor298: e2 + Owner: Neutral + Facing: 384 + Location: 36,5 + SubCell: 3 + Actor299: e2 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 65,5 + Actor300: e2 + Owner: Neutral + Facing: 384 + Location: 66,5 + SubCell: 3 + Actor301: acol + Owner: Neutral + Facing: 384 + Location: 71,6 + SubCell: 3 + Actor302: acol + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 41,6 + Actor303: acol + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 11,6 + Actor304: acol + Owner: Neutral + Facing: 384 + Location: 6,35 + SubCell: 3 + Actor305: acol + Owner: Neutral + Facing: 384 + Location: 11,70 + SubCell: 3 + Actor306: acol + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 71,70 + Actor307: acol + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 70,35 + Actor308: shok + Owner: Neutral + Facing: 384 + Location: 40,6 + SubCell: 3 + Actor309: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 5,9 + Actor310: e1 + Owner: Neutral + Facing: 384 + Location: 6,9 + SubCell: 3 + Actor311: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 10,9 + Actor312: e1 + Owner: Neutral + Facing: 384 + Location: 11,9 + SubCell: 3 + Actor313: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 9,36 + Actor314: e1 + Owner: Neutral + Facing: 384 + Location: 9,35 + SubCell: 3 + Actor315: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 9,41 + Actor316: e1 + Owner: Neutral + Facing: 384 + Location: 9,40 + SubCell: 3 + Actor317: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 5,67 + Actor318: e1 + Owner: Neutral + Facing: 384 + Location: 6,67 + SubCell: 3 + Actor319: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 10,67 + Actor320: e1 + Owner: Neutral + Facing: 384 + Location: 11,67 + SubCell: 3 + Actor321: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 35,67 + Actor322: e1 + Owner: Neutral + Facing: 384 + Location: 36,67 + SubCell: 3 + Actor323: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 40,67 + Actor324: e1 + Owner: Neutral + Facing: 384 + Location: 41,67 + SubCell: 3 + Actor325: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 65,67 + Actor326: e1 + Owner: Neutral + Facing: 384 + Location: 66,67 + SubCell: 3 + Actor327: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 71,67 + Actor328: e1 + Owner: Neutral + Facing: 384 + Location: 70,67 + SubCell: 3 + Actor329: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 67,41 + Actor330: e1 + Owner: Neutral + Facing: 384 + Location: 67,40 + SubCell: 3 + Actor331: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 71,9 + Actor332: e1 + Owner: Neutral + Facing: 384 + Location: 70,9 + SubCell: 3 + Actor333: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 67,36 + Actor334: e1 + Owner: Neutral + Facing: 384 + Location: 67,35 + SubCell: 3 + Actor335: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 65,9 + Actor336: e1 + Owner: Neutral + Facing: 384 + Location: 66,9 + SubCell: 3 + Actor337: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 35,9 + Actor338: e1 + Owner: Neutral + Facing: 384 + Location: 36,9 + SubCell: 3 + Actor339: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 40,9 + Actor340: e1 + Owner: Neutral + Facing: 384 + Location: 41,9 + SubCell: 3 + Actor341: acol + Owner: Neutral + SubCell: 3 + Facing: 384 + Location: 41,70 + Actor342: dog + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 7,5 + Actor343: dog + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 5,39 + Actor344: dog + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 7,71 + Actor345: dog + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 37,71 + Actor346: dog + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 67,71 + Actor347: dog + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 71,39 + Actor348: dog + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 67,5 + Actor349: dog + Owner: Neutral + Facing: 384 + Location: 37,5 + SubCell: 3 + Actor350: bh + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 68,5 + Actor351: bh + Owner: Neutral + Facing: 384 + Location: 38,5 + SubCell: 3 + Actor352: bh + Owner: Neutral + Facing: 384 + Location: 8,5 + SubCell: 3 + Actor353: bh + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 5,38 + Actor354: bh + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 8,71 + Actor355: bh + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 38,71 + Actor356: bh + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 68,71 + Actor357: bh + Owner: Neutral + Facing: 384 + Location: 71,38 + SubCell: 3 + Actor358: ivan + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 69,5 + Actor359: ivan + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 39,5 + Actor360: ivan + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 9,5 + Actor361: ivan + Owner: Neutral + Facing: 384 + Location: 5,37 + SubCell: 3 + Actor362: ivan + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 9,71 + Actor363: ivan + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 39,71 + Actor364: ivan + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 69,71 + Actor365: ivan + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 71,37 + Actor366: s2 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 70,5 + Actor367: s4 + Owner: Neutral + SubCell: 3 + Facing: 384 + Location: 71,5 + Actor368: s4 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 71,35 + Actor369: s4 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 71,71 + Actor370: s4 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 41,71 + Actor371: s4 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 11,71 + Actor372: s4 + Owner: Neutral + Facing: 384 + Location: 5,35 + SubCell: 3 + Actor373: s4 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 11,5 + Actor374: s4 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 41,5 + Actor375: s2 + Owner: Neutral + SubCell: 3 + Facing: 384 + Location: 70,71 + Actor376: s2 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 40,71 + Actor377: s2 + Owner: Neutral + Facing: 384 + Location: 10,71 + SubCell: 3 + Actor378: s2 + Owner: Neutral + Facing: 384 + Location: 5,36 + SubCell: 3 + Actor379: s2 + Owner: Neutral + Facing: 384 + Location: 10,5 + SubCell: 3 + Actor380: s2 + Owner: Neutral + Facing: 384 + Location: 40,5 + SubCell: 3 + Actor381: s2 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 71,36 + Actor382: s1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 68,36 + Actor383: s1 + Owner: Neutral + Facing: 384 + Location: 68,35 + SubCell: 3 + Actor384: s1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 68,40 + Actor385: s1 + Owner: Neutral + Facing: 384 + Location: 68,41 + SubCell: 3 + Actor386: s1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 8,40 + Actor387: s1 + Owner: Neutral + Facing: 384 + Location: 8,41 + SubCell: 3 + Actor388: s1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 8,36 + Actor389: s1 + Owner: Neutral + Facing: 384 + Location: 8,35 + SubCell: 3 + Actor390: s1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 5,8 + Actor391: s1 + Owner: Neutral + Facing: 384 + Location: 6,8 + SubCell: 3 + Actor392: s1 + Owner: Neutral + Facing: 384 + Location: 10,8 + SubCell: 3 + Actor393: s1 + Owner: Neutral + Facing: 384 + Location: 11,8 + SubCell: 3 + Actor394: s1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 36,8 + Actor395: s1 + Owner: Neutral + Facing: 384 + Location: 35,8 + SubCell: 3 + Actor396: s1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 40,8 + Actor397: s1 + Owner: Neutral + Facing: 384 + Location: 41,8 + SubCell: 3 + Actor398: s1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 65,68 + Actor399: s1 + Owner: Neutral + Facing: 384 + Location: 66,68 + SubCell: 3 + Actor400: s1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 70,68 + Actor401: s1 + Owner: Neutral + Facing: 384 + Location: 71,68 + SubCell: 3 + Actor402: s1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 5,68 + Actor403: s1 + Owner: Neutral + Facing: 384 + Location: 6,68 + SubCell: 3 + Actor404: s1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 10,68 + Actor405: s1 + Owner: Neutral + Facing: 384 + Location: 11,68 + SubCell: 3 + Actor406: s1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 35,68 + Actor407: s1 + Owner: Neutral + Facing: 384 + Location: 36,68 + SubCell: 3 + Actor408: s1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 40,68 + Actor409: s1 + Owner: Neutral + Facing: 384 + Location: 41,68 + SubCell: 3 + Actor410: s1 + Owner: Neutral + Facing: 384 + Location: 65,8 + SubCell: 3 + Actor411: s1 + Owner: Neutral + Facing: 384 + Location: 66,8 + SubCell: 3 + Actor412: s1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 70,8 + Actor413: s1 + Owner: Neutral + Facing: 384 + Location: 71,8 + SubCell: 3 + Actor414: atwr + Owner: Neutral + Location: 38,24 + Actor415: atwr + Owner: Neutral + Location: 38,52 + Actor416: atwr + Owner: Neutral + Location: 24,38 + Actor417: atwr + Owner: Neutral + Location: 52,38 + Actor418: rmbc + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 38,39 + Actor419: jeep + Owner: Neutral + Location: 13,63 + Facing: 896 + Actor420: jeep + Owner: Neutral + Location: 38,63 + Facing: 0 + Actor421: jeep + Owner: Neutral + Location: 13,38 + Facing: 768 + Actor422: jeep + Owner: Neutral + Location: 63,38 + Facing: 256 + Actor423: jeep + Owner: Neutral + Location: 63,63 + Facing: 128 + Actor424: jeep + Owner: Neutral + Location: 13,13 + Facing: 640 + Actor425: jeep + Owner: Neutral + Location: 63,13 + Facing: 384 + Actor426: 1tnk + Owner: Neutral + Facing: 384 + Location: 73,3 + Actor427: 1tnk + Owner: Neutral + Location: 3,3 + Facing: 640 + Actor428: 1tnk + Owner: Neutral + Location: 3,73 + Facing: 896 + Actor429: 1tnk + Owner: Neutral + Location: 73,73 + Facing: 128 + Actor430: 1tnk + Owner: Neutral + Location: 73,38 + Facing: 256 + Actor431: 1tnk + Owner: Neutral + Location: 3,38 + Facing: 768 + Actor432: n1c + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 3,53 + Actor433: n1c + Owner: Neutral + Facing: 384 + Location: 5,53 + SubCell: 3 + Actor434: n1c + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 23,73 + Actor435: n1c + Owner: Neutral + Facing: 384 + Location: 23,71 + SubCell: 3 + Actor436: n1c + Owner: Neutral + Facing: 384 + Location: 53,73 + SubCell: 3 + Actor437: n1c + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 53,71 + Actor438: n1c + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 71,53 + Actor439: n1c + Owner: Neutral + Facing: 384 + Location: 73,53 + SubCell: 3 + Actor440: n1c + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 71,23 + Actor441: n1c + Owner: Neutral + Facing: 384 + Location: 73,23 + SubCell: 3 + Actor442: n1c + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 53,5 + Actor444: n1c + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 53,3 + Actor443: n1c + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 23,5 + Actor445: n1c + Owner: Neutral + Facing: 384 + Location: 23,3 + SubCell: 3 + Actor446: n1c + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 5,23 + Actor447: n1c + Owner: Neutral + Facing: 384 + Location: 3,23 + SubCell: 3 + Actor448: n3c + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 74,51 + Actor451: n3c + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 55,74 + Actor453: n3c + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 25,74 + Actor454: n3c + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 2,55 + Actor456: n3c + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 2,25 + Actor458: n3c + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 21,2 + Actor457: n3c + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 51,2 + Actor459: n3c + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 74,21 + Actor449: n5 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 2,21 + Actor450: n5 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 25,2 + Actor452: n5 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 55,2 + Actor455: n5 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 74,25 + Actor460: n5 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 74,55 + Actor461: n5 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 51,74 + Actor462: n5 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 21,74 + Actor463: n5 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 2,51 + Actor464: 1tnk + Owner: Neutral + Location: 38,73 + Facing: 0 + Actor465: 1tnk + Owner: Neutral + Location: 38,3 + Facing: 512 + Actor466: jeep + Owner: Neutral + Location: 38,13 + Facing: 512 + Actor467: gun.nod + Owner: Neutral + Location: 11,65 + TurretFacing: 892 + Actor468: gun.nod + Owner: Neutral + Location: 38,65 + TurretFacing: 0 + Actor469: gun.nod + Owner: Neutral + Location: 65,65 + TurretFacing: 128 + Actor470: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 66,38 + Actor471: gun.nod + Owner: Neutral + Location: 65,38 + TurretFacing: 256 + Actor472: gun.nod + Owner: Neutral + Location: 65,11 + TurretFacing: 384 + Actor473: gun.nod + Owner: Neutral + Location: 38,11 + TurretFacing: 512 + Actor474: gun.nod + Owner: Neutral + Location: 11,11 + TurretFacing: 640 + Actor475: gun.nod + Owner: Neutral + Location: 11,38 + TurretFacing: 768 + Actor476: cram + Owner: Neutral + Location: 0,0 + Actor477: brik + Owner: Neutral + Location: 32,32 + Actor478: brik + Owner: Neutral + Location: 32,33 + Actor479: brik + Owner: Neutral + Location: 32,34 + Actor480: brik + Owner: Neutral + Location: 32,35 + Actor481: brik + Owner: Neutral + Location: 32,36 + Actor482: brik + Owner: Neutral + Location: 32,37 + Actor483: brik + Owner: Neutral + Location: 32,38 + Actor484: brik + Owner: Neutral + Location: 32,39 + Actor485: brik + Owner: Neutral + Location: 32,40 + Actor486: brik + Owner: Neutral + Location: 32,41 + Actor487: brik + Owner: Neutral + Location: 32,42 + Actor488: brik + Owner: Neutral + Location: 32,43 + Actor489: brik + Owner: Neutral + Location: 32,44 + Actor490: brik + Owner: Neutral + Location: 33,44 + Actor491: brik + Owner: Neutral + Location: 34,44 + Actor492: brik + Owner: Neutral + Location: 35,44 + Actor493: brik + Owner: Neutral + Location: 36,44 + Actor494: brik + Owner: Neutral + Location: 33,32 + Actor495: brik + Owner: Neutral + Location: 35,32 + Actor496: brik + Owner: Neutral + Location: 34,32 + Actor497: brik + Owner: Neutral + Location: 36,32 + Actor498: brik + Owner: Neutral + Location: 37,32 + Actor499: brik + Owner: Neutral + Location: 38,32 + Actor500: brik + Owner: Neutral + Location: 39,32 + Actor501: brik + Owner: Neutral + Location: 40,32 + Actor502: brik + Owner: Neutral + Location: 41,32 + Actor503: brik + Owner: Neutral + Location: 43,32 + Actor504: brik + Owner: Neutral + Location: 42,32 + Actor505: brik + Owner: Neutral + Location: 44,32 + Actor506: brik + Owner: Neutral + Location: 44,33 + Actor507: brik + Owner: Neutral + Location: 44,34 + Actor508: brik + Owner: Neutral + Location: 44,35 + Actor509: brik + Owner: Neutral + Location: 44,36 + Actor510: brik + Owner: Neutral + Location: 44,38 + Actor511: brik + Owner: Neutral + Location: 44,37 + Actor512: brik + Owner: Neutral + Location: 44,39 + Actor513: brik + Owner: Neutral + Location: 44,40 + Actor514: brik + Owner: Neutral + Location: 44,41 + Actor515: brik + Owner: Neutral + Location: 44,42 + Actor516: brik + Owner: Neutral + Location: 44,43 + Actor517: brik + Owner: Neutral + Location: 44,44 + Actor518: brik + Owner: Neutral + Location: 43,44 + Actor519: brik + Owner: Neutral + Location: 42,44 + Actor520: brik + Owner: Neutral + Location: 41,44 + Actor521: brik + Owner: Neutral + Location: 40,44 + Actor522: brik + Owner: Neutral + Location: 39,44 + Actor523: brik + Owner: Neutral + Location: 38,44 + Actor524: brik + Owner: Neutral + Location: 37,44 + Actor525: rmbc + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 37,39 + Actor526: rmbc + Owner: Neutral + Facing: 384 + Location: 39,39 + SubCell: 3 + Actor527: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 27,34 + Actor528: e1 + Owner: Neutral + Facing: 384 + Location: 27,35 + SubCell: 3 + Actor529: e1 + Owner: Neutral + Facing: 384 + Location: 27,42 + SubCell: 3 + Actor530: e1 + Owner: Neutral + Facing: 384 + Location: 27,43 + SubCell: 3 + Actor531: e1 + Owner: Neutral + Facing: 384 + Location: 27,41 + SubCell: 3 + Actor532: e1 + Owner: Neutral + Facing: 384 + Location: 27,33 + SubCell: 3 + Actor533: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 33,49 + Actor534: e1 + Owner: Neutral + Facing: 384 + Location: 34,49 + SubCell: 3 + Actor535: e1 + Owner: Neutral + Facing: 384 + Location: 35,49 + SubCell: 3 + Actor536: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 41,49 + Actor537: e1 + Owner: Neutral + Facing: 384 + Location: 42,49 + SubCell: 3 + Actor538: e1 + Owner: Neutral + Facing: 384 + Location: 43,49 + SubCell: 3 + Actor539: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 49,43 + Actor540: e1 + Owner: Neutral + Facing: 384 + Location: 49,42 + SubCell: 3 + Actor541: e1 + Owner: Neutral + Facing: 384 + Location: 49,41 + SubCell: 3 + Actor542: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 49,35 + Actor543: e1 + Owner: Neutral + Facing: 384 + Location: 49,34 + SubCell: 3 + Actor544: e1 + Owner: Neutral + Facing: 384 + Location: 49,33 + SubCell: 3 + Actor545: e1 + Owner: Neutral + Facing: 384 + Location: 33,27 + SubCell: 3 + Actor546: e1 + Owner: Neutral + Facing: 384 + Location: 34,27 + SubCell: 3 + Actor547: e1 + Owner: Neutral + Facing: 384 + Location: 35,27 + SubCell: 3 + Actor548: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 41,27 + Actor549: e1 + Owner: Neutral + Facing: 384 + Location: 42,27 + SubCell: 3 + Actor550: e1 + Owner: Neutral + Facing: 384 + Location: 43,27 + SubCell: 3 + +Rules: ca|rules/custom/mastermind-madness.yaml + +Weapons: ca|weapons/custom/mastermind-madness.yaml diff --git a/mods/ca/maps/messened-ca.oramap b/mods/ca/maps/messened-ca.oramap new file mode 100644 index 0000000000..3acc063a47 Binary files /dev/null and b/mods/ca/maps/messened-ca.oramap differ diff --git a/mods/ca/maps/military-mind-ca.oramap b/mods/ca/maps/military-mind-ca.oramap new file mode 100644 index 0000000000..47824d2b8e Binary files /dev/null and b/mods/ca/maps/military-mind-ca.oramap differ diff --git a/mods/ca/maps/mini-asymmetric-battle-ca.oramap b/mods/ca/maps/mini-asymmetric-battle-ca.oramap new file mode 100644 index 0000000000..60cdf3039b Binary files /dev/null and b/mods/ca/maps/mini-asymmetric-battle-ca.oramap differ diff --git a/mods/ca/maps/minor-pressure.oramap b/mods/ca/maps/minor-pressure.oramap index 3aad9ca90e..310bd4e581 100644 Binary files a/mods/ca/maps/minor-pressure.oramap and b/mods/ca/maps/minor-pressure.oramap differ diff --git a/mods/ca/maps/mithril-ca.oramap b/mods/ca/maps/mithril-ca.oramap new file mode 100644 index 0000000000..6f15fa2fc8 Binary files /dev/null and b/mods/ca/maps/mithril-ca.oramap differ diff --git a/mods/ca/maps/moldova-1v1-ca.oramap b/mods/ca/maps/moldova-1v1-ca.oramap new file mode 100644 index 0000000000..2e1a155e6b Binary files /dev/null and b/mods/ca/maps/moldova-1v1-ca.oramap differ diff --git a/mods/ca/maps/moldova-2v2-ca.oramap b/mods/ca/maps/moldova-2v2-ca.oramap new file mode 100644 index 0000000000..a070e4ad45 Binary files /dev/null and b/mods/ca/maps/moldova-2v2-ca.oramap differ diff --git a/mods/ca/maps/moldova-3v3-ca.oramap b/mods/ca/maps/moldova-3v3-ca.oramap new file mode 100644 index 0000000000..696595643d Binary files /dev/null and b/mods/ca/maps/moldova-3v3-ca.oramap differ diff --git a/mods/ca/maps/moldova-4v4-ca.oramap b/mods/ca/maps/moldova-4v4-ca.oramap new file mode 100644 index 0000000000..3397a0ef35 Binary files /dev/null and b/mods/ca/maps/moldova-4v4-ca.oramap differ diff --git a/mods/ca/maps/moldova_1v1_CA.oramap b/mods/ca/maps/moldova_1v1_CA.oramap deleted file mode 100644 index 25a0ff627b..0000000000 Binary files a/mods/ca/maps/moldova_1v1_CA.oramap and /dev/null differ diff --git a/mods/ca/maps/moon-crater-4v4-ca.oramap b/mods/ca/maps/moon-crater-4v4-ca.oramap new file mode 100644 index 0000000000..76319875ec Binary files /dev/null and b/mods/ca/maps/moon-crater-4v4-ca.oramap differ diff --git a/mods/ca/maps/moonopoly-ca.oramap b/mods/ca/maps/moonopoly-ca.oramap new file mode 100644 index 0000000000..a746a3ecad Binary files /dev/null and b/mods/ca/maps/moonopoly-ca.oramap differ diff --git a/mods/ca/maps/moorsdale-ca.oramap b/mods/ca/maps/moorsdale-ca.oramap index 0507c4cd57..a0cb1d7335 100644 Binary files a/mods/ca/maps/moorsdale-ca.oramap and b/mods/ca/maps/moorsdale-ca.oramap differ diff --git a/mods/ca/maps/mounds-ca.oramap b/mods/ca/maps/mounds-ca.oramap index 8a625d2788..e925923cd3 100644 Binary files a/mods/ca/maps/mounds-ca.oramap and b/mods/ca/maps/mounds-ca.oramap differ diff --git a/mods/ca/maps/mountain-ridge-redux-ca.oramap b/mods/ca/maps/mountain-ridge-redux-ca.oramap index 418c19e923..1d199e1984 100644 Binary files a/mods/ca/maps/mountain-ridge-redux-ca.oramap and b/mods/ca/maps/mountain-ridge-redux-ca.oramap differ diff --git a/mods/ca/maps/mtkazu-ca.oramap b/mods/ca/maps/mtkazu-ca.oramap index 17aef0790a..7344c4a3fb 100644 Binary files a/mods/ca/maps/mtkazu-ca.oramap and b/mods/ca/maps/mtkazu-ca.oramap differ diff --git a/mods/ca/maps/myriad-ca.oramap b/mods/ca/maps/myriad-ca.oramap index 1bdd314cb1..d58a8eeac1 100644 Binary files a/mods/ca/maps/myriad-ca.oramap and b/mods/ca/maps/myriad-ca.oramap differ diff --git a/mods/ca/maps/nachtlicht-ca.oramap b/mods/ca/maps/nachtlicht-ca.oramap new file mode 100644 index 0000000000..b54df03afa Binary files /dev/null and b/mods/ca/maps/nachtlicht-ca.oramap differ diff --git a/mods/ca/maps/necropolis-ca.oramap b/mods/ca/maps/necropolis-ca.oramap index 81d08830e5..aa310ad232 100644 Binary files a/mods/ca/maps/necropolis-ca.oramap and b/mods/ca/maps/necropolis-ca.oramap differ diff --git a/mods/ca/maps/nine-lives.oramap b/mods/ca/maps/nine-lives.oramap index c44d549b01..a48616fb41 100644 Binary files a/mods/ca/maps/nine-lives.oramap and b/mods/ca/maps/nine-lives.oramap differ diff --git a/mods/ca/maps/north-by-northwest.oramap b/mods/ca/maps/north-by-northwest.oramap index 734ffaa77a..70a3123f39 100644 Binary files a/mods/ca/maps/north-by-northwest.oramap and b/mods/ca/maps/north-by-northwest.oramap differ diff --git a/mods/ca/maps/northwestpassage.oramap b/mods/ca/maps/northwestpassage.oramap index b701ad4bc7..3bcede72b4 100644 Binary files a/mods/ca/maps/northwestpassage.oramap and b/mods/ca/maps/northwestpassage.oramap differ diff --git a/mods/ca/maps/nothing-to-lose.oramap b/mods/ca/maps/nothing-to-lose.oramap new file mode 100644 index 0000000000..20d4dd0396 Binary files /dev/null and b/mods/ca/maps/nothing-to-lose.oramap differ diff --git a/mods/ca/maps/nucleus.oramap b/mods/ca/maps/nucleus.oramap index b57c763f61..3bc660ae82 100644 Binary files a/mods/ca/maps/nucleus.oramap and b/mods/ca/maps/nucleus.oramap differ diff --git a/mods/ca/maps/oasis-ca.oramap b/mods/ca/maps/oasis-ca.oramap new file mode 100644 index 0000000000..33294d25b1 Binary files /dev/null and b/mods/ca/maps/oasis-ca.oramap differ diff --git a/mods/ca/maps/obsidian-4v4.oramap b/mods/ca/maps/obsidian-4v4.oramap new file mode 100644 index 0000000000..192de80317 Binary files /dev/null and b/mods/ca/maps/obsidian-4v4.oramap differ diff --git a/mods/ca/maps/obsidian-5v5.oramap b/mods/ca/maps/obsidian-5v5.oramap new file mode 100644 index 0000000000..c6f256c855 Binary files /dev/null and b/mods/ca/maps/obsidian-5v5.oramap differ diff --git a/mods/ca/maps/obsidian-6v6.oramap b/mods/ca/maps/obsidian-6v6.oramap new file mode 100644 index 0000000000..f3bc17cdb4 Binary files /dev/null and b/mods/ca/maps/obsidian-6v6.oramap differ diff --git a/mods/ca/maps/octopolis-8v8.oramap b/mods/ca/maps/octopolis-8v8.oramap new file mode 100644 index 0000000000..ad71e72684 Binary files /dev/null and b/mods/ca/maps/octopolis-8v8.oramap differ diff --git a/mods/ca/maps/offensiveoperation-ca.oramap b/mods/ca/maps/offensiveoperation-ca.oramap index 2f74b5dcff..890bff8cb3 100644 Binary files a/mods/ca/maps/offensiveoperation-ca.oramap and b/mods/ca/maps/offensiveoperation-ca.oramap differ diff --git a/mods/ca/maps/oil-over-ore-ca.oramap b/mods/ca/maps/oil-over-ore-ca.oramap new file mode 100644 index 0000000000..080b8c6e39 Binary files /dev/null and b/mods/ca/maps/oil-over-ore-ca.oramap differ diff --git a/mods/ca/maps/onyx-ca.oramap b/mods/ca/maps/onyx-ca.oramap index bfd3739f46..0ad2d33a9e 100644 Binary files a/mods/ca/maps/onyx-ca.oramap and b/mods/ca/maps/onyx-ca.oramap differ diff --git a/mods/ca/maps/operation-goldmine.oramap b/mods/ca/maps/operation-goldmine.oramap index 0bfab9c4e7..0f12d4cda3 100644 Binary files a/mods/ca/maps/operation-goldmine.oramap and b/mods/ca/maps/operation-goldmine.oramap differ diff --git a/mods/ca/maps/operation-sandstorm.oramap b/mods/ca/maps/operation-sandstorm.oramap new file mode 100644 index 0000000000..aca4cedb97 Binary files /dev/null and b/mods/ca/maps/operation-sandstorm.oramap differ diff --git a/mods/ca/maps/opposite-force.oramap b/mods/ca/maps/opposite-force.oramap index 40725af257..5195d56041 100644 Binary files a/mods/ca/maps/opposite-force.oramap and b/mods/ca/maps/opposite-force.oramap differ diff --git a/mods/ca/maps/orage-ca.oramap b/mods/ca/maps/orage-ca.oramap index 40c7c1e1ca..527a50b9b2 100644 Binary files a/mods/ca/maps/orage-ca.oramap and b/mods/ca/maps/orage-ca.oramap differ diff --git a/mods/ca/maps/order-of-battle-ca.oramap b/mods/ca/maps/order-of-battle-ca.oramap index cee5a3fb2b..62c2ae0e8b 100644 Binary files a/mods/ca/maps/order-of-battle-ca.oramap and b/mods/ca/maps/order-of-battle-ca.oramap differ diff --git a/mods/ca/maps/ore-gardens.oramap b/mods/ca/maps/ore-gardens.oramap index ac420d1513..464cad798a 100644 Binary files a/mods/ca/maps/ore-gardens.oramap and b/mods/ca/maps/ore-gardens.oramap differ diff --git a/mods/ca/maps/ore-lord.oramap b/mods/ca/maps/ore-lord.oramap index 6ea020f137..637f014a19 100644 Binary files a/mods/ca/maps/ore-lord.oramap and b/mods/ca/maps/ore-lord.oramap differ diff --git a/mods/ca/maps/outdoor-trails.oramap b/mods/ca/maps/outdoor-trails.oramap index 3f4690a3e1..4f13037783 100644 Binary files a/mods/ca/maps/outdoor-trails.oramap and b/mods/ca/maps/outdoor-trails.oramap differ diff --git a/mods/ca/maps/overkill-ca.oramap b/mods/ca/maps/overkill-ca.oramap new file mode 100644 index 0000000000..91d71c56b1 Binary files /dev/null and b/mods/ca/maps/overkill-ca.oramap differ diff --git a/mods/ca/maps/overlook-ca.oramap b/mods/ca/maps/overlook-ca.oramap new file mode 100644 index 0000000000..f64405a045 Binary files /dev/null and b/mods/ca/maps/overlook-ca.oramap differ diff --git a/mods/ca/maps/overseer-ca.oramap b/mods/ca/maps/overseer-ca.oramap new file mode 100644 index 0000000000..ab42a5b9a7 Binary files /dev/null and b/mods/ca/maps/overseer-ca.oramap differ diff --git a/mods/ca/maps/paranoia-ca.oramap b/mods/ca/maps/paranoia-ca.oramap new file mode 100644 index 0000000000..30cdaa065d Binary files /dev/null and b/mods/ca/maps/paranoia-ca.oramap differ diff --git a/mods/ca/maps/pentageddon.oramap b/mods/ca/maps/pentageddon.oramap index cd3da185d4..24731caf62 100644 Binary files a/mods/ca/maps/pentageddon.oramap and b/mods/ca/maps/pentageddon.oramap differ diff --git a/mods/ca/maps/pie-of-animosity.oramap b/mods/ca/maps/pie-of-animosity.oramap index 9da9aa2ab9..47254b5d5e 100644 Binary files a/mods/ca/maps/pie-of-animosity.oramap and b/mods/ca/maps/pie-of-animosity.oramap differ diff --git a/mods/ca/maps/pitfight-ca.oramap b/mods/ca/maps/pitfight-ca.oramap index e0c365495b..80bb784126 100644 Binary files a/mods/ca/maps/pitfight-ca.oramap and b/mods/ca/maps/pitfight-ca.oramap differ diff --git a/mods/ca/maps/pitiless-ca.oramap b/mods/ca/maps/pitiless-ca.oramap index f83f0a202a..dfcbf011a9 100644 Binary files a/mods/ca/maps/pitiless-ca.oramap and b/mods/ca/maps/pitiless-ca.oramap differ diff --git a/mods/ca/maps/pity-light-ca.oramap b/mods/ca/maps/pity-light-ca.oramap new file mode 100644 index 0000000000..d501913abb Binary files /dev/null and b/mods/ca/maps/pity-light-ca.oramap differ diff --git a/mods/ca/maps/pleasantplains-1v1-ca.oramap b/mods/ca/maps/pleasantplains-1v1-ca.oramap new file mode 100644 index 0000000000..2f4b7ceb06 Binary files /dev/null and b/mods/ca/maps/pleasantplains-1v1-ca.oramap differ diff --git a/mods/ca/maps/pleasantplains-4v4-ca.oramap b/mods/ca/maps/pleasantplains-4v4-ca.oramap new file mode 100644 index 0000000000..9090a07a04 Binary files /dev/null and b/mods/ca/maps/pleasantplains-4v4-ca.oramap differ diff --git a/mods/ca/maps/pleasantplains-ca.oramap b/mods/ca/maps/pleasantplains-ca.oramap deleted file mode 100644 index e1d75e9ad5..0000000000 Binary files a/mods/ca/maps/pleasantplains-ca.oramap and /dev/null differ diff --git a/mods/ca/maps/polar-disorder.oramap b/mods/ca/maps/polar-disorder.oramap index 16591a19c4..9d88c05249 100644 Binary files a/mods/ca/maps/polar-disorder.oramap and b/mods/ca/maps/polar-disorder.oramap differ diff --git a/mods/ca/maps/polemos-ca.oramap b/mods/ca/maps/polemos-ca.oramap index 5f07ece3a2..5a993d2d49 100644 Binary files a/mods/ca/maps/polemos-ca.oramap and b/mods/ca/maps/polemos-ca.oramap differ diff --git a/mods/ca/maps/pool-party.oramap b/mods/ca/maps/pool-party.oramap index 43fdbd7901..6e3a672ae3 100644 Binary files a/mods/ca/maps/pool-party.oramap and b/mods/ca/maps/pool-party.oramap differ diff --git a/mods/ca/maps/precautions-ca.oramap b/mods/ca/maps/precautions-ca.oramap index 8a50595d8f..c6bf1c3a40 100644 Binary files a/mods/ca/maps/precautions-ca.oramap and b/mods/ca/maps/precautions-ca.oramap differ diff --git a/mods/ca/maps/precipice-2v2.oramap b/mods/ca/maps/precipice-2v2.oramap new file mode 100644 index 0000000000..d9be0af11f Binary files /dev/null and b/mods/ca/maps/precipice-2v2.oramap differ diff --git a/mods/ca/maps/precipice-3v3.oramap b/mods/ca/maps/precipice-3v3.oramap new file mode 100644 index 0000000000..e1c67e5d8f Binary files /dev/null and b/mods/ca/maps/precipice-3v3.oramap differ diff --git a/mods/ca/maps/precipice-extended.oramap b/mods/ca/maps/precipice-extended.oramap deleted file mode 100644 index 62f2cf8780..0000000000 Binary files a/mods/ca/maps/precipice-extended.oramap and /dev/null differ diff --git a/mods/ca/maps/precipice.oramap b/mods/ca/maps/precipice.oramap deleted file mode 100644 index 234c6f25d2..0000000000 Binary files a/mods/ca/maps/precipice.oramap and /dev/null differ diff --git a/mods/ca/maps/pressure.oramap b/mods/ca/maps/pressure.oramap index f2f760a443..fd78a1e780 100644 Binary files a/mods/ca/maps/pressure.oramap and b/mods/ca/maps/pressure.oramap differ diff --git a/mods/ca/maps/puddles-redux.oramap b/mods/ca/maps/puddles-redux.oramap index df00533354..2eae13dfb7 100644 Binary files a/mods/ca/maps/puddles-redux.oramap and b/mods/ca/maps/puddles-redux.oramap differ diff --git a/mods/ca/maps/quadra-temptation.oramap b/mods/ca/maps/quadra-temptation.oramap index 068abef366..aaafa3e08d 100644 Binary files a/mods/ca/maps/quadra-temptation.oramap and b/mods/ca/maps/quadra-temptation.oramap differ diff --git a/mods/ca/maps/quadramatic.oramap b/mods/ca/maps/quadramatic.oramap index aa87a75014..8d79f4a6a3 100644 Binary files a/mods/ca/maps/quadramatic.oramap and b/mods/ca/maps/quadramatic.oramap differ diff --git a/mods/ca/maps/quarry-ca.oramap b/mods/ca/maps/quarry-ca.oramap index 07b5184ef2..9a59261740 100644 Binary files a/mods/ca/maps/quarry-ca.oramap and b/mods/ca/maps/quarry-ca.oramap differ diff --git a/mods/ca/maps/reavers-divide.oramap b/mods/ca/maps/reavers-divide.oramap index a7496903cb..b8fc89976c 100644 Binary files a/mods/ca/maps/reavers-divide.oramap and b/mods/ca/maps/reavers-divide.oramap differ diff --git a/mods/ca/maps/reavers-ravine.oramap b/mods/ca/maps/reavers-ravine.oramap index c259ba5134..e9cc2fef15 100644 Binary files a/mods/ca/maps/reavers-ravine.oramap and b/mods/ca/maps/reavers-ravine.oramap differ diff --git a/mods/ca/maps/rediscovery-ca.oramap b/mods/ca/maps/rediscovery-ca.oramap new file mode 100644 index 0000000000..f8b20d2308 Binary files /dev/null and b/mods/ca/maps/rediscovery-ca.oramap differ diff --git a/mods/ca/maps/regeneration-basin.oramap b/mods/ca/maps/regeneration-basin.oramap index 346b48f1ab..5022e60695 100644 Binary files a/mods/ca/maps/regeneration-basin.oramap and b/mods/ca/maps/regeneration-basin.oramap differ diff --git a/mods/ca/maps/revenge-ca.oramap b/mods/ca/maps/revenge-ca.oramap index 9b8ebd006e..0c42918dfb 100644 Binary files a/mods/ca/maps/revenge-ca.oramap and b/mods/ca/maps/revenge-ca.oramap differ diff --git a/mods/ca/maps/rheinpfalz-ca.oramap b/mods/ca/maps/rheinpfalz-ca.oramap new file mode 100644 index 0000000000..eff48db7a7 Binary files /dev/null and b/mods/ca/maps/rheinpfalz-ca.oramap differ diff --git a/mods/ca/maps/riskyroads-ca.oramap b/mods/ca/maps/riskyroads-ca.oramap index 487130a160..2107a5cc20 100644 Binary files a/mods/ca/maps/riskyroads-ca.oramap and b/mods/ca/maps/riskyroads-ca.oramap differ diff --git a/mods/ca/maps/river-crossing-2023-ca.oramap b/mods/ca/maps/river-crossing-2023-ca.oramap new file mode 100644 index 0000000000..3807f52ef2 Binary files /dev/null and b/mods/ca/maps/river-crossing-2023-ca.oramap differ diff --git a/mods/ca/maps/rivercrossing2.2-ca.oramap b/mods/ca/maps/rivercrossing2.2-ca.oramap index 3cfb1b4a12..e68cf18e57 100644 Binary files a/mods/ca/maps/rivercrossing2.2-ca.oramap and b/mods/ca/maps/rivercrossing2.2-ca.oramap differ diff --git a/mods/ca/maps/riverofblood-ca.oramap b/mods/ca/maps/riverofblood-ca.oramap new file mode 100644 index 0000000000..35eecbff23 Binary files /dev/null and b/mods/ca/maps/riverofblood-ca.oramap differ diff --git a/mods/ca/maps/roadkings-ca.oramap b/mods/ca/maps/roadkings-ca.oramap index 8751182014..a8ad11561a 100644 Binary files a/mods/ca/maps/roadkings-ca.oramap and b/mods/ca/maps/roadkings-ca.oramap differ diff --git a/mods/ca/maps/rotation-ca.oramap b/mods/ca/maps/rotation-ca.oramap new file mode 100644 index 0000000000..3273850533 Binary files /dev/null and b/mods/ca/maps/rotation-ca.oramap differ diff --git a/mods/ca/maps/ruination.oramap b/mods/ca/maps/ruination.oramap index 30dfdaacca..864df49140 100644 Binary files a/mods/ca/maps/ruination.oramap and b/mods/ca/maps/ruination.oramap differ diff --git a/mods/ca/maps/sandcastles.oramap b/mods/ca/maps/sandcastles.oramap index f7bd4d180c..17022a74c6 100644 Binary files a/mods/ca/maps/sandcastles.oramap and b/mods/ca/maps/sandcastles.oramap differ diff --git a/mods/ca/maps/sands-of-time-ca.oramap b/mods/ca/maps/sands-of-time-ca.oramap index ec52f01f81..561da62963 100644 Binary files a/mods/ca/maps/sands-of-time-ca.oramap and b/mods/ca/maps/sands-of-time-ca.oramap differ diff --git a/mods/ca/maps/sanitarium-ca.oramap b/mods/ca/maps/sanitarium-ca.oramap index 2466bea1c6..c06cb78922 100644 Binary files a/mods/ca/maps/sanitarium-ca.oramap and b/mods/ca/maps/sanitarium-ca.oramap differ diff --git a/mods/ca/maps/schism.oramap b/mods/ca/maps/schism.oramap new file mode 100644 index 0000000000..4b4446b7c9 Binary files /dev/null and b/mods/ca/maps/schism.oramap differ diff --git a/mods/ca/maps/schwerpunkt-ca.oramap b/mods/ca/maps/schwerpunkt-ca.oramap new file mode 100644 index 0000000000..2e853b7c30 Binary files /dev/null and b/mods/ca/maps/schwerpunkt-ca.oramap differ diff --git a/mods/ca/maps/scorched-earth-ca.oramap b/mods/ca/maps/scorched-earth-ca.oramap new file mode 100644 index 0000000000..d9625cf72b Binary files /dev/null and b/mods/ca/maps/scorched-earth-ca.oramap differ diff --git a/mods/ca/maps/scrinfestation/map.bin b/mods/ca/maps/scrinfestation/map.bin new file mode 100644 index 0000000000..6b878ae9a8 Binary files /dev/null and b/mods/ca/maps/scrinfestation/map.bin differ diff --git a/mods/ca/maps/scrinfestation/map.png b/mods/ca/maps/scrinfestation/map.png new file mode 100644 index 0000000000..769cd44b97 Binary files /dev/null and b/mods/ca/maps/scrinfestation/map.png differ diff --git a/mods/ca/maps/scrinfestation/map.yaml b/mods/ca/maps/scrinfestation/map.yaml new file mode 100644 index 0000000000..295ff8fdff --- /dev/null +++ b/mods/ca/maps/scrinfestation/map.yaml @@ -0,0 +1,5767 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: Scrinfestation + +Author: Darkademic + +Tileset: INTERIOR + +MapSize: 98,98 + +Bounds: 1,1,96,96 + +Visibility: Lobby + +Categories: Co-op Mission, Minigame + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: england + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: england + Enemies: Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Multi6, Multi7, Multi8, Multi9 + PlayerReference@Scrin: + Name: Scrin + Faction: reaper + Color: B83DFF + Enemies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Multi6, Multi7, Multi8, Multi9 + PlayerReference@GDI: + Name: GDI + NonCombatant: True + Faction: RandomGDI + Color: E5D19C + Allies: Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Multi6, Multi7, Multi8, Multi9 + Enemies: Scrin + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + Faction: RandomGDI + LockSpawn: True + Spawn: 1 + LockTeam: True + Team: 1 + Enemies: Scrin + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + Faction: RandomGDI + LockSpawn: True + Spawn: 2 + LockTeam: True + Team: 1 + Enemies: Scrin + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + Faction: RandomGDI + LockSpawn: True + Spawn: 3 + LockTeam: True + Team: 1 + Enemies: Scrin + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + Faction: RandomGDI + LockSpawn: True + Spawn: 4 + LockTeam: True + Team: 1 + Enemies: Scrin + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + Faction: RandomGDI + LockSpawn: True + Spawn: 5 + LockTeam: True + Team: 1 + Enemies: Scrin + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + Faction: RandomGDI + LockSpawn: True + Spawn: 6 + LockTeam: True + Team: 1 + Enemies: Scrin + PlayerReference@Multi6: + Name: Multi6 + Playable: True + LockFaction: True + Faction: RandomGDI + LockSpawn: True + Spawn: 7 + LockTeam: True + Team: 1 + Enemies: Scrin + PlayerReference@Multi7: + Name: Multi7 + Playable: True + LockFaction: True + Faction: RandomGDI + LockSpawn: True + Spawn: 8 + LockTeam: True + Team: 1 + Enemies: Scrin + PlayerReference@Multi8: + Name: Multi8 + Playable: True + LockFaction: True + Faction: RandomGDI + LockSpawn: True + Spawn: 9 + LockTeam: True + Team: 1 + Enemies: Scrin + PlayerReference@Multi9: + Name: Multi9 + Playable: True + LockFaction: True + Faction: RandomGDI + LockSpawn: True + Spawn: 10 + LockTeam: True + Team: 1 + Enemies: Scrin + +Actors: + Actor88: barb + Owner: Neutral + Location: 85,85 + Actor89: barb + Owner: Neutral + Location: 86,85 + Actor90: barb + Owner: Neutral + Location: 92,85 + Actor91: barb + Owner: Neutral + Location: 93,85 + Actor92: barb + Owner: Neutral + Location: 85,86 + Actor93: barl + Owner: Creeps + Location: 92,86 + Actor94: barb + Owner: Neutral + Location: 93,86 + Actor95: brl3 + Owner: Creeps + Location: 90,87 + Actor96: barl + Owner: Creeps + Location: 89,88 + Actor97: brl3 + Owner: Creeps + Location: 87,89 + Actor98: brl3 + Owner: Creeps + Location: 90,89 + Actor99: barl + Owner: Creeps + Location: 90,90 + Actor100: barl + Owner: Creeps + Location: 87,92 + Actor101: barb + Owner: Neutral + Location: 85,93 + Actor102: brl3 + Owner: Creeps + Location: 89,93 + Actor103: barb + Owner: Neutral + Location: 93,93 + Actor104: barb + Owner: Neutral + Location: 85,94 + Actor105: barb + Owner: Neutral + Location: 86,94 + Actor106: barb + Owner: Neutral + Location: 92,94 + Actor107: barb + Owner: Neutral + Location: 93,94 + Actor108: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 47,85 + Actor109: s1 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 49,85 + Actor110: apc2.husk + Owner: GDI + Facing: 384 + Location: 50,85 + Actor111: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 53,85 + Actor112: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 54,85 + Actor113: s1 + Owner: Scrin + SubCell: 3 + Location: 45,86 + Facing: 384 + Actor114: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 56,86 + Actor115: barb + Owner: GDI + Location: 43,87 + Actor116: barb + Owner: GDI + Location: 44,87 + Actor117: barb + Owner: GDI + Location: 48,87 + Actor118: barb + Owner: GDI + Location: 49,87 + Actor119: barb + Owner: GDI + Location: 50,87 + Actor120: barb + Owner: GDI + Location: 54,87 + Actor121: barb + Owner: GDI + Location: 55,87 + Actor122: barb + Owner: GDI + Location: 43,88 + Actor123: sbag + Owner: GDI + Location: 44,88 + Actor124: sbag + Owner: GDI + Location: 45,88 + Actor125: sbag + Owner: GDI + Location: 48,88 + Actor126: sbag + Owner: GDI + Location: 49,88 + Actor127: sbag + Owner: GDI + Location: 50,88 + Actor128: sbag + Owner: GDI + Location: 53,88 + Actor129: sbag + Owner: GDI + Location: 54,88 + Actor130: barb + Owner: GDI + Location: 55,88 + Actor131: barb + Owner: GDI + Location: 43,89 + Actor132: sbag + Owner: GDI + Location: 44,89 + Actor133: apc2 + Owner: GDI + Location: 45,89 + Facing: 118 + Actor134: e1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 49,89 + Actor135: e1 + Owner: GDI + Facing: 384 + SubCell: 1 + Location: 49,89 + Actor136: e1 + Owner: GDI + Facing: 384 + SubCell: 2 + Location: 49,89 + Actor137: e1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 50,89 + Actor138: apc2 + Owner: GDI + Facing: 904 + Location: 53,89 + Actor139: sbag + Owner: GDI + Location: 54,89 + Actor140: barb + Owner: GDI + Location: 55,89 + Actor141: e2 + Owner: GDI + SubCell: 3 + Facing: 384 + Location: 44,90 + Actor142: e2 + Owner: GDI + Facing: 384 + SubCell: 1 + Location: 44,90 + Actor143: medi + Owner: GDI + SubCell: 3 + Location: 46,90 + Facing: 384 + Actor144: flare + Owner: GDI + Location: 49,90 + Actor147: e1 + Owner: GDI + SubCell: 1 + Facing: 384 + Location: 54,90 + Actor148: mpspawn + Owner: Neutral + Location: 45,92 + Actor149: mpspawn + Owner: Neutral + Location: 47,92 + Actor150: mpspawn + Owner: Neutral + Location: 49,92 + Actor151: mpspawn + Owner: Neutral + Location: 51,92 + Actor152: mpspawn + Owner: Neutral + Location: 53,92 + Actor153: mpspawn + Owner: Neutral + Location: 45,94 + Actor154: mpspawn + Owner: Neutral + Location: 47,94 + Actor155: mpspawn + Owner: Neutral + Location: 49,94 + Actor156: mpspawn + Owner: Neutral + Location: 51,94 + Actor157: mpspawn + Owner: Neutral + Location: 53,94 + Actor160: s1 + Owner: Scrin + SubCell: 3 + Stance: AttackAnything + Facing: 975 + Location: 32,92 + Actor161: s1 + Owner: Scrin + SubCell: 1 + Facing: 384 + Stance: AttackAnything + Location: 32,92 + Actor162: s4 + Owner: Scrin + SubCell: 3 + Facing: 1023 + Stance: AttackAnything + Location: 32,93 + Actor163: s1 + Owner: Scrin + SubCell: 3 + Facing: 1023 + Stance: AttackAnything + Location: 35,93 + Actor164: s1 + Owner: Scrin + SubCell: 3 + Facing: 103 + Stance: AttackAnything + Location: 37,93 + Actor165: s1 + Owner: Scrin + SubCell: 3 + Facing: 1023 + Stance: AttackAnything + Location: 33,94 + Actor166: s1 + Owner: Scrin + SubCell: 3 + Facing: 753 + Stance: AttackAnything + Location: 36,94 + Actor167: s1 + Owner: Scrin + SubCell: 1 + Facing: 384 + Stance: AttackAnything + Location: 36,94 + Actor158: s2 + Owner: Scrin + SubCell: 3 + Facing: 126 + Location: 69,93 + Actor159: s2 + Owner: Scrin + SubCell: 3 + Facing: 142 + Location: 67,94 + Actor80: corr + Owner: Scrin + Facing: 384 + Location: 58,33 + Actor81: corr + Owner: Scrin + Facing: 384 + Location: 61,37 + Actor82: corr + Owner: Scrin + Facing: 384 + Location: 64,41 + Actor83: barb + Owner: Neutral + Location: 40,54 + Actor84: barb + Owner: Neutral + Location: 40,55 + Actor85: barb + Owner: Neutral + Location: 41,54 + Actor86: barb + Owner: Neutral + Location: 43,54 + Actor87: barb + Owner: Neutral + Location: 43,55 + Actor168: barb + Owner: Neutral + Location: 43,56 + Actor169: barb + Owner: Neutral + Location: 42,56 + Actor170: barb + Owner: Neutral + Location: 40,58 + Actor171: barb + Owner: Neutral + Location: 41,58 + Actor172: barb + Owner: Neutral + Location: 42,58 + Actor173: barb + Owner: Neutral + Location: 43,58 + Actor174: barb + Owner: Neutral + Location: 44,59 + Actor175: barb + Owner: Neutral + Location: 44,58 + Actor176: barb + Owner: Neutral + Location: 42,60 + Actor177: barb + Owner: Neutral + Location: 42,61 + Actor178: barb + Owner: Neutral + Location: 43,61 + Actor179: barb + Owner: Neutral + Location: 44,61 + Actor180: barb + Owner: Neutral + Location: 45,61 + Actor181: barb + Owner: Neutral + Location: 44,54 + Actor182: barb + Owner: Neutral + Location: 45,54 + Actor183: barb + Owner: Neutral + Location: 40,63 + Actor184: barb + Owner: Neutral + Location: 41,63 + Actor185: barb + Owner: Neutral + Location: 44,63 + Actor186: barb + Owner: Neutral + Location: 44,64 + Actor187: barl + Owner: Creeps + Location: 7,53 + Actor188: brl3 + Owner: Creeps + Location: 5,54 + Actor189: barl + Owner: Creeps + Location: 4,55 + Actor191: brl3 + Owner: Creeps + Location: 5,56 + Actor192: barl + Owner: Creeps + Location: 5,57 + Actor194: brl3 + Owner: Creeps + Location: 4,60 + Actor195: s2 + Owner: Scrin + SubCell: 3 + Location: 63,94 + Facing: 142 + Actor196: s2 + Owner: Scrin + SubCell: 3 + Location: 62,93 + Facing: 880 + Actor197: gscr + Owner: Scrin + SubCell: 3 + Location: 21,94 + Facing: 761 + Actor198: gscr + Owner: Scrin + Location: 21,93 + SubCell: 3 + Facing: 769 + Actor199: gscr + Owner: Scrin + SubCell: 3 + Location: 21,92 + Facing: 769 + Actor200: gscr + Owner: Scrin + SubCell: 3 + Location: 21,95 + Facing: 761 + Actor201: gscr + Owner: Scrin + SubCell: 3 + Facing: 769 + Location: 64,57 + Actor202: gscr + Owner: Scrin + SubCell: 3 + Facing: 769 + Location: 64,58 + Actor203: gscr + Owner: Scrin + SubCell: 3 + Facing: 761 + Location: 64,59 + Actor204: gscr + Owner: Scrin + SubCell: 3 + Location: 64,60 + Facing: 761 + Actor205: s4 + Owner: Scrin + SubCell: 3 + Stance: AttackAnything + Location: 24,85 + Facing: 626 + Actor206: corr + Owner: Scrin + Location: 86,12 + Facing: 214 + Actor207: corr + Owner: Scrin + Location: 86,4 + Facing: 245 + Actor208: ruin + Owner: Scrin + Facing: 384 + Location: 81,35 + Actor209: ruin + Owner: Scrin + Facing: 384 + Location: 84,34 + Actor210: dark + Owner: Scrin + Location: 8,89 + Facing: 666 + Actor217: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 68,82 + Actor218: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 69,82 + Actor219: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 71,78 + Actor220: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 72,77 + Actor221: s3 + Owner: Scrin + Facing: 384 + Location: 73,78 + SubCell: 3 + Actor222: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 73,77 + Actor223: s3 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 73,77 + Actor224: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 75,77 + Actor225: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 76,70 + Actor226: s1 + Owner: Scrin + Facing: 384 + Location: 76,69 + SubCell: 3 + Actor227: s1 + Owner: Scrin + Facing: 384 + Location: 76,69 + SubCell: 1 + Actor228: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 77,70 + Actor229: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 77,68 + Actor230: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 74,58 + Actor231: s1 + Owner: Scrin + Facing: 384 + Location: 73,59 + SubCell: 3 + Actor232: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 65,57 + Actor233: s1 + Owner: Scrin + Facing: 384 + Location: 65,57 + SubCell: 1 + Actor234: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 66,59 + Actor235: s1 + Owner: Scrin + Facing: 384 + Location: 65,60 + SubCell: 3 + Actor236: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 65,62 + Actor237: s1 + Owner: Scrin + Facing: 384 + Location: 65,62 + SubCell: 1 + Actor238: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 68,67 + Actor239: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 65,67 + Actor240: gunw + Owner: Scrin + Location: 54,58 + Facing: 729 + Actor241: gscr + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 4,72 + Actor242: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 5,73 + Actor243: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 5,70 + Actor244: s2 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 26,75 + Actor245: s2 + Owner: Scrin + Facing: 384 + Location: 26,74 + SubCell: 3 + Actor246: s2 + Owner: Scrin + Facing: 384 + Location: 26,73 + SubCell: 3 + Actor247: s2 + Owner: Scrin + Facing: 384 + Location: 26,72 + SubCell: 3 + Actor248: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 26,76 + Actor249: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 13,76 + Actor250: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 12,74 + Actor251: s1 + Owner: Scrin + Facing: 384 + Location: 12,73 + SubCell: 3 + Actor252: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 14,76 + Actor253: s1 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 13,76 + Actor254: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 22,63 + Actor255: s1 + Owner: Scrin + Facing: 384 + Location: 23,63 + SubCell: 3 + Actor256: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 24,64 + Actor257: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 23,61 + Actor258: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 26,64 + Actor259: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 24,63 + Actor260: s1 + Owner: Scrin + Facing: 384 + Location: 23,63 + SubCell: 1 + Actor261: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 9,62 + Actor262: s3 + Owner: Scrin + Facing: 384 + Location: 9,61 + SubCell: 3 + Actor263: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 11,62 + Actor265: s4 + Owner: Scrin + Facing: 384 + Location: 3,52 + SubCell: 3 + Actor266: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 5,51 + Actor267: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 7,51 + Actor268: gscr + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 53,40 + Actor269: gscr + Owner: Scrin + Facing: 384 + Location: 53,41 + SubCell: 3 + Actor270: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 59,34 + Actor271: s1 + Owner: Scrin + Facing: 384 + Location: 59,34 + SubCell: 1 + Actor272: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 64,36 + Actor273: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 62,35 + Actor274: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 63,39 + Actor275: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 65,40 + Actor276: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 56,32 + Actor277: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 66,42 + Actor278: gunw + Owner: Scrin + Location: 36,48 + Facing: 586 + Actor279: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 36,50 + Actor280: s1 + Owner: Scrin + Facing: 384 + Location: 36,50 + SubCell: 1 + Actor281: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 38,50 + Actor282: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 39,48 + Actor283: s1 + Owner: Scrin + Facing: 384 + Location: 39,48 + SubCell: 1 + Actor284: s3 + Owner: Scrin + Facing: 384 + Location: 38,49 + SubCell: 3 + Actor285: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 40,46 + Actor286: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 34,49 + Actor287: s4 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 44,39 + Actor288: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 46,40 + Actor289: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 44,38 + WormholeSE: wormhole + Owner: Scrin + Location: 91,92 + WormholeNE: wormhole + Owner: Scrin + Location: 92,8 + WormholeNW: wormhole + Owner: Scrin + Location: 5,5 + Actor293: lchr + Owner: Scrin + Location: 85,91 + Facing: 991 + Actor294: lchr + Owner: Scrin + Location: 94,87 + Facing: 79 + Actor295: lchr + Owner: Scrin + Location: 8,39 + Facing: 483 + Actor296: gunw + Owner: Scrin + Location: 13,7 + Facing: 491 + Actor297: gunw + Owner: Scrin + Location: 5,10 + Facing: 459 + Actor298: ruin + Owner: Scrin + Facing: 384 + Location: 14,4 + Actor300: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 45,38 + Actor301: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 43,36 + Actor302: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 47,39 + Actor303: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 41,23 + Actor304: s1 + Owner: Scrin + Facing: 384 + Location: 41,23 + SubCell: 1 + Actor305: s1 + Owner: Scrin + Facing: 384 + Location: 41,24 + SubCell: 3 + Actor306: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 41,20 + Actor307: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 42,23 + Actor308: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 6,39 + Actor309: s1 + Owner: Scrin + Facing: 384 + Location: 6,39 + SubCell: 1 + Actor310: s1 + Owner: Scrin + Facing: 384 + Location: 8,38 + SubCell: 3 + Actor311: s1 + Owner: Scrin + Facing: 384 + Location: 9,38 + SubCell: 3 + Actor312: s1 + Owner: Scrin + Facing: 384 + Location: 10,39 + SubCell: 3 + Actor313: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 10,62 + Actor314: s1 + Owner: Scrin + Facing: 384 + Location: 41,62 + SubCell: 3 + Actor315: s1 + Owner: Scrin + Facing: 384 + Location: 43,60 + SubCell: 3 + Actor316: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 41,64 + Actor317: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 42,74 + Actor318: s4 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 42,75 + Actor319: s4 + Owner: Scrin + Facing: 384 + Location: 41,74 + SubCell: 3 + Actor320: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 46,51 + Actor321: gscr + Owner: Scrin + SubCell: 3 + Location: 62,65 + Facing: 943 + Actor322: gscr + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 69,25 + Actor323: gscr + Owner: Scrin + Facing: 384 + Location: 70,26 + SubCell: 3 + Actor324: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 72,27 + Actor325: s3 + Owner: Scrin + Facing: 384 + Location: 70,25 + SubCell: 3 + Actor326: s3 + Owner: Scrin + Facing: 384 + Location: 70,25 + SubCell: 1 + Actor327: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 67,24 + Actor328: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 73,25 + Actor333: corr + Owner: Scrin + Location: 58,4 + Facing: 384 + Actor334: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 43,3 + Actor335: s4 + Owner: Scrin + Facing: 384 + Location: 42,4 + SubCell: 3 + Actor336: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 44,4 + Actor337: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 45,3 + Actor338: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 50,14 + Actor339: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 49,17 + Actor340: s1 + Owner: Scrin + Facing: 384 + Location: 50,17 + SubCell: 3 + Actor341: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 51,16 + Actor342: s1 + Owner: Scrin + Facing: 384 + Location: 51,16 + SubCell: 1 + Actor343: s1 + Owner: Scrin + Facing: 384 + Location: 50,16 + SubCell: 3 + Actor344: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 21,5 + Actor345: s1 + Owner: Scrin + Facing: 384 + Location: 21,5 + SubCell: 1 + Actor346: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 21,7 + Actor347: s1 + Owner: Scrin + Facing: 384 + Location: 21,7 + SubCell: 1 + Actor348: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 18,9 + Actor349: s1 + Owner: Scrin + Facing: 384 + Location: 19,9 + SubCell: 3 + Actor350: s1 + Owner: Scrin + Facing: 384 + Location: 20,10 + SubCell: 3 + Actor351: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 21,13 + Actor352: s1 + Owner: Scrin + Facing: 384 + Location: 20,9 + SubCell: 3 + Actor353: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 21,9 + Actor354: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 22,15 + Actor355: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 29,9 + Actor356: s1 + Owner: Scrin + Facing: 384 + Location: 28,9 + SubCell: 3 + Actor357: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 27,12 + Actor358: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 32,10 + Actor359: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 35,15 + Actor360: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 36,15 + Actor361: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 20,20 + Actor362: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 19,23 + Actor363: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 20,25 + Actor364: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 19,27 + Actor365: s1 + Owner: Scrin + Facing: 384 + Location: 19,28 + SubCell: 3 + Actor366: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 19,30 + Actor370: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 19,47 + Actor376: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 19,26 + Actor377: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 4,24 + Actor378: gscr + Owner: Scrin + Facing: 384 + Location: 5,23 + SubCell: 3 + Actor379: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 4,20 + Actor380: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 6,21 + Actor381: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 4,22 + Actor382: s1 + Owner: Scrin + Facing: 384 + Location: 5,22 + SubCell: 3 + Actor383: s1 + Owner: Scrin + Facing: 384 + Location: 5,21 + SubCell: 3 + Actor384: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 3,24 + Actor385: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 3,41 + Actor386: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 4,38 + Actor387: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 5,42 + Actor388: s1 + Owner: Scrin + Facing: 384 + Location: 5,72 + SubCell: 3 + Actor389: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 4,71 + Actor390: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 3,70 + Actor391: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 7,72 + Actor396: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 26,84 + Actor397: s1 + Owner: Scrin + Facing: 384 + Location: 26,85 + SubCell: 3 + Actor398: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 28,84 + Actor399: s3 + Owner: Scrin + Facing: 384 + Location: 28,84 + SubCell: 1 + Actor400: gunw + Owner: Scrin + Location: 85,69 + Facing: 848 + Actor401: dark + Owner: Scrin + Location: 89,57 + Facing: 150 + Actor402: gunw + Owner: Scrin + Location: 93,56 + Facing: 190 + Actor403: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 87,58 + Actor404: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 88,57 + Actor405: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 91,59 + Actor406: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 92,58 + Actor407: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 92,56 + Actor408: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 93,54 + Actor409: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 84,57 + Actor410: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 93,42 + Actor411: s3 + Owner: Scrin + Facing: 384 + Location: 94,42 + SubCell: 3 + Actor412: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 93,43 + Actor413: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 94,45 + Actor414: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 94,47 + Actor415: gscr + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 93,44 + Actor416: gscr + Owner: Scrin + Facing: 384 + Location: 92,44 + SubCell: 3 + Actor417: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 75,48 + Actor418: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 71,42 + Actor419: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 74,40 + Actor420: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 60,19 + Actor421: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 13,15 + Actor422: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 14,13 + Actor423: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 13,14 + Actor424: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 16,52 + Actor425: s4 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 59,47 + Actor426: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 62,47 + Actor427: s4 + Owner: Scrin + Facing: 384 + Location: 63,46 + SubCell: 3 + Actor428: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 71,4 + Actor429: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 72,5 + Actor430: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 72,8 + Actor431: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 72,11 + Actor432: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 68,12 + Actor433: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 69,12 + Actor434: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 74,8 + Actor435: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 73,4 + Actor436: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 72,3 + Actor437: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 67,10 + Actor438: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 75,59 + Actor439: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 85,67 + Actor440: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 85,72 + Actor441: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 87,88 + Actor442: s3 + Owner: Scrin + Facing: 384 + Location: 87,88 + SubCell: 1 + Actor443: s3 + Owner: Scrin + Facing: 384 + Location: 89,90 + SubCell: 3 + Actor444: s3 + Owner: Scrin + Facing: 384 + Location: 89,90 + SubCell: 1 + Actor445: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 92,88 + Actor446: s3 + Owner: Scrin + Facing: 384 + Location: 92,88 + SubCell: 1 + Actor447: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 94,90 + Actor448: s1 + Owner: Scrin + Facing: 384 + Location: 93,91 + SubCell: 3 + Actor449: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 88,91 + Actor450: s4 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 92,73 + Actor451: s4 + Owner: Scrin + Facing: 384 + Location: 93,72 + SubCell: 3 + Actor452: s4 + Owner: Scrin + Facing: 384 + Location: 94,72 + SubCell: 3 + Actor453: s4 + Owner: Scrin + Facing: 384 + Location: 93,73 + SubCell: 3 + Actor454: s1 + Owner: Scrin + Facing: 384 + Location: 92,73 + SubCell: 1 + Actor455: s1 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 94,72 + Actor456: s1 + Owner: Scrin + Facing: 384 + Location: 94,73 + SubCell: 3 + Actor457: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 85,48 + Actor458: s3 + Owner: Scrin + Facing: 384 + Location: 85,48 + SubCell: 1 + Actor459: s2 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 82,7 + Actor460: s2 + Owner: Scrin + Facing: 384 + Location: 82,8 + SubCell: 3 + Actor461: s2 + Owner: Scrin + Facing: 384 + Location: 82,8 + SubCell: 1 + Actor462: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 82,9 + Actor463: gscr + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 77,5 + Actor464: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 77,6 + Actor465: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 89,6 + Actor466: s1 + Owner: Scrin + Facing: 384 + Location: 88,8 + SubCell: 3 + Actor467: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 90,11 + Actor468: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 92,13 + Actor469: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 93,6 + Actor470: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 93,4 + Actor471: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 90,4 + Actor472: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 91,5 + Actor473: ruin + Owner: Scrin + Location: 94,17 + Facing: 126 + Actor474: ruin + Owner: Scrin + Location: 92,17 + Facing: 237 + Actor481: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 12,27 + Actor482: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 12,29 + Actor483: s1 + Owner: Scrin + Facing: 384 + Location: 12,30 + SubCell: 3 + Actor484: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 12,32 + Actor485: s1 + Owner: Scrin + Facing: 384 + Location: 13,30 + SubCell: 3 + Actor486: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 13,31 + Actor487: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 12,23 + Actor488: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 50,6 + Actor489: s1 + Owner: Scrin + Facing: 384 + Location: 52,5 + SubCell: 3 + Actor490: s1 + Owner: Scrin + Facing: 384 + Location: 52,4 + SubCell: 3 + Actor491: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 51,7 + Actor492: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 51,5 + Actor493: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 60,46 + Actor494: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 62,45 + Actor495: s1 + Owner: Scrin + Facing: 384 + Location: 63,45 + SubCell: 3 + Actor496: s1 + Owner: Scrin + Facing: 384 + Location: 61,47 + SubCell: 3 + Actor497: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 73,42 + Actor498: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 71,39 + Actor499: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 75,41 + Actor500: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 85,49 + Actor501: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 86,47 + Actor502: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 85,46 + Actor503: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 87,45 + Actor504: s1 + Owner: Scrin + Facing: 384 + Location: 88,44 + SubCell: 3 + Actor505: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 86,58 + Actor506: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 20,61 + Actor507: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 24,61 + Actor508: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 26,62 + Actor509: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 28,65 + Actor510: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 67,92 + Actor511: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 27,94 + Actor512: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 24,89 + Actor513: s1 + Owner: Scrin + Facing: 384 + Location: 74,78 + SubCell: 3 + Actor514: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 67,65 + Actor515: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 64,64 + Actor516: gscr + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 57,75 + Actor517: gscr + Owner: Scrin + Facing: 384 + Location: 56,76 + SubCell: 3 + Actor518: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 57,77 + Actor519: gscr + Owner: Scrin + Facing: 384 + Location: 58,76 + SubCell: 3 + Actor528: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 52,6 + Actor529: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 27,4 + Actor530: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 67,4 + Actor531: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 60,4 + Actor532: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 56,3 + Actor533: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 61,28 + Actor534: s4 + Owner: Scrin + Facing: 384 + Location: 60,28 + SubCell: 3 + Actor535: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 60,26 + Actor536: s3 + Owner: Scrin + Facing: 384 + Location: 60,28 + SubCell: 1 + Actor537: s3 + Owner: Scrin + Facing: 384 + Location: 60,28 + SubCell: 2 + Actor538: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 61,27 + Actor539: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 85,38 + Actor540: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 48,76 + Actor541: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 49,69 + Actor542: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 45,69 + Actor543: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 42,68 + Actor544: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 45,60 + Actor545: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 45,57 + Actor546: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 42,57 + Actor547: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 43,53 + Actor548: s1 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 43,60 + Actor549: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 94,63 + Actor550: s1 + Owner: Scrin + Facing: 384 + Location: 93,63 + SubCell: 3 + Actor551: s1 + Owner: Scrin + Facing: 384 + Location: 94,62 + SubCell: 3 + Actor554: rmbospawn + Owner: Multi0 + Location: 45,92 + Actor555: rmbospawn + Owner: Multi1 + Location: 47,92 + Actor556: rmbospawn + Owner: Multi2 + Location: 49,92 + Actor557: rmbospawn + Owner: Multi3 + Location: 51,92 + Actor558: rmbospawn + Owner: Multi4 + Location: 53,92 + Actor559: rmbospawn + Owner: Multi5 + Location: 45,94 + Actor560: rmbospawn + Owner: Multi6 + Location: 47,94 + Actor561: rmbospawn + Owner: Multi7 + Location: 49,94 + Actor562: rmbospawn + Owner: Multi8 + Location: 51,94 + Actor563: rmbospawn + Owner: Multi9 + Location: 53,94 + NW2: waypoint + Owner: Neutral + Location: 6,23 + NW3: waypoint + Owner: Neutral + Location: 10,40 + NW4: waypoint + Owner: Neutral + Location: 6,56 + NW5: waypoint + Owner: Neutral + Location: 21,68 + NW6: waypoint + Owner: Neutral + Location: 4,73 + NW7: waypoint + Owner: Neutral + Location: 5,89 + NW8: waypoint + Owner: Neutral + Location: 34,93 + NW1: waypoint + Owner: Neutral + Location: 5,5 + NE1: waypoint + Owner: Neutral + Location: 92,8 + SE1: waypoint + Owner: Neutral + Location: 91,92 + NE2: waypoint + Owner: Neutral + Location: 51,4 + NE3: waypoint + Owner: Neutral + Location: 61,33 + NE4: waypoint + Owner: Neutral + Location: 44,42 + NE5: waypoint + Owner: Neutral + Location: 42,70 + NE6: waypoint + Owner: Neutral + Location: 76,59 + NE7: waypoint + Owner: Neutral + Location: 54,86 + NW9: waypoint + Owner: Neutral + Location: 44,86 + SE2: waypoint + Owner: Neutral + Location: 76,34 + Actor566: brik + Owner: Neutral + Location: 37,87 + Actor567: brik + Owner: Neutral + Location: 38,87 + Actor571: brik + Owner: Neutral + Location: 36,87 + Actor572: brik + Owner: Neutral + Location: 36,88 + Actor573: brik + Owner: Neutral + Location: 36,89 + Actor574: brik + Owner: Neutral + Location: 36,90 + Actor575: brik + Owner: Neutral + Location: 37,90 + Actor576: brik + Owner: Neutral + Location: 38,90 + Actor577: brik + Owner: Neutral + Location: 39,90 + Actor580: brik + Owner: Neutral + Location: 42,90 + Actor581: brik + Owner: Neutral + Location: 42,91 + Actor582: brik + Owner: Neutral + Location: 42,92 + Actor583: brik + Owner: Neutral + Location: 42,93 + Actor584: brik + Owner: Neutral + Location: 42,94 + Actor585: brik + Owner: Neutral + Location: 42,95 + Actor586: brik + Owner: Neutral + Location: 39,95 + Actor587: brik + Owner: Neutral + Location: 39,94 + Actor588: brik + Owner: Neutral + Location: 39,93 + Actor589: brik + Owner: Neutral + Location: 39,92 + Actor590: brik + Owner: Neutral + Location: 39,91 + Actor591: s4 + Owner: Scrin + SubCell: 3 + Location: 3,54 + Facing: 384 + Actor592: brl3 + Owner: Creeps + Location: 3,56 + Actor593: barl + Owner: Creeps + Location: 3,59 + Actor564: medi + Owner: GDI + SubCell: 3 + Location: 52,90 + Facing: 384 + Actor600: s4 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 10,13 + Actor601: s4 + Owner: Scrin + Facing: 384 + Location: 9,12 + SubCell: 3 + Actor602: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 10,12 + Actor603: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 8,11 + Actor607: brik + Owner: Neutral + Location: 63,87 + Actor608: brik + Owner: Neutral + Location: 62,87 + Actor609: brik + Owner: Neutral + Location: 61,87 + Actor610: brik + Owner: Neutral + Location: 60,87 + Actor614: brik + Owner: Neutral + Location: 63,88 + Actor615: brik + Owner: Neutral + Location: 63,89 + Actor616: brik + Owner: Neutral + Location: 63,90 + Actor617: brik + Owner: Neutral + Location: 62,90 + Actor618: brik + Owner: Neutral + Location: 61,90 + Actor619: brik + Owner: Neutral + Location: 60,90 + Actor620: brik + Owner: Neutral + Location: 67,87 + Actor621: brik + Owner: Neutral + Location: 68,87 + Actor622: brik + Owner: Neutral + Location: 69,87 + Actor623: brik + Owner: Neutral + Location: 70,87 + Actor624: brik + Owner: Neutral + Location: 70,86 + Actor625: brik + Owner: Neutral + Location: 67,90 + Actor626: brik + Owner: Neutral + Location: 67,89 + Actor627: brik + Owner: Neutral + Location: 67,88 + Actor628: brik + Owner: Neutral + Location: 68,90 + Actor629: brik + Owner: Neutral + Location: 69,90 + Actor630: brik + Owner: Neutral + Location: 70,90 + Actor631: brik + Owner: Neutral + Location: 70,91 + Actor632: brik + Owner: Neutral + Location: 70,92 + Actor633: brik + Owner: Neutral + Location: 60,91 + Actor634: brik + Owner: Neutral + Location: 60,92 + Actor635: brik + Owner: Neutral + Location: 64,83 + Actor636: brik + Owner: Neutral + Location: 65,83 + Actor637: brik + Owner: Neutral + Location: 66,83 + Actor638: brik + Owner: Neutral + Location: 66,82 + Actor639: brik + Owner: Neutral + Location: 66,81 + Actor640: brik + Owner: Neutral + Location: 66,80 + Actor641: brik + Owner: Neutral + Location: 66,79 + Actor642: brik + Owner: Neutral + Location: 63,83 + Actor643: brik + Owner: Neutral + Location: 62,83 + Actor644: brik + Owner: Neutral + Location: 70,80 + Actor645: brik + Owner: Neutral + Location: 70,81 + Actor646: brik + Owner: Neutral + Location: 71,80 + Actor647: brik + Owner: Neutral + Location: 72,80 + Actor648: brik + Owner: Neutral + Location: 73,80 + Actor649: brik + Owner: Neutral + Location: 70,82 + Actor650: brik + Owner: Neutral + Location: 70,83 + Actor651: brik + Owner: Neutral + Location: 74,80 + Actor652: brik + Owner: Neutral + Location: 75,80 + Actor653: brik + Owner: Neutral + Location: 70,75 + Actor654: brik + Owner: Neutral + Location: 71,75 + Actor655: brik + Owner: Neutral + Location: 72,75 + Actor656: brik + Owner: Neutral + Location: 73,75 + Actor657: brik + Owner: Neutral + Location: 74,75 + Actor658: brik + Owner: Neutral + Location: 74,74 + Actor659: brik + Owner: Neutral + Location: 74,73 + Actor660: brik + Owner: Neutral + Location: 74,72 + Actor661: brik + Owner: Neutral + Location: 74,71 + Actor662: brik + Owner: Neutral + Location: 74,70 + Actor663: brik + Owner: Neutral + Location: 70,61 + Actor664: brik + Owner: Neutral + Location: 71,61 + Actor665: brik + Owner: Neutral + Location: 72,61 + Actor666: brik + Owner: Neutral + Location: 73,61 + Actor667: brik + Owner: Neutral + Location: 74,61 + Actor668: brik + Owner: Neutral + Location: 74,62 + Actor669: brik + Owner: Neutral + Location: 74,63 + Actor670: brik + Owner: Neutral + Location: 74,64 + Actor671: brik + Owner: Neutral + Location: 74,65 + Actor672: brik + Owner: Neutral + Location: 70,62 + Actor673: brik + Owner: Neutral + Location: 70,63 + Actor674: brik + Owner: Neutral + Location: 70,65 + Actor675: brik + Owner: Neutral + Location: 70,66 + Actor676: brik + Owner: Neutral + Location: 70,64 + Actor677: brik + Owner: Neutral + Location: 70,67 + Actor678: brik + Owner: Neutral + Location: 70,68 + Actor679: brik + Owner: Neutral + Location: 70,69 + Actor680: brik + Owner: Neutral + Location: 55,60 + Actor681: brik + Owner: Neutral + Location: 56,60 + Actor682: brik + Owner: Neutral + Location: 57,60 + Actor683: brik + Owner: Neutral + Location: 58,60 + Actor684: brik + Owner: Neutral + Location: 59,60 + Actor685: brik + Owner: Neutral + Location: 55,61 + Actor686: brik + Owner: Neutral + Location: 55,62 + Actor687: brik + Owner: Neutral + Location: 55,63 + Actor688: brik + Owner: Neutral + Location: 55,64 + Actor689: brik + Owner: Neutral + Location: 55,65 + Actor690: brik + Owner: Neutral + Location: 55,66 + Actor691: brik + Owner: Neutral + Location: 55,67 + Actor692: brik + Owner: Neutral + Location: 59,66 + Actor693: brik + Owner: Neutral + Location: 59,64 + Actor694: brik + Owner: Neutral + Location: 59,63 + Actor695: brik + Owner: Neutral + Location: 59,62 + Actor696: brik + Owner: Neutral + Location: 59,61 + Actor697: brik + Owner: Neutral + Location: 59,65 + Actor698: brik + Owner: Neutral + Location: 46,65 + Actor699: brik + Owner: Neutral + Location: 45,65 + Actor700: brik + Owner: Neutral + Location: 44,65 + Actor701: brik + Owner: Neutral + Location: 44,66 + Actor702: brik + Owner: Neutral + Location: 44,67 + Actor703: brik + Owner: Neutral + Location: 45,67 + Actor704: brik + Owner: Neutral + Location: 46,67 + Actor705: brik + Owner: Neutral + Location: 47,67 + Actor706: brik + Owner: Neutral + Location: 48,67 + Actor707: brik + Owner: Neutral + Location: 49,67 + Actor708: brik + Owner: Neutral + Location: 50,67 + Actor709: brik + Owner: Neutral + Location: 51,67 + Actor710: brik + Owner: Neutral + Location: 51,66 + Actor711: brik + Owner: Neutral + Location: 51,65 + Actor712: brik + Owner: Neutral + Location: 51,64 + Actor713: brik + Owner: Neutral + Location: 51,63 + Actor714: brik + Owner: Neutral + Location: 51,62 + Actor715: brik + Owner: Neutral + Location: 46,63 + Actor716: brik + Owner: Neutral + Location: 46,64 + Actor717: brik + Owner: Neutral + Location: 46,62 + Actor718: brik + Owner: Neutral + Location: 46,61 + Actor719: brik + Owner: Neutral + Location: 46,60 + Actor720: brik + Owner: Neutral + Location: 46,59 + Actor721: brik + Owner: Neutral + Location: 46,58 + Actor722: brik + Owner: Neutral + Location: 46,53 + Actor723: brik + Owner: Neutral + Location: 47,53 + Actor724: brik + Owner: Neutral + Location: 48,53 + Actor725: brik + Owner: Neutral + Location: 46,54 + Actor726: brik + Owner: Neutral + Location: 46,55 + Actor727: brik + Owner: Neutral + Location: 49,53 + Actor728: brik + Owner: Neutral + Location: 39,53 + Actor729: brik + Owner: Neutral + Location: 38,53 + Actor730: brik + Owner: Neutral + Location: 37,53 + Actor731: brik + Owner: Neutral + Location: 36,53 + Actor732: brik + Owner: Neutral + Location: 39,54 + Actor733: brik + Owner: Neutral + Location: 39,55 + Actor734: brik + Owner: Neutral + Location: 39,56 + Actor735: brik + Owner: Neutral + Location: 39,57 + Actor736: brik + Owner: Neutral + Location: 39,58 + Actor737: brik + Owner: Neutral + Location: 44,71 + Actor738: brik + Owner: Neutral + Location: 44,72 + Actor739: brik + Owner: Neutral + Location: 44,73 + Actor740: brik + Owner: Neutral + Location: 45,73 + Actor741: brik + Owner: Neutral + Location: 46,73 + Actor742: brik + Owner: Neutral + Location: 45,71 + Actor743: brik + Owner: Neutral + Location: 46,71 + Actor744: brik + Owner: Neutral + Location: 47,71 + Actor745: brik + Owner: Neutral + Location: 48,71 + Actor746: brik + Owner: Neutral + Location: 49,71 + Actor747: brik + Owner: Neutral + Location: 50,71 + Actor748: brik + Owner: Neutral + Location: 51,71 + Actor749: brik + Owner: Neutral + Location: 51,72 + Actor750: brik + Owner: Neutral + Location: 51,73 + Actor751: brik + Owner: Neutral + Location: 50,73 + Actor752: brik + Owner: Neutral + Location: 49,73 + Actor753: brik + Owner: Neutral + Location: 48,73 + Actor754: brik + Owner: Neutral + Location: 47,73 + Actor755: brik + Owner: Neutral + Location: 55,73 + Actor756: brik + Owner: Neutral + Location: 55,72 + Actor757: brik + Owner: Neutral + Location: 55,71 + Actor758: brik + Owner: Neutral + Location: 56,73 + Actor759: brik + Owner: Neutral + Location: 57,73 + Actor760: brik + Owner: Neutral + Location: 58,73 + Actor761: brik + Owner: Neutral + Location: 59,73 + Actor762: brik + Owner: Neutral + Location: 55,70 + Actor763: brik + Owner: Neutral + Location: 55,69 + Actor764: brik + Owner: Neutral + Location: 69,55 + Actor765: brik + Owner: Neutral + Location: 70,55 + Actor766: brik + Owner: Neutral + Location: 70,56 + Actor767: brik + Owner: Neutral + Location: 71,56 + Actor768: brik + Owner: Neutral + Location: 68,55 + Actor769: brik + Owner: Neutral + Location: 43,48 + Actor770: brik + Owner: Neutral + Location: 44,48 + Actor771: brik + Owner: Neutral + Location: 42,48 + Actor772: brik + Owner: Neutral + Location: 42,47 + Actor773: brik + Owner: Neutral + Location: 42,46 + Actor774: brik + Owner: Neutral + Location: 43,46 + Actor775: brik + Owner: Neutral + Location: 44,46 + Actor776: brik + Owner: Neutral + Location: 45,46 + Actor777: brik + Owner: Neutral + Location: 45,47 + Actor778: brik + Owner: Neutral + Location: 45,48 + Actor779: brik + Owner: Neutral + Location: 36,43 + Actor780: brik + Owner: Neutral + Location: 37,43 + Actor781: brik + Owner: Neutral + Location: 38,43 + Actor782: brik + Owner: Neutral + Location: 39,43 + Actor783: brik + Owner: Neutral + Location: 39,42 + Actor784: brik + Owner: Neutral + Location: 39,41 + Actor785: brik + Owner: Neutral + Location: 38,41 + Actor786: brik + Owner: Neutral + Location: 37,41 + Actor787: brik + Owner: Neutral + Location: 36,41 + Actor788: brik + Owner: Neutral + Location: 36,42 + Actor789: brik + Owner: Neutral + Location: 28,40 + Actor790: brik + Owner: Neutral + Location: 29,40 + Actor791: brik + Owner: Neutral + Location: 30,40 + Actor792: brik + Owner: Neutral + Location: 31,40 + Actor793: brik + Owner: Neutral + Location: 31,39 + Actor794: brik + Owner: Neutral + Location: 31,38 + Actor795: brik + Owner: Neutral + Location: 31,37 + Actor796: brik + Owner: Neutral + Location: 32,37 + Actor797: brik + Owner: Neutral + Location: 33,37 + Actor798: brik + Owner: Neutral + Location: 34,37 + Actor799: brik + Owner: Neutral + Location: 35,37 + Actor800: brik + Owner: Neutral + Location: 36,37 + Actor801: brik + Owner: Neutral + Location: 37,37 + Actor802: brik + Owner: Neutral + Location: 38,37 + Actor803: brik + Owner: Neutral + Location: 39,37 + Actor804: brik + Owner: Neutral + Location: 39,36 + Actor805: brik + Owner: Neutral + Location: 39,35 + Actor806: brik + Owner: Neutral + Location: 39,34 + Actor807: brik + Owner: Neutral + Location: 35,34 + Actor808: brik + Owner: Neutral + Location: 36,34 + Actor809: brik + Owner: Neutral + Location: 37,34 + Actor810: brik + Owner: Neutral + Location: 38,34 + Actor811: brik + Owner: Neutral + Location: 35,33 + Actor812: brik + Owner: Neutral + Location: 35,32 + Actor813: brik + Owner: Neutral + Location: 35,31 + Actor814: brik + Owner: Neutral + Location: 35,30 + Actor815: brik + Owner: Neutral + Location: 32,30 + Actor816: brik + Owner: Neutral + Location: 33,30 + Actor817: brik + Owner: Neutral + Location: 34,30 + Actor818: brik + Owner: Neutral + Location: 32,31 + Actor819: brik + Owner: Neutral + Location: 32,32 + Actor828: brik + Owner: Neutral + Location: 21,40 + Actor829: brik + Owner: Neutral + Location: 21,38 + Actor830: brik + Owner: Neutral + Location: 21,39 + Actor831: brik + Owner: Neutral + Location: 21,37 + Actor832: brik + Owner: Neutral + Location: 21,36 + Actor833: brik + Owner: Neutral + Location: 22,40 + Actor834: brik + Owner: Neutral + Location: 24,40 + Actor835: brik + Owner: Neutral + Location: 23,40 + Actor836: brik + Owner: Neutral + Location: 25,40 + Actor837: brik + Owner: Neutral + Location: 27,40 + Actor838: brik + Owner: Neutral + Location: 26,40 + Actor839: brik + Owner: Neutral + Location: 21,43 + Actor840: brik + Owner: Neutral + Location: 21,44 + Actor841: brik + Owner: Neutral + Location: 21,45 + Actor842: brik + Owner: Neutral + Location: 21,46 + Actor843: brik + Owner: Neutral + Location: 22,43 + Actor844: brik + Owner: Neutral + Location: 23,43 + Actor845: brik + Owner: Neutral + Location: 24,43 + Actor846: brik + Owner: Neutral + Location: 25,43 + Actor847: brik + Owner: Neutral + Location: 26,43 + Actor848: brik + Owner: Neutral + Location: 27,43 + Actor849: brik + Owner: Neutral + Location: 28,43 + Actor850: brik + Owner: Neutral + Location: 29,43 + Actor851: brik + Owner: Neutral + Location: 30,43 + Actor852: brik + Owner: Neutral + Location: 31,43 + Actor853: brik + Owner: Neutral + Location: 31,44 + Actor854: brik + Owner: Neutral + Location: 31,45 + Actor855: brik + Owner: Neutral + Location: 31,46 + Actor856: brik + Owner: Neutral + Location: 31,47 + Actor857: brik + Owner: Neutral + Location: 31,48 + Actor858: brik + Owner: Neutral + Location: 31,49 + Actor859: brik + Owner: Neutral + Location: 31,51 + Actor860: brik + Owner: Neutral + Location: 31,50 + Actor861: brik + Owner: Neutral + Location: 31,52 + Actor862: brik + Owner: Neutral + Location: 31,53 + Actor863: brik + Owner: Neutral + Location: 32,53 + Actor864: brik + Owner: Neutral + Location: 21,47 + Actor865: brik + Owner: Neutral + Location: 21,48 + Actor866: brik + Owner: Neutral + Location: 21,50 + Actor867: brik + Owner: Neutral + Location: 21,49 + Actor868: brik + Owner: Neutral + Location: 21,51 + Actor869: brik + Owner: Neutral + Location: 21,52 + Actor870: brik + Owner: Neutral + Location: 14,50 + Actor871: brik + Owner: Neutral + Location: 14,49 + Actor872: brik + Owner: Neutral + Location: 13,49 + Actor873: brik + Owner: Neutral + Location: 13,48 + Actor874: brik + Owner: Neutral + Location: 13,47 + Actor875: brik + Owner: Neutral + Location: 13,46 + Actor876: brik + Owner: Neutral + Location: 13,45 + Actor877: brik + Owner: Neutral + Location: 13,44 + Actor878: brik + Owner: Neutral + Location: 14,44 + Actor879: brik + Owner: Neutral + Location: 14,43 + Actor880: brik + Owner: Neutral + Location: 14,42 + Actor881: brik + Owner: Neutral + Location: 14,41 + Actor882: brik + Owner: Neutral + Location: 15,50 + Actor883: brik + Owner: Neutral + Location: 16,50 + Actor884: brik + Owner: Neutral + Location: 17,50 + Actor885: brik + Owner: Neutral + Location: 18,50 + Actor886: brik + Owner: Neutral + Location: 6,49 + Actor887: brik + Owner: Neutral + Location: 7,49 + Actor888: brik + Owner: Neutral + Location: 8,49 + Actor889: brik + Owner: Neutral + Location: 9,49 + Actor890: brik + Owner: Neutral + Location: 9,48 + Actor891: brik + Owner: Neutral + Location: 9,47 + Actor892: brik + Owner: Neutral + Location: 9,46 + Actor893: brik + Owner: Neutral + Location: 9,45 + Actor894: brik + Owner: Neutral + Location: 9,44 + Actor895: brik + Owner: Neutral + Location: 8,44 + Actor896: brik + Owner: Neutral + Location: 6,44 + Actor897: brik + Owner: Neutral + Location: 7,44 + Actor898: brik + Owner: Neutral + Location: 5,44 + Actor899: brik + Owner: Neutral + Location: 4,44 + Actor900: brik + Owner: Neutral + Location: 3,44 + Actor901: brik + Owner: Neutral + Location: 10,35 + Actor902: brik + Owner: Neutral + Location: 8,35 + Actor903: brik + Owner: Neutral + Location: 9,35 + Actor904: brik + Owner: Neutral + Location: 7,35 + Actor905: brik + Owner: Neutral + Location: 5,35 + Actor906: brik + Owner: Neutral + Location: 6,35 + Actor907: brik + Owner: Neutral + Location: 4,35 + Actor908: brik + Owner: Neutral + Location: 3,35 + Actor909: brik + Owner: Neutral + Location: 10,34 + Actor910: brik + Owner: Neutral + Location: 10,33 + Actor911: brik + Owner: Neutral + Location: 10,32 + Actor912: brik + Owner: Neutral + Location: 10,31 + Actor913: brik + Owner: Neutral + Location: 10,30 + Actor914: brik + Owner: Neutral + Location: 10,29 + Actor915: brik + Owner: Neutral + Location: 10,25 + Actor916: brik + Owner: Neutral + Location: 10,26 + Actor917: brik + Owner: Neutral + Location: 10,27 + Actor918: brik + Owner: Neutral + Location: 10,28 + Actor919: brik + Owner: Neutral + Location: 9,25 + Actor920: brik + Owner: Neutral + Location: 8,25 + Actor921: brik + Owner: Neutral + Location: 7,25 + Actor922: brik + Owner: Neutral + Location: 7,26 + Actor923: brik + Owner: Neutral + Location: 7,27 + Actor924: brik + Owner: Neutral + Location: 6,28 + Actor925: brik + Owner: Neutral + Location: 7,28 + Actor926: brik + Owner: Neutral + Location: 6,18 + Actor927: brik + Owner: Neutral + Location: 6,17 + Actor928: brik + Owner: Neutral + Location: 6,16 + Actor929: brik + Owner: Neutral + Location: 6,15 + Actor930: brik + Owner: Neutral + Location: 7,18 + Actor931: brik + Owner: Neutral + Location: 8,18 + Actor932: brik + Owner: Neutral + Location: 8,19 + Actor933: brik + Owner: Neutral + Location: 8,20 + Actor934: brik + Owner: Neutral + Location: 9,21 + Actor935: brik + Owner: Neutral + Location: 8,21 + Actor936: brik + Owner: Neutral + Location: 10,21 + Actor937: brik + Owner: Neutral + Location: 11,21 + Actor938: brik + Owner: Neutral + Location: 12,21 + Actor939: brik + Owner: Neutral + Location: 13,21 + Actor940: brik + Owner: Neutral + Location: 5,28 + Actor941: brik + Owner: Neutral + Location: 4,28 + Actor942: brik + Owner: Neutral + Location: 3,28 + Actor943: brik + Owner: Neutral + Location: 3,18 + Actor944: brik + Owner: Neutral + Location: 3,17 + Actor945: brik + Owner: Neutral + Location: 3,16 + Actor946: brik + Owner: Neutral + Location: 3,15 + Actor947: brik + Owner: Neutral + Location: 1,15 + Actor948: brik + Owner: Neutral + Location: 2,15 + Actor949: brik + Owner: Neutral + Location: 2,18 + Actor950: brik + Owner: Neutral + Location: 1,18 + Actor951: brik + Owner: Neutral + Location: 7,15 + Actor952: brik + Owner: Neutral + Location: 8,15 + Actor953: brik + Owner: Neutral + Location: 9,15 + Actor954: brik + Owner: Neutral + Location: 10,15 + Actor955: brik + Owner: Neutral + Location: 10,16 + Actor956: brik + Owner: Neutral + Location: 10,17 + Actor957: brik + Owner: Neutral + Location: 11,18 + Actor958: brik + Owner: Neutral + Location: 10,18 + Actor959: brik + Owner: Neutral + Location: 12,18 + Actor960: brik + Owner: Neutral + Location: 14,18 + Actor961: brik + Owner: Neutral + Location: 15,18 + Actor962: brik + Owner: Neutral + Location: 16,18 + Actor963: brik + Owner: Neutral + Location: 13,18 + Actor964: brik + Owner: Neutral + Location: 16,17 + Actor965: brik + Owner: Neutral + Location: 16,16 + Actor966: brik + Owner: Neutral + Location: 16,14 + Actor967: brik + Owner: Neutral + Location: 16,13 + Actor968: brik + Owner: Neutral + Location: 16,12 + Actor969: brik + Owner: Neutral + Location: 16,11 + Actor970: brik + Owner: Neutral + Location: 16,15 + Actor971: brik + Owner: Neutral + Location: 17,11 + Actor972: brik + Owner: Neutral + Location: 18,11 + Actor973: brik + Owner: Neutral + Location: 18,12 + Actor974: brik + Owner: Neutral + Location: 18,13 + Actor975: brik + Owner: Neutral + Location: 18,14 + Actor976: brik + Owner: Neutral + Location: 18,15 + Actor977: brik + Owner: Neutral + Location: 18,16 + Actor978: brik + Owner: Neutral + Location: 18,17 + Actor979: brik + Owner: Neutral + Location: 18,18 + Actor980: brik + Owner: Neutral + Location: 18,19 + Actor981: brik + Owner: Neutral + Location: 18,20 + Actor982: brik + Owner: Neutral + Location: 21,20 + Actor983: brik + Owner: Neutral + Location: 21,19 + Actor984: brik + Owner: Neutral + Location: 21,18 + Actor985: brik + Owner: Neutral + Location: 22,18 + Actor986: brik + Owner: Neutral + Location: 24,18 + Actor987: brik + Owner: Neutral + Location: 25,18 + Actor988: brik + Owner: Neutral + Location: 23,18 + Actor989: brik + Owner: Neutral + Location: 26,18 + Actor990: brik + Owner: Neutral + Location: 27,18 + Actor991: brik + Owner: Neutral + Location: 28,18 + Actor992: brik + Owner: Neutral + Location: 29,18 + Actor993: brik + Owner: Neutral + Location: 29,17 + Actor994: brik + Owner: Neutral + Location: 29,16 + Actor995: brik + Owner: Neutral + Location: 29,14 + Actor996: brik + Owner: Neutral + Location: 29,15 + Actor997: brik + Owner: Neutral + Location: 29,13 + Actor998: brik + Owner: Neutral + Location: 29,12 + Actor999: brik + Owner: Neutral + Location: 29,11 + Actor1000: brik + Owner: Neutral + Location: 31,11 + Actor1001: brik + Owner: Neutral + Location: 30,11 + Actor1002: brik + Owner: Neutral + Location: 32,11 + Actor1003: brik + Owner: Neutral + Location: 32,12 + Actor1004: brik + Owner: Neutral + Location: 32,13 + Actor1005: brik + Owner: Neutral + Location: 32,14 + Actor1006: brik + Owner: Neutral + Location: 32,15 + Actor1007: brik + Owner: Neutral + Location: 32,16 + Actor1008: brik + Owner: Neutral + Location: 32,17 + Actor1009: brik + Owner: Neutral + Location: 32,18 + Actor1010: brik + Owner: Neutral + Location: 33,18 + Actor1011: brik + Owner: Neutral + Location: 34,18 + Actor1012: brik + Owner: Neutral + Location: 35,18 + Actor1013: brik + Owner: Neutral + Location: 36,18 + Actor1014: brik + Owner: Neutral + Location: 36,17 + Actor1015: brik + Owner: Neutral + Location: 37,17 + Actor1016: brik + Owner: Neutral + Location: 38,17 + Actor1017: brik + Owner: Neutral + Location: 39,17 + Actor1018: brik + Owner: Neutral + Location: 39,18 + Actor1019: brik + Owner: Neutral + Location: 39,19 + Actor1020: brik + Owner: Neutral + Location: 39,20 + Actor1021: brik + Owner: Neutral + Location: 39,21 + Actor1022: brik + Owner: Neutral + Location: 39,22 + Actor1023: brik + Owner: Neutral + Location: 39,23 + Actor1024: brik + Owner: Neutral + Location: 39,24 + Actor1025: brik + Owner: Neutral + Location: 38,24 + Actor1026: brik + Owner: Neutral + Location: 37,24 + Actor1027: brik + Owner: Neutral + Location: 36,24 + Actor1028: brik + Owner: Neutral + Location: 35,24 + Actor1029: brik + Owner: Neutral + Location: 35,27 + Actor1030: brik + Owner: Neutral + Location: 33,27 + Actor1031: brik + Owner: Neutral + Location: 32,27 + Actor1032: brik + Owner: Neutral + Location: 32,26 + Actor1033: brik + Owner: Neutral + Location: 32,25 + Actor1034: brik + Owner: Neutral + Location: 32,24 + Actor1035: brik + Owner: Neutral + Location: 34,27 + Actor1036: brik + Owner: Neutral + Location: 35,26 + Actor1037: brik + Owner: Neutral + Location: 35,25 + Actor1038: brik + Owner: Neutral + Location: 36,12 + Actor1039: brik + Owner: Neutral + Location: 36,13 + Actor1040: brik + Owner: Neutral + Location: 36,11 + Actor1041: brik + Owner: Neutral + Location: 36,10 + Actor1042: brik + Owner: Neutral + Location: 36,9 + Actor1043: brik + Owner: Neutral + Location: 36,8 + Actor1044: brik + Owner: Neutral + Location: 36,7 + Actor1045: brik + Owner: Neutral + Location: 34,7 + Actor1046: brik + Owner: Neutral + Location: 35,7 + Actor1047: brik + Owner: Neutral + Location: 37,13 + Actor1048: brik + Owner: Neutral + Location: 38,13 + Actor1049: brik + Owner: Neutral + Location: 39,13 + Actor1050: brik + Owner: Neutral + Location: 40,13 + Actor1051: brik + Owner: Neutral + Location: 41,13 + Actor1052: brik + Owner: Neutral + Location: 42,13 + Actor1053: brik + Owner: Neutral + Location: 43,13 + Actor1054: brik + Owner: Neutral + Location: 29,7 + Actor1055: brik + Owner: Neutral + Location: 29,5 + Actor1056: brik + Owner: Neutral + Location: 29,6 + Actor1057: brik + Owner: Neutral + Location: 29,4 + Actor1058: brik + Owner: Neutral + Location: 30,7 + Actor1059: brik + Owner: Neutral + Location: 31,7 + Actor1060: brik + Owner: Neutral + Location: 32,7 + Actor1061: brik + Owner: Neutral + Location: 33,7 + Actor1062: brik + Owner: Neutral + Location: 23,6 + Actor1063: brik + Owner: Neutral + Location: 24,6 + Actor1064: brik + Owner: Neutral + Location: 25,6 + Actor1065: brik + Owner: Neutral + Location: 25,7 + Actor1066: brik + Owner: Neutral + Location: 25,8 + Actor1067: brik + Owner: Neutral + Location: 25,9 + Actor1068: brik + Owner: Neutral + Location: 25,10 + Actor1069: brik + Owner: Neutral + Location: 25,11 + Actor1070: brik + Owner: Neutral + Location: 25,12 + Actor1071: brik + Owner: Neutral + Location: 25,13 + Actor1072: brik + Owner: Neutral + Location: 24,13 + Actor1073: brik + Owner: Neutral + Location: 23,13 + Actor1074: brik + Owner: Neutral + Location: 23,12 + Actor1075: brik + Owner: Neutral + Location: 23,11 + Actor1076: brik + Owner: Neutral + Location: 23,10 + Actor1077: brik + Owner: Neutral + Location: 23,9 + Actor1078: brik + Owner: Neutral + Location: 23,8 + Actor1079: brik + Owner: Neutral + Location: 23,7 + Actor1080: brik + Owner: Neutral + Location: 16,5 + Actor1081: brik + Owner: Neutral + Location: 17,5 + Actor1082: brik + Owner: Neutral + Location: 18,5 + Actor1083: brik + Owner: Neutral + Location: 18,4 + Actor1084: brik + Owner: Neutral + Location: 18,3 + Actor1085: brik + Owner: Neutral + Location: 18,2 + Actor1086: brik + Owner: Neutral + Location: 18,1 + Actor1087: brik + Owner: Neutral + Location: 16,4 + Actor1088: brik + Owner: Neutral + Location: 16,3 + Actor1089: brik + Owner: Neutral + Location: 16,2 + Actor1090: brik + Owner: Neutral + Location: 16,1 + Actor1091: brik + Owner: Neutral + Location: 9,8 + Actor1092: brik + Owner: Neutral + Location: 8,9 + Actor1093: brik + Owner: Neutral + Location: 9,9 + Actor1094: brik + Owner: Neutral + Location: 8,8 + Actor1095: brik + Owner: Neutral + Location: 8,7 + Actor1096: brik + Owner: Neutral + Location: 9,7 + Actor1097: brik + Owner: Neutral + Location: 8,6 + Actor1098: brik + Owner: Neutral + Location: 9,6 + Actor1099: brik + Owner: Neutral + Location: 1,14 + Actor1100: brik + Owner: Neutral + Location: 1,13 + Actor1101: brik + Owner: Neutral + Location: 14,21 + Actor1102: brik + Owner: Neutral + Location: 14,26 + Actor1103: brik + Owner: Neutral + Location: 14,24 + Actor1104: brik + Owner: Neutral + Location: 14,22 + Actor1105: brik + Owner: Neutral + Location: 14,23 + Actor1106: brik + Owner: Neutral + Location: 14,25 + Actor1107: brik + Owner: Neutral + Location: 26,92 + Actor1108: brik + Owner: Neutral + Location: 26,91 + Actor1109: brik + Owner: Neutral + Location: 26,90 + Actor1110: brik + Owner: Neutral + Location: 26,89 + Actor1111: brik + Owner: Neutral + Location: 26,88 + Actor1112: brik + Owner: Neutral + Location: 28,88 + Actor1113: brik + Owner: Neutral + Location: 27,88 + Actor1114: brik + Owner: Neutral + Location: 29,88 + Actor1115: brik + Owner: Neutral + Location: 29,87 + Actor1116: brik + Owner: Neutral + Location: 29,86 + Actor1117: brik + Owner: Neutral + Location: 29,85 + Actor1118: brik + Owner: Neutral + Location: 27,92 + Actor1119: brik + Owner: Neutral + Location: 28,92 + Actor1120: brik + Owner: Neutral + Location: 29,92 + Actor1121: brik + Owner: Neutral + Location: 29,91 + Actor1122: brik + Owner: Neutral + Location: 29,90 + Actor1123: brik + Owner: Neutral + Location: 30,90 + Actor1124: brik + Owner: Neutral + Location: 32,90 + Actor1125: brik + Owner: Neutral + Location: 32,89 + Actor1126: brik + Owner: Neutral + Location: 31,90 + Actor1127: brik + Owner: Neutral + Location: 32,88 + Actor1128: brik + Owner: Neutral + Location: 32,86 + Actor1129: brik + Owner: Neutral + Location: 32,87 + Actor1130: brik + Owner: Neutral + Location: 26,95 + Actor1131: brik + Owner: Neutral + Location: 28,95 + Actor1132: brik + Owner: Neutral + Location: 29,95 + Actor1133: brik + Owner: Neutral + Location: 27,95 + Actor1134: brik + Owner: Neutral + Location: 26,96 + Actor1135: brik + Owner: Neutral + Location: 29,96 + Actor1136: brik + Owner: Neutral + Location: 30,96 + Actor1137: brik + Owner: Neutral + Location: 25,96 + Actor1138: brik + Owner: Neutral + Location: 15,92 + Actor1139: brik + Owner: Neutral + Location: 16,92 + Actor1140: brik + Owner: Neutral + Location: 18,92 + Actor1141: brik + Owner: Neutral + Location: 17,92 + Actor1142: brik + Owner: Neutral + Location: 15,91 + Actor1143: brik + Owner: Neutral + Location: 15,90 + Actor1144: brik + Owner: Neutral + Location: 15,89 + Actor1145: brik + Owner: Neutral + Location: 15,88 + Actor1146: brik + Owner: Neutral + Location: 16,88 + Actor1147: brik + Owner: Neutral + Location: 18,88 + Actor1148: brik + Owner: Neutral + Location: 17,88 + Actor1149: brik + Owner: Neutral + Location: 18,87 + Actor1150: brik + Owner: Neutral + Location: 18,86 + Actor1151: brik + Owner: Neutral + Location: 18,85 + Actor1152: brik + Owner: Neutral + Location: 18,84 + Actor1153: brik + Owner: Neutral + Location: 18,83 + Actor1154: brik + Owner: Neutral + Location: 18,82 + Actor1155: brik + Owner: Neutral + Location: 18,91 + Actor1156: brik + Owner: Neutral + Location: 18,90 + Actor1157: brik + Owner: Neutral + Location: 20,90 + Actor1158: brik + Owner: Neutral + Location: 19,90 + Actor1159: brik + Owner: Neutral + Location: 21,90 + Actor1160: brik + Owner: Neutral + Location: 22,90 + Actor1161: brik + Owner: Neutral + Location: 22,89 + Actor1162: brik + Owner: Neutral + Location: 22,88 + Actor1163: brik + Owner: Neutral + Location: 22,87 + Actor1164: brik + Owner: Neutral + Location: 22,86 + Actor1165: brik + Owner: Neutral + Location: 15,95 + Actor1166: brik + Owner: Neutral + Location: 16,95 + Actor1167: brik + Owner: Neutral + Location: 17,95 + Actor1168: brik + Owner: Neutral + Location: 18,95 + Actor1169: brik + Owner: Neutral + Location: 18,96 + Actor1170: brik + Owner: Neutral + Location: 15,96 + Actor1171: brik + Owner: Neutral + Location: 19,96 + Actor1172: brik + Owner: Neutral + Location: 13,96 + Actor1173: brik + Owner: Neutral + Location: 14,96 + Actor1174: brik + Owner: Neutral + Location: 5,82 + Actor1175: brik + Owner: Neutral + Location: 5,81 + Actor1176: brik + Owner: Neutral + Location: 5,80 + Actor1177: brik + Owner: Neutral + Location: 5,79 + Actor1178: brik + Owner: Neutral + Location: 5,78 + Actor1179: brik + Owner: Neutral + Location: 5,77 + Actor1180: brik + Owner: Neutral + Location: 6,77 + Actor1181: brik + Owner: Neutral + Location: 7,77 + Actor1182: brik + Owner: Neutral + Location: 6,82 + Actor1183: brik + Owner: Neutral + Location: 7,82 + Actor1184: brik + Owner: Neutral + Location: 8,82 + Actor1185: brik + Owner: Neutral + Location: 9,82 + Actor1186: brik + Owner: Neutral + Location: 10,82 + Actor1187: brik + Owner: Neutral + Location: 12,82 + Actor1188: brik + Owner: Neutral + Location: 11,82 + Actor1189: brik + Owner: Neutral + Location: 7,76 + Actor1190: brik + Owner: Neutral + Location: 7,75 + Actor1191: brik + Owner: Neutral + Location: 7,74 + Actor1192: brik + Owner: Neutral + Location: 9,74 + Actor1193: brik + Owner: Neutral + Location: 10,74 + Actor1194: brik + Owner: Neutral + Location: 8,74 + Actor1195: brik + Owner: Neutral + Location: 10,75 + Actor1196: brik + Owner: Neutral + Location: 10,76 + Actor1197: brik + Owner: Neutral + Location: 10,77 + Actor1198: brik + Owner: Neutral + Location: 10,78 + Actor1199: brik + Owner: Neutral + Location: 12,78 + Actor1200: brik + Owner: Neutral + Location: 11,78 + Actor1201: brik + Owner: Neutral + Location: 13,78 + Actor1202: brik + Owner: Neutral + Location: 14,78 + Actor1203: brik + Owner: Neutral + Location: 15,78 + Actor1204: brik + Owner: Neutral + Location: 7,69 + Actor1205: brik + Owner: Neutral + Location: 7,68 + Actor1206: brik + Owner: Neutral + Location: 7,67 + Actor1207: brik + Owner: Neutral + Location: 6,67 + Actor1208: brik + Owner: Neutral + Location: 7,70 + Actor1209: brik + Owner: Neutral + Location: 9,70 + Actor1210: brik + Owner: Neutral + Location: 8,70 + Actor1211: brik + Owner: Neutral + Location: 10,70 + Actor1212: brik + Owner: Neutral + Location: 11,70 + Actor1213: brik + Owner: Neutral + Location: 12,70 + Actor1214: brik + Owner: Neutral + Location: 13,70 + Actor1215: brik + Owner: Neutral + Location: 14,70 + Actor1216: brik + Owner: Neutral + Location: 14,71 + Actor1217: brik + Owner: Neutral + Location: 14,72 + Actor1218: brik + Owner: Neutral + Location: 14,73 + Actor1219: brik + Owner: Neutral + Location: 15,73 + Actor1220: brik + Owner: Neutral + Location: 16,73 + Actor1221: brik + Owner: Neutral + Location: 17,73 + Actor1222: brik + Owner: Neutral + Location: 18,73 + Actor1223: brik + Owner: Neutral + Location: 18,72 + Actor1224: brik + Owner: Neutral + Location: 18,71 + Actor1225: brik + Owner: Neutral + Location: 18,70 + Actor1226: brik + Owner: Neutral + Location: 18,69 + Actor1227: brik + Owner: Neutral + Location: 18,68 + Actor1228: brik + Owner: Neutral + Location: 18,67 + Actor1229: brik + Owner: Neutral + Location: 18,66 + Actor1230: brik + Owner: Neutral + Location: 18,65 + Actor1231: brik + Owner: Neutral + Location: 18,64 + Actor1232: brik + Owner: Neutral + Location: 18,63 + Actor1233: brik + Owner: Neutral + Location: 18,62 + Actor1234: brik + Owner: Neutral + Location: 17,62 + Actor1235: brik + Owner: Neutral + Location: 15,62 + Actor1236: brik + Owner: Neutral + Location: 14,62 + Actor1237: brik + Owner: Neutral + Location: 16,62 + Actor1238: brik + Owner: Neutral + Location: 14,63 + Actor1239: brik + Owner: Neutral + Location: 14,64 + Actor1240: brik + Owner: Neutral + Location: 12,64 + Actor1241: brik + Owner: Neutral + Location: 13,64 + Actor1242: brik + Owner: Neutral + Location: 11,64 + Actor1243: brik + Owner: Neutral + Location: 14,58 + Actor1244: brik + Owner: Neutral + Location: 14,57 + Actor1245: brik + Owner: Neutral + Location: 14,56 + Actor1246: brik + Owner: Neutral + Location: 9,56 + Actor1247: brik + Owner: Neutral + Location: 10,56 + Actor1248: brik + Owner: Neutral + Location: 12,56 + Actor1249: brik + Owner: Neutral + Location: 11,56 + Actor1250: brik + Owner: Neutral + Location: 13,56 + Actor1251: brik + Owner: Neutral + Location: 9,55 + Actor1252: brik + Owner: Neutral + Location: 10,55 + Actor1253: brik + Owner: Neutral + Location: 11,55 + Actor1254: brik + Owner: Neutral + Location: 12,55 + Actor1255: brik + Owner: Neutral + Location: 13,55 + Actor1256: brik + Owner: Neutral + Location: 14,55 + Actor1257: brik + Owner: Neutral + Location: 14,54 + Actor1258: brik + Owner: Neutral + Location: 15,54 + Actor1259: brik + Owner: Neutral + Location: 16,54 + Actor1260: brik + Owner: Neutral + Location: 17,54 + Actor1261: brik + Owner: Neutral + Location: 18,54 + Actor1262: brik + Owner: Neutral + Location: 18,54 + Actor1263: brik + Owner: Neutral + Location: 20,54 + Actor1264: brik + Owner: Neutral + Location: 19,54 + Actor1265: brik + Owner: Neutral + Location: 15,58 + Actor1266: brik + Owner: Neutral + Location: 16,58 + Actor1267: brik + Owner: Neutral + Location: 17,58 + Actor1268: brik + Owner: Neutral + Location: 18,58 + Actor1269: brik + Owner: Neutral + Location: 19,58 + Actor1270: brik + Owner: Neutral + Location: 20,58 + Actor1271: brik + Owner: Neutral + Location: 21,58 + Actor1272: brik + Owner: Neutral + Location: 23,67 + Actor1273: brik + Owner: Neutral + Location: 23,68 + Actor1274: brik + Owner: Neutral + Location: 23,69 + Actor1275: brik + Owner: Neutral + Location: 24,69 + Actor1276: brik + Owner: Neutral + Location: 26,69 + Actor1277: brik + Owner: Neutral + Location: 25,69 + Actor1278: brik + Owner: Neutral + Location: 27,69 + Actor1279: brik + Owner: Neutral + Location: 27,68 + Actor1280: brik + Owner: Neutral + Location: 27,67 + Actor1281: brik + Owner: Neutral + Location: 24,67 + Actor1282: brik + Owner: Neutral + Location: 25,67 + Actor1283: brik + Owner: Neutral + Location: 26,67 + Actor1284: brik + Owner: Neutral + Location: 42,82 + Actor1285: brik + Owner: Neutral + Location: 42,83 + Actor1286: brik + Owner: Neutral + Location: 41,83 + Actor1287: brik + Owner: Neutral + Location: 40,83 + Actor1288: brik + Owner: Neutral + Location: 43,82 + Actor1289: brik + Owner: Neutral + Location: 55,82 + Actor1290: brik + Owner: Neutral + Location: 56,82 + Actor1291: brik + Owner: Neutral + Location: 54,82 + Actor1292: brik + Owner: Neutral + Location: 56,83 + Actor1293: brik + Owner: Neutral + Location: 57,83 + Actor1294: brik + Owner: Neutral + Location: 58,83 + Actor1296: brik + Owner: Neutral + Location: 84,82 + Actor1297: brik + Owner: Neutral + Location: 83,82 + Actor1298: brik + Owner: Neutral + Location: 82,82 + Actor1299: brik + Owner: Neutral + Location: 84,81 + Actor1300: brik + Owner: Neutral + Location: 84,80 + Actor1301: brik + Owner: Neutral + Location: 84,79 + Actor1302: brik + Owner: Neutral + Location: 84,78 + Actor1303: brik + Owner: Neutral + Location: 84,77 + Actor1304: brik + Owner: Neutral + Location: 84,76 + Actor1305: brik + Owner: Neutral + Location: 84,75 + Actor1306: brik + Owner: Neutral + Location: 84,74 + Actor1307: brik + Owner: Neutral + Location: 83,74 + Actor1308: brik + Owner: Neutral + Location: 82,74 + Actor1309: brik + Owner: Neutral + Location: 87,74 + Actor1310: brik + Owner: Neutral + Location: 88,74 + Actor1311: brik + Owner: Neutral + Location: 86,74 + Actor1312: brik + Owner: Neutral + Location: 86,75 + Actor1313: brik + Owner: Neutral + Location: 86,76 + Actor1314: brik + Owner: Neutral + Location: 86,77 + Actor1315: brik + Owner: Neutral + Location: 86,78 + Actor1316: brik + Owner: Neutral + Location: 86,79 + Actor1317: brik + Owner: Neutral + Location: 86,80 + Actor1318: brik + Owner: Neutral + Location: 86,81 + Actor1319: brik + Owner: Neutral + Location: 86,82 + Actor1320: brik + Owner: Neutral + Location: 87,82 + Actor1321: brik + Owner: Neutral + Location: 88,82 + Actor1322: brik + Owner: Neutral + Location: 89,82 + Actor1323: brik + Owner: Neutral + Location: 90,82 + Actor1324: brik + Owner: Neutral + Location: 90,81 + Actor1325: brik + Owner: Neutral + Location: 90,80 + Actor1326: brik + Owner: Neutral + Location: 90,79 + Actor1327: brik + Owner: Neutral + Location: 90,78 + Actor1328: brik + Owner: Neutral + Location: 90,77 + Actor1329: brik + Owner: Neutral + Location: 90,76 + Actor1330: brik + Owner: Neutral + Location: 90,75 + Actor1331: brik + Owner: Neutral + Location: 90,74 + Actor1332: brik + Owner: Neutral + Location: 94,79 + Actor1333: brik + Owner: Neutral + Location: 95,79 + Actor1334: brik + Owner: Neutral + Location: 96,79 + Actor1335: brik + Owner: Neutral + Location: 94,80 + Actor1336: brik + Owner: Neutral + Location: 94,81 + Actor1337: brik + Owner: Neutral + Location: 94,82 + Actor1338: brik + Owner: Neutral + Location: 95,82 + Actor1339: brik + Owner: Neutral + Location: 96,82 + Actor1340: brik + Owner: Neutral + Location: 96,78 + Actor1341: brik + Owner: Neutral + Location: 96,77 + Actor1342: brik + Owner: Neutral + Location: 96,75 + Actor1343: brik + Owner: Neutral + Location: 96,76 + Actor1344: brik + Owner: Neutral + Location: 96,74 + Actor1345: brik + Owner: Neutral + Location: 90,73 + Actor1346: brik + Owner: Neutral + Location: 90,72 + Actor1347: brik + Owner: Neutral + Location: 90,71 + Actor1348: brik + Owner: Neutral + Location: 88,71 + Actor1349: brik + Owner: Neutral + Location: 89,71 + Actor1350: brik + Owner: Neutral + Location: 88,72 + Actor1351: brik + Owner: Neutral + Location: 88,73 + Actor1352: brik + Owner: Neutral + Location: 82,73 + Actor1353: brik + Owner: Neutral + Location: 88,67 + Actor1354: brik + Owner: Neutral + Location: 88,66 + Actor1355: brik + Owner: Neutral + Location: 88,65 + Actor1356: brik + Owner: Neutral + Location: 88,64 + Actor1357: brik + Owner: Neutral + Location: 89,67 + Actor1358: brik + Owner: Neutral + Location: 90,67 + Actor1359: brik + Owner: Neutral + Location: 90,66 + Actor1360: brik + Owner: Neutral + Location: 90,65 + Actor1361: brik + Owner: Neutral + Location: 90,64 + Actor1362: brik + Owner: Neutral + Location: 90,62 + Actor1363: brik + Owner: Neutral + Location: 90,61 + Actor1364: brik + Owner: Neutral + Location: 90,63 + Actor1365: brik + Owner: Neutral + Location: 89,61 + Actor1366: brik + Owner: Neutral + Location: 88,61 + Actor1367: brik + Owner: Neutral + Location: 87,61 + Actor1368: brik + Owner: Neutral + Location: 87,61 + Actor1369: brik + Owner: Neutral + Location: 86,61 + Actor1370: brik + Owner: Neutral + Location: 85,61 + Actor1371: brik + Owner: Neutral + Location: 84,61 + Actor1372: brik + Owner: Neutral + Location: 82,61 + Actor1373: brik + Owner: Neutral + Location: 83,61 + Actor1374: brik + Owner: Neutral + Location: 82,52 + Actor1375: brik + Owner: Neutral + Location: 83,52 + Actor1376: brik + Owner: Neutral + Location: 83,51 + Actor1377: brik + Owner: Neutral + Location: 83,50 + Actor1378: brik + Owner: Neutral + Location: 82,50 + Actor1379: brik + Owner: Neutral + Location: 87,50 + Actor1380: brik + Owner: Neutral + Location: 87,51 + Actor1381: brik + Owner: Neutral + Location: 87,52 + Actor1382: brik + Owner: Neutral + Location: 88,52 + Actor1383: brik + Owner: Neutral + Location: 89,52 + Actor1384: brik + Owner: Neutral + Location: 90,52 + Actor1385: brik + Owner: Neutral + Location: 91,52 + Actor1386: brik + Owner: Neutral + Location: 92,52 + Actor1387: brik + Owner: Neutral + Location: 93,52 + Actor1388: brik + Owner: Neutral + Location: 94,52 + Actor1389: brik + Owner: Neutral + Location: 95,52 + Actor1390: brik + Owner: Neutral + Location: 87,46 + Actor1391: brik + Owner: Neutral + Location: 89,46 + Actor1392: brik + Owner: Neutral + Location: 90,46 + Actor1393: brik + Owner: Neutral + Location: 88,46 + Actor1394: brik + Owner: Neutral + Location: 87,47 + Actor1395: brik + Owner: Neutral + Location: 87,48 + Actor1396: brik + Owner: Neutral + Location: 87,49 + Actor1397: brik + Owner: Neutral + Location: 90,47 + Actor1398: brik + Owner: Neutral + Location: 90,48 + Actor1399: brik + Owner: Neutral + Location: 90,49 + Actor1400: brik + Owner: Neutral + Location: 91,49 + Actor1401: brik + Owner: Neutral + Location: 92,49 + Actor1402: brik + Owner: Neutral + Location: 93,49 + Actor1403: brik + Owner: Neutral + Location: 90,42 + Actor1404: brik + Owner: Neutral + Location: 89,42 + Actor1405: brik + Owner: Neutral + Location: 88,42 + Actor1406: brik + Owner: Neutral + Location: 87,42 + Actor1407: brik + Owner: Neutral + Location: 87,37 + Actor1408: brik + Owner: Neutral + Location: 87,38 + Actor1409: brik + Owner: Neutral + Location: 87,39 + Actor1410: brik + Owner: Neutral + Location: 87,40 + Actor1411: brik + Owner: Neutral + Location: 87,41 + Actor1412: brik + Owner: Neutral + Location: 90,41 + Actor1413: brik + Owner: Neutral + Location: 90,40 + Actor1414: brik + Owner: Neutral + Location: 90,39 + Actor1415: brik + Owner: Neutral + Location: 90,39 + Actor1416: brik + Owner: Neutral + Location: 92,39 + Actor1417: brik + Owner: Neutral + Location: 91,39 + Actor1418: brik + Owner: Neutral + Location: 93,39 + Actor1419: brik + Owner: Neutral + Location: 76,46 + Actor1420: brik + Owner: Neutral + Location: 76,47 + Actor1421: brik + Owner: Neutral + Location: 77,47 + Actor1422: brik + Owner: Neutral + Location: 77,46 + Actor1423: brik + Owner: Neutral + Location: 78,46 + Actor1424: brik + Owner: Neutral + Location: 78,47 + Actor1425: brik + Owner: Neutral + Location: 79,47 + Actor1426: brik + Owner: Neutral + Location: 80,47 + Actor1427: brik + Owner: Neutral + Location: 81,47 + Actor1428: brik + Owner: Neutral + Location: 82,47 + Actor1429: brik + Owner: Neutral + Location: 83,47 + Actor1430: brik + Owner: Neutral + Location: 83,46 + Actor1431: brik + Owner: Neutral + Location: 83,45 + Actor1432: brik + Owner: Neutral + Location: 83,44 + Actor1433: brik + Owner: Neutral + Location: 83,43 + Actor1434: brik + Owner: Neutral + Location: 83,42 + Actor1435: brik + Owner: Neutral + Location: 83,41 + Actor1436: brik + Owner: Neutral + Location: 83,40 + Actor1437: brik + Owner: Neutral + Location: 78,40 + Actor1442: brik + Owner: Neutral + Location: 78,41 + Actor1443: brik + Owner: Neutral + Location: 78,42 + Actor1444: brik + Owner: Neutral + Location: 78,43 + Actor1445: brik + Owner: Neutral + Location: 78,44 + Actor1446: brik + Owner: Neutral + Location: 78,45 + Actor1438: brik + Owner: Neutral + Location: 79,40 + Actor1439: brik + Owner: Neutral + Location: 80,40 + Actor1440: brik + Owner: Neutral + Location: 81,40 + Actor1441: brik + Owner: Neutral + Location: 82,40 + Actor1447: brik + Owner: Neutral + Location: 71,46 + Actor1448: brik + Owner: Neutral + Location: 72,46 + Actor1449: brik + Owner: Neutral + Location: 73,46 + Actor1450: brik + Owner: Neutral + Location: 73,47 + Actor1451: brik + Owner: Neutral + Location: 73,48 + Actor1452: brik + Owner: Neutral + Location: 73,50 + Actor1453: brik + Owner: Neutral + Location: 73,49 + Actor1454: brik + Owner: Neutral + Location: 74,50 + Actor1455: brik + Owner: Neutral + Location: 70,46 + Actor1456: brik + Owner: Neutral + Location: 69,46 + Actor1457: brik + Owner: Neutral + Location: 69,45 + Actor1458: brik + Owner: Neutral + Location: 71,30 + Actor1459: brik + Owner: Neutral + Location: 70,30 + Actor1460: brik + Owner: Neutral + Location: 69,30 + Actor1461: brik + Owner: Neutral + Location: 67,30 + Actor1462: brik + Owner: Neutral + Location: 67,29 + Actor1463: brik + Owner: Neutral + Location: 69,29 + Actor1464: brik + Owner: Neutral + Location: 70,29 + Actor1465: brik + Owner: Neutral + Location: 71,29 + Actor1466: brik + Owner: Neutral + Location: 68,29 + Actor1467: brik + Owner: Neutral + Location: 67,31 + Actor1468: brik + Owner: Neutral + Location: 67,32 + Actor1469: brik + Owner: Neutral + Location: 67,33 + Actor1470: brik + Owner: Neutral + Location: 67,34 + Actor1471: brik + Owner: Neutral + Location: 67,35 + Actor1472: brik + Owner: Neutral + Location: 69,34 + Actor1473: brik + Owner: Neutral + Location: 69,33 + Actor1474: brik + Owner: Neutral + Location: 69,32 + Actor1475: brik + Owner: Neutral + Location: 69,31 + Actor1476: brik + Owner: Neutral + Location: 75,28 + Actor1477: brik + Owner: Neutral + Location: 75,29 + Actor1478: brik + Owner: Neutral + Location: 75,30 + Actor1479: brik + Owner: Neutral + Location: 77,30 + Actor1480: brik + Owner: Neutral + Location: 78,30 + Actor1481: brik + Owner: Neutral + Location: 76,30 + Actor1482: brik + Owner: Neutral + Location: 78,29 + Actor1483: brik + Owner: Neutral + Location: 78,28 + Actor1484: brik + Owner: Neutral + Location: 78,27 + Actor1485: brik + Owner: Neutral + Location: 78,26 + Actor1486: brik + Owner: Neutral + Location: 78,25 + Actor1487: brik + Owner: Neutral + Location: 88,37 + Actor1488: brik + Owner: Neutral + Location: 89,37 + Actor1489: brik + Owner: Neutral + Location: 90,37 + Actor1490: brik + Owner: Neutral + Location: 91,37 + Actor1491: brik + Owner: Neutral + Location: 64,30 + Actor1492: brik + Owner: Neutral + Location: 63,30 + Actor1493: brik + Owner: Neutral + Location: 62,30 + Actor1494: brik + Owner: Neutral + Location: 62,29 + Actor1495: brik + Owner: Neutral + Location: 62,28 + Actor1496: brik + Owner: Neutral + Location: 62,27 + Actor1497: brik + Owner: Neutral + Location: 62,26 + Actor1498: brik + Owner: Neutral + Location: 64,25 + Actor1499: brik + Owner: Neutral + Location: 64,26 + Actor1500: brik + Owner: Neutral + Location: 64,28 + Actor1501: brik + Owner: Neutral + Location: 64,27 + Actor1502: brik + Owner: Neutral + Location: 64,29 + Actor1503: brik + Owner: Neutral + Location: 62,25 + Actor1504: brik + Owner: Neutral + Location: 62,24 + Actor1505: brik + Owner: Neutral + Location: 62,23 + Actor1506: brik + Owner: Neutral + Location: 62,22 + Actor1507: brik + Owner: Neutral + Location: 64,22 + Actor1508: brik + Owner: Neutral + Location: 64,23 + Actor1509: brik + Owner: Neutral + Location: 64,24 + Actor1510: brik + Owner: Neutral + Location: 62,21 + Actor1511: brik + Owner: Neutral + Location: 62,20 + Actor1512: brik + Owner: Neutral + Location: 56,20 + Actor1513: brik + Owner: Neutral + Location: 57,20 + Actor1514: brik + Owner: Neutral + Location: 58,20 + Actor1515: brik + Owner: Neutral + Location: 58,21 + Actor1516: brik + Owner: Neutral + Location: 58,22 + Actor1517: brik + Owner: Neutral + Location: 58,24 + Actor1518: brik + Owner: Neutral + Location: 58,23 + Actor1519: brik + Owner: Neutral + Location: 58,25 + Actor1520: brik + Owner: Neutral + Location: 58,26 + Actor1521: brik + Owner: Neutral + Location: 58,27 + Actor1522: brik + Owner: Neutral + Location: 58,28 + Actor1523: brik + Owner: Neutral + Location: 58,29 + Actor1524: brik + Owner: Neutral + Location: 58,30 + Actor1525: brik + Owner: Neutral + Location: 57,30 + Actor1526: brik + Owner: Neutral + Location: 56,30 + Actor1527: brik + Owner: Neutral + Location: 55,30 + Actor1528: brik + Owner: Neutral + Location: 54,30 + Actor1529: brik + Owner: Neutral + Location: 53,30 + Actor1530: brik + Owner: Neutral + Location: 53,31 + Actor1531: brik + Owner: Neutral + Location: 53,16 + Actor1532: brik + Owner: Neutral + Location: 53,15 + Actor1533: brik + Owner: Neutral + Location: 53,14 + Actor1534: brik + Owner: Neutral + Location: 53,13 + Actor1535: brik + Owner: Neutral + Location: 53,12 + Actor1536: brik + Owner: Neutral + Location: 53,11 + Actor1537: brik + Owner: Neutral + Location: 53,11 + Actor1538: brik + Owner: Neutral + Location: 54,16 + Actor1539: brik + Owner: Neutral + Location: 55,16 + Actor1540: brik + Owner: Neutral + Location: 56,16 + Actor1541: brik + Owner: Neutral + Location: 57,16 + Actor1542: brik + Owner: Neutral + Location: 58,16 + Actor1543: brik + Owner: Neutral + Location: 59,16 + Actor1544: brik + Owner: Neutral + Location: 53,10 + Actor1545: brik + Owner: Neutral + Location: 50,20 + Actor1546: brik + Owner: Neutral + Location: 51,20 + Actor1547: brik + Owner: Neutral + Location: 52,20 + Actor1548: brik + Owner: Neutral + Location: 53,20 + Actor1549: brik + Owner: Neutral + Location: 55,20 + Actor1550: brik + Owner: Neutral + Location: 54,20 + Actor1551: brik + Owner: Neutral + Location: 43,24 + Actor1552: brik + Owner: Neutral + Location: 43,23 + Actor1553: brik + Owner: Neutral + Location: 43,22 + Actor1554: brik + Owner: Neutral + Location: 43,20 + Actor1555: brik + Owner: Neutral + Location: 43,19 + Actor1556: brik + Owner: Neutral + Location: 43,18 + Actor1557: brik + Owner: Neutral + Location: 43,21 + Actor1558: brik + Owner: Neutral + Location: 44,24 + Actor1559: brik + Owner: Neutral + Location: 45,24 + Actor1560: brik + Owner: Neutral + Location: 46,24 + Actor1561: brik + Owner: Neutral + Location: 47,24 + Actor1562: brik + Owner: Neutral + Location: 48,24 + Actor1563: brik + Owner: Neutral + Location: 49,24 + Actor1564: brik + Owner: Neutral + Location: 49,37 + Actor1565: brik + Owner: Neutral + Location: 49,36 + Actor1566: brik + Owner: Neutral + Location: 49,35 + Actor1567: brik + Owner: Neutral + Location: 49,34 + Actor1568: brik + Owner: Neutral + Location: 49,33 + Actor1569: brik + Owner: Neutral + Location: 49,32 + Actor1570: brik + Owner: Neutral + Location: 49,31 + Actor1571: brik + Owner: Neutral + Location: 53,32 + Actor1572: brik + Owner: Neutral + Location: 53,33 + Actor1573: brik + Owner: Neutral + Location: 53,34 + Actor1574: brik + Owner: Neutral + Location: 53,35 + Actor1575: brik + Owner: Neutral + Location: 53,36 + Actor1576: brik + Owner: Neutral + Location: 53,37 + Actor1577: brik + Owner: Neutral + Location: 51,37 + Actor1578: brik + Owner: Neutral + Location: 50,37 + Actor1579: brik + Owner: Neutral + Location: 52,37 + Actor1580: brik + Owner: Neutral + Location: 49,43 + Actor1581: brik + Owner: Neutral + Location: 50,43 + Actor1582: brik + Owner: Neutral + Location: 51,43 + Actor1583: brik + Owner: Neutral + Location: 52,43 + Actor1584: brik + Owner: Neutral + Location: 53,43 + Actor1585: brik + Owner: Neutral + Location: 53,44 + Actor1586: brik + Owner: Neutral + Location: 53,45 + Actor1587: brik + Owner: Neutral + Location: 53,46 + Actor1588: brik + Owner: Neutral + Location: 53,47 + Actor1589: brik + Owner: Neutral + Location: 53,48 + Actor1590: brik + Owner: Neutral + Location: 49,44 + Actor1591: brik + Owner: Neutral + Location: 49,45 + Actor1592: brik + Owner: Neutral + Location: 49,46 + Actor1593: brik + Owner: Neutral + Location: 49,47 + Actor1594: brik + Owner: Neutral + Location: 49,48 + Actor1595: brik + Owner: Neutral + Location: 49,49 + Actor1596: brik + Owner: Neutral + Location: 53,49 + Actor1597: brik + Owner: Neutral + Location: 54,49 + Actor1598: brik + Owner: Neutral + Location: 56,49 + Actor1599: brik + Owner: Neutral + Location: 55,49 + Actor1600: brik + Owner: Neutral + Location: 49,52 + Actor1601: brik + Owner: Neutral + Location: 49,51 + Actor1602: brik + Owner: Neutral + Location: 49,50 + Actor1610: brik + Owner: Neutral + Location: 61,6 + Actor1611: brik + Owner: Neutral + Location: 63,6 + Actor1612: brik + Owner: Neutral + Location: 62,6 + Actor1613: brik + Owner: Neutral + Location: 64,6 + Actor1614: brik + Owner: Neutral + Location: 64,7 + Actor1615: brik + Owner: Neutral + Location: 61,7 + Actor1616: brik + Owner: Neutral + Location: 64,8 + Actor1617: brik + Owner: Neutral + Location: 64,9 + Actor1618: brik + Owner: Neutral + Location: 60,7 + Actor1619: brik + Owner: Neutral + Location: 47,5 + Actor1620: brik + Owner: Neutral + Location: 46,5 + Actor1621: brik + Owner: Neutral + Location: 44,5 + Actor1622: brik + Owner: Neutral + Location: 45,5 + Actor1623: brik + Owner: Neutral + Location: 43,5 + Actor1624: brik + Owner: Neutral + Location: 42,5 + Actor1625: brik + Owner: Neutral + Location: 47,6 + Actor1626: brik + Owner: Neutral + Location: 47,7 + Actor1627: brik + Owner: Neutral + Location: 47,8 + Actor1628: brik + Owner: Neutral + Location: 47,9 + Actor1629: brik + Owner: Neutral + Location: 53,7 + Actor1630: brik + Owner: Neutral + Location: 54,7 + Actor1631: brik + Owner: Neutral + Location: 56,7 + Actor1632: brik + Owner: Neutral + Location: 57,7 + Actor1633: brik + Owner: Neutral + Location: 55,7 + Actor1634: brik + Owner: Neutral + Location: 53,8 + Actor1635: brik + Owner: Neutral + Location: 53,9 + Actor1636: brik + Owner: Neutral + Location: 58,7 + Actor1637: brik + Owner: Neutral + Location: 59,7 + Actor1638: brik + Owner: Neutral + Location: 69,6 + Actor1639: brik + Owner: Neutral + Location: 69,7 + Actor1640: brik + Owner: Neutral + Location: 69,8 + Actor1641: brik + Owner: Neutral + Location: 69,9 + Actor1642: brik + Owner: Neutral + Location: 70,9 + Actor1643: brik + Owner: Neutral + Location: 70,8 + Actor1644: brik + Owner: Neutral + Location: 70,7 + Actor1645: brik + Owner: Neutral + Location: 70,6 + Actor1646: brik + Owner: Neutral + Location: 75,7 + Actor1647: brik + Owner: Neutral + Location: 76,7 + Actor1648: brik + Owner: Neutral + Location: 77,7 + Actor1649: brik + Owner: Neutral + Location: 78,7 + Actor1650: brik + Owner: Neutral + Location: 78,8 + Actor1651: brik + Owner: Neutral + Location: 78,9 + Actor1652: brik + Owner: Neutral + Location: 78,10 + Actor1653: brik + Owner: Neutral + Location: 75,8 + Actor1654: brik + Owner: Neutral + Location: 75,9 + Actor1655: brik + Owner: Neutral + Location: 75,10 + Actor1656: brik + Owner: Neutral + Location: 75,11 + Actor1657: brik + Owner: Neutral + Location: 75,11 + Actor1658: brik + Owner: Neutral + Location: 78,11 + Actor1659: brik + Owner: Neutral + Location: 78,12 + Actor1660: brik + Owner: Neutral + Location: 78,13 + Actor1661: brik + Owner: Neutral + Location: 75,12 + Actor1662: brik + Owner: Neutral + Location: 75,13 + Actor1663: brik + Owner: Neutral + Location: 78,14 + Actor1664: brik + Owner: Neutral + Location: 88,15 + Actor1665: brik + Owner: Neutral + Location: 89,15 + Actor1666: brik + Owner: Neutral + Location: 89,16 + Actor1667: brik + Owner: Neutral + Location: 89,17 + Actor1668: brik + Owner: Neutral + Location: 86,15 + Actor1669: brik + Owner: Neutral + Location: 87,15 + Actor1670: brik + Owner: Neutral + Location: 89,18 + Actor1671: brik + Owner: Neutral + Location: 85,8 + Actor1672: brik + Owner: Neutral + Location: 85,7 + Actor1673: brik + Owner: Neutral + Location: 85,6 + Actor1674: brik + Owner: Neutral + Location: 86,6 + Actor1675: brik + Owner: Neutral + Location: 86,7 + Actor1676: brik + Owner: Neutral + Location: 86,8 + Actor1677: brik + Owner: Neutral + Location: 85,9 + Actor1678: brik + Owner: Neutral + Location: 86,9 + Actor1679: brik + Owner: Neutral + Location: 75,2 + Actor1680: brik + Owner: Neutral + Location: 75,3 + Actor1681: brik + Owner: Neutral + Location: 75,1 + Actor1682: brik + Owner: Neutral + Location: 76,3 + Actor1683: brik + Owner: Neutral + Location: 77,3 + Actor1684: brik + Owner: Neutral + Location: 77,2 + Actor1685: brik + Owner: Neutral + Location: 77,1 + Actor1686: s4 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 81,33 + Actor1687: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 83,36 + Actor1688: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 80,32 + Actor1689: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 79,34 + Actor1690: s1 + Owner: Scrin + Facing: 384 + Location: 79,35 + SubCell: 3 + Actor1691: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 80,37 + Actor1692: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 82,38 + Actor1693: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 86,36 + Actor1694: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 76,49 + Actor1695: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 33,46 + Actor1696: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 41,43 + Actor1697: s1 + Owner: Scrin + Facing: 384 + Location: 17,53 + SubCell: 3 + Actor1698: s1 + Owner: Scrin + Facing: 384 + Location: 9,62 + SubCell: 1 + Actor1699: gscr + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 8,94 + Actor1700: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 11,92 + Actor1701: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 12,88 + Actor1702: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 10,85 + Actor1703: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 6,85 + Actor1704: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 4,87 + Actor1705: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 3,91 + Actor1706: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 7,91 + Actor1707: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 3,79 + Actor1708: s3 + Owner: Scrin + Facing: 384 + Location: 3,78 + SubCell: 3 + Actor1709: s3 + Owner: Scrin + Facing: 384 + Location: 4,78 + SubCell: 3 + Actor1710: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 90,8 + Actor1711: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 89,5 + Actor1712: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 94,9 + Actor1714: ptur + Owner: Scrin + Location: 5,8 + TurretFacing: 840 + Actor1713: ptur + Owner: Scrin + Location: 13,13 + TurretFacing: 142 + Actor1715: ptur + Owner: Scrin + Location: 88,92 + TurretFacing: 658 + Actor1716: ptur + Owner: Scrin + Location: 93,89 + TurretFacing: 237 + Actor1717: ptur + Owner: Scrin + Location: 42,29 + TurretFacing: 118 + Actor1718: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 39,31 + Actor1719: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 41,32 + Actor1720: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 46,30 + Actor1721: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 46,28 + Actor1722: s1 + Owner: Scrin + Facing: 384 + Location: 44,31 + SubCell: 3 + Actor1723: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 39,29 + Actor1724: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 44,27 + Actor146: e1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 54,90 + Actor1727: brik + Owner: Neutral + Location: 24,34 + Actor1728: brik + Owner: Neutral + Location: 28,34 + Actor1729: brik + Owner: Neutral + Location: 24,35 + Actor1732: brik + Owner: Neutral + Location: 28,35 + Actor1733: brik + Owner: Neutral + Location: 24,36 + Actor1734: brik + Owner: Neutral + Location: 25,36 + Actor1735: brik + Owner: Neutral + Location: 26,36 + Actor1736: brik + Owner: Neutral + Location: 27,36 + Actor1737: brik + Owner: Neutral + Location: 28,36 + Actor1607: brik + Owner: Neutral + Location: 28,33 + Actor1608: brik + Owner: Neutral + Location: 29,33 + Actor1609: brik + Owner: Neutral + Location: 30,33 + Actor1726: brik + Owner: Neutral + Location: 31,33 + Actor1738: brik + Owner: Neutral + Location: 32,33 + Actor1606: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 29,23 + Actor1739: gunw + Owner: Scrin + Facing: 658 + Location: 27,24 + Actor1740: s1 + Owner: Scrin + SubCell: 3 + Location: 29,25 + Facing: 384 + Actor1741: ptur + Owner: Scrin + Location: 74,43 + TurretFacing: 880 + Actor1742: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 82,32 + Actor1743: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 82,33 + Actor1744: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 86,35 + Actor1745: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 85,30 + Actor1746: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 87,33 + Actor1725: healcrate + Owner: Neutral + Location: 26,34 + Actor1730: healcrate + Owner: Neutral + Location: 90,18 + Actor1731: healcrate + Owner: Neutral + Location: 95,95 + Actor1747: healcrate + Owner: Neutral + Location: 15,17 + +Rules: ca|rules/custom/scrinfestation-base.yaml, ca|rules/custom/scrinfestation-minigame.yaml, ca|rules/custom/commando-mission.yaml + +Weapons: ca|weapons/custom/scrinfestation.yaml diff --git a/mods/ca/maps/scrinfestation/scrinfestation.lua b/mods/ca/maps/scrinfestation/scrinfestation.lua new file mode 100644 index 0000000000..82fc059b75 --- /dev/null +++ b/mods/ca/maps/scrinfestation/scrinfestation.lua @@ -0,0 +1,172 @@ +Players = Player.GetPlayers(function(p) return p.Team == 1 end) + +AttackPaths = +{ + { + { NW2.Location, NW3.Location, NW4.Location, NW5.Location, NW6.Location, NW7.Location, NW8.Location, NW9.Location }, + { NE4.Location, NE5.Location, NE6.Location, NE7.Location }, + }, + { + { NE2.Location, NE3.Location, NE4.Location, NE5.Location, NE6.Location, NE7.Location }, + { NE2.Location, NE3.Location, NE4.Location, NW4.Location, NW5.Location, NW6.Location, NW7.Location, NW8.Location, NW9.Location }, + }, + { + { SE2.Location, NE3.Location, NE4.Location, NE5.Location, NE6.Location, NE7.Location }, + { SE2.Location, NE3.Location, NE4.Location, NW4.Location, NW5.Location, NW6.Location, NW7.Location, NW8.Location, NW9.Location }, + }, +} + +Wormholes = { WormholeNW, WormholeNE, WormholeSE } + +ScrinSquads = { + {"s1", "s1", "s1", "s2", "gscr"}, + {"s1", "s1", "s1", "s3", "gscr"}, + {"s1", "s1", "s1", "s4", "gscr"}, + {"s1", "s1", "s1", "brst2", "gscr"}, + {"gscr", "gscr", "gscr"}, + {"s4", "s4", "s4"}, + {"s1", "s1", "s1", "s1", "s1"}, + {"s2", "s2", "s2"}, + {"s3", "s3", "s1", "s1"}, + {"brst2", "brst2", "s1", "s1"}, +} + +GetNumPlayers = function() + local num = 0 + + Utils.Do(Players, function(player) + if player.InternalName ~= "Neutral" then + local spawns = player.GetActorsByType("rmbospawn") + num = num + #spawns + end + end) + + return num +end + +IdleHunt = function(actor) + if actor.HasProperty("Hunt") and not actor.IsDead then + Trigger.OnIdle(actor, actor.Hunt) + end +end + +MoveAndHunt = function(actors, path) + Utils.Do(actors, function(actor) + if not actor or actor.IsDead then + return + end + + Utils.Do(path, function(point) + actor.AttackMove(point) + end) + + IdleHunt(actor) + end) +end + +SendScrinUnits = function(wormhole, attackPaths) + if not wormhole or wormhole.IsDead then + return + end + + local interval = math.floor((120 / GetNumPlayers()) + 0.5) + Utils.RandomInteger(-3,3) + local unitTypes = Utils.Random(ScrinSquads); + local units = Reinforcements.Reinforce(Scrin, unitTypes, { wormhole.Location }, 15) + local attackPath = attackPaths[1] + + if GetNumPlayers() > 2 then + attackPath = Utils.Random(attackPaths) + end + + Utils.Do(units, function(unit) + unit.Patrol(attackPath, true, 50) + + Trigger.OnDamaged(unit, function() + + Utils.Do(units, function(unit) + if unit.HasProperty("Hunt") and not unit.IsDead then + unit.Stop() + unit.Hunt() + Trigger.ClearAll(unit) + end + end) + end) + end) + + Trigger.AfterDelay(DateTime.Seconds(interval), function() + SendScrinUnits(wormhole, attackPaths) + end) +end + +WorldLoaded = function() + Scrin = Player.GetPlayer("Scrin") + Neutral = Player.GetPlayer("Neutral") + + local neutralSpawns = Neutral.GetActorsByType("rmbospawn") + Utils.Do(neutralSpawns, function(a) + a.Destroy() + end) + + local initialPlayers = GetNumPlayers() + + SendScrinUnits(WormholeNE, AttackPaths[2]) + + if initialPlayers > 1 then + SendScrinUnits(WormholeNW, AttackPaths[1]) + end + + if initialPlayers > 2 then + SendScrinUnits(WormholeSE, AttackPaths[3]) + end + + local scrinUnits = Scrin.GetActorsByTypes({"gunw", "corr", "ruin", "lchr", "dark", "ptur"}) + + Utils.Do(scrinUnits, function(unit) + Trigger.OnDamaged(unit, function(self, attacker, damage) + if attacker.EffectiveOwner == Scrin then + return + end + local rand = Utils.RandomInteger(1,100) + if rand > 90 then + if unit.HasProperty("Attack") and not unit.IsDead then + unit.Stop() + unit.Attack(attacker) + end + end + end) + end) + + Trigger.OnAllKilledOrCaptured(Wormholes, function() + local actors = Scrin.GetActors() + Utils.Do(actors, function(actor) + if actor.HasProperty("Kill") and not actor.IsDead then actor.Kill("BulletDeath") end + end) + end) + + Utils.Do(Players, function(player) + if player.InternalName ~= "Neutral" then + local spawns = player.GetActorsByType("rmbospawn") + local commandos = player.GetActorsByType("rmbo") + + Utils.Do(spawns, function(s) + Trigger.OnProduction(s, function(producer, produced) + if produced.Type == "rmbo" then + Trigger.OnKilled(produced, function(self, killer) + AnnounceDeath(self) + end) + end + end) + end) + + Utils.Do(commandos, function(c) + Trigger.OnKilled(c, function(self, killer) + AnnounceDeath(self) + end) + end) + end + end) +end + +AnnounceDeath = function(killed) + Media.DisplayMessage(killed.Owner.Name .. " died!", "Notification", HSLColor.FromHex("1E90FF")) +end diff --git a/mods/ca/maps/secluded-ca.oramap b/mods/ca/maps/secluded-ca.oramap index b760620139..1a428dcfda 100644 Binary files a/mods/ca/maps/secluded-ca.oramap and b/mods/ca/maps/secluded-ca.oramap differ diff --git a/mods/ca/maps/secretstash-ca.oramap b/mods/ca/maps/secretstash-ca.oramap index eb5bbb65d1..04e5b1fcec 100644 Binary files a/mods/ca/maps/secretstash-ca.oramap and b/mods/ca/maps/secretstash-ca.oramap differ diff --git a/mods/ca/maps/separateness-ca.oramap b/mods/ca/maps/separateness-ca.oramap index dfb0cc1d94..3e79b4efe3 100644 Binary files a/mods/ca/maps/separateness-ca.oramap and b/mods/ca/maps/separateness-ca.oramap differ diff --git a/mods/ca/maps/shadowlands-ca.oramap b/mods/ca/maps/shadowlands-ca.oramap index e4b94ac094..45e7aa072e 100644 Binary files a/mods/ca/maps/shadowlands-ca.oramap and b/mods/ca/maps/shadowlands-ca.oramap differ diff --git a/mods/ca/maps/shattered-mountain/rules.yaml b/mods/ca/maps/shattered-mountain/rules.yaml index bf37c5cfbb..a525b43f92 100644 --- a/mods/ca/maps/shattered-mountain/rules.yaml +++ b/mods/ca/maps/shattered-mountain/rules.yaml @@ -1,20 +1,13 @@ -World: +^Palettes: WeatherOverlay: - ChangingWindLevel: true - WindLevels: -5, -3, -2, 0, 2, 3, 5, 6 - WindTick: 150, 550 - InstantWindChanges: false - UseSquares: true + ParticleDensityFactor: 6 + Gravity: 16, 24 + WindTick: 150, 425 + ScatterDirection: -12, 12 ParticleSize: 2, 3 - ParticleDensityFactor: 8 - ScatterDirection: -1, 1 - Gravity: 1.00, 2.00 - SwingOffset: 1.0, 1.5 - SwingSpeed: 0.001, 0.025 - SwingAmplitude: 1.0, 1.5 ParticleColors: ECECEC, E4E4E4, D0D0D0, BCBCBC LineTailAlphaValue: 0 - GlobalLightingPaletteEffect: + TintPostProcessEffect: Red: 0.88 Green: 0.92 Blue: 1.06 diff --git a/mods/ca/maps/shellmap/lush.pal b/mods/ca/maps/shellmap/lush.pal new file mode 100644 index 0000000000..94fd0f1418 Binary files /dev/null and b/mods/ca/maps/shellmap/lush.pal differ diff --git a/mods/ca/maps/shellmap/map.bin b/mods/ca/maps/shellmap/map.bin new file mode 100644 index 0000000000..f315909972 Binary files /dev/null and b/mods/ca/maps/shellmap/map.bin differ diff --git a/mods/ca/maps/shellmap/map.png b/mods/ca/maps/shellmap/map.png new file mode 100644 index 0000000000..a10bd0280a Binary files /dev/null and b/mods/ca/maps/shellmap/map.png differ diff --git a/mods/ca/maps/shellmap/map.yaml b/mods/ca/maps/shellmap/map.yaml new file mode 100644 index 0000000000..9a9f547f84 --- /dev/null +++ b/mods/ca/maps/shellmap/map.yaml @@ -0,0 +1,6137 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: Shellmap + +Author: Darkademic & Inq + +Tileset: TEMPERAT + +MapSize: 242,242 + +Bounds: 1,1,240,240 + +Visibility: Shellmap + +Categories: Shellmap + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: Greece, USSR, GDI, Nod, Scrin, Civilian + PlayerReference@Greece: + Name: Greece + Bot: campaign + Faction: allies + Color: 99ACF2 + Allies: GDI + Enemies: USSR, Nod, Scrin, Creeps + PlayerReference@USSR: + Name: USSR + Bot: campaign + Faction: soviet + Color: FE1100 + Enemies: Greece, GDI, Nod, Scrin, Civilian, Creeps + PlayerReference@GDI: + Name: GDI + Bot: campaign + Faction: gdi + Color: F2CF74 + Allies: Greece + Enemies: USSR, Nod, Scrin, Creeps + PlayerReference@Nod: + Name: Nod + Bot: campaign + Faction: nod + Color: FE1100 + Enemies: GDI, Greece, USSR, Scrin, Civilian, Creeps + PlayerReference@Scrin: + Name: Scrin + Bot: campaign + Faction: scrin + Color: 7700FF + Enemies: GDI, Greece, USSR, Nod, Civilian, Creeps + PlayerReference@Civilian: + Name: Civilian + Bot: campaign + Faction: england + Color: FFFFFF + Enemies: USSR, Nod, Scrin, Creeps + +Actors: + Actor40: split2 + Owner: Neutral + Location: 19,91 + Actor41: split2 + Owner: Neutral + Location: 6,68 + Actor42: split2 + Owner: Neutral + Location: 12,68 + Actor43: split2 + Owner: Neutral + Location: 221,92 + Actor44: split2 + Owner: Neutral + Location: 227,92 + Actor47: split2 + Owner: Neutral + Location: 13,146 + Actor48: split2 + Owner: Neutral + Location: 19,146 + Actor49: split2 + Owner: Neutral + Location: 7,175 + Actor50: split2 + Owner: Neutral + Location: 235,143 + Actor51: split2 + Owner: Neutral + Location: 230,67 + Actor52: split2 + Owner: Neutral + Location: 92,24 + Actor54: split2 + Owner: Neutral + Location: 98,236 + Actor60: split2 + Owner: Neutral + Location: 70,225 + Actor61: split2 + Owner: Neutral + Location: 70,232 + Actor62: split2 + Owner: Neutral + Location: 147,229 + Actor63: split2 + Owner: Neutral + Location: 147,236 + Actor64: split2 + Owner: Neutral + Location: 230,216 + Actor65: split2 + Owner: Neutral + Location: 237,220 + Actor66: split2 + Owner: Neutral + Location: 175,188 + Actor67: split2 + Owner: Neutral + Location: 181,194 + Actor68: v01 + Owner: Neutral + Location: 185,138 + Actor69: v11 + Owner: Neutral + Location: 191,143 + Actor70: v06 + Owner: Neutral + Location: 204,139 + Actor71: v03 + Owner: Neutral + Location: 178,133 + Actor72: v04 + Owner: Neutral + Location: 179,145 + Actor73: v02 + Owner: Neutral + Location: 190,131 + Actor74: v07 + Owner: Neutral + Location: 191,136 + Actor75: v11 + Owner: Neutral + Location: 170,134 + Actor76: v02 + Owner: Neutral + Location: 193,154 + Actor77: v08 + Owner: Neutral + Location: 201,143 + Actor78: v09 + Owner: Neutral + Location: 197,127 + Actor79: v09 + Owner: Neutral + Location: 180,152 + Actor80: v11 + Owner: Neutral + Location: 210,131 + Actor81: v04 + Owner: Neutral + Location: 197,120 + Actor82: v05 + Owner: Neutral + Location: 184,128 + Actor83: v05 + Owner: Neutral + Location: 212,142 + Actor84: v17 + Owner: Neutral + Location: 202,137 + Actor85: v18 + Owner: Neutral + Location: 203,137 + Actor86: v16 + Owner: Neutral + Location: 207,136 + Actor87: v18 + Owner: Neutral + Location: 208,136 + Actor88: v12 + Owner: Neutral + Location: 207,140 + Actor89: v14 + Owner: Neutral + Location: 209,136 + Actor90: v13 + Owner: Neutral + Location: 210,137 + Actor92: windmill + Owner: Neutral + Location: 212,136 + Actor94: rice + Owner: Neutral + Location: 201,137 + Actor95: wood + Owner: Neutral + Location: 200,137 + Actor96: wood + Owner: Neutral + Location: 200,136 + Actor97: wood + Owner: Neutral + Location: 201,136 + Actor98: wood + Owner: Neutral + Location: 202,136 + Actor99: wood + Owner: Neutral + Location: 203,136 + Actor100: wood + Owner: Neutral + Location: 204,136 + Actor101: wood + Owner: Neutral + Location: 204,137 + Actor102: wood + Owner: Neutral + Location: 206,136 + Actor103: wood + Owner: Neutral + Location: 206,135 + Actor104: wood + Owner: Neutral + Location: 207,135 + Actor105: wood + Owner: Neutral + Location: 206,137 + Actor106: wood + Owner: Neutral + Location: 207,137 + Actor107: wood + Owner: Neutral + Location: 208,135 + Actor108: wood + Owner: Neutral + Location: 209,135 + Actor109: wood + Owner: Neutral + Location: 210,135 + Actor110: wood + Owner: Neutral + Location: 210,136 + Actor111: wood + Owner: Neutral + Location: 204,138 + Actor112: wood + Owner: Neutral + Location: 199,137 + Actor113: wood + Owner: Neutral + Location: 193,143 + Actor114: wood + Owner: Neutral + Location: 194,143 + Actor115: wood + Owner: Neutral + Location: 193,142 + Actor116: wood + Owner: Neutral + Location: 193,141 + Actor117: wood + Owner: Neutral + Location: 192,141 + Actor118: wood + Owner: Neutral + Location: 191,141 + Actor119: wood + Owner: Neutral + Location: 185,134 + Actor120: wood + Owner: Neutral + Location: 185,135 + Actor121: wood + Owner: Neutral + Location: 185,136 + Actor122: wood + Owner: Neutral + Location: 186,134 + Actor126: wood + Owner: Neutral + Location: 172,138 + Actor127: wood + Owner: Neutral + Location: 173,138 + Actor128: wood + Owner: Neutral + Location: 174,138 + Actor129: wood + Owner: Neutral + Location: 171,138 + Actor130: wood + Owner: Neutral + Location: 170,138 + Actor131: wood + Owner: Neutral + Location: 170,137 + Actor132: wood + Owner: Neutral + Location: 169,132 + Actor133: wood + Owner: Neutral + Location: 170,132 + Actor134: wood + Owner: Neutral + Location: 171,132 + Actor135: wood + Owner: Neutral + Location: 172,132 + Actor136: wood + Owner: Neutral + Location: 172,133 + Actor137: wood + Owner: Neutral + Location: 177,145 + Actor138: wood + Owner: Neutral + Location: 177,144 + Actor139: wood + Owner: Neutral + Location: 178,144 + Actor140: wood + Owner: Neutral + Location: 179,144 + Actor141: wood + Owner: Neutral + Location: 180,144 + Actor142: wood + Owner: Neutral + Location: 180,143 + Actor143: wood + Owner: Neutral + Location: 180,136 + Actor144: wood + Owner: Neutral + Location: 179,136 + Actor145: wood + Owner: Neutral + Location: 180,137 + Actor146: wood + Owner: Neutral + Location: 194,152 + Actor147: wood + Owner: Neutral + Location: 192,152 + Actor148: wood + Owner: Neutral + Location: 193,152 + Actor149: wood + Owner: Neutral + Location: 191,152 + Actor150: wood + Owner: Neutral + Location: 191,153 + Actor151: wood + Owner: Neutral + Location: 199,125 + Actor152: wood + Owner: Neutral + Location: 199,126 + Actor153: wood + Owner: Neutral + Location: 199,127 + Actor154: wood + Owner: Neutral + Location: 200,127 + Actor155: wood + Owner: Neutral + Location: 190,130 + Actor156: wood + Owner: Neutral + Location: 191,130 + Actor157: wood + Owner: Neutral + Location: 192,130 + Actor158: wood + Owner: Neutral + Location: 193,130 + Actor159: wood + Owner: Neutral + Location: 193,131 + Actor160: wood + Owner: Neutral + Location: 186,127 + Actor161: wood + Owner: Neutral + Location: 186,128 + Actor162: wood + Owner: Neutral + Location: 185,127 + Actor163: wood + Owner: Neutral + Location: 184,127 + Actor164: wood + Owner: Neutral + Location: 196,119 + Actor165: wood + Owner: Neutral + Location: 198,119 + Actor166: wood + Owner: Neutral + Location: 197,119 + Actor167: wood + Owner: Neutral + Location: 195,120 + Actor168: wood + Owner: Neutral + Location: 195,119 + Actor169: wood + Owner: Neutral + Location: 214,140 + Actor170: wood + Owner: Neutral + Location: 215,140 + Actor171: wood + Owner: Neutral + Location: 216,140 + Actor172: wood + Owner: Neutral + Location: 216,141 + Actor173: wood + Owner: Neutral + Location: 216,142 + Actor174: wood + Owner: Neutral + Location: 201,147 + Actor175: wood + Owner: Neutral + Location: 202,147 + Actor176: wood + Owner: Neutral + Location: 203,147 + Actor177: wood + Owner: Neutral + Location: 204,147 + Actor178: wood + Owner: Neutral + Location: 205,146 + Actor179: wood + Owner: Neutral + Location: 205,147 + Actor180: tc03 + Owner: Neutral + Location: 185,143 + Actor181: t03 + Owner: Neutral + Location: 193,139 + Actor183: t07 + Owner: Neutral + Location: 181,127 + Actor184: t06 + Owner: Neutral + Location: 166,151 + Actor185: tc04 + Owner: Neutral + Location: 170,139 + Actor186: tc01 + Owner: Neutral + Location: 170,130 + Actor187: t12 + Owner: Neutral + Location: 183,148 + Actor189: t16 + Owner: Neutral + Location: 205,142 + Actor190: t01 + Owner: Neutral + Location: 214,130 + Actor191: t02 + Owner: Neutral + Location: 194,131 + Actor192: t01 + Owner: Neutral + Location: 194,119 + Actor194: t11 + Owner: Neutral + Location: 218,126 + Actor195: t11 + Owner: Neutral + Location: 217,141 + Actor197: split2 + Owner: Neutral + Location: 177,118 + Actor198: split2 + Owner: Neutral + Location: 182,115 + Actor203: split2 + Owner: Neutral + Location: 74,123 + Actor204: split2 + Owner: Neutral + Location: 76,128 + Actor205: split2 + Owner: Neutral + Location: 66,60 + Actor206: split2 + Owner: Neutral + Location: 59,65 + Actor207: tc04 + Owner: Neutral + Location: 121,74 + Actor208: tc01 + Owner: Neutral + Location: 132,68 + Actor209: t15 + Owner: Neutral + Location: 136,62 + Actor210: t16 + Owner: Neutral + Location: 137,69 + Actor211: t13 + Owner: Neutral + Location: 124,63 + Actor212: tc02 + Owner: Neutral + Location: 138,68 + Actor213: tc05 + Owner: Neutral + Location: 118,68 + Actor215: t07 + Owner: Neutral + Location: 147,66 + Actor216: t06 + Owner: Neutral + Location: 145,64 + Actor217: t02 + Owner: Neutral + Location: 134,57 + Actor218: t01 + Owner: Neutral + Location: 139,50 + Actor219: t10 + Owner: Neutral + Location: 120,60 + Actor220: t13 + Owner: Neutral + Location: 103,59 + Actor221: tc04 + Owner: Neutral + Location: 137,47 + Actor222: tc03 + Owner: Neutral + Location: 135,56 + Actor223: t16 + Owner: Neutral + Location: 155,60 + Actor224: t15 + Owner: Neutral + Location: 152,62 + Actor225: t10 + Owner: Neutral + Location: 150,52 + Actor226: t07 + Owner: Neutral + Location: 113,57 + Actor227: t05 + Owner: Neutral + Location: 106,53 + Actor228: t02 + Owner: Neutral + Location: 103,63 + Actor229: tc02 + Owner: Neutral + Location: 88,65 + Actor230: t10 + Owner: Neutral + Location: 88,53 + Actor231: t12 + Owner: Neutral + Location: 92,57 + Actor232: t12 + Owner: Neutral + Location: 111,50 + Actor233: t02 + Owner: Neutral + Location: 130,44 + Actor234: t05 + Owner: Neutral + Location: 97,47 + Actor235: split2 + Owner: Neutral + Location: 126,55 + Actor236: split2 + Owner: Neutral + Location: 120,50 + Actor237: split2 + Owner: Neutral + Location: 180,74 + Actor238: split2 + Owner: Neutral + Location: 182,69 + Actor239: tc04 + Owner: Neutral + Location: 116,14 + Actor240: tc03 + Owner: Neutral + Location: 117,16 + Actor241: t06 + Owner: Neutral + Location: 116,18 + Actor242: t05 + Owner: Neutral + Location: 117,13 + Actor243: t08 + Owner: Neutral + Location: 115,15 + Actor244: tc04 + Owner: Neutral + Location: 95,44 + Actor245: t07 + Owner: Neutral + Location: 109,44 + Actor246: t05 + Owner: Neutral + Location: 115,40 + Actor247: t03 + Owner: Neutral + Location: 132,43 + Actor248: t13 + Owner: Neutral + Location: 162,71 + Actor249: tc04 + Owner: Neutral + Location: 170,66 + Actor250: t16 + Owner: Neutral + Location: 177,59 + Actor251: t07 + Owner: Neutral + Location: 168,61 + Actor252: t06 + Owner: Neutral + Location: 172,49 + Actor253: t02 + Owner: Neutral + Location: 160,48 + Actor254: tc02 + Owner: Neutral + Location: 161,56 + Actor255: t15 + Owner: Neutral + Location: 177,43 + Actor256: t10 + Owner: Neutral + Location: 166,35 + Actor257: t07 + Owner: Neutral + Location: 184,55 + Actor260: t17 + Owner: Neutral + Location: 88,44 + Actor261: t02 + Owner: Neutral + Location: 81,59 + Actor265: t05 + Owner: Neutral + Location: 44,89 + Actor266: t02 + Owner: Neutral + Location: 41,71 + Actor267: t11 + Owner: Neutral + Location: 41,87 + Actor269: t02 + Owner: Neutral + Location: 111,30 + Actor363: miss + Owner: Neutral + Location: 65,104 + Actor364: miss + Owner: Neutral + Location: 109,62 + Health: 1 + Actor373: t07 + Owner: Neutral + Location: 150,161 + Actor376: tc04 + Owner: Neutral + Location: 176,106 + Actor377: t15 + Owner: Neutral + Location: 163,88 + Actor379: t06 + Owner: Neutral + Location: 197,92 + Actor380: t07 + Owner: Neutral + Location: 221,107 + Actor381: t16 + Owner: Neutral + Location: 206,55 + Actor382: t13 + Owner: Neutral + Location: 213,41 + Actor383: ice01 + Owner: Neutral + Location: 54,145 + Actor385: tc02 + Owner: Neutral + Location: 77,154 + Actor388: t12 + Owner: Neutral + Location: 46,142 + Actor391: tc01 + Owner: Neutral + Location: 83,177 + Actor392: t07 + Owner: Neutral + Location: 85,189 + Actor393: tc02 + Owner: Neutral + Location: 66,102 + Actor394: t16 + Owner: Neutral + Location: 65,99 + Actor395: t17 + Owner: Neutral + Location: 56,110 + Actor396: tc03 + Owner: Neutral + Location: 47,101 + Actor397: t16 + Owner: Neutral + Location: 78,90 + Actor398: t06 + Owner: Neutral + Location: 79,88 + Actor401: split2 + Owner: Neutral + Location: 37,45 + Actor402: split2 + Owner: Neutral + Location: 43,40 + Actor403: split2 + Owner: Neutral + Location: 5,113 + Actor404: split2 + Owner: Neutral + Location: 12,117 + Actor411: t15 + Owner: Neutral + Location: 30,178 + Actor412: t06 + Owner: Neutral + Location: 114,216 + Actor414: t12 + Owner: Neutral + Location: 128,221 + Actor415: tc03 + Owner: Neutral + Location: 131,228 + Actor416: tc01 + Owner: Neutral + Location: 134,227 + Actor420: t10 + Owner: Neutral + Location: 225,193 + Actor421: t07 + Owner: Neutral + Location: 234,182 + Actor423: t01 + Owner: Neutral + Location: 203,165 + Actor422: t10 + Owner: Neutral + Location: 200,173 + Actor424: t02 + Owner: Neutral + Location: 208,106 + Actor426: t07 + Owner: Neutral + Location: 227,41 + Actor428: t02 + Owner: Neutral + Location: 110,4 + Actor429: t01 + Owner: Neutral + Location: 124,23 + Actor430: t02 + Owner: Neutral + Location: 56,13 + Actor431: t05 + Owner: Neutral + Location: 56,45 + Actor432: t10 + Owner: Neutral + Location: 34,63 + Actor433: t05 + Owner: Neutral + Location: 13,57 + Actor434: t07 + Owner: Neutral + Location: 13,46 + Actor435: tc01 + Owner: Neutral + Location: 5,44 + Actor436: tc04 + Owner: Neutral + Location: 158,33 + Actor437: tc05 + Owner: Neutral + Location: 230,198 + Actor438: t17 + Owner: Neutral + Location: 219,204 + Actor439: t16 + Owner: Neutral + Location: 192,238 + Actor440: t07 + Owner: Neutral + Location: 73,198 + Actor441: t16 + Owner: Neutral + Location: 79,207 + Actor442: t17 + Owner: Neutral + Location: 64,231 + Actor447: t02 + Owner: Neutral + Location: 92,102 + Actor448: oilb + Location: 117,92 + Faction: Random + Owner: GDI + Actor449: oilb + Location: 122,101 + Faction: Random + Owner: GDI + Actor451: t12 + Owner: Neutral + Location: 105,113 + Actor457: split2 + Owner: Neutral + Location: 224,171 + Actor458: split2 + Owner: Neutral + Location: 229,170 + Actor459: split2 + Owner: Neutral + Location: 229,176 + Actor460: split2 + Owner: Neutral + Location: 232,147 + Actor453: t15 + Owner: Neutral + Location: 147,122 + Actor748: t14 + Owner: Neutral + Location: 137,109 + Actor749: t12 + Owner: Neutral + Location: 139,111 + Actor751: t15 + Owner: Neutral + Location: 142,115 + Actor752: t11 + Owner: Neutral + Location: 133,95 + Actor753: t06 + Owner: Neutral + Location: 148,102 + Actor754: t02 + Owner: Neutral + Location: 147,101 + Actor755: tc04 + Owner: Neutral + Location: 150,102 + Actor756: t15 + Owner: Neutral + Location: 152,104 + Actor757: t05 + Owner: Neutral + Location: 155,105 + Actor758: t07 + Owner: Neutral + Location: 157,103 + Actor759: c3 + Owner: Civilian + SubCell: 3 + Location: 199,139 + Facing: 384 + Actor760: c1 + Owner: Civilian + Facing: 384 + SubCell: 3 + Location: 197,137 + Actor761: c2 + Owner: Civilian + Facing: 384 + SubCell: 3 + Location: 201,133 + Actor762: c8 + Owner: Civilian + SubCell: 3 + Location: 198,142 + Facing: 384 + Actor763: c10 + Owner: Civilian + Facing: 384 + SubCell: 3 + Location: 198,144 + Actor764: tecn + Owner: Civilian + SubCell: 3 + Location: 181,134 + Facing: 384 + Actor765: c8 + Owner: Civilian + SubCell: 3 + Location: 180,139 + Facing: 384 + Actor766: c3 + Owner: Civilian + Facing: 384 + SubCell: 3 + Location: 188,130 + Actor767: c7 + Owner: Civilian + Facing: 384 + SubCell: 3 + Location: 179,129 + Actor768: c6 + Owner: Civilian + SubCell: 3 + Location: 188,139 + Facing: 384 + Actor769: c5 + Owner: Civilian + SubCell: 3 + Facing: 384 + Location: 210,139 + Actor770: c3 + Owner: Civilian + SubCell: 3 + Facing: 384 + Location: 205,134 + Actor771: c2 + Owner: Civilian + SubCell: 3 + Location: 174,133 + Facing: 384 + Actor772: c9 + Owner: Civilian + Facing: 384 + SubCell: 3 + Location: 188,136 + Actor773: c10 + Owner: Civilian + SubCell: 3 + Facing: 384 + Location: 213,138 + Actor774: c10 + Owner: Civilian + SubCell: 3 + Location: 177,138 + Facing: 384 + Actor996: swal + Owner: Scrin + Location: 207,82 + Actor997: swal + Owner: Scrin + Location: 207,83 + Actor998: swal + Owner: Scrin + Location: 208,82 + Actor999: swal + Owner: Scrin + Location: 208,83 + Actor1000: swal + Owner: Scrin + Location: 209,83 + Actor1001: swal + Owner: Scrin + Location: 208,84 + Actor1002: swal + Owner: Scrin + Location: 209,84 + Actor1003: swal + Owner: Scrin + Location: 210,84 + Actor1004: swal + Owner: Scrin + Location: 210,85 + Actor1005: swal + Owner: Scrin + Location: 209,85 + Actor1006: swal + Owner: Scrin + Location: 211,85 + Actor1007: swal + Owner: Scrin + Location: 211,86 + Actor1008: swal + Owner: Scrin + Location: 210,86 + Actor1009: swal + Owner: Scrin + Location: 212,86 + Actor1010: swal + Owner: Scrin + Location: 212,87 + Actor1011: swal + Owner: Scrin + Location: 211,87 + Actor1012: swal + Owner: Scrin + Location: 204,75 + Actor1013: swal + Owner: Scrin + Location: 205,75 + Actor1014: swal + Owner: Scrin + Location: 204,74 + Actor1015: swal + Owner: Scrin + Location: 205,74 + Actor1016: swal + Owner: Scrin + Location: 203,74 + Actor1017: swal + Owner: Scrin + Location: 203,73 + Actor1018: swal + Owner: Scrin + Location: 204,73 + Actor1019: swal + Owner: Scrin + Location: 202,73 + Actor1020: swal + Owner: Scrin + Location: 202,72 + Actor1021: swal + Owner: Scrin + Location: 203,72 + Actor1022: swal + Owner: Scrin + Location: 201,72 + Actor1023: swal + Owner: Scrin + Location: 201,71 + Actor1024: swal + Owner: Scrin + Location: 202,71 + Actor1025: swal + Owner: Scrin + Location: 201,69 + Actor1026: swal + Owner: Scrin + Location: 201,70 + Actor1027: swal + Owner: Scrin + Location: 201,68 + Actor1028: swal + Owner: Scrin + Location: 201,67 + Actor1029: swal + Owner: Scrin + Location: 202,66 + Actor1030: swal + Owner: Scrin + Location: 201,66 + Actor1031: swal + Owner: Scrin + Location: 202,65 + Actor1032: swal + Owner: Scrin + Location: 201,65 + Actor1033: swal + Owner: Scrin + Location: 202,64 + Actor1034: swal + Owner: Scrin + Location: 203,64 + Actor1035: swal + Owner: Scrin + Location: 203,65 + Actor1036: swal + Owner: Scrin + Location: 203,63 + Actor1037: swal + Owner: Scrin + Location: 204,64 + Actor1038: swal + Owner: Scrin + Location: 204,63 + Actor1039: swal + Owner: Scrin + Location: 205,63 + Actor1040: swal + Owner: Scrin + Location: 206,63 + Actor1041: swal + Owner: Scrin + Location: 207,63 + Actor1042: swal + Owner: Scrin + Location: 208,63 + Actor1043: swal + Owner: Scrin + Location: 209,63 + Actor1044: swal + Owner: Scrin + Location: 213,87 + Actor1045: swal + Owner: Scrin + Location: 214,87 + Actor1046: swal + Owner: Scrin + Location: 215,87 + Actor1047: swal + Owner: Scrin + Location: 217,87 + Actor1048: swal + Owner: Scrin + Location: 216,87 + Actor1049: swal + Owner: Scrin + Location: 218,87 + Actor1050: swal + Owner: Scrin + Location: 219,87 + Actor1051: swal + Owner: Scrin + Location: 218,86 + Actor1052: swal + Owner: Scrin + Location: 219,86 + Actor1053: swal + Owner: Scrin + Location: 219,85 + Actor1054: swal + Owner: Scrin + Location: 220,86 + Actor1055: swal + Owner: Scrin + Location: 220,85 + Actor1056: swal + Owner: Scrin + Location: 225,81 + Actor1057: swal + Owner: Scrin + Location: 225,80 + Actor1058: swal + Owner: Scrin + Location: 226,81 + Actor1059: swal + Owner: Scrin + Location: 226,80 + Actor1060: swal + Owner: Scrin + Location: 226,79 + Actor1061: swal + Owner: Scrin + Location: 227,80 + Actor1062: swal + Owner: Scrin + Location: 227,79 + Actor1063: swal + Owner: Scrin + Location: 227,78 + Actor1064: swal + Owner: Scrin + Location: 228,79 + Actor1065: swal + Owner: Scrin + Location: 228,78 + Actor1066: swal + Owner: Scrin + Location: 228,76 + Actor1067: swal + Owner: Scrin + Location: 228,77 + Actor1068: swal + Owner: Scrin + Location: 229,76 + Actor1069: swal + Owner: Scrin + Location: 229,75 + Actor1070: swal + Owner: Scrin + Location: 228,75 + Actor1071: swal + Owner: Scrin + Location: 229,74 + Actor1072: swal + Owner: Scrin + Location: 230,75 + Actor1073: swal + Owner: Scrin + Location: 230,74 + Actor1074: swal + Owner: Scrin + Location: 231,74 + Actor1075: swal + Owner: Scrin + Location: 231,73 + Actor1076: swal + Owner: Scrin + Location: 230,73 + Actor1077: swal + Owner: Scrin + Location: 232,73 + Actor1078: swal + Owner: Scrin + Location: 233,73 + Actor1079: swal + Owner: Scrin + Location: 234,73 + Actor1080: swal + Owner: Scrin + Location: 234,72 + Actor1081: swal + Owner: Scrin + Location: 233,72 + Actor1082: swal + Owner: Scrin + Location: 211,63 + Actor1083: swal + Owner: Scrin + Location: 210,63 + Actor1084: swal + Owner: Scrin + Location: 211,64 + Actor1085: swal + Owner: Scrin + Location: 212,63 + Actor1086: swal + Owner: Scrin + Location: 212,64 + Actor1087: swal + Owner: Scrin + Location: 212,62 + Actor1088: swal + Owner: Scrin + Location: 213,63 + Actor1089: swal + Owner: Scrin + Location: 213,62 + Actor1090: swal + Owner: Scrin + Location: 213,61 + Actor1091: swal + Owner: Scrin + Location: 214,62 + Actor1092: swal + Owner: Scrin + Location: 214,61 + Actor1093: swal + Owner: Scrin + Location: 214,60 + Actor1094: swal + Owner: Scrin + Location: 215,60 + Actor1095: swal + Owner: Scrin + Location: 215,61 + Actor1096: swal + Owner: Scrin + Location: 216,60 + Actor1097: swal + Owner: Scrin + Location: 217,60 + Actor1098: swal + Owner: Scrin + Location: 218,60 + Actor1099: swal + Owner: Scrin + Location: 219,60 + Actor1100: swal + Owner: Scrin + Location: 220,60 + Actor1101: swal + Owner: Scrin + Location: 221,60 + Actor1102: swal + Owner: Scrin + Location: 223,60 + Actor1103: swal + Owner: Scrin + Location: 222,60 + Actor1104: swal + Owner: Scrin + Location: 223,61 + Actor1105: swal + Owner: Scrin + Location: 222,61 + Actor1106: swal + Owner: Scrin + Location: 224,61 + Actor1107: swal + Owner: Scrin + Location: 224,62 + Actor1108: swal + Owner: Scrin + Location: 223,62 + Actor1109: swal + Owner: Scrin + Location: 225,62 + Actor1110: swal + Owner: Scrin + Location: 225,63 + Actor1111: swal + Owner: Scrin + Location: 224,63 + Actor1112: sfac + Owner: Scrin + Location: 217,64 + Actor1119: scol + Owner: Scrin + Location: 209,82 + Actor1120: scol + Owner: Scrin + Location: 211,84 + Actor1121: scol + Owner: Scrin + Location: 205,73 + Actor1122: scol + Owner: Scrin + Location: 203,71 + Actor1123: scol + Owner: Scrin + Location: 226,78 + Actor1125: scol + Owner: Scrin + Location: 213,86 + Actor1126: scol + Owner: Scrin + Location: 217,86 + Actor1124: scol + Owner: Scrin + Location: 205,64 + Actor1127: ptur + Owner: Scrin + Location: 207,84 + TurretFacing: 459 + Actor1128: ptur + Owner: Scrin + Location: 202,74 + TurretFacing: 261 + Actor1129: ptur + Owner: Scrin + Location: 220,87 + TurretFacing: 642 + Actor1130: shar + Owner: Scrin + Location: 207,67 + Actor1131: shar + Owner: Scrin + Location: 215,83 + Actor1132: shar + Owner: Scrin + Location: 227,73 + Actor1133: shar + Owner: Scrin + Location: 218,61 + Actor1134: mani + Owner: Scrin + Location: 214,66 + Actor1135: sign + Owner: Scrin + Location: 210,66 + Actor1136: proc.scrin + Owner: Scrin + Location: 224,65 + Actor1137: proc.scrin + Owner: Scrin + Location: 220,80 + Actor1138: srep + Owner: Scrin + Location: 212,71 + Actor1139: scrt + Owner: Scrin + Location: 221,64 + Actor1140: silo.scrin + Owner: Scrin + Location: 225,71 + Actor1141: silo.scrin + Owner: Scrin + Location: 225,73 + Actor1142: silo.scrin + Owner: Scrin + Location: 224,72 + Actor1143: silo.scrin + Owner: Scrin + Location: 203,68 + Actor1144: silo.scrin + Owner: Scrin + Location: 204,67 + Actor1145: silo.scrin + Owner: Scrin + Location: 209,64 + Actor1146: nerv + Owner: Scrin + Location: 205,68 + Actor1147: reac + Owner: Scrin + Location: 217,68 + Actor1148: rea2 + Owner: Scrin + Location: 220,57 + Actor1149: rea2 + Owner: Scrin + Location: 217,57 + Actor1150: rea2 + Owner: Scrin + Location: 214,57 + Actor1151: rea2 + Owner: Scrin + Location: 214,54 + Actor1152: rea2 + Owner: Scrin + Location: 217,54 + Actor1153: rea2 + Owner: Scrin + Location: 220,54 + Actor1154: swal + Owner: Scrin + Location: 213,60 + Actor1155: swal + Owner: Scrin + Location: 213,59 + Actor1156: swal + Owner: Scrin + Location: 213,58 + Actor1157: swal + Owner: Scrin + Location: 213,57 + Actor1158: swal + Owner: Scrin + Location: 213,56 + Actor1160: swal + Owner: Scrin + Location: 213,54 + Actor1161: swal + Owner: Scrin + Location: 213,55 + Actor1163: swal + Owner: Scrin + Location: 213,53 + Actor1164: swal + Owner: Scrin + Location: 214,53 + Actor1167: swal + Owner: Scrin + Location: 215,53 + Actor1168: swal + Owner: Scrin + Location: 217,53 + Actor1169: swal + Owner: Scrin + Location: 216,53 + Actor1170: swal + Owner: Scrin + Location: 223,53 + Actor1171: swal + Owner: Scrin + Location: 221,53 + Actor1172: swal + Owner: Scrin + Location: 220,53 + Actor1173: swal + Owner: Scrin + Location: 219,53 + Actor1174: swal + Owner: Scrin + Location: 218,53 + Actor1175: swal + Owner: Scrin + Location: 222,53 + Actor1176: swal + Owner: Scrin + Location: 223,54 + Actor1177: swal + Owner: Scrin + Location: 223,55 + Actor1178: swal + Owner: Scrin + Location: 223,56 + Actor1179: swal + Owner: Scrin + Location: 223,57 + Actor1180: swal + Owner: Scrin + Location: 223,58 + Actor1181: swal + Owner: Scrin + Location: 223,59 + Actor1162: t16 + Owner: Neutral + Location: 106,148 + Actor1184: t02 + Owner: Neutral + Location: 66,146 + Actor1186: tc04 + Owner: Neutral + Location: 69,147 + Actor1187: t07 + Owner: Neutral + Location: 76,148 + Actor1188: t15 + Owner: Neutral + Location: 71,149 + Actor1189: t05 + Owner: Neutral + Location: 74,150 + Actor1191: oilb + Owner: Neutral + Location: 39,163 + Actor1192: oilb + Owner: Neutral + Location: 44,172 + Actor1193: tc04 + Owner: Neutral + Location: 50,173 + Actor419: t16 + Owner: Neutral + Location: 193,220 + Actor1194: split2 + Owner: Neutral + Location: 185,219 + Actor1195: split2 + Owner: Neutral + Location: 175,222 + Actor1196: split2 + Owner: Neutral + Location: 181,223 + Actor1197: tc02 + Owner: Neutral + Location: 134,210 + Actor1198: t07 + Owner: Neutral + Location: 141,215 + Actor1199: tc04 + Owner: Neutral + Location: 143,220 + Actor1200: tc04 + Owner: Neutral + Location: 90,86 + Actor1201: tc01 + Owner: Neutral + Location: 92,84 + Actor1202: t16 + Owner: Neutral + Location: 93,86 + Actor1203: t17 + Owner: Neutral + Location: 91,85 + Actor1204: t13 + Owner: Neutral + Location: 92,88 + Actor1205: t14 + Owner: Neutral + Location: 94,84 + Actor1206: t11 + Owner: Neutral + Location: 96,81 + Actor1207: t16 + Owner: Neutral + Location: 95,88 + Actor1208: t15 + Owner: Neutral + Location: 87,91 + Actor1209: t14 + Owner: Neutral + Location: 72,101 + Actor1210: tc03 + Owner: Neutral + Location: 92,91 + Actor1211: t08 + Owner: Neutral + Location: 83,96 + Actor1212: t06 + Owner: Neutral + Location: 111,77 + Actor1213: t17 + Owner: Neutral + Location: 120,109 + Actor1216: t07 + Owner: Neutral + Location: 88,148 + Actor1265: t07 + Owner: Neutral + Location: 105,165 + Actor1289: miss + Faction: Random + Location: 107,170 + Owner: GDI + Actor1299: t05 + Owner: Neutral + Location: 112,173 + Actor1345: tc01 + Owner: Neutral + Location: 115,182 + Actor1352: split2 + Owner: Neutral + Location: 137,185 + Actor1353: split2 + Owner: Neutral + Location: 134,192 + Actor1354: split2 + Owner: Neutral + Location: 142,193 + Actor1355: t16 + Owner: Neutral + Location: 107,196 + Actor1356: split2 + Owner: Neutral + Location: 119,199 + Actor1357: split2 + Owner: Neutral + Location: 115,202 + Actor1358: t02 + Owner: Neutral + Location: 158,194 + Actor1359: swal + Owner: Scrin + Location: 175,97 + Actor1360: swal + Owner: Scrin + Location: 176,97 + Actor1361: scol + Owner: Scrin + Location: 177,97 + Actor1362: swal + Owner: Scrin + Location: 175,98 + Actor1363: swal + Owner: Scrin + Location: 176,98 + Actor1364: swal + Owner: Scrin + Location: 177,98 + Actor1365: shar + Owner: Scrin + Location: 183,98 + Actor1366: ptur + Owner: Scrin + Location: 175,99 + TurretFacing: 459 + Actor1367: swal + Owner: Scrin + Location: 176,99 + Actor1368: swal + Owner: Scrin + Location: 177,99 + Actor1369: swal + Owner: Scrin + Location: 178,99 + Actor1370: scol + Owner: Scrin + Location: 179,99 + Actor1371: swal + Owner: Scrin + Location: 177,100 + Actor1372: swal + Owner: Scrin + Location: 178,100 + Actor1373: swal + Owner: Scrin + Location: 179,100 + Actor1374: swal + Owner: Scrin + Location: 178,101 + Actor1375: swal + Owner: Scrin + Location: 179,101 + Actor1376: swal + Owner: Scrin + Location: 180,101 + Actor1377: scol + Owner: Scrin + Location: 181,101 + Actor1378: swal + Owner: Scrin + Location: 179,102 + Actor1379: swal + Owner: Scrin + Location: 180,102 + Actor1380: swal + Owner: Scrin + Location: 181,102 + Actor1381: swal + Owner: Scrin + Location: 182,102 + Actor1382: swal + Owner: Scrin + Location: 183,102 + Actor1383: swal + Owner: Scrin + Location: 184,102 + Actor1384: swal + Owner: Scrin + Location: 185,101 + Actor1385: swal + Owner: Scrin + Location: 184,101 + Actor1386: swal + Owner: Scrin + Location: 185,102 + Actor1387: swal + Owner: Scrin + Location: 186,101 + Actor1388: swal + Owner: Scrin + Location: 185,100 + Actor1389: swal + Owner: Scrin + Location: 186,100 + Actor1390: swal + Owner: Scrin + Location: 186,99 + Actor1391: swal + Owner: Scrin + Location: 187,99 + Actor1392: swal + Owner: Scrin + Location: 187,100 + Actor1393: swal + Owner: Scrin + Location: 194,97 + Actor1394: swal + Owner: Scrin + Location: 194,98 + Actor1395: swal + Owner: Scrin + Location: 195,97 + Actor1396: swal + Owner: Scrin + Location: 195,98 + Actor1397: swal + Owner: Scrin + Location: 196,97 + Actor1398: swal + Owner: Scrin + Location: 196,96 + Actor1399: swal + Owner: Scrin + Location: 195,96 + Actor1400: swal + Owner: Scrin + Location: 197,95 + Actor1401: swal + Owner: Scrin + Location: 197,96 + Actor1402: swal + Owner: Scrin + Location: 198,96 + Actor1403: swal + Owner: Scrin + Location: 198,95 + Actor1404: swal + Owner: Scrin + Location: 171,92 + Actor1405: swal + Owner: Scrin + Location: 170,92 + Actor1406: swal + Owner: Scrin + Location: 170,91 + Actor1408: swal + Owner: Scrin + Location: 171,93 + Actor1409: swal + Owner: Scrin + Location: 171,94 + Actor1410: swal + Owner: Scrin + Location: 172,94 + Actor1411: swal + Owner: Scrin + Location: 172,93 + Actor1412: swal + Owner: Scrin + Location: 170,93 + Actor1413: swal + Owner: Scrin + Location: 169,92 + Actor1414: swal + Owner: Scrin + Location: 169,91 + Actor1407: swal + Owner: Scrin + Location: 169,90 + Actor1415: swal + Owner: Scrin + Location: 169,89 + Actor1416: swal + Owner: Scrin + Location: 169,88 + Actor1417: swal + Owner: Scrin + Location: 169,87 + Actor1418: swal + Owner: Scrin + Location: 169,86 + Actor1419: swal + Owner: Scrin + Location: 169,85 + Actor1420: swal + Owner: Scrin + Location: 169,83 + Actor1421: swal + Owner: Scrin + Location: 169,84 + Actor1422: swal + Owner: Scrin + Location: 170,83 + Actor1423: swal + Owner: Scrin + Location: 170,84 + Actor1424: swal + Owner: Scrin + Location: 170,82 + Actor1425: swal + Owner: Scrin + Location: 171,83 + Actor1426: swal + Owner: Scrin + Location: 171,82 + Actor1427: swal + Owner: Scrin + Location: 171,81 + Actor1428: swal + Owner: Scrin + Location: 171,81 + Actor1429: swal + Owner: Scrin + Location: 172,82 + Actor1430: swal + Owner: Scrin + Location: 172,81 + Actor1431: swal + Owner: Scrin + Location: 172,80 + Actor1432: swal + Owner: Scrin + Location: 173,81 + Actor1433: swal + Owner: Scrin + Location: 173,80 + Actor1434: swal + Owner: Scrin + Location: 173,79 + Actor1435: swal + Owner: Scrin + Location: 173,80 + Actor1436: swal + Owner: Scrin + Location: 174,80 + Actor1437: swal + Owner: Scrin + Location: 174,79 + Actor1438: proc.scrin + Owner: Scrin + Location: 176,80 + Actor1439: port + Owner: Scrin + Location: 174,88 + Actor1442: reac + Owner: Scrin + Location: 184,88 + Actor1443: reac + Owner: Scrin + Location: 180,82 + Actor1444: shar + Owner: Scrin + Location: 172,89 + Actor1445: ptur + Owner: Scrin + Location: 169,93 + TurretFacing: 356 + Actor1446: ptur + Owner: Scrin + Location: 177,101 + TurretFacing: 483 + Actor1447: scol + Owner: Scrin + Location: 172,92 + Actor1448: scol + Owner: Scrin + Location: 170,90 + Actor1449: scol + Owner: Scrin + Location: 194,96 + Actor1450: scol + Owner: Scrin + Location: 170,85 + Actor1451: scol + Owner: Scrin + Location: 172,83 + Actor1452: rea2 + Owner: Scrin + Location: 184,81 + Actor1453: rea2 + Owner: Scrin + Location: 184,84 + CameraStart: waypoint + Owner: Neutral + Location: 120,122 + SovietBase: waypoint + Owner: Neutral + Location: 89,120 + CivilianEvac: waypoint + Owner: Neutral + Location: 23,117 + Actor1455: c8 + Owner: Civilian + Facing: 384 + SubCell: 3 + Location: 191,128 + Actor1456: c6 + Owner: Civilian + Facing: 384 + SubCell: 3 + Location: 186,131 + Actor1457: c6 + Owner: Civilian + Facing: 384 + SubCell: 3 + Location: 211,144 + Actor1458: c7 + Owner: Civilian + Facing: 384 + SubCell: 3 + Location: 203,131 + Actor1459: c3 + Owner: Civilian + Facing: 384 + SubCell: 3 + Location: 172,137 + Actor1460: c9 + Owner: Civilian + Facing: 384 + SubCell: 3 + Location: 200,130 + CivilianRetreat1: waypoint + Owner: Neutral + Location: 140,117 + ScrinAttack1: waypoint + Owner: Neutral + Location: 159,95 + ScrinAttack2a: waypoint + Owner: Neutral + Location: 110,87 + ScrinAttack2b: waypoint + Owner: Neutral + Location: 111,108 + Actor1598: c5 + Owner: Civilian + SubCell: 3 + Facing: 384 + Location: 214,139 + Actor1599: c9 + Owner: Civilian + Facing: 384 + SubCell: 3 + Location: 209,134 + Actor1600: c8 + Owner: Civilian + SubCell: 3 + Facing: 384 + Location: 202,122 + Actor1601: c8 + Owner: Civilian + Facing: 384 + SubCell: 3 + Location: 207,148 + Actor1602: c1 + Owner: Civilian + Facing: 384 + SubCell: 3 + Location: 213,147 + Actor1603: c10 + Owner: Civilian + SubCell: 3 + Facing: 384 + Location: 216,151 + Actor1604: c7 + Owner: Civilian + Facing: 384 + SubCell: 3 + Location: 206,116 + GDIAttack1: waypoint + Owner: Neutral + Location: 118,142 + ScrinBase: waypoint + Owner: Neutral + Location: 178,89 + Actor1609: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 118,77 + Actor1612: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 114,76 + Actor1615: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 122,73 + Actor1618: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 117,73 + Actor1619: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 118,76 + Actor1622: lchr + Owner: Scrin + Facing: 384 + Location: 124,70 + Actor1624: tpod + Owner: Scrin + Facing: 384 + Location: 120,72 + Actor1613: brik + Owner: Greece + Location: 15,154 + Actor1614: brik + Owner: Greece + Location: 16,154 + Actor1722: brik + Owner: Greece + Location: 17,154 + Actor1723: brik + Owner: Greece + Location: 18,154 + Actor1724: brik + Owner: Greece + Location: 19,154 + Actor1725: brik + Owner: Greece + Location: 20,154 + Actor1726: brik + Owner: Greece + Location: 20,155 + Actor1727: brik + Owner: Greece + Location: 19,155 + Actor1728: brik + Owner: Greece + Location: 14,154 + Actor1729: brik + Owner: Greece + Location: 13,155 + Actor1730: brik + Owner: Greece + Location: 13,154 + Actor1731: brik + Owner: Greece + Location: 13,156 + Actor1732: brik + Owner: Greece + Location: 13,157 + Actor1733: brik + Owner: Greece + Location: 13,158 + Actor1734: brik + Owner: Greece + Location: 13,159 + Actor1735: brik + Owner: Greece + Location: 13,161 + Actor1736: brik + Owner: Greece + Location: 13,160 + Actor1737: brik + Owner: Greece + Location: 13,162 + Actor1738: brik + Owner: Greece + Location: 13,163 + Actor1739: brik + Owner: Greece + Location: 13,164 + Actor1740: brik + Owner: Greece + Location: 13,166 + Actor1741: brik + Owner: Greece + Location: 13,165 + Actor1742: brik + Owner: Greece + Location: 14,166 + Actor1743: brik + Owner: Greece + Location: 14,165 + Actor1744: brik + Owner: Greece + Location: 18,171 + Actor1745: brik + Owner: Greece + Location: 18,172 + Actor1746: brik + Owner: Greece + Location: 19,172 + Actor1747: brik + Owner: Greece + Location: 19,171 + Actor1748: brik + Owner: Greece + Location: 20,172 + Actor1749: brik + Owner: Greece + Location: 21,172 + Actor1750: brik + Owner: Greece + Location: 22,172 + Actor1751: brik + Owner: Greece + Location: 23,172 + Actor1752: brik + Owner: Greece + Location: 25,172 + Actor1753: brik + Owner: Greece + Location: 24,172 + Actor1754: brik + Owner: Greece + Location: 26,172 + Actor1755: brik + Owner: Greece + Location: 26,171 + Actor1756: brik + Owner: Greece + Location: 25,171 + Actor1757: brik + Owner: Greece + Location: 32,165 + Actor1758: brik + Owner: Greece + Location: 32,164 + Actor1759: brik + Owner: Greece + Location: 33,165 + Actor1760: brik + Owner: Greece + Location: 33,164 + Actor1761: brik + Owner: Greece + Location: 33,163 + Actor1762: brik + Owner: Greece + Location: 33,162 + Actor1763: brik + Owner: Greece + Location: 33,161 + Actor1764: brik + Owner: Greece + Location: 33,160 + Actor1765: brik + Owner: Greece + Location: 33,159 + Actor1766: brik + Owner: Greece + Location: 33,158 + Actor1767: brik + Owner: Greece + Location: 33,157 + Actor1768: brik + Owner: Greece + Location: 32,157 + Actor1769: brik + Owner: Greece + Location: 32,158 + Actor1770: brik + Owner: Greece + Location: 30,157 + Actor1771: brik + Owner: Greece + Location: 28,157 + Actor1772: brik + Owner: Greece + Location: 29,157 + Actor1773: brik + Owner: Greece + Location: 31,157 + Actor1774: brik + Owner: Greece + Location: 27,157 + Actor1775: brik + Owner: Greece + Location: 26,157 + Actor1776: brik + Owner: Greece + Location: 26,158 + Actor1777: brik + Owner: Greece + Location: 27,158 + Actor1778: tent + Owner: Greece + Location: 26,161 + Actor1779: apwr + Owner: Greece + Location: 14,162 + Actor1780: apwr + Owner: Greece + Location: 14,159 + Actor1781: apwr + Owner: Greece + Location: 14,156 + Actor1782: hpad + Owner: Greece + Location: 18,159 + Actor1783: hpad + Owner: Greece + Location: 18,163 + Actor1784: fix + Owner: Greece + Location: 21,160 + Actor1786: fact + Owner: Greece + Location: 18,167 + Actor1787: proc + Owner: Greece + Location: 12,170 + Actor1788: dome + Owner: Greece + Location: 29,160 + Actor1789: powr + Owner: Greece + Location: 23,169 + Actor1790: agun + Owner: Greece + Location: 32,163 + Actor1791: agun + Owner: Greece + Location: 28,158 + Actor1792: agun + Owner: Greece + Location: 18,155 + Actor1793: agun + Owner: Greece + Location: 16,168 + Actor1794: pbox + Owner: Greece + Location: 27,171 + Actor1795: pbox + Owner: Greece + Location: 32,166 + Actor1796: pbox + Owner: Greece + Location: 26,156 + Actor1797: pbox + Owner: Greece + Location: 21,154 + Actor1798: atek + Owner: Greece + Location: 21,164 + Actor1785: weap + Owner: Greece + Location: 24,165 + Actor1799: pris + Owner: Greece + Location: 32,159 + Actor1800: pris + Owner: Greece + Location: 30,158 + Actor1801: pris + Owner: Greece + Location: 26,170 + Actor1802: pdox + Owner: Greece + Location: 10,159 + Actor1803: brik + Owner: Greece + Location: 10,158 + Actor1804: brik + Owner: Greece + Location: 11,158 + Actor1805: brik + Owner: Greece + Location: 12,158 + Actor1806: brik + Owner: Greece + Location: 9,158 + Actor1807: brik + Owner: Greece + Location: 9,159 + Actor1808: brik + Owner: Greece + Location: 9,160 + Actor1809: brik + Owner: Greece + Location: 9,161 + Actor1810: brik + Owner: Greece + Location: 10,161 + Actor1811: brik + Owner: Greece + Location: 11,161 + Actor1812: brik + Owner: Greece + Location: 12,161 + Actor1813: brik + Owner: Greece + Location: 12,159 + Actor1814: brik + Owner: Greece + Location: 12,160 + Actor1815: brik + Owner: Greece + Location: 8,158 + Actor1816: brik + Owner: Greece + Location: 8,159 + Actor1817: brik + Owner: Greece + Location: 8,160 + Actor1818: brik + Owner: Greece + Location: 8,161 + Actor1819: brik + Owner: Greece + Location: 9,162 + Actor1820: brik + Owner: Greece + Location: 10,162 + Actor1821: brik + Owner: Greece + Location: 11,162 + Actor1822: brik + Owner: Greece + Location: 9,157 + Actor1823: brik + Owner: Greece + Location: 10,157 + Actor1824: brik + Owner: Greece + Location: 11,157 + Actor1825: brik + Owner: Greece + Location: 12,157 + Actor1826: brik + Owner: Greece + Location: 12,162 + Actor1827: barb + Owner: Greece + Location: 8,162 + Actor1828: barb + Owner: Greece + Location: 8,163 + Actor1829: barb + Owner: Greece + Location: 9,163 + Actor1830: barb + Owner: Greece + Location: 8,157 + Actor1831: barb + Owner: Greece + Location: 8,156 + Actor1832: barb + Owner: Greece + Location: 9,156 + Actor1836: grav + Owner: Scrin + Location: 188,77 + Actor1837: grav + Owner: Scrin + Location: 188,86 + Actor1838: rea2 + Owner: Scrin + Location: 215,75 + Actor1839: rea2 + Owner: Scrin + Location: 217,72 + Actor1840: rea2 + Owner: Scrin + Location: 219,75 + Actor1841: rea2 + Owner: Scrin + Location: 208,72 + Actor1842: rea2 + Owner: Scrin + Location: 220,68 + SovietAttack2: waypoint + Owner: Neutral + Location: 139,100 + Actor1843: sbag + Owner: Greece + Location: 123,97 + Actor1844: sbag + Owner: Greece + Location: 123,95 + Actor1845: sbag + Owner: Greece + Location: 123,96 + Actor1846: sbag + Owner: Greece + Location: 123,94 + Actor1847: sbag + Owner: Greece + Location: 123,93 + Actor1848: sbag + Owner: Greece + Location: 122,93 + Actor1849: sbag + Owner: Greece + Location: 122,92 + Actor1850: sbag + Owner: Greece + Location: 122,91 + Actor1851: sbag + Owner: Greece + Location: 123,91 + Actor1852: sbag + Owner: Greece + Location: 124,91 + Actor1853: sbag + Owner: Greece + Location: 129,91 + Actor1854: sbag + Owner: Greece + Location: 130,91 + Actor1855: sbag + Owner: Greece + Location: 131,91 + Actor1856: sbag + Owner: Greece + Location: 132,91 + Actor1857: sbag + Owner: Greece + Location: 133,91 + Actor1858: sbag + Owner: Greece + Location: 134,91 + Actor1859: sbag + Owner: Greece + Location: 135,91 + Actor1860: sbag + Owner: Greece + Location: 136,91 + Actor1861: sbag + Owner: Greece + Location: 136,92 + Actor1862: sbag + Owner: Greece + Location: 136,93 + Actor1863: sbag + Owner: Greece + Location: 136,94 + Actor1867: sbag + Owner: Greece + Location: 136,102 + Actor1868: sbag + Owner: Greece + Location: 136,103 + Actor1878: sbag + Owner: Greece + Location: 143,107 + Actor1879: sbag + Owner: Greece + Location: 144,107 + Actor1880: sbag + Owner: Greece + Location: 145,107 + Actor1881: sbag + Owner: Greece + Location: 145,108 + Actor1876: sbag + Owner: Greece + Location: 145,109 + Actor1882: sbag + Owner: Greece + Location: 144,109 + Actor1883: sbag + Owner: Greece + Location: 143,109 + Actor1877: sbag + Owner: Greece + Location: 103,90 + Actor1884: sbag + Owner: Greece + Location: 104,90 + Actor1885: sbag + Owner: Greece + Location: 105,90 + Actor1886: sbag + Owner: Greece + Location: 106,90 + Actor1887: sbag + Owner: Greece + Location: 106,91 + Actor1888: sbag + Owner: Greece + Location: 106,92 + Actor1889: barb + Owner: Greece + Location: 134,90 + Actor1890: barb + Owner: Greece + Location: 136,90 + Actor1891: barb + Owner: Greece + Location: 137,90 + Actor1892: barb + Owner: Greece + Location: 137,91 + Actor1893: barb + Owner: Greece + Location: 137,92 + Actor1894: barb + Owner: Greece + Location: 139,92 + Actor1895: barb + Owner: Greece + Location: 139,93 + Actor1896: barb + Owner: Greece + Location: 138,91 + Actor1897: barb + Owner: Greece + Location: 139,91 + Actor1898: barb + Owner: Greece + Location: 123,90 + Actor1899: barb + Owner: Greece + Location: 123,89 + Actor1900: barb + Owner: Greece + Location: 124,89 + Actor1901: barb + Owner: Greece + Location: 130,90 + Actor1902: barb + Owner: Greece + Location: 130,89 + Actor1903: barb + Owner: Greece + Location: 131,89 + Actor1904: gun + Owner: Greece + Location: 131,90 + TurretFacing: 103 + Actor1905: gun + Owner: Greece + Location: 137,100 + TurretFacing: 729 + Actor1906: gun + Owner: Greece + Location: 138,92 + TurretFacing: 793 + Actor1907: pbox + Owner: Greece + Location: 137,93 + Actor1908: pbox + Owner: Greece + Location: 124,90 + Actor1909: pbox + Owner: Greece + Location: 135,90 + Actor1910: pbox + Owner: Greece + Location: 144,108 + Actor1911: agun + Owner: Greece + Location: 135,92 + Actor1912: agun + Owner: Greece + Location: 123,92 + Actor1913: agun + Owner: Greece + Location: 135,102 + Actor1914: weap + Owner: Greece + Location: 131,92 + Actor1916: tent + Owner: Greece + Location: 125,94 + Actor1917: ifv + Owner: Greece + Location: 129,92 + Facing: 935 + Actor1918: ifv + Owner: Greece + Location: 135,94 + Facing: 753 + Actor1919: ifv + Owner: Greece + Location: 131,97 + Facing: 911 + Actor1921: 2tnk + Owner: Greece + Location: 139,98 + Facing: 777 + Actor1922: 2tnk + Owner: Greece + Location: 138,95 + Facing: 769 + Actor1923: 2tnk + Owner: Greece + Location: 127,90 + Facing: 0 + Actor1925: cryo + Owner: Greece + Location: 125,92 + Facing: 0 + Actor1927: mgg + Owner: Greece + Location: 128,95 + Facing: 384 + Actor1928: arty + Owner: Greece + Location: 130,92 + Facing: 0 + Actor1929: e1 + Owner: Greece + Location: 134,92 + SubCell: 3 + Facing: 0 + Actor1930: e1 + Owner: Greece + Location: 134,92 + SubCell: 1 + Facing: 0 + Actor1931: e1 + Owner: Greece + SubCell: 3 + Location: 138,93 + Facing: 824 + Actor1932: e1 + Owner: Greece + Facing: 384 + Location: 138,93 + SubCell: 1 + Actor1933: e1 + Owner: Greece + Location: 138,93 + SubCell: 2 + Facing: 848 + Actor1934: e1 + Owner: Greece + Location: 133,90 + SubCell: 3 + Facing: 0 + Actor1935: e1 + Owner: Greece + Location: 129,90 + SubCell: 3 + Facing: 0 + Actor1936: e1 + Owner: Greece + SubCell: 3 + Location: 125,91 + Facing: 0 + Actor1937: e1 + Owner: Greece + SubCell: 3 + Location: 137,95 + Facing: 761 + Actor1938: e1 + Owner: Greece + Location: 137,95 + SubCell: 1 + Facing: 689 + Actor1939: e1 + Owner: Greece + SubCell: 3 + Location: 138,99 + Facing: 384 + Actor1940: e1 + Owner: Greece + Location: 137,101 + SubCell: 3 + Facing: 666 + Actor1941: e1 + Owner: Greece + Location: 143,108 + SubCell: 3 + Facing: 856 + Actor1942: e1 + Owner: Greece + Location: 143,108 + SubCell: 1 + Facing: 880 + Actor1943: e1 + Owner: Greece + Location: 142,107 + SubCell: 3 + Facing: 793 + Actor1944: e1 + Owner: Greece + SubCell: 3 + Location: 137,102 + Facing: 793 + Actor1946: medi + Owner: Greece + SubCell: 3 + Location: 137,99 + Facing: 689 + Actor1974: e3 + Owner: Greece + SubCell: 3 + Location: 127,98 + Facing: 737 + Actor1975: e3 + Owner: Greece + SubCell: 3 + Location: 124,97 + Facing: 975 + Actor1976: e3 + Owner: Greece + SubCell: 3 + Location: 132,102 + Facing: 713 + Actor1977: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 134,93 + Actor1979: shrw + Owner: Scrin + Facing: 384 + Location: 116,70 + Actor1980: camera + Location: 118,161 + Faction: zocom + Owner: USSR + Actor1981: camera + Location: 129,159 + Faction: zocom + Owner: USSR + Actor1982: camera + Location: 89,137 + Faction: zocom + Owner: USSR + Actor1983: camera + Location: 103,135 + Faction: zocom + Owner: USSR + Actor1984: camera + Location: 110,127 + Faction: zocom + Owner: USSR + Actor1985: camera + Location: 102,106 + Faction: zocom + Owner: USSR + Actor1986: camera + Location: 87,99 + Faction: zocom + Owner: USSR + Actor1987: camera + Location: 72,101 + Faction: zocom + Owner: USSR + Actor1988: camera + Owner: GDI + Location: 130,87 + Actor1989: camera + Owner: GDI + Location: 141,102 + Actor1990: camera + Location: 159,128 + Faction: zocom + Owner: Nod + Actor1992: camera + Location: 89,132 + Faction: blackh + Owner: GDI + Actor1993: camera + Location: 98,129 + Faction: blackh + Owner: GDI + Actor1994: camera + Location: 114,157 + Faction: blackh + Owner: GDI + Actor1995: camera + Location: 126,155 + Faction: blackh + Owner: GDI + Actor1996: camera + Owner: USSR + Location: 127,86 + Actor1997: camera + Location: 79,105 + Faction: russia + Owner: Greece + Actor1998: camera + Location: 94,105 + Faction: russia + Owner: Greece + Actor1999: camera + Owner: USSR + Location: 167,87 + Actor2000: camera + Location: 174,102 + Faction: russia + Owner: GDI + Actor2001: camera + Owner: Scrin + Location: 136,96 + Actor2002: camera + Owner: Scrin + Location: 124,87 + Actor2003: camera + Owner: Scrin + Location: 140,108 + Actor2004: camera + Location: 155,131 + Faction: reaper + Owner: GDI + Actor2005: camera + Owner: Scrin + Location: 100,125 + Actor2006: camera + Owner: Scrin + Location: 98,111 + Actor2007: camera + Owner: Scrin + Location: 80,107 + Actor2008: camera + Owner: Scrin + Location: 109,82 + Actor2014: port + Owner: Scrin + Location: 182,92 + SealDrop1: waypoint + Owner: Neutral + Location: 115,120 + SealDrop4: waypoint + Owner: Neutral + Location: 117,102 + AlliedCamp: waypoint + Owner: Neutral + Location: 131,96 + SealDropSpawn: waypoint + Owner: Neutral + Location: 1,127 + SealDrop2: waypoint + Owner: Neutral + Location: 116,107 + Actor2021: tc01.husk + Owner: Neutral + Location: 112,145 + Actor2022: t10.husk + Owner: Neutral + Location: 104,149 + Actor2023: t13.husk + Owner: Neutral + Location: 155,147 + Actor2024: tc01.husk + Owner: Neutral + Location: 192,128 + Actor2025: t11.husk + Owner: Neutral + Location: 201,134 + Actor2026: t15.husk + Owner: Neutral + Location: 203,126 + Actor2027: tc02.husk + Owner: Neutral + Location: 198,146 + AirstrikeDest: waypoint + Owner: Neutral + Location: 239,136 + ScrinGroup2: waypoint + Owner: Neutral + Location: 119,74 + Actor1945: devo + Owner: Scrin + Facing: 384 + Location: 116,68 + Actor2062: gscr + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 114,72 + Actor2041: seek + Owner: Scrin + Facing: 384 + Location: 117,71 + Actor2063: rtpd + Owner: Scrin + Facing: 384 + Location: 123,72 + Actor1978: dark + Owner: Scrin + Facing: 384 + Location: 115,79 + Actor2064: gunw + Owner: Scrin + Facing: 384 + Location: 120,77 + Actor2065: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 116,76 + Actor2066: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 115,74 + Actor2067: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 126,74 + Actor1833: tc02 + Owner: Neutral + Location: 146,62 + Actor2069: tc05 + Owner: Neutral + Location: 143,66 + Actor2070: t17 + Owner: Neutral + Location: 143,70 + Actor2071: t08 + Owner: Neutral + Location: 142,69 + Actor2072: t10 + Owner: Neutral + Location: 144,73 + Actor2073: t01 + Owner: Neutral + Location: 143,63 + Actor2074: t05 + Owner: Neutral + Location: 147,58 + Actor2075: t06 + Owner: Neutral + Location: 137,54 + Actor2076: t01 + Owner: Neutral + Location: 142,54 + Actor2077: t12 + Owner: Neutral + Location: 141,55 + Actor2078: t08 + Owner: Neutral + Location: 158,76 + Actor2079: t07 + Owner: Neutral + Location: 156,71 + Actor2080: t05 + Owner: Neutral + Location: 162,67 + Actor2081: t03 + Owner: Neutral + Location: 159,64 + Actor2082: windmill + Owner: Neutral + Location: 159,60 + Actor2083: v18 + Owner: Neutral + Location: 156,68 + Actor2084: v06 + Owner: Neutral + Location: 154,66 + Actor2085: v12 + Owner: Neutral + Location: 156,67 + Actor2086: v17 + Owner: Neutral + Location: 155,68 + Actor2087: brl3 + Owner: Neutral + Location: 121,100 + Actor2088: brl3 + Owner: Neutral + Location: 119,94 + Actor2089: barl + Owner: Neutral + Location: 118,95 + Actor2090: brl3 + Owner: Neutral + Location: 124,100 + Actor2091: barl + Owner: Neutral + Location: 124,101 + Actor2092: barl + Owner: Neutral + Location: 121,102 + Actor2093: barl + Owner: Neutral + Location: 116,93 + Actor2094: v19 + Owner: Neutral + Location: 120,98 + Actor2095: wood + Owner: Neutral + Location: 123,104 + Actor2096: wood + Owner: Neutral + Location: 124,104 + Actor2097: wood + Owner: Neutral + Location: 125,104 + Actor2098: wood + Owner: Neutral + Location: 120,104 + Actor2099: wood + Owner: Neutral + Location: 119,104 + Actor2100: wood + Owner: Neutral + Location: 119,103 + Actor2101: wood + Owner: Neutral + Location: 119,102 + Actor2102: wood + Owner: Neutral + Location: 116,96 + Actor2103: wood + Owner: Neutral + Location: 115,96 + Actor2104: wood + Owner: Neutral + Location: 115,95 + Actor2105: wood + Owner: Neutral + Location: 114,95 + Actor2106: wood + Owner: Neutral + Location: 114,94 + Actor2107: wood + Owner: Neutral + Location: 114,91 + Actor2108: wood + Owner: Neutral + Location: 114,90 + Actor2109: wood + Owner: Neutral + Location: 115,90 + Actor2110: wood + Owner: Neutral + Location: 154,65 + Actor2111: wood + Owner: Neutral + Location: 155,65 + Actor2112: wood + Owner: Neutral + Location: 153,65 + Actor2113: wood + Owner: Neutral + Location: 153,66 + Actor2114: wood + Owner: Neutral + Location: 156,65 + Actor2115: wood + Owner: Neutral + Location: 156,66 + Actor2116: wood + Owner: Neutral + Location: 152,66 + Actor2117: wood + Owner: Neutral + Location: 157,66 + Actor2118: wood + Owner: Neutral + Location: 157,67 + Actor2119: wood + Owner: Neutral + Location: 157,68 + Actor2120: wood + Owner: Neutral + Location: 157,70 + Actor2121: wood + Owner: Neutral + Location: 157,69 + Actor2122: wood + Owner: Neutral + Location: 153,72 + Actor2123: wood + Owner: Neutral + Location: 154,72 + Actor2124: wood + Owner: Neutral + Location: 154,73 + Actor2125: v11 + Owner: Neutral + Location: 153,71 + Actor2126: tc01.husk + Owner: Neutral + Location: 161,107 + Actor2127: t13.husk + Owner: Neutral + Location: 175,111 + Actor2128: tc05 + Owner: Neutral + Location: 168,114 + Actor2129: t17 + Owner: Neutral + Location: 170,112 + Actor2131: t12 + Owner: Neutral + Location: 78,184 + Actor2135: tc01 + Owner: Neutral + Location: 85,162 + Actor2136: t11 + Owner: Neutral + Location: 91,172 + Actor2137: t06 + Owner: Neutral + Location: 82,153 + Actor2130: tc02 + Owner: Neutral + Location: 101,158 + Actor2132: t07 + Owner: Neutral + Location: 92,164 + Actor2133: tc03 + Owner: Neutral + Location: 90,166 + Actor2134: t02 + Owner: Neutral + Location: 91,156 + Actor2138: t17 + Owner: Neutral + Location: 91,161 + Actor2139: t11 + Owner: Neutral + Location: 102,160 + Actor2140: t01 + Owner: Neutral + Location: 100,157 + Actor2141: tc04 + Owner: Neutral + Location: 148,170 + Actor2142: t13 + Owner: Neutral + Location: 154,178 + Actor2143: t17 + Owner: Neutral + Location: 155,172 + Actor2144: t07 + Owner: Neutral + Location: 163,177 + Actor2145: t05 + Owner: Neutral + Location: 142,175 + Actor2146: tc02 + Owner: Neutral + Location: 141,172 + Actor2147: t07 + Owner: Neutral + Location: 142,169 + Actor2152: t05 + Owner: Neutral + Location: 75,70 + Actor2153: t08 + Owner: Neutral + Location: 73,72 + Actor2154: tc04 + Owner: Neutral + Location: 74,71 + Actor2155: tc03 + Owner: Neutral + Location: 75,73 + Actor2156: t06 + Owner: Neutral + Location: 74,75 + Actor2157: t03 + Owner: Neutral + Location: 81,73 + Actor2158: t16 + Owner: Neutral + Location: 84,79 + Actor2159: t11 + Owner: Neutral + Location: 77,77 + Actor2160: t15 + Owner: Neutral + Location: 82,72 + Actor2161: t01 + Owner: Neutral + Location: 82,74 + Actor1875: fix + Owner: Greece + Location: 128,99 + SealDrop3: waypoint + Owner: Neutral + Location: 125,112 + Actor2181: tc04 + Owner: Neutral + Location: 120,154 + Actor2182: split2 + Owner: Neutral + Location: 60,155 + Actor2183: split2 + Owner: Neutral + Location: 56,158 + Actor2178: wsph + Owner: Scrin + Location: 177,86 + Actor2185: wsph + Owner: Scrin + Location: 180,88 + Actor2196: utilpol1 + Owner: Neutral + Location: 110,140 + Actor2195: utilpol2 + Owner: Neutral + Location: 117,140 + Actor2197: utilpol2 + Owner: Neutral + Location: 105,144 + Actor1440: brik + Owner: GDI + Location: 124,163 + Actor1441: brik + Owner: GDI + Location: 123,163 + Actor1454: brik + Owner: GDI + Location: 122,163 + Actor1461: brik + Owner: GDI + Location: 121,163 + Actor1464: brik + Owner: GDI + Location: 119,163 + Actor1465: brik + Owner: GDI + Location: 120,163 + Actor1466: brik + Owner: GDI + Location: 118,163 + Actor1467: brik + Owner: GDI + Location: 117,163 + Actor1469: brik + Owner: GDI + Location: 116,163 + Actor1474: brik + Owner: GDI + Location: 115,163 + Actor1476: brik + Owner: GDI + Location: 114,163 + Actor1477: brik + Owner: GDI + Location: 113,163 + Actor1478: brik + Owner: GDI + Location: 113,164 + Actor1479: brik + Owner: GDI + Location: 114,164 + Actor1480: brik + Owner: GDI + Location: 113,165 + Actor1481: brik + Owner: GDI + Location: 113,166 + Actor1482: brik + Owner: GDI + Location: 113,167 + Actor1483: brik + Owner: GDI + Location: 113,168 + Actor1484: brik + Owner: GDI + Location: 113,169 + Actor1485: brik + Owner: GDI + Location: 114,169 + Actor1486: brik + Owner: GDI + Location: 114,168 + Actor1487: brik + Owner: GDI + Location: 115,169 + Actor1489: brik + Owner: GDI + Location: 115,170 + Actor1490: brik + Owner: GDI + Location: 115,171 + Actor1491: brik + Owner: GDI + Location: 115,172 + Actor1492: brik + Owner: GDI + Location: 116,172 + Actor1493: brik + Owner: GDI + Location: 116,173 + Actor1494: brik + Owner: GDI + Location: 117,173 + Actor1495: brik + Owner: GDI + Location: 118,173 + Actor1496: brik + Owner: GDI + Location: 119,174 + Actor1497: brik + Owner: GDI + Location: 119,173 + Actor1498: brik + Owner: GDI + Location: 119,175 + Actor1499: brik + Owner: GDI + Location: 119,176 + Actor1500: brik + Owner: GDI + Location: 120,177 + Actor1501: brik + Owner: GDI + Location: 119,177 + Actor1502: brik + Owner: GDI + Location: 120,176 + Actor1503: brik + Owner: GDI + Location: 124,164 + Actor1504: brik + Owner: GDI + Location: 123,164 + Actor1505: brik + Owner: GDI + Location: 128,163 + Actor1506: brik + Owner: GDI + Location: 128,164 + Actor1507: brik + Owner: GDI + Location: 129,164 + Actor1508: brik + Owner: GDI + Location: 129,163 + Actor1509: brik + Owner: GDI + Location: 130,163 + Actor1510: brik + Owner: GDI + Location: 131,163 + Actor1511: brik + Owner: GDI + Location: 132,163 + Actor1512: brik + Owner: GDI + Location: 134,163 + Actor1513: brik + Owner: GDI + Location: 133,163 + Actor1514: brik + Owner: GDI + Location: 135,163 + Actor1515: brik + Owner: GDI + Location: 135,163 + Actor1517: brik + Owner: GDI + Location: 136,163 + Actor1526: brik + Owner: GDI + Location: 137,172 + Actor1527: brik + Owner: GDI + Location: 136,172 + Actor1528: brik + Owner: GDI + Location: 137,173 + Actor1529: brik + Owner: GDI + Location: 136,173 + Actor1531: brik + Owner: GDI + Location: 137,174 + Actor1532: brik + Owner: GDI + Location: 137,176 + Actor1533: brik + Owner: GDI + Location: 137,175 + Actor1534: brik + Owner: GDI + Location: 136,177 + Actor1539: brik + Owner: GDI + Location: 136,178 + Actor1542: brik + Owner: GDI + Location: 136,179 + Actor1543: brik + Owner: GDI + Location: 137,177 + Actor1544: brik + Owner: GDI + Location: 136,180 + Actor1547: brik + Owner: GDI + Location: 135,180 + Actor1550: brik + Owner: GDI + Location: 135,179 + Actor1516: brik + Owner: GDI + Location: 136,168 + Actor1518: brik + Owner: GDI + Location: 137,168 + Actor1519: brik + Owner: GDI + Location: 137,167 + Actor1520: brik + Owner: GDI + Location: 136,167 + Actor1521: brik + Owner: GDI + Location: 137,166 + Actor1522: brik + Owner: GDI + Location: 137,165 + Actor1523: brik + Owner: GDI + Location: 137,164 + Actor1524: brik + Owner: GDI + Location: 137,163 + Actor1525: brik + Owner: GDI + Location: 136,164 + Actor1530: sbag + Owner: GDI + Location: 123,160 + Actor1551: sbag + Owner: GDI + Location: 122,160 + Actor1572: sbag + Owner: GDI + Location: 124,160 + Actor1574: sbag + Owner: GDI + Location: 124,161 + Actor1575: sbag + Owner: GDI + Location: 128,161 + Actor1576: sbag + Owner: GDI + Location: 128,160 + Actor1577: sbag + Owner: GDI + Location: 129,160 + Actor1580: sbag + Owner: GDI + Location: 130,160 + Actor1569: sbag + Owner: GDI + Location: 122,161 + Actor1571: sbag + Owner: GDI + Location: 130,161 + Actor1582: sbag + Owner: GDI + Location: 139,162 + Actor1583: sbag + Owner: GDI + Location: 140,161 + Actor1584: sbag + Owner: GDI + Location: 140,162 + Actor1585: sbag + Owner: GDI + Location: 140,160 + Actor1586: sbag + Owner: GDI + Location: 139,160 + Actor1581: nuk2 + Owner: GDI + Location: 120,173 + Actor1587: nuk2 + Owner: GDI + Location: 122,173 + Actor1588: nuk2 + Owner: GDI + Location: 124,173 + Actor1589: nuk2 + Owner: GDI + Location: 120,170 + Actor1590: nuk2 + Owner: GDI + Location: 122,170 + Actor1591: afac + Owner: GDI + Location: 125,169 + Actor1594: weap.td + Owner: GDI + Location: 130,165 + Actor1595: pyle + Owner: GDI + Location: 133,166 + Actor1597: gtwr + Owner: GDI + Location: 129,161 + Actor1605: gtwr + Owner: GDI + Location: 123,161 + Actor1606: atwr + Owner: GDI + Location: 122,164 + Actor1607: atwr + Owner: GDI + Location: 130,164 + Actor1608: atwr + Owner: GDI + Location: 136,166 + Actor1610: atwr + Owner: GDI + Location: 136,174 + Actor1611: atwr + Owner: GDI + Location: 115,164 + Actor1616: htnk.ion + Owner: GDI + Location: 138,161 + Facing: 769 + Actor1617: proc.td + Owner: GDI + Location: 131,179 + Actor1620: proc.td + Owner: GDI + Location: 127,183 + Actor1621: eye + Owner: GDI + Location: 130,173 + Actor1623: hq + Owner: GDI + Location: 116,165 + Actor1625: sbag + Owner: GDI + Location: 132,175 + Actor1626: sbag + Owner: GDI + Location: 132,174 + Actor1627: sbag + Owner: GDI + Location: 132,172 + Actor1628: sbag + Owner: GDI + Location: 132,173 + Actor1640: sbag + Owner: GDI + Location: 131,172 + Actor1645: sbag + Owner: GDI + Location: 130,172 + Actor1655: sbag + Owner: GDI + Location: 129,172 + Actor1660: sbag + Owner: GDI + Location: 129,175 + Actor1661: sbag + Owner: GDI + Location: 129,174 + Actor1662: sbag + Owner: GDI + Location: 129,174 + Actor1663: sbag + Owner: GDI + Location: 129,173 + Actor1656: afld.gdi + Owner: GDI + Location: 121,177 + Actor1657: afld.gdi + Owner: GDI + Location: 121,179 + Actor1658: afld.gdi + Owner: GDI + Location: 121,181 + Actor1659: gtek + Owner: GDI + Location: 126,178 + Actor1666: rep + Owner: GDI + Location: 122,166 + Actor1667: n1 + Owner: GDI + Facing: 384 + Location: 132,168 + SubCell: 3 + Actor1668: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 135,169 + Actor1669: n2r1 + Owner: GDI + Facing: 384 + Location: 135,168 + SubCell: 3 + Actor1678: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 139,158 + Actor1683: n3 + Owner: GDI + SubCell: 3 + Location: 125,162 + Facing: 384 + Warthog2: a10 + Owner: GDI + Location: 115,179 + Facing: 384 + Warthog3: a10 + Owner: GDI + Location: 117,181 + Facing: 384 + Warthog1: a10 + Owner: GDI + Location: 113,181 + Facing: 384 + Actor1705: vulc.ai + Owner: GDI + Location: 126,165 + Facing: 1023 + Actor1706: mtnk + Owner: GDI + Facing: 384 + Location: 128,167 + Actor1715: mtnk + Owner: GDI + Location: 123,159 + Facing: 1023 + Actor1947: mtnk + Owner: GDI + Location: 128,158 + Facing: 71 + Actor1948: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 127,159 + Actor1949: n1 + Owner: GDI + Facing: 384 + Location: 121,160 + SubCell: 3 + Actor1462: brik + Owner: USSR + Location: 86,135 + Actor1463: brik + Owner: USSR + Location: 92,135 + Actor1488: brik + Owner: USSR + Location: 93,135 + Actor1545: brik + Owner: USSR + Location: 92,134 + Actor1546: brik + Owner: USSR + Location: 93,134 + Actor1549: brik + Owner: USSR + Location: 86,134 + Actor1552: brik + Owner: USSR + Location: 85,134 + Actor1553: brik + Owner: USSR + Location: 85,135 + Actor1554: brik + Owner: USSR + Location: 83,135 + Actor1555: brik + Owner: USSR + Location: 84,135 + Actor1556: brik + Owner: USSR + Location: 82,135 + Actor1557: brik + Owner: USSR + Location: 81,134 + Actor1558: brik + Owner: USSR + Location: 81,135 + Actor1559: brik + Owner: USSR + Location: 81,133 + Actor1560: brik + Owner: USSR + Location: 81,132 + Actor1561: brik + Owner: USSR + Location: 81,131 + Actor1562: brik + Owner: USSR + Location: 82,131 + Actor1563: brik + Owner: USSR + Location: 82,132 + Actor1564: brik + Owner: USSR + Location: 76,119 + Actor1565: brik + Owner: USSR + Location: 77,119 + Actor1566: brik + Owner: USSR + Location: 76,118 + Actor1567: brik + Owner: USSR + Location: 77,118 + Actor1568: brik + Owner: USSR + Location: 78,118 + Actor1570: brik + Owner: USSR + Location: 79,118 + Actor1573: brik + Owner: USSR + Location: 80,118 + Actor1578: brik + Owner: USSR + Location: 81,118 + Actor1593: brik + Owner: USSR + Location: 81,117 + Actor1630: brik + Owner: USSR + Location: 90,114 + Actor1631: brik + Owner: USSR + Location: 90,115 + Actor1632: brik + Owner: USSR + Location: 89,115 + Actor1641: brik + Owner: USSR + Location: 101,118 + Actor1642: brik + Owner: USSR + Location: 101,116 + Actor1644: brik + Owner: USSR + Location: 101,117 + Actor1646: brik + Owner: USSR + Location: 101,115 + Actor1650: brik + Owner: USSR + Location: 101,119 + Actor1651: brik + Owner: USSR + Location: 102,119 + Actor1652: brik + Owner: USSR + Location: 103,119 + Actor1653: brik + Owner: USSR + Location: 104,119 + Actor1654: brik + Owner: USSR + Location: 104,120 + Actor1665: brik + Owner: USSR + Location: 103,120 + Actor1672: brik + Owner: USSR + Location: 104,129 + Actor1674: brik + Owner: USSR + Location: 104,130 + Actor1676: brik + Owner: USSR + Location: 104,131 + Actor1677: brik + Owner: USSR + Location: 104,132 + Actor1679: brik + Owner: USSR + Location: 104,134 + Actor1680: brik + Owner: USSR + Location: 104,134 + Actor1681: brik + Owner: USSR + Location: 104,133 + Actor1682: brik + Owner: USSR + Location: 103,134 + Actor1684: brik + Owner: USSR + Location: 104,135 + Actor1685: brik + Owner: USSR + Location: 102,135 + Actor1686: brik + Owner: USSR + Location: 103,135 + Actor1687: brik + Owner: USSR + Location: 101,135 + Actor1688: brik + Owner: USSR + Location: 101,135 + Actor1689: brik + Owner: USSR + Location: 99,135 + Actor1690: brik + Owner: USSR + Location: 99,135 + Actor1691: brik + Owner: USSR + Location: 98,135 + Actor1692: brik + Owner: USSR + Location: 96,135 + Actor1693: brik + Owner: USSR + Location: 95,135 + Actor1694: brik + Owner: USSR + Location: 95,135 + Actor1695: brik + Owner: USSR + Location: 94,135 + Actor1696: brik + Owner: USSR + Location: 97,135 + Actor1697: brik + Owner: USSR + Location: 100,135 + Actor1698: brik + Owner: USSR + Location: 104,120 + Actor1699: brik + Owner: USSR + Location: 104,121 + Actor1700: brik + Owner: USSR + Location: 104,122 + Actor1707: brik + Owner: USSR + Location: 104,123 + Actor1708: brik + Owner: USSR + Location: 103,123 + Actor1709: brik + Owner: USSR + Location: 103,122 + Actor1710: brik + Owner: USSR + Location: 104,128 + Actor1711: brik + Owner: USSR + Location: 104,127 + Actor1712: brik + Owner: USSR + Location: 103,127 + Actor1713: brik + Owner: USSR + Location: 103,128 + Actor1714: brik + Owner: USSR + Location: 101,114 + Actor1634: brik + Owner: USSR + Location: 81,117 + Actor1639: brik + Owner: USSR + Location: 81,116 + Actor1643: brik + Owner: USSR + Location: 81,115 + Actor1647: brik + Owner: USSR + Location: 81,114 + Actor1648: brik + Owner: USSR + Location: 82,114 + Actor1649: brik + Owner: USSR + Location: 82,115 + Actor1673: brik + Owner: USSR + Location: 87,115 + Actor1951: brik + Owner: USSR + Location: 86,115 + Actor1952: brik + Owner: USSR + Location: 86,114 + Actor1953: brik + Owner: USSR + Location: 87,114 + Actor1954: brik + Owner: USSR + Location: 88,115 + Actor1579: tsla + Owner: USSR + Location: 82,116 + Actor1955: tsla + Owner: USSR + Location: 103,121 + Actor1956: tsla + Owner: USSR + Location: 103,129 + Actor1957: tsla + Owner: USSR + Location: 102,134 + Actor1958: tsla + Owner: USSR + Location: 94,134 + Actor1959: tsla + Owner: USSR + Location: 84,134 + Actor1548: apoc + Owner: USSR + Location: 107,125 + Facing: 761 + Actor1960: trpc + Owner: USSR + Location: 101,141 + Facing: 658 + Actor1961: ovld.atomic + Owner: USSR + Location: 101,145 + Facing: 761 + Stance: AttackAnything + Actor1962: ovld.atomic + Owner: USSR + Location: 108,143 + Facing: 634 + Stance: AttackAnything + Actor1963: ovld.erad.atomic + Owner: USSR + Location: 102,148 + Facing: 682 + Stance: AttackAnything + Actor1964: ovld.erad.atomic + Owner: USSR + Location: 109,136 + Facing: 697 + Actor1965: btr.yuri.ai + Owner: USSR + Location: 108,138 + Facing: 753 + Actor1966: btr.yuri.ai + Owner: USSR + Location: 95,146 + Facing: 261 + Stance: AttackAnything + Actor1967: e1 + Owner: USSR + SubCell: 3 + Location: 104,146 + Facing: 697 + Actor1968: e1 + Owner: USSR + SubCell: 3 + Location: 107,146 + Facing: 808 + Actor1969: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 109,141 + Actor1970: e1 + Owner: USSR + SubCell: 3 + Location: 105,139 + Facing: 800 + Actor1971: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 99,144 + Actor1972: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 98,147 + Actor1973: shok + Owner: USSR + SubCell: 3 + Location: 110,139 + TurretFacing: 594 + Facing: 1023 + Actor2009: shok + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 104,143 + Actor2010: e3 + Owner: USSR + SubCell: 3 + Location: 108,141 + Facing: 384 + Actor2011: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 99,145 + Actor2012: e3 + Owner: USSR + SubCell: 3 + Location: 105,146 + Facing: 785 + Actor2013: dog + Owner: USSR + SubCell: 3 + Location: 107,122 + Facing: 737 + Actor2015: e1 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 106,124 + Actor2016: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 105,127 + Actor2017: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 91,137 + Actor2018: e1 + Owner: USSR + Location: 92,137 + SubCell: 3 + Facing: 539 + Actor2030: e1 + Owner: USSR + Location: 90,138 + SubCell: 3 + Facing: 618 + Actor2031: e1 + Owner: USSR + SubCell: 3 + Location: 84,112 + Facing: 689 + Actor2032: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 82,112 + Actor2035: e1 + Owner: USSR + SubCell: 3 + Location: 96,111 + Facing: 745 + Actor2036: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 95,110 + Actor2038: fact + Owner: USSR + Location: 88,123 + Actor2039: proc + Owner: USSR + Location: 82,125 + Actor2040: proc + Owner: USSR + Location: 80,121 + Actor2042: silo + Owner: USSR + Location: 79,119 + Actor2047: silo + Owner: USSR + Location: 80,119 + Actor2048: silo + Owner: USSR + Location: 78,119 + SovietSouthFactory: weap + Owner: USSR + Location: 99,120 + Actor2050: dome + Owner: USSR + Location: 88,116 + Actor2051: tpwr + Owner: USSR + Location: 95,130 + Actor2052: tpwr + Owner: USSR + Location: 98,130 + Actor2053: npwr + Owner: USSR + Location: 84,120 + SovietSouthBarracks: barr + Owner: USSR + Location: 95,121 + Actor2055: tpwr + Owner: USSR + Location: 92,130 + Actor2056: kenn + Owner: USSR + Location: 101,128 + Actor2057: cvat + Owner: USSR + Location: 91,116 + Actor2058: munp + Owner: USSR + Location: 84,130 + Actor2059: indp + Owner: USSR + Location: 95,126 + Actor2060: 3tnk.rhino.yuri + Owner: USSR + Location: 96,113 + Facing: 1023 + Actor2061: 3tnk.rhino.yuri + Owner: USSR + Location: 84,113 + Facing: 1023 + Actor2151: isu + Owner: USSR + Location: 107,129 + Facing: 761 + Actor2162: titn.rail + Owner: GDI + Location: 119,159 + Facing: 0 + Actor2163: thwk + Owner: GDI + Location: 114,159 + Facing: 95 + Stance: AttackAnything + Actor2164: thwk + Owner: GDI + Location: 118,156 + Facing: 158 + Stance: AttackAnything + Actor2165: nukc + Owner: USSR + Location: 105,141 + TurretFacing: 0 + Stance: AttackAnything + TurretFacing@Deployer: 0 + Facing: 512 + DeployState: Undeployed + Actor2169: tc05 + Owner: Neutral + Location: 118,144 + Actor2171: tc04 + Owner: Neutral + Location: 131,154 + Actor2172: tc05 + Owner: Neutral + Location: 133,154 + Actor2173: tc03 + Owner: Neutral + Location: 121,149 + Actor2175: tc05 + Owner: Neutral + Location: 152,134 + Actor2176: tc04 + Owner: Neutral + Location: 153,132 + Actor2177: tc02 + Owner: Neutral + Location: 155,133 + Actor2180: tc01 + Owner: Neutral + Location: 155,132 + Actor2186: tc05 + Owner: Neutral + Location: 160,125 + Actor2187: t14 + Owner: Neutral + Location: 161,127 + GDICamp: waypoint + Owner: Neutral + Location: 140,137 + CivilianRetreat2: waypoint + Owner: Neutral + Location: 126,160 + Actor1864: fact + Owner: Greece + Location: 133,97 + Actor1865: alhq + Owner: Greece + Location: 131,103 + Actor1866: sbag + Owner: Greece + Location: 135,103 + Actor1869: sbag + Owner: Greece + Location: 135,101 + Actor1870: sbag + Owner: Greece + Location: 136,101 + Actor1872: sbag + Owner: Greece + Location: 129,110 + Actor1873: sbag + Owner: Greece + Location: 130,110 + Actor1920: sbag + Owner: Greece + Location: 128,110 + Actor1924: sbag + Owner: Greece + Location: 128,109 + Actor1926: sbag + Owner: Greece + Location: 130,109 + Actor1871: pris + Owner: Greece + Location: 129,109 + Actor2193: proc + Owner: Greece + Location: 124,105 + Actor2194: cryt + Owner: Greece + SubCell: 3 + Location: 138,98 + Facing: 729 + Actor2198: cryt + Owner: Greece + Location: 138,94 + SubCell: 3 + Facing: 896 + Actor2199: cryt + Owner: Greece + Location: 129,89 + SubCell: 3 + Facing: 745 + Actor2200: cryt + Owner: Greece + Facing: 384 + Location: 126,90 + SubCell: 3 + Actor2201: zeus + Owner: Greece + Location: 137,98 + Facing: 769 + Actor2202: zeus + Owner: Greece + Location: 128,91 + Facing: 0 + Actor2212: minv + Owner: Greece + Location: 149,109 + Actor2218: mgg + Owner: Greece + Facing: 384 + Location: 141,109 + Actor2219: medi + Owner: Greece + Facing: 384 + Location: 142,109 + SubCell: 3 + Actor2220: enfo + Owner: Greece + SubCell: 3 + Facing: 384 + Location: 140,110 + Actor2221: hopl + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 135,104 + Actor2222: enfo + Owner: Greece + Facing: 384 + Location: 127,109 + SubCell: 3 + GDIBase: waypoint + Owner: Neutral + Location: 127,173 + NodAttack1: waypoint + Owner: Neutral + Location: 107,127 + SovietAttack3b: waypoint + Owner: Neutral + Location: 126,163 + Actor2068: tc04 + Owner: Neutral + Location: 103,98 + Actor2167: tc05 + Owner: Neutral + Location: 102,107 + Actor2227: tc04 + Owner: Neutral + Location: 96,103 + Actor2228: tc01 + Owner: Neutral + Location: 106,102 + Actor2229: t11 + Owner: Neutral + Location: 108,99 + Actor2230: tc03 + Owner: Neutral + Location: 114,97 + Actor2231: tc04 + Owner: Neutral + Location: 114,108 + Actor2232: t13 + Owner: Neutral + Location: 124,116 + Actor2233: tc03 + Owner: Neutral + Location: 112,121 + Actor2234: tc05 + Owner: Neutral + Location: 106,116 + Actor2235: t13 + Owner: Neutral + Location: 106,117 + Actor2236: t10 + Owner: Neutral + Location: 107,118 + Actor2237: t12 + Owner: Neutral + Location: 138,120 + Actor2238: tc01 + Owner: Neutral + Location: 139,119 + Actor2239: oblt + Owner: Scrin + Facing: 384 + Location: 170,98 + Actor2244: zrai + Owner: GDI + SubCell: 3 + Location: 116,158 + Facing: 0 + Actor2245: zrai + Owner: GDI + SubCell: 3 + Location: 121,157 + Facing: 158 + Actor2246: ztrp + Owner: GDI + SubCell: 3 + Location: 125,156 + Facing: 7 + Actor2247: ztrp + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 112,161 + Actor2226: sam + Owner: USSR + Location: 102,131 + Actor2223: sam + Owner: USSR + Location: 98,134 + Actor2251: sam + Owner: USSR + Location: 99,118 + Actor2252: nukc + Owner: USSR + Location: 103,125 + Stance: AttackAnything + DeployState: Undeployed + Facing: 768 + SovietAttack3a: waypoint + Owner: Neutral + Location: 116,161 + GDIGroup1: waypoint + Owner: Neutral + Location: 121,158 + SovietGroup1: waypoint + Owner: Neutral + Location: 106,143 + SovietAttack1: waypoint + Owner: Neutral + Location: 130,98 + Actor2241: vulc.ai + Owner: GDI + Location: 111,158 + Facing: 1023 + TurretFacing: 142 + Actor2242: mtnk + Owner: GDI + Location: 115,155 + Facing: 190 + Actor2253: mtnk + Owner: GDI + Location: 119,153 + Facing: 0 + TurretFacing@SECONDARY: 87 + TurretFacing: 198 + Actor1664: syrd + Owner: Greece + Location: 65,33 + Actor1834: fact + Owner: Greece + Location: 69,44 + Actor1835: atek + Owner: Greece + Location: 65,40 + Actor2224: weap + Owner: Greece + Location: 78,43 + AlliesNorthWestFactory: weap + Owner: Greece + Location: 75,48 + Actor2254: gap + Owner: Greece + Location: 74,46 + Actor2255: agun + Owner: Greece + Location: 81,51 + Actor2256: agun + Owner: Greece + Location: 70,53 + Actor2257: agun + Owner: Greece + Location: 63,45 + Actor2258: hpad + Owner: Greece + Location: 71,39 + Actor2259: hpad + Owner: Greece + Location: 74,39 + Actor2260: apwr + Owner: Greece + Location: 61,49 + Actor2261: apwr + Owner: Greece + Location: 64,49 + Actor2262: apwr + Owner: Greece + Location: 67,49 + AlliesNorthWestBarracks: tent + Owner: Greece + Location: 72,48 + Actor2264: tent + Owner: Greece + Location: 75,43 + Actor2265: brik + Owner: Greece + Location: 79,37 + Actor2266: brik + Owner: Greece + Location: 79,38 + Actor2267: brik + Owner: Greece + Location: 78,38 + Actor2268: brik + Owner: Greece + Location: 78,37 + Actor2269: brik + Owner: Greece + Location: 80,38 + Actor2270: brik + Owner: Greece + Location: 81,38 + Actor2271: brik + Owner: Greece + Location: 82,38 + Actor2272: brik + Owner: Greece + Location: 82,39 + Actor2275: brik + Owner: Greece + Location: 82,40 + Actor2276: brik + Owner: Greece + Location: 82,41 + Actor2277: brik + Owner: Greece + Location: 82,42 + Actor2278: brik + Owner: Greece + Location: 83,42 + Actor2279: brik + Owner: Greece + Location: 83,43 + Actor2280: brik + Owner: Greece + Location: 82,43 + Actor2281: brik + Owner: Greece + Location: 83,48 + Actor2282: brik + Owner: Greece + Location: 82,48 + Actor2283: brik + Owner: Greece + Location: 82,49 + Actor2284: brik + Owner: Greece + Location: 83,49 + Actor2285: brik + Owner: Greece + Location: 82,50 + Actor2286: brik + Owner: Greece + Location: 82,51 + Actor2287: brik + Owner: Greece + Location: 82,52 + Actor2288: brik + Owner: Greece + Location: 82,53 + Actor2290: brik + Owner: Greece + Location: 82,54 + Actor2292: brik + Owner: Greece + Location: 82,55 + Actor2293: brik + Owner: Greece + Location: 81,55 + Actor2294: brik + Owner: Greece + Location: 80,55 + Actor2295: brik + Owner: Greece + Location: 79,55 + Actor2302: brik + Owner: Greece + Location: 75,55 + Actor2273: pbox + Owner: Greece + Location: 83,50 + Actor2274: pbox + Owner: Greece + Location: 83,41 + Actor2289: pris + Owner: Greece + Location: 81,54 + Actor2291: pris + Owner: Greece + Location: 81,39 + Actor2309: dome + Owner: Greece + Location: 78,39 + Actor2310: apwr + Owner: Greece + Location: 57,52 + Actor2311: apwr + Owner: Greece + Location: 60,52 + Actor2312: apwr + Owner: Greece + Location: 63,52 + Actor2313: sbag + Owner: Greece + Location: 69,54 + Actor2314: sbag + Owner: Greece + Location: 70,54 + Actor2315: sbag + Owner: Greece + Location: 71,54 + Actor2316: sbag + Owner: Greece + Location: 71,53 + Actor2317: sbag + Owner: Greece + Location: 69,53 + Actor2318: sbag + Owner: Greece + Location: 81,52 + Actor2319: sbag + Owner: Greece + Location: 80,52 + Actor2320: sbag + Owner: Greece + Location: 80,51 + Actor2321: sbag + Owner: Greece + Location: 80,50 + Actor2322: sbag + Owner: Greece + Location: 81,50 + Actor2323: sbag + Owner: Greece + Location: 63,46 + Actor2324: sbag + Owner: Greece + Location: 64,46 + Actor2327: sbag + Owner: Greece + Location: 62,44 + Actor2329: sbag + Owner: Greece + Location: 62,45 + Actor2330: sbag + Owner: Greece + Location: 63,44 + Actor2331: sbag + Owner: Greece + Location: 64,44 + Actor2332: sbag + Owner: Greece + Location: 64,45 + Actor2333: sbag + Owner: Greece + Location: 62,46 + Actor2325: sbag + Owner: Greece + Location: 61,38 + Actor2326: sbag + Owner: Greece + Location: 60,38 + Actor2328: sbag + Owner: Greece + Location: 60,39 + Actor2334: sbag + Owner: Greece + Location: 60,40 + Actor2335: sbag + Owner: Greece + Location: 61,40 + Actor2337: sbag + Owner: Greece + Location: 53,58 + Actor2338: sbag + Owner: Greece + Location: 54,58 + Actor2339: sbag + Owner: Greece + Location: 53,57 + Actor2340: sbag + Owner: Greece + Location: 55,58 + Actor2341: sbag + Owner: Greece + Location: 55,57 + Actor2336: gun + Owner: Greece + Location: 54,57 + TurretFacing: 507 + Actor2342: hbox + Owner: Greece + Location: 58,61 + Actor2343: proc + Owner: Greece + Location: 62,55 + Actor2344: proc + Owner: Greece + Location: 58,56 + Actor2345: apc.ai + Owner: Greece + Location: 77,53 + Facing: 769 + Actor2346: jeep + Owner: Greece + Location: 86,45 + Facing: 777 + Actor2347: 2tnk + Owner: Greece + Location: 63,42 + Facing: 253 + TurretFacing: 0 + Actor2348: ctflag + Owner: Greece + Location: 61,39 + Actor2349: gtnkr2 + Owner: Greece + Location: 79,46 + Facing: 531 + Actor2350: gtnkr2 + Owner: Greece + Location: 76,51 + Facing: 531 + Actor2351: orep + Owner: Greece + Location: 54,53 + Actor2352: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 62,40 + Actor2353: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 83,44 + Actor2354: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 85,48 + Actor2355: e3 + Owner: Greece + SubCell: 3 + Location: 71,56 + Facing: 555 + Actor2356: e3 + Owner: Greece + Facing: 384 + Location: 52,57 + SubCell: 3 + Actor2357: medi + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 75,46 + Actor2296: brik + Owner: Greece + Location: 75,56 + Actor2297: brik + Owner: Greece + Location: 79,56 + Actor2298: brik + Owner: Greece + Location: 80,56 + Actor2299: brik + Owner: Greece + Location: 72,57 + Actor2300: brik + Owner: Greece + Location: 72,56 + Actor2301: brik + Owner: Greece + Location: 76,56 + Actor2304: brik + Owner: Greece + Location: 76,55 + Actor2307: brik + Owner: Greece + Location: 74,56 + Actor2303: brik + Owner: Greece + Location: 73,56 + Actor2305: brik + Owner: Greece + Location: 73,57 + Actor2306: pris + Owner: Greece + Location: 74,55 + Actor2225: ovld + Owner: USSR + Location: 78,115 + Facing: 253 + Actor2263: apoc + Owner: USSR + Location: 103,113 + Facing: 1023 + Actor2308: ftur + Owner: USSR + Location: 94,111 + Actor1633: brik + Owner: USSR + Location: 94,112 + Actor1635: brik + Owner: USSR + Location: 98,113 + Actor1636: brik + Owner: USSR + Location: 98,112 + Actor1637: brik + Owner: USSR + Location: 99,112 + Actor1638: brik + Owner: USSR + Location: 99,113 + Actor1716: brik + Owner: USSR + Location: 100,112 + Actor1718: brik + Owner: USSR + Location: 101,113 + Actor1720: brik + Owner: USSR + Location: 101,112 + Actor1675: brik + Owner: USSR + Location: 95,112 + Actor1717: brik + Owner: USSR + Location: 95,113 + Actor1719: brik + Owner: USSR + Location: 94,113 + Actor1721: brik + Owner: USSR + Location: 93,112 + Actor1950: brik + Owner: USSR + Location: 92,112 + Actor2037: brik + Owner: USSR + Location: 92,112 + Actor2358: brik + Owner: USSR + Location: 92,113 + Actor2359: brik + Owner: USSR + Location: 91,113 + Actor2360: brik + Owner: USSR + Location: 91,114 + Actor1592: tsla + Owner: USSR + Location: 93,113 + Actor2361: tsla + Owner: USSR + Location: 100,113 + Actor1629: ftur + Owner: USSR + Location: 99,111 + SovietNorthBarracks: barr + Owner: USSR + Location: 93,114 + SovietNorthFactory: weap + Owner: USSR + Location: 98,114 + Actor2049: fenc + Owner: USSR + Location: 96,106 + Actor2054: fenc + Owner: USSR + Location: 97,106 + Actor2166: fenc + Owner: USSR + Location: 98,106 + Actor2362: fenc + Owner: USSR + Location: 105,109 + Actor2363: fenc + Owner: USSR + Location: 106,110 + Actor2364: fenc + Owner: USSR + Location: 105,109 + Actor2365: fenc + Owner: USSR + Location: 106,109 + AlliesBase: waypoint + Owner: Neutral + Location: 72,47 + Actor2366: tc03 + Owner: Neutral + Location: 50,124 + Actor2367: tc05 + Owner: Neutral + Location: 59,128 + Actor2368: tc04 + Owner: Neutral + Location: 60,135 + Actor2369: t10 + Owner: Neutral + Location: 57,122 + Actor2370: t03 + Owner: Neutral + Location: 58,120 + Actor2371: t02 + Owner: Neutral + Location: 61,114 + Actor2372: t07 + Owner: Neutral + Location: 66,121 + Actor2373: t15 + Owner: Neutral + Location: 47,131 + Actor2374: t16 + Owner: Neutral + Location: 49,132 + Actor2375: t17 + Owner: Neutral + Location: 53,135 + Actor2376: t08 + Owner: Neutral + Location: 69,129 + Actor2377: t05 + Owner: Neutral + Location: 52,110 + Actor2378: t07 + Owner: Neutral + Location: 43,121 + Actor2379: fenc + Owner: USSR + Location: 50,127 + Actor2380: fenc + Owner: USSR + Location: 51,127 + Actor2381: fenc + Owner: USSR + Location: 52,127 + Actor2382: fenc + Owner: USSR + Location: 54,126 + Actor2383: fenc + Owner: USSR + Location: 55,126 + Actor2384: fenc + Owner: USSR + Location: 56,126 + Actor2385: fenc + Owner: USSR + Location: 57,126 + Actor2386: fenc + Owner: USSR + Location: 49,127 + Actor2387: fenc + Owner: USSR + Location: 58,126 + Actor2388: fenc + Owner: USSR + Location: 59,126 + Actor2389: fenc + Owner: USSR + Location: 67,126 + Actor2390: fenc + Owner: USSR + Location: 66,126 + Actor2391: fenc + Owner: USSR + Location: 62,123 + Actor2392: fenc + Owner: USSR + Location: 63,123 + Actor2393: fenc + Owner: USSR + Location: 64,123 + Actor2394: fenc + Owner: USSR + Location: 61,123 + Actor2395: fenc + Owner: USSR + Location: 59,125 + Actor2396: fenc + Owner: USSR + Location: 59,124 + Actor2397: fenc + Owner: USSR + Location: 60,124 + Actor2398: fenc + Owner: USSR + Location: 60,123 + Actor2399: fenc + Owner: USSR + Location: 64,122 + Actor2401: ftur + Owner: USSR + Location: 51,128 + Actor2402: ftur + Owner: USSR + Location: 56,127 + Actor2400: sam + Owner: USSR + Location: 62,122 + Actor2403: ovld.atomic + Owner: USSR + Location: 53,124 + Facing: 512 + Actor2404: grad + Owner: USSR + Facing: 384 + Location: 61,121 + Actor2405: 3tnk.rhino + Owner: USSR + Location: 48,113 + Facing: 95 + Actor2406: 3tnk.rhino + Owner: USSR + Location: 50,115 + Facing: 103 + Actor2407: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 47,115 + Actor2408: e1 + Owner: USSR + SubCell: 3 + Location: 51,114 + Facing: 721 + Actor2409: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 55,125 + Actor2410: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 49,128 + Actor2411: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 61,125 + Actor2412: e1 + Owner: USSR + SubCell: 3 + Location: 58,118 + Facing: 142 + Actor2413: n4 + Owner: USSR + SubCell: 3 + Location: 65,124 + Facing: 483 + Actor2414: ttrp + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 52,120 + Actor2415: ttrp + Owner: USSR + SubCell: 3 + Location: 56,125 + Facing: 634 + Actor2416: deso + Owner: USSR + SubCell: 3 + Location: 49,123 + Facing: 634 + Actor2417: trpc + Owner: USSR + Location: 52,117 + Facing: 118 + Actor2418: macs + Owner: USSR + Location: 64,118 + Actor2419: fenc + Owner: USSR + Location: 65,117 + Actor2420: fenc + Owner: USSR + Location: 66,117 + Actor2421: fenc + Owner: USSR + Location: 64,117 + Actor2422: fenc + Owner: USSR + Location: 66,118 + Actor2423: fenc + Owner: USSR + Location: 66,119 + Actor2424: fenc + Owner: USSR + Location: 67,119 + Actor2425: fenc + Owner: USSR + Location: 68,119 + Actor2426: fenc + Owner: USSR + Location: 68,120 + Aurora2: auro + Owner: GDI + Location: 105,182 + Facing: 384 + Aurora1: auro + Owner: GDI + Location: 102,184 + Facing: 384 + Actor1596: tc01 + Owner: Neutral + Location: 134,114 + Actor1670: t11 + Owner: Neutral + Location: 130,112 + Actor1671: t12 + Owner: Neutral + Location: 128,114 + Actor1701: t08 + Owner: Neutral + Location: 134,113 + Actor1702: t16 + Owner: Neutral + Location: 126,113 + Actor1703: t01 + Owner: Neutral + Location: 131,114 + Actor1704: tc04 + Owner: Neutral + Location: 132,109 + Actor1874: tc05 + Owner: Neutral + Location: 134,109 + Actor1915: tc03 + Owner: Neutral + Location: 137,111 + Actor1991: tc01 + Owner: Neutral + Location: 133,110 + Actor2019: t11 + Owner: Neutral + Location: 125,110 + Actor2020: t11 + Owner: Neutral + Location: 125,114 + Actor2028: tc01 + Owner: Neutral + Location: 124,114 + Actor2029: tc04 + Owner: Neutral + Location: 122,113 + Actor2033: tc05 + Owner: Neutral + Location: 122,111 + Actor2034: oilr + Owner: Neutral + Location: 142,122 + Actor2043: rushouse4 + Owner: Neutral + Location: 146,126 + Actor2044: rushouse3 + Owner: Neutral + Location: 137,125 + Actor2045: rushouse3 + Owner: Neutral + Location: 140,133 + Actor2148: brl3 + Owner: Neutral + Location: 142,132 + Actor2149: barl + Owner: Neutral + Location: 141,132 + Actor2150: rushouse2 + Owner: Neutral + Location: 138,127 + Actor2168: rushouse2 + Owner: Neutral + Location: 146,129 + Actor2170: rushouse + Owner: Neutral + Location: 141,136 + Actor2174: ammobox1 + Owner: Neutral + Location: 140,126 + Actor2179: ammobox2 + Owner: Neutral + Location: 140,127 + Actor2046: arco + Owner: Neutral + Location: 140,130 + Actor2188: utilpol2 + Owner: Neutral + Location: 138,130 + Actor2190: tanktrap1 + Owner: Neutral + Location: 138,134 + Actor2191: tanktrap1 + Owner: Neutral + Location: 136,136 + Actor2192: tanktrap1 + Owner: Neutral + Location: 136,130 + Actor2189: tanktrap1 + Owner: Neutral + Location: 136,132 + Actor2203: utilpol2 + Owner: Neutral + Location: 140,124 + Actor2204: utilpol1 + Owner: Neutral + Location: 146,124 + Actor2205: t12 + Owner: Neutral + Location: 144,128 + Actor2206: tc01 + Owner: Neutral + Location: 144,134 + Actor2207: tc03 + Owner: Neutral + Location: 137,123 + Actor2208: macs + Owner: Neutral + Location: 143,131 + Actor2209: rushouse3 + Owner: Neutral + Location: 153,126 + Actor2210: rushouse3 + Owner: Neutral + Location: 156,129 + Actor2211: rushouse2 + Owner: Neutral + Location: 153,129 + Actor2213: rushouse2 + Owner: Neutral + Location: 156,126 + Actor2214: tc01 + Owner: Neutral + Location: 149,129 + Actor2215: tc05 + Owner: Neutral + Location: 149,124 + Actor2216: tc03 + Owner: Neutral + Location: 149,131 + Actor2217: tanktrap1 + Owner: Neutral + Location: 148,128 + Actor2240: tanktrap1 + Owner: Neutral + Location: 143,125 + Actor2243: tanktrap1 + Owner: Neutral + Location: 140,122 + Actor2248: tanktrap1 + Owner: Neutral + Location: 142,120 + Actor2249: tanktrap1 + Owner: Neutral + Location: 146,122 + Actor2250: tanktrap1 + Owner: Neutral + Location: 142,138 + Actor2427: tanktrap1 + Owner: Neutral + Location: 142,135 + Actor2428: tanktrap1 + Owner: Neutral + Location: 147,132 + Actor2429: brl3 + Owner: Neutral + Location: 145,124 + Actor2430: barl + Owner: Neutral + Location: 144,124 + Actor2431: c1 + Owner: Civilian + Facing: 384 + SubCell: 3 + Location: 154,128 + Actor2432: c3 + Owner: Civilian + Facing: 384 + SubCell: 3 + Location: 155,128 + Actor2433: c6 + Owner: Civilian + Location: 155,129 + SubCell: 3 + Facing: 384 + Actor2434: c7 + Owner: Civilian + SubCell: 3 + Location: 145,131 + Facing: 384 + Actor2435: c3 + Owner: Civilian + Facing: 384 + Location: 145,127 + SubCell: 3 + Actor2436: c4 + Owner: Civilian + Facing: 384 + SubCell: 3 + Location: 141,126 + Actor2437: c9 + Owner: Civilian + Facing: 384 + SubCell: 3 + Location: 142,133 + Actor2438: tecn + Owner: Civilian + Facing: 384 + SubCell: 3 + Location: 142,137 + Actor2439: c10 + Owner: Civilian + Facing: 384 + SubCell: 3 + Location: 140,135 + Actor2440: v01 + Owner: Civilian + Location: 121,126 + Actor2441: t01 + Owner: Neutral + Faction: zocom + Location: 123,126 + Actor2442: t11 + Owner: Neutral + Faction: zocom + Location: 119,124 + Actor2443: tc03 + Owner: Neutral + Faction: zocom + Location: 122,123 + Actor2444: tc01 + Owner: Neutral + Faction: zocom + Location: 153,116 + Actor2445: tc02 + Owner: Neutral + Faction: zocom + Location: 156,114 + Actor2446: tc05 + Owner: Neutral + Faction: zocom + Location: 152,122 + Actor2447: tc04 + Owner: Neutral + Faction: zocom + Location: 156,118 + Actor2448: tc03 + Owner: Neutral + Faction: zocom + Location: 157,120 + Actor2449: tc01 + Owner: Neutral + Faction: zocom + Location: 148,112 + Actor2450: t15 + Owner: Neutral + Faction: zocom + Location: 148,113 + Actor2451: hosp + Faction: zocom + Location: 149,138 + Owner: Neutral + Actor2452: utilpol2 + Owner: Neutral + Faction: zocom + Location: 159,130 + Actor2453: utilpol2 + Owner: Neutral + Faction: zocom + Location: 166,133 + Actor2454: utilpol1 + Owner: Neutral + Faction: zocom + Location: 171,137 + Actor2455: tanktrap1 + Owner: Neutral + Faction: zocom + Location: 150,143 + Actor2456: tanktrap1 + Owner: Neutral + Faction: zocom + Location: 148,143 + Actor2457: tanktrap1 + Owner: Neutral + Faction: zocom + Location: 146,145 + Actor2458: tanktrap1 + Owner: Neutral + Faction: zocom + Location: 148,146 + Actor2459: boxes09 + Owner: Neutral + Faction: zocom + Location: 151,138 + Actor2460: boxes08 + Owner: Neutral + Faction: zocom + Location: 151,139 + Actor2461: utilpol2 + Owner: Neutral + Faction: zocom + Location: 149,136 + Actor2462: t14 + Owner: Neutral + Faction: zocom + Location: 146,142 + Actor2463: tc01 + Owner: Neutral + Faction: zocom + Location: 150,135 + Actor2464: tc05 + Owner: Neutral + Faction: zocom + Location: 151,142 + Actor2466: tc01 + Owner: Neutral + Faction: zocom + Location: 142,140 + Actor2467: moebius + Owner: Civilian + Facing: 384 + SubCell: 3 + Location: 148,139 + Actor2468: split2 + Owner: Neutral + Location: 142,143 + Actor2469: split3 + Owner: Neutral + Location: 137,120 + Actor2470: split2 + Owner: Neutral + Location: 124,121 + Actor2471: split2 + Owner: Neutral + Location: 122,143 + Actor2475: barb + Owner: Neutral + Location: 156,125 + Actor2476: barb + Owner: Neutral + Location: 157,125 + Actor2477: barb + Owner: Neutral + Location: 154,125 + Actor2478: barb + Owner: Neutral + Location: 153,125 + Actor2479: barb + Owner: Neutral + Location: 144,121 + Actor2480: barb + Owner: Neutral + Location: 143,121 + Actor2481: barb + Owner: Neutral + Location: 142,121 + Actor2482: barb + Owner: Neutral + Location: 141,121 + Actor2483: barb + Owner: Neutral + Location: 141,122 + Actor2484: barb + Owner: Neutral + Location: 141,123 + Actor2485: barb + Owner: Neutral + Location: 145,121 + Actor2486: barb + Owner: Neutral + Location: 145,122 + Actor2487: barb + Owner: Neutral + Location: 145,123 + Actor2488: barb + Owner: Neutral + Location: 136,128 + Actor2489: barb + Owner: Neutral + Location: 136,127 + Actor2490: barb + Owner: Neutral + Location: 136,126 + Actor2491: barb + Owner: Neutral + Location: 139,134 + Actor2492: barb + Owner: Neutral + Location: 139,133 + Actor2493: barb + Owner: Neutral + Location: 139,132 + Actor2494: barb + Owner: Neutral + Location: 139,139 + Actor2495: barb + Owner: Neutral + Location: 139,138 + Actor2496: barb + Owner: Neutral + Location: 140,139 + Actor2497: barb + Owner: Neutral + Location: 141,139 + Actor2498: barb + Owner: Neutral + Location: 148,134 + Actor2499: barb + Owner: Neutral + Location: 148,135 + Actor2500: barb + Owner: Neutral + Location: 148,133 + Actor2501: barb + Owner: Neutral + Location: 148,132 + Actor2503: barb + Owner: Neutral + Location: 157,131 + Actor2506: barb + Owner: Neutral + Location: 158,125 + Actor2507: barb + Owner: Neutral + Location: 153,131 + Actor2508: barb + Owner: Neutral + Location: 152,131 + Actor2509: barb + Owner: Neutral + Location: 152,130 + Actor2510: barb + Owner: Neutral + Location: 152,141 + Actor2511: barb + Owner: Neutral + Location: 152,142 + Actor2512: barb + Owner: Neutral + Location: 151,142 + Actor2472: barb + Owner: Neutral + Location: 152,138 + Actor2473: barb + Owner: Neutral + Location: 152,137 + Actor2474: barb + Owner: Neutral + Location: 150,137 + Actor2514: barb + Owner: Neutral + Location: 151,137 + Actor2513: wood + Owner: Neutral + Location: 149,160 + Actor2515: wood + Owner: Neutral + Location: 148,160 + Actor2516: wood + Owner: Neutral + Location: 147,160 + Actor2517: wood + Owner: Neutral + Location: 150,160 + Actor2518: tanktrap1 + Owner: Neutral + Location: 148,157 + Actor2519: tanktrap1 + Owner: Neutral + Location: 144,157 + Actor2520: tanktrap1 + Owner: Neutral + Location: 151,157 + Actor2521: reap + Owner: Nod + SubCell: 3 + Location: 167,129 + Facing: 499 + Actor2522: reap + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 166,127 + Actor2524: assa + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 169,133 + Actor2525: assa + Owner: Nod + SubCell: 3 + Location: 160,132 + Facing: 222 + Actor2526: assa + Owner: Nod + Facing: 384 + SubCell: 1 + Location: 161,128 + Actor2527: avtr + Owner: Nod + Location: 161,129 + Facing: 253 + Stance: AttackAnything + Actor2528: avtr + Owner: Nod + Location: 172,135 + Stance: AttackAnything + Facing: 523 + Actor2529: avtr + Owner: Nod + Location: 164,133 + Stance: AttackAnything + Facing: 333 + ScrinGroup1: waypoint + Owner: Neutral + Location: 170,99 + Actor2184: rushouse3 + Owner: Neutral + Location: 159,136 + Actor2465: rushouse3 + Owner: Neutral + Location: 161,136 + Actor2502: rushouse3 + Owner: Neutral + Location: 163,136 + Actor2504: rushouse2 + Owner: Neutral + Location: 163,139 + Actor2505: rushouse2 + Owner: Neutral + Location: 161,139 + Actor2530: rushouse2 + Owner: Neutral + Location: 159,139 + Actor2531: rushouse4 + Owner: Neutral + Location: 155,138 + Actor2532: tc02 + Owner: Neutral + Location: 160,142 + Actor2533: t15 + Owner: Neutral + Location: 161,142 + Actor2534: t06 + Owner: Neutral + Location: 163,142 + Actor2535: t02 + Owner: Neutral + Location: 164,142 + Actor2536: t01 + Owner: Neutral + Location: 163,142 + Actor2537: t11 + Owner: Neutral + Location: 160,133 + Actor2539: t01 + Owner: Neutral + Location: 161,133 + Actor2538: t17 + Owner: Neutral + Location: 161,133 + Actor2540: t17 + Owner: Neutral + Location: 162,133 + Actor2541: tanktrap1 + Owner: Neutral + Location: 157,140 + Actor2542: tanktrap1 + Owner: Neutral + Location: 158,135 + Actor2543: utilpol2 + Owner: Neutral + Location: 165,137 + Actor2544: tc05 + Owner: Neutral + Location: 168,140 + Actor2545: tc03 + Owner: Neutral + Location: 168,142 + Actor2546: tc04 + Owner: Neutral + Location: 168,143 + Actor2547: tc02 + Owner: Neutral + Location: 168,145 + Actor2548: tc02 + Owner: Neutral + Location: 168,138 + Actor2549: t11 + Owner: Neutral + Location: 168,137 + Actor2550: t03 + Owner: Neutral + Location: 168,146 + Actor2551: t15 + Owner: Neutral + Location: 155,141 + Actor2552: t16 + Owner: Neutral + Location: 155,143 + Actor2553: tc01 + Owner: Neutral + Location: 155,142 + Actor2554: t14 + Owner: Neutral + Location: 137,135 + Actor2555: t06 + Owner: Neutral + Location: 138,131 + Actor2556: t11 + Owner: Neutral + Location: 137,138 + Actor2557: brl3 + Owner: Neutral + Location: 166,145 + Actor2558: barl + Owner: Neutral + Location: 166,144 + Actor2559: ammobox1 + Owner: Neutral + Location: 165,145 + Actor2560: v02 + Owner: Neutral + Location: 167,132 + Actor2561: v04 + Owner: Neutral + Location: 165,129 + Actor2523: v05 + Owner: Neutral + Location: 160,130 + Actor2562: v10 + Owner: Neutral + Location: 174,135 + Actor2563: v07 + Faction: Random + Location: 172,137 + Owner: Civilian + Actor2564: ammobox1 + Owner: Neutral + Location: 158,127 + Actor2565: ammobox2 + Owner: Neutral + Location: 158,126 + Actor2566: brl3 + Owner: Neutral + Location: 145,141 + Actor2567: tanktrap1 + Owner: Neutral + Location: 165,134 + Actor2568: tanktrap1 + Owner: Neutral + Location: 168,136 + Actor2569: tanktrap1 + Owner: Neutral + Location: 168,135 + Actor2570: barb + Owner: Neutral + Location: 167,138 + Actor2571: barb + Owner: Neutral + Location: 167,137 + Actor2572: barb + Owner: Neutral + Location: 167,136 + Actor2573: barb + Owner: Neutral + Location: 167,135 + Actor2574: barb + Owner: Neutral + Location: 166,135 + Actor2575: barb + Owner: Neutral + Location: 165,135 + Actor2576: barb + Owner: Neutral + Location: 167,146 + Actor2577: barb + Owner: Neutral + Location: 167,145 + Actor2578: barb + Owner: Neutral + Location: 167,144 + Actor2579: barb + Owner: Neutral + Location: 166,146 + Actor2580: barb + Owner: Neutral + Location: 165,146 + Actor2581: barb + Owner: Neutral + Location: 158,146 + Actor2582: barb + Owner: Neutral + Location: 157,146 + Actor2583: barb + Owner: Neutral + Location: 157,145 + Actor2584: barb + Owner: Neutral + Location: 157,143 + Actor2585: barb + Owner: Neutral + Location: 157,144 + Actor2586: barb + Owner: Neutral + Location: 159,146 + Actor2587: barb + Owner: Neutral + Location: 154,137 + Actor2588: barb + Owner: Neutral + Location: 155,137 + Actor2589: barb + Owner: Neutral + Location: 156,137 + Actor2590: barb + Owner: Neutral + Location: 154,138 + Actor2591: barb + Owner: Neutral + Location: 157,132 + Actor2592: barb + Owner: Neutral + Location: 157,133 + Actor2593: barb + Owner: Neutral + Location: 156,131 + Actor2594: barb + Owner: Neutral + Location: 159,125 + Actor2595: barb + Owner: Neutral + Location: 159,126 + Actor2596: barb + Owner: Neutral + Location: 152,125 + Actor2597: barb + Owner: Neutral + Location: 152,126 + Actor2598: tc04 + Owner: Neutral + Location: 116,132 + Actor2599: tc01 + Owner: Neutral + Location: 121,133 + Actor2600: tc03 + Owner: Neutral + Location: 114,133 + Actor2601: tc01 + Owner: Neutral + Location: 126,112 + Actor2602: tc02 + Owner: Neutral + Location: 127,112 + Actor2603: tc01 + Owner: Neutral + Location: 138,112 + Actor2604: tc03 + Owner: Neutral + Location: 126,110 + Actor2605: proc.td + Owner: Nod + Location: 229,138 + Actor2606: afac + Owner: Nod + Location: 229,132 + Actor2607: hq.upg + Owner: Nod + Location: 222,134 + Actor2608: obli + Owner: Nod + Location: 218,132 + Actor2609: obli + Owner: Nod + Location: 218,125 + Actor2610: nsam + Owner: Nod + Location: 225,127 + Actor2611: rep + Owner: Nod + Location: 231,128 + Actor2612: hpad.td + Owner: Nod + Location: 223,129 + Actor2613: hpad.td + Owner: Nod + Location: 225,129 + Actor2614: sgen + Owner: Nod + Location: 226,135 + Actor2615: tmpp + Owner: Nod + Location: 234,132 + Actor2616: lasp + Owner: Nod + Location: 219,133 + Actor2617: lasp + Owner: Nod + Location: 219,140 + Actor2618: lasp + Owner: Nod + Location: 226,140 + Actor2619: lasp + Owner: Nod + Location: 219,123 + Actor2620: lasp + Owner: Nod + Location: 227,123 + Actor2621: lasp + Owner: Nod + Location: 235,123 + Actor2622: lasp + Owner: Nod + Location: 241,123 + Actor2623: hand + Owner: Nod + Location: 220,125 + Actor2624: airs + Owner: Nod + Location: 236,125 + Actor2625: airs + Owner: Nod + Location: 236,129 + Actor2639: chain + Owner: Nod + Location: 241,132 + Actor2640: chain + Owner: Nod + Location: 241,131 + Actor2641: chain + Owner: Nod + Location: 241,129 + Actor2642: chain + Owner: Nod + Location: 241,130 + Actor2643: chain + Owner: Nod + Location: 241,126 + Actor2644: chain + Owner: Nod + Location: 241,125 + Actor2645: chain + Owner: Nod + Location: 241,124 + Actor2646: chain + Owner: Nod + Location: 240,124 + Actor2647: chain + Owner: Nod + Location: 239,124 + Actor2648: chain + Owner: Nod + Location: 237,124 + Actor2649: chain + Owner: Nod + Location: 238,124 + Actor2650: chain + Owner: Nod + Location: 236,124 + Actor2651: chain + Owner: Nod + Location: 235,124 + Actor2652: nuk2 + Owner: Nod + Location: 239,134 + Actor2653: nuk2 + Owner: Nod + Location: 239,137 + Actor2626: tplr + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 220,129 + Actor2627: tplr + Owner: Nod + SubCell: 3 + Location: 221,131 + Facing: 729 + Actor2628: rmbc + Owner: Nod + Location: 223,128 + SubCell: 3 + Facing: 650 + Actor2629: acol + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 229,125 + Actor2630: acol + Owner: Nod + SubCell: 3 + Location: 228,130 + Facing: 1015 + Actor2631: n1 + Owner: Nod + Location: 234,132 + Facing: 150 + Actor2632: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 232,134 + Actor2633: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 238,134 + Actor2634: n3 + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 238,132 + Actor2635: reap + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 197,132 + Actor2636: reap + Owner: Nod + Location: 205,136 + SubCell: 3 + Facing: 95 + Actor2637: reap + Owner: Nod + SubCell: 3 + Location: 184,131 + Facing: 642 + NodGroup3: waypoint + Owner: Neutral + Location: 166,133 + NodBase: waypoint + Owner: Neutral + Location: 229,130 + NodGroup2: waypoint + Owner: Neutral + Location: 219,129 + Actor2638: apc2 + Owner: GDI + Location: 147,144 + Facing: 245 + Actor2654: hmmv + Owner: GDI + Location: 150,141 + Facing: 261 + Actor2655: hmmv.tow + Owner: GDI + Location: 147,138 + Facing: 1023 + Actor2656: xo + Owner: GDI + Location: 145,139 + Facing: 483 + Actor2657: tran.husk2 + Owner: GDI + Facing: 384 + Location: 146,134 + Actor2658: e2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 147,136 + Actor2659: n1 + Owner: GDI + SubCell: 3 + Location: 152,140 + Facing: 911 + Actor2660: n2 + Owner: GDI + Facing: 384 + Location: 142,138 + SubCell: 1 + Actor2661: n3 + Owner: GDI + SubCell: 3 + Location: 148,136 + Facing: 682 + Actor2662: n3 + Owner: GDI + Facing: 384 + Location: 148,136 + SubCell: 1 + Actor2663: n1 + Owner: GDI + SubCell: 3 + Facing: 384 + Location: 148,145 + Actor2664: n1 + Owner: GDI + Location: 149,145 + SubCell: 3 + Facing: 610 + Actor2665: c8 + Owner: Civilian + Facing: 384 + SubCell: 3 + Location: 165,141 + Actor2666: tecn + Owner: Civilian + SubCell: 3 + Location: 162,138 + Facing: 800 + Actor2667: c7 + Owner: Civilian + Location: 164,138 + SubCell: 3 + Facing: 705 + Actor2668: c10 + Owner: Civilian + Location: 166,137 + SubCell: 3 + Facing: 729 + Actor2669: htnk + Owner: GDI + Location: 146,158 + Facing: 0 + Actor2670: htnk + Owner: GDI + Location: 150,158 + Facing: 0 + Actor2671: hsam + Owner: GDI + Location: 141,152 + Facing: 777 + Actor2672: hsam + Owner: GDI + Location: 139,150 + Facing: 761 + Actor2673: pbul + Owner: GDI + Location: 157,138 + Facing: 769 + Actor2674: msar + Owner: GDI + Location: 144,136 + DeployState: Deployed + Facing: 253 + Actor2675: thwk + Owner: GDI + Location: 142,157 + Facing: 761 + Actor2676: n1 + Owner: GDI + SubCell: 3 + Location: 149,157 + Facing: 0 + Actor2677: n1 + Owner: GDI + SubCell: 3 + Location: 145,158 + Facing: 174 + Actor2678: nsam + Owner: Nod + Location: 221,139 + Actor2679: msg + Owner: Nod + Location: 194,130 + DeployState: Deployed + Facing: 245 + Actor2680: bggy + Owner: Nod + Facing: 384 + Location: 187,132 + Actor2681: bike + Owner: Nod + Facing: 384 + Location: 206,132 + Actor2682: hftk + Owner: Nod + Location: 189,135 + Facing: 285 + Actor2683: hftk + Owner: Nod + Location: 180,132 + Facing: 245 + Actor2684: hstk + Owner: Nod + Location: 212,133 + Facing: 253 + Actor2685: hstk + Owner: Nod + Facing: 384 + Location: 168,127 + NodGroup1: waypoint + Owner: Neutral + Location: 183,133 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/two-tone-nod.yaml, rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml, weapons.yaml diff --git a/mods/ca/maps/shellmap/rules.yaml b/mods/ca/maps/shellmap/rules.yaml new file mode 100644 index 0000000000..614b81fa01 --- /dev/null +++ b/mods/ca/maps/shellmap/rules.yaml @@ -0,0 +1,261 @@ +^Palettes: + PaletteFromFile@terrain-temperat: + Filename: lush.pal + FlashPostProcessEffect@LIGHTNINGSTRIKE: + Type: LightningStrike + Color: cccccc + FlashPostProcessEffect@IONSTRIKE: + Type: IonStrike + Color: 46c32d + TintPostProcessEffect: + Red: 1.00 + Green: 1.00 + Blue: 1.05 + Ambient: 0.8 + +^BaseWorld: + TerrainLighting: + +World: + -CrateSpawner: + -StartGameNotification: + MusicPlaylist: + BackgroundMusic: moi2 + AllowMuteBackgroundMusic: true + DisableWorldSounds: true + LuaScript: + Scripts: campaign.lua, shellmap.lua + WeatherOverlay@RAIN: + WindTick: 150, 550 + UseSquares: false + ScatterDirection: 0, 0 + Gravity: 20, 25 + SwingOffset: 0, 0 + SwingSpeed: 0, 0 + SwingAmplitude: 0, 0 + ParticleColors: 72aaae, 72aea6, 5caea3, 6da69f + LineTailAlphaValue: 30 + ParticleSize: 1, 1 + ParticleDensityFactor: 5 + +SPLIT2: + TerrainLightSource: + Range: 6c0 + Intensity: 0.1 + GreenTint: 0.3 + SeedsResourceCA: + Interval: 35 + +SPLIT3: + TerrainLightSource: + Range: 6c0 + Intensity: 0.1 + GreenTint: 0.3 + SeedsResourceCA: + Interval: 35 + +SPLITBLUE: + TerrainLightSource: + Range: 6c0 + Intensity: 0.1 + BlueTint: 0.3 + SeedsResourceCA: + Interval: 35 + +UPGC: + GrantCondition@RADAR: + Condition: tower-radar + +AIRS: + ProductionAirdropCA@SQVEH: + ProportionalSpeed: false + ProductionAirdropCA@MQVEH: + ProportionalSpeed: false + +powerproxy.paratroopers.xo: + Inherits: ^InvisibleDummy + ParatroopersPower: + UnitType: ocar.xo + DisplayBeacon: false + SquadSize: 1 + DropItems: XO,XO,XO + +AURO: + GrantCondition@ABUR: + Condition: afterburner + SpeedMultiplier@AFTERBURNER: + Modifier: 250 + +A10: + SpeedMultiplier@SPEEDBOOST: + Modifier: 155 + RequiresCondition: speed-boost + ExternalCondition@SPEEDBOOST: + Condition: speed-boost + +SUK: + Aircraft: + Speed: 250 + +NUKC: + GrantCondition@BotOwner: + Condition: botowner + +# attack everything + +^AutoTargetGround: + AutoTargetPriority@DEFAULT: + ValidTargets: Infantry, Vehicle, Water, Underwater, Structure, Defense + InvalidTargets: NoAutoTarget + +^AutoTargetAll: + AutoTargetPriority@DEFAULT: + ValidTargets: Infantry, Vehicle, Water, Underwater, Structure, Defense + InvalidTargets: NoAutoTarget + +# hide icons, income text etc. + +^Building: + WithBuildingRepairDecoration: + Image: empty + Sequence: idle + +^GainsExperience: + GrantCondition@Shell: + Condition: shellmap + DummyConditionConsumer@Shell: + Condition: shellmap + WithDecoration@RANK-1: + RequiresCondition: rank-veteran == 1 && !shellmap + WithDecoration@RANK-2: + RequiresCondition: rank-veteran == 2 && !shellmap + WithDecoration@RANK-ELITE: + RequiresCondition: rank-elite && !shellmap + GrantConditionOnPrerequisite@NODRANK: + Prerequisites: disabled + GrantConditionOnPrerequisite@SCRINRANK: + Prerequisites: disabled + +OILB: + CashTrickler: + ShowTicks: false + +PROC: + Refinery: + ShowTicks: false + UseStorage: false + +PROC.TD: + Refinery: + ShowTicks: false + UseStorage: false + +^GlobalBounty: + GivesBountyCA: + ShowBounty: false + +^Concussion: + WithDecoration@Concussion: + RequiresSelection: True + +^AuraHealable: + WithDecoration@REDCROSS: + Image: empty + Sequence: idle + +^TNTPlantable: + WithDecoration@tnt: + RequiresSelection: True + +^Veil: + -RenderShroudCircleCA: + +RMBO: + WithDecoration@COMMANDOSKULL: + Image: empty + Sequence: idle + +SEAL: + WithDecoration@COMMANDOSKULL: + Image: empty + Sequence: idle + +SS2: + -WithColoredSelectionBox@INVIS: + AutoTarget: + InitialStance: Defend + +STNK.Nod: + -WithColoredSelectionBox@INVIS: + +RAH: + -WithColoredSelectionBox@INVIS: + +MACS: + -GrantConditionOnPrerequisite@OwnedByAi: + -PeriodicProducerCA@MECHANIC: + -PeriodicProducerCA@ARTIFICER: + -GrantConditionIfOwnerIsNeutral: + -GrantConditionOnPrerequisite@SCRIN: + +MACS.Rebuilt: + -PeriodicProducerCA@MECHANIC: + -PeriodicProducerCA@ARTIFICER: + +MINV: + -WithColoredSelectionBox@PlayerColorBox: + +MSAR: + ProximityExternalCondition@Bino: + -EnableSound: + +# defense buffs + +BRIK: + DamageMultiplier: + Modifier: 10 + +ATWR: + DamageMultiplier: + Modifier: 5 + +STWR: + DamageMultiplier: + Modifier: 5 + +OBLI: + DamageMultiplier: + Modifier: 5 + +SCOL: + DamageMultiplier: + Modifier: 5 + +PTUR: + DamageMultiplier: + Modifier: 5 + +GUN.Nod: + DamageMultiplier: + Modifier: 5 + +TSLA: + DamageMultiplier: + Modifier: 5 + +FTUR: + DamageMultiplier: + Modifier: 5 + +# Hunt() requires only 1 AttackBase + +BATF.AI: + -AttackFrontal: + +DEVA: + -AttackFrontalCharged: + -Armament@PRIMARYUPG: + -AmbientSound@CHARGE: + -WithIdleOverlay@CHARGE1: + -WithIdleOverlay@CHARGE2: + -WithIdleOverlay@CHARGE3: diff --git a/mods/ca/maps/shellmap/shellmap.lua b/mods/ca/maps/shellmap/shellmap.lua new file mode 100644 index 0000000000..2fd06ec441 --- /dev/null +++ b/mods/ca/maps/shellmap/shellmap.lua @@ -0,0 +1,430 @@ +Ticks = 0 +Speed = 30 +Difficulty = "normal" + +SealDropPaths = { { SealDropSpawn.Location, SealDrop1.Location }, { SealDropSpawn.Location, SealDrop2.Location }, { SealDropSpawn.Location, SealDrop3.Location }, { SealDropSpawn.Location, SealDrop4.Location } } +SealPatrolPath = { AlliedCamp.Location, ScrinAttack1.Location, SovietAttack3a.Location } + +UnitCompositionsShellmap = { + Soviet = { + { Infantry = { "e3", "e1", "e1", "e3", "e4" }, Vehicles = { "btr.ai" } }, + { Infantry = { "e3", "e1", "e1", "ttrp", "shok", "e1", "shok", "e3", "e4" }, Vehicles = { TeslaVariant, "btr.ai", SovietMammothVariant, "grad" } }, + { Infantry = { "e3", "e1", "e1", "ttrp", "shok", "e1", "e2", "e3", "e4" }, Vehicles = { "3tnk.rhino.atomic", "btr.ai", SovietMammothVariant, "grad" } }, + { Infantry = { "e3", "e1", "e1", "ttrp", "e8", "e1", "e2", "e3", "e4" }, Vehicles = { "3tnk.rhino.yuri", "btr.ai", SovietMammothVariant, "grad" } }, + { Infantry = { "e3", "e1", "e1", "ttrp", "deso", "e1", "e2", "e3", "e4" }, Vehicles = { "3tnk.rhino", "btr.yuri.ai", SovietMammothVariant, SovietBasicArty } }, + { Infantry = { "e3", "e1", "e1", "ttrp", "deso", "e1", "e2", "e3", "e4" }, Vehicles = { "3tnk", "btr.yuri.ai", "isu", SovietBasicArty } } + }, + Allies = { + { Infantry = { "e3", "e1", "e1", "e3", "e1" }, Vehicles = { "apc.ai" } }, + { Infantry = { "e3", "e1", "e1", "cryt", "cryt", "e1", "cryt", "e3", "snip" }, Vehicles = { "arty", "apc.ai", "pcan", "ptnk" } }, + { Infantry = { "e3", "e1", "e1", "cryt", "cryt", "e1", "e1", "e3", "snip" }, Vehicles = { "2tnk", "apc.ai", "batf.ai", "ptnk" } }, + { Infantry = { "e3", "e1", "e1", "cryt", "enfo", "e1", "e1", "e3", "snip" }, Vehicles = { "2tnk", "apc.ai", "chpr", "ptnk" } }, + { Infantry = { "e3", "e1", "e1", "cryt", "cryt", "e1", "e1", "e3", "snip" }, Vehicles = { "tnkd", "apc.ai", "batf.ai", "ptnk" } }, + { Infantry = { "e3", "e1", "e1", "cryt", "cryt", "e1", "e1", "e3", "snip" }, Vehicles = { "2tnk", "apc.ai", "cryo", "ptnk" } } + }, + GDI = { + { Infantry = { "n1", "n1", "n1", "n3", "n2", "n1", "n1" }, Vehicles = { "vulc.ai", "gdrn", "gdrn", "hmmv" } }, + { Infantry = { "n1", "n1", "n1", "n3", "n2", "n1", "n1" }, Vehicles = { "mtnk", "vulc", "gdrn", "mtnk" } }, + { Infantry = { "n1", "n1", "n1", "n3", "n2", "n1", "n1" }, Vehicles = { "hsam", "hsam", "hsam", "mtnk" } }, + { Infantry = { "n3", "n1", "n1", "n1", "n3", "n2", "n1", "n1", "n3" }, Vehicles = { "mtnk", "vulc", "apc2.gdiai", "vulc.ai" } }, + { Infantry = { "n3", "n1", "n1", "n1", "n3", "n1", "n1", "n1", "n3" }, Vehicles = { "mtnk", "vulc", "apc2.gdiai", "msam" } }, + { Infantry = { "jjet", "jjet", "jjet", "bjet" }, Vehicles = { "vulc", "vulc", "hmmv.tow", "hmmv.tow" } }, + { Infantry = { "n1", "n1", "n3" }, Vehicles = { GDIMammothVariant, "vulc", "hsam", "disr", "xo", "xo" } }, + { Infantry = { "n1", "n3", "n1", "n1", "n2", "n3", "n1", "n1" }, Vehicles = { GDIMammothVariant, "vulc", GDIMammothVariant, "xo" } }, + }, + Nod = { + { Infantry = {}, Vehicles = { "bggy", "bike", "bike", "bike", "bggy" } }, + { Infantry = { "n1", "n3", "n4", "n1" }, Vehicles = { "bggy", "bike", "bike", "stnk.nod", "bike", "bggy" } }, + { Infantry = { "n3", "n1", "n1", "n4", "n1", "bh", "bh" }, Vehicles = { "ltnk", "ltnk", "hftk", "hftk", "bike" } }, + { Infantry = { "n3", "n1", "n1", "n4", "n1", "n1c", "acol", "n1" }, Vehicles = { "ltnk", "arty.nod", "ltnk", "stnk.nod" } }, + { Infantry = { AdvancedCyborg, AdvancedCyborg, BasicCyborg, BasicCyborg, BasicCyborg, BasicCyborg, BasicCyborg }, Vehicles = { "ftnk", "ltnk", "bike" } }, + { Infantry = { "n3", "n1", "n3", "n1", "n4", "n1", BasicCyborg, AdvancedCyborg }, Vehicles = { "ltnk", "arty.nod", "wtnk" } }, + }, + Scrin = { + { Infantry = { "s3", "s1", "s1", "s1", "s3", "s1", "s4", "s4" }, Vehicles = { "intl.ai2", "intl.ai2", GunWalkerSeekerOrLacerator, CorrupterOrDevourer, CorrupterOrDevourer, GunWalkerSeekerOrLacerator } }, + { Infantry = { "s3", "s1", "s1", "s1", "s3", "s1", "s4", "s4" }, Vehicles = { "intl.ai2", "tpod", GunWalkerSeekerOrLacerator, CorrupterOrDevourer, CorrupterOrDevourer, GunWalkerSeekerOrLacerator } }, + { Infantry = {}, Vehicles = { "lace", "lace", "lace", "seek", "seek" }, Aircraft = {} }, + { Infantry = {}, Vehicles = {}, Aircraft = { PacOrDevastator, "deva", "pac" } } + } +} + +Squads = { + NodVsGDI = { + AttackValuePerSecond = { + normal = { Min = 80, Max = 80 }, + }, + DispatchDelay = DateTime.Seconds(30), + FollowLeader = false, + Compositions = UnitCompositionsShellmap.Nod, + AttackPaths = { { NodAttack1.Location, GDIBase.Location }, { NodGroup1.Location, GDIBase.Location }, { GDIAttack1.Location, GDIBase.Location } }, + }, + NodVsScrin = { + AttackValuePerSecond = { + normal = { Min = 90, Max = 90 }, + }, + DispatchDelay = DateTime.Seconds(30), + FollowLeader = false, + Compositions = UnitCompositionsShellmap.Nod, + AttackPaths = { { GDICamp.Location, ScrinBase.Location } }, + }, + GDIVsNod = { + AttackValuePerSecond = { + normal = { Min = 80, Max = 80 }, + }, + FollowLeader = false, + ProducerActors = { Infantry = { GDISouthBarracks }, Vehicles = { GDISouthFactory } }, + Compositions = UnitCompositionsShellmap.GDI, + AttackPaths = { { NodAttack1.Location, NodBase.Location }, { GDIGroup1.Location, NodBase.Location }, { GDIAttack1.Location, NodBase.Location } }, + }, + GDIVsScrin = { + AttackValuePerSecond = { + normal = { Min = 80, Max = 80 }, + }, + FollowLeader = false, + ProducerActors = { Infantry = { GDINorthEastBarracks }, Vehicles = { GDINorthEastFactory } }, + Compositions = UnitCompositionsShellmap.GDI, + AttackPaths = { { SovietAttack3a.Location, SovietBase.Location }, { NodAttack1.Location, NodBase.Location } }, + }, + GDIVsSoviets = { + AttackValuePerSecond = { + normal = { Min = 80, Max = 80 }, + }, + FollowLeader = false, + ProducerActors = { Infantry = { GDINorthWestBarracks }, Vehicles = { GDINorthWestFactory } }, + Compositions = UnitCompositionsShellmap.GDI, + AttackPaths = { { SovietGroup1.Location, SovietBase.Location } }, + }, + AlliesVsSoviets = { + AttackValuePerSecond = { + normal = { Min = 80, Max = 80 }, + }, + FollowLeader = false, + ProducerActors = { Infantry = { AlliesNorthWestBarracks }, Vehicles = { AlliesNorthWestFactory } }, + Compositions = UnitCompositionsShellmap.Allies, + AttackPaths = { { SovietGroup1.Location, SovietBase.Location } }, + }, + SovietVsAllies = { + AttackValuePerSecond = { + normal = { Min = 110, Max = 110 }, + }, + FollowLeader = false, + ProducerActors = { Infantry = { SovietNorthBarracks }, Vehicles = { SovietNorthFactory } }, + Compositions = UnitCompositionsShellmap.Soviet, + AttackPaths = { { SovietAttack1.Location, SovietAttack2.Location, GDIBase.Location }, { SovietAttack3a.Location, SovietAttack3b.Location, AlliesBase.Location} }, + }, + SovietVsGDI = { + AttackValuePerSecond = { + normal = { Min = 110, Max = 110 }, + }, + FollowLeader = false, + ProducerActors = { Infantry = { SovietSouthBarracks }, Vehicles = { SovietSouthFactory } }, + Compositions = UnitCompositionsShellmap.Soviet, + AttackPaths = { { SovietAttack1.Location, SovietAttack2.Location, GDIBase.Location }, { SovietAttack3a.Location, SovietAttack3b.Location, GDIBase.Location} }, + }, + ScrinVsSoviets = { + AttackValuePerSecond = { + normal = { Min = 125, Max = 125 }, + }, + FollowLeader = false, + Compositions = UnitCompositionsShellmap.Scrin, + AttackPaths = { { ScrinAttack1.Location, AlliedCamp.Location, ScrinAttack2a.Location, SovietBase.Location }, { ScrinAttack1.Location, AlliedCamp.Location, ScrinAttack2b.Location, SovietBase.Location } }, + }, + ScrinVsGDI = { + AttackValuePerSecond = { + normal = { Min = 90, Max = 90 }, + }, + FollowLeader = false, + Compositions = UnitCompositionsShellmap.Scrin, + AttackPaths = { { GDICamp.Location, GDIBase.Location } }, + }, + GDIAir = { + Interval = { + normal = DateTime.Minutes(1), + }, + Compositions = { + normal = { + { Aircraft = { "orca", "orca" } }, + { Aircraft = { "a10" } } + }, + }, + }, + NodAir = { + Interval = { + normal = DateTime.Minutes(1), + }, + Compositions = { + normal = { + { Aircraft = { "scrn", "scrn" } }, + { Aircraft = { "apch", "apch" } }, + { Aircraft = { "rah", "rah" } }, + { Aircraft = { "venm", "venm" } } + }, + }, + }, + ScrinAir = { + Interval = { + normal = DateTime.Minutes(1), + }, + Compositions = { + normal = { + { Aircraft = { "stmr", "stmr" } }, + { Aircraft = { "enrv", "enrv" } }, + }, + }, + }, + SovietAir = { + Interval = { + normal = DateTime.Minutes(1), + }, + Compositions = { + normal = { + { Aircraft = { "mig", "mig" } }, + { Aircraft = { "suk", "suk" } }, + { Aircraft = { "yak", "yak" } }, + { Aircraft = { "hind", "hind" } }, + }, + }, + }, +} + +Tick = function() + Ticks = Ticks + 1 + + if Ticks > 1 or not Map.IsPausedShellmap then + local t = (Ticks + 45) % (360 * Speed) * (math.pi / 180) / Speed; + Camera.Position = ViewportOrigin + WVec.New(19200 * 1.5 * math.sin(t), 20480 * 1.1 * math.cos(t), 0) + end + + OncePerSecondChecks() +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + Greece.Resources = Greece.ResourceCapacity - 500 + USSR.Resources = USSR.ResourceCapacity - 500 + GDI.Resources = GDI.ResourceCapacity - 500 + Nod.Resources = Nod.ResourceCapacity - 500 + Scrin.Resources = Scrin.ResourceCapacity - 500 + end +end + +WorldLoaded = function() + Greece = Player.GetPlayer("Greece") + USSR = Player.GetPlayer("USSR") + GDI = Player.GetPlayer("GDI") + Nod = Player.GetPlayer("Nod") + Scrin = Player.GetPlayer("Scrin") + Civilian = Player.GetPlayer("Civilian") + + Camera.Position = CameraStart.CenterPosition + ViewportOrigin = Camera.Position + + Actor.Create("ai.unlimited.power", true, { Owner = Greece }) + Actor.Create("ai.unlimited.power", true, { Owner = USSR }) + Actor.Create("ai.unlimited.power", true, { Owner = GDI }) + Actor.Create("ai.unlimited.power", true, { Owner = Nod }) + Actor.Create("ai.unlimited.power", true, { Owner = Scrin }) + + Actor.Create("sonic.upgrade", true, { Owner = GDI }) + Actor.Create("empgren.upgrade", true, { Owner = GDI }) + Actor.Create("sidewinders.upgrade", true, { Owner = GDI }) + Actor.Create("shields.upgrade", true, { Owner = Scrin }) + Actor.Create("tibcore.upgrade", true, { Owner = Nod }) + + XODropProxy = Actor.Create("powerproxy.paratroopers.xo", true, { Owner = GDI, }) + + AutoRepairAndRebuildBuildings(Greece) + AutoReplaceHarvesters(Greece) + AutoRepairAndRebuildBuildings(USSR) + AutoReplaceHarvesters(USSR) + AutoRepairAndRebuildBuildings(GDI) + AutoReplaceHarvesters(GDI) + AutoRepairAndRebuildBuildings(Nod) + AutoReplaceHarvesters(Nod) + AutoRepairAndRebuildBuildings(Scrin) + AutoReplaceHarvesters(Scrin) + + local civilians = Civilian.GetActorsByTypes({ "c1", "c2", "c3", "c4", "c5", "c6", "c7", "c8", "c9", "c10", "tecn" }) + Utils.Do(civilians, function(a) + local rand = Utils.RandomInteger(1,3) + a.Wait(Utils.RandomInteger(1,50)) + if rand == 1 then + a.Move(CivilianRetreat1.Location) + else + a.Move(CivilianRetreat2.Location) + end + a.Move(GDIBase.Location, 3) + a.Move(CivilianEvac.Location) + a.Destroy() + end) + + -- setup defenders + local alliedGroundAttackers = Greece.GetGroundAttackers() + + Utils.Do(alliedGroundAttackers, function(a) + TargetSwapChance(a, 10, function(p) return not p.IsAlliedWith(Greece) end) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsGreeceGroundHunterUnit, function(p) return not p.IsAlliedWith(Greece) end) + end) + + local sovietGroundAttackers = USSR.GetGroundAttackers() + + Utils.Do(sovietGroundAttackers, function(a) + TargetSwapChance(a, 10, function(p) return not p.IsAlliedWith(USSR) end) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsUSSRGroundHunterUnit, function(p) return not p.IsAlliedWith(USSR) end) + end) + + local gdiGroundAttackers = GDI.GetGroundAttackers() + + Utils.Do(gdiGroundAttackers, function(a) + TargetSwapChance(a, 10, function(p) return not p.IsAlliedWith(GDI) end) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsGDIGroundHunterUnit, function(p) return not p.IsAlliedWith(GDI) end) + end) + + local nodGroundAttackers = Nod.GetGroundAttackers() + + Utils.Do(nodGroundAttackers, function(a) + TargetSwapChance(a, 10, function(p) return not p.IsAlliedWith(Nod) end) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsNodGroundHunterUnit, function(p) return not p.IsAlliedWith(Nod) end) + end) + + local scrinGroundAttackers = Scrin.GetGroundAttackers() + + Utils.Do(scrinGroundAttackers, function(a) + TargetSwapChance(a, 10, function(p) return not p.IsAlliedWith(Scrin) end) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsScrinGroundHunterUnit, function(p) return not p.IsAlliedWith(Scrin) end) + end) + + -- initial battles + Trigger.AfterDelay(1, function() + local gdiGroup1 = Map.ActorsInCircle(GDIGroup1.CenterPosition, WDist.FromCells(10), function(a) + return a.Owner == GDI and not a.IsDead and a.HasProperty("AttackMove") + end) + Utils.Do(gdiGroup1, function(a) + a.AttackMove(SovietGroup1.Location) + end) + local nodGroup1 = Map.ActorsInCircle(NodGroup1.CenterPosition, WDist.FromCells(10), function(a) + return a.Owner == Nod and not a.IsDead and a.HasProperty("AttackMove") + end) + Utils.Do(nodGroup1, function(a) + a.AttackMove(GDIGroup1.Location) + end) + local nodGroup2 = Map.ActorsInCircle(NodGroup2.CenterPosition, WDist.FromCells(10), function(a) + return a.Owner == Nod and not a.IsDead and a.HasProperty("AttackMove") + end) + Utils.Do(nodGroup2, function(a) + a.AttackMove(GDICamp.Location) + end) + end) + + Trigger.AfterDelay(DateTime.Seconds(8), function() + local nodGroup3 = Map.ActorsInCircle(NodGroup3.CenterPosition, WDist.FromCells(4), function(a) + return a.Owner == Nod and not a.IsDead and a.HasProperty("AttackMove") + end) + Utils.Do(nodGroup3, function(a) + IdleHunt(a) + end) + end) + + Trigger.AfterDelay(DateTime.Seconds(35), function() + local scrinGroup1 = Map.ActorsInCircle(ScrinGroup1.CenterPosition, WDist.FromCells(10), function(a) + return a.Owner == Scrin and not a.IsDead and a.HasProperty("AttackMove") + end) + Utils.Do(scrinGroup1, function(a) + a.AttackMove(GDICamp.Location) + a.AttackMove(GDIBase.Location) + end) + end) + + Trigger.AfterDelay(DateTime.Seconds(20), function() + Utils.Do({ Warthog1, Warthog2, Warthog3, Aurora1, Aurora2 }, function(a) + if not a.IsDead then + if a.Type == "a10" then + a.GrantCondition("speed-boost") + end + a.Stance = "HoldFire" + a.Move(AirstrikeDest.Location) + a.Destroy() + end + end) + end) + + Trigger.AfterDelay(DateTime.Seconds(120), function() + DoSealDrop() + end) + + Trigger.AfterDelay(DateTime.Seconds(140), function() + local scrinGroup2 = Map.ActorsInCircle(ScrinGroup2.CenterPosition, WDist.FromCells(10), function(a) + return a.Owner == Scrin and not a.IsDead and a.HasProperty("AttackMove") + end) + Utils.Do(scrinGroup2, function(a) + a.AttackMove(GDIBase.Location) + end) + end) + + Trigger.AfterDelay(DateTime.Seconds(1), function() + InitAttackSquad(Squads.NodVsGDI, Nod, GDI) + InitAttackSquad(Squads.GDIVsNod, GDI, Nod) + + Trigger.AfterDelay(DateTime.Seconds(30), function() + InitAttackSquad(Squads.ScrinVsGDI, Scrin, GDI) + end) + + Trigger.AfterDelay(DateTime.Seconds(85), function() + InitAttackSquad(Squads.GDIVsSoviets, GDI, USSR) + InitAttackSquad(Squads.AlliesVsSoviets, Greece, USSR) + InitAttackSquad(Squads.GDIVsScrin, GDI, Scrin) + InitAttackSquad(Squads.SovietVsGDI, USSR, GDI) + InitAttackSquad(Squads.SovietVsAllies, USSR, Greece) + InitAttackSquad(Squads.NodVsScrin, Nod, Scrin) + InitAttackSquad(Squads.ScrinVsSoviets, Scrin, Nod) + + InitAirAttackSquad(Squads.GDIAir, GDI, Scrin, { "stmr", "enrv", "tpod", "devo", "ruin", "pac", "deva" }) + InitAirAttackSquad(Squads.SovietAir, USSR, GDI, { "orca", "a10", "msam", "htnk", "titn", "htnk.ion", "htnk.hover", "htnk.drone", "jugg" }) + InitAirAttackSquad(Squads.ScrinAir, Scrin, GDI, { "orca", "a10", "msam", "htnk", "titn", "htnk.ion", "htnk.hover", "htnk.drone", "jugg" }) + end) + + InitAirAttackSquad(Squads.GDIAir, GDI, Nod, { "arty.nod", "mlrs", "scrn", "apch", "venm", "rah", "rmbc", "ltnk" }) + InitAirAttackSquad(Squads.NodAir, Nod, GDI, { "orca", "a10", "msam", "htnk", "titn", "htnk.ion", "htnk.hover", "htnk.drone", "jugg" }) + end) + + DoXODrop() +end + +DoSealDrop = function() + local entryPath = Utils.Random(SealDropPaths) + + if not FirstSealDropDone then + FirstSealDropDone = true + entryPath = { SealDropSpawn.Location, SealDrop3.Location } + end + + DoHelicopterDrop(Greece, entryPath, "nhaw", { "seal", "seal", "seal", "seal", "seal" }, + function(u) + if not u.IsDead then + u.Scatter() + u.Patrol(SealPatrolPath, true, DateTime.Seconds(8)) + end + end, + function(t) + Trigger.AfterDelay(DateTime.Seconds(5), function() + if not t.IsDead then + t.Move(entryPath[1]) + t.Destroy() + end + end) + end + ) + Trigger.AfterDelay(DateTime.Minutes(4), function() + DoSealDrop() + end) +end + +DoXODrop = function() + local aircraft = XODropProxy.TargetParatroopers(GDIAttack1.CenterPosition, Angle.East) + + Utils.Do(aircraft, function(a) + Trigger.OnPassengerExited(a, function(t, p) + IdleHunt(p) + end) + end) +end diff --git a/mods/ca/maps/shellmap/weapons.yaml b/mods/ca/maps/shellmap/weapons.yaml new file mode 100644 index 0000000000..a60d23ce0f --- /dev/null +++ b/mods/ca/maps/shellmap/weapons.yaml @@ -0,0 +1,15 @@ +UnitExplodePlane: + Warhead@1Dam: SpreadDamage + Damage: 0 + +UnitExplodePlaneLight: + Warhead@1Dam: SpreadDamage + Damage: 0 + +UnitExplodePlaneEmpty: + Warhead@1Dam: SpreadDamage + Damage: 0 + +8Inch: + Warhead@1Dam: SpreadDamage + InvalidTargets: Submarine diff --git a/mods/ca/maps/shippingyard-ca.oramap b/mods/ca/maps/shippingyard-ca.oramap new file mode 100644 index 0000000000..490b918573 Binary files /dev/null and b/mods/ca/maps/shippingyard-ca.oramap differ diff --git a/mods/ca/maps/showdown-ca.oramap b/mods/ca/maps/showdown-ca.oramap index f604554688..c2db65e46c 100644 Binary files a/mods/ca/maps/showdown-ca.oramap and b/mods/ca/maps/showdown-ca.oramap differ diff --git a/mods/ca/maps/sightseeing-ca.oramap b/mods/ca/maps/sightseeing-ca.oramap new file mode 100644 index 0000000000..77101c4c82 Binary files /dev/null and b/mods/ca/maps/sightseeing-ca.oramap differ diff --git a/mods/ca/maps/silk-road-6v6.oramap b/mods/ca/maps/silk-road-6v6.oramap new file mode 100644 index 0000000000..11355e97f9 Binary files /dev/null and b/mods/ca/maps/silk-road-6v6.oramap differ diff --git a/mods/ca/maps/singles.oramap b/mods/ca/maps/singles.oramap index 48057d0922..a4e15482f3 100644 Binary files a/mods/ca/maps/singles.oramap and b/mods/ca/maps/singles.oramap differ diff --git a/mods/ca/maps/six-below-zero/rules.yaml b/mods/ca/maps/six-below-zero/rules.yaml index 276b32fc30..20378799b3 100644 --- a/mods/ca/maps/six-below-zero/rules.yaml +++ b/mods/ca/maps/six-below-zero/rules.yaml @@ -1,15 +1,9 @@ -World: +^Palettes: WeatherOverlay: - ChangingWindLevel: true - WindLevels: -5, -3, -2, 0, 2, 3, 5, 6 - WindTick: 150, 550 - InstantWindChanges: false - UseSquares: true + ParticleDensityFactor: 6 + Gravity: 16, 24 + WindTick: 150, 425 + ScatterDirection: -12, 12 ParticleSize: 2, 3 - ScatterDirection: -1, 1 - Gravity: 1.00, 2.00 - SwingOffset: 1.0, 1.5 - SwingSpeed: 0.001, 0.025 - SwingAmplitude: 1.0, 1.5 ParticleColors: ECECEC, E4E4E4, D0D0D0, BCBCBC LineTailAlphaValue: 0 diff --git a/mods/ca/maps/skulls-and-bones-ca.oramap b/mods/ca/maps/skulls-and-bones-ca.oramap new file mode 100644 index 0000000000..ee449ecbcc Binary files /dev/null and b/mods/ca/maps/skulls-and-bones-ca.oramap differ diff --git a/mods/ca/maps/slight-miscalculation-ca.oramap b/mods/ca/maps/slight-miscalculation-ca.oramap new file mode 100644 index 0000000000..bc3cfeee0a Binary files /dev/null and b/mods/ca/maps/slight-miscalculation-ca.oramap differ diff --git a/mods/ca/maps/slog-ca.oramap b/mods/ca/maps/slog-ca.oramap new file mode 100644 index 0000000000..d7f390d188 Binary files /dev/null and b/mods/ca/maps/slog-ca.oramap differ diff --git a/mods/ca/maps/smugglersretreat-ca.oramap b/mods/ca/maps/smugglersretreat-ca.oramap new file mode 100644 index 0000000000..39d449cc02 Binary files /dev/null and b/mods/ca/maps/smugglersretreat-ca.oramap differ diff --git a/mods/ca/maps/smugglersretreat3v3-ca.oramap b/mods/ca/maps/smugglersretreat3v3-ca.oramap new file mode 100644 index 0000000000..4110b94640 Binary files /dev/null and b/mods/ca/maps/smugglersretreat3v3-ca.oramap differ diff --git a/mods/ca/maps/snap-ca.oramap b/mods/ca/maps/snap-ca.oramap new file mode 100644 index 0000000000..b56f77169b Binary files /dev/null and b/mods/ca/maps/snap-ca.oramap differ diff --git a/mods/ca/maps/snow town/rules.yaml b/mods/ca/maps/snow town/rules.yaml index 80146bdd71..4d92a1afac 100644 --- a/mods/ca/maps/snow town/rules.yaml +++ b/mods/ca/maps/snow town/rules.yaml @@ -1,19 +1,13 @@ -World: +^Palettes: WeatherOverlay: - ChangingWindLevel: true - WindLevels: -5, -3, -2, 0, 2, 3, 5 - WindTick: 150, 550 - InstantWindChanges: false - UseSquares: true + ParticleDensityFactor: 6 + Gravity: 16, 24 + WindTick: 150, 425 + ScatterDirection: -12, 12 ParticleSize: 1, 3 - ScatterDirection: -1, 1 - Gravity: 1.00, 2.00 - SwingOffset: 1.0, 1.5 - SwingSpeed: 0.001, 0.025 - SwingAmplitude: 1.0, 1.5 ParticleColors: ECECEC, E4E4E4, D0D0D0, BCBCBC LineTailAlphaValue: 0 - GlobalLightingPaletteEffect: + TintPostProcessEffect: Red: 0.9 Green: 0.9 Blue: 1.0 diff --git a/mods/ca/maps/snow-off/rules.yaml b/mods/ca/maps/snow-off/rules.yaml index 551470f81f..4bba4f8d15 100644 --- a/mods/ca/maps/snow-off/rules.yaml +++ b/mods/ca/maps/snow-off/rules.yaml @@ -1,15 +1,11 @@ -World: +^Palettes: WeatherOverlay: - ParticleDensityFactor: 7 - ChangingWindLevel: true - WindLevels: -2, 0, 2 - WindTick: 150, 550 - InstantWindChanges: false - UseSquares: true + ParticleDensityFactor: 6 + WindLevels: -5, 0, 5 + WindTick: 150, 425 ParticleSize: 1, 3 - ScatterDirection: 0, 0 - Gravity: 0.50, 1.50 - SwingOffset: 1, 2 - SwingSpeed: 0.01, 0.02 + ScatterDirection: -12, 12 + Gravity: 16, 24 + SwingSpeed: 0.01, 0.05 SwingAmplitude: 0, 0 ParticleColors: fbfbfb90, f4f4f480, f1f1f1, ffffff50 diff --git a/mods/ca/maps/solstice-3v3.oramap b/mods/ca/maps/solstice-3v3.oramap new file mode 100644 index 0000000000..bfd5ac87de Binary files /dev/null and b/mods/ca/maps/solstice-3v3.oramap differ diff --git a/mods/ca/maps/solstice-4v4.oramap b/mods/ca/maps/solstice-4v4.oramap new file mode 100644 index 0000000000..6d5050452a Binary files /dev/null and b/mods/ca/maps/solstice-4v4.oramap differ diff --git a/mods/ca/maps/sompio-ca.oramap b/mods/ca/maps/sompio-ca.oramap new file mode 100644 index 0000000000..ec8020f971 Binary files /dev/null and b/mods/ca/maps/sompio-ca.oramap differ diff --git a/mods/ca/maps/spearhead-ca.oramap b/mods/ca/maps/spearhead-ca.oramap new file mode 100644 index 0000000000..b5dfcab7d5 Binary files /dev/null and b/mods/ca/maps/spearhead-ca.oramap differ diff --git a/mods/ca/maps/stalemate-ca.oramap b/mods/ca/maps/stalemate-ca.oramap index 847fe9806d..43f27c2746 100644 Binary files a/mods/ca/maps/stalemate-ca.oramap and b/mods/ca/maps/stalemate-ca.oramap differ diff --git a/mods/ca/maps/stanitsa_CA.oramap b/mods/ca/maps/stanitsa_CA.oramap index 57c3fb5333..6a63cda921 100644 Binary files a/mods/ca/maps/stanitsa_CA.oramap and b/mods/ca/maps/stanitsa_CA.oramap differ diff --git a/mods/ca/maps/stronghold-ca.oramap b/mods/ca/maps/stronghold-ca.oramap new file mode 100644 index 0000000000..494c733a6c Binary files /dev/null and b/mods/ca/maps/stronghold-ca.oramap differ diff --git a/mods/ca/maps/styx-ca.oramap b/mods/ca/maps/styx-ca.oramap new file mode 100644 index 0000000000..9321c279d8 Binary files /dev/null and b/mods/ca/maps/styx-ca.oramap differ diff --git a/mods/ca/maps/subjucated-ca.oramap b/mods/ca/maps/subjucated-ca.oramap new file mode 100644 index 0000000000..96ed530b92 Binary files /dev/null and b/mods/ca/maps/subjucated-ca.oramap differ diff --git a/mods/ca/maps/suicide-circle-ca.oramap b/mods/ca/maps/suicide-circle-ca.oramap index 61e582b781..008f5c768e 100644 Binary files a/mods/ca/maps/suicide-circle-ca.oramap and b/mods/ca/maps/suicide-circle-ca.oramap differ diff --git a/mods/ca/maps/sullied-valleys-ca.oramap b/mods/ca/maps/sullied-valleys-ca.oramap new file mode 100644 index 0000000000..d4ec12372b Binary files /dev/null and b/mods/ca/maps/sullied-valleys-ca.oramap differ diff --git a/mods/ca/maps/summer-camp-ca.oramap b/mods/ca/maps/summer-camp-ca.oramap new file mode 100644 index 0000000000..f7c45a9dd1 Binary files /dev/null and b/mods/ca/maps/summer-camp-ca.oramap differ diff --git a/mods/ca/maps/sunscreen-ca.oramap b/mods/ca/maps/sunscreen-ca.oramap index cec6ea14d5..a0695ad3e7 100644 Binary files a/mods/ca/maps/sunscreen-ca.oramap and b/mods/ca/maps/sunscreen-ca.oramap differ diff --git a/mods/ca/maps/sunstroke.oramap b/mods/ca/maps/sunstroke.oramap index 6d66c0f33a..ff131cc598 100644 Binary files a/mods/ca/maps/sunstroke.oramap and b/mods/ca/maps/sunstroke.oramap differ diff --git a/mods/ca/maps/superweapons-complex.oramap b/mods/ca/maps/superweapons-complex.oramap index 3021aea6cb..c180fc71e4 100644 Binary files a/mods/ca/maps/superweapons-complex.oramap and b/mods/ca/maps/superweapons-complex.oramap differ diff --git a/mods/ca/maps/synergy.oramap b/mods/ca/maps/synergy.oramap index 7a1589e45f..98a1454407 100644 Binary files a/mods/ca/maps/synergy.oramap and b/mods/ca/maps/synergy.oramap differ diff --git a/mods/ca/maps/tabula-rasa.oramap b/mods/ca/maps/tabula-rasa.oramap index cea68da8cb..9ddfb87ab0 100644 Binary files a/mods/ca/maps/tabula-rasa.oramap and b/mods/ca/maps/tabula-rasa.oramap differ diff --git a/mods/ca/maps/taiga-vortex-ca.oramap b/mods/ca/maps/taiga-vortex-ca.oramap new file mode 100644 index 0000000000..b9a22f9b71 Binary files /dev/null and b/mods/ca/maps/taiga-vortex-ca.oramap differ diff --git a/mods/ca/maps/tainted-peak.oramap b/mods/ca/maps/tainted-peak.oramap index 5fe0f35fe4..c12c1112c9 100644 Binary files a/mods/ca/maps/tainted-peak.oramap and b/mods/ca/maps/tainted-peak.oramap differ diff --git a/mods/ca/maps/taliban-ca.oramap b/mods/ca/maps/taliban-ca.oramap index b3d9226ff0..8cf4525b43 100644 Binary files a/mods/ca/maps/taliban-ca.oramap and b/mods/ca/maps/taliban-ca.oramap differ diff --git a/mods/ca/maps/tandem.oramap b/mods/ca/maps/tandem.oramap index 7223185636..60ed3a2836 100644 Binary files a/mods/ca/maps/tandem.oramap and b/mods/ca/maps/tandem.oramap differ diff --git a/mods/ca/maps/tank-trap-ca.oramap b/mods/ca/maps/tank-trap-ca.oramap new file mode 100644 index 0000000000..464d83245c Binary files /dev/null and b/mods/ca/maps/tank-trap-ca.oramap differ diff --git a/mods/ca/maps/tarback-ca.oramap b/mods/ca/maps/tarback-ca.oramap new file mode 100644 index 0000000000..450f1720c9 Binary files /dev/null and b/mods/ca/maps/tarback-ca.oramap differ diff --git a/mods/ca/maps/team-mastermind-madness/map.bin b/mods/ca/maps/team-mastermind-madness/map.bin new file mode 100644 index 0000000000..bdd1b23279 Binary files /dev/null and b/mods/ca/maps/team-mastermind-madness/map.bin differ diff --git a/mods/ca/maps/team-mastermind-madness/map.png b/mods/ca/maps/team-mastermind-madness/map.png new file mode 100644 index 0000000000..2775052294 Binary files /dev/null and b/mods/ca/maps/team-mastermind-madness/map.png differ diff --git a/mods/ca/maps/team-mastermind-madness/map.yaml b/mods/ca/maps/team-mastermind-madness/map.yaml new file mode 100644 index 0000000000..dfafd49069 --- /dev/null +++ b/mods/ca/maps/team-mastermind-madness/map.yaml @@ -0,0 +1,2373 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: Team Mastermind Madness + +Author: Darkademic + +Tileset: INTERIOR + +MapSize: 77,77 + +Bounds: 1,1,75,75 + +Visibility: Lobby + +Categories: Minigame + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: england + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: england + Enemies: Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Multi6, Multi7, Multi8, Multi9, Multi10, Multi11 + PlayerReference@Multi0: + Name: Multi0 + AllowBots: False + Playable: True + LockFaction: True + Faction: RandomScrin + LockSpawn: True + Spawn: 1 + LockTeam: True + Team: 1 + Enemies: Creeps, Neutral + PlayerReference@Multi1: + Name: Multi1 + AllowBots: False + Playable: True + LockFaction: True + Faction: RandomScrin + LockSpawn: True + Spawn: 2 + LockTeam: True + Team: 1 + Enemies: Creeps, Neutral + PlayerReference@Multi2: + Name: Multi2 + AllowBots: False + Playable: True + LockFaction: True + Faction: RandomScrin + LockSpawn: True + Spawn: 3 + LockTeam: True + Team: 1 + Enemies: Creeps, Neutral + PlayerReference@Multi3: + Name: Multi3 + AllowBots: False + Playable: True + LockFaction: True + Faction: RandomScrin + LockSpawn: True + Spawn: 4 + LockTeam: True + Team: 1 + Enemies: Creeps, Neutral + PlayerReference@Multi4: + Name: Multi4 + AllowBots: False + Playable: True + LockFaction: True + Faction: RandomScrin + LockSpawn: True + Spawn: 5 + LockTeam: True + Team: 1 + Enemies: Creeps, Neutral + PlayerReference@Multi5: + Name: Multi5 + AllowBots: False + Playable: True + LockFaction: True + Faction: RandomScrin + LockSpawn: True + Spawn: 6 + LockTeam: True + Team: 1 + Enemies: Creeps, Neutral + PlayerReference@Multi6: + Name: Multi6 + AllowBots: False + Playable: True + LockFaction: True + Faction: RandomScrin + LockSpawn: True + Spawn: 7 + LockTeam: True + Team: 2 + Enemies: Creeps, Neutral + PlayerReference@Multi7: + Name: Multi7 + AllowBots: False + Playable: True + LockFaction: True + Faction: RandomScrin + LockSpawn: True + Spawn: 8 + LockTeam: True + Team: 2 + Enemies: Creeps, Neutral + PlayerReference@Multi8: + Name: Multi8 + AllowBots: False + Playable: True + LockFaction: True + Faction: RandomScrin + LockSpawn: True + Spawn: 9 + LockTeam: True + Team: 2 + Enemies: Creeps, Neutral + PlayerReference@Multi9: + Name: Multi9 + AllowBots: False + Playable: True + LockFaction: True + Faction: RandomScrin + LockSpawn: True + Spawn: 10 + LockTeam: True + Team: 2 + Enemies: Creeps, Neutral + PlayerReference@Multi10: + Name: Multi10 + AllowBots: False + Playable: True + LockFaction: True + Faction: RandomScrin + LockSpawn: True + Spawn: 11 + LockTeam: True + Team: 2 + Enemies: Creeps, Neutral + PlayerReference@Multi11: + Name: Multi11 + AllowBots: False + Playable: True + LockFaction: True + Faction: RandomScrin + LockSpawn: True + Spawn: 12 + LockTeam: True + Team: 2 + Enemies: Creeps, Neutral + +Actors: + Actor28: rndv + Owner: Neutral + Facing: 384 + Location: 22,48 + Actor29: rndv + Owner: Neutral + Facing: 384 + Location: 25,48 + Actor30: rndv + Owner: Neutral + Facing: 384 + Location: 28,48 + Actor31: rndv + Owner: Neutral + Facing: 384 + Location: 28,51 + Actor32: rndv + Owner: Neutral + Facing: 384 + Location: 25,51 + Actor33: rndv + Owner: Neutral + Facing: 384 + Location: 22,51 + Actor34: rndv + Owner: Neutral + Facing: 384 + Location: 22,54 + Actor35: rndv + Owner: Neutral + Facing: 384 + Location: 25,54 + Actor36: rndv + Owner: Neutral + Facing: 384 + Location: 28,54 + Actor37: rndv + Owner: Neutral + Location: 48,54 + Facing: 640 + Actor38: rndv + Owner: Neutral + Location: 48,51 + Facing: 640 + Actor39: rndv + Owner: Neutral + Location: 48,48 + Facing: 640 + Actor40: rndv + Owner: Neutral + Location: 51,48 + Facing: 640 + Actor41: rndv + Owner: Neutral + Location: 54,48 + Facing: 640 + Actor42: rndv + Owner: Neutral + Location: 54,51 + Facing: 640 + Actor43: rndv + Owner: Neutral + Location: 51,51 + Facing: 640 + Actor44: rndv + Owner: Neutral + Location: 51,54 + Facing: 640 + Actor45: rndv + Owner: Neutral + Location: 54,54 + Facing: 640 + Actor46: rndv + Owner: Neutral + Location: 48,28 + Facing: 896 + Actor47: rndv + Owner: Neutral + Location: 48,25 + Facing: 896 + Actor48: rndv + Owner: Neutral + Location: 48,22 + Facing: 896 + Actor49: rndv + Owner: Neutral + Location: 51,22 + Facing: 896 + Actor50: rndv + Owner: Neutral + Location: 51,25 + Facing: 896 + Actor51: rndv + Owner: Neutral + Location: 51,28 + Facing: 896 + Actor52: rndv + Owner: Neutral + Location: 54,28 + Facing: 896 + Actor53: rndv + Owner: Neutral + Location: 54,25 + Facing: 896 + Actor54: rndv + Owner: Neutral + Location: 54,22 + Facing: 896 + Actor55: rndv + Owner: Neutral + Location: 22,28 + Facing: 128 + Actor56: rndv + Owner: Neutral + Location: 22,25 + Facing: 128 + Actor57: rndv + Owner: Neutral + Location: 22,22 + Facing: 128 + Actor58: rndv + Owner: Neutral + Location: 25,22 + Facing: 128 + Actor59: rndv + Owner: Neutral + Location: 25,25 + Facing: 128 + Actor60: rndv + Owner: Neutral + Location: 25,28 + Facing: 128 + Actor61: rndv + Owner: Neutral + Location: 28,28 + Facing: 128 + Actor62: rndv + Owner: Neutral + Location: 28,25 + Facing: 128 + Actor63: rndv + Owner: Neutral + Location: 28,22 + Facing: 128 + Actor64: rndb + Owner: Neutral + Facing: 384 + Location: 35,41 + Actor65: rndb + Owner: Neutral + Location: 35,38 + Facing: 256 + Actor66: rndb + Owner: Neutral + Location: 35,35 + Facing: 128 + Actor67: rndb + Owner: Neutral + Location: 38,35 + Facing: 0 + Actor68: rndb + Owner: Neutral + Location: 41,35 + Facing: 896 + Actor69: rndb + Owner: Neutral + Location: 41,38 + Facing: 768 + Actor71: rndb + Owner: Neutral + Location: 38,41 + Facing: 512 + Actor72: rndb + Owner: Neutral + Location: 41,41 + Facing: 640 + Actor73: rndv + Owner: Neutral + Location: 4,25 + Facing: 640 + Actor74: rndv + Owner: Neutral + Location: 4,21 + Facing: 640 + Actor75: rndv + Owner: Neutral + Location: 21,4 + Facing: 640 + Actor76: rndv + Owner: Neutral + Location: 25,4 + Facing: 640 + Actor77: rndv + Owner: Neutral + Facing: 384 + Location: 51,4 + Actor78: rndv + Owner: Neutral + Facing: 384 + Location: 55,4 + Actor79: rndv + Owner: Neutral + Facing: 384 + Location: 72,25 + Actor80: rndv + Owner: Neutral + Facing: 384 + Location: 72,21 + Actor81: rndv + Owner: Neutral + Location: 72,51 + Facing: 128 + Actor82: rndv + Owner: Neutral + Location: 72,55 + Facing: 128 + Actor83: rndv + Owner: Neutral + Location: 51,72 + Facing: 128 + Actor84: rndv + Owner: Neutral + Location: 55,72 + Facing: 128 + Actor85: rndv + Owner: Neutral + Location: 21,72 + Facing: 896 + Actor86: rndv + Owner: Neutral + Location: 25,72 + Facing: 896 + Actor87: rndv + Owner: Neutral + Location: 4,55 + Facing: 896 + Actor88: rndv + Owner: Neutral + Location: 4,51 + Facing: 896 + Actor101: ftur + Owner: Neutral + Location: 43,55 + Actor102: ftur + Owner: Neutral + Location: 33,55 + Actor103: ftur + Owner: Neutral + Location: 55,43 + Actor104: ftur + Owner: Neutral + Location: 55,33 + Actor105: ftur + Owner: Neutral + Location: 21,33 + Actor106: ftur + Owner: Neutral + Location: 21,43 + Actor107: ftur + Owner: Neutral + Location: 33,21 + Actor108: ftur + Owner: Neutral + Location: 43,21 + Actor109: chain + Owner: Neutral + Location: 33,43 + Actor110: chain + Owner: Neutral + Location: 33,42 + Actor111: chain + Owner: Neutral + Location: 34,43 + Actor112: chain + Owner: Neutral + Location: 33,41 + Actor113: chain + Owner: Neutral + Location: 33,40 + Actor114: chain + Owner: Neutral + Location: 33,39 + Actor115: chain + Owner: Neutral + Location: 33,38 + Actor116: chain + Owner: Neutral + Location: 33,37 + Actor117: chain + Owner: Neutral + Location: 33,36 + Actor118: chain + Owner: Neutral + Location: 33,35 + Actor119: chain + Owner: Neutral + Location: 33,34 + Actor120: chain + Owner: Neutral + Location: 33,33 + Actor121: chain + Owner: Neutral + Location: 34,33 + Actor122: chain + Owner: Neutral + Location: 35,33 + Actor123: chain + Owner: Neutral + Location: 36,33 + Actor124: chain + Owner: Neutral + Location: 37,33 + Actor125: chain + Owner: Neutral + Location: 38,33 + Actor126: chain + Owner: Neutral + Location: 39,33 + Actor127: chain + Owner: Neutral + Location: 40,33 + Actor128: chain + Owner: Neutral + Location: 41,33 + Actor129: chain + Owner: Neutral + Location: 42,33 + Actor130: chain + Owner: Neutral + Location: 43,33 + Actor131: chain + Owner: Neutral + Location: 43,34 + Actor132: chain + Owner: Neutral + Location: 43,35 + Actor133: chain + Owner: Neutral + Location: 43,36 + Actor134: chain + Owner: Neutral + Location: 43,37 + Actor135: chain + Owner: Neutral + Location: 43,38 + Actor136: chain + Owner: Neutral + Location: 43,39 + Actor137: chain + Owner: Neutral + Location: 43,40 + Actor138: chain + Owner: Neutral + Location: 43,41 + Actor139: chain + Owner: Neutral + Location: 43,42 + Actor140: chain + Owner: Neutral + Location: 43,43 + Actor141: chain + Owner: Neutral + Location: 42,43 + Actor142: chain + Owner: Neutral + Location: 41,43 + Actor143: chain + Owner: Neutral + Location: 40,43 + Actor144: chain + Owner: Neutral + Location: 39,43 + Actor145: chain + Owner: Neutral + Location: 38,43 + Actor146: chain + Owner: Neutral + Location: 37,43 + Actor147: chain + Owner: Neutral + Location: 36,43 + Actor148: chain + Owner: Neutral + Location: 35,43 + Actor149: barb + Owner: Neutral + Location: 28,41 + Actor150: barb + Owner: Neutral + Location: 28,42 + Actor151: barb + Owner: Neutral + Location: 28,43 + Actor152: barb + Owner: Neutral + Location: 28,35 + Actor153: barb + Owner: Neutral + Location: 28,34 + Actor154: barb + Owner: Neutral + Location: 28,33 + Actor155: barb + Owner: Neutral + Location: 33,48 + Actor156: barb + Owner: Neutral + Location: 34,48 + Actor157: barb + Owner: Neutral + Location: 35,48 + Actor158: barb + Owner: Neutral + Location: 41,48 + Actor159: barb + Owner: Neutral + Location: 42,48 + Actor160: barb + Owner: Neutral + Location: 43,48 + Actor161: barb + Owner: Neutral + Location: 48,43 + Actor162: barb + Owner: Neutral + Location: 48,42 + Actor163: barb + Owner: Neutral + Location: 48,41 + Actor164: barb + Owner: Neutral + Location: 48,35 + Actor165: barb + Owner: Neutral + Location: 48,34 + Actor166: barb + Owner: Neutral + Location: 48,33 + Actor167: barb + Owner: Neutral + Location: 43,28 + Actor168: barb + Owner: Neutral + Location: 42,28 + Actor169: barb + Owner: Neutral + Location: 41,28 + Actor170: barb + Owner: Neutral + Location: 35,28 + Actor171: barb + Owner: Neutral + Location: 34,28 + Actor172: barb + Owner: Neutral + Location: 33,28 + Actor173: miss + Owner: Neutral + Location: 37,37 + Actor174: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 5,10 + Actor175: e1 + Owner: Neutral + Facing: 384 + Location: 6,10 + SubCell: 3 + Actor176: e1 + Owner: Neutral + Facing: 384 + Location: 7,10 + SubCell: 3 + Actor177: e1 + Owner: Neutral + Facing: 384 + Location: 8,10 + SubCell: 3 + Actor178: e1 + Owner: Neutral + Facing: 384 + Location: 9,10 + SubCell: 3 + Actor179: e1 + Owner: Neutral + Facing: 384 + Location: 10,10 + SubCell: 3 + Actor180: e1 + Owner: Neutral + Facing: 384 + Location: 11,10 + SubCell: 3 + Actor181: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 35,10 + Actor182: e1 + Owner: Neutral + Facing: 384 + Location: 36,10 + SubCell: 3 + Actor183: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 37,10 + Actor184: e1 + Owner: Neutral + Facing: 384 + Location: 38,10 + SubCell: 3 + Actor185: e1 + Owner: Neutral + Facing: 384 + Location: 39,10 + SubCell: 3 + Actor186: e1 + Owner: Neutral + Facing: 384 + Location: 40,10 + SubCell: 3 + Actor187: e1 + Owner: Neutral + Facing: 384 + Location: 41,10 + SubCell: 3 + Actor188: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 65,10 + Actor189: e1 + Owner: Neutral + Facing: 384 + Location: 66,10 + SubCell: 3 + Actor190: e1 + Owner: Neutral + Facing: 384 + Location: 67,10 + SubCell: 3 + Actor191: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 69,10 + Actor192: e1 + Owner: Neutral + Facing: 384 + Location: 70,10 + SubCell: 3 + Actor193: e1 + Owner: Neutral + Facing: 384 + Location: 71,10 + SubCell: 3 + Actor194: e1 + Owner: Neutral + Facing: 384 + Location: 68,10 + SubCell: 3 + Actor195: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 66,41 + Actor196: e1 + Owner: Neutral + Facing: 384 + Location: 66,40 + SubCell: 3 + Actor197: e1 + Owner: Neutral + Facing: 384 + Location: 66,39 + SubCell: 3 + Actor199: e1 + Owner: Neutral + Facing: 384 + Location: 66,37 + SubCell: 3 + Actor200: e1 + Owner: Neutral + Facing: 384 + Location: 66,36 + SubCell: 3 + Actor201: e1 + Owner: Neutral + Facing: 384 + Location: 66,35 + SubCell: 3 + Actor202: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 10,41 + Actor203: e1 + Owner: Neutral + Facing: 384 + Location: 10,40 + SubCell: 3 + Actor204: e1 + Owner: Neutral + Facing: 384 + Location: 10,39 + SubCell: 3 + Actor205: e1 + Owner: Neutral + Facing: 384 + Location: 10,38 + SubCell: 3 + Actor206: e1 + Owner: Neutral + Facing: 384 + Location: 10,37 + SubCell: 3 + Actor207: e1 + Owner: Neutral + Facing: 384 + Location: 10,36 + SubCell: 3 + Actor208: e1 + Owner: Neutral + Facing: 384 + Location: 10,35 + SubCell: 3 + Actor209: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 5,66 + Actor210: e1 + Owner: Neutral + Facing: 384 + Location: 6,66 + SubCell: 3 + Actor211: e1 + Owner: Neutral + Facing: 384 + Location: 7,66 + SubCell: 3 + Actor212: e1 + Owner: Neutral + Facing: 384 + Location: 8,66 + SubCell: 3 + Actor213: e1 + Owner: Neutral + Facing: 384 + Location: 9,66 + SubCell: 3 + Actor214: e1 + Owner: Neutral + Facing: 384 + Location: 10,66 + SubCell: 3 + Actor216: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 35,66 + Actor217: e1 + Owner: Neutral + Facing: 384 + Location: 36,66 + SubCell: 3 + Actor218: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 38,66 + Actor219: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 40,66 + Actor220: e1 + Owner: Neutral + Facing: 384 + Location: 39,66 + SubCell: 3 + Actor221: e1 + Owner: Neutral + Facing: 384 + Location: 41,66 + SubCell: 3 + Actor222: e1 + Owner: Neutral + Facing: 384 + Location: 37,66 + SubCell: 3 + Actor223: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 65,66 + Actor224: e1 + Owner: Neutral + Facing: 384 + Location: 66,66 + SubCell: 3 + Actor225: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 67,66 + Actor226: e1 + Owner: Neutral + Facing: 384 + Location: 68,66 + SubCell: 3 + Actor227: e1 + Owner: Neutral + Facing: 384 + Location: 69,66 + SubCell: 3 + Actor228: e1 + Owner: Neutral + Facing: 384 + Location: 70,66 + SubCell: 3 + Actor229: e1 + Owner: Neutral + Facing: 384 + Location: 71,66 + SubCell: 3 + Actor230: e3 + Owner: Neutral + SubCell: 3 + Facing: 384 + Location: 65,70 + Actor231: e3 + Owner: Neutral + Facing: 384 + Location: 66,70 + SubCell: 3 + Actor232: e3 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 35,70 + Actor233: e3 + Owner: Neutral + Facing: 384 + Location: 36,70 + SubCell: 3 + Actor234: e3 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 5,70 + Actor235: e3 + Owner: Neutral + Facing: 384 + Location: 6,70 + SubCell: 3 + Actor236: e3 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 70,41 + Actor237: e3 + Owner: Neutral + Facing: 384 + Location: 70,40 + SubCell: 3 + Actor238: e3 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 6,41 + Actor239: e3 + Owner: Neutral + Facing: 384 + Location: 6,40 + SubCell: 3 + Actor240: e3 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 65,6 + Actor241: e3 + Owner: Neutral + Facing: 384 + Location: 66,6 + SubCell: 3 + Actor242: e3 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 5,6 + Actor243: e3 + Owner: Neutral + Facing: 384 + Location: 6,6 + SubCell: 3 + Actor244: e3 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 35,6 + Actor245: e3 + Owner: Neutral + Facing: 384 + Location: 36,6 + SubCell: 3 + Actor246: e4 + Owner: Neutral + SubCell: 3 + Facing: 384 + Location: 67,70 + Actor247: e4 + Owner: Neutral + Facing: 384 + Location: 68,70 + SubCell: 3 + Actor248: e4 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 7,70 + Actor249: e4 + Owner: Neutral + Facing: 384 + Location: 8,70 + SubCell: 3 + Actor250: e4 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 6,39 + Actor251: e4 + Owner: Neutral + Facing: 384 + Location: 6,38 + SubCell: 3 + Actor252: e4 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 70,39 + Actor253: e4 + Owner: Neutral + Facing: 384 + Location: 70,38 + SubCell: 3 + Actor254: e4 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 67,6 + Actor255: e4 + Owner: Neutral + Facing: 384 + Location: 68,6 + SubCell: 3 + Actor256: e4 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 37,6 + Actor257: e4 + Owner: Neutral + Facing: 384 + Location: 38,6 + SubCell: 3 + Actor258: e4 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 7,6 + Actor259: e4 + Owner: Neutral + Facing: 384 + Location: 8,6 + SubCell: 3 + Actor260: mech + Owner: Neutral + SubCell: 3 + Facing: 384 + Location: 4,23 + Actor261: mech + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 23,4 + Actor262: mech + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 53,4 + Actor263: mech + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 72,23 + Actor264: mech + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 72,53 + Actor265: mech + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 53,72 + Actor266: mech + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 23,72 + Actor267: mech + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 4,53 + Actor268: medi + Owner: Neutral + SubCell: 3 + Facing: 384 + Location: 9,6 + Actor269: medi + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 39,6 + Actor270: medi + Owner: Neutral + Facing: 384 + Location: 69,6 + SubCell: 3 + Actor271: medi + Owner: Neutral + Facing: 384 + Location: 70,37 + SubCell: 3 + Actor272: medi + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 69,70 + Actor273: medi + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 39,70 + Actor274: medi + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 9,70 + Actor275: medi + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 6,37 + Actor276: e4 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 37,70 + Actor277: e4 + Owner: Neutral + Facing: 384 + Location: 38,70 + SubCell: 3 + Actor278: shok + Owner: Neutral + SubCell: 3 + Facing: 384 + Location: 40,70 + Actor279: shok + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 10,70 + Actor280: shok + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 70,70 + Actor281: shok + Owner: Neutral + Facing: 384 + Location: 70,36 + SubCell: 3 + Actor282: shok + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 6,36 + Actor283: shok + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 10,6 + Actor284: shok + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 70,6 + Actor285: e2 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 5,71 + Actor286: e2 + Owner: Neutral + Facing: 384 + Location: 6,71 + SubCell: 3 + Actor287: e2 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 5,41 + Actor288: e2 + Owner: Neutral + Facing: 384 + Location: 5,40 + SubCell: 3 + Actor289: e2 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 65,71 + Actor290: e2 + Owner: Neutral + Facing: 384 + Location: 66,71 + SubCell: 3 + Actor291: e2 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 35,71 + Actor292: e2 + Owner: Neutral + Facing: 384 + Location: 36,71 + SubCell: 3 + Actor293: e2 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 71,41 + Actor294: e2 + Owner: Neutral + Facing: 384 + Location: 71,40 + SubCell: 3 + Actor295: e2 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 5,5 + Actor296: e2 + Owner: Neutral + Facing: 384 + Location: 6,5 + SubCell: 3 + Actor297: e2 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 35,5 + Actor298: e2 + Owner: Neutral + Facing: 384 + Location: 36,5 + SubCell: 3 + Actor299: e2 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 65,5 + Actor300: e2 + Owner: Neutral + Facing: 384 + Location: 66,5 + SubCell: 3 + Actor301: acol + Owner: Neutral + Facing: 384 + Location: 71,6 + SubCell: 3 + Actor302: acol + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 41,6 + Actor303: acol + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 11,6 + Actor304: acol + Owner: Neutral + Facing: 384 + Location: 6,35 + SubCell: 3 + Actor305: acol + Owner: Neutral + Facing: 384 + Location: 11,70 + SubCell: 3 + Actor306: acol + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 71,70 + Actor307: acol + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 70,35 + Actor308: shok + Owner: Neutral + Facing: 384 + Location: 40,6 + SubCell: 3 + Actor313: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 9,36 + Actor314: e1 + Owner: Neutral + Facing: 384 + Location: 9,35 + SubCell: 3 + Actor315: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 9,41 + Actor316: e1 + Owner: Neutral + Facing: 384 + Location: 9,40 + SubCell: 3 + Actor329: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 67,41 + Actor330: e1 + Owner: Neutral + Facing: 384 + Location: 67,40 + SubCell: 3 + Actor333: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 67,36 + Actor334: e1 + Owner: Neutral + Facing: 384 + Location: 67,35 + SubCell: 3 + Actor341: acol + Owner: Neutral + SubCell: 3 + Facing: 384 + Location: 41,70 + Actor342: dog + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 7,5 + Actor343: dog + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 5,39 + Actor344: dog + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 7,71 + Actor345: dog + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 37,71 + Actor346: dog + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 67,71 + Actor347: dog + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 71,39 + Actor348: dog + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 67,5 + Actor349: dog + Owner: Neutral + Facing: 384 + Location: 37,5 + SubCell: 3 + Actor350: bh + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 68,5 + Actor351: bh + Owner: Neutral + Facing: 384 + Location: 38,5 + SubCell: 3 + Actor352: bh + Owner: Neutral + Facing: 384 + Location: 8,5 + SubCell: 3 + Actor353: bh + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 5,38 + Actor354: bh + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 8,71 + Actor355: bh + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 38,71 + Actor356: bh + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 68,71 + Actor357: bh + Owner: Neutral + Facing: 384 + Location: 71,38 + SubCell: 3 + Actor358: ivan + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 69,5 + Actor359: ivan + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 39,5 + Actor360: ivan + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 9,5 + Actor361: ivan + Owner: Neutral + Facing: 384 + Location: 5,37 + SubCell: 3 + Actor362: ivan + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 9,71 + Actor363: ivan + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 39,71 + Actor364: ivan + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 69,71 + Actor365: ivan + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 71,37 + Actor366: s2 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 70,5 + Actor367: s4 + Owner: Neutral + SubCell: 3 + Facing: 384 + Location: 71,5 + Actor368: s4 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 71,35 + Actor369: s4 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 71,71 + Actor370: s4 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 41,71 + Actor371: s4 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 11,71 + Actor372: s4 + Owner: Neutral + Facing: 384 + Location: 5,35 + SubCell: 3 + Actor373: s4 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 11,5 + Actor374: s4 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 41,5 + Actor375: s2 + Owner: Neutral + SubCell: 3 + Facing: 384 + Location: 70,71 + Actor376: s2 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 40,71 + Actor377: s2 + Owner: Neutral + Facing: 384 + Location: 10,71 + SubCell: 3 + Actor378: s2 + Owner: Neutral + Facing: 384 + Location: 5,36 + SubCell: 3 + Actor379: s2 + Owner: Neutral + Facing: 384 + Location: 10,5 + SubCell: 3 + Actor380: s2 + Owner: Neutral + Facing: 384 + Location: 40,5 + SubCell: 3 + Actor381: s2 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 71,36 + Actor382: s1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 68,36 + Actor383: s1 + Owner: Neutral + Facing: 384 + Location: 68,35 + SubCell: 3 + Actor384: s1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 68,40 + Actor385: s1 + Owner: Neutral + Facing: 384 + Location: 68,41 + SubCell: 3 + Actor386: s1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 8,40 + Actor387: s1 + Owner: Neutral + Facing: 384 + Location: 8,41 + SubCell: 3 + Actor388: s1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 8,36 + Actor389: s1 + Owner: Neutral + Facing: 384 + Location: 8,35 + SubCell: 3 + Actor414: atwr + Owner: Neutral + Location: 38,24 + Actor415: atwr + Owner: Neutral + Location: 38,52 + Actor416: atwr + Owner: Neutral + Location: 24,38 + Actor417: atwr + Owner: Neutral + Location: 52,38 + Actor418: rmbc + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 38,39 + Actor419: jeep + Owner: Neutral + Location: 13,63 + Facing: 896 + Actor420: jeep + Owner: Neutral + Location: 38,63 + Facing: 0 + Actor423: jeep + Owner: Neutral + Location: 63,63 + Facing: 128 + Actor424: jeep + Owner: Neutral + Location: 13,13 + Facing: 640 + Actor425: jeep + Owner: Neutral + Location: 63,13 + Facing: 384 + Actor426: 1tnk + Owner: Neutral + Facing: 384 + Location: 73,3 + Actor427: 1tnk + Owner: Neutral + Location: 3,3 + Facing: 640 + Actor428: 1tnk + Owner: Neutral + Location: 3,73 + Facing: 896 + Actor429: 1tnk + Owner: Neutral + Location: 73,73 + Facing: 128 + Actor432: n1c + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 3,53 + Actor433: n1c + Owner: Neutral + Facing: 384 + Location: 5,53 + SubCell: 3 + Actor434: n1c + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 23,73 + Actor435: n1c + Owner: Neutral + Facing: 384 + Location: 23,71 + SubCell: 3 + Actor436: n1c + Owner: Neutral + Facing: 384 + Location: 53,73 + SubCell: 3 + Actor437: n1c + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 53,71 + Actor438: n1c + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 71,53 + Actor439: n1c + Owner: Neutral + Facing: 384 + Location: 73,53 + SubCell: 3 + Actor440: n1c + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 71,23 + Actor441: n1c + Owner: Neutral + Facing: 384 + Location: 73,23 + SubCell: 3 + Actor442: n1c + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 53,5 + Actor444: n1c + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 53,3 + Actor443: n1c + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 23,5 + Actor445: n1c + Owner: Neutral + Facing: 384 + Location: 23,3 + SubCell: 3 + Actor446: n1c + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 5,23 + Actor447: n1c + Owner: Neutral + Facing: 384 + Location: 3,23 + SubCell: 3 + Actor448: n3c + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 74,51 + Actor451: n3c + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 55,74 + Actor453: n3c + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 25,74 + Actor454: n3c + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 2,55 + Actor456: n3c + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 2,25 + Actor458: n3c + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 21,2 + Actor457: n3c + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 51,2 + Actor459: n3c + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 74,21 + Actor449: n5 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 2,21 + Actor450: n5 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 25,2 + Actor452: n5 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 55,2 + Actor455: n5 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 74,25 + Actor460: n5 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 74,55 + Actor461: n5 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 51,74 + Actor462: n5 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 21,74 + Actor463: n5 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 2,51 + Actor464: 1tnk + Owner: Neutral + Location: 38,73 + Facing: 0 + Actor465: 1tnk + Owner: Neutral + Location: 38,3 + Facing: 512 + Actor466: jeep + Owner: Neutral + Location: 38,13 + Facing: 512 + Actor467: gun.nod + Owner: Neutral + Location: 11,65 + TurretFacing: 892 + Actor468: gun.nod + Owner: Neutral + Location: 38,65 + TurretFacing: 0 + Actor469: gun.nod + Owner: Neutral + Location: 65,65 + TurretFacing: 128 + Actor470: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 66,38 + Actor472: gun.nod + Owner: Neutral + Location: 65,11 + TurretFacing: 384 + Actor473: gun.nod + Owner: Neutral + Location: 38,11 + TurretFacing: 512 + Actor474: gun.nod + Owner: Neutral + Location: 11,11 + TurretFacing: 640 + Actor476: cram + Owner: Neutral + Location: 0,0 + TurretFacing: 832 + Actor477: brik + Owner: Neutral + Location: 32,32 + Actor478: brik + Owner: Neutral + Location: 32,33 + Actor479: brik + Owner: Neutral + Location: 32,34 + Actor480: brik + Owner: Neutral + Location: 32,35 + Actor481: brik + Owner: Neutral + Location: 32,36 + Actor482: brik + Owner: Neutral + Location: 32,37 + Actor483: brik + Owner: Neutral + Location: 32,38 + Actor484: brik + Owner: Neutral + Location: 32,39 + Actor485: brik + Owner: Neutral + Location: 32,40 + Actor486: brik + Owner: Neutral + Location: 32,41 + Actor487: brik + Owner: Neutral + Location: 32,42 + Actor488: brik + Owner: Neutral + Location: 32,43 + Actor489: brik + Owner: Neutral + Location: 32,44 + Actor490: brik + Owner: Neutral + Location: 33,44 + Actor491: brik + Owner: Neutral + Location: 34,44 + Actor492: brik + Owner: Neutral + Location: 35,44 + Actor493: brik + Owner: Neutral + Location: 36,44 + Actor494: brik + Owner: Neutral + Location: 33,32 + Actor495: brik + Owner: Neutral + Location: 35,32 + Actor496: brik + Owner: Neutral + Location: 34,32 + Actor497: brik + Owner: Neutral + Location: 36,32 + Actor498: brik + Owner: Neutral + Location: 37,32 + Actor499: brik + Owner: Neutral + Location: 38,32 + Actor500: brik + Owner: Neutral + Location: 39,32 + Actor501: brik + Owner: Neutral + Location: 40,32 + Actor502: brik + Owner: Neutral + Location: 41,32 + Actor503: brik + Owner: Neutral + Location: 43,32 + Actor504: brik + Owner: Neutral + Location: 42,32 + Actor505: brik + Owner: Neutral + Location: 44,32 + Actor506: brik + Owner: Neutral + Location: 44,33 + Actor507: brik + Owner: Neutral + Location: 44,34 + Actor508: brik + Owner: Neutral + Location: 44,35 + Actor509: brik + Owner: Neutral + Location: 44,36 + Actor510: brik + Owner: Neutral + Location: 44,38 + Actor511: brik + Owner: Neutral + Location: 44,37 + Actor512: brik + Owner: Neutral + Location: 44,39 + Actor513: brik + Owner: Neutral + Location: 44,40 + Actor514: brik + Owner: Neutral + Location: 44,41 + Actor515: brik + Owner: Neutral + Location: 44,42 + Actor516: brik + Owner: Neutral + Location: 44,43 + Actor517: brik + Owner: Neutral + Location: 44,44 + Actor518: brik + Owner: Neutral + Location: 43,44 + Actor519: brik + Owner: Neutral + Location: 42,44 + Actor520: brik + Owner: Neutral + Location: 41,44 + Actor521: brik + Owner: Neutral + Location: 40,44 + Actor522: brik + Owner: Neutral + Location: 39,44 + Actor523: brik + Owner: Neutral + Location: 38,44 + Actor524: brik + Owner: Neutral + Location: 37,44 + Actor525: rmbc + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 37,39 + Actor526: rmbc + Owner: Neutral + Facing: 384 + Location: 39,39 + SubCell: 3 + Actor527: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 27,34 + Actor528: e1 + Owner: Neutral + Facing: 384 + Location: 27,35 + SubCell: 3 + Actor529: e1 + Owner: Neutral + Facing: 384 + Location: 27,42 + SubCell: 3 + Actor530: e1 + Owner: Neutral + Facing: 384 + Location: 27,43 + SubCell: 3 + Actor531: e1 + Owner: Neutral + Facing: 384 + Location: 27,41 + SubCell: 3 + Actor532: e1 + Owner: Neutral + Facing: 384 + Location: 27,33 + SubCell: 3 + Actor533: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 33,49 + Actor534: e1 + Owner: Neutral + Facing: 384 + Location: 34,49 + SubCell: 3 + Actor535: e1 + Owner: Neutral + Facing: 384 + Location: 35,49 + SubCell: 3 + Actor536: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 41,49 + Actor537: e1 + Owner: Neutral + Facing: 384 + Location: 42,49 + SubCell: 3 + Actor538: e1 + Owner: Neutral + Facing: 384 + Location: 43,49 + SubCell: 3 + Actor539: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 49,43 + Actor540: e1 + Owner: Neutral + Facing: 384 + Location: 49,42 + SubCell: 3 + Actor541: e1 + Owner: Neutral + Facing: 384 + Location: 49,41 + SubCell: 3 + Actor542: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 49,35 + Actor543: e1 + Owner: Neutral + Facing: 384 + Location: 49,34 + SubCell: 3 + Actor544: e1 + Owner: Neutral + Facing: 384 + Location: 49,33 + SubCell: 3 + Actor545: e1 + Owner: Neutral + Facing: 384 + Location: 33,27 + SubCell: 3 + Actor546: e1 + Owner: Neutral + Facing: 384 + Location: 34,27 + SubCell: 3 + Actor547: e1 + Owner: Neutral + Facing: 384 + Location: 35,27 + SubCell: 3 + Actor548: e1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 41,27 + Actor549: e1 + Owner: Neutral + Facing: 384 + Location: 42,27 + SubCell: 3 + Actor550: e1 + Owner: Neutral + Facing: 384 + Location: 43,27 + SubCell: 3 + Actor551: rndv + Owner: Neutral + Location: 8,38 + Facing: 768 + Actor552: rndv + Owner: Neutral + Location: 68,38 + Facing: 256 + Actor215: e1 + Owner: Neutral + Facing: 384 + Location: 11,66 + SubCell: 3 + Actor471: rndv + Owner: Neutral + Facing: 384 + Location: 72,29 + Actor475: rndv + Owner: Neutral + Facing: 640 + Location: 4,29 + Actor553: rndv + Owner: Neutral + Facing: 896 + Location: 4,47 + Actor554: rndv + Owner: Neutral + Facing: 128 + Location: 72,47 + Actor555: brut + Owner: Neutral + Facing: 384 + Location: 5,65 + SubCell: 3 + Actor556: brut + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 35,65 + Actor557: brut + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 71,65 + Actor558: brut + Owner: Neutral + Facing: 384 + Location: 71,11 + SubCell: 3 + Actor559: brut + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 5,11 + Actor560: brut + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 41,11 + Actor561: e8 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 35,11 + Actor562: e8 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 10,11 + Actor563: e8 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 66,11 + Actor564: e8 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 66,65 + Actor565: e8 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 10,65 + Actor566: e8 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 41,65 + Actor567: shad + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 9,65 + Actor568: shad + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 40,65 + Actor569: shad + Owner: Neutral + Facing: 384 + Location: 67,65 + SubCell: 3 + Actor570: shad + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 67,11 + Actor571: shad + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 36,11 + Actor573: shad + Owner: Neutral + Facing: 384 + Location: 6,11 + SubCell: 3 + Actor572: s1 + Owner: Neutral + SubCell: 3 + Facing: 384 + Location: 7,11 + Actor574: s1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 9,11 + Actor575: s1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 37,11 + Actor576: s1 + Owner: Neutral + Facing: 384 + Location: 39,11 + SubCell: 3 + Actor577: s1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 68,11 + Actor578: s1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 70,11 + Actor579: s1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 68,65 + Actor580: s1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 70,65 + Actor581: s1 + Owner: Neutral + Facing: 384 + Location: 39,65 + SubCell: 3 + Actor582: s1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 36,65 + Actor583: s1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 8,65 + Actor584: s1 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 6,65 + Actor585: gscr + Owner: Neutral + Facing: 384 + Location: 7,65 + SubCell: 3 + Actor586: gscr + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 37,65 + Actor587: gscr + Owner: Neutral + Facing: 384 + Location: 69,65 + SubCell: 3 + Actor588: gscr + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 69,11 + Actor589: gscr + Owner: Neutral + Facing: 384 + Location: 8,11 + SubCell: 3 + Actor590: gscr + Owner: Neutral + Facing: 384 + Location: 40,11 + SubCell: 3 + Actor591: brst + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 4,27 + Actor592: brst + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 4,49 + Actor593: brst + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 72,49 + Actor594: brst + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 72,27 + Actor595: mpspawn + Owner: Neutral + Location: 6,8 + Actor596: mpspawn + Owner: Neutral + Location: 10,8 + Actor597: mpspawn + Owner: Neutral + Location: 36,8 + Actor598: mpspawn + Owner: Neutral + Location: 40,8 + Actor599: mpspawn + Owner: Neutral + Location: 66,8 + Actor600: mpspawn + Owner: Neutral + Location: 70,8 + Actor601: mpspawn + Owner: Neutral + Location: 6,68 + Actor602: mpspawn + Owner: Neutral + Location: 10,68 + Actor603: mpspawn + Owner: Neutral + Location: 36,68 + Actor604: mpspawn + Owner: Neutral + Location: 40,68 + Actor605: mpspawn + Owner: Neutral + Location: 66,68 + Actor606: mpspawn + Owner: Neutral + Location: 70,68 + +Rules: ca|rules/custom/mastermind-madness.yaml, rules.yaml + +Weapons: ca|weapons/custom/mastermind-madness.yaml diff --git a/mods/ca/maps/team-mastermind-madness/rules.yaml b/mods/ca/maps/team-mastermind-madness/rules.yaml new file mode 100644 index 0000000000..d7a54dae15 --- /dev/null +++ b/mods/ca/maps/team-mastermind-madness/rules.yaml @@ -0,0 +1,3 @@ +MAST: + WithNameTagDecorationCA: + ColorSource: Team diff --git a/mods/ca/maps/team-scrinfestation/map.bin b/mods/ca/maps/team-scrinfestation/map.bin new file mode 100644 index 0000000000..6fd2961a65 Binary files /dev/null and b/mods/ca/maps/team-scrinfestation/map.bin differ diff --git a/mods/ca/maps/team-scrinfestation/map.png b/mods/ca/maps/team-scrinfestation/map.png new file mode 100644 index 0000000000..5493ff89b6 Binary files /dev/null and b/mods/ca/maps/team-scrinfestation/map.png differ diff --git a/mods/ca/maps/team-scrinfestation/map.yaml b/mods/ca/maps/team-scrinfestation/map.yaml new file mode 100644 index 0000000000..19ef77fd7f --- /dev/null +++ b/mods/ca/maps/team-scrinfestation/map.yaml @@ -0,0 +1,11537 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: Team Scrinfestation + +Author: Darkademic + +Tileset: INTERIOR + +MapSize: 201,98 + +Bounds: 1,1,199,96 + +Visibility: Lobby + +Categories: Minigame + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: england + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: england + Enemies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Multi6, Multi7, Multi8, Multi9, Multi10, Multi11, Multi12, Multi13, Multi14, Multi15, Multi16, Multi17, Multi18, Multi19 + PlayerReference@Scrin: + Name: Scrin + Faction: reaper + Color: B83DFF + Enemies: GDI, Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Multi6, Multi7, Multi8, Multi9, Multi10, Multi11, Multi12, Multi13, Multi14, Multi15, Multi16, Multi17, Multi18, Multi19 + PlayerReference@GDI: + Name: GDI + NonCombatant: True + Faction: RandomGDI + Color: E5D19C + Allies: Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Multi6, Multi7, Multi8, Multi9 + Enemies: Scrin, Creeps, Nod + PlayerReference@Nod: + Name: Nod + NonCombatant: True + Faction: RandomNOD + Color: F2F2F2 + Allies: Multi10, Multi11, Multi12, Multi13, Multi14, Multi15, Multi16, Multi17, Multi18, Multi19 + Enemies: Scrin, Creeps, GDI + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + Faction: RandomGDI + LockSpawn: True + Spawn: 1 + LockTeam: True + Team: 1 + Enemies: Scrin, Creeps, Nod + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + Faction: RandomGDI + LockSpawn: True + Spawn: 2 + LockTeam: True + Team: 1 + Enemies: Scrin, Creeps, Nod + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + Faction: RandomGDI + LockSpawn: True + Spawn: 3 + LockTeam: True + Team: 1 + Enemies: Scrin, Creeps, Nod + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + Faction: RandomGDI + LockSpawn: True + Spawn: 4 + LockTeam: True + Team: 1 + Enemies: Scrin, Creeps, Nod + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + Faction: RandomGDI + LockSpawn: True + Spawn: 5 + LockTeam: True + Team: 1 + Enemies: Scrin, Creeps, Nod + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + Faction: RandomGDI + LockSpawn: True + Spawn: 6 + LockTeam: True + Team: 1 + Enemies: Scrin, Creeps, Nod + PlayerReference@Multi6: + Name: Multi6 + Playable: True + LockFaction: True + Faction: RandomGDI + LockSpawn: True + Spawn: 7 + LockTeam: True + Team: 1 + Enemies: Scrin, Creeps, Nod + PlayerReference@Multi7: + Name: Multi7 + Playable: True + LockFaction: True + Faction: RandomGDI + LockSpawn: True + Spawn: 8 + LockTeam: True + Team: 1 + Enemies: Scrin, Creeps, Nod + PlayerReference@Multi8: + Name: Multi8 + Playable: True + LockFaction: True + Faction: RandomGDI + LockSpawn: True + Spawn: 9 + LockTeam: True + Team: 1 + Enemies: Scrin, Creeps, Nod + PlayerReference@Multi9: + Name: Multi9 + Playable: True + LockFaction: True + Faction: RandomGDI + LockSpawn: True + Spawn: 10 + LockTeam: True + Team: 1 + Enemies: Scrin, Creeps, Nod + PlayerReference@Multi10: + Name: Multi10 + Playable: True + LockFaction: True + Faction: RandomNOD + LockSpawn: True + Spawn: 11 + LockTeam: True + Team: 2 + Enemies: Scrin, Creeps, GDI + PlayerReference@Multi11: + Name: Multi11 + Playable: True + LockFaction: True + Faction: RandomNOD + LockSpawn: True + Spawn: 12 + LockTeam: True + Team: 2 + Enemies: Scrin, Creeps, GDI + PlayerReference@Multi12: + Name: Multi12 + Playable: True + LockFaction: True + Faction: RandomNOD + LockSpawn: True + Spawn: 13 + LockTeam: True + Team: 2 + Enemies: Scrin, Creeps, GDI + PlayerReference@Multi13: + Name: Multi13 + Playable: True + LockFaction: True + Faction: RandomNOD + LockSpawn: True + Spawn: 14 + LockTeam: True + Team: 2 + Enemies: Scrin, Creeps, GDI + PlayerReference@Multi14: + Name: Multi14 + Playable: True + LockFaction: True + Faction: RandomNOD + LockSpawn: True + Spawn: 15 + LockTeam: True + Team: 2 + Enemies: Scrin, Creeps, GDI + PlayerReference@Multi15: + Name: Multi15 + Playable: True + LockFaction: True + Faction: RandomNOD + LockSpawn: True + Spawn: 16 + LockTeam: True + Team: 2 + Enemies: Scrin, Creeps, GDI + PlayerReference@Multi16: + Name: Multi16 + Playable: True + LockFaction: True + Faction: RandomNOD + LockSpawn: True + Spawn: 17 + LockTeam: True + Team: 2 + Enemies: Scrin, Creeps, GDI + PlayerReference@Multi17: + Name: Multi17 + Playable: True + LockFaction: True + Faction: RandomNOD + LockSpawn: True + Spawn: 18 + LockTeam: True + Team: 2 + Enemies: Scrin, Creeps, GDI + PlayerReference@Multi18: + Name: Multi18 + Playable: True + LockFaction: True + Faction: RandomNOD + LockSpawn: True + Spawn: 19 + LockTeam: True + Team: 2 + Enemies: Scrin, Creeps, GDI + PlayerReference@Multi19: + Name: Multi19 + Playable: True + LockFaction: True + Faction: RandomNOD + LockSpawn: True + Spawn: 20 + LockTeam: True + Team: 2 + Enemies: Scrin, Creeps, GDI + +Actors: + Actor88: barb + Owner: Neutral + Location: 85,85 + Actor89: barb + Owner: Neutral + Location: 86,85 + Actor90: barb + Owner: Neutral + Location: 92,85 + Actor91: barb + Owner: Neutral + Location: 93,85 + Actor92: barb + Owner: Neutral + Location: 85,86 + Actor93: barl + Owner: Creeps + Location: 92,86 + Actor94: barb + Owner: Neutral + Location: 93,86 + Actor95: brl3 + Owner: Creeps + Location: 90,87 + Actor96: barl + Owner: Creeps + Location: 89,88 + Actor97: brl3 + Owner: Creeps + Location: 87,89 + Actor98: brl3 + Owner: Creeps + Location: 90,89 + Actor99: barl + Owner: Creeps + Location: 90,90 + Actor100: barl + Owner: Creeps + Location: 87,92 + Actor101: barb + Owner: Neutral + Location: 85,93 + Actor102: brl3 + Owner: Creeps + Location: 89,93 + Actor103: barb + Owner: Neutral + Location: 93,93 + Actor104: barb + Owner: Neutral + Location: 85,94 + Actor105: barb + Owner: Neutral + Location: 86,94 + Actor106: barb + Owner: Neutral + Location: 92,94 + Actor107: barb + Owner: Neutral + Location: 93,94 + Actor108: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 47,85 + Actor109: s1 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 49,85 + Actor110: apc2.husk + Owner: GDI + Facing: 384 + Location: 50,85 + Actor111: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 53,85 + Actor112: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 54,85 + Actor113: s1 + Owner: Scrin + SubCell: 3 + Location: 45,86 + Facing: 384 + Actor114: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 56,86 + Actor115: barb + Owner: GDI + Location: 43,87 + Actor116: barb + Owner: GDI + Location: 44,87 + Actor117: barb + Owner: GDI + Location: 48,87 + Actor118: barb + Owner: GDI + Location: 49,87 + Actor119: barb + Owner: GDI + Location: 50,87 + Actor120: barb + Owner: GDI + Location: 54,87 + Actor121: barb + Owner: GDI + Location: 55,87 + Actor122: barb + Owner: GDI + Location: 43,88 + Actor123: sbag + Owner: GDI + Location: 44,88 + Actor124: sbag + Owner: GDI + Location: 45,88 + Actor125: sbag + Owner: GDI + Location: 48,88 + Actor126: sbag + Owner: GDI + Location: 49,88 + Actor127: sbag + Owner: GDI + Location: 50,88 + Actor128: sbag + Owner: GDI + Location: 53,88 + Actor129: sbag + Owner: GDI + Location: 54,88 + Actor130: barb + Owner: GDI + Location: 55,88 + Actor131: barb + Owner: GDI + Location: 43,89 + Actor132: sbag + Owner: GDI + Location: 44,89 + Actor133: apc2 + Owner: GDI + Location: 45,89 + Facing: 118 + Actor134: e1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 49,89 + Actor135: e1 + Owner: GDI + Facing: 384 + SubCell: 1 + Location: 49,89 + Actor136: e1 + Owner: GDI + Facing: 384 + SubCell: 2 + Location: 49,89 + Actor137: e1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 50,89 + Actor138: apc2 + Owner: GDI + Facing: 904 + Location: 53,89 + Actor139: sbag + Owner: GDI + Location: 54,89 + Actor140: barb + Owner: GDI + Location: 55,89 + Actor141: e2 + Owner: GDI + SubCell: 3 + Facing: 384 + Location: 44,90 + Actor142: e2 + Owner: GDI + Facing: 384 + SubCell: 1 + Location: 44,90 + Actor143: medi + Owner: GDI + SubCell: 3 + Location: 46,90 + Facing: 384 + Actor144: flare + Owner: GDI + Location: 49,90 + Actor147: e1 + Owner: GDI + SubCell: 1 + Facing: 384 + Location: 54,90 + Actor148: mpspawn + Location: 45,92 + Owner: Neutral + Actor149: mpspawn + Location: 47,92 + Owner: Neutral + Actor150: mpspawn + Location: 49,92 + Owner: Neutral + Actor151: mpspawn + Location: 51,92 + Owner: Neutral + Actor152: mpspawn + Location: 53,92 + Owner: Neutral + Actor153: mpspawn + Location: 45,94 + Owner: Neutral + Actor154: mpspawn + Location: 47,94 + Owner: Neutral + Actor155: mpspawn + Location: 49,94 + Owner: Neutral + Actor156: mpspawn + Location: 51,94 + Owner: Neutral + Actor157: mpspawn + Location: 53,94 + Owner: Neutral + Actor160: s1 + Owner: Scrin + SubCell: 3 + Stance: AttackAnything + Facing: 975 + Location: 32,92 + Actor161: s1 + Owner: Scrin + SubCell: 1 + Facing: 384 + Stance: AttackAnything + Location: 32,92 + Actor162: s4 + Owner: Scrin + SubCell: 3 + Facing: 1023 + Stance: AttackAnything + Location: 32,93 + Actor163: s1 + Owner: Scrin + SubCell: 3 + Facing: 1023 + Stance: AttackAnything + Location: 35,93 + Actor164: s1 + Owner: Scrin + SubCell: 3 + Facing: 103 + Stance: AttackAnything + Location: 37,93 + Actor165: s1 + Owner: Scrin + SubCell: 3 + Facing: 1023 + Stance: AttackAnything + Location: 33,94 + Actor166: s1 + Owner: Scrin + SubCell: 3 + Facing: 753 + Stance: AttackAnything + Location: 36,94 + Actor167: s1 + Owner: Scrin + SubCell: 1 + Facing: 384 + Stance: AttackAnything + Location: 36,94 + Actor158: s2 + Owner: Scrin + SubCell: 3 + Facing: 126 + Location: 69,93 + Actor159: s2 + Owner: Scrin + SubCell: 3 + Facing: 142 + Location: 67,94 + Actor80: corr + Owner: Scrin + Facing: 384 + Location: 58,33 + Actor81: corr + Owner: Scrin + Facing: 384 + Location: 61,37 + Actor82: corr + Owner: Scrin + Facing: 384 + Location: 64,41 + Actor83: barb + Owner: Neutral + Location: 40,54 + Actor84: barb + Owner: Neutral + Location: 40,55 + Actor85: barb + Owner: Neutral + Location: 41,54 + Actor86: barb + Owner: Neutral + Location: 43,54 + Actor87: barb + Owner: Neutral + Location: 43,55 + Actor168: barb + Owner: Neutral + Location: 43,56 + Actor169: barb + Owner: Neutral + Location: 42,56 + Actor170: barb + Owner: Neutral + Location: 40,58 + Actor171: barb + Owner: Neutral + Location: 41,58 + Actor172: barb + Owner: Neutral + Location: 42,58 + Actor173: barb + Owner: Neutral + Location: 43,58 + Actor174: barb + Owner: Neutral + Location: 44,59 + Actor175: barb + Owner: Neutral + Location: 44,58 + Actor176: barb + Owner: Neutral + Location: 42,60 + Actor177: barb + Owner: Neutral + Location: 42,61 + Actor178: barb + Owner: Neutral + Location: 43,61 + Actor179: barb + Owner: Neutral + Location: 44,61 + Actor180: barb + Owner: Neutral + Location: 45,61 + Actor181: barb + Owner: Neutral + Location: 44,54 + Actor182: barb + Owner: Neutral + Location: 45,54 + Actor183: barb + Owner: Neutral + Location: 40,63 + Actor184: barb + Owner: Neutral + Location: 41,63 + Actor185: barb + Owner: Neutral + Location: 44,63 + Actor186: barb + Owner: Neutral + Location: 44,64 + Actor187: barl + Owner: Creeps + Location: 7,53 + Actor188: brl3 + Owner: Creeps + Location: 5,54 + Actor189: barl + Owner: Creeps + Location: 4,55 + Actor191: brl3 + Owner: Creeps + Location: 5,56 + Actor192: barl + Owner: Creeps + Location: 5,57 + Actor194: brl3 + Owner: Creeps + Location: 4,60 + Actor195: s2 + Owner: Scrin + SubCell: 3 + Location: 63,94 + Facing: 142 + Actor196: s2 + Owner: Scrin + SubCell: 3 + Location: 62,93 + Facing: 880 + Actor197: gscr + Owner: Scrin + SubCell: 3 + Location: 21,94 + Facing: 761 + Actor198: gscr + Owner: Scrin + Location: 21,93 + SubCell: 3 + Facing: 769 + Actor199: gscr + Owner: Scrin + SubCell: 3 + Location: 21,92 + Facing: 769 + Actor200: gscr + Owner: Scrin + SubCell: 3 + Location: 21,95 + Facing: 761 + Actor201: gscr + Owner: Scrin + SubCell: 3 + Facing: 769 + Location: 64,57 + Actor202: gscr + Owner: Scrin + SubCell: 3 + Facing: 769 + Location: 64,58 + Actor203: gscr + Owner: Scrin + SubCell: 3 + Facing: 761 + Location: 64,59 + Actor204: gscr + Owner: Scrin + SubCell: 3 + Location: 64,60 + Facing: 761 + Actor205: s4 + Owner: Scrin + SubCell: 3 + Stance: AttackAnything + Location: 24,85 + Facing: 626 + Actor206: corr + Owner: Scrin + Location: 86,12 + Facing: 214 + Actor207: corr + Owner: Scrin + Location: 86,4 + Facing: 245 + Actor208: ruin + Owner: Scrin + Facing: 384 + Location: 81,35 + Actor209: ruin + Owner: Scrin + Facing: 384 + Location: 84,34 + Actor210: dark + Owner: Scrin + Location: 8,89 + Facing: 666 + Actor217: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 68,82 + Actor218: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 69,82 + Actor219: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 71,78 + Actor220: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 72,77 + Actor221: s3 + Owner: Scrin + Facing: 384 + Location: 73,78 + SubCell: 3 + Actor222: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 73,77 + Actor223: s3 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 73,77 + Actor224: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 75,77 + Actor225: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 76,70 + Actor226: s1 + Owner: Scrin + Facing: 384 + Location: 76,69 + SubCell: 3 + Actor227: s1 + Owner: Scrin + Facing: 384 + Location: 76,69 + SubCell: 1 + Actor228: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 77,70 + Actor229: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 77,68 + Actor230: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 74,58 + Actor231: s1 + Owner: Scrin + Facing: 384 + Location: 73,59 + SubCell: 3 + Actor232: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 65,57 + Actor233: s1 + Owner: Scrin + Facing: 384 + Location: 65,57 + SubCell: 1 + Actor234: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 66,59 + Actor235: s1 + Owner: Scrin + Facing: 384 + Location: 65,60 + SubCell: 3 + Actor236: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 65,62 + Actor237: s1 + Owner: Scrin + Facing: 384 + Location: 65,62 + SubCell: 1 + Actor238: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 68,67 + Actor239: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 65,67 + Actor240: gunw + Owner: Scrin + Location: 54,58 + Facing: 729 + Actor241: gscr + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 4,72 + Actor242: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 5,73 + Actor243: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 5,70 + Actor244: s2 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 26,75 + Actor245: s2 + Owner: Scrin + Facing: 384 + Location: 26,74 + SubCell: 3 + Actor246: s2 + Owner: Scrin + Facing: 384 + Location: 26,73 + SubCell: 3 + Actor247: s2 + Owner: Scrin + Facing: 384 + Location: 26,72 + SubCell: 3 + Actor248: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 26,76 + Actor249: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 13,76 + Actor250: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 12,74 + Actor251: s1 + Owner: Scrin + Facing: 384 + Location: 12,73 + SubCell: 3 + Actor252: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 14,76 + Actor253: s1 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 13,76 + Actor254: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 22,63 + Actor255: s1 + Owner: Scrin + Facing: 384 + Location: 23,63 + SubCell: 3 + Actor256: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 24,64 + Actor257: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 23,61 + Actor258: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 26,64 + Actor259: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 24,63 + Actor260: s1 + Owner: Scrin + Facing: 384 + Location: 23,63 + SubCell: 1 + Actor261: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 9,62 + Actor262: s3 + Owner: Scrin + Facing: 384 + Location: 9,61 + SubCell: 3 + Actor263: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 11,62 + Actor265: s4 + Owner: Scrin + Facing: 384 + Location: 3,52 + SubCell: 3 + Actor266: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 5,51 + Actor267: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 7,51 + Actor268: gscr + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 53,40 + Actor269: gscr + Owner: Scrin + Facing: 384 + Location: 53,41 + SubCell: 3 + Actor270: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 59,34 + Actor271: s1 + Owner: Scrin + Facing: 384 + Location: 59,34 + SubCell: 1 + Actor272: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 64,36 + Actor273: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 62,35 + Actor274: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 63,39 + Actor275: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 65,40 + Actor276: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 56,32 + Actor277: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 66,42 + Actor278: gunw + Owner: Scrin + Location: 36,48 + Facing: 586 + Actor279: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 36,50 + Actor280: s1 + Owner: Scrin + Facing: 384 + Location: 36,50 + SubCell: 1 + Actor281: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 38,50 + Actor282: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 39,48 + Actor283: s1 + Owner: Scrin + Facing: 384 + Location: 39,48 + SubCell: 1 + Actor284: s3 + Owner: Scrin + Facing: 384 + Location: 38,49 + SubCell: 3 + Actor285: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 40,46 + Actor286: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 34,49 + Actor287: s4 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 44,39 + Actor288: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 46,40 + Actor289: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 44,38 + WormholeSE: wormhole + Owner: Scrin + Location: 91,92 + WormholeNE: wormhole + Owner: Scrin + Location: 92,8 + WormholeNW: wormhole + Owner: Scrin + Location: 5,5 + Actor293: lchr + Owner: Scrin + Location: 85,91 + Facing: 991 + Actor294: lchr + Owner: Scrin + Location: 94,87 + Facing: 79 + Actor295: lchr + Owner: Scrin + Location: 8,39 + Facing: 483 + Actor296: gunw + Owner: Scrin + Location: 13,7 + Facing: 491 + Actor297: gunw + Owner: Scrin + Location: 5,10 + Facing: 459 + Actor298: ruin + Owner: Scrin + Facing: 384 + Location: 14,4 + Actor300: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 45,38 + Actor301: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 43,36 + Actor302: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 47,39 + Actor303: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 41,23 + Actor304: s1 + Owner: Scrin + Facing: 384 + Location: 41,23 + SubCell: 1 + Actor305: s1 + Owner: Scrin + Facing: 384 + Location: 41,24 + SubCell: 3 + Actor306: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 41,20 + Actor307: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 42,23 + Actor308: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 6,39 + Actor309: s1 + Owner: Scrin + Facing: 384 + Location: 6,39 + SubCell: 1 + Actor310: s1 + Owner: Scrin + Facing: 384 + Location: 8,38 + SubCell: 3 + Actor311: s1 + Owner: Scrin + Facing: 384 + Location: 9,38 + SubCell: 3 + Actor312: s1 + Owner: Scrin + Facing: 384 + Location: 10,39 + SubCell: 3 + Actor313: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 10,62 + Actor314: s1 + Owner: Scrin + Facing: 384 + Location: 41,62 + SubCell: 3 + Actor315: s1 + Owner: Scrin + Facing: 384 + Location: 43,60 + SubCell: 3 + Actor316: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 41,64 + Actor317: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 42,74 + Actor318: s4 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 42,75 + Actor319: s4 + Owner: Scrin + Facing: 384 + Location: 41,74 + SubCell: 3 + Actor320: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 46,51 + Actor321: gscr + Owner: Scrin + SubCell: 3 + Location: 62,65 + Facing: 943 + Actor322: gscr + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 69,25 + Actor323: gscr + Owner: Scrin + Facing: 384 + Location: 70,26 + SubCell: 3 + Actor324: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 72,27 + Actor325: s3 + Owner: Scrin + Facing: 384 + Location: 70,25 + SubCell: 3 + Actor326: s3 + Owner: Scrin + Facing: 384 + Location: 70,25 + SubCell: 1 + Actor327: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 67,24 + Actor328: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 73,25 + Actor333: corr + Owner: Scrin + Location: 58,4 + Facing: 384 + Actor334: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 43,3 + Actor335: s4 + Owner: Scrin + Facing: 384 + Location: 42,4 + SubCell: 3 + Actor336: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 44,4 + Actor337: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 45,3 + Actor338: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 50,14 + Actor339: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 49,17 + Actor340: s1 + Owner: Scrin + Facing: 384 + Location: 50,17 + SubCell: 3 + Actor341: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 51,16 + Actor342: s1 + Owner: Scrin + Facing: 384 + Location: 51,16 + SubCell: 1 + Actor343: s1 + Owner: Scrin + Facing: 384 + Location: 50,16 + SubCell: 3 + Actor344: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 21,5 + Actor345: s1 + Owner: Scrin + Facing: 384 + Location: 21,5 + SubCell: 1 + Actor346: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 21,7 + Actor347: s1 + Owner: Scrin + Facing: 384 + Location: 21,7 + SubCell: 1 + Actor348: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 18,9 + Actor349: s1 + Owner: Scrin + Facing: 384 + Location: 19,9 + SubCell: 3 + Actor350: s1 + Owner: Scrin + Facing: 384 + Location: 20,10 + SubCell: 3 + Actor351: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 21,13 + Actor352: s1 + Owner: Scrin + Facing: 384 + Location: 20,9 + SubCell: 3 + Actor353: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 21,9 + Actor354: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 22,15 + Actor355: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 29,9 + Actor356: s1 + Owner: Scrin + Facing: 384 + Location: 28,9 + SubCell: 3 + Actor357: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 27,12 + Actor358: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 32,10 + Actor359: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 35,15 + Actor360: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 36,15 + Actor361: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 20,20 + Actor362: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 19,23 + Actor363: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 20,25 + Actor364: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 19,27 + Actor365: s1 + Owner: Scrin + Facing: 384 + Location: 19,28 + SubCell: 3 + Actor366: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 19,30 + Actor370: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 19,47 + Actor376: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 19,26 + Actor377: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 4,24 + Actor378: gscr + Owner: Scrin + Facing: 384 + Location: 5,23 + SubCell: 3 + Actor379: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 4,20 + Actor380: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 6,21 + Actor381: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 4,22 + Actor382: s1 + Owner: Scrin + Facing: 384 + Location: 5,22 + SubCell: 3 + Actor383: s1 + Owner: Scrin + Facing: 384 + Location: 5,21 + SubCell: 3 + Actor384: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 3,24 + Actor385: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 3,41 + Actor386: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 4,38 + Actor387: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 5,42 + Actor388: s1 + Owner: Scrin + Facing: 384 + Location: 5,72 + SubCell: 3 + Actor389: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 4,71 + Actor390: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 3,70 + Actor391: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 7,72 + Actor396: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 26,84 + Actor397: s1 + Owner: Scrin + Facing: 384 + Location: 26,85 + SubCell: 3 + Actor398: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 28,84 + Actor399: s3 + Owner: Scrin + Facing: 384 + Location: 28,84 + SubCell: 1 + Actor400: gunw + Owner: Scrin + Location: 85,69 + Facing: 848 + Actor401: dark + Owner: Scrin + Location: 89,57 + Facing: 150 + Actor402: gunw + Owner: Scrin + Location: 93,56 + Facing: 190 + Actor403: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 87,58 + Actor404: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 88,57 + Actor405: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 91,59 + Actor406: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 92,58 + Actor407: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 92,56 + Actor408: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 93,54 + Actor409: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 84,57 + Actor410: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 93,42 + Actor411: s3 + Owner: Scrin + Facing: 384 + Location: 94,42 + SubCell: 3 + Actor412: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 93,43 + Actor413: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 94,45 + Actor414: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 94,47 + Actor415: gscr + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 93,44 + Actor416: gscr + Owner: Scrin + Facing: 384 + Location: 92,44 + SubCell: 3 + Actor417: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 75,48 + Actor418: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 71,42 + Actor419: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 74,40 + Actor420: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 60,19 + Actor421: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 13,15 + Actor422: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 14,13 + Actor423: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 13,14 + Actor424: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 16,52 + Actor425: s4 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 59,47 + Actor426: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 62,47 + Actor427: s4 + Owner: Scrin + Facing: 384 + Location: 63,46 + SubCell: 3 + Actor428: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 71,4 + Actor429: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 72,5 + Actor430: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 72,8 + Actor431: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 72,11 + Actor432: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 68,12 + Actor433: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 69,12 + Actor434: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 74,8 + Actor435: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 73,4 + Actor436: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 72,3 + Actor437: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 67,10 + Actor438: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 75,59 + Actor439: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 85,67 + Actor440: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 85,72 + Actor441: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 87,88 + Actor442: s3 + Owner: Scrin + Facing: 384 + Location: 87,88 + SubCell: 1 + Actor443: s3 + Owner: Scrin + Facing: 384 + Location: 89,90 + SubCell: 3 + Actor444: s3 + Owner: Scrin + Facing: 384 + Location: 89,90 + SubCell: 1 + Actor445: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 92,88 + Actor446: s3 + Owner: Scrin + Facing: 384 + Location: 92,88 + SubCell: 1 + Actor447: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 94,90 + Actor448: s1 + Owner: Scrin + Facing: 384 + Location: 93,91 + SubCell: 3 + Actor449: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 88,91 + Actor450: s4 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 92,73 + Actor451: s4 + Owner: Scrin + Facing: 384 + Location: 93,72 + SubCell: 3 + Actor452: s4 + Owner: Scrin + Facing: 384 + Location: 94,72 + SubCell: 3 + Actor453: s4 + Owner: Scrin + Facing: 384 + Location: 93,73 + SubCell: 3 + Actor454: s1 + Owner: Scrin + Facing: 384 + Location: 92,73 + SubCell: 1 + Actor455: s1 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 94,72 + Actor456: s1 + Owner: Scrin + Facing: 384 + Location: 94,73 + SubCell: 3 + Actor457: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 85,48 + Actor458: s3 + Owner: Scrin + Facing: 384 + Location: 85,48 + SubCell: 1 + Actor459: s2 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 82,7 + Actor460: s2 + Owner: Scrin + Facing: 384 + Location: 82,8 + SubCell: 3 + Actor461: s2 + Owner: Scrin + Facing: 384 + Location: 82,8 + SubCell: 1 + Actor462: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 82,9 + Actor463: gscr + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 77,5 + Actor464: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 77,6 + Actor465: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 89,6 + Actor466: s1 + Owner: Scrin + Facing: 384 + Location: 88,8 + SubCell: 3 + Actor467: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 90,11 + Actor468: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 92,13 + Actor469: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 93,6 + Actor470: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 93,4 + Actor471: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 90,4 + Actor472: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 91,5 + Actor473: ruin + Owner: Scrin + Location: 94,17 + Facing: 126 + Actor474: ruin + Owner: Scrin + Location: 92,17 + Facing: 237 + Actor481: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 12,27 + Actor482: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 12,29 + Actor483: s1 + Owner: Scrin + Facing: 384 + Location: 12,30 + SubCell: 3 + Actor484: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 12,32 + Actor485: s1 + Owner: Scrin + Facing: 384 + Location: 13,30 + SubCell: 3 + Actor486: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 13,31 + Actor487: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 12,23 + Actor488: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 50,6 + Actor489: s1 + Owner: Scrin + Facing: 384 + Location: 52,5 + SubCell: 3 + Actor490: s1 + Owner: Scrin + Facing: 384 + Location: 52,4 + SubCell: 3 + Actor491: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 51,7 + Actor492: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 51,5 + Actor493: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 60,46 + Actor494: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 62,45 + Actor495: s1 + Owner: Scrin + Facing: 384 + Location: 63,45 + SubCell: 3 + Actor496: s1 + Owner: Scrin + Facing: 384 + Location: 61,47 + SubCell: 3 + Actor497: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 73,42 + Actor498: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 71,39 + Actor499: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 75,41 + Actor500: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 85,49 + Actor501: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 86,47 + Actor502: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 85,46 + Actor503: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 87,45 + Actor504: s1 + Owner: Scrin + Facing: 384 + Location: 88,44 + SubCell: 3 + Actor505: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 86,58 + Actor506: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 20,61 + Actor507: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 24,61 + Actor508: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 26,62 + Actor509: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 28,65 + Actor510: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 67,92 + Actor511: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 27,94 + Actor512: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 24,89 + Actor513: s1 + Owner: Scrin + Facing: 384 + Location: 74,78 + SubCell: 3 + Actor514: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 67,65 + Actor515: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 64,64 + Actor516: gscr + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 57,75 + Actor517: gscr + Owner: Scrin + Facing: 384 + Location: 56,76 + SubCell: 3 + Actor518: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 57,77 + Actor519: gscr + Owner: Scrin + Facing: 384 + Location: 58,76 + SubCell: 3 + Actor528: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 52,6 + Actor529: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 27,4 + Actor530: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 67,4 + Actor531: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 60,4 + Actor532: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 56,3 + Actor533: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 61,28 + Actor534: s4 + Owner: Scrin + Facing: 384 + Location: 60,28 + SubCell: 3 + Actor535: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 60,26 + Actor536: s3 + Owner: Scrin + Facing: 384 + Location: 60,28 + SubCell: 1 + Actor537: s3 + Owner: Scrin + Facing: 384 + Location: 60,28 + SubCell: 2 + Actor538: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 61,27 + Actor539: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 85,38 + Actor540: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 48,76 + Actor541: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 49,69 + Actor542: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 45,69 + Actor543: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 42,68 + Actor544: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 45,60 + Actor545: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 45,57 + Actor546: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 42,57 + Actor547: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 43,53 + Actor548: s1 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 43,60 + Actor549: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 94,63 + Actor550: s1 + Owner: Scrin + Facing: 384 + Location: 93,63 + SubCell: 3 + Actor551: s1 + Owner: Scrin + Facing: 384 + Location: 94,62 + SubCell: 3 + Actor554: rmbospawn + Owner: Multi0 + Location: 45,92 + Actor555: rmbospawn + Owner: Multi1 + Location: 47,92 + Actor556: rmbospawn + Owner: Multi2 + Location: 49,92 + Actor557: rmbospawn + Owner: Multi3 + Location: 51,92 + Actor558: rmbospawn + Owner: Multi4 + Location: 53,92 + Actor559: rmbospawn + Owner: Multi5 + Location: 45,94 + Actor560: rmbospawn + Owner: Multi6 + Location: 47,94 + Actor561: rmbospawn + Owner: Multi7 + Location: 49,94 + Actor562: rmbospawn + Owner: Multi8 + Location: 51,94 + Actor563: rmbospawn + Owner: Multi9 + Location: 53,94 + NW2: waypoint + Owner: Neutral + Location: 6,23 + NW3: waypoint + Owner: Neutral + Location: 10,40 + NW4: waypoint + Owner: Neutral + Location: 6,56 + NW5: waypoint + Owner: Neutral + Location: 21,68 + NW6: waypoint + Owner: Neutral + Location: 4,73 + NW7: waypoint + Owner: Neutral + Location: 5,89 + NW8: waypoint + Owner: Neutral + Location: 34,93 + NW1: waypoint + Owner: Neutral + Location: 5,5 + NE1: waypoint + Owner: Neutral + Location: 92,8 + SE1: waypoint + Owner: Neutral + Location: 91,92 + NE2: waypoint + Owner: Neutral + Location: 51,4 + NE3: waypoint + Owner: Neutral + Location: 61,33 + NE4: waypoint + Owner: Neutral + Location: 44,42 + NE5: waypoint + Owner: Neutral + Location: 42,70 + NE6: waypoint + Owner: Neutral + Location: 76,59 + NE7: waypoint + Owner: Neutral + Location: 54,86 + NW9: waypoint + Owner: Neutral + Location: 44,86 + SE2: waypoint + Owner: Neutral + Location: 76,34 + Actor566: brik + Owner: Neutral + Location: 37,87 + Actor567: brik + Owner: Neutral + Location: 38,87 + Actor571: brik + Owner: Neutral + Location: 36,87 + Actor572: brik + Owner: Neutral + Location: 36,88 + Actor573: brik + Owner: Neutral + Location: 36,89 + Actor574: brik + Owner: Neutral + Location: 36,90 + Actor575: brik + Owner: Neutral + Location: 37,90 + Actor576: brik + Owner: Neutral + Location: 38,90 + Actor577: brik + Owner: Neutral + Location: 39,90 + Actor580: brik + Owner: Neutral + Location: 42,90 + Actor581: brik + Owner: Neutral + Location: 42,91 + Actor582: brik + Owner: Neutral + Location: 42,92 + Actor583: brik + Owner: Neutral + Location: 42,93 + Actor584: brik + Owner: Neutral + Location: 42,94 + Actor585: brik + Owner: Neutral + Location: 42,95 + Actor586: brik + Owner: Neutral + Location: 39,95 + Actor587: brik + Owner: Neutral + Location: 39,94 + Actor588: brik + Owner: Neutral + Location: 39,93 + Actor589: brik + Owner: Neutral + Location: 39,92 + Actor590: brik + Owner: Neutral + Location: 39,91 + Actor591: s4 + Owner: Scrin + SubCell: 3 + Location: 3,54 + Facing: 384 + Actor592: brl3 + Owner: Creeps + Location: 3,56 + Actor593: barl + Owner: Creeps + Location: 3,59 + Actor564: medi + Owner: GDI + SubCell: 3 + Location: 52,90 + Facing: 384 + Actor600: s4 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 10,13 + Actor601: s4 + Owner: Scrin + Facing: 384 + Location: 9,12 + SubCell: 3 + Actor602: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 10,12 + Actor603: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 8,11 + Actor607: brik + Owner: Neutral + Location: 63,87 + Actor608: brik + Owner: Neutral + Location: 62,87 + Actor609: brik + Owner: Neutral + Location: 61,87 + Actor610: brik + Owner: Neutral + Location: 60,87 + Actor614: brik + Owner: Neutral + Location: 63,88 + Actor615: brik + Owner: Neutral + Location: 63,89 + Actor616: brik + Owner: Neutral + Location: 63,90 + Actor617: brik + Owner: Neutral + Location: 62,90 + Actor618: brik + Owner: Neutral + Location: 61,90 + Actor619: brik + Owner: Neutral + Location: 60,90 + Actor620: brik + Owner: Neutral + Location: 67,87 + Actor621: brik + Owner: Neutral + Location: 68,87 + Actor622: brik + Owner: Neutral + Location: 69,87 + Actor623: brik + Owner: Neutral + Location: 70,87 + Actor624: brik + Owner: Neutral + Location: 70,86 + Actor625: brik + Owner: Neutral + Location: 67,90 + Actor626: brik + Owner: Neutral + Location: 67,89 + Actor627: brik + Owner: Neutral + Location: 67,88 + Actor628: brik + Owner: Neutral + Location: 68,90 + Actor629: brik + Owner: Neutral + Location: 69,90 + Actor630: brik + Owner: Neutral + Location: 70,90 + Actor631: brik + Owner: Neutral + Location: 70,91 + Actor632: brik + Owner: Neutral + Location: 70,92 + Actor633: brik + Owner: Neutral + Location: 60,91 + Actor634: brik + Owner: Neutral + Location: 60,92 + Actor635: brik + Owner: Neutral + Location: 64,83 + Actor636: brik + Owner: Neutral + Location: 65,83 + Actor637: brik + Owner: Neutral + Location: 66,83 + Actor638: brik + Owner: Neutral + Location: 66,82 + Actor639: brik + Owner: Neutral + Location: 66,81 + Actor640: brik + Owner: Neutral + Location: 66,80 + Actor641: brik + Owner: Neutral + Location: 66,79 + Actor642: brik + Owner: Neutral + Location: 63,83 + Actor643: brik + Owner: Neutral + Location: 62,83 + Actor644: brik + Owner: Neutral + Location: 70,80 + Actor645: brik + Owner: Neutral + Location: 70,81 + Actor646: brik + Owner: Neutral + Location: 71,80 + Actor647: brik + Owner: Neutral + Location: 72,80 + Actor648: brik + Owner: Neutral + Location: 73,80 + Actor649: brik + Owner: Neutral + Location: 70,82 + Actor650: brik + Owner: Neutral + Location: 70,83 + Actor651: brik + Owner: Neutral + Location: 74,80 + Actor652: brik + Owner: Neutral + Location: 75,80 + Actor653: brik + Owner: Neutral + Location: 70,75 + Actor654: brik + Owner: Neutral + Location: 71,75 + Actor655: brik + Owner: Neutral + Location: 72,75 + Actor656: brik + Owner: Neutral + Location: 73,75 + Actor657: brik + Owner: Neutral + Location: 74,75 + Actor658: brik + Owner: Neutral + Location: 74,74 + Actor659: brik + Owner: Neutral + Location: 74,73 + Actor660: brik + Owner: Neutral + Location: 74,72 + Actor661: brik + Owner: Neutral + Location: 74,71 + Actor662: brik + Owner: Neutral + Location: 74,70 + Actor663: brik + Owner: Neutral + Location: 70,61 + Actor664: brik + Owner: Neutral + Location: 71,61 + Actor665: brik + Owner: Neutral + Location: 72,61 + Actor666: brik + Owner: Neutral + Location: 73,61 + Actor667: brik + Owner: Neutral + Location: 74,61 + Actor668: brik + Owner: Neutral + Location: 74,62 + Actor669: brik + Owner: Neutral + Location: 74,63 + Actor670: brik + Owner: Neutral + Location: 74,64 + Actor671: brik + Owner: Neutral + Location: 74,65 + Actor672: brik + Owner: Neutral + Location: 70,62 + Actor673: brik + Owner: Neutral + Location: 70,63 + Actor674: brik + Owner: Neutral + Location: 70,65 + Actor675: brik + Owner: Neutral + Location: 70,66 + Actor676: brik + Owner: Neutral + Location: 70,64 + Actor677: brik + Owner: Neutral + Location: 70,67 + Actor678: brik + Owner: Neutral + Location: 70,68 + Actor679: brik + Owner: Neutral + Location: 70,69 + Actor680: brik + Owner: Neutral + Location: 55,60 + Actor681: brik + Owner: Neutral + Location: 56,60 + Actor682: brik + Owner: Neutral + Location: 57,60 + Actor683: brik + Owner: Neutral + Location: 58,60 + Actor684: brik + Owner: Neutral + Location: 59,60 + Actor685: brik + Owner: Neutral + Location: 55,61 + Actor686: brik + Owner: Neutral + Location: 55,62 + Actor687: brik + Owner: Neutral + Location: 55,63 + Actor688: brik + Owner: Neutral + Location: 55,64 + Actor689: brik + Owner: Neutral + Location: 55,65 + Actor690: brik + Owner: Neutral + Location: 55,66 + Actor691: brik + Owner: Neutral + Location: 55,67 + Actor692: brik + Owner: Neutral + Location: 59,66 + Actor693: brik + Owner: Neutral + Location: 59,64 + Actor694: brik + Owner: Neutral + Location: 59,63 + Actor695: brik + Owner: Neutral + Location: 59,62 + Actor696: brik + Owner: Neutral + Location: 59,61 + Actor697: brik + Owner: Neutral + Location: 59,65 + Actor698: brik + Owner: Neutral + Location: 46,65 + Actor699: brik + Owner: Neutral + Location: 45,65 + Actor700: brik + Owner: Neutral + Location: 44,65 + Actor701: brik + Owner: Neutral + Location: 44,66 + Actor702: brik + Owner: Neutral + Location: 44,67 + Actor703: brik + Owner: Neutral + Location: 45,67 + Actor704: brik + Owner: Neutral + Location: 46,67 + Actor705: brik + Owner: Neutral + Location: 47,67 + Actor706: brik + Owner: Neutral + Location: 48,67 + Actor707: brik + Owner: Neutral + Location: 49,67 + Actor708: brik + Owner: Neutral + Location: 50,67 + Actor709: brik + Owner: Neutral + Location: 51,67 + Actor710: brik + Owner: Neutral + Location: 51,66 + Actor711: brik + Owner: Neutral + Location: 51,65 + Actor712: brik + Owner: Neutral + Location: 51,64 + Actor713: brik + Owner: Neutral + Location: 51,63 + Actor714: brik + Owner: Neutral + Location: 51,62 + Actor715: brik + Owner: Neutral + Location: 46,63 + Actor716: brik + Owner: Neutral + Location: 46,64 + Actor717: brik + Owner: Neutral + Location: 46,62 + Actor718: brik + Owner: Neutral + Location: 46,61 + Actor719: brik + Owner: Neutral + Location: 46,60 + Actor720: brik + Owner: Neutral + Location: 46,59 + Actor721: brik + Owner: Neutral + Location: 46,58 + Actor722: brik + Owner: Neutral + Location: 46,53 + Actor723: brik + Owner: Neutral + Location: 47,53 + Actor724: brik + Owner: Neutral + Location: 48,53 + Actor725: brik + Owner: Neutral + Location: 46,54 + Actor726: brik + Owner: Neutral + Location: 46,55 + Actor727: brik + Owner: Neutral + Location: 49,53 + Actor728: brik + Owner: Neutral + Location: 39,53 + Actor729: brik + Owner: Neutral + Location: 38,53 + Actor730: brik + Owner: Neutral + Location: 37,53 + Actor731: brik + Owner: Neutral + Location: 36,53 + Actor732: brik + Owner: Neutral + Location: 39,54 + Actor733: brik + Owner: Neutral + Location: 39,55 + Actor734: brik + Owner: Neutral + Location: 39,56 + Actor735: brik + Owner: Neutral + Location: 39,57 + Actor736: brik + Owner: Neutral + Location: 39,58 + Actor737: brik + Owner: Neutral + Location: 44,71 + Actor738: brik + Owner: Neutral + Location: 44,72 + Actor739: brik + Owner: Neutral + Location: 44,73 + Actor740: brik + Owner: Neutral + Location: 45,73 + Actor741: brik + Owner: Neutral + Location: 46,73 + Actor742: brik + Owner: Neutral + Location: 45,71 + Actor743: brik + Owner: Neutral + Location: 46,71 + Actor744: brik + Owner: Neutral + Location: 47,71 + Actor745: brik + Owner: Neutral + Location: 48,71 + Actor746: brik + Owner: Neutral + Location: 49,71 + Actor747: brik + Owner: Neutral + Location: 50,71 + Actor748: brik + Owner: Neutral + Location: 51,71 + Actor749: brik + Owner: Neutral + Location: 51,72 + Actor750: brik + Owner: Neutral + Location: 51,73 + Actor751: brik + Owner: Neutral + Location: 50,73 + Actor752: brik + Owner: Neutral + Location: 49,73 + Actor753: brik + Owner: Neutral + Location: 48,73 + Actor754: brik + Owner: Neutral + Location: 47,73 + Actor755: brik + Owner: Neutral + Location: 55,73 + Actor756: brik + Owner: Neutral + Location: 55,72 + Actor757: brik + Owner: Neutral + Location: 55,71 + Actor758: brik + Owner: Neutral + Location: 56,73 + Actor759: brik + Owner: Neutral + Location: 57,73 + Actor760: brik + Owner: Neutral + Location: 58,73 + Actor761: brik + Owner: Neutral + Location: 59,73 + Actor762: brik + Owner: Neutral + Location: 55,70 + Actor763: brik + Owner: Neutral + Location: 55,69 + Actor764: brik + Owner: Neutral + Location: 69,55 + Actor765: brik + Owner: Neutral + Location: 70,55 + Actor766: brik + Owner: Neutral + Location: 70,56 + Actor767: brik + Owner: Neutral + Location: 71,56 + Actor768: brik + Owner: Neutral + Location: 68,55 + Actor769: brik + Owner: Neutral + Location: 43,48 + Actor770: brik + Owner: Neutral + Location: 44,48 + Actor771: brik + Owner: Neutral + Location: 42,48 + Actor772: brik + Owner: Neutral + Location: 42,47 + Actor773: brik + Owner: Neutral + Location: 42,46 + Actor774: brik + Owner: Neutral + Location: 43,46 + Actor775: brik + Owner: Neutral + Location: 44,46 + Actor776: brik + Owner: Neutral + Location: 45,46 + Actor777: brik + Owner: Neutral + Location: 45,47 + Actor778: brik + Owner: Neutral + Location: 45,48 + Actor779: brik + Owner: Neutral + Location: 36,43 + Actor780: brik + Owner: Neutral + Location: 37,43 + Actor781: brik + Owner: Neutral + Location: 38,43 + Actor782: brik + Owner: Neutral + Location: 39,43 + Actor783: brik + Owner: Neutral + Location: 39,42 + Actor784: brik + Owner: Neutral + Location: 39,41 + Actor785: brik + Owner: Neutral + Location: 38,41 + Actor786: brik + Owner: Neutral + Location: 37,41 + Actor787: brik + Owner: Neutral + Location: 36,41 + Actor788: brik + Owner: Neutral + Location: 36,42 + Actor789: brik + Owner: Neutral + Location: 28,40 + Actor790: brik + Owner: Neutral + Location: 29,40 + Actor791: brik + Owner: Neutral + Location: 30,40 + Actor792: brik + Owner: Neutral + Location: 31,40 + Actor793: brik + Owner: Neutral + Location: 31,39 + Actor794: brik + Owner: Neutral + Location: 31,38 + Actor795: brik + Owner: Neutral + Location: 31,37 + Actor796: brik + Owner: Neutral + Location: 32,37 + Actor797: brik + Owner: Neutral + Location: 33,37 + Actor798: brik + Owner: Neutral + Location: 34,37 + Actor799: brik + Owner: Neutral + Location: 35,37 + Actor800: brik + Owner: Neutral + Location: 36,37 + Actor801: brik + Owner: Neutral + Location: 37,37 + Actor802: brik + Owner: Neutral + Location: 38,37 + Actor803: brik + Owner: Neutral + Location: 39,37 + Actor804: brik + Owner: Neutral + Location: 39,36 + Actor805: brik + Owner: Neutral + Location: 39,35 + Actor806: brik + Owner: Neutral + Location: 39,34 + Actor807: brik + Owner: Neutral + Location: 35,34 + Actor808: brik + Owner: Neutral + Location: 36,34 + Actor809: brik + Owner: Neutral + Location: 37,34 + Actor810: brik + Owner: Neutral + Location: 38,34 + Actor811: brik + Owner: Neutral + Location: 35,33 + Actor812: brik + Owner: Neutral + Location: 35,32 + Actor813: brik + Owner: Neutral + Location: 35,31 + Actor814: brik + Owner: Neutral + Location: 35,30 + Actor815: brik + Owner: Neutral + Location: 32,30 + Actor816: brik + Owner: Neutral + Location: 33,30 + Actor817: brik + Owner: Neutral + Location: 34,30 + Actor818: brik + Owner: Neutral + Location: 32,31 + Actor819: brik + Owner: Neutral + Location: 32,32 + Actor828: brik + Owner: Neutral + Location: 21,40 + Actor829: brik + Owner: Neutral + Location: 21,38 + Actor830: brik + Owner: Neutral + Location: 21,39 + Actor831: brik + Owner: Neutral + Location: 21,37 + Actor832: brik + Owner: Neutral + Location: 21,36 + Actor833: brik + Owner: Neutral + Location: 22,40 + Actor834: brik + Owner: Neutral + Location: 24,40 + Actor835: brik + Owner: Neutral + Location: 23,40 + Actor836: brik + Owner: Neutral + Location: 25,40 + Actor837: brik + Owner: Neutral + Location: 27,40 + Actor838: brik + Owner: Neutral + Location: 26,40 + Actor839: brik + Owner: Neutral + Location: 21,43 + Actor840: brik + Owner: Neutral + Location: 21,44 + Actor841: brik + Owner: Neutral + Location: 21,45 + Actor842: brik + Owner: Neutral + Location: 21,46 + Actor843: brik + Owner: Neutral + Location: 22,43 + Actor844: brik + Owner: Neutral + Location: 23,43 + Actor845: brik + Owner: Neutral + Location: 24,43 + Actor846: brik + Owner: Neutral + Location: 25,43 + Actor847: brik + Owner: Neutral + Location: 26,43 + Actor848: brik + Owner: Neutral + Location: 27,43 + Actor849: brik + Owner: Neutral + Location: 28,43 + Actor850: brik + Owner: Neutral + Location: 29,43 + Actor851: brik + Owner: Neutral + Location: 30,43 + Actor852: brik + Owner: Neutral + Location: 31,43 + Actor853: brik + Owner: Neutral + Location: 31,44 + Actor854: brik + Owner: Neutral + Location: 31,45 + Actor855: brik + Owner: Neutral + Location: 31,46 + Actor856: brik + Owner: Neutral + Location: 31,47 + Actor857: brik + Owner: Neutral + Location: 31,48 + Actor858: brik + Owner: Neutral + Location: 31,49 + Actor859: brik + Owner: Neutral + Location: 31,51 + Actor860: brik + Owner: Neutral + Location: 31,50 + Actor861: brik + Owner: Neutral + Location: 31,52 + Actor862: brik + Owner: Neutral + Location: 31,53 + Actor863: brik + Owner: Neutral + Location: 32,53 + Actor864: brik + Owner: Neutral + Location: 21,47 + Actor865: brik + Owner: Neutral + Location: 21,48 + Actor866: brik + Owner: Neutral + Location: 21,50 + Actor867: brik + Owner: Neutral + Location: 21,49 + Actor868: brik + Owner: Neutral + Location: 21,51 + Actor869: brik + Owner: Neutral + Location: 21,52 + Actor870: brik + Owner: Neutral + Location: 14,50 + Actor871: brik + Owner: Neutral + Location: 14,49 + Actor872: brik + Owner: Neutral + Location: 13,49 + Actor873: brik + Owner: Neutral + Location: 13,48 + Actor874: brik + Owner: Neutral + Location: 13,47 + Actor875: brik + Owner: Neutral + Location: 13,46 + Actor876: brik + Owner: Neutral + Location: 13,45 + Actor877: brik + Owner: Neutral + Location: 13,44 + Actor878: brik + Owner: Neutral + Location: 14,44 + Actor879: brik + Owner: Neutral + Location: 14,43 + Actor880: brik + Owner: Neutral + Location: 14,42 + Actor881: brik + Owner: Neutral + Location: 14,41 + Actor882: brik + Owner: Neutral + Location: 15,50 + Actor883: brik + Owner: Neutral + Location: 16,50 + Actor884: brik + Owner: Neutral + Location: 17,50 + Actor885: brik + Owner: Neutral + Location: 18,50 + Actor886: brik + Owner: Neutral + Location: 6,49 + Actor887: brik + Owner: Neutral + Location: 7,49 + Actor888: brik + Owner: Neutral + Location: 8,49 + Actor889: brik + Owner: Neutral + Location: 9,49 + Actor890: brik + Owner: Neutral + Location: 9,48 + Actor891: brik + Owner: Neutral + Location: 9,47 + Actor892: brik + Owner: Neutral + Location: 9,46 + Actor893: brik + Owner: Neutral + Location: 9,45 + Actor894: brik + Owner: Neutral + Location: 9,44 + Actor895: brik + Owner: Neutral + Location: 8,44 + Actor896: brik + Owner: Neutral + Location: 6,44 + Actor897: brik + Owner: Neutral + Location: 7,44 + Actor898: brik + Owner: Neutral + Location: 5,44 + Actor899: brik + Owner: Neutral + Location: 4,44 + Actor900: brik + Owner: Neutral + Location: 3,44 + Actor901: brik + Owner: Neutral + Location: 10,35 + Actor902: brik + Owner: Neutral + Location: 8,35 + Actor903: brik + Owner: Neutral + Location: 9,35 + Actor904: brik + Owner: Neutral + Location: 7,35 + Actor905: brik + Owner: Neutral + Location: 5,35 + Actor906: brik + Owner: Neutral + Location: 6,35 + Actor907: brik + Owner: Neutral + Location: 4,35 + Actor908: brik + Owner: Neutral + Location: 3,35 + Actor909: brik + Owner: Neutral + Location: 10,34 + Actor910: brik + Owner: Neutral + Location: 10,33 + Actor911: brik + Owner: Neutral + Location: 10,32 + Actor912: brik + Owner: Neutral + Location: 10,31 + Actor913: brik + Owner: Neutral + Location: 10,30 + Actor914: brik + Owner: Neutral + Location: 10,29 + Actor915: brik + Owner: Neutral + Location: 10,25 + Actor916: brik + Owner: Neutral + Location: 10,26 + Actor917: brik + Owner: Neutral + Location: 10,27 + Actor918: brik + Owner: Neutral + Location: 10,28 + Actor919: brik + Owner: Neutral + Location: 9,25 + Actor920: brik + Owner: Neutral + Location: 8,25 + Actor921: brik + Owner: Neutral + Location: 7,25 + Actor922: brik + Owner: Neutral + Location: 7,26 + Actor923: brik + Owner: Neutral + Location: 7,27 + Actor924: brik + Owner: Neutral + Location: 6,28 + Actor925: brik + Owner: Neutral + Location: 7,28 + Actor926: brik + Owner: Neutral + Location: 6,18 + Actor927: brik + Owner: Neutral + Location: 6,17 + Actor928: brik + Owner: Neutral + Location: 6,16 + Actor929: brik + Owner: Neutral + Location: 6,15 + Actor930: brik + Owner: Neutral + Location: 7,18 + Actor931: brik + Owner: Neutral + Location: 8,18 + Actor932: brik + Owner: Neutral + Location: 8,19 + Actor933: brik + Owner: Neutral + Location: 8,20 + Actor934: brik + Owner: Neutral + Location: 9,21 + Actor935: brik + Owner: Neutral + Location: 8,21 + Actor936: brik + Owner: Neutral + Location: 10,21 + Actor937: brik + Owner: Neutral + Location: 11,21 + Actor938: brik + Owner: Neutral + Location: 12,21 + Actor939: brik + Owner: Neutral + Location: 13,21 + Actor940: brik + Owner: Neutral + Location: 5,28 + Actor941: brik + Owner: Neutral + Location: 4,28 + Actor942: brik + Owner: Neutral + Location: 3,28 + Actor943: brik + Owner: Neutral + Location: 3,18 + Actor944: brik + Owner: Neutral + Location: 3,17 + Actor945: brik + Owner: Neutral + Location: 3,16 + Actor946: brik + Owner: Neutral + Location: 3,15 + Actor947: brik + Owner: Neutral + Location: 1,15 + Actor948: brik + Owner: Neutral + Location: 2,15 + Actor949: brik + Owner: Neutral + Location: 2,18 + Actor950: brik + Owner: Neutral + Location: 1,18 + Actor951: brik + Owner: Neutral + Location: 7,15 + Actor952: brik + Owner: Neutral + Location: 8,15 + Actor953: brik + Owner: Neutral + Location: 9,15 + Actor954: brik + Owner: Neutral + Location: 10,15 + Actor955: brik + Owner: Neutral + Location: 10,16 + Actor956: brik + Owner: Neutral + Location: 10,17 + Actor957: brik + Owner: Neutral + Location: 11,18 + Actor958: brik + Owner: Neutral + Location: 10,18 + Actor959: brik + Owner: Neutral + Location: 12,18 + Actor960: brik + Owner: Neutral + Location: 14,18 + Actor961: brik + Owner: Neutral + Location: 15,18 + Actor962: brik + Owner: Neutral + Location: 16,18 + Actor963: brik + Owner: Neutral + Location: 13,18 + Actor964: brik + Owner: Neutral + Location: 16,17 + Actor965: brik + Owner: Neutral + Location: 16,16 + Actor966: brik + Owner: Neutral + Location: 16,14 + Actor967: brik + Owner: Neutral + Location: 16,13 + Actor968: brik + Owner: Neutral + Location: 16,12 + Actor969: brik + Owner: Neutral + Location: 16,11 + Actor970: brik + Owner: Neutral + Location: 16,15 + Actor971: brik + Owner: Neutral + Location: 17,11 + Actor972: brik + Owner: Neutral + Location: 18,11 + Actor973: brik + Owner: Neutral + Location: 18,12 + Actor974: brik + Owner: Neutral + Location: 18,13 + Actor975: brik + Owner: Neutral + Location: 18,14 + Actor976: brik + Owner: Neutral + Location: 18,15 + Actor977: brik + Owner: Neutral + Location: 18,16 + Actor978: brik + Owner: Neutral + Location: 18,17 + Actor979: brik + Owner: Neutral + Location: 18,18 + Actor980: brik + Owner: Neutral + Location: 18,19 + Actor981: brik + Owner: Neutral + Location: 18,20 + Actor982: brik + Owner: Neutral + Location: 21,20 + Actor983: brik + Owner: Neutral + Location: 21,19 + Actor984: brik + Owner: Neutral + Location: 21,18 + Actor985: brik + Owner: Neutral + Location: 22,18 + Actor986: brik + Owner: Neutral + Location: 24,18 + Actor987: brik + Owner: Neutral + Location: 25,18 + Actor988: brik + Owner: Neutral + Location: 23,18 + Actor989: brik + Owner: Neutral + Location: 26,18 + Actor990: brik + Owner: Neutral + Location: 27,18 + Actor991: brik + Owner: Neutral + Location: 28,18 + Actor992: brik + Owner: Neutral + Location: 29,18 + Actor993: brik + Owner: Neutral + Location: 29,17 + Actor994: brik + Owner: Neutral + Location: 29,16 + Actor995: brik + Owner: Neutral + Location: 29,14 + Actor996: brik + Owner: Neutral + Location: 29,15 + Actor997: brik + Owner: Neutral + Location: 29,13 + Actor998: brik + Owner: Neutral + Location: 29,12 + Actor999: brik + Owner: Neutral + Location: 29,11 + Actor1000: brik + Owner: Neutral + Location: 31,11 + Actor1001: brik + Owner: Neutral + Location: 30,11 + Actor1002: brik + Owner: Neutral + Location: 32,11 + Actor1003: brik + Owner: Neutral + Location: 32,12 + Actor1004: brik + Owner: Neutral + Location: 32,13 + Actor1005: brik + Owner: Neutral + Location: 32,14 + Actor1006: brik + Owner: Neutral + Location: 32,15 + Actor1007: brik + Owner: Neutral + Location: 32,16 + Actor1008: brik + Owner: Neutral + Location: 32,17 + Actor1009: brik + Owner: Neutral + Location: 32,18 + Actor1010: brik + Owner: Neutral + Location: 33,18 + Actor1011: brik + Owner: Neutral + Location: 34,18 + Actor1012: brik + Owner: Neutral + Location: 35,18 + Actor1013: brik + Owner: Neutral + Location: 36,18 + Actor1014: brik + Owner: Neutral + Location: 36,17 + Actor1015: brik + Owner: Neutral + Location: 37,17 + Actor1016: brik + Owner: Neutral + Location: 38,17 + Actor1017: brik + Owner: Neutral + Location: 39,17 + Actor1018: brik + Owner: Neutral + Location: 39,18 + Actor1019: brik + Owner: Neutral + Location: 39,19 + Actor1020: brik + Owner: Neutral + Location: 39,20 + Actor1021: brik + Owner: Neutral + Location: 39,21 + Actor1022: brik + Owner: Neutral + Location: 39,22 + Actor1023: brik + Owner: Neutral + Location: 39,23 + Actor1024: brik + Owner: Neutral + Location: 39,24 + Actor1025: brik + Owner: Neutral + Location: 38,24 + Actor1026: brik + Owner: Neutral + Location: 37,24 + Actor1027: brik + Owner: Neutral + Location: 36,24 + Actor1028: brik + Owner: Neutral + Location: 35,24 + Actor1029: brik + Owner: Neutral + Location: 35,27 + Actor1030: brik + Owner: Neutral + Location: 33,27 + Actor1031: brik + Owner: Neutral + Location: 32,27 + Actor1032: brik + Owner: Neutral + Location: 32,26 + Actor1033: brik + Owner: Neutral + Location: 32,25 + Actor1034: brik + Owner: Neutral + Location: 32,24 + Actor1035: brik + Owner: Neutral + Location: 34,27 + Actor1036: brik + Owner: Neutral + Location: 35,26 + Actor1037: brik + Owner: Neutral + Location: 35,25 + Actor1038: brik + Owner: Neutral + Location: 36,12 + Actor1039: brik + Owner: Neutral + Location: 36,13 + Actor1040: brik + Owner: Neutral + Location: 36,11 + Actor1041: brik + Owner: Neutral + Location: 36,10 + Actor1042: brik + Owner: Neutral + Location: 36,9 + Actor1043: brik + Owner: Neutral + Location: 36,8 + Actor1044: brik + Owner: Neutral + Location: 36,7 + Actor1045: brik + Owner: Neutral + Location: 34,7 + Actor1046: brik + Owner: Neutral + Location: 35,7 + Actor1047: brik + Owner: Neutral + Location: 37,13 + Actor1048: brik + Owner: Neutral + Location: 38,13 + Actor1049: brik + Owner: Neutral + Location: 39,13 + Actor1050: brik + Owner: Neutral + Location: 40,13 + Actor1051: brik + Owner: Neutral + Location: 41,13 + Actor1052: brik + Owner: Neutral + Location: 42,13 + Actor1053: brik + Owner: Neutral + Location: 43,13 + Actor1054: brik + Owner: Neutral + Location: 29,7 + Actor1055: brik + Owner: Neutral + Location: 29,5 + Actor1056: brik + Owner: Neutral + Location: 29,6 + Actor1057: brik + Owner: Neutral + Location: 29,4 + Actor1058: brik + Owner: Neutral + Location: 30,7 + Actor1059: brik + Owner: Neutral + Location: 31,7 + Actor1060: brik + Owner: Neutral + Location: 32,7 + Actor1061: brik + Owner: Neutral + Location: 33,7 + Actor1062: brik + Owner: Neutral + Location: 23,6 + Actor1063: brik + Owner: Neutral + Location: 24,6 + Actor1064: brik + Owner: Neutral + Location: 25,6 + Actor1065: brik + Owner: Neutral + Location: 25,7 + Actor1066: brik + Owner: Neutral + Location: 25,8 + Actor1067: brik + Owner: Neutral + Location: 25,9 + Actor1068: brik + Owner: Neutral + Location: 25,10 + Actor1069: brik + Owner: Neutral + Location: 25,11 + Actor1070: brik + Owner: Neutral + Location: 25,12 + Actor1071: brik + Owner: Neutral + Location: 25,13 + Actor1072: brik + Owner: Neutral + Location: 24,13 + Actor1073: brik + Owner: Neutral + Location: 23,13 + Actor1074: brik + Owner: Neutral + Location: 23,12 + Actor1075: brik + Owner: Neutral + Location: 23,11 + Actor1076: brik + Owner: Neutral + Location: 23,10 + Actor1077: brik + Owner: Neutral + Location: 23,9 + Actor1078: brik + Owner: Neutral + Location: 23,8 + Actor1079: brik + Owner: Neutral + Location: 23,7 + Actor1080: brik + Owner: Neutral + Location: 16,5 + Actor1081: brik + Owner: Neutral + Location: 17,5 + Actor1082: brik + Owner: Neutral + Location: 18,5 + Actor1083: brik + Owner: Neutral + Location: 18,4 + Actor1084: brik + Owner: Neutral + Location: 18,3 + Actor1085: brik + Owner: Neutral + Location: 18,2 + Actor1086: brik + Owner: Neutral + Location: 18,1 + Actor1087: brik + Owner: Neutral + Location: 16,4 + Actor1088: brik + Owner: Neutral + Location: 16,3 + Actor1089: brik + Owner: Neutral + Location: 16,2 + Actor1090: brik + Owner: Neutral + Location: 16,1 + Actor1091: brik + Owner: Neutral + Location: 9,8 + Actor1092: brik + Owner: Neutral + Location: 8,9 + Actor1093: brik + Owner: Neutral + Location: 9,9 + Actor1094: brik + Owner: Neutral + Location: 8,8 + Actor1095: brik + Owner: Neutral + Location: 8,7 + Actor1096: brik + Owner: Neutral + Location: 9,7 + Actor1097: brik + Owner: Neutral + Location: 8,6 + Actor1098: brik + Owner: Neutral + Location: 9,6 + Actor1099: brik + Owner: Neutral + Location: 1,14 + Actor1100: brik + Owner: Neutral + Location: 1,13 + Actor1101: brik + Owner: Neutral + Location: 14,21 + Actor1102: brik + Owner: Neutral + Location: 14,26 + Actor1103: brik + Owner: Neutral + Location: 14,24 + Actor1104: brik + Owner: Neutral + Location: 14,22 + Actor1105: brik + Owner: Neutral + Location: 14,23 + Actor1106: brik + Owner: Neutral + Location: 14,25 + Actor1107: brik + Owner: Neutral + Location: 26,92 + Actor1108: brik + Owner: Neutral + Location: 26,91 + Actor1109: brik + Owner: Neutral + Location: 26,90 + Actor1110: brik + Owner: Neutral + Location: 26,89 + Actor1111: brik + Owner: Neutral + Location: 26,88 + Actor1112: brik + Owner: Neutral + Location: 28,88 + Actor1113: brik + Owner: Neutral + Location: 27,88 + Actor1114: brik + Owner: Neutral + Location: 29,88 + Actor1115: brik + Owner: Neutral + Location: 29,87 + Actor1116: brik + Owner: Neutral + Location: 29,86 + Actor1117: brik + Owner: Neutral + Location: 29,85 + Actor1118: brik + Owner: Neutral + Location: 27,92 + Actor1119: brik + Owner: Neutral + Location: 28,92 + Actor1120: brik + Owner: Neutral + Location: 29,92 + Actor1121: brik + Owner: Neutral + Location: 29,91 + Actor1122: brik + Owner: Neutral + Location: 29,90 + Actor1123: brik + Owner: Neutral + Location: 30,90 + Actor1124: brik + Owner: Neutral + Location: 32,90 + Actor1125: brik + Owner: Neutral + Location: 32,89 + Actor1126: brik + Owner: Neutral + Location: 31,90 + Actor1127: brik + Owner: Neutral + Location: 32,88 + Actor1128: brik + Owner: Neutral + Location: 32,86 + Actor1129: brik + Owner: Neutral + Location: 32,87 + Actor1130: brik + Owner: Neutral + Location: 26,95 + Actor1131: brik + Owner: Neutral + Location: 28,95 + Actor1132: brik + Owner: Neutral + Location: 29,95 + Actor1133: brik + Owner: Neutral + Location: 27,95 + Actor1134: brik + Owner: Neutral + Location: 26,96 + Actor1135: brik + Owner: Neutral + Location: 29,96 + Actor1136: brik + Owner: Neutral + Location: 30,96 + Actor1137: brik + Owner: Neutral + Location: 25,96 + Actor1138: brik + Owner: Neutral + Location: 15,92 + Actor1139: brik + Owner: Neutral + Location: 16,92 + Actor1140: brik + Owner: Neutral + Location: 18,92 + Actor1141: brik + Owner: Neutral + Location: 17,92 + Actor1142: brik + Owner: Neutral + Location: 15,91 + Actor1143: brik + Owner: Neutral + Location: 15,90 + Actor1144: brik + Owner: Neutral + Location: 15,89 + Actor1145: brik + Owner: Neutral + Location: 15,88 + Actor1146: brik + Owner: Neutral + Location: 16,88 + Actor1147: brik + Owner: Neutral + Location: 18,88 + Actor1148: brik + Owner: Neutral + Location: 17,88 + Actor1149: brik + Owner: Neutral + Location: 18,87 + Actor1150: brik + Owner: Neutral + Location: 18,86 + Actor1151: brik + Owner: Neutral + Location: 18,85 + Actor1152: brik + Owner: Neutral + Location: 18,84 + Actor1153: brik + Owner: Neutral + Location: 18,83 + Actor1154: brik + Owner: Neutral + Location: 18,82 + Actor1155: brik + Owner: Neutral + Location: 18,91 + Actor1156: brik + Owner: Neutral + Location: 18,90 + Actor1157: brik + Owner: Neutral + Location: 20,90 + Actor1158: brik + Owner: Neutral + Location: 19,90 + Actor1159: brik + Owner: Neutral + Location: 21,90 + Actor1160: brik + Owner: Neutral + Location: 22,90 + Actor1161: brik + Owner: Neutral + Location: 22,89 + Actor1162: brik + Owner: Neutral + Location: 22,88 + Actor1163: brik + Owner: Neutral + Location: 22,87 + Actor1164: brik + Owner: Neutral + Location: 22,86 + Actor1165: brik + Owner: Neutral + Location: 15,95 + Actor1166: brik + Owner: Neutral + Location: 16,95 + Actor1167: brik + Owner: Neutral + Location: 17,95 + Actor1168: brik + Owner: Neutral + Location: 18,95 + Actor1169: brik + Owner: Neutral + Location: 18,96 + Actor1170: brik + Owner: Neutral + Location: 15,96 + Actor1171: brik + Owner: Neutral + Location: 19,96 + Actor1172: brik + Owner: Neutral + Location: 13,96 + Actor1173: brik + Owner: Neutral + Location: 14,96 + Actor1174: brik + Owner: Neutral + Location: 5,82 + Actor1175: brik + Owner: Neutral + Location: 5,81 + Actor1176: brik + Owner: Neutral + Location: 5,80 + Actor1177: brik + Owner: Neutral + Location: 5,79 + Actor1178: brik + Owner: Neutral + Location: 5,78 + Actor1179: brik + Owner: Neutral + Location: 5,77 + Actor1180: brik + Owner: Neutral + Location: 6,77 + Actor1181: brik + Owner: Neutral + Location: 7,77 + Actor1182: brik + Owner: Neutral + Location: 6,82 + Actor1183: brik + Owner: Neutral + Location: 7,82 + Actor1184: brik + Owner: Neutral + Location: 8,82 + Actor1185: brik + Owner: Neutral + Location: 9,82 + Actor1186: brik + Owner: Neutral + Location: 10,82 + Actor1187: brik + Owner: Neutral + Location: 12,82 + Actor1188: brik + Owner: Neutral + Location: 11,82 + Actor1189: brik + Owner: Neutral + Location: 7,76 + Actor1190: brik + Owner: Neutral + Location: 7,75 + Actor1191: brik + Owner: Neutral + Location: 7,74 + Actor1192: brik + Owner: Neutral + Location: 9,74 + Actor1193: brik + Owner: Neutral + Location: 10,74 + Actor1194: brik + Owner: Neutral + Location: 8,74 + Actor1195: brik + Owner: Neutral + Location: 10,75 + Actor1196: brik + Owner: Neutral + Location: 10,76 + Actor1197: brik + Owner: Neutral + Location: 10,77 + Actor1198: brik + Owner: Neutral + Location: 10,78 + Actor1199: brik + Owner: Neutral + Location: 12,78 + Actor1200: brik + Owner: Neutral + Location: 11,78 + Actor1201: brik + Owner: Neutral + Location: 13,78 + Actor1202: brik + Owner: Neutral + Location: 14,78 + Actor1203: brik + Owner: Neutral + Location: 15,78 + Actor1204: brik + Owner: Neutral + Location: 7,69 + Actor1205: brik + Owner: Neutral + Location: 7,68 + Actor1206: brik + Owner: Neutral + Location: 7,67 + Actor1207: brik + Owner: Neutral + Location: 6,67 + Actor1208: brik + Owner: Neutral + Location: 7,70 + Actor1209: brik + Owner: Neutral + Location: 9,70 + Actor1210: brik + Owner: Neutral + Location: 8,70 + Actor1211: brik + Owner: Neutral + Location: 10,70 + Actor1212: brik + Owner: Neutral + Location: 11,70 + Actor1213: brik + Owner: Neutral + Location: 12,70 + Actor1214: brik + Owner: Neutral + Location: 13,70 + Actor1215: brik + Owner: Neutral + Location: 14,70 + Actor1216: brik + Owner: Neutral + Location: 14,71 + Actor1217: brik + Owner: Neutral + Location: 14,72 + Actor1218: brik + Owner: Neutral + Location: 14,73 + Actor1219: brik + Owner: Neutral + Location: 15,73 + Actor1220: brik + Owner: Neutral + Location: 16,73 + Actor1221: brik + Owner: Neutral + Location: 17,73 + Actor1222: brik + Owner: Neutral + Location: 18,73 + Actor1223: brik + Owner: Neutral + Location: 18,72 + Actor1224: brik + Owner: Neutral + Location: 18,71 + Actor1225: brik + Owner: Neutral + Location: 18,70 + Actor1226: brik + Owner: Neutral + Location: 18,69 + Actor1227: brik + Owner: Neutral + Location: 18,68 + Actor1228: brik + Owner: Neutral + Location: 18,67 + Actor1229: brik + Owner: Neutral + Location: 18,66 + Actor1230: brik + Owner: Neutral + Location: 18,65 + Actor1231: brik + Owner: Neutral + Location: 18,64 + Actor1232: brik + Owner: Neutral + Location: 18,63 + Actor1233: brik + Owner: Neutral + Location: 18,62 + Actor1234: brik + Owner: Neutral + Location: 17,62 + Actor1235: brik + Owner: Neutral + Location: 15,62 + Actor1236: brik + Owner: Neutral + Location: 14,62 + Actor1237: brik + Owner: Neutral + Location: 16,62 + Actor1238: brik + Owner: Neutral + Location: 14,63 + Actor1239: brik + Owner: Neutral + Location: 14,64 + Actor1240: brik + Owner: Neutral + Location: 12,64 + Actor1241: brik + Owner: Neutral + Location: 13,64 + Actor1242: brik + Owner: Neutral + Location: 11,64 + Actor1243: brik + Owner: Neutral + Location: 14,58 + Actor1244: brik + Owner: Neutral + Location: 14,57 + Actor1245: brik + Owner: Neutral + Location: 14,56 + Actor1246: brik + Owner: Neutral + Location: 9,56 + Actor1247: brik + Owner: Neutral + Location: 10,56 + Actor1248: brik + Owner: Neutral + Location: 12,56 + Actor1249: brik + Owner: Neutral + Location: 11,56 + Actor1250: brik + Owner: Neutral + Location: 13,56 + Actor1251: brik + Owner: Neutral + Location: 9,55 + Actor1252: brik + Owner: Neutral + Location: 10,55 + Actor1253: brik + Owner: Neutral + Location: 11,55 + Actor1254: brik + Owner: Neutral + Location: 12,55 + Actor1255: brik + Owner: Neutral + Location: 13,55 + Actor1256: brik + Owner: Neutral + Location: 14,55 + Actor1257: brik + Owner: Neutral + Location: 14,54 + Actor1258: brik + Owner: Neutral + Location: 15,54 + Actor1259: brik + Owner: Neutral + Location: 16,54 + Actor1260: brik + Owner: Neutral + Location: 17,54 + Actor1261: brik + Owner: Neutral + Location: 18,54 + Actor1262: brik + Owner: Neutral + Location: 18,54 + Actor1263: brik + Owner: Neutral + Location: 20,54 + Actor1264: brik + Owner: Neutral + Location: 19,54 + Actor1265: brik + Owner: Neutral + Location: 15,58 + Actor1266: brik + Owner: Neutral + Location: 16,58 + Actor1267: brik + Owner: Neutral + Location: 17,58 + Actor1268: brik + Owner: Neutral + Location: 18,58 + Actor1269: brik + Owner: Neutral + Location: 19,58 + Actor1270: brik + Owner: Neutral + Location: 20,58 + Actor1271: brik + Owner: Neutral + Location: 21,58 + Actor1272: brik + Owner: Neutral + Location: 23,67 + Actor1273: brik + Owner: Neutral + Location: 23,68 + Actor1274: brik + Owner: Neutral + Location: 23,69 + Actor1275: brik + Owner: Neutral + Location: 24,69 + Actor1276: brik + Owner: Neutral + Location: 26,69 + Actor1277: brik + Owner: Neutral + Location: 25,69 + Actor1278: brik + Owner: Neutral + Location: 27,69 + Actor1279: brik + Owner: Neutral + Location: 27,68 + Actor1280: brik + Owner: Neutral + Location: 27,67 + Actor1281: brik + Owner: Neutral + Location: 24,67 + Actor1282: brik + Owner: Neutral + Location: 25,67 + Actor1283: brik + Owner: Neutral + Location: 26,67 + Actor1284: brik + Owner: Neutral + Location: 42,82 + Actor1285: brik + Owner: Neutral + Location: 42,83 + Actor1286: brik + Owner: Neutral + Location: 41,83 + Actor1287: brik + Owner: Neutral + Location: 40,83 + Actor1288: brik + Owner: Neutral + Location: 43,82 + Actor1289: brik + Owner: Neutral + Location: 55,82 + Actor1290: brik + Owner: Neutral + Location: 56,82 + Actor1291: brik + Owner: Neutral + Location: 54,82 + Actor1292: brik + Owner: Neutral + Location: 56,83 + Actor1293: brik + Owner: Neutral + Location: 57,83 + Actor1294: brik + Owner: Neutral + Location: 58,83 + Actor1296: brik + Owner: Neutral + Location: 84,82 + Actor1297: brik + Owner: Neutral + Location: 83,82 + Actor1298: brik + Owner: Neutral + Location: 82,82 + Actor1299: brik + Owner: Neutral + Location: 84,81 + Actor1300: brik + Owner: Neutral + Location: 84,80 + Actor1301: brik + Owner: Neutral + Location: 84,79 + Actor1302: brik + Owner: Neutral + Location: 84,78 + Actor1303: brik + Owner: Neutral + Location: 84,77 + Actor1304: brik + Owner: Neutral + Location: 84,76 + Actor1305: brik + Owner: Neutral + Location: 84,75 + Actor1306: brik + Owner: Neutral + Location: 84,74 + Actor1307: brik + Owner: Neutral + Location: 83,74 + Actor1308: brik + Owner: Neutral + Location: 82,74 + Actor1309: brik + Owner: Neutral + Location: 87,74 + Actor1310: brik + Owner: Neutral + Location: 88,74 + Actor1311: brik + Owner: Neutral + Location: 86,74 + Actor1312: brik + Owner: Neutral + Location: 86,75 + Actor1313: brik + Owner: Neutral + Location: 86,76 + Actor1314: brik + Owner: Neutral + Location: 86,77 + Actor1315: brik + Owner: Neutral + Location: 86,78 + Actor1316: brik + Owner: Neutral + Location: 86,79 + Actor1317: brik + Owner: Neutral + Location: 86,80 + Actor1318: brik + Owner: Neutral + Location: 86,81 + Actor1319: brik + Owner: Neutral + Location: 86,82 + Actor1320: brik + Owner: Neutral + Location: 87,82 + Actor1321: brik + Owner: Neutral + Location: 88,82 + Actor1322: brik + Owner: Neutral + Location: 89,82 + Actor1323: brik + Owner: Neutral + Location: 90,82 + Actor1324: brik + Owner: Neutral + Location: 90,81 + Actor1325: brik + Owner: Neutral + Location: 90,80 + Actor1326: brik + Owner: Neutral + Location: 90,79 + Actor1327: brik + Owner: Neutral + Location: 90,78 + Actor1328: brik + Owner: Neutral + Location: 90,77 + Actor1329: brik + Owner: Neutral + Location: 90,76 + Actor1330: brik + Owner: Neutral + Location: 90,75 + Actor1331: brik + Owner: Neutral + Location: 90,74 + Actor1332: brik + Owner: Neutral + Location: 94,79 + Actor1333: brik + Owner: Neutral + Location: 95,79 + Actor1334: brik + Owner: Neutral + Location: 96,79 + Actor1335: brik + Owner: Neutral + Location: 94,80 + Actor1336: brik + Owner: Neutral + Location: 94,81 + Actor1337: brik + Owner: Neutral + Location: 94,82 + Actor1338: brik + Owner: Neutral + Location: 95,82 + Actor1339: brik + Owner: Neutral + Location: 96,82 + Actor1340: brik + Owner: Neutral + Location: 96,78 + Actor1341: brik + Owner: Neutral + Location: 96,77 + Actor1342: brik + Owner: Neutral + Location: 96,75 + Actor1343: brik + Owner: Neutral + Location: 96,76 + Actor1344: brik + Owner: Neutral + Location: 96,74 + Actor1345: brik + Owner: Neutral + Location: 90,73 + Actor1346: brik + Owner: Neutral + Location: 90,72 + Actor1347: brik + Owner: Neutral + Location: 90,71 + Actor1348: brik + Owner: Neutral + Location: 88,71 + Actor1349: brik + Owner: Neutral + Location: 89,71 + Actor1350: brik + Owner: Neutral + Location: 88,72 + Actor1351: brik + Owner: Neutral + Location: 88,73 + Actor1352: brik + Owner: Neutral + Location: 82,73 + Actor1353: brik + Owner: Neutral + Location: 88,67 + Actor1354: brik + Owner: Neutral + Location: 88,66 + Actor1355: brik + Owner: Neutral + Location: 88,65 + Actor1356: brik + Owner: Neutral + Location: 88,64 + Actor1357: brik + Owner: Neutral + Location: 89,67 + Actor1358: brik + Owner: Neutral + Location: 90,67 + Actor1359: brik + Owner: Neutral + Location: 90,66 + Actor1360: brik + Owner: Neutral + Location: 90,65 + Actor1361: brik + Owner: Neutral + Location: 90,64 + Actor1362: brik + Owner: Neutral + Location: 90,62 + Actor1363: brik + Owner: Neutral + Location: 90,61 + Actor1364: brik + Owner: Neutral + Location: 90,63 + Actor1365: brik + Owner: Neutral + Location: 89,61 + Actor1366: brik + Owner: Neutral + Location: 88,61 + Actor1367: brik + Owner: Neutral + Location: 87,61 + Actor1368: brik + Owner: Neutral + Location: 87,61 + Actor1369: brik + Owner: Neutral + Location: 86,61 + Actor1370: brik + Owner: Neutral + Location: 85,61 + Actor1371: brik + Owner: Neutral + Location: 84,61 + Actor1372: brik + Owner: Neutral + Location: 82,61 + Actor1373: brik + Owner: Neutral + Location: 83,61 + Actor1374: brik + Owner: Neutral + Location: 82,52 + Actor1375: brik + Owner: Neutral + Location: 83,52 + Actor1376: brik + Owner: Neutral + Location: 83,51 + Actor1377: brik + Owner: Neutral + Location: 83,50 + Actor1378: brik + Owner: Neutral + Location: 82,50 + Actor1379: brik + Owner: Neutral + Location: 87,50 + Actor1380: brik + Owner: Neutral + Location: 87,51 + Actor1381: brik + Owner: Neutral + Location: 87,52 + Actor1382: brik + Owner: Neutral + Location: 88,52 + Actor1383: brik + Owner: Neutral + Location: 89,52 + Actor1384: brik + Owner: Neutral + Location: 90,52 + Actor1385: brik + Owner: Neutral + Location: 91,52 + Actor1386: brik + Owner: Neutral + Location: 92,52 + Actor1387: brik + Owner: Neutral + Location: 93,52 + Actor1388: brik + Owner: Neutral + Location: 94,52 + Actor1389: brik + Owner: Neutral + Location: 95,52 + Actor1390: brik + Owner: Neutral + Location: 87,46 + Actor1391: brik + Owner: Neutral + Location: 89,46 + Actor1392: brik + Owner: Neutral + Location: 90,46 + Actor1393: brik + Owner: Neutral + Location: 88,46 + Actor1394: brik + Owner: Neutral + Location: 87,47 + Actor1395: brik + Owner: Neutral + Location: 87,48 + Actor1396: brik + Owner: Neutral + Location: 87,49 + Actor1397: brik + Owner: Neutral + Location: 90,47 + Actor1398: brik + Owner: Neutral + Location: 90,48 + Actor1399: brik + Owner: Neutral + Location: 90,49 + Actor1400: brik + Owner: Neutral + Location: 91,49 + Actor1401: brik + Owner: Neutral + Location: 92,49 + Actor1402: brik + Owner: Neutral + Location: 93,49 + Actor1403: brik + Owner: Neutral + Location: 90,42 + Actor1404: brik + Owner: Neutral + Location: 89,42 + Actor1405: brik + Owner: Neutral + Location: 88,42 + Actor1406: brik + Owner: Neutral + Location: 87,42 + Actor1407: brik + Owner: Neutral + Location: 87,37 + Actor1408: brik + Owner: Neutral + Location: 87,38 + Actor1409: brik + Owner: Neutral + Location: 87,39 + Actor1410: brik + Owner: Neutral + Location: 87,40 + Actor1411: brik + Owner: Neutral + Location: 87,41 + Actor1412: brik + Owner: Neutral + Location: 90,41 + Actor1413: brik + Owner: Neutral + Location: 90,40 + Actor1414: brik + Owner: Neutral + Location: 90,39 + Actor1415: brik + Owner: Neutral + Location: 90,39 + Actor1416: brik + Owner: Neutral + Location: 92,39 + Actor1417: brik + Owner: Neutral + Location: 91,39 + Actor1418: brik + Owner: Neutral + Location: 93,39 + Actor1419: brik + Owner: Neutral + Location: 76,46 + Actor1420: brik + Owner: Neutral + Location: 76,47 + Actor1421: brik + Owner: Neutral + Location: 77,47 + Actor1422: brik + Owner: Neutral + Location: 77,46 + Actor1423: brik + Owner: Neutral + Location: 78,46 + Actor1424: brik + Owner: Neutral + Location: 78,47 + Actor1425: brik + Owner: Neutral + Location: 79,47 + Actor1426: brik + Owner: Neutral + Location: 80,47 + Actor1427: brik + Owner: Neutral + Location: 81,47 + Actor1428: brik + Owner: Neutral + Location: 82,47 + Actor1429: brik + Owner: Neutral + Location: 83,47 + Actor1430: brik + Owner: Neutral + Location: 83,46 + Actor1431: brik + Owner: Neutral + Location: 83,45 + Actor1432: brik + Owner: Neutral + Location: 83,44 + Actor1433: brik + Owner: Neutral + Location: 83,43 + Actor1434: brik + Owner: Neutral + Location: 83,42 + Actor1435: brik + Owner: Neutral + Location: 83,41 + Actor1436: brik + Owner: Neutral + Location: 83,40 + Actor1437: brik + Owner: Neutral + Location: 78,40 + Actor1442: brik + Owner: Neutral + Location: 78,41 + Actor1443: brik + Owner: Neutral + Location: 78,42 + Actor1444: brik + Owner: Neutral + Location: 78,43 + Actor1445: brik + Owner: Neutral + Location: 78,44 + Actor1446: brik + Owner: Neutral + Location: 78,45 + Actor1438: brik + Owner: Neutral + Location: 79,40 + Actor1439: brik + Owner: Neutral + Location: 80,40 + Actor1440: brik + Owner: Neutral + Location: 81,40 + Actor1441: brik + Owner: Neutral + Location: 82,40 + Actor1447: brik + Owner: Neutral + Location: 71,46 + Actor1448: brik + Owner: Neutral + Location: 72,46 + Actor1449: brik + Owner: Neutral + Location: 73,46 + Actor1450: brik + Owner: Neutral + Location: 73,47 + Actor1451: brik + Owner: Neutral + Location: 73,48 + Actor1452: brik + Owner: Neutral + Location: 73,50 + Actor1453: brik + Owner: Neutral + Location: 73,49 + Actor1454: brik + Owner: Neutral + Location: 74,50 + Actor1455: brik + Owner: Neutral + Location: 70,46 + Actor1456: brik + Owner: Neutral + Location: 69,46 + Actor1457: brik + Owner: Neutral + Location: 69,45 + Actor1458: brik + Owner: Neutral + Location: 71,30 + Actor1459: brik + Owner: Neutral + Location: 70,30 + Actor1460: brik + Owner: Neutral + Location: 69,30 + Actor1461: brik + Owner: Neutral + Location: 67,30 + Actor1462: brik + Owner: Neutral + Location: 67,29 + Actor1463: brik + Owner: Neutral + Location: 69,29 + Actor1464: brik + Owner: Neutral + Location: 70,29 + Actor1465: brik + Owner: Neutral + Location: 71,29 + Actor1466: brik + Owner: Neutral + Location: 68,29 + Actor1467: brik + Owner: Neutral + Location: 67,31 + Actor1468: brik + Owner: Neutral + Location: 67,32 + Actor1469: brik + Owner: Neutral + Location: 67,33 + Actor1470: brik + Owner: Neutral + Location: 67,34 + Actor1471: brik + Owner: Neutral + Location: 67,35 + Actor1472: brik + Owner: Neutral + Location: 69,34 + Actor1473: brik + Owner: Neutral + Location: 69,33 + Actor1474: brik + Owner: Neutral + Location: 69,32 + Actor1475: brik + Owner: Neutral + Location: 69,31 + Actor1476: brik + Owner: Neutral + Location: 75,28 + Actor1477: brik + Owner: Neutral + Location: 75,29 + Actor1478: brik + Owner: Neutral + Location: 75,30 + Actor1479: brik + Owner: Neutral + Location: 77,30 + Actor1480: brik + Owner: Neutral + Location: 78,30 + Actor1481: brik + Owner: Neutral + Location: 76,30 + Actor1482: brik + Owner: Neutral + Location: 78,29 + Actor1483: brik + Owner: Neutral + Location: 78,28 + Actor1484: brik + Owner: Neutral + Location: 78,27 + Actor1485: brik + Owner: Neutral + Location: 78,26 + Actor1486: brik + Owner: Neutral + Location: 78,25 + Actor1487: brik + Owner: Neutral + Location: 88,37 + Actor1488: brik + Owner: Neutral + Location: 89,37 + Actor1489: brik + Owner: Neutral + Location: 90,37 + Actor1490: brik + Owner: Neutral + Location: 91,37 + Actor1491: brik + Owner: Neutral + Location: 64,30 + Actor1492: brik + Owner: Neutral + Location: 63,30 + Actor1493: brik + Owner: Neutral + Location: 62,30 + Actor1494: brik + Owner: Neutral + Location: 62,29 + Actor1495: brik + Owner: Neutral + Location: 62,28 + Actor1496: brik + Owner: Neutral + Location: 62,27 + Actor1497: brik + Owner: Neutral + Location: 62,26 + Actor1498: brik + Owner: Neutral + Location: 64,25 + Actor1499: brik + Owner: Neutral + Location: 64,26 + Actor1500: brik + Owner: Neutral + Location: 64,28 + Actor1501: brik + Owner: Neutral + Location: 64,27 + Actor1502: brik + Owner: Neutral + Location: 64,29 + Actor1503: brik + Owner: Neutral + Location: 62,25 + Actor1504: brik + Owner: Neutral + Location: 62,24 + Actor1505: brik + Owner: Neutral + Location: 62,23 + Actor1506: brik + Owner: Neutral + Location: 62,22 + Actor1507: brik + Owner: Neutral + Location: 64,22 + Actor1508: brik + Owner: Neutral + Location: 64,23 + Actor1509: brik + Owner: Neutral + Location: 64,24 + Actor1510: brik + Owner: Neutral + Location: 62,21 + Actor1511: brik + Owner: Neutral + Location: 62,20 + Actor1512: brik + Owner: Neutral + Location: 56,20 + Actor1513: brik + Owner: Neutral + Location: 57,20 + Actor1514: brik + Owner: Neutral + Location: 58,20 + Actor1515: brik + Owner: Neutral + Location: 58,21 + Actor1516: brik + Owner: Neutral + Location: 58,22 + Actor1517: brik + Owner: Neutral + Location: 58,24 + Actor1518: brik + Owner: Neutral + Location: 58,23 + Actor1519: brik + Owner: Neutral + Location: 58,25 + Actor1520: brik + Owner: Neutral + Location: 58,26 + Actor1521: brik + Owner: Neutral + Location: 58,27 + Actor1522: brik + Owner: Neutral + Location: 58,28 + Actor1523: brik + Owner: Neutral + Location: 58,29 + Actor1524: brik + Owner: Neutral + Location: 58,30 + Actor1525: brik + Owner: Neutral + Location: 57,30 + Actor1526: brik + Owner: Neutral + Location: 56,30 + Actor1527: brik + Owner: Neutral + Location: 55,30 + Actor1528: brik + Owner: Neutral + Location: 54,30 + Actor1529: brik + Owner: Neutral + Location: 53,30 + Actor1530: brik + Owner: Neutral + Location: 53,31 + Actor1531: brik + Owner: Neutral + Location: 53,16 + Actor1532: brik + Owner: Neutral + Location: 53,15 + Actor1533: brik + Owner: Neutral + Location: 53,14 + Actor1534: brik + Owner: Neutral + Location: 53,13 + Actor1535: brik + Owner: Neutral + Location: 53,12 + Actor1536: brik + Owner: Neutral + Location: 53,11 + Actor1537: brik + Owner: Neutral + Location: 53,11 + Actor1538: brik + Owner: Neutral + Location: 54,16 + Actor1539: brik + Owner: Neutral + Location: 55,16 + Actor1540: brik + Owner: Neutral + Location: 56,16 + Actor1541: brik + Owner: Neutral + Location: 57,16 + Actor1542: brik + Owner: Neutral + Location: 58,16 + Actor1543: brik + Owner: Neutral + Location: 59,16 + Actor1544: brik + Owner: Neutral + Location: 53,10 + Actor1545: brik + Owner: Neutral + Location: 50,20 + Actor1546: brik + Owner: Neutral + Location: 51,20 + Actor1547: brik + Owner: Neutral + Location: 52,20 + Actor1548: brik + Owner: Neutral + Location: 53,20 + Actor1549: brik + Owner: Neutral + Location: 55,20 + Actor1550: brik + Owner: Neutral + Location: 54,20 + Actor1551: brik + Owner: Neutral + Location: 43,24 + Actor1552: brik + Owner: Neutral + Location: 43,23 + Actor1553: brik + Owner: Neutral + Location: 43,22 + Actor1554: brik + Owner: Neutral + Location: 43,20 + Actor1555: brik + Owner: Neutral + Location: 43,19 + Actor1556: brik + Owner: Neutral + Location: 43,18 + Actor1557: brik + Owner: Neutral + Location: 43,21 + Actor1558: brik + Owner: Neutral + Location: 44,24 + Actor1559: brik + Owner: Neutral + Location: 45,24 + Actor1560: brik + Owner: Neutral + Location: 46,24 + Actor1561: brik + Owner: Neutral + Location: 47,24 + Actor1562: brik + Owner: Neutral + Location: 48,24 + Actor1563: brik + Owner: Neutral + Location: 49,24 + Actor1564: brik + Owner: Neutral + Location: 49,37 + Actor1565: brik + Owner: Neutral + Location: 49,36 + Actor1566: brik + Owner: Neutral + Location: 49,35 + Actor1567: brik + Owner: Neutral + Location: 49,34 + Actor1568: brik + Owner: Neutral + Location: 49,33 + Actor1569: brik + Owner: Neutral + Location: 49,32 + Actor1570: brik + Owner: Neutral + Location: 49,31 + Actor1571: brik + Owner: Neutral + Location: 53,32 + Actor1572: brik + Owner: Neutral + Location: 53,33 + Actor1573: brik + Owner: Neutral + Location: 53,34 + Actor1574: brik + Owner: Neutral + Location: 53,35 + Actor1575: brik + Owner: Neutral + Location: 53,36 + Actor1576: brik + Owner: Neutral + Location: 53,37 + Actor1577: brik + Owner: Neutral + Location: 51,37 + Actor1578: brik + Owner: Neutral + Location: 50,37 + Actor1579: brik + Owner: Neutral + Location: 52,37 + Actor1580: brik + Owner: Neutral + Location: 49,43 + Actor1581: brik + Owner: Neutral + Location: 50,43 + Actor1582: brik + Owner: Neutral + Location: 51,43 + Actor1583: brik + Owner: Neutral + Location: 52,43 + Actor1584: brik + Owner: Neutral + Location: 53,43 + Actor1585: brik + Owner: Neutral + Location: 53,44 + Actor1586: brik + Owner: Neutral + Location: 53,45 + Actor1587: brik + Owner: Neutral + Location: 53,46 + Actor1588: brik + Owner: Neutral + Location: 53,47 + Actor1589: brik + Owner: Neutral + Location: 53,48 + Actor1590: brik + Owner: Neutral + Location: 49,44 + Actor1591: brik + Owner: Neutral + Location: 49,45 + Actor1592: brik + Owner: Neutral + Location: 49,46 + Actor1593: brik + Owner: Neutral + Location: 49,47 + Actor1594: brik + Owner: Neutral + Location: 49,48 + Actor1595: brik + Owner: Neutral + Location: 49,49 + Actor1596: brik + Owner: Neutral + Location: 53,49 + Actor1597: brik + Owner: Neutral + Location: 54,49 + Actor1598: brik + Owner: Neutral + Location: 56,49 + Actor1599: brik + Owner: Neutral + Location: 55,49 + Actor1600: brik + Owner: Neutral + Location: 49,52 + Actor1601: brik + Owner: Neutral + Location: 49,51 + Actor1602: brik + Owner: Neutral + Location: 49,50 + Actor1610: brik + Owner: Neutral + Location: 61,6 + Actor1611: brik + Owner: Neutral + Location: 63,6 + Actor1612: brik + Owner: Neutral + Location: 62,6 + Actor1613: brik + Owner: Neutral + Location: 64,6 + Actor1614: brik + Owner: Neutral + Location: 64,7 + Actor1615: brik + Owner: Neutral + Location: 61,7 + Actor1616: brik + Owner: Neutral + Location: 64,8 + Actor1617: brik + Owner: Neutral + Location: 64,9 + Actor1618: brik + Owner: Neutral + Location: 60,7 + Actor1619: brik + Owner: Neutral + Location: 47,5 + Actor1620: brik + Owner: Neutral + Location: 46,5 + Actor1621: brik + Owner: Neutral + Location: 44,5 + Actor1622: brik + Owner: Neutral + Location: 45,5 + Actor1623: brik + Owner: Neutral + Location: 43,5 + Actor1624: brik + Owner: Neutral + Location: 42,5 + Actor1625: brik + Owner: Neutral + Location: 47,6 + Actor1626: brik + Owner: Neutral + Location: 47,7 + Actor1627: brik + Owner: Neutral + Location: 47,8 + Actor1628: brik + Owner: Neutral + Location: 47,9 + Actor1629: brik + Owner: Neutral + Location: 53,7 + Actor1630: brik + Owner: Neutral + Location: 54,7 + Actor1631: brik + Owner: Neutral + Location: 56,7 + Actor1632: brik + Owner: Neutral + Location: 57,7 + Actor1633: brik + Owner: Neutral + Location: 55,7 + Actor1634: brik + Owner: Neutral + Location: 53,8 + Actor1635: brik + Owner: Neutral + Location: 53,9 + Actor1636: brik + Owner: Neutral + Location: 58,7 + Actor1637: brik + Owner: Neutral + Location: 59,7 + Actor1638: brik + Owner: Neutral + Location: 69,6 + Actor1639: brik + Owner: Neutral + Location: 69,7 + Actor1640: brik + Owner: Neutral + Location: 69,8 + Actor1641: brik + Owner: Neutral + Location: 69,9 + Actor1642: brik + Owner: Neutral + Location: 70,9 + Actor1643: brik + Owner: Neutral + Location: 70,8 + Actor1644: brik + Owner: Neutral + Location: 70,7 + Actor1645: brik + Owner: Neutral + Location: 70,6 + Actor1646: brik + Owner: Neutral + Location: 75,7 + Actor1647: brik + Owner: Neutral + Location: 76,7 + Actor1648: brik + Owner: Neutral + Location: 77,7 + Actor1649: brik + Owner: Neutral + Location: 78,7 + Actor1650: brik + Owner: Neutral + Location: 78,8 + Actor1651: brik + Owner: Neutral + Location: 78,9 + Actor1652: brik + Owner: Neutral + Location: 78,10 + Actor1653: brik + Owner: Neutral + Location: 75,8 + Actor1654: brik + Owner: Neutral + Location: 75,9 + Actor1655: brik + Owner: Neutral + Location: 75,10 + Actor1656: brik + Owner: Neutral + Location: 75,11 + Actor1657: brik + Owner: Neutral + Location: 75,11 + Actor1658: brik + Owner: Neutral + Location: 78,11 + Actor1659: brik + Owner: Neutral + Location: 78,12 + Actor1660: brik + Owner: Neutral + Location: 78,13 + Actor1661: brik + Owner: Neutral + Location: 75,12 + Actor1662: brik + Owner: Neutral + Location: 75,13 + Actor1663: brik + Owner: Neutral + Location: 78,14 + Actor1664: brik + Owner: Neutral + Location: 88,15 + Actor1665: brik + Owner: Neutral + Location: 89,15 + Actor1666: brik + Owner: Neutral + Location: 89,16 + Actor1667: brik + Owner: Neutral + Location: 89,17 + Actor1668: brik + Owner: Neutral + Location: 86,15 + Actor1669: brik + Owner: Neutral + Location: 87,15 + Actor1670: brik + Owner: Neutral + Location: 89,18 + Actor1671: brik + Owner: Neutral + Location: 85,8 + Actor1672: brik + Owner: Neutral + Location: 85,7 + Actor1673: brik + Owner: Neutral + Location: 85,6 + Actor1674: brik + Owner: Neutral + Location: 86,6 + Actor1675: brik + Owner: Neutral + Location: 86,7 + Actor1676: brik + Owner: Neutral + Location: 86,8 + Actor1677: brik + Owner: Neutral + Location: 85,9 + Actor1678: brik + Owner: Neutral + Location: 86,9 + Actor1679: brik + Owner: Neutral + Location: 75,2 + Actor1680: brik + Owner: Neutral + Location: 75,3 + Actor1681: brik + Owner: Neutral + Location: 75,1 + Actor1682: brik + Owner: Neutral + Location: 76,3 + Actor1683: brik + Owner: Neutral + Location: 77,3 + Actor1684: brik + Owner: Neutral + Location: 77,2 + Actor1685: brik + Owner: Neutral + Location: 77,1 + Actor1686: s4 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 81,33 + Actor1687: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 83,36 + Actor1688: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 80,32 + Actor1689: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 79,34 + Actor1690: s1 + Owner: Scrin + Facing: 384 + Location: 79,35 + SubCell: 3 + Actor1691: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 80,37 + Actor1692: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 82,38 + Actor1693: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 86,36 + Actor1694: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 76,49 + Actor1695: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 33,46 + Actor1696: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 41,43 + Actor1697: s1 + Owner: Scrin + Facing: 384 + Location: 17,53 + SubCell: 3 + Actor1698: s1 + Owner: Scrin + Facing: 384 + Location: 9,62 + SubCell: 1 + Actor1699: gscr + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 8,94 + Actor1700: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 11,92 + Actor1701: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 12,88 + Actor1702: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 10,85 + Actor1703: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 6,85 + Actor1704: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 4,87 + Actor1705: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 3,91 + Actor1706: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 7,91 + Actor1707: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 3,79 + Actor1708: s3 + Owner: Scrin + Facing: 384 + Location: 3,78 + SubCell: 3 + Actor1709: s3 + Owner: Scrin + Facing: 384 + Location: 4,78 + SubCell: 3 + Actor1710: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 90,8 + Actor1711: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 89,5 + Actor1712: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 94,9 + Actor1714: ptur + Owner: Scrin + Location: 5,8 + TurretFacing: 840 + Actor1713: ptur + Owner: Scrin + Location: 13,13 + TurretFacing: 142 + Actor1715: ptur + Owner: Scrin + Location: 88,92 + TurretFacing: 658 + Actor1716: ptur + Owner: Scrin + Location: 93,89 + TurretFacing: 237 + Actor1717: ptur + Owner: Scrin + Location: 42,29 + TurretFacing: 118 + Actor1718: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 39,31 + Actor1719: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 41,32 + Actor1720: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 46,30 + Actor1721: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 46,28 + Actor1722: s1 + Owner: Scrin + Facing: 384 + Location: 44,31 + SubCell: 3 + Actor1723: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 39,29 + Actor1724: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 44,27 + Actor146: e1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 54,90 + Actor1727: brik + Owner: Neutral + Location: 24,34 + Actor1728: brik + Owner: Neutral + Location: 28,34 + Actor1729: brik + Owner: Neutral + Location: 24,35 + Actor1732: brik + Owner: Neutral + Location: 28,35 + Actor1733: brik + Owner: Neutral + Location: 24,36 + Actor1734: brik + Owner: Neutral + Location: 25,36 + Actor1735: brik + Owner: Neutral + Location: 26,36 + Actor1736: brik + Owner: Neutral + Location: 27,36 + Actor1737: brik + Owner: Neutral + Location: 28,36 + Actor1607: brik + Owner: Neutral + Location: 28,33 + Actor1608: brik + Owner: Neutral + Location: 29,33 + Actor1609: brik + Owner: Neutral + Location: 30,33 + Actor1726: brik + Owner: Neutral + Location: 31,33 + Actor1738: brik + Owner: Neutral + Location: 32,33 + Actor1606: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 29,23 + Actor1739: gunw + Owner: Scrin + Facing: 658 + Location: 27,24 + Actor1740: s1 + Owner: Scrin + SubCell: 3 + Location: 29,25 + Facing: 384 + Actor1741: ptur + Owner: Scrin + Location: 74,43 + TurretFacing: 880 + Actor1742: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 82,32 + Actor1743: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 82,33 + Actor1744: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 86,35 + Actor1745: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 85,30 + Actor1746: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 87,33 + Actor2878: brik + Owner: Neutral + Location: 119,1 + Actor2909: brik + Owner: Neutral + Location: 121,1 + Actor2946: brik + Owner: Neutral + Location: 178,1 + Actor3142: brik + Owner: Neutral + Location: 180,1 + Actor3144: brik + Owner: Neutral + Location: 119,2 + Actor3203: brik + Owner: Neutral + Location: 121,2 + Actor3303: brik + Owner: Neutral + Location: 178,2 + Actor3304: brik + Owner: Neutral + Location: 180,2 + Actor3307: brik + Owner: Neutral + Location: 119,3 + Actor3361: brik + Owner: Neutral + Location: 121,3 + Actor3362: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 146,3 + Actor3363: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 148,3 + Actor3364: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 159,3 + Actor3365: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 175,3 + Actor3366: brik + Owner: Neutral + Location: 178,3 + Actor3367: brik + Owner: Neutral + Location: 179,3 + Actor3368: brik + Owner: Neutral + Location: 180,3 + Actor3369: ruin + Owner: Scrin + Facing: 384 + Location: 117,4 + Actor3370: brik + Owner: Neutral + Location: 119,4 + Actor3371: brik + Owner: Neutral + Location: 121,4 + Actor3372: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 130,4 + Actor3373: brik + Owner: Neutral + Location: 132,4 + Actor3374: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 145,4 + Actor3375: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 147,4 + Nod_NE2: waypoint + Owner: Neutral + Location: 154,4 + Actor3377: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 155,4 + Actor3378: corr + Owner: Scrin + Facing: 384 + Location: 161,4 + Actor3379: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 163,4 + Actor3380: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 170,4 + Actor3381: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 174,4 + Actor3382: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 176,4 + Actor3383: corr + Owner: Scrin + Facing: 245 + Location: 189,4 + Actor3384: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 193,4 + Actor3385: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 196,4 + Nod_WormholeNW: wormhole + Owner: Scrin + Location: 108,5 + Nod_NW1: waypoint + Owner: Neutral + Location: 108,5 + Actor3388: brik + Owner: Neutral + Location: 119,5 + Actor3389: brik + Owner: Neutral + Location: 120,5 + Actor3390: brik + Owner: Neutral + Location: 121,5 + Actor3391: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 124,5 + Actor3392: s1 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 124,5 + Actor3393: brik + Owner: Neutral + Location: 132,5 + Actor3394: brik + Owner: Neutral + Location: 145,5 + Actor3395: brik + Owner: Neutral + Location: 146,5 + Actor3396: brik + Owner: Neutral + Location: 147,5 + Actor3397: brik + Owner: Neutral + Location: 148,5 + Actor3398: brik + Owner: Neutral + Location: 149,5 + Actor3399: brik + Owner: Neutral + Location: 150,5 + Actor3400: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 154,5 + Actor3401: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 155,5 + Actor3402: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 175,5 + Actor3403: gscr + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 180,5 + Actor3404: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 192,5 + Actor3405: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 194,5 + Actor3406: brik + Owner: Neutral + Location: 111,6 + Actor3407: brik + Owner: Neutral + Location: 112,6 + Actor3408: brik + Owner: Neutral + Location: 126,6 + Actor3409: brik + Owner: Neutral + Location: 127,6 + Actor3410: brik + Owner: Neutral + Location: 128,6 + Actor3411: brik + Owner: Neutral + Location: 132,6 + Actor3412: brik + Owner: Neutral + Location: 150,6 + Actor3413: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 153,6 + Actor3414: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 155,6 + Actor3415: brik + Owner: Neutral + Location: 164,6 + Actor3416: brik + Owner: Neutral + Location: 165,6 + Actor3417: brik + Owner: Neutral + Location: 166,6 + Actor3418: brik + Owner: Neutral + Location: 167,6 + Actor3419: brik + Owner: Neutral + Location: 172,6 + Actor3420: brik + Owner: Neutral + Location: 173,6 + Actor3421: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 180,6 + Actor3422: brik + Owner: Neutral + Location: 188,6 + Actor3423: brik + Owner: Neutral + Location: 189,6 + Actor3424: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 192,6 + Actor3425: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 196,6 + Actor3426: brik + Owner: Neutral + Location: 111,7 + Actor3427: brik + Owner: Neutral + Location: 112,7 + Actor3428: gunw + Owner: Scrin + Facing: 491 + Location: 116,7 + Actor3429: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 124,7 + Actor3430: s1 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 124,7 + Actor3431: brik + Owner: Neutral + Location: 126,7 + Actor3432: brik + Owner: Neutral + Location: 128,7 + Actor3433: brik + Owner: Neutral + Location: 132,7 + Actor3434: brik + Owner: Neutral + Location: 133,7 + Actor3435: brik + Owner: Neutral + Location: 134,7 + Actor3436: brik + Owner: Neutral + Location: 135,7 + Actor3437: brik + Owner: Neutral + Location: 136,7 + Actor3438: brik + Owner: Neutral + Location: 137,7 + Actor3439: brik + Owner: Neutral + Location: 138,7 + Actor3440: brik + Owner: Neutral + Location: 139,7 + Actor3441: brik + Owner: Neutral + Location: 150,7 + Actor3442: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 154,7 + Actor3443: brik + Owner: Neutral + Location: 156,7 + Actor3444: brik + Owner: Neutral + Location: 157,7 + Actor3445: brik + Owner: Neutral + Location: 158,7 + Actor3446: brik + Owner: Neutral + Location: 159,7 + Actor3447: brik + Owner: Neutral + Location: 160,7 + Actor3448: brik + Owner: Neutral + Location: 161,7 + Actor3449: brik + Owner: Neutral + Location: 162,7 + Actor3450: brik + Owner: Neutral + Location: 163,7 + Actor3451: brik + Owner: Neutral + Location: 164,7 + Actor3452: brik + Owner: Neutral + Location: 167,7 + Actor3453: brik + Owner: Neutral + Location: 172,7 + Actor3454: brik + Owner: Neutral + Location: 173,7 + Actor3455: brik + Owner: Neutral + Location: 178,7 + Actor3456: brik + Owner: Neutral + Location: 179,7 + Actor3457: brik + Owner: Neutral + Location: 180,7 + Actor3458: brik + Owner: Neutral + Location: 181,7 + Actor3459: s2 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 185,7 + Actor3460: brik + Owner: Neutral + Location: 188,7 + Actor3461: brik + Owner: Neutral + Location: 189,7 + Actor3462: ptur + Owner: Scrin + TurretFacing: 840 + Location: 108,8 + Actor3463: brik + Owner: Neutral + Location: 111,8 + Actor3464: brik + Owner: Neutral + Location: 112,8 + Actor3465: brik + Owner: Neutral + Location: 126,8 + Actor3466: brik + Owner: Neutral + Location: 128,8 + Actor3467: brik + Owner: Neutral + Location: 139,8 + Actor3468: brik + Owner: Neutral + Location: 150,8 + Actor3469: brik + Owner: Neutral + Location: 156,8 + Actor3470: brik + Owner: Neutral + Location: 167,8 + Actor3471: brik + Owner: Neutral + Location: 172,8 + Actor3472: brik + Owner: Neutral + Location: 173,8 + Actor3473: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 175,8 + Actor3474: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 177,8 + Actor3475: brik + Owner: Neutral + Location: 178,8 + Actor3476: brik + Owner: Neutral + Location: 181,8 + Actor3477: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 185,8 + Actor3478: s2 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 185,8 + Actor3479: brik + Owner: Neutral + Location: 188,8 + Actor3480: brik + Owner: Neutral + Location: 189,8 + Actor3481: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 191,8 + Actor3482: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 193,8 + Nod_WormholeNE: wormhole + Owner: Scrin + Location: 195,8 + Nod_NE1: waypoint + Owner: Neutral + Location: 195,8 + Actor3485: brik + Owner: Neutral + Location: 111,9 + Actor3486: brik + Owner: Neutral + Location: 112,9 + Actor3487: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 121,9 + Actor3488: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 122,9 + Actor3489: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 123,9 + Actor3490: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 124,9 + Actor3491: brik + Owner: Neutral + Location: 126,9 + Actor3492: brik + Owner: Neutral + Location: 128,9 + Actor3493: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 131,9 + Actor3494: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 132,9 + Actor3495: brik + Owner: Neutral + Location: 139,9 + Actor3496: brik + Owner: Neutral + Location: 150,9 + Actor3497: brik + Owner: Neutral + Location: 156,9 + Actor3498: brik + Owner: Neutral + Location: 167,9 + Actor3499: brik + Owner: Neutral + Location: 172,9 + Actor3500: brik + Owner: Neutral + Location: 173,9 + Actor3501: brik + Owner: Neutral + Location: 178,9 + Actor3502: brik + Owner: Neutral + Location: 181,9 + Actor3503: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 185,9 + Actor3504: brik + Owner: Neutral + Location: 188,9 + Actor3505: brik + Owner: Neutral + Location: 189,9 + Actor3506: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 197,9 + Actor3507: gunw + Owner: Scrin + Facing: 459 + Location: 108,10 + Actor3508: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 123,10 + Actor3509: brik + Owner: Neutral + Location: 126,10 + Actor3510: brik + Owner: Neutral + Location: 128,10 + Actor3511: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 135,10 + Actor3512: brik + Owner: Neutral + Location: 139,10 + Actor3513: brik + Owner: Neutral + Location: 156,10 + Actor3514: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 170,10 + Actor3515: brik + Owner: Neutral + Location: 178,10 + Actor3516: brik + Owner: Neutral + Location: 181,10 + Actor3517: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 111,11 + Actor3518: brik + Owner: Neutral + Location: 119,11 + Actor3519: brik + Owner: Neutral + Location: 120,11 + Actor3520: brik + Owner: Neutral + Location: 121,11 + Actor3521: brik + Owner: Neutral + Location: 126,11 + Actor3522: brik + Owner: Neutral + Location: 128,11 + Actor3523: brik + Owner: Neutral + Location: 132,11 + Actor3524: brik + Owner: Neutral + Location: 133,11 + Actor3525: brik + Owner: Neutral + Location: 134,11 + Actor3526: brik + Owner: Neutral + Location: 135,11 + Actor3527: brik + Owner: Neutral + Location: 139,11 + Actor3528: brik + Owner: Neutral + Location: 156,11 + Actor3529: brik + Owner: Neutral + Location: 156,11 + Actor3530: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 175,11 + Actor3531: brik + Owner: Neutral + Location: 178,11 + Actor3532: brik + Owner: Neutral + Location: 178,11 + Actor3533: brik + Owner: Neutral + Location: 181,11 + Actor3534: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 193,11 + Actor3535: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 112,12 + Actor3536: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 113,12 + Actor3537: brik + Owner: Neutral + Location: 119,12 + Actor3538: brik + Owner: Neutral + Location: 121,12 + Actor3539: brik + Owner: Neutral + Location: 126,12 + Actor3540: brik + Owner: Neutral + Location: 128,12 + Actor3541: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 130,12 + Actor3542: brik + Owner: Neutral + Location: 132,12 + Actor3543: brik + Owner: Neutral + Location: 135,12 + Actor3544: brik + Owner: Neutral + Location: 139,12 + Actor3545: brik + Owner: Neutral + Location: 156,12 + Actor3546: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 171,12 + Actor3547: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 172,12 + Actor3548: brik + Owner: Neutral + Location: 178,12 + Actor3549: brik + Owner: Neutral + Location: 181,12 + Actor3550: corr + Owner: Scrin + Facing: 214 + Location: 189,12 + Actor3551: brik + Owner: Neutral + Location: 104,13 + Actor3552: s4 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 113,13 + Actor3553: ptur + Owner: Scrin + TurretFacing: 142 + Location: 116,13 + Actor3554: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 117,13 + Actor3555: brik + Owner: Neutral + Location: 119,13 + Actor3556: brik + Owner: Neutral + Location: 121,13 + Actor3557: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 124,13 + Actor3558: brik + Owner: Neutral + Location: 126,13 + Actor3559: brik + Owner: Neutral + Location: 127,13 + Actor3560: brik + Owner: Neutral + Location: 128,13 + Actor3561: brik + Owner: Neutral + Location: 132,13 + Actor3562: brik + Owner: Neutral + Location: 135,13 + Actor3563: brik + Owner: Neutral + Location: 139,13 + Actor3564: brik + Owner: Neutral + Location: 140,13 + Actor3565: brik + Owner: Neutral + Location: 141,13 + Actor3566: brik + Owner: Neutral + Location: 142,13 + Actor3567: brik + Owner: Neutral + Location: 143,13 + Actor3568: brik + Owner: Neutral + Location: 144,13 + Actor3569: brik + Owner: Neutral + Location: 145,13 + Actor3570: brik + Owner: Neutral + Location: 146,13 + Actor3571: brik + Owner: Neutral + Location: 156,13 + Actor3572: brik + Owner: Neutral + Location: 178,13 + Actor3573: brik + Owner: Neutral + Location: 181,13 + Actor3574: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 195,13 + Actor3575: brik + Owner: Neutral + Location: 104,14 + Actor3576: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 116,14 + Actor3577: brik + Owner: Neutral + Location: 119,14 + Actor3578: brik + Owner: Neutral + Location: 121,14 + Actor3579: brik + Owner: Neutral + Location: 132,14 + Actor3580: brik + Owner: Neutral + Location: 135,14 + Actor3581: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 153,14 + Actor3582: brik + Owner: Neutral + Location: 156,14 + Actor3583: brik + Owner: Neutral + Location: 181,14 + Actor3584: brik + Owner: Neutral + Location: 104,15 + Actor3585: brik + Owner: Neutral + Location: 105,15 + Actor3586: brik + Owner: Neutral + Location: 106,15 + Actor3587: brik + Owner: Neutral + Location: 109,15 + Actor3588: brik + Owner: Neutral + Location: 110,15 + Actor3589: brik + Owner: Neutral + Location: 111,15 + Actor3590: brik + Owner: Neutral + Location: 112,15 + Actor3591: brik + Owner: Neutral + Location: 113,15 + Actor3592: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 116,15 + Actor3593: brik + Owner: Neutral + Location: 119,15 + Actor3594: brik + Owner: Neutral + Location: 121,15 + Actor3595: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 125,15 + Actor3596: brik + Owner: Neutral + Location: 132,15 + Actor3597: brik + Owner: Neutral + Location: 135,15 + Actor3598: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 138,15 + Actor3599: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 139,15 + Actor3600: brik + Owner: Neutral + Location: 156,15 + Actor3601: brik + Owner: Neutral + Location: 189,15 + Actor3602: brik + Owner: Neutral + Location: 190,15 + Actor3603: brik + Owner: Neutral + Location: 191,15 + Actor3604: brik + Owner: Neutral + Location: 192,15 + Actor3605: brik + Owner: Neutral + Location: 106,16 + Actor3606: brik + Owner: Neutral + Location: 109,16 + Actor3607: brik + Owner: Neutral + Location: 113,16 + Actor3608: brik + Owner: Neutral + Location: 119,16 + Actor3609: brik + Owner: Neutral + Location: 121,16 + Actor3610: brik + Owner: Neutral + Location: 132,16 + Actor3611: brik + Owner: Neutral + Location: 135,16 + Actor3612: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 153,16 + Actor3613: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 154,16 + Actor3614: s1 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 154,16 + Actor3615: brik + Owner: Neutral + Location: 156,16 + Actor3616: brik + Owner: Neutral + Location: 157,16 + Actor3617: brik + Owner: Neutral + Location: 158,16 + Actor3618: brik + Owner: Neutral + Location: 159,16 + Actor3619: brik + Owner: Neutral + Location: 160,16 + Actor3620: brik + Owner: Neutral + Location: 161,16 + Actor3621: brik + Owner: Neutral + Location: 162,16 + Actor3622: brik + Owner: Neutral + Location: 192,16 + Actor3623: brik + Owner: Neutral + Location: 106,17 + Actor3624: brik + Owner: Neutral + Location: 109,17 + Actor3625: brik + Owner: Neutral + Location: 113,17 + Actor3626: brik + Owner: Neutral + Location: 119,17 + Actor3627: brik + Owner: Neutral + Location: 121,17 + Actor3628: brik + Owner: Neutral + Location: 132,17 + Actor3629: brik + Owner: Neutral + Location: 135,17 + Actor3630: brik + Owner: Neutral + Location: 139,17 + Actor3631: brik + Owner: Neutral + Location: 140,17 + Actor3632: brik + Owner: Neutral + Location: 141,17 + Actor3633: brik + Owner: Neutral + Location: 142,17 + Actor3634: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 152,17 + Actor3635: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 153,17 + Actor3636: brik + Owner: Neutral + Location: 192,17 + Actor3637: ruin + Owner: Scrin + Facing: 237 + Location: 195,17 + Actor3638: ruin + Owner: Scrin + Facing: 126 + Location: 197,17 + Actor3639: brik + Owner: Neutral + Location: 104,18 + Actor3640: brik + Owner: Neutral + Location: 105,18 + Actor3641: brik + Owner: Neutral + Location: 106,18 + Actor3642: brik + Owner: Neutral + Location: 109,18 + Actor3643: brik + Owner: Neutral + Location: 110,18 + Actor3644: brik + Owner: Neutral + Location: 111,18 + Actor3645: brik + Owner: Neutral + Location: 113,18 + Actor3646: brik + Owner: Neutral + Location: 114,18 + Actor3647: brik + Owner: Neutral + Location: 115,18 + Actor3648: brik + Owner: Neutral + Location: 116,18 + Actor3649: brik + Owner: Neutral + Location: 117,18 + Actor3650: brik + Owner: Neutral + Location: 118,18 + Actor3651: brik + Owner: Neutral + Location: 119,18 + Actor3652: brik + Owner: Neutral + Location: 121,18 + Actor3653: brik + Owner: Neutral + Location: 124,18 + Actor3654: brik + Owner: Neutral + Location: 125,18 + Actor3655: brik + Owner: Neutral + Location: 126,18 + Actor3656: brik + Owner: Neutral + Location: 127,18 + Actor3657: brik + Owner: Neutral + Location: 128,18 + Actor3658: brik + Owner: Neutral + Location: 129,18 + Actor3659: brik + Owner: Neutral + Location: 130,18 + Actor3660: brik + Owner: Neutral + Location: 131,18 + Actor3661: brik + Owner: Neutral + Location: 132,18 + Actor3662: brik + Owner: Neutral + Location: 135,18 + Actor3663: brik + Owner: Neutral + Location: 136,18 + Actor3664: brik + Owner: Neutral + Location: 137,18 + Actor3665: brik + Owner: Neutral + Location: 138,18 + Actor3666: brik + Owner: Neutral + Location: 139,18 + Actor3667: brik + Owner: Neutral + Location: 142,18 + Actor3668: brik + Owner: Neutral + Location: 146,18 + Actor3669: brik + Owner: Neutral + Location: 192,18 + Actor3670: brik + Owner: Neutral + Location: 111,19 + Actor3671: brik + Owner: Neutral + Location: 121,19 + Actor3672: brik + Owner: Neutral + Location: 124,19 + Actor3673: brik + Owner: Neutral + Location: 142,19 + Actor3674: brik + Owner: Neutral + Location: 146,19 + Actor3675: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 163,19 + Actor3676: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 107,20 + Actor3677: brik + Owner: Neutral + Location: 111,20 + Actor3678: brik + Owner: Neutral + Location: 121,20 + Actor3679: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 123,20 + Actor3680: brik + Owner: Neutral + Location: 124,20 + Actor3681: brik + Owner: Neutral + Location: 142,20 + Actor3682: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 144,20 + Actor3683: brik + Owner: Neutral + Location: 146,20 + Actor3684: brik + Owner: Neutral + Location: 153,20 + Actor3685: brik + Owner: Neutral + Location: 154,20 + Actor3686: brik + Owner: Neutral + Location: 155,20 + Actor3687: brik + Owner: Neutral + Location: 156,20 + Actor3688: brik + Owner: Neutral + Location: 157,20 + Actor3689: brik + Owner: Neutral + Location: 158,20 + Actor3690: brik + Owner: Neutral + Location: 159,20 + Actor3691: brik + Owner: Neutral + Location: 160,20 + Actor3692: brik + Owner: Neutral + Location: 161,20 + Actor3693: brik + Owner: Neutral + Location: 165,20 + Actor3694: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 108,21 + Actor3695: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 109,21 + Actor3696: brik + Owner: Neutral + Location: 111,21 + Actor3697: brik + Owner: Neutral + Location: 112,21 + Actor3698: brik + Owner: Neutral + Location: 113,21 + Actor3699: brik + Owner: Neutral + Location: 114,21 + Actor3700: brik + Owner: Neutral + Location: 115,21 + Actor3701: brik + Owner: Neutral + Location: 116,21 + Actor3702: brik + Owner: Neutral + Location: 117,21 + Actor3703: brik + Owner: Neutral + Location: 142,21 + Actor3704: brik + Owner: Neutral + Location: 146,21 + Actor3705: brik + Owner: Neutral + Location: 161,21 + Actor3706: brik + Owner: Neutral + Location: 165,21 + Actor3707: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 107,22 + Actor3708: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 108,22 + Actor3709: brik + Owner: Neutral + Location: 117,22 + Actor3710: brik + Owner: Neutral + Location: 142,22 + Actor3711: brik + Owner: Neutral + Location: 146,22 + Actor3712: brik + Owner: Neutral + Location: 161,22 + Actor3713: brik + Owner: Neutral + Location: 165,22 + Actor3714: brik + Owner: Neutral + Location: 167,22 + Actor3715: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 108,23 + Nod_NW2: waypoint + Owner: Neutral + Location: 109,23 + Actor3717: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 115,23 + Actor3718: brik + Owner: Neutral + Location: 117,23 + Actor3719: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 122,23 + Actor3720: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 132,23 + Actor3721: brik + Owner: Neutral + Location: 142,23 + Actor3722: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 144,23 + Actor3723: s1 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 144,23 + Actor3724: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 145,23 + Actor3725: brik + Owner: Neutral + Location: 146,23 + Actor3726: brik + Owner: Neutral + Location: 161,23 + Actor3727: brik + Owner: Neutral + Location: 165,23 + Actor3728: brik + Owner: Neutral + Location: 167,23 + Actor3729: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 106,24 + Actor3730: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 107,24 + Actor3731: brik + Owner: Neutral + Location: 117,24 + Actor3732: gunw + Owner: Scrin + Facing: 658 + Location: 130,24 + Actor3733: brik + Owner: Neutral + Location: 135,24 + Actor3734: brik + Owner: Neutral + Location: 138,24 + Actor3735: brik + Owner: Neutral + Location: 139,24 + Actor3736: brik + Owner: Neutral + Location: 140,24 + Actor3737: brik + Owner: Neutral + Location: 141,24 + Actor3738: brik + Owner: Neutral + Location: 142,24 + Actor3739: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 144,24 + Actor3740: brik + Owner: Neutral + Location: 146,24 + Actor3741: brik + Owner: Neutral + Location: 147,24 + Actor3742: brik + Owner: Neutral + Location: 148,24 + Actor3743: brik + Owner: Neutral + Location: 149,24 + Actor3744: brik + Owner: Neutral + Location: 150,24 + Actor3745: brik + Owner: Neutral + Location: 151,24 + Actor3746: brik + Owner: Neutral + Location: 152,24 + Actor3747: brik + Owner: Neutral + Location: 161,24 + Actor3748: brik + Owner: Neutral + Location: 165,24 + Actor3749: brik + Owner: Neutral + Location: 167,24 + Actor3750: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 170,24 + Actor3751: brik + Owner: Neutral + Location: 110,25 + Actor3752: brik + Owner: Neutral + Location: 111,25 + Actor3753: brik + Owner: Neutral + Location: 112,25 + Actor3754: brik + Owner: Neutral + Location: 113,25 + Actor3755: brik + Owner: Neutral + Location: 117,25 + Actor3756: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 123,25 + Actor3757: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 132,25 + Actor3758: brik + Owner: Neutral + Location: 135,25 + Actor3759: brik + Owner: Neutral + Location: 138,25 + Actor3760: brik + Owner: Neutral + Location: 161,25 + Actor3761: brik + Owner: Neutral + Location: 165,25 + Actor3762: brik + Owner: Neutral + Location: 167,25 + Actor3763: gscr + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 172,25 + Actor3764: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 173,25 + Actor3765: s3 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 173,25 + Actor3766: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 176,25 + Actor3767: brik + Owner: Neutral + Location: 181,25 + Actor3768: brik + Owner: Neutral + Location: 110,26 + Actor3769: brik + Owner: Neutral + Location: 113,26 + Actor3770: brik + Owner: Neutral + Location: 117,26 + Actor3771: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 122,26 + Actor3772: brik + Owner: Neutral + Location: 135,26 + Actor3773: brik + Owner: Neutral + Location: 138,26 + Actor3774: brik + Owner: Neutral + Location: 161,26 + Actor3775: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 163,26 + Actor3776: brik + Owner: Neutral + Location: 165,26 + Actor3777: brik + Owner: Neutral + Location: 167,26 + Actor3778: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 173,26 + Actor3779: brik + Owner: Neutral + Location: 181,26 + Actor3780: brik + Owner: Neutral + Location: 110,27 + Actor3781: brik + Owner: Neutral + Location: 113,27 + Actor3782: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 115,27 + Actor3783: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 122,27 + Actor3784: brik + Owner: Neutral + Location: 135,27 + Actor3785: brik + Owner: Neutral + Location: 136,27 + Actor3786: brik + Owner: Neutral + Location: 137,27 + Actor3787: brik + Owner: Neutral + Location: 138,27 + Actor3788: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 147,27 + Actor3789: brik + Owner: Neutral + Location: 161,27 + Actor3790: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 164,27 + Actor3791: brik + Owner: Neutral + Location: 165,27 + Actor3792: brik + Owner: Neutral + Location: 167,27 + Actor3793: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 175,27 + Actor3794: brik + Owner: Neutral + Location: 181,27 + Actor3795: brik + Owner: Neutral + Location: 106,28 + Actor3796: brik + Owner: Neutral + Location: 107,28 + Actor3797: brik + Owner: Neutral + Location: 108,28 + Actor3798: brik + Owner: Neutral + Location: 109,28 + Actor3799: brik + Owner: Neutral + Location: 110,28 + Actor3800: brik + Owner: Neutral + Location: 113,28 + Actor3801: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 122,28 + Actor3802: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 149,28 + Actor3803: brik + Owner: Neutral + Location: 161,28 + Actor3804: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 163,28 + Actor3805: s3 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 163,28 + Actor3806: s3 + Owner: Scrin + Facing: 384 + SubCell: 2 + Location: 163,28 + Actor3807: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 164,28 + Actor3808: brik + Owner: Neutral + Location: 165,28 + Actor3809: brik + Owner: Neutral + Location: 167,28 + Actor3810: brik + Owner: Neutral + Location: 178,28 + Actor3811: brik + Owner: Neutral + Location: 181,28 + Actor3812: brik + Owner: Neutral + Location: 113,29 + Actor3813: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 115,29 + Actor3814: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 142,29 + Actor3815: ptur + Owner: Scrin + TurretFacing: 118 + Location: 145,29 + Actor3816: brik + Owner: Neutral + Location: 161,29 + Actor3817: brik + Owner: Neutral + Location: 165,29 + Actor3818: brik + Owner: Neutral + Location: 167,29 + Actor3819: brik + Owner: Neutral + Location: 170,29 + Actor3820: brik + Owner: Neutral + Location: 171,29 + Actor3821: brik + Owner: Neutral + Location: 172,29 + Actor3822: brik + Owner: Neutral + Location: 173,29 + Actor3823: brik + Owner: Neutral + Location: 174,29 + Actor3824: brik + Owner: Neutral + Location: 178,29 + Actor3825: brik + Owner: Neutral + Location: 181,29 + Actor3826: brik + Owner: Neutral + Location: 113,30 + Actor3827: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 115,30 + Actor3828: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 116,30 + Actor3829: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 122,30 + Actor3830: brik + Owner: Neutral + Location: 135,30 + Actor3831: brik + Owner: Neutral + Location: 136,30 + Actor3832: brik + Owner: Neutral + Location: 137,30 + Actor3833: brik + Owner: Neutral + Location: 138,30 + Actor3834: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 149,30 + Actor3835: brik + Owner: Neutral + Location: 156,30 + Actor3836: brik + Owner: Neutral + Location: 157,30 + Actor3837: brik + Owner: Neutral + Location: 158,30 + Actor3838: brik + Owner: Neutral + Location: 159,30 + Actor3839: brik + Owner: Neutral + Location: 160,30 + Actor3840: brik + Owner: Neutral + Location: 161,30 + Actor3841: brik + Owner: Neutral + Location: 165,30 + Actor3842: brik + Owner: Neutral + Location: 166,30 + Actor3843: brik + Owner: Neutral + Location: 167,30 + Actor3844: brik + Owner: Neutral + Location: 170,30 + Actor3845: brik + Owner: Neutral + Location: 172,30 + Actor3846: brik + Owner: Neutral + Location: 173,30 + Actor3847: brik + Owner: Neutral + Location: 174,30 + Actor3848: brik + Owner: Neutral + Location: 178,30 + Actor3849: brik + Owner: Neutral + Location: 179,30 + Actor3850: brik + Owner: Neutral + Location: 180,30 + Actor3851: brik + Owner: Neutral + Location: 181,30 + Actor3852: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 188,30 + Actor3853: brik + Owner: Neutral + Location: 113,31 + Actor3854: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 116,31 + Actor3855: brik + Owner: Neutral + Location: 135,31 + Actor3856: brik + Owner: Neutral + Location: 138,31 + Actor3857: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 142,31 + Actor3858: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 147,31 + Actor3859: brik + Owner: Neutral + Location: 152,31 + Actor3860: brik + Owner: Neutral + Location: 156,31 + Actor3861: brik + Owner: Neutral + Location: 170,31 + Actor3862: brik + Owner: Neutral + Location: 172,31 + Actor3863: brik + Owner: Neutral + Location: 113,32 + Actor3864: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 115,32 + Actor3865: brik + Owner: Neutral + Location: 135,32 + Actor3866: brik + Owner: Neutral + Location: 138,32 + Actor3867: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 144,32 + Actor3868: brik + Owner: Neutral + Location: 152,32 + Actor3869: brik + Owner: Neutral + Location: 156,32 + Actor3870: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 159,32 + Actor3871: brik + Owner: Neutral + Location: 170,32 + Actor3872: brik + Owner: Neutral + Location: 172,32 + Actor3873: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 183,32 + Actor3874: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 185,32 + Actor3875: brik + Owner: Neutral + Location: 113,33 + Actor3879: brik + Owner: Neutral + Location: 131,33 + Actor3880: brik + Owner: Neutral + Location: 132,33 + Actor3881: brik + Owner: Neutral + Location: 133,33 + Actor3882: brik + Owner: Neutral + Location: 134,33 + Actor3883: brik + Owner: Neutral + Location: 135,33 + Actor3884: brik + Owner: Neutral + Location: 138,33 + Actor3885: brik + Owner: Neutral + Location: 152,33 + Actor3886: brik + Owner: Neutral + Location: 156,33 + Actor3887: corr + Owner: Scrin + Facing: 384 + Location: 161,33 + Nod_NE3: waypoint + Owner: Neutral + Location: 164,33 + Actor3889: brik + Owner: Neutral + Location: 170,33 + Actor3890: brik + Owner: Neutral + Location: 172,33 + Actor3891: s4 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 184,33 + Actor3892: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 185,33 + Actor3893: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 190,33 + Actor3894: brik + Owner: Neutral + Location: 113,34 + Actor3895: brik + Owner: Neutral + Location: 127,34 + Actor3896: brik + Owner: Neutral + Location: 131,34 + Actor3897: brik + Owner: Neutral + Location: 138,34 + Actor3898: brik + Owner: Neutral + Location: 139,34 + Actor3899: brik + Owner: Neutral + Location: 140,34 + Actor3900: brik + Owner: Neutral + Location: 141,34 + Actor3901: brik + Owner: Neutral + Location: 142,34 + Actor3902: brik + Owner: Neutral + Location: 152,34 + Actor3903: brik + Owner: Neutral + Location: 156,34 + Actor3904: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 162,34 + Actor3905: s1 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 162,34 + Actor3906: brik + Owner: Neutral + Location: 170,34 + Actor3907: brik + Owner: Neutral + Location: 172,34 + Nod_SE2: waypoint + Owner: Neutral + Location: 179,34 + Actor3909: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 182,34 + Actor3910: ruin + Owner: Scrin + Facing: 384 + Location: 187,34 + Actor3911: brik + Owner: Neutral + Location: 106,35 + Actor3912: brik + Owner: Neutral + Location: 107,35 + Actor3913: brik + Owner: Neutral + Location: 108,35 + Actor3914: brik + Owner: Neutral + Location: 109,35 + Actor3915: brik + Owner: Neutral + Location: 110,35 + Actor3916: brik + Owner: Neutral + Location: 111,35 + Actor3917: brik + Owner: Neutral + Location: 112,35 + Actor3918: brik + Owner: Neutral + Location: 113,35 + Actor3919: brik + Owner: Neutral + Location: 127,35 + Actor3922: brik + Owner: Neutral + Location: 131,35 + Actor3923: brik + Owner: Neutral + Location: 142,35 + Actor3924: brik + Owner: Neutral + Location: 152,35 + Actor3925: brik + Owner: Neutral + Location: 156,35 + Actor3926: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 165,35 + Actor3927: brik + Owner: Neutral + Location: 170,35 + Actor3928: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 182,35 + Actor3929: ruin + Owner: Scrin + Facing: 384 + Location: 184,35 + Actor3930: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 189,35 + Actor3931: brik + Owner: Neutral + Location: 124,36 + Actor3932: brik + Owner: Neutral + Location: 127,36 + Actor3933: brik + Owner: Neutral + Location: 128,36 + Actor3934: brik + Owner: Neutral + Location: 129,36 + Actor3935: brik + Owner: Neutral + Location: 130,36 + Actor3936: brik + Owner: Neutral + Location: 131,36 + Actor3937: brik + Owner: Neutral + Location: 142,36 + Actor3938: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 146,36 + Actor3939: brik + Owner: Neutral + Location: 152,36 + Actor3940: brik + Owner: Neutral + Location: 156,36 + Actor3941: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 167,36 + Actor3942: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 186,36 + Actor3943: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 189,36 + Actor3944: brik + Owner: Neutral + Location: 124,37 + Actor3945: brik + Owner: Neutral + Location: 134,37 + Actor3946: brik + Owner: Neutral + Location: 135,37 + Actor3947: brik + Owner: Neutral + Location: 136,37 + Actor3948: brik + Owner: Neutral + Location: 137,37 + Actor3949: brik + Owner: Neutral + Location: 138,37 + Actor3950: brik + Owner: Neutral + Location: 139,37 + Actor3951: brik + Owner: Neutral + Location: 140,37 + Actor3952: brik + Owner: Neutral + Location: 141,37 + Actor3953: brik + Owner: Neutral + Location: 142,37 + Actor3954: brik + Owner: Neutral + Location: 152,37 + Actor3955: brik + Owner: Neutral + Location: 153,37 + Actor3956: brik + Owner: Neutral + Location: 154,37 + Actor3957: brik + Owner: Neutral + Location: 155,37 + Actor3958: brik + Owner: Neutral + Location: 156,37 + Actor3959: corr + Owner: Scrin + Facing: 384 + Location: 164,37 + Actor3960: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 183,37 + Actor3961: brik + Owner: Neutral + Location: 190,37 + Actor3962: brik + Owner: Neutral + Location: 191,37 + Actor3963: brik + Owner: Neutral + Location: 192,37 + Actor3964: brik + Owner: Neutral + Location: 193,37 + Actor3965: brik + Owner: Neutral + Location: 194,37 + Actor3966: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 107,38 + Actor3967: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 111,38 + Actor3968: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 112,38 + Actor3969: brik + Owner: Neutral + Location: 124,38 + Actor3970: brik + Owner: Neutral + Location: 134,38 + Actor3971: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 147,38 + Actor3972: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 148,38 + Actor3973: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 185,38 + Actor3974: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 188,38 + Actor3975: brik + Owner: Neutral + Location: 190,38 + Actor3976: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 109,39 + Actor3977: s1 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 109,39 + Actor3978: lchr + Owner: Scrin + Facing: 483 + Location: 111,39 + Actor3979: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 113,39 + Actor3980: brik + Owner: Neutral + Location: 124,39 + Actor3981: brik + Owner: Neutral + Location: 134,39 + Actor3982: s4 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 147,39 + Actor3983: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 150,39 + Actor3984: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 166,39 + Actor3985: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 174,39 + Actor3986: brik + Owner: Neutral + Location: 190,39 + Actor3987: brik + Owner: Neutral + Location: 193,39 + Actor3988: brik + Owner: Neutral + Location: 193,39 + Actor3989: brik + Owner: Neutral + Location: 194,39 + Actor3990: brik + Owner: Neutral + Location: 195,39 + Actor3991: brik + Owner: Neutral + Location: 196,39 + Nod_NW3: waypoint + Owner: Neutral + Location: 113,40 + Actor3993: brik + Owner: Neutral + Location: 124,40 + Actor3994: brik + Owner: Neutral + Location: 125,40 + Actor3995: brik + Owner: Neutral + Location: 126,40 + Actor3996: brik + Owner: Neutral + Location: 127,40 + Actor3997: brik + Owner: Neutral + Location: 128,40 + Actor3998: brik + Owner: Neutral + Location: 129,40 + Actor3999: brik + Owner: Neutral + Location: 130,40 + Actor4000: brik + Owner: Neutral + Location: 131,40 + Actor4001: brik + Owner: Neutral + Location: 132,40 + Actor4002: brik + Owner: Neutral + Location: 133,40 + Actor4003: brik + Owner: Neutral + Location: 134,40 + Actor4004: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 149,40 + Actor4005: gscr + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 156,40 + Actor4006: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 168,40 + Actor4007: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 177,40 + Actor4008: brik + Owner: Neutral + Location: 181,40 + Actor4009: brik + Owner: Neutral + Location: 182,40 + Actor4010: brik + Owner: Neutral + Location: 183,40 + Actor4011: brik + Owner: Neutral + Location: 184,40 + Actor4012: brik + Owner: Neutral + Location: 185,40 + Actor4013: brik + Owner: Neutral + Location: 186,40 + Actor4014: brik + Owner: Neutral + Location: 190,40 + Actor4015: brik + Owner: Neutral + Location: 193,40 + Actor4016: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 106,41 + Actor4017: brik + Owner: Neutral + Location: 117,41 + Actor4018: brik + Owner: Neutral + Location: 139,41 + Actor4019: brik + Owner: Neutral + Location: 140,41 + Actor4020: brik + Owner: Neutral + Location: 141,41 + Actor4021: brik + Owner: Neutral + Location: 142,41 + Actor4022: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 156,41 + Actor4023: corr + Owner: Scrin + Facing: 384 + Location: 167,41 + Actor4024: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 178,41 + Actor4025: brik + Owner: Neutral + Location: 181,41 + Actor4026: brik + Owner: Neutral + Location: 186,41 + Actor4027: brik + Owner: Neutral + Location: 190,41 + Actor4028: brik + Owner: Neutral + Location: 193,41 + Actor4029: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 108,42 + Actor4030: brik + Owner: Neutral + Location: 117,42 + Actor4031: brik + Owner: Neutral + Location: 139,42 + Actor4032: brik + Owner: Neutral + Location: 142,42 + Nod_NE4: waypoint + Owner: Neutral + Location: 147,42 + Actor4034: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 169,42 + Actor4035: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 174,42 + Actor4036: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 176,42 + Actor4037: brik + Owner: Neutral + Location: 181,42 + Actor4038: brik + Owner: Neutral + Location: 186,42 + Actor4039: brik + Owner: Neutral + Location: 190,42 + Actor4040: brik + Owner: Neutral + Location: 191,42 + Actor4041: brik + Owner: Neutral + Location: 192,42 + Actor4042: brik + Owner: Neutral + Location: 193,42 + Actor4043: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 196,42 + Actor4044: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 197,42 + Actor4045: brik + Owner: Neutral + Location: 117,43 + Actor4046: brik + Owner: Neutral + Location: 124,43 + Actor4047: brik + Owner: Neutral + Location: 125,43 + Actor4048: brik + Owner: Neutral + Location: 126,43 + Actor4049: brik + Owner: Neutral + Location: 127,43 + Actor4050: brik + Owner: Neutral + Location: 128,43 + Actor4051: brik + Owner: Neutral + Location: 129,43 + Actor4052: brik + Owner: Neutral + Location: 130,43 + Actor4053: brik + Owner: Neutral + Location: 131,43 + Actor4054: brik + Owner: Neutral + Location: 132,43 + Actor4055: brik + Owner: Neutral + Location: 133,43 + Actor4056: brik + Owner: Neutral + Location: 134,43 + Actor4057: brik + Owner: Neutral + Location: 139,43 + Actor4058: brik + Owner: Neutral + Location: 140,43 + Actor4059: brik + Owner: Neutral + Location: 141,43 + Actor4060: brik + Owner: Neutral + Location: 142,43 + Actor4061: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 144,43 + Actor4062: brik + Owner: Neutral + Location: 152,43 + Actor4063: brik + Owner: Neutral + Location: 153,43 + Actor4064: brik + Owner: Neutral + Location: 154,43 + Actor4065: brik + Owner: Neutral + Location: 155,43 + Actor4066: brik + Owner: Neutral + Location: 156,43 + Actor4067: ptur + Owner: Scrin + TurretFacing: 880 + Location: 177,43 + Actor4068: brik + Owner: Neutral + Location: 181,43 + Actor4069: brik + Owner: Neutral + Location: 186,43 + Actor4070: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 196,43 + Actor4071: brik + Owner: Neutral + Location: 106,44 + Actor4072: brik + Owner: Neutral + Location: 107,44 + Actor4073: brik + Owner: Neutral + Location: 108,44 + Actor4074: brik + Owner: Neutral + Location: 109,44 + Actor4075: brik + Owner: Neutral + Location: 110,44 + Actor4076: brik + Owner: Neutral + Location: 111,44 + Actor4077: brik + Owner: Neutral + Location: 112,44 + Actor4078: brik + Owner: Neutral + Location: 116,44 + Actor4079: brik + Owner: Neutral + Location: 117,44 + Actor4080: brik + Owner: Neutral + Location: 124,44 + Actor4081: brik + Owner: Neutral + Location: 134,44 + Actor4082: brik + Owner: Neutral + Location: 152,44 + Actor4083: brik + Owner: Neutral + Location: 156,44 + Actor4084: brik + Owner: Neutral + Location: 181,44 + Actor4085: brik + Owner: Neutral + Location: 186,44 + Actor4086: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 191,44 + Actor4087: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 195,44 + Actor4088: gscr + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 196,44 + Actor4089: brik + Owner: Neutral + Location: 112,45 + Actor4090: brik + Owner: Neutral + Location: 116,45 + Actor4091: brik + Owner: Neutral + Location: 124,45 + Actor4092: brik + Owner: Neutral + Location: 134,45 + Actor4093: brik + Owner: Neutral + Location: 152,45 + Actor4094: brik + Owner: Neutral + Location: 156,45 + Actor4095: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 165,45 + Actor4096: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 166,45 + Actor4097: brik + Owner: Neutral + Location: 172,45 + Actor4098: brik + Owner: Neutral + Location: 181,45 + Actor4099: brik + Owner: Neutral + Location: 186,45 + Actor4100: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 190,45 + Actor4101: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 197,45 + Actor4102: brik + Owner: Neutral + Location: 112,46 + Actor4103: brik + Owner: Neutral + Location: 116,46 + Actor4104: brik + Owner: Neutral + Location: 124,46 + Actor4105: brik + Owner: Neutral + Location: 134,46 + Actor4106: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 136,46 + Actor4107: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 143,46 + Actor4108: brik + Owner: Neutral + Location: 145,46 + Actor4109: brik + Owner: Neutral + Location: 146,46 + Actor4110: brik + Owner: Neutral + Location: 147,46 + Actor4111: brik + Owner: Neutral + Location: 148,46 + Actor4112: brik + Owner: Neutral + Location: 152,46 + Actor4113: brik + Owner: Neutral + Location: 156,46 + Actor4114: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 163,46 + Actor4115: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 166,46 + Actor4116: brik + Owner: Neutral + Location: 172,46 + Actor4117: brik + Owner: Neutral + Location: 173,46 + Actor4118: brik + Owner: Neutral + Location: 174,46 + Actor4119: brik + Owner: Neutral + Location: 175,46 + Actor4120: brik + Owner: Neutral + Location: 176,46 + Actor4121: brik + Owner: Neutral + Location: 179,46 + Actor4122: brik + Owner: Neutral + Location: 180,46 + Actor4123: brik + Owner: Neutral + Location: 181,46 + Actor4124: brik + Owner: Neutral + Location: 186,46 + Actor4125: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 188,46 + Actor4126: brik + Owner: Neutral + Location: 190,46 + Actor4127: brik + Owner: Neutral + Location: 191,46 + Actor4128: brik + Owner: Neutral + Location: 192,46 + Actor4129: brik + Owner: Neutral + Location: 193,46 + Actor4130: brik + Owner: Neutral + Location: 112,47 + Actor4131: brik + Owner: Neutral + Location: 116,47 + Actor4132: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 122,47 + Actor4133: brik + Owner: Neutral + Location: 124,47 + Actor4134: brik + Owner: Neutral + Location: 134,47 + Actor4135: brik + Owner: Neutral + Location: 145,47 + Actor4136: brik + Owner: Neutral + Location: 148,47 + Actor4137: brik + Owner: Neutral + Location: 152,47 + Actor4138: brik + Owner: Neutral + Location: 156,47 + Actor4139: s4 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 162,47 + Actor4140: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 164,47 + Actor4141: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 165,47 + Actor4142: brik + Owner: Neutral + Location: 176,47 + Actor4143: brik + Owner: Neutral + Location: 179,47 + Actor4144: brik + Owner: Neutral + Location: 180,47 + Actor4145: brik + Owner: Neutral + Location: 181,47 + Actor4146: brik + Owner: Neutral + Location: 182,47 + Actor4147: brik + Owner: Neutral + Location: 183,47 + Actor4148: brik + Owner: Neutral + Location: 184,47 + Actor4149: brik + Owner: Neutral + Location: 185,47 + Actor4150: brik + Owner: Neutral + Location: 186,47 + Actor4151: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 189,47 + Actor4152: brik + Owner: Neutral + Location: 190,47 + Actor4153: brik + Owner: Neutral + Location: 193,47 + Actor4154: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 197,47 + Actor4155: brik + Owner: Neutral + Location: 112,48 + Actor4156: brik + Owner: Neutral + Location: 116,48 + Actor4157: brik + Owner: Neutral + Location: 124,48 + Actor4158: brik + Owner: Neutral + Location: 134,48 + Actor4159: gunw + Owner: Scrin + Facing: 586 + Location: 139,48 + Actor4160: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 142,48 + Actor4161: s1 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 142,48 + Actor4162: brik + Owner: Neutral + Location: 145,48 + Actor4163: brik + Owner: Neutral + Location: 146,48 + Actor4164: brik + Owner: Neutral + Location: 147,48 + Actor4165: brik + Owner: Neutral + Location: 148,48 + Actor4166: brik + Owner: Neutral + Location: 152,48 + Actor4167: brik + Owner: Neutral + Location: 156,48 + Actor4168: brik + Owner: Neutral + Location: 176,48 + Actor4169: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 178,48 + Actor4170: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 188,48 + Actor4171: s3 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 188,48 + Actor4172: brik + Owner: Neutral + Location: 190,48 + Actor4173: brik + Owner: Neutral + Location: 193,48 + Actor4174: brik + Owner: Neutral + Location: 109,49 + Actor4175: brik + Owner: Neutral + Location: 110,49 + Actor4176: brik + Owner: Neutral + Location: 111,49 + Actor4177: brik + Owner: Neutral + Location: 112,49 + Actor4178: brik + Owner: Neutral + Location: 116,49 + Actor4179: brik + Owner: Neutral + Location: 117,49 + Actor4180: brik + Owner: Neutral + Location: 124,49 + Actor4181: brik + Owner: Neutral + Location: 134,49 + Actor4182: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 137,49 + Actor4183: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 141,49 + Actor4184: brik + Owner: Neutral + Location: 152,49 + Actor4185: brik + Owner: Neutral + Location: 156,49 + Actor4186: brik + Owner: Neutral + Location: 157,49 + Actor4187: brik + Owner: Neutral + Location: 158,49 + Actor4188: brik + Owner: Neutral + Location: 159,49 + Actor4189: brik + Owner: Neutral + Location: 176,49 + Actor4190: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 179,49 + Actor4191: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 188,49 + Actor4192: brik + Owner: Neutral + Location: 190,49 + Actor4193: brik + Owner: Neutral + Location: 193,49 + Actor4194: brik + Owner: Neutral + Location: 194,49 + Actor4195: brik + Owner: Neutral + Location: 195,49 + Actor4196: brik + Owner: Neutral + Location: 196,49 + Actor4197: brik + Owner: Neutral + Location: 117,50 + Actor4198: brik + Owner: Neutral + Location: 118,50 + Actor4199: brik + Owner: Neutral + Location: 119,50 + Actor4200: brik + Owner: Neutral + Location: 120,50 + Actor4201: brik + Owner: Neutral + Location: 121,50 + Actor4202: brik + Owner: Neutral + Location: 124,50 + Actor4203: brik + Owner: Neutral + Location: 134,50 + Actor4204: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 139,50 + Actor4205: s1 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 139,50 + Actor4206: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 141,50 + Actor4207: brik + Owner: Neutral + Location: 152,50 + Actor4208: brik + Owner: Neutral + Location: 176,50 + Actor4209: brik + Owner: Neutral + Location: 177,50 + Actor4210: brik + Owner: Neutral + Location: 185,50 + Actor4211: brik + Owner: Neutral + Location: 186,50 + Actor4212: brik + Owner: Neutral + Location: 190,50 + Actor4213: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 108,51 + Actor4214: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 110,51 + Actor4215: brik + Owner: Neutral + Location: 124,51 + Actor4216: brik + Owner: Neutral + Location: 134,51 + Actor4217: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 149,51 + Actor4218: brik + Owner: Neutral + Location: 152,51 + Actor4219: brik + Owner: Neutral + Location: 186,51 + Actor4220: brik + Owner: Neutral + Location: 190,51 + Actor4221: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 106,52 + Actor4222: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 119,52 + Actor4223: brik + Owner: Neutral + Location: 124,52 + Actor4224: brik + Owner: Neutral + Location: 134,52 + Actor4225: brik + Owner: Neutral + Location: 152,52 + Actor4226: brik + Owner: Neutral + Location: 185,52 + Actor4227: brik + Owner: Neutral + Location: 186,52 + Actor4228: brik + Owner: Neutral + Location: 190,52 + Actor4229: brik + Owner: Neutral + Location: 191,52 + Actor4230: brik + Owner: Neutral + Location: 192,52 + Actor4231: brik + Owner: Neutral + Location: 193,52 + Actor4232: brik + Owner: Neutral + Location: 194,52 + Actor4233: brik + Owner: Neutral + Location: 195,52 + Actor4234: brik + Owner: Neutral + Location: 196,52 + Actor4235: brik + Owner: Neutral + Location: 197,52 + Actor4236: brik + Owner: Neutral + Location: 198,52 + Actor4237: barl + Owner: Creeps + Location: 110,53 + Actor4238: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 120,53 + Actor4239: brik + Owner: Neutral + Location: 134,53 + Actor4240: brik + Owner: Neutral + Location: 135,53 + Actor4241: brik + Owner: Neutral + Location: 139,53 + Actor4242: brik + Owner: Neutral + Location: 140,53 + Actor4243: brik + Owner: Neutral + Location: 141,53 + Actor4244: brik + Owner: Neutral + Location: 142,53 + Actor4245: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 146,53 + Actor4246: brik + Owner: Neutral + Location: 149,53 + Actor4247: brik + Owner: Neutral + Location: 150,53 + Actor4248: brik + Owner: Neutral + Location: 151,53 + Actor4249: brik + Owner: Neutral + Location: 152,53 + Actor4250: s4 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 106,54 + Actor4251: brl3 + Owner: Creeps + Location: 108,54 + Actor4252: brik + Owner: Neutral + Location: 117,54 + Actor4253: brik + Owner: Neutral + Location: 118,54 + Actor4254: brik + Owner: Neutral + Location: 119,54 + Actor4255: brik + Owner: Neutral + Location: 120,54 + Actor4256: brik + Owner: Neutral + Location: 121,54 + Actor4257: brik + Owner: Neutral + Location: 121,54 + Actor4258: brik + Owner: Neutral + Location: 122,54 + Actor4259: brik + Owner: Neutral + Location: 123,54 + Actor4260: brik + Owner: Neutral + Location: 142,54 + Actor4261: barb + Owner: Neutral + Location: 143,54 + Actor4262: barb + Owner: Neutral + Location: 144,54 + Actor4263: barb + Owner: Neutral + Location: 146,54 + Actor4264: barb + Owner: Neutral + Location: 147,54 + Actor4265: barb + Owner: Neutral + Location: 148,54 + Actor4266: brik + Owner: Neutral + Location: 149,54 + Actor4267: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 196,54 + Actor4268: barl + Owner: Creeps + Location: 107,55 + Actor4269: brik + Owner: Neutral + Location: 112,55 + Actor4270: brik + Owner: Neutral + Location: 113,55 + Actor4271: brik + Owner: Neutral + Location: 114,55 + Actor4272: brik + Owner: Neutral + Location: 115,55 + Actor4273: brik + Owner: Neutral + Location: 116,55 + Actor4274: brik + Owner: Neutral + Location: 117,55 + Actor4275: brik + Owner: Neutral + Location: 142,55 + Actor4276: barb + Owner: Neutral + Location: 143,55 + Actor4277: barb + Owner: Neutral + Location: 146,55 + Actor4278: brik + Owner: Neutral + Location: 149,55 + Actor4279: brik + Owner: Neutral + Location: 171,55 + Actor4280: brik + Owner: Neutral + Location: 172,55 + Actor4281: brik + Owner: Neutral + Location: 173,55 + Actor4282: brl3 + Owner: Creeps + Location: 106,56 + Actor4283: brl3 + Owner: Creeps + Location: 108,56 + Nod_NW4: waypoint + Owner: Neutral + Location: 109,56 + Actor4285: brik + Owner: Neutral + Location: 112,56 + Actor4286: brik + Owner: Neutral + Location: 113,56 + Actor4287: brik + Owner: Neutral + Location: 114,56 + Actor4288: brik + Owner: Neutral + Location: 115,56 + Actor4289: brik + Owner: Neutral + Location: 116,56 + Actor4290: brik + Owner: Neutral + Location: 117,56 + Actor4291: brik + Owner: Neutral + Location: 142,56 + Actor4292: barb + Owner: Neutral + Location: 145,56 + Actor4293: barb + Owner: Neutral + Location: 146,56 + Actor4294: brik + Owner: Neutral + Location: 173,56 + Actor4295: brik + Owner: Neutral + Location: 174,56 + Actor4296: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 195,56 + Actor4297: gunw + Owner: Scrin + Facing: 190 + Location: 196,56 + Actor2824: barl + Owner: Creeps + Location: 108,57 + Actor2825: brik + Owner: Neutral + Location: 117,57 + Actor2826: brik + Owner: Neutral + Location: 142,57 + Actor2827: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 145,57 + Actor2828: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 148,57 + Actor2829: gscr + Owner: Scrin + SubCell: 3 + Facing: 769 + Location: 167,57 + Actor2830: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 168,57 + Actor2831: s1 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 168,57 + Actor2832: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 187,57 + Actor2833: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 191,57 + Actor2834: dark + Owner: Scrin + Facing: 150 + Location: 192,57 + Actor2835: brik + Owner: Neutral + Location: 117,58 + Actor2836: brik + Owner: Neutral + Location: 118,58 + Actor2837: brik + Owner: Neutral + Location: 119,58 + Actor2838: brik + Owner: Neutral + Location: 120,58 + Actor2839: brik + Owner: Neutral + Location: 121,58 + Actor2840: brik + Owner: Neutral + Location: 122,58 + Actor2841: brik + Owner: Neutral + Location: 123,58 + Actor2842: brik + Owner: Neutral + Location: 124,58 + Actor2843: brik + Owner: Neutral + Location: 142,58 + Actor2844: barb + Owner: Neutral + Location: 143,58 + Actor2845: barb + Owner: Neutral + Location: 144,58 + Actor2846: barb + Owner: Neutral + Location: 145,58 + Actor2847: barb + Owner: Neutral + Location: 146,58 + Actor2848: barb + Owner: Neutral + Location: 147,58 + Actor2849: brik + Owner: Neutral + Location: 149,58 + Actor2850: gunw + Owner: Scrin + Facing: 729 + Location: 157,58 + Actor2851: gscr + Owner: Scrin + SubCell: 3 + Facing: 769 + Location: 167,58 + Actor2853: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 177,58 + Actor2854: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 189,58 + Actor2855: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 190,58 + Actor2856: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 195,58 + Actor2857: barl + Owner: Creeps + Location: 106,59 + Actor2858: barb + Owner: Neutral + Location: 147,59 + Actor2859: brik + Owner: Neutral + Location: 149,59 + Actor2860: gscr + Owner: Scrin + SubCell: 3 + Facing: 761 + Location: 167,59 + Actor2861: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 169,59 + Actor2862: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 176,59 + Actor2863: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 178,59 + Nod_NE6: waypoint + Owner: Neutral + Location: 179,59 + Actor2865: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 194,59 + Actor2866: brl3 + Owner: Creeps + Location: 107,60 + Actor2867: barb + Owner: Neutral + Location: 145,60 + Actor2868: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 146,60 + Actor2869: s1 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 146,60 + Actor2870: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 148,60 + Actor2871: brik + Owner: Neutral + Location: 149,60 + Actor2872: brik + Owner: Neutral + Location: 158,60 + Actor2873: brik + Owner: Neutral + Location: 159,60 + Actor2874: brik + Owner: Neutral + Location: 160,60 + Actor2875: brik + Owner: Neutral + Location: 161,60 + Actor2876: brik + Owner: Neutral + Location: 162,60 + Actor2877: gscr + Owner: Scrin + SubCell: 3 + Facing: 761 + Location: 167,60 + Actor2879: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 168,60 + Actor2880: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 112,61 + Actor2881: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 123,61 + Actor2882: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 126,61 + Actor2883: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 127,61 + Actor2884: barb + Owner: Neutral + Location: 145,61 + Actor2885: barb + Owner: Neutral + Location: 146,61 + Actor2886: barb + Owner: Neutral + Location: 147,61 + Actor2887: barb + Owner: Neutral + Location: 148,61 + Actor2888: brik + Owner: Neutral + Location: 149,61 + Actor2889: brik + Owner: Neutral + Location: 158,61 + Actor2890: brik + Owner: Neutral + Location: 162,61 + Actor2891: brik + Owner: Neutral + Location: 173,61 + Actor2892: brik + Owner: Neutral + Location: 174,61 + Actor2893: brik + Owner: Neutral + Location: 175,61 + Actor2894: brik + Owner: Neutral + Location: 176,61 + Actor2895: brik + Owner: Neutral + Location: 177,61 + Actor2896: brik + Owner: Neutral + Location: 185,61 + Actor2897: brik + Owner: Neutral + Location: 186,61 + Actor2900: brik + Owner: Neutral + Location: 187,61 + Actor2901: brik + Owner: Neutral + Location: 188,61 + Actor2902: brik + Owner: Neutral + Location: 189,61 + Actor2903: brik + Owner: Neutral + Location: 190,61 + Actor2904: brik + Owner: Neutral + Location: 190,61 + Actor2905: brik + Owner: Neutral + Location: 191,61 + Actor2906: brik + Owner: Neutral + Location: 192,61 + Actor2907: brik + Owner: Neutral + Location: 193,61 + Actor2908: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 112,62 + Actor2910: s1 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 112,62 + Actor2911: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 113,62 + Actor2912: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 114,62 + Actor2913: brik + Owner: Neutral + Location: 117,62 + Actor2915: brik + Owner: Neutral + Location: 118,62 + Actor2916: brik + Owner: Neutral + Location: 119,62 + Actor2917: brik + Owner: Neutral + Location: 120,62 + Actor2918: brik + Owner: Neutral + Location: 121,62 + Actor2919: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 129,62 + Actor2920: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 144,62 + Actor2921: brik + Owner: Neutral + Location: 149,62 + Actor2922: brik + Owner: Neutral + Location: 154,62 + Actor2923: brik + Owner: Neutral + Location: 158,62 + Actor2924: brik + Owner: Neutral + Location: 162,62 + Actor2925: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 168,62 + Actor2926: s1 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 168,62 + Actor2927: brik + Owner: Neutral + Location: 173,62 + Actor2928: brik + Owner: Neutral + Location: 177,62 + Actor2929: brik + Owner: Neutral + Location: 193,62 + Actor2932: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 197,62 + Actor2933: brik + Owner: Neutral + Location: 117,63 + Actor2934: brik + Owner: Neutral + Location: 121,63 + Actor2935: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 125,63 + Actor2936: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 126,63 + Actor2937: s1 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 126,63 + Actor2938: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 127,63 + Actor2939: barb + Owner: Neutral + Location: 143,63 + Actor2940: barb + Owner: Neutral + Location: 144,63 + Actor2941: barb + Owner: Neutral + Location: 147,63 + Actor2942: brik + Owner: Neutral + Location: 149,63 + Actor2943: brik + Owner: Neutral + Location: 154,63 + Actor2944: brik + Owner: Neutral + Location: 158,63 + Actor2945: brik + Owner: Neutral + Location: 162,63 + Actor2948: brik + Owner: Neutral + Location: 173,63 + Actor2949: brik + Owner: Neutral + Location: 177,63 + Actor2950: brik + Owner: Neutral + Location: 193,63 + Actor2951: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 196,63 + Actor2952: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 197,63 + Actor2953: brik + Owner: Neutral + Location: 114,64 + Actor2954: brik + Owner: Neutral + Location: 115,64 + Actor2955: brik + Owner: Neutral + Location: 116,64 + Actor2956: brik + Owner: Neutral + Location: 117,64 + Actor2957: brik + Owner: Neutral + Location: 121,64 + Actor2958: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 127,64 + Actor2959: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 129,64 + Actor2960: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 144,64 + Actor2961: barb + Owner: Neutral + Location: 147,64 + Actor2962: brik + Owner: Neutral + Location: 149,64 + Actor2963: brik + Owner: Neutral + Location: 154,64 + Actor2964: brik + Owner: Neutral + Location: 158,64 + Actor2965: brik + Owner: Neutral + Location: 162,64 + Actor2966: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 167,64 + Actor2967: brik + Owner: Neutral + Location: 173,64 + Actor2968: brik + Owner: Neutral + Location: 177,64 + Actor2969: brik + Owner: Neutral + Location: 191,64 + Actor2970: brik + Owner: Neutral + Location: 193,64 + Actor2971: brik + Owner: Neutral + Location: 121,65 + Actor2972: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 131,65 + Actor2973: brik + Owner: Neutral + Location: 147,65 + Actor2974: brik + Owner: Neutral + Location: 148,65 + Actor2975: brik + Owner: Neutral + Location: 149,65 + Actor2976: brik + Owner: Neutral + Location: 154,65 + Actor2977: brik + Owner: Neutral + Location: 158,65 + Actor2978: brik + Owner: Neutral + Location: 162,65 + Actor2979: gscr + Owner: Scrin + SubCell: 3 + Facing: 943 + Location: 165,65 + Actor2980: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 170,65 + Actor2981: brik + Owner: Neutral + Location: 173,65 + Actor2982: brik + Owner: Neutral + Location: 177,65 + Actor2983: brik + Owner: Neutral + Location: 191,65 + Actor2984: brik + Owner: Neutral + Location: 193,65 + Actor2985: brik + Owner: Neutral + Location: 121,66 + Actor2986: brik + Owner: Neutral + Location: 147,66 + Actor2987: brik + Owner: Neutral + Location: 154,66 + Actor2988: brik + Owner: Neutral + Location: 158,66 + Actor2989: brik + Owner: Neutral + Location: 162,66 + Actor2990: brik + Owner: Neutral + Location: 173,66 + Actor2991: brik + Owner: Neutral + Location: 191,66 + Actor2992: brik + Owner: Neutral + Location: 193,66 + Actor2993: brik + Owner: Neutral + Location: 109,67 + Actor2994: brik + Owner: Neutral + Location: 110,67 + Actor2995: brik + Owner: Neutral + Location: 121,67 + Actor2996: brik + Owner: Neutral + Location: 126,67 + Actor2997: brik + Owner: Neutral + Location: 127,67 + Actor2998: brik + Owner: Neutral + Location: 128,67 + Actor2999: brik + Owner: Neutral + Location: 129,67 + Actor3000: brik + Owner: Neutral + Location: 130,67 + Actor3001: brik + Owner: Neutral + Location: 147,67 + Actor3002: brik + Owner: Neutral + Location: 148,67 + Actor3003: brik + Owner: Neutral + Location: 149,67 + Actor3004: brik + Owner: Neutral + Location: 150,67 + Actor3005: brik + Owner: Neutral + Location: 151,67 + Actor3006: brik + Owner: Neutral + Location: 152,67 + Actor3007: brik + Owner: Neutral + Location: 153,67 + Actor3008: brik + Owner: Neutral + Location: 154,67 + Actor3009: brik + Owner: Neutral + Location: 158,67 + Actor3010: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 168,67 + Actor3011: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 171,67 + Actor3012: brik + Owner: Neutral + Location: 173,67 + Actor3013: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 188,67 + Actor3014: brik + Owner: Neutral + Location: 191,67 + Actor3015: brik + Owner: Neutral + Location: 192,67 + Actor3016: brik + Owner: Neutral + Location: 193,67 + Actor3017: brik + Owner: Neutral + Location: 110,68 + Actor3018: brik + Owner: Neutral + Location: 121,68 + Nod_NW5: waypoint + Owner: Neutral + Location: 124,68 + Actor3022: brik + Owner: Neutral + Location: 126,68 + Actor3023: brik + Owner: Neutral + Location: 130,68 + Actor3024: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 145,68 + Actor3025: brik + Owner: Neutral + Location: 173,68 + Actor3026: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 180,68 + Actor3027: brik + Owner: Neutral + Location: 110,69 + Actor3028: brik + Owner: Neutral + Location: 121,69 + Actor3029: brik + Owner: Neutral + Location: 126,69 + Actor3030: brik + Owner: Neutral + Location: 127,69 + Actor3031: brik + Owner: Neutral + Location: 128,69 + Actor3032: brik + Owner: Neutral + Location: 129,69 + Actor3036: brik + Owner: Neutral + Location: 130,69 + Actor3037: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 148,69 + Actor3038: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 152,69 + Actor3039: brik + Owner: Neutral + Location: 158,69 + Actor3040: brik + Owner: Neutral + Location: 173,69 + Actor3041: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 179,69 + Actor3042: s1 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 179,69 + Actor3043: gunw + Owner: Scrin + Facing: 848 + Location: 188,69 + Actor3044: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 106,70 + Actor3045: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 108,70 + Actor3046: brik + Owner: Neutral + Location: 110,70 + Actor3047: brik + Owner: Neutral + Location: 111,70 + Actor3048: brik + Owner: Neutral + Location: 112,70 + Actor3051: brik + Owner: Neutral + Location: 113,70 + Actor3052: brik + Owner: Neutral + Location: 114,70 + Actor3053: brik + Owner: Neutral + Location: 115,70 + Actor3054: brik + Owner: Neutral + Location: 116,70 + Actor3055: brik + Owner: Neutral + Location: 117,70 + Actor3056: brik + Owner: Neutral + Location: 121,70 + Nod_NE5: waypoint + Owner: Neutral + Location: 145,70 + Actor3059: brik + Owner: Neutral + Location: 158,70 + Actor3060: brik + Owner: Neutral + Location: 177,70 + Actor3061: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 179,70 + Actor3062: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 180,70 + Actor3063: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 107,71 + Actor3064: brik + Owner: Neutral + Location: 117,71 + Actor3065: brik + Owner: Neutral + Location: 121,71 + Actor3066: brik + Owner: Neutral + Location: 147,71 + Actor3067: brik + Owner: Neutral + Location: 148,71 + Actor3068: brik + Owner: Neutral + Location: 149,71 + Actor3069: brik + Owner: Neutral + Location: 150,71 + Actor3071: brik + Owner: Neutral + Location: 151,71 + Actor3072: brik + Owner: Neutral + Location: 152,71 + Actor3073: brik + Owner: Neutral + Location: 153,71 + Actor3074: brik + Owner: Neutral + Location: 154,71 + Actor3075: brik + Owner: Neutral + Location: 158,71 + Actor3076: brik + Owner: Neutral + Location: 177,71 + Actor3079: brik + Owner: Neutral + Location: 191,71 + Actor3080: brik + Owner: Neutral + Location: 192,71 + Actor3081: brik + Owner: Neutral + Location: 193,71 + Actor3082: gscr + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 107,72 + Actor3083: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 108,72 + Actor3084: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 110,72 + Actor3085: brik + Owner: Neutral + Location: 117,72 + Actor3086: brik + Owner: Neutral + Location: 121,72 + Actor3087: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 129,72 + Actor3088: brik + Owner: Neutral + Location: 147,72 + Actor3089: brik + Owner: Neutral + Location: 154,72 + Actor3090: brik + Owner: Neutral + Location: 158,72 + Actor3091: brik + Owner: Neutral + Location: 177,72 + Actor3092: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 188,72 + Actor3093: brik + Owner: Neutral + Location: 191,72 + Actor3094: brik + Owner: Neutral + Location: 193,72 + Actor3095: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 196,72 + Actor3096: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 197,72 + Actor3097: s1 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 197,72 + Nod_NW6: waypoint + Owner: Neutral + Location: 107,73 + Actor3099: gscr + Owner: Scrin + SubCell: 3 + Location: 108,73 + Facing: 384 + Actor3100: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 115,73 + Actor3101: brik + Owner: Neutral + Location: 117,73 + Actor3102: brik + Owner: Neutral + Location: 118,73 + Actor3103: brik + Owner: Neutral + Location: 119,73 + Actor3104: brik + Owner: Neutral + Location: 120,73 + Actor3105: brik + Owner: Neutral + Location: 121,73 + Actor3106: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 129,73 + Actor3107: brik + Owner: Neutral + Location: 147,73 + Actor3108: brik + Owner: Neutral + Location: 148,73 + Actor3109: brik + Owner: Neutral + Location: 149,73 + Actor3110: brik + Owner: Neutral + Location: 150,73 + Actor3111: brik + Owner: Neutral + Location: 151,73 + Actor3112: brik + Owner: Neutral + Location: 152,73 + Actor3113: brik + Owner: Neutral + Location: 153,73 + Actor3114: brik + Owner: Neutral + Location: 154,73 + Actor3115: brik + Owner: Neutral + Location: 158,73 + Actor3116: brik + Owner: Neutral + Location: 159,73 + Actor3117: brik + Owner: Neutral + Location: 160,73 + Actor3118: brik + Owner: Neutral + Location: 161,73 + Actor4298: brik + Owner: Neutral + Location: 162,73 + Actor4299: brik + Owner: Neutral + Location: 177,73 + Actor4300: brik + Owner: Neutral + Location: 185,73 + Actor4301: brik + Owner: Neutral + Location: 191,73 + Actor4302: brik + Owner: Neutral + Location: 193,73 + Actor4303: s4 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 195,73 + Actor4304: s1 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 195,73 + Actor4305: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 196,73 + Actor4306: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 197,73 + Actor4307: brik + Owner: Neutral + Location: 110,74 + Actor4308: brik + Owner: Neutral + Location: 111,74 + Actor4309: brik + Owner: Neutral + Location: 112,74 + Actor4310: brik + Owner: Neutral + Location: 113,74 + Actor4311: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 115,74 + Actor4312: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 129,74 + Actor4313: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 144,74 + Actor4314: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 145,74 + Actor4315: brik + Owner: Neutral + Location: 177,74 + Actor4316: brik + Owner: Neutral + Location: 185,74 + Actor4317: brik + Owner: Neutral + Location: 186,74 + Actor4318: brik + Owner: Neutral + Location: 187,74 + Actor4319: brik + Owner: Neutral + Location: 189,74 + Actor4320: brik + Owner: Neutral + Location: 190,74 + Actor4321: brik + Owner: Neutral + Location: 191,74 + Actor4322: brik + Owner: Neutral + Location: 193,74 + Actor4323: brik + Owner: Neutral + Location: 199,74 + Actor4324: brik + Owner: Neutral + Location: 110,75 + Actor4325: brik + Owner: Neutral + Location: 113,75 + Actor4326: s2 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 129,75 + Actor4327: s4 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 145,75 + Actor4328: gscr + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 160,75 + Actor4329: brik + Owner: Neutral + Location: 173,75 + Actor4330: brik + Owner: Neutral + Location: 174,75 + Actor4331: brik + Owner: Neutral + Location: 175,75 + Actor4332: brik + Owner: Neutral + Location: 176,75 + Actor4333: brik + Owner: Neutral + Location: 177,75 + Actor4334: brik + Owner: Neutral + Location: 187,75 + Actor4335: brik + Owner: Neutral + Location: 189,75 + Actor4336: brik + Owner: Neutral + Location: 193,75 + Actor4337: brik + Owner: Neutral + Location: 199,75 + Actor4338: brik + Owner: Neutral + Location: 110,76 + Actor4339: brik + Owner: Neutral + Location: 113,76 + Actor4340: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 116,76 + Actor4341: s1 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 116,76 + Actor4342: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 117,76 + Actor4343: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 129,76 + Actor4344: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 151,76 + Actor4345: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 159,76 + Actor4346: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 161,76 + Actor4347: brik + Owner: Neutral + Location: 187,76 + Actor4348: brik + Owner: Neutral + Location: 189,76 + Actor4349: brik + Owner: Neutral + Location: 193,76 + Actor4350: brik + Owner: Neutral + Location: 199,76 + Actor4351: brik + Owner: Neutral + Location: 108,77 + Actor4352: brik + Owner: Neutral + Location: 109,77 + Actor4353: brik + Owner: Neutral + Location: 110,77 + Actor4354: brik + Owner: Neutral + Location: 113,77 + Actor4355: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 160,77 + Actor4356: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 175,77 + Actor4357: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 176,77 + Actor4358: s3 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 176,77 + Actor4359: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 178,77 + Actor4360: brik + Owner: Neutral + Location: 187,77 + Actor4361: brik + Owner: Neutral + Location: 189,77 + Actor4362: brik + Owner: Neutral + Location: 193,77 + Actor4363: brik + Owner: Neutral + Location: 199,77 + Actor4364: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 106,78 + Actor4365: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 107,78 + Actor4366: brik + Owner: Neutral + Location: 108,78 + Actor4367: brik + Owner: Neutral + Location: 113,78 + Actor4368: brik + Owner: Neutral + Location: 114,78 + Actor4369: brik + Owner: Neutral + Location: 115,78 + Actor4370: brik + Owner: Neutral + Location: 116,78 + Actor4371: brik + Owner: Neutral + Location: 117,78 + Actor4372: brik + Owner: Neutral + Location: 118,78 + Actor4373: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 174,78 + Actor4374: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 176,78 + Actor4375: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 177,78 + Actor4376: brik + Owner: Neutral + Location: 187,78 + Actor4377: brik + Owner: Neutral + Location: 189,78 + Actor4378: brik + Owner: Neutral + Location: 193,78 + Actor4379: brik + Owner: Neutral + Location: 199,78 + Actor4380: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 106,79 + Actor4381: brik + Owner: Neutral + Location: 108,79 + Actor4382: brik + Owner: Neutral + Location: 169,79 + Actor4383: brik + Owner: Neutral + Location: 187,79 + Actor4384: brik + Owner: Neutral + Location: 189,79 + Actor4385: brik + Owner: Neutral + Location: 193,79 + Actor4386: brik + Owner: Neutral + Location: 197,79 + Actor4387: brik + Owner: Neutral + Location: 198,79 + Actor4388: brik + Owner: Neutral + Location: 199,79 + Actor4389: brik + Owner: Neutral + Location: 108,80 + Actor4391: brik + Owner: Neutral + Location: 173,80 + Actor4392: brik + Owner: Neutral + Location: 174,80 + Actor4393: brik + Owner: Neutral + Location: 175,80 + Actor4394: brik + Owner: Neutral + Location: 176,80 + Actor4395: brik + Owner: Neutral + Location: 177,80 + Actor4396: brik + Owner: Neutral + Location: 178,80 + Actor4397: brik + Owner: Neutral + Location: 187,80 + Actor4398: brik + Owner: Neutral + Location: 189,80 + Actor4399: brik + Owner: Neutral + Location: 193,80 + Actor4400: brik + Owner: Neutral + Location: 197,80 + Actor4401: brik + Owner: Neutral + Location: 108,81 + Actor4403: brik + Owner: Neutral + Location: 173,81 + Actor4404: brik + Owner: Neutral + Location: 187,81 + Actor4405: brik + Owner: Neutral + Location: 189,81 + Actor4406: brik + Owner: Neutral + Location: 193,81 + Actor4407: brik + Owner: Neutral + Location: 197,81 + Actor4423: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 171,82 + Actor4424: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 172,82 + Actor4425: brik + Owner: Neutral + Location: 173,82 + Actor4426: brik + Owner: Neutral + Location: 185,82 + Actor4427: brik + Owner: Neutral + Location: 186,82 + Actor4428: brik + Owner: Neutral + Location: 187,82 + Actor4429: brik + Owner: Neutral + Location: 189,82 + Actor4430: brik + Owner: Neutral + Location: 190,82 + Actor4431: brik + Owner: Neutral + Location: 191,82 + Actor4432: brik + Owner: Neutral + Location: 192,82 + Actor4433: brik + Owner: Neutral + Location: 193,82 + Actor4434: brik + Owner: Neutral + Location: 197,82 + Actor4435: brik + Owner: Neutral + Location: 198,82 + Actor4436: brik + Owner: Neutral + Location: 199,82 + Actor4449: brik + Owner: Neutral + Location: 173,83 + Actor3198: barb + Owner: Neutral + Location: 188,85 + Actor3199: barb + Owner: Neutral + Location: 189,85 + Actor3200: barb + Owner: Neutral + Location: 195,85 + Actor3201: barb + Owner: Neutral + Location: 196,85 + Actor3202: barb + Owner: Neutral + Location: 188,86 + Actor3223: barl + Owner: Creeps + Location: 195,86 + Actor3224: barb + Owner: Neutral + Location: 196,86 + Actor3225: brl3 + Owner: Creeps + Location: 193,87 + Actor3257: lchr + Owner: Scrin + Facing: 79 + Location: 197,87 + Actor3258: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 190,88 + Actor3259: s3 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 190,88 + Actor3260: barl + Owner: Creeps + Location: 192,88 + Actor3271: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 195,88 + Actor3272: s3 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 195,88 + Actor3273: brl3 + Owner: Creeps + Location: 190,89 + Actor3301: brl3 + Owner: Creeps + Location: 193,89 + Actor3302: ptur + Owner: Scrin + TurretFacing: 237 + Location: 196,89 + Actor3314: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 192,90 + Actor3315: s3 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 192,90 + Actor3316: barl + Owner: Creeps + Location: 193,90 + Actor3337: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 197,90 + Actor3338: lchr + Owner: Scrin + Facing: 991 + Location: 188,91 + Actor3339: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 191,91 + Actor3340: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 196,91 + Actor4450: barl + Owner: Creeps + Location: 190,92 + Actor4451: ptur + Owner: Scrin + TurretFacing: 658 + Location: 191,92 + Nod_WormholeSE: wormhole + Owner: Scrin + Location: 194,92 + Nod_SE1: waypoint + Owner: Neutral + Location: 194,92 + Actor4454: barb + Owner: Neutral + Location: 188,93 + Actor4455: brl3 + Owner: Creeps + Location: 192,93 + Actor4456: barb + Owner: Neutral + Location: 196,93 + Actor4457: barb + Owner: Neutral + Location: 188,94 + Actor4458: barb + Owner: Neutral + Location: 189,94 + Actor4459: barb + Owner: Neutral + Location: 195,94 + Actor4460: barb + Owner: Neutral + Location: 196,94 + Actor3221: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 159,86 + Actor3222: brik + Owner: Neutral + Location: 173,86 + Actor3251: brik + Owner: Neutral + Location: 163,87 + Actor3252: brik + Owner: Neutral + Location: 164,87 + Actor3253: brik + Owner: Neutral + Location: 165,87 + Actor3254: brik + Owner: Neutral + Location: 166,87 + Actor3255: brik + Owner: Neutral + Location: 170,87 + Actor3256: brik + Owner: Neutral + Location: 171,87 + Actor3270: brik + Owner: Neutral + Location: 172,87 + Actor3299: brik + Owner: Neutral + Location: 173,87 + Actor3300: brik + Owner: Neutral + Location: 166,88 + Actor3312: brik + Owner: Neutral + Location: 170,88 + Actor3313: brik + Owner: Neutral + Location: 166,89 + Actor3335: brik + Owner: Neutral + Location: 170,89 + Actor3336: brik + Owner: Neutral + Location: 163,90 + Actor4461: brik + Owner: Neutral + Location: 164,90 + Actor4462: brik + Owner: Neutral + Location: 165,90 + Actor4463: brik + Owner: Neutral + Location: 166,90 + Actor4464: brik + Owner: Neutral + Location: 170,90 + Actor4465: brik + Owner: Neutral + Location: 171,90 + Actor4466: brik + Owner: Neutral + Location: 172,90 + Actor4467: brik + Owner: Neutral + Location: 173,90 + Actor4468: brik + Owner: Neutral + Location: 163,91 + Actor4469: brik + Owner: Neutral + Location: 173,91 + Actor4470: brik + Owner: Neutral + Location: 163,92 + Actor4471: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 170,92 + Actor4472: brik + Owner: Neutral + Location: 173,92 + Actor4473: s2 + Owner: Scrin + SubCell: 3 + Facing: 880 + Location: 165,93 + Actor4474: s2 + Owner: Scrin + SubCell: 3 + Facing: 126 + Location: 172,93 + Actor4475: s2 + Owner: Scrin + SubCell: 3 + Facing: 142 + Location: 166,94 + Actor4476: s2 + Owner: Scrin + SubCell: 3 + Facing: 142 + Location: 170,94 + Actor3134: brik + Owner: Neutral + Location: 121,84 + Actor3135: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 129,84 + Actor3136: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 131,84 + Actor3137: s3 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 131,84 + Actor3138: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 109,85 + Actor3139: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 113,85 + Actor3140: brik + Owner: Neutral + Location: 121,85 + Actor3141: s4 + Owner: Scrin + SubCell: 3 + Stance: AttackAnything + Facing: 626 + Location: 127,85 + Actor3143: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 129,85 + Actor3145: brik + Owner: Neutral + Location: 132,85 + Actor3146: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 150,85 + Actor3147: s1 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 152,85 + Actor3148: apc2.husk + Facing: 384 + Faction: RandomGDI + Owner: Nod + Location: 153,85 + Actor3149: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 156,85 + Actor3151: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 157,85 + Actor3152: brik + Owner: Neutral + Location: 121,86 + Actor3153: brik + Owner: Neutral + Location: 125,86 + Actor3154: brik + Owner: Neutral + Location: 132,86 + Actor3155: brik + Owner: Neutral + Location: 135,86 + Nod_NW9: waypoint + Owner: Neutral + Location: 147,86 + Actor3157: s1 + Owner: Scrin + SubCell: 3 + Location: 148,86 + Facing: 384 + Nod_NE7: waypoint + Owner: Neutral + Location: 157,86 + Actor3159: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 107,87 + Actor3160: brik + Owner: Neutral + Location: 121,87 + Actor3161: brik + Owner: Neutral + Location: 125,87 + Actor3162: brik + Owner: Neutral + Location: 132,87 + Actor3163: brik + Owner: Neutral + Location: 135,87 + Actor3164: brik + Owner: Neutral + Location: 139,87 + Actor3165: brik + Owner: Neutral + Location: 140,87 + Actor3166: brik + Owner: Neutral + Location: 141,87 + Actor3167: barb + Location: 146,87 + Faction: RandomGDI + Owner: Nod + Actor3168: barb + Location: 147,87 + Faction: RandomGDI + Owner: Nod + Actor3169: barb + Location: 151,87 + Faction: RandomGDI + Owner: Nod + Actor3170: barb + Location: 152,87 + Faction: RandomGDI + Owner: Nod + Actor3171: barb + Location: 153,87 + Faction: RandomGDI + Owner: Nod + Actor3172: barb + Location: 157,87 + Faction: RandomGDI + Owner: Nod + Actor3173: barb + Location: 158,87 + Faction: RandomGDI + Owner: Nod + Actor3174: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 115,88 + Actor3175: brik + Owner: Neutral + Location: 118,88 + Actor3176: brik + Owner: Neutral + Location: 119,88 + Actor3177: brik + Owner: Neutral + Location: 120,88 + Actor3178: brik + Owner: Neutral + Location: 121,88 + Actor3179: brik + Owner: Neutral + Location: 125,88 + Actor3180: brik + Owner: Neutral + Location: 129,88 + Actor3181: brik + Owner: Neutral + Location: 130,88 + Actor3182: brik + Owner: Neutral + Location: 131,88 + Actor3183: brik + Owner: Neutral + Location: 132,88 + Actor3184: brik + Owner: Neutral + Location: 135,88 + Actor3185: brik + Owner: Neutral + Location: 139,88 + Actor3186: barb + Location: 146,88 + Faction: RandomGDI + Owner: Nod + Actor3187: sbag + Faction: RandomGDI + Owner: Nod + Location: 147,88 + Actor3188: sbag + Faction: RandomGDI + Owner: Nod + Location: 148,88 + Actor3189: sbag + Location: 151,88 + Faction: RandomGDI + Owner: Nod + Actor3190: sbag + Location: 152,88 + Faction: RandomGDI + Owner: Nod + Actor3191: sbag + Location: 153,88 + Faction: RandomGDI + Owner: Nod + Actor3192: sbag + Location: 156,88 + Faction: RandomGDI + Owner: Nod + Actor3193: sbag + Location: 157,88 + Faction: RandomGDI + Owner: Nod + Actor3194: barb + Location: 158,88 + Faction: RandomGDI + Owner: Nod + Nod_NW7: waypoint + Owner: Neutral + Location: 108,89 + Actor3196: dark + Owner: Scrin + Facing: 666 + Location: 111,89 + Actor3197: brik + Owner: Neutral + Location: 118,89 + Actor3204: brik + Owner: Neutral + Location: 125,89 + Actor3205: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 127,89 + Actor3206: brik + Owner: Neutral + Location: 129,89 + Actor3207: brik + Owner: Neutral + Location: 135,89 + Actor3208: brik + Owner: Neutral + Location: 139,89 + Actor3209: barb + Location: 146,89 + Faction: RandomGDI + Owner: Nod + Actor3210: sbag + Faction: RandomGDI + Owner: Nod + Location: 147,89 + Actor3211: apc2 + Faction: RandomGDI + Owner: Nod + Location: 148,89 + Facing: 118 + Actor3212: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 151,89 + Actor3213: e1 + SubCell: 3 + Faction: RandomGDI + Owner: Nod + Facing: 384 + Location: 152,89 + Actor3214: e1 + SubCell: 1 + Faction: RandomGDI + Facing: 384 + Owner: Nod + Location: 152,89 + Actor3215: e1 + SubCell: 2 + Faction: RandomGDI + Owner: Nod + Location: 152,89 + Facing: 384 + Actor3216: e1 + SubCell: 3 + Faction: RandomGDI + Owner: Nod + Facing: 384 + Location: 153,89 + Actor3217: apc2 + Faction: RandomGDI + Facing: 904 + Owner: Nod + Location: 156,89 + Actor3218: sbag + Location: 157,89 + Faction: RandomGDI + Owner: Nod + Actor3219: barb + Location: 158,89 + Faction: RandomGDI + Owner: Nod + Actor3220: brik + Owner: Neutral + Location: 118,90 + Actor3226: brik + Owner: Neutral + Location: 121,90 + Actor3227: brik + Owner: Neutral + Location: 122,90 + Actor3228: brik + Owner: Neutral + Location: 123,90 + Actor3229: brik + Owner: Neutral + Location: 124,90 + Actor3230: brik + Owner: Neutral + Location: 125,90 + Actor3231: brik + Owner: Neutral + Location: 129,90 + Actor3232: brik + Owner: Neutral + Location: 132,90 + Actor3233: brik + Owner: Neutral + Location: 133,90 + Actor3234: brik + Owner: Neutral + Location: 134,90 + Actor3235: brik + Owner: Neutral + Location: 135,90 + Actor3236: brik + Owner: Neutral + Location: 139,90 + Actor3237: brik + Owner: Neutral + Location: 140,90 + Actor3238: brik + Owner: Neutral + Location: 141,90 + Actor3239: brik + Owner: Neutral + Location: 142,90 + Actor3240: brik + Owner: Neutral + Location: 145,90 + Actor3241: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 147,90 + Actor3242: medi + SubCell: 3 + Faction: RandomGDI + Facing: 384 + Owner: Nod + Location: 149,90 + Actor3243: flare + Faction: RandomGDI + Owner: Nod + Location: 152,90 + Actor3244: medi + SubCell: 3 + Faction: RandomGDI + Owner: Nod + Location: 155,90 + Facing: 384 + Actor3245: e1 + SubCell: 1 + Faction: RandomGDI + Facing: 384 + Owner: Nod + Location: 157,90 + Actor3246: e1 + SubCell: 3 + Faction: RandomGDI + Owner: Nod + Facing: 384 + Location: 157,90 + Actor3247: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 106,91 + Actor3248: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 110,91 + Actor3262: brik + Owner: Neutral + Location: 118,91 + Actor3263: brik + Owner: Neutral + Location: 121,91 + Actor3264: brik + Owner: Neutral + Location: 129,91 + Actor3265: brik + Owner: Neutral + Location: 132,91 + Actor3266: brik + Owner: Neutral + Location: 142,91 + Actor3267: brik + Owner: Neutral + Location: 145,91 + Actor3268: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 114,92 + Actor3274: brik + Owner: Neutral + Location: 118,92 + Actor3275: brik + Owner: Neutral + Location: 119,92 + Actor3276: brik + Owner: Neutral + Location: 120,92 + Actor3277: brik + Owner: Neutral + Location: 121,92 + Actor3278: gscr + Owner: Scrin + SubCell: 3 + Facing: 769 + Location: 124,92 + Actor3279: brik + Owner: Neutral + Location: 129,92 + Actor3280: brik + Owner: Neutral + Location: 130,92 + Actor3281: brik + Owner: Neutral + Location: 131,92 + Actor3282: brik + Owner: Neutral + Location: 132,92 + Actor3283: s1 + Owner: Scrin + SubCell: 3 + Stance: AttackAnything + Facing: 975 + Location: 135,92 + Actor3284: s1 + Owner: Scrin + SubCell: 1 + Facing: 384 + Stance: AttackAnything + Location: 135,92 + Actor3285: brik + Owner: Neutral + Location: 142,92 + Actor3286: brik + Owner: Neutral + Location: 145,92 + Actor3287: gscr + Owner: Scrin + SubCell: 3 + Facing: 769 + Location: 124,93 + Actor3288: s4 + Owner: Scrin + SubCell: 3 + Facing: 1023 + Stance: AttackAnything + Location: 135,93 + Nod_NW8: waypoint + Owner: Neutral + Location: 137,93 + Actor3290: s1 + Owner: Scrin + SubCell: 3 + Facing: 1023 + Stance: AttackAnything + Location: 138,93 + Actor3291: s1 + Owner: Scrin + SubCell: 3 + Facing: 103 + Stance: AttackAnything + Location: 140,93 + Actor3292: brik + Owner: Neutral + Location: 142,93 + Actor3293: brik + Owner: Neutral + Location: 145,93 + Actor3294: gscr + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 111,94 + Actor3295: gscr + Owner: Scrin + SubCell: 3 + Facing: 761 + Location: 124,94 + Actor3296: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 130,94 + Actor3297: s1 + Owner: Scrin + SubCell: 3 + Facing: 1023 + Stance: AttackAnything + Location: 136,94 + Actor3305: s1 + Owner: Scrin + SubCell: 3 + Facing: 753 + Stance: AttackAnything + Location: 139,94 + Actor3306: s1 + Owner: Scrin + SubCell: 1 + Facing: 384 + Stance: AttackAnything + Location: 139,94 + Actor3308: brik + Owner: Neutral + Location: 142,94 + Actor3309: brik + Owner: Neutral + Location: 145,94 + Actor3310: brik + Owner: Neutral + Location: 118,95 + Actor3311: brik + Owner: Neutral + Location: 119,95 + Actor3317: brik + Owner: Neutral + Location: 120,95 + Actor3318: brik + Owner: Neutral + Location: 121,95 + Actor3319: gscr + Owner: Scrin + SubCell: 3 + Facing: 761 + Location: 124,95 + Actor3320: brik + Owner: Neutral + Location: 129,95 + Actor3321: brik + Owner: Neutral + Location: 130,95 + Actor3322: brik + Owner: Neutral + Location: 131,95 + Actor3323: brik + Owner: Neutral + Location: 132,95 + Actor3324: brik + Owner: Neutral + Location: 142,95 + Actor3325: brik + Owner: Neutral + Location: 145,95 + Actor3326: brik + Owner: Neutral + Location: 116,96 + Actor3327: brik + Owner: Neutral + Location: 117,96 + Actor3328: brik + Owner: Neutral + Location: 118,96 + Actor3329: brik + Owner: Neutral + Location: 121,96 + Actor3330: brik + Owner: Neutral + Location: 122,96 + Actor3331: brik + Owner: Neutral + Location: 128,96 + Actor3332: brik + Owner: Neutral + Location: 129,96 + Actor3333: brik + Owner: Neutral + Location: 132,96 + Actor3334: brik + Owner: Neutral + Location: 133,96 + Actor3261: mpspawn + Owner: Neutral + Location: 148,92 + Actor3341: rmbospawn + Faction: RandomGDI + Owner: Multi10 + Location: 148,92 + Actor3342: mpspawn + Owner: Neutral + Location: 150,92 + Actor3343: rmbospawn + Faction: RandomGDI + Owner: Multi11 + Location: 150,92 + Actor3344: mpspawn + Owner: Neutral + Location: 152,92 + Actor3345: rmbospawn + Faction: RandomGDI + Owner: Multi12 + Location: 152,92 + Actor3346: mpspawn + Owner: Neutral + Location: 154,92 + Actor3347: rmbospawn + Faction: RandomGDI + Owner: Multi13 + Location: 154,92 + Actor3348: mpspawn + Owner: Neutral + Location: 156,92 + Actor3349: rmbospawn + Faction: RandomGDI + Owner: Multi14 + Location: 156,92 + Actor3350: mpspawn + Owner: Neutral + Location: 148,94 + Actor3351: rmbospawn + Faction: RandomGDI + Owner: Multi15 + Location: 148,94 + Actor3352: mpspawn + Owner: Neutral + Location: 150,94 + Actor3353: rmbospawn + Faction: RandomGDI + Owner: Multi16 + Location: 150,94 + Actor3354: mpspawn + Owner: Neutral + Location: 152,94 + Actor3355: rmbospawn + Faction: RandomGDI + Owner: Multi17 + Location: 152,94 + Actor3356: mpspawn + Owner: Neutral + Location: 154,94 + Actor3357: rmbospawn + Faction: RandomGDI + Owner: Multi18 + Location: 154,94 + Actor3358: mpspawn + Owner: Neutral + Location: 156,94 + Actor3359: rmbospawn + Faction: RandomGDI + Owner: Multi19 + Location: 156,94 + Actor3249: brik + Owner: Neutral + Location: 169,80 + Actor3250: brik + Owner: Neutral + Location: 169,81 + Actor3269: brik + Owner: Neutral + Location: 145,82 + Actor3298: brik + Owner: Neutral + Location: 146,82 + Actor3360: brik + Owner: Neutral + Location: 157,82 + Actor4390: brik + Owner: Neutral + Location: 158,82 + Actor4402: brik + Owner: Neutral + Location: 159,82 + Actor4408: brik + Owner: Neutral + Location: 169,82 + Actor4409: brik + Owner: Neutral + Location: 143,83 + Actor4410: brik + Owner: Neutral + Location: 144,83 + Actor4411: brik + Owner: Neutral + Location: 145,83 + Actor4412: brik + Owner: Neutral + Location: 159,83 + Actor4413: brik + Owner: Neutral + Location: 160,83 + Actor4414: brik + Owner: Neutral + Location: 161,83 + Actor4415: brik + Owner: Neutral + Location: 165,83 + Actor4416: brik + Owner: Neutral + Location: 166,83 + Actor4417: brik + Owner: Neutral + Location: 167,83 + Actor4418: brik + Owner: Neutral + Location: 168,83 + Actor4419: brik + Owner: Neutral + Location: 169,83 + Actor4420: brik + Owner: Neutral + Location: 108,82 + Actor4421: brik + Owner: Neutral + Location: 109,82 + Actor4422: brik + Owner: Neutral + Location: 110,82 + Actor4437: brik + Owner: Neutral + Location: 111,82 + Actor4438: brik + Owner: Neutral + Location: 112,82 + Actor4439: brik + Owner: Neutral + Location: 113,82 + Actor4440: brik + Owner: Neutral + Location: 114,82 + Actor4441: brik + Owner: Neutral + Location: 115,82 + Actor4442: brik + Owner: Neutral + Location: 121,82 + Actor4443: brik + Owner: Neutral + Location: 121,83 + Actor3289: healcrate + Owner: Neutral + Location: 15,17 + Actor3376: healcrate + Owner: Neutral + Location: 118,17 + Actor3386: healcrate + Owner: Neutral + Location: 118,17 + Actor3387: healcrate + Owner: Neutral + Location: 193,18 + Actor3483: healcrate + Owner: Neutral + Location: 90,18 + Actor3484: healcrate + Owner: Neutral + Location: 129,34 + Actor3716: healcrate + Owner: Neutral + Location: 26,34 + Actor3876: healcrate + Owner: Neutral + Location: 95,95 + Actor3877: healcrate + Owner: Neutral + Location: 198,95 + +Rules: ca|rules/custom/scrinfestation-base.yaml, ca|rules/custom/scrinfestation-minigame.yaml, ca|rules/custom/commando-mission.yaml, rules.yaml + +Weapons: ca|weapons/custom/scrinfestation.yaml diff --git a/mods/ca/maps/team-scrinfestation/rules.yaml b/mods/ca/maps/team-scrinfestation/rules.yaml new file mode 100644 index 0000000000..916717c875 --- /dev/null +++ b/mods/ca/maps/team-scrinfestation/rules.yaml @@ -0,0 +1,5 @@ +World: + MissionData: + Briefing: ================\n\n- Two teams of players start with a single Commando (requires at least one player on Team 1 and one player on Team 2).\n-------------------------\n- If your Commando dies you can build a new one (takes longer for each death).\n-------------------------\n- Fight your way through the Scrin forces.\n-------------------------\n- Objective is to find and destroy the Scrin portals before the enemy team.\n-------------------------\n- Team fails if all spawn points are lost and all Commandos are dead, or when the enemy team wins.\n\n================\n + LuaScript: + Scripts: team-scrinfestation.lua diff --git a/mods/ca/maps/team-scrinfestation/team-scrinfestation.lua b/mods/ca/maps/team-scrinfestation/team-scrinfestation.lua new file mode 100644 index 0000000000..88789923a5 --- /dev/null +++ b/mods/ca/maps/team-scrinfestation/team-scrinfestation.lua @@ -0,0 +1,260 @@ +Players = Player.GetPlayers(function(p) return p.Team == 1 or p.Team == 2 end) +GDIPlayers = Player.GetPlayers(function(p) return p.Team == 1 end) +NodPlayers = Player.GetPlayers(function(p) return p.Team == 2 end) +ScrinActorTypes = {"gunw", "corr", "ruin", "lchr", "dark", "ptur", "s1", "s2", "s3", "s4", "gscr", "brst2"} + +GDIAttackPaths = +{ + { + { NW2.Location, NW3.Location, NW4.Location, NW5.Location, NW6.Location, NW7.Location, NW8.Location, NW9.Location }, + { NE4.Location, NE5.Location, NE6.Location, NE7.Location }, + }, + { + { NE2.Location, NE3.Location, NE4.Location, NE5.Location, NE6.Location, NE7.Location }, + { NE2.Location, NE3.Location, NE4.Location, NW4.Location, NW5.Location, NW6.Location, NW7.Location, NW8.Location, NW9.Location }, + }, + { + { SE2.Location, NE3.Location, NE4.Location, NE5.Location, NE6.Location, NE7.Location }, + { SE2.Location, NE3.Location, NE4.Location, NW4.Location, NW5.Location, NW6.Location, NW7.Location, NW8.Location, NW9.Location }, + }, +} + +NodAttackPaths = +{ + { + { Nod_NW2.Location, Nod_NW3.Location, Nod_NW4.Location, Nod_NW5.Location, Nod_NW6.Location, Nod_NW7.Location, Nod_NW8.Location, Nod_NW9.Location }, + { Nod_NE4.Location, Nod_NE5.Location, Nod_NE6.Location, Nod_NE7.Location }, + }, + { + { Nod_NE2.Location, Nod_NE3.Location, Nod_NE4.Location, Nod_NE5.Location, Nod_NE6.Location, Nod_NE7.Location }, + { Nod_NE2.Location, Nod_NE3.Location, Nod_NE4.Location, Nod_NW4.Location, Nod_NW5.Location, Nod_NW6.Location, Nod_NW7.Location, Nod_NW8.Location, Nod_NW9.Location }, + }, + { + { Nod_SE2.Location, Nod_NE3.Location, Nod_NE4.Location, Nod_NE5.Location, Nod_NE6.Location, Nod_NE7.Location }, + { Nod_SE2.Location, Nod_NE3.Location, Nod_NE4.Location, Nod_NW4.Location, Nod_NW5.Location, Nod_NW6.Location, Nod_NW7.Location, Nod_NW8.Location, Nod_NW9.Location }, + }, +} + +Wormholes = { WormholeNW, WormholeNE, WormholeSE } +NodWormholes = { Nod_WormholeNW, Nod_WormholeNE, Nod_WormholeSE } + +ScrinSquads = { + {"s1", "s1", "s1", "s2", "gscr"}, + {"s1", "s1", "s1", "s3", "gscr"}, + {"s1", "s1", "s1", "s4", "gscr"}, + {"s1", "s1", "s1", "brst2", "gscr"}, + {"gscr", "gscr", "gscr"}, + {"s4", "s4", "s4"}, + {"s1", "s1", "s1", "s1", "s1"}, + {"s2", "s2", "s2"}, + {"s3", "s3", "s1", "s1"}, + {"brst2", "brst2", "s1", "s1"}, +} + +GetNumPlayers = function(players) + local num = 0 + + Utils.Do(players, function(player) + if player.InternalName ~= "Neutral" then + local spawns = player.GetActorsByType("rmbospawn") + num = num + #spawns + end + end) + + return num +end + +IdleHunt = function(actor) + if actor.HasProperty("Hunt") and not actor.IsDead then + Trigger.OnIdle(actor, actor.Hunt) + end +end + +MoveAndHunt = function(actors, path) + Utils.Do(actors, function(actor) + if not actor or actor.IsDead then + return + end + + Utils.Do(path, function(point) + actor.AttackMove(point) + end) + + IdleHunt(actor) + end) +end + +SendScrinUnits = function(wormhole, attackPaths, numPlayers) + if not wormhole or wormhole.IsDead then + return + end + + local interval = math.floor((120 / numPlayers) + 0.5) + Utils.RandomInteger(-3,3) + local unitTypes = Utils.Random(ScrinSquads); + local units = Reinforcements.Reinforce(Scrin, unitTypes, { wormhole.Location }, 15) + local attackPath = attackPaths[1] + + if numPlayers > 2 then + attackPath = Utils.Random(attackPaths) + end + + Utils.Do(units, function(unit) + unit.Patrol(attackPath, true, 50) + + Trigger.OnDamaged(unit, function() + + Utils.Do(units, function(unit) + if unit.HasProperty("Hunt") and not unit.IsDead then + unit.Stop() + unit.Hunt() + Trigger.ClearAll(unit) + end + end) + end) + end) + + Trigger.AfterDelay(DateTime.Seconds(interval), function() + SendScrinUnits(wormhole, attackPaths, numPlayers) + end) +end + +WorldLoaded = function() + Scrin = Player.GetPlayer("Scrin") + Neutral = Player.GetPlayer("Neutral") + GDI = Player.GetPlayer("Scrin") + Nod = Player.GetPlayer("Nod") + + local neutralSpawns = Neutral.GetActorsByType("rmbospawn") + Utils.Do(neutralSpawns, function(a) + a.Destroy() + end) + + local initialGdiPlayers = GetNumPlayers(GDIPlayers) + local initialNodPlayers = GetNumPlayers(NodPlayers) + + SendScrinUnits(WormholeNE, GDIAttackPaths[2], initialGdiPlayers) + SendScrinUnits(Nod_WormholeNE, NodAttackPaths[2], initialNodPlayers) + + if initialGdiPlayers > 1 then + SendScrinUnits(WormholeNW, GDIAttackPaths[1], initialGdiPlayers) + end + + if initialGdiPlayers > 2 then + SendScrinUnits(WormholeSE, GDIAttackPaths[3], initialGdiPlayers) + end + + if initialNodPlayers > 1 then + SendScrinUnits(Nod_WormholeNW, NodAttackPaths[1], initialNodPlayers) + end + + if initialNodPlayers > 2 then + SendScrinUnits(Nod_WormholeSE, NodAttackPaths[3], initialNodPlayers) + end + + local scrinUnits = Scrin.GetActorsByTypes(ScrinActorTypes) + + Utils.Do(scrinUnits, function(unit) + Trigger.OnDamaged(unit, function(self, attacker, damage) + if attacker.EffectiveOwner == Scrin then + return + end + local rand = Utils.RandomInteger(1,100) + if rand > 90 then + if unit.HasProperty("Attack") and not unit.IsDead then + unit.Stop() + unit.Attack(attacker) + end + end + end) + end) + + Trigger.OnAllKilledOrCaptured(Wormholes, function() + local actors = Scrin.GetActorsByTypes(ScrinActorTypes) + Utils.Do(actors, function(actor) + if actor.HasProperty("Kill") and not actor.IsDead then actor.Kill("BulletDeath") end + end) + + Media.DisplayMessage("GDI are victorious!", "Notification", HSLColor.FromHex("E5D19C")) + + Trigger.AfterDelay(DateTime.Seconds(5), function() + Utils.Do(NodPlayers, function(nodPlayer) + local nodActors = nodPlayer.GetActors() + Utils.Do(nodActors, function(nodActor) + if nodActor.HasProperty("Kill") and not nodActor.IsDead then nodActor.Kill("BulletDeath") end + end) + end) + + Trigger.AfterDelay(DateTime.Seconds(2), function() + Utils.Do(NodWormholes, function(w) + w.Kill() + end) + end) + end) + end) + + Trigger.OnAllKilledOrCaptured(NodWormholes, function() + local actors = Scrin.GetActorsByTypes(ScrinActorTypes) + Utils.Do(actors, function(actor) + if actor.HasProperty("Kill") and not actor.IsDead then actor.Kill("BulletDeath") end + end) + + Media.DisplayMessage("Nod are victorious!", "Notification", HSLColor.FromHex("FF0000")) + + Trigger.AfterDelay(DateTime.Seconds(5), function() + Utils.Do(GDIPlayers, function(gdiPlayer) + local gdiActors = gdiPlayer.GetActors() + Utils.Do(gdiActors, function(gdiActor) + if gdiActor.HasProperty("Kill") and not gdiActor.IsDead then gdiActor.Kill("BulletDeath") end + end) + end) + + Trigger.AfterDelay(DateTime.Seconds(2), function() + Utils.Do(Wormholes, function(w) + if not w.IsDead then + w.Kill() + end + end) + end) + end) + end) + + Utils.Do(Players, function(player) + if player.InternalName ~= "Neutral" then + local spawns = player.GetActorsByType("rmbospawn") + local commandos = player.GetActorsByType("rmbo") + + Utils.Do(spawns, function(s) + Trigger.OnProduction(s, function(producer, produced) + if produced.Type == "rmbo" then + Trigger.OnKilled(produced, function(self, killer) + AnnounceDeath(self) + end) + end + end) + end) + + Utils.Do(commandos, function(c) + Trigger.OnKilled(c, function(self, killer) + AnnounceDeath(self) + end) + end) + end + end) +end + +AnnounceDeath = function(killed) + local localPlayer + Utils.Do(Players, function(p) + if p.IsLocalPlayer then + localPlayer = p + end + end) + + if localPlayer == nil then + return + elseif not killed.Owner.IsAlliedWith(localPlayer) then + return + end + + Media.DisplayMessage(killed.Owner.Name .. " died!", "Notification", HSLColor.FromHex("1E90FF")) +end diff --git a/mods/ca/maps/temperal.oramap b/mods/ca/maps/temperal.oramap index 5dde72906e..e2cbe94048 100644 Binary files a/mods/ca/maps/temperal.oramap and b/mods/ca/maps/temperal.oramap differ diff --git a/mods/ca/maps/temptation-ca.oramap b/mods/ca/maps/temptation-ca.oramap index 8bfc406136..ba5d3894b0 100644 Binary files a/mods/ca/maps/temptation-ca.oramap and b/mods/ca/maps/temptation-ca.oramap differ diff --git a/mods/ca/maps/territorial-ca.oramap b/mods/ca/maps/territorial-ca.oramap new file mode 100644 index 0000000000..a787aac3ec Binary files /dev/null and b/mods/ca/maps/territorial-ca.oramap differ diff --git a/mods/ca/maps/tfca/map.bin b/mods/ca/maps/tfca/map.bin new file mode 100644 index 0000000000..ecebd98109 Binary files /dev/null and b/mods/ca/maps/tfca/map.bin differ diff --git a/mods/ca/maps/tfca/map.png b/mods/ca/maps/tfca/map.png new file mode 100644 index 0000000000..cc7c9acd1d Binary files /dev/null and b/mods/ca/maps/tfca/map.png differ diff --git a/mods/ca/maps/tfca/map.yaml b/mods/ca/maps/tfca/map.yaml new file mode 100644 index 0000000000..fb93b6cc35 --- /dev/null +++ b/mods/ca/maps/tfca/map.yaml @@ -0,0 +1,1649 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: Team Fortress CA + +Author: Darkademic + +Tileset: TEMPERAT + +MapSize: 98,98 + +Bounds: 1,1,96,96 + +Visibility: Lobby + +Categories: Minigame + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: england + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: england + Enemies: Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Multi6, Multi7, Multi8, Multi9, Multi10, Multi11, Multi12, Multi13, Multi14, Multi15, Multi16, Multi17, Multi18, Multi19, Multi20, Multi21, Multi22, Multi23 + PlayerReference@Blue: + Name: Blue + Faction: england + Color: 0080FF + Allies: Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Multi6, Multi7, Multi8, Multi9, Multi10, Multi11 + Enemies: Multi12, Multi13, Multi14, Multi15, Multi16, Multi17, Multi18, Multi19, Multi20, Multi21, Multi22, Multi23 + PlayerReference@Red: + Name: Red + Faction: england + Color: FF0000 + Allies: Multi12, Multi13, Multi14, Multi15, Multi16, Multi17, Multi18, Multi19, Multi20, Multi21, Multi22, Multi23 + Enemies: Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Multi6, Multi7, Multi8, Multi9, Multi10, Multi11 + PlayerReference@Multi0: + Name: Multi0 + Playable: True + Faction: Random + LockSpawn: True + Spawn: 1 + LockTeam: True + Team: 1 + Allies: Blue + Enemies: Creeps + PlayerReference@Multi1: + Name: Multi1 + Playable: True + Faction: Random + LockSpawn: True + Spawn: 2 + LockTeam: True + Team: 1 + Allies: Blue + Enemies: Creeps + PlayerReference@Multi2: + Name: Multi2 + Playable: True + Faction: Random + LockSpawn: True + Spawn: 3 + LockTeam: True + Team: 1 + Allies: Blue + Enemies: Creeps + PlayerReference@Multi3: + Name: Multi3 + Playable: True + Faction: Random + LockSpawn: True + Spawn: 4 + LockTeam: True + Team: 1 + Allies: Blue + Enemies: Creeps + PlayerReference@Multi4: + Name: Multi4 + Playable: True + Faction: Random + LockSpawn: True + Spawn: 5 + LockTeam: True + Team: 1 + Allies: Blue + Enemies: Creeps + PlayerReference@Multi5: + Name: Multi5 + Playable: True + Faction: Random + LockSpawn: True + Spawn: 6 + LockTeam: True + Team: 1 + Allies: Blue + Enemies: Creeps + PlayerReference@Multi6: + Name: Multi6 + Playable: True + Faction: Random + LockSpawn: True + Spawn: 7 + LockTeam: True + Team: 1 + Allies: Blue + Enemies: Creeps + PlayerReference@Multi7: + Name: Multi7 + Playable: True + Faction: Random + LockSpawn: True + Spawn: 8 + LockTeam: True + Team: 1 + Allies: Blue + Enemies: Creeps + PlayerReference@Multi8: + Name: Multi8 + Playable: True + Faction: Random + LockSpawn: True + Spawn: 9 + LockTeam: True + Team: 1 + Allies: Blue + Enemies: Creeps + PlayerReference@Multi9: + Name: Multi9 + Playable: True + Faction: Random + LockSpawn: True + Spawn: 10 + LockTeam: True + Team: 1 + Allies: Blue + Enemies: Creeps + PlayerReference@Multi10: + Name: Multi10 + Playable: True + Faction: Random + LockSpawn: True + Spawn: 11 + LockTeam: True + Team: 1 + Allies: Blue + Enemies: Creeps + PlayerReference@Multi11: + Name: Multi11 + Playable: True + Faction: Random + LockSpawn: True + Spawn: 12 + LockTeam: True + Team: 1 + Allies: Blue + Enemies: Creeps + PlayerReference@Multi12: + Name: Multi12 + Playable: True + Faction: Random + LockSpawn: True + Spawn: 13 + LockTeam: True + Team: 2 + Allies: Red + Enemies: Creeps + PlayerReference@Multi13: + Name: Multi13 + Playable: True + Faction: Random + LockSpawn: True + Spawn: 14 + LockTeam: True + Team: 2 + Allies: Red + Enemies: Creeps + PlayerReference@Multi14: + Name: Multi14 + Playable: True + Faction: Random + LockSpawn: True + Spawn: 15 + LockTeam: True + Team: 2 + Allies: Red + Enemies: Creeps + PlayerReference@Multi15: + Name: Multi15 + Playable: True + Faction: Random + LockSpawn: True + Spawn: 16 + LockTeam: True + Team: 2 + Allies: Red + Enemies: Creeps + PlayerReference@Multi16: + Name: Multi16 + Playable: True + Faction: Random + LockSpawn: True + Spawn: 17 + LockTeam: True + Team: 2 + Allies: Red + Enemies: Creeps + PlayerReference@Multi17: + Name: Multi17 + Playable: True + Faction: Random + LockSpawn: True + Spawn: 18 + LockTeam: True + Team: 2 + Allies: Red + Enemies: Creeps + PlayerReference@Multi18: + Name: Multi18 + Playable: True + Faction: Random + LockSpawn: True + Spawn: 19 + LockTeam: True + Team: 2 + Allies: Red + Enemies: Creeps + PlayerReference@Multi19: + Name: Multi19 + Playable: True + Faction: Random + LockSpawn: True + Spawn: 20 + LockTeam: True + Team: 2 + Allies: Red + Enemies: Creeps + PlayerReference@Multi20: + Name: Multi20 + Playable: True + Faction: Random + LockSpawn: True + Spawn: 21 + LockTeam: True + Team: 2 + Allies: Red + Enemies: Creeps + PlayerReference@Multi21: + Name: Multi21 + Playable: True + Faction: Random + LockSpawn: True + Spawn: 22 + LockTeam: True + Team: 2 + Allies: Red + Enemies: Creeps + PlayerReference@Multi22: + Name: Multi22 + Playable: True + Faction: Random + LockSpawn: True + Spawn: 23 + LockTeam: True + Team: 2 + Allies: Red + Enemies: Creeps + PlayerReference@Multi23: + Name: Multi23 + Playable: True + Faction: Random + LockSpawn: True + Spawn: 24 + LockTeam: True + Team: 2 + Allies: Red + Enemies: Creeps + +Actors: + Actor19: chain + Owner: Neutral + Location: 41,8 + Actor20: chain + Owner: Neutral + Location: 41,7 + Actor21: chain + Owner: Neutral + Location: 41,6 + Actor22: chain + Owner: Neutral + Location: 41,5 + Actor23: chain + Owner: Neutral + Location: 41,4 + Actor24: chain + Owner: Neutral + Location: 41,3 + Actor25: chain + Owner: Neutral + Location: 41,2 + Actor26: chain + Owner: Neutral + Location: 41,1 + Actor27: chain + Owner: Neutral + Location: 42,1 + Actor28: chain + Owner: Neutral + Location: 44,1 + Actor29: chain + Owner: Neutral + Location: 43,1 + Actor30: chain + Owner: Neutral + Location: 45,1 + Actor31: chain + Owner: Neutral + Location: 46,1 + Actor32: chain + Owner: Neutral + Location: 56,7 + Actor34: chain + Owner: Neutral + Location: 56,8 + Actor35: chain + Owner: Neutral + Location: 56,6 + Actor36: chain + Owner: Neutral + Location: 56,5 + Actor37: chain + Owner: Neutral + Location: 56,4 + Actor38: chain + Owner: Neutral + Location: 56,3 + Actor39: chain + Owner: Neutral + Location: 56,1 + Actor40: chain + Owner: Neutral + Location: 56,2 + Actor41: chain + Owner: Neutral + Location: 55,1 + Actor42: chain + Owner: Neutral + Location: 53,1 + Actor43: chain + Owner: Neutral + Location: 54,1 + Actor44: chain + Owner: Neutral + Location: 52,1 + Actor45: chain + Owner: Neutral + Location: 51,1 + Actor46: chain + Owner: Neutral + Location: 50,1 + Actor47: chain + Owner: Neutral + Location: 47,1 + Actor48: chain + Owner: Neutral + Location: 48,1 + Actor49: chain + Owner: Neutral + Location: 49,1 + Actor50: chain + Owner: Neutral + Location: 41,89 + Actor51: chain + Owner: Neutral + Location: 41,91 + Actor52: chain + Owner: Neutral + Location: 41,90 + Actor53: chain + Owner: Neutral + Location: 41,92 + Actor54: chain + Owner: Neutral + Location: 41,94 + Actor55: chain + Owner: Neutral + Location: 41,93 + Actor56: chain + Owner: Neutral + Location: 41,95 + Actor57: chain + Owner: Neutral + Location: 41,96 + Actor58: chain + Owner: Neutral + Location: 42,96 + Actor59: chain + Owner: Neutral + Location: 44,96 + Actor60: chain + Owner: Neutral + Location: 44,96 + Actor61: chain + Owner: Neutral + Location: 43,96 + Actor62: chain + Owner: Neutral + Location: 46,96 + Actor63: chain + Owner: Neutral + Location: 45,96 + Actor64: chain + Owner: Neutral + Location: 47,96 + Actor65: chain + Owner: Neutral + Location: 48,96 + Actor66: chain + Owner: Neutral + Location: 49,96 + Actor67: chain + Owner: Neutral + Location: 50,96 + Actor68: chain + Owner: Neutral + Location: 52,96 + Actor69: chain + Owner: Neutral + Location: 51,96 + Actor70: chain + Owner: Neutral + Location: 53,96 + Actor71: chain + Owner: Neutral + Location: 54,96 + Actor72: chain + Owner: Neutral + Location: 55,96 + Actor73: chain + Owner: Neutral + Location: 56,96 + Actor74: chain + Owner: Neutral + Location: 56,96 + Actor75: chain + Owner: Neutral + Location: 56,89 + Actor76: chain + Owner: Neutral + Location: 56,91 + Actor77: chain + Owner: Neutral + Location: 56,90 + Actor78: chain + Owner: Neutral + Location: 56,92 + Actor79: chain + Owner: Neutral + Location: 56,94 + Actor80: chain + Owner: Neutral + Location: 56,93 + Actor81: chain + Owner: Neutral + Location: 56,95 + Dome: dome + Owner: Neutral + Location: 48,73 + Comms: hq + Owner: Neutral + Location: 48,22 + Ref: proc + Owner: Neutral + FreeActor@CHARV: False + FreeActor: False + Location: 4,47 + Power: apwr + Owner: Neutral + Location: 91,47 + Spawn1: mpspawn + Owner: Neutral + Location: 43,3 + Spawn2: mpspawn + Owner: Neutral + Location: 45,3 + Spawn3: mpspawn + Owner: Neutral + Location: 47,3 + Spawn4: mpspawn + Owner: Neutral + Location: 49,3 + Spawn5: mpspawn + Owner: Neutral + Location: 51,3 + Spawn6: mpspawn + Owner: Neutral + Location: 53,3 + Spawn7: mpspawn + Owner: Neutral + Location: 44,5 + Spawn8: mpspawn + Owner: Neutral + Location: 46,5 + Spawn9: mpspawn + Owner: Neutral + Location: 48,5 + Spawn10: mpspawn + Owner: Neutral + Location: 50,5 + Spawn11: mpspawn + Owner: Neutral + Location: 52,5 + Spawn12: mpspawn + Owner: Neutral + Location: 54,5 + Spawn13: mpspawn + Owner: Neutral + Location: 43,92 + Spawn14: mpspawn + Owner: Neutral + Location: 45,92 + Spawn15: mpspawn + Owner: Neutral + Location: 47,92 + Spawn16: mpspawn + Owner: Neutral + Location: 49,92 + Spawn17: mpspawn + Owner: Neutral + Location: 51,92 + Spawn18: mpspawn + Owner: Neutral + Location: 53,92 + Spawn19: mpspawn + Owner: Neutral + Location: 44,94 + Spawn20: mpspawn + Owner: Neutral + Location: 46,94 + Spawn21: mpspawn + Owner: Neutral + Location: 48,94 + Spawn22: mpspawn + Owner: Neutral + Location: 50,94 + Spawn23: mpspawn + Owner: Neutral + Location: 52,94 + Spawn24: mpspawn + Owner: Neutral + Location: 54,94 + Actor110: brik + Owner: Neutral + Location: 48,43 + Actor111: brik + Owner: Neutral + Location: 47,43 + Actor112: brik + Owner: Neutral + Location: 46,43 + Actor113: brik + Owner: Neutral + Location: 49,43 + Actor114: brik + Owner: Neutral + Location: 50,43 + Actor115: brik + Owner: Neutral + Location: 51,43 + Actor116: brik + Owner: Neutral + Location: 52,43 + Actor117: brik + Owner: Neutral + Location: 46,53 + Actor118: brik + Owner: Neutral + Location: 47,53 + Actor119: brik + Owner: Neutral + Location: 48,53 + Actor120: brik + Owner: Neutral + Location: 49,53 + Actor121: brik + Owner: Neutral + Location: 50,53 + Actor122: brik + Owner: Neutral + Location: 51,53 + Actor123: brik + Owner: Neutral + Location: 52,53 + Actor124: brik + Owner: Neutral + Location: 45,43 + Actor125: brik + Owner: Neutral + Location: 45,44 + Actor126: brik + Owner: Neutral + Location: 52,44 + Actor127: brik + Owner: Neutral + Location: 45,53 + Actor128: brik + Owner: Neutral + Location: 45,52 + Actor129: brik + Owner: Neutral + Location: 53,53 + Actor130: brik + Owner: Neutral + Location: 53,52 + Actor131: brik + Owner: Neutral + Location: 53,44 + Actor132: brik + Owner: Neutral + Location: 53,43 + Actor133: brik + Owner: Neutral + Location: 46,44 + Actor134: brik + Owner: Neutral + Location: 46,52 + Actor135: brik + Owner: Neutral + Location: 52,52 + Actor136: brik + Owner: Neutral + Location: 40,46 + Actor140: brik + Owner: Neutral + Location: 58,46 + Actor145: brik + Owner: Neutral + Location: 41,46 + Actor147: brik + Owner: Neutral + Location: 57,46 + Actor148: brik + Owner: Neutral + Location: 57,45 + Actor149: brik + Owner: Neutral + Location: 58,45 + Actor150: brik + Owner: Neutral + Location: 57,50 + Actor151: brik + Owner: Neutral + Location: 58,50 + Actor152: brik + Owner: Neutral + Location: 40,50 + Actor153: brik + Owner: Neutral + Location: 41,50 + Actor154: brik + Owner: Neutral + Location: 40,45 + Actor155: brik + Owner: Neutral + Location: 41,45 + Actor156: sbag + Owner: Neutral + Location: 96,49 + Actor157: sbag + Owner: Neutral + Location: 96,48 + Actor158: sbag + Owner: Neutral + Location: 96,47 + Actor159: sbag + Owner: Neutral + Location: 96,46 + Actor160: sbag + Owner: Neutral + Location: 96,50 + Actor161: sbag + Owner: Neutral + Location: 96,51 + Actor162: sbag + Owner: Neutral + Location: 96,52 + Actor163: sbag + Owner: Neutral + Location: 96,53 + Actor164: sbag + Owner: Neutral + Location: 96,45 + Actor165: sbag + Owner: Neutral + Location: 96,44 + Actor166: sbag + Owner: Neutral + Location: 96,43 + Actor167: sbag + Owner: Neutral + Location: 96,42 + Actor168: sbag + Owner: Neutral + Location: 95,42 + Actor169: sbag + Owner: Neutral + Location: 94,42 + Actor170: sbag + Owner: Neutral + Location: 93,42 + Actor171: sbag + Owner: Neutral + Location: 95,53 + Actor172: sbag + Owner: Neutral + Location: 94,53 + Actor173: sbag + Owner: Neutral + Location: 93,53 + Actor174: sbag + Owner: Neutral + Location: 87,53 + Actor175: sbag + Owner: Neutral + Location: 86,53 + Actor176: sbag + Owner: Neutral + Location: 85,53 + Actor177: sbag + Owner: Neutral + Location: 84,53 + Actor178: sbag + Owner: Neutral + Location: 84,52 + Actor179: sbag + Owner: Neutral + Location: 84,51 + Actor180: sbag + Owner: Neutral + Location: 84,50 + Actor181: sbag + Owner: Neutral + Location: 84,49 + Actor182: sbag + Owner: Neutral + Location: 84,48 + Actor183: sbag + Owner: Neutral + Location: 84,47 + Actor184: sbag + Owner: Neutral + Location: 84,46 + Actor185: sbag + Owner: Neutral + Location: 84,45 + Actor186: sbag + Owner: Neutral + Location: 84,44 + Actor187: sbag + Owner: Neutral + Location: 84,43 + Actor188: sbag + Owner: Neutral + Location: 84,42 + Actor189: sbag + Owner: Neutral + Location: 85,42 + Actor190: sbag + Owner: Neutral + Location: 86,42 + Actor191: sbag + Owner: Neutral + Location: 87,42 + Actor192: chain + Owner: Neutral + Location: 4,45 + Actor193: chain + Owner: Neutral + Location: 5,45 + Actor194: chain + Owner: Neutral + Location: 6,45 + Actor195: chain + Owner: Neutral + Location: 4,52 + Actor196: chain + Owner: Neutral + Location: 5,52 + Actor197: chain + Owner: Neutral + Location: 6,52 + Actor198: chain + Owner: Neutral + Location: 3,45 + Actor199: chain + Owner: Neutral + Location: 2,45 + Actor200: chain + Owner: Neutral + Location: 1,45 + Actor201: chain + Owner: Neutral + Location: 1,52 + Actor202: chain + Owner: Neutral + Location: 2,52 + Actor203: chain + Owner: Neutral + Location: 3,52 + Actor204: chain + Owner: Neutral + Location: 1,51 + Actor205: chain + Owner: Neutral + Location: 1,50 + Actor206: chain + Owner: Neutral + Location: 1,49 + Actor207: chain + Owner: Neutral + Location: 1,48 + Actor208: chain + Owner: Neutral + Location: 1,47 + Actor209: chain + Owner: Neutral + Location: 1,46 + Actor210: chain + Owner: Neutral + Location: 12,45 + Actor211: chain + Owner: Neutral + Location: 13,45 + Actor212: chain + Owner: Neutral + Location: 14,45 + Actor213: chain + Owner: Neutral + Location: 15,45 + Actor214: chain + Owner: Neutral + Location: 15,46 + Actor215: chain + Owner: Neutral + Location: 15,47 + Actor216: chain + Owner: Neutral + Location: 15,48 + Actor217: chain + Owner: Neutral + Location: 14,48 + Actor218: chain + Owner: Neutral + Location: 14,49 + Actor219: chain + Owner: Neutral + Location: 14,50 + Actor220: chain + Owner: Neutral + Location: 14,51 + Actor221: chain + Owner: Neutral + Location: 14,52 + Actor222: chain + Owner: Neutral + Location: 13,52 + Actor223: chain + Owner: Neutral + Location: 12,52 + Actor224: wood + Owner: Neutral + Location: 48,71 + Actor225: wood + Owner: Neutral + Location: 49,71 + Actor226: wood + Owner: Neutral + Location: 47,71 + Actor227: wood + Owner: Neutral + Location: 50,71 + Actor228: wood + Owner: Neutral + Location: 46,71 + Actor229: wood + Owner: Neutral + Location: 45,71 + Actor230: wood + Owner: Neutral + Location: 51,71 + Actor231: wood + Owner: Neutral + Location: 52,71 + Actor232: wood + Owner: Neutral + Location: 48,26 + Actor233: wood + Owner: Neutral + Location: 47,26 + Actor234: wood + Owner: Neutral + Location: 49,26 + Actor235: wood + Owner: Neutral + Location: 50,26 + Actor236: wood + Owner: Neutral + Location: 51,26 + Actor237: wood + Owner: Neutral + Location: 52,26 + Actor238: wood + Owner: Neutral + Location: 46,26 + Actor239: wood + Owner: Neutral + Location: 45,26 + Actor240: wood + Owner: Neutral + Location: 45,72 + Actor241: wood + Owner: Neutral + Location: 45,73 + Actor242: wood + Owner: Neutral + Location: 52,72 + Actor243: wood + Owner: Neutral + Location: 52,73 + Actor244: wood + Owner: Neutral + Location: 45,25 + Actor245: wood + Owner: Neutral + Location: 45,24 + Actor246: wood + Owner: Neutral + Location: 52,25 + Actor247: wood + Owner: Neutral + Location: 52,24 + Actor248: wood + Owner: Neutral + Location: 48,19 + Actor249: wood + Owner: Neutral + Location: 49,19 + Actor250: wood + Owner: Neutral + Location: 47,19 + Actor251: wood + Owner: Neutral + Location: 46,19 + Actor252: wood + Owner: Neutral + Location: 45,19 + Actor253: wood + Owner: Neutral + Location: 50,19 + Actor254: wood + Owner: Neutral + Location: 51,19 + Actor255: wood + Owner: Neutral + Location: 52,19 + Actor256: wood + Owner: Neutral + Location: 48,78 + Actor257: wood + Owner: Neutral + Location: 47,78 + Actor258: wood + Owner: Neutral + Location: 46,78 + Actor259: wood + Owner: Neutral + Location: 45,78 + Actor260: wood + Owner: Neutral + Location: 50,78 + Actor261: wood + Owner: Neutral + Location: 49,78 + Actor262: wood + Owner: Neutral + Location: 51,78 + Actor263: wood + Owner: Neutral + Location: 52,78 + Actor264: wood + Owner: Neutral + Location: 52,77 + Actor265: wood + Owner: Neutral + Location: 45,77 + Actor266: wood + Owner: Neutral + Location: 45,20 + Actor267: wood + Owner: Neutral + Location: 52,20 + Actor268: brl3 + Owner: Creeps + Location: 89,48 + Actor269: brl3 + Owner: Creeps + Location: 95,48 + Actor270: barl + Owner: Creeps + Location: 90,48 + Actor271: barl + Owner: Creeps + Location: 94,48 + Actor272: brik + Owner: Neutral + Location: 40,57 + Actor273: brik + Owner: Neutral + Location: 40,58 + Actor274: brik + Owner: Neutral + Location: 41,57 + Actor275: brik + Owner: Neutral + Location: 41,58 + Actor277: brik + Owner: Neutral + Location: 57,38 + Actor278: brik + Owner: Neutral + Location: 57,39 + Actor280: brik + Owner: Neutral + Location: 58,55 + Actor281: brik + Owner: Neutral + Location: 58,56 + Actor286: brik + Owner: Neutral + Location: 40,40 + Actor287: brik + Owner: Neutral + Location: 40,41 + Actor288: brik + Owner: Neutral + Location: 66,44 + Actor289: brik + Owner: Neutral + Location: 65,44 + Actor290: brik + Owner: Neutral + Location: 65,45 + Actor291: brik + Owner: Neutral + Location: 66,45 + Actor292: brik + Owner: Neutral + Location: 31,52 + Actor293: brik + Owner: Neutral + Location: 31,51 + Actor294: brik + Owner: Neutral + Location: 32,51 + Actor295: brik + Owner: Neutral + Location: 32,52 + Actor296: tc02 + Owner: Neutral + Location: 24,40 + Actor297: tc02 + Owner: Neutral + Location: 72,53 + Actor298: tc01 + Owner: Neutral + Location: 78,44 + Actor299: tc01 + Owner: Neutral + Location: 18,51 + Actor300: t01 + Owner: Neutral + Location: 86,56 + Actor301: t01 + Owner: Neutral + Location: 10,38 + Actor302: t15 + Owner: Neutral + Location: 12,57 + Actor303: t15 + Owner: Neutral + Location: 83,37 + Actor304: t02 + Owner: Neutral + Location: 90,28 + Actor305: t02 + Owner: Neutral + Location: 9,66 + Actor306: t03 + Owner: Neutral + Location: 72,33 + Actor307: t03 + Owner: Neutral + Location: 25,60 + Actor308: t17 + Owner: Neutral + Location: 58,69 + Actor309: t17 + Owner: Neutral + Location: 39,24 + Actor310: t02 + Owner: Neutral + Location: 60,22 + Actor311: t02 + Owner: Neutral + Location: 38,72 + Actor312: t13 + Owner: Neutral + Location: 23,74 + Actor313: t13 + Owner: Neutral + Location: 75,20 + Actor314: tc04 + Owner: Neutral + Location: 71,68 + Actor315: tc04 + Owner: Neutral + Location: 26,25 + Actor316: t07 + Owner: Neutral + Location: 69,71 + Actor317: t07 + Owner: Neutral + Location: 30,22 + Actor318: t13 + Owner: Neutral + Location: 7,22 + Actor319: t13 + Owner: Neutral + Location: 88,73 + Actor320: tc01 + Owner: Neutral + Location: 79,79 + Actor321: tc01 + Owner: Neutral + Location: 19,16 + Actor322: t16 + Owner: Neutral + Location: 87,17 + Actor323: t16 + Owner: Neutral + Location: 9,78 + Actor324: tc02 + Owner: Neutral + Location: 6,76 + Actor325: tc02 + Owner: Neutral + Location: 89,19 + Actor326: tc02 + Owner: Neutral + Location: 89,19 + Tech: atek + Owner: Neutral + Location: 48,47 + Actor327: spawngun + Owner: Red + Location: 41,85 + TurretFacing: 0 + Actor328: spawngun + Owner: Red + Location: 56,85 + TurretFacing: 0 + Actor329: spawngun + Owner: Red + Location: 46,85 + TurretFacing: 0 + Actor330: spawngun + Owner: Red + Location: 51,85 + TurretFacing: 0 + Actor331: spawngun + Location: 41,12 + Owner: Blue + TurretFacing: 512 + Actor332: spawngun + Location: 46,12 + Owner: Blue + TurretFacing: 512 + Actor333: spawngun + Location: 51,12 + Owner: Blue + TurretFacing: 512 + Actor334: spawngun + Location: 56,12 + Owner: Blue + TurretFacing: 512 + Actor335: spawngun + Owner: Blue + TurretFacing: 512 + Location: 38,9 + Actor336: spawngun + Owner: Blue + TurretFacing: 512 + Location: 59,9 + Actor337: spawngun + Owner: Red + TurretFacing: 0 + Location: 38,88 + Actor338: spawngun + Owner: Red + TurretFacing: 0 + Location: 59,88 + Actor339: brik + Owner: Neutral + Location: 93,43 + Actor340: brik + Owner: Neutral + Location: 94,43 + Actor341: brik + Owner: Neutral + Location: 95,43 + Actor342: brik + Owner: Neutral + Location: 93,44 + Actor343: brik + Owner: Neutral + Location: 94,44 + Actor344: brik + Owner: Neutral + Location: 95,44 + Actor345: brik + Owner: Neutral + Location: 93,52 + Actor346: brik + Owner: Neutral + Location: 94,52 + Actor347: brik + Owner: Neutral + Location: 95,52 + Actor348: brik + Owner: Neutral + Location: 95,51 + Actor349: brik + Owner: Neutral + Location: 94,51 + Actor350: brik + Owner: Neutral + Location: 93,51 + Actor351: brik + Owner: Neutral + Location: 85,52 + Actor352: brik + Owner: Neutral + Location: 85,51 + Actor353: brik + Owner: Neutral + Location: 86,51 + Actor354: brik + Owner: Neutral + Location: 86,52 + Actor355: brik + Owner: Neutral + Location: 87,52 + Actor356: brik + Owner: Neutral + Location: 87,51 + Actor357: brik + Owner: Neutral + Location: 85,43 + Actor358: brik + Owner: Neutral + Location: 85,44 + Actor359: brik + Owner: Neutral + Location: 86,43 + Actor360: brik + Owner: Neutral + Location: 86,44 + Actor361: brik + Owner: Neutral + Location: 87,43 + Actor362: brik + Owner: Neutral + Location: 87,44 + Actor363: brik + Owner: Neutral + Location: 1,53 + Actor364: brik + Owner: Neutral + Location: 2,53 + Actor365: brik + Owner: Neutral + Location: 1,54 + Actor366: brik + Owner: Neutral + Location: 2,54 + Actor367: brik + Owner: Neutral + Location: 3,53 + Actor368: brik + Owner: Neutral + Location: 4,53 + Actor369: brik + Owner: Neutral + Location: 6,53 + Actor370: brik + Owner: Neutral + Location: 5,53 + Actor371: brik + Owner: Neutral + Location: 6,54 + Actor372: brik + Owner: Neutral + Location: 5,54 + Actor373: brik + Owner: Neutral + Location: 1,44 + Actor374: brik + Owner: Neutral + Location: 1,43 + Actor375: brik + Owner: Neutral + Location: 2,44 + Actor376: brik + Owner: Neutral + Location: 2,43 + Actor377: brik + Owner: Neutral + Location: 3,44 + Actor378: brik + Owner: Neutral + Location: 4,44 + Actor379: brik + Owner: Neutral + Location: 5,44 + Actor380: brik + Owner: Neutral + Location: 6,44 + Actor381: brik + Owner: Neutral + Location: 6,43 + Actor382: brik + Owner: Neutral + Location: 5,43 + Actor383: brik + Owner: Neutral + Location: 18,47 + Actor384: brik + Owner: Neutral + Location: 18,48 + Actor385: brik + Owner: Neutral + Location: 19,47 + Actor386: brik + Owner: Neutral + Location: 19,48 + Actor387: brik + Owner: Neutral + Location: 24,47 + Actor388: brik + Owner: Neutral + Location: 24,48 + Actor389: brik + Owner: Neutral + Location: 23,48 + Actor390: brik + Owner: Neutral + Location: 23,47 + Actor391: brik + Owner: Neutral + Location: 73,48 + Actor392: brik + Owner: Neutral + Location: 73,49 + Actor393: brik + Owner: Neutral + Location: 74,48 + Actor394: brik + Owner: Neutral + Location: 74,49 + Actor395: brik + Owner: Neutral + Location: 79,48 + Actor396: brik + Owner: Neutral + Location: 78,48 + Actor397: brik + Owner: Neutral + Location: 78,49 + Actor398: brik + Owner: Neutral + Location: 79,49 + Actor399: brik + Owner: Neutral + Location: 24,63 + Actor400: brik + Owner: Neutral + Location: 25,63 + Actor401: brik + Owner: Neutral + Location: 25,64 + Actor402: brik + Owner: Neutral + Location: 24,64 + Actor403: brik + Owner: Neutral + Location: 72,32 + Actor404: brik + Owner: Neutral + Location: 72,31 + Actor405: brik + Owner: Neutral + Location: 73,31 + Actor406: brik + Owner: Neutral + Location: 73,32 + Actor407: brik + Owner: Neutral + Location: 87,69 + Actor408: brik + Owner: Neutral + Location: 86,69 + Actor409: brik + Owner: Neutral + Location: 86,68 + Actor410: brik + Owner: Neutral + Location: 87,68 + Actor411: brik + Owner: Neutral + Location: 19,29 + Actor412: brik + Owner: Neutral + Location: 18,29 + Actor413: brik + Owner: Neutral + Location: 18,30 + Actor414: brik + Owner: Neutral + Location: 19,30 + Actor415: brik + Owner: Neutral + Location: 44,71 + Actor416: brik + Owner: Neutral + Location: 43,71 + Actor417: brik + Owner: Neutral + Location: 43,72 + Actor418: brik + Owner: Neutral + Location: 44,72 + Actor419: brik + Owner: Neutral + Location: 53,71 + Actor420: brik + Owner: Neutral + Location: 53,72 + Actor421: brik + Owner: Neutral + Location: 54,72 + Actor422: brik + Owner: Neutral + Location: 54,71 + Actor423: brik + Owner: Neutral + Location: 54,70 + Actor424: brik + Owner: Neutral + Location: 55,70 + Actor425: brik + Owner: Neutral + Location: 55,71 + Actor426: brik + Owner: Neutral + Location: 43,70 + Actor427: brik + Owner: Neutral + Location: 42,70 + Actor428: brik + Owner: Neutral + Location: 42,71 + Actor429: brik + Owner: Neutral + Location: 44,25 + Actor430: brik + Owner: Neutral + Location: 44,26 + Actor431: brik + Owner: Neutral + Location: 43,26 + Actor432: brik + Owner: Neutral + Location: 43,25 + Actor433: brik + Owner: Neutral + Location: 43,27 + Actor434: brik + Owner: Neutral + Location: 42,26 + Actor435: brik + Owner: Neutral + Location: 42,27 + Actor436: brik + Owner: Neutral + Location: 53,25 + Actor437: brik + Owner: Neutral + Location: 53,26 + Actor438: brik + Owner: Neutral + Location: 54,25 + Actor439: brik + Owner: Neutral + Location: 54,26 + Actor440: brik + Owner: Neutral + Location: 54,27 + Actor441: brik + Owner: Neutral + Location: 55,26 + Actor442: brik + Owner: Neutral + Location: 55,27 + Actor449: brik + Owner: Neutral + Location: 58,39 + Actor450: brik + Owner: Neutral + Location: 58,38 + Actor443: brik + Owner: Neutral + Location: 41,51 + Actor444: brik + Owner: Neutral + Location: 40,51 + Actor445: brik + Owner: Neutral + Location: 57,51 + Actor446: brik + Owner: Neutral + Location: 58,51 + Actor447: brik + Owner: Neutral + Location: 57,55 + Actor448: brik + Owner: Neutral + Location: 57,56 + Actor451: brik + Owner: Neutral + Location: 41,40 + Actor452: brik + Owner: Neutral + Location: 41,41 + Actor453: brik + Owner: Neutral + Location: 40,42 + Actor454: brik + Owner: Neutral + Location: 40,43 + Actor455: brik + Owner: Neutral + Location: 40,44 + Actor456: brik + Owner: Neutral + Location: 58,52 + Actor457: brik + Owner: Neutral + Location: 58,53 + Actor458: brik + Owner: Neutral + Location: 58,54 + Dome2: waypoint + Owner: Neutral + Location: 46,77 + Dome3: waypoint + Owner: Neutral + Location: 51,77 + Comms1: waypoint + Owner: Neutral + Location: 46,20 + Comms2: waypoint + Owner: Neutral + Location: 51,20 + Ref1: waypoint + Owner: Neutral + Location: 8,49 + Blue1: waypoint + Owner: Neutral + Location: 63,35 + Red1: waypoint + Owner: Neutral + Location: 35,61 + Ref2: waypoint + Owner: Neutral + Location: 12,47 + Power3: waypoint + Owner: Neutral + Location: 90,51 + Power1: waypoint + Owner: Neutral + Location: 90,45 + Power2: waypoint + Owner: Neutral + Location: 88,48 + Ref3: waypoint + Owner: Neutral + Location: 9,52 + Dome4: waypoint + Owner: Neutral + Location: 54,74 + Dome1: waypoint + Owner: Neutral + Location: 43,74 + Tech1: waypoint + Owner: Neutral + Location: 46,46 + Tech2: waypoint + Owner: Neutral + Location: 46,50 + Tech4: waypoint + Owner: Neutral + Location: 51,50 + Tech3: waypoint + Owner: Neutral + Location: 51,46 + Ref5: waypoint + Owner: Neutral + Location: 11,50 + Ref4: waypoint + Owner: Neutral + Location: 9,46 + Comms3: waypoint + Owner: Neutral + Location: 43,22 + Comms4: waypoint + Owner: Neutral + Location: 54,22 + +Rules: tfca-rules-base.yaml + +Sequences: tfca-sequences.yaml + +Weapons: tfca-weapons.yaml diff --git a/mods/ca/maps/tfca/tfca-rules-base.yaml b/mods/ca/maps/tfca/tfca-rules-base.yaml new file mode 100644 index 0000000000..892baf1c51 --- /dev/null +++ b/mods/ca/maps/tfca/tfca-rules-base.yaml @@ -0,0 +1,857 @@ +World: + MissionData: + Briefing: ================\n\n- Two teams must fight over five objectives.\n-------------------------\n- Players have a set number of credits, refunded when a unit is lost so it can be replaced.\n-------------------------\n- Faction choice has no effect.\n-------------------------\n- Any unit can capture an objective.\n-------------------------\n- Points are gained by holding objectives.\n-------------------------\n- First team to reach the configured score wins.\n\n================\n + LuaScript: + Scripts: tfca.lua + StartingUnits@none: + Class: none + ClassName: None + BaseActor: spawn + Factions: allies, england, france, germany, usa, soviet, russia, ukraine, iraq, yuri, gdi, talon, zocom, eagle, arc, nod, blackh, marked, legion, shadow, scrin, reaper, traveler, harbinger, collector + -StartingUnits@mcvonly: + -StartingUnits@lightallies: + -StartingUnits@lightsoviet: + -StartingUnits@heavyallies: + -StartingUnits@heavysoviet: + -StartingUnits@mcvonly2: + -StartingUnits@defaultgdia: + -StartingUnits@defaultnoda: + -StartingUnits@heavynoda: + -StartingUnits@heavygdia: + -StartingUnits@mcvonlyscrin: + -StartingUnits@lightscrin: + -StartingUnits@heavyscrin: + SpawnStartingUnits: + DropdownVisible: False + MapBuildRadius: + AllyBuildRadiusCheckboxVisible: False + BuildRadiusCheckboxVisible: False + MapOptions: + TechLevelDropdownVisible: False + ShortGameCheckboxEnabled: True + ShortGameCheckboxLocked: True + ShortGameCheckboxVisible: False + CrateSpawner: + CheckboxEnabled: False + CheckboxLocked: True + CheckboxVisible: False + MapStartingLocations: + SeparateTeamSpawnsCheckboxVisible: False + TimeLimitManager: + TimeLimitLocked: True + TimeLimitDropdownVisible: False + ScriptLobbyDropdown@UNITSPERPLAYER: + ID: unitsperplayer + Label: Units Per Player + Description: Number of units each player can build + Values: + 1: 1 + 2: 2 + 3: 3 + 4: 4 + 5: 5 + 6: 6 + 7: 7 + 8: 8 + 9: 9 + 10: 10 + 11: 11 + 12: 12 + 13: 13 + 14: 14 + 15: 15 + Default: 4 + ScriptLobbyDropdown@WINSCORE: + ID: winscore + Label: Score Required + Description: Points required to win the game + Values: + 1000: 1000 + 1500: 1500 + 2000: 2000 + 2500: 2500 + 3000: 3000 + Default: 1500 + +Player: + ConquestVictoryConditions: + PlayerResources: + SelectableCash: 0 + DefaultCash: 0 + DefaultCashDropdownVisible: False + LobbyPrerequisiteCheckbox@GLOBALBOUNTY: + Enabled: False + Locked: True + Visible: False + LobbyPrerequisiteCheckbox@FORCESHIELD: + Enabled: False + Visible: False + DeveloperMode: + CheckboxLocked: True + CheckboxVisible: False + LobbyPrerequisiteCheckbox@GLOBALFACTUNDEPLOY: + Visible: False + LobbyPrerequisiteCheckbox@NAVY: + Visible: False + LobbyPrerequisiteCheckbox@BALANCEDHARVESTING: + Visible: False + LobbyPrerequisiteCheckbox@FASTREGROWTH: + Visible: False + LobbyPrerequisiteCheckbox@REVEALONFIRE: + Enabled: False + Locked: True + Visible: False + LobbyPrerequisiteDropdown@QUEUETYPE: + Default: global.singlequeue + Visible: False + Values: + global.singlequeue: options-queuetype.singlequeue + Shroud: + ExploredMapCheckboxEnabled: True + ExploredMapCheckboxVisible: True + ExploredMapCheckboxLocked: False + LobbyPrerequisiteCheckbox@SHOWNAMES: + ID: shownames + Label: Show Names + Description: Show name tags above each unit + Enabled: True + DisplayOrder: 999 + Prerequisites: global.shownames + ModularBot@StandardAI: + Name: Bot + Type: bot + -ModularBot@BrutalAI: + -ModularBot@VeryHardAI: + -ModularBot@HardAI: + -ModularBot@NormalAI: + -ModularBot@EasyAI: + -ModularBot@NavalAI: + LobbyPrerequisiteCheckbox@BALANCEUNITS: + ID: balanceunits + Label: Balance Units + Description: Give extra units to team with fewer players + Enabled: True + DisplayOrder: 999 + Prerequisites: global.balanceunits + +SPAWN: + Inherits: CAMERA + Inherits@PROD: ^ProducesInfantry + Tooltip: + Name: Spawn Point + Exit: + ProvidesPrerequisite: + WithSpriteBody: + -RenderSpritesEditorOnly: + RenderSprites: + Image: shab + WithIdleAnimation: + Sequences: idle + Interval: 25 + Production@SQINF: + -PauseOnCondition: + Production@MQINF: + -PauseOnCondition: + ProvidesRadar: + ScriptTriggers: + MustBeDestroyed: + RequiredForShortGame: true + +^Soldier: + TakeCover: + DamageModifiers: + Prone50Percent: 75 + +^TFUnit: + WithNameTagDecorationCA: + Position: Top + Font: Regular + Margin: 0, -20 + ColorSource: Player + ContrastColorLight: 000000 + ValidRelationships: Ally, Enemy, Neutral + RequiresCondition: shownames + GrantConditionOnPrerequisite@SHOWNAMES: + Condition: shownames + Prerequisites: global.shownames + WithColoredSelectionBox@REL: + ColorSource: Team + ValidRelationships: Ally, Enemy, Neutral + Buildable: + Prerequisites: spawn + BuildAtProductionType: Soldier + BuildDuration: 5 + BuildDurationModifier: 100 + Valued: + Cost: 1 + CaptureManager: + Captures: + CaptureTypes: building + CaptureDelay: 225 + ConsumedByCapture: false + ExternalCondition@SHIELDED: + Condition: shielded + WithColoredOverlay@SHIELDED: + Color: 00ffbb99 + RequiresCondition: shielded + DamageMultiplier@SHIELDED: + RequiresCondition: shielded + Modifier: 65 + ChangesHealth@SHIELDED: + Step: 750 + Delay: 25 + StartIfBelow: 100 + RequiresCondition: shielded + FirepowerMultiplier@ENGIBUFF: + RequiresCondition: engibuff + Modifier: 115 + ExternalCondition@ENGIBUFF: + Condition: engibuff + +XO: + Inherits@TFUNIT: ^TFUnit + Buildable: + Description: Armoured suit with dual chainguns. + BuildPaletteOrder: 6 + Queue: InfantrySQ, InfantryMQ + BuildAtProductionType: Soldier + TooltipExtras: + Strengths: • Durable\n• Self repairs + Weaknesses: • Slow\n• Must wind up to full damage + Mobile: + Speed: 75 + RevealsShroud: + Range: 8c0 + Health: + HP: 80000 + Armor: + Type: None + Armament@PRIMARY: + Weapon: MGattG + LocalOffset: 400,-220,180, 400,220,180 + MuzzleSequence: muzzle + -Armament@SECONDARY: + GrantConditionOnAttack@SPIN: + ArmamentNames: primary + Condition: spinning + RequiredShotsPerInstance: 1,2,4 + MaximumInstances: 3 + RevokeDelay: 40 + RevokeOnNewTarget: False + RevokeAll: True + GrantConditionOnAttackCA@FIRE: + ArmamentNames: primary + Condition: firing + RevokeDelay: 6 + FirepowerMultiplier@GAT1: + Modifier: 115 + RequiresCondition: spinning == 1 + FirepowerMultiplier@GAT2: + Modifier: 130 + RequiresCondition: spinning == 2 + FirepowerMultiplier@GAT3: + Modifier: 145 + RequiresCondition: spinning >= 3 + AmbientSoundCA@ATTACKSOUND1: + SoundFiles: vgatlo2a.aud, vgatlo2b.aud, vgatlo2c.aud + RequiresCondition: firing && spinning == 1 + AmbientSoundCA@ATTACKSOUND2: + InitialSound: vgatlo4a.aud + SoundFiles: vgatlo5a.aud, vgatlo5b.aud + RequiresCondition: firing && spinning == 2 + AmbientSoundCA@ATTACKSOUND3: + InitialSound: vgatlo7a.aud + SoundFiles: vgatlo8a.aud, vgatlo8b.aud + RequiresCondition: firing && spinning >= 3 + Targetable@HEAL: + TargetTypes: Heal + RequiresCondition: damaged + -Targetable@REPAIR: + -GrantConditionOnHealingReceived@REPAIRCOOLDOWN: + ChangesHealth@DEFAULT: + PercentageStep: 1 + Delay: 25 + StartIfBelow: 100 + DamageCooldown: 150 + +E3: + Inherits@TFUNIT: ^TFUnit + Buildable: + Description: Soldier armed with a rocket launcher. + BuildPaletteOrder: 3 + TooltipExtras: + Strengths: • Good all-round damage dealer\n• Guided projectiles\n• Decent HP + Weaknesses: • Mediocre rate of fire\n• Slow projectiles + Attributes: • Frenzy ability + Mobile: + Speed: 100 + RevealsShroud: + Range: 8c0 + Health: + HP: 25000 + ReloadAmmoPool: + Delay: 10 + Armament@PRIMARY: + Weapon: Dragon + -Armament@PRIMARYUPG: + -Armament@SECONDARY: + -Armament@SECONDARYUPG: + -Armament@BATF: + -Armament@BATFUPG: + GrantTimedConditionOnDeploy: + DeployedTicks: 125 + CooldownTicks: 1000 + DeployedCondition: frenzy + ShowSelectionBar: true + ChargingColor: 770000 + DischargingColor: ff0000 + StartsFullyCharged: true + DeploySound: iteschaa.aud + ShowSelectionBarWhenFull: false + ReloadDelayMultiplier@FRENZY: + Modifier: 40 + -ReloadDelayMultiplier@FRENZYDEBUFF: + -SpeedMultiplier@FRENZYDEBUFF: + GrantConditionOnBotOwner@ISBOT: + Bots: bot + Condition: is-bot + AutoTargetPriority@BOTPRIO: + RequiresCondition: is-bot + ValidTargets: Defense + Priority: 10 + +MEDI: + Inherits@TFUNIT: ^TFUnit + Buildable: + BuildPaletteOrder: 5 + TooltipExtras: + Attributes: • Can create protective healing zones + Mobile: + Speed: 100 + RevealsShroud: + Range: 8c0 + Health: + HP: 20000 + SpawnActorAbility: + Actors: shieldzone + SkipMakeAnimations: false + Range: 6c0 + CircleColor: 00ffbbaa + SpawnSounds: srepaira.aud + AmmoPool: shieldspawner + AmmoPool@SHIELD: + Name: shieldspawner + Armaments: none + Ammo: 1 + ReloadAmmoPoolCA@SHIELD: + AmmoPool: shieldspawner + Delay: 375 + Count: 1 + ShowSelectionBar: true + SelectionBarColor: 00ffbb + ReloadWhenAmmoReaches: 0 + +E4: + Inherits@TFUNIT: ^TFUnit + Buildable: + Description: Soldier armed with a flamethrower. + BuildPaletteOrder: 7 + TooltipExtras: + Strengths: • High sustained damage + Weaknesses: • Short range + Attributes: • Pyroblast ability\n• Impervious to fire + Mobile: + Speed: 100 + RevealsShroud: + Range: 8c0 + Health: + HP: 20000 + Armament: + Weapon: HeavyFlameTankFlamer + LocalOffset: 512,0,256 + PauseOnCondition: pyroblast-attack || pyroblast-fired + Armament@SECONDARY: + Name: secondary + Weapon: Pyroblast + LocalOffset: 512,0,256 + PauseOnCondition: !pyroblast-attack + AmbientSoundCA: + SoundFiles: flamer-loop1.aud + InitialSound: flamer-start1.aud + FinalSound: flamer-end1.aud + RequiresCondition: attacking + InitialSoundLength: 20 + GrantConditionOnAttackCA: + Condition: attacking + RevokeDelay: 5 + TargetedAttackAbility: + ActiveCondition: pyroblast-attack + ArmamentNames: secondary + CircleColor: ff6600aa + Type: Pyroblast + GrantConditionOnAttack@PYROBLASTCOOLDOWN: + Condition: pyroblast-fired + RevokeDelay: 50 + ArmamentNames: secondary + AmmoPool: + Armaments: secondary + Ammo: 1 + ReloadAmmoPoolCA: + Delay: 375 # equal to reload time of weapon + Count: 1 + ShowSelectionBar: true + SelectionBarColor: ff6600 + Targetable@FIREPROOF: + TargetTypes: Fireproof + +SEAL: + Inherits@TFUNIT: ^TFUnit + Tooltip: + Name: Navy SEAL (Scout) + Buildable: + Description: Fast soldier armed with a submachinegun. + BuildPaletteOrder: 1 + TooltipExtras: + Strengths: • Very fast\n• Large vision radius + Weaknesses: • Mediocre damage\n• Fragile + Attributes: • Detects cloaked units\n• Teleport ability + Mobile: + Speed: 150 + Locomotor: foot + -Voice: + RevealsShroud: + Range: 12c0 + Health: + HP: 15000 + Voiced: + VoiceSet: GenericVoice + Armament: + Weapon: Uzi + LocalOffset: 427,0,341 + -WithDecoration@COMMANDOSKULL: + -Armament@C4Place: + -Armament@C4Prepare: + -AmmoPool@PreparedC4: + -ReloadAmmoPoolCA@PreparedC4: + -ReloadAmmoPoolCA@CancelC4: + -GrantConditionOnAttack@PreparingC4: + -Demolition: + -TargetSpecificOrderVoice: + Guard: + -Voice: + Passenger: + -Voice: + AttackMove: + -Voice: + AttackFrontal: + Voice: Action + -AnnounceOnKill: + PortableChronoCA: + ChargeDelay: 375 + MaxDistance: 12 + ChronoshiftSound: scrinport.aud + TeleportCondition: blink + ConditionDuration: 3 + SelectionBarColor: eeeeff + ShowSelectionBarWhenFull: false + WithColoredOverlay@BLINKFLASH: + Color: ffffff80 + RequiresCondition: blink + +E6: + Inherits@TFUNIT: ^TFUnit + Buildable: + Description: Soldier that can deploy and repair turrets. + BuildPaletteOrder: 9 + TooltipExtras: + Weaknesses: • Unarmed + Attributes: • Detects mines\n• Nearby allies deal 15% more damage + Mobile: + Speed: 100 + RevealsShroud: + Range: 8c0 + Health: + HP: 20000 + Selectable: + Priority: 10 + SpawnActorAbility: + Actors: gun + SkipMakeAnimations: false + Range: 5c0 + CircleColor: 999999 + SpawnSounds: placbldg.aud, build5.aud + AmmoPool: turretspawner + AvoidActors: true + AmmoPool@TURRET: + Name: turretspawner + Armaments: none + Ammo: 1 + ReloadAmmoPoolCA@TURRET: + AmmoPool: turretspawner + Delay: 750 + Count: 1 + ShowSelectionBar: true + SelectionBarColor: FFAA00 + ReloadWhenAmmoReaches: 0 + WithAmmoPipsDecoration@TURRET: + AmmoPools: turretspawner + RequiresSelection: true + Position: BottomLeft + Margin: 4, 3 + Captures: + CaptureDelay: 150 + Armament: + Weapon: Repair + Cursor: repair + OutsideRangeCursor: repair + TargetRelationships: Ally + ForceTargetRelationships: None + -Armament@bombdefuser: + -Armament@minedefuser: + -Armament@minedefusercharge: + -AmmoPool@minedefuser: + -ReloadAmmoPoolCA@minedefuser: + -GrantConditionOnAttack@CHARGING: + -AutoTargetPriority@defuse: + -AutoTargetPriority@mines: + AttackFrontal: + Voice: Action + PauseOnCondition: being-warped + FacingTolerance: 0 + AttackSoundsCA@REPAIRSOUND: + Sounds: fixit1.aud + AutoTarget: + AutoTargetPriority@DEFAULT: + ValidTargets: Repair + ValidRelationships: Ally + -InstantlyRepairs: + WithInfantryBody: + DefaultAttackSequence: shoot + MineImmune: + DetectCloaked: + Range: 5c0 + DetectionTypes: Mine + WithRangeCircle: + Color: ffff00aa + Range: 3c512 + ValidRelationships: Ally + ProximityExternalCondition@ENGIBUFF: + Range: 3c512 + Condition: engibuff + ValidRelationships: Ally + +SAB: + Inherits@TFUNIT: ^TFUnit + Buildable: + Description: Stealth infantry. + BuildPaletteOrder: 8 + Queue: InfantrySQ, InfantryMQ + BuildAtProductionType: Soldier + TooltipExtras: + Strengths: • High single-target burst damage + Weaknesses: • Short range\n• Fragile + Attributes: • Invisible when not attacking\n• Remote reveal ability + Mobile: + Speed: 100 + RevealsShroud: + Range: 8c0 + Health: + HP: 15000 + Selectable: + Priority: 10 + -GrantChargingCondition@CLOAK: + -GrantConditionOnMovement: + Cloak: + RequiresCondition: !cloak-force-disabled && !being-warped + CloakDelay: 66 + SpawnActorAbility: + Actors: spyreveal + SkipMakeAnimations: false + SpawnSounds: hacksat.aud + SelectTargetSpeechNotification: SelectTarget + AmmoPool: revealspawner + AmmoPool@REVEALSPAWNER: + Name: revealspawner + Armaments: none + Ammo: 1 + ReloadAmmoPoolCA@REVEALSPAWNER: + AmmoPool: revealspawner + Delay: 375 + Count: 1 + ShowSelectionBar: true + SelectionBarColor: ffffff + WithAmmoPipsDecoration@REVEALSPAWNER: + AmmoPools: revealspawner + RequiresSelection: true + Position: BottomLeft + Margin: 4, 3 + AutoTarget: + ScanRadius: 7 + +IVAN: + Inherits@TFUNIT: ^TFUnit + Buildable: + Description: Soldier armed with bombs and mines. + BuildPaletteOrder: 4 + TooltipExtras: + Strengths: • High area damage + Weaknesses: • Has difficulty hitting moving targets + Attributes: • Lays mines + Mobile: + Speed: 125 + RevealsShroud: + Range: 8c0 + Health: + HP: 20000 + Minelayer: + Mine: MINV + TileUnknownName: build-valid + MineImmune: + AmmoPool: + Ammo: 1 + Armaments: none + WithAmmoPipsDecoration: + Position: BottomLeft + Margin: 4, 3 + RequiresSelection: true + FullSequence: pip-red + ReloadAmmoPoolCA: + Delay: 250 + Count: 1 + ShowSelectionBar: true + SelectionBarColor: ff6600 + Rearmable: + RearmActors: ivan.rearm + GrantConditionOnBotOwner@ISBOT: + Bots: bot + Condition: is-bot + Armament@PRIMARY: + RequiresCondition: !is-bot + Armament@PRIMARYBOT: + PauseOnCondition: reloading + Weapon: BotIvanbomb + LocalOffset: 0,0,555 + FireDelay: 15 + RequiresCondition: is-bot + Armament@PRIMARYBOTDEF: + Weapon: BotIvanbombDef + LocalOffset: 0,0,555 + FireDelay: 15 + ReloadingCondition: reloading + RequiresCondition: is-bot + AutoTargetPriority@DEFAULTDEF: + RequiresCondition: is-bot + ValidTargets: Defense + Priority: 10 + +# ---- dummy actor because RearmableActors is required +IVAN.REARM: + AlwaysVisible: + +SNIP: + Inherits@TFUNIT: ^TFUnit + Buildable: + Description: Soldier armed with a sniper rifle. + BuildPaletteOrder: 2 + TooltipExtras: + Strengths: • Long range\n• High single-target damage + Weaknesses: • Fragile\n• Slow + Attributes: • Must aim before shooting + Mobile: + Speed: 75 + RevealsShroud: + Range: 8c0 + Health: + HP: 10000 + AttackFrontalCharged: + ChargeLevel: 50 + Armaments: primary + -Cloak@NORMAL: + -WithDecoration@hidden: + -WithColoredSelectionBox@INVIS: + Cloak@CRATE-CLOAK: + RequiresCondition: (crate-cloak) && !(cloak-force-disabled || invisibility) + Armament@PRIMARY: + Weapon: sniper + RequiresCondition: !is-bot + Armament@PRIMARYBOT: + Weapon: botsniper + RequiresCondition: is-bot + GrantConditionOnBotOwner@ISBOT: + Bots: bot + Condition: is-bot + +ATEK: + -Sellable: + -SpawnActorsOnSellCA: + -SpawnActorOnDeath: + -SpawnRandomActorOnDeath: + -Targetable: + Targetable@TEMPORAL: + TargetTypes: None + Targetable@HACKABLE: + TargetTypes: None + Power: + Amount: 0 + -DummyGpsPower@NOFOG: + -DummyGpsPower@FOG: + -ProduceActorPowerCA@SatelliteLaunched: + -SupportPowerChargeBar: + -ProduceActorPowerCA@InitialSatelliteScan: + -ProduceActorPowerCA@SatelliteScan: + -ProduceActorPowerCA@SatelliteScanNoFog: + -GrantExternalConditionPowerCA@FSHIELD: + -DetonateWeaponPower@TEMPINC: + CaptureManager: + -BeingCapturedCondition: + +PROC: + -Sellable: + -SpawnActorsOnSellCA: + -SpawnActorOnDeath: + -SpawnRandomActorOnDeath: + -Targetable: + Targetable@TEMPORAL: + TargetTypes: None + Targetable@HACKABLE: + TargetTypes: None + Power: + Amount: 0 + CaptureManager: + -BeingCapturedCondition: + +DOME: + -Sellable: + -SpawnActorsOnSellCA: + -SpawnActorOnDeath: + -SpawnRandomActorOnDeath: + -Targetable: + Targetable@TEMPORAL: + TargetTypes: None + Targetable@HACKABLE: + TargetTypes: None + Power: + Amount: 0 + -AirstrikePowerCA@clustermines: + -SpawnActorPowerCA@VeilOfWar: + -ParatroopersPowerCA@paratroopers: + -ParatroopersPowerCA@Russianparatroopers: + -AirstrikePowerCA@spyplane: + -Targetable@INFILTRATION: + CaptureManager: + -BeingCapturedCondition: + -RangedGpsRadarProvider: + -WithRangeCircle: + +HQ: + -Sellable: + -SpawnActorsOnSellCA: + -SpawnActorOnDeath: + -SpawnRandomActorOnDeath: + -Targetable: + Targetable@TEMPORAL: + TargetTypes: None + Targetable@HACKABLE: + TargetTypes: None + Power: + Amount: 0 + -Targetable@INFILTRATION: + CaptureManager: + -BeingCapturedCondition: + -RangedGpsRadarProvider: + -WithRangeCircle: + -SpawnActorPowerCA@sathack: + -SpawnActorPowerCA@sathacklegion: + -DropPodsPowerCA@Zocom: + -CashHackPower@Legion: + -AirstrikePowerCA@BlackhandFirebomb: + -AirReinforcementsPower@ShadowTeam: + +APWR: + -Sellable: + -SpawnActorsOnSellCA: + -SpawnActorOnDeath: + -SpawnRandomActorOnDeath: + -Targetable: + Targetable@TEMPORAL: + TargetTypes: None + Targetable@HACKABLE: + TargetTypes: None + Power: + Amount: 0 + -Targetable@PowerOutageInfiltrate: + CaptureManager: + -BeingCapturedCondition: + +GUN: + Health: + HP: 50000 + Armament: + Weapon: TurretUzi + Power: + Amount: 0 + -RepairableBuilding: + -WithBuildingRepairDecoration: + -Sellable: + Targetable@REPAIR: + RequiresCondition: damaged && !being-warped + TargetTypes: Repair + GrantConditionOnDamageState@DAMAGED: + Condition: damaged + ValidDamageStates: Light, Medium, Heavy, Critical + WithColoredSelectionBox@REL: + ColorSource: Team + ValidRelationships: Ally, Enemy, Neutral + -ChangesHealth@DefensePolicy2: + +SPAWNGUN: + Inherits: GUN + RenderSprites: + Image: gun + MustBeDestroyed: + RequiredForShortGame: true + WithColoredSelectionBox@REL: + ColorSource: Player + -Targetable: + -Targetable@C4Plantable: + -Targetable@TNTPlantable: + +SHIELDZONE: + Inherits@1: CAMERA + -RevealsShroud: + WithRangeCircle: + Visible: Always + Color: 00ffbbaa + Range: 3c0 + ValidRelationships: Ally + ProximityExternalCondition@SHIELD: + Range: 3c0 + Condition: shielded + ValidRelationships: Ally + KillsSelf: + RemoveInstead: true + Delay: 200 + +SPYREVEAL: + Inherits: camera.sathack + RevealsShroud: + Range: 5c0 + RenderSprites: + Image: satscansm + KillsSelf: + RemoveInstead: true + Delay: 75 + +PYROZONE: + Inherits@1: CAMERA + -RevealsShroud: + WithRangeCircle: + Visible: Always + Color: ff6600aa + Range: 3c0 + ValidRelationships: Enemy, Ally + KillsSelf: + RemoveInstead: true + Delay: 200 + PeriodicExplosion: + Weapon: PyroZone diff --git a/mods/ca/maps/tfca/tfca-sequences.yaml b/mods/ca/maps/tfca/tfca-sequences.yaml new file mode 100644 index 0000000000..c7dd5d2b4b --- /dev/null +++ b/mods/ca/maps/tfca/tfca-sequences.yaml @@ -0,0 +1,27 @@ +e4: + shoot: + Filename: n4.shp + Frames: 65, 81, 97, 113, 129, 145, 161, 177 + Start: 0 + Length: 1 + Facings: 8 + Tick: 500 + muzzle: + Filename: e4.shp + +e6: + shoot: + Filename: n6.shp + Facings: 8 + Start: 66 + Length: 2 + Tick: 120 + +satscansm: + idle: + Filename: satscan.shp + Length: * + BlendMode: Alpha + Tick: 80 + ZOffset: 1023 + Scale: 0.5 diff --git a/mods/ca/maps/tfca/tfca-weapons.yaml b/mods/ca/maps/tfca/tfca-weapons.yaml new file mode 100644 index 0000000000..1939baf8b8 --- /dev/null +++ b/mods/ca/maps/tfca/tfca-weapons.yaml @@ -0,0 +1,172 @@ + +Dragon: + Range: 8c0 + Projectile: MissileCA + RangeLimit: 10c0 + Speed: 185 + Warhead@1Dam: SpreadDamage + Spread: 341 + Damage: 8500 + Versus: + None: 100 + Warhead@3Eff: CreateEffect + Explosions: large_explosion + ImpactSounds: kaboom15.aud + +Ivanbomb: + Range: 6c0 + ReloadDelay: 30 + Warhead@AttachDelayedWeapon: AttachDelayedWeapon + TriggerTime: 80 + +BotIvanbomb: + Inherits: Ivanbomb + InvalidTargets: Defense + +BotIvanbombDef: + Inherits: Ivanbomb + Range: 8c0 + ValidTargets: Defense + Projectile: Bullet + BounceCount: 0 + +TNT: + Warhead@1Dam: SpreadDamage + Spread: 512 + +HeavyFlameTankFlamer: + ReloadDelay: 4 + -Burst: + -BurstDelays: + Warhead@1Dam: SpreadDamage + ValidRelationships: Enemy, Ally, Neutral + InvalidTargets: Fireproof + Damage: 450 + +Uzi: + Inherits: M60mgTD + Range: 6c0 + Projectile: Bullet + Speed: 850 + ContrailLength: 9 + ContrailStartColor: 88888844 + ContrailStartColorAlpha: 68 + Inaccuracy: 256 + Warhead@1Dam: SpreadDamage + Damage: 1750 + +TurretUzi: + Inherits: Uzi + Range: 7c0 + Projectile: Bullet + Speed: 950 + +MGattG: + Projectile: Bullet + Speed: 950 + ContrailLength: 9 + ContrailStartColor: 917d5544 + ContrailStartColorAlpha: 75 + Inaccuracy: 256 + -Warhead@PercDam: + Warhead@1Dam: SpreadDamage + Damage: 500 + DamageTypes: Prone50Percent, TriggerProne, BulletDeath + +SNIPER: + ReloadDelay: 105 + Range: 15c0 + Report: snipe.aud + Projectile: InstantHit + Blockable: true + Warhead@1Dam: SpreadDamage + Damage: 20000 + +BOTSNIPER: + Inherits: SNIPER + InvalidTargets: Defense + +SilencedPPK: + Range: 2c512 + ReloadDelay: 65 + InvalidTargets: Ship, Water, Structure, Wall, Husk + Warhead@1Dam: SpreadDamage + Damage: 20000 + ValidTargets: Barrel, Infantry, Vehicle + +Heal: + ReloadDelay: 40 + Warhead@1Dam: SpreadDamage + Spread: 213 + Damage: -4000 + +Repair: + ReloadDelay: 40 + Warhead@Flash: FlashTarget + ValidTargets: Structure + Warhead@1Dam: SpreadDamage + Damage: -3500 + +Pyroblast: + Inherits: FireballLauncher + Range: 7c0 + ReloadDelay: 375 + Projectile: BulletCA + Speed: 125 + Warhead@1Dam: SpreadDamage + Spread: 768 + Damage: 35000 + InvalidTargets: Fireproof + Versus: + Concrete: 1 + Warhead@3Eff: CreateEffect + Explosions: large_napalm + ImpactSounds: flamer2.aud + ImpactActors: true + -Warhead@2Dam: + Warhead@Spawn: SpawnActor + Actors: pyrozone + Range: 1 + ForceGround: true + ValidTargets: Ground, Water, Trees + Warhead@2Smu: LeaveSmudge + SmudgeType: Scorch + Size: 3 + Warhead@3Smu: LeaveSmudge + SmudgeType: Scorch + Size: 3 + Delay: 25 + Warhead@4Smu: LeaveSmudge + SmudgeType: Scorch + Size: 3 + Delay: 50 + Warhead@5Smu: LeaveSmudge + SmudgeType: Scorch + Size: 3 + Delay: 75 + Warhead@6Smu: LeaveSmudge + SmudgeType: Scorch + Size: 3 + Delay: 100 + +ATMine: + Warhead@1Dam: SpreadDamage + Damage: 75000 + +PyroZone: + ReloadDelay: 10 + Range: 3c0 + ValidTargets: Ground, Water + Projectile: InstantHit + Warhead@1Dam: SpreadDamage + Range: 0, 3c0, 3c1 + Falloff: 100, 100, 0 + Damage: 800 + Versus: + None: 100 + Wood: 0 + Light: 0 + Heavy: 0 + Concrete: 1 + Brick: 0 + DamageTypes: FireDeath diff --git a/mods/ca/maps/tfca/tfca.lua b/mods/ca/maps/tfca/tfca.lua new file mode 100644 index 0000000000..e52d826117 --- /dev/null +++ b/mods/ca/maps/tfca/tfca.lua @@ -0,0 +1,322 @@ +UnitsPerPlayer = tonumber(Map.LobbyOption("unitsperplayer")) +WinScore = tonumber(Map.LobbyOption("winscore")) + +WorldLoaded = function() + Blue = Player.GetPlayer("Blue") + Red = Player.GetPlayer("Red") + Neutral = Player.GetPlayer("Neutral") + BlueScore = 0 + RedScore = 0 + + Media.DisplayMessage("Loading...", "Notification", HSLColor.Lime) + + Players = Player.GetPlayers(function(p) return (p.Team == 1 or p.Team == 2) and not p.IsNonCombatant and p.InternalName ~= "Blue" and p.InternalName ~= "Red" end) + BluePlayers = Player.GetPlayers(function(p) return p.Team == 1 and not p.IsNonCombatant and p.InternalName ~= "Blue" and p.InternalName ~= "Red" end) + RedPlayers = Player.GetPlayers(function(p) return p.Team == 2 and not p.IsNonCombatant and p.InternalName ~= "Blue" and p.InternalName ~= "Red" end) + BotPlayers = Player.GetPlayers(function(p) return p.IsBot and p.InternalName ~= "Blue" and p.InternalName ~= "Red" end) + BuildableUnitTypes = { "seal", "e3", "e4", "ivan", "snip", "medi", "xo", "e6", "sab" } + BotInfo = { } + BotEngiTurrets = { + -- engistring = turret + } + + Objectives = { + Tech = { Actor = Tech, Waypoints = { Tech1, Tech2, Tech3, Tech4 }, Name = "Tech Center" }, + Power = { Actor = Power, Waypoints = { Power1, Power2, Power3 }, Name = "Power Plant" }, + Ref = { Actor = Ref, Waypoints = { Ref1, Ref2, Ref3, Ref4, Ref5 }, Name = "Refinery" }, + Comms = { Actor = Comms, Waypoints = { Comms1, Comms2, Comms3, Comms4 }, Name = "Comms Center" }, + Dome = { Actor = Dome, Waypoints = { Dome1, Dome2, Dome3, Dome4 }, Name = "Radar Dome" } + } + + Utils.Do(Objectives, function(o) + Trigger.OnCapture(o.Actor, function(self, captor, oldOwner, newOwner) + if newOwner.Team == 1 then + Media.DisplayMessage("The blue team have captured the " .. o.Name .. "!", "Notification", HSLColor.FromHex("0080FF")) + self.Owner = Blue + elseif newOwner.Team == 2 then + Media.DisplayMessage("The red team have captured the " .. o.Name .. "!", "Notification", HSLColor.Red) + self.Owner = Red + end + end) + end) + + Trigger.AfterDelay(10, function() + BotSetup() + + Utils.Do(Players, function(p) + p.Cash = UnitsPerPlayer + local spawnPoints = p.GetActorsByType("spawn") + + if #spawnPoints > 0 then + spawnPoint = spawnPoints[1] + Trigger.OnProduction(spawnPoint, function(producer, produced) + Trigger.OnKilled(produced, function(self, killer) + Trigger.AfterDelay(DateTime.Seconds(10), function() + self.Owner.Cash = self.Owner.Cash + 1 + end) + end) + end) + end + end) + + BalanceUnits = Blue.HasPrerequisites({ "global.balanceunits" }) + + if BalanceUnits then + if #BluePlayers > #RedPlayers and #RedPlayers > 0 then + Media.DisplayMessage("Blue team has more players. Allocating extra credits.", "Notification", HSLColor.Yellow) + local redExtra = (#BluePlayers - #RedPlayers) * UnitsPerPlayer + local redPlayerIdx = 1 + + while(redExtra > 0) + do + RedPlayers[redPlayerIdx].Cash = RedPlayers[redPlayerIdx].Cash + 1 + + if #RedPlayers > redPlayerIdx then + redPlayerIdx = redPlayerIdx + 1 + else + redPlayerIdx = 1 + end + + redExtra = redExtra - 1 + end + + elseif #RedPlayers > #BluePlayers and #BluePlayers > 0 then + Media.DisplayMessage("Red team has more players. Allocating extra credits.", "Notification", HSLColor.Yellow) + local blueExtra = (#RedPlayers - #BluePlayers) * UnitsPerPlayer + local bluePlayerIdx = 1 + + while(blueExtra > 0) + do + BluePlayers[bluePlayerIdx].Cash = BluePlayers[bluePlayerIdx].Cash + 1 + + if #BluePlayers > bluePlayerIdx then + bluePlayerIdx = bluePlayerIdx + 1 + else + bluePlayerIdx = 1 + end + + blueExtra = blueExtra - 1 + end + end + end + end) +end + +Tick = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 50 == 0 then + local blueObjectives = Blue.GetActorsByTypes({ "atek", "dome", "hq", "apwr", "proc" }) + local redObjectives = Red.GetActorsByTypes({ "atek", "dome", "hq", "apwr", "proc" }) + local scoreAmounts = { 2, 3, 4, 7, 60 } + + if #blueObjectives > 0 then + BlueScore = BlueScore + scoreAmounts[#blueObjectives] + end + + if #redObjectives > 0 then + RedScore = RedScore + scoreAmounts[#redObjectives] + end + + if BlueScore >= WinScore then + BlueScore = WinScore + BlueWins() + elseif RedScore >= WinScore then + RedScore = WinScore + RedWins() + end + + UpdateScoresText() + BotTick() + end +end + +UpdateScoresText = function() + local color = HSLColor.White + + if BlueScore > RedScore then + color = HSLColor.FromHex("0080FF") + elseif RedScore > BlueScore then + color = HSLColor.Red + end + + UserInterface.SetMissionText("Blue = " .. BlueScore .. " / " .. WinScore .. " -- vs -- Red = " .. RedScore .. " / " .. WinScore, color) +end + +BlueWins = function() + Utils.Do(RedPlayers, function(p) + local spawns = p.GetActorsByType("spawn") + Utils.Do(spawns, function(s) + s.Destroy() + end) + end) + local spawnguns = Red.GetActorsByType("spawngun") + Utils.Do(spawnguns, function(g) + g.Kill() + end) + Utils.Do(Objectives, function(o) + o.Actor.Owner = Blue + end) +end + +RedWins = function() + Utils.Do(BluePlayers, function(p) + local spawns = p.GetActorsByType("spawn") + Utils.Do(spawns, function(s) + s.Destroy() + end) + end) + local spawnguns = Blue.GetActorsByType("spawngun") + Utils.Do(spawnguns, function(g) + g.Kill() + end) + Utils.Do(Objectives, function(o) + o.Actor.Owner = Red + end) +end + +BotSetup = function() + Utils.Do(BotPlayers, function(p) + local initialObjective + + if p.Team == 1 then + initialObjective = Objectives.Comms + else + initialObjective = Objectives.Dome + end + + BotInfo[p.InternalName] = { + FirstObjective = true, + CurrentObjective = initialObjective + } + end) +end + +BotTick = function() + Utils.Do(BotPlayers, function(p) + local botUnits = p.GetActorsByTypes(BuildableUnitTypes) + local botInfo = BotInfo[p.InternalName] + + local alliedPlayers + if p.Team == 1 then + alliedPlayers = BluePlayers + else + alliedPlayers = RedPlayers + end + + -- if current objective is not set, or is already owned by an ally, set a new one + if botInfo.CurrentObjective == nil or p.IsAlliedWith(botInfo.CurrentObjective.Actor.Owner) then + SelectNewObjective(p, botUnits, botInfo) + + -- random chance to swap objectives every 25 seconds + elseif DateTime.GameTime > 1 and DateTime.GameTime % 625 == 0 and Utils.RandomInteger(0, 100) > 50 then + SelectNewObjective(p, botUnits, botInfo) + end + + -- if bot has money, make a unit + if p.Cash > 0 then + local chosenType = Utils.Random(BuildableUnitTypes) + + p.Build({ chosenType }, function(actors) + Utils.Do(actors, function(a) + + Trigger.OnIdle(a, function(self) + + if botInfo.CurrentObjective ~= nil then + + if self.Type == "medi" then + local randomTarget = RandomTargetToHeal(self, alliedPlayers) + if randomTarget ~= nil then + self.Guard(randomTarget) + end + end + + -- attack move to random location near current objective + local randomWaypoint = Utils.Random(botInfo.CurrentObjective.Waypoints) + self.AttackMove(randomWaypoint.Location) + + -- 75% chance to try capping if engi/xo/infil, otherwise 25% + local capChance = Utils.RandomInteger(0, 100) + if (self.Type == "e6" or self.Type == "sab" or self.Type == "xo" and capChance > 25) or (capChance > 75) then + if self.CanCapture(botInfo.CurrentObjective.Actor) then + self.Capture(botInfo.CurrentObjective.Actor) + end + end + + if self.Type == "e6" then + if Utils.RandomInteger(0, 100) > 66 then + local selfString = tostring(self) + + if BotEngiTurrets[selfString] == nil or BotEngiTurrets[selfString].IsDead then + local randomTurretLocation = FindTurretLocation(self) + + if randomTurretLocation ~= nil then + BotEngiTurrets[selfString] = Actor.Create("gun", true, { Owner = self.Owner, Location = randomTurretLocation }) + end + end + + if BotEngiTurrets[selfString] ~= nil and not BotEngiTurrets[selfString].IsDead then + local guardChance = Utils.RandomInteger(0, 100) + if guardChance > 15 then + self.Guard(BotEngiTurrets[selfString]) + end + end + end + end + end + end) + end) + end) + end + end) +end + +RandomTargetToHeal = function(self, alliedPlayers) + local target = nil + + Utils.Do(alliedPlayers, function(ap) + local units = ap.GetActorsByTypes(BuildableUnitTypes) + if #units > 0 then + possibleTargets = Utils.Where(units, function(a) + return a ~= self and a.Type ~= "medi" and a.Type ~= "sab" + end) + if #possibleTargets > 0 then + target = Utils.Random(possibleTargets) + end + return + end + end) + + return target +end + +FindTurretLocation = function(self) + local waypoints = Map.ActorsInCircle(self.CenterPosition, WDist.New(5120), function(a) + return a.Type == "waypoint" + end) + + if #waypoints > 0 then + local randomWaypoint = Utils.Random(waypoints) + local footprint = Utils.ExpandFootprint({ randomWaypoint.Location }, true) + randomTargetCell = Utils.Random(footprint) + return randomTargetCell + end + + return nil +end + +SelectNewObjective = function(p, botUnits, botInfo) + local possibleObjectives = Utils.Where(Objectives, function(o) + return not p.IsAlliedWith(o.Actor.Owner) + end) + + if #possibleObjectives > 0 then + local newObjective = Utils.Random(possibleObjectives) + botInfo.CurrentObjective = newObjective + botInfo.FirstObjective = false + + if #botUnits > 0 then + Utils.Do(botUnits, function(a) + a.Stop() + end) + end + end +end diff --git a/mods/ca/maps/the-great-divide-ca.oramap b/mods/ca/maps/the-great-divide-ca.oramap new file mode 100644 index 0000000000..f9a03e2724 Binary files /dev/null and b/mods/ca/maps/the-great-divide-ca.oramap differ diff --git a/mods/ca/maps/theauldgate-ca.oramap b/mods/ca/maps/theauldgate-ca.oramap index 9550fc81fa..4d8637159d 100644 Binary files a/mods/ca/maps/theauldgate-ca.oramap and b/mods/ca/maps/theauldgate-ca.oramap differ diff --git a/mods/ca/maps/thecutoff-ca.oramap b/mods/ca/maps/thecutoff-ca.oramap index 06dd32b5e3..d2ae7d4bf7 100644 Binary files a/mods/ca/maps/thecutoff-ca.oramap and b/mods/ca/maps/thecutoff-ca.oramap differ diff --git a/mods/ca/maps/thelongnight-ca.oramap b/mods/ca/maps/thelongnight-ca.oramap index 9a2da6fab5..db0cdb4a6f 100644 Binary files a/mods/ca/maps/thelongnight-ca.oramap and b/mods/ca/maps/thelongnight-ca.oramap differ diff --git a/mods/ca/maps/theredforest-ca.oramap b/mods/ca/maps/theredforest-ca.oramap index 9b3579229e..1a6464cf7d 100644 Binary files a/mods/ca/maps/theredforest-ca.oramap and b/mods/ca/maps/theredforest-ca.oramap differ diff --git a/mods/ca/maps/therewillbeblood-ca.oramap b/mods/ca/maps/therewillbeblood-ca.oramap index 2584f64873..537b1d0351 100644 Binary files a/mods/ca/maps/therewillbeblood-ca.oramap and b/mods/ca/maps/therewillbeblood-ca.oramap differ diff --git a/mods/ca/maps/theruinedkingdom-ca.oramap b/mods/ca/maps/theruinedkingdom-ca.oramap new file mode 100644 index 0000000000..aabf29ba46 Binary files /dev/null and b/mods/ca/maps/theruinedkingdom-ca.oramap differ diff --git a/mods/ca/maps/theswamp-ca.oramap b/mods/ca/maps/theswamp-ca.oramap index 05b745f029..3206d5d27b 100644 Binary files a/mods/ca/maps/theswamp-ca.oramap and b/mods/ca/maps/theswamp-ca.oramap differ diff --git a/mods/ca/maps/thewall-ca.oramap b/mods/ca/maps/thewall-ca.oramap index 56b922aa5d..7645018d63 100644 Binary files a/mods/ca/maps/thewall-ca.oramap and b/mods/ca/maps/thewall-ca.oramap differ diff --git a/mods/ca/maps/thewold-ca.oramap b/mods/ca/maps/thewold-ca.oramap index 9fed0a7eae..617a59ca27 100644 Binary files a/mods/ca/maps/thewold-ca.oramap and b/mods/ca/maps/thewold-ca.oramap differ diff --git a/mods/ca/maps/threeinarow-ca.oramap b/mods/ca/maps/threeinarow-ca.oramap index 97116b1302..74cd0d3ade 100644 Binary files a/mods/ca/maps/threeinarow-ca.oramap and b/mods/ca/maps/threeinarow-ca.oramap differ diff --git a/mods/ca/maps/thunderdome-ca.oramap b/mods/ca/maps/thunderdome-ca.oramap index 22a9b41f63..270c913616 100644 Binary files a/mods/ca/maps/thunderdome-ca.oramap and b/mods/ca/maps/thunderdome-ca.oramap differ diff --git a/mods/ca/maps/tib-split.oramap b/mods/ca/maps/tib-split.oramap new file mode 100644 index 0000000000..e9ea53e76a Binary files /dev/null and b/mods/ca/maps/tib-split.oramap differ diff --git a/mods/ca/maps/timorous-expansions-2-ca.oramap b/mods/ca/maps/timorous-expansions-2-ca.oramap new file mode 100644 index 0000000000..bfb4683978 Binary files /dev/null and b/mods/ca/maps/timorous-expansions-2-ca.oramap differ diff --git a/mods/ca/maps/titan-vip-ca.oramap b/mods/ca/maps/titan-vip-ca.oramap new file mode 100644 index 0000000000..8298d91e82 Binary files /dev/null and b/mods/ca/maps/titan-vip-ca.oramap differ diff --git a/mods/ca/maps/tombstone-ca.oramap b/mods/ca/maps/tombstone-ca.oramap index 7d56eb39b3..209e6bd6bb 100644 Binary files a/mods/ca/maps/tombstone-ca.oramap and b/mods/ca/maps/tombstone-ca.oramap differ diff --git a/mods/ca/maps/tortuous-ca.oramap b/mods/ca/maps/tortuous-ca.oramap new file mode 100644 index 0000000000..711db0b07a Binary files /dev/null and b/mods/ca/maps/tortuous-ca.oramap differ diff --git a/mods/ca/maps/tournament-island.oramap b/mods/ca/maps/tournament-island.oramap index ee2afcd66c..718fa30af4 100644 Binary files a/mods/ca/maps/tournament-island.oramap and b/mods/ca/maps/tournament-island.oramap differ diff --git a/mods/ca/maps/tournament-shaft.oramap b/mods/ca/maps/tournament-shaft.oramap index eec567cf8d..2315f7e6a7 100644 Binary files a/mods/ca/maps/tournament-shaft.oramap and b/mods/ca/maps/tournament-shaft.oramap differ diff --git a/mods/ca/maps/townmeeting-ca.oramap b/mods/ca/maps/townmeeting-ca.oramap new file mode 100644 index 0000000000..ba04488efc Binary files /dev/null and b/mods/ca/maps/townmeeting-ca.oramap differ diff --git a/mods/ca/maps/toxicity-ca.oramap b/mods/ca/maps/toxicity-ca.oramap new file mode 100644 index 0000000000..374474dbb8 Binary files /dev/null and b/mods/ca/maps/toxicity-ca.oramap differ diff --git a/mods/ca/maps/tranquility-ca.oramap b/mods/ca/maps/tranquility-ca.oramap index 21d309775e..88cfa2273a 100644 Binary files a/mods/ca/maps/tranquility-ca.oramap and b/mods/ca/maps/tranquility-ca.oramap differ diff --git a/mods/ca/maps/treasurehunt-ca.oramap b/mods/ca/maps/treasurehunt-ca.oramap new file mode 100644 index 0000000000..0ddb2877a0 Binary files /dev/null and b/mods/ca/maps/treasurehunt-ca.oramap differ diff --git a/mods/ca/maps/treasurehunt2v2-ca.oramap b/mods/ca/maps/treasurehunt2v2-ca.oramap new file mode 100644 index 0000000000..3289babe22 Binary files /dev/null and b/mods/ca/maps/treasurehunt2v2-ca.oramap differ diff --git a/mods/ca/maps/treasurehunt3v3-ca.oramap b/mods/ca/maps/treasurehunt3v3-ca.oramap new file mode 100644 index 0000000000..257a7789f8 Binary files /dev/null and b/mods/ca/maps/treasurehunt3v3-ca.oramap differ diff --git a/mods/ca/maps/trichotomy.oramap b/mods/ca/maps/trichotomy.oramap index df3cf1ddb2..f849ef9eef 100644 Binary files a/mods/ca/maps/trichotomy.oramap and b/mods/ca/maps/trichotomy.oramap differ diff --git a/mods/ca/maps/triple-temptation.oramap b/mods/ca/maps/triple-temptation.oramap index 1542543120..9a4770e9a9 100644 Binary files a/mods/ca/maps/triple-temptation.oramap and b/mods/ca/maps/triple-temptation.oramap differ diff --git a/mods/ca/maps/triplets-ca.oramap b/mods/ca/maps/triplets-ca.oramap index e770b8c599..109cd4a22c 100644 Binary files a/mods/ca/maps/triplets-ca.oramap and b/mods/ca/maps/triplets-ca.oramap differ diff --git a/mods/ca/maps/troubletown-ca.oramap b/mods/ca/maps/troubletown-ca.oramap index 3a975c0bc2..631f4a89d4 100644 Binary files a/mods/ca/maps/troubletown-ca.oramap and b/mods/ca/maps/troubletown-ca.oramap differ diff --git a/mods/ca/maps/twin-observatories-ca.oramap b/mods/ca/maps/twin-observatories-ca.oramap new file mode 100644 index 0000000000..6d6d8cab8a Binary files /dev/null and b/mods/ca/maps/twin-observatories-ca.oramap differ diff --git a/mods/ca/maps/unconventional-warfare.oramap b/mods/ca/maps/unconventional-warfare.oramap index 71fd77dc9a..f4e9144149 100644 Binary files a/mods/ca/maps/unconventional-warfare.oramap and b/mods/ca/maps/unconventional-warfare.oramap differ diff --git a/mods/ca/maps/union-sacree.oramap b/mods/ca/maps/union-sacree.oramap index 32a02f0ccc..d56e111035 100644 Binary files a/mods/ca/maps/union-sacree.oramap and b/mods/ca/maps/union-sacree.oramap differ diff --git a/mods/ca/maps/upsanddowns-ca.oramap b/mods/ca/maps/upsanddowns-ca.oramap index 76a41f087d..e81bd74a94 100644 Binary files a/mods/ca/maps/upsanddowns-ca.oramap and b/mods/ca/maps/upsanddowns-ca.oramap differ diff --git a/mods/ca/maps/vegetation.oramap b/mods/ca/maps/vegetation.oramap index b130f04ce4..6c6a90f4a6 100644 Binary files a/mods/ca/maps/vegetation.oramap and b/mods/ca/maps/vegetation.oramap differ diff --git a/mods/ca/maps/vicious-valley.oramap b/mods/ca/maps/vicious-valley.oramap new file mode 100644 index 0000000000..37c821a421 Binary files /dev/null and b/mods/ca/maps/vicious-valley.oramap differ diff --git a/mods/ca/maps/vihaan-lunta.oramap b/mods/ca/maps/vihaan-lunta.oramap index c422e43d75..33f0d75d45 100644 Binary files a/mods/ca/maps/vihaan-lunta.oramap and b/mods/ca/maps/vihaan-lunta.oramap differ diff --git a/mods/ca/maps/war-factory-ca.oramap b/mods/ca/maps/war-factory-ca.oramap new file mode 100644 index 0000000000..067657a186 Binary files /dev/null and b/mods/ca/maps/war-factory-ca.oramap differ diff --git a/mods/ca/maps/warwind.oramap b/mods/ca/maps/warwind.oramap index 0ed2b3ea97..86eb8a79b9 100644 Binary files a/mods/ca/maps/warwind.oramap and b/mods/ca/maps/warwind.oramap differ diff --git a/mods/ca/maps/warzone-ca.oramap b/mods/ca/maps/warzone-ca.oramap index dd7799fd18..7c55026df7 100644 Binary files a/mods/ca/maps/warzone-ca.oramap and b/mods/ca/maps/warzone-ca.oramap differ diff --git a/mods/ca/maps/wastedopportunity-ca.oramap b/mods/ca/maps/wastedopportunity-ca.oramap index 1410dca1dd..69a50efd86 100644 Binary files a/mods/ca/maps/wastedopportunity-ca.oramap and b/mods/ca/maps/wastedopportunity-ca.oramap differ diff --git a/mods/ca/maps/westworld-ca.oramap b/mods/ca/maps/westworld-ca.oramap index 8bd16d6b9d..9ecd248c4c 100644 Binary files a/mods/ca/maps/westworld-ca.oramap and b/mods/ca/maps/westworld-ca.oramap differ diff --git a/mods/ca/maps/wetlands-ca.oramap b/mods/ca/maps/wetlands-ca.oramap index bc2f5fd60a..194ae773b5 100644 Binary files a/mods/ca/maps/wetlands-ca.oramap and b/mods/ca/maps/wetlands-ca.oramap differ diff --git a/mods/ca/maps/widowers-trail-ca.oramap b/mods/ca/maps/widowers-trail-ca.oramap new file mode 100644 index 0000000000..f8db2b4304 Binary files /dev/null and b/mods/ca/maps/widowers-trail-ca.oramap differ diff --git a/mods/ca/maps/windingwoods-ca.oramap b/mods/ca/maps/windingwoods-ca.oramap index 2856722dcb..9aca8d4cb3 100644 Binary files a/mods/ca/maps/windingwoods-ca.oramap and b/mods/ca/maps/windingwoods-ca.oramap differ diff --git a/mods/ca/maps/winter-storm.oramap b/mods/ca/maps/winter-storm.oramap index a1e751cedf..aa531bb16a 100644 Binary files a/mods/ca/maps/winter-storm.oramap and b/mods/ca/maps/winter-storm.oramap differ diff --git a/mods/ca/maps/wisps-ca.oramap b/mods/ca/maps/wisps-ca.oramap index 2e15aca181..cc87709209 100644 Binary files a/mods/ca/maps/wisps-ca.oramap and b/mods/ca/maps/wisps-ca.oramap differ diff --git a/mods/ca/maps/woodlandmonastery-ca.oramap b/mods/ca/maps/woodlandmonastery-ca.oramap index 5d348592a6..db83ea5377 100644 Binary files a/mods/ca/maps/woodlandmonastery-ca.oramap and b/mods/ca/maps/woodlandmonastery-ca.oramap differ diff --git a/mods/ca/maps/woodlands-ca.oramap b/mods/ca/maps/woodlands-ca.oramap new file mode 100644 index 0000000000..dd92ce9535 Binary files /dev/null and b/mods/ca/maps/woodlands-ca.oramap differ diff --git a/mods/ca/maps/wormrot-ca.oramap b/mods/ca/maps/wormrot-ca.oramap new file mode 100644 index 0000000000..bce051f1b4 Binary files /dev/null and b/mods/ca/maps/wormrot-ca.oramap differ diff --git a/mods/ca/maps/x-lake.oramap b/mods/ca/maps/x-lake.oramap index cd7efc6cb3..0eebce472b 100644 Binary files a/mods/ca/maps/x-lake.oramap and b/mods/ca/maps/x-lake.oramap differ diff --git a/mods/ca/maps/yukon-territory-ca.oramap b/mods/ca/maps/yukon-territory-ca.oramap new file mode 100644 index 0000000000..88a4a97d8b Binary files /dev/null and b/mods/ca/maps/yukon-territory-ca.oramap differ diff --git a/mods/ca/maps/zapped-ca.oramap b/mods/ca/maps/zapped-ca.oramap index a0cc590800..454fe04dd8 100644 Binary files a/mods/ca/maps/zapped-ca.oramap and b/mods/ca/maps/zapped-ca.oramap differ diff --git a/mods/ca/metrics.yaml b/mods/ca/metrics.yaml index e491bf3611..c50125ec8b 100644 --- a/mods/ca/metrics.yaml +++ b/mods/ca/metrics.yaml @@ -1,20 +1,21 @@ # General dumping-ground for UI element sizes, etc. Metrics: - ColorPickerActorType: fact.colorpicker - ColorPickerRemapIndices: 176, 178, 180, 182, 184, 186, 189, 191, 177, 179, 181, 183, 185, 187, 188, 190 FactionSuffix-allies: allies FactionSuffix-england: allies FactionSuffix-france: allies FactionSuffix-germany: allies + FactionSuffix-usa: allies FactionSuffix-soviet: soviet FactionSuffix-russia: soviet FactionSuffix-ukraine: soviet FactionSuffix-iraq: soviet + FactionSuffix-yuri: soviet FactionSuffix-gdi: gdi FactionSuffix-talon: gdi FactionSuffix-zocom: gdi FactionSuffix-eagle: gdi + FactionSuffix-arc: gdi FactionSuffix-nod: nod FactionSuffix-blackh: nod FactionSuffix-marked: nod @@ -31,8 +32,6 @@ Metrics: ChatLineSound: ChatLine ClickDisabledSound: ClickDisabledSound ClickSound: ClickSound - ChatMessageColor: FFFFFF - SystemMessageColor: FFFF00 NormalSelectionColor: FFFFFF AltSelectionColor: 00FFFF CtrlSelectionColor: FFFF00 diff --git a/mods/ca/missions.yaml b/mods/ca/missions.yaml index 54d3725472..9fbd06056f 100644 --- a/mods/ca/missions.yaml +++ b/mods/ca/missions.yaml @@ -1,2 +1,62 @@ -Allied Campaign: -Soviet Campaign: +Prologue: + ca-prologue-01 + ca-prologue-02 + ca-prologue-03 + ca-prologue-04 +Chapter I - Allies: + ca01-crossrip + ca02-displacement + ca03-deliverance + ca04-containment + ca05-apprehension + ca06-machinations +Chapter II - Nod: + ca07-conspiracy + ca08-subversion + ca09-salvation + ca10-zenith + ca11-awakening + ca12-supremacy +Chapter III - Soviets: + ca13-abasement + ca14-treachery + ca15-ironclad + ca16-expulsion + ca17-domination + ca18-succession +Chapter IV - Scrin: + ca19-proliferation + ca20-encroachment + ca21-incapacitation + ca22-decimation + ca23-subjugation + ca24-culmination +Chapter V - GDI: + ca25-enmity + ca26-capitulation + ca27-emancipation + ca28-duality + ca29-mobilization + ca30-singularity +Chapter VI - Ascension (GDI/Nod): + ca31-foothold + ca32-convergence + ca33-spearhead + ca34-illumination + ca35-purification + ca36-reckoning +Chapter VII - Reclamation (Soviets): + ca37-statecraft + ca38-procurement + ca39-jailbreak + ca40-conduit + ca41-annexation + ca42-schism +Chapter VIII - Foreshadowing (Allies): + ca43-dissection + ca44-trepidation + ca45-multipolarity + ca46-intervention + ca47-ad-nihilum + ca48-banishment +Standalone Missions: \ No newline at end of file diff --git a/mods/ca/missions/coop-campaign/ca-prologue-01-coop/map.bin b/mods/ca/missions/coop-campaign/ca-prologue-01-coop/map.bin new file mode 100644 index 0000000000..0c92b3ac7d Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca-prologue-01-coop/map.bin differ diff --git a/mods/ca/missions/coop-campaign/ca-prologue-01-coop/map.png b/mods/ca/missions/coop-campaign/ca-prologue-01-coop/map.png new file mode 100644 index 0000000000..c7e209bf6e Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca-prologue-01-coop/map.png differ diff --git a/mods/ca/missions/coop-campaign/ca-prologue-01-coop/map.yaml b/mods/ca/missions/coop-campaign/ca-prologue-01-coop/map.yaml new file mode 100644 index 0000000000..d03aeb6cc0 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca-prologue-01-coop/map.yaml @@ -0,0 +1,589 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: i. Relativity Co-op + +Author: Darkademic & Gandorques Hikla + +Tileset: SNOW + +MapSize: 128,128 + +Bounds: 49,45,30,46 + +Visibility: Lobby + +Categories: Co-op Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: USSR, Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, England + PlayerReference@Greece: + Name: Greece + Faction: allies + Color: 99ACF2 + Allies: England, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Creeps + PlayerReference@USSR: + Name: USSR + Bot: campaign + Faction: soviet + Color: FE1100 + Enemies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, England, Civilians, Creeps + PlayerReference@England: + Name: England + Faction: allies + Color: A1EF8C + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR + PlayerReference@Civilians: + NonCombatant: True + Name: Civilians + Faction: ukraine + Enemies: USSR + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 99ACF2 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Creeps + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 0B7310 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Creeps + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 134691 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Creeps + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 775A12 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Creeps + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 994050 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Creeps + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: EEA8A8 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Creeps + +Actors: + Actor0: t16 + Location: 66,46 + Owner: Neutral + Actor1: t17 + Location: 59,46 + Owner: Neutral + Actor2: tc04 + Location: 75,44 + Owner: Neutral + Actor3: tc05 + Location: 76,45 + Owner: Neutral + Actor4: t01 + Location: 52,50 + Owner: Neutral + Actor5: t02 + Location: 70,68 + Owner: Neutral + Actor6: t05 + Location: 73,64 + Owner: Neutral + Actor7: t14 + Location: 59,50 + Owner: Neutral + Actor8: t17 + Location: 56,61 + Owner: Neutral + Actor9: tc01 + Location: 53,64 + Owner: Neutral + Actor10: tc02 + Location: 49,66 + Owner: Neutral + Actor11: t07 + Location: 49,59 + Owner: Neutral + Actor12: tc05 + Location: 49,60 + Owner: Neutral + Actor13: tc04 + Location: 50,58 + Owner: Neutral + Actor14: tc03 + Location: 69,50 + Owner: Neutral + Actor15: t11 + Location: 77,60 + Owner: Neutral + Actor16: t01 + Location: 78,59 + Owner: Neutral + Actor17: tc01 + Location: 76,56 + Owner: Neutral + Actor18: t08 + Location: 66,50 + Owner: Neutral + Actor19: t17 + Location: 57,56 + Owner: Neutral + Actor20: t01 + Location: 73,67 + Owner: Neutral + Actor21: tc01 + Location: 54,45 + Owner: Neutral + NorthEastTeslaCoil: tsla + Location: 71,60 + Owner: USSR + Actor23: powr + Location: 75,64 + Owner: USSR + Actor24: powr + Location: 67,57 + Owner: USSR + BarrelPower: powr + Location: 61,57 + Owner: USSR + Actor27: fact + Location: 69,62 + Owner: USSR + Actor28: dome + Location: 67,65 + Owner: USSR + Actor29: barr + Location: 61,64 + Owner: USSR + Actor30: tsla + Location: 67,68 + Owner: USSR + Actor31: tsla + Location: 60,67 + Owner: USSR + Actor32: weap + Location: 65,62 + Owner: USSR + Actor33: proc + Location: 73,58 + Owner: USSR + Actor34: kenn + Location: 64,65 + Owner: USSR + Actor35: powr + Location: 65,57 + Owner: USSR + Actor36: powr + Location: 77,64 + Owner: USSR + Actor37: powr + Location: 75,67 + Owner: USSR + Actor38: silo + Location: 59,64 + Owner: USSR + Actor39: powr + Location: 77,67 + Owner: USSR + Actor41: brl3 + Location: 60,57 + Owner: USSR + Actor42: barl + Location: 60,56 + Owner: USSR + Actor43: barl + Location: 61,56 + Owner: USSR + Actor44: brl3 + Location: 60,58 + Owner: USSR + Actor45: barl + Location: 58,56 + Owner: USSR + Actor46: barl + Location: 59,59 + Owner: USSR + Actor47: jeep + Location: 63,50 + Owner: Greece + Facing: 512 + Actor49: jeep + Location: 62,50 + Owner: Greece + Facing: 512 + Actor50: jeep + Location: 64,50 + Owner: Greece + Facing: 512 + Actor55: e2 + Location: 73,66 + Owner: USSR + SubCell: 1 + Response3: e1 + Location: 62,67 + Owner: USSR + SubCell: 4 + Facing: 512 + Response5: e1 + Location: 67,67 + Owner: USSR + SubCell: 3 + Facing: 640 + Response4: e1 + Location: 65,67 + Owner: USSR + SubCell: 3 + Facing: 640 + Response1: e1 + Location: 56,60 + Owner: USSR + SubCell: 1 + Facing: 384 + Response2: e1 + Location: 58,60 + Owner: USSR + SubCell: 1 + Facing: 256 + Actor64: e1 + Location: 64,49 + Owner: Greece + SubCell: 1 + Facing: 512 + Actor65: e1 + Location: 63,49 + Owner: Greece + Facing: 512 + SubCell: 0 + Actor66: e1 + Location: 62,49 + Owner: Greece + Facing: 640 + SubCell: 2 + Actor69: e2 + Location: 62,56 + Owner: USSR + Facing: 128 + SubCell: 1 + Actor70: e2 + Location: 62,56 + Owner: USSR + SubCell: 4 + Actor71: e1 + Location: 64,49 + Owner: Greece + SubCell: 2 + Facing: 512 + Actor72: e1 + Location: 62,49 + Owner: Greece + Facing: 512 + SubCell: 1 + Actor48: fenc + Location: 53,60 + Owner: USSR + Actor51: fenc + Location: 53,59 + Owner: USSR + Actor52: fenc + Location: 54,59 + Owner: USSR + Actor60: fenc + Location: 53,63 + Owner: USSR + Actor61: fenc + Location: 54,63 + Owner: USSR + Actor73: fenc + Location: 55,63 + Owner: USSR + Actor74: fenc + Location: 55,64 + Owner: USSR + Actor75: fenc + Location: 55,65 + Owner: USSR + Actor76: fenc + Location: 55,66 + Owner: USSR + Actor77: fenc + Location: 55,67 + Owner: USSR + Actor78: fenc + Location: 56,67 + Owner: USSR + Actor79: fenc + Location: 57,67 + Owner: USSR + Actor80: fenc + Location: 58,67 + Owner: USSR + Actor81: fenc + Location: 58,68 + Owner: USSR + Actor82: fenc + Location: 73,70 + Owner: USSR + Actor83: fenc + Location: 74,70 + Owner: USSR + Actor84: fenc + Location: 78,70 + Owner: USSR + Actor85: fenc + Location: 77,70 + Owner: USSR + Actor86: fenc + Location: 76,70 + Owner: USSR + Actor87: fenc + Location: 78,58 + Owner: USSR + Actor99: fenc + Location: 78,59 + Owner: USSR + Actor88: fenc + Location: 77,58 + Owner: USSR + Actor89: fenc + Location: 78,57 + Owner: USSR + Actor90: fenc + Location: 78,56 + Owner: USSR + Actor91: fenc + Location: 77,56 + Owner: USSR + Actor98: fenc + Location: 76,56 + Owner: USSR + Actor92: fenc + Location: 75,56 + Owner: USSR + Actor93: fenc + Location: 74,56 + Owner: USSR + Actor94: fenc + Location: 74,55 + Owner: USSR + Actor95: fenc + Location: 68,55 + Owner: USSR + Actor96: fenc + Location: 69,55 + Owner: USSR + Actor97: fenc + Location: 68,54 + Owner: USSR + Lab: stek + Location: 61,60 + Owner: USSR + OilPump: v19 + Location: 59,57 + Owner: USSR + LabGuard1: e1 + Location: 64,61 + Owner: USSR + SubCell: 4 + LabGuard2: e1 + Location: 63,63 + Owner: USSR + Facing: 384 + SubCell: 0 + LabGuard3: e1 + Location: 61,63 + Owner: USSR + Facing: 512 + SubCell: 0 + Patrol1: dog + Location: 63,59 + Owner: USSR + SubCell: 2 + Patrol2: e1 + Location: 64,58 + Owner: USSR + SubCell: 3 + Patrol3: e1 + Location: 64,59 + Owner: USSR + SubCell: 2 + Patrol4: e1 + Location: 62,55 + Owner: USSR + SubCell: 4 + Civilian1: c8 + Location: 74,50 + SubCell: 0 + Faction: england + Owner: Civilians + Civilian2: c7 + Location: 76,48 + SubCell: 3 + Faction: england + Owner: Civilians + EinsteinSpawnPoint: waypoint + Location: 62,60 + Owner: Neutral + InsertionEntry: waypoint + Location: 63,45 + Owner: Neutral + InsertionLZ: waypoint + Location: 63,47 + Owner: Neutral + BaseCameraPoint: waypoint + Location: 64,63 + Owner: Neutral + ExtractionLZ: waypoint + Location: 53,49 + Owner: Neutral + ExtractionFlarePoint: waypoint + Location: 54,48 + Owner: Neutral + ExtractionExitPoint: waypoint + Location: 78,49 + Owner: Neutral + CruiserCameraPoint: waypoint + Location: 69,67 + Owner: Neutral + CruiserPoint2: waypoint + Location: 64,75 + Owner: Neutral + CruiserPoint3: waypoint + Location: 68,76 + Owner: Neutral + CivMove: waypoint + Location: 69,56 + Owner: Neutral + CruiserPoint1: waypoint + Owner: Neutral + Location: 60,75 + CruiserPoint4: waypoint + Owner: Neutral + Location: 72,76 + PrismSpawn1: waypoint + Owner: Neutral + Location: 55,61 + PrismSpawn2: waypoint + Owner: Neutral + Location: 53,62 + Actor131: ss + Owner: USSR + Stance: Defend + Location: 58,78 + Facing: 570 + Actor136: ss + Owner: USSR + Stance: Defend + Location: 70,78 + Facing: 420 + Actor137: ss + Owner: USSR + Stance: Defend + Location: 65,78 + Facing: 491 + Actor138: ss + Owner: USSR + Stance: Defend + Location: 62,78 + Facing: 578 + Actor132: ss + Owner: USSR + Stance: Defend + Facing: 475 + Location: 73,78 + Actor135: ss + Owner: USSR + Facing: 713 + Stance: Defend + Location: 56,80 + SouthReinforcementsPoint: waypoint + Owner: Neutral + Location: 55,90 + CruiserSpawn1: waypoint + Owner: Neutral + Location: 60,90 + CruiserSpawn2: waypoint + Owner: Neutral + Location: 64,90 + CruiserSpawn3: waypoint + Owner: Neutral + Location: 68,90 + CruiserSpawn4: waypoint + Owner: Neutral + Location: 72,90 + PrismSpawn3: waypoint + Owner: Neutral + Location: 56,64 + CruiserBeacon: waypoint + Owner: Neutral + Location: 65,88 + PrismBeacon: waypoint + Owner: Neutral + Location: 55,62 + TanyaDest: waypoint + Owner: Neutral + Location: 63,48 + SubPen: spen + Owner: USSR + Location: 75,75 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-coalitions.yaml, ca|missions/main-campaign/ca-prologue-01/relativity-rules.yaml, ca|rules/custom/coop-rules.yaml, relativity-coop-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml, ca|missions/main-campaign/ca-prologue-01/relativity-weapons.yaml diff --git a/mods/ca/missions/coop-campaign/ca-prologue-01-coop/relativity-coop-rules.yaml b/mods/ca/missions/coop-campaign/ca-prologue-01-coop/relativity-coop-rules.yaml new file mode 100644 index 0000000000..8448da015e --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca-prologue-01-coop/relativity-coop-rules.yaml @@ -0,0 +1,6 @@ +World: + LuaScript: + Scripts: campaign.lua, coop.lua, ca|missions/main-campaign/ca-prologue-01/relativity.lua, relativity-coop.lua + LobbyMissionInfo@InitialObjectives: + Prefix: Initial Objectives + Text: • Find and rescue Prof. Einstein. diff --git a/mods/ca/missions/coop-campaign/ca-prologue-01-coop/relativity-coop.lua b/mods/ca/missions/coop-campaign/ca-prologue-01-coop/relativity-coop.lua new file mode 100644 index 0000000000..247e5aad7c --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca-prologue-01-coop/relativity-coop.lua @@ -0,0 +1,26 @@ + +SetupPlayers = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Multi2 = Player.GetPlayer("Multi2") + Multi3 = Player.GetPlayer("Multi3") + Multi4 = Player.GetPlayer("Multi4") + Multi5 = Player.GetPlayer("Multi5") + Greece = Player.GetPlayer("Greece") + England = Player.GetPlayer("England") + USSR = Player.GetPlayer("USSR") + Civilians = Player.GetPlayer("Civilians") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = Utils.Where({ Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 }, function(p) return p ~= nil end) + MissionEnemies = { USSR } + SinglePlayerPlayer = Greece + CoopInit() +end + +AfterWorldLoaded = function() + +end + +AfterTick = function() + +end diff --git a/mods/ca/missions/coop-campaign/ca-prologue-02-coop/map.bin b/mods/ca/missions/coop-campaign/ca-prologue-02-coop/map.bin new file mode 100644 index 0000000000..c8a0bbf3bc Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca-prologue-02-coop/map.bin differ diff --git a/mods/ca/missions/coop-campaign/ca-prologue-02-coop/map.png b/mods/ca/missions/coop-campaign/ca-prologue-02-coop/map.png new file mode 100644 index 0000000000..a0526464c6 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca-prologue-02-coop/map.png differ diff --git a/mods/ca/missions/coop-campaign/ca-prologue-02-coop/map.yaml b/mods/ca/missions/coop-campaign/ca-prologue-02-coop/map.yaml new file mode 100644 index 0000000000..edf809ab2b --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca-prologue-02-coop/map.yaml @@ -0,0 +1,1066 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: ii. Reprisal Co-op + +Author: Darkademic & Gandorques Hikla + +Tileset: WINTER + +MapSize: 52,52 + +Bounds: 1,1,50,50 + +Visibility: Lobby + +Categories: Co-op Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Greece, Civilians + PlayerReference@USSR: + Name: USSR + Faction: soviet + Color: FE1100 + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Greece, Civilians, Creeps + PlayerReference@Greece: + Name: Greece + Bot: campaign + Faction: allies + Color: 99ACF2 + Enemies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@Civilians: + Name: Civilians + NonCombatant: True + Faction: soviet + Enemies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: FE1100 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Greece, Civilians, Creeps + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: FF9922 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Greece, Civilians, Creeps + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: 994050 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Greece, Civilians, Creeps + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: 775A12 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Greece, Civilians, Creeps + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: 82C900 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Greece, Civilians, Creeps + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: DD1691 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Greece, Civilians, Creeps + +Actors: + Actor57: sbag + Owner: Greece + Location: 1,42 + Actor58: sbag + Owner: Greece + Location: 1,43 + Actor60: sbag + Owner: Greece + Location: 1,44 + Actor61: sbag + Owner: Greece + Location: 1,45 + Actor62: sbag + Owner: Greece + Location: 1,46 + Actor63: fact + Owner: Greece + Location: 2,46 + Actor64: sbag + Owner: Greece + Location: 1,47 + Actor65: sbag + Owner: Greece + Location: 1,48 + Actor66: sbag + Owner: Greece + Location: 1,49 + Actor67: sbag + Owner: Greece + Location: 1,50 + Actor68: sbag + Owner: Greece + Location: 2,50 + Actor69: sbag + Owner: Greece + Location: 3,50 + Actor70: sbag + Owner: Greece + Location: 4,50 + Actor71: sbag + Owner: Greece + Location: 5,50 + Actor72: sbag + Owner: Greece + Location: 6,50 + Actor73: sbag + Owner: Greece + Location: 7,50 + Actor74: sbag + Owner: Greece + Location: 12,50 + Actor23: sbag + Owner: Greece + Location: 8,50 + Actor24: sbag + Owner: Greece + Location: 10,50 + Actor25: sbag + Owner: Greece + Location: 9,50 + Actor26: sbag + Owner: Greece + Location: 11,50 + Actor42: sbag + Owner: Greece + Location: 16,45 + Actor43: sbag + Owner: Greece + Location: 16,46 + Actor44: sbag + Owner: Greece + Location: 16,47 + Actor45: sbag + Owner: Greece + Location: 16,48 + Actor46: sbag + Owner: Greece + Location: 16,49 + Actor47: sbag + Owner: Greece + Location: 16,50 + Actor48: sbag + Owner: Greece + Location: 15,50 + Actor49: sbag + Owner: Greece + Location: 14,50 + Actor50: sbag + Owner: Greece + Location: 13,50 + Actor75: proc + Owner: Greece + Location: 11,45 + Actor32: sbag + Owner: Greece + Location: 1,37 + Actor33: sbag + Owner: Greece + Location: 2,37 + Actor34: sbag + Owner: Greece + Location: 3,37 + Actor35: sbag + Owner: Greece + Location: 4,37 + Actor36: sbag + Owner: Greece + Location: 5,37 + Actor37: sbag + Owner: Greece + Location: 6,37 + Actor38: sbag + Owner: Greece + Location: 7,37 + Actor39: sbag + Owner: Greece + Location: 8,37 + Actor40: sbag + Owner: Greece + Location: 12,37 + Actor41: sbag + Owner: Greece + Location: 13,37 + Actor51: sbag + Owner: Greece + Location: 14,37 + Actor52: sbag + Owner: Greece + Location: 15,37 + Actor53: sbag + Owner: Greece + Location: 16,37 + Actor54: sbag + Owner: Greece + Location: 1,38 + Actor55: tent + Owner: Greece + Location: 5,38 + Actor56: weap + Owner: Greece + Location: 13,38 + Actor76: sbag + Owner: Greece + Location: 16,38 + Actor77: sbag + Owner: Greece + Location: 1,39 + Actor78: powr + Owner: Greece + Location: 2,39 + Actor79: sbag + Owner: Greece + Location: 16,39 + Actor80: sbag + Owner: Greece + Location: 1,40 + Actor81: sbag + Owner: Greece + Location: 16,40 + Actor82: sbag + Owner: Greece + Location: 1,41 + Actor83: sbag + Owner: Greece + Location: 16,41 + Actor84: pbox + Owner: Greece + Location: 7,36 + Actor85: pbox + Owner: Greece + Location: 13,36 + Actor86: silo + Owner: Greece + Location: 11,45 + Actor87: silo + Owner: Greece + Location: 13,45 + Actor88: powr + Owner: Greece + Location: 6,45 + Actor89: powr + Owner: Greece + Location: 2,42 + Actor106: t17 + Owner: Neutral + Location: 22,15 + Actor109: tc05 + Owner: Neutral + Location: 30,18 + Actor110: tc02 + Owner: Neutral + Location: 48,14 + Actor111: t12 + Owner: Neutral + Location: 50,17 + Actor112: t02 + Owner: Neutral + Location: 50,12 + Actor113: mine + Owner: Neutral + Location: 44,10 + Actor114: mine + Owner: Neutral + Location: 46,5 + Actor90: wood + Owner: Neutral + Location: 42,30 + Actor91: wood + Owner: Neutral + Location: 43,30 + Actor104: wood + Owner: Neutral + Location: 47,30 + Actor105: wood + Owner: Neutral + Location: 48,30 + Actor115: wood + Owner: Neutral + Location: 49,30 + Actor116: wood + Location: 26,40 + Faction: Random + Owner: Civilians + Actor117: wood + Location: 26,39 + Faction: Random + Owner: Civilians + Actor118: wood + Location: 26,37 + Faction: Random + Owner: Civilians + Actor119: wood + Location: 26,38 + Faction: Random + Owner: Civilians + Actor120: wood + Location: 27,37 + Faction: Random + Owner: Civilians + Actor121: wood + Location: 28,37 + Faction: Random + Owner: Civilians + Actor122: wood + Location: 26,44 + Faction: Random + Owner: Civilians + Actor123: wood + Location: 26,45 + Faction: Random + Owner: Civilians + Actor124: wood + Location: 26,46 + Faction: Random + Owner: Civilians + Actor125: wood + Location: 26,47 + Faction: Random + Owner: Civilians + Actor131: wood + Owner: Neutral + Location: 29,50 + Actor133: wood + Owner: Neutral + Location: 34,50 + Actor134: wood + Owner: Neutral + Location: 33,50 + Actor135: wood + Owner: Neutral + Location: 32,50 + Actor136: wood + Owner: Neutral + Location: 31,50 + Actor137: wood + Owner: Neutral + Location: 30,50 + Actor146: v02 + Location: 33,37 + Faction: Random + Owner: Civilians + Actor147: v04 + Location: 47,35 + Faction: Random + Owner: Civilians + Actor149: v09 + Location: 40,35 + Faction: Random + Owner: Civilians + Actor151: v05 + Location: 30,44 + Faction: Random + Owner: Civilians + Church: v01 + Location: 44,39 + Faction: Random + Owner: Civilians + Actor150: v11 + Location: 48,44 + Faction: Random + Owner: Civilians + Actor132: wood + Owner: Neutral + Location: 50,41 + Actor138: wood + Owner: Neutral + Location: 50,42 + Actor139: wood + Owner: Neutral + Location: 50,43 + Actor140: wood + Owner: Neutral + Location: 50,44 + Actor141: wood + Owner: Neutral + Location: 50,45 + Actor142: wood + Owner: Neutral + Location: 49,45 + Actor143: wood + Owner: Neutral + Location: 50,36 + Actor144: wood + Owner: Neutral + Location: 50,35 + Actor145: wood + Owner: Neutral + Location: 50,34 + Actor154: wood + Owner: Neutral + Location: 50,33 + Actor158: wood + Owner: Neutral + Location: 50,32 + Actor159: wood + Owner: Neutral + Location: 49,32 + Actor160: wood + Owner: Neutral + Location: 49,31 + Actor155: wood + Owner: Neutral + Location: 33,29 + Actor156: wood + Owner: Neutral + Location: 34,29 + Actor157: wood + Owner: Neutral + Location: 35,29 + Actor161: wood + Owner: Neutral + Location: 36,29 + Actor162: wood + Owner: Neutral + Location: 37,29 + Actor163: wood + Owner: Neutral + Location: 33,30 + Actor164: v18 + Owner: Neutral + Location: 34,30 + Actor165: v16 + Owner: Neutral + Location: 35,30 + Actor166: v18 + Owner: Neutral + Location: 36,30 + Actor167: wood + Owner: Neutral + Location: 37,30 + Actor168: wood + Owner: Neutral + Location: 33,31 + Actor172: wood + Owner: Neutral + Location: 33,32 + Actor173: v06 + Location: 34,32 + Faction: Random + Owner: Civilians + Actor174: wood + Owner: Neutral + Location: 33,33 + Actor175: wood + Owner: Neutral + Location: 34,33 + Actor153: wood + Owner: Neutral + Location: 38,30 + Actor169: v10 + Location: 45,43 + Faction: Random + Owner: Civilians + Actor170: v03 + Location: 40,42 + Faction: Random + Owner: Civilians + Actor171: v08 + Location: 37,38 + Faction: Random + Owner: Civilians + Actor148: v07 + Faction: Random + Owner: Civilians + Location: 35,44 + Actor176: tc02 + Owner: Neutral + Location: 29,39 + Actor177: tc01 + Owner: Neutral + Location: 47,41 + Actor178: t17 + Owner: Neutral + Location: 37,35 + Actor179: t15 + Owner: Neutral + Location: 41,31 + Actor180: t13 + Owner: Neutral + Location: 31,47 + Actor181: tc04 + Owner: Neutral + Location: 28,32 + Actor182: t06 + Owner: Neutral + Location: 25,37 + Actor183: tc02 + Owner: Neutral + Location: 35,24 + Actor184: t17 + Owner: Neutral + Location: 33,23 + Actor185: t10 + Owner: Neutral + Location: 31,26 + Actor186: mine + Owner: Neutral + Location: 22,48 + Actor188: mine + Owner: Neutral + Location: 23,32 + Actor187: mine + Owner: Neutral + Location: 9,6 + Actor189: t11 + Owner: Neutral + Location: 2,24 + Actor190: e2 + Owner: USSR + SubCell: 1 + Facing: 512 + Location: 29,6 + Actor191: e2 + Owner: USSR + SubCell: 2 + Facing: 512 + Location: 29,6 + Actor193: e1 + Owner: USSR + SubCell: 4 + Facing: 512 + Location: 29,7 + Actor194: e1 + Owner: USSR + SubCell: 5 + Facing: 512 + Location: 29,7 + Actor196: e2 + Owner: USSR + SubCell: 1 + Facing: 512 + Location: 35,6 + Actor197: e2 + Owner: USSR + SubCell: 2 + Facing: 512 + Location: 35,6 + Actor199: e1 + Owner: USSR + SubCell: 4 + Facing: 512 + Location: 35,7 + Actor200: e1 + Owner: USSR + SubCell: 5 + Facing: 512 + Location: 35,7 + Actor202: t07 + Owner: Neutral + Faction: ukraine + Location: 6,21 + Actor203: tc02 + Owner: Neutral + Faction: ukraine + Location: 10,19 + Actor205: t08 + Owner: Neutral + Faction: ukraine + Location: 9,19 + Actor206: t17 + Owner: Neutral + Faction: ukraine + Location: 9,15 + Actor207: t08 + Owner: Neutral + Faction: ukraine + Location: 10,21 + Actor208: t10 + Owner: Neutral + Faction: ukraine + Location: 9,17 + Actor204: t16 + Owner: Neutral + Faction: ukraine + Location: 22,23 + Actor209: tc05 + Owner: Neutral + Faction: ukraine + Location: 2,34 + Actor210: tc03 + Owner: Neutral + Faction: ukraine + Location: 4,32 + Actor211: t15 + Owner: Neutral + Faction: ukraine + Location: 37,18 + Actor213: jeep + Owner: Greece + Facing: 384 + Location: 46,34 + Actor214: jeep + Owner: Greece + Location: 29,42 + Facing: 761 + Actor216: jeep + Owner: Greece + Location: 15,36 + Facing: 111 + Actor217: jeep + Owner: Greece + Location: 18,40 + Facing: 769 + Actor218: 1tnk + Owner: Greece + Facing: 384 + Location: 13,41 + Actor219: e1 + Owner: Greece + Location: 47,34 + SubCell: 3 + Facing: 384 + Actor220: e1 + Owner: Greece + SubCell: 3 + Location: 45,36 + Facing: 927 + Actor221: e1 + Owner: Greece + Location: 40,34 + SubCell: 3 + Facing: 697 + Actor222: e1 + Owner: Greece + Location: 48,29 + SubCell: 3 + Facing: 0 + Actor223: e1 + Owner: Greece + SubCell: 3 + Location: 43,29 + Facing: 0 + Actor224: e1 + Owner: Greece + SubCell: 3 + Location: 45,19 + Facing: 126 + Actor225: e1 + Owner: Greece + Location: 46,18 + SubCell: 3 + Facing: 95 + TurretFacing: 0 + Actor215: e1 + Owner: Greece + SubCell: 3 + Location: 15,25 + Facing: 856 + Actor228: e1 + Owner: Greece + Location: 14,24 + SubCell: 3 + Facing: 967 + Actor229: e1 + Owner: Greece + SubCell: 3 + Location: 19,27 + Facing: 103 + Actor230: e1 + Owner: Greece + SubCell: 3 + Location: 20,26 + Facing: 79 + Actor231: e1 + Owner: Greece + SubCell: 3 + Location: 12,24 + Facing: 745 + Actor232: e1 + Owner: Greece + SubCell: 3 + Location: 4,26 + Facing: 951 + Actor233: e1 + Owner: Greece + SubCell: 3 + Location: 3,23 + Facing: 721 + Actor234: e1 + Owner: Greece + SubCell: 3 + Location: 6,18 + Facing: 384 + Actor235: e3 + Owner: Greece + SubCell: 3 + Location: 12,38 + Facing: 0 + Actor236: e3 + Owner: Greece + SubCell: 3 + Location: 6,36 + Facing: 0 + Actor237: e3 + Owner: Greece + Location: 17,40 + SubCell: 3 + Facing: 896 + Actor238: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 39,35 + Actor239: medi + Owner: Greece + SubCell: 3 + Location: 7,38 + Facing: 594 + Actor240: e1 + Owner: Greece + SubCell: 3 + Location: 7,35 + Facing: 0 + Actor241: e1 + Owner: Greece + SubCell: 3 + Location: 12,36 + Facing: 0 + Actor242: e1 + Owner: Greece + SubCell: 3 + Location: 19,41 + Facing: 650 + Actor243: e1 + Owner: Greece + Location: 17,39 + SubCell: 3 + Facing: 737 + Actor226: tecn + Owner: Civilians + Facing: 384 + SubCell: 3 + Location: 41,44 + Actor227: c10 + Owner: Civilians + SubCell: 3 + Location: 45,41 + Facing: 309 + Actor244: c6 + Owner: Civilians + Facing: 384 + SubCell: 3 + Location: 38,38 + Actor245: c3 + Owner: Civilians + SubCell: 3 + Location: 49,36 + Facing: 269 + Actor246: c2 + Owner: Civilians + Facing: 384 + SubCell: 3 + Location: 32,38 + Actor247: c8 + Owner: Civilians + SubCell: 3 + Location: 30,45 + Facing: 602 + Actor248: c9 + Owner: Civilians + SubCell: 3 + Location: 37,44 + Facing: 0 + Actor249: c4 + Owner: Civilians + Facing: 384 + SubCell: 3 + Location: 33,36 + Actor250: c2 + Owner: Civilians + SubCell: 3 + Location: 46,43 + Facing: 864 + Actor251: c9 + Owner: Civilians + SubCell: 3 + Location: 36,32 + Facing: 689 + McvSpawn: waypoint + Owner: Neutral + Location: 32,1 + McvRally: waypoint + Owner: Neutral + Location: 32,6 + Actor252: brl3 + Owner: Greece + Location: 48,31 + Actor253: barl + Owner: Greece + Location: 47,31 + Actor254: brl3 + Owner: Greece + Location: 17,37 + Actor255: barl + Owner: Greece + Location: 2,38 + Actor256: brl3 + Owner: Greece + Location: 3,38 + VillageCenter: waypoint + Owner: Neutral + Location: 42,40 + Actor257: wood + Faction: Random + Location: 27,47 + Owner: Civilians + Actor258: wood + Faction: Random + Location: 28,47 + Owner: Civilians + Actor259: wood + Faction: Random + Location: 29,47 + Owner: Civilians + Actor260: wood + Faction: Random + Location: 29,48 + Owner: Civilians + Actor261: wood + Faction: Random + Location: 29,49 + Owner: Civilians + EastAttackRally: waypoint + Owner: Neutral + Location: 45,34 + WestAttackRally: waypoint + Owner: Neutral + Location: 18,14 + SovietBase: waypoint + Owner: Neutral + Location: 34,13 + TeslaSpawn1: waypoint + Owner: Neutral + Location: 43,26 + TeslaBeacon: waypoint + Owner: Neutral + Location: 45,26 + TeslaSpawn2: waypoint + Owner: Neutral + Location: 47,26 + Actor263: jeep + Owner: Greece + Location: 16,27 + Facing: 919 + Actor264: e1 + Owner: Greece + SubCell: 3 + Location: 14,26 + Facing: 626 + TeslaTrigger1: waypoint + Owner: Neutral + Location: 42,24 + TeslaTrigger2: waypoint + Owner: Neutral + Location: 43,24 + TeslaTrigger3: waypoint + Owner: Neutral + Location: 44,24 + TeslaTrigger4: waypoint + Owner: Neutral + Location: 45,24 + TeslaTrigger5: waypoint + Owner: Neutral + Location: 46,24 + TeslaTrigger6: waypoint + Owner: Neutral + Location: 47,24 + TeslaTrigger7: waypoint + Owner: Neutral + Location: 48,24 + Actor262: t12 + Owner: Neutral + Location: 48,24 + Actor198: e1 + Owner: USSR + SubCell: 1 + Facing: 512 + Location: 35,7 + Actor201: e1 + Owner: USSR + SubCell: 2 + Facing: 512 + Location: 35,7 + Actor192: e1 + Owner: USSR + SubCell: 1 + Facing: 512 + Location: 29,7 + Actor195: e1 + Owner: USSR + SubCell: 2 + Facing: 512 + Location: 29,7 + Actor265: e1 + Owner: Greece + SubCell: 3 + Location: 46,20 + Facing: 229 + Actor266: e1 + Owner: Greece + SubCell: 3 + Location: 41,21 + Facing: 0 + Actor267: e1 + Owner: Greece + Location: 42,22 + SubCell: 3 + Facing: 880 + Actor268: c2 + Owner: Civilians + Facing: 384 + SubCell: 3 + Location: 35,41 + Actor269: c3 + Owner: Civilians + Facing: 384 + SubCell: 3 + Location: 39,39 + Actor270: c5 + Owner: Civilians + Facing: 384 + SubCell: 3 + Location: 35,47 + Actor271: c6 + Owner: Civilians + Facing: 384 + SubCell: 3 + Location: 46,39 + Actor272: c7 + Owner: Civilians + Facing: 384 + SubCell: 3 + Location: 49,41 + Actor273: c8 + Owner: Civilians + Facing: 384 + SubCell: 3 + Location: 42,46 + Actor274: c10 + Owner: Civilians + Facing: 384 + SubCell: 3 + Location: 38,43 + TeslaTriggerWest1: waypoint + Owner: Neutral + Location: 15,19 + TeslaTriggerWest2: waypoint + Owner: Neutral + Location: 16,19 + TeslaTriggerWest3: waypoint + Owner: Neutral + Location: 17,19 + TeslaTriggerWest4: waypoint + Owner: Neutral + Location: 18,19 + TeslaTriggerWest5: waypoint + Owner: Neutral + Location: 19,19 + TeslaTriggerWest6: waypoint + Owner: Neutral + Location: 20,19 + TeslaTriggerWest7: waypoint + Owner: Neutral + Location: 21,19 + TeslaTriggerWest8: waypoint + Owner: Neutral + Location: 8,13 + TeslaTriggerWest9: waypoint + Owner: Neutral + Location: 8,12 + TeslaTriggerWest10: waypoint + Owner: Neutral + Location: 8,11 + TeslaTriggerWest11: waypoint + Owner: Neutral + Location: 8,10 + TeslaTriggerWest12: waypoint + Owner: Neutral + Location: 8,9 + TeslaBeaconWest: waypoint + Owner: Neutral + Location: 18,21 + TeslaSpawnWest1: waypoint + Owner: Neutral + Location: 16,21 + TeslaSpawnWest2: waypoint + Owner: Neutral + Location: 20,21 + TeslaTriggerWest13: waypoint + Owner: Neutral + Location: 7,9 + TeslaTriggerWest14: waypoint + Owner: Neutral + Location: 6,9 + TeslaTriggerWest15: waypoint + Owner: Neutral + Location: 5,9 + TeslaTriggerWest16: waypoint + Owner: Neutral + Location: 4,9 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-doctrines.yaml, ca|missions/main-campaign/ca-prologue-02/reprisal-rules.yaml, ca|rules/custom/coop-rules.yaml, reprisal-coop-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/coop-campaign/ca-prologue-02-coop/reprisal-coop-rules.yaml b/mods/ca/missions/coop-campaign/ca-prologue-02-coop/reprisal-coop-rules.yaml new file mode 100644 index 0000000000..bea84b65df --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca-prologue-02-coop/reprisal-coop-rules.yaml @@ -0,0 +1,6 @@ +World: + LuaScript: + Scripts: campaign.lua, coop.lua, ca|missions/main-campaign/ca-prologue-02/reprisal.lua, reprisal-coop.lua + LobbyMissionInfo@InitialObjectives: + Prefix: Initial Objectives + Text: • Destroy the village and all its inhabitants.\n• Destroy the Allied base. diff --git a/mods/ca/missions/coop-campaign/ca-prologue-02-coop/reprisal-coop.lua b/mods/ca/missions/coop-campaign/ca-prologue-02-coop/reprisal-coop.lua new file mode 100644 index 0000000000..8a7f19f666 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca-prologue-02-coop/reprisal-coop.lua @@ -0,0 +1,35 @@ + +SetupPlayers = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Multi2 = Player.GetPlayer("Multi2") + Multi3 = Player.GetPlayer("Multi3") + Multi4 = Player.GetPlayer("Multi4") + Multi5 = Player.GetPlayer("Multi5") + Greece = Player.GetPlayer("Greece") + USSR = Player.GetPlayer("USSR") + Civilians = Player.GetPlayer("Civilians") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = Utils.Where({ Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 }, function(p) return p ~= nil end) + MissionEnemies = { Greece } + SinglePlayerPlayer = USSR + CoopInit() +end + +AfterWorldLoaded = function() + StartCashSpread(3500) +end + +AfterTick = function() + +end + +DoMcvArrival = function() + local delay = 0 + Utils.Do(GetMcvPlayers(), function(p) + Trigger.AfterDelay(delay, function() + Reinforcements.Reinforce(p, { "mcv" }, { McvSpawn.Location, McvRally.Location }) + end) + delay = delay + DateTime.Seconds(1) + end) +end diff --git a/mods/ca/missions/coop-campaign/ca-prologue-03-coop/detachment-coop-rules.yaml b/mods/ca/missions/coop-campaign/ca-prologue-03-coop/detachment-coop-rules.yaml new file mode 100644 index 0000000000..abaabf7640 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca-prologue-03-coop/detachment-coop-rules.yaml @@ -0,0 +1,6 @@ +World: + LuaScript: + Scripts: campaign.lua, coop.lua, ca|missions/main-campaign/ca-prologue-03/detachment.lua, detachment-coop.lua + LobbyMissionInfo@InitialObjectives: + Prefix: Initial Objectives + Text: • Make contact with GDI forces in the area and find a route to safety. diff --git a/mods/ca/missions/coop-campaign/ca-prologue-03-coop/detachment-coop.lua b/mods/ca/missions/coop-campaign/ca-prologue-03-coop/detachment-coop.lua new file mode 100644 index 0000000000..5f86852e06 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca-prologue-03-coop/detachment-coop.lua @@ -0,0 +1,25 @@ + +SetupPlayers = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Multi2 = Player.GetPlayer("Multi2") + Multi3 = Player.GetPlayer("Multi3") + Multi4 = Player.GetPlayer("Multi4") + Multi5 = Player.GetPlayer("Multi5") + GDI = Player.GetPlayer("GDI") + USSR = Player.GetPlayer("USSR") + HiddenGDI = Player.GetPlayer("HiddenGDI") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = Utils.Where({ Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 }, function(p) return p ~= nil end) + MissionEnemies = { USSR } + SinglePlayerPlayer = GDI + CoopInit() +end + +AfterWorldLoaded = function() + +end + +AfterTick = function() + +end diff --git a/mods/ca/missions/coop-campaign/ca-prologue-03-coop/map.bin b/mods/ca/missions/coop-campaign/ca-prologue-03-coop/map.bin new file mode 100644 index 0000000000..9d8c7fce81 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca-prologue-03-coop/map.bin differ diff --git a/mods/ca/missions/coop-campaign/ca-prologue-03-coop/map.png b/mods/ca/missions/coop-campaign/ca-prologue-03-coop/map.png new file mode 100644 index 0000000000..8adb12dc54 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca-prologue-03-coop/map.png differ diff --git a/mods/ca/missions/coop-campaign/ca-prologue-03-coop/map.yaml b/mods/ca/missions/coop-campaign/ca-prologue-03-coop/map.yaml new file mode 100644 index 0000000000..1aaf097d4a --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca-prologue-03-coop/map.yaml @@ -0,0 +1,1249 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: iii. Detachment Co-op + +Author: Darkademic & Gandorques Hikla + +Tileset: WINTER + +MapSize: 98,50 + +Bounds: 1,1,96,48 + +Visibility: Lobby + +Categories: Co-op Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: GDI, USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + PlayerReference@GDI: + Name: GDI + Faction: gdi + Color: F2CF74 + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Creeps + PlayerReference@USSR: + Name: USSR + Bot: campaign + Faction: soviet + Color: FE1100 + Enemies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@HiddenGDI: + Name: HiddenGDI + NonCombatant: True + Faction: gdi + Color: F2CF74 + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: F2CF74 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Creeps + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: EA7816 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Creeps + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: 0B7310 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Creeps + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: 0077D6 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Creeps + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: 82C900 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Creeps + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: 775A12 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Creeps + +Actors: + Actor0: tc05 + Owner: Neutral + Location: 3,17 + Actor1: tc02 + Owner: Neutral + Location: 1,19 + Actor2: t16 + Owner: Neutral + Location: 5,12 + Actor3: t17 + Owner: Neutral + Location: 16,9 + Actor4: tc04 + Owner: Neutral + Location: 15,2 + Actor5: tc02 + Owner: Neutral + Location: 2,1 + Actor6: t13 + Owner: Neutral + Location: 12,1 + Actor7: t13 + Owner: Neutral + Location: 16,6 + Actor8: t12 + Owner: Neutral + Location: 18,4 + Actor9: t05 + Owner: Neutral + Location: 17,10 + Actor10: t07 + Owner: Neutral + Location: 18,0 + Actor11: t01 + Owner: Neutral + Location: 5,15 + Actor12: tc01 + Owner: Neutral + Location: 3,14 + Actor13: t17 + Owner: Neutral + Location: 2,12 + Actor14: t10 + Owner: Neutral + Location: 1,15 + Actor15: t14 + Owner: Neutral + Location: 1,10 + Actor16: t08 + Owner: Neutral + Location: 10,1 + Actor17: tc04 + Owner: Neutral + Location: 24,26 + Actor18: t13 + Owner: Neutral + Location: 31,26 + Actor19: t06 + Owner: Neutral + Location: 28,19 + Actor20: t01 + Owner: Neutral + Location: 25,18 + Actor21: t11 + Owner: Neutral + Location: 19,22 + Actor22: tc02 + Owner: Neutral + Location: 20,24 + Actor23: tc05 + Owner: Neutral + Location: 27,22 + Actor24: t12 + Owner: Neutral + Location: 27,20 + Actor25: t01 + Owner: Neutral + Location: 21,20 + Actor26: t06 + Owner: Neutral + Location: 20,26 + Actor27: t16 + Owner: Neutral + Location: 29,25 + Actor28: tc03 + Owner: Neutral + Location: 21,22 + Actor29: tc01 + Owner: Neutral + Location: 26,24 + Actor30: t07 + Owner: Neutral + Location: 22,27 + Actor31: t01 + Owner: Neutral + Location: 23,25 + Actor32: t11 + Owner: Neutral + Location: 23,23 + Actor33: t12 + Owner: Neutral + Location: 25,25 + Actor34: t14 + Owner: Neutral + Location: 22,20 + Actor35: t10 + Owner: Neutral + Location: 25,21 + Actor36: t08 + Owner: Neutral + Location: 24,22 + Actor37: t07 + Owner: Neutral + Location: 26,19 + Actor38: t02 + Owner: Neutral + Location: 50,19 + Actor39: t01 + Owner: Neutral + Location: 49,14 + Actor40: t11 + Owner: Neutral + Location: 46,8 + Actor41: t13 + Owner: Neutral + Location: 46,29 + Actor42: tc01 + Owner: Neutral + Location: 27,0 + Actor43: tc02 + Owner: Neutral + Location: 29,0 + Actor44: t16 + Owner: Neutral + Location: 32,0 + Actor45: t17 + Owner: Neutral + Location: 31,0 + Actor46: t07 + Owner: Neutral + Location: 33,0 + Actor48: t01 + Owner: Neutral + Location: 41,5 + Actor49: t11 + Owner: Neutral + Location: 40,1 + Actor50: n1 + Owner: GDI + SubCell: 3 + Location: 7,9 + Facing: 674 + Actor51: n1 + Owner: GDI + Location: 7,9 + SubCell: 1 + Facing: 507 + Actor53: n1 + Owner: GDI + SubCell: 3 + Location: 11,9 + Facing: 483 + Actor56: n2 + Owner: GDI + SubCell: 3 + Location: 10,8 + Facing: 539 + Actor57: n2 + Owner: GDI + Location: 10,8 + SubCell: 1 + Facing: 547 + Actor58: n2 + Owner: GDI + SubCell: 3 + Location: 8,8 + Facing: 634 + Actor62: n1 + Owner: GDI + Location: 10,10 + SubCell: 1 + Facing: 523 + Actor61: e1 + Owner: USSR + SubCell: 3 + Location: 10,13 + Facing: 0 + Actor63: e1 + Owner: USSR + SubCell: 3 + Location: 12,12 + Facing: 71 + Actor64: e2 + Owner: USSR + SubCell: 3 + Location: 19,17 + Facing: 222 + Actor69: ftur + Owner: USSR + Location: 27,33 + Actor70: ftur + Owner: USSR + Location: 31,36 + Actor71: msam + Owner: HiddenGDI + Facing: 384 + Location: 31,3 + Actor72: msam + Owner: HiddenGDI + Facing: 384 + Location: 32,4 + Actor74: n1 + Owner: HiddenGDI + SubCell: 3 + Location: 32,5 + Facing: 523 + Actor75: n1 + Owner: HiddenGDI + SubCell: 3 + Facing: 293 + Location: 30,4 + Actor76: n1 + Owner: HiddenGDI + SubCell: 3 + Location: 9,31 + Facing: 610 + Actor77: n1 + Owner: HiddenGDI + Facing: 384 + Location: 9,31 + SubCell: 1 + Actor79: n1 + Owner: HiddenGDI + SubCell: 3 + Location: 12,32 + Facing: 384 + Actor80: n1 + Owner: HiddenGDI + SubCell: 3 + Location: 10,32 + Facing: 547 + Actor82: medi + Owner: HiddenGDI + Location: 12,30 + SubCell: 1 + Facing: 547 + Actor83: medi + Owner: HiddenGDI + SubCell: 3 + Location: 10,31 + Facing: 539 + Actor84: n2 + Owner: HiddenGDI + Location: 14,31 + SubCell: 2 + Facing: 594 + Actor78: n1 + Owner: HiddenGDI + SubCell: 3 + Location: 14,31 + Facing: 372 + Actor81: hmmv + Owner: HiddenGDI + Location: 11,31 + Facing: 515 + Actor88: e1 + Owner: USSR + SubCell: 3 + Location: 54,25 + Facing: 499 + Actor89: e1 + Owner: USSR + SubCell: 3 + Location: 53,24 + Facing: 483 + Actor90: e1 + Owner: USSR + SubCell: 3 + Location: 56,26 + Facing: 499 + Actor91: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 57,25 + Actor92: e1 + Owner: USSR + Facing: 384 + Location: 56,26 + SubCell: 1 + Actor94: e4 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 57,27 + Actor96: mtnk + Owner: HiddenGDI + Location: 67,46 + Facing: 245 + Actor95: mtnk + Owner: HiddenGDI + Location: 67,44 + Facing: 253 + Actor99: dome + Owner: USSR + Location: 67,33 + Actor97: fenc + Owner: USSR + Location: 57,29 + Actor100: fenc + Owner: USSR + Location: 56,29 + Actor101: fenc + Owner: USSR + Location: 50,27 + Actor102: fenc + Owner: USSR + Location: 51,27 + Actor103: fenc + Owner: USSR + Location: 59,20 + Actor104: fenc + Owner: USSR + Location: 59,21 + Actor105: fenc + Owner: USSR + Location: 59,19 + Actor106: fenc + Owner: USSR + Location: 59,18 + Actor107: fenc + Owner: USSR + Location: 60,30 + Actor108: fenc + Owner: USSR + Location: 61,30 + Actor109: fenc + Owner: USSR + Location: 62,30 + Actor110: fenc + Owner: USSR + Location: 63,30 + Actor111: fenc + Owner: USSR + Location: 67,30 + Actor112: fenc + Owner: USSR + Location: 68,30 + Actor113: fenc + Owner: USSR + Location: 70,30 + Actor114: fenc + Owner: USSR + Location: 69,30 + Actor115: fenc + Owner: USSR + Location: 71,30 + Actor116: fenc + Owner: USSR + Location: 72,30 + Actor118: fenc + Owner: USSR + Location: 73,31 + Actor119: fenc + Owner: USSR + Location: 74,32 + Actor120: fenc + Owner: USSR + Location: 73,32 + Actor121: fenc + Owner: USSR + Location: 74,31 + Actor117: fenc + Owner: USSR + Location: 72,31 + Actor122: fenc + Owner: USSR + Location: 60,31 + Actor123: fenc + Owner: USSR + Location: 59,32 + Actor124: fenc + Owner: USSR + Location: 60,32 + Actor126: vulc + Faction: eagle + Location: 62,3 + Facing: 245 + Owner: HiddenGDI + Actor127: vulc + Faction: eagle + Location: 63,5 + Facing: 134 + Owner: HiddenGDI + Actor130: n1 + Faction: eagle + SubCell: 3 + Location: 62,6 + Facing: 142 + Owner: HiddenGDI + Actor131: n1 + Faction: eagle + Location: 63,4 + SubCell: 3 + Owner: HiddenGDI + Facing: 253 + Actor132: n2 + Faction: eagle + SubCell: 3 + Location: 62,5 + Owner: HiddenGDI + Facing: 384 + Actor135: htnk + Faction: eagle + Owner: HiddenGDI + Location: 90,4 + Facing: 384 + Actor136: htnk + Faction: eagle + Owner: HiddenGDI + Location: 92,5 + Facing: 384 + Actor133: n1 + Faction: eagle + SubCell: 3 + Location: 88,4 + Facing: 531 + Owner: HiddenGDI + Actor134: n1 + Faction: eagle + Location: 92,4 + SubCell: 3 + Facing: 384 + Owner: HiddenGDI + Actor137: n1 + Faction: eagle + SubCell: 3 + Location: 94,6 + Facing: 142 + Owner: HiddenGDI + Actor138: n1 + Faction: eagle + SubCell: 3 + Location: 92,6 + Facing: 293 + Owner: HiddenGDI + Actor139: e1 + Owner: USSR + SubCell: 3 + Location: 55,38 + Facing: 384 + Actor140: e1 + Owner: USSR + SubCell: 3 + Location: 51,37 + Facing: 531 + Actor141: e1 + Owner: USSR + SubCell: 3 + Location: 56,37 + Facing: 384 + Actor142: e1 + Owner: USSR + SubCell: 3 + Location: 37,25 + Facing: 785 + Actor143: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 40,28 + Actor144: e1 + Owner: USSR + SubCell: 3 + Location: 41,27 + Facing: 0 + Actor145: e3 + Owner: USSR + SubCell: 3 + Location: 40,25 + Facing: 285 + Actor146: n1 + Owner: GDI + SubCell: 3 + Location: 8,11 + Facing: 689 + Actor147: ice02 + Owner: Neutral + Faction: russia + Location: 80,20 + Actor148: ice01 + Owner: Neutral + Faction: russia + Location: 75,22 + Actor154: brl3 + Owner: USSR + Location: 89,10 + Actor151: brl3 + Owner: USSR + Location: 88,9 + Actor150: brl3 + Owner: USSR + Location: 87,8 + Actor149: barl + Owner: USSR + Location: 87,9 + Actor152: barl + Owner: USSR + Location: 88,10 + Actor153: fenc + Owner: USSR + Location: 89,9 + Actor155: fenc + Owner: USSR + Location: 89,8 + Actor156: fenc + Owner: USSR + Location: 90,8 + Actor157: fenc + Owner: USSR + Location: 86,9 + Actor158: fenc + Owner: USSR + Location: 85,9 + Actor159: fenc + Owner: USSR + Location: 84,8 + Actor160: fenc + Owner: USSR + Location: 84,9 + Actor161: btr + Owner: USSR + Location: 84,13 + Facing: 261 + Actor162: e3 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 85,12 + Actor163: e1 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 82,9 + Actor164: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 89,13 + Actor165: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 84,14 + Actor166: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 86,13 + Actor167: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 81,11 + Actor168: tc04 + Owner: Neutral + Location: 83,0 + Actor169: t12 + Owner: Neutral + Location: 86,0 + Actor170: tc05 + Owner: Neutral + Location: 94,1 + Actor171: tc02 + Owner: Neutral + Location: 91,0 + Actor172: t07 + Owner: Neutral + Location: 88,0 + Actor173: t01 + Owner: Neutral + Location: 96,5 + Actor174: t13 + Owner: Neutral + Location: 96,8 + Actor175: tc03 + Owner: Neutral + Location: 95,7 + Actor176: t05 + Owner: Neutral + Location: 84,4 + Actor177: t01 + Owner: Neutral + Location: 68,4 + Actor178: t06 + Owner: Neutral + Location: 96,24 + Actor179: t12 + Owner: Neutral + Location: 96,21 + Actor180: t14 + Owner: Neutral + Location: 92,25 + Actor181: tc04 + Owner: Neutral + Location: 93,12 + Actor182: tc05 + Owner: Neutral + Location: 75,7 + Actor183: t13 + Owner: Neutral + Location: 75,13 + Actor184: t12 + Owner: Neutral + Location: 73,19 + Actor185: t14 + Owner: Neutral + Location: 59,16 + Actor186: tc01 + Owner: Neutral + Location: 69,16 + Actor187: tc02 + Owner: Neutral + Location: 46,4 + Actor188: t05 + Owner: Neutral + Location: 48,1 + Actor189: t03 + Owner: Neutral + Location: 69,8 + Actor190: t07 + Owner: Neutral + Location: 63,12 + Actor191: t17 + Owner: Neutral + Location: 47,34 + Actor192: tc04 + Owner: Neutral + Location: 46,31 + Actor193: t16 + Owner: Neutral + Location: 48,28 + Actor194: t14 + Owner: Neutral + Location: 61,39 + Actor197: t07 + Owner: Neutral + Location: 58,40 + Actor198: t05 + Owner: Neutral + Location: 70,42 + Actor199: t15 + Owner: Neutral + Location: 69,47 + Actor200: t13 + Owner: Neutral + Location: 54,46 + Actor202: tc04 + Owner: Neutral + Location: 36,44 + Actor203: t11 + Owner: Neutral + Location: 46,43 + Actor204: t16 + Owner: Neutral + Location: 40,36 + Actor205: t01 + Owner: Neutral + Location: 35,39 + Actor206: t01 + Owner: Neutral + Location: 15,22 + Actor207: t13 + Owner: Neutral + Location: 6,5 + Actor208: t10 + Owner: Neutral + Location: 49,11 + Actor209: t05 + Owner: Neutral + Location: 55,9 + Actor210: t01 + Owner: Neutral + Location: 50,8 + Actor211: t16 + Owner: Neutral + Location: 46,26 + Actor212: t03 + Owner: Neutral + Location: 47,21 + Actor213: t10 + Owner: Neutral + Location: 38,20 + Actor214: t05 + Owner: Neutral + Location: 33,14 + Actor215: t07 + Owner: Neutral + Location: 25,7 + Actor216: t10 + Owner: Neutral + Location: 33,7 + Actor217: t01 + Owner: Neutral + Location: 36,5 + Actor218: t15 + Owner: Neutral + Location: 21,3 + Actor219: t06 + Owner: Neutral + Location: 21,17 + Actor220: t05 + Owner: Neutral + Location: 8,20 + Actor221: t01 + Owner: Neutral + Location: 5,37 + Actor222: t14 + Owner: Neutral + Location: 27,42 + Actor223: t17 + Owner: Neutral + Location: 35,37 + Actor224: t05 + Owner: Neutral + Location: 35,30 + Actor225: t15 + Owner: Neutral + Location: 40,42 + Actor226: t12 + Owner: Neutral + Location: 56,32 + Actor227: tc05 + Owner: Neutral + Location: 82,37 + Actor228: tc04 + Owner: Neutral + Location: 80,41 + Actor229: tc03 + Owner: Neutral + Location: 89,32 + Actor230: tc02 + Owner: Neutral + Location: 89,41 + Actor231: t14 + Owner: Neutral + Location: 79,45 + Actor232: t13 + Owner: Neutral + Location: 95,31 + Actor233: t10 + Owner: Neutral + Location: 76,35 + Actor234: tc02 + Owner: Neutral + Location: 85,19 + Actor235: tc03 + Owner: Neutral + Location: 81,24 + Actor236: tc01 + Owner: Neutral + Location: 61,28 + Actor237: ftur + Owner: USSR + Location: 41,15 + Actor238: dog + Owner: USSR + SubCell: 3 + Location: 52,36 + Facing: 515 + Actor239: dog + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 18,17 + Actor240: e1 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 28,32 + Actor241: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 32,36 + Actor242: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 30,33 + Actor243: e1 + Owner: USSR + SubCell: 3 + Location: 41,11 + Facing: 384 + Actor244: e1 + Owner: USSR + SubCell: 3 + Location: 40,17 + Facing: 142 + Actor245: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 50,11 + Actor246: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 55,15 + Actor247: e2 + Owner: USSR + SubCell: 3 + Location: 80,28 + Facing: 229 + Actor248: e2 + Owner: USSR + SubCell: 3 + Location: 87,32 + Facing: 166 + Actor249: e2 + Owner: USSR + SubCell: 3 + Location: 69,32 + Facing: 384 + Actor250: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 66,35 + Actor251: e1 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 69,35 + Actor252: e1 + Owner: USSR + Location: 69,29 + SubCell: 3 + Facing: 103 + Actor253: e1 + Owner: USSR + SubCell: 3 + Location: 64,29 + Facing: 0 + Actor254: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 64,12 + Actor255: e1 + Owner: USSR + Facing: 384 + Location: 70,18 + SubCell: 3 + Actor256: e1 + Owner: USSR + SubCell: 3 + Location: 71,7 + Facing: 555 + Actor257: e1 + Owner: USSR + SubCell: 3 + Location: 72,5 + Facing: 650 + Actor258: e1 + Owner: USSR + SubCell: 3 + Location: 49,7 + Facing: 626 + Actor259: e1 + Owner: USSR + SubCell: 3 + Location: 48,8 + Facing: 578 + Actor262: n2 + Owner: HiddenGDI + Facing: 384 + Location: 91,3 + SubCell: 3 + Actor263: n2 + Owner: HiddenGDI + SubCell: 3 + Location: 66,47 + Facing: 206 + Actor264: n1 + Owner: HiddenGDI + SubCell: 3 + Location: 69,44 + Facing: 253 + Actor265: n1 + Owner: HiddenGDI + SubCell: 3 + Location: 66,43 + Facing: 261 + Actor266: barr + Owner: USSR + Location: 62,31 + Actor267: btr + Owner: USSR + Location: 65,30 + Facing: 0 + Actor268: 3tnk + Owner: USSR + Location: 90,38 + Facing: 95 + Actor269: 3tnk + Owner: USSR + Location: 91,36 + Facing: 103 + Actor270: n3 + Owner: HiddenGDI + SubCell: 3 + Location: 68,45 + Facing: 384 + Actor272: n3 + Owner: HiddenGDI + Facing: 384 + SubCell: 3 + Location: 87,3 + Group1: waypoint + Owner: Neutral + Location: 11,32 + Group2: waypoint + Owner: Neutral + Location: 31,4 + Group3: waypoint + Owner: Neutral + Location: 67,45 + Group4: waypoint + Owner: Neutral + Location: 62,4 + Group5: waypoint + Owner: Neutral + Location: 91,4 + SignalFlare: waypoint + Owner: Neutral + Location: 87,38 + Reveal1: waypoint + Owner: Neutral + Location: 29,34 + Reveal2: waypoint + Owner: Neutral + Location: 41,15 + Reveal4: waypoint + Owner: Neutral + Location: 65,30 + PlayerStart: waypoint + Owner: Neutral + Location: 9,9 + Actor273: e2 + Owner: USSR + SubCell: 3 + Facing: 222 + Location: 18,15 + Actor274: powr + Owner: USSR + Location: 70,31 + Actor275: e1 + Owner: USSR + SubCell: 3 + Location: 88,35 + Facing: 253 + Actor276: e1 + Owner: USSR + SubCell: 3 + Location: 85,38 + Facing: 237 + Actor277: e1 + Owner: USSR + SubCell: 3 + Location: 83,36 + Facing: 7 + Actor278: e1 + Owner: USSR + SubCell: 3 + Location: 92,35 + Facing: 245 + Actor279: e1 + Owner: USSR + SubCell: 3 + Location: 89,36 + Facing: 253 + Actor280: e1 + Owner: USSR + SubCell: 3 + Location: 91,33 + Facing: 134 + Actor281: e1 + Owner: USSR + SubCell: 3 + Location: 81,37 + Facing: 87 + RescueSpawn: waypoint + Owner: Neutral + Location: 96,44 + Actor282: btr + Owner: USSR + Facing: 261 + Location: 92,32 + Actor283: e2 + Owner: USSR + SubCell: 3 + Facing: 222 + Location: 33,34 + Actor284: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 40,33 + Actor285: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 60,19 + RescueRally1: waypoint + Owner: Neutral + Location: 87,44 + RescueRally2: waypoint + Owner: Neutral + Location: 87,36 + Reveal3: waypoint + Owner: Neutral + Location: 59,26 + Actor286: 3tnk + Owner: USSR + Facing: 384 + Location: 59,25 + Actor287: e4 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 60,26 + Actor288: medi + Owner: HiddenGDI + Facing: 384 + SubCell: 3 + Location: 63,2 + Actor289: n3 + Owner: HiddenGDI + Facing: 384 + SubCell: 3 + Location: 61,2 + Actor290: n1 + Faction: eagle + SubCell: 3 + Facing: 523 + Owner: HiddenGDI + Location: 62,2 + Actor291: n1 + Faction: eagle + SubCell: 1 + Facing: 384 + Owner: HiddenGDI + Location: 62,2 + Actor292: e1 + Owner: USSR + SubCell: 3 + Location: 12,44 + Facing: 134 + Actor293: e1 + Owner: USSR + SubCell: 3 + Location: 15,45 + Facing: 15 + Actor294: e2 + Owner: USSR + SubCell: 3 + Location: 16,41 + Facing: 253 + Actor295: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 27,42 + Actor296: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 39,45 + Actor297: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 46,43 + Actor298: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 45,45 + Actor299: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 57,46 + Actor300: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 56,44 + Actor301: e1 + Owner: USSR + SubCell: 3 + Location: 49,4 + Facing: 602 + Actor302: e1 + Owner: USSR + SubCell: 3 + Location: 90,21 + Facing: 79 + Actor303: e2 + Owner: USSR + SubCell: 3 + Location: 87,22 + Facing: 253 + Actor304: e2 + Owner: USSR + SubCell: 3 + Location: 92,24 + Facing: 384 + Actor305: tc02 + Owner: Neutral + Location: 60,44 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|missions/main-campaign/ca-prologue-03/detachment-rules.yaml, ca|rules/custom/coop-rules.yaml, detachment-coop-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/coop-campaign/ca-prologue-04-coop/juncture-coop-rules.yaml b/mods/ca/missions/coop-campaign/ca-prologue-04-coop/juncture-coop-rules.yaml new file mode 100644 index 0000000000..affd6bc4d0 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca-prologue-04-coop/juncture-coop-rules.yaml @@ -0,0 +1,6 @@ +World: + LuaScript: + Scripts: campaign.lua, coop.lua, ca|missions/main-campaign/ca-prologue-04/juncture.lua, juncture-coop.lua + LobbyMissionInfo@InitialObjectives: + Prefix: Initial Objectives + Text: • Destroy GDI anti-aircraft defenses.\n• Destroy the GDI naval blockade. diff --git a/mods/ca/missions/coop-campaign/ca-prologue-04-coop/juncture-coop.lua b/mods/ca/missions/coop-campaign/ca-prologue-04-coop/juncture-coop.lua new file mode 100644 index 0000000000..ebabfce80d --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca-prologue-04-coop/juncture-coop.lua @@ -0,0 +1,45 @@ + +SetupPlayers = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Multi2 = Player.GetPlayer("Multi2") + Multi3 = Player.GetPlayer("Multi3") + Multi4 = Player.GetPlayer("Multi4") + Multi5 = Player.GetPlayer("Multi5") + GDI = Player.GetPlayer("GDI") + Nod = Player.GetPlayer("Nod") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = Utils.Where({ Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 }, function(p) return p ~= nil end) + MissionEnemies = { GDI } + SinglePlayerPlayer = Nod + CoopInit() +end + +AfterWorldLoaded = function() + TransferMcvsToPlayers() + StartCashSpread(3500) +end + +AfterTick = function() + +end + +WarpInBanshees = function() + local firstActivePlayer = GetFirstActivePlayer() + if firstActivePlayer == nil then + return + end + + local hpad1 = Actor.Create("hpad.td", true, { Owner = firstActivePlayer, Location = HpadSpawn1.Location }) + local hpad2 = Actor.Create("hpad.td", true, { Owner = firstActivePlayer, Location = HpadSpawn2.Location }) + + Trigger.AfterDelay(10, function() + local useFirstHpad = true + for _, player in ipairs(MissionPlayers) do + local hpad = useFirstHpad and hpad1 or hpad2 + local banshee = Actor.Create("scrn", true, { Owner = player, Location = hpad.Location, CenterPosition = hpad.CenterPosition, Facing = Angle.NorthEast }) + banshee.Move(hpad.Location) + useFirstHpad = not useFirstHpad + end + end) +end diff --git a/mods/ca/missions/coop-campaign/ca-prologue-04-coop/map.bin b/mods/ca/missions/coop-campaign/ca-prologue-04-coop/map.bin new file mode 100644 index 0000000000..39b70246ef Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca-prologue-04-coop/map.bin differ diff --git a/mods/ca/missions/coop-campaign/ca-prologue-04-coop/map.png b/mods/ca/missions/coop-campaign/ca-prologue-04-coop/map.png new file mode 100644 index 0000000000..2244214a25 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca-prologue-04-coop/map.png differ diff --git a/mods/ca/missions/coop-campaign/ca-prologue-04-coop/map.yaml b/mods/ca/missions/coop-campaign/ca-prologue-04-coop/map.yaml new file mode 100644 index 0000000000..821b447f69 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca-prologue-04-coop/map.yaml @@ -0,0 +1,847 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: iv. Juncture Co-op + +Author: Darkademic & Gandorques Hikla + +Tileset: DESERT + +MapSize: 56,56 + +Bounds: 1,1,54,54 + +Visibility: Lobby + +Categories: Co-op Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, GDI + PlayerReference@Nod: + Name: Nod + Faction: nod + Color: FE1100 + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: GDI, Creeps + PlayerReference@GDI: + Name: GDI + Bot: campaign + Faction: gdi + Color: F2CF74 + Enemies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: FE1100 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: GDI, Creeps + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: 0B7310 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: GDI, Creeps + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: 134691 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: GDI, Creeps + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: 775A12 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: GDI, Creeps + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: 82C900 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: GDI, Creeps + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: EEA8A8 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: GDI, Creeps + +Actors: + Actor0: dd2 + Owner: GDI + Location: 49,17 + Facing: 512 + Actor3: dd2 + Owner: GDI + Facing: 512 + Location: 51,22 + Actor6: dd2 + Owner: GDI + Facing: 512 + Location: 51,11 + Actor7: syrd.gdi + Owner: GDI + Location: 43,7 + Actor8: brik + Owner: GDI + Location: 41,13 + Actor9: brik + Owner: GDI + Location: 41,12 + Actor10: brik + Owner: GDI + Location: 40,13 + Actor11: brik + Owner: GDI + Location: 40,12 + Actor12: brik + Owner: GDI + Location: 36,13 + Actor13: brik + Owner: GDI + Location: 38,13 + Actor14: brik + Owner: GDI + Location: 39,13 + Actor15: brik + Owner: GDI + Location: 37,13 + Actor16: brik + Owner: GDI + Location: 35,13 + Actor17: brik + Owner: GDI + Location: 35,12 + Actor18: brik + Owner: GDI + Location: 36,12 + Actor19: brik + Owner: GDI + Location: 31,12 + Actor20: brik + Owner: GDI + Location: 31,13 + Actor21: brik + Owner: GDI + Location: 30,13 + Actor22: brik + Owner: GDI + Location: 30,12 + Actor23: brik + Owner: GDI + Location: 29,13 + Actor24: brik + Owner: GDI + Location: 28,13 + Actor25: brik + Owner: GDI + Location: 27,13 + Actor26: brik + Owner: GDI + Location: 27,12 + Actor27: brik + Owner: GDI + Location: 27,10 + Actor28: brik + Owner: GDI + Location: 27,11 + Actor29: brik + Owner: GDI + Location: 27,9 + Actor30: brik + Owner: GDI + Location: 27,8 + Actor31: brik + Owner: GDI + Location: 27,7 + Actor32: brik + Owner: GDI + Location: 27,6 + Actor33: brik + Owner: GDI + Location: 27,5 + Actor34: brik + Owner: GDI + Location: 27,4 + Actor35: brik + Owner: GDI + Location: 27,3 + Actor36: brik + Owner: GDI + Location: 27,2 + Actor37: brik + Owner: GDI + Location: 27,1 + Actor38: brik + Owner: GDI + Location: 28,1 + Actor39: brik + Owner: GDI + Location: 29,1 + Actor40: brik + Owner: GDI + Location: 30,1 + Actor41: brik + Owner: GDI + Location: 31,1 + Actor42: brik + Owner: GDI + Location: 33,1 + Actor43: brik + Owner: GDI + Location: 32,1 + Actor44: brik + Owner: GDI + Location: 34,1 + Actor45: brik + Owner: GDI + Location: 36,1 + Actor46: brik + Owner: GDI + Location: 35,1 + Actor47: brik + Owner: GDI + Location: 37,1 + Actor48: brik + Owner: GDI + Location: 38,1 + Actor49: brik + Owner: GDI + Location: 39,1 + Actor50: brik + Owner: GDI + Location: 40,1 + Actor51: brik + Owner: GDI + Location: 40,2 + Actor52: brik + Owner: GDI + Location: 39,2 + Actor53: hq + Owner: GDI + Location: 28,2 + Actor54: afac + Owner: GDI + Location: 36,2 + Actor55: atwr + Owner: GDI + Location: 29,12 + Actor56: atwr + Owner: GDI + Location: 37,12 + Actor57: gtwr + Owner: GDI + Location: 31,14 + Actor58: gtwr + Owner: GDI + Location: 35,14 + Actor59: proc.td + Owner: GDI + Location: 29,6 + Actor60: nuk2 + Owner: GDI + Location: 34,2 + Actor61: nuk2 + Owner: GDI + Location: 32,2 + Actor62: nuk2 + Owner: GDI + Location: 30,2 + Actor63: pyle + Owner: GDI + Location: 35,8 + Actor64: weap.td + Owner: GDI + Location: 38,7 + Actor65: silo.td + Owner: GDI + Location: 39,3 + Actor66: silo.td + Owner: GDI + Location: 39,4 + Actor68: cram + Owner: GDI + Location: 39,33 + TurretFacing: 245 + Actor70: cram + Owner: GDI + Location: 40,20 + TurretFacing: 237 + Actor71: cram + Owner: GDI + Location: 34,27 + TurretFacing: 222 + Actor72: sbag + Owner: GDI + Location: 39,20 + Actor73: sbag + Owner: GDI + Location: 39,19 + Actor74: sbag + Owner: GDI + Location: 40,19 + Actor75: sbag + Owner: GDI + Location: 41,19 + Actor76: sbag + Owner: GDI + Location: 41,20 + Actor77: sbag + Owner: GDI + Location: 41,21 + Actor78: sbag + Owner: GDI + Location: 40,21 + Actor79: sbag + Owner: GDI + Location: 39,21 + Actor80: sbag + Owner: GDI + Location: 34,26 + Actor81: sbag + Owner: GDI + Location: 35,26 + Actor82: sbag + Owner: GDI + Location: 35,27 + Actor83: sbag + Owner: GDI + Location: 33,26 + Actor84: sbag + Owner: GDI + Location: 33,28 + Actor85: sbag + Owner: GDI + Location: 33,27 + Actor86: sbag + Owner: GDI + Location: 34,28 + Actor87: sbag + Owner: GDI + Location: 35,28 + Actor88: sbag + Owner: GDI + Location: 38,32 + Actor89: sbag + Owner: GDI + Location: 39,32 + Actor90: sbag + Owner: GDI + Location: 40,32 + Actor91: sbag + Owner: GDI + Location: 40,33 + Actor92: sbag + Owner: GDI + Location: 38,33 + Actor93: sbag + Owner: GDI + Location: 38,34 + Actor94: sbag + Owner: GDI + Location: 39,34 + Actor95: sbag + Owner: GDI + Location: 40,34 + Actor104: cram + Owner: GDI + Location: 33,51 + TurretFacing: 293 + Actor105: sbag + Owner: GDI + Location: 34,51 + Actor106: sbag + Owner: GDI + Location: 34,52 + Actor107: sbag + Owner: GDI + Location: 33,52 + Actor108: sbag + Owner: GDI + Location: 32,52 + Actor109: sbag + Owner: GDI + Location: 32,51 + Actor110: sbag + Owner: GDI + Location: 32,50 + Actor111: sbag + Owner: GDI + Location: 33,50 + Actor112: sbag + Owner: GDI + Location: 34,50 + Actor101: sbag + Owner: GDI + Location: 39,41 + Actor102: sbag + Owner: GDI + Location: 40,41 + Actor103: sbag + Owner: GDI + Location: 41,41 + Actor113: sbag + Owner: GDI + Location: 39,42 + Actor114: cram + Owner: GDI + Location: 40,42 + TurretFacing: 293 + Actor115: sbag + Owner: GDI + Location: 41,42 + Actor116: sbag + Owner: GDI + Location: 39,43 + Actor117: sbag + Owner: GDI + Location: 40,43 + Actor118: sbag + Owner: GDI + Location: 41,43 + Actor119: dd2 + Owner: GDI + Facing: 512 + Location: 49,27 + Actor120: dd2 + Owner: GDI + Facing: 512 + Location: 51,32 + RocksToRemove1: rock6 + Owner: Neutral + Location: 4,42 + RocksToRemove2: rock5 + Owner: Neutral + Location: 4,44 + Actor123: split2 + Owner: Neutral + Location: 5,50 + Actor124: split2 + Owner: Neutral + Location: 11,45 + Actor125: split2 + Owner: Neutral + Location: 23,12 + Actor126: split2 + Owner: Neutral + Location: 24,5 + Actor127: split2 + Owner: Neutral + Location: 3,30 + Actor128: t18 + Owner: Neutral + Location: 19,25 + Actor129: t18 + Owner: Neutral + Location: 5,11 + Actor130: t18 + Owner: Neutral + Location: 13,26 + Actor131: tc01 + Owner: Neutral + Location: 34,41 + Actor132: t08 + Owner: Neutral + Location: 25,33 + Actor133: t09 + Owner: Neutral + Location: 25,18 + Actor134: v33 + Owner: Neutral + Location: 9,7 + Actor135: v32 + Owner: Neutral + Location: 14,10 + Actor137: v31 + Owner: Neutral + Location: 10,3 + Actor136: v23 + Owner: Neutral + Location: 11,10 + Actor138: v26 + Owner: Neutral + Location: 14,6 + Actor139: v27 + Owner: Neutral + Location: 14,16 + Actor140: v21 + Owner: Neutral + Location: 5,2 + Actor141: c5 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 7,5 + Actor142: c8 + Owner: Neutral + SubCell: 3 + Location: 15,9 + Facing: 697 + Actor143: mtnk + Owner: GDI + Location: 23,20 + Facing: 256 + Actor144: mtnk + Owner: GDI + Location: 25,20 + Facing: 256 + Actor145: apc.ai + Owner: GDI + Location: 27,20 + Facing: 256 + Actor146: mtnk + Owner: GDI + Facing: 384 + Location: 36,15 + Actor147: mtnk + Owner: GDI + Location: 40,10 + Facing: 618 + Actor148: hmmv + Owner: GDI + Location: 11,29 + Facing: 634 + Actor149: hmmv + Owner: GDI + Facing: 384 + Location: 35,32 + Actor150: hmmv + Owner: GDI + Location: 8,9 + Facing: 626 + Actor151: mtnk + Owner: GDI + Location: 12,7 + Facing: 523 + Actor156: n1 + Owner: GDI + SubCell: 3 + Location: 13,29 + Facing: 384 + Actor157: n1 + Owner: GDI + Location: 10,30 + SubCell: 3 + Facing: 547 + Actor158: n1 + Owner: GDI + SubCell: 3 + Location: 15,31 + Facing: 475 + Actor159: n1 + Owner: GDI + Location: 14,28 + SubCell: 3 + Facing: 586 + Actor160: n2 + Owner: GDI + SubCell: 3 + Location: 12,28 + Facing: 618 + Actor161: n1 + Owner: GDI + SubCell: 3 + Location: 35,30 + Facing: 285 + Actor162: n1 + Owner: GDI + SubCell: 3 + Location: 37,32 + Facing: 626 + Actor164: n1 + Owner: GDI + Facing: 384 + Location: 37,33 + SubCell: 1 + Actor163: n1 + Owner: GDI + SubCell: 3 + Location: 38,40 + Facing: 174 + Actor165: n1 + Owner: GDI + SubCell: 3 + Location: 36,43 + Facing: 642 + Actor166: n1 + Owner: GDI + SubCell: 3 + Location: 35,41 + Facing: 158 + Actor167: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 35,15 + Actor168: n1 + Owner: GDI + Facing: 384 + Location: 30,14 + SubCell: 3 + Actor169: n1 + Owner: GDI + SubCell: 3 + Location: 34,12 + Facing: 507 + Actor170: n1 + Owner: GDI + Location: 37,10 + SubCell: 3 + Facing: 523 + Actor171: n1 + Owner: GDI + Facing: 384 + Location: 34,8 + SubCell: 3 + Actor172: n1 + Owner: GDI + SubCell: 3 + Location: 35,7 + Facing: 483 + Actor173: n1 + Owner: GDI + SubCell: 3 + Location: 8,10 + Facing: 499 + Actor174: n1 + Owner: GDI + Facing: 384 + Location: 8,10 + SubCell: 1 + Actor175: n1 + Owner: GDI + SubCell: 3 + Location: 13,8 + Facing: 563 + Actor176: n1 + Owner: GDI + SubCell: 3 + Location: 16,11 + Facing: 626 + Actor177: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 11,9 + Actor178: n2 + Owner: GDI + SubCell: 3 + Facing: 384 + Location: 14,12 + Actor179: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 7,16 + Actor180: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 38,31 + Actor181: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 38,21 + Actor182: n1 + Owner: GDI + Facing: 384 + Location: 38,20 + SubCell: 3 + Actor183: n1 + Owner: GDI + Facing: 384 + Location: 25,33 + SubCell: 1 + Actor184: n1 + Owner: GDI + SubCell: 3 + Location: 25,28 + Facing: 745 + Actor185: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 31,51 + Actor186: n1 + Owner: GDI + SubCell: 3 + Location: 6,9 + Facing: 634 + Actor187: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 24,21 + Actor188: n2 + Owner: GDI + Location: 25,19 + SubCell: 3 + Facing: 174 + Actor189: n1 + Owner: GDI + SubCell: 3 + Location: 22,19 + Facing: 79 + Actor190: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 22,21 + Actor191: n1 + Owner: GDI + SubCell: 3 + Location: 26,21 + Facing: 384 + AttackPath1: waypoint + Owner: Neutral + Location: 32,20 + AttackPath2: waypoint + Owner: Neutral + Location: 12,18 + AttackPath3: waypoint + Owner: Neutral + Location: 5,25 + AttackPath4: waypoint + Owner: Neutral + Location: 16,39 + Actor193: amcv + Owner: Nod + Facing: 0 + Location: 22,51 + PlayerStart: waypoint + Owner: Neutral + Location: 22,50 + Actor192: bggy + Owner: Nod + Location: 24,49 + Facing: 0 + Actor194: bggy + Owner: Nod + Location: 20,49 + Facing: 0 + Actor196: n1 + Owner: GDI + SubCell: 3 + Location: 17,36 + Facing: 491 + Actor197: n1 + Owner: GDI + SubCell: 3 + Location: 16,37 + Facing: 634 + Actor198: n2 + Owner: GDI + SubCell: 3 + Location: 14,38 + Facing: 555 + Actor199: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 19,37 + Actor206: n1 + Owner: Nod + SubCell: 1 + Facing: 0 + Location: 20,47 + Actor207: n1 + Owner: Nod + SubCell: 4 + Facing: 0 + Location: 20,47 + Actor209: n1 + Owner: Nod + SubCell: 5 + Facing: 0 + Location: 20,47 + Actor210: n1 + Owner: Nod + SubCell: 2 + Facing: 0 + Location: 20,47 + Actor211: n1 + Owner: Nod + SubCell: 1 + Facing: 0 + Location: 24,47 + Actor212: n1 + Owner: Nod + SubCell: 4 + Facing: 0 + Location: 24,47 + Actor213: n1 + Owner: Nod + SubCell: 5 + Facing: 0 + Location: 24,47 + Actor214: n1 + Owner: Nod + SubCell: 2 + Facing: 0 + Location: 24,47 + Actor201: n1 + Owner: GDI + Location: 25,22 + SubCell: 1 + Facing: 229 + HpadSpawn1: waypoint + Owner: Neutral + Location: 3,43 + HpadSpawn2: waypoint + Owner: Neutral + Location: 5,42 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-covenants.yaml, ca|missions/main-campaign/ca-prologue-04/juncture-rules.yaml, ca|rules/custom/coop-rules.yaml, juncture-coop-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml + +Notifications: ca|missions/main-campaign/ca-prologue-04/juncture-notifications.yaml diff --git a/mods/ca/missions/coop-campaign/ca01-crossrip-coop/crossrip-coop-rules.yaml b/mods/ca/missions/coop-campaign/ca01-crossrip-coop/crossrip-coop-rules.yaml new file mode 100644 index 0000000000..521a53c285 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca01-crossrip-coop/crossrip-coop-rules.yaml @@ -0,0 +1,6 @@ +World: + LuaScript: + Scripts: campaign.lua, coop.lua, ca|missions/main-campaign/ca01-crossrip/crossrip.lua, crossrip-coop.lua + LobbyMissionInfo@InitialObjectives: + Prefix: Initial Objectives + Text: • Establish a base and investigate the area. diff --git a/mods/ca/missions/coop-campaign/ca01-crossrip-coop/crossrip-coop.lua b/mods/ca/missions/coop-campaign/ca01-crossrip-coop/crossrip-coop.lua new file mode 100644 index 0000000000..c969e5192a --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca01-crossrip-coop/crossrip-coop.lua @@ -0,0 +1,26 @@ + +SetupPlayers = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Multi2 = Player.GetPlayer("Multi2") + Multi3 = Player.GetPlayer("Multi3") + Multi4 = Player.GetPlayer("Multi4") + Multi5 = Player.GetPlayer("Multi5") + Greece = Player.GetPlayer("Greece") + USSR = Player.GetPlayer("USSR") + Scrin = Player.GetPlayer("Scrin") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = Utils.Where({ Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 }, function(p) return p ~= nil end) + MissionEnemies = { USSR, Scrin } + SinglePlayerPlayer = Greece + CoopInit() +end + +AfterWorldLoaded = function() + TransferMcvsToPlayers() + StartCashSpread(3500) +end + +AfterTick = function() + +end diff --git a/mods/ca/missions/coop-campaign/ca01-crossrip-coop/map.bin b/mods/ca/missions/coop-campaign/ca01-crossrip-coop/map.bin new file mode 100644 index 0000000000..33a9076daf Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca01-crossrip-coop/map.bin differ diff --git a/mods/ca/missions/coop-campaign/ca01-crossrip-coop/map.png b/mods/ca/missions/coop-campaign/ca01-crossrip-coop/map.png new file mode 100644 index 0000000000..6d2e31843f Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca01-crossrip-coop/map.png differ diff --git a/mods/ca/missions/coop-campaign/ca01-crossrip-coop/map.yaml b/mods/ca/missions/coop-campaign/ca01-crossrip-coop/map.yaml new file mode 100644 index 0000000000..da558d23c3 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca01-crossrip-coop/map.yaml @@ -0,0 +1,1705 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 01: Crossrip Co-op + +Author: Darkademic & Gandorques Hikla + +Tileset: TEMPERAT + +MapSize: 66,66 + +Bounds: 1,1,64,64 + +Visibility: Lobby + +Categories: Co-op Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: england + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: england + Enemies: USSR, Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Scrin + PlayerReference@Greece: + Name: Greece + Faction: allies + Color: 99ACF2 + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Scrin, Creeps + PlayerReference@USSR: + Name: USSR + Bot: campaign + Faction: soviet + Color: FE1100 + Enemies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Scrin, Creeps + PlayerReference@Scrin: + Name: Scrin + Bot: campaign + Faction: scrin + Color: 7700FF + Enemies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, USSR, Creeps + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 99ACF2 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Scrin, Creeps + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 0B7310 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Scrin, Creeps + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 134691 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Scrin, Creeps + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 775A12 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Scrin, Creeps + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 994050 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Scrin, Creeps + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: EEA8A8 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Scrin, Creeps + +Actors: + SovietConyard: fact + Owner: USSR + Location: 53,19 + Actor19: brik + Owner: USSR + Location: 56,22 + Actor20: brik + Owner: USSR + Location: 52,23 + Actor21: brik + Owner: USSR + Location: 53,23 + Actor22: brik + Owner: USSR + Location: 54,23 + Actor23: brik + Owner: USSR + Location: 55,23 + Actor24: brik + Owner: USSR + Location: 56,23 + Actor25: brik + Owner: USSR + Location: 56,24 + Actor26: brik + Owner: USSR + Location: 56,25 + Actor27: brik + Owner: USSR + Location: 57,25 + SovietChronosphere: pdox + Owner: USSR + Location: 60,25 + Actor29: brik + Owner: USSR + Location: 57,26 + Actor30: brik + Owner: USSR + Location: 57,27 + Actor32: brik + Owner: USSR + Location: 57,28 + Actor34: brik + Owner: USSR + Location: 57,29 + Actor35: brik + Owner: USSR + Location: 58,29 + Actor36: brik + Owner: USSR + Location: 59,29 + Actor39: brik + Owner: USSR + Location: 62,29 + Actor40: brik + Owner: USSR + Location: 63,29 + Actor41: brik + Owner: USSR + Location: 64,29 + Actor43: brik + Owner: USSR + Location: 64,28 + Actor45: brik + Owner: USSR + Location: 64,26 + Actor46: brik + Owner: USSR + Location: 64,25 + Actor47: brik + Owner: USSR + Location: 64,24 + Actor48: brik + Owner: USSR + Location: 64,23 + Actor49: brik + Owner: USSR + Location: 64,22 + Actor50: brik + Owner: USSR + Location: 51,23 + Actor51: brik + Owner: USSR + Location: 57,22 + Actor52: brik + Owner: USSR + Location: 58,22 + Actor53: brik + Owner: USSR + Location: 59,22 + Actor54: brik + Owner: USSR + Location: 57,24 + Actor55: brik + Owner: USSR + Location: 57,23 + Actor56: brik + Owner: USSR + Location: 63,22 + Actor57: brik + Owner: USSR + Location: 62,22 + Actor58: brik + Owner: USSR + Location: 59,21 + Actor59: brik + Owner: USSR + Location: 58,21 + Actor60: brik + Owner: USSR + Location: 62,21 + Actor61: brik + Owner: USSR + Location: 63,21 + Actor62: chain + Owner: USSR + Location: 59,23 + Actor63: chain + Owner: USSR + Location: 58,23 + Actor64: chain + Owner: USSR + Location: 58,24 + Actor65: chain + Owner: USSR + Location: 58,25 + Actor66: chain + Owner: USSR + Location: 58,26 + Actor67: chain + Owner: USSR + Location: 58,28 + Actor68: chain + Owner: USSR + Location: 58,27 + Actor69: chain + Owner: USSR + Location: 59,28 + Actor70: chain + Owner: USSR + Location: 60,28 + Actor71: chain + Owner: USSR + Location: 62,28 + Actor72: chain + Owner: USSR + Location: 61,28 + Actor73: chain + Owner: USSR + Location: 63,28 + Actor75: chain + Owner: USSR + Location: 63,26 + Actor76: chain + Owner: USSR + Location: 63,25 + Actor77: chain + Owner: USSR + Location: 63,24 + Actor78: chain + Owner: USSR + Location: 63,23 + Actor79: chain + Owner: USSR + Location: 62,23 + Actor80: brik + Owner: USSR + Location: 50,23 + Actor81: brik + Owner: USSR + Location: 50,24 + Actor82: brik + Owner: USSR + Location: 49,24 + Actor83: brik + Owner: USSR + Location: 47,24 + Actor84: brik + Owner: USSR + Location: 44,24 + Actor85: brik + Owner: USSR + Location: 46,24 + Actor86: brik + Owner: USSR + Location: 45,24 + Actor87: brik + Owner: USSR + Location: 48,24 + Actor88: brik + Owner: USSR + Location: 44,23 + Actor89: brik + Owner: USSR + Location: 45,23 + Actor90: brik + Owner: USSR + Location: 44,22 + Actor91: brik + Owner: USSR + Location: 44,21 + Actor92: brik + Owner: USSR + Location: 44,20 + Actor93: brik + Owner: USSR + Location: 45,21 + Actor94: brik + Owner: USSR + Location: 45,20 + SovietRefinery: proc + Owner: USSR + Location: 48,16 + Actor100: silo + Owner: USSR + Location: 48,16 + Actor101: silo + Owner: USSR + Location: 50,16 + Actor114: brik + Owner: USSR + Location: 44,4 + Actor115: brik + Owner: USSR + Location: 44,3 + Actor139: brik + Owner: USSR + Location: 64,3 + Actor140: brik + Owner: USSR + Location: 64,4 + Actor141: brik + Owner: USSR + Location: 64,5 + Actor142: brik + Owner: USSR + Location: 64,6 + Actor143: brik + Owner: USSR + Location: 64,7 + Actor144: brik + Owner: USSR + Location: 64,8 + Actor145: brik + Owner: USSR + Location: 64,9 + Actor146: brik + Owner: USSR + Location: 64,10 + Actor147: brik + Owner: USSR + Location: 64,11 + Actor148: brik + Owner: USSR + Location: 64,12 + Actor149: brik + Owner: USSR + Location: 64,13 + Actor150: brik + Owner: USSR + Location: 64,14 + Actor151: brik + Owner: USSR + Location: 64,15 + Actor152: brik + Owner: USSR + Location: 64,16 + Actor153: brik + Owner: USSR + Location: 64,18 + Actor154: brik + Owner: USSR + Location: 64,17 + Actor155: brik + Owner: USSR + Location: 64,19 + Actor156: brik + Owner: USSR + Location: 63,19 + Actor157: brik + Owner: USSR + Location: 63,18 + SovietBarracks: barr + Owner: USSR + Location: 48,7 + SovietWarFactory: weap + Owner: USSR + Location: 52,9 + SovietServiceDepot: fix + Owner: USSR + Location: 54,13 + TeslaCoil3: tsla + Owner: USSR + Location: 45,22 + ScriptTags: HardAndAbove + Actor169: ftur + Owner: USSR + Location: 60,19 + Actor171: tc05 + Owner: Neutral + Location: 51,26 + Actor175: sam + Owner: USSR + Location: 48,23 + Actor176: brik + Owner: USSR + Location: 59,30 + Actor177: brik + Owner: USSR + Location: 60,30 + Actor178: brik + Owner: USSR + Location: 61,30 + Actor179: brik + Owner: USSR + Location: 62,30 + Actor180: brik + Owner: USSR + Location: 63,30 + Actor181: brik + Owner: USSR + Location: 58,30 + Actor182: sam + Owner: USSR + Location: 60,29 + SovietTechCenter: stek + Owner: USSR + Location: 57,7 + NonEasyMammoth1: 4tnk + Owner: USSR + Location: 39,12 + Facing: 128 + ScriptTags: NormalAndAbove + Actor185: 4tnk + Owner: USSR + Location: 40,10 + Facing: 128 + Actor186: e1 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 39,10 + Actor187: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 38,12 + Actor188: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 40,11 + Actor189: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 42,6 + Actor190: e1 + Owner: USSR + Facing: 384 + Location: 42,6 + SubCell: 1 + Actor191: e1 + Owner: USSR + SubCell: 3 + Location: 60,22 + Facing: 0 + Actor192: e1 + Owner: USSR + SubCell: 3 + Location: 61,22 + Facing: 0 + Actor193: e3 + Owner: USSR + SubCell: 3 + Location: 41,11 + Facing: 384 + Actor194: tc01 + Owner: Neutral + Location: 46,26 + Actor195: tc02 + Owner: Neutral + Location: 57,32 + Actor196: t14 + Owner: Neutral + Location: 44,28 + Actor197: t16 + Owner: Neutral + Location: 46,28 + Actor198: t02 + Owner: Neutral + Location: 47,28 + Actor199: tc04 + Owner: Neutral + Location: 49,27 + Actor200: tc03 + Owner: Neutral + Location: 47,27 + Actor201: t10 + Owner: Neutral + Location: 55,32 + Actor202: t16 + Owner: Neutral + Location: 54,30 + Actor203: t14 + Owner: Neutral + Location: 53,28 + Actor204: t17 + Owner: Neutral + Location: 64,31 + Actor205: mine + Owner: Neutral + Location: 40,22 + Actor206: mine + Owner: Neutral + Location: 38,19 + Actor207: v05 + Owner: Neutral + Location: 47,50 + Actor208: t05 + Owner: Neutral + Location: 47,53 + Actor209: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 49,57 + Actor210: e1 + Owner: Greece + SubCell: 1 + Facing: 0 + Location: 49,57 + Actor211: e1 + Owner: Greece + SubCell: 2 + Facing: 0 + Location: 49,57 + Actor212: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 51,57 + Actor213: e1 + Owner: Greece + SubCell: 1 + Facing: 0 + Location: 51,57 + Actor214: e1 + Owner: Greece + SubCell: 2 + Facing: 0 + Location: 51,57 + Actor215: 2tnk + Owner: Greece + Facing: 1023 + Location: 48,58 + Actor216: 2tnk + Owner: Greece + Facing: 0 + Location: 52,58 + Actor217: v07 + Owner: Neutral + Location: 57,58 + Actor218: e3 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 49,59 + Actor219: medi + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 50,59 + Actor220: e3 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 51,59 + Actor221: v12 + Owner: Neutral + Location: 58,59 + PlayerMcv: mcv + Owner: Greece + Facing: 0 + Location: 50,61 + Actor223: tc04 + Owner: Neutral + Location: 61,62 + Actor224: tc02 + Owner: Neutral + Location: 58,64 + Actor226: tc05 + Owner: Neutral + Location: 39,50 + Actor225: asianhut + Owner: Neutral + Location: 44,55 + Actor227: v02 + Owner: Neutral + Location: 45,60 + Actor229: tc05 + Owner: Neutral + Location: 39,28 + Actor230: tc03 + Owner: Neutral + Location: 37,28 + Actor231: mine + Owner: Neutral + Location: 30,58 + Actor233: mine + Owner: Neutral + Location: 31,61 + Actor232: mine + Owner: Neutral + Location: 32,54 + Actor234: tc04 + Owner: Neutral + Location: 44,39 + Actor235: t16 + Owner: Neutral + Location: 50,41 + Actor236: t07 + Owner: Neutral + Location: 48,36 + Actor237: t01 + Owner: Neutral + Location: 54,39 + Actor238: tc02 + Owner: Neutral + Location: 55,41 + Actor239: t05 + Owner: Neutral + Location: 55,37 + Actor240: t02 + Owner: Neutral + Location: 62,37 + TreeToTransform4: t10 + Owner: Neutral + Location: 59,39 + Actor242: t14 + Owner: Neutral + Location: 58,43 + Actor251: dog + Owner: USSR + SubCell: 3 + Location: 58,47 + Facing: 384 + Actor252: e1 + Owner: USSR + Facing: 384 + Location: 58,46 + SubCell: 3 + Actor253: e1 + Owner: USSR + Facing: 384 + Location: 58,47 + SubCell: 1 + Actor254: e1 + Owner: USSR + SubCell: 3 + Location: 54,47 + Facing: 640 + Actor255: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 49,41 + Actor256: e1 + Owner: USSR + Facing: 384 + Location: 58,44 + SubCell: 1 + Actor257: e1 + Owner: USSR + SubCell: 3 + Location: 45,42 + Facing: 768 + Actor259: e1 + Owner: USSR + Location: 43,44 + SubCell: 1 + Facing: 640 + Actor258: e3 + Owner: USSR + Location: 58,46 + SubCell: 1 + Facing: 384 + HeavyTank1: 3tnk + Owner: USSR + Location: 44,43 + Facing: 768 + ScriptTags: HardAndAbove + NonEasyHeavyTank1: 3tnk + Owner: USSR + Location: 15,35 + Facing: 640 + ScriptTags: NormalAndAbove + Actor261: kenn + Owner: USSR + Location: 49,12 + Actor262: e1 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 14,36 + Actor263: e1 + Owner: USSR + SubCell: 3 + Location: 16,35 + Facing: 384 + Actor264: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 15,33 + Actor265: e3 + Owner: USSR + Facing: 384 + Location: 14,34 + SubCell: 3 + Actor266: e2 + Owner: USSR + Facing: 384 + Location: 50,41 + SubCell: 3 + Actor271: brik + Owner: USSR + Location: 6,23 + Actor272: brik + Owner: USSR + Location: 7,23 + Actor273: brik + Owner: USSR + Location: 6,24 + Actor274: brik + Owner: USSR + Location: 7,24 + Actor275: brik + Owner: USSR + Location: 5,24 + Actor276: brik + Owner: USSR + Location: 3,24 + Actor277: brik + Owner: USSR + Location: 1,24 + Actor278: brik + Owner: USSR + Location: 2,24 + Actor279: brik + Owner: USSR + Location: 4,24 + Actor280: brik + Owner: USSR + Location: 1,23 + Actor281: brik + Owner: USSR + Location: 1,22 + Actor282: brik + Owner: USSR + Location: 1,21 + Actor283: brik + Owner: USSR + Location: 1,20 + Actor284: brik + Owner: USSR + Location: 1,19 + Actor285: brik + Owner: USSR + Location: 1,18 + Actor286: brik + Owner: USSR + Location: 1,17 + Actor287: brik + Owner: USSR + Location: 1,16 + SovietWestRefinery: proc + Owner: USSR + Location: 2,19 + SovietWestFlameTower1: ftur + Owner: USSR + Location: 8,21 + SovietWestFlameTower2: ftur + Owner: USSR + Location: 9,19 + ScriptTags: NormalAndAbove + Actor299: silo + Owner: USSR + Location: 2,19 + Actor300: silo + Owner: USSR + Location: 4,19 + Actor289: brik + Owner: USSR + Location: 1,15 + Actor290: brik + Owner: USSR + Location: 1,14 + Actor291: brik + Owner: USSR + Location: 2,14 + Actor301: brik + Owner: USSR + Location: 3,14 + Actor307: mine + Owner: Neutral + Location: 4,28 + TreeToTransform3: t15 + Owner: Neutral + Location: 25,37 + Actor309: t13 + Owner: Neutral + Location: 38,34 + Actor311: tc01 + Owner: Neutral + Location: 9,48 + Actor310: t11 + Owner: Neutral + Location: 7,58 + Actor312: v02 + Owner: Neutral + Location: 3,45 + Actor313: v06 + Owner: Neutral + Location: 1,52 + Actor314: v16 + Owner: Neutral + Location: 2,54 + Actor315: v16 + Owner: Neutral + Location: 3,54 + Actor316: v17 + Owner: Neutral + Location: 1,54 + Actor317: wood + Owner: Neutral + Location: 1,55 + Actor318: wood + Owner: Neutral + Location: 2,55 + Actor319: wood + Owner: Neutral + Location: 3,55 + Actor320: wood + Owner: Neutral + Location: 3,52 + Actor321: wood + Owner: Neutral + Location: 3,51 + Actor322: wood + Owner: Neutral + Location: 2,51 + Actor323: wood + Owner: Neutral + Location: 1,51 + Actor324: wood + Owner: Neutral + Location: 7,51 + Actor325: wood + Owner: Neutral + Location: 7,52 + Actor326: wood + Owner: Neutral + Location: 8,51 + Actor327: wood + Owner: Neutral + Location: 9,51 + Actor328: wood + Owner: Neutral + Location: 9,52 + Actor329: v12 + Owner: Neutral + Location: 8,52 + Church: v01 + Owner: Neutral + Location: 3,48 + Actor331: v04 + Owner: Neutral + Location: 6,55 + Actor332: v05 + Owner: Neutral + Location: 10,60 + Actor333: v09 + Owner: Neutral + Location: 1,58 + Actor334: v07 + Owner: Neutral + Location: 8,46 + Actor335: v10 + Owner: Neutral + Location: 4,61 + Actor336: t03 + Owner: Neutral + Location: 1,49 + Actor337: t12 + Owner: Neutral + Location: 4,43 + Actor338: mine + Owner: Neutral + Location: 13,52 + Actor339: windmill + Owner: Neutral + Location: 8,42 + NonEasyHeavyTank2: 3tnk + Owner: USSR + Location: 10,21 + Facing: 640 + ScriptTags: NormalAndAbove + NonEasyV2: v2rl + Owner: USSR + Location: 6,20 + Facing: 640 + ScriptTags: NormalAndAbove + Actor342: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 12,28 + Actor343: e1 + Owner: USSR + Facing: 384 + Location: 12,28 + SubCell: 1 + Actor345: e1 + Owner: USSR + Facing: 384 + Location: 14,28 + SubCell: 1 + Actor346: e1 + Owner: USSR + Facing: 384 + Location: 14,28 + SubCell: 2 + Actor344: e3 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 16,27 + Actor347: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 11,28 + Actor348: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 9,22 + Actor349: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 10,18 + Actor350: e1 + Owner: USSR + SubCell: 3 + Location: 10,19 + Facing: 384 + Actor351: e1 + Owner: USSR + Facing: 384 + Location: 10,19 + SubCell: 1 + Actor352: 3tnk + Owner: USSR + Location: 29,23 + Facing: 384 + NonEasyHeavyTank3: 3tnk + Owner: USSR + Location: 31,24 + Facing: 384 + ScriptTags: NormalAndAbove + Actor355: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 28,24 + Actor357: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 31,26 + Actor356: e1 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 29,25 + Actor358: e1 + Owner: USSR + Facing: 384 + Location: 29,25 + SubCell: 1 + Actor359: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 30,24 + Actor360: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 32,25 + WestPatrolUnit1: e1 + Owner: USSR + SubCell: 3 + Location: 6,44 + Facing: 384 + WestPatrolUnit4: e1 + Owner: USSR + Location: 6,44 + SubCell: 1 + Facing: 384 + WestPatrolUnit3: dog + Owner: USSR + SubCell: 3 + Location: 7,43 + Facing: 384 + WestPatrolUnit2: e2 + Owner: USSR + SubCell: 3 + Location: 8,43 + Facing: 384 + Actor365: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 34,46 + Actor366: e1 + Owner: USSR + Facing: 384 + Location: 33,45 + SubCell: 3 + Actor367: e1 + Owner: USSR + Facing: 384 + Location: 33,45 + SubCell: 1 + Flamer2: e4 + Owner: USSR + SubCell: 3 + Location: 33,43 + Facing: 384 + Actor369: e3 + Owner: USSR + Facing: 384 + Location: 32,45 + SubCell: 3 + Actor370: tc01 + Owner: Neutral + Location: 34,43 + Actor371: t17 + Owner: Neutral + Location: 17,61 + Actor373: t06 + Owner: Neutral + Location: 31,17 + Actor376: tc03 + Owner: Neutral + Location: 36,0 + Actor377: tc02 + Owner: Neutral + Location: 34,1 + TreeToTransform1: t10 + Owner: Neutral + Location: 32,11 + Actor379: tc04 + Owner: Neutral + Location: 16,0 + Actor381: t02 + Owner: Neutral + Location: 17,2 + Actor382: t05 + Owner: Neutral + Location: 14,0 + Actor383: t08 + Owner: Neutral + Location: 13,0 + Actor385: tc04 + Owner: Neutral + Location: 2,11 + Actor387: tc02 + Owner: Neutral + Location: 12,1 + Actor389: t11 + Owner: Neutral + Location: 19,0 + Actor388: t14 + Owner: Neutral + Location: 15,2 + Actor390: t17 + Owner: Neutral + Location: 11,4 + TreeToTransform2: t07 + Owner: Neutral + Location: 18,22 + Actor395: tc02 + Owner: Neutral + Location: 11,14 + Actor396: t01 + Owner: Neutral + Location: 10,13 + Actor397: t05 + Owner: Neutral + Location: 14,8 + Actor398: t07 + Owner: Neutral + Location: 22,4 + Actor399: t02 + Owner: Neutral + Location: 25,2 + Actor386: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 14,21 + Actor400: e1 + Owner: USSR + Facing: 384 + Location: 18,16 + SubCell: 3 + Actor401: e1 + Owner: USSR + Facing: 384 + Location: 16,14 + SubCell: 3 + Actor402: e1 + Owner: USSR + SubCell: 3 + Location: 15,9 + Facing: 384 + Actor403: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 18,7 + Actor404: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 17,4 + Actor405: e1 + Owner: USSR + Facing: 384 + Location: 21,5 + SubCell: 3 + Actor406: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 24,3 + Actor407: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 12,5 + Actor408: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 29,20 + Actor409: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 32,18 + Actor410: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 26,15 + Actor411: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 22,25 + Actor412: e1 + Owner: USSR + Facing: 384 + Location: 22,25 + SubCell: 1 + Actor413: e4 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 31,21 + Actor414: dog + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 18,4 + Actor415: e4 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 7,22 + Actor416: e4 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 25,4 + Actor417: lhus + Owner: Neutral + Location: 3,6 + Actor418: btr + Owner: USSR + Location: 42,42 + TurretFacing: 0 + Facing: 768 + Actor419: btr + Owner: USSR + Facing: 384 + Location: 17,15 + Actor420: shok + Owner: USSR + SubCell: 3 + Location: 60,23 + Facing: 0 + Actor421: shok + Owner: USSR + Location: 61,23 + SubCell: 3 + Facing: 0 + Actor422: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 53,16 + Actor423: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 51,6 + Actor424: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 59,12 + Actor426: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 46,20 + Actor427: e1 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 52,6 + Actor430: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 56,9 + Actor431: e1 + Owner: USSR + Facing: 384 + Location: 53,16 + SubCell: 1 + Actor433: e1 + Owner: USSR + Facing: 384 + Location: 40,3 + SubCell: 3 + Actor434: e1 + Owner: USSR + Facing: 384 + Location: 40,3 + SubCell: 1 + Actor432: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 41,4 + Actor435: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 22,6 + NonEasyHeavyTank4: 3tnk + Owner: USSR + Location: 20,4 + Facing: 384 + ScriptTags: NormalAndAbove + Actor437: apwr + Owner: USSR + Location: 61,3 + SovietRadar: dome + Owner: USSR + Location: 48,3 + SovietAirfield: afld + Owner: USSR + Location: 53,3 + Actor443: brik + Owner: USSR + Location: 44,2 + Actor444: brik + Owner: USSR + Location: 45,2 + Actor445: brik + Owner: USSR + Location: 46,2 + Actor446: brik + Owner: USSR + Location: 47,2 + Actor447: brik + Owner: USSR + Location: 48,2 + Actor448: brik + Owner: USSR + Location: 49,2 + Actor449: brik + Owner: USSR + Location: 50,2 + Actor450: brik + Owner: USSR + Location: 51,2 + Actor451: brik + Owner: USSR + Location: 52,2 + Actor452: brik + Owner: USSR + Location: 53,2 + Actor453: brik + Owner: USSR + Location: 54,2 + Actor454: brik + Owner: USSR + Location: 55,2 + Actor455: brik + Owner: USSR + Location: 56,2 + Actor456: brik + Owner: USSR + Location: 57,2 + Actor457: brik + Owner: USSR + Location: 58,2 + Actor458: brik + Owner: USSR + Location: 59,2 + Actor459: brik + Owner: USSR + Location: 60,2 + Actor460: brik + Owner: USSR + Location: 61,2 + Actor461: brik + Owner: USSR + Location: 62,2 + Actor462: brik + Owner: USSR + Location: 63,2 + Actor463: brik + Owner: USSR + Location: 64,2 + Actor464: sam + Owner: USSR + Location: 43,31 + Actor465: sam + Owner: USSR + Location: 54,32 + Actor466: sam + Owner: USSR + Location: 36,26 + Actor467: t12 + Owner: Neutral + Location: 36,24 + Actor468: t07 + Owner: Neutral + Location: 37,26 + Actor469: t08 + Owner: Neutral + Location: 36,27 + Actor470: sam + Owner: USSR + Location: 63,33 + Actor471: t01 + Owner: Neutral + Location: 65,33 + WestPatrolWaypoint2: waypoint + Location: 5,60 + Owner: Neutral + WestPatrolWaypoint1: waypoint + Location: 6,43 + Owner: Neutral + AttackWaypoint1: waypoint + Location: 37,7 + Owner: Neutral + AttackWaypoint2: waypoint + Location: 14,6 + Owner: Neutral + AttackWaypoint3: waypoint + Location: 14,19 + Owner: Neutral + AttackWaypoint5: waypoint + Location: 24,46 + Owner: Neutral + Actor438: apwr + Owner: USSR + Location: 61,6 + Actor439: apwr + Owner: USSR + Location: 61,9 + Actor440: apwr + Owner: USSR + Location: 61,12 + Actor441: apwr + Owner: USSR + Location: 61,15 + Actor425: fenc + Owner: USSR + Location: 17,34 + Actor428: fenc + Owner: USSR + Location: 16,34 + Actor429: fenc + Owner: USSR + Location: 13,35 + Actor442: fenc + Owner: USSR + Location: 12,35 + Actor473: fenc + Owner: USSR + Location: 15,28 + Actor474: fenc + Owner: USSR + Location: 16,28 + Actor475: fenc + Owner: USSR + Location: 10,29 + Actor476: fenc + Owner: USSR + Location: 11,29 + Actor472: apwr + Owner: USSR + Location: 58,3 + Actor477: brik + Owner: USSR + Location: 4,14 + Actor478: brik + Owner: USSR + Location: 5,14 + Actor479: brik + Owner: USSR + Location: 6,14 + Actor480: brik + Owner: USSR + Location: 7,14 + Actor481: brik + Owner: USSR + Location: 8,14 + SovietWestBarracks: barr + Owner: USSR + Location: 4,15 + Actor483: brik + Owner: USSR + Location: 8,15 + Actor484: brik + Owner: USSR + Location: 7,16 + Actor485: brik + Owner: USSR + Location: 8,16 + Actor486: brik + Owner: USSR + Location: 7,17 + Actor487: brik + Owner: USSR + Location: 8,17 + Actor488: powr + Owner: USSR + Location: 2,15 + WormholeSpawn1: waypoint + Location: 59,26 + Owner: Neutral + WormholeSpawn2: waypoint + Location: 62,24 + Owner: Neutral + WormholeSpawn3: waypoint + Location: 52,13 + Owner: Neutral + Actor482: c3 + Owner: Neutral + Facing: 384 + Location: 7,54 + SubCell: 3 + Actor489: c6 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 2,57 + Actor491: c9 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 6,58 + HardOnlyKatyusha: katy + Owner: USSR + Location: 31,31 + Facing: 640 + ScriptTags: HardAndAbove + NonEasyKatyusha: katy + Owner: USSR + Location: 21,32 + Facing: 384 + ScriptTags: NormalAndAbove + Evac1: waypoint + Owner: Neutral + Location: 46,58 + Evac2: waypoint + Owner: Neutral + Location: 54,56 + Evac3: waypoint + Owner: Neutral + Location: 52,62 + HaloLanding2: waypoint + Location: 40,38 + Owner: Neutral + Actor497: ttra + Owner: USSR + Location: 57,17 + Facing: 128 + Actor498: ttra + Owner: USSR + Location: 32,6 + Facing: 384 + HaloLanding3: waypoint + Owner: Neutral + Location: 5,53 + WormholeSpawn5: waypoint + Owner: Neutral + Location: 5,8 + WormholeSpawn4: waypoint + Owner: Neutral + Location: 28,10 + NavalDrop: waypoint + Owner: Neutral + Location: 4,39 + HaloLanding1: waypoint + Owner: Neutral + Location: 58,38 + AttackWaypoint4: waypoint + Owner: Neutral + Location: 11,39 + DevastatorSpawn1: waypoint + Owner: Neutral + Location: 1,28 + DevastatorDestination1: waypoint + Owner: Neutral + Location: 5,30 + DevastatorSpawn2: waypoint + Owner: Neutral + Location: 30,1 + DevastatorDestination2: waypoint + Owner: Neutral + Location: 30,4 + DevastatorSpawn3: waypoint + Owner: Neutral + Location: 64,27 + DevastatorDestination3: waypoint + Owner: Neutral + Location: 56,36 + Actor490: camera + Owner: USSR + Location: 18,40 + Actor492: camera + Owner: Scrin + Location: 19,41 + Ranger1: jeep + Owner: Greece + Location: 50,58 + Facing: 1023 + ScriptTags: NormalAndBelow + DeploySuggestion: waypoint + Owner: Neutral + Location: 24,51 + EntranceReveal1: waypoint + Owner: Neutral + Location: 10,22 + Actor499: tc01 + Owner: Neutral + Location: 23,14 + EntranceReveal2: waypoint + Owner: Neutral + Location: 41,12 + Actor500: brik + Owner: USSR + Location: 44,5 + Actor501: brik + Owner: USSR + Location: 44,6 + TeslaCoil1: tsla + Owner: USSR + Location: 45,6 + ScriptTags: NormalAndAbove + Actor503: brik + Owner: USSR + Location: 44,7 + Actor504: brik + Owner: USSR + Location: 45,7 + Actor505: ftur + Owner: USSR + Location: 43,8 + Actor506: brik + Owner: USSR + Location: 44,8 + Actor507: brik + Owner: USSR + Location: 45,8 + Actor508: brik + Owner: USSR + Location: 44,12 + Actor509: brik + Owner: USSR + Location: 45,12 + Actor510: brik + Owner: USSR + Location: 44,13 + Actor511: brik + Owner: USSR + Location: 45,13 + Actor512: brik + Owner: USSR + Location: 44,14 + TeslaCoil2: tsla + Owner: USSR + Location: 45,14 + ScriptTags: NormalAndAbove + Actor514: brik + Owner: USSR + Location: 44,15 + Actor515: brik + Owner: USSR + Location: 45,15 + Actor516: brik + Owner: USSR + Location: 44,16 + Actor517: brik + Owner: USSR + Location: 45,16 + Actor518: ftur + Owner: USSR + Location: 43,14 + Actor493: ftur + Owner: USSR + Location: 43,20 + HardOnlyV2: v2rl + Owner: USSR + Location: 46,15 + Facing: 128 + ScriptTags: HardAndAbove + Actor513: v2rl + Owner: USSR + Location: 45,4 + Facing: 384 + Actor74: chain + Owner: USSR + Location: 63,27 + Actor494: brik + Owner: USSR + Location: 64,27 + HaloSpawn2: waypoint + Owner: Neutral + Location: 53,1 + HaloSpawn1: waypoint + Owner: Neutral + Location: 64,20 + HaloSpawn3: waypoint + Owner: Neutral + Location: 1,26 + Flamer1: e4 + Owner: USSR + Facing: 384 + Location: 56,46 + SubCell: 3 + ScriptTags: HardAndAbove + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-coalitions.yaml, ca|missions/main-campaign/ca01-crossrip/crossrip-rules.yaml, ca|rules/custom/coop-rules.yaml, crossrip-coop-rules.yaml + +Sequences: ca|missions/main-campaign/ca01-crossrip/crossrip-sequences.yaml + +Weapons: ca|weapons/custom/campaign.yaml, ca|missions/main-campaign/ca01-crossrip/crossrip-weapons.yaml diff --git a/mods/ca/missions/coop-campaign/ca02-displacement-coop/displacement-coop-rules.yaml b/mods/ca/missions/coop-campaign/ca02-displacement-coop/displacement-coop-rules.yaml new file mode 100644 index 0000000000..4975ed1417 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca02-displacement-coop/displacement-coop-rules.yaml @@ -0,0 +1,11 @@ +World: + LuaScript: + Scripts: campaign.lua, coop.lua, ca|missions/main-campaign/ca02-displacement/displacement.lua, displacement-coop.lua + ScriptLobbyDropdown@basesharing: + Values: + -0: + Default: 1 + Locked: True + LobbyMissionInfo@InitialObjectives: + Prefix: Initial Objectives + Text: • Clear a path for incoming convoys and protect them as they pass through. diff --git a/mods/ca/missions/coop-campaign/ca02-displacement-coop/displacement-coop.lua b/mods/ca/missions/coop-campaign/ca02-displacement-coop/displacement-coop.lua new file mode 100644 index 0000000000..30d105d091 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca02-displacement-coop/displacement-coop.lua @@ -0,0 +1,43 @@ + +SetupPlayers = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Multi2 = Player.GetPlayer("Multi2") + Multi3 = Player.GetPlayer("Multi3") + Multi4 = Player.GetPlayer("Multi4") + Multi5 = Player.GetPlayer("Multi5") + Greece = Player.GetPlayer("Greece") + England = Player.GetPlayer("England") + Scrin = Player.GetPlayer("Scrin") + USSR = Player.GetPlayer("USSR") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = Utils.Where({ Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 }, function(p) return p ~= nil end) + MissionEnemies = { Scrin } + SinglePlayerPlayer = Greece + CoopInit() +end + +AfterWorldLoaded = function() + TransferBaseToPlayer(SinglePlayerPlayer, GetFirstActivePlayer()) + StartCashSpread(0) + + Trigger.OnAnyProduction(function(producer, produced, productionType) + local firstActivePlayer = GetFirstActivePlayer() + if IsHarvester(produced) and IsMissionPlayer(produced.Owner) and produced.Owner ~= firstActivePlayer then + produced.Owner = firstActivePlayer + end + end) + + Utils.Do({ SovietRefinery, SovietSilo1, SovietSilo2, SovietPower1, SovietPower2, SovietPower3 }, function(a) + Trigger.OnCapture(a, function(self, captor, oldOwner, newOwner) + local firstActivePlayer = GetFirstActivePlayer() + if newOwner ~= firstActivePlayer then + self.Owner = firstActivePlayer + end + end) + end) +end + +AfterTick = function() + +end diff --git a/mods/ca/missions/coop-campaign/ca02-displacement-coop/map.bin b/mods/ca/missions/coop-campaign/ca02-displacement-coop/map.bin new file mode 100644 index 0000000000..c1168087c3 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca02-displacement-coop/map.bin differ diff --git a/mods/ca/missions/coop-campaign/ca02-displacement-coop/map.png b/mods/ca/missions/coop-campaign/ca02-displacement-coop/map.png new file mode 100644 index 0000000000..4435eb98ab Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca02-displacement-coop/map.png differ diff --git a/mods/ca/missions/coop-campaign/ca02-displacement-coop/map.yaml b/mods/ca/missions/coop-campaign/ca02-displacement-coop/map.yaml new file mode 100644 index 0000000000..01823ae08c --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca02-displacement-coop/map.yaml @@ -0,0 +1,3045 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 02: Displacement Co-op + +Author: Darkademic & Gandorques Hikla + +Tileset: WINTER + +MapSize: 130,66 + +Bounds: 1,1,128,64 + +Visibility: Lobby + +Categories: Co-op Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: USSR, Greece, England, Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + PlayerReference@Greece: + Name: Greece + Faction: allies + Color: 99ACF2 + Allies: England, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Creeps + PlayerReference@Scrin: + Name: Scrin + Bot: campaign + Faction: scrin + Color: 7700FF + Enemies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, England, USSR, Creeps + PlayerReference@England: + Name: England + Bot: campaign + Faction: allies + Color: A1EF8C + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Creeps + PlayerReference@USSR: + Name: USSR + Bot: campaign + Faction: soviet + Color: FE1100 + Enemies: Scrin, Creeps + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + Faction: allies + Color: 99ACF2 + LockColor: True + LockSpawn: True + LockTeam: True + Team: 1 + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, England + Enemies: Scrin, Creeps + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + Faction: allies + Color: 0B7310 + LockColor: True + LockSpawn: True + LockTeam: True + Team: 1 + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, England + Enemies: Scrin, Creeps + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + Faction: allies + Color: 134691 + LockColor: True + LockSpawn: True + LockTeam: True + Team: 1 + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, England + Enemies: Scrin, Creeps + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + Faction: allies + Color: 775A12 + LockColor: True + LockSpawn: True + LockTeam: True + Team: 1 + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, England + Enemies: Scrin, Creeps + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + Faction: allies + Color: 994050 + LockColor: True + LockSpawn: True + LockTeam: True + Team: 1 + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, England + Enemies: Scrin, Creeps + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + Faction: allies + Color: EEA8A8 + LockColor: True + LockSpawn: True + LockTeam: True + Team: 1 + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, England + Enemies: Scrin, Creeps + +Actors: + Actor21: v02 + Location: 11,16 + Faction: germany + Owner: Neutral + Actor22: t03 + Owner: Neutral + Faction: germany + Location: 15,18 + Actor34: sbag + Owner: Greece + Location: 25,44 + Actor35: sbag + Owner: Greece + Location: 25,45 + Actor36: sbag + Owner: Greece + Location: 26,44 + Actor37: sbag + Owner: Greece + Location: 27,44 + Actor38: sbag + Owner: Greece + Location: 27,45 + Actor39: sbag + Owner: Greece + Location: 16,45 + Actor40: sbag + Owner: Greece + Location: 16,44 + Actor41: sbag + Owner: Greece + Location: 16,43 + Actor42: sbag + Owner: Greece + Location: 15,43 + Actor44: sbag + Owner: Greece + Location: 15,42 + Actor45: sbag + Owner: Greece + Location: 14,42 + Actor43: pris + Owner: Greece + Location: 15,44 + Actor46: pris + Owner: Greece + Location: 26,45 + Actor19: sbag + Owner: Greece + Location: 43,42 + Actor20: sbag + Owner: Greece + Location: 42,42 + Actor24: sbag + Owner: Greece + Location: 44,42 + Actor25: sbag + Owner: Greece + Location: 44,43 + Actor29: sbag + Owner: Greece + Location: 42,43 + Actor51: pris + Owner: Greece + Location: 43,43 + Actor79: apwr + Owner: Greece + Location: 4,51 + Actor80: apwr + Owner: Greece + Location: 7,51 + Actor81: apwr + Owner: Greece + Location: 10,51 + Actor82: apwr + Owner: Greece + Location: 4,54 + Actor83: apwr + Owner: Greece + Location: 7,54 + Actor84: apwr + Owner: Greece + Location: 10,54 + Actor85: chain + Owner: Greece + Location: 3,56 + Actor86: chain + Owner: Greece + Location: 3,55 + Actor87: chain + Owner: Greece + Location: 3,54 + Actor88: chain + Owner: Greece + Location: 3,53 + Actor89: chain + Owner: Greece + Location: 3,50 + Actor90: chain + Owner: Greece + Location: 3,51 + Actor91: chain + Owner: Greece + Location: 3,52 + Actor92: chain + Owner: Greece + Location: 4,50 + Actor93: chain + Owner: Greece + Location: 5,50 + Actor94: chain + Owner: Greece + Location: 7,50 + Actor95: chain + Owner: Greece + Location: 6,50 + Actor96: chain + Owner: Greece + Location: 8,50 + Actor97: chain + Owner: Greece + Location: 10,50 + Actor98: chain + Owner: Greece + Location: 9,50 + Actor99: chain + Owner: Greece + Location: 11,50 + Actor100: chain + Owner: Greece + Location: 12,50 + Actor101: chain + Owner: Greece + Location: 13,50 + Actor108: chain + Owner: Greece + Location: 3,57 + Actor118: chain + Owner: Greece + Location: 13,57 + Actor119: brik + Owner: Greece + Location: 14,50 + Actor120: brik + Owner: Greece + Location: 14,51 + Actor121: brik + Owner: Greece + Location: 14,52 + Actor124: brik + Owner: Greece + Location: 14,49 + Actor125: brik + Owner: Greece + Location: 14,48 + Actor126: brik + Owner: Greece + Location: 15,48 + Actor127: brik + Owner: Greece + Location: 16,48 + Actor128: brik + Owner: Greece + Location: 17,48 + Actor129: brik + Owner: Greece + Location: 18,48 + Actor132: brik + Owner: Greece + Location: 24,48 + Actor134: brik + Owner: Greece + Location: 25,48 + Actor136: brik + Owner: Greece + Location: 26,48 + Actor137: brik + Owner: Greece + Location: 28,48 + Actor138: brik + Owner: Greece + Location: 27,48 + Actor139: brik + Owner: Greece + Location: 29,48 + Actor140: brik + Owner: Greece + Location: 29,49 + Actor141: brik + Owner: Greece + Location: 29,50 + Actor142: brik + Owner: Greece + Location: 29,51 + Actor146: brik + Owner: Greece + Location: 14,55 + Actor147: brik + Owner: Greece + Location: 14,56 + Actor150: brik + Owner: Greece + Location: 14,57 + Actor151: brik + Owner: Greece + Location: 14,58 + Actor152: brik + Owner: Greece + Location: 14,59 + Actor153: brik + Owner: Greece + Location: 15,59 + Actor154: brik + Owner: Greece + Location: 16,59 + Actor155: brik + Owner: Greece + Location: 17,59 + Actor156: brik + Owner: Greece + Location: 18,59 + Actor159: brik + Owner: Greece + Location: 18,58 + Actor161: brik + Owner: Greece + Location: 25,59 + Actor163: brik + Owner: Greece + Location: 26,59 + Actor164: brik + Owner: Greece + Location: 24,58 + Actor165: brik + Owner: Greece + Location: 24,59 + Actor166: brik + Owner: Greece + Location: 27,59 + Actor167: brik + Owner: Greece + Location: 28,59 + Actor169: brik + Owner: Greece + Location: 29,55 + Actor171: brik + Owner: Greece + Location: 29,56 + Actor172: brik + Owner: Greece + Location: 29,57 + Actor173: brik + Owner: Greece + Location: 29,58 + Actor174: brik + Owner: Greece + Location: 29,59 + Actor176: weap + Owner: Greece + Location: 15,49 + Actor144: brik + Owner: Greece + Location: 13,55 + Actor145: brik + Owner: Greece + Location: 13,56 + Actor148: brik + Owner: Greece + Location: 13,51 + Actor149: brik + Owner: Greece + Location: 13,52 + Actor157: brik + Owner: Greece + Location: 18,49 + Actor158: brik + Owner: Greece + Location: 19,49 + Actor175: brik + Owner: Greece + Location: 19,48 + Actor178: brik + Owner: Greece + Location: 24,49 + Actor179: brik + Owner: Greece + Location: 23,48 + Actor180: brik + Owner: Greece + Location: 23,49 + Actor181: brik + Owner: Greece + Location: 23,58 + Actor182: brik + Owner: Greece + Location: 23,59 + Actor183: brik + Owner: Greece + Location: 19,58 + Actor184: brik + Owner: Greece + Location: 19,59 + PlayerRefinery: proc + Owner: Greece + Location: 19,53 + Actor162: fix + Owner: Greece + Location: 24,53 + Actor170: atek + Owner: Greece + Location: 27,56 + Actor206: silo + Owner: Greece + Location: 21,53 + Actor207: silo + Owner: Greece + Location: 19,53 + Actor208: pbox + Owner: Greece + Location: 24,47 + Actor209: pbox + Owner: Greece + Location: 18,47 + Actor135: chain + Owner: Greece + Location: 12,57 + Actor187: chain + Owner: Greece + Location: 10,57 + Actor188: chain + Owner: Greece + Location: 9,57 + Actor189: chain + Owner: Greece + Location: 4,57 + Actor210: chain + Owner: Greece + Location: 6,57 + Actor211: chain + Owner: Greece + Location: 5,57 + Actor212: chain + Owner: Greece + Location: 7,57 + Actor213: chain + Owner: Greece + Location: 8,57 + Actor214: chain + Owner: Greece + Location: 11,57 + Actor133: dome + Owner: Greece + Location: 15,56 + PlayerBarracks: tent + Owner: Greece + Location: 27,49 + Actor203: brik + Owner: Greece + Location: 30,50 + Actor201: brik + Owner: Greece + Location: 30,51 + Actor143: brik + Owner: Greece + Location: 30,55 + Actor185: brik + Owner: Greece + Location: 30,56 + Actor186: swal + Owner: Scrin + Location: 93,20 + Actor202: swal + Owner: Scrin + Location: 93,19 + Actor204: swal + Owner: Scrin + Location: 93,18 + Actor205: swal + Owner: Scrin + Location: 92,18 + Actor215: swal + Owner: Scrin + Location: 92,17 + Actor216: swal + Owner: Scrin + Location: 92,16 + Actor217: swal + Owner: Scrin + Location: 91,16 + Actor218: swal + Owner: Scrin + Location: 90,16 + Actor219: swal + Owner: Scrin + Location: 94,20 + Actor220: swal + Owner: Scrin + Location: 95,20 + Actor221: swal + Owner: Scrin + Location: 96,20 + Actor222: swal + Owner: Scrin + Location: 97,20 + Actor223: swal + Owner: Scrin + Location: 99,20 + Actor224: swal + Owner: Scrin + Location: 98,20 + Actor225: swal + Owner: Scrin + Location: 89,16 + Actor226: swal + Owner: Scrin + Location: 89,15 + Actor227: swal + Owner: Scrin + Location: 90,15 + Actor228: swal + Owner: Scrin + Location: 100,20 + Actor229: swal + Owner: Scrin + Location: 101,20 + Actor230: swal + Owner: Scrin + Location: 101,21 + Actor231: swal + Owner: Scrin + Location: 102,21 + Actor232: swal + Owner: Scrin + Location: 102,20 + Actor233: swal + Owner: Scrin + Location: 89,14 + Actor234: swal + Owner: Scrin + Location: 89,13 + Actor235: swal + Owner: Scrin + Location: 89,12 + Actor236: swal + Owner: Scrin + Location: 90,12 + Actor237: swal + Owner: Scrin + Location: 90,13 + Actor245: swal + Owner: Scrin + Location: 89,4 + Actor248: swal + Owner: Scrin + Location: 89,3 + Actor249: swal + Owner: Scrin + Location: 89,2 + Actor250: swal + Owner: Scrin + Location: 89,1 + Actor251: swal + Owner: Scrin + Location: 90,1 + Actor252: swal + Owner: Scrin + Location: 91,1 + Actor253: swal + Owner: Scrin + Location: 92,1 + Actor254: swal + Owner: Scrin + Location: 93,1 + Actor255: swal + Owner: Scrin + Location: 94,1 + Actor256: swal + Owner: Scrin + Location: 96,1 + Actor257: swal + Owner: Scrin + Location: 95,1 + Actor258: swal + Owner: Scrin + Location: 97,1 + Actor259: swal + Owner: Scrin + Location: 98,1 + Actor261: swal + Owner: Scrin + Location: 90,2 + Actor246: swal + Owner: Scrin + Location: 99,1 + Actor269: ptur + Owner: Scrin + Location: 88,13 + TurretFacing: 277 + Actor270: scol + Owner: Scrin + Location: 90,14 + Actor272: rea2 + Owner: Scrin + Location: 94,17 + Actor273: rea2 + Owner: Scrin + Location: 97,17 + Actor274: srep + Owner: Scrin + Location: 102,15 + Actor247: swal + Owner: Scrin + Location: 100,1 + Actor260: swal + Owner: Scrin + Location: 101,1 + Actor277: swal + Owner: Scrin + Location: 102,1 + Actor278: swal + Owner: Scrin + Location: 103,1 + Actor279: swal + Owner: Scrin + Location: 104,1 + Actor280: swal + Owner: Scrin + Location: 105,1 + Actor281: swal + Owner: Scrin + Location: 106,1 + Actor282: swal + Owner: Scrin + Location: 107,1 + Actor283: swal + Owner: Scrin + Location: 108,1 + Actor284: swal + Owner: Scrin + Location: 108,2 + Actor285: swal + Owner: Scrin + Location: 108,3 + Actor286: swal + Owner: Scrin + Location: 108,4 + Actor287: swal + Owner: Scrin + Location: 108,5 + Actor288: swal + Owner: Scrin + Location: 108,6 + Actor289: swal + Owner: Scrin + Location: 108,7 + Actor290: swal + Owner: Scrin + Location: 108,8 + Actor291: swal + Owner: Scrin + Location: 108,9 + Actor292: swal + Owner: Scrin + Location: 108,10 + Actor293: swal + Owner: Scrin + Location: 107,9 + Actor294: swal + Owner: Scrin + Location: 107,10 + Actor295: swal + Owner: Scrin + Location: 107,15 + Actor296: swal + Owner: Scrin + Location: 108,15 + Actor297: swal + Owner: Scrin + Location: 107,16 + Actor298: swal + Owner: Scrin + Location: 108,16 + Actor299: swal + Owner: Scrin + Location: 108,17 + Actor300: swal + Owner: Scrin + Location: 108,18 + Actor301: swal + Owner: Scrin + Location: 108,19 + Actor302: swal + Owner: Scrin + Location: 108,20 + Actor303: swal + Owner: Scrin + Location: 108,21 + Actor304: swal + Owner: Scrin + Location: 106,21 + Actor305: swal + Owner: Scrin + Location: 105,21 + Actor306: swal + Owner: Scrin + Location: 105,20 + Actor307: swal + Owner: Scrin + Location: 107,21 + Actor308: swal + Owner: Scrin + Location: 106,20 + Actor275: scrt + Owner: Scrin + Location: 106,2 + Actor276: nerv + Owner: Scrin + Location: 103,2 + Actor265: port + Owner: Scrin + Location: 99,11 + Actor310: ptur + Owner: Scrin + Location: 106,22 + TurretFacing: 555 + Actor311: ptur + Owner: Scrin + Location: 109,16 + TurretFacing: 666 + Actor312: ptur + Owner: Scrin + Location: 109,9 + TurretFacing: 658 + Actor313: scol + Owner: Scrin + Location: 107,20 + Actor314: scol + Owner: Scrin + Location: 107,8 + Actor315: shar + Owner: Scrin + Location: 101,18 + TurretFacing: 634 + Actor316: shar + Owner: Scrin + Location: 93,15 + TurretFacing: 364 + Actor317: shar + Owner: Scrin + Location: 91,4 + TurretFacing: 372 + Actor319: split2 + Owner: Neutral + Location: 114,6 + Actor320: split2 + Owner: Neutral + Location: 117,12 + Actor321: split2 + Owner: Neutral + Location: 121,8 + Actor322: split2 + Owner: Neutral + Location: 118,3 + Actor323: split2 + Owner: Neutral + Location: 113,18 + Actor318: proc.scrin + Owner: Scrin + Location: 103,10 + GravityStabilizer1: grav + Owner: Scrin + Location: 97,3 + GravityStabilizer2: grav + Owner: Scrin + Location: 98,7 + Actor324: sfac + Owner: Scrin + Location: 102,7 + Actor262: wsph + Owner: Scrin + Location: 94,8 + Actor264: wsph + Owner: Scrin + Location: 93,4 + Actor266: port + Owner: Scrin + Location: 95,12 + Actor309: mine + Owner: Neutral + Location: 16,62 + Actor326: mine + Owner: Neutral + Location: 74,57 + Actor327: mine + Owner: Neutral + Location: 76,61 + Actor328: chain + Owner: Greece + Location: 32,55 + Actor329: chain + Owner: Greece + Location: 33,55 + Actor330: chain + Owner: Greece + Location: 34,55 + Actor331: chain + Owner: Greece + Location: 35,55 + Actor332: chain + Owner: Greece + Location: 36,55 + Actor333: chain + Owner: Greece + Location: 37,55 + Actor334: chain + Owner: Greece + Location: 32,56 + Actor335: hpad + Owner: Greece + Location: 33,56 + Actor336: hpad + Owner: Greece + Location: 35,56 + Actor337: chain + Owner: Greece + Location: 37,56 + Actor338: chain + Owner: Greece + Location: 32,57 + Actor339: chain + Owner: Greece + Location: 37,57 + Actor340: chain + Owner: Greece + Location: 32,58 + Actor341: chain + Owner: Greece + Location: 37,58 + Actor342: tc04 + Owner: Neutral + Location: 4,58 + Actor343: tc05 + Owner: Neutral + Location: 8,59 + Actor344: t14 + Owner: Neutral + Location: 6,61 + Actor345: t10 + Owner: Neutral + Location: 11,63 + Actor346: t07 + Owner: Neutral + Location: 2,56 + Actor347: t02 + Owner: Neutral + Location: 3,47 + Actor348: t15 + Owner: Neutral + Location: 8,48 + Actor349: tc01 + Owner: Neutral + Location: 11,48 + Actor350: tc02 + Owner: Neutral + Location: 10,45 + Actor351: t14 + Owner: Neutral + Location: 11,42 + Actor352: t03 + Owner: Neutral + Location: 12,46 + Actor353: t02 + Owner: Neutral + Location: 30,58 + Actor354: tc02 + Owner: Neutral + Location: 34,63 + Actor355: tc04 + Owner: Neutral + Location: 35,60 + Actor356: t15 + Owner: Neutral + Location: 40,56 + Actor357: t14 + Owner: Neutral + Location: 43,52 + Actor358: t06 + Owner: Neutral + Location: 48,54 + Actor359: tc02 + Owner: Neutral + Location: 57,55 + Actor360: tc01 + Owner: Neutral + Location: 56,58 + Actor361: t15 + Owner: Neutral + Location: 57,60 + Actor362: t12 + Owner: Neutral + Location: 59,58 + Actor363: tc01 + Owner: Neutral + Location: 57,63 + Actor364: t11 + Owner: Neutral + Location: 57,57 + Actor365: t07 + Owner: Neutral + Location: 56,56 + Actor366: t12 + Owner: Neutral + Location: 57,62 + Actor367: c1 + Owner: Neutral + SubCell: 3 + Facing: 384 + Location: 47,57 + Church: v01 + Owner: Neutral + Location: 48,50 + Actor369: v02 + Owner: Neutral + Location: 45,59 + Actor370: v04 + Owner: Neutral + Location: 49,55 + Actor371: v05 + Owner: Neutral + Location: 39,51 + Actor372: v06 + Owner: Neutral + Location: 54,48 + Actor373: v16 + Owner: Neutral + Location: 55,49 + Actor374: v16 + Owner: Neutral + Location: 56,49 + Actor375: v18 + Owner: Neutral + Location: 57,49 + Actor376: v07 + Owner: Neutral + Location: 57,47 + Actor377: wood + Owner: Neutral + Location: 54,49 + Actor378: wood + Owner: Neutral + Location: 54,50 + Actor379: wood + Owner: Neutral + Location: 55,50 + Actor380: wood + Owner: Neutral + Location: 56,50 + Actor381: wood + Owner: Neutral + Location: 57,50 + Actor382: wood + Owner: Neutral + Location: 58,50 + Actor383: wood + Owner: Neutral + Location: 58,49 + Actor384: wood + Owner: Neutral + Location: 58,48 + Actor385: wood + Owner: Neutral + Location: 57,48 + Actor386: wood + Owner: Neutral + Location: 56,48 + Actor387: wood + Owner: Neutral + Location: 56,47 + Actor388: wood + Owner: Neutral + Location: 55,47 + Actor389: wood + Owner: Neutral + Location: 49,49 + Actor390: wood + Owner: Neutral + Location: 50,49 + Actor391: wood + Owner: Neutral + Location: 50,50 + Actor392: wood + Owner: Neutral + Location: 50,51 + Actor393: wood + Owner: Neutral + Location: 50,52 + Actor394: wood + Owner: Neutral + Location: 49,52 + Actor395: v11 + Owner: Neutral + Location: 41,62 + Actor396: t11 + Owner: Neutral + Location: 59,49 + Actor397: tc05 + Owner: Neutral + Location: 67,51 + Actor398: t16 + Owner: Neutral + Location: 66,49 + Actor399: t15 + Owner: Neutral + Location: 63,41 + Actor400: tc03 + Owner: Neutral + Location: 67,49 + Actor401: t14 + Owner: Neutral + Location: 53,46 + Actor402: tc03 + Owner: Neutral + Location: 39,47 + Actor403: t17 + Owner: Neutral + Location: 42,46 + Actor404: t07 + Owner: Neutral + Location: 43,48 + Actor405: t08 + Owner: Neutral + Location: 35,46 + Actor406: tc05 + Owner: Neutral + Faction: germany + Location: 45,16 + Actor407: tc03 + Owner: Neutral + Faction: germany + Location: 46,7 + Actor408: t15 + Owner: Neutral + Faction: germany + Location: 42,7 + Actor409: t14 + Owner: Neutral + Faction: germany + Location: 51,15 + Actor410: t11 + Owner: Neutral + Faction: germany + Location: 26,20 + Actor411: tc03 + Owner: Neutral + Faction: germany + Location: 13,9 + Actor412: t17 + Owner: Neutral + Faction: germany + Location: 12,9 + Actor413: ptur + Owner: Scrin + Location: 31,14 + TurretFacing: 388 + Actor414: ptur + Owner: Scrin + Location: 44,18 + TurretFacing: 594 + Actor452: jeep + Owner: Greece + Location: 16,53 + Facing: 640 + Actor457: e1 + Owner: Greece + SubCell: 3 + Location: 22,50 + Facing: 563 + Actor458: e1 + Owner: Greece + Facing: 384 + Location: 22,50 + SubCell: 1 + Actor466: e3 + Owner: Greece + Location: 23,50 + SubCell: 3 + Facing: 384 + Actor470: snip + Owner: Greece + Location: 17,47 + SubCell: 3 + Facing: 0 + Actor471: snip + Owner: Greece + SubCell: 3 + Location: 25,47 + Facing: 1023 + Actor472: agun + Owner: Greece + Location: 25,49 + Actor473: agun + Owner: Greece + Location: 25,58 + Actor474: e1 + Owner: Greece + Location: 11,15 + SubCell: 3 + Facing: 1023 + Actor476: e1 + Owner: Greece + Location: 13,16 + SubCell: 3 + Facing: 840 + Actor477: e1 + Owner: Greece + SubCell: 3 + Location: 13,18 + Facing: 705 + Actor478: e1 + Owner: Greece + SubCell: 1 + Location: 13,16 + Facing: 896 + Actor479: medi + Owner: Greece + SubCell: 3 + Location: 12,18 + Facing: 721 + Actor480: s1 + Owner: Scrin + SubCell: 3 + Location: 13,12 + Facing: 531 + Actor481: s1 + Owner: Scrin + SubCell: 3 + Location: 15,14 + Facing: 384 + Actor482: s1 + Owner: Scrin + SubCell: 3 + Location: 16,17 + Facing: 214 + Actor483: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 32,14 + Actor487: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 34,13 + Actor488: s3 + Owner: Scrin + Facing: 384 + Location: 35,13 + SubCell: 3 + Actor490: s3 + Owner: Scrin + SubCell: 3 + Location: 43,17 + Facing: 570 + Actor493: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 30,22 + Actor494: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 29,21 + Actor496: tpod + Owner: Scrin + Location: 103,22 + Facing: 512 + Actor497: tpod + Owner: Scrin + Location: 87,11 + Facing: 384 + Actor499: corr + Owner: Scrin + Location: 111,16 + Facing: 640 + Actor500: harv.scrin + Owner: Scrin + Location: 114,12 + Facing: 7 + Actor501: s1 + Owner: Scrin + SubCell: 3 + Location: 105,23 + Facing: 642 + Actor502: s1 + Owner: Scrin + Location: 105,23 + SubCell: 1 + Facing: 384 + Actor503: s1 + Owner: Scrin + Location: 105,23 + SubCell: 2 + Facing: 547 + NonEasyStormColumn1: scol + Owner: Scrin + Location: 51,12 + Actor506: scol + Owner: Scrin + Location: 77,23 + HardOnlyStormColumn3: scol + Owner: Scrin + Location: 106,36 + Actor510: scol + Owner: Scrin + Location: 119,38 + Actor512: shar + Owner: Scrin + TurretFacing: 384 + Location: 84,36 + Actor509: shar + Owner: Scrin + TurretFacing: 384 + Location: 106,48 + Actor518: rea2 + Owner: Scrin + Location: 124,22 + Actor519: rea2 + Owner: Scrin + Location: 121,22 + Actor520: rea2 + Owner: Scrin + Location: 118,22 + Actor521: swal + Owner: Scrin + Location: 117,22 + Actor522: swal + Owner: Scrin + Location: 117,23 + Actor523: swal + Owner: Scrin + Location: 117,24 + Actor525: swal + Owner: Scrin + Location: 117,25 + Actor538: swal + Owner: Scrin + Location: 127,25 + Actor539: swal + Owner: Scrin + Location: 127,24 + Actor540: swal + Owner: Scrin + Location: 127,23 + Actor541: swal + Owner: Scrin + Location: 127,22 + Actor542: swal + Owner: Scrin + Location: 127,21 + Actor543: swal + Owner: Scrin + Location: 126,21 + Actor544: swal + Owner: Scrin + Location: 124,21 + Actor545: swal + Owner: Scrin + Location: 117,21 + Actor546: swal + Owner: Scrin + Location: 118,21 + Actor547: swal + Owner: Scrin + Location: 119,21 + Actor548: swal + Owner: Scrin + Location: 120,21 + Actor549: swal + Owner: Scrin + Location: 121,21 + Actor550: swal + Owner: Scrin + Location: 122,21 + Actor551: swal + Owner: Scrin + Location: 123,21 + Actor552: swal + Owner: Scrin + Location: 125,21 + Actor524: swal + Owner: Scrin + Location: 117,26 + Actor526: rea2 + Owner: Scrin + Location: 118,25 + Actor527: rea2 + Owner: Scrin + Location: 121,25 + Actor528: rea2 + Owner: Scrin + Location: 124,25 + Actor529: swal + Owner: Scrin + Location: 127,26 + Actor530: swal + Owner: Scrin + Location: 117,27 + Actor531: swal + Owner: Scrin + Location: 127,27 + Actor532: swal + Owner: Scrin + Location: 117,28 + Actor533: swal + Owner: Scrin + Location: 118,28 + Actor534: swal + Owner: Scrin + Location: 119,28 + Actor535: swal + Owner: Scrin + Location: 120,28 + Actor536: swal + Owner: Scrin + Location: 121,28 + Actor537: swal + Owner: Scrin + Location: 122,28 + Actor554: swal + Owner: Scrin + Location: 123,28 + Actor555: swal + Owner: Scrin + Location: 124,28 + Actor556: swal + Owner: Scrin + Location: 125,28 + Actor557: swal + Owner: Scrin + Location: 126,28 + Actor558: swal + Owner: Scrin + Location: 127,28 + Actor516: tc02 + Owner: Neutral + Location: 24,8 + Actor517: tc05 + Owner: Neutral + Location: 18,13 + Actor559: t02 + Owner: Neutral + Location: 42,2 + Actor560: tc04 + Owner: Neutral + Location: 34,1 + Actor561: t11 + Owner: Neutral + Location: 29,6 + Actor562: t15 + Owner: Neutral + Location: 38,1 + Actor563: t03 + Owner: Neutral + Location: 31,4 + Actor564: tc05 + Owner: Neutral + Location: 26,3 + Actor565: t06 + Owner: Neutral + Location: 30,1 + Actor566: t08 + Owner: Neutral + Location: 31,2 + Actor568: t10 + Owner: Neutral + Location: 22,3 + Actor567: t15 + Owner: Neutral + Location: 21,5 + Actor569: t15 + Owner: Neutral + Location: 10,5 + Actor570: tc04 + Owner: Neutral + Location: 7,13 + Actor571: t17 + Owner: Neutral + Location: 5,11 + Actor572: tc01 + Owner: Neutral + Location: 1,16 + Actor573: t15 + Owner: Neutral + Location: 1,1 + Actor574: tc03 + Owner: Neutral + Location: 3,23 + Actor575: t17 + Owner: Neutral + Location: 0,28 + Actor576: t10 + Owner: Neutral + Location: 1,19 + Actor577: t15 + Owner: Neutral + Location: 5,2 + Actor578: t14 + Owner: Neutral + Location: 17,3 + Actor579: t12 + Owner: Neutral + Location: 20,17 + Actor580: t14 + Owner: Neutral + Location: 6,20 + Actor581: v03 + Owner: Neutral + Location: 4,8 + Actor582: v05 + Owner: Neutral + Location: 16,5 + Actor583: v04 + Owner: Neutral + Location: 27,24 + Actor585: v06 + Owner: Neutral + Location: 4,25 + Actor586: v18 + Owner: Neutral + Location: 4,27 + Actor587: v18 + Owner: Neutral + Location: 5,27 + Actor588: v16 + Owner: Neutral + Location: 5,26 + Actor589: v16 + Owner: Neutral + Location: 6,26 + Actor590: wood + Owner: Neutral + Location: 4,26 + Actor591: wood + Owner: Neutral + Location: 3,26 + Actor592: wood + Owner: Neutral + Location: 3,27 + Actor593: wood + Owner: Neutral + Location: 3,28 + Actor594: wood + Owner: Neutral + Location: 4,28 + Actor595: wood + Owner: Neutral + Location: 6,28 + Actor596: wood + Owner: Neutral + Location: 5,28 + Actor597: wood + Owner: Neutral + Location: 6,27 + Actor598: wood + Owner: Neutral + Location: 7,27 + Actor599: wood + Owner: Neutral + Location: 7,26 + Actor600: wood + Owner: Neutral + Location: 7,25 + Actor601: wood + Owner: Neutral + Location: 6,25 + Actor602: wood + Owner: Neutral + Location: 15,5 + Actor603: wood + Owner: Neutral + Location: 15,6 + Actor604: wood + Owner: Neutral + Location: 16,6 + Actor605: wood + Owner: Neutral + Location: 17,6 + Actor606: wood + Owner: Neutral + Location: 15,24 + Actor607: wood + Owner: Neutral + Location: 16,24 + Actor608: brl3 + Owner: Creeps + Location: 38,57 + Actor609: v09 + Owner: Neutral + Location: 15,23 + Actor610: t02 + Owner: Neutral + Location: 52,62 + Actor611: t03 + Owner: Neutral + Location: 47,59 + FirstConvoyPath2: waypoint + Owner: Neutral + Location: 11,3 + FirstConvoyPath3: waypoint + Owner: Neutral + Location: 10,4 + FirstConvoyPath4: waypoint + Owner: Neutral + Location: 9,4 + FirstConvoyPath5: waypoint + Owner: Neutral + Location: 8,5 + FirstConvoyPath6: waypoint + Owner: Neutral + Location: 8,7 + FirstConvoyPath7: waypoint + Owner: Neutral + Location: 9,8 + FirstConvoyPath8: waypoint + Owner: Neutral + Location: 15,8 + FirstConvoyPath9: waypoint + Owner: Neutral + Location: 16,9 + FirstConvoyPath10: waypoint + Owner: Neutral + Location: 16,13 + FirstConvoyPath11: waypoint + Owner: Neutral + Location: 15,14 + FirstConvoyPath12: waypoint + Owner: Neutral + Location: 14,14 + FirstConvoyPath13: waypoint + Owner: Neutral + Location: 13,15 + FirstConvoyPath14: waypoint + Owner: Neutral + Location: 13,19 + FirstConvoyPath15: waypoint + Owner: Neutral + Location: 14,21 + FirstConvoyPath16: waypoint + Owner: Neutral + Location: 20,21 + FirstConvoyPath17: waypoint + Owner: Neutral + Location: 21,22 + SecondConvoyPath2: waypoint + Owner: Neutral + Location: 49,18 + SecondConvoyPath3: waypoint + Owner: Neutral + Location: 48,19 + SecondConvoyPath4: waypoint + Owner: Neutral + Location: 47,19 + SecondConvoyPath5: waypoint + Owner: Neutral + Location: 46,20 + SecondConvoyPath6: waypoint + Owner: Neutral + Location: 46,54 + SecondConvoyPath7: waypoint + Owner: Neutral + Location: 45,55 + SecondConvoyPath8: waypoint + Owner: Neutral + Location: 43,55 + ThirdConvoyPath2: waypoint + Owner: Neutral + Location: 74,6 + ThirdConvoyPath3: waypoint + Owner: Neutral + Location: 67,13 + ThirdConvoyPath4: waypoint + Owner: Neutral + Location: 62,13 + ThirdConvoyPath5: waypoint + Owner: Neutral + Location: 61,14 + ThirdConvoyPath6: waypoint + Owner: Neutral + Location: 61,16 + ThirdConvoyPath7: waypoint + Owner: Neutral + Location: 55,16 + ThirdConvoyPath8: waypoint + Owner: Neutral + Location: 53,14 + ThirdConvoyPath9: waypoint + Owner: Neutral + Location: 51,14 + ThirdConvoyPath10: waypoint + Owner: Neutral + Location: 49,16 + FourthConvoyPath2: waypoint + Owner: Neutral + Location: 126,40 + FourthConvoyPath3: waypoint + Owner: Neutral + Location: 118,40 + FourthConvoyPath4: waypoint + Owner: Neutral + Location: 116,38 + FourthConvoyPath5: waypoint + Owner: Neutral + Location: 106,38 + FourthConvoyPath6: waypoint + Owner: Neutral + Location: 104,36 + FourthConvoyPath9: waypoint + Owner: Neutral + Location: 85,29 + FourthConvoyPath10: waypoint + Owner: Neutral + Location: 85,27 + FourthConvoyPath11: waypoint + Owner: Neutral + Location: 83,27 + FourthConvoyPath12: waypoint + Owner: Neutral + Location: 81,25 + FourthConvoyPath13: waypoint + Owner: Neutral + Location: 71,25 + FourthConvoyPath14: waypoint + Owner: Neutral + Location: 69,23 + Actor656: medi + Owner: Greece + SubCell: 3 + Facing: 721 + Location: 10,16 + HardOnlyStormColumn1: scol + Owner: Scrin + Location: 63,10 + Actor658: devo + Owner: Scrin + Facing: 384 + Location: 68,9 + Actor659: devo + Owner: Scrin + Location: 70,13 + Facing: 384 + NonEasyCorrupter1: corr + Owner: Scrin + Location: 69,11 + Facing: 384 + Actor661: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 68,10 + Actor662: s1 + Owner: Scrin + Facing: 384 + Location: 68,10 + SubCell: 1 + Actor663: s1 + Owner: Scrin + Facing: 384 + Location: 71,12 + SubCell: 3 + Actor664: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 69,13 + Actor665: s2 + Owner: Scrin + Facing: 384 + Location: 70,12 + SubCell: 3 + Actor666: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 69,10 + Actor667: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 52,12 + Actor668: s1 + Owner: Scrin + Location: 52,12 + SubCell: 1 + Facing: 384 + Actor669: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 46,9 + Actor670: intl + Owner: Scrin + Facing: 384 + Location: 33,16 + Actor671: intl + Owner: Scrin + Location: 46,19 + Facing: 523 + Actor673: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 58,10 + Actor674: s1 + Owner: Scrin + SubCell: 3 + Location: 59,9 + Facing: 586 + Actor675: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 71,11 + Actor676: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 48,8 + Actor677: s3 + Owner: Scrin + Facing: 384 + Location: 59,9 + SubCell: 1 + Actor678: gunw + Owner: Scrin + Location: 86,24 + Facing: 436 + Actor680: tc03.husk + Owner: Neutral + Location: 88,35 + Actor681: tc04 + Owner: Neutral + Location: 126,53 + Actor682: tc02 + Owner: Neutral + Location: 122,52 + Actor683: t11 + Owner: Neutral + Location: 120,54 + Actor684: tc01 + Owner: Neutral + Location: 122,58 + Actor685: tc03 + Owner: Neutral + Location: 124,52 + Actor686: t14 + Owner: Neutral + Location: 117,52 + Actor687: t17 + Owner: Neutral + Location: 122,63 + Actor688: tc02 + Owner: Neutral + Location: 126,60 + Actor689: tc05 + Owner: Neutral + Location: 127,61 + Actor690: tc03 + Owner: Neutral + Location: 116,56 + Actor691: t14 + Owner: Neutral + Location: 117,60 + Actor692: t06 + Owner: Neutral + Location: 119,64 + Actor693: t07 + Owner: Neutral + Location: 117,58 + Actor694: t07 + Owner: Neutral + Location: 127,51 + Actor695: t05 + Owner: Neutral + Location: 112,51 + Actor696: moneycrate + Owner: Neutral + Location: 116,59 + Actor697: tc05 + Owner: Neutral + Location: 81,0 + Actor698: t17 + Owner: Neutral + Location: 81,1 + Actor699: t16 + Owner: Neutral + Location: 82,2 + Actor700: t12 + Owner: Neutral + Location: 78,4 + Actor702: tc04 + Owner: Neutral + Location: 86,20 + Actor703: t11 + Owner: Neutral + Location: 85,19 + Actor706: t12 + Owner: Neutral + Location: 79,21 + Actor710: tc04 + Owner: Neutral + Location: 123,31 + Actor711: t17 + Owner: Neutral + Location: 121,35 + Actor712: t11 + Owner: Neutral + Location: 121,46 + Actor713: t12 + Owner: Neutral + Location: 123,45 + Actor714: tc02 + Owner: Neutral + Location: 111,46 + Actor715: tc01 + Owner: Neutral + Location: 106,42 + Actor717: t10 + Owner: Neutral + Location: 115,43 + Actor726: t03 + Owner: Neutral + Location: 127,34 + Actor727: ptur + Owner: Scrin + Location: 99,29 + TurretFacing: 341 + Actor728: silo.scrin + Owner: Scrin + Location: 94,2 + Actor729: silo.scrin + Owner: Scrin + Location: 93,2 + Actor730: silo.scrin + Owner: Scrin + Location: 95,2 + SeekerPatroller1: seek + Owner: Scrin + Location: 121,40 + Facing: 277 + SeekerPatroller3: seek + Owner: Scrin + Location: 122,41 + Facing: 245 + SeekerPatroller2: seek + Owner: Scrin + Location: 122,39 + Facing: 269 + Actor742: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 84,16 + Actor743: s1 + Owner: Scrin + Facing: 384 + Location: 84,15 + SubCell: 3 + Actor744: s1 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 84,16 + Actor745: s3 + Owner: Scrin + Facing: 384 + Location: 84,16 + SubCell: 2 + Actor746: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 86,16 + Actor747: s4 + Owner: Scrin + SubCell: 3 + Location: 85,15 + Facing: 547 + Actor748: gunw + Owner: Scrin + Facing: 384 + Location: 47,9 + Actor749: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 48,9 + Actor750: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 52,3 + Actor751: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 51,4 + Actor752: ptur + Owner: Scrin + Location: 47,4 + TurretFacing: 594 + Actor731: s1 + Owner: Scrin + SubCell: 3 + Location: 125,38 + Facing: 658 + Actor732: s1 + Owner: Scrin + Facing: 384 + Location: 125,38 + SubCell: 1 + Actor733: s1 + Owner: Scrin + Location: 124,37 + SubCell: 3 + Facing: 491 + Actor753: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 127,38 + Actor754: s3 + Owner: Scrin + Facing: 384 + Location: 124,38 + SubCell: 3 + Actor755: s3 + Owner: Scrin + SubCell: 3 + Location: 124,42 + Facing: 896 + Actor756: s1 + Owner: Scrin + SubCell: 3 + Location: 125,42 + Facing: 0 + Actor757: s1 + Owner: Scrin + Location: 123,42 + SubCell: 3 + Facing: 0 + Actor758: s1 + Owner: Scrin + SubCell: 1 + Location: 123,42 + Facing: 384 + Actor759: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 90,4 + Actor760: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 100,10 + Actor761: s4 + Owner: Scrin + Facing: 384 + Location: 100,10 + SubCell: 1 + Actor762: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 101,5 + Actor763: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 100,3 + Actor764: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 106,6 + Actor765: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 105,15 + Actor766: s1 + Owner: Scrin + Facing: 384 + Location: 105,15 + SubCell: 1 + Actor767: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 101,11 + Actor768: s1 + Owner: Scrin + Facing: 384 + Location: 106,6 + SubCell: 1 + Actor769: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 102,4 + Actor770: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 100,15 + Actor771: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 107,17 + Actor772: s3 + Owner: Scrin + Facing: 384 + Location: 100,15 + SubCell: 1 + Actor773: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 96,16 + Actor774: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 105,18 + Actor775: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 105,6 + Actor776: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 122,11 + Actor777: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 120,16 + Actor778: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 116,9 + Actor779: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 118,6 + Actor780: s1 + Owner: Scrin + Facing: 384 + Location: 120,16 + SubCell: 1 + Actor781: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 118,17 + Actor782: s1 + Owner: Scrin + Facing: 384 + Location: 122,11 + SubCell: 1 + Actor783: s1 + Owner: Scrin + Facing: 384 + Location: 116,9 + SubCell: 1 + Actor784: s4 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 123,13 + Actor785: gunw + Owner: Scrin + Location: 119,14 + Facing: 467 + Actor786: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 116,25 + Actor787: s3 + Owner: Scrin + Facing: 384 + Location: 116,25 + SubCell: 1 + Actor788: s3 + Owner: Scrin + SubCell: 3 + Location: 121,29 + Facing: 539 + Actor789: s3 + Owner: Scrin + Facing: 384 + Location: 121,29 + SubCell: 1 + Actor790: s1 + Owner: Scrin + SubCell: 3 + Location: 122,29 + Facing: 384 + Actor791: s1 + Owner: Scrin + Location: 122,29 + SubCell: 1 + Facing: 384 + Actor792: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 124,29 + Actor801: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 120,37 + Actor803: s1 + Owner: Scrin + Facing: 384 + Location: 107,48 + SubCell: 3 + Actor804: s1 + Owner: Scrin + Facing: 384 + Location: 105,48 + SubCell: 3 + Actor805: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 84,37 + Actor806: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 83,36 + Actor812: seek + Owner: Scrin + Facing: 384 + Location: 44,16 + Actor813: seek + Owner: Scrin + Facing: 384 + Location: 52,20 + Actor814: devo + Owner: Scrin + Location: 76,2 + Facing: 309 + Actor815: gunw + Owner: Scrin + Location: 71,4 + Facing: 642 + Actor816: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 70,4 + Actor817: s1 + Owner: Scrin + Facing: 384 + Location: 71,3 + SubCell: 3 + Actor818: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 77,3 + Actor819: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 76,1 + Actor820: s3 + Owner: Scrin + Facing: 384 + Location: 77,3 + SubCell: 1 + Actor821: s3 + Owner: Scrin + Facing: 384 + Location: 71,2 + SubCell: 3 + Actor822: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 76,4 + Actor831: s1 + Owner: Scrin + Facing: 384 + Location: 87,24 + SubCell: 3 + Actor832: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 88,24 + Actor833: s1 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 87,24 + Actor834: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 88,26 + Actor835: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 89,25 + Actor836: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 86,23 + Actor837: s4 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 89,24 + Actor838: smedi + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 100,14 + Actor839: smedi + Owner: Scrin + Facing: 384 + Location: 106,17 + SubCell: 3 + Actor841: smedi + Owner: Scrin + Facing: 384 + Location: 88,24 + SubCell: 1 + Actor842: smedi + Owner: Scrin + Facing: 384 + Location: 71,12 + SubCell: 1 + Actor843: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 30,21 + HardOnlyTripod1: tpod + Owner: Scrin + Location: 94,33 + Facing: 174 + Actor845: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 94,34 + Actor846: s3 + Owner: Scrin + SubCell: 3 + Location: 95,33 + Facing: 499 + Actor847: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 25,17 + Actor848: gunw + Owner: Scrin + Facing: 384 + Location: 26,17 + Actor849: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 26,18 + Actor850: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 12,4 + Actor851: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 9,3 + Actor852: s3 + Owner: Scrin + Location: 12,4 + SubCell: 1 + Facing: 384 + Actor853: s3 + Owner: Scrin + SubCell: 3 + Location: 6,6 + Facing: 705 + Actor854: s3 + Owner: Scrin + SubCell: 3 + Location: 15,4 + Facing: 269 + Actor855: s3 + Owner: Scrin + Facing: 384 + Location: 16,17 + SubCell: 1 + Actor856: ice03 + Owner: Neutral + Location: 41,30 + Actor857: ice02 + Owner: Neutral + Location: 65,37 + Actor859: ice03 + Owner: Neutral + Location: 99,46 + Actor860: ice04 + Owner: Neutral + Location: 72,45 + Actor861: ice04 + Owner: Neutral + Location: 85,61 + Actor862: ice05 + Owner: Neutral + Location: 111,60 + Actor863: ice01 + Owner: Neutral + Location: 5,44 + Actor865: ice04 + Owner: Neutral + Location: 8,39 + HardOnlyStormColumn2: scol + Owner: Scrin + Location: 41,8 + Actor866: t11 + Owner: Neutral + Location: 125,16 + Actor867: t16 + Owner: Neutral + Location: 125,5 + Actor868: t03 + Owner: Neutral + Location: 124,19 + SecondConvoyFlare: waypoint + Owner: Neutral + Location: 49,4 + Actor870: e1 + Owner: Greece + Location: 44,44 + SubCell: 1 + Facing: 1023 + Actor872: e1 + Owner: Greece + SubCell: 3 + Location: 19,45 + Facing: 880 + Actor873: e1 + Owner: Greece + SubCell: 3 + Location: 23,45 + Facing: 71 + Actor874: s1 + Owner: Scrin + Facing: 384 + Location: 26,18 + SubCell: 1 + Actor875: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 31,21 + Actor876: s1 + Owner: Scrin + Facing: 384 + Location: 31,21 + SubCell: 1 + Actor878: s1 + Owner: Scrin + Facing: 384 + Location: 32,14 + SubCell: 1 + Actor879: s1 + Owner: Scrin + SubCell: 3 + Location: 13,3 + Facing: 618 + Actor880: s1 + Owner: Scrin + Facing: 384 + Location: 13,3 + SubCell: 1 + Actor881: s1 + Owner: Scrin + Facing: 384 + Location: 48,9 + SubCell: 1 + Actor883: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 51,19 + Actor884: s1 + Owner: Scrin + Facing: 384 + Location: 51,19 + SubCell: 1 + Actor885: s1 + Owner: Scrin + Facing: 384 + Location: 43,17 + SubCell: 1 + Actor887: s1 + Owner: Scrin + Facing: 384 + Location: 44,19 + SubCell: 1 + Actor886: s1 + Owner: Scrin + Location: 44,19 + SubCell: 2 + Facing: 642 + Actor889: s1 + Owner: Scrin + Facing: 384 + Location: 95,33 + SubCell: 1 + Actor893: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 87,13 + Actor894: s1 + Owner: Scrin + Facing: 384 + Location: 88,14 + SubCell: 3 + FirstConvoyPath18: waypoint + Owner: Neutral + Location: 21,64 + SecondConvoyPath9: waypoint + Owner: Neutral + Location: 43,64 + FirstConvoyPath1: waypoint + Owner: Neutral + Location: 11,1 + SecondConvoyPath1: waypoint + Owner: Neutral + Location: 49,1 + ThirdConvoyPath1: waypoint + Owner: Neutral + Location: 74,1 + FourthConvoyPath1: waypoint + Owner: Neutral + Location: 128,42 + Actor869: sbag + Owner: Neutral + Location: 64,54 + Actor896: sbag + Owner: Neutral + Location: 62,54 + Actor897: sbag + Owner: Neutral + Location: 63,54 + Health: 33 + Actor898: sbag + Owner: Neutral + Location: 62,55 + Actor899: sbag + Owner: Neutral + Location: 62,56 + Actor900: sbag + Owner: Neutral + Location: 62,57 + Actor901: sbag + Owner: Neutral + Location: 62,58 + Health: 33 + Actor902: sbag + Owner: Neutral + Location: 62,59 + Actor903: sbag + Owner: Neutral + Location: 62,60 + Actor904: sbag + Owner: Neutral + Location: 62,61 + Actor908: sbag + Owner: Neutral + Location: 62,63 + Actor909: sbag + Owner: Neutral + Location: 62,64 + Actor910: sbag + Owner: Neutral + Location: 63,64 + Actor911: sbag + Owner: Neutral + Location: 64,64 + Actor912: sbag + Owner: Neutral + Location: 69,62 + Health: 33 + Actor913: sbag + Owner: Neutral + Location: 69,63 + Actor914: sbag + Owner: Neutral + Location: 69,64 + Actor915: sbag + Owner: Neutral + Location: 68,64 + Health: 33 + Actor916: sbag + Owner: Neutral + Location: 67,64 + Actor917: sbag + Owner: Neutral + Location: 67,54 + Health: 33 + Actor918: sbag + Owner: Neutral + Location: 68,54 + Actor919: sbag + Owner: Neutral + Location: 69,54 + Actor920: sbag + Owner: Neutral + Location: 69,55 + Actor922: sbag + Owner: Neutral + Location: 62,62 + Health: 33 + Actor905: t02 + Owner: Neutral + Location: 61,61 + Actor906: t08 + Owner: Neutral + Location: 61,63 + StormriderPatroller4: stmr + Owner: Scrin + Location: 117,46 + Facing: 384 + StormriderPatroller3: stmr + Owner: Scrin + Location: 120,43 + Facing: 384 + ScrinAirPatrol2a: waypoint + Owner: Neutral + Location: 113,42 + ScrinAirPatrol2b: waypoint + Owner: Neutral + Location: 55,10 + SeekerPatrol1a: waypoint + Owner: Neutral + Location: 120,40 + SeekerPatrol1b: waypoint + Owner: Neutral + Location: 55,18 + StormriderPatroller1: stmr + Owner: Scrin + Location: 98,60 + Facing: 384 + Stance: Defend + StormriderPatroller2: stmr + Owner: Scrin + Location: 104,60 + Facing: 384 + Stance: Defend + ScrinAirPatrol1b: waypoint + Owner: Neutral + Location: 68,29 + ScrinAirPatrol1c: waypoint + Owner: Neutral + Location: 33,30 + ScrinAirPatrol1a: waypoint + Owner: Neutral + Location: 99,52 + Actor907: oilb + Owner: Neutral + Location: 22,16 + Actor828: intl.ai2 + Owner: Scrin + Facing: 384 + Location: 87,15 + Actor923: intl.ai2 + Owner: Scrin + Location: 58,16 + Facing: 277 + Actor924: intl.ai2 + Owner: Scrin + Location: 87,25 + Facing: 384 + Actor925: intl.ai2 + Owner: Scrin + Facing: 384 + Location: 105,35 + Actor926: intl.ai2 + Owner: Scrin + Facing: 384 + Location: 62,8 + Actor927: swal + Owner: Scrin + Location: 89,5 + Actor928: swal + Owner: Scrin + Location: 89,6 + Actor929: scol + Owner: Scrin + Location: 90,6 + Actor930: ptur + Owner: Scrin + TurretFacing: 333 + Location: 88,7 + Actor931: swal + Owner: Scrin + Location: 89,7 + Actor932: swal + Owner: Scrin + Location: 90,7 + Actor933: swal + Owner: Scrin + Location: 89,8 + Actor934: swal + Owner: Scrin + Location: 90,8 + Actor936: intl + Owner: Scrin + Location: 85,6 + Facing: 475 + Actor937: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 86,6 + Actor938: corr + Owner: Scrin + Facing: 436 + Location: 86,7 + StormriderAttacker1: stmr + Owner: Scrin + Location: 62,40 + Facing: 384 + StormriderAttacker2: stmr + Owner: Scrin + Location: 65,43 + Facing: 384 + Actor829: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 55,25 + Actor882: s1 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 55,25 + Actor891: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 57,26 + Actor892: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 58,26 + Actor941: t16 + Owner: Neutral + Location: 29,9 + Actor942: tc01 + Owner: Neutral + Location: 36,20 + Actor943: tc01 + Owner: Neutral + Location: 36,20 + Actor944: t14 + Owner: Neutral + Location: 37,19 + Actor945: t16 + Owner: Neutral + Location: 35,21 + Actor946: t06 + Owner: Neutral + Location: 39,16 + Actor947: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 35,16 + Actor948: s1 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 35,16 + FourthConvoyPath16: waypoint + Owner: Neutral + Location: 49,24 + FourthConvoyPath15: waypoint + Owner: Neutral + Location: 61,25 + Actor949: t08 + Owner: Neutral + Location: 62,24 + Actor888: s1 + Owner: Scrin + Facing: 384 + Location: 62,27 + SubCell: 3 + Actor890: s3 + Owner: Scrin + Facing: 384 + Location: 63,27 + SubCell: 3 + Actor935: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 36,17 + Actor951: sbag + Owner: Greece + Location: 51,42 + Actor952: sbag + Owner: Greece + Location: 52,42 + Actor953: sbag + Owner: Greece + Location: 53,42 + Actor954: sbag + Owner: Greece + Location: 51,43 + Actor955: pris + Owner: Greece + Location: 52,43 + Actor956: sbag + Owner: Greece + Location: 53,43 + Actor871: t17 + Owner: Neutral + Location: 57,37 + Actor958: t16 + Owner: Neutral + Location: 95,26 + Actor959: tc04 + Owner: Neutral + Location: 97,23 + Actor960: t14 + Owner: Neutral + Location: 92,22 + Actor961: t06 + Owner: Neutral + Location: 92,26 + Actor962: tc01 + Owner: Neutral + Location: 100,23 + Actor963: e1 + Owner: Greece + SubCell: 3 + Location: 50,44 + Facing: 737 + Actor964: e1 + Owner: Greece + Location: 54,43 + SubCell: 3 + Facing: 737 + Actor965: e1 + Owner: Greece + Facing: 384 + Location: 54,43 + SubCell: 1 + Actor966: e3 + Owner: Greece + Facing: 384 + Location: 50,44 + SubCell: 1 + EntranceReveal1: waypoint + Owner: Neutral + Location: 88,10 + EntranceReveal2: waypoint + Owner: Neutral + Location: 104,22 + EntranceReveal3: waypoint + Owner: Neutral + Location: 45,19 + DestroyerSpawn1: waypoint + Owner: Neutral + Location: 97,64 + DestroyerSpawn2: waypoint + Owner: Neutral + Location: 102,64 + DestroyerRally2: waypoint + Owner: Neutral + Location: 74,36 + DestroyerRally1: waypoint + Owner: Neutral + Location: 71,38 + NonEasyStormColumn2: scol + Owner: Scrin + Location: 64,20 + HardOnlyShardLauncher2: shar + Owner: Scrin + Location: 73,29 + TurretFacing: 384 + Actor877: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 75,30 + Actor858: tc02 + Owner: Neutral + Location: 97,38 + FourthConvoyPath7: waypoint + Owner: Neutral + Location: 104,34 + FourthConvoyPath8: waypoint + Owner: Neutral + Location: 86,34 + NonEasyStormColumn3: scol + Owner: Scrin + Location: 89,31 + Actor827: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 116,32 + Actor957: devo + Owner: Scrin + Facing: 384 + Location: 113,33 + Actor969: gunw + Owner: Scrin + Facing: 384 + Location: 115,33 + Actor970: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 117,33 + Actor971: devo + Owner: Scrin + Facing: 384 + Location: 116,34 + Actor972: ptur + Owner: Scrin + TurretFacing: 428 + Location: 116,29 + Actor895: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 112,30 + Actor973: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 110,31 + Actor974: s4 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 110,31 + Actor975: t15 + Owner: Neutral + Location: 111,31 + Actor976: tc01 + Owner: Neutral + Location: 109,26 + Actor826: t05 + Owner: Neutral + Location: 73,16 + Actor844: t17 + Owner: Neutral + Location: 67,17 + Actor864: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 87,3 + Actor950: s3 + Owner: Scrin + SubCell: 3 + Facing: 483 + Location: 88,3 + Actor967: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 86,4 + Actor968: s1 + Owner: Scrin + SubCell: 1 + Facing: 586 + Location: 86,4 + Actor977: s1 + Owner: Scrin + SubCell: 3 + Facing: 531 + Location: 87,4 + Actor978: s3 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 87,4 + Actor979: smedi + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 88,4 + Actor980: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 88,5 + Actor981: s3 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 88,5 + Actor840: devo + Owner: Scrin + Location: 87,6 + Facing: 436 + Actor830: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 83,7 + Actor982: s1 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 83,7 + HardOnlyShardLauncher1: shar + Owner: Scrin + Location: 60,28 + TurretFacing: 384 + Actor824: wood + Owner: Neutral + Location: 108,41 + Actor825: wood + Owner: Neutral + Location: 109,41 + Actor939: wood + Owner: Neutral + Location: 108,42 + Actor940: v15 + Owner: Neutral + Location: 109,42 + Actor983: wood + Owner: Neutral + Location: 108,43 + Actor984: v16 + Owner: Neutral + Location: 109,43 + Actor985: wood + Owner: Neutral + Location: 108,44 + Actor986: v11 + Owner: Neutral + Location: 109,44 + ScrinAttackAssembly1: waypoint + Owner: Neutral + Location: 34,14 + ScrinAttackAssembly2: waypoint + Owner: Neutral + Location: 57,19 + ScrinAttackAssembly3: waypoint + Owner: Neutral + Location: 83,29 + SovietRefinery: proc + Location: 66,57 + FreeActor@CHARV: False + FreeActor: False + Faction: germany + Owner: USSR + Health: 37 + SovietSilo2: silo + Location: 68,57 + Faction: germany + Owner: USSR + Health: 30 + SovietSilo1: silo + Location: 66,57 + Faction: germany + Owner: USSR + Health: 20 + SovietPower1: powr + Location: 63,55 + Faction: germany + Owner: USSR + Health: 22 + SovietPower2: powr + Location: 63,58 + Faction: germany + Owner: USSR + Health: 40 + SovietPower3: powr + Owner: USSR + Location: 63,61 + Health: 48 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-coalitions.yaml, ca|missions/main-campaign/ca02-displacement/displacement-rules.yaml, ca|rules/custom/coop-rules.yaml, displacement-coop-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/coop-campaign/ca03-deliverance-coop/deliverance-coop-rules.yaml b/mods/ca/missions/coop-campaign/ca03-deliverance-coop/deliverance-coop-rules.yaml new file mode 100644 index 0000000000..97011118f9 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca03-deliverance-coop/deliverance-coop-rules.yaml @@ -0,0 +1,22 @@ +World: + LuaScript: + Scripts: campaign.lua, coop.lua, ca|missions/main-campaign/ca03-deliverance/deliverance.lua, deliverance-coop.lua + LobbyMissionInfo@InitialObjectives: + Prefix: Initial Objectives + Text: • Find and take control of the GDI base, then defend it until reinforcements arrive.\n• Locate and capture the prison in which the GDI commander is being held. + +PYLE: + CreateProxyActorForAllies: + RequireValidFaction: False + +WEAP.TD: + CreateProxyActorForAllies: + RequireValidFaction: False + +HPAD.TD: + CreateProxyActorForAllies: + RequireValidFaction: False + +HQ: + CreateProxyActorForAllies: + RequireValidFaction: False diff --git a/mods/ca/missions/coop-campaign/ca03-deliverance-coop/deliverance-coop.lua b/mods/ca/missions/coop-campaign/ca03-deliverance-coop/deliverance-coop.lua new file mode 100644 index 0000000000..dd71ea1bde --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca03-deliverance-coop/deliverance-coop.lua @@ -0,0 +1,56 @@ + +SetupPlayers = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Multi2 = Player.GetPlayer("Multi2") + Multi3 = Player.GetPlayer("Multi3") + Multi4 = Player.GetPlayer("Multi4") + Multi5 = Player.GetPlayer("Multi5") + Greece = Player.GetPlayer("Greece") + GDI = Player.GetPlayer("GDI") + USSR = Player.GetPlayer("USSR") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = Utils.Where({ Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 }, function(p) return p ~= nil end) + MissionEnemies = { USSR } + SinglePlayerPlayer = Greece + CoopInit() +end + +AfterWorldLoaded = function() + StartCashSpread(3500) +end + +AfterTick = function() + +end + +TransferGDIUnits = function() + Utils.Do(MissionPlayers, function(p) + p.PlayLowPowerNotification = false + Trigger.AfterDelay(DateTime.Seconds(10), function() + p.PlayLowPowerNotification = true + end) + end) + + local gdiForces = GDI.GetActors() + Utils.Do(gdiForces, function(a) + if a.Type ~= "player" then + a.Owner = Greece + end + end) + + Trigger.AfterDelay(1, function() + TransferBaseToPlayer(SinglePlayerPlayer, GetFirstActivePlayer()) + end) +end + +DoMcvArrival = function() + Reinforcements.Reinforce(Greece, { "2tnk", "2tnk" }, { McvEntry.Location, McvRally.Location }, 75) + local delay = 150 + Utils.Do(GetMcvPlayers(), function(p) + Trigger.AfterDelay(delay, function() + Reinforcements.Reinforce(p, { "mcv" }, { McvEntry.Location, McvRally.Location }) + end) + delay = delay + DateTime.Seconds(1) + end) +end diff --git a/mods/ca/missions/coop-campaign/ca03-deliverance-coop/map.bin b/mods/ca/missions/coop-campaign/ca03-deliverance-coop/map.bin new file mode 100644 index 0000000000..c8ceda0f3c Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca03-deliverance-coop/map.bin differ diff --git a/mods/ca/missions/coop-campaign/ca03-deliverance-coop/map.png b/mods/ca/missions/coop-campaign/ca03-deliverance-coop/map.png new file mode 100644 index 0000000000..1a9537ee4d Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca03-deliverance-coop/map.png differ diff --git a/mods/ca/missions/coop-campaign/ca03-deliverance-coop/map.yaml b/mods/ca/missions/coop-campaign/ca03-deliverance-coop/map.yaml new file mode 100644 index 0000000000..208f374db9 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca03-deliverance-coop/map.yaml @@ -0,0 +1,3779 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 03: Deliverance Co-op + +Author: Darkademic & Gandorques Hikla + +Tileset: WINTER + +MapSize: 130,98 + +Bounds: 1,1,128,96 + +Visibility: Lobby + +Categories: Co-op Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: USSR, Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + PlayerReference@Greece: + Name: Greece + Faction: allies + Color: 99ACF2 + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Creeps + PlayerReference@GDI: + Name: GDI + NonCombatant: True + Faction: gdi + Color: F2CF74 + Enemies: Creeps + PlayerReference@USSR: + Name: USSR + Bot: campaign + Faction: soviet + Color: FE1100 + Enemies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 99ACF2 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Creeps + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 0B7310 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Creeps + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 134691 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Creeps + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 775A12 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Creeps + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 994050 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Creeps + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: EEA8A8 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Creeps + +Actors: + Actor3: sbag + Owner: GDI + Location: 29,50 + Actor4: sbag + Owner: GDI + Location: 30,50 + Actor5: sbag + Owner: GDI + Location: 31,50 + Actor6: sbag + Owner: GDI + Location: 32,50 + Actor7: sbag + Owner: GDI + Location: 32,49 + Actor8: sbag + Owner: GDI + Location: 32,48 + Actor11: sbag + Owner: GDI + Location: 32,43 + Actor12: sbag + Owner: GDI + Location: 32,42 + Actor13: sbag + Owner: GDI + Location: 31,42 + Actor14: sbag + Owner: GDI + Location: 30,42 + Actor15: sbag + Owner: GDI + Location: 29,42 + Actor16: sbag + Owner: GDI + Location: 28,42 + Actor17: sbag + Owner: GDI + Location: 27,42 + Actor18: sbag + Owner: GDI + Location: 25,42 + Actor19: sbag + Owner: GDI + Location: 26,42 + Actor20: sbag + Owner: GDI + Location: 24,42 + Actor24: sbag + Owner: GDI + Location: 17,42 + Actor25: sbag + Owner: GDI + Location: 16,42 + Actor26: sbag + Owner: GDI + Location: 15,42 + Actor27: sbag + Owner: GDI + Location: 14,42 + Actor28: sbag + Owner: GDI + Location: 13,42 + Actor29: sbag + Owner: GDI + Location: 12,42 + Actor30: sbag + Owner: GDI + Location: 12,43 + Actor31: sbag + Owner: GDI + Location: 12,44 + Actor32: sbag + Owner: GDI + Location: 12,45 + Actor33: sbag + Owner: GDI + Location: 12,49 + Actor34: sbag + Owner: GDI + Location: 12,50 + Actor35: sbag + Owner: GDI + Location: 12,51 + Actor36: sbag + Owner: GDI + Location: 12,52 + Actor37: sbag + Owner: GDI + Location: 12,53 + Actor38: sbag + Owner: GDI + Location: 12,54 + Actor39: sbag + Owner: GDI + Location: 12,55 + Actor40: sbag + Owner: GDI + Location: 12,56 + Actor41: sbag + Owner: GDI + Location: 13,56 + Actor42: sbag + Owner: GDI + Location: 15,56 + Actor43: sbag + Owner: GDI + Location: 14,56 + Actor44: sbag + Owner: GDI + Location: 16,56 + Actor45: sbag + Owner: GDI + Location: 17,56 + Actor46: sbag + Owner: GDI + Location: 23,56 + Actor55: sbag + Owner: GDI + Location: 26,59 + Actor56: sbag + Owner: GDI + Location: 25,59 + Actor57: sbag + Owner: GDI + Location: 27,59 + Actor58: sbag + Owner: GDI + Location: 28,59 + Actor60: sbag + Owner: GDI + Location: 30,59 + Actor61: sbag + Owner: GDI + Location: 29,59 + Actor64: sbag + Owner: GDI + Location: 31,59 + Actor65: sbag + Owner: GDI + Location: 31,58 + Actor66: sbag + Owner: GDI + Location: 31,55 + Actor67: sbag + Owner: GDI + Location: 31,54 + Actor59: sbag + Owner: GDI + Location: 24,56 + Actor62: sbag + Owner: GDI + Location: 24,57 + Actor68: sbag + Owner: GDI + Location: 24,58 + Actor69: sbag + Owner: GDI + Location: 25,58 + Actor21: sbag + Owner: GDI + Location: 23,42 + Actor10: sbag + Owner: GDI + Location: 32,44 + Actor63: htnk + Location: 19,44 + Owner: GDI + Facing: 927 + Health: 28 + Actor70: htnk + Location: 29,48 + Owner: GDI + Health: 38 + Facing: 904 + Actor72: gtwr + Owner: GDI + Location: 33,49 + Health: 45 + Actor73: gtwr + Owner: GDI + Location: 33,43 + Health: 84 + Actor74: gtwr + Owner: GDI + Location: 24,41 + Health: 68 + Actor75: gtwr + Owner: GDI + Location: 16,41 + Health: 34 + GDIBarracks: pyle + Owner: GDI + Location: 16,45 + Health: 37 + Actor77: nuk2 + Owner: GDI + Location: 13,53 + Health: 44 + Actor78: nuk2 + Owner: GDI + Location: 15,53 + Health: 44 + GDIRefinery: proc.td + Owner: GDI + Location: 19,50 + FreeActor: False + Health: 39 + GDICommsCenter: hq + Owner: GDI + Location: 14,49 + Health: 44 + GDISilo1: silo.td + Owner: GDI + Location: 26,43 + Health: 41 + GDISilo2: silo.td + Owner: GDI + Location: 29,43 + Health: 44 + GDIFactory: weap.td + Owner: GDI + Location: 24,51 + Health: 41 + GDIRepairFacility: rep + Owner: GDI + Location: 23,46 + Health: 38 + GDIHelipad: hpad.td + Owner: GDI + Location: 27,56 + Health: 48 + Actor85: harv.td + Owner: GDI + Location: 19,53 + Facing: 384 + Health: 74 + Actor86: hmmv + Owner: GDI + Location: 27,45 + Facing: 602 + Actor87: apc2 + Owner: GDI + Location: 24,44 + Facing: 142 + Health: 72 + Actor88: msam + Owner: GDI + Location: 19,48 + Facing: 896 + Health: 45 + Actor89: mtnk + Owner: GDI + Location: 30,49 + Facing: 896 + Health: 44 + Actor90: mtnk + Owner: GDI + Location: 22,44 + Facing: 1023 + Health: 58 + Actor91: n1 + Owner: GDI + SubCell: 3 + Location: 20,45 + Facing: 951 + Actor92: n1 + Owner: GDI + Facing: 384 + Location: 20,45 + SubCell: 1 + Actor93: n1 + Owner: GDI + SubCell: 3 + Location: 17,43 + Facing: 1023 + Actor94: n1 + Owner: GDI + Location: 24,43 + SubCell: 3 + Facing: 222 + Health: 76 + Actor95: n1 + Owner: GDI + SubCell: 3 + Location: 32,45 + Facing: 745 + Actor96: n1 + Owner: GDI + Location: 32,45 + SubCell: 1 + Facing: 888 + Actor97: n1 + Owner: GDI + SubCell: 3 + Location: 31,48 + Facing: 1023 + Actor98: n1 + Owner: GDI + SubCell: 3 + Location: 28,45 + Facing: 911 + Actor99: n1 + Owner: GDI + Facing: 384 + Location: 28,45 + SubCell: 1 + Actor100: n2 + Owner: GDI + SubCell: 3 + Location: 27,48 + Facing: 384 + Health: 86 + Actor101: n2 + Owner: GDI + SubCell: 3 + Location: 20,46 + Health: 75 + Facing: 610 + Actor102: split2 + Owner: Neutral + Location: 13,60 + Actor103: split2 + Owner: Neutral + Location: 7,74 + Actor104: split2 + Owner: Neutral + Location: 6,65 + Actor105: gtwr + Owner: GDI + Location: 16,57 + Actor106: gtwr + Owner: GDI + Location: 32,58 + Health: 87 + Actor109: 2tnk + Owner: Greece + Facing: 0 + Location: 19,90 + Actor136: ifv + Owner: Greece + Location: 17,90 + Facing: 0 + Actor137: ifv + Owner: Greece + Facing: 0 + Location: 21,90 + Actor170: tc02 + Owner: Neutral + Location: 11,85 + Actor171: t16 + Owner: Neutral + Location: 17,79 + Actor172: t03 + Owner: Neutral + Location: 14,90 + Actor173: t05 + Owner: Neutral + Location: 12,86 + Actor174: tc04 + Owner: Neutral + Location: 8,84 + Actor175: t16 + Owner: Neutral + Location: 5,84 + Actor176: tc01 + Owner: Neutral + Location: 4,80 + Actor177: t14 + Owner: Neutral + Location: 5,82 + Actor178: t10 + Owner: Neutral + Location: 16,82 + Actor179: t03 + Owner: Neutral + Location: 19,77 + Actor180: t07 + Owner: Neutral + Location: 24,81 + Actor181: tc05 + Owner: Neutral + Location: 25,85 + Actor198: e1 + Owner: Greece + SubCell: 1 + Facing: 0 + Location: 18,91 + Actor199: e1 + Owner: Greece + SubCell: 2 + Facing: 0 + Location: 18,91 + Actor200: e1 + Owner: Greece + SubCell: 4 + Facing: 0 + Location: 18,91 + Actor202: e1 + Owner: Greece + SubCell: 1 + Facing: 0 + Location: 20,91 + Actor203: e1 + Owner: Greece + SubCell: 2 + Facing: 0 + Location: 20,91 + Actor207: e3 + Owner: Greece + Location: 18,93 + SubCell: 1 + Facing: 0 + Actor208: e3 + Owner: Greece + Location: 18,93 + SubCell: 2 + Facing: 0 + Actor206: e3 + Owner: Greece + SubCell: 1 + Facing: 0 + Location: 20,93 + Actor211: e3 + Owner: Greece + SubCell: 2 + Facing: 0 + Location: 20,93 + PlayerStart: waypoint + Owner: Neutral + Location: 19,90 + Actor217: tc01 + Owner: Neutral + Faction: germany + Location: 42,94 + Actor218: tc04 + Owner: Neutral + Faction: germany + Location: 38,94 + Actor219: tc02 + Owner: Neutral + Faction: germany + Location: 37,73 + Actor220: t10 + Owner: Neutral + Faction: germany + Location: 57,70 + Actor221: t14 + Owner: Neutral + Faction: germany + Location: 57,94 + Actor222: t15 + Owner: Neutral + Faction: germany + Location: 59,87 + Actor223: tc04 + Owner: Neutral + Faction: germany + Location: 46,92 + Actor225: v06 + Owner: Neutral + Location: 39,67 + Actor227: v16 + Owner: Neutral + Location: 41,68 + Actor228: v16 + Owner: Neutral + Location: 40,68 + Actor226: wood + Owner: Neutral + Location: 39,68 + Actor229: wood + Owner: Neutral + Location: 39,69 + Actor230: wood + Owner: Neutral + Location: 40,69 + Actor231: wood + Owner: Neutral + Location: 41,69 + Actor232: wood + Owner: Neutral + Location: 42,69 + Actor233: wood + Owner: Neutral + Location: 42,68 + Actor234: wood + Owner: Neutral + Location: 42,67 + Actor235: wood + Owner: Neutral + Location: 41,67 + Actor236: wood + Owner: Neutral + Location: 39,66 + Actor237: wood + Owner: Neutral + Location: 39,65 + Actor238: wood + Owner: Neutral + Location: 38,65 + Actor239: v07 + Owner: Neutral + Location: 41,71 + Actor240: v03 + Owner: Neutral + Location: 35,69 + Actor241: v11 + Owner: Neutral + Location: 47,61 + Actor242: v02 + Owner: Neutral + Location: 39,62 + Actor243: v05 + Owner: Neutral + Location: 31,64 + Actor244: t03 + Owner: Neutral + Location: 34,68 + Actor245: t10 + Owner: Neutral + Location: 43,64 + Actor246: t08 + Owner: Neutral + Location: 48,61 + Actor247: t01 + Owner: Neutral + Location: 25,64 + SovietSouthSubPen1: spen + Owner: USSR + Location: 104,80 + SovietSouthSubPen2: spen + Owner: USSR + Location: 106,84 + Actor250: brik + Owner: USSR + Location: 100,78 + Actor251: brik + Owner: USSR + Location: 94,77 + Actor252: brik + Owner: USSR + Location: 94,78 + Actor253: brik + Owner: USSR + Location: 95,77 + Actor254: brik + Owner: USSR + Location: 95,78 + Actor255: brik + Owner: USSR + Location: 96,78 + Actor256: brik + Owner: USSR + Location: 97,78 + Actor257: brik + Owner: USSR + Location: 98,78 + Actor258: brik + Owner: USSR + Location: 99,78 + Actor259: brik + Owner: USSR + Location: 101,78 + Actor260: brik + Owner: USSR + Location: 101,77 + Actor261: brik + Owner: USSR + Location: 102,77 + Actor262: brik + Owner: USSR + Location: 103,77 + Actor263: brik + Owner: USSR + Location: 103,76 + Actor264: brik + Owner: USSR + Location: 102,76 + Actor265: brik + Owner: USSR + Location: 88,76 + Actor266: brik + Owner: USSR + Location: 88,75 + Actor267: brik + Owner: USSR + Location: 87,75 + Actor268: brik + Owner: USSR + Location: 87,76 + Actor269: brik + Owner: USSR + Location: 86,76 + Actor270: brik + Owner: USSR + Location: 85,76 + Actor271: brik + Owner: USSR + Location: 85,75 + Actor272: brik + Owner: USSR + Location: 85,74 + Actor273: brik + Owner: USSR + Location: 85,73 + Actor274: brik + Owner: USSR + Location: 85,72 + Actor275: brik + Owner: USSR + Location: 85,70 + Actor276: brik + Owner: USSR + Location: 85,71 + Actor277: brik + Owner: USSR + Location: 85,69 + Actor278: brik + Owner: USSR + Location: 85,68 + Actor279: brik + Owner: USSR + Location: 86,68 + Actor280: brik + Owner: USSR + Location: 86,69 + Actor286: brik + Owner: USSR + Location: 85,60 + Actor287: brik + Owner: USSR + Location: 85,59 + Actor288: brik + Owner: USSR + Location: 85,58 + Actor289: brik + Owner: USSR + Location: 86,58 + Actor290: brik + Owner: USSR + Location: 87,58 + Actor291: brik + Owner: USSR + Location: 88,58 + Actor292: brik + Owner: USSR + Location: 89,58 + Actor305: brik + Owner: USSR + Location: 102,58 + Actor306: brik + Owner: USSR + Location: 110,78 + Actor307: brik + Owner: USSR + Location: 110,77 + Actor308: brik + Owner: USSR + Location: 111,77 + Actor309: brik + Owner: USSR + Location: 111,78 + Actor310: brik + Owner: USSR + Location: 111,76 + Actor311: brik + Owner: USSR + Location: 111,75 + Actor312: brik + Owner: USSR + Location: 111,74 + Actor313: brik + Owner: USSR + Location: 111,73 + Actor314: brik + Owner: USSR + Location: 111,72 + Actor315: brik + Owner: USSR + Location: 110,72 + Actor316: brik + Owner: USSR + Location: 110,73 + Actor317: brik + Owner: USSR + Location: 110,66 + Actor318: brik + Owner: USSR + Location: 110,65 + Actor319: brik + Owner: USSR + Location: 111,65 + Actor320: brik + Owner: USSR + Location: 111,66 + Actor321: brik + Owner: USSR + Location: 111,64 + Actor322: brik + Owner: USSR + Location: 111,63 + Actor323: brik + Owner: USSR + Location: 111,62 + Actor324: brik + Owner: USSR + Location: 111,61 + Actor325: brik + Owner: USSR + Location: 111,60 + Actor326: brik + Owner: USSR + Location: 111,59 + Actor327: brik + Owner: USSR + Location: 104,58 + Actor328: brik + Owner: USSR + Location: 103,58 + Actor329: brik + Owner: USSR + Location: 105,58 + Actor330: brik + Owner: USSR + Location: 107,58 + Actor331: brik + Owner: USSR + Location: 106,58 + Actor332: brik + Owner: USSR + Location: 108,58 + Actor333: brik + Owner: USSR + Location: 109,58 + Actor334: brik + Owner: USSR + Location: 109,58 + Actor335: brik + Owner: USSR + Location: 111,58 + Actor336: brik + Owner: USSR + Location: 110,58 + Actor337: fact + Owner: USSR + Location: 98,74 + Actor340: proc + Owner: USSR + Location: 105,63 + Actor341: proc + Owner: USSR + Location: 105,68 + Actor342: sam + Owner: USSR + Location: 95,75 + Actor343: sam + Owner: USSR + Location: 87,73 + Actor345: sam + Owner: USSR + Location: 79,79 + Actor346: sam + Owner: USSR + Location: 97,84 + Actor347: sam + Owner: USSR + Location: 108,60 + Actor348: sam + Owner: USSR + Location: 108,75 + Actor349: tsla + Owner: USSR + Location: 86,75 + Actor350: tsla + Owner: USSR + Location: 96,77 + Actor351: tsla + Owner: USSR + Location: 86,70 + Actor355: tsla + Owner: USSR + Location: 110,64 + Actor356: tsla + Owner: USSR + Location: 110,74 + Actor344: sam + Owner: USSR + Location: 88,60 + Actor353: brik + Owner: USSR + Location: 90,58 + Actor357: brik + Owner: USSR + Location: 91,58 + Actor358: brik + Owner: USSR + Location: 92,58 + Actor359: brik + Owner: USSR + Location: 93,58 + Actor360: tsla + Owner: USSR + Location: 91,59 + Actor361: brik + Owner: USSR + Location: 92,59 + Actor362: brik + Owner: USSR + Location: 93,59 + Actor369: ftur + Owner: USSR + Location: 93,57 + Actor372: ftur + Owner: USSR + Location: 84,68 + Actor373: ftur + Owner: USSR + Location: 88,77 + Actor374: ftur + Owner: USSR + Location: 93,78 + Actor377: apwr + Owner: USSR + Location: 95,69 + Actor378: apwr + Owner: USSR + Location: 95,66 + Actor379: apwr + Owner: USSR + Location: 95,63 + Actor376: stek + Owner: USSR + Location: 100,70 + Actor375: dome + Owner: USSR + Location: 101,66 + Actor383: fix + Owner: USSR + Location: 104,73 + Actor384: tsla + Owner: USSR + Location: 112,88 + Actor385: sam + Owner: USSR + Location: 114,87 + Actor386: sam + Owner: USSR + Location: 118,30 + Actor390: sam + Owner: USSR + Location: 112,14 + Actor392: tsla + Owner: USSR + Location: 112,12 + Actor398: chain + Owner: USSR + Location: 121,18 + Actor399: chain + Owner: USSR + Location: 122,18 + Actor400: chain + Owner: USSR + Location: 123,18 + Actor401: chain + Owner: USSR + Location: 124,18 + Actor402: chain + Owner: USSR + Location: 125,18 + Actor403: chain + Owner: USSR + Location: 126,18 + Actor404: chain + Owner: USSR + Location: 127,18 + Actor406: chain + Owner: USSR + Location: 121,19 + Actor407: chain + Owner: USSR + Location: 127,19 + SovietPrison: miss + Owner: USSR + Location: 123,20 + Actor410: chain + Owner: USSR + Location: 127,20 + Actor411: chain + Owner: USSR + Location: 127,21 + Actor412: chain + Owner: USSR + Location: 127,22 + Actor414: chain + Owner: USSR + Location: 121,23 + Actor415: chain + Owner: USSR + Location: 127,23 + Actor421: chain + Owner: USSR + Location: 121,24 + Actor422: chain + Owner: USSR + Location: 122,24 + Actor423: chain + Owner: USSR + Location: 123,24 + Actor424: chain + Owner: USSR + Location: 124,24 + Actor425: chain + Owner: USSR + Location: 125,24 + Actor426: chain + Owner: USSR + Location: 126,24 + Actor427: chain + Owner: USSR + Location: 127,24 + SovietNorthSubPen: spen + Owner: USSR + Location: 124,8 + Actor363: ftur + Owner: USSR + Location: 97,57 + Actor364: brik + Owner: USSR + Location: 97,58 + Actor365: brik + Owner: USSR + Location: 98,58 + Actor366: brik + Owner: USSR + Location: 99,58 + Actor367: brik + Owner: USSR + Location: 100,58 + Actor368: brik + Owner: USSR + Location: 101,58 + Actor370: brik + Owner: USSR + Location: 97,59 + Actor435: brik + Owner: USSR + Location: 98,59 + Actor436: tsla + Owner: USSR + Location: 99,59 + Actor380: apwr + Owner: USSR + Location: 104,59 + Actor381: apwr + Owner: USSR + Location: 101,59 + SovietMainBarracks2: barr + Owner: USSR + Location: 100,62 + Actor371: brik + Owner: USSR + Location: 85,61 + Actor438: brik + Owner: USSR + Location: 85,62 + Actor439: tsla + Owner: USSR + Location: 86,62 + Actor440: brik + Owner: USSR + Location: 85,63 + Actor441: brik + Owner: USSR + Location: 86,63 + Actor442: ftur + Owner: USSR + Location: 84,64 + Actor443: brik + Owner: USSR + Location: 85,64 + Actor444: brik + Owner: USSR + Location: 86,64 + Actor445: brik + Owner: USSR + Location: 93,38 + Actor446: brik + Owner: USSR + Location: 97,38 + Actor447: brik + Owner: USSR + Location: 97,37 + Actor448: brik + Owner: USSR + Location: 93,37 + Actor449: brik + Owner: USSR + Location: 92,38 + Actor450: brik + Owner: USSR + Location: 92,37 + Actor451: brik + Owner: USSR + Location: 98,37 + Actor452: brik + Owner: USSR + Location: 98,38 + Actor453: brik + Owner: USSR + Location: 99,38 + Actor454: brik + Owner: USSR + Location: 100,38 + Actor455: brik + Owner: USSR + Location: 101,38 + Actor456: brik + Owner: USSR + Location: 102,38 + Actor457: brik + Owner: USSR + Location: 102,37 + Actor475: brik + Owner: USSR + Location: 91,38 + Actor476: brik + Owner: USSR + Location: 89,38 + Actor477: brik + Owner: USSR + Location: 90,38 + Actor478: brik + Owner: USSR + Location: 88,38 + Actor479: brik + Owner: USSR + Location: 87,38 + Actor480: brik + Owner: USSR + Location: 86,38 + Actor481: brik + Owner: USSR + Location: 86,37 + Actor482: brik + Owner: USSR + Location: 86,36 + Actor464: brik + Owner: USSR + Location: 86,35 + Actor465: brik + Owner: USSR + Location: 86,34 + Actor466: brik + Owner: USSR + Location: 86,33 + Actor467: brik + Owner: USSR + Location: 86,32 + Actor468: brik + Owner: USSR + Location: 87,32 + Actor469: brik + Owner: USSR + Location: 87,33 + Actor470: brik + Owner: USSR + Location: 86,28 + Actor471: brik + Owner: USSR + Location: 87,28 + Actor472: brik + Owner: USSR + Location: 86,27 + Actor473: brik + Owner: USSR + Location: 87,27 + Actor474: brik + Owner: USSR + Location: 86,26 + Actor485: brik + Owner: USSR + Location: 86,25 + Actor486: brik + Owner: USSR + Location: 87,25 + Actor487: brik + Owner: USSR + Location: 88,25 + Actor488: brik + Owner: USSR + Location: 89,25 + Actor489: brik + Owner: USSR + Location: 90,25 + Actor490: brik + Owner: USSR + Location: 91,25 + Actor491: brik + Owner: USSR + Location: 92,25 + Actor492: brik + Owner: USSR + Location: 92,26 + Actor493: brik + Owner: USSR + Location: 91,26 + Actor495: apwr + Owner: USSR + Location: 88,26 + Actor496: apwr + Owner: USSR + Location: 91,28 + Actor497: apwr + Owner: USSR + Location: 94,31 + Actor501: ftur + Owner: USSR + Location: 85,28 + Actor502: ftur + Owner: USSR + Location: 85,32 + Actor503: ftur + Owner: USSR + Location: 93,39 + Actor504: ftur + Owner: USSR + Location: 97,39 + SovietEastBarracks: barr + Owner: USSR + Location: 89,33 + Actor508: mine + Owner: Neutral + Faction: russia + Location: 102,53 + Actor509: mine + Owner: Neutral + Faction: russia + Location: 104,48 + Actor510: mine + Owner: Neutral + Faction: russia + Location: 100,43 + Actor511: mine + Owner: Neutral + Faction: russia + Location: 110,52 + Actor512: ftur + Owner: USSR + Location: 112,66 + Actor513: ftur + Owner: USSR + Location: 112,72 + Actor515: sam + Owner: USSR + Location: 123,13 + Actor517: brik + Owner: USSR + Location: 42,15 + Actor518: brik + Owner: USSR + Location: 42,14 + Actor519: brik + Owner: USSR + Location: 41,14 + Actor520: brik + Owner: USSR + Location: 41,15 + Actor521: brik + Owner: USSR + Location: 46,14 + Actor522: brik + Owner: USSR + Location: 46,15 + Actor523: brik + Owner: USSR + Location: 47,15 + Actor524: brik + Owner: USSR + Location: 47,14 + Actor525: brik + Owner: USSR + Location: 48,15 + Actor526: brik + Owner: USSR + Location: 49,15 + Actor527: brik + Owner: USSR + Location: 50,15 + Actor528: brik + Owner: USSR + Location: 51,15 + Actor529: brik + Owner: USSR + Location: 52,15 + Actor530: brik + Owner: USSR + Location: 40,15 + Actor531: brik + Owner: USSR + Location: 39,15 + Actor532: brik + Owner: USSR + Location: 38,15 + Actor533: brik + Owner: USSR + Location: 37,15 + Actor534: brik + Owner: USSR + Location: 36,15 + Actor535: brik + Owner: USSR + Location: 36,14 + Actor536: brik + Owner: USSR + Location: 36,12 + Actor537: brik + Owner: USSR + Location: 36,13 + Actor538: brik + Owner: USSR + Location: 36,10 + Actor539: brik + Owner: USSR + Location: 36,11 + Actor540: brik + Owner: USSR + Location: 36,9 + Actor541: brik + Owner: USSR + Location: 36,8 + Actor542: brik + Owner: USSR + Location: 36,7 + Actor543: brik + Owner: USSR + Location: 36,6 + Actor544: brik + Owner: USSR + Location: 36,5 + Actor545: brik + Owner: USSR + Location: 36,4 + Actor546: brik + Owner: USSR + Location: 36,3 + Actor547: brik + Owner: USSR + Location: 36,2 + Actor548: brik + Owner: USSR + Location: 36,1 + Actor549: brik + Owner: USSR + Location: 37,1 + Actor550: brik + Owner: USSR + Location: 39,1 + Actor551: brik + Owner: USSR + Location: 38,1 + Actor552: brik + Owner: USSR + Location: 40,1 + Actor553: brik + Owner: USSR + Location: 41,1 + Actor554: brik + Owner: USSR + Location: 42,1 + Actor555: brik + Owner: USSR + Location: 43,1 + Actor556: brik + Owner: USSR + Location: 44,1 + Actor557: brik + Owner: USSR + Location: 45,1 + Actor558: brik + Owner: USSR + Location: 46,1 + Actor559: brik + Owner: USSR + Location: 53,15 + Actor560: brik + Owner: USSR + Location: 53,14 + Actor561: brik + Owner: USSR + Location: 53,12 + Actor562: brik + Owner: USSR + Location: 53,13 + Actor563: brik + Owner: USSR + Location: 53,11 + Actor564: brik + Owner: USSR + Location: 53,10 + Actor565: brik + Owner: USSR + Location: 52,10 + Actor566: brik + Owner: USSR + Location: 52,11 + Actor567: brik + Owner: USSR + Location: 52,6 + Actor568: brik + Owner: USSR + Location: 53,6 + Actor569: brik + Owner: USSR + Location: 52,5 + Actor570: brik + Owner: USSR + Location: 53,5 + Actor571: brik + Owner: USSR + Location: 53,4 + Actor572: brik + Owner: USSR + Location: 53,3 + Actor573: brik + Owner: USSR + Location: 53,2 + Actor574: brik + Owner: USSR + Location: 53,1 + Actor575: brik + Owner: USSR + Location: 52,1 + Actor576: brik + Owner: USSR + Location: 51,1 + Actor577: brik + Owner: USSR + Location: 50,1 + Actor578: brik + Owner: USSR + Location: 49,1 + Actor579: brik + Owner: USSR + Location: 48,1 + Actor580: brik + Owner: USSR + Location: 47,1 + Actor581: apwr + Owner: USSR + Location: 50,2 + Actor582: apwr + Owner: USSR + Location: 47,2 + Actor583: apwr + Owner: USSR + Location: 44,2 + HardOnlyTeslaCoil1: tsla + Owner: USSR + Location: 40,14 + HardOnlyTeslaCoil2: tsla + Owner: USSR + Location: 48,14 + HardOnlyTeslaCoil3: tsla + Owner: USSR + Location: 52,12 + Actor589: ftur + Owner: USSR + Location: 42,16 + Actor590: ftur + Owner: USSR + Location: 46,16 + Actor591: ftur + Owner: USSR + Location: 54,10 + Actor592: ftur + Owner: USSR + Location: 54,6 + Actor593: sam + Owner: USSR + Location: 51,14 + Actor594: sam + Owner: USSR + Location: 37,14 + Actor595: proc + Owner: USSR + Location: 47,6 + Actor596: silo + Owner: USSR + Location: 49,6 + Actor597: silo + Owner: USSR + Location: 47,6 + Actor598: silo + Owner: USSR + Location: 107,68 + Actor599: silo + Owner: USSR + Location: 105,68 + Actor600: silo + Owner: USSR + Location: 105,63 + Actor601: silo + Owner: USSR + Location: 107,63 + Actor602: apwr + Owner: USSR + Location: 41,2 + SovietNorthFactory: weap + Owner: USSR + Location: 37,2 + SovietNorthBarracks1: barr + Owner: USSR + Location: 38,8 + SovietNorthBarracks2: barr + Owner: USSR + Location: 41,7 + Actor603: kenn + Owner: USSR + Location: 44,7 + Actor606: sam + Owner: USSR + Location: 89,37 + NorthSAM2: sam + Owner: USSR + Location: 32,9 + NorthSAM1: sam + Owner: USSR + Location: 32,4 + Actor609: tc01 + Owner: Neutral + Location: 32,7 + Actor610: t15 + Owner: Neutral + Location: 32,2 + Actor611: tc04 + Owner: Neutral + Location: 29,12 + Actor612: tc05 + Owner: Neutral + Location: 29,3 + Actor613: t15 + Owner: Neutral + Location: 31,5 + Actor614: t11 + Owner: Neutral + Location: 31,9 + Actor615: t02 + Owner: Neutral + Location: 30,10 + Actor616: t08 + Owner: Neutral + Location: 30,7 + Actor617: t17 + Owner: Neutral + Location: 31,14 + Actor618: t12 + Owner: Neutral + Location: 29,1 + Actor619: t07 + Owner: Neutral + Location: 33,11 + Actor620: t07 + Owner: Neutral + Location: 34,17 + Actor621: mine + Owner: Neutral + Location: 59,11 + Actor622: mine + Owner: Neutral + Location: 62,5 + Actor623: tc04 + Owner: Neutral + Location: 56,25 + Actor624: tc05 + Owner: Neutral + Location: 52,30 + Actor625: tc01 + Owner: Neutral + Location: 59,32 + Actor626: t15 + Owner: Neutral + Location: 65,28 + Actor627: t07 + Owner: Neutral + Location: 63,21 + Actor628: t15 + Owner: Neutral + Location: 61,20 + Actor629: tc02 + Owner: Neutral + Location: 64,33 + Actor630: tc03 + Owner: Neutral + Location: 60,33 + Actor631: t17 + Owner: Neutral + Location: 54,33 + Actor632: t14 + Owner: Neutral + Location: 48,29 + Actor633: t17 + Owner: Neutral + Location: 59,25 + Actor634: t12 + Owner: Neutral + Location: 66,24 + Actor635: t10 + Owner: Neutral + Location: 41,24 + Actor636: t16 + Owner: Neutral + Location: 37,28 + Actor637: t16 + Owner: Neutral + Location: 51,25 + Actor638: tc03 + Owner: Neutral + Location: 51,21 + Actor639: t15 + Owner: Neutral + Location: 28,20 + Actor640: t16 + Owner: Neutral + Location: 77,37 + Actor641: t07 + Owner: Neutral + Location: 77,22 + Actor643: t02 + Owner: Neutral + Location: 50,55 + Actor644: t16 + Owner: Neutral + Location: 14,18 + Actor645: tc05 + Owner: Neutral + Location: 9,19 + Actor646: t14 + Owner: Neutral + Location: 11,21 + Actor647: t10 + Owner: Neutral + Location: 15,17 + Actor648: tc02 + Owner: Neutral + Location: 78,42 + Actor649: t14 + Owner: Neutral + Location: 82,54 + Actor651: t14 + Owner: Neutral + Location: 83,50 + Actor650: t11 + Owner: Neutral + Location: 81,49 + Actor652: tc02 + Owner: Neutral + Location: 81,48 + Actor653: tc02 + Owner: Neutral + Location: 78,74 + Actor654: t10 + Owner: Neutral + Location: 82,79 + Actor655: tc05 + Owner: Neutral + Location: 114,83 + Actor656: t12 + Owner: Neutral + Location: 116,79 + Actor657: t12 + Owner: Neutral + Location: 115,62 + Actor658: t08 + Owner: Neutral + Location: 116,61 + Actor659: t10 + Owner: Neutral + Location: 92,44 + Actor660: t16 + Owner: Neutral + Location: 93,50 + Actor661: t07 + Owner: Neutral + Location: 85,36 + Actor662: t12 + Owner: Neutral + Location: 87,41 + Actor663: tsla + Owner: USSR + Location: 121,42 + Actor664: tc02 + Owner: Neutral + Location: 121,40 + Actor666: mine + Owner: Neutral + Location: 31,92 + Actor667: mine + Owner: Neutral + Location: 41,89 + Actor672: fenc + Owner: USSR + Location: 89,13 + Actor673: fenc + Owner: USSR + Location: 90,13 + Actor674: fenc + Owner: USSR + Location: 91,13 + Actor675: v01 + Owner: Neutral + Location: 94,6 + Actor676: v07 + Owner: Neutral + Location: 87,6 + Actor677: v03 + Owner: Neutral + Location: 91,3 + Actor678: v05 + Owner: Neutral + Location: 84,3 + Actor679: v02 + Owner: Neutral + Location: 83,14 + Actor680: v04 + Owner: Neutral + Location: 84,19 + Actor681: v17 + Owner: Neutral + Location: 84,13 + Actor682: v17 + Owner: Neutral + Location: 83,13 + Actor683: v18 + Owner: Neutral + Location: 85,6 + Actor684: v18 + Owner: Neutral + Location: 84,6 + Actor685: t03 + Owner: Neutral + Location: 85,1 + Actor686: t11 + Owner: Neutral + Location: 78,11 + Actor687: t05 + Owner: Neutral + Location: 70,14 + Actor688: t11 + Owner: Neutral + Location: 88,20 + Actor689: wood + Owner: Neutral + Location: 82,14 + Actor690: wood + Owner: Neutral + Location: 82,15 + Actor691: wood + Owner: Neutral + Location: 82,16 + Actor692: wood + Owner: Neutral + Location: 83,16 + Actor693: wood + Owner: Neutral + Location: 92,5 + Actor694: wood + Owner: Neutral + Location: 93,5 + Actor695: wood + Owner: Neutral + Location: 93,4 + Actor696: wood + Owner: Neutral + Location: 93,3 + Actor697: wood + Owner: Neutral + Location: 93,2 + Actor698: wood + Owner: Neutral + Location: 92,2 + Actor699: wood + Owner: Neutral + Location: 83,5 + Actor700: wood + Owner: Neutral + Location: 83,6 + Actor701: wood + Owner: Neutral + Location: 83,7 + Actor702: wood + Owner: Neutral + Location: 84,5 + Actor703: wood + Owner: Neutral + Location: 85,5 + Actor704: wood + Owner: Neutral + Location: 86,5 + Actor705: wood + Owner: Neutral + Location: 86,6 + Actor706: wood + Owner: Neutral + Location: 83,12 + Actor707: wood + Owner: Neutral + Location: 84,12 + Actor708: wood + Owner: Neutral + Location: 82,12 + Actor668: fenc + Owner: USSR + Location: 58,36 + Actor669: fenc + Owner: USSR + Location: 58,37 + Actor670: fenc + Owner: USSR + Location: 58,38 + Actor671: fenc + Owner: USSR + Location: 58,39 + Actor709: fenc + Owner: USSR + Location: 58,48 + Actor710: fenc + Owner: USSR + Location: 58,47 + Actor711: fenc + Owner: USSR + Location: 58,46 + Actor712: fenc + Owner: USSR + Location: 58,45 + Actor713: ftur + Owner: USSR + Location: 57,46 + Actor714: ftur + Owner: USSR + Location: 57,38 + HardOnlyKatyusha2: katy + Owner: USSR + Location: 60,46 + Facing: 253 + HardOnlyKatyusha1: katy + Owner: USSR + Location: 60,37 + Facing: 253 + Actor718: btr.ai + Owner: USSR + Location: 61,42 + Facing: 261 + Actor719: btr.ai + Owner: USSR + Facing: 384 + Location: 45,11 + Actor720: btr.ai + Owner: USSR + Facing: 384 + Location: 89,62 + Actor721: btr.ai + Owner: USSR + Location: 115,74 + Facing: 650 + Actor724: btr.ai + Owner: USSR + Facing: 384 + Location: 79,68 + Actor726: 3tnk + Owner: USSR + Facing: 384 + Location: 82,71 + Actor727: 3tnk + Owner: USSR + Location: 77,57 + Facing: 103 + Actor728: 3tnk + Owner: USSR + Location: 83,45 + Facing: 253 + Actor729: 3tnk + Owner: USSR + Facing: 253 + Location: 82,30 + Actor730: 3tnk + Owner: USSR + Facing: 384 + Location: 88,10 + Actor732: btr.ai + Owner: USSR + Facing: 384 + Location: 60,80 + Actor733: 3tnk + Owner: USSR + Facing: 384 + Location: 59,78 + Actor731: 3tnk + Owner: USSR + Location: 114,17 + Facing: 1023 + Actor736: ttra + Owner: USSR + Facing: 384 + Location: 47,12 + Actor737: v2rl + Owner: USSR + Location: 49,14 + Facing: 467 + SovietV24: v2rl + Owner: USSR + Location: 39,14 + Facing: 491 + Actor739: v2rl + Owner: USSR + Location: 86,59 + Facing: 111 + SovietV23: v2rl + Owner: USSR + Location: 86,71 + Facing: 317 + Actor741: v2rl + Owner: USSR + Location: 100,59 + Facing: 0 + Actor742: ss + Owner: USSR + Facing: 384 + Location: 122,87 + HardOnlySub4: ss + Owner: USSR + Location: 124,89 + Facing: 384 + Actor745: ss + Owner: USSR + Location: 111,92 + Facing: 277 + Actor748: ss + Owner: USSR + Location: 86,92 + Facing: 198 + Actor749: ss + Owner: USSR + Location: 81,86 + Facing: 190 + Actor751: seas + Owner: USSR + Facing: 384 + Location: 101,88 + Actor752: seas + Owner: USSR + Facing: 384 + Location: 104,91 + Actor753: seas + Owner: USSR + Location: 84,89 + Facing: 214 + Actor757: ss + Owner: USSR + Location: 123,69 + Facing: 507 + HardOnlySub3: ss + Owner: USSR + Location: 126,73 + Facing: 384 + Actor761: ss + Owner: USSR + Location: 120,47 + Facing: 563 + Actor763: ss + Owner: USSR + Location: 123,49 + Facing: 539 + HardOnlySub1: ss + Owner: USSR + Location: 109,34 + Facing: 578 + Actor773: ss + Owner: USSR + Facing: 384 + Location: 122,35 + HardOnlySub2: ss + Owner: USSR + Location: 125,36 + Facing: 384 + Actor775: seas + Owner: USSR + Facing: 384 + Location: 116,35 + Actor778: seas + Owner: USSR + Location: 125,67 + Facing: 459 + Actor779: seas + Owner: USSR + Facing: 384 + Location: 126,80 + Actor781: v2rl + Owner: USSR + Facing: 317 + Location: 87,34 + Actor782: split2 + Owner: USSR + Location: 20,15 + Actor783: split2 + Owner: USSR + Location: 6,16 + Actor784: tc04 + Owner: Neutral + Location: 19,4 + Actor785: tc01 + Owner: Neutral + Location: 18,1 + Actor786: tc02 + Owner: Neutral + Location: 24,1 + Actor787: t15 + Owner: Neutral + Location: 24,0 + Actor788: t14 + Owner: Neutral + Location: 25,7 + Actor789: tc05 + Owner: Neutral + Location: 24,4 + Actor790: tc03 + Owner: Neutral + Location: 13,4 + Actor791: t15 + Owner: Neutral + Location: 11,1 + Actor792: t17 + Owner: Neutral + Location: 16,0 + Actor793: t15 + Owner: Neutral + Location: 10,8 + Actor794: tc01 + Owner: Neutral + Location: 72,48 + Actor795: tc04 + Owner: Neutral + Location: 4,52 + Actor796: t07 + Owner: Neutral + Location: 5,42 + Actor797: t11 + Owner: Neutral + Location: 8,39 + Actor798: tc04 + Owner: Neutral + Location: 8,31 + Actor799: tc05 + Owner: Neutral + Location: 3,28 + Actor800: t15 + Owner: Neutral + Location: 3,32 + Actor801: t07 + Owner: Neutral + Location: 6,33 + Actor802: t12 + Owner: Neutral + Location: 3,24 + Actor803: tc03 + Owner: Neutral + Location: 1,32 + Actor804: t14 + Owner: Neutral + Location: 5,31 + Actor805: t16 + Owner: Neutral + Location: 2,26 + Actor806: tc01 + Owner: Neutral + Location: 1,23 + Actor808: t11 + Owner: Neutral + Location: 39,50 + Actor811: tc01 + Owner: Neutral + Location: 70,31 + Actor812: t15 + Owner: Neutral + Location: 71,29 + Actor813: tc03 + Owner: Neutral + Location: 61,48 + Actor810: t12 + Owner: Neutral + Location: 34,24 + Actor816: tc01 + Owner: Neutral + Location: 19,28 + Actor817: tc03 + Owner: Neutral + Location: 20,30 + Actor818: t17 + Owner: Neutral + Location: 19,29 + Actor819: tc01 + Owner: Neutral + Location: 33,50 + Actor820: t07 + Owner: Neutral + Location: 38,46 + Actor821: t10 + Owner: Neutral + Location: 40,55 + Actor822: t16 + Owner: Neutral + Location: 57,63 + Actor824: t15 + Owner: Neutral + Location: 51,82 + Actor823: t12 + Owner: Neutral + Location: 50,76 + Actor825: t17 + Owner: Neutral + Location: 29,82 + Actor826: t13 + Owner: Neutral + Location: 15,72 + Actor827: t11 + Owner: Neutral + Location: 3,60 + Actor828: tc04 + Owner: Neutral + Location: 74,17 + Actor829: t15 + Owner: Neutral + Location: 72,18 + Actor830: t14 + Owner: Neutral + Location: 74,15 + Actor831: t07 + Owner: Neutral + Location: 56,17 + Actor832: t01 + Owner: Neutral + Location: 69,3 + Actor835: t08 + Owner: Neutral + Location: 2,8 + Actor834: t11 + Owner: Neutral + Location: 6,5 + Actor836: t01 + Owner: Neutral + Location: 5,4 + Actor814: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 89,78 + Actor815: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 87,77 + Actor833: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 95,82 + Actor837: e1 + Owner: USSR + SubCell: 3 + Location: 96,81 + Facing: 384 + Actor838: e3 + Owner: USSR + Facing: 384 + Location: 96,81 + SubCell: 1 + Actor839: e3 + Owner: USSR + Facing: 384 + Location: 87,77 + SubCell: 1 + Actor840: e3 + Owner: USSR + Location: 95,74 + SubCell: 3 + Facing: 594 + Actor841: e3 + Owner: USSR + Facing: 384 + Location: 102,64 + SubCell: 3 + Actor843: dog + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 45,8 + Actor844: e1 + Owner: USSR + SubCell: 3 + Location: 42,17 + Facing: 531 + Actor845: e1 + Owner: USSR + Facing: 384 + Location: 42,17 + SubCell: 1 + Actor846: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 47,16 + Actor847: e1 + Owner: USSR + SubCell: 3 + Location: 40,16 + Facing: 594 + Actor848: e4 + Owner: USSR + Location: 48,16 + SubCell: 3 + Facing: 384 + Actor849: e3 + Owner: USSR + Facing: 384 + Location: 40,16 + SubCell: 1 + Actor850: e3 + Owner: USSR + Location: 48,11 + SubCell: 3 + Facing: 610 + Actor851: e1 + Owner: USSR + Facing: 384 + Location: 48,11 + SubCell: 1 + Actor852: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 50,12 + Actor853: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 55,14 + Actor854: e1 + Owner: USSR + Location: 54,14 + SubCell: 3 + Facing: 467 + Actor855: e1 + Owner: USSR + Location: 54,14 + SubCell: 1 + Facing: 618 + Actor856: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 55,12 + SovietCenterPatroller2: e1 + Owner: USSR + SubCell: 3 + Location: 36,28 + Facing: 658 + SovietCenterPatroller3: e1 + Owner: USSR + Location: 36,28 + SubCell: 1 + Facing: 384 + SovietCenterPatroller1: e2 + Owner: USSR + SubCell: 3 + Location: 37,27 + Facing: 499 + SovietCenterPatroller4: e2 + Owner: USSR + Location: 35,28 + SubCell: 3 + Facing: 384 + Actor861: e1 + Owner: USSR + SubCell: 3 + Location: 59,45 + Facing: 384 + Actor862: e1 + Owner: USSR + Location: 59,45 + SubCell: 1 + Facing: 95 + Actor863: e1 + Owner: USSR + SubCell: 3 + Location: 56,37 + Facing: 222 + Actor864: e1 + Owner: USSR + Facing: 384 + Location: 56,37 + SubCell: 1 + Actor865: e1 + Owner: USSR + Facing: 384 + Location: 56,38 + SubCell: 3 + Actor866: e1 + Owner: USSR + Location: 57,36 + SubCell: 3 + Facing: 134 + Actor867: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 56,47 + Actor868: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 56,46 + Actor869: e2 + Owner: USSR + Facing: 384 + Location: 56,46 + SubCell: 1 + Actor870: e2 + Owner: USSR + SubCell: 3 + Location: 60,48 + Facing: 384 + Actor871: e3 + Owner: USSR + SubCell: 3 + Location: 61,37 + Facing: 253 + Actor872: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 59,35 + Actor873: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 57,48 + Actor874: e1 + Owner: USSR + SubCell: 3 + Location: 83,44 + Facing: 245 + Actor875: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 84,46 + Actor876: e1 + Owner: USSR + Location: 84,45 + SubCell: 3 + Facing: 206 + Actor877: e2 + Owner: USSR + Facing: 384 + Location: 84,45 + SubCell: 1 + Actor878: e4 + Owner: USSR + SubCell: 3 + Location: 81,46 + Facing: 198 + Actor879: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 85,34 + Actor881: e3 + Owner: USSR + Location: 117,19 + SubCell: 3 + Facing: 325 + Actor884: e1 + Owner: USSR + SubCell: 3 + Location: 114,16 + Facing: 384 + Actor885: e1 + Owner: USSR + Location: 114,16 + SubCell: 1 + Facing: 1023 + Actor886: e1 + Owner: USSR + SubCell: 3 + Location: 117,15 + Facing: 0 + Actor887: e1 + Owner: USSR + SubCell: 3 + Location: 113,20 + Facing: 214 + Actor888: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 114,23 + Actor889: e1 + Owner: USSR + SubCell: 3 + Location: 116,25 + Facing: 229 + Actor891: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 120,28 + Actor892: e1 + Owner: USSR + SubCell: 3 + Location: 111,21 + Facing: 261 + Actor893: e4 + Owner: USSR + SubCell: 3 + Location: 121,14 + Facing: 182 + Actor894: e3 + Owner: USSR + SubCell: 3 + Location: 116,16 + Facing: 0 + Actor895: e2 + Owner: USSR + Location: 113,16 + SubCell: 3 + Facing: 166 + Actor896: e2 + Owner: USSR + Facing: 384 + Location: 90,14 + SubCell: 3 + Actor897: e1 + Owner: USSR + Facing: 384 + Location: 89,14 + SubCell: 3 + Actor898: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 91,15 + Actor899: e1 + Owner: USSR + Facing: 384 + Location: 91,15 + SubCell: 1 + Actor900: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 85,16 + Actor901: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 81,13 + Actor902: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 84,27 + Actor903: e1 + Owner: USSR + Facing: 384 + Location: 84,27 + SubCell: 1 + Actor904: e1 + Owner: USSR + Facing: 384 + Location: 85,26 + SubCell: 3 + Actor905: e1 + Owner: USSR + SubCell: 3 + Location: 84,28 + Facing: 190 + Actor906: e1 + Owner: USSR + Location: 84,34 + SubCell: 1 + Facing: 253 + Actor880: e4 + Owner: USSR + SubCell: 3 + Location: 81,30 + Facing: 384 + Actor907: e4 + Owner: USSR + SubCell: 3 + Location: 82,31 + Facing: 253 + Actor908: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 79,69 + Actor909: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 78,67 + Actor910: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 80,69 + Actor911: e1 + Owner: USSR + Facing: 384 + Location: 80,69 + SubCell: 1 + Actor912: e1 + Owner: USSR + Facing: 384 + Location: 83,71 + SubCell: 3 + Actor913: e1 + Owner: USSR + Facing: 384 + Location: 82,72 + SubCell: 3 + Actor914: e1 + Owner: USSR + SubCell: 3 + Location: 77,58 + Facing: 150 + Actor915: e1 + Owner: USSR + SubCell: 3 + Location: 76,57 + Facing: 0 + Actor916: e1 + Owner: USSR + SubCell: 3 + Location: 79,57 + Facing: 182 + Actor917: e1 + Owner: USSR + Location: 79,56 + SubCell: 3 + Facing: 182 + Actor918: e1 + Owner: USSR + Facing: 384 + Location: 94,51 + SubCell: 3 + Actor919: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 93,53 + Actor920: e1 + Owner: USSR + Facing: 384 + Location: 94,51 + SubCell: 1 + Actor921: e3 + Owner: USSR + Facing: 384 + Location: 94,51 + SubCell: 2 + Actor922: e3 + Owner: USSR + Location: 79,57 + SubCell: 1 + Facing: 206 + Actor923: e3 + Owner: USSR + Facing: 384 + Location: 80,69 + SubCell: 2 + Actor924: e3 + Owner: USSR + Location: 84,45 + SubCell: 2 + Facing: 150 + SovietMammoth3: 4tnk + Owner: USSR + Facing: 0 + Location: 95,52 + Actor927: 4tnk + Owner: USSR + Facing: 0 + Location: 95,49 + Actor925: 4tnk + Owner: USSR + Facing: 0 + Location: 80,63 + Actor928: ttra + Owner: USSR + Location: 92,71 + Facing: 245 + Actor929: ttnk + Owner: USSR + Location: 98,56 + Facing: 95 + Actor930: dog + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 115,75 + Actor931: e1 + Owner: USSR + SubCell: 3 + Location: 116,73 + Facing: 578 + Actor932: e1 + Owner: USSR + Facing: 384 + Location: 116,73 + SubCell: 1 + Actor933: e1 + Owner: USSR + SubCell: 3 + Location: 116,76 + Facing: 777 + Actor934: e1 + Owner: USSR + SubCell: 3 + Location: 114,76 + Facing: 658 + Actor935: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 116,65 + Actor936: e1 + Owner: USSR + SubCell: 3 + Location: 116,67 + Facing: 610 + Actor937: e4 + Owner: USSR + Facing: 384 + Location: 116,67 + SubCell: 1 + Actor938: e2 + Owner: USSR + SubCell: 3 + Location: 116,75 + Facing: 650 + Actor939: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 113,66 + Actor940: e3 + Owner: USSR + Facing: 384 + Location: 114,76 + SubCell: 1 + Actor941: e3 + Owner: USSR + SubCell: 3 + Location: 109,64 + Facing: 384 + Actor943: shok + Owner: USSR + Facing: 384 + Location: 102,64 + SubCell: 1 + Actor944: shok + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 90,59 + Actor945: shok + Owner: USSR + SubCell: 3 + Location: 97,56 + Facing: 103 + Actor946: shok + Owner: USSR + SubCell: 3 + Location: 98,55 + Facing: 142 + Actor947: shok + Owner: USSR + SubCell: 3 + Location: 81,62 + Facing: 0 + Actor948: shok + Owner: USSR + SubCell: 3 + Location: 79,62 + Facing: 0 + Actor949: shok + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 96,51 + Actor954: powr + Owner: USSR + Location: 122,29 + Actor955: fenc + Owner: USSR + Location: 16,19 + Actor956: fenc + Owner: USSR + Location: 16,19 + Actor957: fenc + Owner: USSR + Location: 17,19 + Actor958: fenc + Owner: USSR + Location: 18,19 + Actor959: fenc + Owner: USSR + Location: 22,19 + Actor960: fenc + Owner: USSR + Location: 23,19 + Actor961: fenc + Owner: USSR + Location: 24,19 + Actor962: fenc + Owner: USSR + Location: 25,18 + Actor963: fenc + Owner: USSR + Location: 25,19 + Actor964: fenc + Owner: USSR + Location: 8,21 + Actor965: fenc + Owner: USSR + Location: 7,21 + Actor966: fenc + Owner: USSR + Location: 9,21 + Actor967: fenc + Owner: USSR + Location: 9,22 + Actor968: fenc + Owner: USSR + Location: 7,20 + Actor969: fenc + Owner: USSR + Location: 6,20 + Actor970: fenc + Owner: USSR + Location: 5,20 + Actor971: fenc + Owner: USSR + Location: 21,19 + Actor972: 3tnk + Owner: USSR + Facing: 384 + Location: 21,18 + Actor973: 3tnk + Owner: USSR + Location: 8,19 + Facing: 626 + Actor974: btr.ai + Owner: USSR + Location: 13,20 + Facing: 610 + Actor975: e1 + Owner: USSR + Facing: 384 + Location: 8,22 + SubCell: 3 + Actor976: e1 + Owner: USSR + Facing: 384 + Location: 8,22 + SubCell: 1 + Actor977: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 19,20 + Actor978: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 21,21 + Actor979: e1 + Owner: USSR + Facing: 384 + Location: 26,19 + SubCell: 3 + Actor980: e3 + Owner: USSR + Facing: 384 + Location: 21,20 + SubCell: 3 + Actor981: e3 + Owner: USSR + Facing: 384 + Location: 26,19 + SubCell: 1 + Actor982: e4 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 15,21 + Actor983: e2 + Owner: USSR + Facing: 384 + Location: 13,19 + SubCell: 3 + Actor984: e2 + Owner: USSR + Facing: 384 + Location: 17,18 + SubCell: 3 + Actor985: e2 + Owner: USSR + Facing: 384 + Location: 7,22 + SubCell: 3 + SovietShorePatroller4: e1 + Owner: USSR + SubCell: 3 + Location: 52,69 + Facing: 384 + SovietShorePatroller3: e1 + Owner: USSR + Location: 52,69 + SubCell: 1 + Facing: 384 + SovietShorePatroller6: e1 + Owner: USSR + Location: 52,70 + SubCell: 3 + Facing: 384 + SovietShorePatroller2: e2 + Owner: USSR + Location: 52,68 + SubCell: 3 + Facing: 384 + SovietShorePatroller5: e2 + Owner: USSR + Location: 52,69 + SubCell: 2 + Facing: 384 + SovietShorePatroller7: e3 + Owner: USSR + Location: 52,70 + SubCell: 1 + Facing: 384 + SovietShorePatroller1: btr.ai + Owner: USSR + Location: 52,67 + Facing: 523 + NorthAssembly: waypoint + Owner: Neutral + Location: 44,20 + EastAttackRally: waypoint + Owner: Neutral + Location: 47,45 + EastAssembly: waypoint + Owner: Neutral + Location: 69,40 + NavalSouthAssembly: waypoint + Owner: Neutral + Location: 99,91 + NavalEastAssembly: waypoint + Owner: Neutral + Location: 113,38 + NavalSouthRally: waypoint + Owner: Neutral + Location: 71,87 + NavalForwardRally: waypoint + Owner: Neutral + Location: 66,62 + NavalSouthEastAssembly: waypoint + Owner: Neutral + Location: 122,91 + ShorePatrol1: waypoint + Owner: Neutral + Location: 52,60 + CentralPatrol1: waypoint + Owner: Neutral + Location: 30,27 + CentralPatrol3: waypoint + Owner: Neutral + Location: 79,25 + CentralPatrol2: waypoint + Owner: Neutral + Location: 60,19 + Actor993: 3tnk + Owner: USSR + Facing: 253 + Location: 57,39 + Actor994: 3tnk + Owner: USSR + Facing: 253 + Location: 57,45 + Actor995: n1 + Owner: GDI + SubCell: 3 + Location: 23,39 + Facing: 848 + Actor996: n1 + Owner: GDI + SubCell: 3 + Location: 24,40 + Facing: 832 + Actor1001: n1 + Owner: GDI + SubCell: 3 + Location: 34,42 + Facing: 808 + Actor1002: n1 + Owner: GDI + SubCell: 3 + Location: 36,45 + Facing: 911 + Actor1003: n1 + Owner: GDI + Location: 36,45 + SubCell: 1 + Facing: 1023 + Actor1004: n1 + Owner: GDI + Location: 37,45 + SubCell: 3 + Facing: 745 + Actor1005: n3 + Owner: GDI + SubCell: 3 + Location: 35,44 + Facing: 800 + Actor1006: n3 + Owner: GDI + SubCell: 3 + Location: 26,41 + Facing: 935 + Actor1007: n3 + Owner: GDI + SubCell: 3 + Location: 20,39 + Facing: 800 + Actor1008: n3 + Owner: GDI + Facing: 384 + Location: 31,43 + SubCell: 3 + RaidLanding1: waypoint + Owner: Neutral + Location: 62,79 + RaidLanding2: waypoint + Owner: Neutral + Location: 57,58 + GDIReinforcementsEntry: waypoint + Owner: Neutral + Location: 1,46 + GDIReinforcementsRally: waypoint + Owner: Neutral + Location: 9,47 + Actor1011: 3tnk + Owner: USSR + Facing: 384 + Location: 91,40 + Actor1012: 3tnk + Owner: USSR + Facing: 384 + Location: 93,41 + Actor1013: e1 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 90,40 + Actor1014: e1 + Owner: USSR + Facing: 384 + Location: 90,40 + SubCell: 1 + Actor1015: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 91,41 + Actor1016: e1 + Owner: USSR + Facing: 384 + Location: 93,40 + SubCell: 3 + Actor1017: e1 + Owner: USSR + Facing: 384 + Location: 94,41 + SubCell: 3 + Actor1018: e4 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 92,41 + Actor1019: e4 + Owner: USSR + Facing: 384 + Location: 92,41 + SubCell: 1 + Actor1020: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 91,39 + Actor1021: dog + Owner: USSR + Facing: 384 + Location: 81,71 + SubCell: 3 + Actor1022: e1 + Owner: USSR + Facing: 384 + Location: 85,78 + SubCell: 3 + Actor1029: e1 + Owner: USSR + SubCell: 3 + Location: 20,74 + Facing: 618 + Actor1030: e1 + Owner: USSR + SubCell: 3 + Location: 22,75 + Facing: 570 + Actor1031: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 23,74 + Actor1033: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 24,73 + Actor1034: e1 + Owner: USSR + Facing: 384 + Location: 24,75 + SubCell: 1 + Actor1032: e1 + Owner: USSR + Facing: 384 + Location: 58,78 + SubCell: 3 + Actor1035: e1 + Owner: USSR + Facing: 384 + Location: 58,79 + SubCell: 3 + Actor1036: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 60,81 + Actor1039: e1 + Owner: USSR + Facing: 384 + Location: 58,82 + SubCell: 1 + Actor1037: e1 + Owner: USSR + Facing: 384 + Location: 58,79 + SubCell: 1 + Actor1038: e4 + Owner: USSR + Facing: 384 + Location: 59,80 + SubCell: 3 + Actor1040: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 58,77 + Actor1041: e1 + Owner: USSR + SubCell: 3 + Location: 34,70 + Facing: 182 + Actor1042: e1 + Owner: USSR + SubCell: 3 + Location: 36,71 + Facing: 602 + Actor1046: e3 + Owner: USSR + Facing: 384 + Location: 37,69 + SubCell: 1 + Actor1043: e1 + Owner: USSR + SubCell: 3 + Location: 38,69 + Facing: 309 + Actor1045: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 50,53 + Actor1047: e1 + Owner: USSR + Facing: 384 + Location: 50,53 + SubCell: 1 + Actor1048: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 46,53 + Actor1051: e4 + Owner: USSR + Facing: 384 + Location: 47,52 + SubCell: 2 + Actor1044: e2 + Owner: USSR + Facing: 384 + Location: 46,53 + SubCell: 1 + Actor1049: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 53,54 + Actor1050: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 44,54 + Actor1052: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 56,20 + Actor1054: e1 + Owner: USSR + Facing: 384 + SubCell: 1 + Location: 56,20 + Actor1053: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 57,19 + Actor1056: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 55,19 + Actor1055: e1 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 72,20 + Actor1057: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 71,19 + Actor1058: e1 + Owner: USSR + Facing: 384 + SubCell: 1 + Location: 72,20 + Actor1059: e4 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 74,21 + Actor1060: e3 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 73,20 + Actor1061: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 71,18 + Actor1062: 3tnk + Owner: USSR + Location: 70,20 + Facing: 384 + Actor1063: 3tnk + Owner: USSR + Facing: 384 + Location: 72,21 + CentralPatrol4: waypoint + Owner: Neutral + Location: 79,40 + NorthAttackRally: waypoint + Owner: Neutral + Location: 21,34 + NorthEastAttackRally: waypoint + Owner: Neutral + Location: 40,34 + HaloDrop1Landing: waypoint + Owner: Neutral + Location: 5,50 + HaloDrop2Landing: waypoint + Owner: Neutral + Location: 44,41 + GDICommanderSpawn: waypoint + Owner: Neutral + Location: 124,21 + GDICommanderRally: waypoint + Owner: Neutral + Location: 124,23 + GDIRescueRally: waypoint + Owner: Neutral + Location: 122,23 + SovietCenterPatroller5: btr.ai + Owner: USSR + Location: 39,27 + Facing: 245 + SovietCenterPatroller8: btr.ai + Owner: USSR + Location: 70,23 + Facing: 769 + SovietCenterPatroller6: e1 + Owner: USSR + SubCell: 3 + Location: 40,28 + Facing: 384 + SovietCenterPatroller7: e1 + Owner: USSR + SubCell: 3 + Location: 41,27 + Facing: 384 + SovietHindPatroller2: hind + Owner: USSR + Location: 109,37 + Facing: 634 + SovietHindPatroller1: hind + Owner: USSR + Location: 112,31 + Facing: 642 + SovietMainFactory2: weap + Owner: USSR + Location: 90,72 + SovietMainFactory1: weap + Owner: USSR + Location: 90,67 + SovietMainBarracks1: barr + Owner: USSR + Location: 91,62 + ShorePatrol2: waypoint + Owner: Neutral + Location: 52,78 + Actor205: e1 + Owner: Greece + SubCell: 5 + Facing: 0 + Location: 20,91 + Actor108: 2tnk + Owner: Greece + Facing: 0 + Location: 19,92 + Actor201: e1 + Owner: Greece + SubCell: 5 + Facing: 0 + Location: 18,91 + Actor204: e1 + Owner: Greece + SubCell: 4 + Facing: 0 + Location: 20,91 + RaidSpawn: waypoint + Owner: Neutral + Location: 128,92 + GDIBaseCenter: waypoint + Owner: Neutral + Location: 22,49 + VillageCenter: waypoint + Owner: Neutral + Location: 31,70 + ShoreCenter: waypoint + Owner: Neutral + Location: 54,81 + Actor1009: shok + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 59,36 + Actor1010: shok + Owner: USSR + Facing: 384 + Location: 59,46 + SubCell: 3 + Actor1064: shok + Owner: USSR + Facing: 384 + Location: 96,74 + SubCell: 3 + Actor1065: shok + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 97,71 + Actor1066: shok + Owner: USSR + SubCell: 3 + Location: 87,62 + Facing: 384 + Actor1067: shok + Owner: USSR + Facing: 384 + Location: 90,59 + SubCell: 1 + Actor1068: shok + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 86,60 + Actor1069: shok + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 46,11 + Actor1070: shok + Owner: USSR + Facing: 384 + Location: 44,8 + SubCell: 3 + GDIBaseTopRight: waypoint + Owner: Neutral + Location: 28,43 + HaloDrop3Landing: waypoint + Owner: Neutral + Location: 6,40 + HaloDrop4Landing: waypoint + Owner: Neutral + Location: 14,33 + HaloDrop5Landing: waypoint + Owner: Neutral + Location: 44,50 + HaloDrop6Landing: waypoint + Owner: Neutral + Location: 17,70 + RaidLanding3: waypoint + Owner: Neutral + Location: 57,52 + LateHaloDrop1Spawn: waypoint + Owner: Neutral + Location: 128,3 + LateHaloDrop1Landing: waypoint + Owner: Neutral + Location: 89,17 + LateHaloDrop2Spawn: waypoint + Owner: Neutral + Location: 128,44 + LateHaloDrop2Landing: waypoint + Owner: Neutral + Location: 83,41 + LateHaloDrop3Spawn: waypoint + Owner: Neutral + Location: 128,63 + LateHaloDrop3Landing: waypoint + Owner: Neutral + Location: 73,45 + HaloDrop7Landing: waypoint + Owner: Neutral + Location: 5,59 + CruiserSpawn: waypoint + Owner: Neutral + Location: 65,96 + CruiserDestination: waypoint + Owner: Neutral + Location: 65,68 + DestroyerSpawn: waypoint + Owner: Neutral + Location: 67,96 + DestroyerDestination: waypoint + Owner: Neutral + Location: 67,68 + HardOnlySub5: ss + Owner: USSR + Location: 94,93 + Facing: 261 + Actor1072: ss + Owner: USSR + Facing: 384 + Location: 97,87 + Actor1073: ss + Owner: USSR + Facing: 384 + Location: 97,87 + Actor1074: camera + Owner: USSR + Location: 26,46 + Actor1075: camera + Owner: USSR + Location: 54,79 + Actor1076: camera + Owner: USSR + Location: 46,58 + Actor1077: camera + Owner: USSR + Location: 35,54 + Actor1078: camera + Owner: USSR + Location: 54,65 + Actor1079: camera + Owner: USSR + Location: 19,38 + Actor1081: seas + Owner: USSR + Facing: 214 + Location: 73,62 + McvEntry: waypoint + Owner: Neutral + Location: 19,96 + McvRally: waypoint + Owner: Neutral + Location: 19,91 + Actor1082: gtwr + Owner: GDI + Location: 11,50 + EntranceReveal1: waypoint + Owner: Neutral + Location: 44,16 + EntranceReveal2: waypoint + Owner: Neutral + Location: 84,30 + EntranceReveal4: waypoint + Owner: Neutral + Location: 95,57 + EntranceReveal3: waypoint + Owner: Neutral + Location: 84,66 + Actor1071: ss + Owner: USSR + Facing: 578 + Location: 104,5 + Actor1084: ss + Owner: USSR + Facing: 578 + Location: 101,6 + Actor1083: sam + Owner: USSR + Location: 124,4 + Actor1085: sam + Owner: USSR + Location: 116,2 + Actor1087: e1 + Owner: USSR + Facing: 384 + Location: 125,29 + SubCell: 1 + Actor1086: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 122,2 + Actor1088: e1 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 117,3 + Actor807: t15 + Owner: Neutral + Location: 42,36 + Actor1080: camera + Owner: USSR + Location: 37,40 + Actor1110: 3tnk + Owner: USSR + Facing: 523 + Location: 18,31 + Actor1111: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 19,31 + Actor1105: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 16,31 + Actor1106: e1 + Owner: USSR + Facing: 384 + SubCell: 1 + Location: 16,31 + Actor1112: e1 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 15,32 + Actor1096: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 24,30 + Actor1097: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 23,31 + Actor1098: e1 + Owner: USSR + SubCell: 1 + Facing: 384 + Location: 23,31 + SovietMammoth1: 4tnk + Owner: USSR + Location: 27,30 + Facing: 452 + SovietV21: v2rl + Owner: USSR + Location: 31,30 + Facing: 384 + Actor1102: e1 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 29,31 + Actor1103: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 30,31 + Actor1104: e1 + Owner: USSR + Facing: 384 + SubCell: 1 + Location: 30,31 + Actor1113: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 30,32 + Actor1114: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 32,31 + Actor1115: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 33,32 + Actor1116: e4 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 34,32 + Actor1117: 3tnk + Owner: USSR + Facing: 459 + Location: 35,32 + Actor1118: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 38,32 + Actor1119: e4 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 36,33 + Actor1120: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 37,34 + Actor1121: e1 + Owner: USSR + Facing: 384 + SubCell: 1 + Location: 37,34 + SovietMammoth2: 4tnk + Owner: USSR + Location: 41,37 + Facing: 348 + Actor1089: 3tnk + Owner: USSR + Facing: 293 + Location: 44,40 + Actor1090: e1 + Owner: USSR + SubCell: 3 + Location: 43,41 + Facing: 384 + Actor1091: e1 + Owner: USSR + SubCell: 1 + Facing: 384 + Location: 43,41 + Actor1093: e3 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 43,39 + Actor1094: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 42,38 + SovietV22: v2rl + Owner: USSR + Location: 41,33 + Facing: 384 + SiegeUnitsBoxTopLeft: waypoint + Owner: Neutral + Location: 14,29 + SiegeUnitsBoxBottomRight: waypoint + Owner: Neutral + Location: 45,41 + Actor1092: tc05 + Owner: Neutral + Location: 40,77 + HaloSpawn1: waypoint + Owner: Neutral + Location: 75,1 + HaloDrop1Mid: waypoint + Owner: Neutral + Location: 14,13 + HaloSpawn2: waypoint + Owner: Neutral + Location: 128,75 + Actor809: e1 + Owner: USSR + SubCell: 3 + Location: 91,79 + Facing: 384 + Actor1095: powr + Owner: USSR + Location: 126,14 + Actor1024: brik + Owner: USSR + Location: 103,37 + Actor1025: brik + Owner: USSR + Location: 103,38 + Actor1100: 4tnk + Owner: USSR + Location: 116,21 + Facing: 412 + Actor1028: ftur + Owner: USSR + Location: 113,23 + Actor1026: e3 + Owner: USSR + Facing: 384 + SubCell: 1 + Location: 111,18 + Actor388: sam + Owner: USSR + Location: 126,30 + Actor1027: sam + Owner: USSR + Location: 109,21 + Actor1101: sam + Owner: USSR + Location: 116,24 + Actor1107: fenc + Owner: USSR + Location: 120,23 + Actor1108: fenc + Owner: USSR + Location: 120,24 + Actor1109: fenc + Owner: USSR + Location: 120,19 + Actor1122: fenc + Owner: USSR + Location: 120,18 + Actor1123: fenc + Owner: USSR + Location: 119,19 + Actor1124: fenc + Owner: USSR + Location: 119,23 + Actor1125: powr + Owner: USSR + Location: 111,16 + Actor1126: afld + Owner: USSR + Location: 124,26 + Actor1127: afld + Owner: USSR + Location: 120,26 + Actor1099: apwr + Owner: USSR + Location: 118,14 + Actor1128: kenn + Owner: USSR + Location: 98,33 + Actor1129: dog + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 97,33 + Actor1130: silo + Owner: USSR + Location: 87,36 + Actor1131: silo + Owner: USSR + Location: 87,37 + Actor1132: ttra + Owner: USSR + Facing: 384 + Location: 105,29 + Actor1133: powr + Owner: USSR + Location: 102,34 + Actor1134: powr + Owner: USSR + Location: 92,32 + GDIRescueSpawn: waypoint + Owner: Neutral + Location: 108,1 + Actor1023: ss + Owner: USSR + Facing: 578 + Location: 97,25 + Actor1135: seas + Owner: USSR + Facing: 491 + Location: 106,9 + Actor1136: mech + Owner: Greece + SubCell: 3 + Facing: 1023 + Location: 17,92 + Actor1137: medi + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 19,94 + Actor1138: mech + Owner: Greece + SubCell: 3 + Facing: 1023 + Location: 21,92 + MissileSilo: mslo + Owner: USSR + Location: 114,81 + ScriptTags: BrutalOnly + Actor1139: powr + Owner: USSR + Location: 98,66 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-coalitions.yaml, ca|missions/main-campaign/ca03-deliverance/deliverance-rules.yaml, ca|rules/custom/coop-rules.yaml, deliverance-coop-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml + +Voices: ca|missions/main-campaign/ca03-deliverance/deliverance-voices.yaml diff --git a/mods/ca/missions/coop-campaign/ca04-containment-coop/containment-coop-rules.yaml b/mods/ca/missions/coop-campaign/ca04-containment-coop/containment-coop-rules.yaml new file mode 100644 index 0000000000..33828ad866 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca04-containment-coop/containment-coop-rules.yaml @@ -0,0 +1,26 @@ +World: + LuaScript: + Scripts: campaign.lua, coop.lua, ca|missions/main-campaign/ca04-containment/containment.lua, containment-coop.lua + ScriptLobbyDropdown@CAMLOCK: + ID: camlock + Label: Camera Lock + Description: Enable/disable locking the camera on your last unit. + Values: + enabled: Enabled + disabled: Disabled + Default: disabled + DisplayOrder: 999 + LobbyMissionInfo@InitialObjectives: + Prefix: Initial Objectives + Text: • Destroy the 3 Soviet Atomic Reactors.\n• Eliminate SAM sites.\n• Destroy Missile Silos before they launch.\n• Neutralize the Chronosphere. + LobbyMissionInfo@Notes: + Prefix: Note + Text: Respawns can be enabled for this mission. + PrefixColor: FF9900 + TextColor: FF9900 + +SPY: + Inherits@NameTag: ^NameTag + +SEAL: + Inherits@NameTag: ^NameTag \ No newline at end of file diff --git a/mods/ca/missions/coop-campaign/ca04-containment-coop/containment-coop.lua b/mods/ca/missions/coop-campaign/ca04-containment-coop/containment-coop.lua new file mode 100644 index 0000000000..753ce3a9bd --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca04-containment-coop/containment-coop.lua @@ -0,0 +1,65 @@ + +SetupPlayers = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Multi2 = Player.GetPlayer("Multi2") + Multi3 = Player.GetPlayer("Multi3") + Multi4 = Player.GetPlayer("Multi4") + Multi5 = Player.GetPlayer("Multi5") + Greece = Player.GetPlayer("Greece") + USSR = Player.GetPlayer("USSR") + Scrin = Player.GetPlayer("Scrin") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = Utils.Where({ Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 }, function(p) return p ~= nil end) + MissionEnemies = { USSR } + SinglePlayerPlayer = Greece + StopSpread = true + CoopInit() +end + +AfterWorldLoaded = function() + CamlockEnabled = Map.LobbyOption("camlock") == "enabled" +end + +AfterTick = function() + if CamlockEnabled then + Utils.Do(MissionPlayers, function(p) + if not p.IsLocalPlayer then + return + end + local validCamTargets = p.GetActorsByTypes({"spy", "seal", "chpr"}) + if #validCamTargets == 1 then + PanToPos(validCamTargets[1].CenterPosition, 100) + end + end) + end +end + +SetupUnits = function() + Seals = { Seal1, Seal2 } + + local extraSealLocations = { + CPos.New(93, 8), + CPos.New(95, 9), + CPos.New(101, 10), + CPos.New(103, 10), + } + + for i = 3, #MissionPlayers do + local loc = extraSealLocations[i - 2] + local seal = Actor.Create("seal", true, { Owner = Greece, Location = loc }) + table.insert(Seals, seal) + end + + AssignToCoopPlayers(Utils.Concat(Seals, { Spy })) + + Utils.Do(Seals, function(a) + RespawnTrigger(a, a.Location) + end) + + RespawnTrigger(Spy, Spy.Location) +end + +TransferChronoPrisonOwnership = function(chronoPrison) + chronoPrison.Owner = GetFirstActivePlayer() +end diff --git a/mods/ca/missions/coop-campaign/ca04-containment-coop/map.bin b/mods/ca/missions/coop-campaign/ca04-containment-coop/map.bin new file mode 100644 index 0000000000..0bafa62345 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca04-containment-coop/map.bin differ diff --git a/mods/ca/missions/coop-campaign/ca04-containment-coop/map.png b/mods/ca/missions/coop-campaign/ca04-containment-coop/map.png new file mode 100644 index 0000000000..0b79d04724 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca04-containment-coop/map.png differ diff --git a/mods/ca/missions/coop-campaign/ca04-containment-coop/map.yaml b/mods/ca/missions/coop-campaign/ca04-containment-coop/map.yaml new file mode 100644 index 0000000000..591c003751 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca04-containment-coop/map.yaml @@ -0,0 +1,3564 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 04: Containment Co-op + +Author: Darkademic & Gandorques Hikla + +Tileset: TEMPERAT + +MapSize: 114,82 + +Bounds: 1,1,112,80 + +Visibility: Lobby + +Categories: Co-op Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: USSR, Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + PlayerReference@Greece: + Name: Greece + Faction: allies + Color: 99ACF2 + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Creeps + PlayerReference@USSR: + Name: USSR + Bot: dormant + Faction: soviet + Color: FE1100 + Enemies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@Nod: + Name: Nod + NonCombatant: True + Faction: nod + Color: FE1100 + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 99ACF2 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Creeps + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 0B7310 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Creeps + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 134691 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Creeps + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 775A12 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Creeps + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 994050 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Creeps + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: EEA8A8 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Creeps + +Actors: + Actor72: brik + Owner: Neutral + Location: 2,49 + Actor73: brik + Owner: Neutral + Location: 3,49 + Health: 62 + Actor74: brik + Owner: Neutral + Location: 4,49 + Health: 70 + Actor75: brik + Owner: Neutral + Location: 5,49 + Actor76: brik + Owner: Neutral + Location: 6,49 + Actor77: brik + Owner: Neutral + Location: 7,49 + Actor78: brik + Owner: Neutral + Location: 8,49 + Health: 72 + Actor79: brik + Owner: Neutral + Location: 9,49 + Health: 48 + Actor80: brik + Owner: Neutral + Location: 10,49 + Health: 60 + Actor81: brik + Owner: Neutral + Location: 11,49 + Actor82: brik + Owner: Neutral + Location: 12,49 + Actor83: brik + Owner: Neutral + Location: 13,49 + Health: 73 + Actor84: brik + Owner: Neutral + Location: 14,49 + Actor85: brik + Owner: Neutral + Location: 15,49 + Actor86: brik + Owner: Neutral + Location: 16,49 + Health: 54 + Actor87: brik + Owner: Neutral + Location: 17,49 + Health: 62 + Actor88: brik + Owner: Neutral + Location: 18,49 + Health: 45 + Actor89: brik + Owner: Neutral + Location: 19,49 + Actor90: brik + Owner: Neutral + Location: 20,49 + Health: 32 + Actor91: brik + Owner: Neutral + Location: 21,49 + Actor92: brik + Owner: Neutral + Location: 22,49 + Actor93: brik + Owner: Neutral + Location: 2,50 + Actor98: brik + Owner: Neutral + Location: 22,50 + Actor99: brik + Owner: Neutral + Location: 2,51 + Actor100: brik + Owner: Neutral + Location: 22,51 + Health: 64 + Actor101: brik + Owner: Neutral + Location: 2,52 + Health: 54 + Actor103: brik + Owner: Neutral + Location: 22,52 + Health: 73 + Actor104: brik + Owner: Neutral + Location: 2,53 + Actor105: brik + Owner: Neutral + Location: 3,53 + Actor107: brik + Owner: Neutral + Location: 22,53 + Actor108: brik + Owner: Neutral + Location: 2,54 + Health: 26 + Actor109: brik + Owner: Neutral + Location: 3,54 + Actor112: brik + Owner: Neutral + Location: 22,54 + Actor113: brik + Owner: Neutral + Location: 22,55 + Health: 67 + Actor116: brik + Owner: Neutral + Location: 22,56 + Health: 38 + Actor117: brik + Owner: Neutral + Location: 22,57 + Health: 40 + Actor118: brik + Owner: Neutral + Location: 2,58 + Actor119: brik + Owner: Neutral + Location: 3,58 + Actor120: brik + Owner: Neutral + Location: 22,58 + Health: 60 + Actor121: brik + Owner: Neutral + Location: 2,59 + Actor122: brik + Owner: Neutral + Location: 3,59 + Health: 23 + Actor125: brik + Owner: Neutral + Location: 22,59 + Health: 62 + Actor126: brik + Owner: Neutral + Location: 2,60 + Actor129: brik + Owner: Neutral + Location: 22,60 + Health: 61 + Actor130: brik + Owner: Neutral + Location: 2,61 + Health: 31 + Actor131: brik + Owner: Neutral + Location: 3,61 + Actor132: brik + Owner: Neutral + Location: 22,61 + Health: 62 + Actor133: brik + Owner: Neutral + Location: 2,62 + Actor134: brik + Owner: Neutral + Location: 3,62 + Health: 31 + Actor136: brik + Owner: Neutral + Location: 22,62 + Health: 28 + Actor140: brik + Owner: Neutral + Location: 22,63 + Health: 30 + Actor141: brik + Owner: Neutral + Location: 22,64 + Health: 24 + Actor142: brik + Owner: Neutral + Location: 21,65 + Health: 22 + Actor143: brik + Owner: Neutral + Location: 22,65 + Health: 14 + Actor145: brik + Owner: Neutral + Location: 21,66 + Health: 19 + Actor146: brik + Owner: Neutral + Location: 22,66 + Health: 18 + Actor147: brik + Owner: Neutral + Location: 2,67 + Actor148: brik + Owner: Neutral + Location: 3,67 + Health: 25 + Actor149: brik + Owner: Neutral + Location: 2,68 + Actor150: brik + Owner: Neutral + Location: 3,68 + Health: 25 + Actor155: brik + Owner: Neutral + Location: 2,69 + Health: 58 + Actor164: brik + Owner: Neutral + Location: 2,70 + Actor165: brik + Owner: Neutral + Location: 3,70 + Actor166: brik + Owner: Neutral + Location: 8,70 + Health: 37 + Actor167: brik + Owner: Neutral + Location: 9,70 + Health: 43 + Actor168: brik + Owner: Neutral + Location: 10,70 + Health: 65 + Actor169: brik + Owner: Neutral + Location: 11,70 + Health: 43 + Actor170: brik + Owner: Neutral + Location: 12,70 + Health: 28 + Actor179: brik + Owner: Neutral + Location: 2,71 + Actor180: brik + Owner: Neutral + Location: 3,71 + Actor181: brik + Owner: Neutral + Location: 4,71 + Health: 64 + Actor182: brik + Owner: Neutral + Location: 5,71 + Actor183: brik + Owner: Neutral + Location: 6,71 + Health: 56 + Actor184: brik + Owner: Neutral + Location: 7,71 + Health: 45 + Actor185: brik + Owner: Neutral + Location: 8,71 + Health: 30 + Chronosphere: pdox.crossrip + Owner: Creeps + Location: 18,72 + Actor197: tc05.husk + Owner: Neutral + Location: 9,73 + Actor202: tc01.husk + Owner: Neutral + Location: 4,73 + Actor203: tc03.husk + Owner: Neutral + Location: 5,74 + Actor205: tc04.husk + Owner: Neutral + Location: 7,74 + Actor206: t14.husk + Owner: Neutral + Location: 11,75 + Actor209: t14.husk + Owner: Neutral + Location: 11,75 + Actor211: t17.husk + Owner: Neutral + Location: 22,78 + Actor212: t17.husk + Owner: Neutral + Location: 22,78 + Actor213: tc02.husk + Owner: Neutral + Location: 15,79 + Actor215: t01.husk + Owner: Neutral + Location: 12,77 + Actor214: t12.husk + Owner: Neutral + Location: 4,75 + Actor216: t07.husk + Owner: Neutral + Location: 5,75 + Actor217: t14.husk + Owner: Neutral + Location: 2,75 + Actor218: t14.husk + Owner: Neutral + Location: 2,75 + Actor210: t10.husk + Owner: Neutral + Location: 13,79 + Actor94: tc05.husk + Owner: Neutral + Location: 26,56 + Actor95: t16.husk + Owner: Neutral + Location: 29,57 + Actor96: t10.husk + Owner: Neutral + Location: 25,63 + Actor97: t11.husk + Owner: Neutral + Location: 25,52 + Actor106: t15.husk + Owner: Neutral + Location: 26,70 + Actor110: tc04.husk + Owner: Neutral + Location: 27,75 + Actor111: t05.husk + Owner: Neutral + Location: 31,65 + Actor114: t13.husk + Owner: Neutral + Location: 11,45 + Actor115: tc03.husk + Owner: Neutral + Location: 16,45 + Actor124: t16.husk + Owner: Neutral + Location: 3,45 + Actor127: t12.husk + Owner: Neutral + Location: 1,45 + Actor128: t16.husk + Owner: Neutral + Location: 25,59 + Actor135: t14.husk + Owner: Neutral + Location: 24,57 + Actor137: tc05.husk + Owner: Neutral + Location: 28,78 + LandingCraft: lst.reinforce + Owner: Greece + Location: 98,6 + Facing: 384 + Actor312: brik + Owner: USSR + Location: 82,8 + Actor313: brik + Owner: USSR + Location: 81,8 + Actor314: brik + Owner: USSR + Location: 82,9 + Actor315: brik + Owner: USSR + Location: 81,9 + Actor316: brik + Owner: USSR + Location: 82,10 + Actor317: brik + Owner: USSR + Location: 83,10 + Actor318: brik + Owner: USSR + Location: 83,11 + Actor319: brik + Owner: USSR + Location: 83,12 + Actor320: brik + Owner: USSR + Location: 83,13 + Actor321: brik + Owner: USSR + Location: 84,13 + Actor322: brik + Owner: USSR + Location: 85,13 + Actor323: brik + Owner: USSR + Location: 86,13 + Actor324: brik + Owner: USSR + Location: 86,14 + Actor325: brik + Owner: USSR + Location: 85,14 + NorthTesla3: tsla + Owner: USSR + Location: 84,14 + Actor269: brik + Owner: USSR + Location: 72,20 + Actor337: brik + Owner: USSR + Location: 72,21 + Actor338: brik + Owner: USSR + Location: 73,21 + Actor339: brik + Owner: USSR + Location: 73,20 + Actor340: brik + Owner: USSR + Location: 74,21 + Actor341: brik + Owner: USSR + Location: 76,21 + Actor342: brik + Owner: USSR + Location: 75,21 + Actor343: brik + Owner: USSR + Location: 77,21 + Actor344: brik + Owner: USSR + Location: 77,20 + Actor345: brik + Owner: USSR + Location: 76,20 + Actor346: brik + Owner: USSR + Location: 82,20 + Actor347: brik + Owner: USSR + Location: 82,21 + Actor348: brik + Owner: USSR + Location: 83,21 + Actor350: brik + Owner: USSR + Location: 84,21 + Actor351: brik + Owner: USSR + Location: 85,21 + Actor352: brik + Owner: USSR + Location: 86,21 + Actor353: brik + Owner: USSR + Location: 86,20 + Actor354: brik + Owner: USSR + Location: 86,19 + Actor355: brik + Owner: USSR + Location: 86,18 + Actor356: brik + Owner: USSR + Location: 86,17 + Actor357: brik + Owner: USSR + Location: 85,17 + Actor358: brik + Owner: USSR + Location: 85,18 + NorthTesla1: tsla + Owner: USSR + Location: 75,20 + Actor361: ftur + Owner: USSR + Location: 77,22 + Actor363: ftur + Owner: USSR + Location: 81,22 + Actor364: ftur + Owner: USSR + Location: 81,22 + Actor349: brik + Owner: USSR + Location: 81,20 + Actor362: brik + Owner: USSR + Location: 81,21 + NorthTesla2: tsla + Owner: USSR + Location: 83,20 + PlayerStart: waypoint + Owner: Neutral + Location: 98,9 + Actor309: proc + Owner: USSR + Location: 79,14 + Actor295: ftur + Owner: USSR + Location: 96,24 + Actor296: ftur + Owner: USSR + Location: 100,24 + NorthBarracks1: barr + Owner: USSR + Location: 76,15 + Actor524: e1 + Owner: USSR + SubCell: 3 + Location: 97,18 + Facing: 888 + Actor525: e1 + Owner: USSR + SubCell: 3 + Location: 100,18 + Facing: 0 + Actor526: e1 + Owner: USSR + Location: 97,18 + SubCell: 1 + Facing: 166 + Actor527: e1 + Owner: USSR + SubCell: 3 + Location: 102,17 + Facing: 840 + Actor528: dog + Owner: USSR + Location: 100,18 + SubCell: 1 + Facing: 79 + NorthTesla4: tsla + Owner: USSR + Location: 81,10 + Actor605: ftur + Owner: USSR + Location: 83,7 + Actor609: e1 + Owner: USSR + SubCell: 3 + Location: 82,7 + Facing: 682 + Actor610: dog + Owner: USSR + Location: 82,7 + SubCell: 1 + Facing: 808 + Actor612: e1 + Owner: USSR + SubCell: 3 + Facing: 729 + Location: 81,6 + Actor613: e1 + Owner: USSR + SubCell: 1 + Facing: 793 + Location: 81,6 + Actor614: dog + Owner: USSR + SubCell: 2 + Facing: 753 + Location: 81,6 + Actor617: dog + Owner: USSR + SubCell: 3 + Facing: 570 + Location: 77,23 + Actor618: e1 + Owner: USSR + SubCell: 1 + Facing: 658 + Location: 77,23 + Actor619: dog + Owner: USSR + SubCell: 3 + Facing: 682 + Location: 81,23 + Actor620: e1 + Owner: USSR + SubCell: 1 + Facing: 507 + Location: 81,23 + Actor621: e1 + Owner: USSR + SubCell: 2 + Location: 81,23 + Facing: 697 + Actor606: e4 + Owner: USSR + Location: 77,23 + SubCell: 2 + Facing: 674 + Spy: spy + Owner: Greece + SubCell: 3 + Location: 98,11 + Facing: 531 + Seal1: seal + Owner: Greece + SubCell: 3 + Location: 97,9 + Facing: 388 + Seal2: seal + Owner: Greece + SubCell: 3 + Location: 99,9 + Facing: 697 + Actor289: spen + Owner: USSR + Location: 108,35 + Actor290: brik + Owner: USSR + Location: 100,36 + Actor291: brik + Owner: USSR + Location: 100,37 + Actor292: brik + Owner: USSR + Location: 101,36 + Actor293: brik + Owner: USSR + Location: 101,37 + Actor294: brik + Owner: USSR + Location: 102,36 + Actor297: brik + Owner: USSR + Location: 103,36 + Actor298: brik + Owner: USSR + Location: 103,37 + Actor299: brik + Owner: USSR + Location: 104,37 + Actor300: brik + Owner: USSR + Location: 104,36 + Actor301: brik + Owner: USSR + Location: 96,36 + Actor302: brik + Owner: USSR + Location: 96,37 + Actor303: brik + Owner: USSR + Location: 95,37 + Actor304: brik + Owner: USSR + Location: 95,36 + Actor305: brik + Owner: USSR + Location: 94,36 + Actor306: brik + Owner: USSR + Location: 93,36 + Actor310: brik + Owner: USSR + Location: 92,36 + Actor311: brik + Owner: USSR + Location: 92,37 + Actor326: brik + Owner: USSR + Location: 93,37 + Actor328: brik + Owner: USSR + Location: 88,34 + Actor367: brik + Owner: USSR + Location: 88,35 + Actor368: brik + Owner: USSR + Location: 91,36 + Actor466: brik + Owner: USSR + Location: 89,36 + Actor467: brik + Owner: USSR + Location: 90,36 + Actor468: brik + Owner: USSR + Location: 88,36 + Actor469: brik + Owner: USSR + Location: 87,34 + Actor470: brik + Owner: USSR + Location: 87,35 + Actor471: brik + Owner: USSR + Location: 86,34 + Actor472: brik + Owner: USSR + Location: 85,34 + Actor473: brik + Owner: USSR + Location: 84,34 + Actor474: brik + Owner: USSR + Location: 84,35 + Actor475: brik + Owner: USSR + Location: 85,35 + Actor476: brik + Owner: USSR + Location: 104,38 + Actor477: brik + Owner: USSR + Location: 104,39 + Actor489: brik + Owner: USSR + Location: 104,50 + Actor522: brik + Owner: USSR + Location: 84,47 + Actor530: brik + Owner: USSR + Location: 84,48 + Actor531: brik + Owner: USSR + Location: 84,49 + Actor532: brik + Owner: USSR + Location: 84,50 + EastTesla4: tsla + Owner: USSR + Location: 102,37 + EastTesla3: tsla + Owner: USSR + Location: 94,37 + EastTesla1: tsla + Owner: USSR + Location: 86,35 + Actor510: brik + Owner: USSR + Location: 84,36 + Actor511: brik + Owner: USSR + Location: 84,37 + Actor516: brik + Owner: USSR + Location: 84,38 + Actor541: brik + Owner: USSR + Location: 85,38 + Actor545: brik + Owner: USSR + Location: 84,39 + Actor547: brik + Owner: USSR + Location: 85,39 + Actor514: brik + Owner: USSR + Location: 84,43 + Actor515: brik + Owner: USSR + Location: 85,43 + Actor518: brik + Owner: USSR + Location: 84,44 + Actor519: brik + Owner: USSR + Location: 85,44 + Actor520: brik + Owner: USSR + Location: 84,45 + EastTesla5: tsla + Owner: USSR + Location: 85,45 + Actor542: brik + Owner: USSR + Location: 84,46 + Actor490: brik + Owner: USSR + Location: 84,51 + Actor491: brik + Owner: USSR + Location: 104,51 + Actor492: brik + Owner: USSR + Location: 84,52 + Actor493: brik + Owner: USSR + Location: 90,52 + Actor494: brik + Owner: USSR + Location: 91,52 + Actor495: brik + Owner: USSR + Location: 95,52 + Actor496: brik + Owner: USSR + Location: 96,52 + Actor497: brik + Owner: USSR + Location: 103,52 + Actor498: brik + Owner: USSR + Location: 104,52 + Actor499: brik + Owner: USSR + Location: 84,53 + Actor500: brik + Owner: USSR + Location: 85,53 + Actor501: brik + Owner: USSR + Location: 86,53 + Actor502: brik + Owner: USSR + Location: 87,53 + Actor503: brik + Owner: USSR + Location: 88,53 + Actor504: brik + Owner: USSR + Location: 89,53 + Actor505: brik + Owner: USSR + Location: 90,53 + Actor506: brik + Owner: USSR + Location: 91,53 + Actor507: brik + Owner: USSR + Location: 95,53 + Actor508: brik + Owner: USSR + Location: 96,53 + Actor509: brik + Owner: USSR + Location: 97,53 + Actor533: brik + Owner: USSR + Location: 98,53 + Actor534: brik + Owner: USSR + Location: 99,53 + Actor535: brik + Owner: USSR + Location: 100,53 + Actor536: brik + Owner: USSR + Location: 101,53 + Actor537: brik + Owner: USSR + Location: 102,53 + Actor546: brik + Owner: USSR + Location: 103,53 + Actor553: brik + Owner: USSR + Location: 104,53 + Actor555: chain + Owner: USSR + Location: 92,43 + Actor556: chain + Owner: USSR + Location: 93,43 + Actor557: chain + Owner: USSR + Location: 94,43 + Actor558: chain + Owner: USSR + Location: 95,43 + Actor559: chain + Owner: USSR + Location: 96,43 + Actor560: chain + Owner: USSR + Location: 97,43 + Actor561: chain + Owner: USSR + Location: 92,44 + Actor562: chain + Owner: USSR + Location: 97,44 + Actor563: chain + Owner: USSR + Location: 92,45 + EastReactor: npwr + Owner: USSR + Location: 93,45 + Actor565: chain + Owner: USSR + Location: 97,45 + Actor566: chain + Owner: USSR + Location: 92,46 + Actor567: chain + Owner: USSR + Location: 97,46 + Actor568: chain + Owner: USSR + Location: 92,47 + Actor569: chain + Owner: USSR + Location: 97,47 + Actor570: chain + Owner: USSR + Location: 92,48 + Actor571: chain + Owner: USSR + Location: 93,48 + Actor572: chain + Owner: USSR + Location: 96,48 + Actor573: chain + Owner: USSR + Location: 97,48 + Actor478: brik + Owner: USSR + Location: 104,40 + Actor479: brik + Owner: USSR + Location: 104,41 + Actor480: brik + Owner: USSR + Location: 103,42 + Actor481: brik + Owner: USSR + Location: 104,42 + Actor484: brik + Owner: USSR + Location: 103,43 + Actor548: brik + Owner: USSR + Location: 104,43 + Actor482: brik + Owner: USSR + Location: 103,47 + Actor483: brik + Owner: USSR + Location: 104,47 + Actor485: brik + Owner: USSR + Location: 103,48 + Actor486: brik + Owner: USSR + Location: 104,48 + Actor487: brik + Owner: USSR + Location: 104,49 + EastBarracks: barr + Owner: USSR + Location: 89,37 + EastKennel: kenn + Owner: USSR + Location: 87,38 + Actor550: apwr + Owner: USSR + Location: 85,50 + Actor551: apwr + Owner: USSR + Location: 85,47 + Actor552: fenc + Owner: USSR + Location: 98,48 + Actor554: fenc + Owner: USSR + Location: 98,47 + Actor574: fenc + Owner: USSR + Location: 98,46 + Actor575: fenc + Owner: USSR + Location: 98,45 + Actor576: fenc + Owner: USSR + Location: 98,44 + Actor577: fenc + Owner: USSR + Location: 98,43 + Actor578: fenc + Owner: USSR + Location: 91,43 + Actor579: fenc + Owner: USSR + Location: 91,44 + Actor580: fenc + Owner: USSR + Location: 91,45 + Actor581: fenc + Owner: USSR + Location: 91,46 + Actor582: fenc + Owner: USSR + Location: 91,47 + Actor583: fenc + Owner: USSR + Location: 91,48 + Actor587: brik + Owner: USSR + Location: 64,20 + Actor588: brik + Owner: USSR + Location: 64,19 + Actor589: brik + Owner: USSR + Location: 65,19 + Actor590: brik + Owner: USSR + Location: 65,20 + Actor591: brik + Owner: USSR + Location: 64,18 + Actor592: brik + Owner: USSR + Location: 64,17 + Actor593: brik + Owner: USSR + Location: 64,16 + Actor594: brik + Owner: USSR + Location: 65,16 + Actor595: brik + Owner: USSR + Location: 65,17 + Actor596: brik + Owner: USSR + Location: 64,12 + Actor597: brik + Owner: USSR + Location: 65,12 + Actor598: brik + Owner: USSR + Location: 64,11 + Actor599: brik + Owner: USSR + Location: 65,11 + Actor601: brik + Owner: USSR + Location: 64,10 + Actor602: brik + Owner: USSR + Location: 64,9 + Actor603: brik + Owner: USSR + Location: 64,8 + Actor604: brik + Owner: USSR + Location: 64,7 + Actor616: brik + Owner: USSR + Location: 65,7 + Actor622: brik + Owner: USSR + Location: 66,7 + ShoreSAM5: sam + Owner: USSR + Location: 61,73 + ShoreSAM4: sam + Owner: USSR + Location: 57,62 + ShoreSAM3: sam + Owner: USSR + Location: 64,55 + ShoreSAM2: sam + Owner: USSR + Location: 52,46 + Actor633: fenc + Owner: USSR + Location: 63,54 + Actor634: fenc + Owner: USSR + Location: 64,54 + Actor641: fenc + Owner: USSR + Location: 58,63 + Actor635: fenc + Owner: USSR + Location: 63,73 + Actor640: fenc + Owner: USSR + Location: 62,72 + Actor642: fenc + Owner: USSR + Location: 63,72 + Actor643: fenc + Owner: USSR + Location: 63,74 + Actor644: fenc + Owner: USSR + Location: 62,74 + Actor638: fenc + Owner: USSR + Location: 59,61 + Actor646: fenc + Owner: USSR + Location: 59,62 + Actor647: fenc + Owner: USSR + Location: 59,63 + Actor649: fenc + Owner: USSR + Location: 53,47 + Actor650: fenc + Owner: USSR + Location: 54,47 + Actor651: fenc + Owner: USSR + Location: 54,46 + Actor652: fenc + Owner: USSR + Location: 54,45 + Actor694: brik + Owner: USSR + Location: 91,67 + Actor701: brik + Owner: USSR + Location: 90,67 + Actor703: brik + Owner: USSR + Location: 88,67 + Actor704: brik + Owner: USSR + Location: 88,68 + Actor705: brik + Owner: USSR + Location: 88,69 + Actor706: brik + Owner: USSR + Location: 88,70 + Actor707: brik + Owner: USSR + Location: 88,71 + Actor708: brik + Owner: USSR + Location: 88,72 + Actor709: brik + Owner: USSR + Location: 89,72 + Actor715: brik + Owner: USSR + Location: 88,77 + Actor716: brik + Owner: USSR + Location: 88,78 + Actor717: brik + Owner: USSR + Location: 88,79 + Actor718: brik + Owner: USSR + Location: 88,80 + Actor719: brik + Owner: USSR + Location: 89,80 + Actor720: brik + Owner: USSR + Location: 90,80 + Actor721: brik + Owner: USSR + Location: 89,77 + Actor722: brik + Owner: USSR + Location: 89,73 + Actor728: brik + Owner: USSR + Location: 88,73 + Actor710: brik + Owner: USSR + Location: 91,80 + Actor711: brik + Owner: USSR + Location: 92,80 + Actor712: brik + Owner: USSR + Location: 93,80 + Actor733: brik + Owner: USSR + Location: 94,80 + Actor737: brik + Owner: USSR + Location: 95,80 + Actor739: brik + Owner: USSR + Location: 96,80 + Actor740: brik + Owner: USSR + Location: 97,80 + Actor744: brik + Owner: USSR + Location: 99,80 + Actor747: brik + Owner: USSR + Location: 98,80 + Actor667: brik + Owner: USSR + Location: 108,68 + Actor668: brik + Owner: USSR + Location: 108,69 + Actor669: brik + Owner: USSR + Location: 108,70 + Actor673: brik + Owner: USSR + Location: 108,71 + Actor678: brik + Owner: USSR + Location: 89,78 + Actor682: ftur + Owner: USSR + Location: 91,65 + Actor686: brik + Owner: USSR + Location: 88,66 + Actor692: brik + Owner: USSR + Location: 89,66 + Actor713: brik + Owner: USSR + Location: 90,66 + Actor714: brik + Owner: USSR + Location: 91,66 + Actor661: ftur + Owner: USSR + Location: 95,65 + Actor663: brik + Owner: USSR + Location: 95,66 + Actor666: brik + Owner: USSR + Location: 96,66 + Actor693: brik + Owner: USSR + Location: 97,66 + Actor695: brik + Owner: USSR + Location: 98,66 + Actor697: brik + Owner: USSR + Location: 99,66 + Actor699: brik + Owner: USSR + Location: 100,66 + Actor700: brik + Owner: USSR + Location: 101,66 + Actor702: brik + Owner: USSR + Location: 102,66 + Actor723: brik + Owner: USSR + Location: 103,66 + Actor724: brik + Owner: USSR + Location: 104,66 + Actor725: brik + Owner: USSR + Location: 105,66 + Actor726: brik + Owner: USSR + Location: 106,66 + Actor727: brik + Owner: USSR + Location: 107,66 + Actor729: brik + Owner: USSR + Location: 108,66 + Actor730: brik + Owner: USSR + Location: 95,67 + Actor731: brik + Owner: USSR + Location: 96,67 + Actor732: brik + Owner: USSR + Location: 108,67 + SouthTesla1: tsla + Owner: USSR + Location: 97,67 + SouthTesla2: tsla + Owner: USSR + Location: 89,67 + Actor698: brik + Owner: USSR + Location: 107,72 + Actor734: brik + Owner: USSR + Location: 108,72 + Actor753: brik + Owner: USSR + Location: 101,80 + Actor754: brik + Owner: USSR + Location: 100,80 + Actor755: brik + Owner: USSR + Location: 102,80 + Actor756: brik + Owner: USSR + Location: 102,80 + Actor757: brik + Owner: USSR + Location: 103,80 + Actor758: brik + Owner: USSR + Location: 104,80 + Actor759: brik + Owner: USSR + Location: 106,80 + Actor760: brik + Owner: USSR + Location: 105,80 + Actor761: brik + Owner: USSR + Location: 107,80 + Actor762: brik + Owner: USSR + Location: 108,80 + Actor763: brik + Owner: USSR + Location: 108,79 + Actor764: brik + Owner: USSR + Location: 108,78 + Actor664: fenc + Owner: USSR + Location: 97,70 + Actor665: chain + Owner: USSR + Location: 98,70 + Actor670: chain + Owner: USSR + Location: 99,70 + Actor671: chain + Owner: USSR + Location: 100,70 + Actor672: chain + Owner: USSR + Location: 101,70 + Actor674: chain + Owner: USSR + Location: 102,70 + Actor675: chain + Owner: USSR + Location: 103,70 + Actor676: fenc + Owner: USSR + Location: 104,70 + Actor677: fenc + Owner: USSR + Location: 97,71 + Actor679: chain + Owner: USSR + Location: 98,71 + Actor680: chain + Owner: USSR + Location: 103,71 + Actor681: fenc + Owner: USSR + Location: 104,71 + Actor683: fenc + Owner: USSR + Location: 97,72 + Actor684: chain + Owner: USSR + Location: 98,72 + SouthReactor: npwr + Owner: USSR + Location: 99,72 + Actor687: chain + Owner: USSR + Location: 103,72 + Actor688: fenc + Owner: USSR + Location: 104,72 + Actor689: fenc + Owner: USSR + Location: 97,73 + Actor690: chain + Owner: USSR + Location: 98,73 + Actor691: chain + Owner: USSR + Location: 103,73 + Actor736: fenc + Owner: USSR + Location: 104,73 + Actor738: fenc + Owner: USSR + Location: 97,74 + Actor741: chain + Owner: USSR + Location: 98,74 + Actor742: chain + Owner: USSR + Location: 103,74 + Actor745: fenc + Owner: USSR + Location: 97,75 + Actor746: chain + Owner: USSR + Location: 98,75 + Actor748: chain + Owner: USSR + Location: 99,75 + Actor749: chain + Owner: USSR + Location: 102,75 + Actor750: chain + Owner: USSR + Location: 103,75 + Actor735: brik + Owner: USSR + Location: 107,71 + Actor752: brik + Owner: USSR + Location: 107,76 + Actor765: brik + Owner: USSR + Location: 108,76 + Actor766: brik + Owner: USSR + Location: 107,77 + Actor767: brik + Owner: USSR + Location: 108,77 + NorthFactory: weap + Owner: USSR + Location: 69,15 + Actor751: fix + Owner: USSR + Location: 73,11 + NorthBarracks2: barr + Owner: USSR + Location: 76,7 + Actor769: kenn + Owner: USSR + Location: 78,12 + PatrollerA1: e1 + Owner: USSR + SubCell: 3 + Location: 89,41 + Facing: 384 + PatrollerA2: e1 + Owner: USSR + Location: 89,41 + SubCell: 1 + Facing: 384 + PatrollerA3: e1 + Owner: USSR + Location: 88,41 + SubCell: 3 + Facing: 384 + PatrollerA6: dog + Owner: USSR + Location: 90,41 + SubCell: 3 + Facing: 384 + PatrollerA5: e3 + Owner: USSR + Location: 89,40 + SubCell: 3 + Facing: 384 + Actor776: mine + Owner: Neutral + Location: 87,26 + Actor777: mine + Owner: Neutral + Location: 89,18 + SouthBarracks: barr + Owner: USSR + Location: 94,72 + SouthKennel: kenn + Owner: USSR + Location: 91,70 + NorthTesla5: tsla + Owner: USSR + Location: 65,18 + NorthTesla6: tsla + Owner: USSR + Location: 65,10 + Actor787: ftur + Owner: USSR + Location: 63,16 + Actor788: ftur + Owner: USSR + Location: 63,12 + Actor790: brik + Owner: USSR + Location: 15,12 + Actor791: brik + Owner: USSR + Location: 16,12 + Actor792: brik + Owner: USSR + Location: 17,12 + Actor793: brik + Owner: USSR + Location: 18,12 + Actor794: brik + Owner: USSR + Location: 19,12 + Actor795: brik + Owner: USSR + Location: 20,12 + Actor796: brik + Owner: USSR + Location: 21,12 + Actor797: brik + Owner: USSR + Location: 22,12 + Actor798: brik + Owner: USSR + Location: 23,12 + Actor799: brik + Owner: USSR + Location: 24,12 + Actor800: brik + Owner: USSR + Location: 25,12 + Actor801: brik + Owner: USSR + Location: 29,12 + Actor802: brik + Owner: USSR + Location: 30,12 + Actor803: brik + Owner: USSR + Location: 30,12 + Actor804: brik + Owner: USSR + Location: 31,12 + Actor805: brik + Owner: USSR + Location: 32,12 + Actor806: brik + Owner: USSR + Location: 33,12 + Actor807: brik + Owner: USSR + Location: 34,12 + Actor808: brik + Owner: USSR + Location: 35,12 + Actor809: brik + Owner: USSR + Location: 36,12 + Actor810: brik + Owner: USSR + Location: 37,12 + Actor811: brik + Owner: USSR + Location: 38,12 + Actor812: brik + Owner: USSR + Location: 15,13 + Actor813: brik + Owner: USSR + Location: 24,13 + Actor814: brik + Owner: USSR + Location: 25,13 + Actor815: brik + Owner: USSR + Location: 29,13 + Actor816: brik + Owner: USSR + Location: 30,13 + Actor817: brik + Owner: USSR + Location: 30,13 + Actor818: fact + Owner: USSR + Location: 35,13 + Actor819: brik + Owner: USSR + Location: 38,13 + Actor820: brik + Owner: USSR + Location: 15,14 + Actor821: brik + Owner: USSR + Location: 38,14 + Actor822: brik + Owner: USSR + Location: 15,15 + Actor824: brik + Owner: USSR + Location: 38,15 + Actor825: brik + Owner: USSR + Location: 15,16 + Actor827: brik + Owner: USSR + Location: 38,16 + Actor828: brik + Owner: USSR + Location: 38,17 + Actor829: brik + Owner: USSR + Location: 38,18 + Actor850: brik + Owner: USSR + Location: 15,22 + Actor854: brik + Owner: USSR + Location: 15,23 + Actor858: brik + Owner: USSR + Location: 38,23 + Actor859: brik + Owner: USSR + Location: 15,24 + Actor865: brik + Owner: USSR + Location: 38,24 + Actor866: brik + Owner: USSR + Location: 15,25 + Actor867: brik + Owner: USSR + Location: 15,26 + Actor868: brik + Owner: USSR + Location: 15,27 + Actor870: brik + Owner: USSR + Location: 38,27 + Actor871: brik + Owner: USSR + Location: 15,28 + Actor873: brik + Owner: USSR + Location: 38,28 + Actor874: brik + Owner: USSR + Location: 15,29 + Actor875: brik + Owner: USSR + Location: 38,29 + Actor876: brik + Owner: USSR + Location: 15,30 + Actor877: brik + Owner: USSR + Location: 16,30 + Actor878: brik + Owner: USSR + Location: 37,30 + Actor879: brik + Owner: USSR + Location: 38,30 + Actor880: brik + Owner: USSR + Location: 15,31 + Actor881: brik + Owner: USSR + Location: 16,31 + Actor882: brik + Owner: USSR + Location: 17,31 + Actor883: brik + Owner: USSR + Location: 18,31 + Actor884: brik + Owner: USSR + Location: 19,31 + Actor885: brik + Owner: USSR + Location: 20,31 + Actor886: brik + Owner: USSR + Location: 21,31 + Actor887: brik + Owner: USSR + Location: 22,31 + Actor888: brik + Owner: USSR + Location: 23,31 + Actor889: brik + Owner: USSR + Location: 24,31 + Actor893: brik + Owner: USSR + Location: 28,31 + Actor894: brik + Owner: USSR + Location: 29,31 + Actor895: brik + Owner: USSR + Location: 30,31 + Actor896: brik + Owner: USSR + Location: 31,31 + Actor897: brik + Owner: USSR + Location: 32,31 + Actor898: brik + Owner: USSR + Location: 33,31 + Actor899: brik + Owner: USSR + Location: 34,31 + Actor900: brik + Owner: USSR + Location: 35,31 + Actor901: brik + Owner: USSR + Location: 36,31 + Actor902: brik + Owner: USSR + Location: 37,31 + Actor903: brik + Owner: USSR + Location: 38,31 + Actor848: proc + Owner: USSR + Location: 31,20 + Actor830: chain + Owner: USSR + Location: 23,18 + Actor831: chain + Owner: USSR + Location: 24,18 + Actor832: chain + Owner: USSR + Location: 25,18 + Actor833: chain + Owner: USSR + Location: 26,18 + Actor834: chain + Owner: USSR + Location: 27,18 + Actor835: chain + Owner: USSR + Location: 28,18 + Actor839: chain + Owner: USSR + Location: 23,19 + Actor840: chain + Owner: USSR + Location: 28,19 + WestReactor: npwr + Owner: USSR + Location: 24,20 + Actor847: chain + Owner: USSR + Location: 28,20 + Actor852: chain + Owner: USSR + Location: 28,21 + Actor856: chain + Owner: USSR + Location: 28,22 + Actor860: chain + Owner: USSR + Location: 23,23 + Actor861: chain + Owner: USSR + Location: 24,23 + Actor862: chain + Owner: USSR + Location: 27,23 + Actor863: chain + Owner: USSR + Location: 28,23 + TopSilo: mslo + Owner: USSR + Location: 5,5 + Actor905: chain + Owner: USSR + Location: 4,4 + Actor906: chain + Owner: USSR + Location: 4,5 + Actor907: chain + Owner: USSR + Location: 5,4 + Actor908: chain + Owner: USSR + Location: 6,4 + Actor909: chain + Owner: USSR + Location: 7,4 + Actor911: chain + Owner: USSR + Location: 7,6 + Actor912: chain + Owner: USSR + Location: 4,6 + Actor913: chain + Owner: USSR + Location: 5,6 + Actor914: chain + Owner: USSR + Location: 7,5 + Actor915: chain + Owner: USSR + Location: 4,19 + Actor916: chain + Owner: USSR + Location: 4,20 + Actor917: chain + Owner: USSR + Location: 4,21 + BottomSilo: mslo + Owner: USSR + Location: 5,20 + Actor924: chain + Owner: USSR + Location: 6,21 + Actor932: chain + Owner: USSR + Location: 7,21 + Actor933: chain + Owner: USSR + Location: 5,19 + Actor934: chain + Owner: USSR + Location: 6,19 + Actor935: chain + Owner: USSR + Location: 7,19 + Actor937: chain + Owner: USSR + Location: 7,20 + Actor836: brik + Owner: USSR + Location: 38,19 + Actor841: brik + Owner: USSR + Location: 37,19 + Actor842: brik + Owner: USSR + Location: 37,18 + Actor910: brik + Owner: USSR + Location: 38,24 + Actor918: brik + Owner: USSR + Location: 38,25 + Actor919: brik + Owner: USSR + Location: 38,26 + Actor857: brik + Owner: USSR + Location: 37,23 + Actor849: brik + Owner: USSR + Location: 37,24 + Actor837: brik + Owner: USSR + Location: 15,18 + Actor838: brik + Owner: USSR + Location: 15,17 + Actor843: brik + Owner: USSR + Location: 16,17 + Actor844: brik + Owner: USSR + Location: 16,18 + Actor823: brik + Owner: USSR + Location: 16,22 + Actor826: brik + Owner: USSR + Location: 16,23 + ShoreSAM1: sam + Owner: USSR + Location: 58,35 + Actor630: fenc + Owner: USSR + Location: 58,36 + Actor654: fenc + Owner: USSR + Location: 60,36 + Actor655: fenc + Owner: USSR + Location: 59,36 + Actor656: fenc + Owner: USSR + Location: 57,36 + Actor657: fenc + Owner: USSR + Location: 60,35 + Actor785: silo + Owner: USSR + Location: 79,14 + Actor864: silo + Owner: USSR + Location: 81,14 + Actor869: silo + Owner: USSR + Location: 33,20 + Actor872: silo + Owner: USSR + Location: 31,20 + Actor920: sam + Owner: USSR + Location: 9,5 + Actor921: sam + Owner: USSR + Location: 4,9 + Actor923: sam + Owner: USSR + Location: 5,17 + Actor925: sam + Owner: USSR + Location: 8,24 + WestFactory: weap + Owner: USSR + Location: 17,26 + Actor927: stek + Owner: USSR + Location: 16,13 + NorthRadar: dome + Owner: USSR + Location: 70,8 + WestRadar: dome + Owner: USSR + Location: 34,27 + WestTesla1: tsla + Owner: USSR + Location: 37,17 + WestTesla2: tsla + Owner: USSR + Location: 37,25 + Actor940: ftur + Owner: USSR + Location: 39,23 + Actor941: ftur + Owner: USSR + Location: 39,19 + Actor942: brik + Owner: USSR + Location: 24,30 + Actor943: brik + Owner: USSR + Location: 23,30 + Actor944: brik + Owner: USSR + Location: 28,30 + Actor945: brik + Owner: USSR + Location: 29,30 + WestTesla3: tsla + Owner: USSR + Location: 30,30 + WestTesla4: tsla + Owner: USSR + Location: 22,30 + WestBarracks: barr + Owner: USSR + Location: 32,13 + Actor930: fix + Owner: USSR + Location: 28,26 + WestKennel: kenn + Owner: USSR + Location: 32,17 + Actor936: sam + Owner: USSR + Location: 20,14 + Actor946: ftur + Owner: USSR + Location: 24,32 + Actor947: ftur + Owner: USSR + Location: 28,32 + Actor948: ftur + Owner: USSR + Location: 83,43 + Actor949: ftur + Owner: USSR + Location: 83,39 + EastTesla2: tsla + Owner: USSR + Location: 85,37 + Actor951: ftur + Owner: USSR + Location: 96,35 + Actor952: ftur + Owner: USSR + Location: 100,35 + Actor953: tc05 + Owner: Neutral + Faction: russia + Location: 59,8 + Actor954: tc04 + Owner: Neutral + Faction: russia + Location: 49,10 + Actor955: t15 + Owner: Neutral + Faction: russia + Location: 45,5 + Actor956: t10 + Owner: Neutral + Faction: russia + Location: 44,1 + Actor957: t12 + Owner: Neutral + Faction: russia + Location: 46,9 + Actor958: t17 + Owner: Neutral + Faction: russia + Location: 46,17 + Actor959: tc02 + Owner: Neutral + Faction: russia + Location: 49,32 + Actor960: tc01 + Owner: Neutral + Faction: russia + Location: 43,41 + Actor961: t05 + Owner: Neutral + Faction: russia + Location: 43,45 + Actor962: t07 + Owner: Neutral + Faction: russia + Location: 41,44 + Actor964: t06 + Owner: Neutral + Faction: russia + Location: 40,44 + Actor965: t07 + Owner: Neutral + Faction: russia + Location: 48,41 + Actor966: tc04 + Owner: Neutral + Faction: russia + Location: 40,33 + Actor967: t15 + Owner: Neutral + Faction: russia + Location: 41,34 + Actor968: t12 + Owner: Neutral + Faction: russia + Location: 39,34 + Actor969: t16 + Owner: Neutral + Faction: russia + Location: 16,36 + Actor970: tc05.husk + Owner: Neutral + Location: 28,61 + Actor971: tc01.husk + Owner: Neutral + Location: 33,51 + Actor973: t06.husk + Owner: Neutral + Location: 33,55 + Actor974: t12.husk + Owner: Neutral + Location: 29,53 + Actor972: tc02.husk + Owner: Neutral + Location: 36,57 + Actor975: t12.husk + Owner: Neutral + Location: 34,63 + Actor976: t10.husk + Owner: Neutral + Location: 17,41 + Actor977: tc02.husk + Owner: Neutral + Location: 18,39 + Actor978: tc04.husk + Owner: Neutral + Location: 10,41 + Actor980: t15.husk + Owner: Neutral + Location: 11,38 + Actor981: t11.husk + Owner: Neutral + Location: 11,29 + Actor982: t15.husk + Owner: Neutral + Location: 12,36 + Actor983: t14.husk + Owner: Neutral + Location: 10,36 + Actor984: t12.husk + Owner: Neutral + Location: 14,39 + Actor985: tc04.husk + Owner: Neutral + Location: 10,33 + Actor986: tc05.husk + Owner: Neutral + Location: 7,30 + Actor987: t14.husk + Owner: Neutral + Location: 8,32 + Actor988: t12.husk + Owner: Neutral + Location: 3,29 + Actor989: t07.husk + Owner: Neutral + Location: 11,31 + Actor990: t10.husk + Owner: Neutral + Location: 12,35 + Actor991: t13.husk + Owner: Neutral + Location: 7,35 + Actor992: t06.husk + Owner: Neutral + Location: 2,38 + Actor993: tc02.husk + Owner: Neutral + Location: 2,33 + Actor994: t14.husk + Owner: Neutral + Location: 4,33 + Actor995: t17.husk + Owner: Neutral + Location: 8,39 + Actor996: t16.husk + Owner: Neutral + Location: 4,42 + Actor997: tc01.husk + Owner: Neutral + Location: 4,38 + Actor998: tc01.husk + Owner: Neutral + Location: 38,75 + Actor999: t14.husk + Owner: Neutral + Location: 35,76 + Actor1000: t12.husk + Owner: Neutral + Location: 34,75 + Actor1002: t10.husk + Owner: Neutral + Location: 34,69 + Actor1003: t13.husk + Owner: Neutral + Location: 33,68 + Actor1004: t16.husk + Owner: Neutral + Location: 42,77 + Actor1006: tc01.husk + Owner: Neutral + Location: 46,61 + Actor1007: t15.husk + Owner: Neutral + Location: 38,63 + Actor1008: t07.husk + Owner: Neutral + Location: 49,61 + Actor1009: t06.husk + Owner: Neutral + Location: 52,64 + Actor1010: tc01.husk + Owner: Neutral + Location: 50,65 + Actor1011: t15.husk + Owner: Neutral + Location: 55,67 + Actor1012: tc04.husk + Owner: Neutral + Location: 52,74 + Actor1013: tc01.husk + Owner: Neutral + Location: 49,76 + Actor1014: tc03.husk + Owner: Neutral + Location: 42,69 + Actor1015: t15.husk + Owner: Neutral + Location: 40,70 + Actor1016: t16.husk + Owner: Neutral + Location: 55,78 + Actor1017: t17.husk + Owner: Neutral + Location: 28,47 + Actor102: t02.husk + Owner: Neutral + Location: 23,45 + Actor963: tc05 + Owner: Neutral + Location: 28,40 + Actor1001: t17 + Owner: Neutral + Location: 37,42 + Actor1005: tc03 + Owner: Neutral + Location: 47,48 + Actor1018: t16 + Owner: Neutral + Location: 48,46 + Actor1019: t11.husk + Owner: Neutral + Location: 39,50 + Actor1020: t15.husk + Owner: Neutral + Location: 34,50 + Actor1021: t05.husk + Owner: Neutral + Location: 32,45 + Actor1022: t17.husk + Owner: Neutral + Location: 41,66 + Actor1023: tc05 + Owner: Neutral + Location: 10,15 + Actor1025: t17 + Owner: Neutral + Location: 7,23 + Actor1026: t11 + Owner: Neutral + Location: 9,22 + Actor1027: t13 + Owner: Neutral + Location: 13,25 + Actor1028: tc01 + Owner: Neutral + Location: 5,11 + Actor1029: t07 + Owner: Neutral + Location: 3,8 + Actor1030: t01 + Owner: Neutral + Location: 10,3 + Actor1031: tc03 + Owner: Neutral + Location: 8,4 + Actor1032: tc02 + Owner: Neutral + Location: 4,2 + Actor1033: tc02 + Owner: Neutral + Location: 9,8 + Actor1034: t10 + Owner: Neutral + Location: 9,7 + Actor1035: t12 + Owner: Neutral + Location: 8,8 + Actor1036: t15 + Owner: Neutral + Location: 22,10 + Actor1037: t12 + Owner: Neutral + Location: 27,4 + Actor1040: t02 + Owner: Neutral + Location: 22,3 + Actor1041: t01 + Owner: Neutral + Location: 20,8 + Actor1042: t07 + Owner: Neutral + Location: 4,25 + Actor1043: t13 + Owner: Neutral + Location: 3,16 + Actor1044: tc02 + Owner: Neutral + Location: 3,15 + Actor1045: t02 + Owner: Neutral + Location: 5,14 + Actor1046: t01 + Owner: Neutral + Location: 4,14 + Actor1047: t01 + Owner: Neutral + Location: 8,15 + Actor1051: t07 + Owner: Neutral + Location: 58,19 + Actor1052: t15 + Owner: Neutral + Location: 55,20 + Actor1056: tc04 + Owner: Neutral + Location: 72,0 + Actor1057: tc01 + Owner: Neutral + Location: 79,2 + Actor1058: t15 + Owner: Neutral + Location: 74,1 + Actor1059: t15 + Owner: Neutral + Location: 74,1 + Actor1061: t17 + Owner: Neutral + Location: 78,1 + Actor1064: tc01 + Owner: Neutral + Location: 54,5 + Actor1065: t16 + Owner: Neutral + Location: 53,5 + Actor1066: t07 + Owner: Neutral + Location: 56,4 + Actor1067: mine + Owner: Neutral + Location: 44,14 + Actor1068: mine + Owner: Neutral + Location: 20,34 + Actor1069: t11 + Owner: Neutral + Location: 41,26 + Actor1070: t02 + Owner: Neutral + Location: 45,28 + Actor1071: t06 + Owner: Neutral + Location: 32,34 + Actor1072: t07 + Owner: Neutral + Location: 28,36 + Actor1073: t05 + Owner: Neutral + Location: 51,40 + Actor1074: t02 + Owner: Neutral + Location: 57,30 + Actor1075: t07 + Owner: Neutral + Location: 56,42 + Actor1076: t11 + Owner: Neutral + Location: 58,39 + Actor1077: tc01 + Owner: Neutral + Location: 60,45 + Actor1078: t12 + Owner: Neutral + Location: 57,43 + Actor1079: t11 + Owner: Neutral + Location: 55,54 + Actor1080: tc04 + Owner: Neutral + Location: 56,51 + Actor1083: t12 + Owner: Neutral + Location: 66,59 + Actor1084: t05 + Owner: Neutral + Location: 59,57 + Actor1085: t02 + Owner: Neutral + Location: 54,59 + Actor1086: tc04 + Owner: Neutral + Location: 66,69 + Actor1087: tc03 + Owner: Neutral + Location: 68,68 + Actor1088: t06 + Owner: Neutral + Location: 67,67 + Actor1089: t02 + Owner: Neutral + Location: 64,78 + Actor1090: t14 + Owner: Neutral + Location: 61,77 + Actor1091: t17 + Owner: Neutral + Location: 64,52 + Actor1092: tc01 + Owner: Neutral + Location: 83,70 + Actor1093: tc05 + Owner: Neutral + Location: 109,48 + Actor1094: tc02 + Owner: Neutral + Location: 75,31 + Actor1095: t12 + Owner: Neutral + Location: 80,28 + Actor1096: t17 + Owner: Neutral + Location: 76,43 + Actor1097: t12 + Owner: Neutral + Location: 87,77 + Actor1098: t12 + Owner: Neutral + Location: 87,77 + Actor1099: t16 + Owner: Neutral + Location: 106,60 + Actor1100: t02 + Owner: Neutral + Location: 111,63 + Actor1101: tc03 + Owner: Neutral + Location: 105,11 + PatrolA6: waypoint + Owner: Neutral + Location: 89,49 + PatrolA5: waypoint + Owner: Neutral + Location: 90,50 + PatrolA4: waypoint + Owner: Neutral + Location: 99,50 + PatrolA3: waypoint + Owner: Neutral + Location: 100,49 + PatrolA2: waypoint + Owner: Neutral + Location: 100,41 + PatrolA7: waypoint + Owner: Neutral + Location: 80,41 + PatrolA8: waypoint + Owner: Neutral + Location: 79,40 + PatrolA9: waypoint + Owner: Neutral + Location: 79,27 + PatrolA1: waypoint + Owner: Neutral + Location: 89,41 + PatrollerA4: e4 + Owner: USSR + SubCell: 3 + Location: 89,42 + Facing: 384 + PatrollerB4: dog + Owner: USSR + SubCell: 3 + Location: 83,75 + Facing: 384 + PatrollerB2: e1 + Owner: USSR + Location: 84,75 + SubCell: 3 + Facing: 384 + PatrollerB5: e1 + Owner: USSR + Location: 82,75 + SubCell: 3 + Facing: 384 + PatrollerB3: e1 + Owner: USSR + SubCell: 1 + Location: 84,75 + Facing: 384 + PatrollerB6: e2 + Owner: USSR + Location: 82,75 + SubCell: 1 + Facing: 384 + PatrolB1: waypoint + Owner: Neutral + Location: 83,75 + PatrolB2: waypoint + Owner: Neutral + Location: 93,75 + PatrolB3: waypoint + Owner: Neutral + Location: 93,50 + PatrolB4: waypoint + Owner: Neutral + Location: 95,75 + PatrolB5: waypoint + Owner: Neutral + Location: 97,77 + PatrolB6: waypoint + Owner: Neutral + Location: 104,77 + PatrolB7: waypoint + Owner: Neutral + Location: 105,76 + PatrolB8: waypoint + Owner: Neutral + Location: 105,74 + PatrolB9: waypoint + Owner: Neutral + Location: 112,74 + BoatPatrol1: waypoint + Owner: Neutral + Location: 73,76 + PatrolBoat: seas + Owner: USSR + Location: 73,75 + Facing: 512 + Actor846: e1 + Owner: USSR + Location: 95,35 + SubCell: 3 + Facing: 1007 + Actor904: e1 + Owner: USSR + Location: 101,35 + SubCell: 3 + Facing: 1023 + Actor922: e1 + Owner: USSR + SubCell: 3 + Location: 97,36 + Facing: 872 + Actor1102: e1 + Owner: USSR + SubCell: 3 + Location: 99,36 + Facing: 166 + Actor1103: e2 + Owner: USSR + SubCell: 3 + Location: 105,47 + Facing: 911 + Actor1104: e2 + Owner: USSR + SubCell: 3 + Location: 106,48 + Facing: 1023 + Actor1105: dog + Owner: USSR + SubCell: 3 + Location: 78,21 + Facing: 666 + PatrollerC6: e1 + Owner: USSR + SubCell: 3 + Location: 64,76 + Facing: 384 + PatrollerC5: e1 + Owner: USSR + Location: 64,76 + SubCell: 1 + Facing: 384 + PatrollerC4: e1 + Owner: USSR + SubCell: 3 + Location: 65,75 + Facing: 384 + PatrollerC8: e4 + Owner: USSR + SubCell: 3 + Location: 65,77 + Facing: 384 + PatrollerC7: e2 + Owner: USSR + Location: 64,77 + SubCell: 3 + Facing: 384 + PatrollerC2: e2 + Owner: USSR + SubCell: 3 + Location: 66,74 + Facing: 384 + PatrollerC3: e1 + Owner: USSR + SubCell: 1 + Location: 66,74 + Facing: 384 + PatrollerC1: e1 + Owner: USSR + Location: 66,74 + SubCell: 2 + Facing: 384 + Actor1063: brik + Owner: USSR + Location: 67,7 + Actor1106: brik + Owner: USSR + Location: 67,8 + Actor1109: brik + Owner: USSR + Location: 65,8 + Actor1053: brik + Owner: USSR + Location: 68,7 + Actor1107: brik + Owner: USSR + Location: 68,8 + PatrollerD2: e1 + Owner: USSR + SubCell: 3 + Location: 48,8 + Facing: 384 + PatrollerD3: e1 + Owner: USSR + Location: 48,8 + SubCell: 1 + Facing: 384 + PatrollerD4: dog + Owner: USSR + SubCell: 3 + Location: 47,8 + Facing: 384 + PatrollerD1: e1 + Owner: USSR + Location: 48,9 + SubCell: 3 + Facing: 384 + PatrollerD6: e4 + Owner: USSR + Location: 47,7 + SubCell: 3 + Facing: 384 + PatrollerD5: e2 + Owner: USSR + Location: 46,8 + SubCell: 3 + Facing: 384 + PatrolD1: waypoint + Owner: Neutral + Location: 48,8 + PatrolD2: waypoint + Owner: Neutral + Location: 48,36 + V21: v2rl + Owner: USSR + Location: 78,18 + Facing: 523 + V22: v2rl + Owner: USSR + Location: 19,4 + Facing: 682 + Actor1111: ftur + Owner: USSR + Location: 63,42 + Actor1112: ftur + Owner: USSR + Location: 68,67 + PatrollerE1: e1 + Owner: USSR + SubCell: 3 + Location: 27,11 + Facing: 384 + PatrollerE2: dog + Owner: USSR + Location: 27,10 + SubCell: 3 + Facing: 384 + PatrollerE5: e1 + Owner: USSR + SubCell: 3 + Location: 27,9 + Facing: 384 + PatrollerE6: e4 + Owner: USSR + SubCell: 1 + Location: 27,9 + Facing: 384 + PatrollerE3: e2 + Owner: USSR + Location: 26,10 + SubCell: 3 + Facing: 384 + PatrollerE4: e3 + Owner: USSR + Location: 28,10 + SubCell: 3 + Facing: 384 + PatrolE1: waypoint + Owner: Neutral + Location: 27,12 + PatrolE2: waypoint + Owner: Neutral + Location: 27,15 + PatrolE3: waypoint + Owner: Neutral + Location: 26,16 + PatrolE4: waypoint + Owner: Neutral + Location: 20,16 + PatrolE5: waypoint + Owner: Neutral + Location: 20,20 + PatrolE6: waypoint + Owner: Neutral + Location: 12,20 + PatrolE7: waypoint + Owner: Neutral + Location: 20,24 + PatrolE8: waypoint + Owner: Neutral + Location: 21,25 + PatrolE9: waypoint + Owner: Neutral + Location: 34,25 + PatrolE10: waypoint + Owner: Neutral + Location: 35,24 + PatrolE11: waypoint + Owner: Neutral + Location: 35,21 + Actor1113: v2rl + Owner: USSR + Location: 36,30 + Facing: 634 + Actor1115: apoc + Owner: USSR + Location: 37,73 + Facing: 769 + Actor1116: e1 + Owner: USSR + SubCell: 3 + Location: 36,72 + Facing: 682 + Actor1117: e1 + Owner: USSR + Location: 36,72 + SubCell: 1 + Facing: 761 + Actor1118: e1 + Owner: USSR + SubCell: 3 + Location: 36,75 + Facing: 848 + Actor1119: e4 + Owner: USSR + SubCell: 3 + Location: 36,71 + Facing: 650 + Actor1120: e4 + Owner: USSR + SubCell: 3 + Location: 37,70 + Facing: 705 + Actor1121: e2 + Owner: USSR + SubCell: 3 + Location: 37,76 + Facing: 824 + Actor1122: e2 + Owner: USSR + Location: 37,76 + SubCell: 1 + Facing: 713 + Actor1123: 4tnk + Owner: USSR + Location: 34,58 + Facing: 1015 + Actor1124: e1 + Owner: USSR + SubCell: 3 + Location: 33,57 + Facing: 816 + Actor1125: e1 + Owner: USSR + Location: 33,57 + SubCell: 1 + Facing: 991 + Actor1126: e1 + Owner: USSR + SubCell: 3 + Location: 36,59 + Facing: 384 + Actor1127: e1 + Owner: USSR + SubCell: 3 + Location: 39,58 + Facing: 166 + Actor1128: e4 + Owner: USSR + SubCell: 3 + Location: 38,59 + Facing: 1023 + Actor1129: e3 + Owner: USSR + SubCell: 3 + Location: 35,60 + Facing: 943 + Actor1130: dog + Owner: USSR + SubCell: 3 + Location: 35,57 + Facing: 1023 + Actor1131: e1 + Owner: USSR + SubCell: 3 + Location: 21,4 + Facing: 499 + Actor1132: e1 + Owner: USSR + SubCell: 3 + Location: 19,5 + Facing: 626 + Actor1133: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 8,6 + Actor1134: e2 + Owner: USSR + SubCell: 3 + Location: 9,12 + Facing: 896 + Actor1135: e2 + Owner: USSR + SubCell: 3 + Location: 10,13 + Facing: 1023 + Actor1136: e1 + Owner: USSR + SubCell: 3 + Location: 8,10 + Facing: 761 + Actor1139: e1 + Owner: USSR + SubCell: 3 + Location: 63,57 + Facing: 384 + Actor1140: e1 + Owner: USSR + Facing: 384 + Location: 63,57 + SubCell: 1 + Actor1141: e1 + Owner: USSR + Location: 65,58 + SubCell: 3 + Facing: 570 + Actor1142: e1 + Owner: USSR + SubCell: 3 + Location: 54,48 + Facing: 793 + Actor1143: e1 + Owner: USSR + Facing: 384 + Location: 54,48 + SubCell: 1 + Actor1144: e1 + Owner: USSR + SubCell: 3 + Location: 55,47 + Facing: 1023 + Actor1146: e1 + Owner: USSR + SubCell: 3 + Location: 64,42 + Facing: 919 + Actor1147: e1 + Owner: USSR + SubCell: 3 + Location: 58,37 + Facing: 697 + Actor1148: e1 + Owner: USSR + Location: 58,37 + SubCell: 1 + Facing: 523 + Actor1149: e1 + Owner: USSR + SubCell: 3 + Location: 61,34 + Facing: 864 + Actor1150: e1 + Owner: USSR + SubCell: 3 + Location: 69,67 + Facing: 880 + Actor1151: e1 + Owner: USSR + Location: 69,67 + SubCell: 1 + Facing: 848 + Actor1152: e1 + Owner: USSR + SubCell: 3 + Location: 61,75 + Facing: 523 + Actor1153: e1 + Owner: USSR + Location: 63,71 + SubCell: 3 + Facing: 1023 + Actor1154: e1 + Owner: USSR + Location: 60,73 + SubCell: 3 + Facing: 610 + Actor1155: e4 + Owner: USSR + Facing: 384 + Location: 75,9 + SubCell: 3 + Actor1158: e1 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 71,11 + Actor1159: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 72,7 + Actor1160: e1 + Owner: USSR + SubCell: 3 + Location: 69,19 + Facing: 800 + Actor1161: e1 + Owner: USSR + SubCell: 3 + Location: 62,18 + Facing: 384 + Actor1162: e1 + Owner: USSR + Location: 61,17 + SubCell: 3 + Facing: 7 + Actor1163: e1 + Owner: USSR + Location: 62,18 + SubCell: 1 + Facing: 118 + Actor1164: e1 + Owner: USSR + SubCell: 3 + Location: 48,4 + Facing: 785 + Actor1167: e1 + Owner: USSR + SubCell: 3 + Location: 51,24 + Facing: 150 + Actor1168: e2 + Owner: USSR + SubCell: 3 + Location: 51,25 + Facing: 0 + Actor1169: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 40,20 + Actor1170: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 25,26 + Actor1171: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 29,23 + PatrollerB1: e4 + Owner: USSR + SubCell: 3 + Location: 85,75 + Facing: 384 + BoatPatrol2: waypoint + Owner: Neutral + Location: 72,50 + CarryallEntryPoint: waypoint + Owner: Neutral + Location: 76,81 + Actor1173: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 83,32 + Actor1175: e2 + Owner: USSR + Facing: 384 + Location: 84,31 + SubCell: 3 + Actor1177: e4 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 84,28 + Actor1178: e4 + Owner: USSR + SubCell: 3 + Location: 78,43 + Facing: 880 + Actor1186: 3tnk + Owner: USSR + Location: 34,47 + Facing: 753 + Actor1187: dog + Owner: USSR + SubCell: 3 + Location: 33,45 + Facing: 642 + Actor1188: e1 + Owner: USSR + SubCell: 1 + Location: 33,45 + Facing: 610 + Actor1189: e1 + Owner: USSR + SubCell: 3 + Location: 33,46 + Facing: 713 + Actor1180: e3 + Owner: USSR + SubCell: 3 + Facing: 0 + Location: 37,51 + Actor1183: dog + Owner: USSR + SubCell: 3 + Location: 36,49 + Facing: 943 + Actor1184: dog + Owner: USSR + SubCell: 3 + Location: 38,51 + Facing: 103 + Actor1081: fenc + Owner: USSR + Location: 58,61 + Actor1179: fenc + Owner: USSR + Location: 53,45 + LandingCraftExit: waypoint + Owner: Neutral + Location: 100,1 + Actor1181: fenc + Owner: USSR + Location: 64,56 + Actor1182: fenc + Owner: USSR + Location: 65,56 + Actor1185: e1 + Owner: USSR + SubCell: 3 + Facing: 888 + Location: 56,58 + Actor1190: e1 + Owner: USSR + SubCell: 1 + Facing: 1023 + Location: 56,58 + Actor608: e1 + Owner: USSR + SubCell: 3 + Location: 80,6 + Facing: 713 + Actor950: e2 + Owner: USSR + Location: 44,2 + SubCell: 1 + Facing: 610 + Actor1137: e2 + Owner: USSR + SubCell: 3 + Location: 9,20 + Facing: 880 + Actor1138: e2 + Owner: USSR + SubCell: 3 + Location: 10,26 + Facing: 384 + Actor1191: e2 + Owner: USSR + Location: 10,26 + SubCell: 1 + Facing: 737 + Actor1192: e2 + Owner: USSR + SubCell: 3 + Location: 8,23 + Facing: 729 + Actor1193: e2 + Owner: USSR + Location: 22,18 + SubCell: 3 + Facing: 214 + Actor1194: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 73,26 + Actor1195: e2 + Owner: USSR + Facing: 384 + SubCell: 1 + Location: 73,26 + Actor1114: e2 + Owner: USSR + Facing: 384 + SubCell: 1 + Location: 95,74 + Actor1174: e2 + Owner: USSR + Location: 96,75 + SubCell: 3 + Facing: 301 + Actor1176: e1 + Owner: USSR + SubCell: 3 + Location: 101,78 + Facing: 317 + Actor1197: e2 + Owner: USSR + SubCell: 3 + Location: 80,77 + Facing: 1023 + Actor1198: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 95,56 + Actor1199: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 61,49 + Actor1200: e2 + Owner: USSR + Facing: 384 + Location: 45,62 + SubCell: 3 + Actor1203: e1 + Owner: USSR + SubCell: 3 + Location: 49,74 + Facing: 1023 + Actor1204: e1 + Owner: USSR + SubCell: 3 + Location: 52,71 + Facing: 1023 + Actor1205: e4 + Owner: USSR + SubCell: 3 + Location: 50,70 + Facing: 158 + Actor1206: e2 + Owner: USSR + SubCell: 3 + Location: 31,39 + Facing: 840 + Actor1207: e2 + Owner: USSR + SubCell: 3 + Location: 18,24 + Facing: 785 + CarryallDropPoint: waypoint + Owner: Neutral + Location: 45,45 + Actor1209: e2 + Owner: USSR + SubCell: 3 + Location: 43,39 + Facing: 642 + Actor1211: e1 + Owner: USSR + SubCell: 3 + Location: 43,33 + Facing: 832 + Actor1212: e1 + Owner: USSR + SubCell: 3 + Location: 31,34 + Facing: 658 + Actor1213: e2 + Owner: USSR + SubCell: 3 + Location: 4,24 + Facing: 626 + Actor1202: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 49,67 + Actor1201: t02 + Owner: Neutral + Location: 61,67 + Actor979: e4 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 73,27 + Actor1145: e4 + Owner: USSR + SubCell: 3 + Facing: 666 + Location: 77,11 + Actor1196: e1 + Owner: USSR + SubCell: 1 + Facing: 483 + Location: 77,11 + Actor1172: ttra + Owner: USSR + Facing: 682 + Location: 35,18 + Actor1156: e1 + Owner: USSR + SubCell: 3 + Location: 96,79 + Facing: 261 + Actor1157: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 91,20 + Actor1208: e1 + Owner: USSR + SubCell: 3 + Location: 27,6 + Facing: 586 + Actor1038: tc02 + Owner: Neutral + Location: 13,2 + Actor1039: ftur + Owner: USSR + Location: 14,11 + Actor1062: chain + Owner: USSR + Location: 23,22 + WestTesla5: tsla + Owner: USSR + Location: 9,19 + Actor1082: t06 + Owner: Neutral + Location: 62,63 + SAPC1: sapc + Owner: Nod + Location: 17,71 + Facing: 128 + SAPC2: sapc + Owner: Nod + Location: 18,70 + Facing: 128 + NodExit: waypoint + Owner: Neutral + Location: 1,56 + SAPCRally1: waypoint + Owner: Neutral + Location: 14,68 + SAPCRally2: waypoint + Owner: Neutral + Location: 15,67 + HealCrate1: healcrate + Owner: Neutral + Location: 108,56 + HealCrate2: healcrate + Owner: Neutral + Location: 60,24 + BoatPatrol3: waypoint + Owner: Neutral + Location: 67,28 + HealCrate3: healcrate + Owner: Neutral + Location: 27,43 + Actor1024: tc02.husk + Owner: Neutral + Location: 7,43 + Actor1054: t16.husk + Owner: Neutral + Location: 7,41 + PatrolC1: waypoint + Owner: Neutral + Location: 65,71 + PatrolC2: waypoint + Owner: Neutral + Location: 64,59 + PatrolC3: waypoint + Owner: Neutral + Location: 61,55 + PatrolC4: waypoint + Owner: Neutral + Location: 61,47 + PatrolC5: waypoint + Owner: Neutral + Location: 61,38 + Actor1210: e1 + Owner: USSR + SubCell: 3 + Facing: 729 + Location: 66,35 + Actor1215: e1 + Owner: USSR + SubCell: 3 + Facing: 737 + Location: 71,37 + Actor1055: e2 + Owner: USSR + Location: 71,36 + SubCell: 1 + Facing: 753 + Actor1060: tc01 + Owner: Neutral + Location: 52,23 + Actor1050: tc03 + Owner: Neutral + Location: 52,25 + Actor1049: tc05 + Owner: Neutral + Location: 52,26 + Actor1048: e1 + Owner: USSR + SubCell: 3 + Location: 53,22 + Facing: 214 + Actor1166: e4 + Owner: USSR + SubCell: 3 + Location: 4,10 + Facing: 808 + Actor1214: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 23,33 + Actor1110: ftur + Owner: USSR + Location: 45,34 + Actor1216: e4 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 44,34 + Actor1217: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 41,32 + Actor1218: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 73,23 + PatrolD3: waypoint + Owner: Neutral + Location: 47,37 + PatrolD4: waypoint + Owner: Neutral + Location: 34,37 + PatrollerC9: dog + Owner: USSR + Location: 65,76 + SubCell: 3 + Facing: 384 + Actor1219: e4 + Owner: USSR + SubCell: 3 + Facing: 919 + Location: 49,34 + Actor1220: e1 + Owner: USSR + SubCell: 3 + Facing: 943 + Location: 50,31 + Actor1108: e1 + Owner: USSR + SubCell: 3 + Facing: 1023 + Location: 47,78 + Actor1165: e1 + Owner: USSR + SubCell: 3 + Facing: 1023 + Location: 45,77 + Actor1221: e2 + Owner: USSR + SubCell: 3 + Location: 88,14 + Facing: 555 + PatrollerC10: shok + Owner: USSR + Location: 65,77 + SubCell: 5 + Facing: 384 + PatrollerA7: shok + Owner: USSR + Location: 87,42 + SubCell: 3 + Facing: 384 + PatrolBoat2: seas + Owner: USSR + Location: 74,66 + Facing: 384 + PatrollerF1: e1 + Owner: USSR + Location: 63,15 + SubCell: 3 + Facing: 384 + PatrollerF2: shok + Owner: USSR + Location: 65,15 + SubCell: 3 + Facing: 384 + PatrollerF3: e2 + Owner: USSR + Location: 64,14 + SubCell: 3 + Facing: 384 + PatrollerF4: e1 + Owner: USSR + Location: 65,14 + SubCell: 1 + Facing: 384 + PatrollerF5: e1 + Owner: USSR + Location: 65,14 + SubCell: 3 + Facing: 384 + PatrollerF6: dog + Owner: USSR + Location: 65,14 + SubCell: 2 + Facing: 384 + PatrollerF7: e1 + Owner: USSR + Location: 66,14 + SubCell: 3 + Facing: 384 + PatrolF1: waypoint + Owner: Neutral + Location: 67,14 + PatrolF2: waypoint + Owner: Neutral + Location: 49,14 + PatrolF3: waypoint + Owner: Neutral + Location: 49,22 + PatrolF4: waypoint + Owner: Neutral + Location: 35,22 + BrutalOnlyV2_2: v2rl + Owner: USSR + Location: 100,77 + Facing: 256 + BrutalOnlyV2_1: v2rl + Owner: USSR + Location: 75,40 + Facing: 384 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-coalitions.yaml, ca|rules/custom/commando-mission.yaml, ca|missions/main-campaign/ca04-containment/containment-rules.yaml, ca|rules/custom/coop-rules.yaml, containment-coop-rules.yaml + +Sequences: ca|missions/main-campaign/ca04-containment/containment-sequences.yaml + +Weapons: ca|weapons/custom/campaign.yaml, ca|missions/main-campaign/ca04-containment/containment-weapons.yaml diff --git a/mods/ca/missions/coop-campaign/ca05-apprehension-coop/apprehension-coop-rules.yaml b/mods/ca/missions/coop-campaign/ca05-apprehension-coop/apprehension-coop-rules.yaml new file mode 100644 index 0000000000..bf56a6c0f3 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca05-apprehension-coop/apprehension-coop-rules.yaml @@ -0,0 +1,15 @@ +World: + LuaScript: + Scripts: campaign.lua, coop.lua, ca|missions/main-campaign/ca05-apprehension/apprehension.lua, apprehension-coop.lua + ScriptLobbyDropdown@SQUADCOMP: + ID: squadcomp + Label: Unit Assignment + Description: How the starting units are assigned among players.\nStandard: All units get spread evenly among players regardless of type\nClass Based: Units get assigned depending on player count in the following Order:\n- Player 1: All Units\n- Player 2: All Infantry and APC's\n- Player 3: Rangers, Medics and Mechanics\n- Player 4: Rangers\n- Player 5: Half of the Snipers\n- Player 6: Half the Mirage Tanks + Values: + normal: Standard + class: Class Based + Default: class + DisplayOrder: 1 + LobbyMissionInfo@InitialObjectives: + Prefix: Initial Objectives + Text: • Destroy all Nod SAM Sites.\n• Clear the Nod base and apprehend the cloaked transports. diff --git a/mods/ca/missions/coop-campaign/ca05-apprehension-coop/apprehension-coop.lua b/mods/ca/missions/coop-campaign/ca05-apprehension-coop/apprehension-coop.lua new file mode 100644 index 0000000000..a6890327ec --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca05-apprehension-coop/apprehension-coop.lua @@ -0,0 +1,105 @@ + +SetupPlayers = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Multi2 = Player.GetPlayer("Multi2") + Multi3 = Player.GetPlayer("Multi3") + Multi4 = Player.GetPlayer("Multi4") + Multi5 = Player.GetPlayer("Multi5") + Greece = Player.GetPlayer("Greece") + Nod = Player.GetPlayer("Nod") + England = Player.GetPlayer("England") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = Utils.Where({ Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 }, function(p) return p ~= nil end) + MissionEnemies = { Nod } + SinglePlayerPlayer = Greece + StopSpread = true + TechShared = false + CoopInit() +end + +AfterWorldLoaded = function() + SpreadType = Map.LobbyOptionOrDefault("squadcomp", "class") + + if SpreadType == "class" then + local teamSnipers = Greece.GetActorsByType("snip") + local teamMirages = Greece.GetActorsByType("rtnk") + local teamRangers = Greece.GetActorsByType("jeep") + local teamAPCs = Greece.GetActorsByType("apc") + local teamHealers = Greece.GetActorsByTypes({"medi","mech"}) + Utils.Do(teamSnipers,function(UID) + UID.Owner = MissionPlayers[1] + end) + Utils.Do(teamMirages,function(UID) + UID.Owner = MissionPlayers[1] + end) + Utils.Do(teamRangers,function(UID) + UID.Owner = MissionPlayers[1] + end) + Utils.Do(teamAPCs,function(UID) + UID.Owner = MissionPlayers[1] + end) + Utils.Do(teamHealers,function(UID) + UID.Owner = MissionPlayers[1] + end) + + if #MissionPlayers >= 2 then + Utils.Do(teamSnipers,function(UID) + UID.Owner = MissionPlayers[2] + end) + Utils.Do(teamHealers,function(UID) + UID.Owner = MissionPlayers[2] + end) + Utils.Do(teamAPCs,function(UID) + UID.Owner = MissionPlayers[2] + end) + end + if #MissionPlayers >= 3 then + Utils.Do(teamRangers,function(UID) + UID.Owner = MissionPlayers[3] + end) + Utils.Do(teamAPCs,function(UID) + UID.Owner = MissionPlayers[3] + end) + Utils.Do(teamHealers,function(UID) + UID.Owner = MissionPlayers[3] + end) + end + if #MissionPlayers >= 4 then + Utils.Do(teamRangers,function(UID) + UID.Owner = MissionPlayers[4] + end) + end + if #MissionPlayers >= 5 then + local SpreadIterator = 5 + Utils.Do(teamSnipers,function(UID) + if SpreadIterator == 5 then + UID.Owner = MissionPlayers[SpreadIterator] + SpreadIterator = 2 + else + UID.Owner = MissionPlayers[SpreadIterator] + SpreadIterator = 5 + end + end) + end + if #MissionPlayers >= 6 then + local SpreadIterator = 6 + Utils.Do(teamMirages,function(UID) + if SpreadIterator == 6 then + UID.Owner = MissionPlayers[SpreadIterator] + SpreadIterator = 1 + else + UID.Owner = MissionPlayers[SpreadIterator] + SpreadIterator = 6 + end + end) + end + else + local allUnits = Greece.GetActorsByTypes({ "snip", "rtnk", "jeep", "apc", "medi", "mech" }) + AssignToCoopPlayers(allUnits) + end +end + +AfterTick = function() + +end diff --git a/mods/ca/missions/coop-campaign/ca05-apprehension-coop/map.bin b/mods/ca/missions/coop-campaign/ca05-apprehension-coop/map.bin new file mode 100644 index 0000000000..19bd7a2677 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca05-apprehension-coop/map.bin differ diff --git a/mods/ca/missions/coop-campaign/ca05-apprehension-coop/map.png b/mods/ca/missions/coop-campaign/ca05-apprehension-coop/map.png new file mode 100644 index 0000000000..6f8adbdee8 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca05-apprehension-coop/map.png differ diff --git a/mods/ca/missions/coop-campaign/ca05-apprehension-coop/map.yaml b/mods/ca/missions/coop-campaign/ca05-apprehension-coop/map.yaml new file mode 100644 index 0000000000..837dd21f37 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca05-apprehension-coop/map.yaml @@ -0,0 +1,8045 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 05: Apprehension Co-op + +Author: Darkademic & Gandorques Hikla + +Tileset: TEMPERAT + +MapSize: 98,98 + +Bounds: 1,1,96,96 + +Visibility: Lobby + +Categories: Co-op Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, England, Nod, NodTransports + PlayerReference@Greece: + Name: Greece + Faction: allies + Color: 99ACF2 + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, England + Enemies: Nod, Creeps + PlayerReference@Nod: + Name: Nod + Bot: campaign + Faction: nod + Color: FE1100 + Enemies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, England, Creeps + PlayerReference@England: + Name: England + Faction: allies + Color: A1EF8C + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Nod + PlayerReference@NodTransports: + Name: NodTransports + Bot: dormant + Faction: nod + Color: E6E6FF + Enemies: Creeps + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 99ACF2 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, England + Enemies: Nod, Creeps + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 0B7310 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, England + Enemies: Nod, Creeps + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 134691 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, England + Enemies: Nod, Creeps + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 775A12 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, England + Enemies: Nod, Creeps + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 994050 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, England + Enemies: Nod, Creeps + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: EEA8A8 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, England + Enemies: Nod, Creeps + +Actors: + Actor0: tc05 + Owner: Neutral + Location: 24,81 + Actor2: tc05 + Owner: Neutral + Location: 19,20 + Actor4: tc05 + Owner: Neutral + Location: 10,61 + Actor5: tc05 + Owner: Neutral + Location: 12,35 + Actor6: tc05 + Owner: Neutral + Location: 15,34 + Actor8: tc05 + Owner: Neutral + Location: 2,43 + Actor9: tc05.husk + Owner: Neutral + Location: 40,65 + Actor10: tc05 + Owner: Neutral + Location: 58,73 + Actor12: tc04 + Owner: Neutral + Location: 55,56 + Actor14: tc03 + Owner: Neutral + Location: 62,6 + Actor15: tc03 + Owner: Neutral + Location: 21,61 + Actor16: tc03 + Owner: Neutral + Location: 59,13 + Actor17: tc03 + Owner: Neutral + Location: 48,69 + Actor18: tc04 + Owner: Neutral + Location: 85,48 + Actor19: tc03 + Owner: Neutral + Location: 79,25 + Actor20: tc04 + Owner: Neutral + Location: 8,55 + Actor21: tc03 + Owner: Neutral + Location: 55,7 + Actor22: tc04 + Owner: Neutral + Location: 15,28 + Actor24: tc03 + Owner: Neutral + Location: 26,75 + Actor26: tc03 + Owner: Neutral + Location: 12,78 + Actor28: tc04 + Owner: Neutral + Location: 40,58 + Actor29: tc04 + Owner: Neutral + Location: 12,79 + Actor30: tc03 + Owner: Neutral + Location: 0,41 + Actor31: tc03 + Owner: Neutral + Location: 10,79 + Actor33: tc03.husk + Owner: Neutral + Location: 93,39 + Actor37: tc04 + Owner: Neutral + Location: 44,64 + Actor38: tc04 + Owner: Neutral + Location: 49,22 + Actor40: tc03 + Owner: Neutral + Location: 21,12 + Actor42: tc03 + Owner: Neutral + Location: 48,81 + Actor43: tc03 + Owner: Neutral + Location: 40,48 + Actor44: tc03 + Owner: Neutral + Location: 43,61 + Actor45: tc04 + Owner: Neutral + Location: 78,20 + Actor46: tc03 + Owner: Neutral + Location: 52,45 + Actor48: tc03 + Owner: Neutral + Location: 11,52 + Actor49: tc03 + Owner: Neutral + Location: 56,53 + Actor51: tc02 + Owner: Neutral + Location: 14,94 + Actor52: tc02 + Owner: Neutral + Location: 0,48 + Actor53: tc02 + Owner: Neutral + Location: 39,45 + Actor55: tc02 + Owner: Neutral + Location: 47,23 + Actor57: tc02 + Owner: Neutral + Location: 59,46 + Actor58: tc02 + Owner: Neutral + Location: 46,80 + Actor59: tc02 + Owner: Neutral + Location: 11,0 + Actor60: tc02 + Owner: Neutral + Location: 43,44 + Actor61: tc02 + Owner: Neutral + Location: 90,57 + Actor62: tc02.husk + Owner: Neutral + Location: 75,47 + Actor64: tc02.husk + Owner: Neutral + Location: 86,3 + Actor65: tc02 + Owner: Neutral + Location: 38,70 + Actor67: tc02 + Owner: Neutral + Location: 51,48 + Actor68: tc02 + Owner: Neutral + Location: 82,1 + Actor71: tc02 + Owner: Neutral + Location: 58,57 + Actor72: t11 + Owner: Neutral + Location: 49,51 + Actor73: t14 + Owner: Neutral + Location: 44,5 + Actor74: t10 + Owner: Neutral + Location: 39,64 + Actor75: t14 + Owner: Neutral + Location: 51,38 + Actor76: t14 + Owner: Neutral + Location: 36,69 + Actor77: t15 + Owner: Neutral + Location: 79,14 + Actor78: t11 + Owner: Neutral + Location: 81,25 + Actor79: t10 + Owner: Neutral + Location: 38,71 + Actor80: t14 + Owner: Neutral + Location: 71,10 + Actor82: t14.husk + Owner: Neutral + Location: 16,68 + Actor83: t10 + Owner: Neutral + Location: 78,16 + Actor85: t14 + Owner: Neutral + Location: 55,31 + Actor86: t15 + Owner: Neutral + Location: 84,35 + Actor87: tc01 + Owner: Neutral + Location: 0,37 + Actor88: t11 + Owner: Neutral + Location: 45,71 + Actor89: t15 + Owner: Neutral + Location: 45,16 + Actor90: t10 + Owner: Neutral + Location: 10,77 + Actor91: t11.husk + Owner: Neutral + Location: 50,39 + Actor92: t15 + Owner: Neutral + Location: 15,27 + Actor93: tc01 + Owner: Neutral + Location: 80,54 + Actor94: t14 + Owner: Neutral + Location: 12,55 + Actor95: t15 + Owner: Neutral + Location: 60,75 + Actor96: t14 + Owner: Neutral + Location: 38,63 + Actor97: t14 + Owner: Neutral + Location: 50,23 + Actor98: t11 + Owner: Neutral + Location: 83,55 + Actor99: t11 + Owner: Neutral + Location: 47,72 + Actor100: t10 + Owner: Neutral + Location: 31,77 + Actor101: t10 + Owner: Neutral + Location: 17,76 + Actor102: t14 + Owner: Neutral + Location: 80,2 + Actor103: t14 + Owner: Neutral + Location: 10,82 + Actor104: tc01 + Owner: Neutral + Location: 41,20 + Actor106: t15 + Owner: Neutral + Location: 77,13 + Actor107: t15 + Owner: Neutral + Location: 81,53 + Actor108: t14 + Owner: Neutral + Location: 0,3 + Actor110: t15 + Owner: Neutral + Location: 16,67 + Actor111: tc01.husk + Owner: Neutral + Location: 14,95 + Actor112: t15 + Owner: Neutral + Location: 51,33 + Actor113: t10 + Owner: Neutral + Location: 87,69 + Actor114: t10 + Owner: Neutral + Location: 81,56 + Actor115: tc01 + Owner: Neutral + Location: 39,80 + Actor117: t15.husk + Owner: Neutral + Location: 4,38 + Actor118: t14 + Owner: Neutral + Location: 18,73 + Actor119: t10 + Owner: Neutral + Location: 9,56 + Actor121: t15 + Owner: Neutral + Location: 61,73 + Actor122: t10 + Owner: Neutral + Location: 53,34 + Actor124: t14 + Owner: Neutral + Location: 60,48 + Actor125: tc01 + Owner: Neutral + Location: 8,67 + Actor126: t11 + Owner: Neutral + Location: 62,7 + Actor128: t14 + Owner: Neutral + Location: 85,40 + Actor130: t11 + Owner: Neutral + Location: 42,41 + Actor131: t15 + Owner: Neutral + Location: 1,49 + Actor132: tc01.husk + Owner: Neutral + Location: 19,67 + Actor133: t10 + Owner: Neutral + Location: 61,56 + Actor137: t11.husk + Owner: Neutral + Location: 45,17 + Actor138: t11 + Owner: Neutral + Location: 87,0 + Actor140: t10 + Owner: Neutral + Location: 30,81 + Actor141: t14 + Owner: Neutral + Location: 12,76 + Actor142: t11 + Owner: Neutral + Location: 92,60 + Actor143: t10 + Owner: Neutral + Location: 86,70 + Actor147: t10 + Owner: Neutral + Location: 14,75 + Actor148: t14 + Owner: Neutral + Location: 74,28 + Actor150: t14 + Owner: Neutral + Location: 59,77 + Actor151: t15 + Owner: Neutral + Location: 58,11 + Actor152: t14 + Owner: Neutral + Location: 79,15 + Actor153: tc01 + Owner: Neutral + Location: 20,41 + Actor154: tc01 + Owner: Neutral + Location: 45,72 + Actor155: tc01 + Owner: Neutral + Location: 17,74 + Actor156: t15 + Owner: Neutral + Location: 41,63 + Actor157: t11.husk + Owner: Neutral + Location: 16,65 + Actor158: t11 + Owner: Neutral + Location: 85,2 + Actor159: tc01 + Owner: Neutral + Location: 16,30 + Actor160: t11 + Owner: Neutral + Location: 80,12 + Actor161: t11 + Owner: Neutral + Location: 59,6 + Actor162: t11 + Owner: Neutral + Location: 88,4 + Actor163: t15 + Owner: Neutral + Location: 8,1 + Actor164: t14 + Owner: Neutral + Location: 55,33 + Actor165: t10 + Owner: Neutral + Location: 85,43 + Actor166: t11.husk + Owner: Neutral + Location: 1,0 + Actor168: t10 + Owner: Neutral + Location: 80,49 + Actor170: t15 + Owner: Neutral + Location: 48,70 + Actor174: t10 + Owner: Neutral + Location: 78,26 + Actor176: t15 + Owner: Neutral + Location: 52,40 + Actor177: tc01 + Owner: Neutral + Location: 80,55 + Actor178: tc01 + Owner: Neutral + Location: 6,68 + Actor179: t14 + Owner: Neutral + Location: 0,13 + Actor180: t15 + Owner: Neutral + Location: 15,33 + Actor181: t14 + Owner: Neutral + Location: 81,24 + Actor183: t10 + Owner: Neutral + Location: 5,46 + Actor184: tc01.husk + Owner: Neutral + Location: 3,47 + Actor185: tc01 + Owner: Neutral + Location: 48,18 + Actor186: t15.husk + Owner: Neutral + Location: 51,57 + Actor187: t14 + Owner: Neutral + Location: 56,12 + Actor188: t11 + Owner: Neutral + Location: 75,25 + Actor190: t11 + Owner: Neutral + Location: 46,20 + Actor191: t10 + Owner: Neutral + Location: 18,19 + Actor193: t10 + Owner: Neutral + Location: 49,50 + Actor195: t14 + Owner: Neutral + Location: 41,72 + Actor196: tc01 + Owner: Neutral + Location: 23,84 + Actor198: tc01 + Owner: Neutral + Location: 78,58 + Actor199: t11 + Owner: Neutral + Location: 1,4 + Actor201: t10 + Owner: Neutral + Location: 13,80 + Actor202: tc01 + Owner: Neutral + Location: 86,67 + Actor204: t15 + Owner: Neutral + Location: 95,31 + Actor205: t11 + Owner: Neutral + Location: 62,75 + Actor206: t10 + Owner: Neutral + Location: 5,89 + Actor209: t15 + Owner: Neutral + Location: 50,53 + Actor211: t11 + Owner: Neutral + Location: 27,84 + Actor212: t15 + Owner: Neutral + Location: 92,54 + Actor213: t11 + Owner: Neutral + Location: 90,69 + Actor214: t15 + Owner: Neutral + Location: 81,57 + Actor215: t14 + Owner: Neutral + Location: 95,34 + Actor216: t15 + Owner: Neutral + Location: 2,40 + Actor217: t11 + Owner: Neutral + Location: 39,66 + Actor218: t15 + Owner: Neutral + Location: 80,11 + Actor219: t11 + Owner: Neutral + Location: 16,75 + Actor220: t15 + Owner: Neutral + Location: 39,68 + Actor221: t15 + Owner: Neutral + Location: 95,60 + Actor222: t15 + Owner: Neutral + Location: 53,35 + Actor223: t14 + Owner: Neutral + Location: 79,53 + Actor224: tc01 + Owner: Neutral + Location: 94,37 + Actor227: t14 + Owner: Neutral + Location: 14,48 + Actor228: tc01 + Owner: Neutral + Location: 77,24 + Actor229: t14 + Owner: Neutral + Location: 0,52 + Actor230: tc01.husk + Owner: Neutral + Location: 13,61 + Actor231: tc01 + Owner: Neutral + Location: 82,2 + Actor232: t11 + Owner: Neutral + Location: 89,1 + Actor233: t10 + Owner: Neutral + Location: 1,42 + Actor234: t15 + Owner: Neutral + Location: 7,10 + Actor235: t14.husk + Owner: Neutral + Location: 86,65 + Actor237: t14 + Owner: Neutral + Location: 78,54 + Actor239: t14 + Owner: Neutral + Location: 86,1 + Actor240: t11 + Owner: Neutral + Location: 38,81 + Actor241: t10 + Owner: Neutral + Location: 52,10 + Actor242: t14 + Owner: Neutral + Location: 4,40 + Actor243: t14 + Owner: Neutral + Location: 83,52 + Actor244: tc01 + Owner: Neutral + Location: 14,78 + Actor245: t11 + Owner: Neutral + Location: 39,61 + Actor246: t11 + Owner: Neutral + Location: 0,36 + Actor247: t11 + Owner: Neutral + Location: 42,42 + Actor249: t14.husk + Owner: Neutral + Location: 54,52 + Actor250: tc01 + Owner: Neutral + Location: 78,23 + Actor251: t10 + Owner: Neutral + Location: 49,73 + Actor252: t15 + Owner: Neutral + Location: 13,74 + Actor254: t11 + Owner: Neutral + Location: 96,25 + Actor255: t15 + Owner: Neutral + Location: 44,22 + Actor257: t15 + Owner: Neutral + Location: 79,3 + Actor258: t10 + Owner: Neutral + Location: 95,40 + Actor259: t14 + Owner: Neutral + Location: 51,80 + Actor261: t11 + Owner: Neutral + Location: 0,83 + Actor263: t14 + Owner: Neutral + Location: 52,9 + Actor264: t11 + Owner: Neutral + Location: 60,78 + Actor265: tc01 + Owner: Neutral + Location: 75,50 + Actor266: t10 + Owner: Neutral + Location: 83,48 + Actor267: t14.husk + Owner: Neutral + Location: 94,65 + Actor269: tc01 + Owner: Neutral + Location: 1,12 + Actor270: t10 + Owner: Neutral + Location: 89,70 + Actor272: t15 + Owner: Neutral + Location: 16,61 + Actor273: tc01 + Owner: Neutral + Location: 15,81 + Actor277: t15.husk + Owner: Neutral + Location: 16,55 + Actor278: t15 + Owner: Neutral + Location: 31,82 + Actor279: t10.husk + Owner: Neutral + Location: 4,0 + Actor281: t11 + Owner: Neutral + Location: 57,45 + Actor282: t11 + Owner: Neutral + Location: 96,35 + Actor283: t11 + Owner: Neutral + Location: 18,18 + Actor284: t11.husk + Owner: Neutral + Location: 89,0 + Actor286: t11.husk + Owner: Neutral + Location: 2,1 + Actor287: tc01 + Owner: Neutral + Location: 14,30 + Actor289: t11 + Owner: Neutral + Location: 56,11 + Actor290: tc01 + Owner: Neutral + Location: 95,61 + Actor291: t14.husk + Owner: Neutral + Location: 91,0 + Actor293: t14 + Owner: Neutral + Location: 7,2 + Actor294: t11 + Owner: Neutral + Location: 59,58 + Actor296: t14 + Owner: Neutral + Location: 49,34 + Actor297: t11 + Owner: Neutral + Location: 13,27 + Actor298: t11 + Owner: Neutral + Location: 44,63 + Actor301: t10 + Owner: Neutral + Location: 13,9 + Actor302: tc01 + Owner: Neutral + Location: 76,54 + Actor303: t10 + Owner: Neutral + Location: 13,33 + Actor306: t14 + Owner: Neutral + Location: 80,39 + Actor307: t11 + Owner: Neutral + Location: 4,2 + Actor308: t14.husk + Owner: Neutral + Location: 51,41 + Actor309: t14 + Owner: Neutral + Location: 93,55 + Actor310: tc01 + Owner: Neutral + Location: 42,73 + Actor311: t10 + Owner: Neutral + Location: 41,44 + Actor313: t15 + Owner: Neutral + Location: 60,66 + Actor316: t13.husk + Owner: Neutral + Location: 46,81 + Actor317: t12 + Owner: Neutral + Location: 58,38 + Actor318: t01 + Owner: Neutral + Location: 40,20 + Actor320: t06 + Owner: Neutral + Location: 0,44 + Actor321: t06 + Owner: Neutral + Location: 13,83 + Actor323: t05 + Owner: Neutral + Location: 55,53 + Actor324: t13 + Owner: Neutral + Location: 47,16 + Actor325: t17 + Owner: Neutral + Location: 2,80 + Actor327: t12.husk + Owner: Neutral + Location: 18,21 + Actor329: t16 + Owner: Neutral + Location: 50,69 + Actor330: t03 + Owner: Neutral + Location: 15,20 + Actor331: t13 + Owner: Neutral + Location: 81,38 + Actor334: t01 + Owner: Neutral + Location: 45,18 + Actor335: t03 + Owner: Neutral + Location: 47,17 + Actor336: t12 + Owner: Neutral + Location: 8,44 + Actor337: t02 + Owner: Neutral + Location: 11,36 + Actor338: t16 + Owner: Neutral + Location: 82,55 + Actor339: t13 + Owner: Neutral + Location: 20,73 + Actor340: t03 + Owner: Neutral + Location: 15,32 + Actor341: t17 + Owner: Neutral + Location: 71,52 + Actor342: t06 + Owner: Neutral + Location: 17,11 + Actor344: t08 + Owner: Neutral + Location: 13,9 + Actor346: t02 + Owner: Neutral + Location: 65,36 + Actor347: t17 + Owner: Neutral + Location: 2,48 + Actor349: t12 + Owner: Neutral + Location: 56,42 + Actor350: t02 + Owner: Neutral + Location: 19,66 + Actor351: t13 + Owner: Neutral + Location: 20,43 + Actor353: t03 + Owner: Neutral + Location: 77,56 + Actor354: t06 + Owner: Neutral + Location: 16,8 + Actor355: t13 + Owner: Neutral + Location: 41,71 + Actor357: t02 + Owner: Neutral + Location: 81,23 + Actor358: t12.husk + Owner: Neutral + Location: 43,47 + Actor361: t01 + Owner: Neutral + Location: 11,81 + Actor363: t02 + Owner: Neutral + Location: 5,39 + Actor364: t17 + Owner: Neutral + Location: 54,50 + Actor365: t16.husk + Owner: Neutral + Location: 68,67 + Actor366: t17 + Owner: Neutral + Location: 1,6 + Actor367: t06 + Owner: Neutral + Location: 41,40 + Actor368: t17 + Owner: Neutral + Location: 12,75 + Actor369: t12 + Owner: Neutral + Location: 46,61 + Actor371: t07 + Owner: Neutral + Location: 35,12 + Actor372: t05 + Owner: Neutral + Location: 58,9 + Actor374: t06 + Owner: Neutral + Location: 9,7 + Actor376: t17 + Owner: Neutral + Location: 22,20 + Actor377: t12 + Owner: Neutral + Location: 96,42 + Actor378: t08 + Owner: Neutral + Location: 82,39 + Actor379: t12 + Owner: Neutral + Location: 11,76 + Actor380: t05 + Owner: Neutral + Location: 58,10 + Actor383: t06.husk + Owner: Neutral + Location: 53,47 + Actor384: t12 + Owner: Neutral + Location: 90,61 + Actor385: t02 + Owner: Neutral + Location: 1,45 + Actor386: t03 + Owner: Neutral + Location: 52,11 + Actor387: t01 + Owner: Neutral + Location: 12,59 + Actor388: t17 + Owner: Neutral + Location: 54,31 + Actor389: t16.husk + Owner: Neutral + Location: 88,47 + Actor390: t01 + Owner: Neutral + Location: 21,67 + Actor391: t12.husk + Owner: Neutral + Location: 28,80 + Actor392: t12.husk + Owner: Neutral + Location: 56,8 + Actor393: t02 + Owner: Neutral + Location: 67,66 + Actor394: t05 + Owner: Neutral + Location: 54,11 + Actor396: t07 + Owner: Neutral + Location: 50,37 + Actor398: t02 + Owner: Neutral + Location: 15,11 + Actor399: t08 + Owner: Neutral + Location: 90,5 + Actor400: t06 + Owner: Neutral + Location: 27,80 + Actor401: t03 + Owner: Neutral + Location: 30,79 + Actor402: t03 + Owner: Neutral + Location: 17,32 + Actor404: t12 + Owner: Neutral + Location: 94,0 + Actor405: t13 + Owner: Neutral + Location: 42,40 + Actor406: t07 + Owner: Neutral + Location: 12,49 + Actor408: t01 + Owner: Neutral + Location: 25,75 + Actor409: t12 + Owner: Neutral + Location: 74,57 + Actor411: t07 + Owner: Neutral + Location: 15,10 + Actor412: t07 + Owner: Neutral + Location: 95,72 + Actor413: t16 + Owner: Neutral + Location: 0,50 + Actor414: t07 + Owner: Neutral + Location: 41,81 + Actor416: t01.husk + Owner: Neutral + Location: 58,58 + Actor417: t07 + Owner: Neutral + Location: 52,42 + Actor418: t01 + Owner: Neutral + Location: 82,50 + Actor420: t13 + Owner: Neutral + Location: 1,2 + Actor421: t12 + Owner: Neutral + Location: 78,50 + Actor422: t01.husk + Owner: Neutral + Location: 80,45 + Actor423: t02 + Owner: Neutral + Location: 50,46 + Actor424: t02 + Owner: Neutral + Location: 84,37 + Actor425: t08 + Owner: Neutral + Location: 50,41 + Actor427: t01.husk + Owner: Neutral + Location: 61,70 + Actor428: t05 + Owner: Neutral + Location: 56,9 + Actor432: t07 + Owner: Neutral + Location: 25,77 + Actor435: t12 + Owner: Neutral + Location: 3,0 + Actor437: t17 + Owner: Neutral + Location: 45,41 + Actor438: t07 + Owner: Neutral + Location: 57,41 + Actor439: t08 + Owner: Neutral + Location: 30,76 + Actor441: t05 + Owner: Neutral + Location: 8,54 + Actor442: t01 + Owner: Neutral + Location: 78,51 + Actor444: t13 + Owner: Neutral + Location: 83,3 + Actor445: t05 + Owner: Neutral + Location: 63,38 + Actor446: t16 + Owner: Neutral + Location: 52,51 + Actor447: t03 + Owner: Neutral + Location: 7,87 + Actor448: t08 + Owner: Neutral + Location: 26,73 + Actor449: t08 + Owner: Neutral + Location: 0,0 + Actor450: t08 + Owner: Neutral + Location: 80,27 + Actor451: t08 + Owner: Neutral + Location: 7,14 + Actor452: t05 + Owner: Neutral + Location: 32,87 + Actor453: t13.husk + Owner: Neutral + Location: 14,8 + Actor455: t08 + Owner: Neutral + Location: 8,1 + Actor456: t02 + Owner: Neutral + Location: 24,78 + Actor459: t03 + Owner: Neutral + Location: 72,37 + Actor460: t01 + Owner: Neutral + Location: 46,27 + Actor461: t03 + Owner: Neutral + Location: 53,49 + Actor462: t06 + Owner: Neutral + Location: 45,24 + Actor463: t01 + Owner: Neutral + Location: 58,72 + Actor464: t16 + Owner: Neutral + Location: 96,38 + Actor466: t07 + Owner: Neutral + Location: 58,52 + Actor467: t06 + Owner: Neutral + Location: 91,66 + Actor468: t12 + Owner: Neutral + Location: 20,44 + Actor469: t12 + Owner: Neutral + Location: 19,56 + Actor470: t13 + Owner: Neutral + Location: 23,85 + Actor471: t16 + Owner: Neutral + Location: 38,48 + Actor472: t01 + Owner: Neutral + Location: 90,60 + Actor473: t05 + Owner: Neutral + Location: 7,67 + Actor475: t16 + Owner: Neutral + Location: 45,44 + Actor477: t05 + Owner: Neutral + Location: 19,74 + Actor478: t02 + Owner: Neutral + Location: 61,47 + Actor479: t08 + Owner: Neutral + Location: 54,52 + Actor480: t01 + Owner: Neutral + Location: 15,36 + Actor482: t08 + Owner: Neutral + Location: 58,50 + Actor483: t17.husk + Owner: Neutral + Location: 49,35 + Actor485: t06 + Owner: Neutral + Location: 27,73 + Actor486: t17 + Owner: Neutral + Location: 69,3 + Actor487: t06 + Owner: Neutral + Location: 51,79 + Actor488: t13 + Owner: Neutral + Location: 20,11 + Actor489: t02 + Owner: Neutral + Location: 42,24 + Actor490: t08 + Owner: Neutral + Location: 52,40 + Actor493: t16 + Owner: Neutral + Location: 88,64 + Actor495: t16 + Owner: Neutral + Location: 13,82 + Actor496: t13 + Owner: Neutral + Location: 79,51 + Actor497: t05 + Owner: Neutral + Location: 12,34 + Actor498: t08 + Owner: Neutral + Location: 50,42 + Actor499: t07 + Owner: Neutral + Location: 54,9 + Actor501: t07 + Owner: Neutral + Location: 13,54 + Actor502: t12 + Owner: Neutral + Location: 8,80 + Actor503: t06 + Owner: Neutral + Location: 60,49 + Actor504: t01 + Owner: Neutral + Location: 95,71 + Actor505: t07 + Owner: Neutral + Location: 44,40 + Actor506: t07 + Owner: Neutral + Location: 45,42 + Actor508: t16 + Owner: Neutral + Location: 83,28 + Actor509: t08 + Owner: Neutral + Location: 17,30 + Actor510: t17 + Owner: Neutral + Location: 79,1 + Actor512: t13 + Owner: Neutral + Location: 82,48 + Actor513: t07.husk + Owner: Neutral + Location: 40,71 + Actor514: t03 + Owner: Neutral + Location: 22,84 + Actor515: t02 + Owner: Neutral + Location: 2,47 + Actor516: t06 + Owner: Neutral + Location: 74,51 + Actor517: t01.husk + Owner: Neutral + Location: 54,38 + Actor520: t02.husk + Owner: Neutral + Location: 87,4 + Actor521: t13.husk + Owner: Neutral + Location: 96,9 + Actor522: t07 + Owner: Neutral + Location: 80,21 + Actor525: t02 + Owner: Neutral + Location: 40,22 + Actor526: t16 + Owner: Neutral + Location: 76,53 + Actor527: t01 + Owner: Neutral + Location: 95,58 + Actor529: t12 + Owner: Neutral + Location: 62,54 + Actor532: t08 + Owner: Neutral + Location: 8,69 + Actor533: t13 + Owner: Neutral + Location: 91,60 + Actor534: t03 + Owner: Neutral + Location: 9,54 + Actor535: t08 + Owner: Neutral + Location: 36,11 + Actor536: t16.husk + Owner: Neutral + Location: 9,89 + Actor538: t12 + Owner: Neutral + Location: 79,43 + Actor539: t07 + Owner: Neutral + Location: 14,26 + Actor540: t02 + Owner: Neutral + Location: 43,81 + Actor542: t05 + Owner: Neutral + Location: 16,36 + Actor543: t13 + Owner: Neutral + Location: 41,79 + Actor544: t16 + Owner: Neutral + Location: 11,50 + Actor545: t16 + Owner: Neutral + Location: 26,83 + Actor547: t16 + Owner: Neutral + Location: 13,1 + Actor548: t16 + Owner: Neutral + Location: 55,60 + Actor549: t03 + Owner: Neutral + Location: 42,80 + Actor550: t08.husk + Owner: Neutral + Location: 12,75 + Actor551: t17 + Owner: Neutral + Location: 44,80 + Actor552: t16 + Owner: Neutral + Location: 42,22 + Actor553: t12 + Owner: Neutral + Location: 30,83 + Actor554: t06 + Owner: Neutral + Location: 64,63 + Actor555: t17 + Owner: Neutral + Location: 96,41 + Actor556: t07 + Owner: Neutral + Location: 16,57 + Actor558: t13 + Owner: Neutral + Location: 80,0 + Actor559: t12 + Owner: Neutral + Location: 8,90 + Actor560: t06 + Owner: Neutral + Location: 61,69 + Actor561: t17 + Owner: Neutral + Location: 88,67 + Actor562: t13 + Owner: Neutral + Location: 44,79 + Actor563: t07 + Owner: Neutral + Location: 43,40 + Actor564: t06 + Owner: Neutral + Location: 8,89 + Actor565: t17 + Owner: Neutral + Location: 9,75 + Actor566: t17 + Owner: Neutral + Location: 39,59 + Actor567: t13 + Owner: Neutral + Location: 62,78 + Actor568: t01 + Owner: Neutral + Location: 58,6 + Actor569: t07 + Owner: Neutral + Location: 9,68 + Actor570: t07 + Owner: Neutral + Location: 1,35 + Actor571: t07 + Owner: Neutral + Location: 43,43 + Actor572: t03 + Owner: Neutral + Location: 14,2 + Actor573: t05 + Owner: Neutral + Location: 7,45 + Actor574: t07 + Owner: Neutral + Location: 50,74 + Actor575: t03 + Owner: Neutral + Location: 75,54 + Actor576: t01 + Owner: Neutral + Location: 75,52 + Actor577: t16 + Owner: Neutral + Location: 2,6 + Actor578: t12 + Owner: Neutral + Location: 50,24 + Actor580: t01 + Owner: Neutral + Location: 0,1 + Actor581: t08 + Owner: Neutral + Location: 39,21 + Actor582: t08.husk + Owner: Neutral + Location: 30,85 + Actor583: t05 + Owner: Neutral + Location: 88,65 + Actor585: t12 + Owner: Neutral + Location: 81,4 + Actor586: t13 + Owner: Neutral + Location: 94,70 + Actor587: t08 + Owner: Neutral + Location: 46,6 + Actor589: t17 + Owner: Neutral + Location: 0,42 + Actor590: t02 + Owner: Neutral + Location: 89,69 + Actor591: t16 + Owner: Neutral + Location: 46,18 + Actor592: t17 + Owner: Neutral + Location: 53,8 + Actor593: t02 + Owner: Neutral + Location: 81,17 + Actor594: t01 + Owner: Neutral + Location: 0,47 + Actor595: t07 + Owner: Neutral + Location: 47,22 + Actor596: t07 + Owner: Neutral + Location: 6,0 + Actor597: t16 + Owner: Neutral + Location: 67,65 + Actor598: t13 + Owner: Neutral + Location: 60,56 + Actor599: t03 + Owner: Neutral + Location: 49,54 + Actor600: t07 + Owner: Neutral + Location: 7,62 + Actor601: t07 + Owner: Neutral + Location: 42,45 + Actor603: t03 + Owner: Neutral + Location: 45,26 + Actor604: t12 + Owner: Neutral + Location: 85,36 + Actor606: t05 + Owner: Neutral + Location: 13,51 + Actor607: t07 + Owner: Neutral + Location: 48,21 + Actor608: t13 + Owner: Neutral + Location: 75,51 + Actor609: t08 + Owner: Neutral + Location: 65,80 + Actor610: t05 + Owner: Neutral + Location: 40,79 + Actor611: t07 + Owner: Neutral + Location: 96,29 + Actor614: t08 + Owner: Neutral + Location: 20,19 + Actor615: t13 + Owner: Neutral + Location: 77,51 + Actor616: t13 + Owner: Neutral + Location: 13,10 + Actor617: t08 + Owner: Neutral + Location: 32,82 + Actor619: t17 + Owner: Neutral + Location: 15,82 + Actor620: t01 + Owner: Neutral + Location: 45,15 + Actor621: t13 + Owner: Neutral + Location: 62,66 + Actor622: t05 + Owner: Neutral + Location: 7,60 + Actor623: t13 + Owner: Neutral + Location: 86,50 + Actor624: t08 + Owner: Neutral + Location: 85,39 + Actor625: t02 + Owner: Neutral + Location: 0,76 + Actor626: t12 + Owner: Neutral + Location: 83,38 + Actor627: t05 + Owner: Neutral + Location: 0,17 + Actor628: t12 + Owner: Neutral + Location: 45,81 + Actor629: t16 + Owner: Neutral + Location: 60,55 + Actor630: t13 + Owner: Neutral + Location: 53,52 + Actor633: t02 + Owner: Neutral + Location: 35,70 + Actor634: t02.husk + Owner: Neutral + Location: 11,75 + Actor635: t08 + Owner: Neutral + Location: 63,66 + Actor638: t13 + Owner: Neutral + Location: 14,82 + Actor640: t01 + Owner: Neutral + Location: 15,1 + Actor641: t16 + Owner: Neutral + Location: 23,61 + Actor642: t16 + Owner: Neutral + Location: 77,45 + Actor643: t03 + Owner: Neutral + Location: 28,83 + Actor645: t16 + Owner: Neutral + Location: 76,28 + Actor646: t06 + Owner: Neutral + Location: 82,49 + Actor648: t01 + Owner: Neutral + Location: 61,71 + Actor649: t07 + Owner: Neutral + Location: 51,36 + Actor650: t03 + Owner: Neutral + Location: 28,72 + Actor651: t17.husk + Owner: Neutral + Location: 44,42 + Actor652: t07 + Owner: Neutral + Location: 13,0 + Actor653: t01 + Owner: Neutral + Location: 50,45 + Actor654: t03 + Owner: Neutral + Location: 51,34 + Actor655: t03 + Owner: Neutral + Location: 17,57 + Actor656: t16 + Owner: Neutral + Location: 86,49 + Actor657: t05 + Owner: Neutral + Location: 0,18 + Actor659: t07 + Owner: Neutral + Location: 9,9 + Actor661: t17 + Owner: Neutral + Location: 80,22 + Actor662: t16 + Owner: Neutral + Location: 6,58 + Actor663: t01 + Owner: Neutral + Location: 17,77 + Actor664: t17 + Owner: Neutral + Location: 2,9 + Actor666: t01 + Owner: Neutral + Location: 90,67 + Actor668: t07 + Owner: Neutral + Location: 19,75 + Actor669: t12 + Owner: Neutral + Location: 97,28 + Actor671: t16 + Owner: Neutral + Location: 45,4 + Actor673: t02 + Owner: Neutral + Location: 15,26 + Actor674: t06 + Owner: Neutral + Location: 95,0 + Actor676: t02 + Owner: Neutral + Location: 29,78 + Actor678: t06 + Owner: Neutral + Location: 57,39 + Actor679: t01 + Owner: Neutral + Location: 3,3 + Actor680: t17 + Owner: Neutral + Location: 29,8 + Actor681: t08 + Owner: Neutral + Location: 7,89 + Actor683: t02 + Owner: Neutral + Location: 45,80 + Actor684: t07.husk + Owner: Neutral + Location: 23,36 + Actor685: t02 + Owner: Neutral + Location: 93,52 + Actor686: t03 + Owner: Neutral + Location: 78,57 + Actor687: t01 + Owner: Neutral + Location: 82,17 + Actor688: t03 + Owner: Neutral + Location: 81,21 + Actor689: t17 + Owner: Neutral + Location: 78,1 + Actor691: t06.husk + Owner: Neutral + Location: 52,74 + Actor692: t16 + Owner: Neutral + Location: 25,78 + Actor693: t13 + Owner: Neutral + Location: 64,65 + Actor694: t02 + Owner: Neutral + Location: 80,51 + Actor695: t05 + Owner: Neutral + Location: 75,56 + Actor696: t03 + Owner: Neutral + Location: 26,85 + Actor697: t12 + Owner: Neutral + Location: 53,54 + Actor698: t02 + Owner: Neutral + Location: 18,62 + Actor699: t08 + Owner: Neutral + Location: 91,63 + Actor700: t02 + Owner: Neutral + Location: 51,47 + Actor701: t02 + Owner: Neutral + Location: 42,48 + Actor702: t05 + Owner: Neutral + Location: 95,57 + Actor703: t17.husk + Owner: Neutral + Location: 87,12 + Actor704: t08 + Owner: Neutral + Location: 43,68 + Actor705: t08.husk + Owner: Neutral + Location: 31,80 + Actor707: t01 + Owner: Neutral + Location: 48,71 + Actor708: t08 + Owner: Neutral + Location: 43,85 + Actor709: t12 + Owner: Neutral + Location: 79,29 + Actor710: t08 + Owner: Neutral + Location: 53,47 + Actor711: t01 + Owner: Neutral + Location: 1,9 + Actor712: t01 + Owner: Neutral + Location: 22,67 + Actor713: t16 + Owner: Neutral + Location: 79,11 + Actor714: t08 + Owner: Neutral + Location: 9,78 + Actor715: t07 + Owner: Neutral + Location: 1,11 + Actor717: t08 + Owner: Neutral + Location: 50,45 + Actor718: t12 + Owner: Neutral + Location: 51,32 + Actor719: t08.husk + Owner: Neutral + Location: 78,53 + Actor720: t17 + Owner: Neutral + Location: 57,58 + Actor721: t02 + Owner: Neutral + Location: 43,25 + Actor722: t06 + Owner: Neutral + Location: 51,43 + Actor723: t01 + Owner: Neutral + Location: 82,51 + Actor724: t03 + Owner: Neutral + Location: 0,51 + Actor725: t03 + Owner: Neutral + Location: 14,81 + Actor726: t02 + Owner: Neutral + Location: 86,37 + Actor727: t01 + Owner: Neutral + Location: 3,38 + Actor728: t17 + Owner: Neutral + Location: 14,0 + Actor730: t06 + Owner: Neutral + Location: 46,6 + Actor731: t01.husk + Owner: Neutral + Location: 61,38 + Actor732: t13 + Owner: Neutral + Location: 15,31 + Actor733: t12 + Owner: Neutral + Location: 77,14 + Actor734: t08 + Owner: Neutral + Location: 18,64 + Actor735: t17.husk + Owner: Neutral + Location: 81,59 + Actor736: t06 + Owner: Neutral + Location: 13,52 + Actor737: t03 + Owner: Neutral + Location: 22,85 + Actor738: t06 + Owner: Neutral + Location: 46,73 + Actor739: t06 + Owner: Neutral + Location: 70,13 + Actor740: t17.husk + Owner: Neutral + Location: 39,65 + Actor741: t12 + Owner: Neutral + Location: 24,62 + Actor742: t13 + Owner: Neutral + Location: 40,63 + Actor743: t07 + Owner: Neutral + Location: 25,86 + Actor745: t12 + Owner: Neutral + Location: 20,10 + Actor746: t13 + Owner: Neutral + Location: 75,19 + Actor747: t05 + Owner: Neutral + Location: 64,79 + Actor748: t02 + Owner: Neutral + Location: 74,54 + Actor749: t02 + Owner: Neutral + Location: 55,51 + Actor750: t16 + Owner: Neutral + Location: 2,81 + Actor751: t16 + Owner: Neutral + Location: 53,56 + Actor752: t06 + Owner: Neutral + Location: 6,41 + Actor754: t06 + Owner: Neutral + Location: 61,11 + Actor755: t17 + Owner: Neutral + Location: 43,68 + Actor756: t16 + Owner: Neutral + Location: 64,5 + Actor757: t06 + Owner: Neutral + Location: 41,67 + Actor759: t08 + Owner: Neutral + Location: 81,1 + Actor760: t01 + Owner: Neutral + Location: 86,52 + Actor761: t05 + Owner: Neutral + Location: 67,67 + Actor763: t01 + Owner: Neutral + Location: 28,5 + Actor764: t02 + Owner: Neutral + Location: 57,46 + Actor765: t12 + Owner: Neutral + Location: 27,83 + Actor766: t07 + Owner: Neutral + Location: 82,23 + Actor767: t08 + Owner: Neutral + Location: 58,48 + Actor768: t05 + Owner: Neutral + Location: 49,25 + Actor769: t01 + Owner: Neutral + Location: 0,81 + Actor772: t03 + Owner: Neutral + Location: 50,21 + Actor773: t17 + Owner: Neutral + Location: 15,76 + Actor774: t02 + Owner: Neutral + Location: 79,52 + Actor775: t07 + Owner: Neutral + Location: 95,30 + Actor776: t08 + Owner: Neutral + Location: 74,21 + Actor778: t08 + Owner: Neutral + Location: 16,75 + Actor779: t08 + Owner: Neutral + Location: 11,81 + Actor780: t01 + Owner: Neutral + Location: 80,52 + Actor782: t16 + Owner: Neutral + Location: 17,20 + Actor783: t06 + Owner: Neutral + Location: 7,55 + Actor784: t13 + Owner: Neutral + Location: 96,49 + Actor785: t06 + Owner: Neutral + Location: 79,13 + Actor786: t03 + Owner: Neutral + Location: 82,3 + Actor787: t03.husk + Owner: Neutral + Location: 16,73 + Actor788: t16 + Owner: Neutral + Location: 21,40 + Actor791: t07 + Owner: Neutral + Location: 32,76 + Actor792: t12 + Owner: Neutral + Location: 5,47 + Actor793: t16 + Owner: Neutral + Location: 0,8 + Actor795: t01 + Owner: Neutral + Location: 43,62 + Actor797: t07 + Owner: Neutral + Location: 23,86 + Actor798: t01 + Owner: Neutral + Location: 7,61 + Actor799: t01 + Owner: Neutral + Location: 22,13 + Actor800: t12 + Owner: Neutral + Location: 30,9 + Actor802: t12 + Owner: Neutral + Location: 79,55 + Actor803: t16 + Owner: Neutral + Location: 28,79 + Actor804: t03 + Owner: Neutral + Location: 17,66 + Actor808: t17 + Owner: Neutral + Location: 21,63 + Actor809: t17 + Owner: Neutral + Location: 96,57 + Actor810: t12 + Owner: Neutral + Location: 61,76 + Actor811: t07 + Owner: Neutral + Location: 50,35 + Actor812: t13 + Owner: Neutral + Location: 43,83 + Actor813: t06 + Owner: Neutral + Location: 45,66 + Actor814: t16 + Owner: Neutral + Location: 85,47 + Actor815: t02.husk + Owner: Neutral + Location: 14,62 + Actor816: t06 + Owner: Neutral + Location: 16,32 + Actor817: t06 + Owner: Neutral + Location: 87,66 + Actor819: t03 + Owner: Neutral + Location: 47,73 + Actor820: t08 + Owner: Neutral + Location: 51,51 + Actor821: t16 + Owner: Neutral + Location: 60,54 + Actor822: t03 + Owner: Neutral + Location: 38,68 + Actor823: t03 + Owner: Neutral + Location: 24,79 + Actor825: t03 + Owner: Neutral + Location: 60,76 + Actor826: t13 + Owner: Neutral + Location: 30,80 + Actor828: t02 + Owner: Neutral + Location: 48,53 + Actor829: t06 + Owner: Neutral + Location: 76,24 + Actor830: t01 + Owner: Neutral + Location: 11,54 + Actor831: t08 + Owner: Neutral + Location: 17,32 + Actor832: t08 + Owner: Neutral + Location: 95,30 + Actor833: t16.husk + Owner: Neutral + Location: 44,69 + Actor834: t17 + Owner: Neutral + Location: 88,46 + Actor835: t13 + Owner: Neutral + Location: 24,80 + Actor838: t17 + Owner: Neutral + Location: 83,26 + Actor840: t05 + Owner: Neutral + Location: 14,55 + Actor841: t07 + Owner: Neutral + Location: 15,8 + Actor842: t07 + Owner: Neutral + Location: 93,49 + Actor845: t03 + Owner: Neutral + Location: 79,40 + Actor846: t01 + Owner: Neutral + Location: 9,81 + Actor847: t12 + Owner: Neutral + Location: 80,13 + Actor849: t08.husk + Owner: Neutral + Location: 53,38 + Actor850: t16 + Owner: Neutral + Location: 9,76 + Actor851: t13 + Owner: Neutral + Location: 52,49 + Actor852: t16 + Owner: Neutral + Location: 30,82 + Actor853: t06 + Owner: Neutral + Location: 47,4 + Actor854: t02 + Owner: Neutral + Location: 73,24 + Actor855: t07 + Owner: Neutral + Location: 8,88 + Actor856: t07 + Owner: Neutral + Location: 14,58 + Actor858: t07 + Owner: Neutral + Location: 95,62 + Actor859: t08 + Owner: Neutral + Location: 50,21 + Actor860: t03 + Owner: Neutral + Location: 84,36 + Actor861: t16 + Owner: Neutral + Location: 79,10 + Actor862: t02 + Owner: Neutral + Location: 47,25 + Actor864: t02 + Owner: Neutral + Location: 58,74 + Actor865: t05 + Owner: Neutral + Location: 81,1 + Actor866: t17 + Owner: Neutral + Location: 88,3 + Actor867: t03 + Owner: Neutral + Location: 96,69 + Actor870: t12 + Owner: Neutral + Location: 51,82 + Actor871: t07 + Owner: Neutral + Location: 80,59 + Actor873: t13 + Owner: Neutral + Location: 53,80 + Actor875: t02 + Owner: Neutral + Location: 27,72 + Actor876: t03 + Owner: Neutral + Location: 15,38 + Actor878: t16.husk + Owner: Neutral + Location: 60,68 + Actor879: t03 + Owner: Neutral + Location: 29,76 + Actor880: t03.husk + Owner: Neutral + Location: 85,0 + Actor881: t02 + Owner: Neutral + Location: 8,13 + Actor883: t02 + Owner: Neutral + Location: 95,36 + Actor884: t16 + Owner: Neutral + Location: 38,52 + Actor885: t03 + Owner: Neutral + Location: 43,46 + Actor886: t08 + Owner: Neutral + Location: 3,49 + Actor887: t17 + Owner: Neutral + Location: 7,42 + Actor888: t08 + Owner: Neutral + Location: 8,79 + Actor889: t07 + Owner: Neutral + Location: 54,8 + Actor890: t01 + Owner: Neutral + Location: 20,19 + Actor892: t17 + Owner: Neutral + Location: 91,2 + Actor893: t13 + Owner: Neutral + Location: 16,58 + Actor894: t17 + Owner: Neutral + Location: 78,15 + Actor895: t05 + Owner: Neutral + Location: 57,6 + Actor896: t16 + Owner: Neutral + Location: 7,56 + Actor898: t13 + Owner: Neutral + Location: 44,71 + Actor899: t07 + Owner: Neutral + Location: 71,11 + Actor900: t01 + Owner: Neutral + Location: 80,16 + Actor901: t01 + Owner: Neutral + Location: 19,31 + Actor904: t01 + Owner: Neutral + Location: 3,45 + Actor905: t03 + Owner: Neutral + Location: 11,57 + Actor906: t03 + Owner: Neutral + Location: 10,1 + Actor907: t08.husk + Owner: Neutral + Location: 84,48 + Actor908: t13 + Owner: Neutral + Location: 51,10 + Actor909: t16 + Owner: Neutral + Location: 55,12 + Actor912: t08 + Owner: Neutral + Location: 40,51 + Actor913: t06 + Owner: Neutral + Location: 61,67 + Actor914: t03 + Owner: Neutral + Location: 96,30 + Actor915: t01 + Owner: Neutral + Location: 26,84 + Actor916: t12 + Owner: Neutral + Location: 57,44 + Actor917: t08 + Owner: Neutral + Location: 96,44 + Actor918: t16 + Owner: Neutral + Location: 95,35 + Actor919: t12 + Owner: Neutral + Location: 74,55 + Actor920: t12 + Owner: Neutral + Location: 47,5 + Actor921: t13 + Owner: Neutral + Location: 92,56 + Actor922: t06 + Owner: Neutral + Location: 20,62 + Actor923: t13 + Owner: Neutral + Location: 44,82 + Actor924: t16 + Owner: Neutral + Location: 2,45 + Actor925: t12 + Owner: Neutral + Location: 18,66 + Actor926: t16.husk + Owner: Neutral + Location: 1,1 + Actor927: t05 + Owner: Neutral + Location: 89,2 + Actor928: t17 + Owner: Neutral + Location: 96,8 + Actor929: t01 + Owner: Neutral + Location: 39,44 + Actor930: t06.husk + Owner: Neutral + Location: 51,42 + Actor931: t01 + Owner: Neutral + Location: 72,9 + Actor932: t02 + Owner: Neutral + Location: 53,36 + Actor933: t12.husk + Owner: Neutral + Location: 93,0 + Actor934: t05 + Owner: Neutral + Location: 92,52 + Actor937: t05 + Owner: Neutral + Location: 43,70 + Actor938: t16 + Owner: Neutral + Location: 45,73 + Actor939: t01 + Owner: Neutral + Location: 40,78 + Actor941: t05.husk + Owner: Neutral + Location: 38,66 + Actor942: t08.husk + Owner: Neutral + Location: 58,45 + Actor943: t12 + Owner: Neutral + Location: 12,25 + Actor944: t05 + Owner: Neutral + Location: 1,44 + Actor946: t13 + Owner: Neutral + Location: 10,9 + Actor947: t02 + Owner: Neutral + Location: 51,81 + Actor949: t16 + Owner: Neutral + Location: 19,63 + Actor950: t01 + Owner: Neutral + Location: 81,18 + Actor952: t13.husk + Owner: Neutral + Location: 13,50 + Actor953: t08 + Owner: Neutral + Location: 96,73 + Actor954: t08 + Owner: Neutral + Location: 50,26 + Actor955: t05 + Owner: Neutral + Location: 29,84 + Actor957: t05 + Owner: Neutral + Location: 18,65 + Actor958: t03 + Owner: Neutral + Location: 14,49 + Actor959: t06 + Owner: Neutral + Location: 42,81 + Actor960: t01 + Owner: Neutral + Location: 87,63 + Actor961: t02 + Owner: Neutral + Location: 16,64 + Actor963: t08 + Owner: Neutral + Location: 78,15 + Actor964: t01 + Owner: Neutral + Location: 39,50 + Actor965: t13 + Owner: Neutral + Location: 53,53 + Actor967: t05 + Owner: Neutral + Location: 64,13 + Actor968: t06 + Owner: Neutral + Location: 78,42 + Actor969: t13 + Owner: Neutral + Location: 17,10 + Actor970: t16 + Owner: Neutral + Location: 42,69 + Actor972: t17 + Owner: Neutral + Location: 49,32 + Actor973: t03 + Owner: Neutral + Location: 43,71 + Actor974: t07 + Owner: Neutral + Location: 51,44 + Actor976: t06 + Owner: Neutral + Location: 45,21 + Actor977: t13 + Owner: Neutral + Location: 45,60 + Actor978: t06 + Owner: Neutral + Location: 85,37 + Actor979: t07 + Owner: Neutral + Location: 57,34 + Actor980: t12 + Owner: Neutral + Location: 89,65 + Actor981: t02 + Owner: Neutral + Location: 17,19 + Actor983: t08 + Owner: Neutral + Location: 10,81 + Actor984: t03 + Owner: Neutral + Location: 28,4 + Actor985: t16 + Owner: Neutral + Location: 21,85 + Actor986: t16 + Owner: Neutral + Location: 62,72 + Actor987: t07 + Owner: Neutral + Location: 69,67 + Actor988: t13 + Owner: Neutral + Location: 19,21 + Actor989: t13 + Owner: Neutral + Location: 40,70 + Actor990: t08.husk + Owner: Neutral + Location: 78,0 + Actor991: t12.husk + Owner: Neutral + Location: 16,31 + Actor992: t12 + Owner: Neutral + Location: 43,24 + Actor993: t06 + Owner: Neutral + Location: 15,12 + Actor994: t03 + Owner: Neutral + Location: 83,35 + Actor995: t16 + Owner: Neutral + Location: 38,44 + Actor996: t03 + Owner: Neutral + Location: 12,56 + Actor997: t08 + Owner: Neutral + Location: 77,28 + Actor998: t08 + Owner: Neutral + Location: 55,12 + Actor999: t05 + Owner: Neutral + Location: 0,2 + Actor1000: t17 + Owner: Neutral + Location: 84,51 + Actor1001: t12 + Owner: Neutral + Location: 19,58 + Actor1003: t17 + Owner: Neutral + Location: 14,29 + Actor1004: t17 + Owner: Neutral + Location: 2,44 + Actor1006: t12 + Owner: Neutral + Location: 15,0 + Actor1007: t06 + Owner: Neutral + Location: 75,55 + Actor1008: t03 + Owner: Neutral + Location: 82,37 + Actor1009: t01 + Owner: Neutral + Location: 44,24 + Actor1010: t12 + Owner: Neutral + Location: 48,79 + Actor1011: t01 + Owner: Neutral + Location: 27,2 + Actor1013: t02 + Owner: Neutral + Location: 10,89 + Actor1014: t13 + Owner: Neutral + Location: 0,84 + Actor1016: t08 + Owner: Neutral + Location: 89,67 + Actor1018: t06 + Owner: Neutral + Location: 18,32 + Actor1019: t06.husk + Owner: Neutral + Location: 12,31 + Actor1020: t13 + Owner: Neutral + Location: 21,42 + Actor1025: t12 + Owner: Neutral + Location: 19,29 + Actor1026: t17 + Owner: Neutral + Location: 48,25 + Actor1027: t13 + Owner: Neutral + Location: 15,61 + Actor1028: t02 + Owner: Neutral + Location: 10,51 + Actor1029: t01 + Owner: Neutral + Location: 42,61 + Actor1030: t01 + Owner: Neutral + Location: 90,71 + Actor1032: t02 + Owner: Neutral + Location: 54,49 + Actor1033: t16 + Owner: Neutral + Location: 41,80 + Actor1034: t06 + Owner: Neutral + Location: 16,62 + Actor1035: t06.husk + Owner: Neutral + Location: 74,24 + Actor1036: t06 + Owner: Neutral + Location: 7,58 + Actor1037: t12 + Owner: Neutral + Location: 26,79 + Actor1038: t17.husk + Owner: Neutral + Location: 56,54 + Actor1040: t06 + Owner: Neutral + Location: 44,72 + Actor1041: t01 + Owner: Neutral + Location: 80,40 + Actor1042: t16 + Owner: Neutral + Location: 76,19 + Actor1043: t03 + Owner: Neutral + Location: 59,9 + Actor1044: t06 + Owner: Neutral + Location: 15,35 + Actor1045: t08 + Owner: Neutral + Location: 58,54 + Actor1047: t07 + Owner: Neutral + Location: 28,81 + Actor1048: t13 + Owner: Neutral + Location: 90,58 + Actor1049: t13.husk + Owner: Neutral + Location: 83,36 + Actor1050: t13 + Owner: Neutral + Location: 48,17 + Actor1051: t02 + Owner: Neutral + Location: 94,72 + Actor1053: t02 + Owner: Neutral + Location: 56,41 + Actor1054: t06 + Owner: Neutral + Location: 0,0 + Actor1055: t13 + Owner: Neutral + Location: 11,58 + Actor1056: t16.husk + Owner: Neutral + Location: 22,63 + Actor1057: t05 + Owner: Neutral + Location: 41,69 + Actor1059: t16 + Owner: Neutral + Location: 16,77 + Actor1060: t06 + Owner: Neutral + Location: 47,18 + Actor1061: t02 + Owner: Neutral + Location: 55,54 + Actor1063: t16 + Owner: Neutral + Location: 77,26 + Actor1064: t16 + Owner: Neutral + Location: 19,30 + Actor1065: t01 + Owner: Neutral + Location: 51,37 + Actor1066: t01 + Owner: Neutral + Location: 79,50 + Actor1067: t07 + Owner: Neutral + Location: 49,71 + Actor1069: t13 + Owner: Neutral + Location: 42,78 + Actor1070: t01 + Owner: Neutral + Location: 42,83 + Actor1071: t17 + Owner: Neutral + Location: 12,1 + Actor1072: t12 + Owner: Neutral + Location: 80,27 + Actor1074: t13 + Owner: Neutral + Location: 85,54 + Actor1076: t06 + Owner: Neutral + Location: 73,53 + Actor1078: t17 + Owner: Neutral + Location: 9,0 + Actor1079: t01 + Owner: Neutral + Location: 79,56 + Actor1080: t03 + Owner: Neutral + Location: 40,72 + Actor1081: t16 + Owner: Neutral + Location: 79,44 + Actor1084: t08 + Owner: Neutral + Location: 85,52 + Actor1085: t03 + Owner: Neutral + Location: 23,82 + Actor1086: t07 + Owner: Neutral + Location: 84,50 + Actor1087: t08 + Owner: Neutral + Location: 28,77 + Actor1088: t17 + Owner: Neutral + Location: 72,51 + Actor1089: t08 + Owner: Neutral + Location: 2,14 + Actor1090: t13 + Owner: Neutral + Location: 85,67 + Actor1092: t07 + Owner: Neutral + Location: 87,49 + Actor1093: t12 + Owner: Neutral + Location: 20,56 + Actor1094: t07 + Owner: Neutral + Location: 84,43 + Actor1095: t13 + Owner: Neutral + Location: 43,79 + Actor1096: t08 + Owner: Neutral + Location: 58,38 + Actor1097: t12.husk + Owner: Neutral + Location: 72,36 + Actor1099: t13 + Owner: Neutral + Location: 85,42 + Actor1100: t17 + Owner: Neutral + Location: 20,29 + Actor1101: t12.husk + Owner: Neutral + Location: 90,65 + Actor1102: t08 + Owner: Neutral + Location: 59,50 + Actor1103: t17 + Owner: Neutral + Location: 5,90 + Actor1104: t03 + Owner: Neutral + Location: 80,29 + Actor1106: t08 + Owner: Neutral + Location: 80,24 + Actor1107: t13 + Owner: Neutral + Location: 8,7 + Actor1108: t12 + Owner: Neutral + Location: 77,17 + Actor1109: t13 + Owner: Neutral + Location: 20,28 + Actor1110: t17 + Owner: Neutral + Location: 21,22 + Actor1112: t17 + Owner: Neutral + Location: 88,61 + Actor1114: t07 + Owner: Neutral + Location: 1,46 + Actor1116: t02 + Owner: Neutral + Location: 96,36 + Actor1118: t12 + Owner: Neutral + Location: 52,52 + Actor1119: t01 + Owner: Neutral + Location: 24,61 + Actor1120: t12 + Owner: Neutral + Location: 16,20 + Actor1121: t17 + Owner: Neutral + Location: 20,63 + Actor1123: t06 + Owner: Neutral + Location: 89,63 + Actor1124: t03 + Owner: Neutral + Location: 48,54 + Actor1126: t12 + Owner: Neutral + Location: 41,45 + Actor1128: t13 + Owner: Neutral + Location: 24,86 + Actor1129: t03 + Owner: Neutral + Location: 57,32 + Actor1130: t06 + Owner: Neutral + Location: 96,73 + Actor1131: t13 + Owner: Neutral + Location: 43,22 + Actor1133: t16 + Owner: Neutral + Location: 51,73 + Actor1135: t03 + Owner: Neutral + Location: 64,4 + Actor1136: t02 + Owner: Neutral + Location: 77,46 + Actor1137: t07 + Owner: Neutral + Location: 53,31 + Actor1138: t06 + Owner: Neutral + Location: 50,42 + Actor1139: t07 + Owner: Neutral + Location: 1,79 + Actor1140: t01.husk + Owner: Neutral + Location: 43,23 + Actor1141: t16 + Owner: Neutral + Location: 61,57 + Actor1142: t05 + Owner: Neutral + Location: 76,55 + Actor1144: t01 + Owner: Neutral + Location: 74,56 + Actor1145: t06.husk + Owner: Neutral + Location: 5,1 + Actor1146: t16 + Owner: Neutral + Location: 90,63 + Actor1147: t01 + Owner: Neutral + Location: 91,63 + Actor1148: t01 + Owner: Neutral + Location: 96,70 + Actor1149: t05 + Owner: Neutral + Location: 2,39 + Actor1151: t05 + Owner: Neutral + Location: 10,62 + Actor1152: t02.husk + Owner: Neutral + Location: 83,53 + Actor1155: t08 + Owner: Neutral + Location: 7,60 + Actor1156: t05 + Owner: Neutral + Location: 39,53 + Actor1157: t01 + Owner: Neutral + Location: 11,63 + Actor1158: t07 + Owner: Neutral + Location: 21,28 + Actor1159: t16 + Owner: Neutral + Location: 42,52 + Actor1160: t16 + Owner: Neutral + Location: 62,74 + Actor1161: t12 + Owner: Neutral + Location: 51,56 + Actor1162: t03 + Owner: Neutral + Location: 44,39 + Actor1163: t01 + Owner: Neutral + Location: 1,17 + Actor1165: t05 + Owner: Neutral + Location: 40,40 + Actor1166: t06 + Owner: Neutral + Location: 0,49 + Actor1167: t01 + Owner: Neutral + Location: 10,81 + Actor1168: t01 + Owner: Neutral + Location: 80,1 + Actor1169: t16 + Owner: Neutral + Location: 83,56 + Actor1170: t07 + Owner: Neutral + Location: 54,7 + Actor1172: t01 + Owner: Neutral + Location: 54,55 + Actor1174: t07 + Owner: Neutral + Location: 78,44 + Actor1176: t16 + Owner: Neutral + Location: 2,77 + Actor1177: t02 + Owner: Neutral + Location: 56,59 + Actor1178: t07 + Owner: Neutral + Location: 6,45 + Actor1179: t08 + Owner: Neutral + Location: 24,84 + Actor1182: t01.husk + Owner: Neutral + Location: 43,63 + Actor1183: t06 + Owner: Neutral + Location: 48,4 + Actor1184: t01 + Owner: Neutral + Location: 56,32 + Actor1186: t06 + Owner: Neutral + Location: 13,56 + Actor1187: t16 + Owner: Neutral + Location: 74,25 + Actor1189: t17 + Owner: Neutral + Location: 46,62 + Actor1190: t16 + Owner: Neutral + Location: 96,58 + Actor1192: t06 + Owner: Neutral + Location: 76,16 + Actor1194: t05 + Owner: Neutral + Location: 40,52 + Actor1195: t02 + Owner: Neutral + Location: 58,56 + Actor1197: t12 + Owner: Neutral + Location: 96,24 + Actor1198: t02.husk + Owner: Neutral + Location: 42,23 + Actor1201: t07 + Owner: Neutral + Location: 29,7 + Actor1202: t13 + Owner: Neutral + Location: 87,68 + Actor1203: t13 + Owner: Neutral + Location: 55,8 + Actor1204: t08 + Owner: Neutral + Location: 15,75 + Actor1205: t01 + Owner: Neutral + Location: 3,46 + Actor1207: t02 + Owner: Neutral + Location: 50,43 + Actor1208: t05 + Owner: Neutral + Location: 96,37 + Actor1209: t06 + Owner: Neutral + Location: 2,37 + Actor1210: t16 + Owner: Neutral + Location: 88,68 + Actor1211: t12 + Owner: Neutral + Location: 42,59 + Actor1213: t13 + Owner: Neutral + Location: 12,50 + Actor1214: t08 + Owner: Neutral + Location: 0,10 + Actor1215: t16 + Owner: Neutral + Location: 7,43 + Actor1216: t06 + Owner: Neutral + Location: 92,63 + Actor1217: t02 + Owner: Neutral + Location: 53,58 + Actor1218: t12 + Owner: Neutral + Location: 10,63 + Actor1219: t05 + Owner: Neutral + Location: 50,56 + Actor1220: t16 + Owner: Neutral + Location: 61,54 + Actor1221: t12 + Owner: Neutral + Location: 55,58 + Actor1224: t13 + Owner: Neutral + Location: 18,20 + Actor1225: t02 + Owner: Neutral + Location: 42,68 + Actor1226: t07.husk + Owner: Neutral + Location: 3,81 + Actor1231: t07 + Owner: Neutral + Location: 49,52 + Actor1232: t02 + Owner: Neutral + Location: 42,79 + Actor1234: t17 + Owner: Neutral + Location: 2,7 + Actor1235: t05 + Owner: Neutral + Location: 13,75 + Actor1237: t16 + Owner: Neutral + Location: 27,5 + Actor1238: t01 + Owner: Neutral + Location: 61,68 + Actor1239: t03 + Owner: Neutral + Location: 60,57 + Actor1243: t05 + Owner: Neutral + Location: 41,70 + Actor1244: t03 + Owner: Neutral + Location: 74,47 + Actor1245: t08 + Owner: Neutral + Location: 83,50 + Actor1246: t03 + Owner: Neutral + Location: 76,52 + Actor1247: t17 + Owner: Neutral + Location: 69,4 + Actor1248: t03 + Owner: Neutral + Location: 18,9 + Actor1250: t01 + Owner: Neutral + Location: 42,62 + Actor1252: t17 + Owner: Neutral + Location: 64,64 + Actor1253: t17 + Owner: Neutral + Location: 38,64 + Actor1254: t12 + Owner: Neutral + Location: 42,35 + Actor1255: t08.husk + Owner: Neutral + Location: 38,48 + Actor1256: t01 + Owner: Neutral + Location: 80,50 + Actor1257: t17 + Owner: Neutral + Location: 39,60 + Actor1258: t01 + Owner: Neutral + Location: 85,50 + Actor1259: t06 + Owner: Neutral + Location: 49,20 + Actor1260: t01 + Owner: Neutral + Location: 27,3 + Actor1261: t07.husk + Owner: Neutral + Location: 0,12 + Actor1262: t02 + Owner: Neutral + Location: 84,39 + Actor1264: t03 + Owner: Neutral + Location: 92,64 + Actor1265: t03 + Owner: Neutral + Location: 14,50 + Actor1266: t08 + Owner: Neutral + Location: 62,66 + Actor1267: t05 + Owner: Neutral + Location: 11,56 + Actor1268: t12 + Owner: Neutral + Location: 82,21 + Actor1269: t03 + Owner: Neutral + Location: 38,49 + Actor1270: t06 + Owner: Neutral + Location: 92,55 + Actor1271: t01.husk + Owner: Neutral + Location: 1,10 + Actor1273: t07 + Owner: Neutral + Location: 22,82 + Actor1274: t16 + Owner: Neutral + Location: 51,11 + Actor1276: t02 + Owner: Neutral + Location: 36,11 + Actor1277: t01 + Owner: Neutral + Location: 48,20 + Actor1279: t07.husk + Owner: Neutral + Location: 39,78 + Actor1281: t13 + Owner: Neutral + Location: 86,38 + Actor1282: t05 + Owner: Neutral + Location: 2,41 + Actor1283: t12 + Owner: Neutral + Location: 82,59 + Actor1285: t03 + Owner: Neutral + Location: 57,7 + Actor1286: t07 + Owner: Neutral + Location: 86,0 + Actor1287: t17 + Owner: Neutral + Location: 79,49 + Actor1288: t16 + Owner: Neutral + Location: 16,10 + Actor1289: t07 + Owner: Neutral + Location: 77,22 + Actor1290: t06 + Owner: Neutral + Location: 51,45 + Actor1291: t05 + Owner: Neutral + Location: 30,76 + Actor1292: t08 + Owner: Neutral + Location: 51,50 + Actor1294: t02 + Owner: Neutral + Location: 89,62 + Actor1295: t02 + Owner: Neutral + Location: 84,3 + Actor1296: t12 + Owner: Neutral + Location: 56,43 + Actor1297: t13 + Owner: Neutral + Location: 73,42 + Actor1298: t06 + Owner: Neutral + Location: 30,74 + Actor1299: t16 + Owner: Neutral + Location: 18,28 + Actor1300: t12 + Owner: Neutral + Location: 29,1 + Actor1302: t06 + Owner: Neutral + Location: 41,64 + Actor1303: t02 + Owner: Neutral + Location: 44,37 + Actor1305: t01 + Owner: Neutral + Location: 54,59 + Actor1306: t16 + Owner: Neutral + Location: 27,79 + Actor1307: t05 + Owner: Neutral + Location: 36,52 + Actor1308: t08 + Owner: Neutral + Location: 8,77 + Actor1309: t12 + Owner: Neutral + Location: 57,33 + Actor1310: t12 + Owner: Neutral + Location: 20,58 + Actor1311: t01 + Owner: Neutral + Location: 3,35 + Actor1312: t17 + Owner: Neutral + Location: 87,11 + Actor1313: t03 + Owner: Neutral + Location: 16,56 + Actor1315: t12 + Owner: Neutral + Location: 17,27 + Actor1316: t07 + Owner: Neutral + Location: 27,81 + Actor1317: t01 + Owner: Neutral + Location: 10,0 + Actor1318: t17 + Owner: Neutral + Location: 86,66 + Actor1319: t06 + Owner: Neutral + Location: 8,8 + Actor1320: t07 + Owner: Neutral + Location: 6,40 + Actor1321: t05 + Owner: Neutral + Location: 40,67 + Actor1322: t08 + Owner: Neutral + Location: 13,60 + Actor1323: t08 + Owner: Neutral + Location: 47,82 + Actor1324: t05 + Owner: Neutral + Location: 59,55 + Actor1325: t07 + Owner: Neutral + Location: 45,68 + Actor1326: t07 + Owner: Neutral + Location: 19,43 + Actor1327: t05 + Owner: Neutral + Location: 50,79 + Actor1328: t12 + Owner: Neutral + Location: 8,12 + Actor1331: t17 + Owner: Neutral + Location: 91,55 + Actor1332: t05.husk + Owner: Neutral + Location: 77,57 + Actor1333: t08 + Owner: Neutral + Location: 44,63 + Actor1334: t07 + Owner: Neutral + Location: 28,85 + Actor1335: t12 + Owner: Neutral + Location: 3,82 + Actor1337: t05 + Owner: Neutral + Location: 1,16 + Actor1339: t13 + Owner: Neutral + Location: 53,50 + Actor1340: t07 + Owner: Neutral + Location: 44,41 + Actor1342: t08 + Owner: Neutral + Location: 28,74 + Actor1343: t16 + Owner: Neutral + Location: 49,79 + Actor1346: t07 + Owner: Neutral + Location: 2,14 + Actor1347: t02 + Owner: Neutral + Location: 3,49 + Actor1348: t12.husk + Owner: Neutral + Location: 28,82 + Actor1349: t07 + Owner: Neutral + Location: 39,79 + Actor1351: t05 + Owner: Neutral + Location: 7,1 + Actor1352: t05.husk + Owner: Neutral + Location: 47,70 + Actor1353: t03 + Owner: Neutral + Location: 84,38 + Actor1354: t01 + Owner: Neutral + Location: 50,80 + Actor1356: t01 + Owner: Neutral + Location: 38,67 + Actor1357: t08 + Owner: Neutral + Location: 23,82 + Actor1358: t08 + Owner: Neutral + Location: 36,13 + Actor1359: t07 + Owner: Neutral + Location: 54,10 + Actor1360: t17 + Owner: Neutral + Location: 87,64 + Actor1361: t05 + Owner: Neutral + Location: 88,2 + Actor1362: t01 + Owner: Neutral + Location: 50,70 + Actor1363: t01 + Owner: Neutral + Location: 3,4 + Actor1364: t16 + Owner: Neutral + Location: 40,49 + Actor1365: t07 + Owner: Neutral + Location: 58,42 + Actor1367: t07 + Owner: Neutral + Location: 8,69 + Actor1368: t12 + Owner: Neutral + Location: 6,62 + Actor1369: t16 + Owner: Neutral + Location: 32,25 + Actor1370: t03 + Owner: Neutral + Location: 39,48 + Actor1371: t17 + Owner: Neutral + Location: 29,4 + Actor1372: t05 + Owner: Neutral + Location: 38,46 + Actor1373: t06 + Owner: Neutral + Location: 71,12 + Actor1374: t08 + Owner: Neutral + Location: 62,56 + Actor1375: t08 + Owner: Neutral + Location: 58,47 + Actor1376: t02.husk + Owner: Neutral + Location: 41,68 + Actor1377: t17 + Owner: Neutral + Location: 45,65 + Actor1379: t16 + Owner: Neutral + Location: 1,84 + Actor1381: t02 + Owner: Neutral + Location: 86,46 + Actor1383: t03 + Owner: Neutral + Location: 39,21 + Actor1385: t06 + Owner: Neutral + Location: 85,68 + Actor1386: t08.husk + Owner: Neutral + Location: 38,51 + Actor1387: t08 + Owner: Neutral + Location: 2,18 + Actor1388: t17 + Owner: Neutral + Location: 20,17 + Actor1389: t13 + Owner: Neutral + Location: 26,76 + Actor1390: t02.husk + Owner: Neutral + Location: 76,15 + Actor1391: t06 + Owner: Neutral + Location: 0,45 + Actor1392: t08 + Owner: Neutral + Location: 8,12 + Actor1393: t01 + Owner: Neutral + Location: 13,7 + Actor1394: t01 + Owner: Neutral + Location: 46,66 + Actor1395: t02 + Owner: Neutral + Location: 15,49 + Actor1396: t06.husk + Owner: Neutral + Location: 42,82 + Actor1397: t06 + Owner: Neutral + Location: 14,10 + Actor1398: t12 + Owner: Neutral + Location: 90,3 + Actor1399: t16 + Owner: Neutral + Location: 2,16 + Actor1400: t17 + Owner: Neutral + Location: 58,12 + Actor1402: t12.husk + Owner: Neutral + Location: 4,1 + Actor1403: t13 + Owner: Neutral + Location: 16,26 + Actor1404: t12 + Owner: Neutral + Location: 43,59 + Actor1405: t03 + Owner: Neutral + Location: 91,64 + Actor1406: t01 + Owner: Neutral + Location: 60,53 + Actor1408: t01 + Owner: Neutral + Location: 96,45 + Actor1409: t03 + Owner: Neutral + Location: 16,54 + Actor1410: t05 + Owner: Neutral + Location: 53,48 + Actor1412: t05.husk + Owner: Neutral + Location: 77,44 + Actor1413: t02 + Owner: Neutral + Location: 17,62 + Actor1414: t12 + Owner: Neutral + Location: 89,61 + Actor1415: t03 + Owner: Neutral + Location: 77,52 + Actor1416: t07 + Owner: Neutral + Location: 0,10 + Actor1417: t03 + Owner: Neutral + Location: 25,79 + Actor1418: t03 + Owner: Neutral + Location: 42,43 + Actor1419: t02 + Owner: Neutral + Location: 79,0 + Actor1423: t13 + Owner: Neutral + Location: 58,75 + Actor1425: t02 + Owner: Neutral + Location: 1,8 + Actor1426: t13 + Owner: Neutral + Location: 45,62 + Actor1427: t06 + Owner: Neutral + Location: 77,47 + Actor1428: t17.husk + Owner: Neutral + Location: 38,51 + Actor1429: t05 + Owner: Neutral + Location: 76,17 + Actor1430: t05 + Owner: Neutral + Location: 44,47 + Actor1431: t16 + Owner: Neutral + Location: 22,86 + Actor1433: t03 + Owner: Neutral + Location: 12,57 + Actor1436: t13 + Owner: Neutral + Location: 55,50 + Actor1437: t07 + Owner: Neutral + Location: 13,58 + Actor1438: t07 + Owner: Neutral + Location: 86,35 + Actor1439: t12 + Owner: Neutral + Location: 42,34 + Actor1440: t16 + Owner: Neutral + Location: 57,10 + Actor1441: t16 + Owner: Neutral + Location: 62,68 + Actor1442: t03 + Owner: Neutral + Location: 79,2 + Actor1443: t08 + Owner: Neutral + Location: 56,45 + Actor1444: t08 + Owner: Neutral + Location: 15,14 + Actor1446: t06.husk + Owner: Neutral + Location: 78,45 + Actor1447: t03 + Owner: Neutral + Location: 9,10 + Actor1449: t08 + Owner: Neutral + Location: 70,5 + Actor1450: t17 + Owner: Neutral + Location: 1,43 + Actor1451: t02 + Owner: Neutral + Location: 58,48 + Actor1452: t13 + Owner: Neutral + Location: 62,76 + Actor1454: t06 + Owner: Neutral + Location: 62,71 + Actor1455: t05 + Owner: Neutral + Location: 60,11 + Actor1456: t01 + Owner: Neutral + Location: 47,26 + Actor1457: t05 + Owner: Neutral + Location: 64,66 + Actor1458: t05 + Owner: Neutral + Location: 5,44 + Actor1459: t08 + Owner: Neutral + Location: 96,29 + Actor1460: t07 + Owner: Neutral + Location: 57,42 + Actor1461: t13 + Owner: Neutral + Location: 83,29 + Actor1462: t08 + Owner: Neutral + Location: 10,3 + Actor1463: t17 + Owner: Neutral + Location: 2,2 + Actor1466: t05 + Owner: Neutral + Location: 89,67 + Actor1467: t13.husk + Owner: Neutral + Location: 87,46 + Actor1468: t08 + Owner: Neutral + Location: 75,28 + Actor1469: t05 + Owner: Neutral + Location: 95,27 + Actor1470: t02 + Owner: Neutral + Location: 5,42 + Actor1471: t05 + Owner: Neutral + Location: 32,79 + Actor1472: t03 + Owner: Neutral + Location: 51,54 + Actor1473: t12 + Owner: Neutral + Location: 42,60 + Actor1474: t07 + Owner: Neutral + Location: 76,56 + Actor1475: t16 + Owner: Neutral + Location: 56,45 + Actor1476: t02 + Owner: Neutral + Location: 97,27 + Actor1477: t07 + Owner: Neutral + Location: 2,78 + Actor1478: t05 + Owner: Neutral + Location: 8,42 + Actor1479: t08 + Owner: Neutral + Location: 1,19 + Actor1480: t12 + Owner: Neutral + Location: 61,45 + Actor1481: t02 + Owner: Neutral + Location: 15,19 + Actor1483: t12 + Owner: Neutral + Location: 49,53 + Actor1484: t02 + Owner: Neutral + Location: 20,64 + Actor1485: t02 + Owner: Neutral + Location: 96,71 + Actor1486: t13 + Owner: Neutral + Location: 85,52 + Actor1487: t03 + Owner: Neutral + Location: 84,40 + Actor1489: t16 + Owner: Neutral + Location: 83,51 + Actor1490: t07 + Owner: Neutral + Location: 11,8 + Actor1491: t02.husk + Owner: Neutral + Location: 39,72 + Actor1492: t02 + Owner: Neutral + Location: 18,56 + Actor1493: t08 + Owner: Neutral + Location: 6,2 + Actor1494: t02 + Owner: Neutral + Location: 41,49 + Actor1495: t13 + Owner: Neutral + Location: 60,71 + Actor1496: t13 + Owner: Neutral + Location: 25,83 + Actor1497: t12 + Owner: Neutral + Location: 75,57 + Actor1498: t13 + Owner: Neutral + Location: 60,37 + Actor1499: t16 + Owner: Neutral + Location: 24,63 + Actor1500: t07 + Owner: Neutral + Location: 39,67 + Actor1501: t13.husk + Owner: Neutral + Location: 54,48 + Actor1502: t03 + Owner: Neutral + Location: 8,9 + Actor1505: t05 + Owner: Neutral + Location: 24,85 + Actor1507: t13 + Owner: Neutral + Location: 19,62 + Actor1508: t12 + Owner: Neutral + Location: 39,46 + Actor1509: t07 + Owner: Neutral + Location: 50,81 + Actor1510: t03 + Owner: Neutral + Location: 58,41 + Actor1511: t17 + Owner: Neutral + Location: 22,39 + Actor1512: t02 + Owner: Neutral + Location: 1,54 + Actor1513: t01 + Owner: Neutral + Location: 25,85 + Actor1514: t05 + Owner: Neutral + Location: 12,54 + Actor1515: t01 + Owner: Neutral + Location: 55,9 + Actor1516: t08 + Owner: Neutral + Location: 16,79 + Actor1518: t17 + Owner: Neutral + Location: 61,39 + Actor1519: t07 + Owner: Neutral + Location: 52,81 + Actor1521: t17 + Owner: Neutral + Location: 95,39 + Actor1522: t05 + Owner: Neutral + Location: 12,37 + Actor1523: t08 + Owner: Neutral + Location: 93,35 + Actor1526: t12 + Owner: Neutral + Location: 56,34 + Actor1527: t16 + Owner: Neutral + Location: 89,72 + Actor1530: t06 + Owner: Neutral + Location: 64,14 + Actor1531: t06 + Owner: Neutral + Location: 1,38 + Actor1533: t06.husk + Owner: Neutral + Location: 11,55 + Actor1534: t06 + Owner: Neutral + Location: 8,91 + Actor1535: t08 + Owner: Neutral + Location: 29,84 + Actor1536: t03.husk + Owner: Neutral + Location: 14,31 + Actor1539: t06 + Owner: Neutral + Location: 95,41 + Actor1540: t17 + Owner: Neutral + Location: 1,7 + Actor1541: t16 + Owner: Neutral + Location: 33,25 + Actor1542: t02 + Owner: Neutral + Location: 18,57 + Actor1544: t02 + Owner: Neutral + Location: 56,10 + Actor1545: t03 + Owner: Neutral + Location: 87,71 + Actor1546: t17.husk + Owner: Neutral + Location: 84,54 + Actor1547: t13 + Owner: Neutral + Location: 43,45 + Actor1548: t06 + Owner: Neutral + Location: 60,47 + Actor1549: t01 + Owner: Neutral + Location: 25,76 + Actor1551: t03 + Owner: Neutral + Location: 61,46 + Actor1552: t01.husk + Owner: Neutral + Location: 2,79 + Actor1553: t12 + Owner: Neutral + Location: 52,36 + Actor1555: t17 + Owner: Neutral + Location: 9,79 + Actor1557: t02 + Owner: Neutral + Location: 0,78 + Actor1558: t16 + Owner: Neutral + Location: 59,10 + Actor1559: t17 + Owner: Neutral + Location: 61,55 + Actor1560: t17 + Owner: Neutral + Location: 77,50 + Actor1562: t08 + Owner: Neutral + Location: 86,48 + Actor1564: t03.husk + Owner: Neutral + Location: 65,78 + Actor1566: t12 + Owner: Neutral + Location: 17,21 + Actor1567: t13 + Owner: Neutral + Location: 86,64 + Actor1568: t05.husk + Owner: Neutral + Location: 62,69 + Actor1569: t05.husk + Owner: Neutral + Location: 79,46 + Actor1571: t06 + Owner: Neutral + Location: 50,49 + Actor1572: t08 + Owner: Neutral + Location: 96,28 + Actor1573: t13 + Owner: Neutral + Location: 2,38 + Actor1574: t13 + Owner: Neutral + Location: 94,40 + Actor1575: t16.husk + Owner: Neutral + Location: 53,55 + Actor1577: t12.husk + Owner: Neutral + Location: 4,46 + Actor1579: t13 + Owner: Neutral + Location: 96,56 + Actor1580: t06.husk + Owner: Neutral + Location: 77,53 + Actor1582: t05 + Owner: Neutral + Location: 45,25 + Actor1584: t17 + Owner: Neutral + Location: 87,62 + Actor1585: t06 + Owner: Neutral + Location: 55,32 + Actor1586: t06 + Owner: Neutral + Location: 13,26 + Actor1587: t08 + Owner: Neutral + Location: 57,41 + Actor1589: t17 + Owner: Neutral + Location: 25,84 + Actor1590: t13 + Owner: Neutral + Location: 57,8 + Actor1591: t12 + Owner: Neutral + Location: 89,71 + Actor1592: t13 + Owner: Neutral + Location: 29,73 + Actor1593: t12 + Owner: Neutral + Location: 15,55 + Actor1594: t07 + Owner: Neutral + Location: 49,24 + Actor1596: t02 + Owner: Neutral + Location: 81,37 + Actor1601: t03 + Owner: Neutral + Location: 43,65 + Actor1602: t13 + Owner: Neutral + Location: 8,87 + Actor1604: t12 + Owner: Neutral + Location: 0,4 + Actor1605: t01 + Owner: Neutral + Location: 12,8 + Actor1606: t03 + Owner: Neutral + Location: 61,72 + Actor1607: t16 + Owner: Neutral + Location: 6,43 + Actor1608: t16 + Owner: Neutral + Location: 17,79 + Actor1609: t13 + Owner: Neutral + Location: 78,56 + Actor1610: t05 + Owner: Neutral + Location: 3,42 + Actor1611: t17 + Owner: Neutral + Location: 54,33 + Actor1613: t13 + Owner: Neutral + Location: 27,85 + Actor1614: t03 + Owner: Neutral + Location: 39,52 + Actor1616: t08 + Owner: Neutral + Location: 53,43 + Actor1618: t06 + Owner: Neutral + Location: 86,51 + Actor1619: t02 + Owner: Neutral + Location: 74,53 + Actor1621: t03 + Owner: Neutral + Location: 43,80 + Actor1622: t13.husk + Owner: Neutral + Location: 82,18 + Actor1623: t03 + Owner: Neutral + Location: 88,66 + Actor1624: t03 + Owner: Neutral + Location: 42,84 + Actor1630: t17 + Owner: Neutral + Location: 62,64 + Actor1631: t03 + Owner: Neutral + Location: 1,50 + Actor1632: t13 + Owner: Neutral + Location: 19,64 + Actor1633: t01 + Owner: Neutral + Location: 90,64 + Actor1634: t07 + Owner: Neutral + Location: 13,34 + Actor1636: t02 + Owner: Neutral + Location: 85,66 + Actor1637: t01 + Owner: Neutral + Location: 81,13 + Actor1638: t08 + Owner: Neutral + Location: 89,4 + Actor1640: t03 + Owner: Neutral + Location: 21,62 + Actor1641: t05 + Owner: Neutral + Location: 47,63 + Actor1642: t06 + Owner: Neutral + Location: 35,14 + Actor1643: t16 + Owner: Neutral + Location: 35,11 + Actor1644: t13 + Owner: Neutral + Location: 52,35 + Actor1645: t05 + Owner: Neutral + Location: 10,76 + Actor1646: t13 + Owner: Neutral + Location: 15,56 + Actor1647: t12 + Owner: Neutral + Location: 78,43 + Actor1649: t13 + Owner: Neutral + Location: 50,71 + Actor1652: t13 + Owner: Neutral + Location: 52,43 + Actor1653: t03 + Owner: Neutral + Location: 5,41 + Actor1654: t17 + Owner: Neutral + Location: 45,43 + Actor1655: t08 + Owner: Neutral + Location: 47,72 + Actor1656: t13 + Owner: Neutral + Location: 60,67 + Actor1657: t06 + Owner: Neutral + Location: 13,60 + Actor1658: t12 + Owner: Neutral + Location: 82,22 + Actor1659: t16 + Owner: Neutral + Location: 18,64 + Actor1660: t03 + Owner: Neutral + Location: 16,76 + Actor1661: t06 + Owner: Neutral + Location: 29,79 + Actor1662: t08 + Owner: Neutral + Location: 42,47 + Actor1664: t13 + Owner: Neutral + Location: 52,56 + Actor1665: t06 + Owner: Neutral + Location: 69,14 + Actor1666: t16 + Owner: Neutral + Location: 75,18 + Actor1669: t08 + Owner: Neutral + Location: 26,74 + Actor1670: t17 + Owner: Neutral + Location: 19,55 + Actor1671: t01 + Owner: Neutral + Location: 29,74 + Actor1672: t08.husk + Owner: Neutral + Location: 88,2 + Actor1673: t07 + Owner: Neutral + Location: 44,23 + Actor1674: t13.husk + Owner: Neutral + Location: 78,0 + Actor1675: t06 + Owner: Neutral + Location: 22,41 + Actor1676: t12 + Owner: Neutral + Location: 1,80 + Actor1677: t02 + Owner: Neutral + Location: 15,37 + Actor1678: t12 + Owner: Neutral + Location: 76,18 + Actor1679: t12 + Owner: Neutral + Location: 77,43 + Actor1681: t07 + Owner: Neutral + Location: 41,62 + Actor1682: t01.husk + Owner: Neutral + Location: 52,53 + Actor1683: t07 + Owner: Neutral + Location: 48,52 + Actor1684: t03 + Owner: Neutral + Location: 14,11 + Actor1685: t05.husk + Owner: Neutral + Location: 53,11 + Actor1686: t06 + Owner: Neutral + Location: 79,12 + Actor1689: t12 + Owner: Neutral + Location: 43,72 + Actor1690: t17 + Owner: Neutral + Location: 0,80 + Actor1691: t13 + Owner: Neutral + Location: 68,66 + Actor1692: t08 + Owner: Neutral + Location: 16,12 + Actor1694: t07 + Owner: Neutral + Location: 44,81 + Actor1695: t16 + Owner: Neutral + Location: 82,52 + Actor1696: t02 + Owner: Neutral + Location: 82,34 + Actor1697: t06 + Owner: Neutral + Location: 80,56 + Actor1698: t17 + Owner: Neutral + Location: 18,27 + Actor1699: t01 + Owner: Neutral + Location: 51,31 + Actor1700: t05 + Owner: Neutral + Location: 6,90 + Actor1701: t12 + Owner: Neutral + Location: 12,82 + Actor1704: t05 + Owner: Neutral + Location: 22,21 + Actor1705: t03 + Owner: Neutral + Location: 15,79 + Actor1706: t01 + Owner: Neutral + Location: 45,67 + Actor1707: t03 + Owner: Neutral + Location: 90,66 + Actor1708: t07 + Owner: Neutral + Location: 50,55 + Actor1709: t03 + Owner: Neutral + Location: 21,17 + Actor1711: t08 + Owner: Neutral + Location: 43,36 + Actor1712: t12 + Owner: Neutral + Location: 4,48 + Actor1713: t07 + Owner: Neutral + Location: 30,10 + Actor1714: t12 + Owner: Neutral + Location: 63,66 + Actor1715: t17 + Owner: Neutral + Location: 51,51 + Actor1716: t05 + Owner: Neutral + Location: 14,66 + Actor1717: t03 + Owner: Neutral + Location: 94,71 + Actor1718: t05 + Owner: Neutral + Location: 90,68 + Actor1719: t07 + Owner: Neutral + Location: 40,53 + Actor1720: t01 + Owner: Neutral + Location: 64,78 + Actor1721: t05 + Owner: Neutral + Location: 0,77 + Actor1722: t17 + Owner: Neutral + Location: 9,2 + Actor1723: t06 + Owner: Neutral + Location: 91,58 + Actor1724: t12 + Owner: Neutral + Location: 62,67 + Actor1725: t02 + Owner: Neutral + Location: 2,46 + Actor1726: t01 + Owner: Neutral + Location: 40,62 + Actor1728: t13 + Owner: Neutral + Location: 2,11 + Actor1729: t03 + Owner: Neutral + Location: 13,81 + Actor1732: t03 + Owner: Neutral + Location: 94,1 + Actor1733: t13 + Owner: Neutral + Location: 55,55 + Actor1736: t07.husk + Owner: Neutral + Location: 10,7 + Actor1737: t17 + Owner: Neutral + Location: 2,8 + Actor1738: t08 + Owner: Neutral + Location: 21,67 + Actor1739: t17 + Owner: Neutral + Location: 46,25 + Actor1740: t05 + Owner: Neutral + Location: 15,67 + Actor1742: t13 + Owner: Neutral + Location: 92,59 + Actor1743: t03 + Owner: Neutral + Location: 81,51 + Actor1744: t13.husk + Owner: Neutral + Location: 78,12 + Actor1746: t08.husk + Owner: Neutral + Location: 13,30 + Actor1747: t01 + Owner: Neutral + Location: 29,6 + Actor1748: t07 + Owner: Neutral + Location: 36,13 + Actor1751: t13 + Owner: Neutral + Location: 14,39 + Actor1752: t07 + Owner: Neutral + Location: 14,38 + Actor1753: t07 + Owner: Neutral + Location: 15,57 + Actor1754: t03 + Owner: Neutral + Location: 6,88 + Actor1755: t03.husk + Owner: Neutral + Location: 14,83 + Actor1756: t02 + Owner: Neutral + Location: 80,57 + Actor1757: t02.husk + Owner: Neutral + Location: 51,40 + Actor1758: t02 + Owner: Neutral + Location: 23,60 + Actor1759: t13 + Owner: Neutral + Location: 46,22 + Actor1761: t06 + Owner: Neutral + Location: 8,58 + Actor1762: t08 + Owner: Neutral + Location: 7,58 + Actor1763: t12 + Owner: Neutral + Location: 52,50 + Actor1765: t17 + Owner: Neutral + Location: 45,23 + Actor1766: t17 + Owner: Neutral + Location: 87,50 + Actor1768: t06 + Owner: Neutral + Location: 16,29 + Actor1769: t12 + Owner: Neutral + Location: 51,52 + Actor1770: t07 + Owner: Neutral + Location: 51,19 + Actor1771: t03 + Owner: Neutral + Location: 86,68 + Actor1772: t17 + Owner: Neutral + Location: 14,77 + Actor1773: t05 + Owner: Neutral + Location: 6,63 + Actor1774: t07 + Owner: Neutral + Location: 3,37 + Actor1775: t12 + Owner: Neutral + Location: 0,85 + Actor1776: t03 + Owner: Neutral + Location: 91,59 + Actor1777: t07 + Owner: Neutral + Location: 81,45 + Actor1778: t06 + Owner: Neutral + Location: 39,47 + Actor1780: t03.husk + Owner: Neutral + Location: 83,50 + Actor1781: t13 + Owner: Neutral + Location: 1,53 + Actor1783: t07 + Owner: Neutral + Location: 7,0 + Actor1784: t13 + Owner: Neutral + Location: 86,39 + Actor1785: t05 + Owner: Neutral + Location: 40,60 + Actor1787: t13 + Owner: Neutral + Location: 37,47 + Actor1788: t08 + Owner: Neutral + Location: 41,23 + Actor1789: t07.husk + Owner: Neutral + Location: 80,58 + Actor1791: t16 + Owner: Neutral + Location: 58,43 + Actor1792: t08 + Owner: Neutral + Location: 28,79 + Actor1793: t01 + Owner: Neutral + Location: 89,59 + Actor1794: t17 + Owner: Neutral + Location: 25,36 + Actor1795: t07 + Owner: Neutral + Location: 23,80 + Actor1796: t07 + Owner: Neutral + Location: 13,48 + Actor1797: t01.husk + Owner: Neutral + Location: 53,41 + Actor1798: t08 + Owner: Neutral + Location: 50,39 + Actor1799: t13 + Owner: Neutral + Location: 84,53 + Actor1801: t12 + Owner: Neutral + Location: 38,69 + Actor1802: t05 + Owner: Neutral + Location: 61,74 + Actor1803: t06 + Owner: Neutral + Location: 74,52 + Actor1804: t01 + Owner: Neutral + Location: 23,83 + Actor1805: t07 + Owner: Neutral + Location: 53,33 + Actor1806: t12 + Owner: Neutral + Location: 12,10 + Actor1807: t08 + Owner: Neutral + Location: 24,38 + Actor1810: t03 + Owner: Neutral + Location: 71,39 + Actor1812: t13 + Owner: Neutral + Location: 63,78 + Actor1813: t06 + Owner: Neutral + Location: 52,34 + Actor1814: t16 + Owner: Neutral + Location: 62,38 + Actor1815: t13.husk + Owner: Neutral + Location: 40,21 + Actor1816: t08 + Owner: Neutral + Location: 54,58 + Actor1817: t16 + Owner: Neutral + Location: 85,1 + Actor1818: t03 + Owner: Neutral + Location: 46,15 + Actor1819: t07 + Owner: Neutral + Location: 11,64 + Actor1821: t01 + Owner: Neutral + Location: 79,22 + Actor1822: t01 + Owner: Neutral + Location: 1,39 + Actor1824: t06 + Owner: Neutral + Location: 11,9 + Actor1826: t06 + Owner: Neutral + Location: 9,88 + Actor1828: t17 + Owner: Neutral + Location: 43,82 + Actor1829: t13 + Owner: Neutral + Location: 19,28 + Actor1830: t07 + Owner: Neutral + Location: 1,76 + Actor1831: t02.husk + Owner: Neutral + Location: 1,51 + Actor1833: t13 + Owner: Neutral + Location: 29,2 + Actor1834: t16 + Owner: Neutral + Location: 2,82 + Actor1835: t01 + Owner: Neutral + Location: 29,65 + Actor1836: t02 + Owner: Neutral + Location: 95,63 + Actor1837: t12.husk + Owner: Neutral + Location: 2,5 + Actor1838: t02 + Owner: Neutral + Location: 61,49 + Actor1839: t08 + Owner: Neutral + Location: 80,18 + Actor1842: t12 + Owner: Neutral + Location: 16,79 + Actor1843: t12 + Owner: Neutral + Location: 79,45 + Actor1844: t07 + Owner: Neutral + Location: 61,50 + Actor1848: t08.husk + Owner: Neutral + Location: 54,37 + Actor1851: t16 + Owner: Neutral + Location: 24,82 + Actor1852: t16 + Owner: Neutral + Location: 81,48 + Actor1853: t13 + Owner: Neutral + Location: 86,41 + Actor1856: t01 + Owner: Neutral + Location: 7,69 + Actor1858: t08 + Owner: Neutral + Location: 23,63 + Actor1859: t12 + Owner: Neutral + Location: 12,58 + Actor1860: t12 + Owner: Neutral + Location: 38,80 + Actor1861: t17 + Owner: Neutral + Location: 42,71 + Actor1862: t16 + Owner: Neutral + Location: 77,55 + Actor1863: t05 + Owner: Neutral + Location: 7,9 + Actor1864: t06 + Owner: Neutral + Location: 7,63 + Actor1866: t07 + Owner: Neutral + Location: 38,20 + Actor1867: t05 + Owner: Neutral + Location: 61,10 + Actor1868: t02.husk + Owner: Neutral + Location: 94,29 + Actor1870: t17 + Owner: Neutral + Location: 17,9 + Actor1871: t07 + Owner: Neutral + Location: 62,70 + Actor1873: t16 + Owner: Neutral + Location: 93,53 + Actor1874: t03 + Owner: Neutral + Location: 82,58 + Actor1875: t05 + Owner: Neutral + Location: 27,1 + Actor1876: t03 + Owner: Neutral + Location: 16,19 + Actor1877: t17.husk + Owner: Neutral + Location: 76,27 + Actor1878: t13 + Owner: Neutral + Location: 54,32 + Actor1880: t17.husk + Owner: Neutral + Location: 57,43 + Actor1881: t05 + Owner: Neutral + Location: 46,26 + Actor1882: t16 + Owner: Neutral + Location: 46,65 + Actor1884: t01 + Owner: Neutral + Location: 17,63 + Actor1885: t06 + Owner: Neutral + Location: 15,96 + Actor1886: t08 + Owner: Neutral + Location: 50,33 + Actor1887: t07 + Owner: Neutral + Location: 39,51 + Actor1888: t12 + Owner: Neutral + Location: 72,38 + Actor1890: t01 + Owner: Neutral + Location: 70,14 + Actor1891: t16.husk + Owner: Neutral + Location: 88,63 + Actor1892: t16 + Owner: Neutral + Location: 96,65 + Actor1893: t01 + Owner: Neutral + Location: 2,83 + Actor1894: t03 + Owner: Neutral + Location: 47,67 + Actor1895: t13.husk + Owner: Neutral + Location: 8,79 + Actor1896: t12 + Owner: Neutral + Location: 4,45 + Actor1898: t17 + Owner: Neutral + Location: 49,72 + Actor1900: t03 + Owner: Neutral + Location: 89,60 + Actor1901: t05 + Owner: Neutral + Location: 48,16 + Actor1904: t12 + Owner: Neutral + Location: 1,78 + Actor1905: t06 + Owner: Neutral + Location: 84,56 + Actor1906: t12 + Owner: Neutral + Location: 87,45 + Actor1907: t16 + Owner: Neutral + Location: 85,39 + Actor1908: t05 + Owner: Neutral + Location: 45,61 + Actor1909: t06.husk + Owner: Neutral + Location: 17,56 + Actor1910: t12 + Owner: Neutral + Location: 55,10 + Actor1911: t16 + Owner: Neutral + Location: 49,55 + Actor1912: t13 + Owner: Neutral + Location: 44,46 + Actor1913: t05 + Owner: Neutral + Location: 60,38 + Actor1914: t13.husk + Owner: Neutral + Location: 15,80 + Actor1915: t16 + Owner: Neutral + Location: 77,15 + Actor1916: t17 + Owner: Neutral + Location: 37,70 + Actor1917: t02 + Owner: Neutral + Location: 1,82 + Actor1918: t03 + Owner: Neutral + Location: 41,46 + Actor1921: t01 + Owner: Neutral + Location: 51,74 + Actor1922: t05 + Owner: Neutral + Location: 41,18 + Actor1926: t05 + Owner: Neutral + Location: 29,81 + Actor1927: t12 + Owner: Neutral + Location: 81,3 + Actor1928: t05 + Owner: Neutral + Location: 56,58 + Actor1931: t12.husk + Owner: Neutral + Location: 10,75 + Actor1933: t08 + Owner: Neutral + Location: 79,43 + Actor1934: t02 + Owner: Neutral + Location: 57,47 + Actor1935: t01 + Owner: Neutral + Location: 88,70 + Actor1937: t01 + Owner: Neutral + Location: 78,55 + Actor1939: t12 + Owner: Neutral + Location: 90,59 + Actor1940: t06 + Owner: Neutral + Location: 80,42 + Actor1941: t13.husk + Owner: Neutral + Location: 7,11 + Actor1943: t06 + Owner: Neutral + Location: 14,60 + Actor1944: t13 + Owner: Neutral + Location: 18,33 + Actor1945: t07 + Owner: Neutral + Location: 11,69 + Actor1946: t06 + Owner: Neutral + Location: 76,51 + Actor1947: t12 + Owner: Neutral + Location: 96,7 + Actor1948: t03 + Owner: Neutral + Location: 36,70 + Actor1949: t17 + Owner: Neutral + Location: 20,57 + Actor1950: t05 + Owner: Neutral + Location: 18,75 + Actor1951: t16 + Owner: Neutral + Location: 39,43 + Actor1952: t06 + Owner: Neutral + Location: 59,75 + Actor1953: t05 + Owner: Neutral + Location: 13,49 + Actor1954: t13 + Owner: Neutral + Location: 23,22 + Actor1955: t12 + Owner: Neutral + Location: 43,66 + Actor1956: t02 + Owner: Neutral + Location: 30,7 + Actor1958: t16 + Owner: Neutral + Location: 59,72 + Actor1959: t16 + Owner: Neutral + Location: 51,35 + Actor1960: t13 + Owner: Neutral + Location: 9,80 + Actor1961: t08 + Owner: Neutral + Location: 44,22 + Actor1962: t12 + Owner: Neutral + Location: 8,77 + Actor1963: t05 + Owner: Neutral + Location: 20,27 + Actor1964: t03 + Owner: Neutral + Location: 38,59 + Actor1966: t01 + Owner: Neutral + Location: 13,38 + Actor1967: t05.husk + Owner: Neutral + Location: 23,37 + Actor1968: t12 + Owner: Neutral + Location: 41,78 + Actor1969: t07.husk + Owner: Neutral + Location: 9,90 + Actor1970: t01 + Owner: Neutral + Location: 81,50 + Actor1972: t17 + Owner: Neutral + Location: 54,54 + Actor1974: t03 + Owner: Neutral + Location: 1,81 + Actor1977: t08 + Owner: Neutral + Location: 67,63 + Actor1979: t01 + Owner: Neutral + Location: 49,49 + Actor1980: t03 + Owner: Neutral + Location: 53,38 + Actor1981: t07 + Owner: Neutral + Location: 42,70 + Actor1982: t08 + Owner: Neutral + Location: 46,24 + Actor1983: t05 + Owner: Neutral + Location: 43,69 + Actor1984: t12 + Owner: Neutral + Location: 92,61 + Actor1985: t07 + Owner: Neutral + Location: 38,60 + Actor1986: t08 + Owner: Neutral + Location: 19,66 + Actor1987: t05 + Owner: Neutral + Location: 27,82 + Actor1988: t16 + Owner: Neutral + Location: 84,29 + Actor1989: t05 + Owner: Neutral + Location: 83,4 + Actor1991: t16 + Owner: Neutral + Location: 29,3 + Actor1992: t06 + Owner: Neutral + Location: 77,16 + Actor1996: t01 + Owner: Neutral + Location: 0,15 + Actor1997: t07 + Owner: Neutral + Location: 28,3 + Actor1998: t06.husk + Owner: Neutral + Location: 14,57 + Actor1999: t02 + Owner: Neutral + Location: 41,21 + Actor2000: t06 + Owner: Neutral + Location: 0,6 + Actor2001: t05 + Owner: Neutral + Location: 54,37 + Actor2002: t03 + Owner: Neutral + Location: 86,69 + Actor2004: t13 + Owner: Neutral + Location: 50,72 + Actor2005: t02 + Owner: Neutral + Location: 26,86 + Actor2006: t03 + Owner: Neutral + Location: 35,13 + Actor2007: t06 + Owner: Neutral + Location: 64,37 + Actor2008: t06 + Owner: Neutral + Location: 77,18 + Actor2009: t02 + Owner: Neutral + Location: 14,51 + Actor2010: t01.husk + Owner: Neutral + Location: 93,50 + Actor2011: t08.husk + Owner: Neutral + Location: 95,39 + Actor2012: t17 + Owner: Neutral + Location: 43,78 + Actor2013: t05 + Owner: Neutral + Location: 78,46 + Actor2014: t13 + Owner: Neutral + Location: 2,3 + Actor2015: t08 + Owner: Neutral + Location: 84,50 + Actor2016: t17 + Owner: Neutral + Location: 53,51 + Actor2017: t13 + Owner: Neutral + Location: 60,69 + Actor2020: t06 + Owner: Neutral + Location: 65,65 + Actor2021: t13 + Owner: Neutral + Location: 50,48 + Actor2022: t17 + Owner: Neutral + Location: 40,46 + Actor2024: t13 + Owner: Neutral + Location: 79,57 + Actor2025: t13 + Owner: Neutral + Location: 85,69 + Actor2026: t12 + Owner: Neutral + Location: 50,36 + Actor2027: t16 + Owner: Neutral + Location: 53,32 + Actor2028: t01 + Owner: Neutral + Location: 74,19 + Actor2029: t03 + Owner: Neutral + Location: 81,26 + Actor2032: t03 + Owner: Neutral + Location: 28,74 + Actor2033: t06 + Owner: Neutral + Location: 56,55 + Actor2034: t13 + Owner: Neutral + Location: 81,16 + Actor2035: t12 + Owner: Neutral + Location: 18,67 + Actor2036: t17.husk + Owner: Neutral + Location: 35,69 + Actor2037: t06 + Owner: Neutral + Location: 38,65 + Actor2038: t13 + Owner: Neutral + Location: 48,73 + Actor2039: t16 + Owner: Neutral + Location: 12,63 + Actor2040: t13 + Owner: Neutral + Location: 81,52 + Actor2041: t17.husk + Owner: Neutral + Location: 87,47 + Actor2042: t01 + Owner: Neutral + Location: 7,90 + Actor2043: t13 + Owner: Neutral + Location: 42,67 + Actor2044: t16.husk + Owner: Neutral + Location: 52,37 + Actor2046: t07 + Owner: Neutral + Location: 25,80 + Actor2047: t06 + Owner: Neutral + Location: 84,1 + Actor2048: t06 + Owner: Neutral + Location: 17,64 + Actor2049: t02 + Owner: Neutral + Location: 46,24 + Actor2051: t16 + Owner: Neutral + Location: 55,59 + Actor2053: t07 + Owner: Neutral + Location: 95,66 + Actor2054: t02 + Owner: Neutral + Location: 20,42 + Actor2055: t03 + Owner: Neutral + Location: 79,17 + Actor2056: t02 + Owner: Neutral + Location: 14,32 + Actor2057: t12.husk + Owner: Neutral + Location: 53,39 + Actor2058: t06.husk + Owner: Neutral + Location: 7,89 + Actor2059: t03 + Owner: Neutral + Location: 16,12 + Actor2060: t17 + Owner: Neutral + Location: 50,52 + Actor2061: t02 + Owner: Neutral + Location: 91,61 + Actor2062: t12.husk + Owner: Neutral + Location: 47,21 + Actor2064: t13 + Owner: Neutral + Location: 5,43 + Actor2065: t07 + Owner: Neutral + Location: 39,62 + Actor2068: t06 + Owner: Neutral + Location: 1,5 + Actor2069: t17 + Owner: Neutral + Location: 40,81 + Actor2070: t05 + Owner: Neutral + Location: 12,9 + Actor2071: t08 + Owner: Neutral + Location: 83,38 + Actor2072: t02 + Owner: Neutral + Location: 37,68 + Actor2073: t17.husk + Owner: Neutral + Location: 15,64 + Actor2074: t13.husk + Owner: Neutral + Location: 41,59 + Actor2075: t01 + Owner: Neutral + Location: 92,53 + Actor2076: t03 + Owner: Neutral + Location: 33,24 + Actor2077: t03.husk + Owner: Neutral + Location: 37,64 + Actor2078: t05.husk + Owner: Neutral + Location: 20,61 + Actor2079: t16 + Owner: Neutral + Location: 81,29 + Actor2080: t07 + Owner: Neutral + Location: 75,24 + Actor2081: t08 + Owner: Neutral + Location: 79,22 + Actor2082: t06 + Owner: Neutral + Location: 59,76 + Actor2084: t13 + Owner: Neutral + Location: 0,43 + Actor2085: t12 + Owner: Neutral + Location: 70,11 + Actor2086: t06 + Owner: Neutral + Location: 73,51 + Actor2087: t05.husk + Owner: Neutral + Location: 0,86 + Actor2089: t05 + Owner: Neutral + Location: 67,34 + Actor2090: t03 + Owner: Neutral + Location: 13,32 + Actor2091: t13 + Owner: Neutral + Location: 16,66 + Actor2092: t08 + Owner: Neutral + Location: 53,44 + Actor2093: t06 + Owner: Neutral + Location: 32,80 + Actor2094: t12.husk + Owner: Neutral + Location: 49,21 + Actor2095: t13 + Owner: Neutral + Location: 19,27 + Actor2096: t12 + Owner: Neutral + Location: 90,2 + Actor2097: t01 + Owner: Neutral + Location: 75,26 + Actor2098: t17.husk + Owner: Neutral + Location: 9,78 + Actor2099: t12 + Owner: Neutral + Location: 34,69 + Actor2100: t08 + Owner: Neutral + Location: 59,48 + Actor2101: t06 + Owner: Neutral + Location: 92,62 + Actor2102: t16 + Owner: Neutral + Location: 93,2 + Actor2103: t06 + Owner: Neutral + Location: 75,23 + Actor2104: t08 + Owner: Neutral + Location: 27,5 + Actor2105: t01 + Owner: Neutral + Location: 13,57 + Actor2106: t05 + Owner: Neutral + Location: 44,83 + Actor2107: t01 + Owner: Neutral + Location: 7,44 + Actor2108: t02 + Owner: Neutral + Location: 50,26 + Actor2109: t02 + Owner: Neutral + Location: 10,10 + Actor2110: t08 + Owner: Neutral + Location: 86,12 + Actor2111: t03 + Owner: Neutral + Location: 10,8 + Actor2112: t03 + Owner: Neutral + Location: 4,41 + Actor2113: t02 + Owner: Neutral + Location: 44,66 + Actor2114: t12.husk + Owner: Neutral + Location: 47,69 + Actor2117: t02.husk + Owner: Neutral + Location: 77,23 + Actor2118: t03 + Owner: Neutral + Location: 49,36 + Actor2119: t13 + Owner: Neutral + Location: 90,62 + Actor2121: t08 + Owner: Neutral + Location: 60,40 + Actor2122: t02 + Owner: Neutral + Location: 0,7 + Actor2123: t08 + Owner: Neutral + Location: 66,79 + Actor2125: t05 + Owner: Neutral + Location: 28,75 + Actor2126: t16 + Owner: Neutral + Location: 18,30 + Actor2127: t02 + Owner: Neutral + Location: 84,0 + Actor2128: t12 + Owner: Neutral + Location: 42,21 + Actor2129: t17 + Owner: Neutral + Location: 22,62 + Actor2130: t16 + Owner: Neutral + Location: 18,31 + Actor2132: t07 + Owner: Neutral + Location: 1,15 + Actor2133: t03 + Owner: Neutral + Location: 0,16 + Actor2134: t01 + Owner: Neutral + Location: 44,25 + Actor2135: t13 + Owner: Neutral + Location: 82,54 + Actor2136: t03 + Owner: Neutral + Location: 57,54 + Actor2137: t08 + Owner: Neutral + Location: 78,23 + Actor2140: t05 + Owner: Neutral + Location: 14,1 + Actor2141: t02.husk + Owner: Neutral + Location: 65,64 + Actor2142: t06.husk + Owner: Neutral + Location: 31,76 + Actor2143: t08 + Owner: Neutral + Location: 9,9 + Actor2144: t16 + Owner: Neutral + Location: 42,47 + Actor2145: t17 + Owner: Neutral + Location: 85,70 + Actor2146: t16 + Owner: Neutral + Location: 43,64 + Actor2147: t12 + Owner: Neutral + Location: 44,45 + Actor2148: t01 + Owner: Neutral + Location: 78,18 + Actor2149: t08 + Owner: Neutral + Location: 5,46 + Actor2150: t06 + Owner: Neutral + Location: 83,34 + Actor2152: t08 + Owner: Neutral + Location: 16,10 + Actor2155: t05 + Owner: Neutral + Location: 61,6 + Actor2156: t02 + Owner: Neutral + Location: 1,14 + Actor2157: t13 + Owner: Neutral + Location: 3,39 + Actor2158: t01 + Owner: Neutral + Location: 77,19 + Actor2159: t12 + Owner: Neutral + Location: 37,40 + Actor2160: t07 + Owner: Neutral + Location: 50,47 + Actor2161: t13 + Owner: Neutral + Location: 32,75 + Actor2163: t16 + Owner: Neutral + Location: 29,9 + Actor2164: t12 + Owner: Neutral + Location: 57,31 + Actor2165: t08 + Owner: Neutral + Location: 46,80 + Actor2166: t17.husk + Owner: Neutral + Location: 88,62 + Actor2168: t16 + Owner: Neutral + Location: 2,18 + Actor2169: t03 + Owner: Neutral + Location: 12,36 + Actor2170: t12 + Owner: Neutral + Location: 53,57 + Actor2171: t07 + Owner: Neutral + Location: 72,52 + Actor2172: t13 + Owner: Neutral + Location: 79,41 + Actor2173: t07 + Owner: Neutral + Location: 75,53 + Actor2174: t12 + Owner: Neutral + Location: 26,4 + Actor2176: t16 + Owner: Neutral + Location: 89,64 + Actor2177: t08.husk + Owner: Neutral + Location: 83,55 + Actor2178: t06 + Owner: Neutral + Location: 11,53 + Actor2179: t05 + Owner: Neutral + Location: 57,38 + Actor2180: t05 + Owner: Neutral + Location: 84,2 + Actor2182: t12 + Owner: Neutral + Location: 11,59 + Actor2184: t07 + Owner: Neutral + Location: 37,71 + Actor2185: t08 + Owner: Neutral + Location: 22,84 + Actor2186: t16 + Owner: Neutral + Location: 50,33 + Actor2188: t01 + Owner: Neutral + Location: 1,77 + Actor2189: t08 + Owner: Neutral + Location: 13,38 + Actor2190: t01 + Owner: Neutral + Location: 24,60 + Actor2191: t08.husk + Owner: Neutral + Location: 2,11 + Actor2192: t07 + Owner: Neutral + Location: 21,86 + Actor2193: t17.husk + Owner: Neutral + Location: 7,41 + Actor2194: t17 + Owner: Neutral + Location: 15,77 + Actor2195: t12 + Owner: Neutral + Location: 59,45 + Actor2196: t01 + Owner: Neutral + Location: 8,57 + Actor2198: t08 + Owner: Neutral + Location: 68,6 + Actor2199: t16 + Owner: Neutral + Location: 37,65 + Actor2200: t07 + Owner: Neutral + Location: 41,61 + Actor2201: t07 + Owner: Neutral + Location: 6,44 + Actor2202: t02 + Owner: Neutral + Location: 2,15 + Actor2203: t05 + Owner: Neutral + Location: 8,15 + Actor2204: t03 + Owner: Neutral + Location: 48,24 + Actor2205: t16 + Owner: Neutral + Location: 44,73 + Actor2206: t02 + Owner: Neutral + Location: 40,51 + Actor2207: t08 + Owner: Neutral + Location: 11,2 + Actor2208: t12.husk + Owner: Neutral + Location: 57,9 + Actor2209: t16 + Owner: Neutral + Location: 83,57 + Actor2210: t07 + Owner: Neutral + Location: 13,53 + Actor2211: t02 + Owner: Neutral + Location: 18,77 + Actor2212: t13 + Owner: Neutral + Location: 46,63 + Actor2214: t03 + Owner: Neutral + Location: 20,66 + Actor2216: t08 + Owner: Neutral + Location: 87,37 + Actor2217: t01 + Owner: Neutral + Location: 49,33 + Actor2219: t03 + Owner: Neutral + Location: 29,80 + Actor2220: t17 + Owner: Neutral + Location: 10,88 + Actor2221: t03 + Owner: Neutral + Location: 13,39 + Actor2222: t03 + Owner: Neutral + Location: 51,46 + Actor2224: t06 + Owner: Neutral + Location: 48,67 + Actor2225: t12 + Owner: Neutral + Location: 86,36 + Actor2227: t06 + Owner: Neutral + Location: 52,31 + Actor2228: t08 + Owner: Neutral + Location: 31,79 + Actor2229: t01 + Owner: Neutral + Location: 0,5 + Actor2230: t13 + Owner: Neutral + Location: 58,13 + Actor2231: t05 + Owner: Neutral + Location: 89,68 + Actor2232: t17 + Owner: Neutral + Location: 95,70 + Actor2233: t05 + Owner: Neutral + Location: 14,28 + Actor2234: t16 + Owner: Neutral + Location: 81,58 + Actor2235: t12 + Owner: Neutral + Location: 58,55 + Actor2236: t03 + Owner: Neutral + Location: 73,41 + Actor2237: t02 + Owner: Neutral + Location: 20,60 + Actor2238: t08 + Owner: Neutral + Location: 15,10 + Actor2240: t08.husk + Owner: Neutral + Location: 52,33 + Actor2241: t02 + Owner: Neutral + Location: 47,62 + Actor2242: t05.husk + Owner: Neutral + Location: 41,60 + Actor2243: t05 + Owner: Neutral + Location: 29,75 + Actor2244: t02 + Owner: Neutral + Location: 74,27 + Actor2247: t01 + Owner: Neutral + Location: 32,78 + Actor2248: t16 + Owner: Neutral + Location: 54,53 + Actor2249: t17 + Owner: Neutral + Location: 14,37 + Actor2250: t17 + Owner: Neutral + Location: 0,11 + Actor2251: t17 + Owner: Neutral + Location: 43,48 + Actor2252: t03 + Owner: Neutral + Location: 30,78 + Actor2253: t02 + Owner: Neutral + Location: 12,81 + Actor2254: t13 + Owner: Neutral + Location: 3,41 + Actor2255: t06 + Owner: Neutral + Location: 15,83 + Actor2256: t06 + Owner: Neutral + Location: 21,27 + Actor2257: t17.husk + Owner: Neutral + Location: 38,79 + Actor2259: t05 + Owner: Neutral + Location: 3,2 + Actor2260: t06 + Owner: Neutral + Location: 80,38 + Actor2261: t02 + Owner: Neutral + Location: 17,78 + Actor2262: t13 + Owner: Neutral + Location: 81,22 + Actor2263: t08 + Owner: Neutral + Location: 29,6 + Actor2267: t13 + Owner: Neutral + Location: 37,52 + Actor2268: t06.husk + Owner: Neutral + Location: 13,2 + Actor2269: t05 + Owner: Neutral + Location: 22,22 + Actor2271: t16 + Owner: Neutral + Location: 91,65 + Actor2272: t02 + Owner: Neutral + Location: 15,2 + Actor2273: t05 + Owner: Neutral + Location: 28,2 + Actor2274: t12 + Owner: Neutral + Location: 57,55 + Actor2275: t08 + Owner: Neutral + Location: 48,33 + Actor2278: t13 + Owner: Neutral + Location: 78,53 + Actor2279: t12 + Owner: Neutral + Location: 10,69 + Actor2281: t03 + Owner: Neutral + Location: 85,53 + Actor2283: t08 + Owner: Neutral + Location: 11,89 + Actor2284: t05 + Owner: Neutral + Location: 0,53 + Actor2285: t08 + Owner: Neutral + Location: 23,64 + Actor2286: t06 + Owner: Neutral + Location: 15,58 + Actor2288: t16 + Owner: Neutral + Location: 12,7 + Actor2289: t01 + Owner: Neutral + Location: 14,56 + Actor2291: t03 + Owner: Neutral + Location: 25,37 + Actor2293: t06 + Owner: Neutral + Location: 44,67 + Actor2294: t16 + Owner: Neutral + Location: 31,75 + Actor2295: t06 + Owner: Neutral + Location: 45,79 + Actor2300: t01 + Owner: Neutral + Location: 6,42 + Actor2302: t05 + Owner: Neutral + Location: 40,69 + Actor2304: t13 + Owner: Neutral + Location: 76,57 + Actor2305: t03 + Owner: Neutral + Location: 47,19 + Actor2306: t12 + Owner: Neutral + Location: 18,29 + Actor2307: t17 + Owner: Neutral + Location: 46,4 + Actor2308: t05 + Owner: Neutral + Location: 26,78 + Actor2310: t02 + Owner: Neutral + Location: 82,26 + Actor2311: t13 + Owner: Neutral + Location: 52,46 + Actor2312: t02 + Owner: Neutral + Location: 44,16 + Actor2313: t12.husk + Owner: Neutral + Location: 16,80 + Actor2314: t08 + Owner: Neutral + Location: 0,15 + Actor2315: t01 + Owner: Neutral + Location: 93,51 + Actor2316: t17 + Owner: Neutral + Location: 80,41 + Actor2317: t12 + Owner: Neutral + Location: 61,65 + Actor2318: t01 + Owner: Neutral + Location: 42,50 + Actor2320: t12 + Owner: Neutral + Location: 8,43 + Actor2322: t08 + Owner: Neutral + Location: 29,83 + Actor2323: t08.husk + Owner: Neutral + Location: 12,54 + Actor2324: t02 + Owner: Neutral + Location: 57,37 + Actor2325: t08 + Owner: Neutral + Location: 0,80 + Actor2326: t03 + Owner: Neutral + Location: 78,41 + Actor2327: t08 + Owner: Neutral + Location: 47,25 + Actor2329: t06 + Owner: Neutral + Location: 76,22 + Actor2330: t16 + Owner: Neutral + Location: 70,12 + Actor2331: t08 + Owner: Neutral + Location: 1,0 + Actor2332: t02 + Owner: Neutral + Location: 0,82 + Actor2333: t05 + Owner: Neutral + Location: 82,0 + Actor2334: t08 + Owner: Neutral + Location: 94,59 + Actor2335: t08 + Owner: Neutral + Location: 11,34 + Actor2336: t02 + Owner: Neutral + Location: 60,10 + Actor2337: t06 + Owner: Neutral + Location: 12,96 + Actor2338: t16.husk + Owner: Neutral + Location: 73,52 + Actor2339: t05 + Owner: Neutral + Location: 14,76 + Actor2341: t13 + Owner: Neutral + Location: 44,68 + Actor2342: t13 + Owner: Neutral + Location: 11,28 + Actor2343: t08 + Owner: Neutral + Location: 25,5 + Actor2345: t12 + Owner: Neutral + Location: 14,13 + Actor2346: t08 + Owner: Neutral + Location: 83,48 + Actor2347: t17 + Owner: Neutral + Location: 46,68 + Actor2348: t08 + Owner: Neutral + Location: 61,8 + Actor2349: t16 + Owner: Neutral + Location: 82,20 + Actor2350: t16 + Owner: Neutral + Location: 28,77 + Actor2351: t06 + Owner: Neutral + Location: 46,70 + Actor2352: t12 + Owner: Neutral + Location: 13,28 + Actor2353: t13 + Owner: Neutral + Location: 27,76 + Actor2354: t03 + Owner: Neutral + Location: 78,47 + Actor2355: t07 + Owner: Neutral + Location: 80,46 + Actor2356: t13 + Owner: Neutral + Location: 82,47 + Actor2357: t02 + Owner: Neutral + Location: 12,11 + Actor2358: t16 + Owner: Neutral + Location: 10,60 + Actor2359: t13 + Owner: Neutral + Location: 56,40 + Actor2360: t01 + Owner: Neutral + Location: 56,39 + Actor2045: brik + Owner: Nod + Location: 66,65 + Actor2052: brik + Owner: Nod + Location: 66,64 + Actor2066: brik + Owner: Nod + Location: 67,64 + Actor2067: brik + Owner: Nod + Location: 67,65 + Actor2083: brik + Owner: Nod + Location: 66,66 + Actor2088: brik + Owner: Nod + Location: 66,67 + Actor2116: brik + Owner: Nod + Location: 65,67 + Actor2124: brik + Owner: Nod + Location: 65,68 + Actor2138: brik + Owner: Nod + Location: 64,68 + Actor2139: brik + Owner: Nod + Location: 63,68 + Actor2151: brik + Owner: Nod + Location: 63,69 + Actor2153: brik + Owner: Nod + Location: 63,70 + Actor2154: brik + Owner: Nod + Location: 63,71 + Actor2162: brik + Owner: Nod + Location: 63,72 + Actor2175: brik + Owner: Nod + Location: 63,73 + Actor2181: brik + Owner: Nod + Location: 63,74 + Actor2187: brik + Owner: Nod + Location: 64,74 + Actor2197: brik + Owner: Nod + Location: 64,75 + Actor2223: brik + Owner: Nod + Location: 64,76 + Actor2226: brik + Owner: Nod + Location: 64,77 + Actor2239: brik + Owner: Nod + Location: 65,77 + Actor2264: brik + Owner: Nod + Location: 65,76 + Actor2265: brik + Owner: Nod + Location: 68,64 + Actor2266: brik + Owner: Nod + Location: 69,64 + Actor2277: brik + Owner: Nod + Location: 70,64 + Actor2280: brik + Owner: Nod + Location: 70,65 + Actor2287: brik + Owner: Nod + Location: 69,65 + Actor2290: brik + Owner: Nod + Location: 76,64 + Actor2292: brik + Owner: Nod + Location: 76,65 + Actor2296: brik + Owner: Nod + Location: 77,65 + Actor2298: brik + Owner: Nod + Location: 77,64 + Actor2299: brik + Owner: Nod + Location: 78,64 + Actor2303: brik + Owner: Nod + Location: 80,64 + Actor2319: brik + Owner: Nod + Location: 79,64 + Actor2321: brik + Owner: Nod + Location: 81,64 + Actor2328: brik + Owner: Nod + Location: 82,64 + Actor2340: brik + Owner: Nod + Location: 83,64 + Actor2361: brik + Owner: Nod + Location: 84,64 + Actor2362: brik + Owner: Nod + Location: 84,65 + Actor2363: brik + Owner: Nod + Location: 84,66 + Actor2364: brik + Owner: Nod + Location: 84,67 + Actor2365: brik + Owner: Nod + Location: 84,68 + Actor2366: brik + Owner: Nod + Location: 84,69 + Actor2367: brik + Owner: Nod + Location: 84,70 + Actor2368: brik + Owner: Nod + Location: 84,71 + Actor2369: brik + Owner: Nod + Location: 84,72 + Actor2370: brik + Owner: Nod + Location: 85,72 + Actor2371: brik + Owner: Nod + Location: 86,72 + Actor2372: brik + Owner: Nod + Location: 86,73 + Actor2373: brik + Owner: Nod + Location: 85,73 + Actor2374: brik + Owner: Nod + Location: 75,81 + Actor2375: brik + Owner: Nod + Location: 74,81 + Actor2376: brik + Owner: Nod + Location: 74,80 + Actor2377: brik + Owner: Nod + Location: 75,80 + Actor2378: brik + Owner: Nod + Location: 76,81 + Actor2379: brik + Owner: Nod + Location: 77,81 + Actor2380: brik + Owner: Nod + Location: 78,81 + Actor2381: brik + Owner: Nod + Location: 80,81 + Actor2382: brik + Owner: Nod + Location: 79,81 + Actor2383: brik + Owner: Nod + Location: 81,81 + Actor2384: brik + Owner: Nod + Location: 81,80 + Actor2385: brik + Owner: Nod + Location: 80,80 + SubPen: spen.nod + Owner: Nod + Location: 77,84 + Obelisk2: obli + Owner: Nod + Location: 78,65 + Obelisk1: obli + Owner: Nod + Location: 68,65 + Turret2: gun.nod + Owner: Nod + Location: 76,63 + TurretFacing: 192 + Turret1: gun.nod + Owner: Nod + Location: 70,63 + TurretFacing: 192 + Actor2395: silo.td + Owner: Nod + Location: 64,69 + Actor2396: silo.td + Owner: Nod + Location: 64,71 + Actor2397: silo.td + Owner: Nod + Location: 64,73 + Actor2401: nuk2 + Owner: Nod + Location: 81,74 + Actor2403: afac + Owner: Nod + Location: 77,78 + SAM6: nsam + Owner: Nod + Location: 85,23 + SAM1: nsam + Owner: Nod + Location: 11,16 + SAM3: nsam + Owner: Nod + Location: 36,44 + SAM2: nsam + Owner: Nod + Location: 16,60 + SAM7: nsam + Owner: Nod + Location: 75,46 + SAM4: nsam + Owner: Nod + Location: 29,89 + Actor2410: tc05 + Owner: Neutral + Location: 60,20 + Actor2411: t16 + Owner: Neutral + Location: 63,21 + Actor2412: t10 + Owner: Neutral + Location: 61,23 + Actor2413: t15 + Owner: Neutral + Location: 63,22 + Actor2414: t07 + Owner: Neutral + Location: 65,25 + Actor2415: gun + Owner: Nod + Location: 86,83 + TurretFacing: 380 + Actor2416: gun + Owner: Nod + Location: 93,86 + TurretFacing: 444 + Actor2344: t13 + Owner: Neutral + Location: 0,20 + Actor2417: t05 + Owner: Neutral + Location: 1,20 + Actor2423: t08.husk + Owner: Neutral + Location: 2,21 + Actor2426: t08 + Owner: Neutral + Location: 0,22 + Actor2427: t08.husk + Owner: Neutral + Location: 1,22 + Actor2434: t08.husk + Owner: Neutral + Location: 2,22 + Actor2435: t06 + Owner: Neutral + Location: 3,21 + Actor2436: t12 + Owner: Neutral + Location: 0,22 + Actor2437: t13 + Owner: Neutral + Location: 1,22 + Actor2438: t02.husk + Owner: Neutral + Location: 2,22 + Actor2440: t03 + Owner: Neutral + Location: 0,23 + Actor2441: t02 + Owner: Neutral + Location: 1,23 + Actor2443: t17 + Owner: Neutral + Location: 0,24 + Actor2446: t13 + Owner: Neutral + Location: 0,25 + Actor2450: t02 + Owner: Neutral + Location: 0,26 + Actor2442: snip + Owner: Greece + Location: 3,26 + SubCell: 4 + Facing: 896 + Actor2458: rtnk + Owner: Greece + Location: 5,30 + Facing: 768 + Actor2459: rtnk + Owner: Greece + Location: 7,33 + Facing: 768 + NonHardMirage1: rtnk + Owner: Greece + Location: 7,37 + Facing: 642 + Actor2463: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 66,78 + Actor2464: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 73,81 + Actor2465: n1 + Owner: Nod + Facing: 384 + Location: 73,81 + SubCell: 1 + Actor2466: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 74,82 + Actor2467: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 71,83 + Actor2468: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 65,75 + Actor2469: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 57,82 + Actor2471: n1 + Owner: Nod + SubCell: 3 + Location: 75,62 + Facing: 158 + Actor2472: n1 + Owner: Nod + SubCell: 3 + Location: 74,64 + Facing: 174 + Actor2473: n1 + Owner: Nod + Location: 74,64 + SubCell: 1 + Facing: 190 + Actor2474: n1 + Owner: Nod + SubCell: 3 + Location: 72,63 + Facing: 158 + Actor2475: n1 + Owner: Nod + SubCell: 3 + Location: 68,63 + Facing: 158 + Actor2476: n1 + Owner: Nod + SubCell: 3 + Location: 79,63 + Facing: 158 + Actor2455: snip + Owner: Greece + SubCell: 4 + Location: 7,35 + Facing: 768 + Actor2461: rtnk + Owner: Greece + Location: 5,26 + Facing: 896 + Actor2477: t03 + Owner: Neutral + Location: 28,30 + Actor2478: t12 + Owner: Neutral + Location: 30,30 + PlayerStart: waypoint + Owner: Neutral + Location: 7,31 + SAM5: nsam + Owner: Nod + Location: 43,20 + Ranger1: jeep + Owner: Greece + Location: 9,29 + Facing: 896 + Ranger2: jeep + Owner: Greece + Location: 9,34 + Facing: 769 + Actor2481: ltnk + Owner: Nod + Location: 72,64 + Facing: 142 + Actor2482: ltnk + Owner: Nod + Location: 74,61 + Facing: 150 + Obelisk3: obli + Owner: Nod + Location: 69,81 + Actor2215: t07 + Owner: Neutral + Location: 75,70 + Actor2282: t02 + Owner: Neutral + Location: 74,71 + Actor2392: t08 + Owner: Neutral + Location: 75,72 + Actor2398: t06 + Owner: Neutral + Location: 75,72 + Actor2485: rep + Owner: Nod + Location: 72,69 + Actor2486: nuk2 + Owner: Nod + Location: 76,75 + Actor2488: nuk2 + Owner: Nod + Location: 80,77 + Actor2399: nuk2 + Owner: Nod + Location: 78,74 + Actor2394: nuk2 + Owner: Nod + Location: 82,70 + Actor2487: airs + Owner: Nod + Location: 77,68 + Actor2400: t13 + Owner: Neutral + Location: 94,60 + Actor2489: t03 + Owner: Neutral + Location: 94,61 + Actor2490: t11 + Owner: Neutral + Location: 93,62 + Actor2491: t10 + Owner: Neutral + Location: 93,58 + Actor2492: t15 + Owner: Neutral + Location: 95,67 + Actor2131: t07 + Owner: Neutral + Location: 96,63 + Actor2493: n1 + Owner: Nod + SubCell: 3 + Location: 18,60 + Facing: 737 + Actor2494: n1 + Owner: Nod + SubCell: 3 + Location: 22,59 + Facing: 111 + Actor2495: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 14,68 + Actor2496: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 12,66 + Actor2497: n1 + Owner: Nod + Location: 25,62 + SubCell: 3 + Facing: 666 + Actor2498: n3 + Owner: Nod + SubCell: 3 + Location: 19,61 + Facing: 713 + Actor2500: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 57,60 + Actor2501: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 48,63 + Actor2502: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 72,54 + Actor2503: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 72,49 + Actor2504: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 74,44 + Actor2505: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 87,24 + Actor2506: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 86,21 + Actor2507: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 45,20 + Actor2509: n3 + Owner: Nod + SubCell: 3 + Location: 31,90 + Facing: 384 + Actor2510: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 38,86 + Actor2511: n3 + Owner: Nod + SubCell: 3 + Location: 18,88 + Facing: 222 + Actor2513: t05 + Owner: Neutral + Location: 1,85 + Actor2514: t02 + Owner: Neutral + Location: 2,85 + Actor2515: t14 + Owner: Neutral + Location: 1,86 + Actor2516: t07 + Owner: Neutral + Location: 1,87 + Actor2517: t12 + Owner: Neutral + Location: 2,87 + Actor2518: t07 + Owner: Neutral + Location: 1,88 + Actor2519: t02 + Owner: Neutral + Location: 2,88 + Actor2520: t01 + Owner: Neutral + Location: 1,89 + Actor2521: t16 + Owner: Neutral + Location: 2,89 + Actor2522: t02.husk + Owner: Neutral + Location: 1,90 + Actor2523: t17 + Owner: Neutral + Location: 2,90 + Actor2524: t12 + Owner: Neutral + Location: 1,91 + Actor2525: t02 + Owner: Neutral + Location: 2,91 + Actor2526: t02 + Owner: Neutral + Location: 3,90 + Actor2527: tc05 + Owner: Neutral + Location: 1,94 + Actor2528: t07 + Owner: Neutral + Location: 4,94 + Actor2529: t07 + Owner: Neutral + Location: 5,94 + Actor2530: t05 + Owner: Neutral + Location: 6,94 + Actor2531: t16 + Owner: Neutral + Location: 1,95 + Actor2532: t05 + Owner: Neutral + Location: 4,95 + Actor2533: t12.husk + Owner: Neutral + Location: 5,95 + Actor2534: t08 + Owner: Neutral + Location: 6,96 + Actor2535: t06 + Owner: Neutral + Location: 9,95 + Actor2536: t03 + Owner: Neutral + Location: 10,94 + Actor2537: t17 + Owner: Neutral + Location: 11,94 + Actor2538: t08 + Owner: Neutral + Location: 12,95 + Actor2539: t17 + Owner: Neutral + Location: 10,95 + Actor2540: t16.husk + Owner: Neutral + Location: 11,95 + Actor2541: t08 + Owner: Neutral + Location: 12,96 + Actor2542: t05 + Owner: Neutral + Location: 4,93 + Actor2543: t03 + Owner: Neutral + Location: 7,93 + Actor2544: t13 + Owner: Neutral + Location: 1,56 + Actor2545: t06 + Owner: Neutral + Location: 0,57 + Actor2546: t16 + Owner: Neutral + Location: 1,57 + Actor2547: t03 + Owner: Neutral + Location: 0,58 + Actor2548: t05 + Owner: Neutral + Location: 1,58 + Actor2549: t02 + Owner: Neutral + Location: 2,58 + Actor2550: t13 + Owner: Neutral + Location: 0,59 + Actor2551: t14 + Owner: Neutral + Location: 1,59 + Actor2552: t06 + Owner: Neutral + Location: 3,59 + Actor2553: t16 + Owner: Neutral + Location: 0,60 + Actor2554: t07 + Owner: Neutral + Location: 1,60 + Actor2555: t12 + Owner: Neutral + Location: 2,60 + Actor2556: t02 + Owner: Neutral + Location: 3,60 + Actor2557: t02 + Owner: Neutral + Location: 0,61 + Actor2558: t07 + Owner: Neutral + Location: 1,61 + Actor2559: t02 + Owner: Neutral + Location: 2,61 + Actor2560: t05 + Owner: Neutral + Location: 0,62 + Actor2561: t01 + Owner: Neutral + Location: 1,62 + Actor2562: t16 + Owner: Neutral + Location: 2,62 + Actor2563: t02 + Owner: Neutral + Location: 0,63 + Actor2564: t12 + Owner: Neutral + Location: 1,63 + Actor2565: t07 + Owner: Neutral + Location: 2,63 + Actor2566: t08 + Owner: Neutral + Location: 0,65 + Actor2567: t07 + Owner: Neutral + Location: 1,64 + Actor2568: t01.husk + Owner: Neutral + Location: 2,64 + Actor2569: t17 + Owner: Neutral + Location: 0,65 + Actor2570: t12 + Owner: Neutral + Location: 1,65 + Actor2571: t17 + Owner: Neutral + Location: 2,65 + Actor2572: t01 + Owner: Neutral + Location: 0,66 + Actor2573: t03 + Owner: Neutral + Location: 1,66 + Actor2574: t16 + Owner: Neutral + Location: 2,66 + Actor2575: t07.husk + Owner: Neutral + Location: 3,66 + Actor2576: t02 + Owner: Neutral + Location: 0,67 + Actor2577: t02 + Owner: Neutral + Location: 1,67 + Actor2578: t16 + Owner: Neutral + Location: 2,67 + Actor2579: t12 + Owner: Neutral + Location: 3,67 + Actor2297: t01 + Owner: Neutral + Location: 4,62 + Actor2580: t12 + Owner: Neutral + Location: 3,63 + Actor2581: t07 + Owner: Neutral + Location: 4,63 + Actor2582: t05 + Owner: Neutral + Location: 3,64 + Actor2583: t06 + Owner: Neutral + Location: 4,64 + Actor2584: t01 + Owner: Neutral + Location: 5,65 + Actor2585: t12 + Owner: Neutral + Location: 4,66 + Actor2586: t07 + Owner: Neutral + Location: 5,66 + Actor2587: t05 + Owner: Neutral + Location: 4,67 + Actor2588: t06 + Owner: Neutral + Location: 5,67 + Actor2589: t13 + Owner: Neutral + Location: 6,64 + Actor2590: t07 + Owner: Neutral + Location: 5,68 + Actor2591: t07 + Owner: Neutral + Location: 16,0 + Actor2592: t07 + Owner: Neutral + Location: 17,0 + Actor2593: t08 + Owner: Neutral + Location: 18,1 + Actor2594: t17 + Owner: Neutral + Location: 19,0 + Actor2595: t01 + Owner: Neutral + Location: 20,0 + Actor2596: tc02 + Owner: Neutral + Location: 21,0 + Actor2597: t07 + Owner: Neutral + Location: 23,0 + Actor2598: t17 + Owner: Neutral + Location: 24,0 + Actor2599: t12 + Owner: Neutral + Location: 25,0 + Actor2600: t17 + Owner: Neutral + Location: 26,0 + Actor2601: t08 + Owner: Neutral + Location: 16,2 + Actor2602: t05 + Owner: Neutral + Location: 17,1 + Actor2603: t15 + Owner: Neutral + Location: 18,1 + Actor2604: t03 + Owner: Neutral + Location: 20,1 + Actor2605: t08 + Owner: Neutral + Location: 21,2 + Actor2606: t17 + Owner: Neutral + Location: 22,1 + Actor2607: t16 + Owner: Neutral + Location: 23,1 + Actor2608: t05 + Owner: Neutral + Location: 24,1 + Actor2609: t01 + Owner: Neutral + Location: 25,1 + Actor2610: t13.husk + Owner: Neutral + Location: 26,1 + Actor2611: t08 + Owner: Neutral + Location: 16,3 + Actor2615: t06.husk + Owner: Neutral + Location: 23,2 + Actor2616: t03 + Owner: Neutral + Location: 24,2 + Actor2617: t02 + Owner: Neutral + Location: 25,2 + Actor2612: t15 + Owner: Neutral + Location: 17,2 + Actor2613: t07 + Owner: Neutral + Location: 21,2 + Actor2614: t02 + Owner: Neutral + Location: 33,12 + Actor2618: t07 + Owner: Neutral + Location: 33,6 + Actor2619: t08 + Owner: Neutral + Location: 34,7 + Actor2620: tc03 + Owner: Neutral + Location: 39,10 + Actor2622: t08 + Owner: Neutral + Location: 38,11 + Actor2623: t10 + Owner: Neutral + Location: 37,11 + Actor2624: t16 + Owner: Neutral + Location: 39,11 + Actor2625: t12 + Owner: Neutral + Location: 37,12 + Actor2626: t02 + Owner: Neutral + Location: 38,12 + Actor2213: t14.husk + Owner: Neutral + Location: 46,0 + Actor2218: t13 + Owner: Neutral + Location: 48,0 + Actor2245: t13 + Owner: Neutral + Location: 49,0 + Actor2276: tc01 + Owner: Neutral + Location: 50,0 + Actor2309: t16 + Owner: Neutral + Location: 52,0 + Actor2621: t08 + Owner: Neutral + Location: 53,1 + Actor2627: t16 + Owner: Neutral + Location: 54,0 + Actor2628: tc01 + Owner: Neutral + Location: 55,0 + Actor2629: t12 + Owner: Neutral + Location: 57,0 + Actor2630: t06 + Owner: Neutral + Location: 58,0 + Actor2631: t03 + Owner: Neutral + Location: 59,0 + Actor2632: t06.husk + Owner: Neutral + Location: 60,0 + Actor2633: t11 + Owner: Neutral + Location: 61,0 + Actor2634: t10 + Owner: Neutral + Location: 46,1 + Actor2635: t02 + Owner: Neutral + Location: 48,1 + Actor2636: t02 + Owner: Neutral + Location: 49,1 + Actor2637: t16.husk + Owner: Neutral + Location: 50,1 + Actor2638: t14.husk + Owner: Neutral + Location: 51,1 + Actor2639: t10 + Owner: Neutral + Location: 53,1 + Actor2640: t10 + Owner: Neutral + Location: 55,1 + Actor2641: t16 + Owner: Neutral + Location: 48,2 + Actor2642: t12 + Owner: Neutral + Location: 49,2 + Actor2643: t01.husk + Owner: Neutral + Location: 50,2 + Actor2644: t01 + Owner: Neutral + Location: 51,2 + Actor2645: t17.husk + Owner: Neutral + Location: 52,2 + Actor2646: t07 + Owner: Neutral + Location: 53,2 + Actor2647: t05 + Owner: Neutral + Location: 48,3 + Actor2648: t06 + Owner: Neutral + Location: 49,3 + Actor2649: t05.husk + Owner: Neutral + Location: 50,3 + Actor2650: t11.husk + Owner: Neutral + Location: 51,3 + Actor2651: t16 + Owner: Neutral + Location: 63,0 + Actor2652: t17 + Owner: Neutral + Location: 64,0 + Actor2653: t06 + Owner: Neutral + Location: 65,0 + Actor2654: t14 + Owner: Neutral + Location: 62,1 + Actor2655: t08 + Owner: Neutral + Location: 64,2 + Actor2656: t12 + Owner: Neutral + Location: 65,1 + Actor2657: t06 + Owner: Neutral + Location: 64,2 + Actor2658: t05 + Owner: Neutral + Location: 62,3 + Actor2659: t12.husk + Owner: Neutral + Location: 63,3 + Actor2660: t02 + Owner: Neutral + Location: 62,4 + Actor2661: t16 + Owner: Neutral + Location: 63,4 + Actor2662: t12 + Owner: Neutral + Location: 66,3 + Actor2663: t06 + Owner: Neutral + Location: 59,1 + Actor2664: t10 + Owner: Neutral + Location: 61,2 + Actor2665: t01 + Owner: Neutral + Location: 31,9 + Actor2666: t08 + Owner: Neutral + Location: 32,10 + Actor2667: t01 + Owner: Neutral + Location: 32,10 + Actor2668: t07 + Owner: Neutral + Location: 32,11 + Actor2669: t02 + Owner: Neutral + Location: 33,11 + Actor2670: tc03 + Owner: Neutral + Location: 30,12 + Actor2671: t16 + Owner: Neutral + Location: 34,12 + Actor2672: t14 + Owner: Neutral + Location: 30,5 + Actor2673: t07 + Owner: Neutral + Location: 33,10 + Actor2674: t15 + Owner: Neutral + Location: 30,2 + Actor2675: t17 + Owner: Neutral + Location: 27,7 + Actor2676: t13 + Owner: Neutral + Location: 96,11 + Actor2677: t05 + Owner: Neutral + Location: 95,12 + Actor2678: t17 + Owner: Neutral + Location: 96,12 + Actor2679: t01 + Owner: Neutral + Location: 95,13 + Actor2680: t16 + Owner: Neutral + Location: 96,13 + Actor2681: t15 + Owner: Neutral + Location: 95,15 + Actor2682: tc01 + Owner: Neutral + Location: 95,16 + Actor2683: t07 + Owner: Neutral + Location: 95,17 + Actor2684: t02 + Owner: Neutral + Location: 95,18 + Actor2685: t07 + Owner: Neutral + Location: 96,18 + Actor2686: t14.husk + Owner: Neutral + Location: 94,20 + Actor2687: t16 + Owner: Neutral + Location: 96,20 + Actor2688: t07 + Owner: Neutral + Location: 95,21 + Actor2689: t15 + Owner: Neutral + Location: 95,22 + Actor2690: t14.husk + Owner: Neutral + Location: 94,3 + Actor2691: t16 + Owner: Neutral + Location: 96,3 + Actor2692: t07 + Owner: Neutral + Location: 95,4 + Actor2693: t15 + Owner: Neutral + Location: 95,5 + Actor2694: t02 + Owner: Neutral + Location: 96,1 + Actor2695: t13 + Owner: Neutral + Location: 93,4 + Actor2391: bggy + Owner: Nod + Facing: 384 + Location: 75,83 + Actor2697: bggy + Owner: Nod + Location: 71,68 + Facing: 0 + Actor2701: bggy + Owner: Nod + Location: 89,22 + Facing: 634 + Actor2706: arty.nod + Owner: Nod + Location: 66,68 + Facing: 253 + Actor2707: arty.nod + Owner: Nod + Location: 65,74 + Facing: 253 + Actor2708: ltnk + Owner: Nod + Location: 52,66 + Facing: 150 + Actor2709: ltnk + Owner: Nod + Location: 54,64 + Facing: 134 + Actor2712: bggy + Owner: Nod + Location: 18,51 + Facing: 0 + Actor2713: bggy + Owner: Nod + Location: 5,79 + Facing: 0 + Actor2715: n1 + Owner: Nod + SubCell: 3 + Location: 53,68 + Facing: 0 + Actor2716: n1 + Owner: Nod + SubCell: 3 + Location: 54,65 + Facing: 166 + Actor2717: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 56,65 + Actor2718: n1 + Owner: Nod + Location: 56,64 + SubCell: 3 + Facing: 237 + Actor2719: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 48,65 + Actor2720: n1 + Owner: Nod + SubCell: 3 + Location: 74,46 + Facing: 384 + Actor2721: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 87,22 + Actor2722: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 90,21 + Actor2723: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 43,18 + Actor2724: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 36,46 + Actor2725: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 35,44 + Actor2726: n1 + Owner: Nod + SubCell: 3 + Location: 19,51 + Facing: 0 + Actor2727: n1 + Owner: Nod + SubCell: 3 + Location: 17,52 + Facing: 0 + Actor2732: n1 + Owner: Nod + SubCell: 3 + Location: 18,89 + Facing: 713 + Actor2734: n1 + Owner: Nod + SubCell: 3 + Location: 7,82 + Facing: 0 + Actor2735: n1 + Owner: Nod + SubCell: 3 + Location: 32,89 + Facing: 674 + Actor2741: n1 + Owner: Nod + SubCell: 3 + Location: 23,70 + Facing: 848 + Actor2743: n1 + Owner: Nod + SubCell: 3 + Location: 49,43 + TurretFacing: 0 + Facing: 0 + Actor2748: n1 + Owner: Nod + SubCell: 3 + Location: 89,39 + Facing: 0 + Actor2749: n1 + Owner: Nod + SubCell: 3 + Location: 91,40 + Facing: 0 + Actor2750: n1 + Owner: Nod + SubCell: 3 + Location: 89,41 + Facing: 0 + Actor2751: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 4,52 + Actor2752: n1 + Owner: Nod + SubCell: 3 + Facing: 848 + Location: 6,78 + Actor2760: n4 + Owner: Nod + SubCell: 3 + Location: 20,79 + Facing: 0 + Actor2761: n4 + Owner: Nod + SubCell: 3 + Location: 72,30 + Facing: 55 + Actor2762: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 92,32 + Actor2766: n1 + Owner: Nod + SubCell: 3 + Location: 12,17 + Facing: 384 + Actor2767: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 10,15 + Actor2768: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 41,16 + Actor2771: n4 + Owner: Nod + SubCell: 3 + Facing: 269 + Location: 78,6 + Actor2773: n4 + Owner: Nod + SubCell: 3 + Facing: 222 + Location: 78,8 + Actor2774: ftnk + Owner: Nod + Facing: 253 + Location: 79,7 + Actor2795: t17 + Owner: Neutral + Location: 27,92 + Actor2775: t17 + Owner: Neutral + Location: 44,87 + Actor2776: t08 + Owner: Neutral + Location: 45,88 + Actor2778: t13 + Owner: Neutral + Location: 44,88 + Actor2779: t13 + Owner: Neutral + Location: 44,89 + Actor2780: t16 + Owner: Neutral + Location: 45,89 + Actor2781: t05 + Owner: Neutral + Location: 46,89 + Actor2783: t17 + Owner: Neutral + Location: 45,90 + Actor2784: t02 + Owner: Neutral + Location: 46,90 + Actor2421: t07 + Owner: Neutral + Location: 41,82 + Actor2422: tc01 + Owner: Neutral + Location: 49,82 + Actor2424: t13 + Owner: Neutral + Location: 49,83 + Actor2425: t05 + Owner: Neutral + Location: 50,83 + Actor2428: t07 + Owner: Neutral + Location: 49,84 + Actor2429: t13 + Owner: Neutral + Location: 50,84 + Actor2430: tc05 + Owner: Neutral + Location: 46,87 + Actor2431: tc04 + Owner: Neutral + Location: 46,83 + Actor2432: chain + Owner: Nod + Location: 37,85 + Actor2508: chain + Owner: Nod + Location: 36,85 + Actor2736: chain + Owner: Nod + Location: 33,85 + Actor2738: chain + Owner: Nod + Location: 34,85 + Actor2772: chain + Owner: Nod + Location: 41,88 + Actor2785: chain + Owner: Nod + Location: 41,89 + Actor2786: chain + Owner: Nod + Location: 41,90 + Actor2787: chain + Owner: Nod + Location: 41,91 + Actor2788: chain + Owner: Nod + Location: 41,92 + Actor2789: chain + Owner: Nod + Location: 41,93 + Actor2790: chain + Owner: Nod + Location: 40,93 + Actor2791: chain + Owner: Nod + Location: 39,93 + Actor2792: chain + Owner: Nod + Location: 38,93 + Actor2793: chain + Owner: Nod + Location: 37,93 + Actor2794: chain + Owner: Nod + Location: 32,93 + Actor2796: chain + Owner: Nod + Location: 31,93 + Actor2797: chain + Owner: Nod + Location: 30,93 + Actor2798: chain + Owner: Nod + Location: 29,93 + Actor2799: chain + Owner: Nod + Location: 29,92 + Actor2800: chain + Owner: Nod + Location: 29,91 + Actor2801: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 34,84 + Actor2802: n1 + Owner: Nod + SubCell: 3 + Location: 37,84 + Facing: 214 + NodComms: hq + Owner: Nod + Location: 38,89 + Actor2433: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 37,94 + Actor2777: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 33,93 + Actor2393: hand + Owner: Nod + Location: 68,71 + Actor2402: t03 + Owner: Neutral + Location: 72,74 + Actor2484: bggy + Owner: Nod + Location: 36,90 + Facing: 531 + Actor2782: arty.nod + Owner: Nod + Location: 60,45 + Facing: 384 + Actor2737: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 46,13 + Actor2805: e1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 9,14 + Actor2806: e1 + Owner: Nod + Location: 12,17 + SubCell: 1 + Facing: 384 + Actor2808: e1 + Owner: Nod + SubCell: 3 + Location: 37,45 + Facing: 384 + Actor2809: e1 + Owner: Nod + SubCell: 3 + Location: 20,53 + Facing: 0 + Actor2810: e1 + Owner: Nod + Location: 19,53 + SubCell: 3 + Facing: 0 + Actor2811: gun + Owner: Nod + TurretFacing: 563 + Location: 50,86 + Actor2419: t12 + Owner: Neutral + Location: 89,77 + Actor2420: t17 + Owner: Neutral + Location: 90,77 + Actor2814: t01 + Owner: Neutral + Location: 90,78 + Actor2815: t13 + Owner: Neutral + Location: 91,78 + Actor2698: n1 + Owner: Nod + SubCell: 3 + Facing: 848 + Location: 14,85 + Actor2733: n1 + Owner: Nod + SubCell: 3 + Facing: 848 + Location: 15,87 + Actor2813: n1 + Owner: Nod + SubCell: 3 + Facing: 848 + Location: 17,87 + Actor2816: n1 + Owner: Nod + SubCell: 3 + Facing: 848 + Location: 16,88 + Actor2817: n1 + Owner: Nod + SubCell: 3 + Facing: 848 + Location: 16,90 + Actor2818: bggy + Owner: Nod + Facing: 0 + Location: 15,91 + Actor2819: n1 + Owner: Nod + SubCell: 3 + Facing: 848 + Location: 19,88 + Actor2820: n1 + Owner: Nod + SubCell: 3 + Facing: 848 + Location: 20,89 + Actor2512: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 53,64 + Actor2753: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 52,67 + Actor2405: t13 + Owner: Neutral + Location: 40,74 + Actor2407: t14.husk + Owner: Neutral + Location: 41,74 + Actor2739: tc03 + Owner: Neutral + Location: 43,75 + Actor2740: t13 + Owner: Neutral + Location: 40,75 + Actor2754: t16 + Owner: Neutral + Location: 41,75 + Actor2755: t05 + Owner: Neutral + Location: 42,75 + Actor2756: t12 + Owner: Neutral + Location: 40,76 + Actor2821: t17 + Owner: Neutral + Location: 41,76 + Actor2822: t02 + Owner: Neutral + Location: 42,76 + Actor2823: t17.husk + Owner: Neutral + Location: 43,76 + Actor2824: t03 + Owner: Neutral + Location: 44,76 + Actor2825: t16.husk + Owner: Neutral + Location: 40,77 + Actor2826: t01 + Owner: Neutral + Location: 41,77 + Actor2827: t13 + Owner: Neutral + Location: 42,77 + Actor2828: t06 + Owner: Neutral + Location: 43,77 + Actor2829: t12 + Owner: Neutral + Location: 44,77 + Actor2830: t05 + Owner: Neutral + Location: 45,74 + Actor2831: t16 + Owner: Neutral + Location: 46,74 + Actor2832: t17 + Owner: Neutral + Location: 47,74 + Actor2833: t08 + Owner: Neutral + Location: 48,75 + Actor2834: tc02 + Owner: Neutral + Location: 44,76 + Actor2835: t13 + Owner: Neutral + Location: 46,75 + Actor2836: t10 + Owner: Neutral + Location: 47,75 + Actor2837: t03 + Owner: Neutral + Location: 46,76 + Actor2838: t16 + Owner: Neutral + Location: 47,76 + Actor2839: t11 + Owner: Neutral + Location: 45,77 + Actor2470: t11 + Owner: Neutral + Location: 46,78 + Actor2840: tc01 + Owner: Neutral + Location: 47,77 + Actor2841: t16 + Owner: Neutral + Location: 49,75 + Actor2842: t17 + Owner: Neutral + Location: 52,78 + Actor2847: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 38,4 + Actor2848: e1 + Owner: Nod + Facing: 384 + SubCell: 1 + Location: 38,4 + Actor2850: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 39,5 + Actor2843: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 38,5 + Actor2845: bike + Owner: Nod + Facing: 134 + Location: 19,90 + SAM2Squad: waypoint + Owner: Neutral + Location: 17,88 + SAM1Squad: waypoint + Owner: Neutral + Location: 39,6 + SAM4Squad: waypoint + Owner: Neutral + Location: 54,66 + Actor2406: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 38,6 + Actor2409: n1 + Owner: Nod + SubCell: 3 + Location: 40,6 + Facing: 384 + Actor2700: n1 + Owner: Nod + SubCell: 3 + Facing: 166 + Location: 65,38 + Actor2746: n1 + Owner: Nod + SubCell: 3 + Facing: 1023 + Location: 67,36 + Actor2745: n1 + Owner: Nod + SubCell: 3 + Location: 59,44 + Facing: 618 + Actor2499: bggy + Owner: Nod + Facing: 134 + Location: 56,76 + Actor2702: bggy + Owner: Nod + Facing: 134 + Location: 55,77 + Actor2703: bike + Owner: Nod + Facing: 134 + Location: 57,77 + Actor2404: bike + Owner: Nod + Facing: 134 + Location: 58,78 + SAM3Squad: waypoint + Owner: Neutral + Location: 56,77 + Actor2408: bike + Owner: Nod + Facing: 134 + Location: 55,78 + Actor2704: bggy + Owner: Nod + Facing: 134 + Location: 57,78 + Actor2699: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 41,7 + Actor2710: e1 + Owner: Nod + Facing: 384 + SubCell: 1 + Location: 41,7 + Actor2731: n1 + Owner: Nod + SubCell: 3 + Facing: 848 + Location: 66,43 + Actor2744: n1 + Owner: Nod + SubCell: 3 + Facing: 848 + Location: 68,43 + Actor2747: n1 + Owner: Nod + SubCell: 3 + Facing: 848 + Location: 67,44 + SAM5Squad: waypoint + Owner: Neutral + Location: 68,44 + Actor2770: n3 + Owner: Nod + SubCell: 3 + Facing: 222 + Location: 69,44 + Actor2803: n1 + Owner: Nod + SubCell: 3 + Facing: 848 + Location: 70,44 + Actor2844: n1 + Owner: Nod + SubCell: 3 + Facing: 713 + Location: 69,45 + Actor2846: n1 + Owner: Nod + SubCell: 3 + Facing: 848 + Location: 71,45 + Actor2851: n1 + Owner: Nod + SubCell: 3 + Facing: 848 + Location: 67,46 + Actor2852: bike + Owner: Nod + Facing: 134 + Location: 70,46 + Actor2853: bggy + Owner: Nod + Facing: 0 + Location: 66,47 + Actor2854: n1 + Owner: Nod + SubCell: 3 + Facing: 848 + Location: 68,46 + SAM6Squad: waypoint + Owner: Neutral + Location: 73,62 + Actor2730: bike + Owner: Nod + Location: 72,61 + Facing: 134 + Actor2705: n1 + Owner: Nod + SubCell: 3 + Facing: 174 + Location: 75,60 + Actor2769: n1 + Owner: Nod + SubCell: 1 + Facing: 190 + Location: 75,60 + SAM7Squad: waypoint + Owner: Neutral + Location: 73,82 + Transport1: sapc + Owner: NodTransports + Location: 68,76 + Facing: 384 + Transport2: sapc + Owner: NodTransports + Location: 70,77 + Facing: 384 + Actor2418: bggy + Owner: Nod + Facing: 412 + Location: 72,83 + Actor2855: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 74,83 + Actor2858: n1 + Owner: Nod + Facing: 384 + SubCell: 1 + Location: 74,83 + Actor2859: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 73,83 + Actor2860: n1 + Owner: Nod + Facing: 384 + SubCell: 1 + Location: 73,83 + Actor2861: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 72,81 + Actor2759: n1 + Owner: Nod + SubCell: 3 + Facing: 174 + Location: 71,61 + Actor2862: n1 + Owner: Nod + SubCell: 1 + Facing: 190 + Location: 71,61 + Actor2863: n3 + Owner: Nod + SubCell: 3 + Location: 74,62 + Facing: 222 + Actor2864: n4 + Owner: Nod + SubCell: 3 + Location: 42,55 + Facing: 269 + Actor2865: ftnk + Owner: Nod + Location: 42,56 + Facing: 253 + Actor2866: n4 + Owner: Nod + SubCell: 3 + Facing: 222 + Location: 42,57 + Actor2714: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 53,28 + Actor2757: e1 + Owner: Nod + Facing: 384 + SubCell: 1 + Location: 53,28 + Actor2758: bggy + Owner: Nod + Facing: 515 + Location: 52,29 + Actor2867: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 54,29 + Actor2711: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 48,44 + Actor2728: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 31,28 + Actor2729: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 35,28 + Actor2742: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 32,29 + Actor2807: bggy + Owner: Nod + Facing: 634 + Location: 34,29 + Actor2868: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 12,48 + Actor2869: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 11,49 + LongbowRally2: waypoint + Owner: Neutral + Location: 81,53 + LongbowRally1: waypoint + Owner: Neutral + Location: 55,55 + Actor2483: bggy + Owner: Nod + Facing: 412 + Location: 73,75 + Actor2764: n1 + Owner: Nod + SubCell: 1 + Facing: 190 + Location: 79,73 + Raider1: apc + Owner: Greece + Location: 3,28 + Facing: 768 + Raider2: apc + Owner: Greece + Location: 3,32 + Facing: 768 + Actor2804: snip + Owner: Greece + SubCell: 4 + Location: 5,32 + Facing: 768 + Actor2856: snip + Owner: Greece + SubCell: 1 + Location: 5,32 + Facing: 768 + Actor2870: snip + Owner: Greece + SubCell: 4 + Location: 5,28 + Facing: 896 + Actor2872: snip + Owner: Greece + SubCell: 1 + Location: 5,28 + Facing: 896 + Actor2439: rtnk + Owner: Greece + Location: 8,28 + Facing: 896 + NodBaseTopLeft: waypoint + Owner: Neutral + Location: 63,63 + NodBaseBottomRight: waypoint + Owner: Neutral + Location: 85,84 + NonHardSniper2: snip + Owner: Greece + SubCell: 5 + Location: 5,32 + Facing: 768 + Actor2763: snip + Owner: Greece + SubCell: 2 + Location: 5,32 + Facing: 768 + Actor2871: snip + Owner: Greece + SubCell: 5 + Location: 5,28 + Facing: 896 + NonHardSniper1: snip + Owner: Greece + SubCell: 2 + Location: 5,28 + Facing: 896 + SAM2SquadRally: waypoint + Owner: Neutral + Location: 29,58 + SAM1SquadRally: waypoint + Owner: Neutral + Location: 31,20 + SAM3SquadRally: waypoint + Owner: Neutral + Location: 29,48 + SAM4SquadRally: waypoint + Owner: Neutral + Location: 31,56 + SAM5SquadRally: waypoint + Owner: Neutral + Location: 56,23 + SAM6SquadRally: waypoint + Owner: Neutral + Location: 67,31 + SAM7SquadRally: waypoint + Owner: Neutral + Location: 67,41 + Actor2444: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 90,40 + Actor2445: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 91,42 + Actor2447: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 90,43 + Actor2448: n1 + Owner: Nod + Facing: 384 + Location: 91,42 + SubCell: 1 + Actor2449: n1 + Owner: Nod + Facing: 384 + Location: 90,40 + SubCell: 1 + Actor2451: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 89,38 + Actor2452: n3 + Owner: Nod + Facing: 384 + Location: 90,41 + SubCell: 3 + Actor2454: n3 + Owner: Nod + Facing: 384 + Location: 90,39 + SubCell: 3 + Actor2456: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 90,42 + NodPatrol1_1: waypoint + Owner: Neutral + Location: 90,40 + Actor2457: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 34,73 + Actor2765: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 34,74 + Actor2873: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 35,74 + Actor2874: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 35,75 + Actor2875: n1 + Owner: Nod + Facing: 384 + SubCell: 1 + Location: 35,75 + NodPatrol2_1: waypoint + Owner: Neutral + Location: 35,75 + Actor2877: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 36,75 + Actor2878: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 34,76 + Actor2879: n3 + Owner: Nod + SubCell: 3 + Location: 35,76 + Facing: 384 + Actor2880: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 35,77 + Actor2881: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 36,77 + Actor2882: n1 + Owner: Nod + Facing: 384 + SubCell: 1 + Location: 36,77 + Actor2883: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 35,78 + NodPatrol2_2: waypoint + Owner: Neutral + Location: 47,47 + NodPatrol2_3: waypoint + Owner: Neutral + Location: 57,18 + NodPatrol1_2: waypoint + Owner: Neutral + Location: 87,9 + NodPatrol1_3: waypoint + Owner: Neutral + Location: 67,21 + NodPatrol1_4: waypoint + Owner: Neutral + Location: 66,60 + NodPatrol1_5: waypoint + Owner: Neutral + Location: 85,61 + Actor2696: ftnk + Owner: Nod + Location: 71,82 + Facing: 384 + Medic1: medi + Owner: Greece + SubCell: 3 + Location: 3,30 + Facing: 384 + Mechanic: mech + Owner: Greece + SubCell: 3 + Location: 3,31 + Facing: 384 + Medic2: medi + Owner: Greece + SubCell: 3 + Location: 3,29 + Facing: 384 + HardOnlySSM: mlrs + Owner: Nod + Location: 80,66 + Facing: 111 + Actor2462: bggy + Owner: Nod + Facing: 515 + Location: 39,8 + Actor2479: n4 + Owner: Nod + SubCell: 3 + Facing: 269 + Location: 78,33 + HardOnlyFlameTank1: ftnk + Owner: Nod + Location: 79,34 + Facing: 253 + Actor2812: n4 + Owner: Nod + SubCell: 3 + Facing: 222 + Location: 78,35 + HardOnlyFlameTank2: ftnk + Owner: Nod + Location: 71,72 + Facing: 0 + Actor2480: n4 + Owner: Nod + SubCell: 3 + Facing: 222 + Location: 55,28 + Actor2849: n4 + Owner: Nod + SubCell: 3 + Facing: 222 + Location: 49,46 + Actor2857: n4 + Owner: Nod + SubCell: 3 + Facing: 222 + Location: 16,45 + Actor2876: n4 + Owner: Nod + SubCell: 3 + Location: 6,16 + Facing: 523 + Actor2884: n4 + Owner: Nod + SubCell: 3 + Facing: 523 + Location: 7,15 + HardOnlyFlameTank3: ftnk + Owner: Nod + Location: 65,56 + Facing: 0 + HardOnlyFlameTank4: ftnk + Owner: Nod + Location: 67,56 + Facing: 0 + HardOnlyFlameTank5: ftnk + Owner: Nod + Location: 39,16 + Facing: 384 + HardOnlyBlackHand4: bh + Owner: Nod + SubCell: 3 + Location: 70,72 + Facing: 0 + HardOnlyBlackHand3: bh + Owner: Nod + SubCell: 3 + Location: 73,73 + Facing: 0 + HardOnlyBlackHand2: bh + Owner: Nod + Location: 76,72 + SubCell: 3 + Facing: 0 + HardOnlyBlackHand1: bh + Owner: Nod + SubCell: 3 + Location: 78,71 + Facing: 0 + NodBaseCamera: camera + Owner: Greece + Location: 73,72 + Actor2885: shad + Owner: Nod + Location: 34,87 + SubCell: 3 + Facing: 384 + Actor2886: shad + Owner: Nod + Location: 35,88 + SubCell: 3 + Facing: 384 + Actor2887: shad + Owner: Nod + Facing: 384 + Location: 36,86 + SubCell: 3 + Actor2888: shad + Owner: Nod + Facing: 384 + Location: 86,18 + SubCell: 3 + Actor2889: shad + Owner: Nod + Facing: 384 + Location: 85,19 + SubCell: 3 + Actor2890: shad + Owner: Nod + Facing: 384 + Location: 76,66 + SubCell: 3 + Actor2891: shad + Owner: Nod + Location: 70,67 + SubCell: 3 + Facing: 0 + Actor2892: shad + Owner: Nod + Facing: 384 + Location: 46,53 + SubCell: 3 + Actor2893: shad + Owner: Nod + Location: 47,59 + SubCell: 3 + Facing: 384 + Actor2894: bh + Owner: Nod + Facing: 384 + Location: 43,16 + SubCell: 3 + Actor2895: bh + Owner: Nod + Location: 33,53 + SubCell: 3 + Facing: 384 + Actor2896: bh + Owner: Nod + Location: 34,51 + SubCell: 3 + Facing: 384 + Actor2897: bh + Owner: Nod + Location: 33,49 + SubCell: 3 + Facing: 384 + Actor2898: bh + Owner: Nod + Facing: 384 + Location: 75,39 + SubCell: 3 + Actor2899: bh + Owner: Nod + Location: 73,40 + SubCell: 3 + Facing: 384 + VeryHardOnlyFlameTank1: ftnk + Owner: Nod + Location: 62,31 + Facing: 95 + VeryHardOnlyFlameTank2: ftnk + Owner: Nod + Location: 64,28 + Facing: 245 + Actor2900: hftk + Owner: Nod + Location: 68,59 + Facing: 95 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-coalitions.yaml, ca|missions/main-campaign/ca05-apprehension/apprehension-rules.yaml, ca|rules/custom/coop-rules.yaml, apprehension-coop-rules.yaml + +Sequences: ca|missions/main-campaign/ca05-apprehension/apprehension-sequences.yaml + +Weapons: ca|weapons/custom/campaign.yaml, ca|missions/main-campaign/ca05-apprehension/apprehension-weapons.yaml diff --git a/mods/ca/missions/coop-campaign/ca06-machinations-coop/machinations-coop-rules.yaml b/mods/ca/missions/coop-campaign/ca06-machinations-coop/machinations-coop-rules.yaml new file mode 100644 index 0000000000..b806abed62 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca06-machinations-coop/machinations-coop-rules.yaml @@ -0,0 +1,6 @@ +World: + LuaScript: + Scripts: campaign.lua, coop.lua, ca|missions/main-campaign/ca06-machinations/machinations.lua, machinations-coop.lua + LobbyMissionInfo@InitialObjectives: + Prefix: Initial Objectives + Text: • Locate and capture the Nod research facility. diff --git a/mods/ca/missions/coop-campaign/ca06-machinations-coop/machinations-coop.lua b/mods/ca/missions/coop-campaign/ca06-machinations-coop/machinations-coop.lua new file mode 100644 index 0000000000..103b0709f0 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca06-machinations-coop/machinations-coop.lua @@ -0,0 +1,57 @@ + +SetupPlayers = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Multi2 = Player.GetPlayer("Multi2") + Multi3 = Player.GetPlayer("Multi3") + Multi4 = Player.GetPlayer("Multi4") + Multi5 = Player.GetPlayer("Multi5") + Greece = Player.GetPlayer("Greece") + Nod = Player.GetPlayer("Nod") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = Utils.Where({ Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 }, function(p) return p ~= nil end) + MissionEnemies = { Nod } + SinglePlayerPlayer = Greece + CoopInit() +end + +AfterWorldLoaded = function() + StartCashSpread(3500) +end + +AfterTick = function() + +end + +DoMcvArrival = function() + InitialUnits = { + easy = { "jeep", "2tnk", "e1", "e1", "e1", "e3" }, + normal = { "jeep", "e1", "e1", "e1", "e3" }, + hard = { "jeep", "e1", "e1", "e3" }, + vhard = { "jeep", "e1", "e1" }, + brutal = { "jeep" } + } + + while #InitialUnits[Difficulty] <= #MissionPlayers do + table.insert(InitialUnits[Difficulty], "e1") + end + + local mcvArrivalPath = { McvEntry.Location, McvLanding.Location } + local mcvExitPath = { McvEntry.Location } + local reinforcements = DoNavalTransportDrop(Greece, mcvArrivalPath, mcvExitPath, "lst.reinforce", InitialUnits[Difficulty], function(a) + a.Move(McvRally.Location) + end) + local transport = reinforcements[1] + + Trigger.AfterDelay(2, function() + Utils.Do(transport.Passengers, function(p) + if not IsMcv(p) then + p.Owner = Greece + end + end) + Utils.Do(GetMcvPlayers(), function(p) + local mcv = Actor.Create("mcv", false, { Owner = p }) + transport.LoadPassenger(mcv) + end) + end) +end diff --git a/mods/ca/missions/coop-campaign/ca06-machinations-coop/map.bin b/mods/ca/missions/coop-campaign/ca06-machinations-coop/map.bin new file mode 100644 index 0000000000..9a829045d8 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca06-machinations-coop/map.bin differ diff --git a/mods/ca/missions/coop-campaign/ca06-machinations-coop/map.png b/mods/ca/missions/coop-campaign/ca06-machinations-coop/map.png new file mode 100644 index 0000000000..1d3b8bfb78 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca06-machinations-coop/map.png differ diff --git a/mods/ca/missions/coop-campaign/ca06-machinations-coop/map.yaml b/mods/ca/missions/coop-campaign/ca06-machinations-coop/map.yaml new file mode 100644 index 0000000000..6d3363e163 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca06-machinations-coop/map.yaml @@ -0,0 +1,2394 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 06: Machinations Co-op + +Author: Darkademic & Gandorques Hikla + +Tileset: DESERT + +MapSize: 98,98 + +Bounds: 1,1,96,96 + +Visibility: Lobby + +Categories: Co-op Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: Nod, Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + PlayerReference@Greece: + Name: Greece + Faction: allies + Color: 99ACF2 + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Nod, Creeps + PlayerReference@Nod: + Name: Nod + Bot: campaign + Faction: nod + Color: FE1100 + Enemies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 99ACF2 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Nod, Creeps + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 0B7310 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Nod, Creeps + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 134691 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Nod, Creeps + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 775A12 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Nod, Creeps + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 994050 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Nod, Creeps + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: EEA8A8 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Nod, Creeps + +Actors: + Actor30: brik + Owner: Nod + Location: 40,64 + Actor31: brik + Owner: Nod + Location: 41,64 + Actor32: brik + Owner: Nod + Location: 42,64 + Actor33: brik + Owner: Nod + Location: 43,64 + Actor35: brik + Owner: Nod + Location: 46,79 + Actor36: brik + Owner: Nod + Location: 46,78 + Actor38: brik + Owner: Nod + Location: 44,64 + Actor39: brik + Owner: Nod + Location: 45,64 + Actor40: brik + Owner: Nod + Location: 46,64 + Actor41: brik + Owner: Nod + Location: 46,65 + Actor42: brik + Owner: Nod + Location: 45,65 + Actor43: brik + Owner: Nod + Location: 50,64 + Actor44: brik + Owner: Nod + Location: 50,65 + Actor45: brik + Owner: Nod + Location: 51,65 + Actor46: brik + Owner: Nod + Location: 51,64 + Actor47: brik + Owner: Nod + Location: 52,64 + Actor48: brik + Owner: Nod + Location: 53,64 + Actor49: brik + Owner: Nod + Location: 54,64 + Actor50: brik + Owner: Nod + Location: 55,64 + Actor51: brik + Owner: Nod + Location: 56,64 + Actor52: brik + Owner: Nod + Location: 57,64 + Actor53: brik + Owner: Nod + Location: 58,64 + Actor54: brik + Owner: Nod + Location: 59,64 + Actor55: brik + Owner: Nod + Location: 59,65 + Actor56: brik + Owner: Nod + Location: 59,66 + Actor57: brik + Owner: Nod + Location: 59,67 + Actor58: brik + Owner: Nod + Location: 59,68 + Actor59: brik + Owner: Nod + Location: 58,69 + Actor60: brik + Owner: Nod + Location: 59,69 + Actor61: brik + Owner: Nod + Location: 58,68 + Actor62: brik + Owner: Nod + Location: 58,73 + Actor63: brik + Owner: Nod + Location: 59,73 + Actor64: brik + Owner: Nod + Location: 58,74 + Actor65: brik + Owner: Nod + Location: 59,74 + Actor66: brik + Owner: Nod + Location: 59,75 + Actor67: brik + Owner: Nod + Location: 59,76 + Actor68: brik + Owner: Nod + Location: 59,78 + Actor69: brik + Owner: Nod + Location: 59,77 + Actor70: brik + Owner: Nod + Location: 59,79 + Actor71: brik + Owner: Nod + Location: 59,80 + Actor72: brik + Owner: Nod + Location: 57,80 + Actor73: brik + Owner: Nod + Location: 58,80 + Actor74: brik + Owner: Nod + Location: 56,80 + Actor75: brik + Owner: Nod + Location: 55,80 + Actor76: brik + Owner: Nod + Location: 53,80 + Actor77: brik + Owner: Nod + Location: 54,80 + Actor78: brik + Owner: Nod + Location: 53,79 + Actor79: brik + Owner: Nod + Location: 54,79 + Actor80: obli + Owner: Nod + Location: 44,65 + Actor82: obli + Owner: Nod + Location: 52,65 + Actor83: obli + Owner: Nod + Location: 58,67 + Actor85: obli + Owner: Nod + Location: 58,75 + Actor86: obli + Owner: Nod + Location: 58,75 + Actor87: nuk2 + Owner: Nod + Location: 57,77 + Actor88: nuk2 + Owner: Nod + Location: 55,77 + Actor84: brik + Owner: Nod + Location: 38,73 + Actor93: brik + Owner: Nod + Location: 39,73 + Actor94: brik + Owner: Nod + Location: 38,74 + Actor95: brik + Owner: Nod + Location: 39,74 + Actor96: brik + Owner: Nod + Location: 38,75 + SouthWestObelisk2: obli + Owner: Nod + Location: 39,75 + Actor98: brik + Owner: Nod + Location: 38,76 + Actor99: nuk2 + Owner: Nod + Location: 39,76 + Actor100: nuk2 + Owner: Nod + Location: 41,76 + Actor101: nuk2 + Owner: Nod + Location: 43,76 + Actor102: brik + Owner: Nod + Location: 38,77 + Actor103: brik + Owner: Nod + Location: 38,78 + Actor104: brik + Owner: Nod + Location: 38,79 + Actor105: brik + Owner: Nod + Location: 39,79 + Actor106: brik + Owner: Nod + Location: 40,79 + Actor107: brik + Owner: Nod + Location: 41,79 + Actor108: brik + Owner: Nod + Location: 42,79 + Actor109: brik + Owner: Nod + Location: 43,79 + Actor110: brik + Owner: Nod + Location: 44,79 + Actor111: brik + Owner: Nod + Location: 45,79 + Actor112: brik + Owner: Nod + Location: 45,78 + Actor113: brik + Owner: Nod + Location: 38,64 + Actor114: brik + Owner: Nod + Location: 39,64 + Actor115: brik + Owner: Nod + Location: 38,65 + Actor116: brik + Owner: Nod + Location: 38,66 + Actor117: brik + Owner: Nod + Location: 38,67 + SouthWestObelisk1: obli + Owner: Nod + Location: 39,67 + Actor119: brik + Owner: Nod + Location: 38,68 + Actor120: brik + Owner: Nod + Location: 39,68 + Actor121: brik + Owner: Nod + Location: 38,69 + Actor122: brik + Owner: Nod + Location: 39,69 + Actor123: proc.td + Owner: Nod + Location: 41,67 + Actor124: silo.td + Owner: Nod + Location: 39,65 + Actor125: silo.td + Owner: Nod + Location: 41,65 + Actor126: nsam + Owner: Nod + Location: 41,74 + Actor128: nsam + Owner: Nod + Location: 55,74 + Actor127: gun.nod + Owner: Nod + Location: 37,69 + Actor129: gun.nod + Owner: Nod + Location: 37,73 + TurretFacing: 293 + Actor130: gun.nod + Owner: Nod + Location: 46,63 + TurretFacing: 0 + Actor131: gun.nod + Owner: Nod + Location: 50,63 + TurretFacing: 0 + Actor132: gun.nod + Owner: Nod + Location: 60,69 + TurretFacing: 935 + Actor133: gun.nod + Owner: Nod + Location: 60,73 + TurretFacing: 769 + NodSouthSubPen1: spen.nod + Owner: Nod + Location: 54,83 + NodSouthSubPen2: spen.nod + Owner: Nod + Location: 48,83 + Actor137: rep + Owner: Nod + Location: 45,72 + NodSouthAirstrip: airs + Owner: Nod + Location: 47,68 + Actor136: silo.td + Owner: Nod + Location: 57,65 + Actor143: silo.td + Owner: Nod + Location: 55,65 + NodSouthHand: hand + Owner: Nod + Location: 54,68 + Actor139: afac + Owner: Nod + Location: 49,76 + Actor142: brik + Owner: Nod + Location: 79,18 + Actor144: brik + Owner: Nod + Location: 80,18 + Actor145: brik + Owner: Nod + Location: 79,19 + Actor146: brik + Owner: Nod + Location: 80,19 + Actor147: brik + Owner: Nod + Location: 81,18 + Actor148: brik + Owner: Nod + Location: 82,18 + Actor149: brik + Owner: Nod + Location: 83,18 + Actor150: brik + Owner: Nod + Location: 84,18 + Actor151: brik + Owner: Nod + Location: 85,18 + Actor152: brik + Owner: Nod + Location: 86,18 + Actor153: brik + Owner: Nod + Location: 86,19 + Actor154: brik + Owner: Nod + Location: 85,19 + Actor155: brik + Owner: Nod + Location: 90,18 + Actor156: brik + Owner: Nod + Location: 90,19 + Actor157: brik + Owner: Nod + Location: 91,19 + Actor158: brik + Owner: Nod + Location: 91,18 + Actor159: brik + Owner: Nod + Location: 92,18 + Actor160: brik + Owner: Nod + Location: 93,18 + Actor161: brik + Owner: Nod + Location: 94,18 + Actor162: brik + Owner: Nod + Location: 95,18 + Actor163: brik + Owner: Nod + Location: 96,18 + Actor164: brik + Owner: Nod + Location: 96,19 + Actor165: brik + Owner: Nod + Location: 96,20 + Actor166: brik + Owner: Nod + Location: 96,21 + Actor167: brik + Owner: Nod + Location: 96,22 + Actor168: brik + Owner: Nod + Location: 96,23 + Actor169: brik + Owner: Nod + Location: 96,24 + Actor170: afac + Owner: Nod + Location: 93,19 + Actor171: nsam + Owner: Nod + Location: 90,21 + EastObelisk4: obli + Owner: Nod + Location: 92,19 + Actor173: brik + Owner: Nod + Location: 79,20 + Actor174: brik + Owner: Nod + Location: 79,21 + Actor175: brik + Owner: Nod + Location: 79,22 + Actor176: brik + Owner: Nod + Location: 79,23 + Actor177: brik + Owner: Nod + Location: 79,24 + Actor178: brik + Owner: Nod + Location: 79,25 + Actor179: brik + Owner: Nod + Location: 79,26 + Actor180: brik + Owner: Nod + Location: 79,27 + Actor181: brik + Owner: Nod + Location: 80,27 + Actor182: brik + Owner: Nod + Location: 80,26 + Actor183: brik + Owner: Nod + Location: 79,31 + Actor184: brik + Owner: Nod + Location: 80,31 + Actor185: brik + Owner: Nod + Location: 79,32 + Actor186: brik + Owner: Nod + Location: 80,32 + Actor187: brik + Owner: Nod + Location: 79,33 + Actor188: brik + Owner: Nod + Location: 79,34 + Actor189: brik + Owner: Nod + Location: 79,35 + Actor190: brik + Owner: Nod + Location: 79,36 + Actor191: brik + Owner: Nod + Location: 80,36 + Actor192: brik + Owner: Nod + Location: 81,36 + Actor193: brik + Owner: Nod + Location: 82,36 + Actor194: brik + Owner: Nod + Location: 83,36 + Actor195: brik + Owner: Nod + Location: 84,36 + Actor196: brik + Owner: Nod + Location: 85,36 + Actor197: brik + Owner: Nod + Location: 86,36 + Actor198: brik + Owner: Nod + Location: 86,35 + Actor199: brik + Owner: Nod + Location: 85,35 + Actor200: brik + Owner: Nod + Location: 90,35 + Actor201: brik + Owner: Nod + Location: 90,36 + Actor202: brik + Owner: Nod + Location: 91,36 + Actor203: brik + Owner: Nod + Location: 91,35 + Actor204: brik + Owner: Nod + Location: 92,36 + Actor205: brik + Owner: Nod + Location: 93,36 + Actor206: brik + Owner: Nod + Location: 94,36 + Actor207: brik + Owner: Nod + Location: 95,36 + Actor208: brik + Owner: Nod + Location: 96,36 + Actor209: brik + Owner: Nod + Location: 96,35 + Actor210: brik + Owner: Nod + Location: 96,34 + Actor211: brik + Owner: Nod + Location: 96,33 + Actor212: brik + Owner: Nod + Location: 96,32 + Actor213: brik + Owner: Nod + Location: 96,31 + Actor214: brik + Owner: Nod + Location: 96,30 + Actor215: brik + Owner: Nod + Location: 96,29 + Actor216: brik + Owner: Nod + Location: 96,28 + Actor217: brik + Owner: Nod + Location: 96,27 + Actor218: brik + Owner: Nod + Location: 96,26 + Actor219: brik + Owner: Nod + Location: 96,25 + NodEastAirstrip: airs + Owner: Nod + Location: 84,25 + NodEastHand1: hand + Owner: Nod + Location: 83,31 + Actor222: obli + Owner: Nod + Location: 80,33 + Actor223: obli + Owner: Nod + Location: 80,25 + EastObelisk3: obli + Owner: Nod + Location: 84,19 + EastObelisk1: obli + Owner: Nod + Location: 84,35 + EastObelisk2: obli + Owner: Nod + Location: 92,35 + Actor227: hq + Owner: Nod + Location: 94,33 + Actor228: nuk2 + Owner: Nod + Location: 94,30 + Actor229: nuk2 + Owner: Nod + Location: 94,27 + Actor230: nuk2 + Owner: Nod + Location: 94,24 + Actor231: proc.td + Owner: Nod + Location: 90,23 + Actor232: silo.td + Owner: Nod + Location: 81,19 + Actor233: silo.td + Owner: Nod + Location: 80,21 + Actor234: silo.td + Owner: Nod + Location: 83,21 + Actor235: nuk2 + Owner: Nod + Location: 91,28 + NodEastHand2: hand + Owner: Nod + Location: 86,30 + Actor237: gun.nod + Owner: Nod + Location: 78,27 + Actor238: gun.nod + Owner: Nod + Location: 78,31 + Actor239: gun.nod + Owner: Nod + Location: 86,37 + Actor240: gun.nod + Owner: Nod + Location: 90,37 + Actor241: gun.nod + Owner: Nod + Location: 86,17 + Actor242: gun.nod + Owner: Nod + Location: 90,17 + Actor245: split2 + Owner: Neutral + Location: 91,5 + Actor243: split2 + Owner: Neutral + Location: 92,13 + Actor244: nsam + Owner: Nod + Location: 80,35 + Turret4: gun.nod + Owner: Nod + Location: 36,43 + TurretFacing: 785 + Turret1: gun.nod + Owner: Nod + Location: 30,42 + TurretFacing: 325 + Actor248: rock3 + Owner: Neutral + Location: 33,40 + Actor249: t09 + Owner: Neutral + Location: 36,42 + Actor250: t04 + Owner: Neutral + Location: 31,41 + Actor253: gun.nod + Owner: Nod + Location: 59,29 + Actor254: gun.nod + Owner: Nod + Location: 60,24 + Actor251: gun.nod + Owner: Nod + Location: 57,36 + Actor255: split2 + Owner: Neutral + Location: 28,81 + Actor256: split2 + Owner: Neutral + Location: 36,81 + Turret2: gun.nod + Owner: Nod + Location: 31,32 + TurretFacing: 348 + Turret3: gun.nod + Owner: Nod + Location: 35,28 + TurretFacing: 0 + Church1: v25 + Location: 65,2 + Owner: Neutral + Actor260: v24 + Owner: Neutral + Location: 61,1 + Actor261: v26 + Owner: Neutral + Location: 57,4 + Actor262: v29 + Owner: Neutral + Location: 65,6 + Actor263: v27 + Owner: Neutral + Location: 69,4 + Actor264: v20 + Owner: Neutral + Location: 53,1 + Actor265: v23 + Owner: Neutral + Location: 59,5 + Actor266: c8 + Owner: Neutral + Facing: 384 + Location: 65,5 + SubCell: 3 + Actor267: c8 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 56,3 + Actor268: tecn + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 60,2 + Actor269: c10 + Owner: Neutral + SubCell: 3 + Facing: 384 + Location: 67,2 + Actor270: c5 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 68,6 + Actor271: tc01 + Owner: Neutral + Location: 51,9 + Actor272: t09 + Owner: Neutral + Location: 57,14 + Actor273: v22 + Owner: Neutral + Location: 64,14 + Actor274: v21 + Owner: Neutral + Location: 58,11 + Actor275: v34 + Owner: Neutral + Location: 56,9 + Actor276: v31 + Owner: Neutral + Location: 50,7 + Actor277: rock4 + Owner: Neutral + Location: 67,12 + Actor278: t08 + Owner: Neutral + Location: 52,20 + Actor279: tc01 + Owner: Neutral + Location: 39,24 + Actor280: split2 + Owner: Neutral + Location: 9,19 + Actor281: split2 + Owner: Neutral + Location: 18,40 + Actor282: split2 + Owner: Neutral + Location: 24,45 + Church2: v25 + Owner: Neutral + Location: 18,69 + Actor284: v20 + Owner: Neutral + Location: 16,72 + Actor285: v22 + Owner: Neutral + Location: 12,71 + Actor286: v21 + Owner: Neutral + Location: 24,73 + Actor287: v24 + Owner: Neutral + Location: 19,65 + Actor288: v29 + Owner: Neutral + Location: 23,67 + Actor289: v31 + Owner: Neutral + Location: 27,70 + Actor290: v26 + Owner: Neutral + Location: 28,65 + Actor291: t08 + Owner: Neutral + Location: 23,72 + Actor292: t18 + Owner: Neutral + Location: 10,73 + Actor293: v36 + Owner: Neutral + Location: 15,67 + Actor294: v14 + Owner: Neutral + Location: 27,71 + Actor295: v30 + Owner: Neutral + Location: 25,68 + Actor296: t09 + Owner: Neutral + Location: 24,70 + Actor297: t04 + Owner: Neutral + Location: 20,63 + Actor298: v16 + Owner: Neutral + Location: 13,77 + Actor299: v09 + Owner: Neutral + Location: 15,70 + Actor300: c10 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 17,71 + Actor301: c8 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 13,72 + Actor302: c8 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 26,71 + Actor303: c5 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 27,65 + Actor304: c5 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 16,67 + Actor305: c4 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 14,75 + ResearchLab: bio + Owner: Nod + Location: 82,71 + Actor307: rock6 + Owner: Neutral + Faction: blackh + Location: 84,66 + Actor308: rock4 + Owner: Neutral + Faction: blackh + Location: 83,81 + LabObelisk2: obli + Owner: Nod + Location: 78,80 + Actor310: obli + Owner: Nod + Location: 77,65 + LabObelisk1: obli + Owner: Nod + Location: 76,74 + Actor312: obli + Owner: Nod + Location: 87,83 + Actor313: obli + Owner: Nod + Location: 87,65 + Actor314: obli + Owner: Nod + Location: 70,61 + Actor315: obli + Owner: Nod + Location: 69,78 + Actor316: chain + Owner: Nod + Location: 81,73 + Actor319: chain + Owner: Nod + Location: 84,73 + Actor317: chain + Owner: Nod + Location: 82,73 + Actor318: nsam + Owner: Nod + Location: 80,67 + Actor320: nsam + Owner: Nod + Location: 85,81 + Actor321: nsam + Owner: Nod + Location: 87,61 + Actor322: nsam + Owner: Nod + Location: 74,58 + Actor323: nsam + Owner: Nod + Location: 73,88 + Actor324: nsam + Owner: Nod + Location: 76,82 + Actor328: nuk2 + Owner: Nod + Location: 68,92 + Actor329: nuk2 + Owner: Nod + Location: 70,92 + Actor330: nuk2 + Owner: Nod + Location: 72,92 + Actor331: chain + Owner: Nod + Location: 67,95 + Actor332: chain + Owner: Nod + Location: 67,94 + Actor333: chain + Owner: Nod + Location: 67,93 + Actor334: chain + Owner: Nod + Location: 67,92 + Actor335: chain + Owner: Nod + Location: 67,91 + Actor336: chain + Owner: Nod + Location: 69,91 + Actor337: chain + Owner: Nod + Location: 68,91 + Actor338: chain + Owner: Nod + Location: 70,91 + Actor339: chain + Owner: Nod + Location: 71,91 + Actor340: chain + Owner: Nod + Location: 72,91 + Actor341: chain + Owner: Nod + Location: 73,91 + Actor342: chain + Owner: Nod + Location: 74,91 + Actor343: chain + Owner: Nod + Location: 74,92 + Actor344: chain + Owner: Nod + Location: 74,93 + Actor345: chain + Owner: Nod + Location: 74,94 + Actor346: chain + Owner: Nod + Location: 74,95 + Actor347: chain + Owner: Nod + Location: 68,95 + Actor348: chain + Owner: Nod + Location: 69,95 + Actor349: chain + Owner: Nod + Location: 70,95 + Actor350: chain + Owner: Nod + Location: 71,95 + Actor351: chain + Owner: Nod + Location: 72,95 + Actor352: chain + Owner: Nod + Location: 73,95 + Actor353: chain + Owner: Nod + Location: 94,80 + Actor354: chain + Owner: Nod + Location: 93,80 + Actor355: chain + Owner: Nod + Location: 92,80 + Actor356: chain + Owner: Nod + Location: 92,81 + Actor357: chain + Owner: Nod + Location: 92,82 + Actor358: chain + Owner: Nod + Location: 92,83 + Actor359: chain + Owner: Nod + Location: 92,84 + Actor360: chain + Owner: Nod + Location: 92,85 + Actor361: chain + Owner: Nod + Location: 92,86 + Actor362: chain + Owner: Nod + Location: 92,87 + Actor363: chain + Owner: Nod + Location: 92,88 + Actor364: chain + Owner: Nod + Location: 92,89 + Actor365: chain + Owner: Nod + Location: 92,90 + Actor366: chain + Owner: Nod + Location: 93,90 + NodQuarryHand: hand + Owner: Nod + Location: 79,91 + Actor368: ltur + Owner: Nod + Location: 78,90 + NodQuarryAirstrip: airs + Owner: Nod + Location: 84,88 + NodHelipad3: hpad.td + Owner: Nod + Location: 77,46 + NodHelipad2: hpad.td + Owner: Nod + Location: 74,46 + NodHelipad1: hpad.td + Owner: Nod + Location: 71,46 + Actor373: tmpl + Owner: Nod + Location: 91,73 + Actor374: nsam + Owner: Nod + Location: 93,79 + Actor375: nsam + Owner: Nod + Location: 94,53 + Actor377: obli + Owner: Nod + Location: 91,56 + Actor376: chain + Owner: Nod + Location: 70,45 + Actor378: chain + Owner: Nod + Location: 71,45 + Actor379: chain + Owner: Nod + Location: 72,45 + Actor380: chain + Owner: Nod + Location: 73,45 + Actor381: chain + Owner: Nod + Location: 74,45 + Actor382: chain + Owner: Nod + Location: 76,45 + Actor383: chain + Owner: Nod + Location: 75,45 + Actor384: chain + Owner: Nod + Location: 77,45 + Actor385: chain + Owner: Nod + Location: 78,45 + Actor386: chain + Owner: Nod + Location: 79,45 + Actor387: chain + Owner: Nod + Location: 79,46 + Actor388: chain + Owner: Nod + Location: 79,47 + Actor389: chain + Owner: Nod + Location: 79,48 + Actor390: chain + Owner: Nod + Location: 70,48 + Actor391: chain + Owner: Nod + Location: 70,47 + Actor392: chain + Owner: Nod + Location: 70,46 + Actor393: hand + Owner: Nod + Location: 63,44 + Actor394: nsam + Owner: Nod + Location: 67,42 + Actor395: obli + Owner: Nod + Location: 70,43 + Actor396: gun.nod + Owner: Nod + Location: 63,49 + Actor397: t18 + Owner: Neutral + Location: 75,54 + Actor398: nuk2 + Owner: Nod + Location: 70,51 + Actor400: nuk2 + Owner: Nod + Location: 68,45 + Actor399: obli + Owner: Nod + Location: 68,54 + Actor401: gun.nod + Owner: Nod + Location: 65,55 + Actor402: gun.nod + Owner: Nod + Location: 22,59 + TurretFacing: 55 + Actor403: gun.nod + Owner: Nod + Location: 33,56 + TurretFacing: 95 + RiverTurret1: gun.nod + Owner: Nod + Location: 27,56 + TurretFacing: 0 + Actor405: chain + Owner: Nod + Location: 89,77 + Actor406: chain + Owner: Nod + Location: 89,76 + Actor409: chain + Owner: Nod + Location: 89,73 + Actor410: chain + Owner: Nod + Location: 89,72 + Actor407: nuk2 + Owner: Nod + Location: 91,31 + Actor408: nuk2 + Owner: Nod + Location: 72,51 + Actor411: nuk2 + Owner: Nod + Location: 52,72 + Actor412: nuk2 + Owner: Nod + Location: 50,72 + SouthWestObelisk3: obli + Owner: Nod + Location: 46,77 + Actor415: gun.nod + Owner: Nod + Location: 65,88 + Actor414: ltur + Owner: Nod + Location: 63,89 + Actor416: n1 + Owner: Nod + SubCell: 3 + Location: 21,59 + Facing: 1023 + Actor417: n1 + Owner: Nod + SubCell: 3 + Location: 28,56 + Facing: 158 + Actor418: n1 + Owner: Nod + SubCell: 3 + Facing: 1023 + Location: 35,53 + Actor419: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 78,32 + Actor420: n3 + Owner: Nod + SubCell: 3 + Location: 81,22 + Facing: 237 + Actor421: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 90,29 + Actor422: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 90,56 + Actor423: n3 + Owner: Nod + SubCell: 3 + Location: 86,69 + Facing: 650 + Actor424: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 78,83 + Actor425: n3 + Owner: Nod + Location: 66,92 + SubCell: 3 + Facing: 237 + Actor426: n3 + Owner: Nod + SubCell: 3 + Location: 56,76 + Facing: 0 + Actor427: n3 + Owner: Nod + SubCell: 3 + Location: 42,66 + Facing: 610 + Actor428: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 56,66 + Actor429: n3 + Owner: Nod + SubCell: 3 + Location: 54,44 + Facing: 71 + Actor430: n3 + Owner: Nod + SubCell: 3 + Location: 68,51 + Facing: 222 + Actor431: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 80,55 + Actor432: n3 + Owner: Nod + Facing: 384 + Location: 65,13 + SubCell: 3 + Actor435: bggy + Owner: Nod + Facing: 384 + Location: 61,13 + Actor436: ftnk + Owner: Nod + Facing: 384 + Location: 69,48 + Actor437: ftnk + Owner: Nod + Location: 80,60 + Facing: 245 + Actor438: stnk.nod + Owner: Nod + Location: 68,68 + Facing: 158 + Stance: Defend + Actor439: stnk.nod + Owner: Nod + Location: 67,72 + Facing: 158 + Stance: Defend + Actor440: mlrs + Owner: Nod + Location: 81,82 + Facing: 384 + Actor441: mlrs + Owner: Nod + Location: 79,65 + Facing: 245 + Actor442: mlrs + Owner: Nod + Location: 71,63 + Facing: 261 + Actor443: mlrs + Owner: Nod + Location: 70,76 + Facing: 150 + Actor444: ltnk + Owner: Nod + Location: 73,70 + Facing: 261 + LTPatroller1: ltnk + Owner: Nod + Location: 43,57 + Facing: 777 + LTPatroller2: ltnk + Owner: Nod + Location: 45,57 + Facing: 769 + Actor433: gun.nod + Owner: Nod + Location: 71,16 + TurretFacing: 364 + Actor434: n1 + Owner: Nod + SubCell: 3 + Location: 70,77 + Facing: 111 + Actor447: n1 + Owner: Nod + SubCell: 3 + Location: 70,75 + Facing: 71 + Actor448: n1 + Owner: Nod + SubCell: 3 + Location: 73,71 + Facing: 253 + Actor449: n1 + Owner: Nod + Location: 73,71 + SubCell: 1 + Facing: 229 + Actor450: n1 + Owner: Nod + Location: 73,69 + SubCell: 3 + Facing: 158 + Actor451: n1 + Owner: Nod + Location: 68,67 + SubCell: 3 + Facing: 174 + Actor452: n1 + Owner: Nod + Location: 68,72 + SubCell: 3 + Facing: 118 + Actor453: n1 + Owner: Nod + SubCell: 3 + Location: 67,73 + Facing: 134 + Actor454: n1 + Owner: Nod + SubCell: 3 + Location: 60,74 + Facing: 880 + Actor455: n1 + Owner: Nod + Facing: 384 + Location: 57,69 + SubCell: 3 + Actor456: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 44,66 + Actor457: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 47,78 + Actor458: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 52,79 + Actor459: n1 + Owner: Nod + Facing: 384 + Location: 47,78 + SubCell: 1 + Actor460: n1 + Owner: Nod + SubCell: 3 + Location: 36,74 + Facing: 285 + Actor461: n1 + Owner: Nod + Location: 37,68 + SubCell: 3 + Facing: 245 + Actor462: n1 + Owner: Nod + Location: 37,68 + SubCell: 1 + Facing: 118 + Actor463: n1 + Owner: Nod + SubCell: 3 + Location: 36,64 + Facing: 118 + Actor464: n1 + Owner: Nod + SubCell: 3 + Location: 51,55 + Facing: 586 + Actor465: nsam + Owner: Nod + Location: 49,51 + Actor466: n1 + Owner: Nod + SubCell: 3 + Location: 69,52 + Facing: 475 + Actor467: n1 + Owner: Nod + Facing: 384 + Location: 69,52 + SubCell: 1 + Actor468: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 65,44 + Actor469: n1 + Owner: Nod + Location: 81,55 + SubCell: 3 + Facing: 626 + Actor470: n1 + Owner: Nod + Facing: 384 + Location: 80,55 + SubCell: 1 + Actor471: n1 + Owner: Nod + SubCell: 3 + Location: 74,52 + Facing: 737 + Actor472: n1 + Owner: Nod + SubCell: 3 + Location: 76,46 + Facing: 642 + Actor473: n1 + Owner: Nod + Location: 73,47 + SubCell: 3 + Facing: 384 + Actor474: n1 + Owner: Nod + SubCell: 3 + Location: 82,48 + Facing: 793 + Actor475: n1 + Owner: Nod + SubCell: 3 + Location: 87,37 + Facing: 650 + Actor476: n1 + Owner: Nod + SubCell: 3 + Location: 85,37 + Facing: 507 + Actor477: n1 + Owner: Nod + Facing: 384 + Location: 85,37 + SubCell: 1 + Actor478: n1 + Owner: Nod + SubCell: 3 + Location: 92,38 + Facing: 222 + Actor479: n1 + Owner: Nod + SubCell: 3 + Location: 78,26 + Facing: 126 + Actor480: n1 + Owner: Nod + SubCell: 3 + Location: 72,16 + Facing: 222 + Actor481: n1 + Owner: Nod + Facing: 384 + Location: 72,16 + SubCell: 1 + Actor482: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 62,8 + Actor483: n1 + Owner: Nod + SubCell: 3 + Location: 66,6 + Facing: 499 + Actor484: n1 + Owner: Nod + SubCell: 3 + Location: 55,3 + Facing: 689 + Actor485: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 57,10 + Actor486: n1 + Owner: Nod + SubCell: 3 + Location: 63,14 + Facing: 475 + Actor487: n1 + Owner: Nod + SubCell: 3 + Location: 28,66 + Facing: 0 + Actor488: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 23,68 + Actor489: n1 + Owner: Nod + SubCell: 3 + Location: 18,66 + Facing: 864 + Actor490: n1 + Owner: Nod + SubCell: 3 + Location: 28,71 + Facing: 166 + Actor491: n1 + Owner: Nod + SubCell: 3 + Location: 42,48 + Facing: 71 + Actor492: n1 + Owner: Nod + SubCell: 3 + Location: 33,35 + Facing: 483 + Actor493: n1 + Owner: Nod + Facing: 384 + Location: 33,35 + SubCell: 1 + Actor495: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 83,12 + Actor496: n1 + Owner: Nod + SubCell: 3 + Location: 81,10 + Facing: 198 + Actor497: n1 + Owner: Nod + SubCell: 3 + Location: 84,10 + Facing: 555 + Actor498: n3 + Owner: Nod + Facing: 384 + Location: 84,10 + SubCell: 1 + Actor499: n4 + Owner: Nod + SubCell: 3 + Location: 84,12 + Facing: 547 + Actor500: n4 + Owner: Nod + SubCell: 3 + Location: 34,56 + Facing: 134 + Actor501: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 49,53 + Actor502: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 51,52 + Actor503: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 73,67 + Actor504: n4 + Owner: Nod + SubCell: 3 + Location: 75,82 + Facing: 103 + Actor505: n4 + Owner: Nod + SubCell: 3 + Location: 93,76 + Facing: 563 + Actor506: n4 + Owner: Nod + SubCell: 3 + Location: 93,63 + Facing: 229 + Actor507: n4 + Owner: Nod + SubCell: 3 + Location: 81,63 + Facing: 118 + Actor508: n4 + Owner: Nod + Location: 82,48 + SubCell: 1 + Facing: 634 + Actor509: n4 + Owner: Nod + Facing: 384 + Location: 92,38 + SubCell: 1 + Actor510: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 92,22 + Actor511: ss2 + Owner: Nod + Location: 45,88 + Facing: 245 + Actor512: ss2 + Owner: Nod + Location: 49,90 + Facing: 277 + Actor513: ss2 + Owner: Nod + Location: 54,91 + Facing: 277 + Actor514: ss2 + Owner: Nod + Location: 47,94 + Facing: 261 + Actor515: sb + Owner: Nod + Location: 15,94 + Facing: 111 + Actor516: sb + Owner: Nod + Location: 19,93 + Facing: 111 + Actor520: ss2 + Owner: Nod + Location: 16,83 + Facing: 142 + Actor523: ss2 + Owner: Nod + Location: 10,62 + Facing: 0 + Actor524: ss2 + Owner: Nod + Location: 2,58 + Facing: 0 + Actor525: ss2 + Owner: Nod + Location: 3,43 + Facing: 0 + Actor527: ss2 + Owner: Nod + Location: 9,46 + Facing: 0 + Actor528: sb + Owner: Nod + Location: 9,65 + Facing: 0 + Actor530: sb + Owner: Nod + Location: 9,55 + Facing: 0 + Actor531: ltnk + Owner: Nod + Location: 75,29 + Facing: 261 + Actor532: ltnk + Owner: Nod + Location: 77,37 + Facing: 380 + Actor533: ltnk + Owner: Nod + Location: 82,14 + Facing: 261 + Actor534: ltnk + Owner: Nod + Location: 34,69 + Facing: 103 + Actor535: ltnk + Owner: Nod + Location: 63,59 + Facing: 111 + Actor536: ltnk + Owner: Nod + Location: 61,60 + Facing: 118 + Actor537: ftnk + Owner: Nod + Location: 30,62 + Facing: 0 + Actor538: bggy + Owner: Nod + Location: 54,43 + Facing: 245 + Actor539: ltnk + Owner: Nod + Location: 77,88 + Facing: 134 + Actor540: ltnk + Owner: Nod + Location: 81,59 + Facing: 253 + Actor541: ltnk + Owner: Nod + Facing: 384 + Location: 59,45 + Actor542: ltnk + Owner: Nod + Location: 60,18 + Facing: 245 + Actor543: n1 + Owner: Nod + Location: 60,17 + SubCell: 3 + Facing: 222 + Actor544: n1 + Owner: Nod + SubCell: 3 + Location: 61,19 + Facing: 261 + Actor545: tc01 + Owner: Neutral + Location: 54,56 + Actor546: t08 + Owner: Neutral + Location: 58,35 + Actor547: t08 + Owner: Neutral + Location: 48,47 + Actor548: t09 + Owner: Neutral + Location: 19,53 + Actor549: t09 + Owner: Neutral + Location: 68,57 + Actor550: t04 + Owner: Neutral + Location: 63,40 + Actor551: t04 + Owner: Neutral + Location: 74,20 + Actor552: n3 + SubCell: 3 + Location: 79,70 + Faction: england + Facing: 594 + Owner: Nod + Actor553: n3 + Location: 79,70 + SubCell: 1 + Faction: england + Facing: 158 + Owner: Nod + Actor554: n3 + SubCell: 3 + Location: 84,76 + Faction: england + Facing: 384 + Owner: Nod + Actor555: n3 + Owner: Nod + SubCell: 3 + Location: 74,70 + Facing: 384 + Actor556: n3 + Owner: Nod + Location: 74,70 + SubCell: 1 + Facing: 261 + Actor557: rmbc + Owner: Nod + SubCell: 3 + Location: 90,72 + Facing: 0 + Actor558: rmbc + Owner: Nod + SubCell: 3 + Location: 92,77 + Facing: 491 + Actor559: rmbc + Owner: Nod + SubCell: 3 + Location: 93,70 + Facing: 87 + Actor560: rmbc + Owner: Nod + SubCell: 3 + Location: 90,75 + Facing: 384 + Actor561: rmbc + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 82,75 + Actor562: bh + Owner: Nod + SubCell: 3 + Location: 73,73 + Facing: 190 + Actor563: bh + Owner: Nod + SubCell: 3 + Location: 91,76 + Facing: 459 + Actor564: bh + Owner: Nod + SubCell: 3 + Location: 90,73 + Facing: 356 + Actor565: bh + Owner: Nod + SubCell: 3 + Location: 92,71 + Facing: 47 + Actor568: tplr + Owner: Nod + Location: 78,88 + SubCell: 1 + Facing: 126 + Actor569: tplr + Owner: Nod + Location: 77,89 + SubCell: 1 + Facing: 103 + Actor566: n1c + Owner: Nod + Location: 76,88 + SubCell: 3 + Facing: 126 + Actor567: n3c + Owner: Nod + SubCell: 3 + Location: 79,89 + Facing: 245 + Actor570: mlrs + Owner: Nod + Facing: 150 + Location: 40,66 + Actor571: mlrs + Owner: Nod + Facing: 261 + Location: 80,23 + Actor572: ltnk + Owner: Nod + Location: 83,50 + Facing: 0 + Actor573: ltnk + Owner: Nod + Location: 75,27 + Facing: 261 + Actor574: ltnk + Owner: Nod + Location: 21,52 + Facing: 0 + Actor576: bggy + Owner: Nod + Facing: 384 + Location: 54,30 + Actor577: bggy + Owner: Nod + Facing: 384 + Location: 52,32 + Actor578: bggy + Owner: Nod + Location: 41,48 + Facing: 0 + LeftAttack1: waypoint + Owner: Neutral + Location: 30,71 + LeftAttack2: waypoint + Owner: Neutral + Location: 20,44 + MiddleAttack1: waypoint + Owner: Neutral + Location: 48,59 + MiddleAttack3: waypoint + Owner: Neutral + Location: 36,37 + LTPatrol4: waypoint + Owner: Neutral + Location: 57,45 + RightAttack1: waypoint + Owner: Neutral + Location: 70,29 + RightAttack2: waypoint + Owner: Neutral + Location: 55,18 + LeftAttack3: waypoint + Owner: Neutral + Location: 18,28 + RightAttack3: waypoint + Owner: Neutral + Location: 36,15 + LTPatrol1: waypoint + Owner: Neutral + Location: 51,57 + LTPatrol2: waypoint + Owner: Neutral + Location: 53,59 + LTPatrol3: waypoint + Owner: Neutral + Location: 57,59 + MiddleAttack2: waypoint + Owner: Neutral + Location: 56,46 + LTPatrol5: waypoint + Owner: Neutral + Location: 51,43 + LTPatrol6: waypoint + Owner: Neutral + Location: 45,41 + LTPatrol7: waypoint + Owner: Neutral + Location: 35,37 + LTPatrol8: waypoint + Owner: Neutral + Location: 23,38 + LTPatrol9: waypoint + Owner: Neutral + Location: 21,42 + LTPatrol10: waypoint + Owner: Neutral + Location: 21,49 + LTPatrol11: waypoint + Owner: Neutral + Location: 24,50 + LTPatrol12: waypoint + Owner: Neutral + Location: 24,55 + LTPatrol13: waypoint + Owner: Neutral + Location: 40,56 + McvEntry: waypoint + Location: 11,1 + Faction: germany + Owner: Neutral + McvLanding: waypoint + Location: 15,9 + Faction: germany + Owner: Neutral + McvRally: waypoint + Location: 15,14 + Faction: germany + Owner: Neutral + EastPatrol3: waypoint + Owner: Neutral + Location: 61,40 + EastPatrol4: waypoint + Owner: Neutral + Location: 94,44 + EastPatrol2: waypoint + Owner: Neutral + Location: 70,34 + EastPatrol1: waypoint + Owner: Neutral + Location: 69,22 + EastPatroller2: n1 + Owner: Nod + SubCell: 3 + Location: 68,22 + Facing: 384 + EastPatroller3: n1 + Owner: Nod + Location: 68,22 + SubCell: 1 + Facing: 384 + EastPatroller5: n1 + Owner: Nod + Location: 69,21 + SubCell: 3 + Facing: 384 + EastPatroller6: n1 + Owner: Nod + Location: 68,20 + SubCell: 3 + Facing: 384 + EastPatroller1: n3 + Owner: Nod + SubCell: 3 + Location: 69,23 + Facing: 384 + EastPatroller4: n3 + Owner: Nod + Location: 68,21 + SubCell: 3 + Facing: 384 + EastPatroller7: n4 + Owner: Nod + SubCell: 3 + Location: 67,19 + Facing: 384 + SouthPatroller4: n5 + Owner: Nod + SubCell: 3 + Location: 64,85 + Facing: 384 + SouthPatroller3: n5 + Owner: Nod + SubCell: 3 + Location: 65,84 + Facing: 384 + SouthPatroller1: n5 + Owner: Nod + Location: 64,83 + SubCell: 3 + Facing: 384 + SouthPatroller2: n5 + Owner: Nod + Location: 65,84 + SubCell: 1 + Facing: 384 + SouthPatrol1: waypoint + Owner: Neutral + Location: 65,85 + SouthPatrol2: waypoint + Owner: Neutral + Location: 63,61 + NodNavalAttack1: waypoint + Owner: Neutral + Location: 41,91 + NodNavalAttack2: waypoint + Owner: Neutral + Location: 14,90 + NodNavalAttack3: waypoint + Owner: Neutral + Location: 4,75 + NodNavalAttack4: waypoint + Owner: Neutral + Location: 5,49 + NodNavalAttack5: waypoint + Owner: Neutral + Location: 3,29 + NodNavalAttack6: waypoint + Owner: Neutral + Location: 8,5 + Actor592: stnk.nod + Owner: Nod + Location: 76,59 + Facing: 384 + Stance: Defend + Actor593: stnk.nod + Owner: Nod + Location: 93,61 + Facing: 384 + Stance: Defend + Actor594: stnk.nod + Owner: Nod + Location: 91,87 + Facing: 384 + Stance: Defend + Actor595: stnk.nod + Owner: Nod + Location: 65,91 + Stance: Defend + Facing: 384 + Actor596: stnk.nod + Owner: Nod + Location: 54,76 + Facing: 384 + Stance: Defend + Actor597: stnk.nod + Owner: Nod + Location: 21,69 + Facing: 1023 + Stance: Defend + Actor598: hpad.td + Owner: Nod + Location: 74,9 + Actor599: hpad.td + Owner: Nod + Location: 16,64 + Actor600: tplr + Owner: Nod + SubCell: 1 + Facing: 126 + Location: 79,86 + Actor601: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 48,51 + Actor602: n3 + Owner: Nod + SubCell: 3 + Location: 35,57 + Facing: 0 + Actor603: n3 + Owner: Nod + SubCell: 3 + Location: 29,60 + Facing: 87 + Actor604: n3 + Owner: Nod + SubCell: 3 + Location: 18,64 + Facing: 0 + Actor605: n3 + Owner: Nod + SubCell: 3 + Location: 15,65 + Facing: 721 + Actor606: n3 + Owner: Nod + SubCell: 3 + Location: 63,47 + Facing: 103 + Actor607: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 61,49 + Actor608: n3 + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 61,32 + Actor609: n3 + Owner: Nod + Facing: 384 + Location: 51,9 + SubCell: 3 + Actor610: n3 + Owner: Nod + SubCell: 3 + Location: 73,12 + Facing: 222 + Actor611: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 75,13 + Actor612: n3 + Owner: Nod + SubCell: 3 + Location: 77,9 + Facing: 277 + Actor613: n3 + Owner: Nod + Facing: 384 + Location: 83,19 + SubCell: 3 + Actor614: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 82,35 + Actor615: n3 + Owner: Nod + Location: 94,35 + SubCell: 3 + Facing: 531 + Actor616: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 92,33 + Actor617: n3 + Owner: Nod + SubCell: 3 + Location: 71,60 + Facing: 118 + Actor618: n3 + Owner: Nod + SubCell: 3 + Location: 68,58 + Facing: 206 + Actor619: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 64,89 + Actor620: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 60,82 + Actor621: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 53,39 + Actor622: n3 + Owner: Nod + SubCell: 3 + Location: 55,31 + Facing: 214 + Actor623: camera + Owner: Nod + Location: 22,42 + Actor624: camera + Owner: Nod + Location: 33,15 + Actor625: camera + Owner: Nod + Location: 26,26 + Actor626: camera + Owner: Nod + Location: 15,19 + Actor627: camera + Owner: Nod + Location: 48,19 + Actor628: camera + Owner: Nod + Location: 41,41 + Actor629: camera + Owner: Nod + Location: 70,70 + Actor630: camera + Owner: Nod + Location: 64,51 + Actor631: mlrs + Owner: Nod + Location: 65,45 + Facing: 404 + Actor632: mlrs + Owner: Nod + Facing: 404 + Location: 80,34 + Actor325: nuk2 + Owner: Nod + Location: 93,87 + Actor326: nuk2 + Owner: Nod + Location: 93,84 + Actor327: nuk2 + Owner: Nod + Location: 93,81 + Actor633: nuke + Owner: Nod + Location: 93,94 + Actor634: split2 + Owner: Neutral + Location: 45,13 + Actor635: split2 + Owner: Neutral + Location: 49,33 + Actor636: split2 + Owner: Neutral + Location: 51,29 + EastBoundary: waypoint + Owner: Neutral + Location: 49,19 + Actor637: n1 + Owner: Nod + SubCell: 3 + Facing: 95 + Location: 48,22 + Actor638: n1 + Owner: Nod + SubCell: 3 + Location: 48,17 + Facing: 444 + Actor639: bggy + Owner: Nod + Facing: 911 + Location: 19,44 + EntranceReveal1: waypoint + Owner: Neutral + Location: 78,29 + EntranceReveal3: waypoint + Owner: Neutral + Location: 48,63 + EntranceReveal4: waypoint + Owner: Neutral + Location: 37,71 + EntranceReveal2: waypoint + Owner: Neutral + Location: 88,37 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-coalitions.yaml, ca|missions/main-campaign/ca06-machinations/machinations-rules.yaml, ca|rules/custom/coop-rules.yaml, machinations-coop-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/coop-campaign/ca07-conspiracy-coop/conspiracy-coop-rules.yaml b/mods/ca/missions/coop-campaign/ca07-conspiracy-coop/conspiracy-coop-rules.yaml new file mode 100644 index 0000000000..34487c9b84 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca07-conspiracy-coop/conspiracy-coop-rules.yaml @@ -0,0 +1,6 @@ +World: + LuaScript: + Scripts: campaign.lua, coop.lua, ca|missions/main-campaign/ca07-conspiracy/conspiracy.lua, conspiracy-coop.lua + LobbyMissionInfo@InitialObjectives: + Prefix: Initial Objectives + Text: • Take control of the GDI base.\n• Liberate the Nod researchers and bring them to the evac point. diff --git a/mods/ca/missions/coop-campaign/ca07-conspiracy-coop/conspiracy-coop.lua b/mods/ca/missions/coop-campaign/ca07-conspiracy-coop/conspiracy-coop.lua new file mode 100644 index 0000000000..ee54bd2a69 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca07-conspiracy-coop/conspiracy-coop.lua @@ -0,0 +1,47 @@ + +SetupPlayers = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Multi2 = Player.GetPlayer("Multi2") + Multi3 = Player.GetPlayer("Multi3") + Multi4 = Player.GetPlayer("Multi4") + Multi5 = Player.GetPlayer("Multi5") + Nod = Player.GetPlayer("Nod") + Greece = Player.GetPlayer("Greece") + GDI = Player.GetPlayer("GDI") + Legion = Player.GetPlayer("Legion") + EvacPlayer = Player.GetPlayer("Evac") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = Utils.Where({ Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 }, function(p) return p ~= nil end) + MissionEnemies = { Greece, GDI } + SinglePlayerPlayer = Nod + CoopInit() +end + +AfterWorldLoaded = function() + StartCashSpread(3500) +end + +AfterTick = function() + +end + +TransferLegionForces = function() + local legionActors = Legion.GetActors() + local legionForces = Utils.Where(legionActors, function(s) return s.HasProperty("Move") and not IsHarvester(s) end) + local firstActivePlayer = GetFirstActivePlayer() + + TransferBaseToPlayer(Legion, firstActivePlayer) + AssignToCoopPlayers(legionForces) + + local factoryExitCell = CPos.New(19, 47) + + Trigger.AfterDelay(DateTime.Seconds(3), function() + Utils.Do(GetMcvPlayers(), function(p) + if p ~= firstActivePlayer then + local mcv = Actor.Create("amcv", true, { Owner = p, Location = factoryExitCell }) + mcv.Scatter() + end + end) + end) +end diff --git a/mods/ca/missions/coop-campaign/ca07-conspiracy-coop/map.bin b/mods/ca/missions/coop-campaign/ca07-conspiracy-coop/map.bin new file mode 100644 index 0000000000..bdad38e34d Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca07-conspiracy-coop/map.bin differ diff --git a/mods/ca/missions/coop-campaign/ca07-conspiracy-coop/map.png b/mods/ca/missions/coop-campaign/ca07-conspiracy-coop/map.png new file mode 100644 index 0000000000..309f59c1f4 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca07-conspiracy-coop/map.png differ diff --git a/mods/ca/missions/coop-campaign/ca07-conspiracy-coop/map.yaml b/mods/ca/missions/coop-campaign/ca07-conspiracy-coop/map.yaml new file mode 100644 index 0000000000..83c69d66b0 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca07-conspiracy-coop/map.yaml @@ -0,0 +1,4025 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 07: Conspiracy Co-op + +Author: Darkademic & Gandorques Hikla + +Tileset: TEMPERAT + +MapSize: 98,98 + +Bounds: 1,1,96,96 + +Visibility: Lobby + +Categories: Co-op Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: Nod, Greece, GDI, Legion, Evac, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + PlayerReference@Nod: + Name: Nod + Faction: nod + Color: FE1100 + Allies: Evac, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Greece, GDI, Creeps + PlayerReference@Greece: + Name: Greece + Bot: campaign + Faction: allies + Color: 99ACF2 + Allies: GDI + Enemies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps, Evac + PlayerReference@GDI: + Name: GDI + Bot: campaign + Faction: gdi + Color: F2CF74 + Allies: Greece + Enemies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps, Evac + PlayerReference@Legion: + Name: Legion + Faction: legion + Color: F2CF74 + Enemies: Creeps + PlayerReference@Evac: + Name: Evac + Faction: legion + Color: E6E6FF + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Greece, GDI, Creeps + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: FE1100 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Evac + Enemies: Greece, GDI, Creeps + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: 0B7310 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Evac + Enemies: Greece, GDI, Creeps + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: 134691 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Evac + Enemies: Greece, GDI, Creeps + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: 775A12 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Evac + Enemies: Greece, GDI, Creeps + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: 82C900 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Evac + Enemies: Greece, GDI, Creeps + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: EEA8A8 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Evac + Enemies: Greece, GDI, Creeps + +Actors: + Actor0: t01 + Owner: Neutral + Location: 27,13 + Actor25: tc05 + Owner: Neutral + Faction: germany + Location: 13,7 + Actor26: tc04 + Owner: Neutral + Faction: germany + Location: 20,9 + Actor27: t16 + Owner: Neutral + Faction: germany + Location: 21,4 + Actor28: v01 + Owner: Neutral + Location: 19,5 + Actor29: v03 + Owner: Neutral + Location: 10,9 + Actor30: v05 + Owner: Neutral + Location: 20,15 + Actor31: v11 + Owner: Neutral + Location: 15,5 + Actor32: v04 + Owner: Neutral + Location: 24,10 + Actor33: t01 + Owner: Neutral + Location: 9,7 + Actor34: t02 + Owner: Neutral + Location: 26,9 + Actor35: t03 + Owner: Neutral + Location: 27,8 + Actor36: tc05 + Owner: Neutral + Location: 6,2 + Actor37: tc03 + Owner: Neutral + Location: 25,3 + Actor38: t14 + Owner: Neutral + Location: 25,1 + Actor39: t07 + Owner: Neutral + Location: 24,1 + Actor41: t06 + Owner: Neutral + Location: 11,4 + Actor42: t06 + Owner: Neutral + Location: 16,15 + Actor43: t13 + Owner: Neutral + Location: 18,19 + Actor44: t15 + Owner: Neutral + Location: 3,13 + Actor45: t14 + Owner: Neutral + Location: 1,4 + Actor46: t10 + Owner: Neutral + Location: 7,16 + Actor47: shad + Owner: Nod + SubCell: 3 + Facing: 512 + Location: 32,11 + Actor48: shad + Owner: Nod + SubCell: 3 + Facing: 512 + Location: 33,11 + Actor49: shad + Owner: Nod + SubCell: 3 + Location: 34,11 + Facing: 512 + Actor50: n3 + Owner: Nod + SubCell: 1 + Facing: 512 + Location: 31,5 + Actor51: n3 + Owner: Nod + SubCell: 4 + Facing: 512 + Location: 31,5 + Actor52: n3 + Owner: Nod + SubCell: 2 + Facing: 512 + Location: 31,5 + Actor53: n3 + Owner: Nod + SubCell: 5 + Facing: 512 + Location: 31,5 + Actor54: n1 + Owner: Nod + SubCell: 1 + Facing: 512 + Location: 33,5 + Actor55: n1 + Owner: Nod + SubCell: 4 + Facing: 512 + Location: 33,5 + Actor56: n1 + Owner: Nod + SubCell: 2 + Facing: 512 + Location: 33,5 + Actor57: n1 + Owner: Nod + SubCell: 5 + Facing: 512 + Location: 33,5 + Actor60: sapc + Owner: Nod + Facing: 512 + Location: 31,7 + Actor61: sapc + Owner: Nod + Facing: 512 + Location: 33,7 + Actor58: spec + Owner: Nod + Location: 32,3 + Facing: 523 + Actor59: brik + Owner: Greece + Location: 49,13 + Actor62: brik + Owner: Greece + Location: 49,12 + Actor63: brik + Owner: Greece + Location: 50,13 + Actor64: brik + Owner: Greece + Location: 50,12 + Actor65: brik + Owner: Greece + Location: 49,17 + Actor66: brik + Owner: Greece + Location: 49,18 + Actor67: brik + Owner: Greece + Location: 50,17 + Actor68: brik + Owner: Greece + Location: 50,18 + Actor69: brik + Owner: Greece + Location: 49,11 + Actor70: brik + Owner: Greece + Location: 49,10 + Actor71: brik + Owner: Greece + Location: 49,9 + Actor72: brik + Owner: Greece + Location: 49,8 + Actor73: brik + Owner: Greece + Location: 49,7 + Actor74: brik + Owner: Greece + Location: 49,6 + Actor75: brik + Owner: Greece + Location: 49,5 + Actor76: brik + Owner: Greece + Location: 49,4 + Actor77: brik + Owner: Greece + Location: 49,3 + Actor78: brik + Owner: Greece + Location: 49,2 + Actor79: brik + Owner: Greece + Location: 49,1 + Actor80: brik + Owner: Greece + Location: 50,1 + Actor81: brik + Owner: Greece + Location: 51,1 + Actor82: brik + Owner: Greece + Location: 52,1 + Actor83: brik + Owner: Greece + Location: 53,1 + Actor84: brik + Owner: Greece + Location: 49,19 + Actor85: brik + Owner: Greece + Location: 49,20 + Actor86: brik + Owner: Greece + Location: 49,21 + Actor87: brik + Owner: Greece + Location: 49,22 + Actor88: brik + Owner: Greece + Location: 50,22 + Actor89: brik + Owner: Greece + Location: 51,22 + Actor90: brik + Owner: Greece + Location: 52,22 + Actor91: brik + Owner: Greece + Location: 53,22 + Actor92: brik + Owner: Greece + Location: 54,22 + Actor93: brik + Owner: Greece + Location: 55,22 + Actor94: brik + Owner: Greece + Location: 57,22 + Actor95: brik + Owner: Greece + Location: 56,22 + Actor96: brik + Owner: Greece + Location: 57,21 + Actor97: brik + Owner: Greece + Location: 56,21 + Actor98: sbag + Owner: Greece + Location: 46,19 + Actor99: sbag + Owner: Greece + Location: 46,20 + Actor103: sbag + Owner: Greece + Location: 47,12 + Actor104: sbag + Owner: Greece + Location: 46,12 + Actor105: sbag + Owner: Greece + Location: 46,11 + Actor106: sbag + Owner: Greece + Location: 46,10 + Actor110: sbag + Owner: Greece + Location: 46,18 + Actor112: sbag + Owner: Greece + Location: 47,18 + Actor102: agun + Owner: Greece + Location: 50,21 + Actor113: pris + Owner: Greece + Location: 50,19 + Actor114: pris + Owner: Greece + Location: 50,11 + Actor115: arty + Owner: Greece + Location: 47,11 + Facing: 256 + Actor116: arty + Owner: Greece + Location: 47,19 + Facing: 256 + Actor117: sbag + Owner: Greece + Location: 47,20 + Actor118: sbag + Owner: Greece + Location: 47,10 + Actor100: split2 + Owner: Neutral + Location: 42,5 + Actor101: split3 + Owner: Neutral + Location: 43,8 + Actor107: tc02 + Owner: Neutral + Location: 25,26 + Actor108: t16 + Owner: Neutral + Location: 21,23 + Actor119: t15 + Owner: Neutral + Location: 28,23 + Actor120: t10 + Owner: Neutral + Location: 19,22 + Actor213: nuk2 + Owner: GDI + Location: 22,46 + Actor214: nuk2 + Owner: GDI + Location: 24,46 + AGT1: atwr + Location: 31,58 + Owner: GDI + Actor220: gtwr + Owner: GDI + Location: 12,51 + Actor223: gtwr + Owner: GDI + Location: 37,51 + Actor224: gtwr + Location: 25,60 + Owner: Legion + Actor225: gtwr + Owner: GDI + Location: 29,60 + Actor230: rep + Owner: GDI + Location: 21,51 + Actor215: nuk2 + Owner: Legion + Location: 26,46 + Actor218: afac + Owner: Legion + Location: 31,45 + Actor212: weap.td + Owner: Legion + Location: 18,46 + GDIBarracks: pyle + Location: 17,55 + Owner: GDI + Actor226: atwr + Owner: Legion + Location: 34,50 + Actor227: atwr + Owner: Legion + Location: 15,50 + Actor216: atwr + Location: 23,58 + Owner: Legion + Actor221: gtwr + Owner: Legion + Location: 12,55 + Actor222: gtwr + Owner: Legion + Location: 37,55 + GDICommsCenter: hq + Owner: GDI + Location: 28,46 + Actor186: brik + Owner: Legion + Location: 24,59 + Actor187: brik + Owner: Legion + Location: 24,58 + Actor200: brik + Owner: Legion + Location: 25,58 + Actor201: brik + Owner: Legion + Location: 25,59 + Actor202: brik + Owner: Legion + Location: 23,59 + Actor203: brik + Owner: Legion + Location: 13,55 + Actor204: brik + Owner: Legion + Location: 14,55 + Actor205: brik + Owner: Legion + Location: 13,56 + Actor206: brik + Owner: Legion + Location: 14,56 + Actor207: brik + Owner: Legion + Location: 13,57 + Actor208: brik + Owner: Legion + Location: 13,58 + Actor209: brik + Owner: Legion + Location: 13,59 + Actor210: brik + Owner: Legion + Location: 14,59 + Actor211: brik + Owner: Legion + Location: 15,59 + Actor231: brik + Owner: Legion + Location: 17,59 + Actor232: brik + Owner: Legion + Location: 16,59 + Actor233: brik + Owner: Legion + Location: 18,59 + Actor234: brik + Owner: Legion + Location: 19,59 + Actor235: brik + Owner: Legion + Location: 20,59 + Actor236: brik + Owner: Legion + Location: 21,59 + Actor237: brik + Owner: Legion + Location: 22,59 + Actor191: brik + Owner: Legion + Location: 29,58 + Actor192: brik + Owner: Legion + Location: 29,59 + Actor193: brik + Owner: Legion + Location: 30,59 + Actor194: brik + Owner: Legion + Location: 30,58 + Actor195: brik + Owner: Legion + Location: 31,59 + Actor196: brik + Owner: Legion + Location: 32,59 + Actor197: brik + Owner: Legion + Location: 33,59 + Actor198: brik + Owner: Legion + Location: 34,59 + Actor199: brik + Owner: Legion + Location: 35,59 + Actor238: brik + Owner: Legion + Location: 36,59 + Actor239: brik + Owner: Legion + Location: 36,55 + Actor240: brik + Owner: Legion + Location: 35,55 + Actor241: brik + Owner: Legion + Location: 35,56 + Actor242: brik + Owner: Legion + Location: 36,56 + Actor243: brik + Owner: Legion + Location: 36,57 + Actor244: brik + Owner: Legion + Location: 36,58 + Actor245: brik + Owner: Legion + Location: 35,51 + Actor246: brik + Owner: Legion + Location: 36,51 + Actor247: brik + Owner: Legion + Location: 36,50 + Actor248: brik + Owner: Legion + Location: 35,50 + Actor249: brik + Owner: Legion + Location: 35,49 + Actor250: brik + Owner: Legion + Location: 34,49 + Actor251: brik + Owner: Legion + Location: 34,48 + Actor252: brik + Owner: Legion + Location: 34,47 + Actor253: brik + Owner: Legion + Location: 34,46 + Actor172: brik + Owner: Legion + Location: 13,50 + Actor173: brik + Owner: Legion + Location: 13,51 + Actor174: brik + Owner: Legion + Location: 14,51 + Actor175: brik + Owner: Legion + Location: 14,50 + Actor176: brik + Owner: Legion + Location: 14,49 + Actor177: brik + Owner: Legion + Location: 15,49 + Actor178: brik + Owner: Legion + Location: 16,49 + Actor179: brik + Owner: Legion + Location: 16,48 + Actor180: brik + Owner: Legion + Location: 16,47 + Actor181: brik + Owner: Legion + Location: 17,47 + Actor182: brik + Owner: Legion + Location: 17,46 + Actor183: brik + Owner: Legion + Location: 17,45 + Actor184: brik + Owner: Legion + Location: 19,45 + Actor185: brik + Owner: Legion + Location: 18,45 + Actor188: brik + Owner: Legion + Location: 20,45 + Actor189: brik + Owner: Legion + Location: 21,45 + Actor190: brik + Owner: Legion + Location: 22,45 + Actor254: brik + Owner: Legion + Location: 23,45 + Actor255: brik + Owner: Legion + Location: 24,45 + Actor256: brik + Owner: Legion + Location: 25,45 + Actor257: brik + Owner: Legion + Location: 26,45 + Actor258: brik + Owner: Legion + Location: 27,45 + Actor259: brik + Owner: Legion + Location: 28,45 + Actor260: brik + Owner: Legion + Location: 29,45 + Actor261: brik + Owner: Legion + Location: 29,44 + Actor262: brik + Owner: Legion + Location: 30,44 + Actor263: brik + Owner: Legion + Location: 31,44 + Actor264: brik + Owner: Legion + Location: 32,44 + Actor265: brik + Owner: Legion + Location: 34,44 + Actor266: brik + Owner: Legion + Location: 33,44 + Actor267: brik + Owner: Legion + Location: 34,45 + Actor268: nuk2 + Owner: Legion + Location: 25,50 + Actor269: nuk2 + Owner: Legion + Location: 27,50 + Actor228: proc.td + Owner: Legion + Location: 30,52 + FreeActor: False + Actor270: mtnk + Owner: Legion + Facing: 384 + Location: 19,50 + Actor272: n1 + Owner: Legion + SubCell: 3 + Location: 20,51 + Facing: 539 + Actor275: n1 + Owner: Legion + SubCell: 3 + Location: 23,50 + Facing: 570 + Actor276: n1 + Owner: Legion + Facing: 384 + SubCell: 3 + Location: 31,49 + Actor277: n1 + Owner: Legion + Facing: 384 + SubCell: 3 + Location: 34,51 + Actor278: n3 + Owner: Legion + SubCell: 3 + Location: 21,50 + Facing: 745 + Actor279: n3 + Owner: Legion + SubCell: 3 + Location: 14,57 + Facing: 384 + Actor280: apc2 + Owner: Legion + Facing: 384 + Location: 22,49 + Actor281: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 26,60 + Actor282: n1 + Owner: GDI + Location: 36,54 + SubCell: 3 + Facing: 634 + Actor283: n1 + Owner: GDI + SubCell: 3 + Location: 38,52 + Facing: 785 + Actor284: n1 + Owner: GDI + SubCell: 3 + Location: 32,50 + Facing: 713 + Actor285: n1 + Owner: GDI + Location: 20,54 + SubCell: 1 + Facing: 341 + Actor274: n2 + Owner: GDI + SubCell: 3 + Location: 28,58 + Facing: 384 + Actor287: n2 + Owner: GDI + SubCell: 3 + Location: 20,58 + Facing: 975 + Actor288: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 30,61 + Actor289: n1 + Owner: Legion + Facing: 384 + SubCell: 3 + Location: 16,50 + Actor297: n1 + Owner: GDI + SubCell: 3 + Location: 35,32 + Facing: 0 + Actor299: n1 + Owner: GDI + SubCell: 3 + Location: 37,34 + Facing: 0 + Actor304: n1 + Owner: GDI + SubCell: 3 + Facing: 951 + Location: 10,26 + Actor305: n2 + Owner: GDI + SubCell: 1 + Location: 10,26 + Facing: 1023 + Actor306: n1 + Owner: GDI + SubCell: 3 + Location: 13,27 + Facing: 222 + Actor307: n1 + Owner: GDI + SubCell: 3 + Location: 12,28 + Facing: 111 + Actor292: proc + Owner: Greece + Location: 52,10 + AlliedNorthFactory: weap + Owner: Greece + Location: 54,16 + Actor296: apwr + Owner: Greece + Location: 50,2 + Actor301: apwr + Owner: Greece + Location: 53,2 + Actor302: apwr + Owner: Greece + Location: 56,2 + Actor309: brik + Owner: Greece + Location: 54,1 + Actor310: brik + Owner: Greece + Location: 55,1 + Actor311: brik + Owner: Greece + Location: 56,1 + Actor312: brik + Owner: Greece + Location: 57,1 + Actor313: brik + Owner: Greece + Location: 58,1 + Actor314: brik + Owner: Greece + Location: 59,1 + Actor315: brik + Owner: Greece + Location: 60,1 + Actor316: brik + Owner: Greece + Location: 61,1 + Actor317: brik + Owner: Greece + Location: 62,1 + Actor318: brik + Owner: Greece + Location: 63,1 + Actor319: brik + Owner: Greece + Location: 64,1 + AlliedNorthBarracks: tent + Owner: Greece + Location: 59,14 + Actor332: brik + Owner: Greece + Location: 64,12 + Actor333: brik + Owner: Greece + Location: 65,12 + Actor334: brik + Owner: Greece + Location: 64,13 + Actor335: brik + Owner: Greece + Location: 65,13 + Actor336: brik + Owner: Greece + Location: 65,14 + Actor337: brik + Owner: Greece + Location: 61,21 + Actor338: brik + Owner: Greece + Location: 61,22 + Actor339: brik + Owner: Greece + Location: 62,22 + Actor340: brik + Owner: Greece + Location: 62,21 + Actor341: brik + Owner: Greece + Location: 63,22 + Actor342: brik + Owner: Greece + Location: 64,22 + Actor343: brik + Owner: Greece + Location: 65,15 + Actor344: brik + Owner: Greece + Location: 65,16 + Actor345: brik + Owner: Greece + Location: 65,18 + Actor346: brik + Owner: Greece + Location: 65,17 + Actor347: brik + Owner: Greece + Location: 65,19 + Actor348: brik + Owner: Greece + Location: 65,20 + Actor349: brik + Owner: Greece + Location: 65,21 + Actor350: brik + Owner: Greece + Location: 65,22 + NorthGapGenerator: gap + Owner: Greece + Location: 59,19 + Actor353: pris + Owner: Greece + Location: 55,21 + Actor354: pris + Owner: Greece + Location: 63,21 + Actor355: pris + Owner: Greece + Location: 64,14 + Actor358: sbag + Owner: Greece + Location: 54,24 + Actor359: sbag + Owner: Greece + Location: 56,24 + Actor360: sbag + Owner: Greece + Location: 54,25 + Actor366: sbag + Owner: Greece + Location: 55,25 + Actor367: sbag + Owner: Greece + Location: 56,25 + Actor356: sbag + Owner: Greece + Location: 62,24 + Actor357: sbag + Owner: Greece + Location: 64,24 + Actor361: sbag + Owner: Greece + Location: 62,25 + Actor362: sbag + Owner: Greece + Location: 63,25 + Actor363: sbag + Owner: Greece + Location: 64,25 + Actor364: pbox + Owner: Greece + Location: 46,17 + Actor365: pbox + Owner: Greece + Location: 46,13 + Actor368: pbox + Owner: Greece + Location: 57,25 + Actor369: pbox + Owner: Greece + Location: 61,25 + Actor370: gun + Owner: Greece + Location: 48,23 + Actor371: silo + Owner: Greece + Location: 54,10 + Actor372: silo + Owner: Greece + Location: 52,10 + Actor373: agun + Owner: Greece + Location: 63,18 + Actor352: agun + Owner: Greece + Location: 54,6 + Actor374: fix + Owner: Greece + Location: 57,9 + Actor375: split2 + Owner: Neutral + Location: 16,68 + Actor376: split2 + Owner: Neutral + Location: 20,73 + GDIDefender2: htnk + Owner: GDI + Location: 10,56 + Facing: 128 + Actor379: tc05 + Owner: Neutral + Location: 1,69 + Actor381: tc01 + Owner: Neutral + Location: 1,72 + Actor382: t14 + Owner: Neutral + Location: 1,73 + Actor383: t07 + Owner: Neutral + Location: 1,74 + Actor384: t05 + Owner: Neutral + Location: 2,75 + Actor385: tc04 + Owner: Neutral + Location: 1,76 + Actor386: t02 + Owner: Neutral + Location: 2,68 + Actor387: t05 + Owner: Neutral + Location: 3,66 + Actor388: t11 + Owner: Neutral + Location: 9,71 + Actor390: t17 + Owner: Neutral + Location: 4,58 + Actor391: tc01 + Owner: Neutral + Location: 8,59 + Actor392: tc03 + Owner: Neutral + Location: 1,51 + Actor393: t14 + Owner: Neutral + Location: 1,49 + Actor394: t12 + Owner: Neutral + Location: 2,46 + Actor395: tc04 + Owner: Neutral + Location: 3,31 + Actor396: t16 + Owner: Neutral + Location: 1,34 + Actor397: tc02 + Owner: Neutral + Location: 2,33 + Actor398: tc02 + Owner: Neutral + Location: 13,33 + Actor399: tc01 + Owner: Neutral + Location: 4,37 + Actor401: t16 + Owner: Neutral + Location: 32,21 + Actor402: t06 + Owner: Neutral + Location: 40,22 + Actor403: t02 + Owner: Neutral + Location: 25,22 + Actor404: t01 + Owner: Neutral + Location: 6,20 + Actor405: tc01 + Owner: Neutral + Location: 12,22 + Actor407: t17 + Owner: Neutral + Location: 3,25 + Actor408: t17 + Owner: Neutral + Location: 42,37 + Actor409: t16 + Owner: Neutral + Location: 33,36 + Actor412: t02 + Owner: Neutral + Location: 43,39 + Actor413: t07 + Owner: Neutral + Location: 45,30 + Actor414: t15 + Owner: Neutral + Location: 42,23 + Actor416: v02 + Owner: Neutral + Location: 11,18 + Actor380: brik + Owner: Greece + Location: 70,82 + Actor418: brik + Owner: Greece + Location: 70,81 + Actor419: brik + Owner: Greece + Location: 71,81 + Actor420: brik + Owner: Greece + Location: 71,82 + Actor421: brik + Owner: Greece + Location: 70,80 + Actor422: brik + Owner: Greece + Location: 70,79 + Actor423: brik + Owner: Greece + Location: 70,78 + Actor424: brik + Owner: Greece + Location: 70,77 + Actor425: brik + Owner: Greece + Location: 70,76 + Actor426: brik + Owner: Greece + Location: 70,74 + Actor427: brik + Owner: Greece + Location: 70,75 + Actor428: brik + Owner: Greece + Location: 70,73 + Actor429: brik + Owner: Greece + Location: 70,72 + Actor430: brik + Owner: Greece + Location: 70,71 + Actor431: brik + Owner: Greece + Location: 70,70 + Actor432: brik + Owner: Greece + Location: 72,70 + Actor433: brik + Owner: Greece + Location: 71,70 + Actor434: brik + Owner: Greece + Location: 73,70 + Actor435: brik + Owner: Greece + Location: 74,70 + Actor436: brik + Owner: Greece + Location: 75,70 + Actor449: brik + Owner: Greece + Location: 87,70 + Actor450: brik + Owner: Greece + Location: 88,70 + Actor451: brik + Owner: Greece + Location: 89,70 + Actor452: brik + Owner: Greece + Location: 90,70 + Actor453: brik + Owner: Greece + Location: 91,70 + Actor454: brik + Owner: Greece + Location: 91,71 + Actor455: brik + Owner: Greece + Location: 70,86 + Actor456: brik + Owner: Greece + Location: 71,86 + Actor457: brik + Owner: Greece + Location: 70,87 + Actor458: brik + Owner: Greece + Location: 71,87 + Actor459: brik + Owner: Greece + Location: 70,88 + Actor460: brik + Owner: Greece + Location: 70,89 + Actor461: brik + Owner: Greece + Location: 70,90 + Actor462: brik + Owner: Greece + Location: 70,91 + Actor463: brik + Owner: Greece + Location: 70,92 + Actor464: brik + Owner: Greece + Location: 71,92 + Actor465: brik + Owner: Greece + Location: 71,91 + Actor466: arty + Owner: Greece + Location: 55,24 + Facing: 512 + Actor467: arty + Owner: Greece + Location: 63,24 + Facing: 512 + Actor468: brik + Owner: Greece + Location: 90,71 + AlliedSouthFactory: weap + Owner: Greece + Location: 74,80 + Actor478: atek + Owner: Greece + Location: 88,83 + Actor483: apwr + Owner: Greece + Location: 89,79 + SouthGapGenerator3: gap + Owner: Greece + Location: 87,81 + SouthGapGenerator1: gap + Owner: Greece + Location: 73,84 + SouthGapGenerator2: gap + Owner: Greece + Location: 82,73 + AlliedSouthBarracks: tent + Owner: Greece + Location: 73,75 + Actor477: silo + Owner: Greece + Location: 76,73 + Actor489: proc + Owner: Greece + Location: 76,73 + Actor490: silo + Owner: Greece + Location: 78,73 + Actor470: pris + Owner: Greece + Location: 71,80 + Actor488: pris + Owner: Greece + Location: 71,88 + Actor492: gun + Owner: Greece + Location: 69,80 + Actor493: gun + Owner: Greece + Location: 69,88 + Actor496: pbox + Owner: Greece + Location: 69,81 + Actor497: pbox + Owner: Greece + Location: 69,87 + Actor500: agun + Owner: Greece + Location: 72,72 + Actor502: agun + Owner: Greece + Location: 73,89 + TurretFacing: 832 + Actor480: hpad + Owner: Greece + Location: 80,82 + Actor481: hpad + Owner: Greece + Location: 83,82 + Actor505: chain + Owner: Greece + Location: 80,81 + Actor506: chain + Owner: Greece + Location: 81,81 + Actor507: chain + Owner: Greece + Location: 82,81 + Actor508: chain + Owner: Greece + Location: 83,81 + Actor509: chain + Owner: Greece + Location: 84,81 + Actor510: chain + Owner: Greece + Location: 85,81 + Actor511: chain + Owner: Greece + Location: 79,81 + Actor512: chain + Owner: Greece + Location: 79,82 + Actor513: chain + Owner: Greece + Location: 79,83 + Actor514: chain + Owner: Greece + Location: 79,84 + Actor515: chain + Owner: Greece + Location: 85,84 + Actor516: chain + Owner: Greece + Location: 85,83 + Actor517: chain + Owner: Greece + Location: 85,82 + Actor484: fix + Owner: Greece + Location: 81,77 + Actor518: apwr + Owner: Greece + Location: 89,76 + Actor519: apwr + Owner: Greece + Location: 89,73 + Actor479: dome + Owner: Greece + Location: 86,75 + Actor501: agun + Owner: Greece + Location: 87,73 + Actor520: split2 + Owner: Neutral + Location: 9,91 + Actor521: split2 + Owner: Neutral + Location: 16,92 + Actor523: split2 + Owner: Neutral + Location: 23,91 + Actor522: apwr + Owner: Greece + Location: 59,2 + Actor525: agun + Owner: Greece + Location: 60,6 + Actor526: sbag + Owner: Greece + Location: 56,49 + Actor527: sbag + Owner: Greece + Location: 56,48 + Actor528: sbag + Owner: Greece + Location: 56,47 + Actor529: sbag + Owner: Greece + Location: 56,46 + Actor530: sbag + Owner: Greece + Location: 56,45 + Actor531: sbag + Owner: Greece + Location: 56,44 + Actor532: sbag + Owner: Greece + Location: 56,43 + Actor533: sbag + Owner: Greece + Location: 57,43 + Actor534: sbag + Owner: Greece + Location: 58,43 + Actor535: sbag + Owner: Greece + Location: 59,43 + Actor536: sbag + Owner: Greece + Location: 60,43 + Actor537: sbag + Owner: Greece + Location: 61,43 + Actor538: sbag + Owner: Greece + Location: 62,43 + Actor539: sbag + Owner: Greece + Location: 63,43 + Actor540: sbag + Owner: Greece + Location: 64,43 + Actor541: sbag + Owner: Greece + Location: 65,43 + Actor542: sbag + Owner: Greece + Location: 66,43 + Actor543: sbag + Owner: Greece + Location: 67,43 + Actor544: sbag + Owner: Greece + Location: 68,43 + Actor545: sbag + Owner: Greece + Location: 69,43 + Actor546: sbag + Owner: Greece + Location: 70,43 + Actor547: sbag + Owner: Greece + Location: 70,44 + Actor548: sbag + Owner: Greece + Location: 70,45 + Actor549: sbag + Owner: Greece + Location: 70,46 + Actor550: sbag + Owner: Greece + Location: 70,47 + Actor551: sbag + Owner: Greece + Location: 70,51 + Actor552: sbag + Owner: Greece + Location: 70,52 + Actor553: sbag + Owner: Greece + Location: 56,53 + Actor554: sbag + Owner: Greece + Location: 56,54 + Actor555: sbag + Owner: Greece + Location: 57,55 + Actor556: sbag + Owner: Greece + Location: 56,55 + Actor557: sbag + Owner: Greece + Location: 58,55 + Actor558: sbag + Owner: Greece + Location: 59,55 + Actor559: sbag + Owner: Greece + Location: 60,55 + Actor560: sbag + Owner: Greece + Location: 61,55 + Actor564: sbag + Owner: Greece + Location: 65,55 + Actor565: sbag + Owner: Greece + Location: 66,55 + Actor566: sbag + Owner: Greece + Location: 67,55 + Actor567: sbag + Owner: Greece + Location: 68,55 + Actor568: sbag + Owner: Greece + Location: 69,55 + Actor569: sbag + Owner: Greece + Location: 70,55 + Actor570: sbag + Owner: Greece + Location: 70,54 + Actor571: sbag + Owner: Greece + Location: 70,53 + Actor575: gun + Owner: Greece + Location: 55,48 + Actor576: pbox + Owner: Greece + Location: 55,49 + Actor577: pbox + Owner: Greece + Location: 71,52 + Actor578: gun + Owner: Greece + Location: 71,51 + AlliedCenterFactory: weap + Owner: Greece + Location: 67,44 + Actor582: powr + Owner: Greece + Location: 68,52 + Actor583: powr + Owner: Greece + Location: 66,52 + Actor572: silo + Owner: Greece + Location: 62,49 + Actor584: proc + Owner: Greece + Location: 62,49 + Actor585: silo + Owner: Greece + Location: 64,49 + AlliedCenterBarracks: tent + Owner: Greece + Location: 58,52 + Actor574: sbag + Owner: Greece + Location: 59,44 + Actor580: sbag + Owner: Greece + Location: 62,44 + Actor581: sbag + Owner: Greece + Location: 65,44 + Actor586: powr + Owner: Greece + Location: 60,44 + Actor587: powr + Owner: Greece + Location: 57,44 + Actor588: powr + Owner: Greece + Location: 63,44 + Actor589: sbag + Owner: Greece + Location: 59,45 + Actor590: sbag + Owner: Greece + Location: 62,45 + Actor591: sbag + Owner: Greece + Location: 65,45 + Actor592: split2 + Owner: Neutral + Location: 71,18 + Actor593: split2 + Owner: Neutral + Location: 76,16 + Actor594: split2 + Owner: Neutral + Location: 61,62 + Actor595: split2 + Owner: Neutral + Location: 59,68 + Actor596: split2 + Owner: Neutral + Location: 90,63 + Actor597: split2 + Owner: Neutral + Location: 91,57 + Actor598: tc01 + Owner: Neutral + Location: 31,88 + Actor599: tc04 + Owner: Neutral + Location: 31,90 + Actor600: tc05 + Owner: Neutral + Location: 30,93 + Actor601: t16 + Owner: Neutral + Location: 30,91 + Actor602: t16 + Owner: Neutral + Location: 15,76 + Actor603: t02 + Owner: Neutral + Location: 30,75 + Actor604: t01 + Owner: Neutral + Location: 29,65 + Actor605: t16 + Owner: Neutral + Location: 35,73 + Actor606: t11 + Owner: Neutral + Location: 47,63 + Actor607: tc01 + Owner: Neutral + Location: 51,52 + Actor608: t16 + Owner: Neutral + Location: 54,58 + Actor609: tc04 + Owner: Neutral + Location: 48,58 + Actor611: t07 + Owner: Neutral + Location: 45,50 + Actor612: t14 + Owner: Neutral + Location: 42,59 + Actor613: t12 + Owner: Neutral + Location: 38,63 + Actor614: v05 + Owner: Neutral + Location: 75,47 + Actor615: v02 + Owner: Neutral + Location: 80,46 + Actor616: v03 + Owner: Neutral + Location: 89,48 + Actor617: v04 + Owner: Neutral + Location: 80,38 + Actor618: v01 + Owner: Neutral + Location: 83,34 + Actor619: v09 + Owner: Neutral + Location: 75,40 + Actor620: v06 + Owner: Neutral + Location: 84,44 + Actor621: v16 + Owner: Neutral + Location: 85,42 + Actor622: v16 + Owner: Neutral + Location: 86,42 + Actor623: v17 + Owner: Neutral + Location: 87,42 + Actor624: v16 + Owner: Neutral + Location: 87,39 + Actor625: v18 + Owner: Neutral + Location: 86,39 + Actor626: v07 + Owner: Neutral + Location: 76,35 + Actor627: wood + Owner: Neutral + Location: 84,42 + Actor628: wood + Owner: Neutral + Location: 84,41 + Actor629: wood + Owner: Neutral + Location: 85,41 + Actor630: wood + Owner: Neutral + Location: 86,41 + Actor631: wood + Owner: Neutral + Location: 87,41 + Actor632: wood + Owner: Neutral + Location: 88,41 + Actor633: wood + Owner: Neutral + Location: 88,42 + Actor634: wood + Owner: Neutral + Location: 88,43 + Actor635: wood + Owner: Neutral + Location: 87,43 + Actor636: wood + Owner: Neutral + Location: 86,38 + Actor637: wood + Owner: Neutral + Location: 87,38 + Actor638: wood + Owner: Neutral + Location: 88,38 + Actor639: wood + Owner: Neutral + Location: 88,39 + Actor640: wood + Owner: Neutral + Location: 85,38 + Actor641: wood + Owner: Neutral + Location: 86,44 + Actor642: wood + Owner: Neutral + Location: 86,45 + Actor643: wood + Owner: Neutral + Location: 87,44 + Actor644: wood + Owner: Neutral + Location: 86,46 + Actor645: wood + Owner: Neutral + Location: 85,46 + Actor646: wood + Owner: Neutral + Location: 89,47 + Actor647: wood + Owner: Neutral + Location: 90,47 + Actor648: wood + Owner: Neutral + Location: 91,47 + Actor649: wood + Owner: Neutral + Location: 92,48 + Actor650: wood + Owner: Neutral + Location: 92,47 + Actor651: wood + Owner: Neutral + Location: 73,39 + Actor652: wood + Owner: Neutral + Location: 73,40 + Actor653: wood + Owner: Neutral + Location: 73,41 + Actor654: wood + Owner: Neutral + Location: 73,42 + Actor655: wood + Owner: Neutral + Location: 74,42 + Actor656: wood + Owner: Neutral + Location: 75,42 + Actor657: wood + Owner: Neutral + Location: 75,43 + Actor658: wood + Owner: Neutral + Location: 73,35 + Actor659: wood + Owner: Neutral + Location: 73,34 + Actor660: wood + Owner: Neutral + Location: 74,34 + Actor661: wood + Owner: Neutral + Location: 75,34 + Actor662: wood + Owner: Neutral + Location: 87,34 + Actor663: wood + Owner: Neutral + Location: 87,35 + Actor664: t08 + Owner: Neutral + Location: 74,41 + Actor665: t03 + Owner: Neutral + Location: 89,40 + Actor666: t16 + Owner: Neutral + Location: 90,45 + Actor667: tc02 + Owner: Neutral + Location: 69,34 + Actor668: t06 + Owner: Neutral + Location: 73,32 + Actor669: t05 + Owner: Neutral + Location: 83,30 + Actor670: t02 + Owner: Neutral + Location: 92,23 + Actor671: tc04 + Owner: Neutral + Location: 93,28 + Actor672: t16 + Owner: Neutral + Location: 92,11 + Actor673: tc02 + Owner: Neutral + Location: 93,18 + Actor674: t11 + Owner: Neutral + Location: 94,15 + Actor675: t15 + Owner: Neutral + Location: 93,12 + Actor676: tc04 + Owner: Neutral + Location: 92,5 + Actor677: tc05 + Owner: Neutral + Location: 91,3 + Actor678: t11 + Owner: Neutral + Location: 94,2 + Actor679: t16 + Owner: Neutral + Location: 92,2 + Actor680: t02 + Owner: Neutral + Location: 90,1 + Actor681: t05 + Owner: Neutral + Location: 80,3 + Actor682: tc02 + Owner: Neutral + Location: 78,1 + Actor683: t10 + Owner: Neutral + Location: 81,1 + Actor684: t14 + Owner: Neutral + Location: 85,3 + Actor685: t17 + Owner: Neutral + Location: 87,5 + Actor686: t02 + Owner: Neutral + Location: 79,2 + Actor687: t01 + Owner: Neutral + Location: 80,2 + Actor689: t05 + Owner: Neutral + Location: 72,2 + Actor690: tc04 + Owner: Neutral + Location: 79,7 + Actor691: t16 + Owner: Neutral + Location: 75,8 + Actor692: t02 + Owner: Neutral + Location: 71,7 + Actor693: tc01 + Owner: Neutral + Location: 85,15 + Actor694: tc05 + Owner: Neutral + Location: 88,34 + Actor695: tc03 + Owner: Neutral + Location: 71,25 + Actor696: t07 + Owner: Neutral + Location: 69,27 + Actor697: t02 + Owner: Neutral + Location: 68,25 + Actor698: t05 + Owner: Neutral + Location: 77,23 + Actor699: t16 + Owner: Neutral + Location: 51,34 + Actor700: t06 + Owner: Neutral + Location: 55,86 + Actor701: tc02 + Owner: Neutral + Location: 50,89 + Actor702: t16 + Owner: Neutral + Location: 48,93 + Actor703: tc01 + Owner: Neutral + Location: 36,94 + Actor704: tc04 + Owner: Neutral + Location: 39,91 + Actor705: tc05 + Owner: Neutral + Location: 42,92 + Actor706: t10 + Owner: Neutral + Location: 43,90 + Actor707: t12 + Owner: Neutral + Location: 45,92 + Actor708: t05 + Owner: Neutral + Location: 46,93 + Actor709: t02 + Owner: Neutral + Location: 47,95 + Actor710: t12 + Owner: Neutral + Location: 52,92 + Actor711: t11 + Owner: Neutral + Location: 44,81 + Actor712: t02 + Owner: Neutral + Location: 54,74 + Actor713: t01 + Owner: Neutral + Location: 63,92 + Actor714: t10 + Owner: Neutral + Location: 65,90 + Actor715: tc01 + Owner: Neutral + Location: 64,89 + Actor716: tc04 + Owner: Neutral + Location: 63,75 + Actor717: t16 + Owner: Neutral + Location: 65,71 + Actor718: tc02 + Owner: Neutral + Location: 66,58 + Actor719: tc01 + Owner: Neutral + Location: 79,58 + Actor720: t16 + Owner: Neutral + Location: 78,59 + Actor721: t11 + Owner: Neutral + Location: 77,57 + Actor722: t11 + Owner: Neutral + Location: 69,41 + Actor723: t13 + Owner: Neutral + Location: 47,46 + Actor724: t06 + Owner: Neutral + Location: 48,47 + Actor725: t16 + Owner: Neutral + Location: 59,35 + Actor726: t06 + Owner: Neutral + Location: 57,36 + Actor728: t02 + Owner: Neutral + Location: 12,84 + Actor729: t05 + Owner: Neutral + Location: 28,83 + Actor730: t07 + Owner: Neutral + Location: 36,86 + Actor731: tc01 + Owner: Neutral + Location: 34,79 + Actor732: tc02 + Owner: Neutral + Location: 44,72 + Actor733: t11 + Owner: Neutral + Location: 45,70 + Actor734: sbag + Owner: Greece + Location: 65,54 + Actor735: sbag + Owner: Greece + Location: 61,54 + Actor736: 2tnk + Owner: Greece + Facing: 384 + Location: 54,52 + Actor737: 2tnk + Owner: Greece + Location: 47,15 + Facing: 256 + Actor738: 2tnk + Owner: Greece + Location: 59,28 + Facing: 507 + Actor739: mrj + Owner: Greece + Location: 52,20 + Facing: 384 + Actor740: mrj + Owner: Greece + Facing: 384 + Location: 73,73 + Actor741: mrj + Owner: Greece + Location: 93,82 + Facing: 384 + AlliedPatroller2: 1tnk + Owner: Greece + Location: 17,82 + Facing: 761 + AlliedPatroller1: 1tnk + Owner: Greece + Location: 19,82 + Facing: 753 + Actor744: 1tnk + Owner: Greece + Facing: 384 + Location: 53,47 + Actor745: 1tnk + Owner: Greece + Location: 56,38 + Facing: 111 + Actor746: jeep + Owner: Greece + Location: 47,68 + Facing: 166 + Actor747: apc.ai + Owner: Greece + Location: 46,22 + Facing: 245 + Actor748: arty + Owner: Greece + Location: 71,77 + Facing: 317 + Actor749: arty + Owner: Greece + Location: 71,90 + Facing: 214 + Actor754: mgg + Owner: Greece + Facing: 384 + Location: 60,51 + Actor755: ptnk + Owner: Greece + Location: 59,37 + Facing: 111 + Prism2: ptnk + Owner: Greece + Location: 65,75 + Facing: 384 + Prism1: ptnk + Owner: Greece + Location: 64,75 + Facing: 384 + Cryo1: cryo + Owner: Greece + Location: 71,76 + Facing: 325 + Cryo3: cryo + Owner: Greece + Location: 73,87 + Facing: 261 + Cryo5: cryo + Owner: Greece + Location: 57,47 + Facing: 384 + Cryo4: cryo + Owner: Greece + Location: 52,21 + Facing: 384 + Actor763: ifv + Owner: Greece + Facing: 384 + Location: 56,14 + Actor764: ifv + Owner: Greece + Facing: 384 + Location: 55,7 + Actor766: batf.ai + Owner: Greece + Location: 77,85 + Facing: 253 + Prism3: pcan + Owner: Greece + Location: 68,90 + Facing: 134 + Actor768: 2tnk + Owner: Greece + Location: 66,88 + Facing: 256 + Actor769: 2tnk + Owner: Greece + Location: 65,87 + Facing: 256 + Actor770: 2tnk + Owner: Greece + Location: 65,82 + Facing: 256 + Actor771: apc.ai + Owner: Greece + Location: 49,86 + Facing: 253 + Actor772: sbag + Owner: Greece + Location: 40,86 + Actor773: sbag + Owner: Greece + Location: 40,87 + Actor774: sbag + Owner: Greece + Location: 41,87 + Actor775: sbag + Owner: Greece + Location: 41,87 + Actor776: sbag + Owner: Greece + Location: 42,87 + Actor779: sbag + Owner: Greece + Location: 42,79 + Actor780: sbag + Owner: Greece + Location: 41,79 + Actor781: sbag + Owner: Greece + Location: 42,80 + Actor784: pbox + Owner: Greece + Location: 41,80 + Actor785: pbox + Owner: Greece + Location: 38,86 + Actor786: agun + Owner: Greece + Location: 41,86 + TurretFacing: 832 + Actor777: sbag + Owner: Greece + Location: 42,86 + Actor778: sbag + Owner: Greece + Location: 43,80 + Actor782: sbag + Owner: Greece + Location: 44,80 + Actor783: sbag + Owner: Greece + Location: 43,86 + Actor787: e1 + Owner: Greece + SubCell: 3 + Location: 66,89 + Facing: 261 + Actor788: e1 + Owner: Greece + SubCell: 3 + Location: 66,87 + Facing: 277 + Actor789: e1 + Owner: Greece + SubCell: 3 + Location: 66,81 + Facing: 301 + Actor790: e1 + Owner: Greece + Location: 66,81 + SubCell: 1 + Facing: 222 + Actor791: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 66,76 + Actor792: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 65,74 + Actor794: e1 + Owner: Greece + SubCell: 3 + Location: 74,86 + Facing: 166 + Actor795: e1 + Owner: Greece + SubCell: 3 + Location: 80,76 + Facing: 0 + Actor796: e1 + Owner: Greece + SubCell: 3 + Location: 84,74 + Facing: 658 + Actor797: e1 + Owner: Greece + Location: 84,74 + SubCell: 1 + Facing: 0 + Actor809: e1 + Owner: Greece + SubCell: 3 + Location: 71,53 + Facing: 682 + Actor810: e1 + Owner: Greece + Location: 71,53 + SubCell: 1 + Facing: 785 + Actor811: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 71,47 + Actor812: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 73,46 + Actor813: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 72,44 + Actor814: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 58,38 + Actor815: e1 + Owner: Greece + Facing: 384 + Location: 58,38 + SubCell: 1 + Actor816: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 60,37 + Actor817: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 54,38 + Actor818: e1 + Owner: Greece + Facing: 384 + Location: 54,39 + SubCell: 3 + Actor819: e1 + Owner: Greece + Location: 58,28 + SubCell: 3 + Facing: 507 + Actor820: e1 + Owner: Greece + Facing: 384 + Location: 58,28 + SubCell: 1 + Actor821: e1 + Owner: Greece + Location: 60,28 + SubCell: 3 + Facing: 634 + Actor822: e1 + Owner: Greece + SubCell: 3 + Location: 63,28 + Facing: 634 + Actor823: e1 + Owner: Greece + SubCell: 3 + Location: 48,24 + Facing: 634 + Actor824: e1 + Owner: Greece + Location: 46,23 + SubCell: 3 + Facing: 384 + Actor825: e1 + Owner: Greece + SubCell: 3 + Location: 45,21 + Facing: 301 + Actor826: e1 + Owner: Greece + SubCell: 3 + Location: 47,17 + Facing: 245 + Actor827: e1 + Owner: Greece + Location: 47,17 + SubCell: 1 + Facing: 206 + Actor828: e1 + Owner: Greece + Location: 48,18 + SubCell: 3 + Facing: 206 + Actor829: e1 + Owner: Greece + Location: 45,13 + SubCell: 3 + Facing: 229 + Actor830: e1 + Owner: Greece + Location: 45,12 + SubCell: 3 + Facing: 269 + Actor831: e1 + Owner: Greece + SubCell: 3 + Location: 65,26 + Facing: 602 + Actor832: e1 + Owner: Greece + SubCell: 3 + Location: 62,18 + Facing: 384 + Actor833: e1 + Owner: Greece + Location: 62,18 + SubCell: 1 + Facing: 293 + Actor834: e1 + Owner: Greece + SubCell: 3 + Location: 63,15 + Facing: 935 + Actor835: e1 + Owner: Greece + SubCell: 3 + Location: 56,13 + Facing: 523 + Actor836: e1 + Owner: Greece + Facing: 384 + Location: 56,13 + SubCell: 1 + Actor837: e1 + Owner: Greece + SubCell: 3 + Location: 56,7 + Facing: 650 + Actor838: e1 + Owner: Greece + Location: 57,6 + SubCell: 3 + Facing: 499 + Actor840: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 47,21 + Actor842: e1 + Owner: Greece + SubCell: 3 + Location: 80,41 + Facing: 761 + Actor843: e1 + Owner: Greece + SubCell: 3 + Location: 79,40 + Facing: 0 + Actor844: e1 + Owner: Greece + SubCell: 3 + Location: 79,36 + Facing: 245 + Actor845: e1 + Owner: Greece + SubCell: 3 + Location: 75,38 + Facing: 253 + Actor846: e1 + Owner: Greece + SubCell: 3 + Location: 85,37 + Facing: 0 + Actor848: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 86,48 + Actor849: e3 + Owner: Greece + Facing: 384 + Location: 58,38 + SubCell: 2 + Actor850: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 55,39 + Actor852: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 54,48 + Actor853: e3 + Owner: Greece + Facing: 384 + Location: 60,52 + SubCell: 3 + Actor854: e1 + Owner: Greece + SubCell: 3 + Facing: 384 + Location: 52,47 + Actor855: e1 + Owner: Greece + Facing: 384 + Location: 54,47 + SubCell: 3 + Actor856: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 51,45 + Actor857: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 55,54 + Actor858: e1 + Owner: Greece + Facing: 384 + Location: 54,54 + SubCell: 3 + Actor859: e1 + Owner: Greece + Facing: 384 + Location: 54,54 + SubCell: 1 + Actor860: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 49,68 + Actor861: e1 + Owner: Greece + Facing: 384 + Location: 46,69 + SubCell: 3 + Actor862: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 48,68 + Actor863: e1 + Owner: Greece + Location: 50,85 + SubCell: 3 + Facing: 237 + Actor864: e1 + Owner: Greece + Location: 50,85 + SubCell: 1 + Facing: 0 + Actor865: e1 + Owner: Greece + SubCell: 3 + Location: 46,86 + Facing: 237 + Actor866: e1 + Owner: Greece + SubCell: 3 + Location: 41,85 + Facing: 237 + Actor867: e1 + Owner: Greece + SubCell: 3 + Location: 39,85 + Facing: 87 + Actor868: e1 + Owner: Greece + Location: 39,87 + SubCell: 3 + Facing: 111 + Actor869: e1 + Owner: Greece + SubCell: 3 + Location: 37,87 + Facing: 0 + Actor870: e1 + Owner: Greece + SubCell: 3 + Location: 40,82 + Facing: 174 + Actor871: e1 + Owner: Greece + Facing: 384 + Location: 41,82 + SubCell: 3 + Actor872: e1 + Owner: Greece + Location: 40,81 + SubCell: 3 + Facing: 309 + Actor873: e1 + Owner: Greece + SubCell: 1 + Location: 40,82 + Facing: 150 + Actor874: e1 + Owner: Greece + SubCell: 3 + Location: 40,79 + Facing: 384 + Actor875: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 55,86 + Actor876: e1 + Owner: Greece + SubCell: 3 + Location: 50,88 + Facing: 0 + Actor877: e1 + Owner: Greece + SubCell: 3 + Location: 61,92 + Facing: 309 + Actor878: e1 + Owner: Greece + SubCell: 3 + Location: 60,86 + Facing: 253 + Actor879: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 52,64 + Actor880: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 51,66 + Actor881: e1 + Owner: Greece + SubCell: 3 + Location: 84,20 + Facing: 658 + Actor882: e1 + Owner: Greece + Facing: 384 + Location: 84,20 + SubCell: 1 + Actor884: e1 + Owner: Greece + Location: 82,21 + SubCell: 3 + Facing: 384 + Actor885: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 85,15 + Actor886: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 84,31 + Actor887: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 75,33 + Actor888: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 72,27 + Actor889: e1 + Owner: Greece + Location: 87,48 + SubCell: 3 + Facing: 467 + Actor890: e1 + Owner: Greece + SubCell: 3 + Location: 76,56 + Facing: 166 + Actor891: e1 + Owner: Greece + Location: 76,56 + SubCell: 1 + Facing: 0 + Actor892: e1 + Owner: Greece + SubCell: 3 + Location: 77,53 + Facing: 0 + Actor893: e1 + Owner: Greece + SubCell: 3 + Location: 73,60 + Facing: 0 + Actor894: e1 + Owner: Greece + SubCell: 3 + Location: 72,58 + Facing: 214 + Actor895: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 69,72 + Actor896: e1 + Owner: Greece + SubCell: 3 + Location: 81,86 + Facing: 388 + Actor897: e1 + Owner: Greece + Location: 81,86 + SubCell: 1 + Facing: 206 + Actor898: e1 + Owner: Greece + SubCell: 3 + Location: 86,86 + Facing: 384 + Actor899: e1 + Owner: Greece + SubCell: 3 + Location: 90,85 + Facing: 547 + Actor901: e1 + Owner: Greece + SubCell: 3 + Location: 51,91 + Facing: 626 + Actor902: e1 + Owner: Greece + SubCell: 3 + Location: 52,90 + Facing: 1023 + Actor903: e3 + Owner: Greece + Location: 52,90 + SubCell: 1 + Facing: 182 + Actor904: e3 + Owner: Greece + SubCell: 3 + Location: 43,87 + Facing: 721 + Actor905: e3 + Owner: Greece + Location: 43,87 + SubCell: 1 + Facing: 39 + Actor906: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 47,69 + Actor907: e3 + Owner: Greece + Facing: 384 + Location: 54,54 + SubCell: 2 + Actor908: e3 + Owner: Greece + Facing: 384 + Location: 63,28 + SubCell: 1 + Actor909: e3 + Owner: Greece + Facing: 384 + Location: 47,21 + SubCell: 1 + Actor910: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 47,13 + Actor911: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 50,8 + Actor912: e3 + Owner: Greece + Facing: 384 + Location: 57,6 + SubCell: 1 + Actor913: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 59,7 + Actor914: e3 + Owner: Greece + SubCell: 3 + Location: 62,14 + Facing: 769 + Actor915: e3 + Owner: Greece + Location: 82,21 + SubCell: 1 + Facing: 261 + Actor916: e3 + Owner: Greece + SubCell: 3 + Location: 85,18 + Facing: 650 + Actor917: e3 + Owner: Greece + Facing: 384 + Location: 80,41 + SubCell: 1 + Actor919: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 66,51 + Actor920: e3 + Owner: Greece + SubCell: 3 + Location: 74,73 + Facing: 0 + Actor923: e3 + Owner: Greece + SubCell: 3 + Location: 86,85 + Facing: 785 + Actor924: e3 + Owner: Greece + Location: 90,85 + SubCell: 1 + Facing: 384 + Actor925: e3 + Owner: Greece + SubCell: 3 + Location: 92,82 + Facing: 237 + Actor926: e3 + Owner: Greece + SubCell: 3 + Location: 72,91 + Facing: 150 + Actor927: e3 + Owner: Greece + SubCell: 3 + Location: 64,91 + Facing: 158 + Actor928: mech + Owner: Greece + Location: 74,86 + SubCell: 1 + Facing: 182 + Actor929: mech + Owner: Greece + SubCell: 3 + Location: 72,75 + Facing: 285 + Actor931: mech + Owner: Greece + Facing: 384 + Location: 84,84 + SubCell: 3 + Actor932: mech + Owner: Greece + SubCell: 3 + Location: 48,87 + Facing: 880 + Actor933: medi + Owner: Greece + Facing: 384 + SubCell: 1 + Location: 47,69 + Actor934: medi + Owner: Greece + Facing: 384 + Location: 55,47 + SubCell: 3 + Actor935: medi + Owner: Greece + Facing: 384 + Location: 55,39 + SubCell: 1 + Actor936: medi + Owner: Greece + SubCell: 3 + Location: 48,19 + Facing: 214 + Actor937: medi + Owner: Greece + SubCell: 3 + Location: 48,13 + Facing: 237 + Actor938: medi + Owner: Greece + Facing: 384 + Location: 62,14 + SubCell: 1 + Actor939: medi + Owner: Greece + SubCell: 3 + Location: 85,19 + Facing: 384 + Actor941: medi + Owner: Greece + Facing: 384 + Location: 55,53 + SubCell: 3 + Actor942: medi + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 41,83 + Actor943: medi + Owner: Greece + SubCell: 3 + Location: 67,81 + Facing: 277 + Actor944: medi + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 67,75 + Actor945: medi + Owner: Greece + Location: 81,76 + SubCell: 3 + Facing: 0 + Actor946: hosp + Owner: Greece + Location: 80,30 + Actor947: v10 + Owner: Greece + Location: 88,27 + Actor948: v08 + Owner: Greece + Location: 87,24 + Actor949: v12 + Owner: Greece + Location: 89,21 + Actor950: barl + Owner: Creeps + Location: 39,88 + Actor951: brl3 + Owner: Creeps + Location: 40,88 + Actor952: brl3 + Owner: Creeps + Location: 84,80 + Actor953: brl3 + Owner: Creeps + Location: 66,44 + Actor954: barl + Owner: Creeps + Location: 66,45 + Actor955: barl + Owner: Creeps + Location: 55,44 + Actor956: gun + Owner: Greece + Location: 67,12 + Actor957: gun + Owner: Greece + Location: 51,67 + Actor958: gun + Owner: Greece + Location: 37,88 + Actor959: gun + Owner: Greece + Location: 56,84 + Actor960: gun + Owner: Greece + Location: 58,36 + Actor961: sbag + Owner: Greece + Location: 46,30 + Actor962: sbag + Owner: Greece + Location: 46,31 + Actor963: sbag + Owner: Greece + Location: 47,31 + Actor964: sbag + Owner: Greece + Location: 46,29 + Actor965: sbag + Owner: Greece + Location: 47,32 + Actor966: agun + Owner: Greece + Location: 47,30 + TurretFacing: 832 + Actor967: agun + Owner: Greece + Location: 54,78 + TurretFacing: 832 + Actor969: sbag + Owner: Greece + Location: 53,77 + Actor970: sbag + Owner: Greece + Location: 54,77 + Actor971: sbag + Owner: Greece + Location: 53,78 + Actor972: sbag + Owner: Greece + Location: 53,79 + Actor973: sbag + Owner: Greece + Location: 54,79 + Actor968: hpad + Owner: Greece + Location: 91,39 + Actor974: hpad + Owner: Greece + Location: 93,39 + Actor975: sbag + Owner: Greece + Location: 90,38 + Actor976: sbag + Owner: Greece + Location: 90,39 + Actor977: sbag + Owner: Greece + Location: 90,40 + Actor978: sbag + Owner: Greece + Location: 90,41 + Actor979: sbag + Owner: Greece + Location: 91,38 + Actor980: sbag + Owner: Greece + Location: 92,38 + Actor981: sbag + Owner: Greece + Location: 93,38 + Actor982: sbag + Owner: Greece + Location: 94,38 + Actor983: sbag + Owner: Greece + Location: 95,38 + Actor984: sbag + Owner: Greece + Location: 95,39 + Actor985: sbag + Owner: Greece + Location: 95,40 + Actor986: sbag + Owner: Greece + Location: 95,41 + Actor987: sbag + Owner: Greece + Location: 95,42 + Actor988: sbag + Owner: Greece + Location: 90,42 + Actor989: sbag + Owner: Greece + Location: 91,42 + Actor990: sbag + Owner: Greece + Location: 94,42 + Actor991: pbox + Owner: Greece + Location: 92,44 + Actor992: agun + Owner: Greece + Location: 93,36 + Actor993: sbag + Owner: Greece + Location: 92,36 + Actor994: sbag + Owner: Greece + Location: 92,35 + Actor995: sbag + Owner: Greece + Location: 93,35 + Actor996: sbag + Owner: Greece + Location: 94,35 + Actor997: sbag + Owner: Greece + Location: 94,36 + Actor998: mech + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 57,48 + Actor999: n1 + Owner: GDI + SubCell: 3 + Location: 10,47 + Facing: 31 + Actor1000: n1 + Owner: GDI + Location: 11,46 + SubCell: 3 + Facing: 0 + Actor1001: n1 + Owner: GDI + SubCell: 3 + Location: 33,38 + Facing: 721 + Actor1002: n1 + Owner: GDI + Facing: 384 + Location: 33,38 + SubCell: 1 + Actor1003: n1 + Owner: GDI + SubCell: 3 + Location: 8,34 + Facing: 951 + Actor1004: n1 + Owner: GDI + SubCell: 3 + Location: 8,35 + Facing: 737 + Actor1005: n1 + Owner: GDI + Location: 8,35 + SubCell: 1 + Facing: 0 + Actor1006: n2 + Owner: GDI + SubCell: 3 + Location: 7,36 + Facing: 475 + Actor1007: n2 + Owner: GDI + SubCell: 3 + Location: 34,37 + Facing: 919 + Actor1008: n2 + Owner: GDI + SubCell: 3 + Location: 13,35 + Facing: 214 + Actor1010: n2 + Owner: GDI + Location: 10,47 + SubCell: 1 + Facing: 111 + Actor1011: n2 + Owner: GDI + SubCell: 3 + Location: 12,46 + Facing: 880 + Actor1009: htur + Owner: Greece + Location: 68,77 + TurretFacing: 277 + Actor1021: sbag + Owner: Greece + Location: 69,76 + Actor1022: sbag + Owner: Greece + Location: 68,76 + Actor1023: sbag + Owner: Greece + Location: 67,76 + Actor1024: sbag + Owner: Greece + Location: 67,77 + Actor1025: sbag + Owner: Greece + Location: 67,78 + Actor1026: sbag + Owner: Greece + Location: 67,79 + Actor1027: sbag + Owner: Greece + Location: 68,79 + Actor1028: sbag + Owner: Greece + Location: 69,79 + Actor1013: sbag + Owner: Greece + Location: 61,33 + Actor1014: sbag + Owner: Greece + Location: 61,32 + Actor1020: sbag + Owner: Greece + Location: 62,33 + Actor1032: sbag + Owner: Greece + Location: 61,31 + Actor1033: htur + Owner: Greece + Location: 62,31 + TurretFacing: 325 + Actor1034: sbag + Owner: Greece + Location: 63,33 + Actor1035: sbag + Owner: Greece + Location: 64,33 + Actor1036: sbag + Owner: Greece + Location: 64,32 + Actor1037: sbag + Owner: Greece + Location: 64,31 + Actor1038: sbag + Owner: Greece + Location: 61,30 + Actor1039: sbag + Owner: Greece + Location: 62,30 + Actor1040: sbag + Owner: Greece + Location: 63,30 + Actor1041: sbag + Owner: Greece + Location: 64,30 + Actor1042: mtnk + Owner: GDI + Location: 17,89 + Facing: 0 + Actor1043: hmmv + Owner: GDI + Location: 27,57 + Facing: 384 + Actor1044: hmmv + Owner: GDI + Location: 32,63 + Facing: 634 + Actor1045: n1 + Owner: GDI + SubCell: 3 + Facing: 384 + Location: 31,63 + Actor1046: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 33,66 + Actor1047: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 21,60 + Actor1048: n1 + Owner: GDI + SubCell: 3 + Location: 44,46 + Facing: 190 + Actor1049: n1 + Owner: GDI + SubCell: 3 + Location: 25,42 + Facing: 118 + Actor1050: n2 + Owner: GDI + SubCell: 3 + Location: 26,41 + Facing: 0 + Actor1051: brik + Owner: Greece + Location: 65,1 + Actor1052: brik + Owner: Greece + Location: 66,1 + Actor1053: brik + Owner: Greece + Location: 67,1 + Actor1054: brik + Owner: Greece + Location: 67,2 + Actor1055: brik + Owner: Greece + Location: 67,3 + Actor1056: brik + Owner: Greece + Location: 67,4 + Actor1057: brik + Owner: Greece + Location: 67,5 + Actor1058: brik + Owner: Greece + Location: 67,6 + Actor1059: brik + Owner: Greece + Location: 67,7 + Actor1060: brik + Owner: Greece + Location: 67,8 + Actor1061: brik + Owner: Greece + Location: 66,8 + Actor1062: brik + Owner: Greece + Location: 66,7 + Actor1063: chain + Owner: Greece + Location: 62,2 + Actor1064: chain + Owner: Greece + Location: 63,2 + Actor1065: chain + Owner: Greece + Location: 64,2 + Actor1066: chain + Owner: Greece + Location: 65,2 + Actor1067: chain + Owner: Greece + Location: 66,2 + Actor1068: chain + Owner: Greece + Location: 66,3 + Actor1069: chain + Owner: Greece + Location: 66,4 + Actor1070: chain + Owner: Greece + Location: 66,5 + Actor1071: chain + Owner: Greece + Location: 66,6 + Actor1072: chain + Owner: Greece + Location: 62,3 + Actor1073: chain + Owner: Greece + Location: 62,4 + Actor1074: chain + Owner: Greece + Location: 62,5 + Actor1075: chain + Owner: Greece + Location: 62,6 + Actor1076: chain + Owner: Greece + Location: 65,6 + Actor1077: chain + Owner: Greece + Location: 63,6 + Actor1078: chain + Owner: Greece + Location: 65,7 + Actor1079: chain + Owner: Greece + Location: 65,8 + Actor1080: chain + Owner: Greece + Location: 63,7 + Actor1081: chain + Owner: Greece + Location: 63,8 + Actor1082: chain + Owner: Greece + Location: 92,76 + Actor1083: chain + Owner: Greece + Location: 92,77 + Actor1084: chain + Owner: Greece + Location: 92,78 + Actor1085: chain + Owner: Greece + Location: 92,79 + Actor1086: chain + Owner: Greece + Location: 93,76 + Actor1087: chain + Owner: Greece + Location: 94,76 + Actor1088: chain + Owner: Greece + Location: 95,76 + Actor1089: chain + Owner: Greece + Location: 96,76 + Actor1090: chain + Owner: Greece + Location: 96,77 + Actor1091: chain + Owner: Greece + Location: 96,78 + Actor1092: chain + Owner: Greece + Location: 96,79 + Actor1093: chain + Owner: Greece + Location: 96,80 + Actor1094: chain + Owner: Greece + Location: 92,80 + Actor1095: chain + Owner: Greece + Location: 93,80 + Actor1096: chain + Owner: Greece + Location: 95,80 + Researcher2: moebius + Owner: Neutral + SubCell: 3 + Location: 94,77 + Facing: 384 + Researcher1: chan + Owner: Neutral + SubCell: 3 + Location: 64,3 + Facing: 384 + Actor1099: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 93,81 + Actor1100: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 95,81 + Actor1101: e1 + Owner: Greece + SubCell: 3 + Location: 95,77 + Facing: 384 + Actor1102: e1 + Owner: Greece + Facing: 384 + Location: 93,77 + SubCell: 3 + Actor1103: e1 + Owner: Greece + Facing: 384 + Location: 62,7 + SubCell: 3 + Actor1104: e1 + Owner: Greece + Facing: 384 + Location: 63,3 + SubCell: 3 + Actor1105: e1 + Owner: Greece + Location: 65,3 + SubCell: 3 + Facing: 384 + Actor1106: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 66,9 + Actor1107: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 62,9 + Actor1108: pbox + Owner: Greece + Location: 68,7 + Actor1109: apwr + Owner: Greece + Location: 50,5 + HardAndNormalOnlyPower: powr + Owner: Greece + Location: 61,10 + Actor1113: apwr + Owner: Greece + Location: 81,88 + Actor1114: apwr + Owner: Greece + Location: 84,88 + Actor1115: powr + Owner: Greece + Location: 87,87 + PlayerStart: waypoint + Owner: Neutral + Location: 33,9 + LeftBaseTrigger1: waypoint + Owner: Neutral + Location: 5,48 + LeftBaseTrigger2: waypoint + Owner: Neutral + Location: 6,48 + LeftBaseTrigger3: waypoint + Owner: Neutral + Location: 7,48 + LeftBaseTrigger4: waypoint + Owner: Neutral + Location: 8,48 + LeftBaseTrigger5: waypoint + Owner: Neutral + Location: 9,48 + LeftBaseTrigger6: waypoint + Owner: Neutral + Location: 10,48 + LeftBaseTrigger7: waypoint + Owner: Neutral + Location: 11,48 + RightBaseTrigger1: waypoint + Owner: Neutral + Location: 37,44 + RightBaseTrigger2: waypoint + Owner: Neutral + Location: 38,44 + RightBaseTrigger3: waypoint + Owner: Neutral + Location: 39,44 + RightBaseTrigger4: waypoint + Owner: Neutral + Location: 40,44 + RightBaseTrigger5: waypoint + Owner: Neutral + Location: 41,44 + RightBaseTrigger6: waypoint + Owner: Neutral + Location: 42,44 + RightBaseTrigger7: waypoint + Owner: Neutral + Location: 43,44 + Actor1117: tc01 + Owner: Neutral + Location: 22,29 + Actor1121: t02 + Owner: Neutral + Location: 27,34 + Actor1122: t01 + Owner: Neutral + Location: 19,32 + GDIHarvester: harv.td + Owner: GDI + Location: 23,73 + Facing: 384 + Actor1123: pbox + Owner: Greece + Location: 51,36 + EvacPoint: waypoint + Owner: Neutral + Location: 18,8 + EvacSpawn: waypoint + Owner: Neutral + Location: 21,1 + GDIDefender1: htnk + Owner: GDI + Location: 40,52 + Facing: 916 + GDIBaseCenter: waypoint + Owner: Neutral + Location: 25,53 + NorthAttack1: waypoint + Owner: Neutral + Location: 35,19 + EastAttack2: waypoint + Owner: Neutral + Location: 41,53 + NorthWestAttack1: waypoint + Owner: Neutral + Location: 6,23 + NorthWestAttack2: waypoint + Owner: Neutral + Location: 9,53 + SouthEastAttack1: waypoint + Owner: Neutral + Location: 41,62 + SouthAttack2: waypoint + Owner: Neutral + Location: 32,82 + SouthCentralAttack1: waypoint + Owner: Neutral + Location: 27,66 + EastAttack1: waypoint + Owner: Neutral + Location: 77,49 + BaseTriggerBackup: waypoint + Owner: Neutral + Location: 56,30 + Actor1097: mtnk + Owner: Legion + Location: 28,54 + Facing: 640 + Actor1098: n3 + Owner: Legion + Facing: 384 + SubCell: 3 + Location: 29,53 + Actor1116: n1 + Owner: Legion + SubCell: 3 + Location: 31,56 + Facing: 384 + Actor1124: powr + Owner: Greece + Location: 89,87 + HardOnlyPower: apwr + Owner: Greece + Location: 91,83 + SouthWestAttack1: waypoint + Owner: Neutral + Location: 6,73 + NorthEastAttack1: waypoint + Owner: Neutral + Location: 41,46 + SouthAttack1: waypoint + Owner: Neutral + Location: 53,84 + Actor1126: batf.ai + Owner: Greece + Location: 60,46 + Facing: 253 + Actor1129: atwr + Owner: GDI + Location: 31,30 + Actor1118: n2 + Owner: GDI + SubCell: 3 + Facing: 0 + Location: 34,33 + Actor1130: n1 + Owner: GDI + SubCell: 1 + Facing: 943 + Location: 34,33 + Actor1127: atwr + Owner: GDI + Location: 15,30 + Actor1128: t15 + Owner: Neutral + Location: 14,26 + GDIDefender5: mtnk + Owner: GDI + Facing: 0 + Location: 11,27 + Actor1132: n1 + Owner: GDI + SubCell: 3 + Facing: 1007 + Location: 8,33 + Actor1134: n1 + Owner: GDI + SubCell: 3 + Facing: 0 + Location: 38,42 + Actor1135: n2 + Owner: GDI + SubCell: 3 + Facing: 880 + Location: 39,42 + Actor1131: n1 + Owner: GDI + SubCell: 3 + Facing: 142 + Location: 34,31 + GDIDefender6: mtnk + Owner: GDI + Location: 35,30 + Facing: 0 + GDIDefender3: msam + Owner: GDI + Location: 16,36 + Facing: 128 + GDIDefender4: msam + Owner: GDI + Location: 30,36 + Facing: 864 + Actor1138: camera + Owner: Greece + Location: 34,53 + Actor1139: camera + Owner: Greece + Location: 27,58 + Actor1140: camera + Owner: Greece + Location: 14,53 + Actor1141: camera + Owner: Greece + Location: 28,80 + Actor1142: camera + Owner: Greece + Location: 11,77 + ChinookDrop2Landing: waypoint + Owner: Neutral + Location: 5,69 + ChinookDrop1Landing: waypoint + Owner: Neutral + Location: 52,61 + ChinookDrop3Landing: waypoint + Owner: Neutral + Location: 41,33 + ChinookDrop4Landing: waypoint + Owner: Neutral + Location: 19,30 + GDIReinforceSpawn: waypoint + Owner: Neutral + Location: 1,23 + GDIReinforceRally: waypoint + Owner: Neutral + Location: 8,23 + ChinookDrop3Spawn: waypoint + Owner: Neutral + Location: 46,1 + AlliedPatrol1: waypoint + Owner: Neutral + Location: 36,82 + AlliedPatrol2: waypoint + Owner: Neutral + Location: 10,80 + Actor1133: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 51,40 + Actor1143: e3 + Owner: Greece + Facing: 384 + SubCell: 1 + Location: 51,40 + Actor1144: n1 + Owner: Legion + Location: 20,51 + SubCell: 1 + Facing: 384 + Actor1145: n1 + Owner: Legion + SubCell: 3 + Location: 27,53 + Facing: 384 + Actor1146: n1 + Owner: Legion + Facing: 384 + Location: 27,53 + SubCell: 1 + Actor1147: n1 + Owner: Legion + Location: 17,53 + SubCell: 1 + Facing: 384 + Actor1148: n1 + Owner: Legion + SubCell: 3 + Location: 17,51 + Facing: 384 + Actor1149: n1 + Owner: Legion + SubCell: 3 + Location: 11,55 + Facing: 384 + Actor1150: n1 + Owner: GDI + SubCell: 3 + Location: 18,54 + Facing: 79 + Actor1151: n1 + Owner: GDI + SubCell: 3 + Location: 38,57 + Facing: 384 + Actor1152: n1 + Owner: GDI + SubCell: 3 + Location: 41,55 + Facing: 0 + Actor1153: n1 + Owner: GDI + SubCell: 3 + Facing: 31 + Location: 39,43 + Actor1154: n2 + Owner: GDI + SubCell: 1 + Facing: 111 + Location: 39,43 + Actor1136: n1 + Owner: GDI + SubCell: 3 + Location: 6,54 + Facing: 1007 + Actor1137: mtnk + Owner: Legion + Location: 7,58 + Facing: 904 + Actor1155: mtnk + Owner: Legion + Location: 39,57 + Facing: 0 + Actor1156: n3 + Owner: Legion + SubCell: 3 + Facing: 384 + Location: 40,57 + Actor1157: n3 + Owner: Legion + Facing: 384 + SubCell: 3 + Location: 43,56 + Actor1158: n1 + Owner: Legion + SubCell: 3 + Location: 39,56 + Facing: 0 + Actor1159: n1 + Owner: Legion + SubCell: 3 + Location: 44,54 + Facing: 174 + Actor1160: tc01 + Owner: Neutral + Location: 31,16 + Actor1161: e1 + Owner: Greece + SubCell: 3 + Facing: 253 + Location: 78,61 + Actor1162: ifv + Owner: Greece + Facing: 245 + Location: 77,62 + Actor1163: e1 + Owner: Greece + SubCell: 3 + Facing: 126 + Location: 76,63 + Actor1164: e1 + Owner: Greece + SubCell: 3 + Facing: 642 + Location: 78,63 + Actor1165: mech + Owner: Greece + SubCell: 1 + Facing: 71 + Location: 78,63 + Actor1166: e1 + Owner: Greece + SubCell: 3 + Facing: 198 + Location: 74,64 + Actor1167: 1tnk + Owner: Greece + Facing: 111 + Location: 75,64 + Actor1168: 1tnk + Owner: Greece + Facing: 111 + Location: 76,64 + Actor1169: e1 + Owner: Greece + SubCell: 3 + Facing: 31 + Location: 77,64 + Actor1170: sbag + Owner: Greece + Location: 71,67 + Actor1171: sbag + Owner: Greece + Location: 72,67 + Actor1172: sbag + Owner: Greece + Location: 73,67 + Actor1173: sbag + Owner: Greece + Location: 74,67 + Actor1174: sbag + Owner: Greece + Location: 71,68 + Actor1175: htur + Owner: Greece + TurretFacing: 95 + Location: 72,68 + Actor1176: sbag + Owner: Greece + Location: 74,68 + Actor1177: sbag + Owner: Greece + Location: 71,69 + Actor1178: sbag + Owner: Greece + Location: 74,69 + Actor1179: arty + Owner: Greece + Facing: 0 + Location: 74,71 + Actor1180: gun + Owner: Greece + Location: 76,69 + Actor1181: pbox + Owner: Greece + Location: 77,69 + Actor1182: brik + Owner: Greece + Location: 76,70 + Actor1183: brik + Owner: Greece + Location: 77,70 + Actor1184: brik + Owner: Greece + Location: 78,70 + Actor1185: pris + Owner: Greece + Location: 76,71 + Actor1186: brik + Owner: Greece + Location: 77,71 + Actor1187: brik + Owner: Greece + Location: 78,71 + Actor1188: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 84,68 + Actor1189: e1 + Owner: Greece + SubCell: 1 + Facing: 190 + TurretFacing: 967 + Location: 84,68 + Actor1190: pbox + Owner: Greece + Location: 83,69 + Actor1191: gun + Owner: Greece + Location: 84,69 + Actor1192: brik + Owner: Greece + Location: 82,70 + Actor1193: brik + Owner: Greece + Location: 83,70 + Actor1194: brik + Owner: Greece + Location: 84,70 + Actor1195: brik + Owner: Greece + Location: 85,70 + Actor1196: brik + Owner: Greece + Location: 86,70 + Actor1197: brik + Owner: Greece + Location: 82,71 + Actor1198: brik + Owner: Greece + Location: 83,71 + Actor1199: pris + Owner: Greece + Location: 84,71 + Actor1200: e3 + Owner: Greece + SubCell: 3 + Facing: 602 + Location: 83,76 + Actor1205: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 80,45 + Actor1206: medi + Owner: Greece + SubCell: 1 + Facing: 229 + Location: 80,45 + Actor1203: e1 + Owner: Greece + SubCell: 3 + Facing: 586 + Location: 76,45 + Cryo2: cryo + Owner: Greece + Location: 71,71 + Facing: 71 + Actor1202: e3 + Owner: Greece + SubCell: 3 + Location: 88,78 + Facing: 785 + Actor1204: e3 + Owner: Greece + SubCell: 3 + Location: 87,78 + Facing: 388 + SouthEastBaseCenter: waypoint + Owner: Neutral + Location: 80,78 + Actor1207: 1tnk + Owner: Greece + Facing: 111 + Location: 69,31 + Actor1208: 2tnk + Owner: Greece + Facing: 507 + Location: 58,21 + Actor1209: e1 + Owner: Greece + SubCell: 3 + Facing: 507 + Location: 58,19 + Actor1210: e1 + Owner: Greece + Facing: 384 + SubCell: 1 + Location: 58,19 + Actor1211: e1 + Owner: Greece + SubCell: 3 + Facing: 634 + Location: 64,20 + Actor1212: e3 + Owner: Greece + Facing: 384 + SubCell: 1 + Location: 64,20 + ExtraPower2: waypoint + Owner: Neutral + Location: 78,88 + ExtraPower1: waypoint + Owner: Neutral + Location: 75,88 + EntranceReveal5: waypoint + Owner: Neutral + Location: 46,15 + EntranceReveal4: waypoint + Owner: Neutral + Location: 55,51 + EntranceReveal2: waypoint + Owner: Neutral + Location: 69,84 + EntranceReveal1: waypoint + Owner: Neutral + Location: 40,83 + EntranceReveal3: waypoint + Owner: Neutral + Location: 80,69 + EntranceReveal6: waypoint + Owner: Neutral + Location: 59,25 + ChinookDrop2Spawn: waypoint + Owner: Neutral + Location: 96,87 + ChinookDrop2Mid: waypoint + Owner: Neutral + Location: 20,92 + ChinookDrop4Spawn: waypoint + Owner: Neutral + Location: 71,1 + ChinookDrop1Spawn: waypoint + Owner: Neutral + Location: 96,72 + Actor1120: agun + Owner: Greece + TurretFacing: 832 + Location: 95,92 + Actor1119: fact + Owner: Greece + Location: 92,86 + Actor1110: ifv + Owner: Greece + Location: 87,90 + Facing: 384 + Actor1111: ifv + Owner: Greece + Location: 91,89 + Facing: 531 + Actor1216: chain + Owner: Greece + Location: 91,93 + Actor1217: chain + Owner: Greece + Location: 90,93 + Actor1218: chain + Owner: Greece + Location: 92,93 + Actor1219: chain + Owner: Greece + Location: 92,92 + Actor1220: chain + Owner: Greece + Location: 92,91 + Actor1221: chain + Owner: Greece + Location: 92,90 + Actor1222: chain + Owner: Greece + Location: 91,90 + Actor1125: chain + Owner: Greece + Location: 90,90 + WeatherControl: weat + Owner: Greece + Location: 90,91 + Actor1112: e3 + Owner: Greece + Facing: 384 + Location: 88,90 + SubCell: 3 + Actor1223: e3 + Owner: Greece + Facing: 384 + Location: 89,94 + SubCell: 3 + Actor503: agun + Owner: Greece + Location: 68,95 + TurretFacing: 832 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-covenants.yaml, ca|missions/main-campaign/ca07-conspiracy/conspiracy-rules.yaml, ca|rules/custom/coop-rules.yaml, conspiracy-coop-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml, ca|missions/main-campaign/ca07-conspiracy/conspiracy-weapons.yaml diff --git a/mods/ca/missions/coop-campaign/ca08-subversion-coop/map.bin b/mods/ca/missions/coop-campaign/ca08-subversion-coop/map.bin new file mode 100644 index 0000000000..352aff6e23 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca08-subversion-coop/map.bin differ diff --git a/mods/ca/missions/coop-campaign/ca08-subversion-coop/map.png b/mods/ca/missions/coop-campaign/ca08-subversion-coop/map.png new file mode 100644 index 0000000000..934d4b34a8 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca08-subversion-coop/map.png differ diff --git a/mods/ca/missions/coop-campaign/ca08-subversion-coop/map.yaml b/mods/ca/missions/coop-campaign/ca08-subversion-coop/map.yaml new file mode 100644 index 0000000000..418cb549e0 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca08-subversion-coop/map.yaml @@ -0,0 +1,4429 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 08: Subversion Co-op + +Author: Darkademic & Gandorques Hikla + +Tileset: TEMPERAT + +MapSize: 114,82 + +Bounds: 1,1,112,80 + +Visibility: Lobby + +Categories: Co-op Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: Nod, Greece, GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + PlayerReference@Nod: + Name: Nod + Faction: nod + Color: FE1100 + Allies: Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Greece, GDI, Creeps + PlayerReference@Greece: + Name: Greece + Bot: campaign + Faction: allies + Color: 99ACF2 + Allies: GDI + Enemies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@GDI: + Name: GDI + Bot: campaign + Faction: gdi + Color: F2CF74 + Allies: Greece + Enemies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: FE1100 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Greece, GDI, Creeps + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: 0B7310 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Greece, GDI, Creeps + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: 134691 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Greece, GDI, Creeps + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: 775A12 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Greece, GDI, Creeps + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: 82C900 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Greece, GDI, Creeps + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: EEA8A8 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Greece, GDI, Creeps + +Actors: + Commando: rmbo + Owner: Nod + SubCell: 3 + Location: 9,72 + Facing: 0 + Actor3: gtwr + Owner: GDI + Location: 7,63 + Actor4: n1 + Owner: GDI + SubCell: 3 + Location: 7,60 + Facing: 658 + Actor5: n1 + Owner: GDI + SubCell: 3 + Location: 9,59 + Facing: 384 + Actor6: n1 + Owner: GDI + SubCell: 3 + Location: 6,61 + Facing: 618 + Actor7: n2 + Owner: GDI + Location: 9,59 + SubCell: 1 + Facing: 523 + Actor8: tc01 + Owner: Neutral + Location: 7,56 + Actor9: tc02 + Owner: Neutral + Location: 4,63 + Actor10: tc04 + Owner: Neutral + Location: 16,69 + Actor11: tc05 + Owner: Neutral + Location: 18,59 + Actor12: t05 + Owner: Neutral + Location: 15,58 + Actor13: t02 + Owner: Neutral + Location: 20,65 + Actor14: t06 + Owner: Neutral + Location: 12,76 + Actor15: t16 + Owner: Neutral + Location: 3,76 + Actor16: t14 + Owner: Neutral + Location: 13,73 + Actor17: t11 + Owner: Neutral + Location: 5,69 + Actor18: tc03 + Owner: Neutral + Location: 7,51 + Actor19: t02 + Owner: Neutral + Location: 7,49 + Actor20: t16 + Owner: Neutral + Location: 17,50 + Actor21: t06 + Owner: Neutral + Location: 13,41 + Actor22: t01 + Owner: Neutral + Location: 10,43 + Actor23: t01 + Owner: Neutral + Location: 30,64 + Actor24: t16 + Owner: Neutral + Location: 28,67 + Actor25: t07 + Owner: Neutral + Location: 34,67 + Actor26: tc05 + Owner: Neutral + Location: 22,78 + Actor27: tc04 + Owner: Neutral + Location: 27,74 + Actor28: t16 + Owner: Neutral + Location: 26,75 + Actor29: t07 + Owner: Neutral + Location: 25,77 + Actor30: t02 + Owner: Neutral + Location: 22,76 + Actor31: t14 + Owner: Neutral + Location: 23,73 + Actor32: t06 + Owner: Neutral + Location: 27,60 + Actor33: t16 + Owner: Neutral + Location: 24,58 + Actor34: t07 + Owner: Neutral + Location: 9,52 + Actor35: windmill + Owner: Neutral + Location: 25,53 + Hacker1: hack + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 7,73 + StealthTank1: stnk.nod + Owner: Nod + Facing: 0 + Location: 8,74 + StealthTank2: stnk.nod + Owner: Nod + Facing: 0 + Location: 10,74 + Actor42: sbag + Owner: GDI + Location: 8,33 + Actor43: sbag + Owner: GDI + Location: 8,34 + Actor44: sbag + Owner: GDI + Location: 8,30 + Actor45: sbag + Owner: GDI + Location: 8,31 + Actor46: sbag + Owner: GDI + Location: 8,29 + Actor47: sbag + Owner: GDI + Location: 8,28 + Actor48: sbag + Owner: GDI + Location: 8,27 + Actor49: sbag + Owner: GDI + Location: 8,35 + Actor62: sbag + Owner: GDI + Location: 1,35 + Actor63: sbag + Owner: GDI + Location: 1,34 + Actor64: sbag + Owner: GDI + Location: 1,33 + Actor65: sbag + Owner: GDI + Location: 1,32 + Actor66: sbag + Owner: GDI + Location: 1,31 + Actor67: sbag + Owner: GDI + Location: 1,30 + Actor68: sbag + Owner: GDI + Location: 1,29 + Actor69: sbag + Owner: GDI + Location: 1,28 + Actor70: sbag + Owner: GDI + Location: 1,27 + Actor71: sbag + Owner: GDI + Location: 7,27 + Actor72: sbag + Owner: GDI + Location: 6,27 + Actor73: sbag + Owner: GDI + Location: 5,27 + Actor74: sbag + Owner: GDI + Location: 4,27 + Actor75: sbag + Owner: GDI + Location: 3,27 + Actor76: sbag + Owner: GDI + Location: 2,27 + Actor77: rep + Owner: GDI + Location: 3,31 + Actor79: sbag + Owner: GDI + Location: 1,36 + Actor81: sbag + Owner: GDI + Location: 8,36 + Actor82: sbag + Owner: GDI + Location: 1,37 + Actor83: sbag + Owner: GDI + Location: 2,37 + Actor84: sbag + Owner: GDI + Location: 3,37 + Actor85: sbag + Owner: GDI + Location: 4,37 + Actor86: sbag + Owner: GDI + Location: 5,37 + Actor87: sbag + Owner: GDI + Location: 6,37 + Actor88: sbag + Owner: GDI + Location: 7,37 + Actor89: sbag + Owner: GDI + Location: 8,37 + Actor90: gtwr + Owner: GDI + Location: 9,34 + Actor91: gtwr + Owner: GDI + Location: 9,30 + Actor92: brl3 + Owner: GDI + Location: 2,36 + Actor93: brl3 + Owner: GDI + Location: 3,35 + Actor94: barl + Owner: GDI + Location: 2,35 + Actor95: barl + Owner: GDI + Location: 2,34 + Actor185: mtnk + Owner: GDI + Location: 37,71 + Facing: 245 + Actor186: mtnk + Owner: GDI + Location: 36,73 + Facing: 253 + Actor189: n1 + Owner: GDI + SubCell: 3 + Location: 36,74 + Facing: 237 + Actor190: n1 + Owner: GDI + Location: 36,74 + SubCell: 1 + Facing: 245 + Actor191: n1 + Owner: GDI + SubCell: 3 + Location: 37,70 + Facing: 384 + Actor193: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 37,74 + Actor125: brik + Owner: GDI + Location: 47,55 + Actor126: brik + Owner: GDI + Location: 63,55 + Actor127: brik + Owner: GDI + Location: 47,56 + Actor128: brik + Owner: GDI + Location: 63,56 + Actor129: brik + Owner: GDI + Location: 47,57 + Actor130: brik + Owner: GDI + Location: 63,57 + Actor131: brik + Owner: GDI + Location: 47,58 + Actor132: brik + Owner: GDI + Location: 63,58 + Actor133: brik + Owner: GDI + Location: 47,59 + Actor134: brik + Owner: GDI + Location: 63,59 + Actor135: brik + Owner: GDI + Location: 47,60 + Actor136: brik + Owner: GDI + Location: 48,60 + Actor137: brik + Owner: GDI + Location: 62,60 + Actor138: brik + Owner: GDI + Location: 63,60 + Actor139: brik + Owner: GDI + Location: 47,61 + Actor140: brik + Owner: GDI + Location: 48,61 + Actor141: brik + Owner: GDI + Location: 62,61 + Actor142: brik + Owner: GDI + Location: 63,61 + Actor143: brik + Owner: GDI + Location: 47,65 + Actor144: brik + Owner: GDI + Location: 48,65 + Actor145: brik + Owner: GDI + Location: 62,65 + Actor146: brik + Owner: GDI + Location: 63,65 + Actor147: brik + Owner: GDI + Location: 47,66 + Actor148: brik + Owner: GDI + Location: 48,66 + Actor149: brik + Owner: GDI + Location: 62,66 + Actor150: brik + Owner: GDI + Location: 63,66 + Actor151: brik + Owner: GDI + Location: 47,67 + Actor152: brik + Owner: GDI + Location: 63,67 + Actor153: brik + Owner: GDI + Location: 47,68 + Actor154: brik + Owner: GDI + Location: 63,68 + Actor155: brik + Owner: GDI + Location: 47,69 + Actor156: brik + Owner: GDI + Location: 63,69 + Actor157: brik + Owner: GDI + Location: 47,70 + Actor158: brik + Owner: GDI + Location: 63,70 + Actor159: brik + Owner: GDI + Location: 47,71 + Actor160: brik + Owner: GDI + Location: 63,71 + Actor161: brik + Owner: GDI + Location: 47,72 + Actor162: brik + Owner: GDI + Location: 48,72 + Actor163: brik + Owner: GDI + Location: 52,72 + Actor164: brik + Owner: GDI + Location: 53,72 + Actor165: brik + Owner: GDI + Location: 57,72 + Actor166: brik + Owner: GDI + Location: 58,72 + Actor167: brik + Owner: GDI + Location: 63,72 + Actor168: brik + Owner: GDI + Location: 47,73 + Actor169: brik + Owner: GDI + Location: 48,73 + Actor170: brik + Owner: GDI + Location: 49,73 + Actor171: brik + Owner: GDI + Location: 50,73 + Actor172: brik + Owner: GDI + Location: 51,73 + Actor173: brik + Owner: GDI + Location: 52,73 + Actor174: brik + Owner: GDI + Location: 53,73 + Actor175: brik + Owner: GDI + Location: 57,73 + Actor176: brik + Owner: GDI + Location: 58,73 + Actor177: brik + Owner: GDI + Location: 59,73 + Actor178: brik + Owner: GDI + Location: 60,73 + Actor179: brik + Owner: GDI + Location: 61,73 + Actor180: brik + Owner: GDI + Location: 62,73 + Actor181: brik + Owner: GDI + Location: 63,73 + Actor182: atwr + Owner: GDI + Location: 48,67 + Actor194: atwr + Owner: GDI + Location: 48,59 + Actor195: atwr + Owner: GDI + Location: 62,67 + Actor196: atwr + Owner: GDI + Location: 62,59 + Actor197: brik + Owner: GDI + Location: 47,49 + Actor198: brik + Owner: GDI + Location: 48,49 + Actor199: brik + Owner: GDI + Location: 49,49 + Actor200: brik + Owner: GDI + Location: 50,49 + Actor201: brik + Owner: GDI + Location: 51,49 + Actor202: brik + Owner: GDI + Location: 52,49 + Actor203: brik + Owner: GDI + Location: 53,49 + Actor204: brik + Owner: GDI + Location: 54,49 + Actor205: brik + Owner: GDI + Location: 55,49 + Actor206: brik + Owner: GDI + Location: 56,49 + Actor207: brik + Owner: GDI + Location: 57,49 + Actor208: brik + Owner: GDI + Location: 58,49 + Actor209: brik + Owner: GDI + Location: 59,49 + Actor210: brik + Owner: GDI + Location: 60,49 + Actor211: brik + Owner: GDI + Location: 61,49 + Actor212: brik + Owner: GDI + Location: 62,49 + Actor213: brik + Owner: GDI + Location: 63,49 + Actor214: brik + Owner: GDI + Location: 47,50 + Actor216: brik + Owner: GDI + Location: 63,50 + Actor217: brik + Owner: GDI + Location: 47,51 + Actor218: brik + Owner: GDI + Location: 63,51 + Actor219: brik + Owner: GDI + Location: 47,52 + Actor220: brik + Owner: GDI + Location: 63,52 + Actor221: brik + Owner: GDI + Location: 47,53 + Actor222: brik + Owner: GDI + Location: 63,53 + Actor223: brik + Owner: GDI + Location: 47,54 + Actor224: brik + Owner: GDI + Location: 63,54 + Actor215: afac + Owner: GDI + Location: 60,70 + Actor225: weap.td + Owner: GDI + Location: 54,61 + Actor226: rep + Owner: GDI + Location: 54,65 + Actor228: nuk2 + Owner: GDI + Location: 48,50 + Actor229: nuk2 + Owner: GDI + Location: 51,50 + Actor230: nuk2 + Owner: GDI + Location: 61,50 + Actor231: nuk2 + Owner: GDI + Location: 58,50 + Actor232: nuk2 + Owner: GDI + Location: 61,54 + Actor233: nuk2 + Owner: GDI + Location: 48,54 + Actor234: gtek + Owner: GDI + Location: 54,50 + Actor237: proc.td + Owner: GDI + Location: 50,67 + Actor238: atwr + Owner: GDI + Location: 51,72 + Actor239: atwr + Owner: GDI + Location: 59,72 + Actor240: gtwr + Owner: GDI + Location: 53,74 + Actor241: gtwr + Owner: GDI + Location: 57,74 + Actor242: gtwr + Owner: GDI + Location: 46,65 + Actor243: gtwr + Owner: GDI + Location: 46,61 + Actor244: gtwr + Owner: GDI + Location: 64,61 + Actor245: gtwr + Owner: GDI + Location: 64,65 + Actor246: cram + Owner: GDI + Location: 48,71 + Actor247: cram + Owner: GDI + Location: 59,68 + Actor248: cram + Owner: GDI + Location: 51,56 + Actor249: cram + Owner: GDI + Location: 59,60 + Actor235: hpad.td + Owner: GDI + Location: 54,55 + Actor236: hpad.td + Owner: GDI + Location: 57,55 + Actor250: chain + Owner: GDI + Location: 54,54 + Actor251: chain + Owner: GDI + Location: 53,54 + Actor252: chain + Owner: GDI + Location: 53,55 + Actor253: chain + Owner: GDI + Location: 53,56 + Actor254: chain + Owner: GDI + Location: 53,57 + Actor255: chain + Owner: GDI + Location: 59,57 + Actor256: chain + Owner: GDI + Location: 59,56 + Actor257: chain + Owner: GDI + Location: 59,55 + Actor258: chain + Owner: GDI + Location: 59,54 + Actor259: chain + Owner: GDI + Location: 58,54 + Actor260: chain + Owner: GDI + Location: 57,54 + Actor261: chain + Owner: GDI + Location: 56,54 + Actor262: chain + Owner: GDI + Location: 55,54 + Actor263: chain + Owner: GDI + Location: 53,58 + Actor264: chain + Owner: GDI + Location: 54,58 + Actor265: chain + Owner: GDI + Location: 59,58 + Actor266: chain + Owner: GDI + Location: 58,58 + Actor267: chain + Owner: GDI + Location: 55,58 + Actor268: chain + Owner: GDI + Location: 57,58 + Actor269: htnk + Owner: GDI + Location: 46,63 + Facing: 256 + Actor272: msam + Owner: GDI + Location: 48,69 + Facing: 111 + Actor273: msam + Owner: GDI + Location: 62,69 + Facing: 919 + Actor274: msam + Owner: GDI + Location: 60,65 + Facing: 761 + Actor275: msam + Owner: GDI + Location: 50,65 + Facing: 253 + Actor277: vulc + Owner: GDI + Facing: 384 + Location: 52,62 + Actor278: htnk + Owner: GDI + Location: 64,63 + Facing: 768 + Actor279: mtnk + Owner: GDI + Location: 45,67 + Facing: 118 + Actor280: mtnk + Owner: GDI + Location: 65,67 + Facing: 919 + Actor281: n1 + Owner: GDI + Location: 52,60 + SubCell: 3 + Facing: 697 + Actor282: n1 + Owner: GDI + Facing: 384 + SubCell: 1 + Location: 51,60 + Actor283: n1 + Owner: GDI + Location: 51,60 + SubCell: 2 + Facing: 816 + Actor284: n1 + Owner: GDI + SubCell: 3 + Location: 51,61 + Facing: 507 + Actor285: n1 + Owner: GDI + SubCell: 3 + Location: 59,61 + Facing: 467 + Actor286: n1 + Owner: GDI + SubCell: 3 + Location: 60,60 + Facing: 689 + Actor287: n1 + Owner: GDI + SubCell: 3 + Location: 65,65 + Facing: 721 + Actor288: n1 + Owner: GDI + Location: 64,66 + SubCell: 3 + Facing: 602 + Actor289: n1 + Owner: GDI + SubCell: 3 + Location: 60,66 + Facing: 674 + Actor290: n1 + Owner: GDI + Location: 59,65 + SubCell: 3 + Facing: 880 + Actor291: n1 + Owner: GDI + SubCell: 3 + Location: 51,65 + Facing: 103 + Actor292: n1 + Owner: GDI + SubCell: 3 + Location: 57,64 + Facing: 737 + Actor293: n1 + Owner: GDI + SubCell: 3 + Location: 54,69 + Facing: 586 + Actor294: n1 + Owner: GDI + Location: 54,69 + SubCell: 1 + Facing: 531 + Actor295: n1 + Owner: GDI + SubCell: 3 + Location: 53,68 + Facing: 626 + Actor296: n1 + Owner: GDI + SubCell: 3 + Location: 53,71 + Facing: 674 + Actor297: n1 + Owner: GDI + SubCell: 3 + Location: 49,65 + Facing: 384 + Actor298: n1 + Owner: GDI + SubCell: 3 + Location: 48,64 + Facing: 214 + Actor299: n1 + Owner: GDI + Location: 46,60 + SubCell: 3 + Facing: 174 + Actor300: n1 + Owner: GDI + Location: 46,60 + SubCell: 1 + Facing: 150 + Actor301: n1 + Owner: GDI + SubCell: 3 + Location: 45,61 + Facing: 111 + Actor302: n1 + Owner: GDI + SubCell: 3 + Location: 46,68 + Facing: 384 + Actor303: n1 + Owner: GDI + SubCell: 3 + Location: 46,67 + Facing: 150 + Actor304: n1 + Owner: GDI + Location: 46,67 + SubCell: 1 + Facing: 214 + Actor305: n1 + Owner: GDI + SubCell: 3 + Location: 65,68 + Facing: 753 + Actor306: n1 + Owner: GDI + SubCell: 3 + Location: 58,59 + Facing: 586 + Actor307: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 54,59 + Actor308: n1 + Owner: GDI + Location: 58,68 + SubCell: 3 + Facing: 594 + Actor309: n1 + Owner: GDI + SubCell: 3 + Location: 58,71 + Facing: 452 + Actor310: n1 + Owner: GDI + Facing: 384 + Location: 58,71 + SubCell: 1 + Actor311: n2 + Owner: GDI + Facing: 384 + Location: 51,61 + SubCell: 1 + Actor312: n2 + Owner: GDI + Location: 52,61 + SubCell: 3 + Facing: 658 + Actor313: n2 + Owner: GDI + Facing: 384 + Location: 49,60 + SubCell: 3 + Actor314: n2 + Owner: GDI + Facing: 384 + Location: 51,60 + SubCell: 3 + Actor315: n2 + Owner: GDI + Location: 65,65 + SubCell: 1 + Facing: 618 + Actor316: n2 + Owner: GDI + SubCell: 3 + Location: 46,59 + Facing: 253 + Actor317: n2 + Owner: GDI + SubCell: 3 + Location: 45,65 + Facing: 301 + Actor318: n2 + Owner: GDI + SubCell: 3 + Location: 54,70 + Facing: 523 + Actor319: n2 + Owner: GDI + Facing: 384 + Location: 58,68 + SubCell: 1 + Actor321: chain + Owner: GDI + Location: 28,42 + Actor322: chain + Owner: GDI + Location: 28,43 + Actor323: chain + Owner: GDI + Location: 28,44 + Actor324: chain + Owner: GDI + Location: 28,45 + Actor325: chain + Owner: GDI + Location: 28,46 + Actor326: chain + Owner: GDI + Location: 29,42 + Actor327: chain + Owner: GDI + Location: 30,42 + Actor335: chain + Owner: GDI + Location: 28,47 + Actor336: chain + Owner: GDI + Location: 29,47 + Actor328: chain + Owner: GDI + Location: 31,42 + Actor329: chain + Owner: GDI + Location: 32,42 + Actor330: chain + Owner: GDI + Location: 33,42 + Actor331: chain + Owner: GDI + Location: 33,43 + Hospital: hosp + Owner: GDI + Location: 30,44 + Actor332: chain + Owner: GDI + Location: 33,44 + Actor333: chain + Owner: GDI + Location: 33,45 + Actor334: chain + Owner: GDI + Location: 33,46 + Actor338: chain + Owner: GDI + Location: 32,47 + Actor337: chain + Owner: GDI + Location: 33,47 + Actor339: split2 + Owner: Neutral + Location: 57,78 + Actor340: split2 + Owner: Neutral + Location: 65,77 + Actor341: split2 + Owner: Neutral + Location: 69,73 + Actor342: brik + Owner: GDI + Location: 51,19 + Actor344: brik + Owner: GDI + Location: 50,19 + Actor345: brik + Owner: GDI + Location: 50,18 + Actor346: brik + Owner: GDI + Location: 49,18 + Actor347: brik + Owner: GDI + Location: 48,18 + Actor348: brik + Owner: GDI + Location: 48,17 + Actor349: brik + Owner: GDI + Location: 48,16 + Actor350: brik + Owner: GDI + Location: 48,15 + Actor351: brik + Owner: GDI + Location: 48,14 + Actor352: brik + Owner: GDI + Location: 47,14 + Actor353: brik + Owner: GDI + Location: 46,14 + Actor354: brik + Owner: GDI + Location: 45,14 + Actor355: brik + Owner: GDI + Location: 44,14 + Actor357: brik + Owner: GDI + Location: 43,13 + Actor358: brik + Owner: GDI + Location: 42,13 + Actor359: brik + Owner: GDI + Location: 41,13 + Actor360: brik + Owner: GDI + Location: 40,13 + Actor361: brik + Owner: GDI + Location: 40,12 + Actor362: brik + Owner: GDI + Location: 40,11 + Actor363: brik + Owner: GDI + Location: 40,10 + Actor364: brik + Owner: GDI + Location: 40,9 + Actor367: brik + Owner: GDI + Location: 40,8 + Actor368: brik + Owner: GDI + Location: 40,7 + Actor370: brik + Owner: GDI + Location: 40,6 + Actor371: brik + Owner: GDI + Location: 40,5 + Actor372: brik + Owner: GDI + Location: 40,4 + Actor373: brik + Owner: GDI + Location: 41,4 + Actor374: brik + Owner: GDI + Location: 42,4 + Actor377: brik + Owner: GDI + Location: 44,3 + Actor378: brik + Owner: GDI + Location: 45,3 + Actor379: brik + Owner: GDI + Location: 46,3 + Actor380: brik + Owner: GDI + Location: 47,3 + Actor381: brik + Owner: GDI + Location: 48,3 + Actor382: brik + Owner: GDI + Location: 49,3 + Actor385: brik + Owner: GDI + Location: 50,3 + Actor392: brik + Owner: GDI + Location: 57,22 + Actor393: brik + Owner: GDI + Location: 58,22 + Actor394: brik + Owner: GDI + Location: 59,22 + Actor395: brik + Owner: GDI + Location: 60,22 + Actor396: brik + Owner: GDI + Location: 61,22 + Actor397: brik + Owner: GDI + Location: 63,22 + Actor398: brik + Owner: GDI + Location: 62,22 + Actor400: brik + Owner: GDI + Location: 26,32 + Actor401: brik + Owner: GDI + Location: 27,32 + Actor402: brik + Owner: GDI + Location: 26,33 + Actor403: brik + Owner: GDI + Location: 27,33 + Actor404: brik + Owner: GDI + Location: 26,34 + Actor405: brik + Owner: GDI + Location: 26,35 + Actor406: brik + Owner: GDI + Location: 26,36 + Actor407: brik + Owner: GDI + Location: 26,37 + Actor408: brik + Owner: GDI + Location: 26,38 + Actor409: brik + Owner: GDI + Location: 26,39 + Actor411: brik + Owner: GDI + Location: 27,39 + Actor410: brik + Owner: GDI + Location: 27,38 + Actor412: brik + Owner: GDI + Location: 31,39 + Actor413: brik + Owner: GDI + Location: 30,39 + Actor414: brik + Owner: GDI + Location: 29,39 + Actor415: brik + Owner: GDI + Location: 28,39 + Actor416: brik + Owner: GDI + Location: 32,39 + Actor417: brik + Owner: GDI + Location: 32,38 + Actor419: brik + Owner: GDI + Location: 26,28 + Actor420: brik + Owner: GDI + Location: 27,28 + Actor421: brik + Owner: GDI + Location: 27,27 + Actor422: brik + Owner: GDI + Location: 26,27 + Actor423: brik + Owner: GDI + Location: 26,26 + Actor424: brik + Owner: GDI + Location: 26,25 + Actor425: brik + Owner: GDI + Location: 26,24 + Actor426: brik + Owner: GDI + Location: 26,23 + Actor427: brik + Owner: GDI + Location: 26,21 + Actor428: brik + Owner: GDI + Location: 26,22 + Actor429: brik + Owner: GDI + Location: 26,20 + Actor430: brik + Owner: GDI + Location: 27,20 + Actor431: brik + Owner: GDI + Location: 27,21 + Actor432: brik + Owner: GDI + Location: 28,20 + Actor433: brik + Owner: GDI + Location: 29,20 + Actor434: brik + Owner: GDI + Location: 30,20 + Actor435: brik + Owner: GDI + Location: 31,20 + Actor436: brik + Owner: GDI + Location: 32,20 + Actor437: brik + Owner: GDI + Location: 33,20 + Actor438: brik + Owner: GDI + Location: 34,20 + Actor439: brik + Owner: GDI + Location: 35,20 + Actor440: brik + Owner: GDI + Location: 36,20 + Actor441: brik + Owner: GDI + Location: 37,20 + Actor442: brik + Owner: GDI + Location: 38,20 + Actor443: brik + Owner: GDI + Location: 38,21 + Actor444: brik + Owner: GDI + Location: 37,21 + Actor445: memp + Owner: GDI + Location: 37,37 + Facing: 111 + Actor446: chain + Owner: GDI + Location: 39,34 + Actor447: chain + Owner: GDI + Location: 38,34 + Actor448: chain + Owner: GDI + Location: 34,34 + Actor454: chain + Owner: GDI + Location: 35,34 + Actor456: chain + Owner: GDI + Location: 34,39 + Actor457: chain + Owner: GDI + Location: 35,39 + Actor458: chain + Owner: GDI + Location: 36,39 + Actor459: chain + Owner: GDI + Location: 37,39 + Actor460: chain + Owner: GDI + Location: 38,39 + Actor461: chain + Owner: GDI + Location: 39,39 + Actor462: chain + Owner: GDI + Location: 39,35 + Actor463: chain + Owner: GDI + Location: 39,36 + Actor464: chain + Owner: GDI + Location: 39,37 + Actor465: chain + Owner: GDI + Location: 39,38 + Actor466: chain + Owner: GDI + Location: 34,35 + Actor467: chain + Owner: GDI + Location: 34,36 + Actor468: chain + Owner: GDI + Location: 34,37 + Actor469: chain + Owner: GDI + Location: 34,38 + Actor449: brik + Owner: GDI + Location: 33,38 + Actor450: brik + Owner: GDI + Location: 33,39 + Actor451: hq + Owner: GDI + Location: 29,35 + Actor452: atwr + Owner: GDI + Location: 27,26 + Actor453: atwr + Owner: GDI + Location: 27,34 + Actor455: gtwr + Owner: GDI + Location: 25,32 + Actor470: gtwr + Owner: GDI + Location: 25,28 + Actor471: weap.td + Owner: GDI + Location: 29,26 + Actor477: afld.gdi + Owner: GDI + Location: 34,27 + Actor478: afld.gdi + Owner: GDI + Location: 34,30 + Actor480: msam + Owner: GDI + Facing: 634 + Location: 58,62 + Actor481: n1 + Owner: GDI + SubCell: 3 + Location: 60,53 + Facing: 634 + Actor482: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 57,52 + Actor483: n1 + Owner: GDI + SubCell: 3 + Location: 60,51 + Facing: 269 + Actor485: brik + Owner: GDI + Location: 64,22 + Actor486: brik + Owner: GDI + Location: 65,22 + Actor487: brik + Owner: GDI + Location: 66,22 + Actor488: brik + Owner: GDI + Location: 67,22 + Actor489: brik + Owner: GDI + Location: 67,21 + Actor490: brik + Owner: GDI + Location: 66,21 + Actor491: brik + Owner: GDI + Location: 71,21 + Actor492: brik + Owner: GDI + Location: 71,22 + Actor493: brik + Owner: GDI + Location: 72,22 + Actor494: brik + Owner: GDI + Location: 72,21 + Actor495: brik + Owner: GDI + Location: 73,22 + Actor496: brik + Owner: GDI + Location: 74,22 + Actor497: brik + Owner: GDI + Location: 74,21 + Actor498: brik + Owner: GDI + Location: 74,20 + Actor499: brik + Owner: GDI + Location: 74,19 + Actor500: brik + Owner: GDI + Location: 74,18 + Actor501: brik + Owner: GDI + Location: 74,16 + Actor502: brik + Owner: GDI + Location: 74,17 + Actor503: brik + Owner: GDI + Location: 74,15 + Actor515: brik + Owner: GDI + Location: 66,12 + Actor516: brik + Owner: GDI + Location: 66,11 + Actor517: brik + Owner: GDI + Location: 66,10 + Actor505: brik + Owner: GDI + Location: 66,13 + Actor506: brik + Owner: GDI + Location: 67,13 + Actor507: brik + Owner: GDI + Location: 68,13 + Actor508: brik + Owner: GDI + Location: 69,13 + Actor509: brik + Owner: GDI + Location: 70,13 + Actor510: brik + Owner: GDI + Location: 71,13 + Actor511: brik + Owner: GDI + Location: 72,13 + Actor512: brik + Owner: GDI + Location: 73,13 + Actor513: brik + Owner: GDI + Location: 74,13 + Actor519: brik + Owner: GDI + Location: 74,14 + Actor521: brik + Owner: GDI + Location: 55,10 + Actor522: brik + Owner: GDI + Location: 57,10 + Actor523: brik + Owner: GDI + Location: 56,10 + Actor524: brik + Owner: GDI + Location: 59,10 + Actor525: brik + Owner: GDI + Location: 58,10 + Actor526: brik + Owner: GDI + Location: 60,10 + Actor527: brik + Owner: GDI + Location: 61,10 + Actor528: brik + Owner: GDI + Location: 62,10 + Actor529: brik + Owner: GDI + Location: 63,10 + Actor530: brik + Owner: GDI + Location: 54,10 + Actor531: brik + Owner: GDI + Location: 54,9 + Actor532: brik + Owner: GDI + Location: 54,8 + Actor534: brik + Owner: GDI + Location: 53,7 + Actor535: brik + Owner: GDI + Location: 53,6 + Actor536: brik + Owner: GDI + Location: 53,5 + Actor537: brik + Owner: GDI + Location: 53,4 + Actor538: brik + Owner: GDI + Location: 52,4 + Actor539: brik + Owner: GDI + Location: 52,3 + Actor540: brik + Owner: GDI + Location: 51,3 + Actor533: brik + Owner: GDI + Location: 53,8 + Actor541: brik + Owner: GDI + Location: 44,13 + Actor542: atwr + Owner: GDI + Location: 65,21 + Actor543: atwr + Owner: GDI + Location: 73,21 + Actor544: gtwr + Owner: GDI + Location: 67,23 + Actor545: gtwr + Owner: GDI + Location: 71,23 + Actor547: chain + Owner: GDI + Location: 41,12 + Actor548: chain + Owner: GDI + Location: 41,11 + Actor549: chain + Owner: GDI + Location: 41,10 + Actor550: chain + Owner: GDI + Location: 41,9 + Actor551: chain + Owner: GDI + Location: 41,8 + Actor552: chain + Owner: GDI + Location: 41,7 + Actor553: chain + Owner: GDI + Location: 41,6 + Actor554: chain + Owner: GDI + Location: 41,5 + Actor555: chain + Owner: GDI + Location: 43,5 + Actor556: chain + Owner: GDI + Location: 42,5 + Actor559: chain + Owner: GDI + Location: 45,4 + Actor560: chain + Owner: GDI + Location: 46,4 + Actor561: chain + Owner: GDI + Location: 47,4 + Actor562: chain + Owner: GDI + Location: 48,4 + Actor566: chain + Owner: GDI + Location: 42,12 + Actor567: chain + Owner: GDI + Location: 43,12 + Actor568: chain + Owner: GDI + Location: 44,12 + Actor569: chain + Owner: GDI + Location: 45,12 + Actor570: chain + Owner: GDI + Location: 45,13 + Actor571: chain + Owner: GDI + Location: 46,13 + Actor572: chain + Owner: GDI + Location: 48,5 + Actor573: chain + Owner: GDI + Location: 48,6 + Actor574: chain + Owner: GDI + Location: 48,7 + Actor575: chain + Owner: GDI + Location: 47,13 + Actor576: chain + Owner: GDI + Location: 48,13 + Actor577: chain + Owner: GDI + Location: 48,12 + Actor578: chain + Owner: GDI + Location: 48,11 + Actor579: chain + Owner: GDI + Location: 48,10 + Actor563: cram + Owner: GDI + Location: 42,11 + Actor564: cram + Owner: GDI + Location: 47,5 + Actor565: cram + Owner: GDI + Location: 42,6 + Actor580: cram + Owner: GDI + Location: 47,12 + TurretFacing: 832 + Actor581: brik + Owner: GDI + Location: 44,4 + Actor582: brik + Owner: GDI + Location: 43,4 + Actor557: chain + Owner: GDI + Location: 45,5 + Actor558: chain + Owner: GDI + Location: 44,5 + IonControl: eye + Owner: GDI + Location: 44,7 + Actor583: brik + Owner: Greece + Location: 96,40 + Actor584: brik + Owner: Greece + Location: 97,40 + Actor585: brik + Owner: Greece + Location: 96,39 + Actor586: brik + Owner: Greece + Location: 97,39 + Actor587: brik + Owner: Greece + Location: 96,38 + Actor588: brik + Owner: Greece + Location: 96,37 + Actor589: brik + Owner: Greece + Location: 97,37 + Actor590: brik + Owner: Greece + Location: 97,36 + Actor591: brik + Owner: Greece + Location: 97,35 + Actor592: brik + Owner: Greece + Location: 96,36 + Actor593: brik + Owner: Greece + Location: 97,34 + Actor594: brik + Owner: Greece + Location: 97,33 + Actor595: brik + Owner: Greece + Location: 97,31 + Actor596: brik + Owner: Greece + Location: 97,32 + Actor597: brik + Owner: Greece + Location: 98,31 + Actor598: brik + Owner: Greece + Location: 99,31 + Actor599: brik + Owner: Greece + Location: 100,31 + Actor600: brik + Owner: Greece + Location: 101,31 + Actor601: brik + Owner: Greece + Location: 101,30 + Actor602: brik + Owner: Greece + Location: 102,30 + Actor603: brik + Owner: Greece + Location: 102,30 + Actor604: brik + Owner: Greece + Location: 103,30 + Actor605: brik + Owner: Greece + Location: 104,30 + Actor606: brik + Owner: Greece + Location: 105,30 + Actor607: brik + Owner: Greece + Location: 105,29 + Actor608: brik + Owner: Greece + Location: 105,28 + Actor609: brik + Owner: Greece + Location: 106,28 + Actor610: brik + Owner: Greece + Location: 107,28 + Actor611: brik + Owner: Greece + Location: 108,28 + Actor612: brik + Owner: Greece + Location: 109,28 + Actor613: brik + Owner: Greece + Location: 109,29 + Actor614: brik + Owner: Greece + Location: 110,29 + Actor615: brik + Owner: Greece + Location: 111,29 + Actor616: brik + Owner: Greece + Location: 112,29 + Actor617: brik + Owner: Greece + Location: 112,30 + Actor618: brik + Owner: Greece + Location: 96,44 + Actor619: brik + Owner: Greece + Location: 97,44 + Actor620: brik + Owner: Greece + Location: 96,45 + Actor621: brik + Owner: Greece + Location: 97,45 + Actor622: brik + Owner: Greece + Location: 95,45 + Actor623: brik + Owner: Greece + Location: 94,45 + Actor624: brik + Owner: Greece + Location: 94,46 + Actor625: brik + Owner: Greece + Location: 94,47 + Actor626: brik + Owner: Greece + Location: 94,48 + Actor627: brik + Owner: Greece + Location: 94,49 + Actor628: brik + Owner: Greece + Location: 94,50 + Actor629: brik + Owner: Greece + Location: 94,51 + Actor630: brik + Owner: Greece + Location: 94,52 + Actor631: brik + Owner: Greece + Location: 94,54 + Actor632: brik + Owner: Greece + Location: 94,53 + Actor633: brik + Owner: Greece + Location: 94,55 + Actor634: brik + Owner: Greece + Location: 94,57 + Actor635: brik + Owner: Greece + Location: 94,56 + Actor636: brik + Owner: Greece + Location: 94,58 + Actor637: brik + Owner: Greece + Location: 94,59 + Actor638: brik + Owner: Greece + Location: 94,60 + Actor639: brik + Owner: Greece + Location: 95,60 + Actor640: brik + Owner: Greece + Location: 96,60 + Actor641: brik + Owner: Greece + Location: 98,60 + Actor642: brik + Owner: Greece + Location: 97,60 + Actor643: brik + Owner: Greece + Location: 99,60 + Actor644: brik + Owner: Greece + Location: 99,59 + Actor645: brik + Owner: Greece + Location: 98,59 + Actor646: brik + Owner: Greece + Location: 103,59 + Actor647: brik + Owner: Greece + Location: 103,60 + Actor648: brik + Owner: Greece + Location: 104,59 + Actor649: brik + Owner: Greece + Location: 104,60 + Actor650: brik + Owner: Greece + Location: 105,60 + Actor651: brik + Owner: Greece + Location: 106,60 + Actor652: brik + Owner: Greece + Location: 107,60 + Actor653: brik + Owner: Greece + Location: 108,60 + Actor654: brik + Owner: Greece + Location: 109,60 + Actor655: brik + Owner: Greece + Location: 111,60 + Actor656: brik + Owner: Greece + Location: 112,60 + Actor657: brik + Owner: Greece + Location: 110,60 + Actor658: brik + Owner: Greece + Location: 112,31 + Actor659: brik + Owner: Greece + Location: 112,32 + Actor660: brik + Owner: Greece + Location: 112,34 + Actor661: brik + Owner: Greece + Location: 112,59 + Actor662: brik + Owner: Greece + Location: 112,57 + Actor663: brik + Owner: Greece + Location: 112,58 + Actor664: brik + Owner: Greece + Location: 112,56 + Actor665: brik + Owner: Greece + Location: 112,55 + Actor666: brik + Owner: Greece + Location: 112,54 + Actor667: brik + Owner: Greece + Location: 112,53 + Actor668: brik + Owner: Greece + Location: 112,52 + Actor669: brik + Owner: Greece + Location: 112,51 + Actor670: brik + Owner: Greece + Location: 112,50 + Actor671: brik + Owner: Greece + Location: 112,49 + Actor672: brik + Owner: Greece + Location: 112,48 + Actor673: brik + Owner: Greece + Location: 112,47 + Actor674: brik + Owner: Greece + Location: 112,46 + Actor675: brik + Owner: Greece + Location: 112,45 + Actor676: brik + Owner: Greece + Location: 112,44 + Actor677: brik + Owner: Greece + Location: 112,42 + Actor678: brik + Owner: Greece + Location: 112,43 + Actor679: brik + Owner: Greece + Location: 112,40 + Actor680: brik + Owner: Greece + Location: 112,41 + Actor681: brik + Owner: Greece + Location: 112,39 + Actor682: brik + Owner: Greece + Location: 112,38 + Actor683: brik + Owner: Greece + Location: 112,36 + Actor684: brik + Owner: Greece + Location: 112,35 + Actor685: brik + Owner: Greece + Location: 112,37 + Actor686: brik + Owner: Greece + Location: 112,33 + AlliedConyard: fact + Owner: Greece + Location: 106,29 + Actor703: hpad + Owner: Greece + Location: 105,42 + Actor704: hpad + Owner: Greece + Location: 102,42 + Actor705: tent + Owner: Greece + Location: 100,53 + Actor706: tent + Owner: Greece + Location: 103,53 + AlliedRefinery: proc + Owner: Greece + Location: 107,54 + Actor709: silo + Owner: Greece + Location: 107,54 + Actor710: silo + Owner: Greece + Location: 109,54 + Actor711: pbox + Owner: Greece + Location: 95,44 + Actor713: pbox + Owner: Greece + Location: 99,61 + Actor714: pbox + Owner: Greece + Location: 103,61 + Actor715: pris + Owner: Greece + Location: 97,59 + Actor716: pris + Owner: Greece + Location: 105,59 + Actor717: pris + Owner: Greece + Location: 95,46 + Actor718: pris + Owner: Greece + Location: 97,38 + Actor720: agun + Owner: Greece + Location: 98,32 + Actor721: agun + Owner: Greece + Location: 95,59 + Actor722: agun + Owner: Greece + Location: 111,59 + Actor723: agun + Owner: Greece + Location: 111,30 + Actor724: agun + Owner: Greece + Location: 104,33 + Actor719: agun + Owner: Greece + Location: 95,52 + Actor695: apwr + Owner: Greece + Location: 109,34 + Actor696: apwr + Owner: Greece + Location: 109,37 + Actor697: apwr + Owner: Greece + Location: 109,40 + Actor698: apwr + Owner: Greece + Location: 109,43 + Actor699: apwr + Owner: Greece + Location: 109,46 + Actor725: apwr + Owner: Greece + Location: 109,49 + Actor726: apwr + Owner: Greece + Location: 105,47 + Actor727: apwr + Owner: Greece + Location: 95,48 + Actor728: apwr + Owner: Greece + Location: 100,38 + AlliedRadar: dome + Owner: Greece + Location: 100,33 + AlliedTechCenter: atek + Owner: Greece + Location: 105,36 + AlliedWarFactory: weap + Owner: Greece + Location: 101,49 + Actor707: fix + Owner: Greece + Location: 99,45 + Actor729: powr + Owner: Greece + Location: 97,52 + Actor731: syrd + Owner: Greece + Location: 97,26 + Actor732: syrd + Owner: Greece + Location: 105,23 + Actor733: brik + Owner: GDI + Location: 65,10 + Actor734: brik + Owner: GDI + Location: 64,10 + Actor735: lhus + Owner: Neutral + Location: 83,6 + Actor736: weap.td + Owner: GDI + Location: 71,14 + Actor737: nuk2 + Owner: GDI + Location: 64,11 + Actor738: nuk2 + Owner: GDI + Location: 62,11 + Actor739: nuk2 + Owner: GDI + Location: 60,11 + Actor740: nuk2 + Owner: GDI + Location: 49,15 + Actor741: nuk2 + Owner: GDI + Location: 49,12 + Actor742: nuk2 + Owner: GDI + Location: 57,19 + Actor743: nuk2 + Owner: GDI + Location: 59,19 + Actor744: nuk2 + Owner: GDI + Location: 61,19 + Actor746: afac + Owner: GDI + Location: 59,15 + Actor747: silo.td + Owner: GDI + Location: 63,17 + Actor748: silo.td + Owner: GDI + Location: 63,16 + Actor749: silo.td + Owner: GDI + Location: 63,15 + Actor751: rep + Owner: GDI + Location: 52,13 + Actor752: n1 + Owner: GDI + SubCell: 3 + Location: 26,29 + Facing: 301 + Actor753: n1 + Owner: GDI + Location: 26,29 + SubCell: 1 + Facing: 309 + Actor754: n1 + Owner: GDI + SubCell: 3 + Location: 27,31 + Facing: 384 + Actor755: n1 + Owner: GDI + Location: 28,33 + SubCell: 3 + Facing: 0 + Actor756: n1 + Owner: GDI + Location: 30,34 + SubCell: 3 + Facing: 384 + Actor757: n1 + Owner: GDI + SubCell: 3 + Location: 31,33 + Facing: 705 + Actor758: n1 + Owner: GDI + SubCell: 3 + Location: 28,27 + Facing: 507 + Actor759: n3 + Owner: GDI + Facing: 384 + Location: 53,68 + SubCell: 1 + Actor760: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 59,69 + Actor761: n3 + Owner: GDI + SubCell: 3 + Location: 64,68 + Facing: 0 + Actor762: n3 + Owner: GDI + SubCell: 3 + Location: 28,32 + Facing: 729 + Actor763: n3 + Owner: GDI + SubCell: 3 + Location: 27,37 + Facing: 317 + Actor764: n3 + Owner: GDI + Facing: 384 + Location: 27,24 + SubCell: 3 + Actor766: medi + Owner: GDI + SubCell: 3 + Location: 69,19 + Facing: 483 + Actor767: medi + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 53,28 + Actor768: medi + Owner: GDI + SubCell: 3 + Location: 32,35 + Facing: 166 + Actor769: medi + Owner: GDI + Facing: 384 + Location: 28,32 + SubCell: 1 + Actor770: n1 + Owner: GDI + Facing: 384 + Location: 53,28 + SubCell: 1 + Actor771: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 50,28 + Actor772: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 53,30 + Actor774: n1 + Owner: GDI + SubCell: 3 + Location: 46,31 + Facing: 602 + Actor775: n1 + Owner: GDI + SubCell: 3 + Location: 49,33 + Facing: 539 + Actor776: n1 + Owner: GDI + SubCell: 3 + Location: 47,35 + Facing: 610 + Actor778: n2 + Owner: GDI + SubCell: 3 + Location: 47,33 + Facing: 674 + Actor779: n2 + Owner: GDI + Location: 47,33 + SubCell: 1 + Facing: 642 + Actor782: n2 + Owner: GDI + SubCell: 3 + Location: 58,40 + Facing: 0 + MammothDrone: htnk.drone + Owner: GDI + Location: 48,34 + Facing: 618 + GuardianPatroller1: gdrn + Owner: GDI + Location: 27,72 + Facing: 256 + Actor786: split2 + Owner: Neutral + Location: 106,66 + Actor787: split2 + Owner: Neutral + Location: 109,68 + Actor789: split2 + Owner: Neutral + Location: 96,65 + Actor790: split2 + Owner: Neutral + Location: 100,76 + Actor791: split2 + Owner: Neutral + Location: 107,78 + Actor788: htnk + Owner: GDI + Location: 25,30 + Facing: 256 + Actor792: mtnk + Owner: GDI + Facing: 384 + Location: 24,26 + Actor793: htnk + Owner: GDI + Location: 69,23 + Facing: 491 + Actor796: msam + Owner: GDI + Facing: 610 + Location: 67,19 + Actor797: tc05 + Owner: Neutral + Location: 62,43 + Actor800: tc02 + Owner: Neutral + Location: 74,40 + Actor802: t01 + Owner: Neutral + Location: 79,39 + Actor804: t01 + Owner: Neutral + Location: 79,19 + Actor808: tc03 + Owner: Neutral + Location: 63,46 + Actor809: t16 + Owner: Neutral + Location: 64,51 + Actor810: t17 + Owner: Neutral + Location: 75,52 + Actor811: t16 + Owner: Neutral + Location: 76,46 + Actor812: t14 + Owner: Neutral + Location: 76,56 + Actor813: tc04 + Owner: Neutral + Location: 77,65 + Actor814: tc02 + Owner: Neutral + Location: 76,74 + Actor815: t16 + Owner: Neutral + Location: 72,65 + Actor816: t02 + Owner: Neutral + Location: 70,53 + Actor817: t05 + Owner: Neutral + Location: 76,11 + Actor819: tc04 + Owner: Neutral + Location: 42,26 + Actor820: t16 + Owner: Neutral + Location: 43,25 + Actor821: t13 + Owner: Neutral + Location: 42,24 + Actor822: t16 + Owner: Neutral + Location: 42,35 + Actor823: t17 + Owner: Neutral + Location: 42,32 + Actor824: t16 + Owner: Neutral + Location: 41,30 + Actor825: t02 + Owner: Neutral + Location: 42,17 + Actor826: t01 + Owner: Neutral + Location: 41,22 + Actor827: t01 + Owner: Neutral + Location: 47,20 + Actor828: t12 + Owner: Neutral + Location: 44,21 + Actor829: t16 + Owner: Neutral + Location: 37,12 + Actor830: t17 + Owner: Neutral + Location: 36,11 + Actor831: tc04 + Owner: Neutral + Location: 34,1 + Actor832: tc02 + Owner: Neutral + Location: 36,4 + Actor833: tc01 + Owner: Neutral + Location: 32,1 + Actor834: t16 + Owner: Neutral + Location: 36,3 + Actor835: t12 + Owner: Neutral + Location: 37,2 + Actor836: t10 + Owner: Neutral + Location: 33,0 + Actor837: t14 + Owner: Neutral + Location: 36,0 + Actor838: t16 + Owner: Neutral + Location: 56,3 + Actor839: t03 + Owner: Neutral + Location: 59,5 + Actor840: t12 + Owner: Neutral + Location: 83,16 + Actor841: t07 + Owner: Neutral + Location: 84,27 + Actor842: t02 + Owner: Neutral + Location: 93,52 + Actor843: t16 + Owner: Neutral + Location: 78,50 + Actor844: t11 + Owner: Neutral + Location: 30,50 + Actor845: t12 + Owner: Neutral + Location: 34,44 + Actor846: t07 + Owner: Neutral + Location: 43,45 + Actor847: t06 + Owner: Neutral + Location: 45,49 + Actor848: tc01 + Owner: Neutral + Location: 38,52 + Actor849: tc04 + Owner: Neutral + Location: 32,59 + Actor850: t07 + Owner: Neutral + Location: 33,58 + Actor851: t16 + Owner: Neutral + Location: 32,58 + Actor852: t10 + Owner: Neutral + Location: 32,57 + Actor853: t06 + Owner: Neutral + Location: 32,56 + Actor854: t07 + Owner: Neutral + Location: 27,53 + Actor855: t02 + Owner: Neutral + Location: 21,51 + Actor856: t03 + Owner: Neutral + Location: 22,48 + Actor857: tc05 + Owner: Neutral + Location: 40,45 + Actor858: t05 + Owner: Neutral + Location: 38,46 + Actor859: t06 + Owner: Neutral + Location: 47,76 + Actor860: tc01 + Owner: Neutral + Location: 44,75 + Actor861: tc03 + Owner: Neutral + Location: 36,77 + Actor862: tc04 + Owner: Neutral + Location: 38,78 + Actor863: tc05 + Owner: Neutral + Location: 44,77 + Actor864: t16 + Owner: Neutral + Location: 43,77 + Actor865: t06 + Owner: Neutral + Location: 41,77 + Actor866: t02 + Owner: Neutral + Location: 36,79 + Actor867: t15 + Owner: Neutral + Location: 41,78 + Actor868: t16 + Owner: Neutral + Location: 43,79 + Actor869: t15 + Owner: Neutral + Location: 47,78 + Actor871: t16 + Owner: Neutral + Location: 43,71 + Actor872: t07 + Owner: Neutral + Location: 41,68 + Actor873: t02 + Owner: Neutral + Location: 40,74 + Actor870: t17 + Owner: Neutral + Location: 32,76 + Actor874: t12 + Owner: Neutral + Location: 33,78 + Actor875: t08 + Owner: Neutral + Location: 32,78 + Actor876: t12 + Owner: Neutral + Location: 15,79 + Actor877: t12 + Owner: Neutral + Location: 17,31 + Actor878: t06 + Owner: Neutral + Location: 18,23 + Actor879: tc04 + Owner: Neutral + Location: 4,4 + Actor880: tc01 + Owner: Neutral + Location: 3,9 + Actor881: tc02 + Owner: Neutral + Location: 3,7 + Actor882: t16 + Owner: Neutral + Location: 3,6 + Actor883: t15 + Owner: Neutral + Location: 2,8 + Actor884: t13 + Owner: Neutral + Location: 1,9 + Actor885: tc05 + Owner: Neutral + Location: 0,5 + Actor886: t16 + Owner: Neutral + Location: 3,4 + Actor887: t17 + Owner: Neutral + Location: 2,1 + Actor888: tc04 + Owner: Neutral + Location: 14,2 + Actor889: t17 + Owner: Neutral + Location: 13,3 + Actor890: t16 + Owner: Neutral + Location: 17,3 + Actor891: t07 + Owner: Neutral + Location: 10,3 + Actor892: t02 + Owner: Neutral + Location: 29,2 + Actor893: t06 + Owner: Neutral + Location: 25,10 + Actor894: t16 + Owner: Neutral + Location: 27,16 + Actor895: t07 + Owner: Neutral + Location: 34,10 + Actor896: t02 + Owner: Neutral + Location: 35,15 + Actor897: t10 + Owner: Neutral + Location: 30,5 + Actor898: t05 + Owner: Neutral + Location: 33,6 + Actor899: tc01 + Owner: Neutral + Location: 29,18 + Actor900: t07 + Owner: Neutral + Location: 31,17 + Actor901: t05 + Owner: Neutral + Location: 37,18 + Actor902: t07 + Owner: Neutral + Location: 38,17 + Actor903: tc02 + Owner: Neutral + Location: 33,18 + Actor904: t15 + Owner: Neutral + Location: 29,9 + Actor905: t05 + Owner: Neutral + Location: 22,8 + Actor906: tc02 + Owner: Neutral + Location: 23,6 + Actor907: t16 + Owner: Neutral + Location: 17,7 + Actor908: tc04 + Owner: Neutral + Location: 19,12 + Actor909: t06 + Owner: Neutral + Location: 22,15 + Actor910: v01 + Owner: Neutral + Location: 9,15 + Actor911: t05 + Owner: Neutral + Location: 10,18 + Actor912: v02 + Owner: Neutral + Location: 10,20 + Actor913: v03 + Owner: Neutral + Location: 15,19 + Actor914: v09 + Owner: Neutral + Location: 13,13 + Actor915: v11 + Owner: Neutral + Location: 7,18 + Actor916: v07 + Owner: Neutral + Location: 18,15 + Actor917: v04 + Owner: Neutral + Location: 11,23 + Actor918: v06 + Owner: Neutral + Location: 4,15 + Actor919: v16 + Owner: Neutral + Location: 3,18 + Actor920: v16 + Owner: Neutral + Location: 4,18 + Actor921: v17 + Owner: Neutral + Location: 5,21 + Actor922: v17 + Owner: Neutral + Location: 6,21 + Actor923: v10 + Owner: Neutral + Location: 9,8 + Actor924: wood + Owner: Neutral + Location: 3,17 + Actor925: wood + Owner: Neutral + Location: 2,17 + Actor926: wood + Owner: Neutral + Location: 2,18 + Actor927: wood + Owner: Neutral + Location: 2,19 + Actor928: wood + Owner: Neutral + Location: 3,19 + Actor929: wood + Owner: Neutral + Location: 4,19 + Actor930: wood + Owner: Neutral + Location: 5,19 + Actor931: wood + Owner: Neutral + Location: 5,18 + Actor932: wood + Owner: Neutral + Location: 5,17 + Actor933: wood + Owner: Neutral + Location: 4,21 + Actor935: wood + Owner: Neutral + Location: 4,22 + Actor936: wood + Owner: Neutral + Location: 5,22 + Actor937: wood + Owner: Neutral + Location: 6,22 + Actor938: wood + Owner: Neutral + Location: 7,22 + Actor939: wood + Owner: Neutral + Location: 7,21 + Actor940: wood + Owner: Neutral + Location: 7,20 + Actor934: wood + Owner: Neutral + Location: 6,20 + Actor941: wood + Owner: Neutral + Location: 5,13 + Actor942: wood + Owner: Neutral + Location: 6,13 + Actor943: wood + Owner: Neutral + Location: 7,13 + Actor944: wood + Owner: Neutral + Location: 8,13 + Actor945: wood + Owner: Neutral + Location: 4,13 + Actor946: wood + Owner: Neutral + Location: 8,12 + Actor947: wood + Owner: Neutral + Location: 15,18 + Actor948: wood + Owner: Neutral + Location: 16,18 + Actor949: wood + Owner: Neutral + Location: 17,18 + Actor950: wood + Owner: Neutral + Location: 17,19 + Actor951: wood + Owner: Neutral + Location: 17,20 + Actor952: wood + Owner: Neutral + Location: 14,18 + Actor953: wood + Owner: Neutral + Location: 18,14 + Actor954: wood + Owner: Neutral + Location: 18,13 + Actor955: wood + Owner: Neutral + Location: 17,13 + Actor956: wood + Owner: Neutral + Location: 15,10 + Actor957: wood + Owner: Neutral + Location: 14,10 + Actor958: wood + Owner: Neutral + Location: 11,10 + Actor959: wood + Owner: Neutral + Location: 10,10 + Actor960: wood + Owner: Neutral + Location: 9,10 + Actor961: wood + Owner: Neutral + Location: 16,26 + Actor962: wood + Owner: Neutral + Location: 17,26 + Actor963: wood + Owner: Neutral + Location: 17,25 + Actor964: pcan + Owner: Greece + Facing: 384 + Location: 100,42 + Actor965: pcan + Owner: Greece + Location: 106,40 + Facing: 491 + Actor966: apc.ai + Owner: Greece + Location: 106,51 + Facing: 618 + Actor967: arty + Owner: Greece + Location: 102,31 + Stance: Defend + Facing: 95 + Actor968: arty + Owner: Greece + Location: 110,30 + Facing: 118 + Actor969: arty + Owner: Greece + Facing: 384 + Location: 95,57 + Actor970: arty + Owner: Greece + Facing: 384 + Location: 108,59 + Actor971: arty + Owner: Greece + Location: 95,51 + Facing: 245 + Actor972: arty + Owner: Greece + Location: 96,46 + Facing: 111 + Actor976: 2tnk + Owner: Greece + Location: 102,57 + Facing: 507 + Actor977: ptnk + Owner: Greece + Facing: 384 + Location: 108,52 + Actor978: ptnk + Owner: Greece + Location: 103,37 + Facing: 507 + Actor979: ptnk + Owner: Greece + Facing: 384 + Location: 107,34 + Actor980: cryo + Owner: Greece + Facing: 384 + Location: 98,34 + Actor981: cryo + Owner: Greece + Location: 98,44 + Facing: 245 + Actor982: cryo + Owner: Greece + Facing: 384 + Location: 99,58 + Actor983: jeep + Owner: Greece + Location: 105,39 + Facing: 245 + Actor984: jeep + Owner: Greece + Location: 103,46 + Facing: 658 + Actor985: e1 + Owner: Greece + SubCell: 3 + Location: 101,42 + Facing: 578 + Actor986: e1 + Owner: Greece + SubCell: 3 + Location: 91,41 + Facing: 245 + Actor987: e1 + Owner: Greece + Facing: 384 + Location: 91,41 + SubCell: 1 + Actor995: e1 + Owner: Greece + SubCell: 3 + Location: 95,71 + Facing: 237 + Actor996: e1 + Owner: Greece + SubCell: 3 + Location: 98,71 + Facing: 190 + Actor997: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 98,61 + Actor998: e1 + Owner: Greece + Facing: 384 + Location: 104,61 + SubCell: 3 + Actor999: e1 + Owner: Greece + Facing: 384 + Location: 104,61 + SubCell: 1 + Actor1000: e1 + Owner: Greece + Location: 104,55 + SubCell: 1 + Facing: 384 + Actor1001: e1 + Owner: Greece + SubCell: 3 + Location: 103,56 + Facing: 705 + Actor1002: e1 + Owner: Greece + Location: 103,56 + SubCell: 1 + Facing: 384 + Actor1003: e1 + Owner: Greece + Location: 104,56 + SubCell: 3 + Facing: 555 + Actor1004: e1 + Owner: Greece + Location: 105,55 + SubCell: 3 + Facing: 384 + Actor1005: e1 + Owner: Greece + Facing: 384 + Location: 102,55 + SubCell: 3 + Actor1006: e1 + Owner: Greece + SubCell: 1 + Location: 101,55 + Facing: 384 + Actor1007: e1 + Owner: Greece + Location: 100,55 + SubCell: 1 + Facing: 563 + Actor1008: e1 + Owner: Greece + Location: 99,56 + SubCell: 3 + Facing: 650 + Actor1009: e1 + Owner: Greece + Location: 100,55 + SubCell: 2 + Facing: 586 + Actor1010: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 99,52 + Actor1011: e1 + Owner: Greece + SubCell: 3 + Location: 98,50 + Facing: 578 + Actor1012: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 100,49 + Actor1013: e1 + Owner: Greece + SubCell: 3 + Location: 105,40 + Facing: 539 + Actor1014: e1 + Owner: Greece + Facing: 384 + Location: 105,40 + SubCell: 1 + Actor1015: e1 + Owner: Greece + SubCell: 3 + Location: 107,39 + Facing: 384 + Actor1016: e1 + Owner: Greece + SubCell: 3 + Location: 104,38 + Facing: 531 + Actor1017: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 104,35 + Actor1018: e1 + Owner: Greece + SubCell: 3 + Location: 102,36 + Facing: 563 + Actor1019: e1 + Owner: Greece + SubCell: 3 + Location: 103,33 + Facing: 618 + Actor1020: e1 + Owner: Greece + Location: 108,33 + SubCell: 3 + Facing: 384 + Actor1021: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 108,45 + Actor1022: e1 + Owner: Greece + Facing: 384 + Location: 100,45 + SubCell: 1 + Actor1023: e1 + Owner: Greece + SubCell: 3 + Location: 101,44 + Facing: 658 + Actor1024: e1 + Owner: Greece + SubCell: 3 + Location: 99,38 + Facing: 384 + Actor1025: e1 + Owner: Greece + SubCell: 3 + Location: 110,53 + Facing: 697 + Actor1026: e1 + Owner: Greece + Facing: 384 + Location: 110,52 + SubCell: 3 + Actor1027: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 107,50 + Actor1028: e1 + Owner: Greece + SubCell: 3 + Location: 111,56 + Facing: 214 + Actor1029: e1 + Owner: Greece + SubCell: 3 + Location: 110,57 + Facing: 0 + Actor1030: e1 + Owner: Greece + Facing: 384 + Location: 111,57 + SubCell: 3 + Actor1031: e1 + Owner: Greece + Facing: 384 + SubCell: 1 + Location: 111,56 + Actor1032: e3 + Owner: Greece + Location: 105,55 + SubCell: 1 + Facing: 142 + Actor1033: e3 + Owner: Greece + Location: 103,55 + SubCell: 1 + Facing: 384 + Actor1034: e3 + Owner: Greece + Facing: 384 + SubCell: 2 + Location: 104,55 + Actor1035: e3 + Owner: Greece + Location: 102,56 + SubCell: 3 + Facing: 563 + Actor1036: e3 + Owner: Greece + Facing: 384 + Location: 99,51 + SubCell: 3 + Actor1037: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 100,48 + Actor1038: e3 + Owner: Greece + Facing: 384 + Location: 100,45 + SubCell: 2 + Actor1039: e3 + Owner: Greece + Facing: 384 + Location: 101,44 + SubCell: 1 + Actor1040: e3 + Owner: Greece + Facing: 384 + Location: 104,38 + SubCell: 1 + Actor1041: e3 + Owner: Greece + Location: 104,35 + SubCell: 1 + Facing: 384 + Actor1042: e3 + Owner: Greece + SubCell: 3 + Location: 110,32 + Facing: 166 + Actor1043: medi + Owner: Greece + Location: 105,40 + SubCell: 2 + Facing: 705 + Actor1044: medi + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 101,45 + Actor1045: medi + Owner: Greece + Facing: 384 + Location: 99,52 + SubCell: 1 + Actor1046: medi + Owner: Greece + SubCell: 1 + Location: 102,55 + Facing: 384 + Actor1047: medi + Owner: Greece + SubCell: 3 + Location: 100,56 + Facing: 650 + Actor1049: mech + Owner: Greece + Location: 101,42 + SubCell: 1 + Facing: 384 + Actor1050: mech + Owner: Greece + SubCell: 3 + Location: 98,48 + Facing: 729 + Actor1051: mech + Owner: Greece + SubCell: 3 + Location: 98,45 + Facing: 563 + Actor1052: mech + Owner: Greece + Location: 108,51 + SubCell: 3 + Facing: 261 + Actor1053: xo + Owner: GDI + Location: 70,18 + Facing: 547 + Actor1054: xo + Owner: GDI + Location: 66,17 + Facing: 610 + Actor1055: n1 + Owner: GDI + Location: 69,19 + SubCell: 1 + Facing: 515 + TurretFacing: 943 + Actor1056: n1 + Owner: GDI + SubCell: 3 + Location: 68,18 + Facing: 467 + Actor1057: n1 + Owner: GDI + SubCell: 3 + Location: 70,17 + Facing: 499 + Actor1058: n1 + Owner: GDI + Location: 71,17 + SubCell: 3 + Facing: 384 + Actor1059: n1 + Owner: GDI + SubCell: 1 + Location: 70,17 + Facing: 507 + Actor1060: n1 + Owner: GDI + SubCell: 3 + Location: 65,19 + Facing: 594 + Actor1061: n1 + Owner: GDI + SubCell: 3 + Location: 64,18 + Facing: 610 + Actor1062: n1 + Owner: GDI + SubCell: 3 + Location: 48,23 + Facing: 650 + Actor1063: n1 + Owner: GDI + Location: 11,23 + SubCell: 1 + Facing: 682 + Actor1064: n1 + Owner: GDI + SubCell: 3 + Location: 14,19 + Facing: 384 + Actor1065: n1 + Owner: GDI + SubCell: 3 + Location: 18,21 + Facing: 642 + Actor1067: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 8,15 + Actor1069: n1 + Owner: GDI + SubCell: 3 + Location: 14,11 + Facing: 491 + Actor1070: n1 + Owner: GDI + SubCell: 3 + Location: 15,6 + Facing: 384 + Actor1071: n1 + Owner: GDI + SubCell: 3 + Location: 19,7 + Facing: 269 + Actor1072: n1 + Owner: GDI + SubCell: 3 + Location: 21,5 + Facing: 174 + Actor1073: n1 + Owner: GDI + SubCell: 3 + Location: 21,4 + Facing: 452 + Actor1074: n1 + Owner: GDI + SubCell: 3 + Location: 27,10 + Facing: 245 + Actor1075: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 30,8 + Actor1076: n1 + Owner: GDI + SubCell: 3 + Location: 27,6 + Facing: 190 + Actor1077: n1 + Owner: GDI + SubCell: 3 + Location: 34,9 + Facing: 293 + Actor1078: n1 + Owner: GDI + SubCell: 3 + Location: 35,24 + Facing: 384 + Actor1079: n1 + Owner: GDI + SubCell: 3 + Location: 51,4 + Facing: 531 + Actor1080: n1 + Owner: GDI + Facing: 384 + Location: 51,4 + SubCell: 1 + Actor1081: n1 + Owner: GDI + SubCell: 3 + Location: 49,6 + Facing: 602 + Actor1083: n1 + Owner: GDI + SubCell: 3 + Location: 46,7 + Facing: 729 + Actor1084: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 56,18 + Actor1085: n1 + Owner: GDI + SubCell: 3 + Location: 52,16 + Facing: 563 + Actor1086: n1 + Owner: GDI + SubCell: 3 + Location: 58,16 + Facing: 384 + Actor1087: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 78,20 + Actor1088: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 79,27 + Actor1089: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 81,29 + Actor1090: n1 + Owner: GDI + SubCell: 3 + Location: 85,21 + Facing: 642 + Actor1091: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 82,16 + Actor1092: n1 + Owner: GDI + Facing: 384 + Location: 82,16 + SubCell: 1 + Actor1093: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 82,8 + Actor1094: n1 + Owner: GDI + Location: 82,8 + SubCell: 1 + Facing: 384 + Actor1095: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 79,9 + Actor1096: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 77,15 + Actor1102: n1 + Owner: GDI + SubCell: 3 + Location: 72,56 + Facing: 384 + Actor1103: n1 + Owner: GDI + Location: 72,56 + SubCell: 1 + Facing: 507 + Actor1105: n1 + Owner: GDI + Facing: 384 + Location: 73,57 + SubCell: 3 + Actor1107: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 84,14 + Actor1109: n3 + Owner: GDI + Facing: 384 + Location: 75,57 + SubCell: 3 + Actor1111: n2 + Owner: GDI + SubCell: 3 + Location: 83,27 + Facing: 515 + Actor1112: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 78,15 + Actor1113: n2 + Owner: GDI + Facing: 384 + Location: 83,8 + SubCell: 3 + Actor1116: n2 + Owner: GDI + Facing: 384 + Location: 14,11 + SubCell: 1 + Actor1117: n2 + Owner: GDI + SubCell: 3 + Location: 27,5 + Facing: 384 + Actor1118: n2 + Owner: GDI + SubCell: 3 + Location: 24,8 + Facing: 523 + Actor1119: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 13,3 + Actor1121: n2 + Owner: GDI + SubCell: 3 + Location: 16,21 + Facing: 539 + Actor1122: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 17,14 + Actor1123: n2 + Owner: GDI + Facing: 384 + Location: 25,26 + SubCell: 3 + Actor1124: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 43,71 + Actor1125: n2 + Owner: GDI + SubCell: 3 + Location: 29,48 + Facing: 642 + Actor1126: n2 + Owner: GDI + SubCell: 3 + Location: 32,49 + Facing: 475 + Actor1127: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 33,48 + Actor1128: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 35,47 + Actor1129: n1 + Owner: GDI + SubCell: 3 + Location: 28,51 + Facing: 658 + Actor1130: n1 + Owner: GDI + SubCell: 3 + Location: 38,52 + Facing: 483 + Actor1132: n1 + Owner: GDI + SubCell: 3 + Location: 32,56 + Facing: 634 + Actor1131: n1 + Owner: GDI + SubCell: 3 + Location: 44,51 + Facing: 158 + Actor1133: n2 + Owner: GDI + SubCell: 3 + Location: 11,49 + Facing: 642 + Actor1134: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 15,51 + Actor1135: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 25,58 + Actor1136: n2 + Owner: GDI + SubCell: 3 + Location: 29,67 + Facing: 384 + Actor1137: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 24,73 + Actor1138: n1 + Owner: GDI + Location: 29,66 + SubCell: 3 + Facing: 491 + Actor1139: n1 + Owner: GDI + SubCell: 3 + Location: 30,69 + Facing: 269 + Actor1140: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 27,59 + Actor1142: n1 + Owner: GDI + SubCell: 3 + Location: 12,50 + Facing: 563 + Actor1143: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 15,43 + Actor1144: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 21,45 + Actor1145: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 19,40 + Actor1147: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 20,39 + Actor1146: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 16,36 + Actor1148: n2 + Owner: GDI + SubCell: 3 + Location: 9,35 + Facing: 602 + Actor1151: n1 + Owner: GDI + SubCell: 3 + Location: 10,30 + Facing: 634 + Actor1153: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 17,31 + Actor1154: n1 + Owner: GDI + SubCell: 3 + Location: 3,23 + Facing: 602 + Actor1155: dd + Owner: Greece + Facing: 384 + Location: 102,23 + Actor1156: dd + Owner: Greece + Facing: 384 + Location: 108,21 + Actor1157: dd + Owner: Greece + Facing: 384 + Location: 105,18 + Actor1158: pt + Owner: Greece + Facing: 384 + Location: 105,20 + Actor1159: pt + Owner: Greece + Facing: 384 + Location: 99,23 + Actor1160: mtnk + Owner: GDI + Location: 7,16 + Facing: 642 + Actor1161: titn + Owner: GDI + Location: 66,15 + Facing: 650 + Actor1162: e2 + Owner: GDI + SubCell: 3 + Location: 47,11 + Facing: 785 + Actor1163: e2 + Owner: GDI + SubCell: 3 + Location: 46,10 + Facing: 753 + Actor1164: e2 + Owner: GDI + SubCell: 3 + Location: 52,7 + Facing: 384 + GuardianPatrol1: waypoint + Owner: Neutral + Location: 26,72 + GuardianPatrol2: waypoint + Owner: Neutral + Location: 25,63 + GuardianPatrol3: waypoint + Owner: Neutral + Location: 13,61 + GuardianPatrol4: waypoint + Owner: Neutral + Location: 13,51 + Hacker2: hack + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 11,73 + Actor1165: n2 + Owner: GDI + SubCell: 3 + Facing: 816 + Location: 8,21 + Actor1166: n1 + Owner: GDI + SubCell: 3 + Facing: 689 + Location: 9,21 + Actor1120: n1 + Owner: GDI + SubCell: 3 + Facing: 666 + Location: 15,13 + Actor1167: n1 + Owner: GDI + SubCell: 3 + Facing: 563 + Location: 14,49 + Actor1168: n1 + Owner: GDI + SubCell: 3 + Facing: 721 + Location: 9,37 + Actor1152: n2 + Owner: GDI + SubCell: 3 + Facing: 602 + Location: 9,27 + Actor1149: n2 + Owner: GDI + SubCell: 3 + Location: 6,30 + Facing: 594 + Actor1150: brl3 + Owner: GDI + Location: 7,36 + Actor1169: brl3 + Owner: GDI + Location: 7,28 + Actor1170: barl + Owner: GDI + Location: 6,36 + Actor1171: n2 + Owner: GDI + SubCell: 3 + Facing: 384 + Location: 72,57 + Actor1172: n2 + Owner: GDI + Facing: 384 + Location: 70,55 + SubCell: 3 + BattleTankPatrol4: waypoint + Owner: Neutral + Location: 68,50 + BattleTankPatrol5: waypoint + Owner: Neutral + Location: 71,49 + Actor1173: msam + Owner: GDI + Facing: 253 + Location: 50,63 + Actor1174: vulc + Owner: GDI + Facing: 626 + Location: 60,61 + Actor1175: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 31,7 + Actor1176: n2 + Owner: GDI + SubCell: 3 + Facing: 674 + Location: 49,22 + Actor1177: n2 + Owner: GDI + SubCell: 1 + Facing: 642 + Location: 49,22 + Actor1048: medi + Owner: Greece + SubCell: 3 + Location: 105,52 + Facing: 384 + AlliedBase1: waypoint + Owner: Greece + Location: 104,34 + AlliedBase2: waypoint + Owner: Greece + Location: 104,44 + AlliedBase3: waypoint + Owner: Greece + Location: 105,53 + Actor1179: n1 + Owner: GDI + SubCell: 3 + Facing: 269 + Location: 16,50 + Actor1141: n1 + Owner: GDI + SubCell: 3 + Facing: 602 + Location: 18,29 + Actor1180: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 15,35 + Actor1181: n2 + Owner: GDI + SubCell: 3 + Facing: 475 + Location: 33,54 + Actor1183: mtnk + Owner: GDI + Location: 81,7 + Facing: 512 + Actor1184: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 47,22 + Actor1186: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 58,6 + Actor1188: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 29,30 + Actor1187: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 38,31 + Actor1189: n2 + Owner: GDI + SubCell: 3 + Facing: 253 + Location: 38,33 + JumpJet1: jjet + Owner: GDI + Location: 10,14 + Facing: 512 + JumpJet2: jjet + Owner: GDI + Location: 16,12 + Facing: 512 + HardOnlyBattleTank1: mtnk + Owner: GDI + Location: 38,49 + Facing: 384 + HardOnlyHumvee: hmmv + Owner: GDI + Location: 18,37 + Facing: 384 + HardOnlyBattleTank2: mtnk + Owner: GDI + Location: 56,15 + Facing: 911 + HardOnlyDisruptor2: disr + Owner: GDI + Location: 83,21 + Facing: 512 + HardOnlyMammoth: htnk + Owner: GDI + Location: 35,72 + Facing: 261 + Actor1190: n2 + Owner: GDI + SubCell: 3 + Facing: 507 + Location: 64,41 + Actor1191: n2 + Owner: GDI + SubCell: 3 + Facing: 808 + Location: 52,39 + Actor1192: n2 + Owner: GDI + SubCell: 3 + Location: 53,40 + Facing: 563 + Actor1193: n1 + Owner: GDI + SubCell: 3 + Facing: 705 + Location: 56,39 + AlliedBase5: waypoint + Owner: Neutral + Location: 97,42 + AlliedBase4: waypoint + Owner: Neutral + Location: 98,55 + Actor1194: n2 + Owner: GDI + SubCell: 3 + Facing: 594 + Location: 2,29 + Actor1195: n1 + Owner: GDI + SubCell: 3 + Facing: 721 + Location: 3,34 + HardOnlyBattleTank3: mtnk + Owner: GDI + Location: 26,4 + Facing: 384 + Actor1196: htnk + Owner: GDI + Facing: 384 + Location: 80,63 + Actor1197: n3 + Owner: GDI + SubCell: 3 + Facing: 384 + Location: 47,30 + Actor1198: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 44,44 + Actor1199: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 47,46 + Actor1201: gtwr + Owner: GDI + Location: 48,24 + Actor1200: e3 + Owner: GDI + SubCell: 3 + Location: 51,31 + Facing: 384 + Actor1202: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 56,14 + Actor1203: n2 + Owner: GDI + SubCell: 3 + Location: 57,15 + Facing: 384 + Actor1204: n2 + Owner: GDI + SubCell: 3 + Location: 27,36 + Facing: 301 + Actor1205: n2 + Owner: GDI + SubCell: 3 + Location: 28,35 + Facing: 111 + Actor1206: n2 + Owner: GDI + Location: 28,33 + SubCell: 1 + Facing: 384 + Actor1207: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 28,25 + Actor1208: n2 + Owner: GDI + Facing: 384 + Location: 28,25 + SubCell: 1 + Actor1209: n2 + Owner: GDI + Facing: 384 + Location: 28,28 + SubCell: 3 + Actor1210: n2 + Owner: GDI + Facing: 384 + Location: 49,60 + SubCell: 1 + Actor1211: n2 + Owner: GDI + Facing: 384 + Location: 65,19 + SubCell: 1 + Actor1212: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 72,20 + Actor1213: n2 + Owner: GDI + Facing: 384 + Location: 72,20 + SubCell: 1 + Actor1214: n2 + Owner: GDI + SubCell: 3 + Location: 73,18 + Facing: 475 + Actor1215: n2 + Owner: GDI + SubCell: 3 + Location: 63,21 + Facing: 610 + Actor1216: n2 + Owner: GDI + Facing: 384 + Location: 63,21 + SubCell: 1 + Actor1217: n2 + Owner: GDI + SubCell: 3 + Location: 63,20 + Facing: 682 + Actor1218: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 71,20 + AlliedBoundary1: waypoint + Owner: Neutral + Location: 89,41 + AlliedBoundary2: waypoint + Owner: Neutral + Location: 89,42 + AlliedBoundary3: waypoint + Owner: Neutral + Location: 89,43 + AlliedBoundary4: waypoint + Owner: Neutral + Location: 87,70 + AlliedBoundary5: waypoint + Owner: Neutral + Location: 87,71 + AlliedBoundary6: waypoint + Owner: Neutral + Location: 87,72 + Actor1182: brik + Owner: GDI + Location: 56,22 + Actor1185: brik + Owner: GDI + Location: 56,21 + Actor1220: brik + Owner: GDI + Location: 56,20 + Actor1221: brik + Owner: GDI + Location: 56,19 + Actor1222: brik + Owner: GDI + Location: 55,19 + Actor1223: brik + Owner: GDI + Location: 53,19 + Actor1224: brik + Owner: GDI + Location: 52,19 + Actor1225: brik + Owner: GDI + Location: 54,19 + Actor1226: mtnk + Owner: GDI + Location: 51,23 + Facing: 618 + Actor1219: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 51,29 + HardOnlyDisruptor1: disr + Owner: GDI + Location: 59,35 + Facing: 618 + Actor1178: mtnk + Owner: GDI + Facing: 512 + Location: 66,23 + Actor1227: mtnk + Owner: GDI + Facing: 512 + Location: 72,23 + Actor1228: atwr + Owner: GDI + Location: 69,18 + Actor1229: msam + Owner: GDI + Location: 76,42 + Facing: 388 + Actor1230: htnk + Owner: GDI + Facing: 384 + Location: 73,40 + Actor1231: htnk + Owner: GDI + Facing: 384 + Location: 71,39 + BattleTankPatrol1: waypoint + Owner: Neutral + Location: 75,67 + BattleTankPatroller1: mtnk + Owner: GDI + Facing: 0 + Location: 75,68 + BattleTankPatrol2: waypoint + Owner: Neutral + Location: 75,59 + BattleTankPatrol3: waypoint + Owner: Neutral + Location: 68,59 + BattleTankPatrol6: waypoint + Owner: Neutral + Location: 71,41 + Actor1232: xo + Owner: GDI + Facing: 384 + Location: 74,42 + Actor1233: xo + Owner: GDI + Facing: 384 + Location: 73,41 + Actor1234: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 75,43 + Actor1235: n1 + Owner: GDI + Facing: 384 + Location: 76,43 + SubCell: 3 + Actor1236: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 73,42 + Actor1237: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 71,40 + Actor1238: n1 + Owner: GDI + Facing: 384 + Location: 76,41 + SubCell: 3 + Actor1239: n2 + Owner: GDI + SubCell: 3 + Facing: 507 + Location: 61,35 + Actor1240: n3 + Owner: GDI + SubCell: 3 + Facing: 309 + Location: 80,39 + Actor1241: n2 + Owner: GDI + SubCell: 3 + Location: 59,28 + Facing: 158 + Actor1242: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 75,31 + Actor1243: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 82,12 + Actor1244: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 48,32 + Actor1245: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 50,34 + Actor1246: n1 + Owner: GDI + SubCell: 3 + Facing: 578 + Location: 64,60 + Actor1247: htnk + Owner: GDI + Facing: 384 + Location: 79,56 + Actor1248: n1 + Owner: GDI + SubCell: 3 + Facing: 384 + Location: 51,6 + Actor1249: atwr + Owner: GDI + Location: 53,9 + Actor1250: hmmv + Owner: GDI + Location: 50,30 + Facing: 384 + HardOnlyBattleTank4: mtnk + Owner: GDI + Location: 53,23 + Facing: 531 + Actor1251: e3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 52,22 + Actor1252: e3 + Owner: GDI + Facing: 384 + Location: 50,23 + SubCell: 3 + Actor1253: e3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 55,25 + Actor1254: e3 + Owner: GDI + Facing: 384 + Location: 53,30 + SubCell: 1 + DroneTip5: waypoint + Owner: Neutral + Location: 50,41 + DroneTip4: waypoint + Owner: Neutral + Location: 51,41 + DroneTip3: waypoint + Owner: Neutral + Location: 52,41 + DroneTip2: waypoint + Owner: Neutral + Location: 53,41 + DroneTip1: waypoint + Owner: Neutral + Location: 53,40 + EmpTip2: waypoint + Owner: Neutral + Location: 28,70 + EmpTip1: waypoint + Owner: Neutral + Location: 30,69 + EmpTip3: waypoint + Owner: Neutral + Location: 28,71 + EmpTip4: waypoint + Owner: Neutral + Location: 28,72 + EmpTip5: waypoint + Owner: Neutral + Location: 28,73 + EmpTip6: waypoint + Owner: Neutral + Location: 28,74 + Actor1255: vulc + Owner: GDI + Facing: 384 + Location: 36,70 + Actor1257: n1 + Owner: GDI + SubCell: 3 + Facing: 384 + Location: 35,71 + Actor1259: vulc + Owner: GDI + Facing: 245 + Location: 37,72 + Actor1260: n2 + Owner: GDI + Facing: 384 + Location: 37,73 + SubCell: 3 + Actor1261: n3 + Owner: GDI + SubCell: 1 + Location: 37,73 + Facing: 384 + Actor1262: hmmv + Owner: GDI + Facing: 384 + Location: 27,29 + Actor1256: hpad.td + Owner: GDI + Location: 30,21 + Actor1263: hpad.td + Owner: GDI + Location: 33,21 + EntranceReveal1: waypoint + Owner: Neutral + Location: 26,30 + EntranceReveal2: waypoint + Owner: Neutral + Location: 48,63 + EntranceReveal3: waypoint + Owner: Neutral + Location: 69,21 + Actor1258: n1 + Owner: GDI + Facing: 384 + Location: 36,71 + SubCell: 3 + Actor1264: n1 + Owner: GDI + Facing: 384 + SubCell: 1 + Location: 36,71 + BridgeDefendersReveal1: waypoint + Owner: Neutral + Location: 36,72 + EntranceReveal4: waypoint + Owner: Neutral + Location: 9,32 + BridgeDefendersReveal2: waypoint + Owner: Neutral + Location: 72,42 + EmpDroneReveal: waypoint + Owner: Neutral + Location: 37,36 + RespawnRally: waypoint + Owner: Neutral + Location: 9,70 + Respawn: waypoint + Owner: Neutral + Location: 4,80 + SouthBarracks: pyle + Owner: GDI + Location: 50,58 + NorthBarracks: pyle + Owner: GDI + Location: 68,14 + WestBarracks: pyle + Owner: GDI + Location: 29,31 + Actor1265: e1 + Owner: Greece + SubCell: 3 + Facing: 134 + Location: 91,42 + Actor1268: 2tnk + Owner: Greece + Facing: 256 + Location: 92,42 + Actor1269: 2tnk + Owner: Greece + Facing: 256 + Location: 92,41 + Actor1270: e1 + Owner: Greece + SubCell: 3 + Facing: 245 + Location: 93,41 + Actor1271: e1 + Owner: Greece + Facing: 384 + SubCell: 1 + Location: 93,41 + Actor1272: e1 + Owner: Greece + SubCell: 3 + Facing: 261 + Location: 94,42 + Actor1273: e1 + Owner: Greece + SubCell: 3 + Facing: 134 + Location: 93,42 + Actor1274: 2tnk + Owner: Greece + Facing: 256 + Location: 90,71 + Actor1275: 2tnk + Owner: Greece + Facing: 256 + Location: 90,70 + Actor1276: e1 + Owner: Greece + SubCell: 3 + Facing: 222 + Location: 91,71 + Actor1277: e1 + Owner: Greece + SubCell: 3 + Facing: 222 + Location: 92,70 + Actor1278: e1 + Owner: Greece + SubCell: 1 + Facing: 277 + Location: 92,70 + Actor1279: e1 + Owner: Greece + SubCell: 3 + Facing: 253 + Location: 91,70 + Actor1280: e1 + Owner: Greece + SubCell: 1 + Facing: 253 + Location: 91,70 + VeryHardOnlyTank1: mtnk + Owner: GDI + Location: 46,34 + Facing: 627 + Actor1266: 2tnk + Owner: Greece + Location: 101,64 + Facing: 512 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-covenants.yaml, ca|rules/custom/commando-mission.yaml, ca|missions/main-campaign/ca08-subversion/subversion-rules.yaml, ca|rules/custom/coop-rules.yaml, subversion-coop-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml, ca|missions/main-campaign/ca08-subversion/subversion-weapons.yaml diff --git a/mods/ca/missions/coop-campaign/ca08-subversion-coop/subversion-coop-rules.yaml b/mods/ca/missions/coop-campaign/ca08-subversion-coop/subversion-coop-rules.yaml new file mode 100644 index 0000000000..6f864c29dd --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca08-subversion-coop/subversion-coop-rules.yaml @@ -0,0 +1,20 @@ +World: + LuaScript: + Scripts: campaign.lua, coop.lua, ca|missions/main-campaign/ca08-subversion/subversion.lua, subversion-coop.lua + LobbyMissionInfo@InitialObjectives: + Prefix: Initial Objectives + Text: • Hack the GDI Advanced Communications Center.\n• Cut off the Allied base and destroy it using the Ion Cannon. + LobbyMissionInfo@Notes: + Prefix: Note + Text: Respawns can be enabled for this mission. + PrefixColor: FF9900 + TextColor: FF9900 + +STNK.Nod: + Inherits@NameTag: ^NameTag + +RMBO: + Inherits@NameTag: ^NameTag + +HACK: + Inherits@NameTag: ^NameTag \ No newline at end of file diff --git a/mods/ca/missions/coop-campaign/ca08-subversion-coop/subversion-coop.lua b/mods/ca/missions/coop-campaign/ca08-subversion-coop/subversion-coop.lua new file mode 100644 index 0000000000..0ada4776b0 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca08-subversion-coop/subversion-coop.lua @@ -0,0 +1,91 @@ + +SetupPlayers = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Multi2 = Player.GetPlayer("Multi2") + Multi3 = Player.GetPlayer("Multi3") + Multi4 = Player.GetPlayer("Multi4") + Multi5 = Player.GetPlayer("Multi5") + Nod = Player.GetPlayer("Nod") + Greece = Player.GetPlayer("Greece") + GDI = Player.GetPlayer("GDI") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = Utils.Where({ Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 }, function(p) return p ~= nil end) + MissionEnemies = { GDI, Greece } + SinglePlayerPlayer = Nod + CoopInit() +end + +AfterWorldLoaded = function() + if CoopPlayers[6] ~= nil then + local ExtraStealthTank = Actor.Create(StealthTank1.Type, true, { Owner = Nod, Location = StealthTank1.Location }) + ExtraStealthTank.GrantCondition("difficulty-" .. Difficulty) + StealthTankDeathTrigger(ExtraStealthTank) + ExtraStealthTank.Scatter() + end + --[[ --Just some Debug Trigger to test the Ending Sequence + Trigger.OnDamaged(Hacker1,function() + if Hacker1.Health < Hacker1.MaxHealth then + Hacker1.Health = Hacker1.MaxHealth + end + end) + Trigger.OnDamaged(Hacker2,function() + if Hacker2.Health < Hacker2.MaxHealth then + Hacker2.Health = Hacker2.MaxHealth + end + end)]] +end + +AfterTick = function() + +end + +InitIonControl = function() + IonCannonDamage = {} -- [player] = totalDamage + Utils.Do(CoopPlayers, function(p) + table.insert(IonCannonDamage, { + Player = p, + Score = 0 + }) + if p ~= IonControl.Owner then + Actor.Create(IonControl.Type, true, { Owner = p, Location = IonControl.Location }) + end + end) + DamageScoring() +end + +DamageScoring = function() + local GreeceTargets = Greece.GetActors() + Utils.Do(GreeceTargets,function(UID) + if UID.Type ~= "player" and UID.Type ~= "waypoint" and UID.Type ~= "brik" then + Trigger.OnDamaged(UID, function(self, attacker, damage) + if IsMissionPlayer(attacker.Owner) then + local p = attacker.Owner + for _, entry in ipairs(IonCannonDamage) do + if entry.Player == p then + entry.Score = entry.Score + damage + break + end + end + ShowIonScoreboard() + end + end) + end + end) +end + +function ShowIonScoreboard() + table.sort(IonCannonDamage, function(a, b) + return a.Score > b.Score + end) + + local sb = "---Damage Leaderboard---\n" + local rank = 1 + for _, entry in ipairs(IonCannonDamage) do + sb = sb .. string.format("%d) %-12s %8d\n", rank, entry.Player.Name, entry.Score) + rank = rank + 1 + end + + local msg = "\n\n\n\n\n\n\n\nDestroy bridges then use the Ion Cannon to destroy the Allied base.\n" .. sb + UserInterface.SetMissionText(msg, HSLColor.Yellow) +end diff --git a/mods/ca/missions/coop-campaign/ca09-salvation-coop/map.bin b/mods/ca/missions/coop-campaign/ca09-salvation-coop/map.bin new file mode 100644 index 0000000000..8ce0288752 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca09-salvation-coop/map.bin differ diff --git a/mods/ca/missions/coop-campaign/ca09-salvation-coop/map.png b/mods/ca/missions/coop-campaign/ca09-salvation-coop/map.png new file mode 100644 index 0000000000..85c6ac81d8 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca09-salvation-coop/map.png differ diff --git a/mods/ca/missions/coop-campaign/ca09-salvation-coop/map.yaml b/mods/ca/missions/coop-campaign/ca09-salvation-coop/map.yaml new file mode 100644 index 0000000000..500358a52e --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca09-salvation-coop/map.yaml @@ -0,0 +1,1955 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 09: Salvation Co-op + +Author: Darkademic & Gandorques Hikla + +Tileset: DESERT + +MapSize: 98,98 + +Bounds: 1,1,96,96 + +Visibility: Lobby + +Categories: Co-op Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: Nod, Scrin, Civilian, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + PlayerReference@Nod: + Name: Nod + Faction: nod + Color: FE1100 + Allies: Civilian, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Creeps + PlayerReference@Scrin: + Name: Scrin + Bot: campaign + Faction: scrin + Color: 7700FF + Enemies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps, Civilian + PlayerReference@Civilian: + Name: Civilian + NonCombatant: True + Faction: Random + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Creeps + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: FE1100 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Civilian + Enemies: Scrin, Creeps + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: 0B7310 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Creeps + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: 134691 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Creeps + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: 775A12 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Creeps + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: 82C900 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Creeps + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: EEA8A8 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Creeps + +Actors: + Hospital: hosp + Owner: Nod + Location: 14,39 + Actor14: sbag + Owner: Nod + Location: 23,41 + Actor15: sbag + Owner: Nod + Location: 23,42 + Actor16: sbag + Owner: Nod + Location: 23,43 + Actor17: sbag + Owner: Nod + Location: 22,43 + Actor18: sbag + Owner: Nod + Location: 24,41 + Actor19: sbag + Owner: Nod + Location: 18,49 + Actor20: sbag + Owner: Nod + Location: 18,50 + Actor21: sbag + Owner: Nod + Location: 19,50 + Actor26: sbag + Owner: Nod + Location: 22,44 + Actor27: gun.nod + Owner: Nod + Location: 23,44 + TurretFacing: 721 + Actor28: gun.nod + Owner: Nod + Location: 19,51 + TurretFacing: 515 + Actor29: sbag + Owner: Nod + Location: 12,30 + Actor30: sbag + Owner: Nod + Location: 13,30 + Actor31: sbag + Owner: Nod + Location: 14,30 + Actor32: sbag + Owner: Nod + Location: 12,31 + Actor33: gun.nod + Owner: Nod + Location: 13,29 + Actor34: nsam + Owner: Nod + Location: 21,42 + Actor35: nsam + Owner: Nod + Location: 13,31 + Actor36: obli + Owner: Nod + Location: 19,49 + Actor37: nuk2 + Owner: Nod + Location: 19,32 + Actor38: nuk2 + Owner: Nod + Location: 13,33 + Actor39: rep + Owner: Nod + Location: 18,37 + Actor40: hq + Owner: Nod + Location: 5,35 + Actor41: nuk2 + Owner: Nod + Location: 14,46 + Actor150: sbag + Owner: Nod + Location: 20,49 + Actor151: sbag + Owner: Nod + Location: 20,50 + Actor76: v25 + Owner: Neutral + Location: 55,72 + Actor77: v30 + Owner: Neutral + Location: 60,74 + Actor78: v20 + Owner: Neutral + Location: 56,76 + Actor79: v33 + Owner: Neutral + Location: 51,80 + Actor80: v36 + Owner: Neutral + Location: 52,76 + Actor81: v29 + Owner: Neutral + Location: 60,78 + Actor82: v11 + Owner: Neutral + Location: 51,68 + Actor83: v32 + Owner: Neutral + Location: 61,84 + Actor84: v27 + Owner: Neutral + Location: 59,70 + Actor85: v35 + Owner: Neutral + Location: 62,72 + Actor86: v24 + Owner: Neutral + Location: 50,72 + Actor87: t09 + Owner: Neutral + Location: 61,79 + Actor88: tc01 + Owner: Neutral + Location: 64,75 + Actor89: t18 + Owner: Neutral + Location: 47,69 + Actor90: t08 + Owner: Neutral + Location: 47,79 + Actor91: t18 + Owner: Neutral + Location: 49,89 + Actor92: rock7 + Owner: Neutral + Location: 62,86 + Actor93: rock3 + Owner: Neutral + Location: 63,44 + Actor94: v25 + Owner: Neutral + Location: 48,52 + Actor95: t18 + Owner: Neutral + Location: 49,54 + Actor96: v27 + Owner: Neutral + Location: 53,51 + Actor97: v24 + Owner: Neutral + Location: 61,50 + Actor98: v20 + Owner: Neutral + Location: 55,44 + Actor99: v21 + Owner: Neutral + Location: 53,58 + Actor100: v35 + Owner: Neutral + Location: 57,57 + Actor101: v32 + Owner: Neutral + Location: 50,47 + Actor102: v30 + Owner: Neutral + Location: 60,45 + Actor103: v31 + Owner: Neutral + Location: 41,58 + Actor104: v34 + Owner: Neutral + Location: 39,58 + Actor105: v26 + Owner: Neutral + Location: 56,51 + Actor106: v29 + Owner: Neutral + Location: 46,43 + Actor107: t04 + Owner: Neutral + Location: 48,43 + Actor108: t08 + Owner: Neutral + Location: 51,43 + Actor109: t18 + Owner: Neutral + Location: 60,60 + Actor110: v31 + Owner: Neutral + Location: 65,48 + Actor111: v33 + Owner: Neutral + Location: 53,55 + Actor112: v09 + Owner: Neutral + Location: 62,55 + Actor113: v09 + Owner: Neutral + Location: 45,84 + Actor114: v08 + Owner: Neutral + Location: 49,84 + Actor115: t04 + Owner: Neutral + Location: 45,82 + Actor116: v23 + Owner: Neutral + Location: 58,82 + Actor117: v24 + Owner: Neutral + Location: 19,10 + Actor118: v25 + Owner: Neutral + Location: 19,3 + Actor119: v21 + Owner: Neutral + Location: 31,12 + Actor120: v27 + Owner: Neutral + Location: 32,10 + Actor121: v28 + Owner: Neutral + Location: 24,11 + Actor122: v29 + Owner: Neutral + Location: 9,5 + Actor123: v32 + Owner: Neutral + Location: 13,7 + Actor124: v25 + Owner: Neutral + Location: 71,10 + Actor126: v21 + Owner: Neutral + Location: 73,5 + Actor127: v33 + Owner: Neutral + Location: 62,12 + Actor128: v36 + Owner: Neutral + Location: 67,8 + Actor129: v32 + Owner: Neutral + Location: 75,8 + Actor130: v24 + Owner: Neutral + Location: 60,7 + Actor131: v31 + Owner: Neutral + Location: 65,5 + Actor132: t08 + Owner: Neutral + Location: 72,3 + Actor133: t18 + Owner: Neutral + Location: 72,15 + Actor134: v27 + Owner: Neutral + Location: 80,12 + Actor135: v22 + Owner: Neutral + Location: 73,13 + Actor136: v22 + Owner: Neutral + Location: 11,11 + Actor137: v36 + Owner: Neutral + Location: 20,8 + Actor138: v30 + Owner: Neutral + Location: 16,7 + Actor139: tc01 + Owner: Neutral + Location: 16,10 + Actor140: v33 + Owner: Neutral + Location: 27,12 + Actor141: v34 + Owner: Neutral + Location: 6,12 + Actor142: v29 + Owner: Neutral + Location: 35,14 + Actor143: v27 + Owner: Neutral + Location: 9,15 + Actor144: v20 + Owner: Neutral + Location: 23,6 + Actor145: v31 + Owner: Neutral + Location: 6,7 + Actor146: t08 + Owner: Neutral + Location: 26,9 + Actor147: v25 + Owner: Neutral + Location: 14,84 + Actor148: v27 + Owner: Neutral + Location: 19,85 + Actor149: v32 + Owner: Neutral + Location: 22,86 + Actor152: v24 + Owner: Neutral + Location: 26,89 + Actor153: v26 + Owner: Neutral + Location: 37,7 + Actor154: t18 + Owner: Neutral + Location: 39,6 + Actor155: tc01 + Owner: Neutral + Location: 31,19 + Actor156: tc01 + Owner: Neutral + Location: 28,79 + Actor157: v30 + Owner: Neutral + Location: 26,86 + Actor158: v31 + Owner: Neutral + Location: 15,88 + Actor159: v23 + Owner: Neutral + Location: 18,89 + Actor160: t18 + Owner: Neutral + Location: 20,92 + Actor161: v28 + Owner: Neutral + Location: 24,92 + Actor162: v29 + Owner: Neutral + Location: 31,82 + Actor163: v35 + Owner: Neutral + Location: 28,83 + Actor164: v34 + Owner: Neutral + Location: 21,83 + Actor165: t18 + Owner: Neutral + Location: 11,87 + Actor166: t08 + Owner: Neutral + Location: 23,84 + Actor167: v27 + Owner: Neutral + Location: 71,25 + Actor168: v26 + Owner: Neutral + Location: 88,26 + Actor169: v32 + Owner: Neutral + Location: 79,26 + Actor170: v33 + Owner: Neutral + Location: 72,29 + Actor171: v21 + Owner: Neutral + Location: 86,31 + Actor172: v20 + Owner: Neutral + Location: 63,23 + Actor173: v22 + Owner: Neutral + Location: 69,22 + Actor174: v24 + Owner: Neutral + Location: 79,28 + Actor175: v36 + Owner: Neutral + Location: 73,32 + Actor176: v33 + Owner: Neutral + Location: 92,32 + Actor177: t18 + Owner: Neutral + Location: 85,29 + Actor178: v22 + Owner: Neutral + Location: 91,9 + Actor179: v29 + Owner: Neutral + Location: 83,17 + Actor180: v35 + Owner: Neutral + Location: 57,8 + Actor181: v34 + Owner: Neutral + Location: 85,8 + Actor182: v28 + Owner: Neutral + Location: 80,16 + Actor183: v28 + Owner: Neutral + Location: 68,28 + Actor184: v35 + Owner: Neutral + Location: 82,30 + Actor185: v29 + Owner: Neutral + Location: 76,32 + Actor186: tc01 + Owner: Neutral + Location: 67,23 + Actor187: t08 + Owner: Neutral + Location: 83,26 + Actor188: tc01 + Owner: Neutral + Location: 71,45 + Actor189: tc01 + Owner: Neutral + Location: 8,77 + Actor190: tc01 + Owner: Neutral + Location: 11,60 + Actor191: t08 + Owner: Neutral + Location: 31,47 + Actor192: t18 + Owner: Neutral + Location: 33,40 + Actor193: tc01 + Owner: Neutral + Location: 39,30 + Actor194: rock6 + Owner: Neutral + Location: 46,32 + Actor195: rock2 + Owner: Neutral + Location: 24,58 + Actor196: rock1 + Owner: Neutral + Location: 29,51 + Actor197: rock4 + Owner: Neutral + Location: 7,72 + Actor198: rock5 + Owner: Neutral + Location: 40,88 + Actor199: rock6 + Owner: Neutral + Location: 63,79 + Actor200: rock2 + Owner: Neutral + Location: 83,63 + Actor201: rock1 + Owner: Neutral + Location: 89,67 + Actor202: t18 + Owner: Neutral + Location: 83,71 + Actor203: t08 + Owner: Neutral + Location: 92,66 + Actor204: t04 + Owner: Neutral + Location: 72,67 + Actor205: tc01 + Owner: Neutral + Location: 79,91 + Actor206: t18 + Owner: Neutral + Location: 92,82 + Actor207: t08 + Owner: Neutral + Location: 80,86 + Actor208: split2 + Owner: Neutral + Location: 88,87 + Actor209: split2 + Owner: Neutral + Location: 93,60 + Actor210: split2 + Owner: Neutral + Location: 80,70 + Actor211: split2 + Owner: Neutral + Location: 78,45 + Actor212: c5 + Owner: Civilian + SubCell: 3 + Location: 9,11 + Facing: 856 + Actor213: c5 + Owner: Civilian + SubCell: 3 + Location: 27,11 + Facing: 166 + Actor214: c5 + Owner: Civilian + Facing: 384 + SubCell: 3 + Location: 19,90 + Actor215: c5 + Owner: Civilian + Facing: 384 + SubCell: 3 + Location: 28,86 + Actor216: c8 + Owner: Civilian + Facing: 384 + SubCell: 3 + Location: 22,90 + Actor217: c8 + Owner: Civilian + SubCell: 3 + Location: 18,83 + Facing: 214 + Actor218: c8 + Owner: Civilian + SubCell: 3 + Location: 11,15 + Facing: 467 + Actor219: c8 + Owner: Civilian + SubCell: 3 + Location: 18,6 + Facing: 555 + Actor220: c10 + Owner: Civilian + SubCell: 3 + Facing: 384 + Location: 21,5 + Actor221: c10 + Owner: Civilian + SubCell: 3 + Location: 23,88 + Facing: 0 + Actor222: c4 + Owner: Civilian + SubCell: 3 + Location: 14,87 + Facing: 515 + Actor223: c4 + Owner: Civilian + SubCell: 3 + Location: 25,14 + Facing: 697 + Actor224: c4 + Owner: Civilian + Facing: 384 + SubCell: 3 + Location: 10,8 + Actor225: c2 + Owner: Civilian + SubCell: 3 + Location: 26,93 + Facing: 0 + Actor226: c2 + Owner: Civilian + Facing: 384 + SubCell: 3 + Location: 20,14 + NodCamera4: c3 + Owner: Civilian + SubCell: 3 + Location: 15,12 + Facing: 384 + Actor228: c3 + Owner: Civilian + SubCell: 3 + Location: 26,83 + Facing: 658 + Actor255: s1 + Owner: Scrin + Facing: 384 + Location: 45,46 + SubCell: 3 + Actor256: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 45,44 + Actor293: devo + Owner: Scrin + Facing: 384 + Location: 56,81 + Actor299: devo + Owner: Scrin + Location: 63,53 + Facing: 222 + Actor306: gunw + Owner: Scrin + Facing: 384 + Location: 47,45 + Actor311: seek + Owner: Scrin + Facing: 384 + Location: 67,45 + Actor312: seek + Owner: Scrin + Facing: 384 + Location: 69,46 + Actor313: seek + Owner: Scrin + Location: 69,65 + Facing: 182 + Actor314: tpod + Owner: Scrin + Facing: 384 + Location: 70,44 + Actor316: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 45,47 + Actor325: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 67,46 + Actor330: gscr + Owner: Scrin + Facing: 384 + Location: 54,80 + SubCell: 3 + Actor343: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 47,46 + Actor338: s3 + Owner: Scrin + Facing: 384 + Location: 50,60 + SubCell: 3 + Actor346: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 56,49 + Actor348: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 64,53 + Actor349: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 63,54 + Actor350: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 65,52 + Actor351: gscr + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 62,56 + Actor352: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 65,53 + Actor354: s1 + Owner: Scrin + Facing: 384 + Location: 69,45 + SubCell: 1 + Actor356: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 71,44 + Actor360: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 71,85 + Actor361: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 72,84 + Actor362: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 72,82 + Actor363: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 69,66 + Actor372: intl.ai + Owner: Scrin + Facing: 384 + Location: 61,6 + Actor386: corr + Owner: Scrin + Facing: 384 + Location: 86,28 + Actor388: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 85,27 + Actor394: rtpd + Owner: Scrin + Facing: 384 + Location: 78,71 + Actor395: rtpd + Owner: Scrin + Location: 80,67 + Facing: 111 + Actor396: ltur + Owner: Nod + Location: 40,14 + TurretFacing: 904 + Actor397: ltur + Owner: Nod + Location: 40,10 + TurretFacing: 785 + Actor398: ltur + Owner: Nod + Location: 31,79 + TurretFacing: 650 + Actor399: n1 + Owner: Nod + SubCell: 3 + Location: 27,84 + Facing: 729 + Actor400: n1 + Owner: Nod + Location: 27,84 + SubCell: 1 + Facing: 816 + Actor401: n1 + Owner: Nod + SubCell: 3 + Location: 30,80 + Facing: 824 + Actor402: n1 + Owner: Nod + SubCell: 3 + Location: 29,89 + Facing: 0 + Actor403: n1 + Owner: Nod + SubCell: 3 + Location: 40,15 + Facing: 634 + Actor404: n1 + Owner: Nod + Facing: 384 + Location: 40,15 + SubCell: 1 + Actor405: n1 + Owner: Nod + SubCell: 3 + Location: 39,10 + Facing: 729 + Actor406: n1 + Owner: Nod + SubCell: 3 + Location: 38,8 + Facing: 745 + Actor407: proc.scrin + Owner: Scrin + Location: 87,76 + Actor408: scol + Owner: Scrin + Location: 79,81 + Actor409: scol + Owner: Scrin + Location: 87,65 + Actor410: rea2 + Owner: Scrin + Location: 93,74 + Actor411: rea2 + Owner: Scrin + Location: 90,72 + Actor412: silo.scrin + Owner: Scrin + Location: 91,76 + Actor413: ptur + Owner: Scrin + Location: 87,73 + Actor414: lace + Owner: Scrin + Location: 41,34 + Facing: 689 + Actor415: lace + Owner: Scrin + Location: 43,33 + Facing: 570 + Actor420: tc01 + Owner: Neutral + Location: 51,22 + Actor421: t04 + Owner: Neutral + Location: 48,27 + Actor422: hand + Owner: Nod + Location: 17,43 + PlayerStart: waypoint + Owner: Neutral + Location: 12,41 + Actor427: camera + Owner: Scrin + Location: 60,10 + Actor430: camera + Owner: Scrin + Location: 71,12 + Actor431: camera + Owner: Scrin + Location: 82,11 + Actor432: camera + Owner: Scrin + Location: 79,19 + Actor433: camera + Owner: Scrin + Location: 69,27 + Actor434: camera + Owner: Scrin + Location: 84,30 + Actor435: camera + Owner: Scrin + Location: 68,47 + Actor436: camera + Owner: Scrin + Location: 54,50 + Actor437: camera + Owner: Scrin + Location: 43,47 + Actor438: camera + Owner: Scrin + Location: 46,58 + Actor439: camera + Owner: Scrin + Location: 40,84 + Actor440: camera + Owner: Scrin + Location: 49,82 + Actor441: camera + Owner: Scrin + Location: 57,75 + Actor442: camera + Owner: Scrin + Location: 64,83 + Actor443: camera + Owner: Scrin + Location: 75,83 + Actor444: camera + Owner: Scrin + Location: 71,65 + Actor445: camera + Owner: Scrin + Location: 65,57 + Actor446: camera + Owner: Scrin + Location: 45,36 + Actor447: camera + Owner: Scrin + Location: 20,46 + Actor448: camera + Owner: Scrin + Location: 10,31 + Actor449: camera + Owner: Scrin + Location: 49,11 + Actor450: v26 + Owner: Neutral + Location: 15,72 + Actor451: v31 + Owner: Neutral + Location: 27,68 + Actor452: v24 + Owner: Neutral + Location: 11,66 + Actor453: v22 + Owner: Neutral + Location: 9,69 + Actor454: v36 + Owner: Neutral + Location: 25,72 + Actor455: v34 + Owner: Neutral + Location: 28,65 + Actor456: v23 + Owner: Neutral + Location: 18,65 + Actor457: v21 + Owner: Neutral + Location: 10,73 + Actor458: v20 + Owner: Neutral + Location: 18,63 + Actor459: v27 + Owner: Neutral + Location: 22,66 + Actor460: c8 + Owner: Civilian + Facing: 384 + SubCell: 3 + Location: 26,67 + Actor461: c10 + Owner: Civilian + Facing: 384 + SubCell: 3 + Location: 11,69 + Actor462: c4 + Owner: Civilian + SubCell: 3 + Facing: 384 + Location: 16,68 + Actor463: c5 + Owner: Civilian + SubCell: 3 + Facing: 384 + Location: 9,72 + Actor464: c9 + Owner: Civilian + Facing: 384 + SubCell: 3 + Location: 17,73 + Actor466: atmz + Owner: Scrin + Location: 71,83 + Facing: 253 + WormholeSpawn1a: waypoint + Owner: Neutral + Location: 24,9 + WormholeSpawn2b: waypoint + Owner: Neutral + Location: 75,11 + WormholeSpawn3a: waypoint + Owner: Neutral + Location: 61,26 + WormholeSpawn4b: waypoint + Owner: Neutral + Location: 43,34 + WormholeSpawn5a: waypoint + Owner: Neutral + Location: 59,53 + WormholeSpawn6a: waypoint + Owner: Neutral + Location: 62,70 + WormholeSpawn7a: waypoint + Owner: Neutral + Location: 31,85 + WormholeSpawn8a: waypoint + Owner: Neutral + Location: 84,35 + WormholeSpawn9a: waypoint + Owner: Neutral + Location: 50,86 + Actor467: camera + Owner: Nod + Location: 14,12 + NodCamera5: camera + Owner: Nod + Location: 24,12 + NodCamera6: camera + Owner: Nod + Location: 33,12 + NodCamera1: camera + Owner: Nod + Location: 13,72 + NodCamera2: camera + Owner: Nod + Location: 17,86 + NodCamera3: camera + Owner: Nod + Location: 25,85 + Actor472: bggy + Owner: Nod + Facing: 0 + Location: 4,42 + Actor473: bggy + Owner: Nod + Facing: 0 + Location: 5,42 + Actor474: bggy + Owner: Nod + Facing: 0 + Location: 4,43 + Actor475: bggy + Owner: Nod + Facing: 0 + Location: 5,43 + Actor476: ltnk + Owner: Nod + Facing: 0 + Location: 7,42 + Actor477: ltnk + Owner: Nod + Facing: 0 + Location: 9,42 + Actor478: ltnk + Owner: Nod + Facing: 0 + Location: 11,42 + Actor479: ftnk + Owner: Nod + Facing: 0 + Location: 8,43 + Actor480: ftnk + Owner: Nod + Facing: 0 + Location: 10,43 + Actor481: bike + Owner: Nod + Facing: 0 + Location: 13,42 + Actor482: bike + Owner: Nod + Facing: 0 + Location: 14,42 + Actor483: bike + Owner: Nod + Facing: 0 + Location: 13,43 + Actor484: bike + Owner: Nod + Facing: 0 + Location: 14,43 + Actor489: n3 + Owner: Nod + SubCell: 1 + Facing: 0 + Location: 7,46 + Actor490: n3 + Owner: Nod + SubCell: 2 + Facing: 0 + Location: 7,46 + Actor491: n3 + Owner: Nod + SubCell: 4 + Facing: 0 + Location: 7,46 + Actor492: n3 + Owner: Nod + SubCell: 5 + Facing: 0 + Location: 7,46 + Actor493: n3 + Owner: Nod + SubCell: 1 + Facing: 0 + Location: 11,46 + Actor494: n3 + Owner: Nod + SubCell: 2 + Facing: 0 + Location: 11,46 + Actor495: n3 + Owner: Nod + SubCell: 4 + Facing: 0 + Location: 11,46 + Actor496: n3 + Owner: Nod + SubCell: 5 + Facing: 0 + Location: 11,46 + Actor468: n1 + Owner: Nod + SubCell: 1 + Facing: 0 + Location: 7,44 + Actor469: n1 + Owner: Nod + SubCell: 2 + Facing: 0 + Location: 7,44 + Actor470: n1 + Owner: Nod + SubCell: 4 + Facing: 0 + Location: 7,44 + Actor471: n1 + Owner: Nod + SubCell: 5 + Facing: 0 + Location: 7,44 + Actor485: n1 + Owner: Nod + SubCell: 1 + Facing: 0 + Location: 9,44 + Actor486: n1 + Owner: Nod + SubCell: 2 + Facing: 0 + Location: 9,44 + Actor487: n1 + Owner: Nod + SubCell: 4 + Facing: 0 + Location: 9,44 + Actor488: n1 + Owner: Nod + SubCell: 5 + Facing: 0 + Location: 9,44 + Actor497: n1 + Owner: Nod + SubCell: 1 + Facing: 0 + Location: 11,44 + Actor498: n1 + Owner: Nod + SubCell: 2 + Facing: 0 + Location: 11,44 + Actor499: n1 + Owner: Nod + SubCell: 4 + Facing: 0 + Location: 11,44 + Actor500: n1 + Owner: Nod + SubCell: 5 + Facing: 0 + Location: 11,44 + Actor501: n4 + Owner: Nod + SubCell: 1 + Facing: 0 + Location: 9,46 + Actor502: n4 + Owner: Nod + SubCell: 2 + Facing: 0 + Location: 9,46 + Actor503: n4 + Owner: Nod + SubCell: 4 + Facing: 0 + Location: 9,46 + Actor504: n4 + Owner: Nod + SubCell: 5 + Facing: 0 + Location: 9,46 + Actor505: mech + Owner: Nod + SubCell: 1 + Location: 9,48 + Facing: 0 + Actor506: mech + Owner: Nod + SubCell: 2 + Location: 9,48 + Facing: 0 + Actor507: mech + Owner: Nod + SubCell: 4 + Location: 9,48 + Facing: 0 + Actor508: mech + Owner: Nod + SubCell: 5 + Location: 9,48 + Facing: 0 + Actor509: airs + Owner: Nod + Location: 9,37 + Actor510: oilb + Owner: Nod + Location: 26,37 + Actor511: oilb + Owner: Neutral + Location: 38,3 + Actor512: oilb + Owner: Neutral + Location: 34,66 + Actor513: oilb + Owner: Neutral + Location: 48,67 + Actor514: oilb + Owner: Neutral + Location: 62,88 + Actor515: oilb + Owner: Neutral + Location: 85,43 + Actor516: oilb + Owner: Neutral + Location: 79,8 + Actor517: v26 + Owner: Neutral + Location: 82,9 + Actor518: v20 + Owner: Neutral + Location: 90,6 + Actor519: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 45,48 + Actor522: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 46,47 + Actor523: s3 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 46,47 + Actor521: s1 + Owner: Scrin + SubCell: 3 + Facing: 229 + Location: 55,49 + Actor525: s1 + Owner: Scrin + SubCell: 3 + Facing: 285 + Location: 55,51 + Actor526: s1 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 55,49 + Actor527: s2 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 55,51 + Actor524: oilb + Owner: Neutral + Location: 66,54 + Actor528: intl + Owner: Scrin + Location: 48,60 + Facing: 23 + Actor529: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 49,61 + Actor530: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 46,62 + Actor531: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 47,61 + Actor532: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 45,61 + Actor465: s4 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 64,55 + Actor533: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 64,54 + Actor534: gscr + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 45,33 + Actor535: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 41,35 + Actor536: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 44,32 + Actor537: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 42,33 + Actor538: s3 + Owner: Scrin + Facing: 384 + Location: 43,32 + SubCell: 3 + Actor539: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 70,64 + Actor540: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 68,44 + Actor541: s3 + Owner: Scrin + Facing: 384 + Location: 70,46 + SubCell: 3 + Actor542: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 39,87 + Actor543: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 40,86 + Actor544: seek + Owner: Scrin + Facing: 384 + Location: 41,87 + Actor545: seek + Owner: Scrin + Facing: 384 + Location: 40,89 + Actor546: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 39,89 + Actor547: s3 + Owner: Scrin + Facing: 384 + Location: 40,87 + SubCell: 3 + Actor548: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 54,81 + Actor549: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 55,80 + Actor551: devo + Owner: Scrin + Facing: 384 + Location: 54,83 + Actor552: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 55,82 + Actor423: lchr + Owner: Scrin + Location: 54,69 + Facing: 507 + Actor424: lchr + Owner: Scrin + Facing: 384 + Location: 56,69 + Actor425: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 55,68 + Actor426: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 52,70 + Actor428: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 57,70 + Actor429: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 55,69 + Actor550: s1 + Owner: Scrin + Facing: 384 + Location: 53,69 + SubCell: 3 + Actor553: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 55,70 + Actor554: gunw + Owner: Scrin + Facing: 384 + Location: 63,74 + Actor555: gunw + Owner: Scrin + Facing: 384 + Location: 63,76 + Actor556: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 63,75 + Actor557: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 64,74 + Actor558: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 64,77 + Actor559: s1 + Owner: Scrin + Facing: 384 + Location: 62,74 + SubCell: 3 + Actor560: intl + Owner: Scrin + Location: 70,84 + Facing: 253 + Actor561: intl + Owner: Scrin + Location: 46,60 + Facing: 7 + Actor563: n6 + Owner: Nod + Location: 11,48 + SubCell: 1 + Facing: 0 + Actor564: n6 + Owner: Nod + Location: 11,48 + SubCell: 2 + Facing: 0 + Actor562: intl + Owner: Scrin + Location: 69,67 + Facing: 214 + Actor565: stcr + Owner: Scrin + Facing: 384 + Location: 86,39 + Actor566: stcr + Owner: Scrin + Facing: 261 + Location: 88,36 + Actor567: s4 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 87,40 + Actor568: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 89,37 + Actor569: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 87,39 + Actor570: s3 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 87,39 + Actor571: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 89,38 + Actor572: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 87,36 + Actor573: gscr + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 86,37 + Actor574: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 88,38 + Actor575: devo + Owner: Scrin + Facing: 384 + Location: 74,34 + Actor576: tpod + Owner: Scrin + Facing: 166 + Location: 76,31 + Actor577: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 74,33 + Actor578: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 76,34 + Actor579: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 74,32 + Actor580: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 77,32 + Actor581: s4 + Owner: Scrin + Facing: 384 + Location: 75,32 + SubCell: 3 + Actor582: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 74,31 + Actor583: seek + Owner: Scrin + Facing: 384 + Location: 76,33 + Actor584: gscr + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 87,29 + Actor585: s2 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 87,27 + Actor586: s2 + Owner: Scrin + Facing: 384 + Location: 87,27 + SubCell: 1 + Actor587: s2 + Owner: Scrin + SubCell: 3 + Location: 86,26 + Facing: 384 + Actor588: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 85,28 + Actor589: s1 + Owner: Scrin + Facing: 384 + Location: 87,28 + SubCell: 3 + Actor590: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 89,29 + Actor591: ruin + Owner: Scrin + Location: 64,25 + Facing: 586 + Actor592: ruin + Owner: Scrin + Location: 66,23 + Facing: 507 + Actor593: shrw + Owner: Scrin + Location: 66,25 + Facing: 523 + Actor594: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 65,24 + Actor595: s1 + Owner: Scrin + Facing: 384 + Location: 65,24 + SubCell: 1 + Actor596: s1 + Owner: Scrin + Facing: 384 + Location: 65,23 + SubCell: 3 + Actor597: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 63,26 + Actor598: s1 + Owner: Scrin + Facing: 384 + Location: 67,25 + SubCell: 3 + Actor599: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 66,24 + Actor600: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 62,25 + Actor601: gscr + Owner: Scrin + Facing: 384 + Location: 75,33 + SubCell: 3 + Actor602: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 57,14 + Actor603: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 58,14 + Actor604: s1 + Owner: Scrin + Facing: 384 + Location: 58,14 + SubCell: 1 + Actor605: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 57,13 + Actor606: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 57,15 + Actor607: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 59,15 + Actor608: s1 + Owner: Scrin + Facing: 384 + Location: 59,16 + SubCell: 3 + Actor609: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 59,14 + Actor610: s3 + Owner: Scrin + Facing: 384 + Location: 58,15 + SubCell: 3 + Actor611: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 61,5 + Actor612: s4 + Owner: Scrin + Facing: 384 + Location: 61,5 + SubCell: 1 + Actor613: s4 + Owner: Scrin + Facing: 384 + Location: 62,6 + SubCell: 3 + Actor614: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 62,7 + Actor615: s3 + Owner: Scrin + Facing: 384 + Location: 60,6 + SubCell: 3 + Actor616: seek + Owner: Scrin + Facing: 384 + Location: 63,5 + Actor617: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 72,9 + Actor618: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 73,11 + Actor619: devo + Owner: Scrin + Facing: 384 + Location: 73,10 + Actor622: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 75,10 + Actor623: s3 + Owner: Scrin + Facing: 384 + Location: 73,8 + SubCell: 3 + Actor624: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 70,8 + Actor620: intl + Owner: Scrin + Facing: 384 + Location: 72,8 + Actor621: intl + Owner: Scrin + Location: 65,56 + Facing: 198 + Actor625: intl + Owner: Scrin + Location: 68,85 + Facing: 245 + Actor626: tpod + Owner: Scrin + Facing: 384 + Location: 65,55 + Actor627: corr + Owner: Scrin + Facing: 214 + Location: 54,52 + Actor628: corr + Owner: Scrin + Facing: 261 + Location: 55,50 + WormholeSpawn1b: waypoint + Owner: Neutral + Location: 15,5 + WormholeSpawn1c: waypoint + Owner: Neutral + Location: 32,17 + WormholeSpawn2c: waypoint + Owner: Neutral + Location: 86,12 + WormholeSpawn2a: waypoint + Owner: Neutral + Location: 67,15 + WormholeSpawn3b: waypoint + Owner: Neutral + Location: 76,27 + WormholeSpawn3c: waypoint + Owner: Neutral + Location: 85,25 + WormholeSpawn8b: waypoint + Owner: Neutral + Location: 90,43 + WormholeSpawn8c: waypoint + Owner: Neutral + Location: 77,38 + WormholeSpawn4a: waypoint + Owner: Neutral + Location: 42,30 + WormholeSpawn4c: waypoint + Owner: Neutral + Location: 43,41 + WormholeSpawn5c: waypoint + Owner: Neutral + Location: 53,61 + WormholeSpawn6b: waypoint + Owner: Neutral + Location: 50,70 + WormholeSpawn6c: waypoint + Owner: Neutral + Location: 62,78 + WormholeSpawn9b: waypoint + Owner: Neutral + Location: 59,90 + WormholeSpawn9c: waypoint + Owner: Neutral + Location: 44,80 + WormholeSpawn7b: waypoint + Owner: Neutral + Location: 24,70 + WormholeSpawn7c: waypoint + Owner: Neutral + Location: 16,90 + TopBoundary: waypoint + Owner: Neutral + Location: 42,10 + BottomBoundary: waypoint + Owner: Neutral + Location: 32,83 + TopTownCenter: waypoint + Owner: Neutral + Location: 16,15 + BottomTownCenter: waypoint + Owner: Neutral + Location: 21,85 + WormholeSpawn7d: waypoint + Owner: Neutral + Location: 11,76 + WormholeSpawn4e: waypoint + Owner: Neutral + Location: 40,60 + WormholeSpawn5b: waypoint + Owner: Neutral + Location: 58,44 + WormholeSpawn7e: waypoint + Owner: Neutral + Location: 35,70 + WormholeSpawn1d: waypoint + Owner: Neutral + Location: 6,10 + WormholeSpawn2d: waypoint + Owner: Neutral + Location: 64,6 + WormholeSpawn4d: waypoint + Owner: Neutral + Location: 30,54 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-covenants.yaml, ca|missions/main-campaign/ca09-salvation/salvation-rules.yaml, ca|rules/custom/coop-rules.yaml, salvation-coop-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/coop-campaign/ca09-salvation-coop/salvation-coop-rules.yaml b/mods/ca/missions/coop-campaign/ca09-salvation-coop/salvation-coop-rules.yaml new file mode 100644 index 0000000000..d5ebf8e6b9 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca09-salvation-coop/salvation-coop-rules.yaml @@ -0,0 +1,11 @@ +World: + LuaScript: + Scripts: campaign.lua, coop.lua, ca|missions/main-campaign/ca09-salvation/salvation.lua, salvation-coop.lua + ScriptLobbyDropdown@basesharing: + Values: + -0: + Default: 1 + Locked: True + LobbyMissionInfo@InitialObjectives: + Prefix: Initial Objectives + Text: • Eliminate all Scrin forces. diff --git a/mods/ca/missions/coop-campaign/ca09-salvation-coop/salvation-coop.lua b/mods/ca/missions/coop-campaign/ca09-salvation-coop/salvation-coop.lua new file mode 100644 index 0000000000..70b978854d --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca09-salvation-coop/salvation-coop.lua @@ -0,0 +1,30 @@ + +SetupPlayers = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Multi2 = Player.GetPlayer("Multi2") + Multi3 = Player.GetPlayer("Multi3") + Multi4 = Player.GetPlayer("Multi4") + Multi5 = Player.GetPlayer("Multi5") + Nod = Player.GetPlayer("Nod") + Scrin = Player.GetPlayer("Scrin") + Civilian = Player.GetPlayer("Civilian") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = Utils.Where({ Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 }, function(p) return p ~= nil end) + MissionEnemies = { Scrin } + SinglePlayerPlayer = Nod + CoopInit() +end + +AfterWorldLoaded = function() + local firstActivePlayer = GetFirstActivePlayer() + TransferBaseToPlayer(SinglePlayerPlayer, firstActivePlayer) + Utils.Do(Nod.GetActorsByTypes({"hosp", "oilb"}), function(a) + a.Owner = firstActivePlayer + end) + StartCashSpread(0) +end + +AfterTick = function() + +end diff --git a/mods/ca/missions/coop-campaign/ca10-zenith-coop/map.bin b/mods/ca/missions/coop-campaign/ca10-zenith-coop/map.bin new file mode 100644 index 0000000000..6a8bcf900a Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca10-zenith-coop/map.bin differ diff --git a/mods/ca/missions/coop-campaign/ca10-zenith-coop/map.png b/mods/ca/missions/coop-campaign/ca10-zenith-coop/map.png new file mode 100644 index 0000000000..ca21fea450 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca10-zenith-coop/map.png differ diff --git a/mods/ca/missions/coop-campaign/ca10-zenith-coop/map.yaml b/mods/ca/missions/coop-campaign/ca10-zenith-coop/map.yaml new file mode 100644 index 0000000000..5f6a5bc649 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca10-zenith-coop/map.yaml @@ -0,0 +1,4521 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 10: Zenith Co-op + +Author: Darkademic & Gandorques Hikla + +Tileset: SNOW + +MapSize: 114,114 + +Bounds: 1,1,112,112 + +Visibility: Lobby + +Categories: Co-op Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, USSR, USSRUnits + PlayerReference@Nod: + Name: Nod + Faction: nod + Color: FE1100 + Allies: Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, USSRUnits, Creeps + PlayerReference@USSR: + Name: USSR + Bot: campaign + Faction: soviet + Color: 994050 + Allies: USSRUnits + Enemies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@USSRUnits: + Name: USSRUnits + Bot: campaign + Faction: soviet + Color: 994050 + Allies: USSR + Enemies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: FE1100 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, USSRUnits, Creeps + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: 0B7310 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, USSRUnits, Creeps + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: 134691 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, USSRUnits, Creeps + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: 775A12 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, USSRUnits, Creeps + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: 82C900 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, USSRUnits, Creeps + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: EEA8A8 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, USSRUnits, Creeps + +Actors: + Airfield2: afld + Owner: USSR + Location: 72,21 + Airfield3: afld + Owner: USSR + Location: 72,24 + Actor18: sam + Owner: USSR + Location: 54,25 + Actor19: sam + Owner: USSR + Location: 60,25 + Actor24: sam + Owner: USSR + Location: 57,27 + Airfield4: afld + Owner: USSR + Location: 72,27 + Actor30: brik + Owner: USSR + Location: 55,28 + Actor31: brik + Owner: USSR + Location: 56,28 + Actor32: brik + Owner: USSR + Location: 57,28 + Actor33: brik + Owner: USSR + Location: 58,28 + Actor34: brik + Owner: USSR + Location: 59,28 + Actor35: brik + Owner: USSR + Location: 60,28 + Actor38: brik + Owner: USSR + Location: 55,29 + Actor39: barb + Owner: USSR + Location: 56,29 + Actor40: barb + Owner: USSR + Location: 57,29 + Actor41: barb + Owner: USSR + Location: 58,29 + Actor42: barb + Owner: USSR + Location: 59,29 + Actor43: brik + Owner: USSR + Location: 60,29 + Actor45: brik + Owner: USSR + Location: 55,30 + Actor46: barb + Owner: USSR + Location: 56,30 + NukeSilo1: mslo + Owner: USSR + Location: 57,30 + Actor48: barb + Owner: USSR + Location: 59,30 + Actor49: brik + Owner: USSR + Location: 60,30 + Airfield5: afld + Owner: USSR + Location: 72,30 + Actor54: brik + Owner: USSR + Location: 55,31 + Actor55: barb + Owner: USSR + Location: 56,31 + Actor56: barb + Owner: USSR + Location: 57,31 + Actor57: barb + Owner: USSR + Location: 58,31 + Actor58: barb + Owner: USSR + Location: 59,31 + Actor59: brik + Owner: USSR + Location: 60,31 + Actor61: sam + Owner: USSR + Location: 51,32 + Actor62: brik + Owner: USSR + Location: 55,32 + Actor63: barb + Owner: USSR + Location: 56,32 + NukeSilo2: mslo + Owner: USSR + Location: 57,32 + Actor65: barb + Owner: USSR + Location: 59,32 + Actor66: brik + Owner: USSR + Location: 60,32 + Actor69: brik + Owner: USSR + Location: 55,33 + Actor70: barb + Owner: USSR + Location: 56,33 + Actor71: barb + Owner: USSR + Location: 57,33 + Actor72: barb + Owner: USSR + Location: 58,33 + Actor73: barb + Owner: USSR + Location: 59,33 + Actor74: brik + Owner: USSR + Location: 60,33 + Helipad1: hpad + Owner: USSR + Location: 77,33 + Helipad2: hpad + Owner: USSR + Location: 80,33 + Helipad3: hpad + Owner: USSR + Location: 83,33 + Actor82: brik + Owner: USSR + Location: 55,34 + Actor83: barb + Owner: USSR + Location: 56,34 + NukeSilo3: mslo + Owner: USSR + Location: 57,34 + Actor85: barb + Owner: USSR + Location: 59,34 + Actor86: brik + Owner: USSR + Location: 60,34 + Actor87: tsla + Owner: USSR + Location: 61,34 + Actor88: sam + Owner: USSR + Location: 67,34 + Actor91: brik + Owner: USSR + Location: 55,35 + Actor92: barb + Owner: USSR + Location: 56,35 + Actor93: barb + Owner: USSR + Location: 57,35 + Actor94: barb + Owner: USSR + Location: 58,35 + Actor95: barb + Owner: USSR + Location: 59,35 + Actor96: brik + Owner: USSR + Location: 60,35 + Actor99: brik + Owner: USSR + Location: 55,36 + Actor100: barb + Owner: USSR + Location: 56,36 + NukeSilo4: mslo + Owner: USSR + Location: 57,36 + Actor102: barb + Owner: USSR + Location: 59,36 + Actor103: brik + Owner: USSR + Location: 60,36 + Actor104: brik + Owner: USSR + Location: 64,36 + Actor105: brik + Owner: USSR + Location: 65,36 + Actor106: brik + Owner: USSR + Location: 66,36 + Actor107: brik + Owner: USSR + Location: 32,37 + Actor113: brik + Owner: USSR + Location: 55,37 + Actor114: barb + Owner: USSR + Location: 56,37 + Actor115: barb + Owner: USSR + Location: 57,37 + Actor116: barb + Owner: USSR + Location: 58,37 + Actor117: barb + Owner: USSR + Location: 59,37 + Actor118: brik + Owner: USSR + Location: 60,37 + Actor119: brik + Owner: USSR + Location: 63,37 + Actor120: brik + Owner: USSR + Location: 64,37 + Actor121: brik + Owner: USSR + Location: 66,37 + Actor122: brik + Owner: USSR + Location: 67,37 + Actor123: brik + Owner: USSR + Location: 68,37 + Actor124: brik + Owner: USSR + Location: 69,37 + OuterSAM10: sam + Owner: USSR + Location: 76,37 + Actor126: brik + Owner: USSR + Location: 32,38 + Actor132: brik + Owner: USSR + Location: 55,38 + Actor133: sam + Owner: USSR + Location: 56,38 + Actor134: sam + Owner: USSR + Location: 58,38 + Actor135: brik + Owner: USSR + Location: 60,38 + Actor136: brik + Owner: USSR + Location: 63,38 + Actor137: brik + Owner: USSR + Location: 64,38 + Actor138: brik + Owner: USSR + Location: 69,38 + Actor139: brik + Owner: USSR + Location: 32,39 + Actor140: brik + Owner: USSR + Location: 33,39 + Actor141: brik + Owner: USSR + Location: 34,39 + Actor142: brik + Owner: USSR + Location: 35,39 + Actor143: brik + Owner: USSR + Location: 36,39 + Actor144: brik + Owner: USSR + Location: 37,39 + Actor146: brik + Owner: USSR + Location: 55,39 + Actor147: brik + Owner: USSR + Location: 56,39 + Actor148: brik + Owner: USSR + Location: 59,39 + Actor149: brik + Owner: USSR + Location: 60,39 + Actor150: brik + Owner: USSR + Location: 69,39 + Actor151: brik + Owner: USSR + Location: 70,39 + Actor152: brik + Owner: USSR + Location: 37,40 + Actor153: brik + Owner: USSR + Location: 38,40 + Actor154: brik + Owner: USSR + Location: 39,40 + Actor155: brik + Owner: USSR + Location: 40,40 + Actor158: brik + Owner: USSR + Location: 55,40 + Actor159: brik + Owner: USSR + Location: 56,40 + Actor160: brik + Owner: USSR + Location: 59,40 + Actor161: brik + Owner: USSR + Location: 60,40 + Actor162: brik + Owner: USSR + Location: 70,40 + Actor163: ftur + Owner: USSR + Location: 56,41 + Actor164: ftur + Owner: USSR + Location: 59,41 + Actor165: brik + Owner: USSR + Location: 70,41 + Actor166: brik + Owner: USSR + Location: 34,42 + Actor167: brik + Owner: USSR + Location: 35,42 + Actor168: brik + Owner: USSR + Location: 36,42 + Actor169: tsla + Owner: USSR + Location: 54,42 + Actor170: brik + Owner: USSR + Location: 70,42 + SubPen1: spen + Owner: USSR + Location: 17,43 + Actor173: brik + Owner: USSR + Location: 34,43 + Actor174: brik + Owner: USSR + Location: 36,43 + Actor175: brik + Owner: USSR + Location: 37,43 + Actor176: brik + Owner: USSR + Location: 38,43 + Actor177: brik + Owner: USSR + Location: 39,43 + Actor178: brik + Owner: USSR + Location: 40,43 + Actor179: brik + Owner: USSR + Location: 41,43 + Actor180: brik + Owner: USSR + Location: 42,43 + Actor181: brik + Owner: USSR + Location: 43,43 + Actor182: brik + Owner: USSR + Location: 44,43 + Actor183: brik + Owner: USSR + Location: 45,43 + Actor184: brik + Owner: USSR + Location: 46,43 + Actor185: brik + Owner: USSR + Location: 47,43 + Actor186: fact + Owner: USSR + Location: 62,43 + Actor187: brik + Owner: USSR + Location: 70,43 + Actor188: brik + Owner: USSR + Location: 71,43 + SubPen2: spen + Owner: USSR + Location: 92,43 + Actor192: brik + Owner: USSR + Location: 46,44 + Actor193: brik + Owner: USSR + Location: 47,44 + Actor194: sam + Owner: USSR + Location: 58,44 + Actor195: brik + Owner: USSR + Location: 71,44 + Actor196: brik + Owner: USSR + Location: 33,45 + Actor197: brik + Owner: USSR + Location: 71,45 + Actor198: brik + Owner: USSR + Location: 31,46 + Actor199: brik + Owner: USSR + Location: 32,46 + Actor200: brik + Owner: USSR + Location: 33,46 + Actor201: brik + Owner: USSR + Location: 69,46 + Actor202: brik + Owner: USSR + Location: 70,46 + Actor203: brik + Owner: USSR + Location: 71,46 + Actor204: brik + Owner: USSR + Location: 30,47 + Actor205: brik + Owner: USSR + Location: 31,47 + Actor206: brik + Owner: USSR + Location: 33,47 + Actor207: brik + Owner: USSR + Location: 34,47 + Actor208: brik + Owner: USSR + Location: 35,47 + Actor209: brik + Owner: USSR + Location: 36,47 + Actor210: brik + Owner: USSR + Location: 37,47 + Actor211: brik + Owner: USSR + Location: 38,47 + Actor212: brik + Owner: USSR + Location: 69,47 + Actor213: brik + Owner: USSR + Location: 30,48 + Actor214: brik + Owner: USSR + Location: 31,48 + Actor215: brik + Owner: USSR + Location: 32,48 + Actor216: brik + Owner: USSR + Location: 33,48 + Actor217: brik + Owner: USSR + Location: 38,48 + Actor218: brik + Owner: USSR + Location: 39,48 + Actor219: brik + Owner: USSR + Location: 42,48 + Actor220: brik + Owner: USSR + Location: 43,48 + Actor221: brik + Owner: USSR + Location: 47,48 + Actor222: brik + Owner: USSR + Location: 48,48 + Actor223: brik + Owner: USSR + Location: 50,48 + Actor224: brik + Owner: USSR + Location: 51,48 + Actor225: brik + Owner: USSR + Location: 68,48 + Actor226: brik + Owner: USSR + Location: 69,48 + Actor227: brik + Owner: USSR + Location: 38,49 + Actor228: brik + Owner: USSR + Location: 39,49 + Actor229: brik + Owner: USSR + Location: 40,49 + Actor230: brik + Owner: USSR + Location: 42,49 + Actor231: brik + Owner: USSR + Location: 43,49 + Actor232: brik + Owner: USSR + Location: 47,49 + Actor233: brik + Owner: USSR + Location: 48,49 + Actor234: brik + Owner: USSR + Location: 49,49 + Actor235: brik + Owner: USSR + Location: 50,49 + Actor236: brik + Owner: USSR + Location: 51,49 + Actor237: brik + Owner: USSR + Location: 68,49 + Actor238: brik + Owner: USSR + Location: 40,50 + Actor239: brik + Owner: USSR + Location: 41,50 + Actor240: brik + Owner: USSR + Location: 42,50 + Actor241: brik + Owner: USSR + Location: 68,50 + Actor242: brik + Owner: USSR + Location: 42,51 + Actor243: brik + Owner: USSR + Location: 68,51 + Actor244: brik + Owner: USSR + Location: 42,52 + Actor245: brik + Owner: USSR + Location: 68,52 + Actor246: brik + Owner: USSR + Location: 42,53 + Actor247: brik + Owner: USSR + Location: 43,53 + Actor248: brik + Owner: USSR + Location: 44,53 + Actor249: brik + Owner: USSR + Location: 45,53 + Actor250: brik + Owner: USSR + Location: 60,53 + Actor251: brik + Owner: USSR + Location: 61,53 + Actor252: tsla + Owner: USSR + Location: 62,53 + Actor253: brik + Owner: USSR + Location: 63,53 + Actor254: brik + Owner: USSR + Location: 64,53 + Actor255: brik + Owner: USSR + Location: 67,53 + Actor256: brik + Owner: USSR + Location: 68,53 + Actor257: brik + Owner: USSR + Location: 45,54 + Actor258: brik + Owner: USSR + Location: 59,54 + Actor259: brik + Owner: USSR + Location: 60,54 + Actor260: brik + Owner: USSR + Location: 61,54 + Actor261: brik + Owner: USSR + Location: 62,54 + Actor262: brik + Owner: USSR + Location: 63,54 + Actor263: brik + Owner: USSR + Location: 64,54 + Actor264: brik + Owner: USSR + Location: 67,54 + Actor265: brik + Owner: USSR + Location: 68,54 + Actor266: brik + Owner: USSR + Location: 45,55 + Actor267: brik + Owner: USSR + Location: 58,55 + Actor268: brik + Owner: USSR + Location: 59,55 + Actor269: brik + Owner: USSR + Location: 45,56 + Actor270: brik + Owner: USSR + Location: 58,56 + Actor271: brik + Owner: USSR + Location: 45,57 + Actor272: brik + Owner: USSR + Location: 58,57 + Actor273: brik + Owner: USSR + Location: 45,58 + Actor274: brik + Owner: USSR + Location: 57,58 + Actor275: brik + Owner: USSR + Location: 58,58 + Actor276: brik + Owner: USSR + Location: 45,59 + Actor277: brik + Owner: USSR + Location: 46,59 + Actor278: brik + Owner: USSR + Location: 47,59 + Actor279: brik + Owner: USSR + Location: 56,59 + Actor280: brik + Owner: USSR + Location: 57,59 + Actor281: brik + Owner: USSR + Location: 58,59 + Actor282: brik + Owner: USSR + Location: 47,60 + Actor283: brik + Owner: USSR + Location: 48,60 + Actor284: brik + Owner: USSR + Location: 49,60 + Actor285: brik + Owner: USSR + Location: 52,60 + Actor286: brik + Owner: USSR + Location: 53,60 + Actor287: brik + Owner: USSR + Location: 54,60 + Actor288: brik + Owner: USSR + Location: 55,60 + Actor289: brik + Owner: USSR + Location: 56,60 + Actor290: brik + Owner: USSR + Location: 19,61 + Actor291: brik + Owner: USSR + Location: 20,61 + Actor292: brik + Owner: USSR + Location: 49,61 + Actor293: tsla + Owner: USSR + Location: 50,61 + Actor294: tsla + Owner: USSR + Location: 51,61 + Actor295: brik + Owner: USSR + Location: 52,61 + Actor296: brik + Owner: USSR + Location: 19,62 + Actor297: brik + Owner: USSR + Location: 20,62 + Actor298: brik + Owner: USSR + Location: 49,62 + Actor299: brik + Owner: USSR + Location: 50,62 + Actor300: brik + Owner: USSR + Location: 51,62 + Actor301: brik + Owner: USSR + Location: 52,62 + Actor302: brik + Owner: USSR + Location: 19,63 + Actor303: brik + Owner: USSR + Location: 77,63 + Actor304: brik + Owner: USSR + Location: 78,63 + Actor305: brik + Owner: USSR + Location: 19,64 + Actor306: brik + Owner: USSR + Location: 20,64 + Actor307: brik + Owner: USSR + Location: 76,64 + Actor308: brik + Owner: USSR + Location: 77,64 + Actor309: brik + Owner: USSR + Location: 78,64 + Actor310: brik + Owner: USSR + Location: 20,65 + OuterTesla1: tsla + Owner: USSR + Location: 21,65 + Actor313: brik + Owner: USSR + Location: 71,65 + Actor314: brik + Owner: USSR + Location: 72,65 + Actor315: brik + Owner: USSR + Location: 73,65 + Actor316: brik + Owner: USSR + Location: 74,65 + Actor317: brik + Owner: USSR + Location: 75,65 + Actor318: brik + Owner: USSR + Location: 76,65 + Actor319: brik + Owner: USSR + Location: 86,65 + Actor320: brik + Owner: USSR + Location: 87,65 + Actor321: brik + Owner: USSR + Location: 20,66 + Actor322: brik + Owner: USSR + Location: 21,66 + Actor323: brik + Owner: USSR + Location: 25,66 + Actor324: brik + Owner: USSR + Location: 26,66 + OuterTesla8: tsla + Owner: USSR + Location: 67,66 + Actor326: brik + Owner: USSR + Location: 71,66 + Actor327: brik + Owner: USSR + Location: 85,66 + Actor328: brik + Owner: USSR + Location: 86,66 + Actor329: brik + Owner: USSR + Location: 87,66 + Actor330: brik + Owner: USSR + Location: 20,67 + Actor331: brik + Owner: USSR + Location: 21,67 + Actor332: brik + Owner: USSR + Location: 25,67 + Actor333: brik + Owner: USSR + Location: 26,67 + Actor334: brik + Owner: USSR + Location: 70,67 + Actor335: brik + Owner: USSR + Location: 71,67 + Actor336: brik + Owner: USSR + Location: 85,67 + Actor337: brik + Owner: USSR + Location: 70,68 + Actor338: brik + Owner: USSR + Location: 71,68 + Actor339: brik + Owner: USSR + Location: 84,68 + Actor340: brik + Owner: USSR + Location: 85,68 + Actor341: brik + Owner: USSR + Location: 70,69 + Actor342: brik + Owner: USSR + Location: 71,69 + Actor343: brik + Owner: USSR + Location: 84,69 + Actor344: brik + Owner: USSR + Location: 76,70 + Actor345: brik + Owner: USSR + Location: 77,70 + Actor346: brik + Owner: USSR + Location: 78,70 + Actor347: brik + Owner: USSR + Location: 79,70 + Actor348: brik + Owner: USSR + Location: 80,70 + Actor349: brik + Owner: USSR + Location: 81,70 + Actor350: brik + Owner: USSR + Location: 82,70 + Actor351: brik + Owner: USSR + Location: 83,70 + Actor352: brik + Owner: USSR + Location: 84,70 + Actor353: brik + Owner: USSR + Location: 76,71 + Actor354: brik + Owner: USSR + Location: 73,72 + Actor355: brik + Owner: USSR + Location: 74,72 + OuterTesla9: tsla + Owner: USSR + Location: 75,72 + Actor357: brik + Owner: USSR + Location: 76,72 + Actor358: brik + Owner: USSR + Location: 73,73 + Actor359: brik + Owner: USSR + Location: 74,73 + Actor360: brik + Owner: USSR + Location: 75,73 + Actor361: brik + Owner: USSR + Location: 76,73 + Actor362: oilb + Owner: Neutral + Location: 93,95 + Actor363: t15 + Owner: Neutral + Location: 95,94 + Actor364: t03 + Owner: Neutral + Location: 91,97 + Actor366: barl + Owner: Creeps + Location: 92,95 + Actor367: brl3 + Owner: Creeps + Location: 92,96 + Actor368: barl + Owner: Creeps + Location: 91,96 + Actor369: spen.nod + Owner: Nod + Location: 22,94 + Actor372: gun.nod + Owner: Nod + Location: 30,98 + TurretFacing: 0 + Actor373: gun.nod + Owner: Nod + Location: 47,100 + TurretFacing: 71 + Actor374: gun.nod + Owner: Nod + Location: 55,99 + TurretFacing: 943 + Actor375: gun.nod + Owner: Nod + Location: 62,102 + TurretFacing: 793 + Actor376: gun.nod + Owner: Nod + Location: 13,98 + TurretFacing: 911 + Actor379: brik + Owner: Nod + Location: 17,100 + Actor380: brik + Owner: Nod + Location: 17,101 + Actor381: brik + Owner: Nod + Location: 17,102 + Actor382: brik + Owner: Nod + Location: 17,103 + Actor383: brik + Owner: Nod + Location: 18,100 + Actor384: brik + Owner: Nod + Location: 19,100 + Actor385: brik + Owner: Nod + Location: 20,100 + Actor386: brik + Owner: Nod + Location: 21,100 + Actor387: brik + Owner: Nod + Location: 22,100 + Actor388: brik + Owner: Nod + Location: 23,100 + Actor390: brik + Owner: Nod + Location: 24,100 + Actor393: brik + Owner: Nod + Location: 24,101 + Actor391: brik + Owner: Nod + Location: 33,100 + Actor392: brik + Owner: Nod + Location: 33,101 + Actor395: brik + Owner: Nod + Location: 34,100 + Actor396: brik + Owner: Nod + Location: 34,101 + Actor397: brik + Owner: Nod + Location: 35,100 + Actor398: brik + Owner: Nod + Location: 36,100 + Actor399: brik + Owner: Nod + Location: 37,100 + Actor400: brik + Owner: Nod + Location: 37,101 + Actor401: brik + Owner: Nod + Location: 37,102 + Actor402: brik + Owner: Nod + Location: 37,103 + Actor409: brik + Owner: Nod + Location: 36,112 + Actor411: brik + Owner: Nod + Location: 37,111 + Actor412: brik + Owner: Nod + Location: 37,112 + Actor413: brik + Owner: Nod + Location: 35,112 + Actor414: brik + Owner: Nod + Location: 33,112 + Actor415: brik + Owner: Nod + Location: 34,112 + Actor416: brik + Owner: Nod + Location: 17,112 + Actor417: brik + Owner: Nod + Location: 32,112 + Actor418: brik + Owner: Nod + Location: 30,112 + Actor419: brik + Owner: Nod + Location: 29,112 + Actor420: brik + Owner: Nod + Location: 31,112 + Actor421: brik + Owner: Nod + Location: 19,112 + Actor422: brik + Owner: Nod + Location: 18,112 + Actor423: brik + Owner: Nod + Location: 17,111 + Actor424: brik + Owner: Nod + Location: 17,110 + Actor425: brik + Owner: Nod + Location: 17,109 + Actor426: brik + Owner: Nod + Location: 18,109 + Actor427: brik + Owner: Nod + Location: 18,110 + Actor428: brik + Owner: Nod + Location: 18,103 + Actor429: brik + Owner: Nod + Location: 18,102 + Actor430: brik + Owner: Nod + Location: 21,112 + Actor431: brik + Owner: Nod + Location: 20,112 + Actor432: brik + Owner: Nod + Location: 23,112 + Actor433: brik + Owner: Nod + Location: 22,112 + Actor434: brik + Owner: Nod + Location: 24,112 + Actor435: brik + Owner: Nod + Location: 25,112 + Actor436: brik + Owner: Nod + Location: 26,112 + Actor437: brik + Owner: Nod + Location: 27,112 + Actor438: brik + Owner: Nod + Location: 28,112 + Actor444: hand + Owner: Nod + Location: 33,103 + Actor449: split2 + Owner: Neutral + Location: 6,102 + Actor450: split2 + Owner: Neutral + Location: 10,108 + Actor455: nsam + Owner: Nod + Location: 35,101 + Actor456: nsam + Owner: Nod + Location: 18,101 + Actor480: split2 + Owner: Neutral + Location: 54,108 + Actor481: tc04 + Owner: Neutral + Location: 61,108 + Actor482: t16 + Owner: Neutral + Location: 61,105 + Actor488: ss2 + Owner: Nod + Location: 22,92 + Facing: 0 + Actor489: ss2 + Owner: Nod + Location: 30,93 + Facing: 919 + Actor490: sb + Owner: Nod + Location: 35,95 + Facing: 880 + Actor491: brl3 + Owner: Creeps + Location: 7,73 + Actor492: t03 + Owner: Neutral + Location: 8,72 + Actor493: t12 + Owner: Neutral + Location: 8,76 + Actor494: oilb + Owner: Neutral + Location: 8,79 + Actor495: barl + Owner: Creeps + Location: 8,81 + Actor496: brl3 + Owner: Creeps + Location: 7,82 + Actor497: oilb + Location: 102,10 + Faction: england + Owner: USSR + Actor498: oilb + Location: 98,10 + Faction: england + Owner: USSR + Actor499: t10 + Owner: Neutral + Location: 95,11 + Actor500: brl3 + Owner: Creeps + Location: 101,11 + Actor501: brl3 + Owner: Creeps + Location: 105,10 + Actor502: barl + Owner: Creeps + Location: 104,10 + Actor503: barl + Owner: Creeps + Location: 101,12 + Actor504: barl + Owner: Creeps + Location: 97,11 + Actor505: t01 + Owner: Neutral + Location: 99,12 + Actor506: t02 + Owner: Neutral + Location: 104,7 + Actor507: brik + Owner: USSR + Location: 32,36 + Actor508: brik + Owner: USSR + Location: 32,35 + Actor509: brik + Owner: USSR + Location: 32,34 + Actor510: brik + Owner: USSR + Location: 32,33 + Actor511: brik + Owner: USSR + Location: 33,33 + Actor512: brik + Owner: USSR + Location: 33,34 + Actor513: brik + Owner: USSR + Location: 33,29 + Actor514: brik + Owner: USSR + Location: 32,29 + Actor515: brik + Owner: USSR + Location: 32,28 + Actor516: brik + Owner: USSR + Location: 33,28 + Actor517: brik + Owner: USSR + Location: 32,27 + Actor528: brik + Owner: USSR + Location: 36,23 + Actor529: brik + Owner: USSR + Location: 35,23 + Actor530: brik + Owner: USSR + Location: 34,23 + Actor531: brik + Owner: USSR + Location: 33,23 + Actor532: brik + Owner: USSR + Location: 32,23 + Actor533: brik + Owner: USSR + Location: 32,24 + Actor534: brik + Owner: USSR + Location: 32,25 + Actor535: brik + Owner: USSR + Location: 32,26 + Actor564: fenc + Owner: USSR + Location: 36,78 + Actor565: fenc + Owner: USSR + Location: 37,78 + Actor566: fenc + Owner: USSR + Location: 38,78 + Actor567: fenc + Owner: USSR + Location: 35,78 + Actor568: fenc + Owner: USSR + Location: 44,79 + Actor569: fenc + Owner: USSR + Location: 45,79 + Actor570: fenc + Owner: USSR + Location: 46,79 + Actor571: fenc + Owner: USSR + Location: 52,78 + Actor572: fenc + Owner: USSR + Location: 52,79 + Actor573: fenc + Owner: USSR + Location: 52,80 + Actor574: fenc + Owner: USSR + Location: 53,80 + Actor575: fenc + Owner: USSR + Location: 53,81 + Actor576: fenc + Owner: USSR + Location: 55,81 + Actor577: fenc + Owner: USSR + Location: 54,81 + Actor578: fenc + Owner: USSR + Location: 30,74 + Actor579: fenc + Owner: USSR + Location: 31,74 + Actor580: fenc + Owner: USSR + Location: 32,74 + Actor581: fenc + Owner: USSR + Location: 38,72 + Actor582: fenc + Owner: USSR + Location: 38,73 + Actor585: apwr + Owner: USSR + Location: 63,40 + Actor588: brik + Owner: USSR + Location: 80,22 + Actor589: brik + Owner: USSR + Location: 81,22 + Actor590: brik + Owner: USSR + Location: 80,23 + Actor591: brik + Owner: USSR + Location: 81,23 + Actor592: brik + Owner: USSR + Location: 81,24 + Actor593: brik + Owner: USSR + Location: 81,25 + Actor594: brik + Owner: USSR + Location: 81,26 + Actor595: brik + Owner: USSR + Location: 80,26 + Actor596: brik + Owner: USSR + Location: 80,25 + Actor597: brik + Owner: USSR + Location: 87,38 + Actor598: brik + Owner: USSR + Location: 88,38 + Actor599: brik + Owner: USSR + Location: 87,37 + Actor600: brik + Owner: USSR + Location: 88,37 + Actor601: brik + Owner: USSR + Location: 88,36 + Actor602: brik + Owner: USSR + Location: 88,35 + Actor603: brik + Owner: USSR + Location: 87,35 + Actor604: brik + Owner: USSR + Location: 87,34 + Actor605: brik + Owner: USSR + Location: 87,33 + Actor606: brik + Owner: USSR + Location: 87,32 + Actor607: brik + Owner: USSR + Location: 87,31 + Actor609: brik + Owner: USSR + Location: 85,30 + Actor610: brik + Owner: USSR + Location: 86,30 + Actor611: brik + Owner: USSR + Location: 84,30 + Actor612: brik + Owner: USSR + Location: 86,31 + Actor608: brik + Owner: USSR + Location: 83,30 + Actor613: brik + Owner: USSR + Location: 83,31 + Actor614: brik + Owner: USSR + Location: 84,31 + Actor615: ftur + Owner: USSR + Location: 82,24 + Actor616: ftur + Owner: USSR + Location: 85,29 + OuterTesla13: tsla + Owner: USSR + Location: 85,31 + OuterTesla14: tsla + Owner: USSR + Location: 80,24 + OuterTesla12: tsla + Owner: USSR + Location: 87,36 + OuterTesla15: tsla + Owner: USSR + Location: 33,35 + OuterTesla16: tsla + Owner: USSR + Location: 33,27 + Actor624: ftur + Owner: USSR + Location: 31,33 + Actor625: ftur + Owner: USSR + Location: 31,29 + Actor622: ftur + Owner: USSR + Location: 64,55 + Actor623: ftur + Owner: USSR + Location: 67,55 + Actor626: ftur + Owner: USSR + Location: 70,70 + Actor627: ftur + Owner: USSR + Location: 72,73 + Actor628: ftur + Owner: USSR + Location: 21,68 + Actor629: ftur + Owner: USSR + Location: 25,68 + Actor630: brik + Owner: USSR + Location: 26,65 + Actor631: brik + Owner: USSR + Location: 26,64 + Actor632: brik + Owner: USSR + Location: 25,64 + Actor633: brik + Owner: USSR + Location: 25,63 + Actor634: brik + Owner: USSR + Location: 26,63 + OuterTesla2: tsla + Owner: USSR + Location: 25,65 + Actor638: apwr + Owner: USSR + Location: 52,57 + Actor639: apwr + Owner: USSR + Location: 48,57 + Actor636: stek + Owner: USSR + Location: 48,44 + Actor642: fix + Owner: USSR + Location: 77,28 + Actor643: barr + Owner: USSR + Location: 81,66 + Actor644: apwr + Owner: USSR + Location: 43,44 + Actor645: apwr + Owner: USSR + Location: 40,44 + Actor646: apwr + Owner: USSR + Location: 37,44 + Actor647: apwr + Owner: USSR + Location: 34,44 + Actor648: brik + Owner: USSR + Location: 33,44 + Actor649: brik + Owner: USSR + Location: 33,43 + Actor650: brik + Owner: USSR + Location: 35,43 + Actor651: tsla + Owner: USSR + Location: 32,47 + Actor652: tsla + Owner: USSR + Location: 49,48 + Actor653: tsla + Owner: USSR + Location: 41,49 + Actor641: fix + Owner: USSR + Location: 79,46 + Actor658: kenn + Owner: USSR + Location: 78,67 + Actor661: barr + Owner: USSR + Location: 56,51 + Actor662: ftur + Owner: USSR + Location: 43,50 + Actor663: ftur + Owner: USSR + Location: 49,50 + Actor664: ftur + Owner: USSR + Location: 75,51 + Actor665: brik + Owner: USSR + Location: 32,65 + Actor666: brik + Owner: USSR + Location: 32,66 + Actor667: brik + Owner: USSR + Location: 33,65 + Actor668: brik + Owner: USSR + Location: 33,66 + Actor669: brik + Owner: USSR + Location: 34,66 + Actor670: brik + Owner: USSR + Location: 35,66 + Actor671: brik + Owner: USSR + Location: 36,66 + Actor672: brik + Owner: USSR + Location: 36,65 + Actor673: brik + Owner: USSR + Location: 35,65 + Actor674: brik + Owner: USSR + Location: 35,64 + Actor675: brik + Owner: USSR + Location: 34,64 + Actor676: brik + Owner: USSR + Location: 33,64 + Actor677: brik + Owner: USSR + Location: 47,71 + Actor678: brik + Owner: USSR + Location: 48,71 + Actor679: brik + Owner: USSR + Location: 49,71 + Actor680: brik + Owner: USSR + Location: 50,71 + Actor681: brik + Owner: USSR + Location: 47,70 + Actor682: brik + Owner: USSR + Location: 48,70 + Actor683: brik + Owner: USSR + Location: 50,70 + Actor684: brik + Owner: USSR + Location: 51,70 + Actor685: brik + Owner: USSR + Location: 51,71 + Actor686: brik + Owner: USSR + Location: 48,69 + Actor687: brik + Owner: USSR + Location: 49,69 + Actor688: brik + Owner: USSR + Location: 50,69 + Actor689: brik + Owner: USSR + Location: 60,76 + Actor690: brik + Owner: USSR + Location: 60,75 + Actor691: brik + Owner: USSR + Location: 61,76 + Actor692: brik + Owner: USSR + Location: 61,75 + Actor693: brik + Owner: USSR + Location: 62,76 + Actor694: brik + Owner: USSR + Location: 63,76 + Actor695: brik + Owner: USSR + Location: 64,76 + Actor696: brik + Owner: USSR + Location: 64,75 + Actor697: brik + Owner: USSR + Location: 63,75 + Actor698: brik + Owner: USSR + Location: 61,74 + Actor699: brik + Owner: USSR + Location: 62,74 + Actor700: brik + Owner: USSR + Location: 63,74 + Actor701: brik + Owner: USSR + Location: 42,59 + Actor702: brik + Owner: USSR + Location: 41,59 + Actor703: brik + Owner: USSR + Location: 40,59 + Actor704: brik + Owner: USSR + Location: 39,59 + Actor705: brik + Owner: USSR + Location: 42,60 + Actor706: brik + Owner: USSR + Location: 41,60 + Actor707: brik + Owner: USSR + Location: 39,60 + Actor708: brik + Owner: USSR + Location: 38,59 + Actor709: brik + Owner: USSR + Location: 38,60 + Actor710: brik + Owner: USSR + Location: 39,61 + Actor711: brik + Owner: USSR + Location: 40,61 + Actor712: brik + Owner: USSR + Location: 41,61 + OuterTesla3: tsla + Owner: USSR + Location: 34,65 + OuterTesla4: tsla + Owner: USSR + Location: 40,60 + OuterTesla5: tsla + Owner: USSR + Location: 49,70 + OuterTesla6: tsla + Owner: USSR + Location: 62,75 + Actor717: ftur + Owner: USSR + Location: 38,58 + Actor724: brik + Owner: USSR + Location: 63,70 + Actor725: brik + Owner: USSR + Location: 64,70 + Actor726: brik + Owner: USSR + Location: 63,69 + Actor727: brik + Owner: USSR + Location: 63,71 + Actor728: brik + Owner: USSR + Location: 64,71 + Actor729: brik + Owner: USSR + Location: 63,68 + Actor730: brik + Owner: USSR + Location: 63,67 + Actor731: brik + Owner: USSR + Location: 64,67 + Actor732: brik + Owner: USSR + Location: 64,68 + OuterTesla7: tsla + Owner: USSR + Location: 64,69 + Actor734: ftur + Owner: USSR + Location: 62,69 + Actor736: silo + Owner: USSR + Location: 29,52 + Actor737: silo + Owner: USSR + Location: 29,53 + Actor738: silo + Owner: USSR + Location: 30,53 + Actor739: silo + Owner: USSR + Location: 30,52 + Actor740: silo + Owner: USSR + Location: 31,52 + Actor741: silo + Owner: USSR + Location: 31,53 + Actor742: chain + Owner: USSR + Location: 28,51 + Actor743: chain + Owner: USSR + Location: 28,52 + Actor744: chain + Owner: USSR + Location: 28,53 + Actor745: chain + Owner: USSR + Location: 28,54 + Actor746: chain + Owner: USSR + Location: 29,54 + Actor747: chain + Owner: USSR + Location: 29,51 + Actor748: chain + Owner: USSR + Location: 30,51 + Actor749: chain + Owner: USSR + Location: 30,51 + Actor750: chain + Owner: USSR + Location: 31,51 + Actor751: chain + Owner: USSR + Location: 32,51 + Actor752: chain + Owner: USSR + Location: 32,52 + Actor753: chain + Owner: USSR + Location: 32,53 + Actor754: chain + Owner: USSR + Location: 32,54 + Actor755: chain + Owner: USSR + Location: 31,54 + Actor718: ftur + Owner: USSR + Location: 49,65 + Airfield1: afld + Owner: USSR + Location: 72,18 + OuterSAM11: sam + Owner: USSR + Location: 69,17 + Actor721: tc04 + Owner: Neutral + Location: 66,23 + Actor722: tc05 + Owner: Neutral + Location: 62,21 + Actor723: tc01 + Owner: Neutral + Location: 66,30 + Actor735: tc02 + Owner: Neutral + Location: 65,26 + Actor756: t17 + Owner: Neutral + Location: 65,24 + Actor757: t14 + Owner: Neutral + Location: 66,25 + Actor758: t07 + Owner: Neutral + Location: 67,27 + Actor759: t16 + Owner: Neutral + Location: 66,28 + Actor760: t13 + Owner: Neutral + Location: 66,29 + Actor761: t07 + Owner: Neutral + Location: 65,23 + Actor762: tc01 + Owner: Neutral + Location: 66,21 + Actor763: tc02 + Owner: Neutral + Location: 65,20 + Actor764: tc04 + Owner: Neutral + Location: 60,19 + Actor765: t14 + Owner: Neutral + Location: 60,21 + Actor766: t15 + Owner: Neutral + Location: 62,19 + Actor767: t11 + Owner: Neutral + Location: 64,18 + Actor768: t16 + Owner: Neutral + Location: 64,20 + Actor769: tc01 + Owner: Neutral + Location: 63,17 + Actor770: tc02 + Owner: Neutral + Location: 63,15 + Actor771: t12 + Owner: Neutral + Location: 62,16 + Actor772: t02 + Owner: Neutral + Location: 61,17 + Actor773: t05 + Owner: Neutral + Location: 59,13 + Actor774: t02 + Owner: Neutral + Location: 61,15 + Actor775: t01 + Owner: Neutral + Location: 61,13 + Actor776: t10 + Owner: Neutral + Location: 62,14 + Actor777: t13 + Owner: Neutral + Location: 60,18 + Actor778: t17 + Owner: Neutral + Location: 62,17 + Actor779: tc05 + Owner: Neutral + Location: 51,13 + Actor780: t05 + Owner: Neutral + Location: 54,16 + Actor781: t07 + Owner: Neutral + Location: 53,20 + Actor782: tc01 + Owner: Neutral + Location: 57,23 + Actor783: t16 + Owner: Neutral + Location: 57,21 + Actor784: t17 + Owner: Neutral + Location: 56,22 + Actor785: t01 + Owner: Neutral + Location: 57,16 + Actor786: t11 + Owner: Neutral + Location: 56,20 + Actor787: t12 + Owner: Neutral + Location: 57,18 + Actor788: t14 + Owner: Neutral + Location: 53,19 + Actor789: tc02 + Owner: Neutral + Location: 49,15 + Actor791: tc01 + Owner: Neutral + Location: 31,21 + Actor792: tc05 + Owner: Neutral + Location: 29,23 + Actor793: t10 + Owner: Neutral + Location: 30,22 + Actor794: t07 + Owner: Neutral + Location: 31,25 + Actor795: t13 + Owner: Neutral + Location: 20,24 + Actor796: tc03 + Owner: Neutral + Location: 24,43 + Actor797: tc02 + Owner: Neutral + Location: 30,40 + Actor798: t11 + Owner: Neutral + Location: 27,42 + Actor799: tc04 + Owner: Neutral + Location: 23,37 + Actor800: t14 + Owner: Neutral + Location: 24,35 + Actor801: t17 + Owner: Neutral + Location: 26,37 + Actor802: t11 + Owner: Neutral + Location: 25,26 + Actor803: t10 + Owner: Neutral + Location: 24,19 + Actor805: tc03 + Owner: Neutral + Location: 28,18 + Actor808: t02 + Owner: Neutral + Location: 28,35 + Actor810: tc01 + Owner: Neutral + Location: 49,19 + Actor811: t15 + Owner: Neutral + Location: 78,58 + Actor812: t12 + Owner: Neutral + Location: 86,60 + Actor813: t02 + Owner: Neutral + Location: 86,56 + Actor814: t01 + Owner: Neutral + Location: 88,50 + Actor815: t14 + Owner: Neutral + Location: 70,61 + Actor816: t14 + Owner: Neutral + Location: 63,60 + Actor817: tc04 + Owner: Neutral + Location: 66,59 + Actor818: t07 + Owner: Neutral + Location: 72,57 + Actor819: t02 + Owner: Neutral + Location: 87,51 + Actor820: t06 + Owner: Neutral + Location: 87,44 + Actor821: weap + Owner: USSR + Location: 77,42 + Actor822: weap + Owner: USSR + Location: 81,42 + Actor823: brik + Owner: USSR + Location: 76,41 + Actor824: brik + Owner: USSR + Location: 76,42 + Actor825: brik + Owner: USSR + Location: 76,44 + Actor826: brik + Owner: USSR + Location: 76,43 + Actor827: brik + Owner: USSR + Location: 77,41 + Actor828: brik + Owner: USSR + Location: 79,41 + Actor829: brik + Owner: USSR + Location: 78,41 + Actor830: brik + Owner: USSR + Location: 80,41 + Actor831: brik + Owner: USSR + Location: 81,41 + Actor832: brik + Owner: USSR + Location: 82,41 + Actor833: brik + Owner: USSR + Location: 83,41 + Actor834: brik + Owner: USSR + Location: 84,41 + Actor835: brik + Owner: USSR + Location: 84,42 + Actor836: brik + Owner: USSR + Location: 84,43 + Actor837: brik + Owner: USSR + Location: 84,44 + Actor838: brik + Owner: USSR + Location: 84,45 + Actor839: brik + Owner: USSR + Location: 76,45 + Actor840: brik + Owner: USSR + Location: 75,45 + Actor841: brik + Owner: USSR + Location: 75,44 + Actor842: brik + Owner: USSR + Location: 85,45 + Actor843: brik + Owner: USSR + Location: 85,44 + Actor844: brik + Owner: USSR + Location: 81,53 + Actor845: brik + Owner: USSR + Location: 81,54 + Actor846: brik + Owner: USSR + Location: 82,54 + Actor847: brik + Owner: USSR + Location: 83,54 + Actor848: brik + Owner: USSR + Location: 83,53 + Actor849: brik + Owner: USSR + Location: 83,52 + Actor850: brik + Owner: USSR + Location: 82,52 + Actor851: brik + Owner: USSR + Location: 81,52 + OuterTesla11: tsla + Owner: USSR + Location: 82,53 + OuterSAM7: sam + Owner: USSR + Location: 86,59 + OuterSAM6: sam + Owner: USSR + Location: 72,66 + OuterSAM4: sam + Owner: USSR + Location: 66,82 + OuterSAM9: sam + Owner: USSR + Location: 88,47 + OuterSAM2: sam + Owner: USSR + Location: 41,71 + OuterSAM1: sam + Owner: USSR + Location: 29,64 + Actor859: sam + Owner: USSR + Location: 36,52 + Actor860: sam + Owner: USSR + Location: 39,47 + OuterSAM14: sam + Owner: USSR + Location: 38,39 + OuterSAM15: sam + Owner: USSR + Location: 33,24 + OuterSAM13: sam + Owner: USSR + Location: 33,38 + Actor865: sam + Owner: USSR + Location: 46,58 + Actor866: sam + Owner: USSR + Location: 56,57 + Actor867: sam + Owner: USSR + Location: 66,49 + Actor868: sam + Owner: USSR + Location: 44,52 + OuterSAM5: sam + Owner: USSR + Location: 71,77 + OuterSAM8: sam + Owner: USSR + Location: 74,59 + Actor871: apwr + Owner: USSR + Location: 66,38 + Actor874: brik + Owner: USSR + Location: 81,61 + Actor875: brik + Owner: USSR + Location: 82,61 + Actor876: brik + Owner: USSR + Location: 83,61 + Actor877: brik + Owner: USSR + Location: 81,62 + OuterTesla10: tsla + Owner: USSR + Location: 82,62 + Actor879: brik + Owner: USSR + Location: 83,62 + Actor880: brik + Owner: USSR + Location: 81,63 + Actor881: brik + Owner: USSR + Location: 82,63 + Actor882: brik + Owner: USSR + Location: 83,63 + OuterSAM3: sam + Owner: USSR + Location: 53,72 + PlayerStart: waypoint + Owner: Neutral + Location: 27,102 + Actor854: tpwr + Owner: USSR + Location: 59,49 + Actor855: tpwr + Owner: USSR + Location: 62,48 + Actor852: apwr + Owner: USSR + Location: 48,54 + Actor853: apwr + Owner: USSR + Location: 52,54 + Actor856: tpwr + Owner: USSR + Location: 53,45 + Actor857: dome + Owner: USSR + Location: 56,44 + OuterSAM12: sam + Owner: USSR + Location: 26,42 + Actor858: 3tnk + Owner: USSRUnits + Facing: 384 + Location: 44,76 + Actor861: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 43,76 + Actor862: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 45,77 + Actor863: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 47,78 + Actor864: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 39,76 + Actor869: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 35,77 + Actor870: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 38,74 + Actor878: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 33,74 + Actor883: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 50,77 + Actor888: e1 + Owner: USSRUnits + Facing: 384 + Location: 54,80 + SubCell: 4 + Actor884: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 53,79 + Actor889: e1 + Owner: USSRUnits + Facing: 384 + Location: 55,80 + SubCell: 4 + Actor885: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 54,79 + Actor886: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 49,76 + Actor887: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 41,75 + Actor893: e3 + Owner: USSRUnits + Facing: 384 + Location: 31,73 + SubCell: 4 + Actor890: e4 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 43,77 + Actor891: dog + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 44,77 + Actor892: shok + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 44,48 + Actor894: shok + Owner: USSRUnits + Facing: 384 + Location: 44,48 + SubCell: 1 + Actor895: shok + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 46,49 + Actor896: shok + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 46,47 + Actor897: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 20,37 + Actor898: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 23,42 + Actor899: e1 + Owner: USSRUnits + Facing: 384 + Location: 23,42 + SubCell: 1 + Actor900: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 22,40 + Actor901: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 21,35 + Actor902: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 22,27 + Actor903: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 23,25 + Actor904: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 22,67 + Actor905: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 24,68 + Actor906: e1 + Owner: USSRUnits + Facing: 384 + Location: 24,68 + SubCell: 1 + Actor907: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 21,69 + Actor908: e1 + Owner: USSRUnits + Facing: 384 + Location: 26,68 + SubCell: 3 + Actor909: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 22,65 + Actor910: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 24,60 + Actor911: e1 + Owner: USSRUnits + Facing: 384 + Location: 24,60 + SubCell: 1 + Actor912: e1 + Owner: USSRUnits + Facing: 384 + Location: 24,60 + SubCell: 2 + Actor913: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 23,58 + Actor914: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 27,61 + Actor915: e4 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 24,64 + Actor916: e4 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 36,64 + Actor917: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 35,63 + Actor918: e1 + Owner: USSRUnits + Facing: 384 + Location: 35,63 + SubCell: 1 + Actor919: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 39,62 + Actor920: e1 + Owner: USSRUnits + SubCell: 3 + Location: 37,66 + Facing: 384 + Actor921: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 46,64 + Actor922: e1 + Owner: USSRUnits + Facing: 384 + Location: 46,64 + SubCell: 1 + Actor923: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 45,63 + Actor924: e1 + Owner: USSRUnits + Facing: 384 + Location: 46,63 + SubCell: 3 + Actor925: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 46,65 + Actor926: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 45,70 + Actor927: e1 + Owner: USSRUnits + Facing: 384 + Location: 45,70 + SubCell: 1 + Actor928: e1 + Owner: USSRUnits + Facing: 384 + Location: 46,69 + SubCell: 3 + Actor929: e1 + Owner: USSRUnits + Facing: 384 + Location: 44,70 + SubCell: 3 + Actor930: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 61,68 + Actor931: e1 + Owner: USSRUnits + Facing: 384 + Location: 61,68 + SubCell: 1 + Actor932: e1 + Owner: USSRUnits + Facing: 384 + Location: 60,67 + SubCell: 3 + Actor933: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 61,71 + Actor934: e1 + Owner: USSRUnits + Facing: 384 + Location: 61,71 + SubCell: 1 + Actor935: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 72,71 + Actor936: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 73,70 + Actor937: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 72,69 + Actor938: e1 + Owner: USSRUnits + Facing: 384 + Location: 72,69 + SubCell: 1 + Actor939: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 74,71 + Actor940: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 71,75 + Actor941: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 71,78 + Actor942: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 67,78 + Actor943: e1 + Owner: USSRUnits + Facing: 384 + Location: 67,78 + SubCell: 1 + Actor944: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 66,76 + Actor945: e1 + Owner: USSRUnits + Facing: 384 + Location: 66,76 + SubCell: 1 + Actor946: e1 + Owner: USSRUnits + Facing: 384 + Location: 65,76 + SubCell: 3 + Actor947: e1 + Owner: USSRUnits + Facing: 384 + Location: 60,74 + SubCell: 3 + Actor948: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 81,69 + Actor949: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 80,68 + Actor950: e1 + Owner: USSRUnits + Facing: 384 + Location: 80,68 + SubCell: 1 + Actor951: e1 + Owner: USSRUnits + Facing: 384 + Location: 80,67 + SubCell: 3 + Actor952: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 80,66 + Actor953: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 83,66 + Actor954: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 79,69 + Actor955: barr + Owner: USSR + Location: 85,62 + Actor956: 4tnk + Owner: USSRUnits + Facing: 384 + Location: 70,72 + Actor957: 4tnk + Owner: USSRUnits + Facing: 777 + Location: 63,58 + Actor959: 4tnk + Owner: USSRUnits + Facing: 777 + Location: 63,60 + Actor958: ttnk + Owner: USSRUnits + Facing: 384 + Location: 75,68 + Actor960: katy + Owner: USSRUnits + Location: 66,80 + Facing: 174 + Actor961: btr.ai + Owner: USSRUnits + Location: 38,64 + Facing: 150 + Actor964: 3tnk + Owner: USSRUnits + Location: 29,27 + Facing: 253 + Actor963: 3tnk + Owner: USSRUnits + Facing: 253 + Location: 29,34 + Actor965: katy + Owner: USSRUnits + Location: 30,37 + Facing: 166 + Actor967: v2rl + Owner: USSRUnits + Location: 57,55 + Facing: 650 + Actor968: v2rl + Owner: USSRUnits + Location: 67,52 + Facing: 618 + Actor969: v2rl + Owner: USSRUnits + Location: 59,53 + Facing: 634 + Actor970: v2rl + Owner: USSRUnits + Facing: 384 + Location: 33,25 + Actor972: katy + Owner: USSRUnits + Location: 86,32 + Facing: 0 + Actor974: 3tnk + Owner: USSRUnits + Location: 81,28 + Facing: 904 + Actor977: ttra + Owner: USSRUnits + Location: 60,47 + Facing: 602 + Actor978: ttra + Owner: USSRUnits + Location: 57,49 + Facing: 642 + MADTank: qtnk + Owner: USSRUnits + Location: 82,58 + Facing: 523 + Actor979: btr.ai + Owner: USSRUnits + Facing: 384 + Location: 86,49 + Actor980: btr.ai + Owner: USSRUnits + Location: 75,48 + Facing: 634 + Actor981: btr.ai + Owner: USSRUnits + Facing: 384 + Location: 58,42 + Actor982: btr.ai + Owner: USSRUnits + Location: 51,44 + Facing: 523 + Actor983: 3tnk + Owner: USSRUnits + Location: 46,51 + Facing: 618 + Actor984: apoc + Owner: USSRUnits + Location: 51,51 + Facing: 642 + Actor985: v2rl + Owner: USSRUnits + Facing: 384 + Location: 77,65 + Actor986: 3tnk + Owner: USSRUnits + Location: 47,67 + Facing: 245 + Actor987: 3tnk + Owner: USSRUnits + Location: 49,67 + Facing: 245 + Actor988: 3tnk + Owner: USSRUnits + Facing: 384 + Location: 26,59 + Actor989: 3tnk + Owner: USSRUnits + Facing: 384 + Location: 25,58 + Actor990: 4tnk + Owner: USSRUnits + Facing: 384 + Location: 84,48 + Actor991: 4tnk + Owner: USSRUnits + Location: 77,48 + Facing: 626 + Actor992: v2rl + Owner: USSRUnits + Location: 76,46 + Facing: 602 + Actor993: 3tnk + Owner: USSRUnits + Facing: 384 + Location: 82,45 + Actor994: isu + Owner: USSRUnits + Facing: 384 + Location: 36,54 + Actor995: 3tnk + Owner: USSRUnits + Facing: 384 + Location: 37,55 + Actor996: ttnk + Owner: USSRUnits + Location: 81,30 + Facing: 896 + Actor997: 3tnk + Owner: USSRUnits + Location: 75,26 + Facing: 761 + Actor998: e1 + Owner: USSRUnits + SubCell: 3 + Location: 100,8 + Facing: 237 + Actor999: e1 + Owner: USSRUnits + SubCell: 3 + Location: 97,8 + Facing: 158 + Actor1000: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 36,55 + Actor1001: e1 + Owner: USSRUnits + Facing: 384 + Location: 36,55 + SubCell: 1 + Actor1002: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 34,54 + Actor1003: e1 + Owner: USSRUnits + Facing: 384 + Location: 37,55 + SubCell: 1 + Actor1004: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 39,56 + Actor1005: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 35,53 + Actor1006: e4 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 36,56 + Actor1007: e3 + Owner: USSRUnits + SubCell: 3 + Facing: 384 + Location: 39,55 + Actor1008: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 33,53 + Actor1009: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 40,62 + Actor1010: e3 + Owner: USSRUnits + Facing: 384 + Location: 46,64 + SubCell: 2 + Actor1011: e3 + Owner: USSRUnits + Facing: 384 + Location: 47,69 + SubCell: 3 + Actor1012: e3 + Owner: USSRUnits + Facing: 384 + Location: 61,70 + SubCell: 3 + Actor1013: e3 + Owner: USSRUnits + Facing: 384 + Location: 61,67 + SubCell: 3 + Actor1014: e3 + Owner: USSRUnits + Facing: 384 + Location: 66,77 + SubCell: 3 + Actor1015: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 71,76 + Actor1016: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 1 + Location: 71,76 + Actor1017: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 69,81 + Actor1018: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 57,81 + Actor1019: e3 + Owner: USSRUnits + Facing: 384 + Location: 81,69 + SubCell: 1 + Actor1020: e3 + Owner: USSRUnits + Facing: 384 + Location: 80,68 + SubCell: 2 + Actor1021: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 83,67 + Actor1022: e3 + Owner: USSRUnits + Facing: 384 + Location: 84,66 + SubCell: 3 + Actor1023: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 84,64 + Actor1024: e3 + Owner: USSRUnits + Facing: 384 + Location: 76,48 + SubCell: 3 + Actor1025: e3 + Owner: USSRUnits + Facing: 384 + Location: 76,48 + SubCell: 1 + Actor1026: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 78,46 + Actor1027: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 84,46 + Actor1028: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 86,48 + Actor1029: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 89,48 + Actor1030: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 73,48 + Actor1031: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 63,55 + Actor1032: e3 + Owner: USSRUnits + Facing: 384 + Location: 63,55 + SubCell: 1 + Actor1033: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 61,59 + Actor1034: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 62,61 + Actor1035: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 64,63 + Actor1036: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 69,62 + Actor1037: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 50,51 + Actor1038: e3 + Owner: USSRUnits + Facing: 384 + Location: 52,50 + SubCell: 3 + Actor1039: e3 + Owner: USSRUnits + Facing: 384 + Location: 52,50 + SubCell: 1 + Actor1040: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 56,50 + Actor1041: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 58,49 + Actor1042: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 64,47 + Actor1043: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 66,43 + Actor1044: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 54,40 + Actor1045: e3 + Owner: USSRUnits + Facing: 384 + Location: 54,40 + SubCell: 1 + Actor1046: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 58,40 + Actor1047: e3 + Owner: USSRUnits + Facing: 384 + Location: 59,43 + SubCell: 3 + Actor1051: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 35,28 + Actor1052: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 35,37 + Actor1053: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 30,28 + Actor1054: e3 + Owner: USSRUnits + Facing: 384 + Location: 30,28 + SubCell: 1 + Actor1055: e3 + Owner: USSRUnits + Facing: 384 + Location: 30,27 + SubCell: 3 + Actor1056: e3 + Owner: USSRUnits + Facing: 384 + Location: 28,22 + SubCell: 3 + Actor1057: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 29,36 + Actor1058: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 30,39 + Actor1059: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 27,41 + Actor1061: e3 + Owner: USSRUnits + Facing: 384 + Location: 52,44 + SubCell: 3 + Actor1062: e3 + Owner: USSRUnits + Facing: 384 + Location: 45,47 + SubCell: 3 + Actor1063: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 46,53 + Actor1064: e3 + Owner: USSRUnits + Facing: 384 + Location: 56,56 + SubCell: 3 + Actor1065: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 58,52 + Actor1066: e2 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 24,67 + Actor1067: e2 + Owner: USSRUnits + Facing: 384 + Location: 35,77 + SubCell: 1 + Actor1068: e2 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 47,74 + Actor1069: e2 + Owner: USSRUnits + Facing: 384 + SubCell: 1 + Location: 54,79 + Actor1070: e2 + Owner: USSRUnits + Facing: 384 + Location: 50,77 + SubCell: 1 + Actor1071: e2 + Owner: USSRUnits + Facing: 384 + Location: 46,70 + SubCell: 3 + Actor1072: e2 + Owner: USSRUnits + Facing: 384 + Location: 45,63 + SubCell: 1 + Actor1073: e2 + Owner: USSRUnits + Facing: 384 + SubCell: 1 + Location: 39,62 + Actor1074: e2 + Owner: USSRUnits + Facing: 384 + Location: 34,63 + SubCell: 3 + Actor1075: e2 + Owner: USSRUnits + Facing: 384 + Location: 61,68 + SubCell: 2 + Actor1076: e2 + Owner: USSRUnits + Facing: 384 + Location: 66,77 + SubCell: 1 + Actor1077: e2 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 74,70 + Actor1078: e2 + Owner: USSRUnits + Facing: 384 + Location: 82,69 + SubCell: 3 + Actor1079: e2 + Owner: USSRUnits + Facing: 384 + Location: 83,68 + SubCell: 3 + Actor1080: e2 + Owner: USSRUnits + Facing: 384 + Location: 79,68 + SubCell: 3 + Actor1081: e2 + Owner: USSRUnits + Facing: 384 + Location: 84,64 + SubCell: 1 + Actor1082: e2 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 76,49 + Actor1083: e2 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 84,50 + Actor1084: e2 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 73,51 + Actor1085: e2 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 65,56 + Actor1086: e2 + Owner: USSRUnits + Facing: 384 + Location: 65,56 + SubCell: 1 + Actor1087: e2 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 69,56 + Actor1088: e2 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 66,50 + Actor1089: e2 + Owner: USSRUnits + Facing: 384 + Location: 56,56 + SubCell: 1 + Actor1090: e2 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 57,54 + Actor1091: e2 + Owner: USSRUnits + Facing: 384 + Location: 49,51 + SubCell: 3 + Actor1092: e2 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 45,49 + Actor1093: e2 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 52,46 + Actor1094: e1 + Owner: USSRUnits + Facing: 384 + Location: 73,51 + SubCell: 1 + Actor1095: e4 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 82,48 + Actor1096: e4 + Owner: USSRUnits + Facing: 384 + Location: 80,69 + SubCell: 3 + Actor1097: e4 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 84,65 + Actor1098: e4 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 84,62 + Actor1099: e4 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 69,61 + Actor1100: e4 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 59,73 + Actor1101: e4 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 22,68 + Actor1102: e4 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 23,59 + Actor1103: e4 + Owner: USSRUnits + Facing: 384 + Location: 22,40 + SubCell: 1 + Actor1104: e4 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 22,36 + Actor1105: e4 + Owner: USSRUnits + Facing: 384 + Location: 22,27 + SubCell: 1 + Actor1106: e4 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 26,24 + Actor1107: e4 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 30,33 + Actor1108: e4 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 29,29 + Actor1109: e4 + Owner: USSRUnits + Facing: 384 + SubCell: 1 + Location: 36,29 + Actor1110: e4 + Owner: USSRUnits + Facing: 384 + Location: 34,27 + SubCell: 3 + Actor1111: e2 + Owner: USSRUnits + Facing: 384 + Location: 24,36 + SubCell: 1 + Actor1112: e2 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 23,27 + Actor1113: e2 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 26,21 + Actor1118: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 27,22 + Actor1120: e1 + Owner: USSRUnits + Facing: 384 + Location: 66,43 + SubCell: 1 + Actor1121: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 62,51 + Actor1122: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 82,26 + Actor1123: e1 + Owner: USSRUnits + Facing: 384 + Location: 82,26 + SubCell: 1 + Actor1124: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 84,28 + Actor1125: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 87,29 + Actor1126: e1 + Owner: USSRUnits + SubCell: 3 + Location: 82,22 + Facing: 384 + Actor1127: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 82,30 + Actor1128: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 83,27 + Actor1129: e3 + Owner: USSRUnits + Facing: 384 + Location: 79,26 + SubCell: 3 + Actor1130: e3 + Owner: USSRUnits + Facing: 384 + Location: 84,32 + SubCell: 3 + Actor1131: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 86,36 + Actor1132: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 75,35 + Actor1133: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 74,23 + Actor1134: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 76,19 + Actor1135: e3 + Owner: USSRUnits + Facing: 384 + Location: 73,29 + SubCell: 3 + Actor1136: e2 + Owner: USSRUnits + SubCell: 3 + Location: 79,27 + Facing: 384 + Actor1137: e2 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 76,23 + Actor1138: e2 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 84,27 + Actor1139: e2 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 79,31 + Actor1140: e2 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 77,32 + Actor1141: e8 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 50,52 + Actor1142: e8 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 53,51 + Actor1143: shok + Owner: USSRUnits + SubCell: 3 + Location: 81,65 + Facing: 384 + Actor1144: shok + Owner: USSRUnits + Facing: 384 + Location: 75,71 + SubCell: 3 + Actor1145: ss + Owner: USSRUnits + Facing: 384 + Location: 96,54 + Actor1146: ss + Owner: USSRUnits + Facing: 384 + Location: 98,56 + Actor1147: ss + Owner: USSRUnits + Location: 107,57 + Facing: 570 + Actor1148: ss + Owner: USSRUnits + Location: 97,46 + Facing: 610 + Actor1149: ss + Owner: USSRUnits + Location: 14,74 + Facing: 586 + Actor1150: ss + Owner: USSRUnits + Location: 15,68 + Facing: 539 + Actor1151: ss + Owner: USSRUnits + Facing: 384 + Location: 34,83 + Actor1152: ss + Owner: USSRUnits + Facing: 384 + Location: 52,87 + Actor1153: ss + Owner: USSRUnits + Facing: 384 + Location: 42,86 + Actor1154: ss + Owner: USSRUnits + Facing: 384 + Location: 85,89 + Actor1155: ss + Owner: USSRUnits + Location: 90,18 + Facing: 555 + Actor1156: ss + Owner: USSRUnits + Location: 110,17 + Facing: 531 + Actor1157: ss + Owner: USSRUnits + Location: 96,30 + Facing: 563 + Actor1158: seas + Owner: USSRUnits + Facing: 384 + Location: 49,8 + Actor1159: seas + Owner: USSRUnits + Facing: 384 + Location: 46,6 + Actor1160: seas + Owner: USSRUnits + Facing: 384 + Location: 85,87 + Actor1161: seas + Owner: USSRUnits + Facing: 384 + Location: 105,68 + Actor1162: seas + Owner: USSRUnits + Facing: 384 + Location: 11,50 + Actor1163: ss + Owner: USSRUnits + Facing: 384 + Location: 10,48 + Actor1164: ss + Owner: USSRUnits + Facing: 384 + Location: 13,44 + Actor1165: ss + Owner: USSRUnits + Facing: 384 + Location: 12,30 + Actor1166: ss + Owner: USSRUnits + Facing: 384 + Location: 44,9 + Actor1167: ss + Owner: USSRUnits + Facing: 384 + Location: 41,3 + Actor1168: ss + Owner: USSRUnits + Facing: 384 + Location: 37,3 + Actor1169: ss + Owner: USSRUnits + Facing: 384 + Location: 44,12 + Actor1170: ss + Owner: USSRUnits + Location: 68,10 + Facing: 642 + Actor1171: seas + Owner: USSRUnits + Location: 70,7 + Facing: 626 + Actor1172: ss + Owner: USSRUnits + Facing: 642 + Location: 67,7 + Actor1173: ss + Owner: USSRUnits + Facing: 642 + Location: 71,5 + Actor1174: ss + Owner: USSRUnits + Facing: 642 + Location: 75,3 + Actor1175: seas + Owner: USSRUnits + Facing: 626 + Location: 72,3 + Actor1176: ltnk + Owner: Nod + Location: 26,100 + Facing: 0 + Actor1177: ltnk + Owner: Nod + Facing: 0 + Location: 28,98 + Actor1178: ltnk + Owner: Nod + Facing: 0 + Location: 30,101 + Actor1179: ltnk + Owner: Nod + Facing: 0 + Location: 30,107 + Actor1180: ltnk + Owner: Nod + Facing: 0 + Location: 25,103 + Actor1181: ftnk + Owner: Nod + Location: 28,100 + Facing: 0 + Actor1183: bike + Owner: Nod + Location: 32,107 + Facing: 0 + Actor1184: stnk.nod + Owner: Nod + Location: 26,106 + Facing: 0 + Actor1185: stnk.nod + Owner: Nod + Location: 27,107 + Facing: 0 + Actor1186: arty.nod + Owner: Nod + Location: 26,104 + Facing: 0 + Actor1187: arty.nod + Owner: Nod + Location: 34,107 + Facing: 0 + Actor1189: n1 + Owner: Nod + Location: 31,100 + SubCell: 1 + Facing: 0 + Actor1190: n1 + Owner: Nod + Location: 31,100 + SubCell: 2 + Facing: 0 + Actor1191: n1 + Owner: Nod + Location: 31,100 + SubCell: 4 + Facing: 0 + Actor1192: n1 + Owner: Nod + Location: 31,100 + SubCell: 5 + Facing: 0 + Actor1194: n1 + Owner: Nod + Location: 32,102 + SubCell: 1 + Facing: 0 + Actor1195: n1 + Owner: Nod + Location: 32,102 + SubCell: 2 + Facing: 0 + Actor1196: n1 + Owner: Nod + Location: 32,102 + SubCell: 4 + Facing: 0 + Actor1197: n1 + Owner: Nod + Location: 32,102 + SubCell: 5 + Facing: 0 + Actor1199: n3 + Owner: Nod + Location: 29,102 + SubCell: 1 + Facing: 0 + Actor1200: n3 + Owner: Nod + Location: 29,102 + SubCell: 2 + Facing: 0 + Actor1201: n3 + Owner: Nod + Location: 29,102 + SubCell: 4 + Facing: 0 + Actor1202: n3 + Owner: Nod + Location: 29,102 + SubCell: 5 + Facing: 0 + Actor1204: n4 + Owner: Nod + Location: 24,104 + SubCell: 1 + Facing: 0 + Actor1205: n4 + Owner: Nod + Location: 24,104 + SubCell: 2 + Facing: 0 + Actor1206: n4 + Owner: Nod + Location: 24,104 + SubCell: 4 + Facing: 0 + Actor1207: n4 + Owner: Nod + Location: 24,104 + SubCell: 5 + Facing: 0 + Actor1198: dog + Owner: USSRUnits + SubCell: 3 + Location: 37,37 + Facing: 174 + Actor1203: tpwr + Owner: USSR + Location: 66,45 + Actor1208: tpwr + Owner: USSR + Location: 67,41 + Actor1209: nuk2 + Owner: Nod + Location: 33,109 + Actor1210: nuk2 + Owner: Nod + Location: 31,109 + Actor1211: nuk2 + Owner: Nod + Location: 29,109 + Actor1212: afac + Owner: Nod + Location: 20,109 + Actor1213: hq + Owner: Nod + Location: 24,109 + Actor1214: proc.td + Owner: Nod + Location: 20,101 + Actor1215: brik + Owner: Nod + Location: 23,101 + Actor1216: brik + Owner: Nod + Location: 36,102 + Actor1217: brik + Owner: Nod + Location: 36,103 + Actor1218: brik + Owner: Nod + Location: 36,109 + Actor1219: brik + Owner: Nod + Location: 36,110 + Actor1220: brik + Owner: Nod + Location: 37,109 + Actor1221: brik + Owner: Nod + Location: 37,110 + Actor1222: airs + Owner: Nod + Location: 28,104 + Actor1182: bike + Owner: Nod + Facing: 0 + Location: 25,107 + Actor1249: camera + Owner: USSRUnits + Location: 51,77 + Actor1250: camera + Owner: USSRUnits + Location: 38,75 + Actor1251: camera + Owner: USSRUnits + Location: 28,70 + Actor1252: camera + Owner: USSRUnits + Location: 27,57 + Actor1253: camera + Owner: USSRUnits + Location: 42,65 + Actor1254: camera + Owner: USSRUnits + Location: 56,68 + Actor1255: camera + Owner: USSRUnits + Location: 68,74 + Actor1256: camera + Owner: USSRUnits + Location: 79,65 + Actor1257: camera + Owner: USSRUnits + Location: 80,53 + Actor1258: camera + Owner: USSRUnits + Location: 68,58 + Actor1259: camera + Owner: USSRUnits + Location: 54,52 + Actor1260: camera + Owner: USSRUnits + Location: 66,42 + Actor1261: camera + Owner: USSRUnits + Location: 34,31 + Actor1262: camera + Owner: USSRUnits + Location: 80,28 + Actor1263: e3 + Owner: USSRUnits + Facing: 384 + Location: 60,74 + SubCell: 1 + Actor1264: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 67,77 + Actor1265: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 63,64 + Actor1266: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 46,57 + Actor1267: e3 + Owner: USSRUnits + Facing: 384 + Location: 56,58 + SubCell: 3 + Actor1268: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 24,58 + Actor1269: 3tnk + Owner: USSRUnits + Location: 43,67 + Facing: 245 + Actor1270: 3tnk + Owner: USSRUnits + Facing: 245 + Location: 45,67 + Actor1271: btr.ai + Owner: USSRUnits + Facing: 150 + Location: 54,67 + Actor1272: btr.ai + Owner: USSRUnits + Facing: 150 + Location: 74,61 + Actor1273: 3tnk + Owner: USSRUnits + Facing: 618 + Location: 23,69 + Actor1274: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 62,57 + Actor1275: e1 + Owner: USSRUnits + Facing: 384 + Location: 62,57 + SubCell: 1 + Actor1276: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 65,62 + Actor1277: e1 + Owner: USSRUnits + Facing: 384 + Location: 65,62 + SubCell: 1 + Actor1278: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 68,63 + Actor1279: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 77,51 + Actor1280: e1 + Owner: USSRUnits + Facing: 384 + Location: 77,51 + SubCell: 1 + Actor1281: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 85,49 + Actor1282: e1 + Owner: USSRUnits + Facing: 384 + Location: 85,49 + SubCell: 1 + Actor1283: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 72,49 + Actor1284: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 89,50 + Actor1285: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 1 + Location: 82,69 + Actor1286: ss + Owner: USSRUnits + Facing: 384 + Location: 70,86 + Actor1287: ss + Owner: USSRUnits + Facing: 539 + Location: 9,61 + Actor1288: ss + Owner: USSRUnits + Facing: 539 + Location: 11,60 + Actor1289: ss + Owner: USSRUnits + Facing: 539 + Location: 14,21 + Actor1290: ss + Owner: USSRUnits + Facing: 384 + Location: 94,75 + Actor1291: ss + Owner: USSRUnits + Facing: 384 + Location: 97,76 + Actor1292: katy + Owner: USSRUnits + Facing: 384 + Location: 32,64 + Actor1293: katy + Owner: USSRUnits + Location: 42,61 + Facing: 126 + Actor1294: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 26,58 + Actor1295: e1 + Owner: USSRUnits + Facing: 384 + Location: 26,58 + SubCell: 1 + Actor1296: e2 + Owner: USSRUnits + SubCell: 3 + Facing: 384 + Location: 38,54 + Actor1297: e2 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 28,59 + Actor1223: chain + Owner: Nod + Location: 41,104 + Actor1224: chain + Owner: Nod + Location: 42,104 + Actor1225: chain + Owner: Nod + Location: 43,104 + Actor1226: chain + Owner: Nod + Location: 44,104 + Actor1227: chain + Owner: Nod + Location: 45,104 + Actor1228: chain + Owner: Nod + Location: 46,104 + Actor1229: chain + Owner: Nod + Location: 47,104 + Actor1234: chain + Owner: Nod + Location: 41,105 + Actor1235: hpad.td + Owner: Nod + Location: 42,105 + Actor1236: hpad.td + Owner: Nod + Location: 45,105 + Actor1240: chain + Owner: Nod + Location: 47,105 + Actor1241: chain + Owner: Nod + Location: 41,106 + Actor1244: chain + Owner: Nod + Location: 47,106 + Actor1246: chain + Owner: Nod + Location: 41,107 + Actor1248: chain + Owner: Nod + Location: 47,107 + Actor1301: rep + Owner: Nod + Location: 43,109 + Actor1302: chain + Owner: Nod + Location: 41,111 + Actor1303: chain + Owner: Nod + Location: 47,111 + Actor1304: chain + Owner: Nod + Location: 41,112 + Actor1305: chain + Owner: Nod + Location: 42,112 + Actor1306: chain + Owner: Nod + Location: 43,112 + Actor1307: chain + Owner: Nod + Location: 44,112 + Actor1308: chain + Owner: Nod + Location: 45,112 + Actor1309: chain + Owner: Nod + Location: 46,112 + Actor1310: chain + Owner: Nod + Location: 47,112 + Actor1231: brl3 + Owner: Creeps + Location: 108,79 + Actor1232: brl3 + Owner: Creeps + Location: 103,76 + Actor1233: oilb + Owner: Neutral + Location: 105,77 + Patrol1: waypoint + Owner: Neutral + Location: 69,58 + Patrol2: waypoint + Owner: Neutral + Location: 81,49 + Patrol3: waypoint + Owner: Neutral + Location: 80,65 + Patrol4: waypoint + Owner: Neutral + Location: 69,73 + Patrol5: waypoint + Owner: Neutral + Location: 54,69 + Patrol6: waypoint + Owner: Neutral + Location: 36,61 + Patrol7: waypoint + Owner: Neutral + Location: 23,63 + Patrol8: waypoint + Owner: Neutral + Location: 34,74 + Patrol9: waypoint + Owner: Neutral + Location: 48,77 + Actor1230: tsla + Owner: USSR + Location: 74,57 + Actor1237: tsla + Owner: USSR + Location: 59,27 + Actor1238: tsla + Owner: USSR + Location: 56,27 + Actor1242: tsla + Owner: USSR + Location: 52,37 + PatrolDropLanding: waypoint + Owner: Neutral + Location: 65,51 + PatrolDropSpawn: waypoint + Owner: Neutral + Location: 60,1 + SatHack: waypoint + Owner: Neutral + Location: 57,33 + Actor1243: sam + Owner: USSR + Location: 51,18 + Actor1239: dog + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 36,24 + Actor1245: barr + Owner: USSR + Location: 35,25 + Actor1312: powr + Owner: USSR + Location: 35,30 + Actor1313: powr + Owner: USSR + Location: 35,34 + Actor1317: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 1 + Location: 37,34 + Actor1318: e3 + Owner: USSRUnits + SubCell: 3 + Facing: 384 + Location: 37,34 + Actor1315: ttra + Owner: USSRUnits + Location: 37,28 + Facing: 356 + Actor1314: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 37,26 + Actor1247: chain + Owner: USSR + Location: 38,24 + Actor1319: chain + Owner: USSR + Location: 38,25 + Actor1320: chain + Owner: USSR + Location: 38,26 + Actor1321: chain + Owner: USSR + Location: 38,27 + Actor1324: chain + Owner: USSR + Location: 38,28 + Actor1325: chain + Owner: USSR + Location: 38,29 + Actor1326: chain + Owner: USSR + Location: 38,30 + Actor1329: chain + Owner: USSR + Location: 38,31 + Actor1330: chain + Owner: USSR + Location: 38,32 + Actor1331: chain + Owner: USSR + Location: 38,33 + Actor1334: chain + Owner: USSR + Location: 38,34 + Actor1335: chain + Owner: USSR + Location: 38,35 + Actor1188: tc05 + Owner: Neutral + Location: 45,30 + Actor1193: tc04 + Owner: Neutral + Location: 45,35 + Actor1311: tc01 + Owner: Neutral + Location: 46,33 + Actor1316: t05 + Owner: Neutral + Location: 46,29 + Actor1322: t17 + Owner: Neutral + Location: 45,31 + Actor1323: t11 + Owner: Neutral + Location: 46,34 + Actor1327: t16 + Owner: Neutral + Location: 42,39 + Actor1328: t13 + Owner: Neutral + Location: 68,31 + Actor1332: t16 + Owner: Neutral + Location: 68,29 + Actor1333: t17 + Owner: Neutral + Location: 45,37 + TeslaReactor4: tpwr + Owner: USSR + Location: 39,32 + TeslaReactor3: tpwr + Owner: USSR + Location: 39,29 + TeslaReactor2: tpwr + Owner: USSR + Location: 39,26 + TeslaReactor1: tpwr + Owner: USSR + Location: 39,23 + Actor1340: brik + Owner: USSR + Location: 36,22 + Actor1341: brik + Owner: USSR + Location: 36,21 + Actor1344: chain + Owner: USSR + Location: 39,35 + Actor1345: chain + Owner: USSR + Location: 40,35 + Actor1346: chain + Owner: USSR + Location: 41,35 + Actor1347: chain + Owner: USSR + Location: 38,23 + Actor1348: chain + Owner: USSR + Location: 38,22 + Actor1352: chain + Owner: USSR + Location: 41,22 + Actor1353: chain + Owner: USSR + Location: 40,22 + Actor1354: chain + Owner: USSR + Location: 39,22 + Actor1355: brik + Owner: USSR + Location: 37,21 + Actor1356: brik + Owner: USSR + Location: 38,21 + Actor1357: brik + Owner: USSR + Location: 39,21 + Actor1358: brik + Owner: USSR + Location: 40,21 + Actor1363: brik + Owner: USSR + Location: 45,21 + Actor1364: brik + Owner: USSR + Location: 45,22 + Actor1365: brik + Owner: USSR + Location: 45,23 + Actor1366: brik + Owner: USSR + Location: 45,24 + Actor1367: brik + Owner: USSR + Location: 45,25 + Actor1368: brik + Owner: USSR + Location: 45,26 + Actor1369: brik + Owner: USSR + Location: 45,27 + Actor1370: brik + Owner: USSR + Location: 45,28 + Actor1371: brik + Owner: USSR + Location: 42,29 + Actor1372: brik + Owner: USSR + Location: 42,30 + Actor1373: brik + Owner: USSR + Location: 42,31 + Actor1374: brik + Owner: USSR + Location: 42,32 + Actor1375: brik + Owner: USSR + Location: 42,33 + Actor1376: brik + Owner: USSR + Location: 42,34 + Actor1377: brik + Owner: USSR + Location: 42,35 + Actor1378: brik + Owner: USSR + Location: 42,36 + Actor1379: brik + Owner: USSR + Location: 41,36 + Actor1380: brik + Owner: USSR + Location: 40,36 + Actor1381: brik + Owner: USSR + Location: 40,37 + Actor1382: brik + Owner: USSR + Location: 40,38 + Actor1383: brik + Owner: USSR + Location: 40,39 + Actor1384: brik + Owner: USSR + Location: 42,28 + Actor1385: brik + Owner: USSR + Location: 43,28 + Actor1386: brik + Owner: USSR + Location: 44,28 + Actor1342: brik + Owner: USSR + Location: 45,20 + Actor1343: brik + Owner: USSR + Location: 44,20 + Actor1349: brik + Owner: USSR + Location: 43,20 + Actor1350: brik + Owner: USSR + Location: 42,20 + Actor1351: brik + Owner: USSR + Location: 41,20 + TeslaReactor6: tpwr + Owner: USSR + Location: 42,25 + TeslaReactor5: tpwr + Owner: USSR + Location: 42,22 + Actor1359: chain + Owner: USSR + Location: 41,21 + Actor1362: chain + Owner: USSR + Location: 42,21 + Actor1387: chain + Owner: USSR + Location: 43,21 + Actor1388: chain + Owner: USSR + Location: 44,21 + Actor1389: brik + Owner: USSR + Location: 40,20 + Actor1390: t10 + Owner: Neutral + Location: 44,17 + Actor1391: t11 + Owner: Neutral + Location: 34,17 + Actor1392: e2 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 37,18 + Actor1393: e2 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 32,19 + Actor1394: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 47,18 + Actor1395: dog + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 41,19 + SubPatrol1: waypoint + Owner: Neutral + Location: 56,8 + SubPatrol2: waypoint + Owner: Neutral + Location: 14,15 + SubPatrol3: waypoint + Owner: Neutral + Location: 18,79 + SubPatrol4: waypoint + Owner: Neutral + Location: 56,87 + SubPatrol5: waypoint + Owner: Neutral + Location: 91,76 + SubPatrol6: waypoint + Owner: Neutral + Location: 92,18 + Bombard1: waypoint + Owner: Neutral + Location: 27,88 + Bombard2: waypoint + Owner: Neutral + Location: 47,94 + HaloTrigger1: waypoint + Owner: Neutral + Location: 29,69 + HaloTrigger2: waypoint + Owner: Neutral + Location: 29,70 + HaloTrigger3: waypoint + Owner: Neutral + Location: 29,71 + HaloTrigger4: waypoint + Owner: Neutral + Location: 29,72 + LandingCraft1: lst + Owner: Nod + Location: 25,98 + Facing: 384 + LandingCraft2: lst + Owner: Nod + Location: 26,96 + Facing: 384 + LandingCraft3: lst + Owner: Nod + Location: 31,96 + Facing: 384 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-covenants.yaml, ca|missions/main-campaign/ca10-zenith/zenith-rules.yaml, ca|rules/custom/coop-rules.yaml, zenith-coop-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml, ca|missions/main-campaign/ca10-zenith/zenith-weapons.yaml diff --git a/mods/ca/missions/coop-campaign/ca10-zenith-coop/zenith-coop-rules.yaml b/mods/ca/missions/coop-campaign/ca10-zenith-coop/zenith-coop-rules.yaml new file mode 100644 index 0000000000..89f33a9396 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca10-zenith-coop/zenith-coop-rules.yaml @@ -0,0 +1,6 @@ +World: + LuaScript: + Scripts: campaign.lua, coop.lua, ca|missions/main-campaign/ca10-zenith/zenith.lua, zenith-coop.lua + LobbyMissionInfo@InitialObjectives: + Prefix: Initial Objectives + Text: • Destroy Soviet Missile Silos before they launch. diff --git a/mods/ca/missions/coop-campaign/ca10-zenith-coop/zenith-coop.lua b/mods/ca/missions/coop-campaign/ca10-zenith-coop/zenith-coop.lua new file mode 100644 index 0000000000..711c7fcff5 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca10-zenith-coop/zenith-coop.lua @@ -0,0 +1,60 @@ + +SetupPlayers = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Multi2 = Player.GetPlayer("Multi2") + Multi3 = Player.GetPlayer("Multi3") + Multi4 = Player.GetPlayer("Multi4") + Multi5 = Player.GetPlayer("Multi5") + Nod = Player.GetPlayer("Nod") + USSR = Player.GetPlayer("USSR") + USSRUnits = Player.GetPlayer("USSRUnits") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = Utils.Where({ Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 }, function(p) return p ~= nil end) + MissionEnemies = { USSR } + SinglePlayerPlayer = Nod + CoopInit() +end + +AfterWorldLoaded = function() + local firstActivePlayer = GetFirstActivePlayer() + TransferBaseToPlayer(SinglePlayerPlayer, firstActivePlayer) + StartCashSpread() + + local mcvSpawnCell = CPos.New(38, 106) + Utils.Do(GetMcvPlayers(), function(p) + if p ~= firstActivePlayer then + local mcv = Actor.Create("amcv", true, { Owner = p, Location = mcvSpawnCell }) + mcv.Scatter() + end + end) + + LandingCraft1.Owner = MissionPlayers[1] + + if #MissionPlayers >= 2 then + LandingCraft2.Owner = MissionPlayers[2] + end + + if #MissionPlayers >= 3 then + LandingCraft3.Owner = MissionPlayers[3] + end + + if #MissionPlayers >= 4 then + local lst = Actor.Create(LandingCraft1.Type, true, { Owner = MissionPlayers[4], Location = LandingCraft1.Location }) + lst.Scatter() + end + + if #MissionPlayers >= 5 then + local lst = Actor.Create(LandingCraft2.Type, true, { Owner = MissionPlayers[5], Location = LandingCraft2.Location }) + lst.Scatter() + end + + if #MissionPlayers >= 6 then + local lst = Actor.Create(LandingCraft3.Type, true, { Owner = MissionPlayers[6], Location = LandingCraft3.Location }) + lst.Scatter() + end +end + +AfterTick = function() + +end diff --git a/mods/ca/missions/coop-campaign/ca11-awakening-coop/awakening-coop-rules.yaml b/mods/ca/missions/coop-campaign/ca11-awakening-coop/awakening-coop-rules.yaml new file mode 100644 index 0000000000..9b45772709 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca11-awakening-coop/awakening-coop-rules.yaml @@ -0,0 +1,27 @@ +World: + LuaScript: + Scripts: campaign.lua, coop.lua, ca|missions/main-campaign/ca11-awakening/awakening.lua, awakening-coop.lua + ScriptLobbyDropdown@airint: + ID: airint + Label: Enemy Airstrike Multiplier + Description: Reduces the time between enemy airstrikes. + Values: + 999: x1 - (0.1 * player count) + 998: x1 - (0.15 * player count) + 1: x1.0 (2 Minutes) + 0.9: x0.9 + 0.8: x0.8 + 0.7: x0.7 + 0.6: x0.6 + 0.5: x0.5 (1 Minute) + 0.4: x0.4 + 0.3: x0.3 + 0.2: x0.2 + 0.1: x0.1 + 0.05: x0.05 + 0.01: x0.01 (1.2 Seconds) + Default: 1 + DisplayOrder: 999 + LobbyMissionInfo@InitialObjectives: + Prefix: Initial Objectives + Text: • Defend Temple Prime. diff --git a/mods/ca/missions/coop-campaign/ca11-awakening-coop/awakening-coop.lua b/mods/ca/missions/coop-campaign/ca11-awakening-coop/awakening-coop.lua new file mode 100644 index 0000000000..c434568026 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca11-awakening-coop/awakening-coop.lua @@ -0,0 +1,98 @@ + +if CoopAttackStrengthMultiplier ~= nil and GroundAttackInterval ~= nil and GroundAttackInterval[Difficulty] ~= nil then + GroundAttackInterval[Difficulty] = math.max(GroundAttackInterval[Difficulty] / CoopAttackStrengthMultiplier, 25) +end + +SetupPlayers = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Multi2 = Player.GetPlayer("Multi2") + Multi3 = Player.GetPlayer("Multi3") + Multi4 = Player.GetPlayer("Multi4") + Multi5 = Player.GetPlayer("Multi5") + Nod = Player.GetPlayer("Nod") + USSR = Player.GetPlayer("USSR") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = Utils.Where({ Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 }, function(p) return p ~= nil end) + MissionEnemies = { USSR } + SinglePlayerPlayer = Nod + CoopInit() +end + +AfterWorldLoaded = function() + StartCashSpread(2000) + + local firstActivePlayer = GetFirstActivePlayer() + local EnergyBuildingslist = Nod.GetActorsByTypes({"nuk2"}) + local DefenseBuildingslist = Nod.GetActorsByTypes({"gun.nod","obli","nsam","ltur"}) + local ProducerBuildingslist = Nod.GetActorsByTypes({"hand","airs","rep","hpad.td"}) + + TransferBaseToPlayer(SinglePlayerPlayer, firstActivePlayer) + + local mcvSpawnCell = CPos.New(60, 65) + Utils.Do(GetMcvPlayers(), function(p) + if p ~= firstActivePlayer then + local mcv = Actor.Create("amcv", true, { Owner = p, Location = mcvSpawnCell }) + mcv.Scatter() + end + end) + + if #MissionPlayers >= 6 then + --table.remove(EnergyBuildingslist, 1) + end + + table.sort(DefenseBuildingslist, function(a, b) + return a.Type < b.Type + end) + + table.sort(ProducerBuildingslist, function(a, b) + return a.Type < b.Type + end) + + local BuildinglistList = {EnergyBuildingslist, DefenseBuildingslist, ProducerBuildingslist} + + local Assignmentiterator = 1 + Utils.Do(BuildinglistList,function(AID) + Utils.Do(AID,function(BID) + if Assignmentiterator > #MissionPlayers then + Assignmentiterator = 1 + end + BID.Owner = MissionPlayers[Assignmentiterator] + Assignmentiterator = Assignmentiterator + 1 + end) + end) + + if #MissionPlayers >= 2 then + Actor202.Owner = MissionPlayers[2] + Trigger.AfterDelay(5, function() + local initialHarvesters = firstActivePlayer.GetActorsByType("harv.td") + initialHarvesters[2].Owner = MissionPlayers[2] + + TemplePrime.Owner = Nod + Utils.Do(CyborgFactories, function(f) + f.Owner = Nod + end) + + end) + end + + Trigger.AfterDelay(10, function() + WaveAdjuster() + end) +end + +WaveAdjuster = function() + Airinterv = Map.LobbyOption("airint") + + if Airinterv == 999 then + Airinterv = 1 - (0.1 * #CoopPlayers) + elseif Airinterv == 998 then + Airinterv = 1 - (0.15 * #CoopPlayers) + end + + AirAttackInterval[Difficulty] = AirAttackInterval[Difficulty] * Airinterv +end + +AfterTick = function() + +end diff --git a/mods/ca/missions/coop-campaign/ca11-awakening-coop/map.bin b/mods/ca/missions/coop-campaign/ca11-awakening-coop/map.bin new file mode 100644 index 0000000000..193dcee867 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca11-awakening-coop/map.bin differ diff --git a/mods/ca/missions/coop-campaign/ca11-awakening-coop/map.png b/mods/ca/missions/coop-campaign/ca11-awakening-coop/map.png new file mode 100644 index 0000000000..14e9a12f5a Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca11-awakening-coop/map.png differ diff --git a/mods/ca/missions/coop-campaign/ca11-awakening-coop/map.yaml b/mods/ca/missions/coop-campaign/ca11-awakening-coop/map.yaml new file mode 100644 index 0000000000..b01e58d6f7 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca11-awakening-coop/map.yaml @@ -0,0 +1,1842 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 11: Awakening Co-op + +Author: Darkademic & Gandorques Hikla + +Tileset: DESERT + +MapSize: 130,98 + +Bounds: 1,1,128,96 + +Visibility: Lobby + +Categories: Co-op Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: Nod, USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + PlayerReference@Nod: + Name: Nod + Faction: nod + Color: FE1100 + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Creeps + PlayerReference@USSR: + Name: USSR + Bot: campaign + Faction: soviet + Color: 994050 + Enemies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: FE1100 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Creeps + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: 0B7310 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Creeps + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: 134691 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Creeps + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: 775A12 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Creeps + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: 82C900 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Creeps + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: EEA8A8 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Creeps + +Actors: + Actor0: tmpl + Owner: Nod + Location: 64,75 + Actor1: nsam + Owner: Nod + Location: 61,76 + Actor2: nsam + Owner: Nod + Location: 68,76 + CyborgFactory1: bio + Owner: Nod + Location: 63,79 + CyborgFactory2: bio + Owner: Nod + Location: 66,79 + Actor5: nsam + Owner: Nod + Location: 58,80 + Actor6: nsam + Owner: Nod + Location: 71,80 + TemplePrime: tmpp + Owner: Nod + Location: 64,82 + CyborgFactory3: bio + Owner: Nod + Location: 63,86 + CyborgFactory4: bio + Owner: Nod + Location: 66,86 + Actor10: rock1 + Owner: Neutral + Location: 56,76 + Actor11: brik + Owner: Nod + Location: 91,77 + Actor12: brik + Owner: Nod + Location: 91,79 + Actor13: brik + Owner: Nod + Location: 91,78 + Actor14: brik + Owner: Nod + Location: 90,79 + Actor15: brik + Owner: Nod + Location: 90,78 + Actor16: brik + Owner: Nod + Location: 91,76 + Actor17: brik + Owner: Nod + Location: 91,75 + Actor18: brik + Owner: Nod + Location: 91,74 + Actor19: brik + Owner: Nod + Location: 90,74 + Actor20: brik + Owner: Nod + Location: 90,75 + Actor21: brik + Owner: Nod + Location: 91,86 + Actor22: brik + Owner: Nod + Location: 90,86 + Actor23: brik + Owner: Nod + Location: 90,87 + Actor24: brik + Owner: Nod + Location: 91,87 + Actor25: brik + Owner: Nod + Location: 91,88 + Actor26: brik + Owner: Nod + Location: 91,89 + Actor27: brik + Owner: Nod + Location: 91,90 + Actor28: brik + Owner: Nod + Location: 91,91 + Actor29: brik + Owner: Nod + Location: 90,91 + Actor30: brik + Owner: Nod + Location: 90,90 + Actor31: brik + Owner: Nod + Location: 90,92 + Actor32: brik + Owner: Nod + Location: 90,93 + Actor33: brik + Owner: Nod + Location: 90,94 + Actor34: brik + Owner: Nod + Location: 90,95 + Actor35: brik + Owner: Nod + Location: 90,96 + Actor36: brik + Owner: Nod + Location: 85,96 + Actor37: brik + Owner: Nod + Location: 87,96 + Actor38: brik + Owner: Nod + Location: 86,96 + Actor39: brik + Owner: Nod + Location: 88,96 + Actor40: brik + Owner: Nod + Location: 89,96 + Actor41: brik + Owner: Nod + Location: 85,95 + Actor42: brik + Owner: Nod + Location: 84,95 + Actor43: brik + Owner: Nod + Location: 84,94 + Actor44: brik + Owner: Nod + Location: 84,93 + Actor45: brik + Owner: Nod + Location: 84,92 + Actor46: brik + Owner: Nod + Location: 84,91 + Actor47: brik + Owner: Nod + Location: 83,91 + Actor48: brik + Owner: Nod + Location: 82,91 + Actor49: brik + Owner: Nod + Location: 81,91 + Actor50: brik + Owner: Nod + Location: 81,90 + Actor51: brik + Owner: Nod + Location: 82,90 + Actor52: obli + Owner: Nod + Location: 90,77 + Actor53: obli + Owner: Nod + Location: 90,88 + Actor54: gun.nod + Owner: Nod + Location: 92,87 + TurretFacing: 785 + Actor55: gun.nod + Owner: Nod + Location: 92,78 + TurretFacing: 769 + Actor56: gun.nod + Owner: Nod + Location: 92,82 + TurretFacing: 777 + Actor57: brik + Owner: Nod + Location: 85,58 + Actor58: brik + Owner: Nod + Location: 85,59 + Actor59: brik + Owner: Nod + Location: 86,58 + Actor60: brik + Owner: Nod + Location: 86,59 + Actor61: brik + Owner: Nod + Location: 87,58 + Actor62: brik + Owner: Nod + Location: 87,59 + Actor63: brik + Owner: Nod + Location: 87,60 + Actor65: brik + Owner: Nod + Location: 87,61 + Actor66: brik + Owner: Nod + Location: 86,61 + Actor67: brik + Owner: Nod + Location: 86,62 + Actor68: brik + Owner: Nod + Location: 86,63 + Actor69: brik + Owner: Nod + Location: 86,64 + Actor70: brik + Owner: Nod + Location: 87,64 + Actor71: brik + Owner: Nod + Location: 87,65 + Actor72: brik + Owner: Nod + Location: 86,65 + Actor73: brik + Owner: Nod + Location: 80,58 + Actor74: brik + Owner: Nod + Location: 81,58 + Actor75: brik + Owner: Nod + Location: 81,59 + Actor76: brik + Owner: Nod + Location: 80,59 + Actor77: brik + Owner: Nod + Location: 79,58 + Actor78: brik + Owner: Nod + Location: 78,58 + Actor79: brik + Owner: Nod + Location: 77,58 + Actor80: brik + Owner: Nod + Location: 77,59 + Actor81: brik + Owner: Nod + Location: 76,58 + Actor82: brik + Owner: Nod + Location: 76,59 + Actor83: brik + Owner: Nod + Location: 62,57 + Actor84: brik + Owner: Nod + Location: 62,58 + Actor85: brik + Owner: Nod + Location: 63,57 + Actor86: brik + Owner: Nod + Location: 63,58 + Actor87: brik + Owner: Nod + Location: 61,57 + Actor88: brik + Owner: Nod + Location: 60,57 + Actor89: brik + Owner: Nod + Location: 59,57 + Actor90: brik + Owner: Nod + Location: 59,58 + Actor91: brik + Owner: Nod + Location: 60,58 + Actor92: brik + Owner: Nod + Location: 55,58 + Actor93: brik + Owner: Nod + Location: 55,57 + Actor94: brik + Owner: Nod + Location: 54,57 + Actor95: brik + Owner: Nod + Location: 54,58 + Actor96: brik + Owner: Nod + Location: 53,57 + Actor97: brik + Owner: Nod + Location: 52,57 + Actor98: brik + Owner: Nod + Location: 51,57 + Actor99: brik + Owner: Nod + Location: 51,58 + Actor100: brik + Owner: Nod + Location: 52,58 + Actor101: brik + Owner: Nod + Location: 45,61 + Actor102: brik + Owner: Nod + Location: 46,61 + Actor103: brik + Owner: Nod + Location: 47,61 + Actor104: brik + Owner: Nod + Location: 47,62 + Actor105: brik + Owner: Nod + Location: 46,62 + Actor106: brik + Owner: Nod + Location: 43,61 + Actor107: brik + Owner: Nod + Location: 44,61 + Actor108: brik + Owner: Nod + Location: 43,62 + Actor109: brik + Owner: Nod + Location: 44,62 + Actor110: brik + Owner: Nod + Location: 43,63 + Actor111: brik + Owner: Nod + Location: 43,64 + Actor112: brik + Owner: Nod + Location: 43,65 + Actor113: brik + Owner: Nod + Location: 44,65 + Actor114: brik + Owner: Nod + Location: 44,64 + Actor115: brik + Owner: Nod + Location: 43,69 + Actor116: brik + Owner: Nod + Location: 44,69 + Actor117: brik + Owner: Nod + Location: 43,70 + Actor118: brik + Owner: Nod + Location: 44,70 + Actor119: brik + Owner: Nod + Location: 43,71 + Actor120: brik + Owner: Nod + Location: 43,72 + Actor121: brik + Owner: Nod + Location: 43,73 + Actor122: brik + Owner: Nod + Location: 43,74 + Actor123: brik + Owner: Nod + Location: 43,75 + Actor124: brik + Owner: Nod + Location: 43,76 + Actor125: brik + Owner: Nod + Location: 44,76 + Actor126: brik + Owner: Nod + Location: 44,75 + Actor127: brik + Owner: Nod + Location: 43,80 + Actor128: brik + Owner: Nod + Location: 44,80 + Actor129: brik + Owner: Nod + Location: 43,81 + Actor130: brik + Owner: Nod + Location: 44,81 + Actor131: brik + Owner: Nod + Location: 43,82 + Actor132: brik + Owner: Nod + Location: 43,83 + Actor133: brik + Owner: Nod + Location: 43,84 + Actor134: brik + Owner: Nod + Location: 43,85 + Actor135: brik + Owner: Nod + Location: 43,86 + Actor136: brik + Owner: Nod + Location: 43,87 + Actor137: brik + Owner: Nod + Location: 44,87 + Actor138: brik + Owner: Nod + Location: 44,86 + Actor139: obli + Owner: Nod + Location: 53,58 + Actor140: obli + Owner: Nod + Location: 61,58 + Actor141: obli + Owner: Nod + Location: 45,62 + Actor142: obli + Owner: Nod + Location: 44,63 + Actor143: obli + Owner: Nod + Location: 44,71 + Actor144: obli + Owner: Nod + Location: 44,74 + Actor145: obli + Owner: Nod + Location: 44,82 + Actor146: obli + Owner: Nod + Location: 44,85 + Actor147: obli + Owner: Nod + Location: 79,59 + Actor148: obli + Owner: Nod + Location: 86,60 + Actor149: obli + Owner: Nod + Location: 74,49 + Actor150: nuk2 + Owner: Nod + Location: 63,69 + Actor151: nuk2 + Owner: Nod + Location: 65,69 + Actor152: nuk2 + Owner: Nod + Location: 67,69 + Actor153: nuk2 + Owner: Nod + Location: 69,69 + Actor154: nuk2 + Owner: Nod + Location: 63,66 + Actor155: nuk2 + Owner: Nod + Location: 65,66 + Actor156: nuk2 + Owner: Nod + Location: 67,66 + Actor157: nuk2 + Owner: Nod + Location: 69,66 + Actor158: chain + Owner: Nod + Location: 62,72 + Actor159: chain + Owner: Nod + Location: 63,72 + Actor160: chain + Owner: Nod + Location: 65,72 + Actor161: chain + Owner: Nod + Location: 64,72 + Actor162: chain + Owner: Nod + Location: 67,72 + Actor163: chain + Owner: Nod + Location: 66,72 + Actor164: chain + Owner: Nod + Location: 68,72 + Actor165: chain + Owner: Nod + Location: 69,72 + Actor166: chain + Owner: Nod + Location: 70,72 + Actor167: chain + Owner: Nod + Location: 71,72 + Actor168: chain + Owner: Nod + Location: 71,71 + Actor169: chain + Owner: Nod + Location: 71,69 + Actor170: chain + Owner: Nod + Location: 71,67 + Actor171: chain + Owner: Nod + Location: 71,68 + Actor172: chain + Owner: Nod + Location: 71,70 + Actor173: chain + Owner: Nod + Location: 62,71 + Actor174: chain + Owner: Nod + Location: 62,70 + Actor175: chain + Owner: Nod + Location: 62,69 + Actor176: chain + Owner: Nod + Location: 62,68 + Actor177: chain + Owner: Nod + Location: 62,67 + Actor178: chain + Owner: Nod + Location: 62,66 + Actor179: chain + Owner: Nod + Location: 62,65 + Actor180: chain + Owner: Nod + Location: 63,65 + Actor181: chain + Owner: Nod + Location: 64,65 + Actor182: chain + Owner: Nod + Location: 66,65 + Actor183: chain + Owner: Nod + Location: 65,65 + Actor184: chain + Owner: Nod + Location: 67,65 + Actor185: chain + Owner: Nod + Location: 68,65 + Actor186: chain + Owner: Nod + Location: 69,65 + Actor187: chain + Owner: Nod + Location: 70,65 + Actor188: chain + Owner: Nod + Location: 71,65 + Actor189: chain + Owner: Nod + Location: 71,66 + Actor190: afac + Owner: Nod + Location: 58,67 + Actor191: airs + Owner: Nod + Location: 67,59 + Actor193: hq + Owner: Nod + Location: 75,65 + Actor194: rep + Owner: Nod + Location: 49,76 + Actor195: hand + Owner: Nod + Location: 79,63 + Actor196: hand + Owner: Nod + Location: 56,62 + Actor197: hand + Owner: Nod + Location: 50,70 + Actor198: hpad.td + Owner: Nod + Location: 78,80 + Actor199: hpad.td + Owner: Nod + Location: 78,76 + Actor200: hpad.td + Owner: Nod + Location: 81,78 + Actor201: proc.td + Owner: Nod + Location: 85,72 + Actor202: proc.td + Owner: Nod + Location: 87,67 + Actor203: nuk2 + Owner: Nod + Location: 79,68 + Actor204: nuk2 + Owner: Nod + Location: 79,71 + Actor205: nuk2 + Owner: Nod + Location: 55,67 + Actor206: nuk2 + Owner: Nod + Location: 53,67 + Actor207: nuk2 + Owner: Nod + Location: 64,61 + Actor208: nuk2 + Owner: Nod + Location: 62,61 + Actor209: nuk2 + Owner: Nod + Location: 54,86 + Actor210: nuk2 + Owner: Nod + Location: 52,86 + Actor211: nuk2 + Owner: Nod + Location: 75,86 + Actor212: nsam + Owner: Nod + Location: 57,88 + Actor213: nsam + Owner: Nod + Location: 72,88 + Actor214: nsam + Owner: Nod + Location: 71,50 + Actor215: nsam + Owner: Nod + Location: 66,56 + Actor216: nsam + Owner: Nod + Location: 59,63 + Actor217: nsam + Owner: Nod + Location: 46,72 + Actor218: nsam + Owner: Nod + Location: 46,83 + Actor219: nsam + Owner: Nod + Location: 46,64 + Actor220: nsam + Owner: Nod + Location: 85,67 + Actor221: nsam + Owner: Nod + Location: 89,73 + Actor222: nsam + Owner: Nod + Location: 87,87 + Actor223: nuk2 + Owner: Nod + Location: 88,93 + Actor224: nuk2 + Owner: Nod + Location: 86,93 + Actor225: nuk2 + Owner: Nod + Location: 86,90 + Actor226: nuk2 + Owner: Nod + Location: 88,90 + Actor227: gun.nod + Owner: Nod + Location: 42,81 + Actor228: gun.nod + Owner: Nod + Location: 42,75 + TurretFacing: 277 + Actor229: gun.nod + Owner: Nod + Location: 42,70 + TurretFacing: 245 + Actor230: gun.nod + Owner: Nod + Location: 42,64 + TurretFacing: 245 + Actor231: gun.nod + Owner: Nod + Location: 46,60 + Actor233: gun.nod + Owner: Nod + Location: 54,56 + TurretFacing: 118 + Actor234: gun.nod + Owner: Nod + Location: 60,56 + TurretFacing: 0 + Actor235: gun.nod + Owner: Nod + Location: 50,57 + Actor236: gun.nod + Owner: Nod + Location: 80,57 + TurretFacing: 15 + Actor237: gun.nod + Owner: Nod + Location: 86,57 + TurretFacing: 0 + Actor238: rep + Owner: Nod + Location: 83,81 + Actor239: rep + Owner: Nod + Location: 73,61 + Actor240: airs + Owner: Nod + Location: 49,81 + Actor243: nuk2 + Owner: Nod + Location: 50,86 + Actor244: nuk2 + Owner: Nod + Location: 77,88 + Actor245: obli + Owner: Nod + Location: 74,78 + Actor246: obli + Owner: Nod + Location: 69,87 + Actor247: obli + Owner: Nod + Location: 61,87 + Actor248: obli + Owner: Nod + Location: 55,73 + Actor249: ltur + Owner: Nod + Location: 56,79 + TurretFacing: 245 + Actor250: ltur + Owner: Nod + Location: 75,81 + TurretFacing: 721 + Actor251: ltur + Owner: Nod + Location: 73,85 + TurretFacing: 745 + Actor252: ltur + Owner: Nod + Location: 57,85 + TurretFacing: 293 + SSM1: mlrs + Owner: Nod + Location: 72,52 + Facing: 919 + SSM2: mlrs + Owner: Nod + Location: 89,75 + Facing: 634 + SSM3: mlrs + Owner: Nod + Location: 88,88 + Facing: 769 + SSM4: mlrs + Owner: Nod + Location: 45,83 + Facing: 261 + SSM5: mlrs + Owner: Nod + Location: 45,72 + Facing: 253 + SSM6: mlrs + Owner: Nod + Location: 49,62 + Facing: 126 + SSM7: mlrs + Owner: Nod + Location: 64,57 + Facing: 95 + Actor260: split2 + Owner: Neutral + Location: 101,91 + Actor261: split2 + Owner: Neutral + Location: 111,86 + Actor262: split2 + Owner: Neutral + Location: 123,91 + Actor263: split2 + Owner: Neutral + Location: 99,74 + Actor264: rock1 + Owner: Neutral + Location: 64,50 + Actor265: rock6 + Owner: Neutral + Location: 54,46 + Actor266: rock2 + Owner: Neutral + Location: 32,41 + Actor267: rock4 + Owner: Neutral + Location: 14,59 + Actor268: rock5 + Owner: Neutral + Location: 12,63 + Actor269: rock1 + Owner: Neutral + Location: 10,44 + Actor270: rock3 + Owner: Neutral + Location: 24,44 + Actor271: rock7 + Owner: Neutral + Location: 93,36 + Actor274: tc01 + Owner: Neutral + Location: 38,47 + Actor275: tc01 + Owner: Neutral + Location: 13,49 + Actor276: tc01 + Owner: Neutral + Location: 5,27 + Actor277: tc01 + Owner: Neutral + Location: 33,25 + Actor278: tc01 + Owner: Neutral + Location: 60,10 + Actor279: tc01 + Owner: Neutral + Location: 84,26 + Actor280: tc01 + Owner: Neutral + Location: 109,47 + Actor281: tc01 + Owner: Neutral + Location: 109,26 + Actor282: tc01 + Owner: Neutral + Location: 102,62 + Actor284: tc01 + Owner: Neutral + Location: 121,78 + Actor285: tc01 + Owner: Neutral + Location: 34,91 + Actor286: tc01 + Owner: Neutral + Location: 27,76 + Actor287: tc01 + Owner: Neutral + Location: 18,16 + Actor288: rock6 + Owner: Neutral + Location: 22,71 + Actor289: rock6 + Owner: Neutral + Location: 113,32 + Actor290: rock6 + Owner: Neutral + Location: 76,13 + Actor291: rock1 + Owner: Neutral + Location: 116,76 + Actor292: rock1 + Owner: Neutral + Location: 40,8 + Actor293: rock4 + Owner: Neutral + Location: 41,7 + Actor294: rock4 + Owner: Neutral + Location: 57,23 + Actor295: rock4 + Owner: Neutral + Location: 22,84 + Actor296: rock2 + Owner: Neutral + Location: 107,20 + Actor297: t09 + Owner: Neutral + Location: 83,54 + Actor298: t09 + Owner: Neutral + Location: 59,36 + Actor299: t08 + Owner: Neutral + Location: 28,58 + Actor300: t08 + Owner: Neutral + Location: 56,27 + Actor301: t08 + Owner: Neutral + Location: 37,3 + Actor302: t08 + Owner: Neutral + Location: 111,5 + Actor303: t08 + Owner: Neutral + Location: 113,37 + Actor304: t08 + Owner: Neutral + Location: 103,38 + Actor305: t08 + Owner: Neutral + Location: 111,60 + Actor306: t08 + Owner: Neutral + Location: 109,76 + Actor307: t08 + Owner: Neutral + Location: 126,58 + Actor308: t08 + Owner: Neutral + Location: 35,80 + Actor309: t08 + Owner: Neutral + Location: 39,22 + Actor310: t08 + Owner: Neutral + Location: 13,15 + Actor311: t08 + Owner: Neutral + Location: 8,38 + Actor312: t08 + Owner: Neutral + Location: 86,50 + Actor313: v28 + Owner: Neutral + Location: 109,16 + Actor314: v24 + Owner: Neutral + Location: 111,12 + Actor315: v25 + Owner: Neutral + Location: 121,7 + Actor316: v31 + Owner: Neutral + Location: 123,13 + Actor317: v22 + Owner: Neutral + Location: 124,11 + Actor318: v21 + Owner: Neutral + Location: 119,19 + Actor319: v20 + Owner: Neutral + Location: 105,12 + Actor320: v36 + Owner: Neutral + Location: 104,18 + Actor321: v26 + Owner: Neutral + Location: 115,16 + Actor322: v27 + Owner: Neutral + Location: 116,8 + Actor323: v30 + Owner: Neutral + Location: 108,23 + Actor324: v23 + Owner: Neutral + Location: 113,18 + Actor325: v28 + Owner: Neutral + Location: 114,2 + Actor326: v29 + Owner: Neutral + Location: 125,8 + Actor327: v34 + Owner: Neutral + Location: 121,12 + Actor328: v35 + Owner: Neutral + Location: 113,9 + Actor329: v32 + Owner: Neutral + Location: 101,21 + Actor330: t04 + Owner: Neutral + Location: 101,15 + Actor331: t04 + Owner: Neutral + Location: 119,14 + Actor332: rock2 + Owner: Neutral + Location: 10,2 + Actor333: t08 + Owner: Neutral + Location: 9,5 + Actor334: t18 + Owner: Neutral + Location: 25,1 + Actor335: t09 + Owner: Neutral + Location: 25,8 + Actor336: t04 + Owner: Neutral + Location: 7,10 + Actor337: t04 + Owner: Neutral + Location: 21,21 + Actor338: t08 + Owner: Neutral + Location: 19,26 + Actor340: t09 + Owner: Neutral + Location: 21,41 + Actor341: t09 + Owner: Neutral + Location: 43,41 + Actor342: t09 + Owner: Neutral + Location: 35,62 + Actor343: rock4 + Owner: Neutral + Location: 28,62 + Actor344: t18 + Owner: Neutral + Location: 122,61 + Actor345: rock1 + Owner: Neutral + Location: 124,54 + Actor346: rock4 + Owner: Neutral + Location: 127,63 + Actor347: rock4 + Owner: Neutral + Location: 103,52 + Actor348: rock5 + Owner: Neutral + Location: 95,57 + Actor349: ltnk + Owner: Nod + Location: 40,76 + Facing: 256 + Actor350: ltnk + Owner: Nod + Location: 38,67 + Facing: 256 + Actor351: ltnk + Owner: Nod + Location: 40,62 + Facing: 256 + Actor352: ltnk + Owner: Nod + Location: 40,81 + Facing: 256 + Actor353: ltnk + Owner: Nod + Location: 45,59 + Facing: 111 + Actor354: ltnk + Owner: Nod + Location: 49,55 + Facing: 118 + Actor355: ltnk + Owner: Nod + Location: 56,55 + Facing: 0 + Actor356: ltnk + Owner: Nod + Location: 62,53 + Facing: 0 + Actor357: ltnk + Owner: Nod + Location: 85,55 + Facing: 0 + Actor358: ltnk + Owner: Nod + Location: 78,54 + Facing: 0 + Actor359: ltnk + Owner: Nod + Location: 90,84 + Facing: 753 + Actor360: bike + Owner: Nod + Facing: 384 + Location: 49,84 + Actor361: bike + Owner: Nod + Facing: 384 + Location: 50,84 + Actor362: bike + Owner: Nod + Facing: 384 + Location: 51,84 + Actor363: bike + Owner: Nod + Facing: 384 + Location: 68,62 + Actor364: bike + Owner: Nod + Facing: 384 + Location: 69,62 + Actor365: bike + Owner: Nod + Facing: 384 + Location: 67,62 + Actor366: stnk.nod + Owner: Nod + Facing: 384 + Location: 59,83 + Actor367: stnk.nod + Owner: Nod + Facing: 384 + Location: 56,81 + Actor368: stnk.nod + Owner: Nod + Location: 72,82 + Facing: 666 + Actor369: hftk + Owner: Nod + Location: 86,78 + Facing: 658 + Actor370: hftk + Owner: Nod + Location: 52,62 + Facing: 118 + Actor371: ftnk + Owner: Nod + Location: 83,61 + Facing: 0 + Actor372: n1 + Owner: Nod + SubCell: 3 + Location: 41,82 + Facing: 206 + Actor373: n1 + Owner: Nod + Location: 41,82 + SubCell: 1 + Facing: 198 + Actor374: n1 + Owner: Nod + SubCell: 3 + Location: 42,80 + Facing: 190 + Actor375: n1 + Owner: Nod + SubCell: 3 + Location: 41,76 + Facing: 214 + Actor376: n1 + Owner: Nod + Location: 41,75 + SubCell: 3 + Facing: 222 + Actor377: n1 + Owner: Nod + Location: 41,75 + SubCell: 1 + Facing: 237 + Actor378: n1 + Owner: Nod + SubCell: 3 + Location: 41,72 + Facing: 206 + Actor379: n1 + Owner: Nod + Location: 42,69 + SubCell: 3 + Facing: 158 + Actor380: n1 + Owner: Nod + Location: 42,69 + SubCell: 1 + Facing: 190 + Actor381: n1 + Owner: Nod + SubCell: 3 + Location: 41,64 + Facing: 384 + Actor382: n1 + Owner: Nod + SubCell: 3 + Location: 41,62 + Facing: 384 + Actor383: n1 + Owner: Nod + Location: 41,62 + SubCell: 1 + Facing: 150 + Actor384: n1 + Owner: Nod + SubCell: 3 + Location: 44,60 + Facing: 277 + Actor385: n1 + Owner: Nod + SubCell: 3 + Location: 46,58 + Facing: 174 + Actor386: n1 + Owner: Nod + SubCell: 3 + Location: 49,58 + Facing: 198 + Actor387: n1 + Owner: Nod + SubCell: 3 + Location: 50,56 + Facing: 0 + Actor388: n1 + Owner: Nod + Location: 50,56 + SubCell: 1 + Facing: 198 + Actor389: n1 + Owner: Nod + SubCell: 3 + Location: 48,56 + Facing: 0 + Actor390: n1 + Owner: Nod + SubCell: 3 + Location: 56,56 + Facing: 0 + Actor391: n1 + Owner: Nod + SubCell: 3 + Location: 59,55 + Facing: 39 + Actor392: n1 + Owner: Nod + SubCell: 3 + Location: 61,56 + Facing: 0 + Actor393: n1 + Owner: Nod + SubCell: 3 + Location: 62,54 + Facing: 142 + Actor394: n1 + Owner: Nod + Location: 62,54 + SubCell: 1 + Facing: 0 + Actor395: n1 + Owner: Nod + SubCell: 3 + Location: 77,55 + Facing: 0 + Actor396: n1 + Owner: Nod + SubCell: 3 + Location: 77,53 + Facing: 0 + Actor397: n1 + Owner: Nod + Location: 77,53 + SubCell: 1 + Facing: 0 + Actor398: n1 + Owner: Nod + SubCell: 3 + Location: 81,55 + Facing: 0 + Actor399: n1 + Owner: Nod + SubCell: 3 + Location: 80,54 + Facing: 39 + Actor400: n1 + Owner: Nod + SubCell: 3 + Location: 85,54 + Facing: 919 + Actor401: n1 + Owner: Nod + Location: 85,54 + SubCell: 1 + Facing: 745 + Actor402: n1 + Owner: Nod + SubCell: 3 + Location: 87,55 + Facing: 721 + Actor403: n1 + Owner: Nod + SubCell: 3 + Location: 92,80 + Facing: 856 + Actor404: n1 + Owner: Nod + Location: 92,80 + SubCell: 1 + Facing: 793 + Actor405: n1 + Owner: Nod + SubCell: 3 + Location: 92,84 + Facing: 737 + Actor406: n1 + Owner: Nod + SubCell: 3 + Location: 93,86 + Facing: 872 + Actor407: n1 + Owner: Nod + Location: 93,86 + SubCell: 1 + Facing: 785 + Actor408: n1 + Owner: Nod + SubCell: 3 + Location: 92,85 + Facing: 626 + Actor409: mech + Owner: Nod + Facing: 384 + Location: 84,80 + SubCell: 3 + Actor410: mech + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 87,82 + Actor411: mech + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 86,85 + Actor412: mech + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 81,84 + Actor413: mech + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 48,78 + Actor414: mech + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 49,75 + Actor415: mech + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 52,79 + Actor416: mech + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 52,76 + Actor417: mech + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 72,64 + Actor418: mech + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 72,61 + Actor419: mech + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 77,63 + Actor420: mech + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 76,61 + Actor421: n4 + Owner: Nod + SubCell: 3 + Location: 90,81 + Facing: 745 + Actor422: n4 + Owner: Nod + SubCell: 3 + Location: 89,85 + Facing: 737 + Actor423: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 87,77 + Actor424: n4 + Owner: Nod + SubCell: 3 + Location: 84,60 + Facing: 0 + Actor425: n4 + Owner: Nod + SubCell: 3 + Location: 80,61 + Facing: 0 + Actor426: n4 + Owner: Nod + SubCell: 3 + Location: 57,58 + Facing: 15 + Actor427: n4 + Owner: Nod + SubCell: 3 + Location: 42,67 + Facing: 190 + Actor428: n4 + Owner: Nod + SubCell: 3 + Location: 42,79 + Facing: 317 + Actor429: n4 + Owner: Nod + SubCell: 3 + Location: 48,59 + Facing: 182 + Actor430: n3 + Owner: Nod + SubCell: 3 + Location: 46,70 + Facing: 610 + Actor431: n3 + Owner: Nod + Facing: 384 + Location: 46,70 + SubCell: 1 + Actor432: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 46,76 + Actor433: n3 + Owner: Nod + SubCell: 3 + Location: 45,81 + Facing: 301 + Actor434: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 45,64 + Actor435: n3 + Owner: Nod + SubCell: 3 + Location: 50,59 + Facing: 158 + Actor436: n3 + Owner: Nod + SubCell: 3 + Location: 56,59 + Facing: 7 + Actor437: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 65,57 + Actor438: n3 + Owner: Nod + SubCell: 3 + Location: 71,54 + Facing: 0 + Actor439: n3 + Owner: Nod + SubCell: 3 + Location: 79,55 + Facing: 0 + Actor440: n3 + Owner: Nod + SubCell: 3 + Location: 85,57 + Facing: 0 + Actor441: n3 + Owner: Nod + SubCell: 3 + Location: 85,62 + Facing: 0 + Actor442: n3 + Owner: Nod + SubCell: 3 + Location: 73,58 + Facing: 0 + Actor443: n3 + Owner: Nod + Location: 89,81 + SubCell: 3 + Facing: 721 + Actor444: n3 + Owner: Nod + SubCell: 3 + Location: 90,85 + Facing: 864 + Actor445: split2 + Owner: Neutral + Location: 95,24 + Actor446: split2 + Owner: Neutral + Location: 46,43 + Actor448: split2 + Owner: Neutral + Location: 53,41 + Actor447: split2 + Owner: Neutral + Location: 113,45 + Actor339: t09 + Owner: Neutral + Location: 5,20 + Actor449: split2 + Owner: Neutral + Location: 19,54 + Actor450: camera + Owner: USSR + Location: 83,58 + Actor451: camera + Owner: USSR + Location: 71,55 + Actor452: camera + Owner: USSR + Location: 57,57 + Actor453: camera + Owner: USSR + Location: 49,60 + Actor454: camera + Owner: USSR + Location: 44,67 + Actor455: camera + Owner: USSR + Location: 44,78 + Actor456: camera + Owner: USSR + Location: 91,82 + Actor457: camera + Owner: USSR + Location: 55,66 + Actor458: camera + Owner: USSR + Location: 77,67 + Actor459: camera + Owner: USSR + Location: 77,79 + Actor460: camera + Owner: USSR + Location: 54,80 + Actor461: camera + Owner: USSR + Location: 65,81 + Actor462: tc01 + Owner: Neutral + Location: 47,93 + Actor463: rock2 + Owner: Neutral + Location: 50,92 + Actor464: rock4 + Owner: Neutral + Location: 45,91 + AttackSpawn1: waypoint + Owner: Neutral + Location: 1,84 + AttackSpawn2: waypoint + Owner: Neutral + Location: 1,28 + AttackSpawn3: waypoint + Owner: Neutral + Location: 1,13 + AttackSpawn4: waypoint + Owner: Neutral + Location: 22,1 + AttackSpawn5: waypoint + Owner: Neutral + Location: 41,1 + AttackSpawn6: waypoint + Owner: Neutral + Location: 58,1 + AttackSpawn7: waypoint + Owner: Neutral + Location: 110,1 + AttackSpawn8: waypoint + Owner: Neutral + Location: 128,36 + Actor466: tc01 + Owner: Neutral + Location: 92,42 + HaloDropLanding2: waypoint + Owner: Neutral + Location: 24,68 + HaloDropLanding1: waypoint + Owner: Neutral + Location: 21,80 + HaloDropLanding3: waypoint + Owner: Neutral + Location: 25,40 + HaloDropLanding4: waypoint + Owner: Neutral + Location: 29,30 + HaloDropLanding5: waypoint + Owner: Neutral + Location: 49,19 + HaloDropLanding6: waypoint + Owner: Neutral + Location: 67,28 + HaloDropLanding7: waypoint + Owner: Neutral + Location: 82,16 + HaloDropLanding8: waypoint + Owner: Neutral + Location: 91,34 + HaloDropLanding9: waypoint + Owner: Neutral + Location: 104,31 + HaloDropLanding10: waypoint + Owner: Neutral + Location: 104,56 + HaloDropLanding11: waypoint + Owner: Neutral + Location: 122,69 + Actor477: bggy + Owner: Nod + Facing: 384 + Location: 48,65 + Actor478: bggy + Owner: Nod + Facing: 384 + Location: 47,81 + Actor479: bggy + Owner: Nod + Location: 82,86 + Facing: 761 + Actor480: bggy + Owner: Nod + Location: 84,65 + Facing: 0 + PlayerStart: waypoint + Owner: Neutral + Location: 65,76 + AttackDest1: waypoint + Owner: Neutral + Location: 8,84 + AttackDest2: waypoint + Owner: Neutral + Location: 10,40 + AttackDest3: waypoint + Owner: Neutral + Location: 21,19 + AttackDest4: waypoint + Owner: Neutral + Location: 22,18 + AttackDest5: waypoint + Owner: Neutral + Location: 42,17 + AttackDest6: waypoint + Owner: Neutral + Location: 58,15 + AttackDest7: waypoint + Owner: Neutral + Location: 110,18 + AttackDest8: waypoint + Owner: Neutral + Location: 110,40 + AttackSpawn9: waypoint + Owner: Neutral + Location: 59,1 + AttackDest9: waypoint + Owner: Neutral + Location: 82,19 + HaloDropSpawn1: waypoint + Owner: Neutral + Location: 1,62 + HaloDropSpawn2: waypoint + Owner: Neutral + Location: 10,1 + HaloDropSpawn3: waypoint + Owner: Neutral + Location: 67,1 + HaloDropSpawn4: waypoint + Owner: Neutral + Location: 128,26 + AttackSpawn10: waypoint + Owner: Neutral + Location: 111,1 + AttackDest10: waypoint + Owner: Neutral + Location: 89,38 + CyborgRally1: waypoint + Owner: Neutral + Location: 55,82 + CyborgRally2: waypoint + Owner: Neutral + Location: 75,83 + ConyardPosition1: waypoint + Owner: Neutral + Location: 113,25 + RefPosition1: waypoint + Owner: Neutral + Location: 102,24 + ConyardPosition2: waypoint + Owner: Neutral + Location: 46,26 + RefPosition2: waypoint + Owner: Neutral + Location: 37,30 + TeslaCoilPosition2: waypoint + Owner: Neutral + Location: 44,28 + TeslaCoilPosition1: waypoint + Owner: Neutral + Location: 111,27 + ConyardPosition3: waypoint + Owner: Neutral + Location: 18,40 + RefPosition3: waypoint + Owner: Neutral + Location: 18,45 + TeslaCoilPosition3: waypoint + Owner: Neutral + Location: 21,41 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-covenants.yaml, ca|missions/main-campaign/ca11-awakening/awakening-rules.yaml, ca|rules/custom/coop-rules.yaml, awakening-coop-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/coop-campaign/ca12-supremacy-coop/map.bin b/mods/ca/missions/coop-campaign/ca12-supremacy-coop/map.bin new file mode 100644 index 0000000000..b802d7c8e8 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca12-supremacy-coop/map.bin differ diff --git a/mods/ca/missions/coop-campaign/ca12-supremacy-coop/map.png b/mods/ca/missions/coop-campaign/ca12-supremacy-coop/map.png new file mode 100644 index 0000000000..10f75e900b Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca12-supremacy-coop/map.png differ diff --git a/mods/ca/missions/coop-campaign/ca12-supremacy-coop/map.yaml b/mods/ca/missions/coop-campaign/ca12-supremacy-coop/map.yaml new file mode 100644 index 0000000000..99f31a04c2 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca12-supremacy-coop/map.yaml @@ -0,0 +1,3464 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 12: Supremacy Co-op + +Author: Darkademic & Gandorques Hikla + +Tileset: DESERT + +MapSize: 162,130 + +Bounds: 1,1,160,128 + +Visibility: Lobby + +Categories: Co-op Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: Nod, Nod2, Nod3, GDI, Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + PlayerReference@Nod: + Name: Nod + Faction: nod + Color: FE1100 + Allies: Nod, Nod2, Nod3, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: GDI, Greece, Creeps + PlayerReference@Greece: + Name: Greece + Bot: campaign + Faction: allies + Color: 99ACF2 + Allies: GDI + Enemies: Nod, Nod2, Nod3, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@GDI: + Name: GDI + Bot: campaign + Faction: gdi + Color: F2CF74 + Allies: Greece + Enemies: Nod, Nod2, Nod3, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@Nod2: + Name: Nod2 + Faction: nod + Color: 6D738C + Allies: Nod, Nod3, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: GDI, Greece, Creeps + PlayerReference@Nod3: + Name: Nod3 + Faction: nod + Color: 6D738C + Allies: Nod, Nod2, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: GDI, Greece, Creeps + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: FE1100 + LockColor: True + Allies: Nod, Nod2, Nod3, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: GDI, Greece, Creeps + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: 0B7310 + LockColor: True + Allies: Nod, Nod2, Nod3, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: GDI, Greece, Creeps + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: 134691 + LockColor: True + Allies: Nod, Nod2, Nod3, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: GDI, Greece, Creeps + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: 775A12 + LockColor: True + Allies: Nod, Nod2, Nod3, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: GDI, Greece, Creeps + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: 82C900 + LockColor: True + Allies: Nod, Nod2, Nod3, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: GDI, Greece, Creeps + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: EEA8A8 + LockColor: True + Allies: Nod, Nod2, Nod3, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: GDI, Greece, Creeps + +Actors: + Actor0: nuk2 + Location: 94,124 + Owner: Nod2 + Health: 45 + Actor1: nuk2 + Location: 96,124 + Owner: Nod2 + Health: 37 + Actor2: nuk2 + Location: 98,124 + Owner: Nod2 + Health: 24 + Actor3: proc.td + Location: 102,114 + Owner: Nod2 + FreeActor@SHARV: False + FreeActor: False + Health: 45 + Actor4: hand + Location: 88,111 + Owner: Nod2 + Health: 35 + Actor5: airs + Location: 90,116 + Owner: Nod2 + Health: 37 + Actor6: obli + Location: 100,109 + Owner: Nod2 + Health: 45 + Actor7: hq + Location: 89,125 + Owner: Nod2 + Health: 33 + Actor8: airs + Owner: Nod3 + Location: 13,40 + Health: 37 + Actor9: nuk2 + Owner: Nod3 + Location: 3,40 + Health: 37 + Actor10: nuk2 + Owner: Nod3 + Location: 4,33 + Health: 24 + Actor11: nuk2 + Owner: Nod3 + Location: 4,36 + Health: 45 + Actor12: hand + Owner: Nod3 + Location: 20,32 + Health: 35 + Actor13: proc.td + Owner: Nod3 + Location: 7,31 + FreeActor@SHARV: False + FreeActor: False + Health: 45 + Actor15: obli + Owner: Nod3 + Location: 25,34 + Health: 45 + Actor16: hq + Owner: Nod3 + Location: 16,35 + Health: 33 + Actor17: nsam + Owner: Nod3 + Location: 22,28 + Health: 41 + Actor18: nsam + Owner: Nod2 + Location: 100,111 + TurretFacing: 0 + Health: 41 + Actor20: rmbc + Owner: Nod + Location: 8,119 + SubCell: 1 + Facing: 896 + Actor26: rmbc + Owner: Nod + SubCell: 1 + Facing: 896 + Location: 14,123 + Actor28: reap + Owner: Nod + SubCell: 3 + Location: 7,120 + Facing: 896 + Actor29: reap + Owner: Nod + SubCell: 3 + Facing: 896 + Location: 13,124 + Actor30: reap + Owner: Nod + SubCell: 3 + Facing: 896 + Location: 10,122 + Actor33: n1c + Owner: Nod + Location: 10,117 + SubCell: 2 + Facing: 896 + Actor35: n1c + Owner: Nod + Location: 10,117 + SubCell: 5 + Facing: 896 + Actor32: n1c + Owner: Nod + Location: 10,117 + SubCell: 1 + Facing: 896 + Actor23: rmbc + Owner: Nod + Location: 8,119 + SubCell: 5 + Facing: 896 + Actor25: rmbc + Owner: Nod + SubCell: 5 + Facing: 896 + Location: 14,123 + Actor37: n3c + Owner: Nod + Location: 11,119 + SubCell: 2 + Facing: 896 + Actor39: n3c + Owner: Nod + Location: 11,119 + SubCell: 5 + Facing: 896 + Actor36: n3c + Owner: Nod + Location: 11,119 + SubCell: 1 + Facing: 896 + Actor40: n3c + Owner: Nod + SubCell: 2 + Facing: 896 + Location: 13,120 + Actor42: n3c + Owner: Nod + SubCell: 5 + Location: 13,120 + Facing: 896 + Actor43: n3c + Owner: Nod + SubCell: 1 + Facing: 896 + Location: 13,120 + Actor44: n1c + Owner: Nod + SubCell: 2 + Facing: 896 + Location: 13,118 + Actor46: n1c + Owner: Nod + SubCell: 5 + Facing: 896 + Location: 13,118 + Actor47: n1c + Owner: Nod + SubCell: 1 + Facing: 896 + Location: 13,118 + Actor48: n1c + Owner: Nod + SubCell: 2 + Facing: 896 + Location: 15,120 + Actor50: n1c + Owner: Nod + SubCell: 5 + Facing: 896 + Location: 15,120 + Actor51: n1c + Owner: Nod + SubCell: 1 + Facing: 896 + Location: 15,120 + Actor52: cmec + Owner: Nod + SubCell: 3 + Location: 9,121 + Facing: 896 + Actor53: cmec + Owner: Nod + SubCell: 3 + Location: 12,122 + Facing: 896 + Actor54: n1 + Owner: GDI + SubCell: 3 + Facing: 384 + Location: 28,116 + Actor55: n1 + Owner: GDI + SubCell: 3 + Location: 29,122 + Facing: 103 + Actor56: n1 + Owner: GDI + Facing: 384 + Location: 28,116 + SubCell: 1 + Actor57: n1 + Owner: GDI + SubCell: 3 + Location: 9,101 + Facing: 650 + Actor58: n1 + Owner: GDI + SubCell: 3 + Location: 10,100 + Facing: 555 + Actor59: n1 + Owner: GDI + Location: 9,101 + SubCell: 1 + Facing: 586 + Actor60: mtnk + Owner: GDI + Location: 29,119 + Facing: 261 + Actor61: mtnk + Owner: GDI + Location: 11,99 + Facing: 491 + Actor62: mtnk + Owner: GDI + Location: 13,98 + Facing: 499 + Actor63: mtnk + Owner: GDI + Facing: 261 + Location: 30,117 + Actor64: n3 + Owner: GDI + SubCell: 3 + Location: 31,119 + Facing: 245 + Actor65: n3 + Owner: GDI + SubCell: 3 + Location: 30,116 + Facing: 384 + Actor66: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 12,98 + Actor67: n3 + Owner: GDI + Location: 9,100 + SubCell: 3 + Facing: 602 + Actor68: avtr + Owner: Nod2 + Location: 93,114 + Health: 69 + Facing: 896 + Actor69: n1 + Owner: Nod2 + SubCell: 3 + Location: 91,111 + Facing: 0 + Actor70: n1 + Owner: Nod2 + Location: 91,111 + SubCell: 1 + Facing: 0 + Actor71: n1 + Owner: Nod2 + SubCell: 3 + Location: 99,112 + Facing: 103 + Actor72: n1 + Owner: Nod2 + SubCell: 3 + Location: 103,118 + Facing: 721 + Actor73: n1 + Owner: Nod2 + SubCell: 3 + Location: 90,110 + Facing: 848 + Actor74: n1 + Owner: Nod2 + SubCell: 3 + Location: 90,114 + Facing: 769 + Actor75: n1 + Owner: Nod2 + SubCell: 3 + Location: 103,121 + Facing: 785 + Actor76: n1 + Owner: Nod2 + Location: 103,121 + SubCell: 1 + Facing: 745 + Actor77: n1 + SubCell: 3 + Location: 22,34 + Owner: Nod3 + Facing: 618 + Actor78: n1 + Location: 22,34 + SubCell: 1 + Owner: Nod3 + Facing: 531 + Actor79: n1 + SubCell: 3 + Location: 19,30 + Owner: Nod3 + Facing: 7 + Actor80: n1 + SubCell: 3 + Location: 12,31 + Facing: 0 + Owner: Nod3 + Actor81: n1 + Location: 12,31 + SubCell: 1 + Facing: 0 + Owner: Nod3 + Actor82: n1 + SubCell: 3 + Location: 17,31 + Facing: 0 + Owner: Nod3 + Actor83: n1 + SubCell: 3 + Location: 22,37 + Owner: Nod3 + Facing: 808 + Actor84: n1 + SubCell: 3 + Location: 21,40 + Owner: Nod3 + Facing: 642 + Helipad1: hpad.td + Location: 7,38 + Owner: Nod3 + Health: 44 + Helipad2: hpad.td + Location: 6,42 + Owner: Nod3 + Health: 41 + Actor87: ltnk + Owner: Nod2 + Location: 96,114 + Facing: 896 + Actor88: ltnk + Owner: Nod2 + Location: 91,112 + Facing: 896 + Actor89: hftk + Owner: Nod2 + Location: 95,117 + Facing: 896 + Actor90: hftk + Owner: Nod2 + Location: 88,115 + Facing: 896 + Actor91: hstk + Owner: Nod3 + Location: 19,39 + Facing: 768 + Actor92: hstk + Owner: Nod3 + Location: 20,36 + Facing: 768 + Actor93: mlrs + Owner: Nod3 + Location: 17,33 + Facing: 896 + Actor94: mlrs + Owner: Nod3 + Location: 12,37 + TurretFacing: 0 + Facing: 896 + Banshee2: scrn + Owner: Nod3 + Location: 6,42 + Facing: 896 + Banshee1: scrn + Owner: Nod3 + Location: 7,38 + Facing: 896 + Actor97: e3 + Owner: Nod3 + SubCell: 3 + Location: 18,37 + Facing: 697 + Actor98: e3 + Owner: Nod3 + SubCell: 3 + Location: 15,34 + Facing: 0 + Actor99: e3 + Owner: Nod3 + SubCell: 3 + Location: 19,41 + Facing: 832 + Actor100: e3 + Owner: Nod3 + SubCell: 3 + Location: 12,34 + Facing: 0 + Actor101: n3 + Owner: Nod2 + SubCell: 3 + Location: 98,118 + Facing: 793 + Actor102: n3 + Owner: Nod2 + SubCell: 3 + Location: 98,116 + Facing: 658 + Actor103: n3 + Owner: Nod2 + SubCell: 3 + Location: 91,115 + Facing: 602 + Actor104: n3 + Owner: Nod2 + SubCell: 3 + Location: 87,113 + Facing: 896 + Actor105: gun + Owner: Nod2 + Location: 108,115 + Health: 70 + TurretFacing: 785 + Actor106: split2 + Owner: Neutral + Location: 22,5 + Actor107: split2 + Owner: Neutral + Location: 14,3 + Actor109: split2 + Owner: Neutral + Location: 24,68 + Actor110: split2 + Owner: Neutral + Location: 126,122 + Actor111: split2 + Owner: Neutral + Location: 122,110 + Actor112: split2 + Owner: Neutral + Location: 5,24 + Actor115: htnk + Owner: GDI + Location: 12,71 + Facing: 512 + Actor116: htnk + Owner: GDI + Location: 15,71 + Facing: 512 + Actor119: vulc.ai + Owner: GDI + Location: 10,70 + Facing: 512 + Actor120: vulc.ai + Owner: GDI + Location: 17,70 + Facing: 512 + Actor121: n1 + Owner: GDI + SubCell: 3 + Location: 46,98 + Facing: 237 + Actor122: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 45,95 + Actor123: n1 + Owner: GDI + SubCell: 3 + Location: 46,96 + Facing: 384 + Actor124: n1 + Owner: GDI + Facing: 384 + Location: 45,95 + SubCell: 1 + Actor125: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 47,96 + Actor126: n1 + Owner: GDI + SubCell: 3 + Location: 48,99 + Facing: 245 + Actor128: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 46,94 + Actor129: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 44,93 + Actor130: n2 + Owner: GDI + SubCell: 3 + Location: 13,88 + Facing: 737 + Actor131: n2 + Owner: GDI + SubCell: 3 + Location: 14,84 + Facing: 555 + Actor132: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 18,85 + Actor133: n1 + Owner: GDI + Location: 14,88 + SubCell: 3 + Facing: 713 + Actor134: n1 + Owner: GDI + SubCell: 3 + Location: 14,86 + Facing: 682 + Actor135: n1 + Owner: GDI + Location: 14,86 + SubCell: 1 + Facing: 602 + Actor136: n1 + Owner: GDI + SubCell: 3 + Location: 16,85 + Facing: 682 + Actor137: n1 + Owner: GDI + SubCell: 3 + Location: 18,86 + Facing: 682 + Actor138: n1 + Owner: GDI + SubCell: 3 + Location: 17,84 + Facing: 384 + Actor139: medi + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 13,86 + Actor140: medi + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 17,83 + Actor141: medi + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 45,93 + Actor142: medi + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 48,98 + Actor143: vulc.ai + Owner: GDI + Facing: 128 + Location: 60,111 + Actor144: vulc.ai + Owner: GDI + Facing: 128 + Location: 55,112 + Actor145: htnk + Owner: GDI + Facing: 128 + Location: 58,112 + Actor146: htnk + Owner: GDI + Facing: 128 + Location: 55,114 + Actor147: tc01 + Owner: Neutral + Location: 58,102 + Actor148: tc01 + Owner: Neutral + Location: 20,111 + Actor149: t18 + Owner: Neutral + Location: 5,92 + Actor150: t18 + Owner: Neutral + Location: 25,83 + Actor151: t18 + Owner: Neutral + Location: 10,63 + Actor152: t18 + Owner: Neutral + Location: 26,52 + Actor153: t18 + Owner: Neutral + Location: 26,17 + Actor154: t08 + Owner: Neutral + Location: 4,17 + Actor155: t08 + Owner: Neutral + Location: 7,57 + Actor156: t08 + Owner: Neutral + Location: 40,106 + Actor157: t08 + Owner: Neutral + Location: 58,121 + Actor158: rock3 + Owner: Neutral + Location: 2,96 + Actor159: rock3 + Owner: Neutral + Location: 32,60 + Actor160: rock3 + Owner: Neutral + Location: 69,108 + Actor161: rock2 + Owner: Neutral + Location: 108,104 + Actor162: rock1 + Owner: Neutral + Location: 21,78 + Actor163: t09 + Owner: Neutral + Location: 10,79 + Actor164: t09 + Owner: Neutral + Location: 26,98 + Actor165: t09 + Owner: Neutral + Location: 42,115 + Actor166: t09 + Owner: Neutral + Location: 55,99 + Actor167: t09 + Owner: Neutral + Location: 81,107 + Actor168: t09 + Owner: Neutral + Location: 113,108 + Actor169: t09 + Owner: Neutral + Location: 109,126 + Actor170: t04 + Owner: Neutral + Location: 109,105 + Actor171: t04 + Owner: Neutral + Location: 59,119 + Actor172: t04 + Owner: Neutral + Location: 19,104 + Actor173: t04 + Owner: Neutral + Location: 3,106 + Actor174: t04 + Owner: Neutral + Location: 2,79 + Actor175: t04 + Owner: Neutral + Location: 2,62 + Actor176: rock7 + Owner: Neutral + Location: 36,36 + Actor177: tc01 + Owner: Neutral + Location: 118,126 + Actor178: syrd.gdi + Owner: GDI + Location: 82,3 + Actor179: syrd.gdi + Owner: GDI + Location: 152,59 + Actor180: cv + Owner: GDI + Location: 145,62 + Facing: 253 + Actor181: cv + Owner: GDI + Location: 150,63 + Facing: 253 + Actor182: cv + Owner: GDI + Location: 111,61 + Facing: 245 + Actor183: cv + Owner: GDI + Location: 121,62 + Facing: 269 + Actor184: cv + Owner: GDI + Location: 77,11 + Facing: 515 + Actor185: cv + Owner: GDI + Location: 79,17 + Facing: 531 + Actor186: cv + Owner: GDI + Facing: 384 + Location: 81,48 + Actor187: cv + Owner: GDI + Location: 86,54 + Facing: 384 + Actor188: dd2 + Owner: GDI + Location: 76,15 + Facing: 491 + Actor189: dd2 + Owner: GDI + Facing: 384 + Location: 78,45 + Actor190: dd2 + Owner: GDI + Facing: 384 + Location: 89,57 + Actor191: dd2 + Owner: GDI + Location: 116,64 + Facing: 261 + Actor192: dd2 + Owner: GDI + Location: 124,64 + Facing: 261 + Actor193: dd2 + Owner: GDI + Location: 144,64 + Facing: 245 + Actor194: brik + Owner: GDI + Location: 160,8 + Actor195: brik + Owner: GDI + Location: 158,8 + Actor196: brik + Owner: GDI + Location: 159,8 + Actor197: brik + Owner: GDI + Location: 157,8 + Actor198: brik + Owner: GDI + Location: 156,8 + Actor199: brik + Owner: GDI + Location: 155,8 + Actor200: brik + Owner: GDI + Location: 155,9 + Actor201: brik + Owner: GDI + Location: 156,9 + Actor202: brik + Owner: GDI + Location: 160,9 + Actor203: brik + Owner: GDI + Location: 160,11 + Actor204: brik + Owner: GDI + Location: 160,10 + Actor205: brik + Owner: GDI + Location: 160,12 + Actor206: brik + Owner: GDI + Location: 160,14 + Actor207: brik + Owner: GDI + Location: 160,13 + Actor208: brik + Owner: GDI + Location: 160,15 + Actor209: brik + Owner: GDI + Location: 160,16 + Actor210: brik + Owner: GDI + Location: 160,17 + Actor211: brik + Owner: GDI + Location: 160,18 + Actor212: brik + Owner: GDI + Location: 160,20 + Actor213: brik + Owner: GDI + Location: 160,19 + Actor214: brik + Owner: GDI + Location: 160,21 + Actor215: brik + Owner: GDI + Location: 160,22 + Actor216: brik + Owner: GDI + Location: 160,23 + Actor217: brik + Owner: GDI + Location: 159,23 + Actor218: brik + Owner: GDI + Location: 158,23 + Actor219: brik + Owner: GDI + Location: 157,23 + Actor220: brik + Owner: GDI + Location: 156,23 + Actor221: brik + Owner: GDI + Location: 154,23 + Actor222: brik + Owner: GDI + Location: 155,23 + Actor223: brik + Owner: GDI + Location: 153,23 + Actor224: brik + Owner: GDI + Location: 151,23 + Actor225: brik + Owner: GDI + Location: 152,23 + Actor226: brik + Owner: GDI + Location: 150,23 + Actor227: brik + Owner: GDI + Location: 150,22 + Actor228: brik + Owner: GDI + Location: 151,22 + Actor229: brik + Owner: GDI + Location: 144,22 + Actor230: brik + Owner: GDI + Location: 144,23 + Actor231: brik + Owner: GDI + Location: 143,23 + Actor232: brik + Owner: GDI + Location: 143,22 + Actor233: brik + Owner: GDI + Location: 142,23 + Actor234: brik + Owner: GDI + Location: 141,23 + Actor235: brik + Owner: GDI + Location: 140,23 + Actor236: brik + Owner: GDI + Location: 139,23 + Actor237: brik + Owner: GDI + Location: 138,23 + Actor238: brik + Owner: GDI + Location: 137,23 + Actor239: brik + Owner: GDI + Location: 136,23 + Actor240: brik + Owner: GDI + Location: 135,23 + Actor241: brik + Owner: GDI + Location: 134,23 + Actor242: brik + Owner: GDI + Location: 133,23 + Actor243: brik + Owner: GDI + Location: 132,23 + Actor244: brik + Owner: GDI + Location: 132,22 + Actor245: brik + Owner: GDI + Location: 132,21 + Actor246: brik + Owner: GDI + Location: 132,20 + Actor247: brik + Owner: GDI + Location: 132,17 + Actor248: brik + Owner: GDI + Location: 132,18 + Actor249: brik + Owner: GDI + Location: 132,19 + Actor250: brik + Owner: GDI + Location: 132,16 + Actor251: brik + Owner: GDI + Location: 133,16 + Actor252: brik + Owner: GDI + Location: 133,17 + Actor253: brik + Owner: GDI + Location: 132,11 + Actor254: brik + Owner: GDI + Location: 132,10 + Actor255: brik + Owner: GDI + Location: 133,10 + Actor256: brik + Owner: GDI + Location: 133,11 + Actor257: brik + Owner: GDI + Location: 132,9 + Actor258: brik + Owner: GDI + Location: 132,8 + Actor259: brik + Owner: GDI + Location: 141,8 + Actor260: brik + Owner: GDI + Location: 140,8 + Actor261: brik + Owner: GDI + Location: 138,8 + Actor262: brik + Owner: GDI + Location: 135,8 + Actor263: brik + Owner: GDI + Location: 134,8 + Actor264: brik + Owner: GDI + Location: 133,8 + Actor265: brik + Owner: GDI + Location: 137,8 + Actor266: brik + Owner: GDI + Location: 136,8 + Actor267: brik + Owner: GDI + Location: 139,8 + Actor268: brik + Owner: GDI + Location: 142,8 + Actor269: brik + Owner: GDI + Location: 144,8 + Actor270: brik + Owner: GDI + Location: 143,8 + Actor271: brik + Owner: GDI + Location: 145,8 + Actor272: brik + Owner: GDI + Location: 147,8 + Actor273: brik + Owner: GDI + Location: 146,8 + Actor274: brik + Owner: GDI + Location: 148,8 + Actor275: brik + Owner: GDI + Location: 148,9 + Actor276: brik + Owner: GDI + Location: 147,9 + Actor279: eye + Owner: GDI + Location: 158,9 + Actor280: afac + Owner: GDI + Location: 155,10 + Actor281: gtwr + Owner: GDI + Location: 131,11 + Actor282: gtwr + Owner: GDI + Location: 131,16 + Actor283: gtwr + Owner: GDI + Location: 144,24 + Actor284: gtwr + Owner: GDI + Location: 150,24 + Actor277: atwr + Owner: GDI + Location: 142,22 + Actor278: atwr + Owner: GDI + Location: 152,22 + Actor285: atwr + Owner: GDI + Location: 133,18 + Actor286: atwr + Owner: GDI + Location: 133,9 + Actor287: atwr + Owner: GDI + Location: 146,9 + Actor294: silo.td + Owner: GDI + Location: 134,9 + Actor295: silo.td + Owner: GDI + Location: 136,9 + Actor290: nuk2 + Owner: GDI + Location: 138,9 + Actor291: nuk2 + Owner: GDI + Location: 140,9 + Actor292: nuk2 + Owner: GDI + Location: 142,9 + Actor296: nuk2 + Owner: GDI + Location: 144,9 + Actor293: proc.td + Owner: GDI + Location: 136,12 + Actor297: proc.td + Owner: GDI + Location: 139,13 + Actor298: nuk2 + Owner: GDI + Location: 142,12 + Actor299: nuk2 + Owner: GDI + Location: 144,12 + GDIFactory1: weap.td + Owner: GDI + Location: 145,17 + GDIBarracks1: pyle + Owner: GDI + Location: 150,17 + Actor289: silo.td + Owner: GDI + Location: 154,22 + Actor302: silo.td + Owner: GDI + Location: 158,22 + Actor303: silo.td + Owner: GDI + Location: 156,22 + Actor304: nuk2 + Owner: GDI + Location: 158,18 + Actor305: nuk2 + Owner: GDI + Location: 156,18 + Actor308: hq + Owner: GDI + Location: 133,20 + Actor310: cram + Owner: GDI + Location: 135,11 + Actor311: cram + Owner: GDI + Location: 159,13 + Actor312: cram + Owner: GDI + Location: 154,20 + Actor313: cram + Owner: GDI + Location: 137,22 + Actor315: upgc + Owner: GDI + Location: 148,13 + Actor316: rep + Owner: GDI + Location: 152,13 + Actor309: cram + Owner: GDI + Location: 151,11 + Actor314: gtek + Owner: GDI + Location: 136,18 + Actor317: brik + Owner: GDI + Location: 65,86 + Actor318: brik + Owner: GDI + Location: 65,85 + Actor319: brik + Owner: GDI + Location: 66,86 + Actor320: brik + Owner: GDI + Location: 66,85 + Actor321: brik + Owner: GDI + Location: 65,84 + Actor322: brik + Owner: GDI + Location: 64,84 + Actor323: brik + Owner: GDI + Location: 64,83 + Actor324: brik + Owner: GDI + Location: 67,86 + Actor325: brik + Owner: GDI + Location: 68,86 + Actor326: brik + Owner: GDI + Location: 69,86 + Actor327: brik + Owner: GDI + Location: 69,85 + Actor328: brik + Owner: GDI + Location: 68,85 + Actor329: brik + Owner: GDI + Location: 70,85 + Actor330: brik + Owner: GDI + Location: 71,85 + Actor331: brik + Owner: GDI + Location: 72,85 + Actor332: brik + Owner: GDI + Location: 74,85 + Actor333: brik + Owner: GDI + Location: 73,85 + Actor334: brik + Owner: GDI + Location: 74,84 + Actor335: brik + Owner: GDI + Location: 73,84 + Actor336: brik + Owner: GDI + Location: 64,82 + Actor337: brik + Owner: GDI + Location: 65,82 + Actor338: brik + Owner: GDI + Location: 65,81 + Actor339: brik + Owner: GDI + Location: 64,81 + Actor340: brik + Owner: GDI + Location: 64,77 + Actor341: brik + Owner: GDI + Location: 64,76 + Actor342: brik + Owner: GDI + Location: 65,77 + Actor343: brik + Owner: GDI + Location: 65,76 + Actor344: brik + Owner: GDI + Location: 64,75 + Actor345: brik + Owner: GDI + Location: 64,74 + Actor346: brik + Owner: GDI + Location: 65,74 + Actor347: brik + Owner: GDI + Location: 65,72 + Actor348: brik + Owner: GDI + Location: 65,73 + Actor349: brik + Owner: GDI + Location: 67,72 + Actor350: brik + Owner: GDI + Location: 66,72 + Actor351: brik + Owner: GDI + Location: 68,72 + Actor352: brik + Owner: GDI + Location: 69,72 + Actor353: brik + Owner: GDI + Location: 69,71 + Actor354: brik + Owner: GDI + Location: 70,71 + Actor355: brik + Owner: GDI + Location: 71,71 + Actor356: brik + Owner: GDI + Location: 73,71 + Actor357: brik + Owner: GDI + Location: 72,71 + Actor358: brik + Owner: GDI + Location: 73,72 + Actor359: brik + Owner: GDI + Location: 72,72 + Actor364: brik + Owner: GDI + Location: 82,85 + Actor365: brik + Owner: GDI + Location: 83,85 + Actor366: brik + Owner: GDI + Location: 84,85 + Actor367: brik + Owner: GDI + Location: 84,84 + Actor368: brik + Owner: GDI + Location: 85,84 + Actor369: brik + Owner: GDI + Location: 85,83 + Actor370: brik + Owner: GDI + Location: 85,82 + Actor371: brik + Owner: GDI + Location: 85,81 + Actor372: brik + Owner: GDI + Location: 85,80 + Actor373: brik + Owner: GDI + Location: 85,79 + Actor374: brik + Owner: GDI + Location: 84,79 + Actor375: brik + Owner: GDI + Location: 84,80 + Actor378: brik + Owner: GDI + Location: 81,71 + Actor380: brik + Owner: GDI + Location: 82,71 + Actor381: brik + Owner: GDI + Location: 83,71 + Actor382: brik + Owner: GDI + Location: 84,71 + Actor383: brik + Owner: GDI + Location: 85,71 + Actor384: brik + Owner: GDI + Location: 85,72 + Actor385: brik + Owner: GDI + Location: 85,73 + Actor386: brik + Owner: GDI + Location: 84,74 + Actor387: brik + Owner: GDI + Location: 84,75 + Actor388: brik + Owner: GDI + Location: 85,75 + Actor389: brik + Owner: GDI + Location: 85,74 + Actor390: atwr + Owner: GDI + Location: 67,85 + Actor391: atwr + Owner: GDI + Location: 65,83 + Actor393: atwr + Owner: GDI + Location: 65,75 + Actor394: atwr + Owner: GDI + Location: 84,81 + Actor395: atwr + Owner: GDI + Location: 84,72 + Actor396: cram + Owner: GDI + Location: 84,83 + Actor397: cram + Owner: GDI + Location: 66,73 + Actor398: cram + Owner: GDI + Location: 66,84 + GDIFactory2: weap.td + Owner: GDI + Location: 68,74 + Actor402: nuk2 + Owner: GDI + Location: 68,82 + Actor403: nuk2 + Owner: GDI + Location: 70,82 + Actor405: nuk2 + Owner: GDI + Location: 70,79 + Actor406: nuk2 + Owner: GDI + Location: 68,79 + Actor407: gtwr + Owner: GDI + Location: 74,86 + Actor409: gtwr + Owner: GDI + Location: 63,81 + Actor410: gtwr + Owner: GDI + Location: 63,77 + Actor411: gtwr + Owner: GDI + Location: 86,75 + Actor412: gtwr + Owner: GDI + Location: 86,79 + Actor413: gtwr + Owner: GDI + Location: 73,70 + Actor414: gtwr + Owner: GDI + Location: 78,70 + Actor415: brik + Owner: GDI + Location: 78,71 + Actor416: brik + Owner: GDI + Location: 79,71 + Actor417: brik + Owner: GDI + Location: 80,71 + Actor418: brik + Owner: GDI + Location: 78,72 + Actor419: brik + Owner: GDI + Location: 79,72 + Actor408: brik + Owner: GDI + Location: 79,84 + Actor420: brik + Owner: GDI + Location: 80,84 + Actor421: atwr + Owner: GDI + Location: 81,84 + Actor422: brik + Owner: GDI + Location: 79,85 + Actor423: brik + Owner: GDI + Location: 80,85 + Actor424: brik + Owner: GDI + Location: 81,85 + Actor425: gtwr + Owner: GDI + Location: 79,86 + GDIBarracks2: pyle + Owner: GDI + Location: 74,80 + Actor427: proc.td + Owner: GDI + Location: 80,72 + Actor429: nuk2 + Owner: GDI + Location: 78,78 + Actor430: nuk2 + Owner: GDI + Location: 80,78 + Actor431: split2 + Owner: Neutral + Location: 79,65 + Actor432: split2 + Owner: Neutral + Location: 91,71 + Actor433: split2 + Owner: Neutral + Location: 86,67 + Actor434: split2 + Owner: Neutral + Location: 95,93 + Actor435: amcv + Owner: Nod + Location: 7,124 + Facing: 896 + Actor436: split2 + Owner: Neutral + Location: 36,87 + Actor437: split2 + Owner: Neutral + Location: 40,83 + Actor438: split2 + Owner: Neutral + Location: 57,49 + Actor439: split2 + Owner: Neutral + Location: 56,42 + Actor440: split2 + Owner: Neutral + Location: 125,8 + Actor441: split2 + Owner: Neutral + Location: 104,8 + Actor442: split2 + Owner: Neutral + Location: 110,17 + Actor446: v25 + Owner: Neutral + Location: 152,124 + Actor447: macs + Owner: Neutral + Location: 157,104 + Actor448: v09 + Owner: Neutral + Location: 148,115 + Actor449: tc01 + Owner: Neutral + Location: 147,122 + Actor450: v20 + Owner: Neutral + Location: 148,107 + Actor451: v10 + Owner: Neutral + Location: 142,125 + Actor452: v27 + Owner: Neutral + Location: 152,113 + Actor453: v24 + Owner: Neutral + Location: 148,119 + Actor454: v26 + Owner: Neutral + Location: 145,104 + Actor455: t08 + Owner: Neutral + Location: 153,111 + Actor456: v21 + Owner: Neutral + Location: 158,109 + Actor457: v23 + Owner: Neutral + Location: 152,123 + Actor458: v34 + Owner: Neutral + Location: 145,117 + Actor459: v35 + Owner: Neutral + Location: 159,117 + Actor460: t04 + Owner: Neutral + Location: 157,116 + Actor461: utilpol1 + Owner: Neutral + Location: 145,125 + Actor462: utilpol2 + Owner: Neutral + Location: 150,104 + Actor463: rock2 + Owner: Neutral + Location: 145,95 + Actor464: hosp + Owner: Neutral + Location: 47,10 + Actor465: v25 + Owner: Neutral + Location: 52,4 + Actor466: oilb + Owner: Neutral + Location: 63,7 + Actor467: oilb + Owner: Neutral + Location: 64,3 + Actor468: v22 + Owner: Neutral + Location: 58,12 + Actor469: v20 + Owner: Neutral + Location: 45,4 + Actor470: v35 + Owner: Neutral + Location: 50,16 + Actor471: v27 + Owner: Neutral + Location: 40,7 + Actor472: v24 + Owner: Neutral + Location: 38,1 + Actor473: v31 + Owner: Neutral + Location: 35,10 + Actor474: t18 + Owner: Neutral + Location: 59,10 + Actor475: brl3 + Owner: Neutral + Location: 65,5 + Actor476: brl3 + Owner: Neutral + Location: 62,9 + Actor477: barl + Owner: Neutral + Location: 63,9 + Actor478: barl + Owner: Neutral + Location: 66,4 + Actor479: barl + Owner: Neutral + Location: 63,3 + Actor480: barl + Owner: Neutral + Location: 66,10 + Actor481: chain + Owner: Neutral + Location: 62,1 + Actor482: chain + Owner: Neutral + Location: 63,1 + Actor483: chain + Owner: Neutral + Location: 64,1 + Actor484: chain + Owner: Neutral + Location: 65,1 + Actor485: chain + Owner: Neutral + Location: 66,1 + Actor486: chain + Owner: Neutral + Location: 61,1 + Actor487: chain + Owner: Neutral + Location: 60,1 + Actor488: chain + Owner: Neutral + Location: 60,2 + Actor489: chain + Owner: Neutral + Location: 60,3 + Actor490: chain + Owner: Neutral + Location: 60,4 + Actor491: chain + Owner: Neutral + Location: 60,9 + Actor492: chain + Owner: Neutral + Location: 62,10 + Actor493: chain + Owner: Neutral + Location: 61,10 + Actor494: chain + Owner: Neutral + Location: 60,10 + Actor495: chain + Owner: Neutral + Location: 63,10 + Actor496: chain + Owner: Neutral + Location: 64,10 + Actor497: wood + Owner: Neutral + Location: 47,9 + Actor498: wood + Owner: Neutral + Location: 48,9 + Actor499: wood + Owner: Neutral + Location: 49,9 + Actor500: wood + Owner: Neutral + Location: 46,9 + Actor501: wood + Owner: Neutral + Location: 45,9 + Actor502: wood + Owner: Neutral + Location: 45,10 + Actor503: wood + Owner: Neutral + Location: 45,11 + Actor504: t18 + Owner: Neutral + Location: 45,37 + Actor505: t18 + Owner: Neutral + Location: 57,62 + Actor506: t18 + Owner: Neutral + Location: 49,80 + Actor507: t18 + Owner: Neutral + Location: 102,79 + Actor508: t18 + Owner: Neutral + Location: 117,102 + Actor509: t18 + Owner: Neutral + Location: 72,126 + Actor510: t18 + Owner: Neutral + Location: 140,72 + Actor511: t18 + Owner: Neutral + Location: 155,43 + Actor512: t18 + Owner: Neutral + Location: 114,29 + Actor513: t18 + Owner: Neutral + Location: 99,24 + Actor514: t08 + Owner: Neutral + Location: 67,25 + Actor515: t08 + Owner: Neutral + Location: 146,40 + Actor516: t08 + Owner: Neutral + Location: 156,56 + Actor517: t08 + Owner: Neutral + Location: 118,42 + Actor518: t08 + Owner: Neutral + Location: 99,101 + Actor520: t08 + Owner: Neutral + Location: 48,50 + Actor522: t08 + Owner: Neutral + Location: 31,79 + Actor523: rock4 + Owner: Neutral + Location: 51,86 + Actor524: rock2 + Owner: Neutral + Location: 44,56 + Actor525: rock6 + Owner: Neutral + Location: 39,21 + Actor526: rock6 + Owner: Neutral + Location: 96,11 + Actor527: rock6 + Owner: Neutral + Location: 156,38 + Actor528: v34 + Owner: Neutral + Location: 120,38 + Actor529: v31 + Owner: Neutral + Location: 140,42 + Actor530: v33 + Owner: Neutral + Location: 151,40 + Actor531: v34 + Owner: Neutral + Location: 98,26 + Actor532: v29 + Owner: Neutral + Location: 96,31 + Actor533: v26 + Owner: Neutral + Location: 128,38 + Actor534: v24 + Owner: Neutral + Location: 150,43 + Actor535: t04 + Owner: Neutral + Location: 130,38 + Actor536: t04 + Owner: Neutral + Location: 152,34 + Actor537: nuk2 + Owner: GDI + Location: 146,10 + Actor538: proc.td + Owner: GDI + Location: 62,41 + Actor539: gtwr + Owner: GDI + Location: 59,34 + Actor540: gtwr + Owner: GDI + Location: 65,52 + Actor541: sbag + Owner: GDI + Location: 65,51 + Actor542: sbag + Owner: GDI + Location: 64,51 + Actor543: sbag + Owner: GDI + Location: 66,51 + Actor544: sbag + Owner: GDI + Location: 66,50 + Actor545: sbag + Owner: GDI + Location: 66,49 + Actor546: sbag + Owner: GDI + Location: 64,50 + Actor547: sbag + Owner: GDI + Location: 59,35 + Actor548: sbag + Owner: GDI + Location: 60,35 + Actor549: sbag + Owner: GDI + Location: 61,35 + Actor550: sbag + Owner: GDI + Location: 61,34 + Actor551: sbag + Owner: GDI + Location: 62,34 + Actor552: sbag + Owner: GDI + Location: 63,34 + Actor553: sbag + Owner: GDI + Location: 59,36 + Actor554: cram + Owner: GDI + Location: 62,35 + Actor555: cram + Owner: GDI + Location: 65,50 + Actor556: atwr + Owner: GDI + Location: 99,40 + Actor557: atwr + Owner: GDI + Location: 120,47 + Actor558: atwr + Owner: GDI + Location: 149,48 + Actor559: atwr + Owner: GDI + Location: 129,45 + Actor560: atwr + Owner: GDI + Location: 94,22 + Actor561: vulc.ai + Owner: GDI + Facing: 512 + Location: 79,82 + Actor562: vulc.ai + Owner: GDI + Facing: 512 + Location: 73,83 + Actor563: vulc.ai + Owner: GDI + Location: 62,76 + Facing: 364 + Actor564: mtnk + Owner: GDI + Facing: 491 + Location: 75,87 + Actor565: mtnk + Owner: GDI + Facing: 491 + Location: 78,87 + Actor566: mtnk + Owner: GDI + Location: 61,80 + Facing: 396 + Actor567: n3 + Owner: GDI + SubCell: 3 + Facing: 602 + Location: 72,86 + Actor568: n1 + Owner: GDI + SubCell: 3 + Facing: 555 + Location: 73,86 + Actor569: n1 + Owner: GDI + SubCell: 3 + Facing: 650 + Location: 72,87 + Actor570: n1 + Owner: GDI + SubCell: 1 + Facing: 586 + Location: 72,87 + Actor571: medi + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 89,77 + Actor572: n1 + Owner: GDI + SubCell: 3 + Facing: 384 + Location: 89,78 + Actor573: n1 + Owner: GDI + SubCell: 3 + Facing: 682 + Location: 88,79 + Actor574: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 90,79 + Actor575: n1 + Owner: GDI + SubCell: 3 + Facing: 682 + Location: 90,80 + Actor576: n1 + Owner: GDI + SubCell: 3 + Facing: 384 + Location: 59,77 + Actor577: n1 + Owner: GDI + Facing: 384 + SubCell: 1 + Location: 59,77 + Actor578: n3 + Owner: GDI + SubCell: 3 + Facing: 384 + Location: 61,77 + Actor582: titn.rail + Owner: GDI + Location: 141,24 + Facing: 512 + Actor579: titn.rail + Owner: GDI + Facing: 512 + Location: 143,25 + Actor580: titn.rail + Owner: GDI + Facing: 512 + Location: 151,25 + Actor581: titn.rail + Owner: GDI + Facing: 512 + Location: 153,24 + Actor583: titn.rail + Owner: GDI + Location: 130,17 + Facing: 256 + Actor584: titn.rail + Owner: GDI + Facing: 256 + Location: 128,15 + Actor585: pbul + Owner: GDI + Facing: 384 + Location: 146,49 + Actor586: pbul + Owner: GDI + Facing: 384 + Location: 148,51 + Actor588: pbul + Owner: GDI + Facing: 384 + Location: 123,46 + Actor589: pbul + Owner: GDI + Facing: 384 + Location: 126,45 + Actor587: pbul + Owner: GDI + Facing: 384 + Location: 96,22 + Actor590: pbul + Owner: GDI + Facing: 384 + Location: 95,20 + Actor591: pbul + Owner: GDI + Facing: 384 + Location: 101,40 + Actor592: pbul + Owner: GDI + Facing: 384 + Location: 99,38 + Actor593: wolv + Owner: GDI + Location: 131,53 + Facing: 570 + Actor594: wolv + Owner: GDI + Location: 139,53 + Facing: 512 + Actor595: wolv + Owner: GDI + Facing: 570 + Location: 96,50 + Actor596: wolv + Owner: GDI + Facing: 570 + Location: 102,50 + Actor597: wolv + Owner: GDI + Location: 87,29 + Facing: 256 + Actor598: wolv + Owner: GDI + Facing: 256 + Location: 88,35 + Actor599: msam + Owner: GDI + Facing: 384 + Location: 155,31 + Actor600: msam + Owner: GDI + Facing: 384 + Location: 140,21 + Actor601: msam + Owner: GDI + Facing: 384 + Location: 135,22 + Actor602: msam + Owner: GDI + Facing: 384 + Location: 135,18 + Actor603: msam + Owner: GDI + Facing: 384 + Location: 154,18 + Actor604: msam + Owner: GDI + Facing: 384 + Location: 122,18 + Actor605: msam + Owner: GDI + Facing: 384 + Location: 137,29 + Actor606: msam + Owner: GDI + Facing: 384 + Location: 61,36 + Actor607: msam + Owner: GDI + Facing: 384 + Location: 83,84 + Actor608: msam + Owner: GDI + Facing: 384 + Location: 70,72 + Actor609: htnk + Owner: GDI + Facing: 384 + Location: 128,27 + Actor610: htnk + Owner: GDI + Facing: 384 + Location: 130,29 + Actor611: htnk + Owner: GDI + Location: 133,52 + Facing: 512 + Actor612: htnk + Owner: GDI + Facing: 384 + Location: 100,48 + Actor613: htnk + Owner: GDI + Location: 92,33 + Facing: 256 + Actor614: vulc.ai + Owner: GDI + Location: 111,31 + Facing: 523 + Actor615: vulc.ai + Owner: GDI + Facing: 384 + Location: 145,85 + Actor616: vulc.ai + Owner: GDI + Facing: 384 + Location: 146,86 + Actor617: vulc.ai + Owner: GDI + Facing: 384 + Location: 148,44 + Actor618: vulc.ai + Owner: GDI + Facing: 384 + Location: 87,6 + Actor619: hmmv + Owner: GDI + Facing: 384 + Location: 62,65 + Actor620: hmmv + Owner: GDI + Facing: 384 + Location: 60,67 + Actor621: hmmv + Owner: GDI + Location: 146,111 + Facing: 0 + Actor622: hmmv + Owner: GDI + Location: 146,109 + Facing: 0 + Actor625: mtnk + Owner: GDI + Facing: 384 + Location: 144,87 + Actor626: mtnk + Owner: GDI + Location: 148,112 + Facing: 0 + Actor627: vulc.ai + Owner: GDI + Facing: 384 + Location: 63,49 + Actor628: mtnk + Owner: GDI + Facing: 384 + Location: 62,52 + Actor629: mtnk + Owner: GDI + Location: 65,31 + Facing: 256 + Actor630: mtnk + Owner: GDI + Location: 67,31 + Facing: 256 + Actor631: jugg + Owner: GDI + Facing: 384 + Location: 157,30 + Actor632: jugg + Owner: GDI + Facing: 384 + Location: 143,15 + Actor633: bh + Owner: Nod3 + SubCell: 3 + Location: 16,38 + Facing: 491 + Actor634: bh + Owner: Nod3 + SubCell: 3 + Location: 15,37 + Facing: 384 + Actor635: ftnk + Location: 95,112 + Owner: Nod2 + Facing: 904 + Actor636: bggy + Owner: Nod3 + Location: 10,42 + Facing: 384 + Actor637: bike + Owner: Nod3 + Location: 16,43 + Facing: 634 + Actor638: bike + Owner: Nod3 + Location: 17,42 + Facing: 618 + PlayerStart: waypoint + Owner: Neutral + Location: 12,120 + Actor639: ztrp + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 141,29 + Actor640: ztrp + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 151,31 + Actor641: ztrp + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 144,26 + Actor642: ztrp + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 152,26 + Actor643: ztrp + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 132,30 + Actor644: ztrp + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 130,28 + Actor645: ztrp + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 126,25 + Actor646: ztrp + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 123,18 + Actor647: ztrp + Owner: GDI + SubCell: 3 + Location: 131,18 + Facing: 277 + Actor648: zdef + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 142,24 + Actor649: zdef + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 153,30 + Actor650: zdef + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 122,17 + Actor651: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 156,24 + Actor652: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 139,24 + Actor653: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 139,20 + Actor654: n3 + Owner: GDI + Facing: 384 + Location: 133,19 + SubCell: 3 + Actor655: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 155,17 + Actor656: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 158,14 + Actor657: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 154,8 + Actor658: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 153,9 + Actor659: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 137,10 + Actor660: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 123,26 + Actor661: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 150,45 + Actor662: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 122,46 + Actor663: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 141,52 + Actor664: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 101,43 + Actor665: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 105,52 + Actor666: n3 + Owner: GDI + SubCell: 3 + Location: 94,35 + Facing: 384 + Actor667: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 94,19 + Actor668: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 63,16 + Actor669: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 64,35 + Actor670: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 64,48 + Actor671: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 83,82 + Actor672: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 66,74 + Actor673: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 83,73 + Actor674: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 141,53 + Actor675: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 129,51 + Actor676: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 125,45 + Actor677: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 128,45 + Actor678: n1 + Owner: GDI + Facing: 384 + Location: 150,48 + SubCell: 3 + Actor679: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 149,46 + Actor680: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 100,39 + Actor681: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 102,40 + Actor682: n1 + Owner: GDI + Location: 93,35 + SubCell: 3 + Facing: 126 + Actor683: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 88,28 + Actor684: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 89,29 + Actor685: n1 + Owner: GDI + SubCell: 3 + Location: 91,38 + Facing: 79 + Actor686: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 97,21 + Actor687: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 125,19 + Actor688: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 121,16 + Actor689: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 157,28 + Actor690: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 139,29 + Actor691: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 139,33 + Actor692: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 150,32 + Actor693: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 133,29 + Actor694: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 155,6 + Actor695: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 150,7 + Actor696: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 144,84 + Actor697: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 146,88 + Actor698: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 150,111 + Actor699: t08 + Owner: Neutral + Location: 31,26 + Actor700: t08 + Owner: Neutral + Location: 46,67 + Actor701: cratermaker1 + Owner: Neutral + Location: 98,107 + Actor702: cratermaker1 + Owner: Neutral + Location: 97,106 + Actor703: cratermaker1 + Owner: Neutral + Location: 94,105 + Actor704: cratermaker1 + Owner: Neutral + Location: 94,107 + Actor705: cratermaker1 + Owner: Neutral + Location: 92,105 + Actor706: cratermaker1 + Owner: Neutral + Location: 90,105 + Actor707: cratermaker1 + Owner: Neutral + Location: 88,104 + Actor708: cratermaker2 + Owner: Neutral + Location: 91,104 + Actor709: cratermaker2 + Owner: Neutral + Location: 93,105 + Actor710: cratermaker2 + Owner: Neutral + Location: 97,107 + Actor711: cratermaker2 + Owner: Neutral + Location: 109,114 + Actor712: cratermaker2 + Owner: Neutral + Location: 110,116 + Actor713: cratermaker2 + Owner: Neutral + Location: 108,119 + Actor714: cratermaker1 + Owner: Neutral + Location: 111,117 + Actor715: cratermaker1 + Owner: Neutral + Location: 110,115 + Actor716: scorchmaker1 + Owner: Neutral + Location: 99,109 + Actor717: scorchmaker1 + Owner: Neutral + Location: 104,109 + Actor718: scorchmaker2 + Owner: Neutral + Location: 103,108 + Actor719: scorchmaker2 + Owner: Neutral + Location: 100,104 + Actor720: cratermaker1 + Owner: Neutral + Location: 104,105 + Actor721: cratermaker1 + Owner: Neutral + Location: 91,101 + Actor722: cratermaker2 + Owner: Neutral + Location: 98,103 + Actor733: cratermaker1 + Owner: Neutral + Location: 28,40 + Actor734: cratermaker1 + Owner: Neutral + Location: 30,37 + Actor735: cratermaker1 + Owner: Neutral + Location: 28,32 + Actor736: cratermaker1 + Owner: Neutral + Location: 27,35 + Actor743: cratermaker1 + Owner: Neutral + Location: 28,35 + Actor744: cratermaker1 + Owner: Neutral + Location: 29,39 + Actor745: cratermaker1 + Owner: Neutral + Location: 19,25 + Actor746: cratermaker1 + Owner: Neutral + Location: 17,23 + Actor747: cratermaker1 + Owner: Neutral + Location: 14,25 + Actor748: cratermaker1 + Owner: Neutral + Location: 11,26 + Actor749: cratermaker1 + Owner: Neutral + Location: 19,28 + Actor750: cratermaker2 + Owner: Neutral + Location: 28,34 + Actor751: cratermaker2 + Owner: Neutral + Location: 15,24 + Actor752: cratermaker2 + Owner: Neutral + Location: 16,24 + Actor753: cratermaker2 + Owner: Neutral + Location: 28,36 + Actor754: scorchmaker2 + Owner: Neutral + Location: 23,29 + Actor755: scorchmaker2 + Owner: Neutral + Location: 17,25 + Actor756: scorchmaker2 + Owner: Neutral + Location: 28,39 + Actor758: msam + Owner: GDI + Facing: 384 + Location: 41,33 + Actor759: msam + Owner: GDI + Facing: 384 + Location: 41,30 + Actor760: msam + Owner: GDI + Facing: 384 + Location: 103,94 + Actor761: msam + Owner: GDI + Facing: 384 + Location: 108,96 + Actor763: htnk + Owner: GDI + Facing: 384 + Location: 101,96 + Actor764: htnk + Owner: GDI + Facing: 384 + Location: 104,97 + Actor765: htnk + Owner: GDI + Facing: 384 + Location: 36,30 + Actor766: htnk + Owner: GDI + Facing: 384 + Location: 38,33 + Actor767: mtnk + Owner: GDI + Facing: 384 + Location: 36,32 + Actor768: mtnk + Owner: GDI + Facing: 384 + Location: 39,34 + Actor769: mtnk + Owner: GDI + Location: 34,29 + Facing: 384 + Actor770: mtnk + Owner: GDI + Facing: 384 + Location: 107,98 + Actor771: mtnk + Owner: GDI + Facing: 384 + Location: 102,97 + Actor772: mtnk + Owner: GDI + Facing: 384 + Location: 99,95 + Actor773: n3 + Owner: GDI + SubCell: 3 + Location: 106,95 + Facing: 384 + Actor774: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 105,94 + Actor775: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 103,93 + Actor776: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 107,93 + Actor777: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 110,96 + Actor778: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 40,32 + Actor779: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 38,30 + Actor780: n3 + Owner: GDI + Facing: 384 + Location: 38,29 + SubCell: 3 + Actor781: n3 + Owner: GDI + Facing: 384 + Location: 37,28 + SubCell: 3 + Actor782: n3 + Owner: GDI + SubCell: 3 + Location: 39,31 + Facing: 384 + Actor783: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 35,30 + Actor784: n1 + Owner: GDI + Facing: 384 + Location: 35,30 + SubCell: 1 + Actor785: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 35,32 + Actor786: n1 + Owner: GDI + Facing: 384 + Location: 35,32 + SubCell: 1 + Actor787: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 38,32 + Actor788: n1 + Owner: GDI + Facing: 384 + Location: 38,32 + SubCell: 1 + Actor789: n1 + Owner: GDI + Facing: 384 + Location: 38,34 + SubCell: 3 + Actor790: n1 + Owner: GDI + Facing: 384 + Location: 38,34 + SubCell: 1 + Actor791: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 40,35 + Actor792: n1 + Owner: GDI + Facing: 384 + Location: 40,35 + SubCell: 1 + Actor793: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 36,31 + Actor794: n1 + Owner: GDI + Facing: 384 + Location: 36,31 + SubCell: 1 + Actor795: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 105,98 + Actor796: n1 + Owner: GDI + Facing: 384 + Location: 105,98 + SubCell: 1 + Actor797: n1 + Owner: GDI + Facing: 384 + Location: 104,98 + SubCell: 3 + Actor798: n1 + Owner: GDI + Facing: 384 + Location: 104,98 + SubCell: 1 + Actor799: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 103,96 + Actor800: n1 + Owner: GDI + Facing: 384 + Location: 103,96 + SubCell: 1 + Actor801: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 101,97 + Actor802: n1 + Owner: GDI + Facing: 384 + Location: 101,97 + SubCell: 1 + Actor803: n1 + Owner: GDI + Facing: 384 + Location: 101,95 + SubCell: 3 + Actor804: n1 + Owner: GDI + Facing: 384 + Location: 101,95 + SubCell: 1 + Actor805: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 106,97 + Actor806: n1 + Owner: GDI + Facing: 384 + Location: 106,97 + SubCell: 1 + Actor807: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 42,34 + Actor808: n1 + Owner: GDI + Facing: 384 + Location: 42,34 + SubCell: 1 + Actor809: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 33,29 + Actor810: n1 + Owner: GDI + Facing: 384 + Location: 33,29 + SubCell: 1 + Actor811: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 109,98 + Actor812: n1 + Owner: GDI + Facing: 384 + Location: 109,98 + SubCell: 1 + Actor813: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 103,92 + Actor814: n1 + Owner: GDI + Facing: 384 + Location: 103,92 + SubCell: 1 + Actor815: zrai + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 105,96 + Actor816: zrai + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 104,93 + Actor817: zrai + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 109,95 + Actor818: zrai + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 41,32 + Actor819: zrai + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 36,29 + Actor820: zrai + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 41,28 + Actor821: wolv + Owner: GDI + Facing: 384 + Location: 37,31 + Actor822: wolv + Owner: GDI + Location: 104,95 + Facing: 380 + GDIEastAttack: waypoint + Owner: Neutral + Location: 105,95 + GDIWestAttack: waypoint + Owner: Neutral + Location: 38,31 + Actor823: ltnk + Owner: Nod + Location: 15,118 + Facing: 896 + Actor824: ltnk + Owner: Nod + Location: 12,116 + Facing: 896 + EastBaseCenter: waypoint + Owner: Neutral + Location: 92,115 + WestBaseCenter: waypoint + Owner: Neutral + Location: 14,35 + Actor825: n1 + Owner: GDI + SubCell: 3 + Facing: 682 + Location: 18,83 + Actor826: n1 + Owner: GDI + SubCell: 1 + Facing: 602 + Location: 18,83 + Actor827: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 48,97 + Actor828: n1 + Owner: GDI + Facing: 384 + SubCell: 1 + Location: 48,97 + EastRally4: waypoint + Owner: Neutral + Location: 69,103 + EastRally2: waypoint + Owner: Neutral + Location: 95,86 + EastRally1: waypoint + Owner: Neutral + Location: 134,82 + EastRally3: waypoint + Owner: Neutral + Location: 143,121 + WestRally1: waypoint + Owner: Neutral + Location: 37,60 + WestRally2: waypoint + Owner: Neutral + Location: 39,28 + WestRally3: waypoint + Owner: Neutral + Location: 22,19 + WestRally4: waypoint + Owner: Neutral + Location: 94,73 + Actor829: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 98,46 + Actor830: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 99,47 + Actor831: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 101,49 + Actor832: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 97,50 + Actor833: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 104,50 + Actor834: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 134,52 + Actor835: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 133,53 + Actor836: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 142,51 + Actor837: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 138,53 + Actor838: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 68,32 + Actor839: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 66,30 + Actor840: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 65,32 + Actor841: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 93,31 + Actor842: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 87,28 + Actor844: thwk + Owner: GDI + Location: 92,45 + Facing: 256 + Actor843: thwk + Owner: GDI + Facing: 256 + Location: 92,43 + Actor845: thwk + Owner: GDI + Facing: 256 + Location: 94,44 + Actor846: camera + Owner: GDI + Location: 26,38 + Actor847: camera + Owner: GDI + Location: 22,23 + Actor848: camera + Owner: GDI + Location: 95,109 + Actor849: camera + Owner: GDI + Location: 111,111 + Actor850: camera + Owner: GDI + Location: 65,79 + Actor851: camera + Owner: GDI + Location: 84,77 + Actor852: camera + Owner: GDI + Location: 136,75 + Actor853: camera + Owner: GDI + Location: 98,71 + Actor854: camera + Owner: GDI + Location: 68,34 + Actor855: camera + Owner: GDI + Location: 61,58 + Actor856: patr + Owner: GDI + Location: 76,75 + TurretFacing: 192 + Actor857: rep + Owner: GDI + Location: 72,75 + Actor858: split2 + Owner: Neutral + Location: 155,90 + Actor859: split2 + Owner: Neutral + Location: 154,81 + Actor108: split2 + Owner: Neutral + Location: 4,6 + Actor860: pt2 + Owner: GDI + Location: 116,60 + Facing: 256 + Actor861: pt2 + Owner: GDI + Location: 126,60 + Facing: 256 + Actor862: pt2 + Owner: GDI + Location: 155,64 + Facing: 256 + Actor863: pt2 + Owner: GDI + Location: 149,65 + Facing: 256 + Actor864: pt2 + Owner: GDI + Location: 148,60 + Facing: 256 + Actor865: pt2 + Owner: GDI + Facing: 384 + Location: 82,51 + Actor866: pt2 + Owner: GDI + Facing: 384 + Location: 92,58 + Actor867: pt2 + Owner: GDI + Facing: 384 + Location: 78,43 + Actor868: pt2 + Owner: GDI + Location: 80,13 + Facing: 523 + Actor869: pt2 + Owner: GDI + Facing: 523 + Location: 72,12 + Actor870: htnk + Owner: GDI + Location: 55,25 + Facing: 256 + Actor871: htnk + Owner: GDI + Location: 52,23 + Facing: 256 + Actor872: vulc.ai + Owner: GDI + Location: 54,22 + Facing: 256 + Actor873: vulc.ai + Owner: GDI + Location: 54,27 + Facing: 256 + Actor874: ztrp + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 53,21 + Actor875: ztrp + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 56,23 + Actor876: zdef + Owner: GDI + SubCell: 3 + Facing: 384 + Location: 54,24 + Actor877: zdef + Owner: GDI + Facing: 384 + Location: 56,26 + SubCell: 3 + Actor878: zdef + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 55,28 + Actor879: htnk + Owner: GDI + Location: 133,72 + Facing: 512 + Actor880: htnk + Owner: GDI + Location: 136,72 + Facing: 512 + Actor881: vulc.ai + Owner: GDI + Location: 131,71 + Facing: 512 + Actor882: vulc.ai + Owner: GDI + Location: 138,71 + TurretFacing: 0 + Facing: 512 + Actor883: ztrp + Owner: GDI + SubCell: 3 + Location: 134,71 + Facing: 512 + Actor884: ztrp + Owner: GDI + SubCell: 3 + Location: 130,70 + Facing: 512 + Actor885: ztrp + Owner: GDI + SubCell: 3 + Location: 139,70 + Facing: 512 + Actor886: ztrp + Owner: GDI + SubCell: 3 + Facing: 512 + Location: 94,68 + Actor887: ztrp + Owner: GDI + SubCell: 3 + Facing: 512 + Location: 103,68 + Actor888: vulc.ai + Owner: GDI + Facing: 512 + Location: 95,69 + Actor889: ztrp + Owner: GDI + SubCell: 3 + Facing: 512 + Location: 98,69 + Actor890: vulc.ai + Owner: GDI + TurretFacing: 0 + Facing: 512 + Location: 102,69 + Actor891: htnk + Owner: GDI + Facing: 512 + Location: 97,70 + Actor892: htnk + Owner: GDI + Facing: 512 + Location: 100,70 + Actor893: camera + Owner: GDI + Location: 9,40 + Actor894: camera + Owner: GDI + Location: 93,123 + Actor895: vulc + Owner: GDI + Facing: 384 + Location: 101,18 + ScriptTags: BrutalOnly + Actor896: vulc + Owner: GDI + Location: 100,16 + Facing: 384 + ScriptTags: BrutalOnly + Actor897: vulc + Owner: GDI + Facing: 384 + Location: 105,23 + ScriptTags: BrutalOnly + Actor898: vulc + Owner: GDI + Facing: 384 + Location: 118,22 + ScriptTags: BrutalOnly + Actor899: vulc + Owner: GDI + Facing: 384 + Location: 119,24 + ScriptTags: BrutalOnly + Actor901: vulc + Owner: GDI + Facing: 384 + Location: 120,22 + ScriptTags: BrutalOnly + Actor900: vulc + Owner: GDI + Location: 136,27 + ScriptTags: BrutalOnly + Facing: 384 + Actor902: vulc + Owner: GDI + Facing: 384 + Location: 138,27 + ScriptTags: BrutalOnly + Actor903: vulc + Owner: GDI + Facing: 384 + Location: 127,23 + ScriptTags: BrutalOnly + Actor904: vulc + Owner: GDI + Facing: 384 + Location: 126,21 + ScriptTags: BrutalOnly + Actor905: vulc + Owner: GDI + Facing: 384 + Location: 158,26 + ScriptTags: BrutalOnly + Actor906: vulc + Owner: GDI + Facing: 384 + Location: 156,26 + ScriptTags: BrutalOnly + Actor907: hpad.td + Owner: GDI + Location: 92,3 + Actor908: hpad.td + Owner: GDI + Location: 94,3 + Actor909: chain + Owner: GDI + Location: 93,2 + Actor910: chain + Owner: GDI + Location: 92,2 + Actor911: chain + Owner: GDI + Location: 91,2 + Actor912: chain + Owner: GDI + Location: 91,3 + Actor913: chain + Owner: GDI + Location: 91,4 + Actor914: chain + Owner: GDI + Location: 91,5 + Actor915: chain + Owner: GDI + Location: 96,5 + Actor916: chain + Owner: GDI + Location: 96,4 + Actor917: chain + Owner: GDI + Location: 96,3 + Actor918: chain + Owner: GDI + Location: 96,2 + Actor919: chain + Owner: GDI + Location: 95,2 + Actor920: chain + Owner: GDI + Location: 94,2 + Actor921: chain + Owner: GDI + Location: 91,6 + Actor922: chain + Owner: GDI + Location: 92,6 + Actor923: chain + Owner: GDI + Location: 96,6 + Actor924: n3r1 + Owner: GDI + Facing: 384 + Location: 92,7 + SubCell: 3 + Actor925: n3r1 + Owner: GDI + Facing: 384 + Location: 97,5 + SubCell: 3 + Actor926: n3r1 + Owner: GDI + Facing: 384 + Location: 90,5 + SubCell: 3 + Actor927: chain + Owner: GDI + Location: 95,6 + MainHelipad1: hpad.td + Owner: GDI + Location: 156,15 + MainHelipad2: hpad.td + Owner: GDI + Location: 158,15 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|missions/main-campaign/ca12-supremacy/supremacy-rules.yaml, ca|rules/custom/coop-rules.yaml, supremacy-coop-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/coop-campaign/ca12-supremacy-coop/supremacy-coop-rules.yaml b/mods/ca/missions/coop-campaign/ca12-supremacy-coop/supremacy-coop-rules.yaml new file mode 100644 index 0000000000..64bc3959b1 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca12-supremacy-coop/supremacy-coop-rules.yaml @@ -0,0 +1,6 @@ +World: + LuaScript: + Scripts: campaign.lua, coop.lua, ca|missions/main-campaign/ca12-supremacy/supremacy.lua, supremacy-coop.lua + LobbyMissionInfo@InitialObjectives: + Prefix: Initial Objectives + Text: • Secure one of the two Nod bases.\n• Destroy GDI presence in the area. diff --git a/mods/ca/missions/coop-campaign/ca12-supremacy-coop/supremacy-coop.lua b/mods/ca/missions/coop-campaign/ca12-supremacy-coop/supremacy-coop.lua new file mode 100644 index 0000000000..0fabff7583 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca12-supremacy-coop/supremacy-coop.lua @@ -0,0 +1,55 @@ + +SetupPlayers = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Multi2 = Player.GetPlayer("Multi2") + Multi3 = Player.GetPlayer("Multi3") + Multi4 = Player.GetPlayer("Multi4") + Multi5 = Player.GetPlayer("Multi5") + Nod = Player.GetPlayer("Nod") + Nod2 = Player.GetPlayer("Nod2") + Nod3 = Player.GetPlayer("Nod3") + GDI = Player.GetPlayer("GDI") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = Utils.Where({ Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 }, function(p) return p ~= nil end) + MissionEnemies = { GDI } + SinglePlayerPlayer = Nod + CoopInit() +end + +AfterWorldLoaded = function() + TransferMcvsToPlayers() + if Nod.Cash > 2500 then + StartCashSpread(2500) + end +end + +AfterTick = function() + +end + +TransferEastNod = function() + local nod2Assets = Nod2.GetActors() + Utils.Do(nod2Assets, function(a) + if not a.IsDead and a.Type ~= "player" then + a.Owner = Nod + end + end) + Trigger.AfterDelay(1, function() + local firstActivePlayer = GetFirstActivePlayer() + TransferBaseToPlayer(SinglePlayerPlayer, firstActivePlayer) + end) +end + +TransferWestNod = function() + local nod3Assets = Nod3.GetActors() + Utils.Do(nod3Assets, function(a) + if not a.IsDead and a.Type ~= "player" then + a.Owner = Nod + end + end) + Trigger.AfterDelay(1, function() + local firstActivePlayer = GetFirstActivePlayer() + TransferBaseToPlayer(SinglePlayerPlayer, firstActivePlayer) + end) +end diff --git a/mods/ca/missions/coop-campaign/ca13-abasement-coop/abasement-coop-rules.yaml b/mods/ca/missions/coop-campaign/ca13-abasement-coop/abasement-coop-rules.yaml new file mode 100644 index 0000000000..2773e13258 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca13-abasement-coop/abasement-coop-rules.yaml @@ -0,0 +1,6 @@ +World: + LuaScript: + Scripts: campaign.lua, coop.lua, ca|missions/main-campaign/ca13-abasement/abasement.lua, abasement-coop.lua + LobbyMissionInfo@InitialObjectives: + Prefix: Initial Objectives + Text: • Capture the Scrin Signal Transmitter. diff --git a/mods/ca/missions/coop-campaign/ca13-abasement-coop/abasement-coop.lua b/mods/ca/missions/coop-campaign/ca13-abasement-coop/abasement-coop.lua new file mode 100644 index 0000000000..9087fac5b6 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca13-abasement-coop/abasement-coop.lua @@ -0,0 +1,27 @@ + +SetupPlayers = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Multi2 = Player.GetPlayer("Multi2") + Multi3 = Player.GetPlayer("Multi3") + Multi4 = Player.GetPlayer("Multi4") + Multi5 = Player.GetPlayer("Multi5") + USSR = Player.GetPlayer("USSR") + Nod = Player.GetPlayer("Nod") + NodAbandoned = Player.GetPlayer("NodAbandoned") + Scrin = Player.GetPlayer("Scrin") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = Utils.Where({ Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 }, function(p) return p ~= nil end) + MissionEnemies = { Scrin } + SinglePlayerPlayer = USSR + CoopInit() +end + +AfterWorldLoaded = function() + TransferMcvsToPlayers() + StartCashSpread(3500) +end + +AfterTick = function() + +end diff --git a/mods/ca/missions/coop-campaign/ca13-abasement-coop/map.bin b/mods/ca/missions/coop-campaign/ca13-abasement-coop/map.bin new file mode 100644 index 0000000000..f8df1b0dbb Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca13-abasement-coop/map.bin differ diff --git a/mods/ca/missions/coop-campaign/ca13-abasement-coop/map.png b/mods/ca/missions/coop-campaign/ca13-abasement-coop/map.png new file mode 100644 index 0000000000..9b4d1f3639 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca13-abasement-coop/map.png differ diff --git a/mods/ca/missions/coop-campaign/ca13-abasement-coop/map.yaml b/mods/ca/missions/coop-campaign/ca13-abasement-coop/map.yaml new file mode 100644 index 0000000000..2475e13581 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca13-abasement-coop/map.yaml @@ -0,0 +1,2169 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 13: Abasement Co-op + +Author: Darkademic & Gandorques Hikla + +Tileset: TEMPERAT + +MapSize: 98,98 + +Bounds: 1,1,96,96 + +Visibility: Lobby + +Categories: Co-op Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: USSR, Scrin, Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + PlayerReference@USSR: + Name: USSR + Faction: soviet + Color: FE1100 + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Creeps + PlayerReference@Scrin: + Name: Scrin + Bot: campaign + Faction: scrin + Color: 7700FF + Enemies: USSR, Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@Nod: + Name: Nod + Bot: campaign + Faction: nod + Color: 6D738C + Allies: USSR + Enemies: Scrin, Creeps + PlayerReference@NodAbandoned: + Name: NodAbandoned + Bot: campaign + Faction: nod + Color: 6D738C + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: FE1100 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Creeps + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: FF9922 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Creeps + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: 994050 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Creeps + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: 775A12 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Creeps + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: 82C900 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Creeps + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: DD1691 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Creeps + +Actors: + SignalTransmitter: sign + Owner: Scrin + Location: 9,5 + Actor14: shar + Owner: Scrin + Location: 8,13 + TurretFacing: 396 + Actor15: shar + Owner: Scrin + Location: 19,19 + TurretFacing: 404 + Actor16: shar + Owner: Scrin + Location: 21,11 + TurretFacing: 642 + Actor17: shar + Owner: Scrin + Location: 6,3 + TurretFacing: 269 + Actor18: shar + Owner: Scrin + Location: 17,4 + TurretFacing: 888 + Actor19: shar + Owner: Scrin + Location: 15,13 + TurretFacing: 523 + Actor20: grav + Owner: Scrin + Location: 18,13 + Actor21: ptur + Owner: Scrin + Location: 26,10 + TurretFacing: 808 + Actor22: ptur + Owner: Scrin + Location: 24,4 + TurretFacing: 713 + Actor23: scol + Owner: Scrin + Location: 20,9 + Actor24: scol + Owner: Scrin + Location: 13,10 + Actor25: scol + Owner: Scrin + Location: 5,9 + Actor35: swal + Owner: Scrin + Location: 18,48 + Actor36: swal + Owner: Scrin + Location: 18,47 + Actor37: swal + Owner: Scrin + Location: 18,46 + Actor38: swal + Owner: Scrin + Location: 18,45 + Actor39: swal + Owner: Scrin + Location: 18,44 + Actor40: swal + Owner: Scrin + Location: 18,43 + Actor41: swal + Owner: Scrin + Location: 18,42 + Actor42: swal + Owner: Scrin + Location: 18,41 + Actor43: swal + Owner: Scrin + Location: 19,41 + Actor44: swal + Owner: Scrin + Location: 19,40 + Actor45: swal + Owner: Scrin + Location: 20,40 + Actor46: swal + Owner: Scrin + Location: 21,40 + Actor47: swal + Owner: Scrin + Location: 22,40 + Actor48: swal + Owner: Scrin + Location: 23,40 + Actor49: swal + Owner: Scrin + Location: 23,39 + Actor50: swal + Owner: Scrin + Location: 23,38 + Actor51: swal + Owner: Scrin + Location: 23,37 + Actor52: swal + Owner: Scrin + Location: 23,36 + Actor53: swal + Owner: Scrin + Location: 23,35 + Actor54: swal + Owner: Scrin + Location: 22,35 + Actor55: swal + Owner: Scrin + Location: 22,34 + Actor56: swal + Owner: Scrin + Location: 23,34 + Actor57: swal + Owner: Scrin + Location: 29,29 + Actor58: swal + Owner: Scrin + Location: 29,30 + Actor59: swal + Owner: Scrin + Location: 30,29 + Actor60: swal + Owner: Scrin + Location: 30,30 + Actor61: swal + Owner: Scrin + Location: 31,30 + Actor62: swal + Owner: Scrin + Location: 32,30 + Actor63: swal + Owner: Scrin + Location: 33,30 + Actor64: swal + Owner: Scrin + Location: 34,30 + Actor65: swal + Owner: Scrin + Location: 34,29 + Actor66: swal + Owner: Scrin + Location: 35,29 + Actor67: swal + Owner: Scrin + Location: 35,30 + Actor68: swal + Owner: Scrin + Location: 36,31 + Actor69: swal + Owner: Scrin + Location: 38,31 + Actor70: swal + Owner: Scrin + Location: 39,31 + Actor71: swal + Owner: Scrin + Location: 37,31 + Actor72: swal + Owner: Scrin + Location: 35,31 + Actor73: swal + Owner: Scrin + Location: 39,32 + Actor74: swal + Owner: Scrin + Location: 40,32 + Actor75: swal + Owner: Scrin + Location: 40,33 + Actor76: swal + Owner: Scrin + Location: 41,33 + Actor77: swal + Owner: Scrin + Location: 41,34 + Actor78: swal + Owner: Scrin + Location: 42,34 + Actor79: swal + Owner: Scrin + Location: 19,48 + Actor80: swal + Owner: Scrin + Location: 20,48 + Actor81: swal + Owner: Scrin + Location: 21,48 + Actor82: swal + Owner: Scrin + Location: 22,48 + Actor83: swal + Owner: Scrin + Location: 23,48 + Actor84: swal + Owner: Scrin + Location: 24,48 + Actor85: swal + Owner: Scrin + Location: 24,49 + Actor86: swal + Owner: Scrin + Location: 25,49 + Actor87: swal + Owner: Scrin + Location: 26,49 + Actor88: swal + Owner: Scrin + Location: 27,49 + Actor89: swal + Owner: Scrin + Location: 27,48 + Actor90: swal + Owner: Scrin + Location: 28,48 + Actor91: swal + Owner: Scrin + Location: 29,48 + Actor92: swal + Owner: Scrin + Location: 30,48 + Actor93: swal + Owner: Scrin + Location: 31,48 + Actor94: swal + Owner: Scrin + Location: 32,48 + Actor95: swal + Owner: Scrin + Location: 32,47 + Actor96: swal + Owner: Scrin + Location: 31,47 + Actor97: swal + Owner: Scrin + Location: 37,47 + Actor98: swal + Owner: Scrin + Location: 37,48 + Actor99: swal + Owner: Scrin + Location: 38,48 + Actor100: swal + Owner: Scrin + Location: 38,47 + Actor101: swal + Owner: Scrin + Location: 42,35 + Actor102: swal + Owner: Scrin + Location: 42,36 + Actor103: swal + Owner: Scrin + Location: 39,48 + Actor104: swal + Owner: Scrin + Location: 41,48 + Actor105: swal + Owner: Scrin + Location: 40,48 + Actor106: swal + Owner: Scrin + Location: 42,37 + Actor107: swal + Owner: Scrin + Location: 42,45 + Actor108: swal + Owner: Scrin + Location: 42,46 + Actor109: swal + Owner: Scrin + Location: 42,47 + Actor110: swal + Owner: Scrin + Location: 42,48 + Actor111: swal + Owner: Scrin + Location: 41,44 + Actor112: swal + Owner: Scrin + Location: 41,45 + Actor113: swal + Owner: Scrin + Location: 42,44 + Actor114: swal + Owner: Scrin + Location: 42,38 + Actor115: swal + Owner: Scrin + Location: 42,39 + Actor116: swal + Owner: Scrin + Location: 41,39 + Actor117: swal + Owner: Scrin + Location: 41,38 + Actor118: sfac + Owner: Scrin + Location: 24,38 + Actor119: rea2 + Owner: Scrin + Location: 19,45 + Actor120: rea2 + Owner: Scrin + Location: 19,42 + Actor121: rea2 + Owner: Scrin + Location: 32,31 + Actor122: rea2 + Owner: Scrin + Location: 29,31 + Actor124: proc.scrin + Owner: Scrin + Location: 37,36 + Actor127: nerv + Owner: Scrin + Location: 37,32 + Actor128: scrt + Owner: Scrin + Location: 23,42 + Portal2: port + Owner: Scrin + Location: 37,42 + WarpSphere1: wsph + Owner: Scrin + Location: 26,44 + Actor131: proc.scrin + Owner: Scrin + Location: 28,39 + Actor126: grav + Owner: Scrin + Location: 29,35 + Actor132: rea2 + Owner: Scrin + Location: 24,34 + Actor133: silo.scrin + Owner: Scrin + Location: 30,39 + Actor134: silo.scrin + Owner: Scrin + Location: 28,39 + Actor135: silo.scrin + Owner: Scrin + Location: 37,36 + Actor136: silo.scrin + Owner: Scrin + Location: 39,36 + Actor137: ptur + Owner: Scrin + Location: 32,49 + TurretFacing: 523 + Actor138: ptur + Owner: Scrin + Location: 37,49 + TurretFacing: 594 + Actor139: ptur + Owner: Scrin + Location: 43,44 + TurretFacing: 697 + Actor140: ptur + Owner: Scrin + Location: 43,39 + TurretFacing: 769 + Actor141: scol + Owner: Scrin + Location: 41,47 + Actor142: scol + Owner: Scrin + Location: 30,47 + Actor143: scol + Owner: Scrin + Location: 41,37 + Actor144: shar + Owner: Scrin + Location: 25,48 + Actor145: shar + Owner: Scrin + Location: 40,34 + Actor146: shar + Owner: Scrin + Location: 39,47 + Actor147: shar + Owner: Scrin + Location: 20,41 + Actor148: scol + Owner: Scrin + Location: 25,31 + Actor149: ptur + Owner: Scrin + Location: 22,33 + Actor150: ptur + Owner: Scrin + Location: 28,29 + Actor151: rea2 + Owner: Scrin + Location: 5,5 + Actor152: rea2 + Owner: Scrin + Location: 7,9 + Actor153: rea2 + Owner: Scrin + Location: 11,12 + Actor154: ptur + Owner: Scrin + Location: 9,4 + TurretFacing: 642 + Actor241: sbag + Owner: NodAbandoned + Location: 89,1 + Actor242: sbag + Owner: NodAbandoned + Location: 88,1 + Actor243: sbag + Owner: NodAbandoned + Location: 87,1 + Actor244: sbag + Owner: NodAbandoned + Location: 86,1 + Actor245: sbag + Owner: NodAbandoned + Location: 85,1 + Actor246: sbag + Owner: NodAbandoned + Location: 84,1 + Actor247: sbag + Owner: NodAbandoned + Location: 83,1 + Actor248: sbag + Owner: NodAbandoned + Location: 82,1 + Actor249: sbag + Owner: NodAbandoned + Location: 81,1 + Actor250: sbag + Owner: NodAbandoned + Location: 80,1 + Actor251: sbag + Owner: NodAbandoned + Location: 90,1 + Actor252: sbag + Owner: NodAbandoned + Location: 90,2 + Health: 8 + Actor253: sbag + Owner: NodAbandoned + Location: 79,1 + Actor254: sbag + Owner: NodAbandoned + Location: 77,1 + Actor255: sbag + Owner: NodAbandoned + Location: 78,1 + Actor262: sbag + Owner: NodAbandoned + Location: 90,4 + Health: 30 + Actor271: sbag + Owner: NodAbandoned + Location: 74,1 + Actor272: sbag + Owner: NodAbandoned + Location: 75,1 + Actor273: sbag + Owner: NodAbandoned + Location: 76,1 + Actor274: sbag + Owner: NodAbandoned + Location: 74,2 + Actor275: sbag + Owner: NodAbandoned + Location: 74,3 + Health: 41 + Actor281: sbag + Owner: NodAbandoned + Location: 77,11 + Actor282: sbag + Owner: NodAbandoned + Location: 79,11 + Actor283: sbag + Owner: NodAbandoned + Location: 76,11 + Health: 23 + Actor284: sbag + Owner: NodAbandoned + Location: 78,11 + Health: 28 + Actor276: sbag + Owner: NodAbandoned + Location: 76,8 + Health: 29 + Actor278: sbag + Owner: NodAbandoned + Location: 76,9 + Actor279: sbag + Owner: NodAbandoned + Location: 76,10 + Health: 24 + Actor277: sbag + Owner: NodAbandoned + Location: 75,8 + Actor280: sbag + Owner: NodAbandoned + Location: 74,8 + Health: 48 + Actor285: sbag + Owner: NodAbandoned + Location: 74,7 + Health: 21 + Actor268: sbag + Owner: NodAbandoned + Location: 80,11 + Health: 43 + Actor269: sbag + Owner: NodAbandoned + Location: 81,11 + Health: 38 + Actor270: sbag + Owner: NodAbandoned + Location: 86,11 + Actor286: sbag + Owner: NodAbandoned + Location: 87,11 + Health: 35 + Actor287: sbag + Owner: NodAbandoned + Location: 88,11 + Actor288: sbag + Owner: NodAbandoned + Location: 89,11 + Actor289: sbag + Owner: NodAbandoned + Location: 90,11 + Health: 20 + Actor290: sbag + Owner: NodAbandoned + Location: 90,10 + Actor292: sbag + Owner: NodAbandoned + Location: 90,8 + Health: 35 + Actor291: sbag + Owner: NodAbandoned + Location: 90,9 + Actor261: sbag + Owner: NodAbandoned + Location: 90,3 + Actor293: brik + Owner: NodAbandoned + Location: 36,79 + Actor294: brik + Owner: NodAbandoned + Location: 37,79 + Actor295: brik + Owner: NodAbandoned + Health: 32 + Location: 38,79 + Actor296: brik + Owner: NodAbandoned + Location: 39,79 + Actor297: brik + Owner: NodAbandoned + Health: 65 + Location: 40,79 + Actor298: brik + Owner: NodAbandoned + Health: 68 + Location: 41,79 + Actor299: brik + Owner: NodAbandoned + Health: 25 + Location: 42,79 + Actor300: brik + Owner: NodAbandoned + Health: 28 + Location: 44,79 + Actor301: brik + Owner: NodAbandoned + Health: 58 + Location: 45,79 + Actor302: brik + Owner: NodAbandoned + Location: 46,79 + Actor303: brik + Owner: NodAbandoned + Location: 47,79 + Actor304: brik + Owner: NodAbandoned + Health: 31 + Location: 51,79 + Actor305: brik + Owner: NodAbandoned + Location: 52,79 + Actor306: brik + Owner: NodAbandoned + Health: 32 + Location: 53,79 + Actor307: brik + Owner: NodAbandoned + Location: 54,79 + Actor308: brik + Owner: NodAbandoned + Health: 60 + Location: 55,79 + Actor309: brik + Owner: NodAbandoned + Health: 24 + Location: 56,79 + Actor310: brik + Owner: NodAbandoned + Health: 24 + Location: 57,79 + Actor311: brik + Owner: NodAbandoned + Location: 36,80 + Actor312: nuk2 + Owner: NodAbandoned + Location: 37,80 + Health: 31 + Actor313: nuk2 + Owner: NodAbandoned + Location: 39,80 + Health: 14 + Actor314: nuk2 + Owner: NodAbandoned + Location: 41,80 + Health: 31 + Actor315: brik + Owner: NodAbandoned + Health: 31 + Location: 46,80 + Actor316: brik + Owner: NodAbandoned + Location: 47,80 + Actor317: brik + Owner: NodAbandoned + Location: 51,80 + Actor318: brik + Owner: NodAbandoned + Health: 39 + Location: 52,80 + Actor319: brik + Owner: NodAbandoned + Health: 27 + Location: 57,80 + Actor320: brik + Owner: NodAbandoned + Location: 36,81 + Actor321: brik + Owner: NodAbandoned + Location: 57,81 + Actor322: brik + Owner: NodAbandoned + Location: 36,82 + Actor323: brik + Owner: NodAbandoned + Location: 57,82 + Actor324: brik + Owner: NodAbandoned + Location: 36,83 + SouthHand: hand + Owner: NodAbandoned + Location: 51,83 + Health: 19 + Actor327: brik + Owner: NodAbandoned + Health: 42 + Location: 57,83 + Actor328: brik + Owner: NodAbandoned + Location: 36,84 + Actor329: brik + Owner: NodAbandoned + Health: 57 + Location: 37,84 + SouthAirstrip: airs + Owner: NodAbandoned + Location: 42,84 + Health: 20 + Actor331: brik + Owner: NodAbandoned + Location: 56,84 + Actor332: brik + Owner: NodAbandoned + Health: 31 + Location: 57,84 + Actor333: brik + Owner: NodAbandoned + Health: 22 + Location: 36,85 + Actor334: brik + Owner: NodAbandoned + Location: 37,85 + Actor335: brik + Owner: NodAbandoned + Location: 56,85 + Actor336: brik + Owner: NodAbandoned + Health: 16 + Location: 57,85 + Actor337: rep + Owner: NodAbandoned + Location: 48,87 + Health: 24 + Actor339: brik + Owner: NodAbandoned + Location: 36,89 + Actor340: brik + Owner: NodAbandoned + Health: 23 + Location: 37,89 + Actor341: brik + Owner: NodAbandoned + Location: 56,89 + Actor342: brik + Owner: NodAbandoned + Health: 19 + Location: 57,89 + Actor343: brik + Owner: NodAbandoned + Health: 25 + Location: 36,90 + Actor344: brik + Owner: NodAbandoned + Location: 37,90 + Actor345: brik + Owner: NodAbandoned + Health: 38 + Location: 56,90 + Actor346: brik + Owner: NodAbandoned + Health: 8 + Location: 57,90 + Actor347: brik + Owner: NodAbandoned + Location: 36,91 + Actor348: brik + Owner: NodAbandoned + Health: 68 + Location: 57,91 + Actor349: brik + Owner: NodAbandoned + Health: 52 + Location: 36,92 + Actor350: brik + Owner: NodAbandoned + Location: 46,92 + Actor351: brik + Owner: NodAbandoned + Location: 47,92 + Actor352: brik + Owner: NodAbandoned + Location: 51,92 + Actor353: brik + Owner: NodAbandoned + Health: 41 + Location: 52,92 + Actor354: brik + Owner: NodAbandoned + Location: 57,92 + Actor355: brik + Owner: NodAbandoned + Health: 58 + Location: 36,93 + Actor356: brik + Owner: NodAbandoned + Location: 37,93 + Actor357: brik + Owner: NodAbandoned + Health: 48 + Location: 38,93 + Actor358: brik + Owner: NodAbandoned + Location: 39,93 + Actor359: brik + Owner: NodAbandoned + Health: 32 + Location: 40,93 + Actor360: brik + Owner: NodAbandoned + Health: 16 + Location: 42,93 + Actor361: brik + Owner: NodAbandoned + Location: 43,93 + Actor362: brik + Owner: NodAbandoned + Health: 58 + Location: 44,93 + Actor363: brik + Owner: NodAbandoned + Location: 45,93 + Actor364: brik + Owner: NodAbandoned + Location: 46,93 + Actor365: brik + Owner: NodAbandoned + Location: 47,93 + Actor366: brik + Owner: NodAbandoned + Health: 39 + Location: 51,93 + Actor367: brik + Owner: NodAbandoned + Location: 52,93 + Actor368: brik + Owner: NodAbandoned + Health: 58 + Location: 53,93 + Actor369: brik + Owner: NodAbandoned + Health: 26 + Location: 54,93 + Actor370: brik + Owner: NodAbandoned + Health: 58 + Location: 55,93 + Actor371: brik + Owner: NodAbandoned + Location: 56,93 + Actor372: brik + Owner: NodAbandoned + Location: 57,93 + Actor375: afac + Owner: NodAbandoned + Location: 53,90 + Health: 30 + Actor265: split2 + Owner: Neutral + Location: 91,30 + Actor373: split2 + Owner: Neutral + Location: 88,34 + Actor374: e1 + Owner: USSR + SubCell: 1 + Facing: 256 + Location: 85,44 + Actor376: e1 + Owner: USSR + SubCell: 4 + Facing: 256 + Location: 85,44 + Actor377: 3tnk + Owner: USSR + Facing: 256 + Location: 87,44 + Actor378: e2 + Owner: USSR + SubCell: 1 + Facing: 256 + Location: 85,46 + Actor379: e2 + Owner: USSR + SubCell: 4 + Facing: 256 + Location: 85,46 + Actor380: mcv + Owner: USSR + Location: 91,46 + Facing: 256 + Actor381: e1 + Owner: USSR + SubCell: 1 + Facing: 256 + Location: 85,48 + Actor382: e1 + Owner: USSR + SubCell: 4 + Facing: 256 + Location: 85,48 + Actor383: 3tnk + Owner: USSR + Location: 87,48 + Facing: 256 + Actor338: hq + Owner: NodAbandoned + Location: 44,88 + Health: 41 + Actor384: proc.td + Owner: NodAbandoned + Location: 40,88 + FreeActor: False + Health: 24 + NorthHelipad: hpad.td + Owner: NodAbandoned + Location: 87,8 + Health: 18 + Actor387: split2 + Owner: Neutral + Location: 70,8 + Actor388: split2 + Owner: Neutral + Location: 68,4 + Actor386: nuke + Owner: NodAbandoned + Location: 81,2 + Health: 20 + Actor389: nuke + Owner: NodAbandoned + Location: 83,2 + Health: 30 + Actor390: nuke + Owner: NodAbandoned + Location: 85,2 + Health: 16 + Actor392: silo.td + Owner: NodAbandoned + Location: 82,6 + Health: 41 + Actor393: silo.td + Owner: NodAbandoned + Location: 83,8 + Health: 22 + Actor394: silo.td + Owner: NodAbandoned + Location: 85,6 + Health: 39 + Actor395: split2 + Owner: Neutral + Location: 45,26 + Actor396: split2 + Owner: Neutral + Location: 46,34 + Actor397: split2 + Owner: Neutral + Location: 41,53 + Actor398: split2 + Owner: Neutral + Location: 28,54 + Actor399: scol + Owner: Scrin + Location: 56,56 + Actor400: shar + Owner: Scrin + Location: 47,18 + TurretFacing: 721 + Actor401: shar + Owner: Scrin + Location: 38,19 + TurretFacing: 705 + Actor402: shar + Owner: Scrin + Location: 36,10 + TurretFacing: 753 + Actor403: shar + Owner: Scrin + Location: 35,2 + TurretFacing: 777 + Actor404: shar + Owner: Scrin + Location: 32,23 + TurretFacing: 666 + Actor405: shar + Owner: Scrin + Location: 5,23 + TurretFacing: 428 + Actor406: t15.husk + Owner: Neutral + Location: 35,63 + Actor407: tc04.husk + Owner: Neutral + Location: 34,65 + Actor408: t03.husk + Owner: Neutral + Location: 43,61 + Actor409: t07.husk + Owner: Neutral + Location: 46,57 + Actor410: t13.husk + Owner: Neutral + Location: 47,63 + Actor411: tc05 + Owner: Neutral + Location: 73,61 + Actor412: tc03 + Owner: Neutral + Location: 72,60 + Actor413: t16 + Owner: Neutral + Location: 73,58 + Actor414: t17 + Owner: Neutral + Location: 78,62 + Actor415: t15 + Owner: Neutral + Location: 86,66 + Actor416: tc01 + Owner: Neutral + Location: 84,63 + Actor417: tc02 + Owner: Neutral + Location: 85,61 + Actor418: t17 + Owner: Neutral + Location: 84,62 + Actor419: t15 + Owner: Neutral + Location: 85,62 + Actor420: t07 + Owner: Neutral + Location: 82,61 + Actor421: t02 + Owner: Neutral + Location: 87,64 + Actor422: t02 + Owner: Neutral + Location: 71,63 + Actor423: t12 + Owner: Neutral + Location: 69,62 + Actor424: t01 + Owner: Neutral + Location: 70,70 + Actor425: t15 + Owner: Neutral + Location: 62,72 + Actor426: tc05 + Owner: Neutral + Location: 50,71 + Actor427: t12 + Owner: Neutral + Location: 73,74 + Actor428: tc01 + Owner: Neutral + Location: 94,68 + Actor429: tc02 + Owner: Neutral + Location: 59,55 + Actor430: t11 + Owner: Neutral + Location: 64,51 + Actor431: t15 + Owner: Neutral + Location: 63,26 + Actor432: t11 + Owner: Neutral + Location: 83,22 + Actor433: t16 + Owner: Neutral + Location: 79,26 + Actor434: t17 + Owner: Neutral + Location: 68,18 + Actor435: t01 + Owner: Neutral + Location: 60,22 + Actor436: t06 + Owner: Neutral + Location: 51,3 + Actor437: t14 + Owner: Neutral + Location: 52,21 + Actor438: t07 + Owner: Neutral + Location: 53,18 + Actor439: t06 + Owner: Neutral + Location: 58,14 + Actor440: t02 + Owner: Neutral + Location: 56,11 + Actor441: t10 + Owner: Neutral + Location: 57,7 + Actor442: t15 + Owner: Neutral + Location: 89,16 + Actor443: t06 + Owner: Neutral + Location: 92,17 + Actor444: t01 + Owner: Neutral + Location: 74,15 + Actor445: t03 + Owner: Neutral + Location: 92,11 + Actor446: srep + Owner: Scrin + Location: 33,34 + WarpSphere2: wsph + Owner: Scrin + Location: 33,37 + Actor448: scol + Owner: Scrin + Location: 57,69 + Actor450: scol + Owner: Scrin + Location: 59,18 + Actor484: scol + Owner: Scrin + Location: 6,65 + Actor485: scol + Owner: Scrin + Location: 22,60 + Actor486: scol + Owner: Scrin + Location: 39,68 + Actor495: scol + Owner: Scrin + Location: 60,46 + Actor496: tc01 + Owner: Neutral + Location: 58,45 + Actor497: tc05 + Owner: Neutral + Location: 54,45 + Actor498: t15 + Owner: Neutral + Location: 56,47 + Actor499: t16 + Owner: Neutral + Location: 55,48 + Actor500: tc03 + Owner: Neutral + Location: 55,50 + Actor501: t17 + Owner: Neutral + Location: 52,46 + Actor502: t17 + Owner: Neutral + Location: 55,25 + Actor503: tc04 + Owner: Neutral + Location: 55,3 + Actor504: tc03 + Owner: Neutral + Location: 72,14 + Actor505: split2 + Owner: Neutral + Location: 78,90 + Actor506: split2 + Owner: Neutral + Location: 82,91 + Actor507: split2 + Owner: Neutral + Location: 29,81 + Actor508: split2 + Owner: Neutral + Location: 22,91 + Actor509: tc04 + Owner: Neutral + Location: 7,58 + Actor510: tc04 + Owner: Neutral + Location: 12,23 + Actor511: t02 + Owner: Neutral + Location: 11,27 + Actor512: t06 + Owner: Neutral + Location: 11,24 + Actor513: t06 + Owner: Neutral + Location: 8,56 + Actor514: t16 + Owner: Neutral + Location: 13,50 + Actor515: sbag + Owner: NodAbandoned + Location: 85,11 + Actor516: t16 + Owner: Neutral + Location: 87,83 + Actor517: tc02 + Owner: Neutral + Location: 93,80 + Actor518: t16 + Owner: Neutral + Location: 88,73 + Actor519: t17 + Owner: Neutral + Location: 82,76 + Actor520: t16 + Owner: Neutral + Location: 67,83 + Actor521: t12 + Owner: Neutral + Location: 65,91 + Actor522: t07 + Owner: Neutral + Location: 93,90 + Actor523: t02 + Owner: Neutral + Location: 23,70 + Actor524: tc01 + Owner: Neutral + Location: 28,68 + Actor525: tc02 + Owner: Neutral + Location: 5,72 + Actor526: tc05 + Owner: Neutral + Location: 23,76 + Actor527: t16 + Owner: Neutral + Location: 26,74 + Actor528: t08 + Owner: Neutral + Location: 33,74 + Actor529: t03 + Owner: Neutral + Location: 8,84 + Actor530: tc03 + Owner: Neutral + Location: 52,95 + Actor531: t16 + Owner: Neutral + Location: 35,95 + Actor532: tc01 + Owner: Neutral + Location: 36,95 + Actor533: t16 + Owner: Neutral + Location: 32,95 + Actor534: t16 + Owner: Neutral + Location: 62,95 + Actor535: t07 + Owner: Neutral + Location: 71,94 + Actor536: t03 + Owner: Neutral + Location: 13,95 + Actor537: t11 + Owner: Neutral + Location: 15,95 + Actor538: t16 + Owner: Neutral + Location: 17,95 + Actor539: t07 + Owner: Neutral + Location: 14,94 + Actor540: t16 + Owner: Neutral + Location: 13,36 + Actor541: e1 + Owner: USSR + SubCell: 1 + Facing: 256 + Location: 94,44 + Actor542: e1 + Owner: USSR + SubCell: 4 + Facing: 256 + Location: 94,44 + Actor543: e1 + Owner: USSR + SubCell: 1 + Facing: 256 + Location: 94,48 + Actor544: e1 + Owner: USSR + SubCell: 4 + Facing: 256 + Location: 94,48 + PlayerStart: waypoint + Owner: Neutral + Location: 91,46 + Actor545: s1 + Owner: Scrin + SubCell: 3 + Location: 65,78 + Facing: 896 + Actor546: s1 + Owner: Scrin + Location: 65,78 + SubCell: 1 + Facing: 848 + Actor547: s1 + Owner: Scrin + SubCell: 3 + Location: 66,77 + Facing: 967 + Actor548: s1 + Owner: Scrin + SubCell: 3 + Location: 64,76 + Facing: 761 + Actor550: s3 + Owner: Scrin + SubCell: 3 + Location: 66,79 + Facing: 935 + Actor551: s3 + Owner: Scrin + SubCell: 3 + Location: 61,77 + Facing: 856 + Actor552: s1 + Owner: Scrin + SubCell: 3 + Location: 58,66 + Facing: 896 + Actor553: s1 + Owner: Scrin + Location: 58,66 + SubCell: 1 + Facing: 848 + Actor554: s1 + Owner: Scrin + SubCell: 3 + Location: 59,67 + Facing: 95 + Actor558: s1 + Owner: Scrin + SubCell: 3 + Location: 69,76 + Facing: 816 + Actor559: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 93,75 + Actor560: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 95,73 + Actor561: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 80,13 + Actor562: s1 + Owner: Scrin + Facing: 384 + Location: 80,13 + SubCell: 1 + Actor563: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 81,16 + Actor564: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 85,17 + Actor565: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 88,14 + Actor566: gunw + Owner: Scrin + Facing: 384 + Location: 85,15 + Actor567: corr + Owner: Scrin + Location: 56,64 + Facing: 824 + Actor568: gunw + Owner: Scrin + Location: 62,76 + Facing: 896 + Actor569: corr + Owner: Scrin + Location: 34,58 + Facing: 586 + Actor570: corr + Owner: Scrin + Location: 34,55 + Facing: 586 + Portal1: port + Owner: Scrin + Location: 33,41 + Actor549: s1 + Owner: Scrin + SubCell: 3 + Location: 63,77 + Facing: 911 + Actor449: scol + Owner: Scrin + Location: 63,79 + Actor555: s1 + Owner: Scrin + SubCell: 3 + Location: 57,67 + Facing: 729 + Actor452: deva + Owner: Scrin + Location: 15,6 + Facing: 697 + Actor453: deva + Owner: Scrin + Location: 11,10 + Facing: 626 + Actor454: pac + Owner: Scrin + Location: 17,10 + Facing: 650 + Actor455: deva + Owner: Scrin + Location: 21,38 + Facing: 618 + Actor456: deva + Owner: Scrin + Location: 27,33 + Facing: 626 + Actor457: intl.ai2 + Owner: Scrin + Location: 32,55 + Facing: 586 + Actor458: intl.ai2 + Owner: Scrin + Location: 94,77 + Facing: 71 + Actor459: intl.ai2 + Owner: Scrin + Location: 58,71 + Facing: 864 + Actor460: devo + Owner: Scrin + Location: 14,61 + Facing: 515 + Actor461: devo + Owner: Scrin + Location: 17,61 + Facing: 531 + Actor462: ruin + Owner: Scrin + Location: 16,58 + Facing: 515 + Actor463: tpod + Owner: Scrin + Location: 33,48 + Facing: 523 + Actor464: tpod + Owner: Scrin + Location: 43,46 + Facing: 610 + Actor465: devo + Owner: Scrin + Location: 40,51 + Facing: 674 + Actor466: devo + Owner: Scrin + Location: 24,8 + Facing: 761 + Actor467: devo + Owner: Scrin + Location: 23,3 + Facing: 682 + Actor468: intl.ai2 + Owner: Scrin + Location: 30,4 + Facing: 650 + Actor469: intl.ai2 + Owner: Scrin + Facing: 384 + Location: 25,22 + Actor470: intl.ai2 + Owner: Scrin + Facing: 384 + Location: 28,23 + Actor471: intl.ai2 + Owner: Scrin + Location: 38,49 + Facing: 499 + Actor472: intl.ai2 + Owner: Scrin + Location: 41,68 + Facing: 650 + Actor473: lchr + Owner: Scrin + Location: 40,70 + Facing: 658 + Actor474: intl.ai2 + Owner: Scrin + Location: 90,87 + Facing: 951 + Actor475: shrw + Owner: Scrin + Location: 92,88 + Facing: 23 + Actor476: shrw + Owner: Scrin + Facing: 384 + Location: 36,12 + Actor477: shrw + Owner: Scrin + Facing: 384 + Location: 27,22 + Actor478: shrw + Owner: Scrin + Facing: 384 + Location: 47,48 + Actor479: shrw + Owner: Scrin + Facing: 384 + Location: 20,59 + Actor480: shrw + Owner: Scrin + Location: 11,60 + Facing: 697 + Actor481: shrw + Owner: Scrin + Location: 16,70 + Facing: 563 + Actor482: gunw + Owner: Scrin + Location: 60,91 + Facing: 967 + Actor483: gunw + Owner: Scrin + Location: 63,87 + Facing: 0 + Actor487: rtpd + Owner: Scrin + Facing: 384 + Location: 78,88 + Actor488: lace + Owner: Scrin + Location: 62,18 + Facing: 682 + Actor489: lace + Owner: Scrin + Location: 63,16 + Facing: 689 + Actor490: gunw + Owner: Scrin + Facing: 384 + Location: 80,14 + Actor491: s3 + Owner: Scrin + Facing: 384 + Location: 81,15 + SubCell: 3 + Actor492: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 89,13 + Actor493: s3 + Owner: Scrin + SubCell: 3 + Location: 61,17 + Facing: 626 + Actor494: s3 + Owner: Scrin + SubCell: 3 + Location: 55,67 + Facing: 1023 + Actor556: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 95,77 + Actor557: s3 + Owner: Scrin + SubCell: 3 + Location: 91,88 + Facing: 0 + Actor572: s3 + Owner: Scrin + SubCell: 3 + Location: 94,89 + Facing: 0 + Actor573: s3 + Owner: Scrin + Location: 59,90 + SubCell: 3 + Facing: 848 + Actor574: s3 + Owner: Scrin + SubCell: 3 + Location: 62,93 + Facing: 824 + Actor575: s3 + Owner: Scrin + SubCell: 3 + Location: 65,88 + Facing: 0 + Actor576: s3 + Owner: Scrin + SubCell: 3 + Location: 39,70 + Facing: 594 + Actor577: s3 + Owner: Scrin + SubCell: 3 + Location: 33,57 + Facing: 602 + Actor578: s3 + Owner: Scrin + SubCell: 3 + Location: 36,55 + Facing: 610 + Actor579: s3 + Owner: Scrin + SubCell: 3 + Location: 47,50 + Facing: 384 + Actor580: s3 + Owner: Scrin + SubCell: 3 + Location: 13,59 + Facing: 531 + Actor581: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 19,63 + Actor582: s3 + Owner: Scrin + SubCell: 3 + Location: 18,71 + Facing: 689 + Actor583: s3 + Owner: Scrin + SubCell: 3 + Location: 7,44 + Facing: 642 + Actor584: s3 + Owner: Scrin + Location: 7,44 + SubCell: 1 + Facing: 618 + Actor585: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 12,43 + Actor586: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 24,20 + Actor587: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 35,20 + Actor588: s3 + Owner: Scrin + SubCell: 3 + Location: 21,18 + Facing: 682 + TurretFacing: 0 + Actor589: s3 + Owner: Scrin + SubCell: 3 + Location: 19,4 + Facing: 785 + Actor590: s3 + Owner: Scrin + SubCell: 3 + Location: 23,4 + Facing: 674 + Actor591: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 9,13 + Actor592: s3 + Owner: Scrin + SubCell: 3 + Location: 4,10 + Facing: 384 + Actor593: s2 + Owner: Scrin + SubCell: 3 + Location: 30,10 + Facing: 777 + Actor594: s2 + Owner: Scrin + SubCell: 3 + Location: 33,4 + Facing: 761 + Actor595: s2 + Owner: Scrin + SubCell: 3 + Location: 25,5 + Facing: 793 + Actor596: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 27,26 + Actor597: s2 + Owner: Scrin + SubCell: 3 + Location: 23,24 + Facing: 507 + Actor598: s2 + Owner: Scrin + SubCell: 3 + Location: 5,28 + Facing: 697 + Actor599: s2 + Owner: Scrin + SubCell: 3 + Location: 9,25 + Facing: 610 + Actor600: s2 + Owner: Scrin + SubCell: 3 + Location: 17,24 + Facing: 650 + Actor601: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 12,44 + Actor602: s2 + Owner: Scrin + SubCell: 3 + Location: 4,43 + Facing: 666 + Actor603: s2 + Owner: Scrin + Location: 14,59 + SubCell: 3 + Facing: 578 + Actor604: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 20,58 + Actor605: s2 + Owner: Scrin + SubCell: 3 + Location: 55,71 + Facing: 856 + Actor606: s2 + Owner: Scrin + SubCell: 3 + Location: 41,67 + Facing: 682 + Actor607: s2 + Owner: Scrin + SubCell: 3 + Location: 60,92 + Facing: 824 + Actor608: s2 + Owner: Scrin + SubCell: 3 + Location: 96,76 + Facing: 0 + Actor609: s4 + Owner: Scrin + SubCell: 3 + Location: 90,77 + Facing: 103 + Actor610: s4 + Owner: Scrin + Facing: 384 + Location: 85,13 + SubCell: 3 + Actor611: s4 + Owner: Scrin + SubCell: 3 + Location: 61,15 + Facing: 808 + Actor613: seek + Owner: Scrin + Location: 54,6 + Facing: 705 + Actor614: s1 + Owner: Scrin + SubCell: 3 + Location: 53,7 + Facing: 737 + Actor615: s1 + Owner: Scrin + Facing: 384 + Location: 53,7 + SubCell: 1 + Actor616: s1 + Owner: Scrin + SubCell: 3 + Location: 53,4 + Facing: 721 + Actor617: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 6,45 + Actor618: s1 + Owner: Scrin + Facing: 384 + Location: 13,44 + SubCell: 3 + Actor619: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 12,49 + Actor620: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 18,63 + Actor621: s3 + Owner: Scrin + SubCell: 3 + Location: 41,35 + Facing: 800 + Actor622: s3 + Owner: Scrin + SubCell: 3 + Location: 35,32 + Facing: 927 + Actor623: s3 + Owner: Scrin + SubCell: 3 + Location: 21,41 + Facing: 753 + Actor624: s3 + Owner: Scrin + Location: 23,47 + SubCell: 3 + Facing: 666 + Actor625: s3 + Owner: Scrin + SubCell: 3 + Location: 20,19 + Facing: 384 + Actor626: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 9,3 + Actor627: s3 + Owner: Scrin + SubCell: 3 + Location: 14,10 + Facing: 753 + Actor628: s1 + Owner: Scrin + Location: 34,57 + SubCell: 3 + Facing: 674 + Actor629: s1 + Owner: Scrin + SubCell: 3 + Location: 35,55 + Facing: 586 + Actor630: s1 + Owner: Scrin + SubCell: 3 + Location: 34,60 + Facing: 904 + Actor631: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 32,50 + Actor632: s1 + Owner: Scrin + SubCell: 3 + Location: 39,49 + Facing: 563 + Actor633: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 16,72 + Actor634: s1 + Owner: Scrin + Facing: 384 + Location: 16,72 + SubCell: 1 + Actor635: s1 + Owner: Scrin + SubCell: 3 + Location: 13,70 + Facing: 570 + Actor636: s1 + Owner: Scrin + Location: 17,70 + SubCell: 3 + Facing: 713 + SouthAttackRally: waypoint + Owner: Neutral + Location: 40,60 + NorthAttackRally: waypoint + Owner: Neutral + Location: 22,26 + EastAttackRally: waypoint + Owner: Neutral + Location: 47,37 + SouthAttack3: waypoint + Owner: Neutral + Location: 71,55 + EastAttack1: waypoint + Owner: Neutral + Location: 70,41 + NorthAttack1: waypoint + Owner: Neutral + Location: 50,5 + NorthAttack3: waypoint + Owner: Neutral + Location: 73,27 + Actor637: obli + Owner: NodAbandoned + Location: 45,80 + Health: 25 + Actor638: obli + Owner: NodAbandoned + Location: 53,80 + Health: 23 + NodTurret1: waypoint + Owner: Neutral + Location: 80,12 + NodTurret2: waypoint + Owner: Neutral + Location: 86,12 + NorthBaseTopLeft: waypoint + Owner: Neutral + Location: 70,1 + SouthBaseTopLeft: waypoint + Owner: Neutral + Location: 34,75 + SouthBaseBottomRight: waypoint + Owner: Neutral + Location: 68,94 + Actor639: intl.ai2 + Owner: Scrin + Facing: 864 + Location: 47,85 + Actor640: s1 + Owner: Scrin + SubCell: 3 + Location: 49,84 + Facing: 967 + Actor641: s1 + Owner: Scrin + SubCell: 3 + Facing: 896 + Location: 48,85 + Actor642: s1 + Owner: Scrin + SubCell: 1 + Location: 48,85 + Facing: 848 + Actor643: s3 + Owner: Scrin + SubCell: 3 + Facing: 935 + Location: 49,86 + Actor644: corr + Owner: Scrin + Facing: 824 + Location: 40,86 + Actor645: gunw + Owner: Scrin + Facing: 967 + Location: 47,90 + NorthHand: hand + Owner: NodAbandoned + Location: 78,7 + Health: 44 + Actor646: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 81,7 + Actor647: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 80,8 + Actor648: seek + Owner: Scrin + Facing: 705 + Location: 76,6 + NodRally: waypoint + Owner: Neutral + Location: 47,73 + NodAttackLimiter: waypoint + Owner: Neutral + Location: 33,10 + ScrinBaseCenter: waypoint + Owner: Neutral + Location: 32,40 + SouthAttack2b: waypoint + Owner: Neutral + Location: 48,84 + NorthAttack2: waypoint + Owner: Neutral + Location: 81,6 + SouthAttack1: waypoint + Owner: Neutral + Location: 48,73 + SouthAttack2a: waypoint + Owner: Neutral + Location: 74,67 + Actor571: nuke + Owner: NodAbandoned + Health: 16 + Location: 87,2 + NodTurret4: waypoint + Owner: Neutral + Location: 46,78 + NodTurret5: waypoint + Owner: Neutral + Location: 52,78 + Actor649: camera + Owner: Scrin + Location: 83,11 + Actor650: camera + Owner: Scrin + Location: 74,5 + Actor651: camera + Owner: Scrin + Location: 73,32 + Actor652: camera + Owner: Scrin + Location: 69,46 + Actor653: camera + Owner: Scrin + Location: 80,61 + Actor654: camera + Owner: Scrin + Location: 44,77 + Actor655: camera + Owner: Scrin + Location: 63,75 + Actor656: nsam + Owner: NodAbandoned + Location: 75,2 + Health: 36 + NodTurret3: waypoint + Owner: Neutral + Location: 73,3 + Actor612: scol + Owner: Scrin + Location: 74,20 + Actor657: seek + Owner: Scrin + Facing: 384 + Location: 81,21 + NorthBaseBottomRight: waypoint + Owner: Neutral + Location: 91,17 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-doctrines.yaml, ca|missions/main-campaign/ca13-abasement/abasement-rules.yaml, ca|rules/custom/coop-rules.yaml, abasement-coop-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/coop-campaign/ca14-treachery-coop/map.bin b/mods/ca/missions/coop-campaign/ca14-treachery-coop/map.bin new file mode 100644 index 0000000000..b8cd2b4273 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca14-treachery-coop/map.bin differ diff --git a/mods/ca/missions/coop-campaign/ca14-treachery-coop/map.png b/mods/ca/missions/coop-campaign/ca14-treachery-coop/map.png new file mode 100644 index 0000000000..63ef1faeef Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca14-treachery-coop/map.png differ diff --git a/mods/ca/missions/coop-campaign/ca14-treachery-coop/map.yaml b/mods/ca/missions/coop-campaign/ca14-treachery-coop/map.yaml new file mode 100644 index 0000000000..30cbb407e6 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca14-treachery-coop/map.yaml @@ -0,0 +1,3498 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 14: Treachery Co-op + +Author: Darkademic & Gandorques Hikla + +Tileset: WINTER + +MapSize: 98,114 + +Bounds: 1,1,96,112 + +Visibility: Lobby + +Categories: Co-op Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: USSR, Greece, Traitor, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + PlayerReference@USSR: + Name: USSR + Faction: soviet + Color: FE1100 + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Greece, Traitor, Creeps + PlayerReference@Greece: + Name: Greece + Bot: campaign + Faction: allies + Color: 99ACF2 + Allies: Traitor + Enemies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@Traitor: + Name: Traitor + Bot: campaign + Faction: soviet + Color: FF9922 + Allies: Greece + Enemies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@USSRAbandoned: + Name: USSRAbandoned + NonCombatant: True + Faction: soviet + Color: FE1100 + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: FE1100 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Greece, Traitor, Creeps + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: 0B7310 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Greece, Traitor, Creeps + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: 994050 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Greece, Traitor, Creeps + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: 775A12 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Greece, Traitor, Creeps + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: 82C900 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Greece, Traitor, Creeps + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: DD1691 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Greece, Traitor, Creeps + +Actors: + Actor0: fenc + Owner: USSRAbandoned + Location: 38,2 + Actor1: fenc + Owner: USSRAbandoned + Location: 39,2 + Actor2: fenc + Owner: USSRAbandoned + Location: 40,2 + Actor3: fenc + Owner: USSRAbandoned + Location: 41,2 + Actor4: fenc + Owner: USSRAbandoned + Location: 42,2 + Actor5: fenc + Owner: USSRAbandoned + Location: 43,2 + Actor6: t01 + Owner: Neutral + Location: 63,1 + Actor7: t14 + Owner: Neutral + Location: 64,1 + Actor8: fenc + Owner: USSRAbandoned + Location: 37,3 + Actor9: fenc + Owner: USSRAbandoned + Location: 38,3 + AbandonedHelipad: hpad.abandoned + Owner: Neutral + Location: 40,3 + Health: 10 + Actor11: fenc + Owner: USSRAbandoned + Location: 43,3 + Actor12: fenc + Owner: USSRAbandoned + Location: 44,3 + Actor13: t02 + Owner: Neutral + Location: 62,2 + Actor14: t11 + Owner: Neutral + Location: 69,2 + Actor15: t02 + Owner: Neutral + Location: 76,2 + Actor16: e6 + Owner: USSR + SubCell: 3 + Location: 85,3 + Facing: 384 + Actor17: e6 + Owner: USSR + SubCell: 3 + Location: 87,3 + Facing: 384 + Actor18: fenc + Owner: USSRAbandoned + Location: 37,4 + Actor19: fenc + Owner: USSRAbandoned + Location: 44,4 + Actor20: fenc + Owner: USSRAbandoned + Location: 37,5 + AbandonedHalo: halo + Owner: Neutral + Location: 42,5 + Health: 7 + Facing: 384 + Actor22: fenc + Owner: USSRAbandoned + Location: 44,5 + Boris: bori + Owner: USSR + SubCell: 3 + Location: 86,5 + Facing: 384 + PlayerStart: waypoint + Owner: Neutral + Location: 86,5 + Actor25: v04 + Owner: Neutral + Location: 70,6 + Actor26: t13 + Owner: Neutral + Location: 72,5 + Actor27: tc04 + Owner: Neutral + Faction: russia + Location: 42,7 + Actor28: t11 + Owner: Neutral + Faction: russia + Location: 53,7 + Actor29: t15 + Owner: Neutral + Faction: russia + Location: 55,8 + Actor30: t17 + Owner: Neutral + Location: 75,8 + Actor31: t16 + Owner: Neutral + Location: 81,8 + Actor32: t13 + Owner: Neutral + Location: 85,10 + Actor33: t06 + Owner: Neutral + Location: 92,10 + Actor34: t11 + Owner: Neutral + Location: 72,11 + Actor35: t16 + Owner: Neutral + Faction: russia + Location: 52,13 + Actor36: t01 + Owner: Neutral + Location: 91,13 + Actor37: t13 + Owner: Neutral + Faction: russia + Location: 61,14 + Actor38: t14 + Owner: Neutral + Location: 87,14 + Actor39: t12 + Owner: Neutral + Faction: russia + Location: 56,15 + Actor40: t17 + Owner: Neutral + Faction: russia + Location: 52,16 + Actor41: t17 + Owner: Neutral + Location: 94,16 + Actor42: t06 + Owner: Neutral + Location: 24,21 + Actor43: brik + Owner: USSRAbandoned + Location: 13,43 + Health: 24 + Actor44: brik + Owner: USSRAbandoned + Location: 19,43 + Actor45: brik + Owner: USSRAbandoned + Location: 13,44 + Actor46: brik + Owner: USSRAbandoned + Location: 12,43 + Actor47: brik + Owner: USSRAbandoned + Location: 12,44 + Health: 22 + Actor48: brik + Owner: USSRAbandoned + Location: 19,44 + Actor49: brik + Owner: USSRAbandoned + Location: 20,43 + Actor50: brik + Owner: USSRAbandoned + Location: 20,44 + Health: 17 + Actor51: brik + Owner: USSRAbandoned + Location: 11,43 + Health: 41 + Actor52: brik + Owner: USSRAbandoned + Location: 10,43 + Health: 56 + Actor53: brik + Owner: USSRAbandoned + Location: 9,43 + Health: 59 + Actor54: brik + Owner: USSRAbandoned + Location: 8,43 + Actor55: brik + Owner: USSRAbandoned + Location: 7,43 + Actor56: brik + Owner: USSRAbandoned + Location: 6,43 + Actor57: brik + Owner: USSRAbandoned + Location: 6,44 + Actor58: brik + Owner: USSRAbandoned + Location: 21,43 + Actor59: brik + Owner: USSRAbandoned + Location: 22,43 + Actor60: brik + Owner: USSRAbandoned + Location: 23,43 + Health: 46 + Actor61: brik + Owner: USSRAbandoned + Location: 24,43 + Actor62: brik + Owner: USSRAbandoned + Location: 25,43 + Health: 74 + Actor63: brik + Owner: USSRAbandoned + Location: 26,43 + Health: 21 + Actor64: brik + Owner: USSRAbandoned + Location: 26,44 + Actor65: brik + Owner: USSRAbandoned + Location: 26,45 + Health: 31 + Actor66: brik + Owner: USSRAbandoned + Location: 26,50 + Actor67: brik + Owner: USSRAbandoned + Location: 26,49 + Health: 55 + Actor68: brik + Owner: USSRAbandoned + Location: 26,48 + Actor69: brik + Owner: USSRAbandoned + Location: 26,47 + Actor70: brik + Owner: USSRAbandoned + Location: 26,46 + Actor71: brik + Owner: USSRAbandoned + Location: 26,51 + Actor72: brik + Owner: USSRAbandoned + Location: 26,52 + Actor73: brik + Owner: USSRAbandoned + Location: 25,52 + Health: 74 + Actor74: brik + Owner: USSRAbandoned + Location: 25,51 + Actor75: brik + Owner: USSRAbandoned + Location: 6,52 + Actor76: brik + Owner: USSRAbandoned + Location: 6,51 + Health: 34 + Actor77: brik + Owner: USSRAbandoned + Location: 6,49 + Actor78: brik + Owner: USSRAbandoned + Location: 6,47 + Actor79: brik + Owner: USSRAbandoned + Location: 6,46 + Health: 45 + Actor80: brik + Owner: USSRAbandoned + Location: 6,45 + Actor81: brik + Owner: USSRAbandoned + Location: 6,48 + Actor82: brik + Owner: USSRAbandoned + Location: 6,50 + Actor83: brik + Owner: USSRAbandoned + Location: 7,52 + Actor84: brik + Owner: USSRAbandoned + Location: 7,51 + Actor85: brik + Owner: USSRAbandoned + Location: 6,56 + Health: 79 + Actor86: brik + Owner: USSRAbandoned + Location: 7,56 + Health: 31 + Actor87: brik + Owner: USSRAbandoned + Location: 6,57 + Actor88: brik + Owner: USSRAbandoned + Location: 7,57 + Health: 41 + Actor89: brik + Owner: USSRAbandoned + Location: 26,56 + Actor90: brik + Owner: USSRAbandoned + Location: 25,56 + Health: 68 + Actor91: brik + Owner: USSRAbandoned + Location: 25,57 + Actor92: brik + Owner: USSRAbandoned + Location: 26,57 + Actor93: brik + Owner: USSRAbandoned + Location: 6,58 + Actor94: brik + Owner: USSRAbandoned + Location: 6,59 + Actor95: brik + Owner: USSRAbandoned + Location: 6,61 + Actor96: brik + Owner: USSRAbandoned + Location: 6,60 + Actor97: brik + Owner: USSRAbandoned + Location: 6,62 + Health: 63 + Actor98: brik + Owner: USSRAbandoned + Location: 6,63 + Actor99: brik + Owner: USSRAbandoned + Location: 7,63 + Actor100: brik + Owner: USSRAbandoned + Location: 8,63 + Actor101: brik + Owner: USSRAbandoned + Location: 9,63 + Health: 65 + Actor102: brik + Owner: USSRAbandoned + Location: 10,63 + Health: 53 + Actor103: brik + Owner: USSRAbandoned + Location: 13,62 + Actor104: brik + Owner: USSRAbandoned + Location: 13,63 + Actor105: brik + Owner: USSRAbandoned + Location: 12,63 + Actor106: brik + Owner: USSRAbandoned + Location: 11,63 + Health: 37 + Actor107: brik + Owner: USSRAbandoned + Location: 12,62 + Actor108: brik + Owner: USSRAbandoned + Location: 19,62 + Actor109: brik + Owner: USSRAbandoned + Location: 19,63 + Actor110: brik + Owner: USSRAbandoned + Location: 20,63 + Actor111: brik + Owner: USSRAbandoned + Location: 20,62 + Health: 34 + Actor112: brik + Owner: USSRAbandoned + Location: 21,63 + Health: 70 + Actor113: brik + Owner: USSRAbandoned + Location: 23,63 + Health: 79 + Actor114: brik + Owner: USSRAbandoned + Location: 22,63 + Actor115: brik + Owner: USSRAbandoned + Location: 25,63 + Actor116: brik + Owner: USSRAbandoned + Location: 24,63 + Health: 64 + Actor117: brik + Owner: USSRAbandoned + Location: 26,63 + Health: 37 + Actor118: brik + Owner: USSRAbandoned + Location: 26,62 + Health: 32 + Actor119: brik + Owner: USSRAbandoned + Location: 26,61 + Health: 13 + Actor120: brik + Owner: USSRAbandoned + Location: 26,59 + Actor121: brik + Owner: USSRAbandoned + Location: 26,58 + Health: 48 + Actor122: brik + Owner: USSRAbandoned + Location: 26,60 + Actor123: apwr + Owner: USSRAbandoned + Location: 7,44 + Health: 17 + Actor124: apwr + Owner: USSRAbandoned + Location: 7,47 + Health: 35 + Actor125: weap + Owner: USSRAbandoned + Location: 20,56 + Health: 37 + Actor130: barr + Owner: USSRAbandoned + Location: 19,51 + Health: 26 + Actor131: tsla + Owner: USSRAbandoned + Location: 21,62 + Health: 30 + Actor132: tsla + Owner: USSRAbandoned + Location: 25,58 + Health: 38 + Actor133: tsla + Owner: USSRAbandoned + Location: 25,50 + Health: 48 + Actor134: tsla + Owner: USSRAbandoned + Location: 11,62 + Health: 15 + Actor135: ftur + Owner: USSRAbandoned + Location: 19,64 + Health: 17 + Actor136: ftur + Owner: USSRAbandoned + Location: 13,64 + Health: 20 + Actor137: ftur + Owner: USSRAbandoned + Location: 27,56 + Health: 29 + Actor138: ftur + Owner: USSRAbandoned + Location: 27,52 + Health: 41 + Actor140: apwr + Owner: USSRAbandoned + Location: 7,59 + Health: 46 + Actor141: apwr + Owner: USSRAbandoned + Location: 9,55 + Health: 31 + Actor142: sam + Owner: USSRAbandoned + Location: 23,61 + Health: 35 + Actor143: sam + Owner: USSRAbandoned + Location: 23,45 + Health: 27 + Actor144: proc + Owner: USSRAbandoned + Location: 19,46 + FreeActor: False + FreeActor@CHARV: False + Health: 24 + Actor146: kenn + Owner: USSRAbandoned + Location: 22,52 + Health: 31 + Actor145: silo + Owner: USSRAbandoned + Location: 19,46 + Health: 9 + Actor147: silo + Owner: USSRAbandoned + Location: 21,46 + Health: 11 + Actor149: fix + Owner: USSRAbandoned + Location: 15,56 + Health: 41 + Actor150: apwr + Owner: USSRAbandoned + Location: 9,51 + Health: 23 + AbandonedAirfield: afld + Owner: USSRAbandoned + Location: 14,52 + Health: 34 + Actor152: sbag + Owner: Greece + Location: 46,29 + Actor153: sbag + Owner: Greece + Location: 47,29 + Actor154: sbag + Owner: Greece + Location: 48,29 + Actor155: sbag + Owner: Greece + Location: 46,30 + Actor156: sbag + Owner: Greece + Location: 46,31 + Actor157: sbag + Owner: Greece + Location: 47,31 + Actor158: sbag + Owner: Greece + Location: 48,31 + Actor159: sbag + Owner: Greece + Location: 48,30 + Actor160: sbag + Owner: Greece + Location: 37,29 + Actor161: sbag + Owner: Greece + Location: 37,30 + Actor162: sbag + Owner: Greece + Location: 37,31 + Actor163: sbag + Owner: Greece + Location: 38,31 + Actor164: sbag + Owner: Greece + Location: 39,31 + Actor165: sbag + Owner: Greece + Location: 38,29 + Actor166: sbag + Owner: Greece + Location: 39,29 + Actor167: sbag + Owner: Greece + Location: 39,30 + Actor168: sbag + Owner: Greece + Location: 55,22 + Actor169: sbag + Owner: Greece + Location: 54,22 + Actor170: sbag + Owner: Greece + Location: 53,22 + Actor171: sbag + Owner: Greece + Location: 53,23 + Actor172: sbag + Owner: Greece + Location: 53,24 + Actor173: sbag + Owner: Greece + Location: 54,24 + Actor174: sbag + Owner: Greece + Location: 55,24 + Actor175: sbag + Owner: Greece + Location: 55,23 + Actor176: agun + Owner: Greece + Location: 54,23 + TurretFacing: 111 + Actor177: agun + Owner: Greece + Location: 47,30 + TurretFacing: 1007 + Actor178: agun + Owner: Greece + Location: 38,30 + TurretFacing: 166 + Actor179: sbag + Owner: Greece + Location: 69,20 + Actor180: sbag + Owner: Greece + Location: 70,20 + Actor181: sbag + Owner: Greece + Location: 71,20 + Actor182: sbag + Owner: Greece + Location: 69,21 + Actor183: agun + Owner: Greece + Location: 70,21 + TurretFacing: 79 + Actor184: sbag + Owner: Greece + Location: 71,21 + Actor185: sbag + Owner: Greece + Location: 69,22 + Actor186: sbag + Owner: Greece + Location: 70,22 + Actor187: sbag + Owner: Greece + Location: 71,22 + Actor188: sbag + Owner: Greece + Location: 83,18 + Actor189: sbag + Owner: Greece + Location: 84,18 + Actor190: sbag + Owner: Greece + Location: 85,18 + Actor191: sbag + Owner: Greece + Location: 83,19 + Actor192: agun + Owner: Greece + Location: 84,19 + Health: 93 + TurretFacing: 71 + Actor193: sbag + Owner: Greece + Location: 85,19 + Actor194: sbag + Owner: Greece + Location: 83,20 + Actor195: sbag + Owner: Greece + Location: 84,20 + Actor196: sbag + Owner: Greece + Location: 85,20 + Actor197: sbag + Owner: Greece + Location: 24,31 + Actor198: sbag + Owner: Greece + Location: 25,31 + Actor199: sbag + Owner: Greece + Location: 26,31 + Actor200: sbag + Owner: Greece + Location: 24,32 + Actor201: agun + Owner: Greece + TurretFacing: 166 + Location: 25,32 + Actor202: sbag + Owner: Greece + Location: 26,32 + Actor203: sbag + Owner: Greece + Location: 24,33 + Actor204: sbag + Owner: Greece + Location: 25,33 + Actor205: sbag + Owner: Greece + Location: 26,33 + Actor206: pbox + Owner: Greece + Location: 66,15 + Actor207: pbox + Owner: Greece + Location: 41,13 + Actor210: pbox + Owner: Greece + Location: 46,28 + Actor208: pbox + Owner: Greece + Location: 39,28 + Actor209: apc.ai + Owner: Greece + Location: 43,30 + Facing: 0 + Actor211: 2tnk + Owner: Greece + Location: 41,29 + Facing: 0 + Actor212: 2tnk + Owner: Greece + Facing: 0 + Location: 44,29 + Actor213: split2 + Owner: Neutral + Location: 30,46 + Actor214: split2 + Owner: Neutral + Location: 35,52 + Actor215: split2 + Owner: Neutral + Location: 26,40 + Actor216: t13 + Owner: Neutral + Location: 6,5 + Actor217: tc02 + Owner: Neutral + Location: 5,1 + Actor218: tc05 + Owner: Neutral + Location: 0,1 + Actor219: tc04 + Owner: Neutral + Location: 1,7 + Actor220: t14 + Owner: Neutral + Location: 1,5 + Actor221: t05 + Owner: Neutral + Location: 1,4 + Actor222: t02 + Owner: Neutral + Location: 3,0 + Actor223: t06 + Owner: Neutral + Location: 1,18 + Actor224: t08 + Owner: Neutral + Location: 1,11 + Actor225: t02 + Owner: Neutral + Location: 10,7 + Actor226: t11 + Owner: Neutral + Location: 10,4 + Actor227: t15 + Owner: Neutral + Location: 20,11 + Actor228: v02 + Owner: Neutral + Location: 13,12 + Actor229: v03 + Owner: Neutral + Location: 6,16 + Actor230: v05 + Owner: Neutral + Location: 5,13 + Actor231: v01 + Owner: Neutral + Location: 16,15 + Actor232: v07 + Owner: Neutral + Location: 11,21 + Actor233: v06 + Owner: Neutral + Location: 19,22 + Actor234: v18 + Owner: Neutral + Location: 18,20 + Actor235: v18 + Owner: Neutral + Location: 20,20 + Actor236: v17 + Owner: Neutral + Location: 19,20 + Actor237: wood + Owner: Neutral + Location: 17,20 + Actor238: wood + Owner: Neutral + Location: 17,19 + Actor239: wood + Owner: Neutral + Location: 18,19 + Actor240: wood + Owner: Neutral + Location: 19,19 + Actor241: wood + Owner: Neutral + Location: 20,19 + Actor242: wood + Owner: Neutral + Location: 21,19 + Actor243: wood + Owner: Neutral + Location: 21,20 + Actor244: wood + Owner: Neutral + Location: 21,21 + Actor245: wood + Owner: Neutral + Location: 20,21 + Actor246: wood + Owner: Neutral + Location: 21,22 + Actor247: wood + Owner: Neutral + Location: 21,23 + Actor248: wood + Owner: Neutral + Location: 20,23 + Actor249: wood + Owner: Neutral + Location: 19,21 + Actor250: wood + Owner: Neutral + Location: 20,24 + Actor251: wood + Owner: Neutral + Location: 19,24 + Actor252: c4 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 16,20 + Actor253: c3 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 18,23 + Actor254: tecn + Owner: Neutral + SubCell: 3 + Facing: 384 + Location: 5,17 + Actor255: c9 + Owner: Neutral + SubCell: 3 + Facing: 384 + Location: 6,15 + Actor256: c6 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 19,15 + Actor257: c10 + Owner: Neutral + SubCell: 3 + Facing: 384 + Location: 16,17 + Actor258: c8 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 4,21 + Actor259: brl3 + Owner: Creeps + Location: 67,16 + Actor260: barl + Owner: Creeps + Location: 67,15 + Actor261: sbag + Owner: Greece + Location: 67,43 + Actor262: sbag + Owner: Greece + Location: 68,43 + Actor263: sbag + Owner: Greece + Location: 69,43 + Actor264: sbag + Owner: Greece + Location: 67,44 + Actor265: agun + Owner: Greece + TurretFacing: 79 + Location: 68,44 + Actor266: sbag + Owner: Greece + Location: 69,44 + Actor267: sbag + Owner: Greece + Location: 67,45 + Actor268: sbag + Owner: Greece + Location: 68,45 + Actor269: sbag + Owner: Greece + Location: 69,45 + Actor270: sbag + Owner: Greece + Location: 90,27 + Actor271: sbag + Owner: Greece + Location: 91,27 + Actor272: sbag + Owner: Greece + Location: 92,27 + Actor273: sbag + Owner: Greece + Location: 90,28 + Actor274: agun + Owner: Greece + Health: 93 + TurretFacing: 71 + Location: 91,28 + Actor275: sbag + Owner: Greece + Location: 92,28 + Actor276: sbag + Owner: Greece + Location: 90,29 + Actor277: sbag + Owner: Greece + Location: 91,29 + Actor278: sbag + Owner: Greece + Location: 92,29 + Actor285: sbag + Owner: Greece + Location: 62,34 + Actor286: sbag + Owner: Greece + Location: 62,35 + Actor287: sbag + Owner: Greece + Location: 63,35 + Actor288: sbag + Owner: Greece + Location: 63,36 + Actor289: sbag + Owner: Greece + Location: 63,37 + Actor290: sbag + Owner: Greece + Location: 63,38 + Actor291: sbag + Owner: Greece + Location: 63,39 + Actor292: sbag + Owner: Greece + Location: 64,39 + Actor293: sbag + Owner: Greece + Location: 65,39 + Actor294: sbag + Owner: Greece + Location: 66,39 + Actor295: sbag + Owner: Greece + Location: 63,34 + Actor296: sbag + Owner: Greece + Location: 64,34 + Actor297: sbag + Owner: Greece + Location: 64,33 + Actor298: sbag + Owner: Greece + Location: 65,33 + Actor299: sbag + Owner: Greece + Location: 66,33 + Actor300: sbag + Owner: Greece + Location: 66,32 + Actor301: sbag + Owner: Greece + Location: 66,31 + Actor302: sbag + Owner: Greece + Location: 67,31 + Actor303: sbag + Owner: Greece + Location: 67,30 + Actor304: sbag + Owner: Greece + Location: 67,29 + Actor305: sbag + Owner: Greece + Location: 68,29 + Actor306: sbag + Owner: Greece + Location: 69,29 + Actor307: sbag + Owner: Greece + Location: 69,30 + Actor308: sbag + Owner: Greece + Location: 70,30 + Actor309: sbag + Owner: Greece + Location: 71,30 + Actor310: sbag + Owner: Greece + Location: 72,30 + Actor311: sbag + Owner: Greece + Location: 68,30 + Actor312: sbag + Owner: Greece + Location: 73,30 + Actor313: sbag + Owner: Greece + Location: 74,30 + Actor314: sbag + Owner: Greece + Location: 75,30 + Actor315: sbag + Owner: Greece + Location: 67,39 + Actor316: sbag + Owner: Greece + Location: 68,39 + Actor317: sbag + Owner: Greece + Location: 69,39 + Actor318: sbag + Owner: Greece + Location: 70,39 + Actor319: sbag + Owner: Greece + Location: 71,39 + Actor320: sbag + Owner: Greece + Location: 71,39 + Actor321: sbag + Owner: Greece + Location: 72,39 + Actor322: sbag + Owner: Greece + Location: 72,40 + Actor323: sbag + Owner: Greece + Location: 72,41 + Actor324: sbag + Owner: Greece + Location: 73,41 + Actor325: sbag + Owner: Greece + Location: 73,42 + Actor326: sbag + Owner: Greece + Location: 73,43 + Actor327: sbag + Owner: Greece + Location: 73,44 + Actor328: sbag + Owner: Greece + Location: 74,44 + Actor329: sbag + Owner: Greece + Location: 76,44 + Actor330: sbag + Owner: Greece + Location: 75,44 + Actor331: sbag + Owner: Greece + Location: 77,44 + Actor332: sbag + Owner: Greece + Location: 78,44 + Actor333: sbag + Owner: Greece + Location: 83,42 + Actor334: sbag + Owner: Greece + Location: 83,41 + Actor335: sbag + Owner: Greece + Location: 83,40 + Actor336: sbag + Owner: Greece + Location: 83,39 + Actor337: sbag + Owner: Greece + Location: 84,39 + Actor338: sbag + Owner: Greece + Location: 84,38 + Actor339: sbag + Owner: Greece + Location: 84,37 + Actor340: sbag + Owner: Greece + Location: 84,32 + Actor341: sbag + Owner: Greece + Location: 84,31 + Actor342: sbag + Owner: Greece + Location: 83,31 + Actor343: sbag + Owner: Greece + Location: 83,30 + Actor344: sbag + Owner: Greece + Location: 84,33 + Actor345: sbag + Owner: Greece + Location: 83,27 + Actor346: sbag + Owner: Greece + Location: 83,28 + Actor347: sbag + Owner: Greece + Location: 83,29 + Actor348: sbag + Owner: Greece + Location: 82,27 + Actor349: sbag + Owner: Greece + Location: 82,26 + Actor350: sbag + Owner: Greece + Location: 81,26 + Actor351: sbag + Owner: Greece + Location: 80,26 + Actor352: sbag + Owner: Greece + Location: 79,26 + Actor353: sbag + Owner: Greece + Location: 78,26 + Actor354: sbag + Owner: Greece + Location: 78,26 + Actor355: sbag + Owner: Greece + Location: 78,27 + Actor356: sbag + Owner: Greece + Location: 77,27 + Actor357: sbag + Owner: Greece + Location: 77,28 + Actor358: sbag + Owner: Greece + Location: 77,29 + Actor359: sbag + Owner: Greece + Location: 76,29 + Actor360: sbag + Owner: Greece + Location: 75,29 + Actor367: hpad + Owner: Greece + Location: 64,36 + Actor368: hpad + Owner: Greece + Location: 67,36 + Actor369: hpad + Owner: Greece + Location: 70,36 + Actor366: dome + Owner: Greece + Location: 76,30 + Actor371: pbox + Owner: Greece + Location: 79,45 + Actor372: pbox + Owner: Greece + Location: 84,43 + Actor373: pbox + Owner: Greece + Location: 85,37 + HardOnlyTurret5: gun + Owner: Greece + Location: 81,43 + TurretFacing: 618 + Actor374: pbox + Owner: Greece + Location: 85,32 + HardOnlyTurret4: gun + Owner: Greece + Location: 83,35 + TurretFacing: 808 + Actor377: brik + Owner: Greece + Location: 38,98 + Actor378: brik + Owner: Greece + Location: 38,99 + Actor379: brik + Owner: Greece + Location: 39,98 + Actor380: brik + Owner: Greece + Location: 39,99 + Actor381: brik + Owner: Greece + Location: 38,100 + Actor382: brik + Owner: Greece + Location: 38,101 + Actor383: brik + Owner: Greece + Location: 38,102 + Actor384: brik + Owner: Greece + Location: 39,102 + Actor385: brik + Owner: Greece + Location: 39,101 + Actor386: brik + Owner: Greece + Location: 38,106 + Actor387: brik + Owner: Greece + Location: 39,106 + Actor388: brik + Owner: Greece + Location: 38,107 + Actor389: brik + Owner: Greece + Location: 39,107 + Actor390: brik + Owner: Greece + Location: 38,108 + Actor391: brik + Owner: Greece + Location: 38,109 + Actor392: brik + Owner: Greece + Location: 38,110 + Actor393: brik + Owner: Greece + Location: 38,111 + Actor394: brik + Owner: Greece + Location: 38,112 + Actor395: brik + Owner: Greece + Location: 38,112 + Actor396: brik + Owner: Greece + Location: 39,111 + Actor397: brik + Owner: Greece + Location: 39,112 + Actor398: brik + Owner: Greece + Location: 60,92 + Actor399: brik + Owner: Greece + Location: 61,92 + Actor400: brik + Owner: Greece + Location: 60,93 + Actor401: brik + Owner: Greece + Location: 61,93 + Actor402: brik + Owner: Greece + Location: 61,95 + Actor403: brik + Owner: Greece + Location: 61,94 + Actor404: brik + Owner: Greece + Location: 60,96 + Actor405: brik + Owner: Greece + Location: 61,96 + Actor406: brik + Owner: Greece + Location: 60,97 + Actor407: brik + Owner: Greece + Location: 61,97 + Actor408: brik + Owner: Greece + Location: 61,102 + Actor409: brik + Owner: Greece + Location: 61,101 + Actor410: brik + Owner: Greece + Location: 60,101 + Actor411: brik + Owner: Greece + Location: 60,102 + Actor412: brik + Owner: Greece + Location: 61,103 + Actor413: brik + Owner: Greece + Location: 61,105 + Actor414: brik + Owner: Greece + Location: 61,104 + Actor415: brik + Owner: Greece + Location: 61,106 + Actor416: brik + Owner: Greece + Location: 61,107 + Actor417: brik + Owner: Greece + Location: 61,108 + Actor418: brik + Owner: Greece + Location: 61,109 + Actor419: brik + Owner: Greece + Location: 60,111 + Actor420: brik + Owner: Greece + Location: 61,110 + Actor421: brik + Owner: Greece + Location: 61,111 + Actor422: brik + Owner: Greece + Location: 61,112 + Actor423: brik + Owner: Greece + Location: 60,112 + Actor424: brik + Owner: Greece + Location: 40,112 + Actor425: brik + Owner: Greece + Location: 41,112 + Actor426: brik + Owner: Greece + Location: 42,112 + Actor427: brik + Owner: Greece + Location: 43,112 + Actor428: brik + Owner: Greece + Location: 44,112 + Actor429: brik + Owner: Greece + Location: 45,112 + Actor430: brik + Owner: Greece + Location: 46,112 + Actor431: brik + Owner: Greece + Location: 47,112 + Actor432: brik + Owner: Greece + Location: 48,112 + Actor433: brik + Owner: Greece + Location: 51,112 + Actor434: brik + Owner: Greece + Location: 49,112 + Actor435: brik + Owner: Greece + Location: 50,112 + Actor436: brik + Owner: Greece + Location: 52,112 + Actor437: brik + Owner: Greece + Location: 54,112 + Actor438: brik + Owner: Greece + Location: 53,112 + Actor439: brik + Owner: Greece + Location: 55,112 + Actor440: brik + Owner: Greece + Location: 56,112 + Actor441: brik + Owner: Greece + Location: 57,112 + Actor442: brik + Owner: Greece + Location: 57,112 + Actor443: brik + Owner: Greece + Location: 58,112 + Actor444: brik + Owner: Greece + Location: 59,112 + Actor445: sbag + Owner: Greece + Location: 45,78 + Actor446: sbag + Owner: Greece + Location: 45,77 + Actor447: sbag + Owner: Greece + Location: 46,78 + Actor448: sbag + Owner: Greece + Location: 47,78 + Actor449: sbag + Owner: Greece + Location: 48,78 + Actor450: sbag + Owner: Greece + Location: 49,78 + Actor451: sbag + Owner: Greece + Location: 57,76 + Actor452: sbag + Owner: Greece + Location: 57,76 + Actor453: sbag + Owner: Greece + Location: 55,76 + Actor454: sbag + Owner: Greece + Location: 56,76 + Actor455: sbag + Owner: Greece + Location: 57,75 + Actor456: sbag + Owner: Greece + Location: 57,74 + Actor457: sbag + Owner: Greece + Location: 58,74 + Actor458: sbag + Owner: Greece + Location: 58,73 + Actor459: sbag + Owner: Greece + Location: 58,72 + Actor460: sbag + Owner: Greece + Location: 58,71 + Actor461: sbag + Owner: Greece + Location: 58,70 + Actor462: sbag + Owner: Greece + Location: 59,70 + Actor463: sbag + Owner: Greece + Location: 45,76 + Actor464: sbag + Owner: Greece + Location: 45,75 + Actor465: sbag + Owner: Greece + Location: 45,74 + Actor466: sbag + Owner: Greece + Location: 45,74 + Actor467: sbag + Owner: Greece + Location: 45,70 + Actor468: sbag + Owner: Greece + Location: 45,69 + Actor469: sbag + Owner: Greece + Location: 45,68 + Actor470: sbag + Owner: Greece + Location: 45,67 + Actor471: sbag + Owner: Greece + Location: 45,66 + Actor472: sbag + Owner: Greece + Location: 45,65 + Actor473: sbag + Owner: Greece + Location: 47,65 + Actor474: sbag + Owner: Greece + Location: 46,65 + Actor475: sbag + Owner: Greece + Location: 48,65 + Actor476: sbag + Owner: Greece + Location: 49,65 + Actor477: sbag + Owner: Greece + Location: 50,65 + Actor478: sbag + Owner: Greece + Location: 55,65 + Actor479: sbag + Owner: Greece + Location: 56,65 + Actor480: sbag + Owner: Greece + Location: 58,65 + Actor481: sbag + Owner: Greece + Location: 57,65 + Actor482: sbag + Owner: Greece + Location: 59,65 + Actor483: sbag + Owner: Greece + Location: 59,66 + Actor484: sbag + Owner: Greece + Location: 59,69 + Actor485: syrd + Owner: Greece + Location: 51,79 + Actor486: fact + Owner: Greece + Location: 49,107 + Actor488: dome + Owner: Greece + Location: 54,108 + Actor491: apwr + Owner: Greece + Location: 58,108 + Actor493: apwr + Owner: Greece + Location: 58,105 + Actor494: apwr + Owner: Greece + Location: 54,104 + Actor495: apwr + Owner: Greece + Location: 49,103 + Actor496: apwr + Owner: Greece + Location: 49,100 + Actor498: apwr + Owner: Greece + Location: 46,92 + Actor499: apwr + Owner: Greece + Location: 54,91 + Actor497: powr + Owner: Greece + Location: 44,92 + Actor500: powr + Owner: Greece + Location: 49,92 + AlliedSouthBarracks: tent + Owner: Greece + Location: 55,100 + Actor503: fix + Owner: Greece + Location: 47,96 + Actor504: pris + Owner: Greece + Location: 39,100 + Actor505: pris + Owner: Greece + Location: 39,108 + Actor506: pris + Owner: Greece + Location: 60,95 + Actor507: pris + Owner: Greece + Location: 60,103 + Actor508: gun + Owner: Greece + Location: 37,101 + Actor509: gun + Owner: Greece + Location: 37,107 + Actor510: gun + Owner: Greece + Location: 37,107 + Actor511: gun + Owner: Greece + Location: 62,102 + Actor512: gun + Owner: Greece + Location: 62,96 + HardOnlyTurret1: gun + Owner: Greece + Location: 23,97 + TurretFacing: 192 + HardOnlyTurret2: gun + Owner: Greece + Location: 16,97 + TurretFacing: 192 + Actor515: pbox + Owner: Greece + Location: 14,82 + Actor516: pbox + Owner: Greece + Location: 20,100 + Actor517: agun + Owner: Greece + Location: 41,97 + Actor518: agun + Owner: Greece + Location: 52,93 + Actor519: agun + Owner: Greece + Location: 59,92 + Actor520: agun + Owner: Greece + Location: 39,110 + Actor521: agun + Owner: Greece + Location: 58,102 + TraitorGeneral: gnrl + Owner: Traitor + Location: 46,104 + SubCell: 3 + Facing: 499 + Bodyguard2: shok + Owner: Traitor + SubCell: 3 + Location: 45,105 + Facing: 384 + Bodyguard1: shok + Owner: Traitor + SubCell: 3 + Location: 47,105 + Facing: 586 + HardOnlyTeslaCoil: tsla + Owner: Traitor + Location: 46,66 + Actor534: tsla + Owner: Traitor + Location: 80,42 + Actor535: ftur + Owner: Traitor + Location: 23,81 + AlliedSouthFactory: weap + Owner: Greece + Location: 56,95 + Actor537: proc + Owner: Greece + Location: 52,95 + Actor538: proc + Owner: Greece + Location: 54,68 + Actor539: gun + Owner: Greece + Location: 49,64 + TurretFacing: 192 + Actor541: gun + Owner: Greece + Location: 44,75 + Actor543: agun + Owner: Greece + Location: 57,66 + Actor544: agun + Owner: Greece + Location: 48,66 + Actor545: tent + Owner: Greece + Location: 48,68 + Actor546: powr + Owner: Greece + Location: 46,75 + Actor547: powr + Owner: Greece + Location: 48,75 + Actor548: powr + Owner: Greece + Location: 55,73 + Actor549: apwr + Owner: Greece + Location: 51,73 + Actor552: powr + Owner: Greece + Location: 73,38 + Actor553: powr + Owner: Greece + Location: 74,41 + Actor554: tent + Owner: Greece + Location: 77,38 + Actor555: 3tnk + Owner: Traitor + Location: 80,47 + Facing: 634 + Actor557: 3tnk + Owner: Traitor + Location: 35,100 + Facing: 253 + Actor559: 3tnk + Owner: Traitor + Location: 63,94 + Facing: 753 + Actor561: v2rl + Owner: Traitor + Location: 59,93 + Facing: 650 + Actor562: e2 + Owner: Traitor + SubCell: 3 + Location: 37,102 + Facing: 384 + Actor564: e2 + Owner: Traitor + SubCell: 3 + Location: 63,93 + Facing: 785 + Actor565: e2 + Owner: Traitor + Facing: 384 + Location: 80,43 + SubCell: 3 + Actor566: e1 + Owner: Traitor + Location: 81,42 + SubCell: 3 + Facing: 384 + Actor567: e1 + Owner: Traitor + Facing: 384 + SubCell: 3 + Location: 84,44 + Actor568: e1 + Owner: Traitor + SubCell: 3 + Location: 63,103 + Facing: 880 + Actor569: e1 + Owner: Traitor + Location: 63,103 + SubCell: 1 + Facing: 0 + Actor570: e1 + Owner: Traitor + Facing: 384 + SubCell: 3 + Location: 40,101 + Actor571: e1 + Owner: Traitor + SubCell: 3 + Location: 48,102 + Facing: 793 + Actor572: e1 + Owner: Traitor + Facing: 384 + SubCell: 3 + Location: 35,99 + Actor573: e1 + Owner: Traitor + SubCell: 3 + Location: 36,108 + Facing: 182 + Actor574: e1 + Owner: Traitor + Facing: 384 + SubCell: 3 + Location: 24,81 + Actor575: e1 + Owner: Traitor + Location: 14,81 + SubCell: 3 + Facing: 31 + Actor576: e1 + Owner: Traitor + SubCell: 3 + Location: 51,64 + Facing: 0 + Actor577: e1 + Owner: Traitor + SubCell: 3 + Location: 43,73 + Facing: 222 + Actor578: e1 + Owner: Traitor + Location: 44,73 + SubCell: 3 + Facing: 253 + Actor579: e2 + Owner: Traitor + SubCell: 3 + Location: 45,72 + Facing: 150 + Actor580: e3 + Owner: Traitor + SubCell: 3 + Location: 50,67 + Facing: 237 + Actor581: e3 + Owner: Traitor + Facing: 384 + SubCell: 3 + Location: 58,92 + Actor582: split2 + Owner: Neutral + Location: 65,67 + Actor583: split2 + Owner: Neutral + Location: 72,65 + Actor586: split2 + Owner: Neutral + Location: 68,105 + Actor587: v2rl + Owner: Traitor + Location: 40,98 + Facing: 301 + Actor588: e1 + Owner: Greece + SubCell: 3 + Location: 51,106 + Facing: 0 + Actor589: e1 + Owner: Greece + SubCell: 3 + Location: 52,111 + Facing: 618 + Actor590: e1 + Owner: Greece + SubCell: 3 + Location: 56,107 + Facing: 904 + Actor591: e3 + Owner: Greece + Location: 53,108 + SubCell: 3 + Facing: 610 + Actor592: e3 + Owner: Greece + SubCell: 3 + Location: 59,111 + Facing: 808 + Actor593: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 44,96 + Actor594: e3 + Owner: Greece + SubCell: 3 + Location: 41,111 + Facing: 642 + Actor584: split2 + Owner: Neutral + Location: 71,101 + Actor585: split2 + Owner: Neutral + Location: 75,102 + Actor597: e3 + Owner: Traitor + SubCell: 3 + Facing: 384 + Location: 6,37 + Actor598: e3 + Owner: Traitor + Facing: 384 + Location: 7,36 + SubCell: 3 + Actor599: e3 + Owner: Traitor + Facing: 384 + SubCell: 3 + Location: 12,35 + Actor600: e3 + Owner: Traitor + Facing: 384 + SubCell: 3 + Location: 3,39 + Actor601: e3 + Owner: Greece + SubCell: 3 + Location: 27,32 + Facing: 0 + Actor602: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 36,31 + Actor603: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 33,33 + Actor604: e3 + Owner: Greece + Location: 49,31 + SubCell: 3 + Facing: 689 + Actor605: e3 + Owner: Greece + SubCell: 3 + Location: 56,24 + Facing: 23 + Actor606: e3 + Owner: Greece + SubCell: 3 + Location: 61,23 + Facing: 0 + Actor607: e3 + Owner: Greece + SubCell: 3 + Location: 76,18 + Facing: 0 + Actor608: e3 + Owner: Greece + SubCell: 3 + Location: 89,22 + Facing: 0 + Actor609: e3 + Owner: Greece + Location: 82,20 + SubCell: 3 + Facing: 158 + Actor612: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 65,34 + Actor613: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 62,30 + Actor614: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 53,39 + Actor615: sbag + Owner: Greece + Location: 90,61 + Actor616: sbag + Owner: Greece + Location: 91,61 + Actor617: sbag + Owner: Greece + Location: 92,61 + Actor618: sbag + Owner: Greece + Location: 90,62 + Actor619: agun + Owner: Greece + Health: 93 + TurretFacing: 71 + Location: 91,62 + Actor620: sbag + Owner: Greece + Location: 92,62 + Actor621: sbag + Owner: Greece + Location: 90,63 + Actor622: sbag + Owner: Greece + Location: 91,63 + Actor623: sbag + Owner: Greece + Location: 92,63 + Actor624: sbag + Owner: Greece + Location: 26,97 + Actor625: sbag + Owner: Greece + Location: 27,97 + Actor626: sbag + Owner: Greece + Location: 28,97 + Actor627: sbag + Owner: Greece + Location: 26,98 + Actor628: agun + Owner: Greece + Health: 93 + TurretFacing: 71 + Location: 27,98 + Actor629: sbag + Owner: Greece + Location: 28,98 + Actor630: sbag + Owner: Greece + Location: 26,99 + Actor631: sbag + Owner: Greece + Location: 27,99 + Actor632: sbag + Owner: Greece + Location: 28,99 + Actor633: sbag + Owner: Greece + Location: 36,80 + Actor634: sbag + Owner: Greece + Location: 37,80 + Actor635: sbag + Owner: Greece + Location: 38,80 + Actor636: sbag + Owner: Greece + Location: 36,81 + Actor637: agun + Owner: Greece + Health: 93 + TurretFacing: 71 + Location: 37,81 + Actor638: sbag + Owner: Greece + Location: 38,81 + Actor639: sbag + Owner: Greece + Location: 36,82 + Actor640: sbag + Owner: Greece + Location: 37,82 + Actor641: sbag + Owner: Greece + Location: 38,82 + Actor660: tc04 + Owner: Neutral + Location: 95,45 + Actor662: t16 + Owner: Neutral + Location: 96,40 + Actor663: t17 + Owner: Neutral + Location: 96,41 + Actor664: t10 + Owner: Neutral + Location: 95,42 + Actor665: t12 + Owner: Neutral + Location: 95,44 + Actor661: t05 + Owner: Neutral + Location: 96,43 + Actor666: tc05 + Owner: Neutral + Location: 90,47 + Actor667: tc02 + Owner: Neutral + Location: 93,53 + Actor668: t16 + Owner: Neutral + Location: 89,52 + Actor669: t10 + Owner: Neutral + Location: 86,56 + Actor670: t11 + Owner: Neutral + Location: 93,59 + Actor671: t14 + Owner: Neutral + Location: 79,55 + Actor672: t13 + Owner: Neutral + Location: 73,52 + Actor673: t15 + Owner: Neutral + Location: 64,57 + Actor674: t11 + Owner: Neutral + Location: 50,54 + Actor675: t07 + Owner: Neutral + Location: 57,59 + Actor676: t02 + Owner: Neutral + Location: 45,54 + Actor681: sbag + Owner: Greece + Location: 87,94 + Actor682: sbag + Owner: Greece + Location: 88,94 + Actor683: sbag + Owner: Greece + Location: 89,94 + Actor684: sbag + Owner: Greece + Location: 87,95 + Actor685: agun + Owner: Greece + Health: 93 + TurretFacing: 71 + Location: 88,95 + Actor686: sbag + Owner: Greece + Location: 89,95 + Actor687: sbag + Owner: Greece + Location: 87,96 + Actor688: sbag + Owner: Greece + Location: 88,96 + Actor689: sbag + Owner: Greece + Location: 89,96 + Actor677: tc05 + Owner: Neutral + Location: 92,110 + Actor678: tc03 + Owner: Neutral + Location: 93,104 + Actor679: t14 + Owner: Neutral + Location: 86,105 + Actor680: t14 + Owner: Neutral + Location: 86,105 + Actor690: t16 + Owner: Neutral + Location: 83,95 + Actor691: tc01 + Owner: Neutral + Location: 82,107 + Actor692: t16 + Owner: Neutral + Location: 76,108 + Actor693: t14 + Owner: Neutral + Location: 79,111 + Actor694: t11 + Owner: Neutral + Location: 84,64 + Actor695: t16 + Owner: Neutral + Location: 83,65 + Actor696: t05 + Owner: Neutral + Location: 19,77 + Actor697: tc01 + Owner: Neutral + Location: 17,78 + Actor698: tc03 + Owner: Neutral + Location: 20,74 + Actor700: tc04 + Owner: Neutral + Location: 31,74 + Actor701: tc05 + Owner: Neutral + Location: 39,78 + Actor702: tc02 + Owner: Neutral + Location: 34,73 + Actor703: t14 + Owner: Neutral + Location: 33,74 + Actor704: t10 + Owner: Neutral + Location: 29,75 + Actor705: t16 + Owner: Neutral + Location: 30,77 + Actor706: t05 + Owner: Neutral + Location: 34,76 + Actor707: t13 + Owner: Neutral + Location: 32,65 + Actor708: t05 + Owner: Neutral + Location: 29,61 + Actor709: t10 + Owner: Neutral + Location: 10,75 + Actor710: t13 + Owner: Neutral + Location: 42,50 + Actor711: t16 + Owner: Neutral + Location: 39,40 + Actor712: t10 + Owner: Neutral + Location: 37,43 + Actor713: t13 + Owner: Neutral + Location: 52,35 + Actor714: tc04 + Owner: Neutral + Location: 56,44 + Actor715: t15 + Owner: Neutral + Location: 54,46 + Actor716: t10 + Owner: Neutral + Location: 62,46 + Actor717: t13 + Owner: Neutral + Location: 63,27 + Actor718: t06 + Owner: Neutral + Location: 66,24 + Actor719: t01 + Owner: Neutral + Location: 78,20 + Actor720: t12 + Owner: Neutral + Location: 55,28 + Actor721: tc02 + Owner: Neutral + Location: 94,21 + Actor722: tc05 + Owner: Neutral + Location: 92,25 + Actor723: tc03 + Owner: Neutral + Location: 93,28 + Actor724: tc03 + Owner: Neutral + Location: 93,28 + Actor725: t14 + Owner: Neutral + Location: 94,31 + Actor726: t17 + Owner: Neutral + Location: 30,67 + Actor727: tc05 + Owner: Neutral + Location: 4,98 + Actor728: tc02 + Owner: Neutral + Location: 3,96 + Actor729: tc03 + Owner: Neutral + Location: 7,98 + Actor730: tc02 + Owner: Neutral + Location: 4,108 + Actor731: tc01 + Owner: Neutral + Location: 2,100 + Actor732: tc04 + Owner: Neutral + Location: 1,104 + Actor733: t15 + Owner: Neutral + Location: 3,106 + Actor734: t17 + Owner: Neutral + Location: 6,107 + Actor735: t14 + Owner: Neutral + Location: 1,107 + Actor736: t11 + Owner: Neutral + Location: 2,102 + Actor737: t13 + Owner: Neutral + Location: 1,98 + Actor738: t08 + Owner: Neutral + Location: 3,98 + Actor740: ice05 + Owner: Neutral + Location: 38,89 + Actor742: ice04 + Owner: Neutral + Location: 60,84 + Actor743: ice05 + Owner: Neutral + Location: 94,71 + Actor745: ice03 + Owner: Neutral + Location: 63,74 + Actor746: ice04 + Owner: Neutral + Location: 35,95 + Actor747: t13 + Owner: Neutral + Location: 22,102 + Actor748: split2 + Owner: Neutral + Location: 27,109 + Actor749: split2 + Owner: Neutral + Location: 12,103 + Actor750: tc02 + Owner: Neutral + Location: 9,111 + Actor751: tc03 + Owner: Neutral + Location: 7,69 + Actor752: ttra + Owner: Traitor + Facing: 384 + Location: 40,102 + Actor753: ttra + Owner: Traitor + Location: 65,101 + Facing: 880 + Actor755: 1tnk + Owner: Greece + Location: 25,80 + Facing: 111 + Actor756: 2tnk + Owner: Greece + Location: 55,62 + Facing: 118 + Actor757: 2tnk + Owner: Greece + Location: 83,45 + Facing: 626 + Actor758: 2tnk + Owner: Greece + Location: 34,107 + Facing: 261 + Actor759: gap + Owner: Greece + Location: 41,107 + Actor760: gap + Owner: Greece + Location: 58,104 + HardOnlyGapGenerator: gap + Owner: Greece + Location: 76,42 + Actor762: dd + Owner: Greece + Location: 25,92 + Facing: 261 + Actor763: dd + Owner: Greece + Location: 26,89 + Facing: 261 + Actor764: dd + Owner: Greece + Location: 13,93 + Facing: 761 + Actor766: dd + Owner: Greece + Location: 90,73 + Facing: 285 + Actor768: dd + Owner: Greece + Location: 79,74 + Facing: 745 + Actor770: pt + Owner: Greece + Location: 79,78 + Facing: 761 + Actor771: pt + Owner: Greece + Location: 89,80 + Facing: 277 + Actor772: dd + Owner: Greece + Facing: 384 + Location: 47,82 + Actor773: dd + Owner: Greece + Location: 59,79 + Facing: 880 + Actor774: pt + Owner: Greece + Facing: 384 + Location: 52,83 + Actor775: e1 + Owner: Greece + SubCell: 3 + Location: 15,82 + Facing: 896 + Actor776: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 20,81 + Actor777: e1 + Owner: Greece + Facing: 384 + Location: 29,76 + SubCell: 1 + Actor778: e1 + Owner: Greece + Facing: 384 + Location: 30,68 + SubCell: 1 + Actor779: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 37,42 + Actor780: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 39,44 + Actor781: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 46,45 + Actor782: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 47,52 + Actor783: e1 + Owner: Greece + SubCell: 3 + Location: 68,46 + Facing: 491 + Actor784: e1 + Owner: Greece + SubCell: 3 + Location: 66,45 + Facing: 261 + Actor785: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 55,25 + Actor786: e1 + Owner: Greece + SubCell: 3 + Location: 70,23 + Facing: 222 + Actor787: e1 + Owner: Greece + Facing: 384 + Location: 82,20 + SubCell: 1 + Actor788: e1 + Owner: Greece + SubCell: 3 + Location: 84,21 + Facing: 384 + Actor789: e1 + Owner: Greece + Location: 92,30 + SubCell: 3 + Facing: 618 + Actor790: e1 + Owner: Greece + SubCell: 3 + Location: 90,22 + Facing: 384 + Actor791: e1 + Owner: Greece + SubCell: 3 + Location: 89,62 + Facing: 0 + Actor792: e1 + Owner: Greece + SubCell: 3 + Location: 87,64 + Facing: 222 + Actor793: e1 + Owner: Greece + SubCell: 3 + Location: 78,47 + Facing: 578 + Actor794: e1 + Owner: Greece + SubCell: 3 + Location: 77,48 + Facing: 384 + Actor795: e1 + Owner: Greece + SubCell: 3 + Location: 85,44 + Facing: 642 + Actor796: e1 + Owner: Greece + Location: 57,64 + SubCell: 3 + Facing: 87 + Actor797: e1 + Owner: Greece + SubCell: 3 + Location: 54,65 + Facing: 0 + Actor798: e1 + Owner: Greece + Location: 44,72 + SubCell: 3 + Facing: 158 + Actor799: e1 + Owner: Greece + SubCell: 3 + Location: 43,76 + Facing: 245 + Actor800: e1 + Owner: Greece + Facing: 384 + Location: 44,68 + SubCell: 3 + Actor801: e1 + Owner: Greece + SubCell: 3 + Location: 58,62 + Facing: 237 + Actor802: e1 + Owner: Greece + SubCell: 3 + Location: 37,99 + Facing: 384 + Actor803: e1 + Owner: Greece + Location: 37,99 + SubCell: 1 + Facing: 245 + Actor806: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 34,101 + Actor807: e1 + Owner: Greece + SubCell: 3 + Location: 33,107 + Facing: 134 + Actor808: e1 + Owner: Greece + Facing: 384 + Location: 41,111 + SubCell: 1 + Actor809: e1 + Owner: Greece + SubCell: 3 + Location: 50,95 + Facing: 384 + Actor810: e1 + Owner: Greece + SubCell: 3 + Location: 64,95 + Facing: 785 + Actor811: e1 + Owner: Greece + Location: 63,92 + SubCell: 3 + Facing: 642 + Actor812: e1 + Owner: Greece + Location: 64,101 + SubCell: 3 + Facing: 872 + Actor813: e1 + Owner: Greece + Location: 62,101 + SubCell: 3 + Facing: 753 + Actor814: e1 + Owner: Greece + SubCell: 3 + Location: 62,97 + Facing: 785 + Actor815: 3tnk + Owner: Traitor + Facing: 777 + Location: 63,97 + Actor816: e2 + Owner: Traitor + SubCell: 3 + Location: 62,98 + Facing: 769 + Actor817: 3tnk + Owner: Traitor + Facing: 245 + Location: 35,109 + Actor804: e1 + Owner: Greece + Location: 36,110 + SubCell: 3 + Facing: 190 + Actor805: e1 + Owner: Greece + SubCell: 3 + Location: 25,99 + Facing: 126 + Actor818: e1 + Owner: Greece + Location: 25,99 + SubCell: 1 + Facing: 158 + Actor819: e1 + Owner: Greece + SubCell: 3 + Location: 18,100 + Facing: 0 + Actor820: e1 + Owner: Greece + SubCell: 3 + Location: 15,99 + Facing: 856 + Actor821: e1 + Owner: Greece + Location: 15,99 + SubCell: 1 + Facing: 0 + Actor822: e1 + Owner: Greece + SubCell: 3 + Location: 25,97 + Facing: 0 + Actor823: e3 + Owner: Greece + Location: 17,100 + SubCell: 3 + Facing: 39 + Actor824: e3 + Owner: Greece + SubCell: 3 + Location: 23,98 + Facing: 190 + Actor825: e3 + Owner: Greece + Location: 35,81 + SubCell: 3 + Facing: 142 + Actor826: e1 + Owner: Greece + Location: 37,79 + SubCell: 3 + Facing: 0 + Actor827: e1 + Owner: Greece + Location: 14,81 + SubCell: 1 + Facing: 0 + Actor828: e1 + Owner: Greece + SubCell: 3 + Location: 13,81 + Facing: 0 + Actor831: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 27,71 + Actor832: e1 + Owner: Greece + SubCell: 3 + Location: 51,35 + Facing: 384 + Actor833: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 45,30 + Actor834: e1 + Owner: Greece + SubCell: 3 + Location: 47,28 + Facing: 63 + Actor835: e1 + Owner: Greece + Location: 47,28 + SubCell: 1 + Facing: 158 + Actor836: e1 + Owner: Greece + SubCell: 3 + Location: 37,28 + Facing: 0 + Actor837: e1 + Owner: Greece + SubCell: 3 + Location: 39,27 + Facing: 0 + Actor838: e1 + Owner: Greece + SubCell: 3 + Location: 48,26 + Facing: 134 + Actor839: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 40,31 + Actor840: e1 + Owner: Greece + SubCell: 3 + Location: 37,32 + Facing: 539 + Actor841: e1 + Owner: Greece + Location: 57,24 + SubCell: 3 + Facing: 658 + Actor842: e1 + Owner: Greece + SubCell: 3 + Location: 75,6 + Facing: 713 + Actor843: e1 + Owner: Greece + SubCell: 3 + Location: 78,11 + Facing: 808 + Actor845: e1 + Owner: Greece + SubCell: 3 + Location: 72,9 + Facing: 872 + Actor846: e1 + Owner: Greece + SubCell: 3 + Location: 69,7 + Facing: 507 + Actor847: e1 + Owner: Greece + SubCell: 3 + Location: 65,14 + Facing: 0 + Actor848: e1 + Owner: Greece + SubCell: 3 + Location: 62,17 + Facing: 753 + Actor850: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 52,13 + Actor851: e1 + Owner: Greece + SubCell: 3 + Location: 55,15 + Facing: 705 + Actor849: e1 + Owner: Greece + SubCell: 3 + Location: 58,9 + Facing: 499 + Actor852: e1 + Owner: Greece + SubCell: 3 + Location: 49,9 + Facing: 697 + Actor853: e1 + Owner: Greece + SubCell: 3 + Location: 39,13 + Facing: 800 + Actor854: e1 + Owner: Greece + Location: 39,13 + SubCell: 1 + Facing: 483 + Actor855: e1 + Owner: Greece + SubCell: 3 + Location: 41,11 + Health: 68 + Facing: 745 + Actor856: e1 + Owner: Greece + SubCell: 3 + Location: 37,11 + Facing: 808 + Actor857: e1 + Owner: Greece + SubCell: 3 + Location: 42,18 + Facing: 0 + Actor858: e1 + Owner: Greece + SubCell: 3 + Location: 35,14 + Facing: 491 + Actor859: e3 + Owner: Greece + SubCell: 3 + Location: 33,10 + Facing: 586 + Actor860: e3 + Owner: Greece + SubCell: 3 + Location: 65,16 + Facing: 753 + Actor861: e3 + Owner: Greece + SubCell: 3 + Location: 66,8 + Facing: 682 + Actor862: e3 + Owner: Greece + SubCell: 3 + Location: 75,12 + Facing: 384 + Actor844: e1 + Owner: Greece + SubCell: 3 + Location: 45,27 + Facing: 0 + Actor863: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 90,31 + Actor864: e1 + Owner: Greece + Location: 88,63 + SubCell: 3 + Facing: 118 + Actor865: e1 + Owner: Greece + SubCell: 3 + Location: 84,84 + Facing: 118 + Actor866: e1 + Owner: Greece + Location: 84,84 + SubCell: 1 + Facing: 0 + Actor867: e1 + Owner: Greece + SubCell: 3 + Location: 89,86 + Facing: 0 + Actor868: e1 + Owner: Greece + SubCell: 3 + Location: 79,87 + Facing: 864 + Actor869: e1 + Owner: Greece + SubCell: 3 + Location: 78,83 + Facing: 935 + Actor870: e1 + Owner: Greece + SubCell: 3 + Location: 86,88 + Facing: 0 + Actor871: ptnk + Owner: Greece + Location: 36,111 + Facing: 253 + Actor872: ptnk + Owner: Greece + Location: 62,91 + Facing: 761 + Actor873: e1 + Owner: Greece + SubCell: 3 + Location: 66,110 + Facing: 745 + Actor874: e1 + Owner: Greece + SubCell: 3 + Location: 73,111 + Facing: 0 + Actor875: e1 + Owner: Greece + SubCell: 3 + Location: 78,109 + Facing: 888 + Actor876: e1 + Owner: Greece + SubCell: 3 + Location: 81,110 + Facing: 713 + Actor877: e1 + Owner: Greece + SubCell: 3 + Location: 12,14 + Facing: 0 + Actor878: e1 + Owner: Greece + SubCell: 3 + Location: 14,16 + Facing: 206 + Actor880: e1 + Owner: Greece + SubCell: 3 + Location: 7,18 + Facing: 507 + Actor881: e1 + Owner: Greece + SubCell: 3 + Location: 15,21 + Facing: 158 + Actor882: e1 + Owner: Greece + SubCell: 3 + Location: 5,25 + Facing: 761 + Actor883: e3 + Owner: Greece + SubCell: 3 + Location: 17,24 + Facing: 832 + Actor884: e3 + Owner: Greece + SubCell: 3 + Location: 8,16 + Facing: 959 + Actor885: e1 + Owner: Greece + SubCell: 3 + Location: 11,24 + Facing: 0 + Actor886: e1 + Owner: Greece + SubCell: 3 + Location: 20,35 + Facing: 0 + HardOnlyMGG: mgg + Owner: Greece + Location: 52,69 + Facing: 384 + Actor888: jeep + Owner: Greece + Facing: 384 + Location: 27,72 + Actor889: jeep + Owner: Greece + Facing: 384 + Location: 54,37 + Actor890: jeep + Owner: Greece + Location: 88,62 + Facing: 142 + Actor891: arty + Owner: Greece + Location: 76,43 + Facing: 384 + Actor892: arty + Owner: Greece + Location: 66,38 + Facing: 384 + Actor894: arty + Owner: Greece + Location: 25,98 + Facing: 15 + Actor895: arty + Owner: Greece + Location: 91,84 + Facing: 158 + Actor896: rtnk + Owner: Greece + Location: 48,60 + Facing: 261 + Actor897: rtnk + Owner: Greece + Location: 46,48 + Facing: 245 + Actor898: pcan + Owner: Greece + Location: 43,95 + Facing: 384 + Actor900: pbox + Owner: Greece + Location: 88,84 + Actor901: pbox + Owner: Greece + Location: 81,84 + HardOnlyTurret3: gun + Owner: Greece + Location: 85,84 + TurretFacing: 0 + Actor903: gun + Owner: Greece + Location: 88,64 + Actor904: gun + Owner: Greece + Location: 14,33 + TurretFacing: 192 + Actor905: gun + Owner: Greece + Location: 80,67 + Actor906: pbox + Owner: Greece + Location: 89,67 + Actor907: ifv + Owner: Greece + Location: 18,101 + Facing: 0 + Actor909: ifv + Owner: Greece + Location: 90,66 + Facing: 126 + Actor910: 1tnk + Owner: Greece + Location: 11,73 + Facing: 904 + Actor911: apc.ai + Owner: Greece + Facing: 384 + Location: 66,51 + Actor912: apc.ai + Owner: Greece + Facing: 384 + Location: 67,53 + Actor913: 2tnk + Owner: Greece + Location: 86,77 + Facing: 0 + Actor914: 2tnk + Owner: Greece + Location: 19,89 + Facing: 0 + Actor915: cryo + Owner: Greece + Location: 60,94 + Facing: 761 + HardOnlyCryoLauncher: cryo + Owner: Greece + Location: 75,39 + Facing: 523 + Actor917: rtnk + Owner: Greece + Location: 70,89 + Facing: 904 + Actor919: apc.ai + Owner: Greece + Location: 72,92 + Facing: 927 + Actor918: rtnk + Owner: Greece + Facing: 904 + Location: 73,88 + Actor920: e1 + Owner: Greece + SubCell: 3 + Facing: 745 + Location: 64,112 + AbandonedBaseTopLeft: waypoint + Owner: Neutral + Location: 5,42 + AbandonedBaseBottomRight: waypoint + Owner: Neutral + Location: 27,64 + Actor922: e1 + Owner: Greece + SubCell: 3 + Location: 59,19 + Facing: 150 + Actor923: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 55,8 + Actor924: e1 + Owner: Greece + SubCell: 3 + Location: 43,16 + Facing: 555 + AbandonedBaseCenter: waypoint + Owner: Neutral + Location: 16,50 + SouthAttackRally: waypoint + Owner: Neutral + Location: 20,104 + EastAttackRally: waypoint + Owner: Neutral + Location: 83,86 + EastAttack1: waypoint + Owner: Neutral + Location: 82,58 + Actor926: waypoint + Owner: Neutral + Location: 82,58 + EastAttack2: waypoint + Owner: Neutral + Location: 55,56 + EastAttack3b: waypoint + Owner: Neutral + Location: 32,38 + EastAttack3a: waypoint + Owner: Neutral + Location: 31,54 + SouthAttack1: waypoint + Owner: Neutral + Location: 16,66 + Actor925: tsla + Owner: Traitor + Location: 53,101 + Actor928: e1 + Owner: Greece + SubCell: 3 + Facing: 745 + Location: 72,112 + Actor929: e1 + Owner: Greece + SubCell: 3 + Facing: 745 + Location: 77,111 + Actor921: e1 + Owner: Greece + SubCell: 3 + Facing: 745 + Location: 70,111 + Actor930: camera + Owner: Greece + Location: 16,61 + Actor931: camera + Owner: Greece + Location: 26,54 + Actor932: camera + Owner: Greece + Location: 16,45 + Actor933: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 13,20 + Actor934: e1 + Owner: Greece + SubCell: 3 + Facing: 507 + Location: 3,23 + TraitorGeneralSafePoint: waypoint + Owner: Neutral + Location: 42,99 + Actor937: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 79,85 + Actor938: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 95,98 + Actor939: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 53,37 + Actor940: e1 + Owner: Greece + Facing: 384 + Location: 68,53 + SubCell: 3 + Actor941: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 67,52 + Actor942: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 66,49 + Actor943: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 74,52 + Actor944: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 86,56 + Actor945: e1 + Owner: Greece + Facing: 384 + Location: 91,47 + SubCell: 3 + Actor946: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 39,7 + Actor947: e3 + Owner: Greece + SubCell: 3 + Facing: 586 + Location: 37,6 + Actor948: e3 + Owner: Greece + SubCell: 3 + Location: 9,10 + Facing: 872 + TraitorTechCenter: stek + Owner: Traitor + Location: 79,27 + Actor950: ss + Owner: Traitor + Location: 42,87 + Facing: 888 + Actor951: ss + Owner: Traitor + Facing: 384 + Location: 72,76 + Actor952: v2rl + Owner: Traitor + Location: 81,30 + Facing: 594 + Actor953: dome + Owner: USSRAbandoned + Location: 11,46 + Health: 46 + Actor954: dd + Owner: Greece + Facing: 777 + Location: 13,88 + Actor956: pt + Owner: Greece + Facing: 285 + Location: 31,90 + Cruiser: ca + Owner: Greece + Location: 6,91 + Facing: 777 + CruiserPatrol1: waypoint + Owner: Neutral + Location: 6,91 + CruiserPatrol2: waypoint + Owner: Neutral + Location: 38,91 + CruiserPatrol3: waypoint + Owner: Neutral + Location: 41,88 + CruiserPatrol4: waypoint + Owner: Neutral + Location: 44,88 + CruiserPatrol5: waypoint + Owner: Neutral + Location: 46,86 + CruiserPatrol6: waypoint + Owner: Neutral + Location: 55,86 + CruiserPatrol7: waypoint + Owner: Neutral + Location: 64,77 + CruiserPatrol8: waypoint + Owner: Neutral + Location: 91,77 + Actor949: hosp + Owner: Neutral + Location: 46,22 + Actor955: e3 + Owner: Greece + Facing: 384 + Location: 44,96 + SubCell: 1 + Actor957: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 49,94 + Actor958: e3 + Owner: Greece + Facing: 384 + Location: 19,108 + Actor959: e3 + Owner: Greece + Facing: 384 + Location: 52,101 + SubCell: 3 + Actor960: e3 + Owner: Greece + Facing: 384 + Location: 40,99 + SubCell: 3 + Actor962: barr + Owner: USSRAbandoned + Location: 14,47 + Health: 44 + TraitorConyard: fact + Owner: Traitor + Location: 68,31 + Actor961: afld + Owner: Traitor + Location: 72,31 + Actor965: afld + Owner: Traitor + Location: 72,33 + Actor963: powr + Owner: Greece + Location: 76,34 + Actor966: split2 + Owner: Neutral + Location: 20,38 + Actor967: split2 + Owner: Neutral + Location: 9,39 + Actor935: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 13,35 + Actor936: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 23,34 + Actor968: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 24,35 + Actor969: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 18,41 + Actor970: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 14,41 + TraitorHQ: fcom + Owner: Traitor + Location: 45,102 + TraitorBarracks: barr + Owner: Traitor + Location: 42,102 + TraitorFactory: weap + Owner: Traitor + Location: 43,98 + Actor964: atek + Owner: Greece + Location: 42,108 + Actor973: apwr + Owner: Greece + Location: 45,108 + TraitorHQSpawn: waypoint + Owner: Neutral + Location: 45,103 + GuardsReveal1: waypoint + Owner: Neutral + Location: 43,28 + ReinforcementsSpawn: waypoint + Owner: Neutral + Location: 15,1 + ReinforcementsDestination: waypoint + Owner: Neutral + Location: 15,10 + Actor974: pbox + Owner: Greece + Location: 56,64 + Actor975: pbox + Owner: Greece + Location: 44,69 + TraitorTechCenterFlare: waypoint + Owner: Neutral + Location: 80,29 + Actor976: silo + Owner: Traitor + Location: 82,28 + Actor977: silo + Owner: Traitor + Location: 82,29 + Actor978: silo + Owner: Traitor + Location: 78,29 + Actor979: silo + Owner: Traitor + Location: 78,28 + EastParadrop1: waypoint + Owner: Neutral + Location: 84,34 + Actor980: e3 + Owner: Traitor + Facing: 384 + SubCell: 3 + Location: 71,31 + Actor981: powr + Owner: Greece + Location: 79,32 + TraitorSAM2: sam + Owner: Traitor + Location: 80,39 + TraitorSAM1: sam + Owner: Traitor + Location: 80,36 + EastParadrop3: waypoint + Owner: Neutral + Location: 70,35 + EastParadrop2: waypoint + Owner: Neutral + Location: 77,37 + Actor982: ptnk + Owner: Greece + Facing: 0 + Location: 20,106 + Actor983: 4tnk + Owner: Traitor + Location: 24,106 + Facing: 118 + Actor971: oilb + Owner: Neutral + Location: 5,66 + Actor972: oilb + Owner: Neutral + Location: 34,60 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-doctrines.yaml, ca|missions/main-campaign/ca14-treachery/treachery-rules.yaml, ca|rules/custom/coop-rules.yaml, treachery-coop-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/coop-campaign/ca14-treachery-coop/treachery-coop-rules.yaml b/mods/ca/missions/coop-campaign/ca14-treachery-coop/treachery-coop-rules.yaml new file mode 100644 index 0000000000..2dfb1a49ca --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca14-treachery-coop/treachery-coop-rules.yaml @@ -0,0 +1,25 @@ +World: + LuaScript: + Scripts: campaign.lua, coop.lua, ca|missions/main-campaign/ca14-treachery/treachery.lua, treachery-coop.lua + ScriptLobbyDropdown@basesharing: + Values: + -0: + Default: 1 + Locked: True + LobbyMissionInfo@InitialObjectives: + Prefix: Initial Objectives + Text: • [Optional] Take control of the abandoned Soviet base.\n• Locate and kill General Yegerov. + +BORI: + TooltipExtras: + Description: Elite commando infantry armed with a high-powered assault rifle. + +BORI.Clone: + Inherits: BORI + RenderSprites: + Image: boris + Selectable: + Class: bori + -Encyclopedia: + Tooltip: + Name: Boris Clone diff --git a/mods/ca/missions/coop-campaign/ca14-treachery-coop/treachery-coop.lua b/mods/ca/missions/coop-campaign/ca14-treachery-coop/treachery-coop.lua new file mode 100644 index 0000000000..b466f58796 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca14-treachery-coop/treachery-coop.lua @@ -0,0 +1,57 @@ + +SetupPlayers = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Multi2 = Player.GetPlayer("Multi2") + Multi3 = Player.GetPlayer("Multi3") + Multi4 = Player.GetPlayer("Multi4") + Multi5 = Player.GetPlayer("Multi5") + USSR = Player.GetPlayer("USSR") + Greece = Player.GetPlayer("Greece") + Traitor = Player.GetPlayer("Traitor") + USSRAbandoned = Player.GetPlayer("USSRAbandoned") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = Utils.Where({ Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 }, function(p) return p ~= nil end) + MissionEnemies = { Greece, Traitor } + SinglePlayerPlayer = USSR + StopSpread = true + CoopInit() +end + +AfterWorldLoaded = function() + StartCashSpread(2000) + local engineers = USSR.GetActorsByType("e6") + local firstActivePlayer = GetFirstActivePlayer() + Boris.Owner = firstActivePlayer + engineers[1].Owner = firstActivePlayer + + if #MissionPlayers > 1 then + engineers[2].Owner = MissionPlayers[2] + end + + local x = 88 + Utils.Do(MissionPlayers, function(p) + if p ~= firstActivePlayer then + local loc = CPos.New(x, 4) + Actor.Create("bori.clone", true, { Owner = p, Location = loc, Facing = Angle.South }) + x = x - 2 + end + end) +end + +AfterTick = function() + +end + +TransferAbandonedBase = function() + local baseBuildings = Map.ActorsInBox(AbandonedBaseTopLeft.CenterPosition, AbandonedBaseBottomRight.CenterPosition, function(a) + return a.Owner == USSRAbandoned + end) + + Utils.Do(baseBuildings, function(a) + a.Owner = GetFirstActivePlayer() + end) + + CACoopQueueSyncer() + StopSpread = false +end diff --git a/mods/ca/missions/coop-campaign/ca15-ironclad-coop/ironclad-coop-rules.yaml b/mods/ca/missions/coop-campaign/ca15-ironclad-coop/ironclad-coop-rules.yaml new file mode 100644 index 0000000000..17c7f211d8 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca15-ironclad-coop/ironclad-coop-rules.yaml @@ -0,0 +1,11 @@ +World: + LuaScript: + Scripts: campaign.lua, coop.lua, ca|missions/main-campaign/ca15-ironclad/ironclad.lua, ironclad-coop.lua + ScriptLobbyDropdown@basesharing: + Values: + -0: + Default: 1 + Locked: True + LobbyMissionInfo@InitialObjectives: + Prefix: Initial Objectives + Text: • Restore power and break the siege.\n• Destroy all Allied & GDI forces. \ No newline at end of file diff --git a/mods/ca/missions/coop-campaign/ca15-ironclad-coop/ironclad-coop.lua b/mods/ca/missions/coop-campaign/ca15-ironclad-coop/ironclad-coop.lua new file mode 100644 index 0000000000..3d8dce0d79 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca15-ironclad-coop/ironclad-coop.lua @@ -0,0 +1,25 @@ + +SetupPlayers = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Multi2 = Player.GetPlayer("Multi2") + Multi3 = Player.GetPlayer("Multi3") + Multi4 = Player.GetPlayer("Multi4") + Multi5 = Player.GetPlayer("Multi5") + USSR = Player.GetPlayer("USSR") + GDI = Player.GetPlayer("GDI") + Greece = Player.GetPlayer("Greece") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = Utils.Where({ Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 }, function(p) return p ~= nil end) + MissionEnemies = { GDI, Greece } + SinglePlayerPlayer = USSR + CoopInit() +end + +AfterWorldLoaded = function() + TransferBaseToPlayer(SinglePlayerPlayer, GetFirstActivePlayer()) +end + +AfterTick = function() + +end diff --git a/mods/ca/missions/coop-campaign/ca15-ironclad-coop/map.bin b/mods/ca/missions/coop-campaign/ca15-ironclad-coop/map.bin new file mode 100644 index 0000000000..612c354c48 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca15-ironclad-coop/map.bin differ diff --git a/mods/ca/missions/coop-campaign/ca15-ironclad-coop/map.png b/mods/ca/missions/coop-campaign/ca15-ironclad-coop/map.png new file mode 100644 index 0000000000..820e8ed955 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca15-ironclad-coop/map.png differ diff --git a/mods/ca/missions/coop-campaign/ca15-ironclad-coop/map.yaml b/mods/ca/missions/coop-campaign/ca15-ironclad-coop/map.yaml new file mode 100644 index 0000000000..e66f2c6166 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca15-ironclad-coop/map.yaml @@ -0,0 +1,3774 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 15: Ironclad Co-op + +Author: Darkademic & Gandorques Hikla + +Tileset: SNOW + +MapSize: 98,130 + +Bounds: 1,1,96,128 + +Visibility: Lobby + +Categories: Co-op Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: USSR, Greece, GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + PlayerReference@USSR: + Name: USSR + Faction: soviet + Color: FE1100 + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Greece, GDI, Creeps + PlayerReference@Greece: + Name: Greece + Bot: campaign + Faction: allies + Color: 99ACF2 + Allies: GDI + Enemies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@GDI: + Name: GDI + Bot: campaign + Faction: gdi + Color: F2CF74 + Allies: Greece + Enemies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: FE1100 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Greece, GDI, Creeps + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: FF9922 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Greece, GDI, Creeps + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: 994050 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Greece, GDI, Creeps + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: 775A12 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Greece, GDI, Creeps + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: 82C900 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Greece, GDI, Creeps + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: DD1691 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Greece, GDI, Creeps + +Actors: + IronCurtain: iron + Owner: USSR + Location: 47,64 + Actor1: chain + Owner: USSR + Location: 47,63 + Actor3: chain + Owner: USSR + Location: 46,63 + Actor4: chain + Owner: USSR + Location: 46,64 + Actor5: chain + Owner: USSR + Location: 46,65 + Actor6: chain + Owner: USSR + Location: 47,65 + Actor7: chain + Owner: USSR + Location: 48,65 + Actor8: chain + Owner: USSR + Location: 49,65 + Actor9: chain + Owner: USSR + Location: 49,64 + Actor10: chain + Owner: USSR + Location: 49,63 + Actor11: chain + Owner: USSR + Location: 48,63 + Actor12: fenc + Owner: USSR + Location: 50,65 + Actor13: fenc + Owner: USSR + Location: 50,64 + Actor14: fenc + Owner: USSR + Location: 50,63 + Actor15: fenc + Owner: USSR + Location: 45,63 + Actor16: fenc + Owner: USSR + Location: 45,64 + Actor17: fenc + Owner: USSR + Location: 45,65 + Actor18: sam + Owner: USSR + Location: 47,60 + Health: 72 + Actor19: sam + Owner: USSR + Location: 47,68 + Health: 79 + Actor20: ftur + Owner: USSR + Location: 44,64 + Health: 93 + Actor21: ftur + Owner: USSR + Location: 51,64 + Health: 93 + Actor29: proc + Owner: USSR + Location: 57,62 + Health: 44 + FreeActor: False + FreeActor@CHARV: False + Actor67: brik + Owner: USSR + Location: 44,54 + Actor68: brik + Owner: USSR + Location: 44,55 + Actor69: brik + Owner: USSR + Location: 45,54 + Actor70: brik + Owner: USSR + Location: 46,54 + Health: 64 + Actor71: brik + Owner: USSR + Location: 47,54 + Actor48: brik + Owner: USSR + Location: 30,54 + Actor49: brik + Owner: USSR + Location: 31,54 + Actor50: brik + Owner: USSR + Location: 32,54 + Actor51: brik + Owner: USSR + Location: 33,54 + Actor52: brik + Owner: USSR + Location: 34,54 + Health: 44 + Actor53: brik + Owner: USSR + Location: 35,54 + Actor57: brik + Owner: USSR + Location: 36,54 + Actor58: brik + Owner: USSR + Location: 37,54 + Actor59: brik + Owner: USSR + Location: 38,54 + Actor60: brik + Owner: USSR + Location: 39,54 + Actor61: brik + Owner: USSR + Location: 40,54 + Actor62: brik + Owner: USSR + Location: 30,55 + Actor63: brik + Owner: USSR + Location: 39,55 + Actor64: brik + Owner: USSR + Location: 40,55 + Actor65: brik + Owner: USSR + Location: 30,56 + Health: 75 + Actor66: brik + Owner: USSR + Location: 30,57 + Actor79: brik + Owner: USSR + Location: 30,58 + Health: 64 + Actor80: brik + Owner: USSR + Location: 30,59 + Actor81: brik + Owner: USSR + Location: 30,60 + Health: 34 + Actor83: brik + Owner: USSR + Location: 30,61 + Actor84: brik + Owner: USSR + Location: 30,62 + Actor85: fact + Owner: USSR + Location: 36,62 + Health: 47 + Actor91: brik + Owner: USSR + Location: 45,55 + Actor72: brik + Owner: USSR + Location: 48,54 + Health: 62 + Actor73: brik + Owner: USSR + Location: 49,54 + Actor74: brik + Owner: USSR + Location: 50,54 + Actor75: brik + Owner: USSR + Location: 51,54 + Health: 77 + Actor76: brik + Owner: USSR + Location: 55,54 + Actor77: brik + Owner: USSR + Location: 56,54 + Actor78: brik + Owner: USSR + Location: 57,54 + Actor92: brik + Owner: USSR + Location: 58,54 + Actor93: brik + Owner: USSR + Location: 58,54 + Actor94: brik + Owner: USSR + Location: 59,54 + Actor95: brik + Owner: USSR + Location: 60,54 + Actor96: brik + Owner: USSR + Location: 61,54 + Actor97: brik + Owner: USSR + Location: 62,54 + Actor100: brik + Owner: USSR + Location: 50,55 + Actor101: brik + Owner: USSR + Location: 51,55 + Actor102: brik + Owner: USSR + Location: 55,55 + Health: 35 + Actor103: brik + Owner: USSR + Location: 56,55 + Actor98: brik + Owner: USSR + Location: 63,54 + Actor99: brik + Owner: USSR + Location: 64,54 + Health: 53 + Actor104: brik + Owner: USSR + Location: 65,54 + Health: 33 + Actor105: brik + Owner: USSR + Location: 65,55 + Actor106: brik + Owner: USSR + Location: 65,56 + Health: 70 + Actor107: brik + Owner: USSR + Location: 65,57 + Actor108: brik + Owner: USSR + Location: 65,58 + Actor109: brik + Owner: USSR + Location: 65,59 + Actor110: brik + Owner: USSR + Location: 65,60 + Actor116: brik + Owner: USSR + Location: 31,62 + Actor117: brik + Owner: USSR + Location: 31,61 + Actor118: brik + Owner: USSR + Location: 31,66 + Actor119: brik + Owner: USSR + Location: 30,66 + Health: 31 + Actor120: brik + Owner: USSR + Location: 30,67 + Health: 11 + Actor121: brik + Owner: USSR + Location: 31,67 + Actor88: brik + Owner: USSR + Location: 64,61 + Health: 17 + Actor89: brik + Owner: USSR + Location: 65,61 + Health: 22 + Actor111: brik + Owner: USSR + Location: 64,62 + Actor112: brik + Owner: USSR + Location: 65,62 + Health: 16 + Actor113: brik + Owner: USSR + Location: 64,66 + Actor114: brik + Owner: USSR + Location: 65,66 + Actor115: brik + Owner: USSR + Location: 64,67 + Actor122: brik + Owner: USSR + Location: 65,67 + Actor123: brik + Owner: USSR + Location: 44,74 + Health: 32 + Actor124: brik + Owner: USSR + Location: 45,74 + Actor125: brik + Owner: USSR + Location: 46,74 + Actor126: brik + Owner: USSR + Location: 47,74 + Health: 65 + Actor127: brik + Owner: USSR + Location: 48,74 + Actor128: brik + Owner: USSR + Location: 49,74 + Actor129: brik + Owner: USSR + Location: 50,74 + Actor130: brik + Owner: USSR + Location: 51,74 + Actor131: brik + Owner: USSR + Location: 44,73 + Actor132: brik + Owner: USSR + Location: 45,73 + Actor133: brik + Owner: USSR + Location: 51,73 + Actor134: brik + Owner: USSR + Location: 50,73 + Actor135: brik + Owner: USSR + Location: 39,73 + Actor136: brik + Owner: USSR + Location: 39,74 + Actor138: brik + Owner: USSR + Location: 38,74 + Health: 73 + Actor139: brik + Owner: USSR + Location: 56,73 + Actor140: brik + Owner: USSR + Location: 40,73 + Actor141: brik + Owner: USSR + Location: 40,74 + Actor137: brik + Owner: USSR + Location: 55,73 + Health: 17 + Actor142: brik + Owner: USSR + Location: 55,74 + Actor143: brik + Owner: USSR + Location: 56,74 + Actor144: brik + Owner: USSR + Location: 57,74 + Actor145: brik + Owner: USSR + Location: 65,68 + Health: 73 + Actor146: brik + Owner: USSR + Location: 65,69 + Health: 51 + Actor147: brik + Owner: USSR + Location: 65,70 + Actor148: brik + Owner: USSR + Location: 65,71 + Actor149: brik + Owner: USSR + Location: 65,72 + Actor150: brik + Owner: USSR + Location: 65,73 + Actor151: brik + Owner: USSR + Location: 65,74 + Actor152: brik + Owner: USSR + Location: 58,74 + Actor153: brik + Owner: USSR + Location: 60,74 + Health: 63 + Actor154: brik + Owner: USSR + Location: 59,74 + Actor155: brik + Owner: USSR + Location: 61,74 + Actor156: brik + Owner: USSR + Location: 62,74 + Health: 27 + Actor157: brik + Owner: USSR + Location: 63,74 + Actor158: brik + Owner: USSR + Location: 64,74 + Actor159: brik + Owner: USSR + Location: 30,68 + Health: 22 + Actor160: brik + Owner: USSR + Location: 30,69 + Actor161: brik + Owner: USSR + Location: 30,70 + Actor162: brik + Owner: USSR + Location: 30,71 + Actor163: brik + Owner: USSR + Location: 30,73 + Actor164: brik + Owner: USSR + Location: 30,72 + Actor165: brik + Owner: USSR + Location: 30,74 + Actor166: brik + Owner: USSR + Location: 37,74 + Actor167: brik + Owner: USSR + Location: 36,74 + Health: 61 + Actor168: brik + Owner: USSR + Location: 34,74 + Health: 65 + Actor169: brik + Owner: USSR + Location: 32,74 + Actor170: brik + Owner: USSR + Location: 31,74 + Health: 68 + Actor171: brik + Owner: USSR + Location: 33,74 + Health: 44 + Actor172: brik + Owner: USSR + Location: 35,74 + Actor173: barr + Owner: USSR + Location: 35,68 + Health: 72 + Actor174: dome + Owner: USSR + Location: 59,68 + Health: 61 + Actor175: tsla + Owner: USSR + Location: 46,55 + Health: 44 + Actor176: tsla + Owner: USSR + Location: 49,55 + Actor177: tsla + Owner: USSR + Location: 57,55 + Health: 82 + Actor178: tsla + Owner: USSR + Location: 38,55 + Health: 70 + Actor181: tsla + Owner: USSR + Location: 46,73 + Health: 77 + Actor182: tsla + Owner: USSR + Location: 49,73 + Health: 48 + Actor183: tsla + Owner: USSR + Location: 57,73 + Health: 80 + Actor184: tsla + Owner: USSR + Location: 64,68 + Health: 80 + Actor185: tsla + Owner: USSR + Location: 64,60 + Health: 48 + Actor186: tsla + Owner: USSR + Location: 31,68 + Health: 62 + Actor187: tsla + Owner: USSR + Location: 31,60 + Health: 77 + Actor188: ftur + Owner: USSR + Location: 40,75 + Health: 44 + Actor189: ftur + Owner: USSR + Location: 44,75 + Health: 67 + Actor190: ftur + Owner: USSR + Location: 51,75 + Health: 89 + Actor191: ftur + Owner: USSR + Location: 55,75 + Health: 87 + Actor192: ftur + Owner: USSR + Location: 66,66 + Health: 83 + Actor193: ftur + Owner: USSR + Location: 66,62 + Health: 72 + Actor194: ftur + Owner: USSR + Location: 55,53 + Health: 75 + Actor195: ftur + Owner: USSR + Location: 51,53 + Health: 86 + Actor196: ftur + Owner: USSR + Location: 44,53 + Health: 48 + Actor197: ftur + Owner: USSR + Location: 40,53 + Health: 63 + Actor198: ftur + Owner: USSR + Location: 29,62 + Health: 80 + Actor199: ftur + Owner: USSR + Location: 29,66 + Health: 35 + Actor200: sam + Owner: USSR + Location: 62,56 + Health: 89 + Actor201: sam + Owner: USSR + Location: 32,56 + Health: 85 + Actor203: sam + Owner: USSR + Location: 32,72 + Health: 40 + Actor204: sam + Owner: USSR + Location: 62,72 + Health: 82 + Actor180: tsla + Owner: USSR + Location: 38,73 + Health: 41 + Actor208: brik + Owner: Greece + Location: 34,128 + Actor209: brik + Owner: Greece + Location: 34,127 + Actor210: brik + Owner: Greece + Location: 35,128 + Actor211: brik + Owner: Greece + Location: 34,126 + Actor212: brik + Owner: Greece + Location: 34,124 + Actor213: brik + Owner: Greece + Location: 34,125 + Actor214: brik + Owner: Greece + Location: 34,123 + Actor215: brik + Owner: Greece + Location: 34,122 + Actor216: brik + Owner: Greece + Location: 36,128 + Actor217: brik + Owner: Greece + Location: 37,128 + Actor218: brik + Owner: Greece + Location: 38,128 + Actor219: brik + Owner: Greece + Location: 40,128 + Actor220: brik + Owner: Greece + Location: 39,128 + Actor221: brik + Owner: Greece + Location: 41,128 + Actor222: brik + Owner: Greece + Location: 42,128 + Actor223: brik + Owner: Greece + Location: 43,128 + Actor224: brik + Owner: Greece + Location: 34,121 + Actor225: brik + Owner: Greece + Location: 34,120 + Actor226: brik + Owner: Greece + Location: 34,119 + Actor227: brik + Owner: Greece + Location: 35,119 + Actor228: brik + Owner: Greece + Location: 35,120 + Actor229: fact + Owner: Greece + Location: 35,124 + Actor230: weap + Owner: Greece + Location: 40,116 + Actor231: weap + Owner: Greece + Location: 44,116 + Actor232: apwr + Owner: Greece + Location: 39,125 + Actor233: apwr + Owner: Greece + Location: 42,125 + Actor234: apwr + Owner: Greece + Location: 45,125 + Actor235: apwr + Owner: Greece + Location: 48,125 + Actor237: apwr + Owner: Greece + Location: 39,121 + Actor238: apwr + Owner: Greece + Location: 42,121 + Actor239: apwr + Owner: Greece + Location: 45,121 + Actor240: apwr + Owner: Greece + Location: 48,121 + Actor241: tent + Owner: Greece + Location: 39,112 + AlliedHelipad1: hpad + Owner: Greece + Location: 49,114 + Actor243: fix + Owner: Greece + Location: 52,113 + AlliedHelipad2: hpad + Owner: Greece + Location: 56,114 + Actor245: atek + Owner: Greece + Location: 54,119 + Actor246: dome + Owner: Greece + Location: 54,123 + Actor247: proc + Owner: Greece + Location: 59,114 + Actor248: silo + Owner: Greece + Location: 59,114 + Actor249: silo + Owner: Greece + Location: 61,114 + Actor250: proc + Owner: Greece + Location: 42,111 + Actor251: silo + Owner: Greece + Location: 42,111 + Actor252: silo + Owner: Greece + Location: 44,111 + Actor253: brik + Owner: Greece + Location: 58,128 + Actor254: brik + Owner: Greece + Location: 58,127 + Actor255: brik + Owner: Greece + Location: 56,128 + Actor256: brik + Owner: Greece + Location: 55,128 + Actor257: brik + Owner: Greece + Location: 54,128 + Actor258: brik + Owner: Greece + Location: 53,128 + Actor259: brik + Owner: Greece + Location: 44,128 + Actor260: brik + Owner: Greece + Location: 45,128 + Actor261: brik + Owner: Greece + Location: 46,128 + Actor262: brik + Owner: Greece + Location: 47,128 + Actor263: brik + Owner: Greece + Location: 48,128 + Actor264: brik + Owner: Greece + Location: 49,128 + Actor265: brik + Owner: Greece + Location: 50,128 + Actor266: brik + Owner: Greece + Location: 51,128 + Actor267: brik + Owner: Greece + Location: 52,128 + Actor268: brik + Owner: Greece + Location: 57,128 + Actor269: brik + Owner: Greece + Location: 58,126 + Actor270: brik + Owner: Greece + Location: 58,125 + Actor271: brik + Owner: Greece + Location: 58,124 + Actor272: brik + Owner: Greece + Location: 58,123 + Actor273: brik + Owner: Greece + Location: 58,122 + Actor274: brik + Owner: Greece + Location: 58,121 + Actor275: brik + Owner: Greece + Location: 58,120 + Actor276: brik + Owner: Greece + Location: 59,120 + Actor277: brik + Owner: Greece + Location: 60,120 + Actor278: brik + Owner: Greece + Location: 61,120 + Actor279: brik + Owner: Greece + Location: 62,120 + Actor280: brik + Owner: Greece + Location: 62,119 + Actor281: brik + Owner: Greece + Location: 61,119 + Actor282: brik + Owner: Greece + Location: 66,119 + Actor283: brik + Owner: Greece + Location: 66,120 + Actor284: brik + Owner: Greece + Location: 67,120 + Actor285: brik + Owner: Greece + Location: 67,119 + Actor286: brik + Owner: Greece + Location: 67,118 + Actor287: brik + Owner: Greece + Location: 67,117 + Actor288: brik + Owner: Greece + Location: 67,116 + Actor289: brik + Owner: Greece + Location: 67,115 + Actor290: brik + Owner: Greece + Location: 67,114 + Actor291: brik + Owner: Greece + Location: 67,114 + Actor292: brik + Owner: Greece + Location: 67,113 + Actor293: brik + Owner: Greece + Location: 67,112 + Actor294: brik + Owner: Greece + Location: 67,111 + Actor295: brik + Owner: Greece + Location: 66,111 + Actor296: brik + Owner: Greece + Location: 65,111 + Actor297: brik + Owner: Greece + Location: 64,111 + Actor298: brik + Owner: Greece + Location: 63,111 + Actor299: brik + Owner: Greece + Location: 63,110 + Actor300: brik + Owner: Greece + Location: 62,110 + Actor301: brik + Owner: Greece + Location: 61,110 + Actor302: brik + Owner: Greece + Location: 61,109 + Actor305: brik + Owner: Greece + Location: 59,108 + Actor306: brik + Owner: Greece + Location: 58,108 + Actor307: brik + Owner: Greece + Location: 57,108 + Actor308: brik + Owner: Greece + Location: 61,108 + Actor309: brik + Owner: Greece + Location: 60,108 + Actor303: brik + Owner: Greece + Location: 53,108 + Actor304: brik + Owner: Greece + Location: 54,108 + Actor310: brik + Owner: Greece + Location: 55,108 + Actor311: brik + Owner: Greece + Location: 56,108 + Actor312: brik + Owner: Greece + Location: 52,108 + Actor313: brik + Owner: Greece + Location: 52,109 + Actor314: brik + Owner: Greece + Location: 53,109 + Actor315: brik + Owner: Greece + Location: 47,108 + Actor316: brik + Owner: Greece + Location: 47,109 + Actor317: brik + Owner: Greece + Location: 48,108 + Actor318: brik + Owner: Greece + Location: 48,109 + Actor319: brik + Owner: Greece + Location: 46,108 + Actor320: brik + Owner: Greece + Location: 45,108 + Actor321: brik + Owner: Greece + Location: 44,108 + Actor322: brik + Owner: Greece + Location: 42,108 + Actor323: brik + Owner: Greece + Location: 43,108 + Actor324: brik + Owner: Greece + Location: 41,108 + Actor325: brik + Owner: Greece + Location: 40,108 + Actor326: brik + Owner: Greece + Location: 39,108 + Actor327: brik + Owner: Greece + Location: 37,108 + Actor328: brik + Owner: Greece + Location: 38,108 + Actor329: brik + Owner: Greece + Location: 35,115 + Actor330: brik + Owner: Greece + Location: 34,115 + Actor331: brik + Owner: Greece + Location: 34,114 + Actor332: brik + Owner: Greece + Location: 35,114 + Actor333: brik + Owner: Greece + Location: 34,113 + Actor334: brik + Owner: Greece + Location: 34,112 + Actor335: brik + Owner: Greece + Location: 34,111 + Actor336: brik + Owner: Greece + Location: 34,110 + Actor337: brik + Owner: Greece + Location: 34,109 + Actor338: brik + Owner: Greece + Location: 34,108 + Actor339: brik + Owner: Greece + Location: 35,108 + Actor340: brik + Owner: Greece + Location: 36,108 + Actor341: sbag + Owner: Greece + Location: 54,118 + Actor342: sbag + Owner: Greece + Location: 55,118 + Actor343: sbag + Owner: Greece + Location: 56,118 + Actor344: sbag + Owner: Greece + Location: 56,119 + Actor345: sbag + Owner: Greece + Location: 56,120 + Actor346: sbag + Owner: Greece + Location: 56,121 + Actor347: sbag + Owner: Greece + Location: 53,118 + Actor348: sbag + Owner: Greece + Location: 56,126 + Actor349: sbag + Owner: Greece + Location: 56,125 + Actor350: sbag + Owner: Greece + Location: 56,124 + Actor351: sbag + Owner: Greece + Location: 56,123 + Actor352: sbag + Owner: Greece + Location: 56,122 + Actor353: sbag + Owner: Greece + Location: 55,126 + Actor354: sbag + Owner: Greece + Location: 54,126 + Actor355: sbag + Owner: Greece + Location: 53,126 + Actor356: sbag + Owner: Greece + Location: 64,112 + Actor357: sbag + Owner: Greece + Location: 65,112 + Actor358: sbag + Owner: Greece + Location: 66,112 + Actor359: sbag + Owner: Greece + Location: 66,113 + Actor360: sbag + Owner: Greece + Location: 66,114 + Actor361: sbag + Owner: Greece + Location: 66,115 + Actor362: sbag + Owner: Greece + Location: 40,110 + Actor363: sbag + Owner: Greece + Location: 39,110 + Actor364: sbag + Owner: Greece + Location: 38,110 + Actor365: sbag + Owner: Greece + Location: 37,110 + Actor366: sbag + Owner: Greece + Location: 36,110 + Actor367: sbag + Owner: Greece + Location: 40,111 + Actor368: sbag + Owner: Greece + Location: 41,111 + Actor369: sbag + Owner: Greece + Location: 41,112 + Actor370: sbag + Owner: Greece + Location: 41,113 + Actor371: agun + Owner: Greece + Location: 39,111 + Actor373: agun + Owner: Greece + Location: 65,113 + Actor372: agun + Owner: Greece + Location: 55,122 + Actor374: gap + Owner: Greece + Location: 50,112 + Actor375: gap + Owner: Greece + Location: 52,122 + Actor376: pbox + Owner: Greece + Location: 48,107 + Actor377: pbox + Owner: Greece + Location: 52,107 + Actor378: pbox + Owner: Greece + Location: 62,121 + Actor379: pbox + Owner: Greece + Location: 66,121 + Actor380: pbox + Owner: Greece + Location: 33,115 + Actor381: pbox + Owner: Greece + Location: 33,119 + Actor382: pris + Owner: Greece + Location: 54,109 + Actor383: pris + Owner: Greece + Location: 46,109 + Actor384: pris + Owner: Greece + Location: 35,113 + Actor385: pris + Owner: Greece + Location: 35,121 + Actor386: pris + Owner: Greece + Location: 64,117 + Actor387: tent + Owner: Greece + Location: 58,110 + Actor388: brik + Owner: GDI + Location: 3,32 + Actor389: brik + Owner: GDI + Location: 2,32 + Actor390: brik + Owner: GDI + Location: 1,32 + Actor391: brik + Owner: GDI + Location: 1,31 + Actor392: brik + Owner: GDI + Location: 1,30 + Actor393: brik + Owner: GDI + Location: 1,29 + Actor394: brik + Owner: GDI + Location: 1,28 + Actor395: brik + Owner: GDI + Location: 4,31 + Actor396: brik + Owner: GDI + Location: 4,32 + Actor397: brik + Owner: GDI + Location: 5,31 + Actor398: brik + Owner: GDI + Location: 5,32 + Actor399: brik + Owner: GDI + Location: 9,31 + Actor400: brik + Owner: GDI + Location: 9,32 + Actor401: brik + Owner: GDI + Location: 10,31 + Actor402: brik + Owner: GDI + Location: 10,32 + Actor403: brik + Owner: GDI + Location: 11,32 + Actor404: brik + Owner: GDI + Location: 12,32 + Actor405: brik + Owner: GDI + Location: 13,32 + Actor406: brik + Owner: GDI + Location: 13,31 + Actor407: brik + Owner: GDI + Location: 13,30 + Actor408: brik + Owner: GDI + Location: 13,29 + Actor409: brik + Owner: GDI + Location: 13,28 + Actor410: rep + Owner: GDI + Location: 6,25 + GDIHelipad3: hpad.td + Owner: GDI + Location: 2,27 + GDIHelipad4: hpad.td + Owner: GDI + Location: 11,27 + GDIHelipad2: hpad.td + Owner: GDI + Location: 11,24 + GDIHelipad1: hpad.td + Owner: GDI + Location: 2,24 + Actor415: brik + Owner: GDI + Location: 13,27 + Actor416: brik + Owner: GDI + Location: 13,26 + Actor417: brik + Owner: GDI + Location: 13,25 + Actor418: brik + Owner: GDI + Location: 13,24 + Actor419: brik + Owner: GDI + Location: 13,23 + Actor420: brik + Owner: GDI + Location: 13,22 + Actor421: brik + Owner: GDI + Location: 13,21 + Actor422: brik + Owner: GDI + Location: 12,21 + Actor423: brik + Owner: GDI + Location: 11,21 + Actor424: brik + Owner: GDI + Location: 10,21 + Actor425: brik + Owner: GDI + Location: 9,22 + Actor426: brik + Owner: GDI + Location: 10,22 + Actor427: brik + Owner: GDI + Location: 9,21 + Actor428: brik + Owner: GDI + Location: 1,27 + Actor429: brik + Owner: GDI + Location: 1,26 + Actor430: brik + Owner: GDI + Location: 1,25 + Actor431: brik + Owner: GDI + Location: 1,24 + Actor432: brik + Owner: GDI + Location: 1,23 + Actor433: brik + Owner: GDI + Location: 1,22 + Actor434: brik + Owner: GDI + Location: 1,21 + Actor435: brik + Owner: GDI + Location: 2,21 + Actor436: brik + Owner: GDI + Location: 3,21 + Actor437: brik + Owner: GDI + Location: 4,21 + Actor438: brik + Owner: GDI + Location: 4,22 + Actor440: brik + Owner: GDI + Location: 5,21 + Actor441: brik + Owner: GDI + Location: 5,22 + Actor439: atwr + Owner: GDI + Location: 11,31 + Actor442: atwr + Owner: GDI + Location: 11,22 + Actor443: gtwr + Owner: GDI + Location: 5,33 + Actor444: gtwr + Owner: GDI + Location: 9,33 + Actor445: gtwr + Owner: GDI + Location: 5,20 + Actor446: gtwr + Owner: GDI + Location: 9,20 + Actor447: cram + Owner: GDI + Location: 9,29 + Actor449: nuk2 + Owner: GDI + Location: 71,2 + Actor450: nuk2 + Owner: GDI + Location: 69,2 + Actor451: nuk2 + Owner: GDI + Location: 67,2 + Actor452: nuk2 + Owner: GDI + Location: 65,2 + Actor453: nuk2 + Owner: GDI + Location: 78,2 + Actor455: gtek + Owner: GDI + Location: 69,6 + Actor456: silo.td + Owner: GDI + Location: 66,6 + Actor457: silo.td + Owner: GDI + Location: 66,8 + Actor458: rep + Owner: GDI + Location: 66,10 + Actor460: afld.gdi + Owner: GDI + Location: 61,9 + Actor461: afld.gdi + Owner: GDI + Location: 61,6 + Actor462: weap.td + Owner: GDI + Location: 71,11 + Actor463: pyle + Owner: GDI + Location: 62,13 + Actor464: pyle + Owner: GDI + Location: 76,13 + Actor465: nuk2 + Owner: GDI + Location: 59,2 + Actor466: brik + Owner: GDI + Location: 80,1 + Actor467: brik + Owner: GDI + Location: 59,1 + Actor468: brik + Owner: GDI + Location: 58,1 + Actor469: brik + Owner: GDI + Location: 60,1 + Actor470: brik + Owner: GDI + Location: 61,1 + Actor471: brik + Owner: GDI + Location: 62,1 + Actor472: brik + Owner: GDI + Location: 63,1 + Actor473: brik + Owner: GDI + Location: 64,1 + Actor474: brik + Owner: GDI + Location: 65,1 + Actor475: brik + Owner: GDI + Location: 66,1 + Actor476: brik + Owner: GDI + Location: 67,1 + Actor477: brik + Owner: GDI + Location: 68,1 + Actor478: brik + Owner: GDI + Location: 70,1 + Actor479: brik + Owner: GDI + Location: 69,1 + Actor480: brik + Owner: GDI + Location: 71,1 + Actor481: brik + Owner: GDI + Location: 72,1 + Actor482: brik + Owner: GDI + Location: 73,1 + Actor483: brik + Owner: GDI + Location: 75,1 + Actor484: brik + Owner: GDI + Location: 74,1 + Actor485: brik + Owner: GDI + Location: 76,1 + Actor486: brik + Owner: GDI + Location: 77,1 + Actor487: brik + Owner: GDI + Location: 78,1 + Actor488: brik + Owner: GDI + Location: 79,1 + Actor489: brik + Owner: GDI + Location: 80,2 + Actor490: brik + Owner: GDI + Location: 80,3 + Actor491: brik + Owner: GDI + Location: 80,4 + Actor492: brik + Owner: GDI + Location: 80,5 + Actor493: brik + Owner: GDI + Location: 80,6 + Actor494: brik + Owner: GDI + Location: 80,7 + Actor495: brik + Owner: GDI + Location: 79,7 + Actor497: brik + Owner: GDI + Location: 80,13 + Actor498: brik + Owner: GDI + Location: 79,13 + Actor500: brik + Owner: GDI + Location: 80,14 + Actor501: brik + Owner: GDI + Location: 80,15 + Actor502: brik + Owner: GDI + Location: 80,16 + Actor503: brik + Owner: GDI + Location: 80,17 + Actor504: brik + Owner: GDI + Location: 80,18 + Actor505: brik + Owner: GDI + Location: 78,18 + Actor506: brik + Owner: GDI + Location: 77,18 + Actor507: brik + Owner: GDI + Location: 76,18 + Actor508: brik + Owner: GDI + Location: 75,18 + Actor509: brik + Owner: GDI + Location: 73,18 + Actor510: brik + Owner: GDI + Location: 79,18 + Actor511: brik + Owner: GDI + Location: 74,18 + Actor512: brik + Owner: GDI + Location: 73,17 + Actor513: brik + Owner: GDI + Location: 72,17 + Actor514: brik + Owner: GDI + Location: 72,18 + Actor515: brik + Owner: GDI + Location: 68,18 + Actor516: brik + Owner: GDI + Location: 68,17 + Actor517: brik + Owner: GDI + Location: 67,17 + Actor518: brik + Owner: GDI + Location: 67,18 + Actor519: brik + Owner: GDI + Location: 66,18 + Actor520: brik + Owner: GDI + Location: 65,18 + Actor521: brik + Owner: GDI + Location: 64,18 + Actor522: brik + Owner: GDI + Location: 63,18 + Actor523: brik + Owner: GDI + Location: 62,18 + Actor524: brik + Owner: GDI + Location: 61,18 + Actor525: brik + Owner: GDI + Location: 57,1 + Actor526: brik + Owner: GDI + Location: 56,1 + Actor527: brik + Owner: GDI + Location: 56,2 + Actor528: brik + Owner: GDI + Location: 56,3 + Actor529: brik + Owner: GDI + Location: 56,4 + Actor530: brik + Owner: GDI + Location: 56,5 + Actor531: brik + Owner: GDI + Location: 56,6 + Actor532: brik + Owner: GDI + Location: 56,7 + Actor533: brik + Owner: GDI + Location: 56,8 + Actor534: brik + Owner: GDI + Location: 57,8 + Actor535: brik + Owner: GDI + Location: 57,7 + Actor536: brik + Owner: GDI + Location: 56,12 + Actor537: brik + Owner: GDI + Location: 57,12 + Actor538: brik + Owner: GDI + Location: 56,13 + Actor539: brik + Owner: GDI + Location: 57,13 + Actor540: brik + Owner: GDI + Location: 56,15 + Actor541: brik + Owner: GDI + Location: 56,14 + Actor542: brik + Owner: GDI + Location: 56,16 + Actor543: brik + Owner: GDI + Location: 56,17 + Actor544: brik + Owner: GDI + Location: 56,18 + Actor545: brik + Owner: GDI + Location: 57,18 + Actor546: brik + Owner: GDI + Location: 58,18 + Actor547: brik + Owner: GDI + Location: 59,18 + Actor548: brik + Owner: GDI + Location: 60,18 + Actor549: atwr + Owner: GDI + Location: 66,17 + Actor550: atwr + Owner: GDI + Location: 74,17 + Actor552: atwr + Owner: GDI + Location: 57,14 + Actor553: atwr + Owner: GDI + Location: 57,6 + Actor554: brik + Owner: GDI + Location: 79,8 + Actor555: brik + Owner: GDI + Location: 80,8 + Actor556: brik + Owner: GDI + Location: 79,12 + Actor557: brik + Owner: GDI + Location: 80,12 + Actor558: atwr + Owner: GDI + Location: 79,14 + Actor559: gtwr + Owner: GDI + Location: 68,19 + Actor560: gtwr + Owner: GDI + Location: 72,19 + Actor561: gtwr + Owner: GDI + Location: 81,12 + Actor563: gtwr + Owner: GDI + Location: 55,8 + Actor564: gtwr + Owner: GDI + Location: 55,12 + Actor565: split2 + Owner: Neutral + Location: 88,5 + Actor566: split2 + Owner: Neutral + Location: 85,11 + Actor568: split2 + Owner: Neutral + Location: 93,9 + Actor569: split2 + Owner: Neutral + Location: 89,15 + Actor567: split2 + Owner: Neutral + Location: 64,124 + Actor570: split2 + Owner: Neutral + Location: 72,125 + Actor571: split2 + Owner: Neutral + Location: 72,117 + Actor572: split2 + Owner: Neutral + Location: 82,56 + Actor573: split2 + Owner: Neutral + Location: 91,58 + Actor574: split2 + Owner: Neutral + Location: 86,62 + Actor575: split2 + Owner: Neutral + Location: 83,69 + Actor576: split2 + Owner: Neutral + Location: 9,63 + Actor577: split2 + Owner: Neutral + Location: 7,72 + Actor578: apc.ai + Owner: Greece + Location: 41,83 + Facing: 0 + Actor580: apc.ai + Owner: Greece + Location: 56,83 + Facing: 0 + Actor582: arty + Owner: Greece + Location: 18,68 + Facing: 769 + Actor583: arty + Owner: Greece + Location: 18,62 + Facing: 761 + Actor584: arty + Owner: Greece + Location: 37,85 + Facing: 0 + Actor585: arty + Owner: Greece + Location: 49,85 + Facing: 0 + Actor586: arty + Owner: Greece + Location: 58,84 + Facing: 0 + Actor594: 2tnk + Owner: Greece + Location: 63,82 + Facing: 0 + Actor589: 2tnk + Owner: Greece + Facing: 0 + Location: 54,82 + Actor588: 2tnk + Owner: Greece + Facing: 0 + Location: 52,82 + Actor591: 2tnk + Owner: Greece + Facing: 0 + Location: 43,82 + Actor590: 2tnk + Owner: Greece + Facing: 0 + Location: 39,82 + Actor593: 2tnk + Owner: Greece + Facing: 0 + Location: 32,82 + Actor595: 2tnk + Owner: Greece + Facing: 768 + Location: 20,66 + Actor596: 2tnk + Owner: Greece + Facing: 768 + Location: 20,61 + AlliedSiegeUnit3: ptnk + Owner: Greece + Location: 41,85 + Facing: 0 + AlliedSiegeUnit1: ptnk + Owner: Greece + Location: 18,60 + Facing: 768 + AlliedSiegeUnit2: ptnk + Owner: Greece + Location: 18,66 + Facing: 768 + AlliedSiegeUnit4: ptnk + Owner: Greece + Facing: 0 + Location: 53,85 + AlliedSiegeUnit5: ptnk + Owner: Greece + Facing: 0 + Location: 63,84 + GDISiegeUnit4: htnk + Owner: GDI + Location: 59,47 + Facing: 512 + GDISiegeUnit6: htnk + Owner: GDI + Location: 74,65 + Facing: 256 + GDISiegeUnit3: htnk + Owner: GDI + Location: 53,46 + Facing: 512 + GDISiegeUnit5: htnk + Owner: GDI + Location: 74,60 + Facing: 256 + Actor609: mtnk + Owner: GDI + Location: 74,58 + Facing: 256 + Actor613: mtnk + Owner: GDI + Location: 32,47 + Facing: 512 + Actor614: mtnk + Owner: GDI + Facing: 256 + Location: 74,67 + Actor610: mtnk + Owner: GDI + Facing: 512 + Location: 56,46 + Actor615: mtnk + Owner: GDI + Facing: 512 + Location: 64,47 + Actor624: vulc.ai + Owner: GDI + Location: 28,48 + Facing: 512 + Actor626: vulc.ai + Owner: GDI + Location: 75,56 + Facing: 256 + Actor625: vulc.ai + Owner: GDI + Facing: 512 + Location: 59,45 + Actor621: msam + Owner: GDI + Facing: 256 + Location: 77,61 + Actor627: weap + Owner: USSR + Location: 35,57 + Health: 46 + Actor629: 4tnk + Owner: USSR + Location: 57,67 + Health: 19 + Facing: 769 + Actor628: fix + Owner: USSR + Location: 58,57 + Health: 38 + Actor634: apwr + Owner: USSR + Location: 53,68 + Health: 32 + Actor635: apwr + Owner: USSR + Location: 53,65 + Health: 24 + Actor636: apwr + Owner: USSR + Location: 53,62 + Health: 29 + Actor637: apwr + Owner: USSR + Location: 53,59 + Health: 17 + Actor630: apwr + Owner: USSR + Location: 40,59 + Health: 31 + Actor631: apwr + Owner: USSR + Location: 40,62 + Health: 12 + Actor632: apwr + Owner: USSR + Location: 40,65 + Health: 18 + Actor633: apwr + Owner: USSR + Location: 40,68 + Health: 37 + Actor638: shok + Owner: USSR + SubCell: 3 + Location: 38,71 + Facing: 384 + Health: 65 + Actor639: shok + Owner: USSR + SubCell: 3 + Location: 34,66 + Facing: 384 + Health: 51 + Actor640: shok + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 51,58 + Actor641: shok + Owner: USSR + SubCell: 3 + Location: 62,58 + Facing: 384 + Health: 71 + Actor642: e1 + Owner: USSR + SubCell: 3 + Location: 60,62 + Facing: 384 + Health: 82 + Actor643: e1 + Owner: USSR + SubCell: 3 + Location: 61,67 + Facing: 384 + Health: 75 + Actor644: e1 + Owner: USSR + Facing: 384 + Location: 61,67 + SubCell: 1 + Actor645: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 49,59 + Actor646: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 39,57 + Actor647: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 34,63 + Actor648: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 34,62 + Actor649: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 36,72 + Actor650: e1 + Owner: USSR + Location: 34,70 + SubCell: 3 + Facing: 384 + Health: 87 + Actor651: e1 + Owner: USSR + SubCell: 3 + Location: 39,67 + Facing: 384 + Health: 75 + Actor652: e1 + Owner: USSR + Facing: 384 + Location: 39,67 + SubCell: 1 + Actor653: v2rl + Owner: USSR + Location: 45,58 + Facing: 190 + Health: 37 + Actor654: 3tnk + Owner: USSR + Location: 44,69 + Facing: 384 + Health: 72 + Actor655: 3tnk + Owner: USSR + Location: 51,71 + Facing: 618 + Health: 37 + Actor656: btr + Owner: USSR + Location: 61,60 + Facing: 618 + Health: 27 + Actor657: btr + Owner: USSR + Location: 34,61 + Facing: 253 + Health: 65 + PlayerStart: waypoint + Owner: Neutral + Location: 47,64 + Actor658: ifv + Owner: Greece + Location: 35,83 + Facing: 0 + Actor659: ifv + Owner: Greece + Location: 16,62 + Facing: 768 + Actor661: ifv + Owner: Greece + Facing: 0 + Location: 61,85 + Actor662: ifv + Owner: Greece + Facing: 768 + Location: 17,65 + EngiDropLanding: waypoint + Owner: Neutral + Location: 57,69 + Actor663: t10 + Owner: Neutral + Location: 23,56 + Actor664: t11 + Owner: Neutral + Location: 19,51 + Actor665: t03 + Owner: Neutral + Location: 10,52 + Actor666: t06 + Owner: Neutral + Location: 7,47 + Actor667: t01 + Owner: Neutral + Location: 14,46 + Actor668: t10 + Owner: Neutral + Location: 14,38 + Actor669: t02 + Owner: Neutral + Location: 2,38 + Actor670: tc04 + Owner: Neutral + Location: 24,37 + Actor671: tc05 + Owner: Neutral + Location: 18,31 + Actor672: t03 + Owner: Neutral + Location: 22,36 + Actor673: t06 + Owner: Neutral + Location: 1,60 + Actor674: t13 + Owner: Neutral + Location: 66,49 + Actor675: t11 + Owner: Neutral + Location: 76,50 + Actor676: t14 + Owner: Neutral + Location: 72,76 + Actor677: tc01 + Owner: Neutral + Location: 67,79 + Actor678: tc05 + Owner: Neutral + Location: 27,80 + Actor679: t16 + Owner: Neutral + Location: 24,83 + Actor680: t11 + Owner: Neutral + Location: 17,77 + Actor681: t05 + Owner: Neutral + Location: 61,41 + Actor682: t06 + Owner: Neutral + Location: 46,37 + Actor683: t14 + Owner: Neutral + Location: 56,35 + Actor684: t06 + Owner: Neutral + Location: 61,28 + Actor685: t17 + Owner: Neutral + Location: 62,27 + Actor686: t01 + Owner: Neutral + Location: 67,29 + Actor687: t11 + Owner: Neutral + Location: 71,30 + Actor688: t13 + Owner: Neutral + Location: 29,13 + Actor689: tc01 + Owner: Neutral + Location: 31,13 + Actor690: t05 + Owner: Neutral + Location: 32,11 + Actor691: t06 + Owner: Neutral + Location: 35,6 + Actor692: t01 + Owner: Neutral + Location: 18,8 + Actor693: t12 + Owner: Neutral + Location: 15,11 + Actor694: tc02 + Owner: Neutral + Location: 8,12 + Actor695: tc04 + Owner: Neutral + Location: 41,3 + Actor696: t13 + Owner: Neutral + Location: 47,4 + Actor697: t06 + Owner: Neutral + Location: 54,2 + Actor698: ice02 + Owner: Neutral + Location: 39,26 + Actor699: ice04 + Owner: Neutral + Location: 34,29 + Actor700: ice03 + Owner: Neutral + Location: 33,25 + Actor701: ice05 + Owner: Neutral + Location: 40,27 + Actor702: t17 + Owner: Neutral + Location: 40,30 + Actor703: tc03 + Owner: Neutral + Location: 45,26 + Actor704: t14 + Owner: Neutral + Location: 44,24 + Actor705: t11 + Owner: Neutral + Location: 26,20 + Actor706: v02 + Owner: Neutral + Location: 28,20 + Actor707: v03 + Owner: Neutral + Location: 25,10 + Actor708: v01 + Owner: Neutral + Location: 10,10 + Actor709: v05 + Owner: Neutral + Location: 36,10 + Actor710: v07 + Owner: Neutral + Location: 21,14 + Actor711: v10 + Owner: Neutral + Location: 21,7 + Actor712: v04 + Owner: Neutral + Location: 41,8 + Actor713: v09 + Owner: Neutral + Location: 15,9 + Actor714: v11 + Owner: Neutral + Location: 46,8 + Actor715: v08 + Owner: Neutral + Location: 35,16 + Actor716: tc05 + Owner: Neutral + Location: 94,126 + Actor717: tc01 + Owner: Neutral + Location: 95,124 + Actor718: tc03 + Owner: Neutral + Location: 92,127 + Actor719: t17 + Owner: Neutral + Location: 90,127 + Actor720: t17 + Owner: Neutral + Location: 90,127 + Actor721: t13 + Owner: Neutral + Location: 95,122 + Actor722: tc04 + Owner: Neutral + Location: 92,124 + Actor723: tc02 + Owner: Neutral + Location: 93,122 + Actor724: t05 + Owner: Neutral + Location: 93,123 + Actor725: t01 + Owner: Neutral + Location: 96,120 + Actor726: t03 + Owner: Neutral + Location: 91,126 + Actor727: t15 + Owner: Neutral + Location: 95,118 + Actor728: t13 + Owner: Neutral + Location: 88,127 + Actor729: t05 + Owner: Neutral + Location: 89,126 + Actor730: t06 + Owner: Neutral + Location: 90,124 + Actor731: t01 + Owner: Neutral + Location: 86,127 + Actor732: t02 + Owner: Neutral + Location: 88,125 + Actor733: tc01 + Owner: Neutral + Location: 89,121 + Actor734: t03 + Owner: Neutral + Location: 90,120 + Actor735: t12 + Owner: Neutral + Location: 89,124 + Actor736: t10 + Owner: Neutral + Location: 88,120 + Actor737: t07 + Owner: Neutral + Location: 89,118 + Actor738: t05 + Owner: Neutral + Location: 93,116 + Actor739: t08 + Owner: Neutral + Location: 86,125 + Actor740: t02 + Owner: Neutral + Location: 93,111 + Actor741: t11 + Owner: Neutral + Location: 86,111 + Actor742: t07 + Owner: Neutral + Location: 77,113 + Actor743: t01 + Owner: Neutral + Location: 83,103 + Actor744: tc04.husk + Owner: Neutral + Location: 83,76 + Actor745: t16.husk + Owner: Neutral + Location: 89,82 + Actor746: tc01.husk + Owner: Neutral + Location: 82,88 + Actor747: tc05.husk + Owner: Neutral + Location: 87,47 + Actor748: tc05.husk + Owner: Neutral + Location: 5,83 + Actor749: tc03.husk + Owner: Neutral + Location: 17,107 + Actor750: t02.husk + Owner: Neutral + Location: 65,91 + Actor751: v03 + Owner: Neutral + Location: 92,88 + Actor752: hosp + Owner: Neutral + Location: 91,82 + Actor753: tc01 + Owner: Neutral + Location: 58,93 + Actor754: ice01 + Owner: Neutral + Location: 84,96 + Actor755: ice02 + Owner: Neutral + Location: 86,97 + Actor756: ice04 + Owner: Neutral + Location: 86,95 + Actor757: ice03 + Owner: Neutral + Location: 84,92 + Actor758: tc05 + Owner: Neutral + Location: 94,101 + Actor759: tc04 + Owner: Neutral + Location: 92,109 + Actor760: sbag + Owner: Greece + Location: 29,86 + Actor761: sbag + Owner: Greece + Location: 30,86 + Actor762: sbag + Owner: Greece + Location: 31,86 + Actor763: sbag + Owner: Greece + Location: 32,86 + Actor764: sbag + Owner: Greece + Location: 33,86 + Actor765: sbag + Owner: Greece + Location: 33,87 + Actor766: sbag + Owner: Greece + Location: 39,89 + Actor767: sbag + Owner: Greece + Location: 40,89 + Actor768: sbag + Owner: Greece + Location: 41,89 + Actor769: sbag + Owner: Greece + Location: 42,89 + Actor770: sbag + Owner: Greece + Location: 43,89 + Actor771: sbag + Owner: Greece + Location: 43,90 + Actor772: sbag + Owner: Greece + Location: 39,90 + Actor773: hbox + Owner: Greece + Location: 40,88 + Actor774: hbox + Owner: Greece + Location: 31,85 + Actor777: e1 + Owner: Greece + SubCell: 3 + Location: 29,85 + Facing: 872 + Actor778: e1 + Owner: Greece + Location: 29,85 + SubCell: 1 + Facing: 872 + Actor787: cryo + Owner: Greece + Location: 31,87 + Facing: 943 + Actor788: cryo + Owner: Greece + Location: 41,90 + Facing: 0 + Actor789: split2 + Owner: Neutral + Location: 14,98 + Actor790: split2 + Owner: Neutral + Location: 10,92 + Actor791: split2 + Owner: Neutral + Location: 84,35 + Actor792: split2 + Owner: Neutral + Location: 90,34 + Actor793: split2 + Owner: Neutral + Location: 22,24 + Actor794: split2 + Owner: Neutral + Location: 25,28 + Actor795: tc03 + Owner: Neutral + Location: 61,106 + Actor796: t14 + Owner: Neutral + Location: 63,103 + Actor797: tc05 + Owner: Neutral + Location: 64,101 + Actor798: tc03 + Owner: Neutral + Location: 67,99 + Actor799: t17 + Owner: Neutral + Location: 68,100 + Actor800: t14 + Owner: Neutral + Location: 65,100 + Actor801: t11 + Owner: Neutral + Location: 69,96 + Actor802: t13 + Owner: Neutral + Location: 71,103 + Actor803: t07 + Owner: Neutral + Location: 71,99 + Actor804: t06 + Owner: Neutral + Location: 61,99 + Actor805: t08 + Owner: Neutral + Location: 66,105 + Actor806: t10 + Owner: Neutral + Location: 68,106 + Actor807: tc01 + Owner: Neutral + Location: 59,106 + Actor808: t02 + Owner: Neutral + Location: 62,108 + Actor809: tc04 + Owner: Neutral + Location: 64,108 + Actor810: t08 + Owner: Neutral + Location: 63,109 + Actor811: t15 + Owner: Neutral + Location: 62,107 + Actor812: t06 + Owner: Neutral + Location: 37,100 + Actor813: t08 + Owner: Neutral + Location: 35,100 + Actor814: t05 + Owner: Neutral + Location: 39,97 + Actor815: proc.td + Owner: GDI + Location: 75,7 + Actor816: mech + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 30,88 + Actor817: mech + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 41,91 + Actor818: hmmv + Owner: GDI + Facing: 384 + Location: 67,47 + Actor819: hmmv + Owner: GDI + Location: 25,49 + Facing: 658 + Actor822: jeep + Owner: Greece + Location: 19,56 + Facing: 650 + Actor823: hmmv + Owner: GDI + Location: 74,70 + Facing: 142 + Actor824: 2tnk + Owner: Greece + Location: 54,106 + Facing: 0 + Actor825: 2tnk + Owner: Greece + Location: 69,113 + Facing: 919 + Actor826: 2tnk + Owner: Greece + Location: 32,113 + Facing: 128 + Actor827: 2tnk + Owner: Greece + Facing: 128 + Location: 30,120 + Actor829: 2tnk + Owner: Greece + Facing: 0 + Location: 46,106 + Actor828: arty + Owner: Greece + Location: 35,109 + Facing: 128 + Actor830: arty + Owner: Greece + Location: 60,109 + Facing: 0 + Actor831: cryo + Owner: Greece + Location: 43,109 + Facing: 103 + Actor832: cryo + Owner: Greece + Location: 62,111 + Facing: 0 + Actor833: ptnk + Owner: Greece + Location: 32,120 + Facing: 126 + Actor834: apc.ai + Owner: Greece + Location: 57,105 + Facing: 79 + Actor835: 1tnk + Owner: Greece + Location: 30,116 + Facing: 111 + Actor837: apc.ai + Owner: Greece + Location: 46,113 + Facing: 880 + Actor836: jeep + Owner: Greece + Facing: 384 + Location: 69,100 + Actor838: jeep + Owner: Greece + Location: 24,101 + Facing: 911 + Actor841: 1tnk + Owner: Greece + Location: 94,93 + Facing: 0 + Actor839: 1tnk + Owner: Greece + Facing: 0 + Location: 93,95 + Actor840: mrj + Owner: Greece + Facing: 384 + Location: 55,109 + Actor842: ifv + Owner: Greece + Facing: 384 + Location: 51,118 + Actor843: ifv + Owner: Greece + Location: 65,104 + Facing: 245 + Actor846: e1 + Owner: Greece + SubCell: 3 + Location: 28,117 + Facing: 15 + Actor847: e1 + Owner: Greece + Location: 28,117 + SubCell: 1 + Facing: 103 + Actor850: e1 + Owner: Greece + SubCell: 3 + Location: 47,106 + Facing: 0 + Actor851: e1 + Owner: Greece + SubCell: 3 + Location: 49,104 + Facing: 0 + Actor862: e1 + Owner: Greece + SubCell: 3 + Location: 62,118 + Facing: 547 + Actor863: e1 + Owner: Greece + SubCell: 3 + Location: 64,119 + Facing: 586 + Actor864: e1 + Owner: Greece + Facing: 384 + Location: 65,118 + SubCell: 3 + Actor865: e1 + Owner: Greece + Location: 63,119 + SubCell: 3 + Facing: 547 + Actor866: e1 + Owner: Greece + Facing: 384 + Location: 63,119 + SubCell: 1 + Actor868: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 53,117 + Actor871: e1 + Owner: Greece + Location: 57,118 + SubCell: 3 + Facing: 666 + Actor872: e1 + Owner: Greece + Facing: 384 + Location: 38,114 + SubCell: 3 + Actor873: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 37,112 + Actor877: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 52,125 + Actor878: e3 + Owner: Greece + Facing: 384 + Location: 63,119 + SubCell: 2 + Actor879: e3 + Owner: Greece + SubCell: 3 + Location: 74,111 + Facing: 0 + Actor880: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 68,104 + Actor881: e3 + Owner: Greece + Facing: 384 + Location: 82,103 + SubCell: 3 + Actor882: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 92,112 + Actor883: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 58,95 + Actor884: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 49,94 + Actor885: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 39,100 + Actor888: e3 + Owner: Greece + SubCell: 3 + Location: 16,67 + Facing: 808 + Actor889: e3 + Owner: Greece + SubCell: 3 + Location: 18,59 + Facing: 705 + Actor891: e1 + Owner: Greece + SubCell: 3 + Location: 19,65 + Facing: 737 + Actor896: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 8,86 + Actor897: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 95,92 + Actor898: htnk + Owner: GDI + Location: 74,20 + Facing: 512 + Actor899: htnk + Owner: GDI + Location: 66,20 + Facing: 512 + Actor900: msam + Owner: GDI + Facing: 512 + Location: 63,17 + Actor901: msam + Owner: GDI + Facing: 512 + Location: 57,17 + Actor902: msam + Owner: GDI + Facing: 512 + Location: 79,17 + Actor903: mtnk + Owner: GDI + Facing: 512 + Location: 54,17 + Actor904: mtnk + Owner: GDI + Location: 51,8 + Facing: 404 + Actor905: vulc.ai + Owner: GDI + Facing: 512 + Location: 59,14 + Actor906: vulc.ai + Owner: GDI + Facing: 512 + Location: 67,15 + Actor908: vulc.ai + Owner: GDI + Location: 77,21 + Facing: 512 + Actor909: htnk.ion + Owner: GDI + Location: 6,35 + Facing: 634 + Actor910: mtnk + Owner: GDI + Location: 11,34 + Facing: 634 + Actor911: vulc + Owner: GDI + Location: 5,24 + Facing: 515 + Actor912: msam + Owner: GDI + Location: 5,30 + Facing: 626 + Actor913: n1 + Owner: GDI + SubCell: 3 + Location: 34,47 + Facing: 499 + Actor914: n1 + Owner: GDI + SubCell: 3 + Location: 30,47 + Facing: 658 + Actor915: n1 + Owner: GDI + SubCell: 3 + Location: 39,45 + Facing: 610 + Actor917: n1 + Owner: GDI + SubCell: 3 + Location: 45,45 + Facing: 531 + Actor921: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 54,45 + Actor922: n1 + Owner: GDI + Facing: 384 + Location: 54,44 + SubCell: 3 + Actor923: n1 + Owner: GDI + Facing: 384 + Location: 58,46 + SubCell: 3 + Actor924: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 62,47 + Actor925: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 68,48 + Actor926: n1 + Owner: GDI + SubCell: 3 + Location: 67,19 + Facing: 531 + Actor927: n1 + Owner: GDI + Facing: 384 + Location: 67,19 + SubCell: 1 + Actor928: n1 + Owner: GDI + SubCell: 3 + Location: 70,18 + Facing: 555 + Actor929: n1 + Owner: GDI + Location: 69,17 + SubCell: 3 + Facing: 547 + Actor930: n1 + Owner: GDI + Location: 72,16 + SubCell: 3 + Facing: 523 + Actor931: n1 + Owner: GDI + SubCell: 3 + Location: 77,20 + Facing: 563 + Actor932: n1 + Owner: GDI + Location: 77,20 + SubCell: 1 + Facing: 547 + Actor933: n1 + Owner: GDI + SubCell: 3 + Location: 75,19 + Facing: 547 + Actor935: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 54,18 + Actor936: n1 + Owner: GDI + Facing: 384 + Location: 54,18 + SubCell: 1 + Actor937: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 52,16 + Actor938: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 54,14 + Actor939: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 52,12 + Actor940: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 51,7 + Actor941: n1 + Owner: GDI + Facing: 384 + Location: 51,7 + SubCell: 1 + Actor942: n2 + Owner: GDI + SubCell: 3 + Location: 76,17 + Facing: 618 + Actor943: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 64,14 + Actor944: n2 + Owner: GDI + SubCell: 3 + Location: 60,14 + Facing: 618 + Actor945: n2 + Owner: GDI + SubCell: 3 + Location: 64,20 + Facing: 384 + Actor946: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 67,43 + Actor947: n2 + Owner: GDI + Facing: 384 + Location: 68,48 + SubCell: 1 + Actor948: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 63,45 + Actor949: n2 + Owner: GDI + Location: 41,46 + SubCell: 3 + Facing: 483 + Actor950: n2 + Owner: GDI + SubCell: 3 + Location: 74,57 + Facing: 269 + Actor951: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 76,60 + Actor952: n2 + Owner: GDI + SubCell: 3 + Location: 75,69 + Facing: 309 + Actor953: n1 + Owner: GDI + SubCell: 3 + Location: 76,64 + Facing: 309 + Actor955: n1 + Owner: GDI + SubCell: 3 + Location: 74,54 + Facing: 253 + Actor956: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 72,37 + Actor957: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 74,38 + Actor958: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 70,35 + Actor959: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 75,36 + Actor960: n3 + Owner: GDI + SubCell: 3 + Facing: 384 + Location: 74,37 + Actor961: n3 + Owner: GDI + Facing: 384 + Location: 74,37 + SubCell: 1 + Actor962: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 52,45 + Actor963: n3 + Owner: GDI + Facing: 384 + Location: 65,47 + SubCell: 3 + Actor964: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 68,46 + Actor965: n3 + Owner: GDI + Location: 32,46 + SubCell: 3 + Facing: 531 + Actor967: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 77,62 + Actor968: n3 + Owner: GDI + SubCell: 3 + Location: 75,57 + Facing: 384 + Actor971: e1 + Owner: Greece + SubCell: 3 + Location: 42,84 + Facing: 943 + Actor972: vulc.ai + Owner: GDI + Facing: 512 + Location: 52,43 + Actor981: mtnk + Owner: GDI + Facing: 512 + Location: 42,43 + Actor982: n1 + Owner: GDI + Location: 11,33 + SubCell: 3 + Facing: 650 + Actor983: n1 + Owner: GDI + Facing: 384 + Location: 11,33 + SubCell: 1 + Actor984: n1 + Owner: GDI + SubCell: 3 + Location: 13,34 + Facing: 547 + Actor985: n1 + Owner: GDI + SubCell: 3 + Location: 3,35 + Facing: 658 + Actor986: n1 + Owner: GDI + SubCell: 3 + Location: 7,30 + Facing: 507 + Actor987: n1 + Owner: GDI + SubCell: 3 + Location: 11,20 + Facing: 824 + Actor988: n1 + Owner: GDI + SubCell: 3 + Location: 7,19 + Facing: 864 + Actor989: n1 + Owner: GDI + SubCell: 3 + Location: 4,18 + Facing: 0 + Actor990: n1 + Owner: GDI + SubCell: 3 + Location: 4,19 + Facing: 0 + Actor991: n1 + Owner: GDI + SubCell: 3 + Location: 15,26 + Facing: 634 + Actor992: 3tnk + Owner: USSR + Location: 55,57 + Facing: 618 + Health: 43 + Actor993: dog + Owner: USSR + SubCell: 3 + Location: 61,64 + Facing: 594 + Actor994: kenn + Owner: USSR + Location: 38,68 + Health: 45 + Actor995: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 44,107 + Actor996: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 56,107 + Actor997: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 54,105 + Actor998: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 59,105 + Actor999: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 67,103 + Actor1000: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 69,102 + Actor1001: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 70,101 + Actor1002: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 72,110 + Actor1003: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 68,109 + Actor1004: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 69,112 + Actor1007: e3 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 29,119 + Actor1008: e3 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 24,112 + Actor1009: e3 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 37,109 + Actor1010: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 31,114 + Actor1011: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 31,121 + Actor1012: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 50,118 + Actor1013: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 54,112 + Actor1014: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 46,112 + Actor970: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 38,82 + Actor969: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 33,84 + Actor1015: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 34,88 + Actor1016: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 38,89 + Actor1017: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 39,88 + Actor1018: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 43,88 + Actor973: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 50,84 + Actor974: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 54,84 + Actor975: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 57,82 + Actor976: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 59,84 + Actor977: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 64,85 + Actor1005: e3 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 57,109 + Actor1019: e3 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 28,86 + Actor1020: e3 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 34,87 + Actor980: e3 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 39,84 + Actor978: e3 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 63,86 + Actor979: e3 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 49,87 + Actor1021: e3 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 43,91 + Actor1022: e1 + Owner: Greece + SubCell: 3 + Facing: 737 + Location: 17,61 + Actor1023: e1 + Owner: Greece + SubCell: 3 + Facing: 737 + Location: 20,55 + Actor1024: e1 + Owner: Greece + SubCell: 3 + Facing: 737 + Location: 19,72 + Actor1025: e1 + Owner: Greece + SubCell: 3 + Facing: 737 + Location: 19,69 + Actor1026: e1 + Owner: Greece + SubCell: 3 + Location: 21,73 + Facing: 737 + SiegeTopLeft: waypoint + Owner: Neutral + Location: 16,43 + SiegeBottomRight: waypoint + Owner: Neutral + Location: 78,90 + Actor1029: camera + Owner: Greece + Location: 32,64 + Actor1030: camera + Owner: GDI + Location: 42,56 + Actor1031: camera + Owner: GDI + Location: 53,56 + Actor1032: camera + Owner: GDI + Location: 63,64 + Actor1033: camera + Owner: Greece + Location: 42,72 + Actor1034: camera + Owner: Greece + Location: 53,72 + GDIAttackRally: waypoint + Owner: Neutral + Location: 70,23 + GDIAttack1a: waypoint + Owner: Neutral + Location: 73,44 + GDIAttack1b: waypoint + Owner: Neutral + Location: 38,38 + GDIAttack2b: waypoint + Owner: Neutral + Location: 42,49 + Actor954: n1 + Owner: GDI + SubCell: 3 + Location: 74,63 + Facing: 206 + GDIAttack2a: waypoint + Owner: Neutral + Location: 71,64 + AlliedAttackRally: waypoint + Owner: Neutral + Location: 50,100 + AlliedAttack1a: waypoint + Owner: Neutral + Location: 72,85 + AlliedAttack1b: waypoint + Owner: Neutral + Location: 47,82 + AlliedAttack1c: waypoint + Owner: Neutral + Location: 18,82 + AlliedAttack2: waypoint + Owner: Neutral + Location: 21,68 + Actor1027: msam + Owner: GDI + Facing: 512 + Location: 33,44 + Actor1035: n1 + Owner: GDI + SubCell: 3 + Location: 34,45 + Facing: 602 + Actor1036: n3 + Owner: GDI + SubCell: 3 + Facing: 384 + Location: 76,59 + Actor966: n2 + Owner: GDI + SubCell: 3 + Facing: 309 + Location: 74,68 + Actor1037: msam + Owner: GDI + Facing: 256 + Location: 77,64 + Actor1039: mtnk + Owner: GDI + Facing: 384 + Location: 87,29 + Actor1040: hmmv + Owner: GDI + Location: 85,28 + Facing: 253 + Actor1041: jeep + Owner: Greece + Facing: 904 + Location: 27,84 + Actor1042: jeep + Owner: Greece + Location: 6,87 + Facing: 618 + Actor1043: hmmv + Owner: GDI + Location: 5,47 + Facing: 384 + Actor1044: n1 + Owner: GDI + SubCell: 3 + Facing: 384 + Location: 6,48 + Actor1045: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 12,44 + Actor1046: n1 + Owner: GDI + SubCell: 3 + Location: 4,50 + Facing: 705 + Actor1047: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 15,48 + Actor1048: e1 + Owner: Greece + SubCell: 3 + Facing: 384 + Location: 4,85 + Actor1049: e3 + Owner: Greece + SubCell: 3 + Location: 16,90 + Facing: 848 + Actor1050: vulc.ai + Owner: GDI + Location: 70,9 + Facing: 512 + Actor1051: brik + Owner: GDI + Location: 80,19 + Actor1052: brik + Owner: GDI + Location: 80,20 + Actor1053: brik + Owner: GDI + Location: 81,20 + Actor1054: brik + Owner: GDI + Location: 82,20 + Actor1055: brik + Owner: GDI + Location: 83,20 + Actor1056: brik + Owner: GDI + Location: 83,19 + Actor1057: brik + Owner: GDI + Location: 82,19 + Actor1058: brik + Owner: GDI + Location: 87,19 + Actor1059: brik + Owner: GDI + Location: 87,20 + Actor1060: brik + Owner: GDI + Location: 88,19 + Actor1061: brik + Owner: GDI + Location: 88,20 + Actor1062: brik + Owner: GDI + Location: 89,20 + Actor1063: brik + Owner: GDI + Location: 90,20 + Actor1064: brik + Owner: GDI + Location: 91,20 + Actor1065: brik + Owner: GDI + Location: 92,20 + Actor1066: brik + Owner: GDI + Location: 93,20 + Actor1067: brik + Owner: GDI + Location: 94,20 + Actor1068: brik + Owner: GDI + Location: 95,20 + Actor1069: brik + Owner: GDI + Location: 96,20 + Actor1070: brik + Owner: GDI + Location: 96,19 + Actor1071: brik + Owner: GDI + Location: 96,18 + Actor1072: brik + Owner: GDI + Location: 96,17 + Actor1073: brik + Owner: GDI + Location: 96,16 + Actor1074: brik + Owner: GDI + Location: 96,14 + Actor1075: brik + Owner: GDI + Location: 96,15 + Actor1076: brik + Owner: GDI + Location: 96,13 + Actor1077: brik + Owner: GDI + Location: 96,12 + Actor1078: brik + Owner: GDI + Location: 96,11 + Actor1079: brik + Owner: GDI + Location: 96,10 + Actor1080: brik + Owner: GDI + Location: 96,9 + Actor1081: brik + Owner: GDI + Location: 96,8 + Actor1082: brik + Owner: GDI + Location: 96,7 + Actor1083: brik + Owner: GDI + Location: 96,6 + Actor1084: brik + Owner: GDI + Location: 96,5 + Actor1085: brik + Owner: GDI + Location: 96,4 + Actor1086: brik + Owner: GDI + Location: 81,1 + Actor1087: brik + Owner: GDI + Location: 82,1 + Actor1088: brik + Owner: GDI + Location: 83,1 + Actor1089: brik + Owner: GDI + Location: 84,1 + Actor1090: brik + Owner: GDI + Location: 85,1 + Actor1091: brik + Owner: GDI + Location: 86,1 + Actor1092: brik + Owner: GDI + Location: 87,1 + Actor1093: brik + Owner: GDI + Location: 88,1 + Actor1094: brik + Owner: GDI + Location: 89,1 + Actor1095: brik + Owner: GDI + Location: 90,1 + Actor1096: brik + Owner: GDI + Location: 91,1 + Actor1097: brik + Owner: GDI + Location: 92,1 + Actor1098: brik + Owner: GDI + Location: 93,1 + Actor1099: brik + Owner: GDI + Location: 94,1 + Actor1100: brik + Owner: GDI + Location: 95,1 + Actor1101: brik + Owner: GDI + Location: 96,1 + Actor1102: brik + Owner: GDI + Location: 96,2 + Actor1103: brik + Owner: GDI + Location: 96,3 + Actor1104: atwr + Owner: GDI + Location: 81,19 + Actor1105: gtwr + Owner: GDI + Location: 83,21 + Actor1106: gtwr + Owner: GDI + Location: 87,21 + Actor1107: afac + Owner: GDI + Location: 73,2 + Actor1108: nuk2 + Owner: GDI + Location: 76,2 + Actor1109: hq + Owner: GDI + Location: 61,2 + Actor1110: nuk2 + Owner: GDI + Location: 63,2 + Actor1111: cram + Owner: GDI + Location: 89,19 + Actor1112: cram + Owner: GDI + Location: 79,6 + Actor1113: cram + Owner: GDI + Location: 59,16 + Actor1114: cram + Owner: GDI + Location: 59,6 + Actor1115: nuk2 + Owner: GDI + Location: 57,2 + Actor1116: arty + Owner: Greece + Facing: 0 + Location: 64,86 + Actor1038: jeep + Owner: Greece + Facing: 118 + Location: 67,82 + Actor1117: e3 + Owner: Greece + SubCell: 3 + Location: 18,74 + Facing: 666 + Actor1118: 2tnk + Owner: Greece + Facing: 768 + Location: 20,73 + Actor1119: apc.ai + Owner: Greece + Facing: 761 + Location: 20,71 + Actor1121: chpr + Owner: Greece + Facing: 253 + Location: 38,116 + Actor1120: pcan + Owner: Greece + Facing: 0 + Location: 55,117 + Actor1122: msam + Owner: GDI + Facing: 512 + Location: 64,44 + Actor1125: msam + Owner: GDI + Facing: 512 + Location: 58,42 + Actor1123: msam + Owner: GDI + Facing: 512 + Location: 39,42 + Actor1124: mtnk + Owner: GDI + Facing: 512 + Location: 40,46 + GDISiegeUnit1: htnk + Owner: GDI + Location: 37,46 + Facing: 512 + GDISiegeUnit2: htnk + Owner: GDI + Location: 44,45 + Facing: 512 + Actor1126: n1 + Owner: GDI + SubCell: 3 + Facing: 563 + Location: 46,46 + Actor1127: n1 + Owner: GDI + SubCell: 3 + Facing: 563 + Location: 40,43 + Actor1128: n1 + Owner: GDI + SubCell: 3 + Facing: 563 + Location: 36,45 + EngiDropSpawn: waypoint + Owner: Neutral + Location: 96,84 + Actor1130: camera + Owner: Greece + Location: 23,59 + Actor1131: camera + Owner: Greece + Location: 22,72 + Actor1132: camera + Owner: GDI + Location: 72,57 + Actor1133: camera + Owner: GDI + Location: 72,69 + EMPMissile: patr + Owner: GDI + Location: 2,21 + TurretFacing: 192 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-doctrines.yaml, ca|missions/main-campaign/ca15-ironclad/ironclad-rules.yaml, ca|rules/custom/coop-rules.yaml, ironclad-coop-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/coop-campaign/ca16-expulsion-coop/expulsion-coop-rules.yaml b/mods/ca/missions/coop-campaign/ca16-expulsion-coop/expulsion-coop-rules.yaml new file mode 100644 index 0000000000..912150c13b --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca16-expulsion-coop/expulsion-coop-rules.yaml @@ -0,0 +1,6 @@ +World: + LuaScript: + Scripts: campaign.lua, coop.lua, ca|missions/main-campaign/ca16-expulsion/expulsion.lua, expulsion-coop.lua + LobbyMissionInfo@InitialObjectives: + Prefix: Initial Objectives + Text: • Destroy all GDI forces. \ No newline at end of file diff --git a/mods/ca/missions/coop-campaign/ca16-expulsion-coop/expulsion-coop.lua b/mods/ca/missions/coop-campaign/ca16-expulsion-coop/expulsion-coop.lua new file mode 100644 index 0000000000..fc41993cd7 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca16-expulsion-coop/expulsion-coop.lua @@ -0,0 +1,34 @@ + +SetupPlayers = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Multi2 = Player.GetPlayer("Multi2") + Multi3 = Player.GetPlayer("Multi3") + Multi4 = Player.GetPlayer("Multi4") + Multi5 = Player.GetPlayer("Multi5") + USSR = Player.GetPlayer("USSR") + GDI = Player.GetPlayer("GDI") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = Utils.Where({ Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 }, function(p) return p ~= nil end) + MissionEnemies = { GDI } + SinglePlayerPlayer = USSR + CoopInit() +end + +AfterWorldLoaded = function() + StartCashSpread(3500) +end + +AfterTick = function() + +end + +DoMcvArrival = function() + local delay = 0 + Utils.Do(GetMcvPlayers(), function(p) + Trigger.AfterDelay(delay, function() + Reinforcements.Reinforce(p, { "mcv" }, { McvSpawn.Location, McvRally.Location }) + end) + delay = delay + DateTime.Seconds(1) + end) +end diff --git a/mods/ca/missions/coop-campaign/ca16-expulsion-coop/map.bin b/mods/ca/missions/coop-campaign/ca16-expulsion-coop/map.bin new file mode 100644 index 0000000000..1da5122299 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca16-expulsion-coop/map.bin differ diff --git a/mods/ca/missions/coop-campaign/ca16-expulsion-coop/map.png b/mods/ca/missions/coop-campaign/ca16-expulsion-coop/map.png new file mode 100644 index 0000000000..88b64d6c76 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca16-expulsion-coop/map.png differ diff --git a/mods/ca/missions/coop-campaign/ca16-expulsion-coop/map.yaml b/mods/ca/missions/coop-campaign/ca16-expulsion-coop/map.yaml new file mode 100644 index 0000000000..8b465e5c3b --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca16-expulsion-coop/map.yaml @@ -0,0 +1,2363 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 16: Expulsion Co-op + +Author: Darkademic & Gandorques Hikla + +Tileset: SNOW + +MapSize: 114,98 + +Bounds: 1,1,112,96 + +Visibility: Lobby + +Categories: Co-op Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: USSR, GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + PlayerReference@USSR: + Name: USSR + Faction: soviet + Color: FE1100 + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: GDI, Creeps + PlayerReference@GDI: + Name: GDI + Bot: campaign + Faction: gdi + Color: F2CF74 + Enemies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: FE1100 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: GDI, Creeps + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: FF9922 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: GDI, Creeps + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: 994050 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: GDI, Creeps + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: 775A12 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: GDI, Creeps + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: 82C900 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: GDI, Creeps + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: DD1691 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: GDI, Creeps + +Actors: + Actor1: 4tnk + Owner: USSR + Location: 106,84 + Facing: 128 + Actor2: 4tnk + Owner: USSR + Facing: 128 + Location: 101,88 + Actor3: e1 + Owner: USSR + SubCell: 3 + Location: 102,87 + Facing: 128 + Actor4: e1 + Owner: USSR + Location: 102,87 + SubCell: 1 + Facing: 128 + Actor5: e1 + Owner: USSR + Location: 102,87 + SubCell: 2 + Facing: 128 + Actor9: e2 + Owner: USSR + SubCell: 3 + Location: 100,89 + Facing: 128 + Actor10: e2 + Owner: USSR + SubCell: 3 + Location: 106,82 + Facing: 128 + Actor7: e1 + Owner: USSR + SubCell: 3 + Facing: 128 + Location: 104,83 + Actor8: e1 + Owner: USSR + SubCell: 1 + Facing: 128 + Location: 104,83 + Actor11: e1 + Owner: USSR + SubCell: 2 + Facing: 128 + Location: 104,83 + McvSpawn: waypoint + Owner: Neutral + Location: 111,96 + McvRally: waypoint + Owner: Neutral + Location: 104,87 + InitialAttacker1: mtnk + Owner: GDI + Location: 89,85 + Facing: 768 + InitialAttacker6: n1 + Owner: GDI + SubCell: 3 + Location: 89,89 + Facing: 785 + InitialAttacker3: n1 + Owner: GDI + SubCell: 3 + Location: 91,82 + Facing: 737 + InitialAttacker2: apc2.gdiai + Owner: GDI + Location: 86,83 + Facing: 768 + InitialAttacker4: n1 + Owner: GDI + SubCell: 3 + Location: 91,87 + Facing: 737 + InitialAttacker5: e3 + Owner: GDI + SubCell: 3 + Location: 90,87 + Facing: 768 + Actor19: oilb + Owner: Neutral + Location: 100,76 + Actor20: t16 + Owner: Neutral + Location: 111,79 + Actor21: t01 + Owner: Neutral + Location: 93,79 + Actor22: t10 + Owner: Neutral + Location: 98,91 + Actor23: ice01 + Owner: Neutral + Location: 103,94 + Actor24: ice02 + Owner: Neutral + Location: 88,77 + Actor25: ice03 + Owner: Neutral + Location: 99,70 + Actor26: ice04 + Owner: Neutral + Location: 110,75 + Actor27: t12 + Owner: Neutral + Location: 76,91 + Actor28: oilb + Location: 72,57 + Faction: Random + Owner: GDI + Actor29: oilb + Owner: Neutral + Location: 107,4 + Actor30: brik + Owner: GDI + Location: 23,96 + Actor31: brik + Owner: GDI + Location: 22,96 + Actor32: brik + Owner: GDI + Location: 21,96 + Actor33: brik + Owner: GDI + Location: 23,95 + Actor34: brik + Owner: GDI + Location: 23,93 + Actor35: brik + Owner: GDI + Location: 23,94 + Actor36: brik + Owner: GDI + Location: 23,92 + Actor37: brik + Owner: GDI + Location: 23,91 + Actor38: brik + Owner: GDI + Location: 23,90 + Actor39: brik + Owner: GDI + Location: 23,89 + Actor40: brik + Owner: GDI + Location: 23,88 + Actor41: brik + Owner: GDI + Location: 23,87 + Actor42: brik + Owner: GDI + Location: 23,86 + Actor43: brik + Owner: GDI + Location: 23,85 + Actor44: brik + Owner: GDI + Location: 23,84 + Actor45: brik + Owner: GDI + Location: 23,83 + Actor46: brik + Owner: GDI + Location: 23,82 + Actor47: brik + Owner: GDI + Location: 23,81 + Actor48: brik + Owner: GDI + Location: 22,81 + Actor49: brik + Owner: GDI + Location: 21,81 + Actor50: brik + Owner: GDI + Location: 20,81 + Actor51: brik + Owner: GDI + Location: 19,81 + Actor52: brik + Owner: GDI + Location: 18,81 + Actor53: brik + Owner: GDI + Location: 17,81 + Actor54: brik + Owner: GDI + Location: 17,82 + Actor55: brik + Owner: GDI + Location: 18,82 + Actor56: brik + Owner: GDI + Location: 13,81 + Actor57: brik + Owner: GDI + Location: 13,82 + Actor58: brik + Owner: GDI + Location: 12,81 + Actor59: brik + Owner: GDI + Location: 12,82 + Actor60: brik + Owner: GDI + Location: 11,81 + Actor61: brik + Owner: GDI + Location: 10,81 + Actor62: brik + Owner: GDI + Location: 9,81 + Actor63: brik + Owner: GDI + Location: 8,81 + Actor64: brik + Owner: GDI + Location: 7,81 + Actor65: brik + Owner: GDI + Location: 6,81 + Actor66: brik + Owner: GDI + Location: 6,82 + Actor67: brik + Owner: GDI + Location: 7,82 + Actor68: brik + Owner: GDI + Location: 6,83 + Actor69: brik + Owner: GDI + Location: 6,84 + Actor70: brik + Owner: GDI + Location: 6,85 + Actor71: brik + Owner: GDI + Location: 6,86 + Actor72: brik + Owner: GDI + Location: 6,87 + Actor73: brik + Owner: GDI + Location: 7,87 + Actor74: brik + Owner: GDI + Location: 7,86 + Actor75: brik + Owner: GDI + Location: 6,91 + Actor76: brik + Owner: GDI + Location: 7,91 + Actor77: brik + Owner: GDI + Location: 7,92 + Actor78: brik + Owner: GDI + Location: 6,92 + Actor79: brik + Owner: GDI + Location: 6,93 + Actor80: brik + Owner: GDI + Location: 6,94 + Actor81: brik + Owner: GDI + Location: 6,95 + Actor82: brik + Owner: GDI + Location: 6,96 + Actor83: brik + Owner: GDI + Location: 7,96 + Actor84: brik + Owner: GDI + Location: 8,96 + Actor85: brik + Owner: GDI + Location: 9,96 + Actor86: brik + Owner: GDI + Location: 10,96 + Actor87: brik + Owner: GDI + Location: 11,96 + Actor88: brik + Owner: GDI + Location: 12,96 + Actor89: brik + Owner: GDI + Location: 13,96 + Actor90: brik + Owner: GDI + Location: 14,96 + Actor91: brik + Owner: GDI + Location: 15,96 + Actor92: brik + Owner: GDI + Location: 16,96 + Actor93: brik + Owner: GDI + Location: 17,96 + Actor94: brik + Owner: GDI + Location: 19,96 + Actor95: brik + Owner: GDI + Location: 18,96 + Actor96: brik + Owner: GDI + Location: 20,96 + Actor103: rep + Owner: GDI + Location: 18,88 + Actor104: atwr + Owner: GDI + Location: 19,82 + Actor105: atwr + Owner: GDI + Location: 11,82 + Actor106: gtwr + Owner: GDI + Location: 17,80 + Actor107: gtwr + Owner: GDI + Location: 13,80 + Actor111: cram + Owner: GDI + Location: 22,82 + Actor114: silo.td + Owner: GDI + Location: 20,85 + Actor115: silo.td + Owner: GDI + Location: 17,85 + Actor116: brik + Owner: GDI + Location: 15,1 + Actor117: brik + Owner: GDI + Location: 15,2 + Actor118: brik + Owner: GDI + Location: 16,1 + Actor119: brik + Owner: GDI + Location: 17,1 + Actor120: brik + Owner: GDI + Location: 18,1 + Actor121: brik + Owner: GDI + Location: 15,3 + Actor122: brik + Owner: GDI + Location: 15,4 + Actor123: brik + Owner: GDI + Location: 15,5 + Actor124: brik + Owner: GDI + Location: 16,5 + Actor125: brik + Owner: GDI + Location: 16,5 + Actor126: brik + Owner: GDI + Location: 16,4 + Actor127: brik + Owner: GDI + Location: 15,9 + Actor128: brik + Owner: GDI + Location: 16,9 + Actor129: brik + Owner: GDI + Location: 15,10 + Actor130: brik + Owner: GDI + Location: 16,10 + Actor131: brik + Owner: GDI + Location: 15,11 + Actor132: brik + Owner: GDI + Location: 15,12 + Actor133: brik + Owner: GDI + Location: 15,13 + Actor134: brik + Owner: GDI + Location: 15,14 + Actor135: brik + Owner: GDI + Location: 15,14 + Actor136: brik + Owner: GDI + Location: 15,15 + Actor137: brik + Owner: GDI + Location: 15,16 + Actor138: brik + Owner: GDI + Location: 17,16 + Actor139: brik + Owner: GDI + Location: 16,16 + Actor140: brik + Owner: GDI + Location: 18,16 + Actor141: brik + Owner: GDI + Location: 19,16 + Actor142: brik + Owner: GDI + Location: 20,16 + Actor143: brik + Owner: GDI + Location: 21,16 + Actor144: brik + Owner: GDI + Location: 22,16 + Actor145: brik + Owner: GDI + Location: 24,16 + Actor146: brik + Owner: GDI + Location: 23,16 + Actor147: brik + Owner: GDI + Location: 24,15 + Actor148: brik + Owner: GDI + Location: 23,15 + Actor149: brik + Owner: GDI + Location: 28,15 + Actor150: brik + Owner: GDI + Location: 28,16 + Actor151: brik + Owner: GDI + Location: 29,15 + Actor152: brik + Owner: GDI + Location: 29,16 + Actor153: brik + Owner: GDI + Location: 30,16 + Actor154: brik + Owner: GDI + Location: 32,16 + Actor155: brik + Owner: GDI + Location: 31,16 + Actor156: brik + Owner: GDI + Location: 33,16 + Actor157: brik + Owner: GDI + Location: 34,16 + Actor158: brik + Owner: GDI + Location: 35,16 + Actor159: brik + Owner: GDI + Location: 36,16 + Actor160: brik + Owner: GDI + Location: 37,16 + Actor161: brik + Owner: GDI + Location: 38,16 + Actor162: brik + Owner: GDI + Location: 38,15 + Actor163: brik + Owner: GDI + Location: 38,14 + Actor164: brik + Owner: GDI + Location: 38,13 + Actor165: brik + Owner: GDI + Location: 38,12 + Actor166: brik + Owner: GDI + Location: 38,11 + Actor167: brik + Owner: GDI + Location: 37,10 + Actor168: brik + Owner: GDI + Location: 38,10 + Actor169: brik + Owner: GDI + Location: 37,9 + Actor170: brik + Owner: GDI + Location: 38,9 + Actor171: brik + Owner: GDI + Location: 37,5 + Actor172: brik + Owner: GDI + Location: 37,4 + Actor173: brik + Owner: GDI + Location: 38,4 + Actor174: brik + Owner: GDI + Location: 38,5 + Actor175: brik + Owner: GDI + Location: 38,3 + Actor176: brik + Owner: GDI + Location: 38,2 + Actor177: brik + Owner: GDI + Location: 38,1 + Actor178: brik + Owner: GDI + Location: 19,1 + Actor179: brik + Owner: GDI + Location: 21,1 + Actor180: brik + Owner: GDI + Location: 20,1 + Actor181: brik + Owner: GDI + Location: 23,1 + Actor182: brik + Owner: GDI + Location: 22,1 + Actor183: brik + Owner: GDI + Location: 25,1 + Actor184: brik + Owner: GDI + Location: 24,1 + Actor185: brik + Owner: GDI + Location: 26,1 + Actor186: brik + Owner: GDI + Location: 27,1 + Actor187: brik + Owner: GDI + Location: 28,1 + Actor188: brik + Owner: GDI + Location: 30,1 + Actor189: brik + Owner: GDI + Location: 29,1 + Actor190: brik + Owner: GDI + Location: 31,1 + Actor191: brik + Owner: GDI + Location: 32,1 + Actor192: brik + Owner: GDI + Location: 33,1 + Actor193: brik + Owner: GDI + Location: 35,1 + Actor194: brik + Owner: GDI + Location: 34,1 + Actor195: brik + Owner: GDI + Location: 36,1 + Actor196: brik + Owner: GDI + Location: 37,1 + GDIFactory: weap.td + Owner: GDI + Location: 22,10 + Actor198: afac + Owner: GDI + Location: 22,2 + Actor199: nuk2 + Owner: GDI + Location: 26,2 + Actor200: nuk2 + Owner: GDI + Location: 28,2 + Actor201: nuk2 + Owner: GDI + Location: 30,2 + Actor202: nuk2 + Owner: GDI + Location: 32,2 + Actor203: nuk2 + Owner: GDI + Location: 34,2 + Actor204: hq + Owner: GDI + Location: 35,12 + GDIMainBarracks: pyle + Owner: GDI + Location: 27,10 + Actor206: gtek + Owner: GDI + Location: 27,6 + Actor207: proc.td + Owner: GDI + Location: 18,2 + GDIAirfield2: afld.gdi + Owner: GDI + Location: 32,9 + GDIAirfield1: afld.gdi + Owner: GDI + Location: 32,6 + Actor212: atwr + Owner: GDI + Location: 22,15 + Actor213: atwr + Owner: GDI + Location: 30,15 + Actor214: atwr + Owner: GDI + Location: 37,11 + Actor215: atwr + Owner: GDI + Location: 37,3 + Actor216: atwr + Owner: GDI + Location: 16,3 + Actor217: atwr + Owner: GDI + Location: 16,11 + Actor218: gtwr + Owner: GDI + Location: 39,9 + Actor219: gtwr + Owner: GDI + Location: 39,5 + Actor220: gtwr + Owner: GDI + Location: 28,17 + Actor221: gtwr + Owner: GDI + Location: 24,17 + Actor222: cram + Owner: GDI + Location: 37,15 + Actor224: cram + Owner: GDI + Location: 33,13 + Actor225: silo.td + Owner: GDI + Location: 18,11 + Actor226: silo.td + Owner: GDI + Location: 18,9 + Actor227: split2 + Owner: Neutral + Location: 5,8 + Actor228: split2 + Owner: Neutral + Location: 5,8 + Actor229: split2 + Owner: Neutral + Location: 10,13 + Actor230: split2 + Owner: Neutral + Location: 9,4 + Actor231: sbag + Owner: GDI + Location: 87,12 + Actor232: sbag + Owner: GDI + Location: 86,12 + Actor233: sbag + Owner: GDI + Location: 86,13 + Actor234: sbag + Owner: GDI + Location: 86,14 + Actor235: sbag + Owner: GDI + Location: 86,15 + Actor236: sbag + Owner: GDI + Location: 86,19 + Actor237: sbag + Owner: GDI + Location: 86,20 + Actor238: sbag + Owner: GDI + Location: 86,21 + Actor239: sbag + Owner: GDI + Location: 86,22 + Actor240: sbag + Owner: GDI + Location: 87,22 + Actor241: sbag + Owner: GDI + Location: 88,22 + Actor242: sbag + Owner: GDI + Location: 90,22 + Actor243: sbag + Owner: GDI + Location: 89,22 + Actor244: sbag + Owner: GDI + Location: 91,22 + Actor245: sbag + Owner: GDI + Location: 92,22 + Actor246: sbag + Owner: GDI + Location: 92,21 + Actor247: sbag + Owner: GDI + Location: 94,21 + Actor248: sbag + Owner: GDI + Location: 93,21 + Actor249: sbag + Owner: GDI + Location: 95,21 + Actor250: sbag + Owner: GDI + Location: 96,21 + Actor251: sbag + Owner: GDI + Location: 96,20 + Actor252: sbag + Owner: GDI + Location: 97,20 + Actor253: sbag + Owner: GDI + Location: 98,20 + Actor254: sbag + Owner: GDI + Location: 99,20 + Actor255: sbag + Owner: GDI + Location: 99,19 + Actor256: sbag + Owner: GDI + Location: 99,15 + Actor257: sbag + Owner: GDI + Location: 99,14 + Actor258: sbag + Owner: GDI + Location: 99,13 + Actor259: sbag + Owner: GDI + Location: 99,12 + Actor260: sbag + Owner: GDI + Location: 98,12 + Actor261: sbag + Owner: GDI + Location: 88,12 + Actor262: sbag + Owner: GDI + Location: 89,12 + Actor263: sbag + Owner: GDI + Location: 90,12 + Actor264: sbag + Owner: GDI + Location: 96,12 + Actor265: sbag + Owner: GDI + Location: 95,12 + Actor266: sbag + Owner: GDI + Location: 97,12 + Actor267: sbag + Owner: GDI + Location: 91,12 + Actor270: gtwr + Owner: GDI + Location: 100,19 + Actor271: gtwr + Owner: GDI + Location: 100,15 + Actor272: gtwr + Owner: GDI + Location: 85,15 + Actor273: gtwr + Owner: GDI + Location: 85,19 + Actor274: silo.td + Owner: GDI + Location: 87,21 + Actor275: silo.td + Owner: GDI + Location: 90,21 + Actor276: silo.td + Owner: GDI + Location: 93,20 + Actor277: silo.td + Owner: GDI + Location: 97,13 + Actor278: silo.td + Owner: GDI + Location: 87,13 + Actor279: cram + Owner: GDI + Location: 97,19 + Actor280: hq + Owner: GDI + Location: 89,15 + GDINorthEastBarracks: pyle + Owner: GDI + Location: 95,15 + Actor284: split2 + Owner: Neutral + Location: 5,75 + Actor283: proc.td + Owner: GDI + Location: 10,84 + GDISouthBarracks: pyle + Owner: GDI + Location: 14,86 + Actor286: t13 + Owner: Neutral + Location: 20,27 + Actor287: t11 + Owner: Neutral + Location: 31,23 + Actor288: t14 + Owner: Neutral + Location: 43,25 + Actor289: t03 + Owner: Neutral + Location: 49,15 + Actor290: t01 + Owner: Neutral + Location: 56,12 + Actor291: t05 + Owner: Neutral + Location: 59,29 + Actor292: t02 + Owner: Neutral + Location: 54,40 + Actor293: t10 + Owner: Neutral + Location: 39,38 + Actor294: t11 + Owner: Neutral + Location: 28,56 + Actor295: t03 + Owner: Neutral + Location: 18,48 + Actor296: t02 + Owner: Neutral + Location: 8,40 + Actor297: t05 + Owner: Neutral + Location: 9,26 + Actor298: t12 + Owner: Neutral + Location: 4,21 + Actor299: t07 + Owner: Neutral + Location: 51,6 + Actor300: t01 + Owner: Neutral + Location: 80,18 + Actor301: t01 + Owner: Neutral + Location: 80,18 + Actor302: t17 + Owner: Neutral + Location: 78,22 + Actor303: t13 + Owner: Neutral + Location: 79,35 + Actor304: t11 + Owner: Neutral + Location: 88,67 + Actor305: t01 + Owner: Neutral + Location: 67,79 + Actor306: t02 + Owner: Neutral + Location: 59,71 + Actor307: t08 + Owner: Neutral + Location: 70,63 + Actor308: tc05 + Owner: Neutral + Location: 49,63 + Actor309: t08 + Owner: Neutral + Location: 46,63 + Actor310: t06 + Owner: Neutral + Location: 50,53 + Actor311: t14 + Owner: Neutral + Location: 40,59 + Actor312: t03 + Owner: Neutral + Location: 50,45 + Actor313: t06 + Owner: Neutral + Location: 76,46 + Actor314: t01 + Owner: Neutral + Location: 70,26 + Actor315: t12 + Owner: Neutral + Location: 73,15 + Actor316: t12 + Owner: Neutral + Location: 111,17 + Actor317: t06 + Owner: Neutral + Location: 103,29 + Actor318: t14 + Owner: Neutral + Location: 110,54 + Actor319: t13 + Owner: Neutral + Location: 95,65 + Actor320: t03 + Owner: Neutral + Location: 59,85 + GDIAttack3b: t01 + Owner: Neutral + Location: 35,82 + Actor322: v07 + Owner: Neutral + Location: 43,81 + Actor323: v05 + Owner: Neutral + Location: 76,16 + Actor324: v08 + Owner: Neutral + Location: 80,22 + Actor325: v09 + Owner: Neutral + Location: 69,21 + Actor326: v10 + Owner: Neutral + Location: 66,11 + Actor327: v03 + Owner: Neutral + Location: 50,11 + Actor328: htnk + Owner: GDI + Location: 22,18 + Facing: 531 + Actor329: htnk + Owner: GDI + Location: 30,18 + Facing: 507 + Actor330: vulc.ai + Owner: GDI + Facing: 384 + Location: 34,18 + Actor331: vulc.ai + Owner: GDI + Facing: 384 + Location: 14,29 + Actor332: vulc.ai + Owner: GDI + Location: 59,20 + Facing: 642 + Actor333: vulc + Owner: GDI + Location: 107,17 + Facing: 384 + Actor334: mtnk + Owner: GDI + Location: 108,26 + Facing: 523 + Actor335: mtnk + Owner: GDI + Location: 85,37 + Facing: 499 + BattleTank2: mtnk + Owner: GDI + Location: 98,61 + Facing: 384 + Actor337: mtnk + Owner: GDI + Location: 62,69 + Facing: 523 + Actor338: mtnk + Owner: GDI + Location: 68,54 + Facing: 384 + BattleTank1: mtnk + Owner: GDI + Location: 70,55 + Facing: 384 + Actor340: mtnk + Owner: GDI + Location: 45,60 + Facing: 777 + Actor341: mtnk + Owner: GDI + Location: 45,49 + Facing: 515 + Actor342: mtnk + Owner: GDI + Location: 21,77 + Facing: 927 + Actor343: mtnk + Owner: GDI + Location: 18,74 + Facing: 911 + Actor344: mtnk + Owner: GDI + Location: 9,36 + Facing: 618 + Actor345: mtnk + Owner: GDI + Location: 28,41 + Facing: 523 + Actor346: mtnk + Owner: GDI + Location: 24,61 + Facing: 515 + Actor347: mtnk + Owner: GDI + Location: 84,54 + Facing: 626 + Actor348: hmmv + Owner: GDI + Facing: 384 + Location: 84,67 + Actor349: hmmv + Owner: GDI + Location: 63,92 + Facing: 872 + Actor350: hmmv + Owner: GDI + Facing: 384 + Location: 79,43 + Actor351: hmmv + Owner: GDI + Facing: 384 + Location: 83,22 + Actor352: hmmv + Owner: GDI + Location: 106,39 + Facing: 634 + Actor353: hmmv.tow + Owner: GDI + Location: 26,28 + Facing: 245 + Actor354: msam + Owner: GDI + Facing: 384 + Location: 33,15 + Actor355: msam + Owner: GDI + Location: 20,15 + Facing: 507 + Actor356: msam + Owner: GDI + Location: 20,82 + Facing: 1023 + Actor357: msam + Owner: GDI + Location: 98,14 + Facing: 769 + Actor358: titn + Owner: GDI + Location: 40,14 + Facing: 666 + Actor359: disr + Owner: GDI + Location: 51,29 + Facing: 642 + Actor360: jugg + Owner: GDI + Location: 26,13 + Facing: 499 + Actor361: apc2.gdiai + Owner: GDI + Location: 48,57 + Facing: 626 + Actor362: apc2.gdiai + Owner: GDI + Facing: 384 + Location: 96,60 + Actor363: apc2.gdiai + Owner: GDI + Location: 67,25 + Facing: 261 + Actor364: mtnk + Owner: GDI + Location: 42,9 + Facing: 642 + Actor365: mtnk + Owner: GDI + Facing: 642 + Location: 14,18 + Actor366: n1 + Owner: GDI + SubCell: 3 + Location: 21,17 + Facing: 483 + Actor367: n1 + Owner: GDI + Location: 21,17 + SubCell: 1 + Facing: 491 + Actor368: n1 + Owner: GDI + Location: 23,18 + SubCell: 3 + Facing: 555 + Actor369: n1 + Owner: GDI + SubCell: 3 + Location: 29,19 + Facing: 475 + Actor370: n1 + Owner: GDI + Location: 30,17 + SubCell: 3 + Facing: 570 + Actor371: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 35,17 + Actor372: n1 + Owner: GDI + Facing: 384 + Location: 33,18 + SubCell: 3 + Actor373: n1 + Owner: GDI + SubCell: 3 + Location: 15,18 + Facing: 682 + Actor374: n1 + Owner: GDI + SubCell: 3 + Location: 13,19 + Facing: 602 + Actor375: n1 + Owner: GDI + SubCell: 3 + Location: 27,29 + Facing: 261 + Actor376: n1 + Owner: GDI + Location: 26,27 + SubCell: 3 + Facing: 229 + Actor377: n1 + Owner: GDI + SubCell: 3 + Location: 14,30 + Facing: 384 + Actor378: n1 + Owner: GDI + SubCell: 3 + Location: 11,29 + Facing: 384 + Actor379: n1 + Owner: GDI + SubCell: 3 + Location: 9,37 + Facing: 618 + Actor380: n1 + Owner: GDI + Location: 9,37 + SubCell: 1 + Facing: 689 + Actor381: n1 + Owner: GDI + SubCell: 3 + Location: 10,36 + Facing: 610 + Actor382: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 30,40 + Actor383: n1 + Owner: GDI + SubCell: 3 + Location: 27,41 + Facing: 531 + Actor384: n1 + Owner: GDI + SubCell: 3 + Location: 26,40 + Facing: 602 + Actor385: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 43,50 + Actor386: n1 + Owner: GDI + Facing: 384 + Location: 43,49 + SubCell: 3 + Actor387: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 46,48 + Actor388: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 44,60 + Actor389: n1 + Owner: GDI + Facing: 384 + Location: 44,60 + SubCell: 1 + Actor390: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 47,57 + Actor391: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 47,60 + Actor392: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 45,62 + Actor393: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 71,56 + Actor394: n1 + Owner: GDI + Location: 71,56 + SubCell: 1 + Facing: 384 + Actor398: n1 + Owner: GDI + SubCell: 3 + Location: 61,71 + Facing: 512 + Actor401: n1 + Owner: GDI + SubCell: 3 + Location: 62,90 + Facing: 927 + Actor402: n1 + Owner: GDI + Location: 62,90 + SubCell: 1 + Facing: 888 + Actor403: n1 + Owner: GDI + SubCell: 3 + Location: 65,93 + Facing: 904 + Actor404: n1 + Owner: GDI + SubCell: 3 + Location: 64,94 + Facing: 896 + Actor405: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 83,65 + Actor406: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 84,66 + Actor407: n1 + Owner: GDI + Facing: 384 + Location: 84,66 + SubCell: 1 + Actor409: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 85,68 + Actor410: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 96,59 + Actor411: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 99,58 + Actor412: n1 + Owner: GDI + Facing: 384 + Location: 99,58 + SubCell: 1 + Actor413: n1 + Owner: GDI + Facing: 384 + Location: 100,60 + SubCell: 3 + Actor414: n1 + Owner: GDI + Facing: 384 + Location: 97,61 + SubCell: 3 + Actor417: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 101,62 + Actor416: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 110,39 + Actor418: n1 + Owner: GDI + Facing: 384 + Location: 110,39 + SubCell: 1 + Actor419: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 108,38 + Actor420: n1 + Owner: GDI + SubCell: 3 + Location: 105,26 + Facing: 547 + Actor421: n1 + Owner: GDI + Location: 105,26 + SubCell: 1 + Facing: 384 + Actor425: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 106,15 + Actor426: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 108,17 + Actor427: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 110,18 + Actor428: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 105,17 + Actor429: n1 + Owner: GDI + SubCell: 3 + Location: 99,17 + Facing: 785 + Actor430: n1 + Owner: GDI + SubCell: 3 + Location: 101,18 + Facing: 729 + Actor431: n1 + Owner: GDI + Location: 101,18 + SubCell: 1 + Facing: 674 + Actor432: n1 + Owner: GDI + SubCell: 3 + Location: 101,20 + Facing: 697 + Actor433: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 100,13 + Actor434: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 83,15 + Actor435: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 85,14 + Actor436: n1 + Owner: GDI + Facing: 384 + Location: 85,13 + SubCell: 3 + Actor437: n1 + Owner: GDI + SubCell: 3 + Location: 85,21 + Facing: 384 + Actor438: n1 + Owner: GDI + Facing: 384 + Location: 85,21 + SubCell: 1 + Actor439: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 92,19 + Actor440: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 72,13 + Actor441: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 75,18 + Actor442: n1 + Owner: GDI + SubCell: 3 + Location: 71,26 + Facing: 729 + Actor443: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 66,26 + Actor444: n1 + Owner: GDI + SubCell: 3 + Location: 60,19 + Facing: 523 + Actor445: n1 + Owner: GDI + Facing: 384 + Location: 60,19 + SubCell: 1 + Actor446: n1 + Owner: GDI + Location: 60,18 + SubCell: 3 + Facing: 800 + Actor447: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 58,20 + Actor448: n1 + Owner: GDI + SubCell: 3 + Location: 49,28 + Facing: 539 + Actor449: n1 + Owner: GDI + SubCell: 3 + Location: 53,29 + Facing: 610 + Actor450: n1 + Owner: GDI + Facing: 384 + Location: 53,29 + SubCell: 1 + Actor451: n1 + Owner: GDI + SubCell: 3 + Location: 55,28 + Facing: 570 + Actor452: n1 + Owner: GDI + SubCell: 3 + Location: 51,28 + Facing: 618 + Actor453: n1 + Owner: GDI + SubCell: 3 + Location: 42,10 + Facing: 586 + Actor454: n1 + Owner: GDI + SubCell: 3 + Location: 40,12 + Facing: 761 + Actor455: n1 + Owner: GDI + Location: 40,12 + SubCell: 1 + Facing: 618 + Actor456: n1 + Owner: GDI + SubCell: 3 + Location: 43,15 + Facing: 650 + Actor457: n1 + Owner: GDI + SubCell: 3 + Location: 43,13 + Facing: 610 + Actor458: n1 + Owner: GDI + SubCell: 3 + Location: 47,8 + Facing: 689 + Actor459: n1 + Owner: GDI + SubCell: 3 + Location: 43,6 + Facing: 682 + Actor460: n1 + Owner: GDI + SubCell: 3 + Location: 21,20 + Facing: 531 + Actor461: n1 + Owner: GDI + SubCell: 3 + Location: 29,10 + Facing: 658 + Actor462: n1 + Owner: GDI + Facing: 384 + Location: 29,10 + SubCell: 1 + Actor463: n1 + Owner: GDI + SubCell: 3 + Location: 30,9 + Facing: 384 + Actor464: n1 + Owner: GDI + SubCell: 3 + Location: 25,8 + Facing: 570 + Actor465: n1 + Owner: GDI + SubCell: 3 + Location: 30,5 + Facing: 539 + Actor466: n1 + Owner: GDI + SubCell: 3 + Location: 20,8 + Facing: 563 + Actor467: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 50,38 + Actor468: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 28,54 + Actor469: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 31,57 + Actor470: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 30,56 + Actor471: n1 + Owner: GDI + SubCell: 3 + Location: 27,56 + Facing: 384 + Actor472: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 26,62 + Actor473: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 22,61 + Actor474: n1 + Owner: GDI + SubCell: 3 + Location: 21,79 + Facing: 864 + Actor475: n1 + Owner: GDI + Location: 21,79 + SubCell: 1 + Facing: 872 + Actor476: n1 + Owner: GDI + SubCell: 3 + Location: 23,78 + Facing: 729 + Actor477: n1 + Owner: GDI + SubCell: 3 + Location: 17,77 + Facing: 753 + Actor478: n1 + Owner: GDI + SubCell: 3 + Location: 16,75 + Facing: 87 + Actor479: n1 + Owner: GDI + SubCell: 3 + Location: 24,80 + Facing: 896 + Actor480: n1 + Owner: GDI + SubCell: 3 + Location: 13,78 + Facing: 785 + Actor481: n1 + Owner: GDI + SubCell: 3 + Location: 19,86 + Facing: 384 + Actor482: n1 + Owner: GDI + SubCell: 3 + Location: 21,87 + Facing: 0 + Actor483: n1 + Owner: GDI + SubCell: 3 + Location: 13,90 + Facing: 0 + Actor484: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 10,89 + Actor485: n1 + Owner: GDI + SubCell: 3 + Location: 38,81 + Facing: 896 + Actor486: n1 + Owner: GDI + SubCell: 3 + Location: 40,76 + Facing: 0 + Actor487: n1 + Owner: GDI + Location: 40,76 + SubCell: 1 + Facing: 0 + Actor488: n1 + Owner: GDI + SubCell: 3 + Location: 45,78 + Facing: 0 + Actor489: n1 + Owner: GDI + SubCell: 3 + Location: 42,79 + Facing: 0 + Actor490: n1 + Owner: GDI + SubCell: 3 + Location: 43,77 + Facing: 0 + Actor491: n1 + Owner: GDI + Facing: 384 + Location: 53,41 + SubCell: 3 + Actor495: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 80,43 + Actor496: n1 + Owner: GDI + SubCell: 3 + Location: 83,36 + Facing: 666 + Actor497: n1 + Owner: GDI + Facing: 384 + Location: 83,36 + SubCell: 1 + Actor498: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 87,35 + Actor500: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 82,37 + Actor499: n1 + Owner: GDI + SubCell: 3 + Facing: 384 + Location: 111,52 + Actor501: n1 + Owner: GDI + SubCell: 3 + Location: 81,73 + Facing: 499 + Actor502: n1 + Owner: GDI + SubCell: 3 + Location: 71,82 + Facing: 666 + Actor503: n1 + Owner: GDI + SubCell: 3 + Location: 70,83 + Facing: 816 + Actor504: n1 + Owner: GDI + SubCell: 3 + Location: 82,73 + Facing: 602 + Actor505: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 106,41 + Actor506: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 111,53 + Actor507: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 28,40 + Actor508: n2 + Owner: GDI + Facing: 384 + Location: 51,38 + SubCell: 3 + Actor509: n2 + Owner: GDI + SubCell: 3 + Location: 53,28 + Facing: 610 + Actor510: n2 + Owner: GDI + SubCell: 3 + Location: 28,27 + Facing: 269 + Actor511: n2 + Owner: GDI + SubCell: 3 + Location: 12,30 + Facing: 547 + Actor512: n2 + Owner: GDI + SubCell: 3 + Location: 8,38 + Facing: 626 + Actor513: n2 + Owner: GDI + Location: 17,77 + SubCell: 1 + Facing: 745 + Actor514: n2 + Owner: GDI + Location: 43,79 + SubCell: 3 + Facing: 0 + Actor515: n2 + Owner: GDI + SubCell: 3 + Location: 39,77 + Facing: 0 + Actor516: n2 + Owner: GDI + SubCell: 3 + Location: 62,70 + Facing: 512 + Actor517: n2 + Owner: GDI + SubCell: 3 + Location: 70,81 + Facing: 793 + Actor518: n2 + Owner: GDI + SubCell: 3 + Location: 65,94 + Facing: 911 + Actor519: n2 + Owner: GDI + Facing: 384 + Location: 85,67 + SubCell: 3 + Actor520: n2 + Owner: GDI + Facing: 384 + Location: 98,60 + SubCell: 3 + Actor521: n2 + Owner: GDI + Location: 83,53 + SubCell: 3 + Facing: 689 + Actor522: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 85,36 + Actor523: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 84,22 + Actor524: n2 + Owner: GDI + SubCell: 3 + Location: 103,14 + Facing: 452 + Actor525: n2 + Owner: GDI + Location: 105,25 + SubCell: 3 + Facing: 602 + Actor526: n2 + Owner: GDI + SubCell: 3 + Location: 67,27 + Facing: 269 + Actor527: n2 + Owner: GDI + SubCell: 3 + Location: 42,14 + Facing: 586 + Actor528: n2 + Owner: GDI + SubCell: 3 + Location: 32,17 + Facing: 507 + Actor529: n2 + Owner: GDI + SubCell: 3 + Location: 18,17 + Facing: 563 + Actor530: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 25,61 + Actor531: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 29,55 + Actor532: n2 + Owner: GDI + SubCell: 3 + Location: 22,79 + Facing: 872 + Actor533: n2 + Owner: GDI + SubCell: 3 + Location: 14,77 + Facing: 904 + Actor534: n2 + Owner: GDI + Location: 21,84 + SubCell: 3 + Facing: 689 + Actor535: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 9,82 + Actor536: n3 + Owner: GDI + SubCell: 3 + Location: 38,80 + Facing: 0 + Health: 89 + Actor537: n3 + Owner: GDI + Facing: 384 + Location: 45,48 + SubCell: 3 + Actor538: n3 + Owner: GDI + SubCell: 3 + Location: 52,27 + Facing: 634 + Actor539: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 59,19 + Actor540: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 73,13 + Actor541: n3 + Owner: GDI + Facing: 384 + Location: 85,14 + SubCell: 1 + Actor542: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 85,22 + Actor543: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 109,16 + Actor544: n3 + Owner: GDI + SubCell: 3 + Location: 110,27 + Facing: 384 + Actor545: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 105,38 + Actor546: n3 + Owner: GDI + Facing: 384 + Location: 99,58 + SubCell: 2 + Actor547: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 85,66 + Actor548: n3 + Owner: GDI + SubCell: 3 + Location: 81,72 + Facing: 626 + Actor549: n3 + Owner: GDI + SubCell: 3 + Location: 62,93 + Facing: 911 + Actor550: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 62,68 + Actor551: n3 + Owner: GDI + Facing: 384 + Location: 71,54 + SubCell: 3 + Actor552: n3 + Owner: GDI + Facing: 384 + Location: 45,59 + SubCell: 3 + Actor553: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 52,39 + Actor554: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 23,60 + Actor555: n3 + Owner: GDI + SubCell: 3 + Location: 7,37 + Facing: 674 + Actor556: n3 + Owner: GDI + SubCell: 3 + Location: 12,18 + Facing: 594 + Actor557: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 19,12 + Actor558: n3 + Owner: GDI + SubCell: 3 + Location: 21,8 + Facing: 610 + Actor559: n3 + Owner: GDI + SubCell: 3 + Location: 26,5 + Facing: 634 + Actor560: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 35,11 + Actor561: n3 + Owner: GDI + Facing: 384 + Location: 35,18 + SubCell: 3 + Actor562: n3 + Owner: GDI + Facing: 384 + Location: 49,15 + SubCell: 3 + Actor563: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 56,6 + Actor564: n1 + Owner: GDI + SubCell: 3 + Facing: 512 + Location: 60,70 + Actor565: n1 + Owner: GDI + SubCell: 3 + Facing: 512 + Location: 64,70 + Actor566: n1 + Owner: GDI + SubCell: 3 + Facing: 512 + Location: 68,56 + Actor567: n1 + Owner: GDI + SubCell: 3 + Facing: 512 + Location: 70,54 + Actor568: n1 + Owner: GDI + SubCell: 3 + Facing: 512 + Location: 71,53 + Actor569: n1 + Owner: GDI + SubCell: 3 + Facing: 512 + Location: 85,53 + Actor570: n1 + Owner: GDI + SubCell: 3 + Facing: 512 + Location: 82,54 + Actor571: n1 + Owner: GDI + SubCell: 3 + Facing: 512 + Location: 84,51 + Actor572: n1 + Owner: GDI + SubCell: 3 + Facing: 512 + Location: 87,67 + Actor573: n1 + Owner: GDI + SubCell: 3 + Facing: 512 + Location: 107,42 + Actor574: n1 + Owner: GDI + SubCell: 3 + Facing: 512 + Location: 105,28 + Actor575: n1 + Owner: GDI + SubCell: 3 + Location: 110,26 + Facing: 512 + Actor576: n1 + Owner: GDI + SubCell: 3 + Facing: 512 + Location: 106,24 + GDIRallyAlpha: waypoint + Owner: Neutral + Location: 14,23 + GDIRallyBravo: waypoint + Owner: Neutral + Location: 52,19 + GDIAttack1: waypoint + Owner: Neutral + Location: 25,46 + GDIAttack2: waypoint + Owner: Neutral + Location: 22,75 + GDIAttack5: waypoint + Owner: Neutral + Location: 68,88 + GDIAttack7: waypoint + Owner: Neutral + Location: 46,44 + GDIAttack3: waypoint + Owner: Neutral + Location: 41,78 + GDIAttack4: waypoint + Owner: Neutral + Location: 53,60 + GDIAttack8: waypoint + Owner: Neutral + Location: 79,49 + GDIAttack9: waypoint + Owner: Neutral + Location: 91,61 + GDIAttack6: waypoint + Owner: Neutral + Location: 92,85 + GDIAttack10: waypoint + Owner: Neutral + Location: 78,18 + GDIAttack11: waypoint + Owner: Neutral + Location: 107,19 + GDIAttack12: waypoint + Owner: Neutral + Location: 109,50 + Actor577: camera + Owner: GDI + Location: 95,84 + Actor578: camera + Owner: GDI + Location: 67,86 + Actor579: camera + Owner: GDI + Location: 62,60 + Actor580: camera + Owner: GDI + Location: 94,61 + Actor581: camera + Owner: GDI + Location: 86,37 + Actor582: camera + Owner: GDI + Location: 46,43 + Actor583: camera + Owner: GDI + Location: 18,45 + Actor584: camera + Owner: GDI + Location: 42,65 + Actor585: camera + Owner: GDI + Location: 24,67 + Actor586: camera + Owner: GDI + Location: 54,17 + Actor587: nuk2 + Owner: GDI + Location: 92,15 + Actor588: nuk2 + Owner: GDI + Location: 7,93 + Actor589: nuk2 + Owner: GDI + Location: 9,93 + Actor590: nuk2 + Owner: GDI + Location: 11,93 + Actor591: nuk2 + Owner: GDI + Location: 13,93 + Actor592: nuk2 + Owner: GDI + Location: 15,93 + Actor593: hq + Owner: GDI + Location: 18,93 + Actor594: silo.td + Owner: GDI + Location: 21,95 + Actor595: silo.td + Owner: GDI + Location: 21,93 + Actor596: gtwr + Owner: GDI + Location: 5,87 + Actor597: cram + Owner: GDI + Location: 16,15 + Actor598: nuk2 + Owner: GDI + Location: 22,6 + Actor599: cram + Owner: GDI + Location: 25,7 + Actor600: oilb + Owner: Neutral + Location: 71,93 + Actor601: oilb + Owner: Neutral + Location: 106,1 + Actor602: oilb + Faction: Random + Location: 75,24 + Owner: GDI + Actor603: oilb + Faction: Random + Location: 37,37 + Owner: GDI + Actor604: camera + Owner: GDI + Location: 85,17 + Actor605: camera + Owner: GDI + Location: 77,48 + Actor606: camera + Owner: GDI + Location: 83,70 + Actor607: camera + Owner: GDI + Location: 63,74 + Actor608: patr + Owner: GDI + Location: 11,89 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-doctrines.yaml, ca|missions/main-campaign/ca16-expulsion/expulsion-rules.yaml, ca|rules/custom/coop-rules.yaml, expulsion-coop-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/coop-campaign/ca17-domination-coop/domination-coop-rules.yaml b/mods/ca/missions/coop-campaign/ca17-domination-coop/domination-coop-rules.yaml new file mode 100644 index 0000000000..25fa0c4d53 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca17-domination-coop/domination-coop-rules.yaml @@ -0,0 +1,38 @@ +World: + LuaScript: + Scripts: campaign.lua, coop.lua, ca|missions/main-campaign/ca17-domination/domination.lua, domination-coop.lua + LobbyMissionInfo@InitialObjectives: + Prefix: Initial Objectives + Text: • Steal Nod encryption codes using Thief.\n• Destroy Temple of Nod. + LobbyMissionInfo@Notes: + Prefix: Note + Text: Respawns can be enabled for this mission. + PrefixColor: FF9900 + TextColor: FF9900 + +YURI: + Inherits@NameTag: ^NameTag + +BRUT: + Inherits@NameTag: ^NameTag + +IVAN: + Inherits@NameTag: ^NameTag + +THF: + Inherits@NameTag: ^NameTag + +YURI.Clone: + Inherits: YURI + RenderSprites: + Image: yuri + Selectable: + Class: yuri + -Encyclopedia: + Tooltip: + Name: Yuri Clone + +# Captured buildings provide proxy +^BasicBuilding: + CreateProxyActorForAllies: + RequiresPlayableOwner: False diff --git a/mods/ca/missions/coop-campaign/ca17-domination-coop/domination-coop.lua b/mods/ca/missions/coop-campaign/ca17-domination-coop/domination-coop.lua new file mode 100644 index 0000000000..802b9f382d --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca17-domination-coop/domination-coop.lua @@ -0,0 +1,58 @@ + +SetupPlayers = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Multi2 = Player.GetPlayer("Multi2") + Multi3 = Player.GetPlayer("Multi3") + Multi4 = Player.GetPlayer("Multi4") + Multi5 = Player.GetPlayer("Multi5") + USSR = Player.GetPlayer("USSR") + Nod = Player.GetPlayer("Nod") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = Utils.Where({ Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 }, function(p) return p ~= nil end) + MissionEnemies = { Nod } + SinglePlayerPlayer = USSR + StopSpread = true + CoopInit() +end + +AfterWorldLoaded = function() + Yuri.Owner = CoopPlayers[1] + + if #CoopPlayers >= 2 then + Ivan.Owner = CoopPlayers[2] + InitialBrute1.Owner = CoopPlayers[2] + InitialBrute2.Owner = CoopPlayers[2] + end + + if #CoopPlayers >= 3 then + InitialBrute1.Owner = CoopPlayers[3] + InitialBrute2.Owner = CoopPlayers[3] + end + + if #CoopPlayers >= 4 then + InitialBrute2.Owner = CoopPlayers[4] + end + + if #CoopPlayers >= 5 then + local extraBrute = Actor.Create(InitialBrute1.Type, true, { Owner = CoopPlayers[5], Location = InitialBrute1.Location }) + extraBrute.Scatter() + end + + if #CoopPlayers >= 6 then + local extraBrute = Actor.Create(InitialBrute2.Type, true, { Owner = CoopPlayers[6], Location = InitialBrute2.Location }) + extraBrute.Scatter() + end + + Trigger.AfterDelay(DateTime.Seconds(2), function() + StopSpread = false + end) +end + +AfterTick = function() + if #MissionPlayers >= 2 and not StopSpread then + Utils.Do(MissionPlayers[1].GetActorsByType("brut"), function(a) + a.Owner = USSR + end) + end +end diff --git a/mods/ca/missions/coop-campaign/ca17-domination-coop/map.bin b/mods/ca/missions/coop-campaign/ca17-domination-coop/map.bin new file mode 100644 index 0000000000..c55a4c864d Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca17-domination-coop/map.bin differ diff --git a/mods/ca/missions/coop-campaign/ca17-domination-coop/map.png b/mods/ca/missions/coop-campaign/ca17-domination-coop/map.png new file mode 100644 index 0000000000..3cdad4b933 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca17-domination-coop/map.png differ diff --git a/mods/ca/missions/coop-campaign/ca17-domination-coop/map.yaml b/mods/ca/missions/coop-campaign/ca17-domination-coop/map.yaml new file mode 100644 index 0000000000..c9e8796240 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca17-domination-coop/map.yaml @@ -0,0 +1,2417 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 17: Domination Co-op + +Author: Darkademic & Gandorques Hikla + +Tileset: DESERT + +MapSize: 114,92 + +Bounds: 1,1,112,90 + +Visibility: Lobby + +Categories: Co-op Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: USSR, Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + PlayerReference@USSR: + Name: USSR + Faction: soviet + Color: FE1100 + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Nod, Creeps + PlayerReference@Nod: + Name: Nod + Bot: campaign + Faction: nod + Color: 6D738C + Enemies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: FE1100 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Nod, Creeps + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: FF9922 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Nod, Creeps + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: 994050 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Nod, Creeps + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: 775A12 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Nod, Creeps + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: 82C900 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Nod, Creeps + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: DD1691 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Nod, Creeps + +Actors: + Actor6: sbag + Owner: Nod + Location: 12,25 + Actor7: sbag + Owner: Nod + Location: 11,25 + Actor8: sbag + Owner: Nod + Location: 10,25 + Actor9: sbag + Owner: Nod + Location: 9,25 + Actor10: sbag + Owner: Nod + Location: 9,26 + Actor11: sbag + Owner: Nod + Location: 9,27 + Actor12: sbag + Owner: Nod + Location: 19,25 + Actor13: sbag + Owner: Nod + Location: 20,25 + Actor14: sbag + Owner: Nod + Location: 21,25 + Actor15: sbag + Owner: Nod + Location: 18,25 + Actor16: sbag + Owner: Nod + Location: 22,25 + Actor17: sbag + Owner: Nod + Location: 23,25 + Actor18: sbag + Owner: Nod + Location: 24,25 + Actor19: sbag + Owner: Nod + Location: 24,26 + Actor20: sbag + Owner: Nod + Location: 24,27 + Actor21: sbag + Owner: Nod + Location: 9,28 + Actor22: sbag + Owner: Nod + Location: 9,29 + Actor23: sbag + Owner: Nod + Location: 24,28 + Actor24: sbag + Owner: Nod + Location: 24,29 + Actor25: sbag + Owner: Nod + Location: 24,33 + Actor26: sbag + Owner: Nod + Location: 24,34 + Actor27: sbag + Owner: Nod + Location: 9,33 + Actor28: sbag + Owner: Nod + Location: 9,34 + Actor29: sbag + Owner: Nod + Location: 9,35 + Actor30: sbag + Owner: Nod + Location: 9,36 + Actor31: sbag + Owner: Nod + Location: 11,36 + Actor32: sbag + Owner: Nod + Location: 10,36 + Actor33: sbag + Owner: Nod + Location: 12,36 + Actor34: sbag + Owner: Nod + Location: 13,36 + Actor35: sbag + Owner: Nod + Location: 18,36 + Actor36: sbag + Owner: Nod + Location: 19,36 + Actor37: sbag + Owner: Nod + Location: 21,36 + Actor38: sbag + Owner: Nod + Location: 20,36 + Actor39: sbag + Owner: Nod + Location: 22,36 + Actor40: sbag + Owner: Nod + Location: 23,36 + Actor41: sbag + Owner: Nod + Location: 24,36 + Actor42: sbag + Owner: Nod + Location: 24,35 + Actor53: n4 + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 18,30 + Actor56: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 20,35 + StartSAM2: nsam + Owner: Nod + Location: 21,26 + StartSAM1: nsam + Owner: Nod + Location: 11,35 + StartPower1: nuke + Owner: Nod + Location: 10,26 + Actor66: n1 + Owner: Nod + SubCell: 3 + Facing: 87 + Location: 17,17 + Thief: thf + Owner: USSR + SubCell: 3 + Location: 11,5 + Facing: 512 + Yuri: yuri + Owner: USSR + SubCell: 3 + Location: 11,7 + Facing: 512 + InitialBrute1: brut + Owner: USSR + SubCell: 3 + Location: 10,9 + Facing: 512 + InitialBrute2: brut + Owner: USSR + SubCell: 3 + Location: 12,9 + Facing: 512 + PlayerStart: waypoint + Owner: Neutral + Location: 11,7 + StartTurret1: gun.nod + Owner: Nod + Location: 18,24 + TurretFacing: 87 + StartFlameTank: ftnk + Owner: Nod + Location: 15,25 + Facing: 0 + Actor74: n1 + Owner: Nod + SubCell: 3 + Location: 13,18 + Facing: 0 + Actor75: n3 + Owner: Nod + SubCell: 3 + Facing: 793 + Location: 23,28 + Actor78: chain + Owner: Nod + Location: 2,76 + Actor79: chain + Owner: Nod + Location: 2,75 + Actor80: chain + Owner: Nod + Location: 2,74 + Actor81: chain + Owner: Nod + Location: 2,72 + Actor82: chain + Owner: Nod + Location: 2,73 + Actor83: chain + Owner: Nod + Location: 2,71 + Actor84: chain + Owner: Nod + Location: 2,70 + Actor85: chain + Owner: Nod + Location: 2,68 + Actor86: chain + Owner: Nod + Location: 2,69 + Actor87: chain + Owner: Nod + Location: 2,67 + Actor88: chain + Owner: Nod + Location: 3,67 + Actor89: chain + Owner: Nod + Location: 4,67 + Actor90: chain + Owner: Nod + Location: 5,67 + Actor91: chain + Owner: Nod + Location: 6,67 + Actor92: chain + Owner: Nod + Location: 2,77 + Actor93: chain + Owner: Nod + Location: 2,78 + Actor94: chain + Owner: Nod + Location: 2,79 + Actor95: chain + Owner: Nod + Location: 2,80 + Actor96: chain + Owner: Nod + Location: 2,81 + Actor97: chain + Owner: Nod + Location: 2,82 + Actor98: chain + Owner: Nod + Location: 2,84 + Actor99: chain + Owner: Nod + Location: 2,83 + Actor100: chain + Owner: Nod + Location: 2,85 + Actor101: chain + Owner: Nod + Location: 3,85 + Actor102: chain + Owner: Nod + Location: 4,85 + Actor103: chain + Owner: Nod + Location: 6,85 + Actor104: chain + Owner: Nod + Location: 5,85 + Actor105: chain + Owner: Nod + Location: 7,85 + Actor106: chain + Owner: Nod + Location: 8,85 + Actor107: chain + Owner: Nod + Location: 10,85 + Actor108: chain + Owner: Nod + Location: 9,85 + Actor109: chain + Owner: Nod + Location: 6,68 + Actor110: chain + Owner: Nod + Location: 7,68 + Actor111: chain + Owner: Nod + Location: 8,68 + Actor112: chain + Owner: Nod + Location: 9,68 + Actor113: chain + Owner: Nod + Location: 10,68 + Actor114: chain + Owner: Nod + Location: 10,69 + Actor115: chain + Owner: Nod + Location: 10,70 + Actor116: chain + Owner: Nod + Location: 10,71 + Actor117: chain + Owner: Nod + Location: 10,72 + Actor118: chain + Owner: Nod + Location: 10,84 + Actor119: chain + Owner: Nod + Location: 10,83 + Actor120: chain + Owner: Nod + Location: 10,81 + Actor121: chain + Owner: Nod + Location: 10,82 + Actor122: chain + Owner: Nod + Location: 10,80 + Actor123: chain + Owner: Nod + Location: 10,73 + Actor124: chain + Owner: Nod + Location: 10,74 + SouthWestPower4: nuk2 + Owner: Nod + Location: 3,74 + SouthWestPower5: nuk2 + Owner: Nod + Location: 5,74 + SouthWestPower6: nuk2 + Owner: Nod + Location: 7,74 + SouthWestPower1: nuk2 + Owner: Nod + Location: 3,70 + SouthWestPower2: nuk2 + Owner: Nod + Location: 5,70 + SouthWestPower3: nuk2 + Owner: Nod + Location: 7,70 + SouthWestSAM: nsam + Owner: Nod + Location: 3,68 + SouthWestTurret1: gun.nod + Owner: Nod + Location: 14,73 + TurretFacing: 840 + SouthWestTurret2: gun.nod + Owner: Nod + Location: 14,80 + TurretFacing: 761 + Actor140: tc01 + Owner: Neutral + Location: 5,46 + Actor141: tc01 + Owner: Neutral + Location: 23,68 + Actor143: rock2 + Owner: Neutral + Location: 20,54 + Actor142: rock6 + Owner: Neutral + Location: 21,79 + Actor144: t09 + Owner: Neutral + Location: 18,20 + Actor145: t09 + Owner: Neutral + Location: 19,60 + Actor129: rep + Owner: Nod + Location: 4,78 + Actor125: lasp + Owner: Nod + Location: 28,21 + Actor130: lasp + Owner: Nod + Location: 31,21 + Actor148: lasw + Owner: Nod + Location: 29,21 + Actor149: lasw + Owner: Nod + Location: 30,21 + Actor150: lasw + Owner: Nod + Location: 32,21 + Actor151: lasw + Owner: Nod + Location: 33,21 + Actor152: lasw + Owner: Nod + Location: 34,21 + Actor159: lasp + Owner: Nod + Location: 35,21 + Actor160: lasw + Owner: Nod + Location: 36,21 + Actor161: lasw + Owner: Nod + Location: 37,21 + Actor166: lasp + Owner: Nod + Location: 38,21 + CyberneticsLab: miss + Owner: Nod + Location: 44,44 + CenterSAM1: nsam + Owner: Nod + Location: 39,39 + CenterSAM2: nsam + Owner: Nod + Location: 38,51 + CenterSAM3: nsam + Owner: Nod + Location: 54,46 + CenterObelisk1: obli + Owner: Nod + Location: 41,38 + CenterObelisk2: obli + Owner: Nod + Location: 51,37 + CenterObelisk3: obli + Owner: Nod + Location: 40,53 + CenterObelisk4: obli + Owner: Nod + Location: 49,53 + Actor176: chain + Owner: Nod + Location: 43,46 + Actor177: chain + Owner: Nod + Location: 43,45 + Actor178: chain + Owner: Nod + Location: 43,44 + Actor179: chain + Owner: Nod + Location: 43,43 + Actor180: chain + Owner: Nod + Location: 44,43 + Actor181: chain + Owner: Nod + Location: 45,43 + Actor182: chain + Owner: Nod + Location: 46,43 + Actor183: chain + Owner: Nod + Location: 47,43 + Actor184: chain + Owner: Nod + Location: 47,44 + Actor185: chain + Owner: Nod + Location: 47,45 + Actor186: chain + Owner: Nod + Location: 47,46 + Actor187: chain + Owner: Nod + Location: 43,47 + Actor188: chain + Owner: Nod + Location: 44,47 + Actor189: chain + Owner: Nod + Location: 46,47 + Actor190: chain + Owner: Nod + Location: 47,47 + Actor191: lasp + Owner: Nod + Location: 43,36 + Actor192: lasp + Owner: Nod + Location: 49,36 + Actor193: lasp + Owner: Nod + Location: 41,54 + Actor194: lasp + Owner: Nod + Location: 47,54 + Actor195: lasw + Owner: Nod + Location: 42,54 + Actor196: lasw + Owner: Nod + Location: 43,54 + Actor197: lasw + Owner: Nod + Location: 44,54 + Actor198: lasw + Owner: Nod + Location: 45,54 + Actor199: lasw + Owner: Nod + Location: 46,54 + Actor200: lasw + Owner: Nod + Location: 44,36 + Actor201: lasw + Owner: Nod + Location: 45,36 + Actor202: lasw + Owner: Nod + Location: 47,36 + Actor203: lasw + Owner: Nod + Location: 46,36 + Actor204: lasw + Owner: Nod + Location: 48,36 + Actor205: enli + Owner: Nod + SubCell: 3 + Location: 11,74 + Facing: 793 + Actor206: enli + Owner: Nod + SubCell: 3 + Location: 11,80 + Facing: 785 + Actor208: n1c + Owner: Nod + SubCell: 3 + Facing: 610 + Location: 10,30 + Actor207: brik + Owner: Nod + Location: 72,70 + Actor209: brik + Owner: Nod + Location: 72,71 + Actor210: brik + Owner: Nod + Location: 72,72 + Actor211: brik + Owner: Nod + Location: 72,73 + Actor212: brik + Owner: Nod + Location: 72,74 + Actor213: brik + Owner: Nod + Location: 72,75 + Actor214: brik + Owner: Nod + Location: 72,83 + Actor215: brik + Owner: Nod + Location: 72,82 + Actor216: brik + Owner: Nod + Location: 72,81 + Actor217: brik + Owner: Nod + Location: 72,80 + Actor218: brik + Owner: Nod + Location: 72,78 + Actor219: brik + Owner: Nod + Location: 72,77 + Actor220: brik + Owner: Nod + Location: 72,76 + Actor221: brik + Owner: Nod + Location: 72,79 + Actor222: brik + Owner: Nod + Location: 72,84 + Actor223: brik + Owner: Nod + Location: 73,70 + Actor224: brik + Owner: Nod + Location: 75,70 + Actor225: brik + Owner: Nod + Location: 74,70 + Actor226: brik + Owner: Nod + Location: 76,70 + Actor227: brik + Owner: Nod + Location: 77,70 + Actor228: brik + Owner: Nod + Location: 79,70 + Actor229: brik + Owner: Nod + Location: 78,70 + Actor230: brik + Owner: Nod + Location: 80,70 + Actor231: brik + Owner: Nod + Location: 73,84 + Actor232: brik + Owner: Nod + Location: 74,84 + Actor233: brik + Owner: Nod + Location: 75,84 + Actor234: brik + Owner: Nod + Location: 76,84 + Actor235: brik + Owner: Nod + Location: 77,84 + Actor236: brik + Owner: Nod + Location: 79,84 + Actor237: brik + Owner: Nod + Location: 80,84 + Actor238: brik + Owner: Nod + Location: 78,84 + Actor239: brik + Owner: Nod + Location: 80,83 + Actor240: brik + Owner: Nod + Location: 79,83 + Actor241: brik + Owner: Nod + Location: 80,71 + Actor242: brik + Owner: Nod + Location: 79,71 + Actor243: brik + Owner: Nod + Location: 85,70 + Actor244: brik + Owner: Nod + Location: 85,71 + Actor245: brik + Owner: Nod + Location: 84,70 + Actor246: brik + Owner: Nod + Location: 84,71 + Actor247: brik + Owner: Nod + Location: 86,70 + Actor248: brik + Owner: Nod + Location: 87,70 + Actor249: brik + Owner: Nod + Location: 88,70 + Actor250: brik + Owner: Nod + Location: 90,70 + Actor251: brik + Owner: Nod + Location: 89,70 + Actor252: brik + Owner: Nod + Location: 91,70 + Actor253: brik + Owner: Nod + Location: 92,70 + Actor254: brik + Owner: Nod + Location: 93,70 + Actor255: brik + Owner: Nod + Location: 94,70 + Actor256: brik + Owner: Nod + Location: 94,71 + Actor257: brik + Owner: Nod + Location: 94,72 + Actor258: brik + Owner: Nod + Location: 84,83 + Actor259: brik + Owner: Nod + Location: 84,84 + Actor260: brik + Owner: Nod + Location: 85,84 + Actor261: brik + Owner: Nod + Location: 85,83 + Actor262: brik + Owner: Nod + Location: 86,84 + Actor263: brik + Owner: Nod + Location: 87,84 + Actor264: brik + Owner: Nod + Location: 88,84 + Actor265: brik + Owner: Nod + Location: 89,84 + Actor266: brik + Owner: Nod + Location: 90,84 + Actor267: brik + Owner: Nod + Location: 91,84 + Actor268: brik + Owner: Nod + Location: 92,84 + Actor269: brik + Owner: Nod + Location: 93,84 + Actor270: brik + Owner: Nod + Location: 94,75 + Actor271: brik + Owner: Nod + Location: 94,74 + Actor272: brik + Owner: Nod + Location: 94,73 + Actor273: brik + Owner: Nod + Location: 93,75 + Actor274: brik + Owner: Nod + Location: 93,74 + Actor275: brik + Owner: Nod + Location: 93,79 + Actor276: brik + Owner: Nod + Location: 94,79 + Actor277: brik + Owner: Nod + Location: 93,80 + Actor278: brik + Owner: Nod + Location: 94,80 + Actor279: brik + Owner: Nod + Location: 94,81 + Actor280: brik + Owner: Nod + Location: 94,82 + Actor281: brik + Owner: Nod + Location: 94,83 + Actor282: brik + Owner: Nod + Location: 94,84 + Actor284: hand + Owner: Nod + Location: 88,71 + Actor286: gun.nod + Owner: Nod + Location: 79,69 + TurretFacing: 15 + Actor287: gun.nod + Owner: Nod + Location: 85,69 + TurretFacing: 0 + SouthEastPower2: nuk2 + Owner: Nod + Location: 73,74 + SouthEastPower1: nuk2 + Owner: Nod + Location: 73,71 + SouthEastObelisk1: obli + Owner: Nod + Location: 78,71 + SouthEastObelisk2: obli + Owner: Nod + Location: 86,71 + Actor295: hq + Owner: Nod + Location: 88,81 + SouthEastSAM2: nsam + Owner: Nod + Location: 92,71 + SouthEastSAM1: nsam + Owner: Nod + Location: 75,71 + SouthEastSAM4: nsam + Owner: Nod + Location: 76,83 + SouthEastSAM3: nsam + Owner: Nod + Location: 92,83 + SouthEastObelisk3: obli + Owner: Nod + Location: 93,73 + SouthEastObelisk4: obli + Owner: Nod + Location: 93,81 + Actor305: gun.nod + Owner: Nod + Location: 95,80 + TurretFacing: 753 + Actor306: gun.nod + Owner: Nod + Location: 95,74 + TurretFacing: 808 + Actor307: sbag + Owner: Nod + Location: 70,44 + Actor308: sbag + Owner: Nod + Location: 70,45 + Actor309: sbag + Owner: Nod + Location: 70,46 + Actor310: sbag + Owner: Nod + Location: 70,47 + Actor311: sbag + Owner: Nod + Location: 68,47 + Actor312: sbag + Owner: Nod + Location: 69,47 + Actor313: sbag + Owner: Nod + Location: 67,47 + Actor314: sbag + Owner: Nod + Location: 66,47 + Actor315: sbag + Owner: Nod + Location: 65,47 + Actor316: sbag + Owner: Nod + Location: 64,47 + Actor317: sbag + Owner: Nod + Location: 63,47 + Actor318: sbag + Owner: Nod + Location: 62,47 + Actor319: sbag + Owner: Nod + Location: 62,46 + Actor320: sbag + Owner: Nod + Location: 62,44 + Actor321: sbag + Owner: Nod + Location: 62,43 + Actor322: sbag + Owner: Nod + Location: 62,42 + Actor323: sbag + Owner: Nod + Location: 62,41 + Actor324: sbag + Owner: Nod + Location: 62,40 + Actor325: sbag + Owner: Nod + Location: 62,39 + Actor326: sbag + Owner: Nod + Location: 62,38 + Actor327: sbag + Owner: Nod + Location: 62,37 + Actor328: sbag + Owner: Nod + Location: 63,37 + Actor329: sbag + Owner: Nod + Location: 64,37 + Actor330: sbag + Owner: Nod + Location: 70,41 + Actor331: sbag + Owner: Nod + Location: 70,40 + Actor332: sbag + Owner: Nod + Location: 70,39 + Actor333: sbag + Owner: Nod + Location: 70,42 + Actor334: sbag + Owner: Nod + Location: 70,38 + Actor335: sbag + Owner: Nod + Location: 70,37 + Actor336: sbag + Owner: Nod + Location: 68,37 + Actor337: sbag + Owner: Nod + Location: 67,37 + Actor338: sbag + Owner: Nod + Location: 66,37 + Actor339: sbag + Owner: Nod + Location: 65,37 + Actor340: sbag + Owner: Nod + Location: 69,37 + Actor341: rep + Owner: Nod + Location: 65,40 + Actor342: brl3 + Owner: Nod + Location: 69,46 + Actor343: barl + Owner: Nod + Location: 69,45 + Actor344: brl3 + Owner: Nod + Location: 68,45 + Actor345: barl + Owner: Nod + Location: 68,46 + Actor346: barl + Owner: Nod + Location: 69,38 + Actor347: brl3 + Owner: Nod + Location: 69,39 + Actor348: ammobox1 + Owner: Nod + Location: 67,46 + Actor349: ammobox3 + Owner: Nod + Location: 68,38 + Actor350: n6 + Owner: Nod + SubCell: 3 + Location: 64,44 + Facing: 499 + Actor351: n6 + Owner: Nod + Location: 66,39 + SubCell: 3 + Facing: 610 + Actor352: nsam + Owner: Nod + Location: 63,38 + Actor353: nsam + Owner: Nod + Location: 63,46 + Actor354: split2 + Owner: Neutral + Location: 104,74 + Actor355: split2 + Owner: Neutral + Location: 105,86 + Actor356: split2 + Owner: Neutral + Location: 101,83 + Actor357: split2 + Owner: Neutral + Location: 72,88 + Actor358: brik + Owner: Nod + Location: 66,16 + Actor359: brik + Owner: Nod + Location: 66,15 + Actor360: brik + Owner: Nod + Location: 66,14 + Actor361: brik + Owner: Nod + Location: 66,13 + Actor362: brik + Owner: Nod + Location: 67,16 + Actor363: brik + Owner: Nod + Location: 68,16 + Actor364: brik + Owner: Nod + Location: 69,16 + Actor365: brik + Owner: Nod + Location: 69,15 + Actor366: brik + Owner: Nod + Location: 68,15 + Actor367: brik + Owner: Nod + Location: 73,16 + Actor368: brik + Owner: Nod + Location: 73,15 + Actor369: brik + Owner: Nod + Location: 74,15 + Actor370: brik + Owner: Nod + Location: 74,16 + Actor371: brik + Owner: Nod + Location: 75,16 + Actor372: brik + Owner: Nod + Location: 76,16 + Actor373: brik + Owner: Nod + Location: 76,15 + Actor374: brik + Owner: Nod + Location: 76,14 + Actor375: brik + Owner: Nod + Location: 76,13 + Actor376: brik + Owner: Nod + Location: 76,12 + Actor377: brik + Owner: Nod + Location: 78,12 + Actor378: brik + Owner: Nod + Location: 77,12 + Actor379: brik + Owner: Nod + Location: 66,12 + Actor380: brik + Owner: Nod + Location: 65,12 + Actor381: brik + Owner: Nod + Location: 64,12 + Actor383: brik + Owner: Nod + Location: 62,11 + Actor384: brik + Owner: Nod + Location: 63,11 + Actor385: brik + Owner: Nod + Location: 62,10 + Actor386: brik + Owner: Nod + Location: 62,9 + Actor387: brik + Owner: Nod + Location: 61,9 + Actor388: brik + Owner: Nod + Location: 61,8 + Actor389: brik + Owner: Nod + Location: 61,7 + Actor390: brik + Owner: Nod + Location: 78,11 + Actor391: brik + Owner: Nod + Location: 79,11 + Actor392: brik + Owner: Nod + Location: 81,11 + Actor393: brik + Owner: Nod + Location: 80,11 + Actor394: brik + Owner: Nod + Location: 82,11 + Actor395: brik + Owner: Nod + Location: 82,10 + Actor396: brik + Owner: Nod + Location: 82,9 + Actor397: brik + Owner: Nod + Location: 82,8 + Actor398: brik + Owner: Nod + Location: 82,7 + Actor399: brik + Owner: Nod + Location: 82,6 + Actor400: brik + Owner: Nod + Location: 61,6 + Actor401: brik + Owner: Nod + Location: 61,5 + Actor402: brik + Owner: Nod + Location: 61,4 + Actor403: brik + Owner: Nod + Location: 61,3 + Actor404: brik + Owner: Nod + Location: 62,3 + Actor405: brik + Owner: Nod + Location: 62,2 + Actor406: brik + Owner: Nod + Location: 62,1 + Actor407: brik + Owner: Nod + Location: 82,5 + Actor408: brik + Owner: Nod + Location: 82,4 + Actor409: brik + Owner: Nod + Location: 82,3 + Actor410: brik + Owner: Nod + Location: 82,2 + Actor411: brik + Owner: Nod + Location: 82,1 + Actor412: brik + Owner: Nod + Location: 63,1 + Actor413: brik + Owner: Nod + Location: 64,1 + Actor414: brik + Owner: Nod + Location: 65,1 + Actor415: brik + Owner: Nod + Location: 66,1 + Actor416: brik + Owner: Nod + Location: 67,1 + Actor417: brik + Owner: Nod + Location: 68,1 + Actor418: brik + Owner: Nod + Location: 69,1 + Actor419: brik + Owner: Nod + Location: 70,1 + Actor420: brik + Owner: Nod + Location: 72,1 + Actor421: brik + Owner: Nod + Location: 71,1 + Actor422: brik + Owner: Nod + Location: 74,1 + Actor423: brik + Owner: Nod + Location: 73,1 + Actor424: brik + Owner: Nod + Location: 75,1 + Actor425: brik + Owner: Nod + Location: 77,1 + Actor426: brik + Owner: Nod + Location: 78,1 + Actor427: brik + Owner: Nod + Location: 76,1 + Actor428: brik + Owner: Nod + Location: 79,1 + Actor429: brik + Owner: Nod + Location: 81,1 + Actor430: brik + Owner: Nod + Location: 80,1 + NorthObelisk3: obli + Owner: Nod + Location: 67,15 + NorthObelisk4: obli + Owner: Nod + Location: 75,15 + NorthPower4: nuk2 + Owner: Nod + Location: 80,8 + NorthPower2: nuk2 + Owner: Nod + Location: 80,5 + TempleOfNod: tmpl + Owner: Nod + Location: 70,5 + NorthHand1: hand + Owner: Nod + Location: 66,8 + Actor438: hand + Owner: Nod + Location: 75,8 + Actor440: hq + Owner: Nod + Location: 62,6 + Actor441: airs + Owner: Nod + Location: 70,9 + NorthPower1: nuk2 + Owner: Nod + Location: 78,5 + NorthPower3: nuk2 + Owner: Nod + Location: 78,8 + Actor445: gun.nod + Owner: Nod + Location: 68,19 + TurretFacing: 483 + Actor446: gun.nod + Owner: Nod + Location: 74,19 + TurretFacing: 570 + NorthSAM1: nsam + Owner: Nod + Location: 67,6 + NorthSAM2: nsam + Owner: Nod + Location: 74,6 + NorthObelisk1: obli + Owner: Nod + Location: 68,4 + NorthObelisk2: obli + Owner: Nod + Location: 74,4 + Actor451: arty.nod + Owner: Nod + Location: 36,83 + Facing: 911 + Actor453: n3c + Owner: Nod + SubCell: 3 + Location: 41,57 + Facing: 618 + Actor454: t18 + Owner: Neutral + Location: 45,72 + Actor455: t18 + Owner: Neutral + Location: 76,59 + Actor457: t18 + Owner: Neutral + Location: 96,34 + Actor458: t18 + Owner: Neutral + Location: 106,24 + Actor459: t18 + Owner: Neutral + Location: 95,2 + Actor460: t08 + Owner: Neutral + Location: 79,19 + Actor461: t08 + Owner: Neutral + Location: 56,25 + Actor462: t08 + Owner: Neutral + Location: 74,38 + Actor463: t08 + Owner: Neutral + Location: 92,48 + Actor464: t08 + Owner: Neutral + Location: 63,79 + Actor465: t08 + Owner: Neutral + Location: 39,62 + Actor466: t08 + Owner: Neutral + Location: 20,83 + Actor467: t08 + Owner: Neutral + Location: 3,26 + Actor468: t08 + Owner: Neutral + Location: 45,9 + Actor469: t09 + Owner: Neutral + Location: 35,31 + Actor470: t09 + Owner: Neutral + Location: 28,72 + Actor471: t04 + Owner: Neutral + Location: 14,56 + Actor472: t04 + Owner: Neutral + Location: 40,84 + Actor473: t04 + Owner: Neutral + Location: 67,71 + Actor474: v32 + Owner: Neutral + Location: 8,45 + Actor475: v24 + Owner: Neutral + Location: 2,35 + Actor476: rock6 + Owner: Neutral + Location: 83,46 + Actor477: rock4 + Owner: Neutral + Location: 87,45 + Actor478: t09 + Owner: Neutral + Location: 81,44 + Actor479: rock2 + Owner: Neutral + Location: 109,19 + Actor480: t18 + Owner: Neutral + Location: 109,5 + Actor481: t04 + Owner: Neutral + Location: 110,10 + Actor482: t08 + Owner: Neutral + Location: 108,4 + Actor483: v31 + Owner: Neutral + Location: 98,2 + Actor488: rock3 + Owner: Neutral + Location: 55,88 + Actor489: rock3 + Owner: Neutral + Location: 28,80 + Actor490: rock5 + Owner: Neutral + Location: 28,67 + Actor491: t04 + Owner: Neutral + Location: 3,54 + Actor492: rock5 + Owner: Neutral + Location: 11,69 + Actor493: rock4 + Owner: Neutral + Location: 13,83 + Actor495: n1 + Owner: Nod + SubCell: 3 + Location: 12,47 + Facing: 777 + Actor496: n1 + Owner: Nod + SubCell: 3 + Location: 17,48 + Facing: 864 + Actor497: n4 + Owner: Nod + SubCell: 3 + Location: 14,50 + Facing: 816 + Actor498: mech + Owner: Nod + SubCell: 3 + Location: 3,78 + Facing: 682 + Actor499: mech + Owner: Nod + SubCell: 3 + Location: 7,80 + Facing: 71 + Actor500: n1 + Owner: Nod + SubCell: 3 + Location: 52,41 + Facing: 539 + Actor501: n1 + Owner: Nod + Location: 52,41 + SubCell: 1 + Facing: 610 + Actor502: n1 + Owner: Nod + SubCell: 3 + Location: 54,40 + Facing: 384 + Actor503: n3 + Owner: Nod + SubCell: 3 + Location: 53,42 + Facing: 150 + Actor504: n4 + Owner: Nod + SubCell: 3 + Location: 53,41 + Facing: 384 + NodPatroller1a: n4 + Owner: Nod + SubCell: 3 + Location: 20,62 + Facing: 384 + NodPatroller1c: n4 + Owner: Nod + SubCell: 3 + Location: 21,63 + Facing: 384 + NodPatroller1b: n1 + Owner: Nod + SubCell: 3 + Location: 19,63 + Facing: 384 + NodPatroller2b: n1 + Owner: Nod + SubCell: 3 + Location: 20,69 + Facing: 384 + NodPatroller2a: n1 + Owner: Nod + SubCell: 3 + Location: 21,68 + Facing: 384 + NodPatroller2c: n4 + Owner: Nod + SubCell: 3 + Location: 22,69 + Facing: 384 + NodPatrol1a: waypoint + Owner: Neutral + Location: 21,63 + NodPatrol1b: waypoint + Owner: Neutral + Location: 6,61 + NodPatrol1c: waypoint + Owner: Neutral + Location: 5,53 + NodPatrol1d: waypoint + Owner: Neutral + Location: 10,49 + NodPatrol2a: waypoint + Owner: Neutral + Location: 21,65 + NodPatrol2b: waypoint + Owner: Neutral + Location: 21,77 + Actor505: ltnk + Owner: Nod + Location: 49,32 + Facing: 128 + Actor506: bggy + Owner: Nod + Facing: 384 + Location: 36,12 + Actor507: mlrs + Owner: Nod + Facing: 384 + Location: 90,26 + FirstStealthTank: stnk.nod + Owner: Nod + Location: 48,66 + Stance: Defend + Facing: 245 + Actor509: ltnk + Owner: Nod + Location: 86,66 + Facing: 128 + Actor510: bggy + Owner: Nod + Facing: 384 + Location: 75,45 + Actor511: n1 + Owner: Nod + Location: 88,74 + SubCell: 3 + Facing: 384 + Actor512: n1 + Owner: Nod + SubCell: 3 + Location: 87,73 + Facing: 602 + Actor513: n1 + Owner: Nod + Facing: 384 + Location: 88,74 + SubCell: 1 + Actor514: n1 + Owner: Nod + SubCell: 3 + Location: 88,75 + Facing: 142 + Actor515: n1 + Owner: Nod + SubCell: 3 + Location: 91,74 + Facing: 602 + Actor516: e3 + Owner: Nod + SubCell: 3 + Location: 89,74 + Facing: 563 + Actor517: n1 + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 76,45 + Actor518: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 74,44 + Actor519: n1 + Owner: Nod + SubCell: 3 + Location: 85,66 + Facing: 0 + Actor520: n1 + Owner: Nod + SubCell: 3 + Location: 87,63 + Facing: 206 + Actor521: n3 + Owner: Nod + SubCell: 3 + Location: 35,79 + Facing: 793 + Actor522: n3 + Owner: Nod + SubCell: 3 + Location: 39,83 + Facing: 71 + Actor525: afac + Owner: Nod + Location: 79,2 + Actor526: hpad.td + Owner: Nod + Location: 63,2 + Actor528: silo.td + Owner: Nod + Location: 76,2 + Actor529: rmbc + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 82,80 + Actor530: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 71,28 + Actor531: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 67,29 + Actor532: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 66,27 + Actor534: n1 + Owner: Nod + Facing: 384 + Location: 73,28 + SubCell: 1 + Actor533: n1 + Owner: Nod + Facing: 384 + Location: 69,28 + SubCell: 1 + NodPatroller3b: n1 + Owner: Nod + SubCell: 3 + Location: 60,79 + Facing: 785 + NodPatroller3a: n1 + Owner: Nod + Location: 60,79 + SubCell: 1 + Facing: 896 + NodPatroller3d: n1 + Owner: Nod + SubCell: 3 + Location: 61,82 + Facing: 872 + Actor538: bh + Owner: Nod + SubCell: 3 + Location: 72,13 + Facing: 507 + Actor539: tplr + Owner: Nod + Location: 50,57 + SubCell: 3 + Facing: 384 + Actor527: n1 + Owner: Nod + SubCell: 3 + Location: 39,49 + Facing: 674 + Actor540: n1 + Owner: Nod + SubCell: 3 + Location: 50,52 + Facing: 384 + Actor541: n1 + Owner: Nod + SubCell: 3 + Location: 38,45 + Facing: 864 + Actor542: n4 + Owner: Nod + SubCell: 3 + Location: 54,49 + Facing: 190 + NodPatroller3c: n4 + Owner: Nod + SubCell: 3 + Location: 61,80 + Facing: 1023 + NodPatrol3a: waypoint + Owner: Neutral + Location: 60,81 + NodPatrol3b: waypoint + Owner: Neutral + Location: 64,76 + NodPatrol3c: waypoint + Owner: Neutral + Location: 64,64 + Actor536: ftnk + Owner: Nod + Facing: 384 + Location: 94,9 + NodPatroller4b: bike + Owner: Nod + Location: 68,58 + Facing: 808 + NodPatroller4a: bike + Owner: Nod + Location: 70,57 + Facing: 737 + NodPatroller4c: bike + Owner: Nod + Location: 67,56 + Facing: 753 + NodPatrol4a: waypoint + Owner: Neutral + Location: 69,56 + NodPatrol4b: waypoint + Owner: Neutral + Location: 94,60 + NodPatrol4c: waypoint + Owner: Neutral + Location: 101,47 + NodPatrol4d: waypoint + Owner: Neutral + Location: 93,35 + NodPatrol4e: waypoint + Owner: Neutral + Location: 72,36 + Actor535: split2 + Owner: Neutral + Location: 102,32 + Actor543: v33 + Owner: Neutral + Location: 107,59 + Actor544: v32 + Owner: Neutral + Location: 102,60 + Actor545: v31 + Owner: Neutral + Location: 108,56 + Actor546: t08 + Owner: Neutral + Location: 107,63 + Actor547: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 93,51 + Actor548: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 101,55 + Actor549: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 90,21 + Actor550: n1 + Owner: Nod + SubCell: 3 + Location: 95,17 + Facing: 0 + Actor551: n1 + Owner: Nod + SubCell: 3 + Location: 96,8 + Facing: 515 + Actor552: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 92,7 + Actor553: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 103,18 + Actor555: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 110,59 + Actor556: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 81,75 + Actor557: n4 + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 79,54 + Actor558: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 69,21 + Actor559: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 75,11 + Actor560: n1 + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 66,11 + Actor561: n1 + Owner: Nod + SubCell: 3 + Location: 68,9 + Facing: 666 + Actor562: n1 + Owner: Nod + Facing: 384 + Location: 65,9 + SubCell: 3 + Actor563: n1 + Owner: Nod + Facing: 384 + Location: 66,11 + SubCell: 1 + SouthEastPower4: nuk2 + Owner: Nod + Location: 73,81 + SouthEastPower3: nuk2 + Owner: Nod + Location: 73,78 + Actor564: afac + Owner: Nod + Location: 76,79 + Actor565: wtnk + Owner: Nod + Facing: 384 + Location: 31,29 + EvacSpawn: waypoint + Owner: Neutral + Location: 100,1 + EvacLanding: waypoint + Owner: Neutral + Location: 94,23 + Actor567: rmbc + Owner: Nod + SubCell: 3 + Location: 82,72 + Facing: 0 + Actor568: tplr + SubCell: 3 + Location: 59,70 + Owner: Nod + Facing: 150 + Actor569: n1 + Owner: Nod + SubCell: 3 + Location: 38,68 + Facing: 0 + Actor571: n1 + Owner: Nod + SubCell: 3 + Location: 36,69 + Facing: 761 + Actor572: n1 + Owner: Nod + Location: 36,69 + SubCell: 1 + Facing: 967 + Actor570: ltnk + Owner: Nod + Facing: 384 + Location: 93,38 + Actor573: ltnk + Owner: Nod + Location: 63,23 + Facing: 650 + Actor574: stnk.nod + Owner: Nod + Facing: 384 + Location: 74,26 + Actor575: bggy + Owner: Nod + Location: 79,65 + Facing: 0 + Actor576: ltnk + Owner: Nod + Location: 97,77 + Facing: 777 + Actor577: n1 + Owner: Nod + SubCell: 3 + Location: 15,79 + Facing: 840 + Actor578: n1 + Owner: Nod + SubCell: 3 + Location: 14,75 + Facing: 689 + Actor579: n1 + Owner: Nod + Location: 15,74 + SubCell: 3 + Facing: 832 + Actor580: n3 + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 22,81 + Actor581: n4 + Owner: Nod + SubCell: 3 + Location: 8,76 + Facing: 697 + Actor582: n1 + Owner: Nod + Location: 17,37 + SubCell: 3 + Facing: 384 + Actor583: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 14,37 + Actor584: n1 + Owner: Nod + SubCell: 3 + Location: 13,25 + Facing: 0 + Actor587: n1 + Owner: Nod + Location: 17,25 + SubCell: 2 + Facing: 0 + Actor585: n1 + Owner: Nod + SubCell: 3 + Location: 34,29 + Facing: 404 + Actor588: n3 + Owner: Nod + SubCell: 3 + Facing: 118 + Location: 20,13 + HardOnlyAcolyte1: acol + Owner: Nod + SubCell: 3 + Location: 32,8 + Facing: 555 + HardOnlyAcolyte2: acol + Owner: Nod + SubCell: 3 + Location: 34,7 + Facing: 384 + HardOnlyChemWarrior1: n5 + Owner: Nod + SubCell: 3 + Location: 45,18 + Facing: 0 + HardOnlyChemWarrior2: n5 + Owner: Nod + SubCell: 3 + Location: 47,16 + Facing: 87 + SouthStealthTank: stnk.nod + Owner: Nod + Stance: Defend + Location: 50,81 + Facing: 245 + HealCrate2: healcrate + Owner: Neutral + Location: 111,50 + HealCrate1: healcrate + Owner: Neutral + Location: 58,41 + Actor590: n5 + Owner: Nod + Location: 92,52 + SubCell: 1 + Facing: 384 + Actor589: n5 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 84,28 + Actor591: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 75,19 + HardOnlyAcolyte3: acol + Owner: Nod + SubCell: 3 + Location: 45,50 + Facing: 384 + Actor592: split2 + Owner: Nod + Location: 23,7 + HealCrate3: healcrate + Owner: Neutral + Location: 30,89 + Actor593: ftnk + Owner: Nod + Location: 65,62 + Facing: 384 + Actor594: ftnk + Owner: Nod + Location: 69,65 + Facing: 384 + Actor595: n5 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 42,9 + Actor596: n4 + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 31,23 + Actor597: n4 + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 35,23 + Actor598: n5 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 42,70 + Actor599: n5 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 60,69 + Actor601: n3 + Owner: Nod + SubCell: 3 + Location: 74,14 + Facing: 467 + Actor602: n3 + Owner: Nod + SubCell: 3 + Location: 75,13 + Facing: 650 + Actor537: bh + Owner: Nod + SubCell: 3 + Location: 70,13 + Facing: 578 + Actor603: n4 + Owner: Nod + SubCell: 3 + Location: 16,49 + Facing: 864 + Actor605: n4 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 3,59 + Actor606: enli + Owner: Nod + SubCell: 3 + Location: 69,19 + Facing: 384 + Actor607: enli + Owner: Nod + SubCell: 3 + Location: 73,19 + Facing: 650 + Actor608: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 97,9 + Actor609: n1 + Owner: Nod + SubCell: 3 + Location: 82,41 + Facing: 174 + Actor610: n1 + Owner: Nod + Location: 83,40 + SubCell: 3 + Facing: 0 + Actor611: n1 + Owner: Nod + Location: 83,40 + SubCell: 1 + Facing: 182 + Actor612: n1 + Owner: Nod + SubCell: 3 + Location: 84,39 + Facing: 0 + Actor613: n1 + Owner: Nod + SubCell: 3 + Location: 84,42 + Facing: 31 + Actor614: n5 + Owner: Nod + SubCell: 3 + Location: 84,40 + Facing: 71 + Actor616: n4 + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 104,26 + Actor617: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 100,51 + Actor618: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 68,28 + Actor620: n4 + Owner: Nod + Location: 72,12 + SubCell: 1 + Facing: 384 + Actor615: n3 + Owner: Nod + SubCell: 3 + Location: 13,46 + Facing: 602 + StartTurret2: gun.nod + Owner: Nod + Location: 11,37 + TurretFacing: 618 + StartPower2: nuke + Owner: Nod + Location: 19,33 + StartLightTank: ltnk + Owner: Nod + Location: 15,31 + Facing: 0 + Actor619: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 10,37 + EasyGren1: e2 + Owner: USSR + SubCell: 3 + Location: 10,6 + Facing: 512 + EasyGren2: e2 + Owner: USSR + SubCell: 3 + Location: 12,6 + Facing: 512 + StartTurret3: gun.nod + Owner: Nod + Location: 8,34 + TurretFacing: 166 + Actor624: bggy + Owner: Nod + Facing: 384 + Location: 6,27 + Ivan: ivan + Owner: USSR + SubCell: 3 + Location: 11,9 + Facing: 512 + Actor621: gun.nod + Owner: Nod + Location: 56,72 + TurretFacing: 745 + HardOnlyTurret1: gun.nod + Owner: Nod + Location: 38,23 + TurretFacing: 404 + Actor622: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 100,7 + Actor623: n1 + SubCell: 3 + Location: 53,68 + Facing: 206 + Owner: Nod + Actor625: n1 + SubCell: 3 + Location: 54,67 + Facing: 87 + Owner: Nod + Actor626: hq + Owner: Nod + Location: 3,82 + Actor627: silo.td + Owner: Nod + Location: 6,84 + Actor628: silo.td + Owner: Nod + Location: 8,84 + Actor629: arty.nod + Owner: Nod + Facing: 384 + Location: 106,42 + Actor630: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 102,40 + Actor631: airs + Owner: Nod + Location: 81,76 + Actor632: proc.td + Owner: Nod + Location: 87,76 + Actor633: n1 + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 67,13 + Actor634: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 68,10 + Actor639: n1 + Owner: Nod + Facing: 384 + Location: 67,11 + SubCell: 4 + Actor635: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 72,17 + Actor636: n1 + Owner: Nod + SubCell: 3 + Location: 97,21 + Facing: 126 + Actor637: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 103,9 + Actor638: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 104,18 + Actor640: tplr + Owner: Nod + SubCell: 3 + Location: 72,29 + Facing: 626 + Actor641: ltnk + Owner: Nod + Facing: 384 + Location: 95,52 + Actor642: mech + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 68,42 + Actor643: rmbc + Owner: Nod + SubCell: 3 + Facing: 674 + Location: 69,7 + Actor644: ftnk + Owner: Nod + Facing: 261 + Location: 72,8 + EntranceReveal2: waypoint + Owner: Neutral + Location: 82,69 + EntranceReveal1: waypoint + Owner: Neutral + Location: 15,76 + EntranceReveal3: waypoint + Owner: Neutral + Location: 71,19 + MidRespawn: waypoint + Owner: Neutral + Location: 46,40 + Actor645: mlrs + Owner: Nod + Location: 69,5 + Facing: 512 + Actor646: mlrs + Owner: Nod + Location: 73,5 + Facing: 512 + NodAssassin3: assa + Owner: Nod + SubCell: 3 + Location: 65,7 + Facing: 384 + NodAssassin2: assa + Owner: Nod + SubCell: 3 + Location: 72,3 + Facing: 491 + NodAssassin1: assa + Owner: Nod + Location: 74,10 + SubCell: 3 + Facing: 634 + NorthSAM4: nsam + Owner: Nod + Location: 76,11 + NorthSAM3: nsam + Owner: Nod + Location: 64,11 + Actor649: brik + Owner: Nod + Location: 63,12 + CommandoTrigger1: waypoint + Owner: Neutral + Location: 72,48 + CommandoTrigger2: waypoint + Owner: Neutral + Location: 99,48 + Actor647: bggy + Owner: Nod + Location: 67,77 + Facing: 128 + Actor648: bggy + Owner: Nod + Location: 78,77 + Facing: 0 + Actor650: bggy + Owner: Nod + Location: 91,75 + Facing: 384 + Actor651: bggy + Owner: Nod + Facing: 384 + Location: 90,61 + LeftObelisk: obli + Owner: Nod + Location: 36,20 + LaserFenceReveal: waypoint + Owner: Neutral + Location: 33,22 + StartHand: hand + Owner: Nod + Location: 17,27 + StartComms: hq + Owner: Nod + Location: 22,33 + MidHand: hand + Owner: Nod + Location: 52,38 + MidComms: hq + Owner: Nod + Location: 51,50 + Actor652: camera + Owner: Nod + Location: 32,12 + Actor653: camera + Owner: Nod + Location: 50,61 + Actor654: camera + Owner: Nod + Location: 72,38 + Actor655: camera + Owner: Nod + Location: 71,20 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-doctrines.yaml, ca|rules/custom/commando-mission.yaml, ca|missions/main-campaign/ca17-domination/domination-rules.yaml, ca|rules/custom/coop-rules.yaml, domination-coop-rules.yaml + +Sequences: ca|missions/main-campaign/ca17-domination/domination-sequences.yaml + +Weapons: ca|weapons/custom/campaign.yaml, ca|missions/main-campaign/ca17-domination/domination-weapons.yaml diff --git a/mods/ca/missions/coop-campaign/ca18-succession-coop/map.bin b/mods/ca/missions/coop-campaign/ca18-succession-coop/map.bin new file mode 100644 index 0000000000..257774db10 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca18-succession-coop/map.bin differ diff --git a/mods/ca/missions/coop-campaign/ca18-succession-coop/map.png b/mods/ca/missions/coop-campaign/ca18-succession-coop/map.png new file mode 100644 index 0000000000..2708fc9523 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca18-succession-coop/map.png differ diff --git a/mods/ca/missions/coop-campaign/ca18-succession-coop/map.yaml b/mods/ca/missions/coop-campaign/ca18-succession-coop/map.yaml new file mode 100644 index 0000000000..6457363c82 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca18-succession-coop/map.yaml @@ -0,0 +1,3156 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 18: Succession Co-op + +Author: Darkademic & Gandorques Hikla + +Tileset: DESERT + +MapSize: 130,130 + +Bounds: 1,1,128,128 + +Visibility: Lobby + +Categories: Co-op Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: USSR, Nod, Nod2, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + PlayerReference@USSR: + Name: USSR + Faction: soviet + Color: FE1100 + Allies: SpyPlaneProvider, USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Nod, Nod2, Creeps + PlayerReference@Nod: + Name: Nod + Bot: campaign + Faction: nod + Color: 6D738C + Allies: Nod2 + Enemies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@Nod2: + Name: Nod2 + Bot: campaign + Faction: nod + Color: 6D738C + Allies: Nod + Enemies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@SpyPlaneProvider: + Name: SpyPlaneProvider + NonCombatant: True + Faction: soviet + Color: FE1100 + Allies: USSR + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: FE1100 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, SpyPlaneProvider + Enemies: Nod, Nod2, Creeps + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: FF9922 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, SpyPlaneProvider + Enemies: Nod, Nod2, Creeps + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: 994050 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, SpyPlaneProvider + Enemies: Nod, Nod2, Creeps + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: 775A12 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, SpyPlaneProvider + Enemies: Nod, Nod2, Creeps + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: 82C900 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, SpyPlaneProvider + Enemies: Nod, Nod2, Creeps + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: DD1691 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, SpyPlaneProvider + Enemies: Nod, Nod2, Creeps + +Actors: + Actor44: rock2 + Owner: Neutral + Location: 10,34 + Actor45: t18 + Owner: Neutral + Location: 25,33 + Actor47: t08 + Owner: Neutral + Location: 37,35 + Actor48: t08 + Owner: Neutral + Location: 9,37 + Actor49: t08 + Owner: Neutral + Location: 111,37 + Actor50: rock4 + Owner: Neutral + Location: 41,39 + Actor52: t09 + Owner: Neutral + Location: 25,40 + Actor55: rock1 + Owner: Neutral + Location: 40,40 + Actor57: t04 + Owner: Neutral + Location: 7,42 + Actor58: tc01 + Owner: Neutral + Location: 60,42 + Actor64: rock6 + Owner: Neutral + Location: 76,45 + Actor65: t08 + Owner: Neutral + Location: 13,47 + Actor66: t04 + Owner: Neutral + Location: 119,46 + Actor67: t04 + Owner: Neutral + Location: 101,47 + Actor70: tc01 + Owner: Neutral + Location: 18,48 + Actor74: t09 + Owner: Neutral + Location: 5,52 + Actor75: rock2 + Owner: Neutral + Location: 107,52 + Actor77: t04 + Owner: Neutral + Location: 21,53 + Actor78: t08 + Owner: Neutral + Location: 39,54 + Actor79: rock4 + Owner: Neutral + Location: 57,55 + Actor81: split2 + Owner: Neutral + Location: 95,56 + Actor82: t08 + Owner: Neutral + Location: 19,58 + Actor83: tc01 + Owner: Neutral + Location: 33,57 + Actor84: t08 + Owner: Neutral + Location: 56,59 + Actor85: tc01 + Owner: Neutral + Location: 84,58 + Actor86: tc01 + Owner: Neutral + Location: 109,58 + Actor87: tc01 + Owner: Neutral + Location: 5,59 + Actor88: rock6 + Owner: Neutral + Location: 113,64 + Actor89: t09 + Owner: Neutral + Location: 59,68 + Actor90: rock7 + Owner: Neutral + Location: 93,68 + Actor91: t08 + Owner: Neutral + Location: 113,69 + Actor92: t08 + Owner: Neutral + Location: 8,70 + Actor93: t08 + Owner: Neutral + Location: 103,70 + Actor94: rock2 + Owner: Neutral + Location: 32,73 + Actor95: t09 + Owner: Neutral + Location: 43,73 + Actor96: split2 + Owner: Neutral + Location: 53,73 + Actor97: split2 + Owner: Neutral + Location: 46,75 + Actor98: tc01 + Owner: Neutral + Location: 92,74 + Actor99: rock1 + Owner: Neutral + Location: 10,76 + Actor100: rock3 + Owner: Neutral + Location: 24,76 + Actor101: split2 + Owner: Neutral + Location: 113,77 + Actor102: rock6 + Owner: Neutral + Location: 54,78 + Actor103: tc01 + Owner: Neutral + Location: 38,79 + Actor104: tc01 + Owner: Neutral + Location: 109,79 + Actor105: obli + Owner: Nod + Location: 74,81 + Actor106: tc01 + Owner: Neutral + Location: 13,81 + Actor107: nsam + Owner: Nod + Location: 71,82 + Actor108: t08 + Owner: Neutral + Location: 86,82 + Actor109: rock1 + Owner: Neutral + Location: 64,82 + Actor110: mlrs + Owner: Nod + Facing: 919 + Location: 72,84 + Actor111: rock4 + Owner: Neutral + Location: 103,84 + Actor112: ltnk + Owner: Nod + Facing: 0 + Location: 62,85 + Actor113: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 77,85 + Actor114: n1 + Owner: Nod + SubCell: 1 + Facing: 0 + Location: 77,85 + Actor115: split2 + Owner: Neutral + Location: 19,86 + Actor116: n1 + Owner: Nod + SubCell: 3 + Facing: 142 + Location: 62,86 + Actor117: n1 + Owner: Nod + SubCell: 1 + Facing: 0 + Location: 62,86 + Actor118: n3 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 71,86 + Actor119: ltnk + Owner: Nod + Facing: 0 + Location: 78,86 + Actor120: n1 + Owner: Nod + SubCell: 3 + Facing: 39 + Location: 80,86 + Actor121: t09 + Owner: Neutral + Location: 83,86 + Actor122: n1 + Owner: Nod + SubCell: 3 + Facing: 919 + Location: 85,86 + Actor123: n1 + Owner: Nod + SubCell: 1 + Facing: 745 + Location: 85,86 + Actor124: ltnk + Owner: Nod + Facing: 118 + Location: 49,87 + Actor125: ltnk + Owner: Nod + Facing: 0 + Location: 56,87 + Actor126: n1 + Owner: Nod + SubCell: 3 + Facing: 39 + Location: 59,87 + Actor127: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 77,87 + Actor128: n3 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 79,87 + Actor129: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 81,87 + Actor130: ltnk + Owner: Nod + Facing: 0 + Location: 85,87 + Actor131: n1 + Owner: Nod + SubCell: 3 + Facing: 721 + Location: 87,87 + Actor132: rock1 + Owner: Neutral + Location: 124,86 + Actor133: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 48,88 + Actor134: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 50,88 + Actor135: n1 + Owner: Nod + SubCell: 1 + Facing: 198 + Location: 50,88 + Actor136: gun.nod + Owner: Nod + TurretFacing: 118 + Location: 54,88 + Actor137: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 56,88 + Actor138: gun.nod + Owner: Nod + TurretFacing: 0 + Location: 60,88 + Actor139: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 61,88 + Actor140: nsam + Owner: Nod + Location: 66,88 + Actor141: gun.nod + Owner: Nod + Location: 50,89 + Actor142: brik + Owner: Nod + Location: 51,89 + Actor143: brik + Owner: Nod + Location: 52,89 + Actor144: brik + Owner: Nod + Location: 53,89 + Actor145: brik + Owner: Nod + Location: 54,89 + Actor146: brik + Owner: Nod + Location: 55,89 + Actor147: brik + Owner: Nod + Location: 59,89 + Actor148: brik + Owner: Nod + Location: 60,89 + Actor149: brik + Owner: Nod + Location: 61,89 + Actor150: brik + Owner: Nod + Location: 62,89 + Actor151: brik + Owner: Nod + Location: 63,89 + Actor152: mlrs + Owner: Nod + Facing: 95 + Location: 64,89 + Actor153: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 65,89 + Actor154: gun.nod + Owner: Nod + TurretFacing: 15 + Location: 80,89 + Actor155: n3 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 85,89 + Actor156: gun.nod + Owner: Nod + TurretFacing: 0 + Location: 86,89 + Actor158: t08 + Owner: Neutral + Location: 28,90 + Actor159: n1 + Owner: Nod + SubCell: 3 + Facing: 174 + Location: 46,90 + Actor160: n1 + Owner: Nod + SubCell: 3 + Facing: 198 + Location: 49,90 + Actor161: brik + Owner: Nod + Location: 51,90 + Actor162: brik + Owner: Nod + Location: 52,90 + Actor163: obli + Owner: Nod + Location: 53,90 + Actor164: brik + Owner: Nod + Location: 54,90 + Actor165: brik + Owner: Nod + Location: 55,90 + Actor166: n4 + Owner: Nod + SubCell: 3 + Facing: 15 + Location: 57,90 + Actor167: brik + Owner: Nod + Location: 59,90 + Actor168: brik + Owner: Nod + Location: 60,90 + Actor169: obli + Owner: Nod + Location: 61,90 + Actor170: brik + Owner: Nod + Location: 62,90 + Actor171: brik + Owner: Nod + Location: 63,90 + Actor172: n3 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 73,90 + Actor173: brik + Owner: Nod + Location: 76,90 + Actor174: brik + Owner: Nod + Location: 77,90 + Actor175: brik + Owner: Nod + Location: 78,90 + Actor176: brik + Owner: Nod + Location: 79,90 + Actor177: brik + Owner: Nod + Location: 80,90 + Actor178: brik + Owner: Nod + Location: 81,90 + Actor179: brik + Owner: Nod + Location: 85,90 + Actor180: brik + Owner: Nod + Location: 86,90 + Actor181: brik + Owner: Nod + Location: 87,90 + Actor182: t08 + Owner: Neutral + Location: 126,90 + Actor183: rock4 + Owner: Neutral + Location: 14,91 + Actor184: ltnk + Owner: Nod + Facing: 111 + Location: 45,91 + Actor185: n4 + Owner: Nod + SubCell: 3 + Facing: 182 + Location: 48,91 + Actor186: n3 + Owner: Nod + SubCell: 3 + Facing: 158 + Location: 50,91 + Actor187: n3 + Owner: Nod + SubCell: 3 + Facing: 7 + Location: 56,91 + Actor188: airs + Owner: Nod + Location: 67,91 + Actor189: brik + Owner: Nod + Location: 76,91 + Actor190: brik + Owner: Nod + Location: 77,91 + Actor191: obli + Owner: Nod + Location: 79,91 + Actor192: brik + Owner: Nod + Location: 80,91 + Actor193: brik + Owner: Nod + Location: 81,91 + Actor194: brik + Owner: Nod + Location: 85,91 + Actor195: brik + Owner: Nod + Location: 86,91 + Actor196: brik + Owner: Nod + Location: 87,91 + Actor197: n1 + Owner: Nod + SubCell: 3 + Facing: 277 + Location: 44,92 + Actor198: gun.nod + Owner: Nod + Location: 46,92 + Actor199: n4 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 84,92 + Actor200: obli + Owner: Nod + Location: 86,92 + Actor201: brik + Owner: Nod + Location: 87,92 + Actor202: t08 + Owner: Neutral + Location: 111,92 + Actor203: brik + Owner: Nod + Location: 43,93 + Actor204: brik + Owner: Nod + Location: 44,93 + Actor205: brik + Owner: Nod + Location: 45,93 + Actor206: brik + Owner: Nod + Location: 46,93 + Actor207: brik + Owner: Nod + Location: 47,93 + Actor208: nuk2 + Owner: Nod + Location: 62,93 + Actor209: nuk2 + Owner: Nod + Location: 64,93 + Actor210: rep + Owner: Nod + Location: 73,93 + Actor211: n4 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 80,93 + Actor213: brik + Owner: Nod + Location: 86,93 + Actor214: brik + Owner: Nod + Location: 87,93 + Actor215: rock4 + Owner: Neutral + Location: 28,94 + Actor216: t09 + Owner: Neutral + Location: 35,94 + Actor217: ltnk + Owner: Nod + Facing: 256 + Location: 40,94 + Actor218: n1 + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 41,94 + Actor219: n1 + Owner: Nod + SubCell: 1 + Facing: 150 + Location: 41,94 + Actor220: brik + Owner: Nod + Location: 43,94 + Actor221: brik + Owner: Nod + Location: 44,94 + Actor222: obli + Owner: Nod + Location: 45,94 + Actor223: brik + Owner: Nod + Location: 46,94 + Actor224: brik + Owner: Nod + Location: 47,94 + Actor225: mlrs + Owner: Nod + Facing: 126 + Location: 49,94 + Actor226: hftk + Owner: Nod + Facing: 118 + Location: 52,94 + Actor227: hand + Owner: Nod + Location: 56,94 + Actor228: n3 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 85,94 + Actor229: brik + Owner: Nod + Location: 86,94 + Actor230: t18 + Owner: Neutral + Location: 122,93 + Actor231: rock5 + Owner: Neutral + Location: 12,95 + Actor232: brik + Owner: Nod + Location: 43,95 + Actor233: obli + Owner: Nod + Location: 44,95 + Actor234: nsam + Owner: Nod + Location: 59,95 + Actor235: hand + Owner: Nod + Location: 79,95 + Actor236: brik + Owner: Nod + Location: 86,95 + Actor237: tc01 + Owner: Neutral + Location: 102,94 + Actor238: rock4 + Owner: Neutral + Location: 127,95 + Actor239: n1 + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 41,96 + Actor240: gun.nod + Owner: Nod + TurretFacing: 245 + Location: 42,96 + Actor241: brik + Owner: Nod + Location: 43,96 + Actor242: brik + Owner: Nod + Location: 44,96 + Actor243: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 45,96 + Actor244: nsam + Owner: Nod + Location: 46,96 + Actor245: brik + Owner: Nod + Location: 86,96 + Actor246: brik + Owner: Nod + Location: 87,96 + Actor247: brik + Owner: Nod + Location: 43,97 + Actor248: brik + Owner: Nod + Location: 44,97 + Actor249: chain + Owner: Nod + Location: 62,97 + Actor250: chain + Owner: Nod + Location: 63,97 + Actor251: chain + Owner: Nod + Location: 64,97 + Actor252: chain + Owner: Nod + Location: 65,97 + Actor253: chain + Owner: Nod + Location: 66,97 + Actor254: chain + Owner: Nod + Location: 67,97 + Actor255: chain + Owner: Nod + Location: 68,97 + Actor256: chain + Owner: Nod + Location: 69,97 + Actor257: chain + Owner: Nod + Location: 70,97 + Actor258: chain + Owner: Nod + Location: 71,97 + Actor259: hq + Owner: Nod + Location: 75,97 + Actor260: brik + Owner: Nod + Location: 86,97 + Actor261: brik + Owner: Nod + Location: 87,97 + Actor262: chain + Owner: Nod + Location: 62,98 + Actor263: nuk2 + Owner: Nod + Location: 63,98 + Actor264: nuk2 + Owner: Nod + Location: 65,98 + Actor265: nuk2 + Owner: Nod + Location: 67,98 + Actor266: nuk2 + Owner: Nod + Location: 69,98 + Actor267: chain + Owner: Nod + Location: 71,98 + Actor268: ltnk + Owner: Nod + Facing: 256 + Location: 38,99 + Actor269: n4 + Owner: Nod + SubCell: 3 + Facing: 190 + Location: 42,99 + Actor270: nuk2 + Owner: Nod + Location: 53,99 + Actor271: nuk2 + Owner: Nod + Location: 55,99 + Actor272: afac + Owner: Nod + Location: 58,99 + Actor273: chain + Owner: Nod + Location: 62,99 + Actor274: chain + Owner: Nod + Location: 71,99 + Actor275: nsam + Owner: Nod + Location: 85,99 + Actor280: proc.td + Owner: Nod + Location: 87,99 + Actor282: chain + Owner: Nod + Location: 62,100 + Actor283: chain + Owner: Nod + Location: 71,100 + Actor284: nuk2 + Owner: Nod + Location: 79,100 + Actor285: n1 + Owner: Nod + SubCell: 3 + Facing: 158 + Location: 42,101 + Actor286: n1 + Owner: Nod + SubCell: 1 + Facing: 190 + Location: 42,101 + Actor288: brik + Owner: Nod + Location: 43,101 + Actor289: brik + Owner: Nod + Location: 44,101 + Actor291: chain + Owner: Nod + Location: 62,101 + Actor295: nuk2 + Owner: Nod + Location: 63,101 + Actor297: nuk2 + Owner: Nod + Location: 65,101 + Actor298: nuk2 + Owner: Nod + Location: 67,101 + Actor299: nuk2 + Owner: Nod + Location: 69,101 + Actor303: chain + Owner: Nod + Location: 71,101 + Actor304: gun.nod + Owner: Nod + TurretFacing: 245 + Location: 42,102 + Actor305: brik + Owner: Nod + Location: 43,102 + Actor306: brik + Owner: Nod + Location: 44,102 + Actor307: n3 + Owner: Nod + SubCell: 3 + Facing: 610 + Location: 46,102 + Actor308: n3 + Owner: Nod + Facing: 384 + SubCell: 1 + Location: 46,102 + Actor311: hand + Owner: Nod + Location: 50,102 + Actor312: chain + Owner: Nod + Location: 62,102 + Actor340: chain + Owner: Nod + Location: 71,102 + Actor341: brik + Owner: Nod + Location: 43,103 + Actor342: obli + Owner: Nod + Location: 44,103 + Actor343: chain + Owner: Nod + Location: 62,103 + Actor344: chain + Owner: Nod + Location: 71,103 + Actor345: nuk2 + Owner: Nod + Location: 79,103 + Actor346: rock6 + Owner: Neutral + Location: 22,103 + Actor347: n1 + Owner: Nod + SubCell: 3 + Facing: 206 + Location: 41,104 + Actor348: brik + Owner: Nod + Location: 43,104 + Actor349: mlrs + Owner: Nod + Facing: 253 + Location: 45,104 + Actor350: nsam + Owner: Nod + Location: 46,104 + Actor351: chain + Owner: Nod + Location: 62,104 + Actor352: chain + Owner: Nod + Location: 63,104 + Actor353: chain + Owner: Nod + Location: 64,104 + Actor354: chain + Owner: Nod + Location: 65,104 + Actor355: chain + Owner: Nod + Location: 66,104 + Actor356: chain + Owner: Nod + Location: 67,104 + Actor357: chain + Owner: Nod + Location: 68,104 + Actor358: chain + Owner: Nod + Location: 69,104 + Actor359: chain + Owner: Nod + Location: 70,104 + Actor360: chain + Owner: Nod + Location: 71,104 + Actor361: proc.td + Owner: Nod + Location: 85,104 + Actor362: brik + Owner: Nod + Location: 43,105 + Actor363: obli + Owner: Nod + Location: 55,105 + Actor364: nsam + Owner: Nod + Location: 89,105 + Actor365: brik + Owner: Nod + Location: 43,106 + Actor366: obli + Owner: Nod + Location: 44,106 + Actor367: brik + Owner: Nod + Location: 90,106 + Actor368: brik + Owner: Nod + Location: 91,106 + Actor369: split2 + Owner: Neutral + Location: 99,106 + Actor370: n1 + Owner: Nod + SubCell: 3 + Facing: 222 + Location: 41,107 + Actor371: n1 + Owner: Nod + SubCell: 1 + Facing: 237 + Location: 41,107 + Actor372: gun.nod + Owner: Nod + TurretFacing: 277 + Location: 42,107 + Actor373: brik + Owner: Nod + Location: 43,107 + Actor374: brik + Owner: Nod + Location: 44,107 + Actor375: tmpl + Owner: Nod + Location: 64,107 + Actor376: mlrs + Owner: Nod + Facing: 634 + Location: 89,107 + Actor377: brik + Owner: Nod + Location: 90,107 + Actor378: brik + Owner: Nod + Location: 91,107 + Actor379: ltnk + Owner: Nod + Facing: 256 + Location: 40,108 + Actor380: n1 + Owner: Nod + SubCell: 3 + Facing: 214 + Location: 41,108 + Actor381: brik + Owner: Nod + Location: 43,108 + Actor382: brik + Owner: Nod + Location: 44,108 + Actor383: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 46,108 + Actor384: rep + Owner: Nod + Location: 49,108 + Actor385: nsam + Owner: Nod + Location: 61,108 + Actor386: waypoint + Owner: Neutral + Location: 65,108 + Actor387: nsam + Owner: Nod + Location: 68,108 + Actor388: hpad.td + Owner: Nod + Location: 78,108 + Actor389: brik + Owner: Nod + Location: 91,108 + Actor390: t08 + Owner: Neutral + Location: 109,108 + Actor391: tc01 + Owner: Neutral + Location: 27,108 + Actor392: rock1 + Owner: Neutral + Location: 56,108 + Actor393: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 87,109 + Actor394: obli + Owner: Nod + Location: 90,109 + Actor395: brik + Owner: Nod + Location: 91,109 + Actor396: rock1 + Owner: Neutral + Location: 116,108 + Actor397: obli + Owner: Nod + Location: 74,110 + Actor398: hpad.td + Owner: Nod + Location: 81,110 + Actor399: hftk + Owner: Nod + Facing: 658 + Location: 86,110 + Actor400: brik + Owner: Nod + Location: 90,110 + Actor401: brik + Owner: Nod + Location: 91,110 + Actor402: gun.nod + Owner: Nod + TurretFacing: 769 + Location: 92,110 + Actor403: n4 + Owner: Nod + SubCell: 3 + Facing: 317 + Location: 42,111 + Actor404: ltur + Owner: Nod + TurretFacing: 245 + Location: 56,111 + CyborgFactory1: bio + Owner: Nod + Location: 63,111 + CyborgFactory2: bio + Owner: Nod + Location: 66,111 + Actor407: brik + Owner: Nod + Location: 90,111 + Actor408: brik + Owner: Nod + Location: 91,111 + Actor409: tc01 + Owner: Neutral + Location: 121,110 + Actor410: t08 + Owner: Neutral + Location: 35,112 + Actor411: n1 + Owner: Nod + SubCell: 3 + Location: 42,112 + Facing: 190 + Actor412: brik + Owner: Nod + Location: 43,112 + Actor413: brik + Owner: Nod + Location: 44,112 + Actor414: nsam + Owner: Nod + Location: 58,112 + Actor415: nsam + Owner: Nod + Location: 71,112 + Actor416: hpad.td + Owner: Nod + Location: 78,112 + Actor417: n1 + Owner: Nod + SubCell: 3 + Facing: 856 + Location: 92,112 + Actor418: n1 + Owner: Nod + SubCell: 1 + Facing: 793 + Location: 92,112 + Actor419: ltnk + Owner: Nod + Facing: 256 + Location: 40,113 + Actor420: gun.nod + Owner: Nod + Location: 42,113 + Actor421: brik + Owner: Nod + Location: 43,113 + Actor422: brik + Owner: Nod + Location: 44,113 + Actor423: n3 + Owner: Nod + SubCell: 3 + Facing: 301 + Location: 45,113 + Actor424: airs + Owner: Nod + Location: 49,113 + Actor425: ltur + Owner: Nod + TurretFacing: 721 + Location: 75,113 + Actor427: n3 + Owner: Nod + SubCell: 3 + Facing: 721 + Location: 89,113 + Actor428: n4 + Owner: Nod + SubCell: 3 + Facing: 745 + Location: 90,113 + Actor429: n1 + Owner: Nod + SubCell: 3 + Facing: 206 + Location: 41,114 + Actor430: n1 + Owner: Nod + SubCell: 1 + Facing: 198 + Location: 41,114 + Actor431: brik + Owner: Nod + Location: 43,114 + Actor432: obli + Owner: Nod + Location: 44,114 + Actor433: gun.nod + Owner: Nod + TurretFacing: 777 + Location: 92,114 + Actor434: brik + Owner: Nod + Location: 43,115 + Actor435: mlrs + Owner: Nod + Facing: 261 + Location: 45,115 + Actor436: nsam + Owner: Nod + Location: 46,115 + TemplePrime: tmpp + Owner: Nod + Location: 64,114 + Actor438: rock4 + Owner: Neutral + Location: 22,116 + Actor439: brik + Owner: Nod + Location: 43,116 + Actor440: ltnk + Owner: Nod + Facing: 753 + Location: 90,116 + Actor441: n1 + Owner: Nod + SubCell: 3 + Facing: 737 + Location: 92,116 + Actor442: brik + Owner: Nod + Location: 43,117 + Actor443: obli + Owner: Nod + Location: 44,117 + Actor444: ltur + Owner: Nod + TurretFacing: 293 + Location: 57,117 + Actor446: ltur + Owner: Nod + TurretFacing: 745 + Location: 73,117 + Actor447: n4 + Owner: Nod + SubCell: 3 + Facing: 737 + Location: 89,117 + Actor448: n3 + Owner: Nod + SubCell: 3 + Facing: 864 + Location: 90,117 + Actor449: n1 + Owner: Nod + SubCell: 3 + Facing: 626 + Location: 92,117 + Actor450: brik + Owner: Nod + Location: 43,118 + Actor451: brik + Owner: Nod + Location: 44,118 + Actor452: nuk2 + Owner: Nod + Location: 50,118 + Actor453: nuk2 + Owner: Nod + Location: 52,118 + Actor454: nuk2 + Owner: Nod + Location: 54,118 + CyborgFactory3: bio + Owner: Nod + Location: 63,118 + CyborgFactory4: bio + Owner: Nod + Location: 66,118 + Actor457: nuk2 + Owner: Nod + Location: 75,118 + Actor458: brik + Owner: Nod + Location: 90,118 + Actor459: brik + Owner: Nod + Location: 91,118 + Actor460: n1 + Owner: Nod + SubCell: 3 + Facing: 872 + Location: 93,118 + Actor461: n1 + Owner: Nod + SubCell: 1 + Facing: 785 + Location: 93,118 + Actor462: split2 + Owner: Neutral + Location: 111,118 + Actor463: brik + Owner: Nod + Location: 43,119 + Actor464: brik + Owner: Nod + Location: 44,119 + Actor465: obli + Owner: Nod + Location: 61,119 + Actor466: obli + Owner: Nod + Location: 69,119 + Actor467: nsam + Owner: Nod + Location: 87,119 + Actor468: brik + Owner: Nod + Location: 90,119 + Actor469: brik + Owner: Nod + Location: 91,119 + Actor470: gun.nod + Owner: Nod + TurretFacing: 785 + Location: 92,119 + Actor471: nsam + Owner: Nod + Location: 57,120 + Actor472: nsam + Owner: Nod + Location: 72,120 + Actor473: nuk2 + Owner: Nod + Location: 77,120 + Actor474: mlrs + Owner: Nod + Facing: 769 + Location: 88,120 + Actor475: obli + Owner: Nod + Location: 90,120 + Actor476: brik + Owner: Nod + Location: 91,120 + Actor477: brik + Owner: Nod + Location: 91,121 + Actor478: brik + Owner: Nod + Location: 81,122 + Actor479: brik + Owner: Nod + Location: 82,122 + Actor480: nuk2 + Owner: Nod + Location: 86,122 + Actor481: nuk2 + Owner: Nod + Location: 88,122 + Actor482: brik + Owner: Nod + Location: 90,122 + Actor483: brik + Owner: Nod + Location: 91,122 + Actor484: rock4 + Owner: Neutral + Location: 45,123 + Actor485: brik + Owner: Nod + Location: 81,123 + Actor486: brik + Owner: Nod + Location: 82,123 + Actor487: brik + Owner: Nod + Location: 83,123 + Actor488: brik + Owner: Nod + Location: 84,123 + Actor489: brik + Owner: Nod + Location: 90,123 + Actor490: brik + Owner: Nod + Location: 91,123 + Actor491: split2 + Owner: Neutral + Location: 101,123 + Actor492: split2 + Owner: Neutral + Location: 123,123 + Actor493: tc01 + Owner: Neutral + Location: 34,123 + Actor494: rock2 + Owner: Neutral + Location: 50,124 + Actor495: brik + Owner: Nod + Location: 84,124 + Actor496: brik + Owner: Nod + Location: 90,124 + Actor497: brik + Owner: Nod + Location: 84,125 + Actor498: nuk2 + Owner: Nod + Location: 86,125 + Actor499: nuk2 + Owner: Nod + Location: 88,125 + Actor500: brik + Owner: Nod + Location: 90,125 + Actor501: tc01 + Owner: Neutral + Location: 47,125 + Actor502: brik + Owner: Nod + Location: 84,126 + Actor503: brik + Owner: Nod + Location: 90,126 + Actor504: brik + Owner: Nod + Location: 84,127 + Actor505: brik + Owner: Nod + Location: 85,127 + Actor506: brik + Owner: Nod + Location: 90,127 + Actor507: brik + Owner: Nod + Location: 85,128 + Actor508: brik + Owner: Nod + Location: 86,128 + Actor509: brik + Owner: Nod + Location: 87,128 + Actor510: brik + Owner: Nod + Location: 88,128 + Actor511: brik + Owner: Nod + Location: 89,128 + Actor512: brik + Owner: Nod + Location: 90,128 + Actor513: split2 + Owner: Neutral + Location: 6,22 + Actor514: split2 + Owner: Neutral + Location: 5,16 + Actor515: split2 + Owner: Neutral + Location: 115,13 + Actor516: split2 + Owner: Neutral + Location: 121,11 + Actor445: split2 + Owner: Neutral + Location: 54,22 + Actor517: split2 + Owner: Neutral + Location: 60,23 + Actor518: tc01 + Owner: Neutral + Location: 71,27 + Actor519: tc01 + Owner: Neutral + Location: 33,24 + Actor521: tc01 + Owner: Neutral + Location: 103,9 + Actor522: tc01 + Owner: Neutral + Location: 112,22 + Actor523: rock6 + Owner: Neutral + Location: 93,25 + Actor524: rock2 + Owner: Neutral + Location: 96,18 + Actor525: rock7 + Owner: Neutral + Location: 27,18 + Actor526: t08 + Owner: Neutral + Location: 74,18 + Actor527: t08 + Owner: Neutral + Location: 98,20 + Actor528: t08 + Owner: Neutral + Location: 123,3 + Actor529: t08 + Owner: Neutral + Location: 126,18 + Actor530: t08 + Owner: Neutral + Location: 17,19 + Actor531: rock6 + Owner: Neutral + Location: 30,15 + Actor520: mcv + Owner: USSR + Location: 47,4 + Facing: 523 + Yuri: yuri + Owner: USSR + SubCell: 3 + Location: 47,10 + Facing: 384 + Actor532: rmbc + Owner: USSR + SubCell: 3 + Location: 45,12 + Facing: 512 + Actor533: rmbc + Owner: USSR + SubCell: 3 + Facing: 512 + Location: 46,12 + Actor534: rmbc + Owner: USSR + SubCell: 3 + Facing: 512 + Location: 47,12 + Actor535: rmbc + Owner: USSR + SubCell: 3 + Facing: 512 + Location: 48,12 + Actor536: rmbc + Owner: USSR + SubCell: 3 + Facing: 512 + Location: 50,12 + Actor537: rmbc + Owner: USSR + SubCell: 3 + Facing: 512 + Location: 49,12 + Actor538: rmbc + Owner: USSR + SubCell: 3 + Facing: 512 + Location: 44,12 + Actor539: tplr + Owner: USSR + SubCell: 3 + Location: 47,13 + Facing: 512 + Actor540: tplr + Owner: USSR + SubCell: 3 + Facing: 512 + Location: 46,13 + Actor541: tplr + Owner: USSR + SubCell: 3 + Facing: 512 + Location: 45,13 + Actor542: tplr + Owner: USSR + SubCell: 3 + Facing: 512 + Location: 44,13 + Actor543: tplr + Owner: USSR + SubCell: 3 + Facing: 512 + Location: 48,13 + Actor544: tplr + Owner: USSR + SubCell: 3 + Facing: 512 + Location: 49,13 + Actor545: tplr + Owner: USSR + SubCell: 3 + Facing: 512 + Location: 50,13 + Actor546: brut + Owner: USSR + SubCell: 3 + Location: 46,10 + Facing: 512 + Actor547: brut + Owner: USSR + Location: 48,10 + SubCell: 3 + Facing: 512 + Actor559: n1c + Owner: USSR + Location: 44,16 + SubCell: 1 + Facing: 512 + Actor560: n1c + Owner: USSR + Location: 44,16 + SubCell: 2 + Facing: 512 + Actor561: n1c + Owner: USSR + Location: 44,16 + SubCell: 4 + Facing: 512 + Actor562: n1c + Owner: USSR + Location: 44,16 + SubCell: 5 + Facing: 512 + Actor557: n3c + Owner: USSR + Location: 46,15 + SubCell: 1 + Facing: 512 + Actor558: n3c + Owner: USSR + Location: 46,15 + SubCell: 2 + Facing: 512 + Actor563: n3c + Owner: USSR + Location: 46,15 + SubCell: 4 + Facing: 512 + Actor564: n3c + Owner: USSR + Location: 46,15 + SubCell: 5 + Facing: 512 + Actor548: n3c + Owner: USSR + SubCell: 1 + Facing: 512 + Location: 48,15 + Actor565: n3c + Owner: USSR + SubCell: 2 + Facing: 512 + Location: 48,15 + Actor566: n3c + Owner: USSR + SubCell: 4 + Facing: 512 + Location: 48,15 + Actor567: n3c + Owner: USSR + SubCell: 5 + Facing: 512 + Location: 48,15 + Actor551: n1c + Owner: USSR + SubCell: 1 + Facing: 512 + Location: 47,16 + Actor568: n1c + Owner: USSR + SubCell: 2 + Facing: 512 + Location: 47,16 + Actor569: n1c + Owner: USSR + SubCell: 4 + Facing: 512 + Location: 47,16 + Actor570: n1c + Owner: USSR + SubCell: 5 + Facing: 512 + Location: 47,16 + Actor554: n1c + Owner: USSR + SubCell: 1 + Facing: 512 + Location: 50,16 + Actor571: n1c + Owner: USSR + SubCell: 2 + Facing: 512 + Location: 50,16 + Actor572: n1c + Owner: USSR + SubCell: 4 + Facing: 512 + Location: 50,16 + Actor573: n1c + Owner: USSR + SubCell: 5 + Facing: 512 + Location: 50,16 + Actor549: n1c + Owner: USSR + SubCell: 3 + Facing: 512 + Location: 49,16 + Actor550: n1c + Owner: USSR + SubCell: 3 + Facing: 512 + Location: 48,16 + Actor552: n1c + Owner: USSR + SubCell: 3 + Facing: 512 + Location: 46,16 + Actor553: n1c + Owner: USSR + SubCell: 3 + Facing: 512 + Location: 45,16 + Actor555: n1c + Owner: USSR + SubCell: 3 + Facing: 512 + Location: 43,16 + Actor556: n1c + Owner: USSR + SubCell: 3 + Facing: 512 + Location: 51,16 + Actor574: enli + Owner: USSR + SubCell: 3 + Location: 45,9 + Facing: 512 + Actor575: enli + Owner: USSR + SubCell: 3 + Facing: 512 + Location: 49,9 + Actor576: afac + Owner: Nod + Location: 83,113 + Actor577: barb + Owner: Nod + Location: 53,66 + Actor578: barb + Owner: Nod + Location: 53,65 + Actor579: barb + Owner: Nod + Location: 54,65 + Actor580: barb + Owner: Nod + Location: 55,65 + Actor581: barb + Owner: Nod + Location: 55,66 + Actor582: barb + Owner: Nod + Location: 58,66 + Actor583: barb + Owner: Nod + Location: 58,65 + Actor584: barb + Owner: Nod + Location: 59,65 + Actor585: barb + Owner: Nod + Location: 60,65 + Actor586: barb + Owner: Nod + Location: 60,66 + Actor587: barb + Owner: Nod + Location: 32,65 + Actor588: barb + Owner: Nod + Location: 32,66 + Actor589: barb + Owner: Nod + Location: 31,65 + Actor590: barb + Owner: Nod + Location: 30,65 + Actor591: barb + Owner: Nod + Location: 29,65 + Actor592: barb + Owner: Nod + Location: 28,65 + Actor593: barb + Owner: Nod + Location: 28,66 + Actor594: barb + Owner: Nod + Location: 36,66 + Actor595: barb + Owner: Nod + Location: 36,65 + Actor596: barb + Owner: Nod + Location: 37,65 + Actor597: barb + Owner: Nod + Location: 39,65 + Actor598: barb + Owner: Nod + Location: 38,65 + Actor599: barb + Owner: Nod + Location: 39,66 + Actor605: gun.nod + Location: 54,64 + TurretFacing: 0 + Owner: Nod2 + Actor611: barb + Owner: Nod + Location: 101,59 + Actor612: barb + Owner: Nod + Location: 101,60 + Actor613: barb + Owner: Nod + Location: 101,58 + Actor614: barb + Owner: Nod + Location: 102,58 + Actor615: barb + Owner: Nod + Location: 103,58 + Actor616: barb + Owner: Nod + Location: 104,58 + Actor617: barb + Owner: Nod + Location: 105,58 + Actor618: barb + Owner: Nod + Location: 105,59 + Actor619: barb + Owner: Nod + Location: 106,59 + Actor620: barb + Owner: Nod + Location: 106,60 + Actor621: barb + Owner: Nod + Location: 114,56 + Actor622: barb + Owner: Nod + Location: 115,56 + Actor623: barb + Owner: Nod + Location: 115,57 + Actor624: barb + Owner: Nod + Location: 113,56 + Actor625: barb + Owner: Nod + Location: 112,56 + Actor626: barb + Owner: Nod + Location: 111,56 + Actor628: barb + Owner: Nod + Location: 111,58 + Actor636: nsam + Location: 122,63 + Owner: Nod2 + Actor638: barb + Owner: Nod + Location: 8,66 + Actor639: barb + Owner: Nod + Location: 8,65 + Actor640: barb + Owner: Nod + Location: 9,64 + Actor641: barb + Owner: Nod + Location: 8,64 + Actor642: barb + Owner: Nod + Location: 10,64 + Actor643: barb + Owner: Nod + Location: 11,64 + Actor644: barb + Owner: Nod + Location: 11,65 + Actor646: obli + Location: 9,65 + Owner: Nod2 + Actor647: barb + Owner: Nod + Location: 79,55 + Actor648: barb + Owner: Nod + Location: 80,55 + Actor649: barb + Owner: Nod + Location: 80,56 + Actor650: barb + Owner: Nod + Location: 80,57 + Actor661: brik + Owner: Nod + Location: 103,85 + Actor662: brik + Owner: Nod + Location: 102,85 + Actor663: brik + Owner: Nod + Location: 101,85 + Actor666: brik + Owner: Nod + Location: 100,85 + Actor674: brik + Owner: Nod + Location: 100,92 + Actor675: brik + Owner: Nod + Location: 101,92 + Actor677: brik + Owner: Nod + Location: 103,92 + Actor678: brik + Owner: Nod + Location: 102,92 + Actor693: ltnk + Owner: Nod + Location: 32,63 + Facing: 0 + Actor694: ftnk + Owner: Nod + Location: 34,66 + Facing: 0 + Actor695: stnk.nod + Owner: Nod + Facing: 384 + Location: 118,11 + Actor696: stnk.nod + Owner: Nod + Facing: 384 + Location: 119,13 + Actor698: stnk.nod + Owner: Nod + Location: 4,20 + Facing: 768 + Actor697: stnk.nod + Owner: Nod + Facing: 768 + Location: 4,18 + Actor699: ftnk + Owner: Nod + Facing: 0 + Location: 57,68 + Actor700: ftnk + Owner: Nod + Facing: 0 + Location: 82,56 + Actor701: ftnk + Owner: Nod + Facing: 0 + Location: 107,57 + Actor702: ftnk + Owner: Nod + Facing: 0 + Location: 6,68 + Actor703: ltnk + Owner: Nod + Facing: 0 + Location: 36,63 + Actor704: ltnk + Owner: Nod + Facing: 0 + Location: 55,63 + Actor705: ltnk + Owner: Nod + Facing: 0 + Location: 58,63 + Actor706: ltnk + Owner: Nod + Facing: 0 + Location: 84,54 + Actor707: ltnk + Owner: Nod + Facing: 0 + Location: 103,56 + Actor708: ltnk + Owner: Nod + Facing: 0 + Location: 109,56 + Actor709: ltnk + Owner: Nod + Facing: 0 + Location: 7,65 + Actor710: split2 + Owner: Neutral + Location: 84,8 + Actor712: gun.nod + TurretFacing: 0 + Owner: Nod2 + Location: 38,64 + Actor713: gun.nod + TurretFacing: 0 + Owner: Nod2 + Location: 30,64 + Actor645: gun.nod + TurretFacing: 0 + Owner: Nod2 + Location: 9,63 + Actor714: gun.nod + TurretFacing: 0 + Owner: Nod2 + Location: 65,47 + Actor715: gun.nod + TurretFacing: 0 + Owner: Nod2 + Location: 65,54 + Actor716: gun.nod + TurretFacing: 0 + Owner: Nod2 + Location: 75,55 + Actor711: gun.nod + TurretFacing: 0 + Owner: Nod2 + Location: 59,64 + Actor629: gun.nod + TurretFacing: 0 + Owner: Nod2 + Location: 104,57 + Actor630: gun.nod + TurretFacing: 0 + Owner: Nod2 + Location: 112,55 + Actor635: nsam + Owner: Nod2 + Location: 102,59 + Actor652: nsam + Owner: Nod2 + Location: 88,46 + Actor633: nsam + Owner: Nod2 + Location: 66,48 + Actor634: nsam + Owner: Nod2 + Location: 64,65 + Actor653: nsam + Owner: Nod2 + Location: 45,69 + Actor637: nsam + Owner: Nod2 + Location: 14,70 + Actor717: obli + Owner: Nod2 + Location: 30,66 + Actor718: obli + Owner: Nod2 + Location: 38,66 + Actor719: obli + Owner: Nod2 + Location: 54,66 + Actor720: obli + Owner: Nod2 + Location: 59,66 + Actor631: obli + Owner: Nod2 + Location: 104,59 + Actor627: barb + Owner: Nod + Location: 111,57 + Actor632: obli + Owner: Nod2 + Location: 112,57 + Actor651: obli + Owner: Nod2 + Location: 79,56 + Actor688: nsam + Owner: Nod2 + Location: 101,84 + Actor607: brik + Owner: Nod + Location: 104,85 + Actor608: brik + Owner: Nod + Location: 105,85 + Actor609: brik + Owner: Nod + Location: 106,85 + Actor610: obli + Owner: Nod2 + Location: 107,85 + Actor656: nsam + Owner: Nod2 + Location: 108,85 + Actor657: nuk2 + Location: 104,86 + Owner: Nod2 + Actor660: brik + Owner: Nod + Location: 106,86 + Actor679: brik + Owner: Nod + Location: 106,87 + Actor680: brik + Owner: Nod + Location: 106,88 + Actor681: nuk2 + Location: 104,89 + Owner: Nod2 + Actor682: brik + Owner: Nod + Location: 106,89 + Actor683: brik + Owner: Nod + Location: 106,90 + Actor684: brik + Owner: Nod + Location: 106,91 + Actor685: brik + Owner: Nod + Location: 104,92 + Actor686: brik + Owner: Nod + Location: 105,92 + Actor687: brik + Owner: Nod + Location: 106,92 + Actor157: rock5 + Owner: Neutral + Location: 95,89 + Actor689: nsam + Owner: Nod2 + Location: 94,85 + Actor690: obli + Owner: Nod2 + Location: 96,85 + Actor654: brik + Owner: Nod + Location: 97,85 + Actor659: brik + Owner: Nod + Location: 98,85 + Actor664: brik + Owner: Nod + Location: 99,85 + Actor665: brik + Owner: Nod + Location: 97,86 + Actor667: nuk2 + Location: 98,86 + Owner: Nod2 + Actor668: brik + Owner: Nod + Location: 97,87 + Actor669: brik + Owner: Nod + Location: 97,88 + Actor670: brik + Owner: Nod + Location: 97,89 + Actor672: brik + Owner: Nod + Location: 97,90 + Actor673: brik + Owner: Nod + Location: 97,91 + Actor676: brik + Owner: Nod + Location: 97,92 + Actor691: brik + Owner: Nod + Location: 98,92 + Actor692: brik + Owner: Nod + Location: 99,92 + Actor655: nuk2 + Location: 100,86 + Owner: Nod2 + Actor658: nuk2 + Location: 102,86 + Owner: Nod2 + Actor722: nuk2 + Location: 102,89 + Owner: Nod2 + Actor671: nuk2 + Owner: Nod2 + Location: 100,89 + Actor721: nuk2 + Owner: Nod2 + Location: 98,89 + Actor723: cratermaker2 + Owner: Neutral + Location: 105,45 + Actor724: cratermaker2 + Owner: Neutral + Location: 106,45 + Actor725: cratermaker2 + Owner: Neutral + Location: 111,45 + Actor726: cratermaker1 + Owner: Neutral + Location: 112,45 + Actor727: cratermaker1 + Owner: Neutral + Location: 116,40 + Actor728: cratermaker2 + Owner: Neutral + Location: 116,48 + Actor729: cratermaker1 + Owner: Neutral + Location: 115,48 + Actor730: scorchmaker1 + Owner: Neutral + Location: 117,49 + Actor731: scorchmaker2 + Owner: Neutral + Location: 108,48 + Actor732: cratermaker2 + Owner: Neutral + Location: 109,48 + Actor733: cratermaker2 + Owner: Neutral + Location: 122,40 + Actor734: cratermaker1 + Owner: Neutral + Location: 121,40 + Actor735: cratermaker1 + Owner: Neutral + Location: 122,39 + Actor736: scorchmaker2 + Owner: Neutral + Location: 121,39 + Actor737: cratermaker1 + Owner: Neutral + Location: 119,52 + Actor738: cratermaker2 + Owner: Neutral + Location: 120,52 + Actor739: scorchmaker1 + Owner: Neutral + Location: 113,34 + Actor740: scorchmaker1 + Owner: Neutral + Location: 114,35 + Actor741: cratermaker2 + Owner: Neutral + Location: 114,34 + Actor742: cratermaker1 + Owner: Neutral + Location: 125,40 + Actor743: cratermaker2 + Owner: Neutral + Location: 125,43 + Actor744: cratermaker1 + Owner: Neutral + Location: 124,43 + Actor745: cratermaker1 + Owner: Neutral + Location: 123,45 + Actor746: scorchmaker1 + Owner: Neutral + Location: 120,44 + Actor747: cratermaker1 + Owner: Neutral + Location: 121,44 + Actor748: cratermaker1 + Owner: Neutral + Location: 113,41 + Actor749: cratermaker1 + Owner: Neutral + Location: 113,50 + Actor750: cratermaker2 + Owner: Neutral + Location: 104,50 + Actor751: rmbc + Owner: Nod + SubCell: 3 + Location: 57,112 + Facing: 256 + Actor753: rmbc + Owner: Nod + SubCell: 3 + Facing: 602 + Location: 74,113 + Actor754: rmbc + Owner: Nod + SubCell: 3 + Facing: 602 + Location: 73,114 + Actor755: rmbc + Owner: Nod + SubCell: 3 + Facing: 602 + Location: 73,115 + Actor756: rmbc + Owner: Nod + SubCell: 3 + Facing: 602 + Location: 72,116 + Actor757: rmbc + Owner: Nod + SubCell: 3 + Facing: 602 + Location: 72,117 + Actor758: rmbc + Owner: Nod + SubCell: 3 + Facing: 256 + Location: 57,113 + Actor759: rmbc + Owner: Nod + SubCell: 3 + Facing: 256 + Location: 57,114 + Actor760: rmbc + Owner: Nod + SubCell: 3 + Facing: 256 + Location: 57,115 + Actor761: rmbc + Owner: Nod + SubCell: 3 + Facing: 256 + Location: 57,116 + Actor752: rmbc + Owner: Nod + SubCell: 3 + Location: 39,107 + Facing: 384 + Actor762: rmbc + Owner: Nod + SubCell: 3 + Location: 40,112 + Facing: 293 + Actor763: rmbc + Owner: Nod + SubCell: 3 + Location: 39,99 + Facing: 285 + Actor764: rmbc + Owner: Nod + SubCell: 3 + Location: 41,93 + Facing: 111 + Actor765: rmbc + Owner: Nod + Location: 49,88 + SubCell: 3 + Facing: 118 + Actor766: rmbc + Owner: Nod + SubCell: 3 + Facing: 118 + Location: 59,88 + Actor767: rmbc + Owner: Nod + SubCell: 3 + Facing: 118 + Location: 86,87 + Actor768: rmbc + Owner: Nod + SubCell: 3 + Location: 78,84 + Facing: 919 + Actor769: rmbc + Owner: Nod + SubCell: 3 + Facing: 919 + Location: 54,87 + Actor770: tplr + Owner: Nod + SubCell: 3 + Location: 60,68 + Facing: 103 + Actor771: tplr + Owner: Nod + SubCell: 3 + Location: 53,67 + Facing: 888 + Actor772: tplr + Owner: Nod + SubCell: 3 + Facing: 888 + Location: 29,64 + Actor773: tplr + Owner: Nod + SubCell: 3 + Facing: 888 + Location: 31,67 + Actor774: tplr + Owner: Nod + SubCell: 3 + Facing: 103 + Location: 39,64 + Actor775: tplr + Owner: Nod + SubCell: 3 + Facing: 103 + Location: 37,66 + Actor776: tplr + Owner: Nod + SubCell: 3 + Facing: 103 + Location: 84,56 + Actor777: tplr + Owner: Nod + SubCell: 3 + Facing: 103 + Location: 111,55 + Actor778: tplr + Owner: Nod + SubCell: 3 + Facing: 888 + Location: 103,57 + Actor779: tplr + Owner: Nod + SubCell: 3 + Facing: 888 + Location: 80,54 + Actor780: tplr + Owner: Nod + SubCell: 3 + Facing: 888 + Location: 4,66 + Actor781: n1c + Owner: Nod + SubCell: 3 + Location: 114,59 + Facing: 118 + Actor782: n1c + Owner: Nod + SubCell: 3 + Facing: 118 + Location: 115,55 + Actor783: n1c + Owner: Nod + SubCell: 3 + Facing: 118 + Location: 105,56 + Actor784: n1c + Owner: Nod + SubCell: 3 + Facing: 118 + Location: 113,54 + Actor785: n1c + Owner: Nod + SubCell: 3 + Facing: 118 + Location: 84,55 + Actor786: n1c + Owner: Nod + SubCell: 3 + Facing: 118 + Location: 61,62 + Actor787: n1c + Owner: Nod + SubCell: 3 + Facing: 118 + Location: 60,63 + Actor788: n1c + Owner: Nod + SubCell: 3 + Facing: 118 + Location: 39,63 + Actor789: n1c + Owner: Nod + SubCell: 3 + Facing: 118 + Location: 37,64 + Actor790: n1c + Owner: Nod + SubCell: 3 + Facing: 118 + Location: 11,62 + Actor791: n1c + Owner: Nod + SubCell: 3 + Facing: 118 + Location: 10,63 + Actor792: n1c + Owner: Nod + SubCell: 3 + Location: 29,63 + Facing: 856 + Actor793: n1c + Owner: Nod + SubCell: 3 + Facing: 856 + Location: 28,62 + Actor794: n1c + Owner: Nod + SubCell: 3 + Facing: 856 + Location: 54,63 + Actor795: n1c + Owner: Nod + SubCell: 3 + Facing: 856 + Location: 79,54 + Actor796: n1c + Owner: Nod + SubCell: 3 + Facing: 856 + Location: 102,57 + Actor797: n1c + Owner: Nod + SubCell: 3 + Facing: 856 + Location: 78,85 + Actor798: n1c + Owner: Nod + SubCell: 3 + Facing: 856 + Location: 86,86 + Actor799: enli + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 60,111 + Actor800: enli + Owner: Nod + SubCell: 3 + Location: 72,111 + Facing: 642 + NodRally1: waypoint + Owner: Neutral + Location: 9,54 + NodRally2: waypoint + Owner: Neutral + Location: 34,60 + NodRally3: waypoint + Owner: Neutral + Location: 58,52 + NodRally4: waypoint + Owner: Neutral + Location: 78,49 + NodRally5: waypoint + Owner: Neutral + Location: 106,36 + Actor803: mslo.nod + Owner: Nod + Location: 82,118 + KirovSpawn1: waypoint + Owner: Neutral + Location: 37,1 + KirovRally1: waypoint + Owner: Neutral + Location: 37,12 + KirovRally2: waypoint + Owner: Neutral + Location: 57,12 + KirovSpawn2: waypoint + Owner: Neutral + Location: 57,1 + PlayerStart: waypoint + Owner: Neutral + Location: 47,14 + Actor801: n3c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 62,120 + Actor802: n3c + Owner: Nod + SubCell: 3 + Location: 65,120 + Facing: 674 + Actor804: n3c + Owner: Nod + Facing: 384 + Location: 65,120 + SubCell: 1 + Actor805: n3c + Owner: Nod + SubCell: 3 + Location: 67,120 + Facing: 674 + Actor806: n3c + Owner: Nod + Location: 65,119 + SubCell: 3 + Facing: 634 + Actor807: n3c + Owner: Nod + SubCell: 3 + Location: 69,117 + Facing: 618 + Actor808: n3c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 61,117 + Actor809: n3c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 59,116 + Actor810: n3c + Owner: Nod + SubCell: 3 + Location: 71,116 + Facing: 737 + Actor811: n3c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 59,113 + Actor812: n3c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 61,110 + Actor813: n3c + Owner: Nod + SubCell: 3 + Location: 70,110 + Facing: 824 + Actor814: n3c + Owner: Nod + SubCell: 3 + Location: 71,111 + Facing: 769 + Actor815: n3c + Owner: Nod + SubCell: 3 + Location: 67,107 + Facing: 0 + Actor816: n3c + Owner: Nod + SubCell: 3 + Location: 63,108 + Facing: 0 + Actor817: n1c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 56,118 + Actor818: n1c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 55,116 + Actor819: n1c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 56,115 + Actor820: n1c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 54,114 + Actor821: n1c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 54,112 + Actor822: n1c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 53,111 + Actor823: n1c + Owner: Nod + Facing: 384 + Location: 53,110 + SubCell: 3 + Actor824: n1c + Owner: Nod + Location: 75,117 + SubCell: 3 + Facing: 658 + Actor825: n1c + Owner: Nod + SubCell: 3 + Location: 74,116 + Facing: 682 + Actor826: n1c + Owner: Nod + SubCell: 3 + Location: 76,115 + Facing: 689 + Actor827: n1c + Owner: Nod + Location: 76,115 + SubCell: 1 + Facing: 674 + Actor828: n1c + Owner: Nod + Location: 76,114 + SubCell: 3 + Facing: 689 + Actor829: n1c + Owner: Nod + SubCell: 3 + Location: 77,113 + Facing: 737 + Actor830: n1c + Owner: Nod + Location: 77,112 + SubCell: 3 + Facing: 658 + Actor831: reap + Owner: Nod + SubCell: 3 + Location: 60,112 + Facing: 384 + Actor832: reap + Owner: Nod + SubCell: 3 + Location: 69,111 + Facing: 721 + Actor833: reap + Owner: Nod + SubCell: 3 + Location: 62,110 + Facing: 491 + Actor836: reap + Owner: Nod + SubCell: 3 + Location: 31,34 + Facing: 864 + Actor840: acol + Owner: Nod + SubCell: 3 + Location: 30,33 + Facing: 919 + Actor834: reap + Owner: Nod + SubCell: 3 + Facing: 864 + Location: 33,35 + Actor835: reap + Owner: Nod + SubCell: 3 + Facing: 864 + Location: 35,36 + Actor837: acol + Owner: Nod + SubCell: 3 + Facing: 919 + Location: 32,34 + Actor838: acol + Owner: Nod + SubCell: 3 + Facing: 919 + Location: 34,35 + Actor839: acol + Owner: Nod + SubCell: 3 + Facing: 919 + Location: 36,36 + Actor841: ftnk + Owner: Nod + Location: 33,33 + Facing: 896 + Actor842: bike + Owner: Nod + Location: 70,7 + Facing: 384 + Actor843: bike + Owner: Nod + Facing: 384 + Location: 72,8 + Actor844: bike + Owner: Nod + Facing: 384 + Location: 74,6 + Actor845: bike + Owner: Nod + Facing: 384 + Location: 77,5 + Actor846: bike + Owner: Nod + Facing: 384 + Location: 75,7 + Actor847: bike + Owner: Nod + Facing: 384 + Location: 80,4 + Actor848: spec + Owner: Nod + Location: 57,41 + Facing: 0 + Stance: AttackAnything + Actor849: spec + Owner: Nod + Location: 59,40 + Facing: 0 + Stance: AttackAnything + Actor850: spec + Owner: Nod + Location: 61,39 + Facing: 0 + Stance: AttackAnything + Actor852: n1 + Owner: Nod + Location: 45,36 + SubCell: 3 + Facing: 0 + Actor853: n1 + Owner: Nod + Location: 45,37 + SubCell: 3 + Facing: 0 + Actor854: n1 + Owner: Nod + Location: 45,37 + SubCell: 1 + Facing: 0 + Actor851: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 44,36 + Actor857: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 47,37 + Actor858: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 48,37 + Actor860: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 49,36 + Actor859: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 49,37 + Actor861: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 46,36 + Actor862: n1 + Owner: Nod + SubCell: 1 + Facing: 0 + Location: 46,36 + Actor855: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 47,36 + Actor856: n1 + Owner: Nod + SubCell: 1 + Facing: 0 + Location: 47,36 + Actor863: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 61,35 + Actor864: n1 + Owner: Nod + SubCell: 1 + Facing: 0 + Location: 61,35 + Actor865: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 62,34 + Actor866: n1 + Owner: Nod + SubCell: 1 + Facing: 0 + Location: 62,34 + Actor867: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 64,35 + Actor868: n1 + Owner: Nod + SubCell: 1 + Facing: 0 + Location: 64,35 + Actor869: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 65,33 + Actor870: n1 + Owner: Nod + SubCell: 1 + Facing: 0 + Location: 65,33 + Actor871: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 22,7 + Actor872: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 20,6 + Actor873: n4 + Owner: Nod + Facing: 384 + Location: 19,7 + SubCell: 3 + Actor874: n4 + Owner: Nod + Facing: 384 + Location: 21,6 + SubCell: 3 + Actor875: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 23,5 + Actor876: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 20,5 + Actor877: n4 + Owner: Nod + Facing: 384 + Location: 19,6 + SubCell: 3 + Actor878: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 18,6 + Actor879: n3 + Owner: Nod + Facing: 384 + Location: 47,38 + SubCell: 3 + Actor880: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 44,37 + Actor881: n3 + Owner: Nod + Facing: 384 + Location: 48,38 + SubCell: 3 + Actor882: n3 + Owner: Nod + Facing: 384 + Location: 50,36 + SubCell: 3 + Actor883: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 63,35 + Actor884: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 63,33 + Actor885: n3 + Owner: Nod + Facing: 384 + Location: 66,33 + SubCell: 3 + Actor886: n3 + Owner: Nod + Facing: 384 + Location: 60,35 + SubCell: 3 + Actor889: ltnk + Owner: Nod + Location: 35,33 + Facing: 927 + InitSquad3: waypoint + Owner: Neutral + Location: 22,6 + InitSquad2: waypoint + Owner: Neutral + Location: 76,6 + InitSquad4: waypoint + Owner: Neutral + Location: 61,36 + InitSquad1: waypoint + Owner: Neutral + Location: 47,35 + InitSquad5: waypoint + Owner: Neutral + Location: 34,34 + Actor890: bggy + Location: 71,6 + Faction: Random + Facing: 384 + Owner: Nod + Actor891: bggy + Location: 70,5 + Faction: Random + Facing: 384 + Owner: Nod + Actor892: bggy + Location: 75,9 + Faction: Random + Facing: 384 + Owner: Nod + Actor893: ltnk + Owner: Nod + Facing: 0 + Location: 43,38 + Actor894: ltnk + Owner: Nod + Facing: 0 + Location: 50,38 + Actor887: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 46,39 + Actor888: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 47,39 + Actor895: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 47,41 + Actor896: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 48,41 + Actor897: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 63,37 + Actor898: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 64,37 + Actor899: camera + Owner: Nod + Location: 55,18 + Actor900: camera + Owner: Nod + Location: 37,18 + Actor901: camera + Owner: Nod + Location: 69,12 + Actor902: camera + Owner: Nod + Location: 22,12 + Actor903: camera + Owner: Nod + Location: 14,21 + Actor904: camera + Owner: Nod + Location: 38,32 + Actor905: camera + Owner: Nod + Location: 70,32 + Actor906: camera + Owner: Nod + Location: 104,17 + Actor907: camera + Owner: Nod + Location: 57,70 + Actor908: camera + Owner: Nod + Location: 34,70 + Actor909: camera + Owner: Nod + Location: 81,61 + Actor910: camera + Owner: Nod + Location: 111,61 + Actor911: camera + Owner: Nod + Location: 15,73 + Actor912: camera + Owner: Nod + Location: 103,80 + Actor913: camera + Owner: Nod + Location: 50,83 + Actor914: camera + Owner: Nod + Location: 33,101 + Actor915: camera + Owner: Nod + Location: 107,107 + Actor916: camera + Owner: Nod + Location: 71,78 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-doctrines.yaml, ca|missions/main-campaign/ca18-succession/succession-rules.yaml, ca|rules/custom/coop-rules.yaml, succession-coop-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/coop-campaign/ca18-succession-coop/succession-coop-rules.yaml b/mods/ca/missions/coop-campaign/ca18-succession-coop/succession-coop-rules.yaml new file mode 100644 index 0000000000..aa02b49bda --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca18-succession-coop/succession-coop-rules.yaml @@ -0,0 +1,6 @@ +World: + LuaScript: + Scripts: campaign.lua, coop.lua, ca|missions/main-campaign/ca18-succession/succession.lua, succession-coop.lua + LobbyMissionInfo@InitialObjectives: + Prefix: Initial Objectives + Text: • Capture Temple Prime and all four Nod cyborg manufacturing facilities. diff --git a/mods/ca/missions/coop-campaign/ca18-succession-coop/succession-coop.lua b/mods/ca/missions/coop-campaign/ca18-succession-coop/succession-coop.lua new file mode 100644 index 0000000000..8e086472a1 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca18-succession-coop/succession-coop.lua @@ -0,0 +1,43 @@ + +SetupPlayers = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Multi2 = Player.GetPlayer("Multi2") + Multi3 = Player.GetPlayer("Multi3") + Multi4 = Player.GetPlayer("Multi4") + Multi5 = Player.GetPlayer("Multi5") + USSR = Player.GetPlayer("USSR") + Nod = Player.GetPlayer("Nod") + SpyPlaneProvider = Player.GetPlayer("SpyPlaneProvider") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = Utils.Where({ Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 }, function(p) return p ~= nil end) + MissionEnemies = { Nod, Nod2 } + SinglePlayerPlayer = USSR + CoopInit() +end + +AfterWorldLoaded = function() + TransferMcvsToPlayers() + StartCashSpread(3500) +end + +AfterTick = function() + +end + +SendKirovs = function() + local firstActivePlayer = GetFirstActivePlayer() + Reinforcements.Reinforce(firstActivePlayer, { "kiro" }, { KirovSpawn1.Location, KirovRally1.Location }) + + if #MissionPlayers > 1 then + local kirovIterator = 0 + Utils.Do(MissionPlayers, function(p) + if p ~= firstActivePlayer then + Reinforcements.Reinforce(p, { "kiro" }, { (KirovSpawn2.Location - CVec.New((kirovIterator), 0)), (KirovRally2.Location - CVec.New((kirovIterator), 0)) }) + kirovIterator = kirovIterator + 4 + end + end) + else + Reinforcements.Reinforce(firstActivePlayer, { "kiro" }, { KirovSpawn2.Location, KirovRally2.Location }) + end +end diff --git a/mods/ca/missions/coop-campaign/ca19-proliferation-coop/map.bin b/mods/ca/missions/coop-campaign/ca19-proliferation-coop/map.bin new file mode 100644 index 0000000000..904763bc94 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca19-proliferation-coop/map.bin differ diff --git a/mods/ca/missions/coop-campaign/ca19-proliferation-coop/map.png b/mods/ca/missions/coop-campaign/ca19-proliferation-coop/map.png new file mode 100644 index 0000000000..21472c91f0 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca19-proliferation-coop/map.png differ diff --git a/mods/ca/missions/coop-campaign/ca19-proliferation-coop/map.yaml b/mods/ca/missions/coop-campaign/ca19-proliferation-coop/map.yaml new file mode 100644 index 0000000000..e60c11d2e7 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca19-proliferation-coop/map.yaml @@ -0,0 +1,2324 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 19: Proliferation Co-op + +Author: Darkademic & Gandorques Hikla + +Tileset: TEMPERAT + +MapSize: 130,114 + +Bounds: 1,1,128,112 + +Visibility: Lobby + +Categories: Co-op Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: Scrin, Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + PlayerReference@Scrin: + Name: Scrin + Faction: scrin + Color: 7700FF + Allies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Nod, Creeps + PlayerReference@Nod: + Name: Nod + Bot: campaign + Faction: nod + Color: FE1100 + Enemies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: scrin + Color: 7700FF + LockColor: True + Allies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Nod, Creeps + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: scrin + Color: D83CE5 + LockColor: True + Allies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Nod, Creeps + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: scrin + Color: 0B7310 + LockColor: True + Allies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Nod, Creeps + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: scrin + Color: 775A12 + LockColor: True + Allies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Nod, Creeps + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: scrin + Color: 82C900 + LockColor: True + Allies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Nod, Creeps + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: scrin + Color: EEA8A8 + LockColor: True + Allies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Nod, Creeps + +Actors: + Actor0: splitblue + Owner: Neutral + Location: 14,67 + Actor1: splitblue + Owner: Neutral + Location: 13,74 + Actor2: proc.scrin + Owner: Scrin + Location: 23,71 + Actor3: proc.scrin + Owner: Scrin + Location: 21,64 + Actor10: srep + Owner: Scrin + Location: 38,55 + Actor11: srep + Owner: Scrin + Location: 43,61 + Actor13: scol + Owner: Scrin + Location: 41,51 + Actor14: scol + Owner: Scrin + Location: 49,69 + Actor15: scol + Owner: Scrin + Location: 33,74 + Actor16: scol + Owner: Scrin + Location: 28,62 + Actor17: scol + Owner: Scrin + Location: 32,54 + Actor18: scol + Owner: Scrin + Location: 49,61 + Actor19: ptur + Owner: Scrin + Location: 51,71 + Actor20: ptur + Owner: Scrin + Location: 52,61 + Actor21: ptur + Owner: Scrin + Location: 43,49 + Actor22: ptur + Owner: Scrin + Location: 30,52 + Actor23: ptur + Owner: Scrin + Location: 20,61 + Actor24: ptur + Owner: Scrin + Location: 23,76 + Actor25: scol + Owner: Scrin + Location: 23,71 + Actor26: shar + Owner: Scrin + Location: 38,75 + Actor27: shar + Owner: Scrin + Location: 29,57 + Actor28: shar + Owner: Scrin + Location: 44,54 + Actor29: shar + Owner: Scrin + Location: 46,70 + Actor30: shar + Owner: Scrin + Location: 47,58 + Actor35: rea2 + Owner: Scrin + Location: 38,67 + Actor36: rea2 + Owner: Scrin + Location: 40,65 + Actor33: nerv + Owner: Scrin + Location: 35,71 + Actor39: corr + Owner: Scrin + Location: 35,55 + Facing: 0 + Actor41: corr + Owner: Scrin + Location: 44,67 + Facing: 634 + Actor42: gunw + Owner: Scrin + Location: 35,51 + Facing: 0 + Actor43: gunw + Owner: Scrin + Location: 37,50 + Facing: 0 + Actor44: gunw + Owner: Scrin + Location: 51,65 + Facing: 769 + Actor45: gunw + Owner: Scrin + Location: 51,67 + Facing: 769 + Actor46: intl + Owner: Scrin + Location: 38,52 + Facing: 0 + Actor47: intl + Owner: Scrin + Location: 34,53 + Facing: 0 + Actor48: intl + Owner: Scrin + Location: 48,63 + Facing: 729 + Actor49: intl + Owner: Scrin + Location: 49,65 + Facing: 729 + Actor57: t10.husk + Owner: Neutral + Location: 22,78 + Actor58: tc04.husk + Owner: Neutral + Location: 8,58 + Actor59: t17.husk + Owner: Neutral + Location: 5,63 + Actor60: tc02.husk + Owner: Neutral + Location: 47,75 + Actor61: tc03.husk + Owner: Neutral + Location: 45,76 + Actor62: tc01.husk + Owner: Neutral + Location: 47,78 + Actor63: t10.husk + Owner: Neutral + Location: 6,61 + Actor64: t15.husk + Owner: Neutral + Location: 20,82 + Actor65: t17.husk + Owner: Neutral + Location: 25,85 + Actor66: splitblue + Owner: Neutral + Location: 21,25 + Actor67: splitblue + Owner: Neutral + Location: 28,26 + NWRef: proc.td + Owner: Nod + Location: 26,13 + FreeActor: False + NWDef1: gun.nod + Owner: Nod + Location: 18,18 + TurretFacing: 150 + NWDef2: gun.nod + Owner: Nod + Location: 35,17 + TurretFacing: 602 + NWDef3: gun.nod + Owner: Nod + Location: 17,33 + TurretFacing: 634 + NWDef4: gun.nod + Owner: Nod + Location: 30,36 + TurretFacing: 555 + Actor73: t11.husk + Owner: Neutral + Faction: blackh + Location: 37,30 + Actor74: t15.husk + Owner: Neutral + Faction: blackh + Location: 30,33 + Actor75: ltnk + Owner: Nod + Facing: 384 + Location: 22,34 + Actor76: ltnk + Owner: Nod + Location: 22,18 + Facing: 512 + SRef2: proc.td + Owner: Nod + Location: 60,98 + FreeActor: False + SRef1: proc.td + Owner: Nod + Location: 63,103 + FreeActor: False + Actor79: splitblue + Owner: Neutral + Location: 54,106 + Actor81: splitblue + Owner: Neutral + Location: 42,106 + Actor82: splitblue + Owner: Neutral + Location: 48,109 + Actor80: splitblue + Owner: Neutral + Location: 49,102 + SWDef1: gun.nod + Owner: Nod + Location: 42,97 + TurretFacing: 126 + SWDef2: gun.nod + Owner: Nod + Location: 49,94 + TurretFacing: 192 + SWDef3: gun.nod + Owner: Nod + Location: 58,98 + TurretFacing: 7 + Actor86: gun.nod + Owner: Nod + Location: 80,36 + TurretFacing: 380 + Actor87: gun.nod + Owner: Nod + Location: 91,29 + TurretFacing: 452 + Actor88: gun.nod + Owner: Nod + Location: 77,18 + TurretFacing: 285 + NRef: proc.td + Owner: Nod + Location: 78,15 + FreeActor: False + Actor90: splitblue + Owner: Neutral + Location: 80,28 + Actor91: splitblue + Owner: Neutral + Location: 84,24 + Actor92: splitblue + Owner: Neutral + Location: 102,90 + Actor93: splitblue + Owner: Neutral + Location: 109,87 + Actor94: splitblue + Owner: Neutral + Location: 123,44 + Actor95: splitblue + Owner: Neutral + Location: 120,50 + SERef1: proc.td + Owner: Nod + Location: 109,75 + FreeActor: False + SERef2: proc.td + Owner: Nod + Location: 116,83 + FreeActor: False + NERef: proc.td + Owner: Nod + Location: 121,33 + FreeActor: False + Obelisk2: obli + Owner: Nod + Location: 118,36 + Obelisk3: obli + Owner: Nod + Location: 110,45 + Obelisk5: obli + Owner: Nod + Location: 107,79 + Obelisk4: obli + Owner: Nod + Location: 117,88 + SEDef4: gun.nod + Owner: Nod + Location: 101,80 + TurretFacing: 192 + SEDef1: gun.nod + Owner: Nod + Location: 97,96 + TurretFacing: 356 + SEDef3: gun.nod + Owner: Nod + Location: 108,99 + TurretFacing: 364 + Actor106: gun.nod + Owner: Nod + Location: 110,49 + TurretFacing: 333 + Actor107: gun.nod + Owner: Nod + Location: 115,56 + TurretFacing: 396 + Actor108: gun.nod + Owner: Nod + Location: 115,37 + TurretFacing: 269 + Actor109: hand + Owner: Nod + Location: 118,32 + Actor110: sbag + Owner: Nod + Location: 115,34 + Actor111: sbag + Owner: Nod + Location: 115,33 + Actor112: sbag + Owner: Nod + Location: 115,32 + Actor113: sbag + Owner: Nod + Location: 115,31 + Actor114: sbag + Owner: Nod + Location: 115,30 + Actor115: sbag + Owner: Nod + Location: 116,30 + Actor116: sbag + Owner: Nod + Location: 117,30 + Actor117: sbag + Owner: Nod + Location: 118,30 + Actor118: sbag + Owner: Nod + Location: 119,30 + Actor119: sbag + Owner: Nod + Location: 121,30 + Actor120: sbag + Owner: Nod + Location: 120,30 + Actor121: sbag + Owner: Nod + Location: 122,30 + Actor122: sbag + Owner: Nod + Location: 123,30 + Actor123: sbag + Owner: Nod + Location: 128,35 + Actor124: sbag + Owner: Nod + Location: 128,34 + Actor125: sbag + Owner: Nod + Location: 128,33 + Actor126: sbag + Owner: Nod + Location: 128,32 + Actor127: sbag + Owner: Nod + Location: 128,31 + Actor128: sbag + Owner: Nod + Location: 128,30 + Actor129: sbag + Owner: Nod + Location: 126,30 + Actor130: sbag + Owner: Nod + Location: 127,30 + Actor131: sbag + Owner: Nod + Location: 125,30 + Actor132: sbag + Owner: Nod + Location: 124,30 + Actor133: nsam + Owner: Nod + Location: 116,31 + Actor134: silo.td + Owner: Nod + Location: 126,31 + Actor135: silo.td + Owner: Nod + Location: 126,33 + Actor136: silo.td + Owner: Nod + Location: 123,31 + Actor137: gun.nod + Owner: Nod + Location: 126,38 + TurretFacing: 364 + SWDef4: ltur + Owner: Nod + Location: 46,96 + TurretFacing: 128 + SEDef2: ltur + Owner: Nod + Location: 102,98 + TurretFacing: 325 + Actor140: ltur + Owner: Nod + Location: 112,53 + TurretFacing: 380 + Actor141: ltur + Owner: Nod + Location: 86,32 + TurretFacing: 626 + Actor146: s1 + Owner: Scrin + SubCell: 3 + Location: 36,52 + Facing: 0 + Actor147: s1 + Owner: Scrin + Location: 36,52 + SubCell: 1 + Facing: 0 + Actor148: s1 + Owner: Scrin + SubCell: 3 + Location: 34,51 + Facing: 0 + Actor149: s1 + Owner: Scrin + SubCell: 3 + Location: 38,53 + Facing: 0 + Actor150: s1 + Owner: Scrin + SubCell: 3 + Location: 41,53 + Facing: 0 + Actor151: s1 + Owner: Scrin + SubCell: 3 + Location: 52,64 + Facing: 761 + Actor152: s1 + Owner: Scrin + Location: 52,64 + SubCell: 1 + Facing: 777 + Actor153: s1 + Owner: Scrin + SubCell: 3 + Location: 54,65 + Facing: 737 + Actor154: s1 + Owner: Scrin + SubCell: 3 + Location: 53,66 + Facing: 800 + Actor155: s1 + Owner: Scrin + SubCell: 3 + Location: 52,69 + Facing: 658 + Actor142: s3 + Owner: Scrin + SubCell: 3 + Location: 36,53 + Facing: 0 + Actor143: s3 + Owner: Scrin + SubCell: 3 + Location: 39,52 + Facing: 0 + Actor144: s3 + Owner: Scrin + SubCell: 3 + Location: 51,63 + Facing: 808 + Actor145: s3 + Owner: Scrin + Location: 51,68 + SubCell: 3 + Facing: 634 + Actor156: devo + Owner: Scrin + Location: 37,54 + Facing: 0 + Actor157: devo + Owner: Scrin + Location: 46,64 + Facing: 721 + Actor158: tc04.husk + Owner: Neutral + Location: 76,55 + Actor159: tc05.husk + Owner: Neutral + Location: 79,60 + Actor160: tc03.husk + Owner: Neutral + Location: 80,58 + Actor161: tc01.husk + Owner: Neutral + Location: 95,57 + Actor162: t17.husk + Owner: Neutral + Location: 94,44 + Actor163: tc01.husk + Owner: Neutral + Location: 103,18 + Actor164: tc02.husk + Owner: Neutral + Location: 47,40 + Actor165: t17.husk + Owner: Neutral + Location: 50,41 + Actor166: t10.husk + Owner: Neutral + Location: 50,36 + Actor167: t13.husk + Owner: Neutral + Location: 46,21 + Actor168: t10.husk + Owner: Neutral + Location: 13,42 + Actor169: t13.husk + Owner: Neutral + Location: 110,105 + Actor170: t16.husk + Owner: Neutral + Location: 123,92 + Actor171: t12.husk + Owner: Neutral + Location: 123,101 + Actor172: t15.husk + Owner: Neutral + Location: 90,103 + Actor173: t10.husk + Owner: Neutral + Location: 90,98 + Actor174: t08.husk + Owner: Neutral + Location: 90,92 + Actor175: tc01.husk + Owner: Neutral + Location: 91,91 + Actor176: t14.husk + Owner: Neutral + Location: 90,89 + Actor177: t16.husk + Owner: Neutral + Location: 86,82 + Actor178: tc03.husk + Owner: Neutral + Location: 89,78 + Actor179: t14.husk + Owner: Neutral + Location: 88,76 + Actor180: tc02.husk + Owner: Neutral + Location: 85,84 + Actor181: tc05.husk + Owner: Neutral + Location: 92,82 + Actor182: tc02.husk + Owner: Neutral + Location: 87,69 + Actor183: t17.husk + Owner: Neutral + Location: 71,56 + Actor184: t13.husk + Owner: Neutral + Location: 29,83 + Actor185: tc04.husk + Owner: Neutral + Location: 39,85 + Actor186: t15.husk + Owner: Neutral + Location: 38,83 + Actor187: t10.husk + Owner: Neutral + Location: 47,84 + Actor188: t17.husk + Owner: Neutral + Location: 44,85 + Actor189: t17.husk + Owner: Neutral + Location: 47,82 + Actor190: t14.husk + Owner: Neutral + Location: 62,85 + Actor191: t10.husk + Owner: Neutral + Location: 67,73 + Actor192: t12.husk + Owner: Neutral + Location: 68,81 + Actor193: t17.husk + Owner: Neutral + Location: 64,80 + Actor194: tc05.husk + Owner: Neutral + Location: 62,77 + Actor195: t12.husk + Owner: Neutral + Location: 83,78 + Actor196: t06.husk + Owner: Neutral + Location: 31,40 + Actor197: t08.husk + Owner: Neutral + Location: 18,43 + Actor198: t14.husk + Owner: Neutral + Location: 30,14 + Actor199: t02.husk + Owner: Neutral + Location: 114,29 + Actor200: t05.husk + Owner: Neutral + Location: 103,33 + Actor201: t11.husk + Owner: Neutral + Location: 107,20 + Actor202: t14.husk + Owner: Neutral + Location: 101,23 + Actor203: t07.husk + Owner: Neutral + Location: 103,22 + Actor204: t01.husk + Owner: Neutral + Location: 99,13 + Actor205: t03.husk + Owner: Neutral + Location: 98,12 + Actor206: t02.husk + Owner: Neutral + Location: 109,63 + Actor207: t15.husk + Owner: Neutral + Location: 112,63 + Actor208: t17.husk + Owner: Neutral + Location: 108,64 + Actor209: t16.husk + Owner: Neutral + Location: 109,60 + Actor210: t11.husk + Owner: Neutral + Location: 96,62 + Actor211: t05.husk + Owner: Neutral + Location: 97,61 + Actor212: t17.husk + Owner: Neutral + Location: 92,65 + Actor213: t03.husk + Owner: Neutral + Location: 86,58 + Actor214: t03.husk + Owner: Neutral + Location: 100,56 + Actor215: t11.husk + Owner: Neutral + Location: 101,49 + Actor216: t06.husk + Owner: Neutral + Location: 91,50 + Actor217: t02.husk + Owner: Neutral + Location: 120,69 + Actor218: t13.husk + Owner: Neutral + Location: 123,64 + Actor219: t06.husk + Owner: Neutral + Location: 118,101 + Actor220: t07.husk + Owner: Neutral + Location: 126,96 + Actor221: t10.husk + Owner: Neutral + Location: 127,95 + Actor222: t06.husk + Owner: Neutral + Location: 121,108 + Actor223: tc04.husk + Owner: Neutral + Location: 103,102 + Actor224: tc04.husk + Owner: Neutral + Location: 71,110 + Actor225: tc04.husk + Owner: Neutral + Location: 31,102 + Actor226: tc04.husk + Owner: Neutral + Location: 44,25 + Actor227: t01.husk + Owner: Neutral + Location: 43,26 + Actor228: t06.husk + Owner: Neutral + Location: 46,27 + Actor229: t12.husk + Owner: Neutral + Location: 44,28 + Actor230: t05.husk + Owner: Neutral + Location: 42,31 + Actor231: t07.husk + Owner: Neutral + Location: 60,22 + Actor232: t03.husk + Owner: Neutral + Location: 65,30 + Actor233: t10.husk + Owner: Neutral + Location: 70,23 + Actor234: tc05.husk + Owner: Neutral + Location: 57,12 + Actor235: tc04.husk + Owner: Neutral + Location: 63,9 + Actor236: tc03.husk + Owner: Neutral + Location: 62,12 + Actor237: tc02.husk + Owner: Neutral + Location: 52,12 + Actor238: t12.husk + Owner: Neutral + Location: 54,10 + Actor239: t14.husk + Owner: Neutral + Location: 60,11 + Actor240: t12.husk + Owner: Neutral + Location: 62,10 + Actor241: t08.husk + Owner: Neutral + Location: 49,15 + Actor242: tc02.husk + Owner: Neutral + Location: 63,67 + Actor243: tc02.husk + Owner: Neutral + Location: 112,20 + Actor244: t06.husk + Owner: Neutral + Location: 53,51 + Actor245: t05.husk + Owner: Neutral + Location: 40,38 + Actor246: t03.husk + Owner: Neutral + Location: 61,49 + Actor247: t07.husk + Owner: Neutral + Location: 64,43 + Actor248: t10.husk + Owner: Neutral + Location: 75,45 + Actor249: t14.husk + Owner: Neutral + Location: 77,48 + Actor250: t11.husk + Owner: Neutral + Location: 65,35 + Actor251: t15.husk + Owner: Neutral + Location: 82,36 + Actor252: t16.husk + Owner: Neutral + Location: 88,15 + Actor253: t01.husk + Owner: Neutral + Location: 81,11 + Actor254: t02.husk + Owner: Neutral + Location: 68,14 + Actor255: tc01.husk + Owner: Neutral + Location: 107,74 + Actor256: tc03.husk + Owner: Neutral + Location: 109,73 + Actor257: t13.husk + Owner: Neutral + Location: 107,71 + Actor258: tc01.husk + Owner: Neutral + Location: 66,92 + Actor259: t05.husk + Owner: Neutral + Location: 61,90 + Actor260: t07.husk + Owner: Neutral + Location: 70,98 + Actor261: t14.husk + Owner: Neutral + Location: 66,103 + Actor262: tc05.husk + Owner: Neutral + Location: 55,87 + Actor263: t14.husk + Owner: Neutral + Location: 55,85 + Actor264: stnk.nod + Owner: Nod + Location: 104,87 + Stance: Defend + Facing: 261 + Actor265: stnk.nod + Owner: Nod + Stance: Defend + Location: 109,91 + Facing: 531 + Actor266: stnk.nod + Owner: Nod + Stance: Defend + Location: 110,83 + Facing: 166 + Actor267: stnk.nod + Owner: Nod + Stance: Defend + Location: 119,43 + Facing: 309 + Actor268: stnk.nod + Owner: Nod + Stance: Defend + Location: 122,47 + Facing: 539 + Actor269: stnk.nod + Owner: Nod + Stance: Defend + Location: 123,53 + Facing: 384 + Actor270: stnk.nod + Owner: Nod + Facing: 384 + Stance: Defend + Location: 78,23 + Actor271: stnk.nod + Owner: Nod + Facing: 384 + Stance: Defend + Location: 85,27 + Actor272: stnk.nod + Owner: Nod + Stance: Defend + Location: 25,28 + Facing: 555 + Actor273: stnk.nod + Owner: Nod + Stance: Defend + Location: 19,24 + Facing: 626 + Actor274: stnk.nod + Owner: Nod + Stance: Defend + Location: 31,23 + Facing: 253 + Actor275: stnk.nod + Owner: Nod + Stance: Defend + Location: 42,110 + Facing: 848 + Actor276: stnk.nod + Owner: Nod + Stance: Defend + Location: 47,105 + Facing: 0 + Actor277: stnk.nod + Owner: Nod + Stance: Defend + Location: 53,108 + Facing: 190 + Actor278: stnk.nod + Owner: Nod + Stance: Defend + Location: 54,102 + Facing: 309 + Actor279: tc04.husk + Owner: Neutral + Location: 1,20 + Actor280: tc01.husk + Owner: Neutral + Location: 2,18 + Actor281: t14.husk + Owner: Neutral + Location: 1,13 + Actor282: t15.husk + Owner: Neutral + Location: 2,12 + Actor283: tc01.husk + Owner: Neutral + Location: 1,11 + Actor284: tc02.husk + Owner: Neutral + Location: 1,16 + Actor285: t12.husk + Owner: Neutral + Location: 3,14 + Actor286: tc01.husk + Owner: Neutral + Location: 3,10 + Actor287: tc04.husk + Owner: Neutral + Location: 1,1 + Actor288: tc05.husk + Owner: Neutral + Location: 3,3 + Actor289: tc01.husk + Owner: Neutral + Location: 1,5 + Actor290: t06.husk + Owner: Neutral + Location: 1,7 + Actor291: t12.husk + Owner: Neutral + Location: 1,9 + Actor292: t03.husk + Owner: Neutral + Location: 4,1 + Actor293: t10.husk + Owner: Neutral + Location: 4,7 + Actor294: t10.husk + Owner: Neutral + Location: 6,1 + Actor295: t12.husk + Owner: Neutral + Location: 9,1 + Actor296: tc01.husk + Owner: Neutral + Location: 7,2 + Actor297: tc02.husk + Owner: Neutral + Location: 11,3 + Actor298: tc03.husk + Owner: Neutral + Location: 12,1 + Actor299: tc04.husk + Owner: Neutral + Location: 15,1 + Actor300: t10.husk + Owner: Neutral + Location: 18,2 + Actor301: t11.husk + Owner: Neutral + Location: 8,4 + Actor302: t10.husk + Owner: Neutral + Location: 2,8 + Actor304: t14.husk + Owner: Neutral + Location: 5,11 + Actor305: t11.husk + Owner: Neutral + Location: 17,7 + Actor306: t05.husk + Owner: Neutral + Location: 16,9 + Actor303: t12.husk + Owner: Neutral + Location: 10,13 + Actor307: tc01.husk + Owner: Neutral + Location: 21,11 + Actor308: tc02.husk + Owner: Neutral + Location: 6,18 + Actor309: t16.husk + Owner: Neutral + Location: 5,15 + Actor310: t10.husk + Owner: Neutral + Location: 5,24 + Actor311: t13.husk + Owner: Neutral + Location: 1,26 + Actor312: t16.husk + Owner: Neutral + Location: 2,23 + Actor313: t03.husk + Owner: Neutral + Location: 6,21 + Actor314: t08.husk + Owner: Neutral + Location: 4,27 + Actor315: t07.husk + Owner: Neutral + Location: 2,31 + Actor316: tc02.husk + Owner: Neutral + Location: 24,1 + Actor317: t10.husk + Owner: Neutral + Location: 28,4 + Actor319: t07.husk + Owner: Neutral + Location: 28,11 + Actor320: t05.husk + Owner: Neutral + Location: 27,9 + Actor321: t08.husk + Owner: Neutral + Location: 23,5 + Actor322: t07.husk + Owner: Neutral + Location: 15,17 + Actor323: t14.husk + Owner: Neutral + Location: 13,15 + Actor324: t06.husk + Owner: Neutral + Location: 12,104 + Actor325: tc05.husk + Owner: Neutral + Location: 5,104 + Actor326: t15.husk + Owner: Neutral + Location: 14,111 + Actor327: t12.husk + Owner: Neutral + Location: 13,102 + Actor328: t10.husk + Owner: Neutral + Location: 3,95 + Actor329: t07.husk + Owner: Neutral + Location: 16,108 + Actor330: t06.husk + Owner: Neutral + Location: 6,109 + Actor331: t03.husk + Owner: Neutral + Location: 1,100 + Actor332: tc03.husk + Owner: Neutral + Location: 2,104 + Actor333: t10.husk + Owner: Neutral + Location: 10,110 + Actor334: tc04.husk + Owner: Neutral + Location: 1,110 + Actor335: t10.husk + Owner: Neutral + Location: 2,107 + Actor336: t06.husk + Owner: Neutral + Location: 1,102 + Actor337: t08.husk + Owner: Neutral + Location: 3,109 + Actor338: t17.husk + Owner: Neutral + Location: 4,106 + Actor339: t15.husk + Owner: Neutral + Location: 10,99 + Actor340: t05.husk + Owner: Neutral + Location: 5,100 + Actor341: t11.husk + Owner: Neutral + Location: 11,107 + Actor342: rea2 + Owner: Scrin + Location: 40,72 + Actor343: rea2 + Owner: Scrin + Location: 42,70 + NWField: waypoint + Owner: Neutral + Location: 25,26 + NField: waypoint + Owner: Neutral + Location: 82,25 + NEField: waypoint + Owner: Neutral + Location: 122,46 + SWField: waypoint + Owner: Neutral + Location: 14,71 + SField: waypoint + Owner: Neutral + Location: 50,105 + SEField: waypoint + Owner: Neutral + Location: 107,87 + RaidSpawn1: waypoint + Owner: Neutral + Location: 36,1 + RaidSpawn2: waypoint + Owner: Neutral + Location: 97,1 + RaidSpawn3: waypoint + Owner: Neutral + Location: 128,25 + RaidSpawn10: waypoint + Owner: Neutral + Location: 1,43 + RaidSpawn9: waypoint + Owner: Neutral + Location: 1,86 + RaidSpawn8: waypoint + Owner: Neutral + Location: 26,112 + RaidSpawn7: waypoint + Owner: Neutral + Location: 69,112 + RaidSpawn6: waypoint + Owner: Neutral + Location: 109,112 + RaidSpawn5: waypoint + Owner: Neutral + Location: 128,99 + RaidSpawn4: waypoint + Owner: Neutral + Location: 128,68 + Actor355: n1 + Owner: Nod + SubCell: 3 + Location: 18,34 + Facing: 384 + Actor356: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 30,37 + Actor357: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 31,36 + Actor358: n1 + Owner: Nod + SubCell: 3 + Location: 36,19 + Facing: 793 + Actor359: n1 + Owner: Nod + SubCell: 3 + Location: 24,16 + Facing: 507 + Actor360: n1 + Owner: Nod + Facing: 384 + Location: 24,16 + SubCell: 1 + Actor361: n1 + Owner: Nod + SubCell: 3 + Location: 23,15 + Facing: 126 + Actor362: n1 + Owner: Nod + Location: 30,15 + SubCell: 1 + Facing: 555 + Actor363: n1 + Owner: Nod + SubCell: 3 + Location: 36,21 + Facing: 666 + Actor364: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 21,36 + Actor365: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 25,37 + Actor366: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 22,16 + Actor367: bggy + Owner: Nod + Location: 66,97 + Facing: 245 + Actor368: bggy + Owner: Nod + Location: 44,96 + Facing: 0 + Actor369: ftnk + Owner: Nod + Location: 60,96 + Facing: 111 + Actor370: ltnk + Owner: Nod + Location: 61,94 + Facing: 95 + Actor371: n3 + Owner: Nod + SubCell: 3 + Location: 37,20 + Facing: 594 + Actor372: n3 + Owner: Nod + SubCell: 3 + Location: 25,14 + Facing: 384 + Actor373: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 33,34 + Actor374: n3 + Owner: Nod + SubCell: 3 + Location: 65,101 + Facing: 142 + Actor375: n3 + Owner: Nod + SubCell: 3 + Location: 53,93 + Facing: 182 + Actor376: n3 + Owner: Nod + SubCell: 3 + Location: 40,97 + Facing: 150 + Actor377: n4 + Owner: Nod + SubCell: 3 + Location: 43,95 + Facing: 142 + Actor378: n4 + Owner: Nod + SubCell: 3 + Location: 51,93 + Facing: 0 + Actor379: n4 + Owner: Nod + SubCell: 3 + Location: 70,102 + Facing: 63 + Actor380: n1 + Owner: Nod + SubCell: 3 + Location: 41,96 + Facing: 0 + Actor382: n1 + Owner: Nod + SubCell: 1 + Location: 40,96 + Facing: 0 + Actor383: n1 + Owner: Nod + SubCell: 3 + Location: 46,94 + Facing: 0 + Actor384: n1 + Owner: Nod + SubCell: 3 + Location: 57,95 + Facing: 0 + Actor385: n1 + Owner: Nod + SubCell: 3 + Location: 59,97 + Facing: 166 + Actor386: n1 + Owner: Nod + Location: 59,97 + SubCell: 1 + Facing: 71 + Actor387: n1 + Owner: Nod + SubCell: 3 + Location: 63,95 + Facing: 0 + Actor388: n1 + Owner: Nod + SubCell: 3 + Location: 65,107 + Facing: 134 + Actor389: rmbc + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 114,34 + Actor390: rmbc + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 116,36 + Actor391: rmbc + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 116,33 + Actor392: enli + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 112,38 + Actor393: enli + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 111,43 + Actor394: n1c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 110,51 + Actor396: n1c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 113,55 + Actor397: n1c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 116,58 + Actor398: n5 + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 112,52 + Actor399: n5 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 119,59 + Actor400: acol + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 109,42 + Actor401: acol + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 112,35 + Actor402: tplr + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 111,52 + Actor403: ltnk + Owner: Nod + Facing: 384 + Location: 90,33 + Actor404: ltnk + Owner: Nod + Location: 72,12 + Facing: 134 + Actor405: ltnk + Owner: Nod + Location: 76,13 + Facing: 134 + Actor406: ftnk + Owner: Nod + Location: 71,39 + Facing: 269 + Actor407: ftnk + Owner: Nod + Location: 71,41 + Facing: 269 + Actor408: mlrs + Owner: Nod + Facing: 384 + Location: 120,31 + Actor409: mlrs + Owner: Nod + Facing: 384 + Location: 117,78 + Actor410: mlrs + Owner: Nod + Facing: 384 + Location: 118,94 + Actor411: wtnk + Owner: Nod + Facing: 384 + Location: 92,71 + Actor412: ltnk + Owner: Nod + Facing: 384 + Location: 113,56 + Actor413: ltnk + Owner: Nod + Facing: 384 + Location: 108,40 + Actor414: bggy + Owner: Nod + Facing: 384 + Location: 75,38 + Actor416: bggy + Owner: Nod + Location: 55,28 + Facing: 658 + Actor417: arty.nod + Owner: Nod + Facing: 384 + Location: 74,52 + Actor418: arty.nod + Owner: Nod + Location: 81,72 + Facing: 301 + Actor419: arty.nod + Owner: Nod + Location: 81,82 + Facing: 158 + Actor420: howi + Owner: Nod + Facing: 384 + Location: 40,28 + Actor421: howi + Owner: Nod + Facing: 384 + Location: 42,26 + Actor422: ftnk + Owner: Nod + Location: 103,79 + Facing: 158 + Actor423: ftnk + Owner: Nod + Location: 105,77 + Facing: 150 + Actor424: hftk + Owner: Nod + Location: 56,8 + Facing: 261 + Actor425: hftk + Owner: Nod + Facing: 261 + Location: 78,101 + Actor426: hftk + Owner: Nod + Facing: 261 + Location: 78,104 + Actor427: hftk + Owner: Nod + Facing: 261 + Location: 74,76 + Actor428: hftk + Owner: Nod + Facing: 261 + Location: 74,79 + Actor429: hpad.td + Owner: Nod + Location: 113,8 + Actor430: hpad.td + Owner: Nod + Location: 116,8 + Actor431: hpad.td + Owner: Nod + Location: 114,4 + Obelisk1: obli + Owner: Nod + Location: 109,15 + Actor433: gun.nod + Owner: Nod + Location: 103,5 + TurretFacing: 325 + Actor434: gun.nod + Owner: Nod + Location: 105,11 + TurretFacing: 404 + Actor435: gun.nod + Owner: Nod + Location: 117,18 + TurretFacing: 507 + Actor436: gun.nod + Owner: Nod + Location: 125,15 + TurretFacing: 555 + Actor437: nsam + Owner: Nod + Location: 106,3 + Actor438: nsam + Owner: Nod + Location: 115,15 + Actor439: rep + Owner: Nod + Location: 119,5 + SESilo1: silo.td + Owner: Nod + Location: 119,81 + SESilo2: silo.td + Owner: Nod + Location: 120,83 + Actor442: nuk2 + Owner: Nod + Location: 123,8 + Actor443: nuk2 + Owner: Nod + Location: 111,2 + Actor444: nuk2 + Owner: Nod + Location: 109,3 + Actor445: nuk2 + Owner: Nod + Location: 109,11 + Actor446: nuk2 + Owner: Nod + Location: 112,12 + Actor447: nuk2 + Owner: Nod + Location: 120,9 + Actor448: nuk2 + Owner: Nod + Location: 123,11 + Actor449: nuk2 + Owner: Nod + Location: 120,12 + Actor450: sbag + Owner: Nod + Location: 110,9 + Actor451: sbag + Owner: Nod + Location: 110,8 + Actor452: sbag + Owner: Nod + Location: 110,7 + Actor453: sbag + Owner: Nod + Location: 109,7 + Actor454: sbag + Owner: Nod + Location: 108,7 + Actor455: sbag + Owner: Nod + Location: 107,7 + Actor456: sbag + Owner: Nod + Location: 107,6 + Actor457: sbag + Owner: Nod + Location: 116,13 + Actor458: sbag + Owner: Nod + Location: 117,13 + Actor459: sbag + Owner: Nod + Location: 118,13 + Actor460: sbag + Owner: Nod + Location: 115,13 + Actor461: n3 + Owner: Nod + Facing: 384 + Location: 108,6 + SubCell: 3 + Actor462: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 111,9 + Actor463: n3 + Owner: Nod + Facing: 384 + Location: 116,12 + SubCell: 3 + Actor466: n3 + Owner: Nod + Facing: 384 + Location: 117,12 + SubCell: 1 + Actor464: n4 + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 119,17 + Actor465: n4 + Owner: Nod + SubCell: 3 + Location: 123,16 + Facing: 491 + Actor467: n4 + Owner: Nod + Location: 105,10 + SubCell: 3 + Facing: 198 + Actor468: n4 + Owner: Nod + SubCell: 3 + Location: 103,6 + Facing: 198 + Actor469: bh + Owner: Nod + SubCell: 3 + Location: 121,15 + Facing: 467 + Actor470: cmec + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 116,34 + Actor471: n1 + Owner: Nod + SubCell: 3 + Location: 102,18 + Facing: 578 + Actor472: n1 + Owner: Nod + Facing: 384 + Location: 102,18 + SubCell: 1 + Actor473: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 104,18 + Actor474: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 107,20 + Actor475: n1 + Owner: Nod + SubCell: 3 + Location: 105,21 + Facing: 483 + Actor476: n3 + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 106,20 + Actor477: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 103,20 + Actor478: n4 + Owner: Nod + SubCell: 3 + Location: 74,12 + Facing: 103 + Actor479: n4 + Owner: Nod + Location: 74,12 + SubCell: 1 + Facing: 39 + Actor480: n1 + Owner: Nod + SubCell: 3 + Location: 57,6 + Facing: 174 + Actor481: n1 + Owner: Nod + Facing: 384 + Location: 57,6 + SubCell: 1 + Actor482: n1 + Owner: Nod + SubCell: 3 + Location: 54,7 + Facing: 253 + Actor483: n1 + Owner: Nod + SubCell: 3 + Location: 58,10 + Facing: 277 + Actor484: n1 + Owner: Nod + SubCell: 3 + Location: 72,13 + Facing: 174 + Actor485: n1 + Owner: Nod + Location: 81,17 + SubCell: 3 + Facing: 0 + Actor486: n1 + Owner: Nod + SubCell: 3 + Location: 76,18 + Facing: 126 + Actor487: n1 + Owner: Nod + SubCell: 3 + Location: 93,29 + Facing: 610 + Actor488: n1 + Owner: Nod + Facing: 384 + Location: 93,29 + SubCell: 1 + Actor489: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 88,32 + Actor490: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 83,34 + Actor491: n1 + Owner: Nod + SubCell: 3 + Location: 88,34 + Facing: 384 + Actor492: n1 + Owner: Nod + SubCell: 3 + Location: 105,79 + Facing: 103 + Actor493: n1 + Owner: Nod + Location: 105,79 + SubCell: 1 + Facing: 158 + Actor494: n1 + Owner: Nod + SubCell: 3 + Location: 102,80 + Facing: 182 + Actor495: n1 + Owner: Nod + SubCell: 3 + Location: 107,76 + Facing: 190 + Actor496: n1 + Owner: Nod + SubCell: 3 + Location: 106,74 + Facing: 166 + Actor497: n1 + Owner: Nod + SubCell: 3 + Location: 108,72 + Facing: 158 + Actor498: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 115,77 + Actor499: n1 + Owner: Nod + SubCell: 3 + Location: 119,93 + Facing: 618 + Actor500: n1 + Owner: Nod + SubCell: 3 + Location: 117,96 + Facing: 475 + Actor501: n1 + Owner: Nod + Facing: 384 + Location: 107,99 + SubCell: 3 + Actor502: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 103,98 + Actor503: n1 + Owner: Nod + Facing: 384 + Location: 103,98 + SubCell: 1 + Actor504: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 99,97 + Actor505: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 91,71 + Actor506: n1 + Owner: Nod + Facing: 384 + Location: 91,71 + SubCell: 1 + Actor507: n1 + Owner: Nod + SubCell: 3 + Location: 93,73 + Facing: 384 + Actor508: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 81,73 + Actor509: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 82,71 + Actor510: n1 + Owner: Nod + SubCell: 3 + Location: 80,81 + Facing: 158 + Actor511: n1 + Owner: Nod + SubCell: 3 + Location: 81,80 + Facing: 118 + Actor512: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 83,97 + Actor513: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 86,102 + Actor514: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 84,104 + Actor515: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 84,102 + Actor516: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 94,93 + Actor517: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 96,97 + Actor518: n1 + Owner: Nod + Facing: 384 + Location: 96,97 + SubCell: 1 + Actor519: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 93,87 + Actor520: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 91,88 + Actor521: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 93,90 + Actor522: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 54,29 + Actor524: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 56,27 + Actor525: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 41,25 + Actor526: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 42,28 + Actor527: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 52,36 + Actor528: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 54,39 + Actor529: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 53,37 + Actor530: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 15,33 + Actor531: stnk.nod + Owner: Nod + Location: 105,8 + Facing: 384 + Stance: Defend + Actor532: stnk.nod + Owner: Nod + Location: 121,17 + Facing: 384 + Stance: Defend + Actor533: mlrs + Owner: Nod + Facing: 384 + Location: 109,6 + Actor534: mlrs + Owner: Nod + Facing: 384 + Location: 115,12 + Actor535: apch + Owner: Nod + Location: 108,9 + Facing: 384 + Stance: Defend + Actor536: apch + Owner: Nod + Location: 118,15 + Facing: 384 + Stance: Defend + Actor537: n3 + Owner: Nod + Facing: 384 + Location: 88,32 + SubCell: 1 + Actor538: n3 + Owner: Nod + SubCell: 3 + Location: 58,8 + Facing: 222 + Actor539: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 101,97 + Actor540: n3 + Owner: Nod + SubCell: 3 + Location: 117,95 + Facing: 384 + Actor541: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 93,88 + Actor542: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 82,72 + Actor543: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 94,71 + Actor544: n3 + Owner: Nod + SubCell: 3 + Location: 74,13 + Facing: 384 + Actor545: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 14,21 + Actor546: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 45,28 + Actor547: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 64,52 + Actor548: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 66,56 + Actor549: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 76,76 + Actor550: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 75,80 + Actor551: n3 + Owner: Nod + SubCell: 3 + Location: 118,80 + Facing: 745 + SESAM2: nsam + Owner: Nod + Location: 112,77 + RiverSAM4: nsam + Owner: Nod + Location: 82,94 + RiverSAM2: nsam + Owner: Nod + Location: 71,49 + RiverSAM1: nsam + Owner: Nod + Location: 66,18 + RiverSAM3: nsam + Owner: Nod + Location: 81,63 + Actor558: nsam + Owner: Nod + Location: 98,67 + SSAM2: nsam + Owner: Nod + Location: 55,96 + NWSAM2: nsam + Owner: Nod + Location: 32,14 + Actor559: n1c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 109,50 + NWHarv: harv.td + Owner: Nod + Location: 25,19 + Facing: 384 + NHarv: harv.td + Owner: Nod + Location: 80,22 + Facing: 384 + NEHarv: harv.td + Owner: Nod + Location: 122,41 + Facing: 384 + SWHarv1: harv.td + Owner: Nod + Location: 52,103 + Facing: 384 + SWHarv2: harv.td + Owner: Nod + Location: 61,107 + Facing: 384 + SEHarv1: harv.td + Owner: Nod + Location: 105,80 + Facing: 384 + SEHarv2: harv.td + Owner: Nod + Location: 115,89 + Facing: 384 + RaidDest1: waypoint + Owner: Neutral + Location: 36,7 + RaidDest2: waypoint + Owner: Neutral + Location: 97,8 + RaidDest3: waypoint + Owner: Neutral + Location: 120,25 + RaidDest4: waypoint + Owner: Neutral + Location: 119,66 + RaidDest5: waypoint + Owner: Neutral + Location: 121,86 + RaidDest6: waypoint + Owner: Neutral + Location: 109,107 + RaidDest7: waypoint + Owner: Neutral + Location: 69,105 + RaidDest8: waypoint + Owner: Neutral + Location: 26,106 + RaidDest9: waypoint + Owner: Neutral + Location: 7,86 + RaidDest10: waypoint + Owner: Neutral + Location: 7,43 + WormholePoint2: waypoint + Owner: Neutral + Location: 22,55 + WormholePoint1: waypoint + Owner: Neutral + Location: 55,76 + SWStormriderDest: waypoint + Owner: Neutral + Location: 52,87 + NWStormriderDest: waypoint + Owner: Neutral + Location: 39,35 + Actor575: sfac + Owner: Scrin + Location: 32,66 + Actor573: rea2 + Owner: Scrin + Location: 31,59 + Actor574: rea2 + Owner: Scrin + Location: 33,57 + Actor577: rea2 + Owner: Scrin + Location: 37,60 + Actor578: corr + Owner: Scrin + Facing: 832 + Location: 47,60 + Actor579: grav + Owner: Scrin + Location: 41,58 + Actor580: camera + Owner: Nod + Location: 36,56 + Actor581: camera + Owner: Nod + Location: 25,68 + Actor582: camera + Owner: Nod + Location: 44,69 + Actor583: camera + Owner: Nod + Location: 45,94 + Actor584: camera + Owner: Nod + Location: 64,99 + Actor585: camera + Owner: Nod + Location: 24,36 + Actor586: camera + Owner: Nod + Location: 35,14 + Actor587: camera + Owner: Nod + Location: 76,16 + Actor588: camera + Owner: Nod + Location: 86,35 + Actor589: camera + Owner: Nod + Location: 115,35 + Actor590: camera + Owner: Nod + Location: 109,54 + Actor591: camera + Owner: Nod + Location: 102,76 + Actor592: camera + Owner: Nod + Location: 119,79 + Actor593: camera + Owner: Nod + Location: 100,100 + Actor594: camera + Owner: Nod + Location: 120,95 + Actor595: camera + Owner: Nod + Location: 12,70 + Actor596: bggy + Owner: Nod + Location: 38,29 + Facing: 658 + Actor597: bggy + Owner: Nod + Facing: 384 + Location: 55,37 + McvReplace: waypoint + Owner: Neutral + Location: 36,66 + PlayerStart: waypoint + Owner: Neutral + Location: 39,63 + NWSAM1: nsam + Owner: Nod + Location: 15,32 + SSAM1: nsam + Owner: Nod + Location: 37,97 + SAirSpawn: waypoint + Owner: Neutral + Location: 80,112 + SAirDest: waypoint + Owner: Neutral + Location: 74,62 + NSAM1: nsam + Owner: Nod + Location: 92,27 + NSAM2: nsam + Owner: Nod + Location: 82,17 + SESAM1: nsam + Owner: Nod + Location: 118,91 + NAirSpawn: waypoint + Owner: Neutral + Location: 68,1 + Actor598: scrt + Owner: Scrin + Location: 35,61 + Actor599: rea2 + Owner: Scrin + Location: 32,70 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-allegiances.yaml, ca|missions/main-campaign/ca19-proliferation/proliferation-rules.yaml, ca|rules/custom/coop-rules.yaml, proliferation-coop-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/coop-campaign/ca19-proliferation-coop/proliferation-coop-rules.yaml b/mods/ca/missions/coop-campaign/ca19-proliferation-coop/proliferation-coop-rules.yaml new file mode 100644 index 0000000000..666c49ff9e --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca19-proliferation-coop/proliferation-coop-rules.yaml @@ -0,0 +1,33 @@ +World: + LuaScript: + Scripts: campaign.lua, coop.lua, ca|missions/main-campaign/ca19-proliferation/proliferation.lua, proliferation-coop.lua + ScriptLobbyDropdown@basesharing: + Values: + -0: + Default: 1 + Locked: True + ScriptLobbyDropdown@incomeshare: + Values: + -10: + -15: + -20: + -25: + -30: + -35: + -40: + -45: + -50: + -100: + -125: + -150: + -175: + -999: + Default: 0 + Locked: True + LobbyMissionInfo@InitialObjectives: + Prefix: Initial Objectives + Text: • Establish and secure harvesting operations at all Tiberium fields.\n• Remove all Nod harvesting operations. + +^SendCashPower: + SendCashPower@SendCash: + Prerequisites: ~disabled diff --git a/mods/ca/missions/coop-campaign/ca19-proliferation-coop/proliferation-coop.lua b/mods/ca/missions/coop-campaign/ca19-proliferation-coop/proliferation-coop.lua new file mode 100644 index 0000000000..978092bd02 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca19-proliferation-coop/proliferation-coop.lua @@ -0,0 +1,111 @@ + +if CoopAttackStrengthMultiplier ~= nil and RaidInterval ~= nil and RaidInterval[Difficulty] ~= nil then + RaidInterval[Difficulty] = math.max(RaidInterval[Difficulty] / CoopAttackStrengthMultiplier, 25) +end + +SetupPlayers = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Multi2 = Player.GetPlayer("Multi2") + Multi3 = Player.GetPlayer("Multi3") + Multi4 = Player.GetPlayer("Multi4") + Multi5 = Player.GetPlayer("Multi5") + Scrin = Player.GetPlayer("Scrin") + Nod = Player.GetPlayer("Nod") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = Utils.Where({ Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 }, function(p) return p ~= nil end) + MissionEnemies = { Nod } + SinglePlayerPlayer = Scrin + CoopInit() +end + +AfterWorldLoaded = function() + local firstActivePlayer = GetFirstActivePlayer() + TransferBaseToPlayer(SinglePlayerPlayer, firstActivePlayer) + TotalFundsDisplay = 0 + ColonyPlatformsBeingReplaced = {} + + if #MissionPlayers > 1 then + Actor3.Owner = MissionPlayers[2] + Actor599.Owner = MissionPlayers[2] + Actor11.Owner = MissionPlayers[2] + Trigger.AfterDelay(1, function() + Scrin.GetActorsByType("harv.scrin")[2].Owner = MissionPlayers[2] + end) + end + + if #MissionPlayers > 2 then + Actor342.Owner = MissionPlayers[3] + Actor11.Owner = MissionPlayers[3] + end + + Utils.Do(MissionPlayers, function(p) + if p ~= firstActivePlayer then + p.Cash = 3000 + end + end) +end + +AfterTick = function() + +end + +UpdateObjectiveMessage = function() + if FieldsClearedAndBeingHarvested == 6 then + UserInterface.SetMissionText("6 of 6 fields occupied.\n Maintain for " .. UtilsCA.FormatTimeForGameSpeed(TimerTicks), HSLColor.Lime) + else + local missionText = FieldsClearedAndBeingHarvested .. " of 6 fields occupied - Next reinforcement threshold: $" .. TotalFundsDisplay .. "/" .. NextReinforcementThreshold + UserInterface.SetMissionText(missionText, HSLColor.Yellow) + end +end + +CheckReinforcementThreshold = function() + local CoopTotalFunds = 0 + Utils.Do(MissionPlayers, function(p) + local playerTotalFunds = p.Resources + CoopTotalFunds = CoopTotalFunds + playerTotalFunds + end) + + TotalFundsDisplay = CoopTotalFunds + + if CoopTotalFunds >= NextReinforcementThreshold then + Utils.Do(MissionPlayers, function(p) + p.Resources = p.Resources - (NextReinforcementThreshold / #MissionPlayers) + end) + + if NextReinforcementThreshold < ReinforcementFinalThreshold[Difficulty] then + NextReinforcementThreshold = NextReinforcementThreshold + ReinforcementThresholdIncrement + end + + DoReinforcements() + end +end + +CheckColonyPlatform = function() + Utils.Do(GetMcvPlayers(), function(p) + local colonyPlatformsAndMcvs = p.GetActorsByTypes({ "smcv", "sfac" }) + if #colonyPlatformsAndMcvs == 0 and not ColonyPlatformsBeingReplaced[p.InternalName] then + ColonyPlatformsBeingReplaced[p.InternalName] = true + Trigger.AfterDelay(DateTime.Seconds(Utils.RandomInteger(7,16)), function() + local wormhole = Actor.Create("wormhole", true, { Owner = p, Location = McvReplace.Location }) + Trigger.AfterDelay(DateTime.Seconds(1), function() + if p.IsLocalPlayer then + Media.PlaySpeechNotification(p, "ReinforcementsArrived") + Notification("Reinforcements have arrived.") + Beacon.New(p, McvReplace.CenterPosition) + end + Reinforcements.Reinforce(p, { "smcv" }, { McvReplace.Location }) + Trigger.AfterDelay(1, function() + ColonyPlatformsBeingReplaced[p.InternalName] = false + end) + if DateTime.GameTime < DateTime.Minutes(1) then + p.Cash = p.Cash + 2500 + end + end) + Trigger.AfterDelay(DateTime.Seconds(3), function() + wormhole.Kill() + end) + end) + end + end) +end diff --git a/mods/ca/missions/coop-campaign/ca20-encroachment-coop/encroachment-coop-rules.yaml b/mods/ca/missions/coop-campaign/ca20-encroachment-coop/encroachment-coop-rules.yaml new file mode 100644 index 0000000000..672565e4e1 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca20-encroachment-coop/encroachment-coop-rules.yaml @@ -0,0 +1,6 @@ +World: + LuaScript: + Scripts: campaign.lua, coop.lua, ca|missions/main-campaign/ca20-encroachment/encroachment.lua, encroachment-coop.lua + LobbyMissionInfo@InitialObjectives: + Prefix: Initial Objectives + Text: • Destroy the Allied Weather Control Device and GDI Advanced Communications Center. \ No newline at end of file diff --git a/mods/ca/missions/coop-campaign/ca20-encroachment-coop/encroachment-coop.lua b/mods/ca/missions/coop-campaign/ca20-encroachment-coop/encroachment-coop.lua new file mode 100644 index 0000000000..6c0275245b --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca20-encroachment-coop/encroachment-coop.lua @@ -0,0 +1,35 @@ + +SetupPlayers = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Multi2 = Player.GetPlayer("Multi2") + Multi3 = Player.GetPlayer("Multi3") + Multi4 = Player.GetPlayer("Multi4") + Multi5 = Player.GetPlayer("Multi5") + Scrin = Player.GetPlayer("Scrin") + Greece = Player.GetPlayer("Greece") + GDI = Player.GetPlayer("GDI") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = Utils.Where({ Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 }, function(p) return p ~= nil end) + MissionEnemies = { Greece, GDI } + SinglePlayerPlayer = Scrin + CoopInit() +end + +AfterWorldLoaded = function() + local firstActivePlayer = GetFirstActivePlayer() + TransferBaseToPlayer(SinglePlayerPlayer, firstActivePlayer) + StartCashSpread(3500) + + local mcvSpawnCell = CPos.New(45, 3) + Utils.Do(GetMcvPlayers(), function(p) + if p ~= firstActivePlayer then + local mcv = Actor.Create("smcv", true, { Owner = p, Location = mcvSpawnCell }) + mcv.Scatter() + end + end) +end + +AfterTick = function() + +end diff --git a/mods/ca/missions/coop-campaign/ca20-encroachment-coop/map.bin b/mods/ca/missions/coop-campaign/ca20-encroachment-coop/map.bin new file mode 100644 index 0000000000..224b59b356 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca20-encroachment-coop/map.bin differ diff --git a/mods/ca/missions/coop-campaign/ca20-encroachment-coop/map.png b/mods/ca/missions/coop-campaign/ca20-encroachment-coop/map.png new file mode 100644 index 0000000000..ea5406566d Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca20-encroachment-coop/map.png differ diff --git a/mods/ca/missions/coop-campaign/ca20-encroachment-coop/map.yaml b/mods/ca/missions/coop-campaign/ca20-encroachment-coop/map.yaml new file mode 100644 index 0000000000..4fc236a937 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca20-encroachment-coop/map.yaml @@ -0,0 +1,3349 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 20: Encroachment Co-op + +Author: Darkademic & Gandorques Hikla + +Tileset: WINTER + +MapSize: 98,114 + +Bounds: 1,1,96,112 + +Visibility: Lobby + +Categories: Co-op Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: Scrin, Greece, GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + PlayerReference@Scrin: + Name: Scrin + Faction: scrin + Color: 7700FF + Allies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Greece, GDI, Creeps + PlayerReference@Greece: + Name: Greece + Bot: campaign + Faction: allies + Color: 99ACF2 + Allies: GDI + Enemies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@GDI: + Name: GDI + Bot: campaign + Faction: gdi + Color: F2CF74 + Allies: Greece + Enemies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: scrin + Color: 7700FF + LockColor: True + Allies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Greece, GDI, Creeps + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: scrin + Color: D83CE5 + LockColor: True + Allies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Greece, GDI, Creeps + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: scrin + Color: 0B7310 + LockColor: True + Allies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Greece, GDI, Creeps + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: scrin + Color: 775A12 + LockColor: True + Allies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Greece, GDI, Creeps + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: scrin + Color: 82C900 + LockColor: True + Allies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Greece, GDI, Creeps + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: scrin + Color: EEA8A8 + LockColor: True + Allies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Greece, GDI, Creeps + +Actors: + Actor0: t07 + Owner: Neutral + Location: 46,14 + Actor1: tc01 + Owner: Neutral + Location: 64,19 + Actor2: tc05 + Owner: Neutral + Location: 71,15 + Actor3: t05 + Owner: Neutral + Location: 73,18 + Actor4: sfac + Owner: Scrin + Location: 47,7 + Actor5: reac + Owner: Scrin + Location: 51,5 + Actor6: port + Owner: Scrin + Location: 41,8 + Actor7: proc.scrin + Owner: Scrin + Location: 52,9 + Actor8: split2 + Owner: Neutral + Location: 61,13 + Actor9: split2 + Owner: Neutral + Location: 60,19 + Actor10: seek + Owner: Scrin + Facing: 384 + Location: 37,9 + Actor11: seek + Owner: Scrin + Location: 57,9 + Facing: 658 + Actor12: gunw + Owner: Scrin + Location: 39,11 + Facing: 384 + Actor13: gunw + Owner: Scrin + Location: 54,14 + Facing: 578 + Actor14: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 38,10 + Actor15: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 36,8 + Actor16: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 40,13 + Actor17: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 38,12 + Actor18: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 57,10 + Actor19: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 56,13 + Actor20: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 54,7 + Actor21: sbag + Owner: Greece + Location: 13,7 + Actor22: sbag + Owner: Greece + Location: 13,8 + Actor23: sbag + Owner: Greece + Location: 12,7 + Actor24: sbag + Owner: Greece + Location: 11,7 + Actor25: sbag + Owner: Greece + Location: 10,7 + Actor26: sbag + Owner: Greece + Location: 5,7 + Actor27: sbag + Owner: Greece + Location: 4,7 + Actor28: sbag + Owner: Greece + Location: 3,7 + Actor29: sbag + Owner: Greece + Location: 2,7 + Actor30: sbag + Owner: Greece + Location: 1,7 + Actor31: sbag + Owner: Greece + Location: 1,8 + Actor32: sbag + Owner: Greece + Location: 1,9 + Actor33: sbag + Owner: Greece + Location: 1,10 + Actor34: sbag + Owner: Greece + Location: 1,11 + Actor35: sbag + Owner: Greece + Location: 1,12 + Actor36: sbag + Owner: Greece + Location: 1,13 + Actor37: sbag + Owner: Greece + Location: 1,14 + Actor38: sbag + Owner: Greece + Location: 1,15 + Actor39: sbag + Owner: Greece + Location: 1,16 + Actor40: sbag + Owner: Greece + Location: 2,16 + Actor41: sbag + Owner: Greece + Location: 3,16 + Actor42: sbag + Owner: Greece + Location: 5,16 + Actor43: sbag + Owner: Greece + Location: 4,16 + Actor44: sbag + Owner: Greece + Location: 10,16 + Actor45: sbag + Owner: Greece + Location: 6,16 + Actor46: sbag + Owner: Greece + Location: 6,7 + Actor47: sbag + Owner: Greece + Location: 12,16 + Actor48: sbag + Owner: Greece + Location: 11,16 + Actor49: sbag + Owner: Greece + Location: 13,16 + Actor50: sbag + Owner: Greece + Location: 13,9 + Actor51: sbag + Owner: Greece + Location: 13,10 + Actor52: sbag + Owner: Greece + Location: 13,15 + Actor53: sbag + Owner: Greece + Location: 13,14 + Actor54: sbag + Owner: Greece + Location: 13,13 + Actor55: split2 + Owner: Neutral + Location: 16,15 + NWBuilding3: proc + Owner: Greece + Location: 9,11 + Actor58: silo + Owner: Greece + Location: 11,11 + Actor59: silo + Owner: Greece + Location: 9,11 + WPowered10: agun + Owner: Greece + Location: 12,8 + TurretFacing: 832 + WPowered9: agun + Owner: Greece + Location: 2,15 + TurretFacing: 832 + NWBuilding1: powr + Owner: Greece + Location: 2,8 + NWBuilding2: powr + Owner: Greece + Location: 4,8 + NWBuilding4: tent + Owner: Greece + Location: 4,12 + Actor70: sbag + Owner: GDI + Location: 75,26 + Actor71: sbag + Owner: GDI + Location: 76,26 + Actor72: sbag + Owner: GDI + Location: 77,26 + Actor73: sbag + Owner: GDI + Location: 78,26 + Actor74: sbag + Owner: GDI + Location: 82,26 + Actor75: sbag + Owner: GDI + Location: 83,26 + Actor76: sbag + Owner: GDI + Location: 84,26 + Actor77: sbag + Owner: GDI + Location: 85,26 + Actor78: sbag + Owner: GDI + Location: 86,26 + Actor79: sbag + Owner: GDI + Location: 87,26 + Actor80: sbag + Owner: GDI + Location: 74,26 + Actor81: sbag + Owner: GDI + Location: 73,26 + Actor82: sbag + Owner: GDI + Location: 73,27 + Actor83: sbag + Owner: GDI + Location: 73,28 + Actor84: sbag + Owner: GDI + Location: 73,29 + Actor85: sbag + Owner: GDI + Location: 73,33 + Actor86: sbag + Owner: GDI + Location: 73,34 + Actor87: sbag + Owner: GDI + Location: 73,35 + Actor88: sbag + Owner: GDI + Location: 73,36 + Actor89: sbag + Owner: GDI + Location: 74,36 + Actor90: sbag + Owner: GDI + Location: 76,36 + Actor91: sbag + Owner: GDI + Location: 75,36 + Actor92: sbag + Owner: GDI + Location: 77,36 + Actor93: sbag + Owner: GDI + Location: 78,36 + Actor94: sbag + Owner: GDI + Location: 82,36 + Actor95: sbag + Owner: GDI + Location: 83,36 + Actor96: sbag + Owner: GDI + Location: 85,36 + Actor97: sbag + Owner: GDI + Location: 84,36 + Actor98: sbag + Owner: GDI + Location: 86,36 + Actor99: sbag + Owner: GDI + Location: 87,27 + Actor100: sbag + Owner: GDI + Location: 87,28 + Actor101: sbag + Owner: GDI + Location: 87,29 + Actor105: sbag + Owner: GDI + Location: 87,33 + Actor106: sbag + Owner: GDI + Location: 87,34 + Actor107: sbag + Owner: GDI + Location: 87,35 + Actor108: sbag + Owner: GDI + Location: 87,36 + NEBuilding6: nuke + Owner: GDI + Location: 85,33 + NEBuilding5: nuke + Owner: GDI + Location: 83,33 + NEBuilding1: pyle + Owner: GDI + Location: 76,28 + NEBuilding8: gtwr + Owner: GDI + Location: 77,25 + NEBuilding7: gtwr + Owner: GDI + Location: 72,28 + NEBuilding2: proc.td + Owner: GDI + Location: 83,28 + NEBuilding3: silo.td + Owner: GDI + Location: 74,35 + NEBuilding4: silo.td + Owner: GDI + Location: 76,35 + Actor122: cram + Owner: GDI + Location: 80,31 + TurretFacing: 832 + Actor121: split2 + Owner: Neutral + Location: 91,31 + AdvancedComms: eye + Owner: GDI + Location: 77,93 + Actor125: chain + Owner: GDI + Location: 77,91 + Actor126: chain + Owner: GDI + Location: 76,91 + Actor127: chain + Owner: GDI + Location: 75,91 + Actor128: chain + Owner: GDI + Location: 75,92 + Actor129: chain + Owner: GDI + Location: 75,94 + Actor130: chain + Owner: GDI + Location: 75,93 + Actor131: chain + Owner: GDI + Location: 75,95 + Actor132: chain + Owner: GDI + Location: 78,91 + Actor133: chain + Owner: GDI + Location: 79,91 + Actor134: chain + Owner: GDI + Location: 80,91 + Actor135: chain + Owner: GDI + Location: 80,92 + Actor136: chain + Owner: GDI + Location: 80,93 + Actor137: chain + Owner: GDI + Location: 80,94 + Actor138: chain + Owner: GDI + Location: 80,95 + Actor139: chain + Owner: GDI + Location: 75,96 + Actor140: chain + Owner: GDI + Location: 75,97 + Actor141: chain + Owner: GDI + Location: 76,97 + Actor142: chain + Owner: GDI + Location: 79,97 + Actor143: chain + Owner: GDI + Location: 80,97 + Actor144: chain + Owner: GDI + Location: 80,96 + Actor145: gun + Owner: Greece + Location: 27,30 + TurretFacing: 872 + Actor146: gun + Owner: Greece + Location: 34,33 + TurretFacing: 935 + Actor196: hpad + Owner: Greece + Location: 40,42 + Actor197: hpad + Owner: Greece + Location: 37,42 + Actor198: chain + Owner: Greece + Location: 37,41 + Actor199: chain + Owner: Greece + Location: 38,41 + Actor200: chain + Owner: Greece + Location: 39,41 + Actor201: chain + Owner: Greece + Location: 40,41 + Actor202: chain + Owner: Greece + Location: 41,41 + Actor203: chain + Owner: Greece + Location: 42,41 + Actor204: chain + Owner: Greece + Location: 42,42 + Actor205: chain + Owner: Greece + Location: 42,43 + Actor206: chain + Owner: Greece + Location: 42,44 + Actor207: chain + Owner: Greece + Location: 36,41 + Actor208: chain + Owner: Greece + Location: 36,42 + Actor209: chain + Owner: Greece + Location: 36,43 + Actor210: chain + Owner: Greece + Location: 36,44 + Actor211: chain + Owner: Greece + Location: 36,46 + Actor212: chain + Owner: Greece + Location: 36,47 + Actor213: chain + Owner: Greece + Location: 38,47 + Actor214: chain + Owner: Greece + Location: 37,47 + Actor215: chain + Owner: Greece + Location: 39,47 + Actor216: chain + Owner: Greece + Location: 40,47 + Actor217: chain + Owner: Greece + Location: 41,47 + Actor218: chain + Owner: Greece + Location: 42,47 + Actor219: chain + Owner: Greece + Location: 42,46 + WPowered7: agun + Owner: Greece + Location: 37,46 + TurretFacing: 832 + WPowered8: agun + Owner: Greece + Location: 41,46 + TurretFacing: 832 + Actor222: pbox + Owner: Greece + Location: 35,43 + Actor223: split2 + Owner: Neutral + Location: 87,4 + Actor224: split2 + Owner: Neutral + Location: 90,12 + Actor187: brik + Owner: Greece + Location: 4,36 + Actor188: brik + Owner: Greece + Location: 5,36 + Actor189: brik + Owner: Greece + Location: 6,36 + Actor190: brik + Owner: Greece + Location: 7,36 + Actor191: brik + Owner: Greece + Location: 8,36 + Actor192: brik + Owner: Greece + Location: 9,36 + Actor193: brik + Owner: Greece + Location: 10,36 + Actor226: brik + Owner: Greece + Location: 11,36 + Actor227: brik + Owner: Greece + Location: 12,36 + Actor228: brik + Owner: Greece + Location: 13,36 + Actor229: brik + Owner: Greece + Location: 4,37 + WPower1: apwr + Owner: Greece + Location: 5,37 + WPower4: apwr + Owner: Greece + Location: 8,37 + Actor232: brik + Owner: Greece + Location: 13,37 + Actor234: brik + Owner: Greece + Location: 4,38 + Actor235: brik + Owner: Greece + Location: 12,38 + Actor236: brik + Owner: Greece + Location: 13,38 + Actor238: brik + Owner: Greece + Location: 4,39 + Actor239: brik + Owner: Greece + Location: 12,39 + Actor241: brik + Owner: Greece + Location: 13,39 + Actor242: pbox + Owner: Greece + Location: 14,39 + Actor243: brik + Owner: Greece + Location: 4,40 + WPower2: apwr + Owner: Greece + Location: 5,40 + WPower5: apwr + Owner: Greece + Location: 8,40 + Actor248: brik + Owner: Greece + Location: 4,41 + WPowered1: gap + Owner: Greece + Location: 12,41 + Actor252: brik + Owner: Greece + Location: 4,42 + Actor253: brik + Owner: Greece + Location: 4,43 + WPower3: apwr + Owner: Greece + Location: 5,43 + WPower6: apwr + Owner: Greece + Location: 8,43 + Actor257: brik + Owner: Greece + Location: 12,43 + Actor258: brik + Owner: Greece + Location: 13,43 + Actor260: pbox + Owner: Greece + Location: 14,43 + Actor264: brik + Owner: Greece + Location: 4,44 + Actor265: brik + Owner: Greece + Location: 12,44 + Actor266: brik + Owner: Greece + Location: 13,44 + Actor267: brik + Owner: Greece + Location: 4,45 + Actor268: brik + Owner: Greece + Location: 13,45 + Actor269: brik + Owner: Greece + Location: 4,46 + Actor270: brik + Owner: Greece + Location: 5,46 + Actor271: brik + Owner: Greece + Location: 6,46 + Actor272: brik + Owner: Greece + Location: 7,46 + Actor273: brik + Owner: Greece + Location: 8,46 + Actor274: brik + Owner: Greece + Location: 9,46 + Actor275: brik + Owner: Greece + Location: 10,46 + Actor276: brik + Owner: Greece + Location: 11,46 + Actor277: brik + Owner: Greece + Location: 12,46 + Actor278: brik + Owner: Greece + Location: 13,46 + WPowered2: agun + Owner: Greece + Location: 12,37 + TurretFacing: 832 + WPowered3: agun + Owner: Greece + Location: 12,45 + TurretFacing: 832 + Actor237: brik + Owner: Greece + Location: 14,33 + Actor240: brik + Owner: Greece + Location: 14,32 + Actor244: brik + Owner: Greece + Location: 15,32 + Actor247: brik + Owner: Greece + Location: 16,32 + Actor249: brik + Owner: Greece + Location: 17,32 + Actor250: brik + Owner: Greece + Location: 15,33 + Actor256: brik + Owner: Greece + Location: 17,33 + Actor259: brik + Owner: Greece + Location: 18,33 + Actor261: brik + Owner: Greece + Location: 18,32 + Actor262: brik + Owner: Greece + Location: 22,32 + Actor263: brik + Owner: Greece + Location: 22,33 + Actor279: brik + Owner: Greece + Location: 23,32 + Actor280: brik + Owner: Greece + Location: 23,33 + Actor281: brik + Owner: Greece + Location: 24,32 + Actor282: brik + Owner: Greece + Location: 25,32 + Actor283: brik + Owner: Greece + Location: 26,32 + Actor284: brik + Owner: Greece + Location: 27,32 + Actor285: brik + Owner: Greece + Location: 28,32 + Actor286: brik + Owner: Greece + Location: 28,33 + Actor287: brik + Owner: Greece + Location: 27,33 + Actor288: sbag + Owner: Greece + Location: 14,31 + Actor289: sbag + Owner: Greece + Location: 15,31 + Actor290: sbag + Owner: Greece + Location: 16,31 + Actor291: sbag + Owner: Greece + Location: 17,31 + Actor292: sbag + Owner: Greece + Location: 18,31 + Actor293: sbag + Owner: Greece + Location: 22,31 + Actor294: sbag + Owner: Greece + Location: 23,31 + Actor295: sbag + Owner: Greece + Location: 24,31 + Actor296: sbag + Owner: Greece + Location: 25,31 + Actor297: sbag + Owner: Greece + Location: 26,31 + Actor298: sbag + Owner: Greece + Location: 27,31 + WPowered4: pris + Owner: Greece + Location: 16,33 + WPowered5: pris + Owner: Greece + Location: 24,33 + WPowered6: agun + Owner: Greece + Location: 26,33 + TurretFacing: 832 + WPowered11: agun + Owner: Greece + Location: 36,36 + TurretFacing: 832 + Actor304: pbox + Owner: Greece + Location: 22,30 + Actor305: pbox + Owner: Greece + Location: 18,30 + Actor303: split2 + Owner: Neutral + Location: 24,50 + Actor306: split2 + Owner: Neutral + Location: 26,55 + Actor307: split2 + Owner: Neutral + Location: 18,56 + Actor309: sbag + Owner: Greece + Location: 30,59 + Actor310: sbag + Owner: Greece + Location: 31,59 + Actor311: sbag + Owner: Greece + Location: 30,60 + Actor312: sbag + Owner: Greece + Location: 30,61 + Actor313: sbag + Owner: Greece + Location: 29,61 + Actor308: sbag + Owner: Greece + Location: 29,62 + Actor314: sbag + Owner: Greece + Location: 28,62 + Actor315: sbag + Owner: Greece + Location: 27,62 + Actor316: sbag + Owner: Greece + Location: 27,63 + Actor317: sbag + Owner: Greece + Location: 32,59 + Actor318: sbag + Owner: Greece + Location: 36,59 + Actor319: sbag + Owner: Greece + Location: 37,59 + Actor320: sbag + Owner: Greece + Location: 38,59 + Actor321: sbag + Owner: Greece + Location: 39,59 + Actor322: sbag + Owner: Greece + Location: 40,59 + Actor324: sbag + Owner: Greece + Location: 27,68 + Actor325: sbag + Owner: Greece + Location: 27,69 + Actor326: sbag + Owner: Greece + Location: 27,70 + Actor327: sbag + Owner: Greece + Location: 28,70 + Actor328: sbag + Owner: Greece + Location: 29,70 + Actor329: sbag + Owner: Greece + Location: 30,70 + Actor330: sbag + Owner: Greece + Location: 31,70 + Actor331: sbag + Owner: Greece + Location: 36,70 + Actor332: sbag + Owner: Greece + Location: 32,70 + Actor333: sbag + Owner: Greece + Location: 37,70 + Actor334: sbag + Owner: Greece + Location: 38,70 + Actor335: sbag + Owner: Greece + Location: 39,70 + Actor336: sbag + Owner: Greece + Location: 40,70 + Actor337: sbag + Owner: Greece + Location: 41,59 + Actor338: sbag + Owner: Greece + Location: 41,60 + MBuilding1: proc + Owner: Greece + Location: 30,61 + Actor340: silo + Owner: Greece + Location: 28,63 + MBuilding3: tent + Owner: Greece + Location: 39,60 + MBuilding4: dome + Owner: Greece + Location: 28,67 + MBuilding5: powr + Owner: Greece + Location: 37,67 + MBuilding6: powr + Owner: Greece + Location: 39,67 + Actor347: sbag + Owner: Greece + Location: 41,68 + Actor348: sbag + Owner: Greece + Location: 41,69 + Actor349: sbag + Owner: Greece + Location: 41,70 + Actor350: sbag + Owner: Greece + Location: 41,62 + Actor351: sbag + Owner: Greece + Location: 41,61 + Actor345: sbag + Owner: Greece + Location: 41,63 + Actor352: sbag + Owner: Greece + Location: 41,67 + Actor353: sbag + Owner: Greece + Location: 27,67 + MBuilding2: powr + Owner: Greece + Location: 37,60 + Actor346: pbox + Owner: Greece + Location: 31,58 + Actor354: pbox + Owner: Greece + Location: 37,58 + Actor355: pbox + Owner: Greece + Location: 31,71 + Actor356: pbox + Owner: Greece + Location: 37,71 + Actor357: t10 + Owner: Neutral + Faction: germany + Location: 40,39 + Actor358: t02 + Owner: Neutral + Faction: germany + Location: 76,47 + Actor359: tc05 + Owner: Neutral + Faction: germany + Location: 86,39 + Actor373: afac + Owner: GDI + Location: 82,101 + SEPower6: nuk2 + Owner: GDI + Location: 79,101 + SEPower5: nuk2 + Owner: GDI + Location: 77,101 + SEPower4: nuk2 + Owner: GDI + Location: 75,101 + SEPower2: nuk2 + Owner: GDI + Location: 66,96 + SEPower1: nuk2 + Owner: GDI + Location: 65,93 + GDISouthFactory: weap.td + Owner: GDI + Location: 80,85 + Actor385: proc.td + Owner: GDI + Location: 70,86 + SEPowered7: stwr + Owner: GDI + Location: 71,81 + TurretFacing: 63 + SEPowered8: stwr + Owner: GDI + Location: 79,80 + TurretFacing: 23 + SEPowered1: atwr + Owner: GDI + Location: 65,96 + SEPowered2: atwr + Owner: GDI + Location: 86,88 + Actor390: gtwr + Owner: GDI + Location: 69,81 + Actor391: gtwr + Owner: GDI + Location: 81,80 + Actor392: hq + Owner: GDI + Location: 69,95 + Actor381: upgc + Owner: GDI + Location: 69,100 + TurretFacing: 384 + SEPower3: nuk2 + Owner: GDI + Location: 72,100 + GDISouthBarracks: pyle + Owner: GDI + Location: 75,86 + Actor396: silo.td + Owner: GDI + Location: 70,91 + Actor397: silo.td + Owner: GDI + Location: 69,93 + Actor399: afld.gdi + Owner: GDI + Location: 84,93 + SEPower7: nuk2 + Owner: GDI + Location: 86,100 + Actor393: gtek + Owner: GDI + Location: 84,96 + Actor361: chain + Owner: Greece + Location: 9,86 + Actor362: chain + Owner: Greece + Location: 10,86 + Actor363: chain + Owner: Greece + Location: 11,86 + Actor364: chain + Owner: Greece + Location: 12,86 + Actor365: chain + Owner: Greece + Location: 13,86 + Actor367: chain + Owner: Greece + Location: 14,86 + Actor369: chain + Owner: Greece + Location: 9,87 + Actor370: chain + Owner: Greece + Location: 14,87 + Actor374: chain + Owner: Greece + Location: 9,88 + WeatherControl: weat + Owner: Greece + Location: 11,88 + Actor377: chain + Owner: Greece + Location: 14,88 + Actor401: chain + Owner: Greece + Location: 9,89 + Actor402: chain + Owner: Greece + Location: 9,90 + Actor403: chain + Owner: Greece + Location: 14,90 + Actor404: chain + Owner: Greece + Location: 9,91 + Actor405: chain + Owner: Greece + Location: 10,91 + Actor406: chain + Owner: Greece + Location: 13,91 + Actor407: chain + Owner: Greece + Location: 14,91 + Actor360: brik + Owner: Greece + Location: 8,86 + Actor366: brik + Owner: Greece + Location: 8,87 + Actor368: brik + Owner: Greece + Location: 8,88 + Actor371: brik + Owner: Greece + Location: 8,89 + Actor372: brik + Owner: Greece + Location: 8,90 + Actor375: brik + Owner: Greece + Location: 8,91 + Actor408: brik + Owner: Greece + Location: 8,85 + Actor409: brik + Owner: Greece + Location: 9,85 + Actor410: brik + Owner: Greece + Location: 9,84 + Actor411: brik + Owner: Greece + Location: 10,84 + Actor412: brik + Owner: Greece + Location: 11,84 + Actor413: brik + Owner: Greece + Location: 12,84 + Actor414: brik + Owner: Greece + Location: 13,84 + Actor415: brik + Owner: Greece + Location: 13,83 + Actor416: brik + Owner: Greece + Location: 14,83 + Actor417: brik + Owner: Greece + Location: 15,83 + Actor418: brik + Owner: Greece + Location: 16,83 + Actor419: brik + Owner: Greece + Location: 17,83 + Actor420: brik + Owner: Greece + Location: 17,82 + Actor421: brik + Owner: Greece + Location: 18,82 + Actor422: brik + Owner: Greece + Location: 19,82 + Actor423: brik + Owner: Greece + Location: 20,82 + Actor424: brik + Owner: Greece + Location: 21,82 + Actor425: brik + Owner: Greece + Location: 8,92 + Actor426: brik + Owner: Greece + Location: 8,94 + Actor427: brik + Owner: Greece + Location: 8,93 + Actor428: brik + Owner: Greece + Location: 8,95 + Actor429: brik + Owner: Greece + Location: 8,96 + Actor430: brik + Owner: Greece + Location: 8,97 + Actor431: brik + Owner: Greece + Location: 8,99 + Actor432: brik + Owner: Greece + Location: 8,98 + Actor433: brik + Owner: Greece + Location: 8,100 + Actor434: brik + Owner: Greece + Location: 8,101 + Actor435: brik + Owner: Greece + Location: 8,102 + Actor436: brik + Owner: Greece + Location: 8,103 + Actor437: brik + Owner: Greece + Location: 8,104 + Actor438: brik + Owner: Greece + Location: 9,104 + Actor439: brik + Owner: Greece + Location: 10,104 + Actor440: brik + Owner: Greece + Location: 11,104 + Actor441: brik + Owner: Greece + Location: 12,104 + Actor442: brik + Owner: Greece + Location: 13,104 + Actor443: brik + Owner: Greece + Location: 14,104 + Actor444: brik + Owner: Greece + Location: 14,103 + Actor445: brik + Owner: Greece + Location: 13,103 + Actor446: brik + Owner: Greece + Location: 18,103 + Actor447: brik + Owner: Greece + Location: 18,104 + Actor448: brik + Owner: Greece + Location: 19,103 + Actor449: brik + Owner: Greece + Location: 19,104 + Actor450: brik + Owner: Greece + Location: 20,104 + Actor451: brik + Owner: Greece + Location: 21,104 + Actor452: brik + Owner: Greece + Location: 22,104 + Actor453: brik + Owner: Greece + Location: 23,104 + Actor454: brik + Owner: Greece + Location: 24,104 + Actor455: brik + Owner: Greece + Location: 25,104 + Actor456: brik + Owner: Greece + Location: 25,103 + Actor457: brik + Owner: Greece + Location: 25,102 + Actor458: brik + Owner: Greece + Location: 25,101 + Actor459: brik + Owner: Greece + Location: 25,100 + Actor460: brik + Owner: Greece + Location: 25,99 + Actor461: brik + Owner: Greece + Location: 25,98 + Actor462: brik + Owner: Greece + Location: 25,97 + Actor463: brik + Owner: Greece + Location: 25,96 + Actor464: brik + Owner: Greece + Location: 25,82 + Actor465: brik + Owner: Greece + Location: 24,82 + Actor466: brik + Owner: Greece + Location: 23,82 + Actor467: brik + Owner: Greece + Location: 22,82 + Actor468: brik + Owner: Greece + Location: 25,83 + Actor469: brik + Owner: Greece + Location: 25,84 + Actor470: brik + Owner: Greece + Location: 25,85 + Actor471: brik + Owner: Greece + Location: 25,86 + Actor472: brik + Owner: Greece + Location: 25,87 + Actor473: brik + Owner: Greece + Location: 25,88 + Actor474: brik + Owner: Greece + Location: 25,90 + Actor475: brik + Owner: Greece + Location: 25,89 + Actor476: brik + Owner: Greece + Location: 25,94 + Actor477: brik + Owner: Greece + Location: 25,95 + Actor478: brik + Owner: Greece + Location: 24,94 + Actor479: brik + Owner: Greece + Location: 24,95 + Actor480: brik + Owner: Greece + Location: 24,90 + Actor481: brik + Owner: Greece + Location: 24,89 + SWPower3: apwr + Owner: Greece + Location: 9,101 + SWPower2: apwr + Owner: Greece + Location: 9,98 + SWPower1: apwr + Owner: Greece + Location: 9,95 + Actor485: fact + Owner: Greece + Location: 13,97 + Actor486: proc + Owner: Greece + Location: 21,99 + Actor487: dome + Owner: Greece + Location: 22,84 + AlliedSouthFactory: weap + Owner: Greece + Location: 19,89 + Actor489: atek + Owner: Greece + Location: 19,84 + SWPowered8: gap + Owner: Greece + Location: 23,92 + SWPowered5: agun + Owner: Greece + Location: 24,83 + TurretFacing: 832 + SWPowered1: agun + Owner: Greece + Location: 10,85 + TurretFacing: 832 + SWPowered3: agun + Owner: Greece + Location: 14,84 + TurretFacing: 832 + SWPowered4: agun + Owner: Greece + Location: 18,83 + TurretFacing: 832 + SWPowered2: agun + Owner: Greece + Location: 9,93 + TurretFacing: 832 + Actor496: pbox + Owner: Greece + Location: 26,94 + Actor497: pbox + Owner: Greece + Location: 26,90 + Actor498: pbox + Owner: Greece + Location: 14,105 + Actor499: pbox + Owner: Greece + Location: 18,105 + SWPowered7: pris + Owner: Greece + Location: 24,96 + SWPowered6: pris + Owner: Greece + Location: 24,88 + AlliedSouthBarracks: tent + Owner: Greece + Location: 19,94 + Actor503: powr + Owner: Greece + Location: 16,86 + Actor504: powr + Owner: Greece + Location: 13,93 + Actor505: powr + Owner: Greece + Location: 16,90 + SEPowered3: cram + Owner: GDI + Location: 74,90 + TurretFacing: 832 + SEPowered5: cram + Owner: GDI + Location: 74,98 + TurretFacing: 832 + SEPowered6: cram + Owner: GDI + Location: 81,98 + TurretFacing: 832 + SEPowered4: cram + Owner: GDI + Location: 81,90 + TurretFacing: 832 + Actor510: rep + Owner: GDI + Location: 83,89 + Actor511: barb + Owner: GDI + Location: 74,91 + Actor512: barb + Owner: GDI + Location: 74,92 + Actor513: barb + Owner: GDI + Location: 74,93 + Actor514: barb + Owner: GDI + Location: 74,94 + Actor515: barb + Owner: GDI + Location: 74,95 + Actor516: barb + Owner: GDI + Location: 74,96 + Actor517: barb + Owner: GDI + Location: 74,97 + Actor518: barb + Owner: GDI + Location: 81,97 + Actor519: barb + Owner: GDI + Location: 81,96 + Actor520: barb + Owner: GDI + Location: 81,95 + Actor521: barb + Owner: GDI + Location: 81,94 + Actor522: barb + Owner: GDI + Location: 81,93 + Actor523: barb + Owner: GDI + Location: 81,92 + Actor524: barb + Owner: GDI + Location: 81,91 + Actor525: barb + Owner: GDI + Location: 76,90 + Actor526: barb + Owner: GDI + Location: 75,90 + Actor527: barb + Owner: GDI + Location: 77,90 + Actor528: barb + Owner: GDI + Location: 78,90 + Actor529: barb + Owner: GDI + Location: 79,90 + Actor530: barb + Owner: GDI + Location: 80,90 + Actor531: barb + Owner: GDI + Location: 75,98 + Actor532: barb + Owner: GDI + Location: 76,98 + Actor533: barb + Owner: GDI + Location: 79,98 + Actor534: barb + Owner: GDI + Location: 80,98 + Actor535: tc02 + Owner: Neutral + Faction: germany + Location: 79,67 + Actor536: tc01 + Owner: Neutral + Faction: germany + Location: 74,66 + Actor537: t13 + Owner: Neutral + Faction: germany + Location: 75,65 + Actor538: t12 + Owner: Neutral + Faction: germany + Location: 83,68 + Actor539: t05 + Owner: Neutral + Faction: germany + Location: 70,64 + Actor540: t02 + Owner: Neutral + Faction: germany + Location: 85,68 + Actor543: t17 + Owner: Neutral + Faction: germany + Location: 87,68 + Actor544: t05 + Owner: Neutral + Faction: germany + Location: 79,70 + Actor545: t02 + Owner: Neutral + Faction: germany + Location: 66,65 + Actor546: tc05 + Owner: Neutral + Faction: germany + Location: 56,62 + Actor547: t07 + Owner: Neutral + Faction: germany + Location: 53,61 + Actor548: t10 + Owner: Neutral + Faction: germany + Location: 60,63 + Actor549: t02 + Owner: Neutral + Faction: germany + Location: 66,62 + Actor550: t08 + Owner: Neutral + Faction: germany + Location: 65,63 + Actor551: t01 + Owner: Neutral + Faction: germany + Location: 69,63 + Actor552: t07 + Owner: Neutral + Faction: germany + Location: 92,71 + Actor553: tc04 + Owner: Neutral + Faction: germany + Location: 63,101 + Actor554: t06 + Owner: Neutral + Faction: germany + Location: 69,106 + Actor555: tc04 + Owner: Neutral + Faction: germany + Location: 89,104 + Actor556: tc03 + Owner: Neutral + Faction: germany + Location: 87,105 + Actor557: tc02 + Owner: Neutral + Faction: germany + Location: 91,103 + Actor558: t14 + Owner: Neutral + Faction: germany + Location: 91,99 + Actor559: t11 + Owner: Neutral + Faction: germany + Location: 90,95 + Actor560: tc05 + Owner: Neutral + Faction: germany + Location: 94,90 + Actor561: t12 + Owner: Neutral + Faction: germany + Location: 93,93 + Actor562: t13 + Owner: Neutral + Faction: germany + Location: 93,98 + Actor563: t14 + Owner: Neutral + Faction: germany + Location: 86,107 + Actor564: tc05 + Owner: Neutral + Faction: germany + Location: 43,92 + Actor565: t06 + Owner: Neutral + Faction: germany + Location: 45,95 + Actor566: split2 + Owner: Neutral + Location: 10,108 + Actor567: split2 + Owner: Neutral + Location: 18,109 + Actor568: split2 + Owner: Neutral + Location: 24,107 + Actor569: split2 + Owner: Neutral + Location: 73,55 + Actor570: split2 + Owner: Neutral + Location: 80,53 + Actor571: tc04 + Owner: Neutral + Location: 36,101 + Actor572: tc05 + Owner: Neutral + Location: 43,106 + Actor573: tc02 + Owner: Neutral + Location: 40,104 + Actor574: t14 + Owner: Neutral + Location: 39,102 + Actor575: t10 + Owner: Neutral + Location: 38,100 + Actor576: t13 + Owner: Neutral + Location: 36,104 + Actor577: tc01 + Owner: Neutral + Location: 36,110 + Actor578: tc04 + Owner: Neutral + Location: 36,108 + Actor579: tc03 + Owner: Neutral + Location: 37,107 + Actor580: t16 + Owner: Neutral + Location: 38,105 + Actor581: t01 + Owner: Neutral + Location: 39,110 + Actor582: t02 + Owner: Neutral + Location: 40,107 + Actor583: tc02 + Owner: Neutral + Location: 41,110 + Actor584: t16 + Owner: Neutral + Location: 40,111 + Actor585: t12 + Owner: Neutral + Location: 40,109 + Actor586: t14 + Owner: Neutral + Location: 40,106 + Actor587: t15 + Owner: Neutral + Location: 41,108 + Actor588: t17 + Owner: Neutral + Location: 44,109 + Actor589: t14 + Owner: Neutral + Location: 43,111 + Actor590: t16 + Owner: Neutral + Location: 48,111 + Actor591: tc01 + Owner: Neutral + Location: 48,108 + Actor592: t14 + Owner: Neutral + Location: 48,106 + Actor593: tc02 + Owner: Neutral + Location: 49,102 + Actor594: t17 + Owner: Neutral + Location: 50,99 + Actor595: t11 + Owner: Neutral + Location: 48,89 + Actor596: t06 + Owner: Neutral + Location: 54,76 + Actor597: t01 + Owner: Neutral + Location: 49,76 + Actor598: t03 + Owner: Neutral + Location: 50,75 + Actor599: t16 + Owner: Neutral + Location: 48,81 + Actor600: t05 + Owner: Neutral + Location: 49,80 + Actor601: t05 + Owner: Neutral + Location: 51,86 + Actor602: tc01 + Owner: Neutral + Location: 50,85 + Actor603: t15 + Owner: Neutral + Location: 48,81 + Actor604: t02 + Owner: Neutral + Location: 50,79 + Actor605: t02 + Owner: Neutral + Location: 51,75 + Actor606: t17 + Owner: Neutral + Location: 50,82 + Actor607: t11 + Owner: Neutral + Location: 52,76 + Actor608: t10 + Owner: Neutral + Location: 49,77 + Actor609: t14 + Owner: Neutral + Location: 49,87 + Actor610: t17 + Owner: Neutral + Location: 50,90 + Actor611: t14 + Owner: Neutral + Location: 49,97 + Actor612: t16 + Owner: Neutral + Location: 49,91 + Actor613: t01 + Owner: Neutral + Location: 49,95 + Actor614: t02 + Owner: Neutral + Location: 49,93 + Actor615: t01 + Owner: Neutral + Location: 49,104 + Actor616: t05 + Owner: Neutral + Location: 50,105 + Actor617: t12 + Owner: Neutral + Location: 49,100 + Actor618: t13 + Owner: Neutral + Location: 50,110 + Actor619: t15 + Owner: Neutral + Location: 49,107 + Actor620: t12 + Owner: Neutral + Location: 47,17 + Actor621: tc05 + Owner: Neutral + Location: 27,13 + Actor622: t06 + Owner: Neutral + Location: 27,6 + Actor623: t05 + Owner: Neutral + Location: 23,4 + Actor624: t15 + Owner: Neutral + Location: 19,19 + Actor625: tc02 + Owner: Neutral + Location: 33,29 + Actor626: t15 + Owner: Neutral + Location: 38,32 + Actor627: t14 + Owner: Neutral + Location: 41,27 + Actor629: t07 + Owner: Neutral + Location: 44,24 + Actor631: t02 + Owner: Neutral + Location: 45,25 + Actor632: t01 + Owner: Neutral + Location: 61,25 + Actor634: t10 + Owner: Neutral + Location: 66,23 + Actor635: t13 + Owner: Neutral + Location: 53,30 + Actor636: t05 + Owner: Neutral + Location: 50,23 + Actor637: t14 + Owner: Neutral + Location: 50,24 + Actor638: t14 + Owner: Neutral + Location: 65,5 + Actor639: t01 + Owner: Neutral + Location: 79,14 + Actor640: t10 + Owner: Neutral + Location: 72,10 + Actor641: t11 + Owner: Neutral + Location: 82,13 + Actor642: t13 + Owner: Neutral + Location: 87,20 + Actor643: tc02 + Owner: Neutral + Location: 73,23 + Actor644: t17 + Owner: Neutral + Location: 90,22 + Actor645: t11 + Owner: Neutral + Location: 92,25 + Actor646: t12 + Owner: Neutral + Location: 91,38 + Actor647: t10 + Owner: Neutral + Location: 95,40 + Actor648: t06 + Owner: Neutral + Location: 93,40 + Actor649: t02 + Owner: Neutral + Location: 64,35 + Actor650: t01 + Owner: Neutral + Location: 65,42 + Actor651: t05 + Owner: Neutral + Location: 68,41 + Actor652: t10 + Owner: Neutral + Location: 66,39 + Actor653: t06 + Owner: Neutral + Location: 75,44 + Actor654: t07 + Owner: Neutral + Location: 61,46 + Actor655: tc01 + Owner: Neutral + Location: 60,49 + Actor656: t15 + Owner: Neutral + Location: 56,57 + Actor657: t12 + Owner: Neutral + Location: 62,59 + Actor658: tc02 + Owner: Neutral + Location: 64,57 + Actor659: tc03 + Owner: Neutral + Location: 63,59 + Actor660: t17 + Owner: Neutral + Location: 77,60 + Actor663: tc04 + Owner: Neutral + Location: 84,59 + Actor665: t02 + Owner: Neutral + Location: 91,47 + Actor666: t01 + Owner: Neutral + Location: 85,44 + Actor667: t05 + Owner: Neutral + Location: 37,51 + Actor668: t01 + Owner: Neutral + Location: 44,53 + Actor669: t14 + Owner: Neutral + Location: 43,50 + Actor670: t12 + Owner: Neutral + Location: 40,50 + Actor671: t08 + Owner: Neutral + Location: 41,52 + Actor672: t02 + Owner: Neutral + Location: 47,57 + Actor673: t14 + Owner: Neutral + Location: 16,49 + Actor674: t02 + Owner: Neutral + Location: 28,42 + Actor675: t01 + Owner: Neutral + Location: 29,35 + Actor676: t02 + Owner: Neutral + Location: 10,27 + Actor677: tc04 + Owner: Neutral + Location: 2,26 + Actor678: t14 + Owner: Neutral + Location: 4,25 + Actor679: t11 + Owner: Neutral + Location: 4,20 + Actor680: t08 + Owner: Neutral + Location: 10,22 + Actor681: t16 + Owner: Neutral + Location: 16,23 + Actor683: t01 + Owner: Neutral + Location: 2,5 + Actor684: tc01 + Owner: Neutral + Location: 23,23 + Actor685: t12 + Owner: Neutral + Location: 31,1 + Actor687: t12 + Owner: Neutral + Location: 3,1 + Actor688: t10 + Owner: Neutral + Location: 61,84 + Actor689: tc05 + Owner: Neutral + Location: 54,82 + Actor690: t13 + Owner: Neutral + Location: 57,79 + Actor693: t01 + Owner: Neutral + Location: 94,83 + Actor694: t05 + Owner: Neutral + Location: 86,82 + Actor696: t02 + Owner: Neutral + Location: 54,93 + Actor697: t15 + Owner: Neutral + Location: 61,96 + Actor698: t10 + Owner: Neutral + Location: 54,101 + Actor699: tc03 + Owner: Neutral + Location: 55,94 + Actor700: t03 + Owner: Neutral + Location: 56,99 + Actor701: t06 + Owner: Neutral + Location: 55,89 + Actor702: t01 + Owner: Neutral + Location: 54,86 + Actor703: t02 + Owner: Neutral + Location: 65,89 + Actor704: t05 + Owner: Neutral + Location: 66,87 + Actor705: t06 + Owner: Neutral + Location: 75,105 + Actor706: tc01 + Owner: Neutral + Location: 56,102 + Actor707: t15 + Owner: Neutral + Location: 56,103 + Actor708: t12 + Owner: Neutral + Location: 54,106 + Actor709: t05 + Owner: Neutral + Location: 84,106 + Actor710: tc04 + Owner: Neutral + Location: 81,108 + Actor711: tc02 + Owner: Neutral + Location: 79,109 + Actor712: tc04 + Owner: Neutral + Location: 76,111 + Actor713: tc05 + Owner: Neutral + Location: 73,111 + Actor714: tc01 + Owner: Neutral + Location: 71,111 + Actor715: t16 + Owner: Neutral + Location: 84,111 + Actor716: t14 + Owner: Neutral + Location: 88,111 + Actor717: t10 + Owner: Neutral + Location: 94,109 + Actor718: t05 + Owner: Neutral + Location: 90,109 + Actor719: split2 + Owner: Neutral + Location: 82,75 + Actor720: split2 + Owner: Neutral + Location: 87,78 + Actor721: split2 + Owner: Neutral + Location: 92,78 + Actor691: msam + Owner: GDI + Location: 71,84 + Facing: 0 + Actor692: msam + Owner: GDI + Location: 80,83 + Facing: 0 + Actor695: htnk + Owner: GDI + Location: 74,80 + Facing: 0 + Actor722: htnk + Owner: GDI + Location: 76,80 + Facing: 0 + Actor723: hmmv + Owner: GDI + Location: 78,71 + Facing: 904 + Actor724: hmmv + Owner: GDI + Location: 72,70 + Facing: 904 + Actor725: vulc.ai + Owner: GDI + Location: 84,87 + Facing: 0 + Actor726: mtnk + Owner: GDI + Location: 75,83 + Facing: 0 + Actor727: mtnk + Owner: GDI + Location: 79,25 + Facing: 0 + Actor728: vulc + Owner: GDI + Facing: 384 + Location: 76,33 + Actor730: atwr + Owner: GDI + Location: 71,44 + Actor729: proc.td + Owner: GDI + Location: 70,47 + Actor731: gtwr + Owner: GDI + Location: 67,52 + Actor732: htnk + Owner: GDI + Location: 88,52 + Facing: 0 + Actor733: hsam + Owner: GDI + Location: 57,46 + Facing: 927 + Actor734: hsam + Owner: GDI + Location: 57,44 + Facing: 904 + Actor735: mtnk + Owner: GDI + Location: 88,49 + Facing: 0 + Actor736: 1tnk + Owner: Greece + Location: 7,19 + Facing: 626 + Actor737: 1tnk + Owner: Greece + Location: 12,18 + Facing: 634 + Actor738: apc.ai + Owner: Greece + Location: 6,11 + Facing: 642 + Actor739: 2tnk + Owner: Greece + Location: 16,29 + Facing: 0 + Actor740: 2tnk + Owner: Greece + Location: 17,39 + Facing: 919 + Actor741: 2tnk + Owner: Greece + Location: 34,47 + Facing: 118 + Actor742: 2tnk + Owner: Greece + Location: 34,60 + Facing: 0 + Actor743: 1tnk + Owner: Greece + Location: 33,72 + Facing: 523 + Actor744: 1tnk + Owner: Greece + Location: 43,66 + Facing: 761 + Actor745: cryo + Owner: Greece + Location: 24,98 + Facing: 888 + Actor746: ptnk + Owner: Greece + Location: 27,96 + Facing: 848 + Actor747: ptnk + Owner: Greece + Location: 26,88 + Facing: 840 + Actor748: ifv + Owner: Greece + Location: 27,101 + Facing: 515 + Actor749: jeep + Owner: Greece + Facing: 384 + Location: 37,63 + Actor750: jeep + Owner: Greece + Facing: 384 + Location: 35,40 + Actor751: jeep + Owner: Greece + Location: 22,22 + Facing: 896 + Actor752: jeep + Owner: Greece + Facing: 384 + Location: 11,53 + Actor753: jeep + Owner: Greece + Location: 60,61 + Facing: 919 + Actor754: 2tnk + Owner: Greece + Location: 29,90 + Facing: 769 + Actor755: 2tnk + Owner: Greece + Location: 29,94 + Facing: 761 + Actor756: arty + Owner: Greece + Location: 45,86 + Facing: 63 + Actor757: ptnk + Owner: Greece + Facing: 384 + Location: 43,53 + Actor758: n1 + Owner: GDI + SubCell: 3 + Location: 87,50 + Facing: 15 + Actor759: n1 + Owner: GDI + SubCell: 3 + Location: 89,48 + Facing: 943 + Actor760: n1 + Owner: GDI + SubCell: 3 + Location: 89,50 + Facing: 71 + Actor761: n1 + Owner: GDI + SubCell: 3 + Location: 86,52 + Facing: 134 + Actor762: n1 + Owner: GDI + SubCell: 3 + Location: 90,53 + Facing: 904 + Actor763: n1 + Owner: GDI + SubCell: 3 + Location: 66,53 + Facing: 384 + Actor764: n1 + Owner: GDI + SubCell: 3 + Location: 65,51 + Facing: 47 + Actor765: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 67,39 + Actor766: n1 + Owner: GDI + Location: 71,35 + SubCell: 3 + Facing: 158 + Actor767: n1 + Owner: GDI + SubCell: 3 + Location: 71,29 + Facing: 87 + Actor768: n1 + Owner: GDI + SubCell: 3 + Location: 83,24 + Facing: 47 + Actor769: n1 + Owner: GDI + Location: 82,25 + SubCell: 3 + Facing: 111 + Actor770: n1 + Owner: GDI + SubCell: 3 + Location: 88,25 + Facing: 785 + Actor771: n1 + Owner: GDI + SubCell: 3 + Location: 77,39 + Facing: 384 + Actor772: n1 + Owner: GDI + SubCell: 3 + Location: 80,38 + Facing: 555 + Actor773: n1 + Owner: GDI + Location: 72,24 + SubCell: 3 + Facing: 111 + Actor774: n1 + Owner: GDI + SubCell: 3 + Location: 77,23 + Facing: 0 + Actor775: n1 + Owner: GDI + SubCell: 3 + Location: 83,20 + Facing: 0 + Actor776: n1 + Owner: GDI + Location: 62,36 + SubCell: 3 + Facing: 888 + Actor777: n1 + Owner: GDI + SubCell: 3 + Location: 65,35 + Facing: 0 + Actor778: n1 + Owner: GDI + SubCell: 3 + Location: 61,45 + Facing: 0 + Actor779: n1 + Owner: GDI + SubCell: 3 + Location: 63,48 + Facing: 0 + Actor780: n1 + Owner: GDI + SubCell: 3 + Location: 82,67 + Facing: 793 + Actor781: n1 + Owner: GDI + SubCell: 3 + Location: 78,65 + Facing: 880 + Actor782: n1 + Owner: GDI + SubCell: 3 + Location: 71,64 + Facing: 0 + Actor783: n1 + Owner: GDI + SubCell: 3 + Location: 73,71 + Facing: 745 + Actor784: n1 + Owner: GDI + SubCell: 3 + Location: 70,70 + Facing: 911 + Actor785: n1 + Owner: GDI + SubCell: 3 + Location: 76,74 + Facing: 0 + Actor786: n1 + Owner: GDI + Location: 69,80 + SubCell: 3 + Facing: 0 + Actor787: n1 + Owner: GDI + SubCell: 3 + Location: 70,79 + Facing: 0 + Actor788: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 73,82 + Actor789: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 72,84 + Actor790: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 78,84 + Actor791: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 83,84 + Actor792: n1 + Owner: GDI + SubCell: 3 + Location: 72,90 + Facing: 904 + Actor793: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 74,87 + Actor794: n1 + Owner: GDI + Facing: 384 + Location: 74,88 + SubCell: 3 + Actor795: n1 + Owner: GDI + Facing: 384 + Location: 77,89 + SubCell: 3 + Actor796: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 82,97 + Actor797: n1 + Owner: GDI + SubCell: 3 + Location: 91,95 + Facing: 872 + Actor798: n1 + Owner: GDI + SubCell: 3 + Location: 62,96 + Facing: 31 + Actor799: n1 + Owner: GDI + SubCell: 3 + Location: 72,106 + Facing: 384 + Actor800: n1 + Owner: GDI + SubCell: 3 + Location: 92,108 + Facing: 253 + Actor801: n1 + Owner: GDI + SubCell: 3 + Location: 65,71 + Facing: 0 + Actor802: n1 + Owner: GDI + SubCell: 3 + Location: 79,46 + Facing: 0 + Actor803: n2 + Owner: GDI + Location: 89,50 + SubCell: 1 + Facing: 0 + Actor804: n2 + Owner: GDI + SubCell: 3 + Location: 73,25 + Facing: 245 + Actor805: n2 + Owner: GDI + SubCell: 3 + Location: 62,49 + Facing: 0 + Actor806: n2 + Owner: GDI + SubCell: 3 + Location: 72,72 + Facing: 880 + Actor807: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 79,83 + Actor808: n2 + Owner: GDI + SubCell: 3 + Location: 68,91 + Facing: 729 + Actor809: n2 + Owner: GDI + Location: 56,99 + SubCell: 3 + Facing: 904 + Actor810: n2 + Owner: GDI + Facing: 384 + Location: 83,108 + SubCell: 3 + Actor811: n2 + Owner: GDI + SubCell: 3 + Location: 80,45 + Facing: 0 + Actor812: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 69,85 + Actor813: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 67,93 + Actor814: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 85,88 + Actor815: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 86,92 + Actor816: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 69,98 + Actor817: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 83,100 + Actor818: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 76,100 + Actor819: e1 + Owner: Greece + SubCell: 3 + Location: 9,16 + Facing: 578 + Actor820: e1 + Owner: Greece + Location: 6,19 + SubCell: 3 + Facing: 626 + Actor821: e1 + Owner: Greece + SubCell: 3 + Location: 14,5 + Facing: 761 + Actor822: e1 + Owner: Greece + SubCell: 3 + Location: 11,5 + Facing: 896 + Actor823: e1 + Owner: Greece + SubCell: 3 + Location: 8,7 + Facing: 848 + Actor824: e1 + Owner: Greece + SubCell: 3 + Location: 12,19 + Facing: 713 + Actor825: e1 + Owner: Greece + SubCell: 3 + Location: 21,20 + Facing: 951 + Actor826: e1 + Owner: Greece + SubCell: 3 + Location: 21,23 + Facing: 0 + Actor827: e1 + Owner: Greece + Location: 22,5 + SubCell: 3 + Facing: 872 + Actor828: e1 + Owner: Greece + SubCell: 3 + Location: 22,29 + Facing: 1023 + Actor829: e1 + Owner: Greece + SubCell: 3 + Location: 17,30 + Facing: 935 + Actor830: e1 + Owner: Greece + SubCell: 3 + Location: 15,30 + Facing: 1023 + Actor831: e1 + Owner: Greece + SubCell: 3 + Location: 18,40 + Facing: 840 + Actor832: e1 + Owner: Greece + SubCell: 3 + Location: 16,37 + Facing: 983 + Actor833: e1 + Owner: Greece + SubCell: 3 + Location: 17,41 + Facing: 832 + Actor834: e1 + Owner: Greece + SubCell: 3 + Location: 18,44 + Facing: 856 + Actor835: e1 + Owner: Greece + SubCell: 3 + Location: 18,43 + Facing: 919 + Actor836: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 34,42 + Actor837: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 34,45 + Actor838: e1 + Owner: Greece + SubCell: 3 + Location: 34,72 + Facing: 539 + Actor839: e1 + Owner: Greece + SubCell: 3 + Location: 29,71 + Facing: 384 + Actor840: e1 + Owner: Greece + SubCell: 3 + Location: 37,72 + Facing: 578 + Actor841: e1 + Owner: Greece + SubCell: 3 + Location: 43,67 + Facing: 959 + Actor842: e1 + Owner: Greece + SubCell: 3 + Location: 43,63 + Facing: 689 + Actor843: e1 + Owner: Greece + Location: 42,63 + SubCell: 3 + Facing: 761 + Actor844: e1 + Owner: Greece + Location: 39,58 + SubCell: 3 + Facing: 111 + Actor845: e1 + Owner: Greece + SubCell: 3 + Location: 37,57 + Facing: 0 + Actor846: e1 + Owner: Greece + SubCell: 3 + Location: 32,58 + Facing: 0 + Actor847: e1 + Owner: Greece + SubCell: 3 + Location: 26,63 + Facing: 341 + Actor848: e1 + Owner: Greece + SubCell: 3 + Location: 26,68 + Facing: 7 + Actor849: e1 + Owner: Greece + SubCell: 3 + Location: 25,69 + Facing: 384 + Actor850: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 42,52 + Actor851: e1 + Owner: Greece + Facing: 384 + Location: 45,54 + SubCell: 3 + Actor852: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 37,37 + Actor853: e1 + Owner: Greece + SubCell: 3 + Location: 25,35 + Facing: 384 + Actor854: e1 + Owner: Greece + SubCell: 3 + Location: 8,53 + Facing: 888 + Actor855: e1 + Owner: Greece + SubCell: 3 + Location: 7,55 + Facing: 1023 + Actor856: e1 + Owner: Greece + SubCell: 3 + Location: 11,58 + Facing: 785 + Actor857: e1 + Owner: Greece + SubCell: 3 + Location: 11,69 + Facing: 904 + Actor858: e1 + Owner: Greece + SubCell: 3 + Location: 12,70 + Facing: 0 + Actor859: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 26,87 + Actor860: e1 + Owner: Greece + Facing: 384 + Location: 27,88 + SubCell: 3 + Actor861: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 28,90 + Actor862: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 29,88 + Actor863: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 27,86 + Actor864: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 27,98 + Actor865: e1 + Owner: Greece + Facing: 384 + Location: 27,99 + SubCell: 3 + Actor866: e1 + Owner: Greece + Facing: 384 + SubCell: 1 + Location: 27,98 + Actor867: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 26,96 + Actor868: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 22,96 + Actor869: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 19,99 + Actor870: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 17,93 + Actor871: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 18,88 + Actor872: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 22,87 + Actor873: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 17,102 + Actor874: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 26,98 + Actor875: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 22,97 + Actor876: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 24,86 + Actor877: e3 + Owner: Greece + Facing: 384 + Location: 17,89 + SubCell: 3 + Actor878: e3 + Owner: Greece + Facing: 384 + Location: 19,99 + SubCell: 1 + Actor879: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 46,85 + Actor880: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 38,63 + Actor881: e3 + Owner: Greece + Facing: 384 + Location: 42,63 + SubCell: 1 + Actor882: e3 + Owner: Greece + SubCell: 3 + Location: 31,60 + Facing: 158 + Actor883: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 37,40 + Actor884: e3 + Owner: Greece + SubCell: 3 + Location: 14,45 + Facing: 0 + Actor885: e3 + Owner: Greece + Location: 6,14 + SubCell: 3 + Facing: 642 + Actor886: e3 + Owner: Greece + SubCell: 3 + Location: 42,70 + Facing: 919 + Actor887: v03 + Owner: Neutral + Location: 16,66 + Actor888: v04 + Owner: Neutral + Location: 5,63 + Actor889: v02 + Owner: Neutral + Location: 11,65 + Actor890: v07 + Owner: Neutral + Location: 14,61 + Actor891: v09 + Owner: Neutral + Location: 6,67 + Actor892: brl3 + Owner: Creeps + Location: 11,8 + Actor893: barl + Owner: Creeps + Location: 12,9 + Actor894: barl + Owner: Creeps + Location: 84,25 + Actor895: brl3 + Owner: Creeps + Location: 76,25 + Actor896: t01 + Owner: Neutral + Location: 19,78 + Actor897: t01 + Owner: Neutral + Location: 19,78 + Actor898: tc02 + Owner: Neutral + Location: 21,78 + Actor899: tc05 + Owner: Neutral + Location: 28,78 + Actor900: t06 + Owner: Neutral + Location: 24,77 + Actor901: t02 + Owner: Neutral + Location: 21,74 + Actor902: t15 + Owner: Neutral + Location: 21,73 + Actor903: t11 + Owner: Neutral + Location: 27,74 + Actor904: t10 + Owner: Neutral + Location: 16,73 + Actor905: t12 + Owner: Neutral + Location: 20,71 + Actor906: t15 + Owner: Neutral + Location: 38,76 + Actor907: tc01 + Owner: Neutral + Location: 41,75 + Actor908: t10 + Owner: Neutral + Location: 48,72 + Actor909: tc04 + Owner: Neutral + Location: 46,70 + Actor910: t17 + Owner: Neutral + Location: 45,77 + Actor911: t02 + Owner: Neutral + Location: 54,68 + Actor912: t01 + Owner: Neutral + Location: 61,67 + Actor913: t07 + Owner: Neutral + Location: 60,76 + Actor914: t05 + Owner: Neutral + Location: 63,83 + Actor915: t11 + Owner: Neutral + Location: 17,60 + Actor916: t02 + Owner: Neutral + Location: 15,65 + Actor917: t05 + Owner: Neutral + Location: 1,62 + Actor918: t07 + Owner: Neutral + Location: 7,70 + Actor919: t05 + Owner: Neutral + Location: 2,49 + Actor920: t10 + Owner: Neutral + Location: 5,48 + Actor921: hmmv + Owner: GDI + Facing: 384 + Location: 83,18 + Actor922: hmmv + Owner: GDI + Location: 56,85 + Facing: 658 + AlliedAttack1: waypoint + Owner: Neutral + Location: 32,92 + AlliedAttack2a: waypoint + Owner: Neutral + Location: 34,65 + AlliedAttack2b: waypoint + Owner: Neutral + Location: 10,58 + AlliedAttack3: waypoint + Owner: Neutral + Location: 20,36 + AlliedAttack4: waypoint + Owner: Neutral + Location: 24,20 + AlliedAttack5a: waypoint + Owner: Neutral + Location: 25,3 + AlliedAttack5b: waypoint + Owner: Neutral + Location: 36,26 + GDIAttack1: waypoint + Owner: Neutral + Location: 73,75 + GDIAttack2a: waypoint + Owner: Neutral + Location: 85,47 + GDIAttack2b: waypoint + Owner: Neutral + Location: 58,29 + GDIAttack3: waypoint + Owner: Neutral + Location: 70,7 + Actor926: chain + Owner: GDI + Location: 91,55 + Actor927: chain + Owner: GDI + Location: 92,55 + Actor928: chain + Owner: GDI + Location: 93,55 + Actor929: chain + Owner: GDI + Location: 94,55 + Actor930: chain + Owner: GDI + Location: 95,55 + Actor931: chain + Owner: GDI + Location: 96,55 + Actor932: chain + Owner: GDI + Location: 96,56 + Actor933: chain + Owner: GDI + Location: 96,57 + Actor934: chain + Owner: GDI + Location: 96,58 + Actor935: chain + Owner: GDI + Location: 96,59 + Actor936: chain + Owner: GDI + Location: 96,60 + Actor937: chain + Owner: GDI + Location: 96,61 + Actor938: chain + Owner: GDI + Location: 96,62 + Actor939: chain + Owner: GDI + Location: 96,63 + Actor940: chain + Owner: GDI + Location: 96,64 + Actor941: chain + Owner: GDI + Location: 91,65 + Actor942: chain + Owner: GDI + Location: 93,65 + Actor943: chain + Owner: GDI + Location: 94,65 + Actor944: chain + Owner: GDI + Location: 95,65 + Actor945: chain + Owner: GDI + Location: 96,65 + Actor946: chain + Owner: GDI + Location: 92,65 + Actor947: chain + Owner: GDI + Location: 89,65 + Actor948: chain + Owner: GDI + Location: 90,65 + Actor949: chain + Owner: GDI + Location: 88,65 + Actor950: chain + Owner: GDI + Location: 88,64 + Actor951: chain + Owner: GDI + Location: 88,63 + Actor952: chain + Owner: GDI + Location: 90,55 + Actor953: chain + Owner: GDI + Location: 90,56 + Actor954: chain + Owner: GDI + Location: 88,61 + Actor955: chain + Owner: GDI + Location: 88,62 + Actor956: chain + Owner: GDI + Location: 88,60 + Actor957: chain + Owner: GDI + Location: 89,60 + Actor958: gtwr + Owner: GDI + Location: 89,59 + GDIHelipad3: hpad.td + Owner: GDI + Location: 94,62 + GDIHelipad1: hpad.td + Owner: GDI + Location: 94,56 + GDIHelipad2: hpad.td + Owner: GDI + Location: 94,59 + Actor925: rep + Owner: GDI + Location: 89,61 + Actor959: cram + Owner: GDI + Location: 92,57 + PlayerStart: waypoint + Owner: Neutral + Location: 49,8 + SEPowered12: cram + Owner: GDI + Location: 67,92 + TurretFacing: 832 + SEPowered10: cram + Owner: GDI + Location: 94,94 + TurretFacing: 832 + SEPowered9: cram + Owner: GDI + Location: 53,97 + TurretFacing: 832 + SEPowered11: cram + Owner: GDI + Location: 73,105 + TurretFacing: 832 + Actor923: camera + Owner: Greece + Location: 35,12 + Actor924: camera + Owner: Greece + Location: 26,19 + Actor960: camera + Owner: Greece + Location: 39,28 + Actor961: camera + Owner: Greece + Location: 35,38 + Actor962: camera + Owner: Greece + Location: 16,45 + Actor963: camera + Owner: Greece + Location: 40,57 + Actor964: camera + Owner: Greece + Location: 10,61 + Actor965: camera + Owner: Greece + Location: 37,74 + Actor966: camera + Owner: Greece + Location: 7,13 + Actor967: camera + Owner: GDI + Location: 59,12 + Actor968: camera + Owner: GDI + Location: 78,12 + Actor969: camera + Owner: GDI + Location: 62,30 + Actor970: camera + Owner: GDI + Location: 79,32 + Actor971: camera + Owner: GDI + Location: 69,50 + Actor972: camera + Owner: GDI + Location: 92,59 + Actor973: camera + Owner: GDI + Location: 73,62 + Actor974: camera + Owner: GDI + Location: 67,76 + NWWormhole: waypoint + Owner: Neutral + Location: 4,4 + NEWormhole: waypoint + Owner: Neutral + Location: 91,34 + MWormhole: waypoint + Owner: Neutral + Location: 31,54 + Actor975: t13 + Owner: Neutral + Location: 14,1 + Actor976: t07 + Owner: Neutral + Location: 20,10 + Actor977: t01 + Owner: Neutral + Location: 33,19 + NWPillbox1: pbox + Owner: Greece + Location: 5,6 + NWPillbox2: pbox + Owner: Greece + Location: 11,6 + NWPillbox3: pbox + Owner: Greece + Location: 5,17 + NWPillbox4: pbox + Owner: Greece + Location: 11,17 + NETower1: gtwr + Owner: GDI + Location: 83,25 + NETower2: gtwr + Owner: GDI + Location: 83,37 + NETower3: gtwr + Owner: GDI + Location: 77,37 + NETower4: gtwr + Owner: GDI + Location: 72,34 + GDIDropSpawn: waypoint + Owner: Neutral + Location: 92,112 + GDIDropRally: waypoint + Owner: Neutral + Location: 93,22 + GDIDrop1: waypoint + Owner: Neutral + Location: 91,6 + GDIDrop2: waypoint + Owner: Neutral + Location: 91,9 + GDIDrop3: waypoint + Owner: Neutral + Location: 93,12 + GDIDropExit: waypoint + Owner: Neutral + Location: 96,47 + SealDropSpawn: waypoint + Owner: Neutral + Location: 1,78 + SealDropDest: waypoint + Owner: Neutral + Location: 47,25 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-allegiances.yaml, ca|missions/main-campaign/ca20-encroachment/encroachment-rules.yaml, ca|rules/custom/coop-rules.yaml, encroachment-coop-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml, ca|missions/main-campaign/ca20-encroachment/encroachment-weapons.yaml diff --git a/mods/ca/missions/coop-campaign/ca21-incapacitation-coop/incapacitation-coop-rules.yaml b/mods/ca/missions/coop-campaign/ca21-incapacitation-coop/incapacitation-coop-rules.yaml new file mode 100644 index 0000000000..467edef449 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca21-incapacitation-coop/incapacitation-coop-rules.yaml @@ -0,0 +1,11 @@ +World: + LuaScript: + Scripts: campaign.lua, coop.lua, ca|missions/main-campaign/ca21-incapacitation/incapacitation.lua, incapacitation-coop.lua + LobbyMissionInfo@InitialObjectives: + Prefix: Initial Objectives + Text: • Destroy or power down all enemy anti-aircraft defense structures.\n• Destroy all enemy aircraft and their landing structures. + LobbyMissionInfo@Notes: + Prefix: Note + Text: Respawns can be enabled for this mission. + PrefixColor: FF9900 + TextColor: FF9900 diff --git a/mods/ca/missions/coop-campaign/ca21-incapacitation-coop/incapacitation-coop.lua b/mods/ca/missions/coop-campaign/ca21-incapacitation-coop/incapacitation-coop.lua new file mode 100644 index 0000000000..739e2db335 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca21-incapacitation-coop/incapacitation-coop.lua @@ -0,0 +1,38 @@ + +SetupPlayers = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Multi2 = Player.GetPlayer("Multi2") + Multi3 = Player.GetPlayer("Multi3") + Multi4 = Player.GetPlayer("Multi4") + Multi5 = Player.GetPlayer("Multi5") + Scrin = Player.GetPlayer("Scrin") + Greece = Player.GetPlayer("Greece") + GDI = Player.GetPlayer("GDI") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = Utils.Where({ Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 }, function(p) return p ~= nil end) + MissionEnemies = { Greece, GDI } + SinglePlayerPlayer = Scrin + CoopInit() +end + +AfterWorldLoaded = function() + local extraLocations = { + CPos.New(5, 30), + CPos.New(5, 32) + } + + if IsHardOrAbove() and #MissionPlayers >= 5 then + -- spawn an extra intruder for each extra player above 4 + for i = 1, #MissionPlayers - 4 do + local loc = extraLocations[i] + local extraIntruder = Actor.Create("s4", true, { Owner = Scrin, Location = loc, Facing = Angle.East }) + extraIntruder.GrantCondition("difficulty-" .. Difficulty) + IntruderDeathTrigger(extraIntruder) + end + end +end + +AfterTick = function() + +end diff --git a/mods/ca/missions/coop-campaign/ca21-incapacitation-coop/map.bin b/mods/ca/missions/coop-campaign/ca21-incapacitation-coop/map.bin new file mode 100644 index 0000000000..3705353964 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca21-incapacitation-coop/map.bin differ diff --git a/mods/ca/missions/coop-campaign/ca21-incapacitation-coop/map.png b/mods/ca/missions/coop-campaign/ca21-incapacitation-coop/map.png new file mode 100644 index 0000000000..800e4ffefd Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca21-incapacitation-coop/map.png differ diff --git a/mods/ca/missions/coop-campaign/ca21-incapacitation-coop/map.yaml b/mods/ca/missions/coop-campaign/ca21-incapacitation-coop/map.yaml new file mode 100644 index 0000000000..316ce163e0 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca21-incapacitation-coop/map.yaml @@ -0,0 +1,3835 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 21: Incapacitation Co-op + +Author: Darkademic & Gandorques Hikla + +Tileset: TEMPERAT + +MapSize: 114,82 + +Bounds: 1,1,112,80 + +Visibility: Lobby + +Categories: Co-op Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: Scrin, Greece, GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + PlayerReference@Scrin: + Name: Scrin + Faction: scrin + Color: 7700FF + Allies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Greece, GDI, Creeps + PlayerReference@Greece: + Name: Greece + Bot: campaign + Faction: allies + Color: 99ACF2 + Allies: GDI + Enemies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@GDI: + Name: GDI + Bot: campaign + Faction: gdi + Color: F2CF74 + Allies: Greece + Enemies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: scrin + Color: 7700FF + LockColor: True + Allies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Greece, GDI, Creeps + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: scrin + Color: D83CE5 + LockColor: True + Allies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Greece, GDI, Creeps + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: scrin + Color: 0B7310 + LockColor: True + Allies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Greece, GDI, Creeps + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: scrin + Color: 775A12 + LockColor: True + Allies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Greece, GDI, Creeps + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: scrin + Color: 82C900 + LockColor: True + Allies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Greece, GDI, Creeps + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: scrin + Color: EEA8A8 + LockColor: True + Allies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Greece, GDI, Creeps + +Actors: + Actor0: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 8,10 + Actor1: n2 + Owner: GDI + SubCell: 3 + Facing: 682 + Location: 5,11 + Actor2: brik + Owner: GDI + Location: 22,12 + Actor3: brik + Owner: GDI + Location: 23,12 + Actor4: brik + Owner: GDI + Location: 24,12 + Actor5: brik + Owner: GDI + Location: 25,12 + Actor6: brik + Owner: GDI + Location: 26,12 + Actor7: brik + Owner: GDI + Location: 27,12 + Actor8: brik + Owner: GDI + Location: 28,12 + Actor9: brik + Owner: GDI + Location: 29,12 + Actor10: brik + Owner: GDI + Location: 30,12 + Actor11: brik + Owner: GDI + Location: 31,12 + Actor12: brik + Owner: GDI + Location: 32,12 + Actor13: brik + Owner: GDI + Location: 33,12 + Actor14: brik + Owner: GDI + Location: 34,12 + Actor15: brik + Owner: GDI + Location: 35,12 + Actor16: brik + Owner: GDI + Location: 36,12 + Actor17: brik + Owner: GDI + Location: 37,12 + Actor18: brik + Owner: GDI + Location: 38,12 + Actor19: brik + Owner: GDI + Location: 22,13 + NWPower1: nuk2 + Owner: GDI + Location: 23,13 + NWPower2: nuk2 + Owner: GDI + Location: 25,13 + NWPower3: nuk2 + Owner: GDI + Location: 27,13 + NWPower4: nuk2 + Owner: GDI + Location: 29,13 + Actor24: afac + Owner: GDI + Location: 35,13 + Actor25: brik + Owner: GDI + Location: 38,13 + Actor26: brik + Owner: GDI + Location: 22,14 + Actor28: brik + Owner: GDI + Location: 38,14 + Actor29: brik + Owner: GDI + Location: 22,15 + Actor30: brik + Owner: GDI + Location: 38,15 + Actor31: brik + Owner: GDI + Location: 22,16 + Actor32: brik + Owner: GDI + Location: 38,16 + Actor33: brik + Owner: GDI + Location: 22,17 + Actor34: brik + Owner: GDI + Location: 23,17 + Actor38: brik + Owner: GDI + Location: 38,17 + Actor39: brik + Owner: GDI + Location: 22,18 + Actor40: brik + Owner: GDI + Location: 23,18 + Actor41: brik + Owner: GDI + Location: 38,18 + Actor42: gtwr + Owner: GDI + Location: 22,19 + Actor46: brik + Owner: GDI + Location: 38,19 + Actor47: brik + Owner: GDI + Location: 38,20 + Actor50: brik + Owner: GDI + Location: 38,21 + NWPowered6: atwr + Owner: GDI + Location: 37,22 + Actor52: brik + Owner: GDI + Location: 38,22 + Actor54: gtwr + Owner: GDI + Location: 22,23 + Actor55: brik + Owner: GDI + Location: 37,23 + Actor56: brik + Owner: GDI + Location: 38,23 + Actor57: brik + Owner: GDI + Location: 22,24 + Actor58: brik + Owner: GDI + Location: 23,24 + Actor59: brik + Owner: GDI + Location: 37,24 + Actor60: brik + Owner: GDI + Location: 38,24 + Actor61: gtwr + Owner: GDI + Location: 39,24 + Actor62: n2 + Owner: GDI + SubCell: 3 + Location: 40,24 + Facing: 674 + Actor63: brik + Owner: GDI + Location: 22,25 + Actor64: brik + Owner: GDI + Location: 23,25 + Actor65: pyle + Owner: GDI + Location: 27,25 + Actor66: n1 + Owner: GDI + SubCell: 3 + Location: 39,25 + Facing: 658 + Actor67: brik + Owner: GDI + Location: 22,26 + NWPowered7: atwr + Owner: GDI + Location: 23,26 + Actor69: weap.td + Owner: GDI + Location: 31,26 + Actor70: brik + Owner: GDI + Location: 22,27 + Actor71: n1 + Owner: GDI + SubCell: 3 + Location: 26,27 + Facing: 150 + Actor72: n1 + Owner: GDI + SubCell: 2 + Location: 29,27 + Facing: 919 + Actor73: n1 + Owner: GDI + SubCell: 4 + Location: 29,27 + Facing: 753 + Actor75: brik + Owner: GDI + Location: 22,28 + NWPowered4: cram + Owner: GDI + Location: 25,28 + TurretFacing: 832 + Actor77: n2 + Owner: GDI + SubCell: 3 + Location: 27,28 + Facing: 800 + Actor78: n1 + Owner: GDI + SubCell: 3 + Location: 28,28 + Facing: 483 + Actor79: n1 + Owner: GDI + SubCell: 1 + Location: 28,28 + Facing: 384 + Actor80: brik + Owner: GDI + Location: 37,28 + Actor81: brik + Owner: GDI + Location: 38,28 + Actor82: gtwr + Owner: GDI + Location: 39,28 + Actor84: brik + Owner: GDI + Location: 22,29 + Actor85: hq + Owner: GDI + Location: 23,29 + Actor86: n1 + Owner: GDI + SubCell: 3 + Location: 27,29 + Facing: 578 + Actor87: n2 + Owner: GDI + SubCell: 1 + Location: 27,29 + Facing: 705 + Actor89: brik + Owner: GDI + Location: 37,29 + Actor90: brik + Owner: GDI + Location: 38,29 + Actor91: n1 + Owner: GDI + SubCell: 3 + Location: 40,29 + Facing: 642 + Actor92: brik + Owner: GDI + Location: 22,30 + NWPowered9: atwr + Owner: GDI + Location: 37,30 + Actor94: brik + Owner: GDI + Location: 38,30 + Actor99: brik + Owner: GDI + Location: 22,31 + NPowered10: atwr + Owner: GDI + Location: 26,31 + Actor101: brik + Owner: GDI + Location: 27,31 + Actor102: brik + Owner: GDI + Location: 28,31 + Actor103: brik + Owner: GDI + Location: 32,31 + Actor104: brik + Owner: GDI + Location: 33,31 + NWPowered8: atwr + Owner: GDI + Location: 34,31 + Actor106: brik + Owner: GDI + Location: 38,31 + Actor107: brik + Owner: GDI + Location: 22,32 + Actor108: brik + Owner: GDI + Location: 23,32 + Actor109: brik + Owner: GDI + Location: 24,32 + Actor110: brik + Owner: GDI + Location: 25,32 + Actor111: brik + Owner: GDI + Location: 26,32 + Actor112: brik + Owner: GDI + Location: 27,32 + Actor113: brik + Owner: GDI + Location: 28,32 + Actor114: n1 + Owner: GDI + SubCell: 3 + Location: 31,32 + Facing: 507 + Actor115: brik + Owner: GDI + Location: 32,32 + Actor116: brik + Owner: GDI + Location: 33,32 + Actor117: brik + Owner: GDI + Location: 34,32 + Actor118: brik + Owner: GDI + Location: 35,32 + Actor119: brik + Owner: GDI + Location: 36,32 + Actor120: brik + Owner: GDI + Location: 37,32 + Actor121: brik + Owner: GDI + Location: 38,32 + Actor123: n1 + Owner: GDI + SubCell: 3 + Location: 25,33 + Facing: 642 + Actor124: gtwr + Owner: GDI + Location: 28,33 + Actor125: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 29,33 + Actor126: gtwr + Owner: GDI + Location: 32,33 + Actor127: n2 + Owner: GDI + SubCell: 3 + Location: 33,34 + Facing: 666 + Actor131: t08 + Owner: Neutral + Location: 18,2 + Actor132: t15 + Owner: Neutral + Location: 19,1 + Actor133: tc02 + Owner: Neutral + Location: 22,1 + Actor134: t12 + Owner: Neutral + Location: 6,19 + Actor135: t16 + Owner: Neutral + Location: 10,16 + Actor136: tc02 + Owner: Neutral + Location: 11,7 + Actor137: t07 + Owner: Neutral + Location: 16,4 + Actor138: t01 + Owner: Neutral + Location: 28,7 + Actor139: t03 + Owner: Neutral + Location: 27,6 + Actor140: tc01 + Owner: Neutral + Location: 18,12 + Actor141: t15 + Owner: Neutral + Location: 15,8 + Actor143: mtnk + Owner: GDI + Location: 7,6 + Facing: 512 + Actor144: n2 + Owner: GDI + SubCell: 3 + Location: 19,6 + Facing: 317 + Actor145: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 22,8 + Actor146: htnk + Owner: GDI + Location: 30,34 + Facing: 638 + Actor147: n1 + Owner: GDI + Location: 22,22 + SubCell: 3 + Facing: 285 + Actor148: n1 + Owner: GDI + SubCell: 3 + Location: 22,20 + Facing: 269 + CoastAAGun1: agun + Owner: Greece + Location: 3,48 + TurretFacing: 79 + CoastAAGun2: agun + Owner: Greece + Location: 9,47 + TurretFacing: 31 + CoastAAGun3: agun + Owner: Greece + Location: 15,46 + TurretFacing: 31 + CoastAAGun5: agun + Owner: Greece + Location: 24,38 + TurretFacing: 229 + Actor154: sbag + Owner: Greece + Location: 23,37 + Actor155: sbag + Owner: Greece + Location: 23,37 + Actor156: sbag + Owner: Greece + Location: 24,37 + Actor157: sbag + Owner: Greece + Location: 25,37 + Actor158: sbag + Owner: Greece + Location: 25,38 + Actor160: sbag + Owner: Greece + Location: 23,38 + Actor171: sbag + Owner: Greece + Location: 3,47 + Actor172: sbag + Owner: Greece + Location: 2,47 + Actor174: sbag + Owner: Greece + Location: 4,47 + Actor175: sbag + Owner: Greece + Location: 4,48 + Actor179: sbag + Owner: Greece + Location: 8,46 + Actor180: sbag + Owner: Greece + Location: 8,46 + Actor181: sbag + Owner: Greece + Location: 9,46 + Actor182: sbag + Owner: Greece + Location: 10,46 + Actor183: sbag + Owner: Greece + Location: 8,47 + Actor187: sbag + Owner: Greece + Location: 10,47 + Actor188: sbag + Owner: Greece + Location: 14,45 + Actor189: sbag + Owner: Greece + Location: 15,45 + Actor190: sbag + Owner: Greece + Location: 16,45 + Actor191: sbag + Owner: Greece + Location: 16,46 + Actor194: sbag + Owner: Greece + Location: 14,46 + Actor197: sbag + Owner: Greece + Location: 17,39 + Actor198: sbag + Owner: Greece + Location: 18,39 + Actor200: sbag + Owner: Greece + Location: 19,39 + Actor201: sbag + Owner: Greece + Location: 17,40 + CoastAAGun4: agun + Owner: Greece + Location: 18,40 + TurretFacing: 134 + Actor206: sbag + Owner: Greece + Location: 19,40 + Actor202: e1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 6,7 + Actor203: e1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 8,6 + Actor204: e1 + Owner: GDI + SubCell: 3 + Location: 15,6 + Facing: 301 + NWPowered1: cram + Owner: GDI + Location: 13,17 + TurretFacing: 832 + Actor173: sbag + Owner: Greece + Location: 2,48 + NWPowered5: cram + Owner: GDI + Location: 35,28 + TurretFacing: 832 + NWPowered3: cram + Owner: GDI + Location: 35,17 + TurretFacing: 832 + NWPowered2: cram + Owner: GDI + Location: 25,17 + TurretFacing: 832 + Actor192: silo.td + Owner: GDI + Location: 32,15 + Actor193: silo.td + Owner: GDI + Location: 32,13 + OrcaPad1: hpad.td + Owner: GDI + Location: 28,17 + OrcaPad2: hpad.td + Owner: GDI + Location: 31,17 + Actor199: n1 + Owner: GDI + SubCell: 3 + Location: 33,19 + Facing: 840 + Actor207: n1 + Owner: GDI + SubCell: 3 + Location: 30,21 + Facing: 515 + Actor209: vulc + Owner: GDI + Location: 29,31 + Facing: 634 + Actor211: vulc + Owner: GDI + Location: 38,26 + Facing: 634 + Actor212: n1 + Owner: GDI + SubCell: 3 + Facing: 729 + Location: 37,27 + Actor213: tc01 + Owner: Neutral + Location: 61,7 + Actor214: t02 + Owner: Neutral + Location: 67,7 + Actor215: t12 + Owner: Neutral + Location: 68,6 + Actor216: chain + Owner: GDI + Location: 69,1 + Actor217: chain + Owner: GDI + Location: 69,2 + Actor218: chain + Owner: GDI + Location: 69,3 + Actor219: chain + Owner: GDI + Location: 69,4 + Actor220: chain + Owner: GDI + Location: 69,5 + Actor221: chain + Owner: GDI + Location: 69,6 + Actor222: chain + Owner: GDI + Location: 69,7 + Actor223: chain + Owner: GDI + Location: 69,8 + Actor224: chain + Owner: GDI + Location: 69,9 + Actor225: chain + Owner: GDI + Location: 69,10 + Actor226: chain + Owner: GDI + Location: 69,11 + Actor227: chain + Owner: GDI + Location: 69,12 + Actor228: chain + Owner: GDI + Location: 70,12 + Actor229: chain + Owner: GDI + Location: 71,12 + Actor230: chain + Owner: GDI + Location: 70,1 + Actor231: chain + Owner: GDI + Location: 71,1 + Actor232: chain + Owner: GDI + Location: 72,1 + Actor233: chain + Owner: GDI + Location: 73,1 + Actor234: chain + Owner: GDI + Location: 72,12 + Actor235: chain + Owner: GDI + Location: 73,12 + NPower1: nuk2 + Owner: GDI + Location: 73,4 + NPower3: nuk2 + Owner: GDI + Location: 73,7 + NPower4: nuk2 + Owner: GDI + Location: 75,7 + NPower2: nuk2 + Owner: GDI + Location: 75,4 + Actor240: chain + Owner: GDI + Location: 72,10 + Actor241: chain + Owner: GDI + Location: 72,9 + Actor242: chain + Owner: GDI + Location: 72,8 + Actor243: chain + Owner: GDI + Location: 72,7 + Actor244: chain + Owner: GDI + Location: 72,6 + Actor245: chain + Owner: GDI + Location: 72,5 + Actor246: chain + Owner: GDI + Location: 72,4 + Actor247: chain + Owner: GDI + Location: 72,3 + Actor248: chain + Owner: GDI + Location: 73,3 + Actor249: chain + Owner: GDI + Location: 74,3 + Actor250: chain + Owner: GDI + Location: 75,3 + Actor251: chain + Owner: GDI + Location: 76,3 + Actor252: chain + Owner: GDI + Location: 77,3 + Actor253: chain + Owner: GDI + Location: 77,4 + Actor254: chain + Owner: GDI + Location: 77,5 + Actor255: chain + Owner: GDI + Location: 73,10 + Actor256: chain + Owner: GDI + Location: 74,10 + Actor257: chain + Owner: GDI + Location: 75,10 + Actor258: chain + Owner: GDI + Location: 76,10 + Actor259: chain + Owner: GDI + Location: 77,10 + Actor260: chain + Owner: GDI + Location: 77,9 + Actor261: chain + Owner: GDI + Location: 77,8 + Actor262: chain + Owner: GDI + Location: 77,7 + Actor263: chain + Owner: GDI + Location: 77,6 + Actor264: chain + Owner: GDI + Location: 74,1 + Actor265: chain + Owner: GDI + Location: 75,1 + Actor266: chain + Owner: GDI + Location: 76,1 + Actor267: chain + Owner: GDI + Location: 77,1 + Actor268: chain + Owner: GDI + Location: 78,1 + Actor269: chain + Owner: GDI + Location: 79,1 + Actor270: chain + Owner: GDI + Location: 80,1 + Actor271: chain + Owner: GDI + Location: 81,1 + Actor272: chain + Owner: GDI + Location: 74,12 + Actor273: chain + Owner: GDI + Location: 75,12 + Actor274: chain + Owner: GDI + Location: 76,12 + Actor275: chain + Owner: GDI + Location: 77,12 + Actor276: chain + Owner: GDI + Location: 78,12 + Actor277: chain + Owner: GDI + Location: 79,12 + Actor278: chain + Owner: GDI + Location: 80,12 + Actor279: chain + Owner: GDI + Location: 81,12 + Actor280: chain + Owner: GDI + Location: 81,2 + Actor281: chain + Owner: GDI + Location: 81,11 + Actor282: gtwr + Owner: GDI + Location: 81,9 + Actor283: gtwr + Owner: GDI + Location: 81,4 + Actor284: chain + Owner: GDI + Location: 81,3 + Actor285: chain + Owner: GDI + Location: 81,10 + NPowered2: cram + Owner: GDI + Location: 70,11 + TurretFacing: 832 + NPowered1: cram + Owner: GDI + Location: 70,2 + TurretFacing: 832 + Actor288: n3 + Owner: GDI + SubCell: 3 + Location: 80,10 + Facing: 642 + Actor289: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 82,3 + Actor290: n2 + Owner: GDI + SubCell: 3 + Location: 82,9 + Facing: 785 + Actor291: n2 + Owner: GDI + SubCell: 3 + Location: 81,5 + Facing: 769 + Actor292: n1 + Owner: GDI + Location: 81,5 + SubCell: 1 + Facing: 491 + Actor293: n1 + Owner: GDI + SubCell: 3 + Location: 83,7 + Facing: 650 + NPowered3: atwr + Owner: GDI + Location: 58,15 + NPowered4: atwr + Owner: GDI + Location: 66,15 + NPowered6: atwr + Owner: GDI + Location: 51,22 + NPowered5: cram + Owner: GDI + Location: 51,17 + TurretFacing: 832 + Actor298: t11 + Owner: Neutral + Location: 53,16 + Actor299: t16 + Owner: Neutral + Location: 50,19 + Actor300: t02 + Owner: Neutral + Location: 65,17 + Actor301: n1 + Owner: GDI + SubCell: 3 + Location: 61,16 + Facing: 7 + Actor302: n1 + Owner: GDI + SubCell: 3 + Location: 63,16 + Facing: 0 + Actor303: n1 + Owner: GDI + SubCell: 3 + Location: 59,17 + Facing: 47 + Actor304: n1 + Owner: GDI + SubCell: 3 + Location: 64,19 + Facing: 182 + Actor305: n2 + Owner: GDI + SubCell: 3 + Location: 65,15 + Facing: 166 + Actor306: t02 + Owner: Neutral + Location: 64,25 + Actor307: t03 + Owner: Neutral + Location: 68,25 + Actor308: t11 + Owner: Neutral + Location: 65,26 + Actor309: t07 + Owner: Neutral + Location: 64,26 + Actor310: t06 + Owner: Neutral + Location: 66,25 + Actor311: tc01 + Owner: Neutral + Location: 72,27 + Actor312: tc02 + Owner: Neutral + Location: 73,25 + Actor313: t17 + Owner: Neutral + Location: 75,25 + Actor314: t13 + Owner: Neutral + Location: 67,26 + Actor315: t06 + Owner: Neutral + Location: 68,26 + Actor316: t08 + Owner: Neutral + Location: 65,26 + Actor317: t01 + Owner: Neutral + Location: 67,25 + Actor318: t08 + Owner: Neutral + Location: 73,27 + Actor320: hmmv + Owner: GDI + Location: 59,28 + Facing: 1023 + Actor321: t16 + Owner: Neutral + Location: 2,1 + Actor322: t08 + Owner: Neutral + Location: 3,2 + Actor323: brik + Owner: GDI + Location: 88,17 + Actor324: brik + Owner: GDI + Location: 90,17 + Actor325: brik + Owner: GDI + Location: 89,17 + Actor326: brik + Owner: GDI + Location: 88,16 + Actor327: brik + Owner: GDI + Location: 88,15 + Actor328: brik + Owner: GDI + Location: 88,14 + Actor329: brik + Owner: GDI + Location: 88,12 + Actor330: brik + Owner: GDI + Location: 88,13 + Actor331: brik + Owner: GDI + Location: 88,11 + Actor332: brik + Owner: GDI + Location: 88,10 + Actor333: brik + Owner: GDI + Location: 91,17 + Actor334: brik + Owner: GDI + Location: 93,17 + Actor335: brik + Owner: GDI + Location: 94,17 + Actor336: brik + Owner: GDI + Location: 92,17 + Actor340: brik + Owner: GDI + Location: 95,17 + Actor341: brik + Owner: GDI + Location: 95,16 + Actor337: brik + Owner: GDI + Location: 94,16 + Actor338: brik + Owner: GDI + Location: 99,16 + Actor339: brik + Owner: GDI + Location: 99,17 + Actor342: brik + Owner: GDI + Location: 100,16 + Actor343: brik + Owner: GDI + Location: 100,17 + Actor344: brik + Owner: GDI + Location: 101,17 + Actor345: brik + Owner: GDI + Location: 102,17 + Actor346: brik + Owner: GDI + Location: 103,17 + Actor347: brik + Owner: GDI + Location: 104,17 + Actor348: brik + Owner: GDI + Location: 105,17 + Actor349: brik + Owner: GDI + Location: 107,17 + Actor350: brik + Owner: GDI + Location: 106,17 + Actor351: brik + Owner: GDI + Location: 108,17 + Actor352: brik + Owner: GDI + Location: 108,16 + Actor353: brik + Owner: GDI + Location: 109,16 + Actor354: brik + Owner: GDI + Location: 109,15 + Actor355: brik + Owner: GDI + Location: 109,14 + Actor356: brik + Owner: GDI + Location: 109,13 + Actor357: brik + Owner: GDI + Location: 109,12 + Actor358: brik + Owner: GDI + Location: 109,11 + Actor359: brik + Owner: GDI + Location: 109,10 + Actor360: brik + Owner: GDI + Location: 109,8 + Actor361: brik + Owner: GDI + Location: 109,9 + Actor362: brik + Owner: GDI + Location: 109,7 + Actor363: brik + Owner: GDI + Location: 109,6 + Actor364: brik + Owner: GDI + Location: 109,5 + Actor365: brik + Owner: GDI + Location: 109,4 + Actor366: brik + Owner: GDI + Location: 108,4 + Actor367: brik + Owner: GDI + Location: 106,4 + Actor368: brik + Owner: GDI + Location: 107,4 + Actor369: brik + Owner: GDI + Location: 105,4 + Actor370: brik + Owner: GDI + Location: 103,4 + Actor371: brik + Owner: GDI + Location: 104,4 + Actor372: brik + Owner: GDI + Location: 101,4 + Actor373: brik + Owner: GDI + Location: 102,4 + Actor374: brik + Owner: GDI + Location: 100,4 + Actor375: brik + Owner: GDI + Location: 99,4 + Actor376: brik + Owner: GDI + Location: 99,5 + Actor377: brik + Owner: GDI + Location: 100,5 + Actor378: brik + Owner: GDI + Location: 95,5 + Actor379: brik + Owner: GDI + Location: 95,4 + Actor380: brik + Owner: GDI + Location: 94,4 + Actor381: brik + Owner: GDI + Location: 94,5 + Actor382: brik + Owner: GDI + Location: 93,4 + Actor383: brik + Owner: GDI + Location: 92,4 + Actor384: brik + Owner: GDI + Location: 91,4 + Actor385: brik + Owner: GDI + Location: 90,4 + Actor386: brik + Owner: GDI + Location: 89,4 + Actor387: brik + Owner: GDI + Location: 88,4 + Actor388: brik + Owner: GDI + Location: 88,5 + Actor389: brik + Owner: GDI + Location: 89,5 + Actor390: brik + Owner: GDI + Location: 88,9 + Actor391: brik + Owner: GDI + Location: 89,9 + Actor392: brik + Owner: GDI + Location: 89,10 + NEPowered3: atwr + Owner: GDI + Location: 101,16 + NEPowered2: atwr + Owner: GDI + Location: 93,16 + Actor395: gtwr + Owner: GDI + Location: 95,18 + Actor396: gtwr + Owner: GDI + Location: 99,18 + Actor398: hq + Owner: GDI + Location: 89,14 + NEPower4: nuk2 + Owner: GDI + Location: 107,5 + NEPower3: nuk2 + Owner: GDI + Location: 105,5 + NEPower2: nuk2 + Owner: GDI + Location: 103,5 + NEPower1: nuk2 + Owner: GDI + Location: 101,5 + WarthogAirfield1: afld.gdi + Owner: GDI + Location: 93,9 + WarthogAirfield2: afld.gdi + Owner: GDI + Location: 93,12 + Actor397: rep + Owner: GDI + Location: 97,10 + WarthogAirfield4: afld.gdi + Owner: GDI + Location: 101,12 + WarthogAirfield3: afld.gdi + Owner: GDI + Location: 101,9 + NEPowered5: cram + Owner: GDI + Location: 107,16 + TurretFacing: 832 + NEPowered1: cram + Owner: GDI + Location: 90,5 + TurretFacing: 832 + NEPowered4: cram + Owner: GDI + Location: 98,9 + TurretFacing: 832 + Actor411: n1 + Owner: GDI + SubCell: 3 + Location: 91,13 + Facing: 618 + Actor412: n1 + Owner: GDI + SubCell: 3 + Location: 91,10 + Facing: 118 + Actor413: n1 + Owner: GDI + SubCell: 3 + Location: 92,11 + Facing: 634 + Actor415: n1 + Owner: GDI + Location: 91,13 + SubCell: 1 + Facing: 277 + Actor418: n1 + Owner: GDI + Location: 92,13 + SubCell: 4 + Facing: 777 + Actor419: n1 + Owner: GDI + SubCell: 3 + Location: 91,15 + Facing: 507 + Actor414: n2 + Owner: GDI + SubCell: 3 + Facing: 384 + Location: 99,7 + Actor416: mtnk + Owner: GDI + Facing: 384 + Location: 100,19 + Actor417: tc02 + Owner: Neutral + Location: 89,19 + Actor420: tc01 + Owner: Neutral + Location: 105,18 + Actor421: t16 + Owner: Neutral + Location: 112,16 + Actor422: t17 + Owner: Neutral + Location: 102,19 + Actor423: tc02 + Owner: Neutral + Location: 110,1 + Actor424: t13 + Owner: Neutral + Location: 83,1 + Actor425: t16 + Owner: Neutral + Location: 84,11 + Actor426: t06 + Owner: Neutral + Location: 85,12 + Actor427: mtnk + Owner: GDI + Facing: 261 + Location: 87,24 + Actor428: mtnk + Owner: GDI + Facing: 261 + Location: 87,26 + Actor429: tc04 + Owner: Neutral + Location: 84,47 + Actor430: t17 + Owner: Neutral + Location: 86,44 + Actor431: tc05 + Owner: Neutral + Location: 89,41 + Actor432: tc02 + Owner: Neutral + Location: 82,36 + Actor433: t16 + Owner: Neutral + Location: 80,39 + Actor434: t15 + Owner: Neutral + Location: 82,39 + Actor435: t11 + Owner: Neutral + Location: 86,37 + Actor436: t07 + Owner: Neutral + Location: 85,35 + Actor437: t14 + Owner: Neutral + Location: 80,42 + Actor438: tc02 + Owner: Neutral + Location: 93,40 + Actor439: tc04 + Owner: Neutral + Location: 88,33 + Actor440: t16 + Owner: Neutral + Location: 89,32 + Actor442: t06 + Owner: Neutral + Location: 91,38 + Actor443: t07 + Owner: Neutral + Location: 88,38 + Actor444: t13 + Owner: Neutral + Location: 90,31 + Actor445: tc03 + Owner: Neutral + Location: 90,37 + Actor446: t16 + Owner: Neutral + Location: 94,33 + Actor447: t07 + Owner: Neutral + Location: 95,38 + Actor448: t13 + Owner: Neutral + Location: 93,36 + Actor449: t07 + Owner: Neutral + Location: 95,31 + Actor450: t13 + Owner: Neutral + Location: 97,36 + Actor441: t01 + Owner: Neutral + Location: 99,34 + Actor451: t06 + Owner: Neutral + Location: 98,33 + Actor452: t03 + Owner: Neutral + Location: 99,39 + Actor453: brik + Owner: Greece + Location: 27,57 + Actor454: brik + Owner: Greece + Location: 31,57 + Actor455: brik + Owner: Greece + Location: 32,57 + Actor456: brik + Owner: Greece + Location: 31,58 + Actor457: brik + Owner: Greece + Location: 32,58 + Actor458: brik + Owner: Greece + Location: 27,58 + Actor459: brik + Owner: Greece + Location: 26,58 + Actor460: brik + Owner: Greece + Location: 26,57 + Actor461: brik + Owner: Greece + Location: 25,57 + Actor462: brik + Owner: Greece + Location: 24,57 + Actor463: brik + Owner: Greece + Location: 23,57 + Actor464: brik + Owner: Greece + Location: 22,57 + Actor465: brik + Owner: Greece + Location: 21,57 + Actor466: brik + Owner: Greece + Location: 21,58 + Actor467: brik + Owner: Greece + Location: 21,59 + Actor468: brik + Owner: Greece + Location: 21,61 + Actor469: brik + Owner: Greece + Location: 21,60 + Actor470: brik + Owner: Greece + Location: 21,62 + Actor471: brik + Owner: Greece + Location: 22,62 + Actor472: brik + Owner: Greece + Location: 22,61 + Actor473: brik + Owner: Greece + Location: 21,66 + Actor474: brik + Owner: Greece + Location: 22,66 + Actor475: brik + Owner: Greece + Location: 21,67 + Actor476: brik + Owner: Greece + Location: 22,67 + Actor477: brik + Owner: Greece + Location: 21,68 + Actor478: brik + Owner: Greece + Location: 21,69 + Actor479: brik + Owner: Greece + Location: 21,70 + Actor480: brik + Owner: Greece + Location: 22,70 + Actor481: brik + Owner: Greece + Location: 22,69 + Actor482: brik + Owner: Greece + Location: 22,71 + Actor483: brik + Owner: Greece + Location: 22,72 + Actor484: brik + Owner: Greece + Location: 23,72 + Actor485: brik + Owner: Greece + Location: 23,71 + Actor505: brik + Owner: Greece + Location: 33,57 + Actor506: brik + Owner: Greece + Location: 34,57 + Actor507: brik + Owner: Greece + Location: 35,57 + Actor508: brik + Owner: Greece + Location: 36,57 + Actor509: brik + Owner: Greece + Location: 37,57 + Actor510: brik + Owner: Greece + Location: 38,57 + Actor514: brik + Owner: Greece + Location: 39,60 + Actor515: brik + Owner: Greece + Location: 39,59 + Actor516: brik + Owner: Greece + Location: 39,58 + Actor517: brik + Owner: Greece + Location: 39,57 + SWPower1: apwr + Owner: Greece + Location: 32,73 + SWPower2: apwr + Owner: Greece + Location: 28,71 + Actor523: proc + Owner: Greece + Location: 25,62 + Actor526: pbox + Owner: Greece + Location: 27,56 + Actor527: pbox + Owner: Greece + Location: 31,56 + Actor532: fact + Owner: Greece + Location: 24,67 + SWPowered1: agun + Owner: Greece + Location: 24,72 + TurretFacing: 832 + SWPowered6: agun + Owner: Greece + Location: 38,58 + TurretFacing: 832 + SWPowered11: agun + Owner: Greece + Location: 22,58 + TurretFacing: 832 + SWPowered2: pris + Owner: Greece + Location: 22,68 + SWPowered3: pris + Owner: Greece + Location: 22,60 + SWPowered5: pris + Owner: Greece + Location: 33,58 + SWPowered4: pris + Owner: Greece + Location: 25,58 + Actor488: brik + Owner: Greece + Location: 39,73 + Actor489: brik + Owner: Greece + Location: 38,73 + Actor490: brik + Owner: Greece + Location: 38,72 + Actor491: brik + Owner: Greece + Location: 39,72 + Actor492: brik + Owner: Greece + Location: 39,71 + Actor493: brik + Owner: Greece + Location: 39,70 + Actor494: brik + Owner: Greece + Location: 39,69 + Actor495: brik + Owner: Greece + Location: 39,68 + Actor496: brik + Owner: Greece + Location: 39,67 + Actor497: brik + Owner: Greece + Location: 39,66 + Actor498: brik + Owner: Greece + Location: 38,66 + Actor499: brik + Owner: Greece + Location: 38,67 + Actor500: brik + Owner: Greece + Location: 38,62 + Actor501: brik + Owner: Greece + Location: 38,61 + Actor502: brik + Owner: Greece + Location: 39,61 + Actor503: brik + Owner: Greece + Location: 39,62 + SWPowered8: pris + Owner: Greece + Location: 38,68 + SWPowered7: pris + Owner: Greece + Location: 38,60 + SWPowered10: agun + Owner: Greece + Location: 37,75 + TurretFacing: 832 + Actor513: pbox + Owner: Greece + Location: 40,66 + Actor518: pbox + Owner: Greece + Location: 40,62 + Actor530: silo + Owner: Greece + Location: 27,62 + Actor531: silo + Owner: Greece + Location: 25,62 + Actor534: split2 + Owner: Neutral + Location: 15,58 + Actor540: split2 + Owner: Neutral + Location: 11,60 + Actor541: split2 + Owner: Neutral + Location: 13,66 + Actor544: split2 + Owner: Neutral + Location: 7,63 + Actor524: weap + Owner: Greece + Location: 34,60 + Actor525: tent + Owner: Greece + Location: 31,60 + Actor545: dome + Owner: Greece + Location: 37,69 + SWPower3: apwr + Owner: Greece + Location: 32,70 + SWPower4: apwr + Owner: Greece + Location: 28,68 + LongbowPad1: hpad + Owner: Greece + Location: 32,65 + LongbowPad2: hpad + Owner: Greece + Location: 34,65 + SWPowered9: agun + Owner: Greece + Location: 29,64 + TurretFacing: 832 + Actor548: sbag + Owner: Greece + Location: 31,65 + Actor549: sbag + Owner: Greece + Location: 31,64 + Actor550: sbag + Owner: Greece + Location: 32,64 + Actor551: sbag + Owner: Greece + Location: 33,64 + Actor552: sbag + Owner: Greece + Location: 34,64 + Actor553: sbag + Owner: Greece + Location: 35,64 + Actor554: sbag + Owner: Greece + Location: 36,64 + Actor555: sbag + Owner: Greece + Location: 36,65 + Actor556: sbag + Owner: Greece + Location: 36,66 + Actor557: sbag + Owner: Greece + Location: 31,66 + Orca1: orca + Owner: GDI + Location: 30,17 + Facing: 384 + Orca2: orca + Owner: GDI + Location: 33,17 + Facing: 384 + Warthog1: a10 + Owner: GDI + Location: 96,8 + Facing: 384 + Warthog2: a10 + Owner: GDI + Location: 95,11 + Facing: 384 + Warthog3: a10 + Owner: GDI + Location: 103,8 + Facing: 384 + Warthog4: a10 + Owner: GDI + Location: 104,11 + Facing: 384 + Longbow1: heli + Owner: Greece + Location: 33,68 + Facing: 384 + Longbow2: heli + Owner: Greece + Location: 35,68 + Facing: 384 + Actor566: 2tnk + Owner: Greece + Location: 29,55 + Facing: 103 + Actor568: 2tnk + Owner: Greece + Location: 41,64 + Facing: 769 + Actor567: jeep + Owner: Greece + Location: 8,51 + Facing: 111 + Actor569: jeep + Owner: Greece + Location: 10,64 + Facing: 1023 + Actor570: 2tnk + Owner: Greece + Location: 17,42 + Facing: 626 + Actor571: e1 + Owner: Greece + Location: 11,47 + SubCell: 3 + Facing: 721 + Actor572: e1 + Owner: Greece + SubCell: 3 + Location: 18,41 + Facing: 610 + Actor573: e1 + Owner: Greece + SubCell: 3 + Location: 16,43 + Facing: 515 + Actor574: e1 + Owner: Greece + SubCell: 3 + Location: 22,39 + Facing: 610 + Actor575: e1 + Owner: Greece + SubCell: 3 + Location: 5,49 + Facing: 578 + Actor576: e1 + Owner: Greece + SubCell: 3 + Location: 28,50 + Facing: 0 + Actor577: e1 + Owner: Greece + SubCell: 3 + Location: 23,51 + Facing: 0 + Actor578: e3 + Owner: Greece + SubCell: 3 + Facing: 384 + Location: 6,47 + Actor580: e3 + Owner: Greece + SubCell: 3 + Location: 28,60 + Facing: 384 + Actor581: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 23,59 + Actor582: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 23,70 + Actor584: seal + Owner: Greece + Location: 30,61 + SubCell: 3 + Facing: 285 + Actor588: e1 + Owner: Greece + Location: 33,61 + SubCell: 3 + Facing: 610 + Actor590: e1 + Owner: Greece + SubCell: 1 + Location: 30,62 + Facing: 55 + Actor591: e1 + Owner: Greece + SubCell: 2 + Location: 30,62 + Facing: 777 + Actor592: e1 + Owner: Greece + SubCell: 3 + Location: 30,62 + Facing: 634 + Actor585: e1 + Owner: Greece + Facing: 384 + Location: 33,62 + SubCell: 1 + Actor583: seal + Owner: Greece + Location: 29,62 + SubCell: 3 + Facing: 95 + Actor586: medi + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 33,60 + Actor589: brik + Owner: Greece + Location: 62,64 + Actor593: brik + Owner: Greece + Location: 63,64 + Actor594: brik + Owner: Greece + Location: 64,64 + Actor595: brik + Owner: Greece + Location: 65,64 + Actor596: brik + Owner: Greece + Location: 66,64 + Actor597: brik + Owner: Greece + Location: 67,64 + Actor598: brik + Owner: Greece + Location: 68,64 + Actor599: brik + Owner: Greece + Location: 69,64 + Actor600: brik + Owner: Greece + Location: 70,64 + Actor601: brik + Owner: Greece + Location: 74,64 + Actor602: brik + Owner: Greece + Location: 75,64 + Actor603: brik + Owner: Greece + Location: 76,64 + Actor604: brik + Owner: Greece + Location: 77,64 + Actor605: brik + Owner: Greece + Location: 78,64 + Actor606: brik + Owner: Greece + Location: 79,64 + Actor607: brik + Owner: Greece + Location: 80,64 + Actor608: brik + Owner: Greece + Location: 81,64 + Actor609: brik + Owner: Greece + Location: 62,65 + Actor610: brik + Owner: Greece + Location: 69,65 + Actor611: brik + Owner: Greece + Location: 70,65 + Actor612: brik + Owner: Greece + Location: 74,65 + Actor613: brik + Owner: Greece + Location: 75,65 + Actor614: brik + Owner: Greece + Location: 81,65 + Actor616: brik + Owner: Greece + Location: 81,66 + Actor624: brik + Owner: Greece + Location: 81,67 + Actor627: brik + Owner: Greece + Location: 81,68 + Actor638: brik + Owner: Greece + Location: 81,69 + Actor663: brik + Owner: Greece + Location: 81,70 + Actor670: brik + Owner: Greece + Location: 81,71 + Actor675: brik + Owner: Greece + Location: 81,72 + Actor680: brik + Owner: Greece + Location: 81,73 + Actor682: brik + Owner: Greece + Location: 81,74 + Actor683: brik + Owner: Greece + Location: 62,75 + Actor684: brik + Owner: Greece + Location: 81,75 + Actor685: brik + Owner: Greece + Location: 62,76 + Actor686: brik + Owner: Greece + Location: 81,76 + Actor687: brik + Owner: Greece + Location: 62,77 + Actor688: brik + Owner: Greece + Location: 81,77 + Actor689: brik + Owner: Greece + Location: 62,78 + Actor690: brik + Owner: Greece + Location: 81,78 + Actor691: brik + Owner: Greece + Location: 62,79 + Actor692: brik + Owner: Greece + Location: 63,79 + Actor693: brik + Owner: Greece + Location: 64,79 + Actor694: brik + Owner: Greece + Location: 65,79 + Actor695: brik + Owner: Greece + Location: 66,79 + Actor696: brik + Owner: Greece + Location: 67,79 + Actor697: brik + Owner: Greece + Location: 68,79 + Actor698: brik + Owner: Greece + Location: 69,79 + Actor699: brik + Owner: Greece + Location: 70,79 + Actor700: brik + Owner: Greece + Location: 71,79 + Actor701: brik + Owner: Greece + Location: 72,79 + Actor702: brik + Owner: Greece + Location: 73,79 + Actor703: brik + Owner: Greece + Location: 74,79 + Actor704: brik + Owner: Greece + Location: 75,79 + Actor705: brik + Owner: Greece + Location: 76,79 + Actor706: brik + Owner: Greece + Location: 77,79 + Actor707: brik + Owner: Greece + Location: 78,79 + Actor708: brik + Owner: Greece + Location: 79,79 + Actor709: brik + Owner: Greece + Location: 80,79 + Actor710: brik + Owner: Greece + Location: 81,79 + Actor652: n1 + Owner: GDI + SubCell: 3 + Facing: 658 + Location: 39,23 + Actor810: split2 + Owner: Neutral + Location: 96,78 + SPowered1: agun + Owner: Greece + Location: 63,78 + TurretFacing: 832 + SPowered3: agun + Owner: Greece + Location: 80,65 + TurretFacing: 832 + SPowered2: agun + Owner: Greece + Location: 80,78 + TurretFacing: 832 + SPower3: apwr + Owner: Greece + Location: 70,76 + SPower2: apwr + Owner: Greece + Location: 73,76 + SPower1: apwr + Owner: Greece + Location: 76,76 + Actor820: weap + Owner: Greece + Location: 78,66 + Actor821: pbox + Owner: Greece + Location: 70,63 + Actor822: pbox + Owner: Greece + Location: 74,63 + SPower4: apwr + Owner: Greece + Location: 67,76 + SPowered6: pris + Owner: Greece + Location: 76,65 + SPowered5: pris + Owner: Greece + Location: 68,65 + SPowered4: pris + Owner: Greece + Location: 63,65 + Actor809: split2 + Owner: Neutral + Location: 90,72 + Actor711: chain + Owner: GDI + Location: 105,50 + Actor712: chain + Owner: GDI + Location: 106,50 + Actor713: chain + Owner: GDI + Location: 107,50 + Actor714: chain + Owner: GDI + Location: 108,50 + Actor715: chain + Owner: GDI + Location: 109,50 + Actor716: chain + Owner: GDI + Location: 110,50 + Actor717: chain + Owner: GDI + Location: 111,50 + Actor718: chain + Owner: GDI + Location: 112,50 + Actor719: chain + Owner: GDI + Location: 105,51 + Actor720: chain + Owner: GDI + Location: 112,51 + Actor721: chain + Owner: GDI + Location: 105,52 + OrcaPad3: hpad.td + Owner: GDI + Location: 107,52 + OrcaPad4: hpad.td + Owner: GDI + Location: 109,52 + Actor724: chain + Owner: GDI + Location: 112,52 + Actor725: chain + Owner: GDI + Location: 105,53 + Actor726: chain + Owner: GDI + Location: 112,53 + Actor727: chain + Owner: GDI + Location: 105,54 + Actor728: chain + Owner: GDI + Location: 112,54 + Actor729: gtwr + Owner: GDI + Location: 96,55 + Actor730: gtwr + Owner: GDI + Location: 100,55 + Actor731: chain + Owner: GDI + Location: 105,55 + Actor732: chain + Owner: GDI + Location: 112,55 + Actor733: brik + Owner: GDI + Location: 93,56 + Actor734: brik + Owner: GDI + Location: 94,56 + Actor735: brik + Owner: GDI + Location: 95,56 + Actor736: brik + Owner: GDI + Location: 96,56 + Actor737: brik + Owner: GDI + Location: 100,56 + Actor738: brik + Owner: GDI + Location: 101,56 + Actor739: brik + Owner: GDI + Location: 102,56 + Actor740: brik + Owner: GDI + Location: 103,56 + Actor741: brik + Owner: GDI + Location: 104,56 + Actor742: brik + Owner: GDI + Location: 105,56 + Actor743: brik + Owner: GDI + Location: 106,56 + Actor744: brik + Owner: GDI + Location: 107,56 + Actor745: brik + Owner: GDI + Location: 108,56 + Actor746: brik + Owner: GDI + Location: 111,56 + Actor750: brik + Owner: GDI + Location: 112,56 + Actor751: brik + Owner: GDI + Location: 93,57 + SEPowered2: atwr + Owner: GDI + Location: 94,57 + Actor753: brik + Owner: GDI + Location: 95,57 + Actor754: brik + Owner: GDI + Location: 96,57 + Actor755: brik + Owner: GDI + Location: 100,57 + Actor756: brik + Owner: GDI + Location: 101,57 + SEPowered1: atwr + Owner: GDI + Location: 102,57 + Actor758: hq + Owner: GDI + Location: 104,57 + Actor759: brik + Owner: GDI + Location: 107,57 + Actor760: brik + Owner: GDI + Location: 108,57 + Actor761: brik + Owner: GDI + Location: 111,57 + Actor763: brik + Owner: GDI + Location: 112,57 + Actor764: brik + Owner: GDI + Location: 93,58 + SEPowered7: cram + Owner: GDI + Location: 111,58 + TurretFacing: 832 + Actor767: brik + Owner: GDI + Location: 112,58 + Actor778: brik + Owner: GDI + Location: 93,59 + Actor779: pyle + Owner: GDI + Location: 95,59 + Actor780: brik + Owner: GDI + Location: 112,59 + Actor781: brik + Owner: GDI + Location: 93,60 + SEPowered3: cram + Owner: GDI + Location: 101,60 + TurretFacing: 832 + Actor783: brik + Owner: GDI + Location: 112,60 + Actor784: brik + Owner: GDI + Location: 93,61 + SEPower1: nuk2 + Owner: GDI + Location: 110,61 + Actor786: brik + Owner: GDI + Location: 112,61 + Actor787: brik + Owner: GDI + Location: 93,62 + AuroraAirfield1: afld.gdi + Owner: GDI + Location: 104,62 + Actor789: brik + Owner: GDI + Location: 112,62 + Actor790: brik + Owner: GDI + Location: 93,63 + Actor791: weap.td + Owner: GDI + Location: 95,63 + Actor792: rep + Owner: GDI + Location: 100,63 + Actor793: brik + Owner: GDI + Location: 112,63 + Actor794: brik + Owner: GDI + Location: 93,64 + SEPower2: nuk2 + Owner: GDI + Location: 110,64 + Actor796: brik + Owner: GDI + Location: 112,64 + Actor797: brik + Owner: GDI + Location: 93,65 + AuroraAirfield2: afld.gdi + Owner: GDI + Location: 104,65 + Actor799: brik + Owner: GDI + Location: 112,65 + Actor800: brik + Owner: GDI + Location: 93,66 + Actor801: brik + Owner: GDI + Location: 112,66 + Actor802: brik + Owner: GDI + Location: 93,67 + Actor803: proc.td + Owner: GDI + Location: 95,67 + Actor805: silo.td + Owner: GDI + Location: 99,67 + SEPower3: nuk2 + Owner: GDI + Location: 110,67 + Actor807: brik + Owner: GDI + Location: 112,67 + Actor828: brik + Owner: GDI + Location: 93,68 + Actor829: brik + Owner: GDI + Location: 112,68 + Actor830: brik + Owner: GDI + Location: 93,69 + Actor831: silo.td + Owner: GDI + Location: 99,69 + SEPowered4: cram + Owner: GDI + Location: 103,69 + TurretFacing: 832 + Actor833: brik + Owner: GDI + Location: 112,69 + Actor834: brik + Owner: GDI + Location: 93,70 + Actor835: afac + Owner: GDI + Location: 106,70 + SEPower4: nuk2 + Owner: GDI + Location: 110,70 + Actor837: brik + Owner: GDI + Location: 112,70 + Actor838: brik + Owner: GDI + Location: 93,71 + Actor839: brik + Owner: GDI + Location: 112,71 + Actor840: brik + Owner: GDI + Location: 93,72 + SEPowered5: atwr + Owner: GDI + Location: 94,72 + Actor842: brik + Owner: GDI + Location: 95,72 + Actor843: brik + Owner: GDI + Location: 96,72 + Actor844: brik + Owner: GDI + Location: 100,72 + Actor845: brik + Owner: GDI + Location: 101,72 + SEPowered6: atwr + Owner: GDI + Location: 102,72 + Actor847: brik + Owner: GDI + Location: 112,72 + Actor848: brik + Owner: GDI + Location: 93,73 + Actor849: brik + Owner: GDI + Location: 94,73 + Actor850: brik + Owner: GDI + Location: 95,73 + Actor851: brik + Owner: GDI + Location: 96,73 + Actor852: brik + Owner: GDI + Location: 100,73 + Actor853: brik + Owner: GDI + Location: 101,73 + Actor854: brik + Owner: GDI + Location: 102,73 + Actor855: brik + Owner: GDI + Location: 103,73 + Actor856: brik + Owner: GDI + Location: 104,73 + Actor857: brik + Owner: GDI + Location: 105,73 + Actor858: brik + Owner: GDI + Location: 106,73 + Actor859: brik + Owner: GDI + Location: 107,73 + Actor860: brik + Owner: GDI + Location: 108,73 + Actor861: brik + Owner: GDI + Location: 109,73 + Actor862: brik + Owner: GDI + Location: 110,73 + Actor863: brik + Owner: GDI + Location: 111,73 + Actor864: brik + Owner: GDI + Location: 112,73 + Actor804: tc01 + Owner: Neutral + Location: 104,79 + Actor808: tc02 + Owner: Neutral + Location: 109,78 + Actor865: t16 + Owner: Neutral + Location: 112,79 + Actor866: t12 + Owner: Neutral + Location: 105,74 + Actor867: t15 + Owner: Neutral + Location: 82,76 + Actor868: t02 + Owner: Neutral + Location: 86,77 + Actor823: brik + Owner: Greece + Location: 62,66 + Actor824: brik + Owner: Greece + Location: 63,66 + Actor827: pbox + Owner: Greece + Location: 61,67 + Actor869: brik + Owner: Greece + Location: 62,67 + Actor870: brik + Owner: Greece + Location: 63,67 + Actor871: pbox + Owner: Greece + Location: 61,71 + Actor872: brik + Owner: Greece + Location: 62,71 + Actor873: brik + Owner: Greece + Location: 63,71 + Actor874: brik + Owner: Greece + Location: 62,72 + Actor875: brik + Owner: Greece + Location: 63,72 + Actor876: brik + Owner: Greece + Location: 62,73 + Actor878: brik + Owner: Greece + Location: 62,74 + Actor879: v01 + Owner: Neutral + Location: 48,67 + Actor880: v03 + Owner: Neutral + Location: 53,61 + Actor881: v04 + Owner: Neutral + Location: 54,64 + Actor882: v05 + Owner: Neutral + Location: 54,54 + Actor883: v08 + Owner: Neutral + Location: 59,57 + Actor884: v11 + Owner: Neutral + Location: 51,59 + Actor885: v10 + Owner: Neutral + Location: 49,71 + Actor886: v09 + Owner: Neutral + Location: 50,64 + Actor887: v07 + Owner: Neutral + Location: 50,56 + Actor888: t01 + Owner: Neutral + Location: 50,53 + Actor889: tc04 + Owner: Neutral + Location: 63,55 + Actor890: t03 + Owner: Neutral + Location: 62,56 + Actor891: t02 + Owner: Neutral + Location: 61,54 + Actor892: t07 + Owner: Neutral + Location: 56,65 + Actor893: t11 + Owner: Neutral + Location: 55,60 + Actor894: t12 + Owner: Neutral + Location: 53,59 + Actor895: t02 + Owner: Neutral + Location: 54,56 + Actor896: tc05 + Owner: Neutral + Location: 46,60 + Actor897: t05 + Owner: Neutral + Location: 43,51 + Actor898: t02 + Owner: Neutral + Location: 52,73 + Actor899: t17 + Owner: Neutral + Location: 58,61 + Actor900: tc03 + Owner: Neutral + Location: 62,51 + Actor901: t06 + Owner: Neutral + Location: 54,72 + Actor902: tc04 + Owner: Neutral + Location: 55,78 + Actor903: tc02 + Owner: Neutral + Location: 56,76 + Actor904: t16 + Owner: Neutral + Location: 60,74 + Actor905: t13 + Owner: Neutral + Location: 51,76 + Actor906: t14 + Owner: Neutral + Location: 43,70 + Actor907: t07 + Owner: Neutral + Location: 45,65 + Actor908: t02 + Owner: Neutral + Location: 43,56 + Actor909: t06 + Owner: Neutral + Location: 50,50 + Actor910: t08 + Owner: Neutral + Location: 46,48 + Actor911: t05 + Owner: Neutral + Location: 38,48 + Actor912: tc01 + Owner: Neutral + Location: 35,50 + Actor913: hmmv + Owner: GDI + Location: 100,30 + Facing: 626 + Actor915: htnk.ion + Owner: GDI + Location: 98,55 + Facing: 0 + TitanPatroller: titn.rail + Owner: GDI + Location: 76,21 + Facing: 256 + Actor917: hmmv.tow + Owner: GDI + Facing: 384 + Location: 109,43 + MiniDronePatroller1: mdrn + Owner: GDI + SubCell: 3 + Location: 37,38 + Facing: 768 + MiniDronePatroller2: mdrn + Owner: GDI + SubCell: 3 + Location: 34,39 + Facing: 768 + Actor921: vulc + Owner: GDI + Facing: 384 + Location: 86,11 + Actor922: gdrn + Owner: GDI + Location: 105,9 + Facing: 512 + Actor923: gdrn + Owner: GDI + Location: 106,10 + Facing: 512 + Actor924: 1tnk + Owner: Greece + Facing: 384 + Location: 54,69 + Actor925: 1tnk + Owner: Greece + Location: 52,53 + Facing: 642 + Actor926: chpr + Owner: Greece + Location: 72,63 + Facing: 1023 + Actor927: cryo + Owner: Greece + Location: 36,54 + Facing: 95 + Actor928: 2tnk + Owner: Greece + Location: 72,52 + Facing: 0 + Actor930: apc.ai + Owner: Greece + Location: 61,65 + Facing: 111 + Actor931: e1 + Owner: Greece + SubCell: 3 + Location: 49,58 + Facing: 507 + Actor932: e1 + Owner: Greece + Location: 50,55 + SubCell: 3 + Facing: 697 + Actor933: e1 + Owner: Greece + Location: 52,72 + SubCell: 3 + Facing: 1023 + Actor934: e1 + Owner: Greece + SubCell: 3 + Location: 53,73 + Facing: 166 + Actor935: e1 + Owner: Greece + SubCell: 3 + Location: 75,52 + Facing: 0 + Actor936: e1 + Owner: Greece + SubCell: 3 + Location: 69,54 + Facing: 384 + Actor937: e1 + Owner: Greece + SubCell: 3 + Location: 70,52 + Facing: 0 + Actor938: e1 + Owner: Greece + SubCell: 3 + Location: 78,62 + Facing: 0 + Actor939: e1 + Owner: Greece + SubCell: 3 + Location: 71,62 + Facing: 0 + Actor949: e1 + Owner: Greece + Location: 62,70 + SubCell: 1 + Facing: 118 + Actor951: e1 + Owner: Greece + SubCell: 3 + Location: 61,63 + Facing: 277 + Actor952: e1 + Owner: Greece + SubCell: 3 + Location: 48,51 + Facing: 594 + Actor953: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 38,53 + Actor954: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 34,56 + Actor955: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 44,58 + Actor956: e1 + Owner: Greece + SubCell: 3 + Location: 82,57 + Facing: 142 + Actor957: e3 + Owner: Greece + SubCell: 3 + Facing: 384 + Location: 83,54 + Actor958: e3 + Owner: Greece + Facing: 384 + Location: 77,65 + SubCell: 3 + Actor961: e3 + Owner: Greece + SubCell: 3 + Location: 63,62 + Facing: 888 + Actor962: e3 + Owner: Greece + Facing: 384 + Location: 53,63 + SubCell: 3 + Actor963: e3 + Owner: Greece + Facing: 384 + Location: 65,55 + SubCell: 3 + Actor964: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 20,63 + Actor965: n1 + Owner: GDI + SubCell: 3 + Location: 85,40 + Facing: 689 + Actor966: n1 + Owner: GDI + SubCell: 3 + Location: 89,40 + Facing: 71 + Actor967: n1 + Owner: GDI + SubCell: 3 + Location: 90,35 + Facing: 459 + Actor968: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 95,40 + Actor969: n1 + Owner: GDI + SubCell: 3 + Location: 96,39 + Facing: 563 + Actor970: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 94,33 + Actor971: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 86,36 + Actor973: n2 + Owner: GDI + Location: 87,36 + SubCell: 1 + Facing: 634 + Actor972: n2 + Owner: GDI + Facing: 384 + SubCell: 1 + Location: 96,39 + Actor974: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 95,35 + Actor975: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 100,38 + Actor976: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 83,44 + Actor977: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 79,41 + Actor978: n2 + Owner: GDI + SubCell: 3 + Location: 102,31 + Facing: 507 + Actor979: n2 + Owner: GDI + SubCell: 3 + Location: 101,55 + Facing: 0 + Actor980: n2 + Owner: GDI + SubCell: 3 + Location: 69,31 + Facing: 214 + Actor981: n2 + Owner: GDI + SubCell: 3 + Location: 55,29 + Facing: 729 + Actor982: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 77,19 + Actor983: n2 + Owner: GDI + SubCell: 3 + Location: 94,19 + Facing: 674 + Actor984: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 100,21 + Actor985: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 91,12 + Actor986: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 95,46 + Actor987: n3 + Owner: GDI + Location: 95,55 + SubCell: 3 + Facing: 0 + Actor989: n1 + Owner: GDI + Facing: 384 + Location: 96,61 + SubCell: 1 + Actor990: n1 + Owner: GDI + SubCell: 3 + Location: 97,60 + Facing: 721 + Actor991: n1 + Owner: GDI + Location: 94,61 + SubCell: 3 + Facing: 118 + Actor992: n1 + Owner: GDI + SubCell: 3 + Location: 97,61 + Facing: 578 + Actor993: n1 + Owner: GDI + Facing: 384 + Location: 97,61 + SubCell: 1 + Actor996: n3 + Owner: GDI + Location: 97,61 + SubCell: 2 + Facing: 705 + Actor997: n3 + Owner: GDI + SubCell: 3 + Location: 109,66 + Facing: 182 + Actor998: n3 + Owner: GDI + SubCell: 3 + Location: 68,30 + Facing: 467 + Actor999: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 82,17 + Actor1000: n3 + Owner: GDI + SubCell: 3 + Location: 53,23 + Facing: 384 + Actor1001: n3 + Owner: GDI + SubCell: 3 + Location: 57,6 + Facing: 602 + Actor1002: n1 + Owner: GDI + SubCell: 3 + Location: 60,5 + Facing: 483 + Actor918: medi + Owner: GDI + SubCell: 3 + Facing: 384 + Location: 63,6 + Actor1004: medi + Owner: GDI + SubCell: 3 + Location: 95,62 + Facing: 309 + Orca3: orca + Owner: GDI + Location: 108,51 + Facing: 384 + Orca4: orca + Owner: GDI + Location: 110,51 + Facing: 384 + NPowered7: atwr + Owner: GDI + Location: 69,38 + NPowered8: atwr + Owner: GDI + Location: 75,38 + NPowered9: atwr + Owner: GDI + Location: 93,28 + Actor1017: n1 + Owner: GDI + SubCell: 3 + Facing: 384 + Location: 56,41 + Actor1018: n1 + Owner: GDI + SubCell: 3 + Location: 59,47 + Facing: 71 + Actor1019: n1 + Owner: GDI + SubCell: 3 + Location: 42,40 + Facing: 0 + Actor1020: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 55,40 + Actor1021: n3 + Owner: GDI + SubCell: 3 + Location: 67,43 + Facing: 261 + Actor1022: n3 + Owner: GDI + SubCell: 3 + Location: 58,49 + Facing: 158 + Actor1023: n3 + Owner: GDI + SubCell: 3 + Location: 39,41 + Facing: 761 + Actor1024: n2 + Owner: GDI + SubCell: 3 + Location: 43,42 + Facing: 0 + Actor1025: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 59,40 + Actor1026: n2 + Owner: GDI + SubCell: 3 + Location: 81,32 + Facing: 158 + Actor1027: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 88,23 + Actor1028: e1 + Owner: Greece + SubCell: 3 + Location: 30,44 + Facing: 0 + Actor1032: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 97,59 + Actor995: e1 + Owner: Greece + SubCell: 3 + Facing: 737 + Location: 78,71 + Actor1029: e1 + Owner: Greece + Facing: 384 + SubCell: 1 + Location: 78,71 + Actor1031: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 73,64 + Actor1003: medi + Owner: GDI + Facing: 384 + Location: 91,11 + SubCell: 3 + Actor1033: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 37,55 + Actor529: pbox + Owner: Greece + Location: 20,66 + Actor528: pbox + Owner: Greece + Location: 20,62 + Actor1034: e1 + Owner: Greece + SubCell: 3 + Location: 6,51 + Facing: 864 + SPower5: powr + Owner: Greece + Location: 64,74 + Actor1037: atek + Owner: Greece + Location: 79,71 + Actor1038: tc04 + Owner: Neutral + Location: 49,33 + Actor1039: tc01 + Owner: Neutral + Location: 48,41 + Actor1040: tc02 + Owner: Neutral + Location: 37,35 + Actor1041: t15 + Owner: Neutral + Location: 33,42 + Actor1042: t16 + Owner: Neutral + Location: 27,41 + Actor1043: t13 + Owner: Neutral + Location: 28,40 + Actor1044: tc02 + Owner: Neutral + Location: 19,46 + Actor1045: t16 + Owner: Neutral + Location: 20,45 + Actor1046: t07 + Owner: Neutral + Location: 21,44 + Actor1047: t03 + Owner: Neutral + Location: 29,46 + Actor1048: t14 + Owner: Neutral + Location: 45,29 + Actor1049: t13 + Owner: Neutral + Location: 46,25 + Actor1050: t16 + Owner: Neutral + Location: 45,23 + Actor1051: t03 + Owner: Neutral + Location: 42,31 + Actor1052: t02 + Owner: Neutral + Location: 55,47 + Actor1053: tc02 + Owner: Neutral + Location: 62,38 + Actor1054: t16 + Owner: Neutral + Location: 62,41 + Actor1055: t15 + Owner: Neutral + Location: 75,42 + Actor1056: t07 + Owner: Neutral + Location: 74,31 + Actor1057: t13 + Owner: Neutral + Location: 77,36 + Actor1058: t02 + Owner: Neutral + Location: 59,36 + Actor1059: t01 + Owner: Neutral + Location: 60,21 + Actor1060: t08 + Owner: Neutral + Location: 64,22 + Actor1061: t01 + Owner: Neutral + Location: 75,17 + Actor1062: t05 + Owner: Neutral + Location: 79,27 + Actor1063: t16 + Owner: Neutral + Location: 86,20 + Actor1064: t13 + Owner: Neutral + Location: 105,30 + Actor1065: tc05 + Owner: Neutral + Location: 107,24 + Actor1066: t16 + Owner: Neutral + Location: 110,21 + Actor1067: t07 + Owner: Neutral + Location: 109,33 + Actor1068: t03 + Owner: Neutral + Location: 109,30 + Actor1069: t05 + Owner: Neutral + Location: 102,23 + Actor1070: t05 + Owner: Neutral + Location: 106,46 + Actor1071: tc04 + Owner: Neutral + Location: 107,45 + Actor1072: t13 + Owner: Neutral + Location: 106,44 + Actor1073: t11 + Owner: Neutral + Location: 98,48 + Actor1074: t12 + Owner: Neutral + Location: 100,46 + Actor1075: t05 + Owner: Neutral + Location: 74,56 + Actor1076: t07 + Owner: Neutral + Location: 78,52 + Actor1077: t06 + Owner: Neutral + Location: 89,53 + Actor1078: t05 + Owner: Neutral + Location: 93,47 + Actor1079: t05 + Owner: Neutral + Location: 66,48 + Actor1080: windmill + Owner: Neutral + Location: 44,50 + Actor1081: brl3 + Owner: Creeps + Location: 103,3 + Actor1082: barl + Owner: Creeps + Location: 102,3 + Actor959: chain + Owner: Greece + Location: 67,69 + Actor960: chain + Owner: Greece + Location: 68,69 + Actor994: chain + Owner: Greece + Location: 69,69 + Actor1005: chain + Owner: Greece + Location: 70,69 + Actor1006: chain + Owner: Greece + Location: 71,69 + Actor1007: chain + Owner: Greece + Location: 72,69 + Actor1008: chain + Owner: Greece + Location: 73,69 + Actor1009: chain + Owner: Greece + Location: 74,69 + Actor1030: chain + Owner: Greece + Location: 75,69 + Actor1035: chain + Owner: Greece + Location: 76,69 + Actor1083: chain + Owner: Greece + Location: 77,69 + Actor1084: chain + Owner: Greece + Location: 67,70 + LongbowPad3: hpad + Owner: Greece + Location: 68,70 + LongbowPad4: hpad + Owner: Greece + Location: 70,70 + HarrierPad1: hpad + Owner: Greece + Location: 73,70 + HarrierPad2: hpad + Owner: Greece + Location: 75,70 + Actor1089: chain + Owner: Greece + Location: 77,70 + Actor1090: chain + Owner: Greece + Location: 67,71 + Actor1091: chain + Owner: Greece + Location: 77,71 + Actor1092: chain + Owner: Greece + Location: 67,72 + Actor1093: chain + Owner: Greece + Location: 77,72 + Longbow3: heli + Owner: Greece + Location: 69,73 + Facing: 384 + Longbow4: heli + Owner: Greece + Location: 71,73 + Facing: 384 + Actor1098: e1 + Owner: Greece + Location: 72,70 + SubCell: 3 + Facing: 515 + Actor1099: e1 + Owner: Greece + Facing: 384 + Location: 66,70 + SubCell: 3 + Actor1100: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 67,65 + Actor1101: e1 + Owner: Greece + Facing: 384 + Location: 67,67 + SubCell: 3 + Actor1102: e1 + Owner: Greece + Facing: 384 + Location: 68,66 + SubCell: 3 + Actor1103: e1 + Owner: Greece + Facing: 384 + Location: 64,67 + SubCell: 3 + Actor1104: e1 + Owner: Greece + SubCell: 1 + Location: 72,70 + Facing: 384 + Actor1105: e1 + Owner: Greece + Location: 72,70 + SubCell: 2 + Facing: 666 + Actor1106: e3 + Owner: Greece + Facing: 384 + Location: 72,68 + SubCell: 3 + Actor988: n3 + Owner: GDI + SubCell: 3 + Location: 100,58 + Facing: 0 + Actor914: vulc + Owner: GDI + Location: 98,58 + Facing: 0 + Actor1107: n1 + Owner: GDI + SubCell: 3 + Location: 107,49 + Facing: 95 + Actor1108: n1 + Owner: GDI + SubCell: 3 + Location: 109,48 + Facing: 39 + Actor1109: n1 + Owner: GDI + SubCell: 3 + Location: 111,49 + Facing: 87 + Actor1110: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 111,52 + Actor1111: n1 + Owner: GDI + SubCell: 3 + Location: 111,45 + Facing: 277 + TitanPatrol1: waypoint + Owner: Neutral + Location: 57,19 + TitanPatrol2: waypoint + Owner: Neutral + Location: 57,29 + TitanPatrol3: waypoint + Owner: Neutral + Location: 62,34 + TitanPatrol4: waypoint + Owner: Neutral + Location: 76,34 + TitanPatrol5: waypoint + Owner: Neutral + Location: 81,30 + TitanPatrol6: waypoint + Owner: Neutral + Location: 82,21 + MiniDronePatrol1: waypoint + Owner: Neutral + Location: 31,38 + MiniDronePatrol2: waypoint + Owner: Neutral + Location: 46,38 + MiniDronePatrol3: waypoint + Owner: Neutral + Location: 53,44 + MiniDronePatrol4: waypoint + Owner: Neutral + Location: 60,44 + MiniDronePatrol5: waypoint + Owner: Neutral + Location: 64,46 + MiniDronePatrol6: waypoint + Owner: Neutral + Location: 78,46 + PlayerStart: waypoint + Owner: Neutral + Location: 7,31 + Aurora1: auro + Owner: GDI + Location: 108,62 + Facing: 384 + Aurora2: auro + Owner: GDI + Location: 108,65 + Facing: 384 + Harrier1: harr + Owner: Greece + Location: 74,74 + Facing: 384 + Harrier2: harr + Owner: Greece + Location: 76,74 + Facing: 384 + Actor1010: split2 + Owner: Neutral + Location: 15,24 + Actor1011: split2 + Owner: Neutral + Location: 15,17 + Actor1012: proc.td + Owner: GDI + Location: 25,20 + Actor1013: n1 + Owner: GDI + SubCell: 3 + Facing: 103 + Location: 27,19 + Actor1014: rep + Owner: GDI + Location: 30,21 + EasyOnlyIntruder1: s4 + Owner: Scrin + SubCell: 3 + Location: 5,30 + Facing: 768 + Actor1016: s4 + Owner: Scrin + Location: 6,30 + SubCell: 3 + Facing: 768 + EasyNormalOnlyIntruder: s4 + Owner: Scrin + SubCell: 3 + Location: 5,31 + TurretFacing: 0 + Facing: 768 + EasyOnlyIntruder2: s4 + Owner: Scrin + Location: 5,32 + SubCell: 3 + Facing: 768 + Actor1086: s4 + Owner: Scrin + Location: 6,31 + SubCell: 3 + Facing: 768 + Actor1087: s4 + Owner: Scrin + Location: 6,32 + SubCell: 3 + Facing: 768 + LeecherSpawn: waypoint + Owner: Neutral + Location: 5,19 + Actor1015: n1 + Owner: GDI + SubCell: 3 + Location: 96,10 + Facing: 563 + Actor1036: n1 + Owner: GDI + SubCell: 3 + Location: 97,8 + Facing: 919 + Actor1085: n1 + Owner: GDI + SubCell: 3 + Location: 94,8 + Facing: 285 + Actor1088: n1 + Owner: GDI + Location: 97,8 + SubCell: 1 + Facing: 0 + Actor1094: htnk + Owner: GDI + Facing: 638 + Location: 34,33 + Actor1095: mtnk + Owner: GDI + Location: 41,28 + Facing: 642 + Actor1096: n1 + Owner: GDI + Facing: 384 + Location: 69,31 + SubCell: 1 + Actor1097: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 71,32 + Actor1112: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 66,31 + Actor1113: n1 + Owner: GDI + SubCell: 3 + Location: 61,27 + Facing: 118 + Actor1114: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 88,28 + Actor1115: n3 + Owner: GDI + SubCell: 3 + Location: 84,44 + Facing: 245 + Actor1116: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 90,39 + Actor1117: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 91,33 + Actor1118: n1 + Owner: GDI + Facing: 384 + Location: 87,35 + SubCell: 3 + Actor1119: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 110,43 + Actor1120: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 108,42 + Actor1121: n2 + Owner: GDI + Facing: 384 + Location: 111,49 + SubCell: 1 + Actor1122: hmmv + Owner: GDI + Facing: 384 + Location: 44,42 + Actor1123: jeep + Owner: Greece + Facing: 650 + Location: 77,62 + Actor1124: 2tnk + Owner: Greece + Facing: 0 + Location: 75,54 + Actor1125: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 78,70 + Actor1126: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 66,69 + Actor1127: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 30,74 + Actor1128: e1 + Owner: Greece + Facing: 384 + Location: 6,51 + SubCell: 1 + Actor1129: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 19,45 + Actor1130: e1 + Owner: Greece + Facing: 384 + Location: 13,46 + SubCell: 3 + Actor1131: e1 + Owner: Greece + Location: 28,49 + SubCell: 3 + Facing: 111 + Actor1132: e1 + Owner: Greece + SubCell: 3 + Location: 24,50 + Facing: 47 + Actor1133: n1 + Owner: Greece + SubCell: 3 + Location: 31,45 + Facing: 95 + Actor1134: n1 + Owner: Greece + SubCell: 3 + Location: 28,45 + Facing: 0 + Actor1135: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 49,50 + Actor1136: e1 + Owner: Greece + Facing: 384 + Location: 53,64 + SubCell: 3 + Actor1137: e1 + Owner: Greece + SubCell: 3 + Location: 55,72 + Facing: 166 + Actor1138: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 55,69 + Actor1139: e3 + Owner: Greece + Facing: 384 + Location: 55,72 + SubCell: 1 + Actor1140: n2 + Owner: GDI + SubCell: 3 + Location: 100,66 + Facing: 729 + Actor1141: n2 + Owner: GDI + SubCell: 3 + Location: 101,68 + Facing: 856 + Actor1142: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 98,74 + Actor1143: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 97,73 + Actor1144: hmmv + Owner: GDI + Facing: 626 + Location: 89,23 + Actor1145: vulc + Owner: GDI + Location: 53,37 + Facing: 650 + Actor1146: n1 + Owner: GDI + Facing: 384 + Location: 63,6 + SubCell: 1 + Actor1147: n1 + Owner: GDI + Facing: 384 + Location: 64,5 + SubCell: 3 + Actor1148: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 63,3 + Actor1149: n2 + Owner: GDI + SubCell: 3 + Location: 61,19 + Facing: 1023 + EntranceReveal1: waypoint + Owner: Neutral + Location: 30,32 + EntranceReveal2: waypoint + Owner: Neutral + Location: 39,26 + EntranceReveal3: waypoint + Owner: Neutral + Location: 62,15 + EntranceReveal4: waypoint + Owner: Neutral + Location: 97,17 + EntranceReveal5: waypoint + Owner: Neutral + Location: 98,54 + EntranceReveal6: waypoint + Owner: Neutral + Location: 72,63 + EntranceReveal7: waypoint + Owner: Neutral + Location: 29,56 + Actor1150: gtwr + Owner: GDI + Location: 81,7 + Actor1151: gtwr + Owner: GDI + Location: 81,6 + EntranceReveal8: waypoint + Owner: Neutral + Location: 22,21 + TitanTrigger1: waypoint + Owner: Neutral + Location: 60,14 + TitanTrigger2: waypoint + Owner: Neutral + Location: 61,14 + TitanTrigger3: waypoint + Owner: Neutral + Location: 62,14 + TitanTrigger4: waypoint + Owner: Neutral + Location: 63,14 + TitanTrigger5: waypoint + Owner: Neutral + Location: 64,14 + IntruderSpawn: waypoint + Owner: Neutral + Location: 6,16 + AlliedSouthBarracks: tent + Owner: Greece + Location: 65,65 + GDINorthBarracks: pyle + Owner: GDI + Location: 89,11 + EntranceReveal6Alt: waypoint + Owner: Neutral + Location: 84,67 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-allegiances.yaml, ca|missions/main-campaign/ca21-incapacitation/incapacitation-rules.yaml, ca|rules/custom/coop-rules.yaml, incapacitation-coop-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml, ca|missions/main-campaign/ca21-incapacitation/incapacitation-weapons.yaml diff --git a/mods/ca/missions/coop-campaign/ca22-decimation-coop/decimation-coop-rules.yaml b/mods/ca/missions/coop-campaign/ca22-decimation-coop/decimation-coop-rules.yaml new file mode 100644 index 0000000000..646fa7e585 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca22-decimation-coop/decimation-coop-rules.yaml @@ -0,0 +1,6 @@ +World: + LuaScript: + Scripts: campaign.lua, coop.lua, ca|missions/main-campaign/ca22-decimation/decimation.lua, decimation-coop.lua + LobbyMissionInfo@InitialObjectives: + Prefix: Initial Objectives + Text: • Destroy all uncrewed Soviet vehicles.\n• Eliminate Soviet bases.\n• [Optional] Destroy the front line of Soviet SAM Sites. diff --git a/mods/ca/missions/coop-campaign/ca22-decimation-coop/decimation-coop.lua b/mods/ca/missions/coop-campaign/ca22-decimation-coop/decimation-coop.lua new file mode 100644 index 0000000000..cc9aac2d8c --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca22-decimation-coop/decimation-coop.lua @@ -0,0 +1,26 @@ + +SetupPlayers = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Multi2 = Player.GetPlayer("Multi2") + Multi3 = Player.GetPlayer("Multi3") + Multi4 = Player.GetPlayer("Multi4") + Multi5 = Player.GetPlayer("Multi5") + Scrin = Player.GetPlayer("Scrin") + USSR = Player.GetPlayer("USSR") + USSRUnmanned = Player.GetPlayer("USSRUnmanned") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = Utils.Where({ Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 }, function(p) return p ~= nil end) + MissionEnemies = { USSR } + SinglePlayerPlayer = Scrin + CoopInit() +end + +AfterWorldLoaded = function() + TransferMcvsToPlayers() + StartCashSpread(3500) +end + +AfterTick = function() + +end diff --git a/mods/ca/missions/coop-campaign/ca22-decimation-coop/map.bin b/mods/ca/missions/coop-campaign/ca22-decimation-coop/map.bin new file mode 100644 index 0000000000..7b7716d8f1 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca22-decimation-coop/map.bin differ diff --git a/mods/ca/missions/coop-campaign/ca22-decimation-coop/map.png b/mods/ca/missions/coop-campaign/ca22-decimation-coop/map.png new file mode 100644 index 0000000000..f13253914a Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca22-decimation-coop/map.png differ diff --git a/mods/ca/missions/coop-campaign/ca22-decimation-coop/map.yaml b/mods/ca/missions/coop-campaign/ca22-decimation-coop/map.yaml new file mode 100644 index 0000000000..4e503eb0ea --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca22-decimation-coop/map.yaml @@ -0,0 +1,4559 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 22: Decimation Co-op + +Author: Darkademic & Gandorques Hikla + +Tileset: TEMPERAT + +MapSize: 114,114 + +Bounds: 1,1,112,112 + +Visibility: Lobby + +Categories: Co-op Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: Scrin, USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + PlayerReference@Scrin: + Name: Scrin + Faction: scrin + Color: 7700FF + Allies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, USSRUnmanned, Creeps + PlayerReference@USSR: + Name: USSR + Bot: campaign + Faction: soviet + Color: FE1100 + Enemies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@USSRUnmanned: + Name: USSRUnmanned + Bot: campaign + Faction: soviet + Color: D5A39F + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: scrin + Color: 7700FF + LockColor: True + Allies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, USSRUnmanned, Creeps + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: scrin + Color: D83CE5 + LockColor: True + Allies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, USSRUnmanned, Creeps + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: scrin + Color: 0B7310 + LockColor: True + Allies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, USSRUnmanned, Creeps + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: scrin + Color: 775A12 + LockColor: True + Allies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, USSRUnmanned, Creeps + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: scrin + Color: 82C900 + LockColor: True + Allies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, USSRUnmanned, Creeps + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: scrin + Color: EEA8A8 + LockColor: True + Allies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, USSRUnmanned, Creeps + +Actors: + Actor0: smcv + Owner: Scrin + Location: 8,106 + Facing: 912 + Actor2: intl.loaded + Owner: Scrin + Location: 8,103 + Facing: 912 + Actor3: intl.loaded + Owner: Scrin + Location: 12,105 + Facing: 912 + Actor9: tc05 + Owner: Neutral + Faction: reaper + Location: 15,58 + Actor10: tc04 + Owner: Neutral + Faction: reaper + Location: 22,60 + ForwardSAM6: sam + Owner: USSR + Location: 18,62 + ForwardSAM8: sam + Owner: USSR + Location: 4,59 + ForwardSAM7: sam + Owner: USSR + Location: 12,56 + Actor15: split2 + Owner: Neutral + Location: 26,102 + Actor16: split2 + Owner: Neutral + Location: 30,104 + ForwardSAM4: sam + Owner: USSR + Location: 41,79 + ForwardSAM3: sam + Owner: USSR + Location: 59,91 + ForwardSAM1: sam + Owner: USSR + Location: 63,109 + Actor20: fenc + Owner: USSR + Location: 64,108 + Actor21: fenc + Owner: USSR + Location: 63,108 + Actor22: fenc + Owner: USSR + Location: 62,108 + Actor23: fenc + Owner: USSR + Location: 62,109 + Actor24: fenc + Owner: USSR + Location: 62,110 + Actor25: fenc + Owner: USSR + Location: 63,110 + Actor26: fenc + Owner: USSR + Location: 64,110 + Actor27: fenc + Owner: USSR + Location: 65,110 + Actor28: fenc + Owner: USSR + Location: 65,109 + Actor29: fenc + Owner: USSR + Location: 65,108 + Actor30: fenc + Owner: USSR + Location: 58,90 + Actor31: fenc + Owner: USSR + Location: 58,91 + Actor32: fenc + Owner: USSR + Location: 58,92 + Actor33: fenc + Owner: USSR + Location: 59,92 + Actor34: fenc + Owner: USSR + Location: 60,92 + Actor35: fenc + Owner: USSR + Location: 61,92 + Actor36: fenc + Owner: USSR + Location: 61,91 + Actor37: fenc + Owner: USSR + Location: 61,90 + Actor38: fenc + Owner: USSR + Location: 59,90 + Actor39: fenc + Owner: USSR + Location: 60,90 + Actor40: fenc + Owner: USSR + Location: 41,80 + Actor41: fenc + Owner: USSR + Location: 40,80 + Actor42: fenc + Owner: USSR + Location: 40,79 + Actor43: fenc + Owner: USSR + Location: 40,78 + Actor44: fenc + Owner: USSR + Location: 41,78 + Actor45: fenc + Owner: USSR + Location: 41,78 + Actor46: fenc + Owner: USSR + Location: 42,78 + Actor47: fenc + Owner: USSR + Location: 43,78 + Actor48: fenc + Owner: USSR + Location: 43,79 + Actor49: fenc + Owner: USSR + Location: 43,80 + Actor50: fenc + Owner: USSR + Location: 42,80 + Actor51: fenc + Owner: USSR + Location: 18,61 + Actor52: fenc + Owner: USSR + Location: 19,61 + Actor53: fenc + Owner: USSR + Location: 20,61 + Actor54: fenc + Owner: USSR + Location: 20,62 + Actor55: fenc + Owner: USSR + Location: 12,57 + Actor56: fenc + Owner: USSR + Location: 13,57 + Actor57: fenc + Owner: USSR + Location: 14,57 + Actor58: fenc + Owner: USSR + Location: 11,57 + Actor59: fenc + Owner: USSR + Location: 11,56 + Actor60: fenc + Owner: USSR + Location: 11,55 + Actor61: fenc + Owner: USSR + Location: 12,55 + Actor62: fenc + Owner: USSR + Location: 13,55 + Actor63: fenc + Owner: USSR + Location: 14,55 + Actor64: fenc + Owner: USSR + Location: 14,56 + Actor65: fenc + Owner: USSR + Location: 3,59 + Actor66: fenc + Owner: USSR + Location: 3,58 + Actor67: fenc + Owner: USSR + Location: 5,58 + Actor68: fenc + Owner: USSR + Location: 4,58 + Actor69: fenc + Owner: USSR + Location: 6,58 + Actor70: fenc + Owner: USSR + Location: 6,59 + Actor71: ftur + Owner: USSR + Location: 48,88 + Actor72: ftur + Owner: USSR + Location: 45,85 + Actor73: ftur + Owner: USSR + Location: 58,98 + Actor74: ftur + Owner: USSR + Location: 60,103 + Actor75: ftur + Owner: USSR + Location: 35,78 + Actor76: ftur + Owner: USSR + Location: 28,76 + Actor77: fenc + Owner: USSR + Location: 27,76 + Actor78: fenc + Owner: USSR + Location: 27,77 + Actor79: fenc + Owner: USSR + Location: 27,75 + Actor80: fenc + Owner: USSR + Location: 28,75 + Actor81: fenc + Owner: USSR + Location: 28,77 + Actor82: fenc + Owner: USSR + Location: 29,77 + Actor83: fenc + Owner: USSR + Location: 34,78 + Actor84: fenc + Owner: USSR + Location: 34,79 + Actor85: fenc + Owner: USSR + Location: 35,79 + Actor86: fenc + Owner: USSR + Location: 45,86 + Actor87: fenc + Owner: USSR + Location: 44,86 + Actor88: fenc + Owner: USSR + Location: 44,85 + Actor89: fenc + Owner: USSR + Location: 47,88 + Actor90: fenc + Owner: USSR + Location: 47,87 + Actor91: fenc + Owner: USSR + Location: 48,87 + Actor92: fenc + Owner: USSR + Location: 57,98 + Actor93: fenc + Owner: USSR + Location: 57,99 + Actor94: fenc + Owner: USSR + Location: 58,99 + Actor95: fenc + Owner: USSR + Location: 60,102 + Actor96: fenc + Owner: USSR + Location: 59,102 + Actor97: fenc + Owner: USSR + Location: 59,103 + Actor111: fenc + Owner: USSR + Location: 68,97 + Actor112: fenc + Owner: USSR + Location: 69,97 + Actor114: fenc + Owner: USSR + Location: 70,97 + Actor115: fenc + Owner: USSR + Location: 71,97 + Actor118: fenc + Owner: USSR + Location: 68,98 + ForwardSAM2: sam + Owner: USSR + Location: 69,98 + Actor120: fenc + Owner: USSR + Location: 71,98 + Actor121: fenc + Owner: USSR + Location: 68,99 + Actor122: fenc + Owner: USSR + Location: 69,99 + Actor123: fenc + Owner: USSR + Location: 70,99 + Actor124: fenc + Owner: USSR + Location: 71,99 + Actor117: fenc + Owner: USSR + Location: 28,66 + Actor125: fenc + Owner: USSR + Location: 29,66 + Actor126: fenc + Owner: USSR + Location: 30,66 + Actor127: fenc + Owner: USSR + Location: 31,66 + Actor128: fenc + Owner: USSR + Location: 28,67 + ForwardSAM5: sam + Owner: USSR + Location: 29,67 + Actor130: fenc + Owner: USSR + Location: 31,67 + Actor131: fenc + Owner: USSR + Location: 28,68 + Actor132: fenc + Owner: USSR + Location: 29,68 + Actor133: fenc + Owner: USSR + Location: 30,68 + Actor134: fenc + Owner: USSR + Location: 31,68 + Actor163: brik + Owner: USSR + Location: 99,94 + Actor164: brik + Owner: USSR + Location: 100,94 + Actor165: brik + Owner: USSR + Location: 101,94 + Actor166: brik + Owner: USSR + Location: 101,95 + Actor167: brik + Owner: USSR + Location: 101,96 + Actor168: brik + Owner: USSR + Location: 101,97 + Actor169: brik + Owner: USSR + Location: 101,98 + Actor170: brik + Owner: USSR + Location: 100,98 + Actor171: brik + Owner: USSR + Location: 100,97 + Actor172: brik + Owner: USSR + Location: 100,104 + Actor173: brik + Owner: USSR + Location: 101,104 + Actor174: brik + Owner: USSR + Location: 100,105 + Actor175: brik + Owner: USSR + Location: 101,105 + Actor176: brik + Owner: USSR + Location: 101,106 + Actor177: brik + Owner: USSR + Location: 101,107 + Actor178: brik + Owner: USSR + Location: 100,108 + Actor179: brik + Owner: USSR + Location: 101,108 + Actor180: brik + Owner: USSR + Location: 99,108 + Actor151: brik + Owner: USSR + Location: 84,94 + Actor152: brik + Owner: USSR + Location: 85,94 + Actor153: brik + Owner: USSR + Location: 86,94 + Actor154: brik + Owner: USSR + Location: 87,94 + Actor155: brik + Owner: USSR + Location: 88,94 + Actor156: brik + Owner: USSR + Location: 89,94 + Actor157: brik + Owner: USSR + Location: 90,94 + Actor158: brik + Owner: USSR + Location: 91,94 + Actor159: brik + Owner: USSR + Location: 92,94 + Actor160: brik + Owner: USSR + Location: 93,94 + Actor161: brik + Owner: USSR + Location: 94,94 + Actor162: brik + Owner: USSR + Location: 95,94 + Actor181: brik + Owner: USSR + Location: 96,94 + Actor182: brik + Owner: USSR + Location: 97,94 + Actor183: brik + Owner: USSR + Location: 98,94 + Actor184: brik + Owner: USSR + Location: 84,95 + Actor185: brik + Owner: USSR + Location: 84,96 + Actor186: brik + Owner: USSR + Location: 84,97 + Actor187: brik + Owner: USSR + Location: 85,97 + Actor203: brik + Owner: USSR + Location: 84,98 + Actor204: brik + Owner: USSR + Location: 85,98 + Actor227: brik + Owner: USSR + Location: 84,104 + Actor228: brik + Owner: USSR + Location: 85,104 + Actor231: brik + Owner: USSR + Location: 84,105 + Actor232: brik + Owner: USSR + Location: 85,105 + Actor235: brik + Owner: USSR + Location: 84,106 + Actor248: brik + Owner: USSR + Location: 84,107 + Actor249: brik + Owner: USSR + Location: 84,108 + Actor250: brik + Owner: USSR + Location: 85,108 + Actor251: brik + Owner: USSR + Location: 86,108 + Actor252: brik + Owner: USSR + Location: 87,108 + Actor253: brik + Owner: USSR + Location: 88,108 + Actor254: brik + Owner: USSR + Location: 89,108 + Actor255: brik + Owner: USSR + Location: 90,108 + Actor256: brik + Owner: USSR + Location: 91,108 + Actor257: brik + Owner: USSR + Location: 92,108 + Actor258: brik + Owner: USSR + Location: 93,108 + Actor259: brik + Owner: USSR + Location: 94,108 + Actor260: brik + Owner: USSR + Location: 95,108 + Actor261: brik + Owner: USSR + Location: 96,108 + Actor262: brik + Owner: USSR + Location: 97,108 + Actor263: brik + Owner: USSR + Location: 98,108 + Actor189: chain + Owner: USSR + Location: 87,96 + Actor190: chain + Owner: USSR + Location: 88,96 + Actor191: chain + Owner: USSR + Location: 89,96 + Actor192: chain + Owner: USSR + Location: 90,96 + Actor193: chain + Owner: USSR + Location: 91,96 + Actor194: chain + Owner: USSR + Location: 92,96 + Actor195: chain + Owner: USSR + Location: 93,96 + Actor196: chain + Owner: USSR + Location: 94,96 + Actor197: chain + Owner: USSR + Location: 95,96 + Actor200: chain + Owner: USSR + Location: 96,96 + Actor201: chain + Owner: USSR + Location: 97,96 + Actor205: chain + Owner: USSR + Location: 98,96 + Actor206: chain + Owner: USSR + Location: 87,97 + Actor207: chain + Owner: USSR + Location: 98,97 + Actor208: chain + Owner: USSR + Location: 87,98 + AtomicPower1: npwr + Owner: USSR + Location: 88,98 + AtomicPower2: npwr + Owner: USSR + Location: 94,98 + Actor211: chain + Owner: USSR + Location: 98,98 + Actor212: chain + Owner: USSR + Location: 87,99 + Actor213: chain + Owner: USSR + Location: 98,99 + Actor214: chain + Owner: USSR + Location: 87,100 + Actor215: chain + Owner: USSR + Location: 98,100 + Actor216: chain + Owner: USSR + Location: 87,101 + Actor217: chain + Owner: USSR + Location: 88,101 + Actor218: chain + Owner: USSR + Location: 89,101 + Actor219: chain + Owner: USSR + Location: 90,101 + Actor220: chain + Owner: USSR + Location: 95,101 + Actor221: chain + Owner: USSR + Location: 96,101 + Actor222: chain + Owner: USSR + Location: 97,101 + Actor223: chain + Owner: USSR + Location: 98,101 + Actor224: chain + Owner: USSR + Location: 90,102 + AtomicPower3: npwr + Owner: USSR + Location: 91,102 + Actor229: chain + Owner: USSR + Location: 95,102 + Actor230: chain + Owner: USSR + Location: 90,103 + Actor233: chain + Owner: USSR + Location: 95,103 + Actor234: chain + Owner: USSR + Location: 90,104 + Actor236: chain + Owner: USSR + Location: 95,104 + Actor237: chain + Owner: USSR + Location: 90,105 + Actor238: chain + Owner: USSR + Location: 91,105 + Actor239: chain + Owner: USSR + Location: 92,105 + Actor240: chain + Owner: USSR + Location: 93,105 + Actor241: chain + Owner: USSR + Location: 94,105 + Actor242: chain + Owner: USSR + Location: 95,105 + TeslaCoil3: tsla + Owner: USSR + Location: 100,101 + IslandAirfield4: afld + Owner: USSR + Location: 70,58 + IslandAirfield1: afld + Owner: USSR + Location: 58,49 + IslandAirfield5: afld + Owner: USSR + Location: 70,61 + Actor355: fix + Owner: USSR + Location: 58,52 + IslandSAM1: sam + Owner: USSR + Location: 55,51 + IslandSAM2: sam + Owner: USSR + Location: 60,59 + IslandSAM3: sam + Owner: USSR + Location: 69,65 + Actor362: ftur + Owner: USSR + Location: 63,61 + TeslaCoil5: tsla + Owner: USSR + Location: 68,63 + TeslaCoil4: tsla + Owner: USSR + Location: 58,56 + Actor360: fenc + Owner: USSR + Location: 67,63 + Actor361: fenc + Owner: USSR + Location: 67,64 + Actor365: fenc + Owner: USSR + Location: 68,64 + Actor366: fenc + Owner: USSR + Location: 69,64 + Actor367: fenc + Owner: USSR + Location: 70,64 + Actor368: fenc + Owner: USSR + Location: 68,65 + Actor370: fenc + Owner: USSR + Location: 57,56 + Actor371: fenc + Owner: USSR + Location: 57,57 + Actor372: fenc + Owner: USSR + Location: 58,57 + Actor373: fenc + Owner: USSR + Location: 56,56 + Actor374: fenc + Owner: USSR + Location: 59,57 + Actor375: fenc + Owner: USSR + Location: 55,52 + Actor376: fenc + Owner: USSR + Location: 55,53 + Actor377: fenc + Owner: USSR + Location: 55,54 + Actor378: fenc + Owner: USSR + Location: 56,54 + Actor379: fenc + Owner: USSR + Location: 56,55 + Actor380: fenc + Owner: USSR + Location: 66,63 + Actor381: fenc + Owner: USSR + Location: 65,62 + Actor382: fenc + Owner: USSR + Location: 66,62 + Actor369: fix + Owner: USSR + Location: 65,58 + Actor356: hpad + Owner: USSR + Location: 61,55 + Actor383: brik + Owner: USSR + Location: 25,17 + Actor384: brik + Owner: USSR + Location: 25,16 + Actor385: brik + Owner: USSR + Location: 26,16 + Actor386: brik + Owner: USSR + Location: 26,17 + Actor387: brik + Owner: USSR + Location: 24,17 + Actor388: brik + Owner: USSR + Location: 23,17 + Actor389: brik + Owner: USSR + Location: 22,17 + Actor390: brik + Owner: USSR + Location: 22,16 + Actor391: brik + Owner: USSR + Location: 23,16 + Actor392: brik + Owner: USSR + Location: 30,16 + Actor393: brik + Owner: USSR + Location: 30,17 + Actor394: brik + Owner: USSR + Location: 31,16 + Actor395: brik + Owner: USSR + Location: 31,17 + Actor396: brik + Owner: USSR + Location: 32,17 + Actor397: brik + Owner: USSR + Location: 33,17 + Actor398: brik + Owner: USSR + Location: 33,16 + Actor399: brik + Owner: USSR + Location: 34,16 + Actor400: brik + Owner: USSR + Location: 34,17 + Actor401: apoc + Owner: USSRUnmanned + Location: 23,4 + Facing: 512 + Stance: HoldFire + Actor402: apoc + Owner: USSRUnmanned + Location: 25,4 + Facing: 512 + Stance: HoldFire + Actor403: apoc + Owner: USSRUnmanned + Location: 27,4 + Facing: 512 + Stance: HoldFire + Actor404: 4tnk + Owner: USSRUnmanned + Location: 29,5 + Facing: 512 + Stance: HoldFire + Actor405: 4tnk + Owner: USSRUnmanned + Location: 31,5 + Facing: 512 + Stance: HoldFire + Actor406: 4tnk + Owner: USSRUnmanned + Location: 33,5 + Facing: 512 + Stance: HoldFire + Actor407: 4tnk + Owner: USSRUnmanned + Location: 35,4 + Facing: 512 + Stance: HoldFire + Actor408: 4tnk + Owner: USSRUnmanned + Facing: 512 + Location: 37,4 + Stance: HoldFire + Actor409: 4tnk + Owner: USSRUnmanned + Location: 39,4 + Facing: 384 + Stance: HoldFire + Actor410: 4tnk + Owner: USSRUnmanned + Location: 41,4 + Facing: 384 + Stance: HoldFire + Actor411: 4tnk + Owner: USSRUnmanned + Location: 21,5 + Facing: 512 + Stance: HoldFire + Actor412: 4tnk + Owner: USSRUnmanned + Location: 19,5 + Facing: 512 + Stance: HoldFire + Actor413: 4tnk + Owner: USSRUnmanned + Location: 17,4 + Facing: 634 + Stance: HoldFire + Actor414: 4tnk + Owner: USSRUnmanned + Location: 15,4 + Facing: 634 + Stance: HoldFire + Actor415: 3tnk + Owner: USSRUnmanned + Location: 15,6 + Facing: 634 + Stance: HoldFire + Actor416: 3tnk + Owner: USSRUnmanned + Location: 17,6 + Facing: 634 + Stance: HoldFire + Actor417: 3tnk + Owner: USSRUnmanned + Facing: 512 + Location: 19,7 + Stance: HoldFire + Actor418: 3tnk + Owner: USSRUnmanned + Facing: 512 + Location: 21,7 + Stance: HoldFire + Actor419: 3tnk + Owner: USSRUnmanned + Facing: 512 + Location: 23,6 + Stance: HoldFire + Actor420: 3tnk + Owner: USSRUnmanned + Facing: 512 + Location: 25,6 + Stance: HoldFire + Actor421: 3tnk + Owner: USSRUnmanned + Facing: 512 + Location: 27,6 + Stance: HoldFire + Actor422: 3tnk + Owner: USSRUnmanned + Facing: 512 + Location: 29,7 + Stance: HoldFire + Actor424: 3tnk + Owner: USSRUnmanned + Facing: 512 + Location: 31,7 + Stance: HoldFire + Actor425: 3tnk + Owner: USSRUnmanned + Facing: 512 + Location: 33,7 + Stance: HoldFire + Actor423: 3tnk + Owner: USSRUnmanned + Facing: 512 + Location: 35,6 + Stance: HoldFire + Actor426: 3tnk + Owner: USSRUnmanned + Facing: 512 + Location: 37,6 + Stance: HoldFire + Actor427: 3tnk + Owner: USSRUnmanned + Location: 39,6 + Facing: 384 + Stance: HoldFire + Actor428: 3tnk + Owner: USSRUnmanned + Location: 41,6 + Facing: 384 + Stance: HoldFire + Actor439: btr + Owner: USSRUnmanned + Location: 15,8 + Facing: 634 + Stance: HoldFire + Actor440: btr + Owner: USSRUnmanned + Location: 15,10 + Facing: 634 + Stance: HoldFire + Actor441: btr + Owner: USSRUnmanned + Location: 15,12 + Facing: 634 + Stance: HoldFire + Actor442: ttra + Owner: USSRUnmanned + Facing: 384 + Location: 43,6 + Stance: HoldFire + Actor443: ttra + Owner: USSRUnmanned + Facing: 384 + Location: 43,8 + Stance: HoldFire + Actor444: ttra + Owner: USSRUnmanned + Facing: 384 + Location: 43,10 + Stance: HoldFire + Actor445: ttra + Owner: USSRUnmanned + Facing: 384 + Location: 43,12 + Stance: HoldFire + Actor429: ttra + Owner: USSRUnmanned + Facing: 384 + Location: 41,8 + Stance: HoldFire + Actor430: ttra + Owner: USSRUnmanned + Facing: 384 + Location: 41,10 + Stance: HoldFire + Actor431: ttra + Owner: USSRUnmanned + Facing: 384 + Location: 41,12 + Stance: HoldFire + Actor432: 3tnk + Owner: USSRUnmanned + Facing: 512 + Location: 23,8 + Stance: HoldFire + Actor433: 3tnk + Owner: USSRUnmanned + Facing: 512 + Location: 25,8 + Stance: HoldFire + Actor434: 3tnk + Owner: USSRUnmanned + Facing: 512 + Location: 27,8 + Stance: HoldFire + Actor446: 3tnk + Owner: USSRUnmanned + Facing: 512 + Location: 35,8 + Stance: HoldFire + Actor447: 3tnk + Owner: USSRUnmanned + Facing: 512 + Location: 37,8 + Stance: HoldFire + Actor448: btr + Owner: USSRUnmanned + Facing: 634 + Location: 17,8 + Stance: HoldFire + Actor449: btr + Owner: USSRUnmanned + Facing: 634 + Location: 17,10 + Stance: HoldFire + Actor450: btr + Owner: USSRUnmanned + Facing: 634 + Location: 17,12 + Stance: HoldFire + Actor451: btr + Owner: USSRUnmanned + Location: 19,9 + Facing: 512 + Stance: HoldFire + Actor452: btr + Owner: USSRUnmanned + Facing: 512 + Location: 21,9 + Stance: HoldFire + Actor453: btr + Owner: USSRUnmanned + Facing: 512 + Location: 19,11 + Stance: HoldFire + Actor454: btr + Owner: USSRUnmanned + Facing: 512 + Location: 21,11 + Stance: HoldFire + Actor455: btr + Owner: USSRUnmanned + Facing: 512 + Location: 23,10 + Stance: HoldFire + Actor456: btr + Owner: USSRUnmanned + Facing: 512 + Location: 25,10 + Stance: HoldFire + Actor459: btr + Owner: USSRUnmanned + Location: 35,10 + Facing: 512 + Stance: HoldFire + Actor460: btr + Owner: USSRUnmanned + Facing: 512 + Location: 37,10 + Stance: HoldFire + Actor437: ttnk + Owner: USSRUnmanned + Facing: 512 + Location: 35,12 + Stance: HoldFire + Actor438: ttnk + Owner: USSRUnmanned + Facing: 512 + Location: 37,12 + Stance: HoldFire + Actor461: ttnk + Owner: USSRUnmanned + Facing: 512 + Location: 19,13 + Stance: HoldFire + Actor462: ttnk + Owner: USSRUnmanned + Facing: 512 + Location: 21,13 + Stance: HoldFire + Actor435: btr + Owner: USSRUnmanned + Facing: 512 + Location: 27,10 + Stance: HoldFire + Actor436: btr + Owner: USSRUnmanned + Facing: 512 + Location: 29,9 + Stance: HoldFire + Actor457: btr + Owner: USSRUnmanned + Facing: 512 + Location: 31,9 + Stance: HoldFire + Actor458: btr + Owner: USSRUnmanned + Facing: 512 + Location: 33,9 + Stance: HoldFire + Actor463: btr + Owner: USSRUnmanned + Facing: 512 + Location: 30,11 + Stance: HoldFire + Actor464: btr + Owner: USSRUnmanned + Facing: 512 + Location: 32,11 + Stance: HoldFire + Actor465: 3tnk + Owner: USSRUnmanned + Facing: 384 + Location: 39,8 + Stance: HoldFire + Actor466: 3tnk + Owner: USSRUnmanned + Facing: 384 + Location: 39,10 + Stance: HoldFire + Actor467: ttra + Owner: USSRUnmanned + Facing: 384 + Location: 39,12 + Stance: HoldFire + TeslaCoil23: tsla + Owner: USSR + Location: 24,16 + TeslaCoil22: tsla + Owner: USSR + Location: 32,16 + Actor470: ftur + Owner: USSR + Location: 26,18 + Actor471: ftur + Owner: USSR + Location: 30,18 + Actor473: brik + Owner: USSR + Location: 49,1 + Actor474: brik + Owner: USSR + Location: 49,2 + Actor475: brik + Owner: USSR + Location: 49,3 + Actor476: brik + Owner: USSR + Location: 50,1 + Actor477: brik + Owner: USSR + Location: 50,2 + Actor478: brik + Owner: USSR + Location: 50,3 + Actor479: brik + Owner: USSR + Location: 50,4 + Actor480: brik + Owner: USSR + Location: 50,5 + Actor481: brik + Owner: USSR + Location: 50,6 + Actor482: brik + Owner: USSR + Location: 50,7 + Actor483: brik + Owner: USSR + Location: 51,7 + Actor484: brik + Owner: USSR + Location: 51,6 + Actor485: brik + Owner: USSR + Location: 52,7 + Actor486: brik + Owner: USSR + Location: 53,7 + Actor487: brik + Owner: USSR + Location: 53,6 + Actor488: brik + Owner: USSR + Location: 54,6 + Actor489: brik + Owner: USSR + Location: 54,7 + Actor490: brik + Owner: USSR + Location: 50,12 + Actor491: brik + Owner: USSR + Location: 50,13 + Actor492: brik + Owner: USSR + Location: 50,14 + Actor493: brik + Owner: USSR + Location: 50,15 + Actor494: brik + Owner: USSR + Location: 51,15 + Actor495: brik + Owner: USSR + Location: 53,15 + Actor496: brik + Owner: USSR + Location: 52,15 + Actor497: brik + Owner: USSR + Location: 54,15 + Actor498: brik + Owner: USSR + Location: 51,12 + Actor499: brik + Owner: USSR + Location: 51,13 + Actor500: brik + Owner: USSR + Location: 52,12 + Actor501: brik + Owner: USSR + Location: 53,12 + Actor502: brik + Owner: USSR + Location: 54,12 + Actor503: brik + Owner: USSR + Location: 53,13 + Actor504: brik + Owner: USSR + Location: 54,13 + Actor506: brik + Owner: USSR + Location: 55,15 + Actor507: brik + Owner: USSR + Location: 55,16 + Actor508: brik + Owner: USSR + Location: 55,17 + Actor509: brik + Owner: USSR + Location: 56,16 + Actor510: brik + Owner: USSR + Location: 56,17 + Actor505: brik + Owner: USSR + Location: 57,17 + Actor511: brik + Owner: USSR + Location: 58,17 + Actor512: brik + Owner: USSR + Location: 58,16 + Actor513: brik + Owner: USSR + Location: 59,16 + Actor514: brik + Owner: USSR + Location: 59,17 + Actor515: brik + Owner: USSR + Location: 63,16 + Actor516: brik + Owner: USSR + Location: 63,17 + Actor517: brik + Owner: USSR + Location: 64,16 + Actor518: brik + Owner: USSR + Location: 64,17 + Actor519: brik + Owner: USSR + Location: 65,17 + Actor520: brik + Owner: USSR + Location: 66,17 + Actor521: brik + Owner: USSR + Location: 66,16 + Actor522: brik + Owner: USSR + Location: 67,16 + Actor523: brik + Owner: USSR + Location: 67,17 + Actor524: brik + Owner: USSR + Location: 68,17 + Actor525: brik + Owner: USSR + Location: 69,17 + Actor526: brik + Owner: USSR + Location: 70,17 + Actor527: brik + Owner: USSR + Location: 71,17 + Actor528: brik + Owner: USSR + Location: 72,17 + Actor529: brik + Owner: USSR + Location: 72,16 + Actor530: brik + Owner: USSR + Location: 69,16 + Actor531: brik + Owner: USSR + Location: 70,16 + Actor532: brik + Owner: USSR + Location: 73,16 + Actor533: brik + Owner: USSR + Location: 73,17 + Actor549: brik + Owner: USSR + Location: 51,1 + Actor550: brik + Owner: USSR + Location: 53,1 + Actor551: brik + Owner: USSR + Location: 54,1 + Actor552: brik + Owner: USSR + Location: 52,1 + Actor553: brik + Owner: USSR + Location: 55,1 + Actor554: brik + Owner: USSR + Location: 56,1 + Actor555: brik + Owner: USSR + Location: 57,1 + Actor556: brik + Owner: USSR + Location: 58,1 + Actor557: brik + Owner: USSR + Location: 59,1 + Actor558: brik + Owner: USSR + Location: 60,1 + Actor559: brik + Owner: USSR + Location: 61,1 + Actor560: brik + Owner: USSR + Location: 63,1 + Actor561: brik + Owner: USSR + Location: 62,1 + Actor562: brik + Owner: USSR + Location: 65,1 + Actor563: brik + Owner: USSR + Location: 64,1 + Actor564: brik + Owner: USSR + Location: 67,1 + Actor565: brik + Owner: USSR + Location: 66,1 + Actor566: brik + Owner: USSR + Location: 68,1 + Actor567: brik + Owner: USSR + Location: 70,1 + Actor568: brik + Owner: USSR + Location: 71,1 + Actor569: brik + Owner: USSR + Location: 72,1 + Actor570: brik + Owner: USSR + Location: 69,1 + Factory1: weap + Owner: USSR + Location: 56,2 + Factory2: weap + Owner: USSR + Location: 60,2 + Factory3: weap + Owner: USSR + Location: 64,2 + Factory4: weap + Owner: USSR + Location: 68,2 + Actor548: brik + Owner: USSR + Location: 73,1 + Factory5: weap + Owner: USSR + Location: 72,2 + Actor535: brik + Owner: USSR + Location: 74,1 + Actor536: brik + Owner: USSR + Location: 75,1 + Actor541: brik + Owner: USSR + Location: 75,6 + Actor542: brik + Owner: USSR + Location: 75,7 + Actor543: brik + Owner: USSR + Location: 75,8 + Actor544: brik + Owner: USSR + Location: 75,10 + Actor545: brik + Owner: USSR + Location: 75,9 + Actor546: brik + Owner: USSR + Location: 75,11 + Actor547: brik + Owner: USSR + Location: 75,12 + Actor571: brik + Owner: USSR + Location: 75,14 + Actor572: brik + Owner: USSR + Location: 75,13 + Actor573: brik + Owner: USSR + Location: 75,15 + Actor574: brik + Owner: USSR + Location: 75,16 + Actor579: brik + Owner: USSR + Location: 75,17 + Actor580: brik + Owner: USSR + Location: 74,17 + TeslaCoil15: tsla + Owner: USSR + Location: 65,16 + TeslaCoil14: tsla + Owner: USSR + Location: 68,16 + TeslaCoil13: tsla + Owner: USSR + Location: 71,16 + TeslaCoil12: tsla + Owner: USSR + Location: 74,16 + TeslaCoil17: tsla + Owner: USSR + Location: 57,16 + TeslaCoil19: tsla + Owner: USSR + Location: 52,6 + TeslaCoil18: tsla + Owner: USSR + Location: 52,13 + Actor586: ftur + Owner: USSR + Location: 59,18 + Actor587: ftur + Owner: USSR + Location: 63,18 + TeslaCoil24: tsla + Owner: USSR + Location: 21,15 + TeslaCoil21: tsla + Owner: USSR + Location: 35,15 + TeslaCoil25: tsla + Owner: USSR + Location: 18,15 + TeslaCoil20: tsla + Owner: USSR + Location: 38,16 + Actor594: sam + Owner: USSR + Location: 51,14 + Actor595: sam + Owner: USSR + Location: 53,14 + Actor596: sam + Owner: USSR + Location: 69,15 + Actor597: sam + Owner: USSR + Location: 66,15 + Actor598: sam + Owner: USSR + Location: 72,15 + Actor601: indp + Owner: USSR + Location: 70,7 + Actor602: stek + Owner: USSR + Location: 51,2 + Actor603: brik + Owner: USSR + Location: 54,2 + Actor604: brik + Owner: USSR + Location: 55,2 + Barracks2: barr + Owner: USSR + Location: 72,11 + Barracks1: barr + Owner: USSR + Location: 69,11 + TeslaCoil16: tsla + Owner: USSR + Location: 61,15 + Actor599: fix + Owner: USSR + Location: 63,7 + Actor600: fix + Owner: USSR + Location: 63,10 + Actor608: silo + Owner: USSR + Location: 56,12 + Actor609: silo + Owner: USSR + Location: 58,12 + Actor610: silo + Owner: USSR + Location: 57,13 + Actor611: silo + Owner: USSR + Location: 59,13 + Actor613: silo + Owner: USSR + Location: 74,7 + Actor614: silo + Owner: USSR + Location: 74,8 + Actor615: silo + Owner: USSR + Location: 74,9 + Actor612: ftur + Owner: USSR + Location: 59,8 + Actor616: brik + Owner: USSR + Location: 86,28 + Actor617: brik + Owner: USSR + Location: 86,29 + Actor618: brik + Owner: USSR + Location: 86,30 + Actor619: brik + Owner: USSR + Location: 86,32 + Actor620: brik + Owner: USSR + Location: 86,31 + Actor621: brik + Owner: USSR + Location: 86,33 + Actor622: brik + Owner: USSR + Location: 87,33 + Actor623: brik + Owner: USSR + Location: 87,32 + Actor624: brik + Owner: USSR + Location: 86,27 + Actor625: brik + Owner: USSR + Location: 87,27 + Actor626: brik + Owner: USSR + Location: 88,27 + Actor627: brik + Owner: USSR + Location: 89,27 + Actor628: brik + Owner: USSR + Location: 90,27 + Actor629: brik + Owner: USSR + Location: 92,27 + Actor630: brik + Owner: USSR + Location: 91,27 + Actor631: brik + Owner: USSR + Location: 93,27 + Actor632: brik + Owner: USSR + Location: 94,27 + Actor633: brik + Owner: USSR + Location: 95,27 + Actor634: brik + Owner: USSR + Location: 95,28 + Actor635: brik + Owner: USSR + Location: 94,28 + Actor636: brik + Owner: USSR + Location: 99,27 + Actor637: brik + Owner: USSR + Location: 99,28 + Actor638: brik + Owner: USSR + Location: 100,27 + Actor639: brik + Owner: USSR + Location: 100,28 + Actor640: brik + Owner: USSR + Location: 101,27 + Actor641: brik + Owner: USSR + Location: 102,27 + Actor642: brik + Owner: USSR + Location: 103,27 + Actor643: brik + Owner: USSR + Location: 105,27 + Actor644: brik + Owner: USSR + Location: 104,27 + Actor645: brik + Owner: USSR + Location: 106,27 + Actor655: brik + Owner: USSR + Location: 86,37 + Actor656: brik + Owner: USSR + Location: 87,37 + Actor657: brik + Owner: USSR + Location: 86,38 + Actor658: brik + Owner: USSR + Location: 87,38 + Actor659: brik + Owner: USSR + Location: 86,39 + Actor660: brik + Owner: USSR + Location: 86,39 + Actor661: brik + Owner: USSR + Location: 86,40 + Actor662: brik + Owner: USSR + Location: 86,40 + Actor663: brik + Owner: USSR + Location: 86,41 + Actor664: brik + Owner: USSR + Location: 86,42 + Actor665: brik + Owner: USSR + Location: 86,43 + Actor666: brik + Owner: USSR + Location: 87,43 + Actor667: brik + Owner: USSR + Location: 88,43 + Actor668: brik + Owner: USSR + Location: 89,43 + Actor669: brik + Owner: USSR + Location: 91,43 + Actor670: brik + Owner: USSR + Location: 90,43 + Actor671: brik + Owner: USSR + Location: 92,43 + Actor672: brik + Owner: USSR + Location: 93,43 + Actor673: brik + Owner: USSR + Location: 94,43 + Actor674: brik + Owner: USSR + Location: 95,43 + Actor675: brik + Owner: USSR + Location: 95,42 + Actor676: brik + Owner: USSR + Location: 94,42 + Actor677: brik + Owner: USSR + Location: 99,42 + Actor678: brik + Owner: USSR + Location: 99,43 + Actor679: brik + Owner: USSR + Location: 100,42 + Actor680: brik + Owner: USSR + Location: 100,43 + Actor681: brik + Owner: USSR + Location: 101,43 + Actor682: brik + Owner: USSR + Location: 102,43 + Actor683: brik + Owner: USSR + Location: 103,43 + Actor684: brik + Owner: USSR + Location: 104,43 + Actor685: brik + Owner: USSR + Location: 105,43 + Actor686: brik + Owner: USSR + Location: 106,43 + TeslaCoil8: tsla + Owner: USSR + Location: 87,39 + TeslaCoil9: tsla + Owner: USSR + Location: 87,31 + TeslaCoil6: tsla + Owner: USSR + Location: 93,42 + TeslaCoil7: tsla + Owner: USSR + Location: 101,42 + Actor700: ftur + Owner: USSR + Location: 95,44 + Actor701: ftur + Owner: USSR + Location: 99,44 + Actor702: ftur + Owner: USSR + Location: 85,37 + Actor703: ftur + Owner: USSR + Location: 85,33 + Actor704: sam + Owner: USSR + Location: 87,42 + Actor705: sam + Owner: USSR + Location: 87,28 + MainFactory: weap + Owner: USSR + Location: 90,30 + MainBarracks: barr + Owner: USSR + Location: 90,37 + Actor710: proc + Owner: USSR + Location: 100,36 + Actor687: brik + Owner: USSR + Location: 107,43 + Actor688: brik + Owner: USSR + Location: 107,42 + Actor689: brik + Owner: USSR + Location: 106,42 + Actor690: brik + Owner: USSR + Location: 105,42 + Actor691: brik + Owner: USSR + Location: 106,28 + Actor692: brik + Owner: USSR + Location: 105,28 + Actor695: sam + Owner: USSR + Location: 103,42 + Actor693: brik + Owner: USSR + Location: 107,27 + Actor694: brik + Owner: USSR + Location: 107,28 + Actor706: sam + Owner: USSR + Location: 103,28 + Actor707: fact + Owner: USSR + Location: 106,36 + Actor711: stek + Owner: USSR + Location: 106,32 + SovietRadar: dome + Owner: USSR + Location: 103,31 + Actor713: proc + Owner: USSR + Location: 99,30 + Actor714: silo + Owner: USSR + Location: 99,30 + Actor715: silo + Owner: USSR + Location: 101,30 + Actor716: silo + Owner: USSR + Location: 100,36 + Actor717: silo + Owner: USSR + Location: 102,36 + Actor719: tc02 + Owner: Neutral + Faction: russia + Location: 1,50 + Actor720: tc01 + Owner: Neutral + Faction: russia + Location: 3,56 + Actor721: t17 + Owner: Neutral + Faction: russia + Location: 4,54 + Actor722: t15 + Owner: Neutral + Faction: russia + Location: 1,52 + Actor723: tc05 + Owner: Neutral + Faction: russia + Location: 0,41 + Actor725: t11 + Owner: Neutral + Faction: russia + Location: 2,46 + Actor724: t06 + Owner: Neutral + Faction: russia + Location: 1,48 + Actor727: t13 + Owner: Neutral + Faction: russia + Location: 21,44 + Actor728: tc05 + Owner: Neutral + Faction: russia + Location: 32,52 + Actor729: t16 + Owner: Neutral + Faction: russia + Location: 11,9 + Actor730: tc02 + Owner: Neutral + Faction: russia + Location: 10,7 + Actor731: t03 + Owner: Neutral + Faction: russia + Location: 10,9 + Actor732: t02 + Owner: Neutral + Faction: russia + Location: 11,5 + Actor733: t07 + Owner: Neutral + Faction: russia + Location: 8,11 + Actor734: tc04 + Owner: Neutral + Faction: russia + Location: 15,16 + Actor735: tc01 + Owner: Neutral + Faction: russia + Location: 9,16 + Actor736: t17 + Owner: Neutral + Faction: russia + Location: 11,16 + Actor737: t11 + Owner: Neutral + Faction: russia + Location: 18,17 + Actor738: t13 + Owner: Neutral + Faction: russia + Location: 6,18 + Actor739: t14 + Owner: Neutral + Faction: russia + Location: 1,18 + Actor746: tc04 + Owner: Neutral + Faction: russia + Location: 1,12 + Actor747: tc02 + Owner: Neutral + Faction: russia + Location: 4,15 + Actor748: tc03 + Owner: Neutral + Faction: russia + Location: 6,14 + Actor749: tc05 + Owner: Neutral + Faction: russia + Location: 5,8 + Actor750: t06 + Owner: Neutral + Faction: russia + Location: 7,12 + Actor751: t13 + Owner: Neutral + Faction: russia + Location: 4,13 + Actor752: t15 + Owner: Neutral + Faction: russia + Location: 5,11 + Actor753: t17 + Owner: Neutral + Faction: russia + Location: 3,11 + Actor754: t12 + Owner: Neutral + Faction: russia + Location: 4,10 + Actor755: t03 + Owner: Neutral + Faction: russia + Location: 3,8 + Actor756: t13 + Owner: Neutral + Faction: russia + Location: 2,10 + Actor757: tc01 + Owner: Neutral + Faction: russia + Location: 1,8 + Actor758: tc02 + Owner: Neutral + Faction: russia + Location: 2,7 + Actor760: tc03 + Owner: Neutral + Faction: russia + Location: 1,5 + Actor761: tc04 + Owner: Neutral + Faction: russia + Location: 6,4 + Actor762: t15 + Owner: Neutral + Faction: russia + Location: 4,6 + Actor763: t13 + Owner: Neutral + Faction: russia + Location: 7,2 + Actor759: tc05 + Owner: Neutral + Faction: russia + Location: 1,1 + Actor764: t03 + Owner: Neutral + Faction: russia + Location: 3,5 + Actor765: t17 + Owner: Neutral + Faction: russia + Location: 5,5 + Actor766: t14 + Owner: Neutral + Faction: russia + Location: 3,4 + Actor767: tc01 + Owner: Neutral + Faction: russia + Location: 5,2 + Actor768: t02 + Owner: Neutral + Faction: russia + Location: 6,1 + Actor769: t01 + Owner: Neutral + Faction: russia + Location: 4,3 + Actor770: t03 + Owner: Neutral + Faction: russia + Location: 1,3 + Actor771: t12 + Owner: Neutral + Faction: russia + Location: 5,1 + Actor772: t12 + Owner: Neutral + Faction: russia + Location: 10,1 + Actor773: apoc + Owner: USSR + Location: 28,18 + Facing: 512 + TeslaCoil10: tsla + Owner: USSR + Location: 93,28 + TeslaCoil11: tsla + Owner: USSR + Location: 101,28 + ShoreHeavyTank1: 3tnk + Owner: USSR + Location: 22,89 + Facing: 384 + ShoreHeavyTank2: 3tnk + Owner: USSR + Location: 24,87 + Facing: 384 + ShoreInf2: e1 + Owner: USSR + SubCell: 3 + Location: 22,88 + Facing: 384 + ShoreInf1: e1 + Owner: USSR + Location: 24,86 + SubCell: 3 + Facing: 384 + ShoreInf3: e1 + Owner: USSR + SubCell: 3 + Location: 23,90 + Facing: 384 + ShoreInf4: e2 + Owner: USSR + SubCell: 3 + Location: 24,89 + Facing: 384 + Actor782: tc04 + Owner: Neutral + Location: 110,20 + Actor783: t12 + Owner: Neutral + Location: 110,24 + Actor784: tc01 + Owner: Neutral + Location: 111,26 + Actor785: tc01 + Owner: Neutral + Location: 111,26 + Actor786: t13 + Owner: Neutral + Location: 112,28 + Actor787: t07 + Owner: Neutral + Location: 110,17 + Actor788: t11 + Owner: Neutral + Location: 111,18 + Actor789: t03 + Owner: Neutral + Location: 111,13 + Actor790: t06 + Owner: Neutral + Location: 111,16 + Actor791: t02 + Owner: Neutral + Location: 112,12 + Actor792: t10 + Owner: Neutral + Location: 110,15 + Actor793: t16 + Owner: Neutral + Location: 111,23 + Actor794: t14 + Owner: Neutral + Location: 110,30 + Actor795: spen + Owner: USSR + Location: 101,11 + Actor796: spen + Owner: USSR + Location: 95,9 + Actor797: sam + Owner: USSR + Location: 99,15 + Actor798: sam + Owner: USSR + Location: 94,13 + Actor799: split2 + Owner: Neutral + Location: 102,23 + Actor800: split2 + Owner: Neutral + Location: 91,24 + Actor801: split2 + Owner: Neutral + Location: 103,47 + Actor802: ftur + Owner: USSR + Location: 18,95 + Actor803: ftur + Owner: USSR + Location: 10,92 + Actor804: fenc + Owner: USSR + Location: 9,92 + Actor805: fenc + Owner: USSR + Location: 9,93 + Actor806: fenc + Owner: USSR + Location: 10,93 + Actor807: fenc + Owner: USSR + Location: 11,93 + Actor808: fenc + Owner: USSR + Location: 11,92 + Actor809: fenc + Owner: USSR + Location: 9,91 + Actor810: fenc + Owner: USSR + Location: 17,95 + Actor811: fenc + Owner: USSR + Location: 17,96 + Actor812: fenc + Owner: USSR + Location: 17,94 + Actor813: fenc + Owner: USSR + Location: 18,96 + Actor814: fenc + Owner: USSR + Location: 19,96 + Actor815: fenc + Owner: USSR + Location: 19,95 + Actor816: fenc + Owner: USSR + Location: 16,94 + Actor817: fenc + Owner: USSR + Location: 12,93 + Actor818: fenc + Owner: USSR + Location: 8,92 + Actor819: fenc + Owner: USSR + Location: 20,95 + Actor820: fenc + Owner: USSR + Location: 23,96 + Actor821: fenc + Owner: USSR + Location: 24,96 + Actor822: fenc + Owner: USSR + Location: 25,96 + Actor823: fenc + Owner: USSR + Location: 23,95 + Actor824: fenc + Owner: USSR + Location: 5,90 + Actor825: fenc + Owner: USSR + Location: 5,91 + Actor826: fenc + Owner: USSR + Location: 4,91 + Actor827: fenc + Owner: USSR + Location: 3,91 + Actor828: fenc + Owner: USSR + Location: 3,90 + Actor829: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 13,93 + Actor830: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 22,95 + Actor831: e1 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 4,90 + Actor832: e1 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 6,91 + Actor833: e1 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 22,97 + Actor834: e1 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 11,90 + ScrinReinforce1Spawn: waypoint + Owner: Neutral + Location: 1,107 + ScrinReinforce2Spawn: waypoint + Owner: Neutral + Location: 7,112 + ScrinReinforce1Dest: waypoint + Owner: Neutral + Location: 6,102 + PlayerStart: waypoint + Owner: Neutral + Location: 10,104 + ScrinReinforce2Dest: waypoint + Owner: Neutral + Location: 14,106 + Actor839: seek + Owner: Scrin + Facing: 912 + Location: 16,105 + Actor837: seek + Owner: Scrin + Facing: 912 + Location: 7,100 + Shore: waypoint + Owner: Neutral + Location: 13,95 + Actor835: ftur + Owner: USSR + Location: 94,62 + Actor836: ftur + Owner: USSR + Location: 100,62 + Actor838: fenc + Owner: USSR + Location: 95,62 + Actor840: fenc + Owner: USSR + Location: 95,63 + Actor841: fenc + Owner: USSR + Location: 94,63 + Actor842: fenc + Owner: USSR + Location: 93,63 + Actor843: fenc + Owner: USSR + Location: 93,62 + Actor844: fenc + Owner: USSR + Location: 99,62 + Actor845: fenc + Owner: USSR + Location: 99,63 + Actor846: fenc + Owner: USSR + Location: 101,63 + Actor847: fenc + Owner: USSR + Location: 100,63 + Actor848: fenc + Owner: USSR + Location: 101,62 + Actor849: fenc + Owner: USSR + Location: 102,62 + Actor850: fenc + Owner: USSR + Location: 92,62 + Actor851: ftur + Owner: USSR + Location: 26,42 + Actor852: ftur + Owner: USSR + Location: 33,42 + Actor853: fenc + Owner: USSR + Location: 32,42 + Actor854: fenc + Owner: USSR + Location: 32,43 + Actor855: fenc + Owner: USSR + Location: 33,43 + Actor856: fenc + Owner: USSR + Location: 34,43 + Actor857: fenc + Owner: USSR + Location: 34,42 + Actor858: fenc + Owner: USSR + Location: 35,42 + Actor859: fenc + Owner: USSR + Location: 25,42 + Actor860: fenc + Owner: USSR + Location: 25,43 + Actor861: fenc + Owner: USSR + Location: 26,43 + Actor862: fenc + Owner: USSR + Location: 27,43 + Actor863: fenc + Owner: USSR + Location: 27,42 + Actor864: fenc + Owner: USSR + Location: 24,42 + Actor865: sbag + Owner: USSR + Location: 48,65 + Actor866: sbag + Owner: USSR + Location: 47,65 + Actor867: sbag + Owner: USSR + Location: 46,65 + Actor868: sbag + Owner: USSR + Location: 46,66 + Actor869: sbag + Owner: USSR + Location: 46,67 + Actor870: sbag + Owner: USSR + Location: 46,71 + Actor871: sbag + Owner: USSR + Location: 46,72 + Actor872: sbag + Owner: USSR + Location: 46,73 + Actor873: sbag + Owner: USSR + Location: 46,74 + Actor874: sbag + Owner: USSR + Location: 47,74 + Actor875: sbag + Owner: USSR + Location: 48,74 + Actor877: sbag + Owner: USSR + Location: 48,75 + Actor876: sbag + Owner: USSR + Location: 48,76 + Actor878: sbag + Owner: USSR + Location: 49,76 + Actor879: sbag + Owner: USSR + Location: 50,76 + Actor880: sbag + Owner: USSR + Location: 51,76 + Actor881: sbag + Owner: USSR + Location: 55,76 + Actor882: sbag + Owner: USSR + Location: 56,76 + Actor883: sbag + Owner: USSR + Location: 57,76 + Actor884: sbag + Owner: USSR + Location: 58,76 + Actor885: sbag + Owner: USSR + Location: 59,76 + Actor886: sbag + Owner: USSR + Location: 60,76 + Actor887: sbag + Owner: USSR + Location: 61,76 + Actor888: sbag + Owner: USSR + Location: 61,75 + Actor890: powr + Owner: USSR + Location: 50,66 + Actor891: powr + Owner: USSR + Location: 59,73 + Actor892: proc + Owner: USSR + Location: 50,71 + Actor895: split2 + Owner: Neutral + Location: 61,80 + Actor896: split2 + Owner: Neutral + Location: 54,82 + Actor897: silo + Owner: USSR + Location: 52,71 + Actor898: silo + Owner: USSR + Location: 50,71 + Actor899: silo + Owner: USSR + Location: 51,70 + Actor900: v2rl + Owner: USSR + Facing: 384 + Location: 88,87 + Actor901: v2rl + Owner: USSR + Facing: 384 + Location: 96,89 + Actor902: v2rl + Owner: USSR + Facing: 384 + Location: 101,76 + Actor903: katy + Owner: USSR + Facing: 384 + Location: 35,40 + Actor904: katy + Owner: USSR + Facing: 384 + Location: 101,60 + Actor905: 3tnk + Owner: USSR + Location: 97,62 + Facing: 512 + Actor906: 3tnk + Owner: USSR + Location: 29,42 + Facing: 512 + TeslaCoil2: tsla + Owner: USSR + Location: 85,101 + Actor908: tc01 + Owner: Neutral + Location: 30,27 + Actor909: t16 + Owner: Neutral + Location: 37,25 + Actor910: t12 + Owner: Neutral + Location: 46,20 + Actor911: t11 + Owner: Neutral + Location: 46,30 + Actor912: t13 + Owner: Neutral + Location: 50,24 + Actor913: t10 + Owner: Neutral + Location: 55,33 + Actor914: t11 + Owner: Neutral + Location: 74,23 + Actor915: t13 + Owner: Neutral + Location: 73,32 + Actor916: t16 + Owner: Neutral + Location: 66,32 + Actor919: t10 + Owner: Neutral + Location: 38,35 + Actor920: t03 + Owner: Neutral + Location: 40,30 + Actor922: t10 + Owner: Neutral + Location: 21,52 + Actor924: t10 + Owner: Neutral + Location: 42,62 + Actor925: t10 + Owner: Neutral + Location: 38,66 + Actor926: t03 + Owner: Neutral + Location: 89,68 + Actor927: t11 + Owner: Neutral + Location: 85,49 + Actor928: t10 + Owner: Neutral + Location: 79,42 + Actor929: t11 + Owner: Neutral + Location: 80,28 + Actor930: t03 + Owner: Neutral + Location: 81,20 + Actor931: t10 + Owner: Neutral + Location: 77,9 + Actor933: t02 + Owner: Neutral + Location: 82,11 + Actor934: t12 + Owner: Neutral + Location: 84,12 + Actor935: t13 + Owner: Neutral + Location: 76,14 + Actor937: t02 + Owner: Neutral + Location: 85,26 + Actor938: t02 + Owner: Neutral + Location: 91,52 + Actor939: t02 + Owner: Neutral + Location: 108,70 + Actor940: t13 + Owner: Neutral + Location: 104,72 + Actor941: t11 + Owner: Neutral + Location: 107,74 + Actor943: t15 + Owner: Neutral + Location: 67,92 + Actor944: t15 + Owner: Neutral + Location: 86,74 + Actor945: t15 + Owner: Neutral + Location: 40,76 + Actor946: t14 + Owner: Neutral + Location: 60,88 + Actor947: t14 + Owner: Neutral + Location: 60,108 + Actor948: t14 + Owner: Neutral + Location: 85,110 + Actor949: t14 + Owner: Neutral + Location: 85,110 + Actor950: tc01 + Owner: Neutral + Location: 94,110 + Actor951: t17 + Owner: Neutral + Location: 103,107 + Actor952: tc01 + Owner: Neutral + Location: 106,102 + Actor953: tc04 + Owner: Neutral + Location: 77,85 + Actor954: t02 + Owner: Neutral + Location: 73,83 + Actor955: t03 + Owner: Neutral + Location: 81,80 + Actor956: t01 + Owner: Neutral + Location: 85,88 + Actor958: t08 + Owner: Neutral + Location: 112,88 + Actor959: t07 + Owner: Neutral + Location: 109,83 + Actor960: t03 + Owner: Neutral + Location: 110,81 + Actor961: t11 + Owner: Neutral + Location: 98,83 + Actor962: t13 + Owner: Neutral + Location: 97,76 + Actor963: t14 + Owner: Neutral + Location: 103,67 + Actor964: t13 + Owner: Neutral + Location: 25,62 + Actor965: t10 + Owner: Neutral + Location: 38,93 + Actor966: t13 + Owner: Neutral + Location: 25,93 + Actor967: tc01 + Owner: Neutral + Location: 33,99 + Actor968: tc02 + Owner: Neutral + Location: 50,92 + Actor969: t17 + Owner: Neutral + Location: 49,93 + Actor970: t13 + Owner: Neutral + Location: 51,94 + Actor971: t01 + Owner: Neutral + Location: 37,85 + Actor972: t11 + Owner: Neutral + Location: 44,105 + Actor973: t15 + Owner: Neutral + Location: 39,110 + Actor974: t10 + Owner: Neutral + Location: 38,107 + Actor975: t12 + Owner: Neutral + Location: 37,108 + Actor976: t11 + Owner: Neutral + Location: 55,107 + Actor977: t06 + Owner: Neutral + Location: 53,104 + Actor978: t02 + Owner: Neutral + Location: 49,106 + Actor979: t16 + Owner: Neutral + Location: 48,111 + Actor980: t15 + Owner: Neutral + Location: 49,96 + Actor981: t14 + Owner: Neutral + Location: 31,84 + Actor982: t11 + Owner: Neutral + Location: 26,81 + Actor983: t02 + Owner: Neutral + Location: 18,82 + Actor984: t06 + Owner: Neutral + Location: 25,84 + Actor985: t05 + Owner: Neutral + Location: 31,91 + Actor986: t03 + Owner: Neutral + Location: 30,90 + Actor987: t10 + Owner: Neutral + Location: 2,87 + Actor988: t02 + Owner: Neutral + Location: 8,86 + Actor989: t01 + Owner: Neutral + Location: 6,76 + Actor990: t02 + Owner: Neutral + Location: 35,111 + Actor991: split2 + Owner: Neutral + Location: 38,102 + IslandAirfield2: afld + Owner: USSR + Location: 65,52 + IslandAirfield3: afld + Owner: USSR + Location: 64,55 + Actor994: tc05 + Owner: Neutral + Location: 77,36 + Actor995: tc01 + Owner: Neutral + Location: 63,39 + Actor996: tc03 + Owner: Neutral + Location: 46,28 + Actor997: ice01 + Owner: Neutral + Location: 65,24 + Actor998: ice03 + Owner: Neutral + Location: 24,36 + Actor999: t15 + Owner: Neutral + Location: 39,92 + Actor1000: t10 + Owner: Neutral + Location: 26,94 + Actor1001: t15 + Owner: Neutral + Location: 43,104 + Actor1002: t13 + Owner: Neutral + Location: 54,108 + Actor1003: t14 + Owner: Neutral + Location: 59,111 + Actor1004: t13 + Owner: Neutral + Location: 50,90 + Actor1005: t10 + Owner: Neutral + Location: 41,75 + Actor1006: t13 + Owner: Neutral + Location: 43,76 + Actor1007: t11 + Owner: Neutral + Location: 39,65 + Actor1008: t13 + Owner: Neutral + Location: 32,51 + Actor1009: t13 + Owner: Neutral + Location: 12,60 + Actor1010: t12 + Owner: Neutral + Location: 18,58 + Actor1011: t10 + Owner: Neutral + Location: 22,59 + Actor1012: t17 + Owner: Neutral + Location: 39,94 + Actor1013: t03 + Owner: Neutral + Location: 1,89 + Actor1014: t13 + Owner: Neutral + Location: 40,67 + Actor1015: t11 + Owner: Neutral + Location: 107,101 + Actor1017: t11 + Owner: Neutral + Location: 103,71 + Actor1018: t13 + Owner: Neutral + Location: 85,74 + Actor1020: t10 + Owner: Neutral + Location: 59,109 + Actor1021: t10 + Owner: Neutral + Location: 73,89 + Actor1022: t12 + Owner: Neutral + Location: 67,91 + Actor1023: t10 + Owner: Neutral + Location: 87,72 + Actor1024: t14 + Owner: Neutral + Location: 82,50 + Actor1025: t13 + Owner: Neutral + Location: 80,37 + Actor1026: t12 + Owner: Neutral + Location: 74,31 + Actor1027: t13 + Owner: Neutral + Location: 73,22 + Actor1028: t11 + Owner: Neutral + Location: 57,32 + Actor1031: t03 + Owner: Neutral + Location: 51,23 + Actor1032: t14 + Owner: Neutral + Location: 52,23 + Actor1033: 3tnk + Owner: USSR + Location: 79,98 + Facing: 256 + Actor1034: 3tnk + Owner: USSR + Location: 79,103 + Facing: 256 + Actor1035: 3tnk + Owner: USSR + Location: 8,55 + Facing: 610 + Actor1036: 3tnk + Owner: USSR + Facing: 384 + Location: 34,21 + Actor1037: 3tnk + Owner: USSR + Location: 58,21 + Facing: 512 + Actor1038: 3tnk + Owner: USSR + Location: 64,21 + Facing: 512 + Actor1039: 3tnk + Owner: USSR + Location: 82,33 + Facing: 256 + Actor1040: 3tnk + Owner: USSR + Location: 83,38 + Facing: 256 + Actor1041: 3tnk + Owner: USSR + Location: 94,47 + Facing: 512 + Actor1042: 3tnk + Owner: USSR + Location: 99,49 + Facing: 512 + Actor1043: 3tnk + Owner: USSR + Location: 69,40 + Facing: 927 + Actor1044: 3tnk + Owner: USSR + Location: 29,58 + Facing: 626 + Actor1045: 3tnk + Owner: USSR + Location: 31,60 + Facing: 634 + Actor1046: ttra + Owner: USSR + Facing: 384 + Location: 95,38 + Actor1047: ttra + Owner: USSR + Location: 89,29 + Facing: 384 + Actor1048: ttnk + Owner: USSR + Location: 97,38 + Facing: 512 + Actor1049: v2rl + Owner: USSR + Facing: 384 + Location: 89,41 + Actor1050: btr + Owner: USSR + Facing: 384 + Location: 25,40 + Actor1051: btr + Owner: USSR + Facing: 384 + Location: 30,75 + Actor1052: btr + Owner: USSR + Facing: 384 + Location: 47,84 + Actor1053: btr + Owner: USSR + Location: 62,101 + Facing: 256 + Actor1054: isu + Owner: USSR + Location: 66,19 + Facing: 512 + Actor1055: 4tnk.erad.atomic + Owner: USSR + Location: 23,20 + Facing: 626 + Actor1056: 4tnk + Owner: USSR + Location: 43,23 + Facing: 256 + Actor1057: btr + Owner: USSR + Location: 45,23 + Facing: 256 + Actor1058: e1 + Owner: USSR + SubCell: 3 + Location: 7,56 + Facing: 761 + Actor1059: e1 + Owner: USSR + SubCell: 3 + Location: 9,54 + Facing: 689 + Actor1061: e1 + Owner: USSR + SubCell: 3 + Location: 10,55 + Facing: 626 + Actor1062: e1 + Owner: USSR + Location: 10,55 + SubCell: 1 + Facing: 642 + Actor1063: e1 + Owner: USSR + SubCell: 3 + Location: 30,57 + Facing: 642 + Actor1064: e1 + Owner: USSR + SubCell: 3 + Location: 31,59 + Facing: 689 + Actor1065: e1 + Owner: USSR + SubCell: 3 + Location: 29,60 + Facing: 697 + Actor1066: e1 + Owner: USSR + SubCell: 3 + Location: 33,61 + Facing: 515 + Actor1067: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 46,68 + Actor1068: e1 + Owner: USSR + Facing: 384 + Location: 45,71 + SubCell: 3 + Actor1069: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 52,76 + Actor1070: e1 + Owner: USSR + Facing: 384 + Location: 54,76 + SubCell: 3 + Actor1071: e1 + Owner: USSR + Facing: 384 + Location: 47,76 + SubCell: 3 + Actor1072: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 48,86 + Actor1073: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 50,88 + Actor1074: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 34,77 + Actor1075: e1 + Owner: USSR + Facing: 384 + Location: 28,78 + SubCell: 3 + Actor1076: e1 + Owner: USSR + SubCell: 3 + Location: 34,80 + Facing: 475 + Actor1077: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 30,76 + Actor1078: e1 + Owner: USSR + Location: 56,98 + SubCell: 3 + Facing: 214 + Actor1079: e1 + Owner: USSR + SubCell: 3 + Location: 58,103 + Facing: 261 + Actor1080: e1 + Owner: USSR + SubCell: 3 + Location: 59,99 + Facing: 261 + Actor1081: e1 + Owner: USSR + SubCell: 3 + Location: 62,102 + Facing: 253 + Actor1082: e1 + Owner: USSR + SubCell: 3 + Location: 64,107 + Facing: 0 + Actor1083: e1 + Owner: USSR + SubCell: 3 + Location: 66,111 + Facing: 0 + Actor1084: e1 + Owner: USSR + SubCell: 3 + Location: 69,100 + Facing: 269 + Actor1085: e1 + Owner: USSR + SubCell: 3 + Location: 68,96 + Facing: 222 + Actor1086: e1 + Owner: USSR + Location: 72,98 + SubCell: 3 + Facing: 293 + Actor1087: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 60,93 + Actor1088: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 57,91 + Actor1089: e1 + Owner: USSR + Facing: 384 + Location: 59,89 + SubCell: 3 + Actor1090: e1 + Owner: USSR + Location: 19,60 + SubCell: 3 + Facing: 610 + Actor1091: e1 + Owner: USSR + SubCell: 3 + Location: 21,62 + Facing: 570 + Actor1092: e1 + Owner: USSR + SubCell: 3 + Location: 29,65 + Facing: 507 + Actor1093: e1 + Owner: USSR + Location: 27,67 + SubCell: 3 + Facing: 384 + Actor1094: e1 + Owner: USSR + SubCell: 3 + Location: 30,69 + Facing: 618 + Actor1095: e1 + Owner: USSR + Location: 11,58 + SubCell: 3 + Facing: 666 + Actor1096: e1 + Owner: USSR + Location: 7,59 + SubCell: 3 + Facing: 682 + Actor1097: e1 + Owner: USSR + Location: 4,54 + SubCell: 3 + Facing: 602 + Actor1098: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 32,51 + Actor1099: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 37,25 + Actor1100: e1 + Owner: USSR + SubCell: 3 + Location: 68,41 + Facing: 0 + Actor1101: e1 + Owner: USSR + SubCell: 3 + Location: 66,39 + Facing: 0 + Actor1102: e1 + Owner: USSR + Location: 69,39 + SubCell: 3 + Facing: 126 + Actor1103: e1 + Owner: USSR + SubCell: 3 + Location: 74,41 + Facing: 919 + Actor1104: e1 + Owner: USSR + SubCell: 3 + Location: 84,38 + Facing: 384 + Actor1105: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 83,37 + Actor1106: e1 + Owner: USSR + SubCell: 3 + Location: 84,33 + Facing: 198 + Actor1107: e1 + Owner: USSR + Location: 84,33 + SubCell: 1 + Facing: 301 + Actor1108: e1 + Owner: USSR + SubCell: 3 + Location: 83,32 + Facing: 150 + Actor1109: e1 + Owner: USSR + SubCell: 3 + Location: 92,45 + Facing: 570 + Actor1111: e1 + Owner: USSR + Location: 93,45 + SubCell: 1 + Facing: 515 + Actor1112: e1 + Owner: USSR + SubCell: 3 + Location: 95,46 + Facing: 539 + Actor1113: e1 + Owner: USSR + Facing: 384 + Location: 98,49 + SubCell: 3 + Actor1114: e1 + Owner: USSR + SubCell: 3 + Location: 93,48 + Facing: 594 + Actor1110: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 94,38 + Actor1115: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 91,36 + Actor1116: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 98,33 + Actor1117: e1 + Owner: USSR + SubCell: 3 + Location: 100,34 + Facing: 602 + Actor1118: e1 + Owner: USSR + SubCell: 3 + Location: 93,31 + Facing: 832 + Actor1119: e1 + Owner: USSR + SubCell: 3 + Location: 96,30 + Facing: 0 + Actor1121: e1 + Owner: USSR + Location: 65,18 + SubCell: 3 + Facing: 618 + Actor1122: e1 + Owner: USSR + SubCell: 3 + Location: 64,20 + Facing: 697 + Actor1124: e1 + Owner: USSR + Facing: 384 + Location: 63,21 + SubCell: 1 + Actor1125: e1 + Owner: USSR + SubCell: 3 + Location: 58,20 + Facing: 642 + Actor1126: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 56,20 + Actor1127: e1 + Owner: USSR + SubCell: 3 + Location: 57,18 + Facing: 547 + Actor1120: shok + Owner: USSR + Facing: 384 + Location: 64,20 + SubCell: 1 + Actor1123: shok + Owner: USSR + SubCell: 3 + Location: 45,24 + Facing: 309 + Actor1128: shok + Owner: USSR + Facing: 384 + Location: 34,20 + SubCell: 3 + Actor1129: shok + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 20,20 + Actor1130: shok + Owner: USSR + SubCell: 3 + Location: 6,53 + Facing: 563 + Actor1131: shok + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 72,93 + Actor1134: e1 + Owner: USSR + SubCell: 3 + Location: 82,97 + Facing: 182 + Actor1135: e1 + Owner: USSR + SubCell: 3 + Location: 83,94 + Facing: 158 + Actor1136: e1 + Owner: USSR + SubCell: 3 + Location: 80,104 + Facing: 214 + Actor1137: e1 + Owner: USSR + Location: 82,107 + SubCell: 3 + Facing: 214 + Actor1138: e1 + Owner: USSR + SubCell: 3 + Location: 79,106 + Facing: 206 + Actor1139: e1 + Owner: USSR + SubCell: 3 + Location: 80,100 + Facing: 245 + Actor1140: e1 + Owner: USSR + SubCell: 3 + Location: 88,106 + Facing: 384 + Actor1141: e1 + Owner: USSR + Location: 88,106 + SubCell: 1 + Facing: 214 + Actor1142: e1 + Owner: USSR + Location: 89,106 + SubCell: 3 + Facing: 697 + Actor1143: e1 + Owner: USSR + SubCell: 3 + Location: 98,104 + Facing: 602 + Actor1144: e1 + Owner: USSR + SubCell: 3 + Location: 99,102 + Facing: 594 + Actor1145: e1 + Owner: USSR + Facing: 384 + Location: 97,105 + SubCell: 3 + Actor1146: e1 + Owner: USSR + SubCell: 3 + Location: 99,105 + Facing: 467 + Actor1147: e1 + Owner: USSR + SubCell: 3 + Location: 102,100 + Facing: 697 + Actor1148: e1 + Owner: USSR + SubCell: 3 + Location: 103,104 + Facing: 642 + Actor1149: e1 + Owner: USSR + SubCell: 3 + Location: 103,98 + Facing: 777 + Actor1150: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 88,85 + Actor1151: e1 + Owner: USSR + SubCell: 3 + Location: 98,88 + Facing: 872 + Actor1152: e1 + Owner: USSR + SubCell: 3 + Location: 97,87 + Facing: 570 + Actor1153: e1 + Owner: USSR + SubCell: 3 + Location: 103,76 + Facing: 674 + Actor1154: e1 + Owner: USSR + SubCell: 3 + Location: 104,75 + Facing: 63 + Actor1155: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 101,74 + Actor1156: e4 + Owner: USSR + Facing: 384 + Location: 62,91 + SubCell: 3 + Actor1157: e4 + Owner: USSR + Facing: 384 + Location: 54,75 + SubCell: 3 + Actor1158: e4 + Owner: USSR + Facing: 384 + SubCell: 1 + Location: 46,68 + Actor1159: e4 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 36,76 + Actor1160: e4 + Owner: USSR + SubCell: 3 + Location: 58,101 + Facing: 269 + Actor1161: e4 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 46,88 + Actor1162: e4 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 16,78 + Actor1163: dog + Owner: USSR + SubCell: 3 + Location: 31,58 + Facing: 650 + Actor1164: dog + Owner: USSR + SubCell: 3 + Location: 8,58 + Facing: 666 + Actor1165: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 21,19 + Actor1166: e3 + Owner: USSR + SubCell: 3 + Location: 25,14 + Facing: 674 + Actor1167: e3 + Owner: USSR + SubCell: 3 + Location: 40,15 + Facing: 384 + Actor1168: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 72,14 + Actor1169: e3 + Owner: USSR + Facing: 384 + Location: 68,13 + SubCell: 3 + Actor1170: e3 + Owner: USSR + SubCell: 3 + Location: 69,8 + Facing: 594 + Actor1171: e3 + Owner: USSR + Facing: 384 + Location: 74,6 + SubCell: 3 + Actor1172: e3 + Owner: USSR + SubCell: 3 + Location: 59,7 + Facing: 737 + Actor1173: e3 + Owner: USSR + SubCell: 3 + Location: 54,3 + Facing: 539 + Actor1174: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 90,29 + Actor1175: e3 + Owner: USSR + Facing: 384 + Location: 100,34 + SubCell: 1 + Actor1176: e3 + Owner: USSR + SubCell: 3 + Location: 104,35 + Facing: 721 + Actor1177: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 100,41 + Actor1178: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 91,42 + Actor1179: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 91,44 + Actor1180: e3 + Owner: USSR + SubCell: 3 + Location: 85,40 + Facing: 384 + Actor1181: e3 + Owner: USSR + SubCell: 3 + Location: 94,61 + Facing: 507 + Actor1182: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 91,62 + Actor1183: e3 + Owner: USSR + SubCell: 3 + Location: 105,76 + Facing: 586 + Actor1184: e3 + Owner: USSR + Facing: 384 + Location: 97,87 + SubCell: 1 + Actor1185: e3 + Owner: USSR + Facing: 384 + SubCell: 1 + Location: 98,104 + Actor1186: e3 + Owner: USSR + Location: 89,106 + SubCell: 1 + Facing: 499 + Actor1187: e3 + Owner: USSR + Location: 82,97 + SubCell: 1 + Facing: 253 + Actor1188: e3 + Owner: USSR + Location: 70,100 + SubCell: 3 + Facing: 384 + Actor1189: e3 + Owner: USSR + Location: 59,98 + SubCell: 3 + Facing: 237 + Actor1190: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 49,87 + Actor1191: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 29,74 + Actor1192: e3 + Owner: USSR + Location: 64,107 + SubCell: 1 + Facing: 222 + Actor1193: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 58,73 + Actor1194: e3 + Owner: USSR + SubCell: 3 + Location: 57,51 + Facing: 650 + Actor1195: e3 + Owner: USSR + Facing: 384 + Location: 57,50 + SubCell: 3 + Actor1196: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 62,60 + Actor1198: e3 + Owner: USSR + SubCell: 3 + Location: 74,61 + Facing: 384 + Actor1199: e3 + Owner: USSR + SubCell: 3 + Location: 67,61 + Facing: 705 + Actor1197: e2 + Owner: USSR + Location: 32,60 + SubCell: 3 + Facing: 674 + Actor1200: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 32,41 + Actor1202: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 24,41 + Actor1201: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 28,41 + Actor1203: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 31,44 + Actor1204: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 34,45 + Actor1205: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 22,42 + Actor1206: e3 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 36,42 + Actor1207: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 102,63 + Actor1208: e1r1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 92,65 + Actor1209: e1r1 + Owner: USSR + SubCell: 3 + Location: 95,65 + Facing: 483 + Actor1210: e1r1 + Owner: USSR + SubCell: 3 + Location: 99,64 + Facing: 563 + Actor1211: e1r1 + Owner: USSR + SubCell: 3 + Location: 96,64 + Facing: 586 + Actor1212: e1r1 + Owner: USSR + SubCell: 3 + Location: 101,65 + Facing: 594 + Actor1213: e1r1 + Owner: USSR + Facing: 384 + SubCell: 1 + Location: 59,52 + Actor1214: e1r1 + Owner: USSR + Location: 64,54 + SubCell: 3 + Facing: 0 + Actor1215: e1r1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 69,58 + Actor1216: e1r1 + Owner: USSR + SubCell: 3 + Location: 65,58 + Facing: 705 + Actor1217: e1r1 + Owner: USSR + Location: 69,58 + SubCell: 1 + Facing: 0 + Actor1218: e1r1 + Owner: USSR + Location: 75,41 + SubCell: 3 + Facing: 785 + Actor1219: e4 + Owner: USSR + Location: 68,40 + SubCell: 3 + Facing: 0 + Actor1220: e2 + Owner: USSR + SubCell: 1 + Location: 75,41 + Facing: 856 + Actor1222: e2 + Owner: USSR + Facing: 384 + Location: 94,32 + SubCell: 3 + Actor1223: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 93,13 + Actor1224: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 98,14 + Actor1225: e2 + Owner: USSR + Facing: 384 + Location: 98,14 + SubCell: 1 + Actor1226: e2 + Owner: USSR + SubCell: 3 + Location: 67,22 + Facing: 618 + Actor1227: e2 + Owner: USSR + Location: 67,10 + SubCell: 3 + Facing: 594 + Actor1228: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 57,8 + Actor1229: e2 + Owner: USSR + SubCell: 3 + Location: 53,5 + Facing: 602 + Actor1230: e2 + Owner: USSR + SubCell: 3 + Location: 27,15 + Facing: 555 + Actor1231: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 34,19 + Actor1232: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 31,20 + Actor1233: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 32,19 + Actor1234: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 24,21 + Actor1235: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 23,19 + Actor1236: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 21,23 + Actor1237: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 35,22 + Actor1238: split2 + Owner: Neutral + Location: 27,35 + Actor1239: split2 + Owner: Neutral + Location: 23,30 + Actor1240: split2 + Owner: Neutral + Location: 107,95 + Actor1241: split2 + Owner: Neutral + Location: 109,101 + Actor1242: split2 + Owner: Neutral + Location: 102,90 + Actor1243: split2 + Owner: Neutral + Location: 36,57 + Actor1244: 3tnk + Owner: USSR + Location: 67,8 + Facing: 384 + Actor1245: 3tnk + Owner: USSR + Facing: 384 + Location: 54,30 + Actor1248: e1 + Owner: USSR + SubCell: 3 + Facing: 697 + Location: 56,30 + Actor1250: e1 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 53,29 + Actor1251: e1 + Owner: USSR + SubCell: 1 + Facing: 214 + Location: 53,29 + Actor1249: e3 + Owner: USSR + SubCell: 1 + Facing: 499 + Location: 56,30 + Actor1246: e8 + Owner: USSR + Location: 86,101 + SubCell: 3 + Facing: 384 + Actor1247: e8 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 92,106 + Actor1252: e8 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 99,100 + Actor1253: ttur + Owner: USSR + Location: 83,104 + Actor1254: ttur + Owner: USSR + Location: 83,98 + Actor1255: ttur + Owner: USSR + Location: 102,98 + Actor1256: ttur + Owner: USSR + Location: 102,104 + Actor1258: brik + Owner: USSR + Location: 94,44 + Actor1259: brik + Owner: USSR + Location: 93,44 + Actor1260: brik + Owner: USSR + Location: 100,44 + Actor1261: brik + Owner: USSR + Location: 101,44 + Actor1262: brik + Owner: USSR + Location: 85,38 + Actor1263: brik + Owner: USSR + Location: 85,39 + Actor1264: brik + Owner: USSR + Location: 85,32 + Actor1221: brik + Owner: USSR + Location: 85,31 + Actor1265: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 84,30 + Actor1266: brik + Owner: USSR + Location: 93,26 + Actor1267: brik + Owner: USSR + Location: 94,26 + Actor1268: brik + Owner: USSR + Location: 100,26 + Actor1269: brik + Owner: USSR + Location: 101,26 + Actor1270: brik + Owner: USSR + Location: 66,18 + Actor1271: brik + Owner: USSR + Location: 67,18 + Actor1272: brik + Owner: USSR + Location: 69,18 + Actor1273: brik + Owner: USSR + Location: 70,18 + Actor1274: brik + Owner: USSR + Location: 73,18 + Actor1275: brik + Owner: USSR + Location: 72,18 + Actor1276: brik + Owner: USSR + Location: 75,18 + Actor1277: brik + Owner: USSR + Location: 76,18 + Actor1278: brik + Owner: USSR + Location: 76,17 + Actor1279: brik + Owner: USSR + Location: 76,16 + Actor1280: brik + Owner: USSR + Location: 25,18 + Actor1281: brik + Owner: USSR + Location: 24,18 + Actor1282: brik + Owner: USSR + Location: 31,18 + Actor1283: brik + Owner: USSR + Location: 32,18 + Actor1284: ss + Owner: USSR + Location: 102,9 + Facing: 198 + Actor1285: iron + Owner: USSR + Location: 106,30 + EastAttack1: waypoint + Owner: Neutral + Location: 97,47 + EastAttack2: waypoint + Owner: Neutral + Location: 97,69 + EastAttack4: waypoint + Owner: Neutral + Location: 81,101 + EastAttack3: waypoint + Owner: Neutral + Location: 104,100 + EastAttack5: waypoint + Owner: Neutral + Location: 66,101 + WestAttack1: waypoint + Owner: Neutral + Location: 61,27 + WestAttack2: waypoint + Owner: Neutral + Location: 33,28 + WestAttack3: waypoint + Owner: Neutral + Location: 26,56 + WestAttack4: waypoint + Owner: Neutral + Location: 35,69 + MainAirfield: afld + Owner: USSR + Location: 94,33 + Actor1287: fix + Owner: USSR + Location: 94,35 + Actor1288: camera + Owner: USSR + Location: 28,86 + Actor1289: camera + Owner: USSR + Location: 42,92 + Actor1290: camera + Owner: USSR + Location: 53,101 + Actor1291: camera + Owner: USSR + Location: 14,83 + Actor1292: camera + Owner: USSR + Location: 43,69 + Actor1293: camera + Owner: USSR + Location: 66,89 + Actor1294: camera + Owner: USSR + Location: 92,97 + Actor1295: camera + Owner: USSR + Location: 29,46 + Actor1296: camera + Owner: USSR + Location: 17,52 + Actor1297: camera + Owner: USSR + Location: 30,61 + Actor1298: ttur + Owner: USSR + Location: 75,99 + Actor1299: btr.ai + Owner: USSR + Facing: 384 + Location: 99,106 + Actor1300: btr + Owner: USSR + Location: 85,107 + Facing: 256 + Actor1301: btr + Owner: USSR + Location: 85,95 + Facing: 256 + Actor1302: btr + Owner: USSR + Facing: 384 + Location: 90,90 + Actor1303: btr + Owner: USSR + Facing: 384 + Location: 63,58 + Actor1286: apoc + Owner: USSR + Facing: 384 + Location: 98,36 + TankYardReveal: waypoint + Owner: Neutral + Location: 28,19 + Actor1304: brik + Owner: USSR + Location: 4,30 + Actor1305: brik + Owner: USSR + Location: 5,30 + Actor1306: brik + Owner: USSR + Location: 6,30 + Actor1307: brik + Owner: USSR + Location: 7,30 + Actor1308: brik + Owner: USSR + Location: 8,30 + Actor1309: brik + Owner: USSR + Location: 9,30 + Actor1310: brik + Owner: USSR + Location: 10,30 + Actor1311: brik + Owner: USSR + Location: 11,30 + Actor1312: brik + Owner: USSR + Location: 12,30 + Actor1313: brik + Owner: USSR + Location: 13,30 + Actor1314: brik + Owner: USSR + Location: 14,30 + Actor1315: brik + Owner: USSR + Location: 4,31 + Actor1316: chain + Owner: USSR + Location: 5,31 + Actor1317: chain + Owner: USSR + Location: 6,31 + Actor1318: chain + Owner: USSR + Location: 7,31 + Actor1319: chain + Owner: USSR + Location: 8,31 + Actor1320: chain + Owner: USSR + Location: 9,31 + Actor1321: chain + Owner: USSR + Location: 10,31 + Actor1322: chain + Owner: USSR + Location: 11,31 + Actor1323: chain + Owner: USSR + Location: 12,31 + Actor1324: chain + Owner: USSR + Location: 13,31 + Actor1325: brik + Owner: USSR + Location: 14,31 + Actor1326: brik + Owner: USSR + Location: 4,32 + Actor1327: chain + Owner: USSR + Location: 5,32 + TeslaPower1: tpwr + Owner: USSR + Location: 6,32 + TeslaPower2: tpwr + Owner: USSR + Location: 10,32 + Actor1330: chain + Owner: USSR + Location: 13,32 + Actor1331: brik + Owner: USSR + Location: 14,32 + Actor1332: brik + Owner: USSR + Location: 4,33 + Actor1333: chain + Owner: USSR + Location: 5,33 + Actor1334: chain + Owner: USSR + Location: 13,33 + Actor1335: brik + Owner: USSR + Location: 14,33 + Actor1336: brik + Owner: USSR + Location: 4,34 + Actor1337: chain + Owner: USSR + Location: 5,34 + Actor1338: chain + Owner: USSR + Location: 13,34 + Actor1339: brik + Owner: USSR + Location: 14,34 + Actor1340: brik + Owner: USSR + Location: 4,35 + Actor1341: chain + Owner: USSR + Location: 5,35 + TeslaPower3: tpwr + Owner: USSR + Location: 6,35 + TeslaPower4: tpwr + Owner: USSR + Location: 10,35 + Actor1344: chain + Owner: USSR + Location: 13,35 + Actor1345: brik + Owner: USSR + Location: 14,35 + Actor1346: brik + Owner: USSR + Location: 4,36 + Actor1347: chain + Owner: USSR + Location: 5,36 + Actor1348: chain + Owner: USSR + Location: 13,36 + Actor1349: brik + Owner: USSR + Location: 14,36 + Actor1350: brik + Owner: USSR + Location: 4,37 + Actor1351: chain + Owner: USSR + Location: 5,37 + Actor1352: chain + Owner: USSR + Location: 13,37 + Actor1353: brik + Owner: USSR + Location: 14,37 + Actor1354: brik + Owner: USSR + Location: 4,38 + Actor1355: chain + Owner: USSR + Location: 5,38 + TeslaPower5: tpwr + Owner: USSR + Location: 6,38 + TeslaPower6: tpwr + Owner: USSR + Location: 10,38 + Actor1358: chain + Owner: USSR + Location: 13,38 + Actor1359: brik + Owner: USSR + Location: 14,38 + Actor1360: brik + Owner: USSR + Location: 4,39 + Actor1361: chain + Owner: USSR + Location: 5,39 + Actor1362: chain + Owner: USSR + Location: 13,39 + Actor1363: brik + Owner: USSR + Location: 14,39 + Actor1364: brik + Owner: USSR + Location: 4,40 + Actor1365: chain + Owner: USSR + Location: 5,40 + Actor1366: chain + Owner: USSR + Location: 13,40 + Actor1367: brik + Owner: USSR + Location: 14,40 + Actor1368: brik + Owner: USSR + Location: 4,41 + Actor1369: chain + Owner: USSR + Location: 5,41 + Actor1370: chain + Owner: USSR + Location: 6,41 + Actor1371: chain + Owner: USSR + Location: 7,41 + Actor1372: chain + Owner: USSR + Location: 11,41 + Actor1373: chain + Owner: USSR + Location: 12,41 + Actor1374: chain + Owner: USSR + Location: 13,41 + Actor1375: brik + Owner: USSR + Location: 14,41 + Actor1376: brik + Owner: USSR + Location: 4,42 + Actor1377: brik + Owner: USSR + Location: 5,42 + Actor1378: brik + Owner: USSR + Location: 6,42 + Actor1379: brik + Owner: USSR + Location: 7,42 + TeslaCoil1: tsla + Owner: USSR + Location: 9,42 + Actor1381: brik + Owner: USSR + Location: 11,42 + Actor1382: brik + Owner: USSR + Location: 12,42 + Actor1383: brik + Owner: USSR + Location: 13,42 + Actor1384: brik + Owner: USSR + Location: 14,42 + Actor1385: brik + Owner: USSR + Location: 6,43 + Actor1386: brik + Owner: USSR + Location: 7,43 + Actor1387: brik + Owner: USSR + Location: 11,43 + Actor1388: brik + Owner: USSR + Location: 12,43 + Actor1389: shok + Owner: USSR + SubCell: 3 + Facing: 563 + Location: 14,43 + Actor1390: ftur + Owner: USSR + Location: 7,44 + Actor1391: ftur + Owner: USSR + Location: 11,44 + Actor1392: e1 + Owner: USSR + SubCell: 3 + Facing: 610 + Location: 13,44 + Actor1257: tc04 + Owner: Neutral + Location: 9,48 + Actor1393: tc01 + Owner: Neutral + Location: 2,38 + Actor1394: t13 + Owner: Neutral + Location: 3,43 + Actor1395: t15 + Owner: Neutral + Location: 10,51 + Actor1396: t11 + Owner: Neutral + Location: 12,46 + Actor1397: t12 + Owner: Neutral + Location: 3,50 + SWBarracks: barr + Owner: USSR + Location: 54,71 + SBarracks1: barr + Owner: USSR + Location: 88,102 + SBarracks2: barr + Owner: USSR + Location: 96,102 + Actor1329: brik + Owner: USSR + Location: 76,6 + Actor1342: brik + Owner: USSR + Location: 78,6 + Actor1343: brik + Owner: USSR + Location: 77,6 + Actor1356: brik + Owner: USSR + Location: 79,6 + Actor1357: brik + Owner: USSR + Location: 80,6 + Actor1380: brik + Owner: USSR + Location: 80,5 + Actor1398: brik + Owner: USSR + Location: 80,4 + Actor1399: brik + Owner: USSR + Location: 80,3 + Actor1400: brik + Owner: USSR + Location: 80,2 + Actor1401: brik + Owner: USSR + Location: 80,1 + Actor1402: brik + Owner: USSR + Location: 79,1 + Actor1403: brik + Owner: USSR + Location: 78,1 + Actor1404: brik + Owner: USSR + Location: 77,1 + Actor1405: brik + Owner: USSR + Location: 76,1 + MissileSilo: mslo + Owner: USSR + Location: 77,3 + ScriptTags: BrutalOnly + Actor1328: silo + Owner: USSR + Location: 78,5 + Actor1407: silo + Owner: USSR + Location: 79,5 + Actor1408: fenc + Owner: USSR + Location: 77,2 + Actor1409: fenc + Owner: USSR + Location: 76,2 + Actor1410: fenc + Owner: USSR + Location: 78,2 + Actor1411: fenc + Owner: USSR + Location: 79,2 + Actor1412: fenc + Owner: USSR + Location: 79,3 + Actor1413: fenc + Owner: USSR + Location: 79,4 + Actor1414: fenc + Owner: USSR + Location: 75,2 + Actor1415: sam + Owner: USSR + Location: 76,5 + Actor1416: 3tnk + Owner: USSR + Facing: 384 + Location: 76,3 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-allegiances.yaml, ca|missions/main-campaign/ca22-decimation/decimation-rules.yaml, ca|missions/main-campaign/ca22-decimation/fall.yaml, ca|rules/custom/coop-rules.yaml, decimation-coop-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/coop-campaign/ca23-subjugation-coop/map.bin b/mods/ca/missions/coop-campaign/ca23-subjugation-coop/map.bin new file mode 100644 index 0000000000..643d616d9b Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca23-subjugation-coop/map.bin differ diff --git a/mods/ca/missions/coop-campaign/ca23-subjugation-coop/map.png b/mods/ca/missions/coop-campaign/ca23-subjugation-coop/map.png new file mode 100644 index 0000000000..8740cc754b Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca23-subjugation-coop/map.png differ diff --git a/mods/ca/missions/coop-campaign/ca23-subjugation-coop/map.yaml b/mods/ca/missions/coop-campaign/ca23-subjugation-coop/map.yaml new file mode 100644 index 0000000000..da7f30e659 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca23-subjugation-coop/map.yaml @@ -0,0 +1,3685 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 23: Subjugation Co-op + +Author: Darkademic & Gandorques Hikla + +Tileset: TEMPERAT + +MapSize: 98,98 + +Bounds: 1,1,96,96 + +Visibility: Lobby + +Categories: Co-op Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: Scrin, USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + PlayerReference@Scrin: + Name: Scrin + Faction: scrin + Color: 7700FF + Allies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Creeps + PlayerReference@USSR: + Name: USSR + Bot: campaign + Faction: soviet + Color: FE1100 + Enemies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: scrin + Color: 7700FF + LockColor: True + Allies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Creeps + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: scrin + Color: D83CE5 + LockColor: True + Allies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Creeps + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: scrin + Color: 0B7310 + LockColor: True + Allies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Creeps + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: scrin + Color: 775A12 + LockColor: True + Allies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Creeps + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: scrin + Color: 82C900 + LockColor: True + Allies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Creeps + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: scrin + Color: EEA8A8 + LockColor: True + Allies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Creeps + +Actors: + Mastermind: mast + Owner: Scrin + SubCell: 3 + Location: 92,5 + Facing: 384 + Actor1: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 87,5 + Actor2: gunw + Owner: Scrin + Facing: 384 + Location: 86,6 + Actor3: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 87,6 + Actor5: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 89,7 + Actor6: gunw + Owner: Scrin + Facing: 384 + Location: 88,8 + Actor7: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 91,8 + Actor9: gunw + Owner: Scrin + Facing: 384 + Location: 91,9 + Actor10: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 92,9 + Actor11: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 93,9 + Actor207: fenc + Owner: USSR + Location: 69,2 + Actor208: fenc + Owner: USSR + Location: 69,3 + Actor209: fenc + Owner: USSR + Location: 69,4 + Actor210: fenc + Owner: USSR + Location: 69,5 + Actor211: ftur + Owner: USSR + Location: 70,5 + Actor212: ftur + Owner: USSR + Location: 70,9 + Actor213: fenc + Owner: USSR + Location: 69,9 + Actor214: fenc + Owner: USSR + Location: 69,10 + Actor215: fenc + Owner: USSR + Location: 69,11 + Actor216: fenc + Owner: USSR + Location: 68,11 + Actor217: fenc + Owner: USSR + Location: 66,11 + Actor218: fenc + Owner: USSR + Location: 67,11 + Actor222: sbag + Owner: USSR + Location: 68,1 + Actor223: sbag + Owner: USSR + Location: 67,1 + Actor224: sbag + Owner: USSR + Location: 66,1 + Actor225: sbag + Owner: USSR + Location: 65,1 + Actor226: sbag + Owner: USSR + Location: 64,1 + Actor227: sbag + Owner: USSR + Location: 63,1 + Actor228: sbag + Owner: USSR + Location: 62,1 + Actor229: sbag + Owner: USSR + Location: 61,1 + Actor230: sbag + Owner: USSR + Location: 60,1 + Actor231: sbag + Owner: USSR + Location: 59,1 + Actor232: sbag + Owner: USSR + Location: 58,1 + Actor233: sbag + Owner: USSR + Location: 57,1 + Actor234: sbag + Owner: USSR + Location: 57,2 + Actor235: sbag + Owner: USSR + Location: 57,3 + Actor236: sbag + Owner: USSR + Location: 57,4 + Actor237: sbag + Owner: USSR + Location: 68,4 + Actor238: sbag + Owner: USSR + Location: 68,3 + Actor239: sbag + Owner: USSR + Location: 68,2 + Actor240: sbag + Owner: USSR + Location: 68,9 + Actor241: sbag + Owner: USSR + Location: 68,10 + Actor242: sbag + Owner: USSR + Location: 68,5 + Actor243: sbag + Owner: USSR + Location: 67,10 + Actor244: sbag + Owner: USSR + Location: 66,10 + Actor245: sbag + Owner: USSR + Location: 65,10 + Actor246: sbag + Owner: USSR + Location: 64,10 + Actor249: sbag + Owner: USSR + Location: 57,9 + Actor250: sbag + Owner: USSR + Location: 57,10 + Actor251: sbag + Owner: USSR + Location: 58,10 + Actor252: sbag + Owner: USSR + Location: 59,10 + Actor253: sbag + Owner: USSR + Location: 60,10 + Actor247: sbag + Owner: USSR + Location: 57,5 + Actor248: powr + Owner: USSR + Location: 58,2 + Actor254: powr + Owner: USSR + Location: 60,2 + Actor255: fenc + Owner: USSR + Location: 69,1 + Actor256: fenc + Owner: USSR + Location: 70,4 + Actor257: fenc + Owner: USSR + Location: 70,10 + Actor63: brik + Owner: USSR + Location: 39,41 + Actor64: brik + Owner: USSR + Location: 40,41 + Actor65: brik + Owner: USSR + Location: 41,41 + Actor66: brik + Owner: USSR + Location: 42,41 + Actor67: brik + Owner: USSR + Location: 43,41 + Actor68: brik + Owner: USSR + Location: 44,41 + Actor69: brik + Owner: USSR + Location: 45,41 + Actor70: brik + Owner: USSR + Location: 46,41 + Actor71: brik + Owner: USSR + Location: 47,41 + Actor72: brik + Owner: USSR + Location: 51,41 + Actor73: brik + Owner: USSR + Location: 52,41 + Actor74: brik + Owner: USSR + Location: 53,41 + Actor75: brik + Owner: USSR + Location: 54,41 + Actor76: brik + Owner: USSR + Location: 55,41 + Actor77: brik + Owner: USSR + Location: 56,41 + Actor78: brik + Owner: USSR + Location: 57,41 + Actor79: brik + Owner: USSR + Location: 58,41 + Actor80: brik + Owner: USSR + Location: 59,41 + Actor81: brik + Owner: USSR + Location: 39,42 + Actor83: n3c + Owner: USSR + SubCell: 3 + Facing: 0 + Location: 44,42 + CPowered2: tsla + Owner: USSR + Location: 45,42 + Actor85: brik + Owner: USSR + Location: 46,42 + Actor86: brik + Owner: USSR + Location: 47,42 + Actor87: rmbc + Owner: USSR + SubCell: 3 + Facing: 0 + Location: 48,42 + Actor88: rmbc + Owner: USSR + SubCell: 3 + Facing: 0 + Location: 50,42 + Actor89: brik + Owner: USSR + Location: 51,42 + Actor90: brik + Owner: USSR + Location: 52,42 + CPowered3: tsla + Owner: USSR + Location: 53,42 + Actor92: n3c + Owner: USSR + SubCell: 3 + Facing: 0 + Location: 54,42 + Actor94: brik + Owner: USSR + Location: 59,42 + Actor95: brik + Owner: USSR + Location: 39,43 + Actor96: brik + Owner: USSR + Location: 59,43 + Actor97: brik + Owner: USSR + Location: 39,44 + Actor98: brut + Owner: USSR + SubCell: 3 + Facing: 0 + Location: 48,44 + Actor99: brut + Owner: USSR + SubCell: 3 + Facing: 0 + Location: 50,44 + Actor100: brik + Owner: USSR + Location: 59,44 + Actor101: brik + Owner: USSR + Location: 39,45 + Actor102: brik + Owner: USSR + Location: 59,45 + Actor103: brik + Owner: USSR + Location: 39,46 + Actor104: n3c + Owner: USSR + SubCell: 3 + Facing: 256 + Location: 40,46 + CPowered11: sam + Owner: USSR + Location: 46,46 + Actor106: ftur + Owner: USSR + Location: 48,46 + Actor107: ftur + Owner: USSR + Location: 50,46 + CPowered12: sam + Owner: USSR + Location: 51,46 + Actor109: n3c + Owner: USSR + SubCell: 3 + Facing: 768 + Location: 58,46 + Actor110: brik + Owner: USSR + Location: 59,46 + Actor111: brik + Owner: USSR + Location: 39,47 + CPowered1: tsla + Owner: USSR + Location: 40,47 + Actor113: brik + Owner: USSR + Location: 45,47 + Actor114: brik + Owner: USSR + Location: 46,47 + Actor115: brik + Owner: USSR + Location: 47,47 + Actor116: brik + Owner: USSR + Location: 48,47 + Actor117: brik + Owner: USSR + Location: 50,47 + Actor118: brik + Owner: USSR + Location: 51,47 + Actor119: brik + Owner: USSR + Location: 52,47 + Actor120: brik + Owner: USSR + Location: 53,47 + CPowered4: tsla + Owner: USSR + Location: 58,47 + Actor122: brik + Owner: USSR + Location: 59,47 + Actor123: brik + Owner: USSR + Location: 39,48 + Actor124: brik + Owner: USSR + Location: 40,48 + Actor125: enli + Owner: USSR + SubCell: 3 + Facing: 256 + Location: 44,48 + Actor126: brik + Owner: USSR + Location: 45,48 + Actor128: brik + Owner: USSR + Location: 47,48 + Actor129: brik + Owner: USSR + Location: 48,48 + Actor130: brik + Owner: USSR + Location: 50,48 + Actor131: brik + Owner: USSR + Location: 51,48 + Actor133: brik + Owner: USSR + Location: 53,48 + Actor134: enli + Owner: USSR + SubCell: 3 + Facing: 768 + Location: 54,48 + Actor135: brik + Owner: USSR + Location: 58,48 + Actor136: brik + Owner: USSR + Location: 59,48 + Actor137: brik + Owner: USSR + Location: 39,49 + Actor138: brik + Owner: USSR + Location: 40,49 + Actor139: tplr + Owner: USSR + SubCell: 3 + Facing: 256 + Location: 44,49 + Actor140: brik + Owner: USSR + Location: 45,49 + Actor141: brik + Owner: USSR + Location: 46,49 + Actor142: brik + Owner: USSR + Location: 47,49 + Actor143: brik + Owner: USSR + Location: 51,49 + Actor144: brik + Owner: USSR + Location: 52,49 + Actor145: brik + Owner: USSR + Location: 53,49 + Actor146: tplr + Owner: USSR + SubCell: 3 + Facing: 768 + Location: 54,49 + Actor147: brik + Owner: USSR + Location: 58,49 + Actor148: brik + Owner: USSR + Location: 59,49 + Actor149: rmbc + Owner: USSR + SubCell: 3 + Facing: 256 + Location: 39,50 + Actor150: brut + Owner: USSR + SubCell: 3 + Facing: 256 + Location: 42,50 + Actor151: ftur + Owner: USSR + Location: 44,50 + Actor152: brik + Owner: USSR + Location: 45,50 + Actor153: brik + Owner: USSR + Location: 46,50 + YuriHQ: miss + Owner: USSR + Location: 48,50 + Actor155: brik + Owner: USSR + Location: 52,50 + Actor156: brik + Owner: USSR + Location: 53,50 + Actor157: ftur + Owner: USSR + Location: 54,50 + Actor158: brut + Owner: USSR + SubCell: 3 + Facing: 768 + Location: 56,50 + Actor159: rmbc + Owner: USSR + SubCell: 3 + Facing: 768 + Location: 59,50 + Actor160: rmbc + Owner: USSR + SubCell: 3 + Facing: 256 + Location: 39,52 + Actor161: brut + Owner: USSR + SubCell: 3 + Facing: 256 + Location: 42,52 + Actor162: ftur + Owner: USSR + Location: 44,52 + Actor163: brik + Owner: USSR + Location: 45,52 + Actor164: brik + Owner: USSR + Location: 46,52 + Actor165: brik + Owner: USSR + Location: 52,52 + Actor166: brik + Owner: USSR + Location: 53,52 + Actor167: ftur + Owner: USSR + Location: 54,52 + Actor168: brut + Owner: USSR + SubCell: 3 + Facing: 768 + Location: 56,52 + Actor169: rmbc + Owner: USSR + SubCell: 3 + Facing: 768 + Location: 59,52 + Actor170: brik + Owner: USSR + Location: 39,53 + Actor171: brik + Owner: USSR + Location: 40,53 + Actor172: tplr + Owner: USSR + SubCell: 3 + Facing: 256 + Location: 44,53 + Actor173: brik + Owner: USSR + Location: 45,53 + Actor174: brik + Owner: USSR + Location: 46,53 + Actor175: brik + Owner: USSR + Location: 47,53 + Actor176: brik + Owner: USSR + Location: 51,53 + Actor177: brik + Owner: USSR + Location: 52,53 + Actor178: brik + Owner: USSR + Location: 53,53 + Actor179: tplr + Owner: USSR + SubCell: 3 + Facing: 768 + Location: 54,53 + Actor180: brik + Owner: USSR + Location: 58,53 + Actor181: brik + Owner: USSR + Location: 59,53 + Actor182: brik + Owner: USSR + Location: 39,54 + Actor183: brik + Owner: USSR + Location: 40,54 + Actor184: enli + Owner: USSR + SubCell: 3 + Facing: 256 + Location: 44,54 + Actor185: brik + Owner: USSR + Location: 45,54 + Actor187: brik + Owner: USSR + Location: 47,54 + Actor188: brik + Owner: USSR + Location: 48,54 + Actor189: brik + Owner: USSR + Location: 50,54 + Actor190: brik + Owner: USSR + Location: 51,54 + Actor192: brik + Owner: USSR + Location: 53,54 + Actor193: enli + Owner: USSR + SubCell: 3 + Facing: 768 + Location: 54,54 + Actor194: brik + Owner: USSR + Location: 58,54 + Actor195: brik + Owner: USSR + Location: 59,54 + Actor196: brik + Owner: USSR + Location: 39,55 + CPowered8: tsla + Owner: USSR + Location: 40,55 + Actor198: brik + Owner: USSR + Location: 45,55 + Actor199: brik + Owner: USSR + Location: 46,55 + Actor200: brik + Owner: USSR + Location: 47,55 + Actor201: brik + Owner: USSR + Location: 48,55 + Actor202: brik + Owner: USSR + Location: 50,55 + Actor203: brik + Owner: USSR + Location: 51,55 + Actor204: brik + Owner: USSR + Location: 52,55 + Actor205: brik + Owner: USSR + Location: 53,55 + CPowered5: tsla + Owner: USSR + Location: 58,55 + Actor220: brik + Owner: USSR + Location: 59,55 + Actor221: brik + Owner: USSR + Location: 39,56 + Actor258: n3c + Owner: USSR + SubCell: 3 + Facing: 256 + Location: 40,56 + CPowered13: sam + Owner: USSR + Location: 46,56 + Actor260: ftur + Owner: USSR + Location: 48,56 + Actor261: ftur + Owner: USSR + Location: 50,56 + CPowered14: sam + Owner: USSR + Location: 51,56 + Actor263: n3c + Owner: USSR + SubCell: 3 + Facing: 768 + Location: 58,56 + Actor264: brik + Owner: USSR + Location: 59,56 + Actor265: brik + Owner: USSR + Location: 39,57 + Actor266: brik + Owner: USSR + Location: 59,57 + Actor267: brik + Owner: USSR + Location: 39,58 + Actor268: brut + Owner: USSR + SubCell: 3 + Facing: 512 + Location: 48,58 + Actor269: brut + Owner: USSR + SubCell: 3 + Facing: 512 + Location: 50,58 + Actor270: brik + Owner: USSR + Location: 59,58 + Actor271: brik + Owner: USSR + Location: 39,59 + Actor272: brik + Owner: USSR + Location: 59,59 + Actor273: brik + Owner: USSR + Location: 39,60 + Actor275: n3c + Owner: USSR + SubCell: 3 + Facing: 512 + Location: 44,60 + CPowered7: tsla + Owner: USSR + Location: 45,60 + Actor277: brik + Owner: USSR + Location: 46,60 + Actor278: brik + Owner: USSR + Location: 47,60 + Actor279: rmbc + Owner: USSR + SubCell: 3 + Facing: 512 + Location: 48,60 + Actor280: rmbc + Owner: USSR + SubCell: 3 + Facing: 512 + Location: 50,60 + Actor281: brik + Owner: USSR + Location: 51,60 + Actor282: brik + Owner: USSR + Location: 52,60 + CPowered6: tsla + Owner: USSR + Location: 53,60 + Actor284: n3c + Owner: USSR + SubCell: 3 + Facing: 512 + Location: 54,60 + Actor286: brik + Owner: USSR + Location: 59,60 + Actor287: brik + Owner: USSR + Location: 39,61 + Actor288: brik + Owner: USSR + Location: 40,61 + Actor289: brik + Owner: USSR + Location: 41,61 + Actor290: brik + Owner: USSR + Location: 42,61 + Actor291: brik + Owner: USSR + Location: 43,61 + Actor292: brik + Owner: USSR + Location: 44,61 + Actor293: brik + Owner: USSR + Location: 45,61 + Actor294: brik + Owner: USSR + Location: 46,61 + Actor295: brik + Owner: USSR + Location: 47,61 + Actor296: brik + Owner: USSR + Location: 51,61 + Actor297: brik + Owner: USSR + Location: 52,61 + Actor298: brik + Owner: USSR + Location: 53,61 + Actor299: brik + Owner: USSR + Location: 54,61 + Actor300: brik + Owner: USSR + Location: 55,61 + Actor301: brik + Owner: USSR + Location: 56,61 + Actor302: brik + Owner: USSR + Location: 57,61 + Actor305: brik + Owner: USSR + Location: 58,61 + Actor306: brik + Owner: USSR + Location: 59,61 + Actor307: 3tnk.yuri + Owner: USSR + Location: 71,7 + Facing: 768 + PlayerStart: waypoint + Owner: Neutral + Location: 89,7 + Actor308: fix + Owner: USSR + Location: 62,6 + Actor309: sam + Owner: USSR + Location: 58,9 + Actor310: sam + Owner: USSR + Location: 66,9 + Actor311: brik + Owner: USSR + Location: 86,30 + Actor312: brik + Owner: USSR + Location: 90,30 + Actor313: brik + Owner: USSR + Location: 90,31 + Actor314: brik + Owner: USSR + Location: 91,30 + Actor315: brik + Owner: USSR + Location: 91,31 + Actor316: brik + Owner: USSR + Location: 92,30 + Actor317: brik + Owner: USSR + Location: 93,30 + Actor318: brik + Owner: USSR + Location: 93,31 + Actor319: brik + Owner: USSR + Location: 94,31 + Actor320: brik + Owner: USSR + Location: 94,30 + Actor321: brik + Owner: USSR + Location: 86,31 + Actor322: brik + Owner: USSR + Location: 85,31 + Actor323: brik + Owner: USSR + Location: 85,30 + Actor324: brik + Owner: USSR + Location: 84,30 + Actor325: brik + Owner: USSR + Location: 83,30 + Actor326: brik + Owner: USSR + Location: 82,30 + Actor327: brik + Owner: USSR + Location: 82,31 + Actor328: brik + Owner: USSR + Location: 83,31 + Actor329: brik + Owner: USSR + Location: 82,32 + Actor330: brik + Owner: USSR + Location: 82,33 + Actor331: brik + Owner: USSR + Location: 82,34 + Actor332: brik + Owner: USSR + Location: 82,35 + Actor333: brik + Owner: USSR + Location: 82,36 + Actor334: brik + Owner: USSR + Location: 82,37 + Actor335: brik + Owner: USSR + Location: 82,38 + Actor336: brik + Owner: USSR + Location: 83,38 + Actor337: brik + Owner: USSR + Location: 83,37 + Actor338: brik + Owner: USSR + Location: 95,30 + Actor339: brik + Owner: USSR + Location: 96,30 + Actor340: brik + Owner: USSR + Location: 96,31 + Actor341: brik + Owner: USSR + Location: 96,32 + Actor342: brik + Owner: USSR + Location: 96,33 + Actor343: brik + Owner: USSR + Location: 96,34 + Actor344: brik + Owner: USSR + Location: 96,35 + Actor345: brik + Owner: USSR + Location: 96,36 + Actor346: brik + Owner: USSR + Location: 96,37 + Actor347: brik + Owner: USSR + Location: 96,38 + Actor348: brik + Owner: USSR + Location: 96,39 + Actor349: brik + Owner: USSR + Location: 82,42 + Actor350: brik + Owner: USSR + Location: 83,42 + Actor351: brik + Owner: USSR + Location: 82,43 + Actor352: brik + Owner: USSR + Location: 83,43 + Actor353: brik + Owner: USSR + Location: 82,44 + Actor354: brik + Owner: USSR + Location: 82,45 + Actor355: brik + Owner: USSR + Location: 82,46 + Actor356: brik + Owner: USSR + Location: 83,46 + Actor357: brik + Owner: USSR + Location: 84,46 + Actor358: brik + Owner: USSR + Location: 85,46 + Actor359: brik + Owner: USSR + Location: 86,46 + Actor360: brik + Owner: USSR + Location: 87,46 + Actor361: brik + Owner: USSR + Location: 88,46 + Actor362: brik + Owner: USSR + Location: 89,46 + Actor363: brik + Owner: USSR + Location: 90,46 + Actor364: brik + Owner: USSR + Location: 91,46 + Actor365: brik + Owner: USSR + Location: 92,46 + Actor366: brik + Owner: USSR + Location: 93,46 + Actor367: brik + Owner: USSR + Location: 95,46 + Actor368: brik + Owner: USSR + Location: 94,46 + Actor369: brik + Owner: USSR + Location: 96,46 + Actor370: brik + Owner: USSR + Location: 96,44 + Actor371: brik + Owner: USSR + Location: 96,42 + Actor372: brik + Owner: USSR + Location: 96,41 + Actor373: brik + Owner: USSR + Location: 96,40 + Actor374: brik + Owner: USSR + Location: 96,43 + Actor375: brik + Owner: USSR + Location: 96,45 + EPower3: tpwr + Owner: USSR + Location: 93,43 + EPower2: tpwr + Owner: USSR + Location: 90,43 + EPower1: tpwr + Owner: USSR + Location: 87,43 + EPowered2: tsla + Owner: USSR + Location: 84,31 + EPowered3: tsla + Owner: USSR + Location: 92,31 + EPowered1: tsla + Owner: USSR + Location: 83,36 + Actor382: ftur + Owner: USSR + Location: 81,38 + Actor383: ftur + Owner: USSR + Location: 86,29 + Actor384: ftur + Owner: USSR + Location: 90,29 + Actor385: ftur + Owner: USSR + Location: 81,42 + EPowered4: sam + Owner: USSR + Location: 83,33 + EPowered5: sam + Owner: USSR + Location: 83,45 + Actor407: brik + Owner: USSR + Location: 40,6 + Actor408: brik + Owner: USSR + Location: 39,6 + Actor409: brik + Owner: USSR + Location: 39,5 + Actor410: brik + Owner: USSR + Location: 40,5 + Actor411: brik + Owner: USSR + Location: 40,4 + Actor412: brik + Owner: USSR + Location: 40,3 + Actor413: brik + Owner: USSR + Location: 40,2 + Actor414: brik + Owner: USSR + Location: 40,1 + Actor415: brik + Owner: USSR + Location: 39,1 + Actor416: brik + Owner: USSR + Location: 39,2 + Actor417: brik + Owner: USSR + Location: 39,11 + Actor418: brik + Owner: USSR + Location: 39,10 + Actor419: brik + Owner: USSR + Location: 40,10 + Actor420: brik + Owner: USSR + Location: 40,11 + Actor421: brik + Owner: USSR + Location: 40,12 + Actor422: brik + Owner: USSR + Location: 40,13 + Actor423: brik + Owner: USSR + Location: 40,14 + Actor424: brik + Owner: USSR + Location: 40,15 + Actor425: brik + Owner: USSR + Location: 40,16 + Actor426: brik + Owner: USSR + Location: 39,16 + Actor427: brik + Owner: USSR + Location: 38,16 + Actor428: brik + Owner: USSR + Location: 37,16 + Actor429: brik + Owner: USSR + Location: 36,16 + Actor430: brik + Owner: USSR + Location: 35,16 + Actor431: brik + Owner: USSR + Location: 34,16 + Actor432: brik + Owner: USSR + Location: 33,16 + Actor433: brik + Owner: USSR + Location: 33,16 + Actor434: brik + Owner: USSR + Location: 32,16 + Actor435: brik + Owner: USSR + Location: 32,15 + Actor436: brik + Owner: USSR + Location: 33,15 + Actor437: brik + Owner: USSR + Location: 28,15 + Actor438: brik + Owner: USSR + Location: 28,16 + Actor439: brik + Owner: USSR + Location: 27,15 + Actor440: brik + Owner: USSR + Location: 27,16 + Actor441: brik + Owner: USSR + Location: 26,16 + Actor442: brik + Owner: USSR + Location: 25,16 + Actor443: brik + Owner: USSR + Location: 25,16 + Actor475: brik + Owner: USSR + Location: 25,1 + Actor476: brik + Owner: USSR + Location: 26,1 + Actor477: brik + Owner: USSR + Location: 27,1 + Actor478: brik + Owner: USSR + Location: 28,1 + Actor479: brik + Owner: USSR + Location: 29,1 + Actor480: brik + Owner: USSR + Location: 30,1 + Actor481: brik + Owner: USSR + Location: 31,1 + Actor482: brik + Owner: USSR + Location: 32,1 + Actor483: brik + Owner: USSR + Location: 33,1 + Actor484: brik + Owner: USSR + Location: 34,1 + Actor485: brik + Owner: USSR + Location: 35,1 + Actor486: brik + Owner: USSR + Location: 37,1 + Actor487: brik + Owner: USSR + Location: 36,1 + Actor488: brik + Owner: USSR + Location: 38,1 + NPowered2: tsla + Owner: USSR + Location: 34,15 + NPowered1: tsla + Owner: USSR + Location: 26,15 + NPowered3: tsla + Owner: USSR + Location: 39,12 + NPowered4: tsla + Owner: USSR + Location: 39,4 + NPowered6: sam + Owner: USSR + Location: 38,15 + NTibFacility: bio + Owner: USSR + Location: 28,4 + Actor499: chain + Owner: USSR + Location: 28,2 + Actor500: chain + Owner: USSR + Location: 27,2 + Actor501: chain + Owner: USSR + Location: 26,2 + Actor502: chain + Owner: USSR + Location: 29,2 + Actor503: chain + Owner: USSR + Location: 30,2 + Actor504: chain + Owner: USSR + Location: 31,2 + Actor505: chain + Owner: USSR + Location: 31,3 + Actor506: chain + Owner: USSR + Location: 26,3 + Actor507: chain + Owner: USSR + Location: 26,4 + Actor508: chain + Owner: USSR + Location: 26,6 + Actor509: chain + Owner: USSR + Location: 26,5 + Actor510: chain + Owner: USSR + Location: 26,7 + Actor511: chain + Owner: USSR + Location: 27,7 + Actor512: chain + Owner: USSR + Location: 31,7 + Actor513: chain + Owner: USSR + Location: 30,7 + Actor514: chain + Owner: USSR + Location: 31,6 + Actor515: chain + Owner: USSR + Location: 31,5 + Actor516: chain + Owner: USSR + Location: 31,4 + Actor517: barb + Owner: USSR + Location: 25,2 + Actor518: barb + Owner: USSR + Location: 25,3 + Actor519: barb + Owner: USSR + Location: 25,4 + Actor520: barb + Owner: USSR + Location: 32,2 + Actor521: barb + Owner: USSR + Location: 32,3 + Actor522: barb + Owner: USSR + Location: 32,4 + Actor523: barb + Owner: USSR + Location: 25,5 + Actor524: barb + Owner: USSR + Location: 32,5 + Actor496: weap + Owner: USSR + Location: 34,2 + Actor529: ftur + Owner: USSR + Location: 28,17 + Actor530: ftur + Owner: USSR + Location: 32,17 + Actor531: ftur + Owner: USSR + Location: 41,10 + Actor532: ftur + Owner: USSR + Location: 41,6 + Actor536: silo + Owner: USSR + Location: 95,39 + Actor534: silo + Owner: USSR + Location: 95,37 + Actor535: silo + Owner: USSR + Location: 95,35 + Actor456: brik + Owner: USSR + Location: 24,1 + Actor539: brik + Owner: USSR + Location: 24,16 + Actor452: brik + Owner: USSR + Location: 17,1 + Actor453: brik + Owner: USSR + Location: 18,1 + Actor454: brik + Owner: USSR + Location: 19,1 + Actor455: brik + Owner: USSR + Location: 20,1 + Actor457: brik + Owner: USSR + Location: 21,1 + Actor458: brik + Owner: USSR + Location: 22,1 + Actor459: brik + Owner: USSR + Location: 23,1 + NPower1: tpwr + Owner: USSR + Location: 18,2 + NPower2: tpwr + Owner: USSR + Location: 21,2 + Actor528: brik + Owner: USSR + Location: 17,16 + Actor537: brik + Owner: USSR + Location: 18,16 + Actor538: brik + Owner: USSR + Location: 19,16 + Actor540: brik + Owner: USSR + Location: 20,16 + Actor541: brik + Owner: USSR + Location: 21,16 + Actor542: brik + Owner: USSR + Location: 22,16 + Actor543: brik + Owner: USSR + Location: 23,16 + Actor474: brik + Owner: USSR + Location: 15,1 + Actor493: brik + Owner: USSR + Location: 16,1 + Actor494: brik + Owner: USSR + Location: 15,2 + Actor525: brik + Owner: USSR + Location: 15,3 + Actor527: brik + Owner: USSR + Location: 15,4 + Actor544: brik + Owner: USSR + Location: 15,5 + Actor545: brik + Owner: USSR + Location: 16,5 + Actor546: brik + Owner: USSR + Location: 15,6 + Actor547: brik + Owner: USSR + Location: 16,6 + Actor548: brik + Owner: USSR + Location: 15,10 + Actor549: brik + Owner: USSR + Location: 16,10 + Actor550: brik + Owner: USSR + Location: 15,11 + Actor551: brik + Owner: USSR + Location: 16,11 + Actor552: brik + Owner: USSR + Location: 15,12 + Actor553: brik + Owner: USSR + Location: 15,13 + Actor554: brik + Owner: USSR + Location: 15,14 + Actor555: brik + Owner: USSR + Location: 15,15 + NPowered5: sam + Owner: USSR + Location: 16,15 + Actor557: brik + Owner: USSR + Location: 15,16 + Actor558: brik + Owner: USSR + Location: 16,16 + NPower3: tpwr + Owner: USSR + Location: 20,5 + Actor559: silo + Owner: USSR + Location: 63,2 + Actor560: katy + Owner: USSR + Facing: 384 + Location: 18,6 + NPower4: tpwr + Owner: USSR + Location: 29,10 + NTibTruck: truk + Owner: USSR + Location: 28,6 + Facing: 634 + Actor564: barr + Owner: USSR + Location: 22,9 + Actor568: brik + Owner: USSR + Location: 14,74 + Actor569: brik + Owner: USSR + Location: 15,74 + Actor570: brik + Owner: USSR + Location: 16,74 + Actor571: brik + Owner: USSR + Location: 17,74 + Actor572: brik + Owner: USSR + Location: 18,74 + Actor573: brik + Owner: USSR + Location: 22,74 + Actor574: brik + Owner: USSR + Location: 23,74 + Actor575: brik + Owner: USSR + Location: 24,74 + Actor576: brik + Owner: USSR + Location: 25,74 + Actor577: brik + Owner: USSR + Location: 26,74 + Actor579: brik + Owner: USSR + Location: 17,75 + Actor580: brik + Owner: USSR + Location: 18,75 + Actor581: brik + Owner: USSR + Location: 22,75 + Actor582: brik + Owner: USSR + Location: 23,75 + Actor583: brik + Owner: USSR + Location: 25,75 + Actor584: brik + Owner: USSR + Location: 26,75 + Actor586: brik + Owner: USSR + Location: 26,76 + Actor587: brik + Owner: USSR + Location: 11,77 + Actor588: brik + Owner: USSR + Location: 26,77 + Actor589: brik + Owner: USSR + Location: 27,77 + Actor590: brik + Owner: USSR + Location: 28,77 + Actor591: brik + Owner: USSR + Location: 29,77 + Actor592: brik + Owner: USSR + Location: 11,78 + Actor593: brik + Owner: USSR + Location: 29,78 + Actor594: brik + Owner: USSR + Location: 11,79 + Actor595: brik + Owner: USSR + Location: 12,79 + Actor596: brik + Owner: USSR + Location: 28,79 + Actor597: brik + Owner: USSR + Location: 29,79 + Actor598: brik + Owner: USSR + Location: 11,80 + Actor599: brik + Owner: USSR + Location: 12,80 + Actor600: brik + Owner: USSR + Location: 28,80 + Actor601: brik + Owner: USSR + Location: 29,80 + Actor602: brik + Owner: USSR + Location: 11,84 + Actor603: brik + Owner: USSR + Location: 12,84 + Actor604: brik + Owner: USSR + Location: 28,84 + Actor605: brik + Owner: USSR + Location: 29,84 + Actor606: brik + Owner: USSR + Location: 11,85 + Actor607: brik + Owner: USSR + Location: 12,85 + Actor608: brik + Owner: USSR + Location: 28,85 + Actor609: brik + Owner: USSR + Location: 29,85 + Actor610: brik + Owner: USSR + Location: 11,86 + Actor611: brik + Owner: USSR + Location: 29,86 + Actor612: brik + Owner: USSR + Location: 11,87 + Actor613: brik + Owner: USSR + Location: 28,87 + Actor614: brik + Owner: USSR + Location: 29,87 + Actor615: brik + Owner: USSR + Location: 11,88 + Actor616: brik + Owner: USSR + Location: 12,88 + Actor617: brik + Owner: USSR + Location: 28,88 + Actor618: brik + Owner: USSR + Location: 28,88 + Actor619: brik + Owner: USSR + Location: 29,88 + Actor620: brik + Owner: USSR + Location: 12,89 + Actor621: brik + Owner: USSR + Location: 28,89 + Actor622: brik + Owner: USSR + Location: 29,89 + Actor623: brik + Owner: USSR + Location: 12,90 + Actor624: brik + Owner: USSR + Location: 13,90 + Actor625: brik + Owner: USSR + Location: 14,90 + Actor626: brik + Owner: USSR + Location: 14,90 + Actor627: brik + Owner: USSR + Location: 15,90 + Actor628: brik + Owner: USSR + Location: 16,90 + Actor629: brik + Owner: USSR + Location: 17,90 + Actor630: brik + Owner: USSR + Location: 18,90 + Actor631: brik + Owner: USSR + Location: 19,90 + Actor632: brik + Owner: USSR + Location: 20,90 + Actor633: brik + Owner: USSR + Location: 21,90 + Actor634: brik + Owner: USSR + Location: 22,90 + Actor635: brik + Owner: USSR + Location: 23,90 + Actor636: brik + Owner: USSR + Location: 24,90 + Actor637: brik + Owner: USSR + Location: 25,90 + Actor638: brik + Owner: USSR + Location: 26,90 + Actor639: brik + Owner: USSR + Location: 27,90 + Actor640: brik + Owner: USSR + Location: 28,90 + Actor641: brik + Owner: USSR + Location: 29,90 + SPowered3: tsla + Owner: USSR + Location: 28,78 + SPowered2: tsla + Owner: USSR + Location: 24,75 + SPowered4: tsla + Owner: USSR + Location: 28,86 + SPowered1: tsla + Owner: USSR + Location: 16,75 + Actor387: chain + Owner: USSR + Location: 87,34 + Actor386: chain + Owner: USSR + Location: 88,34 + Actor388: chain + Owner: USSR + Location: 89,34 + Actor396: chain + Owner: USSR + Location: 90,34 + Actor397: chain + Owner: USSR + Location: 91,34 + Actor398: chain + Owner: USSR + Location: 92,34 + Actor389: chain + Owner: USSR + Location: 87,35 + Actor399: chain + Owner: USSR + Location: 92,35 + Actor390: chain + Owner: USSR + Location: 87,36 + ETibFacility: bio + Owner: USSR + Location: 89,36 + Actor400: chain + Owner: USSR + Location: 92,36 + Actor391: chain + Owner: USSR + Location: 87,37 + Actor401: chain + Owner: USSR + Location: 92,37 + Actor392: chain + Owner: USSR + Location: 87,38 + ETibTruck: truk + Owner: USSR + Location: 89,38 + Facing: 634 + Actor402: chain + Owner: USSR + Location: 92,38 + Actor393: chain + Owner: USSR + Location: 87,39 + Actor394: chain + Owner: USSR + Location: 88,39 + Actor404: chain + Owner: USSR + Location: 91,39 + Actor403: chain + Owner: USSR + Location: 92,39 + Actor646: chain + Owner: USSR + Location: 15,82 + Actor647: chain + Owner: USSR + Location: 16,82 + Actor648: chain + Owner: USSR + Location: 17,82 + Actor649: chain + Owner: USSR + Location: 18,82 + Actor650: chain + Owner: USSR + Location: 19,82 + Actor651: chain + Owner: USSR + Location: 20,82 + Actor652: chain + Owner: USSR + Location: 15,83 + Actor653: chain + Owner: USSR + Location: 20,83 + Actor654: chain + Owner: USSR + Location: 15,84 + STibFacility: bio + Owner: USSR + Location: 17,84 + Actor657: chain + Owner: USSR + Location: 15,85 + Actor659: chain + Owner: USSR + Location: 15,86 + Actor661: chain + Owner: USSR + Location: 20,86 + Actor662: chain + Owner: USSR + Location: 15,87 + Actor663: chain + Owner: USSR + Location: 16,87 + Actor664: chain + Owner: USSR + Location: 19,87 + Actor665: chain + Owner: USSR + Location: 20,87 + Actor656: chain + Owner: USSR + Location: 17,87 + Actor658: chain + Owner: USSR + Location: 18,87 + STibTruck: truk + Owner: USSR + Location: 19,84 + Facing: 634 + Actor671: chain + Owner: USSR + Location: 83,78 + Actor672: chain + Owner: USSR + Location: 84,78 + Actor673: chain + Owner: USSR + Location: 85,78 + Actor674: chain + Owner: USSR + Location: 86,78 + Actor675: chain + Owner: USSR + Location: 83,79 + Actor677: silo + Owner: USSR + Location: 84,79 + Actor679: silo + Owner: USSR + Location: 85,79 + Actor681: chain + Owner: USSR + Location: 86,79 + Actor683: chain + Owner: USSR + Location: 83,80 + Actor685: silo + Owner: USSR + Location: 84,80 + Actor686: silo + Owner: USSR + Location: 85,80 + Actor687: chain + Owner: USSR + Location: 86,80 + Actor688: chain + Owner: USSR + Location: 83,81 + Actor689: silo + Owner: USSR + Location: 84,81 + Actor690: silo + Owner: USSR + Location: 85,81 + Actor691: chain + Owner: USSR + Location: 86,81 + Actor692: chain + Owner: USSR + Location: 83,82 + Actor693: chain + Owner: USSR + Location: 84,82 + Actor694: chain + Owner: USSR + Location: 85,82 + Actor695: chain + Owner: USSR + Location: 86,82 + Actor668: sam + Owner: USSR + Location: 75,75 + Actor669: sam + Owner: USSR + Location: 83,88 + Actor676: fix + Owner: USSR + Location: 78,84 + Actor682: ftur + Owner: USSR + Location: 83,72 + Actor684: ftur + Owner: USSR + Location: 87,87 + Actor660: ftur + Owner: USSR + Location: 72,87 + Actor667: fenc + Owner: USSR + Location: 72,86 + Actor678: fenc + Owner: USSR + Location: 73,86 + Actor680: fenc + Owner: USSR + Location: 73,87 + Actor696: fenc + Owner: USSR + Location: 83,73 + Actor697: fenc + Owner: USSR + Location: 83,74 + Actor698: fenc + Owner: USSR + Location: 82,72 + Actor699: fenc + Owner: USSR + Location: 82,73 + Actor700: fenc + Owner: USSR + Location: 86,87 + Actor701: fenc + Owner: USSR + Location: 86,86 + Actor702: fenc + Owner: USSR + Location: 87,86 + Actor703: fenc + Owner: USSR + Location: 85,86 + Actor704: fenc + Owner: USSR + Location: 73,85 + SPower3: tpwr + Owner: USSR + Location: 8,74 + SPower1: tpwr + Owner: USSR + Location: 8,71 + SPower2: tpwr + Owner: USSR + Location: 11,71 + Actor645: brik + Owner: USSR + Location: 7,70 + Actor655: brik + Owner: USSR + Location: 14,73 + Actor666: brik + Owner: USSR + Location: 14,72 + Actor705: brik + Owner: USSR + Location: 14,71 + Actor706: brik + Owner: USSR + Location: 14,70 + Actor707: brik + Owner: USSR + Location: 12,70 + Actor708: brik + Owner: USSR + Location: 9,70 + Actor709: brik + Owner: USSR + Location: 8,70 + Actor710: brik + Owner: USSR + Location: 10,70 + Actor711: brik + Owner: USSR + Location: 11,70 + Actor712: brik + Owner: USSR + Location: 13,70 + Actor714: brik + Owner: USSR + Location: 7,71 + Actor716: brik + Owner: USSR + Location: 7,72 + Actor717: brik + Owner: USSR + Location: 7,73 + Actor718: brik + Owner: USSR + Location: 7,74 + Actor719: brik + Owner: USSR + Location: 7,75 + Actor720: brik + Owner: USSR + Location: 7,76 + Actor721: brik + Owner: USSR + Location: 7,77 + Actor722: brik + Owner: USSR + Location: 8,77 + Actor723: brik + Owner: USSR + Location: 9,77 + Actor724: brik + Owner: USSR + Location: 10,77 + Actor713: brik + Owner: USSR + Location: 7,69 + Actor715: brik + Owner: USSR + Location: 6,69 + Actor725: brik + Owner: USSR + Location: 6,70 + Actor726: brik + Owner: USSR + Location: 6,71 + Actor727: brik + Owner: USSR + Location: 8,69 + Actor728: brik + Owner: USSR + Location: 13,69 + Actor729: brik + Owner: USSR + Location: 14,69 + Actor730: brik + Owner: USSR + Location: 15,69 + Actor731: brik + Owner: USSR + Location: 15,70 + Actor732: brik + Owner: USSR + Location: 15,71 + Actor733: brik + Owner: USSR + Location: 6,76 + Actor734: brik + Owner: USSR + Location: 6,77 + Actor735: brik + Owner: USSR + Location: 6,78 + Actor736: brik + Owner: USSR + Location: 7,78 + Actor737: brik + Owner: USSR + Location: 8,78 + Actor738: ftur + Owner: USSR + Location: 7,68 + Actor739: ftur + Owner: USSR + Location: 14,68 + Actor740: ftur + Owner: USSR + Location: 10,85 + Actor741: ftur + Owner: USSR + Location: 30,80 + Actor742: ftur + Owner: USSR + Location: 30,84 + Actor743: ftur + Owner: USSR + Location: 18,73 + Actor744: ftur + Owner: USSR + Location: 22,73 + Actor748: tc04 + Owner: Neutral + Location: 80,18 + Actor749: tc01 + Owner: Neutral + Location: 92,15 + Actor750: tc02 + Owner: Neutral + Location: 66,18 + Actor751: t15 + Owner: Neutral + Location: 68,15 + Actor752: t10 + Owner: Neutral + Location: 75,4 + Actor753: t13 + Owner: Neutral + Location: 74,18 + Actor754: tc01 + Owner: Neutral + Location: 69,33 + Actor755: tc03 + Owner: Neutral + Location: 75,32 + Actor756: t13 + Owner: Neutral + Location: 93,26 + Actor757: t12 + Owner: Neutral + Location: 69,39 + Actor758: t06 + Owner: Neutral + Location: 60,27 + Actor759: t03 + Owner: Neutral + Location: 50,13 + Actor760: t02 + Owner: Neutral + Location: 47,2 + Actor761: tc05 + Owner: Neutral + Location: 24,28 + Actor762: t16 + Owner: Neutral + Location: 20,19 + Actor763: t08 + Owner: Neutral + Location: 18,21 + Actor764: t08 + Owner: Neutral + Location: 9,24 + Actor765: t03 + Owner: Neutral + Location: 6,19 + Actor766: tc03 + Owner: Neutral + Location: 7,1 + Actor767: tc02 + Owner: Neutral + Location: 9,1 + Actor768: t11 + Owner: Neutral + Location: 4,2 + Actor769: t17 + Owner: Neutral + Location: 1,10 + Actor770: t02 + Owner: Neutral + Location: 2,23 + Actor771: t02 + Owner: Neutral + Location: 80,49 + Actor772: t16 + Owner: Neutral + Location: 84,60 + Actor773: tc02 + Owner: Neutral + Location: 89,65 + Actor774: tc04 + Owner: Neutral + Location: 93,81 + Actor775: t13 + Owner: Neutral + Location: 93,75 + Actor776: t08 + Owner: Neutral + Location: 64,93 + Actor777: tc01 + Owner: Neutral + Location: 68,94 + Actor778: tc02 + Owner: Neutral + Location: 56,81 + Actor779: tc05 + Owner: Neutral + Location: 40,72 + Actor780: t11 + Owner: Neutral + Location: 44,74 + Actor781: t13 + Owner: Neutral + Location: 37,73 + Actor782: t06 + Owner: Neutral + Location: 45,72 + Actor783: t12 + Owner: Neutral + Location: 45,76 + Actor784: t16 + Owner: Neutral + Location: 39,74 + Actor785: tc03 + Owner: Neutral + Location: 45,84 + Actor786: t17 + Owner: Neutral + Location: 44,81 + Actor787: t07 + Owner: Neutral + Location: 34,92 + Actor788: t06 + Owner: Neutral + Location: 27,60 + Actor789: t08 + Owner: Neutral + Location: 10,59 + Actor790: tc04 + Owner: Neutral + Location: 12,55 + Actor791: t02 + Owner: Neutral + Location: 8,53 + Actor792: t15 + Owner: Neutral + Location: 12,38 + Actor793: t03 + Owner: Neutral + Location: 25,41 + Actor794: tc01 + Owner: Neutral + Location: 30,35 + Actor795: tc03 + Owner: Neutral + Location: 61,32 + Actor796: t16 + Owner: Neutral + Location: 32,34 + Actor797: tc05 + Owner: Neutral + Location: 64,42 + Actor798: t13 + Owner: Neutral + Location: 63,39 + Actor799: t11 + Owner: Neutral + Location: 34,42 + Actor800: t11 + Owner: Neutral + Location: 50,33 + Actor801: t12 + Owner: Neutral + Location: 48,34 + Actor802: t12 + Owner: Neutral + Location: 37,19 + Actor803: t03 + Owner: Neutral + Location: 23,64 + Actor804: t11 + Owner: Neutral + Location: 23,58 + Actor805: t13 + Owner: Neutral + Location: 26,53 + Actor806: tc01 + Owner: Neutral + Location: 13,47 + Actor807: t10 + Owner: Neutral + Location: 4,44 + Actor808: t13 + Owner: Neutral + Location: 2,38 + Actor809: t12 + Owner: Neutral + Location: 1,40 + Actor810: t02 + Owner: Neutral + Location: 6,46 + Actor811: t06 + Owner: Neutral + Location: 2,59 + Actor812: t05 + Owner: Neutral + Location: 3,71 + Actor813: t07 + Owner: Neutral + Location: 27,67 + Actor814: t07 + Owner: Neutral + Location: 27,93 + Actor815: t12 + Owner: Neutral + Location: 12,93 + Actor816: t13 + Owner: Neutral + Location: 31,94 + Actor817: t07 + Owner: Neutral + Location: 39,92 + Actor818: t06 + Owner: Neutral + Location: 67,81 + Actor819: t06 + Owner: Neutral + Location: 78,65 + Actor820: tc02 + Owner: Neutral + Location: 72,57 + Actor821: t16 + Owner: Neutral + Location: 91,64 + Actor822: t17 + Owner: Neutral + Location: 91,52 + Actor823: t13 + Owner: Neutral + Location: 81,51 + Actor824: t08 + Owner: Neutral + Location: 71,43 + Actor825: ice01 + Owner: Neutral + Location: 59,66 + Actor826: t16 + Owner: Neutral + Location: 61,65 + Actor827: t14 + Owner: Neutral + Location: 52,68 + Actor828: t03 + Owner: Neutral + Location: 65,61 + Actor829: t02 + Owner: Neutral + Location: 62,74 + Actor830: t05 + Owner: Neutral + Location: 35,85 + Actor831: tc03 + Owner: Neutral + Location: 79,90 + Actor832: t13 + Owner: Neutral + Location: 78,94 + Actor833: t14 + Owner: Neutral + Location: 88,92 + Actor834: t16 + Owner: Neutral + Location: 93,89 + Actor835: t13 + Owner: Neutral + Location: 93,95 + Actor836: t16 + Owner: Neutral + Location: 70,95 + Actor837: 3tnk.atomicyuri + Owner: USSR + Location: 47,62 + Facing: 512 + Actor838: 3tnk.atomicyuri + Owner: USSR + Location: 51,62 + Facing: 512 + Actor839: 3tnk.atomicyuri + Owner: USSR + Location: 60,53 + Facing: 768 + Actor840: 3tnk.atomicyuri + Owner: USSR + Location: 60,49 + Facing: 768 + Actor841: 3tnk.atomicyuri + Owner: USSR + Location: 51,40 + Facing: 0 + Actor842: 3tnk.atomicyuri + Owner: USSR + Location: 47,40 + Facing: 0 + Actor843: 3tnk.atomicyuri + Owner: USSR + Location: 38,49 + Facing: 256 + Actor844: 3tnk.atomicyuri + Owner: USSR + Location: 38,53 + Facing: 256 + Actor845: silo + Owner: USSR + Location: 12,86 + Actor846: silo + Owner: USSR + Location: 12,87 + Actor847: silo + Owner: USSR + Location: 20,15 + Actor848: silo + Owner: USSR + Location: 22,15 + Actor849: dome + Owner: USSR + Location: 80,80 + Actor850: stek + Owner: USSR + Location: 17,79 + Actor851: 4tnk + Owner: USSR + Location: 32,82 + Facing: 761 + Actor852: 4tnk + Owner: USSR + Location: 20,71 + Facing: 0 + Actor853: ttra + Owner: USSR + Location: 18,76 + Facing: 0 + Actor854: 3tnk + Owner: USSR + Location: 42,8 + Facing: 769 + Actor855: 3tnk + Owner: USSR + Location: 30,18 + Facing: 523 + Actor856: hpad + Owner: USSR + Location: 75,84 + Actor859: sbag + Owner: USSR + Location: 2,19 + Actor865: sbag + Owner: USSR + Location: 3,19 + Actor866: sbag + Owner: USSR + Location: 4,19 + Actor869: sbag + Owner: USSR + Location: 2,20 + Actor870: silo + Owner: USSR + Location: 3,20 + Actor871: sbag + Owner: USSR + Location: 4,20 + Actor872: sbag + Owner: USSR + Location: 2,21 + Actor873: silo + Owner: USSR + Location: 3,21 + Actor874: sbag + Owner: USSR + Location: 4,21 + Actor875: sbag + Owner: USSR + Location: 2,22 + Actor876: sbag + Owner: USSR + Location: 3,22 + Actor877: sbag + Owner: USSR + Location: 4,22 + Actor857: sbag + Owner: USSR + Location: 2,48 + Actor858: sbag + Owner: USSR + Location: 3,48 + Actor860: sbag + Owner: USSR + Location: 4,48 + Actor861: sbag + Owner: USSR + Location: 2,49 + Actor862: silo + Owner: USSR + Location: 3,49 + Actor863: sbag + Owner: USSR + Location: 4,49 + Actor864: sbag + Owner: USSR + Location: 2,50 + Actor867: silo + Owner: USSR + Location: 3,50 + Actor868: sbag + Owner: USSR + Location: 4,50 + Actor878: sbag + Owner: USSR + Location: 2,51 + Actor879: sbag + Owner: USSR + Location: 3,51 + Actor880: sbag + Owner: USSR + Location: 4,51 + Actor881: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 27,17 + Actor882: e1 + Owner: USSR + SubCell: 3 + Location: 32,18 + Facing: 618 + Actor883: e1 + Owner: USSR + SubCell: 3 + Location: 34,17 + Facing: 642 + Actor884: e1 + Owner: USSR + SubCell: 3 + Location: 41,11 + Facing: 737 + Actor885: e1 + Owner: USSR + SubCell: 3 + Location: 44,9 + Facing: 800 + Actor886: e1 + Owner: USSR + SubCell: 3 + Location: 43,6 + Facing: 674 + Actor887: e1 + Owner: USSR + SubCell: 3 + Location: 71,4 + Facing: 634 + Actor888: e1 + Owner: USSR + SubCell: 3 + Location: 71,11 + Facing: 848 + Actor889: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 61,12 + Actor890: e1 + Owner: USSR + SubCell: 3 + Location: 62,11 + Facing: 586 + Actor891: e1 + Owner: USSR + SubCell: 3 + Location: 55,9 + Facing: 384 + Actor892: e1 + Owner: USSR + SubCell: 3 + Location: 54,20 + Facing: 959 + Actor893: e1 + Owner: USSR + SubCell: 3 + Location: 56,22 + Facing: 1023 + Actor894: e1 + Owner: USSR + SubCell: 3 + Location: 58,21 + Facing: 999 + Actor895: e1 + Owner: USSR + SubCell: 3 + Location: 85,28 + Facing: 0 + Actor896: e1 + Owner: USSR + SubCell: 3 + Location: 91,28 + Facing: 0 + Actor897: e1 + Owner: USSR + SubCell: 3 + Location: 89,30 + Facing: 190 + Actor898: e1 + Owner: USSR + SubCell: 3 + Location: 80,37 + Facing: 166 + Actor899: e1 + Owner: USSR + SubCell: 3 + Location: 80,40 + Facing: 269 + Actor900: e1 + Owner: USSR + SubCell: 3 + Location: 79,43 + Facing: 384 + Actor901: e1 + Owner: USSR + SubCell: 3 + Location: 85,72 + Facing: 800 + Actor902: e1 + Owner: USSR + SubCell: 3 + Location: 79,71 + Facing: 0 + Actor903: e1 + Owner: USSR + SubCell: 3 + Location: 83,71 + Facing: 0 + Actor904: e1 + Owner: USSR + SubCell: 3 + Location: 87,88 + Facing: 689 + Actor905: e1 + Owner: USSR + SubCell: 3 + Location: 88,87 + Facing: 793 + Actor906: e1 + Owner: USSR + SubCell: 3 + Location: 89,85 + Facing: 650 + Actor907: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 74,90 + Actor908: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 71,88 + Actor909: e1 + Owner: USSR + SubCell: 3 + Location: 69,87 + Facing: 206 + Actor910: e1 + Owner: USSR + SubCell: 3 + Location: 32,80 + Facing: 642 + Actor912: e1 + Owner: USSR + SubCell: 3 + Location: 31,85 + Facing: 840 + Actor913: e1 + Owner: USSR + Location: 32,81 + SubCell: 1 + Facing: 705 + Actor911: e1 + Owner: USSR + SubCell: 3 + Location: 22,72 + Facing: 87 + Actor914: e1 + Owner: USSR + Location: 22,72 + SubCell: 1 + Facing: 0 + Actor915: e1 + Owner: USSR + SubCell: 3 + Location: 19,71 + Facing: 0 + Actor916: e1 + Owner: USSR + Location: 9,85 + SubCell: 3 + Facing: 384 + Actor917: e1 + Owner: USSR + SubCell: 3 + Location: 8,80 + Facing: 384 + Actor918: e1 + Owner: USSR + SubCell: 3 + Location: 4,77 + Facing: 237 + Actor919: e1 + Owner: USSR + Facing: 384 + Location: 4,77 + SubCell: 1 + Actor920: e1 + Owner: USSR + SubCell: 3 + Location: 4,67 + Facing: 840 + Actor921: e1 + Owner: USSR + SubCell: 3 + Location: 22,93 + Facing: 626 + Actor922: e1 + Owner: USSR + SubCell: 3 + Location: 32,90 + Facing: 618 + Actor923: e1 + Owner: USSR + SubCell: 3 + Location: 32,65 + Facing: 388 + Actor924: e1 + Owner: USSR + Location: 32,65 + SubCell: 1 + Facing: 182 + Actor925: e1 + Owner: USSR + SubCell: 3 + Location: 35,68 + Facing: 384 + Actor927: e1 + Owner: USSR + SubCell: 3 + Location: 71,49 + Facing: 705 + Actor928: e1 + Owner: USSR + SubCell: 3 + Location: 27,46 + Facing: 245 + Actor929: e1 + Owner: USSR + SubCell: 3 + Location: 38,29 + Facing: 721 + Actor930: e1 + Owner: USSR + Location: 38,29 + SubCell: 1 + Facing: 856 + Actor931: e1 + Owner: USSR + SubCell: 3 + Location: 31,25 + Facing: 832 + Actor932: e1 + Owner: USSR + SubCell: 3 + Location: 25,28 + Facing: 0 + Actor933: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 11,23 + Actor934: e1 + Owner: USSR + SubCell: 3 + Location: 9,17 + Facing: 658 + Actor935: e1 + Owner: USSR + Location: 9,17 + SubCell: 1 + Facing: 594 + Actor936: e1 + Owner: USSR + SubCell: 3 + Location: 4,17 + Facing: 610 + Actor937: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 13,6 + Actor938: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 12,4 + Actor939: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 14,12 + Actor940: e1 + Owner: USSR + SubCell: 3 + Location: 79,17 + Facing: 808 + Actor941: e1 + Owner: USSR + SubCell: 3 + Location: 83,19 + Facing: 721 + Actor942: e1 + Owner: USSR + Location: 83,19 + SubCell: 1 + Facing: 999 + Actor943: e1 + Owner: USSR + SubCell: 3 + Location: 79,19 + Facing: 1023 + Actor944: e1 + Owner: USSR + SubCell: 3 + Location: 71,19 + Facing: 1023 + Actor945: e1 + Owner: USSR + SubCell: 3 + Location: 48,28 + Facing: 0 + Actor946: e2 + Owner: USSR + SubCell: 3 + Location: 85,75 + Facing: 0 + Actor947: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 82,83 + Actor948: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 71,86 + Actor949: e2 + Owner: USSR + SubCell: 3 + Location: 86,90 + Facing: 547 + Actor950: e2 + Owner: USSR + Location: 80,40 + SubCell: 1 + Facing: 229 + Actor951: e2 + Owner: USSR + Location: 89,30 + SubCell: 1 + Facing: 71 + TurretFacing: 856 + Actor952: e2 + Owner: USSR + SubCell: 3 + Location: 78,20 + Facing: 927 + Actor953: e2 + Owner: USSR + SubCell: 3 + Location: 66,5 + Facing: 634 + Actor954: e2 + Owner: USSR + SubCell: 3 + Location: 60,5 + Facing: 666 + Actor955: e2 + Owner: USSR + Location: 56,22 + SubCell: 1 + Facing: 1023 + Actor956: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 13,10 + Actor957: e2 + Owner: USSR + SubCell: 3 + Location: 26,45 + Facing: 237 + Actor958: e2 + Owner: USSR + Location: 10,68 + SubCell: 3 + Facing: 0 + Actor959: e2 + Owner: USSR + SubCell: 3 + Location: 23,72 + Facing: 0 + Actor960: e2 + Owner: USSR + SubCell: 3 + Location: 35,85 + Facing: 666 + Actor961: e2 + Owner: USSR + SubCell: 3 + Location: 32,94 + Facing: 0 + Actor962: e2 + Owner: USSR + SubCell: 3 + Location: 68,66 + Facing: 753 + Actor963: e2 + Owner: USSR + Facing: 384 + Location: 89,65 + SubCell: 3 + Actor964: e2 + Owner: USSR + SubCell: 3 + Location: 89,53 + Facing: 491 + Actor965: e1 + Owner: USSR + SubCell: 3 + Location: 87,51 + Facing: 610 + Actor966: e1 + Owner: USSR + SubCell: 3 + Location: 24,11 + Facing: 634 + Actor967: e1 + Owner: USSR + SubCell: 3 + Location: 22,8 + Facing: 594 + Actor968: e1 + Owner: USSR + Location: 34,12 + SubCell: 3 + Facing: 491 + Actor969: e1 + Owner: USSR + Location: 35,11 + SubCell: 3 + Facing: 586 + Actor970: 3tnk + Owner: USSR + Location: 35,5 + Facing: 512 + Actor971: brut + Owner: USSR + SubCell: 3 + Location: 78,18 + Facing: 888 + Actor972: brut + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 92,41 + Actor973: brut + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 80,44 + Actor974: brut + Owner: USSR + SubCell: 3 + Location: 69,53 + Facing: 737 + Actor975: brut + Owner: USSR + SubCell: 3 + Location: 84,71 + Facing: 927 + Actor976: brut + Owner: USSR + SubCell: 3 + Location: 88,84 + Facing: 713 + Actor977: brut + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 72,90 + Actor978: brut + Owner: USSR + SubCell: 3 + Location: 32,83 + Facing: 793 + Actor979: brut + Owner: USSR + SubCell: 3 + Location: 23,70 + Facing: 118 + Actor980: brut + Owner: USSR + SubCell: 3 + Location: 33,67 + Facing: 348 + Actor981: brut + Owner: USSR + SubCell: 3 + Location: 6,50 + Facing: 880 + Actor982: brut + Owner: USSR + SubCell: 3 + Location: 14,28 + Facing: 816 + Actor983: brut + Owner: USSR + SubCell: 3 + Location: 5,20 + Facing: 689 + Actor984: brut + Owner: USSR + SubCell: 3 + Location: 32,20 + Facing: 499 + Actor985: brut + Owner: USSR + Facing: 384 + Location: 12,10 + SubCell: 3 + Actor986: brut + Owner: USSR + SubCell: 3 + Location: 42,10 + Facing: 769 + Actor987: brut + Owner: USSR + SubCell: 3 + Location: 56,21 + Facing: 0 + Actor988: brut + Owner: USSR + SubCell: 3 + Location: 42,30 + Facing: 840 + Actor989: brut + Owner: USSR + SubCell: 3 + Location: 39,77 + Facing: 626 + Actor990: e4 + Owner: USSR + SubCell: 3 + Location: 22,49 + Facing: 150 + Actor991: e4 + Owner: USSR + SubCell: 3 + Location: 8,20 + Facing: 674 + Actor992: e4 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 28,18 + Actor993: e4 + Owner: USSR + Location: 15,68 + SubCell: 3 + Facing: 0 + Actor994: e4 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 90,52 + Actor995: ivan + Owner: USSR + SubCell: 3 + Location: 77,80 + Facing: 570 + Actor996: e3 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 24,84 + Actor997: e3 + Owner: USSR + SubCell: 3 + Location: 16,81 + Facing: 384 + Actor998: e3 + Owner: USSR + Facing: 384 + Location: 6,75 + SubCell: 3 + Actor999: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 14,87 + Actor1000: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 37,73 + Actor1001: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 24,56 + Actor1003: e3 + Owner: USSR + Location: 23,12 + SubCell: 3 + Facing: 626 + Actor1004: e3 + Owner: USSR + SubCell: 3 + Location: 59,22 + Facing: 800 + Actor1005: e3 + Owner: USSR + Location: 84,77 + SubCell: 3 + Facing: 689 + Actor1006: e3 + Owner: USSR + SubCell: 3 + Location: 77,75 + Facing: 737 + Actor1007: e3 + Owner: USSR + Location: 84,87 + SubCell: 3 + Facing: 618 + Actor1008: e3 + Owner: USSR + SubCell: 3 + Location: 61,74 + Facing: 491 + Actor1009: e3 + Owner: USSR + SubCell: 3 + Location: 59,93 + Facing: 0 + Actor1010: e4 + Owner: USSR + SubCell: 3 + Location: 62,95 + TurretFacing: 0 + Facing: 0 + Actor1011: e1 + Owner: USSR + SubCell: 3 + Location: 43,93 + Facing: 674 + Actor1012: e1 + Owner: USSR + SubCell: 3 + Location: 45,88 + Facing: 745 + Actor1015: e1 + Owner: USSR + SubCell: 3 + Location: 4,37 + Facing: 927 + Actor1017: e1 + Owner: USSR + SubCell: 3 + Location: 4,38 + Facing: 721 + Actor1016: e8 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 22,80 + Actor1018: btr + Owner: USSR + Facing: 384 + Location: 77,82 + ETibTruckPath1: waypoint + Owner: Neutral + Location: 90,39 + ETibTruckPath2: waypoint + Owner: Neutral + Location: 76,40 + ETibTruckPath3: waypoint + Owner: Neutral + Location: 76,51 + ETibTruckPath4: waypoint + Owner: Neutral + Location: 51,51 + NTibTruckPath1: waypoint + Owner: Neutral + Location: 29,7 + NTibTruckPath2: waypoint + Owner: Neutral + Location: 27,10 + NTibTruckPath3: waypoint + Owner: Neutral + Location: 27,14 + NTibTruckPath4: waypoint + Owner: Neutral + Location: 30,14 + NTibTruckPath5: waypoint + Owner: Neutral + Location: 30,21 + NTibTruckPath6: waypoint + Owner: Neutral + Location: 35,21 + NTibTruckPath7: waypoint + Owner: Neutral + Location: 44,23 + NTibTruckPath8: waypoint + Owner: Neutral + Location: 44,37 + NTibTruckPath9: waypoint + Owner: Neutral + Location: 49,38 + NTibTruckPath10: waypoint + Owner: Neutral + Location: 49,49 + STibTruckPath1: waypoint + Owner: Neutral + Location: 21,84 + STibTruckPath2: waypoint + Owner: Neutral + Location: 20,70 + STibTruckPath3: waypoint + Owner: Neutral + Location: 29,71 + STibTruckPath4: waypoint + Owner: Neutral + Location: 36,64 + STibTruckPath5: waypoint + Owner: Neutral + Location: 49,65 + STibTruckPath6: waypoint + Owner: Neutral + Location: 49,52 + Hind1: hind + Owner: USSR + Location: 76,81 + Facing: 384 + Hind2: hind + Owner: USSR + Location: 82,79 + Facing: 384 + HindPatrol1: waypoint + Owner: Neutral + Location: 83,64 + HindPatrol2: waypoint + Owner: Neutral + Location: 79,82 + HindPatrol3: waypoint + Owner: Neutral + Location: 60,89 + HindPatrol4: waypoint + Owner: Neutral + Location: 39,86 + HindPatrol5: waypoint + Owner: Neutral + Location: 21,61 + HindPatrol6: waypoint + Owner: Neutral + Location: 18,46 + Actor1020: e1 + Owner: USSR + SubCell: 3 + Location: 5,49 + Facing: 800 + Actor1021: e1 + Owner: USSR + SubCell: 3 + Location: 6,53 + Facing: 0 + Actor1022: e2 + Owner: USSR + SubCell: 3 + Location: 7,51 + Facing: 832 + Actor1023: btr + Owner: USSR + Facing: 384 + Location: 91,55 + Actor1024: oilb + Owner: USSR + Location: 5,91 + Actor1027: oilb + Owner: USSR + Location: 46,74 + SPowered5: sam + Owner: USSR + Location: 26,89 + SPowered7: sam + Owner: USSR + Location: 13,76 + SPowered6: sam + Owner: USSR + Location: 13,89 + HindPatrol9: waypoint + Owner: Neutral + Location: 69,71 + HindPatrol8: waypoint + Owner: Neutral + Location: 50,69 + HindPatrol7: waypoint + Owner: Neutral + Location: 33,61 + Actor1028: camera + Owner: USSR + Location: 85,11 + Actor1029: camera + Owner: USSR + Location: 62,9 + Actor1030: camera + Owner: USSR + Location: 36,9 + Actor1031: camera + Owner: USSR + Location: 21,9 + Actor1032: camera + Owner: USSR + Location: 15,73 + Actor1033: camera + Owner: USSR + Location: 28,82 + Actor1034: camera + Owner: USSR + Location: 79,80 + Actor1035: camera + Owner: USSR + Location: 69,51 + Actor1036: camera + Owner: USSR + Location: 44,30 + Actor1037: camera + Owner: USSR + Location: 28,45 + Actor1038: camera + Owner: USSR + Location: 34,66 + Actor1039: camera + Owner: USSR + Location: 85,37 + Actor1040: camera + Owner: USSR + Location: 15,43 + Actor1041: camera + Owner: USSR + Location: 41,80 + Actor1042: s4 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 92,8 + Actor1043: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 88,6 + Actor1046: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 91,6 + Actor1047: s1 + Owner: Scrin + Facing: 384 + Location: 86,5 + SubCell: 3 + Actor1048: s1 + Owner: Scrin + Facing: 384 + Location: 93,10 + SubCell: 3 + Actor1044: e1 + Owner: USSR + SubCell: 3 + Facing: 745 + Location: 63,54 + Actor1045: e1 + Owner: USSR + SubCell: 3 + Facing: 705 + Location: 72,55 + Actor1051: seek + Owner: Scrin + Facing: 384 + Location: 84,8 + Actor1052: seek + Owner: Scrin + Facing: 384 + Location: 89,11 + EntranceReveal1: waypoint + Owner: Neutral + Location: 88,29 + EntranceReveal2: waypoint + Owner: Neutral + Location: 81,40 + EntranceReveal3: waypoint + Owner: Neutral + Location: 70,7 + EntranceReveal4: waypoint + Owner: Neutral + Location: 41,8 + EntranceReveal5: waypoint + Owner: Neutral + Location: 30,17 + EntranceReveal6: waypoint + Owner: Neutral + Location: 20,72 + EntranceReveal7: waypoint + Owner: Neutral + Location: 31,82 + Actor1049: e3 + Owner: USSR + SubCell: 3 + Facing: 198 + Location: 19,43 + Actor1050: e1 + Owner: USSR + SubCell: 3 + Facing: 39 + Location: 16,44 + Actor1053: btr + Owner: USSR + Facing: 118 + Location: 18,44 + Actor1055: e1 + Owner: USSR + SubCell: 1 + Facing: 103 + Location: 19,44 + Actor1019: oilb + Owner: USSR + Location: 73,79 + EntranceReveal8: waypoint + Owner: Neutral + Location: 38,51 + EntranceReveal9: waypoint + Owner: Neutral + Location: 49,40 + EntranceReveal10: waypoint + Owner: Neutral + Location: 60,51 + EntranceReveal11: waypoint + Owner: Neutral + Location: 49,62 + CPower3: tpwr + Owner: USSR + Location: 40,58 + CPower1: tpwr + Owner: USSR + Location: 40,42 + CPower2: tpwr + Owner: USSR + Location: 56,42 + CPower4: tpwr + Owner: USSR + Location: 56,58 + CPowered10: sam + Owner: USSR + Location: 54,45 + CPowered9: sam + Owner: USSR + Location: 43,45 + CPowered15: sam + Owner: USSR + Location: 43,57 + CPowered16: sam + Owner: USSR + Location: 54,57 + SouthEastBarracks: barr + Owner: USSR + Location: 76,77 + SouthWestBarracks: barr + Owner: USSR + Location: 23,78 + NorthWestBarracks: barr + Owner: USSR + Location: 33,9 + NorthEastBarracks: barr + Owner: USSR + Location: 66,2 + CPowered18: tsla + Owner: USSR + Location: 46,48 + CPowered17: tsla + Owner: USSR + Location: 52,48 + CPowered19: tsla + Owner: USSR + Location: 52,54 + CPowered20: tsla + Owner: USSR + Location: 46,54 + Actor1054: fenc + Owner: USSR + Location: 35,36 + Actor1056: fenc + Owner: USSR + Location: 34,36 + Actor1057: fenc + Owner: USSR + Location: 34,37 + Actor1058: fenc + Owner: USSR + Location: 34,38 + Actor1059: fenc + Owner: USSR + Location: 34,39 + Actor1060: fenc + Owner: USSR + Location: 37,39 + Actor1061: fenc + Owner: USSR + Location: 36,36 + Actor1062: fenc + Owner: USSR + Location: 37,36 + Actor1063: fenc + Owner: USSR + Location: 37,37 + Actor1064: fenc + Owner: USSR + Location: 37,38 + Actor1065: fenc + Owner: USSR + Location: 38,36 + Actor1066: fenc + Owner: USSR + Location: 33,38 + Actor1067: fenc + Owner: USSR + Location: 32,38 + Actor1068: fenc + Owner: USSR + Location: 33,39 + Actor1069: fenc + Owner: USSR + Location: 54,62 + Actor1070: fenc + Owner: USSR + Location: 55,62 + Actor1071: fenc + Owner: USSR + Location: 53,62 + Actor1072: fenc + Owner: USSR + Location: 56,62 + Actor1073: fenc + Owner: USSR + Location: 58,62 + Actor1074: fenc + Owner: USSR + Location: 57,62 + Actor1075: fenc + Owner: USSR + Location: 56,63 + Actor1076: fenc + Owner: USSR + Location: 56,64 + Actor1077: fenc + Owner: USSR + Location: 56,65 + Actor1078: fenc + Owner: USSR + Location: 56,66 + Actor1080: fenc + Owner: USSR + Location: 39,36 + Actor1081: fenc + Owner: USSR + Location: 40,36 + Actor1082: fenc + Owner: USSR + Location: 40,37 + Actor1083: fenc + Owner: USSR + Location: 40,38 + CentralBarracks: barr + Owner: USSR + Location: 38,37 + Actor1084: ftur + Owner: USSR + Location: 32,39 + Actor1085: ftur + Owner: USSR + Location: 55,66 + CentralDome: dome + Owner: USSR + Location: 35,37 + CentralHelipad: hpad + Owner: USSR + Location: 54,63 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-allegiances.yaml, ca|rules/custom/commando-mission.yaml, ca|missions/main-campaign/ca23-subjugation/subjugation-rules.yaml, ca|rules/custom/coop-rules.yaml, subjugation-coop-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml, ca|missions/main-campaign/ca23-subjugation/subjugation-weapons.yaml diff --git a/mods/ca/missions/coop-campaign/ca23-subjugation-coop/subjugation-coop-rules.yaml b/mods/ca/missions/coop-campaign/ca23-subjugation-coop/subjugation-coop-rules.yaml new file mode 100644 index 0000000000..65401008cd --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca23-subjugation-coop/subjugation-coop-rules.yaml @@ -0,0 +1,20 @@ +World: + LuaScript: + Scripts: campaign.lua, coop.lua, ca|missions/main-campaign/ca23-subjugation/subjugation.lua, subjugation-coop.lua + ScriptLobbyDropdown@basesharing: + Values: + -0: + Default: 1 + Locked: True + LobbyMissionInfo@InitialObjectives: + Prefix: Initial Objectives + Text: • Capture three Tiberium enrichment facilities.\n• Capture Yuri's command center. + LobbyMissionInfo@Notes: + Prefix: Note + Text: Respawns can be enabled for this mission. + PrefixColor: FF9900 + TextColor: FF9900 + +^BasicBuilding: + CreateProxyActorForAllies: + RequireValidFaction: False diff --git a/mods/ca/missions/coop-campaign/ca23-subjugation-coop/subjugation-coop.lua b/mods/ca/missions/coop-campaign/ca23-subjugation-coop/subjugation-coop.lua new file mode 100644 index 0000000000..83805f9e5f --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca23-subjugation-coop/subjugation-coop.lua @@ -0,0 +1,24 @@ + +SetupPlayers = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Multi2 = Player.GetPlayer("Multi2") + Multi3 = Player.GetPlayer("Multi3") + Multi4 = Player.GetPlayer("Multi4") + Multi5 = Player.GetPlayer("Multi5") + Scrin = Player.GetPlayer("Scrin") + USSR = Player.GetPlayer("USSR") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = Utils.Where({ Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 }, function(p) return p ~= nil end) + MissionEnemies = { USSR } + SinglePlayerPlayer = Scrin + CoopInit() +end + +AfterWorldLoaded = function() + +end + +AfterTick = function() + +end diff --git a/mods/ca/missions/coop-campaign/ca24-culmination-coop/culmination-coop-rules.yaml b/mods/ca/missions/coop-campaign/ca24-culmination-coop/culmination-coop-rules.yaml new file mode 100644 index 0000000000..7d2267d30f --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca24-culmination-coop/culmination-coop-rules.yaml @@ -0,0 +1,10 @@ +World: + LuaScript: + Scripts: campaign.lua, coop.lua, ca|missions/main-campaign/ca24-culmination/culmination.lua, culmination-coop.lua + LobbyMissionInfo@InitialObjectives: + Prefix: Initial Objectives + Text: • Subjugate one of the three human bases.\n• Capture the Construction Yards of the remaining two human factions. + +^BasicBuilding: + CreateProxyActorForAllies: + RequireValidFaction: False diff --git a/mods/ca/missions/coop-campaign/ca24-culmination-coop/culmination-coop.lua b/mods/ca/missions/coop-campaign/ca24-culmination-coop/culmination-coop.lua new file mode 100644 index 0000000000..b9f661cf66 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca24-culmination-coop/culmination-coop.lua @@ -0,0 +1,28 @@ + +SetupPlayers = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Multi2 = Player.GetPlayer("Multi2") + Multi3 = Player.GetPlayer("Multi3") + Multi4 = Player.GetPlayer("Multi4") + Multi5 = Player.GetPlayer("Multi5") + Scrin = Player.GetPlayer("Scrin") + ScrinNoControl = Player.GetPlayer("ScrinNoControl") + USSR = Player.GetPlayer("USSR") + Greece = Player.GetPlayer("Greece") + Nod = Player.GetPlayer("Nod") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = Utils.Where({ Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 }, function(p) return p ~= nil end) + MissionEnemies = { USSR, Greece, Nod } + SinglePlayerPlayer = Scrin + CoopInit() +end + +AfterWorldLoaded = function() + TransferMcvsToPlayers() + StartCashSpread(3500) +end + +AfterTick = function() + +end diff --git a/mods/ca/missions/coop-campaign/ca24-culmination-coop/map.bin b/mods/ca/missions/coop-campaign/ca24-culmination-coop/map.bin new file mode 100644 index 0000000000..027ee06468 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca24-culmination-coop/map.bin differ diff --git a/mods/ca/missions/coop-campaign/ca24-culmination-coop/map.png b/mods/ca/missions/coop-campaign/ca24-culmination-coop/map.png new file mode 100644 index 0000000000..b5c7e7f357 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca24-culmination-coop/map.png differ diff --git a/mods/ca/missions/coop-campaign/ca24-culmination-coop/map.yaml b/mods/ca/missions/coop-campaign/ca24-culmination-coop/map.yaml new file mode 100644 index 0000000000..94bcec647b --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca24-culmination-coop/map.yaml @@ -0,0 +1,7970 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 24: Culmination Co-op + +Author: Darkademic & Gandorques Hikla + +Tileset: TEMPERAT + +MapSize: 146,130 + +Bounds: 1,1,144,128 + +Visibility: Lobby + +Categories: Co-op Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: USSR, Greece, Nod, Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + PlayerReference@Scrin: + Name: Scrin + Faction: scrin + Color: 7700FF + Allies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Greece, Nod, Creeps + PlayerReference@Greece: + Name: Greece + Bot: campaign + Faction: allies + Color: 99ACF2 + Allies: USSR, Nod + Enemies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@USSR: + Name: USSR + Bot: campaign + Faction: soviet + Color: FE1100 + Allies: Nod, Greece + Enemies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@Nod: + Name: Nod + Bot: campaign + Faction: nod + Color: 6D738C + Allies: Greece, USSR + Enemies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@ScrinNoControl: + Name: ScrinNoControl + NonCombatant: True + Faction: scrin + Color: 7700FF + Allies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: scrin + Color: 7700FF + LockColor: True + Allies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Greece, Nod, Creeps + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: scrin + Color: D83CE5 + LockColor: True + Allies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Greece, Nod, Creeps + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: scrin + Color: 0B7310 + LockColor: True + Allies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Greece, Nod, Creeps + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: scrin + Color: 775A12 + LockColor: True + Allies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Greece, Nod, Creeps + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: scrin + Color: 82C900 + LockColor: True + Allies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Greece, Nod, Creeps + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: scrin + Color: EEA8A8 + LockColor: True + Allies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Greece, Nod, Creeps + +Actors: + Actor0: tc05 + Owner: Neutral + Location: 18,39 + Actor2: tc05 + Owner: Neutral + Location: 1,57 + Actor3: tc05 + Owner: Neutral + Location: 39,76 + Actor4: tc05.husk + Owner: Neutral + Location: 0,125 + Actor5: tc05 + Owner: Neutral + Location: 123,55 + Actor6: tc05 + Owner: Neutral + Location: 96,87 + Actor7: tc05 + Owner: Neutral + Location: 45,79 + Actor8: tc05 + Owner: Neutral + Location: 97,19 + Actor9: tc05 + Owner: Neutral + Location: 124,68 + Actor11: tc03 + Owner: Neutral + Location: 59,94 + Actor12: tc03 + Owner: Neutral + Location: 114,22 + Actor15: tc03 + Owner: Neutral + Location: 4,127 + Actor16: tc04 + Owner: Neutral + Location: 98,102 + Actor17: tc04 + Owner: Neutral + Location: 142,69 + Actor18: tc04 + Owner: Neutral + Location: 91,19 + Actor19: tc03 + Owner: Neutral + Location: 90,86 + Actor20: tc03 + Owner: Neutral + Location: 38,21 + Actor21: tc03 + Owner: Neutral + Location: 40,24 + Actor22: tc03 + Owner: Neutral + Location: 37,26 + Actor23: tc04 + Owner: Neutral + Location: 55,99 + Actor24: tc03 + Owner: Neutral + Location: 35,88 + Actor25: tc03 + Owner: Neutral + Location: 31,26 + Actor26: tc04 + Owner: Neutral + Location: 50,74 + Actor27: tc03 + Owner: Neutral + Location: 48,77 + Actor28: tc03.husk + Owner: Neutral + Location: 2,62 + Actor29: tc03 + Owner: Neutral + Location: 38,23 + Actor30: tc03 + Owner: Neutral + Location: 88,17 + Actor32: tc04 + Owner: Neutral + Location: 55,111 + Actor34: tc02 + Owner: Neutral + Location: 114,47 + Actor35: tc02 + Owner: Neutral + Location: 82,120 + Actor36: tc02 + Owner: Neutral + Location: 140,19 + Actor37: tc02 + Owner: Neutral + Location: 49,83 + Actor38: tc02 + Owner: Neutral + Location: 109,37 + Actor39: tc02 + Owner: Neutral + Location: 41,43 + Actor40: tc02 + Owner: Neutral + Location: 11,127 + Actor41: tc02 + Owner: Neutral + Location: 41,25 + Actor43: tc02 + Owner: Neutral + Location: 4,125 + Actor45: tc02 + Owner: Neutral + Location: 52,83 + Actor48: tc02 + Owner: Neutral + Location: 49,78 + Actor50: tc02.husk + Owner: Neutral + Location: 33,26 + Actor51: tc02 + Owner: Neutral + Location: 105,88 + Actor52: t15 + Owner: Neutral + Location: 45,75 + Actor53: t11 + Owner: Neutral + Location: 90,122 + Actor54: t14.husk + Owner: Neutral + Location: 29,24 + Actor55: t14 + Owner: Neutral + Location: 113,51 + Actor56: tc01 + Owner: Neutral + Location: 7,126 + Actor57: t15 + Owner: Neutral + Location: 81,1 + Actor58: tc01 + Owner: Neutral + Location: 6,71 + Actor59: t15 + Owner: Neutral + Location: 114,53 + Actor60: t15 + Owner: Neutral + Location: 16,128 + Actor61: tc01 + Owner: Neutral + Location: 53,94 + Actor63: t15 + Owner: Neutral + Location: 98,100 + Actor64: t15 + Owner: Neutral + Location: 92,84 + Actor65: tc01 + Owner: Neutral + Location: 90,81 + Actor66: tc01 + Owner: Neutral + Location: 88,20 + Actor67: t14 + Owner: Neutral + Location: 50,79 + Actor69: t14.husk + Owner: Neutral + Location: 69,63 + Actor71: t10.husk + Owner: Neutral + Location: 140,63 + Actor72: tc01 + Owner: Neutral + Location: 137,1 + Actor73: t14 + Owner: Neutral + Location: 61,42 + Actor74: t11 + Owner: Neutral + Location: 143,15 + Actor75: t11 + Owner: Neutral + Location: 26,93 + Actor76: t15 + Owner: Neutral + Location: 97,106 + Actor77: t10 + Owner: Neutral + Location: 50,76 + Actor78: tc01.husk + Owner: Neutral + Location: 54,81 + Actor79: t15 + Owner: Neutral + Location: 53,112 + Actor80: tc01 + Owner: Neutral + Location: 32,17 + Actor81: t11 + Owner: Neutral + Location: 89,126 + Actor82: t10 + Owner: Neutral + Location: 51,80 + Actor83: tc01 + Owner: Neutral + Location: 8,10 + Actor84: t14 + Owner: Neutral + Location: 104,44 + Actor85: tc01 + Owner: Neutral + Location: 6,70 + Actor86: t14 + Owner: Neutral + Location: 93,88 + Actor88: t15 + Owner: Neutral + Location: 94,102 + Actor89: t15 + Owner: Neutral + Location: 42,21 + Actor90: t14 + Owner: Neutral + Location: 68,61 + Actor91: t11 + Owner: Neutral + Location: 104,86 + Actor92: t11 + Owner: Neutral + Location: 19,25 + Actor93: t15 + Owner: Neutral + Location: 57,94 + Actor94: tc01 + Owner: Neutral + Location: 89,24 + Actor95: t15 + Owner: Neutral + Location: 138,2 + Actor96: t15 + Owner: Neutral + Location: 95,111 + Actor97: t11 + Owner: Neutral + Location: 32,87 + Actor98: t15 + Owner: Neutral + Location: 90,38 + Actor99: tc01 + Owner: Neutral + Location: 56,78 + Actor100: t15 + Owner: Neutral + Location: 125,70 + Actor101: tc01 + Owner: Neutral + Location: 60,45 + Actor102: t15 + Owner: Neutral + Location: 84,0 + Actor103: t14 + Owner: Neutral + Location: 94,84 + Actor105: t11 + Owner: Neutral + Location: 3,70 + Actor106: t15 + Owner: Neutral + Location: 10,126 + Actor107: t10 + Owner: Neutral + Location: 63,61 + Actor108: t14.husk + Owner: Neutral + Location: 18,24 + Actor109: tc01 + Owner: Neutral + Location: 98,90 + Actor111: t10 + Owner: Neutral + Location: 11,125 + Actor112: tc01 + Owner: Neutral + Location: 143,10 + Actor113: t14 + Owner: Neutral + Location: 3,82 + Actor114: t11 + Owner: Neutral + Location: 53,77 + Actor115: t15 + Owner: Neutral + Location: 142,11 + Actor116: t11 + Owner: Neutral + Location: 91,121 + Actor117: t10 + Owner: Neutral + Location: 102,66 + Actor118: tc01 + Owner: Neutral + Location: 107,44 + Actor119: t15 + Owner: Neutral + Location: 50,73 + Actor121: t15 + Owner: Neutral + Location: 142,12 + Actor122: t15 + Owner: Neutral + Location: 94,81 + Actor123: t14.husk + Owner: Neutral + Location: 36,23 + Actor124: t10 + Owner: Neutral + Location: 42,22 + Actor125: t11 + Owner: Neutral + Location: 87,126 + Actor126: t10 + Owner: Neutral + Location: 15,125 + Actor127: t10 + Owner: Neutral + Location: 126,65 + Actor128: t14 + Owner: Neutral + Location: 58,111 + Actor129: tc01.husk + Owner: Neutral + Location: 9,127 + Actor131: t10 + Owner: Neutral + Location: 112,48 + Actor132: tc01 + Owner: Neutral + Location: 36,20 + Actor133: t11 + Owner: Neutral + Location: 0,122 + Actor135: tc01 + Owner: Neutral + Location: 104,67 + Actor136: t10.husk + Owner: Neutral + Location: 124,51 + Actor137: t15 + Owner: Neutral + Location: 56,80 + Actor138: t11 + Owner: Neutral + Location: 84,119 + Actor139: t14 + Owner: Neutral + Location: 144,107 + Actor140: t15 + Owner: Neutral + Location: 52,75 + Actor142: t11.husk + Owner: Neutral + Location: 72,36 + Actor143: t15 + Owner: Neutral + Location: 105,42 + Actor144: t14 + Owner: Neutral + Location: 2,54 + Actor145: t15.husk + Owner: Neutral + Location: 121,52 + Actor146: t11 + Owner: Neutral + Location: 53,73 + Actor147: t10 + Owner: Neutral + Location: 104,69 + Actor148: t14 + Owner: Neutral + Location: 48,12 + Actor149: t14 + Owner: Neutral + Location: 34,27 + Actor151: t11.husk + Owner: Neutral + Location: 2,77 + Actor152: t11 + Owner: Neutral + Location: 102,87 + Actor154: t10 + Owner: Neutral + Location: 95,82 + Actor155: t10 + Owner: Neutral + Location: 90,83 + Actor157: t10 + Owner: Neutral + Location: 144,66 + Actor158: t14 + Owner: Neutral + Location: 144,122 + Actor159: tc01 + Owner: Neutral + Location: 46,81 + Actor160: t15 + Owner: Neutral + Location: 31,28 + Actor161: t10 + Owner: Neutral + Location: 53,98 + Actor162: t11 + Owner: Neutral + Location: 82,121 + Actor163: t10 + Owner: Neutral + Location: 94,99 + Actor164: t15 + Owner: Neutral + Location: 54,95 + Actor165: t11 + Owner: Neutral + Location: 95,109 + Actor167: t15 + Owner: Neutral + Location: 66,64 + Actor168: t10 + Owner: Neutral + Location: 53,74 + Actor169: t15 + Owner: Neutral + Location: 32,19 + Actor170: tc01 + Owner: Neutral + Location: 57,95 + Actor171: tc01 + Owner: Neutral + Location: 54,78 + Actor172: tc01.husk + Owner: Neutral + Location: 20,26 + Actor173: t10 + Owner: Neutral + Location: 128,66 + Actor174: t14 + Owner: Neutral + Location: 143,7 + Actor175: t15.husk + Owner: Neutral + Location: 44,109 + Actor176: t14 + Owner: Neutral + Location: 89,84 + Actor177: t10 + Owner: Neutral + Location: 48,11 + Actor178: t11 + Owner: Neutral + Location: 30,20 + Actor179: t11 + Owner: Neutral + Location: 91,120 + Actor180: t15 + Owner: Neutral + Location: 64,45 + Actor181: t11 + Owner: Neutral + Location: 82,124 + Actor183: t11.husk + Owner: Neutral + Location: 116,93 + Actor184: tc01 + Owner: Neutral + Location: 95,79 + Actor185: tc01 + Owner: Neutral + Location: 88,18 + Actor186: t10 + Owner: Neutral + Location: 29,23 + Actor187: t15 + Owner: Neutral + Location: 143,68 + Actor188: tc01.husk + Owner: Neutral + Location: 90,37 + Actor190: t14 + Owner: Neutral + Location: 19,23 + Actor191: t14 + Owner: Neutral + Location: 110,39 + Actor192: t11 + Owner: Neutral + Location: 131,67 + Actor193: t15 + Owner: Neutral + Location: 112,43 + Actor194: t11 + Owner: Neutral + Location: 3,80 + Actor195: t10 + Owner: Neutral + Location: 86,107 + Actor196: t10 + Owner: Neutral + Location: 3,53 + Actor197: tc01 + Owner: Neutral + Location: 7,128 + Actor198: t15 + Owner: Neutral + Location: 116,95 + Actor199: tc01 + Owner: Neutral + Location: 56,112 + Actor200: t15 + Owner: Neutral + Location: 104,70 + Actor203: t10 + Owner: Neutral + Location: 56,96 + Actor206: t10 + Owner: Neutral + Location: 112,38 + Actor209: t14 + Owner: Neutral + Location: 113,103 + Actor210: t15 + Owner: Neutral + Location: 88,122 + Actor211: t11 + Owner: Neutral + Location: 93,89 + Actor212: t10 + Owner: Neutral + Location: 93,122 + Actor213: t15 + Owner: Neutral + Location: 93,87 + Actor214: t10 + Owner: Neutral + Location: 58,97 + Actor215: t11 + Owner: Neutral + Location: 40,78 + Actor217: tc01 + Owner: Neutral + Location: 51,81 + Actor218: t15 + Owner: Neutral + Location: 98,44 + Actor219: tc01 + Owner: Neutral + Location: 37,24 + Actor220: t11 + Owner: Neutral + Location: 144,65 + Actor221: t14 + Owner: Neutral + Location: 142,18 + Actor222: t15 + Owner: Neutral + Location: 123,66 + Actor223: t11 + Owner: Neutral + Location: 140,1 + Actor225: t14.husk + Owner: Neutral + Location: 82,122 + Actor226: t14 + Owner: Neutral + Location: 58,80 + Actor227: t11 + Owner: Neutral + Location: 93,86 + Actor228: t11 + Owner: Neutral + Location: 96,107 + Actor229: t15 + Owner: Neutral + Location: 98,101 + Actor230: t11 + Owner: Neutral + Location: 102,69 + Actor231: t14 + Owner: Neutral + Location: 94,42 + Actor232: t10 + Owner: Neutral + Location: 96,20 + Actor234: t10 + Owner: Neutral + Location: 8,6 + Actor235: t14 + Owner: Neutral + Location: 88,14 + Actor236: t11 + Owner: Neutral + Location: 58,90 + Actor237: t14 + Owner: Neutral + Location: 34,21 + Actor238: tc01 + Owner: Neutral + Location: 96,85 + Actor239: t11 + Owner: Neutral + Location: 140,15 + Actor240: t10.husk + Owner: Neutral + Location: 4,77 + Actor241: t11 + Owner: Neutral + Location: 86,19 + Actor242: tc01 + Owner: Neutral + Location: 143,67 + Actor243: tc01 + Owner: Neutral + Location: 1,73 + Actor245: t08 + Owner: Neutral + Location: 92,89 + Actor246: t02 + Owner: Neutral + Location: 29,21 + Actor247: t03 + Owner: Neutral + Location: 86,17 + Actor248: t03 + Owner: Neutral + Location: 84,118 + Actor249: t07 + Owner: Neutral + Location: 4,60 + Actor250: t17.husk + Owner: Neutral + Location: 34,23 + Actor251: t13 + Owner: Neutral + Location: 96,32 + Actor252: t12 + Owner: Neutral + Location: 43,77 + Actor253: t01 + Owner: Neutral + Location: 0,85 + Actor254: t16 + Owner: Neutral + Location: 6,125 + Actor255: t05 + Owner: Neutral + Location: 143,17 + Actor256: t17 + Owner: Neutral + Location: 37,128 + Actor257: t02 + Owner: Neutral + Location: 2,78 + Actor258: t06 + Owner: Neutral + Location: 1,121 + Actor259: t01 + Owner: Neutral + Location: 90,36 + Actor260: t05 + Owner: Neutral + Location: 120,67 + Actor261: t08 + Owner: Neutral + Location: 145,12 + Actor262: t06 + Owner: Neutral + Location: 4,55 + Actor263: t01 + Owner: Neutral + Location: 110,40 + Actor264: t16 + Owner: Neutral + Location: 140,13 + Actor265: t12 + Owner: Neutral + Location: 130,68 + Actor266: t03 + Owner: Neutral + Location: 60,79 + Actor267: t05 + Owner: Neutral + Location: 105,63 + Actor268: t07 + Owner: Neutral + Location: 143,13 + Actor269: t12 + Owner: Neutral + Location: 26,91 + Actor270: t13 + Owner: Neutral + Location: 111,43 + Actor271: t02 + Owner: Neutral + Location: 19,38 + Actor272: t17 + Owner: Neutral + Location: 21,27 + Actor274: t05 + Owner: Neutral + Location: 92,36 + Actor275: t13 + Owner: Neutral + Location: 97,102 + Actor276: t13 + Owner: Neutral + Location: 4,128 + Actor277: t12 + Owner: Neutral + Location: 42,74 + Actor278: t16 + Owner: Neutral + Location: 66,67 + Actor279: t02 + Owner: Neutral + Location: 125,50 + Actor280: t13 + Owner: Neutral + Location: 19,22 + Actor281: t03 + Owner: Neutral + Location: 40,59 + Actor282: t16.husk + Owner: Neutral + Location: 92,99 + Actor283: t17 + Owner: Neutral + Location: 55,72 + Actor284: t01 + Owner: Neutral + Location: 100,90 + Actor285: t03 + Owner: Neutral + Location: 7,127 + Actor286: t12.husk + Owner: Neutral + Location: 123,58 + Actor287: t16 + Owner: Neutral + Location: 47,82 + Actor288: t08 + Owner: Neutral + Location: 17,30 + Actor289: t02 + Owner: Neutral + Location: 10,116 + Actor290: t03 + Owner: Neutral + Location: 145,94 + Actor292: t02 + Owner: Neutral + Location: 8,42 + Actor293: t05 + Owner: Neutral + Location: 117,92 + Actor294: t03 + Owner: Neutral + Location: 56,113 + Actor295: t07 + Owner: Neutral + Location: 44,79 + Actor296: t02 + Owner: Neutral + Location: 60,40 + Actor297: t03 + Owner: Neutral + Location: 3,73 + Actor299: t08 + Owner: Neutral + Location: 145,94 + Actor300: t12 + Owner: Neutral + Location: 3,79 + Actor301: t08 + Owner: Neutral + Location: 7,11 + Actor302: t01 + Owner: Neutral + Location: 67,63 + Actor303: t01 + Owner: Neutral + Location: 92,41 + Actor304: t03 + Owner: Neutral + Location: 47,9 + Actor305: t05 + Owner: Neutral + Location: 132,68 + Actor307: t08 + Owner: Neutral + Location: 56,101 + Actor308: t02 + Owner: Neutral + Location: 82,77 + Actor309: t16 + Owner: Neutral + Location: 113,96 + Actor310: t16 + Owner: Neutral + Location: 108,43 + Actor311: t12 + Owner: Neutral + Location: 89,36 + Actor312: t12 + Owner: Neutral + Location: 133,11 + Actor313: t05.husk + Owner: Neutral + Location: 142,14 + Actor314: t08 + Owner: Neutral + Location: 35,26 + Actor315: t13 + Owner: Neutral + Location: 2,86 + Actor316: t12 + Owner: Neutral + Location: 145,102 + Actor317: t06 + Owner: Neutral + Location: 105,43 + Actor318: t02 + Owner: Neutral + Location: 47,11 + Actor320: t07 + Owner: Neutral + Location: 107,87 + Actor321: t08.husk + Owner: Neutral + Location: 142,18 + Actor322: t01 + Owner: Neutral + Location: 117,97 + Actor323: t13 + Owner: Neutral + Location: 92,98 + Actor324: t03 + Owner: Neutral + Location: 125,52 + Actor325: t06 + Owner: Neutral + Location: 98,43 + Actor326: t03 + Owner: Neutral + Location: 61,48 + Actor327: t12 + Owner: Neutral + Location: 83,75 + Actor328: t05 + Owner: Neutral + Location: 52,95 + Actor329: t17 + Owner: Neutral + Location: 33,24 + Actor330: t13 + Owner: Neutral + Location: 68,60 + Actor332: t06.husk + Owner: Neutral + Location: 113,49 + Actor333: t02 + Owner: Neutral + Location: 37,30 + Actor334: t13 + Owner: Neutral + Location: 25,92 + Actor335: t16.husk + Owner: Neutral + Location: 77,32 + Actor336: t13 + Owner: Neutral + Location: 128,69 + Actor337: t13 + Owner: Neutral + Location: 39,61 + Actor338: t17 + Owner: Neutral + Location: 52,98 + Actor339: t07 + Owner: Neutral + Location: 64,44 + Actor340: t06 + Owner: Neutral + Location: 70,78 + Actor341: t06 + Owner: Neutral + Location: 94,21 + Actor342: t03 + Owner: Neutral + Location: 97,36 + Actor343: t08 + Owner: Neutral + Location: 45,78 + Actor345: t12.husk + Owner: Neutral + Location: 101,119 + Actor346: t08 + Owner: Neutral + Location: 100,101 + Actor347: t12 + Owner: Neutral + Location: 108,46 + Actor348: t07 + Owner: Neutral + Location: 66,62 + Actor349: t17 + Owner: Neutral + Location: 70,64 + Actor350: t02 + Owner: Neutral + Location: 24,12 + Actor351: t03 + Owner: Neutral + Location: 121,99 + Actor352: t03 + Owner: Neutral + Location: 94,36 + Actor353: t02 + Owner: Neutral + Location: 107,64 + Actor354: t01 + Owner: Neutral + Location: 140,18 + Actor355: t06 + Owner: Neutral + Location: 99,88 + Actor356: t07 + Owner: Neutral + Location: 55,79 + Actor357: t01 + Owner: Neutral + Location: 96,19 + Actor358: t05 + Owner: Neutral + Location: 121,66 + Actor359: t03.husk + Owner: Neutral + Location: 143,9 + Actor360: t17 + Owner: Neutral + Location: 21,36 + Actor361: t13 + Owner: Neutral + Location: 39,90 + Actor362: t05 + Owner: Neutral + Location: 115,48 + Actor363: t13 + Owner: Neutral + Location: 97,42 + Actor364: t03.husk + Owner: Neutral + Location: 144,11 + Actor365: t06 + Owner: Neutral + Location: 142,66 + Actor366: t03 + Owner: Neutral + Location: 54,79 + Actor367: t01 + Owner: Neutral + Location: 48,7 + Actor368: t03 + Owner: Neutral + Location: 39,93 + Actor369: t16 + Owner: Neutral + Location: 113,55 + Actor370: t03 + Owner: Neutral + Location: 33,27 + Actor371: t05 + Owner: Neutral + Location: 144,19 + Actor372: t01 + Owner: Neutral + Location: 122,98 + Actor373: t12 + Owner: Neutral + Location: 85,121 + Actor374: t12 + Owner: Neutral + Location: 94,40 + Actor375: t08.husk + Owner: Neutral + Location: 18,41 + Actor376: t03 + Owner: Neutral + Location: 86,121 + Actor377: t01 + Owner: Neutral + Location: 11,4 + Actor378: t16 + Owner: Neutral + Location: 18,127 + Actor379: t08 + Owner: Neutral + Location: 26,90 + Actor380: t02 + Owner: Neutral + Location: 113,40 + Actor381: t16 + Owner: Neutral + Location: 43,25 + Actor382: t13 + Owner: Neutral + Location: 104,66 + Actor383: t05 + Owner: Neutral + Location: 120,98 + Actor384: t13 + Owner: Neutral + Location: 142,74 + Actor385: t12 + Owner: Neutral + Location: 14,125 + Actor386: t02 + Owner: Neutral + Location: 88,128 + Actor387: t13 + Owner: Neutral + Location: 42,58 + Actor388: t03 + Owner: Neutral + Location: 41,57 + Actor389: t12 + Owner: Neutral + Location: 19,125 + Actor390: t12 + Owner: Neutral + Location: 94,110 + Actor391: t17 + Owner: Neutral + Location: 29,22 + Actor392: t02 + Owner: Neutral + Location: 103,43 + Actor393: t06 + Owner: Neutral + Location: 48,10 + Actor394: t07 + Owner: Neutral + Location: 89,15 + Actor395: t17 + Owner: Neutral + Location: 4,61 + Actor396: t06 + Owner: Neutral + Location: 83,118 + Actor397: t12 + Owner: Neutral + Location: 90,21 + Actor398: t01 + Owner: Neutral + Location: 41,20 + Actor399: t01 + Owner: Neutral + Location: 85,122 + Actor400: t02 + Owner: Neutral + Location: 27,90 + Actor401: t02 + Owner: Neutral + Location: 127,66 + Actor402: t13 + Owner: Neutral + Location: 143,63 + Actor404: t13 + Owner: Neutral + Location: 45,73 + Actor405: t08 + Owner: Neutral + Location: 47,77 + Actor406: t08 + Owner: Neutral + Location: 48,14 + Actor407: t01 + Owner: Neutral + Location: 78,78 + Actor408: t16 + Owner: Neutral + Location: 53,99 + Actor409: t16 + Owner: Neutral + Location: 52,94 + Actor410: t16.husk + Owner: Neutral + Location: 33,18 + Actor411: t07 + Owner: Neutral + Location: 14,117 + Actor412: t03 + Owner: Neutral + Location: 96,89 + Actor415: t16 + Owner: Neutral + Location: 1,68 + Actor416: t03 + Owner: Neutral + Location: 80,80 + Actor417: t16 + Owner: Neutral + Location: 3,84 + Actor418: t02 + Owner: Neutral + Location: 90,23 + Actor419: t13 + Owner: Neutral + Location: 97,121 + Actor420: t16 + Owner: Neutral + Location: 83,0 + Actor421: t12 + Owner: Neutral + Location: 0,53 + Actor422: t05 + Owner: Neutral + Location: 31,18 + Actor423: t13 + Owner: Neutral + Location: 56,101 + Actor424: t16 + Owner: Neutral + Location: 9,124 + Actor425: t16 + Owner: Neutral + Location: 141,16 + Actor426: t13 + Owner: Neutral + Location: 3,122 + Actor427: t17 + Owner: Neutral + Location: 48,48 + Actor428: t17 + Owner: Neutral + Location: 31,27 + Actor429: t12 + Owner: Neutral + Location: 35,24 + Actor430: t08 + Owner: Neutral + Location: 42,27 + Actor431: t13.husk + Owner: Neutral + Location: 86,128 + Actor432: t17 + Owner: Neutral + Location: 91,87 + Actor433: t12 + Owner: Neutral + Location: 130,64 + Actor434: t07 + Owner: Neutral + Location: 68,62 + Actor435: t03 + Owner: Neutral + Location: 95,108 + Actor436: t08 + Owner: Neutral + Location: 128,52 + Actor437: t06 + Owner: Neutral + Location: 88,36 + Actor438: t02 + Owner: Neutral + Location: 95,33 + Actor439: t17 + Owner: Neutral + Location: 99,103 + Actor440: t17 + Owner: Neutral + Location: 116,55 + Actor441: t03 + Owner: Neutral + Location: 140,7 + Actor442: t16 + Owner: Neutral + Location: 127,68 + Actor443: t07.husk + Owner: Neutral + Location: 142,64 + Actor444: t16 + Owner: Neutral + Location: 1,61 + Actor445: t05 + Owner: Neutral + Location: 55,76 + Actor446: t06 + Owner: Neutral + Location: 97,112 + Actor447: t01 + Owner: Neutral + Location: 96,81 + Actor448: t05 + Owner: Neutral + Location: 54,99 + Actor449: t13 + Owner: Neutral + Location: 52,97 + Actor450: t03 + Owner: Neutral + Location: 16,126 + Actor452: t13 + Owner: Neutral + Location: 0,84 + Actor454: t03 + Owner: Neutral + Location: 85,126 + Actor455: t07 + Owner: Neutral + Location: 96,34 + Actor456: t08 + Owner: Neutral + Location: 116,23 + Actor458: t17 + Owner: Neutral + Location: 138,128 + Actor459: t12 + Owner: Neutral + Location: 116,54 + Actor460: t05 + Owner: Neutral + Location: 110,46 + Actor461: t07 + Owner: Neutral + Location: 3,125 + Actor462: t13 + Owner: Neutral + Location: 64,43 + Actor463: t06 + Owner: Neutral + Location: 35,20 + Actor464: t12 + Owner: Neutral + Location: 71,63 + Actor465: t17 + Owner: Neutral + Location: 107,67 + Actor466: t16 + Owner: Neutral + Location: 104,60 + Actor467: t08 + Owner: Neutral + Location: 123,57 + Actor468: t05 + Owner: Neutral + Location: 60,91 + Actor469: t02 + Owner: Neutral + Location: 44,76 + Actor470: t13 + Owner: Neutral + Location: 92,35 + Actor471: t02 + Owner: Neutral + Location: 5,81 + Actor472: t05 + Owner: Neutral + Location: 102,88 + Actor473: t06 + Owner: Neutral + Location: 103,44 + Actor474: t08.husk + Owner: Neutral + Location: 57,99 + Actor475: t06.husk + Owner: Neutral + Location: 142,3 + Actor476: t07.husk + Owner: Neutral + Location: 81,78 + Actor477: t07 + Owner: Neutral + Location: 98,120 + Actor478: t13 + Owner: Neutral + Location: 65,64 + Actor482: t03 + Owner: Neutral + Location: 3,55 + Actor483: t08 + Owner: Neutral + Location: 92,106 + Actor484: t01 + Owner: Neutral + Location: 94,101 + Actor485: t13 + Owner: Neutral + Location: 28,92 + Actor486: t08 + Owner: Neutral + Location: 17,39 + Actor487: t07 + Owner: Neutral + Location: 115,51 + Actor488: t13 + Owner: Neutral + Location: 69,77 + Actor489: t05 + Owner: Neutral + Location: 62,62 + Actor490: t07 + Owner: Neutral + Location: 144,0 + Actor491: t08 + Owner: Neutral + Location: 93,83 + Actor492: t05 + Owner: Neutral + Location: 43,74 + Actor493: t13 + Owner: Neutral + Location: 45,108 + Actor494: t06 + Owner: Neutral + Location: 111,38 + Actor495: t01 + Owner: Neutral + Location: 95,88 + Actor496: t05 + Owner: Neutral + Location: 34,19 + Actor497: t13 + Owner: Neutral + Location: 90,25 + Actor498: t16 + Owner: Neutral + Location: 107,38 + Actor499: t17 + Owner: Neutral + Location: 131,16 + Actor500: t07 + Owner: Neutral + Location: 88,35 + Actor501: t06 + Owner: Neutral + Location: 142,7 + Actor502: t12 + Owner: Neutral + Location: 142,73 + Actor503: t17 + Owner: Neutral + Location: 115,56 + Actor504: t02 + Owner: Neutral + Location: 84,121 + Actor506: t02 + Owner: Neutral + Location: 43,93 + Actor507: t06 + Owner: Neutral + Location: 123,94 + Actor508: t02.husk + Owner: Neutral + Location: 108,37 + Actor509: t08 + Owner: Neutral + Location: 95,38 + Actor511: t17.husk + Owner: Neutral + Location: 120,99 + Actor512: t13 + Owner: Neutral + Location: 30,22 + Actor513: t17 + Owner: Neutral + Location: 88,107 + Actor514: t16 + Owner: Neutral + Location: 34,22 + Actor515: t07 + Owner: Neutral + Location: 1,32 + Actor516: t05 + Owner: Neutral + Location: 50,11 + Actor517: t12 + Owner: Neutral + Location: 2,30 + Actor518: t17 + Owner: Neutral + Location: 93,97 + Actor520: t06 + Owner: Neutral + Location: 55,5 + Actor521: t17 + Owner: Neutral + Location: 120,121 + Actor523: t13 + Owner: Neutral + Location: 33,25 + Actor525: t05 + Owner: Neutral + Location: 109,98 + Actor526: t05 + Owner: Neutral + Location: 48,49 + Actor527: t16 + Owner: Neutral + Location: 92,122 + Actor528: t17 + Owner: Neutral + Location: 44,81 + Actor529: t17 + Owner: Neutral + Location: 15,126 + Actor530: t05 + Owner: Neutral + Location: 4,75 + Actor531: t17 + Owner: Neutral + Location: 144,14 + Actor533: t02 + Owner: Neutral + Location: 103,89 + Actor534: t12 + Owner: Neutral + Location: 89,125 + Actor535: t12 + Owner: Neutral + Location: 14,126 + Actor536: t16 + Owner: Neutral + Location: 3,126 + Actor537: t16 + Owner: Neutral + Location: 48,80 + Actor538: t13 + Owner: Neutral + Location: 124,67 + Actor539: t05 + Owner: Neutral + Location: 4,54 + Actor540: t01.husk + Owner: Neutral + Location: 104,63 + Actor541: t03 + Owner: Neutral + Location: 96,88 + Actor542: t17 + Owner: Neutral + Location: 139,1 + Actor543: t01 + Owner: Neutral + Location: 140,62 + Actor545: t02 + Owner: Neutral + Location: 34,90 + Actor546: t13 + Owner: Neutral + Location: 9,4 + Actor547: t07 + Owner: Neutral + Location: 96,104 + Actor548: t02 + Owner: Neutral + Location: 96,83 + Actor549: t06 + Owner: Neutral + Location: 141,14 + Actor550: t12 + Owner: Neutral + Location: 53,78 + Actor551: t17 + Owner: Neutral + Location: 124,54 + Actor552: t07 + Owner: Neutral + Location: 49,75 + Actor553: t06 + Owner: Neutral + Location: 2,121 + Actor554: t06 + Owner: Neutral + Location: 119,120 + Actor555: t13 + Owner: Neutral + Location: 19,11 + Actor556: t16 + Owner: Neutral + Location: 125,53 + Actor558: t17 + Owner: Neutral + Location: 113,50 + Actor559: t13 + Owner: Neutral + Location: 89,121 + Actor560: t01 + Owner: Neutral + Location: 67,59 + Actor561: t03 + Owner: Neutral + Location: 111,47 + Actor563: t17.husk + Owner: Neutral + Location: 60,90 + Actor564: t03.husk + Owner: Neutral + Location: 57,100 + Actor565: t13 + Owner: Neutral + Location: 1,78 + Actor566: t16 + Owner: Neutral + Location: 105,68 + Actor568: t05 + Owner: Neutral + Location: 101,88 + Actor569: t08 + Owner: Neutral + Location: 1,55 + Actor570: t07 + Owner: Neutral + Location: 58,114 + Actor571: t03 + Owner: Neutral + Location: 133,68 + Actor572: t03 + Owner: Neutral + Location: 67,56 + Actor574: t07 + Owner: Neutral + Location: 97,79 + Actor575: t01 + Owner: Neutral + Location: 86,127 + Actor576: t17 + Owner: Neutral + Location: 141,2 + Actor577: t16 + Owner: Neutral + Location: 125,71 + Actor579: t03 + Owner: Neutral + Location: 97,33 + Actor580: t03 + Owner: Neutral + Location: 3,81 + Actor581: t08.husk + Owner: Neutral + Location: 122,98 + Actor582: t07 + Owner: Neutral + Location: 44,74 + Actor583: t06 + Owner: Neutral + Location: 89,86 + Actor584: t02.husk + Owner: Neutral + Location: 141,8 + Actor585: t05 + Owner: Neutral + Location: 42,20 + Actor586: t08 + Owner: Neutral + Location: 37,30 + Actor587: t16 + Owner: Neutral + Location: 128,67 + Actor588: t08 + Owner: Neutral + Location: 80,80 + Actor589: t17 + Owner: Neutral + Location: 54,110 + Actor590: t06 + Owner: Neutral + Location: 53,114 + Actor591: t06 + Owner: Neutral + Location: 13,116 + Actor592: t05 + Owner: Neutral + Location: 143,65 + Actor593: t01 + Owner: Neutral + Location: 0,69 + Actor594: t13 + Owner: Neutral + Location: 54,80 + Actor595: t02 + Owner: Neutral + Location: 91,16 + Actor596: t13 + Owner: Neutral + Location: 9,7 + Actor597: t01 + Owner: Neutral + Location: 59,78 + Actor598: t12 + Owner: Neutral + Location: 110,38 + Actor599: t12 + Owner: Neutral + Location: 48,74 + Actor600: t13 + Owner: Neutral + Location: 2,120 + Actor601: t05 + Owner: Neutral + Location: 25,93 + Actor602: t02 + Owner: Neutral + Location: 95,101 + Actor603: t12 + Owner: Neutral + Location: 95,41 + Actor604: t05 + Owner: Neutral + Location: 8,127 + Actor605: t06 + Owner: Neutral + Location: 121,120 + Actor606: t16 + Owner: Neutral + Location: 52,73 + Actor607: t07 + Owner: Neutral + Location: 144,35 + Actor609: t16 + Owner: Neutral + Location: 95,85 + Actor610: t13 + Owner: Neutral + Location: 53,80 + Actor611: t02.husk + Owner: Neutral + Location: 2,83 + Actor612: t01 + Owner: Neutral + Location: 141,11 + Actor613: t13 + Owner: Neutral + Location: 40,41 + Actor614: t13 + Owner: Neutral + Location: 97,90 + Actor615: t13 + Owner: Neutral + Location: 36,21 + Actor616: t08 + Owner: Neutral + Location: 113,53 + Actor617: t02 + Owner: Neutral + Location: 81,122 + Actor618: t02 + Owner: Neutral + Location: 108,79 + Actor619: t01 + Owner: Neutral + Location: 76,78 + Actor620: t01 + Owner: Neutral + Location: 30,26 + Actor621: t02 + Owner: Neutral + Location: 58,110 + Actor622: t02 + Owner: Neutral + Location: 120,120 + Actor623: t02 + Owner: Neutral + Location: 36,19 + Actor625: t12 + Owner: Neutral + Location: 44,113 + Actor626: t08 + Owner: Neutral + Location: 104,88 + Actor627: t02 + Owner: Neutral + Location: 39,42 + Actor628: t02 + Owner: Neutral + Location: 3,83 + Actor629: t08 + Owner: Neutral + Location: 37,28 + Actor630: t01 + Owner: Neutral + Location: 2,64 + Actor632: t17 + Owner: Neutral + Location: 40,26 + Actor633: t02 + Owner: Neutral + Location: 116,96 + Actor634: t05 + Owner: Neutral + Location: 94,83 + Actor637: t17 + Owner: Neutral + Location: 61,93 + Actor638: t03 + Owner: Neutral + Location: 112,23 + Actor639: t07 + Owner: Neutral + Location: 43,79 + Actor640: t08 + Owner: Neutral + Location: 37,29 + Actor641: t02 + Owner: Neutral + Location: 95,89 + Actor642: t13 + Owner: Neutral + Location: 42,72 + Actor643: t08 + Owner: Neutral + Location: 50,11 + Actor644: t05 + Owner: Neutral + Location: 18,41 + Actor645: t17 + Owner: Neutral + Location: 47,74 + Actor646: t17 + Owner: Neutral + Location: 140,0 + Actor647: t03 + Owner: Neutral + Location: 57,101 + Actor648: t17 + Owner: Neutral + Location: 45,113 + Actor649: t12 + Owner: Neutral + Location: 117,96 + Actor650: t05 + Owner: Neutral + Location: 70,68 + Actor651: t12 + Owner: Neutral + Location: 104,41 + Actor653: t05 + Owner: Neutral + Location: 16,127 + Actor654: t08 + Owner: Neutral + Location: 126,52 + Actor655: t08 + Owner: Neutral + Location: 51,96 + Actor656: t01 + Owner: Neutral + Location: 144,78 + Actor657: t03 + Owner: Neutral + Location: 18,26 + Actor658: t06 + Owner: Neutral + Location: 8,8 + Actor660: t07 + Owner: Neutral + Location: 101,45 + Actor661: t05 + Owner: Neutral + Location: 144,16 + Actor662: t01 + Owner: Neutral + Location: 145,123 + Actor663: t12 + Owner: Neutral + Location: 91,36 + Actor664: t06 + Owner: Neutral + Location: 140,10 + Actor665: t16 + Owner: Neutral + Location: 105,89 + Actor666: t01 + Owner: Neutral + Location: 52,79 + Actor667: t02.husk + Owner: Neutral + Location: 17,127 + Actor668: t07 + Owner: Neutral + Location: 56,79 + Actor669: t01 + Owner: Neutral + Location: 101,87 + Actor670: t06 + Owner: Neutral + Location: 68,67 + Actor671: t05.husk + Owner: Neutral + Location: 103,63 + Actor672: t02 + Owner: Neutral + Location: 58,112 + Actor674: t01 + Owner: Neutral + Location: 89,25 + Actor676: t08 + Owner: Neutral + Location: 50,8 + Actor677: t12 + Owner: Neutral + Location: 3,76 + Actor678: t13 + Owner: Neutral + Location: 19,26 + Actor680: t02 + Owner: Neutral + Location: 117,94 + Actor681: t13 + Owner: Neutral + Location: 60,43 + Actor682: t13 + Owner: Neutral + Location: 2,71 + Actor683: t08 + Owner: Neutral + Location: 46,78 + Actor684: t01 + Owner: Neutral + Location: 126,53 + Actor685: t13 + Owner: Neutral + Location: 119,119 + Actor686: t06.husk + Owner: Neutral + Location: 104,54 + Actor687: t13 + Owner: Neutral + Location: 1,64 + Actor688: t02 + Owner: Neutral + Location: 88,127 + Actor689: t02 + Owner: Neutral + Location: 115,54 + Actor690: t03 + Owner: Neutral + Location: 13,127 + Actor691: t13 + Owner: Neutral + Location: 48,84 + Actor692: t06 + Owner: Neutral + Location: 53,81 + Actor693: t17 + Owner: Neutral + Location: 38,28 + Actor694: t12 + Owner: Neutral + Location: 103,88 + Actor696: t05 + Owner: Neutral + Location: 4,81 + Actor698: t01 + Owner: Neutral + Location: 35,31 + Actor699: t07 + Owner: Neutral + Location: 100,86 + Actor700: t06 + Owner: Neutral + Location: 38,18 + Actor701: t12.husk + Owner: Neutral + Location: 29,20 + Actor702: t13 + Owner: Neutral + Location: 111,36 + Actor703: t13 + Owner: Neutral + Location: 61,92 + Actor704: t05 + Owner: Neutral + Location: 19,28 + Actor705: t16 + Owner: Neutral + Location: 58,113 + Actor706: t03 + Owner: Neutral + Location: 68,69 + Actor707: t08 + Owner: Neutral + Location: 58,100 + Actor709: t06 + Owner: Neutral + Location: 20,27 + Actor710: t13 + Owner: Neutral + Location: 90,125 + Actor711: t13 + Owner: Neutral + Location: 122,57 + Actor712: t07 + Owner: Neutral + Location: 96,110 + Actor713: t05 + Owner: Neutral + Location: 39,25 + Actor714: t03 + Owner: Neutral + Location: 95,18 + Actor715: t13 + Owner: Neutral + Location: 0,33 + Actor718: t07 + Owner: Neutral + Location: 107,45 + Actor720: t16.husk + Owner: Neutral + Location: 19,74 + Actor721: t01 + Owner: Neutral + Location: 41,26 + Actor722: t12 + Owner: Neutral + Location: 0,83 + Actor723: t08 + Owner: Neutral + Location: 0,63 + Actor724: t02 + Owner: Neutral + Location: 34,87 + Actor725: t03 + Owner: Neutral + Location: 97,104 + Actor726: t01 + Owner: Neutral + Location: 45,24 + Actor727: t12 + Owner: Neutral + Location: 39,27 + Actor728: t06 + Owner: Neutral + Location: 96,100 + Actor729: t08 + Owner: Neutral + Location: 111,45 + Actor730: t17 + Owner: Neutral + Location: 131,65 + Actor731: t08 + Owner: Neutral + Location: 107,43 + Actor732: t01 + Owner: Neutral + Location: 90,82 + Actor733: t12 + Owner: Neutral + Location: 46,78 + Actor734: t01 + Owner: Neutral + Location: 143,31 + Actor735: t12 + Owner: Neutral + Location: 92,87 + Actor737: t03.husk + Owner: Neutral + Location: 3,123 + Actor738: t07 + Owner: Neutral + Location: 19,10 + Actor739: t17 + Owner: Neutral + Location: 2,11 + Actor740: t01 + Owner: Neutral + Location: 88,120 + Actor741: t07 + Owner: Neutral + Location: 26,90 + Actor742: t12 + Owner: Neutral + Location: 64,63 + Actor743: t12 + Owner: Neutral + Location: 114,99 + Actor744: t13 + Owner: Neutral + Location: 1,31 + Actor745: t13.husk + Owner: Neutral + Location: 41,22 + Actor746: t06 + Owner: Neutral + Location: 107,63 + Actor747: t08 + Owner: Neutral + Location: 51,79 + Actor748: t08.husk + Owner: Neutral + Location: 144,121 + Actor749: t03 + Owner: Neutral + Location: 103,54 + Actor751: t17 + Owner: Neutral + Location: 140,14 + Actor752: t06 + Owner: Neutral + Location: 64,62 + Actor753: t08 + Owner: Neutral + Location: 126,67 + Actor754: t05 + Owner: Neutral + Location: 94,111 + Actor755: t06 + Owner: Neutral + Location: 112,51 + Actor756: t12 + Owner: Neutral + Location: 56,92 + Actor757: t13 + Owner: Neutral + Location: 3,60 + Actor758: t16 + Owner: Neutral + Location: 1,76 + Actor759: t13 + Owner: Neutral + Location: 84,1 + Actor760: t13 + Owner: Neutral + Location: 85,108 + Actor761: t01 + Owner: Neutral + Location: 102,119 + Actor763: t08 + Owner: Neutral + Location: 142,66 + Actor764: t08 + Owner: Neutral + Location: 2,124 + Actor765: t05 + Owner: Neutral + Location: 96,33 + Actor766: t08 + Owner: Neutral + Location: 103,57 + Actor767: t05 + Owner: Neutral + Location: 2,127 + Actor768: t13 + Owner: Neutral + Location: 102,120 + Actor769: t07 + Owner: Neutral + Location: 140,9 + Actor770: t05 + Owner: Neutral + Location: 59,43 + Actor771: t02.husk + Owner: Neutral + Location: 110,44 + Actor772: t02 + Owner: Neutral + Location: 94,33 + Actor773: t17 + Owner: Neutral + Location: 105,59 + Actor774: t16 + Owner: Neutral + Location: 114,55 + Actor775: t01 + Owner: Neutral + Location: 98,31 + Actor776: t07 + Owner: Neutral + Location: 93,33 + Actor777: t06 + Owner: Neutral + Location: 60,47 + Actor778: t05 + Owner: Neutral + Location: 114,28 + Actor779: t01 + Owner: Neutral + Location: 55,75 + Actor780: t03 + Owner: Neutral + Location: 56,94 + Actor781: t13 + Owner: Neutral + Location: 95,39 + Actor782: t06 + Owner: Neutral + Location: 36,17 + Actor784: t07 + Owner: Neutral + Location: 93,41 + Actor785: t13 + Owner: Neutral + Location: 17,27 + Actor786: t13 + Owner: Neutral + Location: 65,44 + Actor787: t17 + Owner: Neutral + Location: 0,128 + Actor789: t17 + Owner: Neutral + Location: 119,53 + Actor790: t02 + Owner: Neutral + Location: 18,25 + Actor791: t13 + Owner: Neutral + Location: 0,49 + Actor792: t13 + Owner: Neutral + Location: 34,29 + Actor794: t07 + Owner: Neutral + Location: 142,15 + Actor795: t02 + Owner: Neutral + Location: 145,120 + Actor796: t16 + Owner: Neutral + Location: 119,54 + Actor797: t01.husk + Owner: Neutral + Location: 35,86 + Actor798: t03 + Owner: Neutral + Location: 9,125 + Actor799: t06 + Owner: Neutral + Location: 33,28 + Actor801: t02 + Owner: Neutral + Location: 114,49 + Actor802: t06 + Owner: Neutral + Location: 142,0 + Actor804: t13 + Owner: Neutral + Location: 2,79 + Actor805: t08 + Owner: Neutral + Location: 122,95 + Actor806: t03 + Owner: Neutral + Location: 93,98 + Actor807: t02 + Owner: Neutral + Location: 143,121 + Actor808: t06 + Owner: Neutral + Location: 39,74 + Actor810: t02.husk + Owner: Neutral + Location: 59,40 + Actor812: t16.husk + Owner: Neutral + Location: 129,68 + Actor815: t01 + Owner: Neutral + Location: 0,121 + Actor816: t06 + Owner: Neutral + Location: 137,0 + Actor817: t12 + Owner: Neutral + Location: 112,46 + Actor819: t05 + Owner: Neutral + Location: 1,53 + Actor820: t12 + Owner: Neutral + Location: 35,28 + Actor823: t07 + Owner: Neutral + Location: 97,99 + Actor824: t05 + Owner: Neutral + Location: 48,8 + Actor826: t08 + Owner: Neutral + Location: 91,24 + Actor827: t16 + Owner: Neutral + Location: 61,40 + Actor828: t07 + Owner: Neutral + Location: 3,52 + Actor829: t01 + Owner: Neutral + Location: 32,18 + Actor830: t16 + Owner: Neutral + Location: 142,10 + Actor833: t03 + Owner: Neutral + Location: 103,55 + Actor834: t02 + Owner: Neutral + Location: 96,102 + Actor835: t02 + Owner: Neutral + Location: 60,41 + Actor836: t05 + Owner: Neutral + Location: 0,79 + Actor837: t02 + Owner: Neutral + Location: 95,87 + Actor838: t02 + Owner: Neutral + Location: 98,36 + Actor839: t02 + Owner: Neutral + Location: 0,64 + Actor840: t08 + Owner: Neutral + Location: 141,67 + Actor841: t08 + Owner: Neutral + Location: 9,44 + Actor842: t07 + Owner: Neutral + Location: 42,79 + Actor843: t02 + Owner: Neutral + Location: 68,80 + Actor844: t13 + Owner: Neutral + Location: 123,51 + Actor846: t17 + Owner: Neutral + Location: 102,54 + Actor847: t05 + Owner: Neutral + Location: 0,31 + Actor848: t08 + Owner: Neutral + Location: 69,81 + Actor849: t05 + Owner: Neutral + Location: 12,117 + Actor850: t05 + Owner: Neutral + Location: 43,23 + Actor851: t16 + Owner: Neutral + Location: 98,37 + Actor852: t12 + Owner: Neutral + Location: 86,126 + Actor853: t17.husk + Owner: Neutral + Location: 51,77 + Actor854: t13 + Owner: Neutral + Location: 120,55 + Actor855: t05 + Owner: Neutral + Location: 143,66 + Actor856: t17 + Owner: Neutral + Location: 15,124 + Actor857: t13 + Owner: Neutral + Location: 4,59 + Actor858: t01.husk + Owner: Neutral + Location: 4,69 + Actor859: t07 + Owner: Neutral + Location: 126,50 + Actor860: t08 + Owner: Neutral + Location: 67,69 + Actor861: t05 + Owner: Neutral + Location: 20,24 + Actor862: t05 + Owner: Neutral + Location: 44,24 + Actor863: t17 + Owner: Neutral + Location: 104,64 + Actor864: t16 + Owner: Neutral + Location: 88,84 + Actor865: t08 + Owner: Neutral + Location: 90,129 + Actor866: t06 + Owner: Neutral + Location: 57,110 + Actor867: t05 + Owner: Neutral + Location: 32,20 + Actor868: t17 + Owner: Neutral + Location: 13,128 + Actor869: t06 + Owner: Neutral + Location: 105,64 + Actor870: t05 + Owner: Neutral + Location: 115,92 + Actor871: t07 + Owner: Neutral + Location: 93,120 + Actor872: t06 + Owner: Neutral + Location: 87,121 + Actor873: t06 + Owner: Neutral + Location: 55,80 + Actor874: t12 + Owner: Neutral + Location: 44,114 + Actor875: t13.husk + Owner: Neutral + Location: 53,110 + Actor876: t02 + Owner: Neutral + Location: 37,92 + Actor877: t13 + Owner: Neutral + Location: 1,10 + Actor878: t13 + Owner: Neutral + Location: 55,94 + Actor879: t07 + Owner: Neutral + Location: 96,18 + Actor880: t07 + Owner: Neutral + Location: 1,80 + Actor881: t07 + Owner: Neutral + Location: 39,24 + Actor882: t03 + Owner: Neutral + Location: 67,62 + Actor883: t01 + Owner: Neutral + Location: 98,18 + Actor884: t16.husk + Owner: Neutral + Location: 47,48 + Actor885: t06 + Owner: Neutral + Location: 96,103 + Actor886: t02 + Owner: Neutral + Location: 53,95 + Actor887: t06.husk + Owner: Neutral + Location: 145,114 + Actor888: t13 + Owner: Neutral + Location: 58,79 + Actor889: t16 + Owner: Neutral + Location: 81,0 + Actor890: t06 + Owner: Neutral + Location: 105,87 + Actor891: t02 + Owner: Neutral + Location: 144,9 + Actor892: t13 + Owner: Neutral + Location: 5,128 + Actor894: t01 + Owner: Neutral + Location: 92,123 + Actor895: t03 + Owner: Neutral + Location: 96,40 + Actor896: t13 + Owner: Neutral + Location: 96,98 + Actor897: t06 + Owner: Neutral + Location: 59,42 + Actor898: t08 + Owner: Neutral + Location: 55,114 + Actor899: t05 + Owner: Neutral + Location: 135,0 + Actor900: t01 + Owner: Neutral + Location: 117,51 + Actor901: t12 + Owner: Neutral + Location: 113,39 + Actor902: t03 + Owner: Neutral + Location: 116,94 + Actor904: t07 + Owner: Neutral + Location: 5,76 + Actor905: t17.husk + Owner: Neutral + Location: 1,59 + Actor906: t13 + Owner: Neutral + Location: 61,47 + Actor907: t16 + Owner: Neutral + Location: 2,53 + Actor908: t13 + Owner: Neutral + Location: 106,61 + Actor909: t01 + Owner: Neutral + Location: 45,78 + Actor910: t05.husk + Owner: Neutral + Location: 63,47 + Actor911: t02 + Owner: Neutral + Location: 96,108 + Actor912: t17 + Owner: Neutral + Location: 92,37 + Actor913: t13 + Owner: Neutral + Location: 132,15 + Actor914: t07 + Owner: Neutral + Location: 84,122 + Actor915: t12.husk + Owner: Neutral + Location: 1,63 + Actor916: t17 + Owner: Neutral + Location: 98,84 + Actor917: t12 + Owner: Neutral + Location: 124,70 + Actor918: t06 + Owner: Neutral + Location: 7,4 + Actor919: t16.husk + Owner: Neutral + Location: 132,66 + Actor921: t16 + Owner: Neutral + Location: 143,29 + Actor922: t12 + Owner: Neutral + Location: 118,50 + Actor923: t02 + Owner: Neutral + Location: 96,121 + Actor924: t08 + Owner: Neutral + Location: 98,59 + Actor925: t16 + Owner: Neutral + Location: 97,105 + Actor926: t17 + Owner: Neutral + Location: 94,109 + Actor927: t17 + Owner: Neutral + Location: 58,98 + Actor929: t01.husk + Owner: Neutral + Location: 8,4 + Actor931: t03 + Owner: Neutral + Location: 103,70 + Actor932: t13 + Owner: Neutral + Location: 91,34 + Actor933: t08 + Owner: Neutral + Location: 103,65 + Actor935: t05 + Owner: Neutral + Location: 45,114 + Actor936: t12 + Owner: Neutral + Location: 27,89 + Actor937: t06 + Owner: Neutral + Location: 109,97 + Actor938: t17 + Owner: Neutral + Location: 88,13 + Actor939: t02 + Owner: Neutral + Location: 0,56 + Actor940: t17 + Owner: Neutral + Location: 3,78 + Actor941: t07 + Owner: Neutral + Location: 36,90 + Actor942: t01.husk + Owner: Neutral + Location: 89,82 + Actor943: t01 + Owner: Neutral + Location: 8,124 + Actor944: t13 + Owner: Neutral + Location: 79,122 + Actor945: t13 + Owner: Neutral + Location: 95,103 + Actor946: t07 + Owner: Neutral + Location: 59,96 + Actor947: t02 + Owner: Neutral + Location: 82,123 + Actor948: t05 + Owner: Neutral + Location: 1,77 + Actor949: t03 + Owner: Neutral + Location: 113,46 + Actor950: t03 + Owner: Neutral + Location: 110,43 + Actor951: t08 + Owner: Neutral + Location: 85,121 + Actor952: t05.husk + Owner: Neutral + Location: 87,122 + Actor953: t06 + Owner: Neutral + Location: 118,10 + Actor954: t06 + Owner: Neutral + Location: 9,42 + Actor955: t02 + Owner: Neutral + Location: 40,22 + Actor956: t05 + Owner: Neutral + Location: 109,42 + Actor957: t13 + Owner: Neutral + Location: 39,60 + Actor958: t17 + Owner: Neutral + Location: 89,127 + Actor959: t12 + Owner: Neutral + Location: 103,42 + Actor960: t02 + Owner: Neutral + Location: 136,1 + Actor961: t17 + Owner: Neutral + Location: 13,117 + Actor962: t08 + Owner: Neutral + Location: 35,91 + Actor963: t03 + Owner: Neutral + Location: 131,13 + Actor964: t05 + Owner: Neutral + Location: 125,66 + Actor965: t02 + Owner: Neutral + Location: 88,26 + Actor966: t05 + Owner: Neutral + Location: 29,93 + Actor967: t05 + Owner: Neutral + Location: 95,80 + Actor968: t03 + Owner: Neutral + Location: 16,25 + Actor969: t03 + Owner: Neutral + Location: 1,69 + Actor970: t03 + Owner: Neutral + Location: 109,39 + Actor971: t02 + Owner: Neutral + Location: 96,120 + Actor972: t02 + Owner: Neutral + Location: 25,91 + Actor973: t17 + Owner: Neutral + Location: 33,23 + Actor974: t16 + Owner: Neutral + Location: 94,112 + Actor976: t02 + Owner: Neutral + Location: 43,80 + Actor977: t02 + Owner: Neutral + Location: 64,47 + Actor978: t06 + Owner: Neutral + Location: 3,127 + Actor979: t12 + Owner: Neutral + Location: 12,27 + Actor980: t05 + Owner: Neutral + Location: 40,61 + Actor982: t05 + Owner: Neutral + Location: 60,95 + Actor983: t03 + Owner: Neutral + Location: 2,56 + Actor985: t06 + Owner: Neutral + Location: 144,17 + Actor986: t16 + Owner: Neutral + Location: 31,22 + Actor987: t05 + Owner: Neutral + Location: 108,85 + Actor988: t16 + Owner: Neutral + Location: 118,54 + Actor990: t13.husk + Owner: Neutral + Location: 48,81 + Actor991: t08 + Owner: Neutral + Location: 67,62 + Actor992: t17 + Owner: Neutral + Location: 61,41 + Actor993: t17 + Owner: Neutral + Location: 97,59 + Actor994: t13 + Owner: Neutral + Location: 16,29 + Actor996: t02 + Owner: Neutral + Location: 97,58 + Actor997: t07 + Owner: Neutral + Location: 53,113 + Actor998: t01 + Owner: Neutral + Location: 92,20 + Actor999: t05 + Owner: Neutral + Location: 10,125 + Actor1000: t01 + Owner: Neutral + Location: 112,50 + Actor1001: t06.husk + Owner: Neutral + Location: 1,74 + Actor1002: t02 + Owner: Neutral + Location: 128,65 + Actor1003: t06 + Owner: Neutral + Location: 106,68 + Actor1004: t12 + Owner: Neutral + Location: 36,30 + Actor1005: t12 + Owner: Neutral + Location: 114,23 + Actor1007: t13 + Owner: Neutral + Location: 94,97 + Actor1008: t01 + Owner: Neutral + Location: 55,101 + Actor1009: t07 + Owner: Neutral + Location: 89,120 + Actor1010: t08 + Owner: Neutral + Location: 84,121 + Actor1011: t13 + Owner: Neutral + Location: 113,23 + Actor1012: t03 + Owner: Neutral + Location: 17,39 + Actor1013: t16 + Owner: Neutral + Location: 125,57 + Actor1014: t08 + Owner: Neutral + Location: 66,81 + Actor1015: t06 + Owner: Neutral + Location: 0,76 + Actor1016: t16.husk + Owner: Neutral + Location: 90,18 + Actor1017: t07 + Owner: Neutral + Location: 123,57 + Actor1018: t08 + Owner: Neutral + Location: 142,2 + Actor1019: t06 + Owner: Neutral + Location: 72,65 + Actor1022: t16 + Owner: Neutral + Location: 10,6 + Actor1023: t17 + Owner: Neutral + Location: 54,111 + Actor1024: t12 + Owner: Neutral + Location: 143,16 + Actor1025: t01 + Owner: Neutral + Location: 134,0 + Actor1026: t08 + Owner: Neutral + Location: 90,23 + Actor1027: t05 + Owner: Neutral + Location: 103,86 + Actor1028: t12 + Owner: Neutral + Location: 60,48 + Actor1029: t01 + Owner: Neutral + Location: 132,11 + Actor1030: t05 + Owner: Neutral + Location: 93,111 + Actor1031: t08 + Owner: Neutral + Location: 94,101 + Actor1032: t08 + Owner: Neutral + Location: 9,10 + Actor1033: t17 + Owner: Neutral + Location: 56,77 + Actor1034: t13 + Owner: Neutral + Location: 94,103 + Actor1035: t03 + Owner: Neutral + Location: 95,32 + Actor1036: t05 + Owner: Neutral + Location: 33,22 + Actor1037: t01 + Owner: Neutral + Location: 4,123 + Actor1038: t13 + Owner: Neutral + Location: 1,79 + Actor1039: t06 + Owner: Neutral + Location: 42,76 + Actor1040: t13 + Owner: Neutral + Location: 38,90 + Actor1041: t17 + Owner: Neutral + Location: 94,16 + Actor1042: t17 + Owner: Neutral + Location: 96,16 + Actor1043: t13 + Owner: Neutral + Location: 111,37 + Actor1045: t05 + Owner: Neutral + Location: 84,106 + Actor1046: t05 + Owner: Neutral + Location: 7,13 + Actor1047: t12 + Owner: Neutral + Location: 66,79 + Actor1048: t05 + Owner: Neutral + Location: 118,119 + Actor1049: t01 + Owner: Neutral + Location: 102,62 + Actor1050: t12 + Owner: Neutral + Location: 67,60 + Actor1051: t01 + Owner: Neutral + Location: 36,18 + Actor1052: t13.husk + Owner: Neutral + Location: 123,70 + Actor1053: t12 + Owner: Neutral + Location: 66,43 + Actor1054: t08 + Owner: Neutral + Location: 97,90 + Actor1056: t02 + Owner: Neutral + Location: 33,89 + Actor1057: t16 + Owner: Neutral + Location: 52,82 + Actor1058: t05 + Owner: Neutral + Location: 39,18 + Actor1059: t01 + Owner: Neutral + Location: 0,32 + Actor1060: t03 + Owner: Neutral + Location: 112,36 + Actor1061: t16 + Owner: Neutral + Location: 51,82 + Actor1062: t08 + Owner: Neutral + Location: 48,52 + Actor1063: t08 + Owner: Neutral + Location: 15,21 + Actor1064: t05 + Owner: Neutral + Location: 122,51 + Actor1066: t07 + Owner: Neutral + Location: 62,46 + Actor1067: t06 + Owner: Neutral + Location: 90,35 + Actor1068: t08 + Owner: Neutral + Location: 46,50 + Actor1069: t05 + Owner: Neutral + Location: 2,55 + Actor1070: t08.husk + Owner: Neutral + Location: 94,40 + Actor1071: t03 + Owner: Neutral + Location: 95,16 + Actor1072: t17 + Owner: Neutral + Location: 142,13 + Actor1073: t16 + Owner: Neutral + Location: 102,56 + Actor1074: t08 + Owner: Neutral + Location: 47,76 + Actor1075: t03 + Owner: Neutral + Location: 2,69 + Actor1076: t06 + Owner: Neutral + Location: 144,33 + Actor1077: t06.husk + Owner: Neutral + Location: 32,21 + Actor1078: t17 + Owner: Neutral + Location: 14,116 + Actor1079: t17 + Owner: Neutral + Location: 123,68 + Actor1080: t17 + Owner: Neutral + Location: 93,20 + Actor1081: t13 + Owner: Neutral + Location: 108,42 + Actor1082: t05 + Owner: Neutral + Location: 144,72 + Actor1083: t03 + Owner: Neutral + Location: 53,79 + Actor1084: t07 + Owner: Neutral + Location: 43,78 + Actor1085: t08 + Owner: Neutral + Location: 58,97 + Actor1086: t13 + Owner: Neutral + Location: 108,87 + Actor1087: t06 + Owner: Neutral + Location: 124,69 + Actor1088: t16 + Owner: Neutral + Location: 35,29 + Actor1089: t03 + Owner: Neutral + Location: 145,18 + Actor1090: t05 + Owner: Neutral + Location: 38,19 + Actor1091: t02 + Owner: Neutral + Location: 18,11 + Actor1092: t01 + Owner: Neutral + Location: 107,88 + Actor1094: t12 + Owner: Neutral + Location: 106,44 + Actor1095: t02 + Owner: Neutral + Location: 81,121 + Actor1096: t06 + Owner: Neutral + Location: 44,78 + Actor1097: t07 + Owner: Neutral + Location: 49,74 + Actor1098: t13 + Owner: Neutral + Location: 113,53 + Actor1099: t06 + Owner: Neutral + Location: 88,101 + Actor1100: t06.husk + Owner: Neutral + Location: 8,125 + Actor1102: t01 + Owner: Neutral + Location: 35,26 + Actor1103: t16 + Owner: Neutral + Location: 92,83 + Actor1104: t17 + Owner: Neutral + Location: 53,96 + Actor1105: t13 + Owner: Neutral + Location: 81,79 + Actor1106: t13 + Owner: Neutral + Location: 34,24 + Actor1107: t16 + Owner: Neutral + Location: 63,46 + Actor1108: t07.husk + Owner: Neutral + Location: 105,61 + Actor1109: t03 + Owner: Neutral + Location: 40,27 + Actor1111: t12 + Owner: Neutral + Location: 114,48 + Actor1112: t12 + Owner: Neutral + Location: 11,5 + Actor1113: t07 + Owner: Neutral + Location: 6,76 + Actor1115: t02 + Owner: Neutral + Location: 28,21 + Actor1116: t03 + Owner: Neutral + Location: 127,67 + Actor1117: t13 + Owner: Neutral + Location: 91,17 + Actor1118: t16 + Owner: Neutral + Location: 1,70 + Actor1119: t12 + Owner: Neutral + Location: 7,125 + Actor1120: t05 + Owner: Neutral + Location: 1,84 + Actor1121: t12 + Owner: Neutral + Location: 59,44 + Actor1122: t05 + Owner: Neutral + Location: 98,99 + Actor1123: t05 + Owner: Neutral + Location: 61,43 + Actor1124: t05 + Owner: Neutral + Location: 44,23 + Actor1125: t03 + Owner: Neutral + Location: 91,21 + Actor1126: t17 + Owner: Neutral + Location: 121,93 + Actor1127: t16 + Owner: Neutral + Location: 103,68 + Actor1128: t05 + Owner: Neutral + Location: 116,98 + Actor1129: t16 + Owner: Neutral + Location: 97,21 + Actor1130: t08 + Owner: Neutral + Location: 41,59 + Actor1132: t05 + Owner: Neutral + Location: 6,128 + Actor1133: t06 + Owner: Neutral + Location: 4,56 + Actor1134: t13 + Owner: Neutral + Location: 11,128 + Actor1137: t01 + Owner: Neutral + Location: 35,17 + Actor1138: t16 + Owner: Neutral + Location: 60,46 + Actor1140: t03 + Owner: Neutral + Location: 114,50 + Actor1141: t01 + Owner: Neutral + Location: 97,16 + Actor1142: t08 + Owner: Neutral + Location: 49,83 + Actor1144: t03 + Owner: Neutral + Location: 92,39 + Actor1145: t12 + Owner: Neutral + Location: 114,56 + Actor1146: t06 + Owner: Neutral + Location: 133,128 + Actor1147: t05 + Owner: Neutral + Location: 75,80 + Actor1149: t07 + Owner: Neutral + Location: 47,50 + Actor1150: t12 + Owner: Neutral + Location: 33,90 + Actor1152: t02 + Owner: Neutral + Location: 4,58 + Actor1153: t16 + Owner: Neutral + Location: 98,104 + Actor1154: t05 + Owner: Neutral + Location: 91,128 + Actor1155: t07 + Owner: Neutral + Location: 114,57 + Actor1156: t06 + Owner: Neutral + Location: 121,121 + Actor1157: t03.husk + Owner: Neutral + Location: 12,88 + Actor1158: t05 + Owner: Neutral + Location: 65,78 + Actor1159: t06 + Owner: Neutral + Location: 92,82 + Actor1160: t03 + Owner: Neutral + Location: 37,22 + Actor1161: t03 + Owner: Neutral + Location: 8,11 + Actor1162: t13.husk + Owner: Neutral + Location: 98,16 + Actor1163: t07 + Owner: Neutral + Location: 53,72 + Actor1164: t13 + Owner: Neutral + Location: 0,60 + Actor1165: t02 + Owner: Neutral + Location: 108,88 + Actor1166: t17 + Owner: Neutral + Location: 38,91 + Actor1167: t07 + Owner: Neutral + Location: 109,80 + Actor1168: t02.husk + Owner: Neutral + Location: 85,123 + Actor1170: t16 + Owner: Neutral + Location: 144,18 + Actor1171: t08.husk + Owner: Neutral + Location: 93,84 + Actor1172: t02 + Owner: Neutral + Location: 142,20 + Actor1173: t08.husk + Owner: Neutral + Location: 49,11 + Actor1174: t05 + Owner: Neutral + Location: 112,53 + Actor1175: t02.husk + Owner: Neutral + Location: 54,113 + Actor1177: t13 + Owner: Neutral + Location: 99,99 + Actor1178: t03 + Owner: Neutral + Location: 63,45 + Actor1179: t17 + Owner: Neutral + Location: 96,35 + Actor1180: t13 + Owner: Neutral + Location: 95,100 + Actor1181: t01 + Owner: Neutral + Location: 113,22 + Actor1182: t13 + Owner: Neutral + Location: 95,112 + Actor1183: t12 + Owner: Neutral + Location: 77,78 + Actor1184: t13 + Owner: Neutral + Location: 133,127 + Actor1185: t16 + Owner: Neutral + Location: 145,5 + Actor1186: t17 + Owner: Neutral + Location: 83,74 + Actor1187: t17 + Owner: Neutral + Location: 1,128 + Actor1188: t05 + Owner: Neutral + Location: 32,24 + Actor1189: t08 + Owner: Neutral + Location: 69,61 + Actor1190: t01 + Owner: Neutral + Location: 59,41 + Actor1191: t03 + Owner: Neutral + Location: 123,54 + Actor1192: t06 + Owner: Neutral + Location: 129,50 + Actor1193: t03 + Owner: Neutral + Location: 43,26 + Actor1194: t06 + Owner: Neutral + Location: 105,58 + Actor1196: t16 + Owner: Neutral + Location: 88,121 + Actor1197: t07 + Owner: Neutral + Location: 98,89 + Actor1198: t12 + Owner: Neutral + Location: 95,38 + Actor1199: t06 + Owner: Neutral + Location: 98,98 + Actor1200: t05 + Owner: Neutral + Location: 92,81 + Actor1202: t05 + Owner: Neutral + Location: 7,6 + Actor1203: t03 + Owner: Neutral + Location: 114,102 + Actor1204: t02 + Owner: Neutral + Location: 81,120 + Actor1207: t08 + Owner: Neutral + Location: 144,2 + Actor1208: t12 + Owner: Neutral + Location: 110,47 + Actor1209: t12 + Owner: Neutral + Location: 88,19 + Actor1210: t17 + Owner: Neutral + Location: 93,42 + Actor1211: t05 + Owner: Neutral + Location: 1,55 + Actor1212: t12 + Owner: Neutral + Location: 90,16 + Actor1213: t12 + Owner: Neutral + Location: 43,75 + Actor1214: t06 + Owner: Neutral + Location: 1,127 + Actor1215: t16 + Owner: Neutral + Location: 122,53 + Actor1216: t13 + Owner: Neutral + Location: 38,27 + Actor1217: t12 + Owner: Neutral + Location: 54,75 + Actor1218: t05 + Owner: Neutral + Location: 89,88 + Actor1219: t06 + Owner: Neutral + Location: 12,3 + Actor1220: t13 + Owner: Neutral + Location: 44,50 + Actor1221: t05 + Owner: Neutral + Location: 56,110 + Actor1222: t03 + Owner: Neutral + Location: 54,100 + Actor1223: t03 + Owner: Neutral + Location: 51,98 + Actor1224: t16 + Owner: Neutral + Location: 83,103 + Actor1225: t13 + Owner: Neutral + Location: 93,85 + Actor1226: t02 + Owner: Neutral + Location: 98,21 + Actor1227: t08 + Owner: Neutral + Location: 104,91 + Actor1228: t07 + Owner: Neutral + Location: 141,65 + Actor1229: t16 + Owner: Neutral + Location: 102,63 + Actor1230: t07 + Owner: Neutral + Location: 31,23 + Actor1231: t17 + Owner: Neutral + Location: 112,52 + Actor1232: t02 + Owner: Neutral + Location: 61,46 + Actor1233: t02 + Owner: Neutral + Location: 75,79 + Actor1234: t02 + Owner: Neutral + Location: 106,69 + Actor1235: t12 + Owner: Neutral + Location: 2,128 + Actor1236: t05 + Owner: Neutral + Location: 142,63 + Actor1237: t02 + Owner: Neutral + Location: 98,83 + Actor1238: t07 + Owner: Neutral + Location: 47,10 + Actor1239: t05 + Owner: Neutral + Location: 125,67 + Actor1240: t03 + Owner: Neutral + Location: 145,12 + Actor1241: t06 + Owner: Neutral + Location: 124,53 + Actor1242: t08 + Owner: Neutral + Location: 63,63 + Actor1244: t16 + Owner: Neutral + Location: 89,23 + Actor1245: t07 + Owner: Neutral + Location: 56,95 + Actor1246: t13 + Owner: Neutral + Location: 93,121 + Actor1247: t02 + Owner: Neutral + Location: 53,93 + Actor1248: t03 + Owner: Neutral + Location: 41,59 + Actor1249: t03 + Owner: Neutral + Location: 36,25 + Actor1250: t17 + Owner: Neutral + Location: 9,11 + Actor1251: t05 + Owner: Neutral + Location: 105,60 + Actor1252: t08 + Owner: Neutral + Location: 98,86 + Actor1253: t08 + Owner: Neutral + Location: 116,93 + Actor1255: t16 + Owner: Neutral + Location: 36,31 + Actor1257: t16.husk + Owner: Neutral + Location: 112,44 + Actor1258: t02.husk + Owner: Neutral + Location: 1,75 + Actor1259: t17 + Owner: Neutral + Location: 143,77 + Actor1260: t01.husk + Owner: Neutral + Location: 114,24 + Actor1261: t13 + Owner: Neutral + Location: 5,83 + Actor1263: t12 + Owner: Neutral + Location: 32,27 + Actor1264: t05 + Owner: Neutral + Location: 95,120 + Actor1265: t17 + Owner: Neutral + Location: 109,43 + Actor1266: t05 + Owner: Neutral + Location: 1,60 + Actor1268: t02 + Owner: Neutral + Location: 10,5 + Actor1269: t05 + Owner: Neutral + Location: 4,65 + Actor1270: t17 + Owner: Neutral + Location: 51,84 + Actor1271: t16 + Owner: Neutral + Location: 144,123 + Actor1272: t16 + Owner: Neutral + Location: 84,101 + Actor1274: t01 + Owner: Neutral + Location: 0,119 + Actor1275: t08 + Owner: Neutral + Location: 98,122 + Actor1276: t01 + Owner: Neutral + Location: 55,77 + Actor1277: t01 + Owner: Neutral + Location: 47,49 + Actor1278: t06.husk + Owner: Neutral + Location: 52,9 + Actor1279: t03 + Owner: Neutral + Location: 109,38 + Actor1280: t13 + Owner: Neutral + Location: 69,79 + Actor1281: t05 + Owner: Neutral + Location: 40,21 + Actor1282: t02 + Owner: Neutral + Location: 98,105 + Actor1283: t13 + Owner: Neutral + Location: 55,93 + Actor1285: t06 + Owner: Neutral + Location: 103,65 + Actor1286: t05.husk + Owner: Neutral + Location: 107,43 + Actor1287: t02 + Owner: Neutral + Location: 83,123 + Actor1288: t12.husk + Owner: Neutral + Location: 96,41 + Actor1289: t08 + Owner: Neutral + Location: 34,21 + Actor1290: t06.husk + Owner: Neutral + Location: 9,5 + Actor1291: t08 + Owner: Neutral + Location: 95,99 + Actor1292: t07 + Owner: Neutral + Location: 30,19 + Actor1293: t05 + Owner: Neutral + Location: 63,43 + Actor1294: t02 + Owner: Neutral + Location: 61,44 + Actor1296: t06 + Owner: Neutral + Location: 41,79 + Actor1297: t12 + Owner: Neutral + Location: 52,76 + Actor1298: t03 + Owner: Neutral + Location: 60,80 + Actor1299: t03 + Owner: Neutral + Location: 54,72 + Actor1301: t12 + Owner: Neutral + Location: 92,18 + Actor1302: t17 + Owner: Neutral + Location: 57,81 + Actor1303: t17 + Owner: Neutral + Location: 68,68 + Actor1304: t03 + Owner: Neutral + Location: 104,88 + Actor1306: t17 + Owner: Neutral + Location: 2,122 + Actor1307: t07 + Owner: Neutral + Location: 91,24 + Actor1308: t13 + Owner: Neutral + Location: 106,65 + Actor1309: t03.husk + Owner: Neutral + Location: 46,50 + Actor1310: t13 + Owner: Neutral + Location: 46,8 + Actor1311: t08 + Owner: Neutral + Location: 123,98 + Actor1312: t08 + Owner: Neutral + Location: 96,85 + Actor1313: t03 + Owner: Neutral + Location: 39,77 + Actor1314: t07 + Owner: Neutral + Location: 4,76 + Actor1315: t02 + Owner: Neutral + Location: 57,91 + Actor1317: t03 + Owner: Neutral + Location: 34,28 + Actor1318: t05.husk + Owner: Neutral + Location: 19,27 + Actor1319: t07 + Owner: Neutral + Location: 2,70 + Actor1320: t08 + Owner: Neutral + Location: 115,59 + Actor1321: t16 + Owner: Neutral + Location: 126,71 + Actor1322: t02 + Owner: Neutral + Location: 95,36 + Actor1323: t17.husk + Owner: Neutral + Location: 1,124 + Actor1324: t16.husk + Owner: Neutral + Location: 53,6 + Actor1325: t03 + Owner: Neutral + Location: 124,71 + Actor1326: t03 + Owner: Neutral + Location: 127,50 + Actor1328: t02 + Owner: Neutral + Location: 56,93 + Actor1329: t06 + Owner: Neutral + Location: 90,121 + Actor1330: t05 + Owner: Neutral + Location: 4,83 + Actor1331: t06 + Owner: Neutral + Location: 106,63 + Actor1332: t06 + Owner: Neutral + Location: 4,78 + Actor1334: t13 + Owner: Neutral + Location: 102,53 + Actor1335: t17 + Owner: Neutral + Location: 48,75 + Actor1336: t05 + Owner: Neutral + Location: 95,107 + Actor1337: t13 + Owner: Neutral + Location: 142,67 + Actor1338: t05 + Owner: Neutral + Location: 136,0 + Actor1339: t08 + Owner: Neutral + Location: 108,87 + Actor1340: t13 + Owner: Neutral + Location: 86,120 + Actor1342: t07 + Owner: Neutral + Location: 55,82 + Actor1343: t16 + Owner: Neutral + Location: 8,44 + Actor1344: t17 + Owner: Neutral + Location: 48,82 + Actor1345: t16 + Owner: Neutral + Location: 64,79 + Actor1346: t12 + Owner: Neutral + Location: 137,25 + Actor1348: t16 + Owner: Neutral + Location: 106,89 + Actor1349: t07.husk + Owner: Neutral + Location: 19,12 + Actor1350: t07 + Owner: Neutral + Location: 92,80 + Actor1351: t13 + Owner: Neutral + Location: 0,81 + Actor1352: t07 + Owner: Neutral + Location: 26,92 + Actor1353: t17 + Owner: Neutral + Location: 143,120 + Actor1354: t12 + Owner: Neutral + Location: 99,17 + Actor1355: t08 + Owner: Neutral + Location: 131,67 + Actor1357: t13 + Owner: Neutral + Location: 121,97 + Actor1358: t16 + Owner: Neutral + Location: 132,12 + Actor1359: t13 + Owner: Neutral + Location: 92,34 + Actor1360: t12 + Owner: Neutral + Location: 36,27 + Actor1361: t07 + Owner: Neutral + Location: 115,29 + Actor1362: t05 + Owner: Neutral + Location: 72,64 + Actor1364: t01 + Owner: Neutral + Location: 94,120 + Actor1365: t12 + Owner: Neutral + Location: 118,94 + Actor1366: t13 + Owner: Neutral + Location: 4,71 + Actor1367: t13.husk + Owner: Neutral + Location: 80,66 + Actor1368: t05 + Owner: Neutral + Location: 88,24 + Actor1369: t03 + Owner: Neutral + Location: 145,96 + Actor1370: t05 + Owner: Neutral + Location: 3,75 + Actor1371: t03 + Owner: Neutral + Location: 50,80 + Actor1372: t08 + Owner: Neutral + Location: 7,73 + Actor1373: t02.husk + Owner: Neutral + Location: 142,9 + Actor1375: t16 + Owner: Neutral + Location: 39,26 + Actor1376: t07 + Owner: Neutral + Location: 87,127 + Actor1377: t16 + Owner: Neutral + Location: 97,101 + Actor1378: t08 + Owner: Neutral + Location: 94,42 + Actor1379: t05 + Owner: Neutral + Location: 9,8 + Actor1380: t01 + Owner: Neutral + Location: 55,109 + Actor1381: t05 + Owner: Neutral + Location: 113,56 + Actor1382: t06 + Owner: Neutral + Location: 33,30 + Actor1383: t16 + Owner: Neutral + Location: 89,101 + Actor1384: t16 + Owner: Neutral + Location: 107,89 + Actor1385: t16 + Owner: Neutral + Location: 137,128 + Actor1386: t16 + Owner: Neutral + Location: 43,49 + Actor1387: t06 + Owner: Neutral + Location: 100,87 + Actor1388: t02 + Owner: Neutral + Location: 31,75 + Actor1391: t01 + Owner: Neutral + Location: 109,36 + Actor1392: t05 + Owner: Neutral + Location: 143,30 + Actor1393: t13 + Owner: Neutral + Location: 144,64 + Actor1394: t08 + Owner: Neutral + Location: 141,1 + Actor1395: t05 + Owner: Neutral + Location: 98,34 + Actor1396: t16 + Owner: Neutral + Location: 20,28 + Actor1397: t05 + Owner: Neutral + Location: 18,29 + Actor1398: t01 + Owner: Neutral + Location: 37,19 + Actor1399: t13 + Owner: Neutral + Location: 49,79 + Actor1400: t01 + Owner: Neutral + Location: 143,72 + Actor1401: t17 + Owner: Neutral + Location: 96,39 + Actor1402: t01 + Owner: Neutral + Location: 87,108 + Actor1403: t17 + Owner: Neutral + Location: 141,9 + Actor1404: t02 + Owner: Neutral + Location: 37,91 + Actor1405: t03 + Owner: Neutral + Location: 100,101 + Actor1406: t08 + Owner: Neutral + Location: 145,96 + Actor1407: t03 + Owner: Neutral + Location: 4,84 + Actor1408: t06 + Owner: Neutral + Location: 134,1 + Actor1409: t12 + Owner: Neutral + Location: 55,73 + Actor1410: t05 + Owner: Neutral + Location: 60,89 + Actor1411: t17 + Owner: Neutral + Location: 40,25 + Actor1412: t17 + Owner: Neutral + Location: 91,25 + Actor1413: t12.husk + Owner: Neutral + Location: 118,95 + Actor1414: t08 + Owner: Neutral + Location: 0,49 + Actor1415: t16 + Owner: Neutral + Location: 18,37 + Actor1416: t06 + Owner: Neutral + Location: 1,72 + Actor1417: t08.husk + Owner: Neutral + Location: 81,124 + Actor1418: t02 + Owner: Neutral + Location: 50,6 + Actor1419: t03 + Owner: Neutral + Location: 2,65 + Actor1420: t12 + Owner: Neutral + Location: 116,59 + Actor1421: t01 + Owner: Neutral + Location: 48,79 + Actor1422: t13 + Owner: Neutral + Location: 40,60 + Actor1423: t12 + Owner: Neutral + Location: 18,128 + Actor1424: t12 + Owner: Neutral + Location: 40,42 + Actor1426: t01 + Owner: Neutral + Location: 104,68 + Actor1427: t06 + Owner: Neutral + Location: 145,17 + Actor1428: t17 + Owner: Neutral + Location: 52,96 + Actor1429: t06 + Owner: Neutral + Location: 47,77 + Actor1430: t03 + Owner: Neutral + Location: 135,1 + Actor1431: t05 + Owner: Neutral + Location: 37,17 + Actor1432: t17.husk + Owner: Neutral + Location: 17,26 + Actor1433: t08 + Owner: Neutral + Location: 73,67 + Actor1434: t08 + Owner: Neutral + Location: 57,94 + Actor1436: t12 + Owner: Neutral + Location: 138,0 + Actor1437: t08 + Owner: Neutral + Location: 17,29 + Actor1438: t13 + Owner: Neutral + Location: 32,29 + Actor1439: t05 + Owner: Neutral + Location: 0,80 + Actor1440: t06.husk + Owner: Neutral + Location: 97,98 + Actor1441: t03 + Owner: Neutral + Location: 89,123 + Actor1442: t05.husk + Owner: Neutral + Location: 14,124 + Actor1443: t17 + Owner: Neutral + Location: 108,38 + Actor1444: t03 + Owner: Neutral + Location: 95,35 + Actor1445: t07 + Owner: Neutral + Location: 123,69 + Actor1446: t01 + Owner: Neutral + Location: 99,104 + Actor1447: t02 + Owner: Neutral + Location: 129,67 + Actor1449: t07 + Owner: Neutral + Location: 95,40 + Actor1450: t08 + Owner: Neutral + Location: 105,63 + Actor1451: t06 + Owner: Neutral + Location: 52,78 + Actor1452: t02 + Owner: Neutral + Location: 71,65 + Actor1454: t08 + Owner: Neutral + Location: 136,27 + Actor1455: t07 + Owner: Neutral + Location: 30,21 + Actor1456: t03 + Owner: Neutral + Location: 142,19 + Actor1457: t06.husk + Owner: Neutral + Location: 44,80 + Actor1458: t17 + Owner: Neutral + Location: 33,29 + Actor1459: t03 + Owner: Neutral + Location: 44,25 + Actor1460: t01 + Owner: Neutral + Location: 116,102 + Actor1461: t17 + Owner: Neutral + Location: 20,36 + Actor1462: t08 + Owner: Neutral + Location: 41,22 + Actor1463: t07 + Owner: Neutral + Location: 21,40 + Actor1464: t12 + Owner: Neutral + Location: 85,118 + Actor1465: t07 + Owner: Neutral + Location: 137,2 + Actor1466: t05 + Owner: Neutral + Location: 93,38 + Actor1467: t07 + Owner: Neutral + Location: 104,55 + Actor1468: t05 + Owner: Neutral + Location: 94,43 + Actor1469: t07 + Owner: Neutral + Location: 141,64 + Actor1470: t16 + Owner: Neutral + Location: 9,128 + Actor1471: t06 + Owner: Neutral + Location: 124,57 + Actor1472: t07 + Owner: Neutral + Location: 65,62 + Actor1473: t12 + Owner: Neutral + Location: 121,54 + Actor1474: t08 + Owner: Neutral + Location: 107,87 + Actor1475: t17 + Owner: Neutral + Location: 76,79 + Actor1476: t07 + Owner: Neutral + Location: 118,93 + Actor1477: t01 + Owner: Neutral + Location: 62,61 + Actor1478: t01 + Owner: Neutral + Location: 115,52 + Actor1479: t07 + Owner: Neutral + Location: 54,6 + Actor1480: t06 + Owner: Neutral + Location: 36,26 + Actor1481: t13 + Owner: Neutral + Location: 97,103 + Actor1482: t07 + Owner: Neutral + Location: 115,55 + Actor1484: t17 + Owner: Neutral + Location: 97,86 + Actor1485: t05 + Owner: Neutral + Location: 5,80 + Actor1486: t01 + Owner: Neutral + Location: 18,38 + Actor1487: t05 + Owner: Neutral + Location: 6,80 + Actor1488: t06 + Owner: Neutral + Location: 144,13 + Actor1489: t02 + Owner: Neutral + Location: 106,86 + Actor1490: t01 + Owner: Neutral + Location: 36,28 + Actor1492: t01 + Owner: Neutral + Location: 106,67 + Actor1493: t17 + Owner: Neutral + Location: 98,119 + Actor1495: t05 + Owner: Neutral + Location: 96,86 + Actor1497: t03.husk + Owner: Neutral + Location: 108,78 + Actor1498: t03 + Owner: Neutral + Location: 103,62 + Actor1499: t12 + Owner: Neutral + Location: 1,58 + Actor1500: t05 + Owner: Neutral + Location: 66,68 + Actor1501: t02.husk + Owner: Neutral + Location: 108,39 + Actor1502: t17.husk + Owner: Neutral + Location: 55,92 + Actor1503: t03 + Owner: Neutral + Location: 63,79 + Actor1504: t06 + Owner: Neutral + Location: 58,44 + Actor1505: t08.husk + Owner: Neutral + Location: 37,22 + Actor1506: t16 + Owner: Neutral + Location: 132,127 + Actor1507: t06 + Owner: Neutral + Location: 2,81 + Actor1508: t16 + Owner: Neutral + Location: 56,97 + Actor1509: t16 + Owner: Neutral + Location: 48,50 + Actor1510: t17 + Owner: Neutral + Location: 48,78 + Actor1511: t08.husk + Owner: Neutral + Location: 144,9 + Actor1512: t01 + Owner: Neutral + Location: 43,76 + Actor1513: t07.husk + Owner: Neutral + Location: 98,57 + Actor1514: t08 + Owner: Neutral + Location: 1,57 + Actor1515: t01 + Owner: Neutral + Location: 142,16 + Actor1516: t16 + Owner: Neutral + Location: 54,96 + Actor1517: t01 + Owner: Neutral + Location: 88,106 + Actor1518: t16 + Owner: Neutral + Location: 69,67 + Actor1519: t08 + Owner: Neutral + Location: 99,120 + Actor1520: t17 + Owner: Neutral + Location: 140,20 + Actor1521: t05 + Owner: Neutral + Location: 141,17 + Actor1522: t08.husk + Owner: Neutral + Location: 43,95 + Actor1523: t05.husk + Owner: Neutral + Location: 53,97 + Actor1524: t07 + Owner: Neutral + Location: 21,37 + Actor1526: t08 + Owner: Neutral + Location: 38,93 + Actor1527: t17 + Owner: Neutral + Location: 0,124 + Actor1528: t13 + Owner: Neutral + Location: 120,100 + Actor1529: t07 + Owner: Neutral + Location: 96,105 + Actor1530: t03.husk + Owner: Neutral + Location: 95,106 + Actor1531: t05 + Owner: Neutral + Location: 17,124 + Actor1532: t17 + Owner: Neutral + Location: 86,18 + Actor1533: t07 + Owner: Neutral + Location: 145,16 + Actor1534: t12 + Owner: Neutral + Location: 94,119 + Actor1535: t01 + Owner: Neutral + Location: 117,98 + Actor1536: t17 + Owner: Neutral + Location: 141,20 + Actor1537: t07 + Owner: Neutral + Location: 42,75 + Actor1539: t03 + Owner: Neutral + Location: 120,53 + Actor1540: t17 + Owner: Neutral + Location: 50,81 + Actor1541: t01 + Owner: Neutral + Location: 90,80 + Actor1542: t17.husk + Owner: Neutral + Location: 1,123 + Actor1543: t08 + Owner: Neutral + Location: 67,68 + Actor1544: t13 + Owner: Neutral + Location: 7,42 + Actor1545: t01 + Owner: Neutral + Location: 83,73 + Actor1546: t16 + Owner: Neutral + Location: 92,100 + Actor1547: t07 + Owner: Neutral + Location: 63,42 + Actor1548: t07 + Owner: Neutral + Location: 62,45 + Actor1549: t17 + Owner: Neutral + Location: 94,85 + Actor1550: t17.husk + Owner: Neutral + Location: 43,50 + Actor1551: t08 + Owner: Neutral + Location: 107,38 + Actor1553: t16 + Owner: Neutral + Location: 2,84 + Actor1554: t07.husk + Owner: Neutral + Location: 1,62 + Actor1555: t16 + Owner: Neutral + Location: 123,52 + Actor1556: t05 + Owner: Neutral + Location: 56,81 + Actor1557: t05 + Owner: Neutral + Location: 56,98 + Actor1559: t02 + Owner: Neutral + Location: 5,82 + Actor1560: t13 + Owner: Neutral + Location: 19,37 + Actor1561: t16 + Owner: Neutral + Location: 89,124 + Actor1562: t13 + Owner: Neutral + Location: 98,33 + Actor1564: t12 + Owner: Neutral + Location: 12,128 + Actor1565: t03 + Owner: Neutral + Location: 94,121 + Actor1566: t12 + Owner: Neutral + Location: 6,124 + Actor1567: t13 + Owner: Neutral + Location: 142,2 + Actor1569: t08 + Owner: Neutral + Location: 31,25 + Actor1570: t02.husk + Owner: Neutral + Location: 94,82 + Actor1571: t02 + Owner: Neutral + Location: 83,102 + Actor1572: t03 + Owner: Neutral + Location: 7,11 + Actor1573: t17 + Owner: Neutral + Location: 8,7 + Actor1574: t16 + Owner: Neutral + Location: 42,73 + Actor1577: t16 + Owner: Neutral + Location: 91,123 + Actor1578: t08 + Owner: Neutral + Location: 83,0 + Actor1579: t08 + Owner: Neutral + Location: 84,124 + Actor1581: t16 + Owner: Neutral + Location: 79,78 + Actor1582: t05 + Owner: Neutral + Location: 54,109 + Actor1583: t13 + Owner: Neutral + Location: 41,42 + Actor1584: t05 + Owner: Neutral + Location: 45,76 + Actor1585: t06 + Owner: Neutral + Location: 97,17 + Actor1586: t01 + Owner: Neutral + Location: 105,65 + Actor1587: t06 + Owner: Neutral + Location: 7,12 + Actor1588: t03 + Owner: Neutral + Location: 35,30 + Actor1589: t12 + Owner: Neutral + Location: 136,27 + Actor1590: t08.husk + Owner: Neutral + Location: 112,41 + Actor1591: t01 + Owner: Neutral + Location: 121,53 + Actor1592: t13 + Owner: Neutral + Location: 16,21 + Actor1593: t05 + Owner: Neutral + Location: 52,72 + Actor1594: t17 + Owner: Neutral + Location: 17,40 + Actor1595: t16 + Owner: Neutral + Location: 69,64 + Actor1596: t08 + Owner: Neutral + Location: 53,112 + Actor1597: t17 + Owner: Neutral + Location: 59,45 + Actor1598: t01 + Owner: Neutral + Location: 97,83 + Actor1599: t08 + Owner: Neutral + Location: 59,47 + Actor1600: t05 + Owner: Neutral + Location: 115,99 + Actor1601: t06 + Owner: Neutral + Location: 103,121 + Actor1602: t02 + Owner: Neutral + Location: 95,86 + Actor1603: t05 + Owner: Neutral + Location: 42,23 + Actor1604: t17 + Owner: Neutral + Location: 95,34 + Actor1605: t06 + Owner: Neutral + Location: 28,91 + Actor1606: t13 + Owner: Neutral + Location: 90,123 + Actor1608: t06 + Owner: Neutral + Location: 70,80 + Actor1609: t07 + Owner: Neutral + Location: 11,124 + Actor1610: t01 + Owner: Neutral + Location: 106,64 + Actor1611: t07 + Owner: Neutral + Location: 144,6 + Actor1612: t08 + Owner: Neutral + Location: 143,71 + Actor1613: t02 + Owner: Neutral + Location: 112,37 + Actor1615: t02.husk + Owner: Neutral + Location: 109,46 + Actor1616: t03 + Owner: Neutral + Location: 111,40 + Actor1617: t16 + Owner: Neutral + Location: 89,83 + Actor1619: t03 + Owner: Neutral + Location: 59,79 + Actor1620: t05 + Owner: Neutral + Location: 93,99 + Actor1621: t07 + Owner: Neutral + Location: 97,22 + Actor1622: t16 + Owner: Neutral + Location: 60,44 + Actor1625: t17 + Owner: Neutral + Location: 109,85 + Actor1626: t01 + Owner: Neutral + Location: 89,128 + Actor1627: t07 + Owner: Neutral + Location: 115,59 + Actor1628: t02 + Owner: Neutral + Location: 144,121 + Actor1629: t17 + Owner: Neutral + Location: 133,12 + Actor1630: t16 + Owner: Neutral + Location: 68,63 + Actor1631: t01 + Owner: Neutral + Location: 76,80 + Actor1632: t17 + Owner: Neutral + Location: 130,66 + Actor1633: t05 + Owner: Neutral + Location: 102,55 + Actor1634: t13 + Owner: Neutral + Location: 124,52 + Actor1635: t05 + Owner: Neutral + Location: 93,43 + Actor1637: t06 + Owner: Neutral + Location: 104,57 + Actor1638: t13 + Owner: Neutral + Location: 130,67 + Actor1639: t02 + Owner: Neutral + Location: 64,78 + Actor1640: t01 + Owner: Neutral + Location: 6,81 + Actor1641: t17 + Owner: Neutral + Location: 9,126 + Actor1642: t13 + Owner: Neutral + Location: 113,47 + Actor1643: t01 + Owner: Neutral + Location: 105,45 + Actor1644: t17 + Owner: Neutral + Location: 82,76 + Actor1645: t17 + Owner: Neutral + Location: 87,25 + Actor1646: t07 + Owner: Neutral + Location: 92,16 + Actor1647: t03 + Owner: Neutral + Location: 123,53 + Actor1648: t07 + Owner: Neutral + Location: 29,88 + Actor1649: t08 + Owner: Neutral + Location: 97,38 + Actor1650: t16 + Owner: Neutral + Location: 37,94 + Actor1651: t03 + Owner: Neutral + Location: 90,120 + Actor1652: t05 + Owner: Neutral + Location: 91,127 + Actor1654: t17 + Owner: Neutral + Location: 121,98 + Actor1655: t12 + Owner: Neutral + Location: 59,91 + Actor1656: t01 + Owner: Neutral + Location: 98,17 + Actor1657: t13 + Owner: Neutral + Location: 93,39 + Actor1658: t01 + Owner: Neutral + Location: 140,12 + Actor1659: t02.husk + Owner: Neutral + Location: 51,83 + Actor1660: t03 + Owner: Neutral + Location: 91,82 + Actor1661: t17 + Owner: Neutral + Location: 71,64 + Actor1662: t12 + Owner: Neutral + Location: 13,125 + Actor1663: t01 + Owner: Neutral + Location: 93,40 + Actor1664: t01 + Owner: Neutral + Location: 145,3 + Actor1665: t16 + Owner: Neutral + Location: 19,124 + Actor1666: t16 + Owner: Neutral + Location: 99,32 + Actor1667: t05 + Owner: Neutral + Location: 16,20 + Actor1668: t05 + Owner: Neutral + Location: 143,79 + Actor1670: t01.husk + Owner: Neutral + Location: 122,58 + Actor1671: t16 + Owner: Neutral + Location: 102,86 + Actor1672: t07 + Owner: Neutral + Location: 128,68 + Actor1674: t06 + Owner: Neutral + Location: 2,85 + Actor1677: t02.husk + Owner: Neutral + Location: 140,8 + Actor1678: t12 + Owner: Neutral + Location: 3,124 + Actor1679: t13.husk + Owner: Neutral + Location: 122,66 + Actor1680: t06 + Owner: Neutral + Location: 55,71 + Actor1681: t05 + Owner: Neutral + Location: 118,118 + Actor1682: t03.husk + Owner: Neutral + Location: 83,101 + Actor1683: t01 + Owner: Neutral + Location: 2,63 + Actor1684: t07 + Owner: Neutral + Location: 102,43 + Actor1685: t08 + Owner: Neutral + Location: 55,111 + Actor1686: t02 + Owner: Neutral + Location: 4,124 + Actor1687: t16 + Owner: Neutral + Location: 3,59 + Actor1688: t13 + Owner: Neutral + Location: 143,8 + Actor1689: t06 + Owner: Neutral + Location: 121,100 + Actor1690: t16 + Owner: Neutral + Location: 103,67 + Actor1691: t12 + Owner: Neutral + Location: 35,19 + Actor1692: t16 + Owner: Neutral + Location: 51,94 + Actor1694: t13 + Owner: Neutral + Location: 120,102 + Actor1695: t03 + Owner: Neutral + Location: 68,64 + Actor1696: t16 + Owner: Neutral + Location: 59,47 + Actor1697: t08 + Owner: Neutral + Location: 70,36 + Actor1699: t17.husk + Owner: Neutral + Location: 18,27 + Actor1700: t05 + Owner: Neutral + Location: 100,104 + Actor1701: t16 + Owner: Neutral + Location: 38,93 + Actor1702: t01 + Owner: Neutral + Location: 139,0 + Actor1703: t03 + Owner: Neutral + Location: 96,101 + Actor1705: t01.husk + Owner: Neutral + Location: 45,81 + Actor1706: t12 + Owner: Neutral + Location: 136,2 + Actor1707: t02 + Owner: Neutral + Location: 15,127 + Actor1708: t17 + Owner: Neutral + Location: 37,87 + Actor1709: t08 + Owner: Neutral + Location: 0,31 + Actor1710: t13 + Owner: Neutral + Location: 58,91 + Actor1711: t05 + Owner: Neutral + Location: 100,103 + Actor1712: t16 + Owner: Neutral + Location: 73,78 + Actor1713: t05 + Owner: Neutral + Location: 51,75 + Actor1714: t06 + Owner: Neutral + Location: 101,86 + Actor1715: t16 + Owner: Neutral + Location: 87,24 + Actor1716: t16 + Owner: Neutral + Location: 84,104 + Actor1717: t01 + Owner: Neutral + Location: 106,45 + Actor1718: t17 + Owner: Neutral + Location: 145,97 + Actor1719: t16 + Owner: Neutral + Location: 77,33 + Actor1720: t16.husk + Owner: Neutral + Location: 92,128 + Actor1721: t03 + Owner: Neutral + Location: 130,65 + Actor1722: t08 + Owner: Neutral + Location: 104,63 + Actor1723: t06 + Owner: Neutral + Location: 141,3 + Actor1724: t06 + Owner: Neutral + Location: 90,17 + Actor1725: t03.husk + Owner: Neutral + Location: 69,78 + Actor1726: t03 + Owner: Neutral + Location: 40,43 + Actor1727: t17 + Owner: Neutral + Location: 77,79 + Actor1728: t06 + Owner: Neutral + Location: 2,60 + Actor1729: t17 + Owner: Neutral + Location: 17,126 + Actor1730: t08 + Owner: Neutral + Location: 115,24 + Actor1731: t03 + Owner: Neutral + Location: 91,88 + Actor1734: t03 + Owner: Neutral + Location: 36,22 + Actor1735: t07 + Owner: Neutral + Location: 14,128 + Actor1736: t07 + Owner: Neutral + Location: 98,35 + Actor1737: t01 + Owner: Neutral + Location: 57,79 + Actor1738: t03 + Owner: Neutral + Location: 90,67 + Actor1739: t06 + Owner: Neutral + Location: 92,38 + Actor1740: t03 + Owner: Neutral + Location: 10,128 + Actor1741: t05 + Owner: Neutral + Location: 92,42 + Actor1743: t12 + Owner: Neutral + Location: 114,54 + Actor1744: t06 + Owner: Neutral + Location: 58,92 + Actor1745: t17 + Owner: Neutral + Location: 27,91 + Actor1746: t07 + Owner: Neutral + Location: 89,85 + Actor1747: t13 + Owner: Neutral + Location: 58,81 + Actor1748: t08 + Owner: Neutral + Location: 104,57 + Actor1749: t16 + Owner: Neutral + Location: 96,99 + Actor1750: t13 + Owner: Neutral + Location: 144,12 + Actor1751: t16 + Owner: Neutral + Location: 14,127 + Actor1752: t08 + Owner: Neutral + Location: 34,87 + Actor1753: t01 + Owner: Neutral + Location: 31,19 + Actor1754: t06 + Owner: Neutral + Location: 59,95 + Actor1756: t02.husk + Owner: Neutral + Location: 62,44 + Actor1757: t07 + Owner: Neutral + Location: 113,37 + Actor1758: t02.husk + Owner: Neutral + Location: 54,93 + Actor1759: t01 + Owner: Neutral + Location: 1,82 + Actor1760: t12 + Owner: Neutral + Location: 53,100 + Actor1761: t07 + Owner: Neutral + Location: 139,61 + Actor1762: t17 + Owner: Neutral + Location: 18,28 + Actor1763: t06.husk + Owner: Neutral + Location: 53,109 + Actor1764: t01 + Owner: Neutral + Location: 54,71 + Actor1766: t07 + Owner: Neutral + Location: 60,42 + Actor1767: t16 + Owner: Neutral + Location: 99,89 + Actor1768: t12 + Owner: Neutral + Location: 107,39 + Actor1769: t16 + Owner: Neutral + Location: 88,15 + Actor1770: t13 + Owner: Neutral + Location: 57,113 + Actor1772: t12 + Owner: Neutral + Location: 127,51 + Actor1773: t06 + Owner: Neutral + Location: 18,124 + Actor1774: t02 + Owner: Neutral + Location: 90,39 + Actor1775: t13 + Owner: Neutral + Location: 121,55 + Actor1776: t06 + Owner: Neutral + Location: 108,45 + Actor1777: t16 + Owner: Neutral + Location: 94,38 + Actor1778: t12.husk + Owner: Neutral + Location: 96,38 + Actor1779: t02 + Owner: Neutral + Location: 99,105 + Actor1780: t05.husk + Owner: Neutral + Location: 4,79 + Actor1781: t08 + Owner: Neutral + Location: 99,122 + Actor1782: t01 + Owner: Neutral + Location: 5,71 + Actor1783: t16 + Owner: Neutral + Location: 82,75 + Actor1784: t07 + Owner: Neutral + Location: 129,65 + Actor1785: t05 + Owner: Neutral + Location: 112,47 + Actor1786: t13 + Owner: Neutral + Location: 121,94 + Actor1787: t13 + Owner: Neutral + Location: 62,40 + Actor1788: t03 + Owner: Neutral + Location: 75,78 + Actor1789: t06 + Owner: Neutral + Location: 83,100 + Actor1790: t03 + Owner: Neutral + Location: 79,65 + Actor1791: t16 + Owner: Neutral + Location: 85,127 + Actor1792: t05 + Owner: Neutral + Location: 28,93 + Actor1793: t06 + Owner: Neutral + Location: 1,67 + Actor1794: t13 + Owner: Neutral + Location: 2,80 + Actor1795: t02 + Owner: Neutral + Location: 118,22 + Actor1796: t06 + Owner: Neutral + Location: 113,54 + Actor1797: t07 + Owner: Neutral + Location: 33,88 + Actor1798: t12 + Owner: Neutral + Location: 42,77 + Actor1799: t05 + Owner: Neutral + Location: 89,22 + Actor1800: t12 + Owner: Neutral + Location: 2,74 + Actor1801: t02 + Owner: Neutral + Location: 96,112 + Actor1802: t07 + Owner: Neutral + Location: 2,72 + Actor1803: t08 + Owner: Neutral + Location: 103,120 + Actor1804: t12 + Owner: Neutral + Location: 110,45 + Actor1805: t07 + Owner: Neutral + Location: 4,73 + Actor1806: t06 + Owner: Neutral + Location: 92,21 + Actor1807: t16.husk + Owner: Neutral + Location: 12,4 + Actor1808: t08 + Owner: Neutral + Location: 3,75 + Actor1809: t13 + Owner: Neutral + Location: 82,0 + Actor1810: t16.husk + Owner: Neutral + Location: 96,106 + Actor1811: t08 + Owner: Neutral + Location: 13,127 + Actor1812: t12 + Owner: Neutral + Location: 115,57 + Actor1813: t13 + Owner: Neutral + Location: 86,108 + Actor1814: t16 + Owner: Neutral + Location: 95,119 + Actor1815: t03 + Owner: Neutral + Location: 104,65 + Actor1816: t03 + Owner: Neutral + Location: 97,84 + Actor1817: t12 + Owner: Neutral + Location: 106,62 + Actor1818: t06 + Owner: Neutral + Location: 140,11 + Actor1819: t13.husk + Owner: Neutral + Location: 70,65 + Actor1820: t06 + Owner: Neutral + Location: 96,42 + Actor1821: t03 + Owner: Neutral + Location: 49,81 + Actor1822: t02 + Owner: Neutral + Location: 111,46 + Actor1823: t17 + Owner: Neutral + Location: 68,79 + Actor1824: t02 + Owner: Neutral + Location: 108,23 + Actor1825: t08 + Owner: Neutral + Location: 87,17 + Actor1826: t07 + Owner: Neutral + Location: 36,24 + Actor1827: t05 + Owner: Neutral + Location: 109,84 + Actor1828: t13 + Owner: Neutral + Location: 58,100 + Actor1829: t05 + Owner: Neutral + Location: 97,18 + Actor1831: t01 + Owner: Neutral + Location: 1,66 + Actor1833: t03 + Owner: Neutral + Location: 51,128 + Actor1834: t13 + Owner: Neutral + Location: 52,99 + Actor1835: t16 + Owner: Neutral + Location: 35,23 + Actor1836: t17 + Owner: Neutral + Location: 100,119 + Actor1837: t17 + Owner: Neutral + Location: 86,16 + Actor1838: t13 + Owner: Neutral + Location: 80,78 + Actor1839: t12 + Owner: Neutral + Location: 64,42 + Actor1840: t13 + Owner: Neutral + Location: 52,100 + Actor1841: t13 + Owner: Neutral + Location: 0,61 + Actor1842: t13 + Owner: Neutral + Location: 129,51 + Actor1843: t01 + Owner: Neutral + Location: 88,25 + Actor1844: t06 + Owner: Neutral + Location: 80,122 + Actor1845: t06 + Owner: Neutral + Location: 115,102 + Actor1846: t17 + Owner: Neutral + Location: 45,110 + Actor1847: t12 + Owner: Neutral + Location: 96,17 + Actor1848: t01 + Owner: Neutral + Location: 54,82 + Actor1849: t05 + Owner: Neutral + Location: 63,60 + Actor1850: t08 + Owner: Neutral + Location: 84,0 + Actor1851: t01 + Owner: Neutral + Location: 141,7 + Actor1852: t16.husk + Owner: Neutral + Location: 0,123 + Actor1853: t08 + Owner: Neutral + Location: 49,81 + Actor1856: t13 + Owner: Neutral + Location: 71,35 + Actor1857: t08 + Owner: Neutral + Location: 102,90 + Actor1858: t08 + Owner: Neutral + Location: 28,90 + Actor1859: t02 + Owner: Neutral + Location: 138,3 + Actor1860: t07 + Owner: Neutral + Location: 142,8 + Actor1861: t16.husk + Owner: Neutral + Location: 65,79 + Actor1862: t07 + Owner: Neutral + Location: 65,43 + Actor1863: t13.husk + Owner: Neutral + Location: 104,89 + Actor1864: t12 + Owner: Neutral + Location: 95,83 + Actor1865: t02 + Owner: Neutral + Location: 121,95 + Actor1866: t05 + Owner: Neutral + Location: 108,36 + Actor1867: t08 + Owner: Neutral + Location: 2,11 + Actor1868: t05 + Owner: Neutral + Location: 52,108 + Actor1870: t17.husk + Owner: Neutral + Location: 0,82 + Actor1871: t16 + Owner: Neutral + Location: 0,120 + Actor1872: t06 + Owner: Neutral + Location: 43,24 + Actor1873: t05 + Owner: Neutral + Location: 46,76 + Actor1874: t08 + Owner: Neutral + Location: 22,29 + Actor1875: t16 + Owner: Neutral + Location: 63,41 + Actor1876: t13 + Owner: Neutral + Location: 21,28 + Actor1877: t06 + Owner: Neutral + Location: 112,54 + Actor1878: t05 + Owner: Neutral + Location: 33,21 + Actor1879: t17.husk + Owner: Neutral + Location: 141,13 + Actor1880: t08 + Owner: Neutral + Location: 144,35 + Actor1881: t07 + Owner: Neutral + Location: 3,85 + Actor1882: t16 + Owner: Neutral + Location: 34,31 + Actor1883: t12 + Owner: Neutral + Location: 34,30 + Actor1884: t05 + Owner: Neutral + Location: 6,127 + Actor1885: t05 + Owner: Neutral + Location: 6,77 + Actor1886: t03 + Owner: Neutral + Location: 90,127 + Actor1887: t17 + Owner: Neutral + Location: 84,105 + Actor1888: t07 + Owner: Neutral + Location: 8,5 + Actor1889: t05 + Owner: Neutral + Location: 70,79 + Actor1890: t06 + Owner: Neutral + Location: 118,23 + Actor1891: t17 + Owner: Neutral + Location: 33,20 + Actor1892: t16 + Owner: Neutral + Location: 104,43 + Actor1893: t05 + Owner: Neutral + Location: 112,39 + Actor1894: t06 + Owner: Neutral + Location: 37,93 + Actor1895: t07 + Owner: Neutral + Location: 93,16 + Actor1896: t03 + Owner: Neutral + Location: 106,66 + Actor1897: t06 + Owner: Neutral + Location: 89,37 + Actor1898: t03 + Owner: Neutral + Location: 123,67 + Actor1899: t13 + Owner: Neutral + Location: 54,5 + Actor1900: t08.husk + Owner: Neutral + Location: 120,55 + Actor1901: t01 + Owner: Neutral + Location: 13,124 + Actor1902: t08 + Owner: Neutral + Location: 92,18 + Actor1903: t08 + Owner: Neutral + Location: 7,74 + Actor1904: t06 + Owner: Neutral + Location: 93,112 + Actor1905: t07 + Owner: Neutral + Location: 99,87 + Actor1906: t05.husk + Owner: Neutral + Location: 113,36 + Actor1907: t07 + Owner: Neutral + Location: 98,32 + Actor1908: t05 + Owner: Neutral + Location: 65,42 + Actor1909: t01 + Owner: Neutral + Location: 63,44 + Actor1910: t12 + Owner: Neutral + Location: 95,104 + Actor1911: t01 + Owner: Neutral + Location: 0,75 + Actor1912: t17 + Owner: Neutral + Location: 61,94 + Actor1913: t16 + Owner: Neutral + Location: 6,4 + Actor1918: t03 + Owner: Neutral + Location: 102,90 + Actor1919: t12 + Owner: Neutral + Location: 52,77 + Actor1920: t03.husk + Owner: Neutral + Location: 109,45 + Actor1921: t01 + Owner: Neutral + Location: 81,66 + Actor1922: t01 + Owner: Neutral + Location: 5,70 + Actor1923: t05 + Owner: Neutral + Location: 114,58 + Actor1925: t01 + Owner: Neutral + Location: 31,21 + Actor1927: t07 + Owner: Neutral + Location: 11,117 + Actor1928: t01 + Owner: Neutral + Location: 12,90 + Actor1929: t08 + Owner: Neutral + Location: 126,58 + Actor1930: t07 + Owner: Neutral + Location: 92,86 + Actor1932: t17 + Owner: Neutral + Location: 59,92 + Actor1933: t12 + Owner: Neutral + Location: 97,122 + Actor1934: t07.husk + Owner: Neutral + Location: 4,66 + Actor1935: t05 + Owner: Neutral + Location: 58,93 + Actor1936: t16 + Owner: Neutral + Location: 45,50 + Actor1937: t02 + Owner: Neutral + Location: 19,41 + Actor1938: t13 + Owner: Neutral + Location: 43,73 + Actor1939: t05 + Owner: Neutral + Location: 0,63 + Actor1940: t12 + Owner: Neutral + Location: 141,12 + Actor1941: t03 + Owner: Neutral + Location: 95,105 + Actor1942: t16 + Owner: Neutral + Location: 34,18 + Actor1943: t17 + Owner: Neutral + Location: 64,46 + Actor1944: t02 + Owner: Neutral + Location: 2,59 + Actor1945: t12 + Owner: Neutral + Location: 60,92 + Actor1946: t13 + Owner: Neutral + Location: 0,78 + Actor1947: t13 + Owner: Neutral + Location: 69,68 + Actor1948: t05 + Owner: Neutral + Location: 141,10 + Actor1949: t02 + Owner: Neutral + Location: 97,124 + Actor1950: t03.husk + Owner: Neutral + Location: 53,76 + Actor1951: t07 + Owner: Neutral + Location: 8,43 + Actor1952: t01 + Owner: Neutral + Location: 142,72 + Actor1953: t06 + Owner: Neutral + Location: 97,123 + Actor1954: t08 + Owner: Neutral + Location: 51,97 + Actor1955: t03 + Owner: Neutral + Location: 39,41 + Actor1958: t02 + Owner: Neutral + Location: 76,52 + Actor1959: t05 + Owner: Neutral + Location: 104,61 + Actor1960: t02 + Owner: Neutral + Location: 45,80 + Actor1961: t03 + Owner: Neutral + Location: 59,110 + Actor1962: t17 + Owner: Neutral + Location: 109,44 + Actor1963: t16 + Owner: Neutral + Location: 2,76 + Actor1964: t13 + Owner: Neutral + Location: 62,47 + Actor1966: t05 + Owner: Neutral + Location: 141,21 + Actor1967: t01 + Owner: Neutral + Location: 37,18 + Actor1968: t06 + Owner: Neutral + Location: 99,120 + Actor1969: t06 + Owner: Neutral + Location: 32,22 + Actor1970: t12 + Owner: Neutral + Location: 35,22 + Actor1971: t08 + Owner: Neutral + Location: 61,96 + Actor1972: t01 + Owner: Neutral + Location: 44,75 + Actor1973: t17 + Owner: Neutral + Location: 145,0 + Actor1974: t16 + Owner: Neutral + Location: 62,93 + Actor1975: t01 + Owner: Neutral + Location: 121,96 + Actor1976: t08 + Owner: Neutral + Location: 34,89 + Actor1977: t02 + Owner: Neutral + Location: 108,35 + Actor1978: t05 + Owner: Neutral + Location: 67,79 + Actor1979: t08 + Owner: Neutral + Location: 42,81 + Actor1980: t13 + Owner: Neutral + Location: 93,37 + Actor1982: t02 + Owner: Neutral + Location: 96,37 + Actor1983: t13 + Owner: Neutral + Location: 17,21 + Actor1984: t01 + Owner: Neutral + Location: 30,25 + Actor1985: t13 + Owner: Neutral + Location: 114,52 + Actor1986: t05 + Owner: Neutral + Location: 42,78 + Actor1987: t06 + Owner: Neutral + Location: 51,97 + Actor1988: t17 + Owner: Neutral + Location: 76,81 + Actor1989: t13 + Owner: Neutral + Location: 88,37 + Actor1990: t12 + Owner: Neutral + Location: 54,76 + Actor1991: t05 + Owner: Neutral + Location: 92,85 + Actor1992: t06.husk + Owner: Neutral + Location: 121,101 + Actor1993: t08 + Owner: Neutral + Location: 143,65 + Actor1994: t07 + Owner: Neutral + Location: 87,18 + Actor1995: t17 + Owner: Neutral + Location: 97,100 + Actor1996: t06 + Owner: Neutral + Location: 91,80 + Actor1997: t12 + Owner: Neutral + Location: 82,119 + Actor1998: t03 + Owner: Neutral + Location: 107,23 + Actor1999: t03.husk + Owner: Neutral + Location: 1,85 + Actor2000: t07 + Owner: Neutral + Location: 71,68 + Actor2001: t08 + Owner: Neutral + Location: 107,69 + Actor2002: t13 + Owner: Neutral + Location: 99,62 + Actor2003: t16 + Owner: Neutral + Location: 87,128 + Actor2004: t13 + Owner: Neutral + Location: 91,39 + Actor2006: t07 + Owner: Neutral + Location: 48,9 + Actor2007: t05 + Owner: Neutral + Location: 1,120 + Actor2008: t03 + Owner: Neutral + Location: 96,21 + Actor2009: t07 + Owner: Neutral + Location: 1,83 + Actor2010: t03 + Owner: Neutral + Location: 35,18 + Actor2011: t07 + Owner: Neutral + Location: 47,8 + Actor2012: t08.husk + Owner: Neutral + Location: 46,75 + Actor2013: t17 + Owner: Neutral + Location: 45,74 + Actor2014: t16 + Owner: Neutral + Location: 19,128 + Actor2015: t01 + Owner: Neutral + Location: 143,19 + Actor2016: t07 + Owner: Neutral + Location: 104,42 + Actor2017: t05 + Owner: Neutral + Location: 32,23 + Actor2018: t08 + Owner: Neutral + Location: 65,81 + Actor2019: t16 + Owner: Neutral + Location: 62,43 + Actor2020: t07 + Owner: Neutral + Location: 42,49 + Actor2021: t02 + Owner: Neutral + Location: 57,92 + Actor2022: t13 + Owner: Neutral + Location: 93,123 + Actor2023: t17 + Owner: Neutral + Location: 0,65 + Actor2025: t03 + Owner: Neutral + Location: 1,81 + Actor2026: t08 + Owner: Neutral + Location: 12,125 + Actor2027: t13 + Owner: Neutral + Location: 18,22 + Actor2028: t13 + Owner: Neutral + Location: 117,54 + Actor2029: t05 + Owner: Neutral + Location: 142,71 + Actor2030: t13 + Owner: Neutral + Location: 4,57 + Actor2031: t12 + Owner: Neutral + Location: 111,45 + Actor2032: t13 + Owner: Neutral + Location: 6,126 + Actor2034: t12 + Owner: Neutral + Location: 106,43 + Actor2035: t07 + Owner: Neutral + Location: 97,34 + Actor2036: t13 + Owner: Neutral + Location: 91,84 + Actor2037: t03 + Owner: Neutral + Location: 105,66 + Actor2038: t06 + Owner: Neutral + Location: 89,107 + Actor2040: t17 + Owner: Neutral + Location: 80,65 + Actor2041: t12 + Owner: Neutral + Location: 76,82 + Actor2042: t17 + Owner: Neutral + Location: 97,35 + Actor2043: t02 + Owner: Neutral + Location: 7,124 + Actor2044: t03 + Owner: Neutral + Location: 142,68 + Actor2045: t16.husk + Owner: Neutral + Location: 115,93 + Actor2046: t16 + Owner: Neutral + Location: 128,50 + Actor2047: t08 + Owner: Neutral + Location: 87,16 + Actor2049: t07 + Owner: Neutral + Location: 99,21 + Actor2050: t17 + Owner: Neutral + Location: 96,36 + Actor2051: t03 + Owner: Neutral + Location: 45,82 + Actor2052: t01 + Owner: Neutral + Location: 8,9 + Actor2053: t07 + Owner: Neutral + Location: 101,54 + Actor2054: t06.husk + Owner: Neutral + Location: 103,53 + Actor2055: t12.husk + Owner: Neutral + Location: 2,75 + Actor2057: t03 + Owner: Neutral + Location: 33,53 + Actor2058: t03.husk + Owner: Neutral + Location: 0,77 + Actor2059: t03 + Owner: Neutral + Location: 105,33 + Actor2060: t02 + Owner: Neutral + Location: 94,44 + Actor2061: t05 + Owner: Neutral + Location: 89,35 + Actor2062: t03 + Owner: Neutral + Location: 95,110 + Actor2063: t05 + Owner: Neutral + Location: 101,57 + Actor2065: t07 + Owner: Neutral + Location: 44,77 + Actor2066: t13 + Owner: Neutral + Location: 19,36 + Actor2067: t13 + Owner: Neutral + Location: 2,82 + Actor2069: t14 + Owner: Neutral + Location: 120,47 + Actor2070: t10 + Owner: Neutral + Location: 117,49 + Actor2071: t16 + Owner: Neutral + Location: 117,42 + Actor2072: t06 + Owner: Neutral + Location: 102,61 + Actor2073: t17 + Owner: Neutral + Location: 65,63 + Actor2074: t12 + Owner: Neutral + Location: 103,58 + Actor2075: t08 + Owner: Neutral + Location: 123,51 + Actor2076: t12 + Owner: Neutral + Location: 118,51 + Actor2077: t07 + Owner: Neutral + Location: 117,44 + Actor2078: t07 + Owner: Neutral + Location: 91,35 + Actor2080: t13 + Owner: Neutral + Location: 117,50 + Actor2081: t06 + Owner: Neutral + Location: 20,37 + Actor2082: t03 + Owner: Neutral + Location: 118,45 + Actor2083: t08 + Owner: Neutral + Location: 116,45 + Actor2084: t16 + Owner: Neutral + Location: 122,48 + Actor2085: t06 + Owner: Neutral + Location: 103,60 + Actor2086: t07 + Owner: Neutral + Location: 119,50 + Actor2087: t16 + Owner: Neutral + Location: 107,85 + Actor2088: t01 + Owner: Neutral + Location: 109,40 + Actor2089: t16 + Owner: Neutral + Location: 120,97 + Actor2090: t08 + Owner: Neutral + Location: 116,100 + Actor2091: t03 + Owner: Neutral + Location: 53,71 + Actor2092: t05 + Owner: Neutral + Location: 72,66 + Actor2093: t16 + Owner: Neutral + Location: 69,65 + Actor2094: t03 + Owner: Neutral + Location: 50,72 + Actor2095: t01 + Owner: Neutral + Location: 120,52 + Actor2096: t08 + Owner: Neutral + Location: 100,86 + Actor2097: t03 + Owner: Neutral + Location: 53,5 + Actor2033: t08 + Owner: Neutral + Location: 76,98 + Actor2048: t06 + Owner: Neutral + Location: 77,97 + Actor2064: t01 + Owner: Neutral + Location: 78,97 + Actor2098: t03 + Owner: Neutral + Location: 79,97 + Actor2099: t16.husk + Owner: Neutral + Location: 80,97 + Actor2100: t02 + Owner: Neutral + Location: 78,98 + Actor2101: t08 + Owner: Neutral + Location: 79,99 + Actor2102: t01.husk + Owner: Neutral + Location: 80,98 + Actor2103: t16.husk + Owner: Neutral + Location: 81,98 + Actor2104: t12 + Owner: Neutral + Location: 77,99 + Actor2105: t02 + Owner: Neutral + Location: 78,99 + Actor2106: t05 + Owner: Neutral + Location: 79,99 + Actor2107: t12 + Owner: Neutral + Location: 80,99 + Actor2108: t06 + Owner: Neutral + Location: 81,99 + Actor2109: t08 + Owner: Neutral + Location: 79,101 + Actor2039: brik + Owner: Nod + Location: 64,23 + Actor2110: brik + Owner: Nod + Location: 64,22 + Actor2111: brik + Owner: Nod + Location: 65,22 + Actor2112: brik + Owner: Nod + Location: 65,23 + Actor2113: brik + Owner: Nod + Location: 66,23 + Actor2114: brik + Owner: Nod + Location: 67,23 + Actor2115: brik + Owner: Nod + Location: 68,23 + Actor2116: brik + Owner: Nod + Location: 68,24 + Actor2117: brik + Owner: Nod + Location: 69,24 + Actor2118: brik + Owner: Nod + Location: 70,24 + Actor2119: brik + Owner: Nod + Location: 71,24 + Actor2120: brik + Owner: Nod + Location: 71,23 + Actor2121: brik + Owner: Nod + Location: 71,22 + Actor2122: brik + Owner: Nod + Location: 72,22 + Actor2123: brik + Owner: Nod + Location: 74,22 + Actor2124: brik + Owner: Nod + Location: 73,22 + Actor2125: brik + Owner: Nod + Location: 75,22 + Actor2126: brik + Owner: Nod + Location: 75,21 + Actor2127: brik + Owner: Nod + Location: 74,21 + Actor2128: brik + Owner: Nod + Location: 79,16 + Actor2129: brik + Owner: Nod + Location: 79,15 + Actor2130: brik + Owner: Nod + Location: 80,15 + Actor2131: brik + Owner: Nod + Location: 80,16 + Actor2132: brik + Owner: Nod + Location: 80,14 + Actor2133: brik + Owner: Nod + Location: 80,13 + Actor2134: brik + Owner: Nod + Location: 80,12 + Actor2135: brik + Owner: Nod + Location: 80,11 + Actor2136: brik + Owner: Nod + Location: 79,11 + Actor2137: brik + Owner: Nod + Location: 79,12 + Actor2138: brik + Owner: Nod + Location: 58,18 + Actor2139: brik + Owner: Nod + Location: 58,17 + Actor2140: brik + Owner: Nod + Location: 59,18 + Actor2141: brik + Owner: Nod + Location: 59,17 + Actor2142: brik + Owner: Nod + Location: 58,16 + Actor2143: brik + Owner: Nod + Location: 58,15 + Actor2144: brik + Owner: Nod + Location: 58,14 + Actor2145: brik + Owner: Nod + Location: 58,13 + Actor2146: brik + Owner: Nod + Location: 58,12 + Actor2150: brik + Owner: Nod + Location: 58,8 + Actor2151: brik + Owner: Nod + Location: 58,7 + Actor2152: brik + Owner: Nod + Location: 58,6 + Actor2153: brik + Owner: Nod + Location: 58,5 + Actor2154: brik + Owner: Nod + Location: 58,4 + Actor2155: brik + Owner: Nod + Location: 58,3 + Actor2156: brik + Owner: Nod + Location: 58,1 + Actor2157: brik + Owner: Nod + Location: 58,2 + Actor2158: brik + Owner: Nod + Location: 59,1 + Actor2159: brik + Owner: Nod + Location: 61,1 + Actor2160: brik + Owner: Nod + Location: 60,1 + Actor2161: brik + Owner: Nod + Location: 63,1 + Actor2162: brik + Owner: Nod + Location: 62,1 + Actor2163: brik + Owner: Nod + Location: 64,1 + Actor2164: brik + Owner: Nod + Location: 66,1 + Actor2165: brik + Owner: Nod + Location: 65,1 + Actor2166: brik + Owner: Nod + Location: 67,1 + Actor2079: brik + Owner: Nod + Location: 79,6 + Actor2167: brik + Owner: Nod + Location: 79,5 + Actor2168: brik + Owner: Nod + Location: 80,5 + Actor2169: brik + Owner: Nod + Location: 80,6 + Actor2170: brik + Owner: Nod + Location: 80,4 + Actor2171: brik + Owner: Nod + Location: 80,3 + Actor2172: brik + Owner: Nod + Location: 80,2 + Actor2173: brik + Owner: Nod + Location: 80,1 + Actor2174: brik + Owner: Nod + Location: 79,1 + Actor2175: brik + Owner: Nod + Location: 77,1 + Actor2176: brik + Owner: Nod + Location: 69,1 + Actor2177: brik + Owner: Nod + Location: 68,1 + Actor2178: brik + Owner: Nod + Location: 70,1 + Actor2179: brik + Owner: Nod + Location: 71,1 + Actor2180: brik + Owner: Nod + Location: 72,1 + Actor2181: brik + Owner: Nod + Location: 73,1 + Actor2182: brik + Owner: Nod + Location: 74,1 + Actor2183: brik + Owner: Nod + Location: 75,1 + Actor2184: brik + Owner: Nod + Location: 76,1 + Actor2185: brik + Owner: Nod + Location: 78,1 + Actor2186: brik + Owner: Greece + Location: 28,97 + Actor2187: brik + Owner: Greece + Location: 28,98 + Actor2188: brik + Owner: Greece + Location: 27,97 + Actor2189: brik + Owner: Greece + Location: 27,98 + Actor2190: brik + Owner: Greece + Location: 26,97 + Actor2191: brik + Owner: Greece + Location: 24,97 + Actor2192: brik + Owner: Greece + Location: 25,97 + Actor2193: brik + Owner: Greece + Location: 24,98 + Actor2194: brik + Owner: Greece + Location: 25,98 + Actor2195: brik + Owner: Greece + Location: 28,99 + Actor2196: brik + Owner: Greece + Location: 28,100 + Actor2197: brik + Owner: Greece + Location: 28,101 + Actor2198: brik + Owner: Greece + Location: 28,102 + Actor2199: brik + Owner: Greece + Location: 28,103 + Actor2200: brik + Owner: Greece + Location: 28,104 + Actor2201: brik + Owner: Greece + Location: 27,104 + Actor2203: brik + Owner: Greece + Location: 27,111 + Actor2204: brik + Owner: Greece + Location: 28,111 + Actor2205: brik + Owner: Greece + Location: 28,112 + Actor2206: brik + Owner: Greece + Location: 27,112 + Actor2207: brik + Owner: Greece + Location: 28,113 + Actor2208: brik + Owner: Greece + Location: 28,114 + Actor2209: brik + Owner: Greece + Location: 28,115 + Actor2210: brik + Owner: Greece + Location: 28,116 + Actor2211: brik + Owner: Greece + Location: 27,116 + Actor2212: brik + Owner: Greece + Location: 27,115 + Actor2213: brik + Owner: Greece + Location: 26,116 + Actor2214: brik + Owner: Greece + Location: 25,116 + Actor2215: brik + Owner: Greece + Location: 24,116 + Actor2216: brik + Owner: Greece + Location: 23,116 + Actor2217: brik + Owner: Greece + Location: 22,116 + Actor2218: brik + Owner: Greece + Location: 21,116 + Actor2219: brik + Owner: Greece + Location: 20,116 + Actor2220: brik + Owner: Greece + Location: 20,115 + Actor2221: brik + Owner: Greece + Location: 21,115 + Actor2222: brik + Owner: Greece + Location: 12,97 + Actor2223: brik + Owner: Greece + Location: 11,97 + Actor2224: brik + Owner: Greece + Location: 11,98 + Actor2225: brik + Owner: Greece + Location: 12,98 + Actor2226: brik + Owner: Greece + Location: 13,97 + Actor2227: brik + Owner: Greece + Location: 14,97 + Actor2228: brik + Owner: Greece + Location: 15,97 + Actor2229: brik + Owner: Greece + Location: 16,97 + Actor2230: brik + Owner: Greece + Location: 17,97 + Actor2231: brik + Owner: Greece + Location: 18,97 + Actor2232: brik + Owner: Greece + Location: 18,98 + Actor2233: brik + Owner: Greece + Location: 17,98 + Actor2234: brik + Owner: Greece + Location: 14,116 + Actor2235: brik + Owner: Greece + Location: 14,115 + Actor2236: brik + Owner: Greece + Location: 13,115 + Actor2237: brik + Owner: Greece + Location: 13,116 + Actor2238: brik + Owner: Greece + Location: 12,116 + Actor2239: brik + Owner: Greece + Location: 10,116 + Actor2240: brik + Owner: Greece + Location: 11,116 + Actor2241: brik + Owner: Greece + Location: 9,116 + Actor2242: brik + Owner: Greece + Location: 8,116 + Actor2243: brik + Owner: Greece + Location: 7,116 + Actor2244: brik + Owner: Greece + Location: 5,116 + Actor2245: brik + Owner: Greece + Location: 4,116 + Actor2246: brik + Owner: Greece + Location: 6,116 + Actor2247: brik + Owner: Greece + Location: 3,116 + Actor2248: brik + Owner: Greece + Location: 2,116 + Actor2249: brik + Owner: Greece + Location: 1,116 + Actor2250: brik + Owner: Greece + Location: 1,115 + Actor2251: brik + Owner: Greece + Location: 1,114 + Actor2252: brik + Owner: Greece + Location: 1,113 + Actor2253: brik + Owner: Greece + Location: 1,112 + Actor2254: brik + Owner: Greece + Location: 1,111 + Actor2255: brik + Owner: Greece + Location: 2,111 + Actor2256: brik + Owner: Greece + Location: 2,112 + Actor2257: brik + Owner: Greece + Location: 1,104 + Actor2258: brik + Owner: Greece + Location: 1,103 + Actor2259: brik + Owner: Greece + Location: 2,103 + Actor2260: brik + Owner: Greece + Location: 2,104 + Actor2261: brik + Owner: Greece + Location: 1,101 + Actor2262: brik + Owner: Greece + Location: 1,102 + Actor2263: brik + Owner: Greece + Location: 1,100 + Actor2264: brik + Owner: Greece + Location: 1,99 + Actor2265: brik + Owner: Greece + Location: 2,99 + Actor2266: brik + Owner: Greece + Location: 2,100 + Actor2267: brik + Owner: USSR + Location: 122,89 + Actor2268: brik + Owner: USSR + Location: 122,88 + Actor2269: brik + Owner: USSR + Location: 123,88 + Actor2270: brik + Owner: USSR + Location: 123,89 + Actor2271: brik + Owner: USSR + Location: 122,90 + Actor2272: brik + Owner: USSR + Location: 122,91 + Actor2273: brik + Owner: USSR + Location: 122,92 + Actor2274: brik + Owner: USSR + Location: 122,93 + Actor2275: brik + Owner: USSR + Location: 123,93 + Actor2276: brik + Owner: USSR + Location: 123,92 + Actor2277: brik + Owner: USSR + Location: 126,84 + Actor2278: brik + Owner: USSR + Location: 126,85 + Actor2279: brik + Owner: USSR + Location: 127,84 + Actor2280: brik + Owner: USSR + Location: 127,85 + Actor2281: brik + Owner: USSR + Location: 128,84 + Actor2282: brik + Owner: USSR + Location: 128,83 + Actor2283: brik + Owner: USSR + Location: 129,83 + Actor2284: brik + Owner: USSR + Location: 130,83 + Actor2285: brik + Owner: USSR + Location: 131,83 + Actor2286: brik + Owner: USSR + Location: 131,82 + Actor2287: brik + Owner: USSR + Location: 132,82 + Actor2288: brik + Owner: USSR + Location: 132,83 + Actor2293: brik + Owner: USSR + Location: 142,82 + Actor2295: brik + Owner: USSR + Location: 143,82 + Actor2296: brik + Owner: USSR + Location: 144,82 + Actor2297: brik + Owner: USSR + Location: 144,83 + Actor2298: brik + Owner: USSR + Location: 143,83 + Actor2299: brik + Owner: USSR + Location: 144,84 + Actor2300: brik + Owner: USSR + Location: 144,85 + Actor2301: brik + Owner: USSR + Location: 144,86 + Actor2302: brik + Owner: USSR + Location: 138,105 + Actor2303: brik + Owner: USSR + Location: 138,106 + Actor2304: brik + Owner: USSR + Location: 139,106 + Actor2305: brik + Owner: USSR + Location: 139,105 + Actor2306: brik + Owner: USSR + Location: 140,106 + Actor2307: brik + Owner: USSR + Location: 141,106 + Actor2308: brik + Owner: USSR + Location: 142,106 + Actor2309: brik + Owner: USSR + Location: 144,87 + Actor2310: brik + Owner: USSR + Location: 144,88 + Actor2311: brik + Owner: USSR + Location: 144,89 + Actor2312: brik + Owner: USSR + Location: 144,90 + Actor2313: brik + Owner: USSR + Location: 144,91 + Actor2314: brik + Owner: USSR + Location: 144,92 + Actor2315: brik + Owner: USSR + Location: 144,93 + Actor2316: brik + Owner: USSR + Location: 144,95 + Actor2317: brik + Owner: USSR + Location: 144,94 + Actor2318: brik + Owner: USSR + Location: 144,97 + Actor2319: brik + Owner: USSR + Location: 144,96 + Actor2320: brik + Owner: USSR + Location: 144,99 + Actor2321: brik + Owner: USSR + Location: 144,100 + Actor2322: brik + Owner: USSR + Location: 144,98 + Actor2323: brik + Owner: USSR + Location: 144,102 + Actor2324: brik + Owner: USSR + Location: 144,101 + Actor2325: brik + Owner: USSR + Location: 144,103 + Actor2326: brik + Owner: USSR + Location: 144,104 + Actor2327: brik + Owner: USSR + Location: 144,105 + Actor2328: brik + Owner: USSR + Location: 144,106 + Actor2329: brik + Owner: USSR + Location: 143,106 + Actor2330: brik + Owner: USSR + Location: 134,105 + Actor2331: brik + Owner: USSR + Location: 133,106 + Actor2332: brik + Owner: USSR + Location: 134,106 + Actor2333: brik + Owner: USSR + Location: 133,105 + Actor2334: brik + Owner: USSR + Location: 132,106 + Actor2335: brik + Owner: USSR + Location: 131,106 + Actor2336: brik + Owner: USSR + Location: 130,106 + Actor2345: brik + Owner: USSR + Location: 124,103 + Actor2346: brik + Owner: USSR + Location: 124,102 + Actor2348: brik + Owner: USSR + Location: 124,100 + Actor2349: brik + Owner: USSR + Location: 123,99 + Actor2350: brik + Owner: USSR + Location: 124,99 + Actor2351: brik + Owner: USSR + Location: 123,100 + Actor2352: brik + Owner: USSR + Location: 123,101 + Actor2353: brik + Owner: USSR + Location: 123,102 + Actor2354: brik + Owner: USSR + Location: 123,103 + Actor2347: brik + Owner: USSR + Location: 130,105 + Actor2355: brik + Owner: USSR + Location: 131,105 + Actor2337: tsla + Owner: USSR + Location: 132,105 + Actor2338: tsla + Owner: USSR + Location: 124,101 + Actor2339: tsla + Owner: USSR + Location: 123,90 + Actor2341: tsla + Owner: USSR + Location: 129,84 + Actor2342: tsla + Owner: USSR + Location: 140,105 + Actor2343: brik + Owner: Nod + Location: 59,12 + Actor2344: brik + Owner: Nod + Location: 59,13 + Actor2356: brik + Owner: Nod + Location: 59,8 + Actor2357: brik + Owner: Nod + Location: 59,7 + Actor2358: obli + Owner: Nod + Location: 73,21 + Actor2359: obli + Owner: Nod + Location: 66,22 + Actor2360: obli + Owner: Nod + Location: 59,16 + Actor2361: obli + Owner: Nod + Location: 79,14 + Actor2362: obli + Owner: Nod + Location: 79,4 + Actor2363: obli + Owner: Nod + Location: 59,6 + Actor2364: pris + Owner: Greece + Location: 26,98 + Actor2366: pris + Owner: Greece + Location: 16,98 + Actor2367: pris + Owner: Greece + Location: 27,113 + Actor2368: pris + Owner: Greece + Location: 22,115 + Actor2369: pris + Owner: Greece + Location: 13,98 + Actor2372: s2 + Owner: Scrin + SubCell: 3 + Location: 59,72 + Facing: 512 + Actor2373: s2 + Owner: Scrin + Location: 59,72 + SubCell: 1 + Facing: 512 + Actor2378: s2 + Owner: Scrin + Location: 59,72 + SubCell: 2 + Facing: 512 + Actor2379: s2 + Owner: Scrin + SubCell: 3 + Facing: 512 + Location: 67,72 + Actor2380: s2 + Owner: Scrin + SubCell: 1 + Facing: 512 + Location: 67,72 + Actor2381: s2 + Owner: Scrin + SubCell: 2 + Facing: 512 + Location: 67,72 + Actor2388: s1 + Owner: Scrin + SubCell: 3 + Location: 67,74 + Facing: 512 + Actor2389: s1 + Owner: Scrin + Location: 67,74 + SubCell: 1 + Facing: 512 + Actor2390: s1 + Owner: Scrin + Location: 67,74 + SubCell: 2 + Facing: 512 + Actor2385: s1 + Owner: Scrin + SubCell: 3 + Facing: 512 + Location: 59,74 + Actor2386: s1 + Owner: Scrin + SubCell: 1 + Facing: 512 + Location: 59,74 + Actor2387: s1 + Owner: Scrin + SubCell: 2 + Facing: 512 + Location: 59,74 + Actor2391: split2 + Owner: Neutral + Location: 37,124 + Actor2395: split2 + Owner: Neutral + Location: 112,109 + Actor2396: split2 + Owner: Neutral + Location: 123,114 + Actor2397: split2 + Owner: Neutral + Location: 87,6 + Actor2400: hand + Owner: Nod + Location: 73,16 + Actor2401: proc.td + Owner: Nod + Location: 75,4 + Actor2402: nuk2 + Owner: Nod + Location: 59,2 + Actor2403: nuk2 + Owner: Nod + Location: 61,2 + Actor2404: nuk2 + Owner: Nod + Location: 63,2 + Actor2406: airs + Owner: Nod + Location: 64,13 + Actor2407: nuk2 + Owner: Nod + Location: 72,2 + Actor2408: nuk2 + Owner: Nod + Location: 70,2 + Actor2409: smcv + Owner: Scrin + Facing: 384 + Location: 63,73 + Prodigy: pdgy + Owner: Scrin + SubCell: 3 + Location: 63,69 + Facing: 523 + Actor2382: intl + Owner: Scrin + Facing: 512 + Location: 63,70 + Actor2374: s1 + Owner: Scrin + SubCell: 3 + Facing: 512 + Location: 63,76 + Actor2383: s1 + Owner: Scrin + SubCell: 1 + Facing: 512 + Location: 63,76 + Actor2384: s1 + Owner: Scrin + SubCell: 2 + Facing: 512 + Location: 63,76 + Actor2371: tpod + Owner: Scrin + Facing: 512 + Location: 61,71 + Actor2376: shrw + Owner: Scrin + Facing: 512 + Location: 61,74 + Actor2375: tpod + Owner: Scrin + Facing: 512 + Location: 65,71 + Actor2377: shrw + Owner: Scrin + Facing: 512 + Location: 65,74 + Actor2410: split2 + Owner: Neutral + Location: 75,65 + Actor2411: split2 + Owner: Neutral + Location: 72,61 + Actor2412: gun.nod + Owner: Nod + Location: 63,23 + TurretFacing: 372 + Actor2413: gun.nod + Owner: Nod + Location: 58,19 + TurretFacing: 499 + Actor2414: gun.nod + Owner: Nod + Location: 76,22 + TurretFacing: 610 + Actor2415: gun.nod + Owner: Nod + Location: 80,17 + TurretFacing: 634 + Actor2416: ftur + Owner: USSR + Location: 125,84 + Actor2417: ftur + Owner: USSR + Location: 122,87 + Actor2418: ftur + Owner: USSR + Location: 135,81 + Actor2419: ftur + Owner: USSR + Location: 127,105 + Actor2420: proc + Owner: USSR + Location: 127,98 + SovietConyard: fact + Owner: USSR + Location: 141,93 + Actor2422: weap + Owner: USSR + Location: 129,88 + Actor2423: apwr + Owner: USSR + Location: 141,98 + Actor2424: apwr + Owner: USSR + Location: 141,89 + Actor2425: apwr + Owner: USSR + Location: 138,89 + Actor2426: apwr + Owner: USSR + Location: 137,94 + NodConyard: afac + Owner: Nod + Location: 66,2 + Actor2428: apwr + Owner: Greece + Location: 2,113 + Actor2429: apwr + Owner: Greece + Location: 5,113 + Actor2430: apwr + Owner: Greece + Location: 8,113 + Actor2431: apwr + Owner: Greece + Location: 4,100 + Actor2432: proc + Owner: Greece + Location: 22,107 + Actor2433: tent + Owner: Greece + Location: 17,101 + Actor2434: weap + Owner: Greece + Location: 13,101 + Actor2437: agun + Owner: Greece + Location: 26,100 + Actor2438: pbox + Owner: Greece + Location: 23,96 + Actor2439: pbox + Owner: Greece + Location: 19,95 + Actor2440: brik + Owner: Greece + Location: 27,105 + Actor2441: brik + Owner: Greece + Location: 28,105 + Actor2442: pris + Owner: Greece + Location: 27,103 + Actor2365: pbox + Owner: Greece + Location: 29,105 + Actor2435: pbox + Owner: Greece + Location: 29,111 + Actor2436: sam + Owner: USSR + Location: 130,84 + Actor2443: sam + Owner: USSR + Location: 125,90 + Actor2294: brik + Owner: USSR + Location: 141,82 + Actor2289: brik + Owner: USSR + Location: 138,82 + Actor2290: brik + Owner: USSR + Location: 139,82 + Actor2291: brik + Owner: USSR + Location: 140,82 + Actor2292: brik + Owner: USSR + Location: 138,83 + Actor2445: brik + Owner: USSR + Location: 139,83 + Actor2446: tsla + Owner: USSR + Location: 140,83 + Actor2340: sam + Owner: USSR + Location: 141,83 + Actor2447: sam + Owner: USSR + Location: 141,105 + Actor2448: sam + Owner: USSR + Location: 123,96 + Actor2449: agun + Owner: Greece + Location: 11,99 + Actor2450: agun + Owner: Greece + Location: 20,103 + Actor2451: agun + Owner: Greece + Location: 5,98 + Actor2452: agun + Owner: Greece + Location: 24,115 + Actor2453: agun + Owner: Greece + Location: 11,115 + Actor2454: nsam + Owner: Nod + Location: 69,23 + Actor2455: nsam + Owner: Nod + Location: 59,14 + Actor2456: nsam + Owner: Nod + Location: 77,2 + Actor2457: nsam + Owner: Nod + Location: 77,12 + Actor2467: split2 + Owner: Neutral + Location: 74,116 + Actor2468: split2 + Owner: Neutral + Location: 79,112 + Actor2469: macs + Owner: Neutral + Location: 132,119 + Actor2470: hosp + Owner: Neutral + Location: 46,4 + Actor2471: oilb + Owner: Neutral + Location: 41,99 + Actor2472: oilb + Owner: Neutral + Location: 44,99 + Actor2473: chain + Owner: Neutral + Location: 46,3 + Actor2474: chain + Owner: Neutral + Location: 47,3 + Actor2475: chain + Owner: Neutral + Location: 48,3 + Actor2476: chain + Owner: Neutral + Location: 48,4 + Actor2477: chain + Owner: Neutral + Location: 48,5 + Actor2478: chain + Owner: Neutral + Location: 45,3 + Actor2479: chain + Owner: Neutral + Location: 45,4 + Actor2480: chain + Owner: Neutral + Location: 44,4 + Actor2481: chain + Owner: Neutral + Location: 43,4 + Actor2482: chain + Owner: Neutral + Location: 43,5 + Actor2483: chain + Owner: Neutral + Location: 48,6 + Actor2484: chain + Owner: Neutral + Location: 48,7 + Actor2485: chain + Owner: Neutral + Location: 47,7 + Actor2486: chain + Owner: Neutral + Location: 46,7 + Actor2487: barb + Owner: Neutral + Location: 131,120 + Actor2488: barb + Owner: Neutral + Location: 131,119 + Actor2489: barb + Owner: Neutral + Location: 131,118 + Actor2490: barb + Owner: Neutral + Location: 132,118 + Actor2491: barb + Owner: Neutral + Location: 133,118 + Actor2492: barb + Owner: Neutral + Location: 130,120 + Actor2493: barb + Owner: Neutral + Location: 134,118 + Actor2494: barb + Owner: Neutral + Location: 134,119 + Actor2495: barb + Owner: Neutral + Location: 135,119 + Actor2496: sbag + Owner: Neutral + Location: 41,98 + Actor2497: sbag + Owner: Neutral + Location: 40,98 + Actor2498: sbag + Owner: Neutral + Location: 40,99 + Actor2499: sbag + Owner: Neutral + Location: 42,98 + Actor2500: sbag + Owner: Neutral + Location: 40,100 + Actor2501: sbag + Owner: Neutral + Location: 44,98 + Actor2502: sbag + Owner: Neutral + Location: 43,98 + Actor2503: sbag + Owner: Neutral + Location: 45,98 + Actor2504: sbag + Owner: Neutral + Location: 46,98 + Actor2505: sbag + Owner: Neutral + Location: 46,99 + Actor2506: sbag + Owner: Neutral + Location: 46,100 + Actor2507: sbag + Owner: Neutral + Location: 40,101 + Actor2508: sbag + Owner: Neutral + Location: 46,101 + Actor2509: cryo + Owner: Greece + Location: 19,99 + Facing: 896 + Actor2510: cryo + Owner: Greece + Location: 25,104 + Facing: 896 + Actor2511: mrj + Owner: Greece + Location: 14,99 + Facing: 896 + Actor2512: 2tnk + Owner: Greece + Location: 20,97 + Facing: 896 + Actor2513: 2tnk + Owner: Greece + Location: 23,94 + Facing: 896 + Actor2514: 2tnk + Owner: Greece + Location: 30,103 + Facing: 896 + Actor2515: 2tnk + Owner: Greece + Location: 31,108 + Facing: 896 + Actor2516: 2tnk + Owner: Greece + Location: 31,111 + Facing: 896 + Actor2517: ifv + Owner: Greece + Location: 22,100 + Facing: 896 + Actor2518: ifv + Owner: Greece + Location: 23,102 + Facing: 896 + Actor2519: ptnk + Owner: Greece + Location: 27,109 + Facing: 896 + Actor2520: ptnk + Owner: Greece + Location: 19,102 + Facing: 896 + Actor2521: e1 + Owner: Greece + SubCell: 3 + Location: 30,111 + Facing: 896 + Actor2522: e1 + Owner: Greece + Location: 30,111 + SubCell: 1 + Facing: 896 + Actor2523: e1 + Owner: Greece + SubCell: 3 + Location: 32,109 + Facing: 896 + Actor2524: e1 + Owner: Greece + SubCell: 3 + Facing: 896 + Location: 31,103 + Actor2525: e1 + Owner: Greece + SubCell: 1 + Facing: 896 + Location: 31,103 + Actor2526: e1 + Owner: Greece + SubCell: 3 + Facing: 896 + Location: 20,98 + Actor2527: e1 + Owner: Greece + SubCell: 1 + Facing: 896 + Location: 20,98 + Actor2528: e1 + Owner: Greece + SubCell: 3 + Facing: 896 + Location: 24,101 + Actor2529: e1 + Owner: Greece + SubCell: 1 + Facing: 896 + Location: 24,101 + Actor2530: e1 + Owner: Greece + SubCell: 3 + Facing: 896 + Location: 23,100 + Actor2531: e1 + Owner: Greece + SubCell: 3 + Facing: 896 + Location: 21,97 + Actor2532: e1 + Owner: Greece + SubCell: 3 + Facing: 896 + Location: 22,94 + Actor2533: e3 + Owner: Greece + SubCell: 3 + Location: 29,108 + Facing: 896 + Actor2534: e3 + Owner: Greece + SubCell: 3 + Facing: 896 + Location: 25,103 + Actor2535: e3 + Owner: Greece + SubCell: 3 + Facing: 896 + Location: 19,98 + Actor2536: 3tnk + Owner: USSR + Location: 123,87 + Facing: 128 + Actor2537: 3tnk + Owner: USSR + Location: 125,85 + Facing: 128 + Actor2538: 3tnk + Owner: USSR + Location: 133,81 + Facing: 128 + Actor2539: 3tnk + Owner: USSR + Location: 137,81 + Facing: 128 + Actor2540: 4tnk + Owner: USSR + Location: 126,88 + Facing: 128 + Actor2541: 4tnk + Owner: USSR + Location: 135,85 + Facing: 128 + Actor2542: v2rl + Owner: USSR + Location: 124,92 + Facing: 128 + Actor2543: v2rl + Owner: USSR + Location: 124,98 + Facing: 128 + Actor2544: v2rl + Owner: USSR + Location: 132,84 + Facing: 128 + Actor2545: e1 + Owner: USSR + SubCell: 3 + Location: 124,89 + Facing: 128 + Actor2546: e1 + Owner: USSR + Location: 124,89 + SubCell: 1 + Facing: 128 + Actor2547: e1 + Owner: USSR + SubCell: 3 + Location: 127,86 + Facing: 128 + Actor2548: e1 + Owner: USSR + SubCell: 3 + Facing: 128 + Location: 132,81 + Actor2549: e1 + Owner: USSR + SubCell: 1 + Facing: 128 + Location: 132,81 + Actor2550: e1 + Owner: USSR + SubCell: 3 + Facing: 128 + Location: 138,80 + Actor2551: e1 + Owner: USSR + SubCell: 1 + Facing: 128 + Location: 138,80 + Actor2552: e1 + Owner: USSR + SubCell: 3 + Facing: 128 + Location: 122,84 + Actor2553: e1 + Owner: USSR + SubCell: 1 + Facing: 128 + Location: 122,84 + Actor2554: e1 + Owner: USSR + SubCell: 3 + Facing: 128 + Location: 120,85 + Actor2555: e1 + Owner: USSR + SubCell: 3 + Facing: 128 + Location: 134,80 + Actor2556: e3 + Owner: USSR + SubCell: 3 + Location: 133,83 + Facing: 128 + Actor2557: e3 + Owner: USSR + SubCell: 3 + Location: 129,85 + Facing: 128 + Actor2558: e3 + Owner: USSR + SubCell: 3 + Location: 126,94 + Facing: 128 + Actor2559: e3 + Owner: USSR + SubCell: 3 + Location: 124,95 + Facing: 128 + Actor2560: n1 + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 60,19 + Actor2561: n1 + Owner: Nod + Facing: 384 + Location: 60,19 + SubCell: 1 + Actor2562: n1 + Owner: Nod + SubCell: 3 + Location: 76,21 + Facing: 682 + Actor2563: n1 + Owner: Nod + Location: 76,21 + SubCell: 1 + Facing: 682 + Actor2564: n1 + Owner: Nod + SubCell: 3 + Location: 80,18 + Facing: 682 + Actor2565: n1 + Owner: Nod + SubCell: 3 + Location: 79,17 + Facing: 682 + Actor2566: n1 + Owner: Nod + Facing: 384 + Location: 63,22 + SubCell: 3 + Actor2567: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 69,20 + Actor2568: n1 + Owner: Nod + SubCell: 3 + Location: 74,19 + Facing: 682 + Actor2569: n1 + Owner: Nod + SubCell: 3 + Location: 76,17 + Facing: 682 + Actor2570: n1 + Owner: Nod + SubCell: 3 + Location: 60,17 + Facing: 384 + Actor2571: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 61,19 + Actor2572: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 68,20 + Actor2573: n1 + Owner: Nod + Facing: 384 + Location: 68,20 + SubCell: 1 + Actor2574: rmbc + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 63,20 + Actor2575: rmbc + Owner: Nod + SubCell: 3 + Location: 76,19 + Facing: 658 + Actor2576: n3 + Owner: Nod + SubCell: 3 + Location: 70,21 + Facing: 650 + Actor2577: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 61,18 + Actor2578: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 68,21 + Actor2579: ltnk + Owner: Nod + Facing: 384 + Location: 59,20 + Actor2580: ltnk + Owner: Nod + Facing: 384 + Location: 62,22 + Actor2581: ltnk + Owner: Nod + Location: 77,21 + Facing: 640 + Actor2582: ltnk + Owner: Nod + Location: 80,19 + Facing: 640 + Actor2583: ltnk + Owner: Nod + Location: 82,16 + Facing: 640 + Actor2584: bike + Owner: Nod + Facing: 384 + Location: 65,19 + Actor2585: bike + Owner: Nod + Facing: 384 + Location: 63,18 + Actor2586: bike + Owner: Nod + Facing: 384 + Location: 65,17 + Actor2587: bggy + Owner: Nod + Location: 77,16 + Facing: 640 + Actor2588: bggy + Owner: Nod + Location: 76,15 + Facing: 640 + Actor2589: ftnk + Owner: Nod + Location: 78,19 + Facing: 640 + Actor2590: mlrs + Owner: Nod + Location: 68,18 + Facing: 512 + Actor2591: mlrs + Owner: Nod + Facing: 512 + Location: 71,18 + Actor2594: hq + Owner: Nod + Location: 74,11 + Actor2595: tmpl + Owner: Nod + Location: 69,13 + Actor2596: tmpp + Owner: Nod + Location: 71,5 + Actor2597: hpad.td + Owner: Nod + Location: 68,6 + Actor2598: hpad.td + Owner: Nod + Location: 66,6 + NodExtraPower2: nuk2 + Owner: Nod + Location: 61,6 + NodExtraPower1: nuk2 + Owner: Nod + Location: 63,6 + Actor2599: rep + Owner: Nod + Location: 66,9 + Actor2600: mslo.nod + Owner: Nod + Location: 75,2 + Actor2601: sgen + Owner: Nod + Location: 66,17 + Actor2602: npwr + Owner: USSR + Location: 137,99 + Actor2603: afld + Owner: USSR + Location: 126,95 + Actor2604: fix + Owner: USSR + Location: 127,92 + Actor2605: afld + Owner: USSR + Location: 131,92 + Actor2606: iron + Owner: USSR + Location: 134,101 + Actor2607: stek + Owner: USSR + Location: 141,85 + Actor2608: dome + Owner: USSR + Location: 131,95 + Actor2609: mslo + Owner: USSR + Location: 142,102 + Actor2610: apwr + Owner: Greece + Location: 7,100 + AlliedExtraPower1: apwr + Owner: Greece + Location: 18,108 + Actor2614: fix + Owner: Greece + Location: 14,105 + Actor2612: hpad + Owner: Greece + Location: 13,109 + Actor2613: hpad + Owner: Greece + Location: 15,109 + Actor2615: dome + Owner: Greece + Location: 10,101 + Actor2616: atek + Owner: Greece + Location: 4,104 + Actor2618: alhq + Owner: Greece + Location: 4,109 + AlliedConyard: fact + Owner: Greece + Location: 7,107 + Actor2617: weat + Owner: Greece + Location: 7,104 + Actor2619: pdox + Owner: Greece + Location: 11,107 + AlliedExtraPower2: apwr + Owner: Greece + Location: 18,111 + PlayerStart: waypoint + Owner: Neutral + Location: 63,71 + AlliedBase: waypoint + Owner: Neutral + Location: 17,106 + SovietBase: waypoint + Owner: Neutral + Location: 134,95 + AlliesVsNodRally3: waypoint + Owner: Neutral + Location: 79,50 + AlliesVsNodRally2: waypoint + Owner: Neutral + Location: 48,41 + AlliesVsNodRally1: waypoint + Owner: Neutral + Location: 47,20 + SovietsVsNodRally1: waypoint + Owner: Neutral + Location: 104,10 + SovietsVsNodRally2: waypoint + Owner: Neutral + Location: 102,28 + SovietsVsNodRally3: waypoint + Owner: Neutral + Location: 83,48 + SovietsVsNodRally4: waypoint + Owner: Neutral + Location: 58,53 + SovietsVsAlliesRally1: waypoint + Owner: Neutral + Location: 62,122 + SovietsVsAlliesRally2: waypoint + Owner: Neutral + Location: 68,104 + SovietsVsAlliesRally4: waypoint + Owner: Neutral + Location: 29,80 + SovietsVsAlliesRally3: waypoint + Owner: Neutral + Location: 59,86 + NodVsAlliesRally1: waypoint + Owner: Neutral + Location: 13,75 + NodVsAlliesRally2: waypoint + Owner: Neutral + Location: 39,84 + NodVsAlliesRally3: waypoint + Owner: Neutral + Location: 49,110 + AlliesVsSovietsRally1: waypoint + Owner: Neutral + Location: 108,116 + AlliesVsSovietsRally2: waypoint + Owner: Neutral + Location: 107,96 + AlliesVsSovietsRally3: waypoint + Owner: Neutral + Location: 111,74 + NodVsSovietsRally1: waypoint + Owner: Neutral + Location: 134,60 + NodVsSovietsRally2: waypoint + Owner: Neutral + Location: 113,69 + NodVsSovietsRally3: waypoint + Owner: Neutral + Location: 89,94 + Actor2592: apwr + Owner: USSR + Location: 138,85 + NodBase: waypoint + Owner: Neutral + Location: 70,11 + Actor2593: t11 + Owner: Neutral + Location: 61,80 + Actor2611: t14 + Owner: Neutral + Location: 61,79 + Actor2620: tc01 + Owner: Neutral + Location: 62,81 + AlliedBaseCam1: waypoint + Owner: Neutral + Location: 20,91 + AlliedBaseCam2: waypoint + Owner: Neutral + Location: 33,105 + SovietBaseCam1: waypoint + Owner: Neutral + Location: 120,83 + SovietBaseCam2: waypoint + Owner: Neutral + Location: 134,77 + SovietBaseCam3: waypoint + Owner: Neutral + Location: 124,107 + NodBaseCam1: waypoint + Owner: Neutral + Location: 57,24 + NodBaseCam2: waypoint + Owner: Neutral + Location: 82,22 + Actor2621: split2 + Owner: Neutral + Location: 40,115 + Actor2622: split2 + Owner: Neutral + Location: 93,4 + Actor2458: split2 + Owner: Neutral + Location: 31,34 + Actor2459: split2 + Owner: Neutral + Location: 39,33 + Actor2460: split2 + Owner: Neutral + Location: 12,65 + Actor2461: split2 + Owner: Neutral + Location: 129,47 + Actor2462: split2 + Owner: Neutral + Location: 132,53 + Actor2463: split2 + Owner: Neutral + Location: 18,67 + Actor2464: 2tnk + Owner: Greece + Location: 27,72 + Facing: 896 + Actor2465: 2tnk + Owner: Greece + Location: 29,70 + Facing: 896 + Actor2466: 2tnk + Owner: Greece + Location: 27,68 + Facing: 896 + Actor2623: apc.ai + Owner: Greece + Location: 29,66 + Facing: 896 + Actor2624: apc.ai + Owner: Greece + Location: 25,63 + Facing: 896 + Actor2630: e1 + Owner: Greece + SubCell: 3 + Location: 29,68 + Facing: 896 + Actor2631: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 31,67 + Actor2632: e1 + Owner: Greece + Facing: 384 + Location: 31,67 + SubCell: 1 + Actor2635: e3 + Owner: Greece + SubCell: 3 + Location: 25,61 + Facing: 896 + Actor2637: 3tnk + Owner: USSR + Location: 94,92 + Facing: 256 + Actor2639: 3tnk + Owner: USSR + Location: 90,92 + Facing: 256 + Actor2640: v2rl + Owner: USSR + Location: 97,93 + Facing: 256 + Actor2641: v2rl + Owner: USSR + Location: 88,90 + Facing: 256 + Actor2642: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 89,92 + Actor2643: e1 + Owner: USSR + Facing: 384 + Location: 89,91 + SubCell: 3 + Actor2644: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 91,91 + Actor2645: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 92,93 + Actor2646: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 91,95 + Actor2647: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 94,94 + Actor2648: e1 + Owner: USSR + Facing: 384 + Location: 95,95 + SubCell: 3 + Actor2649: e1 + Owner: USSR + Facing: 384 + Location: 96,95 + SubCell: 3 + Actor2650: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 99,93 + Actor2651: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 96,92 + Actor2652: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 92,92 + Actor2653: e3 + Owner: USSR + Facing: 384 + Location: 91,95 + SubCell: 1 + Actor2654: arty + Owner: Greece + Location: 33,65 + Facing: 896 + Actor2628: e1 + Owner: Greece + SubCell: 3 + Facing: 896 + Location: 27,66 + Actor2629: e1 + Owner: Greece + SubCell: 3 + Facing: 896 + Location: 27,67 + Actor2626: e1 + Owner: Greece + SubCell: 3 + Facing: 896 + Location: 24,69 + Actor2625: e1 + Owner: Greece + SubCell: 3 + Facing: 896 + Location: 27,69 + Actor2633: e1 + Owner: Greece + SubCell: 3 + Facing: 896 + Location: 28,70 + Actor2627: e1 + Owner: Greece + SubCell: 3 + Facing: 896 + Location: 24,65 + Actor2655: e1 + Owner: Greece + SubCell: 3 + Facing: 896 + Location: 26,60 + Actor2634: e3 + Owner: Greece + SubCell: 3 + Facing: 896 + Location: 30,65 + Actor2636: e3 + Owner: Greece + SubCell: 3 + Facing: 896 + Location: 32,64 + Actor2656: ftnk + Owner: Nod + Location: 79,40 + Facing: 512 + Actor2657: ftnk + Owner: Nod + Location: 85,39 + Facing: 512 + Actor2658: ltnk + Owner: Nod + Location: 79,43 + Facing: 512 + Actor2659: ltnk + Owner: Nod + Location: 83,42 + Facing: 512 + Actor2660: ltnk + Owner: Nod + Location: 87,42 + Facing: 512 + Actor2661: stnk.nod + Owner: Nod + Facing: 384 + Location: 116,27 + Actor2662: stnk.nod + Owner: Nod + Location: 117,25 + Facing: 384 + Actor2663: mlrs + Owner: Nod + Location: 83,40 + Facing: 512 + Actor2664: mlrs + Owner: Nod + Location: 86,37 + Facing: 512 + Actor2665: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 86,41 + Actor2666: n1 + Owner: Nod + Facing: 384 + Location: 86,41 + SubCell: 1 + Actor2667: n1 + Owner: Nod + Facing: 384 + Location: 87,40 + SubCell: 3 + Actor2668: n1 + Owner: Nod + Facing: 384 + Location: 87,40 + SubCell: 1 + Actor2669: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 83,39 + Actor2670: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 78,38 + Actor2671: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 80,42 + Actor2672: n1 + Owner: Nod + Facing: 384 + Location: 78,43 + SubCell: 3 + Actor2673: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 86,43 + Actor2674: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 88,41 + Actor2675: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 81,40 + Actor2676: n3 + Owner: Nod + Facing: 384 + Location: 77,40 + SubCell: 3 + Actor2677: btr.ai + Owner: USSR + Location: 134,44 + Facing: 128 + Actor2678: btr.ai + Owner: USSR + Location: 137,48 + Facing: 128 + Actor2679: 3tnk + Owner: USSR + Location: 136,45 + Facing: 128 + Actor2680: 3tnk + Owner: USSR + Location: 140,49 + Facing: 128 + Actor2638: stnk.nod + Owner: Nod + Location: 32,36 + Facing: 768 + Actor2681: stnk.nod + Owner: Nod + Location: 36,36 + Facing: 777 + Actor2682: stnk.nod + Owner: Nod + Location: 40,38 + Facing: 768 + Actor2683: rtnk + Owner: Greece + Location: 71,114 + Facing: 128 + Actor2684: rtnk + Owner: Greece + Facing: 128 + Location: 73,112 + Actor2685: rtnk + Owner: Greece + Facing: 128 + Location: 76,111 + Actor2686: rtnk + Owner: Greece + Facing: 128 + Location: 78,109 + Actor2687: barr + Owner: USSR + Location: 134,87 + Actor2688: sam + Owner: USSR + Location: 135,91 + AlliesVsNodRally4: waypoint + Owner: Neutral + Location: 28,11 + AlliesVsSovietsRally4: waypoint + Owner: Neutral + Location: 137,122 + Actor2689: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 65,4 + Actor2690: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 70,5 + Actor2691: e3 + Owner: USSR + SubCell: 3 + Facing: 128 + Location: 140,102 + Actor2692: e3 + Owner: USSR + SubCell: 3 + Facing: 128 + Location: 140,93 + Actor2693: e3 + Owner: Greece + SubCell: 3 + Facing: 896 + Location: 10,110 + Actor2694: e3 + Owner: Greece + SubCell: 3 + Facing: 896 + Location: 6,106 + ProdigyExit: waypoint + Owner: Neutral + Location: 56,75 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-allegiances.yaml, ca|missions/main-campaign/ca24-culmination/culmination-rules.yaml, ca|rules/custom/coop-rules.yaml, culmination-coop-rules.yaml + +Sequences: ca|missions/main-campaign/ca24-culmination/culmination-sequences.yaml + +Weapons: ca|weapons/custom/campaign.yaml, ca|missions/main-campaign/ca24-culmination/culmination-weapons.yaml diff --git a/mods/ca/missions/coop-campaign/ca25-enmity-coop/enmity-coop-rules.yaml b/mods/ca/missions/coop-campaign/ca25-enmity-coop/enmity-coop-rules.yaml new file mode 100644 index 0000000000..14f240ac5c --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca25-enmity-coop/enmity-coop-rules.yaml @@ -0,0 +1,6 @@ +World: + LuaScript: + Scripts: campaign.lua, coop.lua, ca|missions/main-campaign/ca25-enmity/enmity.lua, enmity-coop.lua + LobbyMissionInfo@InitialObjectives: + Prefix: Initial Objectives + Text: • Eliminate all Nod forces. diff --git a/mods/ca/missions/coop-campaign/ca25-enmity-coop/enmity-coop.lua b/mods/ca/missions/coop-campaign/ca25-enmity-coop/enmity-coop.lua new file mode 100644 index 0000000000..4aca7af42b --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca25-enmity-coop/enmity-coop.lua @@ -0,0 +1,46 @@ + +SetupPlayers = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Multi2 = Player.GetPlayer("Multi2") + Multi3 = Player.GetPlayer("Multi3") + Multi4 = Player.GetPlayer("Multi4") + Multi5 = Player.GetPlayer("Multi5") + GDI = Player.GetPlayer("GDI") + Nod = Player.GetPlayer("Nod") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = Utils.Where({ Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 }, function(p) return p ~= nil end) + MissionEnemies = { Nod } + SinglePlayerPlayer = GDI + CoopInit() +end + +AfterWorldLoaded = function() + TransferBaseToPlayer(SinglePlayerPlayer, GetFirstActivePlayer()) + if #MissionPlayers > 1 then + Trigger.AfterDelay(2, function() + local player2Buildings = { Actor109, Actor96, Actor100, Actor294 } + Utils.Do(player2Buildings, function(b) + b.Owner = MissionPlayers[2] + end) + end) + end +end + +AfterTick = function() + +end + +DoReinforcements = function() + Reinforcements.Reinforce(GDI, { "hmmv", "mtnk", "mtnk" }, { McvSpawn.Location, McvRally.Location }, 75) + GDI.Cash = 6000 + CashAdjustments[Difficulty] + StartCashSpread(3500) + + local delay = 0 + Utils.Do(GetMcvPlayers(), function(p) + Trigger.AfterDelay(delay, function() + Reinforcements.Reinforce(p, { "amcv" }, { McvSpawn.Location, McvRally.Location }) + end) + delay = delay + DateTime.Seconds(1) + end) +end diff --git a/mods/ca/missions/coop-campaign/ca25-enmity-coop/map.bin b/mods/ca/missions/coop-campaign/ca25-enmity-coop/map.bin new file mode 100644 index 0000000000..6ff82f5b9b Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca25-enmity-coop/map.bin differ diff --git a/mods/ca/missions/coop-campaign/ca25-enmity-coop/map.png b/mods/ca/missions/coop-campaign/ca25-enmity-coop/map.png new file mode 100644 index 0000000000..2ffa154765 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca25-enmity-coop/map.png differ diff --git a/mods/ca/missions/coop-campaign/ca25-enmity-coop/map.yaml b/mods/ca/missions/coop-campaign/ca25-enmity-coop/map.yaml new file mode 100644 index 0000000000..cb812d659e --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca25-enmity-coop/map.yaml @@ -0,0 +1,2768 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 25: Enmity Co-op + +Author: Darkademic & Gandorques Hikla + +Tileset: TEMPERAT + +MapSize: 98,114 + +Bounds: 1,1,96,112 + +Visibility: Lobby + +Categories: Co-op Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: GDI, Nod, NodCiv, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + PlayerReference@GDI: + Name: GDI + Faction: gdi + Color: F2CF74 + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Nod, Creeps + PlayerReference@Nod: + Name: Nod + Bot: campaign + Faction: nod + Color: FE1100 + Allies: NodCiv + Enemies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@NodCiv: + Name: NodCiv + Bot: campaign + NonCombatant: True + Faction: nod + Allies: Nod + Enemies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: F2CF74 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Nod, Creeps + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: EA7816 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Nod, Creeps + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: 0B7310 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Nod, Creeps + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: 0077D6 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Nod, Creeps + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: 82C900 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Nod, Creeps + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: 775A12 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Nod, Creeps + +Actors: + Actor1: htnk + Owner: GDI + Location: 52,82 + Facing: 768 + Health: 72 + Actor2: mtnk + Owner: GDI + Location: 49,82 + Facing: 753 + Health: 69 + Actor3: mtnk + Owner: GDI + Location: 57,84 + Health: 79 + Facing: 737 + Actor7: hmmv + Owner: GDI + Location: 55,82 + Facing: 674 + Actor9: n1 + Owner: GDI + SubCell: 3 + Location: 54,83 + Facing: 594 + Actor10: n1 + Owner: GDI + SubCell: 3 + Location: 43,85 + Facing: 705 + Actor11: n1 + Owner: GDI + SubCell: 3 + Location: 38,86 + Facing: 0 + Actor12: n1 + Owner: GDI + SubCell: 3 + Location: 35,86 + Facing: 428 + Actor13: n1 + Owner: GDI + SubCell: 3 + Location: 51,83 + Facing: 555 + Actor14: n1 + Owner: GDI + SubCell: 3 + Location: 45,81 + Facing: 967 + Actor15: n1 + Owner: GDI + SubCell: 3 + Location: 53,81 + Facing: 872 + Actor16: n1 + Owner: GDI + SubCell: 3 + Location: 57,85 + Facing: 384 + Actor17: n2 + Owner: GDI + Location: 48,82 + SubCell: 3 + Facing: 856 + Actor18: n2 + Owner: GDI + SubCell: 3 + Location: 41,87 + Facing: 602 + Actor19: medi + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 54,82 + Actor20: n3 + Owner: GDI + SubCell: 3 + Location: 44,82 + Facing: 79 + Actor46: brik + Owner: GDI + Location: 1,79 + Actor48: brik + Owner: GDI + Location: 2,79 + Actor50: brik + Owner: GDI + Location: 1,84 + Actor51: brik + Owner: GDI + Location: 1,85 + Actor52: brik + Owner: GDI + Location: 2,84 + Actor53: brik + Owner: GDI + Location: 2,85 + Actor54: brik + Owner: GDI + Location: 2,85 + Actor55: brik + Owner: GDI + Location: 1,80 + Actor56: brik + Owner: GDI + Location: 2,80 + Actor57: brik + Owner: GDI + Location: 1,78 + Actor58: brik + Owner: GDI + Location: 1,77 + Actor59: brik + Owner: GDI + Location: 1,76 + Actor60: brik + Owner: GDI + Location: 1,86 + Actor61: brik + Owner: GDI + Location: 1,87 + Actor62: brik + Owner: GDI + Location: 1,88 + Actor63: brik + Owner: GDI + Location: 2,88 + Actor64: brik + Owner: GDI + Location: 4,88 + Actor65: brik + Owner: GDI + Location: 3,88 + Actor66: brik + Owner: GDI + Location: 5,88 + Actor67: brik + Owner: GDI + Location: 7,88 + Actor68: brik + Owner: GDI + Location: 6,88 + Actor69: brik + Owner: GDI + Location: 8,88 + Actor70: brik + Owner: GDI + Location: 9,88 + Actor71: brik + Owner: GDI + Location: 10,88 + Actor72: brik + Owner: GDI + Location: 11,88 + Actor73: brik + Owner: GDI + Location: 11,87 + Actor74: brik + Owner: GDI + Location: 11,86 + Actor75: brik + Owner: GDI + Location: 11,84 + Actor76: brik + Owner: GDI + Location: 11,85 + Actor77: brik + Owner: GDI + Location: 10,84 + Actor78: brik + Owner: GDI + Location: 10,85 + Actor79: brik + Owner: GDI + Location: 10,80 + Actor80: brik + Owner: GDI + Location: 10,79 + Actor81: brik + Owner: GDI + Location: 11,79 + Actor82: brik + Owner: GDI + Location: 11,80 + Actor83: brik + Owner: GDI + Location: 11,78 + Actor84: brik + Owner: GDI + Location: 11,77 + Actor85: brik + Owner: GDI + Location: 11,76 + Actor95: hpad.td + Owner: GDI + Location: 4,84 + Actor96: hpad.td + Owner: GDI + Location: 7,84 + Actor99: gtwr + Owner: GDI + Location: 12,85 + Actor100: gtwr + Owner: GDI + Location: 12,79 + Actor89: brik + Owner: GDI + Location: 3,74 + Actor90: brik + Owner: GDI + Location: 2,74 + Actor91: brik + Owner: GDI + Location: 1,74 + Actor92: brik + Owner: GDI + Location: 1,75 + Actor93: brik + Owner: GDI + Location: 4,74 + Actor94: brik + Owner: GDI + Location: 5,74 + Actor102: brik + Owner: GDI + Location: 6,74 + Actor103: brik + Owner: GDI + Location: 7,74 + Actor104: brik + Owner: GDI + Location: 8,74 + Actor105: brik + Owner: GDI + Location: 9,74 + Actor106: brik + Owner: GDI + Location: 10,74 + Actor107: brik + Owner: GDI + Location: 11,74 + Actor108: brik + Owner: GDI + Location: 11,75 + Actor101: nuke + Owner: GDI + Location: 2,75 + Actor109: nuke + Owner: GDI + Location: 9,75 + Actor110: rep + Owner: GDI + Location: 5,77 + Actor111: mtnk + Owner: GDI + Location: 16,83 + Health: 97 + Facing: 634 + TurretFacing: 317 + TurretFacing@SECONDARY: 7 + Actor125: n1 + Owner: GDI + SubCell: 3 + Location: 14,86 + Facing: 634 + Actor126: n1 + Owner: GDI + SubCell: 3 + Location: 13,88 + Facing: 808 + Actor128: n1 + Owner: GDI + SubCell: 3 + Location: 13,78 + Facing: 816 + SouthAirstrip: airs + Owner: Nod + Location: 79,99 + SouthHand1: hand + Owner: Nod + Location: 69,94 + Actor136: gun.nod + Owner: Nod + Location: 74,89 + Actor137: gun.nod + Owner: Nod + Location: 80,88 + TurretFacing: 142 + Actor140: gun.nod + Owner: Nod + Location: 66,104 + Actor139: gun.nod + Owner: Nod + Location: 66,99 + Actor138: proc.td + Owner: Nod + Location: 79,104 + Actor141: silo.td + Owner: Nod + Location: 75,105 + Actor142: silo.td + Owner: Nod + Location: 76,107 + Actor143: rep + Owner: Nod + Location: 77,94 + SPower4: nuk2 + Owner: Nod + Location: 85,96 + SPower3: nuk2 + Owner: Nod + Location: 82,94 + SPower2: nuk2 + Owner: Nod + Location: 71,104 + SPower1: nuke + Owner: Nod + Location: 72,100 + Actor150: proc.td + Owner: Nod + Location: 74,20 + Actor154: rep + Owner: Nod + Location: 84,22 + NorthConyard: afac + Owner: Nod + Location: 78,7 + NPowered2: obli + Owner: Nod + Location: 72,14 + NPowered3: obli + Owner: Nod + Location: 72,21 + NPowered4: obli + Owner: Nod + Location: 76,25 + NPowered5: obli + Owner: Nod + Location: 84,26 + NPowered1: obli + Owner: Nod + Location: 75,8 + NPower4: nuk2 + Owner: Nod + Location: 90,17 + NPower3: nuk2 + Owner: Nod + Location: 89,13 + NPower2: nuk2 + Owner: Nod + Location: 86,11 + NPower1: nuk2 + Owner: Nod + Location: 83,8 + Actor157: tmpl + Owner: Nod + Location: 81,12 + NorthAirstrip: airs + Owner: Nod + Location: 82,18 + ChemSilo: mslo.nod + Owner: Nod + Location: 85,16 + NPowered6: nsam + Owner: Nod + Location: 74,11 + NPowered8: nsam + Owner: Nod + Location: 87,25 + NPowered9: nsam + Owner: Nod + Location: 91,16 + NPowered7: nsam + Owner: Nod + Location: 73,24 + NPowered10: nsam + Owner: Nod + Location: 81,8 + Actor176: hq + Owner: Nod + Location: 78,11 + Actor180: silo.td + Owner: Nod + Location: 77,19 + NorthHand1: hand + Owner: Nod + Location: 79,21 + NorthHand2: hand + Owner: Nod + Location: 74,13 + Actor179: hpad.td + Owner: Nod + Location: 87,19 + Actor168: gun.nod + Owner: Nod + Location: 69,14 + TurretFacing: 192 + Actor182: gun.nod + Owner: Nod + Location: 69,20 + TurretFacing: 348 + Actor183: gun.nod + Owner: Nod + Location: 76,28 + TurretFacing: 380 + Actor184: gun.nod + Owner: Nod + Location: 84,29 + TurretFacing: 594 + NPowered11: sgen + Owner: Nod + Location: 78,16 + Actor181: silo.td + Owner: Nod + Location: 74,18 + Actor185: msg.static + Owner: Nod + Facing: 384 + Location: 72,96 + Actor190: msg.static + Owner: Nod + Facing: 384 + Location: 74,107 + Actor191: nsam + Owner: Nod + Location: 36,66 + Actor192: nsam + Owner: Nod + Location: 47,67 + CenterHand: hand + Owner: Nod + Location: 42,64 + Actor201: silo.td + Owner: Nod + Location: 37,60 + Actor202: silo.td + Owner: Nod + Location: 37,62 + Helipad2: hpad.td + Owner: Nod + Location: 94,54 + Helipad1: hpad.td + Owner: Nod + Location: 91,53 + Actor206: rep + Owner: Nod + Location: 93,50 + Actor207: obli + Owner: Nod + Location: 95,49 + Actor208: gun.nod + Owner: Nod + Location: 93,46 + Actor209: gun.nod + Owner: Nod + Location: 87,48 + Actor210: msg.static + Owner: Nod + Location: 90,52 + Facing: 384 + WestHand: hand + Owner: Nod + Location: 6,25 + Actor212: gun.nod + Owner: Nod + Location: 12,27 + TurretFacing: 705 + Actor213: gun.nod + Owner: Nod + Location: 9,22 + TurretFacing: 713 + WPower1: nuk2 + Owner: Nod + Location: 2,24 + WPower2: nuk2 + Owner: Nod + Location: 2,28 + WPowered1: nsam + Owner: Nod + Location: 4,32 + WPowered2: nsam + Owner: Nod + Location: 10,30 + Actor219: split2 + Owner: Neutral + Location: 51,96 + Actor220: split2 + Owner: Neutral + Location: 45,98 + Actor218: split2 + Owner: Neutral + Location: 87,85 + Actor221: split2 + Owner: Neutral + Location: 93,83 + Actor222: v03 + Location: 17,109 + Faction: Random + Owner: NodCiv + Church1: v01 + Location: 8,99 + Faction: Random + Owner: NodCiv + Actor224: v06 + Location: 3,93 + Faction: Random + Owner: NodCiv + Actor225: v05 + Location: 4,103 + Faction: Random + Owner: NodCiv + Actor226: v07 + Location: 2,100 + Faction: Random + Owner: NodCiv + Actor227: v04 + Location: 12,96 + Faction: Random + Owner: NodCiv + Actor228: v07 + Location: 9,106 + Faction: Random + Owner: NodCiv + Actor229: v08 + Location: 5,107 + Faction: Random + Owner: NodCiv + Actor230: v10 + Location: 7,97 + Faction: Random + Owner: NodCiv + Actor231: v11 + Location: 16,105 + Faction: Random + Owner: NodCiv + Actor232: v09 + Location: 11,103 + Faction: Random + Owner: NodCiv + Actor233: v18 + Owner: Neutral + Location: 2,95 + Actor234: v18 + Owner: Neutral + Location: 2,95 + Actor235: v18 + Owner: Neutral + Location: 3,95 + Actor236: v16 + Owner: Neutral + Location: 3,95 + Actor237: v17 + Owner: Neutral + Location: 4,95 + Actor238: v12 + Owner: Neutral + Location: 8,93 + Actor239: v13 + Owner: Neutral + Location: 9,94 + Actor240: t11 + Owner: Neutral + Location: 15,100 + Actor241: t17 + Owner: Neutral + Location: 16,95 + Actor242: tc04 + Owner: Neutral + Location: 21,95 + Actor243: t16 + Owner: Neutral + Location: 19,94 + Actor244: t12 + Owner: Neutral + Location: 22,93 + Actor245: t02 + Owner: Neutral + Location: 18,98 + Actor246: t15 + Owner: Neutral + Location: 12,110 + Actor247: t07 + Owner: Neutral + Location: 2,102 + Actor248: t05 + Owner: Neutral + Location: 13,103 + Actor249: t12 + Owner: Neutral + Location: 3,110 + Actor250: t07 + Owner: Neutral + Location: 8,107 + Actor251: t01 + Owner: Neutral + Location: 5,111 + Actor252: t01 + Owner: Neutral + Location: 2,97 + Actor253: t08 + Owner: Neutral + Location: 10,111 + Actor254: wood + Owner: Neutral + Location: 2,94 + Actor255: wood + Owner: Neutral + Location: 3,94 + Actor256: wood + Owner: Neutral + Location: 4,94 + Actor257: wood + Owner: Neutral + Location: 5,94 + Actor258: wood + Owner: Neutral + Location: 5,95 + Actor259: wood + Owner: Neutral + Location: 1,94 + Actor260: wood + Owner: Neutral + Location: 1,95 + Actor261: wood + Owner: Neutral + Location: 18,106 + Actor262: wood + Owner: Neutral + Location: 18,105 + Actor263: wood + Owner: Neutral + Location: 18,111 + Actor264: wood + Owner: Neutral + Location: 18,112 + Actor265: wood + Owner: Neutral + Location: 17,106 + Actor266: wood + Owner: Neutral + Location: 17,111 + Actor267: wood + Owner: Neutral + Location: 12,98 + Actor268: wood + Owner: Neutral + Location: 13,98 + Actor269: wood + Owner: Neutral + Location: 7,100 + Actor270: wood + Owner: Neutral + Location: 7,99 + Actor271: wood + Owner: Neutral + Location: 7,98 + Actor272: wood + Owner: Neutral + Location: 9,98 + Actor273: wood + Owner: Neutral + Location: 8,98 + Actor274: wood + Owner: Neutral + Location: 10,98 + Actor275: wood + Owner: Neutral + Location: 5,106 + Actor276: wood + Owner: Neutral + Location: 6,106 + Actor277: wood + Owner: Neutral + Location: 4,106 + Actor278: wood + Owner: Neutral + Location: 3,102 + Actor279: wood + Owner: Neutral + Location: 4,102 + Actor280: wood + Owner: Neutral + Location: 5,102 + Actor281: wood + Owner: Neutral + Location: 12,101 + Actor282: wood + Owner: Neutral + Location: 13,101 + Actor283: wood + Owner: Neutral + Location: 13,102 + Actor284: c2 + Owner: NodCiv + Facing: 384 + Location: 5,105 + SubCell: 3 + Actor285: c1 + Owner: NodCiv + SubCell: 3 + Facing: 384 + Location: 10,102 + Actor286: c3 + Owner: NodCiv + SubCell: 3 + Facing: 384 + Location: 3,97 + Actor287: c4 + Owner: NodCiv + Facing: 384 + SubCell: 3 + Location: 12,99 + Actor288: c5 + Owner: NodCiv + Facing: 384 + SubCell: 3 + Location: 7,102 + Actor289: c6 + Owner: NodCiv + Facing: 384 + Location: 5,93 + SubCell: 3 + Actor290: c8 + Owner: NodCiv + SubCell: 3 + Facing: 384 + Location: 11,108 + Actor291: c9 + Owner: NodCiv + Facing: 384 + SubCell: 3 + Location: 4,99 + Actor292: c10 + Owner: NodCiv + SubCell: 3 + Facing: 384 + Location: 10,99 + Actor293: c5 + Owner: NodCiv + Facing: 384 + SubCell: 3 + Location: 16,110 + Actor294: cram + Owner: GDI + Location: 6,75 + Church2: v01 + Owner: NodCiv + Location: 45,38 + Actor296: v06 + Owner: NodCiv + Location: 47,44 + Actor297: v10 + Owner: NodCiv + Location: 36,40 + Actor298: v02 + Owner: NodCiv + Location: 40,27 + Actor299: v07 + Owner: NodCiv + Location: 46,33 + Actor300: v05 + Owner: NodCiv + Location: 32,27 + Actor301: v03 + Owner: NodCiv + Location: 39,33 + Actor302: v09 + Owner: NodCiv + Location: 46,29 + Actor303: v08 + Owner: NodCiv + Location: 35,38 + Actor304: v11 + Owner: NodCiv + Location: 40,37 + Actor305: v16 + Faction: blackh + Location: 47,46 + Owner: Neutral + Actor306: v17 + Faction: blackh + Location: 45,47 + Owner: Neutral + Actor307: v18 + Faction: blackh + Location: 44,47 + Owner: Neutral + Actor308: v17 + Faction: blackh + Location: 43,47 + Owner: Neutral + Actor309: v16 + Faction: blackh + Location: 42,47 + Owner: Neutral + Actor310: v13 + Faction: blackh + Location: 50,44 + Owner: Neutral + Actor311: v18 + Faction: blackh + Location: 48,46 + Owner: Neutral + Actor312: v04 + Owner: NodCiv + Location: 40,40 + Actor313: v11 + Owner: NodCiv + Location: 35,30 + Actor314: wood + Owner: NodCiv + Location: 46,37 + Actor315: wood + Owner: NodCiv + Location: 47,37 + Actor316: wood + Owner: NodCiv + Location: 47,38 + Actor317: wood + Owner: NodCiv + Location: 45,37 + Actor318: wood + Owner: NodCiv + Location: 44,37 + Actor319: wood + Owner: NodCiv + Location: 43,37 + Actor320: wood + Owner: NodCiv + Location: 43,38 + Actor321: wood + Owner: NodCiv + Location: 43,39 + Actor322: wood + Owner: NodCiv + Location: 42,37 + Actor323: wood + Owner: NodCiv + Location: 39,40 + Actor324: wood + Owner: NodCiv + Location: 39,39 + Actor325: wood + Owner: NodCiv + Location: 40,39 + Actor326: wood + Owner: NodCiv + Location: 38,40 + Actor327: wood + Owner: NodCiv + Location: 38,40 + Actor328: wood + Owner: NodCiv + Location: 39,30 + Actor329: wood + Owner: NodCiv + Location: 40,30 + Actor330: wood + Owner: NodCiv + Location: 41,30 + Actor331: wood + Owner: NodCiv + Location: 41,31 + Actor332: wood + Owner: NodCiv + Location: 41,32 + Actor333: wood + Owner: NodCiv + Location: 40,32 + Actor334: wood + Owner: NodCiv + Location: 31,26 + Actor335: wood + Owner: NodCiv + Location: 31,27 + Actor336: wood + Owner: NodCiv + Location: 32,26 + Actor337: wood + Owner: NodCiv + Location: 33,26 + Actor338: wood + Owner: NodCiv + Location: 34,26 + Actor339: wood + Owner: NodCiv + Location: 39,28 + Actor340: wood + Owner: NodCiv + Location: 39,27 + Actor341: wood + Owner: NodCiv + Location: 39,25 + Actor342: wood + Owner: NodCiv + Location: 40,25 + Actor343: wood + Owner: NodCiv + Location: 43,25 + Actor344: wood + Owner: NodCiv + Location: 44,25 + Actor345: wood + Owner: NodCiv + Location: 45,25 + Actor346: wood + Owner: NodCiv + Location: 45,26 + Actor347: wood + Owner: NodCiv + Location: 46,26 + Actor348: wood + Owner: NodCiv + Location: 52,33 + Actor349: wood + Owner: NodCiv + Location: 52,34 + Actor350: wood + Owner: NodCiv + Location: 52,37 + Actor351: wood + Owner: NodCiv + Location: 52,38 + Actor352: wood + Owner: NodCiv + Location: 52,39 + Actor353: wood + Owner: NodCiv + Location: 53,39 + Actor354: wood + Owner: NodCiv + Location: 30,36 + Actor355: wood + Owner: NodCiv + Location: 30,35 + Actor356: wood + Owner: NodCiv + Location: 30,37 + Actor357: wood + Owner: NodCiv + Location: 30,32 + Actor358: wood + Owner: NodCiv + Location: 30,31 + Actor360: wood + Owner: NodCiv + Location: 31,30 + Actor359: wood + Owner: NodCiv + Location: 31,31 + Actor361: wood + Owner: NodCiv + Location: 31,29 + Actor362: wood + Owner: NodCiv + Location: 31,28 + Actor363: wood + Owner: NodCiv + Location: 30,38 + Actor364: wood + Owner: NodCiv + Location: 48,43 + Actor365: wood + Owner: NodCiv + Location: 49,43 + Actor366: wood + Owner: NodCiv + Location: 49,44 + Actor367: wood + Owner: NodCiv + Location: 49,45 + Actor368: wood + Owner: NodCiv + Location: 48,45 + Actor369: wood + Owner: NodCiv + Location: 47,45 + Actor370: wood + Owner: NodCiv + Location: 46,45 + Actor371: wood + Owner: NodCiv + Location: 46,46 + Actor372: wood + Owner: NodCiv + Location: 46,47 + Actor373: wood + Owner: NodCiv + Location: 49,46 + Actor374: wood + Owner: NodCiv + Location: 45,46 + Actor375: wood + Owner: NodCiv + Location: 44,46 + Actor376: wood + Owner: NodCiv + Location: 42,46 + Actor377: wood + Owner: NodCiv + Location: 41,46 + Actor378: wood + Owner: NodCiv + Location: 41,47 + Actor379: wood + Owner: NodCiv + Location: 43,46 + Actor380: wood + Owner: NodCiv + Location: 41,48 + Actor381: wood + Owner: NodCiv + Location: 42,48 + Actor382: wood + Owner: NodCiv + Location: 43,48 + Actor383: wood + Owner: NodCiv + Location: 44,48 + Actor384: wood + Owner: NodCiv + Location: 45,48 + Actor385: wood + Owner: NodCiv + Location: 46,48 + Actor386: wood + Owner: NodCiv + Location: 47,47 + Actor387: wood + Owner: NodCiv + Location: 48,47 + Actor388: wood + Owner: NodCiv + Location: 49,47 + Actor389: wood + Owner: NodCiv + Location: 50,45 + Actor390: c3 + Owner: NodCiv + Facing: 384 + SubCell: 3 + Location: 42,39 + Actor391: c3 + Owner: NodCiv + Facing: 384 + SubCell: 3 + Location: 35,28 + Actor392: c4 + Owner: NodCiv + SubCell: 3 + Facing: 384 + Location: 50,40 + Actor393: c9 + Owner: NodCiv + Facing: 384 + SubCell: 3 + Location: 44,42 + Actor394: c10 + Owner: NodCiv + SubCell: 3 + Facing: 384 + Location: 47,40 + Actor395: tecn + Owner: NodCiv + Facing: 384 + SubCell: 3 + Location: 44,34 + Actor396: c5 + Owner: NodCiv + SubCell: 3 + Facing: 384 + Location: 36,33 + Actor397: c6 + Owner: NodCiv + Facing: 384 + Location: 45,45 + SubCell: 3 + Actor398: c1 + Owner: NodCiv + SubCell: 3 + Location: 32,37 + Facing: 384 + Actor399: c7 + Owner: NodCiv + Facing: 384 + SubCell: 3 + Location: 45,30 + Actor400: c2 + Owner: NodCiv + Facing: 384 + SubCell: 3 + Location: 50,32 + Actor401: brl3 + Owner: NodCiv + Location: 31,42 + Actor402: barl + Owner: NodCiv + Location: 30,41 + Actor403: windmill + Owner: NodCiv + Location: 38,44 + Actor404: split2 + Owner: Neutral + Location: 14,58 + Actor405: split2 + Owner: Neutral + Location: 21,60 + Actor409: proc.td + Owner: Nod + Location: 47,59 + Actor408: msg.static + Owner: Nod + Location: 45,63 + Facing: 384 + Actor410: msg.static + Owner: Nod + Location: 38,64 + Facing: 384 + Actor406: split2 + Owner: Neutral + Location: 55,51 + Actor407: split2 + Owner: Neutral + Location: 50,53 + SPowered2: nsam + Owner: Nod + Location: 86,92 + SPowered1: nsam + Owner: Nod + Location: 71,93 + SPowered3: nsam + Owner: Nod + Location: 70,109 + Actor416: split2 + Owner: Neutral + Location: 66,25 + Actor417: split2 + Owner: Neutral + Location: 60,17 + Actor418: split2 + Owner: Neutral + Location: 71,31 + Actor419: split2 + Owner: Neutral + Location: 11,10 + Actor420: split2 + Owner: Neutral + Location: 14,16 + Actor421: tc04 + Owner: Neutral + Location: 16,40 + Actor422: t07 + Owner: Neutral + Location: 28,47 + Actor423: t02 + Owner: Neutral + Location: 25,43 + Actor424: t06 + Owner: Neutral + Location: 23,44 + Actor425: t05 + Owner: Neutral + Location: 16,49 + Actor426: t10 + Owner: Neutral + Location: 26,52 + Actor427: t13 + Owner: Neutral + Location: 36,54 + Actor428: t11 + Owner: Neutral + Location: 2,46 + Actor429: t02 + Owner: Neutral + Location: 6,39 + Actor430: t05 + Owner: Neutral + Location: 11,36 + Actor431: t02 + Owner: Neutral + Location: 7,51 + Actor432: t01 + Owner: Neutral + Location: 6,50 + Actor433: t01 + Owner: Neutral + Location: 7,62 + Actor434: t02 + Owner: Neutral + Location: 17,67 + Actor435: t10 + Owner: Neutral + Location: 37,77 + Actor436: t15 + Owner: Neutral + Location: 53,87 + Actor437: tc01 + Owner: Neutral + Location: 50,75 + Actor438: t14 + Owner: Neutral + Location: 62,93 + Actor440: t03 + Owner: Neutral + Location: 66,82 + Actor441: t01 + Owner: Neutral + Location: 67,79 + Actor442: t02 + Owner: Neutral + Location: 66,74 + Actor443: t03 + Owner: Neutral + Location: 53,65 + Actor444: t01 + Owner: Neutral + Location: 47,74 + Actor445: t05 + Owner: Neutral + Location: 48,85 + Actor446: t16 + Owner: Neutral + Location: 51,89 + Actor447: tc01 + Owner: Neutral + Location: 53,107 + Actor448: tc02 + Owner: Neutral + Location: 64,108 + Actor449: tc04 + Owner: Neutral + Location: 90,107 + Actor450: tc05 + Owner: Neutral + Location: 93,100 + Actor451: t16 + Owner: Neutral + Location: 94,107 + Actor452: t07 + Owner: Neutral + Location: 92,110 + Actor453: t02 + Owner: Neutral + Location: 93,105 + Actor454: t14 + Owner: Neutral + Location: 86,110 + Actor455: t13 + Owner: Neutral + Location: 6,20 + Actor456: t13 + Owner: Neutral + Location: 10,68 + Actor457: t03 + Owner: Neutral + Location: 25,71 + Actor458: t14 + Owner: Neutral + Location: 25,83 + Actor459: t07 + Owner: Neutral + Location: 27,82 + Actor460: t02 + Owner: Neutral + Location: 23,77 + Actor461: t06 + Owner: Neutral + Location: 40,84 + Actor462: t16 + Owner: Neutral + Location: 32,86 + Actor463: t07 + Owner: Neutral + Location: 30,65 + Actor464: t07 + Owner: Neutral + Location: 29,56 + Actor465: t02 + Owner: Neutral + Location: 25,36 + Actor466: tc05 + Owner: Neutral + Location: 26,12 + Actor467: t06 + Owner: Neutral + Location: 33,18 + Actor468: t12 + Owner: Neutral + Location: 32,19 + Actor469: t11 + Owner: Neutral + Location: 37,11 + Actor470: t02 + Owner: Neutral + Location: 38,7 + Actor471: t06 + Owner: Neutral + Location: 26,8 + Actor472: t01 + Owner: Neutral + Location: 42,4 + Actor473: t05 + Owner: Neutral + Location: 43,8 + Actor474: t12 + Owner: Neutral + Location: 61,3 + Actor475: t11 + Owner: Neutral + Location: 79,69 + Actor476: t15 + Owner: Neutral + Location: 86,65 + Actor477: t16 + Owner: Neutral + Location: 91,63 + Actor478: t08 + Owner: Neutral + Location: 92,68 + Actor479: t12 + Owner: Neutral + Location: 93,69 + Actor480: t05 + Owner: Neutral + Location: 74,65 + Actor481: t02 + Owner: Neutral + Location: 77,76 + Actor482: t16 + Owner: Neutral + Location: 77,66 + Actor483: t07 + Owner: Neutral + Location: 77,60 + Actor484: tc04 + Owner: Neutral + Location: 71,56 + Actor485: t17 + Owner: Neutral + Location: 67,64 + Actor486: t14 + Owner: Neutral + Location: 62,57 + Actor487: t06 + Owner: Neutral + Location: 67,53 + Actor488: t05 + Owner: Neutral + Location: 69,46 + Actor489: t13 + Owner: Neutral + Location: 79,52 + Actor490: t07 + Owner: Neutral + Location: 82,44 + Actor491: t06 + Owner: Neutral + Location: 78,39 + Actor492: t03 + Owner: Neutral + Location: 82,37 + Actor493: t01 + Owner: Neutral + Location: 69,39 + Actor494: t01 + Owner: Neutral + Location: 64,32 + Actor495: t16 + Owner: Neutral + Location: 65,33 + Actor496: tc02 + Owner: Neutral + Location: 55,27 + Actor497: t06 + Owner: Neutral + Location: 56,25 + Actor498: t03 + Owner: Neutral + Location: 53,19 + Actor499: t10 + Owner: Neutral + Location: 49,22 + Actor500: t05 + Owner: Neutral + Location: 47,16 + Actor501: t16 + Owner: Neutral + Location: 56,70 + Actor502: brl3 + Owner: Creeps + Location: 37,68 + Actor503: barl + Owner: Creeps + Location: 38,69 + Actor504: brl3 + Owner: Creeps + Location: 40,31 + Actor505: barl + Owner: Creeps + Location: 39,31 + Actor506: t01 + Owner: Neutral + Location: 55,104 + Actor507: tc03 + Owner: Neutral + Location: 58,110 + Actor508: tc05 + Owner: Neutral + Location: 17,47 + Actor509: t06 + Owner: Neutral + Location: 19,31 + Actor510: t11 + Owner: Neutral + Location: 2,17 + Actor511: t06 + Owner: Neutral + Location: 3,20 + Actor512: t01 + Owner: Neutral + Location: 3,11 + Actor513: t05 + Owner: Neutral + Location: 10,3 + Actor514: t07 + Owner: Neutral + Location: 17,3 + Actor515: t08 + Owner: Neutral + Location: 23,8 + Actor516: t15 + Owner: Neutral + Location: 53,5 + Actor517: tc05 + Owner: Neutral + Location: 49,7 + Actor518: tc04 + Owner: Neutral + Location: 51,16 + Actor519: t16 + Owner: Neutral + Location: 64,6 + Actor520: t02 + Owner: Neutral + Location: 67,1 + Actor521: t08 + Owner: Neutral + Location: 90,5 + Actor522: t06 + Owner: Neutral + Location: 88,6 + Actor523: t15 + Owner: Neutral + Location: 92,10 + Actor524: tc04 + Owner: Neutral + Location: 82,2 + Actor525: t02 + Owner: Neutral + Location: 92,1 + Actor526: t06 + Owner: Neutral + Location: 92,22 + Actor527: t16 + Owner: Neutral + Location: 94,23 + Actor528: tc02 + Owner: Neutral + Location: 92,33 + Actor529: t15 + Owner: Neutral + Location: 93,31 + Actor530: t02 + Owner: Neutral + Location: 88,33 + Actor531: t07 + Owner: Neutral + Location: 88,27 + Actor532: t02 + Owner: Neutral + Location: 71,10 + Actor533: t01 + Owner: Neutral + Location: 56,9 + Actor534: spec + Owner: Nod + Location: 79,14 + Facing: 384 + Stance: Defend + Actor535: spec + Owner: Nod + Location: 88,17 + Facing: 384 + Stance: Defend + Actor536: spec + Owner: Nod + Location: 88,23 + Facing: 384 + Stance: Defend + Actor537: spec + Owner: Nod + Facing: 384 + Stance: Defend + Location: 35,44 + Actor538: stnk.nod + Owner: Nod + Location: 15,14 + Stance: Defend + Facing: 594 + Actor539: stnk.nod + Owner: Nod + Facing: 384 + Stance: Defend + Location: 10,13 + Actor540: stnk.nod + Owner: Nod + Facing: 384 + Stance: Defend + Location: 58,18 + Actor541: stnk.nod + Owner: Nod + Stance: Defend + Location: 63,25 + Facing: 602 + Actor542: stnk.nod + Owner: Nod + Stance: Defend + Location: 69,30 + Facing: 650 + Actor543: stnk.nod + Owner: Nod + Facing: 384 + Stance: Defend + Location: 90,83 + Actor544: stnk.nod + Owner: Nod + Stance: Defend + Location: 49,99 + Facing: 142 + Actor545: stnk.nod + Owner: Nod + Stance: Defend + Location: 12,57 + Facing: 610 + Actor546: stnk.nod + Owner: Nod + Stance: Defend + Location: 19,57 + Facing: 499 + Actor547: stnk.nod + Owner: Nod + Stance: Defend + Location: 55,54 + Facing: 384 + Actor548: stnk.nod + Owner: Nod + Facing: 384 + Stance: Defend + Location: 52,52 + Actor549: bggy + Owner: Nod + Location: 6,99 + Facing: 491 + Actor550: bggy + Owner: Nod + Location: 7,109 + Facing: 888 + Actor551: ltnk + Owner: Nod + Location: 77,90 + Facing: 1023 + Actor552: ltnk + Owner: Nod + Location: 69,101 + Facing: 253 + Actor553: ftnk + Owner: Nod + Location: 91,49 + Facing: 126 + Actor554: stnk.nod + Owner: Nod + Location: 86,63 + Facing: 384 + Stance: Defend + Actor555: stnk.nod + Owner: Nod + Facing: 384 + Stance: Defend + Location: 82,61 + Actor556: stnk.nod + Owner: Nod + Facing: 384 + Stance: Defend + Location: 74,50 + Actor557: stnk.nod + Owner: Nod + Stance: Defend + Location: 57,30 + Facing: 555 + Actor558: stnk.nod + Owner: Nod + Stance: Defend + Location: 26,20 + Facing: 384 + Actor559: stnk.nod + Owner: Nod + Facing: 384 + Stance: Defend + Location: 44,33 + Actor560: stnk.nod + Owner: Nod + Stance: Defend + Location: 50,41 + Facing: 190 + Actor561: stnk.nod + Owner: Nod + Stance: Defend + Location: 36,27 + Facing: 523 + Actor562: ltnk + Owner: Nod + Location: 9,26 + Facing: 761 + Actor563: ftnk + Owner: Nod + Location: 78,26 + Facing: 507 + Actor564: ftnk + Owner: Nod + Location: 82,27 + Facing: 531 + Actor565: ftnk + Owner: Nod + Location: 70,19 + Facing: 253 + Actor566: ftnk + Owner: Nod + Location: 70,15 + Facing: 261 + Actor567: ltnk + Owner: Nod + Facing: 384 + Location: 87,28 + Actor568: ltnk + Owner: Nod + Location: 69,13 + Facing: 245 + Actor569: bggy + Owner: Nod + Facing: 384 + Location: 46,34 + Actor570: bggy + Owner: Nod + Location: 37,33 + Facing: 761 + Actor571: bggy + Owner: Nod + Facing: 384 + Location: 43,41 + Actor572: ltnk + Owner: Nod + Facing: 384 + Location: 44,61 + Actor573: ltnk + Owner: Nod + Location: 47,64 + Facing: 753 + Actor574: ftnk + Owner: Nod + Location: 41,62 + Facing: 1023 + Actor575: bggy + Owner: Nod + Location: 46,67 + Facing: 515 + Actor576: bggy + Owner: Nod + Location: 42,105 + Facing: 253 + Actor577: bggy + Owner: Nod + Location: 44,106 + Facing: 253 + Actor578: shad + Owner: Nod + SubCell: 3 + Location: 77,25 + Facing: 650 + Actor579: shad + Owner: Nod + Location: 77,25 + SubCell: 1 + Facing: 507 + Actor580: shad + Owner: Nod + SubCell: 3 + Location: 83,26 + Facing: 384 + Actor581: shad + Owner: Nod + SubCell: 3 + Location: 87,24 + Facing: 384 + Actor582: shad + Owner: Nod + SubCell: 3 + Location: 77,13 + Facing: 384 + Actor583: shad + Owner: Nod + Location: 77,13 + SubCell: 1 + Facing: 198 + Actor584: shad + Owner: Nod + SubCell: 3 + Location: 76,11 + Facing: 384 + Actor585: shad + Owner: Nod + SubCell: 3 + Location: 81,10 + Facing: 602 + Actor586: shad + Owner: Nod + Location: 85,14 + SubCell: 3 + Facing: 563 + Actor587: shad + Owner: Nod + Location: 69,12 + SubCell: 3 + Facing: 198 + Actor588: shad + Owner: Nod + Location: 69,12 + SubCell: 1 + Facing: 134 + Actor589: shad + Owner: Nod + SubCell: 3 + Location: 70,11 + Facing: 150 + Actor590: shad + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 39,66 + Actor591: shad + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 48,66 + Actor594: shad + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 80,92 + Actor595: shad + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 70,102 + Actor596: shad + Owner: Nod + SubCell: 3 + Location: 43,107 + Facing: 71 + Actor597: shad + Owner: Nod + SubCell: 3 + Location: 45,105 + Facing: 214 + Actor598: n1 + Owner: Nod + Facing: 384 + Location: 16,40 + SubCell: 3 + Actor599: n1 + Owner: Nod + Facing: 384 + Location: 18,47 + SubCell: 3 + Actor600: n1 + Owner: Nod + Facing: 384 + Location: 3,46 + SubCell: 3 + Actor601: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 68,47 + Actor602: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 92,45 + Actor603: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 90,50 + Actor604: n1 + Owner: Nod + SubCell: 3 + Location: 68,98 + Facing: 277 + Actor605: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 79,89 + Actor606: n1 + Owner: Nod + SubCell: 3 + Location: 65,99 + Facing: 206 + Actor608: n1 + Owner: Nod + SubCell: 3 + Location: 88,102 + Facing: 666 + Actor609: n1 + Owner: Nod + Location: 84,109 + Facing: 840 + Actor610: n1 + Owner: Nod + Location: 85,108 + SubCell: 3 + Facing: 682 + Actor611: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 81,57 + Actor612: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 84,58 + Actor613: n1 + Owner: Nod + SubCell: 3 + Location: 44,67 + Facing: 483 + Actor614: n1 + Owner: Nod + Location: 45,66 + SubCell: 3 + Facing: 634 + Actor615: n1 + Owner: Nod + SubCell: 3 + Location: 37,65 + Facing: 555 + Actor616: n1 + Owner: Nod + SubCell: 3 + Location: 50,60 + Facing: 610 + Actor617: n1 + Owner: Nod + SubCell: 3 + Location: 39,57 + Facing: 0 + Actor618: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 39,41 + Actor619: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 29,32 + Actor620: n1 + Owner: Nod + SubCell: 3 + Location: 29,36 + Facing: 277 + Actor621: n1 + Owner: Nod + SubCell: 3 + Location: 53,38 + Facing: 729 + Actor622: n1 + Owner: Nod + SubCell: 3 + Location: 54,34 + Facing: 785 + Actor623: n1 + Owner: Nod + SubCell: 3 + Location: 49,39 + Facing: 55 + Actor624: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 51,16 + Actor625: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 54,5 + Actor626: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 64,6 + Actor627: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 94,23 + Actor628: n3 + Owner: Nod + Facing: 384 + Location: 88,33 + SubCell: 3 + Actor629: n3 + Owner: Nod + Facing: 384 + Location: 53,19 + SubCell: 3 + Actor630: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 32,19 + Actor631: n3 + Owner: Nod + SubCell: 3 + Location: 27,52 + Facing: 384 + Actor632: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 36,54 + Actor633: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 25,71 + Actor634: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 10,68 + Actor635: n3 + Owner: Nod + Location: 51,89 + SubCell: 3 + Facing: 142 + Actor636: n3 + Owner: Nod + SubCell: 3 + Location: 63,93 + Facing: 602 + Actor637: n3 + Owner: Nod + Facing: 384 + Location: 64,108 + SubCell: 3 + Actor638: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 94,107 + Actor639: n3 + Owner: Nod + Location: 93,100 + SubCell: 3 + Facing: 150 + Actor640: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 93,69 + Actor641: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 95,53 + Actor642: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 94,46 + Actor643: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 44,38 + Actor644: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 32,30 + Actor645: n3 + Owner: Nod + Facing: 384 + Location: 45,66 + SubCell: 1 + Actor646: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 45,60 + Actor647: n3 + Owner: Nod + SubCell: 3 + Location: 86,94 + Facing: 0 + Actor648: n3 + Owner: Nod + SubCell: 3 + Location: 73,92 + Facing: 182 + Actor649: n3 + Owner: Nod + SubCell: 3 + Location: 77,103 + Facing: 174 + Actor650: n3 + Owner: Nod + Facing: 384 + Location: 72,109 + SubCell: 3 + Actor651: n1 + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 11,28 + Actor652: n1 + Owner: Nod + Facing: 384 + Location: 8,25 + SubCell: 3 + Actor653: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 9,30 + Actor654: n3 + Owner: Nod + Facing: 384 + Location: 11,28 + SubCell: 1 + Actor655: n3 + Owner: Nod + Facing: 384 + Location: 4,27 + SubCell: 3 + Actor656: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 41,65 + Actor657: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 82,97 + Actor658: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 69,100 + Actor659: n4 + Owner: Nod + Facing: 384 + Location: 85,108 + SubCell: 1 + Actor660: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 93,49 + Actor661: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 78,24 + Actor662: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 73,15 + Actor663: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 89,22 + Actor664: n4 + Owner: Nod + SubCell: 3 + Location: 92,22 + Facing: 384 + Actor665: n4 + Owner: Nod + Facing: 384 + Location: 93,10 + SubCell: 3 + Actor666: n3 + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 88,6 + Actor667: n3 + Owner: Nod + Facing: 384 + Location: 82,2 + SubCell: 3 + Actor668: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 49,36 + Actor669: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 59,27 + Actor670: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 77,51 + Actor671: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 89,66 + Actor672: n4 + Owner: Nod + Facing: 384 + Location: 77,66 + SubCell: 3 + Actor673: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 3,52 + Actor674: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 5,53 + Actor675: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 20,26 + Actor676: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 19,25 + Actor677: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 38,11 + Actor678: n3 + Owner: Nod + Facing: 384 + Location: 42,4 + SubCell: 3 + Actor679: n3 + Owner: Nod + Facing: 384 + Location: 26,8 + SubCell: 3 + Actor680: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 28,10 + Actor681: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 49,14 + Actor682: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 51,12 + Actor683: bggy + Owner: Nod + Facing: 384 + Location: 50,12 + Actor684: bggy + Owner: Nod + Location: 33,11 + Facing: 610 + Actor685: ltnk + Owner: Nod + Location: 14,40 + Facing: 515 + Actor686: bike + Owner: Nod + Facing: 384 + Location: 17,39 + Actor687: bike + Owner: Nod + Location: 12,37 + Facing: 563 + Actor688: bike + Owner: Nod + Location: 79,90 + Facing: 118 + Actor689: bike + Owner: Nod + Location: 83,108 + Facing: 658 + SouthConyard: afac + Owner: Nod + Location: 75,101 + AttackNode9: waypoint + Owner: Neutral + Location: 61,100 + AttackNode8: waypoint + Owner: Neutral + Location: 57,108 + AttackNode10: waypoint + Owner: Neutral + Location: 62,83 + AttackNode5: waypoint + Owner: Neutral + Location: 30,84 + AttackNode7: waypoint + Owner: Neutral + Location: 33,102 + AttackNode13: waypoint + Owner: Neutral + Location: 79,42 + AttackNode1: waypoint + Owner: Neutral + Location: 44,14 + AttackNode2: waypoint + Owner: Neutral + Location: 20,35 + AttackNode14: waypoint + Owner: Neutral + Location: 59,37 + AttackNode3: waypoint + Owner: Neutral + Location: 3,58 + Actor703: waypoint + Owner: Neutral + Location: 41,54 + AttackNode11: waypoint + Owner: Neutral + Location: 65,62 + AttackNode12: waypoint + Owner: Neutral + Location: 84,71 + AttackNode15: waypoint + Owner: Neutral + Location: 31,52 + AttackNode4: waypoint + Owner: Neutral + Location: 18,59 + AttackNode6: waypoint + Owner: Neutral + Location: 42,60 + AttackNode16: waypoint + Owner: Neutral + Location: 55,63 + Actor691: msg.static + Owner: Nod + Location: 85,94 + Facing: 384 + Actor692: msg.static + Owner: Nod + Location: 85,101 + Facing: 384 + SouthHand2: hand + Owner: Nod + Location: 74,95 + McvSpawn: waypoint + Owner: Neutral + Location: 35,112 + McvRally: waypoint + Owner: Neutral + Location: 35,104 + Actor696: n1 + Owner: GDI + SubCell: 3 + Location: 36,84 + Facing: 769 + Actor697: apc2 + Owner: GDI + Location: 13,84 + Facing: 674 + Actor698: hosp + Faction: blackh + Location: 12,107 + Owner: Neutral + Actor699: oilb + Owner: Nod + Location: 94,103 + Actor704: gun.nod + Owner: Nod + Location: 40,48 + TurretFacing: 531 + Actor705: gun.nod + Owner: Nod + Location: 51,47 + TurretFacing: 721 + Actor706: gun.nod + Owner: Nod + Location: 16,51 + TurretFacing: 547 + Actor707: gun.nod + Owner: Nod + Location: 50,28 + Actor708: gun.nod + Owner: Nod + Location: 30,26 + Actor709: gun.nod + Owner: Nod + Location: 29,42 + TurretFacing: 467 + Actor710: gun.nod + Owner: Nod + Location: 91,65 + TurretFacing: 404 + Actor711: silo.td + Owner: Nod + Location: 87,51 + Actor712: silo.td + Owner: Nod + Location: 87,53 + Actor713: camera + Owner: Nod + Location: 42,83 + Actor714: camera + Owner: Nod + Location: 59,82 + Actor715: camera + Owner: Nod + Location: 32,103 + Actor716: camera + Owner: Nod + Location: 30,87 + Actor717: camera + Owner: Nod + Location: 19,80 + Actor718: camera + Owner: Nod + Location: 41,63 + Actor719: camera + Owner: Nod + Location: 16,66 + Actor720: camera + Owner: Nod + Location: 23,48 + Actor721: camera + Owner: Nod + Location: 18,29 + Actor722: camera + Owner: Nod + Location: 80,48 + Actor723: camera + Owner: Nod + Location: 77,99 + Actor724: camera + Owner: Nod + Location: 60,100 + Actor725: camera + Owner: Nod + Location: 78,81 + Actor726: camera + Owner: Nod + Location: 64,62 + Actor727: camera + Owner: Nod + Location: 58,34 + Actor728: camera + Owner: Nod + Location: 38,16 + Actor729: silo.td + Owner: Nod + Location: 87,55 + Actor730: silo.td + Owner: Nod + Location: 5,29 + Actor731: silo.td + Owner: Nod + Location: 7,31 + Actor732: oilb + Owner: Nod + Location: 11,39 + Actor733: oilb + Owner: Nod + Location: 94,63 + NormalHardOnlyLtnk: ltnk + Owner: Nod + Location: 36,100 + Facing: 126 + Actor735: ltnk + Owner: Nod + Location: 35,97 + Facing: 103 + Actor738: ftnk + Owner: Nod + Location: 38,100 + Facing: 253 + Actor739: htnk + Owner: GDI + Location: 60,84 + Health: 72 + Facing: 768 + Actor740: apc2 + Owner: GDI + Location: 46,82 + Health: 80 + Facing: 983 + Actor741: hmmv + Owner: GDI + Location: 42,84 + Health: 83 + Facing: 0 + Actor742: mtnk + Owner: GDI + Location: 42,86 + Health: 80 + Facing: 951 + Actor743: msam + Owner: GDI + Location: 37,86 + Health: 79 + Facing: 634 + Actor744: medi + Owner: GDI + SubCell: 3 + Location: 13,82 + Facing: 856 + Actor745: n1 + Owner: GDI + SubCell: 3 + Facing: 777 + Location: 13,81 + Actor747: n1 + Owner: GDI + SubCell: 1 + Facing: 880 + Location: 13,81 + Actor748: n1 + Owner: GDI + SubCell: 3 + Facing: 674 + Location: 14,84 + Actor749: n1 + Owner: GDI + SubCell: 3 + Facing: 384 + Location: 62,85 + Actor734: msg.static + Owner: Nod + Location: 6,30 + Facing: 384 + PlayerStart: waypoint + Owner: Neutral + Location: 29,83 + Actor746: shad + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 46,75 + Actor750: ftnk + Owner: Nod + Facing: 491 + Location: 41,76 + Actor752: n1 + Owner: Nod + SubCell: 3 + Facing: 602 + Location: 45,76 + Actor753: n1 + Owner: Nod + SubCell: 3 + Location: 38,76 + Facing: 578 + Actor754: bike + Owner: Nod + Location: 39,75 + Facing: 515 + Actor755: n1 + Owner: Nod + SubCell: 3 + Facing: 467 + Location: 40,77 + Actor756: bike + Owner: Nod + Location: 49,74 + Facing: 384 + Actor757: bggy + Owner: Nod + Facing: 570 + Location: 59,76 + Actor758: n1 + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 59,77 + NormalHardOnlyStnk: stnk.nod + Owner: Nod + Stance: Defend + Location: 60,91 + Facing: 103 + Actor759: shad + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 58,91 + Actor760: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 62,90 + Actor761: sapc.ai + Owner: Nod + Facing: 245 + Location: 63,90 + Actor762: n1 + Owner: Nod + SubCell: 3 + Facing: 198 + Location: 64,89 + Actor439: t02 + Owner: Neutral + Location: 66,89 + Actor763: bike + Owner: Nod + Facing: 118 + Location: 47,91 + Actor764: n3 + Owner: Nod + SubCell: 3 + Facing: 134 + Location: 48,90 + Actor766: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 46,91 + Actor768: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 36,92 + NormalHardOnlyArty: arty.nod + Owner: Nod + Location: 24,82 + Facing: 245 + Actor769: arty.nod + Owner: Nod + Facing: 269 + Location: 22,76 + Actor770: arty.nod + Owner: Nod + Location: 23,89 + Facing: 206 + Actor771: bggy + Owner: Nod + Facing: 253 + Location: 22,86 + Actor737: n1 + Owner: Nod + SubCell: 3 + Facing: 182 + Location: 20,88 + Actor772: n1 + Owner: Nod + SubCell: 3 + Facing: 269 + Location: 21,82 + Actor774: n1 + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 19,77 + Actor775: n1 + Owner: Nod + SubCell: 3 + Facing: 293 + Location: 21,80 + MainAmbushTopLeft: waypoint + Owner: Neutral + Location: 36,74 + MainAmbushBottomRight: waypoint + Owner: Neutral + Location: 65,92 + SecondaryAmbushTopLeft: waypoint + Owner: Neutral + Location: 15,75 + SecondaryAmbushBottomRight: waypoint + Owner: Neutral + Location: 25,90 + Actor776: n1 + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 20,79 + Actor777: ltnk + Owner: Nod + Facing: 396 + TurretFacing: 911 + Location: 20,80 + Actor773: n3 + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 20,78 + Actor778: ltnk + Owner: Nod + Facing: 570 + Location: 43,76 + Actor751: ltnk + Owner: Nod + Facing: 459 + Location: 57,77 + Actor736: n3 + Owner: Nod + SubCell: 3 + Facing: 134 + Location: 53,89 + Actor765: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 37,92 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|missions/main-campaign/ca25-enmity/enmity-rules.yaml, ca|rules/custom/coop-rules.yaml, enmity-coop-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/coop-campaign/ca26-capitulation-coop/capitulation-coop-rules.yaml b/mods/ca/missions/coop-campaign/ca26-capitulation-coop/capitulation-coop-rules.yaml new file mode 100644 index 0000000000..47b284a1e3 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca26-capitulation-coop/capitulation-coop-rules.yaml @@ -0,0 +1,6 @@ +World: + LuaScript: + Scripts: campaign.lua, coop.lua, ca|missions/main-campaign/ca26-capitulation/capitulation.lua, capitulation-coop.lua + LobbyMissionInfo@InitialObjectives: + Prefix: Initial Objectives + Text: • Cut supply lines to starve Atomic Reactor of fuel.\n• [Optional] Destroy Tesla Reactors on south-eastern island.\n• Capture or destroy Stalin's bunker. \ No newline at end of file diff --git a/mods/ca/missions/coop-campaign/ca26-capitulation-coop/capitulation-coop.lua b/mods/ca/missions/coop-campaign/ca26-capitulation-coop/capitulation-coop.lua new file mode 100644 index 0000000000..ecbe43e52e --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca26-capitulation-coop/capitulation-coop.lua @@ -0,0 +1,39 @@ + +SetupPlayers = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Multi2 = Player.GetPlayer("Multi2") + Multi3 = Player.GetPlayer("Multi3") + Multi4 = Player.GetPlayer("Multi4") + Multi5 = Player.GetPlayer("Multi5") + GDI = Player.GetPlayer("GDI") + USSR = Player.GetPlayer("USSR") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = Utils.Where({ Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 }, function(p) return p ~= nil end) + MissionEnemies = { USSR } + SinglePlayerPlayer = GDI + CoopInit() +end + +AfterWorldLoaded = function() + StartCashSpread(3500) + + local StartAPCs = {Actor1010, Actor1015} + Utils.Do(StartAPCs, function(UID) + UID.UnloadPassengers() + end) +end + +AfterTick = function() + +end + +DoMcvArrival = function() + local delay = 0 + Utils.Do(GetMcvPlayers(), function(p) + Trigger.AfterDelay(delay, function() + Reinforcements.Reinforce(p, { "amcv" }, { McvSpawn.Location, PlayerStart.Location }) + end) + delay = delay + DateTime.Seconds(1) + end) +end diff --git a/mods/ca/missions/coop-campaign/ca26-capitulation-coop/map.bin b/mods/ca/missions/coop-campaign/ca26-capitulation-coop/map.bin new file mode 100644 index 0000000000..6193b01e1a Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca26-capitulation-coop/map.bin differ diff --git a/mods/ca/missions/coop-campaign/ca26-capitulation-coop/map.png b/mods/ca/missions/coop-campaign/ca26-capitulation-coop/map.png new file mode 100644 index 0000000000..d9f607af0d Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca26-capitulation-coop/map.png differ diff --git a/mods/ca/missions/coop-campaign/ca26-capitulation-coop/map.yaml b/mods/ca/missions/coop-campaign/ca26-capitulation-coop/map.yaml new file mode 100644 index 0000000000..df20e48e84 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca26-capitulation-coop/map.yaml @@ -0,0 +1,3930 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 26: Capitulation Co-op + +Author: Darkademic & Gandorques Hikla + +Tileset: SNOW + +MapSize: 130,98 + +Bounds: 1,1,128,96 + +Visibility: Lobby + +Categories: Co-op Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: GDI, USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + PlayerReference@GDI: + Name: GDI + Faction: gdi + Color: F2CF74 + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Creeps + PlayerReference@USSR: + Name: USSR + Bot: campaign + Faction: soviet + Color: FE1100 + Enemies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@Greece: + Name: Greece + Bot: campaign + Faction: allies + Color: FE1100 + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Greece + Enemies: Creeps + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: F2CF74 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Greece + Enemies: USSR, Creeps + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: EA7816 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Greece + Enemies: USSR, Creeps + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: 0B7310 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Greece + Enemies: USSR, Creeps + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: 0077D6 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Greece + Enemies: USSR, Creeps + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: 82C900 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Greece + Enemies: USSR, Creeps + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: 775A12 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Greece + Enemies: USSR, Creeps + +Actors: + Actor10: fact + Owner: USSR + Location: 63,24 + Actor11: brik + Owner: USSR + Location: 58,26 + Actor12: brik + Owner: USSR + Location: 59,26 + Actor13: brik + Owner: USSR + Location: 60,26 + Actor14: brik + Owner: USSR + Location: 61,26 + Actor15: brik + Owner: USSR + Location: 66,26 + Actor16: brik + Owner: USSR + Location: 67,26 + Actor17: brik + Owner: USSR + Location: 68,26 + Actor18: brik + Owner: USSR + Location: 69,26 + Actor19: tsla + Owner: USSR + Location: 57,27 + Actor20: brik + Owner: USSR + Location: 58,27 + Actor21: sam + Owner: USSR + Location: 59,27 + Actor22: brik + Owner: USSR + Location: 61,27 + Actor23: brik + Owner: USSR + Location: 66,27 + Actor24: sam + Owner: USSR + Location: 67,27 + Actor25: brik + Owner: USSR + Location: 69,27 + Actor26: tsla + Owner: USSR + Location: 70,27 + MainFactory: weap + Owner: USSR + Location: 53,28 + Actor28: brik + Owner: USSR + Location: 57,28 + Actor29: brik + Owner: USSR + Location: 58,28 + Actor30: brik + Owner: USSR + Location: 59,28 + Actor31: brik + Owner: USSR + Location: 60,28 + Actor32: brik + Owner: USSR + Location: 61,28 + Actor33: brik + Owner: USSR + Location: 62,28 + Actor34: brik + Owner: USSR + Location: 63,28 + Actor35: brik + Owner: USSR + Location: 64,28 + Actor36: brik + Owner: USSR + Location: 65,28 + Actor37: brik + Owner: USSR + Location: 66,28 + Actor38: brik + Owner: USSR + Location: 67,28 + Actor39: brik + Owner: USSR + Location: 68,28 + Actor40: brik + Owner: USSR + Location: 69,28 + Actor41: brik + Owner: USSR + Location: 70,28 + Actor43: brik + Owner: USSR + Location: 57,29 + Actor44: brik + Owner: USSR + Location: 58,29 + Actor45: brik + Owner: USSR + Location: 59,29 + SovietRadar: dome + Owner: USSR + Location: 60,29 + Actor47: brik + Owner: USSR + Location: 62,29 + StalinHQ: fcom + Owner: USSR + Location: 63,29 + Actor49: brik + Owner: USSR + Location: 65,29 + Actor50: stek + Owner: USSR + Location: 66,29 + Actor51: brik + Owner: USSR + Location: 69,29 + Actor52: brik + Owner: USSR + Location: 70,29 + Actor53: brik + Owner: USSR + Location: 58,30 + Actor54: brik + Owner: USSR + Location: 59,30 + Actor55: brik + Owner: USSR + Location: 62,30 + Actor56: brik + Owner: USSR + Location: 65,30 + Actor57: brik + Owner: USSR + Location: 69,30 + Actor58: fix + Owner: USSR + Location: 71,30 + Actor59: afld + Owner: USSR + Location: 75,30 + Actor60: brik + Owner: USSR + Location: 58,31 + Actor61: brik + Owner: USSR + Location: 59,31 + Actor62: brik + Owner: USSR + Location: 62,31 + Actor63: brik + Owner: USSR + Location: 65,31 + Actor64: brik + Owner: USSR + Location: 69,31 + Actor66: brik + Owner: USSR + Location: 58,32 + Actor67: brik + Owner: USSR + Location: 59,32 + Actor68: brik + Owner: USSR + Location: 60,32 + Actor69: brik + Owner: USSR + Location: 61,32 + Actor70: brik + Owner: USSR + Location: 62,32 + Actor71: brik + Owner: USSR + Location: 65,32 + Actor72: brik + Owner: USSR + Location: 66,32 + Actor73: brik + Owner: USSR + Location: 67,32 + Actor74: brik + Owner: USSR + Location: 68,32 + Actor75: brik + Owner: USSR + Location: 69,32 + Actor80: brik + Owner: USSR + Location: 59,33 + InnerTesla1: tsla + Owner: USSR + Location: 60,33 + Actor87: brik + Owner: USSR + Location: 61,33 + Actor88: brik + Owner: USSR + Location: 62,33 + Actor89: brik + Owner: USSR + Location: 65,33 + Actor90: brik + Owner: USSR + Location: 66,33 + InnerTesla2: tsla + Owner: USSR + Location: 67,33 + Actor92: brik + Owner: USSR + Location: 68,33 + MainAirfield: afld + Owner: USSR + Location: 71,33 + Actor94: brik + Owner: USSR + Location: 58,34 + Actor95: brik + Owner: USSR + Location: 59,34 + Actor96: brik + Owner: USSR + Location: 60,34 + Actor97: brik + Owner: USSR + Location: 61,34 + Actor98: tsla + Owner: USSR + Location: 62,34 + Actor99: tsla + Owner: USSR + Location: 65,34 + Actor100: brik + Owner: USSR + Location: 66,34 + Actor101: brik + Owner: USSR + Location: 67,34 + Actor102: brik + Owner: USSR + Location: 68,34 + Actor105: brik + Owner: USSR + Location: 69,34 + Actor106: afld + Owner: USSR + Location: 75,34 + Actor107: brik + Owner: USSR + Location: 58,35 + Actor108: sam + Owner: USSR + Location: 59,35 + Actor109: brik + Owner: USSR + Location: 61,35 + Actor110: brik + Owner: USSR + Location: 66,35 + Actor111: sam + Owner: USSR + Location: 67,35 + Actor112: brik + Owner: USSR + Location: 69,35 + Actor113: brik + Owner: USSR + Location: 58,36 + Actor114: brik + Owner: USSR + Location: 59,36 + Actor115: brik + Owner: USSR + Location: 60,36 + Actor116: brik + Owner: USSR + Location: 61,36 + Actor117: brik + Owner: USSR + Location: 66,36 + Actor118: brik + Owner: USSR + Location: 67,36 + Actor119: brik + Owner: USSR + Location: 68,36 + Actor120: brik + Owner: USSR + Location: 69,36 + Actor121: ftur + Owner: USSR + Location: 61,37 + Actor122: ftur + Owner: USSR + Location: 66,37 + Actor129: brik + Owner: USSR + Location: 50,39 + Actor130: brik + Owner: USSR + Location: 49,39 + Actor131: brik + Owner: USSR + Location: 48,39 + Actor132: brik + Owner: USSR + Location: 48,40 + Actor133: brik + Owner: USSR + Location: 48,41 + Actor134: brik + Owner: USSR + Location: 49,41 + Actor150: brik + Owner: USSR + Location: 50,41 + Actor151: brik + Owner: USSR + Location: 50,40 + Actor152: brik + Owner: USSR + Location: 47,39 + Actor153: brik + Owner: USSR + Location: 46,38 + Actor154: brik + Owner: USSR + Location: 46,39 + Actor155: brik + Owner: USSR + Location: 45,38 + Actor156: brik + Owner: USSR + Location: 44,38 + Actor157: brik + Owner: USSR + Location: 46,40 + Actor158: brik + Owner: USSR + Location: 46,41 + Actor159: brik + Owner: USSR + Location: 47,41 + Actor160: brik + Owner: USSR + Location: 45,40 + Actor161: brik + Owner: USSR + Location: 44,40 + Actor162: brik + Owner: USSR + Location: 44,39 + Actor163: brik + Owner: USSR + Location: 43,38 + Actor164: brik + Owner: USSR + Location: 42,38 + Actor165: brik + Owner: USSR + Location: 42,39 + Actor166: brik + Owner: USSR + Location: 42,40 + Actor167: brik + Owner: USSR + Location: 43,40 + Actor168: brik + Owner: USSR + Location: 41,38 + Actor169: brik + Owner: USSR + Location: 40,38 + Actor170: brik + Owner: USSR + Location: 40,39 + Actor171: brik + Owner: USSR + Location: 40,40 + Actor172: brik + Owner: USSR + Location: 41,40 + Actor173: brik + Owner: USSR + Location: 39,39 + Actor174: brik + Owner: USSR + Location: 38,39 + Actor175: brik + Owner: USSR + Location: 38,40 + Actor176: brik + Owner: USSR + Location: 38,41 + Actor177: brik + Owner: USSR + Location: 39,41 + Actor178: brik + Owner: USSR + Location: 40,41 + Actor179: brik + Owner: USSR + Location: 56,44 + Actor180: brik + Owner: USSR + Location: 55,44 + Actor181: brik + Owner: USSR + Location: 54,44 + Actor182: brik + Owner: USSR + Location: 54,45 + Actor183: brik + Owner: USSR + Location: 54,46 + Actor184: brik + Owner: USSR + Location: 55,46 + Actor185: brik + Owner: USSR + Location: 56,46 + Actor186: brik + Owner: USSR + Location: 56,45 + Actor187: brik + Owner: USSR + Location: 57,46 + Actor188: brik + Owner: USSR + Location: 57,47 + Actor189: brik + Owner: USSR + Location: 55,47 + Actor190: brik + Owner: USSR + Location: 55,48 + Actor191: brik + Owner: USSR + Location: 56,48 + Actor192: brik + Owner: USSR + Location: 57,48 + Actor193: brik + Owner: USSR + Location: 58,48 + Actor194: brik + Owner: USSR + Location: 59,48 + Actor195: brik + Owner: USSR + Location: 59,49 + Actor196: brik + Owner: USSR + Location: 59,50 + Actor197: brik + Owner: USSR + Location: 57,49 + Actor198: brik + Owner: USSR + Location: 57,50 + Actor199: brik + Owner: USSR + Location: 58,50 + Actor200: brik + Owner: USSR + Location: 59,51 + Actor201: brik + Owner: USSR + Location: 59,52 + Actor202: brik + Owner: USSR + Location: 58,52 + Actor203: brik + Owner: USSR + Location: 57,52 + Actor204: brik + Owner: USSR + Location: 57,51 + Actor205: brik + Owner: USSR + Location: 70,44 + Actor206: brik + Owner: USSR + Location: 70,45 + Actor207: brik + Owner: USSR + Location: 70,46 + Actor208: brik + Owner: USSR + Location: 70,47 + Actor209: brik + Owner: USSR + Location: 70,48 + Actor210: brik + Owner: USSR + Location: 70,49 + Actor211: brik + Owner: USSR + Location: 70,50 + Actor212: brik + Owner: USSR + Location: 70,51 + Actor213: brik + Owner: USSR + Location: 71,44 + Actor214: brik + Owner: USSR + Location: 72,44 + Actor215: brik + Owner: USSR + Location: 71,46 + Actor216: brik + Owner: USSR + Location: 72,46 + Actor217: brik + Owner: USSR + Location: 72,45 + Actor218: brik + Owner: USSR + Location: 72,47 + Actor219: brik + Owner: USSR + Location: 72,48 + Actor220: brik + Owner: USSR + Location: 72,48 + Actor221: brik + Owner: USSR + Location: 71,48 + Actor222: brik + Owner: USSR + Location: 71,50 + Actor223: brik + Owner: USSR + Location: 72,50 + Actor224: brik + Owner: USSR + Location: 72,49 + Actor225: brik + Owner: USSR + Location: 72,51 + Actor226: brik + Owner: USSR + Location: 72,52 + Actor227: brik + Owner: USSR + Location: 70,52 + Actor228: brik + Owner: USSR + Location: 71,52 + Actor229: brik + Owner: USSR + Location: 85,39 + Actor230: brik + Owner: USSR + Location: 85,40 + Actor231: brik + Owner: USSR + Location: 85,41 + Actor232: brik + Owner: USSR + Location: 86,41 + Actor233: brik + Owner: USSR + Location: 87,41 + Actor234: brik + Owner: USSR + Location: 87,40 + Actor235: brik + Owner: USSR + Location: 86,39 + Actor236: brik + Owner: USSR + Location: 87,39 + Actor237: brik + Owner: USSR + Location: 88,39 + Actor238: brik + Owner: USSR + Location: 89,39 + Actor239: brik + Owner: USSR + Location: 89,40 + Actor240: brik + Owner: USSR + Location: 89,41 + Actor241: brik + Owner: USSR + Location: 88,41 + Actor242: brik + Owner: USSR + Location: 90,40 + Actor243: brik + Owner: USSR + Location: 90,40 + Actor244: brik + Owner: USSR + Location: 90,42 + Actor245: brik + Owner: USSR + Location: 89,42 + Actor246: brik + Owner: USSR + Location: 91,40 + Actor247: brik + Owner: USSR + Location: 91,41 + Actor248: brik + Owner: USSR + Location: 91,42 + Actor249: brik + Owner: USSR + Location: 92,42 + Actor250: brik + Owner: USSR + Location: 93,42 + Actor251: brik + Owner: USSR + Location: 93,41 + Actor252: brik + Owner: USSR + Location: 93,40 + Actor253: brik + Owner: USSR + Location: 92,40 + Actor254: brik + Owner: USSR + Location: 94,40 + Actor255: brik + Owner: USSR + Location: 95,40 + Actor256: brik + Owner: USSR + Location: 95,41 + Actor257: brik + Owner: USSR + Location: 95,41 + Actor258: brik + Owner: USSR + Location: 95,42 + Actor259: brik + Owner: USSR + Location: 94,42 + Actor260: brik + Owner: USSR + Location: 94,42 + Actor261: brik + Owner: USSR + Location: 83,29 + Actor262: brik + Owner: USSR + Location: 83,28 + Actor263: brik + Owner: USSR + Location: 83,27 + Actor264: brik + Owner: USSR + Location: 84,29 + Actor265: brik + Owner: USSR + Location: 85,29 + Actor266: brik + Owner: USSR + Location: 85,28 + Actor267: brik + Owner: USSR + Location: 85,27 + Actor268: brik + Owner: USSR + Location: 84,27 + Actor269: brik + Owner: USSR + Location: 85,30 + Actor270: brik + Owner: USSR + Location: 86,30 + Actor271: brik + Owner: USSR + Location: 87,30 + Actor272: brik + Owner: USSR + Location: 86,28 + Actor273: brik + Owner: USSR + Location: 87,28 + Actor274: brik + Owner: USSR + Location: 87,29 + Actor275: brik + Owner: USSR + Location: 88,30 + Actor276: brik + Owner: USSR + Location: 89,30 + Actor277: brik + Owner: USSR + Location: 89,29 + Actor278: brik + Owner: USSR + Location: 89,28 + Actor279: brik + Owner: USSR + Location: 88,28 + Actor280: brik + Owner: USSR + Location: 90,30 + Actor281: brik + Owner: USSR + Location: 91,30 + Actor282: brik + Owner: USSR + Location: 90,28 + Actor283: brik + Owner: USSR + Location: 91,28 + Actor284: brik + Owner: USSR + Location: 91,29 + Actor285: brik + Owner: USSR + Location: 91,31 + Actor286: brik + Owner: USSR + Location: 92,31 + Actor287: brik + Owner: USSR + Location: 93,31 + Actor288: brik + Owner: USSR + Location: 92,29 + Actor289: brik + Owner: USSR + Location: 93,29 + Actor290: brik + Owner: USSR + Location: 93,30 + Actor291: brik + Owner: USSR + Location: 94,31 + Actor292: brik + Owner: USSR + Location: 95,31 + Actor293: brik + Owner: USSR + Location: 95,30 + Actor294: brik + Owner: USSR + Location: 95,29 + Actor295: brik + Owner: USSR + Location: 94,29 + Actor296: tsla + Owner: USSR + Location: 94,30 + Actor297: tsla + Owner: USSR + Location: 92,30 + Actor298: tsla + Owner: USSR + Location: 90,29 + Actor299: tsla + Owner: USSR + Location: 88,29 + Actor300: tsla + Owner: USSR + Location: 86,29 + Actor301: tsla + Owner: USSR + Location: 84,28 + Actor302: tsla + Owner: USSR + Location: 86,40 + Actor303: tsla + Owner: USSR + Location: 88,40 + Actor304: tsla + Owner: USSR + Location: 90,41 + Actor305: tsla + Owner: USSR + Location: 92,41 + Actor306: tsla + Owner: USSR + Location: 94,41 + Actor307: tsla + Owner: USSR + Location: 55,45 + Actor308: tsla + Owner: USSR + Location: 56,47 + Actor309: tsla + Owner: USSR + Location: 58,49 + Actor310: tsla + Owner: USSR + Location: 58,51 + Actor311: tsla + Owner: USSR + Location: 71,51 + Actor312: tsla + Owner: USSR + Location: 71,49 + Actor313: tsla + Owner: USSR + Location: 71,45 + Actor314: tsla + Owner: USSR + Location: 71,47 + Actor315: tsla + Owner: USSR + Location: 39,40 + Actor316: tsla + Owner: USSR + Location: 41,39 + Actor317: tsla + Owner: USSR + Location: 43,39 + Actor318: tsla + Owner: USSR + Location: 45,39 + Actor319: tsla + Owner: USSR + Location: 47,40 + Actor320: tsla + Owner: USSR + Location: 49,40 + Actor321: brik + Owner: USSR + Location: 47,28 + Actor322: brik + Owner: USSR + Location: 46,28 + Actor323: brik + Owner: USSR + Location: 45,28 + Actor324: brik + Owner: USSR + Location: 45,27 + Actor325: brik + Owner: USSR + Location: 45,26 + Actor326: brik + Owner: USSR + Location: 46,26 + Actor327: brik + Owner: USSR + Location: 47,26 + Actor328: brik + Owner: USSR + Location: 47,27 + Actor329: brik + Owner: USSR + Location: 44,28 + Actor330: brik + Owner: USSR + Location: 43,28 + Actor331: brik + Owner: USSR + Location: 43,27 + Actor332: brik + Owner: USSR + Location: 43,26 + Actor333: brik + Owner: USSR + Location: 44,26 + Actor334: brik + Owner: USSR + Location: 43,29 + Actor335: brik + Owner: USSR + Location: 42,29 + Actor336: brik + Owner: USSR + Location: 41,29 + Actor337: brik + Owner: USSR + Location: 41,28 + Actor338: brik + Owner: USSR + Location: 41,27 + Actor339: brik + Owner: USSR + Location: 42,27 + Actor340: brik + Owner: USSR + Location: 40,29 + Actor341: brik + Owner: USSR + Location: 39,29 + Actor342: brik + Owner: USSR + Location: 39,28 + Actor343: brik + Owner: USSR + Location: 39,27 + Actor344: brik + Owner: USSR + Location: 40,27 + Actor345: brik + Owner: USSR + Location: 38,27 + Actor346: brik + Owner: USSR + Location: 37,27 + Actor347: brik + Owner: USSR + Location: 37,28 + Actor348: brik + Owner: USSR + Location: 37,29 + Actor349: brik + Owner: USSR + Location: 38,29 + Actor350: tsla + Owner: USSR + Location: 46,27 + Actor351: tsla + Owner: USSR + Location: 44,27 + Actor352: tsla + Owner: USSR + Location: 42,28 + Actor353: tsla + Owner: USSR + Location: 40,28 + Actor354: tsla + Owner: USSR + Location: 38,28 + Actor355: tsla + Owner: USSR + Location: 58,53 + Actor356: tsla + Owner: USSR + Location: 71,53 + Actor357: brik + Owner: USSR + Location: 57,53 + Actor358: brik + Owner: USSR + Location: 57,54 + Actor359: brik + Owner: USSR + Location: 59,54 + Actor360: brik + Owner: USSR + Location: 58,54 + Actor361: brik + Owner: USSR + Location: 59,53 + Actor362: brik + Owner: USSR + Location: 70,53 + Actor363: brik + Owner: USSR + Location: 70,54 + Actor364: brik + Owner: USSR + Location: 71,54 + Actor365: brik + Owner: USSR + Location: 72,54 + Actor366: brik + Owner: USSR + Location: 72,53 + OuterSAM14: sam + Owner: USSR + Location: 73,47 + OuterSAM11: sam + Owner: USSR + Location: 73,53 + OuterSAM12: sam + Owner: USSR + Location: 73,51 + OuterSAM13: sam + Owner: USSR + Location: 73,49 + OuterSAM15: sam + Owner: USSR + Location: 73,45 + OuterSAM16: sam + Owner: USSR + Location: 85,42 + OuterSAM17: sam + Owner: USSR + Location: 87,42 + OuterSAM18: sam + Owner: USSR + Location: 88,43 + OuterSAM19: sam + Owner: USSR + Location: 90,43 + OuterSAM20: sam + Owner: USSR + Location: 92,43 + OuterSAM30: sam + Owner: USSR + Location: 92,28 + OuterSAM29: sam + Owner: USSR + Location: 90,27 + OuterSAM28: sam + Owner: USSR + Location: 88,27 + OuterSAM27: sam + Owner: USSR + Location: 86,27 + OuterSAM26: sam + Owner: USSR + Location: 84,26 + OuterSAM25: sam + Owner: USSR + Location: 45,25 + OuterSAM24: sam + Owner: USSR + Location: 43,25 + OuterSAM23: sam + Owner: USSR + Location: 41,26 + OuterSAM22: sam + Owner: USSR + Location: 39,26 + OuterSAM21: sam + Owner: USSR + Location: 37,26 + OuterSAM1: sam + Owner: USSR + Location: 39,42 + OuterSAM2: sam + Owner: USSR + Location: 41,41 + OuterSAM3: sam + Owner: USSR + Location: 44,41 + OuterSAM4: sam + Owner: USSR + Location: 47,42 + OuterSAM5: sam + Owner: USSR + Location: 49,42 + OuterSAM6: sam + Owner: USSR + Location: 52,44 + OuterSAM7: sam + Owner: USSR + Location: 53,47 + OuterSAM8: sam + Owner: USSR + Location: 55,49 + OuterSAM9: sam + Owner: USSR + Location: 55,51 + OuterSAM10: sam + Owner: USSR + Location: 55,53 + Actor397: fenc + Owner: USSR + Location: 41,42 + Actor398: fenc + Owner: USSR + Location: 41,43 + Actor399: fenc + Owner: USSR + Location: 40,43 + Actor400: fenc + Owner: USSR + Location: 39,43 + Actor401: fenc + Owner: USSR + Location: 38,43 + Actor402: fenc + Owner: USSR + Location: 38,42 + Actor403: fenc + Owner: USSR + Location: 37,42 + Actor404: fenc + Owner: USSR + Location: 37,41 + Actor405: fenc + Owner: USSR + Location: 42,42 + Actor406: fenc + Owner: USSR + Location: 43,42 + Actor407: fenc + Owner: USSR + Location: 43,41 + Actor408: fenc + Owner: USSR + Location: 44,42 + Actor409: fenc + Owner: USSR + Location: 45,42 + Actor410: fenc + Owner: USSR + Location: 46,42 + Actor411: fenc + Owner: USSR + Location: 46,43 + Actor412: fenc + Owner: USSR + Location: 47,43 + Actor413: fenc + Owner: USSR + Location: 48,43 + Actor414: fenc + Owner: USSR + Location: 49,43 + Actor415: fenc + Owner: USSR + Location: 50,43 + Actor416: fenc + Owner: USSR + Location: 51,43 + Actor417: fenc + Owner: USSR + Location: 51,42 + Actor418: fenc + Owner: USSR + Location: 51,41 + Actor419: fenc + Owner: USSR + Location: 51,40 + Actor420: fenc + Owner: USSR + Location: 37,40 + Actor421: fenc + Owner: USSR + Location: 37,39 + Actor422: fenc + Owner: USSR + Location: 52,42 + Actor423: fenc + Owner: USSR + Location: 52,43 + Actor424: fenc + Owner: USSR + Location: 51,44 + Actor425: fenc + Owner: USSR + Location: 51,45 + Actor426: fenc + Owner: USSR + Location: 52,45 + Actor427: fenc + Owner: USSR + Location: 53,45 + Actor428: fenc + Owner: USSR + Location: 53,46 + Actor429: fenc + Owner: USSR + Location: 52,46 + Actor430: fenc + Owner: USSR + Location: 52,47 + Actor431: fenc + Owner: USSR + Location: 52,48 + Actor432: fenc + Owner: USSR + Location: 53,48 + Actor433: fenc + Owner: USSR + Location: 54,48 + Actor434: fenc + Owner: USSR + Location: 54,49 + Actor435: fenc + Owner: USSR + Location: 54,50 + Actor436: fenc + Owner: USSR + Location: 56,50 + Actor437: fenc + Owner: USSR + Location: 55,50 + Actor438: fenc + Owner: USSR + Location: 54,51 + Actor439: fenc + Owner: USSR + Location: 54,52 + Actor440: fenc + Owner: USSR + Location: 55,52 + Actor441: fenc + Owner: USSR + Location: 56,52 + Actor442: fenc + Owner: USSR + Location: 56,54 + Actor443: fenc + Owner: USSR + Location: 55,54 + Actor444: fenc + Owner: USSR + Location: 54,54 + Actor445: fenc + Owner: USSR + Location: 54,53 + Actor446: fenc + Owner: USSR + Location: 73,54 + Actor447: fenc + Owner: USSR + Location: 74,54 + Actor448: fenc + Owner: USSR + Location: 75,54 + Actor449: fenc + Owner: USSR + Location: 75,53 + Actor450: fenc + Owner: USSR + Location: 74,52 + Actor451: fenc + Owner: USSR + Location: 73,52 + Actor452: fenc + Owner: USSR + Location: 75,52 + Actor453: fenc + Owner: USSR + Location: 73,50 + Actor454: fenc + Owner: USSR + Location: 74,50 + Actor455: fenc + Owner: USSR + Location: 75,50 + Actor456: fenc + Owner: USSR + Location: 75,51 + Actor457: fenc + Owner: USSR + Location: 75,49 + Actor458: fenc + Owner: USSR + Location: 75,48 + Actor459: fenc + Owner: USSR + Location: 74,48 + Actor460: fenc + Owner: USSR + Location: 73,48 + Actor461: fenc + Owner: USSR + Location: 73,46 + Actor462: fenc + Owner: USSR + Location: 75,46 + Actor463: fenc + Owner: USSR + Location: 74,46 + Actor464: fenc + Owner: USSR + Location: 75,47 + Actor465: fenc + Owner: USSR + Location: 75,45 + Actor466: fenc + Owner: USSR + Location: 74,44 + Actor467: fenc + Owner: USSR + Location: 73,44 + Actor468: fenc + Owner: USSR + Location: 75,44 + Actor469: fenc + Owner: USSR + Location: 84,41 + Actor470: fenc + Owner: USSR + Location: 84,42 + Actor471: fenc + Owner: USSR + Location: 84,43 + Actor472: fenc + Owner: USSR + Location: 86,43 + Actor473: fenc + Owner: USSR + Location: 87,43 + Actor474: fenc + Owner: USSR + Location: 85,43 + Actor475: fenc + Owner: USSR + Location: 87,44 + Actor476: fenc + Owner: USSR + Location: 89,44 + Actor477: fenc + Owner: USSR + Location: 88,44 + Actor478: fenc + Owner: USSR + Location: 90,44 + Actor479: fenc + Owner: USSR + Location: 91,44 + Actor480: fenc + Owner: USSR + Location: 93,44 + Actor481: fenc + Owner: USSR + Location: 92,44 + Actor482: fenc + Owner: USSR + Location: 94,44 + Actor483: fenc + Owner: USSR + Location: 94,43 + Actor484: fenc + Owner: USSR + Location: 83,26 + Actor485: fenc + Owner: USSR + Location: 83,25 + Actor486: fenc + Owner: USSR + Location: 84,25 + Actor487: fenc + Owner: USSR + Location: 85,25 + Actor488: fenc + Owner: USSR + Location: 86,25 + Actor489: fenc + Owner: USSR + Location: 86,26 + Actor490: fenc + Owner: USSR + Location: 87,26 + Actor491: fenc + Owner: USSR + Location: 88,26 + Actor492: fenc + Owner: USSR + Location: 89,26 + Actor493: fenc + Owner: USSR + Location: 90,26 + Actor494: fenc + Owner: USSR + Location: 91,26 + Actor495: fenc + Owner: USSR + Location: 92,26 + Actor496: fenc + Owner: USSR + Location: 92,27 + Actor497: fenc + Owner: USSR + Location: 93,27 + Actor498: fenc + Owner: USSR + Location: 94,27 + Actor499: fenc + Owner: USSR + Location: 94,28 + Actor500: fenc + Owner: USSR + Location: 36,27 + Actor501: fenc + Owner: USSR + Location: 36,26 + Actor502: fenc + Owner: USSR + Location: 36,25 + Actor503: fenc + Owner: USSR + Location: 38,25 + Actor504: fenc + Owner: USSR + Location: 37,25 + Actor505: fenc + Owner: USSR + Location: 39,25 + Actor506: fenc + Owner: USSR + Location: 40,25 + Actor507: fenc + Owner: USSR + Location: 41,25 + Actor508: fenc + Owner: USSR + Location: 42,25 + Actor509: fenc + Owner: USSR + Location: 42,24 + Actor510: fenc + Owner: USSR + Location: 43,24 + Actor511: fenc + Owner: USSR + Location: 44,24 + Actor512: fenc + Owner: USSR + Location: 46,24 + Actor513: fenc + Owner: USSR + Location: 45,24 + Actor514: fenc + Owner: USSR + Location: 47,24 + Actor515: fenc + Owner: USSR + Location: 47,25 + InnerTesla3: tsla + Owner: USSR + Location: 61,25 + InnerTesla4: tsla + Owner: USSR + Location: 66,25 + Actor518: tsla + Owner: USSR + Location: 63,22 + Actor519: tsla + Owner: USSR + Location: 64,22 + Actor520: tsla + Owner: USSR + Location: 63,41 + Actor521: tsla + Owner: USSR + Location: 64,41 + Actor522: brik + Owner: USSR + Location: 63,42 + Actor523: brik + Owner: USSR + Location: 64,42 + Actor524: brik + Owner: USSR + Location: 65,42 + Actor525: brik + Owner: USSR + Location: 65,41 + Actor526: brik + Owner: USSR + Location: 65,40 + Actor527: brik + Owner: USSR + Location: 64,40 + Actor528: brik + Owner: USSR + Location: 62,40 + Actor529: brik + Owner: USSR + Location: 63,40 + Actor530: brik + Owner: USSR + Location: 62,41 + Actor531: brik + Owner: USSR + Location: 62,42 + Actor532: tsla + Owner: USSR + Location: 49,34 + Actor533: tsla + Owner: USSR + Location: 49,33 + Actor534: brik + Owner: USSR + Location: 79,33 + Actor535: brik + Owner: USSR + Location: 80,33 + Actor536: brik + Owner: USSR + Location: 81,33 + Actor537: brik + Owner: USSR + Location: 79,34 + Actor542: tsla + Owner: USSR + Location: 80,34 + Actor543: brik + Owner: USSR + Location: 81,34 + Actor544: brik + Owner: USSR + Location: 79,35 + Actor545: tsla + Owner: USSR + Location: 80,35 + Actor546: brik + Owner: USSR + Location: 81,35 + Actor547: brik + Owner: USSR + Location: 79,36 + Actor548: brik + Owner: USSR + Location: 80,36 + Actor549: brik + Owner: USSR + Location: 81,36 + Actor538: brik + Owner: USSR + Location: 49,35 + Actor539: brik + Owner: USSR + Location: 48,35 + Actor540: brik + Owner: USSR + Location: 48,34 + Actor541: brik + Owner: USSR + Location: 48,33 + Actor550: brik + Owner: USSR + Location: 48,32 + Actor551: brik + Owner: USSR + Location: 49,32 + Actor552: brik + Owner: USSR + Location: 50,32 + Actor553: brik + Owner: USSR + Location: 50,33 + Actor554: brik + Owner: USSR + Location: 50,34 + Actor555: brik + Owner: USSR + Location: 50,35 + Actor556: brik + Owner: USSR + Location: 63,23 + Actor557: brik + Owner: USSR + Location: 64,23 + Actor558: brik + Owner: USSR + Location: 65,23 + Actor559: brik + Owner: USSR + Location: 65,22 + Actor560: brik + Owner: USSR + Location: 65,21 + Actor561: brik + Owner: USSR + Location: 63,21 + Actor562: brik + Owner: USSR + Location: 64,21 + Actor563: brik + Owner: USSR + Location: 62,21 + Actor564: brik + Owner: USSR + Location: 62,22 + Actor565: brik + Owner: USSR + Location: 62,23 + Actor566: brik + Owner: USSR + Location: 60,25 + Actor567: brik + Owner: USSR + Location: 60,24 + Actor568: brik + Owner: USSR + Location: 61,24 + Actor569: brik + Owner: USSR + Location: 62,24 + Actor570: brik + Owner: USSR + Location: 66,23 + Actor571: brik + Owner: USSR + Location: 66,24 + Actor572: brik + Owner: USSR + Location: 67,24 + Actor573: brik + Owner: USSR + Location: 67,25 + Actor574: brik + Owner: USSR + Location: 61,23 + Actor575: brik + Owner: USSR + Location: 67,23 + Actor576: brik + Owner: USSR + Location: 60,23 + Actor577: ftur + Owner: USSR + Location: 47,33 + Actor578: ftur + Owner: USSR + Location: 47,34 + Actor579: ftur + Owner: USSR + Location: 82,35 + Actor580: ftur + Owner: USSR + Location: 82,34 + Actor581: ftur + Owner: USSR + Location: 63,43 + Actor582: ftur + Owner: USSR + Location: 64,43 + Actor584: afld + Owner: USSR + Location: 73,36 + MainBarracks2: barr + Owner: USSR + Location: 55,39 + Actor587: silo + Owner: USSR + Location: 55,20 + Actor588: silo + Owner: USSR + Location: 56,20 + Actor589: silo + Owner: USSR + Location: 55,21 + Actor590: silo + Owner: USSR + Location: 56,21 + Actor595: silo + Owner: USSR + Location: 79,24 + Actor596: silo + Owner: USSR + Location: 78,24 + Actor597: silo + Owner: USSR + Location: 78,25 + Actor598: silo + Owner: USSR + Location: 79,25 + Actor599: silo + Owner: USSR + Location: 67,20 + Actor600: silo + Owner: USSR + Location: 68,20 + Actor601: silo + Owner: USSR + Location: 67,21 + Actor602: silo + Owner: USSR + Location: 68,21 + Actor603: sam + Owner: USSR + Location: 71,19 + Actor604: sam + Owner: USSR + Location: 58,19 + Actor605: sam + Owner: USSR + Location: 52,24 + Actor606: sam + Owner: USSR + Location: 75,23 + Actor607: sam + Owner: USSR + Location: 79,28 + Actor608: sam + Owner: USSR + Location: 50,27 + Actor609: sam + Owner: USSR + Location: 58,41 + Actor610: sam + Owner: USSR + Location: 74,40 + Actor611: sam + Owner: USSR + Location: 78,39 + Actor612: sam + Owner: USSR + Location: 52,37 + TPower8: tpwr + Owner: USSR + Location: 116,85 + TPower5: tpwr + Owner: USSR + Location: 116,82 + TPower2: tpwr + Owner: USSR + Location: 116,79 + TPower3: tpwr + Owner: USSR + Location: 119,79 + TPower6: tpwr + Owner: USSR + Location: 119,82 + TPower9: tpwr + Owner: USSR + Location: 119,85 + TPower7: tpwr + Owner: USSR + Location: 113,85 + TPower4: tpwr + Owner: USSR + Location: 113,82 + TPower1: tpwr + Owner: USSR + Location: 113,79 + Actor622: brik + Owner: USSR + Location: 112,78 + Actor623: brik + Owner: USSR + Location: 112,79 + Actor624: brik + Owner: USSR + Location: 112,80 + Actor625: brik + Owner: USSR + Location: 112,81 + Actor626: brik + Owner: USSR + Location: 112,82 + Actor627: brik + Owner: USSR + Location: 112,83 + Actor628: brik + Owner: USSR + Location: 112,84 + Actor629: brik + Owner: USSR + Location: 112,85 + Actor630: brik + Owner: USSR + Location: 112,86 + Actor631: brik + Owner: USSR + Location: 112,87 + Actor632: brik + Owner: USSR + Location: 112,88 + Actor633: brik + Owner: USSR + Location: 113,88 + Actor634: brik + Owner: USSR + Location: 114,88 + Actor635: brik + Owner: USSR + Location: 115,88 + Actor636: brik + Owner: USSR + Location: 116,88 + Actor637: brik + Owner: USSR + Location: 117,88 + Actor638: brik + Owner: USSR + Location: 119,88 + Actor639: brik + Owner: USSR + Location: 118,88 + Actor640: brik + Owner: USSR + Location: 120,88 + Actor641: brik + Owner: USSR + Location: 121,88 + Actor642: brik + Owner: USSR + Location: 122,88 + Actor643: brik + Owner: USSR + Location: 122,87 + Actor644: brik + Owner: USSR + Location: 122,86 + Actor645: brik + Owner: USSR + Location: 122,84 + Actor646: brik + Owner: USSR + Location: 122,85 + Actor647: brik + Owner: USSR + Location: 122,83 + Actor648: brik + Owner: USSR + Location: 122,82 + Actor649: brik + Owner: USSR + Location: 122,81 + Actor650: brik + Owner: USSR + Location: 122,80 + Actor651: brik + Owner: USSR + Location: 122,79 + Actor652: brik + Owner: USSR + Location: 122,78 + Actor653: brik + Owner: USSR + Location: 121,78 + Actor654: brik + Owner: USSR + Location: 119,78 + Actor655: brik + Owner: USSR + Location: 120,78 + Actor656: brik + Owner: USSR + Location: 118,78 + Actor657: brik + Owner: USSR + Location: 117,78 + Actor658: brik + Owner: USSR + Location: 116,78 + Actor659: brik + Owner: USSR + Location: 115,78 + Actor660: brik + Owner: USSR + Location: 114,78 + Actor661: brik + Owner: USSR + Location: 113,78 + AtomicReactor: npwr + Owner: USSR + Location: 72,26 + Actor663: powr + Owner: USSR + Location: 68,23 + Actor664: powr + Owner: USSR + Location: 58,23 + OuterSAM36: sam + Owner: USSR + Location: 109,88 + OuterSAM37: sam + Owner: USSR + Location: 108,83 + OuterSAM31: sam + Owner: USSR + Location: 112,76 + OuterSAM35: sam + Owner: USSR + Location: 116,90 + OuterSAM33: sam + Owner: USSR + Location: 124,79 + OuterSAM34: sam + Owner: USSR + Location: 123,85 + OuterSAM32: sam + Owner: USSR + Location: 118,77 + Actor672: fenc + Owner: USSR + Location: 111,81 + Actor673: fenc + Owner: USSR + Location: 111,82 + Actor674: fenc + Owner: USSR + Location: 111,83 + Actor675: fenc + Owner: USSR + Location: 111,84 + Actor676: fenc + Owner: USSR + Location: 108,84 + Actor677: fenc + Owner: USSR + Location: 108,85 + Actor678: fenc + Owner: USSR + Location: 108,86 + Actor679: fenc + Owner: USSR + Location: 115,90 + Actor680: fenc + Owner: USSR + Location: 115,89 + Actor681: fenc + Owner: USSR + Location: 116,89 + Actor682: fenc + Owner: USSR + Location: 117,89 + Actor683: fenc + Owner: USSR + Location: 118,89 + Actor684: fenc + Owner: USSR + Location: 118,90 + Actor685: fenc + Owner: USSR + Location: 124,78 + Actor686: fenc + Owner: USSR + Location: 123,78 + Actor687: fenc + Owner: USSR + Location: 123,79 + Actor688: fenc + Owner: USSR + Location: 123,80 + Actor689: fenc + Owner: USSR + Location: 124,80 + Actor690: fenc + Owner: USSR + Location: 124,81 + Actor691: fenc + Owner: USSR + Location: 124,82 + Actor692: fenc + Owner: USSR + Location: 124,84 + Actor693: fenc + Owner: USSR + Location: 124,83 + Actor694: fenc + Owner: USSR + Location: 123,84 + Actor695: fenc + Owner: USSR + Location: 111,85 + Actor696: fenc + Owner: USSR + Location: 111,86 + Actor697: fenc + Owner: USSR + Location: 111,89 + Actor698: fenc + Owner: USSR + Location: 111,88 + Actor699: fenc + Owner: USSR + Location: 111,87 + Actor700: fenc + Owner: USSR + Location: 112,89 + Actor701: fenc + Owner: USSR + Location: 114,89 + Actor702: fenc + Owner: USSR + Location: 113,89 + Actor703: fenc + Owner: USSR + Location: 119,89 + Actor704: fenc + Owner: USSR + Location: 111,77 + Actor705: fenc + Owner: USSR + Location: 112,77 + Actor706: fenc + Owner: USSR + Location: 113,77 + Actor707: fenc + Owner: USSR + Location: 114,77 + Actor708: fenc + Owner: USSR + Location: 114,76 + Actor709: fenc + Owner: USSR + Location: 117,77 + Actor710: fenc + Owner: USSR + Location: 117,76 + Actor711: fenc + Owner: USSR + Location: 118,76 + Actor712: fenc + Owner: USSR + Location: 119,76 + Actor747: sbag + Owner: USSR + Location: 5,34 + Actor748: sbag + Owner: USSR + Location: 5,38 + Actor749: sbag + Owner: USSR + Location: 5,39 + Actor750: sbag + Owner: USSR + Location: 5,33 + Actor751: sbag + Owner: USSR + Location: 5,32 + Actor752: sbag + Owner: USSR + Location: 5,31 + Actor753: sbag + Owner: USSR + Location: 5,30 + Actor754: sbag + Owner: USSR + Location: 5,40 + Actor755: sbag + Owner: USSR + Location: 5,41 + Actor756: sbag + Owner: USSR + Location: 5,42 + Actor757: sbag + Owner: USSR + Location: 6,42 + Actor758: sbag + Owner: USSR + Location: 7,42 + Actor759: sbag + Owner: USSR + Location: 8,42 + Actor760: sbag + Owner: USSR + Location: 10,42 + Actor761: sbag + Owner: USSR + Location: 9,42 + Actor762: sbag + Owner: USSR + Location: 11,42 + Actor763: sbag + Owner: USSR + Location: 12,42 + Actor764: sbag + Owner: USSR + Location: 13,38 + Actor765: sbag + Owner: USSR + Location: 13,39 + Actor766: sbag + Owner: USSR + Location: 13,41 + Actor767: sbag + Owner: USSR + Location: 13,40 + Actor768: sbag + Owner: USSR + Location: 13,42 + Actor769: sbag + Owner: USSR + Location: 13,34 + Actor770: sbag + Owner: USSR + Location: 13,33 + Actor771: sbag + Owner: USSR + Location: 13,32 + Actor772: sbag + Owner: USSR + Location: 13,31 + Actor773: sbag + Owner: USSR + Location: 7,30 + Actor774: sbag + Owner: USSR + Location: 6,30 + Actor775: sbag + Owner: USSR + Location: 8,30 + Actor776: sbag + Owner: USSR + Location: 10,30 + Actor777: sbag + Owner: USSR + Location: 9,30 + Actor778: sbag + Owner: USSR + Location: 11,30 + Actor779: sbag + Owner: USSR + Location: 12,30 + Actor780: sbag + Owner: USSR + Location: 13,30 + Actor781: sbag + Owner: USSR + Location: 118,29 + Actor782: sbag + Owner: USSR + Location: 118,28 + Actor783: sbag + Owner: USSR + Location: 118,33 + Actor784: sbag + Owner: USSR + Location: 118,34 + Actor785: sbag + Owner: USSR + Location: 118,35 + Actor786: sbag + Owner: USSR + Location: 118,36 + Actor787: sbag + Owner: USSR + Location: 120,36 + Actor788: sbag + Owner: USSR + Location: 119,36 + Actor789: sbag + Owner: USSR + Location: 121,36 + Actor790: sbag + Owner: USSR + Location: 122,36 + Actor791: sbag + Owner: USSR + Location: 123,36 + Actor792: sbag + Owner: USSR + Location: 124,36 + Actor793: sbag + Owner: USSR + Location: 125,36 + Actor794: sbag + Owner: USSR + Location: 126,36 + Actor795: sbag + Owner: USSR + Location: 127,36 + Actor796: sbag + Owner: USSR + Location: 128,36 + Actor797: sbag + Owner: USSR + Location: 128,35 + Actor798: sbag + Owner: USSR + Location: 128,31 + Actor799: sbag + Owner: USSR + Location: 128,30 + Actor800: sbag + Owner: USSR + Location: 128,29 + Actor801: sbag + Owner: USSR + Location: 128,28 + Actor802: sbag + Owner: USSR + Location: 118,27 + Actor803: sbag + Owner: USSR + Location: 118,26 + Actor804: sbag + Owner: USSR + Location: 119,26 + Actor805: sbag + Owner: USSR + Location: 120,26 + Actor806: sbag + Owner: USSR + Location: 122,26 + Actor807: sbag + Owner: USSR + Location: 121,26 + Actor808: sbag + Owner: USSR + Location: 123,26 + Actor809: sbag + Owner: USSR + Location: 124,26 + Actor810: sbag + Owner: USSR + Location: 125,26 + Actor811: sbag + Owner: USSR + Location: 126,26 + Actor812: sbag + Owner: USSR + Location: 127,26 + Actor813: sbag + Owner: USSR + Location: 128,26 + Actor814: sbag + Owner: USSR + Location: 128,27 + Actor815: barr + Owner: USSR + Location: 120,32 + Actor816: barr + Owner: USSR + Location: 10,31 + Actor817: powr + Owner: USSR + Location: 6,39 + Actor818: powr + Owner: USSR + Location: 8,39 + Actor819: powr + Owner: USSR + Location: 126,27 + Actor820: powr + Owner: USSR + Location: 124,27 + Actor821: ftur + Owner: USSR + Location: 117,29 + Actor822: ftur + Owner: USSR + Location: 117,33 + Actor823: ftur + Owner: USSR + Location: 14,34 + Actor824: ftur + Owner: USSR + Location: 14,40 + Actor825: sbag + Owner: USSR + Location: 72,96 + Actor826: sbag + Owner: USSR + Location: 76,96 + Actor827: sbag + Owner: USSR + Location: 77,96 + Actor828: sbag + Owner: USSR + Location: 78,96 + Actor829: sbag + Owner: USSR + Location: 71,96 + Actor830: sbag + Owner: USSR + Location: 69,96 + Actor831: sbag + Owner: USSR + Location: 70,96 + Actor832: sbag + Owner: USSR + Location: 79,96 + Actor833: sbag + Owner: USSR + Location: 80,96 + Actor834: sbag + Owner: USSR + Location: 68,96 + Actor835: sbag + Owner: USSR + Location: 68,95 + Actor836: sbag + Owner: USSR + Location: 68,94 + Actor837: sbag + Owner: USSR + Location: 68,93 + Actor838: sbag + Owner: USSR + Location: 68,92 + Actor839: sbag + Owner: USSR + Location: 68,91 + Actor840: sbag + Owner: USSR + Location: 68,90 + Actor841: sbag + Owner: USSR + Location: 68,89 + Actor842: sbag + Owner: USSR + Location: 69,89 + Actor843: sbag + Owner: USSR + Location: 70,89 + Actor844: sbag + Owner: USSR + Location: 71,89 + Actor845: sbag + Owner: USSR + Location: 72,89 + Actor846: sbag + Owner: USSR + Location: 77,89 + Actor847: sbag + Owner: USSR + Location: 76,89 + Actor848: sbag + Owner: USSR + Location: 78,89 + Actor849: sbag + Owner: USSR + Location: 79,89 + Actor850: sbag + Owner: USSR + Location: 80,89 + Actor851: sbag + Owner: USSR + Location: 80,90 + Actor852: sbag + Owner: USSR + Location: 80,91 + Actor853: sbag + Owner: USSR + Location: 80,92 + Actor854: sbag + Owner: USSR + Location: 80,93 + Actor855: sbag + Owner: USSR + Location: 80,94 + Actor856: sbag + Owner: USSR + Location: 80,95 + Actor857: ftur + Owner: USSR + Location: 71,88 + Actor858: ftur + Owner: USSR + Location: 77,88 + Actor859: barr + Owner: USSR + Location: 78,90 + Actor860: powr + Owner: USSR + Location: 69,93 + Actor861: powr + Owner: USSR + Location: 69,90 + Actor862: silo + Owner: USSR + Location: 79,95 + Actor863: silo + Owner: USSR + Location: 78,95 + Actor864: silo + Owner: USSR + Location: 6,31 + Actor865: silo + Owner: USSR + Location: 7,31 + Actor866: silo + Owner: USSR + Location: 119,27 + Actor867: silo + Owner: USSR + Location: 120,27 + Actor871: ftur + Owner: USSR + Location: 97,33 + Actor872: ftur + Owner: USSR + Location: 97,37 + Actor870: ftur + Owner: USSR + Location: 35,36 + Actor873: ftur + Owner: USSR + Location: 35,32 + Actor874: ftur + Owner: USSR + Location: 61,57 + Actor875: ftur + Owner: USSR + Location: 66,57 + Actor868: fenc + Owner: USSR + Location: 67,57 + Actor869: fenc + Owner: USSR + Location: 68,57 + Actor876: fenc + Owner: USSR + Location: 69,57 + Actor877: fenc + Owner: USSR + Location: 69,56 + Actor878: fenc + Owner: USSR + Location: 69,55 + Actor879: fenc + Owner: USSR + Location: 59,57 + Actor880: fenc + Owner: USSR + Location: 60,57 + Actor881: fenc + Owner: USSR + Location: 59,56 + Actor882: fenc + Owner: USSR + Location: 59,55 + Actor883: fenc + Owner: USSR + Location: 69,54 + Actor884: fenc + Owner: USSR + Location: 97,38 + Actor885: fenc + Owner: USSR + Location: 97,39 + Actor886: fenc + Owner: USSR + Location: 96,39 + Actor887: fenc + Owner: USSR + Location: 97,32 + Actor888: fenc + Owner: USSR + Location: 97,31 + Actor889: fenc + Owner: USSR + Location: 96,31 + Actor890: fenc + Owner: USSR + Location: 35,31 + Actor891: fenc + Owner: USSR + Location: 35,30 + Actor892: fenc + Owner: USSR + Location: 35,29 + Actor893: fenc + Owner: USSR + Location: 36,29 + Actor894: fenc + Owner: USSR + Location: 36,28 + Actor895: fenc + Owner: USSR + Location: 35,37 + Actor896: fenc + Owner: USSR + Location: 35,38 + Actor897: fenc + Owner: USSR + Location: 35,39 + Actor898: fenc + Owner: USSR + Location: 36,39 + Actor899: fenc + Owner: USSR + Location: 95,43 + Actor900: fenc + Owner: USSR + Location: 96,42 + Actor901: fenc + Owner: USSR + Location: 96,43 + Actor902: fenc + Owner: USSR + Location: 96,41 + Actor903: fenc + Owner: USSR + Location: 96,40 + Actor904: fenc + Owner: USSR + Location: 95,28 + Actor905: fenc + Owner: USSR + Location: 96,28 + Actor906: fenc + Owner: USSR + Location: 96,29 + Actor907: fenc + Owner: USSR + Location: 96,30 + Actor908: fenc + Owner: USSR + Location: 56,55 + Actor909: fenc + Owner: USSR + Location: 57,55 + Actor910: fenc + Owner: USSR + Location: 58,55 + Actor911: fenc + Owner: USSR + Location: 70,55 + Actor912: fenc + Owner: USSR + Location: 71,55 + Actor913: fenc + Owner: USSR + Location: 72,55 + Actor914: fenc + Owner: USSR + Location: 73,55 + Actor915: v2rl + Owner: USSR + Facing: 384 + Location: 59,42 + Actor916: v2rl + Owner: USSR + Facing: 384 + Location: 54,38 + Actor917: v2rl + Owner: USSR + Location: 73,40 + Facing: 642 + Actor918: v2rl + Owner: USSR + Location: 80,39 + Facing: 642 + Actor919: v2rl + Owner: USSR + Location: 80,29 + Facing: 642 + Actor920: v2rl + Owner: USSR + Location: 50,28 + Facing: 384 + Actor921: spen + Owner: USSR + Location: 104,78 + Actor922: seas + Owner: USSR + Location: 104,82 + Facing: 237 + Actor924: seas + Owner: USSR + Facing: 384 + Location: 111,92 + Actor925: seas + Owner: USSR + Facing: 384 + Location: 120,93 + Actor926: seas + Owner: USSR + Location: 125,74 + Facing: 0 + Actor928: seas + Owner: USSR + Location: 113,72 + Facing: 103 + Actor930: ss + Owner: USSR + Location: 117,71 + Facing: 15 + Actor931: ss + Owner: USSR + Location: 123,71 + Facing: 7 + Actor932: shok + Owner: USSR + SubCell: 3 + Location: 60,37 + Facing: 578 + Actor933: shok + Owner: USSR + Facing: 384 + Location: 60,37 + SubCell: 1 + Actor934: shok + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 57,31 + Actor935: shok + Owner: USSR + SubCell: 3 + Location: 63,38 + Facing: 570 + Actor936: shok + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 68,37 + Actor937: shok + Owner: USSR + SubCell: 3 + Location: 70,36 + Facing: 563 + Actor938: shok + Owner: USSR + Location: 70,31 + SubCell: 3 + Facing: 666 + Actor939: shok + Owner: USSR + Facing: 384 + Location: 68,37 + SubCell: 1 + Actor940: shok + Owner: USSR + SubCell: 3 + Location: 66,39 + Facing: 658 + Actor941: e8 + Owner: USSR + SubCell: 3 + Location: 71,29 + Facing: 713 + Actor943: e8 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 58,40 + Actor944: 3tnk + Owner: USSR + Location: 84,35 + Facing: 768 + Actor945: 3tnk + Owner: USSR + Location: 65,46 + Facing: 512 + Actor946: 3tnk + Owner: USSR + Location: 44,34 + Facing: 256 + Actor947: 3tnk + Owner: USSR + Facing: 256 + Location: 42,34 + Actor948: 3tnk + Owner: USSR + Facing: 256 + Location: 40,34 + Actor949: 3tnk + Owner: USSR + Facing: 256 + Location: 38,34 + Actor950: 3tnk + Owner: USSR + Facing: 256 + Location: 36,34 + Actor951: 3tnk + Owner: USSR + Facing: 768 + Location: 86,35 + Actor952: 3tnk + Owner: USSR + Facing: 768 + Location: 88,35 + Actor953: 3tnk + Owner: USSR + Facing: 768 + Location: 90,35 + Actor954: 3tnk + Owner: USSR + Facing: 768 + Location: 92,35 + Actor955: 3tnk + Owner: USSR + Facing: 512 + Location: 65,48 + Actor956: 3tnk + Owner: USSR + Facing: 512 + Location: 65,50 + Actor957: 3tnk + Owner: USSR + Facing: 512 + Location: 65,52 + Actor958: 3tnk + Owner: USSR + Facing: 512 + Location: 65,54 + Actor960: ttra + Owner: USSR + Location: 51,34 + Facing: 256 + Actor961: ttra + Owner: USSR + Location: 77,33 + Facing: 630 + Actor963: ttra + Owner: USSR + Location: 63,39 + Facing: 512 + Actor959: ttra + Owner: USSR + Facing: 256 + Location: 51,33 + Actor962: ttra + Owner: USSR + Facing: 630 + Location: 78,32 + Actor964: ttra + Owner: USSR + Facing: 512 + Location: 64,39 + Actor965: boxes05 + Owner: Neutral + Faction: russia + Location: 11,41 + Actor966: boxes06 + Owner: Neutral + Faction: russia + Location: 12,40 + Actor967: boxes02 + Owner: Neutral + Faction: russia + Location: 11,40 + Actor968: boxes09 + Owner: Neutral + Faction: russia + Location: 12,41 + Actor969: boxes01 + Owner: Neutral + Faction: russia + Location: 12,39 + Actor971: boxes02 + Owner: Neutral + Faction: russia + Location: 71,94 + Actor973: boxes05 + Owner: Neutral + Faction: russia + Location: 71,95 + Actor974: boxes09 + Owner: Neutral + Faction: russia + Location: 72,95 + Actor970: boxes01 + Owner: Neutral + Faction: russia + Location: 123,27 + Actor972: boxes02 + Owner: Neutral + Faction: russia + Location: 122,28 + Actor975: boxes06 + Owner: Neutral + Faction: russia + Location: 123,28 + Actor977: boxes09 + Owner: Neutral + Faction: russia + Location: 123,29 + Actor978: boxes05 + Owner: Neutral + Faction: russia + Location: 122,27 + Actor980: boxes05 + Owner: Neutral + Faction: russia + Location: 62,18 + Actor981: tc05 + Owner: Neutral + Faction: russia + Location: 58,14 + Actor982: tc04 + Owner: Neutral + Faction: russia + Location: 49,20 + Actor983: tc03 + Owner: Neutral + Faction: russia + Location: 76,19 + Actor984: tc02 + Owner: Neutral + Faction: russia + Location: 80,20 + Actor985: tc01 + Owner: Neutral + Faction: russia + Location: 82,21 + Actor986: t17 + Owner: Neutral + Faction: russia + Location: 89,24 + Actor987: tc02 + Owner: Neutral + Faction: russia + Location: 95,26 + Actor988: tc03 + Owner: Neutral + Faction: russia + Location: 47,22 + Actor989: tc04 + Owner: Neutral + Faction: russia + Location: 47,45 + Actor990: tc02 + Owner: Neutral + Faction: russia + Location: 33,27 + Actor991: t17 + Owner: Neutral + Faction: russia + Location: 36,23 + Actor992: tc04 + Owner: Neutral + Faction: russia + Location: 97,42 + Actor993: tc03 + Owner: Neutral + Faction: russia + Location: 99,44 + Actor994: t17 + Owner: Neutral + Faction: russia + Location: 96,44 + Actor995: t12 + Owner: Neutral + Faction: russia + Location: 83,46 + Actor996: t11 + Owner: Neutral + Faction: russia + Location: 90,46 + Actor997: tc03 + Owner: Neutral + Faction: russia + Location: 78,42 + Actor998: tc01 + Owner: Neutral + Faction: russia + Location: 74,42 + Actor999: tc02 + Owner: Neutral + Faction: russia + Location: 43,44 + Actor1000: t16 + Owner: Neutral + Faction: russia + Location: 45,46 + Actor1001: t07 + Owner: Neutral + Faction: russia + Location: 42,47 + Actor1002: t16 + Owner: Neutral + Faction: russia + Location: 38,45 + Actor1010: apc2.reinforce + Owner: GDI + Facing: 896 + Location: 24,83 + Actor1012: hmmv.tow + Owner: GDI + Facing: 896 + Location: 19,84 + Actor1013: mtnk + Owner: GDI + Facing: 896 + Location: 21,84 + Actor1014: mtnk + Owner: GDI + Facing: 896 + Location: 24,85 + Actor1015: apc2.reinforce + Owner: GDI + Facing: 896 + Location: 27,85 + Actor1017: mtnk + Owner: GDI + Facing: 896 + Location: 26,87 + Actor1018: hmmv.tow + Owner: GDI + Facing: 896 + Location: 28,88 + Actor1003: split2 + Owner: Neutral + Location: 41,87 + Actor1004: split2 + Owner: Neutral + Location: 43,93 + Actor1005: tc05 + Owner: Neutral + Location: 112,0 + Actor1006: tc04 + Owner: Neutral + Location: 115,1 + Actor1007: tc01 + Owner: Neutral + Location: 118,1 + Actor1008: t17 + Owner: Neutral + Location: 117,2 + Actor1009: tc02 + Owner: Neutral + Location: 120,1 + Actor1011: tc04 + Owner: Neutral + Location: 122,1 + Actor1019: tc01 + Owner: Neutral + Location: 118,3 + Actor1020: t13 + Owner: Neutral + Location: 118,2 + Actor1021: t11 + Owner: Neutral + Location: 120,2 + Actor1022: t02 + Owner: Neutral + Location: 121,3 + Actor1023: tc05 + Owner: Neutral + Location: 126,1 + Actor1024: t13 + Owner: Neutral + Location: 124,1 + Actor1025: t05 + Owner: Neutral + Location: 125,2 + Actor1026: t06 + Owner: Neutral + Location: 126,4 + Actor1027: t08 + Owner: Neutral + Location: 124,4 + Actor1028: t11 + Owner: Neutral + Location: 127,3 + Actor1029: t10 + Owner: Neutral + Location: 127,6 + Actor1030: tc03 + Owner: Neutral + Location: 125,6 + Actor1031: tc02 + Owner: Neutral + Location: 123,5 + Actor1032: t10 + Owner: Neutral + Location: 121,6 + Actor1033: t05 + Owner: Neutral + Location: 120,5 + Actor1034: t06 + Owner: Neutral + Location: 116,4 + Actor1035: t01 + Owner: Neutral + Location: 111,2 + Actor1036: t03 + Owner: Neutral + Location: 113,3 + Actor1037: t12 + Owner: Neutral + Location: 108,3 + Actor1038: t17 + Owner: Neutral + Location: 125,9 + Actor1039: t06 + Owner: Neutral + Location: 123,8 + Actor1040: t01 + Owner: Neutral + Location: 127,12 + Actor1041: t13 + Owner: Neutral + Location: 127,9 + Actor1042: t08 + Owner: Neutral + Location: 126,9 + Actor1043: t05 + Owner: Neutral + Location: 128,15 + Actor1044: tc03 + Owner: Neutral + Location: 127,17 + Actor1045: tc04 + Owner: Neutral + Location: 125,14 + Actor1046: t13 + Owner: Neutral + Location: 127,20 + Actor1047: t15 + Owner: Neutral + Location: 124,18 + Actor1048: t07 + Owner: Neutral + Location: 124,11 + Actor1049: t03 + Owner: Neutral + Location: 120,10 + Actor1050: t17 + Owner: Neutral + Location: 128,24 + Actor1051: t06 + Owner: Neutral + Location: 126,22 + Actor1052: t14 + Owner: Neutral + Location: 47,53 + Actor1053: t10 + Owner: Neutral + Location: 100,54 + Actor1054: t06 + Owner: Neutral + Location: 125,42 + Actor1056: t11 + Owner: Neutral + Location: 124,56 + Actor1058: tc03 + Owner: Neutral + Location: 16,58 + Actor1059: t12 + Owner: Neutral + Location: 17,56 + Actor1060: t07 + Owner: Neutral + Location: 7,68 + Actor1061: t06 + Owner: Neutral + Location: 39,58 + Actor1062: t01 + Owner: Neutral + Location: 50,64 + Actor1063: t02 + Owner: Neutral + Location: 30,46 + Actor1064: t01 + Owner: Neutral + Location: 20,35 + Actor1065: ice01 + Owner: Neutral + Location: 95,91 + Actor1066: ice03 + Owner: Neutral + Location: 100,94 + Actor1067: ice05 + Owner: Neutral + Location: 102,68 + Actor1068: ice03 + Owner: Neutral + Location: 120,64 + Actor1069: ice01 + Owner: Neutral + Location: 127,94 + Actor1070: t17 + Owner: Neutral + Location: 88,94 + Actor1071: t06 + Owner: Neutral + Location: 83,92 + Actor1072: t01 + Owner: Neutral + Location: 80,83 + Actor1073: t07 + Owner: Neutral + Location: 65,93 + Actor1074: t03 + Owner: Neutral + Location: 57,91 + Actor1075: split2 + Owner: Neutral + Location: 8,52 + Actor1076: split2 + Owner: Neutral + Location: 14,48 + Actor1077: split2 + Owner: Neutral + Location: 94,6 + Actor1078: split2 + Owner: Neutral + Location: 99,7 + Actor1079: split2 + Owner: Neutral + Location: 113,57 + Actor1080: split2 + Owner: Neutral + Location: 119,55 + Actor1055: t13 + Owner: Neutral + Location: 110,50 + Actor1057: t06 + Owner: Neutral + Location: 111,48 + Actor1081: split2 + Owner: Neutral + Location: 91,68 + Actor1082: split2 + Owner: Neutral + Location: 9,8 + Actor1083: split2 + Owner: Neutral + Location: 14,7 + Actor1084: tc04 + Owner: Neutral + Location: 6,14 + Actor1085: tc05 + Owner: Neutral + Location: 5,21 + Actor1086: tc01 + Owner: Neutral + Location: 7,19 + Actor1087: t12 + Owner: Neutral + Location: 8,17 + Actor1088: t11 + Owner: Neutral + Location: 5,18 + Actor1089: tc02 + Owner: Neutral + Location: 3,11 + Actor1090: t10 + Owner: Neutral + Location: 4,13 + Actor1091: t06 + Owner: Neutral + Location: 4,16 + Actor1092: t05 + Owner: Neutral + Location: 3,23 + Actor1093: tc04 + Owner: Neutral + Location: 1,20 + Actor1094: t14 + Owner: Neutral + Location: 1,19 + Actor1095: t17 + Owner: Neutral + Location: 3,18 + Actor1096: t02 + Owner: Neutral + Location: 1,16 + Actor1097: t01 + Owner: Neutral + Location: 2,14 + Actor1098: t05 + Owner: Neutral + Location: 1,13 + Actor1099: t03 + Owner: Neutral + Location: 2,10 + Actor1100: t12 + Owner: Neutral + Location: 2,23 + Actor1101: brl3 + Owner: Creeps + Location: 7,33 + Actor1102: barl + Owner: Creeps + Location: 6,32 + Actor1103: barl + Owner: Creeps + Location: 6,34 + Actor1104: brl3 + Owner: Creeps + Location: 71,90 + Actor1105: barl + Owner: Creeps + Location: 71,91 + Actor1106: barl + Owner: Creeps + Location: 72,90 + Actor1107: barl + Owner: Creeps + Location: 124,35 + Actor1108: brl3 + Owner: Creeps + Location: 125,34 + Actor1109: brl3 + Owner: Creeps + Location: 126,35 + Actor1110: barl + Owner: Creeps + Location: 126,34 + Actor1111: barl + Owner: Creeps + Location: 127,35 + Actor1112: v12 + Owner: Neutral + Location: 41,3 + Actor1113: v13 + Owner: Neutral + Location: 37,3 + Actor1114: t16 + Owner: Neutral + Location: 104,17 + Actor1115: t06 + Owner: Neutral + Location: 116,20 + Actor1116: t03 + Owner: Neutral + Location: 106,33 + Actor1117: t08 + Owner: Neutral + Location: 115,21 + Actor1118: t15 + Owner: Neutral + Location: 31,8 + Actor1119: t13 + Owner: Neutral + Location: 41,10 + Actor1120: t05 + Owner: Neutral + Location: 42,13 + Actor1121: t16 + Owner: Neutral + Location: 27,16 + Actor1122: tc02 + Owner: Neutral + Location: 17,24 + Actor1123: t13 + Owner: Neutral + Location: 17,64 + Actor1124: t03 + Owner: Neutral + Location: 9,90 + Actor1125: t06 + Owner: Neutral + Location: 34,72 + Actor1126: t05 + Owner: Neutral + Location: 44,65 + Actor1127: t17 + Owner: Neutral + Location: 10,62 + Actor1128: t07 + Owner: Neutral + Location: 1,65 + Actor1129: t02 + Owner: Neutral + Location: 2,43 + Actor1130: t10 + Owner: Neutral + Location: 68,5 + Actor1131: t12 + Owner: Neutral + Location: 71,10 + Actor1132: t06 + Owner: Neutral + Location: 81,5 + Actor1133: t06 + Owner: Neutral + Location: 86,56 + ReactorDeliveryPoint2: waypoint + Owner: Neutral + Location: 73,28 + WestDeliverySpawn: waypoint + Owner: Neutral + Location: 1,40 + WestDelivery1: waypoint + Owner: Neutral + Location: 8,36 + WestDelivery2: waypoint + Owner: Neutral + Location: 25,38 + WestDelivery4: waypoint + Owner: Neutral + Location: 34,34 + WestDelivery3: waypoint + Owner: Neutral + Location: 27,32 + SouthDeliverySpawn: waypoint + Owner: Neutral + Location: 74,96 + SouthDelivery1: waypoint + Owner: Neutral + Location: 74,84 + SouthDelivery2: waypoint + Owner: Neutral + Location: 78,64 + SouthDelivery3: waypoint + Owner: Neutral + Location: 64,61 + SouthDelivery4: waypoint + Owner: Neutral + Location: 64,46 + EastDeliverySpawn: waypoint + Owner: Neutral + Location: 128,33 + EastDelivery1: waypoint + Owner: Neutral + Location: 116,31 + EastDelivery2: waypoint + Owner: Neutral + Location: 114,37 + EastDelivery3: waypoint + Owner: Neutral + Location: 98,35 + PlayerStart: waypoint + Owner: Neutral + Location: 23,86 + Actor1134: 3tnk + Owner: USSR + Facing: 768 + Location: 16,36 + Actor1135: 3tnk + Owner: USSR + Facing: 256 + Location: 115,30 + Actor1136: 3tnk + Owner: USSR + Location: 72,86 + Facing: 0 + Actor1137: e1 + Owner: USSR + SubCell: 3 + Location: 70,86 + Facing: 182 + Actor1138: e1 + Owner: USSR + SubCell: 3 + Location: 76,88 + Facing: 15 + Actor1139: e1 + Owner: USSR + SubCell: 3 + Location: 77,86 + Facing: 0 + Actor1140: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 117,34 + Actor1141: e1 + Owner: USSR + SubCell: 3 + Location: 116,29 + Facing: 79 + Actor1142: e1 + Owner: USSR + SubCell: 3 + Location: 115,29 + Facing: 237 + Actor1143: e1 + Owner: USSR + SubCell: 3 + Location: 15,40 + TurretFacing: 0 + Facing: 578 + Actor1144: e1 + Owner: USSR + SubCell: 3 + Location: 17,35 + Facing: 658 + Actor1145: e1 + Owner: USSR + SubCell: 3 + Location: 16,34 + Facing: 713 + Actor1146: e1 + Owner: USSR + SubCell: 3 + Location: 11,34 + Facing: 689 + Actor1147: e2 + Owner: USSR + SubCell: 3 + Location: 12,35 + Facing: 570 + Actor1148: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 120,30 + Actor1149: e2 + Owner: USSR + SubCell: 3 + Location: 76,90 + Facing: 31 + Actor1150: e3 + Owner: USSR + Facing: 384 + Location: 72,91 + SubCell: 3 + Actor1151: e3 + Owner: USSR + SubCell: 3 + Location: 8,34 + Facing: 384 + Actor1152: e3 + Owner: USSR + SubCell: 3 + Location: 123,34 + Facing: 555 + Actor1153: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 56,29 + Actor1154: e1 + Owner: USSR + SubCell: 3 + Location: 57,35 + Facing: 269 + Actor1155: e1 + Owner: USSR + Facing: 384 + Location: 59,37 + SubCell: 3 + SpyDisguiseTarget: e1 + Owner: USSR + Location: 70,36 + SubCell: 1 + Facing: 753 + Actor1158: e1 + Owner: USSR + SubCell: 3 + Location: 59,22 + Facing: 253 + Actor1159: e1 + Owner: USSR + Location: 59,22 + SubCell: 1 + Facing: 384 + Actor1160: e1 + Owner: USSR + SubCell: 3 + Location: 56,25 + Facing: 166 + Actor1161: e1 + Owner: USSR + SubCell: 3 + Location: 70,23 + Facing: 384 + Actor1165: e1 + Owner: USSR + SubCell: 3 + Location: 76,40 + Facing: 999 + Actor1166: e1 + Owner: USSR + SubCell: 3 + Location: 82,38 + Facing: 959 + Actor1167: e1 + Owner: USSR + SubCell: 3 + Location: 88,33 + Facing: 697 + Actor1168: e1 + Owner: USSR + SubCell: 3 + Location: 85,33 + Facing: 721 + Actor1169: e1 + Owner: USSR + SubCell: 3 + Location: 98,32 + Facing: 808 + Actor1170: e1 + Owner: USSR + Location: 98,31 + SubCell: 3 + Facing: 904 + Actor1171: e1 + Owner: USSR + SubCell: 3 + Location: 99,37 + Facing: 800 + Actor1172: e1 + Owner: USSR + SubCell: 3 + Location: 98,38 + Facing: 824 + Actor1173: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 67,54 + Actor1174: e1 + Owner: USSR + SubCell: 3 + Location: 62,51 + Facing: 682 + Actor1175: e1 + Owner: USSR + SubCell: 3 + Location: 60,45 + Facing: 666 + Actor1176: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 67,43 + Actor1177: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 58,56 + Actor1178: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 61,58 + Actor1179: e1 + Owner: USSR + SubCell: 3 + Location: 67,58 + Facing: 523 + Actor1180: e1 + Owner: USSR + Location: 68,58 + SubCell: 3 + Facing: 650 + Actor1181: e1 + Owner: USSR + SubCell: 3 + Location: 74,55 + Facing: 610 + Actor1182: e1 + Owner: USSR + SubCell: 3 + Location: 77,49 + Facing: 666 + Actor1183: e1 + Owner: USSR + SubCell: 3 + Location: 77,45 + Facing: 634 + Actor1184: e1 + Owner: USSR + SubCell: 3 + Location: 81,44 + Facing: 499 + Actor1185: e1 + Owner: USSR + Location: 86,44 + SubCell: 3 + Facing: 570 + Actor1186: e1 + Owner: USSR + SubCell: 3 + Location: 72,56 + Facing: 713 + Actor1187: e1 + Owner: USSR + SubCell: 3 + Location: 95,45 + Facing: 682 + Actor1188: e1 + Owner: USSR + SubCell: 3 + Location: 92,45 + Facing: 570 + Actor1189: e1 + Owner: USSR + SubCell: 3 + Location: 94,26 + Facing: 848 + Actor1190: e1 + Owner: USSR + SubCell: 3 + Location: 90,25 + Facing: 856 + Actor1191: e1 + Owner: USSR + SubCell: 3 + Location: 87,24 + Facing: 753 + Actor1192: e1 + Owner: USSR + SubCell: 3 + Location: 39,24 + Facing: 126 + Actor1193: e1 + Owner: USSR + SubCell: 3 + Location: 43,23 + Facing: 111 + Actor1194: e1 + Owner: USSR + SubCell: 3 + Location: 33,30 + Facing: 206 + Actor1195: e1 + Owner: USSR + SubCell: 3 + Location: 34,31 + Facing: 126 + Actor1196: e1 + Owner: USSR + SubCell: 3 + Location: 34,37 + Facing: 174 + Actor1197: e1 + Owner: USSR + Facing: 384 + Location: 34,38 + SubCell: 3 + Actor1198: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 46,31 + Actor1199: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 41,32 + Actor1200: e1 + Owner: USSR + SubCell: 3 + Location: 52,25 + Facing: 384 + Actor1201: e3 + Owner: USSR + SubCell: 3 + Location: 45,23 + Facing: 182 + Actor1203: e3 + Owner: USSR + Facing: 384 + Location: 88,33 + SubCell: 1 + Actor1204: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 72,41 + Actor1205: e3 + Owner: USSR + Facing: 384 + Location: 72,41 + SubCell: 1 + Actor1206: e3 + Owner: USSR + Location: 69,33 + SubCell: 3 + Facing: 570 + Actor1207: e3 + Owner: USSR + Location: 61,22 + SubCell: 3 + Facing: 594 + Actor1208: e3 + Owner: USSR + SubCell: 3 + Location: 70,20 + Facing: 261 + Actor1202: afld + Owner: USSR + Location: 69,38 + MainBarracks1: barr + Owner: USSR + Location: 55,33 + Actor1210: apoc.atomic + Owner: USSR + Location: 62,36 + Facing: 512 + Actor1211: apoc.atomic + Owner: USSR + Location: 65,36 + Facing: 512 + Actor1212: tc01.husk + Owner: Neutral + Faction: russia + Location: 31,56 + Actor1213: t02.husk + Owner: Neutral + Faction: russia + Location: 58,70 + Actor1214: tc02.husk + Owner: Neutral + Faction: russia + Location: 43,11 + AttackRally1: waypoint + Owner: Neutral + Location: 22,55 + AttackRally2: waypoint + Owner: Neutral + Location: 41,56 + AttackRally3: waypoint + Owner: Neutral + Location: 55,66 + Actor1215: e1 + Owner: USSR + SubCell: 3 + Facing: 689 + Location: 65,39 + InnerSAM1: sam + Owner: USSR + Location: 63,19 + ReactorDeliveryPoint1: waypoint + Owner: Neutral + Location: 72,28 + ReactorDeliveryPoint3: waypoint + Owner: Neutral + Location: 74,28 + ReactorDeliveryPoint4: waypoint + Owner: Neutral + Location: 75,28 + Actor1157: camera + Owner: USSR + Location: 19,78 + Actor1163: camera + Owner: USSR + Location: 33,84 + Actor1164: camera + Owner: USSR + Location: 45,76 + Actor1216: camera + Owner: USSR + Location: 55,88 + Actor1217: camera + Owner: USSR + Location: 30,65 + Actor1218: camera + Owner: USSR + Location: 12,68 + Actor1219: camera + Owner: USSR + Location: 24,50 + Actor1220: camera + Owner: USSR + Location: 22,13 + Actor1221: camera + Owner: USSR + Location: 106,13 + Actor1222: camera + Owner: USSR + Location: 104,51 + Actor1223: camera + Owner: USSR + Location: 92,57 + Actor1224: camera + Owner: USSR + Location: 70,64 + Actor1225: camera + Owner: USSR + Location: 49,59 + Actor1226: camera + Owner: USSR + Location: 18,30 + Actor1227: camera + Owner: USSR + Location: 110,33 + Actor1228: camera + Owner: USSR + Location: 65,8 + SupplyReveal2: waypoint + Owner: Neutral + Location: 74,92 + SupplyReveal1: waypoint + Owner: Neutral + Location: 123,31 + SupplyReveal3: waypoint + Owner: Neutral + Location: 10,36 + Spy: spy + Owner: Greece + SubCell: 3 + Location: 73,29 + Facing: 384 + SpyKiller: dog + Owner: USSR + SubCell: 3 + Location: 54,56 + Facing: 674 + McvSpawn: waypoint + Owner: Neutral + Location: 13,96 + Actor1209: camera + Owner: USSR + Location: 46,49 + Actor1229: camera + Owner: USSR + Location: 77,58 + Actor1230: camera + Owner: USSR + Location: 88,46 + Actor1232: camera + Owner: USSR + Location: 34,46 + KirovPath1_1: waypoint + Owner: Neutral + Location: 82,50 + KirovPath1_2: waypoint + Owner: Neutral + Location: 88,63 + KirovPath1_3: waypoint + Owner: Neutral + Location: 61,87 + KirovPath1_4: waypoint + Owner: Neutral + Location: 44,80 + KirovPath2_1: waypoint + Owner: Neutral + Location: 33,21 + KirovPath2_2: waypoint + Owner: Neutral + Location: 10,44 + KirovPath2_3: waypoint + Owner: Neutral + Location: 17,68 + Actor942: e8 + Owner: USSR + Facing: 800 + Location: 79,29 + SubCell: 3 + Actor1231: afld + Owner: USSR + Location: 77,26 + Actor1162: e1 + Owner: USSR + Facing: 689 + Location: 77,25 + SubCell: 3 + Actor1233: afld + Owner: USSR + Location: 71,23 + Actor1234: afld + Owner: USSR + Location: 70,21 + MissileSilo: mslo + Owner: USSR + Location: 54,26 + ScriptTags: BrutalOnly + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|missions/main-campaign/ca26-capitulation/capitulation-rules.yaml, ca|rules/custom/coop-rules.yaml, capitulation-coop-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml, ca|missions/main-campaign/ca26-capitulation/capitulation-weapons.yaml diff --git a/mods/ca/missions/coop-campaign/ca27-emancipation-coop/emancipation-coop-rules.yaml b/mods/ca/missions/coop-campaign/ca27-emancipation-coop/emancipation-coop-rules.yaml new file mode 100644 index 0000000000..ffaafda0af --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca27-emancipation-coop/emancipation-coop-rules.yaml @@ -0,0 +1,15 @@ +World: + LuaScript: + Scripts: campaign.lua, coop.lua, ca|missions/main-campaign/ca27-emancipation/emancipation.lua, emancipation-coop.lua + ScriptLobbyDropdown@basesharing: + Values: + -0: + Default: 1 + Locked: True + LobbyMissionInfo@InitialObjectives: + Prefix: Initial Objectives + Text: • Liberate the five enslaved GDI bases by killing Masterminds.\n• Eliminate all Scrin forces.\n• Avoid killing enslaved GDI units. + +MDRN: + Attachable: + OnDetachBehavior: None diff --git a/mods/ca/missions/coop-campaign/ca27-emancipation-coop/emancipation-coop.lua b/mods/ca/missions/coop-campaign/ca27-emancipation-coop/emancipation-coop.lua new file mode 100644 index 0000000000..8176b1ae95 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca27-emancipation-coop/emancipation-coop.lua @@ -0,0 +1,68 @@ + +SetupPlayers = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Multi2 = Player.GetPlayer("Multi2") + Multi3 = Player.GetPlayer("Multi3") + Multi4 = Player.GetPlayer("Multi4") + Multi5 = Player.GetPlayer("Multi5") + GDI = Player.GetPlayer("GDI") + Scrin = Player.GetPlayer("Scrin") + GDISlaves = Player.GetPlayer("GDISlaves") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = Utils.Where({ Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 }, function(p) return p ~= nil end) + MissionEnemies = { Scrin } + SinglePlayerPlayer = GDI + CoopInit() +end + +AfterWorldLoaded = function() + local x = InitialSensor.Location.X + local facing = InitialSensor.Facing + InitialSensor.Destroy() + Utils.Do(MissionPlayers, function(p) + local extraSensor = Actor.Create("msar", true, { Owner = p, Location = CPos.New(x, 2), DeployState = 2, Facing = facing }) + x = x + 2 + end) +end + +AfterTick = function() + +end + +FreeSlaves = function(slaves) + local baseSlaves = Utils.Where(slaves, function(s) return IsBaseTransferActor(s) end) + local otherSlaves = Utils.Where(slaves, function(s) return s.HasProperty("Move") and not IsHarvester(s) end) + local firstActivePlayer = GetFirstActivePlayer() + + Utils.Do(baseSlaves, function(s) + if not s.IsDead then + s.Owner = firstActivePlayer + Trigger.AfterDelay(1, function() + if not s.IsDead then + if s.HasProperty("Move") then + s.Stop() + end + if s.HasProperty("FindResources") then + s.FindResources() + end + end + end) + end + end) + + Utils.Do(otherSlaves, function(s) + if not s.IsDead then + s.Owner = GDI + Trigger.AfterDelay(1, function() + if not s.IsDead then + if s.HasProperty("Move") then + s.Stop() + end + end + end) + end + end) + + CACoopQueueSyncer() +end diff --git a/mods/ca/missions/coop-campaign/ca27-emancipation-coop/map.bin b/mods/ca/missions/coop-campaign/ca27-emancipation-coop/map.bin new file mode 100644 index 0000000000..d6f482115b Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca27-emancipation-coop/map.bin differ diff --git a/mods/ca/missions/coop-campaign/ca27-emancipation-coop/map.png b/mods/ca/missions/coop-campaign/ca27-emancipation-coop/map.png new file mode 100644 index 0000000000..cde431e0c2 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca27-emancipation-coop/map.png differ diff --git a/mods/ca/missions/coop-campaign/ca27-emancipation-coop/map.yaml b/mods/ca/missions/coop-campaign/ca27-emancipation-coop/map.yaml new file mode 100644 index 0000000000..2313a80268 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca27-emancipation-coop/map.yaml @@ -0,0 +1,3767 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 27: Emancipation Co-op + +Author: Darkademic & Gandorques Hikla + +Tileset: TEMPERAT + +MapSize: 114,114 + +Bounds: 1,1,112,112 + +Visibility: Lobby + +Categories: Co-op Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: GDI, Scrin, GDISlaves, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + PlayerReference@GDI: + Name: GDI + Faction: arc + Color: F2CF74 + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, GDISlaves, Creeps + PlayerReference@Scrin: + Name: Scrin + Bot: campaign + Faction: scrin + Color: 7700FF + Allies: GDISlaves + Enemies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@GDISlaves: + Name: GDISlaves + Bot: campaign + Faction: arc + Color: D500E8 + Allies: Scrin + Enemies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: F2CF74 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, GDISlaves, Creeps + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: EA7816 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, GDISlaves, Creeps + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: 0B7310 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, GDISlaves, Creeps + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: 0077D6 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, GDISlaves, Creeps + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: 82C900 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, GDISlaves, Creeps + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: 775A12 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, GDISlaves, Creeps + +Actors: + Actor7: mtnk.drone + Owner: GDI + Facing: 512 + Location: 18,5 + Actor8: mtnk.drone + Owner: GDI + Facing: 512 + Location: 20,5 + Actor9: gdrn.tow + Owner: GDI + Facing: 512 + Location: 16,7 + Actor10: gdrn.tow + Owner: GDI + Facing: 512 + Location: 18,7 + Actor11: gdrn.tow + Owner: GDI + Facing: 512 + Location: 20,7 + Actor12: gdrn.tow + Owner: GDI + Facing: 512 + Location: 22,7 + Actor14: mdrn + Owner: GDI + SubCell: 3 + Facing: 512 + Location: 16,9 + Actor17: mdrn + Owner: GDI + SubCell: 3 + Facing: 512 + Location: 17,9 + Actor18: mdrn + Owner: GDI + SubCell: 3 + Facing: 512 + Location: 21,9 + Actor19: mdrn + Owner: GDI + SubCell: 3 + Facing: 512 + Location: 22,9 + Actor20: mdrn + Owner: GDI + SubCell: 3 + Facing: 512 + Location: 15,11 + Actor21: mdrn + Owner: GDI + SubCell: 3 + Facing: 512 + Location: 16,11 + Actor22: mdrn + Owner: GDI + SubCell: 3 + Facing: 512 + Location: 22,11 + Actor23: mdrn + Owner: GDI + SubCell: 3 + Facing: 512 + Location: 23,11 + Actor67: nuke + Location: 11,37 + Faction: reaper + Owner: GDISlaves + Actor68: nuke + Location: 13,37 + Faction: reaper + Owner: GDISlaves + Actor69: proc.td + Owner: GDISlaves + Location: 21,40 + FreeActor: True + Actor70: silo.td + Owner: GDISlaves + Location: 24,37 + Actor71: silo.td + Owner: GDISlaves + Location: 21,37 + Actor72: gtwr + Owner: GDISlaves + Location: 27,38 + Actor73: gtwr + Owner: GDISlaves + Location: 27,44 + Actor74: n1 + Owner: GDISlaves + Location: 28,43 + SubCell: 3 + Facing: 785 + Actor75: n1 + Owner: GDISlaves + SubCell: 3 + Location: 28,37 + Facing: 697 + Actor76: n1 + Owner: GDISlaves + SubCell: 3 + Location: 29,39 + Facing: 578 + Actor77: pyle + Owner: GDISlaves + Location: 12,41 + Actor78: mtnk + Owner: GDISlaves + Location: 29,41 + Facing: 777 + Actor79: s1 + SubCell: 3 + Location: 16,33 + Faction: arc + Facing: 174 + Owner: Scrin + Actor80: s1 + SubCell: 3 + Location: 13,34 + Faction: arc + Facing: 63 + Owner: Scrin + Mastermind1: mast + SubCell: 3 + Location: 17,40 + Faction: arc + Owner: Scrin + Facing: 95 + Actor83: split2 + Owner: Neutral + Location: 12,50 + Actor82: split2 + Owner: Neutral + Location: 22,54 + Actor84: seek + Owner: Scrin + Location: 15,34 + Facing: 95 + Actor85: sbag + Owner: GDISlaves + Location: 26,39 + Actor86: sbag + Owner: GDISlaves + Location: 26,38 + Actor87: sbag + Owner: GDISlaves + Location: 26,37 + Actor88: sbag + Owner: GDISlaves + Location: 26,36 + Actor89: sbag + Owner: GDISlaves + Location: 25,36 + Actor90: sbag + Owner: GDISlaves + Location: 23,36 + Actor91: sbag + Owner: GDISlaves + Location: 24,36 + Actor92: sbag + Owner: GDISlaves + Location: 22,36 + Actor93: sbag + Owner: GDISlaves + Location: 21,36 + Actor94: sbag + Owner: GDISlaves + Location: 20,36 + Actor54: sbag + Owner: GDISlaves + Location: 16,36 + Actor55: sbag + Owner: GDISlaves + Location: 15,36 + Actor56: sbag + Owner: GDISlaves + Location: 14,36 + Actor57: sbag + Owner: GDISlaves + Location: 13,36 + Actor58: sbag + Owner: GDISlaves + Location: 12,36 + Actor59: sbag + Owner: GDISlaves + Location: 11,36 + Actor60: sbag + Owner: GDISlaves + Location: 10,36 + Actor61: sbag + Owner: GDISlaves + Location: 10,37 + Actor62: sbag + Owner: GDISlaves + Location: 10,38 + Actor63: sbag + Owner: GDISlaves + Location: 10,39 + Actor64: sbag + Owner: GDISlaves + Location: 10,40 + Actor65: sbag + Owner: GDISlaves + Location: 10,41 + Actor95: sbag + Owner: GDISlaves + Location: 10,42 + Actor96: sbag + Owner: GDISlaves + Location: 10,43 + Actor97: sbag + Owner: GDISlaves + Location: 10,44 + Actor98: sbag + Owner: GDISlaves + Location: 10,45 + Actor99: sbag + Owner: GDISlaves + Location: 11,45 + Actor100: sbag + Owner: GDISlaves + Location: 12,45 + Actor101: sbag + Owner: GDISlaves + Location: 13,45 + Actor102: sbag + Owner: GDISlaves + Location: 14,45 + Actor103: sbag + Owner: GDISlaves + Location: 15,45 + Actor104: sbag + Owner: GDISlaves + Location: 16,45 + Actor66: sbag + Owner: GDISlaves + Location: 20,45 + Actor105: sbag + Owner: GDISlaves + Location: 21,45 + Actor106: sbag + Owner: GDISlaves + Location: 22,45 + Actor107: sbag + Owner: GDISlaves + Location: 23,45 + Actor108: sbag + Owner: GDISlaves + Location: 24,45 + Actor109: sbag + Owner: GDISlaves + Location: 25,45 + Actor110: sbag + Owner: GDISlaves + Location: 26,45 + Actor111: sbag + Owner: GDISlaves + Location: 26,44 + Actor112: sbag + Owner: GDISlaves + Location: 26,43 + Actor113: n1 + Owner: GDISlaves + SubCell: 3 + Location: 19,34 + Facing: 150 + Actor114: brik + Owner: GDISlaves + Location: 48,12 + Actor115: brik + Owner: GDISlaves + Location: 48,16 + Actor116: brik + Owner: GDISlaves + Location: 48,17 + Actor117: brik + Owner: GDISlaves + Location: 49,16 + Actor118: brik + Owner: GDISlaves + Location: 49,17 + Actor119: brik + Owner: GDISlaves + Location: 48,18 + Actor120: brik + Owner: GDISlaves + Location: 48,19 + Actor121: brik + Owner: GDISlaves + Location: 49,19 + Actor122: brik + Owner: GDISlaves + Location: 49,20 + Actor123: brik + Owner: GDISlaves + Location: 48,20 + Actor124: brik + Owner: GDISlaves + Location: 49,12 + Actor125: brik + Owner: GDISlaves + Location: 49,11 + Actor126: brik + Owner: GDISlaves + Location: 48,11 + Actor127: brik + Owner: GDISlaves + Location: 48,10 + Actor128: brik + Owner: GDISlaves + Location: 48,9 + Actor129: brik + Owner: GDISlaves + Location: 48,8 + Actor130: brik + Owner: GDISlaves + Location: 49,8 + Actor131: brik + Owner: GDISlaves + Location: 49,9 + Actor132: brik + Owner: GDISlaves + Location: 50,20 + Actor133: brik + Owner: GDISlaves + Location: 51,20 + Actor134: brik + Owner: GDISlaves + Location: 53,20 + Actor135: brik + Owner: GDISlaves + Location: 52,20 + Actor136: brik + Owner: GDISlaves + Location: 54,20 + Actor137: brik + Owner: GDISlaves + Location: 55,20 + Actor138: brik + Owner: GDISlaves + Location: 56,20 + Actor139: brik + Owner: GDISlaves + Location: 57,19 + Actor140: brik + Owner: GDISlaves + Location: 56,19 + Actor141: brik + Owner: GDISlaves + Location: 57,20 + Actor142: brik + Owner: GDISlaves + Location: 61,19 + Actor143: brik + Owner: GDISlaves + Location: 61,20 + Actor145: brik + Owner: GDISlaves + Location: 62,20 + Actor146: brik + Owner: GDISlaves + Location: 62,19 + Actor147: brik + Owner: GDISlaves + Location: 63,20 + Actor144: brik + Owner: GDISlaves + Location: 64,20 + Actor148: brik + Owner: GDISlaves + Location: 65,20 + Actor149: brik + Owner: GDISlaves + Location: 66,20 + Actor150: brik + Owner: GDISlaves + Location: 67,20 + Actor151: brik + Owner: GDISlaves + Location: 67,19 + Actor152: brik + Owner: GDISlaves + Location: 67,18 + Actor153: brik + Owner: GDISlaves + Location: 66,16 + Actor154: brik + Owner: GDISlaves + Location: 67,16 + Actor155: brik + Owner: GDISlaves + Location: 67,17 + Actor156: brik + Owner: GDISlaves + Location: 66,17 + Actor157: brik + Owner: GDISlaves + Location: 66,12 + Actor158: brik + Owner: GDISlaves + Location: 66,11 + Actor159: brik + Owner: GDISlaves + Location: 67,11 + Actor160: brik + Owner: GDISlaves + Location: 67,12 + Actor161: brik + Owner: GDISlaves + Location: 67,10 + Actor162: brik + Owner: GDISlaves + Location: 67,9 + Actor163: brik + Owner: GDISlaves + Location: 67,8 + Actor164: brik + Owner: GDISlaves + Location: 66,8 + Actor165: brik + Owner: GDISlaves + Location: 66,9 + Actor166: brik + Owner: GDISlaves + Location: 50,8 + Actor167: brik + Owner: GDISlaves + Location: 51,8 + Actor168: brik + Owner: GDISlaves + Location: 52,8 + Actor169: brik + Owner: GDISlaves + Location: 53,8 + Actor170: brik + Owner: GDISlaves + Location: 54,8 + Actor171: brik + Owner: GDISlaves + Location: 55,8 + Actor172: brik + Owner: GDISlaves + Location: 57,8 + Actor173: brik + Owner: GDISlaves + Location: 56,8 + Actor174: brik + Owner: GDISlaves + Location: 58,8 + Actor175: brik + Owner: GDISlaves + Location: 59,8 + Actor176: brik + Owner: GDISlaves + Location: 60,8 + Actor177: brik + Owner: GDISlaves + Location: 62,8 + Actor178: brik + Owner: GDISlaves + Location: 61,8 + Actor179: brik + Owner: GDISlaves + Location: 63,8 + Actor180: brik + Owner: GDISlaves + Location: 64,8 + Actor181: brik + Owner: GDISlaves + Location: 65,8 + Actor182: atwr + Owner: GDISlaves + Location: 49,18 + Actor183: atwr + Owner: GDISlaves + Location: 55,19 + Actor184: atwr + Owner: GDISlaves + Location: 63,19 + Actor185: atwr + Owner: GDISlaves + Location: 66,18 + Actor188: rep + Owner: GDISlaves + Location: 62,14 + Actor189: nuk2 + Owner: GDISlaves + Location: 51,9 + Actor190: nuk2 + Owner: GDISlaves + Location: 53,9 + Actor191: nuk2 + Owner: GDISlaves + Location: 55,9 + Actor193: proc.td + Owner: GDISlaves + Location: 62,9 + FreeActor: True + Actor192: silo.td + Owner: GDISlaves + Location: 59,9 + Actor194: silo.td + Owner: GDISlaves + Location: 58,10 + InitialSensor: msar + Owner: GDI + Location: 15,2 + Facing: 384 + DeployState: Deployed + Actor197: gtwr + Owner: GDISlaves + Location: 47,16 + Actor198: gtwr + Owner: GDISlaves + Location: 47,12 + Actor199: gtwr + Owner: GDISlaves + Location: 57,21 + Actor200: gtwr + Owner: GDISlaves + Location: 61,21 + Actor201: gtwr + Owner: GDISlaves + Location: 68,16 + Actor202: gtwr + Owner: GDISlaves + Location: 68,12 + Actor204: patr + Owner: GDISlaves + Location: 103,4 + Actor205: chain + Owner: GDISlaves + Location: 101,5 + Actor206: chain + Owner: GDISlaves + Location: 101,4 + Actor207: chain + Owner: GDISlaves + Location: 101,3 + Actor208: chain + Owner: GDISlaves + Location: 103,3 + Actor209: chain + Owner: GDISlaves + Location: 102,3 + Actor210: chain + Owner: GDISlaves + Location: 104,3 + Actor211: chain + Owner: GDISlaves + Location: 105,3 + Actor212: chain + Owner: GDISlaves + Location: 106,3 + Actor213: chain + Owner: GDISlaves + Location: 106,4 + Actor214: chain + Owner: GDISlaves + Location: 106,5 + Actor215: chain + Owner: GDISlaves + Location: 106,6 + Actor216: chain + Owner: GDISlaves + Location: 101,6 + Actor217: chain + Owner: GDISlaves + Location: 101,7 + Actor218: chain + Owner: GDISlaves + Location: 102,7 + Actor219: chain + Owner: GDISlaves + Location: 105,7 + Actor220: chain + Owner: GDISlaves + Location: 106,7 + Actor221: gtwr + Owner: GDISlaves + Location: 103,11 + Actor222: gtwr + Owner: GDISlaves + Location: 92,6 + Actor223: afld.gdi + Owner: GDISlaves + Location: 97,4 + Actor224: nuk2 + Owner: GDISlaves + Location: 108,3 + Actor225: nuk2 + Owner: GDISlaves + Location: 110,4 + Actor226: chain + Owner: GDISlaves + Location: 108,1 + Actor227: chain + Owner: GDISlaves + Location: 109,1 + Actor228: chain + Owner: GDISlaves + Location: 110,1 + Actor229: chain + Owner: GDISlaves + Location: 111,1 + Actor230: chain + Owner: GDISlaves + Location: 112,1 + Actor231: chain + Owner: GDISlaves + Location: 112,2 + Actor232: chain + Owner: GDISlaves + Location: 107,1 + Actor233: chain + Owner: GDISlaves + Location: 112,3 + Actor234: chain + Owner: GDISlaves + Location: 112,4 + Actor235: chain + Owner: GDISlaves + Location: 112,5 + Actor236: chain + Owner: GDISlaves + Location: 112,6 + Actor237: chain + Owner: GDISlaves + Location: 112,7 + Actor238: chain + Owner: GDISlaves + Location: 111,7 + Actor239: chain + Owner: GDISlaves + Location: 106,1 + Actor240: chain + Owner: GDISlaves + Location: 105,1 + Actor241: chain + Owner: GDISlaves + Location: 104,1 + Actor242: chain + Owner: GDISlaves + Location: 103,1 + Actor243: chain + Owner: GDISlaves + Location: 102,1 + Actor244: chain + Owner: GDISlaves + Location: 101,1 + Actor245: chain + Owner: GDISlaves + Location: 100,1 + Actor246: chain + Owner: GDISlaves + Location: 95,5 + Actor247: chain + Owner: GDISlaves + Location: 95,4 + Actor248: chain + Owner: GDISlaves + Location: 95,3 + Actor249: chain + Owner: GDISlaves + Location: 95,2 + Actor250: chain + Owner: GDISlaves + Location: 95,1 + Actor251: chain + Owner: GDISlaves + Location: 96,1 + Actor252: chain + Owner: GDISlaves + Location: 97,1 + Actor253: chain + Owner: GDISlaves + Location: 98,1 + Actor254: chain + Owner: GDISlaves + Location: 99,1 + Actor255: chain + Owner: GDISlaves + Location: 110,7 + Actor256: chain + Owner: GDISlaves + Location: 95,6 + Actor257: chain + Owner: GDISlaves + Location: 95,7 + Actor258: chain + Owner: GDISlaves + Location: 96,7 + Actor259: oilb + Owner: GDISlaves + Location: 92,2 + Actor260: n2 + Owner: GDISlaves + SubCell: 3 + Location: 105,11 + Facing: 721 + Actor261: n2 + Owner: GDISlaves + SubCell: 3 + Location: 107,10 + Facing: 563 + Actor262: n2 + Owner: GDISlaves + SubCell: 3 + Location: 93,7 + Facing: 523 + Actor263: n1 + Owner: GDISlaves + Facing: 384 + Location: 105,11 + SubCell: 1 + Actor264: n1 + Owner: GDISlaves + Facing: 384 + SubCell: 3 + Location: 102,11 + Actor265: n1 + Owner: GDISlaves + Facing: 384 + Location: 91,6 + SubCell: 3 + Mastermind5: mast + Owner: Scrin + SubCell: 3 + Location: 105,5 + Facing: 384 + Actor267: seek + Owner: Scrin + Facing: 384 + Location: 105,15 + Actor268: seek + Owner: Scrin + Facing: 384 + Location: 97,12 + Actor269: seek + Owner: Scrin + Facing: 384 + Location: 90,9 + Actor270: intl + Owner: Scrin + Facing: 384 + Location: 98,14 + Actor271: afld.gdi + Owner: GDISlaves + Location: 90,33 + Actor272: afld.gdi + Owner: GDISlaves + Location: 90,36 + Actor273: afld.gdi + Owner: GDISlaves + Location: 90,30 + Actor274: rep + Owner: GDISlaves + Location: 94,32 + Actor275: chain + Owner: GDISlaves + Location: 88,29 + Actor276: chain + Owner: GDISlaves + Location: 88,31 + Actor277: chain + Owner: GDISlaves + Location: 88,30 + Actor278: chain + Owner: GDISlaves + Location: 88,28 + Actor279: chain + Owner: GDISlaves + Location: 90,28 + Actor280: chain + Owner: GDISlaves + Location: 89,28 + Actor281: chain + Owner: GDISlaves + Location: 92,28 + Actor282: chain + Owner: GDISlaves + Location: 91,28 + Actor283: chain + Owner: GDISlaves + Location: 93,28 + Actor284: chain + Owner: GDISlaves + Location: 88,32 + Actor285: chain + Owner: GDISlaves + Location: 88,34 + Actor286: chain + Owner: GDISlaves + Location: 88,33 + Actor287: chain + Owner: GDISlaves + Location: 88,35 + Actor288: chain + Owner: GDISlaves + Location: 88,36 + Actor289: chain + Owner: GDISlaves + Location: 88,37 + Actor290: chain + Owner: GDISlaves + Location: 88,38 + Actor291: chain + Owner: GDISlaves + Location: 89,39 + Actor292: chain + Owner: GDISlaves + Location: 88,39 + Actor293: chain + Owner: GDISlaves + Location: 91,39 + Actor294: chain + Owner: GDISlaves + Location: 90,39 + Actor295: chain + Owner: GDISlaves + Location: 92,39 + Actor296: chain + Owner: GDISlaves + Location: 93,39 + Actor297: chain + Owner: GDISlaves + Location: 97,28 + Actor298: chain + Owner: GDISlaves + Location: 98,28 + Actor299: chain + Owner: GDISlaves + Location: 98,29 + Actor300: chain + Owner: GDISlaves + Location: 98,31 + Actor301: chain + Owner: GDISlaves + Location: 98,30 + Actor302: chain + Owner: GDISlaves + Location: 98,32 + Actor303: chain + Owner: GDISlaves + Location: 98,33 + Actor304: chain + Owner: GDISlaves + Location: 98,34 + Actor305: chain + Owner: GDISlaves + Location: 98,35 + Actor306: chain + Owner: GDISlaves + Location: 98,36 + Actor307: chain + Owner: GDISlaves + Location: 98,37 + Actor308: chain + Owner: GDISlaves + Location: 98,38 + Actor309: chain + Owner: GDISlaves + Location: 98,39 + Actor310: chain + Owner: GDISlaves + Location: 97,39 + Actor311: brik + Owner: GDISlaves + Location: 93,41 + Actor312: brik + Owner: GDISlaves + Location: 93,42 + Actor313: brik + Owner: GDISlaves + Location: 92,41 + Actor314: brik + Owner: GDISlaves + Location: 92,42 + Actor315: brik + Owner: GDISlaves + Location: 91,42 + Actor316: brik + Owner: GDISlaves + Location: 90,42 + Actor317: brik + Owner: GDISlaves + Location: 89,42 + Actor318: brik + Owner: GDISlaves + Location: 88,42 + Actor319: brik + Owner: GDISlaves + Location: 87,42 + Actor320: brik + Owner: GDISlaves + Location: 86,42 + Actor321: brik + Owner: GDISlaves + Location: 86,40 + Actor322: brik + Owner: GDISlaves + Location: 86,41 + Actor323: brik + Owner: GDISlaves + Location: 86,39 + Actor324: brik + Owner: GDISlaves + Location: 86,38 + Actor325: brik + Owner: GDISlaves + Location: 86,37 + Actor326: brik + Owner: GDISlaves + Location: 85,37 + Actor333: brik + Owner: GDISlaves + Location: 85,35 + Actor334: brik + Owner: GDISlaves + Location: 86,35 + Actor330: atwr + Owner: GDISlaves + Location: 86,36 + Actor331: brik + Owner: GDISlaves + Location: 85,36 + Actor327: atwr + Owner: GDISlaves + Location: 91,41 + Actor328: brik + Owner: GDISlaves + Location: 86,34 + Actor329: brik + Owner: GDISlaves + Location: 86,33 + Actor335: brik + Owner: GDISlaves + Location: 86,31 + Actor336: brik + Owner: GDISlaves + Location: 86,30 + Actor337: brik + Owner: GDISlaves + Location: 86,29 + Actor338: brik + Owner: GDISlaves + Location: 86,28 + Actor339: brik + Owner: GDISlaves + Location: 86,27 + Actor340: brik + Owner: GDISlaves + Location: 86,26 + Actor341: brik + Owner: GDISlaves + Location: 87,26 + Actor342: brik + Owner: GDISlaves + Location: 88,26 + Actor343: brik + Owner: GDISlaves + Location: 89,26 + Actor344: brik + Owner: GDISlaves + Location: 90,26 + Actor345: brik + Owner: GDISlaves + Location: 91,26 + Actor346: brik + Owner: GDISlaves + Location: 93,26 + Actor347: brik + Owner: GDISlaves + Location: 92,26 + Actor348: brik + Owner: GDISlaves + Location: 94,26 + Actor349: brik + Owner: GDISlaves + Location: 96,26 + Actor350: brik + Owner: GDISlaves + Location: 97,26 + Actor351: brik + Owner: GDISlaves + Location: 95,26 + Actor352: brik + Owner: GDISlaves + Location: 97,25 + Actor353: brik + Owner: GDISlaves + Location: 96,25 + Actor354: brik + Owner: GDISlaves + Location: 97,41 + Actor355: brik + Owner: GDISlaves + Location: 97,42 + Actor356: brik + Owner: GDISlaves + Location: 98,41 + Actor357: brik + Owner: GDISlaves + Location: 98,42 + Actor358: brik + Owner: GDISlaves + Location: 99,42 + Actor359: brik + Owner: GDISlaves + Location: 100,42 + Actor360: brik + Owner: GDISlaves + Location: 100,41 + Actor361: brik + Owner: GDISlaves + Location: 101,41 + Actor362: brik + Owner: GDISlaves + Location: 101,42 + Actor363: brik + Owner: GDISlaves + Location: 101,40 + Actor364: brik + Owner: GDISlaves + Location: 101,39 + Actor365: brik + Owner: GDISlaves + Location: 102,39 + Actor366: brik + Owner: GDISlaves + Location: 103,39 + Actor367: brik + Owner: GDISlaves + Location: 103,38 + Actor368: brik + Owner: GDISlaves + Location: 102,38 + Actor369: brik + Owner: GDISlaves + Location: 107,38 + Actor370: brik + Owner: GDISlaves + Location: 107,39 + Actor371: brik + Owner: GDISlaves + Location: 108,38 + Actor372: brik + Owner: GDISlaves + Location: 108,39 + Actor373: brik + Owner: GDISlaves + Location: 109,39 + Actor374: brik + Owner: GDISlaves + Location: 110,39 + Actor375: brik + Owner: GDISlaves + Location: 111,39 + Actor376: brik + Owner: GDISlaves + Location: 111,38 + Actor377: brik + Owner: GDISlaves + Location: 110,38 + Actor378: brik + Owner: GDISlaves + Location: 85,33 + Actor379: brik + Owner: GDISlaves + Location: 85,32 + Actor380: brik + Owner: GDISlaves + Location: 85,31 + Actor381: atwr + Owner: GDISlaves + Location: 86,32 + Actor382: atwr + Owner: GDISlaves + Location: 99,41 + Actor383: atwr + Owner: GDISlaves + Location: 109,38 + Actor384: proc.td + Owner: GDISlaves + Location: 100,33 + Actor385: silo.td + Owner: GDISlaves + Location: 100,31 + Actor386: silo.td + Owner: GDISlaves + Location: 101,30 + Actor387: pyle + Owner: GDISlaves + Location: 105,32 + Actor388: cram + Owner: GDISlaves + Location: 87,41 + Actor389: cram + Owner: GDISlaves + Location: 101,38 + Actor390: brik + Owner: GDISlaves + Location: 112,39 + Actor391: brik + Owner: GDISlaves + Location: 112,38 + Actor392: brik + Owner: GDISlaves + Location: 112,37 + Actor393: brik + Owner: GDISlaves + Location: 112,35 + Actor394: brik + Owner: GDISlaves + Location: 112,36 + Actor395: brik + Owner: GDISlaves + Location: 112,34 + Actor396: brik + Owner: GDISlaves + Location: 112,33 + Actor397: brik + Owner: GDISlaves + Location: 112,32 + Actor398: brik + Owner: GDISlaves + Location: 112,31 + Actor399: brik + Owner: GDISlaves + Location: 112,29 + Actor400: brik + Owner: GDISlaves + Location: 112,27 + Actor401: brik + Owner: GDISlaves + Location: 112,26 + Actor402: brik + Owner: GDISlaves + Location: 112,25 + Actor403: brik + Owner: GDISlaves + Location: 112,28 + Actor404: brik + Owner: GDISlaves + Location: 111,25 + Actor405: brik + Owner: GDISlaves + Location: 111,26 + Actor406: brik + Owner: GDISlaves + Location: 112,30 + Actor407: nuk2 + Owner: GDISlaves + Location: 110,27 + Actor408: nuk2 + Owner: GDISlaves + Location: 110,30 + Actor409: nuk2 + Owner: GDISlaves + Location: 110,33 + Actor410: gtwr + Owner: GDISlaves + Location: 93,43 + Actor411: gtwr + Owner: GDISlaves + Location: 97,43 + Actor412: gtwr + Owner: GDISlaves + Location: 103,40 + Actor413: gtwr + Owner: GDISlaves + Location: 107,40 + Actor557: swal + Owner: Scrin + Location: 22,112 + Actor558: swal + Owner: Scrin + Location: 23,112 + Actor559: swal + Owner: Scrin + Location: 25,112 + Actor560: swal + Owner: Scrin + Location: 24,112 + Actor561: swal + Owner: Scrin + Location: 26,112 + Actor562: swal + Owner: Scrin + Location: 27,112 + Actor563: swal + Owner: Scrin + Location: 28,112 + Actor564: swal + Owner: Scrin + Location: 29,112 + Actor575: swal + Owner: Scrin + Location: 19,101 + Actor576: swal + Owner: Scrin + Location: 19,100 + Actor577: swal + Owner: Scrin + Location: 20,100 + Actor578: swal + Owner: Scrin + Location: 20,101 + Actor579: swal + Owner: Scrin + Location: 20,99 + Actor580: swal + Owner: Scrin + Location: 21,99 + Actor581: swal + Owner: Scrin + Location: 21,98 + Actor582: swal + Owner: Scrin + Location: 21,97 + Actor583: swal + Owner: Scrin + Location: 21,96 + Actor584: swal + Owner: Scrin + Location: 22,96 + Actor585: swal + Owner: Scrin + Location: 23,96 + Actor594: swal + Owner: Scrin + Location: 31,94 + Actor595: swal + Owner: Scrin + Location: 31,95 + Actor596: swal + Owner: Scrin + Location: 32,94 + Actor597: swal + Owner: Scrin + Location: 32,95 + Actor598: swal + Owner: Scrin + Location: 33,95 + Actor599: swal + Owner: Scrin + Location: 33,96 + Actor600: swal + Owner: Scrin + Location: 34,96 + Actor601: swal + Owner: Scrin + Location: 36,96 + Actor602: swal + Owner: Scrin + Location: 35,96 + Actor603: swal + Owner: Scrin + Location: 38,96 + Actor604: swal + Owner: Scrin + Location: 37,96 + Actor605: swal + Owner: Scrin + Location: 39,96 + Actor606: swal + Owner: Scrin + Location: 40,96 + Actor607: swal + Owner: Scrin + Location: 41,96 + Actor608: swal + Owner: Scrin + Location: 43,96 + Actor609: swal + Owner: Scrin + Location: 42,96 + Actor610: swal + Owner: Scrin + Location: 43,97 + Actor611: swal + Owner: Scrin + Location: 43,98 + Actor612: swal + Owner: Scrin + Location: 43,99 + Actor613: swal + Owner: Scrin + Location: 44,99 + Actor614: swal + Owner: Scrin + Location: 44,100 + Actor615: swal + Owner: Scrin + Location: 45,100 + Actor616: swal + Owner: Scrin + Location: 45,101 + Actor617: swal + Owner: Scrin + Location: 44,101 + Actor628: swal + Owner: Scrin + Location: 43,112 + Actor630: swal + Owner: Scrin + Location: 42,112 + Actor631: swal + Owner: Scrin + Location: 30,112 + Actor632: swal + Owner: Scrin + Location: 32,112 + Actor633: swal + Owner: Scrin + Location: 31,112 + Actor634: swal + Owner: Scrin + Location: 33,112 + Actor635: swal + Owner: Scrin + Location: 34,112 + Actor636: swal + Owner: Scrin + Location: 35,112 + Actor637: swal + Owner: Scrin + Location: 36,112 + Actor638: swal + Owner: Scrin + Location: 37,112 + Actor639: swal + Owner: Scrin + Location: 38,112 + Actor640: swal + Owner: Scrin + Location: 39,112 + Actor641: swal + Owner: Scrin + Location: 40,112 + Actor642: swal + Owner: Scrin + Location: 41,112 + Actor643: proc.scrin + Owner: Scrin + Location: 23,98 + Actor644: scrt + Owner: Scrin + Location: 40,109 + Actor645: wsph + Owner: Scrin + Location: 39,97 + Actor646: wsph + Owner: Scrin + Location: 35,97 + Actor647: nerv + Owner: Scrin + Location: 37,108 + Actor648: port + Owner: Scrin + Location: 30,100 + Actor650: mani + Owner: Scrin + Location: 31,110 + Actor652: rea2 + Owner: Scrin + Location: 25,109 + Actor653: rea2 + Owner: Scrin + Location: 28,109 + Actor654: rea2 + Owner: Scrin + Location: 25,105 + Actor655: rea2 + Owner: Scrin + Location: 28,105 + Actor656: rea2 + Owner: Scrin + Location: 34,108 + Actor658: scol + Owner: Scrin + Location: 43,100 + Actor659: scol + Owner: Scrin + Location: 32,96 + Actor661: scol + Owner: Scrin + Location: 21,100 + Actor664: ptur + Owner: Scrin + Location: 18,101 + Actor666: ptur + Owner: Scrin + Location: 31,93 + Actor667: ptur + Owner: Scrin + Location: 46,101 + Actor669: shar + Owner: Scrin + Location: 42,97 + Actor670: shar + Owner: Scrin + Location: 22,97 + Actor671: shar + Owner: Scrin + Location: 41,106 + Actor672: shar + Owner: Scrin + Location: 23,106 + Actor676: grav + Owner: Scrin + Location: 37,102 + Actor677: grav + Owner: Scrin + Location: 33,104 + Actor649: port + Owner: Scrin + Location: 27,98 + Actor673: silo.scrin + Owner: Scrin + Location: 26,103 + Actor674: silo.scrin + Owner: Scrin + Location: 27,102 + Actor675: silo.scrin + Owner: Scrin + Location: 28,103 + Actor679: srep + Owner: Scrin + Location: 37,105 + Actor501: gtwr + Owner: GDISlaves + Location: 81,65 + Actor502: gtwr + Owner: GDISlaves + Location: 85,65 + Actor503: brik + Owner: GDISlaves + Location: 77,66 + Actor504: brik + Owner: GDISlaves + Location: 78,66 + Actor505: brik + Owner: GDISlaves + Location: 79,66 + Actor506: brik + Owner: GDISlaves + Location: 80,66 + Actor507: brik + Owner: GDISlaves + Location: 81,66 + Actor508: brik + Owner: GDISlaves + Location: 85,66 + Actor509: brik + Owner: GDISlaves + Location: 86,66 + Actor510: brik + Owner: GDISlaves + Location: 87,66 + Actor511: brik + Owner: GDISlaves + Location: 88,66 + Actor512: brik + Owner: GDISlaves + Location: 89,66 + Actor513: brik + Owner: GDISlaves + Location: 77,67 + Actor514: brik + Owner: GDISlaves + Location: 78,67 + Actor515: atwr + Owner: GDISlaves + Location: 79,67 + Actor516: brik + Owner: GDISlaves + Location: 80,67 + Actor517: brik + Owner: GDISlaves + Location: 81,67 + Actor518: brik + Owner: GDISlaves + Location: 85,67 + Actor520: brik + Owner: GDISlaves + Location: 86,67 + Actor521: atwr + Owner: GDISlaves + Location: 87,67 + Actor522: brik + Owner: GDISlaves + Location: 88,67 + Actor523: brik + Owner: GDISlaves + Location: 89,67 + Actor524: brik + Owner: GDISlaves + Location: 77,69 + Actor525: brik + Owner: GDISlaves + Location: 78,69 + Actor526: atwr + Owner: GDISlaves + Location: 79,69 + Actor527: brik + Owner: GDISlaves + Location: 80,69 + Actor528: brik + Owner: GDISlaves + Location: 81,69 + Actor529: brik + Owner: GDISlaves + Location: 85,69 + Actor530: brik + Owner: GDISlaves + Location: 86,69 + Actor531: atwr + Owner: GDISlaves + Location: 87,69 + Actor532: brik + Owner: GDISlaves + Location: 88,69 + Actor533: brik + Owner: GDISlaves + Location: 89,69 + Actor534: brik + Owner: GDISlaves + Location: 70,70 + Actor535: brik + Owner: GDISlaves + Location: 71,70 + Actor536: brik + Owner: GDISlaves + Location: 72,70 + Actor537: brik + Owner: GDISlaves + Location: 73,70 + Actor538: brik + Owner: GDISlaves + Location: 74,70 + Actor539: brik + Owner: GDISlaves + Location: 75,70 + Actor540: brik + Owner: GDISlaves + Location: 76,70 + Actor541: brik + Owner: GDISlaves + Location: 77,70 + Actor542: brik + Owner: GDISlaves + Location: 78,70 + Actor543: brik + Owner: GDISlaves + Location: 79,70 + Actor544: brik + Owner: GDISlaves + Location: 80,70 + Actor545: brik + Owner: GDISlaves + Location: 81,70 + Actor546: brik + Owner: GDISlaves + Location: 85,70 + Actor547: brik + Owner: GDISlaves + Location: 86,70 + Actor548: brik + Owner: GDISlaves + Location: 87,70 + Actor549: brik + Owner: GDISlaves + Location: 88,70 + Actor550: brik + Owner: GDISlaves + Location: 89,70 + Actor551: brik + Owner: GDISlaves + Location: 90,70 + Actor552: brik + Owner: GDISlaves + Location: 91,70 + Actor553: brik + Owner: GDISlaves + Location: 92,70 + Actor554: brik + Owner: GDISlaves + Location: 93,70 + Actor555: brik + Owner: GDISlaves + Location: 70,71 + Actor678: weap.td + Owner: GDISlaves + Location: 73,71 + Actor680: brik + Owner: GDISlaves + Location: 93,71 + Actor681: brik + Owner: GDISlaves + Location: 70,72 + Actor682: pyle + Owner: GDISlaves + Location: 80,72 + Actor683: pyle + Owner: GDISlaves + Location: 88,72 + Actor684: brik + Owner: GDISlaves + Location: 93,72 + Actor685: brik + Owner: GDISlaves + Location: 70,73 + Actor686: atwr + Owner: GDISlaves + Location: 71,73 + Actor687: atwr + Owner: GDISlaves + Location: 92,73 + Actor688: brik + Owner: GDISlaves + Location: 93,73 + Actor689: brik + Owner: GDISlaves + Location: 70,74 + Actor690: brik + Owner: GDISlaves + Location: 71,74 + Actor691: rep + Owner: GDISlaves + Location: 76,74 + Actor692: brik + Owner: GDISlaves + Location: 92,74 + Actor693: brik + Owner: GDISlaves + Location: 93,74 + Actor694: gtwr + Owner: GDISlaves + Location: 69,75 + Actor695: brik + Owner: GDISlaves + Location: 70,75 + Actor696: brik + Owner: GDISlaves + Location: 71,75 + Actor697: brik + Owner: GDISlaves + Location: 92,75 + Actor698: brik + Owner: GDISlaves + Location: 93,75 + Actor699: gtwr + Owner: GDISlaves + Location: 94,75 + Actor700: gtek + Owner: GDISlaves + Location: 81,76 + Actor702: nuk2 + Owner: GDISlaves + Location: 88,77 + Actor703: proc.td + Owner: GDISlaves + Location: 73,78 + Actor704: nuk2 + Owner: GDISlaves + Location: 78,78 + Actor705: gtwr + Owner: GDISlaves + Location: 69,79 + Actor706: brik + Owner: GDISlaves + Location: 70,79 + Actor707: brik + Owner: GDISlaves + Location: 71,79 + Actor708: brik + Owner: GDISlaves + Location: 92,79 + Actor709: brik + Owner: GDISlaves + Location: 93,79 + Actor710: gtwr + Owner: GDISlaves + Location: 94,79 + Actor711: brik + Owner: GDISlaves + Location: 70,80 + Actor712: brik + Owner: GDISlaves + Location: 71,80 + Actor713: brik + Owner: GDISlaves + Location: 92,80 + Actor714: brik + Owner: GDISlaves + Location: 93,80 + Actor715: brik + Owner: GDISlaves + Location: 70,81 + Actor716: atwr + Owner: GDISlaves + Location: 71,81 + Actor721: atwr + Owner: GDISlaves + Location: 92,81 + Actor722: brik + Owner: GDISlaves + Location: 93,81 + Actor723: brik + Owner: GDISlaves + Location: 70,82 + Actor724: brik + Owner: GDISlaves + Location: 93,82 + Actor725: brik + Owner: GDISlaves + Location: 70,83 + Actor726: atwr + Owner: GDISlaves + Location: 74,83 + Actor727: brik + Owner: GDISlaves + Location: 75,83 + Actor728: brik + Owner: GDISlaves + Location: 76,83 + Actor729: brik + Owner: GDISlaves + Location: 80,83 + Actor730: brik + Owner: GDISlaves + Location: 81,83 + Actor731: atwr + Owner: GDISlaves + Location: 82,83 + Actor732: brik + Owner: GDISlaves + Location: 93,83 + Actor733: brik + Owner: GDISlaves + Location: 70,84 + Actor734: brik + Owner: GDISlaves + Location: 71,84 + Actor735: brik + Owner: GDISlaves + Location: 72,84 + Actor736: brik + Owner: GDISlaves + Location: 73,84 + Actor737: brik + Owner: GDISlaves + Location: 74,84 + Actor738: brik + Owner: GDISlaves + Location: 75,84 + Actor739: brik + Owner: GDISlaves + Location: 76,84 + Actor740: brik + Owner: GDISlaves + Location: 80,84 + Actor741: brik + Owner: GDISlaves + Location: 81,84 + Actor742: brik + Owner: GDISlaves + Location: 82,84 + Actor743: brik + Owner: GDISlaves + Location: 83,84 + Actor744: brik + Owner: GDISlaves + Location: 84,84 + Actor745: brik + Owner: GDISlaves + Location: 85,84 + Actor746: brik + Owner: GDISlaves + Location: 86,84 + Actor747: brik + Owner: GDISlaves + Location: 87,84 + Actor748: brik + Owner: GDISlaves + Location: 88,84 + Actor749: brik + Owner: GDISlaves + Location: 89,84 + Actor750: brik + Owner: GDISlaves + Location: 90,84 + Actor751: brik + Owner: GDISlaves + Location: 91,84 + Actor752: brik + Owner: GDISlaves + Location: 92,84 + Actor753: brik + Owner: GDISlaves + Location: 93,84 + Actor754: gtwr + Owner: GDISlaves + Location: 76,85 + Actor755: gtwr + Owner: GDISlaves + Location: 80,85 + Mastermind4: mast + Owner: Scrin + SubCell: 3 + Location: 84,79 + Facing: 618 + Actor757: cram + Owner: GDISlaves + Location: 87,27 + Actor758: cram + Owner: GDISlaves + Location: 110,25 + Actor759: cram + Owner: GDISlaves + Location: 49,10 + Actor760: cram + Owner: GDISlaves + Location: 66,10 + Actor761: cram + Owner: GDISlaves + Location: 25,44 + Actor762: scol + Owner: Scrin + Location: 44,63 + Actor763: scol + Owner: Scrin + Location: 51,52 + Actor764: scol + Owner: Scrin + Location: 54,44 + Actor765: shar + Owner: Scrin + Location: 53,48 + Actor660: ptur + Owner: Scrin + Location: 27,93 + Actor665: swal + Owner: Scrin + Location: 26,94 + Actor766: swal + Owner: Scrin + Location: 27,94 + Actor767: swal + Owner: Scrin + Location: 25,95 + Actor768: swal + Owner: Scrin + Location: 26,95 + Actor769: swal + Owner: Scrin + Location: 27,95 + Actor770: swal + Owner: Scrin + Location: 24,96 + Actor771: swal + Owner: Scrin + Location: 25,96 + Actor772: scol + Owner: Scrin + Location: 26,96 + Actor657: swal + Owner: Scrin + Location: 44,105 + Actor668: swal + Owner: Scrin + Location: 45,105 + Actor773: scol + Owner: Scrin + Location: 43,106 + Actor774: swal + Owner: Scrin + Location: 44,106 + Actor775: swal + Owner: Scrin + Location: 45,106 + Actor776: ptur + Owner: Scrin + Location: 46,106 + Actor778: swal + Owner: Scrin + Location: 44,107 + Actor662: ptur + Owner: Scrin + Location: 18,105 + Actor663: swal + Owner: Scrin + Location: 19,105 + Actor780: swal + Owner: Scrin + Location: 20,105 + Actor781: swal + Owner: Scrin + Location: 19,106 + Actor782: swal + Owner: Scrin + Location: 20,106 + Actor783: scol + Owner: Scrin + Location: 21,106 + Actor784: swal + Owner: Scrin + Location: 20,107 + Actor788: split2 + Owner: Neutral + Location: 66,4 + Actor789: split2 + Owner: Neutral + Location: 72,8 + Actor790: split2 + Owner: Neutral + Location: 73,16 + Actor791: split2 + Owner: Neutral + Location: 110,45 + Actor792: split2 + Owner: Neutral + Location: 104,50 + Actor793: split2 + Owner: Neutral + Location: 73,89 + Actor794: split2 + Owner: Neutral + Location: 71,95 + Actor795: split2 + Owner: Neutral + Location: 13,95 + Actor796: split2 + Owner: Neutral + Location: 20,92 + Actor797: split2 + Owner: Neutral + Location: 13,109 + Actor798: split2 + Owner: Neutral + Location: 109,81 + Actor799: split2 + Owner: Neutral + Location: 103,83 + Actor800: split2 + Owner: Neutral + Location: 47,45 + Actor801: n1 + Owner: GDISlaves + SubCell: 3 + Location: 19,40 + Facing: 0 + Actor802: n1 + Owner: GDISlaves + SubCell: 3 + Location: 16,41 + Facing: 384 + Actor803: msam + Owner: GDISlaves + Location: 77,71 + Facing: 0 + Actor805: msam + Owner: GDISlaves + Facing: 384 + Location: 72,83 + Actor804: htnk + Owner: GDISlaves + Location: 69,77 + Facing: 256 + Actor807: htnk + Owner: GDISlaves + Location: 94,77 + Facing: 768 + Actor808: htnk + Owner: GDISlaves + Location: 78,85 + Facing: 512 + Actor809: mtnk + Owner: GDISlaves + Location: 74,74 + Facing: 384 + Actor810: disr + Owner: GDISlaves + Location: 81,80 + Facing: 507 + Actor813: titn + Owner: GDISlaves + Facing: 384 + Location: 74,76 + Actor814: titn + Owner: GDISlaves + Facing: 507 + Location: 82,86 + Actor811: hmmv + Owner: GDISlaves + Facing: 384 + Location: 95,82 + Actor812: n1 + Owner: GDISlaves + Facing: 384 + SubCell: 3 + Location: 94,84 + Actor815: n1 + Owner: GDISlaves + SubCell: 3 + Location: 94,74 + Facing: 840 + Actor816: n1 + Owner: GDISlaves + SubCell: 3 + Location: 95,73 + Facing: 848 + Actor817: n1 + Owner: GDISlaves + SubCell: 3 + Location: 96,75 + Facing: 737 + Actor818: n1 + Owner: GDISlaves + Facing: 384 + Location: 80,65 + SubCell: 3 + Actor819: n1 + Owner: GDISlaves + Facing: 384 + Location: 76,68 + SubCell: 3 + Actor820: n1 + Owner: GDISlaves + Facing: 384 + Location: 76,68 + SubCell: 1 + Actor821: n1 + Owner: GDISlaves + Facing: 384 + SubCell: 3 + Location: 86,64 + Actor822: n1 + Owner: GDISlaves + Facing: 384 + Location: 86,64 + SubCell: 1 + Actor823: n1 + Owner: GDISlaves + Facing: 384 + SubCell: 3 + Location: 89,65 + Actor824: n1 + Owner: GDISlaves + Facing: 384 + SubCell: 3 + Location: 68,74 + Actor825: n1 + Owner: GDISlaves + Facing: 384 + Location: 69,74 + SubCell: 3 + Actor826: n1 + Owner: GDISlaves + Facing: 384 + SubCell: 3 + Location: 67,80 + Actor827: n1 + Owner: GDISlaves + SubCell: 3 + Location: 80,75 + Facing: 563 + Actor828: n1 + Owner: GDISlaves + Location: 79,74 + SubCell: 3 + Facing: 563 + Actor829: n1 + Owner: GDISlaves + Facing: 384 + Location: 79,74 + SubCell: 1 + Actor830: n1 + Owner: GDISlaves + SubCell: 3 + Location: 83,74 + Facing: 689 + Actor831: n1 + Owner: GDISlaves + SubCell: 3 + Location: 82,72 + Facing: 753 + Actor832: n1 + Owner: GDISlaves + SubCell: 3 + Location: 86,74 + Facing: 872 + Actor833: n1 + Owner: GDISlaves + SubCell: 3 + Location: 88,75 + Facing: 729 + Actor834: n2 + Owner: GDISlaves + Location: 89,75 + SubCell: 3 + Facing: 761 + Actor835: n2 + Owner: GDISlaves + Facing: 384 + Location: 69,74 + SubCell: 1 + Actor836: n2 + Owner: GDISlaves + Facing: 384 + SubCell: 3 + Location: 75,69 + Actor837: n2 + Owner: GDISlaves + Facing: 384 + SubCell: 3 + Location: 91,68 + Actor838: n2 + Owner: GDISlaves + Location: 96,74 + SubCell: 3 + Facing: 769 + Actor839: n2 + Owner: GDISlaves + Facing: 384 + SubCell: 3 + Location: 84,86 + Actor840: n2 + Owner: GDISlaves + Facing: 384 + Location: 84,86 + SubCell: 1 + Actor841: n2 + Owner: GDISlaves + Facing: 384 + SubCell: 3 + Location: 86,85 + Actor843: n2 + Owner: GDISlaves + Facing: 384 + Location: 104,41 + SubCell: 1 + Actor844: n2 + Owner: GDISlaves + Location: 103,42 + SubCell: 3 + Facing: 618 + Actor842: n2 + Owner: GDISlaves + Facing: 384 + SubCell: 3 + Location: 109,34 + Actor845: n2 + Owner: GDISlaves + SubCell: 3 + Location: 94,37 + Facing: 499 + Actor846: n2 + Owner: GDISlaves + Facing: 384 + SubCell: 3 + Location: 97,31 + Actor847: n2 + Owner: GDISlaves + SubCell: 3 + Location: 91,44 + Facing: 602 + Actor848: n2 + Owner: GDISlaves + SubCell: 3 + Location: 57,18 + Facing: 666 + Actor849: n2 + Owner: GDISlaves + SubCell: 3 + Location: 61,17 + Facing: 531 + Actor850: n1 + Owner: GDISlaves + SubCell: 3 + Location: 58,21 + Facing: 515 + Actor851: n1 + Owner: GDISlaves + SubCell: 3 + Location: 56,22 + Facing: 666 + Actor852: n1 + Owner: GDISlaves + SubCell: 3 + Location: 55,21 + Facing: 475 + Actor853: n1 + Owner: GDISlaves + SubCell: 3 + Location: 63,22 + Facing: 626 + Actor854: n1 + Owner: GDISlaves + SubCell: 3 + Location: 67,21 + Facing: 650 + Actor855: n1 + Owner: GDISlaves + Location: 47,18 + SubCell: 3 + Facing: 384 + Actor856: n1 + Owner: GDISlaves + Facing: 384 + Location: 47,18 + SubCell: 1 + Actor857: n1 + Owner: GDISlaves + Location: 47,15 + SubCell: 3 + Facing: 253 + Actor858: n1 + Owner: GDISlaves + SubCell: 3 + Location: 46,12 + Facing: 269 + Actor859: n3 + Owner: GDISlaves + Location: 52,19 + SubCell: 3 + Facing: 515 + Actor860: n3 + Owner: GDISlaves + Facing: 384 + SubCell: 3 + Location: 65,18 + Actor862: hq + Owner: GDISlaves + Location: 106,28 + Actor861: pyle + Owner: GDISlaves + Location: 52,14 + Actor863: weap.td + Owner: GDISlaves + Location: 57,13 + Mastermind2: mast + Owner: Scrin + SubCell: 3 + Location: 56,13 + Facing: 563 + Actor865: vulc + Owner: GDISlaves + Location: 60,17 + Facing: 384 + Actor866: mtnk + Owner: GDISlaves + Location: 59,22 + Facing: 512 + Actor867: mtnk + Owner: GDISlaves + Location: 46,14 + Facing: 256 + Actor868: msam + Owner: GDISlaves + Location: 89,41 + Facing: 384 + Actor869: msam + Owner: GDISlaves + Location: 100,40 + Facing: 523 + Actor870: msam + Owner: GDISlaves + Location: 111,37 + Facing: 523 + Actor871: mtnk + Owner: GDISlaves + Location: 95,44 + Facing: 512 + Actor872: mtnk + Owner: GDISlaves + Facing: 512 + Location: 105,42 + Actor717: nuk2 + Owner: GDISlaves + Location: 84,81 + Actor718: nuk2 + Owner: GDISlaves + Location: 86,81 + Actor719: afac + Owner: GDISlaves + Location: 88,81 + Actor873: v02 + Owner: Neutral + Location: 109,105 + Actor874: v04 + Owner: Neutral + Location: 110,102 + Actor875: v07 + Owner: Neutral + Location: 101,110 + Actor877: v11 + Owner: Neutral + Location: 107,109 + Actor878: v09 + Owner: Neutral + Location: 88,109 + Actor879: v03 + Owner: Neutral + Location: 84,110 + Actor880: v01 + Owner: Neutral + Location: 105,104 + Actor881: v05 + Owner: Neutral + Location: 97,107 + Actor876: t07 + Owner: Neutral + Location: 108,110 + Actor882: t03 + Owner: Neutral + Location: 112,104 + Actor883: t10 + Owner: Neutral + Location: 90,106 + Actor884: tc03 + Owner: Neutral + Location: 95,111 + Actor885: t16 + Owner: Neutral + Location: 97,111 + Actor886: t13 + Owner: Neutral + Location: 106,101 + Actor887: t16 + Owner: Neutral + Location: 101,103 + Actor888: t05 + Owner: Neutral + Location: 103,109 + Actor889: wood + Owner: Neutral + Location: 105,103 + Actor890: wood + Owner: Neutral + Location: 106,103 + Actor891: wood + Owner: Neutral + Location: 107,103 + Actor892: wood + Owner: Neutral + Location: 107,104 + Actor893: wood + Owner: Neutral + Location: 107,105 + Actor894: wood + Owner: Neutral + Location: 108,105 + Actor895: wood + Owner: Neutral + Location: 95,106 + Actor896: wood + Owner: Neutral + Location: 95,107 + Actor897: wood + Owner: Neutral + Location: 88,108 + Actor898: wood + Owner: Neutral + Location: 89,108 + Actor899: wood + Owner: Neutral + Location: 87,108 + Actor900: wood + Owner: Neutral + Location: 87,109 + Actor901: wood + Owner: Neutral + Location: 86,109 + Actor902: wood + Owner: Neutral + Location: 83,109 + Actor903: wood + Owner: Neutral + Location: 83,110 + Actor904: wood + Owner: Neutral + Location: 83,111 + Actor905: wood + Owner: Neutral + Location: 84,109 + Actor906: wood + Owner: Neutral + Location: 85,109 + Actor907: wood + Owner: Neutral + Location: 82,111 + Actor908: wood + Owner: Neutral + Location: 109,109 + Actor909: wood + Owner: Neutral + Location: 110,109 + Actor910: wood + Owner: Neutral + Location: 110,110 + Actor911: wood + Owner: Neutral + Location: 110,111 + Actor912: wood + Owner: Neutral + Location: 110,112 + Actor913: wood + Owner: Neutral + Location: 109,112 + Actor914: wood + Owner: Neutral + Location: 107,112 + Actor915: wood + Owner: Neutral + Location: 108,112 + Actor916: wood + Owner: Neutral + Location: 106,112 + Actor917: wood + Owner: Neutral + Location: 105,112 + Actor918: wood + Owner: Neutral + Location: 105,111 + Actor919: wood + Owner: Neutral + Location: 100,112 + Actor920: wood + Owner: Neutral + Location: 101,112 + Actor921: wood + Owner: Neutral + Location: 102,112 + Actor922: wood + Owner: Neutral + Location: 99,112 + Actor923: wood + Owner: Neutral + Location: 99,111 + Actor924: wood + Owner: Neutral + Location: 103,107 + Actor925: wood + Owner: Neutral + Location: 104,107 + Actor926: wood + Owner: Neutral + Location: 105,107 + Actor927: wood + Owner: Neutral + Location: 105,108 + Actor928: gun.nod + Owner: Neutral + Location: 12,68 + TurretFacing: 412 + Health: 18 + Actor929: gun.nod + Owner: Neutral + Location: 18,68 + TurretFacing: 666 + Health: 20 + Actor930: tc04 + Owner: Neutral + Location: 7,1 + Actor931: tc01 + Owner: Neutral + Location: 5,6 + Actor932: tc02 + Owner: Neutral + Location: 3,10 + Actor933: t16 + Owner: Neutral + Location: 4,8 + Actor934: t15 + Owner: Neutral + Location: 4,3 + Actor935: t13 + Owner: Neutral + Location: 4,1 + Actor936: t14 + Owner: Neutral + Location: 1,7 + Actor937: t12 + Owner: Neutral + Location: 5,9 + Actor938: tc05 + Owner: Neutral + Location: 1,3 + Actor939: t02 + Owner: Neutral + Location: 3,6 + Actor940: t01 + Owner: Neutral + Location: 1,11 + Actor941: t02 + Owner: Neutral + Location: 2,9 + Actor942: t02 + Owner: Neutral + Location: 2,19 + Actor943: t06 + Owner: Neutral + Location: 1,18 + Actor944: t08 + Owner: Neutral + Location: 1,21 + Actor945: t03 + Owner: Neutral + Location: 5,16 + Actor946: tc01 + Owner: Neutral + Location: 1,33 + Actor947: tc05 + Owner: Neutral + Location: 5,38 + Actor948: tc02 + Owner: Neutral + Location: 3,45 + Actor949: t16 + Owner: Neutral + Location: 5,41 + Actor950: t15 + Owner: Neutral + Location: 4,36 + Actor951: t08 + Owner: Neutral + Location: 4,36 + Actor952: t02 + Owner: Neutral + Location: 2,35 + Actor953: t02 + Owner: Neutral + Location: 4,43 + Actor954: t05 + Owner: Neutral + Location: 4,40 + Actor955: t13 + Owner: Neutral + Location: 2,37 + Actor956: t10 + Owner: Neutral + Location: 2,49 + Actor957: t13 + Owner: Neutral + Location: 1,40 + Actor958: tc04 + Owner: Neutral + Location: 1,47 + Actor959: tc01 + Owner: Neutral + Location: 2,41 + Actor960: t17 + Owner: Neutral + Location: 2,39 + Actor961: t07 + Owner: Neutral + Location: 1,44 + Actor962: t08 + Owner: Neutral + Location: 2,44 + Actor963: t02 + Owner: Neutral + Location: 1,38 + Actor964: t15 + Owner: Neutral + Location: 52,68 + Actor965: t15 + Owner: Neutral + Location: 52,68 + Actor966: t13 + Owner: Neutral + Location: 48,72 + Actor967: t12 + Owner: Neutral + Location: 63,60 + Actor968: t07 + Owner: Neutral + Location: 56,53 + Actor969: t06 + Owner: Neutral + Location: 48,62 + Actor970: tc03 + Owner: Neutral + Location: 58,44 + Actor971: t16 + Owner: Neutral + Location: 72,30 + Actor972: t07 + Owner: Neutral + Location: 68,27 + Actor973: t08 + Owner: Neutral + Location: 70,27 + Actor974: t13 + Owner: Neutral + Location: 79,33 + Actor975: t10 + Owner: Neutral + Location: 81,45 + Actor976: t15 + Owner: Neutral + Location: 92,48 + Actor977: t14 + Owner: Neutral + Location: 99,59 + Actor978: tc01 + Owner: Neutral + Location: 101,57 + Actor979: tc02 + Owner: Neutral + Location: 86,54 + Actor980: t11 + Owner: Neutral + Location: 88,53 + Actor981: t07 + Owner: Neutral + Location: 94,58 + Actor982: t02 + Owner: Neutral + Location: 101,68 + Actor983: t05 + Owner: Neutral + Location: 101,65 + Actor984: t08 + Owner: Neutral + Location: 107,69 + Actor985: t16 + Owner: Neutral + Location: 111,71 + Actor986: t03 + Owner: Neutral + Location: 98,58 + Actor987: t05 + Owner: Neutral + Location: 73,60 + Actor988: tc02 + Owner: Neutral + Location: 69,56 + Actor989: t16 + Owner: Neutral + Location: 67,53 + Actor990: t11 + Owner: Neutral + Location: 50,27 + Actor991: t14 + Owner: Neutral + Location: 35,16 + Actor992: t13 + Owner: Neutral + Location: 38,6 + Actor993: t06 + Owner: Neutral + Location: 40,7 + Actor994: tc01 + Owner: Neutral + Location: 44,2 + Actor995: t11 + Owner: Neutral + Location: 53,2 + Actor996: tc02 + Owner: Neutral + Location: 56,1 + Actor997: t16 + Owner: Neutral + Location: 57,3 + Actor998: t07 + Owner: Neutral + Location: 54,1 + Actor1000: t02 + Owner: Neutral + Location: 47,1 + Actor999: t03 + Owner: Neutral + Location: 32,7 + Actor1001: t01 + Owner: Neutral + Location: 34,2 + Actor1002: t05 + Owner: Neutral + Location: 29,5 + Actor1003: t05 + Owner: Neutral + Location: 36,27 + Actor1004: tc01 + Owner: Neutral + Location: 40,26 + Actor1005: tc01 + Owner: Neutral + Location: 36,54 + Actor1006: t16 + Owner: Neutral + Location: 37,53 + Actor1007: t11 + Owner: Neutral + Location: 37,51 + Actor1008: t13 + Owner: Neutral + Location: 36,52 + Actor1009: t12 + Owner: Neutral + Location: 36,50 + Actor1010: t07 + Owner: Neutral + Location: 38,49 + Actor1011: t05 + Owner: Neutral + Location: 33,50 + Actor1012: t02 + Owner: Neutral + Location: 36,46 + Actor1013: t05 + Owner: Neutral + Location: 45,54 + Actor1014: t14 + Owner: Neutral + Location: 40,54 + Actor1015: t01 + Owner: Neutral + Location: 42,55 + Actor1016: t05 + Owner: Neutral + Location: 33,58 + Actor1017: t01 + Owner: Neutral + Location: 31,57 + Actor1018: t07 + Owner: Neutral + Location: 36,64 + Actor1019: t01 + Owner: Neutral + Location: 41,68 + Actor1020: t06 + Owner: Neutral + Location: 61,57 + Actor1021: t01 + Owner: Neutral + Location: 77,57 + Actor1022: t06 + Owner: Neutral + Location: 62,71 + Actor1023: ice01 + Owner: Neutral + Location: 36,11 + Actor1024: t06 + Owner: Neutral + Location: 31,23 + Actor1025: t02 + Owner: Neutral + Location: 30,19 + Actor1026: t16 + Owner: Neutral + Location: 22,24 + Actor1027: tc01 + Owner: Neutral + Location: 24,27 + Actor1028: tc02 + Owner: Neutral + Location: 6,24 + Actor1029: t15 + Owner: Neutral + Location: 6,21 + Actor1030: t13 + Owner: Neutral + Location: 18,27 + Actor1031: t11 + Owner: Neutral + Location: 30,31 + Actor1032: t13 + Owner: Neutral + Location: 30,22 + Actor1033: t07 + Owner: Neutral + Location: 33,21 + Actor1034: t05 + Owner: Neutral + Location: 27,17 + Actor1035: t06 + Owner: Neutral + Location: 27,9 + Actor1036: windmill + Owner: Neutral + Location: 8,17 + Actor1037: t10 + Owner: Neutral + Location: 8,10 + Actor1038: t02 + Owner: Neutral + Location: 10,5 + Actor1039: t11 + Owner: Neutral + Location: 13,3 + Actor1040: t05 + Owner: Neutral + Location: 11,7 + Actor1041: tc01 + Owner: Neutral + Location: 17,15 + Actor1042: t05 + Owner: Neutral + Location: 26,26 + Actor1043: t03 + Owner: Neutral + Location: 24,23 + Actor1044: t17 + Owner: Neutral + Location: 38,40 + Actor1045: t11 + Owner: Neutral + Location: 43,36 + Actor1046: t01 + Owner: Neutral + Location: 34,31 + Actor1047: t06 + Owner: Neutral + Location: 52,30 + Actor1048: t02 + Owner: Neutral + Location: 52,24 + Actor1049: t01 + Owner: Neutral + Location: 38,12 + Actor1050: t05 + Owner: Neutral + Location: 97,91 + Actor1051: tc04 + Owner: Neutral + Location: 91,97 + Actor1052: tc05 + Owner: Neutral + Location: 63,103 + Actor1053: t10 + Owner: Neutral + Location: 56,107 + Actor1054: tc02 + Owner: Neutral + Location: 74,107 + Actor1055: tc01 + Owner: Neutral + Location: 96,100 + Actor1056: t07 + Owner: Neutral + Location: 98,98 + Actor1057: t06 + Owner: Neutral + Location: 96,97 + Actor1058: t02 + Owner: Neutral + Location: 106,93 + Actor1059: t03 + Owner: Neutral + Location: 108,92 + Actor1060: t11 + Owner: Neutral + Location: 102,94 + Actor1061: t10 + Owner: Neutral + Location: 90,94 + Actor1062: t15 + Owner: Neutral + Location: 85,102 + Actor1063: t14 + Owner: Neutral + Location: 100,93 + Actor1064: t12 + Owner: Neutral + Location: 80,92 + Actor1065: t05 + Owner: Neutral + Location: 79,98 + Actor1066: t02 + Owner: Neutral + Location: 81,96 + Actor1067: t01 + Owner: Neutral + Location: 56,93 + Actor1068: ice03 + Owner: Neutral + Location: 78,23 + Actor1069: tc04 + Owner: Neutral + Location: 2,64 + Actor1070: t15 + Owner: Neutral + Location: 2,54 + Actor1071: t16 + Owner: Neutral + Location: 26,65 + Actor1072: t11 + Owner: Neutral + Location: 33,81 + Actor1073: tc05 + Owner: Neutral + Location: 38,84 + Actor1074: t16 + Owner: Neutral + Location: 44,87 + Actor1075: tc02 + Owner: Neutral + Location: 5,85 + Actor1076: t10 + Owner: Neutral + Location: 12,87 + Actor1077: t11 + Owner: Neutral + Location: 36,87 + Actor1078: t14 + Owner: Neutral + Location: 3,103 + Actor1079: t16 + Owner: Neutral + Location: 2,93 + Actor1080: t14 + Owner: Neutral + Location: 3,91 + Actor1081: t17 + Owner: Neutral + Location: 64,109 + Actor1082: tc03 + Owner: Neutral + Location: 66,109 + Actor1083: t17 + Owner: Neutral + Location: 55,95 + Actor1084: t16 + Owner: Neutral + Location: 81,24 + Actor1085: t17 + Owner: Neutral + Location: 86,21 + Actor1086: t08 + Owner: Neutral + Location: 80,35 + Actor1087: t14 + Owner: Neutral + Location: 87,20 + Actor1088: t07 + Owner: Neutral + Location: 89,1 + Actor1089: t16 + Owner: Neutral + Location: 111,8 + Actor1091: tpod + Owner: Scrin + Location: 48,105 + Facing: 785 + Actor1092: tpod + Owner: Scrin + Location: 47,96 + Facing: 896 + Actor1093: tpod + Owner: Scrin + Location: 36,92 + Facing: 919 + Actor1090: devo + Owner: Scrin + Location: 46,97 + Facing: 769 + Actor1094: devo + Owner: Scrin + Location: 34,92 + Facing: 888 + Actor1095: devo + Owner: Scrin + Location: 48,108 + Facing: 848 + Actor1096: corr + Owner: Scrin + Location: 33,97 + Facing: 1023 + Actor1097: corr + Owner: Scrin + Location: 32,91 + Facing: 911 + Actor1098: corr + Owner: Scrin + Location: 51,99 + Facing: 689 + Actor1099: ruin + Owner: Scrin + Location: 35,102 + Facing: 682 + Actor1100: intl + Owner: Scrin + Location: 50,101 + Facing: 793 + Actor1101: intl + Owner: Scrin + Location: 29,89 + Facing: 983 + Actor1104: s4 + Owner: Scrin + SubCell: 3 + Location: 41,101 + Facing: 785 + Actor1105: s4 + Owner: Scrin + SubCell: 3 + Location: 39,93 + Facing: 745 + Actor1106: s4 + Owner: Scrin + SubCell: 3 + Location: 28,91 + Facing: 856 + Actor1107: s1 + Owner: Scrin + SubCell: 3 + Location: 50,98 + Facing: 737 + Actor1108: s1 + Owner: Scrin + Location: 51,97 + SubCell: 3 + Facing: 769 + Actor1109: s1 + Owner: Scrin + Location: 51,97 + SubCell: 1 + Facing: 872 + Actor1110: s1 + Owner: Scrin + SubCell: 3 + Location: 53,101 + Facing: 856 + Actor1111: s1 + Owner: Scrin + SubCell: 3 + Location: 52,105 + Facing: 682 + Actor1112: s1 + Owner: Scrin + SubCell: 3 + Location: 51,106 + Facing: 840 + Actor1113: s1 + Owner: Scrin + SubCell: 3 + Location: 53,110 + Facing: 808 + Actor1114: s1 + Owner: Scrin + SubCell: 3 + Location: 43,92 + Facing: 769 + Actor1115: s1 + Owner: Scrin + SubCell: 3 + Location: 32,90 + Facing: 896 + Actor1116: s3 + Owner: Scrin + SubCell: 3 + Location: 42,93 + Facing: 943 + Actor1117: s3 + Owner: Scrin + SubCell: 3 + Location: 31,90 + Facing: 721 + Actor1118: s3 + Owner: Scrin + SubCell: 3 + Location: 51,105 + Facing: 689 + Actor1119: gunw + Owner: Scrin + Location: 67,104 + Facing: 840 + Actor1120: gunw + Owner: Scrin + Location: 70,105 + Facing: 888 + Actor1121: gunw + Owner: Scrin + Location: 78,63 + Facing: 943 + Actor1123: lchr + Owner: Scrin + Location: 81,62 + Facing: 1023 + Actor1124: devo + Owner: Scrin + Location: 70,68 + Facing: 206 + Actor1125: gunw + Owner: Scrin + Location: 66,75 + Facing: 348 + Actor1126: gunw + Owner: Scrin + Facing: 384 + Location: 92,46 + Actor1127: gunw + Owner: Scrin + Location: 107,44 + Facing: 570 + Actor1128: corr + Owner: Scrin + Facing: 384 + Location: 61,23 + Actor1129: gunw + Owner: Scrin + Facing: 384 + Location: 46,19 + Actor1130: seek + Owner: Scrin + Facing: 384 + Location: 61,32 + Actor1131: seek + Owner: Scrin + Location: 55,41 + Facing: 198 + Actor1132: seek + Owner: Scrin + Location: 49,57 + Facing: 174 + Actor1133: devo + Owner: Scrin + Location: 77,99 + Facing: 1023 + Actor1134: shrw + Owner: Scrin + Facing: 384 + Location: 53,50 + Actor1135: shrw + Owner: Scrin + Location: 45,59 + Facing: 103 + Actor1136: gunw + Owner: Scrin + Location: 56,39 + Facing: 198 + Actor1137: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 54,39 + Actor1138: s1 + Owner: Scrin + Facing: 384 + Location: 55,40 + SubCell: 3 + Actor1139: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 61,34 + Actor1140: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 60,32 + Actor1141: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 62,31 + Actor1142: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 61,24 + Actor1143: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 58,24 + Actor1144: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 46,21 + Actor1145: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 45,19 + Actor1146: s1 + Owner: Scrin + SubCell: 3 + Location: 31,38 + Facing: 729 + Actor1147: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 63,79 + Actor1148: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 66,74 + Actor1149: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 76,64 + Actor1150: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 85,62 + Actor1151: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 97,72 + Actor1152: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 100,74 + Actor1153: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 90,46 + Actor1154: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 93,47 + Actor1155: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 104,44 + Actor1156: s1 + Owner: Scrin + SubCell: 3 + Location: 83,40 + Facing: 515 + Actor1157: s1 + Owner: Scrin + Facing: 384 + Location: 83,40 + SubCell: 1 + Actor1158: s1 + Owner: Scrin + SubCell: 3 + Location: 83,38 + Facing: 174 + Actor1159: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 84,49 + Actor1160: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 98,47 + Actor1161: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 85,50 + Actor1162: s3 + Owner: Scrin + Facing: 384 + Location: 62,32 + SubCell: 3 + Actor1163: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 62,23 + Actor1164: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 45,16 + Actor1165: s3 + Owner: Scrin + SubCell: 3 + Location: 31,44 + Facing: 689 + Actor1122: s2 + Owner: Scrin + SubCell: 3 + Location: 63,106 + Facing: 777 + Actor1166: s2 + Owner: Scrin + SubCell: 3 + Location: 72,105 + Facing: 0 + Actor1167: s3 + Owner: Scrin + SubCell: 3 + Location: 68,106 + Facing: 785 + Actor1168: s1 + Owner: Scrin + SubCell: 3 + Location: 78,100 + Facing: 31 + Actor1169: s1 + Owner: Scrin + SubCell: 3 + Location: 78,97 + Facing: 95 + Actor1170: s3 + Owner: Scrin + SubCell: 3 + Location: 81,99 + Facing: 214 + Actor1171: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 95,60 + Actor1172: s1 + Owner: Scrin + SubCell: 3 + Location: 8,30 + Facing: 880 + EntranceReveal1: waypoint + Owner: Neutral + Location: 46,14 + EntranceReveal5: waypoint + Owner: Neutral + Location: 68,77 + EntranceReveal6: waypoint + Owner: Neutral + Location: 95,77 + EntranceReveal4: waypoint + Owner: Neutral + Location: 83,64 + Actor806: htnk + Owner: GDISlaves + Location: 83,65 + Facing: 0 + EntranceReveal2: waypoint + Owner: Neutral + Location: 59,21 + EntranceReveal3: waypoint + Owner: Neutral + Location: 95,43 + PlayerStart: waypoint + Owner: Neutral + Location: 19,9 + Mastermind3: mast + Owner: Scrin + SubCell: 3 + Location: 99,33 + Facing: 618 + Actor1174: rea2 + Owner: Scrin + Location: 43,109 + Actor1175: s4 + Owner: Scrin + SubCell: 3 + Facing: 777 + Location: 50,110 + Actor1176: s4 + Owner: Scrin + SubCell: 3 + Facing: 777 + Location: 49,107 + Actor1102: swal + Owner: Scrin + Location: 45,107 + Actor1103: swal + Owner: Scrin + Location: 46,107 + Actor1177: swal + Owner: Scrin + Location: 46,108 + Actor1178: swal + Owner: Scrin + Location: 46,109 + Actor1179: swal + Owner: Scrin + Location: 46,110 + Actor1180: swal + Owner: Scrin + Location: 46,111 + Actor1181: swal + Owner: Scrin + Location: 46,112 + Actor1182: swal + Owner: Scrin + Location: 44,112 + Actor1183: swal + Owner: Scrin + Location: 45,112 + Actor1184: swal + Owner: Scrin + Location: 19,107 + Actor1185: swal + Owner: Scrin + Location: 18,107 + Actor1186: swal + Owner: Scrin + Location: 18,108 + Actor1187: swal + Owner: Scrin + Location: 18,109 + Actor1188: swal + Owner: Scrin + Location: 18,110 + Actor1189: swal + Owner: Scrin + Location: 18,111 + Actor1190: swal + Owner: Scrin + Location: 18,112 + Actor1191: swal + Owner: Scrin + Location: 19,112 + Actor1192: swal + Owner: Scrin + Location: 20,112 + Actor1193: swal + Owner: Scrin + Location: 21,112 + Actor1173: rea2 + Owner: Scrin + Location: 22,109 + Actor1194: sfac + Owner: Scrin + Location: 19,109 + Actor1195: reac + Owner: Scrin + Location: 31,107 + AttackNode1: waypoint + Owner: Neutral + Location: 32,86 + AttackNode2: waypoint + Owner: Neutral + Location: 17,55 + AttackNode3: waypoint + Owner: Neutral + Location: 44,46 + AttackNode4: waypoint + Owner: Neutral + Location: 73,49 + AttackNode5: waypoint + Owner: Neutral + Location: 77,102 + AttackNode6: waypoint + Owner: Neutral + Location: 57,64 + AttackNode7: waypoint + Owner: Neutral + Location: 95,55 + Actor1196: corr + Owner: Scrin + Location: 79,25 + Facing: 198 + Actor1197: intl + Owner: Scrin + Location: 80,22 + Facing: 245 + Actor1198: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 80,23 + Actor1199: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 81,27 + NormalHardOnlyTripod: tpod + Owner: Scrin + Location: 97,38 + Facing: 384 + Actor1201: seek + Owner: Scrin + Location: 108,32 + Facing: 190 + Actor1202: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 59,16 + Actor1203: s2 + Owner: Scrin + SubCell: 3 + Location: 52,13 + Facing: 483 + Actor1204: intl + Owner: Scrin + Location: 70,15 + Facing: 642 + Actor1205: intl + Owner: Scrin + Location: 71,12 + Facing: 634 + Actor1206: corr + Owner: Scrin + Location: 78,72 + Facing: 832 + Actor1207: intl + Owner: Scrin + Facing: 384 + Location: 89,86 + Actor1208: intl.ai2 + Owner: Scrin + Location: 99,72 + Facing: 697 + Actor1209: devo + Owner: Scrin + Location: 86,90 + Facing: 634 + Actor1210: devo + Owner: Scrin + Location: 83,91 + Facing: 594 + Actor1212: s4 + Owner: Scrin + SubCell: 3 + Location: 76,78 + Facing: 523 + Actor1213: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 79,81 + Actor1214: s4 + Owner: Scrin + SubCell: 3 + Location: 77,80 + Facing: 745 + Actor1215: lchr + Owner: Scrin + Location: 108,36 + Facing: 384 + Actor1200: camera + Owner: Scrin + Location: 95,41 + Actor1216: camera + Owner: Scrin + Location: 85,34 + Actor1217: camera + Owner: Scrin + Location: 59,20 + Actor1218: camera + Owner: Scrin + Location: 48,14 + Actor1219: camera + Owner: Scrin + Location: 18,45 + Actor1220: camera + Owner: Scrin + Location: 29,42 + Actor1221: camera + Owner: Scrin + Location: 78,84 + Actor1222: camera + Owner: Scrin + Location: 70,77 + Actor1223: camera + Owner: Scrin + Location: 83,68 + Actor1224: camera + Owner: Scrin + Location: 90,77 + Actor1225: ruin + Owner: Scrin + Facing: 634 + Location: 81,92 + Actor1211: rtpd + Owner: Scrin + Location: 72,87 + Facing: 499 + Actor1226: rtpd + Owner: Scrin + Location: 99,80 + Facing: 682 + Actor1227: rtpd + Owner: Scrin + Location: 67,71 + Facing: 142 + Actor1228: devo + Owner: Scrin + Location: 102,47 + Facing: 555 + Actor1229: pac + Owner: Scrin + Location: 37,94 + Facing: 848 + Actor1230: pac + Owner: Scrin + Location: 42,108 + Facing: 848 + Actor1231: s4 + Owner: Scrin + SubCell: 3 + Location: 89,56 + Facing: 927 + Actor1232: s1 + Owner: Scrin + SubCell: 3 + Location: 96,57 + Facing: 904 + Actor1233: s2 + Owner: Scrin + SubCell: 3 + Location: 64,51 + Facing: 150 + Actor1234: s2 + Owner: Scrin + SubCell: 3 + Location: 66,52 + Facing: 253 + Actor1235: s2 + Owner: Scrin + SubCell: 3 + Location: 67,50 + Facing: 71 + Actor1236: intl + Owner: Scrin + Location: 66,50 + Facing: 111 + Actor1237: corr + Owner: Scrin + Location: 91,55 + Facing: 0 + Actor1238: corr + Owner: Scrin + Location: 90,35 + Facing: 341 + Actor1239: ruin + Owner: Scrin + Facing: 634 + Location: 85,91 + Actor1240: ruin + Owner: Scrin + Facing: 634 + Location: 76,91 + AdvComms: eye + Owner: GDISlaves + Location: 85,76 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|missions/main-campaign/ca27-emancipation/emancipation-rules.yaml, ca|rules/custom/coop-rules.yaml, emancipation-coop-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml, ca|missions/main-campaign/ca27-emancipation/emancipation-weapons.yaml diff --git a/mods/ca/missions/coop-campaign/ca28-duality-coop/duality-coop-rules.yaml b/mods/ca/missions/coop-campaign/ca28-duality-coop/duality-coop-rules.yaml new file mode 100644 index 0000000000..e9b7ec659c --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca28-duality-coop/duality-coop-rules.yaml @@ -0,0 +1,30 @@ +World: + LuaScript: + Scripts: campaign.lua, coop.lua, ca|missions/main-campaign/ca28-duality/duality.lua, duality-coop.lua + ScriptLobbyDropdown@CAMLOCK: + ID: camlock + Label: Camera Lock + Description: Enable/disable locking the camera on your last unit. + Values: + enabled: Enabled + disabled: Disabled + Default: disabled + DisplayOrder: 999 + ScriptLobbyDropdown@MISSIONTIMER: + ID: missiontimer + Label: Mission Timer + Description: Enable/disable time limit\nOr activate Rush Mode, where you have 1 Minute and gain time for each destroyed silo. + Values: + enabled: Enabled + disabled: Disabled + rush: Rush Mode + Default: disabled + DisplayOrder: 999 + LobbyMissionInfo@InitialObjectives: + Prefix: Initial Objectives + Text: • Destroy all Scrin silos.\n• Escape the facility. + LobbyMissionInfo@Notes: + Prefix: Note + Text: Respawns can be enabled for this mission. + PrefixColor: FF9900 + TextColor: FF9900 diff --git a/mods/ca/missions/coop-campaign/ca28-duality-coop/duality-coop.lua b/mods/ca/missions/coop-campaign/ca28-duality-coop/duality-coop.lua new file mode 100644 index 0000000000..7820c2a8fb --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca28-duality-coop/duality-coop.lua @@ -0,0 +1,179 @@ + +TimeLimit = { + easy = DateTime.Minutes(30), + normal = DateTime.Minutes(25), + hard = DateTime.Minutes(20), + vhard = DateTime.Minutes(15), + brutal = DateTime.Minutes(10), +} + +RushTimeBonus = { + easy = DateTime.Seconds(15), + normal = DateTime.Seconds(10), + hard = DateTime.Seconds(8), + vhard = DateTime.Seconds(5), + brutal = DateTime.Seconds(3), +} + +DefaultText = "\n\n\n\nTiberium stores remaining: " +TimerText = "" +ScoreboardText = "\n---Leaderboard---\n" + +SetupPlayers = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Multi2 = Player.GetPlayer("Multi2") + Multi3 = Player.GetPlayer("Multi3") + Multi4 = Player.GetPlayer("Multi4") + Multi5 = Player.GetPlayer("Multi5") + GDI = Player.GetPlayer("GDI") + Scrin = Player.GetPlayer("Scrin") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = Utils.Where({ Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 }, function(p) return p ~= nil end) + MissionEnemies = { Scrin } + SinglePlayerPlayer = GDI + StopSpread = true + CoopInit() +end + +AfterWorldLoaded = function() + CamlockEnabled = Map.LobbyOption("camlock") == "enabled" + Commando.Owner = MissionPlayers[1] + Tanya.Owner = MissionPlayers[2] + Actor.Create("healcrate", true, { Owner = Neutral, Location = CPos.New(70, 25) }) + + if #MissionPlayers > 2 then + local y = Commando.Location.Y + 1 + + local cells = { + CPos.New(Commando.Location.X, Commando.Location.Y - 1), + CPos.New(Commando.Location.X, Commando.Location.Y - 2), + CPos.New(Commando.Location.X, Commando.Location.Y + 1), + CPos.New(Commando.Location.X, Commando.Location.Y + 2), + } + + for i = 3, #MissionPlayers do + local extraCommando = Actor.Create("rmbo", true, { Owner = MissionPlayers[i], Location = cells[i - 2], Facing = Angle.West }) + extraCommando.GrantCondition("difficulty-" .. Difficulty) + CommandoDeathTrigger(extraCommando) + end + end + + TimeLimitMode = Map.LobbyOption("missiontimer") + + if TimeLimitMode == "enabled" then + TimerTicks = TimeLimit[Difficulty] + elseif TimeLimitMode == "rush" then + TimerTicks = DateTime.Minutes(1) + else + TimerTicks = 0 + end + + SiloScore = {} -- [player] = totalDamage + Utils.Do(CoopPlayers, function(p) + table.insert(SiloScore, { + Player = p, + Score = 0 + }) + end) + + UpdateScoreboard() +end + +AfterTick = function() + if CamlockEnabled then + Utils.Do(MissionPlayers, function(p) + if not p.IsLocalPlayer then + return + end + local validCamTargets = p.GetActorsByTypes({"rmbo", "e7"}) + if #validCamTargets == 1 then + PanToPos(validCamTargets[1].CenterPosition, 100) + end + end) + end + + if DateTime.GameTime > 1 and DateTime.GameTime % DateTime.Seconds(1) == 0 then + if TimerTicks > 0 then + if TimerTicks > 25 then + TimerTicks = TimerTicks - 25 + else + TimerTicks = 0 + + if NumSilosRemaining > 0 then + if not GDI.IsObjectiveCompleted(ObjectiveDestroyTiberiumStores) then + GDI.MarkFailedObjective(ObjectiveDestroyTiberiumStores) + end + elseif GDI.IsObjectiveCompleted(ObjectiveDestroyTiberiumStores) then + if not GDI.IsObjectiveCompleted(ObjectiveEscape) then + GDI.MarkFailedObjective(ObjectiveEscape) + end + end + end + TimerText = " | Time remaining: " .. UtilsCA.FormatTimeForGameSpeed(TimerTicks) + UpdateObjectiveText() + end + end +end + +SetupFindTanyaObjective = function() + -- not used in co-op +end + +SetupKeepAliveObjectives = function() + if not RespawnEnabled then + ObjectiveCommandoSurvive = GDI.AddObjective("All Commandos must survive.") + ObjectiveTanyaSurvive = GDI.AddObjective("Tanya must survive.") + else + ObjectiveCommandoSurvive = GDI.AddSecondaryObjective("Keep all Commandos alive.") + ObjectiveTanyaSurvive = GDI.AddSecondaryObjective("Keep Tanya alive.") + end +end + +UpdateScoreboard = function() + table.sort(SiloScore, function(a, b) + return a.Score > b.Score + end) + + ScoreboardText = "\n---Leaderboard---\n" + local rank = 1 + Utils.Do(SiloScore, function(entry) + ScoreboardText = ScoreboardText .. string.format("%d) %-12s %8d\n", rank, entry.Player.Name, entry.Score) + rank = rank + 1 + end) +end + +UpdateObjectiveText = function() + local msg = "" + if NumSilosRemaining > 0 then + msg = DefaultText .. NumSilosRemaining .. TimerText .. ScoreboardText + else + msg = DefaultText .. TimerText .. ScoreboardText + end + UserInterface.SetMissionText(msg, HSLColor.Yellow) +end + +SiloKilled = function(killer) + if TimeLimitMode == "rush" then + TimerTicks = TimerTicks + RushTimeBonus[Difficulty] + end + NumSilosRemaining = NumSilosRemaining - 1 + SiloScoring(killer) + UpdateObjectiveText() +end + +SiloScoring = function(killer) + if IsMissionPlayer(killer.Owner) then + for _, entry in ipairs(SiloScore) do + if entry.Player == killer.Owner then + entry.Score = entry.Score + 1 + UpdateScoreboard() + break + end + end + end +end + +SetEscapeText = function() + DefaultText = "\n\n\n\nExit the facility." +end diff --git a/mods/ca/missions/coop-campaign/ca28-duality-coop/map.bin b/mods/ca/missions/coop-campaign/ca28-duality-coop/map.bin new file mode 100644 index 0000000000..f7b04c3a54 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca28-duality-coop/map.bin differ diff --git a/mods/ca/missions/coop-campaign/ca28-duality-coop/map.png b/mods/ca/missions/coop-campaign/ca28-duality-coop/map.png new file mode 100644 index 0000000000..817833bd56 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca28-duality-coop/map.png differ diff --git a/mods/ca/missions/coop-campaign/ca28-duality-coop/map.yaml b/mods/ca/missions/coop-campaign/ca28-duality-coop/map.yaml new file mode 100644 index 0000000000..d489f6e8a4 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca28-duality-coop/map.yaml @@ -0,0 +1,4872 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 28: Duality Co-op + +Author: Darkademic & Gandorques Hikla + +Tileset: INTERIOR + +MapSize: 98,98 + +Bounds: 1,1,96,96 + +Visibility: Lobby + +Categories: Co-op Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: GDI, Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + PlayerReference@GDI: + Name: GDI + Faction: gdi + Color: F2CF74 + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Creeps + PlayerReference@Scrin: + Name: Scrin + Bot: campaign + Faction: scrin + Color: 7700FF + Enemies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Required: True + Team: 1 + Faction: gdi + Color: F2CF74 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Creeps + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Required: True + Team: 1 + Faction: allies + Color: 99ACF2 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Creeps + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: 0B7310 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Creeps + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: EA7816 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Creeps + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: 82C900 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Creeps + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: 775A12 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Creeps + +Actors: + Actor88: barb + Owner: Neutral + Location: 85,85 + Actor89: barb + Owner: Neutral + Location: 86,85 + Actor90: barb + Owner: Neutral + Location: 92,85 + Actor91: barb + Owner: Neutral + Location: 93,85 + Actor92: barb + Owner: Neutral + Location: 85,86 + Actor93: barl + Owner: Creeps + Location: 92,86 + Actor94: barb + Owner: Neutral + Location: 93,86 + Actor95: brl3 + Owner: Creeps + Location: 90,87 + Actor96: barl + Owner: Creeps + Location: 89,88 + Actor97: brl3 + Owner: Creeps + Location: 87,89 + Actor98: brl3 + Owner: Creeps + Location: 90,89 + Actor99: barl + Owner: Creeps + Location: 90,90 + Actor100: barl + Owner: Creeps + Location: 87,92 + Actor101: barb + Owner: Neutral + Location: 85,93 + Actor102: brl3 + Owner: Creeps + Location: 89,93 + Actor103: barb + Owner: Neutral + Location: 93,93 + Actor104: barb + Owner: Neutral + Location: 85,94 + Actor105: barb + Owner: Neutral + Location: 86,94 + Actor106: barb + Owner: Neutral + Location: 92,94 + Actor107: barb + Owner: Neutral + Location: 93,94 + Actor83: barb + Owner: Neutral + Location: 40,54 + Actor84: barb + Owner: Neutral + Location: 40,55 + Actor85: barb + Owner: Neutral + Location: 41,54 + Actor86: barb + Owner: Neutral + Location: 43,54 + Actor87: barb + Owner: Neutral + Location: 43,55 + Actor168: barb + Owner: Neutral + Location: 43,56 + Actor169: barb + Owner: Neutral + Location: 42,56 + Actor170: barb + Owner: Neutral + Location: 40,58 + Actor171: barb + Owner: Neutral + Location: 41,58 + Actor172: barb + Owner: Neutral + Location: 42,58 + Actor173: barb + Owner: Neutral + Location: 43,58 + Actor174: barb + Owner: Neutral + Location: 44,59 + Actor175: barb + Owner: Neutral + Location: 44,58 + Actor176: barb + Owner: Neutral + Location: 42,60 + Actor177: barb + Owner: Neutral + Location: 42,61 + Actor178: barb + Owner: Neutral + Location: 43,61 + Actor179: barb + Owner: Neutral + Location: 44,61 + Actor180: barb + Owner: Neutral + Location: 45,61 + Actor181: barb + Owner: Neutral + Location: 44,54 + Actor182: barb + Owner: Neutral + Location: 45,54 + Actor183: barb + Owner: Neutral + Location: 40,63 + Actor184: barb + Owner: Neutral + Location: 41,63 + Actor185: barb + Owner: Neutral + Location: 44,63 + Actor186: barb + Owner: Neutral + Location: 44,64 + Actor187: barl + Owner: Creeps + Location: 7,53 + Actor188: brl3 + Owner: Creeps + Location: 5,54 + Actor189: barl + Owner: Creeps + Location: 4,55 + Actor191: brl3 + Owner: Creeps + Location: 5,56 + Actor192: barl + Owner: Creeps + Location: 5,57 + Actor194: brl3 + Owner: Creeps + Location: 4,60 + Actor566: brik + Owner: Neutral + Location: 37,87 + Actor567: brik + Owner: Neutral + Location: 38,87 + Actor571: brik + Owner: Neutral + Location: 36,87 + Actor572: brik + Owner: Neutral + Location: 36,88 + Actor573: brik + Owner: Neutral + Location: 36,89 + Actor574: brik + Owner: Neutral + Location: 36,90 + Actor575: brik + Owner: Neutral + Location: 37,90 + Actor576: brik + Owner: Neutral + Location: 38,90 + Actor577: brik + Owner: Neutral + Location: 39,90 + Actor580: brik + Owner: Neutral + Location: 42,90 + Actor581: brik + Owner: Neutral + Location: 42,91 + Actor582: brik + Owner: Neutral + Location: 42,92 + Actor583: brik + Owner: Neutral + Location: 42,93 + Actor584: brik + Owner: Neutral + Location: 42,94 + Actor585: brik + Owner: Neutral + Location: 42,95 + Actor586: brik + Owner: Neutral + Location: 39,95 + Actor587: brik + Owner: Neutral + Location: 39,94 + Actor588: brik + Owner: Neutral + Location: 39,93 + Actor589: brik + Owner: Neutral + Location: 39,92 + Actor590: brik + Owner: Neutral + Location: 39,91 + Actor592: brl3 + Owner: Creeps + Location: 3,56 + Actor593: barl + Owner: Creeps + Location: 3,59 + Actor607: brik + Owner: Neutral + Location: 63,87 + Actor608: brik + Owner: Neutral + Location: 62,87 + Actor609: brik + Owner: Neutral + Location: 61,87 + Actor610: brik + Owner: Neutral + Location: 60,87 + Actor614: brik + Owner: Neutral + Location: 63,88 + Actor615: brik + Owner: Neutral + Location: 63,89 + Actor616: brik + Owner: Neutral + Location: 63,90 + Actor617: brik + Owner: Neutral + Location: 62,90 + Actor618: brik + Owner: Neutral + Location: 61,90 + Actor619: brik + Owner: Neutral + Location: 60,90 + Actor620: brik + Owner: Neutral + Location: 67,87 + Actor621: brik + Owner: Neutral + Location: 68,87 + Actor622: brik + Owner: Neutral + Location: 69,87 + Actor623: brik + Owner: Neutral + Location: 70,87 + Actor624: brik + Owner: Neutral + Location: 70,86 + Actor625: brik + Owner: Neutral + Location: 67,90 + Actor626: brik + Owner: Neutral + Location: 67,89 + Actor627: brik + Owner: Neutral + Location: 67,88 + Actor628: brik + Owner: Neutral + Location: 68,90 + Actor629: brik + Owner: Neutral + Location: 69,90 + Actor630: brik + Owner: Neutral + Location: 70,90 + Actor631: brik + Owner: Neutral + Location: 70,91 + Actor632: brik + Owner: Neutral + Location: 70,92 + Actor633: brik + Owner: Neutral + Location: 60,91 + Actor634: brik + Owner: Neutral + Location: 60,92 + Actor635: brik + Owner: Neutral + Location: 64,83 + Actor636: brik + Owner: Neutral + Location: 65,83 + Actor637: brik + Owner: Neutral + Location: 66,83 + Actor638: brik + Owner: Neutral + Location: 66,82 + Actor639: brik + Owner: Neutral + Location: 66,81 + Actor640: brik + Owner: Neutral + Location: 66,80 + Actor641: brik + Owner: Neutral + Location: 66,79 + Actor642: brik + Owner: Neutral + Location: 63,83 + Actor643: brik + Owner: Neutral + Location: 62,83 + Actor644: brik + Owner: Neutral + Location: 70,80 + Actor645: brik + Owner: Neutral + Location: 70,81 + Actor646: brik + Owner: Neutral + Location: 71,80 + Actor647: brik + Owner: Neutral + Location: 72,80 + Actor648: brik + Owner: Neutral + Location: 73,80 + Actor649: brik + Owner: Neutral + Location: 70,82 + Actor650: brik + Owner: Neutral + Location: 70,83 + Actor651: brik + Owner: Neutral + Location: 74,80 + Actor652: brik + Owner: Neutral + Location: 75,80 + Actor653: brik + Owner: Neutral + Location: 70,75 + Actor654: brik + Owner: Neutral + Location: 71,75 + Actor655: brik + Owner: Neutral + Location: 72,75 + Actor656: brik + Owner: Neutral + Location: 73,75 + Actor657: brik + Owner: Neutral + Location: 74,75 + Actor658: brik + Owner: Neutral + Location: 74,74 + Actor659: brik + Owner: Neutral + Location: 74,73 + Actor660: brik + Owner: Neutral + Location: 74,72 + Actor661: brik + Owner: Neutral + Location: 74,71 + Actor662: brik + Owner: Neutral + Location: 74,70 + Actor663: brik + Owner: Neutral + Location: 70,61 + Actor664: brik + Owner: Neutral + Location: 71,61 + Actor665: brik + Owner: Neutral + Location: 72,61 + Actor666: brik + Owner: Neutral + Location: 73,61 + Actor667: brik + Owner: Neutral + Location: 74,61 + Actor668: brik + Owner: Neutral + Location: 74,62 + Actor669: brik + Owner: Neutral + Location: 74,63 + Actor670: brik + Owner: Neutral + Location: 74,64 + Actor671: brik + Owner: Neutral + Location: 74,65 + Actor672: brik + Owner: Neutral + Location: 70,62 + Actor673: brik + Owner: Neutral + Location: 70,63 + Actor674: brik + Owner: Neutral + Location: 70,65 + Actor675: brik + Owner: Neutral + Location: 70,66 + Actor676: brik + Owner: Neutral + Location: 70,64 + Actor677: brik + Owner: Neutral + Location: 70,67 + Actor678: brik + Owner: Neutral + Location: 70,68 + Actor679: brik + Owner: Neutral + Location: 70,69 + Actor680: brik + Owner: Neutral + Location: 55,60 + Actor681: brik + Owner: Neutral + Location: 56,60 + Actor682: brik + Owner: Neutral + Location: 57,60 + Actor683: brik + Owner: Neutral + Location: 58,60 + Actor684: brik + Owner: Neutral + Location: 59,60 + Actor685: brik + Owner: Neutral + Location: 55,61 + Actor686: brik + Owner: Neutral + Location: 55,62 + Actor687: brik + Owner: Neutral + Location: 55,63 + Actor688: brik + Owner: Neutral + Location: 55,64 + Actor689: brik + Owner: Neutral + Location: 55,65 + Actor690: brik + Owner: Neutral + Location: 55,66 + Actor691: brik + Owner: Neutral + Location: 55,67 + Actor692: brik + Owner: Neutral + Location: 59,66 + Actor693: brik + Owner: Neutral + Location: 59,64 + Actor694: brik + Owner: Neutral + Location: 59,63 + Actor695: brik + Owner: Neutral + Location: 59,62 + Actor696: brik + Owner: Neutral + Location: 59,61 + Actor697: brik + Owner: Neutral + Location: 59,65 + Actor698: brik + Owner: Neutral + Location: 46,65 + Actor699: brik + Owner: Neutral + Location: 45,65 + Actor700: brik + Owner: Neutral + Location: 44,65 + Actor701: brik + Owner: Neutral + Location: 44,66 + Actor702: brik + Owner: Neutral + Location: 44,67 + Actor703: brik + Owner: Neutral + Location: 45,67 + Actor704: brik + Owner: Neutral + Location: 46,67 + Actor705: brik + Owner: Neutral + Location: 47,67 + Actor706: brik + Owner: Neutral + Location: 48,67 + Actor707: brik + Owner: Neutral + Location: 49,67 + Actor708: brik + Owner: Neutral + Location: 50,67 + Actor709: brik + Owner: Neutral + Location: 51,67 + Actor710: brik + Owner: Neutral + Location: 51,66 + Actor711: brik + Owner: Neutral + Location: 51,65 + Actor712: brik + Owner: Neutral + Location: 51,64 + Actor713: brik + Owner: Neutral + Location: 51,63 + Actor714: brik + Owner: Neutral + Location: 51,62 + Actor715: brik + Owner: Neutral + Location: 46,63 + Actor716: brik + Owner: Neutral + Location: 46,64 + Actor717: brik + Owner: Neutral + Location: 46,62 + Actor718: brik + Owner: Neutral + Location: 46,61 + Actor719: brik + Owner: Neutral + Location: 46,60 + Actor720: brik + Owner: Neutral + Location: 46,59 + Actor721: brik + Owner: Neutral + Location: 46,58 + Actor722: brik + Owner: Neutral + Location: 46,53 + Actor723: brik + Owner: Neutral + Location: 47,53 + Actor724: brik + Owner: Neutral + Location: 48,53 + Actor725: brik + Owner: Neutral + Location: 46,54 + Actor726: brik + Owner: Neutral + Location: 46,55 + Actor727: brik + Owner: Neutral + Location: 49,53 + Actor728: brik + Owner: Neutral + Location: 39,53 + Actor729: brik + Owner: Neutral + Location: 38,53 + Actor730: brik + Owner: Neutral + Location: 37,53 + Actor731: brik + Owner: Neutral + Location: 36,53 + Actor732: brik + Owner: Neutral + Location: 39,54 + Actor733: brik + Owner: Neutral + Location: 39,55 + Actor734: brik + Owner: Neutral + Location: 39,56 + Actor735: brik + Owner: Neutral + Location: 39,57 + Actor736: brik + Owner: Neutral + Location: 39,58 + Actor737: brik + Owner: Neutral + Location: 44,71 + Actor738: brik + Owner: Neutral + Location: 44,72 + Actor739: brik + Owner: Neutral + Location: 44,73 + Actor740: brik + Owner: Neutral + Location: 45,73 + Actor741: brik + Owner: Neutral + Location: 46,73 + Actor742: brik + Owner: Neutral + Location: 45,71 + Actor743: brik + Owner: Neutral + Location: 46,71 + Actor744: brik + Owner: Neutral + Location: 47,71 + Actor745: brik + Owner: Neutral + Location: 48,71 + Actor746: brik + Owner: Neutral + Location: 49,71 + Actor747: brik + Owner: Neutral + Location: 50,71 + Actor748: brik + Owner: Neutral + Location: 51,71 + Actor749: brik + Owner: Neutral + Location: 51,72 + Actor750: brik + Owner: Neutral + Location: 51,73 + Actor751: brik + Owner: Neutral + Location: 50,73 + Actor752: brik + Owner: Neutral + Location: 49,73 + Actor753: brik + Owner: Neutral + Location: 48,73 + Actor754: brik + Owner: Neutral + Location: 47,73 + Actor755: brik + Owner: Neutral + Location: 55,73 + Actor756: brik + Owner: Neutral + Location: 55,72 + Actor757: brik + Owner: Neutral + Location: 55,71 + Actor758: brik + Owner: Neutral + Location: 56,73 + Actor759: brik + Owner: Neutral + Location: 57,73 + Actor760: brik + Owner: Neutral + Location: 58,73 + Actor761: brik + Owner: Neutral + Location: 59,73 + Actor762: brik + Owner: Neutral + Location: 55,70 + Actor763: brik + Owner: Neutral + Location: 55,69 + Actor764: brik + Owner: Neutral + Location: 69,55 + Actor765: brik + Owner: Neutral + Location: 70,55 + Actor766: brik + Owner: Neutral + Location: 70,56 + Actor767: brik + Owner: Neutral + Location: 71,56 + Actor768: brik + Owner: Neutral + Location: 68,55 + Actor769: brik + Owner: Neutral + Location: 43,48 + Actor770: brik + Owner: Neutral + Location: 44,48 + Actor771: brik + Owner: Neutral + Location: 42,48 + Actor772: brik + Owner: Neutral + Location: 42,47 + Actor773: brik + Owner: Neutral + Location: 42,46 + Actor774: brik + Owner: Neutral + Location: 43,46 + Actor775: brik + Owner: Neutral + Location: 44,46 + Actor776: brik + Owner: Neutral + Location: 45,46 + Actor777: brik + Owner: Neutral + Location: 45,47 + Actor778: brik + Owner: Neutral + Location: 45,48 + Actor779: brik + Owner: Neutral + Location: 36,43 + Actor780: brik + Owner: Neutral + Location: 37,43 + Actor781: brik + Owner: Neutral + Location: 38,43 + Actor782: brik + Owner: Neutral + Location: 39,43 + Actor783: brik + Owner: Neutral + Location: 39,42 + Actor784: brik + Owner: Neutral + Location: 39,41 + Actor785: brik + Owner: Neutral + Location: 38,41 + Actor786: brik + Owner: Neutral + Location: 37,41 + Actor787: brik + Owner: Neutral + Location: 36,41 + Actor788: brik + Owner: Neutral + Location: 36,42 + Actor789: brik + Owner: Neutral + Location: 28,40 + Actor790: brik + Owner: Neutral + Location: 29,40 + Actor791: brik + Owner: Neutral + Location: 30,40 + Actor792: brik + Owner: Neutral + Location: 31,40 + Actor793: brik + Owner: Neutral + Location: 31,39 + Actor794: brik + Owner: Neutral + Location: 31,38 + Actor795: brik + Owner: Neutral + Location: 31,37 + Actor796: brik + Owner: Neutral + Location: 32,37 + Actor797: brik + Owner: Neutral + Location: 33,37 + Actor798: brik + Owner: Neutral + Location: 34,37 + Actor799: brik + Owner: Neutral + Location: 35,37 + Actor800: brik + Owner: Neutral + Location: 36,37 + Actor801: brik + Owner: Neutral + Location: 37,37 + Actor802: brik + Owner: Neutral + Location: 38,37 + Actor803: brik + Owner: Neutral + Location: 39,37 + Actor804: brik + Owner: Neutral + Location: 39,36 + Actor805: brik + Owner: Neutral + Location: 39,35 + Actor806: brik + Owner: Neutral + Location: 39,34 + Actor807: brik + Owner: Neutral + Location: 35,34 + Actor808: brik + Owner: Neutral + Location: 36,34 + Actor809: brik + Owner: Neutral + Location: 37,34 + Actor810: brik + Owner: Neutral + Location: 38,34 + Actor811: brik + Owner: Neutral + Location: 35,33 + Actor812: brik + Owner: Neutral + Location: 35,32 + Actor813: brik + Owner: Neutral + Location: 35,31 + Actor814: brik + Owner: Neutral + Location: 35,30 + Actor815: brik + Owner: Neutral + Location: 32,30 + Actor816: brik + Owner: Neutral + Location: 33,30 + Actor817: brik + Owner: Neutral + Location: 34,30 + Actor818: brik + Owner: Neutral + Location: 32,31 + Actor819: brik + Owner: Neutral + Location: 32,32 + Actor828: brik + Owner: Neutral + Location: 21,40 + Actor829: brik + Owner: Neutral + Location: 21,38 + Actor830: brik + Owner: Neutral + Location: 21,39 + Actor831: brik + Owner: Neutral + Location: 21,37 + Actor832: brik + Owner: Neutral + Location: 21,36 + Actor833: brik + Owner: Neutral + Location: 22,40 + Actor834: brik + Owner: Neutral + Location: 24,40 + Actor835: brik + Owner: Neutral + Location: 23,40 + Actor836: brik + Owner: Neutral + Location: 25,40 + Actor837: brik + Owner: Neutral + Location: 27,40 + Actor838: brik + Owner: Neutral + Location: 26,40 + Actor839: brik + Owner: Neutral + Location: 21,43 + Actor840: brik + Owner: Neutral + Location: 21,44 + Actor841: brik + Owner: Neutral + Location: 21,45 + Actor842: brik + Owner: Neutral + Location: 21,46 + Actor843: brik + Owner: Neutral + Location: 22,43 + Actor844: brik + Owner: Neutral + Location: 23,43 + Actor845: brik + Owner: Neutral + Location: 24,43 + Actor846: brik + Owner: Neutral + Location: 25,43 + Actor847: brik + Owner: Neutral + Location: 26,43 + Actor848: brik + Owner: Neutral + Location: 27,43 + Actor849: brik + Owner: Neutral + Location: 28,43 + Actor850: brik + Owner: Neutral + Location: 29,43 + Actor851: brik + Owner: Neutral + Location: 30,43 + Actor852: brik + Owner: Neutral + Location: 31,43 + Actor853: brik + Owner: Neutral + Location: 31,44 + Actor854: brik + Owner: Neutral + Location: 31,45 + Actor855: brik + Owner: Neutral + Location: 31,46 + Actor856: brik + Owner: Neutral + Location: 31,47 + Actor857: brik + Owner: Neutral + Location: 31,48 + Actor858: brik + Owner: Neutral + Location: 31,49 + Actor859: brik + Owner: Neutral + Location: 31,51 + Actor860: brik + Owner: Neutral + Location: 31,50 + Actor861: brik + Owner: Neutral + Location: 31,52 + Actor862: brik + Owner: Neutral + Location: 31,53 + Actor863: brik + Owner: Neutral + Location: 32,53 + Actor864: brik + Owner: Neutral + Location: 21,47 + Actor865: brik + Owner: Neutral + Location: 21,48 + Actor866: brik + Owner: Neutral + Location: 21,50 + Actor867: brik + Owner: Neutral + Location: 21,49 + Actor868: brik + Owner: Neutral + Location: 21,51 + Actor869: brik + Owner: Neutral + Location: 21,52 + Actor870: brik + Owner: Neutral + Location: 14,50 + Actor871: brik + Owner: Neutral + Location: 14,49 + Actor872: brik + Owner: Neutral + Location: 13,49 + Actor873: brik + Owner: Neutral + Location: 13,48 + Actor874: brik + Owner: Neutral + Location: 13,47 + Actor875: brik + Owner: Neutral + Location: 13,46 + Actor876: brik + Owner: Neutral + Location: 13,45 + Actor877: brik + Owner: Neutral + Location: 13,44 + Actor878: brik + Owner: Neutral + Location: 14,44 + Actor879: brik + Owner: Neutral + Location: 14,43 + Actor880: brik + Owner: Neutral + Location: 14,42 + Actor882: brik + Owner: Neutral + Location: 15,50 + Actor883: brik + Owner: Neutral + Location: 16,50 + Actor884: brik + Owner: Neutral + Location: 17,50 + Actor885: brik + Owner: Neutral + Location: 18,50 + Actor886: brik + Owner: Neutral + Location: 6,49 + Actor887: brik + Owner: Neutral + Location: 7,49 + Actor888: brik + Owner: Neutral + Location: 8,49 + Actor889: brik + Owner: Neutral + Location: 9,49 + Actor890: brik + Owner: Neutral + Location: 9,48 + Actor891: brik + Owner: Neutral + Location: 9,47 + Actor892: brik + Owner: Neutral + Location: 9,46 + Actor893: brik + Owner: Neutral + Location: 9,45 + Actor894: brik + Owner: Neutral + Location: 9,44 + Actor895: brik + Owner: Neutral + Location: 8,44 + Actor896: brik + Owner: Neutral + Location: 6,44 + Actor897: brik + Owner: Neutral + Location: 7,44 + Actor898: brik + Owner: Neutral + Location: 5,44 + Actor899: brik + Owner: Neutral + Location: 4,44 + Actor900: brik + Owner: Neutral + Location: 3,44 + Actor901: brik + Owner: Neutral + Location: 10,35 + Actor902: brik + Owner: Neutral + Location: 8,35 + Actor903: brik + Owner: Neutral + Location: 9,35 + Actor904: brik + Owner: Neutral + Location: 7,35 + Actor905: brik + Owner: Neutral + Location: 5,35 + Actor906: brik + Owner: Neutral + Location: 6,35 + Actor907: brik + Owner: Neutral + Location: 4,35 + Actor908: brik + Owner: Neutral + Location: 3,35 + Actor909: brik + Owner: Neutral + Location: 10,34 + Actor910: brik + Owner: Neutral + Location: 10,33 + Actor911: brik + Owner: Neutral + Location: 10,32 + Actor912: brik + Owner: Neutral + Location: 10,31 + Actor913: brik + Owner: Neutral + Location: 10,30 + Actor914: brik + Owner: Neutral + Location: 10,29 + Actor915: brik + Owner: Neutral + Location: 10,25 + Actor916: brik + Owner: Neutral + Location: 10,26 + Actor917: brik + Owner: Neutral + Location: 10,27 + Actor918: brik + Owner: Neutral + Location: 10,28 + Actor919: brik + Owner: Neutral + Location: 9,25 + Actor920: brik + Owner: Neutral + Location: 8,25 + Actor921: brik + Owner: Neutral + Location: 7,25 + Actor922: brik + Owner: Neutral + Location: 7,26 + Actor923: brik + Owner: Neutral + Location: 7,27 + Actor924: brik + Owner: Neutral + Location: 6,28 + Actor925: brik + Owner: Neutral + Location: 7,28 + Actor926: brik + Owner: Neutral + Location: 6,18 + Actor927: brik + Owner: Neutral + Location: 6,17 + Actor928: brik + Owner: Neutral + Location: 6,16 + Actor929: brik + Owner: Neutral + Location: 6,15 + Actor930: brik + Owner: Neutral + Location: 7,18 + Actor931: brik + Owner: Neutral + Location: 8,18 + Actor932: brik + Owner: Neutral + Location: 8,19 + Actor933: brik + Owner: Neutral + Location: 8,20 + Actor934: brik + Owner: Neutral + Location: 9,21 + Actor935: brik + Owner: Neutral + Location: 8,21 + Actor936: brik + Owner: Neutral + Location: 10,21 + Actor937: brik + Owner: Neutral + Location: 11,21 + Actor938: brik + Owner: Neutral + Location: 12,21 + Actor939: brik + Owner: Neutral + Location: 13,21 + Actor940: brik + Owner: Neutral + Location: 5,28 + Actor941: brik + Owner: Neutral + Location: 4,28 + Actor942: brik + Owner: Neutral + Location: 3,28 + Actor943: brik + Owner: Neutral + Location: 3,18 + Actor944: brik + Owner: Neutral + Location: 3,17 + Actor945: brik + Owner: Neutral + Location: 3,16 + Actor946: brik + Owner: Neutral + Location: 3,15 + Actor947: brik + Owner: Neutral + Location: 1,15 + Actor948: brik + Owner: Neutral + Location: 2,15 + Actor949: brik + Owner: Neutral + Location: 2,18 + Actor950: brik + Owner: Neutral + Location: 1,18 + Actor951: brik + Owner: Neutral + Location: 7,15 + Actor952: brik + Owner: Neutral + Location: 8,15 + Actor953: brik + Owner: Neutral + Location: 9,15 + Actor954: brik + Owner: Neutral + Location: 10,15 + Actor955: brik + Owner: Neutral + Location: 10,16 + Actor956: brik + Owner: Neutral + Location: 10,17 + Actor957: brik + Owner: Neutral + Location: 11,18 + Actor958: brik + Owner: Neutral + Location: 10,18 + Actor959: brik + Owner: Neutral + Location: 12,18 + Actor960: brik + Owner: Neutral + Location: 14,18 + Actor961: brik + Owner: Neutral + Location: 15,18 + Actor962: brik + Owner: Neutral + Location: 16,18 + Actor963: brik + Owner: Neutral + Location: 13,18 + Actor964: brik + Owner: Neutral + Location: 16,17 + Actor965: brik + Owner: Neutral + Location: 16,16 + Actor966: brik + Owner: Neutral + Location: 16,14 + Actor967: brik + Owner: Neutral + Location: 16,13 + Actor968: brik + Owner: Neutral + Location: 16,12 + Actor969: brik + Owner: Neutral + Location: 16,11 + Actor970: brik + Owner: Neutral + Location: 16,15 + Actor971: brik + Owner: Neutral + Location: 17,11 + Actor972: brik + Owner: Neutral + Location: 18,11 + Actor973: brik + Owner: Neutral + Location: 18,12 + Actor974: brik + Owner: Neutral + Location: 18,13 + Actor975: brik + Owner: Neutral + Location: 18,14 + Actor976: brik + Owner: Neutral + Location: 18,15 + Actor977: brik + Owner: Neutral + Location: 18,16 + Actor978: brik + Owner: Neutral + Location: 18,17 + Actor979: brik + Owner: Neutral + Location: 18,18 + Actor980: brik + Owner: Neutral + Location: 18,19 + Actor981: brik + Owner: Neutral + Location: 18,20 + Actor982: brik + Owner: Neutral + Location: 21,20 + Actor983: brik + Owner: Neutral + Location: 21,19 + Actor984: brik + Owner: Neutral + Location: 21,18 + Actor985: brik + Owner: Neutral + Location: 22,18 + Actor986: brik + Owner: Neutral + Location: 24,18 + Actor987: brik + Owner: Neutral + Location: 25,18 + Actor988: brik + Owner: Neutral + Location: 23,18 + Actor989: brik + Owner: Neutral + Location: 26,18 + Actor990: brik + Owner: Neutral + Location: 27,18 + Actor991: brik + Owner: Neutral + Location: 28,18 + Actor992: brik + Owner: Neutral + Location: 29,18 + Actor993: brik + Owner: Neutral + Location: 29,17 + Actor994: brik + Owner: Neutral + Location: 29,16 + Actor995: brik + Owner: Neutral + Location: 29,14 + Actor996: brik + Owner: Neutral + Location: 29,15 + Actor997: brik + Owner: Neutral + Location: 29,13 + Actor998: brik + Owner: Neutral + Location: 29,12 + Actor999: brik + Owner: Neutral + Location: 29,11 + Actor1000: brik + Owner: Neutral + Location: 31,11 + Actor1001: brik + Owner: Neutral + Location: 30,11 + Actor1002: brik + Owner: Neutral + Location: 32,11 + Actor1003: brik + Owner: Neutral + Location: 32,12 + Actor1004: brik + Owner: Neutral + Location: 32,13 + Actor1005: brik + Owner: Neutral + Location: 32,14 + Actor1006: brik + Owner: Neutral + Location: 32,15 + Actor1007: brik + Owner: Neutral + Location: 32,16 + Actor1008: brik + Owner: Neutral + Location: 32,17 + Actor1009: brik + Owner: Neutral + Location: 32,18 + Actor1010: brik + Owner: Neutral + Location: 33,18 + Actor1011: brik + Owner: Neutral + Location: 34,18 + Actor1012: brik + Owner: Neutral + Location: 35,18 + Actor1013: brik + Owner: Neutral + Location: 36,18 + Actor1014: brik + Owner: Neutral + Location: 36,17 + Actor1015: brik + Owner: Neutral + Location: 37,17 + Actor1016: brik + Owner: Neutral + Location: 38,17 + Actor1017: brik + Owner: Neutral + Location: 39,17 + Actor1018: brik + Owner: Neutral + Location: 39,18 + Actor1019: brik + Owner: Neutral + Location: 39,19 + Actor1020: brik + Owner: Neutral + Location: 39,20 + Actor1021: brik + Owner: Neutral + Location: 39,21 + Actor1022: brik + Owner: Neutral + Location: 39,22 + Actor1023: brik + Owner: Neutral + Location: 39,23 + Actor1024: brik + Owner: Neutral + Location: 39,24 + Actor1025: brik + Owner: Neutral + Location: 38,24 + Actor1026: brik + Owner: Neutral + Location: 37,24 + Actor1027: brik + Owner: Neutral + Location: 36,24 + Actor1028: brik + Owner: Neutral + Location: 35,24 + Actor1029: brik + Owner: Neutral + Location: 35,27 + Actor1030: brik + Owner: Neutral + Location: 33,27 + Actor1031: brik + Owner: Neutral + Location: 32,27 + Actor1032: brik + Owner: Neutral + Location: 32,26 + Actor1033: brik + Owner: Neutral + Location: 32,25 + Actor1034: brik + Owner: Neutral + Location: 32,24 + Actor1035: brik + Owner: Neutral + Location: 34,27 + Actor1036: brik + Owner: Neutral + Location: 35,26 + Actor1037: brik + Owner: Neutral + Location: 35,25 + Actor1038: brik + Owner: Neutral + Location: 36,12 + Actor1039: brik + Owner: Neutral + Location: 36,13 + Actor1040: brik + Owner: Neutral + Location: 36,11 + Actor1041: brik + Owner: Neutral + Location: 36,10 + Actor1042: brik + Owner: Neutral + Location: 36,9 + Actor1043: brik + Owner: Neutral + Location: 36,8 + Actor1044: brik + Owner: Neutral + Location: 36,7 + Actor1045: brik + Owner: Neutral + Location: 34,7 + Actor1046: brik + Owner: Neutral + Location: 35,7 + Actor1047: brik + Owner: Neutral + Location: 37,13 + Actor1048: brik + Owner: Neutral + Location: 38,13 + Actor1049: brik + Owner: Neutral + Location: 39,13 + Actor1050: brik + Owner: Neutral + Location: 40,13 + Actor1051: brik + Owner: Neutral + Location: 41,13 + Actor1052: brik + Owner: Neutral + Location: 42,13 + Actor1054: brik + Owner: Neutral + Location: 29,7 + Actor1055: brik + Owner: Neutral + Location: 29,5 + Actor1056: brik + Owner: Neutral + Location: 29,6 + Actor1057: brik + Owner: Neutral + Location: 29,4 + Actor1058: brik + Owner: Neutral + Location: 30,7 + Actor1059: brik + Owner: Neutral + Location: 31,7 + Actor1060: brik + Owner: Neutral + Location: 32,7 + Actor1061: brik + Owner: Neutral + Location: 33,7 + Actor1062: brik + Owner: Neutral + Location: 23,6 + Actor1063: brik + Owner: Neutral + Location: 24,6 + Actor1064: brik + Owner: Neutral + Location: 25,6 + Actor1065: brik + Owner: Neutral + Location: 25,7 + Actor1066: brik + Owner: Neutral + Location: 25,8 + Actor1067: brik + Owner: Neutral + Location: 25,9 + Actor1068: brik + Owner: Neutral + Location: 25,10 + Actor1069: brik + Owner: Neutral + Location: 25,11 + Actor1070: brik + Owner: Neutral + Location: 25,12 + Actor1071: brik + Owner: Neutral + Location: 25,13 + Actor1072: brik + Owner: Neutral + Location: 24,13 + Actor1073: brik + Owner: Neutral + Location: 23,13 + Actor1074: brik + Owner: Neutral + Location: 23,12 + Actor1075: brik + Owner: Neutral + Location: 23,11 + Actor1076: brik + Owner: Neutral + Location: 23,10 + Actor1077: brik + Owner: Neutral + Location: 23,9 + Actor1078: brik + Owner: Neutral + Location: 23,8 + Actor1079: brik + Owner: Neutral + Location: 23,7 + Actor1080: brik + Owner: Neutral + Location: 16,5 + Actor1081: brik + Owner: Neutral + Location: 17,5 + Actor1082: brik + Owner: Neutral + Location: 18,5 + Actor1083: brik + Owner: Neutral + Location: 18,4 + Actor1084: brik + Owner: Neutral + Location: 18,3 + Actor1085: brik + Owner: Neutral + Location: 18,2 + Actor1086: brik + Owner: Neutral + Location: 18,1 + Actor1087: brik + Owner: Neutral + Location: 16,4 + Actor1088: brik + Owner: Neutral + Location: 16,3 + Actor1089: brik + Owner: Neutral + Location: 16,2 + Actor1090: brik + Owner: Neutral + Location: 16,1 + Actor1091: brik + Owner: Neutral + Location: 9,8 + Actor1092: brik + Owner: Neutral + Location: 8,9 + Actor1093: brik + Owner: Neutral + Location: 9,9 + Actor1094: brik + Owner: Neutral + Location: 8,8 + Actor1095: brik + Owner: Neutral + Location: 8,7 + Actor1096: brik + Owner: Neutral + Location: 9,7 + Actor1097: brik + Owner: Neutral + Location: 8,6 + Actor1098: brik + Owner: Neutral + Location: 9,6 + Actor1099: brik + Owner: Neutral + Location: 1,14 + Actor1100: brik + Owner: Neutral + Location: 1,13 + Actor1101: brik + Owner: Neutral + Location: 14,21 + Actor1102: brik + Owner: Neutral + Location: 14,26 + Actor1103: brik + Owner: Neutral + Location: 14,24 + Actor1104: brik + Owner: Neutral + Location: 14,22 + Actor1105: brik + Owner: Neutral + Location: 14,23 + Actor1106: brik + Owner: Neutral + Location: 14,25 + Actor1107: brik + Owner: Neutral + Location: 26,92 + Actor1108: brik + Owner: Neutral + Location: 26,91 + Actor1109: brik + Owner: Neutral + Location: 26,90 + Actor1110: brik + Owner: Neutral + Location: 26,89 + Actor1111: brik + Owner: Neutral + Location: 26,88 + Actor1112: brik + Owner: Neutral + Location: 28,88 + Actor1113: brik + Owner: Neutral + Location: 27,88 + Actor1114: brik + Owner: Neutral + Location: 29,88 + Actor1115: brik + Owner: Neutral + Location: 29,87 + Actor1116: brik + Owner: Neutral + Location: 29,86 + Actor1117: brik + Owner: Neutral + Location: 29,85 + Actor1118: brik + Owner: Neutral + Location: 27,92 + Actor1119: brik + Owner: Neutral + Location: 28,92 + Actor1120: brik + Owner: Neutral + Location: 29,92 + Actor1121: brik + Owner: Neutral + Location: 29,91 + Actor1122: brik + Owner: Neutral + Location: 29,90 + Actor1123: brik + Owner: Neutral + Location: 30,90 + Actor1124: brik + Owner: Neutral + Location: 32,90 + Actor1125: brik + Owner: Neutral + Location: 32,89 + Actor1126: brik + Owner: Neutral + Location: 31,90 + Actor1127: brik + Owner: Neutral + Location: 32,88 + Actor1128: brik + Owner: Neutral + Location: 32,86 + Actor1129: brik + Owner: Neutral + Location: 32,87 + Actor1130: brik + Owner: Neutral + Location: 26,95 + Actor1131: brik + Owner: Neutral + Location: 28,95 + Actor1132: brik + Owner: Neutral + Location: 29,95 + Actor1133: brik + Owner: Neutral + Location: 27,95 + Actor1134: brik + Owner: Neutral + Location: 26,96 + Actor1135: brik + Owner: Neutral + Location: 29,96 + Actor1136: brik + Owner: Neutral + Location: 30,96 + Actor1137: brik + Owner: Neutral + Location: 25,96 + Actor1138: brik + Owner: Neutral + Location: 15,92 + Actor1139: brik + Owner: Neutral + Location: 16,92 + Actor1140: brik + Owner: Neutral + Location: 18,92 + Actor1141: brik + Owner: Neutral + Location: 17,92 + Actor1142: brik + Owner: Neutral + Location: 15,91 + Actor1143: brik + Owner: Neutral + Location: 15,90 + Actor1144: brik + Owner: Neutral + Location: 15,89 + Actor1145: brik + Owner: Neutral + Location: 15,88 + Actor1146: brik + Owner: Neutral + Location: 16,88 + Actor1147: brik + Owner: Neutral + Location: 18,88 + Actor1148: brik + Owner: Neutral + Location: 17,88 + Actor1149: brik + Owner: Neutral + Location: 18,87 + Actor1150: brik + Owner: Neutral + Location: 18,86 + Actor1151: brik + Owner: Neutral + Location: 18,85 + Actor1152: brik + Owner: Neutral + Location: 18,84 + Actor1153: brik + Owner: Neutral + Location: 18,83 + Actor1154: brik + Owner: Neutral + Location: 18,82 + Actor1155: brik + Owner: Neutral + Location: 18,91 + Actor1156: brik + Owner: Neutral + Location: 18,90 + Actor1157: brik + Owner: Neutral + Location: 20,90 + Actor1158: brik + Owner: Neutral + Location: 19,90 + Actor1159: brik + Owner: Neutral + Location: 21,90 + Actor1160: brik + Owner: Neutral + Location: 22,90 + Actor1161: brik + Owner: Neutral + Location: 22,89 + Actor1162: brik + Owner: Neutral + Location: 22,88 + Actor1163: brik + Owner: Neutral + Location: 22,87 + Actor1164: brik + Owner: Neutral + Location: 22,86 + Actor1165: brik + Owner: Neutral + Location: 15,95 + Actor1166: brik + Owner: Neutral + Location: 16,95 + Actor1167: brik + Owner: Neutral + Location: 17,95 + Actor1168: brik + Owner: Neutral + Location: 18,95 + Actor1169: brik + Owner: Neutral + Location: 18,96 + Actor1170: brik + Owner: Neutral + Location: 15,96 + Actor1171: brik + Owner: Neutral + Location: 19,96 + Actor1172: brik + Owner: Neutral + Location: 13,96 + Actor1173: brik + Owner: Neutral + Location: 14,96 + Actor1174: brik + Owner: Neutral + Location: 5,82 + Actor1175: brik + Owner: Neutral + Location: 5,81 + Actor1176: brik + Owner: Neutral + Location: 5,80 + Actor1177: brik + Owner: Neutral + Location: 5,79 + Actor1178: brik + Owner: Neutral + Location: 5,78 + Actor1179: brik + Owner: Neutral + Location: 5,77 + Actor1180: brik + Owner: Neutral + Location: 6,77 + Actor1181: brik + Owner: Neutral + Location: 7,77 + Actor1182: brik + Owner: Neutral + Location: 6,82 + Actor1183: brik + Owner: Neutral + Location: 7,82 + Actor1184: brik + Owner: Neutral + Location: 8,82 + Actor1185: brik + Owner: Neutral + Location: 9,82 + Actor1186: brik + Owner: Neutral + Location: 10,82 + Actor1187: brik + Owner: Neutral + Location: 12,82 + Actor1188: brik + Owner: Neutral + Location: 11,82 + Actor1189: brik + Owner: Neutral + Location: 7,76 + Actor1190: brik + Owner: Neutral + Location: 7,75 + Actor1191: brik + Owner: Neutral + Location: 7,74 + Actor1192: brik + Owner: Neutral + Location: 9,74 + Actor1193: brik + Owner: Neutral + Location: 10,74 + Actor1194: brik + Owner: Neutral + Location: 8,74 + Actor1195: brik + Owner: Neutral + Location: 10,75 + Actor1196: brik + Owner: Neutral + Location: 10,76 + Actor1197: brik + Owner: Neutral + Location: 10,77 + Actor1198: brik + Owner: Neutral + Location: 10,78 + Actor1199: brik + Owner: Neutral + Location: 12,78 + Actor1200: brik + Owner: Neutral + Location: 11,78 + Actor1201: brik + Owner: Neutral + Location: 13,78 + Actor1202: brik + Owner: Neutral + Location: 14,78 + Actor1203: brik + Owner: Neutral + Location: 15,78 + Actor1204: brik + Owner: Neutral + Location: 7,69 + Actor1205: brik + Owner: Neutral + Location: 7,68 + Actor1206: brik + Owner: Neutral + Location: 7,67 + Actor1207: brik + Owner: Neutral + Location: 6,67 + Actor1208: brik + Owner: Neutral + Location: 7,70 + Actor1209: brik + Owner: Neutral + Location: 9,70 + Actor1210: brik + Owner: Neutral + Location: 8,70 + Actor1211: brik + Owner: Neutral + Location: 10,70 + Actor1212: brik + Owner: Neutral + Location: 11,70 + Actor1213: brik + Owner: Neutral + Location: 12,70 + Actor1214: brik + Owner: Neutral + Location: 13,70 + Actor1215: brik + Owner: Neutral + Location: 14,70 + Actor1216: brik + Owner: Neutral + Location: 14,71 + Actor1217: brik + Owner: Neutral + Location: 14,72 + Actor1218: brik + Owner: Neutral + Location: 14,73 + Actor1219: brik + Owner: Neutral + Location: 15,73 + Actor1220: brik + Owner: Neutral + Location: 16,73 + Actor1221: brik + Owner: Neutral + Location: 17,73 + Actor1222: brik + Owner: Neutral + Location: 18,73 + Actor1223: brik + Owner: Neutral + Location: 18,72 + Actor1224: brik + Owner: Neutral + Location: 18,71 + Actor1225: brik + Owner: Neutral + Location: 18,70 + Actor1226: brik + Owner: Neutral + Location: 18,69 + Actor1227: brik + Owner: Neutral + Location: 18,68 + Actor1228: brik + Owner: Neutral + Location: 18,67 + Actor1229: brik + Owner: Neutral + Location: 18,66 + Actor1230: brik + Owner: Neutral + Location: 18,65 + Actor1231: brik + Owner: Neutral + Location: 18,64 + Actor1232: brik + Owner: Neutral + Location: 18,63 + Actor1233: brik + Owner: Neutral + Location: 18,62 + Actor1234: brik + Owner: Neutral + Location: 17,62 + Actor1235: brik + Owner: Neutral + Location: 15,62 + Actor1236: brik + Owner: Neutral + Location: 14,62 + Actor1237: brik + Owner: Neutral + Location: 16,62 + Actor1238: brik + Owner: Neutral + Location: 14,63 + Actor1239: brik + Owner: Neutral + Location: 14,64 + Actor1240: brik + Owner: Neutral + Location: 12,64 + Actor1241: brik + Owner: Neutral + Location: 13,64 + Actor1242: brik + Owner: Neutral + Location: 11,64 + Actor1243: brik + Owner: Neutral + Location: 14,58 + Actor1244: brik + Owner: Neutral + Location: 14,57 + Actor1245: brik + Owner: Neutral + Location: 14,56 + Actor1246: brik + Owner: Neutral + Location: 9,56 + Actor1247: brik + Owner: Neutral + Location: 10,56 + Actor1248: brik + Owner: Neutral + Location: 12,56 + Actor1249: brik + Owner: Neutral + Location: 11,56 + Actor1250: brik + Owner: Neutral + Location: 13,56 + Actor1251: brik + Owner: Neutral + Location: 9,55 + Actor1252: brik + Owner: Neutral + Location: 10,55 + Actor1253: brik + Owner: Neutral + Location: 11,55 + Actor1254: brik + Owner: Neutral + Location: 12,55 + Actor1255: brik + Owner: Neutral + Location: 13,55 + Actor1256: brik + Owner: Neutral + Location: 14,55 + Actor1257: brik + Owner: Neutral + Location: 14,54 + Actor1258: brik + Owner: Neutral + Location: 15,54 + Actor1259: brik + Owner: Neutral + Location: 16,54 + Actor1260: brik + Owner: Neutral + Location: 17,54 + Actor1261: brik + Owner: Neutral + Location: 18,54 + Actor1262: brik + Owner: Neutral + Location: 18,54 + Actor1263: brik + Owner: Neutral + Location: 20,54 + Actor1264: brik + Owner: Neutral + Location: 19,54 + Actor1265: brik + Owner: Neutral + Location: 15,58 + Actor1266: brik + Owner: Neutral + Location: 16,58 + Actor1267: brik + Owner: Neutral + Location: 17,58 + Actor1268: brik + Owner: Neutral + Location: 18,58 + Actor1269: brik + Owner: Neutral + Location: 19,58 + Actor1270: brik + Owner: Neutral + Location: 20,58 + Actor1271: brik + Owner: Neutral + Location: 21,58 + Actor1272: brik + Owner: Neutral + Location: 23,67 + Actor1273: brik + Owner: Neutral + Location: 23,68 + Actor1274: brik + Owner: Neutral + Location: 23,69 + Actor1275: brik + Owner: Neutral + Location: 24,69 + Actor1276: brik + Owner: Neutral + Location: 26,69 + Actor1277: brik + Owner: Neutral + Location: 25,69 + Actor1278: brik + Owner: Neutral + Location: 27,69 + Actor1279: brik + Owner: Neutral + Location: 27,68 + Actor1280: brik + Owner: Neutral + Location: 27,67 + Actor1281: brik + Owner: Neutral + Location: 24,67 + Actor1282: brik + Owner: Neutral + Location: 25,67 + Actor1283: brik + Owner: Neutral + Location: 26,67 + Actor1284: brik + Owner: Neutral + Location: 42,82 + Actor1285: brik + Owner: Neutral + Location: 42,83 + Actor1286: brik + Owner: Neutral + Location: 41,83 + Actor1287: brik + Owner: Neutral + Location: 40,83 + Actor1288: brik + Owner: Neutral + Location: 43,82 + Actor1289: brik + Owner: Neutral + Location: 55,82 + Actor1290: brik + Owner: Neutral + Location: 56,82 + Actor1291: brik + Owner: Neutral + Location: 54,82 + Actor1292: brik + Owner: Neutral + Location: 56,83 + Actor1293: brik + Owner: Neutral + Location: 57,83 + Actor1294: brik + Owner: Neutral + Location: 58,83 + Actor1296: brik + Owner: Neutral + Location: 84,82 + Actor1297: brik + Owner: Neutral + Location: 83,82 + Actor1298: brik + Owner: Neutral + Location: 82,82 + Actor1299: brik + Owner: Neutral + Location: 84,81 + Actor1300: brik + Owner: Neutral + Location: 84,80 + Actor1301: brik + Owner: Neutral + Location: 84,79 + Actor1302: brik + Owner: Neutral + Location: 84,78 + Actor1303: brik + Owner: Neutral + Location: 84,77 + Actor1304: brik + Owner: Neutral + Location: 84,76 + Actor1305: brik + Owner: Neutral + Location: 84,75 + Actor1306: brik + Owner: Neutral + Location: 84,74 + Actor1307: brik + Owner: Neutral + Location: 83,74 + Actor1308: brik + Owner: Neutral + Location: 82,74 + Actor1309: brik + Owner: Neutral + Location: 87,74 + Actor1310: brik + Owner: Neutral + Location: 88,74 + Actor1311: brik + Owner: Neutral + Location: 86,74 + Actor1312: brik + Owner: Neutral + Location: 86,75 + Actor1313: brik + Owner: Neutral + Location: 86,76 + Actor1314: brik + Owner: Neutral + Location: 86,77 + Actor1315: brik + Owner: Neutral + Location: 86,78 + Actor1316: brik + Owner: Neutral + Location: 86,79 + Actor1317: brik + Owner: Neutral + Location: 86,80 + Actor1318: brik + Owner: Neutral + Location: 86,81 + Actor1319: brik + Owner: Neutral + Location: 86,82 + Actor1320: brik + Owner: Neutral + Location: 87,82 + Actor1321: brik + Owner: Neutral + Location: 88,82 + Actor1322: brik + Owner: Neutral + Location: 89,82 + Actor1323: brik + Owner: Neutral + Location: 90,82 + Actor1324: brik + Owner: Neutral + Location: 90,81 + Actor1325: brik + Owner: Neutral + Location: 90,80 + Actor1326: brik + Owner: Neutral + Location: 90,79 + Actor1327: brik + Owner: Neutral + Location: 90,78 + Actor1328: brik + Owner: Neutral + Location: 90,77 + Actor1329: brik + Owner: Neutral + Location: 90,76 + Actor1330: brik + Owner: Neutral + Location: 90,75 + Actor1331: brik + Owner: Neutral + Location: 90,74 + Actor1332: brik + Owner: Neutral + Location: 94,79 + Actor1333: brik + Owner: Neutral + Location: 95,79 + Actor1334: brik + Owner: Neutral + Location: 96,79 + Actor1335: brik + Owner: Neutral + Location: 94,80 + Actor1336: brik + Owner: Neutral + Location: 94,81 + Actor1337: brik + Owner: Neutral + Location: 94,82 + Actor1338: brik + Owner: Neutral + Location: 95,82 + Actor1339: brik + Owner: Neutral + Location: 96,82 + Actor1340: brik + Owner: Neutral + Location: 96,78 + Actor1341: brik + Owner: Neutral + Location: 96,77 + Actor1342: brik + Owner: Neutral + Location: 96,75 + Actor1343: brik + Owner: Neutral + Location: 96,76 + Actor1344: brik + Owner: Neutral + Location: 96,74 + Actor1345: brik + Owner: Neutral + Location: 90,73 + Actor1346: brik + Owner: Neutral + Location: 90,72 + Actor1347: brik + Owner: Neutral + Location: 90,71 + Actor1348: brik + Owner: Neutral + Location: 88,71 + Actor1349: brik + Owner: Neutral + Location: 89,71 + Actor1350: brik + Owner: Neutral + Location: 88,72 + Actor1351: brik + Owner: Neutral + Location: 88,73 + Actor1352: brik + Owner: Neutral + Location: 82,73 + Actor1374: brik + Owner: Neutral + Location: 82,52 + Actor1375: brik + Owner: Neutral + Location: 83,52 + Actor1376: brik + Owner: Neutral + Location: 83,51 + Actor1377: brik + Owner: Neutral + Location: 83,50 + Actor1378: brik + Owner: Neutral + Location: 82,50 + Actor1379: brik + Owner: Neutral + Location: 87,50 + Actor1380: brik + Owner: Neutral + Location: 87,51 + Actor1381: brik + Owner: Neutral + Location: 87,52 + Actor1382: brik + Owner: Neutral + Location: 88,52 + Actor1383: brik + Owner: Neutral + Location: 89,52 + Actor1384: brik + Owner: Neutral + Location: 90,52 + Actor1385: brik + Owner: Neutral + Location: 91,52 + Actor1386: brik + Owner: Neutral + Location: 92,52 + Actor1387: brik + Owner: Neutral + Location: 93,52 + Actor1388: brik + Owner: Neutral + Location: 94,52 + Actor1389: brik + Owner: Neutral + Location: 95,52 + Actor1390: brik + Owner: Neutral + Location: 87,46 + Actor1391: brik + Owner: Neutral + Location: 89,46 + Actor1392: brik + Owner: Neutral + Location: 90,46 + Actor1393: brik + Owner: Neutral + Location: 88,46 + Actor1394: brik + Owner: Neutral + Location: 87,47 + Actor1395: brik + Owner: Neutral + Location: 87,48 + Actor1396: brik + Owner: Neutral + Location: 87,49 + Actor1397: brik + Owner: Neutral + Location: 90,47 + Actor1398: brik + Owner: Neutral + Location: 90,48 + Actor1399: brik + Owner: Neutral + Location: 90,49 + Actor1400: brik + Owner: Neutral + Location: 91,49 + Actor1401: brik + Owner: Neutral + Location: 92,49 + Actor1402: brik + Owner: Neutral + Location: 93,49 + Actor1403: brik + Owner: Neutral + Location: 90,42 + Actor1404: brik + Owner: Neutral + Location: 89,42 + Actor1405: brik + Owner: Neutral + Location: 88,42 + Actor1406: brik + Owner: Neutral + Location: 87,42 + Actor1407: brik + Owner: Neutral + Location: 87,37 + Actor1408: brik + Owner: Neutral + Location: 87,38 + Actor1409: brik + Owner: Neutral + Location: 87,39 + Actor1410: brik + Owner: Neutral + Location: 87,40 + Actor1411: brik + Owner: Neutral + Location: 87,41 + Actor1412: brik + Owner: Neutral + Location: 90,41 + Actor1413: brik + Owner: Neutral + Location: 90,40 + Actor1414: brik + Owner: Neutral + Location: 90,39 + Actor1415: brik + Owner: Neutral + Location: 90,39 + Actor1416: brik + Owner: Neutral + Location: 92,39 + Actor1417: brik + Owner: Neutral + Location: 91,39 + Actor1418: brik + Owner: Neutral + Location: 93,39 + Actor1419: brik + Owner: Neutral + Location: 76,46 + Actor1420: brik + Owner: Neutral + Location: 76,47 + Actor1421: brik + Owner: Neutral + Location: 77,47 + Actor1422: brik + Owner: Neutral + Location: 77,46 + Actor1423: brik + Owner: Neutral + Location: 78,46 + Actor1424: brik + Owner: Neutral + Location: 78,47 + Actor1425: brik + Owner: Neutral + Location: 79,47 + Actor1426: brik + Owner: Neutral + Location: 80,47 + Actor1427: brik + Owner: Neutral + Location: 81,47 + Actor1428: brik + Owner: Neutral + Location: 82,47 + Actor1429: brik + Owner: Neutral + Location: 83,47 + Actor1430: brik + Owner: Neutral + Location: 83,46 + Actor1431: brik + Owner: Neutral + Location: 83,45 + Actor1432: brik + Owner: Neutral + Location: 83,44 + Actor1433: brik + Owner: Neutral + Location: 83,43 + Actor1434: brik + Owner: Neutral + Location: 83,42 + Actor1435: brik + Owner: Neutral + Location: 83,41 + Actor1436: brik + Owner: Neutral + Location: 83,40 + Actor1437: brik + Owner: Neutral + Location: 78,40 + Actor1442: brik + Owner: Neutral + Location: 78,41 + Actor1443: brik + Owner: Neutral + Location: 78,42 + Actor1444: brik + Owner: Neutral + Location: 78,43 + Actor1445: brik + Owner: Neutral + Location: 78,44 + Actor1446: brik + Owner: Neutral + Location: 78,45 + Actor1438: brik + Owner: Neutral + Location: 79,40 + Actor1439: brik + Owner: Neutral + Location: 80,40 + Actor1440: brik + Owner: Neutral + Location: 81,40 + Actor1441: brik + Owner: Neutral + Location: 82,40 + Actor1447: brik + Owner: Neutral + Location: 71,46 + Actor1448: brik + Owner: Neutral + Location: 72,46 + Actor1449: brik + Owner: Neutral + Location: 73,46 + Actor1450: brik + Owner: Neutral + Location: 73,47 + Actor1451: brik + Owner: Neutral + Location: 73,48 + Actor1452: brik + Owner: Neutral + Location: 73,50 + Actor1453: brik + Owner: Neutral + Location: 73,49 + Actor1454: brik + Owner: Neutral + Location: 74,50 + Actor1455: brik + Owner: Neutral + Location: 70,46 + Actor1456: brik + Owner: Neutral + Location: 69,46 + Actor1458: brik + Owner: Neutral + Location: 71,30 + Actor1459: brik + Owner: Neutral + Location: 70,30 + Actor1460: brik + Owner: Neutral + Location: 69,30 + Actor1461: brik + Owner: Neutral + Location: 67,30 + Actor1462: brik + Owner: Neutral + Location: 67,29 + Actor1463: brik + Owner: Neutral + Location: 69,29 + Actor1464: brik + Owner: Neutral + Location: 70,29 + Actor1465: brik + Owner: Neutral + Location: 71,29 + Actor1466: brik + Owner: Neutral + Location: 68,29 + Actor1467: brik + Owner: Neutral + Location: 67,31 + Actor1468: brik + Owner: Neutral + Location: 67,32 + Actor1469: brik + Owner: Neutral + Location: 67,33 + Actor1470: brik + Owner: Neutral + Location: 67,34 + Actor1471: brik + Owner: Neutral + Location: 67,35 + Actor1472: brik + Owner: Neutral + Location: 69,34 + Actor1473: brik + Owner: Neutral + Location: 69,33 + Actor1474: brik + Owner: Neutral + Location: 69,32 + Actor1475: brik + Owner: Neutral + Location: 69,31 + Actor1476: brik + Owner: Neutral + Location: 75,28 + Actor1477: brik + Owner: Neutral + Location: 75,29 + Actor1478: brik + Owner: Neutral + Location: 75,30 + Actor1479: brik + Owner: Neutral + Location: 77,30 + Actor1480: brik + Owner: Neutral + Location: 78,30 + Actor1481: brik + Owner: Neutral + Location: 76,30 + Actor1482: brik + Owner: Neutral + Location: 78,29 + Actor1483: brik + Owner: Neutral + Location: 78,28 + Actor1484: brik + Owner: Neutral + Location: 78,27 + Actor1485: brik + Owner: Neutral + Location: 78,26 + Actor1486: brik + Owner: Neutral + Location: 78,25 + Actor1487: brik + Owner: Neutral + Location: 88,37 + Actor1488: brik + Owner: Neutral + Location: 89,37 + Actor1489: brik + Owner: Neutral + Location: 90,37 + Actor1490: brik + Owner: Neutral + Location: 91,37 + Actor1491: brik + Owner: Neutral + Location: 64,30 + Actor1492: brik + Owner: Neutral + Location: 63,30 + Actor1493: brik + Owner: Neutral + Location: 62,30 + Actor1494: brik + Owner: Neutral + Location: 62,29 + Actor1495: brik + Owner: Neutral + Location: 62,28 + Actor1496: brik + Owner: Neutral + Location: 62,27 + Actor1497: brik + Owner: Neutral + Location: 62,26 + Actor1498: brik + Owner: Neutral + Location: 64,25 + Actor1499: brik + Owner: Neutral + Location: 64,26 + Actor1500: brik + Owner: Neutral + Location: 64,28 + Actor1501: brik + Owner: Neutral + Location: 64,27 + Actor1502: brik + Owner: Neutral + Location: 64,29 + Actor1503: brik + Owner: Neutral + Location: 62,25 + Actor1504: brik + Owner: Neutral + Location: 62,24 + Actor1505: brik + Owner: Neutral + Location: 62,23 + Actor1506: brik + Owner: Neutral + Location: 62,22 + Actor1508: brik + Owner: Neutral + Location: 64,23 + Actor1509: brik + Owner: Neutral + Location: 64,24 + Actor1510: brik + Owner: Neutral + Location: 62,21 + Actor1511: brik + Owner: Neutral + Location: 62,20 + Actor1512: brik + Owner: Neutral + Location: 56,20 + Actor1513: brik + Owner: Neutral + Location: 57,20 + Actor1514: brik + Owner: Neutral + Location: 58,20 + Actor1515: brik + Owner: Neutral + Location: 58,21 + Actor1516: brik + Owner: Neutral + Location: 58,22 + Actor1517: brik + Owner: Neutral + Location: 58,24 + Actor1518: brik + Owner: Neutral + Location: 58,23 + Actor1519: brik + Owner: Neutral + Location: 58,25 + Actor1520: brik + Owner: Neutral + Location: 58,26 + Actor1521: brik + Owner: Neutral + Location: 58,27 + Actor1522: brik + Owner: Neutral + Location: 58,28 + Actor1523: brik + Owner: Neutral + Location: 58,29 + Actor1524: brik + Owner: Neutral + Location: 58,30 + Actor1525: brik + Owner: Neutral + Location: 57,30 + Actor1526: brik + Owner: Neutral + Location: 56,30 + Actor1527: brik + Owner: Neutral + Location: 55,30 + Actor1528: brik + Owner: Neutral + Location: 54,30 + Actor1529: brik + Owner: Neutral + Location: 53,30 + Actor1530: brik + Owner: Neutral + Location: 53,31 + Actor1531: brik + Owner: Neutral + Location: 53,16 + Actor1532: brik + Owner: Neutral + Location: 53,15 + Actor1533: brik + Owner: Neutral + Location: 53,14 + Actor1534: brik + Owner: Neutral + Location: 53,13 + Actor1535: brik + Owner: Neutral + Location: 53,12 + Actor1537: brik + Owner: Neutral + Location: 53,11 + Actor1538: brik + Owner: Neutral + Location: 54,16 + Actor1539: brik + Owner: Neutral + Location: 55,16 + Actor1540: brik + Owner: Neutral + Location: 56,16 + Actor1541: brik + Owner: Neutral + Location: 57,16 + Actor1542: brik + Owner: Neutral + Location: 58,16 + Actor1543: brik + Owner: Neutral + Location: 59,16 + Actor1544: brik + Owner: Neutral + Location: 53,10 + Actor1545: brik + Owner: Neutral + Location: 50,20 + Actor1546: brik + Owner: Neutral + Location: 51,20 + Actor1547: brik + Owner: Neutral + Location: 52,20 + Actor1548: brik + Owner: Neutral + Location: 53,20 + Actor1549: brik + Owner: Neutral + Location: 55,20 + Actor1550: brik + Owner: Neutral + Location: 54,20 + Actor1551: brik + Owner: Neutral + Location: 43,24 + Actor1552: brik + Owner: Neutral + Location: 43,23 + Actor1553: brik + Owner: Neutral + Location: 43,22 + Actor1558: brik + Owner: Neutral + Location: 44,24 + Actor1559: brik + Owner: Neutral + Location: 45,24 + Actor1560: brik + Owner: Neutral + Location: 46,24 + Actor1561: brik + Owner: Neutral + Location: 47,24 + Actor1562: brik + Owner: Neutral + Location: 48,24 + Actor1563: brik + Owner: Neutral + Location: 49,24 + Actor1564: brik + Owner: Neutral + Location: 49,37 + Actor1565: brik + Owner: Neutral + Location: 49,36 + Actor1566: brik + Owner: Neutral + Location: 49,35 + Actor1567: brik + Owner: Neutral + Location: 49,34 + Actor1568: brik + Owner: Neutral + Location: 49,33 + Actor1569: brik + Owner: Neutral + Location: 49,32 + Actor1570: brik + Owner: Neutral + Location: 49,31 + Actor1571: brik + Owner: Neutral + Location: 53,32 + Actor1572: brik + Owner: Neutral + Location: 53,33 + Actor1573: brik + Owner: Neutral + Location: 53,34 + Actor1574: brik + Owner: Neutral + Location: 53,35 + Actor1575: brik + Owner: Neutral + Location: 53,36 + Actor1576: brik + Owner: Neutral + Location: 53,37 + Actor1577: brik + Owner: Neutral + Location: 51,37 + Actor1578: brik + Owner: Neutral + Location: 50,37 + Actor1579: brik + Owner: Neutral + Location: 52,37 + Actor1580: brik + Owner: Neutral + Location: 49,43 + Actor1581: brik + Owner: Neutral + Location: 50,43 + Actor1582: brik + Owner: Neutral + Location: 51,43 + Actor1583: brik + Owner: Neutral + Location: 52,43 + Actor1584: brik + Owner: Neutral + Location: 53,43 + Actor1585: brik + Owner: Neutral + Location: 53,44 + Actor1586: brik + Owner: Neutral + Location: 53,45 + Actor1587: brik + Owner: Neutral + Location: 53,46 + Actor1588: brik + Owner: Neutral + Location: 53,47 + Actor1589: brik + Owner: Neutral + Location: 53,48 + Actor1590: brik + Owner: Neutral + Location: 49,44 + Actor1591: brik + Owner: Neutral + Location: 49,45 + Actor1592: brik + Owner: Neutral + Location: 49,46 + Actor1593: brik + Owner: Neutral + Location: 49,47 + Actor1594: brik + Owner: Neutral + Location: 49,48 + Actor1595: brik + Owner: Neutral + Location: 49,49 + Actor1596: brik + Owner: Neutral + Location: 53,49 + Actor1597: brik + Owner: Neutral + Location: 54,49 + Actor1598: brik + Owner: Neutral + Location: 56,49 + Actor1599: brik + Owner: Neutral + Location: 55,49 + Actor1600: brik + Owner: Neutral + Location: 49,52 + Actor1601: brik + Owner: Neutral + Location: 49,51 + Actor1602: brik + Owner: Neutral + Location: 49,50 + Actor1610: brik + Owner: Neutral + Location: 61,6 + Actor1611: brik + Owner: Neutral + Location: 63,6 + Actor1612: brik + Owner: Neutral + Location: 62,6 + Actor1613: brik + Owner: Neutral + Location: 64,6 + Actor1614: brik + Owner: Neutral + Location: 64,7 + Actor1615: brik + Owner: Neutral + Location: 61,7 + Actor1616: brik + Owner: Neutral + Location: 64,8 + Actor1617: brik + Owner: Neutral + Location: 64,9 + Actor1618: brik + Owner: Neutral + Location: 60,7 + Actor1619: brik + Owner: Neutral + Location: 47,5 + Actor1620: brik + Owner: Neutral + Location: 46,5 + Actor1621: brik + Owner: Neutral + Location: 44,5 + Actor1622: brik + Owner: Neutral + Location: 45,5 + Actor1623: brik + Owner: Neutral + Location: 43,5 + Actor1624: brik + Owner: Neutral + Location: 42,5 + Actor1625: brik + Owner: Neutral + Location: 47,6 + Actor1626: brik + Owner: Neutral + Location: 47,7 + Actor1627: brik + Owner: Neutral + Location: 47,8 + Actor1628: brik + Owner: Neutral + Location: 47,9 + Actor1629: brik + Owner: Neutral + Location: 53,7 + Actor1630: brik + Owner: Neutral + Location: 54,7 + Actor1631: brik + Owner: Neutral + Location: 56,7 + Actor1632: brik + Owner: Neutral + Location: 57,7 + Actor1633: brik + Owner: Neutral + Location: 55,7 + Actor1634: brik + Owner: Neutral + Location: 53,8 + Actor1635: brik + Owner: Neutral + Location: 53,9 + Actor1636: brik + Owner: Neutral + Location: 58,7 + Actor1637: brik + Owner: Neutral + Location: 59,7 + Actor1638: brik + Owner: Neutral + Location: 69,6 + Actor1639: brik + Owner: Neutral + Location: 69,7 + Actor1640: brik + Owner: Neutral + Location: 69,8 + Actor1641: brik + Owner: Neutral + Location: 69,9 + Actor1642: brik + Owner: Neutral + Location: 70,9 + Actor1643: brik + Owner: Neutral + Location: 70,8 + Actor1644: brik + Owner: Neutral + Location: 70,7 + Actor1645: brik + Owner: Neutral + Location: 70,6 + Actor1646: brik + Owner: Neutral + Location: 75,7 + Actor1647: brik + Owner: Neutral + Location: 76,7 + Actor1648: brik + Owner: Neutral + Location: 77,7 + Actor1649: brik + Owner: Neutral + Location: 78,7 + Actor1650: brik + Owner: Neutral + Location: 78,8 + Actor1651: brik + Owner: Neutral + Location: 78,9 + Actor1652: brik + Owner: Neutral + Location: 78,10 + Actor1653: brik + Owner: Neutral + Location: 75,8 + Actor1654: brik + Owner: Neutral + Location: 75,9 + Actor1655: brik + Owner: Neutral + Location: 75,10 + Actor1656: brik + Owner: Neutral + Location: 75,11 + Actor1657: brik + Owner: Neutral + Location: 75,11 + Actor1658: brik + Owner: Neutral + Location: 78,11 + Actor1659: brik + Owner: Neutral + Location: 78,12 + Actor1660: brik + Owner: Neutral + Location: 78,13 + Actor1661: brik + Owner: Neutral + Location: 75,12 + Actor1662: brik + Owner: Neutral + Location: 75,13 + Actor1663: brik + Owner: Neutral + Location: 78,14 + Actor1664: brik + Owner: Neutral + Location: 88,15 + Actor1665: brik + Owner: Neutral + Location: 89,15 + Actor1666: brik + Owner: Neutral + Location: 89,16 + Actor1667: brik + Owner: Neutral + Location: 89,17 + Actor1668: brik + Owner: Neutral + Location: 86,15 + Actor1669: brik + Owner: Neutral + Location: 87,15 + Actor1670: brik + Owner: Neutral + Location: 89,18 + Actor1671: brik + Owner: Neutral + Location: 85,8 + Actor1672: brik + Owner: Neutral + Location: 85,7 + Actor1673: brik + Owner: Neutral + Location: 85,6 + Actor1674: brik + Owner: Neutral + Location: 86,6 + Actor1675: brik + Owner: Neutral + Location: 86,7 + Actor1676: brik + Owner: Neutral + Location: 86,8 + Actor1677: brik + Owner: Neutral + Location: 85,9 + Actor1678: brik + Owner: Neutral + Location: 86,9 + Actor1679: brik + Owner: Neutral + Location: 75,2 + Actor1680: brik + Owner: Neutral + Location: 75,3 + Actor1681: brik + Owner: Neutral + Location: 75,1 + Actor1682: brik + Owner: Neutral + Location: 76,3 + Actor1683: brik + Owner: Neutral + Location: 77,3 + Actor1684: brik + Owner: Neutral + Location: 77,2 + Actor1685: brik + Owner: Neutral + Location: 77,1 + Actor1727: brik + Owner: Neutral + Location: 24,34 + Actor1728: brik + Owner: Neutral + Location: 28,34 + Actor1729: brik + Owner: Neutral + Location: 24,35 + Actor1732: brik + Owner: Neutral + Location: 28,35 + Actor1733: brik + Owner: Neutral + Location: 24,36 + Actor1734: brik + Owner: Neutral + Location: 25,36 + Actor1735: brik + Owner: Neutral + Location: 26,36 + Actor1736: brik + Owner: Neutral + Location: 27,36 + Actor1737: brik + Owner: Neutral + Location: 28,36 + Actor1607: brik + Owner: Neutral + Location: 28,33 + Actor1608: brik + Owner: Neutral + Location: 29,33 + Actor1609: brik + Owner: Neutral + Location: 30,33 + Actor1726: brik + Owner: Neutral + Location: 31,33 + Actor1738: brik + Owner: Neutral + Location: 32,33 + Commando: rmbo + Owner: GDI + SubCell: 3 + Location: 92,7 + Facing: 384 + Actor1507: brik + Owner: Neutral + Location: 67,19 + Actor1536: brik + Owner: Neutral + Location: 67,20 + Actor1603: brik + Owner: Neutral + Location: 67,21 + Actor1604: brik + Owner: Neutral + Location: 64,22 + Actor1605: brik + Owner: Neutral + Location: 65,22 + Actor1606: brik + Owner: Neutral + Location: 66,22 + Actor1686: brik + Owner: Neutral + Location: 67,22 + Actor1688: brik + Owner: Neutral + Location: 72,19 + Actor1689: brik + Owner: Neutral + Location: 72,20 + Actor1690: brik + Owner: Neutral + Location: 72,21 + Actor1691: brik + Owner: Neutral + Location: 72,22 + Actor1692: brik + Owner: Neutral + Location: 73,22 + Actor1693: brik + Owner: Neutral + Location: 74,22 + Actor1687: brik + Owner: Neutral + Location: 66,14 + Actor1694: brik + Owner: Neutral + Location: 67,14 + Actor1695: brik + Owner: Neutral + Location: 67,15 + Actor1696: brik + Owner: Neutral + Location: 67,16 + Actor1697: brik + Owner: Neutral + Location: 65,14 + Actor1698: brik + Owner: Neutral + Location: 72,14 + Actor1699: brik + Owner: Neutral + Location: 73,14 + Actor1700: brik + Owner: Neutral + Location: 72,15 + Actor1701: brik + Owner: Neutral + Location: 72,16 + Actor1702: brik + Owner: Neutral + Location: 74,14 + Actor1703: brik + Owner: Neutral + Location: 78,66 + Actor1704: brik + Owner: Neutral + Location: 78,67 + Actor1705: brik + Owner: Neutral + Location: 79,67 + Actor1706: brik + Owner: Neutral + Location: 78,71 + Actor1707: brik + Owner: Neutral + Location: 79,71 + Actor1708: brik + Owner: Neutral + Location: 78,72 + Actor1710: brik + Owner: Neutral + Location: 82,67 + Actor1711: brik + Owner: Neutral + Location: 82,71 + Actor1712: brik + Owner: Neutral + Location: 82,72 + Actor1713: brik + Owner: Neutral + Location: 80,67 + Actor1714: brik + Owner: Neutral + Location: 80,71 + Actor1715: brik + Owner: Neutral + Location: 81,67 + Actor1716: brik + Owner: Neutral + Location: 81,71 + Tanya: e7 + Owner: Neutral + SubCell: 3 + Location: 92,41 + Health: 23 + Facing: 384 + Actor1295: s1 + Owner: Scrin + SubCell: 3 + Location: 76,5 + Facing: 729 + Actor1717: s1 + Owner: Scrin + SubCell: 3 + Location: 75,6 + Facing: 737 + Actor1718: s1 + Owner: Scrin + SubCell: 3 + Location: 74,4 + Facing: 666 + Actor1719: s2 + Owner: Scrin + SubCell: 3 + Location: 73,6 + Facing: 721 + Actor1053: brik + Owner: Neutral + Location: 43,13 + Actor1557: brik + Owner: Neutral + Location: 43,21 + Actor1554: brik + Owner: Neutral + Location: 43,15 + Actor1555: brik + Owner: Neutral + Location: 47,15 + Actor1556: brik + Owner: Neutral + Location: 43,16 + Actor1720: brik + Owner: Neutral + Location: 44,16 + Actor1721: brik + Owner: Neutral + Location: 45,16 + Actor1722: brik + Owner: Neutral + Location: 46,16 + Actor1724: brik + Owner: Neutral + Location: 43,20 + Actor1725: brik + Owner: Neutral + Location: 44,20 + Actor1730: brik + Owner: Neutral + Location: 45,20 + Actor1731: brik + Owner: Neutral + Location: 46,20 + Actor1723: brik + Owner: Neutral + Location: 47,16 + Actor1739: brik + Owner: Neutral + Location: 43,14 + Actor1740: brik + Owner: Neutral + Location: 47,14 + Actor1741: brik + Owner: Neutral + Location: 47,13 + Actor1742: brik + Owner: Neutral + Location: 31,73 + Actor1743: brik + Owner: Neutral + Location: 32,73 + Actor1744: brik + Owner: Neutral + Location: 33,73 + Actor1745: brik + Owner: Neutral + Location: 34,73 + Actor1746: brik + Owner: Neutral + Location: 35,73 + Actor1747: brik + Owner: Neutral + Location: 36,73 + Actor1748: brik + Owner: Neutral + Location: 37,73 + Actor1749: brik + Owner: Neutral + Location: 38,73 + Actor1750: silo.scrin + Owner: Scrin + Location: 86,12 + Actor1751: silo.scrin + Owner: Scrin + Location: 88,13 + Actor1752: silo.scrin + Owner: Scrin + Location: 89,11 + SiloA5: silo.scrinblue + Owner: Scrin + Location: 89,89 + SiloA4: silo.scrinblue + Owner: Scrin + Location: 88,87 + Actor1755: silo.scrinblue + Owner: Scrin + Location: 87,90 + Actor1756: silo.scrinblue + Owner: Scrin + Location: 88,93 + Actor1757: silo.scrinblue + Owner: Scrin + Location: 89,91 + Actor1758: silo.scrinblue + Owner: Scrin + Location: 91,91 + SiloA6: silo.scrinblue + Owner: Scrin + Location: 92,88 + SiloA3: silo.scrinblue + Owner: Scrin + Location: 91,87 + Actor1761: silo.scrinblue + Owner: Scrin + Location: 92,90 + SiloA1: silo.scrinblue + Owner: Scrin + Location: 86,86 + Actor1763: silo.scrinblue + Owner: Scrin + Location: 86,93 + Actor1764: silo.scrinblue + Owner: Scrin + Location: 92,92 + SiloA2: silo.scrinblue + Owner: Scrin + Location: 91,85 + Actor1766: silo.scrinblue + Owner: Scrin + Location: 90,94 + Actor1767: silo.scrinblue + Owner: Scrin + Location: 47,88 + Actor1768: silo.scrinblue + Owner: Scrin + Location: 48,87 + Actor1769: silo.scrinblue + Owner: Scrin + Location: 50,88 + Actor1770: silo.scrinblue + Owner: Scrin + Location: 51,86 + Actor1771: silo.scrinblue + Owner: Scrin + Location: 49,86 + Actor1772: silo.scrinblue + Owner: Scrin + Location: 49,89 + Actor1773: silo.scrinblue + Owner: Scrin + Location: 46,87 + Actor1774: silo.scrinblue + Owner: Scrin + Location: 48,91 + Actor1775: silo.scrinblue + Owner: Scrin + Location: 51,93 + Actor1776: silo.scrinblue + Owner: Scrin + Location: 50,92 + Actor1777: silo.scrinblue + Owner: Scrin + Location: 52,91 + Actor1778: silo.scrinblue + Owner: Scrin + Location: 52,89 + Actor1779: silo.scrinblue + Owner: Scrin + Location: 47,92 + Actor1780: silo.scrinblue + Owner: Scrin + Location: 46,90 + Actor1781: silo.scrinblue + Owner: Scrin + Location: 51,90 + Actor1782: silo.scrinblue + Owner: Scrin + Location: 52,87 + Actor1783: silo.scrinblue + Owner: Scrin + Location: 46,94 + Actor1784: silo.scrinblue + Owner: Scrin + Location: 7,89 + Actor1785: silo.scrinblue + Owner: Scrin + Location: 5,90 + Actor1786: silo.scrinblue + Owner: Scrin + Location: 6,88 + Actor1787: silo.scrinblue + Owner: Scrin + Location: 7,87 + Actor1788: silo.scrinblue + Owner: Scrin + Location: 9,86 + Actor1789: silo.scrinblue + Owner: Scrin + Location: 9,88 + Actor1790: silo.scrinblue + Owner: Scrin + Location: 8,89 + Actor1791: silo.scrinblue + Owner: Scrin + Location: 8,91 + Actor1792: silo.scrinblue + Owner: Scrin + Location: 7,92 + Actor1793: silo.scrinblue + Owner: Scrin + Location: 7,90 + Actor1794: silo.scrinblue + Owner: Scrin + Location: 10,91 + Actor1795: silo.scrinblue + Owner: Scrin + Location: 9,90 + Actor1796: silo.scrinblue + Owner: Scrin + Location: 12,89 + Actor1797: silo.scrinblue + Owner: Scrin + Location: 11,87 + Actor1798: silo.scrinblue + Owner: Scrin + Location: 5,86 + Actor1799: silo.scrinblue + Owner: Scrin + Location: 9,93 + Actor1800: silo.scrinblue + Owner: Scrin + Location: 12,85 + Actor1801: silo.scrinblue + Owner: Scrin + Location: 7,85 + Actor1802: silo.scrinblue + Owner: Scrin + Location: 38,46 + Actor1803: silo.scrinblue + Owner: Scrin + Location: 37,47 + Actor1804: silo.scrinblue + Owner: Scrin + Location: 39,48 + Actor1805: silo.scrinblue + Owner: Scrin + Location: 37,49 + Actor1806: silo.scrinblue + Owner: Scrin + Location: 36,48 + Actor1807: silo.scrinblue + Owner: Scrin + Location: 36,46 + Actor1808: silo.scrinblue + Owner: Scrin + Location: 34,45 + Actor1809: silo.scrinblue + Owner: Scrin + Location: 34,50 + Actor1810: silo.scrinblue + Owner: Scrin + Location: 42,42 + Actor1811: silo.scrinblue + Owner: Scrin + Location: 43,43 + Actor1812: silo.scrinblue + Owner: Scrin + Location: 45,42 + Actor1813: silo.scrinblue + Owner: Scrin + Location: 43,40 + Actor1814: silo.scrinblue + Owner: Scrin + Location: 45,39 + Actor1815: silo.scrinblue + Owner: Scrin + Location: 41,44 + Actor1816: silo.scrinblue + Owner: Scrin + Location: 7,6 + Actor1817: silo.scrinblue + Owner: Scrin + Location: 5,7 + Actor1818: silo.scrinblue + Owner: Scrin + Location: 7,9 + Actor1819: silo.scrinblue + Owner: Scrin + Location: 6,11 + Actor1820: silo.scrinblue + Owner: Scrin + Location: 5,10 + Actor1821: silo.scrinblue + Owner: Scrin + Location: 6,8 + Actor1822: silo.scrinblue + Owner: Scrin + Location: 3,6 + Actor1823: silo.scrinblue + Owner: Scrin + Location: 5,4 + Actor1824: silo.scrinblue + Owner: Scrin + Location: 10,5 + Actor1825: silo.scrinblue + Owner: Scrin + Location: 12,4 + Actor1826: silo.scrinblue + Owner: Scrin + Location: 13,3 + Actor1827: silo.scrinblue + Owner: Scrin + Location: 12,7 + Actor1828: silo.scrinblue + Owner: Scrin + Location: 11,7 + Actor1829: silo.scrinblue + Owner: Scrin + Location: 13,9 + Actor1830: silo.scrinblue + Owner: Scrin + Location: 12,10 + Actor1831: silo.scrinblue + Owner: Scrin + Location: 10,11 + Actor1832: silo.scrinblue + Owner: Scrin + Location: 11,9 + Actor1833: silo.scrinblue + Owner: Scrin + Location: 13,14 + Actor1834: silo.scrinblue + Owner: Scrin + Location: 12,16 + Actor1835: silo.scrin + Owner: Scrin + Location: 83,29 + Actor1836: silo.scrin + Owner: Scrin + Location: 87,28 + Actor1837: silo.scrin + Owner: Scrin + Location: 86,30 + Actor1838: silo.scrin + Owner: Scrin + Location: 84,31 + Actor1839: silo.scrin + Owner: Scrin + Location: 83,32 + Actor1840: silo.scrin + Owner: Scrin + Location: 86,33 + Actor1841: silo.scrin + Owner: Scrin + Location: 89,33 + Actor1842: silo.scrin + Owner: Scrin + Location: 89,30 + Actor1843: silo.scrin + Owner: Scrin + Location: 85,35 + Actor1844: silo.scrin + Owner: Scrin + Location: 81,31 + Actor1845: silo.scrin + Owner: Scrin + Location: 87,32 + Actor1848: lchr + Owner: Scrin + Location: 9,3 + Facing: 507 + Actor1849: gunw + Owner: Scrin + Location: 59,39 + Facing: 951 + Actor1850: corr + Owner: Scrin + Location: 4,93 + Facing: 888 + Actor1851: ptur + Owner: Scrin + Location: 7,39 + TurretFacing: 697 + Actor1852: ptur + Owner: Scrin + Location: 81,35 + TurretFacing: 364 + Actor1853: ruin + Owner: Scrin + Location: 39,50 + Facing: 864 + Actor1854: gunw + Owner: Scrin + Location: 64,58 + Facing: 737 + Actor1855: lchr + Owner: Scrin + Location: 6,59 + Facing: 586 + Actor1856: brst2 + Owner: Scrin + SubCell: 3 + Location: 39,30 + Facing: 650 + Actor1857: brst2 + Owner: Scrin + SubCell: 3 + Location: 42,31 + Facing: 63 + Actor1858: brst2 + Owner: Scrin + SubCell: 3 + Location: 45,29 + Facing: 721 + Actor1859: s1 + Owner: Scrin + SubCell: 3 + Location: 61,4 + Facing: 586 + Actor1860: s1 + Owner: Scrin + SubCell: 3 + Location: 63,3 + Facing: 650 + Actor1861: s4 + Owner: Scrin + SubCell: 3 + Location: 62,5 + Facing: 721 + Actor1862: s3 + Owner: Scrin + SubCell: 3 + Location: 50,5 + Facing: 808 + Actor1863: s1 + Owner: Scrin + SubCell: 3 + Location: 50,4 + Facing: 880 + Actor1864: s1 + Owner: Scrin + SubCell: 3 + Location: 52,3 + Facing: 674 + Actor1865: s1 + Owner: Scrin + SubCell: 3 + Location: 52,7 + Facing: 951 + Actor1866: s1 + Owner: Scrin + SubCell: 3 + Location: 49,8 + Facing: 808 + Actor1867: gscr + Owner: Scrin + SubCell: 3 + Location: 69,22 + Facing: 31 + Actor1868: gscr + Owner: Scrin + SubCell: 3 + Location: 70,20 + Facing: 0 + Actor1869: s2 + Owner: Scrin + SubCell: 3 + Location: 57,36 + Facing: 919 + Actor1870: s4 + Owner: Scrin + SubCell: 3 + Location: 63,62 + Facing: 55 + Actor1871: s4 + Owner: Scrin + SubCell: 3 + Location: 66,64 + Facing: 182 + Actor1353: dark + Owner: Scrin + Facing: 126 + Location: 89,61 + Actor1355: gscr + Owner: Scrin + SubCell: 3 + Location: 93,65 + Facing: 190 + Actor1356: gscr + Owner: Scrin + SubCell: 3 + Location: 88,66 + Facing: 15 + Actor1358: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 94,76 + Actor1359: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 93,77 + Actor1360: corr + Owner: Scrin + Location: 85,90 + Facing: 959 + Actor1362: gscr + Owner: Scrin + SubCell: 3 + Location: 45,85 + Facing: 864 + Actor1363: s1 + Owner: Scrin + SubCell: 3 + Location: 49,84 + Facing: 816 + Actor1364: s1 + Owner: Scrin + SubCell: 3 + Location: 54,91 + Facing: 0 + Actor1365: s1 + Owner: Scrin + SubCell: 3 + Location: 47,89 + Facing: 785 + Actor1366: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 64,92 + Actor1367: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 67,92 + Actor1368: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 68,94 + Actor1369: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 41,85 + Actor1370: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 24,86 + Actor1371: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 26,87 + Actor1372: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 24,89 + Actor1373: s1 + Owner: Scrin + SubCell: 3 + Location: 4,85 + Facing: 158 + Actor1709: s1 + Owner: Scrin + SubCell: 3 + Location: 6,84 + Facing: 182 + Actor1847: s1 + Owner: Scrin + Location: 12,94 + SubCell: 3 + Facing: 761 + Actor1872: gscr + Owner: Scrin + SubCell: 3 + Location: 4,72 + Facing: 666 + Actor1873: gscr + Owner: Scrin + SubCell: 3 + Location: 5,73 + Facing: 705 + Actor1874: s2 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 23,74 + Actor1875: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 25,72 + Actor1876: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 4,41 + Actor1877: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 5,38 + Actor1878: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 3,26 + Actor1879: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 4,23 + Actor1880: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 4,24 + Actor1881: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 3,21 + Actor1882: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 16,9 + Actor1883: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 19,7 + Actor1884: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 19,8 + Actor1885: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 22,16 + Actor1886: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 33,9 + Actor1887: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 34,9 + Actor1888: s1 + Owner: Scrin + SubCell: 3 + Location: 43,19 + Facing: 769 + Actor1889: s3 + Owner: Scrin + SubCell: 3 + Location: 42,18 + Facing: 808 + Actor1890: s3 + Owner: Scrin + SubCell: 3 + Location: 40,19 + Facing: 800 + Actor1891: s2 + Owner: Scrin + SubCell: 3 + Location: 39,15 + Facing: 610 + Actor1892: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 81,29 + Actor1893: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 85,28 + Actor1894: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 88,31 + Actor1895: gscr + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 89,32 + Actor1896: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 84,37 + Actor1897: gscr + Owner: Scrin + SubCell: 3 + Location: 72,37 + Facing: 0 + Actor1898: s2 + Owner: Scrin + SubCell: 3 + Location: 63,45 + Facing: 39 + Actor1899: s1 + Owner: Scrin + SubCell: 3 + Location: 57,44 + Facing: 919 + Actor1900: s1 + Owner: Scrin + SubCell: 3 + Location: 56,41 + Facing: 832 + Actor1901: s1 + Owner: Scrin + SubCell: 3 + Location: 27,26 + Facing: 650 + Actor1902: s1 + Owner: Scrin + SubCell: 3 + Location: 27,23 + Facing: 515 + Actor1903: s3 + Owner: Scrin + SubCell: 3 + Location: 29,24 + Facing: 578 + HealCrate2: healcrate + Owner: Neutral + Location: 26,34 + HealCrate4: healcrate + Owner: Neutral + Location: 26,84 + HealCrate1: healcrate + Owner: Neutral + Location: 93,4 + Actor1909: gscr + Owner: Scrin + SubCell: 3 + Location: 60,57 + Facing: 729 + Actor1910: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 55,58 + Actor1912: gscr + Owner: Scrin + SubCell: 3 + Location: 41,57 + Facing: 0 + Actor1913: gscr + Owner: Scrin + Facing: 384 + Location: 43,60 + SubCell: 3 + HealCrate3: healcrate + Owner: Neutral + Location: 58,76 + Actor1915: brst2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 56,75 + Actor1916: brst2 + Owner: Scrin + SubCell: 3 + Location: 56,77 + Facing: 190 + Actor1917: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 35,76 + Actor1918: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 23,62 + Actor1919: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 27,63 + Actor1921: s4 + Owner: Scrin + SubCell: 3 + Location: 26,28 + Facing: 769 + Actor1754: ruin + Owner: Scrin + Location: 45,92 + Facing: 951 + Actor1759: gunw + Owner: Scrin + Location: 65,88 + Facing: 0 + Actor1760: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 11,89 + Actor1762: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 5,71 + Actor1753: brst2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 60,18 + Actor1765: brst2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 27,3 + Actor1846: brst2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 63,65 + Actor1907: s1 + Owner: Scrin + SubCell: 3 + Location: 68,79 + Facing: 713 + Actor1908: s1 + Owner: Scrin + Location: 68,78 + SubCell: 3 + Facing: 745 + Actor1911: s3 + Owner: Scrin + SubCell: 3 + Location: 68,81 + Facing: 824 + Actor1920: s3 + Owner: Scrin + SubCell: 3 + Location: 94,91 + Facing: 166 + Actor1922: s3 + Owner: Scrin + SubCell: 3 + Location: 90,92 + Facing: 1023 + Actor1923: s3 + Owner: Scrin + SubCell: 3 + Location: 85,88 + Facing: 959 + Actor1924: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 26,61 + Actor1925: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 29,63 + Actor1926: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 22,60 + Actor1927: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 5,52 + Actor1928: gscr + Owner: Scrin + SubCell: 3 + Location: 9,53 + Facing: 951 + Actor1929: gscr + Owner: Scrin + SubCell: 3 + Location: 19,27 + Facing: 935 + Actor1930: gscr + Owner: Scrin + SubCell: 3 + Location: 20,30 + Facing: 467 + Actor1931: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 14,6 + Actor1932: gscr + Owner: Scrin + SubCell: 3 + Location: 3,4 + Facing: 610 + Actor1933: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 21,4 + Actor1934: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 61,20 + Actor1935: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 58,17 + Actor1936: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 63,42 + Actor1937: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 59,42 + Actor1938: gscr + Owner: Scrin + SubCell: 3 + Facing: 79 + Location: 87,63 + Actor1939: gscr + Owner: Scrin + SubCell: 3 + Facing: 79 + Location: 92,61 + Actor1940: s4 + Owner: Scrin + SubCell: 3 + Location: 84,72 + Facing: 880 + Actor1941: s4 + Owner: Scrin + SubCell: 3 + Location: 86,72 + Facing: 1023 + Actor1942: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 42,62 + Actor1943: gscr + Owner: Scrin + Facing: 384 + Location: 44,55 + SubCell: 3 + Actor1944: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 40,40 + Actor1945: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 45,45 + Actor1946: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 34,40 + Actor1947: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 23,42 + Actor1948: s3 + Owner: Scrin + SubCell: 3 + Location: 25,41 + Facing: 658 + Actor1949: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 21,42 + Actor1950: brst2 + Owner: Scrin + SubCell: 3 + Location: 4,39 + Facing: 642 + Actor1951: brst2 + Owner: Scrin + SubCell: 3 + Location: 5,13 + Facing: 531 + Actor1952: brst2 + Owner: Scrin + SubCell: 3 + Location: 73,43 + Facing: 174 + Actor1953: brst2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 76,44 + Actor1954: gscr + Owner: Scrin + SubCell: 3 + Location: 75,47 + Facing: 87 + Actor1955: gscr + Owner: Scrin + SubCell: 3 + Location: 71,42 + Facing: 1007 + Actor1956: s1 + Owner: Scrin + SubCell: 3 + Location: 74,48 + Facing: 721 + Actor1957: s1 + Owner: Scrin + SubCell: 3 + Location: 86,50 + Facing: 15 + Actor1958: s1 + Owner: Scrin + SubCell: 3 + Location: 84,49 + Facing: 63 + Actor1959: s4 + Owner: Scrin + SubCell: 3 + Location: 85,51 + Facing: 1023 + ProdigyPatrol1: waypoint + Owner: Neutral + Location: 5,92 + ProdigyPatrol2: waypoint + Owner: Neutral + Location: 34,93 + ProdigyPatrol3: waypoint + Owner: Neutral + Location: 35,85 + ProdigyPatrol4: waypoint + Owner: Neutral + Location: 68,85 + ProdigyPatrol5: waypoint + Owner: Neutral + Location: 76,70 + ProdigyPatrol6: waypoint + Owner: Neutral + Location: 54,58 + ProdigyPatrol7: waypoint + Owner: Neutral + Location: 39,76 + ProdigyPatrol8: waypoint + Owner: Neutral + Location: 24,64 + ProdigyPatrol9: waypoint + Owner: Neutral + Location: 7,56 + ProdigyPatrol10: waypoint + Owner: Neutral + Location: 34,42 + ProdigyPatrol11: waypoint + Owner: Neutral + Location: 60,37 + ProdigyPatrol12: waypoint + Owner: Neutral + Location: 69,25 + ProdigyPatrol13: waypoint + Owner: Neutral + Location: 67,4 + ProdigyPatrol14: waypoint + Owner: Neutral + Location: 51,5 + ProdigyPatrol15: waypoint + Owner: Neutral + Location: 49,18 + ProdigyPatrol16: waypoint + Owner: Neutral + Location: 28,9 + ProdigyPatrol17: waypoint + Owner: Neutral + Location: 5,14 + ProdigyPatrol18: waypoint + Owner: Neutral + Location: 6,23 + ProdigyPatrol19: waypoint + Owner: Neutral + Location: 10,39 + ProdigyPatrol20: waypoint + Owner: Neutral + Location: 4,73 + Prodigy: pdgy + Owner: Scrin + SubCell: 3 + Location: 4,92 + Facing: 384 + Exit: waypoint + Owner: Neutral + Location: 94,6 + Actor1904: brik + Owner: Neutral + Location: 21,32 + Actor1905: brik + Owner: Neutral + Location: 21,33 + Actor1906: brik + Owner: Neutral + Location: 21,34 + Actor1914: brik + Owner: Neutral + Location: 21,35 + Actor1960: brik + Owner: Neutral + Location: 21,28 + Actor1961: brik + Owner: Neutral + Location: 21,29 + Actor1962: brik + Owner: Neutral + Location: 21,30 + Actor1963: brik + Owner: Neutral + Location: 21,31 + Actor1965: brik + Owner: Neutral + Location: 21,25 + Actor1966: brik + Owner: Neutral + Location: 21,26 + Actor1967: brik + Owner: Neutral + Location: 21,27 + Actor1964: brik + Owner: Neutral + Location: 21,21 + Actor1968: brik + Owner: Neutral + Location: 21,22 + Actor1969: brik + Owner: Neutral + Location: 21,23 + Actor1970: brik + Owner: Neutral + Location: 21,24 + Actor1971: brik + Owner: Neutral + Location: 14,27 + Actor1972: brik + Owner: Neutral + Location: 14,28 + Actor1973: brik + Owner: Neutral + Location: 14,29 + Actor1974: brik + Owner: Neutral + Location: 14,30 + Actor1975: brik + Owner: Neutral + Location: 14,31 + Actor1976: brik + Owner: Neutral + Location: 14,32 + Actor1977: brik + Owner: Neutral + Location: 14,33 + Actor1978: brik + Owner: Neutral + Location: 14,34 + Actor1979: brik + Owner: Neutral + Location: 14,35 + Actor1980: brik + Owner: Neutral + Location: 14,36 + Actor1981: brik + Owner: Neutral + Location: 14,37 + Actor1982: brik + Owner: Neutral + Location: 14,38 + Actor1983: brik + Owner: Neutral + Location: 14,39 + Actor1984: brik + Owner: Neutral + Location: 14,40 + Actor1985: brik + Owner: Neutral + Location: 14,41 + Actor1986: brik + Owner: Neutral + Location: 67,36 + Actor1987: brik + Owner: Neutral + Location: 67,37 + Actor1988: brik + Owner: Neutral + Location: 67,38 + Actor1989: brik + Owner: Neutral + Location: 67,39 + Actor1990: brik + Owner: Neutral + Location: 67,40 + Actor1991: brik + Owner: Neutral + Location: 67,41 + Actor1992: brik + Owner: Neutral + Location: 67,42 + Actor1993: brik + Owner: Neutral + Location: 67,43 + Actor1994: brik + Owner: Neutral + Location: 69,35 + Actor1995: brik + Owner: Neutral + Location: 69,36 + Actor1996: brik + Owner: Neutral + Location: 69,37 + Actor1997: brik + Owner: Neutral + Location: 69,38 + Actor1998: brik + Owner: Neutral + Location: 69,39 + Actor1999: brik + Owner: Neutral + Location: 69,40 + Actor2000: brik + Owner: Neutral + Location: 69,41 + Actor2001: brik + Owner: Neutral + Location: 69,42 + Actor2002: brik + Owner: Neutral + Location: 69,43 + Actor2003: brik + Owner: Neutral + Location: 69,44 + Actor2004: brik + Owner: Neutral + Location: 69,45 + WormholeSpawn3: waypoint + Owner: Neutral + Location: 94,88 + WormholeSpawn2: waypoint + Owner: Neutral + Location: 4,88 + WormholeSpawn1: waypoint + Owner: Neutral + Location: 7,4 + EscapeRespawn: waypoint + Owner: Neutral + Location: 93,41 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/scrinfestation-base.yaml, ca|rules/custom/commando-mission.yaml, ca|missions/main-campaign/ca28-duality/duality-rules.yaml, ca|rules/custom/coop-rules.yaml, duality-coop-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml, ca|weapons/custom/scrinfestation.yaml, ca|missions/main-campaign/ca28-duality/duality-weapons.yaml diff --git a/mods/ca/missions/coop-campaign/ca29-mobilization-coop/map.bin b/mods/ca/missions/coop-campaign/ca29-mobilization-coop/map.bin new file mode 100644 index 0000000000..b2908246fb Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca29-mobilization-coop/map.bin differ diff --git a/mods/ca/missions/coop-campaign/ca29-mobilization-coop/map.png b/mods/ca/missions/coop-campaign/ca29-mobilization-coop/map.png new file mode 100644 index 0000000000..aacb19a753 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca29-mobilization-coop/map.png differ diff --git a/mods/ca/missions/coop-campaign/ca29-mobilization-coop/map.yaml b/mods/ca/missions/coop-campaign/ca29-mobilization-coop/map.yaml new file mode 100644 index 0000000000..4cfc7cdf34 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca29-mobilization-coop/map.yaml @@ -0,0 +1,8681 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 29: Mobilization Co-op + +Author: Darkademic & Gandorques Hikla + +Tileset: TEMPERAT + +MapSize: 146,130 + +Bounds: 1,1,144,128 + +Visibility: Lobby + +Categories: Co-op Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: GDI, Scrin, Slaves, Greece, USSR, Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + PlayerReference@GDI: + Name: GDI + Faction: gdi + Color: F2CF74 + Allies: Greece, Nod, USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Slaves, Creeps + PlayerReference@Scrin: + Name: Scrin + Bot: campaign + Faction: scrin + Color: 7700FF + Allies: Slaves + Enemies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps, Nod, Greece, USSR + PlayerReference@Greece: + Name: Greece + Bot: campaign + Faction: allies + Color: 99ACF2 + Allies: GDI, Nod, USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Slaves, Creeps + PlayerReference@USSR: + Name: USSR + Bot: campaign + Faction: soviet + Color: FE1100 + Allies: GDI, Greece, Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Slaves, Creeps + PlayerReference@Nod: + Name: Nod + Bot: campaign + Faction: nod + Color: 6D738C + Allies: GDI, Greece, USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Slaves, Creeps + PlayerReference@Slaves: + Name: Slaves + Bot: campaign + Faction: allies + Color: D500E8 + Allies: Scrin + Enemies: GDI, Creeps, Nod, Greece, USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: F2CF74 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Greece, Nod, USSR + Enemies: Scrin, Slaves, Creeps + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: EA7816 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Greece, Nod, USSR + Enemies: Scrin, Slaves, Creeps + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: 0B7310 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Greece, Nod, USSR + Enemies: Scrin, Slaves, Creeps + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: 0077D6 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Greece, Nod, USSR + Enemies: Scrin, Slaves, Creeps + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: 82C900 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Greece, Nod, USSR + Enemies: Scrin, Slaves, Creeps + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: 775A12 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Greece, Nod, USSR + Enemies: Scrin, Slaves, Creeps + +Actors: + Actor0: tc05 + Owner: Neutral + Location: 98,95 + Actor1: tc05 + Owner: Neutral + Location: 123,64 + Actor3: tc05 + Owner: Neutral + Location: 87,16 + Actor4: tc05 + Owner: Neutral + Location: 0,9 + Actor5: tc05 + Owner: Neutral + Location: 53,80 + Actor6: tc05 + Owner: Neutral + Location: 2,121 + Actor8: tc05 + Owner: Neutral + Location: 12,54 + Actor10: tc03 + Owner: Neutral + Location: 49,112 + Actor13: tc03 + Owner: Neutral + Location: 48,12 + Actor15: tc04 + Owner: Neutral + Location: 104,120 + Actor16: tc04 + Owner: Neutral + Location: 27,68 + Actor17: tc04 + Owner: Neutral + Location: 141,79 + Actor18: tc03 + Owner: Neutral + Location: 103,98 + Actor19: tc04 + Owner: Neutral + Location: 103,124 + Actor20: tc04 + Owner: Neutral + Location: 56,83 + Actor21: tc04 + Owner: Neutral + Location: 30,76 + Actor22: tc04 + Owner: Neutral + Location: 68,4 + Actor23: tc03 + Owner: Neutral + Location: 141,84 + Actor25: tc03 + Owner: Neutral + Location: 126,64 + Actor26: tc03 + Owner: Neutral + Location: 118,109 + Actor27: tc04 + Owner: Neutral + Location: 59,84 + Actor28: tc04.husk + Owner: Neutral + Location: 29,61 + Actor29: tc04 + Owner: Neutral + Location: 81,46 + Actor30: tc03 + Owner: Neutral + Location: 98,89 + Actor31: tc03 + Owner: Neutral + Location: 107,90 + Actor32: tc04.husk + Owner: Neutral + Location: 114,65 + Actor34: tc03 + Owner: Neutral + Location: 81,16 + Actor35: tc03.husk + Owner: Neutral + Location: 104,34 + Actor37: tc03 + Owner: Neutral + Location: 28,72 + Actor38: tc03.husk + Owner: Neutral + Location: 90,99 + Actor39: tc04 + Owner: Neutral + Location: 17,50 + Actor40: tc03 + Owner: Neutral + Location: 63,87 + Actor41: tc03 + Owner: Neutral + Location: 74,1 + Actor42: tc04 + Owner: Neutral + Location: 92,92 + Actor44: tc04 + Owner: Neutral + Location: 87,50 + Actor45: tc04 + Owner: Neutral + Location: 105,54 + Actor46: tc04 + Owner: Neutral + Location: 110,64 + Actor47: tc02 + Owner: Neutral + Location: 99,120 + Actor48: tc02 + Owner: Neutral + Location: 48,28 + Actor49: tc02 + Owner: Neutral + Location: 55,0 + Actor50: tc02 + Owner: Neutral + Location: 105,97 + Actor51: tc02 + Owner: Neutral + Location: 90,103 + Actor52: tc02 + Owner: Neutral + Location: 112,66 + Actor53: tc02 + Owner: Neutral + Location: 65,86 + Actor54: tc02 + Owner: Neutral + Location: 77,32 + Actor55: tc02 + Owner: Neutral + Location: 37,59 + Actor56: tc02 + Owner: Neutral + Location: 53,79 + Actor57: tc02 + Owner: Neutral + Location: 56,78 + Actor58: tc02 + Owner: Neutral + Location: 100,19 + Actor59: tc02.husk + Owner: Neutral + Location: 107,122 + Actor60: tc02 + Owner: Neutral + Location: 2,6 + Actor61: tc02 + Owner: Neutral + Location: 15,70 + Actor62: tc02 + Owner: Neutral + Location: 17,111 + Actor63: tc02 + Owner: Neutral + Location: 104,19 + Actor64: tc02 + Owner: Neutral + Location: 3,119 + Actor65: tc02.husk + Owner: Neutral + Location: 100,90 + Actor66: tc02 + Owner: Neutral + Location: 75,128 + Actor67: tc02 + Owner: Neutral + Location: 117,69 + Actor68: tc02 + Owner: Neutral + Location: 143,59 + Actor69: tc02 + Owner: Neutral + Location: 72,5 + Actor70: t10 + Owner: Neutral + Location: 92,98 + Actor71: t10 + Owner: Neutral + Location: 43,33 + Actor72: t10 + Owner: Neutral + Location: 49,77 + Actor73: t14 + Owner: Neutral + Location: 73,32 + Actor75: tc01 + Owner: Neutral + Location: 106,18 + Actor76: tc01 + Owner: Neutral + Location: 43,34 + Actor77: tc01 + Owner: Neutral + Location: 2,1 + Actor79: tc01 + Owner: Neutral + Location: 75,125 + Actor80: t14 + Owner: Neutral + Location: 36,78 + Actor81: t10 + Owner: Neutral + Location: 45,34 + Actor82: t14 + Owner: Neutral + Location: 94,94 + Actor83: tc01 + Owner: Neutral + Location: 15,86 + Actor84: t14 + Owner: Neutral + Location: 43,35 + Actor85: t11 + Owner: Neutral + Location: 4,4 + Actor86: t14.husk + Owner: Neutral + Location: 45,35 + Actor87: tc01 + Owner: Neutral + Location: 91,96 + Actor88: t15 + Owner: Neutral + Location: 14,73 + Actor89: t14 + Owner: Neutral + Location: 114,67 + Actor90: t14 + Owner: Neutral + Location: 48,81 + Actor91: t11 + Owner: Neutral + Location: 75,31 + Actor92: t10 + Owner: Neutral + Location: 83,49 + Actor93: t15 + Owner: Neutral + Location: 76,0 + Actor95: t14.husk + Owner: Neutral + Location: 116,108 + Actor96: t10 + Owner: Neutral + Location: 71,2 + Actor97: tc01 + Owner: Neutral + Location: 15,57 + Actor98: t15 + Owner: Neutral + Location: 58,2 + Actor99: t14 + Owner: Neutral + Location: 111,67 + Actor100: t14.husk + Owner: Neutral + Location: 106,123 + Actor101: t14 + Owner: Neutral + Location: 114,24 + Actor102: t11 + Owner: Neutral + Location: 95,99 + Actor103: t11 + Owner: Neutral + Location: 126,65 + Actor104: tc01 + Owner: Neutral + Location: 109,30 + Actor105: t15 + Owner: Neutral + Location: 102,32 + Actor106: t14 + Owner: Neutral + Location: 82,13 + Actor107: t14 + Owner: Neutral + Location: 107,33 + Actor108: tc01 + Owner: Neutral + Location: 57,74 + Actor109: t15 + Owner: Neutral + Location: 29,65 + Actor110: tc01 + Owner: Neutral + Location: 141,86 + Actor111: t10 + Owner: Neutral + Location: 53,82 + Actor112: t10 + Owner: Neutral + Location: 101,124 + Actor113: t10 + Owner: Neutral + Location: 86,48 + Actor114: t15 + Owner: Neutral + Location: 138,78 + Actor115: t10 + Owner: Neutral + Location: 92,95 + Actor116: t15 + Owner: Neutral + Location: 132,109 + Actor119: t11 + Owner: Neutral + Location: 95,128 + Actor120: t11 + Owner: Neutral + Location: 43,36 + Actor121: t15 + Owner: Neutral + Location: 3,30 + Actor122: tc01 + Owner: Neutral + Location: 57,1 + Actor123: t10 + Owner: Neutral + Location: 109,90 + Actor124: tc01 + Owner: Neutral + Location: 46,15 + Actor125: tc01 + Owner: Neutral + Location: 127,67 + Actor126: t10 + Owner: Neutral + Location: 35,55 + Actor127: t14 + Owner: Neutral + Location: 49,120 + Actor128: t14 + Owner: Neutral + Location: 50,12 + Actor129: t10 + Owner: Neutral + Location: 144,19 + Actor130: t15 + Owner: Neutral + Location: 45,29 + Actor131: t14 + Owner: Neutral + Location: 3,17 + Actor132: t10 + Owner: Neutral + Location: 18,63 + Actor133: t15 + Owner: Neutral + Location: 12,29 + Actor134: t11 + Owner: Neutral + Location: 71,3 + Actor135: t14 + Owner: Neutral + Location: 46,0 + Actor136: t10 + Owner: Neutral + Location: 115,66 + Actor137: t11 + Owner: Neutral + Location: 100,87 + Actor139: t14 + Owner: Neutral + Location: 13,71 + Actor140: tc01 + Owner: Neutral + Location: 71,0 + Actor141: tc01 + Owner: Neutral + Location: 36,64 + Actor142: t10 + Owner: Neutral + Location: 120,100 + Actor143: tc01 + Owner: Neutral + Location: 14,56 + Actor144: t14 + Owner: Neutral + Location: 19,61 + Actor145: t14 + Owner: Neutral + Location: 94,62 + Actor146: t14.husk + Owner: Neutral + Location: 142,67 + Actor147: t11 + Owner: Neutral + Location: 52,75 + Actor148: t14 + Owner: Neutral + Location: 102,85 + Actor149: t11 + Owner: Neutral + Location: 88,100 + Actor150: t11 + Owner: Neutral + Location: 21,58 + Actor151: tc01 + Owner: Neutral + Location: 90,16 + Actor152: t14 + Owner: Neutral + Location: 35,77 + Actor153: t11 + Owner: Neutral + Location: 78,2 + Actor154: t11 + Owner: Neutral + Location: 103,96 + Actor155: t10 + Owner: Neutral + Location: 79,49 + Actor156: t11 + Owner: Neutral + Location: 139,80 + Actor157: t14 + Owner: Neutral + Location: 16,55 + Actor158: t15 + Owner: Neutral + Location: 86,18 + Actor159: t11 + Owner: Neutral + Location: 35,59 + Actor160: tc01 + Owner: Neutral + Location: 60,80 + Actor161: t15 + Owner: Neutral + Location: 2,13 + Actor162: t15 + Owner: Neutral + Location: 118,63 + Actor163: t14 + Owner: Neutral + Location: 18,83 + Actor164: t15 + Owner: Neutral + Location: 48,83 + Actor165: t14 + Owner: Neutral + Location: 45,32 + Actor166: tc01 + Owner: Neutral + Location: 3,11 + Actor167: t10 + Owner: Neutral + Location: 122,112 + Actor168: t11 + Owner: Neutral + Location: 128,25 + Actor170: t10.husk + Owner: Neutral + Location: 76,28 + Actor171: t11 + Owner: Neutral + Location: 46,28 + Actor172: t10 + Owner: Neutral + Location: 104,123 + Actor173: tc01 + Owner: Neutral + Location: 41,46 + Actor174: t10 + Owner: Neutral + Location: 16,48 + Actor175: t11 + Owner: Neutral + Location: 121,65 + Actor176: tc01.husk + Owner: Neutral + Location: 14,69 + Actor177: tc01 + Owner: Neutral + Location: 111,44 + Actor178: t10 + Owner: Neutral + Location: 58,0 + Actor179: t14 + Owner: Neutral + Location: 50,11 + Actor180: t10 + Owner: Neutral + Location: 3,8 + Actor181: tc01 + Owner: Neutral + Location: 63,89 + Actor182: t11 + Owner: Neutral + Location: 93,97 + Actor183: t11 + Owner: Neutral + Location: 116,101 + Actor184: t15 + Owner: Neutral + Location: 72,1 + Actor185: tc01 + Owner: Neutral + Location: 2,2 + Actor187: tc01 + Owner: Neutral + Location: 14,49 + Actor188: tc01 + Owner: Neutral + Location: 33,75 + Actor189: t11 + Owner: Neutral + Location: 107,94 + Actor190: t11 + Owner: Neutral + Location: 13,70 + Actor192: t15 + Owner: Neutral + Location: 68,6 + Actor193: t11 + Owner: Neutral + Location: 58,78 + Actor194: t10 + Owner: Neutral + Location: 119,65 + Actor195: t10 + Owner: Neutral + Location: 10,126 + Actor196: t10 + Owner: Neutral + Location: 82,47 + Actor197: t14.husk + Owner: Neutral + Location: 119,67 + Actor198: t10.husk + Owner: Neutral + Location: 141,77 + Actor199: t11 + Owner: Neutral + Location: 30,64 + Actor200: t11 + Owner: Neutral + Location: 19,60 + Actor201: t14 + Owner: Neutral + Location: 77,1 + Actor202: t10 + Owner: Neutral + Location: 29,70 + Actor203: tc01 + Owner: Neutral + Location: 98,128 + Actor204: t15 + Owner: Neutral + Location: 48,31 + Actor205: t15 + Owner: Neutral + Location: 4,126 + Actor206: tc01 + Owner: Neutral + Location: 49,78 + Actor207: t14 + Owner: Neutral + Location: 18,84 + Actor208: t15 + Owner: Neutral + Location: 118,102 + Actor209: tc01 + Owner: Neutral + Location: 101,123 + Actor210: t15 + Owner: Neutral + Location: 115,106 + Actor211: t11 + Owner: Neutral + Location: 130,26 + Actor212: tc01 + Owner: Neutral + Location: 136,82 + Actor213: t15 + Owner: Neutral + Location: 107,65 + Actor214: t11 + Owner: Neutral + Location: 97,101 + Actor215: t11.husk + Owner: Neutral + Location: 117,103 + Actor216: t14 + Owner: Neutral + Location: 59,79 + Actor217: t14 + Owner: Neutral + Location: 43,38 + Actor218: tc01.husk + Owner: Neutral + Location: 30,66 + Actor219: t10 + Owner: Neutral + Location: 128,64 + Actor220: t14 + Owner: Neutral + Location: 47,30 + Actor221: t14 + Owner: Neutral + Location: 93,99 + Actor222: t15 + Owner: Neutral + Location: 61,86 + Actor223: t10 + Owner: Neutral + Location: 113,109 + Actor224: t11 + Owner: Neutral + Location: 47,10 + Actor225: t14 + Owner: Neutral + Location: 86,47 + Actor226: tc01 + Owner: Neutral + Location: 95,101 + Actor227: t11.husk + Owner: Neutral + Location: 49,114 + Actor228: t15 + Owner: Neutral + Location: 105,91 + Actor229: t11 + Owner: Neutral + Location: 18,59 + Actor230: t14.husk + Owner: Neutral + Location: 96,102 + Actor231: tc01 + Owner: Neutral + Location: 94,90 + Actor232: t11 + Owner: Neutral + Location: 111,62 + Actor233: t10.husk + Owner: Neutral + Location: 16,85 + Actor234: tc01 + Owner: Neutral + Location: 15,54 + Actor235: tc01 + Owner: Neutral + Location: 47,80 + Actor236: t15 + Owner: Neutral + Location: 35,73 + Actor237: tc01 + Owner: Neutral + Location: 34,54 + Actor238: t11 + Owner: Neutral + Location: 60,89 + Actor239: t11 + Owner: Neutral + Location: 61,85 + Actor240: t11 + Owner: Neutral + Location: 104,90 + Actor241: t14 + Owner: Neutral + Location: 36,56 + Actor242: t14.husk + Owner: Neutral + Location: 56,80 + Actor244: t11.husk + Owner: Neutral + Location: 51,2 + Actor245: t10 + Owner: Neutral + Location: 116,60 + Actor246: t11 + Owner: Neutral + Location: 105,35 + Actor247: t15 + Owner: Neutral + Location: 15,53 + Actor248: tc01 + Owner: Neutral + Location: 99,91 + Actor249: tc01 + Owner: Neutral + Location: 73,14 + Actor250: t15 + Owner: Neutral + Location: 18,51 + Actor251: t10 + Owner: Neutral + Location: 104,125 + Actor253: t14 + Owner: Neutral + Location: 55,90 + Actor254: t10 + Owner: Neutral + Location: 69,16 + Actor255: tc01 + Owner: Neutral + Location: 6,126 + Actor256: t10 + Owner: Neutral + Location: 1,15 + Actor257: t14 + Owner: Neutral + Location: 71,15 + Actor258: t14 + Owner: Neutral + Location: 101,91 + Actor259: t11 + Owner: Neutral + Location: 30,57 + Actor260: tc01 + Owner: Neutral + Location: 118,58 + Actor261: tc01 + Owner: Neutral + Location: 13,25 + Actor262: t10 + Owner: Neutral + Location: 138,128 + Actor263: t15 + Owner: Neutral + Location: 102,95 + Actor264: t11 + Owner: Neutral + Location: 94,95 + Actor265: tc01 + Owner: Neutral + Location: 11,28 + Actor266: tc01 + Owner: Neutral + Location: 119,69 + Actor267: tc01 + Owner: Neutral + Location: 45,36 + Actor268: t11 + Owner: Neutral + Location: 16,60 + Actor269: t14 + Owner: Neutral + Location: 77,124 + Actor270: t12 + Owner: Neutral + Location: 5,15 + Actor271: t05 + Owner: Neutral + Location: 137,104 + Actor272: t17 + Owner: Neutral + Location: 144,68 + Actor273: t08.husk + Owner: Neutral + Location: 90,92 + Actor274: t16 + Owner: Neutral + Location: 59,77 + Actor275: t17 + Owner: Neutral + Location: 47,33 + Actor276: t13 + Owner: Neutral + Location: 109,11 + Actor277: t12 + Owner: Neutral + Location: 48,9 + Actor278: t07 + Owner: Neutral + Location: 17,71 + Actor279: t02 + Owner: Neutral + Location: 50,13 + Actor280: t02 + Owner: Neutral + Location: 32,51 + Actor282: t03 + Owner: Neutral + Location: 47,2 + Actor283: t08 + Owner: Neutral + Location: 94,62 + Actor284: t16 + Owner: Neutral + Location: 48,79 + Actor285: t17 + Owner: Neutral + Location: 116,103 + Actor287: t02 + Owner: Neutral + Location: 5,127 + Actor288: t12 + Owner: Neutral + Location: 56,79 + Actor289: t17 + Owner: Neutral + Location: 89,98 + Actor290: t03 + Owner: Neutral + Location: 100,17 + Actor291: t13 + Owner: Neutral + Location: 77,2 + Actor292: t07 + Owner: Neutral + Location: 78,123 + Actor293: t05 + Owner: Neutral + Location: 95,98 + Actor294: t05 + Owner: Neutral + Location: 142,15 + Actor295: t17 + Owner: Neutral + Location: 8,125 + Actor296: t05 + Owner: Neutral + Location: 29,78 + Actor297: t06 + Owner: Neutral + Location: 101,92 + Actor298: t01 + Owner: Neutral + Location: 19,113 + Actor299: t13 + Owner: Neutral + Location: 50,79 + Actor300: t17 + Owner: Neutral + Location: 30,67 + Actor301: t07 + Owner: Neutral + Location: 17,62 + Actor302: t06 + Owner: Neutral + Location: 17,109 + Actor303: t13.husk + Owner: Neutral + Location: 122,64 + Actor304: t06 + Owner: Neutral + Location: 107,121 + Actor305: t12 + Owner: Neutral + Location: 76,41 + Actor306: t08 + Owner: Neutral + Location: 76,44 + Actor307: t12 + Owner: Neutral + Location: 74,20 + Actor308: t08 + Owner: Neutral + Location: 20,63 + Actor309: t13 + Owner: Neutral + Location: 102,56 + Actor310: t02.husk + Owner: Neutral + Location: 2,96 + Actor311: t01 + Owner: Neutral + Location: 72,16 + Actor312: t02 + Owner: Neutral + Location: 50,1 + Actor313: t16 + Owner: Neutral + Location: 5,124 + Actor314: t12 + Owner: Neutral + Location: 14,72 + Actor316: t06.husk + Owner: Neutral + Location: 2,85 + Actor317: t17 + Owner: Neutral + Location: 1,87 + Actor318: t03 + Owner: Neutral + Location: 33,74 + Actor319: t05 + Owner: Neutral + Location: 59,75 + Actor320: t13 + Owner: Neutral + Location: 76,45 + Actor321: t03 + Owner: Neutral + Location: 84,14 + Actor322: t06 + Owner: Neutral + Location: 1,97 + Actor323: t07 + Owner: Neutral + Location: 120,63 + Actor325: t06 + Owner: Neutral + Location: 51,81 + Actor326: t17 + Owner: Neutral + Location: 107,96 + Actor327: t03 + Owner: Neutral + Location: 120,95 + Actor328: t07 + Owner: Neutral + Location: 14,118 + Actor329: t16 + Owner: Neutral + Location: 73,2 + Actor330: t13 + Owner: Neutral + Location: 48,1 + Actor332: t01 + Owner: Neutral + Location: 145,17 + Actor333: t05 + Owner: Neutral + Location: 144,15 + Actor335: t12 + Owner: Neutral + Location: 46,2 + Actor336: t05 + Owner: Neutral + Location: 109,92 + Actor338: t03 + Owner: Neutral + Location: 128,47 + Actor339: t08 + Owner: Neutral + Location: 31,59 + Actor340: t12 + Owner: Neutral + Location: 102,126 + Actor341: t03 + Owner: Neutral + Location: 99,17 + Actor342: t16 + Owner: Neutral + Location: 1,98 + Actor343: t13.husk + Owner: Neutral + Location: 90,100 + Actor344: t03 + Owner: Neutral + Location: 56,75 + Actor345: t13 + Owner: Neutral + Location: 117,66 + Actor346: t06 + Owner: Neutral + Location: 59,87 + Actor347: t05 + Owner: Neutral + Location: 8,68 + Actor349: t08 + Owner: Neutral + Location: 34,32 + Actor350: t06 + Owner: Neutral + Location: 47,35 + Actor351: t13 + Owner: Neutral + Location: 119,66 + Actor352: t07 + Owner: Neutral + Location: 60,81 + Actor353: t08 + Owner: Neutral + Location: 88,47 + Actor354: t02 + Owner: Neutral + Location: 76,126 + Actor355: t08 + Owner: Neutral + Location: 52,110 + Actor356: t02 + Owner: Neutral + Location: 99,86 + Actor357: t01 + Owner: Neutral + Location: 49,118 + Actor358: t16 + Owner: Neutral + Location: 12,60 + Actor359: t12 + Owner: Neutral + Location: 41,45 + Actor360: t08 + Owner: Neutral + Location: 52,91 + Actor361: t07 + Owner: Neutral + Location: 5,8 + Actor362: t07 + Owner: Neutral + Location: 3,16 + Actor363: t08 + Owner: Neutral + Location: 45,40 + Actor364: t13 + Owner: Neutral + Location: 13,59 + Actor366: t05 + Owner: Neutral + Location: 13,49 + Actor367: t03 + Owner: Neutral + Location: 51,0 + Actor368: t16 + Owner: Neutral + Location: 8,126 + Actor369: t13 + Owner: Neutral + Location: 57,79 + Actor370: t02 + Owner: Neutral + Location: 106,90 + Actor371: t08 + Owner: Neutral + Location: 130,25 + Actor373: t17 + Owner: Neutral + Location: 2,11 + Actor374: t01 + Owner: Neutral + Location: 55,77 + Actor375: t02.husk + Owner: Neutral + Location: 105,104 + Actor376: t12 + Owner: Neutral + Location: 51,76 + Actor377: t05 + Owner: Neutral + Location: 35,31 + Actor378: t12 + Owner: Neutral + Location: 101,84 + Actor379: t07 + Owner: Neutral + Location: 86,50 + Actor380: t07 + Owner: Neutral + Location: 43,40 + Actor381: t01 + Owner: Neutral + Location: 136,81 + Actor382: t06.husk + Owner: Neutral + Location: 48,112 + Actor383: t05 + Owner: Neutral + Location: 107,124 + Actor384: t05 + Owner: Neutral + Location: 69,2 + Actor385: t03 + Owner: Neutral + Location: 102,15 + Actor386: t07 + Owner: Neutral + Location: 52,81 + Actor387: t06 + Owner: Neutral + Location: 120,111 + Actor388: t07 + Owner: Neutral + Location: 110,32 + Actor389: t01 + Owner: Neutral + Location: 101,125 + Actor390: t13 + Owner: Neutral + Location: 31,59 + Actor391: t05 + Owner: Neutral + Location: 93,90 + Actor392: t17 + Owner: Neutral + Location: 14,50 + Actor393: t02 + Owner: Neutral + Location: 104,86 + Actor394: t16 + Owner: Neutral + Location: 144,67 + Actor395: t17 + Owner: Neutral + Location: 12,18 + Actor396: t13 + Owner: Neutral + Location: 64,84 + Actor397: t13 + Owner: Neutral + Location: 89,93 + Actor398: t01 + Owner: Neutral + Location: 55,1 + Actor400: t12 + Owner: Neutral + Location: 53,77 + Actor401: t13 + Owner: Neutral + Location: 103,99 + Actor402: t12 + Owner: Neutral + Location: 31,60 + Actor404: t03.husk + Owner: Neutral + Location: 129,67 + Actor405: t17 + Owner: Neutral + Location: 140,79 + Actor406: t06 + Owner: Neutral + Location: 101,98 + Actor407: t08.husk + Owner: Neutral + Location: 59,84 + Actor408: t17 + Owner: Neutral + Location: 33,51 + Actor409: t03 + Owner: Neutral + Location: 107,53 + Actor410: t01 + Owner: Neutral + Location: 40,44 + Actor411: t02 + Owner: Neutral + Location: 89,88 + Actor412: t05 + Owner: Neutral + Location: 6,124 + Actor413: t01 + Owner: Neutral + Location: 101,36 + Actor414: t08.husk + Owner: Neutral + Location: 18,54 + Actor415: t01 + Owner: Neutral + Location: 33,72 + Actor416: t02 + Owner: Neutral + Location: 78,44 + Actor417: t17 + Owner: Neutral + Location: 83,16 + Actor418: t16 + Owner: Neutral + Location: 122,58 + Actor419: t13 + Owner: Neutral + Location: 103,20 + Actor421: t08 + Owner: Neutral + Location: 14,30 + Actor422: t06 + Owner: Neutral + Location: 91,18 + Actor423: t02 + Owner: Neutral + Location: 86,51 + Actor425: t12.husk + Owner: Neutral + Location: 65,84 + Actor426: t06 + Owner: Neutral + Location: 48,33 + Actor427: t13 + Owner: Neutral + Location: 104,54 + Actor428: t12 + Owner: Neutral + Location: 57,86 + Actor429: t05 + Owner: Neutral + Location: 66,89 + Actor430: t07 + Owner: Neutral + Location: 78,125 + Actor431: t08 + Owner: Neutral + Location: 108,93 + Actor432: t06.husk + Owner: Neutral + Location: 4,123 + Actor433: t12 + Owner: Neutral + Location: 30,68 + Actor434: t05 + Owner: Neutral + Location: 115,103 + Actor435: t06 + Owner: Neutral + Location: 79,0 + Actor436: t16 + Owner: Neutral + Location: 34,72 + Actor437: t05 + Owner: Neutral + Location: 116,64 + Actor438: t12 + Owner: Neutral + Location: 34,62 + Actor439: t08 + Owner: Neutral + Location: 0,3 + Actor440: t12 + Owner: Neutral + Location: 2,3 + Actor441: t05.husk + Owner: Neutral + Location: 49,113 + Actor442: t08 + Owner: Neutral + Location: 94,104 + Actor443: t05 + Owner: Neutral + Location: 93,128 + Actor444: t06 + Owner: Neutral + Location: 128,46 + Actor445: t16.husk + Owner: Neutral + Location: 34,32 + Actor446: t03 + Owner: Neutral + Location: 128,65 + Actor447: t01 + Owner: Neutral + Location: 116,63 + Actor448: t01 + Owner: Neutral + Location: 30,63 + Actor449: t05 + Owner: Neutral + Location: 85,19 + Actor450: t17 + Owner: Neutral + Location: 32,79 + Actor451: t08 + Owner: Neutral + Location: 133,40 + Actor453: t03 + Owner: Neutral + Location: 48,118 + Actor454: t16 + Owner: Neutral + Location: 73,39 + Actor455: t17 + Owner: Neutral + Location: 49,116 + Actor456: t12 + Owner: Neutral + Location: 15,52 + Actor457: t13 + Owner: Neutral + Location: 30,60 + Actor458: t05 + Owner: Neutral + Location: 67,84 + Actor459: t13 + Owner: Neutral + Location: 122,108 + Actor460: t12 + Owner: Neutral + Location: 46,17 + Actor461: t12 + Owner: Neutral + Location: 53,90 + Actor462: t17 + Owner: Neutral + Location: 106,93 + Actor463: t16 + Owner: Neutral + Location: 45,45 + Actor464: t12 + Owner: Neutral + Location: 104,18 + Actor465: t02 + Owner: Neutral + Location: 91,107 + Actor466: t06 + Owner: Neutral + Location: 89,99 + Actor467: t13 + Owner: Neutral + Location: 114,63 + Actor468: t07 + Owner: Neutral + Location: 3,23 + Actor469: t02 + Owner: Neutral + Location: 12,59 + Actor470: t08 + Owner: Neutral + Location: 142,77 + Actor471: t03 + Owner: Neutral + Location: 113,106 + Actor472: t05 + Owner: Neutral + Location: 101,14 + Actor473: t13 + Owner: Neutral + Location: 68,87 + Actor474: t05 + Owner: Neutral + Location: 52,83 + Actor475: t12 + Owner: Neutral + Location: 126,72 + Actor477: t12 + Owner: Neutral + Location: 1,57 + Actor478: t06 + Owner: Neutral + Location: 33,34 + Actor479: t01 + Owner: Neutral + Location: 51,75 + Actor480: t01 + Owner: Neutral + Location: 88,88 + Actor481: t12 + Owner: Neutral + Location: 11,115 + Actor483: t07 + Owner: Neutral + Location: 67,6 + Actor485: t07 + Owner: Neutral + Location: 128,29 + Actor486: t08 + Owner: Neutral + Location: 107,100 + Actor487: t05 + Owner: Neutral + Location: 126,14 + Actor488: t16.husk + Owner: Neutral + Location: 138,127 + Actor489: t03 + Owner: Neutral + Location: 90,93 + Actor490: t12 + Owner: Neutral + Location: 53,0 + Actor491: t08 + Owner: Neutral + Location: 90,98 + Actor492: t17 + Owner: Neutral + Location: 104,93 + Actor493: t08 + Owner: Neutral + Location: 55,84 + Actor494: t03 + Owner: Neutral + Location: 92,109 + Actor495: t06 + Owner: Neutral + Location: 133,101 + Actor496: t08 + Owner: Neutral + Location: 11,72 + Actor498: t07 + Owner: Neutral + Location: 90,95 + Actor499: t01 + Owner: Neutral + Location: 105,94 + Actor500: t07 + Owner: Neutral + Location: 139,29 + Actor501: t06 + Owner: Neutral + Location: 91,100 + Actor502: t08 + Owner: Neutral + Location: 121,109 + Actor503: t02 + Owner: Neutral + Location: 16,84 + Actor504: t17 + Owner: Neutral + Location: 45,37 + Actor506: t01 + Owner: Neutral + Location: 4,12 + Actor507: t17 + Owner: Neutral + Location: 4,28 + Actor508: t08 + Owner: Neutral + Location: 42,37 + Actor510: t12 + Owner: Neutral + Location: 13,57 + Actor511: t08 + Owner: Neutral + Location: 13,18 + Actor512: t06 + Owner: Neutral + Location: 120,109 + Actor513: t02 + Owner: Neutral + Location: 139,81 + Actor514: t05 + Owner: Neutral + Location: 65,88 + Actor515: t01 + Owner: Neutral + Location: 75,42 + Actor516: t03 + Owner: Neutral + Location: 18,68 + Actor517: t13 + Owner: Neutral + Location: 118,66 + Actor518: t08 + Owner: Neutral + Location: 142,67 + Actor519: t13 + Owner: Neutral + Location: 90,92 + Actor521: t13 + Owner: Neutral + Location: 129,27 + Actor522: t17 + Owner: Neutral + Location: 93,103 + Actor523: t13 + Owner: Neutral + Location: 14,47 + Actor524: t02 + Owner: Neutral + Location: 85,47 + Actor526: t13 + Owner: Neutral + Location: 28,77 + Actor527: t12 + Owner: Neutral + Location: 66,88 + Actor528: t08 + Owner: Neutral + Location: 25,72 + Actor529: t17 + Owner: Neutral + Location: 0,15 + Actor530: t17 + Owner: Neutral + Location: 57,75 + Actor531: t16 + Owner: Neutral + Location: 89,97 + Actor532: t02 + Owner: Neutral + Location: 28,66 + Actor533: t03.husk + Owner: Neutral + Location: 17,74 + Actor534: t08 + Owner: Neutral + Location: 14,19 + Actor535: t13 + Owner: Neutral + Location: 45,33 + Actor536: t03 + Owner: Neutral + Location: 99,127 + Actor537: t17 + Owner: Neutral + Location: 5,16 + Actor538: t01 + Owner: Neutral + Location: 31,78 + Actor539: t17.husk + Owner: Neutral + Location: 58,87 + Actor541: t07 + Owner: Neutral + Location: 71,4 + Actor542: t13.husk + Owner: Neutral + Location: 114,61 + Actor543: t13 + Owner: Neutral + Location: 56,76 + Actor544: t13 + Owner: Neutral + Location: 48,13 + Actor545: t17 + Owner: Neutral + Location: 137,81 + Actor546: t13 + Owner: Neutral + Location: 36,75 + Actor547: t01 + Owner: Neutral + Location: 51,80 + Actor548: t13 + Owner: Neutral + Location: 13,74 + Actor549: t07 + Owner: Neutral + Location: 130,64 + Actor550: t12 + Owner: Neutral + Location: 108,30 + Actor553: t13 + Owner: Neutral + Location: 65,41 + Actor554: t05 + Owner: Neutral + Location: 54,89 + Actor555: t07 + Owner: Neutral + Location: 81,13 + Actor556: t02 + Owner: Neutral + Location: 16,49 + Actor557: t17 + Owner: Neutral + Location: 16,71 + Actor558: t03 + Owner: Neutral + Location: 88,48 + Actor559: t07 + Owner: Neutral + Location: 74,41 + Actor560: t13.husk + Owner: Neutral + Location: 104,55 + Actor561: t05 + Owner: Neutral + Location: 142,81 + Actor562: t17 + Owner: Neutral + Location: 134,47 + Actor563: t17 + Owner: Neutral + Location: 95,103 + Actor564: t12 + Owner: Neutral + Location: 108,10 + Actor565: t06 + Owner: Neutral + Location: 34,55 + Actor566: t02 + Owner: Neutral + Location: 108,66 + Actor567: t12 + Owner: Neutral + Location: 117,104 + Actor568: t05.husk + Owner: Neutral + Location: 105,122 + Actor569: t02 + Owner: Neutral + Location: 64,42 + Actor570: t13 + Owner: Neutral + Location: 132,44 + Actor571: t12 + Owner: Neutral + Location: 124,57 + Actor572: t13 + Owner: Neutral + Location: 103,35 + Actor573: t17 + Owner: Neutral + Location: 15,72 + Actor574: t16 + Owner: Neutral + Location: 113,67 + Actor575: t05 + Owner: Neutral + Location: 94,104 + Actor576: t08 + Owner: Neutral + Location: 16,88 + Actor577: t03 + Owner: Neutral + Location: 105,99 + Actor578: t16 + Owner: Neutral + Location: 144,85 + Actor579: t03 + Owner: Neutral + Location: 96,104 + Actor580: t01 + Owner: Neutral + Location: 75,23 + Actor581: t01 + Owner: Neutral + Location: 113,107 + Actor582: t06 + Owner: Neutral + Location: 3,4 + Actor583: t16.husk + Owner: Neutral + Location: 0,57 + Actor584: t02 + Owner: Neutral + Location: 66,38 + Actor585: t08 + Owner: Neutral + Location: 73,97 + Actor586: t03 + Owner: Neutral + Location: 33,71 + Actor587: t13 + Owner: Neutral + Location: 121,69 + Actor589: t08 + Owner: Neutral + Location: 112,66 + Actor590: t05.husk + Owner: Neutral + Location: 139,77 + Actor591: t13 + Owner: Neutral + Location: 34,70 + Actor592: t01 + Owner: Neutral + Location: 107,34 + Actor593: t03 + Owner: Neutral + Location: 31,73 + Actor594: t12 + Owner: Neutral + Location: 122,111 + Actor595: t07.husk + Owner: Neutral + Location: 2,14 + Actor596: t03 + Owner: Neutral + Location: 21,61 + Actor597: t02 + Owner: Neutral + Location: 72,17 + Actor598: t17 + Owner: Neutral + Location: 53,2 + Actor599: t07 + Owner: Neutral + Location: 33,78 + Actor600: t06 + Owner: Neutral + Location: 103,8 + Actor601: t13 + Owner: Neutral + Location: 58,88 + Actor602: t02.husk + Owner: Neutral + Location: 17,52 + Actor603: t06 + Owner: Neutral + Location: 122,68 + Actor604: t16 + Owner: Neutral + Location: 75,41 + Actor605: t06.husk + Owner: Neutral + Location: 56,3 + Actor606: t01 + Owner: Neutral + Location: 88,22 + Actor608: t01 + Owner: Neutral + Location: 123,110 + Actor609: t16 + Owner: Neutral + Location: 54,75 + Actor610: t08 + Owner: Neutral + Location: 117,62 + Actor611: t05 + Owner: Neutral + Location: 51,34 + Actor613: t02 + Owner: Neutral + Location: 118,67 + Actor614: t05 + Owner: Neutral + Location: 142,87 + Actor615: t01.husk + Owner: Neutral + Location: 93,105 + Actor617: t03 + Owner: Neutral + Location: 118,107 + Actor618: t05.husk + Owner: Neutral + Location: 102,18 + Actor619: t06 + Owner: Neutral + Location: 102,21 + Actor620: t16 + Owner: Neutral + Location: 100,89 + Actor621: t16 + Owner: Neutral + Location: 121,66 + Actor622: t01 + Owner: Neutral + Location: 133,107 + Actor623: t05 + Owner: Neutral + Location: 76,40 + Actor624: t07 + Owner: Neutral + Location: 44,45 + Actor625: t17 + Owner: Neutral + Location: 103,33 + Actor626: t16 + Owner: Neutral + Location: 74,15 + Actor627: t01 + Owner: Neutral + Location: 52,74 + Actor628: t06 + Owner: Neutral + Location: 12,26 + Actor630: t06 + Owner: Neutral + Location: 3,29 + Actor631: t17 + Owner: Neutral + Location: 105,17 + Actor632: t06 + Owner: Neutral + Location: 51,10 + Actor633: t02 + Owner: Neutral + Location: 124,66 + Actor634: t05 + Owner: Neutral + Location: 92,15 + Actor635: t17 + Owner: Neutral + Location: 6,104 + Actor636: t03 + Owner: Neutral + Location: 91,105 + Actor637: t12.husk + Owner: Neutral + Location: 12,55 + Actor638: t16 + Owner: Neutral + Location: 2,90 + Actor639: t13 + Owner: Neutral + Location: 11,72 + Actor641: t03 + Owner: Neutral + Location: 77,45 + Actor642: t07 + Owner: Neutral + Location: 59,86 + Actor643: t05 + Owner: Neutral + Location: 144,69 + Actor646: t13 + Owner: Neutral + Location: 133,108 + Actor647: t08 + Owner: Neutral + Location: 19,49 + Actor648: t13 + Owner: Neutral + Location: 4,0 + Actor649: t13 + Owner: Neutral + Location: 10,72 + Actor650: t01 + Owner: Neutral + Location: 107,92 + Actor651: t06 + Owner: Neutral + Location: 75,28 + Actor652: t16 + Owner: Neutral + Location: 88,94 + Actor655: t01 + Owner: Neutral + Location: 52,106 + Actor656: t06 + Owner: Neutral + Location: 75,44 + Actor657: t05 + Owner: Neutral + Location: 30,78 + Actor658: t16 + Owner: Neutral + Location: 17,84 + Actor659: t08 + Owner: Neutral + Location: 4,30 + Actor660: t16 + Owner: Neutral + Location: 113,64 + Actor661: t16 + Owner: Neutral + Location: 12,71 + Actor662: t08 + Owner: Neutral + Location: 31,64 + Actor663: t07 + Owner: Neutral + Location: 34,66 + Actor664: t06 + Owner: Neutral + Location: 89,103 + Actor665: t05 + Owner: Neutral + Location: 98,91 + Actor666: t03.husk + Owner: Neutral + Location: 139,82 + Actor667: t16 + Owner: Neutral + Location: 8,70 + Actor668: t02 + Owner: Neutral + Location: 106,121 + Actor669: t16 + Owner: Neutral + Location: 109,10 + Actor670: t01 + Owner: Neutral + Location: 120,108 + Actor671: t17 + Owner: Neutral + Location: 34,73 + Actor672: t02 + Owner: Neutral + Location: 64,35 + Actor673: t05 + Owner: Neutral + Location: 1,83 + Actor674: t06 + Owner: Neutral + Location: 53,11 + Actor675: t17 + Owner: Neutral + Location: 99,92 + Actor676: t12 + Owner: Neutral + Location: 80,127 + Actor677: t17 + Owner: Neutral + Location: 68,7 + Actor678: t07 + Owner: Neutral + Location: 103,93 + Actor680: t12 + Owner: Neutral + Location: 35,66 + Actor681: t08 + Owner: Neutral + Location: 54,78 + Actor682: t17 + Owner: Neutral + Location: 18,112 + Actor683: t07 + Owner: Neutral + Location: 74,44 + Actor684: t05 + Owner: Neutral + Location: 17,112 + Actor685: t01 + Owner: Neutral + Location: 114,106 + Actor687: t01 + Owner: Neutral + Location: 37,66 + Actor688: t17 + Owner: Neutral + Location: 119,59 + Actor689: t02 + Owner: Neutral + Location: 108,36 + Actor690: t16 + Owner: Neutral + Location: 47,112 + Actor691: t13 + Owner: Neutral + Location: 5,9 + Actor692: t17 + Owner: Neutral + Location: 37,76 + Actor693: t12 + Owner: Neutral + Location: 62,88 + Actor694: t05 + Owner: Neutral + Location: 108,95 + Actor695: t01 + Owner: Neutral + Location: 144,12 + Actor696: t06 + Owner: Neutral + Location: 72,18 + Actor697: t07 + Owner: Neutral + Location: 134,40 + Actor698: t02 + Owner: Neutral + Location: 119,104 + Actor700: t05 + Owner: Neutral + Location: 103,108 + Actor701: t06 + Owner: Neutral + Location: 123,108 + Actor702: t07 + Owner: Neutral + Location: 69,5 + Actor703: t08.husk + Owner: Neutral + Location: 61,82 + Actor704: t05 + Owner: Neutral + Location: 110,67 + Actor705: t16 + Owner: Neutral + Location: 3,123 + Actor706: t07 + Owner: Neutral + Location: 14,32 + Actor707: t08 + Owner: Neutral + Location: 19,65 + Actor708: t02 + Owner: Neutral + Location: 122,106 + Actor709: t07 + Owner: Neutral + Location: 75,3 + Actor710: t17 + Owner: Neutral + Location: 13,117 + Actor711: t13 + Owner: Neutral + Location: 63,4 + Actor712: t13 + Owner: Neutral + Location: 140,78 + Actor713: t16 + Owner: Neutral + Location: 109,95 + Actor714: t01 + Owner: Neutral + Location: 1,31 + Actor715: t13.husk + Owner: Neutral + Location: 143,80 + Actor717: t03 + Owner: Neutral + Location: 12,72 + Actor718: t03.husk + Owner: Neutral + Location: 58,75 + Actor719: t12 + Owner: Neutral + Location: 79,46 + Actor720: t13 + Owner: Neutral + Location: 77,43 + Actor721: t17 + Owner: Neutral + Location: 126,62 + Actor722: t03 + Owner: Neutral + Location: 76,3 + Actor725: t05 + Owner: Neutral + Location: 17,88 + Actor726: t13 + Owner: Neutral + Location: 56,43 + Actor727: t07 + Owner: Neutral + Location: 53,107 + Actor728: t06.husk + Owner: Neutral + Location: 112,63 + Actor729: t02 + Owner: Neutral + Location: 4,117 + Actor730: t06 + Owner: Neutral + Location: 133,106 + Actor731: t08 + Owner: Neutral + Location: 104,96 + Actor732: t17 + Owner: Neutral + Location: 52,11 + Actor733: t07 + Owner: Neutral + Location: 140,85 + Actor734: t06 + Owner: Neutral + Location: 80,47 + Actor735: t06 + Owner: Neutral + Location: 4,105 + Actor736: t08 + Owner: Neutral + Location: 2,17 + Actor737: t16 + Owner: Neutral + Location: 75,32 + Actor738: t17 + Owner: Neutral + Location: 108,12 + Actor739: t05 + Owner: Neutral + Location: 12,53 + Actor740: t17 + Owner: Neutral + Location: 92,100 + Actor742: t17 + Owner: Neutral + Location: 0,30 + Actor743: t08 + Owner: Neutral + Location: 91,18 + Actor744: t02.husk + Owner: Neutral + Location: 132,40 + Actor746: t01 + Owner: Neutral + Location: 84,30 + Actor748: t12 + Owner: Neutral + Location: 102,90 + Actor750: t13 + Owner: Neutral + Location: 103,120 + Actor751: t02 + Owner: Neutral + Location: 46,18 + Actor752: t06.husk + Owner: Neutral + Location: 29,66 + Actor753: t13 + Owner: Neutral + Location: 5,104 + Actor754: t03 + Owner: Neutral + Location: 2,117 + Actor755: t03 + Owner: Neutral + Location: 101,122 + Actor756: t01 + Owner: Neutral + Location: 130,25 + Actor757: t07 + Owner: Neutral + Location: 20,59 + Actor758: t03 + Owner: Neutral + Location: 22,100 + Actor759: t12 + Owner: Neutral + Location: 69,105 + Actor760: t07 + Owner: Neutral + Location: 1,3 + Actor761: t13 + Owner: Neutral + Location: 53,81 + Actor762: t13 + Owner: Neutral + Location: 94,91 + Actor763: t01 + Owner: Neutral + Location: 123,122 + Actor765: t12 + Owner: Neutral + Location: 105,98 + Actor766: t08 + Owner: Neutral + Location: 53,84 + Actor767: t03 + Owner: Neutral + Location: 95,106 + Actor768: t08 + Owner: Neutral + Location: 143,77 + Actor769: t13 + Owner: Neutral + Location: 121,107 + Actor770: t06 + Owner: Neutral + Location: 14,57 + Actor771: t08 + Owner: Neutral + Location: 108,89 + Actor772: t08 + Owner: Neutral + Location: 97,123 + Actor773: t08 + Owner: Neutral + Location: 3,16 + Actor774: t07 + Owner: Neutral + Location: 26,70 + Actor775: t13 + Owner: Neutral + Location: 102,120 + Actor776: t16.husk + Owner: Neutral + Location: 57,3 + Actor777: t05 + Owner: Neutral + Location: 144,18 + Actor779: t07 + Owner: Neutral + Location: 102,88 + Actor780: t16 + Owner: Neutral + Location: 142,85 + Actor781: t07 + Owner: Neutral + Location: 108,34 + Actor782: t16 + Owner: Neutral + Location: 12,70 + Actor783: t13 + Owner: Neutral + Location: 18,64 + Actor784: t08 + Owner: Neutral + Location: 54,89 + Actor786: t16 + Owner: Neutral + Location: 144,78 + Actor787: t12 + Owner: Neutral + Location: 99,124 + Actor788: t13 + Owner: Neutral + Location: 106,94 + Actor789: t06 + Owner: Neutral + Location: 30,73 + Actor790: t03 + Owner: Neutral + Location: 27,73 + Actor791: t17 + Owner: Neutral + Location: 87,98 + Actor792: t08 + Owner: Neutral + Location: 55,85 + Actor793: t02 + Owner: Neutral + Location: 4,9 + Actor794: t16.husk + Owner: Neutral + Location: 13,118 + Actor795: t17 + Owner: Neutral + Location: 135,29 + Actor796: t08 + Owner: Neutral + Location: 109,35 + Actor797: t12 + Owner: Neutral + Location: 1,118 + Actor799: t02 + Owner: Neutral + Location: 129,29 + Actor800: t13 + Owner: Neutral + Location: 29,43 + Actor801: t03 + Owner: Neutral + Location: 113,110 + Actor802: t13 + Owner: Neutral + Location: 1,86 + Actor803: t08 + Owner: Neutral + Location: 144,77 + Actor804: t12 + Owner: Neutral + Location: 113,62 + Actor805: t17 + Owner: Neutral + Location: 17,73 + Actor806: t06 + Owner: Neutral + Location: 66,40 + Actor808: t05 + Owner: Neutral + Location: 116,104 + Actor809: t08 + Owner: Neutral + Location: 5,19 + Actor810: t17 + Owner: Neutral + Location: 48,116 + Actor811: t17 + Owner: Neutral + Location: 113,44 + Actor813: t06 + Owner: Neutral + Location: 70,105 + Actor814: t16 + Owner: Neutral + Location: 132,30 + Actor815: t02 + Owner: Neutral + Location: 90,90 + Actor816: t01 + Owner: Neutral + Location: 33,52 + Actor817: t17 + Owner: Neutral + Location: 18,71 + Actor818: t01 + Owner: Neutral + Location: 73,31 + Actor819: t12 + Owner: Neutral + Location: 100,88 + Actor820: t01 + Owner: Neutral + Location: 100,36 + Actor821: t12 + Owner: Neutral + Location: 65,89 + Actor822: t05 + Owner: Neutral + Location: 57,0 + Actor823: t07 + Owner: Neutral + Location: 87,99 + Actor824: t08 + Owner: Neutral + Location: 101,56 + Actor825: t05 + Owner: Neutral + Location: 10,70 + Actor826: t02 + Owner: Neutral + Location: 29,54 + Actor827: t12 + Owner: Neutral + Location: 26,69 + Actor828: t03 + Owner: Neutral + Location: 46,42 + Actor829: t16 + Owner: Neutral + Location: 102,125 + Actor830: t06 + Owner: Neutral + Location: 94,96 + Actor831: t12 + Owner: Neutral + Location: 121,111 + Actor832: t03 + Owner: Neutral + Location: 35,57 + Actor833: t03 + Owner: Neutral + Location: 143,87 + Actor834: t02 + Owner: Neutral + Location: 46,37 + Actor835: t07.husk + Owner: Neutral + Location: 110,33 + Actor836: t03 + Owner: Neutral + Location: 15,85 + Actor837: t02 + Owner: Neutral + Location: 121,109 + Actor839: t13 + Owner: Neutral + Location: 54,76 + Actor840: t13.husk + Owner: Neutral + Location: 19,111 + Actor841: t07 + Owner: Neutral + Location: 16,56 + Actor843: t06 + Owner: Neutral + Location: 16,61 + Actor844: t03 + Owner: Neutral + Location: 62,87 + Actor845: t01 + Owner: Neutral + Location: 128,28 + Actor846: t02 + Owner: Neutral + Location: 102,98 + Actor847: t05 + Owner: Neutral + Location: 45,31 + Actor848: t12 + Owner: Neutral + Location: 85,30 + Actor849: t16.husk + Owner: Neutral + Location: 28,67 + Actor850: t16 + Owner: Neutral + Location: 91,90 + Actor852: t05 + Owner: Neutral + Location: 56,2 + Actor854: t02 + Owner: Neutral + Location: 127,44 + Actor855: t02 + Owner: Neutral + Location: 61,78 + Actor856: t13 + Owner: Neutral + Location: 105,88 + Actor857: t17 + Owner: Neutral + Location: 5,11 + Actor858: t03 + Owner: Neutral + Location: 15,71 + Actor859: t06.husk + Owner: Neutral + Location: 29,77 + Actor860: t05 + Owner: Neutral + Location: 5,19 + Actor861: t16 + Owner: Neutral + Location: 51,105 + Actor862: t17 + Owner: Neutral + Location: 46,14 + Actor863: t12 + Owner: Neutral + Location: 4,16 + Actor864: t08 + Owner: Neutral + Location: 100,129 + Actor865: t05 + Owner: Neutral + Location: 34,74 + Actor866: t01.husk + Owner: Neutral + Location: 16,17 + Actor867: t06 + Owner: Neutral + Location: 137,110 + Actor868: t13 + Owner: Neutral + Location: 52,31 + Actor869: t17 + Owner: Neutral + Location: 117,107 + Actor871: t01 + Owner: Neutral + Location: 90,18 + Actor872: t16.husk + Owner: Neutral + Location: 53,89 + Actor873: t17 + Owner: Neutral + Location: 93,93 + Actor874: t17 + Owner: Neutral + Location: 107,36 + Actor875: t17 + Owner: Neutral + Location: 74,2 + Actor876: t13 + Owner: Neutral + Location: 31,62 + Actor878: t12 + Owner: Neutral + Location: 126,73 + Actor879: t08 + Owner: Neutral + Location: 143,79 + Actor880: t12 + Owner: Neutral + Location: 112,68 + Actor881: t07 + Owner: Neutral + Location: 35,75 + Actor882: t03 + Owner: Neutral + Location: 29,60 + Actor883: t12 + Owner: Neutral + Location: 19,112 + Actor884: t08 + Owner: Neutral + Location: 47,15 + Actor885: t16 + Owner: Neutral + Location: 1,23 + Actor886: t17 + Owner: Neutral + Location: 67,86 + Actor887: t01 + Owner: Neutral + Location: 101,8 + Actor889: t17 + Owner: Neutral + Location: 55,3 + Actor890: t01 + Owner: Neutral + Location: 117,98 + Actor891: t02 + Owner: Neutral + Location: 143,82 + Actor892: t12 + Owner: Neutral + Location: 124,56 + Actor893: t08 + Owner: Neutral + Location: 101,16 + Actor894: t07 + Owner: Neutral + Location: 115,109 + Actor895: t12 + Owner: Neutral + Location: 53,108 + Actor896: t02 + Owner: Neutral + Location: 138,82 + Actor897: t16 + Owner: Neutral + Location: 49,29 + Actor898: t08 + Owner: Neutral + Location: 15,69 + Actor899: t08 + Owner: Neutral + Location: 52,34 + Actor900: t16.husk + Owner: Neutral + Location: 3,12 + Actor902: t02 + Owner: Neutral + Location: 33,76 + Actor903: t16 + Owner: Neutral + Location: 58,86 + Actor904: t16 + Owner: Neutral + Location: 118,106 + Actor905: t06 + Owner: Neutral + Location: 6,105 + Actor906: t01 + Owner: Neutral + Location: 7,103 + Actor907: t06 + Owner: Neutral + Location: 7,3 + Actor908: t12 + Owner: Neutral + Location: 121,104 + Actor909: t17 + Owner: Neutral + Location: 30,62 + Actor910: t03.husk + Owner: Neutral + Location: 1,2 + Actor911: t13.husk + Owner: Neutral + Location: 144,16 + Actor912: t05 + Owner: Neutral + Location: 47,117 + Actor913: t02 + Owner: Neutral + Location: 15,48 + Actor914: t05 + Owner: Neutral + Location: 47,11 + Actor915: t03 + Owner: Neutral + Location: 56,74 + Actor916: t13.husk + Owner: Neutral + Location: 48,113 + Actor917: t03 + Owner: Neutral + Location: 107,35 + Actor918: t03 + Owner: Neutral + Location: 47,1 + Actor919: t17 + Owner: Neutral + Location: 18,67 + Actor920: t07 + Owner: Neutral + Location: 88,97 + Actor921: t13 + Owner: Neutral + Location: 11,59 + Actor922: t05 + Owner: Neutral + Location: 88,18 + Actor923: t08 + Owner: Neutral + Location: 21,60 + Actor924: t12 + Owner: Neutral + Location: 109,64 + Actor925: t03 + Owner: Neutral + Location: 51,1 + Actor926: t01.husk + Owner: Neutral + Location: 19,62 + Actor927: t06 + Owner: Neutral + Location: 114,105 + Actor928: t08 + Owner: Neutral + Location: 48,111 + Actor929: t12 + Owner: Neutral + Location: 82,45 + Actor930: t06 + Owner: Neutral + Location: 102,9 + Actor931: t12 + Owner: Neutral + Location: 6,125 + Actor932: t17 + Owner: Neutral + Location: 43,37 + Actor933: t06 + Owner: Neutral + Location: 83,51 + Actor934: t08 + Owner: Neutral + Location: 58,82 + Actor935: t07 + Owner: Neutral + Location: 57,90 + Actor936: t17 + Owner: Neutral + Location: 107,93 + Actor937: t13 + Owner: Neutral + Location: 123,57 + Actor938: t17.husk + Owner: Neutral + Location: 35,65 + Actor939: t12 + Owner: Neutral + Location: 1,8 + Actor941: t05 + Owner: Neutral + Location: 128,24 + Actor942: t17 + Owner: Neutral + Location: 83,12 + Actor943: t17 + Owner: Neutral + Location: 51,79 + Actor944: t03 + Owner: Neutral + Location: 103,31 + Actor945: t08 + Owner: Neutral + Location: 103,92 + Actor946: t03.husk + Owner: Neutral + Location: 104,94 + Actor950: t05.husk + Owner: Neutral + Location: 73,18 + Actor951: t01 + Owner: Neutral + Location: 3,31 + Actor952: t16 + Owner: Neutral + Location: 44,44 + Actor953: t06 + Owner: Neutral + Location: 21,60 + Actor954: t06 + Owner: Neutral + Location: 75,124 + Actor955: t05 + Owner: Neutral + Location: 113,61 + Actor956: t13 + Owner: Neutral + Location: 46,16 + Actor957: t06 + Owner: Neutral + Location: 103,127 + Actor959: t02 + Owner: Neutral + Location: 54,74 + Actor961: t07 + Owner: Neutral + Location: 102,92 + Actor962: t03 + Owner: Neutral + Location: 27,71 + Actor963: t05 + Owner: Neutral + Location: 74,4 + Actor965: t05 + Owner: Neutral + Location: 47,114 + Actor966: t12 + Owner: Neutral + Location: 36,72 + Actor967: t02 + Owner: Neutral + Location: 2,18 + Actor968: t08 + Owner: Neutral + Location: 29,80 + Actor969: t07 + Owner: Neutral + Location: 77,126 + Actor970: t05 + Owner: Neutral + Location: 5,0 + Actor971: t07 + Owner: Neutral + Location: 0,58 + Actor972: t07 + Owner: Neutral + Location: 141,85 + Actor973: t02 + Owner: Neutral + Location: 41,72 + Actor974: t03 + Owner: Neutral + Location: 67,7 + Actor975: t02 + Owner: Neutral + Location: 32,52 + Actor976: t05 + Owner: Neutral + Location: 120,104 + Actor977: t17 + Owner: Neutral + Location: 1,91 + Actor978: t06 + Owner: Neutral + Location: 124,63 + Actor979: t12 + Owner: Neutral + Location: 103,123 + Actor980: t07 + Owner: Neutral + Location: 102,8 + Actor981: t13 + Owner: Neutral + Location: 143,86 + Actor982: t17 + Owner: Neutral + Location: 118,61 + Actor983: t03 + Owner: Neutral + Location: 79,50 + Actor984: t08 + Owner: Neutral + Location: 44,40 + Actor985: t08 + Owner: Neutral + Location: 81,50 + Actor986: t07 + Owner: Neutral + Location: 74,39 + Actor987: t08.husk + Owner: Neutral + Location: 104,88 + Actor988: t13 + Owner: Neutral + Location: 33,54 + Actor989: t07.husk + Owner: Neutral + Location: 119,103 + Actor990: t12 + Owner: Neutral + Location: 50,106 + Actor991: t06.husk + Owner: Neutral + Location: 47,13 + Actor992: t16 + Owner: Neutral + Location: 58,4 + Actor993: t13 + Owner: Neutral + Location: 4,104 + Actor994: t12 + Owner: Neutral + Location: 64,36 + Actor995: t08 + Owner: Neutral + Location: 85,52 + Actor996: t03 + Owner: Neutral + Location: 41,41 + Actor997: t08 + Owner: Neutral + Location: 126,75 + Actor998: t07 + Owner: Neutral + Location: 100,85 + Actor999: t08 + Owner: Neutral + Location: 91,96 + Actor1000: t01 + Owner: Neutral + Location: 1,96 + Actor1002: t05 + Owner: Neutral + Location: 37,57 + Actor1003: t01 + Owner: Neutral + Location: 115,62 + Actor1004: t13 + Owner: Neutral + Location: 99,37 + Actor1005: t06 + Owner: Neutral + Location: 57,76 + Actor1006: t17 + Owner: Neutral + Location: 75,127 + Actor1007: t06 + Owner: Neutral + Location: 102,93 + Actor1008: t12 + Owner: Neutral + Location: 51,77 + Actor1009: t13.husk + Owner: Neutral + Location: 94,93 + Actor1010: t05 + Owner: Neutral + Location: 16,68 + Actor1012: t03 + Owner: Neutral + Location: 119,107 + Actor1013: t07 + Owner: Neutral + Location: 54,2 + Actor1014: t12 + Owner: Neutral + Location: 122,110 + Actor1015: t06 + Owner: Neutral + Location: 63,83 + Actor1018: t03 + Owner: Neutral + Location: 100,93 + Actor1019: t17 + Owner: Neutral + Location: 51,108 + Actor1020: t06 + Owner: Neutral + Location: 2,7 + Actor1021: t06 + Owner: Neutral + Location: 138,83 + Actor1022: t07 + Owner: Neutral + Location: 95,100 + Actor1023: t01 + Owner: Neutral + Location: 122,14 + Actor1024: t13 + Owner: Neutral + Location: 7,2 + Actor1025: t01 + Owner: Neutral + Location: 101,96 + Actor1026: t03 + Owner: Neutral + Location: 15,25 + Actor1027: t03 + Owner: Neutral + Location: 132,100 + Actor1028: t08 + Owner: Neutral + Location: 57,0 + Actor1029: t16 + Owner: Neutral + Location: 57,84 + Actor1030: t07.husk + Owner: Neutral + Location: 4,124 + Actor1031: t08.husk + Owner: Neutral + Location: 101,11 + Actor1032: t02 + Owner: Neutral + Location: 77,125 + Actor1033: t13 + Owner: Neutral + Location: 89,96 + Actor1034: t05 + Owner: Neutral + Location: 105,92 + Actor1035: t13 + Owner: Neutral + Location: 95,93 + Actor1036: t05 + Owner: Neutral + Location: 90,15 + Actor1037: t06 + Owner: Neutral + Location: 60,87 + Actor1038: t06 + Owner: Neutral + Location: 16,62 + Actor1039: t01 + Owner: Neutral + Location: 89,92 + Actor1040: t07 + Owner: Neutral + Location: 49,110 + Actor1041: t07 + Owner: Neutral + Location: 109,29 + Actor1042: t17 + Owner: Neutral + Location: 137,105 + Actor1044: t12 + Owner: Neutral + Location: 117,64 + Actor1045: t12 + Owner: Neutral + Location: 0,13 + Actor1046: t12 + Owner: Neutral + Location: 84,12 + Actor1047: t01 + Owner: Neutral + Location: 27,77 + Actor1048: t01 + Owner: Neutral + Location: 2,58 + Actor1049: t01 + Owner: Neutral + Location: 89,18 + Actor1051: t02 + Owner: Neutral + Location: 73,17 + Actor1052: t13 + Owner: Neutral + Location: 17,86 + Actor1053: t16 + Owner: Neutral + Location: 95,96 + Actor1054: t02 + Owner: Neutral + Location: 58,79 + Actor1055: t16 + Owner: Neutral + Location: 80,50 + Actor1056: t01 + Owner: Neutral + Location: 14,68 + Actor1057: t01 + Owner: Neutral + Location: 47,18 + Actor1058: t08 + Owner: Neutral + Location: 111,113 + Actor1059: t08 + Owner: Neutral + Location: 34,65 + Actor1061: t08 + Owner: Neutral + Location: 57,86 + Actor1062: t01 + Owner: Neutral + Location: 16,52 + Actor1065: t12 + Owner: Neutral + Location: 31,68 + Actor1066: t16 + Owner: Neutral + Location: 59,76 + Actor1067: t07 + Owner: Neutral + Location: 128,26 + Actor1068: t13 + Owner: Neutral + Location: 34,53 + Actor1069: t06 + Owner: Neutral + Location: 0,12 + Actor1070: t08 + Owner: Neutral + Location: 41,40 + Actor1071: t12.husk + Owner: Neutral + Location: 14,74 + Actor1073: t01.husk + Owner: Neutral + Location: 46,1 + Actor1074: t05.husk + Owner: Neutral + Location: 124,13 + Actor1075: t05 + Owner: Neutral + Location: 121,14 + Actor1076: t01 + Owner: Neutral + Location: 3,116 + Actor1077: t08.husk + Owner: Neutral + Location: 43,42 + Actor1078: t02 + Owner: Neutral + Location: 102,89 + Actor1079: t12 + Owner: Neutral + Location: 139,79 + Actor1080: t06 + Owner: Neutral + Location: 48,119 + Actor1081: t16 + Owner: Neutral + Location: 41,44 + Actor1082: t06 + Owner: Neutral + Location: 121,103 + Actor1083: t01 + Owner: Neutral + Location: 133,40 + Actor1084: t17 + Owner: Neutral + Location: 74,30 + Actor1085: t02 + Owner: Neutral + Location: 108,91 + Actor1086: t12 + Owner: Neutral + Location: 18,62 + Actor1087: t13 + Owner: Neutral + Location: 132,49 + Actor1089: t05 + Owner: Neutral + Location: 14,67 + Actor1090: t02 + Owner: Neutral + Location: 18,54 + Actor1091: t05 + Owner: Neutral + Location: 93,94 + Actor1092: t16 + Owner: Neutral + Location: 73,30 + Actor1093: t02 + Owner: Neutral + Location: 102,96 + Actor1094: t05 + Owner: Neutral + Location: 2,91 + Actor1095: t02 + Owner: Neutral + Location: 118,98 + Actor1096: t03 + Owner: Neutral + Location: 20,26 + Actor1097: t17 + Owner: Neutral + Location: 130,66 + Actor1098: t13 + Owner: Neutral + Location: 95,102 + Actor1099: t03 + Owner: Neutral + Location: 93,102 + Actor1100: t17 + Owner: Neutral + Location: 129,28 + Actor1101: t06 + Owner: Neutral + Location: 41,43 + Actor1102: t01 + Owner: Neutral + Location: 48,42 + Actor1103: t17 + Owner: Neutral + Location: 49,109 + Actor1104: t01 + Owner: Neutral + Location: 33,53 + Actor1105: t17 + Owner: Neutral + Location: 30,59 + Actor1106: t02 + Owner: Neutral + Location: 143,14 + Actor1107: t12.husk + Owner: Neutral + Location: 13,73 + Actor1108: t08 + Owner: Neutral + Location: 5,15 + Actor1109: t07.husk + Owner: Neutral + Location: 56,81 + Actor1110: t01 + Owner: Neutral + Location: 121,15 + Actor1111: t06 + Owner: Neutral + Location: 17,113 + Actor1112: t03 + Owner: Neutral + Location: 102,86 + Actor1113: t08 + Owner: Neutral + Location: 16,89 + Actor1114: t05.husk + Owner: Neutral + Location: 138,30 + Actor1115: t02 + Owner: Neutral + Location: 16,83 + Actor1116: t08 + Owner: Neutral + Location: 121,115 + Actor1117: t02 + Owner: Neutral + Location: 6,102 + Actor1118: t06 + Owner: Neutral + Location: 119,122 + Actor1119: t08 + Owner: Neutral + Location: 38,58 + Actor1120: t12 + Owner: Neutral + Location: 107,32 + Actor1121: t07 + Owner: Neutral + Location: 51,106 + Actor1122: t07 + Owner: Neutral + Location: 142,80 + Actor1123: t13.husk + Owner: Neutral + Location: 62,84 + Actor1124: t02 + Owner: Neutral + Location: 120,97 + Actor1125: t08 + Owner: Neutral + Location: 83,49 + Actor1126: t17 + Owner: Neutral + Location: 143,84 + Actor1127: t17 + Owner: Neutral + Location: 102,17 + Actor1128: t08 + Owner: Neutral + Location: 28,70 + Actor1129: t03 + Owner: Neutral + Location: 1,18 + Actor1130: t17.husk + Owner: Neutral + Location: 27,78 + Actor1131: t02 + Owner: Neutral + Location: 92,99 + Actor1132: t13.husk + Owner: Neutral + Location: 132,29 + Actor1133: t07 + Owner: Neutral + Location: 41,38 + Actor1134: t07 + Owner: Neutral + Location: 34,61 + Actor1135: t02 + Owner: Neutral + Location: 94,100 + Actor1136: t17 + Owner: Neutral + Location: 50,108 + Actor1139: t08 + Owner: Neutral + Location: 31,78 + Actor1140: t08 + Owner: Neutral + Location: 3,125 + Actor1141: t13 + Owner: Neutral + Location: 58,84 + Actor1142: t17 + Owner: Neutral + Location: 103,92 + Actor1143: t16 + Owner: Neutral + Location: 112,45 + Actor1145: t03 + Owner: Neutral + Location: 29,67 + Actor1146: t17 + Owner: Neutral + Location: 35,76 + Actor1147: t02 + Owner: Neutral + Location: 75,45 + Actor1148: t01 + Owner: Neutral + Location: 124,62 + Actor1149: t01 + Owner: Neutral + Location: 13,18 + Actor1150: t16.husk + Owner: Neutral + Location: 121,64 + Actor1151: t17 + Owner: Neutral + Location: 17,87 + Actor1153: t16 + Owner: Neutral + Location: 121,106 + Actor1154: t16 + Owner: Neutral + Location: 61,79 + Actor1155: t12 + Owner: Neutral + Location: 15,117 + Actor1156: t03 + Owner: Neutral + Location: 140,76 + Actor1157: t12 + Owner: Neutral + Location: 7,4 + Actor1158: t08 + Owner: Neutral + Location: 85,49 + Actor1159: t05 + Owner: Neutral + Location: 52,0 + Actor1161: t03 + Owner: Neutral + Location: 56,91 + Actor1162: t06 + Owner: Neutral + Location: 140,83 + Actor1163: t06 + Owner: Neutral + Location: 74,43 + Actor1165: t01.husk + Owner: Neutral + Location: 43,31 + Actor1166: t03.husk + Owner: Neutral + Location: 107,91 + Actor1167: t13 + Owner: Neutral + Location: 118,65 + Actor1168: t02 + Owner: Neutral + Location: 136,48 + Actor1169: t07 + Owner: Neutral + Location: 15,17 + Actor1170: t08 + Owner: Neutral + Location: 76,47 + Actor1171: t08 + Owner: Neutral + Location: 17,84 + Actor1172: t16 + Owner: Neutral + Location: 50,76 + Actor1173: t16 + Owner: Neutral + Location: 9,126 + Actor1174: t07 + Owner: Neutral + Location: 13,69 + Actor1175: t17 + Owner: Neutral + Location: 101,85 + Actor1176: t17 + Owner: Neutral + Location: 107,31 + Actor1177: t01 + Owner: Neutral + Location: 90,101 + Actor1178: t02 + Owner: Neutral + Location: 103,9 + Actor1179: t05 + Owner: Neutral + Location: 47,118 + Actor1180: t17 + Owner: Neutral + Location: 60,88 + Actor1181: t01 + Owner: Neutral + Location: 5,17 + Actor1182: t12 + Owner: Neutral + Location: 18,113 + Actor1183: t08 + Owner: Neutral + Location: 109,95 + Actor1184: t13 + Owner: Neutral + Location: 72,30 + Actor1185: t01 + Owner: Neutral + Location: 111,66 + Actor1186: t07 + Owner: Neutral + Location: 76,30 + Actor1187: t06 + Owner: Neutral + Location: 75,22 + Actor1188: t01 + Owner: Neutral + Location: 58,80 + Actor1189: t13 + Owner: Neutral + Location: 35,121 + Actor1191: t17 + Owner: Neutral + Location: 133,31 + Actor1192: t17.husk + Owner: Neutral + Location: 134,30 + Actor1194: t02 + Owner: Neutral + Location: 2,0 + Actor1195: t08.husk + Owner: Neutral + Location: 12,74 + Actor1196: t16.husk + Owner: Neutral + Location: 132,101 + Actor1197: t17 + Owner: Neutral + Location: 116,107 + Actor1198: t07 + Owner: Neutral + Location: 109,31 + Actor1199: t13 + Owner: Neutral + Location: 40,43 + Actor1200: t13 + Owner: Neutral + Location: 49,119 + Actor1201: t16 + Owner: Neutral + Location: 134,46 + Actor1202: t08 + Owner: Neutral + Location: 10,72 + Actor1203: t02 + Owner: Neutral + Location: 103,90 + Actor1204: t13 + Owner: Neutral + Location: 91,94 + Actor1205: t06 + Owner: Neutral + Location: 36,66 + Actor1206: t05 + Owner: Neutral + Location: 104,89 + Actor1207: t08 + Owner: Neutral + Location: 143,58 + Actor1208: t12 + Owner: Neutral + Location: 52,12 + Actor1209: t03.husk + Owner: Neutral + Location: 101,35 + Actor1210: t12 + Owner: Neutral + Location: 116,109 + Actor1211: t01 + Owner: Neutral + Location: 1,85 + Actor1212: t12 + Owner: Neutral + Location: 110,31 + Actor1214: t05 + Owner: Neutral + Location: 54,106 + Actor1215: t08 + Owner: Neutral + Location: 123,114 + Actor1216: t12 + Owner: Neutral + Location: 36,74 + Actor1217: t16 + Owner: Neutral + Location: 47,116 + Actor1218: t06 + Owner: Neutral + Location: 36,76 + Actor1219: t05 + Owner: Neutral + Location: 16,63 + Actor1220: t12 + Owner: Neutral + Location: 4,15 + Actor1221: t17 + Owner: Neutral + Location: 144,77 + Actor1222: t06 + Owner: Neutral + Location: 62,78 + Actor1223: t01 + Owner: Neutral + Location: 120,14 + Actor1224: t12 + Owner: Neutral + Location: 78,43 + Actor1225: t12.husk + Owner: Neutral + Location: 88,49 + Actor1226: t02 + Owner: Neutral + Location: 1,16 + Actor1228: t02 + Owner: Neutral + Location: 47,34 + Actor1229: t08 + Owner: Neutral + Location: 17,91 + Actor1230: t13 + Owner: Neutral + Location: 134,39 + Actor1231: t17 + Owner: Neutral + Location: 75,46 + Actor1232: t06 + Owner: Neutral + Location: 11,29 + Actor1233: t05 + Owner: Neutral + Location: 100,86 + Actor1234: t02 + Owner: Neutral + Location: 128,44 + Actor1235: t02 + Owner: Neutral + Location: 55,76 + Actor1236: t12 + Owner: Neutral + Location: 48,29 + Actor1237: t03 + Owner: Neutral + Location: 46,30 + Actor1238: t13 + Owner: Neutral + Location: 30,42 + Actor1239: t16 + Owner: Neutral + Location: 98,96 + Actor1240: t06 + Owner: Neutral + Location: 17,49 + Actor1241: t08 + Owner: Neutral + Location: 70,2 + Actor1242: t13 + Owner: Neutral + Location: 46,12 + Actor1243: t13 + Owner: Neutral + Location: 91,91 + Actor1244: t13 + Owner: Neutral + Location: 90,104 + Actor1245: t02 + Owner: Neutral + Location: 2,4 + Actor1246: t13 + Owner: Neutral + Location: 29,55 + Actor1247: t07 + Owner: Neutral + Location: 35,61 + Actor1248: t03 + Owner: Neutral + Location: 15,55 + Actor1249: t12 + Owner: Neutral + Location: 72,4 + Actor1250: t05 + Owner: Neutral + Location: 58,89 + Actor1252: t17 + Owner: Neutral + Location: 41,47 + Actor1253: t06 + Owner: Neutral + Location: 143,73 + Actor1254: t17 + Owner: Neutral + Location: 35,71 + Actor1255: t02 + Owner: Neutral + Location: 91,97 + Actor1256: t06.husk + Owner: Neutral + Location: 102,14 + Actor1258: t16 + Owner: Neutral + Location: 87,49 + Actor1259: t13 + Owner: Neutral + Location: 76,42 + Actor1260: t08 + Owner: Neutral + Location: 88,100 + Actor1261: t17 + Owner: Neutral + Location: 50,80 + Actor1262: t08 + Owner: Neutral + Location: 2,117 + Actor1263: t12 + Owner: Neutral + Location: 69,3 + Actor1264: t13 + Owner: Neutral + Location: 45,28 + Actor1265: t13 + Owner: Neutral + Location: 18,88 + Actor1266: t05 + Owner: Neutral + Location: 106,95 + Actor1267: t06 + Owner: Neutral + Location: 53,1 + Actor1268: t08 + Owner: Neutral + Location: 20,118 + Actor1269: t03 + Owner: Neutral + Location: 66,41 + Actor1270: t01 + Owner: Neutral + Location: 88,23 + Actor1272: t16 + Owner: Neutral + Location: 132,108 + Actor1273: t01 + Owner: Neutral + Location: 117,68 + Actor1274: t12 + Owner: Neutral + Location: 136,111 + Actor1276: t05 + Owner: Neutral + Location: 13,32 + Actor1277: t01 + Owner: Neutral + Location: 48,40 + Actor1278: t08 + Owner: Neutral + Location: 2,57 + Actor1279: t02 + Owner: Neutral + Location: 102,94 + Actor1280: t01.husk + Owner: Neutral + Location: 65,85 + Actor1281: t02 + Owner: Neutral + Location: 75,123 + Actor1282: t07 + Owner: Neutral + Location: 143,58 + Actor1283: t02 + Owner: Neutral + Location: 100,127 + Actor1284: t03.husk + Owner: Neutral + Location: 76,1 + Actor1285: t17 + Owner: Neutral + Location: 107,98 + Actor1286: t13 + Owner: Neutral + Location: 89,95 + Actor1287: t06 + Owner: Neutral + Location: 41,42 + Actor1288: t01 + Owner: Neutral + Location: 106,53 + Actor1289: t05 + Owner: Neutral + Location: 114,107 + Actor1290: t03 + Owner: Neutral + Location: 122,62 + Actor1291: t17 + Owner: Neutral + Location: 26,71 + Actor1292: t01 + Owner: Neutral + Location: 103,22 + Actor1293: t03 + Owner: Neutral + Location: 122,107 + Actor1294: t03 + Owner: Neutral + Location: 4,3 + Actor1296: t12 + Owner: Neutral + Location: 28,78 + Actor1297: t12 + Owner: Neutral + Location: 39,59 + Actor1298: t06 + Owner: Neutral + Location: 101,9 + Actor1299: t02.husk + Owner: Neutral + Location: 5,3 + Actor1300: t01 + Owner: Neutral + Location: 102,36 + Actor1301: t06 + Owner: Neutral + Location: 1,4 + Actor1302: t05 + Owner: Neutral + Location: 94,98 + Actor1304: t07 + Owner: Neutral + Location: 1,95 + Actor1305: t13 + Owner: Neutral + Location: 103,109 + Actor1307: t07 + Owner: Neutral + Location: 14,12 + Actor1308: t05 + Owner: Neutral + Location: 94,127 + Actor1309: t16 + Owner: Neutral + Location: 115,60 + Actor1310: t08 + Owner: Neutral + Location: 93,105 + Actor1311: t03 + Owner: Neutral + Location: 120,70 + Actor1312: t07 + Owner: Neutral + Location: 99,119 + Actor1313: t02 + Owner: Neutral + Location: 37,61 + Actor1314: t07 + Owner: Neutral + Location: 117,110 + Actor1315: t17 + Owner: Neutral + Location: 19,52 + Actor1316: t08 + Owner: Neutral + Location: 128,46 + Actor1317: t03.husk + Owner: Neutral + Location: 58,85 + Actor1318: t06 + Owner: Neutral + Location: 0,16 + Actor1319: t17.husk + Owner: Neutral + Location: 129,24 + Actor1320: t06 + Owner: Neutral + Location: 122,67 + Actor1321: t02.husk + Owner: Neutral + Location: 96,100 + Actor1322: t05 + Owner: Neutral + Location: 6,127 + Actor1323: t01 + Owner: Neutral + Location: 64,81 + Actor1325: t03 + Owner: Neutral + Location: 84,48 + Actor1326: t06.husk + Owner: Neutral + Location: 3,14 + Actor1327: t07 + Owner: Neutral + Location: 78,0 + Actor1330: t03 + Owner: Neutral + Location: 120,102 + Actor1331: t12 + Owner: Neutral + Location: 118,59 + Actor1332: t05.husk + Owner: Neutral + Location: 77,3 + Actor1333: t07 + Owner: Neutral + Location: 53,78 + Actor1334: t03 + Owner: Neutral + Location: 12,17 + Actor1335: t08 + Owner: Neutral + Location: 3,11 + Actor1336: t02 + Owner: Neutral + Location: 115,107 + Actor1337: t06 + Owner: Neutral + Location: 43,45 + Actor1338: t13.husk + Owner: Neutral + Location: 137,84 + Actor1339: t13 + Owner: Neutral + Location: 13,50 + Actor1340: t07 + Owner: Neutral + Location: 2,12 + Actor1341: t07 + Owner: Neutral + Location: 97,127 + Actor1342: t07 + Owner: Neutral + Location: 82,17 + Actor1343: t06 + Owner: Neutral + Location: 114,64 + Actor1344: t17 + Owner: Neutral + Location: 43,39 + Actor1345: t02 + Owner: Neutral + Location: 125,66 + Actor1346: t17 + Owner: Neutral + Location: 77,123 + Actor1347: t07.husk + Owner: Neutral + Location: 130,65 + Actor1348: t17 + Owner: Neutral + Location: 50,110 + Actor1349: t17 + Owner: Neutral + Location: 119,106 + Actor1350: t12 + Owner: Neutral + Location: 120,66 + Actor1351: t17 + Owner: Neutral + Location: 76,49 + Actor1352: t01 + Owner: Neutral + Location: 97,124 + Actor1353: t17 + Owner: Neutral + Location: 42,39 + Actor1354: t17 + Owner: Neutral + Location: 119,110 + Actor1355: t07 + Owner: Neutral + Location: 52,32 + Actor1356: t02 + Owner: Neutral + Location: 59,88 + Actor1357: t16.husk + Owner: Neutral + Location: 133,29 + Actor1358: t05 + Owner: Neutral + Location: 136,30 + Actor1359: t16 + Owner: Neutral + Location: 114,108 + Actor1360: t06 + Owner: Neutral + Location: 66,39 + Actor1361: t08 + Owner: Neutral + Location: 34,59 + Actor1362: t06 + Owner: Neutral + Location: 55,2 + Actor1363: t05 + Owner: Neutral + Location: 3,0 + Actor1364: t16 + Owner: Neutral + Location: 35,58 + Actor1366: t13 + Owner: Neutral + Location: 77,44 + Actor1368: t06 + Owner: Neutral + Location: 58,3 + Actor1369: t17.husk + Owner: Neutral + Location: 75,43 + Actor1370: t05.husk + Owner: Neutral + Location: 17,69 + Actor1371: t12 + Owner: Neutral + Location: 43,30 + Actor1372: t01 + Owner: Neutral + Location: 70,5 + Actor1373: t08 + Owner: Neutral + Location: 138,105 + Actor1374: t06 + Owner: Neutral + Location: 39,58 + Actor1375: t16 + Owner: Neutral + Location: 123,63 + Actor1376: t16.husk + Owner: Neutral + Location: 67,85 + Actor1377: t06 + Owner: Neutral + Location: 104,122 + Actor1378: t08 + Owner: Neutral + Location: 120,106 + Actor1379: t07 + Owner: Neutral + Location: 119,111 + Actor1380: t17 + Owner: Neutral + Location: 131,99 + Actor1381: t12 + Owner: Neutral + Location: 95,89 + Actor1382: t07 + Owner: Neutral + Location: 103,88 + Actor1383: t13 + Owner: Neutral + Location: 103,56 + Actor1385: t03 + Owner: Neutral + Location: 103,18 + Actor1386: t12 + Owner: Neutral + Location: 55,82 + Actor1387: t05 + Owner: Neutral + Location: 3,24 + Actor1388: t03 + Owner: Neutral + Location: 116,59 + Actor1389: t01 + Owner: Neutral + Location: 62,89 + Actor1390: t03 + Owner: Neutral + Location: 89,94 + Actor1391: t03 + Owner: Neutral + Location: 108,97 + Actor1392: t02 + Owner: Neutral + Location: 70,0 + Actor1393: t16 + Owner: Neutral + Location: 13,37 + Actor1394: t02 + Owner: Neutral + Location: 104,107 + Actor1395: t12 + Owner: Neutral + Location: 118,64 + Actor1396: t16 + Owner: Neutral + Location: 111,63 + Actor1397: t05 + Owner: Neutral + Location: 12,117 + Actor1398: t08 + Owner: Neutral + Location: 48,33 + Actor1399: t16 + Owner: Neutral + Location: 29,76 + Actor1401: t07 + Owner: Neutral + Location: 52,107 + Actor1402: t12 + Owner: Neutral + Location: 144,65 + Actor1403: t03 + Owner: Neutral + Location: 51,109 + Actor1405: t08 + Owner: Neutral + Location: 52,78 + Actor1406: t13 + Owner: Neutral + Location: 29,59 + Actor1407: t06 + Owner: Neutral + Location: 77,46 + Actor1408: t08 + Owner: Neutral + Location: 84,14 + Actor1409: t05 + Owner: Neutral + Location: 11,58 + Actor1410: t12 + Owner: Neutral + Location: 90,102 + Actor1411: t12 + Owner: Neutral + Location: 115,108 + Actor1412: t08 + Owner: Neutral + Location: 103,129 + Actor1413: t05 + Owner: Neutral + Location: 75,29 + Actor1414: t13 + Owner: Neutral + Location: 116,110 + Actor1415: t02 + Owner: Neutral + Location: 13,58 + Actor1417: t08.husk + Owner: Neutral + Location: 83,15 + Actor1419: t12 + Owner: Neutral + Location: 121,97 + Actor1420: t12 + Owner: Neutral + Location: 28,65 + Actor1421: t02 + Owner: Neutral + Location: 20,58 + Actor1422: t13 + Owner: Neutral + Location: 106,122 + Actor1424: t01.husk + Owner: Neutral + Location: 93,101 + Actor1425: t07 + Owner: Neutral + Location: 142,75 + Actor1426: t03 + Owner: Neutral + Location: 74,96 + Actor1427: t03 + Owner: Neutral + Location: 34,71 + Actor1428: t03 + Owner: Neutral + Location: 51,83 + Actor1429: t05.husk + Owner: Neutral + Location: 34,34 + Actor1430: t08 + Owner: Neutral + Location: 0,32 + Actor1431: t12 + Owner: Neutral + Location: 106,89 + Actor1433: t05 + Owner: Neutral + Location: 29,53 + Actor1434: t17 + Owner: Neutral + Location: 52,76 + Actor1435: t05 + Owner: Neutral + Location: 126,45 + Actor1436: t02 + Owner: Neutral + Location: 11,56 + Actor1437: t13 + Owner: Neutral + Location: 86,17 + Actor1438: t17 + Owner: Neutral + Location: 4,24 + Actor1439: t06 + Owner: Neutral + Location: 139,103 + Actor1440: t01 + Owner: Neutral + Location: 36,57 + Actor1441: t05.husk + Owner: Neutral + Location: 117,59 + Actor1442: t12 + Owner: Neutral + Location: 75,27 + Actor1443: t08 + Owner: Neutral + Location: 101,121 + Actor1444: t05 + Owner: Neutral + Location: 80,16 + Actor1445: t03 + Owner: Neutral + Location: 30,71 + Actor1446: t05 + Owner: Neutral + Location: 49,108 + Actor1447: t07 + Owner: Neutral + Location: 12,25 + Actor1448: t12 + Owner: Neutral + Location: 1,1 + Actor1449: t06 + Owner: Neutral + Location: 92,102 + Actor1450: t03 + Owner: Neutral + Location: 28,79 + Actor1451: t13 + Owner: Neutral + Location: 45,16 + Actor1452: t17 + Owner: Neutral + Location: 140,82 + Actor1453: t16 + Owner: Neutral + Location: 115,64 + Actor1455: t13 + Owner: Neutral + Location: 75,96 + Actor1456: t16 + Owner: Neutral + Location: 74,31 + Actor1457: t05 + Owner: Neutral + Location: 33,35 + Actor1458: t06.husk + Owner: Neutral + Location: 95,92 + Actor1459: t03 + Owner: Neutral + Location: 29,58 + Actor1460: t13 + Owner: Neutral + Location: 133,46 + Actor1461: t12 + Owner: Neutral + Location: 65,37 + Actor1462: t06 + Owner: Neutral + Location: 120,96 + Actor1463: t07 + Owner: Neutral + Location: 103,89 + Actor1465: t02 + Owner: Neutral + Location: 139,104 + Actor1466: t07 + Owner: Neutral + Location: 29,42 + Actor1467: t05 + Owner: Neutral + Location: 14,52 + Actor1468: t02 + Owner: Neutral + Location: 0,3 + Actor1469: t12 + Owner: Neutral + Location: 109,93 + Actor1470: t12 + Owner: Neutral + Location: 37,77 + Actor1471: t06 + Owner: Neutral + Location: 87,19 + Actor1472: t01 + Owner: Neutral + Location: 9,72 + Actor1473: t06 + Owner: Neutral + Location: 17,53 + Actor1474: t12.husk + Owner: Neutral + Location: 74,27 + Actor1475: t05 + Owner: Neutral + Location: 35,62 + Actor1477: t01 + Owner: Neutral + Location: 133,30 + Actor1478: t03 + Owner: Neutral + Location: 123,107 + Actor1479: t03 + Owner: Neutral + Location: 112,112 + Actor1480: t16 + Owner: Neutral + Location: 76,39 + Actor1482: t17 + Owner: Neutral + Location: 105,93 + Actor1483: t05 + Owner: Neutral + Location: 20,57 + Actor1484: t16 + Owner: Neutral + Location: 56,1 + Actor1485: t05 + Owner: Neutral + Location: 32,39 + Actor1486: t05 + Owner: Neutral + Location: 56,88 + Actor1487: t05 + Owner: Neutral + Location: 105,103 + Actor1488: t06 + Owner: Neutral + Location: 11,55 + Actor1489: t03 + Owner: Neutral + Location: 100,98 + Actor1490: t05 + Owner: Neutral + Location: 52,78 + Actor1491: t17 + Owner: Neutral + Location: 115,63 + Actor1492: t03 + Owner: Neutral + Location: 2,89 + Actor1493: t16 + Owner: Neutral + Location: 29,63 + Actor1494: t12.husk + Owner: Neutral + Location: 53,76 + Actor1495: t05 + Owner: Neutral + Location: 121,68 + Actor1496: t03.husk + Owner: Neutral + Location: 40,45 + Actor1497: t07 + Owner: Neutral + Location: 131,25 + Actor1498: t03 + Owner: Neutral + Location: 102,84 + Actor1499: t07 + Owner: Neutral + Location: 13,51 + Actor1500: t12 + Owner: Neutral + Location: 51,110 + Actor1502: t05 + Owner: Neutral + Location: 86,20 + Actor1503: t12 + Owner: Neutral + Location: 109,66 + Actor1504: t05 + Owner: Neutral + Location: 9,70 + Actor1505: t05 + Owner: Neutral + Location: 32,77 + Actor1506: t05 + Owner: Neutral + Location: 15,63 + Actor1507: t02 + Owner: Neutral + Location: 34,33 + Actor1508: t05 + Owner: Neutral + Location: 63,84 + Actor1509: t17 + Owner: Neutral + Location: 102,10 + Actor1511: t07 + Owner: Neutral + Location: 76,25 + Actor1512: t13.husk + Owner: Neutral + Location: 127,47 + Actor1513: t07.husk + Owner: Neutral + Location: 51,78 + Actor1515: t01 + Owner: Neutral + Location: 76,27 + Actor1516: t16 + Owner: Neutral + Location: 75,30 + Actor1517: t06 + Owner: Neutral + Location: 61,88 + Actor1518: t17.husk + Owner: Neutral + Location: 115,105 + Actor1519: t06 + Owner: Neutral + Location: 18,61 + Actor1521: t16 + Owner: Neutral + Location: 90,105 + Actor1522: t01 + Owner: Neutral + Location: 102,16 + Actor1523: t12 + Owner: Neutral + Location: 12,13 + Actor1524: t08 + Owner: Neutral + Location: 143,76 + Actor1525: t02 + Owner: Neutral + Location: 107,97 + Actor1526: t01 + Owner: Neutral + Location: 59,3 + Actor1528: t13 + Owner: Neutral + Location: 13,53 + Actor1529: t13 + Owner: Neutral + Location: 50,119 + Actor1530: t13 + Owner: Neutral + Location: 3,9 + Actor1531: t03 + Owner: Neutral + Location: 105,95 + Actor1532: t07 + Owner: Neutral + Location: 42,40 + Actor1533: t07 + Owner: Neutral + Location: 35,56 + Actor1534: t07 + Owner: Neutral + Location: 99,98 + Actor1535: t13.husk + Owner: Neutral + Location: 36,60 + Actor1536: t16 + Owner: Neutral + Location: 46,31 + Actor1537: t05 + Owner: Neutral + Location: 39,75 + Actor1538: t16.husk + Owner: Neutral + Location: 119,64 + Actor1540: t17 + Owner: Neutral + Location: 91,101 + Actor1541: t03 + Owner: Neutral + Location: 136,83 + Actor1543: t08 + Owner: Neutral + Location: 95,92 + Actor1544: t01 + Owner: Neutral + Location: 92,101 + Actor1545: t07 + Owner: Neutral + Location: 119,68 + Actor1546: t01 + Owner: Neutral + Location: 44,37 + Actor1547: t02 + Owner: Neutral + Location: 76,32 + Actor1549: t07 + Owner: Neutral + Location: 122,63 + Actor1550: t07 + Owner: Neutral + Location: 75,2 + Actor1551: t02 + Owner: Neutral + Location: 138,84 + Actor1552: t08 + Owner: Neutral + Location: 140,82 + Actor1553: t05 + Owner: Neutral + Location: 103,17 + Actor1554: t05 + Owner: Neutral + Location: 117,105 + Actor1555: t03 + Owner: Neutral + Location: 132,50 + Actor1556: t07 + Owner: Neutral + Location: 129,26 + Actor1557: t16 + Owner: Neutral + Location: 88,15 + Actor1558: t06.husk + Owner: Neutral + Location: 34,60 + Actor1560: t05 + Owner: Neutral + Location: 34,57 + Actor1561: t16 + Owner: Neutral + Location: 18,60 + Actor1562: t13 + Owner: Neutral + Location: 117,62 + Actor1563: t05 + Owner: Neutral + Location: 101,121 + Actor1564: t12 + Owner: Neutral + Location: 102,122 + Actor1565: t01 + Owner: Neutral + Location: 5,12 + Actor1567: t05 + Owner: Neutral + Location: 102,87 + Actor1568: t12 + Owner: Neutral + Location: 49,10 + Actor1569: t01 + Owner: Neutral + Location: 11,117 + Actor1570: t13 + Owner: Neutral + Location: 102,128 + Actor1573: t12 + Owner: Neutral + Location: 42,38 + Actor1574: t02 + Owner: Neutral + Location: 106,98 + Actor1575: t02 + Owner: Neutral + Location: 42,41 + Actor1576: t05 + Owner: Neutral + Location: 88,51 + Actor1577: t05.husk + Owner: Neutral + Location: 81,50 + Actor1578: t05 + Owner: Neutral + Location: 59,80 + Actor1579: t01 + Owner: Neutral + Location: 116,23 + Actor1580: t12 + Owner: Neutral + Location: 3,3 + Actor1581: t01.husk + Owner: Neutral + Location: 29,69 + Actor1583: t01 + Owner: Neutral + Location: 135,48 + Actor1584: t01 + Owner: Neutral + Location: 33,73 + Actor1585: t17 + Owner: Neutral + Location: 45,30 + Actor1586: t01 + Owner: Neutral + Location: 5,125 + Actor1587: t13 + Owner: Neutral + Location: 17,54 + Actor1588: t12 + Owner: Neutral + Location: 115,68 + Actor1589: t02 + Owner: Neutral + Location: 32,78 + Actor1590: t07.husk + Owner: Neutral + Location: 50,29 + Actor1591: t02 + Owner: Neutral + Location: 18,52 + Actor1592: t16 + Owner: Neutral + Location: 91,104 + Actor1593: t01 + Owner: Neutral + Location: 121,63 + Actor1594: t12 + Owner: Neutral + Location: 120,101 + Actor1595: t16 + Owner: Neutral + Location: 4,116 + Actor1596: t03 + Owner: Neutral + Location: 109,33 + Actor1597: t01 + Owner: Neutral + Location: 112,61 + Actor1598: t01 + Owner: Neutral + Location: 56,85 + Actor1600: t17 + Owner: Neutral + Location: 59,82 + Actor1601: t01 + Owner: Neutral + Location: 16,51 + Actor1602: t16 + Owner: Neutral + Location: 58,77 + Actor1603: t08 + Owner: Neutral + Location: 141,83 + Actor1604: t06 + Owner: Neutral + Location: 4,7 + Actor1605: t17 + Owner: Neutral + Location: 104,91 + Actor1606: t01 + Owner: Neutral + Location: 34,59 + Actor1607: t12 + Owner: Neutral + Location: 93,91 + Actor1609: t08 + Owner: Neutral + Location: 25,76 + Actor1610: t02 + Owner: Neutral + Location: 4,125 + Actor1611: t13.husk + Owner: Neutral + Location: 75,40 + Actor1612: t03 + Owner: Neutral + Location: 73,40 + Actor1613: t08 + Owner: Neutral + Location: 0,35 + Actor1614: t03 + Owner: Neutral + Location: 84,47 + Actor1615: t07 + Owner: Neutral + Location: 48,2 + Actor1616: t01 + Owner: Neutral + Location: 5,2 + Actor1617: t16 + Owner: Neutral + Location: 44,46 + Actor1618: t03 + Owner: Neutral + Location: 110,66 + Actor1619: t17 + Owner: Neutral + Location: 30,69 + Actor1620: t03.husk + Owner: Neutral + Location: 34,78 + Actor1621: t06 + Owner: Neutral + Location: 1,84 + Actor1622: t13 + Owner: Neutral + Location: 143,85 + Actor1623: t13 + Owner: Neutral + Location: 22,101 + Actor1624: t05 + Owner: Neutral + Location: 92,106 + Actor1625: t01 + Owner: Neutral + Location: 70,3 + Actor1626: t13 + Owner: Neutral + Location: 115,110 + Actor1627: t06 + Owner: Neutral + Location: 120,68 + Actor1628: t13 + Owner: Neutral + Location: 28,73 + Actor1629: t07 + Owner: Neutral + Location: 104,88 + Actor1630: t06 + Owner: Neutral + Location: 16,112 + Actor1631: t16 + Owner: Neutral + Location: 65,36 + Actor1632: t02 + Owner: Neutral + Location: 29,41 + Actor1633: t08 + Owner: Neutral + Location: 82,49 + Actor1634: t17 + Owner: Neutral + Location: 4,14 + Actor1635: t07.husk + Owner: Neutral + Location: 15,51 + Actor1636: t03 + Owner: Neutral + Location: 102,19 + Actor1638: t12 + Owner: Neutral + Location: 104,85 + Actor1639: t08 + Owner: Neutral + Location: 75,0 + Actor1640: t12 + Owner: Neutral + Location: 132,110 + Actor1641: t17.husk + Owner: Neutral + Location: 91,92 + Actor1642: t06 + Owner: Neutral + Location: 1,13 + Actor1643: t02 + Owner: Neutral + Location: 31,67 + Actor1644: t12 + Owner: Neutral + Location: 44,31 + Actor1645: t06 + Owner: Neutral + Location: 48,115 + Actor1646: t17 + Owner: Neutral + Location: 107,95 + Actor1647: t03 + Owner: Neutral + Location: 121,96 + Actor1648: t05 + Owner: Neutral + Location: 73,125 + Actor1650: t08 + Owner: Neutral + Location: 89,15 + Actor1651: t03 + Owner: Neutral + Location: 39,44 + Actor1652: t16 + Owner: Neutral + Location: 140,84 + Actor1653: t08 + Owner: Neutral + Location: 1,15 + Actor1654: t12.husk + Owner: Neutral + Location: 94,101 + Actor1655: t07 + Owner: Neutral + Location: 129,45 + Actor1656: t17 + Owner: Neutral + Location: 98,94 + Actor1657: t07 + Owner: Neutral + Location: 131,65 + Actor1658: t03 + Owner: Neutral + Location: 99,93 + Actor1659: t05 + Owner: Neutral + Location: 38,77 + Actor1660: t07 + Owner: Neutral + Location: 120,64 + Actor1661: t05 + Owner: Neutral + Location: 119,101 + Actor1662: t02 + Owner: Neutral + Location: 80,48 + Actor1663: t08 + Owner: Neutral + Location: 119,113 + Actor1665: t02 + Owner: Neutral + Location: 142,68 + Actor1667: t06.husk + Owner: Neutral + Location: 57,87 + Actor1668: t02 + Owner: Neutral + Location: 114,104 + Actor1669: t07 + Owner: Neutral + Location: 72,31 + Actor1671: t17 + Owner: Neutral + Location: 54,31 + Actor1672: t07.husk + Owner: Neutral + Location: 4,10 + Actor1673: t12 + Owner: Neutral + Location: 89,51 + Actor1675: t13 + Owner: Neutral + Location: 75,4 + Actor1676: t08 + Owner: Neutral + Location: 27,71 + Actor1679: t03 + Owner: Neutral + Location: 82,14 + Actor1680: t05 + Owner: Neutral + Location: 50,28 + Actor1681: t08 + Owner: Neutral + Location: 55,90 + Actor1682: t02 + Owner: Neutral + Location: 76,26 + Actor1683: t13 + Owner: Neutral + Location: 18,48 + Actor1684: t08 + Owner: Neutral + Location: 104,22 + Actor1685: t05 + Owner: Neutral + Location: 48,0 + Actor1686: t07.husk + Owner: Neutral + Location: 20,27 + Actor1687: t02 + Owner: Neutral + Location: 2,17 + Actor1688: t08 + Owner: Neutral + Location: 97,129 + Actor1689: t12 + Owner: Neutral + Location: 117,58 + Actor1691: t13 + Owner: Neutral + Location: 77,31 + Actor1693: t16 + Owner: Neutral + Location: 43,46 + Actor1694: t02 + Owner: Neutral + Location: 42,37 + Actor1696: t12 + Owner: Neutral + Location: 105,89 + Actor1697: t16 + Owner: Neutral + Location: 132,31 + Actor1700: t08.husk + Owner: Neutral + Location: 68,87 + Actor1701: t08 + Owner: Neutral + Location: 99,91 + Actor1702: t02 + Owner: Neutral + Location: 116,61 + Actor1703: t12 + Owner: Neutral + Location: 17,61 + Actor1704: t17 + Owner: Neutral + Location: 74,42 + Actor1705: t07 + Owner: Neutral + Location: 88,98 + Actor1706: t16 + Owner: Neutral + Location: 127,45 + Actor1707: t12 + Owner: Neutral + Location: 76,124 + Actor1708: t01 + Owner: Neutral + Location: 43,32 + Actor1709: t08 + Owner: Neutral + Location: 52,109 + Actor1710: t02 + Owner: Neutral + Location: 38,78 + Actor1711: t05 + Owner: Neutral + Location: 105,20 + Actor1712: t05 + Owner: Neutral + Location: 112,111 + Actor1713: t06 + Owner: Neutral + Location: 3,117 + Actor1714: t13 + Owner: Neutral + Location: 16,50 + Actor1715: t05 + Owner: Neutral + Location: 108,96 + Actor1716: t12 + Owner: Neutral + Location: 34,65 + Actor1717: t17 + Owner: Neutral + Location: 144,14 + Actor1718: t02 + Owner: Neutral + Location: 53,32 + Actor1719: t16 + Owner: Neutral + Location: 59,4 + Actor1720: t13 + Owner: Neutral + Location: 136,29 + Actor1721: t01.husk + Owner: Neutral + Location: 114,62 + Actor1722: t07 + Owner: Neutral + Location: 57,2 + Actor1723: t12 + Owner: Neutral + Location: 35,63 + Actor1724: t07 + Owner: Neutral + Location: 36,58 + Actor1725: t17 + Owner: Neutral + Location: 86,12 + Actor1726: t03 + Owner: Neutral + Location: 91,106 + Actor1727: t08 + Owner: Neutral + Location: 13,73 + Actor1728: t07 + Owner: Neutral + Location: 81,48 + Actor1729: t17 + Owner: Neutral + Location: 133,45 + Actor1730: t06 + Owner: Neutral + Location: 103,57 + Actor1731: t02 + Owner: Neutral + Location: 47,32 + Actor1732: t17 + Owner: Neutral + Location: 141,75 + Actor1733: t01 + Owner: Neutral + Location: 101,86 + Actor1734: t05.husk + Owner: Neutral + Location: 70,2 + Actor1735: t02 + Owner: Neutral + Location: 142,65 + Actor1736: t03.husk + Owner: Neutral + Location: 71,16 + Actor1737: t03 + Owner: Neutral + Location: 63,85 + Actor1738: t12 + Owner: Neutral + Location: 118,105 + Actor1739: t08 + Owner: Neutral + Location: 114,61 + Actor1740: t08 + Owner: Neutral + Location: 76,45 + Actor1741: t12 + Owner: Neutral + Location: 65,1 + Actor1742: t13.husk + Owner: Neutral + Location: 120,106 + Actor1743: t03 + Owner: Neutral + Location: 49,115 + Actor1744: t01 + Owner: Neutral + Location: 104,92 + Actor1745: t06 + Owner: Neutral + Location: 3,115 + Actor1746: t12 + Owner: Neutral + Location: 125,56 + Actor1747: t02 + Owner: Neutral + Location: 26,75 + Actor1748: t16 + Owner: Neutral + Location: 132,106 + Actor1749: t16 + Owner: Neutral + Location: 116,111 + Actor1750: t07.husk + Owner: Neutral + Location: 86,49 + Actor1751: t08.husk + Owner: Neutral + Location: 139,84 + Actor1752: t07 + Owner: Neutral + Location: 92,103 + Actor1753: t07.husk + Owner: Neutral + Location: 14,13 + Actor1754: t01 + Owner: Neutral + Location: 113,112 + Actor1755: t12.husk + Owner: Neutral + Location: 4,13 + Actor1756: t07 + Owner: Neutral + Location: 103,119 + Actor1757: t08 + Owner: Neutral + Location: 53,107 + Actor1758: t13 + Owner: Neutral + Location: 50,121 + Actor1759: t17 + Owner: Neutral + Location: 27,75 + Actor1760: t12 + Owner: Neutral + Location: 0,0 + Actor1761: t12 + Owner: Neutral + Location: 121,105 + Actor1762: t02 + Owner: Neutral + Location: 113,68 + Actor1763: t12 + Owner: Neutral + Location: 49,30 + Actor1764: t16 + Owner: Neutral + Location: 4,5 + Actor1765: t01 + Owner: Neutral + Location: 140,75 + Actor1766: t07 + Owner: Neutral + Location: 1,12 + Actor1767: t02 + Owner: Neutral + Location: 117,106 + Actor1768: t07 + Owner: Neutral + Location: 92,94 + Actor1769: t02 + Owner: Neutral + Location: 110,28 + Actor1770: t02.husk + Owner: Neutral + Location: 47,29 + Actor1771: t06.husk + Owner: Neutral + Location: 17,91 + Actor1772: t06 + Owner: Neutral + Location: 138,81 + Actor1773: t06 + Owner: Neutral + Location: 37,58 + Actor1774: t03 + Owner: Neutral + Location: 113,63 + Actor1775: t02 + Owner: Neutral + Location: 75,39 + Actor1776: t05 + Owner: Neutral + Location: 39,43 + Actor1777: t08.husk + Owner: Neutral + Location: 53,13 + Actor1778: t13 + Owner: Neutral + Location: 31,65 + Actor1779: t01 + Owner: Neutral + Location: 30,79 + Actor1780: t07 + Owner: Neutral + Location: 95,104 + Actor1781: t01.husk + Owner: Neutral + Location: 30,40 + Actor1782: t08 + Owner: Neutral + Location: 122,16 + Actor1783: t07 + Owner: Neutral + Location: 105,121 + Actor1784: t13.husk + Owner: Neutral + Location: 44,32 + Actor1785: t08 + Owner: Neutral + Location: 17,57 + Actor1788: t16 + Owner: Neutral + Location: 142,82 + Actor1790: t06 + Owner: Neutral + Location: 45,17 + Actor1791: t02 + Owner: Neutral + Location: 34,63 + Actor1792: t12 + Owner: Neutral + Location: 139,30 + Actor1793: t12 + Owner: Neutral + Location: 106,19 + Actor1794: t16 + Owner: Neutral + Location: 99,85 + Actor1795: t06 + Owner: Neutral + Location: 36,65 + Actor1797: t05 + Owner: Neutral + Location: 48,41 + Actor1799: t06 + Owner: Neutral + Location: 110,63 + Actor1800: t17 + Owner: Neutral + Location: 111,65 + Actor1801: t08 + Owner: Neutral + Location: 115,103 + Actor1802: t08 + Owner: Neutral + Location: 138,78 + Actor1803: t07.husk + Owner: Neutral + Location: 122,16 + Actor1804: t08 + Owner: Neutral + Location: 17,69 + Actor1806: t02 + Owner: Neutral + Location: 76,47 + Actor1807: t03 + Owner: Neutral + Location: 56,89 + Actor1808: t16 + Owner: Neutral + Location: 4,115 + Actor1809: t17 + Owner: Neutral + Location: 60,86 + Actor1810: t08 + Owner: Neutral + Location: 119,101 + Actor1811: t12 + Owner: Neutral + Location: 1,11 + Actor1812: t01 + Owner: Neutral + Location: 93,96 + Actor1813: t03.husk + Owner: Neutral + Location: 100,92 + Actor1814: t07.husk + Owner: Neutral + Location: 140,77 + Actor1815: t13 + Owner: Neutral + Location: 117,67 + Actor1816: t17 + Owner: Neutral + Location: 32,40 + Actor1818: t08 + Owner: Neutral + Location: 74,17 + Actor1820: t12 + Owner: Neutral + Location: 117,102 + Actor1821: t06 + Owner: Neutral + Location: 17,89 + Actor1822: t03 + Owner: Neutral + Location: 14,48 + Actor1823: t16 + Owner: Neutral + Location: 101,88 + Actor1824: t07 + Owner: Neutral + Location: 1,0 + Actor1825: t06 + Owner: Neutral + Location: 87,15 + Actor1826: t02 + Owner: Neutral + Location: 59,74 + Actor1827: t01 + Owner: Neutral + Location: 109,91 + Actor1828: t17 + Owner: Neutral + Location: 79,1 + Actor1831: t05 + Owner: Neutral + Location: 2,5 + Actor1832: t06 + Owner: Neutral + Location: 4,2 + Actor1833: t13 + Owner: Neutral + Location: 137,111 + Actor1834: t07 + Owner: Neutral + Location: 44,30 + Actor1835: t03 + Owner: Neutral + Location: 144,66 + Actor1836: t12 + Owner: Neutral + Location: 66,87 + Actor1837: t12 + Owner: Neutral + Location: 89,102 + Actor1838: t12 + Owner: Neutral + Location: 5,105 + Actor1839: t02 + Owner: Neutral + Location: 106,99 + Actor1840: t08 + Owner: Neutral + Location: 113,112 + Actor1841: t01 + Owner: Neutral + Location: 28,74 + Actor1842: t08 + Owner: Neutral + Location: 54,2 + Actor1844: t06 + Owner: Neutral + Location: 14,117 + Actor1845: t01 + Owner: Neutral + Location: 15,118 + Actor1846: t16 + Owner: Neutral + Location: 129,46 + Actor1848: t12 + Owner: Neutral + Location: 103,21 + Actor1849: t02 + Owner: Neutral + Location: 118,62 + Actor1850: t05 + Owner: Neutral + Location: 100,121 + Actor1851: t03 + Owner: Neutral + Location: 52,1 + Actor1853: t05 + Owner: Neutral + Location: 2,122 + Actor1854: t17 + Owner: Neutral + Location: 88,47 + Actor1855: t08.husk + Owner: Neutral + Location: 118,105 + Actor1856: t07.husk + Owner: Neutral + Location: 8,67 + Actor1857: t12 + Owner: Neutral + Location: 104,31 + Actor1858: t05 + Owner: Neutral + Location: 71,108 + Actor1859: t01 + Owner: Neutral + Location: 13,68 + Actor1860: t02 + Owner: Neutral + Location: 50,109 + Actor1861: t16 + Owner: Neutral + Location: 77,128 + Actor1862: t07 + Owner: Neutral + Location: 78,45 + Actor1863: t07 + Owner: Neutral + Location: 17,70 + Actor1864: t17 + Owner: Neutral + Location: 85,50 + Actor1865: t16 + Owner: Neutral + Location: 139,75 + Actor1866: t01 + Owner: Neutral + Location: 1,30 + Actor1867: t08 + Owner: Neutral + Location: 73,1 + Actor1868: t12 + Owner: Neutral + Location: 0,14 + Actor1869: t05 + Owner: Neutral + Location: 134,41 + Actor1870: t06 + Owner: Neutral + Location: 83,15 + Actor1871: t12 + Owner: Neutral + Location: 74,45 + Actor1873: t05 + Owner: Neutral + Location: 128,27 + Actor1874: t01.husk + Owner: Neutral + Location: 54,90 + Actor1875: t02 + Owner: Neutral + Location: 50,10 + Actor1876: t03 + Owner: Neutral + Location: 9,71 + Actor1877: t08 + Owner: Neutral + Location: 108,33 + Actor1878: t17 + Owner: Neutral + Location: 48,114 + Actor1879: t05.husk + Owner: Neutral + Location: 103,121 + Actor1880: t01 + Owner: Neutral + Location: 141,76 + Actor1881: t16 + Owner: Neutral + Location: 65,87 + Actor1882: t12 + Owner: Neutral + Location: 103,19 + Actor1883: t05 + Owner: Neutral + Location: 76,2 + Actor1884: t13 + Owner: Neutral + Location: 60,85 + Actor1885: t08 + Owner: Neutral + Location: 102,34 + Actor1886: t05 + Owner: Neutral + Location: 40,42 + Actor1888: t01 + Owner: Neutral + Location: 113,108 + Actor1889: t06 + Owner: Neutral + Location: 125,62 + Actor1890: t16 + Owner: Neutral + Location: 42,35 + Actor1891: t07 + Owner: Neutral + Location: 59,81 + Actor1892: t13 + Owner: Neutral + Location: 104,99 + Actor1894: t05.husk + Owner: Neutral + Location: 1,90 + Actor1895: t06 + Owner: Neutral + Location: 2,29 + Actor1896: t05 + Owner: Neutral + Location: 109,65 + Actor1897: t08 + Owner: Neutral + Location: 102,98 + Actor1899: t07 + Owner: Neutral + Location: 115,111 + Actor1900: t01 + Owner: Neutral + Location: 115,23 + Actor1901: t06.husk + Owner: Neutral + Location: 104,106 + Actor1902: t12 + Owner: Neutral + Location: 94,89 + Actor1903: t13 + Owner: Neutral + Location: 126,47 + Actor1904: t12 + Owner: Neutral + Location: 63,90 + Actor1905: t05.husk + Owner: Neutral + Location: 141,78 + Actor1906: t07.husk + Owner: Neutral + Location: 73,15 + Actor1907: t01 + Owner: Neutral + Location: 121,110 + Actor1909: t03 + Owner: Neutral + Location: 144,57 + Actor1910: t03 + Owner: Neutral + Location: 99,94 + Actor1911: t13 + Owner: Neutral + Location: 5,13 + Actor1912: t17 + Owner: Neutral + Location: 132,45 + Actor1913: t16 + Owner: Neutral + Location: 103,126 + Actor1914: t13 + Owner: Neutral + Location: 105,31 + Actor1915: t08 + Owner: Neutral + Location: 49,81 + Actor1916: t01 + Owner: Neutral + Location: 48,111 + Actor1917: t07 + Owner: Neutral + Location: 98,127 + Actor1918: t02 + Owner: Neutral + Location: 55,78 + Actor1919: t16 + Owner: Neutral + Location: 19,49 + Actor1923: t17 + Owner: Neutral + Location: 102,127 + Actor1924: t16 + Owner: Neutral + Location: 68,3 + Actor1925: t16 + Owner: Neutral + Location: 116,62 + Actor1926: t08 + Owner: Neutral + Location: 106,93 + Actor1927: t05 + Owner: Neutral + Location: 105,105 + Actor1928: t05 + Owner: Neutral + Location: 64,88 + Actor1930: t17 + Owner: Neutral + Location: 102,55 + Actor1931: t16 + Owner: Neutral + Location: 63,42 + Actor1932: t01 + Owner: Neutral + Location: 89,101 + Actor1933: t17.husk + Owner: Neutral + Location: 30,58 + Actor1934: t06 + Owner: Neutral + Location: 123,109 + Actor1935: t02 + Owner: Neutral + Location: 101,17 + Actor1936: t05.husk + Owner: Neutral + Location: 52,110 + Actor1937: t01.husk + Owner: Neutral + Location: 4,1 + Actor1938: t16 + Owner: Neutral + Location: 132,26 + Actor1940: t05 + Owner: Neutral + Location: 58,76 + Actor1941: t06.husk + Owner: Neutral + Location: 39,76 + Actor1942: t02 + Owner: Neutral + Location: 30,39 + Actor1943: t12 + Owner: Neutral + Location: 18,86 + Actor1944: t08 + Owner: Neutral + Location: 116,103 + Actor1945: t07.husk + Owner: Neutral + Location: 131,43 + Actor1946: t03 + Owner: Neutral + Location: 90,17 + Actor1948: t01 + Owner: Neutral + Location: 6,103 + Actor1949: t13 + Owner: Neutral + Location: 55,74 + Actor1950: t02 + Owner: Neutral + Location: 103,94 + Actor1951: t07 + Owner: Neutral + Location: 135,30 + Actor1952: t12 + Owner: Neutral + Location: 21,57 + Actor1953: t06 + Owner: Neutral + Location: 116,105 + Actor1954: t02 + Owner: Neutral + Location: 91,15 + Actor1955: t05 + Owner: Neutral + Location: 81,22 + Actor1956: t17 + Owner: Neutral + Location: 78,30 + Actor1957: t17 + Owner: Neutral + Location: 103,122 + Actor1958: t13 + Owner: Neutral + Location: 119,105 + Actor1959: t12 + Owner: Neutral + Location: 123,62 + Actor1960: t17 + Owner: Neutral + Location: 133,44 + Actor1961: t01 + Owner: Neutral + Location: 104,128 + Actor1962: t03 + Owner: Neutral + Location: 109,12 + Actor1963: t01 + Owner: Neutral + Location: 90,14 + Actor1964: t08 + Owner: Neutral + Location: 98,91 + Actor1965: t16 + Owner: Neutral + Location: 51,82 + Actor1967: t12 + Owner: Neutral + Location: 122,109 + Actor1968: t03 + Owner: Neutral + Location: 137,83 + Actor1969: t01 + Owner: Neutral + Location: 64,82 + Actor1970: t08 + Owner: Neutral + Location: 117,64 + Actor1971: t08 + Owner: Neutral + Location: 17,26 + Actor1972: t03 + Owner: Neutral + Location: 9,125 + Actor1973: t01 + Owner: Neutral + Location: 18,69 + Actor1974: t17 + Owner: Neutral + Location: 52,105 + Actor1975: t02 + Owner: Neutral + Location: 11,70 + Actor1976: t07 + Owner: Neutral + Location: 59,1 + Actor1977: t01 + Owner: Neutral + Location: 51,111 + Actor1978: t07 + Owner: Neutral + Location: 55,75 + Actor1979: t08 + Owner: Neutral + Location: 28,71 + Actor1980: t01 + Owner: Neutral + Location: 5,10 + Actor1981: t16 + Owner: Neutral + Location: 99,18 + Actor1982: t03.husk + Owner: Neutral + Location: 63,78 + Actor1983: t03 + Owner: Neutral + Location: 101,94 + Actor1984: t17 + Owner: Neutral + Location: 77,30 + Actor1986: t17 + Owner: Neutral + Location: 102,121 + Actor1988: t13 + Owner: Neutral + Location: 102,34 + Actor1989: t03 + Owner: Neutral + Location: 118,60 + Actor1990: t06 + Owner: Neutral + Location: 130,67 + Actor1991: t02 + Owner: Neutral + Location: 18,87 + Actor1992: t01 + Owner: Neutral + Location: 114,110 + Actor1993: t08 + Owner: Neutral + Location: 112,110 + Actor1996: t06 + Owner: Neutral + Location: 104,20 + Actor1997: t02 + Owner: Neutral + Location: 3,7 + Actor1998: t16 + Owner: Neutral + Location: 60,5 + Actor1999: t08 + Owner: Neutral + Location: 76,124 + Actor2000: t13 + Owner: Neutral + Location: 64,85 + Actor2001: t06 + Owner: Neutral + Location: 102,112 + Actor2002: t16 + Owner: Neutral + Location: 127,66 + Actor2003: t03 + Owner: Neutral + Location: 108,123 + Actor2004: t08 + Owner: Neutral + Location: 93,101 + Actor2005: t17 + Owner: Neutral + Location: 121,67 + Actor2006: t05 + Owner: Neutral + Location: 115,59 + Actor2007: t08 + Owner: Neutral + Location: 115,105 + Actor2008: t05 + Owner: Neutral + Location: 47,31 + Actor2009: t08 + Owner: Neutral + Location: 91,94 + Actor2010: t08 + Owner: Neutral + Location: 51,108 + Actor2011: t03 + Owner: Neutral + Location: 99,97 + Actor2012: t17 + Owner: Neutral + Location: 121,102 + Actor2014: t16 + Owner: Neutral + Location: 41,40 + Actor2015: t12 + Owner: Neutral + Location: 122,57 + Actor2016: t17 + Owner: Neutral + Location: 52,82 + Actor2017: t06 + Owner: Neutral + Location: 15,50 + Actor2018: t12 + Owner: Neutral + Location: 62,77 + Actor2020: t05 + Owner: Neutral + Location: 71,1 + Actor2021: t07 + Owner: Neutral + Location: 103,86 + Actor2022: t16 + Owner: Neutral + Location: 87,17 + Actor2023: t06 + Owner: Neutral + Location: 16,111 + Actor2025: t02 + Owner: Neutral + Location: 117,109 + Actor2026: t13 + Owner: Neutral + Location: 101,20 + Actor2027: t02 + Owner: Neutral + Location: 101,127 + Actor2028: t16 + Owner: Neutral + Location: 92,107 + Actor2029: t05 + Owner: Neutral + Location: 52,79 + Actor2030: t17 + Owner: Neutral + Location: 140,30 + Actor2031: t01 + Owner: Neutral + Location: 123,65 + Actor2032: t03 + Owner: Neutral + Location: 126,44 + Actor2033: t03 + Owner: Neutral + Location: 112,110 + Actor2034: t17 + Owner: Neutral + Location: 92,110 + Actor2036: t05 + Owner: Neutral + Location: 71,5 + Actor2037: t05 + Owner: Neutral + Location: 108,11 + Actor2038: t08 + Owner: Neutral + Location: 3,29 + Actor2039: t01 + Owner: Neutral + Location: 109,32 + Actor2040: t08 + Owner: Neutral + Location: 1,18 + Actor2041: t03 + Owner: Neutral + Location: 109,13 + Actor2042: t05 + Owner: Neutral + Location: 29,64 + Actor2043: t17 + Owner: Neutral + Location: 17,72 + Actor2044: t01 + Owner: Neutral + Location: 53,105 + Actor2046: t12.husk + Owner: Neutral + Location: 139,105 + Actor2048: t07 + Owner: Neutral + Location: 122,98 + Actor2049: t03 + Owner: Neutral + Location: 117,65 + Actor2050: t03 + Owner: Neutral + Location: 46,13 + Actor2051: t02 + Owner: Neutral + Location: 90,94 + Actor2052: t12 + Owner: Neutral + Location: 35,60 + Actor2054: t16 + Owner: Neutral + Location: 100,97 + Actor2055: t05 + Owner: Neutral + Location: 2,30 + Actor2056: t06 + Owner: Neutral + Location: 14,51 + Actor2057: t03 + Owner: Neutral + Location: 143,81 + Actor2058: t03 + Owner: Neutral + Location: 104,119 + Actor2060: t12 + Owner: Neutral + Location: 102,20 + Actor2061: t16 + Owner: Neutral + Location: 77,127 + Actor2062: t13 + Owner: Neutral + Location: 42,72 + Actor2063: t03.husk + Owner: Neutral + Location: 129,66 + Actor2064: t16 + Owner: Neutral + Location: 70,6 + Actor2065: t08 + Owner: Neutral + Location: 35,75 + Actor2066: t01 + Owner: Neutral + Location: 60,78 + Actor2068: t17 + Owner: Neutral + Location: 49,79 + Actor2069: t01 + Owner: Neutral + Location: 85,49 + Actor2070: t05 + Owner: Neutral + Location: 139,84 + Actor2071: t01 + Owner: Neutral + Location: 50,81 + Actor2072: t01 + Owner: Neutral + Location: 27,74 + Actor2073: t06 + Owner: Neutral + Location: 56,77 + Actor2074: t08 + Owner: Neutral + Location: 104,57 + Actor2075: t08 + Owner: Neutral + Location: 7,126 + Actor2076: t12 + Owner: Neutral + Location: 50,113 + Actor2077: t12 + Owner: Neutral + Location: 129,65 + Actor2079: t07 + Owner: Neutral + Location: 100,18 + Actor2080: t05 + Owner: Neutral + Location: 105,96 + Actor2081: t12 + Owner: Neutral + Location: 101,97 + Actor2082: t08 + Owner: Neutral + Location: 133,48 + Actor2083: t13 + Owner: Neutral + Location: 144,17 + Actor2084: t07 + Owner: Neutral + Location: 105,86 + Actor2085: t17 + Owner: Neutral + Location: 119,70 + Actor2086: t17 + Owner: Neutral + Location: 101,34 + Actor2087: t12 + Owner: Neutral + Location: 35,64 + Actor2088: t03 + Owner: Neutral + Location: 73,16 + Actor2089: t01 + Owner: Neutral + Location: 67,87 + Actor2090: t06.husk + Owner: Neutral + Location: 127,73 + Actor2091: t06 + Owner: Neutral + Location: 5,1 + Actor2092: t13 + Owner: Neutral + Location: 15,62 + Actor2093: t01 + Owner: Neutral + Location: 2,57 + Actor2095: t01 + Owner: Neutral + Location: 101,95 + Actor2096: t07 + Owner: Neutral + Location: 108,31 + Actor2097: t01 + Owner: Neutral + Location: 94,128 + Actor2098: t13 + Owner: Neutral + Location: 103,87 + Actor2099: t13 + Owner: Neutral + Location: 115,61 + Actor2100: t13 + Owner: Neutral + Location: 143,77 + Actor2101: t16 + Owner: Neutral + Location: 95,97 + Actor2102: t08 + Owner: Neutral + Location: 104,128 + Actor2104: t05 + Owner: Neutral + Location: 61,87 + Actor2105: t17 + Owner: Neutral + Location: 122,66 + Actor2106: t03 + Owner: Neutral + Location: 52,80 + Actor2107: t02 + Owner: Neutral + Location: 140,29 + Actor2109: t08 + Owner: Neutral + Location: 46,34 + Actor2110: t16 + Owner: Neutral + Location: 74,40 + Actor2111: t07 + Owner: Neutral + Location: 123,111 + Actor2112: t16 + Owner: Neutral + Location: 127,46 + Actor2113: t07 + Owner: Neutral + Location: 123,66 + Actor2114: t07 + Owner: Neutral + Location: 12,58 + Actor2115: t01 + Owner: Neutral + Location: 91,14 + Actor2117: t12 + Owner: Neutral + Location: 41,70 + Actor2118: t17 + Owner: Neutral + Location: 47,115 + Actor2119: t02 + Owner: Neutral + Location: 19,117 + Actor2120: t13 + Owner: Neutral + Location: 132,102 + Actor2121: t12 + Owner: Neutral + Location: 74,3 + Actor2122: t13 + Owner: Neutral + Location: 12,61 + Actor2123: t08 + Owner: Neutral + Location: 120,111 + Actor2124: t05 + Owner: Neutral + Location: 3,118 + Actor2125: t05 + Owner: Neutral + Location: 102,35 + Actor2126: t06 + Owner: Neutral + Location: 92,14 + Actor2127: t05 + Owner: Neutral + Location: 98,93 + Actor2128: t17 + Owner: Neutral + Location: 47,42 + Actor2129: t12 + Owner: Neutral + Location: 47,12 + Actor2130: t02 + Owner: Neutral + Location: 18,49 + Actor2131: t06.husk + Owner: Neutral + Location: 78,51 + Actor2132: t12 + Owner: Neutral + Location: 50,107 + Actor2133: t17 + Owner: Neutral + Location: 66,84 + Actor2134: t03 + Owner: Neutral + Location: 62,90 + Actor2135: t16.husk + Owner: Neutral + Location: 101,126 + Actor2136: t07 + Owner: Neutral + Location: 40,41 + Actor2137: t02 + Owner: Neutral + Location: 99,126 + Actor2138: t08 + Owner: Neutral + Location: 45,39 + Actor2139: t13.husk + Owner: Neutral + Location: 87,86 + Actor2140: t08 + Owner: Neutral + Location: 118,98 + Actor2141: t06 + Owner: Neutral + Location: 103,34 + Actor2142: t07 + Owner: Neutral + Location: 101,16 + Actor2143: t01 + Owner: Neutral + Location: 119,71 + Actor2144: t01 + Owner: Neutral + Location: 128,66 + Actor2145: t01 + Owner: Neutral + Location: 92,97 + Actor2146: t16 + Owner: Neutral + Location: 44,28 + Actor2147: t08 + Owner: Neutral + Location: 140,69 + Actor2148: t16.husk + Owner: Neutral + Location: 3,120 + Actor2149: t06 + Owner: Neutral + Location: 21,55 + Actor2150: t01 + Owner: Neutral + Location: 34,52 + Actor2151: t12 + Owner: Neutral + Location: 69,0 + Actor2152: t07 + Owner: Neutral + Location: 21,56 + Actor2153: t13 + Owner: Neutral + Location: 94,102 + Actor2154: t01 + Owner: Neutral + Location: 35,78 + Actor2155: t07 + Owner: Neutral + Location: 45,18 + Actor2156: t08 + Owner: Neutral + Location: 35,73 + Actor2157: t17 + Owner: Neutral + Location: 101,93 + Actor2158: t05 + Owner: Neutral + Location: 98,92 + Actor2159: t13 + Owner: Neutral + Location: 108,93 + Actor2160: t03 + Owner: Neutral + Location: 73,3 + Actor2161: t07 + Owner: Neutral + Location: 142,78 + Actor2162: t12 + Owner: Neutral + Location: 120,15 + Actor2163: t02 + Owner: Neutral + Location: 27,72 + Actor2164: t05 + Owner: Neutral + Location: 4,6 + Actor2165: t05 + Owner: Neutral + Location: 101,119 + Actor2166: t16 + Owner: Neutral + Location: 141,81 + Actor2167: t08 + Owner: Neutral + Location: 104,127 + Actor2169: t07 + Owner: Neutral + Location: 105,87 + Actor2170: t03 + Owner: Neutral + Location: 34,56 + Actor2171: t17 + Owner: Neutral + Location: 1,93 + Actor2172: t03 + Owner: Neutral + Location: 102,119 + Actor2173: t13.husk + Owner: Neutral + Location: 69,1 + Actor2174: t08 + Owner: Neutral + Location: 37,66 + Actor2175: t05 + Owner: Neutral + Location: 121,99 + Actor2176: t01 + Owner: Neutral + Location: 13,56 + Actor2177: t13 + Owner: Neutral + Location: 18,70 + Actor2178: t17 + Owner: Neutral + Location: 63,88 + Actor2179: t16 + Owner: Neutral + Location: 53,31 + Actor2180: t16 + Owner: Neutral + Location: 33,33 + Actor2181: t06 + Owner: Neutral + Location: 132,39 + Actor2182: t06 + Owner: Neutral + Location: 133,41 + Actor2183: t13 + Owner: Neutral + Location: 32,53 + Actor2184: t17 + Owner: Neutral + Location: 2,123 + Actor2185: t08 + Owner: Neutral + Location: 2,120 + Actor2186: t03 + Owner: Neutral + Location: 51,32 + Actor2187: t03 + Owner: Neutral + Location: 33,77 + Actor2188: t07 + Owner: Neutral + Location: 29,40 + Actor2189: t13 + Owner: Neutral + Location: 15,60 + Actor2190: t16 + Owner: Neutral + Location: 20,55 + Actor2191: t07 + Owner: Neutral + Location: 96,98 + Actor2192: t01 + Owner: Neutral + Location: 15,61 + Actor2193: t06 + Owner: Neutral + Location: 33,55 + Actor2194: t16 + Owner: Neutral + Location: 86,15 + Actor2195: t08 + Owner: Neutral + Location: 98,98 + Actor2196: t05 + Owner: Neutral + Location: 17,59 + Actor2197: t03 + Owner: Neutral + Location: 43,44 + Actor2198: t08 + Owner: Neutral + Location: 51,34 + Actor2199: t03 + Owner: Neutral + Location: 86,16 + Actor2200: t12 + Owner: Neutral + Location: 33,70 + Actor2201: t03 + Owner: Neutral + Location: 20,56 + Actor1699: t06 + Owner: Neutral + Location: 144,80 + HQ: miss + Owner: GDI + Location: 76,66 + Actor2019: brik + Owner: GDI + Location: 67,75 + Actor2024: brik + Owner: GDI + Location: 67,74 + Actor2035: brik + Owner: GDI + Location: 68,74 + Actor2045: brik + Owner: GDI + Location: 68,75 + Actor2053: brik + Owner: GDI + Location: 67,73 + Actor2059: brik + Owner: GDI + Location: 67,72 + Actor2067: brik + Owner: GDI + Location: 67,71 + Actor2078: brik + Owner: GDI + Location: 67,70 + Actor2094: brik + Owner: GDI + Location: 68,71 + Actor2103: brik + Owner: GDI + Location: 68,70 + Actor2108: brik + Owner: GDI + Location: 69,75 + Actor2116: brik + Owner: GDI + Location: 70,76 + Actor2168: brik + Owner: GDI + Location: 70,75 + Actor2202: brik + Owner: GDI + Location: 70,77 + Actor2203: brik + Owner: GDI + Location: 70,78 + Actor2204: brik + Owner: GDI + Location: 71,78 + Actor2205: brik + Owner: GDI + Location: 72,78 + Actor2206: brik + Owner: GDI + Location: 73,78 + Actor2207: brik + Owner: GDI + Location: 74,78 + Actor2208: brik + Owner: GDI + Location: 74,77 + Actor2209: brik + Owner: GDI + Location: 73,77 + Actor2210: brik + Owner: GDI + Location: 80,77 + Actor2211: brik + Owner: GDI + Location: 80,78 + Actor2212: brik + Owner: GDI + Location: 82,78 + Actor2213: brik + Owner: GDI + Location: 81,77 + Actor2214: brik + Owner: GDI + Location: 81,78 + Actor2215: brik + Owner: GDI + Location: 83,78 + Actor2216: brik + Owner: GDI + Location: 84,78 + Actor2217: brik + Owner: GDI + Location: 83,77 + Actor2218: brik + Owner: GDI + Location: 84,77 + Actor2219: brik + Owner: GDI + Location: 84,76 + Actor2220: brik + Owner: GDI + Location: 86,76 + Actor2221: brik + Owner: GDI + Location: 85,76 + Actor2222: brik + Owner: GDI + Location: 88,76 + Actor2223: brik + Owner: GDI + Location: 87,76 + Actor2243: brik + Owner: GDI + Location: 89,57 + Actor2244: brik + Owner: GDI + Location: 87,57 + Actor2245: brik + Owner: GDI + Location: 88,57 + Actor2246: brik + Owner: GDI + Location: 86,57 + Actor2247: brik + Owner: GDI + Location: 85,57 + Actor2248: brik + Owner: GDI + Location: 83,57 + Actor2249: brik + Owner: GDI + Location: 81,57 + Actor2250: brik + Owner: GDI + Location: 84,57 + Actor2251: brik + Owner: GDI + Location: 82,57 + Actor2252: brik + Owner: GDI + Location: 80,57 + Actor2253: brik + Owner: GDI + Location: 80,58 + Actor2254: brik + Owner: GDI + Location: 81,58 + Actor2255: brik + Owner: GDI + Location: 74,57 + Actor2256: brik + Owner: GDI + Location: 74,58 + Actor2257: brik + Owner: GDI + Location: 73,57 + Actor2258: brik + Owner: GDI + Location: 73,58 + Actor2259: brik + Owner: GDI + Location: 72,57 + Actor2260: brik + Owner: GDI + Location: 70,57 + Actor2261: brik + Owner: GDI + Location: 71,57 + Actor2262: brik + Owner: GDI + Location: 69,57 + Actor2263: brik + Owner: GDI + Location: 68,57 + Actor2267: brik + Owner: GDI + Location: 67,62 + Actor2268: brik + Owner: GDI + Location: 67,61 + Actor2269: brik + Owner: GDI + Location: 67,60 + Actor2270: brik + Owner: GDI + Location: 67,59 + Actor2271: brik + Owner: GDI + Location: 67,58 + Actor2272: brik + Owner: GDI + Location: 67,63 + Actor2274: brik + Owner: GDI + Location: 67,65 + Actor2275: brik + Owner: GDI + Location: 68,65 + Actor2276: brik + Owner: GDI + Location: 67,64 + Actor2277: brik + Owner: GDI + Location: 68,64 + Actor2265: nuk2 + Owner: GDI + Location: 68,58 + Actor2266: nuk2 + Owner: GDI + Location: 70,58 + Actor2278: nuk2 + Owner: GDI + Location: 85,73 + Actor2279: nuk2 + Owner: GDI + Location: 87,73 + Actor2280: nuk2 + Owner: GDI + Location: 83,73 + Actor2285: atwr + Owner: GDI + Location: 72,77 + Actor2286: atwr + Owner: GDI + Location: 68,73 + Actor2287: atwr + Owner: GDI + Location: 82,77 + Actor2290: atwr + Owner: GDI + Location: 82,58 + Actor2291: atwr + Owner: GDI + Location: 72,58 + Actor2292: atwr + Owner: GDI + Location: 68,63 + Actor2293: gtwr + Owner: GDI + Location: 74,79 + Actor2294: gtwr + Owner: GDI + Location: 80,79 + Actor2297: gtwr + Owner: GDI + Location: 80,56 + Actor2298: gtwr + Owner: GDI + Location: 74,56 + Actor2299: gtwr + Owner: GDI + Location: 66,65 + Actor2300: gtwr + Owner: GDI + Location: 66,70 + Actor2304: cram + Owner: GDI + Location: 70,74 + Actor2305: cram + Owner: GDI + Location: 68,61 + Actor2308: nuk2 + Owner: GDI + Location: 72,59 + Actor2309: nuk2 + Owner: GDI + Location: 84,58 + Actor2302: afld.gdi + Owner: GDI + Location: 72,71 + Actor2283: rep + Owner: GDI + Location: 71,67 + Actor2284: pyle + Owner: GDI + Location: 84,69 + Actor2312: t01 + Owner: Neutral + Location: 42,104 + Actor2314: t13 + Owner: Neutral + Location: 40,105 + Actor2315: tc04 + Owner: Neutral + Location: 41,105 + Actor2316: t08 + Owner: Neutral + Location: 37,107 + Actor2317: t17 + Owner: Neutral + Location: 38,106 + Actor2318: t13.husk + Owner: Neutral + Location: 40,106 + Actor2319: t13 + Owner: Neutral + Location: 38,107 + Actor2320: t13 + Owner: Neutral + Location: 39,107 + Actor2321: t08 + Owner: Neutral + Location: 40,108 + Actor2322: t06 + Owner: Neutral + Location: 39,108 + Actor2323: split2 + Owner: Neutral + Location: 81,85 + Actor2324: split2 + Owner: Neutral + Location: 80,91 + Actor2325: split2 + Owner: Neutral + Location: 85,88 + Actor2326: split2 + Owner: Neutral + Location: 107,82 + Actor2327: split2 + Owner: Neutral + Location: 110,85 + Actor2328: wormhole + Owner: Scrin + Location: 136,9 + Actor2329: wormhole + Owner: Scrin + Location: 124,5 + Actor2330: wormhole + Owner: Scrin + Location: 138,36 + Actor2331: wormhole + Owner: Scrin + Location: 114,35 + Actor2332: wormhole + Owner: Scrin + Location: 84,24 + Actor2333: wormhole + Owner: Scrin + Location: 52,7 + Actor2334: wormhole + Owner: Scrin + Location: 31,7 + Actor2335: wormhole + Owner: Scrin + Location: 9,23 + Actor2336: wormhole + Owner: Scrin + Location: 12,43 + Actor2337: wormhole + Owner: Scrin + Location: 25,63 + Actor2338: wormhole + Owner: Scrin + Location: 9,89 + Actor2339: wormhole + Owner: Scrin + Location: 10,122 + Actor2340: wormhole + Owner: Scrin + Location: 38,124 + Actor2342: wormhole + Owner: Scrin + Location: 131,120 + Actor2343: wormhole + Owner: Scrin + Location: 100,107 + Actor2344: wormhole + Owner: Scrin + Location: 48,88 + Actor2345: wormhole + Owner: Scrin + Location: 54,37 + Actor2346: wormhole + Owner: Scrin + Location: 138,53 + Actor2347: wormhole + Owner: Scrin + Location: 131,74 + Actor2349: mtnk + Owner: GDI + Location: 72,80 + Facing: 384 + Actor2350: mtnk + Owner: GDI + Location: 82,80 + Facing: 618 + Actor2353: mtnk + Owner: GDI + Location: 64,70 + Facing: 256 + Actor2354: mtnk + Owner: GDI + Location: 64,66 + Facing: 256 + Actor2355: mtnk + Owner: GDI + Location: 72,55 + Facing: 0 + Actor2356: mtnk + Owner: GDI + Location: 82,55 + Facing: 0 + Actor2357: vulc + Owner: GDI + Location: 76,59 + Facing: 0 + Actor2359: vulc + Owner: GDI + Location: 74,75 + Facing: 512 + Actor2360: harv.td + Owner: GDI + Location: 78,81 + Facing: 512 + Actor2362: wolv + Owner: GDI + Location: 78,69 + Facing: 547 + Actor2363: wolv + Owner: GDI + Facing: 384 + Location: 75,67 + Actor2364: n1 + Owner: GDI + Location: 86,71 + SubCell: 3 + Facing: 206 + Actor2365: n1 + Owner: GDI + SubCell: 3 + Location: 86,70 + Facing: 753 + Actor2366: n1 + Owner: GDI + Facing: 384 + Location: 86,70 + SubCell: 1 + Actor2367: n1 + Owner: GDI + Location: 86,70 + SubCell: 2 + Facing: 0 + Actor2368: n1 + Owner: GDI + Location: 86,70 + SubCell: 4 + Facing: 594 + Actor2369: n1 + Owner: GDI + Facing: 384 + SubCell: 1 + Location: 84,71 + Actor2370: n1 + Owner: GDI + SubCell: 3 + Location: 83,70 + Facing: 650 + Actor2371: n1 + Owner: GDI + Location: 83,70 + SubCell: 1 + Facing: 134 + Actor2372: n1 + Owner: GDI + Location: 83,70 + SubCell: 2 + Facing: 0 + Actor2373: n1 + Owner: GDI + Location: 84,71 + SubCell: 2 + Facing: 578 + Actor2374: n1 + Owner: GDI + SubCell: 3 + Location: 85,68 + Facing: 832 + Actor2377: n1 + Owner: GDI + SubCell: 3 + Location: 83,55 + Facing: 0 + Actor2378: n1 + Owner: GDI + SubCell: 3 + Location: 72,56 + Facing: 0 + Actor2379: n1 + Owner: GDI + Location: 64,65 + SubCell: 3 + Facing: 118 + Actor2380: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 64,71 + Actor2381: n1 + Owner: GDI + Facing: 384 + Location: 71,80 + SubCell: 3 + Actor2382: n1 + Owner: GDI + SubCell: 3 + Location: 73,81 + Facing: 570 + Actor2383: n1 + Owner: GDI + Facing: 384 + Location: 83,80 + SubCell: 3 + Actor2384: n1 + Owner: GDI + SubCell: 3 + Location: 83,79 + Facing: 610 + Actor2385: medi + Owner: GDI + Facing: 384 + Location: 86,69 + SubCell: 3 + Actor2386: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 79,69 + Actor2388: n3 + Owner: GDI + Location: 74,63 + SubCell: 3 + Facing: 697 + Actor2389: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 70,61 + Actor2390: split2 + Owner: Neutral + Location: 43,65 + Actor2391: split2 + Owner: Neutral + Location: 45,60 + Actor2392: tpod + Owner: Scrin + Location: 93,7 + Facing: 531 + Actor2393: tpod + Owner: Scrin + Facing: 384 + Location: 100,11 + Actor2400: pac + Owner: Scrin + Location: 17,121 + Facing: 896 + Actor2401: pac + Owner: Scrin + Location: 10,113 + Facing: 896 + Actor2394: pac + Owner: Scrin + Facing: 384 + Location: 136,15 + Actor2395: pac + Owner: Scrin + Facing: 384 + Location: 128,7 + Actor2295: brik + Owner: GDI + Location: 90,57 + Actor2296: brik + Owner: GDI + Location: 91,57 + Actor2351: cram + Owner: GDI + Location: 90,58 + Actor2352: brik + Owner: GDI + Location: 91,58 + Actor2361: brik + Owner: GDI + Location: 91,59 + Actor2375: brik + Owner: GDI + Location: 91,60 + Actor2376: atwr + Owner: GDI + Location: 90,61 + Actor2398: brik + Owner: GDI + Location: 91,61 + Actor2403: brik + Owner: GDI + Location: 91,62 + Actor2407: brik + Owner: GDI + Location: 91,63 + Actor2408: gtwr + Owner: GDI + Location: 92,63 + Actor2409: brik + Owner: GDI + Location: 90,68 + Actor2410: brik + Owner: GDI + Location: 91,68 + Actor2411: gtwr + Owner: GDI + Location: 92,68 + Actor2412: brik + Owner: GDI + Location: 90,69 + Actor2413: brik + Owner: GDI + Location: 91,69 + Actor2414: atwr + Owner: GDI + Location: 90,70 + Actor2415: brik + Owner: GDI + Location: 91,70 + Actor2416: brik + Owner: GDI + Location: 91,71 + Actor2417: cram + Owner: GDI + Location: 90,72 + Actor2418: brik + Owner: GDI + Location: 91,72 + Actor2420: brik + Owner: GDI + Location: 91,73 + Actor2421: brik + Owner: GDI + Location: 91,74 + Actor2422: brik + Owner: GDI + Location: 91,75 + Actor2423: brik + Owner: GDI + Location: 90,76 + Actor2232: n3 + Owner: GDI + SubCell: 3 + Facing: 745 + Location: 88,66 + Actor2233: vulc + Owner: GDI + Facing: 768 + Location: 88,67 + Actor2234: brik + Owner: GDI + Location: 89,76 + Actor2235: brik + Owner: GDI + Location: 91,76 + Actor2236: hq + Owner: GDI + Location: 89,73 + Actor2237: nuk2 + Owner: GDI + Location: 86,58 + Actor2238: nuk2 + Owner: GDI + Location: 88,58 + Actor2239: weap.td + Owner: GDI + Location: 85,62 + Actor2240: brik + Owner: GDI + Location: 90,63 + Actor2241: brik + Owner: GDI + Location: 90,62 + Actor2242: mtnk + Owner: GDI + Location: 95,64 + Facing: 768 + Actor2288: mtnk + Owner: GDI + Location: 95,69 + Facing: 768 + Actor2289: n1 + Owner: GDI + SubCell: 3 + Facing: 610 + Location: 96,62 + Actor2301: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 96,63 + Actor2306: n1 + Owner: GDI + SubCell: 3 + Facing: 610 + Location: 95,70 + Actor2273: proc.td + Owner: GDI + Location: 78,71 + Actor2281: gtek + Owner: GDI + Location: 81,62 + Actor2282: upgc + Owner: GDI + Location: 71,63 + Actor2224: brik + Owner: GDI + Location: 67,57 + Actor2228: ptnk + Owner: Greece + Facing: 777 + Location: 92,61 + Actor2225: ifv + Owner: Greece + Location: 93,73 + Facing: 768 + Actor2226: ifv + Owner: Greece + Location: 93,75 + Facing: 768 + Actor2229: e1 + Owner: Greece + SubCell: 3 + Location: 94,60 + Facing: 999 + Actor2230: e1 + Owner: Greece + SubCell: 3 + Location: 93,58 + Facing: 777 + Actor2231: e1 + Owner: Greece + Location: 93,58 + SubCell: 1 + Facing: 777 + Actor2303: e1 + Owner: Greece + SubCell: 3 + Location: 91,47 + Facing: 904 + Actor2307: e1 + Owner: Greece + Location: 91,47 + SubCell: 1 + Facing: 856 + Actor2310: e1 + Owner: Greece + SubCell: 3 + Location: 94,50 + Facing: 816 + Actor2311: e1 + Owner: Greece + SubCell: 3 + Location: 92,50 + Facing: 848 + Actor2358: ptnk + Owner: Greece + Facing: 777 + Location: 93,71 + Actor2387: e3 + Owner: Greece + SubCell: 3 + Location: 92,48 + Facing: 1023 + Actor2399: 3tnk + Owner: USSR + Location: 78,98 + Facing: 512 + Actor2404: 3tnk + Owner: USSR + Location: 84,98 + Facing: 512 + Actor2405: 3tnk + Owner: USSR + Location: 81,99 + Facing: 512 + Actor2406: ttra + Owner: USSR + Location: 81,97 + Facing: 512 + Actor2419: ttrp + Owner: USSR + SubCell: 3 + Location: 78,97 + Facing: 563 + Actor2424: e1 + Owner: USSR + SubCell: 3 + Location: 83,98 + Facing: 674 + Actor2425: e1 + Owner: USSR + SubCell: 3 + Location: 79,99 + Facing: 547 + Actor2426: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 77,99 + Actor2427: e1 + Owner: USSR + SubCell: 3 + Location: 84,99 + Facing: 507 + Actor2428: e1 + Owner: USSR + SubCell: 3 + Location: 86,98 + Facing: 578 + Actor2429: e3 + Owner: USSR + Facing: 384 + Location: 83,98 + SubCell: 1 + Actor2430: ltnk + Owner: Nod + Facing: 384 + Location: 43,76 + Actor2431: ltnk + Owner: Nod + Facing: 384 + Location: 47,77 + Actor2432: ftnk + Owner: Nod + Facing: 384 + Location: 45,77 + Actor2433: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 42,75 + Actor2434: n1 + Owner: Nod + Facing: 384 + Location: 42,75 + SubCell: 1 + Actor2435: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 45,76 + Actor2436: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 48,76 + Actor2437: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 47,79 + Actor2438: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 42,77 + Actor2439: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 46,79 + Actor2440: stnk.nod + Owner: Nod + Location: 35,81 + Facing: 384 + Stance: AttackAnything + Actor2441: stnk.nod + Owner: Nod + Location: 36,82 + Facing: 384 + Stance: AttackAnything + Actor2442: mrj + Owner: Greece + Facing: 384 + Location: 83,60 + Actor2443: cryo + Owner: Greece + Facing: 384 + Location: 69,74 + Actor2444: cryo + Owner: Greece + Location: 90,59 + Facing: 888 + Actor2445: batf.ai + Owner: Greece + Facing: 384 + Location: 52,53 + Actor2446: jeep + Owner: Greece + Facing: 384 + Location: 49,51 + Actor2447: jeep + Owner: Greece + Facing: 384 + Location: 51,49 + Actor2448: 2tnk + Owner: Greece + Facing: 384 + Location: 51,51 + Actor2449: 2tnk + Owner: Greece + Location: 55,49 + Facing: 253 + Actor2450: pbox + Owner: Greece + Location: 53,49 + Actor2451: agun + Owner: Greece + Location: 56,52 + Actor2452: sbag + Owner: Greece + Location: 55,52 + Actor2453: sbag + Owner: Greece + Location: 55,51 + Actor2454: sbag + Owner: Greece + Location: 56,51 + Actor2455: sbag + Owner: Greece + Location: 57,51 + Actor2456: sbag + Owner: Greece + Location: 57,52 + Actor2457: sbag + Owner: Greece + Location: 57,53 + Actor2458: sbag + Owner: Greece + Location: 56,53 + Actor2459: sbag + Owner: Greece + Location: 55,53 + Actor2460: sbag + Owner: Greece + Location: 90,46 + Actor2461: sbag + Owner: Greece + Location: 90,47 + Actor2462: sbag + Owner: Greece + Location: 91,46 + Actor2463: sbag + Owner: Greece + Location: 92,46 + Actor2464: sbag + Owner: Greece + Location: 93,46 + Actor2465: sbag + Owner: Greece + Location: 98,46 + Actor2466: sbag + Owner: Greece + Location: 97,46 + Actor2467: sbag + Owner: Greece + Location: 99,46 + Actor2468: sbag + Owner: Greece + Location: 100,46 + Actor2469: sbag + Owner: Greece + Location: 100,47 + Actor2470: sbag + Owner: Greece + Location: 100,48 + Actor2471: ptnk + Owner: Greece + Location: 99,47 + Facing: 7 + Actor2472: ifv + Owner: Greece + Location: 94,48 + Facing: 0 + ReinforcementSpawn1: waypoint + Owner: Neutral + Location: 16,1 + ReinforcementSpawn2: waypoint + Owner: Neutral + Location: 85,1 + ReinforcementSpawn10: waypoint + Owner: Neutral + Location: 97,1 + ReinforcementSpawn3: waypoint + Owner: Neutral + Location: 112,1 + ReinforcementSpawn4: waypoint + Owner: Neutral + Location: 144,93 + ReinforcementSpawn5: waypoint + Owner: Neutral + Location: 114,128 + ReinforcementSpawn6: waypoint + Owner: Neutral + Location: 86,128 + ReinforcementSpawn7: waypoint + Owner: Neutral + Location: 64,128 + ReinforcementSpawn9: waypoint + Owner: Neutral + Location: 1,80 + ReinforcementRally2: waypoint + Owner: Neutral + Location: 82,9 + ReinforcementRally10: waypoint + Owner: Neutral + Location: 96,14 + ReinforcementRally4: waypoint + Owner: Neutral + Location: 127,92 + ReinforcementRally5: waypoint + Owner: Neutral + Location: 111,117 + ReinforcementRally7: waypoint + Owner: Neutral + Location: 67,118 + ReinforcementRally6: waypoint + Owner: Neutral + Location: 86,121 + Actor2313: t03 + Owner: Neutral + Location: 43,104 + ReinforcementSpawn8: waypoint + Owner: Neutral + Location: 43,128 + ReinforcementRally8: waypoint + Owner: Neutral + Location: 43,119 + ReinforcementRally9: waypoint + Owner: Neutral + Location: 14,80 + Actor2473: fenc + Owner: USSR + Location: 79,101 + Actor2474: fenc + Owner: USSR + Location: 78,101 + Actor2475: fenc + Owner: USSR + Location: 77,101 + Actor2476: fenc + Owner: USSR + Location: 76,101 + Actor2477: fenc + Owner: USSR + Location: 83,101 + Actor2478: fenc + Owner: USSR + Location: 84,101 + Actor2479: fenc + Owner: USSR + Location: 85,101 + Actor2480: fenc + Owner: USSR + Location: 87,101 + Actor2481: fenc + Owner: USSR + Location: 86,101 + Actor2482: fenc + Owner: USSR + Location: 75,101 + Actor2483: fenc + Owner: USSR + Location: 75,100 + Actor2484: ftur + Owner: USSR + Location: 84,102 + Actor2485: ftur + Owner: USSR + Location: 78,102 + ReinforcementFlare1: waypoint + Owner: Neutral + Location: 16,4 + ReinforcementFlare2: waypoint + Owner: Neutral + Location: 85,5 + ReinforcementFlare10: waypoint + Owner: Neutral + Location: 97,5 + ReinforcementFlare3: waypoint + Owner: Neutral + Location: 112,5 + ReinforcementFlare4: waypoint + Owner: Neutral + Location: 140,92 + ReinforcementFlare5: waypoint + Owner: Neutral + Location: 114,123 + ReinforcementFlare6: waypoint + Owner: Neutral + Location: 86,124 + ReinforcementFlare7: waypoint + Owner: Neutral + Location: 64,123 + ReinforcementFlare8: waypoint + Owner: Neutral + Location: 43,124 + ReinforcementFlare9: waypoint + Owner: Neutral + Location: 5,80 + Actor2488: devo + Owner: Scrin + Location: 11,114 + Facing: 896 + Actor2491: gunw + Owner: Scrin + Location: 13,113 + Facing: 896 + Actor2490: gunw + Owner: Scrin + Facing: 896 + Location: 14,115 + Actor2489: gunw + Owner: Scrin + Facing: 896 + Location: 17,116 + Actor2492: gunw + Owner: Scrin + Facing: 896 + Location: 7,117 + Actor2486: devo + Owner: Scrin + Facing: 896 + Location: 10,117 + Actor2487: devo + Owner: Scrin + Facing: 896 + Location: 16,119 + Actor2493: tpod + Owner: Scrin + Location: 19,120 + Facing: 896 + Actor2494: tpod + Owner: Scrin + Location: 9,115 + Facing: 896 + Actor2495: corr + Owner: Scrin + Location: 13,116 + Facing: 896 + Actor2496: tpod + Owner: Scrin + Facing: 384 + Location: 133,14 + Actor2497: rtpd + Owner: Scrin + Facing: 384 + Location: 128,13 + Actor2498: corr + Owner: Scrin + Facing: 384 + Location: 131,12 + Actor2499: evis + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 135,14 + Actor2500: evis + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 131,10 + Actor2501: evis + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 130,11 + Actor2502: evis + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 129,8 + Actor2503: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 125,7 + Actor2504: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 124,3 + Actor2505: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 126,4 + Actor2506: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 136,7 + Actor2507: s3 + Owner: Scrin + Facing: 384 + Location: 136,7 + SubCell: 1 + Actor2508: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 138,9 + Actor2509: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 139,14 + Actor2510: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 140,18 + Actor2511: devo + Owner: Scrin + Facing: 384 + Location: 133,11 + Actor2512: devo + Owner: Scrin + Facing: 384 + Location: 131,8 + Actor2513: gunw + Owner: Scrin + Facing: 384 + Location: 130,15 + Actor2514: gunw + Owner: Scrin + Facing: 384 + Location: 139,16 + Actor2515: gunw + Owner: Scrin + Facing: 384 + Location: 127,6 + Actor2516: gunw + Owner: Scrin + Facing: 384 + Location: 127,2 + Actor2517: intl.ai2 + Owner: Scrin + Facing: 384 + Location: 137,17 + Actor2518: intl.ai2 + Owner: Scrin + Facing: 384 + Location: 135,12 + Actor2519: intl.ai2 + Owner: Scrin + Location: 20,116 + Facing: 896 + Actor2520: intl.ai2 + Owner: Scrin + Facing: 896 + Location: 14,111 + Actor2524: evis + Owner: Scrin + Location: 7,113 + SubCell: 3 + Facing: 896 + Actor2523: evis + Owner: Scrin + SubCell: 3 + Facing: 896 + Location: 8,114 + Actor2522: evis + Owner: Scrin + SubCell: 3 + Facing: 896 + Location: 22,119 + Actor2521: evis + Owner: Scrin + SubCell: 3 + Facing: 896 + Location: 22,118 + Actor2530: s3 + Owner: Scrin + SubCell: 3 + Location: 4,112 + Facing: 896 + Actor2529: s3 + Owner: Scrin + SubCell: 3 + Facing: 896 + Location: 17,125 + Actor2526: s3 + Owner: Scrin + SubCell: 3 + Facing: 896 + Location: 17,123 + Actor2525: s3 + Owner: Scrin + SubCell: 3 + Facing: 896 + Location: 14,121 + Actor2527: s3 + Owner: Scrin + SubCell: 3 + Facing: 896 + Location: 21,122 + Actor2528: s3 + Owner: Scrin + SubCell: 3 + Facing: 896 + Location: 23,121 + Actor2402: tpod + Owner: Scrin + Location: 127,120 + Facing: 256 + Actor2531: tpod + Owner: Scrin + Location: 129,124 + Facing: 384 + Actor2532: tpod + Owner: Scrin + Location: 130,116 + Facing: 128 + ReinforcementRally3: waypoint + Owner: Neutral + Location: 112,10 + ReinforcementRally1: waypoint + Owner: Neutral + Location: 20,10 + Actor2533: wormhole + Owner: Scrin + Location: 135,104 + Actor2534: wormhole + Owner: Scrin + Location: 56,111 + Actor2535: wormhole + Owner: Scrin + Location: 80,120 + Actor2536: wormhole + Owner: Scrin + Location: 29,105 + Actor2537: split2 + Owner: Neutral + Location: 98,114 + HiddenSpawner1: hiddenspawner + Owner: Scrin + Location: 144,82 + HiddenSpawner2: hiddenspawner + Owner: Scrin + Location: 1,6 + HiddenSpawner3: hiddenspawner + Owner: Scrin + Location: 1,128 + HiddenSpawner4: hiddenspawner + Owner: Scrin + Location: 101,128 + HiddenSpawner5: hiddenspawner + Owner: Scrin + Location: 74,1 + Actor399: t16 + Owner: Neutral + Location: 143,83 + Actor2539: wormhole + Owner: Scrin + Location: 23,37 + Actor2538: wormhole + Owner: Scrin + Location: 118,95 + Actor2540: evis + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 47,8 + Actor2541: evis + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 46,7 + Actor2542: evis + Owner: Scrin + SubCell: 3 + Location: 55,10 + Facing: 642 + Actor2543: evis + Owner: Scrin + SubCell: 3 + Location: 56,8 + Facing: 642 + Actor2544: intl.ai2 + Owner: Scrin + Location: 57,9 + Facing: 642 + Actor2545: gunw + Owner: Scrin + Facing: 384 + Location: 32,10 + Actor2546: gunw + Owner: Scrin + Facing: 384 + Location: 27,5 + Actor2547: shrw + Owner: Scrin + Location: 130,34 + Facing: 256 + Actor2548: shrw + Owner: Scrin + Location: 130,37 + Facing: 256 + Actor2549: devo + Owner: Scrin + Location: 133,34 + Facing: 256 + Actor2550: lace + Owner: Scrin + Location: 130,70 + Facing: 269 + Actor2551: lace + Owner: Scrin + Facing: 384 + Location: 129,77 + Actor2552: lace + Owner: Scrin + Location: 131,77 + Facing: 384 + Actor2553: lace + Owner: Scrin + Location: 132,68 + Facing: 872 + Actor2554: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 131,69 + Actor2555: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 126,69 + Actor2556: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 135,77 + Actor2557: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 101,109 + Actor2558: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 100,105 + Actor2559: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 128,123 + Actor2560: s3 + Owner: Scrin + SubCell: 3 + Location: 128,121 + Facing: 333 + Actor2561: s3 + Owner: Scrin + SubCell: 3 + Location: 130,118 + Facing: 150 + Actor2562: s3 + Owner: Scrin + SubCell: 3 + Location: 131,117 + Facing: 142 + Actor2563: shrw + Owner: Scrin + Location: 128,118 + Facing: 166 + Actor2564: shrw + Owner: Scrin + Location: 132,115 + Facing: 118 + Actor2565: seek + Owner: Scrin + Location: 132,105 + Facing: 174 + Actor2566: seek + Owner: Scrin + Location: 130,103 + Facing: 237 + Actor2567: mast + Owner: Scrin + SubCell: 3 + Location: 8,120 + Facing: 880 + Actor2568: ruin + Owner: Scrin + Location: 7,28 + Facing: 808 + Actor2569: ruin + Owner: Scrin + Location: 7,30 + Facing: 848 + Actor2570: lchr + Owner: Scrin + Facing: 384 + Location: 11,39 + Actor2571: lchr + Owner: Scrin + Facing: 384 + Location: 16,44 + Actor2572: tpod + Owner: Scrin + Facing: 384 + Location: 14,41 + Actor2573: devo + Owner: Scrin + Location: 22,45 + Facing: 697 + Actor2574: devo + Owner: Scrin + Location: 24,44 + Facing: 689 + Actor2575: corr + Owner: Scrin + Location: 22,43 + Facing: 682 + Actor2576: gunw + Owner: Scrin + Location: 24,43 + Facing: 689 + Actor2577: gunw + Owner: Scrin + Location: 54,34 + Facing: 507 + Actor2578: gunw + Owner: Scrin + Location: 56,34 + Facing: 491 + Actor2579: stcr + Owner: Scrin + Location: 76,121 + Facing: 769 + Actor2580: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 78,119 + Actor2581: s1 + Owner: Scrin + Facing: 384 + Location: 79,118 + SubCell: 3 + Actor2582: s1 + Owner: Scrin + Facing: 384 + Location: 78,119 + SubCell: 1 + Actor2583: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 78,121 + Actor2584: s1 + Owner: Scrin + SubCell: 3 + Location: 60,111 + Facing: 626 + Actor2585: s1 + Owner: Scrin + Facing: 384 + Location: 60,111 + SubCell: 1 + Actor2586: s1 + Owner: Scrin + SubCell: 3 + Location: 58,108 + Facing: 800 + Actor2587: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 56,107 + Actor2588: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 59,114 + Actor2589: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 77,120 + Actor2590: intl + Owner: Scrin + Location: 60,113 + Facing: 713 + Actor2591: evis + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 45,91 + Actor2592: evis + Owner: Scrin + Facing: 384 + Location: 45,91 + SubCell: 1 + Actor2593: evis + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 48,92 + Actor2594: gunw + Owner: Scrin + Facing: 384 + Location: 47,91 + Actor2595: gunw + Owner: Scrin + Facing: 384 + Location: 52,88 + Actor2596: corr + Owner: Scrin + Facing: 384 + Location: 51,87 + Actor2597: seek + Owner: Scrin + Facing: 384 + Location: 29,102 + Actor2598: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 29,108 + Actor2599: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 30,109 + Actor2600: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 31,103 + Actor2601: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 28,101 + Actor2602: s1 + Owner: Scrin + Facing: 384 + Location: 28,101 + SubCell: 1 + Actor2603: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 26,99 + Actor2604: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 15,90 + Actor2605: s1 + Owner: Scrin + Facing: 384 + Location: 15,90 + SubCell: 1 + Actor2606: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 7,93 + Actor2607: s1 + Owner: Scrin + SubCell: 3 + Location: 7,94 + Facing: 697 + Actor2608: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 5,92 + Actor2609: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 12,95 + Actor2610: s1 + Owner: Scrin + SubCell: 3 + Location: 14,93 + Facing: 793 + Actor2611: tpod + Owner: Scrin + Facing: 384 + Location: 13,91 + Actor2612: tpod + Owner: Scrin + Location: 5,90 + Facing: 816 + Actor2613: gunw + Owner: Scrin + Location: 10,93 + Facing: 769 + Actor2614: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 8,93 + Actor2615: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 15,91 + Actor2616: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 50,90 + Actor2617: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 54,87 + Actor2618: s4 + Owner: Scrin + SubCell: 3 + Location: 60,108 + Facing: 721 + Actor2619: s4 + Owner: Scrin + SubCell: 3 + Location: 58,116 + Facing: 618 + Actor2620: seek + Owner: Scrin + Location: 102,106 + Facing: 531 + Actor2621: corr + Owner: Scrin + Location: 121,94 + Facing: 245 + Actor2622: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 122,95 + Actor2623: s1 + Owner: Scrin + Facing: 384 + Location: 122,95 + SubCell: 1 + Actor2624: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 119,92 + Actor2625: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 123,96 + Actor2626: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 116,97 + Actor2627: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 130,76 + Actor2628: s1 + Owner: Scrin + Facing: 384 + Location: 130,76 + SubCell: 1 + Actor2629: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 127,75 + Actor2630: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 128,70 + Actor2631: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 134,78 + Actor2632: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 136,76 + Actor2633: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 137,57 + Actor2634: s1 + Owner: Scrin + Facing: 384 + Location: 137,57 + SubCell: 1 + Actor2635: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 136,55 + Actor2636: s1 + Owner: Scrin + Facing: 384 + Location: 135,55 + SubCell: 3 + Actor2637: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 134,54 + Actor2638: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 136,52 + Actor2639: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 139,49 + Actor2640: gunw + Owner: Scrin + Facing: 384 + Location: 135,51 + Actor2641: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 141,54 + Actor2642: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 141,52 + Actor2643: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 138,51 + Actor2644: intl + Owner: Scrin + Facing: 384 + Location: 139,57 + Actor2645: ruin + Owner: Scrin + Facing: 384 + Location: 112,39 + Actor2646: ruin + Owner: Scrin + Facing: 384 + Location: 111,37 + Actor2647: gunw + Owner: Scrin + Facing: 384 + Location: 114,32 + Actor2648: gunw + Owner: Scrin + Facing: 384 + Location: 117,34 + Actor2649: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 115,38 + Actor2650: s4 + Owner: Scrin + Facing: 384 + Location: 115,38 + SubCell: 1 + Actor2651: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 111,35 + Actor2652: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 116,37 + Actor2653: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 112,32 + Actor2654: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 85,28 + Actor2655: s1 + Owner: Scrin + Facing: 384 + Location: 85,28 + SubCell: 1 + Actor2656: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 88,27 + Actor2657: s1 + Owner: Scrin + Facing: 384 + Location: 88,26 + SubCell: 3 + Actor2658: s1 + Owner: Scrin + Facing: 384 + Location: 87,26 + SubCell: 3 + Actor2659: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 89,21 + Actor2660: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 83,21 + Actor2661: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 89,25 + Actor2662: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 87,22 + Actor2663: s3 + Owner: Scrin + Facing: 384 + Location: 87,22 + SubCell: 1 + Actor2664: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 83,27 + Actor2665: gunw + Owner: Scrin + Facing: 384 + Location: 85,21 + Actor2666: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 24,61 + Actor2667: s1 + Owner: Scrin + Facing: 384 + Location: 24,61 + SubCell: 1 + Actor2668: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 25,60 + Actor2669: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 27,61 + Actor2670: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 22,66 + Actor2671: corr + Owner: Scrin + Location: 21,64 + Facing: 658 + Actor2672: gunw + Owner: Scrin + Facing: 384 + Location: 27,59 + Actor2673: intl.ai2 + Owner: Scrin + Location: 23,63 + Facing: 602 + Actor2674: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 5,22 + Actor2675: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 8,20 + Actor2676: s1 + Owner: Scrin + Facing: 384 + Location: 8,20 + SubCell: 1 + Actor2677: s1 + Owner: Scrin + Facing: 384 + Location: 9,20 + SubCell: 3 + Actor2678: s1 + Owner: Scrin + Facing: 384 + Location: 10,20 + SubCell: 3 + Actor2679: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 12,21 + Actor2680: s1 + Owner: Scrin + Facing: 384 + Location: 9,19 + SubCell: 3 + Actor2681: s3 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 9,20 + Actor2682: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 9,26 + Actor2683: s4 + Owner: Scrin + SubCell: 3 + Location: 36,126 + Facing: 935 + Actor2684: s4 + Owner: Scrin + Location: 36,126 + SubCell: 1 + Facing: 769 + Actor2685: s4 + Owner: Scrin + SubCell: 3 + Location: 37,122 + Facing: 697 + Actor2686: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 14,88 + Actor2687: s1 + Owner: Scrin + Facing: 384 + Location: 103,105 + SubCell: 3 + Actor2688: s1 + Owner: Scrin + Facing: 384 + Location: 103,105 + SubCell: 1 + Actor2689: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 98,105 + Actor2690: s1 + Owner: Scrin + Facing: 384 + Location: 98,106 + SubCell: 3 + Actor2691: s1 + Owner: Scrin + Facing: 384 + Location: 117,97 + SubCell: 3 + Actor2692: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 137,56 + Actor2693: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 131,36 + Actor2694: s1 + Owner: Scrin + Facing: 384 + Location: 131,36 + SubCell: 1 + Actor2695: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 132,33 + Actor2696: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 132,36 + Actor2697: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 133,37 + Actor2698: s1 + Owner: Scrin + Facing: 384 + Location: 134,38 + SubCell: 3 + Actor2699: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 135,34 + Actor2700: s1 + Owner: Scrin + Facing: 384 + Location: 135,33 + SubCell: 3 + Actor2701: s1 + Owner: Scrin + Facing: 384 + Location: 135,33 + SubCell: 1 + Actor2702: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 134,36 + Actor2703: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 131,35 + Actor2704: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 136,40 + Actor2705: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 132,38 + Actor2706: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 112,33 + Actor2707: s1 + Owner: Scrin + Facing: 384 + Location: 112,33 + SubCell: 1 + Actor2708: s1 + Owner: Scrin + Facing: 384 + Location: 110,37 + SubCell: 3 + Actor2709: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 109,39 + Actor2710: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 110,40 + Actor2711: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 116,33 + Actor2712: pac + Owner: Scrin + Location: 140,39 + Facing: 277 + Actor2713: gunw + Owner: Scrin + Facing: 384 + Location: 139,42 + Actor2714: gunw + Owner: Scrin + Facing: 384 + Location: 138,41 + Actor2715: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 134,16 + Actor2716: s1 + Owner: Scrin + Facing: 384 + Location: 134,16 + SubCell: 1 + Actor2717: s1 + Owner: Scrin + Facing: 384 + Location: 133,16 + SubCell: 3 + Actor2718: s1 + Owner: Scrin + Facing: 384 + Location: 133,16 + SubCell: 1 + Actor2719: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 132,15 + Actor2720: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 123,8 + Actor2721: s1 + Owner: Scrin + Facing: 384 + Location: 123,8 + SubCell: 1 + Actor2722: s1 + Owner: Scrin + Facing: 384 + Location: 122,7 + SubCell: 3 + Actor2723: s1 + Owner: Scrin + Facing: 384 + Location: 122,6 + SubCell: 3 + Actor2724: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 120,6 + Actor2725: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 121,9 + Actor2726: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 138,18 + Actor2727: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 138,19 + Actor2728: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 140,20 + Actor2729: s1 + Owner: Scrin + Facing: 384 + Location: 141,20 + SubCell: 3 + Actor2730: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 139,13 + Actor2731: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 133,4 + Actor2732: s1 + Owner: Scrin + Facing: 384 + Location: 133,4 + SubCell: 1 + Actor2733: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 134,2 + Actor2734: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 135,2 + Actor2735: s1 + Owner: Scrin + SubCell: 3 + Location: 10,109 + Facing: 753 + Actor2736: s1 + Owner: Scrin + Facing: 384 + Location: 10,109 + SubCell: 1 + Actor2737: s1 + Owner: Scrin + Location: 9,110 + SubCell: 3 + Facing: 864 + Actor2739: s1 + Owner: Scrin + SubCell: 3 + Location: 16,114 + Facing: 832 + Actor2740: s1 + Owner: Scrin + Location: 16,114 + SubCell: 1 + Facing: 777 + Actor2738: s1 + Owner: Scrin + SubCell: 3 + Facing: 864 + Location: 8,110 + Actor2741: s1 + Owner: Scrin + SubCell: 3 + Facing: 864 + Location: 12,109 + Actor2742: s1 + Owner: Scrin + SubCell: 3 + Facing: 864 + Location: 14,109 + Actor2743: stcr + Owner: Scrin + Facing: 384 + Location: 49,5 + Actor2744: gunw + Owner: Scrin + Location: 57,6 + Facing: 713 + Actor2745: gunw + Owner: Scrin + Facing: 384 + Location: 49,8 + Actor2746: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 48,7 + Actor2747: s1 + Owner: Scrin + Facing: 384 + Location: 48,7 + SubCell: 1 + Actor2748: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 46,5 + Actor2749: s1 + Owner: Scrin + Facing: 384 + Location: 46,5 + SubCell: 1 + Actor2750: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 51,5 + Actor2751: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 55,11 + Actor2752: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 32,12 + Actor2753: s1 + Owner: Scrin + Facing: 384 + Location: 32,12 + SubCell: 1 + Actor2754: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 31,10 + Actor2755: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 15,45 + Actor2756: s1 + Owner: Scrin + Facing: 384 + Location: 15,45 + SubCell: 1 + Actor2757: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 14,43 + Actor2758: s1 + Owner: Scrin + Facing: 384 + Location: 15,43 + SubCell: 3 + Actor2759: s1 + Owner: Scrin + Facing: 384 + Location: 15,43 + SubCell: 1 + Actor2760: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 12,40 + Actor2761: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 12,38 + Actor2762: s1 + Owner: Scrin + Facing: 384 + Location: 11,37 + SubCell: 3 + Actor2763: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 9,28 + Actor2764: shrw + Owner: Scrin + Location: 55,109 + Facing: 658 + Actor2765: camera + Owner: Scrin + Location: 63,68 + Actor2766: camera + Owner: Scrin + Location: 75,81 + Actor2767: camera + Owner: Scrin + Location: 93,77 + Actor2768: camera + Owner: Scrin + Location: 94,66 + Actor2769: camera + Owner: Scrin + Location: 87,55 + Actor2770: camera + Owner: Scrin + Location: 69,53 + Actor2771: camera + Owner: Scrin + Location: 123,19 + Actor2772: camera + Owner: Scrin + Location: 125,35 + Actor2773: camera + Owner: Scrin + Location: 124,74 + Actor2774: camera + Owner: Scrin + Location: 62,105 + Actor2775: camera + Owner: Scrin + Location: 25,106 + Actor2776: camera + Owner: Scrin + Location: 11,85 + Actor2777: camera + Owner: Scrin + Location: 25,53 + Actor2778: camera + Owner: Scrin + Location: 29,22 + Actor2779: camera + Owner: Scrin + Location: 69,26 + Actor2780: shar + Owner: Scrin + Location: 14,123 + Actor2781: shar + Owner: Scrin + Location: 9,119 + Actor2782: shar + Owner: Scrin + Location: 140,12 + Actor2783: shar + Owner: Scrin + Location: 121,4 + Actor2784: shar + Owner: Scrin + Location: 127,11 + Actor2785: shar + Owner: Scrin + Location: 17,46 + Actor2786: shar + Owner: Scrin + Location: 132,124 + Actor2787: shar + Owner: Scrin + Location: 134,118 + Actor2788: shar + Owner: Scrin + Location: 136,47 + Actor2789: shar + Owner: Scrin + Location: 137,33 + Actor2790: shrw + Owner: Scrin + Facing: 384 + Location: 87,24 + Actor2791: shrw + Owner: Scrin + Facing: 384 + Location: 32,5 + Actor2792: shrw + Owner: Scrin + Facing: 384 + Location: 11,41 + Actor2793: shrw + Owner: Scrin + Facing: 384 + Location: 27,103 + Actor2794: shrw + Owner: Scrin + Facing: 384 + Location: 134,101 + Actor2795: shrw + Owner: Scrin + Facing: 384 + Location: 102,104 + Actor2796: shrw + Owner: Scrin + Facing: 384 + Location: 141,56 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-coalitions.yaml, ca|missions/main-campaign/ca29-mobilization/mobilization-rules.yaml, ca|rules/custom/coop-rules.yaml, mobilization-coop-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/coop-campaign/ca29-mobilization-coop/mobilization-coop-rules.yaml b/mods/ca/missions/coop-campaign/ca29-mobilization-coop/mobilization-coop-rules.yaml new file mode 100644 index 0000000000..cb6a9013ee --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca29-mobilization-coop/mobilization-coop-rules.yaml @@ -0,0 +1,11 @@ +World: + LuaScript: + Scripts: campaign.lua, coop.lua, ca|missions/main-campaign/ca29-mobilization/mobilization.lua, mobilization-coop.lua + ScriptLobbyDropdown@basesharing: + Values: + -0: + Default: 1 + Locked: True + LobbyMissionInfo@InitialObjectives: + Prefix: Initial Objectives + Text: • Protect the Command Center.\n• Destroy all Scrin wormholes. diff --git a/mods/ca/missions/coop-campaign/ca29-mobilization-coop/mobilization-coop.lua b/mods/ca/missions/coop-campaign/ca29-mobilization-coop/mobilization-coop.lua new file mode 100644 index 0000000000..97d44d473b --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca29-mobilization-coop/mobilization-coop.lua @@ -0,0 +1,38 @@ + +SetupPlayers = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Multi2 = Player.GetPlayer("Multi2") + Multi3 = Player.GetPlayer("Multi3") + Multi4 = Player.GetPlayer("Multi4") + Multi5 = Player.GetPlayer("Multi5") + GDI = Player.GetPlayer("GDI") + Scrin = Player.GetPlayer("Scrin") + Nod = Player.GetPlayer("Nod") + USSR = Player.GetPlayer("USSR") + Greece = Player.GetPlayer("Greece") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = Utils.Where({ Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 }, function(p) return p ~= nil end) + MissionEnemies = { Scrin } + SinglePlayerPlayer = GDI + CoopInit() +end + +AfterWorldLoaded = function() + TransferBaseToPlayer(SinglePlayerPlayer, GetFirstActivePlayer()) + StartCashSpread(3500) +end + +AfterTick = function() + +end + +DoMcvArrival = function(path) + local delay = 25 + Utils.Do(GetMcvPlayers(), function(p) + Trigger.AfterDelay(delay, function() + Reinforcements.Reinforce(p, { "amcv" }, path) + end) + delay = delay + DateTime.Seconds(1) + end) +end diff --git a/mods/ca/missions/coop-campaign/ca30-singularity-coop/map.bin b/mods/ca/missions/coop-campaign/ca30-singularity-coop/map.bin new file mode 100644 index 0000000000..60c789f14e Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca30-singularity-coop/map.bin differ diff --git a/mods/ca/missions/coop-campaign/ca30-singularity-coop/map.png b/mods/ca/missions/coop-campaign/ca30-singularity-coop/map.png new file mode 100644 index 0000000000..a2ded41595 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca30-singularity-coop/map.png differ diff --git a/mods/ca/missions/coop-campaign/ca30-singularity-coop/map.yaml b/mods/ca/missions/coop-campaign/ca30-singularity-coop/map.yaml new file mode 100644 index 0000000000..e0cc73e92c --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca30-singularity-coop/map.yaml @@ -0,0 +1,5444 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 30: Singularity Co-op + +Author: Darkademic & Gandorques Hikla + +Tileset: TEMPERAT + +MapSize: 134,134 + +Bounds: 1,1,132,132 + +Visibility: Lobby + +Categories: Co-op Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: GDI, Scrin, Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + PlayerReference@GDI: + Name: GDI + Faction: gdi + Color: F2CF74 + Allies: Greece, Nod, USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, NodSlaves, SovietSlaves, AlliedSlaves, CyborgSlaves, Creeps, Kane + PlayerReference@Greece: + Name: Greece + Bot: campaign + Faction: allies + Color: 99ACF2 + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, USSR, Nod + Enemies: Scrin, NodSlaves, SovietSlaves, AlliedSlaves, Creeps, Kane + PlayerReference@USSR: + Name: USSR + Bot: campaign + Faction: soviet + Color: FE1100 + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Greece, Nod + Enemies: Scrin, NodSlaves, SovietSlaves, AlliedSlaves, Creeps, Kane + PlayerReference@Nod: + Name: Nod + Bot: campaign + Faction: nod + Color: FE1100 + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Greece, USSR + Enemies: Scrin, NodSlaves, SovietSlaves, AlliedSlaves, Creeps + PlayerReference@Scrin: + Name: Scrin + Bot: campaign + Faction: scrin + Color: 7700FF + Allies: NodSlaves, SovietSlaves, AlliedSlaves, CyborgSlaves + Enemies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Greece, USSR, Nod, Creeps, Kane + PlayerReference@NodSlaves: + Name: NodSlaves + Bot: campaign + Faction: nod + Color: D500E8 + Allies: Scrin, SovietSlaves, AlliedSlaves, CyborgSlaves + Enemies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Greece, USSR, Nod, Creeps + PlayerReference@SovietSlaves: + Name: SovietSlaves + Bot: campaign + Faction: soviet + Color: D500E8 + Allies: Scrin, AlliedSlaves, NodSlaves, CyborgSlaves + Enemies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Greece, USSR, Nod, Creeps, Kane + PlayerReference@AlliedSlaves: + Name: AlliedSlaves + Bot: campaign + Faction: allies + Color: D500E8 + Allies: Scrin, NodSlaves, SovietSlaves, CyborgSlaves + Enemies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Greece, USSR, Nod, Creeps, Kane + PlayerReference@CyborgSlaves: + Name: CyborgSlaves + Bot: campaign + Faction: nod + Color: D500E8 + Allies: Scrin, SovietSlaves, AlliedSlaves, NodSlaves + Enemies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Greece, USSR, Creeps + PlayerReference@Kane: + Name: Kane + Bot: campaign + Faction: nod + Color: FE1100 + Enemies: Scrin, GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, USSR, Greece, AlliedSlaves, SovietSlaves + PlayerReference@SignalTransmitterPlayer: + Name: SignalTransmitterPlayer + Bot: campaign + Faction: scrin + Color: 7700FF + Enemies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + PlayerReference@NeutralGDI: + Name: NeutralGDI + Bot: campaign + NonCombatant: True + Faction: gdi + Color: F2CF74 + PlayerReference@NeutralScrin: + Name: NeutralScrin + Bot: campaign + NonCombatant: True + Faction: scrin + Color: 7700FF + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: F2CF74 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Greece, Nod, USSR + Enemies: Scrin, NodSlaves, SovietSlaves, AlliedSlaves, CyborgSlaves, Creeps, Kane + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: EA7816 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Greece, Nod, USSR + Enemies: Scrin, NodSlaves, SovietSlaves, AlliedSlaves, CyborgSlaves, Creeps, Kane + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: 0B7310 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Greece, Nod, USSR + Enemies: Scrin, NodSlaves, SovietSlaves, AlliedSlaves, CyborgSlaves, Creeps, Kane + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: 0077D6 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Greece, Nod, USSR + Enemies: Scrin, NodSlaves, SovietSlaves, AlliedSlaves, CyborgSlaves, Creeps, Kane + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: 82C900 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Greece, Nod, USSR + Enemies: Scrin, NodSlaves, SovietSlaves, AlliedSlaves, CyborgSlaves, Creeps, Kane + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: 775A12 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Greece, Nod, USSR + Enemies: Scrin, NodSlaves, SovietSlaves, AlliedSlaves, CyborgSlaves, Creeps, Kane + +Actors: + Actor3: shar + Owner: Scrin + Location: 57,7 + Actor4: scol + Owner: Scrin + Location: 66,7 + Actor5: shar + Owner: Scrin + Location: 68,7 + Actor6: scol + Owner: Scrin + Location: 54,8 + Actor7: shar + Owner: Scrin + Location: 77,8 + Actor8: shar + Owner: Scrin + Location: 50,9 + Actor11: silo.scrinblue + Owner: Scrin + Location: 67,10 + Actor12: rea2 + Owner: Scrin + Location: 51,11 + Actor13: silo.scrin + Owner: Scrin + Location: 55,11 + Actor14: silo.scrin + Owner: Scrin + Location: 58,11 + Actor15: silo.scrin + Owner: Scrin + Location: 61,11 + Actor21: silo.scrinblue + Owner: Scrin + Location: 74,12 + Actor22: silo.scrinblue + Owner: Scrin + Location: 76,12 + Actor23: scol + Owner: Scrin + Location: 81,12 + Actor24: silo.scrin + Owner: Scrin + Location: 55,13 + Actor25: rea2 + Owner: Scrin + Location: 57,13 + Actor26: rea2 + Owner: Scrin + Location: 60,13 + Actor28: silo.scrinblue + Owner: Scrin + Location: 75,13 + Actor29: shar + Owner: Scrin + Location: 45,14 + Actor30: silo.scrin + Owner: Scrin + Location: 54,14 + Actor31: rea2 + Owner: Scrin + Location: 73,14 + Actor32: silo.scrinblue + Owner: Scrin + Location: 77,14 + Actor33: shar + Owner: Scrin + Location: 84,14 + Actor34: rea2 + Owner: Scrin + Location: 47,15 + Actor35: silo.scrin + Owner: Scrin + Location: 53,15 + Actor36: silo.scrin + Owner: Scrin + Location: 55,15 + Actor37: swal + Owner: Scrin + Location: 63,15 + Actor38: swal + Owner: Scrin + Location: 64,15 + Actor39: swal + Owner: Scrin + Location: 65,15 + Actor40: swal + Owner: Scrin + Location: 66,15 + Actor41: swal + Owner: Scrin + Location: 67,15 + Actor42: swal + Owner: Scrin + Location: 68,15 + Actor43: silo.scrinblue + Owner: Scrin + Location: 78,15 + Actor44: silo.scrinblue + Owner: Scrin + Location: 80,15 + Actor45: rea2 + Owner: Scrin + Location: 82,15 + Actor46: splitblue + Owner: Neutral + Location: 38,16 + Actor47: silo.scrin + Owner: Scrin + Location: 51,16 + Actor48: swal + Owner: Scrin + Location: 58,16 + Actor49: swal + Owner: Scrin + Location: 59,16 + Actor50: swal + Owner: Scrin + Location: 60,16 + Actor51: swal + Owner: Scrin + Location: 61,16 + Actor52: swal + Owner: Scrin + Location: 62,16 + Actor53: swal + Owner: Scrin + Location: 63,16 + Actor54: swal + Owner: Scrin + Location: 68,16 + Actor55: swal + Owner: Scrin + Location: 69,16 + Actor56: swal + Owner: Scrin + Location: 70,16 + Actor57: swal + Owner: Scrin + Location: 71,16 + Actor58: swal + Owner: Scrin + Location: 72,16 + Actor59: silo.scrinblue + Owner: Scrin + Location: 77,16 + Actor60: scol + Owner: Scrin + Location: 44,17 + Actor61: rea2 + Owner: Scrin + Location: 53,17 + Actor62: swal + Owner: Scrin + Location: 58,17 + Actor63: swal + Owner: Scrin + Location: 72,17 + Actor64: swal + Owner: Scrin + Location: 73,17 + Actor65: swal + Owner: Scrin + Location: 74,17 + Actor66: swal + Owner: Scrin + Location: 75,17 + Actor67: silo.scrinblue + Owner: Scrin + Location: 80,17 + Actor68: silo.scrin + Owner: Scrin + Location: 50,18 + Actor69: swal + Owner: Scrin + Location: 56,18 + Actor70: swal + Owner: Scrin + Location: 57,18 + Actor71: swal + Owner: Scrin + Location: 58,18 + Actor72: swal + Owner: Scrin + Location: 75,18 + Actor73: rea2 + Owner: Scrin + Location: 77,18 + Actor74: splitblue + Owner: Neutral + Location: 33,19 + Actor75: silo.scrin + Owner: Scrin + Location: 49,19 + Actor76: silo.scrin + Owner: Scrin + Location: 51,19 + Actor77: swal + Owner: Scrin + Location: 56,19 + Actor78: swal + Owner: Scrin + Location: 75,19 + Actor79: swal + Owner: Scrin + Location: 76,19 + Actor80: silo.scrinblue + Owner: Scrin + Location: 81,19 + Actor81: silo.scrinblue + Owner: Scrin + Location: 83,19 + Actor82: shar + Owner: Scrin + Location: 40,20 + Actor83: silo.scrin + Owner: Scrin + Location: 48,20 + Actor84: silo.scrin + Owner: Scrin + Location: 50,20 + Actor85: swal + Owner: Scrin + Location: 55,20 + Actor86: swal + Owner: Scrin + Location: 56,20 + Actor87: swal + Owner: Scrin + Location: 76,20 + Actor88: silo.scrinblue + Owner: Scrin + Location: 82,20 + Actor89: rea2 + Owner: Scrin + Location: 85,20 + Actor90: shar + Owner: Scrin + Location: 89,20 + Actor91: silo.scrin + Owner: Scrin + Location: 46,21 + Actor92: rea2 + Owner: Scrin + Location: 52,21 + Actor93: swal + Owner: Scrin + Location: 55,21 + Actor94: swal + Owner: Scrin + Location: 62,21 + Actor95: swal + Owner: Scrin + Location: 63,21 + Actor96: scol + Owner: Scrin + Location: 64,21 + Actor97: scol + Owner: Scrin + Location: 68,21 + Actor98: swal + Owner: Scrin + Location: 69,21 + Actor99: swal + Owner: Scrin + Location: 70,21 + Actor100: swal + Owner: Scrin + Location: 76,21 + Actor101: swal + Owner: Scrin + Location: 77,21 + Actor102: swal + Owner: Scrin + Location: 78,21 + Actor103: silo.scrinblue + Owner: Scrin + Location: 82,21 + Actor104: proc.scrin + Owner: Scrin + Location: 41,22 + Actor105: rea2 + Owner: Scrin + Location: 48,22 + Actor106: swal + Owner: Scrin + Location: 55,22 + Actor107: swal + Owner: Scrin + Location: 61,22 + Actor108: swal + Owner: Scrin + Location: 62,22 + Actor109: swal + Owner: Scrin + Location: 63,22 + Actor110: swal + Owner: Scrin + Location: 64,22 + Actor111: swal + Owner: Scrin + Location: 65,22 + Actor112: swal + Owner: Scrin + Location: 66,22 + Actor113: swal + Owner: Scrin + Location: 67,22 + Actor114: swal + Owner: Scrin + Location: 68,22 + Actor115: swal + Owner: Scrin + Location: 69,22 + Actor116: swal + Owner: Scrin + Location: 70,22 + Actor117: swal + Owner: Scrin + Location: 71,22 + Actor118: swal + Owner: Scrin + Location: 78,22 + Actor119: rea2 + Owner: Scrin + Location: 79,22 + Actor120: silo.scrinblue + Owner: Scrin + Location: 83,22 + Actor121: splitblue + Owner: Neutral + Location: 95,22 + Actor122: silo.scrin + Owner: Scrin + Location: 46,23 + Actor123: swal + Owner: Scrin + Location: 55,23 + Actor124: swal + Owner: Scrin + Location: 60,23 + Actor125: swal + Owner: Scrin + Location: 61,23 + Actor126: swal + Owner: Scrin + Location: 62,23 + Actor127: shar + Owner: Scrin + Location: 63,23 + Actor128: shar + Owner: Scrin + Location: 69,23 + Actor129: swal + Owner: Scrin + Location: 70,23 + Actor130: swal + Owner: Scrin + Location: 71,23 + Actor131: swal + Owner: Scrin + Location: 72,23 + Actor132: swal + Owner: Scrin + Location: 78,23 + Actor133: splitblue + Owner: Neutral + Location: 33,24 + Actor134: silo.scrin + Owner: Scrin + Location: 45,24 + Actor135: swal + Owner: Scrin + Location: 55,24 + Actor136: swal + Owner: Scrin + Location: 60,24 + Actor137: swal + Owner: Scrin + Location: 61,24 + Actor138: shar + Owner: Scrin + Location: 62,24 + TurretFacing: 317 + Actor139: shar + Owner: Scrin + Location: 70,24 + TurretFacing: 761 + Actor140: swal + Owner: Scrin + Location: 71,24 + Actor141: swal + Owner: Scrin + Location: 72,24 + Actor142: swal + Owner: Scrin + Location: 78,24 + Actor143: silo.scrinblue + Owner: Scrin + Location: 83,24 + Actor144: silo.scrinblue + Owner: Scrin + Location: 85,24 + Actor145: scol + Owner: Scrin + Location: 90,24 + Actor146: silo.scrin + Owner: Scrin + Location: 46,25 + Actor147: swal + Owner: Scrin + Location: 55,25 + Actor148: scol + Owner: Scrin + Location: 60,25 + Actor149: swal + Owner: Scrin + Location: 61,25 + Actor150: swal + Owner: Scrin + Location: 71,25 + Actor151: scol + Owner: Scrin + Location: 72,25 + Actor152: tplr + Owner: CyborgSlaves + SubCell: 1 + Facing: 512 + Location: 74,25 + Actor153: tplr + Owner: CyborgSlaves + SubCell: 2 + Facing: 512 + Location: 74,25 + Actor154: tplr + Owner: CyborgSlaves + SubCell: 4 + Facing: 512 + Location: 74,25 + Actor155: tplr + Owner: CyborgSlaves + SubCell: 5 + Facing: 512 + Location: 74,25 + Actor156: swal + Owner: Scrin + Location: 78,25 + Actor157: rea2 + Owner: Scrin + Location: 79,25 + Actor158: swal + Owner: Scrin + Location: 50,26 + Actor159: swal + Owner: Scrin + Location: 51,26 + Actor160: swal + Owner: Scrin + Location: 52,26 + Actor161: shar + Owner: Scrin + Location: 53,26 + Actor162: swal + Owner: Scrin + Location: 54,26 + Actor163: swal + Owner: Scrin + Location: 55,26 + Actor164: tplr + Owner: CyborgSlaves + SubCell: 1 + Facing: 512 + Location: 58,26 + Actor165: tplr + Owner: CyborgSlaves + SubCell: 2 + Facing: 512 + Location: 58,26 + Actor166: tplr + Owner: CyborgSlaves + SubCell: 4 + Facing: 512 + Location: 58,26 + Actor167: tplr + Owner: CyborgSlaves + SubCell: 5 + Facing: 512 + Location: 58,26 + Actor168: swal + Owner: Scrin + Location: 61,26 + Mothership: mshp + Owner: Scrin + Location: 66,26 + Facing: 384 + Actor170: swal + Owner: Scrin + Location: 71,26 + Actor171: swal + Owner: Scrin + Location: 77,26 + Actor172: swal + Owner: Scrin + Location: 78,26 + Actor173: silo.scrinblue + Owner: Scrin + Location: 84,26 + Actor175: swal + Owner: Scrin + Location: 50,27 + Actor176: swal + Owner: Scrin + Location: 51,27 + Actor177: swal + Owner: Scrin + Location: 52,27 + Actor178: swal + Owner: Scrin + Location: 53,27 + Actor179: swal + Owner: Scrin + Location: 54,27 + Actor180: swal + Owner: Scrin + Location: 55,27 + Actor181: swal + Owner: Scrin + Location: 61,27 + Wormhole: wormhole + Owner: Scrin + Location: 66,27 + Actor183: swal + Owner: Scrin + Location: 71,27 + Actor184: swal + Owner: Scrin + Location: 77,27 + Actor185: swal + Owner: Scrin + Location: 78,27 + Actor186: scol + Owner: Scrin + Location: 50,28 + Actor187: swal + Owner: Scrin + Location: 51,28 + RiftGenerator: rfgn + Owner: Scrin + Location: 52,28 + Actor189: swal + Owner: Scrin + Location: 54,28 + Actor190: swal + Owner: Scrin + Location: 55,28 + Actor191: swal + Owner: Scrin + Location: 61,28 + Actor192: swal + Owner: Scrin + Location: 71,28 + Actor193: enli + Owner: CyborgSlaves + SubCell: 1 + Facing: 512 + Location: 74,28 + Actor194: enli + Owner: CyborgSlaves + SubCell: 4 + Facing: 512 + Location: 74,28 + Actor195: enli + Owner: CyborgSlaves + SubCell: 2 + Facing: 512 + Location: 74,28 + Actor196: enli + Owner: CyborgSlaves + SubCell: 5 + Facing: 512 + Location: 74,28 + Actor197: swal + Owner: Scrin + Location: 78,28 + Actor198: shar + Owner: Scrin + Location: 89,28 + TurretFacing: 642 + Actor199: scol + Owner: Scrin + Location: 38,29 + Actor200: scol + Owner: Scrin + Location: 50,29 + Actor201: swal + Owner: Scrin + Location: 51,29 + Actor202: swal + Owner: Scrin + Location: 54,29 + Actor203: swal + Owner: Scrin + Location: 55,29 + Actor204: scol + Owner: Scrin + Location: 60,29 + Actor205: swal + Owner: Scrin + Location: 61,29 + Actor206: swal + Owner: Scrin + Location: 71,29 + Actor207: scol + Owner: Scrin + Location: 72,29 + Actor208: swal + Owner: Scrin + Location: 78,29 + Actor209: reac + Owner: Scrin + Location: 82,29 + Actor210: proc.scrin + Owner: Scrin + Location: 86,29 + Actor211: swal + Owner: Scrin + Location: 50,30 + Actor212: swal + Owner: Scrin + Location: 51,30 + Actor213: swal + Owner: Scrin + Location: 52,30 + Actor214: swal + Owner: Scrin + Location: 53,30 + Actor215: swal + Owner: Scrin + Location: 54,30 + Actor216: swal + Owner: Scrin + Location: 55,30 + Actor217: enli + Owner: CyborgSlaves + SubCell: 1 + Facing: 512 + Location: 58,30 + Actor218: enli + Owner: CyborgSlaves + SubCell: 4 + Facing: 512 + Location: 58,30 + Actor219: enli + Owner: CyborgSlaves + SubCell: 2 + Facing: 512 + Location: 58,30 + Actor220: enli + Owner: CyborgSlaves + SubCell: 5 + Facing: 512 + Location: 58,30 + Actor221: swal + Owner: Scrin + Location: 60,30 + Actor222: swal + Owner: Scrin + Location: 61,30 + Actor223: shar + Owner: Scrin + Location: 62,30 + Actor224: shar + Owner: Scrin + Location: 70,30 + TurretFacing: 713 + Actor225: swal + Owner: Scrin + Location: 71,30 + Actor226: swal + Owner: Scrin + Location: 72,30 + Actor227: swal + Owner: Scrin + Location: 78,30 + Actor228: mani + Owner: Scrin + Location: 79,30 + Actor229: splitblue + Owner: Neutral + Location: 96,30 + Actor230: ptur + Owner: Scrin + Location: 36,31 + TurretFacing: 277 + Actor231: scol + Owner: Scrin + Location: 38,31 + Actor232: swal + Owner: Scrin + Location: 50,31 + Actor233: swal + Owner: Scrin + Location: 51,31 + Actor234: swal + Owner: Scrin + Location: 52,31 + Actor235: shar + Owner: Scrin + Location: 53,31 + Actor236: swal + Owner: Scrin + Location: 54,31 + Actor237: swal + Owner: Scrin + Location: 55,31 + Actor238: swal + Owner: Scrin + Location: 60,31 + Actor239: swal + Owner: Scrin + Location: 61,31 + Actor240: swal + Owner: Scrin + Location: 62,31 + Actor241: shar + Owner: Scrin + Location: 63,31 + TurretFacing: 412 + Actor242: rmbc + Owner: CyborgSlaves + SubCell: 1 + Facing: 512 + Location: 65,31 + Actor243: rmbc + Owner: CyborgSlaves + SubCell: 4 + Facing: 512 + Location: 65,31 + Actor244: rmbc + Owner: CyborgSlaves + SubCell: 2 + Facing: 512 + Location: 65,31 + Actor245: rmbc + Owner: CyborgSlaves + SubCell: 5 + Facing: 512 + Location: 65,31 + Actor246: rmbc + Owner: CyborgSlaves + SubCell: 1 + Facing: 512 + Location: 67,31 + Actor247: rmbc + Owner: CyborgSlaves + SubCell: 4 + Facing: 512 + Location: 67,31 + Actor248: rmbc + Owner: CyborgSlaves + SubCell: 2 + Facing: 512 + Location: 67,31 + Actor249: rmbc + Owner: CyborgSlaves + SubCell: 5 + Facing: 512 + Location: 67,31 + Actor250: shar + Owner: Scrin + Location: 69,31 + TurretFacing: 547 + Actor251: swal + Owner: Scrin + Location: 70,31 + Actor252: swal + Owner: Scrin + Location: 71,31 + Actor253: swal + Owner: Scrin + Location: 72,31 + Actor254: swal + Owner: Scrin + Location: 78,31 + Actor255: swal + Owner: Scrin + Location: 42,32 + Actor256: swal + Owner: Scrin + Location: 43,32 + Actor257: swal + Owner: Scrin + Location: 44,32 + Actor258: swal + Owner: Scrin + Location: 55,32 + Actor259: swal + Owner: Scrin + Location: 61,32 + Actor260: swal + Owner: Scrin + Location: 62,32 + Actor261: swal + Owner: Scrin + Location: 63,32 + Actor262: swal + Owner: Scrin + Location: 64,32 + Actor263: swal + Owner: Scrin + Location: 65,32 + Actor264: swal + Owner: Scrin + Location: 67,32 + Actor265: swal + Owner: Scrin + Location: 68,32 + Actor266: swal + Owner: Scrin + Location: 69,32 + Actor267: swal + Owner: Scrin + Location: 70,32 + Actor268: swal + Owner: Scrin + Location: 71,32 + Actor269: swal + Owner: Scrin + Location: 77,32 + Actor270: swal + Owner: Scrin + Location: 78,32 + Actor271: scol + Owner: Scrin + Location: 90,32 + Actor272: swal + Owner: Scrin + Location: 42,33 + Actor273: scol + Owner: Scrin + Location: 43,33 + Actor274: swal + Owner: Scrin + Location: 44,33 + Actor276: swal + Owner: Scrin + Location: 55,33 + Actor277: swal + Owner: Scrin + Location: 62,33 + Actor278: swal + Owner: Scrin + Location: 63,33 + Actor279: scol + Owner: Scrin + Location: 64,33 + Actor280: swal + Owner: Scrin + Location: 65,33 + Actor281: swal + Owner: Scrin + Location: 67,33 + Actor282: scol + Owner: Scrin + Location: 68,33 + Actor283: swal + Owner: Scrin + Location: 69,33 + Actor284: swal + Owner: Scrin + Location: 70,33 + Actor285: rmbc + Owner: CyborgSlaves + SubCell: 1 + Facing: 512 + Location: 74,33 + Actor286: rmbc + Owner: CyborgSlaves + SubCell: 4 + Facing: 512 + Location: 74,33 + Actor287: rmbc + Owner: CyborgSlaves + SubCell: 2 + Facing: 512 + Location: 74,33 + Actor288: rmbc + Owner: CyborgSlaves + SubCell: 5 + Facing: 512 + Location: 74,33 + Actor289: swal + Owner: Scrin + Location: 77,33 + Actor290: swal + Owner: Scrin + Location: 42,34 + Actor291: swal + Owner: Scrin + Location: 43,34 + Actor292: swal + Owner: Scrin + Location: 44,34 + Actor294: swal + Owner: Scrin + Location: 55,34 + Actor295: rmbc + Owner: CyborgSlaves + SubCell: 1 + Facing: 512 + Location: 59,34 + Actor296: rmbc + Owner: CyborgSlaves + SubCell: 4 + Facing: 512 + Location: 59,34 + Actor297: rmbc + Owner: CyborgSlaves + SubCell: 2 + Facing: 512 + Location: 59,34 + Actor298: rmbc + Owner: CyborgSlaves + SubCell: 5 + Facing: 512 + Location: 59,34 + Actor299: swal + Owner: Scrin + Location: 65,34 + Actor300: swal + Owner: Scrin + Location: 67,34 + Actor301: swal + Owner: Scrin + Location: 77,34 + Actor302: scol + Owner: Scrin + Location: 90,34 + Actor303: swal + Owner: Scrin + Location: 42,35 + Actor304: scol + Owner: Scrin + Location: 43,35 + Actor305: swal + Owner: Scrin + Location: 44,35 + Actor306: swal + Owner: Scrin + Location: 55,35 + Actor307: swal + Owner: Scrin + Location: 56,35 + Actor308: swal + Owner: Scrin + Location: 64,35 + Actor309: swal + Owner: Scrin + Location: 65,35 + Actor310: swal + Owner: Scrin + Location: 67,35 + Actor311: swal + Owner: Scrin + Location: 68,35 + Actor312: enli + Owner: CyborgSlaves + SubCell: 1 + Facing: 512 + Location: 70,35 + Actor313: enli + Owner: CyborgSlaves + SubCell: 4 + Facing: 512 + Location: 70,35 + Actor314: enli + Owner: CyborgSlaves + SubCell: 2 + Facing: 512 + Location: 70,35 + Actor315: enli + Owner: CyborgSlaves + SubCell: 5 + Facing: 512 + Location: 70,35 + Actor316: swal + Owner: Scrin + Location: 76,35 + Actor317: swal + Owner: Scrin + Location: 77,35 + Actor319: swal + Owner: Scrin + Location: 42,36 + Actor320: swal + Owner: Scrin + Location: 43,36 + Actor321: swal + Owner: Scrin + Location: 44,36 + Actor322: swal + Owner: Scrin + Location: 56,36 + Actor323: enli + Owner: CyborgSlaves + SubCell: 1 + Facing: 512 + Location: 61,36 + Actor324: enli + Owner: CyborgSlaves + SubCell: 4 + Facing: 512 + Location: 61,36 + Actor325: enli + Owner: CyborgSlaves + SubCell: 2 + Facing: 512 + Location: 61,36 + Actor326: enli + Owner: CyborgSlaves + SubCell: 5 + Facing: 512 + Location: 61,36 + Actor327: swal + Owner: Scrin + Location: 64,36 + Actor328: swal + Owner: Scrin + Location: 65,36 + Actor329: swal + Owner: Scrin + Location: 67,36 + Actor330: swal + Owner: Scrin + Location: 68,36 + Actor331: swal + Owner: Scrin + Location: 74,36 + Actor332: swal + Owner: Scrin + Location: 75,36 + SignalTransmitter: sign + Owner: SignalTransmitterPlayer + Location: 75,36 + Actor334: swal + Owner: Scrin + Location: 76,36 + Actor335: swal + Owner: Scrin + Location: 86,36 + Actor336: swal + Owner: Scrin + Location: 87,36 + Actor337: swal + Owner: Scrin + Location: 88,36 + Actor338: ptur + Owner: Scrin + Location: 93,36 + TurretFacing: 658 + Actor339: ptur + Owner: Scrin + Location: 36,37 + TurretFacing: 388 + Actor340: scol + Owner: Scrin + Location: 38,37 + Actor341: swal + Owner: Scrin + Location: 56,37 + Actor342: swal + Owner: Scrin + Location: 57,37 + Actor343: swal + Owner: Scrin + Location: 58,37 + Actor344: ptur + Owner: Scrin + Location: 64,37 + TurretFacing: 428 + Actor345: ptur + Owner: Scrin + Location: 68,37 + TurretFacing: 594 + Actor346: swal + Owner: Scrin + Location: 74,37 + Actor347: swal + Owner: Scrin + Location: 86,37 + Actor348: scol + Owner: Scrin + Location: 87,37 + Actor349: swal + Owner: Scrin + Location: 88,37 + Actor350: scrt + Owner: Scrin + Location: 56,38 + Actor351: swal + Owner: Scrin + Location: 58,38 + Actor352: swal + Owner: Scrin + Location: 74,38 + Actor353: swal + Owner: Scrin + Location: 86,38 + Actor354: swal + Owner: Scrin + Location: 87,38 + Actor355: swal + Owner: Scrin + Location: 88,38 + Actor356: scol + Owner: Scrin + Location: 38,39 + Actor358: swal + Owner: Scrin + Location: 58,39 + Actor367: swal + Owner: Scrin + Location: 74,39 + Actor368: swal + Owner: Scrin + Location: 75,39 + Actor369: swal + Owner: Scrin + Location: 86,39 + Actor370: scol + Owner: Scrin + Location: 87,39 + Actor371: swal + Owner: Scrin + Location: 88,39 + Actor372: swal + Owner: Scrin + Location: 58,40 + Actor381: swal + Owner: Scrin + Location: 74,40 + Actor382: swal + Owner: Scrin + Location: 75,40 + Actor384: swal + Owner: Scrin + Location: 86,40 + Actor385: swal + Owner: Scrin + Location: 87,40 + Actor386: swal + Owner: Scrin + Location: 88,40 + Actor387: ptur + Owner: Scrin + Location: 93,40 + TurretFacing: 721 + Actor388: swal + Owner: Scrin + Location: 58,41 + Actor389: swal + Owner: Scrin + Location: 59,41 + Actor390: sfac + Owner: Scrin + Location: 66,41 + Actor391: scol + Owner: Scrin + Location: 90,41 + Actor392: shar + Owner: Scrin + Location: 41,42 + Actor393: swal + Owner: Scrin + Location: 58,42 + Actor394: swal + Owner: Scrin + Location: 59,42 + Actor395: grav + Owner: Scrin + Location: 73,42 + Actor397: scol + Owner: Scrin + Location: 45,43 + Actor399: scol + Owner: Scrin + Location: 90,43 + Actor402: shar + Owner: Scrin + Location: 46,46 + Actor403: nerv + Owner: Scrin + Location: 68,46 + Actor406: shar + Owner: Scrin + Location: 89,47 + TurretFacing: 404 + Actor407: scol + Owner: Scrin + Location: 81,50 + Actor408: swal + Owner: Scrin + Location: 65,51 + Actor409: swal + Owner: Scrin + Location: 66,51 + Actor410: swal + Owner: Scrin + Location: 67,51 + Actor411: swal + Owner: Scrin + Location: 68,51 + Actor412: swal + Owner: Scrin + Location: 69,51 + Actor413: shar + Owner: Scrin + Location: 85,51 + TurretFacing: 507 + Actor414: shar + Owner: Scrin + Location: 49,52 + Actor415: swal + Owner: Scrin + Location: 65,52 + Actor416: scol + Owner: Scrin + Location: 66,52 + Actor417: swal + Owner: Scrin + Location: 67,52 + Actor418: scol + Owner: Scrin + Location: 68,52 + Actor419: swal + Owner: Scrin + Location: 69,52 + Actor420: scol + Owner: Scrin + Location: 53,53 + Actor421: shar + Owner: Scrin + Location: 57,53 + TurretFacing: 333 + Actor422: swal + Owner: Scrin + Location: 65,53 + Actor423: swal + Owner: Scrin + Location: 66,53 + Actor424: swal + Owner: Scrin + Location: 67,53 + Actor425: swal + Owner: Scrin + Location: 68,53 + Actor426: swal + Owner: Scrin + Location: 69,53 + Actor427: shar + Owner: Scrin + Location: 76,53 + Actor428: scol + Owner: Scrin + Location: 62,56 + Actor429: scol + Owner: Scrin + Location: 64,56 + Actor430: scol + Owner: Scrin + Location: 70,56 + Actor431: scol + Owner: Scrin + Location: 72,56 + Actor432: ptur + Owner: Scrin + Location: 65,58 + TurretFacing: 555 + Actor433: ptur + Owner: Scrin + Location: 69,58 + TurretFacing: 602 + Actor436: brik + Owner: AlliedSlaves + Location: 81,93 + Actor437: brik + Owner: AlliedSlaves + Location: 79,93 + Actor439: brik + Owner: AlliedSlaves + Location: 80,93 + Actor440: brik + Owner: AlliedSlaves + Location: 79,94 + Actor441: brik + Owner: AlliedSlaves + Location: 78,94 + Actor443: brik + Owner: AlliedSlaves + Location: 82,93 + Actor444: brik + Owner: AlliedSlaves + Location: 82,92 + Actor445: brik + Owner: AlliedSlaves + Location: 83,92 + Actor446: brik + Owner: AlliedSlaves + Location: 83,91 + Actor447: brik + Owner: AlliedSlaves + Location: 83,90 + Actor448: brik + Owner: AlliedSlaves + Location: 83,89 + Actor449: brik + Owner: AlliedSlaves + Location: 83,88 + Actor450: brik + Owner: AlliedSlaves + Location: 84,88 + Actor451: brik + Owner: AlliedSlaves + Location: 84,87 + Actor452: brik + Owner: AlliedSlaves + Location: 84,86 + Actor453: brik + Owner: AlliedSlaves + Location: 84,85 + Actor454: brik + Owner: AlliedSlaves + Location: 84,84 + Actor455: brik + Owner: AlliedSlaves + Location: 84,83 + Actor456: brik + Owner: AlliedSlaves + Location: 84,82 + Actor457: brik + Owner: AlliedSlaves + Location: 84,80 + Actor458: brik + Owner: AlliedSlaves + Location: 84,81 + Actor459: brik + Owner: AlliedSlaves + Location: 84,79 + Actor460: brik + Owner: AlliedSlaves + Location: 83,79 + Actor461: brik + Owner: AlliedSlaves + Location: 82,79 + Actor462: brik + Owner: AlliedSlaves + Location: 80,79 + Actor463: brik + Owner: AlliedSlaves + Location: 81,79 + Actor464: brik + Owner: AlliedSlaves + Location: 79,79 + Actor465: brik + Owner: AlliedSlaves + Location: 78,79 + Actor466: brik + Owner: AlliedSlaves + Location: 77,79 + Actor467: brik + Owner: AlliedSlaves + Location: 76,79 + Actor468: brik + Owner: AlliedSlaves + Location: 76,80 + Actor469: brik + Owner: AlliedSlaves + Location: 77,80 + Actor470: brik + Owner: AlliedSlaves + Location: 72,79 + Actor471: brik + Owner: AlliedSlaves + Location: 72,80 + Actor472: brik + Owner: AlliedSlaves + Location: 71,79 + Actor473: brik + Owner: AlliedSlaves + Location: 71,80 + Actor474: brik + Owner: AlliedSlaves + Location: 70,79 + Actor475: brik + Owner: AlliedSlaves + Location: 69,79 + Actor476: brik + Owner: AlliedSlaves + Location: 68,79 + Actor477: brik + Owner: AlliedSlaves + Location: 66,79 + Actor478: brik + Owner: AlliedSlaves + Location: 67,79 + Actor479: brik + Owner: AlliedSlaves + Location: 65,79 + Actor480: brik + Owner: AlliedSlaves + Location: 64,79 + Actor481: brik + Owner: AlliedSlaves + Location: 64,80 + Actor482: brik + Owner: AlliedSlaves + Location: 64,81 + Actor483: brik + Owner: AlliedSlaves + Location: 64,82 + Actor484: brik + Owner: AlliedSlaves + Location: 64,83 + Actor485: brik + Owner: AlliedSlaves + Location: 64,84 + Actor486: brik + Owner: AlliedSlaves + Location: 64,85 + Actor490: brik + Owner: AlliedSlaves + Location: 64,89 + Actor491: brik + Owner: AlliedSlaves + Location: 64,90 + Actor492: brik + Owner: AlliedSlaves + Location: 64,91 + Actor493: brik + Owner: AlliedSlaves + Location: 64,92 + Actor494: brik + Owner: AlliedSlaves + Location: 64,94 + Actor495: brik + Owner: AlliedSlaves + Location: 64,93 + Actor496: brik + Owner: AlliedSlaves + Location: 65,94 + Actor497: brik + Owner: AlliedSlaves + Location: 67,94 + Actor498: brik + Owner: AlliedSlaves + Location: 66,94 + Actor499: brik + Owner: AlliedSlaves + Location: 68,94 + Actor500: brik + Owner: AlliedSlaves + Location: 69,94 + Actor501: brik + Owner: AlliedSlaves + Location: 70,94 + Actor502: brik + Owner: AlliedSlaves + Location: 71,94 + Actor503: brik + Owner: AlliedSlaves + Location: 72,93 + Actor504: brik + Owner: AlliedSlaves + Location: 72,94 + Actor505: brik + Owner: AlliedSlaves + Location: 71,93 + Actor506: brik + Owner: AlliedSlaves + Location: 76,93 + Actor507: brik + Owner: AlliedSlaves + Location: 76,94 + Actor508: brik + Owner: AlliedSlaves + Location: 77,93 + Actor509: brik + Owner: AlliedSlaves + Location: 77,94 + Actor510: brik + Owner: AlliedSlaves + Location: 65,93 + Actor511: brik + Owner: AlliedSlaves + Location: 65,80 + Actor512: brik + Owner: AlliedSlaves + Location: 83,80 + Actor513: fact + Owner: AlliedSlaves + Location: 80,80 + Actor514: apwr + Owner: AlliedSlaves + Location: 81,85 + Actor515: apwr + Owner: AlliedSlaves + Location: 80,88 + Actor516: apwr + Owner: AlliedSlaves + Location: 78,85 + Actor522: fix + Owner: AlliedSlaves + Location: 76,88 + Actor523: gap + Owner: AlliedSlaves + Location: 76,86 + Actor524: pris + Owner: AlliedSlaves + Location: 70,80 + Actor525: pris + Owner: AlliedSlaves + Location: 78,80 + Actor526: pris + Owner: AlliedSlaves + Location: 70,93 + Actor527: pris + Owner: AlliedSlaves + Location: 78,93 + Actor528: htur + Owner: AlliedSlaves + Location: 83,98 + TurretFacing: 396 + Actor529: agun + Owner: AlliedSlaves + Location: 65,92 + HardNormalAA1: agun + Owner: AlliedSlaves + Location: 65,81 + TurretFacing: 832 + Actor531: atek + Owner: AlliedSlaves + Location: 67,80 + Actor534: dome + Owner: AlliedSlaves + Location: 66,84 + Actor535: agun + Owner: AlliedSlaves + Location: 81,92 + Actor530: agun + Owner: AlliedSlaves + Location: 78,82 + Actor536: pbox + Owner: AlliedSlaves + Location: 72,95 + Actor537: pbox + Owner: AlliedSlaves + Location: 76,95 + Actor538: pbox + Owner: AlliedSlaves + Location: 72,78 + Actor539: pbox + Owner: AlliedSlaves + Location: 76,78 + Actor655: brik + Owner: NodSlaves + Location: 117,53 + Actor656: brik + Owner: NodSlaves + Location: 118,53 + Actor657: brik + Owner: NodSlaves + Location: 119,53 + Actor658: brik + Owner: NodSlaves + Location: 120,53 + Actor659: brik + Owner: NodSlaves + Location: 121,53 + Actor660: brik + Owner: NodSlaves + Location: 122,53 + Actor661: brik + Owner: NodSlaves + Location: 123,53 + Actor662: brik + Owner: NodSlaves + Location: 124,53 + Actor663: brik + Owner: NodSlaves + Location: 125,53 + Actor664: brik + Owner: NodSlaves + Location: 126,53 + Actor665: brik + Owner: NodSlaves + Location: 127,53 + Actor666: brik + Owner: NodSlaves + Location: 128,53 + Actor667: brik + Owner: NodSlaves + Location: 129,53 + Actor668: brik + Owner: NodSlaves + Location: 130,53 + Actor669: brik + Owner: NodSlaves + Location: 131,53 + Actor670: brik + Owner: NodSlaves + Location: 132,53 + Actor671: brik + Owner: NodSlaves + Location: 117,54 + Actor672: brik + Owner: NodSlaves + Location: 118,54 + Actor673: afac + Owner: NodSlaves + Location: 120,54 + Actor674: nuk2 + Owner: NodSlaves + Location: 124,54 + Actor675: nuk2 + Owner: NodSlaves + Location: 126,54 + Actor676: nuk2 + Owner: NodSlaves + Location: 128,54 + Actor677: nuk2 + Owner: NodSlaves + Location: 130,54 + Actor678: brik + Owner: NodSlaves + Location: 132,54 + Actor679: brik + Owner: NodSlaves + Location: 132,55 + Actor680: brik + Owner: NodSlaves + Location: 132,56 + Actor681: brik + Owner: NodSlaves + Location: 132,57 + Actor682: ltur + Owner: NodSlaves + Location: 110,58 + Actor683: brik + Owner: NodSlaves + Location: 111,58 + Actor684: brik + Owner: NodSlaves + Location: 112,58 + Actor685: proc.td + Owner: NodSlaves + Location: 114,58 + Actor686: tmpl + Owner: NodSlaves + Location: 119,58 + Actor687: hpad.td + Owner: NodSlaves + Location: 123,58 + Actor688: brik + Owner: NodSlaves + Location: 132,58 + Actor689: brik + Owner: NodSlaves + Location: 111,59 + Actor690: brik + Owner: NodSlaves + Location: 112,59 + Actor691: tmpp + Owner: NodSlaves + Location: 127,59 + Actor692: brik + Owner: NodSlaves + Location: 132,59 + Actor693: brik + Owner: NodSlaves + Location: 111,60 + Actor694: brik + Owner: NodSlaves + Location: 132,60 + Actor695: brik + Owner: NodSlaves + Location: 111,61 + Actor696: brik + Owner: NodSlaves + Location: 132,61 + Actor697: brik + Owner: NodSlaves + Location: 111,62 + Actor698: brik + Owner: NodSlaves + Location: 132,62 + Actor699: brik + Owner: NodSlaves + Location: 111,63 + Actor700: hand + Owner: NodSlaves + Location: 117,63 + Actor701: airs + Owner: NodSlaves + Location: 126,63 + Actor702: brik + Owner: NodSlaves + Location: 132,63 + Actor703: brik + Owner: NodSlaves + Location: 111,64 + Actor704: hq + Owner: NodSlaves + Location: 114,64 + Actor705: brik + Owner: NodSlaves + Location: 132,64 + Actor706: brik + Owner: NodSlaves + Location: 111,65 + Actor707: brik + Owner: NodSlaves + Location: 132,65 + Actor708: brik + Owner: NodSlaves + Location: 111,66 + Actor709: obli + Owner: NodSlaves + Location: 112,66 + Actor710: brik + Owner: NodSlaves + Location: 132,66 + Actor711: brik + Owner: NodSlaves + Location: 111,67 + Actor712: brik + Owner: NodSlaves + Location: 112,67 + Actor713: brik + Owner: NodSlaves + Location: 113,67 + Actor714: brik + Owner: NodSlaves + Location: 114,67 + Actor715: brik + Owner: NodSlaves + Location: 115,67 + Actor716: brik + Owner: NodSlaves + Location: 127,67 + Actor717: brik + Owner: NodSlaves + Location: 128,67 + Actor718: brik + Owner: NodSlaves + Location: 129,67 + Actor719: brik + Owner: NodSlaves + Location: 130,67 + Actor720: brik + Owner: NodSlaves + Location: 131,67 + Actor721: brik + Owner: NodSlaves + Location: 132,67 + Actor722: brik + Owner: NodSlaves + Location: 115,68 + Actor723: brik + Owner: NodSlaves + Location: 116,68 + Actor724: obli + Owner: NodSlaves + Location: 117,68 + Actor725: brik + Owner: NodSlaves + Location: 118,68 + Actor726: brik + Owner: NodSlaves + Location: 119,68 + Actor727: brik + Owner: NodSlaves + Location: 123,68 + Actor728: brik + Owner: NodSlaves + Location: 124,68 + Actor729: obli + Owner: NodSlaves + Location: 125,68 + Actor730: brik + Owner: NodSlaves + Location: 126,68 + Actor731: brik + Owner: NodSlaves + Location: 127,68 + Actor732: brik + Owner: NodSlaves + Location: 115,69 + Actor733: brik + Owner: NodSlaves + Location: 116,69 + Actor734: brik + Owner: NodSlaves + Location: 117,69 + Actor735: brik + Owner: NodSlaves + Location: 118,69 + Actor736: brik + Owner: NodSlaves + Location: 119,69 + Actor737: brik + Owner: NodSlaves + Location: 123,69 + Actor738: brik + Owner: NodSlaves + Location: 124,69 + Actor739: brik + Owner: NodSlaves + Location: 125,69 + Actor740: brik + Owner: NodSlaves + Location: 126,69 + Actor741: brik + Owner: NodSlaves + Location: 127,69 + Actor742: ltur + Owner: NodSlaves + TurretFacing: 483 + Location: 119,70 + Actor743: ltur + Owner: NodSlaves + TurretFacing: 467 + Location: 123,70 + Actor744: brik + Owner: SovietSlaves + Location: 4,60 + Actor745: brik + Owner: SovietSlaves + Location: 5,60 + Actor746: brik + Owner: SovietSlaves + Location: 6,60 + Actor747: brik + Owner: SovietSlaves + Location: 7,60 + Actor748: brik + Owner: SovietSlaves + Location: 8,60 + Actor749: brik + Owner: SovietSlaves + Location: 9,60 + Actor750: brik + Owner: SovietSlaves + Location: 10,60 + Actor751: brik + Owner: SovietSlaves + Location: 11,60 + Actor752: brik + Owner: SovietSlaves + Location: 12,60 + Actor753: brik + Owner: SovietSlaves + Location: 13,60 + Actor754: brik + Owner: SovietSlaves + Location: 14,60 + Actor755: brik + Owner: SovietSlaves + Location: 15,60 + Actor756: brik + Owner: SovietSlaves + Location: 16,60 + Actor757: brik + Owner: SovietSlaves + Location: 17,60 + Actor758: brik + Owner: SovietSlaves + Location: 4,61 + Actor759: apwr + Owner: SovietSlaves + Location: 5,61 + Actor760: apwr + Owner: SovietSlaves + Location: 8,61 + Actor761: apwr + Owner: SovietSlaves + Location: 11,61 + Actor762: sam + Owner: SovietSlaves + Location: 14,61 + Actor763: brik + Owner: SovietSlaves + Location: 16,61 + Actor764: brik + Owner: SovietSlaves + Location: 17,61 + Actor765: ftur + Owner: SovietSlaves + Location: 18,61 + Actor766: brik + Owner: SovietSlaves + Location: 1,62 + Actor767: brik + Owner: SovietSlaves + Location: 2,62 + Actor768: brik + Owner: SovietSlaves + Location: 3,62 + Actor769: brik + Owner: SovietSlaves + Location: 4,62 + Actor770: tsla + Owner: SovietSlaves + Location: 16,62 + Actor771: brik + Owner: SovietSlaves + Location: 1,63 + Actor772: fact + Owner: SovietSlaves + Location: 2,63 + Actor773: brik + Owner: SovietSlaves + Location: 1,64 + Actor774: apwr + Owner: SovietSlaves + Location: 5,64 + Actor775: apwr + Owner: SovietSlaves + Location: 8,64 + Actor777: brik + Owner: SovietSlaves + Location: 1,65 + Actor778: brik + Owner: SovietSlaves + Location: 1,66 + Actor779: brik + Owner: SovietSlaves + Location: 1,67 + Actor780: brik + Owner: SovietSlaves + Location: 19,67 + Actor781: brik + Owner: SovietSlaves + Location: 20,67 + Actor782: ftur + Owner: SovietSlaves + Location: 21,67 + Actor783: brik + Owner: SovietSlaves + Location: 1,68 + Actor784: stek + Owner: SovietSlaves + Location: 2,68 + Actor786: brik + Owner: SovietSlaves + Location: 19,68 + Actor787: brik + Owner: SovietSlaves + Location: 20,68 + Actor788: brik + Owner: SovietSlaves + Location: 1,69 + Actor789: tsla + Owner: SovietSlaves + Location: 19,69 + Actor790: brik + Owner: SovietSlaves + Location: 20,69 + Actor791: brik + Owner: SovietSlaves + Location: 1,70 + Actor794: brik + Owner: SovietSlaves + Location: 20,70 + Actor795: brik + Owner: SovietSlaves + Location: 1,71 + Actor796: barr + Owner: SovietSlaves + Location: 12,71 + Actor797: brik + Owner: SovietSlaves + Location: 20,71 + Actor798: brik + Owner: SovietSlaves + Location: 1,72 + Actor799: dome + Owner: SovietSlaves + Location: 2,72 + Actor801: brik + Owner: SovietSlaves + Location: 1,73 + Actor803: brik + Owner: SovietSlaves + Location: 1,74 + Actor804: afld + Owner: SovietSlaves + Location: 15,74 + Actor805: brik + Owner: SovietSlaves + Location: 20,74 + Actor806: brik + Owner: SovietSlaves + Location: 1,75 + Actor807: brik + Owner: SovietSlaves + Location: 20,75 + Actor808: brik + Owner: SovietSlaves + Location: 1,76 + Actor809: brik + Owner: SovietSlaves + Location: 2,76 + Actor810: tsla + Owner: SovietSlaves + Location: 4,76 + Actor811: brik + Owner: SovietSlaves + Location: 5,76 + Actor812: brik + Owner: SovietSlaves + Location: 6,76 + Actor813: brik + Owner: SovietSlaves + Location: 10,76 + Actor814: brik + Owner: SovietSlaves + Location: 11,76 + Actor815: tsla + Owner: SovietSlaves + Location: 12,76 + Actor816: tsla + Owner: SovietSlaves + Location: 19,76 + Actor817: brik + Owner: SovietSlaves + Location: 20,76 + Actor818: brik + Owner: SovietSlaves + Location: 1,77 + Actor819: brik + Owner: SovietSlaves + Location: 2,77 + Actor820: brik + Owner: SovietSlaves + Location: 3,77 + Actor821: brik + Owner: SovietSlaves + Location: 4,77 + Actor822: brik + Owner: SovietSlaves + Location: 5,77 + Actor823: brik + Owner: SovietSlaves + Location: 6,77 + Actor824: brik + Owner: SovietSlaves + Location: 10,77 + Actor825: brik + Owner: SovietSlaves + Location: 11,77 + Actor826: brik + Owner: SovietSlaves + Location: 12,77 + Actor827: brik + Owner: SovietSlaves + Location: 13,77 + Actor828: brik + Owner: SovietSlaves + Location: 14,77 + Actor829: brik + Owner: SovietSlaves + Location: 15,77 + Actor830: brik + Owner: SovietSlaves + Location: 16,77 + Actor831: brik + Owner: SovietSlaves + Location: 17,77 + Actor832: brik + Owner: SovietSlaves + Location: 18,77 + Actor833: brik + Owner: SovietSlaves + Location: 19,77 + Actor834: brik + Owner: SovietSlaves + Location: 20,77 + Actor835: ftur + Owner: SovietSlaves + Location: 6,78 + Actor836: ftur + Owner: SovietSlaves + Location: 10,78 + Actor840: rep + Owner: NodSlaves + Location: 121,62 + Actor841: htnk.ion + Owner: GDI + Facing: 0 + Location: 68,120 + Actor842: htnk.ion + Owner: GDI + Facing: 0 + Location: 74,120 + PlayerStart: waypoint + Owner: Neutral + Location: 71,122 + Actor837: sbag + Owner: GDI + Location: 65,116 + Actor838: sbag + Owner: GDI + Location: 65,115 + Actor839: sbag + Owner: GDI + Location: 66,115 + Actor844: sbag + Owner: GDI + Location: 67,115 + Actor845: sbag + Owner: GDI + Location: 68,115 + Actor846: sbag + Owner: GDI + Location: 68,116 + Actor847: sbag + Owner: GDI + Location: 77,115 + Actor848: sbag + Owner: GDI + Location: 77,114 + Actor849: sbag + Owner: GDI + Location: 78,114 + Actor850: sbag + Owner: GDI + Location: 79,114 + Actor851: sbag + Owner: GDI + Location: 80,114 + Actor852: sbag + Owner: GDI + Location: 80,115 + Actor853: sbag + Owner: GDI + Location: 88,118 + Actor854: sbag + Owner: GDI + Location: 88,117 + Actor855: sbag + Owner: GDI + Location: 89,117 + Actor856: sbag + Owner: GDI + Location: 90,117 + Actor857: sbag + Owner: GDI + Location: 91,117 + Actor858: sbag + Owner: GDI + Location: 91,118 + Actor859: sbag + Owner: GDI + Location: 57,118 + Actor860: sbag + Owner: GDI + Location: 57,117 + Actor861: sbag + Owner: GDI + Location: 58,117 + Actor862: sbag + Owner: GDI + Location: 59,117 + Actor863: sbag + Owner: GDI + Location: 60,117 + Actor864: sbag + Owner: GDI + Location: 60,118 + Actor865: afac + Owner: GDI + Location: 71,127 + Actor866: pyle + Owner: GDI + Location: 76,121 + Actor867: gtwr + Owner: GDI + Location: 70,114 + Actor868: gtwr + Owner: GDI + Location: 75,114 + Actor869: nuke + Owner: GDI + Location: 68,126 + Actor870: nuke + Owner: GDI + Location: 77,125 + Actor873: msam + Owner: GDI + Location: 78,115 + Facing: 0 + Actor874: msam + Owner: GDI + Location: 67,116 + Facing: 0 + Actor875: msam + Owner: GDI + Location: 89,118 + Facing: 0 + Actor876: msam + Owner: GDI + Location: 59,118 + Facing: 0 + Actor877: mtnk + Owner: GDI + Facing: 0 + Location: 66,114 + Actor871: mtnk + Owner: GDI + Facing: 0 + Location: 79,113 + Actor872: n3 + Owner: GDI + Location: 66,116 + SubCell: 3 + Facing: 0 + Actor878: n3 + Owner: GDI + SubCell: 3 + Location: 58,118 + Facing: 0 + Actor879: n3 + Owner: GDI + Location: 79,115 + SubCell: 3 + Facing: 0 + Actor880: n3 + Owner: GDI + Location: 90,118 + SubCell: 3 + Facing: 0 + Actor881: n1 + Owner: GDI + SubCell: 3 + Location: 59,116 + Facing: 0 + Actor882: n1 + Owner: GDI + Location: 61,117 + SubCell: 3 + Facing: 0 + Actor883: n1 + Owner: GDI + Location: 65,114 + SubCell: 3 + Facing: 0 + Actor884: n1 + Owner: GDI + SubCell: 3 + Location: 70,115 + Facing: 0 + Actor885: n1 + Owner: GDI + SubCell: 3 + Location: 77,113 + Facing: 0 + Actor886: n1 + Owner: GDI + SubCell: 3 + Location: 82,115 + Facing: 103 + Actor887: n1 + Owner: GDI + Location: 88,116 + SubCell: 3 + Facing: 0 + Actor888: n1 + Owner: GDI + Location: 92,117 + SubCell: 3 + Facing: 0 + Actor889: split2 + Owner: Neutral + Location: 49,130 + Actor890: split2 + Owner: Neutral + Location: 55,129 + Actor891: proc.td + Owner: GDI + Location: 60,125 + Actor892: split2 + Owner: Neutral + Location: 44,93 + Actor893: split2 + Owner: Neutral + Location: 49,95 + Actor895: htur + Owner: AlliedSlaves + Location: 55,102 + TurretFacing: 642 + Actor894: split2 + Owner: Neutral + Location: 93,95 + Actor896: split2 + Owner: Neutral + Location: 95,91 + NodMastermind: mast + Owner: Scrin + SubCell: 3 + Location: 130,58 + Facing: 384 + AlliedMastermind: mast + Owner: Scrin + SubCell: 3 + Location: 67,83 + Facing: 650 + SovietMastermind: mast + Owner: Scrin + SubCell: 3 + Location: 2,71 + Facing: 634 + Actor900: split2 + Owner: Neutral + Location: 119,49 + Actor901: split2 + Owner: Neutral + Location: 127,49 + Actor902: split2 + Owner: Neutral + Location: 8,57 + Actor903: split2 + Owner: Neutral + Location: 13,56 + Actor1006: t17.husk + Owner: Neutral + Faction: germany + Location: 78,101 + Actor1007: tc04.husk + Owner: Neutral + Faction: germany + Location: 84,105 + Actor1008: tc01.husk + Owner: Neutral + Faction: germany + Location: 70,106 + Actor1009: t17.husk + Owner: Neutral + Faction: germany + Location: 61,103 + Actor1010: t16.husk + Owner: Neutral + Faction: germany + Location: 59,91 + Actor1011: tc03.husk + Owner: Neutral + Faction: germany + Location: 59,99 + Actor1012: t14.husk + Owner: Neutral + Faction: germany + Location: 59,104 + Actor1013: t15.husk + Owner: Neutral + Faction: germany + Location: 84,108 + Actor1014: t13.husk + Owner: Neutral + Faction: germany + Location: 82,107 + Actor1015: t13.husk + Owner: Neutral + Faction: germany + Location: 95,106 + Actor1016: tc02.husk + Owner: Neutral + Faction: germany + Location: 89,108 + Actor1017: t17.husk + Owner: Neutral + Faction: germany + Location: 97,103 + Actor1018: t14.husk + Owner: Neutral + Faction: germany + Location: 104,101 + Actor1019: t16.husk + Owner: Neutral + Faction: germany + Location: 106,101 + Actor1020: t10.husk + Owner: Neutral + Faction: germany + Location: 102,90 + Actor1021: tc04.husk + Owner: Neutral + Faction: germany + Location: 50,109 + Actor1022: t15.husk + Owner: Neutral + Faction: germany + Location: 53,110 + Actor1023: t12.husk + Owner: Neutral + Faction: germany + Location: 46,106 + Actor1024: t03.husk + Owner: Neutral + Faction: germany + Location: 41,104 + Actor1025: t11.husk + Owner: Neutral + Faction: germany + Location: 43,54 + Actor1026: t13.husk + Owner: Neutral + Faction: germany + Location: 41,65 + Actor1027: tc01.husk + Owner: Neutral + Faction: germany + Location: 43,69 + Actor1028: t16.husk + Owner: Neutral + Faction: germany + Location: 47,57 + Actor1029: t08.husk + Owner: Neutral + Faction: germany + Location: 46,67 + Actor1030: t16.husk + Owner: Neutral + Faction: germany + Location: 47,66 + Actor1031: tc02.husk + Owner: Neutral + Faction: germany + Location: 39,75 + Actor1032: t14.husk + Owner: Neutral + Faction: germany + Location: 39,73 + Actor1033: t05.husk + Owner: Neutral + Faction: germany + Location: 46,69 + Actor1034: t03.husk + Owner: Neutral + Faction: germany + Location: 46,59 + Actor1035: t07.husk + Owner: Neutral + Faction: germany + Location: 91,53 + Actor1036: t10.husk + Owner: Neutral + Faction: germany + Location: 90,64 + Actor1037: t15.husk + Owner: Neutral + Faction: germany + Location: 90,61 + Actor1038: t16.husk + Owner: Neutral + Faction: germany + Location: 90,78 + Actor1039: t15.husk + Owner: Neutral + Faction: germany + Location: 94,84 + Actor1040: t14.husk + Owner: Neutral + Faction: germany + Location: 92,81 + Actor1041: t15.husk + Owner: Neutral + Faction: germany + Location: 86,93 + Actor1042: t03.husk + Owner: Neutral + Faction: germany + Location: 86,91 + Actor1043: t05.husk + Owner: Neutral + Faction: germany + Location: 88,85 + Actor1044: t11.husk + Owner: Neutral + Faction: germany + Location: 87,81 + Actor1045: tc01.husk + Owner: Neutral + Faction: germany + Location: 89,82 + Actor1046: t08.husk + Owner: Neutral + Faction: germany + Location: 92,76 + Actor1047: t14.husk + Owner: Neutral + Faction: germany + Location: 91,65 + Actor1048: t16.husk + Owner: Neutral + Faction: germany + Location: 93,68 + Actor1049: t17.husk + Owner: Neutral + Faction: germany + Location: 93,63 + Actor1050: tc03.husk + Owner: Neutral + Faction: germany + Location: 92,67 + Actor1051: tc04.husk + Owner: Neutral + Faction: germany + Location: 31,94 + Actor1052: tc04 + Owner: Neutral + Faction: germany + Location: 42,115 + Actor1053: t02 + Owner: Neutral + Faction: germany + Location: 45,114 + Actor1054: t13 + Owner: Neutral + Faction: germany + Location: 39,116 + Actor1055: tc01 + Owner: Neutral + Faction: germany + Location: 34,120 + Actor1056: tc05 + Owner: Neutral + Faction: germany + Location: 34,116 + Actor1057: t05 + Owner: Neutral + Faction: germany + Location: 37,113 + Actor1058: t02 + Owner: Neutral + Faction: germany + Location: 31,114 + Actor1059: t03 + Owner: Neutral + Faction: germany + Location: 36,127 + Actor1060: tc01 + Owner: Neutral + Faction: germany + Location: 96,112 + Actor1061: t14 + Owner: Neutral + Faction: germany + Location: 100,115 + Actor1062: t13 + Owner: Neutral + Faction: germany + Location: 99,117 + Actor1063: t01 + Owner: Neutral + Faction: germany + Location: 98,115 + Actor1064: t16 + Owner: Neutral + Faction: germany + Location: 106,118 + Actor1065: ice01 + Owner: Neutral + Faction: germany + Location: 27,108 + Actor1066: tc02.husk + Owner: Neutral + Faction: germany + Location: 120,92 + Actor1067: t10.husk + Owner: Neutral + Faction: germany + Location: 125,94 + Actor1068: t06.husk + Owner: Neutral + Faction: germany + Location: 110,77 + Actor1069: t07.husk + Owner: Neutral + Faction: germany + Location: 97,73 + Actor1070: tc05.husk + Owner: Neutral + Faction: germany + Location: 95,56 + Actor1071: tc01.husk + Owner: Neutral + Faction: germany + Location: 97,46 + Actor1072: t06.husk + Owner: Neutral + Faction: germany + Location: 90,50 + Actor1073: t07.husk + Owner: Neutral + Faction: germany + Location: 42,46 + Actor1074: t03.husk + Owner: Neutral + Faction: germany + Location: 26,43 + Actor1075: tc05.husk + Owner: Neutral + Faction: germany + Location: 22,30 + Actor1076: t01.husk + Owner: Neutral + Faction: germany + Location: 23,28 + Actor1077: t15.husk + Owner: Neutral + Faction: germany + Location: 19,33 + Actor1078: tc02.husk + Owner: Neutral + Faction: germany + Location: 24,28 + Actor1079: t05.husk + Owner: Neutral + Faction: germany + Location: 18,35 + Actor1080: t08.husk + Owner: Neutral + Faction: germany + Location: 27,30 + Actor1081: splitblue + Owner: Neutral + Location: 41,10 + Actor1082: splitblue + Owner: Neutral + Location: 49,4 + Actor1083: splitblue + Owner: Neutral + Location: 61,3 + Actor1084: splitblue + Owner: Neutral + Location: 77,3 + Actor1085: splitblue + Owner: Neutral + Location: 91,15 + Actor1086: splitblue + Owner: Neutral + Location: 87,8 + Actor1087: tc04.husk + Owner: Neutral + Location: 102,8 + Actor1088: t15.husk + Owner: Neutral + Location: 97,4 + Actor1089: t07.husk + Owner: Neutral + Location: 101,2 + Actor1090: t10.husk + Owner: Neutral + Location: 90,1 + Actor1091: t10.husk + Owner: Neutral + Location: 99,6 + Actor1092: tc05.husk + Owner: Neutral + Location: 96,6 + Actor1093: t17.husk + Owner: Neutral + Location: 108,6 + Actor1094: t13.husk + Owner: Neutral + Location: 111,9 + Actor1095: t11.husk + Owner: Neutral + Location: 110,17 + Actor1098: t11.husk + Owner: Neutral + Location: 127,33 + Actor1099: tc05.husk + Owner: Neutral + Location: 122,38 + Actor1100: t17.husk + Owner: Neutral + Location: 120,37 + Actor1101: t12.husk + Owner: Neutral + Location: 109,31 + Actor1102: tc01.husk + Owner: Neutral + Location: 107,30 + Actor1103: t16.husk + Owner: Neutral + Location: 106,38 + Actor1104: t16.husk + Owner: Neutral + Location: 106,38 + Actor1105: t07.husk + Owner: Neutral + Location: 109,28 + Actor1106: t10.husk + Owner: Neutral + Location: 106,24 + Actor1108: t14.husk + Owner: Neutral + Location: 124,85 + Actor1109: t11.husk + Owner: Neutral + Location: 129,74 + Actor1110: t07.husk + Owner: Neutral + Location: 130,77 + Actor1111: tc04 + Owner: Neutral + Location: 120,126 + Actor1112: t13 + Owner: Neutral + Location: 123,123 + Actor1113: tc03 + Owner: Neutral + Location: 107,129 + Actor1114: tc04.husk + Owner: Neutral + Location: 114,108 + Actor1115: tc01.husk + Owner: Neutral + Location: 120,102 + Actor1116: tc02.husk + Owner: Neutral + Location: 110,98 + Actor1117: t17.husk + Owner: Neutral + Location: 109,96 + Actor1118: t03.husk + Owner: Neutral + Location: 115,83 + Actor1119: t07.husk + Owner: Neutral + Location: 97,80 + Actor1120: t15.husk + Owner: Neutral + Location: 129,104 + Actor1121: t16.husk + Owner: Neutral + Location: 131,100 + Actor1122: t02.husk + Owner: Neutral + Location: 101,62 + Actor1123: split2 + Owner: Neutral + Location: 119,117 + Actor1124: split2 + Owner: Neutral + Location: 13,123 + Actor1125: split2 + Owner: Neutral + Location: 11,119 + Actor1126: split2 + Owner: Neutral + Location: 121,83 + Actor1127: split2 + Owner: Neutral + Location: 126,81 + Actor1128: split2 + Owner: Neutral + Location: 3,90 + Actor1129: tc04.husk + Owner: Neutral + Location: 79,65 + Actor1130: t15.husk + Owner: Neutral + Location: 84,71 + Actor1131: tc01.husk + Owner: Neutral + Location: 84,54 + Actor1132: t02.husk + Owner: Neutral + Location: 86,57 + Actor1133: t05.husk + Owner: Neutral + Location: 56,57 + Actor1134: t03.husk + Owner: Neutral + Location: 49,62 + Actor1135: tc03.husk + Owner: Neutral + Location: 54,68 + Actor1136: t15.husk + Owner: Neutral + Location: 59,64 + Actor1137: t12.husk + Owner: Neutral + Location: 51,77 + Actor1138: tc04.husk + Owner: Neutral + Location: 45,79 + Actor1139: tc05.husk + Owner: Neutral + Location: 51,73 + Actor1140: t07.husk + Owner: Neutral + Location: 50,83 + Actor1141: t11.husk + Owner: Neutral + Location: 57,83 + Actor1142: t01.husk + Owner: Neutral + Location: 62,74 + Actor1143: t14.husk + Owner: Neutral + Location: 80,77 + Actor1144: t15.husk + Owner: Neutral + Location: 94,126 + Actor1145: t13.husk + Owner: Neutral + Location: 16,18 + Actor1151: t07.husk + Owner: Neutral + Location: 35,4 + Actor1153: tc01.husk + Owner: Neutral + Location: 13,19 + Actor1154: t15.husk + Owner: Neutral + Location: 6,23 + Actor1155: t07.husk + Owner: Neutral + Location: 1,19 + Actor1156: pac + Owner: Scrin + Location: 60,51 + Facing: 467 + Actor1157: pac + Owner: Scrin + Location: 73,51 + Facing: 586 + Actor1158: pac + Owner: Scrin + Facing: 384 + Location: 45,39 + Actor1159: pac + Owner: Scrin + Location: 83,40 + Facing: 626 + Actor1160: pac + Owner: Scrin + Location: 46,20 + Facing: 301 + Actor1161: pac + Owner: Scrin + Location: 83,27 + Facing: 650 + Actor1162: deva + Owner: Scrin + Facing: 384 + Location: 53,48 + Actor1163: deva + Owner: Scrin + Location: 84,46 + Facing: 586 + Actor1164: devo + Owner: Scrin + Location: 60,54 + Facing: 467 + Actor1165: devo + Owner: Scrin + Location: 75,55 + Facing: 507 + Actor1166: devo + Owner: Scrin + Facing: 384 + Location: 39,40 + Actor1167: devo + Owner: Scrin + Facing: 384 + Location: 39,26 + Actor1168: devo + Owner: Scrin + Location: 90,45 + Facing: 705 + Actor1169: rtpd + Owner: Scrin + Location: 67,54 + Facing: 475 + Actor1170: rtpd + Owner: Scrin + Location: 41,34 + Facing: 253 + Actor1171: rtpd + Owner: Scrin + Location: 89,38 + Facing: 761 + Actor1172: tpod + Owner: Scrin + Facing: 384 + Location: 64,43 + Actor1173: tpod + Owner: Scrin + Location: 70,43 + Facing: 578 + Actor1174: corr + Owner: Scrin + Facing: 384 + Location: 53,38 + Actor1175: corr + Owner: Scrin + Location: 79,34 + Facing: 610 + Actor1176: devo + Owner: Scrin + Location: 66,45 + Facing: 507 + Actor1177: stcr + Owner: Scrin + Facing: 384 + Location: 49,45 + Actor1178: stcr + Owner: Scrin + Location: 87,46 + Facing: 642 + Actor1179: s1 + Owner: Scrin + SubCell: 3 + Location: 71,59 + Facing: 578 + Actor1180: s1 + Owner: Scrin + SubCell: 3 + Location: 62,59 + Facing: 467 + Actor1181: s1 + Owner: Scrin + SubCell: 3 + Location: 73,59 + Facing: 547 + Actor1182: s1 + Owner: Scrin + SubCell: 3 + Location: 76,58 + Facing: 384 + Actor1183: s1 + Owner: Scrin + SubCell: 3 + Location: 58,57 + Facing: 384 + Actor1184: harv.scrin + Owner: Scrin + Facing: 384 + Location: 96,34 + Actor1185: harv.scrin + Owner: Scrin + Facing: 384 + Location: 31,26 + Actor1186: shrw + Owner: Scrin + Facing: 384 + Location: 48,30 + Actor1187: shrw + Owner: Scrin + Location: 83,32 + Facing: 618 + Actor1188: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 49,46 + Actor1189: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 43,37 + Actor1190: s3 + Owner: Scrin + SubCell: 3 + Location: 70,52 + Facing: 515 + Actor1191: s3 + Owner: Scrin + SubCell: 3 + Location: 83,50 + Facing: 578 + Actor1192: ruin + Owner: Scrin + Location: 78,51 + Facing: 563 + Actor1193: intl + Owner: Scrin + Location: 100,38 + Facing: 578 + Actor1194: seek + Owner: Scrin + Facing: 384 + Location: 24,26 + Actor1195: seek + Owner: Scrin + Facing: 384 + Location: 29,31 + Actor1196: seek + Owner: Scrin + Location: 64,61 + Facing: 507 + Actor1197: seek + Owner: Scrin + Location: 72,61 + Facing: 594 + Actor1198: intl + Owner: Scrin + Location: 74,60 + Facing: 531 + Actor1199: intl + Owner: Scrin + Location: 60,59 + Facing: 444 + Actor1200: corr + Owner: Scrin + Location: 95,43 + Facing: 626 + Actor1201: lchr + Owner: Scrin + Facing: 384 + Location: 33,37 + Actor1202: intl + Owner: Scrin + Facing: 384 + Location: 34,39 + Actor1203: s4 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 45,33 + Actor1204: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 48,37 + Actor1205: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 55,36 + Actor1206: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 47,45 + Actor1207: s4 + Owner: Scrin + SubCell: 3 + Location: 77,51 + Facing: 586 + Actor1208: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 64,52 + Actor1209: s4 + Owner: Scrin + SubCell: 3 + Location: 67,50 + Facing: 570 + Actor1210: s1 + Owner: Scrin + SubCell: 3 + Location: 86,41 + Facing: 666 + Actor1211: s1 + Owner: Scrin + Facing: 384 + Location: 86,41 + SubCell: 1 + Actor1212: s1 + Owner: Scrin + Location: 87,41 + SubCell: 3 + Facing: 832 + Actor1213: s1 + Owner: Scrin + SubCell: 3 + Location: 87,34 + Facing: 586 + Actor1214: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 57,9 + Actor1216: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 75,9 + Actor1217: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 80,13 + Actor1218: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 79,12 + Actor1219: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 52,10 + Actor1220: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 49,13 + Actor1221: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 47,13 + Actor1222: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 74,9 + Actor1223: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 62,10 + Actor1224: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 51,14 + Actor1225: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 88,23 + Actor1226: s1 + Owner: Scrin + Facing: 384 + Location: 88,23 + SubCell: 1 + Actor1227: pac + Owner: Scrin + Location: 54,12 + Facing: 158 + Actor1228: pac + Owner: Scrin + Location: 76,13 + Facing: 880 + Actor1229: pac + Owner: Scrin + Location: 64,10 + Facing: 0 + Actor1235: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 115,30 + Actor1236: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 114,29 + Actor1237: s1 + Owner: Scrin + Facing: 384 + Location: 114,29 + SubCell: 1 + Actor1238: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 119,38 + Actor1239: s1 + Owner: Scrin + Facing: 384 + Location: 124,38 + SubCell: 1 + Actor1241: gunw + Owner: Scrin + Facing: 384 + Location: 98,37 + Actor1242: gunw + Owner: Scrin + Facing: 384 + Location: 25,32 + Actor1243: shrw + Owner: Scrin + Facing: 384 + Location: 45,18 + Actor1245: ptnk + Owner: AlliedSlaves + Facing: 384 + Location: 76,82 + Actor1246: cryo + Owner: AlliedSlaves + Location: 83,83 + Facing: 523 + Actor1247: 2tnk + Owner: AlliedSlaves + Location: 78,77 + Facing: 0 + Actor1248: 2tnk + Owner: AlliedSlaves + Location: 70,96 + Facing: 507 + Actor1249: 2tnk + Owner: AlliedSlaves + Location: 78,96 + Facing: 515 + Actor1251: v2rl + Location: 14,62 + Facing: 626 + Owner: SovietSlaves + Actor1252: 4tnk + Location: 19,64 + Facing: 919 + Owner: SovietSlaves + Actor1253: 4tnk + Location: 19,79 + Facing: 626 + Owner: SovietSlaves + Actor1254: 4tnk + Location: 22,76 + Facing: 626 + Owner: SovietSlaves + Actor1255: ltnk + Owner: NodSlaves + Location: 117,71 + Facing: 384 + Actor1256: ltnk + Owner: NodSlaves + Facing: 384 + Location: 125,71 + Actor1257: arty.nod + Owner: NodSlaves + Facing: 384 + Location: 112,63 + Actor1258: arty.nod + Owner: NodSlaves + Location: 119,54 + Facing: 1023 + Actor1259: bggy + Owner: NodSlaves + Facing: 384 + Location: 115,83 + Actor1260: bggy + Owner: NodSlaves + Location: 100,74 + Facing: 634 + Actor1261: bike + Owner: NodSlaves + Facing: 384 + Location: 120,111 + Actor1262: bike + Owner: NodSlaves + Location: 117,111 + Facing: 594 + Actor1263: bike + Owner: NodSlaves + Facing: 384 + Location: 99,96 + Actor1264: bike + Owner: NodSlaves + Facing: 384 + Location: 100,94 + Actor1265: obli + Owner: NodSlaves + Location: 112,60 + Actor1266: ftnk + Owner: NodSlaves + Location: 121,67 + Facing: 515 + Actor1267: ftnk + Owner: NodSlaves + Location: 114,56 + Facing: 134 + Actor1268: 3tnk + Owner: SovietSlaves + Location: 17,93 + Facing: 642 + Actor1269: e1 + Owner: SovietSlaves + SubCell: 3 + Location: 16,94 + Facing: 570 + Actor1270: e1 + Owner: SovietSlaves + SubCell: 3 + Location: 19,92 + Facing: 721 + Actor1271: e1 + Owner: SovietSlaves + SubCell: 3 + Location: 17,91 + Facing: 626 + Actor1272: e3 + Owner: SovietSlaves + SubCell: 3 + Location: 20,89 + Facing: 634 + Actor1273: e1 + Owner: SovietSlaves + SubCell: 3 + Location: 36,108 + Facing: 745 + Actor1274: e1 + Owner: SovietSlaves + SubCell: 3 + Location: 36,105 + Facing: 650 + Actor1275: e1 + Owner: SovietSlaves + Facing: 384 + SubCell: 3 + Location: 37,104 + Actor1276: e1 + Owner: SovietSlaves + Facing: 384 + Location: 36,108 + SubCell: 1 + Actor1277: e4 + Owner: SovietSlaves + SubCell: 3 + Location: 35,106 + Facing: 578 + Actor1278: e1 + Owner: AlliedSlaves + Facing: 384 + Location: 70,95 + SubCell: 3 + Actor1279: e1 + Owner: AlliedSlaves + Facing: 384 + SubCell: 3 + Location: 67,95 + Actor1280: e1 + Owner: AlliedSlaves + Facing: 384 + SubCell: 3 + Location: 77,96 + Actor1281: e1 + Owner: AlliedSlaves + Facing: 384 + Location: 78,95 + SubCell: 3 + Actor1282: e1 + Owner: AlliedSlaves + Facing: 384 + SubCell: 3 + Location: 75,92 + Actor1283: e3 + Owner: AlliedSlaves + Facing: 384 + SubCell: 3 + Location: 79,96 + Actor1284: e3 + Owner: AlliedSlaves + SubCell: 3 + Location: 71,81 + Facing: 642 + Actor1285: e1 + Owner: AlliedSlaves + Location: 79,78 + SubCell: 3 + Facing: 214 + Actor1286: e1 + Owner: AlliedSlaves + SubCell: 3 + Location: 77,77 + Facing: 237 + Actor1287: e1 + Owner: AlliedSlaves + SubCell: 3 + Location: 80,76 + Facing: 142 + Actor1288: e1 + Owner: SovietSlaves + SubCell: 3 + Location: 18,79 + Facing: 650 + Actor1289: e1 + Owner: SovietSlaves + SubCell: 3 + Location: 21,78 + Facing: 642 + Actor1290: e1 + Owner: SovietSlaves + SubCell: 3 + Location: 22,75 + Facing: 745 + Actor1291: e1 + Owner: SovietSlaves + SubCell: 3 + Location: 14,78 + Facing: 563 + Actor1292: e1 + Owner: SovietSlaves + SubCell: 3 + Location: 20,66 + Facing: 793 + Actor1293: e1 + Owner: SovietSlaves + SubCell: 3 + Location: 19,61 + Facing: 840 + Actor1294: e1 + Owner: SovietSlaves + Location: 19,61 + SubCell: 1 + Facing: 864 + Actor1295: shok + Owner: SovietSlaves + Facing: 384 + SubCell: 3 + Location: 21,74 + Actor1296: shok + Owner: SovietSlaves + Facing: 384 + SubCell: 3 + Location: 22,69 + Actor1297: e1 + Owner: SovietSlaves + SubCell: 3 + Location: 11,66 + Facing: 436 + Actor1298: nsam + Owner: NodSlaves + Location: 117,56 + Actor1299: nsam + Owner: NodSlaves + Location: 116,67 + Actor1300: s1 + Owner: Scrin + Facing: 384 + Location: 33,38 + SubCell: 3 + Actor1301: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 31,36 + Actor1302: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 28,32 + Actor1303: s1 + Owner: Scrin + Facing: 384 + Location: 28,32 + SubCell: 1 + Actor1304: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 28,29 + Actor1305: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 26,28 + Actor1306: s2 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 34,35 + Actor1307: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 31,32 + Actor1308: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 95,41 + Actor1309: s4 + Owner: Scrin + SubCell: 3 + Location: 100,36 + Facing: 721 + Actor1310: s1 + Owner: Scrin + SubCell: 3 + Location: 94,44 + Facing: 602 + Actor1311: s1 + Owner: Scrin + Location: 94,44 + SubCell: 1 + Facing: 634 + Actor1312: s1 + Owner: Scrin + SubCell: 3 + Location: 97,44 + Facing: 650 + Actor1313: s1 + Owner: Scrin + SubCell: 3 + Location: 97,41 + Facing: 610 + Actor1314: s1 + Owner: Scrin + SubCell: 3 + Location: 101,38 + Facing: 626 + Actor1315: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 63,61 + Actor1316: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 63,60 + Actor1317: tc05.husk + Owner: Neutral + Location: 29,78 + Actor1318: t01.husk + Owner: Neutral + Location: 31,70 + Actor1319: t12.husk + Owner: Neutral + Location: 30,76 + Actor1320: t05.husk + Owner: Neutral + Location: 32,59 + Actor1321: t15.husk + Owner: Neutral + Location: 31,52 + Actor1323: swal + Owner: Scrin + Location: 127,15 + Actor1324: swal + Owner: Scrin + Location: 128,15 + Actor1325: swal + Owner: Scrin + Location: 129,15 + Actor1326: swal + Owner: Scrin + Location: 130,15 + Actor1327: swal + Owner: Scrin + Location: 131,15 + Actor1328: swal + Owner: Scrin + Location: 132,15 + Actor1329: swal + Owner: Scrin + Location: 132,14 + Actor1330: swal + Owner: Scrin + Location: 132,13 + Actor1331: swal + Owner: Scrin + Location: 132,1 + Actor1332: swal + Owner: Scrin + Location: 132,2 + Actor1333: swal + Owner: Scrin + Location: 132,3 + Actor1334: swal + Owner: Scrin + Location: 132,4 + Actor1335: swal + Owner: Scrin + Location: 132,5 + Actor1336: swal + Owner: Scrin + Location: 132,6 + Actor1337: swal + Owner: Scrin + Location: 132,7 + Actor1338: swal + Owner: Scrin + Location: 132,8 + Actor1339: swal + Owner: Scrin + Location: 132,9 + Actor1340: swal + Owner: Scrin + Location: 132,10 + Actor1341: swal + Owner: Scrin + Location: 132,11 + Actor1342: swal + Owner: Scrin + Location: 132,12 + NEPower2: rea2 + Owner: Scrin + Location: 129,2 + NEPower4: rea2 + Owner: Scrin + Location: 129,5 + NEPower6: rea2 + Owner: Scrin + Location: 129,8 + NEPower8: rea2 + Owner: Scrin + Location: 129,11 + NEPower7: rea2 + Owner: Scrin + Location: 126,11 + NEPower5: rea2 + Owner: Scrin + Location: 126,8 + NEPower3: rea2 + Owner: Scrin + Location: 126,5 + NEPower1: rea2 + Owner: Scrin + Location: 126,2 + Actor1351: swal + Owner: Scrin + Location: 131,14 + Actor1352: swal + Owner: Scrin + Location: 130,14 + Actor1353: swal + Owner: Scrin + Location: 128,14 + Actor1354: swal + Owner: Scrin + Location: 129,14 + Actor1355: swal + Owner: Scrin + Location: 127,14 + Actor1359: swal + Owner: Scrin + Location: 125,11 + Actor1360: swal + Owner: Scrin + Location: 125,12 + Actor1361: swal + Owner: Scrin + Location: 125,10 + Actor1362: swal + Owner: Scrin + Location: 125,9 + Actor1363: swal + Owner: Scrin + Location: 125,9 + Actor1367: swal + Owner: Scrin + Location: 125,6 + Actor1368: swal + Owner: Scrin + Location: 125,5 + Actor1369: swal + Owner: Scrin + Location: 125,4 + Actor1370: swal + Owner: Scrin + Location: 125,3 + Actor1371: swal + Owner: Scrin + Location: 125,2 + Actor1372: swal + Owner: Scrin + Location: 125,1 + Actor1373: swal + Owner: Scrin + Location: 126,1 + Actor1374: swal + Owner: Scrin + Location: 127,1 + Actor1375: swal + Owner: Scrin + Location: 128,1 + Actor1376: swal + Owner: Scrin + Location: 129,1 + Actor1377: swal + Owner: Scrin + Location: 130,1 + Actor1378: swal + Owner: Scrin + Location: 131,1 + Actor1379: shar + Owner: Scrin + Location: 123,16 + Actor1380: shar + Owner: Scrin + Location: 129,18 + Actor1381: shar + Owner: Scrin + Location: 126,17 + Actor1382: shar + Owner: Scrin + Location: 122,13 + Actor1383: shar + Owner: Scrin + Location: 121,5 + Actor1384: shar + Owner: Scrin + Location: 121,2 + Actor1385: shar + Owner: Scrin + Location: 132,21 + Actor1386: shar + Owner: Scrin + Location: 129,21 + Actor1387: shar + Owner: Scrin + Location: 124,20 + Actor1388: shar + Owner: Scrin + Location: 120,17 + Actor1389: shar + Owner: Scrin + Location: 119,13 + Actor1390: shar + Owner: Scrin + Location: 118,5 + Actor1391: shar + Owner: Scrin + Location: 117,2 + Actor1392: shar + Owner: Scrin + Location: 121,9 + Actor1393: swal + Owner: Scrin + Location: 124,1 + Actor1394: swal + Owner: Scrin + Location: 124,2 + Actor1395: swal + Owner: Scrin + Location: 124,3 + Actor1396: swal + Owner: Scrin + Location: 124,4 + Actor1397: swal + Owner: Scrin + Location: 124,5 + Actor1398: swal + Owner: Scrin + Location: 124,6 + Actor1401: swal + Owner: Scrin + Location: 124,9 + Actor1402: swal + Owner: Scrin + Location: 124,10 + Actor1403: swal + Owner: Scrin + Location: 124,11 + Actor1404: swal + Owner: Scrin + Location: 124,12 + Actor1240: swal + Owner: Scrin + Location: 125,13 + Actor1322: swal + Owner: Scrin + Location: 124,13 + Actor1356: swal + Owner: Scrin + Location: 124,14 + Actor1357: swal + Owner: Scrin + Location: 125,14 + Actor1358: swal + Owner: Scrin + Location: 126,14 + Actor1364: swal + Owner: Scrin + Location: 126,15 + Actor1365: swal + Owner: Scrin + Location: 125,15 + Actor1366: swal + Owner: Scrin + Location: 124,15 + WestAttackNode1: waypoint + Owner: Neutral + Location: 28,38 + WestAttackNode4: waypoint + Owner: Neutral + Location: 21,84 + CenterAttackNode3: waypoint + Owner: Neutral + Location: 72,102 + EastAttackNode1: waypoint + Owner: Neutral + Location: 102,45 + EastAttackNode4: waypoint + Owner: Neutral + Location: 116,76 + EastAttackNode5: waypoint + Owner: Neutral + Location: 107,93 + MADTankSpawn: waypoint + Owner: Neutral + Location: 1,87 + NorthEastPowerBeacon: waypoint + Owner: Neutral + Location: 125,8 + WormholeWP: waypoint + Owner: Neutral + Location: 66,27 + ChronoTankSpawn5: waypoint + Owner: Neutral + Location: 107,14 + ChronoTankSpawn4: waypoint + Owner: Neutral + Location: 106,13 + ChronoTankSpawn6: waypoint + Owner: Neutral + Location: 108,15 + ChronoTankSpawn3: waypoint + Owner: Neutral + Location: 108,11 + ChronoTankSpawn2: waypoint + Owner: Neutral + Location: 107,10 + ChronoTankSpawn1: waypoint + Owner: Neutral + Location: 106,9 + WestWarpSphere: wsph + Owner: Scrin + Location: 44,27 + WestPortal: port + Owner: Scrin + Location: 48,33 + CenterWarpSphere: wsph + Owner: Scrin + Location: 56,44 + CenterPortal: port + Owner: Scrin + Location: 61,46 + EastWarpSphere: wsph + Owner: Scrin + Location: 81,35 + Actor1487: grav + Owner: Scrin + Location: 78,40 + Actor1488: grav + Owner: Scrin + Location: 51,33 + Actor1489: grav + Owner: Scrin + Location: 52,39 + Actor1490: srep + Owner: Scrin + Location: 74,45 + Actor1491: srep + Owner: Scrin + Location: 48,38 + EastPortal: port + Owner: Scrin + Location: 83,43 + Actor1492: grav + Owner: Scrin + Location: 79,44 + Actor1343: reap + Owner: CyborgSlaves + SubCell: 1 + Facing: 512 + Location: 60,27 + Actor1348: reap + Owner: CyborgSlaves + SubCell: 2 + Facing: 512 + Location: 60,27 + Actor1349: reap + Owner: CyborgSlaves + SubCell: 4 + Facing: 512 + Location: 60,27 + Actor1350: reap + Owner: CyborgSlaves + SubCell: 5 + Facing: 512 + Location: 60,27 + Actor1483: reap + Owner: CyborgSlaves + SubCell: 1 + Facing: 512 + Location: 72,27 + Actor1484: reap + Owner: CyborgSlaves + SubCell: 2 + Facing: 512 + Location: 72,27 + Actor1485: reap + Owner: CyborgSlaves + SubCell: 4 + Facing: 512 + Location: 72,27 + Actor1486: reap + Owner: CyborgSlaves + SubCell: 5 + Facing: 512 + Location: 72,27 + InterceptorSpawn1: waypoint + Owner: Neutral + Location: 66,132 + InterceptorSpawn2: waypoint + Owner: Neutral + Location: 62,132 + InterceptorSpawn3: waypoint + Owner: Neutral + Location: 70,132 + InterceptorExit2: waypoint + Owner: Neutral + Location: 104,1 + InterceptorWP2: waypoint + Owner: Neutral + Location: 59,54 + InterceptorWP3: waypoint + Owner: Neutral + Location: 73,54 + InterceptorExit3: waypoint + Owner: Neutral + Location: 1,37 + InterceptorExit1: waypoint + Owner: Neutral + Location: 45,1 + MADTankPath2: waypoint + Owner: Neutral + Location: 8,77 + MADTankPath3: waypoint + Owner: Neutral + Location: 24,59 + MADTankPath1: waypoint + Owner: Neutral + Location: 7,86 + MADTankPath4: waypoint + Owner: Neutral + Location: 22,42 + MADTankPath5: waypoint + Owner: Neutral + Location: 17,36 + MADTankPath6: waypoint + Owner: Neutral + Location: 18,21 + Actor1423: t11.husk + Owner: Neutral + Location: 27,2 + Actor1429: swal + Owner: Scrin + Location: 1,5 + Actor1435: tc01.husk + Owner: Neutral + Location: 25,4 + Actor1436: swal + Owner: Scrin + Location: 1,6 + NWPower5: rea2 + Owner: Scrin + Location: 2,6 + NWPower7: rea2 + Owner: Scrin + Location: 8,6 + NWPower8: rea2 + Owner: Scrin + Location: 11,6 + Actor1443: swal + Owner: Scrin + Location: 1,7 + Actor1448: swal + Owner: Scrin + Location: 1,8 + Actor1452: swal + Owner: Scrin + Location: 1,9 + Actor1453: swal + Owner: Scrin + Location: 2,9 + Actor1454: swal + Owner: Scrin + Location: 3,9 + Actor1455: swal + Owner: Scrin + Location: 4,9 + Actor1456: swal + Owner: Scrin + Location: 5,9 + Actor1457: swal + Owner: Scrin + Location: 6,9 + Actor1458: swal + Owner: Scrin + Location: 7,9 + Actor1459: swal + Owner: Scrin + Location: 8,9 + Actor1460: swal + Owner: Scrin + Location: 9,9 + Actor1461: swal + Owner: Scrin + Location: 10,9 + Actor1462: swal + Owner: Scrin + Location: 11,9 + Actor1463: swal + Owner: Scrin + Location: 12,9 + Actor1464: swal + Owner: Scrin + Location: 13,9 + Actor1465: swal + Owner: Scrin + Location: 14,9 + Actor1468: scol + Owner: Scrin + Location: 17,9 + Actor1469: swal + Owner: Scrin + Location: 1,10 + Actor1470: shar + Owner: Scrin + Location: 2,10 + Actor1471: swal + Owner: Scrin + Location: 3,10 + Actor1472: shar + Owner: Scrin + Location: 4,10 + Actor1473: swal + Owner: Scrin + Location: 5,10 + Actor1474: shar + Owner: Scrin + Location: 6,10 + Actor1475: swal + Owner: Scrin + Location: 7,10 + Actor1476: shar + Owner: Scrin + Location: 8,10 + Actor1477: swal + Owner: Scrin + Location: 9,10 + Actor1478: shar + Owner: Scrin + Location: 10,10 + Actor1479: swal + Owner: Scrin + Location: 11,10 + Actor1480: shar + Owner: Scrin + Location: 12,10 + Actor1494: swal + Owner: Scrin + Location: 13,10 + Actor1495: swal + Owner: Scrin + Location: 14,10 + Actor1496: swal + Owner: Scrin + Location: 1,11 + Actor1497: swal + Owner: Scrin + Location: 2,11 + Actor1498: swal + Owner: Scrin + Location: 3,11 + Actor1499: swal + Owner: Scrin + Location: 4,11 + Actor1500: swal + Owner: Scrin + Location: 5,11 + Actor1501: swal + Owner: Scrin + Location: 6,11 + Actor1502: swal + Owner: Scrin + Location: 7,11 + Actor1503: swal + Owner: Scrin + Location: 8,11 + Actor1504: swal + Owner: Scrin + Location: 9,11 + Actor1505: swal + Owner: Scrin + Location: 10,11 + Actor1506: swal + Owner: Scrin + Location: 11,11 + Actor1507: swal + Owner: Scrin + Location: 12,11 + Actor1508: swal + Owner: Scrin + Location: 13,11 + Actor1509: scol + Owner: Scrin + Location: 15,11 + Actor1510: scol + Owner: Scrin + Location: 15,11 + Actor1511: t02.husk + Owner: Neutral + Location: 27,10 + Actor1512: scol + Owner: Scrin + Location: 2,12 + Actor1513: scol + Owner: Scrin + Location: 2,12 + Actor1514: scol + Owner: Scrin + Location: 4,12 + Actor1515: scol + Owner: Scrin + Location: 6,12 + Actor1516: scol + Owner: Scrin + Location: 8,12 + Actor1517: scol + Owner: Scrin + Location: 10,12 + Actor1518: scol + Owner: Scrin + Location: 12,12 + Actor1346: swal + Owner: Scrin + Location: 1,1 + Actor1347: swal + Owner: Scrin + Location: 2,1 + Actor1405: swal + Owner: Scrin + Location: 3,1 + Actor1406: swal + Owner: Scrin + Location: 4,1 + Actor1407: swal + Owner: Scrin + Location: 5,1 + Actor1408: swal + Owner: Scrin + Location: 6,1 + Actor1409: swal + Owner: Scrin + Location: 7,1 + Actor1410: swal + Owner: Scrin + Location: 8,1 + Actor1411: swal + Owner: Scrin + Location: 9,1 + Actor1412: swal + Owner: Scrin + Location: 10,1 + Actor1413: swal + Owner: Scrin + Location: 11,1 + Actor1414: swal + Owner: Scrin + Location: 12,1 + Actor1415: swal + Owner: Scrin + Location: 13,1 + Actor1416: swal + Owner: Scrin + Location: 14,1 + Actor1417: swal + Owner: Scrin + Location: 15,1 + Actor1418: swal + Owner: Scrin + Location: 16,1 + Actor1419: swal + Owner: Scrin + Location: 1,2 + NWPower1: rea2 + Owner: Scrin + Location: 2,2 + NWPower2: rea2 + Owner: Scrin + Location: 5,2 + NWPower3: rea2 + Owner: Scrin + Location: 8,2 + NWPower4: rea2 + Owner: Scrin + Location: 11,2 + Actor1425: swal + Owner: Scrin + Location: 14,2 + Actor1426: swal + Owner: Scrin + Location: 15,2 + Actor1427: swal + Owner: Scrin + Location: 16,2 + Actor1519: scol + Owner: Scrin + Location: 17,2 + Actor1520: swal + Owner: Scrin + Location: 1,3 + Actor1524: swal + Owner: Scrin + Location: 1,4 + MADTankPath7: waypoint + Owner: Neutral + Location: 21,6 + MADTankPath9: waypoint + Owner: Neutral + Location: 9,5 + NWPower6: rea2 + Owner: Scrin + Location: 5,6 + MADTankPath8: waypoint + Owner: Neutral + Location: 14,5 + Actor1420: scol + Owner: Scrin + Location: 16,3 + Actor1421: scol + Owner: Scrin + Location: 16,10 + Actor1422: shar + Owner: Scrin + Location: 14,8 + Actor1424: shar + Owner: Scrin + Location: 14,3 + HackerDropSpawn: waypoint + Owner: Neutral + Location: 132,98 + ChronoTankBeacon: waypoint + Owner: Neutral + Location: 107,12 + Actor1344: camera + Owner: Scrin + Location: 73,114 + Actor1345: camera + Owner: Scrin + Location: 58,115 + Actor1428: camera + Owner: Scrin + Location: 87,115 + Actor1430: camera + Owner: Scrin + Location: 83,125 + Actor1431: camera + Owner: Scrin + Location: 66,125 + Actor1432: camera + Owner: Scrin + Location: 46,120 + Actor1433: camera + Owner: Scrin + Location: 108,111 + Actor1434: camera + Owner: Scrin + Location: 120,79 + Actor1437: camera + Owner: Scrin + Location: 112,55 + Actor1438: camera + Owner: Scrin + Location: 21,61 + Actor1439: camera + Owner: Scrin + Location: 13,81 + Actor1440: camera + Owner: Scrin + Location: 74,77 + Actor1441: camera + Owner: Scrin + Location: 74,98 + Actor1442: camera + Owner: Scrin + Location: 24,40 + Actor1444: camera + Owner: Scrin + Location: 105,45 + Actor1445: camera + Owner: Scrin + Location: 35,100 + Actor1446: camera + Owner: Scrin + Location: 104,97 + EntranceReveal1: waypoint + Owner: Neutral + Location: 74,95 + EntranceReveal2: waypoint + Owner: Neutral + Location: 8,78 + EntranceReveal3: waypoint + Owner: Neutral + Location: 121,71 + GrandCannonReveal1: waypoint + Owner: Neutral + Location: 56,103 + GrandCannonReveal2: waypoint + Owner: Neutral + Location: 83,99 + Actor1447: n3 + Owner: NodSlaves + Facing: 384 + SubCell: 3 + Location: 130,74 + Actor1449: n3 + Owner: NodSlaves + Facing: 384 + SubCell: 3 + Location: 131,73 + Actor1450: n3 + Owner: NodSlaves + Facing: 384 + SubCell: 3 + Location: 126,70 + Actor1451: n3 + Owner: NodSlaves + SubCell: 3 + Location: 123,54 + Facing: 253 + Actor1466: n3 + Owner: NodSlaves + Facing: 384 + SubCell: 3 + Location: 126,57 + Actor1467: n3 + Owner: NodSlaves + SubCell: 3 + Location: 131,66 + Facing: 539 + Actor1521: n3 + Owner: NodSlaves + Facing: 384 + SubCell: 3 + Location: 118,67 + Actor1522: n3 + Owner: NodSlaves + SubCell: 3 + Location: 119,61 + Facing: 578 + Actor1523: n3 + Owner: NodSlaves + Facing: 384 + SubCell: 3 + Location: 116,84 + Actor1525: n3 + Owner: NodSlaves + SubCell: 3 + Location: 125,76 + Facing: 713 + Actor1526: n3 + Owner: NodSlaves + SubCell: 3 + Location: 130,77 + Facing: 483 + Actor1527: e3 + Owner: AlliedSlaves + Location: 57,83 + SubCell: 3 + Facing: 602 + Actor1528: e3 + Owner: AlliedSlaves + Facing: 384 + Location: 51,77 + SubCell: 3 + Actor1529: e3 + Owner: AlliedSlaves + Facing: 384 + SubCell: 3 + Location: 63,92 + Actor1532: btr + Owner: SovietSlaves + Location: 3,83 + TurretFacing: 0 + Facing: 634 + Actor1533: btr + Owner: SovietSlaves + Location: 4,74 + Facing: 618 + Actor1534: e3 + Owner: SovietSlaves + SubCell: 3 + Location: 3,82 + Facing: 523 + Actor1535: e3 + Owner: SovietSlaves + SubCell: 3 + Location: 5,97 + Facing: 666 + Actor1536: e3 + Owner: SovietSlaves + SubCell: 3 + Location: 16,93 + Facing: 745 + Actor1537: e3 + Owner: SovietSlaves + Facing: 384 + Location: 16,93 + SubCell: 1 + Actor1538: e3 + Owner: SovietSlaves + SubCell: 3 + Location: 6,84 + Facing: 745 + Actor1539: e3 + Owner: SovietSlaves + SubCell: 3 + Location: 5,68 + Facing: 578 + Actor1540: e3 + Owner: SovietSlaves + SubCell: 3 + Location: 2,67 + Facing: 761 + Actor1541: e3 + Owner: SovietSlaves + SubCell: 3 + Location: 9,67 + Facing: 642 + Actor1542: e3 + Owner: SovietSlaves + Location: 11,73 + SubCell: 3 + Facing: 658 + Actor1543: e3 + Owner: SovietSlaves + Facing: 384 + Location: 12,70 + SubCell: 3 + Actor1544: sam + Owner: SovietSlaves + Location: 8,103 + Actor1545: sam + Owner: SovietSlaves + Location: 12,90 + Actor1546: sam + Owner: SovietSlaves + Location: 25,92 + Actor1547: fenc + Owner: SovietSlaves + Location: 24,92 + Actor1548: fenc + Owner: SovietSlaves + Location: 28,91 + Actor1549: fenc + Owner: SovietSlaves + Location: 27,91 + Actor1550: fenc + Owner: SovietSlaves + Location: 27,92 + Actor1551: fenc + Owner: SovietSlaves + Location: 27,93 + Actor1552: fenc + Owner: SovietSlaves + Location: 26,93 + Actor1553: fenc + Owner: SovietSlaves + Location: 25,93 + Actor1554: fenc + Owner: SovietSlaves + Location: 24,93 + Actor1555: fenc + Owner: SovietSlaves + Location: 11,91 + Actor1556: fenc + Owner: SovietSlaves + Location: 11,90 + Actor1557: fenc + Owner: SovietSlaves + Location: 12,91 + Actor1558: fenc + Owner: SovietSlaves + Location: 13,91 + Actor1559: fenc + Owner: SovietSlaves + Location: 14,91 + Actor1560: fenc + Owner: SovietSlaves + Location: 14,90 + Actor1561: fenc + Owner: SovietSlaves + Location: 8,104 + Actor1562: fenc + Owner: SovietSlaves + Location: 9,104 + Actor1563: fenc + Owner: SovietSlaves + Location: 10,104 + Actor1564: fenc + Owner: SovietSlaves + Location: 10,103 + Actor1565: fenc + Owner: SovietSlaves + Location: 10,102 + Actor1566: fenc + Owner: SovietSlaves + Location: 10,102 + Actor1567: fenc + Owner: SovietSlaves + Location: 9,102 + Actor1568: fenc + Owner: SovietSlaves + Location: 34,84 + Actor1569: fenc + Owner: SovietSlaves + Location: 35,84 + Actor1570: fenc + Owner: SovietSlaves + Location: 36,84 + Actor1571: fenc + Owner: SovietSlaves + Location: 36,82 + Actor1572: fenc + Owner: SovietSlaves + Location: 36,83 + Actor1573: sam + Owner: SovietSlaves + Location: 34,83 + Actor1574: fenc + Owner: SovietSlaves + Location: 33,83 + Actor1575: fenc + Owner: SovietSlaves + Location: 33,84 + Actor1576: nsam + Owner: NodSlaves + Location: 127,92 + Actor1577: nsam + Owner: NodSlaves + Location: 115,89 + Actor1578: nsam + Owner: NodSlaves + Location: 97,78 + Actor1579: nsam + Owner: NodSlaves + Location: 106,71 + Actor1580: sbag + Owner: NodSlaves + Location: 105,71 + Actor1581: sbag + Owner: NodSlaves + Location: 105,72 + Actor1582: sbag + Owner: NodSlaves + Location: 106,72 + Actor1583: sbag + Owner: NodSlaves + Location: 107,72 + Actor1584: sbag + Owner: NodSlaves + Location: 108,72 + Actor1585: sbag + Owner: NodSlaves + Location: 108,71 + Actor1586: sbag + Owner: NodSlaves + Location: 97,79 + Actor1587: sbag + Owner: NodSlaves + Location: 99,79 + Actor1588: sbag + Owner: NodSlaves + Location: 98,79 + Actor1589: sbag + Owner: NodSlaves + Location: 99,78 + Actor1590: sbag + Owner: NodSlaves + Location: 114,89 + Actor1591: sbag + Owner: NodSlaves + Location: 114,90 + Actor1592: sbag + Owner: NodSlaves + Location: 115,90 + Actor1593: sbag + Owner: NodSlaves + Location: 116,90 + Actor1594: sbag + Owner: NodSlaves + Location: 127,93 + Actor1595: sbag + Owner: NodSlaves + Location: 128,93 + Actor1596: sbag + Owner: NodSlaves + Location: 126,93 + Actor1597: sbag + Owner: NodSlaves + Location: 129,93 + Actor1598: sbag + Owner: NodSlaves + Location: 129,92 + Actor1599: n1 + Owner: NodSlaves + SubCell: 3 + Facing: 384 + Location: 127,94 + Actor1600: n1 + Owner: NodSlaves + SubCell: 3 + Location: 128,94 + Facing: 578 + Actor1601: n1 + Owner: NodSlaves + SubCell: 3 + Location: 116,91 + Facing: 563 + Actor1602: n1 + Owner: NodSlaves + Facing: 384 + Location: 116,91 + SubCell: 1 + Actor1603: n1 + Owner: NodSlaves + SubCell: 3 + Location: 113,89 + Facing: 269 + Actor1604: n1 + Owner: NodSlaves + SubCell: 3 + Location: 98,80 + Facing: 586 + Actor1605: n1 + Owner: NodSlaves + Location: 100,79 + SubCell: 3 + Facing: 642 + Actor1606: n1 + Owner: NodSlaves + SubCell: 3 + Location: 106,73 + Facing: 539 + Actor1607: n1 + Owner: NodSlaves + Location: 104,71 + SubCell: 3 + Facing: 384 + Actor1608: n1 + Owner: NodSlaves + Location: 109,72 + SubCell: 3 + Facing: 745 + Actor1609: e1 + Owner: SovietSlaves + SubCell: 3 + Location: 8,105 + Facing: 737 + Actor1610: e1 + Owner: SovietSlaves + Facing: 384 + Location: 8,105 + SubCell: 1 + Actor1611: e1 + Owner: SovietSlaves + SubCell: 3 + Location: 10,106 + Facing: 610 + Actor1612: e1 + Owner: SovietSlaves + SubCell: 3 + Location: 12,103 + Facing: 737 + Actor1613: e1 + Owner: SovietSlaves + SubCell: 3 + Location: 27,94 + Facing: 761 + Actor1614: e1 + Owner: SovietSlaves + Location: 27,94 + SubCell: 1 + Facing: 594 + Actor1615: e1 + Owner: SovietSlaves + SubCell: 3 + Location: 25,94 + Facing: 602 + Actor1616: e1 + Owner: SovietSlaves + SubCell: 3 + Location: 28,92 + Facing: 547 + Actor1618: e1 + Owner: SovietSlaves + Facing: 384 + Location: 34,85 + SubCell: 1 + Actor1619: e1 + Owner: SovietSlaves + Facing: 384 + SubCell: 3 + Location: 32,83 + Actor1621: e1 + Owner: SovietSlaves + SubCell: 3 + Location: 41,116 + Facing: 586 + Actor1622: e1 + Owner: SovietSlaves + SubCell: 3 + Location: 36,120 + Facing: 658 + Actor1623: e1 + Owner: SovietSlaves + Location: 41,118 + SubCell: 3 + Facing: 745 + Actor1624: shar + Owner: Scrin + Location: 92,64 + Actor1625: shar + Owner: Scrin + Location: 46,63 + Actor1626: shar + Owner: Scrin + Location: 41,72 + Actor1627: shar + Owner: Scrin + Location: 90,54 + Actor1628: shar + Owner: Scrin + Location: 93,78 + Actor1629: shar + Owner: Scrin + Location: 122,88 + Actor1630: shar + Owner: Scrin + Location: 38,88 + Actor1634: scol + Owner: Scrin + Location: 35,51 + Actor1635: scol + Owner: Scrin + Location: 19,44 + Actor1636: scol + Owner: Scrin + Location: 101,48 + Actor1637: ptur + Owner: Scrin + Location: 32,109 + TurretFacing: 570 + Actor1639: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 31,57 + Actor1640: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 29,55 + Actor1641: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 24,54 + Actor1642: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 31,55 + Actor1643: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 25,52 + Actor1644: tpod + Owner: Scrin + Facing: 384 + Location: 123,5 + Actor1645: seek + Owner: Scrin + Location: 119,8 + Facing: 293 + Actor1646: tent + Owner: AlliedSlaves + Location: 66,88 + Actor1648: hpad + Owner: AlliedSlaves + Location: 69,89 + Actor1650: weap + Owner: SovietSlaves + Location: 6,68 + Actor1651: sam + Owner: SovietSlaves + Location: 5,73 + Actor1652: weap + Owner: AlliedSlaves + Location: 69,84 + Actor1531: e3 + Owner: AlliedSlaves + Facing: 384 + SubCell: 3 + Location: 66,82 + Actor1647: brik + Owner: AlliedSlaves + Location: 63,90 + Actor1653: brik + Owner: AlliedSlaves + Location: 63,89 + Actor1654: brik + Owner: AlliedSlaves + Location: 63,85 + Actor1655: brik + Owner: AlliedSlaves + Location: 63,84 + Actor1656: e3 + Owner: AlliedSlaves + Facing: 384 + SubCell: 3 + Location: 65,85 + Actor1530: brik + Owner: SovietSlaves + Location: 19,75 + Actor1657: brik + Owner: SovietSlaves + Location: 19,74 + Actor1658: brik + Owner: SovietSlaves + Location: 19,70 + Actor1659: brik + Owner: SovietSlaves + Location: 19,71 + Actor1660: fix + Owner: SovietSlaves + Location: 15,71 + Actor1661: v2rl + Facing: 634 + Owner: SovietSlaves + Location: 14,76 + CenterAttackNode2: waypoint + Owner: Neutral + Location: 74,72 + EastAttackNode2: waypoint + Owner: Neutral + Location: 110,52 + Actor1649: proc + Owner: SovietSlaves + Location: 12,64 + HardNormalAA3: shar + Owner: Scrin + Location: 5,85 + TurretFacing: 192 + HardNormalAA2: shar + Owner: Scrin + Location: 130,73 + TurretFacing: 192 + CenterAttackNode1: waypoint + Owner: Neutral + Location: 67,63 + EastAttackNode3: waypoint + Owner: Neutral + Location: 120,63 + HackerDropLanding: waypoint + Owner: Neutral + Location: 124,103 + WestAttackNode2: waypoint + Owner: Neutral + Location: 27,59 + WestAttackNode3: waypoint + Owner: Neutral + Location: 11,69 + WestAttackNode5: waypoint + Owner: Neutral + Location: 29,99 + Actor1617: e2 + Owner: SovietSlaves + SubCell: 3 + Location: 36,86 + Facing: 277 + Actor1620: e2 + Owner: SovietSlaves + Facing: 384 + SubCell: 3 + Location: 38,85 + Actor1633: e2 + Owner: SovietSlaves + SubCell: 3 + Location: 37,84 + Facing: 634 + Actor1662: tpod + Owner: Scrin + Location: 123,9 + Facing: 269 + Actor1663: e4 + Owner: SovietSlaves + SubCell: 3 + Location: 20,124 + Facing: 753 + Actor1664: e4 + Owner: SovietSlaves + SubCell: 3 + Location: 20,120 + Facing: 785 + Actor1665: e1 + Owner: SovietSlaves + SubCell: 3 + Location: 21,117 + Facing: 697 + Actor1666: e1 + Owner: SovietSlaves + Location: 20,125 + SubCell: 3 + Facing: 697 + Actor1667: rtpd + Owner: Scrin + Location: 71,33 + Facing: 610 + Actor1668: rtpd + Owner: Scrin + Facing: 384 + Location: 61,33 + Actor1669: corr + Owner: Scrin + Facing: 384 + Location: 115,92 + Actor1638: e3 + Owner: NodSlaves + Facing: 384 + SubCell: 1 + Location: 100,79 + Actor1670: e3 + Owner: NodSlaves + Facing: 384 + SubCell: 3 + Location: 110,77 + Actor1671: atmz + Owner: Scrin + Facing: 384 + Location: 56,41 + Actor1672: atmz + Owner: Scrin + Location: 76,39 + Facing: 610 + Actor1673: atmz + Owner: Scrin + Location: 79,28 + TurretFacing: 0 + Facing: 634 + Actor1674: atmz + Owner: Scrin + Facing: 384 + Location: 48,28 + Actor1675: ruin + Owner: Scrin + Facing: 384 + Location: 58,32 + Actor1676: ruin + Owner: Scrin + Location: 74,31 + Facing: 634 + Actor1677: shar + Owner: Scrin + Location: 59,48 + TurretFacing: 333 + Actor1678: shar + Owner: Scrin + Location: 72,48 + TurretFacing: 586 + Actor1679: scol + Owner: Scrin + Location: 57,17 + Actor1680: scol + Owner: Scrin + Location: 76,18 + Actor1493: lchr + Owner: Scrin + Location: 70,59 + Facing: 467 + Actor1681: rmbc + Owner: CyborgSlaves + SubCell: 1 + Facing: 512 + Location: 62,40 + Actor1682: rmbc + Owner: CyborgSlaves + SubCell: 4 + Facing: 512 + Location: 62,40 + Actor1683: rmbc + Owner: CyborgSlaves + SubCell: 2 + Facing: 512 + Location: 62,40 + Actor1684: rmbc + Owner: CyborgSlaves + SubCell: 5 + Facing: 512 + Location: 62,40 + Actor1685: rmbc + Owner: CyborgSlaves + SubCell: 1 + Facing: 512 + Location: 71,40 + Actor1686: rmbc + Owner: CyborgSlaves + SubCell: 4 + Facing: 512 + Location: 71,40 + Actor1687: rmbc + Owner: CyborgSlaves + SubCell: 2 + Facing: 512 + Location: 71,40 + Actor1688: rmbc + Owner: CyborgSlaves + SubCell: 5 + Facing: 512 + Location: 71,40 + Actor1689: tplr + Owner: CyborgSlaves + SubCell: 1 + Facing: 512 + Location: 63,38 + Actor1690: tplr + Owner: CyborgSlaves + SubCell: 2 + Facing: 512 + Location: 63,38 + Actor1691: tplr + Owner: CyborgSlaves + SubCell: 4 + Facing: 512 + Location: 63,38 + Actor1692: tplr + Owner: CyborgSlaves + SubCell: 5 + Facing: 512 + Location: 63,38 + Actor1693: tplr + Owner: CyborgSlaves + SubCell: 1 + Facing: 512 + Location: 69,38 + Actor1694: tplr + Owner: CyborgSlaves + SubCell: 2 + Facing: 512 + Location: 69,38 + Actor1695: tplr + Owner: CyborgSlaves + SubCell: 4 + Facing: 512 + Location: 69,38 + Actor1696: tplr + Owner: CyborgSlaves + SubCell: 5 + Facing: 512 + Location: 69,38 + Actor1697: enli + Owner: CyborgSlaves + SubCell: 1 + Facing: 512 + Location: 59,21 + Actor1698: enli + Owner: CyborgSlaves + SubCell: 4 + Facing: 512 + Location: 59,21 + Actor1699: enli + Owner: CyborgSlaves + SubCell: 2 + Facing: 512 + Location: 59,21 + Actor1700: enli + Owner: CyborgSlaves + SubCell: 5 + Facing: 512 + Location: 59,21 + Actor1701: enli + Owner: CyborgSlaves + SubCell: 1 + Facing: 512 + Location: 72,20 + Actor1702: enli + Owner: CyborgSlaves + SubCell: 4 + Facing: 512 + Location: 72,20 + Actor1703: enli + Owner: CyborgSlaves + SubCell: 2 + Facing: 512 + Location: 72,20 + Actor1704: enli + Owner: CyborgSlaves + SubCell: 5 + Facing: 512 + Location: 72,20 + Actor1705: sfac + Owner: Scrin + Location: 63,10 + Actor1706: rea2 + Owner: Scrin + Location: 69,13 + Actor1707: rea2 + Owner: Scrin + Location: 71,11 + Actor1708: silo.scrin + Owner: Scrin + Location: 64,13 + Actor1709: silo.scrinblue + Owner: Scrin + Location: 68,11 + Actor1710: silo.scrinblue + Owner: Scrin + Location: 66,12 + Actor1711: swal + Owner: Scrin + Location: 79,32 + Actor1712: swal + Owner: Scrin + Location: 80,32 + Actor1713: swal + Owner: Scrin + Location: 81,32 + Actor1714: swal + Owner: Scrin + Location: 81,31 + Actor1715: swal + Owner: Scrin + Location: 81,30 + Actor1716: swal + Owner: Scrin + Location: 81,29 + Actor1717: swal + Owner: Scrin + Location: 79,29 + Actor1718: swal + Owner: Scrin + Location: 80,29 + KaneSpawn: waypoint + Owner: Neutral + Location: 66,21 + Actor1631: rmbc + Owner: CyborgSlaves + SubCell: 1 + Facing: 512 + Location: 64,23 + Actor1730: rmbc + Owner: CyborgSlaves + SubCell: 4 + Facing: 512 + Location: 64,23 + Actor1731: rmbc + Owner: CyborgSlaves + SubCell: 2 + Facing: 512 + Location: 64,23 + Actor1732: rmbc + Owner: CyborgSlaves + SubCell: 5 + Facing: 512 + Location: 64,23 + Actor1722: rmbc + Owner: CyborgSlaves + SubCell: 1 + Facing: 512 + Location: 68,23 + Actor1723: rmbc + Owner: CyborgSlaves + SubCell: 4 + Facing: 512 + Location: 68,23 + Actor1724: rmbc + Owner: CyborgSlaves + SubCell: 2 + Facing: 512 + Location: 68,23 + Actor1725: rmbc + Owner: CyborgSlaves + SubCell: 5 + Facing: 512 + Location: 68,23 + Actor1726: reap + Owner: CyborgSlaves + SubCell: 1 + Facing: 512 + Location: 63,20 + Actor1727: reap + Owner: CyborgSlaves + SubCell: 2 + Facing: 512 + Location: 63,20 + Actor1728: reap + Owner: CyborgSlaves + SubCell: 4 + Facing: 512 + Location: 63,20 + Actor1729: reap + Owner: CyborgSlaves + SubCell: 5 + Facing: 512 + Location: 63,20 + Actor1733: reap + Owner: CyborgSlaves + SubCell: 1 + Facing: 512 + Location: 69,20 + Actor1734: reap + Owner: CyborgSlaves + SubCell: 2 + Facing: 512 + Location: 69,20 + Actor1735: reap + Owner: CyborgSlaves + SubCell: 4 + Facing: 512 + Location: 69,20 + Actor1736: reap + Owner: CyborgSlaves + SubCell: 5 + Facing: 512 + Location: 69,20 + CyborgWormhole1: waypoint + Owner: Neutral + Location: 62,22 + CyborgWormhole2: waypoint + Owner: Neutral + Location: 70,22 + Actor1632: rea2 + Owner: Scrin + Location: 59,8 + Actor1719: rea2 + Owner: Scrin + Location: 87,24 + Actor1720: reac + Owner: Scrin + Location: 43,20 + Actor1215: s1 + Owner: Scrin + Facing: 384 + Location: 69,11 + SubCell: 3 + Actor1244: shrw + Owner: Scrin + Facing: 626 + Location: 66,9 + Actor1721: rea2 + Owner: Scrin + Location: 69,8 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|missions/main-campaign/ca30-singularity/singularity-rules.yaml, ca|rules/custom/coop-rules.yaml, singularity-coop-rules.yaml + +Sequences: ca|missions/main-campaign/ca30-singularity/singularity-sequences.yaml + +Weapons: ca|weapons/custom/campaign.yaml, ca|missions/main-campaign/ca30-singularity/singularity-weapons.yaml diff --git a/mods/ca/missions/coop-campaign/ca30-singularity-coop/singularity-coop-rules.yaml b/mods/ca/missions/coop-campaign/ca30-singularity-coop/singularity-coop-rules.yaml new file mode 100644 index 0000000000..8ba111fe21 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca30-singularity-coop/singularity-coop-rules.yaml @@ -0,0 +1,6 @@ +World: + LuaScript: + Scripts: campaign.lua, coop.lua, ca|missions/main-campaign/ca30-singularity/singularity.lua, singularity-coop.lua + LobbyMissionInfo@InitialObjectives: + Prefix: Initial Objectives + Text: • Destroy the Scrin Mothership. diff --git a/mods/ca/missions/coop-campaign/ca30-singularity-coop/singularity-coop.lua b/mods/ca/missions/coop-campaign/ca30-singularity-coop/singularity-coop.lua new file mode 100644 index 0000000000..5e3a5a4b4e --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca30-singularity-coop/singularity-coop.lua @@ -0,0 +1,81 @@ + +SetupPlayers = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Multi2 = Player.GetPlayer("Multi2") + Multi3 = Player.GetPlayer("Multi3") + Multi4 = Player.GetPlayer("Multi4") + Multi5 = Player.GetPlayer("Multi5") + GDI = Player.GetPlayer("GDI") + Greece = Player.GetPlayer("Greece") + USSR = Player.GetPlayer("USSR") + Nod = Player.GetPlayer("Nod") + Scrin = Player.GetPlayer("Scrin") + AlliedSlaves = Player.GetPlayer("AlliedSlaves") + SovietSlaves = Player.GetPlayer("SovietSlaves") + NodSlaves = Player.GetPlayer("NodSlaves") + CyborgSlaves = Player.GetPlayer("CyborgSlaves") + Kane = Player.GetPlayer("Kane") + NeutralGDI = Player.GetPlayer("NeutralGDI") + NeutralScrin = Player.GetPlayer("NeutralScrin") + SignalTransmitterPlayer = Player.GetPlayer("SignalTransmitterPlayer") -- separate player to prevent AI from attacking it + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = Utils.Where({ Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 }, function(p) return p ~= nil end) + MissionEnemies = { Scrin, SovietSlaves, AlliedSlaves, NodSlaves } + SinglePlayerPlayer = GDI + CoopInit() +end + +AfterWorldLoaded = function() + local firstActivePlayer = GetFirstActivePlayer() + TransferBaseToPlayer(SinglePlayerPlayer, firstActivePlayer) + StartCashSpread(3500) + + local x = 66 + Utils.Do(GetMcvPlayers(), function(p) + if p ~= firstActivePlayer then + Reinforcements.Reinforce(p, { "amcv" }, { CPos.New(x, 132), CPos.New(x, 130)}) + x = x + 2 + end + end) +end + +AfterTick = function() + +end + +FlipSlaveFaction = function(player, killer) + if player == NodSlaves then + NodFreed = true + Squads.NodSlaves.IdleUnits = { } + attackPath = { EastAttackNode1.Location, WormholeWP.Location } + InitAttackSquad(Squads.ScrinEast, Scrin) + if ScrinDefenseBuff1.IsDead and ScrinDefenseBuff2.IsDead then + InitHackers(HackersDelay[Difficulty]) + end + Notification("Nod forces have been released from Scrin control.") + MediaCA.PlaySound(MissionDir .. "/c_nodreleased.aud", 2) + elseif player == SovietSlaves then + SovietsFreed = true + Squads.SovietSlaves.IdleUnits = { } + attackPath = { WestAttackNode1.Location, WormholeWP.Location } + InitAttackSquad(Squads.ScrinWest, Scrin) + InitMADTankAttack() + Notification("Soviet forces have been released from Scrin control.") + MediaCA.PlaySound(MissionDir .. "/c_sovietsreleased.aud", 2) + elseif player == AlliedSlaves then + AlliesFreed = true + Squads.AlliedSlaves.IdleUnits = { } + attackPath = { CenterAttackNode1.Location, WormholeWP.Location } + InitAttackSquad(Squads.ScrinCenter, Scrin) + InitChronoTanks() + Notification("Allied forces have been released from Scrin control.") + MediaCA.PlaySound(MissionDir .. "/c_alliesreleased.aud", 2) + end + + local actors = Utils.Where(player.GetActors(), function(a) return not a.IsDead and a.IsInWorld and a.Type ~= "player" end) + Utils.Do(actors, function(a) + a.Owner = killer.Owner + Trigger.ClearAll(a) + end) +end diff --git a/mods/ca/missions/coop-campaign/ca31-foothold-coop/foothold-coop-rules.yaml b/mods/ca/missions/coop-campaign/ca31-foothold-coop/foothold-coop-rules.yaml new file mode 100644 index 0000000000..417a59860f --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca31-foothold-coop/foothold-coop-rules.yaml @@ -0,0 +1,6 @@ +World: + LuaScript: + Scripts: campaign.lua, coop.lua, ca|missions/main-campaign/ca31-foothold/foothold.lua, foothold-coop.lua + LobbyMissionInfo@InitialObjectives: + Prefix: Initial Objectives + Text: • Deploy Mobile Sensor Arrays at target locations to locate the Scrin Nerve Center.\n• Capture the Scrin Nerve Center.\n• Eliminate all Scrin forces. diff --git a/mods/ca/missions/coop-campaign/ca31-foothold-coop/foothold-coop.lua b/mods/ca/missions/coop-campaign/ca31-foothold-coop/foothold-coop.lua new file mode 100644 index 0000000000..1ec1c87c72 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca31-foothold-coop/foothold-coop.lua @@ -0,0 +1,40 @@ + +SetupPlayers = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Multi2 = Player.GetPlayer("Multi2") + Multi3 = Player.GetPlayer("Multi3") + Multi4 = Player.GetPlayer("Multi4") + Multi5 = Player.GetPlayer("Multi5") + GDI = Player.GetPlayer("GDI") + Scrin = Player.GetPlayer("Scrin") + TibLifeforms = Player.GetPlayer("TibLifeforms") + GatewayOwner = Player.GetPlayer("GatewayOwner") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = Utils.Where({ Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 }, function(p) return p ~= nil end) + MissionEnemies = { Scrin } + SinglePlayerPlayer = GDI + CoopInit() +end + +AfterWorldLoaded = function() + StartCashSpread(3500) +end + +AfterTick = function() + +end + +DoMcvArrival = function() + local interval = 30 + local defenders = { "hmmv", "mtnk", "mtnk", "n1", "n1", "n1", "n1", "n3" } + Reinforcements.Reinforce(GDI, defenders, { GatewayStable.Location, PlayerStart.Location }, interval) + + local delay = interval * #defenders + Utils.Do(GetMcvPlayers(), function(p) + Trigger.AfterDelay(delay, function() + Reinforcements.Reinforce(p, { "amcv" }, { GatewayStable.Location, PlayerStart.Location }) + end) + delay = delay + interval + end) +end diff --git a/mods/ca/missions/coop-campaign/ca31-foothold-coop/map.bin b/mods/ca/missions/coop-campaign/ca31-foothold-coop/map.bin new file mode 100644 index 0000000000..0028032c81 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca31-foothold-coop/map.bin differ diff --git a/mods/ca/missions/coop-campaign/ca31-foothold-coop/map.png b/mods/ca/missions/coop-campaign/ca31-foothold-coop/map.png new file mode 100644 index 0000000000..7108452015 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca31-foothold-coop/map.png differ diff --git a/mods/ca/missions/coop-campaign/ca31-foothold-coop/map.yaml b/mods/ca/missions/coop-campaign/ca31-foothold-coop/map.yaml new file mode 100644 index 0000000000..df237d3acf --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca31-foothold-coop/map.yaml @@ -0,0 +1,1971 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 31: Foothold Co-op + +Author: Darkademic & Gandorques Hikla + +Tileset: TEMPERAT + +MapSize: 114,98 + +Bounds: 1,1,112,96 + +Visibility: Lobby + +Categories: Co-op Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: GDI, Scrin, ScrinRebels, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + PlayerReference@GDI: + Name: GDI + Faction: gdi + Color: F2CF74 + Allies: GatewayOwner, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Creeps, TibLifeforms + PlayerReference@Scrin: + Name: Scrin + Bot: campaign + Faction: scrin + Color: 7700FF + Allies: TibLifeforms + Enemies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, ScrinRebels, Creeps + PlayerReference@TibLifeforms: + Name: TibLifeforms + NonCombatant: True + Faction: scrin + Color: 00FF00 + Allies: Scrin + Enemies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@ScrinRebels: + Name: ScrinRebels + NonCombatant: True + Faction: scrin + Color: 55E1AE + Enemies: Scrin, Creeps + PlayerReference@GatewayOwner: + Name: GatewayOwner + NonCombatant: True + Faction: gdi + Color: 7700FF + Allies: GDI + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: F2CF74 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, GatewayOwner + Enemies: Scrin, Creeps, TibLifeforms + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: EA7816 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, GatewayOwner + Enemies: Scrin, Creeps, TibLifeforms + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: 0B7310 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, GatewayOwner + Enemies: Scrin, Creeps, TibLifeforms + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: 0077D6 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, GatewayOwner + Enemies: Scrin, Creeps, TibLifeforms + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: 82C900 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, GatewayOwner + Enemies: Scrin, Creeps, TibLifeforms + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: 775A12 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, GatewayOwner + Enemies: Scrin, Creeps, TibLifeforms + +Actors: + Actor12: scrinflora1 + Owner: Neutral + Location: 23,15 + Actor13: scrinflora2 + Owner: Neutral + Location: 10,13 + Actor14: scrinflora4 + Owner: Neutral + Location: 13,20 + Actor15: scrinflora5 + Owner: Neutral + Location: 16,6 + Actor17: scrinflora7 + Owner: Neutral + Location: 25,21 + Actor22: scrinflora11 + Owner: Neutral + Location: 14,21 + Actor24: scrinflora13 + Owner: Neutral + Location: 11,13 + Actor25: scrinflora12 + Owner: Neutral + Location: 9,11 + Actor27: scrinflora11 + Owner: Neutral + Location: 9,12 + Actor28: scrinflora9 + Owner: Neutral + Location: 9,13 + Actor29: scrinflora10 + Owner: Neutral + Location: 10,15 + Actor31: scrinflora10 + Owner: Neutral + Location: 22,15 + Actor32: scrinflora11 + Owner: Neutral + Location: 25,22 + Actor33: scrinflora12 + Owner: Neutral + Location: 23,16 + Sensor1: msar + Owner: GDI + Location: 12,10 + DeployState: Deployed + Facing: 660 + SensorZone1: flare.sensor + Location: 11,9 + Faction: Random + Owner: GDI + SensorZone2: flare.sensor + Location: 51,20 + Faction: Random + Owner: GDI + SensorZone3: flare.sensor + Location: 41,55 + Faction: Random + Owner: GDI + SensorZone4: flare.sensor + Location: 11,72 + Faction: Random + Owner: GDI + Gateway: wormhole + Owner: GatewayOwner + Location: 17,8 + Sensor2: msar + Owner: GDI + DeployState: Undeployed + Facing: 512 + Location: 15,10 + Sensor3: msar + Owner: GDI + Facing: 512 + Location: 17,10 + Sensor4: msar + Owner: GDI + Facing: 512 + Location: 19,10 + Actor73: s1 + Owner: Scrin + SubCell: 3 + Location: 42,20 + Facing: 384 + Actor74: s1 + Owner: Scrin + SubCell: 3 + Location: 44,23 + Facing: 229 + Actor92: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 44,21 + Actor93: s1 + Owner: Scrin + SubCell: 3 + Location: 8,29 + Facing: 848 + Actor95: s1 + Owner: Scrin + SubCell: 3 + Location: 13,32 + Facing: 1023 + Actor103: s1 + Owner: Scrin + SubCell: 3 + Location: 9,31 + Facing: 0 + Actor104: gunw + Owner: Scrin + Location: 50,25 + Facing: 166 + Actor105: gunw + Owner: Scrin + Location: 11,38 + Facing: 983 + Actor243: split2 + Owner: Scrin + Location: 6,87 + Actor244: split2 + Owner: Scrin + Location: 12,92 + Actor245: split2 + Owner: Scrin + Location: 16,86 + Actor246: split2 + Owner: Scrin + Location: 22,91 + Actor247: scrinflora1 + Owner: Neutral + Location: 47,19 + Actor248: scrinflora3 + Owner: Neutral + Location: 36,20 + Actor249: scrinflora5 + Owner: Neutral + Location: 54,26 + Actor250: scrinflora8 + Owner: Neutral + Location: 6,35 + Actor251: scrinflora2 + Owner: Neutral + Location: 15,42 + Actor252: scrinflora7 + Owner: Neutral + Location: 27,41 + Actor253: scrinflora7 + Owner: Neutral + Location: 56,31 + Actor254: scrinflora14 + Owner: Neutral + Location: 55,32 + Actor255: scrinflora1 + Owner: Neutral + Location: 26,42 + Actor256: scrinflora1 + Owner: Neutral + Location: 37,40 + Actor257: scrinflora8 + Owner: Neutral + Location: 47,45 + Actor258: scrinflora6 + Owner: Neutral + Location: 41,38 + Actor259: scrinflora13 + Owner: Neutral + Location: 43,37 + Actor260: scrinflora11 + Owner: Neutral + Location: 40,38 + Actor261: scrinflora2 + Owner: Neutral + Location: 41,37 + Actor262: s3 + Owner: Scrin + SubCell: 3 + Location: 8,32 + Facing: 896 + Blob1: tbcl + Owner: TibLifeforms + Location: 11,62 + Facing: 384 + Blob2: tbcl + Owner: TibLifeforms + Location: 48,39 + Facing: 384 + Actor271: swal + Owner: Scrin + Location: 82,22 + Actor272: swal + Owner: Scrin + Location: 81,22 + Actor275: swal + Owner: Scrin + Location: 80,22 + Actor276: swal + Owner: Scrin + Location: 80,23 + Actor277: swal + Owner: Scrin + Location: 80,24 + Actor278: swal + Owner: Scrin + Location: 81,24 + Actor279: swal + Owner: Scrin + Location: 82,24 + Actor280: swal + Owner: Scrin + Location: 82,23 + Actor273: swal + Owner: Scrin + Location: 90,21 + Actor274: swal + Owner: Scrin + Location: 90,22 + Actor281: swal + Owner: Scrin + Location: 90,23 + Actor282: swal + Owner: Scrin + Location: 91,23 + Actor283: swal + Owner: Scrin + Location: 92,23 + Actor284: swal + Owner: Scrin + Location: 92,22 + Actor285: swal + Owner: Scrin + Location: 92,21 + Actor286: swal + Owner: Scrin + Location: 91,21 + Actor287: swal + Owner: Scrin + Location: 75,33 + Actor288: swal + Owner: Scrin + Location: 75,34 + Actor289: swal + Owner: Scrin + Location: 75,35 + Actor290: swal + Owner: Scrin + Location: 76,35 + Actor291: swal + Owner: Scrin + Location: 77,35 + Actor292: swal + Owner: Scrin + Location: 77,34 + Actor293: swal + Owner: Scrin + Location: 77,33 + Actor294: swal + Owner: Scrin + Location: 76,33 + Actor295: swal + Owner: Scrin + Location: 78,34 + Actor296: swal + Owner: Scrin + Location: 79,34 + Actor297: swal + Owner: Scrin + Location: 80,34 + Actor298: swal + Owner: Scrin + Location: 82,34 + Actor299: swal + Owner: Scrin + Location: 81,34 + Actor300: swal + Owner: Scrin + Location: 83,34 + Actor301: swal + Owner: Scrin + Location: 83,35 + Actor302: swal + Owner: Scrin + Location: 83,36 + Actor303: swal + Owner: Scrin + Location: 84,36 + Actor304: swal + Owner: Scrin + Location: 85,36 + Actor305: swal + Owner: Scrin + Location: 86,36 + Actor306: swal + Owner: Scrin + Location: 86,35 + Actor307: swal + Owner: Scrin + Location: 86,37 + Actor308: swal + Owner: Scrin + Location: 87,37 + Actor309: swal + Owner: Scrin + Location: 88,37 + Actor310: swal + Owner: Scrin + Location: 87,35 + Actor311: swal + Owner: Scrin + Location: 88,35 + Actor312: swal + Owner: Scrin + Location: 88,36 + Actor313: swal + Owner: Scrin + Location: 95,35 + Actor314: swal + Owner: Scrin + Location: 95,36 + Actor315: swal + Owner: Scrin + Location: 95,37 + Actor316: swal + Owner: Scrin + Location: 97,37 + Actor317: swal + Owner: Scrin + Location: 96,37 + Actor318: swal + Owner: Scrin + Location: 96,35 + Actor319: swal + Owner: Scrin + Location: 97,35 + Actor320: swal + Owner: Scrin + Location: 97,36 + Actor321: swal + Owner: Scrin + Location: 98,36 + Actor322: swal + Owner: Scrin + Location: 99,36 + Actor323: swal + Owner: Scrin + Location: 100,36 + Actor324: swal + Owner: Scrin + Location: 102,36 + Actor325: swal + Owner: Scrin + Location: 101,36 + Actor326: swal + Owner: Scrin + Location: 103,36 + Actor327: swal + Owner: Scrin + Location: 105,36 + Actor328: swal + Owner: Scrin + Location: 104,36 + Actor329: swal + Owner: Scrin + Location: 105,35 + Actor330: swal + Owner: Scrin + Location: 105,37 + Actor331: swal + Owner: Scrin + Location: 106,37 + Actor332: swal + Owner: Scrin + Location: 107,37 + Actor333: swal + Owner: Scrin + Location: 106,35 + Actor334: swal + Owner: Scrin + Location: 107,35 + Actor335: swal + Owner: Scrin + Location: 107,36 + Actor336: swal + Owner: Scrin + Location: 103,22 + Actor337: swal + Owner: Scrin + Location: 104,22 + Actor338: swal + Owner: Scrin + Location: 105,22 + Actor339: swal + Owner: Scrin + Location: 105,23 + Actor340: swal + Owner: Scrin + Location: 104,24 + Actor341: swal + Owner: Scrin + Location: 103,24 + Actor342: swal + Owner: Scrin + Location: 103,23 + Actor343: swal + Owner: Scrin + Location: 105,24 + Actor344: swal + Owner: Scrin + Location: 111,21 + Actor345: swal + Owner: Scrin + Location: 112,21 + Actor346: swal + Owner: Scrin + Location: 112,22 + Actor347: swal + Owner: Scrin + Location: 112,23 + Actor348: swal + Owner: Scrin + Location: 110,23 + Actor349: swal + Owner: Scrin + Location: 110,21 + Actor350: swal + Owner: Scrin + Location: 110,22 + Actor351: swal + Owner: Scrin + Location: 111,23 + NPowered12: scol + Owner: Scrin + Location: 111,22 + NPowered11: scol + Owner: Scrin + Location: 104,23 + NPowered9: scol + Owner: Scrin + Location: 91,22 + NPowered8: scol + Owner: Scrin + Location: 81,23 + NPowered1: scol + Owner: Scrin + Location: 76,34 + NPowered4: scol + Owner: Scrin + Location: 87,36 + NPowered5: scol + Owner: Scrin + Location: 96,36 + NPowered6: scol + Owner: Scrin + Location: 106,36 + NerveCenter2: nerv + Owner: Scrin + Location: 98,27 + Actor362: scrt + Owner: Scrin + Location: 108,29 + Actor363: sfac + Owner: Scrin + Location: 78,28 + NPower5: rea2 + Owner: Scrin + Location: 98,33 + NPower4: rea2 + Owner: Scrin + Location: 82,30 + NPower3: rea2 + Owner: Scrin + Location: 82,26 + NPower6: rea2 + Owner: Scrin + Location: 102,33 + NPower7: rea2 + Owner: Scrin + Location: 104,30 + Actor372: grav + Owner: Scrin + Location: 99,21 + NPower8: rea2 + Owner: Scrin + Location: 110,29 + NPower9: rea2 + Owner: Scrin + Location: 110,25 + NPower1: rea2 + Owner: Scrin + Location: 76,23 + NPower2: rea2 + Owner: Scrin + Location: 74,30 + Actor405: sign + Owner: Scrin + Location: 103,26 + Actor406: ptur + Owner: Scrin + Location: 88,38 + TurretFacing: 372 + Actor407: ptur + Owner: Scrin + Location: 95,38 + TurretFacing: 412 + NPowered2: shar + Owner: Scrin + Location: 79,33 + TurretFacing: 192 + NPowered3: shar + Owner: Scrin + Location: 84,35 + TurretFacing: 192 + NPowered7: shar + Owner: Scrin + Location: 107,34 + TurretFacing: 192 + NPowered10: shar + Owner: Scrin + Location: 98,17 + TurretFacing: 192 + Actor412: split2 + Owner: Neutral + Location: 82,15 + Actor413: split2 + Owner: Neutral + Location: 90,13 + Actor414: split2 + Owner: Neutral + Location: 85,8 + Actor415: split2 + Owner: Neutral + Location: 97,9 + Actor416: split2 + Owner: Neutral + Location: 106,15 + Actor417: split2 + Owner: Neutral + Location: 110,10 + Actor418: split2 + Owner: Neutral + Location: 79,4 + Actor419: swal + Owner: Scrin + Location: 64,57 + Actor420: swal + Owner: Scrin + Location: 64,58 + Actor421: swal + Owner: Scrin + Location: 65,57 + Actor424: swal + Owner: Scrin + Location: 64,59 + Actor425: swal + Owner: Scrin + Location: 65,59 + Actor426: swal + Owner: Scrin + Location: 66,59 + Actor432: swal + Owner: Scrin + Location: 73,63 + Actor433: swal + Owner: Scrin + Location: 73,62 + Actor434: swal + Owner: Scrin + Location: 73,61 + Actor435: swal + Owner: Scrin + Location: 72,61 + Actor436: swal + Owner: Scrin + Location: 71,61 + Actor437: swal + Owner: Scrin + Location: 71,62 + Actor438: swal + Owner: Scrin + Location: 71,63 + Actor439: swal + Owner: Scrin + Location: 72,63 + Actor422: swal + Owner: Scrin + Location: 66,57 + Actor423: swal + Owner: Scrin + Location: 66,58 + Actor427: swal + Owner: Scrin + Location: 65,56 + Actor428: swal + Owner: Scrin + Location: 65,55 + Actor429: swal + Owner: Scrin + Location: 65,54 + Actor430: swal + Owner: Scrin + Location: 65,53 + Actor431: swal + Owner: Scrin + Location: 65,52 + Actor440: swal + Owner: Scrin + Location: 66,52 + Actor441: swal + Owner: Scrin + Location: 66,53 + Actor442: swal + Owner: Scrin + Location: 73,60 + Actor443: swal + Owner: Scrin + Location: 74,60 + Actor444: swal + Owner: Scrin + Location: 75,60 + Actor445: swal + Owner: Scrin + Location: 76,60 + Actor446: swal + Owner: Scrin + Location: 77,60 + Actor447: swal + Owner: Scrin + Location: 77,59 + Actor448: swal + Owner: Scrin + Location: 76,59 + ShardLauncher1: shar + Owner: Scrin + Location: 66,54 + TurretFacing: 192 + ShardLauncher2: shar + Owner: Scrin + Location: 75,59 + TurretFacing: 192 + StormColumn2: scol + Owner: Scrin + Location: 72,62 + StormColumn1: scol + Owner: Scrin + Location: 65,58 + Actor451: ptur + Owner: Scrin + Location: 68,61 + TurretFacing: 428 + Actor454: swal + Owner: Scrin + Location: 63,57 + Actor455: swal + Owner: Scrin + Location: 62,57 + Actor456: swal + Owner: Scrin + Location: 61,57 + Actor457: swal + Owner: Scrin + Location: 61,58 + Actor458: swal + Owner: Scrin + Location: 62,58 + Actor459: swal + Owner: Scrin + Location: 73,64 + Actor460: swal + Owner: Scrin + Location: 73,65 + Actor461: swal + Owner: Scrin + Location: 73,66 + Actor462: swal + Owner: Scrin + Location: 72,66 + Actor463: swal + Owner: Scrin + Location: 72,65 + Actor464: scrinflora5 + Owner: Neutral + Location: 40,49 + Actor465: scrinflora1 + Owner: Neutral + Location: 5,51 + Actor466: scrinflora4 + Owner: Neutral + Location: 15,52 + Actor467: scrinflora3 + Owner: Neutral + Location: 23,62 + Actor468: scrinflora2 + Owner: Neutral + Location: 22,63 + Actor469: scrinflora4 + Owner: Neutral + Location: 11,78 + Actor470: scrinflora13 + Owner: Neutral + Location: 25,67 + Actor471: scrinflora10 + Owner: Neutral + Location: 23,63 + Actor472: scrinflora11 + Owner: Neutral + Location: 18,56 + Actor473: scrinflora10 + Owner: Neutral + Location: 29,65 + Actor474: scrinflora14 + Owner: Neutral + Location: 10,78 + Actor475: scrinflora12 + Owner: Neutral + Location: 4,73 + Actor476: scrinflora1 + Owner: Neutral + Location: 25,82 + Actor477: scrinflora2 + Owner: Neutral + Location: 42,59 + Actor478: scrinflora6 + Owner: Neutral + Location: 85,82 + Actor481: scrinflora7 + Owner: Neutral + Location: 54,62 + Actor483: scrinflora1 + Owner: Neutral + Location: 34,94 + Actor486: scrinflora1 + Owner: Neutral + Location: 85,81 + Actor487: scrinflora4 + Owner: Neutral + Location: 105,87 + Actor488: scrinflora1 + Owner: Neutral + Location: 102,87 + Actor489: scrinflora2 + Owner: Neutral + Location: 100,71 + Actor490: scrinflora3 + Owner: Neutral + Location: 108,66 + Actor491: scrinflora12 + Owner: Neutral + Location: 108,63 + Actor492: scrinflora10 + Owner: Neutral + Location: 111,64 + Actor493: scrinflora11 + Owner: Neutral + Location: 103,59 + Actor494: scrinflora10 + Owner: Neutral + Location: 108,56 + Actor495: scrinflora10 + Owner: Neutral + Location: 78,53 + Actor496: scrinflora1 + Owner: Neutral + Location: 79,52 + Actor497: scrinflora5 + Owner: Neutral + Location: 90,49 + Actor498: scrinflora7 + Owner: Neutral + Location: 91,47 + Actor499: scrinflora1 + Owner: Neutral + Location: 101,47 + Actor500: scrinflora2 + Owner: Neutral + Location: 94,57 + Actor501: scrinflora3 + Owner: Neutral + Location: 66,45 + Actor502: scrinflora4 + Owner: Neutral + Location: 71,28 + Actor503: scrinflora1 + Owner: Neutral + Location: 65,37 + Actor504: scrinflora2 + Owner: Neutral + Location: 64,32 + Actor505: scrinflora1 + Owner: Neutral + Location: 56,58 + Actor506: scrinflora14 + Owner: Neutral + Location: 43,59 + Actor507: scrinflora10 + Owner: Neutral + Location: 41,59 + Actor508: scrinflora13 + Owner: Neutral + Location: 46,60 + Actor509: scrinflora9 + Owner: Neutral + Location: 45,60 + Actor512: scrinflora12 + Owner: Neutral + Location: 84,83 + Actor513: scrinflora12 + Owner: Neutral + Location: 99,91 + Actor514: scrinflora9 + Owner: Neutral + Location: 100,92 + Actor515: scrinflora11 + Owner: Neutral + Location: 93,88 + Actor516: scrinflora9 + Owner: Neutral + Location: 92,88 + Actor517: scrinflora9 + Owner: Neutral + Location: 82,92 + Actor518: scrinflora13 + Owner: Neutral + Location: 66,71 + Actor519: scrinflora11 + Owner: Neutral + Location: 65,71 + Actor520: scrinflora11 + Owner: Neutral + Location: 71,76 + Actor521: scrinflora9 + Owner: Neutral + Location: 72,76 + Actor522: scrinflora5 + Owner: Neutral + Location: 81,62 + Actor524: scrinflora8 + Owner: Neutral + Location: 111,85 + Actor525: scrinflora8 + Owner: Neutral + Location: 80,53 + Actor526: scrinflora8 + Owner: Neutral + Location: 71,19 + Actor527: scrinflora1 + Owner: Neutral + Location: 72,18 + Actor528: scrinflora5 + Owner: Neutral + Location: 67,22 + Actor529: scrinflora1 + Owner: Neutral + Location: 62,14 + Actor530: scrinflora2 + Owner: Neutral + Location: 61,13 + Actor531: scrinflora13 + Owner: Neutral + Location: 61,16 + Actor532: scrinflora12 + Owner: Neutral + Location: 57,10 + Actor533: scrinflora7 + Owner: Neutral + Location: 63,6 + Actor534: scrinflora4 + Owner: Neutral + Location: 48,5 + Actor535: scrinflora13 + Owner: Neutral + Location: 50,5 + Actor537: scrinflora11 + Owner: Neutral + Location: 47,5 + Actor536: scrinflora14 + Owner: Neutral + Location: 56,17 + Actor539: scrinflora14 + Owner: Neutral + Location: 55,58 + Actor540: scrinflora12 + Owner: Neutral + Location: 46,59 + Actor541: scrinflora2 + Owner: Neutral + Location: 84,82 + Actor542: scrinflora11 + Owner: Neutral + Location: 83,82 + Actor543: scrinflora5 + Owner: Neutral + Location: 89,93 + Actor544: scrinflora1 + Owner: Neutral + Location: 90,92 + Actor545: scrinflora7 + Owner: Neutral + Location: 108,94 + Actor546: scrinflora13 + Owner: Neutral + Location: 110,93 + Actor547: scrinflora12 + Owner: Neutral + Location: 80,42 + Blob3: tbcl + Owner: TibLifeforms + Location: 96,84 + Facing: 384 + Actor551: split2 + Owner: Neutral + Location: 82,88 + Actor552: split2 + Owner: Neutral + Location: 89,86 + HardOnlyUnit3: ruin + Owner: Scrin + Location: 67,55 + Facing: 384 + HardOnlyUnit4: ruin + Owner: Scrin + Location: 73,59 + Facing: 384 + Actor554: tpod + Owner: Scrin + Facing: 384 + Location: 99,39 + Actor555: gunw + Owner: Scrin + Facing: 384 + Location: 101,38 + Actor556: gunw + Owner: Scrin + Facing: 384 + Location: 103,41 + Actor557: gunw + Owner: Scrin + Location: 87,22 + Facing: 158 + Actor561: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 65,60 + Actor562: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 63,59 + Actor563: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 69,64 + Actor564: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 70,67 + Actor565: s1 + Owner: Scrin + Facing: 384 + Location: 69,64 + SubCell: 1 + Actor566: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 75,56 + Actor567: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 91,51 + Actor568: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 95,50 + Actor569: s2 + Owner: Scrin + Facing: 384 + Location: 77,55 + SubCell: 3 + Actor570: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 101,54 + Actor571: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 106,52 + Actor572: s3 + Owner: Scrin + SubCell: 3 + Location: 103,54 + Facing: 507 + Actor573: s3 + Owner: Scrin + SubCell: 3 + Location: 99,51 + Facing: 618 + Actor574: lace + Owner: Scrin + Location: 68,42 + Facing: 634 + Actor575: lace + Owner: Scrin + Location: 70,42 + Facing: 602 + Actor576: gunw + Owner: Scrin + Facing: 384 + Location: 70,32 + Actor577: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 69,31 + Actor578: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 71,34 + Actor579: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 69,33 + Actor580: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 97,40 + Actor581: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 99,41 + Actor582: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 92,39 + Actor583: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 86,38 + Actor584: devo + Owner: Scrin + Facing: 384 + Location: 101,52 + Actor612: swal + Owner: Scrin + Location: 50,68 + Actor613: swal + Owner: Scrin + Location: 50,69 + Actor614: swal + Owner: Scrin + Location: 49,68 + Actor615: swal + Owner: Scrin + Location: 49,69 + Actor616: swal + Owner: Scrin + Location: 56,73 + Actor617: swal + Owner: Scrin + Location: 55,73 + Actor618: swal + Owner: Scrin + Location: 55,74 + Actor619: swal + Owner: Scrin + Location: 56,74 + Actor620: swal + Owner: Scrin + Location: 57,73 + Actor621: swal + Owner: Scrin + Location: 58,73 + Actor622: swal + Owner: Scrin + Location: 59,74 + Actor623: swal + Owner: Scrin + Location: 58,74 + Actor624: swal + Owner: Scrin + Location: 59,73 + Actor625: swal + Owner: Scrin + Location: 56,72 + Actor626: swal + Owner: Scrin + Location: 55,72 + Actor627: swal + Owner: Scrin + Location: 58,72 + Actor628: swal + Owner: Scrin + Location: 59,72 + Actor629: swal + Owner: Scrin + Location: 48,66 + Actor630: swal + Owner: Scrin + Location: 48,67 + Actor631: swal + Owner: Scrin + Location: 49,67 + Actor632: swal + Owner: Scrin + Location: 49,66 + Actor643: swal + Owner: Scrin + Location: 59,78 + Actor644: swal + Owner: Scrin + Location: 59,77 + Actor645: swal + Owner: Scrin + Location: 59,75 + Actor646: swal + Owner: Scrin + Location: 59,76 + NerveCenter1: nerv + Owner: Scrin + Location: 54,68 + Actor591: swal + Owner: Scrin + Location: 41,66 + Actor592: swal + Owner: Scrin + Location: 42,66 + Actor594: swal + Owner: Scrin + Location: 41,67 + Actor595: swal + Owner: Scrin + Location: 42,67 + Actor597: swal + Owner: Scrin + Location: 41,68 + Actor598: swal + Owner: Scrin + Location: 41,69 + Actor599: swal + Owner: Scrin + Location: 41,70 + Actor602: swal + Owner: Scrin + Location: 41,71 + Actor479: swal + Owner: Scrin + Location: 42,70 + Actor480: swal + Owner: Scrin + Location: 42,71 + Actor482: swal + Owner: Scrin + Location: 41,75 + Actor484: swal + Owner: Scrin + Location: 42,75 + Actor485: swal + Owner: Scrin + Location: 41,76 + Actor510: swal + Owner: Scrin + Location: 42,76 + Actor511: swal + Owner: Scrin + Location: 41,77 + Actor523: swal + Owner: Scrin + Location: 41,78 + Actor538: swal + Owner: Scrin + Location: 41,79 + Actor558: swal + Owner: Scrin + Location: 43,79 + Actor559: swal + Owner: Scrin + Location: 42,79 + Actor560: swal + Owner: Scrin + Location: 45,79 + Actor585: swal + Owner: Scrin + Location: 44,79 + Actor586: swal + Owner: Scrin + Location: 46,79 + Actor587: swal + Owner: Scrin + Location: 47,79 + Actor588: swal + Owner: Scrin + Location: 47,78 + Actor589: swal + Owner: Scrin + Location: 46,78 + Actor590: swal + Owner: Scrin + Location: 51,78 + Actor593: swal + Owner: Scrin + Location: 51,79 + Actor596: swal + Owner: Scrin + Location: 52,78 + Actor600: swal + Owner: Scrin + Location: 52,79 + Actor601: swal + Owner: Scrin + Location: 53,79 + Actor603: swal + Owner: Scrin + Location: 55,79 + Actor604: swal + Owner: Scrin + Location: 56,79 + Actor605: swal + Owner: Scrin + Location: 58,79 + Actor606: swal + Owner: Scrin + Location: 59,79 + Actor607: swal + Owner: Scrin + Location: 57,79 + Actor608: swal + Owner: Scrin + Location: 54,79 + Actor609: swal + Owner: Scrin + Location: 58,78 + ScrinSilo1: silo.scrin + Owner: Scrin + Location: 55,76 + ScrinSilo3: silo.scrin + Owner: Scrin + Location: 56,77 + ScrinSilo2: silo.scrin + Owner: Scrin + Location: 57,76 + ScrinRef2: proc.scrin + Owner: Scrin + Location: 49,72 + Actor648: wsph + Owner: Scrin + Location: 88,27 + Actor651: port + Owner: Scrin + Location: 94,29 + Actor649: srep + Owner: Scrin + Location: 93,25 + Actor650: proc.scrin + Owner: Scrin + Location: 94,20 + SPowered1: scol + Owner: Scrin + Location: 42,69 + SPowered4: scol + Owner: Scrin + Location: 53,78 + SPowered2: scol + Owner: Scrin + Location: 42,78 + SPower3: rea2 + Owner: Scrin + Location: 68,89 + SPower2: rea2 + Owner: Scrin + Location: 65,89 + SPower1: reac + Owner: Scrin + Location: 63,89 + Actor647: swal + Owner: Scrin + Location: 63,88 + Actor654: swal + Owner: Scrin + Location: 62,88 + Actor655: swal + Owner: Scrin + Location: 62,89 + Actor656: swal + Owner: Scrin + Location: 62,90 + Actor657: swal + Owner: Scrin + Location: 62,91 + Actor658: swal + Owner: Scrin + Location: 62,92 + Actor659: swal + Owner: Scrin + Location: 64,92 + Actor660: swal + Owner: Scrin + Location: 63,92 + Actor661: swal + Owner: Scrin + Location: 65,92 + Actor662: swal + Owner: Scrin + Location: 67,92 + Actor663: swal + Owner: Scrin + Location: 66,92 + Actor664: swal + Owner: Scrin + Location: 68,92 + Actor665: swal + Owner: Scrin + Location: 69,92 + Actor666: swal + Owner: Scrin + Location: 70,92 + Actor667: swal + Owner: Scrin + Location: 71,92 + Actor668: swal + Owner: Scrin + Location: 71,91 + Actor669: swal + Owner: Scrin + Location: 71,90 + Actor670: swal + Owner: Scrin + Location: 71,89 + Actor671: swal + Owner: Scrin + Location: 71,88 + Actor672: swal + Owner: Scrin + Location: 69,88 + Actor673: swal + Owner: Scrin + Location: 70,88 + Actor674: swal + Owner: Scrin + Location: 65,88 + Actor675: swal + Owner: Scrin + Location: 64,88 + Actor676: swal + Owner: Scrin + Location: 66,88 + Actor677: swal + Owner: Scrin + Location: 67,88 + Actor678: swal + Owner: Scrin + Location: 68,88 + Actor679: ptur + Owner: Scrin + Location: 68,87 + TurretFacing: 176 + Actor681: split2 + Owner: Neutral + Location: 36,69 + Actor680: scrinflora5 + Owner: Neutral + Location: 40,85 + Actor682: scrinflora2 + Owner: Neutral + Location: 45,84 + Actor683: scrinflora3 + Owner: Neutral + Location: 46,91 + Actor684: scrinflora7 + Owner: Neutral + Location: 53,95 + Actor685: scrinflora1 + Owner: Neutral + Location: 59,87 + Actor686: scrinflora2 + Owner: Neutral + Location: 65,85 + Actor687: scrinflora14 + Owner: Neutral + Location: 55,94 + Actor688: scrinflora12 + Owner: Neutral + Location: 39,85 + Actor689: scrinflora9 + Owner: Neutral + Location: 35,94 + Actor690: scrinflora10 + Owner: Neutral + Location: 46,84 + Actor691: scrinflora11 + Owner: Neutral + Location: 56,95 + Actor692: scrinflora14 + Owner: Neutral + Location: 58,87 + Actor693: scrinflora13 + Owner: Neutral + Location: 60,78 + SPowered3: scol + Owner: Scrin + Location: 52,71 + Actor695: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 38,75 + Actor696: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 38,87 + Actor697: s1 + Owner: Scrin + SubCell: 3 + Location: 38,90 + Facing: 118 + Actor698: s3 + Owner: Scrin + SubCell: 3 + Location: 40,89 + Facing: 245 + Actor699: seek + Owner: Scrin + Location: 46,81 + Facing: 602 + Actor700: seek + Owner: Scrin + Location: 39,73 + Facing: 384 + Actor701: seek + Owner: Scrin + Location: 39,78 + Facing: 341 + Actor702: s1 + Owner: Scrin + SubCell: 3 + Location: 51,80 + Facing: 507 + Actor703: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 43,81 + Actor704: s1 + Owner: Scrin + SubCell: 3 + Location: 52,81 + Facing: 594 + Actor705: s3 + Owner: Scrin + SubCell: 3 + Location: 47,83 + Facing: 618 + PlayerStart: waypoint + Owner: Neutral + Location: 17,13 + Actor707: n1 + Owner: GDI + SubCell: 1 + Facing: 512 + Location: 14,14 + Actor708: n1 + Owner: GDI + SubCell: 4 + Facing: 512 + Location: 14,14 + Actor709: n1 + Owner: GDI + SubCell: 5 + Facing: 512 + Location: 14,14 + Actor710: n1 + Owner: GDI + SubCell: 2 + Facing: 512 + Location: 14,14 + Actor711: n1 + Owner: GDI + SubCell: 1 + Facing: 512 + Location: 20,14 + Actor712: n1 + Owner: GDI + SubCell: 4 + Facing: 512 + Location: 20,14 + Actor713: n1 + Owner: GDI + SubCell: 5 + Facing: 512 + Location: 20,14 + Actor714: n1 + Owner: GDI + SubCell: 2 + Facing: 512 + Location: 20,14 + Actor717: xo + Owner: GDI + Location: 14,16 + Facing: 512 + Actor718: xo + Owner: GDI + Location: 20,16 + Facing: 512 + NormalEasyOnlyUnit1: xo + Owner: GDI + Location: 17,16 + Facing: 512 + Actor715: n3 + Owner: GDI + SubCell: 1 + Facing: 512 + Location: 16,13 + Actor716: n3 + Owner: GDI + SubCell: 2 + Facing: 512 + Location: 16,13 + NormalEasyOnlyUnit2: medi + Owner: GDI + SubCell: 2 + Location: 16,14 + Facing: 512 + Actor721: medi + Owner: GDI + SubCell: 1 + Facing: 512 + Location: 16,14 + Actor722: n3 + Owner: GDI + SubCell: 1 + Facing: 512 + Location: 18,13 + Actor723: n3 + Owner: GDI + SubCell: 2 + Facing: 512 + Location: 18,13 + Actor724: medi + Owner: GDI + SubCell: 2 + Location: 18,14 + Facing: 512 + NormalEasyOnlyUnit3: medi + Owner: GDI + SubCell: 1 + Location: 18,14 + Facing: 512 + Actor652: gscr + Owner: Scrin + SubCell: 3 + Location: 47,22 + Facing: 214 + HardOnlyUnit2: gscr + Owner: Scrin + SubCell: 3 + Location: 49,21 + Facing: 253 + HardOnlyUnit1: gscr + Owner: Scrin + SubCell: 3 + Location: 10,34 + Facing: 880 + Actor726: gscr + Owner: Scrin + SubCell: 3 + Location: 14,38 + Facing: 0 + Actor727: s1 + Owner: Scrin + SubCell: 3 + Location: 50,33 + Facing: 1023 + Actor728: s1 + Owner: Scrin + SubCell: 3 + Location: 52,37 + Facing: 1023 + Actor729: intl + Owner: Scrin + Location: 10,51 + Facing: 0 + Actor730: s1 + Owner: Scrin + SubCell: 3 + Location: 8,52 + Facing: 1023 + Actor731: s1 + Owner: Scrin + SubCell: 3 + Location: 12,52 + Facing: 1023 + Actor732: corr + Owner: Scrin + Location: 35,54 + Facing: 927 + ScrinAttack1: waypoint + Owner: Neutral + Location: 90,43 + ScrinAttack2: waypoint + Owner: Neutral + Location: 74,52 + ScrinAttack3: waypoint + Owner: Neutral + Location: 65,77 + ScrinAttack4: waypoint + Owner: Neutral + Location: 20,71 + ScrinRef1: proc.scrin + Owner: Scrin + Location: 44,70 + SPowered5: shar + Owner: Scrin + Location: 47,69 + TurretFacing: 192 + Reveal1: waypoint + Owner: Neutral + Location: 41,73 + Reveal2: waypoint + Owner: Neutral + Location: 49,79 + BlobPatrol1: waypoint + Owner: Neutral + Location: 12,63 + BlobPatrol4: waypoint + Owner: Neutral + Location: 48,38 + BlobPatrol6: waypoint + Owner: Neutral + Location: 52,22 + BlobPatrol8: waypoint + Owner: Neutral + Location: 31,25 + BlobPatrol10: waypoint + Owner: Neutral + Location: 10,27 + BlobPatrol2: waypoint + Owner: Neutral + Location: 28,58 + BlobPatrol3: waypoint + Owner: Neutral + Location: 42,50 + BlobPatrol5: waypoint + Owner: Neutral + Location: 53,26 + BlobPatrol7: waypoint + Owner: Neutral + Location: 45,21 + BlobPatrol9: waypoint + Owner: Neutral + Location: 20,24 + BlobPatrol11: waypoint + Owner: Neutral + Location: 9,44 + BlobPatrolB1: waypoint + Owner: Neutral + Location: 105,81 + BlobPatrolB6: waypoint + Owner: Neutral + Location: 75,90 + BlobPatrolB2: waypoint + Owner: Neutral + Location: 104,64 + BlobPatrolB3: waypoint + Owner: Neutral + Location: 86,50 + BlobPatrolB5: waypoint + Owner: Neutral + Location: 63,66 + BlobPatrolB4: waypoint + Owner: Neutral + Location: 73,53 + Actor548: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 59,91 + Actor549: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 66,94 + Actor610: gscr + Owner: Scrin + SubCell: 3 + Location: 71,95 + Facing: 190 + Actor611: s1 + Owner: Scrin + SubCell: 3 + Location: 63,77 + Facing: 555 + Actor633: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 64,73 + Actor634: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 65,74 + Actor636: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 49,91 + Actor637: s1 + Owner: Scrin + SubCell: 3 + Location: 15,73 + Facing: 896 + Actor642: s1 + Owner: Scrin + SubCell: 3 + Location: 9,69 + Facing: 785 + Actor694: s1 + Owner: Scrin + SubCell: 3 + Location: 36,43 + Facing: 800 + Actor733: s1 + Owner: Scrin + SubCell: 3 + Location: 46,52 + Facing: 150 + Actor734: s1 + Owner: Scrin + SubCell: 3 + Location: 45,52 + Facing: 0 + Actor736: s1 + Owner: Scrin + SubCell: 3 + Facing: 816 + Location: 33,53 + Actor735: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 41,90 + Actor737: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 58,90 + Actor738: s4 + Owner: Scrin + SubCell: 3 + Location: 38,56 + Facing: 95 + Actor739: gdrn + Owner: GDI + Location: 15,15 + Facing: 512 + Actor740: gdrn + Owner: GDI + Facing: 512 + Location: 19,15 + ScrinAttack2b: waypoint + Owner: Neutral + Location: 41,45 + Actor550: gscr + Owner: Scrin + SubCell: 3 + Location: 11,70 + Facing: 919 + HardOnlyUnit5: gscr + Owner: Scrin + SubCell: 3 + Location: 13,73 + Facing: 0 + Actor553: camera + Owner: Scrin + Location: 60,68 + Actor635: camera + Owner: Scrin + Location: 65,79 + Actor638: camera + Owner: Scrin + Location: 35,82 + Actor639: camera + Owner: Scrin + Location: 36,52 + Actor640: camera + Owner: Scrin + Location: 26,61 + Actor641: camera + Owner: Scrin + Location: 75,53 + Actor653: mast + Owner: Scrin + SubCell: 3 + Location: 81,29 + Facing: 539 + TibSpawn1: waypoint + Owner: Neutral + Location: 1,1 + TibSpawn2: waypoint + Owner: Neutral + Location: 37,1 + BlobExtraPatrol1: waypoint + Owner: Neutral + Location: 26,75 + BlobExtraPatrol2: waypoint + Owner: Neutral + Location: 54,83 + BlobExtraPatrol3: waypoint + Owner: Neutral + Location: 69,80 + BlobExtraPatrol4: waypoint + Owner: Neutral + Location: 76,94 + BlobExtraPatrol5: waypoint + Owner: Neutral + Location: 39,94 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|missions/main-campaign/ca31-foothold/foothold-rules.yaml, ca|rules/custom/coop-rules.yaml, foothold-coop-rules.yaml + +Sequences: ca|missions/main-campaign/ca31-foothold/foothold-sequences.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/coop-campaign/ca32-convergence-coop/convergence-coop-rules.yaml b/mods/ca/missions/coop-campaign/ca32-convergence-coop/convergence-coop-rules.yaml new file mode 100644 index 0000000000..307bf8971a --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca32-convergence-coop/convergence-coop-rules.yaml @@ -0,0 +1,6 @@ +World: + LuaScript: + Scripts: campaign.lua, coop.lua, ca|missions/main-campaign/ca32-convergence/convergence.lua, convergence-coop.lua + LobbyMissionInfo@InitialObjectives: + Prefix: Initial Objectives + Text: • Prevent Scrin fleet ships from breaking through. diff --git a/mods/ca/missions/coop-campaign/ca32-convergence-coop/convergence-coop.lua b/mods/ca/missions/coop-campaign/ca32-convergence-coop/convergence-coop.lua new file mode 100644 index 0000000000..500a00fd5c --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca32-convergence-coop/convergence-coop.lua @@ -0,0 +1,35 @@ + +SetupPlayers = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Multi2 = Player.GetPlayer("Multi2") + Multi3 = Player.GetPlayer("Multi3") + Multi4 = Player.GetPlayer("Multi4") + Multi5 = Player.GetPlayer("Multi5") + Scrin = Player.GetPlayer("Scrin") + GDI = Player.GetPlayer("GDI") + TibLifeforms = Player.GetPlayer("TibLifeforms") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = Utils.Where({ Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 }, function(p) return p ~= nil end) + MissionEnemies = { Scrin } + SinglePlayerPlayer = GDI + CoopInit() +end + +AfterWorldLoaded = function() + local firstActivePlayer = GetFirstActivePlayer() + TransferBaseToPlayer(SinglePlayerPlayer, firstActivePlayer) + StartCashSpread(3500) + + local x = 46 + Utils.Do(GetMcvPlayers(), function(p) + if p ~= firstActivePlayer then + Reinforcements.Reinforce(p, { "amcv" }, { CPos.New(x, 96), CPos.New(x, 91)}) + x = x + 2 + end + end) +end + +AfterTick = function() + +end diff --git a/mods/ca/missions/coop-campaign/ca32-convergence-coop/map.bin b/mods/ca/missions/coop-campaign/ca32-convergence-coop/map.bin new file mode 100644 index 0000000000..14424c5759 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca32-convergence-coop/map.bin differ diff --git a/mods/ca/missions/coop-campaign/ca32-convergence-coop/map.png b/mods/ca/missions/coop-campaign/ca32-convergence-coop/map.png new file mode 100644 index 0000000000..a12406d587 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca32-convergence-coop/map.png differ diff --git a/mods/ca/missions/coop-campaign/ca32-convergence-coop/map.yaml b/mods/ca/missions/coop-campaign/ca32-convergence-coop/map.yaml new file mode 100644 index 0000000000..0c2d4b0a8c --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca32-convergence-coop/map.yaml @@ -0,0 +1,1792 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 32: Convergence Co-op + +Author: Darkademic & Gandorques Hikla + +Tileset: TEMPERAT + +MapSize: 130,98 + +Bounds: 1,1,128,96 + +Visibility: Lobby + +Categories: Co-op Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: GDI, Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + PlayerReference@GDI: + Name: GDI + Faction: gdi + Color: F2CF74 + Allies: Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Creeps, TibLifeforms + PlayerReference@Scrin: + Name: Scrin + Bot: campaign + Faction: scrin + Color: 7700FF + Allies: TibLifeforms + Enemies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@TibLifeforms: + Name: TibLifeforms + NonCombatant: True + Faction: scrin + Color: 00FF00 + Allies: Scrin + Enemies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: F2CF74 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Creeps, TibLifeforms + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: EA7816 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Creeps, TibLifeforms + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: 0B7310 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Creeps, TibLifeforms + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: 0077D6 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Creeps, TibLifeforms + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: 82C900 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Creeps, TibLifeforms + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: 775A12 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Creeps, TibLifeforms + +Actors: + Actor0: sbag + Owner: GDI + Location: 42,89 + Actor1: sbag + Owner: GDI + Location: 43,89 + Actor2: sbag + Owner: GDI + Location: 44,89 + Actor3: sbag + Owner: GDI + Location: 41,89 + Actor4: sbag + Owner: GDI + Location: 41,88 + Actor5: sbag + Owner: GDI + Location: 41,87 + Actor6: sbag + Owner: GDI + Location: 41,85 + Actor7: sbag + Owner: GDI + Location: 41,86 + Actor8: sbag + Owner: GDI + Location: 41,84 + Actor9: sbag + Owner: GDI + Location: 41,80 + Actor10: sbag + Owner: GDI + Location: 41,79 + Actor11: sbag + Owner: GDI + Location: 41,78 + Actor12: sbag + Owner: GDI + Location: 41,77 + Actor13: sbag + Owner: GDI + Location: 41,76 + Actor14: sbag + Owner: GDI + Location: 41,75 + Actor15: sbag + Owner: GDI + Location: 41,74 + Actor16: sbag + Owner: GDI + Location: 41,73 + Actor17: sbag + Owner: GDI + Location: 42,73 + Actor18: sbag + Owner: GDI + Location: 43,73 + Actor19: sbag + Owner: GDI + Location: 44,73 + Actor20: sbag + Owner: GDI + Location: 49,73 + Actor21: sbag + Owner: GDI + Location: 50,73 + Actor22: sbag + Owner: GDI + Location: 52,73 + Actor23: sbag + Owner: GDI + Location: 51,73 + Actor24: sbag + Owner: GDI + Location: 53,73 + Actor25: sbag + Owner: GDI + Location: 54,73 + Actor27: sbag + Owner: GDI + Location: 55,73 + Actor28: sbag + Owner: GDI + Location: 56,73 + Actor29: sbag + Owner: GDI + Location: 57,73 + Actor31: sbag + Owner: GDI + Location: 58,73 + Actor32: sbag + Owner: GDI + Location: 59,73 + Actor33: sbag + Owner: GDI + Location: 60,73 + Actor34: sbag + Owner: GDI + Location: 60,74 + Actor35: sbag + Owner: GDI + Location: 38,73 + Actor36: sbag + Owner: GDI + Location: 38,74 + Actor37: sbag + Owner: GDI + Location: 37,73 + Actor38: sbag + Owner: GDI + Location: 36,73 + Actor41: atwr + Owner: GDI + Location: 50,74 + Actor42: atwr + Owner: GDI + Location: 43,74 + Actor43: gtwr + Owner: GDI + Location: 44,72 + Actor44: gtwr + Owner: GDI + Location: 49,72 + Actor45: afac + Owner: GDI + Location: 49,81 + Actor46: barb + Owner: GDI + Location: 49,70 + Actor47: barb + Owner: GDI + Location: 50,70 + Actor48: barb + Owner: GDI + Location: 51,70 + Actor49: barb + Owner: GDI + Location: 44,70 + Actor50: barb + Owner: GDI + Location: 43,70 + Actor51: barb + Owner: GDI + Location: 36,70 + Actor52: barb + Owner: GDI + Location: 37,70 + Actor53: barb + Owner: GDI + Location: 38,70 + Actor54: barb + Owner: GDI + Location: 55,68 + Actor55: barb + Owner: GDI + Location: 56,68 + Actor56: barb + Owner: GDI + Location: 55,69 + Actor57: barb + Owner: GDI + Location: 57,68 + Actor58: barb + Owner: GDI + Location: 58,68 + Actor59: barb + Owner: GDI + Location: 58,69 + Actor60: barb + Owner: GDI + Location: 36,69 + Actor61: barb + Owner: GDI + Location: 34,69 + Actor62: barb + Owner: GDI + Location: 35,69 + Actor63: barb + Owner: GDI + Location: 34,70 + Actor64: barb + Owner: GDI + Location: 33,70 + Actor65: barb + Owner: GDI + Location: 59,69 + Actor66: barb + Owner: GDI + Location: 42,70 + Actor67: gtwr + Owner: GDI + Location: 35,70 + Actor68: gtwr + Owner: GDI + Location: 56,69 + Actor69: proc.td + Owner: GDI + Location: 43,84 + Actor70: weap.td + Owner: GDI + Location: 43,78 + Actor72: cram + Owner: GDI + Location: 59,74 + Actor73: cram + Owner: GDI + Location: 37,74 + Actor74: sbag + Owner: GDI + Location: 36,74 + Actor75: sbag + Owner: GDI + Location: 58,74 + Actor78: nuk2 + Owner: GDI + Location: 48,85 + Actor79: nuk2 + Owner: GDI + Location: 50,85 + Actor80: nuk2 + Owner: GDI + Location: 52,85 + Actor81: silo.td + Owner: GDI + Location: 42,88 + Actor84: split2 + Owner: Neutral + Location: 34,86 + Actor85: split2 + Owner: Neutral + Location: 31,80 + Actor86: split3 + Owner: Neutral + Location: 29,89 + PlayerStart: waypoint + Owner: Neutral + Location: 47,75 + Actor87: gtwr + Owner: GDI + Location: 30,57 + Actor88: gtwr + Owner: GDI + Location: 42,56 + Actor89: barb + Owner: GDI + Location: 42,55 + Actor90: barb + Owner: GDI + Location: 43,55 + Actor91: barb + Owner: GDI + Location: 43,56 + Actor93: barb + Owner: GDI + Location: 41,55 + Actor94: barb + Owner: GDI + Location: 41,56 + Actor96: barb + Owner: GDI + Location: 29,56 + Actor97: barb + Owner: GDI + Location: 29,57 + Actor98: barb + Owner: GDI + Location: 30,56 + Actor99: barb + Owner: GDI + Location: 31,56 + Actor100: barb + Owner: GDI + Location: 31,57 + Actor101: barb + Owner: GDI + Location: 31,58 + Actor95: barb + Owner: GDI + Location: 41,57 + Actor102: barb + Owner: GDI + Location: 33,52 + Actor103: barb + Owner: GDI + Location: 34,52 + Actor104: barb + Owner: GDI + Location: 36,56 + Actor105: barb + Owner: GDI + Location: 37,56 + Actor106: sbag + Owner: GDI + Location: 51,61 + Actor107: sbag + Owner: GDI + Location: 52,61 + Actor108: sbag + Owner: GDI + Location: 52,62 + Actor109: sbag + Owner: GDI + Location: 50,61 + Actor110: sbag + Owner: GDI + Location: 58,60 + Actor111: sbag + Owner: GDI + Location: 59,60 + Actor112: sbag + Owner: GDI + Location: 60,60 + Actor113: sbag + Owner: GDI + Location: 24,61 + Actor114: sbag + Owner: GDI + Location: 25,61 + Actor115: sbag + Owner: GDI + Location: 26,61 + Actor116: sbag + Owner: GDI + Location: 27,61 + Actor117: sbag + Owner: GDI + Location: 27,62 + Actor118: n1 + Owner: GDI + Location: 26,62 + SubCell: 3 + Facing: 856 + Actor119: n1 + Owner: GDI + SubCell: 3 + Location: 36,57 + Facing: 0 + Actor120: n1 + Owner: GDI + SubCell: 3 + Location: 28,58 + Facing: 919 + Actor121: n1 + Owner: GDI + SubCell: 3 + Location: 43,57 + Facing: 214 + Actor122: n1 + Owner: GDI + SubCell: 3 + Location: 37,57 + Facing: 0 + Actor123: n1 + Owner: GDI + SubCell: 3 + Location: 59,61 + Facing: 0 + Actor124: n1 + Owner: GDI + Location: 58,61 + SubCell: 3 + Facing: 0 + Actor125: n1 + Owner: GDI + Location: 59,61 + SubCell: 1 + Facing: 0 + Actor127: n1 + Owner: GDI + Location: 51,62 + SubCell: 1 + Facing: 0 + Actor126: n3 + Owner: GDI + SubCell: 3 + Location: 59,62 + Facing: 777 + Actor128: n3 + Owner: GDI + SubCell: 3 + Location: 42,58 + Facing: 0 + Actor129: n3 + Owner: GDI + SubCell: 3 + Location: 29,59 + Facing: 872 + Actor130: n3 + Owner: GDI + SubCell: 3 + Location: 25,63 + Facing: 0 + Actor131: syrd.gdi + Owner: GDI + Location: 62,77 + Actor132: pt2 + Owner: GDI + Location: 71,82 + Facing: 0 + Actor134: pt2 + Owner: GDI + Location: 84,82 + Facing: 0 + Actor133: dd2 + Owner: GDI + Facing: 0 + Location: 78,84 + Actor135: tbcl + Owner: TibLifeforms + Facing: 384 + Location: 120,84 + Actor136: tbcl + Owner: TibLifeforms + Facing: 384 + Location: 114,78 + Actor137: tbcl + Owner: TibLifeforms + Facing: 384 + Location: 122,70 + Actor138: tbcl + Owner: TibLifeforms + Facing: 384 + Location: 113,65 + Actor139: tbcl + Owner: TibLifeforms + Facing: 384 + Location: 117,67 + Actor140: tbcl + Owner: TibLifeforms + Facing: 384 + Location: 122,56 + Actor141: tbcl + Owner: TibLifeforms + Facing: 384 + Location: 115,50 + Actor142: tbcl + Owner: TibLifeforms + Facing: 384 + Location: 120,44 + Actor143: tbcl + Owner: TibLifeforms + Facing: 384 + Location: 119,40 + Actor144: tbcl + Owner: TibLifeforms + Facing: 384 + Location: 110,35 + Actor145: tbcl + Owner: TibLifeforms + Facing: 384 + Location: 115,90 + Actor146: tbcl + Owner: TibLifeforms + Facing: 384 + Location: 123,30 + Actor147: tbcl + Owner: TibLifeforms + Facing: 384 + Location: 116,24 + Actor148: tbcl + Owner: TibLifeforms + Facing: 384 + Location: 110,17 + Actor149: tbcl + Owner: TibLifeforms + Facing: 384 + Location: 115,9 + Actor150: tbcl + Owner: TibLifeforms + Facing: 384 + Location: 121,14 + Actor152: tbcl + Owner: TibLifeforms + Facing: 384 + Location: 103,6 + Actor153: tbcl + Owner: TibLifeforms + Facing: 384 + Location: 108,47 + Actor154: split2 + Owner: Neutral + Location: 112,10 + Actor155: split2 + Owner: Neutral + Location: 121,23 + Actor156: split2 + Owner: Neutral + Location: 121,50 + Actor157: split2 + Owner: Neutral + Location: 111,58 + Actor158: split2 + Owner: Neutral + Location: 115,61 + Actor159: split2 + Owner: Neutral + Location: 111,86 + Actor160: split2 + Owner: Neutral + Location: 122,77 + Actor161: scrinflora4 + Owner: Neutral + Location: 45,63 + Actor162: scrinflora8 + Owner: Neutral + Location: 50,55 + Actor163: scrinflora6 + Owner: Neutral + Location: 59,49 + Actor164: scrinflora2 + Owner: Neutral + Location: 65,45 + Actor165: scrinflora12 + Owner: Neutral + Location: 40,42 + Actor166: scrinflora14 + Owner: Neutral + Location: 49,35 + Actor167: scrinflora2 + Owner: Neutral + Location: 33,40 + Actor168: scrinflora8 + Owner: Neutral + Location: 27,38 + Actor169: scrinflora1 + Owner: Neutral + Location: 22,31 + Actor170: scrinflora7 + Owner: Neutral + Location: 9,41 + Actor171: scrinflora4 + Owner: Neutral + Location: 12,63 + Actor172: scrinflora3 + Owner: Neutral + Location: 26,94 + Actor173: scrinflora3 + Owner: Neutral + Location: 47,23 + Actor174: scrinflora5 + Owner: Neutral + Location: 39,26 + Actor175: scrinflora5 + Owner: Neutral + Location: 25,10 + Actor176: scrinflora5 + Owner: Neutral + Location: 11,40 + Actor177: scrinflora5 + Owner: Neutral + Location: 6,59 + Actor178: scrinflora13 + Owner: Neutral + Location: 7,58 + Actor179: scrinflora13 + Owner: Neutral + Location: 28,95 + Actor180: scrinflora13 + Owner: Neutral + Location: 61,71 + Actor181: scrinflora14 + Owner: Neutral + Location: 61,48 + Actor182: scrinflora10 + Owner: Neutral + Location: 62,49 + Actor183: scrinflora11 + Owner: Neutral + Location: 50,56 + Actor184: scrinflora7 + Owner: Neutral + Location: 58,37 + Actor185: scrinflora14 + Owner: Neutral + Location: 60,36 + Actor186: scrinflora13 + Owner: Neutral + Location: 61,38 + Actor187: scrinflora10 + Owner: Neutral + Location: 61,37 + Actor188: scrinflora11 + Owner: Neutral + Location: 56,38 + Actor189: scrinflora1 + Owner: Neutral + Location: 63,50 + Actor190: scrinflora14 + Owner: Neutral + Location: 38,37 + Actor191: scrinflora11 + Owner: Neutral + Location: 37,37 + Actor192: scrinflora10 + Owner: Neutral + Location: 34,40 + Actor193: scrinflora9 + Owner: Neutral + Location: 28,39 + Actor194: scrinflora9 + Owner: Neutral + Location: 12,41 + Actor195: scrinflora12 + Owner: Neutral + Location: 4,40 + Actor196: scrinflora12 + Owner: Neutral + Location: 22,32 + Actor197: scrinflora12 + Owner: Neutral + Location: 27,8 + Actor198: scrinflora11 + Owner: Neutral + Location: 27,9 + Actor199: scrinflora13 + Owner: Neutral + Location: 21,13 + Actor200: scrinflora1 + Owner: Neutral + Location: 13,15 + Actor201: scrinflora6 + Owner: Neutral + Location: 12,8 + Actor202: scrinflora4 + Owner: Neutral + Location: 48,31 + Actor203: scrinflora7 + Owner: Neutral + Location: 11,9 + Actor204: scrinflora10 + Owner: Neutral + Location: 13,9 + Actor205: scrinflora11 + Owner: Neutral + Location: 10,10 + Actor206: scrinflora2 + Owner: Neutral + Location: 7,13 + Actor207: scrinflora13 + Owner: Neutral + Location: 4,8 + Actor208: scrinflora13 + Owner: Neutral + Location: 13,30 + Actor209: scrinflora1 + Owner: Neutral + Location: 7,53 + Actor210: scrinflora12 + Owner: Neutral + Location: 3,72 + Actor211: scrinflora14 + Owner: Neutral + Location: 4,67 + Actor212: scrinflora11 + Owner: Neutral + Location: 4,68 + Actor213: scrinflora11 + Owner: Neutral + Location: 5,85 + Actor214: scrinflora12 + Owner: Neutral + Location: 6,84 + Actor215: scrinflora13 + Owner: Neutral + Location: 15,78 + Actor216: scrinflora8 + Owner: Neutral + Location: 56,94 + Actor219: scrinflora2 + Owner: Neutral + Location: 51,9 + Actor220: scrinflora7 + Owner: Neutral + Location: 51,7 + Actor221: scrinflora13 + Owner: Neutral + Location: 52,8 + Actor222: scrinflora11 + Owner: Neutral + Location: 50,9 + Actor223: scrinflora12 + Owner: Neutral + Location: 57,10 + Actor224: scrinflora13 + Owner: Neutral + Location: 53,13 + Actor225: scrinflora10 + Owner: Neutral + Location: 52,13 + Actor226: scrinflora11 + Owner: Neutral + Location: 56,15 + Actor227: scrinflora1 + Owner: Neutral + Location: 37,21 + Actor228: scrinflora14 + Owner: Neutral + Location: 38,21 + Actor229: scrinflora2 + Owner: Neutral + Location: 102,29 + Actor230: scrinflora3 + Owner: Neutral + Location: 103,28 + Actor231: scrinflora5 + Owner: Neutral + Location: 124,36 + Actor232: scrinflora12 + Owner: Neutral + Location: 123,36 + Actor233: scrinflora11 + Owner: Neutral + Location: 122,35 + Actor234: scrinflora5 + Owner: Neutral + Location: 104,62 + Actor235: scrinflora3 + Owner: Neutral + Location: 125,64 + Actor236: scrinflora1 + Owner: Neutral + Location: 105,67 + Actor237: scrinflora14 + Owner: Neutral + Location: 103,67 + Actor238: scrinflora7 + Owner: Neutral + Location: 100,55 + Actor239: scrinflora2 + Owner: Neutral + Location: 105,70 + Actor240: scrinflora8 + Owner: Neutral + Location: 105,66 + Actor241: scrinflora8 + Owner: Neutral + Location: 103,77 + Actor242: scrinflora7 + Owner: Neutral + Location: 101,89 + Actor243: scrinflora4 + Owner: Neutral + Location: 97,83 + Actor244: scrinflora8 + Owner: Neutral + Location: 124,90 + Actor245: scrinflora5 + Owner: Neutral + Location: 120,94 + Actor246: scrinflora1 + Owner: Neutral + Location: 127,89 + Actor247: scrinflora11 + Owner: Neutral + Location: 126,90 + Actor248: scrinflora13 + Owner: Neutral + Location: 122,95 + Actor249: scrinflora11 + Owner: Neutral + Location: 110,74 + Actor250: scrinflora13 + Owner: Neutral + Location: 114,72 + Actor251: scrinflora8 + Owner: Neutral + Location: 110,42 + Actor252: scrinflora1 + Owner: Neutral + Location: 109,41 + Actor253: scrinflora4 + Owner: Neutral + Location: 99,42 + Actor254: scrinflora8 + Owner: Neutral + Location: 97,37 + Actor255: scrinflora2 + Owner: Neutral + Location: 95,34 + Actor256: scrinflora7 + Owner: Neutral + Location: 94,11 + Actor257: scrinflora2 + Owner: Neutral + Location: 93,8 + Actor258: scrinflora1 + Owner: Neutral + Location: 99,3 + Actor259: scrinflora1 + Owner: Neutral + Location: 105,22 + Actor260: scrinflora1 + Owner: Neutral + Location: 126,19 + Actor261: scrinflora8 + Owner: Neutral + Location: 124,14 + Actor262: scrinflora12 + Owner: Neutral + Location: 125,15 + Actor263: scrinflora14 + Owner: Neutral + Location: 120,8 + Actor264: scrinflora14 + Owner: Neutral + Location: 121,7 + Actor265: scrinflora9 + Owner: Neutral + Location: 121,8 + Actor266: scrinflora11 + Owner: Neutral + Location: 122,6 + Actor267: scrinflora6 + Owner: Neutral + Location: 116,6 + Actor268: scrinflora5 + Owner: Neutral + Location: 104,18 + Actor269: scrinflora11 + Owner: Neutral + Location: 103,18 + Actor270: scrinflora12 + Owner: Neutral + Location: 100,19 + Actor271: scrinflora12 + Owner: Neutral + Location: 91,28 + Actor272: scrinflora14 + Owner: Neutral + Location: 103,29 + Actor273: scrinflora12 + Owner: Neutral + Location: 96,37 + Actor274: scrinflora13 + Owner: Neutral + Location: 96,33 + Actor275: scrinflora1 + Owner: Neutral + Location: 99,43 + Actor276: scrinflora10 + Owner: Neutral + Location: 100,43 + Actor277: scrinflora11 + Owner: Neutral + Location: 100,46 + Actor278: scrinflora13 + Owner: Neutral + Location: 100,45 + Actor279: scrinflora14 + Owner: Neutral + Location: 105,61 + Actor280: scrinflora10 + Owner: Neutral + Location: 104,67 + Actor281: scrinflora12 + Owner: Neutral + Location: 33,51 + Actor282: scrinflora1 + Owner: Neutral + Location: 26,50 + Actor283: scrinflora10 + Owner: Neutral + Location: 42,52 + Actor284: scrinflora11 + Owner: Neutral + Location: 37,62 + Actor285: scrinflora13 + Owner: Neutral + Location: 60,66 + Actor286: scrinflora14 + Owner: Neutral + Location: 29,64 + Actor287: scrinflora12 + Owner: Neutral + Location: 19,64 + Actor288: scrinflora10 + Owner: Neutral + Location: 25,73 + Actor289: scrinflora8 + Owner: Neutral + Location: 14,76 + Actor290: scrinflora1 + Owner: Neutral + Location: 43,96 + Actor291: scrinflora2 + Owner: Neutral + Location: 19,85 + Actor292: scrinflora11 + Owner: Neutral + Location: 19,86 + Actor293: scrinflora13 + Owner: Neutral + Location: 17,87 + Actor294: scrinflora14 + Owner: Neutral + Location: 18,18 + Actor295: scrinflora14 + Owner: Neutral + Location: 4,25 + Actor296: scrinflora10 + Owner: Neutral + Location: 5,25 + Actor297: disr + Owner: GDI + Location: 43,68 + Facing: 0 + Actor298: disr + Owner: GDI + Location: 52,68 + Facing: 0 + Actor299: mtnk + Owner: GDI + Location: 37,58 + Facing: 0 + Actor300: mtnk + Owner: GDI + Location: 56,61 + Facing: 0 + Actor301: mtnk + Owner: GDI + Facing: 384 + Location: 43,81 + Actor302: mtnk + Owner: GDI + Location: 45,81 + Facing: 618 + Actor303: tbcl + Owner: TibLifeforms + Facing: 384 + Location: 102,70 + Actor304: tbcl + Owner: TibLifeforms + Facing: 384 + Location: 105,58 + Actor305: tbcl + Owner: TibLifeforms + Facing: 384 + Location: 101,24 + Actor306: tbcl + Owner: TibLifeforms + Facing: 384 + Location: 117,32 + LSpawn1: waypoint + Owner: Neutral + Location: 9,1 + LSpawn2: waypoint + Owner: Neutral + Location: 29,1 + LSpawn3: waypoint + Owner: Neutral + Location: 45,1 + MSpawn2: waypoint + Owner: Neutral + Location: 78,1 + MSpawn1: waypoint + Owner: Neutral + Location: 63,1 + RSpawn1: waypoint + Owner: Neutral + Location: 102,1 + RSpawn2: waypoint + Owner: Neutral + Location: 119,1 + Actor309: n1 + Owner: GDI + SubCell: 3 + Location: 42,69 + Facing: 30 + Actor310: n1 + Owner: GDI + SubCell: 3 + Location: 37,71 + Facing: 0 + Actor311: n1 + Owner: GDI + SubCell: 3 + Location: 32,70 + Facing: 0 + Actor312: n1 + Owner: GDI + SubCell: 3 + Location: 48,69 + Facing: 0 + Actor313: n1 + Owner: GDI + SubCell: 3 + Location: 53,71 + Facing: 0 + Actor314: n1 + Owner: GDI + SubCell: 3 + Location: 50,72 + Facing: 0 + Actor315: n1 + Owner: GDI + Location: 59,68 + SubCell: 3 + Facing: 0 + Actor316: n1 + Owner: GDI + SubCell: 3 + Location: 59,70 + Facing: 0 + Actor317: n3 + Owner: GDI + Location: 43,72 + SubCell: 3 + Facing: 0 + Actor318: n3 + Owner: GDI + SubCell: 3 + Location: 57,69 + Facing: 0 + Actor319: n3 + Owner: GDI + SubCell: 3 + Location: 34,71 + Facing: 4 + MapBottomLeft: waypoint + Owner: Neutral + Location: 1,96 + MapBottomRight: waypoint + Owner: Neutral + Location: 128,96 + MAttackRally1: waypoint + Owner: Neutral + Location: 73,58 + LAttackRally3b: waypoint + Owner: Neutral + Location: 55,58 + LAttackRally2b: waypoint + Owner: Neutral + Location: 35,54 + LAttackRally1b: waypoint + Owner: Neutral + Location: 18,71 + Actor327: split2 + Owner: Neutral + Location: 12,47 + Actor328: split2 + Owner: Neutral + Location: 15,53 + Actor329: split2 + Owner: Neutral + Location: 57,27 + Actor330: split2 + Owner: Neutral + Location: 55,23 + LAttackRally1a: waypoint + Owner: Neutral + Location: 9,24 + LAttackRally2a: waypoint + Owner: Neutral + Location: 29,30 + LAttackRally3a: waypoint + Owner: Neutral + Location: 53,26 + ScrinSpawnerL1: hiddenspawner + Owner: Scrin + Location: 15,1 + ScrinSpawnerL2: hiddenspawner + Owner: Scrin + Location: 23,1 + ScrinSpawnerL3: hiddenspawner + Owner: Scrin + Location: 35,1 + ScrinSpawnerL4: hiddenspawner + Owner: Scrin + Location: 41,1 + ScrinSpawnerM1: hiddenspawner + Owner: Scrin + Location: 66,1 + ScrinSpawnerM2: hiddenspawner + Owner: Scrin + Location: 76,1 + MAttackRally2b: waypoint + Owner: Neutral + Location: 87,67 + MAttackRally2a: waypoint + Owner: Neutral + Location: 86,37 + AcrossRiver: waypoint + Owner: Neutral + Location: 114,81 + Actor343: vulc + Owner: GDI + Location: 25,62 + Facing: 126 + Actor344: vulc + Owner: GDI + Location: 58,62 + Facing: 919 + Actor340: pyle + Owner: GDI + Location: 52,74 + Actor341: hq + Owner: GDI + Location: 55,74 + Actor342: rep + Owner: GDI + Location: 53,81 + Actor345: tbcl + Owner: TibLifeforms + Facing: 384 + Location: 116,57 + Actor346: tbcl + Owner: TibLifeforms + Facing: 384 + Location: 107,81 + Actor349: scol + Owner: Scrin + Location: 40,14 + Actor354: swal + Owner: Scrin + Location: 4,14 + Actor355: swal + Owner: Scrin + Location: 5,14 + Actor356: swal + Owner: Scrin + Location: 6,14 + Actor357: swal + Owner: Scrin + Location: 6,15 + Actor358: swal + Owner: Scrin + Location: 6,16 + Actor360: swal + Owner: Scrin + Location: 4,16 + Actor361: swal + Owner: Scrin + Location: 5,16 + Actor362: swal + Owner: Scrin + Location: 14,11 + Actor363: swal + Owner: Scrin + Location: 14,13 + Actor364: swal + Owner: Scrin + Location: 15,13 + Actor365: swal + Owner: Scrin + Location: 16,13 + Actor366: swal + Owner: Scrin + Location: 16,12 + Actor367: swal + Owner: Scrin + Location: 16,11 + Actor368: swal + Owner: Scrin + Location: 15,11 + Actor369: swal + Owner: Scrin + Location: 14,12 + Actor394: swal + Owner: Scrin + Location: 39,13 + Actor395: swal + Owner: Scrin + Location: 39,14 + Actor396: swal + Owner: Scrin + Location: 39,15 + Actor397: swal + Owner: Scrin + Location: 40,15 + Actor398: swal + Owner: Scrin + Location: 41,15 + Actor399: swal + Owner: Scrin + Location: 41,14 + Actor400: swal + Owner: Scrin + Location: 41,13 + Actor401: swal + Owner: Scrin + Location: 40,13 + Actor410: scol + Owner: Scrin + Location: 15,12 + Actor411: swal + Owner: Scrin + Location: 19,6 + Actor412: swal + Owner: Scrin + Location: 20,6 + Actor413: swal + Owner: Scrin + Location: 21,6 + Actor414: swal + Owner: Scrin + Location: 19,7 + Actor415: scol + Owner: Scrin + Location: 20,7 + Actor416: swal + Owner: Scrin + Location: 21,7 + Actor417: swal + Owner: Scrin + Location: 19,8 + Actor418: swal + Owner: Scrin + Location: 20,8 + Actor419: swal + Owner: Scrin + Location: 21,8 + Actor420: swal + Owner: Scrin + Location: 32,6 + Actor421: swal + Owner: Scrin + Location: 33,6 + Actor422: swal + Owner: Scrin + Location: 34,6 + Actor423: swal + Owner: Scrin + Location: 32,7 + Actor424: scol + Owner: Scrin + Location: 33,7 + Actor425: swal + Owner: Scrin + Location: 34,7 + Actor426: swal + Owner: Scrin + Location: 32,8 + Actor427: swal + Owner: Scrin + Location: 33,8 + Actor428: swal + Owner: Scrin + Location: 34,8 + Actor402: swal + Owner: Scrin + Location: 45,6 + Actor403: swal + Owner: Scrin + Location: 46,6 + Actor404: swal + Owner: Scrin + Location: 47,6 + Actor405: swal + Owner: Scrin + Location: 45,7 + Actor406: scol + Owner: Scrin + Location: 46,7 + Actor407: swal + Owner: Scrin + Location: 47,7 + Actor408: swal + Owner: Scrin + Location: 45,8 + Actor409: swal + Owner: Scrin + Location: 46,8 + Actor429: swal + Owner: Scrin + Location: 47,8 + Actor430: swal + Owner: Scrin + Location: 26,13 + Actor431: swal + Owner: Scrin + Location: 27,13 + Actor432: swal + Owner: Scrin + Location: 28,13 + Actor433: swal + Owner: Scrin + Location: 26,14 + Actor434: scol + Owner: Scrin + Location: 27,14 + Actor435: swal + Owner: Scrin + Location: 28,14 + Actor436: swal + Owner: Scrin + Location: 26,15 + Actor437: swal + Owner: Scrin + Location: 27,15 + Actor438: swal + Owner: Scrin + Location: 28,15 + Actor439: scrinflora1 + Owner: Neutral + Location: 38,11 + Actor440: scrinflora8 + Owner: Neutral + Location: 37,12 + Actor441: shar + Owner: Scrin + Location: 15,10 + Actor442: shar + Owner: Scrin + Location: 20,5 + Actor443: shar + Owner: Scrin + Location: 33,5 + Actor444: shar + Owner: Scrin + Location: 46,5 + Actor445: shar + Owner: Scrin + Location: 40,12 + Actor446: shar + Owner: Scrin + Location: 27,12 + Actor447: shar + Owner: Scrin + Location: 5,15 + Actor448: swal + Owner: Scrin + Location: 45,5 + Actor449: swal + Owner: Scrin + Location: 45,4 + Actor450: swal + Owner: Scrin + Location: 46,4 + Actor451: swal + Owner: Scrin + Location: 47,4 + Actor452: swal + Owner: Scrin + Location: 47,5 + Actor453: swal + Owner: Scrin + Location: 34,4 + Actor454: swal + Owner: Scrin + Location: 33,4 + Actor455: swal + Owner: Scrin + Location: 32,4 + Actor456: swal + Owner: Scrin + Location: 32,5 + Actor457: swal + Owner: Scrin + Location: 34,5 + Actor458: swal + Owner: Scrin + Location: 39,12 + Actor459: swal + Owner: Scrin + Location: 39,11 + Actor460: swal + Owner: Scrin + Location: 40,11 + Actor461: swal + Owner: Scrin + Location: 41,11 + Actor462: swal + Owner: Scrin + Location: 41,12 + Actor463: swal + Owner: Scrin + Location: 28,12 + Actor464: swal + Owner: Scrin + Location: 28,11 + Actor465: swal + Owner: Scrin + Location: 27,11 + Actor466: swal + Owner: Scrin + Location: 26,11 + Actor467: swal + Owner: Scrin + Location: 26,12 + Actor468: swal + Owner: Scrin + Location: 19,5 + Actor469: swal + Owner: Scrin + Location: 19,4 + Actor470: swal + Owner: Scrin + Location: 20,4 + Actor471: swal + Owner: Scrin + Location: 21,4 + Actor472: swal + Owner: Scrin + Location: 21,5 + Actor473: swal + Owner: Scrin + Location: 4,15 + Actor474: swal + Owner: Scrin + Location: 14,10 + Actor475: swal + Owner: Scrin + Location: 14,9 + Actor476: swal + Owner: Scrin + Location: 15,9 + Actor477: swal + Owner: Scrin + Location: 16,10 + Actor478: swal + Owner: Scrin + Location: 16,9 + Actor479: swal + Owner: Scrin + Location: 6,17 + Actor480: swal + Owner: Scrin + Location: 6,18 + Actor481: swal + Owner: Scrin + Location: 5,18 + Actor482: swal + Owner: Scrin + Location: 4,18 + Actor483: swal + Owner: Scrin + Location: 4,17 + Actor484: scol + Owner: Scrin + Location: 5,17 + Actor485: swal + Owner: Scrin + Location: 3,16 + Actor486: swal + Owner: Scrin + Location: 3,15 + Actor487: swal + Owner: Scrin + Location: 3,17 + Actor488: swal + Owner: Scrin + Location: 48,7 + Actor489: swal + Owner: Scrin + Location: 48,6 + Actor490: swal + Owner: Scrin + Location: 48,5 + Actor491: swal + Owner: Scrin + Location: 42,12 + Actor492: swal + Owner: Scrin + Location: 42,13 + Actor493: swal + Owner: Scrin + Location: 42,14 + Actor494: swal + Owner: Scrin + Location: 29,13 + Actor495: swal + Owner: Scrin + Location: 29,12 + Actor496: swal + Owner: Scrin + Location: 29,14 + Actor497: swal + Owner: Scrin + Location: 25,14 + Actor498: swal + Owner: Scrin + Location: 25,13 + Actor499: swal + Owner: Scrin + Location: 25,12 + Actor500: swal + Owner: Scrin + Location: 17,11 + Actor501: swal + Owner: Scrin + Location: 17,12 + Actor502: swal + Owner: Scrin + Location: 17,10 + Actor503: swal + Owner: Scrin + Location: 18,6 + Actor504: swal + Owner: Scrin + Location: 18,7 + Actor505: swal + Owner: Scrin + Location: 18,5 + Actor506: swal + Owner: Scrin + Location: 22,5 + Actor507: swal + Owner: Scrin + Location: 22,6 + Actor508: swal + Owner: Scrin + Location: 22,7 + Actor509: swal + Owner: Scrin + Location: 31,7 + Actor510: swal + Owner: Scrin + Location: 31,6 + Actor511: swal + Owner: Scrin + Location: 31,5 + Actor512: swal + Owner: Scrin + Location: 35,5 + Actor513: swal + Owner: Scrin + Location: 35,6 + Actor514: swal + Owner: Scrin + Location: 35,7 + Actor515: swal + Owner: Scrin + Location: 44,7 + Actor516: swal + Owner: Scrin + Location: 44,6 + Actor517: swal + Owner: Scrin + Location: 44,5 + RAttackRally1: waypoint + Owner: Neutral + Location: 121,33 + RAttackRally3: waypoint + Owner: Neutral + Location: 118,76 + RAttackRally2: waypoint + Owner: Neutral + Location: 107,61 + Actor519: scol + Owner: Scrin + Location: 74,12 + Actor521: scol + Owner: Scrin + Location: 72,11 + Actor522: scol + Owner: Scrin + Location: 75,11 + Actor518: seek + Owner: Scrin + Location: 80,10 + Facing: 467 + Actor520: seek + Owner: Scrin + Facing: 384 + Location: 85,9 + Actor523: seek + Owner: Scrin + Location: 62,10 + Facing: 626 + Actor524: seek + Owner: Scrin + Location: 66,11 + Facing: 515 + Actor525: ruin + Owner: Scrin + Location: 83,8 + Facing: 459 + Actor527: ruin + Owner: Scrin + Facing: 602 + Location: 64,8 + Actor526: devo + Owner: Scrin + Location: 84,5 + Facing: 428 + Actor528: devo + Owner: Scrin + Location: 62,6 + Facing: 618 + Actor529: lace + Owner: Scrin + Facing: 384 + Location: 101,10 + Actor530: lace + Owner: Scrin + Location: 120,11 + Facing: 436 + Actor531: lace + Owner: Scrin + Facing: 384 + Location: 124,17 + Actor532: lace + Owner: Scrin + Location: 114,21 + Facing: 674 + Actor533: seek + Owner: Scrin + Facing: 384 + Location: 97,8 + Actor534: camera + Owner: Scrin + Location: 65,64 + Actor535: camera + Owner: Scrin + Location: 76,69 + Actor536: camera + Owner: Scrin + Location: 88,63 + Actor537: camera + Owner: Scrin + Location: 52,59 + Actor538: camera + Owner: Scrin + Location: 39,58 + Actor539: camera + Owner: Scrin + Location: 28,61 + Actor540: camera + Owner: Scrin + Location: 17,62 + Actor541: camera + Owner: Scrin + Location: 4,63 + Actor542: camera + Owner: Scrin + Location: 28,44 + Actor543: camera + Owner: Scrin + Location: 56,44 + Actor544: camera + Owner: Scrin + Location: 41,35 + Actor545: camera + Owner: Scrin + Location: 46,67 + Actor546: camera + Owner: Scrin + Location: 54,79 + Sensor3: msar + Owner: GDI + Location: 82,87 + DeployState: Deployed + Facing: 384 + Sensor1: msar + Owner: GDI + Location: 21,72 + DeployState: Deployed + Facing: 384 + Sensor2: msar + Owner: GDI + Location: 47,64 + DeployState: Deployed + Facing: 384 + Actor547: n1 + Owner: GDI + SubCell: 3 + Facing: 919 + Location: 22,70 + Actor548: n3 + Owner: GDI + SubCell: 3 + Location: 19,74 + Facing: 174 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|missions/main-campaign/ca32-convergence/convergence-rules.yaml, ca|rules/custom/coop-rules.yaml, convergence-coop-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/coop-campaign/ca33-spearhead-coop/map.bin b/mods/ca/missions/coop-campaign/ca33-spearhead-coop/map.bin new file mode 100644 index 0000000000..e87a980e9b Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca33-spearhead-coop/map.bin differ diff --git a/mods/ca/missions/coop-campaign/ca33-spearhead-coop/map.png b/mods/ca/missions/coop-campaign/ca33-spearhead-coop/map.png new file mode 100644 index 0000000000..dd0635af2f Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca33-spearhead-coop/map.png differ diff --git a/mods/ca/missions/coop-campaign/ca33-spearhead-coop/map.yaml b/mods/ca/missions/coop-campaign/ca33-spearhead-coop/map.yaml new file mode 100644 index 0000000000..7c2e828b01 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca33-spearhead-coop/map.yaml @@ -0,0 +1,1708 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 33: Spearhead Co-op + +Author: Darkademic & Gandorques Hikla + +Tileset: TEMPERAT + +MapSize: 82,114 + +Bounds: 1,1,80,112 + +Visibility: Lobby + +Categories: Co-op Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: GDI, Scrin, Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + PlayerReference@GDI: + Name: GDI + Faction: gdi + Color: F2CF74 + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Nod, Creeps + PlayerReference@Scrin: + Name: Scrin + Bot: campaign + Faction: scrin + Color: 7700FF + Enemies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Nod, Creeps + PlayerReference@Nod: + Name: Nod + Bot: campaign + Faction: nod + Color: FE1100 + Enemies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Scrin, Creeps + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: F2CF74 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Nod, Creeps + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: EA7816 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Nod, Creeps + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: 0B7310 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Nod, Creeps + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: 0077D6 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Nod, Creeps + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: 82C900 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Nod, Creeps + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: 775A12 + LockColor: True + Allies: GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Nod, Creeps + +Actors: + Shard3: shar + Owner: Scrin + Location: 5,17 + TurretFacing: 872 + Shard4: shar + Owner: Scrin + Location: 19,12 + TurretFacing: 192 + Shard6: shar + Owner: Scrin + Location: 28,13 + TurretFacing: 192 + Shard5: shar + Owner: Scrin + Location: 23,19 + TurretFacing: 192 + Shard1: shar + Owner: Scrin + Location: 65,9 + TurretFacing: 192 + Shard2: shar + Owner: Scrin + Location: 64,18 + TurretFacing: 192 + Actor22: shar + Owner: Scrin + Location: 7,42 + TurretFacing: 832 + Actor23: shar + Owner: Scrin + Location: 2,41 + TurretFacing: 856 + Actor24: shar + Owner: Scrin + Location: 76,48 + Actor25: shar + Owner: Scrin + Location: 75,44 + Actor26: shar + Owner: Scrin + Location: 76,40 + Actor27: shar + Owner: Scrin + Location: 60,42 + Actor29: shar + Owner: Scrin + Location: 55,47 + Actor30: shar + Owner: Scrin + Location: 62,50 + Actor31: shar + Owner: Scrin + Location: 59,57 + Actor32: shar + Owner: Scrin + Location: 46,51 + Actor33: shar + Owner: Scrin + Location: 51,50 + Actor36: rea2 + Owner: Scrin + Location: 56,43 + Actor37: rea2 + Owner: Scrin + Location: 59,44 + Actor38: rea2 + Owner: Scrin + Location: 58,47 + Actor39: rea2 + Owner: Scrin + Location: 53,49 + Actor40: rea2 + Owner: Scrin + Location: 56,50 + Actor41: rea2 + Owner: Scrin + Location: 59,51 + Actor42: ptur + Owner: Scrin + Location: 47,56 + TurretFacing: 364 + Actor43: ptur + Owner: Scrin + Location: 54,59 + TurretFacing: 586 + Actor28: shar + Owner: Scrin + Location: 57,42 + Actor69: brik + Owner: Nod + Location: 53,78 + Actor70: brik + Owner: Nod + Location: 54,78 + Actor71: brik + Owner: Nod + Location: 55,78 + Actor72: brik + Owner: Nod + Location: 56,78 + Actor73: brik + Owner: Nod + Location: 57,78 + Actor88: brik + Owner: Nod + Location: 58,78 + Actor89: brik + Owner: Nod + Location: 53,79 + Actor90: brik + Owner: Nod + Location: 54,79 + Actor91: obli + Owner: Nod + Location: 56,79 + Actor92: brik + Owner: Nod + Location: 57,79 + Actor93: brik + Owner: Nod + Location: 58,79 + Actor94: brik + Owner: Nod + Location: 53,80 + Actor95: brik + Owner: Nod + Location: 54,80 + Actor103: brik + Owner: Nod + Location: 60,81 + Actor104: brik + Owner: Nod + Location: 61,81 + Actor105: nsam + Owner: Nod + Location: 47,82 + Actor106: brik + Owner: Nod + Location: 60,82 + Actor107: brik + Owner: Nod + Location: 61,82 + Actor110: brik + Owner: Nod + Location: 45,83 + Actor111: brik + Owner: Nod + Location: 46,83 + Actor112: obli + Owner: Nod + Location: 60,83 + Actor113: brik + Owner: Nod + Location: 61,83 + Actor114: brik + Owner: Nod + Location: 45,84 + Actor115: brik + Owner: Nod + Location: 46,84 + Actor116: brik + Owner: Nod + Location: 60,84 + Actor117: brik + Owner: Nod + Location: 61,84 + Actor118: brik + Owner: Nod + Location: 44,85 + Actor119: brik + Owner: Nod + Location: 45,85 + Actor120: brik + Owner: Nod + Location: 60,85 + Actor121: brik + Owner: Nod + Location: 61,85 + Actor122: brik + Owner: Nod + Location: 44,86 + Actor123: chain + Owner: Nod + Location: 52,86 + Actor124: chain + Owner: Nod + Location: 53,86 + Actor125: chain + Owner: Nod + Location: 54,86 + Actor126: chain + Owner: Nod + Location: 55,86 + Actor127: chain + Owner: Nod + Location: 56,86 + Actor128: chain + Owner: Nod + Location: 57,86 + Actor129: brik + Owner: Nod + Location: 60,86 + Actor130: brik + Owner: Nod + Location: 44,87 + Actor131: chain + Owner: Nod + Location: 52,87 + Actor132: nsam + Owner: Nod + Location: 53,87 + NodCommsCenter: hq + Owner: Nod + Location: 55,87 + Actor134: chain + Owner: Nod + Location: 57,87 + Actor135: brik + Owner: Nod + Location: 60,87 + Actor136: brik + Owner: Nod + Location: 44,88 + Actor137: brik + Owner: Nod + Location: 45,88 + Actor138: chain + Owner: Nod + Location: 51,88 + Actor139: chain + Owner: Nod + Location: 52,88 + Actor140: chain + Owner: Nod + Location: 57,88 + Actor141: brik + Owner: Nod + Location: 60,88 + Actor142: brik + Owner: Nod + Location: 44,89 + Actor143: brik + Owner: Nod + Location: 45,89 + Actor144: chain + Owner: Nod + Location: 51,89 + Actor145: chain + Owner: Nod + Location: 57,89 + Actor146: brik + Owner: Nod + Location: 60,89 + Actor147: chain + Owner: Nod + Location: 51,90 + Actor148: chain + Owner: Nod + Location: 56,90 + Actor149: chain + Owner: Nod + Location: 57,90 + Actor150: brik + Owner: Nod + Location: 60,90 + Actor151: chain + Owner: Nod + Location: 51,91 + Actor152: chain + Owner: Nod + Location: 52,91 + Actor153: chain + Owner: Nod + Location: 55,91 + Actor154: chain + Owner: Nod + Location: 56,91 + Actor155: brik + Owner: Nod + Location: 60,91 + Actor156: brik + Owner: Nod + Location: 60,92 + Actor157: brik + Owner: Nod + Location: 59,93 + Actor158: brik + Owner: Nod + Location: 60,93 + Actor159: brik + Owner: Nod + Location: 59,94 + Actor160: brik + Owner: Nod + Location: 60,94 + Actor161: nsam + Owner: Nod + Location: 47,96 + Actor162: brik + Owner: Nod + Location: 43,92 + Actor163: brik + Owner: Nod + Location: 42,92 + Actor164: brik + Owner: Nod + Location: 41,92 + Actor165: brik + Owner: Nod + Location: 43,93 + Actor166: brik + Owner: Nod + Location: 42,93 + Actor167: brik + Owner: Nod + Location: 40,92 + Actor168: brik + Owner: Nod + Location: 40,93 + Actor169: brik + Owner: Nod + Location: 39,93 + Actor170: brik + Owner: Nod + Location: 39,92 + Actor171: brik + Owner: Nod + Location: 34,92 + Actor172: brik + Owner: Nod + Location: 34,93 + Actor173: brik + Owner: Nod + Location: 35,93 + Actor174: brik + Owner: Nod + Location: 35,92 + Actor175: brik + Owner: Nod + Location: 34,94 + Actor176: brik + Owner: Nod + Location: 34,95 + Actor177: brik + Owner: Nod + Location: 34,96 + Actor178: brik + Owner: Nod + Location: 33,97 + Actor179: brik + Owner: Nod + Location: 34,97 + Actor180: brik + Owner: Nod + Location: 33,98 + Actor181: brik + Owner: Nod + Location: 33,99 + Actor182: brik + Owner: Nod + Location: 33,100 + Actor183: brik + Owner: Nod + Location: 34,100 + Actor184: brik + Owner: Nod + Location: 34,101 + Actor185: brik + Owner: Nod + Location: 34,102 + Actor186: brik + Owner: Nod + Location: 34,103 + Actor187: brik + Owner: Nod + Location: 34,104 + Actor190: brik + Owner: Nod + Location: 32,112 + Actor191: brik + Owner: Nod + Location: 32,111 + Actor192: brik + Owner: Nod + Location: 33,112 + Actor193: brik + Owner: Nod + Location: 33,111 + Actor195: brik + Owner: Nod + Location: 34,112 + Actor196: brik + Owner: Nod + Location: 33,110 + Actor197: brik + Owner: Nod + Location: 33,109 + Actor198: brik + Owner: Nod + Location: 33,108 + Actor194: brik + Owner: Nod + Location: 33,107 + Actor199: brik + Owner: Nod + Location: 34,107 + Actor200: brik + Owner: Nod + Location: 34,106 + Actor201: brik + Owner: Nod + Location: 34,105 + Actor188: brik + Owner: Nod + Location: 35,112 + Actor189: brik + Owner: Nod + Location: 36,112 + Actor202: brik + Owner: Nod + Location: 37,112 + Actor203: brik + Owner: Nod + Location: 39,112 + Actor204: brik + Owner: Nod + Location: 38,112 + Actor205: brik + Owner: Nod + Location: 39,111 + Actor206: brik + Owner: Nod + Location: 38,111 + Actor207: brik + Owner: Nod + Location: 45,100 + Actor208: brik + Owner: Nod + Location: 45,101 + Actor209: brik + Owner: Nod + Location: 45,102 + Actor210: brik + Owner: Nod + Location: 46,102 + Actor211: brik + Owner: Nod + Location: 46,103 + Actor212: brik + Owner: Nod + Location: 45,103 + Actor213: brik + Owner: Nod + Location: 44,100 + Actor214: brik + Owner: Nod + Location: 44,99 + Actor215: brik + Owner: Nod + Location: 44,98 + Actor218: brik + Owner: Nod + Location: 43,94 + Actor219: brik + Owner: Nod + Location: 44,94 + Actor220: brik + Owner: Nod + Location: 44,95 + Actor221: brik + Owner: Nod + Location: 44,96 + Actor222: brik + Owner: Nod + Location: 44,97 + Actor216: nuk2 + Owner: Nod + Location: 34,109 + Actor217: nuk2 + Owner: Nod + Location: 36,109 + Actor223: nuk2 + Owner: Nod + Location: 35,105 + Actor224: nuk2 + Owner: Nod + Location: 37,105 + Actor225: nuk2 + Owner: Nod + Location: 35,102 + Actor226: nuk2 + Owner: Nod + Location: 37,102 + Actor227: nuk2 + Owner: Nod + Location: 35,99 + Actor228: nuk2 + Owner: Nod + Location: 37,99 + Actor229: weap.td + Owner: Nod + Location: 42,101 + Actor230: proc.td + Owner: Nod + Location: 68,94 + Actor231: proc.td + Owner: Nod + Location: 65,100 + Actor232: hand + Owner: Nod + Location: 42,96 + Actor233: hpad.td + Owner: Nod + Location: 51,99 + Actor234: hpad.td + Owner: Nod + Location: 55,102 + Actor236: rep + Owner: Nod + Location: 56,98 + Actor237: nsam + Owner: Nod + Location: 71,94 + Actor238: nsam + Owner: Nod + Location: 46,104 + Actor239: obli + Owner: Nod + Location: 41,93 + Actor240: ltur + Owner: Nod + Location: 40,91 + Actor241: ltur + Owner: Nod + Location: 59,78 + Actor242: ltur + Owner: Nod + Location: 72,99 + Actor243: ltur + Owner: Nod + Location: 64,106 + Actor244: ltur + Owner: Nod + Location: 64,92 + Actor245: rmbc + Owner: Nod + Location: 41,91 + SubCell: 3 + Facing: 0 + Actor246: rmbc + Owner: Nod + SubCell: 3 + Location: 36,92 + Facing: 983 + Actor247: rmbc + Owner: Nod + SubCell: 3 + Location: 38,93 + Facing: 174 + Actor248: rmbc + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 53,89 + Actor249: rmbc + Owner: Nod + SubCell: 3 + Location: 59,79 + Facing: 935 + Actor250: rmbc + Owner: Nod + Location: 62,81 + SubCell: 3 + Facing: 697 + Actor251: rmbc + Owner: Nod + Location: 61,80 + SubCell: 3 + Facing: 824 + Actor252: split2 + Owner: Neutral + Location: 68,84 + Actor253: split2 + Owner: Neutral + Location: 72,108 + Actor254: split2 + Owner: Neutral + Location: 76,104 + Actor255: split2 + Owner: Neutral + Location: 74,85 + Actor257: hpad.td + Owner: Nod + Location: 54,95 + Actor258: silo.td + Owner: Nod + Location: 41,109 + Actor259: silo.td + Owner: Nod + Location: 42,107 + Actor260: silo.td + Owner: Nod + Location: 71,92 + Actor261: silo.td + Owner: Nod + Location: 66,93 + Actor262: obli + Owner: Nod + Location: 35,94 + Actor264: obli + Owner: Nod + Location: 45,86 + Actor263: n3c + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 56,92 + Actor265: n3c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 57,95 + Actor266: n3c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 48,93 + Actor267: n3c + Owner: Nod + SubCell: 3 + Location: 48,89 + Facing: 610 + Actor268: n3c + Owner: Nod + Facing: 384 + Location: 48,89 + SubCell: 1 + Actor269: n3c + Owner: Nod + SubCell: 3 + Location: 47,88 + Facing: 47 + Actor270: n3c + Owner: Nod + SubCell: 3 + Location: 51,83 + Facing: 729 + Actor271: n3c + Owner: Nod + SubCell: 3 + Location: 58,83 + Facing: 0 + Actor272: n3c + Owner: Nod + SubCell: 3 + Location: 54,81 + Facing: 793 + Actor273: n3c + Owner: Nod + SubCell: 3 + Location: 49,81 + Facing: 777 + Actor274: n3c + Owner: Nod + Facing: 384 + Location: 43,95 + SubCell: 3 + Actor275: n3c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 42,94 + Actor276: n3c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 42,99 + Actor277: n3c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 35,97 + Actor278: n3c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 36,95 + Actor279: n3c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 48,98 + Actor280: n3c + Owner: Nod + SubCell: 3 + Location: 51,95 + Facing: 547 + Actor281: reap + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 48,87 + Actor282: reap + Owner: Nod + SubCell: 3 + Location: 66,95 + Facing: 384 + Actor283: reap + Owner: Nod + Location: 65,106 + SubCell: 3 + Facing: 384 + Actor284: reap + Owner: Nod + SubCell: 3 + Location: 62,111 + Facing: 182 + Actor285: gun.nod + Owner: Nod + Location: 13,95 + TurretFacing: 967 + Actor286: gun.nod + Owner: Nod + Location: 25,93 + Actor287: gun.nod + Owner: Nod + Location: 13,107 + TurretFacing: 0 + Actor290: nsam + Owner: Nod + Location: 61,86 + Actor291: n1 + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 14,96 + Actor292: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 22,96 + Actor293: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 26,94 + Actor294: n1 + Owner: Nod + Facing: 384 + Location: 26,94 + SubCell: 1 + Actor295: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 27,93 + Actor296: n1 + Owner: Nod + Facing: 384 + Location: 35,96 + SubCell: 3 + Actor297: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 36,97 + Actor298: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 52,93 + Actor299: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 56,95 + Actor300: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 65,93 + Actor301: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 56,80 + Actor302: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 57,80 + Actor303: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 58,76 + Actor304: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 61,77 + Actor305: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 68,77 + Actor306: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 65,105 + Actor307: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 61,105 + Actor308: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 54,110 + Actor309: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 49,106 + Actor310: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 40,108 + Actor311: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 27,103 + Actor312: ftnk + Owner: Nod + Location: 18,97 + Facing: 0 + Actor313: mlrs + Owner: Nod + Location: 51,81 + Facing: 1023 + Actor314: bike + Owner: Nod + Facing: 384 + Location: 39,83 + Actor315: bike + Owner: Nod + Location: 40,85 + Facing: 277 + Actor316: bggy + Owner: Nod + Facing: 384 + Location: 15,98 + Actor317: ltnk + Owner: Nod + Location: 40,103 + Facing: 261 + Actor318: ltnk + Owner: Nod + Location: 43,104 + Facing: 515 + Actor319: ltnk + Owner: Nod + Location: 41,102 + Facing: 126 + Actor320: scrinflora1 + Owner: Neutral + Location: 9,12 + Actor321: scrinflora1 + Owner: Neutral + Location: 38,12 + Actor322: scrinflora1 + Owner: Neutral + Location: 51,14 + Actor323: scrinflora1 + Owner: Neutral + Location: 61,10 + Actor324: scrinflora1 + Owner: Neutral + Location: 68,44 + Actor325: scrinflora1 + Owner: Neutral + Location: 47,48 + Actor326: scrinflora1 + Owner: Neutral + Location: 17,50 + Actor327: scrinflora1 + Owner: Neutral + Location: 2,38 + Actor328: scrinflora1 + Owner: Neutral + Location: 8,78 + Actor329: scrinflora1 + Owner: Neutral + Location: 35,73 + Actor330: scrinflora1 + Owner: Neutral + Location: 28,98 + Actor331: scrinflora1 + Owner: Neutral + Location: 4,96 + Actor332: scrinflora1 + Owner: Neutral + Location: 46,111 + Actor333: scrinflora1 + Owner: Neutral + Location: 75,94 + Actor334: scrinflora1 + Owner: Neutral + Location: 78,74 + Actor335: scrinflora2 + Owner: Neutral + Location: 80,73 + Actor336: scrinflora2 + Owner: Neutral + Location: 17,111 + Actor337: scrinflora2 + Owner: Neutral + Location: 2,92 + Actor338: scrinflora2 + Owner: Neutral + Location: 5,63 + Actor339: scrinflora2 + Owner: Neutral + Location: 50,70 + Actor340: scrinflora2 + Owner: Neutral + Location: 67,65 + Actor341: scrinflora2 + Owner: Neutral + Location: 68,52 + Actor342: scrinflora2 + Owner: Neutral + Location: 50,36 + Actor343: scrinflora2 + Owner: Neutral + Location: 24,15 + Actor344: scrinflora2 + Owner: Neutral + Location: 4,5 + Actor345: scrinflora2 + Owner: Neutral + Location: 15,35 + Actor346: scrinflora5 + Owner: Neutral + Location: 13,35 + Actor347: scrinflora5 + Owner: Neutral + Location: 17,3 + Actor348: scrinflora5 + Owner: Neutral + Location: 33,13 + Actor349: scrinflora5 + Owner: Neutral + Location: 21,24 + Actor350: scrinflora5 + Owner: Neutral + Location: 26,47 + Actor351: scrinflora5 + Owner: Neutral + Location: 50,47 + Actor352: scrinflora5 + Owner: Neutral + Location: 76,37 + Actor353: scrinflora5 + Owner: Neutral + Location: 79,65 + Actor354: scrinflora5 + Owner: Neutral + Location: 54,77 + Actor355: scrinflora5 + Owner: Neutral + Location: 28,83 + Actor356: scrinflora5 + Owner: Neutral + Location: 23,102 + Actor357: scrinflora5 + Owner: Neutral + Location: 6,111 + Actor358: scrinflora5 + Owner: Neutral + Location: 2,80 + Actor359: scrinflora5 + Owner: Neutral + Location: 11,63 + Actor360: scrinflora6 + Owner: Neutral + Location: 22,57 + Actor361: scrinflora3 + Owner: Neutral + Location: 42,44 + Actor362: scrinflora3 + Owner: Neutral + Location: 27,3 + Actor363: scrinflora3 + Owner: Neutral + Location: 3,25 + Actor364: scrinflora3 + Owner: Neutral + Location: 8,39 + Actor365: scrinflora3 + Owner: Neutral + Location: 3,106 + Actor366: scrinflora3 + Owner: Neutral + Location: 78,112 + Actor367: scrinflora3 + Owner: Neutral + Location: 67,69 + Actor368: scrinflora4 + Owner: Neutral + Location: 43,42 + Actor369: scrinflora4 + Owner: Neutral + Location: 63,37 + Actor371: scrinflora4 + Owner: Neutral + Location: 40,4 + Actor372: scrinflora4 + Owner: Neutral + Location: 29,106 + Actor373: scrinflora7 + Owner: Neutral + Location: 32,82 + Actor374: scrinflora7 + Owner: Neutral + Location: 17,81 + Actor375: scrinflora7 + Owner: Neutral + Location: 5,79 + Actor376: scrinflora7 + Owner: Neutral + Location: 39,53 + Actor377: scrinflora7 + Owner: Neutral + Location: 78,63 + Actor378: scrinflora7 + Owner: Neutral + Location: 78,36 + Actor379: scrinflora7 + Owner: Neutral + Location: 50,34 + Actor380: scrinflora7 + Owner: Neutral + Location: 32,38 + Actor381: scrinflora7 + Owner: Neutral + Location: 2,2 + Actor382: scrinflora7 + Owner: Neutral + Location: 39,71 + Actor383: scrinflora8 + Owner: Neutral + Location: 17,48 + Actor384: scrinflora8 + Owner: Neutral + Location: 6,62 + Actor385: scrinflora8 + Owner: Neutral + Location: 11,26 + Actor386: scrinflora8 + Owner: Neutral + Location: 31,14 + Actor387: scrinflora8 + Owner: Neutral + Location: 32,2 + Actor388: scrinflora8 + Owner: Neutral + Location: 20,91 + Actor389: scrinflora8 + Owner: Neutral + Location: 2,74 + Actor390: scrinflora12 + Owner: Neutral + Location: 2,63 + Actor391: scrinflora12 + Owner: Neutral + Location: 41,75 + Actor392: scrinflora12 + Owner: Neutral + Location: 7,109 + Actor393: scrinflora12 + Owner: Neutral + Location: 50,103 + Actor394: scrinflora12 + Owner: Neutral + Location: 75,96 + Actor395: scrinflora12 + Owner: Neutral + Location: 75,72 + Actor396: scrinflora12 + Owner: Neutral + Location: 77,64 + Actor397: scrinflora12 + Owner: Neutral + Location: 78,47 + Actor398: scrinflora12 + Owner: Neutral + Location: 66,31 + Actor399: scrinflora12 + Owner: Neutral + Location: 64,43 + Actor400: scrinflora12 + Owner: Neutral + Location: 54,31 + Actor401: scrinflora13 + Owner: Neutral + Location: 72,29 + Actor402: scrinflora13 + Owner: Neutral + Location: 76,42 + Actor403: scrinflora13 + Owner: Neutral + Location: 66,66 + Actor404: scrinflora13 + Owner: Neutral + Location: 78,72 + Actor405: scrinflora13 + Owner: Neutral + Location: 31,104 + Actor406: scrinflora13 + Owner: Neutral + Location: 3,108 + Actor407: scrinflora13 + Owner: Neutral + Location: 6,94 + Actor408: scrinflora13 + Owner: Neutral + Location: 5,75 + Actor409: scrinflora13 + Owner: Neutral + Location: 16,82 + Actor410: scrinflora13 + Owner: Neutral + Location: 7,60 + Actor411: scrinflora13 + Owner: Neutral + Location: 25,47 + Actor412: scrinflora13 + Owner: Neutral + Location: 10,26 + Actor413: scrinflora13 + Owner: Neutral + Location: 19,4 + Actor414: scrinflora13 + Owner: Neutral + Location: 23,23 + Actor415: scrinflora12 + Owner: Neutral + Location: 18,9 + Actor416: scrinflora14 + Owner: Neutral + Location: 26,23 + Actor417: scrinflora14 + Owner: Neutral + Location: 4,37 + Actor418: scrinflora14 + Owner: Neutral + Location: 4,63 + Actor419: scrinflora14 + Owner: Neutral + Location: 1,73 + Actor420: scrinflora14 + Owner: Neutral + Location: 10,82 + Actor421: scrinflora14 + Owner: Neutral + Location: 6,93 + Actor422: scrinflora14 + Owner: Neutral + Location: 8,111 + Actor423: scrinflora14 + Owner: Neutral + Location: 18,112 + Actor424: scrinflora14 + Owner: Neutral + Location: 2,105 + Actor425: scrinflora14 + Owner: Neutral + Location: 45,111 + Actor426: scrinflora14 + Owner: Neutral + Location: 76,94 + Actor427: scrinflora14 + Owner: Neutral + Location: 79,73 + Actor428: scrinflora14 + Owner: Neutral + Location: 80,62 + Actor429: scrinflora14 + Owner: Neutral + Location: 66,69 + Actor430: scrinflora14 + Owner: Neutral + Location: 68,50 + Actor431: scrinflora14 + Owner: Neutral + Location: 61,33 + Actor432: scrinflora14 + Owner: Neutral + Location: 62,9 + Actor433: scrinflora14 + Owner: Neutral + Location: 49,36 + Actor434: scrinflora14 + Owner: Neutral + Location: 50,32 + Actor435: scrinflora14 + Owner: Neutral + Location: 32,36 + Actor436: scrinflora10 + Owner: Neutral + Location: 71,29 + Actor437: scrinflora10 + Owner: Neutral + Location: 67,35 + Actor438: scrinflora10 + Owner: Neutral + Location: 78,55 + Actor439: scrinflora10 + Owner: Neutral + Location: 76,77 + Actor440: scrinflora10 + Owner: Neutral + Location: 44,111 + Actor441: scrinflora10 + Owner: Neutral + Location: 12,111 + Actor442: scrinflora11 + Owner: Neutral + Location: 14,93 + Actor443: scrinflora11 + Owner: Neutral + Location: 22,85 + Actor444: scrinflora11 + Owner: Neutral + Location: 21,92 + Actor445: scrinflora11 + Owner: Neutral + Location: 3,92 + Actor446: scrinflora11 + Owner: Neutral + Location: 4,74 + Actor447: scrinflora11 + Owner: Neutral + Location: 6,80 + Actor448: scrinflora10 + Owner: Neutral + Location: 7,81 + Actor449: scrinflora10 + Owner: Neutral + Location: 20,79 + Actor450: scrinflora10 + Owner: Neutral + Location: 6,63 + Actor451: scrinflora10 + Owner: Neutral + Location: 24,56 + Actor453: scrinflora10 + Owner: Neutral + Location: 7,2 + Actor454: scrinflora10 + Owner: Neutral + Location: 4,14 + Actor455: scrinflora10 + Owner: Neutral + Location: 65,18 + Actor456: scrinflora10 + Owner: Neutral + Location: 65,44 + Actor457: gunw + Owner: Scrin + Facing: 384 + Location: 48,52 + Actor458: gunw + Owner: Scrin + Facing: 384 + Location: 58,57 + Actor459: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 47,51 + Actor460: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 46,53 + Actor461: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 60,54 + Actor462: s4 + Owner: Scrin + Facing: 384 + Location: 58,58 + SubCell: 3 + Actor463: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 57,55 + Actor464: s3 + Owner: Scrin + SubCell: 3 + Location: 57,46 + Facing: 229 + Actor465: s3 + Owner: Scrin + SubCell: 3 + Location: 62,48 + Facing: 824 + Actor466: s3 + Owner: Scrin + SubCell: 3 + Location: 58,54 + Facing: 634 + Actor467: afac + Owner: Nod + Location: 60,95 + Actor468: hpad.td + Owner: Nod + Location: 62,98 + Actor469: hpad.td + Owner: Nod + Location: 59,102 + PlayerStart: waypoint + Owner: Neutral + Location: 13,7 + Actor470: shar + Owner: Scrin + Location: 34,45 + Actor471: shar + Owner: Scrin + Location: 48,43 + Actor472: shar + Owner: Scrin + Location: 20,48 + CarryallDest: waypoint + Owner: Neutral + Location: 61,14 + CarryallSpawn: waypoint + Owner: Neutral + Location: 12,1 + Actor473: scrinflora4 + Owner: Neutral + Location: 6,24 + Actor474: scrinflora10 + Owner: Neutral + Location: 5,23 + Actor452: xo + Owner: GDI + Facing: 512 + Location: 11,4 + Actor475: xo + Owner: GDI + Facing: 512 + Location: 12,4 + Actor476: xo + Owner: GDI + Facing: 512 + Location: 13,4 + Actor477: xo + Owner: GDI + Facing: 512 + Location: 14,4 + Actor478: zrai + Owner: GDI + SubCell: 1 + Facing: 512 + Location: 11,6 + Actor479: zrai + Owner: GDI + SubCell: 2 + Facing: 512 + Location: 11,6 + Actor480: zrai + Owner: GDI + SubCell: 4 + Facing: 512 + Location: 11,6 + Actor481: zrai + Owner: GDI + SubCell: 5 + Facing: 512 + Location: 11,6 + Actor482: zrai + Owner: GDI + SubCell: 1 + Facing: 512 + Location: 14,6 + Actor483: zrai + Owner: GDI + SubCell: 2 + Facing: 512 + Location: 14,6 + Actor484: zrai + Owner: GDI + SubCell: 4 + Facing: 512 + Location: 14,6 + Actor485: zrai + Owner: GDI + SubCell: 5 + Facing: 512 + Location: 14,6 + Actor486: nsam + Owner: Nod + Location: 56,106 + Actor487: rmbc + Owner: Nod + SubCell: 3 + Location: 74,110 + Facing: 134 + Actor488: rmbc + Owner: Nod + SubCell: 3 + Location: 76,108 + Facing: 253 + Actor489: bh + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 65,94 + Actor490: bh + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 74,99 + Actor491: bh + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 52,92 + Actor492: bh + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 50,97 + Actor493: seek + Owner: Scrin + Facing: 384 + Location: 50,61 + Actor494: seek + Owner: Scrin + Facing: 384 + Location: 51,63 + Actor495: seek + Owner: Scrin + Location: 12,73 + Facing: 800 + Actor496: seek + Owner: Scrin + Location: 15,75 + Facing: 856 + Actor497: seek + Owner: Scrin + Location: 76,60 + Facing: 206 + Actor498: seek + Owner: Scrin + Location: 77,58 + Facing: 150 + Actor499: seek + Owner: Scrin + Location: 2,52 + Facing: 1023 + Actor500: seek + Owner: Scrin + Location: 3,50 + Facing: 1023 + Actor501: corr + Owner: Scrin + Location: 26,74 + Facing: 103 + Actor502: s4 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 29,65 + Actor503: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 28,64 + Actor504: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 30,65 + Actor505: bggy + Owner: Nod + Location: 60,100 + Facing: 642 + Actor506: bggy + Owner: Nod + Facing: 384 + Location: 54,101 + Actor507: ltnk + Owner: Nod + Location: 62,101 + Facing: 650 + Actor508: arty.nod + Owner: Nod + Location: 72,95 + Facing: 856 + Actor509: nsam + Owner: Nod + Location: 76,73 + Actor510: n3c + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 71,75 + Actor511: rmbc + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 78,85 + Actor512: nsam + Owner: Nod + Location: 7,97 + Actor513: nsam + Owner: Nod + Location: 23,99 + HardOnlyCyborg1: rmbc + Owner: Nod + SubCell: 3 + Location: 48,110 + Facing: 256 + HardOnlyCyborg2: rmbc + Owner: Nod + SubCell: 3 + Location: 48,109 + Facing: 256 + HardOnlyCyborg3: rmbc + Owner: Nod + SubCell: 3 + Location: 48,108 + Facing: 256 + HardOnlyCyborg4: rmbc + Owner: Nod + SubCell: 3 + Location: 48,107 + Facing: 256 + HardOnlyCyborg5: rmbc + Owner: Nod + SubCell: 3 + Location: 48,106 + Facing: 256 + HardOnlyCyborg6: rmbc + Owner: Nod + SubCell: 3 + Location: 53,93 + Facing: 384 + HardOnlyCyborg7: rmbc + Owner: Nod + Location: 54,93 + SubCell: 3 + Facing: 547 + HardOnlyCyborg8: rmbc + Owner: Nod + SubCell: 3 + Location: 55,93 + Facing: 618 + HardOnlyTripod: tpod + Owner: Scrin + Location: 52,54 + Facing: 384 + HardOnlyAvatar1: avtr + Owner: Nod + Location: 62,93 + Facing: 0 + HardOnlyAvatar2: avtr + Owner: Nod + Location: 70,99 + Facing: 666 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-coalitions.yaml, ca|missions/main-campaign/ca33-spearhead/spearhead-rules.yaml, ca|rules/custom/coop-rules.yaml, spearhead-coop-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/coop-campaign/ca33-spearhead-coop/spearhead-coop-rules.yaml b/mods/ca/missions/coop-campaign/ca33-spearhead-coop/spearhead-coop-rules.yaml new file mode 100644 index 0000000000..2d376d34eb --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca33-spearhead-coop/spearhead-coop-rules.yaml @@ -0,0 +1,6 @@ +World: + LuaScript: + Scripts: campaign.lua, coop.lua, ca|missions/main-campaign/ca33-spearhead/spearhead.lua, spearhead-coop.lua + LobbyMissionInfo@InitialObjectives: + Prefix: Initial Objectives + Text: • Locate and capture the Nod Communications Center. diff --git a/mods/ca/missions/coop-campaign/ca33-spearhead-coop/spearhead-coop.lua b/mods/ca/missions/coop-campaign/ca33-spearhead-coop/spearhead-coop.lua new file mode 100644 index 0000000000..67cfbb03bd --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca33-spearhead-coop/spearhead-coop.lua @@ -0,0 +1,40 @@ + +SetupPlayers = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Multi2 = Player.GetPlayer("Multi2") + Multi3 = Player.GetPlayer("Multi3") + Multi4 = Player.GetPlayer("Multi4") + Multi5 = Player.GetPlayer("Multi5") + GDI = Player.GetPlayer("GDI") + Scrin = Player.GetPlayer("Scrin") + Nod = Player.GetPlayer("Nod") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = Utils.Where({ Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 }, function(p) return p ~= nil end) + MissionEnemies = { Nod, Scrin } + SinglePlayerPlayer = GDI + CoopInit() +end + +AfterWorldLoaded = function() + StartCashSpread(3500) +end + +AfterTick = function() + +end + +InitMcv = function() + PlaySpeechNotificationToMissionPlayers("ReinforcementsArrived") + Notification("Reinforcements have arrived.") + local exitPath = { CarryallSpawn.Location } + local MCVIterator = 0 + if #MissionPlayers > 1 then + Tip("Building space on this island is limited. Let one player build a Naval Yard and transport your MCVs to the mainland.") + end + Utils.Do(GetMcvPlayers(), function(p) + local entryPath = { CarryallSpawn.Location, CarryallDest.Location + CVec.New((MCVIterator-3),(MCVIterator-3)) } + ReinforcementsCA.ReinforceWithTransport(p, "ocar.amcv", nil, entryPath, exitPath) + MCVIterator = MCVIterator + 2 + end) +end diff --git a/mods/ca/missions/coop-campaign/ca34-illumination-coop/illumination-coop-rules.yaml b/mods/ca/missions/coop-campaign/ca34-illumination-coop/illumination-coop-rules.yaml new file mode 100644 index 0000000000..e13eceff6a --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca34-illumination-coop/illumination-coop-rules.yaml @@ -0,0 +1,6 @@ +World: + LuaScript: + Scripts: campaign.lua, coop.lua, ca|missions/main-campaign/ca34-illumination/illumination.lua, illumination-coop.lua + LobbyMissionInfo@InitialObjectives: + Prefix: Initial Objectives + Text: • Find and recover six artifact fragments. diff --git a/mods/ca/missions/coop-campaign/ca34-illumination-coop/illumination-coop.lua b/mods/ca/missions/coop-campaign/ca34-illumination-coop/illumination-coop.lua new file mode 100644 index 0000000000..a7951097bb --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca34-illumination-coop/illumination-coop.lua @@ -0,0 +1,25 @@ + +SetupPlayers = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Multi2 = Player.GetPlayer("Multi2") + Multi3 = Player.GetPlayer("Multi3") + Multi4 = Player.GetPlayer("Multi4") + Multi5 = Player.GetPlayer("Multi5") + Scrin = Player.GetPlayer("Scrin") + Nod = Player.GetPlayer("Nod") + TibLifeforms = Player.GetPlayer("TibLifeforms") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = Utils.Where({ Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 }, function(p) return p ~= nil end) + MissionEnemies = { Scrin } + SinglePlayerPlayer = Nod + CoopInit() +end + +AfterWorldLoaded = function() + +end + +AfterTick = function() + +end diff --git a/mods/ca/missions/coop-campaign/ca34-illumination-coop/map.bin b/mods/ca/missions/coop-campaign/ca34-illumination-coop/map.bin new file mode 100644 index 0000000000..f76e307d35 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca34-illumination-coop/map.bin differ diff --git a/mods/ca/missions/coop-campaign/ca34-illumination-coop/map.png b/mods/ca/missions/coop-campaign/ca34-illumination-coop/map.png new file mode 100644 index 0000000000..dbf0a48f13 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca34-illumination-coop/map.png differ diff --git a/mods/ca/missions/coop-campaign/ca34-illumination-coop/map.yaml b/mods/ca/missions/coop-campaign/ca34-illumination-coop/map.yaml new file mode 100644 index 0000000000..f486e318c2 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca34-illumination-coop/map.yaml @@ -0,0 +1,751 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 34: Illumination Co-op + +Author: Darkademic & Gandorques Hikla + +Tileset: TEMPERAT + +MapSize: 114,114 + +Bounds: 1,1,112,112 + +Visibility: Lobby + +Categories: Co-op Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Scrin + PlayerReference@Nod: + Name: Nod + LockFaction: True + Faction: nod + Color: FE1100 + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Creeps, TibLifeforms + PlayerReference@Scrin: + Name: Scrin + Bot: campaign + Faction: scrin + Color: 7700FF + Allies: TibLifeforms + Enemies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@TibLifeforms: + Name: TibLifeforms + NonCombatant: True + Faction: scrin + Color: 00FF00 + Allies: Scrin + Enemies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: FE1100 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Creeps, TibLifeforms + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: 0B7310 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Creeps, TibLifeforms + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: 134691 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Creeps, TibLifeforms + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: 775A12 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Creeps, TibLifeforms + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: 82C900 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Creeps, TibLifeforms + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: EEA8A8 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Creeps, TibLifeforms + +Actors: + Kane: kane + Owner: Nod + SubCell: 3 + Location: 17,46 + Facing: 768 + Actor66: scrinflora12 + Owner: Neutral + Location: 23,11 + Cave2Patrol4: waypoint + Owner: Neutral + Location: 31,13 + Cave2Patrol1: waypoint + Owner: Neutral + Location: 59,13 + Cave3Wormhole: waypoint + Owner: Neutral + Location: 80,13 + Cave2Patrol3: waypoint + Owner: Neutral + Location: 43,14 + Cave2Wormhole: waypoint + Owner: Neutral + Location: 53,14 + Actor52: scrinflora2 + Owner: Neutral + Location: 36,15 + Cave3Patrol2: waypoint + Owner: Neutral + Location: 90,16 + Actor61: scrinflora14 + Owner: Neutral + Location: 53,17 + Actor59: scrinflora13 + Owner: Neutral + Location: 101,17 + Actor51: scrinflora1 + Owner: Neutral + Location: 51,22 + Cave2Patrol2: waypoint + Owner: Neutral + Location: 52,24 + Cave1Patrol2: waypoint + Owner: Neutral + Location: 34,29 + Actor75: scrinflora13 + Owner: Neutral + Location: 28,30 + Actor50: scrinflora4 + Owner: Neutral + Location: 30,30 + Actor60: scrinflora14 + Owner: Neutral + Location: 73,30 + Actor74: scrinflora10 + Owner: Neutral + Location: 31,31 + Cave1Patrol1: waypoint + Owner: Neutral + Location: 38,37 + Actor68: scrinflora5 + Owner: Neutral + Location: 15,39 + Actor69: scrinflora10 + Owner: Neutral + Location: 23,40 + Actor37: enli + Owner: Nod + SubCell: 5 + Facing: 768 + Location: 16,41 + Actor100: tplr + Owner: Nod + SubCell: 5 + Facing: 768 + Location: 18,42 + Actor58: scrinflora13 + Owner: Neutral + Location: 54,42 + Actor67: scrinflora12 + Owner: Neutral + Location: 97,42 + Actor41: rmbc + Owner: Nod + SubCell: 2 + Facing: 768 + Location: 16,43 + Actor43: rmbc + Owner: Nod + SubCell: 5 + Facing: 768 + Location: 16,43 + Actor88: fragment + Location: 52,43 + Owner: TibLifeforms + Actor12: tplr + Owner: Nod + SubCell: 2 + Facing: 768 + Location: 18,44 + Actor14: tplr + Owner: Nod + SubCell: 5 + Facing: 768 + Location: 18,44 + Actor16: shad + Owner: Nod + SubCell: 3 + Facing: 768 + Location: 21,44 + Actor71: scrinflora12 + Owner: Neutral + Location: 40,45 + Cave5Patrol1: waypoint + Owner: Neutral + Location: 94,45 + PlayerStart: waypoint + Owner: Neutral + Location: 17,46 + Cave5Wormhole: waypoint + Owner: Neutral + Location: 96,46 + Actor22: tplr + Owner: Nod + SubCell: 2 + Facing: 768 + Location: 18,48 + Actor24: tplr + Owner: Nod + SubCell: 5 + Facing: 768 + Location: 18,48 + Actor26: shad + Owner: Nod + SubCell: 3 + Facing: 768 + Location: 21,48 + Actor70: scrinflora11 + Owner: Neutral + Location: 31,48 + Actor73: scrinflora13 + Owner: Neutral + Location: 13,49 + Actor28: rmbc + Owner: Nod + SubCell: 2 + Facing: 768 + Location: 16,49 + Actor30: rmbc + Owner: Nod + SubCell: 5 + Facing: 768 + Location: 16,49 + Actor101: tplr + Owner: Nod + SubCell: 2 + Facing: 768 + Location: 18,50 + Actor46: enli + Owner: Nod + SubCell: 2 + Facing: 768 + Location: 16,51 + Actor72: scrinflora9 + Owner: Neutral + Location: 19,52 + Cave1Wormhole: waypoint + Owner: Neutral + Location: 38,55 + Actor65: scrinflora12 + Owner: Neutral + Location: 40,59 + Cave1Patrol3: waypoint + Owner: Neutral + Location: 35,62 + Cave1Patrol4: waypoint + Owner: Neutral + Location: 25,65 + Actor49: scrinflora7 + Owner: Neutral + Location: 34,66 + Actor62: scrinflora14 + Owner: Neutral + Location: 14,72 + Cave1Patrol5: waypoint + Owner: Neutral + Location: 18,72 + Actor53: scrinflora8 + Owner: Neutral + Location: 94,77 + Actor48: scrinflora5 + Owner: Neutral + Location: 41,80 + Cave1Patrol6: waypoint + Owner: Neutral + Location: 22,81 + Cave5Patrol2: waypoint + Owner: Neutral + Location: 98,83 + Cave7Patrol2: waypoint + Owner: Neutral + Location: 67,85 + Actor55: scrinflora6 + Owner: Neutral + Location: 69,91 + Actor63: scrinflora14 + Owner: Neutral + Location: 52,92 + Actor64: scrinflora12 + Owner: Neutral + Location: 68,92 + Cave8Patrol2: waypoint + Owner: Neutral + Location: 17,95 + Cave8Patrol1: waypoint + Owner: Neutral + Location: 54,95 + Cave8Wormhole: waypoint + Owner: Neutral + Location: 52,96 + Cave7Patrol1: waypoint + Owner: Neutral + Location: 77,97 + Actor54: scrinflora2 + Owner: Neutral + Location: 99,97 + Cave7Patrol3: waypoint + Owner: Neutral + Location: 95,98 + Actor57: scrinflora13 + Owner: Neutral + Location: 42,100 + Cave7Wormhole: waypoint + Owner: Neutral + Location: 83,100 + Actor109: scrinflora3 + Owner: Neutral + Location: 35,106 + Actor110: scrinflora12 + Owner: Neutral + Location: 41,109 + Actor111: fragment + Owner: TibLifeforms + Location: 43,108 + Actor112: fragment + Owner: TibLifeforms + Location: 72,107 + Actor113: scrinflora8 + Owner: Neutral + Location: 78,105 + Actor114: scrinflora10 + Owner: Neutral + Location: 69,107 + Actor115: scrinflora11 + Owner: Neutral + Location: 78,106 + Actor116: fragment + Owner: TibLifeforms + Location: 50,3 + Actor117: scrinflora7 + Owner: Neutral + Location: 90,30 + Actor118: scrinflora12 + Owner: Neutral + Location: 85,23 + Actor119: scrinflora5 + Owner: Neutral + Location: 88,34 + Actor120: fragment + Owner: TibLifeforms + Location: 100,25 + Cave3Patrol3: waypoint + Owner: Neutral + Location: 86,30 + Cave3Patrol4: waypoint + Owner: Neutral + Location: 67,25 + Cave9Wormhole: waypoint + Owner: Neutral + Location: 54,57 + Cave9Patrol1: waypoint + Owner: Neutral + Location: 48,70 + Cave9Patrol2: waypoint + Owner: Neutral + Location: 36,80 + Cave9Patrol3: waypoint + Owner: Neutral + Location: 56,45 + Cave9Patrol4: waypoint + Owner: Neutral + Location: 68,44 + Actor94: scrinflora9 + Owner: Neutral + Location: 78,54 + Actor97: scrinflora2 + Owner: Neutral + Location: 67,60 + Purifier: scrinpurifier + Owner: Neutral + Location: 76,60 + FinalWormhole5: waypoint + Owner: Neutral + Location: 85,61 + HiddenChamberCenter: waypoint + Owner: Neutral + Location: 76,62 + FinalWormhole1: waypoint + Owner: Neutral + Location: 66,63 + Actor108: scrinflora13 + Owner: Neutral + Location: 87,66 + FinalWormhole4: waypoint + Owner: Neutral + Location: 85,67 + Actor122: scrinflora7 + Owner: Neutral + Location: 75,69 + Actor123: scrinflora14 + Owner: Neutral + Location: 78,70 + FinalWormhole2: waypoint + Owner: Neutral + Location: 71,71 + FinalWormhole3: waypoint + Owner: Neutral + Location: 77,73 + Actor126: scrinflora10 + Owner: Neutral + Location: 65,66 + CaveShroud1: caveshroud + Owner: TibLifeforms + Location: 77,64 + Actor96: scrinflora10 + Owner: Neutral + Location: 83,57 + CaveShroud3: caveshroud + Owner: TibLifeforms + Location: 83,58 + CaveShroud4: caveshroud + Owner: TibLifeforms + Location: 80,70 + CaveShroud5: caveshroud + Owner: TibLifeforms + Location: 68,66 + CaveShroud6: caveshroud + Owner: TibLifeforms + Location: 68,61 + CaveShroud2: caveshroud + Owner: TibLifeforms + Location: 74,58 + CaveShroud7: caveshroud + Owner: TibLifeforms + Location: 74,69 + Cave3Patrol1: waypoint + Owner: Neutral + Location: 73,13 + Actor121: camera + Owner: Scrin + Location: 81,60 + Actor124: camera + Owner: Scrin + Location: 71,65 + Actor127: fragment + Owner: TibLifeforms + Location: 38,47 + HiddenChamberEntrance: waypoint + Owner: Neutral + Location: 63,64 + Actor125: gscr + Owner: Scrin + SubCell: 3 + Location: 22,85 + Facing: 0 + Actor128: gscr + Owner: Scrin + SubCell: 3 + Location: 24,79 + Facing: 103 + Actor129: seek + Owner: Scrin + Location: 20,83 + Facing: 856 + Actor130: seek + Owner: Scrin + Facing: 384 + Location: 57,99 + Actor131: brst + Owner: Scrin + SubCell: 3 + Location: 84,33 + Facing: 47 + Actor132: brst + Owner: Scrin + SubCell: 3 + Location: 86,32 + Facing: 182 + Actor133: brst + Owner: Scrin + SubCell: 3 + Location: 80,33 + Facing: 111 + Actor134: brst + Owner: Scrin + SubCell: 3 + Location: 82,32 + Facing: 103 + Actor135: brst + Owner: Scrin + SubCell: 3 + Location: 78,34 + Facing: 0 + Actor136: lace + Owner: Scrin + Location: 108,36 + Facing: 79 + Actor137: lace + Owner: Scrin + Location: 104,33 + Facing: 174 + Actor138: seek + Owner: Scrin + Location: 91,79 + Facing: 602 + Actor139: s1 + Owner: Scrin + SubCell: 3 + Location: 92,77 + Facing: 682 + Actor140: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 54,73 + Actor141: s2 + Owner: Scrin + SubCell: 3 + Location: 51,77 + Facing: 174 + Actor142: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 55,70 + Actor143: seek + Owner: Scrin + Location: 56,75 + Facing: 118 + Actor144: gscr + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 62,41 + Actor145: gscr + Owner: Scrin + SubCell: 3 + Location: 58,51 + Facing: 214 + Actor146: gscr + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 54,7 + Actor147: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 54,9 + Actor148: s1 + Owner: Scrin + SubCell: 3 + Location: 36,103 + Facing: 745 + Actor149: s1 + Owner: Scrin + SubCell: 3 + Location: 38,106 + Facing: 23 + Actor150: gunw + Owner: Scrin + Location: 72,103 + Facing: 840 + Actor151: gscr + Owner: Scrin + SubCell: 3 + Location: 75,105 + Facing: 15 + Actor152: gscr + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 90,100 + Actor153: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 102,66 + Actor154: s1 + Owner: Scrin + SubCell: 3 + Location: 17,68 + Facing: 658 + Actor155: s1 + Owner: Scrin + SubCell: 3 + Location: 16,70 + Facing: 824 + Actor156: stcr + Owner: Scrin + Facing: 384 + Location: 45,8 + Actor157: stcr + Owner: Scrin + Location: 46,68 + Facing: 642 + Actor158: stcr + Owner: Scrin + Location: 78,31 + Facing: 134 + Actor159: corr + Owner: Scrin + Location: 15,71 + Facing: 745 + Actor160: gscr + Owner: Scrin + SubCell: 3 + Location: 106,36 + Facing: 237 + Actor161: gscr + Owner: Scrin + SubCell: 3 + Location: 110,39 + Facing: 618 + Actor162: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 109,35 + Actor163: gscr + Owner: Scrin + SubCell: 3 + Location: 92,81 + Facing: 610 + Actor164: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 60,42 + Actor165: gscr + Owner: Scrin + SubCell: 3 + Location: 61,48 + Facing: 832 + Actor166: gunw + Owner: Scrin + Location: 104,67 + Facing: 118 + Actor167: stcr + Owner: Scrin + Location: 92,48 + Facing: 745 + Actor168: seek + Owner: Scrin + Location: 52,49 + Facing: 729 + Actor169: seek + Owner: Scrin + Location: 52,51 + Facing: 626 + Actor170: gscr + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 58,98 + Actor171: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 79,93 + Actor172: brst + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 92,97 + Actor173: brst + Owner: Scrin + SubCell: 3 + Location: 92,100 + Facing: 214 + Actor174: gunw + Owner: Scrin + Facing: 384 + Location: 72,85 + Actor175: stcr + Owner: Scrin + Location: 91,26 + Facing: 269 + NonBrutalCyborg1: tplr + Owner: Nod + SubCell: 2 + Location: 18,42 + Facing: 768 + NonBrutalCyborg2: enli + Owner: Nod + SubCell: 2 + Location: 16,41 + Facing: 768 + NonBrutalCyborg3: enli + Owner: Nod + SubCell: 5 + Location: 16,51 + Facing: 768 + NonBrutalCyborg4: tplr + Owner: Nod + SubCell: 5 + Location: 18,50 + Facing: 768 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-covenants.yaml, ca|missions/main-campaign/ca34-illumination/illumination-rules.yaml, ca|rules/custom/coop-rules.yaml, illumination-coop-rules.yaml + +Sequences: ca|missions/main-campaign/ca34-illumination/illumination-sequences.yaml + +Weapons: ca|weapons/custom/campaign.yaml, ca|missions/main-campaign/ca34-illumination/illumination-weapons.yaml + +Voices: ca|missions/main-campaign/ca34-illumination/illumination-voices.yaml diff --git a/mods/ca/missions/coop-campaign/ca35-purification-coop/map.bin b/mods/ca/missions/coop-campaign/ca35-purification-coop/map.bin new file mode 100644 index 0000000000..8b1bf18f69 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca35-purification-coop/map.bin differ diff --git a/mods/ca/missions/coop-campaign/ca35-purification-coop/map.png b/mods/ca/missions/coop-campaign/ca35-purification-coop/map.png new file mode 100644 index 0000000000..788f802d53 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca35-purification-coop/map.png differ diff --git a/mods/ca/missions/coop-campaign/ca35-purification-coop/map.yaml b/mods/ca/missions/coop-campaign/ca35-purification-coop/map.yaml new file mode 100644 index 0000000000..76b6b79198 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca35-purification-coop/map.yaml @@ -0,0 +1,2089 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 35: Purification Co-op + +Author: Darkademic & Gandorques Hikla + +Tileset: TEMPERAT + +MapSize: 130,98 + +Bounds: 1,1,128,96 + +Visibility: Lobby + +Categories: Co-op Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Scrin, ScrinRebels + PlayerReference@Nod: + Name: Nod + Faction: nod + Color: FE1100 + Allies: ScrinRebels, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Creeps, TibLifeforms + PlayerReference@Scrin: + Name: Scrin + Bot: campaign + Faction: scrin + Color: 7700FF + Allies: TibLifeforms + Enemies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, ScrinRebels, Creeps + PlayerReference@TibLifeforms: + Name: TibLifeforms + NonCombatant: True + Faction: scrin + Color: 00FF00 + Allies: Scrin + Enemies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@ScrinRebels: + Name: ScrinRebels + NonCombatant: True + Faction: scrin + Color: 55E1AE + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Creeps + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: FE1100 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, ScrinRebels + Enemies: Scrin, Creeps, TibLifeforms + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: 0B7310 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, ScrinRebels + Enemies: Scrin, Creeps, TibLifeforms + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: 134691 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, ScrinRebels + Enemies: Scrin, Creeps, TibLifeforms + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: 775A12 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, ScrinRebels + Enemies: Scrin, Creeps, TibLifeforms + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: 82C900 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, ScrinRebels + Enemies: Scrin, Creeps, TibLifeforms + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: EEA8A8 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, ScrinRebels + Enemies: Scrin, Creeps, TibLifeforms + +Actors: + Actor96: gun.nod + Owner: Nod + Location: 109,28 + TurretFacing: 333 + Actor97: gun.nod + Owner: Nod + Location: 100,18 + TurretFacing: 697 + Actor98: gun.nod + Owner: Nod + Location: 112,16 + TurretFacing: 333 + Actor3: brik + Owner: Nod + Location: 49,6 + Actor4: brik + Owner: Nod + Location: 50,6 + Actor5: brik + Owner: Nod + Location: 51,6 + Actor6: brik + Owner: Nod + Location: 52,6 + Actor7: brik + Owner: Nod + Location: 53,6 + Actor8: brik + Owner: Nod + Location: 54,6 + Actor9: brik + Owner: Nod + Location: 55,6 + Actor10: brik + Owner: Nod + Location: 56,6 + Actor11: brik + Owner: Nod + Location: 49,7 + Actor12: brik + Owner: Nod + Location: 55,7 + Actor13: brik + Owner: Nod + Location: 56,7 + Actor14: brik + Owner: Nod + Location: 49,8 + Actor15: brik + Owner: Nod + Location: 50,8 + Actor16: brik + Owner: Nod + Location: 49,9 + Actor17: brik + Owner: Nod + Location: 50,9 + Actor18: proc.td + Owner: Nod + Location: 53,9 + Actor19: brik + Owner: Nod + Location: 70,10 + Actor20: brik + Owner: Nod + Location: 71,10 + Actor21: brik + Owner: Nod + Location: 70,11 + Actor22: brik + Owner: Nod + Location: 71,11 + Actor23: nuk2 + Owner: Nod + Location: 66,12 + Actor24: nuk2 + Owner: Nod + Location: 68,12 + Actor25: brik + Owner: Nod + Location: 70,12 + Actor26: brik + Owner: Nod + Location: 70,13 + Actor27: brik + Owner: Nod + Location: 70,14 + Actor29: nuk2 + Owner: Nod + Location: 66,15 + Actor30: nuk2 + Owner: Nod + Location: 68,15 + Actor31: brik + Owner: Nod + Location: 70,15 + Actor32: brik + Owner: Nod + Location: 49,16 + Actor33: brik + Owner: Nod + Location: 50,16 + Actor34: brik + Owner: Nod + Location: 70,16 + Actor35: brik + Owner: Nod + Location: 49,17 + Actor36: brik + Owner: Nod + Location: 50,17 + Actor38: brik + Owner: Nod + Location: 70,17 + Actor39: brik + Owner: Nod + Location: 49,18 + Actor41: brik + Owner: Nod + Location: 70,18 + Actor42: brik + Owner: Nod + Location: 71,18 + Actor43: n1c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 46,19 + Actor44: brik + Owner: Nod + Location: 49,19 + Actor45: n3c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 51,19 + Actor46: brik + Owner: Nod + Location: 71,19 + Actor47: brik + Owner: Nod + Location: 49,20 + Actor48: obli + Owner: Nod + Location: 70,20 + Actor49: brik + Owner: Nod + Location: 71,20 + Actor50: ltnk + Owner: Nod + Facing: 384 + Location: 44,21 + Actor51: rmbc + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 46,21 + Actor52: n1c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 47,21 + Actor53: brik + Owner: Nod + Location: 49,21 + Actor54: brik + Owner: Nod + Location: 71,21 + Actor55: brik + Owner: Nod + Location: 72,21 + Actor56: rmbc + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 47,22 + Actor57: brik + Owner: Nod + Location: 49,22 + Actor58: rmbc + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 56,22 + Actor59: enli + Owner: Nod + SubCell: 3 + Facing: 515 + Location: 60,22 + Actor60: n3c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 68,22 + Actor61: brik + Owner: Nod + Location: 71,22 + Actor62: brik + Owner: Nod + Location: 72,22 + Actor63: brik + Owner: Nod + Location: 49,23 + Actor64: brik + Owner: Nod + Location: 49,24 + Actor65: obli + Owner: Nod + Location: 52,24 + Actor66: brik + Owner: Nod + Location: 53,24 + Actor67: brik + Owner: Nod + Location: 54,24 + Actor68: brik + Owner: Nod + Location: 60,24 + Actor69: brik + Owner: Nod + Location: 61,24 + Actor70: obli + Owner: Nod + Location: 62,24 + Actor71: brik + Owner: Nod + Location: 66,24 + Actor72: brik + Owner: Nod + Location: 67,24 + Actor73: ltur + Owner: Nod + TurretFacing: 666 + Location: 68,24 + Actor74: brik + Owner: Nod + Location: 49,25 + Actor75: brik + Owner: Nod + Location: 50,25 + Actor76: brik + Owner: Nod + Location: 51,25 + Actor77: brik + Owner: Nod + Location: 52,25 + Actor78: brik + Owner: Nod + Location: 53,25 + Actor79: brik + Owner: Nod + Location: 54,25 + Actor80: brik + Owner: Nod + Location: 60,25 + Actor81: brik + Owner: Nod + Location: 61,25 + Actor82: brik + Owner: Nod + Location: 62,25 + Actor83: brik + Owner: Nod + Location: 63,25 + Actor84: brik + Owner: Nod + Location: 64,25 + Actor85: brik + Owner: Nod + Location: 65,25 + Actor86: brik + Owner: Nod + Location: 66,25 + Actor87: brik + Owner: Nod + Location: 67,25 + Actor88: n1c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 52,26 + Actor89: ltur + Owner: Nod + TurretFacing: 364 + Location: 54,26 + Actor90: rmbc + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 55,26 + Actor91: rmbc + Owner: Nod + SubCell: 3 + Facing: 467 + Location: 59,26 + Actor92: ltur + Owner: Nod + TurretFacing: 555 + Location: 60,26 + Actor93: n1c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 64,26 + Actor94: n1c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 53,27 + Actor95: ltnk + Owner: Nod + Facing: 384 + Location: 64,27 + Actor99: n1c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 66,27 + Actor100: rmbc + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 104,17 + Actor102: rmbc + Owner: Nod + SubCell: 3 + Location: 106,17 + Facing: 547 + Actor101: rmbc + Owner: Nod + SubCell: 3 + Location: 108,17 + Facing: 467 + Actor103: scrinflora2 + Owner: Neutral + Location: 99,17 + Actor104: scrinflora5 + Owner: Neutral + Location: 122,12 + Actor105: scrinflora3 + Owner: Neutral + Location: 101,3 + Actor106: scrinflora4 + Owner: Neutral + Location: 125,7 + Actor107: scrinflora2 + Owner: Neutral + Location: 125,3 + Actor109: scrinflora7 + Owner: Neutral + Location: 117,18 + Actor110: scrinflora8 + Owner: Neutral + Location: 96,11 + Actor111: scrinflora1 + Owner: Neutral + Location: 98,7 + Actor112: scrinflora12 + Owner: Neutral + Location: 97,8 + Actor113: scrinflora13 + Owner: Neutral + Location: 98,3 + Actor114: scrinflora11 + Owner: Neutral + Location: 99,4 + Actor115: scrinflora11 + Owner: Neutral + Location: 100,19 + Actor116: scrinflora14 + Owner: Neutral + Location: 111,22 + Actor117: scrinflora9 + Owner: Neutral + Location: 111,23 + Actor118: scrinflora11 + Owner: Neutral + Location: 113,20 + Actor119: scrinflora12 + Owner: Neutral + Location: 110,30 + Actor120: nuk2 + Owner: Nod + Location: 68,9 + Actor121: nuk2 + Owner: Nod + Location: 66,9 + LiquidTibFacility: lqtf + Owner: Nod + Location: 60,9 + Actor125: chain + Owner: Nod + Location: 60,8 + Actor127: chain + Owner: Nod + Location: 59,8 + Actor128: chain + Owner: Nod + Location: 59,9 + Actor129: chain + Owner: Nod + Location: 59,10 + Actor130: chain + Owner: Nod + Location: 62,10 + Actor131: chain + Owner: Nod + Location: 62,9 + Actor132: chain + Owner: Nod + Location: 62,8 + Actor133: chain + Owner: Nod + Location: 61,8 + Actor134: chain + Owner: Nod + Location: 59,11 + Actor135: chain + Owner: Nod + Location: 62,11 + Actor136: ttrk + Owner: Nod + Location: 61,12 + Facing: 642 + Actor137: split2 + Owner: Neutral + Location: 41,14 + Actor138: split2 + Owner: Neutral + Location: 42,7 + Actor140: hand + Owner: Nod + Location: 65,19 + Actor141: weap.td + Owner: Nod + Location: 53,17 + Actor143: silo.td + Owner: Nod + Location: 50,7 + Actor144: silo.td + Owner: Nod + Location: 53,7 + Actor145: split2 + Owner: Neutral + Location: 6,35 + Actor146: split2 + Owner: Neutral + Location: 5,30 + Actor147: swal + Owner: Scrin + Location: 63,76 + Actor148: swal + Owner: Scrin + Location: 64,76 + Actor149: swal + Owner: Scrin + Location: 63,77 + Actor150: swal + Owner: Scrin + Location: 64,77 + Actor151: swal + Owner: Scrin + Location: 62,76 + Actor152: swal + Owner: Scrin + Location: 62,75 + Actor153: swal + Owner: Scrin + Location: 62,74 + Actor154: swal + Owner: Scrin + Location: 61,74 + Actor155: swal + Owner: Scrin + Location: 60,74 + Actor156: swal + Owner: Scrin + Location: 61,76 + Actor157: swal + Owner: Scrin + Location: 60,76 + Actor158: swal + Owner: Scrin + Location: 60,75 + Actor159: swal + Owner: Scrin + Location: 80,73 + Actor160: swal + Owner: Scrin + Location: 80,74 + Actor161: swal + Owner: Scrin + Location: 80,75 + Actor162: swal + Owner: Scrin + Location: 81,75 + Actor163: swal + Owner: Scrin + Location: 81,73 + Actor164: swal + Owner: Scrin + Location: 82,73 + Actor165: swal + Owner: Scrin + Location: 82,74 + Actor166: swal + Owner: Scrin + Location: 82,75 + Actor167: swal + Owner: Scrin + Location: 79,75 + Actor168: swal + Owner: Scrin + Location: 78,75 + Actor169: swal + Owner: Scrin + Location: 78,76 + Actor170: swal + Owner: Scrin + Location: 79,76 + Actor171: swal + Owner: Scrin + Location: 52,78 + Actor172: swal + Owner: Scrin + Location: 53,78 + Actor173: swal + Owner: Scrin + Location: 54,78 + Actor174: swal + Owner: Scrin + Location: 52,79 + Actor175: swal + Owner: Scrin + Location: 52,80 + Actor179: swal + Owner: Scrin + Location: 53,80 + Actor180: swal + Owner: Scrin + Location: 54,80 + Actor181: swal + Owner: Scrin + Location: 54,79 + Actor177: swal + Owner: Scrin + Location: 86,79 + Actor178: swal + Owner: Scrin + Location: 87,79 + Actor182: swal + Owner: Scrin + Location: 86,80 + Actor183: swal + Owner: Scrin + Location: 86,81 + Actor184: swal + Owner: Scrin + Location: 87,81 + Actor185: swal + Owner: Scrin + Location: 88,81 + Actor186: swal + Owner: Scrin + Location: 88,79 + Actor187: swal + Owner: Scrin + Location: 88,80 + Actor188: swal + Owner: Scrin + Location: 87,82 + Actor189: swal + Owner: Scrin + Location: 87,83 + Actor190: swal + Owner: Scrin + Location: 53,81 + Actor191: swal + Owner: Scrin + Location: 53,82 + Actor192: swal + Owner: Scrin + Location: 53,83 + Actor193: swal + Owner: Scrin + Location: 52,84 + Actor194: swal + Owner: Scrin + Location: 53,84 + Actor195: swal + Owner: Scrin + Location: 54,84 + Actor197: swal + Owner: Scrin + Location: 52,85 + Actor198: swal + Owner: Scrin + Location: 52,86 + Actor205: swal + Owner: Scrin + Location: 53,86 + Actor206: swal + Owner: Scrin + Location: 54,86 + Actor207: swal + Owner: Scrin + Location: 54,85 + Actor196: swal + Owner: Scrin + Location: 86,84 + Actor199: swal + Owner: Scrin + Location: 87,84 + Actor200: swal + Owner: Scrin + Location: 88,84 + Actor201: swal + Owner: Scrin + Location: 86,85 + Actor202: swal + Owner: Scrin + Location: 86,86 + Actor203: swal + Owner: Scrin + Location: 87,86 + Actor204: swal + Owner: Scrin + Location: 88,86 + Actor208: swal + Owner: Scrin + Location: 88,85 + Actor209: swal + Owner: Scrin + Location: 14,52 + Actor210: swal + Owner: Scrin + Location: 14,53 + Actor211: swal + Owner: Scrin + Location: 14,54 + Actor212: swal + Owner: Scrin + Location: 15,54 + Actor213: swal + Owner: Scrin + Location: 15,52 + Actor214: swal + Owner: Scrin + Location: 16,52 + Actor215: swal + Owner: Scrin + Location: 16,53 + Actor216: swal + Owner: Scrin + Location: 16,54 + Actor217: swal + Owner: Scrin + Location: 13,54 + Actor218: swal + Owner: Scrin + Location: 12,54 + Actor219: swal + Owner: Scrin + Location: 11,54 + Actor220: swal + Owner: Scrin + Location: 11,53 + Actor221: swal + Owner: Scrin + Location: 10,53 + Actor222: swal + Owner: Scrin + Location: 10,54 + Actor223: swal + Owner: Scrin + Location: 10,55 + Actor224: swal + Owner: Scrin + Location: 10,56 + Actor225: swal + Owner: Scrin + Location: 10,57 + Actor226: swal + Owner: Scrin + Location: 11,56 + Actor227: swal + Owner: Scrin + Location: 11,57 + Actor228: swal + Owner: Scrin + Location: 22,51 + Actor229: swal + Owner: Scrin + Location: 22,52 + Actor230: swal + Owner: Scrin + Location: 22,53 + Actor231: swal + Owner: Scrin + Location: 23,53 + Actor232: swal + Owner: Scrin + Location: 23,51 + Actor233: swal + Owner: Scrin + Location: 24,51 + Actor234: swal + Owner: Scrin + Location: 24,52 + Actor235: swal + Owner: Scrin + Location: 24,53 + Actor238: swal + Owner: Scrin + Location: 23,54 + Actor239: swal + Owner: Scrin + Location: 23,55 + Actor240: swal + Owner: Scrin + Location: 23,56 + Actor236: swal + Owner: Scrin + Location: 10,63 + Actor237: swal + Owner: Scrin + Location: 11,63 + Actor241: swal + Owner: Scrin + Location: 10,64 + Actor242: swal + Owner: Scrin + Location: 11,64 + Actor243: swal + Owner: Scrin + Location: 12,64 + Actor244: swal + Owner: Scrin + Location: 13,64 + Actor245: swal + Owner: Scrin + Location: 14,64 + Actor246: swal + Owner: Scrin + Location: 16,64 + Actor247: swal + Owner: Scrin + Location: 15,64 + Actor248: swal + Owner: Scrin + Location: 17,64 + Actor249: swal + Owner: Scrin + Location: 19,64 + Actor250: swal + Owner: Scrin + Location: 21,64 + Actor251: swal + Owner: Scrin + Location: 22,64 + Actor252: swal + Owner: Scrin + Location: 23,64 + Actor253: swal + Owner: Scrin + Location: 18,64 + Actor254: swal + Owner: Scrin + Location: 20,64 + Actor255: swal + Owner: Scrin + Location: 23,63 + Actor256: swal + Owner: Scrin + Location: 23,62 + Actor257: swal + Owner: Scrin + Location: 22,62 + Actor258: swal + Owner: Scrin + Location: 22,61 + Actor259: swal + Owner: Scrin + Location: 22,60 + Actor260: swal + Owner: Scrin + Location: 23,60 + Actor261: swal + Owner: Scrin + Location: 24,60 + Actor262: swal + Owner: Scrin + Location: 24,61 + Actor263: swal + Owner: Scrin + Location: 24,62 + Actor264: swal + Owner: Scrin + Location: 22,55 + Actor265: swal + Owner: Scrin + Location: 22,56 + Actor266: scol + Owner: Scrin + Location: 23,52 + Actor267: scol + Owner: Scrin + Location: 15,53 + Actor268: scol + Owner: Scrin + Location: 23,61 + Actor269: scol + Owner: Scrin + Location: 53,79 + Actor270: scol + Owner: Scrin + Location: 61,75 + Actor271: scol + Owner: Scrin + Location: 81,74 + Actor272: scol + Owner: Scrin + Location: 87,80 + Actor273: scol + Owner: Scrin + Location: 87,85 + Actor274: scol + Owner: Scrin + Location: 53,85 + Actor275: ptur + Owner: Scrin + Location: 82,72 + Actor276: ptur + Owner: Scrin + Location: 87,78 + Actor277: ptur + Owner: Scrin + Location: 60,73 + Actor278: ptur + Owner: Scrin + Location: 53,77 + Actor279: ptur + Owner: Scrin + Location: 15,51 + TurretFacing: 176 + Actor280: ptur + Owner: Scrin + Location: 23,50 + TurretFacing: 959 + Actor281: ptur + Owner: Scrin + Location: 25,61 + TurretFacing: 904 + Actor282: sfac + Owner: Scrin + Location: 84,91 + Actor283: rea2 + Owner: Scrin + Location: 53,89 + Actor284: rea2 + Owner: Scrin + Location: 52,92 + Actor285: rea2 + Owner: Scrin + Location: 55,92 + Actor286: rea2 + Owner: Scrin + Location: 56,89 + Actor287: rea2 + Owner: Scrin + Location: 58,92 + Actor288: shar + Owner: Scrin + Location: 54,82 + Actor289: shar + Owner: Scrin + Location: 65,76 + Actor290: shar + Owner: Scrin + Location: 75,74 + Actor291: shar + Owner: Scrin + Location: 86,83 + Actor292: scrt + Owner: Scrin + Location: 80,89 + GravityStabilizer1: grav + Owner: Scrin + Location: 68,89 + GravityStabilizer2: grav + Owner: Scrin + Location: 72,89 + Portal1: port + Owner: Scrin + Location: 72,77 + Portal2: port + Owner: Scrin + Location: 67,78 + Actor297: nerv + Owner: Scrin + Location: 58,85 + Actor298: sign + Owner: Scrin + Location: 70,93 + Actor299: mani + Owner: Scrin + Location: 64,91 + WarpSphere1: wsph + Owner: Scrin + Location: 76,82 + WarpSphere2: wsph + Owner: Scrin + Location: 71,81 + Actor303: proc.scrin + Owner: Scrin + Location: 61,80 + Actor304: srep + Owner: Scrin + Location: 66,83 + Actor305: silo.scrin + Owner: Scrin + Location: 62,86 + Actor306: silo.scrin + Owner: Scrin + Location: 63,87 + Actor308: rea2 + Owner: Scrin + Location: 66,94 + Actor309: rea2 + Owner: Scrin + Location: 74,94 + Actor310: reac + Owner: Scrin + Location: 83,82 + Actor311: reac + Owner: Scrin + Location: 81,93 + Actor312: port + Owner: Scrin + Location: 18,57 + Actor316: silo.scrin + Owner: Scrin + Location: 18,62 + Actor317: silo.scrin + Owner: Scrin + Location: 20,62 + Actor318: silo.scrin + Owner: Scrin + Location: 19,63 + Actor319: silo.scrin + Owner: Scrin + Location: 17,63 + Actor314: proc.scrin + Owner: Scrin + Location: 13,57 + Actor313: split2 + Owner: Neutral + Location: 124,60 + Actor315: split2 + Owner: Neutral + Location: 115,50 + Actor320: split2 + Owner: Neutral + Location: 111,58 + Actor321: swal + Owner: Scrin + Location: 105,53 + Actor322: swal + Owner: Scrin + Location: 105,54 + Actor323: swal + Owner: Scrin + Location: 104,54 + Actor324: swal + Owner: Scrin + Location: 103,54 + Actor325: swal + Owner: Scrin + Location: 103,53 + Actor326: swal + Owner: Scrin + Location: 103,52 + Actor327: swal + Owner: Scrin + Location: 104,52 + Actor328: swal + Owner: Scrin + Location: 105,52 + Actor329: swal + Owner: Scrin + Location: 103,55 + Actor330: swal + Owner: Scrin + Location: 102,55 + Actor331: swal + Owner: Scrin + Location: 102,56 + Actor332: swal + Owner: Scrin + Location: 102,58 + Actor333: swal + Owner: Scrin + Location: 102,57 + Actor334: swal + Owner: Scrin + Location: 102,59 + Actor335: swal + Owner: Scrin + Location: 102,60 + Actor336: swal + Owner: Scrin + Location: 102,61 + Actor337: swal + Owner: Scrin + Location: 102,62 + Actor338: swal + Owner: Scrin + Location: 103,62 + Actor339: swal + Owner: Scrin + Location: 103,63 + Actor340: swal + Owner: Scrin + Location: 102,63 + Actor341: swal + Owner: Scrin + Location: 103,64 + Actor342: swal + Owner: Scrin + Location: 104,64 + Actor343: swal + Owner: Scrin + Location: 105,64 + Actor344: swal + Owner: Scrin + Location: 106,64 + Actor345: swal + Owner: Scrin + Location: 106,65 + Actor346: swal + Owner: Scrin + Location: 105,65 + Actor347: swal + Owner: Scrin + Location: 107,65 + Actor348: swal + Owner: Scrin + Location: 108,65 + Actor349: swal + Owner: Scrin + Location: 108,66 + Actor350: swal + Owner: Scrin + Location: 108,68 + Actor351: swal + Owner: Scrin + Location: 108,67 + Actor352: swal + Owner: Scrin + Location: 107,68 + Actor353: swal + Owner: Scrin + Location: 107,69 + Actor354: swal + Owner: Scrin + Location: 107,70 + Actor355: swal + Owner: Scrin + Location: 108,70 + Actor356: swal + Owner: Scrin + Location: 109,70 + Actor357: swal + Owner: Scrin + Location: 109,69 + Actor358: swal + Owner: Scrin + Location: 109,68 + Actor359: swal + Owner: Scrin + Location: 121,66 + Actor360: swal + Owner: Scrin + Location: 121,67 + Actor361: swal + Owner: Scrin + Location: 122,67 + Actor362: swal + Owner: Scrin + Location: 122,66 + Actor363: swal + Owner: Scrin + Location: 123,66 + Actor364: swal + Owner: Scrin + Location: 123,67 + Actor365: swal + Owner: Scrin + Location: 124,67 + Actor366: swal + Owner: Scrin + Location: 125,67 + Actor368: swal + Owner: Scrin + Location: 125,69 + Actor369: swal + Owner: Scrin + Location: 124,69 + Actor371: swal + Owner: Scrin + Location: 123,69 + Actor375: swal + Owner: Scrin + Location: 121,71 + Actor376: swal + Owner: Scrin + Location: 120,71 + Actor377: swal + Owner: Scrin + Location: 120,72 + Actor378: swal + Owner: Scrin + Location: 120,73 + Actor379: swal + Owner: Scrin + Location: 121,73 + Actor380: swal + Owner: Scrin + Location: 122,73 + Actor381: swal + Owner: Scrin + Location: 122,72 + Actor382: swal + Owner: Scrin + Location: 122,71 + Actor383: scol + Owner: Scrin + Location: 104,53 + Actor384: scol + Owner: Scrin + Location: 108,69 + Actor385: scol + Owner: Scrin + Location: 121,72 + Actor386: ptur + Owner: Scrin + Location: 119,45 + Actor390: proc.scrin + Owner: Scrin + Location: 117,66 + Actor391: reac + Owner: Scrin + Location: 109,65 + Actor392: reac + Owner: Scrin + Location: 111,65 + Actor393: swal + Owner: Scrin + Location: 128,67 + Actor394: swal + Owner: Scrin + Location: 128,68 + Actor395: swal + Owner: Scrin + Location: 128,69 + Actor396: swal + Owner: Scrin + Location: 126,69 + Actor397: swal + Owner: Scrin + Location: 127,69 + Actor398: swal + Owner: Scrin + Location: 127,67 + Actor399: swal + Owner: Scrin + Location: 126,67 + Actor387: swal + Owner: Scrin + Location: 123,68 + Actor388: silo.scrin + Owner: Scrin + Location: 127,68 + Actor389: silo.scrin + Owner: Scrin + Location: 126,68 + Actor400: silo.scrin + Owner: Scrin + Location: 125,68 + Actor401: silo.scrin + Owner: Scrin + Location: 124,68 + Actor402: swal + Owner: Scrin + Location: 124,70 + Actor403: swal + Owner: Scrin + Location: 123,70 + Actor404: swal + Owner: Scrin + Location: 122,70 + Actor405: scrinflora3 + Owner: Neutral + Location: 31,41 + Actor406: scrinflora1 + Owner: Neutral + Location: 30,40 + Actor407: scrinflora7 + Owner: Neutral + Location: 40,46 + Actor408: scrinflora5 + Owner: Neutral + Location: 33,32 + Actor409: scrinflora1 + Owner: Neutral + Location: 54,45 + Actor410: scrinflora8 + Owner: Neutral + Location: 58,37 + Actor411: scrinflora2 + Owner: Neutral + Location: 73,37 + Actor412: scrinflora5 + Owner: Neutral + Location: 78,46 + Actor413: scrinflora12 + Owner: Neutral + Location: 80,45 + Actor414: scrinflora14 + Owner: Neutral + Location: 57,36 + Actor415: scrinflora10 + Owner: Neutral + Location: 60,37 + Actor416: scrinflora11 + Owner: Neutral + Location: 33,41 + Actor417: scrinflora13 + Owner: Neutral + Location: 42,45 + Actor418: scrinflora11 + Owner: Neutral + Location: 39,46 + Actor419: scrinflora12 + Owner: Neutral + Location: 45,48 + Actor420: scrinflora4 + Owner: Neutral + Location: 28,24 + Actor421: scrinflora1 + Owner: Neutral + Location: 29,22 + Actor422: scrinflora2 + Owner: Neutral + Location: 28,8 + Actor423: scrinflora13 + Owner: Neutral + Location: 29,7 + Actor424: scrinflora11 + Owner: Neutral + Location: 27,22 + Actor425: scrinflora14 + Owner: Neutral + Location: 27,24 + Actor426: scrinflora12 + Owner: Neutral + Location: 32,32 + Actor427: scrinflora12 + Owner: Neutral + Location: 22,8 + Actor428: scrinflora11 + Owner: Neutral + Location: 21,9 + Actor429: scrinflora9 + Owner: Neutral + Location: 23,7 + Actor430: scrinflora14 + Owner: Neutral + Location: 74,38 + Actor431: scrinflora7 + Owner: Neutral + Location: 94,34 + Actor437: scrinflora14 + Owner: Neutral + Location: 92,35 + Actor432: scrinflora2 + Owner: Neutral + Location: 96,33 + Actor433: scrinflora13 + Owner: Neutral + Location: 97,32 + Actor434: scrinflora10 + Owner: Neutral + Location: 93,34 + Actor435: scrinflora11 + Owner: Neutral + Location: 93,35 + Actor436: scrinflora9 + Owner: Neutral + Location: 91,35 + Actor438: scrinflora9 + Owner: Neutral + Location: 97,33 + Actor439: scrinflora4 + Owner: Neutral + Location: 109,45 + Actor440: scrinflora1 + Owner: Neutral + Location: 112,44 + Actor441: scrinflora3 + Owner: Neutral + Location: 125,42 + Actor442: scrinflora8 + Owner: Neutral + Location: 18,43 + Actor443: scrinflora7 + Owner: Neutral + Location: 3,20 + Actor444: scrinflora1 + Owner: Neutral + Location: 11,24 + Actor445: scrinflora10 + Owner: Neutral + Location: 4,21 + Actor446: scrinflora13 + Owner: Neutral + Location: 2,21 + Actor447: split2 + Owner: Neutral + Location: 34,92 + Actor448: split2 + Owner: Neutral + Location: 38,87 + Actor449: split2 + Owner: Neutral + Location: 38,81 + Actor450: split2 + Owner: Neutral + Location: 45,85 + Actor451: split2 + Owner: Neutral + Location: 43,92 + Actor452: afac + Owner: Nod + Location: 60,15 + Actor453: hq + Owner: Nod + Location: 57,15 + Actor454: split2 + Owner: Neutral + Location: 5,55 + Actor455: split2 + Owner: Neutral + Location: 3,61 + Actor456: split2 + Owner: Neutral + Location: 4,68 + Actor457: scrinflora3 + Owner: Neutral + Location: 69,64 + Actor458: scrinflora4 + Owner: Neutral + Location: 79,59 + Actor459: scrinflora1 + Owner: Neutral + Location: 61,55 + Actor460: scrinflora2 + Owner: Neutral + Location: 68,63 + Actor461: scrinflora14 + Owner: Neutral + Location: 71,63 + Actor462: scrinflora11 + Owner: Neutral + Location: 71,64 + Actor463: scrinflora10 + Owner: Neutral + Location: 67,63 + Actor464: scrinflora13 + Owner: Neutral + Location: 78,59 + Actor465: scrinflora11 + Owner: Neutral + Location: 80,58 + Actor466: scrinflora9 + Owner: Neutral + Location: 81,60 + Actor467: scrinflora11 + Owner: Neutral + Location: 86,61 + Actor468: scrinflora1 + Owner: Neutral + Location: 100,62 + Actor469: scrinflora7 + Owner: Neutral + Location: 101,79 + Actor470: scrinflora8 + Owner: Neutral + Location: 51,67 + Actor471: scrinflora14 + Owner: Neutral + Location: 50,66 + Actor472: scrinflora12 + Owner: Neutral + Location: 67,72 + Actor473: scrinflora13 + Owner: Neutral + Location: 88,62 + Actor474: scrinflora13 + Owner: Neutral + Location: 100,80 + Actor475: scrinflora10 + Owner: Neutral + Location: 101,81 + Actor476: scrinflora9 + Owner: Neutral + Location: 101,80 + Actor477: scrinflora11 + Owner: Neutral + Location: 103,78 + Actor478: scrinflora2 + Owner: Neutral + Location: 99,82 + Actor479: scrinflora6 + Owner: Neutral + Location: 106,84 + Actor480: scrinflora14 + Owner: Neutral + Location: 12,88 + Actor481: scrinflora2 + Owner: Neutral + Location: 7,79 + Actor482: scrinflora4 + Owner: Neutral + Location: 8,82 + Actor483: scrinflora8 + Owner: Neutral + Location: 16,91 + Actor484: scrinflora3 + Owner: Neutral + Location: 25,90 + Actor485: scrinflora1 + Owner: Neutral + Location: 17,89 + Actor486: scrinflora12 + Owner: Neutral + Location: 17,87 + Actor487: scrinflora13 + Owner: Neutral + Location: 18,88 + Actor488: scrinflora8 + Owner: Neutral + Location: 11,70 + Actor489: scrinflora4 + Owner: Neutral + Location: 35,65 + Actor490: scrinflora14 + Owner: Neutral + Location: 34,65 + Actor491: scrinflora13 + Owner: Neutral + Location: 32,72 + Actor492: split2 + Owner: Neutral + Location: 51,51 + ScrinAttack1a: waypoint + Owner: Neutral + Location: 57,66 + ScrinAttack3a: waypoint + Owner: Neutral + Location: 84,67 + ScrinAttack1b: waypoint + Owner: Neutral + Location: 32,46 + ScrinAttack1c: waypoint + Owner: Neutral + Location: 19,16 + ScrinAttack1d: waypoint + Owner: Neutral + Location: 43,18 + ScrinAttack2: waypoint + Owner: Neutral + Location: 50,32 + ScrinAttack3b: waypoint + Owner: Neutral + Location: 77,50 + ScrinAttack3c: waypoint + Owner: Neutral + Location: 65,32 + ScrinAttack4a: waypoint + Owner: Neutral + Location: 102,42 + ScrinAttack4b: waypoint + Owner: Neutral + Location: 97,28 + Actor493: swal + Owner: Scrin + Location: 69,65 + Actor494: swal + Owner: Scrin + Location: 69,66 + Actor495: swal + Owner: Scrin + Location: 69,67 + Actor496: swal + Owner: Scrin + Location: 71,67 + Actor497: swal + Owner: Scrin + Location: 70,65 + Actor498: swal + Owner: Scrin + Location: 71,65 + Actor499: swal + Owner: Scrin + Location: 70,67 + Actor500: swal + Owner: Scrin + Location: 71,66 + Actor501: swal + Owner: Scrin + Location: 72,66 + Actor502: swal + Owner: Scrin + Location: 73,66 + Actor503: swal + Owner: Scrin + Location: 73,65 + Actor504: swal + Owner: Scrin + Location: 73,67 + Actor505: swal + Owner: Scrin + Location: 75,67 + Actor506: swal + Owner: Scrin + Location: 74,67 + Actor507: swal + Owner: Scrin + Location: 74,65 + Actor508: swal + Owner: Scrin + Location: 75,65 + Actor509: swal + Owner: Scrin + Location: 75,66 + Actor510: scol + Owner: Scrin + Location: 70,66 + Actor511: scol + Owner: Scrin + Location: 74,66 + Actor512: rtpd + Owner: Scrin + Location: 41,90 + Facing: 198 + Actor513: tpod + Owner: Scrin + Location: 57,77 + Facing: 126 + Actor514: tpod + Owner: Scrin + Location: 86,75 + Facing: 880 + Actor515: ruin + Owner: Scrin + Location: 76,75 + Facing: 911 + Actor516: ruin + Owner: Scrin + Location: 62,77 + Facing: 95 + Actor517: pac + Owner: Scrin + Location: 81,81 + Facing: 904 + HardOnlyCarrier1: pac + Owner: Scrin + Location: 58,82 + Facing: 103 + Actor519: devo + Owner: Scrin + Location: 113,70 + Facing: 0 + Actor520: devo + Owner: Scrin + Facing: 0 + Location: 114,71 + Actor521: devo + Owner: Scrin + Facing: 0 + Location: 115,70 + Actor522: atmz + Owner: Scrin + Location: 16,56 + Facing: 904 + Actor523: corr + Owner: Scrin + Location: 26,58 + Facing: 904 + Actor524: corr + Owner: Scrin + Location: 27,61 + Facing: 935 + Actor525: gunw + Owner: Scrin + Facing: 384 + Location: 118,71 + Actor526: gunw + Owner: Scrin + Location: 77,78 + Facing: 904 + Actor527: gunw + Owner: Scrin + Location: 71,76 + Facing: 0 + Actor528: gunw + Owner: Scrin + Location: 56,83 + Facing: 118 + Actor529: intl.ai + Owner: Scrin + Location: 81,84 + Facing: 864 + Actor530: intl.ai + Owner: Scrin + Location: 91,79 + Facing: 983 + Actor531: intl.ai + Owner: Scrin + Location: 53,75 + Facing: 126 + InitAttacker1: seek + Owner: Scrin + Location: 42,37 + Facing: 927 + InitAttacker2: seek + Owner: Scrin + Location: 45,37 + Facing: 800 + InitAttacker4: seek + Owner: Scrin + Location: 41,40 + Facing: 919 + InitAttacker3: seek + Owner: Scrin + Location: 38,40 + Facing: 927 + InitAttacker5: lace + Owner: Scrin + Location: 68,42 + Facing: 23 + InitAttacker6: lace + Owner: Scrin + Location: 70,40 + Facing: 79 + InitAttacker7: lace + Owner: Scrin + Location: 71,44 + Facing: 79 + Actor539: intl + Owner: Scrin + Location: 101,35 + Facing: 1007 + Actor540: shrw + Owner: Scrin + Location: 93,30 + Facing: 198 + Actor541: seek + Owner: Scrin + Facing: 384 + Location: 92,26 + Actor542: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 93,27 + Actor543: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 91,26 + Actor544: s1 + Owner: Scrin + SubCell: 3 + Location: 93,31 + Facing: 277 + Actor545: s3 + Owner: Scrin + SubCell: 3 + Location: 78,71 + Facing: 0 + Actor546: s3 + Owner: Scrin + SubCell: 3 + Facing: 0 + Location: 65,77 + Actor547: s3 + Owner: Scrin + SubCell: 3 + Facing: 0 + Location: 65,73 + Actor548: s3 + Owner: Scrin + SubCell: 3 + Facing: 0 + Location: 83,86 + Actor549: s3 + Owner: Scrin + SubCell: 3 + Facing: 0 + Location: 65,87 + Actor550: s3 + Owner: Scrin + SubCell: 3 + Facing: 0 + Location: 78,87 + Actor551: s3 + Owner: Scrin + SubCell: 3 + Facing: 0 + Location: 93,86 + Actor552: s1 + Owner: Scrin + SubCell: 3 + Location: 58,73 + Facing: 214 + Actor553: s1 + Owner: Scrin + SubCell: 3 + Location: 63,71 + Facing: 39 + Actor554: s1 + Owner: Scrin + SubCell: 3 + Location: 69,72 + Facing: 55 + Actor555: s1 + Owner: Scrin + SubCell: 3 + Location: 93,81 + Facing: 872 + Actor556: tpod + Owner: Scrin + Location: 72,70 + Facing: 0 + Actor557: devo + Owner: Scrin + Location: 90,81 + Facing: 943 + Actor558: devo + Owner: Scrin + Location: 63,73 + Facing: 39 + Actor559: ptur + Owner: Scrin + Location: 62,44 + TurretFacing: 904 + Actor560: shar + Owner: Scrin + Location: 61,47 + Actor561: shar + Owner: Scrin + Location: 121,70 + Actor562: shar + Owner: Scrin + Location: 13,55 + Actor563: shar + Owner: Scrin + Location: 15,63 + Actor564: shar + Owner: Scrin + Location: 113,65 + Actor565: shar + Owner: Scrin + Location: 126,54 + PlayerStart: waypoint + Owner: Neutral + Location: 61,17 + CaveEntrance: waypoint + Owner: Neutral + Location: 119,6 + Actor566: flare + Owner: Nod + Location: 122,6 + Actor567: flare + Owner: Nod + Location: 115,5 + Actor568: smallcamera + Owner: Nod + Location: 118,6 + LiquidTibPickup1: waypoint + Owner: Neutral + Location: 60,11 + LiquidTibPickup2: waypoint + Owner: Neutral + Location: 61,11 + LiquidTibDropOff2: waypoint + Owner: Neutral + Location: 119,7 + LiquidTibDropOff1: waypoint + Owner: Neutral + Location: 120,6 + LiquidTibDropOff3: waypoint + Owner: Neutral + Location: 120,7 + Actor569: rea2 + Owner: Scrin + Location: 84,94 + Actor570: rea2 + Owner: Scrin + Location: 63,94 + Actor571: rea2 + Owner: Scrin + Location: 77,94 + Actor572: rea2 + Owner: Scrin + Location: 59,89 + Actor574: silo.scrin + Owner: Scrin + Location: 61,87 + RiftGenerator: rfgn + Owner: Scrin + Location: 77,91 + Actor573: pac + Owner: Scrin + Location: 63,79 + Facing: 166 + Actor575: pac + Owner: Scrin + Location: 76,78 + Facing: 864 + NormalHardOnlyCarrier1: pac + Owner: Scrin + Location: 47,88 + Facing: 174 + Actor577: pac + Owner: Scrin + Location: 90,88 + Facing: 888 + NormalHardOnlyCarrier2: pac + Owner: Scrin + Location: 49,91 + Facing: 174 + Actor579: shrw + Owner: Scrin + Location: 53,95 + Facing: 111 + Actor580: shrw + Owner: Scrin + Location: 63,89 + Facing: 182 + Actor581: split2 + Owner: Neutral + Location: 124,23 + Actor582: split2 + Owner: Neutral + Location: 118,25 + Actor583: split2 + Owner: Neutral + Location: 15,3 + Actor584: split2 + Owner: Neutral + Location: 8,7 + ScrinReinforcementsSpawn2: waypoint + Owner: Neutral + Location: 21,92 + ScrinReinforcementsSpawn4: waypoint + Owner: Neutral + Location: 100,93 + ScrinReinforcementsSpawn1: waypoint + Owner: Neutral + Location: 11,79 + ScrinReinforcementsSpawn6: waypoint + Owner: Neutral + Location: 120,78 + ScrinReinforcementsSpawn7: waypoint + Owner: Neutral + Location: 125,34 + ScrinReinforcementsSpawn3: waypoint + Owner: Neutral + Location: 23,79 + ScrinReinforcementsSpawn5: waypoint + Owner: Neutral + Location: 105,76 + ScrinReinforcementsSpawn8: waypoint + Owner: Neutral + Location: 9,48 + IslandGrav1: grav + Owner: Scrin + Location: 122,94 + IslandGrav2: grav + Owner: Scrin + Location: 126,93 + Actor595: reac + Owner: Scrin + Location: 61,94 + RebelSpawnPoint1: waypoint + Owner: Neutral + Location: 46,30 + RebelSpawnPoint2: waypoint + Owner: Neutral + Location: 102,29 + ScrinBaseCenter: waypoint + Owner: Neutral + Location: 70,85 + ScrinHiddenSpawn3: waypoint + Owner: Neutral + Location: 118,96 + ScrinHiddenSpawn5: waypoint + Owner: Neutral + Location: 128,89 + ScrinHiddenSpawn4: waypoint + Owner: Neutral + Location: 125,96 + ScrinHiddenSpawn2: waypoint + Owner: Neutral + Location: 2,96 + ScrinHiddenSpawn1: waypoint + Owner: Neutral + Location: 1,92 + ScrinHiddenSpawn6: waypoint + Owner: Neutral + Location: 128,86 + Actor603: camera + Owner: Scrin + Location: 98,30 + Actor604: camera + Owner: Scrin + Location: 65,24 + Actor605: camera + Owner: Scrin + Location: 50,24 + Actor606: camera + Owner: Scrin + Location: 68,34 + Actor607: camera + Owner: Scrin + Location: 41,27 + Actor608: camera + Owner: Scrin + Location: 50,12 + Actor609: camera + Owner: Scrin + Location: 26,13 + Actor610: camera + Owner: Scrin + Location: 22,28 + Actor611: camera + Owner: Scrin + Location: 116,39 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|missions/main-campaign/ca35-purification/purification-rules.yaml, ca|rules/custom/coop-rules.yaml, purification-coop-rules.yaml + +Sequences: ca|missions/main-campaign/ca35-purification/purification-sequences.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/coop-campaign/ca35-purification-coop/purification-coop-rules.yaml b/mods/ca/missions/coop-campaign/ca35-purification-coop/purification-coop-rules.yaml new file mode 100644 index 0000000000..263e0af74b --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca35-purification-coop/purification-coop-rules.yaml @@ -0,0 +1,6 @@ +World: + LuaScript: + Scripts: campaign.lua, coop.lua, ca|missions/main-campaign/ca35-purification/purification.lua, purification-coop.lua + LobbyMissionInfo@InitialObjectives: + Prefix: Initial Objectives + Text: • Deliver enough Liquid Tiberium to the cave entrance for the device to reach full power. diff --git a/mods/ca/missions/coop-campaign/ca35-purification-coop/purification-coop.lua b/mods/ca/missions/coop-campaign/ca35-purification-coop/purification-coop.lua new file mode 100644 index 0000000000..e14be18198 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca35-purification-coop/purification-coop.lua @@ -0,0 +1,35 @@ + +SetupPlayers = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Multi2 = Player.GetPlayer("Multi2") + Multi3 = Player.GetPlayer("Multi3") + Multi4 = Player.GetPlayer("Multi4") + Multi5 = Player.GetPlayer("Multi5") + Nod = Player.GetPlayer("Nod") + Scrin = Player.GetPlayer("Scrin") + ScrinRebels = Player.GetPlayer("ScrinRebels") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = Utils.Where({ Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 }, function(p) return p ~= nil end) + MissionEnemies = { Scrin } + SinglePlayerPlayer = Nod + CoopInit() +end + +AfterWorldLoaded = function() + local firstActivePlayer = GetFirstActivePlayer() + TransferBaseToPlayer(SinglePlayerPlayer, firstActivePlayer) + StartCashSpread(3500) + + local mcvPath = { CPos.New(74,1), CPos.New(72, 6) } + + Utils.Do(GetMcvPlayers(), function(p) + if p ~= firstActivePlayer then + Reinforcements.Reinforce(p, { "amcv" }, mcvPath) + end + end) +end + +AfterTick = function() + +end diff --git a/mods/ca/missions/coop-campaign/ca36-reckoning-coop/map.bin b/mods/ca/missions/coop-campaign/ca36-reckoning-coop/map.bin new file mode 100644 index 0000000000..3db766133a Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca36-reckoning-coop/map.bin differ diff --git a/mods/ca/missions/coop-campaign/ca36-reckoning-coop/map.png b/mods/ca/missions/coop-campaign/ca36-reckoning-coop/map.png new file mode 100644 index 0000000000..46b4ed1b38 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca36-reckoning-coop/map.png differ diff --git a/mods/ca/missions/coop-campaign/ca36-reckoning-coop/map.yaml b/mods/ca/missions/coop-campaign/ca36-reckoning-coop/map.yaml new file mode 100644 index 0000000000..34cb2b6848 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca36-reckoning-coop/map.yaml @@ -0,0 +1,4901 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 36: Reckoning Co-op + +Author: Darkademic & Gandorques Hikla + +Tileset: TEMPERAT + +MapSize: 146,146 + +Bounds: 1,1,144,144 + +Visibility: Lobby + +Categories: Co-op Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Scrin, ScrinRebels, GDI, GDIHostile + PlayerReference@Nod: + Name: Nod + Faction: nod + Color: FE1100 + Allies: ScrinRebels, GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, GDIHostile, Creeps + PlayerReference@Scrin: + Name: Scrin + Bot: campaign + Faction: scrin + Color: 7700FF + Enemies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, ScrinRebels, GDI, GDIHostile, Creeps + PlayerReference@ScrinRebels: + Name: ScrinRebels + Faction: scrin + Color: 55E1AE + Allies: Nod, GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Creeps + PlayerReference@GDI: + Name: GDI + Bot: campaign + Faction: gdi + Color: F2CF74 + Allies: Nod, ScrinRebels, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Scrin, Creeps + PlayerReference@GDIHostile: + Name: GDIHostile + Bot: campaign + Faction: gdi + Color: F2CF74 + Enemies: Scrin, Nod, Creeps + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: FE1100 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, ScrinRebels, GDI + Enemies: Scrin, GDIHostile, Creeps + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: F2CF74 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, ScrinRebels, GDI + Enemies: Scrin, GDIHostile, Creeps + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: scrin + Color: 55E1AE + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, ScrinRebels, GDI + Enemies: Scrin, GDIHostile, Creeps + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: nod + Color: 0B7310 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, ScrinRebels, GDI + Enemies: Scrin, GDIHostile, Creeps + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: gdi + Color: EA7816 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, ScrinRebels, GDI + Enemies: Scrin, GDIHostile, Creeps + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: scrin + Color: D83CE5 + LockColor: True + Allies: Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, ScrinRebels, GDI + Enemies: Scrin, GDIHostile, Creeps + +Actors: + Actor0: amcv + Owner: Nod + Location: 23,7 + Facing: 491 + PlayerStart: waypoint + Owner: Neutral + Location: 23,7 + Actor2: ltnk + Owner: Nod + Location: 20,7 + Facing: 512 + Actor5: n1c + Owner: Nod + Location: 22,11 + SubCell: 2 + Facing: 512 + Actor6: n1c + Owner: Nod + Location: 22,11 + SubCell: 4 + Facing: 512 + Actor7: n1c + Owner: Nod + Location: 22,11 + SubCell: 5 + Facing: 512 + Actor11: n3c + Owner: Nod + Location: 22,10 + SubCell: 4 + Facing: 512 + Actor12: n3c + Owner: Nod + Location: 22,10 + SubCell: 5 + Facing: 512 + Actor1: ftnk + Owner: Nod + Location: 21,9 + Facing: 512 + Actor4: n1c + Owner: Nod + Location: 22,11 + SubCell: 1 + Facing: 512 + Actor9: ltnk + Owner: Nod + Facing: 512 + Location: 26,7 + Actor10: ftnk + Owner: Nod + Facing: 512 + Location: 25,9 + Actor13: n3c + Owner: Nod + SubCell: 4 + Facing: 512 + Location: 24,10 + Actor14: n3c + Owner: Nod + SubCell: 5 + Facing: 512 + Location: 24,10 + Actor15: n1c + Owner: Nod + SubCell: 2 + Facing: 512 + Location: 24,11 + Actor16: n1c + Owner: Nod + SubCell: 4 + Facing: 512 + Location: 24,11 + Actor17: n1c + Owner: Nod + SubCell: 5 + Facing: 512 + Location: 24,11 + Actor18: n1c + Owner: Nod + SubCell: 1 + Facing: 512 + Location: 24,11 + Actor19: rmbc + Owner: Nod + SubCell: 3 + Location: 19,9 + Facing: 512 + Actor20: rmbc + Owner: Nod + SubCell: 3 + Location: 27,9 + Facing: 512 + Actor21: splitblue + Owner: Neutral + Location: 11,14 + Actor22: splitblue + Owner: Neutral + Location: 13,22 + Actor23: swal + Owner: ScrinRebels + Location: 75,23 + Actor24: swal + Owner: ScrinRebels + Location: 75,24 + Actor25: swal + Owner: ScrinRebels + Location: 74,23 + Actor26: swal + Owner: ScrinRebels + Location: 74,24 + Actor27: swal + Owner: ScrinRebels + Location: 73,23 + Actor28: swal + Owner: ScrinRebels + Location: 73,22 + Actor29: swal + Owner: ScrinRebels + Location: 74,22 + Actor30: swal + Owner: ScrinRebels + Location: 82,23 + Actor31: swal + Owner: ScrinRebels + Location: 82,24 + Actor32: swal + Owner: ScrinRebels + Location: 83,23 + Actor33: swal + Owner: ScrinRebels + Location: 83,24 + Actor34: swal + Owner: ScrinRebels + Location: 83,22 + Actor35: swal + Owner: ScrinRebels + Location: 84,23 + Actor36: swal + Owner: ScrinRebels + Location: 84,22 + Actor37: swal + Owner: ScrinRebels + Location: 72,22 + Actor38: swal + Owner: ScrinRebels + Location: 71,22 + Actor39: swal + Owner: ScrinRebels + Location: 70,22 + Actor40: swal + Owner: ScrinRebels + Location: 85,22 + Actor41: swal + Owner: ScrinRebels + Location: 86,22 + Actor42: swal + Owner: ScrinRebels + Location: 87,22 + Actor43: swal + Owner: ScrinRebels + Location: 70,21 + Actor44: swal + Owner: ScrinRebels + Location: 70,20 + Actor45: swal + Owner: ScrinRebels + Location: 70,19 + Actor46: swal + Owner: ScrinRebels + Location: 70,18 + Actor51: swal + Owner: ScrinRebels + Location: 69,18 + Actor52: swal + Owner: ScrinRebels + Location: 69,17 + Actor53: swal + Owner: ScrinRebels + Location: 70,17 + Actor57: swal + Owner: ScrinRebels + Location: 69,11 + Actor58: swal + Owner: ScrinRebels + Location: 69,10 + Actor59: swal + Owner: ScrinRebels + Location: 70,10 + Actor60: swal + Owner: ScrinRebels + Location: 70,11 + Actor61: swal + Owner: ScrinRebels + Location: 69,9 + Actor62: swal + Owner: ScrinRebels + Location: 69,8 + Actor63: swal + Owner: ScrinRebels + Location: 69,7 + Actor64: swal + Owner: ScrinRebels + Location: 69,6 + Actor65: swal + Owner: ScrinRebels + Location: 69,5 + Actor90: swal + Owner: ScrinRebels + Location: 87,1 + Actor93: swal + Owner: ScrinRebels + Location: 73,1 + Actor94: swal + Owner: ScrinRebels + Location: 74,1 + Actor96: swal + Owner: ScrinRebels + Location: 69,4 + Actor97: swal + Owner: ScrinRebels + Location: 69,3 + Actor98: swal + Owner: ScrinRebels + Location: 69,2 + Actor99: swal + Owner: ScrinRebels + Location: 69,1 + Actor100: swal + Owner: ScrinRebels + Location: 70,1 + Actor101: swal + Owner: ScrinRebels + Location: 71,1 + Actor102: swal + Owner: ScrinRebels + Location: 72,1 + Actor103: swal + Owner: ScrinRebels + Location: 70,2 + Actor91: swal + Owner: ScrinRebels + Location: 75,1 + Actor92: swal + Owner: ScrinRebels + Location: 77,1 + Actor95: swal + Owner: ScrinRebels + Location: 76,1 + Actor104: swal + Owner: ScrinRebels + Location: 78,1 + Actor105: swal + Owner: ScrinRebels + Location: 79,1 + Actor106: swal + Owner: ScrinRebels + Location: 80,1 + Actor107: swal + Owner: ScrinRebels + Location: 81,1 + Actor108: swal + Owner: ScrinRebels + Location: 82,1 + Actor109: swal + Owner: ScrinRebels + Location: 83,1 + Actor110: swal + Owner: ScrinRebels + Location: 84,1 + Actor111: swal + Owner: ScrinRebels + Location: 85,1 + Actor112: swal + Owner: ScrinRebels + Location: 86,1 + RebelPortal1: port + Owner: ScrinRebels + Location: 80,16 + Actor116: rea2 + Owner: ScrinRebels + Location: 71,2 + Actor117: rea2 + Owner: ScrinRebels + Location: 74,2 + Actor118: rea2 + Owner: ScrinRebels + Location: 77,2 + Actor119: rea2 + Owner: ScrinRebels + Location: 80,2 + Actor120: rea2 + Owner: ScrinRebels + Location: 83,2 + Actor121: swal + Owner: ScrinRebels + Location: 88,1 + Actor122: swal + Owner: ScrinRebels + Location: 89,1 + Actor123: swal + Owner: ScrinRebels + Location: 90,1 + Actor124: swal + Owner: ScrinRebels + Location: 89,2 + Actor125: swal + Owner: ScrinRebels + Location: 90,2 + Actor126: swal + Owner: ScrinRebels + Location: 90,3 + Actor127: swal + Owner: ScrinRebels + Location: 90,4 + Actor128: swal + Owner: ScrinRebels + Location: 90,5 + Actor129: swal + Owner: ScrinRebels + Location: 90,6 + Actor130: swal + Owner: ScrinRebels + Location: 90,7 + Actor131: swal + Owner: ScrinRebels + Location: 90,8 + Actor132: swal + Owner: ScrinRebels + Location: 90,9 + Actor133: swal + Owner: ScrinRebels + Location: 89,10 + Actor134: swal + Owner: ScrinRebels + Location: 90,10 + Actor135: swal + Owner: ScrinRebels + Location: 89,11 + Actor136: swal + Owner: ScrinRebels + Location: 90,11 + Actor137: swal + Owner: ScrinRebels + Location: 89,17 + Actor138: swal + Owner: ScrinRebels + Location: 90,17 + Actor139: swal + Owner: ScrinRebels + Location: 89,18 + Actor140: swal + Owner: ScrinRebels + Location: 90,18 + Actor141: swal + Owner: ScrinRebels + Location: 89,19 + Actor142: swal + Owner: ScrinRebels + Location: 89,20 + Actor143: swal + Owner: ScrinRebels + Location: 89,21 + Actor144: swal + Owner: ScrinRebels + Location: 88,22 + Actor145: swal + Owner: ScrinRebels + Location: 89,22 + Actor146: rea2 + Owner: ScrinRebels + Location: 86,2 + Actor152: shar + Owner: ScrinRebels + Location: 71,21 + TurretFacing: 341 + Actor153: shar + Owner: ScrinRebels + Location: 88,21 + TurretFacing: 658 + Actor154: scol + Owner: ScrinRebels + Location: 75,22 + Actor155: scol + Owner: ScrinRebels + Location: 82,22 + Actor156: scol + Owner: ScrinRebels + Location: 71,18 + Actor157: scol + Owner: ScrinRebels + Location: 88,18 + Actor160: srep + Owner: ScrinRebels + Location: 78,12 + RebelMainNerveCenter: nerv + Owner: ScrinRebels + Location: 72,7 + Actor161: proc.scrin + Owner: ScrinRebels + Location: 73,11 + RebelWarpSphere1: wsph + Owner: ScrinRebels + Location: 75,16 + RebelGravityStabilizer1: grav + Owner: ScrinRebels + Location: 83,12 + Actor149: sign + Owner: ScrinRebels + Location: 86,6 + Actor151: splitblue + Owner: Neutral + Location: 66,6 + Actor164: splitblue + Owner: Neutral + Location: 65,10 + Actor165: splitblue + Owner: Neutral + Location: 93,14 + Actor166: splitblue + Owner: Neutral + Location: 94,7 + Actor167: ptur + Owner: ScrinRebels + TurretFacing: 512 + Location: 75,25 + Actor168: ptur + Owner: ScrinRebels + TurretFacing: 512 + Location: 82,25 + Actor158: swal + Owner: ScrinRebels + Location: 76,24 + Actor159: swal + Owner: ScrinRebels + Location: 76,23 + Actor169: swal + Owner: ScrinRebels + Location: 81,23 + Actor170: swal + Owner: ScrinRebels + Location: 81,24 + Actor171: tpod + Owner: ScrinRebels + Facing: 384 + Location: 73,20 + Actor172: tpod + Owner: ScrinRebels + Location: 86,20 + Facing: 512 + Actor173: devo + Owner: ScrinRebels + Facing: 384 + Location: 86,24 + Actor174: intl + Owner: ScrinRebels + Facing: 384 + Location: 68,20 + Actor175: gunw + Owner: ScrinRebels + Location: 86,10 + Facing: 570 + Actor176: gunw + Owner: ScrinRebels + Location: 75,8 + Facing: 384 + Actor177: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 69,21 + Actor178: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 67,20 + Actor179: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 68,23 + Actor180: s1 + Owner: ScrinRebels + SubCell: 3 + Location: 88,23 + Facing: 491 + Actor181: s1 + Owner: ScrinRebels + Location: 88,24 + SubCell: 3 + Facing: 539 + Actor182: s3 + Owner: ScrinRebels + Facing: 384 + Location: 88,24 + SubCell: 1 + Actor183: s2 + Owner: ScrinRebels + SubCell: 3 + Facing: 384 + Location: 90,22 + Actor184: s4 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 70,23 + Actor185: s4 + Owner: ScrinRebels + SubCell: 3 + Location: 84,20 + Facing: 483 + Actor186: s4 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 74,21 + Actor187: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 74,25 + Actor188: s1 + Owner: ScrinRebels + SubCell: 3 + Location: 81,26 + Facing: 578 + Actor189: s1 + Owner: ScrinRebels + SubCell: 3 + Location: 80,24 + Facing: 499 + Actor190: tpod + Owner: ScrinRebels + Location: 37,19 + Facing: 384 + Health: 86 + Actor192: s1 + Owner: Scrin + SubCell: 3 + Location: 37,23 + Facing: 959 + Actor193: s1 + Owner: Scrin + SubCell: 3 + Location: 33,23 + Facing: 1015 + Actor194: s1 + Owner: Scrin + SubCell: 3 + Location: 37,24 + Facing: 856 + Actor195: s1 + Owner: ScrinRebels + SubCell: 3 + Facing: 384 + Location: 38,20 + Actor197: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 40,22 + Actor198: s1 + Owner: ScrinRebels + SubCell: 3 + Location: 35,19 + Facing: 499 + Actor196: swal + Owner: Scrin + Location: 8,129 + Actor199: swal + Owner: Scrin + Location: 8,130 + Actor200: swal + Owner: Scrin + Location: 8,128 + Actor201: swal + Owner: Scrin + Location: 9,128 + Actor202: swal + Owner: Scrin + Location: 10,128 + Actor203: swal + Owner: Scrin + Location: 10,129 + Actor204: swal + Owner: Scrin + Location: 10,130 + Actor205: swal + Owner: Scrin + Location: 9,130 + Actor206: swal + Owner: Scrin + Location: 10,120 + Actor207: swal + Owner: Scrin + Location: 10,121 + Actor208: swal + Owner: Scrin + Location: 9,121 + Actor209: swal + Owner: Scrin + Location: 9,122 + Actor210: swal + Owner: Scrin + Location: 10,122 + Actor211: swal + Owner: Scrin + Location: 11,120 + Actor212: swal + Owner: Scrin + Location: 12,120 + Actor213: swal + Owner: Scrin + Location: 12,121 + Actor214: swal + Owner: Scrin + Location: 12,122 + Actor215: swal + Owner: Scrin + Location: 11,122 + Actor216: swal + Owner: Scrin + Location: 10,138 + Actor217: swal + Owner: Scrin + Location: 11,138 + Actor218: swal + Owner: Scrin + Location: 10,137 + Actor219: swal + Owner: Scrin + Location: 11,137 + Actor220: swal + Owner: Scrin + Location: 10,136 + Actor221: swal + Owner: Scrin + Location: 10,135 + Actor222: swal + Owner: Scrin + Location: 11,135 + Actor223: swal + Owner: Scrin + Location: 12,135 + Actor224: swal + Owner: Scrin + Location: 12,137 + Actor225: swal + Owner: Scrin + Location: 12,136 + Actor226: swal + Owner: Scrin + Location: 20,140 + Actor227: swal + Owner: Scrin + Location: 20,139 + Actor228: swal + Owner: Scrin + Location: 21,139 + Actor229: swal + Owner: Scrin + Location: 21,140 + Actor230: swal + Owner: Scrin + Location: 21,138 + Actor231: swal + Owner: Scrin + Location: 22,139 + Actor232: swal + Owner: Scrin + Location: 23,139 + Actor233: swal + Owner: Scrin + Location: 23,138 + Actor234: swal + Owner: Scrin + Location: 21,137 + Actor235: swal + Owner: Scrin + Location: 23,137 + Actor236: swal + Owner: Scrin + Location: 22,137 + Actor237: swal + Owner: Scrin + Location: 18,116 + Actor238: swal + Owner: Scrin + Location: 18,117 + Actor239: swal + Owner: Scrin + Location: 18,118 + Actor240: swal + Owner: Scrin + Location: 19,118 + Actor241: swal + Owner: Scrin + Location: 20,118 + Actor242: swal + Owner: Scrin + Location: 20,117 + Actor243: swal + Owner: Scrin + Location: 20,116 + Actor244: swal + Owner: Scrin + Location: 19,116 + Actor245: swal + Owner: Scrin + Location: 26,116 + Actor246: swal + Owner: Scrin + Location: 27,116 + Actor247: swal + Owner: Scrin + Location: 27,117 + Actor248: swal + Owner: Scrin + Location: 27,118 + Actor249: swal + Owner: Scrin + Location: 26,118 + Actor250: swal + Owner: Scrin + Location: 25,118 + Actor251: swal + Owner: Scrin + Location: 25,117 + Actor252: swal + Owner: Scrin + Location: 25,116 + Actor253: swal + Owner: Scrin + Location: 34,118 + Actor254: swal + Owner: Scrin + Location: 35,118 + Actor255: swal + Owner: Scrin + Location: 34,119 + Actor256: swal + Owner: Scrin + Location: 35,119 + Actor257: swal + Owner: Scrin + Location: 35,120 + Actor258: swal + Owner: Scrin + Location: 36,119 + Actor259: swal + Owner: Scrin + Location: 36,120 + Actor260: swal + Owner: Scrin + Location: 35,121 + Actor261: swal + Owner: Scrin + Location: 36,121 + Actor262: swal + Owner: Scrin + Location: 34,121 + Actor263: swal + Owner: Scrin + Location: 34,122 + Actor264: swal + Owner: Scrin + Location: 34,123 + Actor265: swal + Owner: Scrin + Location: 35,123 + Actor266: swal + Owner: Scrin + Location: 36,123 + Actor267: swal + Owner: Scrin + Location: 36,122 + Actor268: scol + Owner: Scrin + Location: 11,121 + Actor269: scol + Owner: Scrin + Location: 9,129 + Actor270: scol + Owner: Scrin + Location: 11,136 + Actor271: scol + Owner: Scrin + Location: 22,138 + Actor272: scol + Owner: Scrin + Location: 19,117 + Actor273: scol + Owner: Scrin + Location: 26,117 + Actor274: scol + Owner: Scrin + Location: 35,122 + Actor275: shar + Owner: Scrin + Location: 10,132 + Actor276: shar + Owner: Scrin + Location: 10,125 + Actor277: shar + Owner: Scrin + Location: 15,119 + Actor278: shar + Owner: Scrin + Location: 31,119 + Actor279: shar + Owner: Scrin + Location: 16,138 + Actor280: sfac + Owner: Scrin + Location: 19,130 + Actor281: rea2 + Owner: Scrin + Location: 13,135 + Actor282: rea2 + Owner: Scrin + Location: 16,135 + Actor283: rea2 + Owner: Scrin + Location: 14,132 + Actor284: rea2 + Owner: Scrin + Location: 12,129 + Actor285: rea2 + Owner: Scrin + Location: 25,133 + Portal1: port + Owner: Scrin + Location: 17,119 + Actor291: sign + Owner: Scrin + Location: 20,133 + Actor294: scrt + Owner: Scrin + Location: 12,125 + Actor295: nerv + Owner: Scrin + Location: 30,120 + Actor298: swal + Owner: Scrin + Location: 36,124 + Actor299: swal + Owner: Scrin + Location: 38,124 + Actor300: swal + Owner: Scrin + Location: 37,124 + Actor301: swal + Owner: Scrin + Location: 39,124 + Actor302: swal + Owner: Scrin + Location: 39,125 + Actor303: swal + Owner: Scrin + Location: 37,133 + Actor304: swal + Owner: Scrin + Location: 37,132 + Actor305: swal + Owner: Scrin + Location: 37,131 + Actor306: swal + Owner: Scrin + Location: 39,131 + Actor307: swal + Owner: Scrin + Location: 38,131 + Actor308: swal + Owner: Scrin + Location: 39,130 + Actor309: swal + Owner: Scrin + Location: 38,130 + Actor310: swal + Owner: Scrin + Location: 38,125 + Actor311: swal + Owner: Scrin + Location: 40,131 + Actor312: swal + Owner: Scrin + Location: 41,131 + Actor313: swal + Owner: Scrin + Location: 42,131 + Actor314: swal + Owner: Scrin + Location: 43,131 + Actor315: swal + Owner: Scrin + Location: 43,132 + Actor316: swal + Owner: Scrin + Location: 43,133 + Actor317: swal + Owner: Scrin + Location: 44,133 + Actor318: swal + Owner: Scrin + Location: 45,133 + Actor319: swal + Owner: Scrin + Location: 45,132 + Actor320: swal + Owner: Scrin + Location: 45,131 + Actor321: swal + Owner: Scrin + Location: 44,131 + Actor322: swal + Owner: Scrin + Location: 37,134 + Actor323: swal + Owner: Scrin + Location: 37,135 + Actor324: swal + Owner: Scrin + Location: 36,135 + Actor325: swal + Owner: Scrin + Location: 36,134 + Actor326: swal + Owner: Scrin + Location: 43,123 + Actor327: swal + Owner: Scrin + Location: 43,124 + Actor328: swal + Owner: Scrin + Location: 43,125 + Actor329: swal + Owner: Scrin + Location: 44,125 + Actor330: swal + Owner: Scrin + Location: 45,125 + Actor331: swal + Owner: Scrin + Location: 45,124 + Actor332: swal + Owner: Scrin + Location: 45,123 + Actor333: swal + Owner: Scrin + Location: 44,123 + Actor334: swal + Owner: Scrin + Location: 40,124 + Actor335: swal + Owner: Scrin + Location: 41,124 + Actor336: swal + Owner: Scrin + Location: 42,124 + Actor337: shar + Owner: Scrin + Location: 29,136 + Actor338: shar + Owner: Scrin + Location: 35,137 + Actor339: scol + Owner: Scrin + Location: 44,124 + Actor340: scol + Owner: Scrin + Location: 44,132 + Exterminator3: etpd + Owner: Scrin + Location: 47,124 + Facing: 768 + Exterminator4: etpd + Owner: Scrin + Location: 47,132 + Facing: 768 + Actor343: rea2 + Owner: Scrin + Location: 31,134 + Actor345: rea2 + Owner: Scrin + Location: 34,131 + Actor346: rea2 + Owner: Scrin + Location: 32,128 + Actor348: rea2 + Owner: Scrin + Location: 28,130 + Actor344: rea2 + Owner: Scrin + Location: 31,131 + Actor347: shar + Owner: Scrin + Location: 37,125 + Actor349: swal + Owner: ScrinRebels + Location: 74,123 + Health: 26 + Actor350: swal + Owner: ScrinRebels + Location: 74,122 + Health: 16 + Actor351: swal + Owner: ScrinRebels + Location: 75,122 + Health: 9 + Actor352: swal + Owner: ScrinRebels + Location: 75,123 + Actor353: swal + Owner: ScrinRebels + Location: 74,121 + Health: 33 + Actor354: swal + Owner: ScrinRebels + Location: 74,120 + Actor355: swal + Owner: ScrinRebels + Location: 74,119 + Actor356: swal + Owner: ScrinRebels + Location: 75,120 + Actor357: swal + Owner: ScrinRebels + Location: 75,119 + Actor358: swal + Owner: ScrinRebels + Location: 74,128 + Actor359: swal + Owner: ScrinRebels + Location: 74,129 + Actor360: swal + Owner: ScrinRebels + Location: 75,129 + Actor361: swal + Owner: ScrinRebels + Location: 75,128 + Actor362: swal + Owner: ScrinRebels + Location: 74,130 + Health: 39 + Actor363: swal + Owner: ScrinRebels + Location: 74,131 + Health: 58 + Actor364: swal + Owner: ScrinRebels + Location: 74,132 + Health: 27 + Actor365: swal + Owner: ScrinRebels + Location: 74,133 + Actor366: swal + Owner: ScrinRebels + Location: 75,133 + Actor367: swal + Owner: ScrinRebels + Location: 75,132 + Actor368: swal + Owner: ScrinRebels + Location: 76,119 + Actor369: swal + Owner: ScrinRebels + Location: 77,119 + Health: 19 + Actor370: swal + Owner: ScrinRebels + Location: 79,119 + Health: 16 + Actor371: swal + Owner: ScrinRebels + Location: 78,119 + Actor375: swal + Owner: ScrinRebels + Location: 76,133 + Health: 22 + Actor376: swal + Owner: ScrinRebels + Location: 78,133 + Actor377: swal + Owner: ScrinRebels + Location: 77,133 + Actor378: swal + Owner: ScrinRebels + Location: 80,133 + Actor379: swal + Owner: ScrinRebels + Location: 79,133 + Actor380: swal + Owner: ScrinRebels + Location: 81,133 + Actor381: swal + Owner: ScrinRebels + Location: 82,133 + Actor388: swal + Owner: ScrinRebels + Location: 87,119 + Actor390: swal + Owner: ScrinRebels + Location: 88,119 + Health: 8 + Actor391: swal + Owner: ScrinRebels + Location: 90,119 + Actor392: swal + Owner: ScrinRebels + Location: 89,119 + Health: 46 + Actor393: swal + Owner: ScrinRebels + Location: 91,119 + Actor394: swal + Owner: ScrinRebels + Location: 91,120 + Actor395: swal + Owner: ScrinRebels + Location: 91,121 + Health: 62 + Actor396: swal + Owner: ScrinRebels + Location: 91,123 + Actor397: swal + Owner: ScrinRebels + Location: 91,122 + Actor398: swal + Owner: ScrinRebels + Location: 91,124 + Actor399: swal + Owner: ScrinRebels + Location: 91,126 + Health: 28 + Actor400: swal + Owner: ScrinRebels + Location: 91,125 + Actor401: swal + Owner: ScrinRebels + Location: 91,127 + Actor402: swal + Owner: ScrinRebels + Location: 91,128 + Actor403: swal + Owner: ScrinRebels + Location: 91,129 + Actor404: swal + Owner: ScrinRebels + Location: 91,131 + Actor405: swal + Owner: ScrinRebels + Location: 91,130 + Actor406: swal + Owner: ScrinRebels + Location: 91,132 + Actor407: swal + Owner: ScrinRebels + Location: 91,133 + Actor408: swal + Owner: ScrinRebels + Location: 89,133 + Actor409: swal + Owner: ScrinRebels + Location: 90,133 + Actor410: swal + Owner: ScrinRebels + Location: 88,133 + Actor411: swal + Owner: ScrinRebels + Location: 87,133 + Actor412: swal + Owner: ScrinRebels + Location: 87,132 + Actor413: swal + Owner: ScrinRebels + Location: 86,132 + Actor414: swal + Owner: ScrinRebels + Location: 86,133 + Health: 26 + FallenRebel6: nerv + Owner: ScrinRebels + Location: 77,121 + Health: 28 + FallenRebel3: rea2 + Owner: ScrinRebels + Location: 88,130 + Health: 25 + FallenRebel2: rea2 + Owner: ScrinRebels + Location: 88,127 + Health: 40 + FallenRebel1: rea2 + Owner: ScrinRebels + Location: 88,124 + Health: 50 + FallenRebel8: scol + Owner: ScrinRebels + Location: 75,130 + Health: 44 + FallenRebel7: scol + Owner: ScrinRebels + Location: 75,121 + Health: 69 + FallenRebel10: ptur + Owner: ScrinRebels + Location: 73,123 + Health: 78 + TurretFacing: 176 + FallenRebel9: ptur + Owner: ScrinRebels + Location: 73,128 + Health: 21 + TurretFacing: 176 + Actor425: shar + Owner: ScrinRebels + Location: 78,126 + TurretFacing: 192 + Health: 45 + Actor426: intl + Owner: ScrinRebels + Location: 71,125 + Facing: 277 + Health: 58 + InitialDefender1: gunw + Owner: ScrinRebels + Location: 72,121 + Health: 66 + Facing: 261 + InitialDefender2: gunw + Owner: ScrinRebels + Location: 75,126 + Health: 62 + Facing: 285 + Actor429: devo + Owner: ScrinRebels + Location: 72,131 + Health: 58 + Facing: 166 + Actor431: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 71,119 + Actor432: s1 + Owner: ScrinRebels + SubCell: 3 + Location: 70,132 + Facing: 103 + Actor433: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 71,131 + Actor434: s1 + Owner: ScrinRebels + SubCell: 3 + Location: 70,128 + Facing: 222 + Actor435: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 71,123 + Actor436: s1 + Owner: ScrinRebels + Facing: 384 + Location: 71,119 + SubCell: 1 + Actor437: s1 + Owner: ScrinRebels + SubCell: 3 + Location: 71,134 + Facing: 111 + Actor438: s3 + Owner: ScrinRebels + SubCell: 3 + Facing: 384 + Location: 71,127 + Actor439: s3 + Owner: ScrinRebels + Facing: 384 + Location: 72,120 + SubCell: 3 + Actor442: swal + Owner: Neutral + Location: 8,94 + Health: 31 + Actor444: swal + Owner: Neutral + Location: 8,93 + Health: 17 + Actor445: swal + Owner: Neutral + Location: 7,93 + Health: 55 + Actor448: swal + Owner: Neutral + Location: 7,94 + Health: 13 + Actor449: swal + Owner: Neutral + Location: 6,94 + Health: 18 + Actor450: swal + Owner: Neutral + Location: 4,95 + Health: 26 + Actor451: swal + Owner: Neutral + Location: 3,95 + Health: 21 + Actor453: swal + Owner: Neutral + Location: 2,95 + Actor466: swal + Owner: Neutral + Location: 1,95 + Actor467: swal + Owner: Neutral + Location: 1,94 + Actor468: swal + Owner: Neutral + Location: 1,92 + Health: 6 + Actor469: swal + Owner: Neutral + Location: 1,93 + Health: 51 + Actor452: swal + Owner: Neutral + Location: 17,90 + Health: 59 + Actor454: swal + Owner: Neutral + Location: 17,91 + Health: 27 + Actor455: swal + Owner: Neutral + Location: 18,91 + Health: 73 + Actor465: swal + Owner: Neutral + Location: 18,90 + Health: 16 + Actor470: swal + Owner: Neutral + Location: 16,90 + Health: 10 + Actor471: swal + Owner: Neutral + Location: 19,91 + Health: 23 + Actor472: swal + Owner: Neutral + Location: 11,83 + Health: 13 + Actor473: swal + Owner: Neutral + Location: 11,84 + Health: 28 + Actor474: swal + Owner: Neutral + Location: 11,85 + Health: 25 + Actor475: swal + Owner: Neutral + Location: 12,85 + Health: 45 + Actor477: swal + Owner: Neutral + Location: 13,85 + Actor478: swal + Owner: Neutral + Location: 13,84 + Health: 68 + Actor479: swal + Owner: Neutral + Location: 13,83 + Actor476: swal + Owner: Neutral + Location: 12,83 + Health: 62 + Actor480: swal + Owner: Neutral + Location: 10,83 + Health: 40 + Actor481: swal + Owner: Neutral + Location: 9,83 + Health: 50 + Actor482: swal + Owner: Neutral + Location: 7,83 + Health: 3 + Actor483: swal + Owner: ScrinRebels + Location: 61,76 + Actor484: swal + Owner: ScrinRebels + Location: 61,74 + Actor485: swal + Owner: ScrinRebels + Location: 61,75 + Actor486: swal + Owner: ScrinRebels + Location: 62,76 + Actor487: swal + Owner: ScrinRebels + Location: 62,74 + Actor488: swal + Owner: ScrinRebels + Location: 63,74 + Actor489: swal + Owner: ScrinRebels + Location: 63,75 + Actor490: swal + Owner: ScrinRebels + Location: 63,76 + Actor491: swal + Owner: ScrinRebels + Location: 64,75 + Actor492: swal + Owner: ScrinRebels + Location: 65,75 + Actor493: swal + Owner: ScrinRebels + Location: 66,75 + Actor494: swal + Owner: ScrinRebels + Location: 66,76 + Actor495: swal + Owner: ScrinRebels + Location: 67,76 + Actor496: swal + Owner: ScrinRebels + Location: 67,75 + Actor497: swal + Owner: ScrinRebels + Location: 56,72 + Actor498: swal + Owner: ScrinRebels + Location: 56,73 + Actor499: swal + Owner: ScrinRebels + Location: 55,73 + Actor500: swal + Owner: ScrinRebels + Location: 53,73 + Actor501: swal + Owner: ScrinRebels + Location: 53,72 + Actor502: swal + Owner: ScrinRebels + Location: 54,73 + Actor503: swal + Owner: ScrinRebels + Location: 54,72 + Actor504: swal + Owner: ScrinRebels + Location: 54,71 + Actor505: swal + Owner: ScrinRebels + Location: 55,71 + Actor506: swal + Owner: ScrinRebels + Location: 56,71 + Actor507: swal + Owner: ScrinRebels + Location: 52,73 + Actor508: swal + Owner: ScrinRebels + Location: 51,73 + Actor509: swal + Owner: ScrinRebels + Location: 51,72 + Actor510: swal + Owner: ScrinRebels + Location: 51,70 + Actor511: swal + Owner: ScrinRebels + Location: 51,71 + Actor512: swal + Owner: ScrinRebels + Location: 51,69 + Actor513: swal + Owner: ScrinRebels + Location: 68,76 + Actor514: swal + Owner: ScrinRebels + Location: 69,76 + Actor515: swal + Owner: ScrinRebels + Location: 70,76 + Actor516: swal + Owner: ScrinRebels + Location: 71,76 + Actor517: swal + Owner: ScrinRebels + Location: 71,75 + Actor518: swal + Owner: ScrinRebels + Location: 71,74 + Actor519: swal + Owner: ScrinRebels + Location: 72,74 + Actor520: swal + Owner: ScrinRebels + Location: 73,74 + Actor521: swal + Owner: ScrinRebels + Location: 73,73 + Actor522: swal + Owner: ScrinRebels + Location: 74,74 + Actor523: swal + Owner: ScrinRebels + Location: 74,73 + Actor524: swal + Owner: ScrinRebels + Location: 50,69 + Actor525: swal + Owner: ScrinRebels + Location: 50,70 + Actor526: swal + Owner: ScrinRebels + Location: 50,68 + Actor527: swal + Owner: ScrinRebels + Location: 50,67 + Actor528: swal + Owner: ScrinRebels + Location: 50,66 + Actor529: swal + Owner: ScrinRebels + Location: 51,66 + Actor530: swal + Owner: ScrinRebels + Location: 51,67 + Actor531: swal + Owner: ScrinRebels + Location: 58,57 + Actor532: swal + Owner: ScrinRebels + Location: 58,56 + Actor533: swal + Owner: ScrinRebels + Location: 59,56 + Actor534: swal + Owner: ScrinRebels + Location: 59,57 + Actor535: swal + Owner: ScrinRebels + Location: 60,56 + Actor536: swal + Owner: ScrinRebels + Location: 61,56 + Actor537: swal + Owner: ScrinRebels + Location: 62,56 + Actor538: swal + Owner: ScrinRebels + Location: 63,56 + Actor539: swal + Owner: ScrinRebels + Location: 64,56 + Actor540: swal + Owner: ScrinRebels + Location: 64,57 + Actor541: swal + Owner: ScrinRebels + Location: 63,57 + Actor542: swal + Owner: ScrinRebels + Location: 71,58 + Actor543: swal + Owner: ScrinRebels + Location: 70,58 + Actor544: swal + Owner: ScrinRebels + Location: 70,59 + Actor545: swal + Owner: ScrinRebels + Location: 71,59 + Actor546: swal + Owner: ScrinRebels + Location: 72,58 + Actor547: swal + Owner: ScrinRebels + Location: 73,58 + Actor548: swal + Owner: ScrinRebels + Location: 73,59 + Actor549: swal + Owner: ScrinRebels + Location: 73,60 + Actor550: swal + Owner: ScrinRebels + Location: 74,60 + Actor551: swal + Owner: ScrinRebels + Location: 74,61 + Actor552: swal + Owner: ScrinRebels + Location: 74,62 + Actor553: swal + Owner: ScrinRebels + Location: 74,63 + Actor554: swal + Owner: ScrinRebels + Location: 74,66 + Actor555: swal + Owner: ScrinRebels + Location: 74,65 + Actor556: swal + Owner: ScrinRebels + Location: 74,64 + Actor557: swal + Owner: ScrinRebels + Location: 73,66 + Actor558: swal + Owner: ScrinRebels + Location: 73,65 + Actor566: swal + Owner: ScrinRebels + Location: 53,60 + Actor559: swal + Owner: ScrinRebels + Location: 52,61 + Actor560: swal + Owner: ScrinRebels + Location: 53,61 + Actor561: swal + Owner: ScrinRebels + Location: 52,59 + Actor562: swal + Owner: ScrinRebels + Location: 51,59 + Actor563: swal + Owner: ScrinRebels + Location: 51,61 + Actor564: swal + Owner: ScrinRebels + Location: 53,59 + Actor567: swal + Owner: ScrinRebels + Location: 51,60 + Actor565: reac + Owner: ScrinRebels + Location: 65,71 + Actor568: reac + Owner: ScrinRebels + Location: 67,71 + Actor569: reac + Owner: ScrinRebels + Location: 65,67 + Actor570: reac + Owner: ScrinRebels + Location: 67,67 + Actor571: port + Owner: ScrinRebels + Location: 62,68 + Actor572: wsph + Owner: ScrinRebels + Location: 55,65 + Actor573: nerv + Owner: ScrinRebels + Location: 70,61 + Actor574: proc.scrin + Owner: ScrinRebels + Location: 57,60 + Actor575: scol + Owner: ScrinRebels + Location: 62,75 + Actor576: scol + Owner: ScrinRebels + Location: 55,72 + Actor577: scol + Owner: ScrinRebels + Location: 52,60 + Actor578: shar + Owner: ScrinRebels + Location: 72,73 + Actor579: shar + Owner: ScrinRebels + Location: 53,69 + Actor580: shar + Owner: ScrinRebels + Location: 61,58 + Actor582: ptur + Owner: ScrinRebels + Location: 55,74 + TurretFacing: 364 + Actor581: ptur + Owner: ScrinRebels + Location: 62,77 + TurretFacing: 452 + Actor583: grav + Owner: ScrinRebels + Location: 64,62 + Actor584: silo.scrin + Owner: ScrinRebels + Location: 61,63 + Actor585: silo.scrin + Owner: ScrinRebels + Location: 61,65 + Actor586: swal + Owner: Scrin + Location: 31,96 + Actor587: swal + Owner: Scrin + Location: 31,97 + Actor588: swal + Owner: Scrin + Location: 32,96 + Actor589: swal + Owner: Scrin + Location: 32,97 + Actor590: swal + Owner: Scrin + Location: 31,95 + Actor591: swal + Owner: Scrin + Location: 32,95 + Actor592: swal + Owner: Scrin + Location: 32,94 + Actor593: swal + Owner: Scrin + Location: 32,93 + Actor594: swal + Owner: Scrin + Location: 32,92 + Actor595: swal + Owner: Scrin + Location: 32,91 + Actor596: swal + Owner: Scrin + Location: 31,91 + Actor597: swal + Owner: Scrin + Location: 31,90 + Actor598: swal + Owner: Scrin + Location: 31,89 + Actor599: swal + Owner: Scrin + Location: 31,88 + Actor600: swal + Owner: Scrin + Location: 32,88 + Actor601: swal + Owner: Scrin + Location: 33,88 + Actor602: swal + Owner: Scrin + Location: 34,88 + Actor603: swal + Owner: Scrin + Location: 35,88 + Actor604: swal + Owner: Scrin + Location: 36,88 + Actor605: swal + Owner: Scrin + Location: 37,87 + Actor606: swal + Owner: Scrin + Location: 37,88 + Actor607: swal + Owner: Scrin + Location: 37,89 + Actor608: swal + Owner: Scrin + Location: 38,89 + Actor609: swal + Owner: Scrin + Location: 39,89 + Actor610: swal + Owner: Scrin + Location: 38,87 + Actor611: swal + Owner: Scrin + Location: 39,87 + Actor612: swal + Owner: Scrin + Location: 39,88 + Actor613: swal + Owner: Scrin + Location: 44,91 + Actor614: swal + Owner: Scrin + Location: 44,92 + Actor615: swal + Owner: Scrin + Location: 44,93 + Actor616: swal + Owner: Scrin + Location: 45,93 + Actor617: swal + Owner: Scrin + Location: 45,91 + Actor618: swal + Owner: Scrin + Location: 46,91 + Actor619: swal + Owner: Scrin + Location: 46,92 + Actor620: swal + Owner: Scrin + Location: 46,93 + Actor624: swal + Owner: Scrin + Location: 47,96 + Actor626: swal + Owner: Scrin + Location: 47,93 + Actor627: swal + Owner: Scrin + Location: 47,94 + Actor628: swal + Owner: Scrin + Location: 47,95 + Actor629: swal + Owner: Scrin + Location: 48,96 + Actor630: swal + Owner: Scrin + Location: 48,97 + Actor631: swal + Owner: Scrin + Location: 48,98 + Actor632: swal + Owner: Scrin + Location: 48,99 + Actor633: swal + Owner: Scrin + Location: 49,99 + Actor634: swal + Owner: Scrin + Location: 49,100 + Actor635: swal + Owner: Scrin + Location: 48,100 + Actor636: swal + Owner: Scrin + Location: 48,105 + Actor637: swal + Owner: Scrin + Location: 48,106 + Actor638: swal + Owner: Scrin + Location: 49,106 + Actor639: swal + Owner: Scrin + Location: 49,105 + Actor640: scol + Owner: Scrin + Location: 38,88 + Actor641: scol + Owner: Scrin + Location: 45,92 + Actor621: shar + Owner: Scrin + Location: 45,95 + Actor622: shar + Owner: Scrin + Location: 32,90 + WarpSphere2: wsph + Owner: Scrin + Location: 33,92 + Portal2: port + Owner: Scrin + Location: 46,97 + Actor642: reac + Owner: Scrin + Location: 41,95 + Actor643: reac + Owner: Scrin + Location: 39,95 + Actor644: reac + Owner: Scrin + Location: 37,95 + Actor645: srep + Owner: Scrin + Location: 39,99 + Actor646: ptur + Owner: Scrin + Location: 50,100 + TurretFacing: 816 + Actor647: ptur + Owner: Scrin + Location: 46,90 + TurretFacing: 840 + Actor648: ptur + Owner: Scrin + Location: 39,86 + TurretFacing: 911 + Actor649: proc.scrin + Owner: Scrin + Location: 33,96 + Actor650: proc.scrin + Owner: Scrin + Location: 44,102 + Actor651: split2 + Owner: Neutral + Location: 45,111 + Actor652: split2 + Owner: Neutral + Location: 29,102 + Actor653: split2 + Owner: Neutral + Location: 34,108 + Actor654: split2 + Owner: Neutral + Location: 40,107 + Actor655: splitblue + Owner: Neutral + Location: 57,52 + Actor656: splitblue + Owner: Neutral + Location: 54,54 + Actor657: split2 + Owner: Neutral + Location: 66,141 + Actor658: split2 + Owner: Neutral + Location: 72,142 + Actor662: swal + Owner: Neutral + Location: 73,95 + Health: 37 + Actor664: swal + Owner: Neutral + Location: 74,95 + Actor665: swal + Owner: Neutral + Location: 75,95 + Health: 46 + Actor666: swal + Owner: Neutral + Location: 76,94 + Health: 34 + Actor667: swal + Owner: Neutral + Location: 75,94 + Health: 25 + Actor668: swal + Owner: Neutral + Location: 77,93 + Health: 13 + Actor669: swal + Owner: Neutral + Location: 77,94 + Actor670: swal + Owner: Neutral + Location: 77,95 + Actor671: swal + Owner: Neutral + Location: 78,95 + Health: 17 + Actor672: swal + Owner: Neutral + Location: 79,95 + Actor673: swal + Owner: Neutral + Location: 79,94 + Health: 13 + Actor674: swal + Owner: Neutral + Location: 72,95 + Health: 39 + Actor675: swal + Owner: Neutral + Location: 72,96 + Actor676: swal + Owner: Neutral + Location: 73,96 + Health: 58 + Actor677: swal + Owner: Neutral + Location: 84,94 + Health: 8 + Actor678: swal + Owner: Neutral + Location: 85,94 + Health: 62 + Actor679: swal + Owner: Neutral + Location: 85,93 + Health: 22 + Actor680: swal + Owner: Neutral + Location: 86,94 + Health: 17 + Actor681: swal + Owner: Neutral + Location: 86,93 + Health: 86 + Actor683: scrinflora1 + Owner: Neutral + Location: 23,31 + Actor684: scrinflora1 + Owner: Neutral + Location: 47,25 + Actor685: scrinflora1 + Owner: Neutral + Location: 82,42 + Actor686: scrinflora1 + Owner: Neutral + Location: 80,67 + Actor687: scrinflora1 + Owner: Neutral + Location: 35,64 + Actor688: scrinflora1 + Owner: Neutral + Location: 3,73 + Actor689: scrinflora1 + Owner: Neutral + Location: 61,101 + Actor690: scrinflora1 + Owner: Neutral + Location: 93,113 + Actor691: scrinflora2 + Owner: Neutral + Location: 94,106 + Actor692: scrinflora2 + Owner: Neutral + Location: 84,88 + Actor693: scrinflora2 + Owner: Neutral + Location: 60,102 + Actor694: scrinflora2 + Owner: Neutral + Location: 21,62 + Actor695: scrinflora2 + Owner: Neutral + Location: 9,40 + Actor696: scrinflora2 + Owner: Neutral + Location: 58,9 + Actor697: scrinflora2 + Owner: Neutral + Location: 2,13 + Actor698: scrinflora2 + Owner: Neutral + Location: 71,35 + Actor699: scrinflora2 + Owner: Neutral + Location: 48,35 + Actor700: scrinflora2 + Owner: Neutral + Location: 28,95 + Actor701: scrinflora2 + Owner: Neutral + Location: 4,110 + Actor702: scrinflora2 + Owner: Neutral + Location: 52,141 + Actor703: scrinflora3 + Owner: Neutral + Location: 57,90 + Actor704: scrinflora3 + Owner: Neutral + Location: 3,57 + Actor705: scrinflora3 + Owner: Neutral + Location: 54,22 + Actor706: scrinflora4 + Owner: Neutral + Location: 71,43 + Actor707: scrinflora4 + Owner: Neutral + Location: 94,71 + Actor708: scrinflora4 + Owner: Neutral + Location: 93,92 + Actor709: scrinflora4 + Owner: Neutral + Location: 7,105 + Actor710: scrinflora4 + Owner: Neutral + Location: 57,109 + Actor711: scrinflora5 + Owner: Neutral + Location: 83,142 + Actor712: scrinflora5 + Owner: Neutral + Location: 95,104 + Actor713: scrinflora5 + Owner: Neutral + Location: 2,16 + Actor714: scrinflora5 + Owner: Neutral + Location: 53,32 + Actor715: scrinflora5 + Owner: Neutral + Location: 5,59 + Actor716: scrinflora5 + Owner: Neutral + Location: 19,73 + Actor717: scrinflora5 + Owner: Neutral + Location: 54,130 + Actor718: scrinflora6 + Owner: Neutral + Location: 25,69 + Actor719: scrinflora7 + Owner: Neutral + Location: 94,102 + Actor720: scrinflora7 + Owner: Neutral + Location: 5,8 + Actor721: scrinflora7 + Owner: Neutral + Location: 28,34 + Actor722: scrinflora7 + Owner: Neutral + Location: 74,38 + Actor723: scrinflora7 + Owner: Neutral + Location: 79,111 + Actor725: scrinflora7 + Owner: Neutral + Location: 2,109 + Actor726: scrinflora14 + Owner: Neutral + Location: 3,110 + Actor727: scrinflora8 + Owner: Neutral + Location: 18,72 + Actor728: scrinflora8 + Owner: Neutral + Location: 3,11 + Actor729: scrinflora8 + Owner: Neutral + Location: 91,105 + Actor730: scrinflora8 + Owner: Neutral + Location: 74,59 + Actor731: scrinflora8 + Owner: Neutral + Location: 91,33 + Actor732: scrinflora8 + Owner: Neutral + Location: 52,20 + Actor733: scrinflora14 + Owner: Neutral + Location: 55,23 + Actor734: scrinflora14 + Owner: Neutral + Location: 48,33 + Actor735: scrinflora10 + Owner: Neutral + Location: 48,31 + Actor736: scrinflora13 + Owner: Neutral + Location: 55,32 + Actor737: scrinflora13 + Owner: Neutral + Location: 30,33 + Actor738: scrinflora13 + Owner: Neutral + Location: 5,34 + Actor739: scrinflora13 + Owner: Neutral + Location: 2,94 + Actor740: scrinflora13 + Owner: Neutral + Location: 7,106 + Actor741: scrinflora14 + Owner: Neutral + Location: 53,141 + Actor742: scrinflora10 + Owner: Neutral + Location: 27,68 + Actor743: scrinflora10 + Owner: Neutral + Location: 37,66 + Actor744: scrinflora9 + Owner: Neutral + Location: 2,73 + Actor745: scrinflora10 + Owner: Neutral + Location: 7,29 + Actor746: scrinflora10 + Owner: Neutral + Location: 44,36 + Actor747: scrinflora11 + Owner: Neutral + Location: 43,30 + Actor748: scrinflora11 + Owner: Neutral + Location: 55,33 + Actor749: scrinflora11 + Owner: Neutral + Location: 59,10 + Actor750: scrinflora12 + Owner: Neutral + Location: 93,32 + Actor751: scrinflora11 + Owner: Neutral + Location: 90,33 + Actor752: scrinflora9 + Owner: Neutral + Location: 93,33 + Actor753: scrinflora12 + Owner: Neutral + Location: 72,41 + Actor754: scrinflora10 + Owner: Neutral + Location: 70,43 + Actor755: scrinflora11 + Owner: Neutral + Location: 70,35 + Actor756: scrinflora13 + Owner: Neutral + Location: 72,36 + Actor757: scrinflora14 + Owner: Neutral + Location: 81,43 + Actor758: scrinflora12 + Owner: Neutral + Location: 94,104 + Actor759: scrinflora14 + Owner: Neutral + Location: 92,103 + Actor760: scrinflora11 + Owner: Neutral + Location: 93,104 + Actor761: scrinflora9 + Owner: Neutral + Location: 93,103 + Actor762: scrinflora9 + Owner: Neutral + Location: 95,106 + Actor763: scrinflora11 + Owner: Neutral + Location: 93,106 + Actor764: swal + Owner: ScrinRebels + Location: 78,118 + Health: 37 + Actor765: swal + Owner: ScrinRebels + Location: 79,118 + Actor766: swal + Owner: ScrinRebels + Location: 80,134 + Actor767: swal + Owner: ScrinRebels + Location: 81,134 + Actor768: swal + Owner: ScrinRebels + Location: 82,134 + Actor770: swal + Owner: ScrinRebels + Location: 87,118 + Actor771: swal + Owner: ScrinRebels + Location: 85,118 + Health: 34 + Actor777: swal + Owner: ScrinRebels + Location: 85,117 + Health: 13 + Actor778: swal + Owner: ScrinRebels + Location: 86,117 + Actor779: swal + Owner: ScrinRebels + Location: 87,117 + Actor780: swal + Owner: ScrinRebels + Location: 85,119 + Actor781: swal + Owner: ScrinRebels + Location: 86,119 + Health: 52 + L1: waypoint + Owner: Neutral + Location: 16,104 + M1: waypoint + Owner: Neutral + Location: 39,102 + R1: waypoint + Owner: Neutral + Location: 53,118 + L2: waypoint + Owner: Neutral + Location: 19,82 + L3: waypoint + Owner: Neutral + Location: 8,63 + M2: waypoint + Owner: Neutral + Location: 50,83 + M3: waypoint + Owner: Neutral + Location: 29,47 + R4: waypoint + Owner: Neutral + Location: 63,65 + R5: waypoint + Owner: Neutral + Location: 88,47 + M5: waypoint + Owner: Neutral + Location: 61,37 + L4: waypoint + Owner: Neutral + Location: 12,29 + M4: waypoint + Owner: Neutral + Location: 39,32 + R2: waypoint + Owner: Neutral + Location: 73,104 + R3: waypoint + Owner: Neutral + Location: 74,85 + Actor772: gunw + Owner: Scrin + Location: 8,86 + Facing: 174 + Actor773: gunw + Owner: Scrin + Location: 17,87 + Facing: 904 + Actor774: gunw + Owner: Scrin + Location: 29,70 + Facing: 15 + Actor775: gunw + Owner: Scrin + Location: 30,67 + Facing: 79 + Actor776: gunw + Owner: Scrin + Location: 32,68 + Facing: 79 + Actor782: intl + Owner: Scrin + Location: 41,86 + Facing: 872 + Actor783: intl + Owner: Scrin + Location: 44,89 + Facing: 935 + Actor784: corr + Owner: Scrin + Location: 37,91 + Facing: 864 + Actor785: s2 + Owner: Scrin + SubCell: 3 + Location: 18,88 + Facing: 904 + Actor786: s2 + Owner: Scrin + SubCell: 3 + Location: 7,90 + Facing: 71 + Actor787: s1 + Owner: Scrin + SubCell: 3 + Location: 32,70 + Facing: 95 + Actor788: s1 + Owner: Scrin + SubCell: 3 + Location: 30,69 + Facing: 111 + Actor789: s1 + Owner: Scrin + SubCell: 3 + Location: 32,65 + Facing: 95 + Actor790: s1 + Owner: Scrin + Facing: 384 + Location: 76,98 + Actor791: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 83,97 + Actor792: s1 + Owner: Scrin + SubCell: 3 + Location: 83,95 + Facing: 713 + Actor793: s1 + Owner: Scrin + SubCell: 3 + Location: 74,91 + Facing: 0 + Actor794: s1 + Owner: Scrin + SubCell: 3 + Location: 79,92 + Facing: 888 + Actor795: seek + Owner: Scrin + Location: 79,98 + Facing: 737 + Actor796: seek + Owner: Scrin + Location: 77,91 + Facing: 79 + Actor797: seek + Owner: Scrin + Location: 83,91 + Facing: 95 + Actor798: gunw + Owner: Scrin + Location: 68,102 + Facing: 824 + Actor799: s3 + Owner: Scrin + SubCell: 3 + Location: 68,103 + Facing: 705 + Actor800: s3 + Owner: Scrin + Location: 67,102 + SubCell: 3 + Facing: 71 + Actor801: s3 + Owner: Scrin + Location: 48,94 + SubCell: 3 + Facing: 0 + Actor802: s3 + Owner: Scrin + SubCell: 3 + Location: 34,87 + Facing: 7 + Actor803: seek + Owner: Scrin + Location: 57,95 + Facing: 896 + Actor804: lace + Owner: Scrin + Location: 5,70 + Facing: 911 + Actor805: lace + Owner: Scrin + Location: 6,71 + Facing: 927 + Actor806: devo + Owner: Scrin + Location: 8,101 + Facing: 880 + Actor807: devo + Owner: Scrin + Location: 10,103 + Facing: 880 + Actor808: s1 + Owner: Scrin + SubCell: 3 + Location: 10,102 + Facing: 872 + Actor809: s1 + Owner: Scrin + SubCell: 3 + Location: 7,102 + Facing: 761 + Actor810: s1 + Owner: Scrin + SubCell: 3 + Location: 7,100 + Facing: 729 + Actor811: s1 + Owner: Scrin + SubCell: 3 + Location: 11,104 + Facing: 0 + Actor812: corr + Owner: Scrin + Location: 44,126 + Facing: 745 + Actor814: lchr + Owner: Scrin + Location: 32,123 + Facing: 697 + Actor815: lchr + Owner: Scrin + Location: 49,134 + Facing: 896 + Actor816: lchr + Owner: Scrin + Location: 52,102 + Facing: 919 + Actor817: s4 + Owner: Scrin + SubCell: 3 + Location: 52,104 + Facing: 935 + Actor818: s4 + Owner: Scrin + SubCell: 3 + Location: 49,103 + Facing: 824 + Actor819: s1 + Owner: Scrin + SubCell: 3 + Location: 39,85 + Facing: 0 + Actor820: s1 + Owner: Scrin + Location: 39,85 + SubCell: 1 + Facing: 0 + Actor821: s1 + Owner: Scrin + SubCell: 3 + Location: 42,85 + Facing: 0 + Actor822: s1 + Owner: Scrin + SubCell: 3 + Location: 43,86 + Facing: 0 + Actor823: s1 + Owner: Scrin + SubCell: 3 + Location: 48,91 + Facing: 713 + Actor824: s4 + Owner: Scrin + SubCell: 3 + Location: 35,90 + Facing: 0 + Actor825: ruin + Owner: Scrin + Location: 34,120 + Facing: 682 + Actor826: gunw + Owner: Scrin + Location: 14,121 + Facing: 103 + Actor827: gunw + Owner: Scrin + Location: 26,109 + Facing: 71 + Actor828: gunw + Owner: Scrin + Location: 11,108 + Facing: 967 + Actor829: gunw + Owner: ScrinRebels + Facing: 384 + Location: 53,74 + Actor830: gunw + Owner: ScrinRebels + Location: 64,77 + Facing: 531 + Actor831: devo + Owner: ScrinRebels + Facing: 384 + Location: 59,71 + Actor832: corr + Owner: ScrinRebels + Location: 67,78 + Facing: 531 + Actor833: intl + Owner: ScrinRebels + Facing: 384 + Location: 60,77 + Actor834: intl + Owner: ScrinRebels + Facing: 384 + Location: 48,67 + Actor835: intl + Owner: ScrinRebels + Facing: 384 + Location: 71,69 + Actor836: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 52,63 + Actor837: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 49,62 + Actor838: s1 + Owner: ScrinRebels + Location: 50,63 + SubCell: 3 + Facing: 384 + Actor839: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 56,58 + Actor840: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 70,70 + Actor841: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 60,72 + Actor842: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 59,70 + Actor843: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 65,78 + Actor844: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 57,74 + Actor845: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 47,66 + Actor847: rtpd + Owner: Scrin + Facing: 721 + Location: 49,119 + Actor848: corr + Owner: Scrin + Facing: 856 + Location: 57,132 + Actor849: s1 + Owner: Scrin + SubCell: 3 + Facing: 816 + Location: 50,129 + Actor850: s1 + Owner: Scrin + SubCell: 3 + Facing: 753 + Location: 51,132 + Actor851: s1 + Owner: Scrin + SubCell: 3 + Facing: 824 + Location: 51,135 + Actor852: rea2 + Owner: ScrinRebels + Location: 76,5 + Actor853: rea2 + Owner: ScrinRebels + Location: 79,5 + Actor854: sfac + Owner: ScrinRebels + Location: 77,9 + Actor855: scrt + Owner: ScrinRebels + Location: 83,6 + Actor846: rtpd + Owner: Scrin + Location: 11,89 + Facing: 840 + Actor870: camera + Owner: Scrin + Location: 80,126 + Actor871: camera + Owner: Scrin + Location: 60,70 + Actor872: camera + Owner: Scrin + Location: 79,19 + Actor873: camera + Owner: Scrin + Location: 22,22 + Actor874: camera + Owner: Scrin + Location: 36,15 + Actor875: camera + Owner: Scrin + Location: 26,43 + Exterminator1Patrol1: waypoint + Owner: Neutral + Location: 77,125 + Exterminator1Patrol2: waypoint + Owner: Neutral + Location: 82,121 + Exterminator1Patrol3: waypoint + Owner: Neutral + Location: 86,125 + Exterminator1Patrol4: waypoint + Owner: Neutral + Location: 82,130 + Exterminator2Patrol1: waypoint + Owner: Neutral + Location: 61,71 + Exterminator2Patrol2: waypoint + Owner: Neutral + Location: 54,65 + Exterminator2Patrol3: waypoint + Owner: Neutral + Location: 63,59 + Exterminator2Patrol4: waypoint + Owner: Neutral + Location: 70,66 + Exterminator3Patrol1: waypoint + Owner: Neutral + Location: 79,21 + Exterminator3Patrol2: waypoint + Owner: Neutral + Location: 72,13 + Exterminator3Patrol3: waypoint + Owner: Neutral + Location: 80,8 + Exterminator3Patrol4: waypoint + Owner: Neutral + Location: 87,14 + Actor878: seek + Owner: Scrin + Location: 34,50 + Facing: 1023 + Actor879: seek + Owner: Scrin + Location: 32,49 + Facing: 1023 + Actor880: gunw + Owner: ScrinRebels + Location: 69,77 + Facing: 467 + Actor882: s3 + Owner: ScrinRebels + Facing: 384 + Location: 71,77 + SubCell: 3 + Actor191: tpod + Owner: Scrin + Location: 35,22 + Facing: 935 + Health: 65 + Actor876: lace + Owner: ScrinRebels + Facing: 384 + Location: 87,121 + Actor877: lace + Owner: ScrinRebels + Location: 89,122 + Facing: 333 + ExterminatorSpawnWest: waypoint + Owner: Neutral + Location: 20,127 + Actor881: lace + Owner: ScrinRebels + Location: 86,129 + Facing: 222 + Actor884: gunw + Owner: ScrinRebels + Facing: 384 + Location: 74,77 + Actor856: gunw + Owner: ScrinRebels + Facing: 384 + Location: 89,120 + Actor857: gunw + Owner: ScrinRebels + Facing: 384 + Location: 81,79 + Actor858: gunw + Owner: ScrinRebels + Facing: 384 + Location: 80,77 + Actor886: devo + Owner: ScrinRebels + Facing: 384 + Location: 60,67 + Exterminator2: etpd + Owner: Scrin + Facing: 0 + Location: 26,114 + Exterminator1: etpd + Owner: Scrin + Facing: 0 + Location: 19,114 + GravityStabilizer1: grav + Owner: Scrin + Location: 24,129 + Actor883: gscr + Owner: Scrin + SubCell: 3 + Location: 22,129 + Facing: 832 + Actor888: gscr + Owner: Scrin + SubCell: 3 + Location: 18,129 + Facing: 0 + Actor889: gscr + Owner: Scrin + SubCell: 3 + Location: 17,131 + Facing: 959 + Actor890: gscr + Owner: Scrin + SubCell: 3 + Location: 18,133 + Facing: 1023 + Actor891: gscr + Owner: Scrin + SubCell: 3 + Location: 23,132 + Facing: 0 + Actor893: s4 + Owner: Scrin + SubCell: 3 + Location: 11,123 + Facing: 166 + Actor894: s4 + Owner: Scrin + SubCell: 3 + Location: 11,134 + Facing: 570 + Actor895: s4 + Owner: Scrin + SubCell: 3 + Location: 35,134 + Facing: 1023 + Actor896: s4 + Owner: Scrin + SubCell: 3 + Location: 29,133 + Facing: 0 + Actor897: s4 + Owner: Scrin + SubCell: 3 + Location: 22,136 + Facing: 563 + Actor898: s4 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 11,134 + Actor899: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 10,127 + Actor900: s4 + Owner: Scrin + Location: 37,130 + SubCell: 3 + Facing: 761 + Actor887: splitblue + Owner: Neutral + Location: 51,7 + Actor885: splitblue + Owner: Neutral + Location: 45,4 + Actor901: splitblue + Owner: Neutral + Location: 15,45 + Actor902: splitblue + Owner: Neutral + Location: 12,48 + Actor903: splitblue + Owner: Neutral + Location: 16,51 + Actor904: splitblue + Owner: Neutral + Location: 53,43 + Actor905: camera + Owner: Scrin + Location: 54,47 + Actor908: camera + Owner: Scrin + Location: 41,43 + A2APatrol1: waypoint + Owner: Neutral + Location: 43,138 + A2APatrol2: waypoint + Owner: Neutral + Location: 55,123 + A2APatrol3: waypoint + Owner: Neutral + Location: 51,107 + A2APatrol4: waypoint + Owner: Neutral + Location: 35,100 + A2APatrol5: waypoint + Owner: Neutral + Location: 19,101 + A2APatrol6: waypoint + Owner: Neutral + Location: 7,113 + A2APatrol7: waypoint + Owner: Neutral + Location: 4,126 + A2APatrol8: waypoint + Owner: Neutral + Location: 10,134 + Actor909: sfac + Owner: Scrin + Location: 128,125 + Actor910: sign + Owner: Scrin + Location: 133,123 + Actor911: swal + Owner: Scrin + Location: 118,137 + Actor912: swal + Owner: Scrin + Location: 119,137 + Actor913: swal + Owner: Scrin + Location: 120,137 + Actor914: swal + Owner: Scrin + Location: 118,136 + Actor915: swal + Owner: Scrin + Location: 118,135 + Actor916: swal + Owner: Scrin + Location: 119,135 + Actor917: swal + Owner: Scrin + Location: 120,135 + Actor918: swal + Owner: Scrin + Location: 120,136 + Actor919: swal + Owner: Scrin + Location: 105,128 + Actor920: swal + Owner: Scrin + Location: 105,127 + Actor921: swal + Owner: Scrin + Location: 105,126 + Actor922: swal + Owner: Scrin + Location: 105,125 + Actor923: swal + Owner: Scrin + Location: 106,128 + Actor924: swal + Owner: Scrin + Location: 107,128 + Actor925: swal + Owner: Scrin + Location: 107,127 + Actor926: swal + Owner: Scrin + Location: 107,126 + Actor927: swal + Owner: Scrin + Location: 106,126 + Actor928: swal + Owner: Scrin + Location: 106,136 + Actor929: swal + Owner: Scrin + Location: 107,136 + Actor930: swal + Owner: Scrin + Location: 108,136 + Actor931: swal + Owner: Scrin + Location: 106,135 + Actor932: swal + Owner: Scrin + Location: 106,134 + Actor933: swal + Owner: Scrin + Location: 107,134 + Actor934: swal + Owner: Scrin + Location: 108,134 + Actor935: swal + Owner: Scrin + Location: 108,135 + Actor936: swal + Owner: Scrin + Location: 132,134 + Actor937: swal + Owner: Scrin + Location: 133,134 + Actor938: swal + Owner: Scrin + Location: 134,134 + Actor939: swal + Owner: Scrin + Location: 134,133 + Actor940: swal + Owner: Scrin + Location: 134,132 + Actor941: swal + Owner: Scrin + Location: 132,133 + Actor942: swal + Owner: Scrin + Location: 132,132 + Actor943: swal + Owner: Scrin + Location: 133,132 + Actor944: swal + Owner: Scrin + Location: 134,131 + Actor945: swal + Owner: Scrin + Location: 134,130 + Actor946: swal + Owner: Scrin + Location: 135,130 + Actor947: swal + Owner: Scrin + Location: 135,129 + Actor948: swal + Owner: Scrin + Location: 135,128 + Actor949: swal + Owner: Scrin + Location: 135,127 + Actor950: swal + Owner: Scrin + Location: 134,127 + Actor951: swal + Owner: Scrin + Location: 133,127 + Actor952: swal + Owner: Scrin + Location: 133,128 + Actor953: swal + Owner: Scrin + Location: 133,129 + Actor954: swal + Owner: Scrin + Location: 134,129 + Actor955: swal + Owner: Scrin + Location: 135,126 + Actor956: swal + Owner: Scrin + Location: 136,126 + Actor957: swal + Owner: Scrin + Location: 136,125 + Actor958: swal + Owner: Scrin + Location: 136,124 + Actor959: swal + Owner: Scrin + Location: 136,123 + Actor960: swal + Owner: Scrin + Location: 136,122 + Actor961: swal + Owner: Scrin + Location: 135,122 + Actor963: swal + Owner: Scrin + Location: 135,119 + Actor962: swal + Owner: Scrin + Location: 135,121 + Actor964: swal + Owner: Scrin + Location: 135,120 + Actor965: swal + Owner: Scrin + Location: 135,118 + Actor966: swal + Owner: Scrin + Location: 135,117 + Actor967: swal + Owner: Scrin + Location: 135,116 + Actor968: swal + Owner: Scrin + Location: 136,116 + Actor969: swal + Owner: Scrin + Location: 136,115 + Actor970: swal + Owner: Scrin + Location: 136,114 + Actor971: swal + Owner: Scrin + Location: 137,114 + Actor972: swal + Owner: Scrin + Location: 138,114 + Actor973: swal + Owner: Scrin + Location: 139,114 + Actor974: swal + Owner: Scrin + Location: 140,114 + Actor975: swal + Owner: Scrin + Location: 140,113 + Actor976: swal + Owner: Scrin + Location: 141,113 + Actor977: swal + Owner: Scrin + Location: 142,113 + Actor978: swal + Owner: Scrin + Location: 142,112 + Actor981: swal + Owner: Scrin + Location: 142,109 + Actor982: swal + Owner: Scrin + Location: 142,108 + Actor983: swal + Owner: Scrin + Location: 141,108 + Actor984: swal + Owner: Scrin + Location: 140,108 + Actor985: swal + Owner: Scrin + Location: 139,108 + Actor986: swal + Owner: Scrin + Location: 138,108 + Actor987: swal + Owner: Scrin + Location: 137,108 + Actor988: swal + Owner: Scrin + Location: 136,108 + Actor989: swal + Owner: Scrin + Location: 134,108 + Actor990: swal + Owner: Scrin + Location: 135,108 + Actor991: swal + Owner: Scrin + Location: 134,107 + Actor992: swal + Owner: Scrin + Location: 133,107 + Actor993: swal + Owner: Scrin + Location: 132,107 + Actor994: swal + Owner: Scrin + Location: 132,108 + Actor995: swal + Owner: Scrin + Location: 132,109 + Actor996: swal + Owner: Scrin + Location: 133,109 + Actor997: swal + Owner: Scrin + Location: 134,109 + Actor998: swal + Owner: Scrin + Location: 124,107 + Actor999: swal + Owner: Scrin + Location: 124,108 + Actor1000: swal + Owner: Scrin + Location: 124,109 + Actor1001: swal + Owner: Scrin + Location: 123,109 + Actor1002: swal + Owner: Scrin + Location: 122,109 + Actor1003: swal + Owner: Scrin + Location: 122,108 + Actor1004: swal + Owner: Scrin + Location: 122,107 + Actor1005: swal + Owner: Scrin + Location: 123,107 + Actor1006: swal + Owner: Scrin + Location: 121,108 + Actor1007: swal + Owner: Scrin + Location: 120,108 + Actor1008: swal + Owner: Scrin + Location: 119,108 + Actor1009: swal + Owner: Scrin + Location: 119,107 + Actor1010: swal + Owner: Scrin + Location: 118,107 + Actor1011: swal + Owner: Scrin + Location: 117,107 + Actor1015: swal + Owner: Scrin + Location: 117,109 + Actor1016: swal + Owner: Scrin + Location: 118,109 + Actor1017: swal + Owner: Scrin + Location: 119,109 + Actor1018: swal + Owner: Scrin + Location: 117,108 + Actor1012: swal + Owner: Scrin + Location: 116,108 + Actor1013: swal + Owner: Scrin + Location: 115,108 + Actor1014: swal + Owner: Scrin + Location: 114,108 + Actor1019: swal + Owner: Scrin + Location: 113,107 + Actor1020: swal + Owner: Scrin + Location: 114,107 + Actor1021: swal + Owner: Scrin + Location: 114,109 + Actor1022: swal + Owner: Scrin + Location: 113,109 + Actor1023: swal + Owner: Scrin + Location: 112,109 + Actor1024: swal + Owner: Scrin + Location: 112,107 + Actor1025: swal + Owner: Scrin + Location: 112,108 + Actor1026: swal + Owner: Scrin + Location: 111,108 + Actor1027: swal + Owner: Scrin + Location: 110,108 + Actor1028: swal + Owner: Scrin + Location: 109,108 + Actor1029: swal + Owner: Scrin + Location: 108,108 + Actor1030: swal + Owner: Scrin + Location: 108,109 + Actor1031: swal + Owner: Scrin + Location: 108,110 + Actor1032: swal + Owner: Scrin + Location: 108,111 + Actor1033: swal + Owner: Scrin + Location: 107,111 + Actor1034: swal + Owner: Scrin + Location: 107,112 + Actor1035: swal + Owner: Scrin + Location: 107,113 + Actor1036: swal + Owner: Scrin + Location: 106,113 + Actor1037: swal + Owner: Scrin + Location: 106,114 + Actor1038: swal + Owner: Scrin + Location: 106,115 + Actor1039: swal + Owner: Scrin + Location: 105,115 + Actor1040: swal + Owner: Scrin + Location: 107,115 + Actor1041: swal + Owner: Scrin + Location: 105,116 + Actor1042: swal + Owner: Scrin + Location: 105,117 + Actor1043: swal + Owner: Scrin + Location: 106,117 + Actor1044: swal + Owner: Scrin + Location: 107,117 + Actor1045: swal + Owner: Scrin + Location: 107,116 + Actor1046: swal + Owner: Scrin + Location: 105,122 + Actor1047: swal + Owner: Scrin + Location: 106,122 + Actor1048: swal + Owner: Scrin + Location: 107,122 + Actor1049: swal + Owner: Scrin + Location: 107,123 + Actor1050: swal + Owner: Scrin + Location: 107,124 + Actor1051: swal + Owner: Scrin + Location: 106,124 + Actor1052: swal + Owner: Scrin + Location: 105,124 + Actor1053: swal + Owner: Scrin + Location: 105,123 + Actor1054: swal + Owner: Scrin + Location: 106,125 + Actor1055: scol + Owner: Scrin + Location: 107,135 + Actor1056: scol + Owner: Scrin + Location: 106,127 + Actor1057: scol + Owner: Scrin + Location: 106,123 + Actor1058: scol + Owner: Scrin + Location: 119,136 + Actor1059: scol + Owner: Scrin + Location: 133,133 + Actor1060: scol + Owner: Scrin + Location: 134,128 + Actor1061: scol + Owner: Scrin + Location: 133,108 + Actor1062: scol + Owner: Scrin + Location: 123,108 + Actor1063: scol + Owner: Scrin + Location: 118,108 + Actor1064: scol + Owner: Scrin + Location: 113,108 + Actor1065: scol + Owner: Scrin + Location: 106,116 + Actor1066: shar + Owner: Scrin + Location: 109,109 + Actor1067: shar + Owner: Scrin + Location: 107,114 + Actor1068: shar + Owner: Scrin + Location: 135,109 + Actor1069: shar + Owner: Scrin + Location: 135,115 + Actor1070: shar + Owner: Scrin + Location: 134,121 + Actor1071: shar + Owner: Scrin + Location: 123,136 + Actor1072: shar + Owner: Scrin + Location: 129,133 + Actor1073: shar + Owner: Scrin + Location: 114,136 + Actor1074: shar + Owner: Scrin + Location: 103,132 + Actor1075: shar + Owner: Scrin + Location: 100,103 + Actor1076: scol + Owner: Scrin + Location: 97,101 + Actor1077: scol + Owner: Scrin + Location: 102,99 + Actor1078: ptur + Owner: Scrin + Location: 124,106 + Actor1079: ptur + Owner: Scrin + Location: 132,106 + Actor1080: ptur + Owner: Scrin + Location: 104,117 + Actor1081: ptur + Owner: Scrin + Location: 104,122 + Actor1082: shar + Owner: Scrin + Location: 116,109 + Actor1083: shar + Owner: Scrin + Location: 121,109 + Exterminator7: etpd + Owner: Scrin + Location: 126,106 + Facing: 0 + Exterminator8: etpd + Owner: Scrin + Location: 130,106 + Facing: 0 + Exterminator6: etpd + Owner: Scrin + Location: 104,113 + Facing: 384 + Exterminator5: etpd + Owner: Scrin + Location: 102,123 + Facing: 134 + WarpSphere3: wsph + Owner: Scrin + Location: 112,122 + Actor1098: rea2 + Owner: Scrin + Location: 118,130 + Actor1099: rea2 + Owner: Scrin + Location: 118,127 + Actor1100: rea2 + Owner: Scrin + Location: 118,124 + RiftGenerator: rfgn + Owner: Scrin + Location: 112,130 + Actor1094: nerv + Owner: Scrin + Location: 140,110 + Actor1107: silo.scrin + Owner: Scrin + Location: 137,113 + Actor1108: silo.scrin + Owner: Scrin + Location: 138,113 + Actor1109: silo.scrin + Owner: Scrin + Location: 137,109 + Actor1110: silo.scrin + Owner: Scrin + Location: 138,109 + Actor1111: swal + Owner: Scrin + Location: 111,130 + Actor1112: swal + Owner: Scrin + Location: 111,129 + Actor1113: swal + Owner: Scrin + Location: 111,131 + Actor1114: swal + Owner: Scrin + Location: 111,132 + Actor1115: swal + Owner: Scrin + Location: 112,132 + Actor1116: swal + Owner: Scrin + Location: 113,132 + Actor1117: swal + Owner: Scrin + Location: 114,132 + Actor1118: swal + Owner: Scrin + Location: 114,131 + Actor1119: swal + Owner: Scrin + Location: 114,130 + Actor1120: swal + Owner: Scrin + Location: 114,129 + Actor1121: swal + Owner: Scrin + Location: 113,129 + Actor1122: swal + Owner: Scrin + Location: 112,129 + Actor1123: swal + Owner: Scrin + Location: 110,128 + Actor1124: swal + Owner: Scrin + Location: 110,129 + Actor1125: swal + Owner: Scrin + Location: 111,128 + Actor1126: swal + Owner: Scrin + Location: 114,128 + Actor1127: swal + Owner: Scrin + Location: 115,128 + Actor1128: swal + Owner: Scrin + Location: 115,129 + Actor1129: swal + Owner: Scrin + Location: 115,132 + Actor1130: swal + Owner: Scrin + Location: 114,133 + Actor1131: swal + Owner: Scrin + Location: 115,133 + Actor1132: swal + Owner: Scrin + Location: 110,132 + Actor1133: swal + Owner: Scrin + Location: 110,133 + Actor1134: swal + Owner: Scrin + Location: 111,133 + Actor1138: rea2 + Owner: Scrin + Location: 122,123 + Actor1135: rea2 + Owner: Scrin + Location: 122,126 + Actor1136: rea2 + Owner: Scrin + Location: 122,129 + Actor1137: rea2 + Owner: Scrin + Location: 122,132 + Actor1139: scrt + Owner: Scrin + Location: 126,133 + Actor1140: rea2 + Owner: Scrin + Location: 15,125 + WarpSphere4: wsph + Owner: Scrin + Location: 130,112 + Actor1145: mani + Owner: Scrin + Location: 124,119 + Actor1146: srep + Owner: Scrin + Location: 114,111 + Actor1147: srep + Owner: Scrin + Location: 110,114 + Portal3: port + Owner: Scrin + Location: 119,118 + Actor1152: rea2 + Owner: Scrin + Location: 127,120 + Actor1153: rea2 + Owner: Scrin + Location: 126,129 + Actor1154: evis + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 107,118 + Actor1155: evis + Owner: Scrin + SubCell: 3 + Location: 107,121 + Facing: 166 + Actor1156: evis + Owner: Scrin + SubCell: 3 + Location: 126,124 + Facing: 134 + Actor1157: evis + Owner: Scrin + SubCell: 3 + Location: 125,125 + Facing: 642 + Actor1159: evis + Owner: Scrin + SubCell: 3 + Location: 132,123 + Facing: 261 + Actor1160: evis + Owner: Scrin + SubCell: 3 + Location: 130,131 + Facing: 1023 + Actor1161: evis + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 119,123 + Actor1162: evis + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 122,120 + Actor1163: evis + Owner: Scrin + SubCell: 3 + Location: 110,125 + Facing: 237 + Actor1164: evis + Owner: Scrin + SubCell: 3 + Location: 124,116 + Facing: 594 + Actor1165: evis + Owner: Scrin + SubCell: 3 + Location: 120,112 + Facing: 919 + Actor1166: s4 + Owner: Scrin + SubCell: 3 + Location: 122,118 + Facing: 190 + Actor1167: s4 + Owner: Scrin + SubCell: 3 + Location: 134,111 + Facing: 269 + Actor1168: s4 + Owner: Scrin + Location: 119,113 + SubCell: 3 + Facing: 578 + Actor1169: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 109,129 + Actor1170: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 117,136 + Actor1171: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 106,132 + Actor1172: deva + Owner: Scrin + Location: 111,111 + Facing: 150 + Actor1173: deva + Owner: Scrin + Location: 122,112 + Facing: 142 + Actor1174: split2 + Owner: Neutral + Location: 128,92 + Actor1175: split2 + Owner: Neutral + Location: 125,96 + Actor1176: split2 + Owner: Neutral + Location: 129,99 + Actor1177: split2 + Owner: Neutral + Location: 136,98 + Actor1179: swal + Owner: Scrin + Location: 144,108 + Actor1180: swal + Owner: Scrin + Location: 143,109 + Actor1181: swal + Owner: Scrin + Location: 144,109 + Actor1182: swal + Owner: Scrin + Location: 144,110 + Actor1183: swal + Owner: Scrin + Location: 144,111 + Actor1184: swal + Owner: Scrin + Location: 144,112 + Actor1185: swal + Owner: Scrin + Location: 143,113 + Actor1186: swal + Owner: Scrin + Location: 143,112 + Actor1187: silo.scrin + Owner: Scrin + Location: 143,110 + Actor1188: silo.scrin + Owner: Scrin + Location: 143,111 + Actor1178: scol + Owner: Scrin + Location: 143,108 + Actor1189: swal + Owner: Scrin + Location: 144,107 + Actor1190: swal + Owner: Scrin + Location: 142,107 + Actor1191: swal + Owner: Scrin + Location: 143,107 + Actor1192: scrinflora7 + Owner: Neutral + Location: 124,65 + Actor1193: scrinflora4 + Owner: Neutral + Location: 125,62 + Actor1194: scrinflora8 + Owner: Neutral + Location: 123,63 + Actor1195: scrinflora13 + Owner: Neutral + Location: 126,64 + Actor1196: scrinflora12 + Owner: Neutral + Location: 125,63 + Actor1197: scrinflora11 + Owner: Neutral + Location: 124,61 + Actor1198: scrinflora14 + Owner: Neutral + Location: 126,63 + Actor1199: scrinflora9 + Owner: Neutral + Location: 122,59 + Actor1200: scrinflora5 + Owner: Neutral + Location: 128,65 + Actor1201: scrinflora6 + Owner: Neutral + Location: 133,56 + Actor1202: scrinflora2 + Owner: Neutral + Location: 116,56 + Actor1203: scrinflora1 + Owner: Neutral + Location: 133,55 + Actor1204: scrinflora7 + Owner: Neutral + Location: 108,72 + Actor1205: scrinflora11 + Owner: Neutral + Location: 108,67 + Actor1206: scrinflora12 + Owner: Neutral + Location: 117,62 + Actor1207: scrinflora13 + Owner: Neutral + Location: 131,53 + Actor1208: scrinflora14 + Owner: Neutral + Location: 132,69 + Actor1209: scrinflora2 + Owner: Neutral + Location: 131,85 + Actor1210: scrinflora1 + Owner: Neutral + Location: 121,88 + Actor1211: scrinflora3 + Owner: Neutral + Location: 132,84 + Actor1212: scrinflora11 + Owner: Neutral + Location: 130,85 + Actor1213: scrinflora10 + Owner: Neutral + Location: 134,84 + Actor1214: scrinflora13 + Owner: Neutral + Location: 122,88 + Actor1215: scrinflora10 + Owner: Neutral + Location: 120,88 + Actor1216: swal + Owner: Neutral + Location: 118,78 + Health: 13 + Actor1217: swal + Owner: Neutral + Location: 118,77 + Health: 19 + Actor1218: swal + Owner: Neutral + Location: 119,78 + Health: 14 + Actor1219: swal + Owner: Neutral + Location: 119,77 + Health: 63 + Actor1220: swal + Owner: Neutral + Location: 119,76 + Actor1221: swal + Owner: Neutral + Location: 119,75 + Health: 31 + Actor1223: swal + Owner: Neutral + Location: 129,77 + Health: 25 + Actor1224: swal + Owner: Neutral + Location: 129,78 + Health: 14 + Actor1225: swal + Owner: Neutral + Location: 130,78 + Health: 26 + Actor1226: swal + Owner: Neutral + Location: 130,76 + Health: 19 + Actor1227: swal + Owner: Neutral + Location: 131,77 + Health: 28 + Actor1228: swal + Owner: Neutral + Location: 131,76 + Actor1229: swal + Owner: Neutral + Location: 131,78 + Actor1230: swal + Owner: Neutral + Location: 132,77 + Health: 37 + Actor1231: swal + Owner: Neutral + Location: 134,77 + Health: 29 + Actor1232: swal + Owner: Neutral + Location: 133,77 + Health: 67 + Actor1233: swal + Owner: Neutral + Location: 135,77 + Health: 72 + Actor1234: swal + Owner: Neutral + Location: 136,77 + Health: 25 + Actor1235: swal + Owner: Neutral + Location: 136,78 + Actor1236: swal + Owner: Neutral + Location: 137,78 + Health: 58 + Actor1237: swal + Owner: Neutral + Location: 137,79 + Health: 24 + Actor1222: splitblue + Owner: Neutral + Location: 106,46 + Actor1238: splitblue + Owner: Neutral + Location: 106,42 + Actor1239: splitblue + Owner: Neutral + Location: 113,40 + Actor1240: swal + Owner: Neutral + Health: 10 + Location: 134,45 + Actor1241: swal + Owner: Neutral + Health: 59 + Location: 135,45 + Actor1242: swal + Owner: Neutral + Health: 16 + Location: 136,45 + Actor1243: swal + Owner: Neutral + Health: 27 + Location: 135,46 + Actor1244: swal + Owner: Neutral + Health: 73 + Location: 136,46 + Actor1245: swal + Owner: Neutral + Health: 23 + Location: 137,46 + Actor1246: swal + Owner: Neutral + Health: 22 + Location: 142,45 + Actor1247: swal + Owner: Neutral + Health: 86 + Location: 143,45 + Actor1248: swal + Owner: Neutral + Health: 8 + Location: 141,46 + Actor1249: swal + Owner: Neutral + Health: 62 + Location: 142,46 + Actor1250: swal + Owner: Neutral + Health: 17 + Location: 143,46 + Actor1251: splitblue + Owner: Neutral + Location: 137,11 + Actor1252: splitblue + Owner: Neutral + Location: 136,18 + Actor1253: splitblue + Owner: Neutral + Location: 109,12 + Actor1254: splitblue + Owner: Neutral + Location: 106,16 + Actor1255: scrinflora1 + Owner: Neutral + Location: 139,33 + Actor1256: scrinflora7 + Owner: Neutral + Location: 133,29 + Actor1257: scrinflora8 + Owner: Neutral + Location: 110,31 + Actor1258: scrinflora13 + Owner: Neutral + Location: 119,36 + Actor1259: scrinflora12 + Owner: Neutral + Location: 136,31 + Actor1260: scrinflora10 + Owner: Neutral + Location: 136,36 + Actor1261: scrinflora9 + Owner: Neutral + Location: 138,41 + Actor1262: scrinflora6 + Owner: Neutral + Location: 107,24 + Actor1263: scrinflora2 + Owner: Neutral + Location: 109,2 + Actor1264: scrinflora5 + Owner: Neutral + Location: 136,2 + Actor1265: scrinflora4 + Owner: Neutral + Location: 140,6 + Actor1266: scrinflora13 + Owner: Neutral + Location: 141,25 + Actor1267: scrinflora11 + Owner: Neutral + Location: 140,33 + Actor1268: pdgy + Owner: Scrin + SubCell: 3 + Location: 125,122 + Facing: 142 + Actor1269: pdgy + Owner: Scrin + SubCell: 3 + Location: 24,134 + Facing: 23 + Actor1270: oblt + Owner: Scrin + Location: 115,126 + Facing: 206 + Actor1271: oblt + Owner: Scrin + Location: 136,111 + Facing: 31 + Actor1272: tpod + Owner: ScrinRebels + Location: 113,67 + Facing: 594 + Health: 81 + Actor1273: impl + Owner: ScrinRebels + SubCell: 3 + Location: 114,65 + Facing: 610 + Actor1274: impl + Owner: ScrinRebels + SubCell: 3 + Location: 110,68 + Facing: 674 + Actor1275: rtpd + Owner: Scrin + Location: 116,69 + Facing: 190 + Health: 90 + Actor1276: evis + Owner: Scrin + SubCell: 3 + Location: 118,69 + Facing: 166 + Actor1277: s1 + Owner: Scrin + SubCell: 3 + Location: 114,70 + Facing: 95 + Actor1278: s1 + Owner: Scrin + SubCell: 3 + Location: 116,67 + Facing: 142 + R10: waypoint + Owner: Neutral + Location: 110,56 + Actor1279: ltnk + Owner: Nod + Facing: 512 + Location: 18,7 + Actor1280: ltnk + Owner: Nod + Facing: 512 + Location: 28,7 + Actor1281: devo + Owner: Scrin + Location: 125,74 + Facing: 71 + Actor1282: devo + Owner: Scrin + Location: 128,73 + Facing: 87 + Actor1283: s4 + Owner: Scrin + SubCell: 3 + Location: 127,74 + Facing: 79 + Actor1284: s3 + Owner: Scrin + SubCell: 3 + Location: 130,71 + Facing: 384 + Actor1285: s3 + Owner: Scrin + SubCell: 3 + Location: 126,71 + Facing: 911 + Actor1286: s3 + Owner: Scrin + SubCell: 3 + Location: 123,76 + Facing: 15 + Actor1287: s1 + Owner: Scrin + SubCell: 3 + Location: 125,70 + Facing: 384 + Actor1288: s1 + Owner: Scrin + SubCell: 3 + Location: 123,73 + Facing: 103 + Actor1289: split2 + Owner: Neutral + Location: 94,85 + Actor1290: split2 + Owner: Neutral + Location: 93,81 + Actor1291: proc.scrin + Owner: Scrin + Location: 101,73 + Actor1292: proc.scrin + Owner: Scrin + Location: 97,70 + Actor1293: shar + Owner: Scrin + Location: 100,71 + Actor1294: ptur + Owner: Scrin + Location: 101,78 + TurretFacing: 380 + Actor1295: intl.ai + Owner: Scrin + Location: 109,122 + Facing: 126 + Actor1296: intl.ai + Owner: Scrin + Location: 119,105 + Facing: 0 + Actor1297: sbag + Owner: GDIHostile + Location: 122,20 + Actor1298: sbag + Owner: GDIHostile + Location: 121,20 + Actor1299: sbag + Owner: GDIHostile + Location: 120,20 + Actor1300: sbag + Owner: GDIHostile + Location: 119,20 + Actor1301: sbag + Owner: GDIHostile + Location: 118,20 + Actor1306: sbag + Owner: GDIHostile + Location: 128,20 + Actor1307: sbag + Owner: GDIHostile + Location: 129,20 + Actor1308: sbag + Owner: GDIHostile + Location: 130,20 + Actor1309: sbag + Owner: GDIHostile + Location: 131,20 + Actor1310: sbag + Owner: GDIHostile + Location: 132,20 + Actor1311: sbag + Owner: GDIHostile + Location: 132,19 + Actor1312: sbag + Owner: GDIHostile + Location: 132,18 + Actor1313: sbag + Owner: GDIHostile + Location: 132,17 + Actor1326: sbag + Owner: GDIHostile + Location: 132,5 + Actor1327: sbag + Owner: GDIHostile + Location: 132,7 + Actor1328: sbag + Owner: GDIHostile + Location: 132,6 + Actor1329: sbag + Owner: GDIHostile + Location: 120,24 + Actor1330: sbag + Owner: GDIHostile + Location: 121,24 + Actor1331: sbag + Owner: GDIHostile + Location: 122,24 + Actor1332: sbag + Owner: GDIHostile + Location: 120,23 + Actor1333: sbag + Owner: GDIHostile + Location: 122,23 + Actor1334: sbag + Owner: GDIHostile + Location: 129,23 + Actor1335: sbag + Owner: GDIHostile + Location: 129,24 + Actor1336: sbag + Owner: GDIHostile + Location: 130,24 + Actor1337: sbag + Owner: GDIHostile + Location: 131,24 + Actor1338: sbag + Owner: GDIHostile + Location: 131,23 + Actor1339: gtwr + Owner: GDIHostile + Location: 121,23 + Actor1340: gtwr + Owner: GDIHostile + Location: 130,23 + Actor1341: gtwr + Owner: GDIHostile + Location: 123,20 + Actor1342: gtwr + Owner: GDIHostile + Location: 127,20 + Actor1345: atwr + Owner: GDIHostile + Location: 131,19 + Actor1354: proc.td + Owner: GDIHostile + Location: 129,6 + Actor1321: sbag + Owner: GDIHostile + Location: 118,1 + Actor1322: sbag + Owner: GDIHostile + Location: 119,1 + Actor1323: sbag + Owner: GDIHostile + Location: 120,1 + Actor1324: sbag + Owner: GDIHostile + Location: 131,1 + Actor1325: sbag + Owner: GDIHostile + Location: 132,1 + Actor1348: sbag + Owner: GDIHostile + Location: 132,2 + Actor1356: sbag + Owner: GDIHostile + Location: 132,3 + Actor1357: sbag + Owner: GDIHostile + Location: 132,4 + Actor1358: sbag + Owner: GDIHostile + Location: 129,1 + Actor1359: sbag + Owner: GDIHostile + Location: 130,1 + Actor1360: sbag + Owner: GDIHostile + Location: 128,1 + Actor1361: sbag + Owner: GDIHostile + Location: 127,1 + Actor1362: sbag + Owner: GDIHostile + Location: 122,1 + Actor1363: sbag + Owner: GDIHostile + Location: 121,1 + Actor1364: afac + Owner: GDIHostile + Location: 119,2 + Actor1350: gtek + Owner: GDIHostile + Location: 129,2 + Actor1351: nuk2 + Owner: GDIHostile + Location: 127,2 + Actor1367: nuk2 + Owner: GDIHostile + Location: 122,2 + Actor1368: nuk2 + Owner: GDIHostile + Location: 124,2 + Actor1369: sbag + Owner: GDIHostile + Location: 123,1 + Actor1370: sbag + Owner: GDIHostile + Location: 124,1 + Actor1371: sbag + Owner: GDIHostile + Location: 125,1 + Actor1372: sbag + Owner: GDIHostile + Location: 126,1 + Actor1355: cram + Owner: GDIHostile + Location: 121,9 + Actor1375: cram + Owner: GDIHostile + Location: 130,11 + Actor1377: n1 + Owner: GDIHostile + SubCell: 3 + Location: 128,21 + Facing: 610 + Actor1378: n1 + Owner: GDIHostile + SubCell: 3 + Location: 128,23 + Facing: 467 + Actor1381: n1 + Owner: GDIHostile + SubCell: 3 + Location: 132,24 + Facing: 384 + Actor1382: n1 + Owner: GDIHostile + Location: 119,24 + SubCell: 3 + Facing: 384 + Actor1383: n2 + Owner: GDIHostile + SubCell: 3 + Location: 131,17 + Facing: 384 + Actor1385: ztrp + Owner: GDIHostile + SubCell: 3 + Location: 133,25 + Facing: 384 + Actor1387: htnk.drone + Owner: GDIHostile + Location: 130,26 + Facing: 515 + Actor1388: htnk.ion + Owner: GDIHostile + Location: 117,22 + Facing: 499 + Actor1389: hsam + Owner: GDIHostile + Location: 134,22 + Facing: 384 + Actor1390: hsam + Owner: GDIHostile + Location: 114,18 + Facing: 515 + R7: waypoint + Owner: Neutral + Location: 140,86 + R6: waypoint + Owner: Neutral + Location: 129,39 + R8: waypoint + Owner: Neutral + Location: 100,26 + ScrinBase2: waypoint + Owner: Neutral + Location: 123,122 + ScrinBase1: waypoint + Owner: Neutral + Location: 22,130 + GDIBase: waypoint + Owner: Neutral + Location: 124,13 + Actor1391: scol + Owner: Scrin + Location: 117,88 + Actor1392: scol + Owner: Scrin + Location: 136,87 + Actor1393: swal + Owner: Scrin + Location: 135,88 + Actor1394: swal + Owner: Scrin + Location: 135,87 + Actor1395: swal + Owner: Scrin + Location: 135,86 + Actor1396: swal + Owner: Scrin + Location: 136,86 + Actor1397: swal + Owner: Scrin + Location: 137,86 + Actor1398: swal + Owner: Scrin + Location: 137,87 + Actor1399: swal + Owner: Scrin + Location: 137,88 + Actor1400: swal + Owner: Scrin + Location: 136,88 + Actor1401: swal + Owner: Scrin + Location: 117,89 + Actor1402: swal + Owner: Scrin + Location: 116,89 + Actor1403: swal + Owner: Scrin + Location: 116,88 + Actor1404: swal + Owner: Scrin + Location: 116,87 + Actor1405: swal + Owner: Scrin + Location: 117,87 + Actor1406: swal + Owner: Scrin + Location: 118,87 + Actor1407: swal + Owner: Scrin + Location: 118,88 + Actor1408: swal + Owner: Scrin + Location: 118,89 + Actor1409: tpod + Owner: Scrin + Location: 114,88 + Facing: 15 + Actor1410: tpod + Owner: Scrin + Location: 139,88 + Facing: 0 + Actor1411: evis + Owner: Scrin + SubCell: 3 + Location: 115,90 + Facing: 111 + Actor1412: evis + Owner: Scrin + SubCell: 3 + Location: 119,86 + Facing: 856 + Actor1413: evis + Owner: Scrin + SubCell: 3 + Location: 133,88 + Facing: 0 + Actor1414: evis + Owner: Scrin + Location: 138,86 + SubCell: 3 + Facing: 111 + Actor1415: n3 + SubCell: 3 + Location: 118,15 + Facing: 384 + Owner: GDIHostile + Actor1416: n3 + Location: 133,6 + SubCell: 3 + Facing: 384 + Owner: GDIHostile + Actor1418: n3 + SubCell: 3 + Location: 133,26 + Facing: 384 + Owner: GDIHostile + Actor1420: titn + Location: 129,19 + Facing: 384 + Owner: GDIHostile + Actor1422: titn + Owner: GDIHostile + Location: 128,25 + Facing: 531 + Actor1423: medi + Owner: GDIHostile + SubCell: 3 + Location: 130,21 + Facing: 563 + Actor1424: medi + Owner: GDIHostile + Facing: 384 + Location: 120,21 + SubCell: 3 + Actor1425: medi + Owner: GDIHostile + Facing: 384 + Location: 119,24 + SubCell: 1 + Actor1426: n1 + Owner: GDIHostile + Location: 119,24 + SubCell: 2 + Facing: 578 + Actor1427: n1 + Owner: GDIHostile + SubCell: 3 + Location: 121,25 + Facing: 705 + Actor1428: n1 + Owner: GDIHostile + Facing: 384 + Location: 121,25 + SubCell: 1 + Actor1430: n1 + Owner: GDIHostile + Location: 119,25 + SubCell: 1 + Facing: 475 + Actor1432: n1 + Owner: GDIHostile + Facing: 384 + Location: 117,23 + SubCell: 3 + Actor1433: n1 + Owner: GDIHostile + Facing: 384 + Location: 117,23 + SubCell: 1 + Actor1435: n1 + Owner: GDIHostile + Facing: 384 + Location: 115,22 + SubCell: 3 + Actor1436: n1 + Owner: GDIHostile + Facing: 384 + Location: 115,21 + SubCell: 3 + Actor1437: n1 + Owner: GDIHostile + SubCell: 3 + Location: 125,25 + Facing: 547 + Actor1438: n1 + Owner: GDIHostile + Facing: 384 + Location: 125,25 + SubCell: 1 + Actor1439: n1 + Owner: GDIHostile + Facing: 384 + SubCell: 3 + Location: 132,25 + Actor1429: n3 + Owner: GDIHostile + Facing: 384 + Location: 125,25 + SubCell: 2 + Actor1441: n3 + Owner: GDIHostile + Location: 117,24 + SubCell: 2 + Facing: 563 + Actor1431: n1 + Owner: GDIHostile + Facing: 384 + Location: 130,25 + SubCell: 3 + Actor1434: n1 + Owner: GDIHostile + Facing: 384 + Location: 128,23 + SubCell: 1 + Actor1440: n1 + Owner: GDIHostile + SubCell: 3 + Location: 123,23 + Facing: 491 + Actor1444: n1 + Owner: GDIHostile + Facing: 384 + Location: 123,23 + SubCell: 4 + Actor1445: n1 + Owner: GDIHostile + Location: 123,23 + SubCell: 5 + Facing: 602 + Actor1384: ztrp + Owner: GDIHostile + SubCell: 3 + Location: 121,21 + Facing: 384 + Actor1376: n1 + Owner: GDIHostile + SubCell: 3 + Location: 123,21 + Facing: 384 + Actor1443: camera + Owner: Scrin + Location: 126,23 + ExterminatorSpawnEast: waypoint + Owner: Neutral + Location: 132,117 + R9: waypoint + Owner: Neutral + Location: 112,81 + Exterminator4Patrol1: waypoint + Owner: Neutral + Location: 125,11 + Exterminator4Patrol2: waypoint + Owner: Neutral + Location: 71,52 + Exterminator4Patrol3: waypoint + Owner: Neutral + Location: 11,36 + Exterminator4Patrol4: waypoint + Owner: Neutral + Location: 40,16 + GravityStabilizer2: grav + Owner: Scrin + Location: 27,126 + WarpSphere1: wsph + Owner: Scrin + Location: 26,119 + Actor1447: srep + Owner: Scrin + Location: 21,125 + Actor1419: rea2 + Owner: Scrin + Location: 130,128 + Actor1448: rea2 + Owner: Scrin + Location: 131,119 + Actor1449: evis + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 132,125 + Actor1450: proc.scrin + Owner: Scrin + Location: 122,111 + GravityStabilizer3: grav + Owner: Scrin + Location: 114,114 + Actor1421: sbag + Owner: GDIHostile + Location: 117,20 + Actor1451: sbag + Owner: GDIHostile + Location: 116,20 + Actor1452: sbag + Owner: GDIHostile + Location: 115,20 + Actor1453: sbag + Owner: GDIHostile + Location: 115,19 + Actor1454: sbag + Owner: GDIHostile + Location: 115,18 + Actor1455: sbag + Owner: GDIHostile + Location: 115,8 + Actor1456: sbag + Owner: GDIHostile + Location: 115,7 + Actor1457: sbag + Owner: GDIHostile + Location: 115,6 + Actor1458: sbag + Owner: GDIHostile + Location: 115,5 + Actor1459: sbag + Owner: GDIHostile + Location: 115,4 + Actor1460: sbag + Owner: GDIHostile + Location: 115,3 + Actor1461: sbag + Owner: GDIHostile + Location: 115,2 + Actor1462: sbag + Owner: GDIHostile + Location: 115,1 + Actor1463: sbag + Owner: GDIHostile + Location: 117,1 + Actor1464: sbag + Owner: GDIHostile + Location: 116,1 + Actor1465: n3 + SubCell: 3 + Facing: 384 + Owner: GDIHostile + Location: 114,6 + Actor1417: nuk2 + Owner: GDIHostile + Location: 116,2 + Actor1466: nuk2 + Owner: GDIHostile + Location: 116,5 + Actor1467: nuk2 + Owner: GDIHostile + Location: 121,5 + Actor1468: nuk2 + Owner: GDIHostile + Location: 119,5 + GDIFactory: weap.td + Owner: GDIHostile + Location: 120,14 + GDIBarracks: pyle + Owner: GDIHostile + Location: 128,15 + GDIAirfield: afld.gdi + Owner: GDIHostile + Location: 124,7 + Actor1469: rep + Owner: GDIHostile + Location: 123,9 + Actor1470: hq + Owner: GDIHostile + Location: 127,11 + Actor1471: sbag + Owner: GDIHostile + Location: 115,17 + Actor1472: sbag + Owner: GDIHostile + Location: 115,16 + Actor1473: sbag + Owner: GDIHostile + Location: 115,15 + Actor1474: sbag + Owner: GDIHostile + Location: 115,9 + Actor1475: gtwr + Owner: GDIHostile + Location: 114,16 + Actor1476: gtwr + Owner: GDIHostile + Location: 114,8 + Actor1477: atwr + Owner: GDIHostile + Location: 120,19 + Actor1478: atwr + Owner: GDIHostile + Location: 116,19 + Actor1479: silo.td + Owner: GDIHostile + Location: 117,9 + Actor1480: n3 + Owner: GDIHostile + Location: 117,19 + SubCell: 3 + Facing: 523 + Actor1481: n1 + Owner: GDIHostile + Facing: 384 + Location: 114,17 + SubCell: 3 + Actor1482: n1 + Owner: GDIHostile + SubCell: 3 + Location: 113,9 + Facing: 384 + Actor1483: n1 + Owner: GDIHostile + SubCell: 3 + Location: 113,19 + Facing: 269 + Actor1442: titn + Owner: GDIHostile + Facing: 515 + Location: 123,25 + Actor1484: cram + Owner: GDIHostile + TurretFacing: 832 + Location: 125,15 + GravityStabilizer4: grav + Owner: Scrin + Location: 110,111 + FallenRebel4: srep + Owner: ScrinRebels + Location: 82,123 + Health: 44 + FallenRebel5: reac + Owner: ScrinRebels + Location: 78,128 + Health: 33 + FirstExterminatorDetector: waypoint + Owner: Neutral + Location: 69,122 + ExterminatorFirstSpawn: waypoint + Owner: Neutral + Location: 51,115 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|missions/main-campaign/ca36-reckoning/reckoning-rules.yaml, ca|rules/custom/coop-rules.yaml, reckoning-coop-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/coop-campaign/ca36-reckoning-coop/reckoning-coop-rules.yaml b/mods/ca/missions/coop-campaign/ca36-reckoning-coop/reckoning-coop-rules.yaml new file mode 100644 index 0000000000..3da67146dd --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca36-reckoning-coop/reckoning-coop-rules.yaml @@ -0,0 +1,67 @@ +World: + LuaScript: + Scripts: campaign.lua, coop.lua, ca|missions/main-campaign/ca36-reckoning/reckoning.lua, reckoning-coop.lua + ScriptLobbyDropdown@basesharing: + Values: + -1: + Default: 0 + Locked: True + ScriptLobbyDropdown@incomeshare: + Values: + -10: + -15: + -20: + -25: + -30: + -35: + -40: + -45: + -50: + -100: + -125: + -150: + -175: + -999: + Default: 0 + Locked: True + ScriptLobbyDropdown@etpdfreq: + ID: etpdfreq + Label: Exterminator Frequency + Description: Increases the frequency of Exterminator Tripod spawns (Exterminators are unaffected by other options besides difficulty). + Values: + 0: +0% + 25: +25% + 50: +50% + 75: +75% + 100: +100% + 125: +125% + 150: +150% + 175: +175% + 200: +200% + 250: +250% + 300: +300% + 350: +350% + 400: +400% + Default: 0 + DisplayOrder: 999 + LobbyMissionInfo@InitialObjectives: + Prefix: Initial Objectives + Text: • Destroy all Scrin forces loyal to the Overlord. + +Player: + ProvidesPrerequisitesOnCount@ScrinAllegiances: + -CountReachedNotifications: + -CountReachedTextNotifications: + +loyalist.allegiance: + Inherits@CAMPAIGNDISABLED: ^Disabled + +rebel.allegiance: + Inherits@CAMPAIGNDISABLED: ^Disabled + +malefic.allegiance: + Inherits@CAMPAIGNDISABLED: ^Disabled + +^ColonySpikePower: + DetonateWeaponPower@ColonySpike: + Prerequisites: ~disabled diff --git a/mods/ca/missions/coop-campaign/ca36-reckoning-coop/reckoning-coop.lua b/mods/ca/missions/coop-campaign/ca36-reckoning-coop/reckoning-coop.lua new file mode 100644 index 0000000000..9d503d8a58 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca36-reckoning-coop/reckoning-coop.lua @@ -0,0 +1,139 @@ + +local exterminatorFrequencyOptionValue = tonumber(Map.LobbyOption("etpdfreq")) + +if exterminatorFrequencyOptionValue ~= nil then + local ExterminatorMultiplier = 1 + (exterminatorFrequencyOptionValue / 100) + ExterminatorsInterval[Difficulty] = math.max(ExterminatorsInterval[Difficulty] / ExterminatorMultiplier, 25) +end + +SetupPlayers = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Multi2 = Player.GetPlayer("Multi2") + Multi3 = Player.GetPlayer("Multi3") + Multi4 = Player.GetPlayer("Multi4") + Multi5 = Player.GetPlayer("Multi5") + Nod = Player.GetPlayer("Nod") + Scrin = Player.GetPlayer("Scrin") + ScrinRebels = Player.GetPlayer("ScrinRebels") + GDIHostile = Player.GetPlayer("GDIHostile") + GDI = Player.GetPlayer("GDI") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = Utils.Where({ Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 }, function(p) return p ~= nil end) + MissionEnemies = { Scrin } + SinglePlayerPlayer = Nod + StopSpread = true + CoopInit() + DistributeUnitsAndBases() +end + +AfterWorldLoaded = function() + Utils.Do(Utils.Where({ Multi2, Multi5 }, function(p) return p ~= nil end), function(p) + Actor.Create("rebel.allegiance", true, { Owner = p }) + end) + + if (Multi1 ~= nil and Multi1.IsLocalPlayer) or (Multi4 ~= nil and Multi4.IsLocalPlayer) then + Camera.Position = GDIBase.CenterPosition + end + + if Multi2 ~= nil and Multi2.IsLocalPlayer then + Camera.Position = Exterminator3Patrol1.CenterPosition + end + + if Multi5 ~= nil and Multi5.IsLocalPlayer then + Camera.Position = R4.CenterPosition + end +end + +AfterTick = function() + +end + +DistributeUnitsAndBases = function() + -- transfer Nod starting units to first Nod player + if Multi0 ~= nil or Multi3 ~= nil then + local firstNodPlayer = Multi0 ~= nil and Multi0 or Multi3 + local nodMcv = Nod.GetActorsByType("amcv")[1] + nodMcv.Owner = firstNodPlayer + + local nodUnits = Utils.Where(Nod.GetActors(), function(a) + return a.HasProperty("Move") and not IsHarvester(a) and not IsMcv(a) + end) + + AssignToCoopPlayers(nodUnits, Utils.Where({ Multi0, Multi3 }, function(p) return p ~= nil end)) + + -- if there are 2 Nod players, send MCV for second Nod player + if Multi0 ~= nil and Multi3 ~= nil then + Reinforcements.Reinforce(Multi3, { "amcv" }, { CPos.New(23, 1), CPos.New(23, 5) }) + end + end + + -- transfer GDI base to first GDI player + if Multi1 ~= nil or Multi4 ~= nil then + GDIActive = true + + local excess = GDIHostile.GetActorsByTypes({ "gtek", "hq", "afld.gdi", "titn", "htnk.ion", "htnk.drone", "atwr" }) + Utils.Do(excess, function(a) a.Destroy() end) + + local firstGdiPlayer = Multi1 ~= nil and Multi1 or Multi4 + TransferBaseToPlayer(GDIHostile, firstGdiPlayer) + + local gdiUnits = Utils.Where(GDIHostile.GetActors(), function(a) + return a.HasProperty("Move") and not IsHarvester(a) and not IsMcv(a) + end) + + local activeGdiPlayers = Utils.Where({ Multi1, Multi4 }, function(p) return p ~= nil end) + AssignToCoopPlayers(gdiUnits, activeGdiPlayers) + + -- if there are 2 GDI players, send MCV for second GDI player + if Multi1 ~= nil and Multi4 ~= nil then + Reinforcements.Reinforce(Multi4, { "amcv" }, { CPos.New(113, 1), CPos.New(118, 12) }) + end + + Squads.ScrinGDIKiller.AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 40, Max = 80 }) + InitAttackSquad(Squads.ScrinGDIKiller, Scrin, activeGdiPlayers) + end + + -- transfer top Scrin base to first Scrin player (y = 0 -> 50) + if Multi2 ~= nil or Multi5 ~= nil then + ScrinRebelsActive = true + + Trigger.AfterDelay(1, function() + local excess = ScrinRebels.GetActorsByTypes({ "scrt", "nerv", "grav", "sign", "tpod" }) + Utils.Do(excess, function(a) a.Destroy() end) + + local firstScrinPlayer = Multi2 ~= nil and Multi2 or Multi5 + + local scrinTopActors = Utils.Where(ScrinRebels.GetActors(), function(a) + return a.HasProperty("Health") and a.Location.Y <= 50 + end) + + Utils.Do(scrinTopActors, function(a) + a.Owner = firstScrinPlayer + end) + + local scrinMiddleActors = Utils.Where(ScrinRebels.GetActors(), function(a) + return a.HasProperty("Health") and a.Location.Y > 50 and a.Location.Y <= 80 + end) + + -- if there are 2 Scrin players, give middle Scrin base to second Scrin player (y = 51 -> 80) + if Multi2 ~= nil and Multi5 ~= nil then + Utils.Do(scrinMiddleActors, function(a) + a.Owner = Multi5 + end) + -- otherwise give it to first Scrin player + else + Utils.Do(scrinMiddleActors, function(a) + a.Owner = firstScrinPlayer + end) + end + + local activeRebelPlayers = Utils.Where({ Multi1, Multi4 }, function(p) return p ~= nil end) + Squads.ScrinRebelKiller.AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 40, Max = 80 }) + InitAttackSquad(Squads.ScrinRebelKiller, Scrin, activeRebelPlayers) + CACoopQueueSyncer() + end) + end + + CACoopQueueSyncer() +end diff --git a/mods/ca/missions/coop-campaign/ca37-statecraft-coop/map.bin b/mods/ca/missions/coop-campaign/ca37-statecraft-coop/map.bin new file mode 100644 index 0000000000..528d5c211b Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca37-statecraft-coop/map.bin differ diff --git a/mods/ca/missions/coop-campaign/ca37-statecraft-coop/map.png b/mods/ca/missions/coop-campaign/ca37-statecraft-coop/map.png new file mode 100644 index 0000000000..600f309d4f Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca37-statecraft-coop/map.png differ diff --git a/mods/ca/missions/coop-campaign/ca37-statecraft-coop/map.yaml b/mods/ca/missions/coop-campaign/ca37-statecraft-coop/map.yaml new file mode 100644 index 0000000000..05e181e0ee --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca37-statecraft-coop/map.yaml @@ -0,0 +1,4512 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 37: Statecraft Co-op + +Author: Darkademic & Gandorques Hikla + +Tileset: WINTER + +MapSize: 130,130 + +Bounds: 1,1,128,128 + +Visibility: Lobby + +Categories: Co-op Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Marinesko, Romanov, Krukov, MarineskoUnited, RomanovUnited, KrukovUnited + PlayerReference@USSR: + Name: USSR + Faction: soviet + Color: FE1100 + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Marinesko, Romanov, Krukov, MarineskoUnited, RomanovUnited, KrukovUnited, Creeps + PlayerReference@Marinesko: + Name: Marinesko + Bot: campaign + Faction: soviet + Color: 994050 + Enemies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Romanov, Krukov, Creeps + PlayerReference@Romanov: + Name: Romanov + Bot: campaign + Faction: soviet + Color: FF9922 + Enemies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Marinesko, Krukov, Creeps + PlayerReference@Krukov: + Name: Krukov + Bot: campaign + Faction: soviet + Color: 485183 + Enemies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Marinesko, Romanov, Creeps + PlayerReference@MarineskoUnited: + Name: MarineskoUnited + Bot: campaign + Faction: soviet + Color: 994050 + Allies: RomanovUnited, KrukovUnited + Enemies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@RomanovUnited: + Name: RomanovUnited + Bot: campaign + Faction: soviet + Color: FF9922 + Allies: MarineskoUnited, KrukovUnited + Enemies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@KrukovUnited: + Name: KrukovUnited + Bot: campaign + Faction: soviet + Color: 485183 + Allies: MarineskoUnited, RomanovUnited + Enemies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: FE1100 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Marinesko, Romanov, Krukov, MarineskoUnited, RomanovUnited, KrukovUnited, Creeps + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: 0B7310 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Marinesko, Romanov, Krukov, MarineskoUnited, RomanovUnited, KrukovUnited, Creeps + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: EEA8A8 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Marinesko, Romanov, Krukov, MarineskoUnited, RomanovUnited, KrukovUnited, Creeps + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: 775A12 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Marinesko, Romanov, Krukov, MarineskoUnited, RomanovUnited, KrukovUnited, Creeps + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: 82C900 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Marinesko, Romanov, Krukov, MarineskoUnited, RomanovUnited, KrukovUnited, Creeps + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: DD1691 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Marinesko, Romanov, Krukov, MarineskoUnited, RomanovUnited, KrukovUnited, Creeps + +Actors: + Actor0: mcv + Owner: USSR + Location: 67,118 + Facing: 0 + Actor4: 3tnk + Owner: USSR + Location: 67,115 + Facing: 0 + Actor2: 3tnk + Owner: USSR + Facing: 0 + Location: 67,113 + Actor3: 3tnk + Owner: USSR + Facing: 0 + Location: 67,111 + Actor6: btr + Owner: USSR + Facing: 0 + Location: 67,109 + Actor7: btr + Owner: USSR + Facing: 0 + Location: 67,107 + Actor8: katy + Owner: USSR + Location: 67,121 + Facing: 0 + Actor9: katy + Owner: USSR + Facing: 0 + Location: 67,123 + Actor10: e1 + Owner: USSR + SubCell: 3 + Location: 65,116 + Facing: 0 + Actor11: e1 + Owner: USSR + SubCell: 3 + Facing: 0 + Location: 66,114 + Actor12: e1 + Owner: USSR + SubCell: 3 + Facing: 0 + Location: 65,113 + Actor13: e1 + Owner: USSR + SubCell: 3 + Facing: 0 + Location: 69,111 + Actor14: e1 + Owner: USSR + SubCell: 3 + Facing: 0 + Location: 68,110 + Actor15: e1 + Owner: USSR + SubCell: 3 + Facing: 0 + Location: 69,108 + Actor16: e2 + Owner: USSR + SubCell: 3 + Location: 69,116 + Facing: 0 + Actor17: e3 + Owner: USSR + SubCell: 3 + Location: 69,121 + Facing: 0 + Actor18: e3 + Owner: USSR + SubCell: 3 + Facing: 0 + Location: 65,120 + Actor19: e2 + Owner: USSR + SubCell: 3 + Facing: 0 + Location: 65,110 + Actor20: e2 + Owner: USSR + SubCell: 3 + Facing: 0 + Location: 66,108 + Actor21: fact + Owner: Romanov + Location: 125,64 + Actor34: brik + Owner: Romanov + Location: 128,72 + Actor35: brik + Owner: Romanov + Location: 128,71 + Actor36: brik + Owner: Romanov + Location: 128,70 + Actor37: brik + Owner: Romanov + Location: 128,69 + Actor38: brik + Owner: Romanov + Location: 128,68 + Actor39: brik + Owner: Romanov + Location: 128,67 + Actor40: brik + Owner: Romanov + Location: 128,66 + Actor41: brik + Owner: Romanov + Location: 128,65 + Actor42: brik + Owner: Romanov + Location: 128,64 + Actor43: brik + Owner: Romanov + Location: 128,63 + Actor44: brik + Owner: Romanov + Location: 128,62 + Actor45: brik + Owner: Romanov + Location: 128,61 + Actor46: brik + Owner: Romanov + Location: 128,60 + Actor62: brik + Owner: Romanov + Location: 111,71 + Actor63: brik + Owner: Romanov + Location: 110,72 + Actor64: brik + Owner: Romanov + Location: 111,72 + Actor65: brik + Owner: Romanov + Location: 110,71 + Actor66: brik + Owner: Romanov + Location: 109,72 + Actor67: brik + Owner: Romanov + Location: 108,72 + Actor68: brik + Owner: Romanov + Location: 107,72 + Actor69: brik + Owner: Romanov + Location: 107,71 + Actor70: tsla + Owner: Romanov + Location: 109,71 + Actor71: brik + Owner: Romanov + Location: 107,66 + Actor72: brik + Owner: Romanov + Location: 107,67 + Actor73: brik + Owner: Romanov + Location: 107,68 + Actor74: brik + Owner: Romanov + Location: 107,69 + Actor75: brik + Owner: Romanov + Location: 107,70 + Actor76: brik + Owner: Romanov + Location: 107,65 + Actor77: brik + Owner: Romanov + Location: 107,64 + Actor78: brik + Owner: Romanov + Location: 108,64 + Actor79: brik + Owner: Romanov + Location: 108,65 + Actor105: tsla + Owner: Romanov + Location: 108,66 + Actor109: barr + Owner: Romanov + Location: 111,65 + Actor112: sam + Owner: Romanov + Location: 108,69 + Actor226: brik + Owner: Romanov + Location: 107,53 + Actor227: brik + Owner: Romanov + Location: 108,53 + Actor228: brik + Owner: Romanov + Location: 109,53 + Actor229: brik + Owner: Romanov + Location: 110,53 + Actor230: brik + Owner: Romanov + Location: 111,53 + Actor231: brik + Owner: Romanov + Location: 112,53 + Actor232: brik + Owner: Romanov + Location: 113,53 + Actor233: brik + Owner: Romanov + Location: 114,53 + Actor234: brik + Owner: Romanov + Location: 115,53 + Actor235: brik + Owner: Romanov + Location: 116,53 + Actor236: brik + Owner: Romanov + Location: 121,53 + Actor237: brik + Owner: Romanov + Location: 122,53 + Actor238: brik + Owner: Romanov + Location: 123,53 + Actor239: brik + Owner: Romanov + Location: 124,53 + Actor240: brik + Owner: Romanov + Location: 125,53 + Actor241: brik + Owner: Romanov + Location: 126,53 + Actor242: brik + Owner: Romanov + Location: 127,53 + Actor243: brik + Owner: Romanov + Location: 128,53 + Actor244: brik + Owner: Romanov + Location: 107,54 + Actor246: weap + Owner: Romanov + Location: 110,54 + Actor247: tsla + Owner: Romanov + Location: 114,54 + Actor248: brik + Owner: Romanov + Location: 115,54 + Actor249: brik + Owner: Romanov + Location: 116,54 + Actor250: brik + Owner: Romanov + Location: 121,54 + Actor251: brik + Owner: Romanov + Location: 122,54 + Actor252: brik + Owner: Romanov + Location: 128,54 + Actor253: brik + Owner: Romanov + Location: 107,55 + Actor255: brik + Owner: Romanov + Location: 128,55 + Actor256: brik + Owner: Romanov + Location: 107,56 + Actor258: brik + Owner: Romanov + Location: 128,56 + Actor259: brik + Owner: Romanov + Location: 128,57 + Actor260: brik + Owner: Romanov + Location: 128,58 + Actor261: brik + Owner: Romanov + Location: 128,59 + Actor262: brik + Owner: Romanov + Location: 107,57 + Actor263: tsla + Owner: Romanov + Location: 108,57 + Actor264: brik + Owner: Romanov + Location: 107,58 + Actor265: brik + Owner: Romanov + Location: 108,58 + Actor266: brik + Owner: Romanov + Location: 107,59 + Actor267: brik + Owner: Romanov + Location: 108,59 + Actor254: weap + Owner: Romanov + Location: 112,58 + RomanovIndustrialPlant: indp + Owner: Romanov + Location: 122,58 + Actor245: fix + Owner: Romanov + Location: 114,62 + Actor269: stek + Owner: Romanov + Location: 125,54 + Actor270: dome + Owner: Romanov + Location: 126,60 + Actor271: sam + Owner: Romanov + Location: 126,58 + Actor272: sam + Owner: Romanov + Location: 108,54 + Actor273: ftur + Owner: Romanov + Location: 111,73 + Actor275: ftur + Owner: Romanov + Location: 106,59 + Actor276: ftur + Owner: Romanov + Location: 106,64 + Actor277: ftur + Owner: Romanov + Location: 116,52 + Actor278: ftur + Owner: Romanov + Location: 121,52 + Actor279: tsla + Owner: Romanov + Location: 123,54 + Actor280: npwr + Owner: Romanov + Location: 120,65 + Actor287: brik + Owner: Krukov + Location: 64,20 + Actor288: brik + Owner: Krukov + Location: 64,19 + Actor289: brik + Owner: Krukov + Location: 64,18 + Actor290: brik + Owner: Krukov + Location: 64,17 + Actor291: brik + Owner: Krukov + Location: 64,16 + Actor292: brik + Owner: Krukov + Location: 65,16 + Actor293: brik + Owner: Krukov + Location: 65,17 + Actor294: brik + Owner: Krukov + Location: 64,21 + Actor295: brik + Owner: Krukov + Location: 65,21 + Actor296: brik + Owner: Krukov + Location: 67,21 + Actor297: brik + Owner: Krukov + Location: 66,21 + Actor298: brik + Owner: Krukov + Location: 68,21 + Actor299: brik + Owner: Krukov + Location: 69,21 + Actor300: brik + Owner: Krukov + Location: 70,21 + Actor301: brik + Owner: Krukov + Location: 72,21 + Actor302: brik + Owner: Krukov + Location: 71,21 + Actor303: brik + Owner: Krukov + Location: 72,20 + Actor304: brik + Owner: Krukov + Location: 71,20 + Actor305: brik + Owner: Krukov + Location: 78,20 + Actor306: brik + Owner: Krukov + Location: 78,21 + Actor307: brik + Owner: Krukov + Location: 79,21 + Actor308: brik + Owner: Krukov + Location: 79,20 + Actor309: brik + Owner: Krukov + Location: 80,21 + Actor310: brik + Owner: Krukov + Location: 82,21 + Actor311: brik + Owner: Krukov + Location: 81,21 + Actor312: brik + Owner: Krukov + Location: 84,21 + Actor313: brik + Owner: Krukov + Location: 83,21 + Actor314: brik + Owner: Krukov + Location: 85,21 + Actor315: brik + Owner: Krukov + Location: 86,21 + Actor316: brik + Owner: Krukov + Location: 87,21 + Actor317: brik + Owner: Krukov + Location: 88,21 + Actor318: brik + Owner: Krukov + Location: 89,21 + Actor319: brik + Owner: Krukov + Location: 89,20 + Actor320: brik + Owner: Krukov + Location: 89,19 + Actor321: brik + Owner: Krukov + Location: 89,18 + Actor322: brik + Owner: Krukov + Location: 89,17 + Actor323: brik + Owner: Krukov + Location: 89,16 + Actor324: brik + Owner: Krukov + Location: 89,15 + Actor325: brik + Owner: Krukov + Location: 89,14 + Actor326: brik + Owner: Krukov + Location: 88,14 + Actor327: brik + Owner: Krukov + Location: 88,15 + Actor328: brik + Owner: Krukov + Location: 88,8 + Actor329: brik + Owner: Krukov + Location: 88,9 + Actor330: brik + Owner: Krukov + Location: 89,9 + Actor331: brik + Owner: Krukov + Location: 89,8 + Actor332: brik + Owner: Krukov + Location: 89,7 + Actor333: brik + Owner: Krukov + Location: 89,6 + Actor334: brik + Owner: Krukov + Location: 89,5 + Actor335: brik + Owner: Krukov + Location: 89,4 + Actor336: brik + Owner: Krukov + Location: 89,3 + Actor337: brik + Owner: Krukov + Location: 89,2 + Actor338: brik + Owner: Krukov + Location: 89,1 + Actor339: brik + Owner: Krukov + Location: 88,1 + Actor340: brik + Owner: Krukov + Location: 87,1 + Actor341: brik + Owner: Krukov + Location: 86,1 + Actor342: brik + Owner: Krukov + Location: 64,11 + Actor343: brik + Owner: Krukov + Location: 65,11 + Actor344: brik + Owner: Krukov + Location: 65,10 + Actor345: brik + Owner: Krukov + Location: 64,10 + Actor346: brik + Owner: Krukov + Location: 64,9 + Actor347: brik + Owner: Krukov + Location: 64,8 + Actor348: brik + Owner: Krukov + Location: 64,7 + Actor349: brik + Owner: Krukov + Location: 64,6 + Actor350: brik + Owner: Krukov + Location: 64,5 + Actor351: brik + Owner: Krukov + Location: 64,4 + Actor352: brik + Owner: Krukov + Location: 64,3 + Actor353: brik + Owner: Krukov + Location: 64,2 + Actor354: brik + Owner: Krukov + Location: 64,1 + Actor355: brik + Owner: Krukov + Location: 66,1 + Actor356: brik + Owner: Krukov + Location: 65,1 + Actor357: brik + Owner: Krukov + Location: 83,1 + Actor358: brik + Owner: Krukov + Location: 84,1 + Actor359: brik + Owner: Krukov + Location: 85,1 + Actor360: brik + Owner: Krukov + Location: 80,1 + Actor361: brik + Owner: Krukov + Location: 81,1 + Actor362: brik + Owner: Krukov + Location: 82,1 + Actor363: brik + Owner: Krukov + Location: 77,1 + Actor364: brik + Owner: Krukov + Location: 78,1 + Actor365: brik + Owner: Krukov + Location: 79,1 + Actor366: brik + Owner: Krukov + Location: 74,1 + Actor367: brik + Owner: Krukov + Location: 75,1 + Actor368: brik + Owner: Krukov + Location: 76,1 + Actor369: brik + Owner: Krukov + Location: 67,1 + Actor370: brik + Owner: Krukov + Location: 68,1 + Actor371: brik + Owner: Krukov + Location: 69,1 + Actor372: brik + Owner: Krukov + Location: 70,1 + Actor373: brik + Owner: Krukov + Location: 71,1 + Actor374: brik + Owner: Krukov + Location: 72,1 + Actor375: brik + Owner: Krukov + Location: 73,1 + Actor376: fact + Owner: Krukov + Location: 86,2 + Actor379: tpwr + Owner: Krukov + Location: 65,2 + Actor380: tpwr + Owner: Krukov + Location: 65,5 + Actor381: tpwr + Owner: Krukov + Location: 68,2 + Actor382: tpwr + Owner: Krukov + Location: 68,5 + Actor383: proc + Owner: Krukov + Location: 83,10 + Actor386: dome + Owner: Krukov + Location: 79,2 + Actor387: apwr + Owner: Krukov + Location: 82,2 + Actor388: apwr + Owner: Krukov + Location: 82,5 + Actor389: barr + Owner: Krukov + Location: 81,16 + Actor390: afld + Owner: Krukov + Location: 74,7 + Actor391: fix + Owner: Krukov + Location: 78,8 + Actor392: afld + Owner: Krukov + Location: 74,10 + Actor385: munp + Owner: Krukov + Location: 73,2 + Actor377: weap + Owner: Krukov + Location: 68,15 + Actor384: stek + Owner: Krukov + Location: 69,10 + Actor378: weap + Owner: Krukov + Location: 73,14 + Actor393: sam + Owner: Krukov + Location: 86,19 + Actor394: sam + Owner: Krukov + Location: 66,19 + Actor395: sam + Owner: Krukov + Location: 67,9 + Actor396: sam + Owner: Krukov + Location: 79,6 + Actor398: tsla + Owner: Krukov + Location: 65,20 + Actor399: tsla + Owner: Krukov + Location: 65,9 + Actor400: tsla + Owner: Krukov + Location: 80,20 + Actor401: tsla + Owner: Krukov + Location: 70,20 + Actor402: tsla + Owner: Krukov + Location: 88,16 + Actor397: tsla + Owner: Krukov + Location: 88,7 + Actor403: sam + Owner: Krukov + Location: 85,7 + Actor404: silo + Owner: Krukov + Location: 85,10 + Actor405: silo + Owner: Krukov + Location: 83,10 + Actor406: ftur + Owner: Marinesko + Location: 19,56 + Actor407: ftur + Owner: Marinesko + Location: 24,56 + Actor408: brik + Owner: Marinesko + Location: 10,57 + Actor409: brik + Owner: Marinesko + Location: 11,57 + Actor410: brik + Owner: Marinesko + Location: 12,57 + Actor411: brik + Owner: Marinesko + Location: 13,57 + Actor412: brik + Owner: Marinesko + Location: 14,57 + Actor413: brik + Owner: Marinesko + Location: 15,57 + Actor414: brik + Owner: Marinesko + Location: 16,57 + Actor415: brik + Owner: Marinesko + Location: 17,57 + Actor416: brik + Owner: Marinesko + Location: 18,57 + Actor417: brik + Owner: Marinesko + Location: 19,57 + Actor418: brik + Owner: Marinesko + Location: 24,57 + Actor419: brik + Owner: Marinesko + Location: 25,57 + Actor420: brik + Owner: Marinesko + Location: 26,57 + Actor421: brik + Owner: Marinesko + Location: 27,57 + Actor422: brik + Owner: Marinesko + Location: 28,57 + Actor423: brik + Owner: Marinesko + Location: 29,57 + Actor424: brik + Owner: Marinesko + Location: 30,57 + Actor425: brik + Owner: Marinesko + Location: 31,57 + Actor426: brik + Owner: Marinesko + Location: 32,57 + Actor427: brik + Owner: Marinesko + Location: 33,57 + Actor428: brik + Owner: Marinesko + Location: 10,58 + Actor429: fact + Owner: Marinesko + Location: 13,58 + Actor430: tsla + Owner: Marinesko + Location: 17,58 + Actor431: brik + Owner: Marinesko + Location: 18,58 + Actor432: brik + Owner: Marinesko + Location: 19,58 + Actor433: brik + Owner: Marinesko + Location: 24,58 + Actor434: brik + Owner: Marinesko + Location: 25,58 + Actor435: tsla + Owner: Marinesko + Location: 26,58 + Actor436: dome + Owner: Marinesko + Location: 27,58 + Actor439: brik + Owner: Marinesko + Location: 10,59 + Actor441: brik + Owner: Marinesko + Location: 10,60 + Actor442: brik + Owner: Marinesko + Location: 11,60 + Actor444: brik + Owner: Marinesko + Location: 10,61 + Actor445: brik + Owner: Marinesko + Location: 11,61 + Actor447: sam + Owner: Marinesko + Location: 15,62 + Actor448: sam + Owner: Marinesko + Location: 27,62 + Actor451: proc + Owner: Marinesko + Location: 14,64 + Actor452: stek + Owner: Marinesko + Location: 21,64 + Actor455: brik + Owner: Marinesko + Location: 10,65 + Actor456: brik + Owner: Marinesko + Location: 11,65 + Actor457: cvat + Owner: Marinesko + Location: 26,65 + Actor459: brik + Owner: Marinesko + Location: 10,66 + Actor460: brik + Owner: Marinesko + Location: 11,66 + Actor462: brik + Owner: Marinesko + Location: 10,67 + Actor463: apwr + Owner: Marinesko + Location: 30,67 + Actor465: brik + Owner: Marinesko + Location: 10,68 + Actor467: brik + Owner: Marinesko + Location: 10,69 + Actor468: barr + Owner: Marinesko + Location: 16,69 + Actor469: barr + Owner: Marinesko + Location: 19,69 + Actor470: barr + Owner: Marinesko + Location: 24,69 + Actor471: barr + Owner: Marinesko + Location: 27,69 + Actor473: brik + Owner: Marinesko + Location: 10,70 + Actor474: apwr + Owner: Marinesko + Location: 11,70 + Actor475: apwr + Owner: Marinesko + Location: 30,70 + Actor476: brik + Owner: Marinesko + Location: 33,70 + Actor477: brik + Owner: Marinesko + Location: 10,71 + Actor478: brik + Owner: Marinesko + Location: 33,71 + Actor479: brik + Owner: Marinesko + Location: 10,72 + Actor480: brik + Owner: Marinesko + Location: 33,72 + Actor481: brik + Owner: Marinesko + Location: 10,73 + Actor482: apwr + Owner: Marinesko + Location: 11,73 + Actor483: sam + Owner: Marinesko + Location: 15,73 + Actor484: sam + Owner: Marinesko + Location: 27,73 + Actor485: apwr + Owner: Marinesko + Location: 30,73 + Actor486: brik + Owner: Marinesko + Location: 33,73 + Actor487: brik + Owner: Marinesko + Location: 10,74 + Actor488: brik + Owner: Marinesko + Location: 33,74 + Actor489: brik + Owner: Marinesko + Location: 10,75 + Actor490: tsla + Owner: Marinesko + Location: 17,75 + Actor491: brik + Owner: Marinesko + Location: 18,75 + Actor492: brik + Owner: Marinesko + Location: 19,75 + Actor493: brik + Owner: Marinesko + Location: 24,75 + Actor494: brik + Owner: Marinesko + Location: 25,75 + Actor495: tsla + Owner: Marinesko + Location: 26,75 + Actor496: brik + Owner: Marinesko + Location: 33,75 + Actor497: brik + Owner: Marinesko + Location: 10,76 + Actor498: brik + Owner: Marinesko + Location: 11,76 + Actor499: brik + Owner: Marinesko + Location: 12,76 + Actor500: brik + Owner: Marinesko + Location: 13,76 + Actor501: brik + Owner: Marinesko + Location: 14,76 + Actor502: brik + Owner: Marinesko + Location: 15,76 + Actor503: brik + Owner: Marinesko + Location: 16,76 + Actor504: brik + Owner: Marinesko + Location: 17,76 + Actor505: brik + Owner: Marinesko + Location: 18,76 + Actor506: brik + Owner: Marinesko + Location: 19,76 + Actor507: brik + Owner: Marinesko + Location: 24,76 + Actor508: brik + Owner: Marinesko + Location: 25,76 + Actor509: brik + Owner: Marinesko + Location: 26,76 + Actor510: brik + Owner: Marinesko + Location: 27,76 + Actor511: brik + Owner: Marinesko + Location: 28,76 + Actor512: brik + Owner: Marinesko + Location: 29,76 + Actor513: brik + Owner: Marinesko + Location: 30,76 + Actor514: brik + Owner: Marinesko + Location: 31,76 + Actor515: brik + Owner: Marinesko + Location: 32,76 + Actor516: brik + Owner: Marinesko + Location: 33,76 + Actor517: ftur + Owner: Marinesko + Location: 19,77 + Actor518: ftur + Owner: Marinesko + Location: 24,77 + Actor520: oilb + Owner: Krukov + Location: 107,18 + Actor519: oilb + Owner: Krukov + Location: 111,18 + Actor521: brl3 + Owner: Neutral + Location: 108,17 + Actor522: brl3 + Owner: Neutral + Location: 107,16 + Actor523: brl3 + Owner: Neutral + Location: 111,17 + Actor524: barl + Owner: Neutral + Location: 108,16 + Actor525: barl + Owner: Neutral + Location: 107,17 + Actor526: barl + Owner: Neutral + Location: 112,17 + Actor527: barl + Owner: Neutral + Location: 111,16 + Actor528: chain + Owner: Neutral + Location: 107,21 + Actor529: chain + Owner: Neutral + Location: 106,21 + Actor530: chain + Owner: Neutral + Location: 105,21 + Actor531: chain + Owner: Neutral + Location: 105,20 + Actor532: chain + Owner: Neutral + Location: 105,19 + Actor533: chain + Owner: Neutral + Location: 105,18 + Actor534: chain + Owner: Neutral + Location: 105,17 + Actor535: chain + Owner: Neutral + Location: 105,16 + Actor536: chain + Owner: Neutral + Location: 105,15 + Actor537: chain + Owner: Neutral + Location: 106,15 + Actor538: chain + Owner: Neutral + Location: 108,15 + Actor539: chain + Owner: Neutral + Location: 107,15 + Actor540: chain + Owner: Neutral + Location: 109,15 + Actor541: chain + Owner: Neutral + Location: 111,15 + Actor542: chain + Owner: Neutral + Location: 110,15 + Actor543: chain + Owner: Neutral + Location: 112,15 + Actor544: chain + Owner: Neutral + Location: 113,15 + Actor550: chain + Owner: Neutral + Location: 113,21 + Actor551: chain + Owner: Neutral + Location: 112,21 + Actor552: chain + Owner: Neutral + Location: 111,21 + Actor553: chain + Owner: Neutral + Location: 114,15 + Actor554: chain + Owner: Neutral + Location: 114,16 + Actor555: chain + Owner: Neutral + Location: 114,17 + Actor556: chain + Owner: Neutral + Location: 114,19 + Actor557: chain + Owner: Neutral + Location: 114,18 + Actor558: chain + Owner: Neutral + Location: 114,20 + Actor559: chain + Owner: Neutral + Location: 114,21 + Actor545: fenc + Owner: Neutral + Location: 104,20 + Actor546: fenc + Owner: Neutral + Location: 104,21 + Actor547: fenc + Owner: Neutral + Location: 104,22 + Actor548: fenc + Owner: Neutral + Location: 105,22 + Actor549: fenc + Owner: Neutral + Location: 106,22 + Actor560: fenc + Owner: Neutral + Location: 107,22 + Actor561: fenc + Owner: Neutral + Location: 112,14 + Actor562: fenc + Owner: Neutral + Location: 113,14 + Actor563: fenc + Owner: Neutral + Location: 114,14 + Actor564: fenc + Owner: Neutral + Location: 115,14 + Actor565: fenc + Owner: Neutral + Location: 115,15 + Actor566: fenc + Owner: Neutral + Location: 115,16 + Actor567: fenc + Owner: Neutral + Location: 115,17 + Actor568: fenc + Owner: Neutral + Location: 115,18 + Actor569: fenc + Owner: Neutral + Location: 115,19 + Actor570: fenc + Owner: Neutral + Location: 111,14 + Actor571: fenc + Owner: Neutral + Location: 110,14 + Actor572: fenc + Owner: Neutral + Location: 108,14 + Actor573: fenc + Owner: Neutral + Location: 109,14 + Actor574: fenc + Owner: Neutral + Location: 113,22 + Actor575: fenc + Owner: Neutral + Location: 115,22 + Actor576: fenc + Owner: Neutral + Location: 115,21 + Actor577: fenc + Owner: Neutral + Location: 115,20 + Actor578: fenc + Owner: Neutral + Location: 114,22 + Actor579: tc02 + Owner: Neutral + Location: 36,81 + Actor580: t16 + Owner: Neutral + Location: 38,82 + Actor581: t07 + Owner: Neutral + Location: 37,82 + Actor582: tc01 + Owner: Neutral + Location: 30,78 + Actor583: tc04 + Owner: Neutral + Location: 29,79 + Actor584: t11 + Owner: Neutral + Location: 29,81 + Actor585: t05 + Owner: Neutral + Location: 29,78 + Actor586: t01 + Owner: Neutral + Location: 32,80 + Actor587: t02 + Owner: Neutral + Location: 31,83 + Actor588: tc05 + Owner: Neutral + Location: 32,85 + Actor589: t10 + Owner: Neutral + Location: 32,82 + Actor590: t11 + Owner: Neutral + Location: 42,86 + Actor591: t13 + Owner: Neutral + Location: 39,88 + Actor592: t14 + Owner: Neutral + Location: 44,97 + Actor593: t15 + Owner: Neutral + Location: 62,99 + Actor594: tc01 + Owner: Neutral + Location: 30,97 + Actor595: t17 + Owner: Neutral + Location: 25,97 + Actor596: t01 + Owner: Neutral + Location: 27,94 + Actor597: tc05 + Owner: Neutral + Location: 12,94 + Actor598: t13 + Owner: Neutral + Location: 69,94 + Actor599: t16 + Owner: Neutral + Location: 89,104 + Actor600: t10 + Owner: Neutral + Location: 84,104 + Actor601: tc04 + Owner: Neutral + Location: 83,101 + Actor602: t16 + Owner: Neutral + Location: 86,100 + Actor603: t01 + Owner: Neutral + Location: 82,103 + Actor604: t06 + Owner: Neutral + Location: 89,100 + Actor605: t02 + Owner: Neutral + Location: 88,97 + Actor606: t11 + Owner: Neutral + Location: 89,98 + Actor607: t13 + Owner: Neutral + Location: 96,101 + Actor608: t05 + Owner: Neutral + Location: 105,98 + Actor609: t01 + Owner: Neutral + Location: 39,111 + Actor610: fenc + Owner: Marinesko + Location: 24,84 + Actor611: fenc + Owner: Marinesko + Location: 25,84 + Actor612: fenc + Owner: Marinesko + Location: 26,84 + Actor613: fenc + Owner: Marinesko + Location: 26,85 + Actor614: fenc + Owner: Marinesko + Location: 27,85 + Actor615: fenc + Owner: Marinesko + Location: 17,86 + Actor616: fenc + Owner: Marinesko + Location: 16,86 + Actor617: fenc + Owner: Marinesko + Location: 15,86 + Actor618: fenc + Owner: Marinesko + Location: 14,86 + Actor619: fenc + Owner: Marinesko + Location: 14,85 + Actor620: fenc + Owner: Marinesko + Location: 12,85 + Actor621: fenc + Owner: Marinesko + Location: 13,85 + Actor622: fenc + Owner: Marinesko + Location: 22,92 + Actor623: fenc + Owner: Marinesko + Location: 24,92 + Actor624: fenc + Owner: Marinesko + Location: 23,92 + Actor625: fenc + Owner: Marinesko + Location: 25,92 + Actor626: fenc + Owner: Marinesko + Location: 25,91 + Actor627: fenc + Owner: Marinesko + Location: 26,91 + Actor628: fenc + Owner: Marinesko + Location: 27,91 + Actor629: fenc + Owner: Marinesko + Location: 22,96 + Actor630: fenc + Owner: Marinesko + Location: 23,96 + Actor631: fenc + Owner: Marinesko + Location: 23,95 + Actor632: fenc + Owner: Marinesko + Location: 23,94 + Actor633: fenc + Owner: Marinesko + Location: 18,92 + Actor634: fenc + Owner: Marinesko + Location: 18,91 + Actor635: fenc + Owner: Marinesko + Location: 18,93 + Actor636: fenc + Owner: Marinesko + Location: 17,91 + Actor649: fenc + Owner: Marinesko + Location: 34,72 + Actor651: fenc + Owner: Marinesko + Location: 27,77 + Actor652: fenc + Owner: Marinesko + Location: 26,77 + Actor653: fenc + Owner: Marinesko + Location: 25,77 + Actor654: fenc + Owner: Marinesko + Location: 18,77 + Actor655: fenc + Owner: Marinesko + Location: 17,77 + Actor656: fenc + Owner: Marinesko + Location: 16,77 + Actor657: fenc + Owner: Marinesko + Location: 15,77 + Actor658: fenc + Owner: Marinesko + Location: 10,77 + Actor659: fenc + Owner: Marinesko + Location: 11,77 + Actor660: fenc + Owner: Marinesko + Location: 12,77 + Actor661: fenc + Owner: Marinesko + Location: 13,77 + Actor662: fenc + Owner: Marinesko + Location: 14,77 + Actor665: 3tnk.rhino + Owner: Romanov + Location: 110,74 + Facing: 396 + Actor664: 3tnk.rhino + Owner: Romanov + Location: 105,58 + Facing: 256 + Actor663: 3tnk.rhino + Owner: Romanov + Facing: 256 + Location: 105,65 + Actor666: 4tnk + Owner: Romanov + Location: 103,64 + Facing: 256 + Actor669: 3tnk.rhino + Owner: Romanov + Location: 115,51 + Facing: 0 + Actor670: 3tnk.rhino + Owner: Romanov + Location: 122,51 + Facing: 0 + Actor671: v2rl + Owner: Krukov + Location: 68,20 + Facing: 624 + Actor672: v2rl + Owner: Krukov + Facing: 384 + Location: 82,20 + Actor673: v2rl + Owner: Krukov + Facing: 384 + Location: 84,20 + Actor674: v2rl + Owner: Krukov + Location: 85,16 + Facing: 642 + Actor675: v2rl + Owner: Krukov + Facing: 384 + Location: 67,11 + Actor676: grad + Owner: Krukov + Location: 79,18 + Facing: 499 + Actor677: grad + Owner: Krukov + Location: 71,19 + Facing: 626 + Actor678: grad + Owner: Krukov + Facing: 384 + Location: 70,13 + Actor679: grad + Owner: Krukov + Location: 86,15 + Facing: 634 + Actor682: btr.ai + Owner: Marinesko + Facing: 384 + Location: 28,74 + Actor683: btr.ai + Owner: Marinesko + Location: 16,78 + Facing: 523 + Actor684: btr.ai + Owner: Marinesko + Location: 18,78 + Facing: 499 + Actor685: btr.ai + Owner: Marinesko + Location: 26,78 + Facing: 388 + Actor687: 3tnk + Owner: Marinesko + Location: 24,79 + Facing: 384 + Actor688: e1 + Owner: Marinesko + SubCell: 3 + Location: 23,69 + Facing: 563 + Actor689: e1 + Owner: Marinesko + Facing: 384 + Location: 23,69 + SubCell: 1 + Actor690: e1 + Owner: Marinesko + SubCell: 3 + Location: 26,68 + Facing: 570 + Actor691: e1 + Owner: Marinesko + SubCell: 3 + Location: 23,67 + Facing: 384 + Actor692: e1 + Owner: Marinesko + Facing: 384 + SubCell: 3 + Location: 20,66 + Actor693: e1 + Owner: Marinesko + Facing: 384 + SubCell: 3 + Location: 17,61 + Actor694: e1 + Owner: Marinesko + SubCell: 3 + Location: 25,60 + Facing: 578 + Actor695: e1 + Owner: Marinesko + Facing: 384 + Location: 25,60 + SubCell: 1 + Actor696: e1 + Owner: Marinesko + Location: 24,61 + SubCell: 3 + Facing: 467 + Actor697: e1 + Owner: Marinesko + Facing: 384 + SubCell: 3 + Location: 26,62 + Actor698: e1 + Owner: Marinesko + SubCell: 3 + Location: 26,80 + Facing: 586 + Actor699: e1 + Owner: Marinesko + Facing: 384 + Location: 26,80 + SubCell: 1 + Actor700: e1 + Owner: Marinesko + Facing: 384 + Location: 26,83 + SubCell: 3 + Actor701: e1 + Owner: Marinesko + Facing: 384 + Location: 26,83 + SubCell: 1 + Actor702: e1 + Owner: Marinesko + Facing: 384 + Location: 24,83 + SubCell: 3 + Actor703: e1 + Owner: Marinesko + Facing: 384 + Location: 25,83 + SubCell: 3 + Actor706: e1 + Owner: Marinesko + Facing: 384 + Location: 25,83 + SubCell: 4 + Actor707: e1 + Owner: Marinesko + Location: 15,85 + SubCell: 3 + Facing: 475 + Actor708: e1 + Owner: Marinesko + Facing: 384 + Location: 15,85 + SubCell: 1 + Actor713: e1 + Owner: Marinesko + Location: 16,85 + SubCell: 4 + Facing: 586 + Actor714: e1 + Owner: Marinesko + Location: 16,85 + SubCell: 5 + Facing: 729 + Actor704: e3 + Owner: Marinesko + SubCell: 3 + Location: 26,81 + Facing: 507 + Actor705: e3 + Owner: Marinesko + Facing: 384 + Location: 26,68 + SubCell: 1 + Actor709: e3 + Owner: Marinesko + Facing: 384 + SubCell: 3 + Location: 29,68 + Actor710: e3 + Owner: Marinesko + Facing: 384 + SubCell: 3 + Location: 14,72 + Actor711: e3 + Owner: Marinesko + SubCell: 3 + Location: 15,75 + Facing: 927 + Actor712: e3 + Owner: Marinesko + SubCell: 3 + Location: 29,75 + Facing: 666 + Actor715: e3 + Owner: Marinesko + Location: 17,78 + SubCell: 3 + Facing: 475 + Actor716: e3 + Owner: Marinesko + SubCell: 3 + Location: 16,84 + Facing: 523 + Actor717: e3 + Owner: Marinesko + Facing: 384 + Location: 25,82 + SubCell: 3 + Actor718: ttrp + Owner: Marinesko + Facing: 384 + SubCell: 3 + Location: 14,84 + Actor719: ttrp + Owner: Marinesko + Facing: 384 + Location: 16,75 + SubCell: 3 + Actor720: ttrp + Owner: Marinesko + Location: 27,75 + SubCell: 3 + Facing: 384 + Actor721: ttrp + Owner: Marinesko + Location: 26,73 + SubCell: 3 + Facing: 384 + Actor722: ttrp + Owner: Marinesko + Location: 23,67 + SubCell: 1 + Facing: 682 + Actor723: ttrp + Owner: Marinesko + Facing: 384 + SubCell: 3 + Location: 20,67 + Actor724: ttrp + Owner: Marinesko + Facing: 384 + Location: 26,62 + SubCell: 1 + Actor725: ttrp + Owner: Marinesko + SubCell: 3 + Location: 18,61 + Facing: 864 + Actor726: shok + Owner: Marinesko + Facing: 384 + Location: 18,62 + SubCell: 3 + Actor727: shok + Owner: Marinesko + Facing: 384 + SubCell: 3 + Location: 28,60 + Actor728: deso + Owner: Marinesko + SubCell: 3 + Location: 19,73 + Facing: 634 + Actor729: cmsr + Owner: Marinesko + SubCell: 3 + Location: 21,67 + Facing: 578 + Actor730: apoc + Owner: Romanov + Facing: 384 + Location: 118,64 + Actor731: apoc + Owner: Romanov + Location: 105,62 + Facing: 261 + Actor732: iron + Owner: Romanov + Location: 121,62 + Actor648: fenc + Owner: Marinesko + Location: 34,71 + Actor637: brik + Owner: Marinesko + Location: 34,70 + Actor638: brik + Owner: Marinesko + Location: 35,70 + Actor639: brik + Owner: Marinesko + Location: 37,70 + Actor640: brik + Owner: Marinesko + Location: 36,70 + Actor641: brik + Owner: Marinesko + Location: 38,70 + Actor642: brik + Owner: Marinesko + Location: 39,70 + Actor643: brik + Owner: Marinesko + Location: 39,69 + Actor644: brik + Owner: Marinesko + Location: 40,69 + Actor645: brik + Owner: Marinesko + Location: 40,68 + Actor646: brik + Owner: Marinesko + Location: 40,67 + Actor647: brik + Owner: Marinesko + Location: 40,66 + Actor650: brik + Owner: Marinesko + Location: 39,66 + Actor680: brik + Owner: Marinesko + Location: 39,67 + Actor681: brik + Owner: Marinesko + Location: 34,57 + Actor734: brik + Owner: Marinesko + Location: 35,57 + Actor735: brik + Owner: Marinesko + Location: 36,57 + Actor736: brik + Owner: Marinesko + Location: 37,57 + Actor737: brik + Owner: Marinesko + Location: 38,57 + Actor738: brik + Owner: Marinesko + Location: 39,57 + Actor739: brik + Owner: Marinesko + Location: 40,57 + Actor740: brik + Owner: Marinesko + Location: 40,58 + Actor741: brik + Owner: Marinesko + Location: 40,59 + Actor742: brik + Owner: Marinesko + Location: 40,60 + Actor743: brik + Owner: Marinesko + Location: 39,60 + Actor744: brik + Owner: Marinesko + Location: 39,59 + Actor745: fenc + Owner: Marinesko + Location: 41,69 + Actor746: fenc + Owner: Marinesko + Location: 41,68 + Actor747: fenc + Owner: Marinesko + Location: 41,67 + Actor748: fenc + Owner: Marinesko + Location: 41,59 + Actor749: fenc + Owner: Marinesko + Location: 41,58 + Actor750: fenc + Owner: Marinesko + Location: 41,57 + Actor751: fenc + Owner: Marinesko + Location: 41,56 + Actor752: fenc + Owner: Marinesko + Location: 40,56 + Actor753: fenc + Owner: Marinesko + Location: 39,56 + Actor754: fenc + Owner: Marinesko + Location: 38,56 + Actor755: fenc + Owner: Marinesko + Location: 37,56 + Actor756: fenc + Owner: Marinesko + Location: 36,56 + Actor757: fenc + Owner: Marinesko + Location: 35,56 + Actor758: apwr + Owner: Marinesko + Location: 33,67 + Actor759: apwr + Owner: Marinesko + Location: 30,63 + Actor760: apwr + Owner: Marinesko + Location: 33,63 + Actor761: weap + Owner: Marinesko + Location: 32,58 + Actor762: ftur + Owner: Marinesko + Location: 41,66 + Actor763: ftur + Owner: Marinesko + Location: 41,60 + Actor764: tsla + Owner: Marinesko + Location: 39,68 + Actor765: tsla + Owner: Marinesko + Location: 39,58 + Actor766: sam + Owner: Marinesko + Location: 36,69 + Actor767: sam + Owner: Marinesko + Location: 36,58 + Actor768: oilr + Owner: Neutral + Location: 67,69 + Actor769: oilb + Owner: Neutral + Location: 76,64 + Actor770: oilb + Owner: Neutral + Location: 77,73 + Actor771: brl3 + Owner: Neutral + Location: 76,72 + Actor772: brl3 + Owner: Neutral + Location: 78,71 + Actor773: brl3 + Owner: Neutral + Location: 77,66 + Actor774: brl3 + Owner: Neutral + Location: 70,68 + Actor775: brl3 + Owner: Neutral + Location: 72,71 + Actor776: barl + Owner: Neutral + Location: 70,70 + Actor777: barl + Owner: Neutral + Location: 76,66 + Actor778: barl + Owner: Neutral + Location: 75,65 + Actor779: barl + Owner: Neutral + Location: 78,72 + Actor780: barl + Owner: Neutral + Location: 78,75 + Actor781: barl + Owner: Neutral + Location: 66,71 + Actor782: brl3 + Owner: Neutral + Location: 67,72 + Actor783: chain + Owner: Neutral + Location: 66,66 + Actor784: chain + Owner: Neutral + Location: 68,66 + Actor785: chain + Owner: Neutral + Location: 69,66 + Actor786: chain + Owner: Neutral + Location: 67,66 + Actor787: chain + Owner: Neutral + Location: 65,66 + Actor788: chain + Owner: Neutral + Location: 65,68 + Actor789: chain + Owner: Neutral + Location: 65,67 + Actor790: chain + Owner: Neutral + Location: 65,69 + Actor791: chain + Owner: Neutral + Location: 65,70 + Actor792: chain + Owner: Neutral + Location: 65,71 + Actor793: chain + Owner: Neutral + Location: 65,72 + Actor794: chain + Owner: Neutral + Location: 65,73 + Actor795: chain + Owner: Neutral + Location: 65,74 + Actor796: chain + Owner: Neutral + Location: 65,75 + Actor797: chain + Owner: Neutral + Location: 66,75 + Actor798: chain + Owner: Neutral + Location: 67,75 + Actor799: chain + Owner: Neutral + Location: 68,75 + Actor800: chain + Owner: Neutral + Location: 74,76 + Actor801: chain + Owner: Neutral + Location: 75,76 + Actor802: chain + Owner: Neutral + Location: 73,76 + Actor803: chain + Owner: Neutral + Location: 76,76 + Actor804: chain + Owner: Neutral + Location: 77,76 + Actor805: chain + Owner: Neutral + Location: 78,76 + Actor806: chain + Owner: Neutral + Location: 79,76 + Actor807: chain + Owner: Neutral + Location: 80,76 + Actor808: chain + Owner: Neutral + Location: 80,75 + Actor809: chain + Owner: Neutral + Location: 80,74 + Actor810: chain + Owner: Neutral + Location: 80,72 + Actor811: chain + Owner: Neutral + Location: 80,73 + Actor812: chain + Owner: Neutral + Location: 80,71 + Actor813: chain + Owner: Neutral + Location: 80,70 + Actor814: chain + Owner: Neutral + Location: 80,69 + Actor815: chain + Owner: Neutral + Location: 80,68 + Actor816: chain + Owner: Neutral + Location: 74,63 + Actor817: chain + Owner: Neutral + Location: 76,63 + Actor818: chain + Owner: Neutral + Location: 75,63 + Actor819: chain + Owner: Neutral + Location: 77,63 + Actor820: chain + Owner: Neutral + Location: 79,63 + Actor821: chain + Owner: Neutral + Location: 78,63 + Actor822: chain + Owner: Neutral + Location: 80,63 + Actor823: chain + Owner: Neutral + Location: 80,64 + Actor824: chain + Owner: Neutral + Location: 80,65 + Actor825: chain + Owner: Neutral + Location: 80,66 + Actor826: chain + Owner: Neutral + Location: 80,67 + Actor827: chain + Owner: Neutral + Location: 73,63 + Actor828: tc01 + Owner: Neutral + Location: 81,69 + Actor829: tc04 + Owner: Neutral + Location: 81,71 + Actor830: t16 + Owner: Neutral + Location: 64,68 + Actor831: t10 + Owner: Neutral + Location: 81,65 + Actor832: t13 + Owner: Neutral + Location: 63,73 + Actor833: tc02 + Owner: Neutral + Location: 68,62 + Actor834: t14 + Owner: Neutral + Location: 79,61 + Actor835: tc05 + Owner: Neutral + Location: 69,80 + Actor836: tc05 + Owner: Neutral + Location: 89,124 + Actor837: t07 + Owner: Neutral + Location: 87,125 + Actor838: tc01 + Owner: Neutral + Location: 88,126 + Actor839: tc04 + Owner: Neutral + Location: 93,125 + Actor840: tc03 + Owner: Neutral + Location: 96,125 + Actor841: t10 + Owner: Neutral + Location: 98,123 + Actor842: t12 + Owner: Neutral + Location: 102,121 + Actor843: t15 + Owner: Neutral + Location: 95,127 + Actor844: t15 + Owner: Neutral + Location: 90,126 + Actor845: t07 + Owner: Neutral + Location: 99,126 + Actor846: t08 + Owner: Neutral + Location: 99,125 + Actor847: t05 + Owner: Neutral + Location: 101,124 + Actor848: t01 + Owner: Neutral + Location: 102,123 + Actor849: t06 + Owner: Neutral + Location: 100,123 + Actor850: t14 + Owner: Neutral + Location: 99,125 + Actor851: tc05 + Owner: Neutral + Location: 106,126 + Actor852: t16 + Owner: Neutral + Location: 106,124 + Actor853: t17 + Owner: Neutral + Location: 109,127 + Actor854: t01 + Owner: Neutral + Location: 104,127 + Actor855: t02 + Owner: Neutral + Location: 105,119 + Actor857: t12 + Owner: Neutral + Location: 83,123 + Actor856: t16 + Owner: Neutral + Location: 83,126 + Actor858: t13 + Owner: Neutral + Location: 86,121 + Actor860: split2 + Owner: Neutral + Location: 92,115 + Actor861: split2 + Owner: Neutral + Location: 86,116 + Actor862: split2 + Owner: Neutral + Location: 84,111 + Actor859: split2 + Owner: Neutral + Location: 33,107 + Actor863: split2 + Owner: Neutral + Location: 35,102 + Actor864: split2 + Owner: Neutral + Location: 79,82 + Actor865: split2 + Owner: Neutral + Location: 84,79 + Actor866: split2 + Owner: Neutral + Location: 4,76 + Actor867: split2 + Owner: Neutral + Location: 6,70 + Actor868: t10 + Owner: Neutral + Location: 60,84 + Actor869: t11 + Owner: Neutral + Location: 52,82 + Actor870: t16 + Owner: Neutral + Location: 60,83 + Actor871: t05 + Owner: Neutral + Location: 62,86 + Actor872: t01 + Owner: Neutral + Location: 53,87 + Actor875: t06 + Owner: Neutral + Location: 69,85 + Actor876: t14 + Owner: Neutral + Location: 46,121 + Actor877: t16 + Owner: Neutral + Location: 55,119 + Actor878: ice01 + Owner: Neutral + Location: 73,45 + Actor879: ice02 + Owner: Neutral + Location: 77,42 + Actor880: ice04 + Owner: Neutral + Location: 77,45 + Actor881: ice05 + Owner: Neutral + Location: 75,44 + Actor882: t15 + Owner: Neutral + Location: 69,41 + Actor883: t01 + Owner: Neutral + Location: 84,43 + Actor884: tc04 + Owner: Neutral + Location: 79,48 + Actor885: t15 + Owner: Neutral + Location: 79,47 + Actor886: tc02 + Owner: Neutral + Location: 82,46 + Actor887: t12 + Owner: Neutral + Location: 82,48 + Actor888: t05 + Owner: Neutral + Location: 84,45 + Actor889: tc05 + Owner: Neutral + Location: 83,40 + Actor890: t12 + Owner: Neutral + Location: 85,42 + Actor891: tc03 + Owner: Neutral + Location: 86,40 + Actor892: t17 + Owner: Neutral + Location: 86,38 + Actor893: t13 + Owner: Neutral + Location: 88,42 + Actor894: t11 + Owner: Neutral + Location: 94,40 + Actor895: tc05 + Owner: Neutral + Location: 125,95 + Actor896: t16 + Owner: Neutral + Location: 123,94 + Actor897: t02 + Owner: Neutral + Location: 121,91 + Actor898: t01 + Owner: Neutral + Location: 118,93 + Actor899: t14 + Owner: Neutral + Location: 115,92 + Actor900: oilb + Owner: Romanov + Location: 116,112 + Actor901: oilb + Owner: Romanov + Location: 120,114 + Actor902: brl3 + Owner: Romanov + Location: 117,115 + Actor903: barl + Owner: Romanov + Location: 116,114 + Actor904: barl + Owner: Romanov + Location: 121,113 + Actor905: brl3 + Owner: Romanov + Location: 121,112 + Actor906: macs + Owner: Romanov + Location: 120,108 + Actor907: chain + Owner: Romanov + Location: 121,107 + Actor908: chain + Owner: Romanov + Location: 120,107 + Actor909: chain + Owner: Romanov + Location: 119,107 + Actor910: chain + Owner: Romanov + Location: 118,107 + Actor911: chain + Owner: Romanov + Location: 122,107 + Actor912: chain + Owner: Romanov + Location: 123,107 + Actor913: chain + Owner: Romanov + Location: 123,108 + Actor914: chain + Owner: Romanov + Location: 123,109 + Actor915: chain + Owner: Romanov + Location: 123,110 + Actor916: chain + Owner: Romanov + Location: 123,111 + Actor917: chain + Owner: Romanov + Location: 123,112 + Actor918: chain + Owner: Romanov + Location: 123,113 + Actor919: chain + Owner: Romanov + Location: 123,114 + Actor920: chain + Owner: Romanov + Location: 123,115 + Actor921: chain + Owner: Romanov + Location: 123,116 + Actor922: chain + Owner: Romanov + Location: 123,117 + Actor923: chain + Owner: Romanov + Location: 122,117 + Actor924: chain + Owner: Romanov + Location: 120,117 + Actor925: chain + Owner: Romanov + Location: 121,117 + Actor926: chain + Owner: Romanov + Location: 119,117 + Actor927: chain + Owner: Romanov + Location: 118,117 + Actor928: chain + Owner: Romanov + Location: 117,117 + Actor929: chain + Owner: Romanov + Location: 116,117 + Actor930: chain + Owner: Romanov + Location: 115,117 + Actor931: chain + Owner: Romanov + Location: 114,117 + Actor932: chain + Owner: Romanov + Location: 114,116 + Actor933: chain + Owner: Romanov + Location: 114,115 + Actor934: chain + Owner: Romanov + Location: 114,114 + Actor935: chain + Owner: Romanov + Location: 114,108 + Actor936: chain + Owner: Romanov + Location: 114,107 + Actor937: chain + Owner: Romanov + Location: 116,107 + Actor938: chain + Owner: Romanov + Location: 117,107 + Actor939: chain + Owner: Romanov + Location: 115,107 + Actor940: chain + Owner: Romanov + Location: 114,109 + Actor941: e1 + Owner: Romanov + Facing: 384 + Location: 113,108 + SubCell: 3 + Actor942: e1 + Owner: Romanov + SubCell: 3 + Location: 113,114 + Facing: 134 + Actor943: e1 + Owner: Romanov + Facing: 384 + SubCell: 3 + Location: 117,109 + Actor944: 3tnk.rhino + Owner: Romanov + Location: 113,111 + Facing: 253 + Actor946: e3 + Owner: Romanov + Facing: 384 + Location: 115,108 + SubCell: 3 + Actor945: e4 + Owner: Romanov + SubCell: 3 + Location: 114,112 + Facing: 237 + Actor948: e1 + Owner: Romanov + Location: 113,110 + SubCell: 1 + Facing: 126 + Actor947: fenc + Owner: Marinesko + Location: 25,118 + Actor949: fenc + Owner: Marinesko + Location: 25,117 + Actor950: fenc + Owner: Marinesko + Location: 25,116 + Actor951: fenc + Owner: Marinesko + Location: 25,115 + Actor952: fenc + Owner: Marinesko + Location: 26,115 + Actor953: fenc + Owner: Marinesko + Location: 26,114 + Actor954: fenc + Owner: Marinesko + Location: 27,118 + Actor955: fenc + Owner: Marinesko + Location: 27,120 + Actor956: fenc + Owner: Marinesko + Location: 27,119 + Actor957: fenc + Owner: Marinesko + Location: 27,121 + Actor958: fenc + Owner: Marinesko + Location: 28,114 + Actor959: fenc + Owner: Marinesko + Location: 28,113 + Actor960: fenc + Owner: Marinesko + Location: 28,112 + Actor961: fenc + Owner: Marinesko + Location: 28,111 + Actor962: fenc + Owner: Marinesko + Location: 27,111 + Actor963: fenc + Owner: Marinesko + Location: 27,110 + Actor964: fenc + Owner: Marinesko + Location: 27,109 + Actor965: hosp + Owner: Marinesko + Location: 17,113 + Actor966: v02 + Faction: soviet + Location: 68,53 + Owner: Neutral + Actor967: v03 + Faction: soviet + Location: 67,59 + Owner: Neutral + Actor968: v05 + Faction: soviet + Location: 61,54 + Owner: Neutral + Actor969: v08 + Faction: soviet + Location: 77,54 + Owner: Neutral + Actor970: v07 + Faction: soviet + Location: 68,49 + Owner: Neutral + Actor971: v11 + Faction: soviet + Location: 64,51 + Owner: Neutral + Actor972: v09 + Faction: soviet + Location: 61,59 + Owner: Neutral + Actor973: v04 + Faction: soviet + Location: 59,46 + Owner: Neutral + Actor974: oilb + Owner: Marinesko + Location: 22,116 + Actor975: oilb + Owner: Marinesko + Location: 21,110 + Actor976: e1 + Owner: Marinesko + SubCell: 3 + Location: 26,111 + Facing: 768 + Actor979: e1 + Owner: Marinesko + Location: 26,111 + SubCell: 4 + Facing: 768 + Actor984: e1 + Owner: Marinesko + SubCell: 4 + Facing: 768 + Location: 25,114 + Actor988: e1 + Owner: Marinesko + SubCell: 2 + Facing: 768 + Location: 25,120 + Actor989: e1 + Owner: Marinesko + SubCell: 4 + Location: 25,120 + Facing: 768 + Actor991: e1 + Owner: Marinesko + SubCell: 3 + Facing: 768 + Location: 26,118 + Actor992: e1 + Owner: Marinesko + SubCell: 1 + Facing: 768 + Location: 26,118 + Actor994: e1 + Owner: Marinesko + SubCell: 4 + Facing: 768 + Location: 26,118 + Actor977: e1 + Owner: Marinesko + SubCell: 3 + Location: 18,116 + Facing: 768 + Actor978: e1 + Owner: Marinesko + SubCell: 4 + Location: 18,116 + Facing: 555 + Actor980: e3 + Owner: Marinesko + Facing: 384 + SubCell: 3 + Location: 24,113 + Actor981: e3 + Owner: Marinesko + SubCell: 3 + Location: 20,115 + Facing: 594 + Actor982: e3 + Owner: Marinesko + SubCell: 3 + Location: 24,120 + Facing: 832 + Actor983: ttrp + Owner: Marinesko + SubCell: 3 + Location: 22,119 + Facing: 697 + Actor985: ttrp + Owner: Marinesko + SubCell: 3 + Location: 25,112 + Facing: 578 + Actor986: btr.ai + Owner: Marinesko + Location: 24,110 + Facing: 658 + Actor987: btr.ai + Owner: Marinesko + Location: 19,119 + Facing: 761 + Actor990: fenc + Owner: Marinesko + Location: 13,118 + Actor993: fenc + Owner: Marinesko + Location: 13,117 + Actor995: fenc + Owner: Marinesko + Location: 13,116 + Actor996: fenc + Owner: Marinesko + Location: 13,115 + Actor997: fenc + Owner: Marinesko + Location: 13,114 + Actor998: fenc + Owner: Marinesko + Location: 13,113 + Actor999: fenc + Owner: Marinesko + Location: 13,112 + Actor1000: fenc + Owner: Marinesko + Location: 14,118 + Actor1001: fenc + Owner: Marinesko + Location: 14,119 + Actor1002: fenc + Owner: Marinesko + Location: 17,112 + Actor1003: fenc + Owner: Marinesko + Location: 16,112 + Actor1004: fenc + Owner: Marinesko + Location: 16,113 + Actor1005: fenc + Owner: Marinesko + Location: 16,114 + Actor1006: fenc + Owner: Marinesko + Location: 16,111 + Actor1007: fenc + Owner: Marinesko + Location: 13,111 + Actor1008: fenc + Owner: Marinesko + Location: 18,123 + Actor1009: fenc + Owner: Marinesko + Location: 19,123 + Actor1010: fenc + Owner: Marinesko + Location: 20,123 + Actor1011: fenc + Owner: Marinesko + Location: 20,122 + Actor1012: fenc + Owner: Marinesko + Location: 17,123 + Actor1013: fenc + Owner: Marinesko + Location: 17,122 + Actor1014: fenc + Owner: Marinesko + Location: 21,122 + Actor1015: fenc + Owner: Marinesko + Location: 22,106 + Actor1016: fenc + Owner: Marinesko + Location: 23,106 + Actor1017: fenc + Owner: Marinesko + Location: 24,106 + Actor1018: fenc + Owner: Marinesko + Location: 24,107 + Actor1019: fenc + Owner: Marinesko + Location: 24,108 + Actor1020: minv + Owner: Marinesko + Location: 29,121 + Actor1021: minv + Owner: Marinesko + Location: 30,118 + Actor1025: minv + Owner: Marinesko + Location: 30,124 + Actor1026: 3tnk.rhino + Owner: Romanov + Facing: 253 + Location: 112,114 + Actor1027: split2 + Owner: Neutral + Location: 94,6 + Actor1028: split2 + Owner: Neutral + Location: 98,12 + Actor1029: split2 + Owner: Neutral + Location: 100,4 + Actor1030: split2 + Owner: Neutral + Location: 114,41 + Actor1031: split2 + Owner: Neutral + Location: 119,42 + Actor1032: split2 + Owner: Neutral + Location: 125,45 + Actor1033: silo + Owner: Romanov + Location: 117,57 + Actor1034: proc + Owner: Romanov + Location: 117,57 + Actor1035: silo + Owner: Romanov + Location: 119,57 + Actor1036: weap + Owner: Romanov + Location: 115,66 + Actor1037: split2 + Owner: Neutral + Location: 35,39 + Actor1038: split2 + Owner: Neutral + Location: 42,37 + Actor1039: split2 + Owner: Neutral + Location: 45,42 + Actor1040: wood + Owner: Neutral + Location: 56,49 + Actor1041: wood + Owner: Neutral + Location: 56,50 + Actor1042: wood + Owner: Neutral + Location: 56,51 + Actor1043: wood + Owner: Neutral + Location: 56,53 + Actor1044: wood + Owner: Neutral + Location: 56,52 + Actor1045: wood + Owner: Neutral + Location: 56,54 + Actor1046: wood + Owner: Neutral + Location: 56,48 + Actor1047: wood + Owner: Neutral + Location: 58,46 + Actor1048: wood + Owner: Neutral + Location: 56,46 + Actor1049: wood + Owner: Neutral + Location: 57,46 + Actor1050: wood + Owner: Neutral + Location: 56,47 + Actor1051: wood + Owner: Neutral + Location: 57,54 + Actor1052: wood + Owner: Neutral + Location: 72,53 + Actor1053: wood + Owner: Neutral + Location: 72,54 + Actor1054: wood + Owner: Neutral + Location: 73,54 + Actor1055: wood + Owner: Neutral + Location: 74,54 + Actor1056: wood + Owner: Neutral + Location: 75,54 + Actor1057: wood + Owner: Neutral + Location: 80,54 + Actor1058: wood + Owner: Neutral + Location: 82,54 + Actor1059: wood + Owner: Neutral + Location: 81,54 + Actor1060: wood + Owner: Neutral + Location: 82,55 + Actor1061: wood + Owner: Neutral + Location: 82,56 + Actor1062: wood + Owner: Neutral + Location: 82,57 + Actor1063: wood + Owner: Neutral + Location: 81,57 + Actor1064: wood + Owner: Neutral + Location: 59,58 + Actor1065: wood + Owner: Neutral + Location: 59,59 + Actor1066: wood + Owner: Neutral + Location: 59,60 + Actor1067: wood + Owner: Neutral + Location: 60,60 + Actor1068: wood + Owner: Neutral + Location: 61,60 + Actor1069: wood + Owner: Neutral + Location: 62,60 + Actor1070: wood + Owner: Neutral + Location: 58,58 + Actor1071: v10 + Owner: Neutral + Location: 57,51 + Actor1072: v06 + Owner: Neutral + Location: 64,43 + Actor1073: v18 + Owner: Neutral + Location: 67,43 + Actor1074: v17 + Owner: Neutral + Location: 66,43 + Actor1075: v15 + Owner: Neutral + Location: 59,50 + Actor1076: v16 + Owner: Neutral + Location: 60,50 + Actor1077: t07 + Owner: Neutral + Location: 57,48 + Actor1078: t12 + Owner: Neutral + Location: 71,56 + Actor1079: t05 + Owner: Neutral + Location: 60,42 + Actor1080: t01 + Owner: Neutral + Location: 54,50 + Actor1081: tc04 + Owner: Neutral + Location: 50,59 + Actor1082: t08 + Owner: Neutral + Location: 52,58 + Actor1083: t01 + Owner: Neutral + Location: 87,54 + Actor1084: t02 + Owner: Neutral + Location: 90,66 + Actor1085: t07 + Owner: Neutral + Location: 95,86 + Actor1086: t01 + Owner: Neutral + Location: 99,82 + Actor1087: t03 + Owner: Neutral + Location: 110,89 + Actor1088: t13 + Owner: Neutral + Location: 123,80 + Actor1089: t10 + Owner: Neutral + Location: 97,71 + Actor1091: t10 + Owner: Neutral + Location: 99,48 + Actor1090: t05 + Owner: Neutral + Location: 102,47 + Actor1092: t02 + Owner: Neutral + Location: 116,31 + Actor1093: t08 + Owner: Neutral + Location: 118,34 + Actor1094: t10 + Owner: Neutral + Location: 76,35 + Actor1095: t12 + Owner: Neutral + Location: 59,31 + Actor1096: t01 + Owner: Neutral + Location: 69,31 + Actor1097: tc04 + Owner: Neutral + Location: 92,29 + Actor1098: t13 + Owner: Neutral + Location: 95,28 + Actor1099: t08 + Owner: Neutral + Location: 96,30 + Actor1100: t01 + Owner: Neutral + Location: 97,27 + Actor1101: t03 + Owner: Neutral + Location: 93,27 + Actor1102: tc01 + Owner: Neutral + Location: 95,24 + Actor1103: t14 + Owner: Neutral + Location: 97,21 + Actor1104: tc02 + Owner: Neutral + Location: 117,9 + Actor1105: t06 + Owner: Neutral + Location: 118,13 + Actor1106: t13 + Owner: Neutral + Location: 121,12 + Actor1107: t05 + Owner: Neutral + Location: 123,15 + Actor1108: t01 + Owner: Neutral + Location: 122,14 + Actor1109: t14 + Owner: Neutral + Location: 120,20 + Actor1110: tc05 + Owner: Neutral + Location: 121,26 + Actor1111: t17 + Owner: Neutral + Location: 124,28 + Actor1113: oilb + Owner: Krukov + Location: 44,22 + Actor1114: fcom + Owner: Krukov + Location: 39,26 + Actor1115: chain + Owner: Krukov + Location: 36,22 + Actor1116: chain + Owner: Krukov + Location: 36,23 + Actor1117: chain + Owner: Krukov + Location: 36,21 + Actor1118: chain + Owner: Krukov + Location: 36,20 + Actor1119: chain + Owner: Krukov + Location: 37,20 + Actor1120: chain + Owner: Krukov + Location: 38,20 + Actor1121: chain + Owner: Krukov + Location: 39,20 + Actor1122: chain + Owner: Krukov + Location: 40,20 + Actor1123: chain + Owner: Krukov + Location: 42,20 + Actor1124: chain + Owner: Krukov + Location: 41,20 + Actor1125: chain + Owner: Krukov + Location: 43,20 + Actor1126: chain + Owner: Krukov + Location: 44,20 + Actor1127: chain + Owner: Krukov + Location: 46,20 + Actor1128: chain + Owner: Krukov + Location: 45,20 + Actor1129: chain + Owner: Krukov + Location: 47,20 + Actor1130: chain + Owner: Krukov + Location: 47,21 + Actor1131: chain + Owner: Krukov + Location: 47,22 + Actor1132: chain + Owner: Krukov + Location: 47,23 + Actor1133: chain + Owner: Krukov + Location: 47,24 + Actor1134: chain + Owner: Krukov + Location: 47,25 + Actor1135: chain + Owner: Krukov + Location: 47,26 + Actor1136: chain + Owner: Krukov + Location: 46,26 + Actor1137: chain + Owner: Krukov + Location: 45,26 + Actor1138: chain + Owner: Krukov + Location: 36,26 + Actor1139: chain + Owner: Krukov + Location: 36,25 + Actor1140: chain + Owner: Krukov + Location: 36,24 + Actor1141: chain + Owner: Krukov + Location: 37,26 + Actor1142: chain + Owner: Krukov + Location: 37,27 + Actor1143: chain + Owner: Krukov + Location: 37,28 + Actor1144: chain + Owner: Krukov + Location: 37,29 + Actor1145: chain + Owner: Krukov + Location: 37,30 + Actor1146: chain + Owner: Krukov + Location: 38,30 + Actor1147: barb + Owner: Krukov + Location: 37,19 + Actor1148: barb + Owner: Krukov + Location: 36,19 + Actor1149: barb + Owner: Krukov + Location: 35,19 + Actor1150: barb + Owner: Krukov + Location: 35,20 + Actor1151: barb + Owner: Krukov + Location: 35,21 + Actor1152: barb + Owner: Krukov + Location: 35,22 + Actor1153: barb + Owner: Krukov + Location: 47,27 + Actor1154: barb + Owner: Krukov + Location: 48,27 + Actor1155: barb + Owner: Krukov + Location: 48,26 + Actor1156: barb + Owner: Krukov + Location: 46,27 + Actor1157: barb + Owner: Krukov + Location: 48,25 + Actor1158: brl3 + Owner: Krukov + Location: 46,25 + Actor1159: brl3 + Owner: Krukov + Location: 46,21 + Actor1160: brl3 + Owner: Krukov + Location: 41,23 + Actor1161: brl3 + Owner: Krukov + Location: 43,23 + Actor1162: brl3 + Owner: Krukov + Location: 40,24 + Actor1163: barl + Owner: Krukov + Location: 40,23 + Actor1164: barl + Owner: Krukov + Location: 43,22 + Actor1165: barl + Owner: Krukov + Location: 45,21 + Actor1166: barl + Owner: Krukov + Location: 46,24 + Actor1167: barl + Owner: Krukov + Location: 45,25 + Actor1169: barl + Owner: Krukov + Location: 37,22 + Actor1170: barl + Owner: Krukov + Location: 37,25 + Actor1171: brl3 + Owner: Krukov + Location: 37,23 + Actor1172: barl + Owner: Krukov + Location: 37,24 + Actor1112: oilb + Owner: Krukov + Location: 38,22 + Actor1168: brl3 + Owner: Krukov + Location: 41,21 + Actor1173: t03 + Owner: Neutral + Faction: soviet + Location: 47,31 + Actor1174: tc01 + Owner: Neutral + Faction: soviet + Location: 38,18 + Actor1175: tc05 + Owner: Neutral + Faction: soviet + Location: 33,23 + Actor1176: t05 + Owner: Neutral + Faction: soviet + Location: 48,23 + Actor1177: t01 + Owner: Neutral + Faction: soviet + Location: 32,28 + Actor1178: t14 + Owner: Neutral + Faction: soviet + Location: 22,42 + Actor1179: tc02 + Owner: Neutral + Faction: soviet + Location: 31,46 + Actor1180: t07 + Owner: Neutral + Faction: soviet + Location: 8,50 + Actor1181: v2rl + Owner: Krukov + Facing: 384 + Location: 113,20 + Actor1182: v2rl + Owner: Krukov + Facing: 384 + Location: 116,24 + Actor1183: grad + Owner: Krukov + Facing: 384 + Location: 117,22 + Actor1184: grad + Owner: Krukov + Facing: 384 + Location: 119,24 + Actor1185: grad + Owner: Krukov + Location: 34,26 + Facing: 602 + Actor1186: grad + Owner: Krukov + Location: 32,23 + Facing: 626 + Actor1187: grad + Owner: Krukov + Location: 43,19 + Facing: 507 + Actor1188: v2rl + Owner: Krukov + Location: 43,25 + Facing: 499 + Actor1189: v3rl + Owner: Krukov + Facing: 384 + Location: 71,8 + Actor1190: v3rl + Owner: Krukov + Facing: 384 + Location: 113,12 + Actor1191: v3rl + Owner: Krukov + Facing: 384 + Location: 120,17 + Actor1192: v3rl + Owner: Krukov + Location: 41,16 + Facing: 531 + Actor1198: e1 + Owner: Romanov + Location: 109,74 + SubCell: 3 + Facing: 618 + Actor1203: e1 + Owner: Romanov + SubCell: 3 + Location: 106,56 + Facing: 285 + Actor1205: e1 + Owner: Romanov + SubCell: 3 + Location: 116,51 + Facing: 0 + Actor1206: e1 + Owner: Romanov + SubCell: 3 + Location: 114,52 + Facing: 0 + Actor1204: e1 + Owner: Romanov + SubCell: 3 + Facing: 285 + Location: 104,57 + Actor1202: e1 + Owner: Romanov + SubCell: 3 + Facing: 285 + Location: 105,64 + Actor1201: e1 + Owner: Romanov + SubCell: 3 + Facing: 285 + Location: 105,66 + Actor1200: e1 + Owner: Romanov + SubCell: 3 + Facing: 618 + Location: 108,74 + Actor1197: e1 + Owner: Romanov + SubCell: 3 + Facing: 618 + Location: 109,73 + Actor1199: e1 + Owner: Romanov + SubCell: 3 + Facing: 618 + Location: 111,75 + Actor1207: e3 + Owner: Romanov + Facing: 384 + SubCell: 1 + Location: 109,74 + Actor1208: e3 + Owner: Romanov + Facing: 384 + Location: 106,58 + SubCell: 3 + Actor1209: e3 + Owner: Romanov + Facing: 384 + SubCell: 3 + Location: 124,56 + Actor1210: e3 + Owner: Romanov + Facing: 384 + SubCell: 3 + Location: 125,62 + Actor1211: e1 + Owner: Romanov + Facing: 384 + SubCell: 3 + Location: 124,67 + Actor1212: e1 + Owner: Romanov + Facing: 384 + SubCell: 3 + Location: 127,63 + Actor1213: e1 + Owner: Romanov + Facing: 384 + SubCell: 3 + Location: 108,68 + Actor1214: e1 + Owner: Krukov + SubCell: 3 + Location: 72,19 + Facing: 650 + Actor1215: e1 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 69,19 + Actor1216: e1 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 66,15 + Actor1217: e1 + Owner: Krukov + Facing: 384 + Location: 66,15 + SubCell: 1 + Actor1218: e1 + Owner: Krukov + Location: 67,14 + SubCell: 3 + Facing: 570 + Actor1219: e1 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 68,12 + Actor1220: e1 + Owner: Krukov + Facing: 384 + Location: 66,9 + SubCell: 3 + Actor1221: e1 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 87,15 + Actor1222: e1 + Owner: Krukov + SubCell: 3 + Location: 86,17 + Facing: 578 + Actor1223: e1 + Owner: Krukov + Facing: 384 + Location: 86,17 + SubCell: 1 + Actor1224: e1 + Owner: Krukov + SubCell: 3 + Location: 83,19 + Facing: 483 + Actor1225: e1 + Owner: Krukov + Facing: 384 + Location: 88,19 + SubCell: 3 + Actor1226: e3 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 79,17 + Actor1227: e3 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 76,13 + Actor1228: e3 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 71,13 + Actor1229: e3 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 87,7 + Actor1230: e3 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 80,8 + Actor1231: e3 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 72,7 + Actor1232: e3 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 69,9 + Actor1233: e3 + Owner: Krukov + Facing: 384 + Location: 82,19 + SubCell: 3 + Actor1234: e3 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 44,24 + Actor1235: e3 + Owner: Krukov + SubCell: 3 + Location: 48,22 + Facing: 697 + Actor1236: e3 + Owner: Krukov + SubCell: 3 + Location: 46,28 + Facing: 515 + Actor1237: e3 + Owner: Krukov + SubCell: 3 + Location: 36,28 + Facing: 586 + Actor1238: e1 + Owner: Krukov + SubCell: 3 + Facing: 384 + Location: 40,30 + Actor1239: e1 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 45,29 + Actor1240: e1 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 34,28 + Actor1241: e1 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 115,23 + Actor1242: e1 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 118,26 + Actor1243: e1 + Owner: Krukov + Facing: 384 + Location: 118,26 + SubCell: 1 + Actor1244: e1 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 119,22 + Actor1245: e1 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 122,23 + Actor1246: e1 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 118,18 + Actor1247: e1 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 111,13 + Actor1249: btr.ai + Owner: Marinesko + Location: 42,68 + Facing: 777 + Actor1250: btr.ai + Owner: Marinesko + Location: 42,58 + Facing: 777 + Actor1251: t10 + Owner: Neutral + Location: 3,38 + Actor1252: t16 + Owner: Neutral + Location: 4,28 + Actor1253: t12 + Owner: Neutral + Location: 6,31 + Actor1254: tc04 + Owner: Neutral + Location: 2,5 + Actor1255: t06 + Owner: Neutral + Location: 3,2 + Actor1256: t05 + Owner: Neutral + Location: 7,2 + Actor1257: t03 + Owner: Neutral + Location: 10,1 + Actor1258: t03 + Owner: Neutral + Location: 11,10 + Actor1259: tc02 + Owner: Neutral + Location: 14,4 + Actor1260: t14 + Owner: Neutral + Location: 12,6 + Actor1261: t13 + Owner: Neutral + Location: 21,3 + Actor1262: t15 + Owner: Neutral + Location: 15,9 + Actor1263: t17 + Owner: Neutral + Location: 30,8 + Actor1264: tc05 + Owner: Neutral + Location: 22,11 + Actor1265: tc01 + Owner: Neutral + Location: 20,20 + Actor1266: t10 + Owner: Neutral + Location: 9,19 + Actor1267: t05 + Owner: Neutral + Location: 23,9 + Actor1268: t01 + Owner: Neutral + Location: 27,13 + Actor1269: t02 + Owner: Neutral + Location: 12,15 + Actor1270: t06 + Owner: Neutral + Location: 3,10 + Actor1271: t06 + Owner: Neutral + Location: 18,1 + Actor1272: t02 + Owner: Neutral + Location: 31,3 + Actor1273: t02 + Owner: Neutral + Location: 18,22 + Actor1274: t11 + Owner: Neutral + Location: 4,18 + Actor1275: tc03 + Owner: Neutral + Location: 20,5 + Actor1276: t02 + Owner: Neutral + Location: 22,29 + Actor1277: t13 + Owner: Neutral + Location: 59,25 + Actor1278: t05 + Owner: Neutral + Location: 40,8 + Actor1279: t01 + Owner: Neutral + Location: 49,13 + Actor1280: t02 + Owner: Neutral + Location: 113,4 + Actor1281: t10 + Owner: Neutral + Location: 108,7 + Actor1282: tc03 + Owner: Neutral + Location: 126,18 + Actor1283: t16 + Owner: Neutral + Location: 55,14 + Actor1284: ftur + Owner: Krukov + Location: 72,22 + Actor1285: ftur + Owner: Krukov + Location: 78,22 + Actor1286: ftur + Owner: Krukov + Location: 90,14 + Actor1288: ftur + Owner: Krukov + Location: 63,11 + Actor1289: ftur + Owner: Krukov + Location: 63,16 + Actor1287: ftur + Owner: Krukov + Location: 90,9 + Actor1290: fenc + Owner: Krukov + Location: 70,26 + Actor1291: fenc + Owner: Krukov + Location: 71,26 + Actor1292: fenc + Owner: Krukov + Location: 72,26 + Actor1293: fenc + Owner: Krukov + Location: 81,26 + Actor1294: fenc + Owner: Krukov + Location: 80,26 + Actor1295: fenc + Owner: Krukov + Location: 79,26 + Actor1296: fenc + Owner: Krukov + Location: 81,29 + Actor1297: fenc + Owner: Krukov + Location: 80,29 + Actor1298: fenc + Owner: Krukov + Location: 65,28 + Actor1299: fenc + Owner: Krukov + Location: 65,29 + Actor1300: fenc + Owner: Krukov + Location: 66,29 + Actor1301: fenc + Owner: Krukov + Location: 68,29 + Actor1302: fenc + Owner: Krukov + Location: 67,29 + Actor1303: fenc + Owner: Krukov + Location: 69,29 + Actor1304: fenc + Owner: Krukov + Location: 69,30 + Actor1305: fenc + Owner: Krukov + Location: 71,30 + Actor1306: fenc + Owner: Krukov + Location: 70,30 + Actor1307: fenc + Owner: Krukov + Location: 64,34 + Actor1308: fenc + Owner: Krukov + Location: 62,34 + Actor1309: fenc + Owner: Krukov + Location: 63,34 + Actor1310: fenc + Owner: Krukov + Location: 61,34 + Actor1311: fenc + Owner: Krukov + Location: 61,33 + Actor1312: fenc + Owner: Krukov + Location: 61,32 + Actor1313: fenc + Owner: Krukov + Location: 91,30 + Actor1314: fenc + Owner: Krukov + Location: 91,31 + Actor1315: fenc + Owner: Krukov + Location: 89,31 + Actor1316: fenc + Owner: Krukov + Location: 90,31 + Actor1317: fenc + Owner: Krukov + Location: 91,29 + Actor1318: fenc + Owner: Krukov + Location: 91,28 + Actor1319: fenc + Owner: Krukov + Location: 92,28 + Actor1320: ttrp + Owner: Marinesko + Facing: 384 + SubCell: 3 + Location: 38,68 + Actor1321: ttrp + Owner: Marinesko + Facing: 384 + SubCell: 3 + Location: 38,59 + PlayerStart: waypoint + Owner: Neutral + Location: 67,114 + RomanovRally1: waypoint + Owner: Neutral + Location: 91,87 + RomanovRally2: waypoint + Owner: Neutral + Location: 105,109 + RomanovRally3: waypoint + Owner: Neutral + Location: 93,54 + RomanovRally4: waypoint + Owner: Neutral + Location: 103,42 + MarineskoRally3: waypoint + Owner: Neutral + Location: 45,92 + MarineskoRally1: waypoint + Owner: Neutral + Location: 59,72 + MarineskoRally2: waypoint + Owner: Neutral + Location: 18,103 + KrukovRally1: waypoint + Owner: Neutral + Location: 72,78 + MarineskoRally4: waypoint + Owner: Neutral + Location: 47,48 + KrukovRally3: waypoint + Owner: Neutral + Location: 90,35 + KrukovRally2: waypoint + Owner: Neutral + Location: 51,32 + Middle: waypoint + Owner: Neutral + Location: 73,60 + KrukovBase: waypoint + Owner: Neutral + Location: 76,5 + RomanovBase: waypoint + Owner: Neutral + Location: 124,61 + MarineskoBase: waypoint + Owner: Neutral + Location: 19,64 + Actor1322: camera + Owner: Romanov + Location: 72,108 + Actor1323: camera + Owner: Romanov + Location: 36,63 + Actor1324: camera + Owner: Romanov + Location: 78,13 + Actor1325: camera + Owner: Romanov + Location: 89,90 + Actor1326: camera + Owner: Romanov + Location: 49,91 + Actor1327: camera + Owner: Marinesko + Location: 62,109 + Actor1328: camera + Owner: Marinesko + Location: 112,62 + Actor1329: camera + Owner: Marinesko + Location: 77,15 + Actor1330: camera + Owner: Marinesko + Location: 86,90 + Actor1331: camera + Owner: Krukov + Location: 92,90 + Actor1332: camera + Owner: Krukov + Location: 70,113 + Actor1333: camera + Owner: Krukov + Location: 68,90 + Actor1334: camera + Owner: Krukov + Location: 36,65 + Actor1335: camera + Owner: Krukov + Location: 111,60 + Actor1336: camera + Owner: Krukov + Location: 22,56 + Actor1337: camera + Owner: Krukov + Location: 119,51 + Actor1338: katy + Owner: Krukov + Facing: 384 + Location: 62,33 + Actor1339: katy + Owner: Krukov + Location: 90,29 + Facing: 602 + Actor1340: grad + Owner: Krukov + Facing: 384 + Location: 66,28 + Actor1341: grad + Owner: Krukov + Facing: 384 + Location: 70,29 + Actor1342: 3tnk.rhino + Owner: Romanov + Location: 103,40 + Facing: 150 + Actor1343: 3tnk.rhino + Owner: Romanov + Facing: 150 + Location: 105,39 + Actor1344: 3tnk.rhino + Owner: Romanov + Facing: 150 + Location: 108,39 + Actor1345: 3tnk.rhino + Owner: Romanov + Facing: 150 + Location: 103,44 + Actor1346: e3 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 89,30 + Actor1347: e1 + Owner: Krukov + SubCell: 3 + Facing: 483 + Location: 90,30 + Actor1348: e3 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 67,28 + Actor1349: e1 + Owner: Krukov + SubCell: 3 + Facing: 483 + Location: 68,28 + Actor1350: e3 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 63,33 + Actor1351: e1 + Owner: Krukov + SubCell: 3 + Facing: 483 + Location: 64,33 + Actor1352: e3 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 80,28 + Actor1353: e1 + Owner: Krukov + SubCell: 3 + Facing: 578 + Location: 81,28 + Actor1354: e1 + Owner: Krukov + Facing: 384 + SubCell: 1 + Location: 81,28 + Actor1355: e1 + Owner: Krukov + SubCell: 3 + Facing: 578 + Location: 92,27 + Actor1356: e1 + Owner: Krukov + Facing: 384 + SubCell: 1 + Location: 92,27 + Actor1357: e1 + Owner: Krukov + SubCell: 3 + Facing: 578 + Location: 101,23 + Actor1358: e1 + Owner: Krukov + Facing: 384 + SubCell: 1 + Location: 101,23 + Actor1359: e1 + Owner: Krukov + SubCell: 3 + Facing: 578 + Location: 88,23 + Actor1360: e1 + Owner: Krukov + Facing: 384 + SubCell: 1 + Location: 88,23 + Actor1361: e1 + Owner: Marinesko + SubCell: 3 + Location: 27,50 + Facing: 697 + Actor1362: e1 + Owner: Marinesko + SubCell: 1 + Location: 27,50 + Facing: 927 + Actor1363: e1 + Owner: Marinesko + SubCell: 3 + Location: 26,51 + Facing: 896 + Actor1364: e1 + Owner: Marinesko + SubCell: 3 + Location: 28,52 + Facing: 919 + Actor1365: ttrp + Owner: Marinesko + SubCell: 1 + Location: 28,52 + Facing: 904 + Actor1366: e1 + Owner: Marinesko + SubCell: 3 + Facing: 697 + Location: 13,47 + Actor1367: e1 + Owner: Marinesko + SubCell: 1 + Facing: 927 + Location: 13,47 + Actor1368: e1 + Owner: Marinesko + SubCell: 3 + Facing: 896 + Location: 12,48 + Actor1369: e1 + Owner: Marinesko + SubCell: 3 + Facing: 919 + Location: 14,49 + Actor1370: ttrp + Owner: Marinesko + SubCell: 1 + Facing: 904 + Location: 14,49 + Actor1371: n3 + Owner: Marinesko + Facing: 384 + Location: 27,51 + SubCell: 3 + Actor1372: n3 + Owner: Marinesko + Facing: 384 + Location: 14,47 + SubCell: 3 + Actor1373: shok + Owner: Marinesko + SubCell: 3 + Location: 46,59 + Facing: 848 + Actor1374: shok + Owner: Marinesko + SubCell: 3 + Location: 34,54 + Facing: 808 + Actor1375: e1 + Owner: Marinesko + SubCell: 3 + Location: 44,68 + Facing: 594 + Actor1379: e1 + Owner: Marinesko + SubCell: 3 + Location: 46,71 + Facing: 674 + Actor1380: e1 + Owner: Marinesko + SubCell: 3 + Location: 41,73 + Facing: 610 + Actor1381: e1 + Owner: Marinesko + SubCell: 3 + Location: 46,68 + Facing: 816 + Actor1376: e1 + Owner: Marinesko + SubCell: 3 + Facing: 610 + Location: 44,66 + Actor1377: e1 + Owner: Marinesko + SubCell: 3 + Facing: 610 + Location: 44,60 + Actor1378: e1 + Owner: Marinesko + SubCell: 3 + Facing: 610 + Location: 51,63 + Actor1382: e1 + Owner: Marinesko + SubCell: 3 + Facing: 594 + Location: 43,69 + Actor1383: n4 + Owner: Marinesko + Facing: 384 + SubCell: 3 + Location: 43,61 + Actor1384: 3tnk.rhino + Owner: Romanov + Location: 103,83 + Facing: 396 + Actor1385: 3tnk.rhino + Owner: Romanov + Facing: 396 + Location: 100,81 + Actor1386: 3tnk.rhino + Owner: Romanov + Location: 108,86 + Facing: 396 + Actor1388: e1 + Owner: Romanov + SubCell: 3 + Facing: 618 + Location: 106,85 + Actor1389: e3 + Owner: Romanov + SubCell: 1 + Location: 106,85 + Facing: 384 + Actor1390: e1 + Owner: Romanov + SubCell: 3 + Location: 101,82 + Facing: 214 + Actor1391: e1 + Owner: Romanov + SubCell: 3 + Location: 102,82 + Facing: 436 + Actor1392: e3 + Owner: Romanov + Facing: 384 + SubCell: 1 + Location: 102,82 + Actor1387: tsla + Owner: Krukov + Location: 88,20 + Actor1393: btr.ai + Owner: Marinesko + Location: 28,50 + Facing: 911 + Actor1394: 3tnk.rhino + Owner: Romanov + Facing: 256 + Location: 105,54 + Actor1395: e1 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 71,4 + Actor1396: e1 + Owner: Krukov + Facing: 384 + SubCell: 1 + Location: 71,4 + Actor1397: e1 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 81,4 + Actor1398: e1 + Owner: Krukov + Facing: 384 + SubCell: 1 + Location: 81,4 + Actor1399: e3 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 77,3 + Actor1400: e3 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 85,6 + Actor1401: e3 + Owner: Krukov + SubCell: 3 + Location: 90,19 + Facing: 674 + Actor1402: e3 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 85,22 + Actor1403: e3 + Owner: Krukov + SubCell: 3 + Location: 91,21 + Facing: 666 + Actor1405: 4tnk + Owner: Romanov + Location: 105,73 + Facing: 396 + Actor1404: 4tnk + Owner: Romanov + Facing: 396 + Location: 103,71 + Actor1406: e1 + Owner: Marinesko + SubCell: 3 + Facing: 697 + Location: 37,54 + Actor1407: e1 + Owner: Marinesko + SubCell: 1 + Facing: 927 + Location: 37,54 + Actor1408: e1 + Owner: Marinesko + SubCell: 3 + Facing: 697 + Location: 40,55 + Actor1409: e1 + Owner: Marinesko + SubCell: 1 + Facing: 927 + Location: 40,55 + Actor1410: e1 + Owner: Marinesko + SubCell: 3 + Facing: 697 + Location: 31,55 + Actor1411: e1 + Owner: Marinesko + SubCell: 1 + Facing: 927 + Location: 31,55 + Actor1412: e1 + Owner: Marinesko + SubCell: 3 + Facing: 697 + Location: 44,54 + Actor1413: e1 + Owner: Marinesko + SubCell: 1 + Facing: 927 + Location: 44,54 + Actor1414: e1 + Owner: Marinesko + SubCell: 3 + Facing: 697 + Location: 20,48 + Actor1415: e1 + Owner: Marinesko + SubCell: 1 + Facing: 927 + Location: 20,48 + Actor1416: miss + Owner: Neutral + Location: 93,95 + Actor1418: barb + Owner: Neutral + Location: 93,94 + Actor1419: barb + Owner: Neutral + Location: 94,94 + Actor1420: barb + Owner: Neutral + Location: 95,94 + Actor1421: barb + Owner: Neutral + Location: 96,94 + Actor1422: barb + Owner: Neutral + Location: 96,95 + Actor1423: barb + Owner: Neutral + Location: 96,96 + Actor1424: barb + Owner: Neutral + Location: 96,97 + Actor1425: barb + Owner: Neutral + Location: 92,94 + Actor1426: barb + Owner: Neutral + Location: 92,95 + Actor1427: barb + Owner: Neutral + Location: 92,96 + Actor1428: barb + Owner: Neutral + Location: 92,97 + Actor1429: t16 + Owner: Neutral + Location: 60,78 + Actor1430: t17 + Owner: Neutral + Location: 61,78 + Actor1417: miss + Owner: Neutral + Location: 55,76 + Actor1431: barb + Owner: Neutral + Location: 54,78 + Actor1432: barb + Owner: Neutral + Location: 54,77 + Actor1433: barb + Owner: Neutral + Location: 54,76 + Actor1434: barb + Owner: Neutral + Location: 54,75 + Actor1435: barb + Owner: Neutral + Location: 55,75 + Actor1436: barb + Owner: Neutral + Location: 56,75 + Actor1437: barb + Owner: Neutral + Location: 57,75 + Actor1438: barb + Owner: Neutral + Location: 58,75 + Actor1439: barb + Owner: Neutral + Location: 58,76 + Actor1440: barb + Owner: Neutral + Location: 58,77 + Actor1441: barb + Owner: Neutral + Location: 58,78 + Actor1442: e1 + Owner: Romanov + SubCell: 3 + Facing: 364 + Location: 117,79 + Actor1443: 3tnk.rhino + Owner: Romanov + Location: 115,80 + Facing: 396 + Actor1445: e1 + Owner: Romanov + SubCell: 3 + Facing: 459 + Location: 116,81 + Actor1446: apoc + Owner: Romanov + Location: 117,81 + Facing: 396 + Actor1447: e1 + Owner: Romanov + SubCell: 3 + Facing: 364 + Location: 119,82 + Actor1448: brik + Owner: Romanov + Location: 128,74 + Actor1449: brik + Owner: Romanov + Location: 128,73 + Actor1450: brik + Owner: Romanov + Location: 128,75 + Actor1451: brik + Owner: Romanov + Location: 128,80 + Actor1452: brik + Owner: Romanov + Location: 128,79 + Actor1453: brik + Owner: Romanov + Location: 128,77 + Actor1454: brik + Owner: Romanov + Location: 128,76 + Actor1455: brik + Owner: Romanov + Location: 128,78 + Actor1456: brik + Owner: Romanov + Location: 127,80 + Actor1457: brik + Owner: Romanov + Location: 126,80 + Actor1458: brik + Owner: Romanov + Location: 125,80 + Actor1459: brik + Owner: Romanov + Location: 124,80 + Actor1460: brik + Owner: Romanov + Location: 122,80 + Actor1461: brik + Owner: Romanov + Location: 123,80 + Actor1462: brik + Owner: Romanov + Location: 121,80 + Actor1463: brik + Owner: Romanov + Location: 120,80 + Actor1464: brik + Owner: Romanov + Location: 119,80 + Actor1467: brik + Owner: Romanov + Location: 118,78 + Actor1468: brik + Owner: Romanov + Location: 118,77 + Actor1469: brik + Owner: Romanov + Location: 117,77 + Actor1470: brik + Owner: Romanov + Location: 116,77 + Actor1471: brik + Owner: Romanov + Location: 116,76 + Actor1472: brik + Owner: Romanov + Location: 117,76 + Actor1473: ftur + Owner: Romanov + Location: 115,77 + Actor1474: 4tnk + Owner: Romanov + Location: 111,77 + Facing: 396 + Actor1475: tsla + Owner: Romanov + Location: 118,76 + Actor1477: apwr + Owner: Romanov + Location: 125,77 + Actor1476: apwr + Owner: Romanov + Location: 125,74 + Actor1478: apwr + Owner: Romanov + Location: 125,71 + Actor1479: apwr + Owner: Romanov + Location: 121,71 + Actor1480: apwr + Owner: Romanov + Location: 121,74 + Actor1481: apwr + Owner: Romanov + Location: 121,77 + Actor1482: sam + Owner: Romanov + Location: 119,79 + Actor1465: sam + Owner: Romanov + Location: 126,69 + Actor1466: brik + Owner: Romanov + Location: 118,79 + Actor1444: brik + Owner: Romanov + Location: 118,80 + Actor1483: 3tnk.rhino + Owner: Romanov + Facing: 396 + Location: 113,72 + Actor1484: 3tnk.rhino + Owner: Romanov + Facing: 396 + Location: 116,74 + Actor1485: sam + Owner: Romanov + Location: 121,69 + Actor1486: btr.ai + Owner: Marinesko + Facing: 499 + Location: 22,70 + Actor1487: btr.ai + Owner: Marinesko + Facing: 777 + Location: 38,63 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-doctrines.yaml, ca|missions/main-campaign/ca37-statecraft/statecraft-rules.yaml, ca|rules/custom/coop-rules.yaml, statecraft-coop-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/coop-campaign/ca37-statecraft-coop/statecraft-coop-rules.yaml b/mods/ca/missions/coop-campaign/ca37-statecraft-coop/statecraft-coop-rules.yaml new file mode 100644 index 0000000000..33b36c7c03 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca37-statecraft-coop/statecraft-coop-rules.yaml @@ -0,0 +1,6 @@ +World: + LuaScript: + Scripts: campaign.lua, coop.lua, ca|missions/main-campaign/ca37-statecraft/statecraft.lua, statecraft-coop.lua + LobbyMissionInfo@InitialObjectives: + Prefix: Initial Objectives + Text: • Eliminate all rival Soviet forces. diff --git a/mods/ca/missions/coop-campaign/ca37-statecraft-coop/statecraft-coop.lua b/mods/ca/missions/coop-campaign/ca37-statecraft-coop/statecraft-coop.lua new file mode 100644 index 0000000000..fc8412fd2d --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca37-statecraft-coop/statecraft-coop.lua @@ -0,0 +1,30 @@ + +SetupPlayers = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Multi2 = Player.GetPlayer("Multi2") + Multi3 = Player.GetPlayer("Multi3") + Multi4 = Player.GetPlayer("Multi4") + Multi5 = Player.GetPlayer("Multi5") + USSR = Player.GetPlayer("USSR") + Marinesko = Player.GetPlayer("Marinesko") + Romanov = Player.GetPlayer("Romanov") + Krukov = Player.GetPlayer("Krukov") + MarineskoUnited = Player.GetPlayer("MarineskoUnited") + RomanovUnited = Player.GetPlayer("RomanovUnited") + KrukovUnited = Player.GetPlayer("KrukovUnited") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = Utils.Where({ Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 }, function(p) return p ~= nil end) + MissionEnemies = { Marinesko, Romanov, Krukov, MarineskoUnited, RomanovUnited, KrukovUnited } + SinglePlayerPlayer = USSR + CoopInit() +end + +AfterWorldLoaded = function() + TransferMcvsToPlayers() + StartCashSpread(3500) +end + +AfterTick = function() + +end diff --git a/mods/ca/missions/coop-campaign/ca38-procurement-coop/map.bin b/mods/ca/missions/coop-campaign/ca38-procurement-coop/map.bin new file mode 100644 index 0000000000..35911e8147 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca38-procurement-coop/map.bin differ diff --git a/mods/ca/missions/coop-campaign/ca38-procurement-coop/map.png b/mods/ca/missions/coop-campaign/ca38-procurement-coop/map.png new file mode 100644 index 0000000000..71bfd1dfb8 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca38-procurement-coop/map.png differ diff --git a/mods/ca/missions/coop-campaign/ca38-procurement-coop/map.yaml b/mods/ca/missions/coop-campaign/ca38-procurement-coop/map.yaml new file mode 100644 index 0000000000..57818b8e67 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca38-procurement-coop/map.yaml @@ -0,0 +1,3735 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 38: Procurement Co-op + +Author: Darkademic & Gandorques Hikla + +Tileset: TEMPERAT + +MapSize: 130,98 + +Bounds: 1,1,128,96 + +Visibility: Lobby + +Categories: Co-op Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: USSR, GDI, China, ChinaWalls, ChinaHostile, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + PlayerReference@USSR: + Name: USSR + Faction: soviet + Color: FE1100 + Allies: ChinaWalls, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: GDI, Creeps, ChinaHostile + PlayerReference@GDI: + Name: GDI + Bot: campaign + Faction: gdi + Color: F2CF74 + Enemies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@China: + Name: China + Bot: dormant + Faction: soviet + Color: FFEE00 + Allies: ChinaWalls, ChinaHostile + Enemies: Creeps + PlayerReference@ChinaWalls: + Name: ChinaWalls + Bot: dormant + Faction: soviet + Color: FFEE00 + Allies: USSR, China, ChinaHostile + Enemies: Creeps + PlayerReference@ChinaHostile: + Name: ChinaHostile + Bot: campaign + Faction: soviet + Color: FFEE00 + Allies: China, ChinaWalls + Enemies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: FE1100 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, ChinaWalls + Enemies: GDI, Creeps, ChinaHostile + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: FF9922 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, ChinaWalls + Enemies: GDI, Creeps, ChinaHostile + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: 994050 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, ChinaWalls + Enemies: GDI, Creeps, ChinaHostile + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: 775A12 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, ChinaWalls + Enemies: GDI, Creeps, ChinaHostile + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: 82C900 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, ChinaWalls + Enemies: GDI, Creeps, ChinaHostile + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: DD1691 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, ChinaWalls + Enemies: GDI, Creeps, ChinaHostile + +Actors: + Actor87: chain + Location: 21,19 + Owner: ChinaWalls + Actor117: chain + Owner: China + Location: 26,27 + Actor125: trpc.empty + Owner: China + Location: 19,21 + Facing: 768 + Actor126: trpc.empty + Owner: China + Facing: 768 + Location: 19,23 + Actor127: trpc.empty + Owner: China + Location: 19,22 + Facing: 768 + Actor123: ovld + Owner: China + Facing: 256 + Location: 29,21 + Actor129: ovld + Owner: China + Location: 29,22 + Facing: 256 + Actor130: ovld + Owner: China + Facing: 256 + Location: 29,23 + NonHardOverlord: ovld + Owner: China + Location: 29,24 + Facing: 256 + Actor98: nukc + Owner: China + Facing: 0 + Location: 23,26 + NonHardNukeCannon: nukc + Owner: China + Facing: 0 + Location: 25,26 + NonHardTroopCrawler: trpc.empty + Owner: China + Location: 19,24 + Facing: 768 + Actor128: 3tnk.rhino + Owner: USSR + Location: 5,9 + Facing: 768 + Actor133: 3tnk.rhino + Owner: USSR + Location: 7,9 + Facing: 768 + Actor51: btr + Owner: USSR + Location: 10,10 + Facing: 642 + Actor52: btr + Owner: USSR + Location: 12,11 + Facing: 769 + Actor55: e1 + Owner: USSR + SubCell: 3 + Location: 6,8 + Facing: 768 + Actor59: ttrp + Owner: USSR + SubCell: 3 + Location: 6,11 + Facing: 768 + Actor60: ttrp + Owner: USSR + SubCell: 3 + Facing: 768 + Location: 13,9 + Actor61: e1 + Owner: USSR + SubCell: 3 + Location: 10,8 + Facing: 768 + Actor62: e1 + Owner: USSR + SubCell: 3 + Facing: 768 + Location: 12,10 + Actor63: e1 + Owner: USSR + SubCell: 3 + Facing: 768 + Location: 8,11 + Actor64: e1 + Owner: USSR + SubCell: 3 + Facing: 768 + Location: 13,12 + Actor65: tc04 + Owner: Neutral + Location: 15,17 + Actor66: tc01 + Owner: Neutral + Location: 13,18 + Actor67: tc02 + Owner: Neutral + Location: 11,19 + Actor68: tc05 + Owner: Neutral + Location: 9,16 + Actor69: t16 + Owner: Neutral + Location: 9,18 + Actor70: t11 + Owner: Neutral + Location: 12,17 + Actor71: tc04 + Owner: Neutral + Location: 6,17 + Actor72: t16 + Owner: Neutral + Location: 7,16 + Actor73: t01 + Owner: Neutral + Location: 8,15 + Actor74: t05 + Owner: Neutral + Location: 5,18 + Actor75: t16 + Owner: Neutral + Location: 16,20 + Actor76: tc03 + Owner: Neutral + Location: 4,16 + Actor78: tc05 + Owner: Neutral + Location: 2,18 + Actor79: t15 + Owner: Neutral + Location: 1,16 + Actor81: t05 + Owner: Neutral + Location: 1,19 + Actor82: t01 + Owner: Neutral + Location: 2,20 + Actor83: tc04 + Owner: Neutral + Location: 8,19 + Actor86: tc01 + Owner: Neutral + Location: 5,20 + Actor134: tc02 + Owner: Neutral + Location: 15,24 + Actor135: tc01 + Owner: Neutral + Location: 14,21 + Actor136: tc04 + Owner: Neutral + Location: 14,26 + Actor137: t13 + Owner: Neutral + Location: 14,20 + Actor138: t13 + Owner: Neutral + Location: 12,21 + Actor139: t14 + Owner: Neutral + Location: 12,24 + Actor140: t07 + Owner: Neutral + Location: 14,23 + Actor141: t05 + Owner: Neutral + Location: 10,21 + Actor142: tc03 + Owner: Neutral + Location: 12,23 + Actor143: tc01 + Owner: Neutral + Location: 32,20 + Actor144: tc05 + Owner: Neutral + Location: 31,17 + Actor145: tc02 + Owner: Neutral + Location: 34,18 + Actor146: tc04 + Owner: Neutral + Location: 35,16 + Actor147: tc01 + Owner: Neutral + Location: 38,16 + Actor148: t12 + Owner: Neutral + Location: 37,18 + Actor149: t01 + Owner: Neutral + Location: 32,22 + Actor150: t05 + Owner: Neutral + Location: 32,25 + Actor151: tc04 + Owner: Neutral + Location: 33,23 + Actor152: tc05 + Owner: Neutral + Location: 29,28 + Actor153: tc03 + Owner: Neutral + Location: 33,26 + Actor154: t16 + Owner: Neutral + Location: 34,21 + Actor155: t07 + Owner: Neutral + Location: 36,21 + Actor156: t05 + Owner: Neutral + Location: 35,20 + Actor157: t01 + Owner: Neutral + Location: 39,18 + Actor158: t01 + Owner: Neutral + Location: 27,28 + Actor159: tc02 + Owner: Neutral + Location: 18,28 + Actor160: tc01 + Owner: Neutral + Location: 21,28 + Actor161: t07 + Owner: Neutral + Location: 16,28 + Actor162: t01 + Owner: Neutral + Location: 24,28 + Actor163: t03 + Owner: Neutral + Location: 25,29 + Actor164: t05 + Owner: Neutral + Location: 28,30 + Actor165: tc04 + Owner: Neutral + Location: 18,30 + Actor166: tc05 + Owner: Neutral + Location: 14,30 + Actor167: t17 + Owner: Neutral + Location: 12,28 + Actor168: t01 + Owner: Neutral + Location: 25,27 + Actor169: t05 + Owner: Neutral + Location: 28,27 + Actor170: t07 + Owner: Neutral + Location: 21,30 + Actor171: t14 + Owner: Neutral + Location: 22,27 + Actor172: t10 + Owner: Neutral + Location: 20,27 + Actor173: t11 + Owner: Neutral + Location: 23,29 + Actor174: t10 + Owner: Neutral + Location: 22,30 + Actor175: t11 + Owner: Neutral + Location: 32,28 + Actor176: t10 + Owner: Neutral + Location: 36,24 + Actor177: t12 + Owner: Neutral + Location: 7,21 + Actor178: tc02 + Owner: Neutral + Location: 38,20 + Actor179: t11 + Owner: Neutral + Location: 25,31 + Actor180: t13 + Owner: Neutral + Location: 27,29 + Actor181: t02 + Owner: Neutral + Location: 27,31 + Actor182: t05 + Owner: Neutral + Location: 21,31 + Actor184: t01 + Owner: Neutral + Location: 39,22 + Actor185: t05 + Owner: Neutral + Location: 40,17 + Actor186: t01 + Owner: Neutral + Location: 35,13 + Actor187: t05 + Owner: Neutral + Location: 31,14 + Actor188: t02 + Owner: Neutral + Location: 27,2 + Actor189: t05 + Owner: Neutral + Location: 32,4 + Actor190: tc01 + Owner: Neutral + Location: 28,12 + Actor191: tc04 + Owner: Neutral + Location: 20,8 + Actor192: tc02 + Owner: Neutral + Location: 10,1 + Actor193: t01 + Owner: Neutral + Location: 6,2 + Actor194: t05 + Owner: Neutral + Location: 15,2 + Actor195: t12 + Owner: Neutral + Location: 17,1 + Actor196: t15 + Owner: Neutral + Location: 13,6 + Actor197: t10 + Owner: Neutral + Location: 2,1 + Actor198: t11 + Owner: Neutral + Location: 3,12 + Actor199: t11 + Owner: Neutral + Location: 18,15 + Actor200: t17 + Owner: Neutral + Location: 26,10 + Actor201: t10 + Owner: Neutral + Location: 25,4 + Actor202: t11 + Owner: Neutral + Location: 32,1 + Actor203: t14 + Owner: Neutral + Location: 28,15 + Actor204: t13 + Owner: Neutral + Location: 14,13 + Actor243: barr + Owner: China + Location: 54,19 + Actor246: pbox + Owner: China + Location: 46,29 + Actor247: pbox + Owner: China + Location: 52,29 + Actor248: e1 + Owner: China + Facing: 384 + Location: 45,29 + SubCell: 3 + Actor249: e1 + Owner: China + SubCell: 3 + Location: 53,29 + Facing: 491 + Actor251: e1 + Owner: China + SubCell: 3 + Location: 45,24 + Facing: 618 + Actor252: e1 + Owner: China + Facing: 384 + Location: 54,22 + SubCell: 3 + Actor253: e1 + Owner: China + Facing: 384 + Location: 54,22 + SubCell: 1 + Actor254: e1 + Owner: China + Facing: 384 + Location: 53,21 + SubCell: 3 + Actor255: e1 + Owner: China + Facing: 384 + SubCell: 3 + Location: 54,24 + Actor256: e3 + Owner: China + Facing: 384 + Location: 53,20 + SubCell: 3 + Actor234: tanktrap2 + Owner: Neutral + Location: 46,31 + Actor257: tanktrap2 + Owner: Neutral + Location: 51,31 + Actor258: brl3 + Owner: Neutral + Location: 46,19 + Actor259: barl + Owner: Neutral + Location: 46,20 + Actor260: sbag + Owner: GDI + Location: 22,46 + Actor261: sbag + Owner: GDI + Location: 29,46 + Actor262: sbag + Owner: GDI + Location: 21,46 + Actor263: sbag + Owner: GDI + Location: 20,46 + Actor264: sbag + Owner: GDI + Location: 19,46 + Actor265: sbag + Owner: GDI + Location: 18,46 + Actor266: sbag + Owner: GDI + Location: 18,47 + Actor267: sbag + Owner: GDI + Location: 30,46 + Actor268: sbag + Owner: GDI + Location: 31,46 + Actor269: sbag + Owner: GDI + Location: 32,46 + Actor270: sbag + Owner: GDI + Location: 33,46 + Actor271: sbag + Owner: GDI + Location: 33,47 + Actor272: sbag + Owner: GDI + Location: 18,48 + Actor273: sbag + Owner: GDI + Location: 18,49 + Actor276: sbag + Owner: GDI + Location: 18,56 + Actor277: sbag + Owner: GDI + Location: 18,57 + Actor278: sbag + Owner: GDI + Location: 18,58 + Actor279: sbag + Owner: GDI + Location: 18,59 + Actor280: sbag + Owner: GDI + Location: 18,60 + Actor281: sbag + Owner: GDI + Location: 19,60 + Actor282: sbag + Owner: GDI + Location: 20,60 + Actor283: sbag + Owner: GDI + Location: 21,60 + Actor284: sbag + Owner: GDI + Location: 22,60 + Actor285: sbag + Owner: GDI + Location: 33,48 + Actor287: sbag + Owner: GDI + Location: 33,49 + Actor288: sbag + Owner: GDI + Location: 33,50 + Actor289: sbag + Owner: GDI + Location: 33,51 + Actor290: sbag + Owner: GDI + Location: 33,52 + Actor291: sbag + Owner: GDI + Location: 33,53 + Actor292: sbag + Owner: GDI + Location: 33,54 + Actor293: sbag + Owner: GDI + Location: 33,55 + Actor294: sbag + Owner: GDI + Location: 33,56 + Actor295: sbag + Owner: GDI + Location: 33,57 + Actor296: sbag + Owner: GDI + Location: 33,58 + Actor297: sbag + Owner: GDI + Location: 33,59 + Actor298: sbag + Owner: GDI + Location: 33,60 + Actor300: sbag + Owner: GDI + Location: 29,60 + Actor302: sbag + Owner: GDI + Location: 30,60 + Actor303: sbag + Owner: GDI + Location: 32,60 + Actor304: sbag + Owner: GDI + Location: 31,60 + OutpostConyard: afac + Owner: GDI + Location: 30,57 + OutpostRefinery: proc.td + Owner: GDI + Location: 20,51 + OutpostGuardTower1: gtwr + Owner: GDI + Location: 23,46 + OutpostGuardTower2: gtwr + Owner: GDI + Location: 28,46 + OutpostGuardTower4: gtwr + Owner: GDI + Location: 28,60 + OutpostGuardTower3: gtwr + Owner: GDI + Location: 23,60 + OutpostBarracks: pyle + Owner: GDI + Location: 19,47 + OutpostPower1: nuk2 + Owner: GDI + Location: 31,53 + OutpostPower2: nuk2 + Owner: GDI + Location: 31,50 + OutpostPower3: nuk2 + Owner: GDI + Location: 31,47 + OutpostFactory: weap.td + Owner: GDI + Location: 27,52 + OutpostSilo2: silo.td + Owner: GDI + Location: 19,59 + OutpostSilo1: silo.td + Owner: GDI + Location: 19,57 + Actor274: sbag + Owner: GDI + Location: 18,50 + Actor275: split2 + Owner: Neutral + Location: 13,51 + Actor317: split2 + Owner: Neutral + Location: 11,58 + Actor318: split2 + Owner: Neutral + Location: 6,53 + Actor321: brik + Owner: GDI + Location: 95,64 + Actor322: brik + Owner: GDI + Location: 95,63 + Actor323: brik + Owner: GDI + Location: 96,63 + Actor324: brik + Owner: GDI + Location: 96,64 + Actor325: brik + Owner: GDI + Location: 95,65 + Actor326: brik + Owner: GDI + Location: 95,66 + Actor327: brik + Owner: GDI + Location: 95,67 + Actor328: brik + Owner: GDI + Location: 96,67 + Actor329: brik + Owner: GDI + Location: 96,66 + Actor330: brik + Owner: GDI + Location: 97,63 + Actor331: brik + Owner: GDI + Location: 98,63 + Actor332: brik + Owner: GDI + Location: 99,63 + Actor333: brik + Owner: GDI + Location: 100,63 + Actor334: brik + Owner: GDI + Location: 102,63 + Actor335: brik + Owner: GDI + Location: 101,63 + Actor336: brik + Owner: GDI + Location: 103,63 + Actor337: brik + Owner: GDI + Location: 104,63 + Actor338: brik + Owner: GDI + Location: 95,72 + Actor339: brik + Owner: GDI + Location: 96,72 + Actor340: brik + Owner: GDI + Location: 95,73 + Actor341: brik + Owner: GDI + Location: 96,73 + Actor342: brik + Owner: GDI + Location: 95,74 + Actor343: brik + Owner: GDI + Location: 95,75 + Actor344: brik + Owner: GDI + Location: 95,76 + Actor345: brik + Owner: GDI + Location: 96,76 + Actor346: brik + Owner: GDI + Location: 96,75 + Actor347: brik + Owner: GDI + Location: 95,77 + Actor348: brik + Owner: GDI + Location: 95,78 + Actor349: brik + Owner: GDI + Location: 95,79 + Actor350: brik + Owner: GDI + Location: 96,79 + Actor351: brik + Owner: GDI + Location: 96,78 + Actor352: brik + Owner: GDI + Location: 97,79 + Actor353: brik + Owner: GDI + Location: 98,79 + Actor354: brik + Owner: GDI + Location: 99,79 + Actor355: brik + Owner: GDI + Location: 100,79 + Actor356: brik + Owner: GDI + Location: 101,79 + Actor357: brik + Owner: GDI + Location: 102,79 + Actor358: brik + Owner: GDI + Location: 102,78 + Actor359: brik + Owner: GDI + Location: 101,78 + Actor360: brik + Owner: GDI + Location: 99,62 + Actor361: brik + Owner: GDI + Location: 99,61 + Actor362: brik + Owner: GDI + Location: 99,60 + Actor363: brik + Owner: GDI + Location: 99,59 + Actor364: brik + Owner: GDI + Location: 99,58 + Actor365: brik + Owner: GDI + Location: 99,57 + Actor366: brik + Owner: GDI + Location: 99,56 + Actor367: brik + Owner: GDI + Location: 100,56 + Actor368: brik + Owner: GDI + Location: 100,57 + Actor369: brik + Owner: GDI + Location: 102,56 + Actor370: brik + Owner: GDI + Location: 101,56 + Actor371: brik + Owner: GDI + Location: 103,56 + Actor372: brik + Owner: GDI + Location: 104,56 + Actor373: brik + Owner: GDI + Location: 106,56 + Actor374: brik + Owner: GDI + Location: 105,56 + Actor375: brik + Owner: GDI + Location: 107,56 + Actor376: brik + Owner: GDI + Location: 107,57 + Actor377: brik + Owner: GDI + Location: 106,57 + Actor378: brik + Owner: GDI + Location: 105,63 + Actor379: brik + Owner: GDI + Location: 106,63 + Actor380: brik + Owner: GDI + Location: 107,63 + Actor381: brik + Owner: GDI + Location: 107,64 + Actor382: brik + Owner: GDI + Location: 106,64 + Actor383: brik + Owner: GDI + Location: 108,56 + Actor384: brik + Owner: GDI + Location: 109,56 + Actor385: brik + Owner: GDI + Location: 110,56 + Actor388: brik + Owner: GDI + Location: 110,57 + Actor389: brik + Owner: GDI + Location: 109,57 + Actor386: brik + Owner: GDI + Location: 115,56 + Actor387: brik + Owner: GDI + Location: 115,57 + Actor390: brik + Owner: GDI + Location: 116,57 + Actor391: brik + Owner: GDI + Location: 116,56 + Actor392: brik + Owner: GDI + Location: 117,56 + Actor393: brik + Owner: GDI + Location: 118,56 + Actor394: brik + Owner: GDI + Location: 119,56 + Actor395: brik + Owner: GDI + Location: 119,57 + Actor396: brik + Owner: GDI + Location: 118,57 + Actor397: brik + Owner: GDI + Location: 120,56 + Actor398: brik + Owner: GDI + Location: 121,56 + Actor399: brik + Owner: GDI + Location: 123,56 + Actor400: brik + Owner: GDI + Location: 122,56 + Actor401: brik + Owner: GDI + Location: 124,56 + Actor402: brik + Owner: GDI + Location: 125,56 + Actor403: brik + Owner: GDI + Location: 127,56 + Actor404: brik + Owner: GDI + Location: 126,56 + Actor405: brik + Owner: GDI + Location: 128,56 + Actor406: brik + Owner: GDI + Location: 128,57 + Actor407: brik + Owner: GDI + Location: 128,58 + Actor408: brik + Owner: GDI + Location: 128,59 + Actor409: brik + Owner: GDI + Location: 128,65 + Actor410: brik + Owner: GDI + Location: 128,64 + Actor411: brik + Owner: GDI + Location: 128,62 + Actor412: brik + Owner: GDI + Location: 128,61 + Actor413: brik + Owner: GDI + Location: 128,60 + Actor414: brik + Owner: GDI + Location: 128,63 + Actor415: brik + Owner: GDI + Location: 128,66 + Actor416: brik + Owner: GDI + Location: 128,67 + Actor417: brik + Owner: GDI + Location: 128,68 + Actor418: brik + Owner: GDI + Location: 128,69 + Actor419: brik + Owner: GDI + Location: 128,70 + Actor420: brik + Owner: GDI + Location: 107,78 + Actor421: brik + Owner: GDI + Location: 107,79 + Actor422: brik + Owner: GDI + Location: 108,79 + Actor423: brik + Owner: GDI + Location: 108,78 + Actor424: brik + Owner: GDI + Location: 109,79 + Actor425: brik + Owner: GDI + Location: 110,79 + Actor426: brik + Owner: GDI + Location: 111,79 + Actor427: brik + Owner: GDI + Location: 112,79 + Actor428: brik + Owner: GDI + Location: 113,79 + Actor429: brik + Owner: GDI + Location: 114,79 + Actor430: brik + Owner: GDI + Location: 115,79 + Actor431: brik + Owner: GDI + Location: 115,78 + Actor432: brik + Owner: GDI + Location: 115,77 + Actor433: brik + Owner: GDI + Location: 115,76 + Actor434: brik + Owner: GDI + Location: 116,79 + Actor435: brik + Owner: GDI + Location: 116,78 + Actor436: brik + Owner: GDI + Location: 115,75 + Actor437: brik + Owner: GDI + Location: 116,75 + Actor438: brik + Owner: GDI + Location: 116,76 + Actor439: brik + Owner: GDI + Location: 117,79 + Actor440: brik + Owner: GDI + Location: 118,79 + Actor441: brik + Owner: GDI + Location: 119,79 + Actor442: brik + Owner: GDI + Location: 120,79 + Actor443: brik + Owner: GDI + Location: 121,79 + Actor444: brik + Owner: GDI + Location: 122,79 + Actor445: brik + Owner: GDI + Location: 123,79 + Actor446: brik + Owner: GDI + Location: 125,79 + Actor447: brik + Owner: GDI + Location: 124,79 + Actor448: brik + Owner: GDI + Location: 126,79 + Actor449: brik + Owner: GDI + Location: 127,79 + Actor450: brik + Owner: GDI + Location: 128,79 + Actor451: brik + Owner: GDI + Location: 128,78 + Actor452: brik + Owner: GDI + Location: 128,77 + Actor453: brik + Owner: GDI + Location: 128,76 + Actor454: brik + Owner: GDI + Location: 128,75 + Actor455: brik + Owner: GDI + Location: 128,74 + Actor456: brik + Owner: GDI + Location: 128,73 + Actor457: brik + Owner: GDI + Location: 128,72 + Actor458: brik + Owner: GDI + Location: 128,71 + Actor459: afac + Owner: GDI + Location: 125,76 + Actor461: pyle + Owner: GDI + Location: 102,65 + Actor462: weap.td + Owner: GDI + Location: 99,73 + Actor464: nuk2 + Owner: GDI + Location: 126,72 + Actor465: nuk2 + Owner: GDI + Location: 126,69 + Actor466: nuk2 + Owner: GDI + Location: 126,66 + Actor467: nuk2 + Owner: GDI + Location: 126,63 + Actor468: nuk2 + Owner: GDI + Location: 126,60 + Actor470: nuk2 + Owner: GDI + Location: 118,76 + Actor471: nuk2 + Owner: GDI + Location: 120,76 + Actor472: nuk2 + Owner: GDI + Location: 122,76 + Actor469: gtwr + Owner: GDI + Location: 94,67 + Actor473: gtwr + Owner: GDI + Location: 94,72 + Actor474: gtwr + Owner: GDI + Location: 110,55 + Actor475: gtwr + Owner: GDI + Location: 115,55 + Actor476: gtwr + Owner: GDI + Location: 102,80 + Actor477: gtwr + Owner: GDI + Location: 107,80 + Actor478: atwr + Owner: GDI + Location: 96,77 + Actor479: atwr + Owner: GDI + Location: 96,74 + Actor480: atwr + Owner: GDI + Location: 96,65 + Actor481: atwr + Owner: GDI + Location: 101,57 + Actor482: atwr + Owner: GDI + Location: 108,57 + Actor483: atwr + Owner: GDI + Location: 117,57 + Actor484: atwr + Owner: GDI + Location: 109,78 + Actor485: atwr + Owner: GDI + Location: 100,78 + Actor486: atwr + Owner: GDI + Location: 100,62 + Actor487: cram + Owner: GDI + Location: 105,64 + Actor488: cram + Owner: GDI + Location: 104,57 + Actor489: cram + Owner: GDI + Location: 121,57 + Actor490: cram + Owner: GDI + Location: 116,77 + Actor491: cram + Owner: GDI + Location: 112,78 + Actor492: cram + Owner: GDI + Location: 98,78 + Actor493: cram + Owner: GDI + Location: 98,64 + Actor460: pyle + Owner: GDI + Location: 100,65 + Actor494: proc.td + Owner: GDI + Location: 105,72 + Actor495: proc.td + Owner: GDI + Location: 109,72 + Actor498: afld.gdi + Owner: GDI + Location: 115,60 + Actor499: afld.gdi + Owner: GDI + Location: 115,63 + Actor500: rep + Owner: GDI + Location: 110,60 + Actor463: weap.td + Owner: GDI + Location: 109,65 + Actor502: patr + Owner: GDI + Location: 103,59 + Actor503: silo.td + Owner: GDI + Location: 107,70 + Actor504: silo.td + Owner: GDI + Location: 110,70 + Actor505: nuk2 + Owner: GDI + Location: 123,60 + Actor506: nuk2 + Owner: GDI + Location: 120,60 + Actor507: nuk2 + Owner: GDI + Location: 123,63 + Actor508: nuk2 + Owner: GDI + Location: 120,63 + CommsCenter1: hq + Owner: GDI + Location: 115,68 + AdvancedComms: eye + Owner: GDI + Location: 118,68 + Actor501: gtek + Owner: GDI + Location: 121,68 + Actor509: nuk2 + Owner: GDI + Location: 120,73 + Actor510: nuk2 + Owner: GDI + Location: 122,73 + Actor511: nuk2 + Owner: GDI + Location: 118,73 + Actor512: chain + Owner: GDI + Location: 114,71 + Actor513: chain + Owner: GDI + Location: 114,70 + Actor514: chain + Owner: GDI + Location: 114,69 + Actor515: chain + Owner: GDI + Location: 114,68 + Actor516: chain + Owner: GDI + Location: 114,67 + Actor517: chain + Owner: GDI + Location: 116,67 + Actor518: chain + Owner: GDI + Location: 115,67 + Actor519: chain + Owner: GDI + Location: 117,67 + Actor520: chain + Owner: GDI + Location: 118,67 + Actor521: chain + Owner: GDI + Location: 119,67 + Actor522: chain + Owner: GDI + Location: 121,67 + Actor523: chain + Owner: GDI + Location: 120,67 + Actor524: chain + Owner: GDI + Location: 122,67 + Actor525: chain + Owner: GDI + Location: 123,67 + Actor526: chain + Owner: GDI + Location: 124,67 + Actor527: chain + Owner: GDI + Location: 124,68 + Actor528: chain + Owner: GDI + Location: 124,69 + Actor529: chain + Owner: GDI + Location: 124,70 + Actor530: chain + Owner: GDI + Location: 124,71 + Actor531: chain + Owner: GDI + Location: 115,71 + Actor532: chain + Owner: GDI + Location: 116,71 + Actor533: chain + Owner: GDI + Location: 121,71 + Actor534: chain + Owner: GDI + Location: 122,71 + Actor535: chain + Owner: GDI + Location: 123,71 + Actor536: cram + Owner: GDI + Location: 117,66 + Actor537: cram + Owner: GDI + Location: 105,70 + Actor538: split2 + Owner: Neutral + Location: 107,87 + Actor539: split2 + Owner: Neutral + Location: 112,84 + Actor540: split2 + Owner: Neutral + Location: 119,85 + Actor541: split2 + Owner: Neutral + Location: 100,86 + Actor542: split2 + Owner: Neutral + Location: 116,90 + Actor543: split2 + Owner: Neutral + Location: 96,90 + Actor544: mtnk + Owner: GDI + Location: 20,44 + Facing: 896 + Actor545: mtnk + Owner: GDI + Location: 27,44 + Facing: 896 + Actor546: mtnk + Owner: GDI + Location: 30,45 + Facing: 896 + Actor547: vulc.ai + Owner: GDI + Location: 26,47 + Facing: 0 + Actor548: vulc.ai + Owner: GDI + Location: 21,45 + Facing: 896 + Actor549: htnk.ion + Owner: GDI + Location: 25,51 + Facing: 0 + Actor550: wolv + Owner: GDI + Location: 23,50 + Facing: 0 + Actor551: n1r1 + Owner: GDI + SubCell: 3 + Location: 27,48 + Facing: 753 + Actor552: n1r1 + Owner: GDI + Location: 27,48 + SubCell: 1 + Facing: 951 + Actor553: n1r1 + Owner: GDI + Location: 23,45 + SubCell: 3 + Facing: 840 + Actor554: n1r1 + Owner: GDI + SubCell: 3 + Location: 23,42 + Facing: 682 + Actor555: n1r1 + Owner: GDI + Location: 23,42 + SubCell: 1 + Facing: 919 + Actor556: n1r1 + Owner: GDI + SubCell: 3 + Location: 21,40 + Facing: 713 + Actor557: n1r1 + Owner: GDI + SubCell: 3 + Location: 26,39 + Facing: 816 + Actor558: n1r1 + Owner: GDI + SubCell: 3 + Location: 31,45 + Facing: 856 + Actor559: n1r1 + Owner: GDI + Location: 31,45 + SubCell: 1 + Facing: 864 + Actor560: n1r1 + Owner: GDI + SubCell: 3 + Location: 28,44 + Facing: 0 + Actor561: n1r1 + Owner: GDI + SubCell: 3 + Location: 28,55 + Facing: 578 + Actor562: n1r1 + Owner: GDI + Facing: 384 + Location: 28,55 + SubCell: 1 + Actor563: n1r1 + Owner: GDI + Location: 32,45 + SubCell: 3 + Facing: 0 + Actor564: n3 + Owner: GDI + Location: 19,45 + SubCell: 3 + Facing: 864 + Actor565: n3 + Owner: GDI + SubCell: 3 + Location: 18,43 + Facing: 721 + Actor566: n3 + Owner: GDI + Location: 18,43 + SubCell: 1 + Facing: 832 + Actor567: n3 + Owner: GDI + SubCell: 3 + Location: 30,47 + Facing: 0 + Actor568: medi + Owner: GDI + SubCell: 3 + Facing: 384 + Location: 28,47 + Actor569: syrd + Owner: China + Location: 67,6 + Actor570: brik + Location: 46,0 + Owner: ChinaWalls + Actor612: sam + Owner: China + Location: 54,27 + Actor613: sam + Owner: China + Location: 44,27 + Actor614: dd + Owner: China + Location: 70,4 + Facing: 634 + Actor615: dd + Owner: China + Location: 73,5 + Facing: 642 + Actor616: asianhut + Owner: Neutral + Location: 22,5 + Actor617: v16 + Owner: Neutral + Location: 32,7 + Actor618: v16 + Owner: Neutral + Location: 33,7 + Actor619: tc01 + Owner: Neutral + Location: 49,9 + Actor620: t15 + Owner: Neutral + Location: 54,11 + Actor622: t05 + Owner: Neutral + Location: 62,14 + Actor623: t17 + Owner: Neutral + Location: 60,20 + Actor624: t12 + Owner: Neutral + Location: 40,11 + Actor625: t05 + Owner: Neutral + Location: 37,32 + Actor626: tc03 + Owner: Neutral + Location: 25,35 + Actor627: t11 + Owner: Neutral + Location: 12,37 + Actor628: t06 + Owner: Neutral + Location: 13,34 + NavalYard: syrd.gdi + Owner: GDI + Location: 77,92 + Carrier1: cv + Owner: GDI + Location: 51,94 + Facing: 256 + Actor632: dd2 + Owner: GDI + Location: 49,92 + Facing: 256 + Actor635: pt2 + Owner: GDI + Location: 69,93 + Facing: 256 + Actor633: dd2 + Owner: GDI + Facing: 256 + Location: 56,92 + Actor634: dd2 + Owner: GDI + Facing: 256 + Location: 62,93 + Actor636: atwr + Owner: GDI + Location: 69,46 + Actor637: atwr + Owner: GDI + Location: 65,52 + Actor638: atwr + Owner: GDI + Location: 53,68 + Actor639: atwr + Owner: GDI + Location: 61,72 + Actor640: cram + Owner: GDI + Location: 57,67 + Actor641: cram + Owner: GDI + Location: 63,69 + Actor642: cram + Owner: GDI + Location: 69,51 + Actor643: barb + Owner: GDI + Location: 69,50 + Actor644: barb + Owner: GDI + Location: 68,50 + Actor645: barb + Owner: GDI + Location: 68,51 + Actor646: barb + Owner: GDI + Location: 68,52 + Actor647: barb + Owner: GDI + Location: 69,52 + Actor648: barb + Owner: GDI + Location: 70,52 + Actor649: barb + Owner: GDI + Location: 70,51 + Actor650: barb + Owner: GDI + Location: 70,50 + Actor651: barb + Owner: GDI + Location: 62,68 + Actor652: barb + Owner: GDI + Location: 62,69 + Actor653: barb + Owner: GDI + Location: 62,70 + Actor654: barb + Owner: GDI + Location: 64,70 + Actor655: barb + Owner: GDI + Location: 63,70 + Actor656: barb + Owner: GDI + Location: 64,69 + Actor657: barb + Owner: GDI + Location: 64,68 + Actor658: barb + Owner: GDI + Location: 63,68 + Actor659: barb + Owner: GDI + Location: 56,66 + Actor660: barb + Owner: GDI + Location: 57,66 + Actor661: barb + Owner: GDI + Location: 58,66 + Actor662: barb + Owner: GDI + Location: 58,67 + Actor663: barb + Owner: GDI + Location: 56,67 + Actor664: barb + Owner: GDI + Location: 57,68 + Actor665: barb + Owner: GDI + Location: 56,68 + Actor666: barb + Owner: GDI + Location: 58,68 + Actor667: split2 + Owner: Neutral + Location: 20,84 + Actor668: split2 + Owner: Neutral + Location: 24,79 + Actor670: split2 + Owner: Neutral + Location: 84,38 + Actor671: split2 + Owner: Neutral + Location: 80,34 + Actor672: split2 + Owner: Neutral + Location: 109,14 + Actor673: split2 + Owner: Neutral + Location: 112,10 + Actor674: proc.td + Owner: GDI + Location: 121,10 + Actor675: sbag + Owner: GDI + Location: 120,16 + Actor676: sbag + Owner: GDI + Location: 121,16 + Actor677: sbag + Owner: GDI + Location: 122,16 + Actor678: sbag + Owner: GDI + Location: 123,16 + Actor679: sbag + Owner: GDI + Location: 124,16 + Actor680: sbag + Owner: GDI + Location: 124,15 + Actor681: sbag + Owner: GDI + Location: 124,14 + Actor682: sbag + Owner: GDI + Location: 124,13 + Actor683: sbag + Owner: GDI + Location: 124,12 + Actor684: sbag + Owner: GDI + Location: 124,11 + Actor685: sbag + Owner: GDI + Location: 124,10 + Actor686: sbag + Owner: GDI + Location: 124,9 + Actor687: sbag + Owner: GDI + Location: 123,9 + Actor688: sbag + Owner: GDI + Location: 122,9 + Actor689: sbag + Owner: GDI + Location: 121,9 + Actor690: sbag + Owner: GDI + Location: 120,9 + Actor691: sbag + Owner: GDI + Location: 119,16 + Actor692: sbag + Owner: GDI + Location: 119,15 + Actor693: gtwr + Owner: GDI + Location: 118,15 + CommsCenter2: hq + Owner: GDI + Location: 121,32 + Actor695: chain + Owner: GDI + Location: 120,32 + Actor696: chain + Owner: GDI + Location: 120,33 + Actor697: chain + Owner: GDI + Location: 120,34 + Actor698: chain + Owner: GDI + Location: 120,35 + Actor699: chain + Owner: GDI + Location: 120,36 + Actor700: chain + Owner: GDI + Location: 121,36 + Actor701: chain + Owner: GDI + Location: 122,36 + Actor702: chain + Owner: GDI + Location: 120,31 + Actor703: chain + Owner: GDI + Location: 121,31 + Actor704: chain + Owner: GDI + Location: 122,31 + Actor705: chain + Owner: GDI + Location: 123,31 + Actor706: chain + Owner: GDI + Location: 124,31 + Actor707: chain + Owner: GDI + Location: 123,36 + Actor708: chain + Owner: GDI + Location: 124,36 + Actor709: chain + Owner: GDI + Location: 127,31 + Actor710: chain + Owner: GDI + Location: 128,31 + Actor711: chain + Owner: GDI + Location: 128,32 + Actor712: chain + Owner: GDI + Location: 128,33 + Actor713: chain + Owner: GDI + Location: 128,34 + Actor714: chain + Owner: GDI + Location: 128,35 + Actor715: chain + Owner: GDI + Location: 128,36 + Actor716: chain + Owner: GDI + Location: 127,36 + Actor717: gtwr + Owner: GDI + Location: 123,30 + Actor718: gtwr + Owner: GDI + Location: 125,39 + Actor719: hpad.td + Owner: GDI + Location: 58,50 + Actor720: hpad.td + Owner: GDI + Location: 60,50 + Actor721: brik + Owner: GDI + Location: 57,49 + Actor722: brik + Owner: GDI + Location: 58,49 + Actor723: brik + Owner: GDI + Location: 59,49 + Actor724: brik + Owner: GDI + Location: 60,49 + Actor725: brik + Owner: GDI + Location: 61,49 + Actor726: brik + Owner: GDI + Location: 62,49 + Actor727: brik + Owner: GDI + Location: 62,50 + Actor728: brik + Owner: GDI + Location: 62,51 + Actor729: brik + Owner: GDI + Location: 62,52 + Actor730: brik + Owner: GDI + Location: 62,53 + Actor731: brik + Owner: GDI + Location: 62,54 + Actor732: brik + Owner: GDI + Location: 61,54 + Actor733: brik + Owner: GDI + Location: 61,53 + Actor734: brik + Owner: GDI + Location: 57,50 + Actor735: brik + Owner: GDI + Location: 57,51 + Actor736: brik + Owner: GDI + Location: 57,52 + Actor737: brik + Owner: GDI + Location: 57,53 + Actor738: brik + Owner: GDI + Location: 57,54 + Actor739: brik + Owner: GDI + Location: 58,54 + Actor740: brik + Owner: GDI + Location: 58,53 + Actor743: sbag + Owner: GDI + Location: 15,81 + Actor744: sbag + Owner: GDI + Location: 14,81 + Actor745: sbag + Owner: GDI + Location: 13,81 + Actor746: sbag + Owner: GDI + Location: 12,81 + Actor747: sbag + Owner: GDI + Location: 11,81 + Actor748: sbag + Owner: GDI + Location: 10,81 + Actor749: sbag + Owner: GDI + Location: 10,82 + Actor750: sbag + Owner: GDI + Location: 10,83 + Actor751: sbag + Owner: GDI + Location: 10,84 + Actor752: sbag + Owner: GDI + Location: 10,85 + Actor753: sbag + Owner: GDI + Location: 10,86 + Actor754: sbag + Owner: GDI + Location: 10,87 + Actor755: sbag + Owner: GDI + Location: 11,87 + Actor756: sbag + Owner: GDI + Location: 12,87 + Actor757: sbag + Owner: GDI + Location: 13,87 + Actor758: sbag + Owner: GDI + Location: 14,87 + Actor759: sbag + Owner: GDI + Location: 15,87 + Actor760: sbag + Owner: GDI + Location: 16,87 + Actor741: proc.td + Owner: GDI + Location: 11,83 + Actor742: silo.td + Owner: GDI + Location: 11,82 + Actor761: silo.td + Owner: GDI + Location: 13,82 + Actor762: sbag + Owner: GDI + Location: 16,81 + Actor763: sbag + Owner: GDI + Location: 16,82 + Actor764: sbag + Owner: GDI + Location: 16,86 + Actor765: gtwr + Owner: GDI + Location: 16,80 + Actor766: gtwr + Owner: GDI + Location: 17,87 + Actor767: atwr + Owner: GDI + Location: 118,32 + Actor768: atwr + Owner: GDI + Location: 93,41 + Actor769: atwr + Owner: GDI + Location: 93,35 + Actor770: brik + Owner: GDI + Location: 93,34 + Actor771: brik + Owner: GDI + Location: 92,34 + Actor772: brik + Owner: GDI + Location: 92,35 + Actor773: brik + Owner: GDI + Location: 92,36 + Actor774: brik + Owner: GDI + Location: 93,36 + Actor775: brik + Owner: GDI + Location: 94,36 + Actor776: brik + Owner: GDI + Location: 94,35 + Actor777: brik + Owner: GDI + Location: 94,34 + Actor778: brik + Owner: GDI + Location: 92,40 + Actor779: brik + Owner: GDI + Location: 92,41 + Actor780: brik + Owner: GDI + Location: 92,42 + Actor781: brik + Owner: GDI + Location: 93,42 + Actor782: brik + Owner: GDI + Location: 94,42 + Actor783: brik + Owner: GDI + Location: 93,40 + Actor784: brik + Owner: GDI + Location: 94,40 + Actor785: brik + Owner: GDI + Location: 94,41 + Actor786: gtwr + Owner: GDI + Location: 89,47 + Actor787: gtwr + Owner: GDI + Location: 68,77 + Actor788: gtwr + Owner: GDI + Location: 70,81 + Actor789: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 93,67 + Actor790: n1 + Owner: GDI + Location: 94,66 + SubCell: 3 + Facing: 166 + Actor791: n1 + Owner: GDI + SubCell: 3 + Location: 93,72 + Facing: 174 + Actor792: n1 + Owner: GDI + Facing: 384 + Location: 93,73 + SubCell: 3 + Actor793: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 99,67 + Actor794: n1 + Owner: GDI + SubCell: 3 + Location: 98,66 + Facing: 261 + Actor795: n1 + Owner: GDI + SubCell: 3 + Location: 106,65 + Facing: 523 + Actor796: n1 + Owner: GDI + Facing: 384 + Location: 106,59 + SubCell: 3 + Actor797: n1 + Owner: GDI + SubCell: 3 + Location: 107,61 + Facing: 539 + Actor798: n1 + Owner: GDI + SubCell: 3 + Location: 118,58 + Facing: 245 + Actor799: n1 + Owner: GDI + SubCell: 3 + Location: 116,72 + Facing: 602 + Actor800: n1 + Owner: GDI + Facing: 384 + Location: 122,72 + SubCell: 3 + Actor801: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 117,71 + Actor802: n1 + Owner: GDI + SubCell: 3 + Location: 102,77 + Facing: 658 + Actor803: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 108,73 + Actor804: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 109,69 + Actor805: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 59,68 + Actor806: n1 + Owner: GDI + SubCell: 3 + Location: 64,67 + Facing: 626 + Actor807: n1 + Owner: GDI + SubCell: 3 + Location: 64,71 + Facing: 674 + Actor808: n1 + Owner: GDI + Facing: 384 + Location: 69,78 + SubCell: 3 + Actor809: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 67,76 + Actor810: n1 + Owner: GDI + Facing: 384 + Location: 71,81 + SubCell: 3 + Actor811: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 70,80 + Actor812: n1 + Owner: GDI + SubCell: 3 + Location: 15,82 + Facing: 245 + Actor814: n1 + Owner: GDI + SubCell: 3 + Location: 12,80 + Facing: 1023 + Actor815: n1 + Owner: GDI + SubCell: 3 + Location: 18,89 + Facing: 658 + Actor816: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 65,35 + Actor817: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 64,36 + Actor818: n1 + Owner: GDI + SubCell: 3 + Location: 65,40 + Facing: 142 + Actor819: n1 + Owner: GDI + SubCell: 3 + Location: 58,56 + Facing: 253 + Actor820: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 59,57 + Actor821: n1 + Owner: GDI + SubCell: 3 + Location: 69,53 + Facing: 634 + Actor822: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 67,50 + Actor823: n1 + Owner: GDI + SubCell: 3 + Location: 124,37 + Facing: 384 + Actor824: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 127,37 + Actor825: n1 + Owner: GDI + SubCell: 3 + Location: 124,30 + Facing: 0 + Actor826: n1 + Owner: GDI + SubCell: 3 + Location: 127,30 + Facing: 126 + Actor827: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 118,17 + Actor828: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 119,18 + Actor829: n1 + Owner: GDI + Facing: 384 + Location: 118,17 + SubCell: 1 + Actor830: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 78,89 + Actor831: n3 + Owner: GDI + Location: 100,64 + SubCell: 3 + Facing: 674 + Actor832: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 97,72 + Actor833: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 114,75 + Actor834: n3 + Owner: GDI + SubCell: 3 + Location: 60,69 + Facing: 586 + Actor835: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 69,77 + Actor836: n3 + Owner: GDI + SubCell: 3 + Location: 14,83 + Facing: 793 + Actor837: n3 + Owner: GDI + SubCell: 3 + Location: 66,37 + Facing: 285 + Actor838: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 62,56 + Actor839: n3 + Owner: GDI + SubCell: 3 + Location: 72,50 + Facing: 384 + Actor840: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 97,34 + Actor841: n3 + Owner: GDI + SubCell: 3 + Location: 126,34 + Facing: 911 + Actor842: ztrp + Owner: GDI + SubCell: 3 + Location: 91,36 + Facing: 285 + Actor843: ztrp + Owner: GDI + SubCell: 3 + Location: 91,40 + Facing: 229 + Actor844: ztrp + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 123,32 + Actor845: ztrp + Owner: GDI + Location: 120,70 + SubCell: 3 + Facing: 483 + Actor846: ztrp + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 113,68 + Actor847: ztrp + Owner: GDI + SubCell: 3 + Location: 116,58 + Facing: 15 + Actor848: ztrp + Owner: GDI + SubCell: 3 + Location: 104,67 + Facing: 674 + Actor849: htnk + Owner: GDI + Location: 94,69 + Facing: 253 + Actor850: htnk + Owner: GDI + Location: 102,75 + Facing: 761 + Actor851: htnk + Owner: GDI + Location: 91,38 + Facing: 245 + Actor852: htnk + Owner: GDI + Location: 48,60 + Facing: 911 + Actor853: htnk + Owner: GDI + Location: 89,50 + Facing: 128 + Actor854: msam + Owner: GDI + Facing: 384 + Location: 97,75 + Actor855: msam + Owner: GDI + Facing: 384 + Location: 66,54 + Actor856: msam + Owner: GDI + Facing: 384 + Location: 95,42 + Actor857: msam + Owner: GDI + Location: 107,58 + Facing: 95 + Actor858: vulc.ai + Owner: GDI + Facing: 384 + Location: 104,62 + Actor859: vulc.ai + Owner: GDI + Location: 108,66 + Facing: 103 + Actor860: vulc.ai + Owner: GDI + Facing: 384 + Location: 124,72 + Actor861: vulc.ai + Owner: GDI + Location: 124,58 + Facing: 134 + Actor862: apc2.gdiai + Owner: GDI + Facing: 384 + Location: 70,77 + Actor863: mtnk + Owner: GDI + Location: 56,78 + Facing: 253 + Actor864: mtnk + Owner: GDI + Location: 58,78 + Facing: 253 + Actor865: hmmv + Owner: GDI + Facing: 384 + Location: 65,36 + Actor866: hmmv + Owner: GDI + Location: 15,83 + Facing: 761 + Actor867: hmmv + Owner: GDI + Location: 57,80 + Facing: 261 + Actor868: mtnk + Owner: GDI + Facing: 384 + Location: 117,18 + Actor869: mtnk + Owner: GDI + Facing: 384 + Location: 114,17 + Actor870: mtnk + Owner: GDI + Location: 121,28 + Facing: 111 + Actor871: t13 + Owner: Neutral + Location: 52,41 + Actor872: t13 + Owner: Neutral + Location: 54,84 + Actor873: t13 + Owner: Neutral + Location: 77,64 + Actor874: t13 + Owner: Neutral + Location: 73,45 + Actor875: t13 + Owner: Neutral + Location: 100,40 + Actor876: t13 + Owner: Neutral + Location: 124,18 + Actor877: t13 + Owner: Neutral + Location: 85,85 + Actor878: t10 + Owner: Neutral + Location: 93,60 + Actor879: t10 + Owner: Neutral + Location: 102,36 + Actor880: t10 + Owner: Neutral + Location: 67,33 + Actor881: t10 + Owner: Neutral + Location: 42,34 + Actor882: t10 + Owner: Neutral + Location: 43,50 + Actor883: t10 + Owner: Neutral + Location: 45,75 + Actor884: t10 + Owner: Neutral + Location: 17,64 + Actor885: t10 + Owner: Neutral + Location: 6,66 + Actor887: t16 + Owner: Neutral + Location: 100,29 + Actor888: t16 + Owner: Neutral + Location: 123,45 + Actor889: t16 + Owner: Neutral + Location: 64,30 + Actor890: t16 + Owner: Neutral + Location: 71,54 + Actor892: t16 + Owner: Neutral + Location: 75,78 + Actor893: t16 + Owner: Neutral + Location: 47,82 + Actor894: t16 + Owner: Neutral + Location: 35,65 + Actor895: t16 + Owner: Neutral + Location: 24,70 + Actor896: t16 + Owner: Neutral + Location: 5,40 + Actor897: t16 + Owner: Neutral + Location: 51,44 + Actor898: t16 + Owner: Neutral + Location: 86,94 + Actor899: t16 + Owner: Neutral + Location: 95,59 + Actor900: t01 + Owner: Neutral + Location: 116,40 + Actor901: t01 + Owner: Neutral + Location: 104,38 + Actor902: t01 + Owner: Neutral + Location: 102,24 + Actor903: t01 + Owner: Neutral + Location: 56,31 + Actor904: t01 + Owner: Neutral + Location: 49,39 + Actor905: t01 + Owner: Neutral + Location: 49,65 + Actor906: t01 + Owner: Neutral + Location: 79,74 + Actor907: t01 + Owner: Neutral + Location: 84,90 + Actor908: t01 + Owner: Neutral + Location: 37,75 + Actor910: t01 + Owner: Neutral + Location: 14,65 + Actor911: t01 + Owner: Neutral + Location: 11,38 + Actor912: t01 + Owner: Neutral + Location: 4,27 + Actor913: t01 + Owner: Neutral + Location: 46,57 + Actor916: t02 + Owner: Neutral + Location: 36,52 + Actor917: t02 + Owner: Neutral + Location: 10,31 + Actor918: t02 + Owner: Neutral + Location: 56,35 + Actor919: t02 + Owner: Neutral + Location: 80,44 + Actor920: t02 + Owner: Neutral + Location: 76,59 + Actor921: t02 + Owner: Neutral + Location: 86,71 + Actor922: t02 + Owner: Neutral + Location: 85,89 + Actor923: t02 + Owner: Neutral + Location: 74,83 + Actor924: t02 + Owner: Neutral + Location: 44,77 + Actor925: t02 + Owner: Neutral + Location: 40,59 + Actor928: t02 + Owner: Neutral + Location: 104,26 + Actor929: t02 + Owner: Neutral + Location: 125,7 + Actor930: t02 + Owner: Neutral + Location: 85,27 + Actor931: t03 + Owner: Neutral + Location: 91,29 + Actor932: t03 + Owner: Neutral + Location: 116,27 + Actor933: t03 + Owner: Neutral + Location: 115,48 + Actor934: t03 + Owner: Neutral + Location: 88,56 + Actor935: t03 + Owner: Neutral + Location: 87,91 + Actor936: t03 + Owner: Neutral + Location: 52,82 + Actor937: t03 + Owner: Neutral + Location: 22,71 + Actor938: t03 + Owner: Neutral + Location: 17,35 + Actor939: t03 + Owner: Neutral + Location: 37,39 + Actor940: t05 + Owner: Neutral + Location: 38,48 + Actor941: t05 + Owner: Neutral + Location: 63,45 + Actor942: t05 + Owner: Neutral + Location: 79,52 + Actor943: t05 + Owner: Neutral + Location: 108,47 + Actor944: t05 + Owner: Neutral + Location: 127,18 + Actor945: t05 + Owner: Neutral + Location: 87,70 + Actor946: t05 + Owner: Neutral + Location: 73,76 + Actor947: t05 + Owner: Neutral + Location: 72,64 + Actor948: t05 + Owner: Neutral + Location: 54,61 + Actor949: t05 + Owner: Neutral + Location: 43,76 + Actor950: t06 + Owner: Neutral + Location: 63,81 + Actor951: t06 + Owner: Neutral + Location: 51,71 + Actor952: t06 + Owner: Neutral + Location: 49,80 + Actor953: t06 + Owner: Neutral + Location: 49,47 + Actor954: t06 + Owner: Neutral + Location: 59,42 + Actor955: t06 + Owner: Neutral + Location: 74,43 + Actor956: t06 + Owner: Neutral + Location: 110,28 + Actor957: t06 + Owner: Neutral + Location: 101,39 + Actor958: t06 + Owner: Neutral + Location: 124,48 + Actor959: t06 + Owner: Neutral + Location: 106,53 + Actor960: t06 + Owner: Neutral + Location: 94,51 + Actor961: t06 + Owner: Neutral + Location: 91,91 + Actor962: t06 + Owner: Neutral + Location: 97,95 + Actor965: tc01 + Owner: Neutral + Location: 36,64 + Actor966: tc01 + Owner: Neutral + Location: 45,43 + Actor967: tc01 + Owner: Neutral + Location: 78,60 + Actor968: tc01 + Owner: Neutral + Location: 83,79 + Actor969: tc01 + Owner: Neutral + Location: 104,20 + Actor970: tc01 + Owner: Neutral + Location: 88,25 + Actor971: tc02 + Owner: Neutral + Location: 101,17 + Actor972: tc02 + Owner: Neutral + Location: 125,10 + Actor973: tc02 + Owner: Neutral + Location: 125,53 + Actor974: tc02 + Owner: Neutral + Location: 94,45 + Actor975: tc02 + Owner: Neutral + Location: 86,53 + Actor976: tc02 + Owner: Neutral + Location: 54,63 + Actor977: tc02 + Owner: Neutral + Location: 31,73 + Actor978: tc02 + Owner: Neutral + Location: 7,29 + Actor979: tc04 + Owner: Neutral + Location: 6,39 + Actor980: tc04 + Owner: Neutral + Location: 123,22 + Actor982: tc04 + Owner: Neutral + Location: 4,61 + Actor983: tc05 + Owner: Neutral + Location: 93,25 + Actor984: tc05 + Owner: Neutral + Location: 65,16 + Actor985: tc05 + Owner: Neutral + Location: 43,80 + Actor987: tc05 + Owner: Neutral + Location: 2,32 + Actor988: v06 + Owner: Neutral + Location: 4,37 + Actor989: asianhut + Owner: Neutral + Location: 71,38 + Actor990: v18 + Owner: Neutral + Location: 7,36 + Actor991: v18 + Owner: Neutral + Location: 9,36 + Actor992: v18 + Owner: Neutral + Location: 8,35 + Actor993: v18 + Owner: Neutral + Location: 9,35 + Actor994: wood + Owner: Neutral + Location: 7,34 + Actor995: wood + Owner: Neutral + Location: 8,34 + Actor996: wood + Owner: Neutral + Location: 9,34 + Actor997: wood + Owner: Neutral + Location: 10,34 + Actor998: wood + Owner: Neutral + Location: 11,34 + Actor999: wood + Owner: Neutral + Location: 10,35 + Actor1000: wood + Owner: Neutral + Location: 10,36 + Actor1001: wood + Owner: Neutral + Location: 12,34 + Actor1002: wood + Owner: Neutral + Location: 3,37 + Actor1003: wood + Owner: Neutral + Location: 3,36 + Actor1004: wood + Owner: Neutral + Location: 4,38 + Actor1005: wood + Owner: Neutral + Location: 3,38 + Actor1006: rice + Owner: Neutral + Location: 4,36 + Actor1007: rice + Owner: Neutral + Location: 11,35 + Actor1008: brl3 + Owner: Neutral + Location: 10,33 + Actor1009: ice01 + Owner: Neutral + Location: 72,60 + Actor1011: e1 + Owner: USSR + SubCell: 3 + Location: 9,8 + Facing: 768 + Actor1012: e1 + Owner: USSR + SubCell: 3 + Facing: 768 + Location: 12,8 + Actor1013: e1 + Owner: USSR + Location: 9,8 + SubCell: 1 + Facing: 768 + Actor1014: e1 + Owner: USSR + SubCell: 3 + Location: 9,12 + Facing: 768 + Actor1015: e1 + Owner: USSR + SubCell: 3 + Location: 4,7 + Facing: 768 + Actor1017: n3 + Owner: USSR + Location: 7,7 + SubCell: 2 + Facing: 768 + Actor1010: e1 + Owner: USSR + SubCell: 3 + Facing: 768 + Location: 7,7 + Actor1016: e3 + Owner: USSR + SubCell: 3 + Location: 4,10 + Facing: 768 + Actor1018: medi + Owner: GDI + Facing: 384 + Location: 99,67 + SubCell: 1 + Actor1019: medi + Owner: GDI + Facing: 384 + SubCell: 1 + Location: 71,81 + Actor1020: medi + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 61,68 + Actor1021: n1 + Owner: GDI + SubCell: 3 + Location: 95,61 + Facing: 261 + Actor1022: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 88,55 + Actor1023: n1 + Owner: GDI + SubCell: 3 + Location: 98,50 + Facing: 384 + Actor1024: n1 + Owner: GDI + SubCell: 3 + Location: 89,54 + Facing: 785 + Actor1025: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 90,47 + Actor1026: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 85,49 + Actor1027: n1 + Owner: GDI + SubCell: 3 + Location: 50,62 + Facing: 166 + Actor1028: n1 + Owner: GDI + SubCell: 3 + Location: 47,62 + Facing: 0 + Actor1032: e1 + Owner: USSR + SubCell: 3 + Facing: 768 + Location: 3,10 + Actor1033: e1 + Owner: USSR + SubCell: 1 + Facing: 768 + Location: 3,10 + Actor1034: e1 + Owner: USSR + SubCell: 3 + Facing: 768 + Location: 14,9 + Actor1035: e1 + Owner: USSR + SubCell: 1 + Facing: 768 + Location: 14,9 + Actor1036: e1 + Owner: USSR + SubCell: 3 + Facing: 768 + Location: 15,9 + McvSpawn: waypoint + Owner: Neutral + Location: 1,9 + McvRally: waypoint + Owner: Neutral + Location: 8,9 + GDIOutpostFlare: waypoint + Owner: Neutral + Location: 25,43 + Actor1037: e1 + Owner: China + SubCell: 3 + Facing: 0 + Location: 21,15 + Actor1038: e1 + Owner: China + SubCell: 3 + Facing: 0 + Location: 27,15 + Actor1047: barb + Location: 46,5 + Owner: ChinaWalls + Actor1048: sam + Owner: China + Location: 47,5 + Actor1049: pbox + Owner: China + Location: 50,5 + Actor1055: e1 + Owner: China + Facing: 384 + SubCell: 3 + Location: 51,6 + Actor1066: pbox + Owner: China + Location: 54,5 + Actor1067: sam + Owner: China + Location: 57,5 + Actor1069: e1 + Owner: China + Facing: 384 + SubCell: 3 + Location: 53,6 + Actor1076: e4 + Owner: China + Facing: 384 + SubCell: 3 + Location: 56,7 + Actor1080: apwr + Owner: China + Location: 56,1 + Actor1081: apwr + Owner: China + Location: 59,1 + Actor1082: apwr + Owner: China + Location: 62,1 + Actor1083: powr + Owner: China + Location: 47,1 + Actor1084: n1 + Owner: GDI + SubCell: 3 + Facing: 0 + Location: 47,57 + Actor1085: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 56,50 + Actor1086: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 59,48 + Actor1087: t02 + Owner: Neutral + Location: 65,63 + Actor1088: t01 + Owner: Neutral + Location: 69,61 + Actor1089: t16 + Owner: Neutral + Location: 62,62 + Path3_1: waypoint + Owner: Neutral + Location: 112,37 + Path1_1: waypoint + Owner: Neutral + Location: 87,77 + Path2_1: waypoint + Owner: Neutral + Location: 94,54 + Path1_2: waypoint + Owner: Neutral + Location: 45,72 + Path2_2: waypoint + Owner: Neutral + Location: 77,40 + Path3_2: waypoint + Owner: Neutral + Location: 58,39 + Actor1090: camera + Owner: GDI + Location: 25,62 + Actor1091: camera + Owner: GDI + Location: 65,38 + Actor1092: camera + Owner: GDI + Location: 39,42 + Actor1093: camera + Owner: GDI + Location: 54,57 + Actor1094: camera + Owner: GDI + Location: 42,72 + Actor1095: chain + Owner: ChinaWalls + Location: 20,19 + Actor1096: chain + Owner: ChinaWalls + Location: 19,19 + Actor1097: chain + Owner: ChinaWalls + Location: 18,19 + Actor1098: chain + Owner: ChinaWalls + Location: 17,19 + Actor1099: chain + Owner: ChinaWalls + Location: 17,20 + Actor1100: chain + Owner: ChinaWalls + Location: 17,21 + Actor1101: chain + Owner: ChinaWalls + Location: 17,22 + Actor1102: chain + Owner: ChinaWalls + Location: 17,23 + Actor1103: chain + Owner: ChinaWalls + Location: 17,24 + Actor1104: chain + Owner: ChinaWalls + Location: 17,25 + Actor1105: chain + Owner: ChinaWalls + Location: 17,26 + Actor1106: chain + Owner: ChinaWalls + Location: 17,27 + Actor1107: chain + Owner: ChinaWalls + Location: 18,27 + Actor1108: chain + Owner: ChinaWalls + Location: 19,27 + Actor1109: chain + Owner: ChinaWalls + Location: 20,27 + Actor1110: chain + Owner: ChinaWalls + Location: 21,27 + Actor1111: chain + Owner: ChinaWalls + Location: 22,27 + Actor1112: chain + Owner: ChinaWalls + Location: 23,27 + Actor1113: chain + Owner: ChinaWalls + Location: 24,27 + Actor1114: chain + Owner: ChinaWalls + Location: 25,27 + Actor1115: chain + Owner: ChinaWalls + Location: 27,27 + Actor1116: chain + Owner: ChinaWalls + Location: 28,27 + Actor1117: chain + Owner: ChinaWalls + Location: 29,27 + Actor1118: chain + Owner: ChinaWalls + Location: 30,27 + Actor1122: chain + Owner: ChinaWalls + Location: 28,19 + Actor1123: chain + Owner: ChinaWalls + Location: 27,19 + Actor1124: chain + Owner: ChinaWalls + Location: 29,19 + Actor1125: chain + Owner: ChinaWalls + Location: 30,19 + Actor1126: chain + Owner: ChinaWalls + Location: 31,19 + Actor1127: chain + Owner: ChinaWalls + Location: 31,20 + Actor1128: chain + Owner: ChinaWalls + Location: 31,21 + Actor1129: chain + Owner: ChinaWalls + Location: 31,22 + Actor1130: chain + Owner: ChinaWalls + Location: 31,23 + Actor1131: chain + Owner: ChinaWalls + Location: 31,24 + Actor1121: chain + Owner: ChinaWalls + Location: 31,25 + Actor1120: chain + Owner: ChinaWalls + Location: 31,26 + Actor1119: chain + Owner: ChinaWalls + Location: 31,27 + Actor1132: chain + Owner: ChinaWalls + Location: 46,18 + Actor1133: chain + Owner: ChinaWalls + Location: 45,18 + Actor1134: chain + Owner: ChinaWalls + Location: 45,19 + Actor1135: chain + Owner: ChinaWalls + Location: 45,20 + Actor1136: chain + Owner: ChinaWalls + Location: 45,21 + Actor1137: chain + Owner: ChinaWalls + Location: 45,22 + Actor1138: chain + Owner: ChinaWalls + Location: 45,23 + Actor1139: chain + Owner: ChinaWalls + Location: 44,23 + Actor1140: chain + Owner: ChinaWalls + Location: 44,24 + Actor1141: chain + Owner: ChinaWalls + Location: 44,25 + Actor1142: chain + Owner: ChinaWalls + Location: 44,26 + Actor1143: chain + Owner: ChinaWalls + Location: 43,26 + Actor1144: chain + Owner: ChinaWalls + Location: 43,27 + Actor1145: chain + Owner: ChinaWalls + Location: 43,28 + Actor1146: chain + Owner: ChinaWalls + Location: 44,28 + Actor1147: chain + Owner: ChinaWalls + Location: 45,28 + Actor1148: chain + Owner: ChinaWalls + Location: 46,28 + Actor1149: chain + Owner: ChinaWalls + Location: 52,28 + Actor1150: chain + Owner: ChinaWalls + Location: 53,28 + Actor1151: chain + Owner: ChinaWalls + Location: 54,28 + Actor1152: chain + Owner: ChinaWalls + Location: 55,28 + Actor1153: chain + Owner: ChinaWalls + Location: 56,28 + Actor1154: chain + Owner: ChinaWalls + Location: 56,27 + Actor1155: chain + Owner: ChinaWalls + Location: 56,26 + Actor1156: chain + Owner: ChinaWalls + Location: 55,26 + Actor1157: chain + Owner: ChinaWalls + Location: 55,25 + Actor1158: chain + Owner: ChinaWalls + Location: 55,24 + Actor1159: chain + Owner: ChinaWalls + Location: 55,23 + Actor1160: chain + Owner: ChinaWalls + Location: 55,22 + Actor1161: chain + Owner: ChinaWalls + Location: 56,22 + Actor1162: chain + Owner: ChinaWalls + Location: 56,21 + Actor1163: chain + Owner: ChinaWalls + Location: 56,20 + Actor1164: chain + Owner: ChinaWalls + Location: 56,19 + Actor1165: chain + Owner: ChinaWalls + Location: 56,18 + Actor1166: chain + Owner: ChinaWalls + Location: 55,18 + Actor1167: chain + Owner: ChinaWalls + Location: 54,18 + Actor1168: chain + Owner: ChinaWalls + Location: 53,18 + Actor1169: chain + Owner: ChinaWalls + Location: 52,18 + Actor1170: brik + Owner: ChinaWalls + Location: 46,1 + Actor1029: brik + Owner: ChinaWalls + Location: 46,2 + Actor1039: brik + Owner: ChinaWalls + Location: 46,3 + Actor1042: brik + Owner: ChinaWalls + Location: 46,4 + Actor1043: brik + Owner: ChinaWalls + Location: 47,4 + Actor1044: brik + Owner: ChinaWalls + Location: 48,4 + Actor1045: brik + Owner: ChinaWalls + Location: 49,4 + Actor1046: brik + Owner: ChinaWalls + Location: 50,4 + Actor1041: brik + Owner: ChinaWalls + Location: 50,3 + Actor1040: brik + Owner: ChinaWalls + Location: 49,3 + Actor1030: brik + Owner: ChinaWalls + Location: 54,3 + Actor1031: brik + Owner: ChinaWalls + Location: 55,3 + Actor1057: brik + Owner: ChinaWalls + Location: 55,4 + Actor1056: brik + Owner: ChinaWalls + Location: 54,4 + Actor1058: brik + Owner: ChinaWalls + Location: 56,4 + Actor1059: brik + Owner: ChinaWalls + Location: 57,4 + Actor1060: brik + Owner: ChinaWalls + Location: 58,4 + Actor1061: brik + Owner: ChinaWalls + Location: 59,4 + Actor1062: brik + Owner: ChinaWalls + Location: 60,4 + Actor1063: brik + Owner: ChinaWalls + Location: 61,4 + Actor1064: brik + Owner: ChinaWalls + Location: 62,4 + Actor1065: brik + Owner: ChinaWalls + Location: 63,4 + Actor1077: brik + Owner: ChinaWalls + Location: 64,4 + Actor1078: brik + Owner: ChinaWalls + Location: 65,4 + Actor1079: brik + Owner: ChinaWalls + Location: 65,3 + Actor1171: brik + Owner: ChinaWalls + Location: 65,2 + Actor1172: brik + Owner: ChinaWalls + Location: 65,1 + Actor1173: brik + Owner: ChinaWalls + Location: 65,0 + Actor1051: barb + Owner: ChinaWalls + Location: 47,6 + Actor1050: barb + Owner: ChinaWalls + Location: 46,6 + Actor1052: barb + Owner: ChinaWalls + Location: 48,6 + Actor1053: barb + Owner: ChinaWalls + Location: 49,6 + Actor1054: barb + Owner: ChinaWalls + Location: 50,6 + Actor1070: barb + Owner: ChinaWalls + Location: 54,6 + Actor1071: barb + Owner: ChinaWalls + Location: 55,6 + Actor1072: barb + Owner: ChinaWalls + Location: 56,6 + Actor1073: barb + Owner: ChinaWalls + Location: 57,6 + Actor1074: barb + Owner: ChinaWalls + Location: 58,6 + Actor1075: barb + Owner: ChinaWalls + Location: 59,6 + Actor1068: barb + Owner: ChinaWalls + Location: 59,5 + Actor1174: e1 + Owner: China + SubCell: 3 + Facing: 555 + Location: 45,25 + Actor1177: 3tnk + Owner: China + Facing: 512 + Location: 46,24 + Actor1178: 3tnk + Owner: China + Location: 52,24 + Facing: 512 + Actor1175: thwk + Owner: GDI + Location: 114,66 + Facing: 0 + Actor1176: thwk + Owner: GDI + Location: 113,70 + Facing: 256 + Actor1179: camera + Owner: GDI + Location: 105,48 + Actor1180: camera + Owner: GDI + Location: 91,57 + Actor1181: camera + Owner: GDI + Location: 88,77 + Actor1182: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 58,80 + Actor1183: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 58,81 + Actor1184: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 56,79 + WeaponsCache: waypoint + Owner: Neutral + Location: 24,22 + Actor1185: htnk.ion + Owner: GDI + Location: 82,75 + Facing: 261 + Actor1186: htnk.ion + Owner: GDI + Location: 83,77 + Facing: 245 + Actor1187: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 83,73 + Actor1188: n1 + Owner: GDI + Facing: 384 + Location: 82,73 + SubCell: 3 + Actor1189: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 80,73 + Actor1190: n1 + Owner: GDI + Location: 81,74 + SubCell: 3 + Facing: 384 + Actor1191: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 81,76 + Actor1192: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 83,78 + Actor1193: n1 + Owner: GDI + Location: 82,79 + SubCell: 3 + Facing: 190 + Actor1194: n1 + Owner: GDI + SubCell: 3 + Location: 84,78 + Facing: 277 + Actor1195: n1 + Owner: GDI + Location: 83,79 + SubCell: 3 + Facing: 277 + Actor1196: n1 + Owner: GDI + Location: 83,79 + SubCell: 1 + Facing: 384 + Actor1197: n1 + Owner: GDI + Facing: 384 + Location: 84,78 + SubCell: 1 + Actor1198: n1 + Owner: GDI + SubCell: 3 + Location: 83,76 + Facing: 384 + Actor1199: n1 + Owner: GDI + Facing: 384 + Location: 81,74 + SubCell: 1 + Actor1200: n3 + Owner: GDI + SubCell: 3 + Location: 82,74 + Facing: 384 + Actor1201: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 85,76 + Actor1202: n3 + Owner: GDI + Facing: 384 + Location: 85,78 + SubCell: 3 + Actor1203: n3 + Owner: GDI + Location: 84,81 + SubCell: 3 + Facing: 261 + Actor1204: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 127,57 + Actor1205: n3 + Owner: GDI + Facing: 384 + Location: 96,34 + SubCell: 3 + Actor1206: n1 + Owner: GDI + Facing: 384 + Location: 95,35 + SubCell: 3 + Actor1207: n1 + Owner: GDI + Facing: 384 + Location: 95,35 + SubCell: 1 + Actor1208: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 97,37 + Actor1209: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 97,39 + Actor1210: n1 + Owner: GDI + Facing: 384 + Location: 97,39 + SubCell: 1 + Actor1211: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 97,41 + Actor1212: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 95,41 + Actor1213: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 97,42 + Actor1214: wolv + Owner: GDI + Facing: 384 + Location: 102,51 + Actor1215: wolv + Owner: GDI + Location: 101,50 + Facing: 256 + Actor1216: wolv + Owner: GDI + Location: 102,48 + Facing: 256 + Actor1217: vulc.ai + Owner: GDI + Location: 102,49 + TurretFacing: 0 + Facing: 256 + Actor1218: vulc.ai + Owner: GDI + Location: 104,50 + Facing: 256 + Actor1219: mtnk + Owner: GDI + Location: 113,46 + Facing: 0 + Actor1220: mtnk + Owner: GDI + Location: 113,44 + Facing: 0 + Actor1221: mtnk + Owner: GDI + Location: 113,42 + Facing: 0 + Actor1222: n1r1 + Owner: GDI + SubCell: 3 + Facing: 0 + Location: 115,44 + Actor1223: n1r1 + Owner: GDI + SubCell: 3 + Facing: 0 + Location: 111,42 + Actor1224: n1r1 + Owner: GDI + SubCell: 3 + Facing: 0 + Location: 111,44 + Actor1225: n1r1 + Owner: GDI + SubCell: 3 + Facing: 0 + Location: 112,43 + Actor1226: n1r1 + Owner: GDI + SubCell: 3 + Facing: 0 + Location: 116,43 + Actor1227: n1r1 + Owner: GDI + SubCell: 3 + Facing: 0 + Location: 115,41 + Actor1228: n1r1 + Owner: GDI + SubCell: 3 + Facing: 0 + Location: 114,42 + Actor1229: mdrn + Owner: GDI + SubCell: 3 + Location: 110,43 + Facing: 31 + Actor1230: mdrn + Owner: GDI + SubCell: 3 + Location: 115,39 + Facing: 0 + Actor1231: hmmv.tow + Owner: GDI + Facing: 384 + Location: 69,35 + Actor1232: hmmv.tow + Owner: GDI + Facing: 384 + Location: 66,33 + ChinaHostileSpawn: waypoint + Owner: Neutral + Location: 52,1 + ChinaHostileRally1: waypoint + Owner: Neutral + Location: 52,12 + ChinaHostileRally2: waypoint + Owner: Neutral + Location: 49,12 + ChinaHostileRally3: waypoint + Owner: Neutral + Location: 49,23 + DisruptorDropSpawn: waypoint + Owner: Neutral + Location: 128,89 + DisruptorDropRally: waypoint + Owner: Neutral + Location: 35,89 + DisruptorDropDest1: waypoint + Owner: Neutral + Location: 8,63 + DisruptorDropDest2: waypoint + Owner: Neutral + Location: 6,65 + DisruptorDropDest3: waypoint + Owner: Neutral + Location: 9,66 + DisruptorDropDest4: waypoint + Owner: Neutral + Location: 11,64 + DisruptorDropExit: waypoint + Owner: Neutral + Location: 41,96 + CarrierPatrol1: waypoint + Owner: Neutral + Location: 41,94 + CarrierPatrol2: waypoint + Owner: Neutral + Location: 3,94 + Actor813: n1 + Owner: GDI + SubCell: 3 + Location: 14,79 + Facing: 896 + CarrierPatrol3: waypoint + Owner: Neutral + Location: 3,73 + Carrier2: cv + Owner: GDI + Location: 58,94 + Facing: 256 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|missions/main-campaign/ca38-procurement/procurement-rules.yaml, ca|rules/custom/coop-rules.yaml, procurement-coop-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/coop-campaign/ca38-procurement-coop/procurement-coop-rules.yaml b/mods/ca/missions/coop-campaign/ca38-procurement-coop/procurement-coop-rules.yaml new file mode 100644 index 0000000000..3bef00090f --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca38-procurement-coop/procurement-coop-rules.yaml @@ -0,0 +1,6 @@ +World: + LuaScript: + Scripts: campaign.lua, coop.lua, ca|missions/main-campaign/ca38-procurement/procurement.lua, procurement-coop.lua + LobbyMissionInfo@InitialObjectives: + Prefix: Initial Objectives + Text: • Take control of Chinese equipment.\n• Eliminate all GDI forces. diff --git a/mods/ca/missions/coop-campaign/ca38-procurement-coop/procurement-coop.lua b/mods/ca/missions/coop-campaign/ca38-procurement-coop/procurement-coop.lua new file mode 100644 index 0000000000..36198c223b --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca38-procurement-coop/procurement-coop.lua @@ -0,0 +1,36 @@ + +SetupPlayers = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Multi2 = Player.GetPlayer("Multi2") + Multi3 = Player.GetPlayer("Multi3") + Multi4 = Player.GetPlayer("Multi4") + Multi5 = Player.GetPlayer("Multi5") + USSR = Player.GetPlayer("USSR") + GDI = Player.GetPlayer("GDI") + China = Player.GetPlayer("China") + ChinaHostile = Player.GetPlayer("ChinaHostile") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = Utils.Where({ Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 }, function(p) return p ~= nil end) + MissionEnemies = { GDI } + SinglePlayerPlayer = USSR + CoopInit() +end + +AfterWorldLoaded = function() + StartCashSpread(3500) +end + +AfterTick = function() + +end + +DoMcvArrival = function() + local delay = 0 + Utils.Do(GetMcvPlayers(), function(p) + Trigger.AfterDelay(delay, function() + Reinforcements.Reinforce(p, { "mcv" }, { McvSpawn.Location, McvRally.Location }) + end) + delay = delay + DateTime.Seconds(1) + end) +end diff --git a/mods/ca/missions/coop-campaign/ca39-jailbreak-coop/jailbreak-coop-rules.yaml b/mods/ca/missions/coop-campaign/ca39-jailbreak-coop/jailbreak-coop-rules.yaml new file mode 100644 index 0000000000..6e4f0c0a05 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca39-jailbreak-coop/jailbreak-coop-rules.yaml @@ -0,0 +1,6 @@ +World: + LuaScript: + Scripts: campaign.lua, coop.lua, ca|missions/main-campaign/ca39-jailbreak/jailbreak.lua, jailbreak-coop.lua + LobbyMissionInfo@InitialObjectives: + Prefix: Initial Objectives + Text: • Clear a path for reinforcements.\n• Locate and capture the Allied prison to free Yuri. diff --git a/mods/ca/missions/coop-campaign/ca39-jailbreak-coop/jailbreak-coop.lua b/mods/ca/missions/coop-campaign/ca39-jailbreak-coop/jailbreak-coop.lua new file mode 100644 index 0000000000..6a872874aa --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca39-jailbreak-coop/jailbreak-coop.lua @@ -0,0 +1,46 @@ + +if CoopAttackStrengthMultiplier ~= nil then + if CruiserInterval ~= nil and CruiserInterval[Difficulty] ~= nil then + CruiserInterval[Difficulty] = math.max(CruiserInterval[Difficulty] / CoopAttackStrengthMultiplier, 25) + end + if ChronoTankInterval ~= nil and ChronoTankInterval[Difficulty] ~= nil then + ChronoTankInterval[Difficulty] = math.max(ChronoTankInterval[Difficulty] / CoopAttackStrengthMultiplier, 25) + end +end + +SetupPlayers = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Multi2 = Player.GetPlayer("Multi2") + Multi3 = Player.GetPlayer("Multi3") + Multi4 = Player.GetPlayer("Multi4") + Multi5 = Player.GetPlayer("Multi5") + USSR = Player.GetPlayer("USSR") + Greece = Player.GetPlayer("Greece") + GreeceNorth = Player.GetPlayer("GreeceNorth") + Scrin = Player.GetPlayer("Scrin") + GDI = Player.GetPlayer("GDI") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = Utils.Where({ Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 }, function(p) return p ~= nil end) + MissionEnemies = { Greece, GreeceNorth } + SinglePlayerPlayer = USSR + CoopInit() +end + +AfterWorldLoaded = function() + StartCashSpread(3500) +end + +AfterTick = function() + +end + +DoMcvArrival = function() + local delay = 0 + Utils.Do(GetMcvPlayers(), function(p) + Trigger.AfterDelay(delay, function() + Reinforcements.Reinforce(p, { "mcv" }, { McvSpawn.Location, McvRally.Location }) + end) + delay = delay + DateTime.Seconds(1) + end) +end diff --git a/mods/ca/missions/coop-campaign/ca39-jailbreak-coop/map.bin b/mods/ca/missions/coop-campaign/ca39-jailbreak-coop/map.bin new file mode 100644 index 0000000000..ca3b477702 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca39-jailbreak-coop/map.bin differ diff --git a/mods/ca/missions/coop-campaign/ca39-jailbreak-coop/map.png b/mods/ca/missions/coop-campaign/ca39-jailbreak-coop/map.png new file mode 100644 index 0000000000..784a9962d5 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca39-jailbreak-coop/map.png differ diff --git a/mods/ca/missions/coop-campaign/ca39-jailbreak-coop/map.yaml b/mods/ca/missions/coop-campaign/ca39-jailbreak-coop/map.yaml new file mode 100644 index 0000000000..1cad2c7ce3 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca39-jailbreak-coop/map.yaml @@ -0,0 +1,3108 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 39: Jailbreak Co-op + +Author: Darkademic & Gandorques Hikla + +Tileset: TEMPERAT + +MapSize: 98,98 + +Bounds: 1,1,96,96 + +Visibility: Lobby + +Categories: Co-op Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: USSR, Greece, GreeceNorth, GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + PlayerReference@USSR: + Name: USSR + Faction: soviet + Color: FE1100 + Allies: Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Greece, GreeceNorth, GDI, Creeps + PlayerReference@Greece: + Name: Greece + Bot: campaign + Faction: allies + Color: 99ACF2 + Allies: GreeceNorth, GDI + Enemies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Scrin, Creeps + PlayerReference@GreeceNorth: + Name: GreeceNorth + Bot: dormant + Faction: allies + Color: 99ACF2 + Allies: Greece, GDI + Enemies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Scrin, Creeps + PlayerReference@Scrin: + Name: Scrin + Bot: dormant + Faction: scrin + Color: 7700FF + Allies: USSR + Enemies: Greece, GreeceNorth, GDI, Creeps + PlayerReference@GDI: + Name: GDI + Bot: dormant + Faction: gdi + Color: F2CF74 + Allies: Greece, GreeceNorth + Enemies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Scrin, Creeps + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: FE1100 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Greece, GreeceNorth, GDI, Creeps + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: FF9922 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Greece, GreeceNorth, GDI, Creeps + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: 994050 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Greece, GreeceNorth, GDI, Creeps + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: 775A12 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Greece, GreeceNorth, GDI, Creeps + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: 82C900 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Greece, GreeceNorth, GDI, Creeps + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: DD1691 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Greece, GreeceNorth, GDI, Creeps + +Actors: + Actor28: brik + Owner: Greece + Location: 23,67 + Actor29: brik + Owner: Greece + Location: 24,67 + Actor30: brik + Owner: Greece + Location: 25,67 + Actor31: brik + Owner: Greece + Location: 26,67 + Actor32: brik + Owner: Greece + Location: 27,67 + Actor33: brik + Owner: Greece + Location: 28,67 + Actor34: brik + Owner: Greece + Location: 29,67 + Actor35: brik + Owner: Greece + Location: 23,68 + Actor36: brik + Owner: Greece + Location: 29,68 + Actor37: brik + Owner: Greece + Location: 23,69 + Prison: miss + Owner: Greece + Location: 25,69 + Actor39: brik + Owner: Greece + Location: 29,69 + Actor40: brik + Owner: Greece + Location: 23,70 + Actor41: brik + Owner: Greece + Location: 29,70 + Actor42: brik + Owner: Greece + Location: 23,71 + Actor43: brik + Owner: Greece + Location: 29,71 + Actor44: brik + Owner: Greece + Location: 23,72 + Actor45: brik + Owner: Greece + Location: 29,72 + Actor46: brik + Owner: Greece + Location: 23,73 + Actor47: brik + Owner: Greece + Location: 24,73 + Actor48: brik + Owner: Greece + Location: 28,73 + Actor49: brik + Owner: Greece + Location: 29,73 + Actor50: brik + Owner: Greece + Location: 23,74 + Actor51: brik + Owner: Greece + Location: 24,74 + Actor52: brik + Owner: Greece + Location: 28,74 + Actor53: brik + Owner: Greece + Location: 29,74 + NorthShoreTurret1: gun + Owner: Greece + Location: 85,34 + TurretFacing: 586 + NorthShoreTurret2: gun + Owner: Greece + Location: 76,35 + TurretFacing: 650 + NorthShoreTurret3: gun + Owner: Greece + Location: 64,34 + TurretFacing: 531 + NorthShoreTurret4: gun + Owner: Greece + Location: 52,34 + TurretFacing: 602 + Actor60: gun + Owner: Greece + Location: 61,46 + TurretFacing: 95 + Actor61: gun + Owner: Greece + Location: 47,46 + TurretFacing: 935 + Actor62: gun + Owner: Greece + Location: 35,44 + TurretFacing: 0 + Actor63: gun + Owner: Greece + Location: 27,46 + TurretFacing: 71 + Actor64: gun + Owner: Greece + Location: 17,46 + TurretFacing: 983 + Actor69: e1 + Owner: USSR + Facing: 384 + Location: 89,6 + SubCell: 1 + Actor71: e1 + Owner: USSR + Facing: 384 + Location: 89,6 + SubCell: 4 + Actor73: e1 + Owner: USSR + Facing: 384 + Location: 91,8 + SubCell: 1 + Actor74: e1 + Owner: USSR + Facing: 384 + Location: 91,8 + SubCell: 2 + Actor75: e1 + Owner: USSR + Facing: 384 + Location: 91,8 + SubCell: 4 + Actor76: e1 + Owner: USSR + Facing: 384 + Location: 91,8 + SubCell: 5 + Actor70: e1 + Owner: USSR + Facing: 384 + Location: 89,6 + SubCell: 2 + Actor72: e1 + Owner: USSR + Facing: 384 + Location: 89,6 + SubCell: 5 + Actor67: 3tnk + Owner: USSR + Facing: 384 + Location: 91,4 + Actor68: 3tnk + Owner: USSR + Facing: 384 + Location: 93,6 + Actor77: 3tnk + Owner: USSR + Facing: 384 + Location: 91,6 + Actor78: btr + Owner: USSR + Facing: 384 + Location: 93,8 + Actor79: btr + Owner: USSR + Facing: 384 + Location: 89,4 + Actor81: e3 + Owner: USSR + Facing: 384 + Location: 92,5 + SubCell: 1 + Actor82: e3 + Owner: USSR + Facing: 384 + Location: 92,5 + SubCell: 2 + Actor83: e3 + Owner: USSR + Facing: 384 + Location: 92,5 + SubCell: 4 + Actor84: e3 + Owner: USSR + Facing: 384 + Location: 92,5 + SubCell: 5 + Actor86: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 92,9 + Actor87: e2 + Owner: USSR + Facing: 384 + Location: 92,9 + SubCell: 1 + Actor90: e2 + Owner: USSR + Facing: 384 + Location: 88,5 + SubCell: 5 + Actor80: e2 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 88,5 + Actor85: ttrp + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 90,5 + Actor88: ttrp + Owner: USSR + Facing: 384 + Location: 92,7 + SubCell: 3 + Actor92: dog + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 87,7 + Actor93: dog + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 91,10 + Actor94: sbag + Owner: Greece + Location: 16,48 + Actor95: sbag + Owner: Greece + Location: 16,47 + Actor96: sbag + Owner: Greece + Location: 16,49 + Actor97: sbag + Owner: Greece + Location: 17,47 + Actor98: sbag + Owner: Greece + Location: 18,47 + Actor99: sbag + Owner: Greece + Location: 18,48 + Actor100: sbag + Owner: Greece + Location: 18,49 + Actor101: sbag + Owner: Greece + Location: 26,47 + Actor102: sbag + Owner: Greece + Location: 27,47 + Actor103: sbag + Owner: Greece + Location: 28,47 + Actor104: sbag + Owner: Greece + Location: 26,48 + Actor105: sbag + Owner: Greece + Location: 26,49 + Actor106: sbag + Owner: Greece + Location: 28,48 + Actor107: sbag + Owner: Greece + Location: 28,49 + Actor115: sbag + Owner: Greece + Location: 35,45 + Actor116: sbag + Owner: Greece + Location: 34,45 + Actor117: sbag + Owner: Greece + Location: 36,45 + Actor118: sbag + Owner: Greece + Location: 34,46 + Actor119: sbag + Owner: Greece + Location: 34,47 + Actor120: sbag + Owner: Greece + Location: 36,46 + Actor121: sbag + Owner: Greece + Location: 36,47 + Actor122: sbag + Owner: Greece + Location: 35,47 + Actor123: sbag + Owner: Greece + Location: 27,49 + Actor124: sbag + Owner: Greece + Location: 17,49 + Actor126: sbag + Owner: Greece + Location: 47,47 + Actor127: sbag + Owner: Greece + Location: 46,47 + Actor128: sbag + Owner: Greece + Location: 46,48 + Actor129: sbag + Owner: Greece + Location: 46,49 + Actor130: sbag + Owner: Greece + Location: 47,49 + Actor131: sbag + Owner: Greece + Location: 48,49 + Actor132: sbag + Owner: Greece + Location: 48,48 + Actor133: sbag + Owner: Greece + Location: 48,47 + Actor134: agun + Owner: Greece + Location: 47,48 + TurretFacing: 1023 + Actor140: mgg + Owner: Greece + Facing: 384 + Location: 17,50 + Actor141: mgg + Owner: Greece + Facing: 384 + Location: 29,48 + Actor142: mgg + Owner: Greece + Facing: 384 + Location: 37,46 + Actor143: mgg + Owner: Greece + Facing: 384 + Location: 45,49 + Actor144: gap + Owner: Greece + Location: 22,66 + Actor145: gap + Owner: Greece + Location: 32,73 + Actor146: gap + Owner: Greece + Location: 21,76 + Actor147: sbag + Owner: Greece + Location: 10,1 + Actor148: sbag + Owner: Greece + Location: 10,2 + Actor149: sbag + Owner: Greece + Location: 11,1 + Actor150: sbag + Owner: Greece + Location: 12,1 + Actor151: sbag + Owner: Greece + Location: 13,1 + Actor152: sbag + Owner: Greece + Location: 14,1 + Actor153: sbag + Owner: Greece + Location: 15,1 + Actor154: sbag + Owner: Greece + Location: 16,1 + Actor155: sbag + Owner: Greece + Location: 17,1 + Actor156: sbag + Owner: Greece + Location: 18,1 + Actor157: sbag + Owner: Greece + Location: 19,1 + Actor158: sbag + Owner: Greece + Location: 20,1 + Actor159: sbag + Owner: Greece + Location: 21,1 + Actor172: sbag + Owner: Greece + Location: 10,11 + Actor173: sbag + Owner: Greece + Location: 10,9 + Actor174: sbag + Owner: Greece + Location: 10,10 + Actor175: gap + Owner: Greece + Location: 86,56 + Actor176: brik + Owner: Greece + Location: 15,66 + Actor177: brik + Owner: Greece + Location: 16,66 + Actor178: brik + Owner: Greece + Location: 17,66 + Actor179: brik + Owner: Greece + Location: 18,66 + Actor180: brik + Owner: Greece + Location: 18,67 + Actor181: brik + Owner: Greece + Location: 17,67 + Actor182: brik + Owner: Greece + Location: 15,67 + Actor183: brik + Owner: Greece + Location: 14,67 + Actor184: brik + Owner: Greece + Location: 14,66 + Actor185: brik + Owner: Greece + Location: 11,66 + Actor186: brik + Owner: Greece + Location: 11,67 + Actor187: brik + Owner: Greece + Location: 10,67 + Actor188: brik + Owner: Greece + Location: 10,66 + Actor189: brik + Owner: Greece + Location: 9,66 + Actor190: brik + Owner: Greece + Location: 8,66 + Actor191: brik + Owner: Greece + Location: 7,66 + Actor192: brik + Owner: Greece + Location: 6,66 + Actor193: brik + Owner: Greece + Location: 5,66 + Actor194: brik + Owner: Greece + Location: 4,66 + Actor195: brik + Owner: Greece + Location: 3,66 + Actor196: brik + Owner: Greece + Location: 2,66 + Actor197: brik + Owner: Greece + Location: 1,66 + Actor198: brik + Owner: Greece + Location: 1,67 + Actor199: brik + Owner: Greece + Location: 2,67 + Actor200: brik + Owner: Greece + Location: 1,68 + Actor201: brik + Owner: Greece + Location: 1,69 + Actor202: brik + Owner: Greece + Location: 1,70 + Actor203: brik + Owner: Greece + Location: 1,71 + Actor204: brik + Owner: Greece + Location: 2,71 + Actor205: brik + Owner: Greece + Location: 2,70 + Actor206: brik + Owner: Greece + Location: 35,77 + Actor207: brik + Owner: Greece + Location: 35,76 + Actor208: brik + Owner: Greece + Location: 36,76 + Actor209: brik + Owner: Greece + Location: 36,77 + Actor210: brik + Owner: Greece + Location: 35,74 + Actor211: brik + Owner: Greece + Location: 35,75 + Actor212: brik + Owner: Greece + Location: 34,74 + Actor213: brik + Owner: Greece + Location: 33,74 + Actor214: brik + Owner: Greece + Location: 32,74 + Actor215: brik + Owner: Greece + Location: 31,74 + Actor216: brik + Owner: Greece + Location: 31,73 + Actor217: brik + Owner: Greece + Location: 30,73 + Actor218: brik + Owner: Greece + Location: 30,74 + Actor219: brik + Owner: Greece + Location: 22,67 + Actor220: brik + Owner: Greece + Location: 22,68 + Actor221: brik + Owner: Greece + Location: 35,81 + Actor222: brik + Owner: Greece + Location: 35,82 + Actor223: brik + Owner: Greece + Location: 36,82 + Actor224: brik + Owner: Greece + Location: 36,81 + Actor225: brik + Owner: Greece + Location: 36,83 + Actor226: brik + Owner: Greece + Location: 36,84 + Actor227: brik + Owner: Greece + Location: 36,85 + Actor228: brik + Owner: Greece + Location: 36,86 + Actor229: brik + Owner: Greece + Location: 36,87 + Actor230: brik + Owner: Greece + Location: 35,87 + Actor231: brik + Owner: Greece + Location: 35,86 + Actor232: brik + Owner: Greece + Location: 34,87 + Actor233: brik + Owner: Greece + Location: 33,87 + Actor234: brik + Owner: Greece + Location: 32,87 + Actor235: brik + Owner: Greece + Location: 31,87 + Actor236: brik + Owner: Greece + Location: 30,86 + Actor237: brik + Owner: Greece + Location: 30,87 + Actor238: brik + Owner: Greece + Location: 29,87 + Actor239: brik + Owner: Greece + Location: 29,86 + Actor240: brik + Owner: Greece + Location: 25,90 + Actor241: brik + Owner: Greece + Location: 25,89 + Actor242: brik + Owner: Greece + Location: 25,88 + Actor243: brik + Owner: Greece + Location: 26,88 + Actor244: brik + Owner: Greece + Location: 26,87 + Actor245: brik + Owner: Greece + Location: 25,87 + Actor246: brik + Owner: Greece + Location: 24,90 + Actor247: brik + Owner: Greece + Location: 23,90 + Actor248: brik + Owner: Greece + Location: 22,90 + Actor249: brik + Owner: Greece + Location: 21,90 + Actor250: brik + Owner: Greece + Location: 20,90 + Actor251: brik + Owner: Greece + Location: 20,89 + Actor252: brik + Owner: Greece + Location: 19,89 + Actor253: brik + Owner: Greece + Location: 18,89 + Actor254: brik + Owner: Greece + Location: 17,89 + Actor255: brik + Owner: Greece + Location: 16,89 + Actor256: brik + Owner: Greece + Location: 15,89 + Actor257: brik + Owner: Greece + Location: 14,89 + Actor258: brik + Owner: Greece + Location: 14,90 + Actor259: brik + Owner: Greece + Location: 13,90 + Actor260: brik + Owner: Greece + Location: 13,89 + Actor261: pbox + Owner: Greece + Location: 37,77 + Actor262: pbox + Owner: Greece + Location: 37,81 + Actor264: pbox + Owner: Greece + Location: 15,65 + Actor265: pbox + Owner: Greece + Location: 10,65 + Actor263: alhq + Owner: Greece + Location: 15,75 + Actor269: tent + Owner: Greece + Location: 30,82 + Actor270: apwr + Owner: Greece + Location: 21,87 + Actor271: apwr + Owner: Greece + Location: 15,86 + Actor273: apwr + Owner: Greece + Location: 21,83 + Actor274: apwr + Owner: Greece + Location: 11,84 + Actor276: hpad + Owner: Greece + Location: 88,75 + Actor277: hpad + Owner: Greece + Location: 91,75 + Actor279: hpad + Owner: Greece + Location: 91,83 + Actor280: hpad + Owner: Greece + Location: 88,83 + Actor281: brik + Owner: Greece + Location: 88,74 + Actor282: brik + Owner: Greece + Location: 89,74 + Actor283: brik + Owner: Greece + Location: 91,74 + Actor284: brik + Owner: Greece + Location: 90,74 + Actor285: brik + Owner: Greece + Location: 92,74 + Actor286: brik + Owner: Greece + Location: 93,74 + Actor287: brik + Owner: Greece + Location: 94,74 + Actor288: brik + Owner: Greece + Location: 95,74 + Actor289: brik + Owner: Greece + Location: 95,75 + Actor290: brik + Owner: Greece + Location: 96,74 + Actor291: brik + Owner: Greece + Location: 96,75 + Actor292: brik + Owner: Greece + Location: 96,76 + Actor293: brik + Owner: Greece + Location: 96,77 + Actor294: brik + Owner: Greece + Location: 96,78 + Actor295: brik + Owner: Greece + Location: 96,79 + Actor296: brik + Owner: Greece + Location: 96,80 + Actor297: brik + Owner: Greece + Location: 96,81 + Actor298: brik + Owner: Greece + Location: 96,82 + Actor299: brik + Owner: Greece + Location: 96,83 + Actor300: brik + Owner: Greece + Location: 96,84 + Actor301: brik + Owner: Greece + Location: 95,85 + Actor302: brik + Owner: Greece + Location: 95,86 + Actor303: brik + Owner: Greece + Location: 96,85 + Actor304: brik + Owner: Greece + Location: 96,86 + Actor305: brik + Owner: Greece + Location: 88,86 + Actor306: brik + Owner: Greece + Location: 89,86 + Actor307: brik + Owner: Greece + Location: 90,86 + Actor308: brik + Owner: Greece + Location: 91,86 + Actor309: brik + Owner: Greece + Location: 92,86 + Actor310: brik + Owner: Greece + Location: 93,86 + Actor311: brik + Owner: Greece + Location: 94,86 + Actor312: brik + Owner: Greece + Location: 87,86 + Actor313: brik + Owner: Greece + Location: 86,86 + Actor314: hpad + Owner: Greece + Location: 94,82 + Actor315: hpad + Owner: Greece + Location: 94,76 + Actor316: brik + Owner: Greece + Location: 86,85 + Actor317: brik + Owner: Greece + Location: 86,84 + Actor318: brik + Owner: Greece + Location: 86,83 + Actor319: brik + Owner: Greece + Location: 86,82 + Actor320: brik + Owner: Greece + Location: 86,81 + Actor321: brik + Owner: Greece + Location: 87,81 + Actor322: brik + Owner: Greece + Location: 87,82 + Actor323: brik + Owner: Greece + Location: 87,74 + Actor324: brik + Owner: Greece + Location: 86,74 + Actor325: brik + Owner: Greece + Location: 86,75 + Actor326: brik + Owner: Greece + Location: 86,76 + Actor327: brik + Owner: Greece + Location: 86,77 + Actor328: brik + Owner: Greece + Location: 86,78 + Actor329: brik + Owner: Greece + Location: 86,79 + Actor330: brik + Owner: Greece + Location: 87,79 + Actor331: brik + Owner: Greece + Location: 87,78 + Actor332: chain + Owner: Greece + Location: 86,73 + Actor333: chain + Owner: Greece + Location: 85,73 + Actor334: chain + Owner: Greece + Location: 85,74 + Actor335: chain + Owner: Greece + Location: 85,75 + Actor336: chain + Owner: Greece + Location: 85,76 + Actor337: chain + Owner: Greece + Location: 85,77 + Actor338: chain + Owner: Greece + Location: 85,78 + Actor339: chain + Owner: Greece + Location: 87,73 + Actor340: chain + Owner: Greece + Location: 88,73 + Actor341: chain + Owner: Greece + Location: 90,73 + Actor342: chain + Owner: Greece + Location: 89,73 + Actor343: chain + Owner: Greece + Location: 91,73 + Actor344: chain + Owner: Greece + Location: 92,73 + Actor345: chain + Owner: Greece + Location: 93,73 + Actor346: chain + Owner: Greece + Location: 95,73 + Actor347: chain + Owner: Greece + Location: 96,73 + Actor348: chain + Owner: Greece + Location: 94,73 + Actor349: chain + Owner: Greece + Location: 85,81 + Actor350: chain + Owner: Greece + Location: 85,82 + Actor351: chain + Owner: Greece + Location: 85,83 + Actor352: chain + Owner: Greece + Location: 85,84 + Actor353: chain + Owner: Greece + Location: 85,85 + Actor354: chain + Owner: Greece + Location: 85,86 + Actor355: chain + Owner: Greece + Location: 85,87 + Actor356: chain + Owner: Greece + Location: 86,87 + Actor357: chain + Owner: Greece + Location: 88,87 + Actor358: chain + Owner: Greece + Location: 87,87 + Actor359: chain + Owner: Greece + Location: 89,87 + Actor360: chain + Owner: Greece + Location: 90,87 + Actor361: chain + Owner: Greece + Location: 91,87 + Actor362: chain + Owner: Greece + Location: 92,87 + Actor363: chain + Owner: Greece + Location: 93,87 + Actor364: chain + Owner: Greece + Location: 94,87 + Actor365: chain + Owner: Greece + Location: 95,87 + Actor366: chain + Owner: Greece + Location: 96,87 + Actor367: pbox + Owner: Greece + Location: 84,78 + Actor368: pbox + Owner: Greece + Location: 84,81 + Actor370: sbag + Owner: Greece + Location: 10,13 + Actor371: sbag + Owner: Greece + Location: 10,12 + Actor372: sbag + Owner: Greece + Location: 11,13 + Actor373: sbag + Owner: Greece + Location: 12,13 + Actor374: sbag + Owner: Greece + Location: 18,13 + Actor375: sbag + Owner: Greece + Location: 19,13 + Actor376: sbag + Owner: Greece + Location: 20,13 + Actor377: sbag + Owner: Greece + Location: 21,13 + Actor378: sbag + Owner: Greece + Location: 22,13 + Actor379: sbag + Owner: Greece + Location: 23,13 + Actor380: sbag + Owner: Greece + Location: 23,12 + Actor381: sbag + Owner: Greece + Location: 23,11 + Actor382: sbag + Owner: Greece + Location: 23,10 + Actor383: sbag + Owner: Greece + Location: 23,9 + Actor384: sbag + Owner: Greece + Location: 23,8 + Actor385: sbag + Owner: Greece + Location: 23,4 + Actor386: sbag + Owner: Greece + Location: 23,3 + Actor387: sbag + Owner: Greece + Location: 23,2 + Actor388: sbag + Owner: Greece + Location: 23,1 + Actor389: sbag + Owner: Greece + Location: 22,1 + Actor390: gap + Owner: Greece + Location: 89,80 + Actor391: fix + Owner: Greece + Location: 91,79 + Actor369: agun + Owner: Greece + Location: 95,80 + TurretFacing: 111 + Actor393: proc + Location: 19,8 + Owner: GreeceNorth + Actor398: powr + Location: 13,2 + Owner: GreeceNorth + Actor399: powr + Location: 11,2 + Owner: GreeceNorth + Actor402: silo + Location: 19,8 + Owner: GreeceNorth + Actor403: silo + Location: 21,8 + Owner: GreeceNorth + Actor401: sbag + Owner: Greece + Location: 10,8 + Actor408: sbag + Owner: Greece + Location: 10,7 + Actor409: sbag + Owner: Greece + Location: 10,6 + Actor410: sbag + Owner: Greece + Location: 10,5 + Actor411: sbag + Owner: Greece + Location: 10,4 + Actor413: sbag + Owner: Greece + Location: 10,3 + Actor414: sbag + Owner: Greece + Location: 13,13 + Actor404: pbox + Location: 24,8 + Owner: GreeceNorth + Actor405: pbox + Location: 24,4 + Owner: GreeceNorth + Actor406: pbox + Location: 18,14 + Owner: GreeceNorth + Actor407: pbox + Location: 13,14 + Owner: GreeceNorth + NorthFactory: weap + Location: 11,9 + Owner: GreeceNorth + Actor400: powr + Location: 11,5 + Owner: GreeceNorth + Actor396: powr + Location: 13,5 + Owner: GreeceNorth + NorthBarracks: tent + Location: 21,2 + Owner: GreeceNorth + NorthConyard: fact + Location: 16,2 + Owner: GreeceNorth + Actor397: ttrp + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 88,3 + Actor412: ttrp + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 94,9 + Actor416: e1 + Owner: USSR + Facing: 384 + SubCell: 1 + Location: 87,4 + Actor417: e1 + Owner: USSR + Facing: 384 + SubCell: 4 + Location: 87,4 + Actor418: e1 + Owner: USSR + Facing: 384 + SubCell: 2 + Location: 87,4 + Actor419: e1 + Owner: USSR + Facing: 384 + SubCell: 5 + Location: 87,4 + Actor420: e1 + Owner: USSR + Facing: 384 + SubCell: 1 + Location: 93,10 + Actor421: e1 + Owner: USSR + Facing: 384 + SubCell: 4 + Location: 93,10 + Actor422: e1 + Owner: USSR + Facing: 384 + SubCell: 2 + Location: 93,10 + Actor423: e1 + Owner: USSR + Facing: 384 + SubCell: 5 + Location: 93,10 + Actor424: 3tnk + Owner: USSR + Facing: 384 + Location: 93,4 + Actor425: v2rl + Owner: USSR + Facing: 384 + Location: 95,5 + Actor426: v2rl + Owner: USSR + Facing: 384 + Location: 92,2 + Actor427: tc04 + Owner: Neutral + Faction: soviet + Location: 73,14 + Actor428: tc05 + Owner: Neutral + Faction: soviet + Location: 80,14 + Actor429: tc01 + Owner: Neutral + Faction: soviet + Location: 77,13 + Actor430: t16 + Owner: Neutral + Faction: soviet + Location: 81,18 + Actor431: tc04 + Owner: Neutral + Faction: soviet + Location: 72,19 + Actor432: tc03 + Owner: Neutral + Faction: soviet + Location: 73,18 + Actor433: tc01 + Owner: Neutral + Faction: soviet + Location: 74,16 + Actor434: tc02 + Owner: Neutral + Faction: soviet + Location: 75,19 + Actor435: tc05 + Owner: Neutral + Faction: soviet + Location: 66,18 + Actor436: tc04 + Owner: Neutral + Faction: soviet + Location: 50,12 + Actor437: tc01 + Owner: Neutral + Faction: soviet + Location: 59,16 + Actor438: tc02 + Owner: Neutral + Faction: soviet + Location: 52,14 + Actor439: t16 + Owner: Neutral + Faction: soviet + Location: 51,15 + Actor440: t16 + Owner: Neutral + Faction: soviet + Location: 62,19 + Actor442: t06 + Owner: Neutral + Faction: soviet + Location: 83,17 + Actor443: t06 + Owner: Neutral + Faction: soviet + Location: 69,19 + Actor444: t06 + Owner: Neutral + Faction: soviet + Location: 61,17 + Actor445: t06 + Owner: Neutral + Faction: soviet + Location: 55,12 + Actor446: t06 + Owner: Neutral + Faction: soviet + Location: 58,20 + Actor447: t05 + Owner: Neutral + Faction: soviet + Location: 59,19 + Actor448: t05 + Owner: Neutral + Faction: soviet + Location: 54,15 + Actor449: t05 + Owner: Neutral + Faction: soviet + Location: 71,17 + Actor450: t05 + Owner: Neutral + Faction: soviet + Location: 79,17 + Actor451: t05 + Owner: Neutral + Faction: soviet + Location: 55,17 + Actor452: t06 + Owner: Neutral + Faction: soviet + Location: 78,16 + Actor453: t06 + Owner: Neutral + Faction: soviet + Location: 63,18 + Actor454: t06 + Owner: Neutral + Faction: soviet + Location: 55,14 + Actor455: t06 + Owner: Neutral + Faction: soviet + Location: 69,16 + Actor456: t06 + Owner: Neutral + Faction: soviet + Location: 57,18 + Actor457: t10 + Owner: Neutral + Faction: soviet + Location: 60,18 + Actor458: t10 + Owner: Neutral + Faction: soviet + Location: 76,16 + Actor459: t15 + Owner: Neutral + Faction: soviet + Location: 77,18 + Actor460: t15 + Owner: Neutral + Faction: soviet + Location: 71,16 + Actor461: t15 + Owner: Neutral + Faction: soviet + Location: 55,15 + Actor462: t12 + Owner: Neutral + Faction: soviet + Location: 54,13 + Actor463: t12 + Owner: Neutral + Faction: soviet + Location: 56,18 + Actor464: t12 + Owner: Neutral + Faction: soviet + Location: 65,17 + Actor465: t12 + Owner: Neutral + Faction: soviet + Location: 70,18 + Actor466: t12 + Owner: Neutral + Faction: soviet + Location: 80,16 + Actor467: t11 + Owner: Neutral + Faction: soviet + Location: 81,11 + Actor468: tc04 + Owner: Neutral + Faction: soviet + Location: 71,10 + Actor469: t16 + Owner: Neutral + Faction: soviet + Location: 77,4 + Actor470: tc02 + Owner: Neutral + Faction: soviet + Location: 71,2 + Actor471: t15 + Owner: Neutral + Faction: soviet + Location: 65,8 + Actor472: tc01 + Owner: Neutral + Faction: soviet + Location: 59,4 + Actor474: t01 + Owner: Neutral + Faction: soviet + Location: 65,2 + Actor475: t01 + Owner: Neutral + Faction: soviet + Location: 54,2 + Actor476: t13 + Owner: Neutral + Faction: soviet + Location: 64,13 + Actor477: t10 + Owner: Neutral + Faction: soviet + Location: 58,9 + Actor478: t05 + Owner: Neutral + Faction: soviet + Location: 56,8 + Actor479: t06 + Owner: Neutral + Faction: soviet + Location: 66,3 + Actor480: t02 + Owner: Neutral + Faction: soviet + Location: 80,10 + Actor481: t01 + Owner: Neutral + Faction: soviet + Location: 75,1 + Actor484: 2tnk + Owner: Greece + Location: 67,28 + Facing: 904 + Actor482: 2tnk + Owner: Greece + Facing: 904 + Location: 68,29 + Actor483: 2tnk + Owner: Greece + Facing: 904 + Location: 69,30 + Actor485: 1tnk + Owner: Greece + Location: 89,23 + Facing: 0 + Actor486: 1tnk + Owner: Greece + Location: 88,25 + Facing: 0 + Actor487: e3 + Owner: Greece + SubCell: 3 + Location: 90,24 + Facing: 0 + Actor490: e3 + Owner: Greece + SubCell: 3 + Location: 67,29 + Facing: 888 + Actor488: e3 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 87,24 + Actor491: e3 + Owner: Greece + SubCell: 3 + Facing: 888 + Location: 66,27 + Actor489: e3 + Owner: Greece + SubCell: 3 + Facing: 888 + Location: 68,31 + Actor493: snip + Owner: Greece + SubCell: 3 + Facing: 800 + Location: 66,3 + Actor494: snip + Owner: Greece + SubCell: 3 + Facing: 800 + Location: 71,2 + Actor495: snip + Owner: Greece + SubCell: 3 + Facing: 800 + Location: 71,10 + Actor496: snip + Owner: Greece + SubCell: 3 + Facing: 800 + Location: 64,13 + Actor497: snip + Owner: Greece + SubCell: 3 + Facing: 800 + Location: 59,9 + Actor498: snip + Owner: Greece + SubCell: 3 + Facing: 800 + Location: 54,2 + Actor499: snip + Owner: Greece + SubCell: 3 + Facing: 800 + Location: 63,7 + Actor473: t02 + Owner: Neutral + Faction: soviet + Location: 63,7 + Actor492: snip + Owner: Greece + SubCell: 3 + Facing: 800 + Location: 66,8 + Actor500: rtnk + Owner: Greece + Location: 70,11 + Facing: 919 + Actor501: rtnk + Owner: Greece + Location: 70,3 + Facing: 658 + Actor502: rtnk + Owner: Greece + Location: 63,13 + Facing: 911 + Actor503: rtnk + Owner: Greece + Location: 65,4 + Facing: 658 + Actor504: rtnk + Owner: Greece + Facing: 658 + Location: 58,5 + Actor505: hbox + Owner: Greece + Location: 66,7 + Actor506: hbox + Owner: Greece + Location: 69,13 + Actor507: ptnk + Owner: Greece + Location: 64,29 + Facing: 769 + Actor508: ifv + Owner: Greece + Location: 67,32 + Facing: 777 + Actor509: split2 + Owner: Neutral + Location: 16,21 + Actor510: split2 + Owner: Neutral + Location: 14,25 + Actor511: split2 + Owner: Neutral + Location: 9,21 + Actor512: tc01 + Owner: Neutral + Location: 44,15 + Actor513: tc05 + Owner: Neutral + Location: 34,15 + Actor514: tc04 + Owner: Neutral + Location: 37,6 + Actor515: t16 + Owner: Neutral + Location: 41,7 + Actor516: t13 + Owner: Neutral + Location: 40,5 + Actor517: t12 + Owner: Neutral + Location: 45,12 + Actor518: t13 + Owner: Neutral + Location: 38,14 + Actor519: t15 + Owner: Neutral + Location: 28,2 + Actor520: tc02 + Owner: Neutral + Location: 42,1 + Actor521: t06 + Owner: Neutral + Location: 33,4 + Actor522: t02 + Owner: Neutral + Location: 31,13 + Actor523: t13 + Owner: Neutral + Location: 50,8 + Actor524: t11 + Owner: Neutral + Location: 27,10 + Actor525: t17 + Owner: Neutral + Location: 36,1 + Actor526: tc05 + Owner: Neutral + Location: 25,30 + Actor527: t17 + Owner: Neutral + Location: 24,32 + Actor528: t16 + Owner: Neutral + Location: 30,25 + Actor529: t07 + Owner: Neutral + Location: 44,24 + Actor530: t02 + Owner: Neutral + Location: 50,22 + Actor531: t01 + Owner: Neutral + Location: 25,22 + Actor532: t10 + Owner: Neutral + Location: 33,31 + Actor533: t12 + Owner: Neutral + Location: 47,30 + Actor534: t07 + Owner: Neutral + Location: 51,31 + Actor535: tc02 + Owner: Neutral + Location: 58,24 + Actor536: tc01 + Owner: Neutral + Location: 74,32 + Actor537: tc03 + Owner: Neutral + Location: 86,31 + Actor538: t17 + Owner: Neutral + Location: 92,29 + Actor539: t16 + Owner: Neutral + Location: 84,28 + Actor540: t16 + Owner: Neutral + Location: 79,26 + Actor541: t02 + Owner: Neutral + Location: 70,24 + Actor542: agun + Owner: Greece + Location: 22,69 + Actor543: agun + Owner: Greece + Location: 34,75 + Actor544: agun + Owner: Greece + Location: 11,71 + Actor545: agun + Owner: Greece + Location: 2,68 + Actor546: agun + Owner: Greece + Location: 20,72 + Actor547: agun + Owner: Greece + Location: 34,86 + Actor548: agun + Owner: Greece + Location: 25,86 + Actor549: agun + Owner: Greece + Location: 13,88 + Actor550: pris + Owner: Greece + Location: 35,83 + Actor551: pris + Owner: Greece + Location: 16,67 + Actor552: pris + Owner: Greece + Location: 9,67 + Actor553: split2 + Owner: Neutral + Location: 89,50 + Actor554: split2 + Owner: Neutral + Location: 91,55 + Actor555: split2 + Owner: Neutral + Location: 93,51 + Actor556: brik + Owner: Greece + Location: 56,88 + Actor557: brik + Owner: Greece + Location: 62,88 + Actor558: brik + Owner: Greece + Location: 62,89 + Actor559: brik + Owner: Greece + Location: 63,88 + Actor560: brik + Owner: Greece + Location: 63,89 + Actor561: brik + Owner: Greece + Location: 56,89 + Actor562: brik + Owner: Greece + Location: 55,88 + Actor563: brik + Owner: Greece + Location: 55,89 + Actor564: brik + Owner: Greece + Location: 54,88 + Actor565: brik + Owner: Greece + Location: 53,88 + Actor566: brik + Owner: Greece + Location: 53,89 + Actor567: brik + Owner: Greece + Location: 52,89 + Actor568: brik + Owner: Greece + Location: 52,88 + Actor569: brik + Owner: Greece + Location: 64,88 + Actor570: brik + Owner: Greece + Location: 65,88 + Actor571: brik + Owner: Greece + Location: 65,89 + Actor572: brik + Owner: Greece + Location: 66,89 + Actor573: brik + Owner: Greece + Location: 66,88 + Actor574: brik + Owner: Greece + Location: 66,90 + Actor575: brik + Owner: Greece + Location: 66,91 + Actor576: brik + Owner: Greece + Location: 66,92 + Actor577: brik + Owner: Greece + Location: 66,93 + Actor578: brik + Owner: Greece + Location: 66,94 + Actor579: brik + Owner: Greece + Location: 66,95 + Actor580: brik + Owner: Greece + Location: 66,96 + Actor581: apwr + Owner: Greece + Location: 63,93 + Actor582: apwr + Owner: Greece + Location: 60,93 + Actor584: apwr + Owner: Greece + Location: 53,93 + Actor585: apwr + Owner: Greece + Location: 56,93 + Actor583: apwr + Owner: Greece + Location: 63,90 + Actor586: apwr + Owner: Greece + Location: 53,90 + Actor587: brik + Owner: Greece + Location: 52,90 + Actor588: brik + Owner: Greece + Location: 52,91 + Actor589: brik + Owner: Greece + Location: 52,92 + Actor590: brik + Owner: Greece + Location: 52,93 + Actor591: brik + Owner: Greece + Location: 52,95 + Actor592: brik + Owner: Greece + Location: 52,94 + Actor593: brik + Owner: Greece + Location: 52,96 + Actor594: brik + Owner: Greece + Location: 53,96 + Actor595: brik + Owner: Greece + Location: 54,96 + Actor596: brik + Owner: Greece + Location: 55,96 + Actor597: brik + Owner: Greece + Location: 56,96 + Actor598: brik + Owner: Greece + Location: 57,96 + Actor599: brik + Owner: Greece + Location: 58,96 + Actor600: brik + Owner: Greece + Location: 59,96 + Actor601: brik + Owner: Greece + Location: 60,96 + Actor602: brik + Owner: Greece + Location: 61,96 + Actor603: brik + Owner: Greece + Location: 62,96 + Actor604: brik + Owner: Greece + Location: 63,96 + Actor605: brik + Owner: Greece + Location: 64,96 + Actor606: brik + Owner: Greece + Location: 65,96 + Actor607: pris + Owner: Greece + Location: 54,89 + Actor608: pris + Owner: Greece + Location: 64,89 + Actor609: gun + Owner: Greece + Location: 55,87 + Actor610: gun + Owner: Greece + Location: 63,87 + Actor611: agun + Owner: Greece + Location: 57,91 + TurretFacing: 158 + Actor612: agun + Owner: Greece + Location: 61,91 + Actor613: proc + Owner: Greece + Location: 5,67 + Actor614: silo + Owner: Greece + Location: 7,67 + Actor615: silo + Owner: Greece + Location: 5,67 + Actor616: proc + Owner: Greece + Location: 60,72 + Actor617: silo + Owner: Greece + Location: 60,72 + Actor619: silo + Owner: Greece + Location: 62,72 + Actor620: sbag + Owner: Greece + Location: 59,75 + Actor621: sbag + Owner: Greece + Location: 59,74 + Actor622: sbag + Owner: Greece + Location: 59,77 + Actor623: sbag + Owner: Greece + Location: 59,76 + Actor624: sbag + Owner: Greece + Location: 59,73 + Actor625: sbag + Owner: Greece + Location: 59,72 + Actor626: sbag + Owner: Greece + Location: 59,71 + Actor627: sbag + Owner: Greece + Location: 60,71 + Actor628: sbag + Owner: Greece + Location: 62,71 + Actor629: sbag + Owner: Greece + Location: 61,71 + Actor630: sbag + Owner: Greece + Location: 63,71 + Actor631: sbag + Owner: Greece + Location: 64,71 + Actor632: sbag + Owner: Greece + Location: 60,77 + Actor633: sbag + Owner: Greece + Location: 61,77 + Actor634: sbag + Owner: Greece + Location: 62,77 + Actor635: sbag + Owner: Greece + Location: 63,77 + Actor636: sbag + Owner: Greece + Location: 64,77 + Actor637: sbag + Owner: Greece + Location: 68,71 + Actor638: sbag + Owner: Greece + Location: 69,71 + Actor639: sbag + Owner: Greece + Location: 70,71 + Actor640: sbag + Owner: Greece + Location: 70,72 + Actor641: sbag + Owner: Greece + Location: 70,73 + Actor642: sbag + Owner: Greece + Location: 70,74 + Actor643: sbag + Owner: Greece + Location: 70,75 + Actor644: sbag + Owner: Greece + Location: 70,76 + Actor645: sbag + Owner: Greece + Location: 70,77 + Actor646: sbag + Owner: Greece + Location: 69,77 + Actor647: sbag + Owner: Greece + Location: 68,77 + Actor648: tent + Owner: Greece + Location: 68,72 + Actor649: gun + Owner: Greece + Location: 63,70 + Actor650: gun + Owner: Greece + Location: 69,70 + Actor651: pbox + Owner: Greece + Location: 66,68 + Actor657: pbox + Owner: Greece + Location: 67,81 + Actor652: split2 + Owner: Neutral + Location: 55,73 + Actor653: split2 + Owner: Neutral + Location: 58,69 + Actor654: split2 + Owner: Neutral + Location: 55,67 + Actor655: split2 + Owner: Neutral + Location: 6,62 + Actor656: split2 + Owner: Neutral + Location: 4,58 + Actor659: split2 + Owner: Neutral + Location: 74,90 + Actor660: split2 + Owner: Neutral + Location: 78,89 + Actor661: gap + Owner: Greece + Location: 9,70 + Actor662: gap + Owner: Greece + Location: 27,84 + Actor663: gap + Owner: Greece + Location: 12,81 + Actor664: gap + Owner: Greece + Location: 45,61 + Actor665: gap + Owner: Greece + Location: 59,90 + Actor666: gap + Owner: Greece + Location: 65,74 + Actor667: gap + Owner: Greece + Location: 48,71 + Actor668: htur + Owner: Greece + Location: 45,64 + TurretFacing: 864 + Actor669: gun + Owner: Greece + Location: 32,55 + TurretFacing: 808 + Actor670: e1 + Owner: Greece + SubCell: 3 + Location: 68,78 + Facing: 674 + Actor671: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 68,75 + Actor672: e1 + Owner: Greece + SubCell: 3 + Location: 64,70 + Facing: 174 + Actor673: e1 + Owner: Greece + SubCell: 3 + Location: 67,68 + Facing: 0 + Actor674: e1 + Owner: Greece + SubCell: 3 + Location: 71,74 + Facing: 0 + Actor675: e1 + Owner: Greece + SubCell: 3 + Location: 84,77 + Facing: 126 + Actor676: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 84,82 + Actor677: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 37,82 + Actor678: e1 + Owner: Greece + SubCell: 3 + Location: 39,77 + Facing: 384 + Actor679: e1 + Owner: Greece + SubCell: 3 + Location: 32,84 + Facing: 594 + Actor680: e1 + Owner: Greece + SubCell: 3 + Location: 28,82 + Facing: 578 + Actor681: e1 + Owner: Greece + Location: 28,82 + SubCell: 1 + Facing: 134 + Actor682: e1 + Owner: Greece + SubCell: 3 + Location: 26,82 + Facing: 158 + Actor683: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 27,80 + Actor684: e1 + Owner: Greece + SubCell: 3 + Location: 29,76 + Facing: 384 + Actor685: e1 + Owner: Greece + SubCell: 3 + Location: 22,73 + Facing: 515 + Actor686: e1 + Owner: Greece + SubCell: 3 + Location: 16,72 + Facing: 634 + Actor687: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 11,73 + Actor688: e1 + Owner: Greece + SubCell: 3 + Location: 9,80 + Facing: 682 + Actor691: weap + Owner: Greece + Location: 30,75 + Actor692: t10 + Owner: Neutral + Location: 76,65 + Actor693: tc05 + Owner: Neutral + Location: 59,50 + Actor694: tc02 + Owner: Neutral + Location: 50,57 + Actor695: t16 + Owner: Neutral + Location: 89,62 + Actor696: t12 + Owner: Neutral + Location: 71,62 + Actor697: t05 + Owner: Neutral + Location: 76,73 + Actor698: t11 + Owner: Neutral + Location: 94,70 + Actor699: t07 + Owner: Neutral + Location: 52,78 + Actor700: tc01 + Owner: Neutral + Location: 70,80 + Actor701: t16 + Owner: Neutral + Location: 47,78 + Actor702: t11 + Owner: Neutral + Location: 45,76 + Actor703: t12 + Owner: Neutral + Location: 47,85 + Actor704: tc04 + Owner: Neutral + Location: 33,68 + Actor705: t13 + Owner: Neutral + Location: 23,54 + Actor706: t15 + Owner: Neutral + Location: 40,46 + Actor707: tc01 + Owner: Neutral + Location: 45,45 + Actor708: t11 + Owner: Neutral + Location: 31,46 + Actor709: tc02 + Owner: Neutral + Location: 19,47 + Actor710: t02 + Owner: Neutral + Location: 24,46 + Actor713: t07 + Owner: Neutral + Location: 55,46 + Actor714: tc01 + Owner: Neutral + Location: 62,46 + Actor715: tc04 + Owner: Neutral + Location: 92,68 + Actor716: t07 + Owner: Neutral + Location: 91,70 + Actor717: t01 + Owner: Neutral + Location: 63,52 + Actor718: t05 + Owner: Neutral + Location: 58,51 + Actor719: t13 + Owner: Neutral + Location: 59,53 + Actor720: t12 + Owner: Neutral + Location: 50,59 + Actor721: t10 + Owner: Neutral + Location: 48,61 + Actor722: t05 + Owner: Neutral + Location: 43,60 + Actor723: t07 + Owner: Neutral + Location: 47,68 + Actor724: t02 + Owner: Neutral + Location: 48,66 + Actor725: tc01 + Owner: Neutral + Location: 34,91 + Actor726: t05 + Owner: Neutral + Location: 36,90 + Actor727: t07 + Owner: Neutral + Location: 43,94 + Actor728: t06 + Owner: Neutral + Location: 42,89 + Actor729: t02 + Owner: Neutral + Location: 17,94 + Actor730: t13 + Owner: Neutral + Location: 16,92 + Actor731: t15 + Owner: Neutral + Location: 20,94 + Actor732: t05 + Owner: Neutral + Location: 10,94 + Actor733: t07 + Owner: Neutral + Location: 3,79 + Actor734: t01 + Owner: Neutral + Location: 18,55 + Actor735: t15 + Owner: Neutral + Location: 15,57 + Actor736: t07 + Owner: Neutral + Location: 36,54 + Church: v01 + Owner: Neutral + Location: 4,30 + Actor737: v04 + Owner: Neutral + Location: 3,26 + Actor738: v11 + Owner: Neutral + Location: 2,33 + Actor739: v07 + Owner: Neutral + Location: 23,29 + Actor740: medi + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 27,81 + Actor741: enfo + Owner: Greece + SubCell: 3 + Location: 25,74 + Facing: 512 + Actor742: enfo + Owner: Greece + SubCell: 3 + Location: 27,74 + Facing: 512 + Actor743: enfo + Owner: Greece + SubCell: 3 + Location: 57,88 + Facing: 0 + Actor744: enfo + Owner: Greece + SubCell: 3 + Location: 61,88 + Facing: 0 + Actor745: e3 + Owner: Greece + Facing: 384 + Location: 87,77 + SubCell: 3 + Actor746: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 89,82 + Actor747: e3 + Owner: Greece + SubCell: 3 + Location: 69,76 + Facing: 610 + Actor748: e3 + Owner: Greece + SubCell: 3 + Location: 68,69 + Facing: 0 + Actor749: e3 + Owner: Greece + Facing: 384 + Location: 60,47 + Actor750: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 48,50 + Actor751: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 44,63 + Actor752: e3 + Owner: Greece + Location: 39,77 + SubCell: 1 + Facing: 911 + Actor753: e3 + Owner: Greece + SubCell: 3 + Location: 38,82 + Facing: 650 + Actor754: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 10,72 + Actor755: e3 + Owner: Greece + SubCell: 3 + Location: 8,81 + Facing: 594 + Actor756: ptnk + Owner: Greece + Location: 38,85 + Facing: 753 + Actor757: arty + Owner: Greece + Location: 45,63 + Facing: 880 + Actor758: arty + Owner: Greece + Location: 48,68 + Facing: 888 + Actor759: 2tnk + Owner: Greece + Location: 16,63 + Facing: 904 + Actor760: 2tnk + Owner: Greece + Location: 40,81 + Facing: 769 + Actor761: 1tnk + Owner: Greece + Location: 82,79 + Facing: 118 + Actor762: minv + Owner: Greece + Location: 79,7 + Actor763: minv + Owner: Greece + Location: 79,6 + Actor764: minv + Owner: Greece + Location: 79,8 + Actor765: minv + Owner: Greece + Location: 89,16 + Actor766: minv + Owner: Greece + Location: 88,16 + Actor767: minv + Owner: Greece + Location: 90,16 + Actor768: 2tnk + Owner: Greece + Location: 20,15 + Facing: 618 + Actor769: 2tnk + Owner: Greece + Location: 25,10 + Facing: 650 + Actor770: arty + Owner: Greece + Location: 22,12 + Facing: 650 + Actor771: jeep + Owner: Greece + Facing: 384 + Location: 77,26 + Actor772: jeep + Owner: Greece + Facing: 384 + Location: 26,14 + Actor773: e1 + Owner: Greece + Location: 17,12 + Facing: 515 + Actor774: e1 + Owner: Greece + SubCell: 3 + Location: 21,5 + Facing: 650 + Actor775: e1 + Owner: Greece + SubCell: 3 + Location: 19,5 + Facing: 793 + Actor776: e1 + Owner: Greece + SubCell: 3 + Location: 25,4 + Facing: 753 + Actor777: e1 + Owner: Greece + SubCell: 3 + Location: 24,11 + Facing: 666 + Actor778: e1 + Owner: Greece + SubCell: 3 + Location: 26,12 + Facing: 666 + Actor779: e1 + Owner: Greece + SubCell: 3 + Location: 23,15 + Facing: 570 + Actor780: e3 + Owner: Greece + SubCell: 3 + Location: 21,14 + Facing: 539 + Actor781: e3 + Owner: Greece + Location: 25,11 + SubCell: 3 + Facing: 816 + Actor782: medi + Owner: Greece + SubCell: 3 + Location: 22,14 + Facing: 384 + Actor783: jeep + Owner: Greece + Location: 75,58 + Facing: 904 + Actor784: jeep + Owner: Greece + Location: 77,59 + Facing: 904 + Actor785: ptnk + Owner: Greece + Location: 11,62 + Facing: 927 + Actor786: e1 + Owner: Greece + SubCell: 3 + Location: 17,64 + Facing: 959 + Actor787: e1 + Owner: Greece + SubCell: 3 + Facing: 959 + Location: 12,61 + Actor788: e1 + Owner: Greece + SubCell: 3 + Facing: 959 + Location: 11,60 + Actor789: e1 + Owner: Greece + SubCell: 3 + Facing: 959 + Location: 22,55 + Actor790: e1 + Owner: Greece + SubCell: 3 + Location: 18,50 + Facing: 650 + Actor791: agun + Owner: Greece + TurretFacing: 1023 + Location: 35,46 + Actor792: agun + Owner: Greece + TurretFacing: 1023 + Location: 27,48 + Actor793: agun + Owner: Greece + TurretFacing: 1023 + Location: 17,48 + Actor796: atek + Owner: Greece + Location: 9,76 + Actor797: pdox + Owner: Greece + Location: 5,77 + Actor795: chain + Owner: Greece + Location: 4,76 + Actor798: chain + Owner: Greece + Location: 4,77 + Actor799: chain + Owner: Greece + Location: 4,78 + Actor800: chain + Owner: Greece + Location: 5,76 + Actor801: chain + Owner: Greece + Location: 6,76 + Actor802: chain + Owner: Greece + Location: 7,76 + Actor803: chain + Owner: Greece + Location: 7,78 + Actor804: chain + Owner: Greece + Location: 7,77 + Actor805: chain + Owner: Greece + Location: 4,79 + Actor806: chain + Owner: Greece + Location: 6,79 + Actor807: chain + Owner: Greece + Location: 5,79 + Actor808: chain + Owner: Greece + Location: 7,79 + Actor820: camera + Owner: Greece + Location: 79,28 + Actor821: camera + Owner: Greece + Location: 61,28 + Actor822: camera + Owner: Greece + Location: 45,21 + Actor823: camera + Owner: Greece + Location: 32,27 + Actor824: camera + Owner: Greece + Location: 12,27 + Actor825: camera + Owner: Greece + Location: 16,9 + Actor826: camera + Owner: Greece + Location: 43,9 + Actor827: camera + Owner: Greece + Location: 65,6 + Actor828: camera + Owner: Greece + Location: 82,4 + Actor829: camera + Owner: Greece + Location: 68,54 + Actor830: camera + Owner: Greece + Location: 83,65 + Path1_1: waypoint + Owner: Neutral + Location: 42,79 + Path2_1: waypoint + Owner: Neutral + Location: 17,60 + Path1_2: waypoint + Owner: Neutral + Location: 65,79 + Path2_2: waypoint + Owner: Neutral + Location: 41,54 + LandingCraftSpawn: waypoint + Owner: Neutral + Location: 96,39 + LandingCraftRally: waypoint + Owner: Neutral + Location: 43,36 + CruiserSpawn: waypoint + Owner: Neutral + Location: 1,40 + CruiserPatrol1: waypoint + Owner: Neutral + Location: 6,40 + ChronoDest1: waypoint + Owner: Neutral + Location: 5,32 + ChronoDest2: waypoint + Owner: Neutral + Location: 30,31 + ChronoDest3: waypoint + Owner: Neutral + Location: 53,32 + ChronoDest4: waypoint + Owner: Neutral + Location: 72,31 + ChronoDest5: waypoint + Owner: Neutral + Location: 92,28 + ChronoDest6: waypoint + Owner: Neutral + Location: 79,3 + ChronoDest7: waypoint + Owner: Neutral + Location: 60,12 + ChronoDest8: waypoint + Owner: Neutral + Location: 46,7 + ChronoDest9: waypoint + Owner: Neutral + Location: 2,16 + Actor831: 3tnk + Owner: USSR + Facing: 384 + Location: 86,5 + Actor832: 3tnk + Owner: USSR + Facing: 384 + Location: 92,11 + McvSpawn: waypoint + Owner: Neutral + Location: 96,1 + McvRally: waypoint + Owner: Neutral + Location: 89,8 + SubSpawn1: waypoint + Owner: Neutral + Location: 96,38 + SubSpawn2: waypoint + Owner: Neutral + Location: 96,40 + SubRally1: waypoint + Owner: Neutral + Location: 47,38 + SubRally2: waypoint + Owner: Neutral + Location: 47,40 + Actor833: dd + Owner: Greece + Location: 84,41 + Facing: 785 + AlliedOutpost: waypoint + Owner: Neutral + Location: 19,7 + TopPathTopLeft: waypoint + Owner: Neutral + Location: 49,1 + BottomPathTopLeft: waypoint + Owner: Neutral + Location: 51,20 + BottomPathBottomRight: waypoint + Owner: Neutral + Location: 92,36 + PlayerStart: waypoint + Owner: Neutral + Location: 88,9 + TopPathBottomRight: waypoint + Owner: Neutral + Location: 76,14 + PrisonerSpawn: waypoint + Owner: Neutral + Location: 26,70 + ProdigyRally: waypoint + Owner: Neutral + Location: 25,71 + YuriRally: waypoint + Owner: Neutral + Location: 27,71 + Actor835: apwr + Owner: Greece + Location: 7,82 + Actor836: apwr + Owner: Greece + Location: 14,82 + Actor837: apwr + Owner: Greece + Location: 17,81 + Actor838: powr + Owner: Greece + Location: 10,88 + CruiserPatrol2: waypoint + Owner: Neutral + Location: 91,40 + ChronoTankSpawn: waypoint + Owner: Neutral + Location: 1,73 + ChronoTankRally: waypoint + Owner: Neutral + Location: 13,75 + ChronoDest10: waypoint + Owner: Neutral + Location: 93,48 + ChronoDest12: waypoint + Owner: Neutral + Location: 89,89 + ChronoDest11: waypoint + Owner: Neutral + Location: 82,71 + Actor811: mdrn + Owner: GDI + SubCell: 3 + Location: 28,69 + Facing: 317 + Actor812: mdrn + Owner: GDI + Location: 24,69 + SubCell: 3 + Facing: 682 + Actor813: mdrn + Owner: GDI + SubCell: 3 + Location: 26,68 + Facing: 555 + Actor814: mdrn + Owner: GDI + SubCell: 3 + Facing: 848 + Location: 24,71 + Actor815: mdrn + Owner: GDI + SubCell: 3 + Facing: 237 + Location: 28,71 + Actor816: mdrn + Owner: GDI + SubCell: 3 + Location: 26,72 + Facing: 0 + Actor818: htnk.drone + Owner: GDI + Location: 28,76 + Facing: 512 + Actor817: htnk.drone + Owner: GDI + Facing: 512 + Location: 24,76 + Actor819: split2 + Owner: Neutral + Location: 7,56 + Actor849: gun + Owner: Greece + TurretFacing: 0 + Location: 4,50 + Actor850: sbag + Owner: Greece + Location: 3,51 + Actor851: sbag + Owner: Greece + Location: 4,51 + Actor852: sbag + Owner: Greece + Location: 5,51 + Actor853: sbag + Owner: Greece + Location: 3,52 + Actor854: agun + Owner: Greece + TurretFacing: 1023 + Location: 4,52 + Actor855: sbag + Owner: Greece + Location: 5,52 + Actor856: mgg + Owner: Greece + Facing: 384 + Location: 2,53 + Actor857: sbag + Owner: Greece + Location: 3,53 + Actor858: sbag + Owner: Greece + Location: 4,53 + Actor859: sbag + Owner: Greece + Location: 5,53 + AlliedNavalYard: syrd + Owner: Greece + Location: 10,45 + Actor834: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 4,67 + Actor839: e3 + Owner: Greece + SubCell: 3 + Location: 21,68 + Facing: 0 + Actor840: e3 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 8,67 + Actor841: e3 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 24,60 + Actor842: e3 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 22,58 + Actor843: e3 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 15,57 + Actor844: e3 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 17,55 + Actor845: e3 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 9,51 + Actor846: e3 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 12,50 + Actor847: e3 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 20,49 + Actor848: e3 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 22,47 + Actor860: e3 + Owner: Greece + SubCell: 3 + Location: 16,50 + Facing: 293 + Actor861: ifv + Owner: Greece + Location: 17,56 + Facing: 0 + Actor862: ifv + Owner: Greece + Location: 10,54 + Facing: 0 + Actor863: ifv + Owner: Greece + Location: 18,69 + Facing: 0 + Actor864: ifv + Owner: Greece + Location: 6,72 + Facing: 768 + Actor866: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 19,65 + Actor867: ifv + Owner: Greece + Facing: 768 + Location: 32,89 + Actor868: ifv + Owner: Greece + Facing: 768 + Location: 33,83 + Actor869: ifv + Owner: Greece + Location: 10,86 + Facing: 512 + Actor870: ifv + Owner: Greece + Location: 17,84 + Facing: 768 + Actor871: ifv + Owner: Greece + Facing: 768 + Location: 11,82 + Actor872: dd + Owner: Greece + Location: 13,44 + Facing: 896 + Actor873: dd + Owner: Greece + Location: 10,43 + TurretFacing@PRIMARY: 0 + Facing: 896 + Actor874: camera + Owner: Greece + Location: 23,17 + Actor875: minv + Owner: Greece + Location: 73,6 + Actor876: minv + Owner: Greece + Location: 70,8 + Actor877: minv + Owner: Greece + Location: 62,7 + Actor878: minv + Owner: Greece + Location: 62,4 + Actor879: minv + Owner: Greece + Location: 55,7 + Actor880: minv + Owner: Greece + Location: 52,6 + Actor881: minv + Owner: Greece + Location: 61,6 + Actor882: minv + Owner: Greece + Location: 91,20 + Actor884: minv + Owner: Greece + Location: 84,23 + Actor885: minv + Owner: Greece + Location: 85,27 + Actor886: minv + Owner: Greece + Location: 79,25 + Actor887: minv + Owner: Greece + Location: 74,25 + Actor888: minv + Owner: Greece + Location: 71,29 + Actor890: minv + Owner: Greece + Location: 58,30 + Actor891: minv + Owner: Greece + Location: 57,27 + Actor892: minv + Owner: Greece + Location: 64,28 + Actor889: minv + Owner: Greece + Location: 82,24 + WeatherControl: weat + Owner: Greece + Location: 2,77 + Actor893: chain + Owner: Greece + Location: 2,76 + Actor894: chain + Owner: Greece + Location: 1,76 + Actor895: chain + Owner: Greece + Location: 1,77 + Actor896: chain + Owner: Greece + Location: 1,78 + Actor897: chain + Owner: Greece + Location: 1,79 + Actor898: chain + Owner: Greece + Location: 2,79 + Actor899: chain + Owner: Greece + Location: 3,79 + Actor900: chain + Owner: Greece + Location: 3,76 + Actor901: agun + Owner: Greece + Location: 6,82 + Actor902: agun + Owner: Greece + Location: 2,74 + Actor267: fact + Owner: Greece + Location: 18,84 + Actor903: agun + Owner: Greece + Location: 19,88 + Actor865: ifv + Owner: Greece + Facing: 768 + Location: 25,84 + Actor904: apwr + Owner: Greece + Location: 21,80 + Actor905: powr + Owner: Greece + Location: 24,81 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|missions/main-campaign/ca39-jailbreak/jailbreak-rules.yaml, ca|rules/custom/coop-rules.yaml, jailbreak-coop-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/coop-campaign/ca40-conduit-coop/conduit-coop-rules.yaml b/mods/ca/missions/coop-campaign/ca40-conduit-coop/conduit-coop-rules.yaml new file mode 100644 index 0000000000..ba1cdde72e --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca40-conduit-coop/conduit-coop-rules.yaml @@ -0,0 +1,6 @@ +World: + LuaScript: + Scripts: campaign.lua, coop.lua, ca|missions/main-campaign/ca40-conduit/conduit.lua, conduit-coop.lua + LobbyMissionInfo@InitialObjectives: + Prefix: Initial Objectives + Text: • Eliminate Nod forces protecting the interstellar gateway. diff --git a/mods/ca/missions/coop-campaign/ca40-conduit-coop/conduit-coop.lua b/mods/ca/missions/coop-campaign/ca40-conduit-coop/conduit-coop.lua new file mode 100644 index 0000000000..502caee869 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca40-conduit-coop/conduit-coop.lua @@ -0,0 +1,39 @@ + +SetupPlayers = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Multi2 = Player.GetPlayer("Multi2") + Multi3 = Player.GetPlayer("Multi3") + Multi4 = Player.GetPlayer("Multi4") + Multi5 = Player.GetPlayer("Multi5") + USSR = Player.GetPlayer("USSR") + Nod1 = Player.GetPlayer("Nod1") + Nod2 = Player.GetPlayer("Nod2") + Nod3 = Player.GetPlayer("Nod3") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = Utils.Where({ Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 }, function(p) return p ~= nil end) + MissionEnemies = { Nod1, Nod2, Nod3 } + SinglePlayerPlayer = USSR + CoopInit() +end + +AfterWorldLoaded = function() + local firstActivePlayer = GetFirstActivePlayer() + TransferBaseToPlayer(SinglePlayerPlayer, firstActivePlayer) + StartCashSpread(3500) + + local delay = 25 + local path = { CPos.New(18,1), CPos.New(18,8) } + Utils.Do(GetMcvPlayers(), function(p) + if p ~= firstActivePlayer then + Trigger.AfterDelay(delay, function() + Reinforcements.Reinforce(p, { "mcv" }, path) + end) + delay = delay + DateTime.Seconds(1) + end + end) +end + +AfterTick = function() + +end diff --git a/mods/ca/missions/coop-campaign/ca40-conduit-coop/map.bin b/mods/ca/missions/coop-campaign/ca40-conduit-coop/map.bin new file mode 100644 index 0000000000..3248115067 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca40-conduit-coop/map.bin differ diff --git a/mods/ca/missions/coop-campaign/ca40-conduit-coop/map.png b/mods/ca/missions/coop-campaign/ca40-conduit-coop/map.png new file mode 100644 index 0000000000..0ca57524fd Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca40-conduit-coop/map.png differ diff --git a/mods/ca/missions/coop-campaign/ca40-conduit-coop/map.yaml b/mods/ca/missions/coop-campaign/ca40-conduit-coop/map.yaml new file mode 100644 index 0000000000..bcddc1c577 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca40-conduit-coop/map.yaml @@ -0,0 +1,1622 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 40: Conduit Co-op + +Author: Darkademic & Gandorques Hikla + +Tileset: DESERT + +MapSize: 98,130 + +Bounds: 1,1,96,128 + +Visibility: Lobby + +Categories: Co-op Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: USSR, Nod1, Nod2, Nod3, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + PlayerReference@USSR: + Name: USSR + Faction: soviet + Color: FE1100 + Allies: Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Nod1, Nod2, Nod3, Creeps + PlayerReference@Nod1: + Name: Nod1 + Bot: campaign + Faction: nod + Color: 6D738C + Allies: Nod2, Nod3 + Enemies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@Nod2: + Name: Nod2 + Bot: dormant + Faction: nod + Color: 6D738C + Allies: Nod1, Nod3 + Enemies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@Nod3: + Name: Nod3 + Bot: dormant + Faction: nod + Color: 6D738C + Allies: Nod1, Nod2 + Enemies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@NodGateway: + Name: NodGateway + Bot: dormant + NonCombatant: True + Faction: nod + Color: FE1100 + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: FE1100 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Nod1, Nod2, Nod3, Creeps + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: FF9922 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Nod1, Nod2, Nod3, Creeps + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: 994050 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Nod1, Nod2, Nod3, Creeps + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: 775A12 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Nod1, Nod2, Nod3, Creeps + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: 82C900 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Nod1, Nod2, Nod3, Creeps + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: DD1691 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Nod1, Nod2, Nod3, Creeps + +Actors: + Actor0: fact + Owner: USSR + Location: 22,7 + Actor2: powr + Owner: USSR + Location: 22,3 + Actor3: fenc + Owner: USSR + Location: 23,19 + Actor4: fenc + Owner: USSR + Location: 25,19 + Actor5: fenc + Owner: USSR + Location: 22,19 + Actor6: fenc + Owner: USSR + Location: 24,19 + Actor7: fenc + Owner: USSR + Location: 25,18 + Actor8: fenc + Owner: USSR + Location: 26,18 + Actor9: fenc + Owner: USSR + Location: 29,15 + Actor10: fenc + Owner: USSR + Location: 30,15 + Actor11: fenc + Owner: USSR + Location: 31,14 + Actor12: fenc + Owner: USSR + Location: 30,14 + Actor13: fenc + Owner: USSR + Location: 32,14 + Actor14: fenc + Owner: USSR + Location: 21,19 + Actor15: ftur + Owner: USSR + Location: 24,18 + Actor16: ftur + Owner: USSR + Location: 29,14 + Actor17: btr + Owner: USSR + Location: 25,17 + Facing: 634 + Actor18: btr + Owner: USSR + Location: 27,14 + Facing: 618 + Actor19: 3tnk + Owner: USSR + Location: 26,19 + Facing: 626 + Actor20: 3tnk + Owner: USSR + Location: 30,16 + Facing: 626 + Actor24: e1 + Owner: USSR + SubCell: 3 + Location: 29,13 + Facing: 610 + Actor26: e1 + Owner: USSR + SubCell: 3 + Location: 29,11 + Facing: 713 + Actor27: e1 + Owner: USSR + SubCell: 3 + Facing: 610 + Location: 27,16 + Actor28: e1 + Owner: USSR + SubCell: 3 + Facing: 610 + Location: 24,16 + Actor29: e1 + Owner: USSR + SubCell: 3 + Facing: 610 + Location: 22,17 + Actor30: e1 + Owner: USSR + SubCell: 3 + Facing: 610 + Location: 19,15 + Actor31: e3 + Owner: USSR + SubCell: 3 + Location: 22,16 + Facing: 610 + Actor32: e3 + Owner: USSR + SubCell: 3 + Location: 26,13 + Facing: 642 + Actor33: split2 + Owner: Neutral + Location: 39,5 + Actor35: powr + Owner: USSR + Location: 24,3 + Actor34: obli + Owner: Nod1 + Location: 55,108 + Actor36: obli + Owner: Nod1 + Location: 62,108 + Actor37: brik + Owner: Nod1 + Location: 53,98 + Actor38: brik + Owner: Nod1 + Location: 53,99 + Actor39: brik + Owner: Nod1 + Location: 54,99 + Actor40: brik + Owner: Nod1 + Location: 54,98 + Actor41: brik + Owner: Nod1 + Location: 52,98 + Actor42: brik + Owner: Nod1 + Location: 51,98 + Actor43: brik + Owner: Nod1 + Location: 50,98 + Actor44: brik + Owner: Nod1 + Location: 49,98 + Actor45: brik + Owner: Nod1 + Location: 48,98 + Actor46: brik + Owner: Nod1 + Location: 47,98 + Actor47: brik + Owner: Nod1 + Location: 46,98 + Actor48: brik + Owner: Nod1 + Location: 46,99 + Actor49: brik + Owner: Nod1 + Location: 46,101 + Actor50: brik + Owner: Nod1 + Location: 46,100 + Actor51: brik + Owner: Nod1 + Location: 46,102 + Actor52: brik + Owner: Nod1 + Location: 46,104 + Actor53: brik + Owner: Nod1 + Location: 46,103 + Actor54: brik + Owner: Nod1 + Location: 45,104 + Actor55: brik + Owner: Nod1 + Location: 44,104 + Actor56: brik + Owner: Nod1 + Location: 43,104 + Actor57: brik + Owner: Nod1 + Location: 43,105 + Actor58: brik + Owner: Nod1 + Location: 43,106 + Actor59: brik + Owner: Nod1 + Location: 43,107 + Actor60: brik + Owner: Nod1 + Location: 44,107 + Actor61: brik + Owner: Nod1 + Location: 44,106 + Actor62: brik + Owner: Nod1 + Location: 43,111 + Actor63: brik + Owner: Nod1 + Location: 44,111 + Actor64: brik + Owner: Nod1 + Location: 43,112 + Actor65: brik + Owner: Nod1 + Location: 44,112 + Actor66: brik + Owner: Nod1 + Location: 58,98 + Actor67: brik + Owner: Nod1 + Location: 58,99 + Actor68: brik + Owner: Nod1 + Location: 59,99 + Actor69: brik + Owner: Nod1 + Location: 59,98 + Actor70: brik + Owner: Nod1 + Location: 60,98 + Actor71: brik + Owner: Nod1 + Location: 61,98 + Actor72: brik + Owner: Nod1 + Location: 62,98 + Actor73: brik + Owner: Nod1 + Location: 63,98 + Actor74: brik + Owner: Nod1 + Location: 64,98 + Actor75: brik + Owner: Nod1 + Location: 64,98 + Actor76: brik + Owner: Nod1 + Location: 65,98 + Actor77: brik + Owner: Nod1 + Location: 66,98 + Actor78: brik + Owner: Nod1 + Location: 66,99 + Actor79: brik + Owner: Nod1 + Location: 66,100 + Actor80: brik + Owner: Nod1 + Location: 67,100 + Actor81: brik + Owner: Nod1 + Location: 68,100 + Actor82: brik + Owner: Nod1 + Location: 69,100 + Actor83: brik + Owner: Nod1 + Location: 69,101 + Actor84: brik + Owner: Nod1 + Location: 69,102 + Actor85: brik + Owner: Nod1 + Location: 69,103 + Actor86: brik + Owner: Nod1 + Location: 70,103 + Actor87: brik + Owner: Nod1 + Location: 71,103 + Actor88: brik + Owner: Nod1 + Location: 72,103 + Actor89: brik + Owner: Nod1 + Location: 73,103 + Actor90: brik + Owner: Nod1 + Location: 73,104 + Actor91: brik + Owner: Nod1 + Location: 73,105 + Actor92: brik + Owner: Nod1 + Location: 73,106 + Actor93: brik + Owner: Nod1 + Location: 72,106 + Actor94: brik + Owner: Nod1 + Location: 72,105 + Actor95: brik + Owner: Nod1 + Location: 73,110 + Actor96: brik + Owner: Nod1 + Location: 72,110 + Actor97: brik + Owner: Nod1 + Location: 72,111 + Actor98: brik + Owner: Nod1 + Location: 73,111 + Actor99: brik + Owner: Nod1 + Location: 73,112 + Actor100: brik + Owner: Nod1 + Location: 73,113 + Actor101: brik + Owner: Nod1 + Location: 73,115 + Actor102: brik + Owner: Nod1 + Location: 73,114 + Actor103: brik + Owner: Nod1 + Location: 73,116 + Actor104: brik + Owner: Nod1 + Location: 43,113 + Actor105: brik + Owner: Nod1 + Location: 43,114 + Actor106: brik + Owner: Nod1 + Location: 43,115 + Actor107: brik + Owner: Nod1 + Location: 43,116 + Actor108: brik + Owner: Nod1 + Location: 43,117 + Actor109: brik + Owner: Nod1 + Location: 43,118 + Actor110: brik + Owner: Nod1 + Location: 43,119 + Actor111: brik + Owner: Nod1 + Location: 44,119 + Actor112: brik + Owner: Nod1 + Location: 46,119 + Actor113: brik + Owner: Nod1 + Location: 45,119 + Actor114: brik + Owner: Nod1 + Location: 47,119 + Actor115: brik + Owner: Nod1 + Location: 48,119 + Actor116: brik + Owner: Nod1 + Location: 49,119 + Actor117: brik + Owner: Nod1 + Location: 49,120 + Actor118: brik + Owner: Nod1 + Location: 49,121 + Actor119: brik + Owner: Nod1 + Location: 49,122 + Actor120: brik + Owner: Nod1 + Location: 51,122 + Actor121: brik + Owner: Nod1 + Location: 50,122 + Actor122: brik + Owner: Nod1 + Location: 52,122 + Actor123: brik + Owner: Nod1 + Location: 52,121 + Actor124: brik + Owner: Nod1 + Location: 51,121 + Actor125: brik + Owner: Nod1 + Location: 60,121 + Actor126: brik + Owner: Nod1 + Location: 60,122 + Actor127: brik + Owner: Nod1 + Location: 61,122 + Actor128: brik + Owner: Nod1 + Location: 61,121 + Actor129: brik + Owner: Nod1 + Location: 62,122 + Actor130: brik + Owner: Nod1 + Location: 63,122 + Actor131: brik + Owner: Nod1 + Location: 65,122 + Actor132: brik + Owner: Nod1 + Location: 64,122 + Actor133: brik + Owner: Nod1 + Location: 66,122 + Actor134: brik + Owner: Nod1 + Location: 67,122 + Actor135: brik + Owner: Nod1 + Location: 68,122 + Actor136: brik + Owner: Nod1 + Location: 69,122 + Actor137: brik + Owner: Nod1 + Location: 70,122 + Actor138: brik + Owner: Nod1 + Location: 71,122 + Actor139: brik + Owner: Nod1 + Location: 72,122 + Actor140: brik + Owner: Nod1 + Location: 72,121 + Actor141: brik + Owner: Nod1 + Location: 73,118 + Actor142: brik + Owner: Nod1 + Location: 73,117 + Actor143: brik + Owner: Nod1 + Location: 73,119 + Actor144: brik + Owner: Nod1 + Location: 73,121 + Actor145: brik + Owner: Nod1 + Location: 73,122 + Actor146: brik + Owner: Nod1 + Location: 73,120 + Actor147: afac + Owner: Nod1 + Location: 68,119 + Actor148: hq + Owner: Nod1 + Location: 65,107 + Actor149: airs + Owner: Nod1 + Location: 45,115 + Actor150: nuk2 + Owner: Nod1 + Location: 71,115 + Actor151: nuk2 + Owner: Nod1 + Location: 69,115 + Actor152: nuk2 + Owner: Nod1 + Location: 71,112 + Actor153: nuk2 + Owner: Nod1 + Location: 69,112 + Actor154: nuk2 + Owner: Nod1 + Location: 65,119 + Actor155: nuk2 + Owner: Nod1 + Location: 63,119 + Actor156: hand + Owner: Nod1 + Location: 48,103 + Actor157: nsam + Owner: Nod1 + Location: 58,107 + Actor158: nsam + Owner: Nod1 + Location: 66,117 + Actor159: nsam + Owner: Nod1 + Location: 51,115 + Actor160: nsam + Owner: Nod1 + Location: 67,101 + Actor161: nsam + Owner: Nod1 + Location: 47,99 + Actor162: obli + Owner: Nod1 + Location: 52,99 + Actor163: obli + Owner: Nod1 + Location: 60,99 + Actor164: obli + Owner: Nod1 + Location: 44,105 + Actor165: obli + Owner: Nod1 + Location: 72,104 + Actor166: obli + Owner: Nod1 + Location: 50,121 + Actor167: gun.nod + Owner: Nod1 + Location: 53,97 + TurretFacing: 1023 + Actor168: gun.nod + Owner: Nod1 + Location: 59,97 + TurretFacing: 0 + Actor169: gun.nod + Owner: Nod1 + Location: 42,106 + Actor170: gun.nod + Owner: Nod1 + Location: 42,112 + Actor171: gun.nod + Owner: Nod1 + Location: 74,105 + TurretFacing: 896 + Actor172: gun.nod + Owner: Nod1 + Location: 74,111 + TurretFacing: 832 + Actor173: rep + Owner: Nod1 + Location: 62,101 + Actor174: nuk2 + Owner: Nod1 + Location: 49,109 + Actor175: tmpp + Owner: Nod1 + Location: 59,116 + MainTemple: tmpl + Owner: Nod1 + Location: 59,109 + Actor177: nuk2 + Owner: Nod1 + Location: 47,109 + Actor178: nuk2 + Owner: Nod1 + Location: 51,102 + Actor179: nuk2 + Owner: Nod1 + Location: 53,102 + Actor180: proc.td + Owner: Nod1 + Location: 54,118 + Actor181: silo.td + Owner: Nod1 + Location: 66,115 + Actor182: silo.td + Owner: Nod1 + Location: 51,119 + Actor183: split2 + Owner: Neutral + Location: 50,126 + Actor184: split2 + Owner: Neutral + Location: 57,125 + Actor185: split2 + Owner: Neutral + Location: 65,126 + Actor186: split2 + Owner: Neutral + Location: 70,125 + Actor187: obli + Location: 31,66 + Owner: Nod2 + Actor193: proc.td + Location: 14,67 + Owner: Nod2 + NodWestHand: hand + Location: 24,57 + Owner: Nod2 + Actor200: nsam + Location: 4,55 + Owner: Nod2 + NodWestAirstrip: airs + Location: 5,57 + Owner: Nod2 + Actor201: afac + Location: 7,66 + Owner: Nod2 + Actor202: rep + Location: 15,60 + Owner: Nod1 + Actor203: hq + Location: 3,62 + Owner: Nod2 + Actor204: silo.td + Location: 11,69 + Owner: Nod2 + Actor205: silo.td + Location: 11,67 + Owner: Nod2 + Actor212: nuk2 + Location: 7,62 + Owner: Nod2 + Actor217: gun.nod + Location: 19,53 + TurretFacing: 103 + Owner: Nod2 + Actor218: gun.nod + Location: 13,53 + Owner: Nod2 + TurretFacing: 87 + Actor219: gun.nod + Location: 17,72 + TurretFacing: 499 + Owner: Nod2 + Actor220: gun.nod + Location: 24,71 + TurretFacing: 578 + Owner: Nod2 + Actor221: hpad.td + Location: 19,61 + Owner: Nod1 + Actor222: hpad.td + Location: 12,59 + Owner: Nod1 + Actor223: hpad.td + Location: 13,63 + Owner: Nod1 + Actor224: split2 + Owner: Neutral + Location: 16,78 + Actor225: split2 + Owner: Neutral + Location: 10,79 + Actor226: split2 + Owner: Neutral + Location: 5,76 + Actor227: nsam + Location: 73,18 + Owner: Nod3 + Actor230: obli + Location: 72,17 + Owner: Nod3 + Actor228: gun.nod + Owner: Nod1 + Location: 84,10 + Actor231: gun.nod + Owner: Nod1 + Location: 90,9 + Actor232: gun.nod + Location: 84,34 + TurretFacing: 309 + Owner: Nod3 + Actor233: gun.nod + Location: 90,35 + TurretFacing: 341 + Owner: Nod3 + NodEastAirstrip: airs + Location: 82,24 + Owner: Nod3 + NodEastHand: hand + Location: 83,16 + Owner: Nod3 + Actor238: nuk2 + Location: 91,24 + Owner: Nod3 + Actor240: proc.td + Location: 91,13 + Owner: Nod3 + Actor241: silo.td + Location: 87,21 + Owner: Nod3 + Actor242: silo.td + Location: 87,19 + Owner: Nod3 + Actor243: silo.td + Location: 95,16 + Owner: Nod3 + Actor244: silo.td + Location: 95,14 + Owner: Nod3 + Actor245: rep + Location: 89,28 + Owner: Nod1 + Actor247: hpad.td + Location: 88,24 + Owner: Nod1 + Actor248: nsam + Location: 79,22 + Owner: Nod3 + Actor249: nsam + Location: 79,29 + Owner: Nod3 + Actor250: nsam + Location: 92,11 + Owner: Nod3 + Actor251: hosp + Location: 83,20 + Owner: Nod3 + Actor252: macs + Location: 20,65 + Owner: Nod2 + Actor253: v26 + Owner: Neutral + Location: 72,42 + Actor254: v24 + Owner: Neutral + Location: 79,47 + Actor255: v20 + Owner: Neutral + Location: 72,50 + Actor256: v27 + Owner: Neutral + Location: 73,48 + Actor257: tc01 + Owner: Neutral + Location: 73,44 + Actor258: rock3 + Owner: Neutral + Location: 66,29 + Actor259: t08 + Owner: Neutral + Location: 61,37 + Actor260: rock1 + Owner: Neutral + Location: 57,45 + Actor261: split2 + Owner: Neutral + Location: 43,39 + Actor263: split2 + Owner: Neutral + Location: 40,30 + Actor262: split2 + Owner: Neutral + Location: 43,34 + Actor264: split2 + Owner: Neutral + Location: 89,4 + Actor265: split2 + Owner: Neutral + Location: 82,6 + Actor266: gun.nod + Owner: Nod1 + Location: 54,25 + Actor267: gun.nod + Owner: Nod1 + Location: 55,36 + Actor268: gun.nod + Owner: Nod1 + Location: 70,89 + TurretFacing: 118 + Actor269: tc01 + Owner: Neutral + Location: 51,9 + Actor270: tc01 + Owner: Neutral + Location: 33,46 + Actor271: t18 + Owner: Neutral + Location: 68,71 + Actor272: t18 + Owner: Neutral + Location: 12,89 + Actor273: t18 + Owner: Neutral + Location: 84,83 + Actor274: rock7 + Owner: Neutral + Location: 87,76 + Actor275: rock6 + Owner: Neutral + Location: 49,81 + Actor276: rock3 + Owner: Neutral + Location: 32,97 + Actor277: t08 + Owner: Neutral + Location: 47,79 + Actor278: t08 + Owner: Neutral + Location: 10,43 + Actor279: t08 + Owner: Neutral + Location: 28,94 + Actor280: rock4 + Owner: Neutral + Location: 80,92 + Actor281: rock2 + Owner: Neutral + Location: 13,97 + Actor282: split2 + Owner: Neutral + Location: 11,115 + Actor283: split2 + Owner: Neutral + Location: 9,122 + Actor284: split2 + Owner: Neutral + Location: 17,122 + Actor285: split2 + Owner: Neutral + Location: 92,62 + Actor286: split2 + Owner: Neutral + Location: 90,72 + Actor287: obli + Owner: Nod2 + Location: 31,65 + Actor288: obli + Owner: Nod2 + Location: 32,62 + Actor289: obli + Owner: Nod2 + Location: 32,61 + Actor290: obli + Owner: Nod2 + Location: 31,58 + Actor291: obli + Owner: Nod2 + Location: 31,57 + Actor292: obli + Owner: Nod2 + Location: 26,70 + Actor293: obli + Owner: Nod2 + Location: 21,55 + Actor294: obli + Owner: Nod2 + Location: 11,55 + Actor295: nuk2 + Owner: Nod2 + Location: 9,61 + Actor296: nuk2 + Owner: Nod2 + Location: 23,61 + Actor297: nuk2 + Owner: Nod2 + Location: 25,61 + Actor298: nuk2 + Owner: Nod2 + Location: 25,64 + Actor299: nuk2 + Owner: Nod2 + Location: 23,64 + Actor300: nsam + Owner: Nod2 + Location: 28,57 + Actor301: nsam + Owner: Nod2 + Location: 28,61 + Actor302: nsam + Owner: Nod2 + Location: 28,65 + Actor303: nsam + Owner: Nod2 + Location: 8,70 + Actor304: nuk2 + Owner: Nod3 + Location: 91,20 + Actor305: nuk2 + Owner: Nod3 + Location: 93,20 + Actor306: nuk2 + Owner: Nod3 + Location: 93,24 + Actor307: obli + Owner: Nod3 + Location: 75,19 + Actor308: hpad.td + Location: 93,29 + Owner: Nod1 + Actor309: tc01 + Owner: Neutral + Location: 87,120 + Actor310: t04 + Owner: Neutral + Location: 92,95 + Actor311: rock2 + Owner: Neutral + Location: 92,110 + Actor312: t04 + Owner: Neutral + Location: 81,123 + Actor313: n3 + Owner: Nod1 + SubCell: 3 + Location: 61,105 + Facing: 0 + Actor314: ltnk + Owner: Nod1 + Location: 53,95 + Facing: 0 + Actor315: ltnk + Owner: Nod1 + Location: 59,95 + Facing: 0 + Actor316: ltnk + Owner: Nod1 + Location: 40,106 + Facing: 256 + Actor317: ltnk + Owner: Nod1 + Location: 40,112 + Facing: 256 + Actor318: ltnk + Owner: Nod1 + Location: 76,105 + Facing: 768 + Actor319: ltnk + Owner: Nod1 + Location: 76,111 + Facing: 768 + Actor320: mlrs + Owner: Nod1 + Location: 50,99 + Facing: 0 + Actor321: mlrs + Owner: Nod1 + Location: 62,99 + Facing: 0 + Actor322: mlrs + Owner: Nod1 + Location: 65,99 + Facing: 0 + Actor323: mlrs + Owner: Nod1 + Location: 45,106 + Facing: 384 + Actor324: mlrs + Owner: Nod1 + Location: 71,105 + Facing: 927 + Actor325: mlrs + Owner: Nod1 + Location: 62,111 + Facing: 0 + Actor326: mlrs + Owner: Nod1 + Location: 57,107 + Facing: 15 + Actor327: stnk.nod + Owner: Nod1 + Location: 87,2 + Facing: 384 + Stance: AttackAnything + Actor328: stnk.nod + Owner: Nod1 + Location: 91,6 + Facing: 384 + Stance: AttackAnything + Actor329: stnk.nod + Owner: Nod1 + Location: 89,66 + Facing: 198 + Stance: AttackAnything + Actor330: stnk.nod + Owner: Nod1 + Location: 91,66 + Facing: 222 + Stance: AttackAnything + Actor331: hftk + Owner: Nod1 + Location: 16,56 + Facing: 0 + Actor332: ltnk + Owner: Nod1 + Location: 33,24 + Facing: 126 + Actor333: ltnk + Owner: Nod1 + Location: 36,22 + Facing: 126 + Actor334: camera + Owner: Nod1 + Location: 12,24 + Actor335: camera + Owner: Nod1 + Location: 31,21 + Actor336: camera + Owner: Nod1 + Location: 44,12 + Actor337: camera + Owner: Nod1 + Location: 48,38 + Actor338: camera + Owner: Nod1 + Location: 87,23 + Actor339: camera + Owner: Nod1 + Location: 15,63 + Actor340: camera + Owner: Nod1 + Location: 37,51 + Actor341: bggy + Owner: Nod1 + Location: 9,35 + Facing: 832 + Actor342: bggy + Owner: Nod1 + Location: 11,36 + Facing: 856 + Actor343: bggy + Owner: Nod1 + Facing: 384 + Location: 62,9 + Actor344: bike + Owner: Nod1 + Location: 8,38 + Facing: 888 + Actor345: bike + Owner: Nod1 + Location: 11,39 + Facing: 880 + Actor346: mlrs + Owner: Nod1 + Location: 29,59 + Facing: 927 + Actor347: mlrs + Owner: Nod1 + Location: 29,63 + Facing: 911 + Actor348: mlrs + Owner: Nod1 + Facing: 384 + Location: 79,27 + Actor349: arty.nod + Owner: Nod1 + Location: 82,14 + Facing: 142 + Actor350: arty.nod + Owner: Nod1 + Facing: 384 + Location: 79,24 + Actor351: ltnk + Owner: Nod1 + Location: 79,11 + Facing: 261 + Actor352: ltnk + Owner: Nod1 + Facing: 384 + Location: 83,35 + Actor353: ltnk + Owner: Nod1 + Facing: 384 + Location: 89,37 + Actor354: ltnk + Owner: Nod1 + Location: 11,52 + Facing: 896 + Actor355: wtnk + Owner: Nod1 + Location: 21,58 + Facing: 126 + Actor356: wtnk + Owner: Nod1 + Facing: 384 + Location: 89,27 + Actor357: enli + Owner: Nod1 + SubCell: 3 + Location: 52,96 + Facing: 0 + Actor358: enli + Owner: Nod1 + SubCell: 3 + Location: 60,96 + Facing: 0 + Actor359: reap + Owner: Nod1 + SubCell: 3 + Location: 56,104 + Facing: 158 + Actor360: n1 + Owner: Nod1 + SubCell: 3 + Location: 41,105 + Facing: 214 + Actor361: n1 + Owner: Nod1 + SubCell: 3 + Location: 42,113 + Facing: 384 + Actor362: n1 + Owner: Nod1 + Location: 42,113 + SubCell: 1 + Facing: 198 + Actor363: n1 + Owner: Nod1 + Location: 42,105 + SubCell: 3 + Facing: 150 + Actor364: n1 + Owner: Nod1 + SubCell: 3 + Location: 51,97 + Facing: 0 + Actor365: n1 + Owner: Nod1 + Location: 51,97 + SubCell: 1 + Facing: 0 + Actor366: n1 + Owner: Nod1 + SubCell: 3 + Location: 61,97 + Facing: 0 + Actor367: n1 + Owner: Nod1 + SubCell: 3 + Location: 62,95 + Facing: 0 + Actor368: n1 + Owner: Nod1 + Facing: 384 + SubCell: 3 + Location: 84,32 + Actor369: n1 + Owner: Nod1 + Facing: 384 + Location: 84,32 + SubCell: 1 + Actor370: n1 + Owner: Nod1 + Facing: 384 + SubCell: 3 + Location: 85,33 + Actor371: n1 + Owner: Nod1 + Facing: 384 + SubCell: 3 + Location: 83,32 + Actor372: n1 + Owner: Nod1 + Facing: 384 + SubCell: 3 + Location: 91,34 + Actor373: n1 + Owner: Nod1 + SubCell: 3 + Location: 82,18 + Facing: 586 + Actor374: n1 + Owner: Nod1 + Facing: 384 + Location: 81,18 + SubCell: 3 + Actor375: n1 + Owner: Nod1 + SubCell: 3 + Location: 86,11 + Facing: 174 + Actor376: n1 + Owner: Nod1 + SubCell: 3 + Location: 91,11 + Facing: 190 + Actor377: n1 + Owner: Nod1 + Location: 91,11 + SubCell: 1 + Facing: 95 + Actor378: n1 + Owner: Nod1 + SubCell: 3 + Location: 90,12 + Facing: 118 + Actor379: n1 + Owner: Nod1 + SubCell: 3 + Location: 19,54 + Facing: 15 + Actor380: n1 + Owner: Nod1 + Location: 19,54 + SubCell: 1 + Facing: 0 + Actor381: n1 + Owner: Nod1 + SubCell: 3 + Location: 21,50 + Facing: 927 + Actor382: n1 + Owner: Nod1 + SubCell: 3 + Location: 10,51 + Facing: 753 + Actor383: n1 + Owner: Nod1 + Location: 10,51 + SubCell: 1 + Facing: 761 + Actor384: n1 + Owner: Nod1 + Location: 9,52 + SubCell: 3 + Facing: 927 + Actor385: n1 + Owner: Nod1 + SubCell: 3 + Location: 12,56 + Facing: 848 + Actor386: n1 + Owner: Nod1 + SubCell: 3 + Location: 25,73 + Facing: 650 + Actor387: n1 + Owner: Nod1 + Facing: 384 + Location: 25,73 + SubCell: 1 + Actor388: n1 + Owner: Nod1 + SubCell: 3 + Location: 24,74 + Facing: 594 + Actor389: n1 + Owner: Nod1 + SubCell: 3 + Location: 29,74 + Facing: 697 + Actor390: n1 + Owner: Nod1 + SubCell: 3 + Location: 38,70 + Facing: 0 + Actor391: n1 + Owner: Nod1 + SubCell: 3 + Location: 40,69 + Facing: 0 + Actor392: n3 + Owner: Nod1 + Location: 52,97 + SubCell: 3 + Facing: 769 + Actor393: n3 + Owner: Nod1 + SubCell: 3 + Location: 26,56 + Facing: 563 + Actor394: n3 + Owner: Nod1 + SubCell: 3 + Location: 9,55 + Facing: 384 + Actor395: n3 + Owner: Nod1 + Facing: 384 + Location: 9,51 + SubCell: 3 + Actor396: n3 + Owner: Nod1 + Facing: 384 + SubCell: 3 + Location: 83,31 + Actor397: n3 + Owner: Nod1 + SubCell: 3 + Location: 89,12 + Facing: 245 + Actor398: rmbc + Owner: Nod1 + SubCell: 3 + Location: 56,116 + Facing: 547 + Actor399: rmbc + Owner: Nod1 + SubCell: 3 + Location: 61,115 + Facing: 618 + Actor400: rmbc + Owner: Nod1 + Facing: 384 + SubCell: 3 + Location: 64,117 + Actor401: rmbc + Owner: Nod1 + SubCell: 3 + Location: 51,113 + Facing: 384 + Actor402: tplr + Owner: Nod1 + SubCell: 3 + Location: 66,110 + Facing: 570 + Actor403: tplr + Owner: Nod1 + SubCell: 3 + Location: 69,105 + Facing: 555 + Actor404: tplr + Owner: Nod1 + SubCell: 3 + Location: 51,107 + Facing: 384 + Actor405: tplr + Owner: Nod1 + Facing: 384 + SubCell: 3 + Location: 58,104 + Actor406: reap + Owner: Nod1 + SubCell: 3 + Facing: 384 + Location: 64,105 + Gateway: wormholexl + Location: 56,111 + Owner: NodGateway + NodRally1: waypoint + Owner: Neutral + Location: 56,7 + NodRally2: waypoint + Owner: Neutral + Location: 64,21 + NodRally3: waypoint + Owner: Neutral + Location: 63,45 + NodRally4: waypoint + Owner: Neutral + Location: 45,47 + NodRally5: waypoint + Owner: Neutral + Location: 14,46 + NodRally6: waypoint + Owner: Neutral + Location: 4,3 + Actor407: camera + Owner: Nod1 + Location: 87,37 + Actor408: camera + Owner: Nod1 + Location: 20,71 + Actor409: camera + Owner: Nod1 + Location: 56,91 + Actor410: camera + Owner: Nod1 + Location: 36,109 + Actor411: camera + Owner: Nod1 + Location: 79,108 + Actor412: hpad.td + Owner: Nod1 + Location: 67,102 + Actor413: hpad.td + Owner: Nod1 + Location: 68,106 + Actor414: avtr + Owner: Nod1 + Location: 56,101 + Facing: 0 + Actor415: avtr + Owner: Nod1 + Location: 46,109 + Facing: 261 + Actor416: avtr + Owner: Nod1 + Location: 70,108 + Facing: 761 + NodMainTopLeft: waypoint + Owner: Neutral + Location: 40,94 + NodMainBottomRight: waypoint + Owner: Neutral + Location: 76,124 + Actor417: rock6 + Owner: Neutral + Location: 32,34 + Actor418: rock2 + Owner: Neutral + Location: 20,33 + Actor419: rock5 + Owner: Neutral + Location: 27,35 + Actor420: rock4 + Owner: Neutral + Location: 18,35 + Actor421: rock7 + Owner: Neutral + Location: 24,34 + Actor423: spen.nod + Owner: Nod1 + Location: 55,62 + Actor422: ss2 + Owner: Nod1 + Location: 51,65 + Facing: 63 + Actor424: ss2 + Owner: Nod1 + Location: 50,62 + Facing: 79 + Actor425: ss2 + Owner: Nod1 + Location: 54,59 + Facing: 55 + Actor426: ss2 + Owner: Nod1 + Location: 59,59 + Facing: 63 + ICBMSub1: isub + Owner: Nod1 + Location: 57,60 + Facing: 55 + ICBMSub2: isub + Owner: Nod1 + Location: 53,62 + Facing: 79 + PlayerStart: waypoint + Owner: Neutral + Location: 26,14 + Actor429: avtr + Owner: Nod1 + Location: 52,106 + Facing: 126 + Actor430: avtr + Owner: Nod1 + Location: 65,106 + Facing: 904 + SubStrike1_1: waypoint + Owner: Neutral + Location: 8,44 + SubStrike1_2: waypoint + Owner: Neutral + Location: 15,42 + SubStrike1_3: waypoint + Owner: Neutral + Location: 22,43 + SubStrike1_4: waypoint + Owner: Neutral + Location: 28,47 + SubStrike2_1: waypoint + Owner: Neutral + Location: 74,5 + SubStrike2_2: waypoint + Owner: Neutral + Location: 81,3 + SubStrike2_4: waypoint + Owner: Neutral + Location: 85,45 + SubStrike2_3: waypoint + Location: 77,43 + Owner: Neutral + SubStrike3_6: waypoint + Owner: Neutral + Location: 30,118 + SubStrike3_5: waypoint + Owner: Neutral + Location: 28,109 + SubStrike3_4: waypoint + Owner: Neutral + Location: 30,100 + SubStrike3_1: waypoint + Owner: Neutral + Location: 48,86 + SubStrike3_2: waypoint + Owner: Neutral + Location: 57,84 + SubStrike3_3: waypoint + Owner: Neutral + Location: 65,86 + SubStrike3_7: waypoint + Owner: Neutral + Location: 86,103 + SubStrike3_8: waypoint + Owner: Neutral + Location: 87,111 + SubStrike3_9: waypoint + Owner: Neutral + Location: 84,119 + SubStrike4_1: waypoint + Owner: Neutral + Location: 6,7 + SubStrike4_2: waypoint + Owner: Neutral + Location: 8,3 + NodMainBaseCenter: waypoint + Owner: Neutral + Location: 58,113 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|missions/main-campaign/ca40-conduit/conduit-rules.yaml, ca|rules/custom/coop-rules.yaml, conduit-coop-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/coop-campaign/ca41-annexation-coop/annexation-coop-rules.yaml b/mods/ca/missions/coop-campaign/ca41-annexation-coop/annexation-coop-rules.yaml new file mode 100644 index 0000000000..d7bf7237c3 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca41-annexation-coop/annexation-coop-rules.yaml @@ -0,0 +1,6 @@ +World: + LuaScript: + Scripts: campaign.lua, coop.lua, ca|missions/main-campaign/ca41-annexation/annexation.lua, annexation-coop.lua + LobbyMissionInfo@InitialObjectives: + Prefix: Initial Objectives + Text: • Capture Nerve Center to stabilize the gateway. Do not allow it to be destroyed.\n• Eliminate all Nod and Scrin Rebel forces. diff --git a/mods/ca/missions/coop-campaign/ca41-annexation-coop/annexation-coop.lua b/mods/ca/missions/coop-campaign/ca41-annexation-coop/annexation-coop.lua new file mode 100644 index 0000000000..6bb871bc14 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca41-annexation-coop/annexation-coop.lua @@ -0,0 +1,30 @@ + +SetupPlayers = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Multi2 = Player.GetPlayer("Multi2") + Multi3 = Player.GetPlayer("Multi3") + Multi4 = Player.GetPlayer("Multi4") + Multi5 = Player.GetPlayer("Multi5") + USSR = Player.GetPlayer("USSR") + Nod = Player.GetPlayer("Nod") + Scrin = Player.GetPlayer("Scrin") + ScrinRebels1 = Player.GetPlayer("ScrinRebels1") + ScrinRebels2 = Player.GetPlayer("ScrinRebels2") + ScrinRebels3 = Player.GetPlayer("ScrinRebels3") + SignalTransmittersPlayer = Player.GetPlayer("SignalTransmittersPlayer") -- separate player to prevent AI from attacking it + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = Utils.Where({ Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 }, function(p) return p ~= nil end) + MissionEnemies = { ScrinRebels1, ScrinRebels2, ScrinRebels3 } + SinglePlayerPlayer = USSR + CoopInit() +end + +AfterWorldLoaded = function() + TransferMcvsToPlayers() + StartCashSpread(3500) +end + +AfterTick = function() + +end diff --git a/mods/ca/missions/coop-campaign/ca41-annexation-coop/map.bin b/mods/ca/missions/coop-campaign/ca41-annexation-coop/map.bin new file mode 100644 index 0000000000..a5cd2e283d Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca41-annexation-coop/map.bin differ diff --git a/mods/ca/missions/coop-campaign/ca41-annexation-coop/map.png b/mods/ca/missions/coop-campaign/ca41-annexation-coop/map.png new file mode 100644 index 0000000000..7258e56cbe Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca41-annexation-coop/map.png differ diff --git a/mods/ca/missions/coop-campaign/ca41-annexation-coop/map.yaml b/mods/ca/missions/coop-campaign/ca41-annexation-coop/map.yaml new file mode 100644 index 0000000000..4fc25f8199 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca41-annexation-coop/map.yaml @@ -0,0 +1,3263 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 41: Annexation Co-op + +Author: Darkademic & Gandorques Hikla + +Tileset: TEMPERAT + +MapSize: 130,114 + +Bounds: 1,1,128,112 + +Visibility: Lobby + +Categories: Co-op Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: USSR, ScrinRebels1, ScrinRebels2, ScrinRebels3, Nod, Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + PlayerReference@USSR: + Name: USSR + Faction: soviet + Color: FE1100 + Allies: Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: ScrinRebels1, ScrinRebels2, ScrinRebels3, Nod, Creeps + PlayerReference@Scrin: + Name: Scrin + Bot: campaign + Faction: scrin + Color: 7700FF + Allies: USSR + Enemies: ScrinRebels1, ScrinRebels2, ScrinRebels3, Nod, Creeps + PlayerReference@ScrinRebels1: + Name: ScrinRebels1 + Bot: campaign + Faction: scrin + Color: 2FB4A6 + Allies: Nod, ScrinRebels2, ScrinRebels3, SignalTransmittersPlayer + Enemies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Scrin, Creeps + PlayerReference@ScrinRebels2: + Name: ScrinRebels2 + Bot: campaign + Faction: scrin + Color: 2FB4A6 + Allies: Nod, ScrinRebels1, ScrinRebels3, SignalTransmittersPlayer + Enemies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Scrin, Creeps + PlayerReference@ScrinRebels3: + Name: ScrinRebels3 + Bot: campaign + Faction: scrin + Color: 2FB4A6 + Allies: Nod, ScrinRebels1, ScrinRebels2, SignalTransmittersPlayer + Enemies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Scrin, Creeps + PlayerReference@Nod: + Name: Nod + Bot: campaign + Faction: nod + Color: 6D738C + Allies: ScrinRebels1, ScrinRebels2, ScrinRebels3, SignalTransmittersPlayer + Enemies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Scrin, Creeps + PlayerReference@NodGatewayPlayer: + Name: NodGatewayPlayer + Bot: campaign + NonCombatant: True + Faction: nod + Color: FE1100 + PlayerReference@SignalTransmittersPlayer: + Name: SignalTransmittersPlayer + Bot: campaign + NonCombatant: True + Faction: scrin + Color: 2FB4A6 + Allies: Nod, ScrinRebels1, ScrinRebels2, ScrinRebels3 + Enemies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: FE1100 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Scrin + Enemies: ScrinRebels1, ScrinRebels2, ScrinRebels3, Nod, Creeps + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: FF9922 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Scrin + Enemies: ScrinRebels1, ScrinRebels2, ScrinRebels3, Nod, Creeps + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: 994050 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Scrin + Enemies: ScrinRebels1, ScrinRebels2, ScrinRebels3, Nod, Creeps + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: 775A12 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Scrin + Enemies: ScrinRebels1, ScrinRebels2, ScrinRebels3, Nod, Creeps + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: 82C900 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Scrin + Enemies: ScrinRebels1, ScrinRebels2, ScrinRebels3, Nod, Creeps + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: DD1691 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Scrin + Enemies: ScrinRebels1, ScrinRebels2, ScrinRebels3, Nod, Creeps + +Actors: + Actor5: brik + Owner: Nod + Location: 57,41 + Actor23: brik + Owner: Nod + Location: 66,42 + Actor26: brik + Owner: Nod + Location: 75,42 + Actor47: brik + Owner: Nod + Location: 74,46 + Actor48: brik + Owner: Nod + Location: 75,46 + Actor59: ltnk + Owner: Nod + Facing: 911 + Health: 68 + Location: 76,48 + Actor62: n1 + Owner: Nod + SubCell: 3 + Facing: 896 + Location: 76,49 + Actor64: brik + Owner: Nod + Location: 74,50 + Actor66: gun.nod + Owner: Nod + Location: 76,50 + TurretFacing: 872 + Actor67: n1 + Owner: Nod + SubCell: 3 + Facing: 769 + Location: 78,50 + Actor71: brik + Owner: Nod + Location: 74,51 + Actor86: brik + Owner: Nod + Location: 74,54 + Actor93: brik + Owner: Nod + Location: 74,55 + Actor102: brik + Owner: Nod + Location: 50,57 + Actor104: brik + Owner: Nod + Location: 54,57 + Actor107: brik + Owner: Nod + Location: 49,58 + Actor110: brik + Owner: Nod + Location: 52,58 + Actor112: brik + Owner: Nod + Location: 54,58 + Actor122: swal + Location: 1,88 + Faction: Random + Owner: ScrinRebels1 + Actor209: swal + Faction: Random + Owner: ScrinRebels1 + Location: 2,88 + Actor210: swal + Faction: Random + Owner: ScrinRebels1 + Location: 2,89 + Actor211: swal + Faction: Random + Owner: ScrinRebels1 + Location: 1,89 + Actor207: swal + Faction: Random + Owner: ScrinRebels1 + Location: 1,90 + Actor206: swal + Faction: Random + Owner: ScrinRebels1 + Location: 1,91 + Actor205: swal + Faction: Random + Owner: ScrinRebels1 + Location: 1,92 + Actor212: swal + Faction: Random + Owner: ScrinRebels1 + Location: 1,93 + Actor213: swal + Faction: Random + Owner: ScrinRebels1 + Location: 1,94 + Actor214: swal + Faction: Random + Owner: ScrinRebels1 + Location: 1,95 + Actor215: swal + Faction: Random + Owner: ScrinRebels1 + Location: 1,96 + Actor216: swal + Faction: Random + Owner: ScrinRebels1 + Location: 1,97 + Actor217: swal + Faction: Random + Owner: ScrinRebels1 + Location: 1,98 + Actor218: swal + Faction: Random + Owner: ScrinRebels1 + Location: 1,99 + Actor219: swal + Faction: Random + Owner: ScrinRebels1 + Location: 1,100 + Actor220: swal + Faction: Random + Owner: ScrinRebels1 + Location: 1,101 + Actor221: swal + Faction: Random + Owner: ScrinRebels1 + Location: 1,102 + Actor224: swal + Faction: Random + Owner: ScrinRebels1 + Location: 3,88 + Actor226: swal + Faction: Random + Owner: ScrinRebels1 + Location: 6,88 + Actor229: swal + Faction: Random + Owner: ScrinRebels1 + Location: 5,88 + Actor225: swal + Faction: Random + Owner: ScrinRebels1 + Location: 4,88 + Actor228: swal + Faction: Random + Owner: ScrinRebels1 + Location: 5,89 + Actor227: swal + Faction: Random + Owner: ScrinRebels1 + Location: 6,89 + Actor230: swal + Faction: Random + Owner: ScrinRebels1 + Location: 7,89 + Actor231: swal + Faction: Random + Owner: ScrinRebels1 + Location: 8,89 + Actor232: swal + Faction: Random + Owner: ScrinRebels1 + Location: 9,89 + Actor233: swal + Faction: Random + Owner: ScrinRebels1 + Location: 10,89 + Actor234: swal + Faction: Random + Owner: ScrinRebels1 + Location: 11,89 + Actor236: swal + Faction: Random + Owner: ScrinRebels1 + Location: 10,90 + Actor237: swal + Faction: Random + Owner: ScrinRebels1 + Location: 6,90 + Actor238: swal + Faction: Random + Owner: ScrinRebels1 + Location: 7,90 + Actor235: swal + Faction: Random + Owner: ScrinRebels1 + Location: 11,90 + Actor239: swal + Faction: Random + Owner: ScrinRebels1 + Location: 11,91 + Actor240: swal + Faction: Random + Owner: ScrinRebels1 + Location: 11,92 + Actor241: swal + Faction: Random + Owner: ScrinRebels1 + Location: 12,92 + Actor242: swal + Faction: Random + Owner: ScrinRebels1 + Location: 13,92 + Actor243: swal + Faction: Random + Owner: ScrinRebels1 + Location: 14,92 + Actor244: swal + Faction: Random + Owner: ScrinRebels1 + Location: 15,92 + Actor245: swal + Faction: Random + Owner: ScrinRebels1 + Location: 15,93 + Actor246: swal + Faction: Random + Owner: ScrinRebels1 + Location: 14,93 + Actor248: swal + Faction: Random + Owner: ScrinRebels1 + Location: 16,112 + Actor249: swal + Faction: Random + Owner: ScrinRebels1 + Location: 17,112 + Actor251: swal + Faction: Random + Owner: ScrinRebels1 + Location: 18,112 + Actor252: swal + Faction: Random + Owner: ScrinRebels1 + Location: 19,112 + Actor253: swal + Faction: Random + Owner: ScrinRebels1 + Location: 20,112 + Actor254: swal + Faction: Random + Owner: ScrinRebels1 + Location: 21,112 + Actor255: swal + Faction: Random + Owner: ScrinRebels1 + Location: 22,112 + Actor256: swal + Faction: Random + Owner: ScrinRebels1 + Location: 23,112 + Actor257: swal + Faction: Random + Owner: ScrinRebels1 + Location: 24,112 + Actor258: swal + Faction: Random + Owner: ScrinRebels1 + Location: 25,112 + Actor259: swal + Faction: Random + Owner: ScrinRebels1 + Location: 26,112 + Actor260: swal + Faction: Random + Owner: ScrinRebels1 + Location: 27,112 + Actor261: swal + Faction: Random + Owner: ScrinRebels1 + Location: 28,112 + Actor262: swal + Faction: Random + Owner: ScrinRebels1 + Location: 28,111 + Actor263: swal + Faction: Random + Owner: ScrinRebels1 + Location: 28,110 + Actor264: swal + Faction: Random + Owner: ScrinRebels1 + Location: 28,109 + Actor265: swal + Faction: Random + Owner: ScrinRebels1 + Location: 28,108 + Actor266: swal + Faction: Random + Owner: ScrinRebels1 + Location: 27,108 + Actor267: swal + Faction: Random + Owner: ScrinRebels1 + Location: 27,107 + Actor268: swal + Faction: Random + Owner: ScrinRebels1 + Location: 28,107 + Actor269: swal + Faction: Random + Owner: ScrinRebels1 + Location: 27,103 + Actor270: swal + Faction: Random + Owner: ScrinRebels1 + Location: 28,103 + Actor272: swal + Faction: Random + Owner: ScrinRebels1 + Location: 27,102 + Actor271: swal + Faction: Random + Owner: ScrinRebels1 + Location: 28,102 + Actor273: swal + Faction: Random + Owner: ScrinRebels1 + Location: 28,101 + Actor274: swal + Faction: Random + Owner: ScrinRebels1 + Location: 28,100 + Actor275: swal + Faction: Random + Owner: ScrinRebels1 + Location: 28,99 + Actor276: swal + Faction: Random + Owner: ScrinRebels1 + Location: 28,98 + Actor277: swal + Faction: Random + Owner: ScrinRebels1 + Location: 28,97 + Actor278: swal + Faction: Random + Owner: ScrinRebels1 + Location: 28,96 + Actor279: swal + Faction: Random + Owner: ScrinRebels1 + Location: 27,96 + Actor280: swal + Faction: Random + Owner: ScrinRebels1 + Location: 26,96 + Actor281: swal + Faction: Random + Owner: ScrinRebels1 + Location: 25,96 + Actor282: swal + Faction: Random + Owner: ScrinRebels1 + Location: 25,95 + Actor283: swal + Faction: Random + Owner: ScrinRebels1 + Location: 24,95 + Actor284: swal + Faction: Random + Owner: ScrinRebels1 + Location: 23,95 + Actor285: swal + Faction: Random + Owner: ScrinRebels1 + Location: 23,96 + Actor287: swal + Faction: Random + Owner: ScrinRebels1 + Location: 21,96 + Actor288: swal + Faction: Random + Owner: ScrinRebels1 + Location: 21,95 + Actor289: swal + Faction: Random + Owner: ScrinRebels1 + Location: 22,95 + Actor286: swal + Faction: Random + Owner: ScrinRebels1 + Location: 22,96 + Actor290: swal + Owner: ScrinRebels2 + Location: 1,1 + Actor291: swal + Owner: ScrinRebels2 + Location: 2,1 + Actor292: swal + Owner: ScrinRebels2 + Location: 1,2 + Actor293: swal + Owner: ScrinRebels2 + Location: 1,3 + Actor295: swal + Owner: ScrinRebels2 + Location: 1,4 + Actor318: swal + Owner: ScrinRebels2 + Location: 13,90 + Actor319: swal + Owner: ScrinRebels2 + Location: 14,90 + Actor320: swal + Owner: ScrinRebels2 + Location: 15,90 + Actor321: swal + Owner: ScrinRebels2 + Location: 13,89 + Actor322: swal + Owner: ScrinRebels2 + Location: 13,88 + Actor323: swal + Owner: ScrinRebels2 + Location: 14,88 + Actor324: swal + Owner: ScrinRebels2 + Location: 15,88 + Actor325: swal + Owner: ScrinRebels2 + Location: 15,89 + Actor326: swal + Owner: ScrinRebels2 + Location: 24,93 + Actor327: swal + Owner: ScrinRebels2 + Location: 23,93 + Actor328: swal + Owner: ScrinRebels2 + Location: 22,93 + Actor329: swal + Owner: ScrinRebels2 + Location: 22,92 + Actor330: swal + Owner: ScrinRebels2 + Location: 22,91 + Actor331: swal + Owner: ScrinRebels2 + Location: 23,91 + Actor332: swal + Owner: ScrinRebels2 + Location: 24,91 + Actor333: swal + Owner: ScrinRebels2 + Location: 24,92 + Actor334: swal + Owner: ScrinRebels2 + Location: 23,94 + Actor335: swal + Owner: ScrinRebels2 + Location: 12,89 + Actor336: swal + Owner: ScrinRebels2 + Location: 29,101 + Actor337: swal + Owner: ScrinRebels2 + Location: 30,100 + Actor338: swal + Owner: ScrinRebels2 + Location: 30,101 + Actor339: swal + Owner: ScrinRebels2 + Location: 30,102 + Actor340: swal + Owner: ScrinRebels2 + Location: 31,102 + Actor341: swal + Owner: ScrinRebels2 + Location: 32,102 + Actor342: swal + Owner: ScrinRebels2 + Location: 32,101 + Actor343: swal + Owner: ScrinRebels2 + Location: 32,100 + Actor344: swal + Owner: ScrinRebels2 + Location: 31,100 + Actor356: swal + Owner: ScrinRebels2 + Location: 4,1 + Actor357: swal + Owner: ScrinRebels2 + Location: 3,1 + Actor358: swal + Owner: ScrinRebels2 + Location: 5,1 + Actor359: swal + Owner: ScrinRebels2 + Location: 6,1 + Actor360: swal + Owner: ScrinRebels2 + Location: 7,1 + Actor361: swal + Owner: ScrinRebels2 + Location: 8,1 + Actor362: swal + Owner: ScrinRebels2 + Location: 9,1 + Actor363: swal + Owner: ScrinRebels2 + Location: 10,1 + Actor364: swal + Owner: ScrinRebels2 + Location: 11,1 + Actor365: swal + Owner: ScrinRebels2 + Location: 12,1 + Actor366: swal + Owner: ScrinRebels2 + Location: 13,1 + Actor367: swal + Owner: ScrinRebels2 + Location: 14,1 + Actor368: swal + Owner: ScrinRebels2 + Location: 15,1 + Actor369: swal + Owner: ScrinRebels2 + Location: 16,1 + Actor370: swal + Owner: ScrinRebels2 + Location: 17,1 + Actor371: swal + Owner: ScrinRebels2 + Location: 18,1 + Actor372: swal + Owner: ScrinRebels2 + Location: 19,1 + Actor373: swal + Owner: ScrinRebels2 + Location: 20,1 + Actor374: swal + Owner: ScrinRebels2 + Location: 21,1 + Actor390: swal + Owner: ScrinRebels2 + Location: 23,1 + Actor391: swal + Owner: ScrinRebels2 + Location: 22,1 + Actor392: swal + Owner: ScrinRebels2 + Location: 24,1 + Actor393: swal + Owner: ScrinRebels2 + Location: 25,1 + Actor394: swal + Owner: ScrinRebels2 + Location: 26,1 + Actor395: swal + Owner: ScrinRebels2 + Location: 27,1 + Actor396: swal + Owner: ScrinRebels2 + Location: 28,1 + Actor397: swal + Owner: ScrinRebels2 + Location: 28,2 + Actor398: swal + Owner: ScrinRebels2 + Location: 28,3 + Actor294: swal + Owner: ScrinRebels2 + Location: 1,5 + Actor296: swal + Owner: ScrinRebels2 + Location: 28,5 + Actor297: swal + Owner: ScrinRebels2 + Location: 1,6 + Actor298: swal + Owner: ScrinRebels2 + Location: 27,6 + Actor299: swal + Owner: ScrinRebels2 + Location: 28,6 + Actor300: swal + Owner: ScrinRebels2 + Location: 29,6 + Actor301: swal + Owner: ScrinRebels2 + Location: 1,7 + Actor302: swal + Owner: ScrinRebels2 + Location: 27,7 + Actor303: swal + Owner: ScrinRebels2 + Location: 29,7 + Actor304: swal + Owner: ScrinRebels2 + Location: 1,8 + Actor305: swal + Owner: ScrinRebels2 + Location: 27,8 + Actor306: swal + Owner: ScrinRebels2 + Location: 28,8 + Actor307: swal + Owner: ScrinRebels2 + Location: 29,8 + Actor308: swal + Owner: ScrinRebels2 + Location: 1,9 + Actor309: swal + Owner: ScrinRebels2 + Location: 1,10 + Actor310: swal + Owner: ScrinRebels2 + Location: 1,11 + Actor311: swal + Owner: ScrinRebels2 + Location: 1,12 + Actor312: swal + Owner: ScrinRebels2 + Location: 27,12 + Actor313: swal + Owner: ScrinRebels2 + Location: 28,12 + Actor314: swal + Owner: ScrinRebels2 + Location: 29,12 + Actor315: swal + Owner: ScrinRebels2 + Location: 1,13 + Actor316: swal + Owner: ScrinRebels2 + Location: 25,13 + Actor317: swal + Owner: ScrinRebels2 + Location: 26,13 + Actor345: swal + Owner: ScrinRebels2 + Location: 27,13 + Actor346: swal + Owner: ScrinRebels2 + Location: 29,13 + Actor347: swal + Owner: ScrinRebels2 + Location: 1,14 + Actor348: swal + Owner: ScrinRebels2 + Location: 9,14 + Actor349: swal + Owner: ScrinRebels2 + Location: 10,14 + Actor350: swal + Owner: ScrinRebels2 + Location: 11,14 + Actor351: swal + Owner: ScrinRebels2 + Location: 16,14 + Actor352: swal + Owner: ScrinRebels2 + Location: 17,14 + Actor353: swal + Owner: ScrinRebels2 + Location: 18,14 + Actor354: swal + Owner: ScrinRebels2 + Location: 25,14 + Actor355: swal + Owner: ScrinRebels2 + Location: 27,14 + Actor375: swal + Owner: ScrinRebels2 + Location: 28,14 + Actor376: swal + Owner: ScrinRebels2 + Location: 29,14 + Actor377: swal + Owner: ScrinRebels2 + Location: 1,15 + Actor378: swal + Owner: ScrinRebels2 + Location: 2,15 + Actor379: swal + Owner: ScrinRebels2 + Location: 3,15 + Actor380: swal + Owner: ScrinRebels2 + Location: 4,15 + Actor381: swal + Owner: ScrinRebels2 + Location: 5,15 + Actor382: swal + Owner: ScrinRebels2 + Location: 6,15 + Actor383: swal + Owner: ScrinRebels2 + Location: 7,15 + Actor384: swal + Owner: ScrinRebels2 + Location: 8,15 + Actor385: swal + Owner: ScrinRebels2 + Location: 9,15 + Actor386: swal + Owner: ScrinRebels2 + Location: 11,15 + Actor387: swal + Owner: ScrinRebels2 + Location: 16,15 + Actor388: swal + Owner: ScrinRebels2 + Location: 18,15 + Actor389: swal + Owner: ScrinRebels2 + Location: 19,15 + Actor401: swal + Owner: ScrinRebels2 + Location: 20,15 + Actor402: swal + Owner: ScrinRebels2 + Location: 21,15 + Actor403: swal + Owner: ScrinRebels2 + Location: 22,15 + Actor406: swal + Owner: ScrinRebels2 + Location: 23,15 + Actor407: swal + Owner: ScrinRebels2 + Location: 24,15 + Actor408: swal + Owner: ScrinRebels2 + Location: 25,15 + Actor409: swal + Owner: ScrinRebels2 + Location: 9,16 + Actor410: swal + Owner: ScrinRebels2 + Location: 10,16 + Actor411: swal + Owner: ScrinRebels2 + Location: 11,16 + Actor412: swal + Owner: ScrinRebels2 + Location: 16,16 + Actor413: swal + Owner: ScrinRebels2 + Location: 17,16 + Actor414: swal + Owner: ScrinRebels2 + Location: 18,16 + Actor399: swal + Owner: ScrinRebels2 + Location: 28,4 + Actor400: swal + Owner: ScrinRebels3 + Location: 128,49 + Actor404: swal + Owner: ScrinRebels3 + Location: 128,50 + Actor405: swal + Owner: ScrinRebels3 + Location: 128,51 + Actor415: swal + Owner: ScrinRebels3 + Location: 128,52 + Actor416: swal + Owner: ScrinRebels3 + Location: 128,54 + Actor417: swal + Owner: ScrinRebels3 + Location: 128,53 + Actor418: swal + Owner: ScrinRebels3 + Location: 128,55 + Actor419: swal + Owner: ScrinRebels3 + Location: 128,56 + Actor420: swal + Owner: ScrinRebels3 + Location: 128,57 + Actor421: swal + Owner: ScrinRebels3 + Location: 128,58 + Actor422: swal + Owner: ScrinRebels3 + Location: 128,60 + Actor423: swal + Owner: ScrinRebels3 + Location: 128,59 + Actor424: swal + Owner: ScrinRebels3 + Location: 128,48 + Actor425: swal + Owner: ScrinRebels3 + Location: 128,46 + Actor426: swal + Owner: ScrinRebels3 + Location: 128,44 + Actor427: swal + Owner: ScrinRebels3 + Location: 128,45 + Actor428: swal + Owner: ScrinRebels3 + Location: 128,47 + Actor429: swal + Owner: ScrinRebels3 + Location: 127,44 + Actor430: swal + Owner: ScrinRebels3 + Location: 125,44 + Actor431: swal + Owner: ScrinRebels3 + Location: 126,44 + Actor432: swal + Owner: ScrinRebels3 + Location: 123,44 + Actor433: swal + Owner: ScrinRebels3 + Location: 124,44 + Actor434: swal + Owner: ScrinRebels3 + Location: 123,45 + Actor435: swal + Owner: ScrinRebels3 + Location: 122,44 + Actor436: swal + Owner: ScrinRebels3 + Location: 122,45 + Actor437: swal + Owner: ScrinRebels3 + Location: 121,45 + Actor438: swal + Owner: ScrinRebels3 + Location: 120,45 + Actor439: swal + Owner: ScrinRebels3 + Location: 119,45 + Actor440: swal + Owner: ScrinRebels3 + Location: 118,45 + Actor441: swal + Owner: ScrinRebels3 + Location: 117,45 + Actor442: swal + Owner: ScrinRebels3 + Location: 117,44 + Actor443: swal + Owner: ScrinRebels3 + Location: 116,44 + Actor444: swal + Owner: ScrinRebels3 + Location: 115,44 + Actor445: swal + Owner: ScrinRebels3 + Location: 115,45 + Actor446: swal + Owner: ScrinRebels3 + Location: 115,46 + Actor447: swal + Owner: ScrinRebels3 + Location: 116,46 + Actor448: swal + Owner: ScrinRebels3 + Location: 117,46 + Actor449: swal + Owner: ScrinRebels3 + Location: 110,46 + Actor450: swal + Owner: ScrinRebels3 + Location: 109,46 + Actor451: swal + Owner: ScrinRebels3 + Location: 109,47 + Actor452: swal + Owner: ScrinRebels3 + Location: 109,48 + Actor453: swal + Owner: ScrinRebels3 + Location: 110,48 + Actor454: swal + Owner: ScrinRebels3 + Location: 111,47 + Actor455: swal + Owner: ScrinRebels3 + Location: 111,46 + Actor456: swal + Owner: ScrinRebels3 + Location: 111,48 + Actor457: swal + Owner: ScrinRebels3 + Location: 109,49 + Actor458: swal + Owner: ScrinRebels3 + Location: 109,50 + Actor459: swal + Owner: ScrinRebels3 + Location: 109,51 + Actor460: swal + Owner: ScrinRebels3 + Location: 109,52 + Actor461: swal + Owner: ScrinRebels3 + Location: 109,53 + Actor462: swal + Owner: ScrinRebels3 + Location: 110,53 + Actor463: swal + Owner: ScrinRebels3 + Location: 110,52 + Actor464: swal + Owner: ScrinRebels3 + Location: 109,57 + Actor465: swal + Owner: ScrinRebels3 + Location: 109,58 + Actor466: swal + Owner: ScrinRebels3 + Location: 110,57 + Actor467: swal + Owner: ScrinRebels3 + Location: 110,58 + Actor468: swal + Owner: ScrinRebels3 + Location: 109,59 + Actor469: swal + Owner: ScrinRebels3 + Location: 109,60 + Actor470: swal + Owner: ScrinRebels3 + Location: 109,61 + Actor471: swal + Owner: ScrinRebels3 + Location: 109,62 + Actor472: swal + Owner: ScrinRebels3 + Location: 110,62 + Actor473: swal + Owner: ScrinRebels3 + Location: 109,63 + Actor474: swal + Owner: ScrinRebels3 + Location: 109,64 + Actor475: swal + Owner: ScrinRebels3 + Location: 110,64 + Actor476: swal + Owner: ScrinRebels3 + Location: 111,64 + Actor477: swal + Owner: ScrinRebels3 + Location: 111,63 + Actor478: swal + Owner: ScrinRebels3 + Location: 111,62 + Actor479: swal + Owner: ScrinRebels3 + Location: 112,64 + Actor480: swal + Owner: ScrinRebels3 + Location: 113,64 + Actor481: swal + Owner: ScrinRebels3 + Location: 113,65 + Actor482: swal + Owner: ScrinRebels3 + Location: 113,66 + Actor483: swal + Owner: ScrinRebels3 + Location: 114,66 + Actor484: swal + Owner: ScrinRebels3 + Location: 115,66 + Actor485: swal + Owner: ScrinRebels3 + Location: 116,66 + Actor486: swal + Owner: ScrinRebels3 + Location: 116,65 + Actor487: swal + Owner: ScrinRebels3 + Location: 117,65 + Actor488: swal + Owner: ScrinRebels3 + Location: 117,66 + Actor489: swal + Owner: ScrinRebels3 + Location: 123,65 + Actor490: swal + Owner: ScrinRebels3 + Location: 123,66 + Actor491: swal + Owner: ScrinRebels3 + Location: 124,66 + Actor492: swal + Owner: ScrinRebels3 + Location: 124,65 + Actor493: swal + Owner: ScrinRebels3 + Location: 125,66 + Actor494: swal + Owner: ScrinRebels3 + Location: 127,66 + Actor495: swal + Owner: ScrinRebels3 + Location: 126,66 + Actor496: swal + Owner: ScrinRebels3 + Location: 128,66 + Actor497: swal + Owner: ScrinRebels3 + Location: 128,65 + Actor498: swal + Owner: ScrinRebels3 + Location: 128,64 + Actor499: swal + Owner: ScrinRebels3 + Location: 128,63 + Actor500: swal + Owner: ScrinRebels3 + Location: 128,62 + Actor501: swal + Owner: ScrinRebels3 + Location: 128,61 + Actor502: scol + Owner: ScrinRebels1 + Location: 31,101 + Actor503: scol + Owner: ScrinRebels1 + Location: 23,92 + Actor504: scol + Owner: ScrinRebels1 + Location: 14,89 + Actor505: scol + Location: 10,15 + Owner: ScrinRebels2 + Actor506: scol + Location: 17,15 + Owner: ScrinRebels2 + Actor507: scol + Location: 28,13 + Owner: ScrinRebels2 + Actor508: scol + Location: 28,7 + Owner: ScrinRebels2 + Actor510: scol + Location: 110,47 + Owner: ScrinRebels3 + Actor513: ptur + Location: 108,52 + TurretFacing: 176 + Owner: ScrinRebels3 + Actor517: ptur + Owner: ScrinRebels1 + Location: 16,88 + TurretFacing: 904 + Actor518: ptur + Owner: ScrinRebels1 + Location: 22,90 + TurretFacing: 793 + Actor519: ptur + Owner: ScrinRebels1 + Location: 33,102 + TurretFacing: 729 + Actor512: ptur + Owner: ScrinRebels3 + Location: 108,58 + TurretFacing: 348 + Actor515: ptur + Owner: ScrinRebels3 + Location: 117,67 + TurretFacing: 539 + Actor516: ptur + Owner: ScrinRebels3 + Location: 123,67 + TurretFacing: 467 + Actor514: ptur + TurretFacing: 176 + Owner: ScrinRebels3 + Location: 111,45 + Actor509: scol + Owner: ScrinRebels3 + Location: 116,45 + Actor511: scol + Owner: ScrinRebels3 + Location: 110,63 + Actor520: ptur + Owner: ScrinRebels2 + Location: 11,17 + TurretFacing: 459 + Actor521: ptur + Owner: ScrinRebels2 + Location: 16,17 + TurretFacing: 705 + Actor522: ptur + Owner: ScrinRebels2 + Location: 30,12 + TurretFacing: 682 + Actor523: ptur + Owner: ScrinRebels2 + Location: 30,8 + TurretFacing: 737 + Actor525: wsph + Owner: ScrinRebels1 + Location: 10,93 + Actor524: sfac + Owner: ScrinRebels1 + Location: 18,109 + Actor526: rea2 + Owner: ScrinRebels1 + Location: 21,109 + Actor527: rea2 + Owner: ScrinRebels1 + Location: 24,109 + Actor528: rea2 + Owner: ScrinRebels1 + Location: 2,98 + Actor529: rea2 + Owner: ScrinRebels1 + Location: 2,95 + Actor530: rea2 + Owner: ScrinRebels1 + Location: 2,92 + Actor531: rea2 + Owner: ScrinRebels1 + Location: 5,97 + Actor532: rea2 + Owner: ScrinRebels1 + Location: 5,94 + Actor533: proc.scrin + Owner: ScrinRebels1 + Location: 23,99 + Actor534: nerv + Owner: ScrinRebels1 + Location: 10,99 + Actor535: port + Owner: ScrinRebels1 + Location: 18,99 + Actor537: srep + Owner: ScrinRebels1 + Location: 16,104 + Actor538: mani + Owner: ScrinRebels1 + Location: 3,104 + Actor539: silo.scrin + Owner: ScrinRebels1 + Location: 27,97 + Actor540: silo.scrin + Owner: ScrinRebels1 + Location: 27,98 + Actor541: silo.scrin + Owner: ScrinRebels1 + Location: 27,99 + Actor542: shar + Owner: ScrinRebels1 + Location: 24,96 + Actor543: shar + Owner: ScrinRebels1 + Location: 9,90 + Actor544: shar + Owner: ScrinRebels1 + Location: 4,89 + Actor545: shar + Owner: ScrinRebels1 + Location: 27,101 + Actor546: shar + Owner: ScrinRebels1 + Location: 27,111 + Actor547: ptur + Owner: ScrinRebels1 + Location: 29,108 + TurretFacing: 745 + Actor548: sign + Owner: ScrinRebels1 + Location: 3,107 + Actor549: scrt + Owner: ScrinRebels1 + Location: 8,104 + Actor550: swal + Owner: ScrinRebels1 + Location: 1,103 + Actor551: swal + Owner: ScrinRebels1 + Location: 1,104 + Actor552: swal + Owner: ScrinRebels1 + Location: 1,105 + Actor553: swal + Owner: ScrinRebels1 + Location: 1,106 + Actor554: swal + Owner: ScrinRebels1 + Location: 1,107 + Actor555: swal + Owner: ScrinRebels1 + Location: 1,108 + Actor556: swal + Owner: ScrinRebels1 + Location: 1,109 + Actor557: swal + Owner: ScrinRebels1 + Location: 1,110 + Actor558: swal + Owner: ScrinRebels1 + Location: 1,111 + Actor559: swal + Owner: ScrinRebels1 + Location: 1,112 + Actor560: swal + Owner: ScrinRebels1 + Location: 2,112 + Actor561: swal + Owner: ScrinRebels1 + Location: 4,112 + Actor562: swal + Owner: ScrinRebels1 + Location: 3,112 + Actor563: swal + Owner: ScrinRebels1 + Location: 5,112 + Actor564: swal + Owner: ScrinRebels1 + Location: 6,112 + Actor565: swal + Owner: ScrinRebels1 + Location: 7,112 + Actor566: swal + Owner: ScrinRebels1 + Location: 8,112 + Actor567: swal + Owner: ScrinRebels1 + Location: 10,112 + Actor568: swal + Owner: ScrinRebels1 + Location: 9,112 + Actor569: swal + Owner: ScrinRebels1 + Location: 11,112 + Actor570: swal + Owner: ScrinRebels1 + Location: 12,112 + Actor571: swal + Owner: ScrinRebels1 + Location: 14,112 + Actor572: swal + Owner: ScrinRebels1 + Location: 15,112 + Actor573: swal + Owner: ScrinRebels1 + Location: 13,112 + Actor574: swal + Owner: ScrinRebels1 + Location: 2,101 + Actor575: swal + Owner: ScrinRebels1 + Location: 2,102 + Actor576: swal + Owner: ScrinRebels1 + Location: 17,111 + Actor577: swal + Owner: ScrinRebels1 + Location: 16,111 + Actor578: rea2 + Owner: ScrinRebels1 + Location: 7,109 + Actor579: rea2 + Owner: ScrinRebels1 + Location: 10,109 + Actor536: rea2 + Owner: ScrinRebels1 + Location: 13,109 + Actor580: grav + Owner: ScrinRebels1 + Location: 12,104 + Actor581: sfac + Owner: ScrinRebels3 + Location: 125,46 + Actor582: proc.scrin + Owner: ScrinRebels3 + Location: 119,59 + Actor583: port + Owner: ScrinRebels3 + Location: 113,59 + Actor584: wsph + Owner: ScrinRebels3 + Location: 114,50 + Actor586: nerv + Owner: ScrinRebels3 + Location: 126,63 + Actor587: rea2 + Owner: ScrinRebels3 + Location: 125,49 + Actor585: rea2 + Owner: ScrinRebels3 + Location: 125,52 + Actor588: rea2 + Owner: ScrinRebels3 + Location: 125,55 + Actor589: rea2 + Owner: ScrinRebels3 + Location: 125,58 + Actor590: rea2 + Owner: ScrinRebels3 + Location: 122,53 + Actor591: rea2 + Owner: ScrinRebels3 + Location: 122,50 + Actor592: rea2 + Owner: ScrinRebels3 + Location: 122,56 + Actor593: scrt + Owner: ScrinRebels3 + Location: 119,52 + Actor594: grav + Location: 119,46 + Owner: ScrinRebels3 + Actor595: sfac + Owner: ScrinRebels2 + Location: 2,3 + Actor596: rea2 + Owner: ScrinRebels2 + Location: 5,2 + Actor597: rea2 + Owner: ScrinRebels2 + Location: 8,2 + Actor598: rea2 + Owner: ScrinRebels2 + Location: 11,2 + Actor599: rea2 + Owner: ScrinRebels2 + Location: 14,2 + Actor600: rea2 + Owner: ScrinRebels2 + Location: 17,2 + Actor602: wsph + Owner: ScrinRebels2 + Location: 18,9 + Actor603: proc.scrin + Owner: ScrinRebels2 + Location: 8,9 + Actor604: grav + Owner: ScrinRebels2 + Location: 13,7 + Actor605: nerv + Owner: ScrinRebels2 + Location: 2,12 + Actor606: scrt + Owner: ScrinRebels2 + Location: 2,7 + Actor608: tpod + Owner: ScrinRebels1 + Location: 17,90 + Facing: 951 + Actor609: tpod + Owner: ScrinRebels1 + Location: 20,92 + Facing: 927 + Actor610: tpod + Owner: ScrinRebels1 + Location: 30,104 + Facing: 745 + Actor611: tpod + Owner: ScrinRebels1 + Location: 32,108 + Facing: 729 + Actor612: null + Owner: ScrinRebels1 + Location: 25,98 + Facing: 904 + Actor613: null + Owner: ScrinRebels1 + Location: 8,92 + Facing: 927 + Actor614: tpod + Owner: ScrinRebels1 + Facing: 384 + Location: 121,66 + Actor615: tpod + Owner: ScrinRebels1 + Facing: 384 + Location: 125,68 + Actor616: tpod + Owner: ScrinRebels1 + Location: 107,50 + Facing: 269 + Actor617: tpod + Owner: ScrinRebels1 + Location: 107,60 + Facing: 245 + Actor618: tpod + Owner: ScrinRebels1 + Location: 117,43 + Facing: 142 + Actor619: ruin + Owner: ScrinRebels1 + Facing: 384 + Location: 110,60 + Actor620: ruin + Owner: ScrinRebels1 + Facing: 384 + Location: 115,65 + Actor621: ruin + Owner: ScrinRebels1 + Location: 110,50 + Facing: 214 + Actor622: gunw + Owner: ScrinRebels1 + Location: 118,46 + Facing: 142 + Actor623: gunw + Owner: ScrinRebels1 + Facing: 384 + Location: 112,63 + Actor624: gunw + Owner: ScrinRebels1 + Facing: 384 + Location: 124,64 + Actor625: gunw + Owner: ScrinRebels1 + Location: 26,103 + Facing: 618 + Actor626: gunw + Owner: ScrinRebels1 + Location: 10,91 + Facing: 864 + Actor627: gunw + Owner: ScrinRebels1 + Location: 20,94 + Facing: 0 + Actor628: gunw + Owner: ScrinRebels1 + Location: 31,110 + Facing: 729 + Actor629: null + Owner: ScrinRebels1 + Location: 119,56 + Facing: 317 + Actor630: tpod + Owner: ScrinRebels1 + Location: 10,18 + Facing: 570 + Actor631: tpod + Owner: ScrinRebels1 + Facing: 384 + Location: 15,15 + Actor632: tpod + Owner: ScrinRebels1 + Location: 31,13 + Facing: 666 + Actor634: corr + Owner: ScrinRebels1 + Location: 19,17 + Facing: 602 + Actor635: corr + Owner: ScrinRebels1 + Facing: 384 + Location: 122,69 + Actor636: corr + Owner: ScrinRebels1 + Location: 12,87 + Facing: 808 + Actor637: impl + Owner: ScrinRebels1 + SubCell: 3 + Location: 16,102 + Facing: 800 + Actor639: impl + Owner: ScrinRebels1 + SubCell: 3 + Location: 10,97 + Facing: 384 + Actor640: impl + Owner: ScrinRebels1 + SubCell: 3 + Location: 8,101 + Facing: 547 + Actor641: impl + Owner: ScrinRebels1 + SubCell: 3 + Location: 5,102 + Facing: 594 + Actor642: impl + Owner: ScrinRebels1 + SubCell: 3 + Location: 22,107 + Facing: 697 + Actor643: mast + Owner: ScrinRebels1 + SubCell: 3 + Location: 7,107 + Facing: 840 + Actor638: impl + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 124,69 + Actor644: impl + Owner: ScrinRebels1 + SubCell: 3 + Location: 106,55 + Facing: 325 + Actor645: impl + Owner: ScrinRebels1 + Facing: 384 + Location: 108,51 + SubCell: 3 + Actor646: impl + Owner: ScrinRebels1 + SubCell: 3 + Location: 108,59 + Facing: 190 + Actor647: s2 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 118,54 + Actor648: s2 + Owner: ScrinRebels1 + Facing: 384 + Location: 108,50 + SubCell: 3 + Actor649: s2 + Owner: ScrinRebels1 + SubCell: 3 + Location: 106,59 + Facing: 118 + Actor650: gunw + Owner: ScrinRebels1 + Location: 8,17 + Facing: 634 + Actor651: s2 + Owner: ScrinRebels1 + SubCell: 3 + Location: 20,16 + Facing: 666 + Actor652: s2 + Owner: ScrinRebels1 + SubCell: 3 + Location: 30,14 + Facing: 578 + Actor653: atmz + Owner: ScrinRebels1 + Location: 5,13 + Facing: 594 + Actor654: devo + Owner: ScrinRebels1 + Location: 27,15 + Facing: 650 + Actor655: gunw + Owner: ScrinRebels1 + Location: 23,14 + Facing: 721 + Actor656: impl + Owner: ScrinRebels1 + SubCell: 3 + Location: 31,7 + Facing: 650 + Actor657: impl + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 17,18 + Actor658: s4 + Owner: ScrinRebels1 + SubCell: 3 + Location: 26,7 + Facing: 384 + Actor659: s4 + Owner: ScrinRebels1 + SubCell: 3 + Location: 20,14 + Facing: 618 + Actor660: s4 + Owner: ScrinRebels1 + SubCell: 3 + Location: 9,5 + Facing: 618 + Actor661: s4 + Owner: ScrinRebels1 + SubCell: 3 + Location: 7,6 + Facing: 594 + Actor662: s4 + Owner: ScrinRebels1 + SubCell: 3 + Location: 11,5 + Facing: 658 + Actor663: s4 + Owner: ScrinRebels1 + SubCell: 3 + Location: 30,98 + Facing: 721 + Actor664: s4 + Owner: ScrinRebels1 + SubCell: 3 + Location: 27,94 + Facing: 721 + Actor665: s4 + Owner: ScrinRebels1 + SubCell: 3 + Location: 33,104 + Facing: 911 + Actor666: s4 + Owner: ScrinRebels1 + SubCell: 3 + Location: 15,86 + Facing: 777 + Actor667: s4 + Owner: ScrinRebels1 + Location: 16,86 + SubCell: 3 + Facing: 896 + Actor668: devo + Owner: ScrinRebels1 + Location: 109,66 + Facing: 317 + Actor669: devo + Owner: ScrinRebels1 + Location: 31,96 + Facing: 816 + Actor670: devo + Owner: ScrinRebels1 + Location: 27,92 + Facing: 848 + Actor671: s1 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 11,85 + Actor672: s1 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 32,98 + Actor673: s1 + Owner: ScrinRebels1 + SubCell: 3 + Location: 28,95 + Facing: 737 + Actor674: s1 + Owner: ScrinRebels1 + SubCell: 3 + Location: 33,109 + Facing: 856 + Actor675: s1 + Owner: ScrinRebels1 + Location: 34,109 + SubCell: 3 + Facing: 737 + Actor676: s1 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 111,66 + Actor677: s1 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 109,65 + Actor678: s1 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 107,62 + Actor679: s1 + Owner: ScrinRebels1 + Facing: 384 + Location: 107,62 + SubCell: 1 + Actor680: s1 + Owner: ScrinRebels1 + SubCell: 3 + Location: 107,47 + Facing: 182 + Actor681: s1 + Owner: ScrinRebels1 + Location: 108,46 + SubCell: 3 + Facing: 142 + Actor682: s1 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 115,43 + Actor683: s1 + Owner: ScrinRebels1 + Facing: 384 + Location: 115,43 + SubCell: 1 + Actor684: s1 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 22,16 + Actor685: s1 + Owner: ScrinRebels1 + SubCell: 3 + Location: 32,8 + Facing: 674 + Actor686: splitblue + Owner: Neutral + Location: 41,108 + Actor687: splitblue + Owner: Neutral + Location: 42,101 + Actor688: splitblue + Owner: Neutral + Location: 38,94 + Actor689: splitblue + Owner: Neutral + Location: 7,79 + Actor690: splitblue + Owner: Neutral + Location: 12,77 + Actor691: splitblue + Owner: Neutral + Location: 16,82 + Actor692: splitblue + Owner: Neutral + Location: 118,75 + Actor693: splitblue + Owner: Neutral + Location: 123,75 + Actor694: splitblue + Owner: Neutral + Location: 122,79 + Actor695: splitblue + Owner: Neutral + Location: 4,25 + Actor696: splitblue + Owner: Neutral + Location: 7,21 + Actor697: splitblue + Owner: Neutral + Location: 11,23 + Actor698: splitblue + Owner: Neutral + Location: 46,40 + Actor699: splitblue + Owner: Neutral + Location: 44,47 + Actor700: splitblue + Owner: Neutral + Location: 46,54 + Actor701: splitblue + Owner: Neutral + Location: 70,72 + Actor702: splitblue + Owner: Neutral + Location: 68,77 + Actor703: splitblue + Owner: Neutral + Location: 63,72 + Actor704: splitblue + Owner: Neutral + Location: 97,17 + Actor705: splitblue + Owner: Neutral + Location: 99,23 + Actor706: splitblue + Owner: Neutral + Location: 95,31 + Actor707: splitblue + Owner: Neutral + Location: 103,30 + SignalTransmitter1: sign + Owner: SignalTransmittersPlayer + Location: 80,17 + Actor711: shar + Owner: ScrinRebels2 + Location: 7,14 + Actor712: shar + Owner: ScrinRebels2 + Location: 21,14 + Actor713: shar + Owner: ScrinRebels2 + Location: 27,4 + Actor714: port + Owner: ScrinRebels2 + Location: 24,2 + Actor715: srep + Owner: ScrinRebels2 + Location: 19,5 + Actor716: brik + Owner: Nod + Location: 75,55 + Actor717: brik + Owner: Nod + Location: 75,54 + Actor718: brik + Owner: Nod + Location: 75,53 + Actor719: brik + Owner: Nod + Location: 75,52 + Actor720: brik + Owner: Nod + Location: 75,51 + Actor721: brik + Owner: Nod + Location: 75,50 + Actor722: brik + Owner: Nod + Location: 75,45 + Actor723: brik + Owner: Nod + Location: 74,45 + Actor724: brik + Owner: Nod + Location: 75,44 + Actor725: brik + Owner: Nod + Location: 75,43 + Actor726: brik + Owner: Nod + Location: 75,41 + Actor727: brik + Owner: Nod + Location: 74,41 + Actor728: brik + Owner: Nod + Location: 73,41 + Actor729: brik + Owner: Nod + Location: 70,41 + Actor730: brik + Owner: Nod + Location: 69,41 + Actor731: brik + Owner: Nod + Location: 68,41 + Actor732: brik + Owner: Nod + Location: 67,41 + Actor733: brik + Owner: Nod + Location: 66,41 + Actor734: brik + Owner: Nod + Location: 67,42 + Actor735: brik + Owner: Nod + Location: 72,41 + Actor736: brik + Owner: Nod + Location: 71,41 + Actor737: brik + Owner: Nod + Location: 58,41 + Actor738: brik + Owner: Nod + Location: 58,42 + Actor739: brik + Owner: Nod + Location: 59,42 + Actor740: brik + Owner: Nod + Location: 59,41 + Actor741: brik + Owner: Nod + Location: 56,41 + Actor742: brik + Owner: Nod + Location: 55,41 + Actor743: brik + Owner: Nod + Location: 54,41 + Actor744: brik + Owner: Nod + Location: 53,41 + Actor745: brik + Owner: Nod + Location: 52,41 + Actor746: brik + Owner: Nod + Location: 51,41 + Actor747: brik + Owner: Nod + Location: 50,41 + Actor748: brik + Owner: Nod + Location: 49,41 + Actor749: brik + Owner: Nod + Location: 49,42 + Actor750: brik + Owner: Nod + Location: 49,43 + Actor751: brik + Owner: Nod + Location: 49,44 + Actor752: brik + Owner: Nod + Location: 49,45 + Actor753: brik + Owner: Nod + Location: 49,46 + Actor754: brik + Owner: Nod + Location: 49,47 + Actor755: brik + Owner: Nod + Location: 50,47 + Actor756: brik + Owner: Nod + Location: 50,46 + Actor757: brik + Owner: Nod + Location: 49,51 + Actor758: brik + Owner: Nod + Location: 49,52 + Actor759: brik + Owner: Nod + Location: 50,52 + Actor760: brik + Owner: Nod + Location: 50,51 + Actor761: brik + Owner: Nod + Location: 49,53 + Actor762: brik + Owner: Nod + Location: 49,54 + Actor763: brik + Owner: Nod + Location: 49,55 + Actor764: brik + Owner: Nod + Location: 49,56 + Actor765: brik + Owner: Nod + Location: 49,57 + Actor766: brik + Owner: Nod + Location: 53,58 + Actor767: brik + Owner: Nod + Location: 53,57 + Actor768: brik + Owner: Nod + Location: 51,58 + Actor769: brik + Owner: Nod + Location: 50,58 + NodFactory: weap.td + Owner: Nod + Location: 58,46 + NodConyard: afac + Owner: Nod + Location: 58,55 + Actor773: nuk2 + Owner: Nod + Location: 59,51 + Actor774: nuk2 + Owner: Nod + Location: 57,51 + Actor775: nuk2 + Owner: Nod + Location: 71,58 + Actor776: nuk2 + Owner: Nod + Location: 55,54 + Actor777: nuk2 + Owner: Nod + Location: 55,51 + NodHand: hand + Owner: Nod + Location: 70,43 + Actor779: obli + Owner: Nod + Location: 57,42 + Actor780: obli + Owner: Nod + Location: 68,42 + Actor781: nsam + Owner: Nod + Location: 73,42 + Actor782: nsam + Owner: Nod + Location: 50,42 + Actor783: nsam + Owner: Nod + Location: 51,57 + NodComms: hq + Owner: Nod + Location: 52,52 + Actor785: proc.td + Owner: Nod + Location: 53,45 + Actor786: obli + Owner: Nod + Location: 74,44 + Actor787: obli + Owner: Nod + Location: 50,45 + Actor788: rep + Owner: Nod + Location: 65,47 + Actor789: gun.nod + Owner: Nod + TurretFacing: 872 + Location: 76,46 + Actor790: gun.nod + Owner: Nod + Location: 59,40 + TurretFacing: 166 + Actor791: gun.nod + Owner: Nod + TurretFacing: 872 + Location: 66,40 + Actor792: gun.nod + Owner: Nod + Location: 48,47 + Actor793: gun.nod + Owner: Nod + Location: 48,51 + HardOnlyElite: rmbc + Owner: Nod + SubCell: 3 + Location: 69,44 + ScriptTags: HardAndAbove + Facing: 384 + Actor795: bh + Owner: Nod + SubCell: 3 + Location: 61,43 + Facing: 384 + Actor796: bh + Owner: Nod + SubCell: 3 + Location: 64,43 + Facing: 384 + HardOnlyReaper: reap + Owner: Nod + SubCell: 3 + Location: 53,51 + ScriptTags: HardAndAbove + Facing: 384 + Actor798: ftnk + Owner: Nod + Location: 63,41 + Facing: 0 + Actor799: arty.nod + Owner: Nod + Location: 53,42 + Facing: 0 + Actor800: ltnk + Owner: Nod + Location: 61,38 + Facing: 0 + Actor801: ltnk + Owner: Nod + Location: 64,37 + Facing: 0 + Actor802: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 59,43 + Actor803: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 51,44 + Actor804: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 50,49 + Actor805: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 51,47 + Actor806: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 56,43 + Actor807: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 67,38 + Actor808: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 60,37 + Actor809: scrinflora1 + Owner: Neutral + Location: 67,19 + Actor810: scrinflora3 + Owner: Neutral + Location: 81,11 + Actor811: scrinflora1 + Owner: Neutral + Location: 111,7 + Actor812: scrinflora1 + Owner: Neutral + Location: 94,44 + Actor813: scrinflora1 + Owner: Neutral + Location: 104,73 + Actor814: scrinflora1 + Owner: Neutral + Location: 97,94 + Actor815: scrinflora1 + Owner: Neutral + Location: 70,92 + Actor816: scrinflora1 + Owner: Neutral + Location: 48,84 + Actor817: scrinflora1 + Owner: Neutral + Location: 66,108 + Actor818: scrinflora1 + Owner: Neutral + Location: 21,72 + Actor819: scrinflora1 + Owner: Neutral + Location: 16,45 + Actor820: scrinflora1 + Owner: Neutral + Location: 39,23 + Actor821: scrinflora1 + Owner: Neutral + Location: 46,66 + Actor822: scrinflora2 + Owner: Neutral + Location: 95,46 + Actor823: scrinflora2 + Owner: Neutral + Location: 83,6 + Actor824: scrinflora2 + Owner: Neutral + Location: 41,3 + Actor825: scrinflora2 + Owner: Neutral + Location: 126,8 + Actor826: scrinflora2 + Owner: Neutral + Location: 113,33 + Actor827: scrinflora2 + Owner: Neutral + Location: 125,95 + Actor828: scrinflora2 + Owner: Neutral + Location: 68,109 + Actor829: scrinflora2 + Owner: Neutral + Location: 45,89 + Actor830: scrinflora2 + Owner: Neutral + Location: 3,69 + Actor831: scrinflora2 + Owner: Neutral + Location: 79,70 + Actor832: scrinflora3 + Owner: Neutral + Location: 122,5 + Actor833: scrinflora3 + Owner: Neutral + Location: 114,98 + Actor834: scrinflora3 + Owner: Neutral + Location: 80,109 + Actor835: scrinflora4 + Owner: Neutral + Location: 57,88 + Actor836: scrinflora4 + Owner: Neutral + Location: 118,96 + Actor837: scrinflora4 + Owner: Neutral + Location: 56,6 + Actor838: scrinflora4 + Owner: Neutral + Location: 20,37 + Actor839: scrinflora4 + Owner: Neutral + Location: 53,33 + Actor840: scrinflora4 + Owner: Neutral + Location: 5,70 + Actor841: scrinflora4 + Owner: Neutral + Location: 41,63 + Actor842: scrinflora5 + Owner: Neutral + Location: 42,61 + Actor843: scrinflora5 + Owner: Neutral + Location: 46,90 + Actor844: scrinflora5 + Owner: Neutral + Location: 62,106 + Actor845: scrinflora5 + Owner: Neutral + Location: 97,92 + Actor846: scrinflora5 + Owner: Neutral + Location: 126,94 + Actor847: scrinflora5 + Owner: Neutral + Location: 96,56 + Actor848: scrinflora5 + Owner: Neutral + Location: 108,23 + Actor849: scrinflora5 + Owner: Neutral + Location: 126,6 + Actor850: scrinflora5 + Owner: Neutral + Location: 98,4 + Actor851: scrinflora5 + Owner: Neutral + Location: 59,3 + Actor852: scrinflora5 + Owner: Neutral + Location: 50,3 + Actor853: scrinflora5 + Owner: Neutral + Location: 42,27 + Actor854: scrinflora5 + Owner: Neutral + Location: 2,44 + Actor855: scrinflora5 + Owner: Neutral + Location: 1,67 + Actor856: scrinflora5 + Owner: Neutral + Location: 25,76 + Actor857: scrinflora6 + Owner: Neutral + Location: 54,18 + Actor858: scrinflora6 + Owner: Neutral + Location: 114,24 + Actor859: scrinflora6 + Owner: Neutral + Location: 91,81 + Actor860: scrinflora6 + Owner: Neutral + Location: 99,103 + Actor861: scrinflora7 + Owner: Neutral + Location: 81,107 + Actor862: scrinflora7 + Owner: Neutral + Location: 105,76 + Actor863: scrinflora7 + Owner: Neutral + Location: 52,72 + Actor864: scrinflora7 + Owner: Neutral + Location: 60,32 + Actor865: scrinflora7 + Owner: Neutral + Location: 84,55 + Actor866: scrinflora7 + Owner: Neutral + Location: 80,10 + Actor867: scrinflora7 + Owner: Neutral + Location: 56,19 + Actor868: scrinflora7 + Owner: Neutral + Location: 42,2 + Actor869: scrinflora7 + Owner: Neutral + Location: 8,41 + Actor870: scrinflora7 + Owner: Neutral + Location: 4,68 + Actor871: scrinflora7 + Owner: Neutral + Location: 38,86 + Actor872: scrinflora7 + Owner: Neutral + Location: 83,80 + Actor873: scrinflora7 + Owner: Neutral + Location: 113,23 + Actor874: scrinflora7 + Owner: Neutral + Location: 127,9 + Actor875: scrinflora8 + Owner: Neutral + Location: 90,24 + Actor876: scrinflora8 + Owner: Neutral + Location: 55,33 + Actor877: scrinflora8 + Owner: Neutral + Location: 43,25 + Actor878: scrinflora8 + Owner: Neutral + Location: 2,42 + Actor879: scrinflora8 + Owner: Neutral + Location: 21,71 + Actor880: scrinflora8 + Owner: Neutral + Location: 39,85 + Actor881: scrinflora8 + Owner: Neutral + Location: 67,110 + Actor882: scrinflora8 + Owner: Neutral + Location: 115,96 + Actor883: scrinflora8 + Owner: Neutral + Location: 96,54 + Actor884: scrinflora8 + Owner: Neutral + Location: 120,3 + Actor885: scrinflora8 + Owner: Neutral + Location: 58,5 + Actor886: scrinflora12 + Owner: Neutral + Location: 114,96 + Actor887: scrinflora12 + Owner: Neutral + Location: 23,37 + Actor888: scrinflora12 + Owner: Neutral + Location: 4,43 + Actor889: scrinflora12 + Owner: Neutral + Location: 46,10 + Actor890: scrinflora12 + Owner: Neutral + Location: 49,2 + Actor891: scrinflora12 + Owner: Neutral + Location: 110,7 + Actor892: scrinflora12 + Owner: Neutral + Location: 105,74 + Actor893: scrinflora12 + Owner: Neutral + Location: 100,106 + Actor894: scrinflora12 + Owner: Neutral + Location: 82,110 + Actor895: scrinflora12 + Owner: Neutral + Location: 66,111 + Actor896: scrinflora13 + Owner: Neutral + Location: 71,92 + Actor897: scrinflora13 + Owner: Neutral + Location: 93,80 + Actor898: scrinflora13 + Owner: Neutral + Location: 97,52 + Actor899: scrinflora13 + Owner: Neutral + Location: 84,57 + Actor900: scrinflora13 + Owner: Neutral + Location: 62,30 + Actor901: scrinflora13 + Owner: Neutral + Location: 67,17 + Actor902: scrinflora13 + Owner: Neutral + Location: 19,37 + Actor903: scrinflora13 + Owner: Neutral + Location: 7,40 + Actor904: scrinflora13 + Owner: Neutral + Location: 23,73 + Actor905: scrinflora13 + Owner: Neutral + Location: 83,47 + Actor906: scrinflora14 + Owner: Neutral + Location: 91,66 + Actor907: scrinflora14 + Owner: Neutral + Location: 85,81 + Actor908: scrinflora14 + Owner: Neutral + Location: 107,75 + Actor909: scrinflora14 + Owner: Neutral + Location: 101,102 + Actor910: scrinflora14 + Owner: Neutral + Location: 64,106 + Actor911: scrinflora14 + Owner: Neutral + Location: 56,88 + Actor912: scrinflora14 + Owner: Neutral + Location: 47,84 + Actor913: scrinflora14 + Owner: Neutral + Location: 47,89 + Actor914: scrinflora14 + Owner: Neutral + Location: 22,73 + Actor915: scrinflora14 + Owner: Neutral + Location: 27,76 + Actor916: scrinflora14 + Owner: Neutral + Location: 18,39 + Actor917: scrinflora14 + Owner: Neutral + Location: 6,46 + Actor918: scrinflora14 + Owner: Neutral + Location: 40,3 + Actor919: scrinflora14 + Owner: Neutral + Location: 47,2 + Actor920: scrinflora14 + Owner: Neutral + Location: 58,2 + Actor921: scrinflora14 + Owner: Neutral + Location: 56,17 + Actor922: scrinflora14 + Owner: Neutral + Location: 79,10 + Actor923: scrinflora14 + Owner: Neutral + Location: 84,6 + Actor924: scrinflora14 + Owner: Neutral + Location: 108,3 + Actor925: scrinflora14 + Owner: Neutral + Location: 112,8 + Actor926: scrinflora14 + Owner: Neutral + Location: 125,5 + Actor927: scrinflora14 + Owner: Neutral + Location: 116,23 + Actor928: scrinflora14 + Owner: Neutral + Location: 112,33 + Actor929: scrinflora14 + Owner: Neutral + Location: 91,80 + Actor930: scrinflora14 + Owner: Neutral + Location: 98,93 + Actor931: swal + Owner: ScrinRebels1 + Location: 79,20 + Actor932: swal + Owner: ScrinRebels1 + Location: 79,19 + Actor933: swal + Owner: ScrinRebels1 + Location: 79,18 + Actor934: swal + Owner: ScrinRebels1 + Location: 79,17 + Actor935: swal + Owner: ScrinRebels1 + Location: 80,20 + Actor936: swal + Owner: ScrinRebels1 + Location: 81,20 + Actor937: swal + Owner: ScrinRebels1 + Location: 82,20 + Actor938: swal + Owner: ScrinRebels1 + Location: 83,20 + Actor939: swal + Owner: ScrinRebels1 + Location: 83,19 + Actor940: swal + Owner: ScrinRebels1 + Location: 82,16 + Actor941: swal + Owner: ScrinRebels1 + Location: 81,16 + Actor942: swal + Owner: ScrinRebels1 + Location: 80,16 + Actor943: swal + Owner: ScrinRebels1 + Location: 79,16 + Actor944: swal + Owner: ScrinRebels1 + Location: 83,16 + Actor945: swal + Owner: ScrinRebels1 + Location: 83,17 + Actor946: swal + Owner: ScrinRebels1 + Location: 83,18 + Actor947: swal + Owner: ScrinRebels1 + Location: 18,46 + Actor948: swal + Owner: ScrinRebels1 + Location: 19,46 + Actor949: swal + Owner: ScrinRebels1 + Location: 20,46 + Actor950: swal + Owner: ScrinRebels1 + Location: 21,46 + Actor951: swal + Owner: ScrinRebels1 + Location: 22,46 + Actor952: swal + Owner: ScrinRebels1 + Location: 18,47 + SignalTransmitter2: sign + Owner: SignalTransmittersPlayer + Location: 19,47 + Actor954: swal + Owner: ScrinRebels1 + Location: 22,47 + Actor955: swal + Owner: ScrinRebels1 + Location: 18,48 + Actor956: swal + Owner: ScrinRebels1 + Location: 22,48 + Actor957: swal + Owner: ScrinRebels1 + Location: 18,49 + Actor958: swal + Owner: ScrinRebels1 + Location: 22,49 + Actor959: swal + Owner: ScrinRebels1 + Location: 18,50 + Actor960: swal + Owner: ScrinRebels1 + Location: 19,50 + Actor961: swal + Owner: ScrinRebels1 + Location: 20,50 + Actor962: swal + Owner: ScrinRebels1 + Location: 21,50 + Actor963: swal + Owner: ScrinRebels1 + Location: 22,50 + Actor964: swal + Owner: ScrinRebels1 + Location: 79,87 + Actor965: swal + Owner: ScrinRebels1 + Location: 80,87 + Actor966: swal + Owner: ScrinRebels1 + Location: 81,87 + Actor967: swal + Owner: ScrinRebels1 + Location: 82,87 + Actor968: swal + Owner: ScrinRebels1 + Location: 83,87 + Actor969: swal + Owner: ScrinRebels1 + Location: 79,88 + SignalTransmitter3: sign + Owner: SignalTransmittersPlayer + Location: 80,88 + Actor971: swal + Owner: ScrinRebels1 + Location: 83,88 + Actor972: swal + Owner: ScrinRebels1 + Location: 79,89 + Actor973: swal + Owner: ScrinRebels1 + Location: 83,89 + Actor974: swal + Owner: ScrinRebels1 + Location: 79,90 + Actor975: swal + Owner: ScrinRebels1 + Location: 83,90 + Actor976: swal + Owner: ScrinRebels1 + Location: 79,91 + Actor977: swal + Owner: ScrinRebels1 + Location: 80,91 + Actor978: swal + Owner: ScrinRebels1 + Location: 81,91 + Actor979: swal + Owner: ScrinRebels1 + Location: 82,91 + Actor980: swal + Owner: ScrinRebels1 + Location: 83,91 + Actor981: shar + Owner: ScrinRebels1 + Location: 78,89 + Actor982: shar + Owner: ScrinRebels1 + Location: 84,89 + Actor983: shar + Owner: ScrinRebels1 + Location: 20,45 + TurretFacing: 192 + Actor984: shar + Owner: ScrinRebels1 + Location: 20,51 + TurretFacing: 682 + Actor985: shar + Owner: ScrinRebels1 + Location: 78,18 + Actor986: shar + Owner: ScrinRebels1 + Location: 84,18 + Actor987: ptur + Owner: ScrinRebels1 + Location: 73,23 + TurretFacing: 388 + Actor988: ptur + Owner: ScrinRebels1 + Location: 71,19 + TurretFacing: 380 + Actor989: ptur + Owner: ScrinRebels1 + Location: 26,39 + TurretFacing: 896 + Actor990: ptur + Owner: ScrinRebels1 + Location: 29,44 + TurretFacing: 848 + Actor992: ptur + Owner: ScrinRebels1 + Location: 76,76 + Actor993: ptur + Owner: ScrinRebels1 + Location: 72,83 + Actor991: scol + Owner: ScrinRebels1 + Location: 81,86 + ScriptTags: HardAndAbove + Actor994: scol + Owner: ScrinRebels1 + Location: 23,48 + ScriptTags: HardAndAbove + Actor995: scol + Owner: ScrinRebels1 + Location: 81,21 + ScriptTags: HardAndAbove + Actor996: null + Owner: ScrinRebels1 + Location: 76,19 + Facing: 384 + Actor997: seek + Owner: ScrinRebels1 + Facing: 384 + Location: 72,17 + Actor998: seek + Owner: ScrinRebels1 + Facing: 384 + Location: 76,23 + Actor999: gunw + Owner: ScrinRebels1 + Location: 24,43 + Facing: 808 + Actor1000: gunw + Owner: ScrinRebels1 + Location: 24,52 + Facing: 666 + Actor1001: devo + Owner: ScrinRebels1 + Location: 25,49 + Facing: 729 + Actor1004: intl.ai2 + Owner: ScrinRebels1 + Location: 77,85 + Facing: 142 + Actor1005: intl.ai2 + Owner: ScrinRebels1 + Location: 80,82 + Facing: 111 + Actor1002: devo + Owner: ScrinRebels1 + Location: 80,84 + Facing: 158 + Actor1003: tpod + Owner: ScrinRebels1 + Location: 75,90 + Facing: 55 + ScriptTags: HardAndAbove + Actor1006: gunw + Owner: ScrinRebels1 + Location: 86,83 + Facing: 229 + Actor1007: gunw + Owner: ScrinRebels1 + Location: 73,89 + Facing: 174 + Actor1008: pac + Owner: ScrinRebels1 + Location: 24,10 + Facing: 634 + Actor1009: pac + Owner: ScrinRebels1 + Location: 5,10 + Facing: 626 + Actor1010: pac + Owner: ScrinRebels1 + Location: 14,100 + Facing: 911 + Actor1011: pac + Owner: ScrinRebels1 + Location: 21,104 + Facing: 919 + Actor1012: pac + Owner: ScrinRebels1 + Location: 119,50 + Facing: 261 + Actor1013: pac + Owner: ScrinRebels1 + Location: 119,58 + Facing: 253 + Actor1014: impl + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 77,21 + Actor1015: impl + Owner: ScrinRebels1 + SubCell: 3 + Location: 22,51 + Facing: 658 + Actor1016: impl + Owner: ScrinRebels1 + SubCell: 3 + Location: 84,86 + Facing: 150 + Actor1017: s4 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 24,50 + Actor1018: s4 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 24,47 + Actor1019: s4 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 22,45 + Actor1020: s4 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 77,18 + Actor1021: s4 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 83,21 + Actor1022: s4 + Owner: ScrinRebels1 + Facing: 384 + Location: 76,17 + SubCell: 3 + Actor1025: s4 + Owner: ScrinRebels1 + SubCell: 3 + Location: 77,93 + Facing: 190 + Actor1029: s1 + Owner: ScrinRebels1 + SubCell: 3 + Location: 88,86 + Facing: 118 + Actor1030: s1 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 23,52 + Actor1031: s1 + Owner: ScrinRebels1 + Facing: 384 + Location: 26,51 + SubCell: 3 + Actor1032: s1 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 26,46 + Actor1033: s1 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 20,42 + Actor1034: s1 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 25,41 + Actor1035: s1 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 21,55 + Actor1036: s1 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 78,23 + Actor1037: s1 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 77,19 + Actor1038: s1 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 73,17 + Actor1039: s1 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 79,14 + Actor1026: s1 + Owner: ScrinRebels1 + SubCell: 3 + Facing: 118 + Location: 75,93 + Actor1027: s1 + Owner: ScrinRebels1 + SubCell: 3 + Facing: 118 + Location: 76,90 + Actor1028: s1 + Owner: ScrinRebels1 + SubCell: 3 + Facing: 118 + Location: 85,85 + Actor1023: s4 + Owner: ScrinRebels1 + SubCell: 3 + Facing: 190 + Location: 77,92 + Actor1024: s4 + Owner: ScrinRebels1 + SubCell: 3 + Facing: 190 + Location: 87,85 + Actor1040: s1 + Owner: ScrinRebels1 + SubCell: 3 + Location: 7,101 + Facing: 634 + Actor1041: s1 + Owner: ScrinRebels1 + SubCell: 3 + Location: 8,107 + Facing: 848 + Actor1042: s1 + Owner: ScrinRebels1 + Location: 4,102 + SubCell: 3 + Facing: 95 + Actor1043: s1 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 21,107 + Actor1044: s1 + Owner: ScrinRebels1 + SubCell: 3 + Location: 23,108 + Facing: 840 + Actor1045: s1 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 121,55 + Actor1046: s1 + Owner: ScrinRebels1 + SubCell: 3 + Location: 125,61 + Facing: 384 + Actor1047: s1 + Owner: ScrinRebels1 + Location: 124,60 + SubCell: 3 + Facing: 888 + Actor1048: s1 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 124,48 + Actor1049: s1 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 124,46 + Actor1050: s1 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 123,47 + Actor1051: s1 + Owner: ScrinRebels1 + Facing: 384 + Location: 9,5 + SubCell: 1 + Actor1052: s1 + Owner: ScrinRebels1 + SubCell: 3 + Location: 5,6 + Facing: 682 + Actor1053: s1 + Owner: ScrinRebels1 + SubCell: 3 + Location: 13,6 + Facing: 626 + Gateway: wormholexl + Owner: NodGatewayPlayer + Location: 66,62 + Actor1055: e1 + Owner: USSR + SubCell: 3 + Facing: 904 + Location: 68,51 + Actor1056: e1 + Owner: USSR + SubCell: 3 + Facing: 1023 + Location: 64,52 + Actor1057: e1 + Owner: USSR + SubCell: 3 + Facing: 0 + Location: 65,53 + Actor1058: 4tnk + Owner: USSR + Facing: 0 + Location: 66,53 + Actor1059: e1 + Owner: USSR + SubCell: 3 + Facing: 872 + Location: 67,53 + Actor1060: e2 + Owner: USSR + SubCell: 3 + Facing: 198 + Location: 65,54 + PlayerStart: waypoint + Faction: soviet + Owner: Neutral + Location: 66,54 + Actor1062: e1 + Owner: USSR + SubCell: 3 + Facing: 0 + Location: 64,55 + Actor1063: e1 + Owner: USSR + SubCell: 1 + Facing: 118 + Location: 64,55 + Actor1064: 4tnk + Owner: USSR + Facing: 0 + Location: 66,55 + Actor1065: e1 + Owner: USSR + SubCell: 3 + Facing: 864 + Location: 67,55 + Actor1066: e3 + Owner: USSR + SubCell: 3 + Facing: 1023 + Location: 69,55 + Actor1067: btr + Owner: USSR + Facing: 904 + Location: 69,56 + Actor1068: e2 + Owner: USSR + SubCell: 3 + Facing: 166 + Location: 64,57 + Actor1069: 4tnk + Owner: USSR + Facing: 0 + Location: 66,57 + Actor1070: v2rl + Owner: USSR + Facing: 0 + Location: 64,58 + Actor1071: v2rl + Owner: USSR + Facing: 0 + Location: 68,58 + Actor1072: e1 + Owner: USSR + SubCell: 3 + Facing: 919 + Location: 69,58 + Actor1073: e1 + Owner: USSR + SubCell: 3 + Facing: 951 + Location: 70,58 + Actor1074: mcv + Owner: USSR + Facing: 0 + Location: 66,59 + Actor1076: e2 + Owner: USSR + SubCell: 3 + Facing: 111 + Location: 62,58 + Actor1077: e3 + Owner: USSR + SubCell: 3 + Facing: 237 + Location: 63,58 + RebelRally1: waypoint + Owner: Neutral + Location: 32,38 + RebelRally2: waypoint + Owner: Neutral + Location: 76,29 + RebelRally5: waypoint + Owner: Neutral + Location: 58,80 + RebelRally4: waypoint + Owner: Neutral + Location: 86,74 + RebelRally3: waypoint + Owner: Neutral + Location: 90,60 + RebelRally6: waypoint + Owner: Neutral + Location: 36,58 + ScrinWormholeWp2: waypoint + Owner: Neutral + Location: 28,49 + ScrinWormholeWp1: waypoint + Owner: Neutral + Location: 87,22 + ScrinWormholeWp3: waypoint + Owner: Neutral + Location: 91,89 + Actor953: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 65,42 + Actor970: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 61,41 + Actor1054: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 77,47 + Actor1061: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 73,44 + Actor1078: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 72,42 + Actor1079: n1 + Owner: Nod + SubCell: 3 + Location: 63,44 + Facing: 384 + GatewayNerveCenter: nerv + Owner: ScrinRebels1 + Location: 62,54 + Actor1080: btr + Owner: USSR + Facing: 118 + Location: 63,53 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|missions/main-campaign/ca41-annexation/annexation-rules.yaml, ca|rules/custom/coop-rules.yaml, annexation-coop-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml, ca|missions/main-campaign/ca41-annexation/annexation-weapons.yaml diff --git a/mods/ca/missions/coop-campaign/ca42-schism-coop/map.bin b/mods/ca/missions/coop-campaign/ca42-schism-coop/map.bin new file mode 100644 index 0000000000..00d22418cf Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca42-schism-coop/map.bin differ diff --git a/mods/ca/missions/coop-campaign/ca42-schism-coop/map.png b/mods/ca/missions/coop-campaign/ca42-schism-coop/map.png new file mode 100644 index 0000000000..41c70de47a Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca42-schism-coop/map.png differ diff --git a/mods/ca/missions/coop-campaign/ca42-schism-coop/map.yaml b/mods/ca/missions/coop-campaign/ca42-schism-coop/map.yaml new file mode 100644 index 0000000000..bf37e255c3 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca42-schism-coop/map.yaml @@ -0,0 +1,5925 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 42: Schism Co-op + +Author: Darkademic & Gandorques Hikla + +Tileset: TEMPERAT + +MapSize: 130,114 + +Bounds: 1,1,128,112 + +Visibility: Lobby + +Categories: Co-op Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: USSR, Nod, Scrin, ScrinRebels, ScrinRebelsOuter, MaleficScrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + PlayerReference@USSR: + Name: USSR + Faction: soviet + Color: FE1100 + Allies: Scrin, SpyPlaneProvider, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Nod, ScrinRebels, ScrinRebelsOuter, MaleficScrin, Creeps + PlayerReference@Scrin: + Name: Scrin + Bot: campaign + Faction: scrin + Color: 7700FF + Allies: USSR, SpyPlaneProvider, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Nod, ScrinRebels, ScrinRebelsOuter, MaleficScrin, Creeps + PlayerReference@Nod: + Name: Nod + Bot: campaign + Faction: nod + Color: 6D738C + Allies: ScrinRebels, ScrinRebelsOuter + Enemies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Scrin, MaleficScrin, Creeps + PlayerReference@ScrinRebels: + Name: ScrinRebels + Bot: campaign + Faction: scrin + Color: 2FB4A6 + Allies: Nod, ScrinRebelsOuter + Enemies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Scrin, MaleficScrin, Creeps + PlayerReference@ScrinRebelsOuter: + Name: ScrinRebelsOuter + Bot: campaign + Faction: scrin + Color: 2FB4A6 + Allies: Nod, ScrinRebels + Enemies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Scrin, MaleficScrin, Creeps + PlayerReference@MaleficScrin: + Name: MaleficScrin + Bot: campaign + Faction: scrin + Color: 3E4549 + Enemies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Nod, Scrin, ScrinRebels, ScrinRebelsOuter, Creeps + PlayerReference@SpyPlaneProvider: + Name: SpyPlaneProvider + NonCombatant: True + Faction: soviet + Color: FE1100 + Allies: USSR, Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: FE1100 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Scrin, SpyPlaneProvider + Enemies: Nod, ScrinRebels, ScrinRebelsOuter, MaleficScrin, Creeps + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: FF9922 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Scrin, SpyPlaneProvider + Enemies: Nod, ScrinRebels, ScrinRebelsOuter, MaleficScrin, Creeps + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: 994050 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Scrin, SpyPlaneProvider + Enemies: Nod, ScrinRebels, ScrinRebelsOuter, MaleficScrin, Creeps + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: 775A12 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Scrin, SpyPlaneProvider + Enemies: Nod, ScrinRebels, ScrinRebelsOuter, MaleficScrin, Creeps + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: 82C900 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Scrin, SpyPlaneProvider + Enemies: Nod, ScrinRebels, ScrinRebelsOuter, MaleficScrin, Creeps + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: soviet + Color: DD1691 + LockColor: True + Allies: USSR, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Scrin, SpyPlaneProvider + Enemies: Nod, ScrinRebels, ScrinRebelsOuter, MaleficScrin, Creeps + +Actors: + Actor0: swal + Owner: ScrinRebels + Location: 81,31 + Actor1: swal + Owner: ScrinRebels + Location: 82,31 + Actor2: swal + Owner: ScrinRebels + Location: 83,31 + Actor3: swal + Owner: ScrinRebels + Location: 84,31 + Actor4: swal + Owner: ScrinRebels + Location: 72,32 + Actor5: swal + Owner: ScrinRebels + Location: 73,32 + Actor6: swal + Owner: ScrinRebels + Location: 74,32 + Actor7: swal + Owner: ScrinRebels + Location: 75,32 + Actor8: swal + Owner: ScrinRebels + Location: 76,32 + Actor9: swal + Owner: ScrinRebels + Location: 77,32 + Actor10: swal + Owner: ScrinRebels + Location: 78,32 + Actor11: swal + Owner: ScrinRebels + Location: 79,32 + Actor12: swal + Owner: ScrinRebels + Location: 80,32 + Actor13: swal + Owner: ScrinRebels + Location: 81,32 + Actor14: swal + Owner: ScrinRebels + Location: 82,32 + Actor15: swal + Owner: ScrinRebels + Location: 83,32 + Actor16: swal + Owner: ScrinRebels + Location: 84,32 + Actor17: swal + Owner: ScrinRebels + Location: 85,32 + Actor18: swal + Owner: ScrinRebels + Location: 70,33 + Actor19: swal + Owner: ScrinRebels + Location: 71,33 + Actor20: swal + Owner: ScrinRebels + Location: 72,33 + Actor21: shar + Owner: ScrinRebels + Location: 73,33 + Actor22: shar + Owner: ScrinRebels + Location: 83,33 + Actor23: swal + Owner: ScrinRebels + Location: 84,33 + Actor24: swal + Owner: ScrinRebels + Location: 85,33 + Actor25: swal + Owner: ScrinRebels + Location: 86,33 + Actor26: swal + Owner: ScrinRebels + Location: 87,33 + Actor27: swal + Owner: ScrinRebels + Location: 70,34 + Actor28: swal + Owner: ScrinRebels + Location: 85,34 + Actor29: swal + Owner: ScrinRebels + Location: 86,34 + Actor30: swal + Owner: ScrinRebels + Location: 87,34 + Actor31: ptur + Owner: ScrinRebels + Location: 88,34 + Actor32: swal + Owner: ScrinRebels + Location: 69,35 + Actor33: swal + Owner: ScrinRebels + Location: 70,35 + Actor34: swal + Owner: ScrinRebels + Location: 85,35 + Actor35: scol + Owner: ScrinRebels + Location: 86,35 + Actor36: swal + Owner: ScrinRebels + Location: 87,35 + Actor37: swal + Owner: ScrinRebels + Location: 68,36 + Actor38: swal + Owner: ScrinRebels + Location: 69,36 + Actor39: swal + Owner: ScrinRebels + Location: 70,36 + Actor40: swal + Owner: ScrinRebels + Location: 85,36 + Actor41: swal + Owner: ScrinRebels + Location: 86,36 + Actor42: swal + Owner: ScrinRebels + Location: 87,36 + Actor43: swal + Owner: ScrinRebels + Location: 67,37 + Actor44: swal + Owner: ScrinRebels + Location: 68,37 + Actor45: swal + Owner: ScrinRebels + Location: 69,37 + Actor46: ptur + Owner: ScrinRebels + Location: 92,37 + Actor47: swal + Owner: ScrinRebels + Location: 66,38 + Actor48: swal + Owner: ScrinRebels + Location: 67,38 + Actor49: swal + Owner: ScrinRebels + Location: 68,38 + Actor50: swal + Owner: ScrinRebels + Location: 91,38 + Actor51: swal + Owner: ScrinRebels + Location: 92,38 + Actor52: swal + Owner: ScrinRebels + Location: 93,38 + Actor53: swal + Owner: ScrinRebels + Location: 94,38 + Actor54: swal + Owner: ScrinRebels + Location: 66,39 + Actor55: swal + Owner: ScrinRebels + Location: 67,39 + Actor56: swal + Owner: ScrinRebels + Location: 91,39 + Actor57: scol + Owner: ScrinRebels + Location: 92,39 + Actor58: swal + Owner: ScrinRebels + Location: 93,39 + Actor59: swal + Owner: ScrinRebels + Location: 94,39 + Actor60: swal + Owner: ScrinRebels + Location: 66,40 + Actor61: swal + Owner: ScrinRebels + Location: 67,40 + Actor62: shar + Owner: ScrinRebels + Location: 68,40 + Actor63: swal + Owner: ScrinRebels + Location: 91,40 + Actor64: swal + Owner: ScrinRebels + Location: 92,40 + Actor65: swal + Owner: ScrinRebels + Location: 93,40 + Actor66: swal + Owner: ScrinRebels + Location: 94,40 + Actor67: swal + Owner: ScrinRebels + Location: 66,41 + Actor68: swal + Owner: ScrinRebels + Location: 67,41 + Actor69: swal + Owner: ScrinRebels + Location: 68,41 + Actor70: shar + Owner: ScrinRebels + Location: 92,41 + Actor71: swal + Owner: ScrinRebels + Location: 93,41 + Actor72: swal + Owner: ScrinRebels + Location: 94,41 + Actor73: swal + Owner: ScrinRebels + Location: 95,41 + Actor74: swal + Owner: ScrinRebels + Location: 66,42 + Actor75: scol + Owner: ScrinRebels + Location: 67,42 + Actor76: swal + Owner: ScrinRebels + Location: 68,42 + Actor77: swal + Owner: ScrinRebels + Location: 94,42 + Actor78: swal + Owner: ScrinRebels + Location: 95,42 + Actor79: swal + Owner: ScrinRebels + Location: 96,42 + Actor80: ptur + Owner: ScrinRebels + Location: 65,43 + TurretFacing: 245 + Actor81: swal + Owner: ScrinRebels + Location: 66,43 + Actor82: swal + Owner: ScrinRebels + Location: 67,43 + Actor83: swal + Owner: ScrinRebels + Location: 68,43 + Actor84: swal + Owner: ScrinRebels + Location: 95,43 + Actor85: swal + Owner: ScrinRebels + Location: 96,43 + Actor86: swal + Owner: ScrinRebels + Location: 95,44 + Actor87: swal + Owner: ScrinRebels + Location: 96,44 + Actor88: swal + Owner: ScrinRebels + Location: 95,45 + Actor89: swal + Owner: ScrinRebels + Location: 95,46 + Actor90: swal + Owner: ScrinRebels + Location: 95,47 + Actor91: swal + Owner: ScrinRebels + Location: 95,48 + Actor92: ptur + Owner: ScrinRebels + Location: 66,49 + TurretFacing: 325 + Actor93: swal + Owner: ScrinRebels + Location: 67,49 + Actor94: swal + Owner: ScrinRebels + Location: 68,49 + Actor95: swal + Owner: ScrinRebels + Location: 69,49 + Actor96: swal + Owner: ScrinRebels + Location: 94,49 + Actor97: swal + Owner: ScrinRebels + Location: 95,49 + Actor98: swal + Owner: ScrinRebels + Location: 67,50 + Actor99: scol + Owner: ScrinRebels + Location: 68,50 + Actor100: swal + Owner: ScrinRebels + Location: 69,50 + Actor101: swal + Owner: ScrinRebels + Location: 94,50 + Actor102: swal + Owner: ScrinRebels + Location: 67,51 + Actor103: swal + Owner: ScrinRebels + Location: 68,51 + Actor104: swal + Owner: ScrinRebels + Location: 69,51 + Actor105: shar + Owner: ScrinRebels + Location: 70,51 + TurretFacing: 348 + Actor106: shar + Owner: ScrinRebels + Location: 93,51 + Actor107: swal + Owner: ScrinRebels + Location: 94,51 + Actor108: swal + Owner: ScrinRebels + Location: 68,52 + Actor109: swal + Owner: ScrinRebels + Location: 69,52 + Actor110: swal + Owner: ScrinRebels + Location: 70,52 + Actor111: swal + Owner: ScrinRebels + Location: 93,52 + Actor112: swal + Owner: ScrinRebels + Location: 94,52 + Actor113: swal + Owner: ScrinRebels + Location: 69,53 + Actor114: swal + Owner: ScrinRebels + Location: 70,53 + Actor115: swal + Owner: ScrinRebels + Location: 71,53 + Actor116: swal + Owner: ScrinRebels + Location: 72,53 + Actor117: swal + Owner: ScrinRebels + Location: 91,53 + Actor118: swal + Owner: ScrinRebels + Location: 92,53 + Actor119: swal + Owner: ScrinRebels + Location: 93,53 + Actor120: swal + Owner: ScrinRebels + Location: 94,53 + Actor121: swal + Owner: ScrinRebels + Location: 70,54 + Actor122: swal + Owner: ScrinRebels + Location: 71,54 + Actor123: swal + Owner: ScrinRebels + Location: 72,54 + Actor124: swal + Owner: ScrinRebels + Location: 73,54 + Actor125: shar + Owner: ScrinRebels + Location: 74,54 + TurretFacing: 412 + Actor126: shar + Owner: ScrinRebels + Location: 89,54 + Actor127: swal + Owner: ScrinRebels + Location: 90,54 + Actor128: swal + Owner: ScrinRebels + Location: 91,54 + Actor129: swal + Owner: ScrinRebels + Location: 92,54 + Actor130: swal + Owner: ScrinRebels + Location: 93,54 + Actor131: swal + Owner: ScrinRebels + Location: 72,55 + Actor132: swal + Owner: ScrinRebels + Location: 73,55 + Actor133: swal + Owner: ScrinRebels + Location: 74,55 + Actor134: swal + Owner: ScrinRebels + Location: 75,55 + Actor135: swal + Owner: ScrinRebels + Location: 76,55 + Actor136: swal + Owner: ScrinRebels + Location: 78,55 + Actor137: swal + Owner: ScrinRebels + Location: 79,55 + Actor138: swal + Owner: ScrinRebels + Location: 80,55 + Actor139: swal + Owner: ScrinRebels + Location: 87,55 + Actor140: swal + Owner: ScrinRebels + Location: 88,55 + Actor141: swal + Owner: ScrinRebels + Location: 89,55 + Actor142: swal + Owner: ScrinRebels + Location: 90,55 + Actor143: swal + Owner: ScrinRebels + Location: 91,55 + Actor144: swal + Owner: ScrinRebels + Location: 73,56 + Actor145: swal + Owner: ScrinRebels + Location: 74,56 + Actor146: swal + Owner: ScrinRebels + Location: 75,56 + Actor147: swal + Owner: ScrinRebels + Location: 76,56 + Actor148: swal + Owner: ScrinRebels + Location: 77,56 + Actor149: swal + Owner: ScrinRebels + Location: 78,56 + Actor150: scol + Owner: ScrinRebels + Location: 79,56 + Actor151: swal + Owner: ScrinRebels + Location: 80,56 + Actor152: swal + Owner: ScrinRebels + Location: 87,56 + Actor153: scol + Owner: ScrinRebels + Location: 88,56 + Actor154: swal + Owner: ScrinRebels + Location: 89,56 + Actor155: swal + Owner: ScrinRebels + Location: 90,56 + Actor156: swal + Owner: ScrinRebels + Location: 76,57 + Actor157: swal + Owner: ScrinRebels + Location: 77,57 + Actor158: swal + Owner: ScrinRebels + Location: 78,57 + Actor159: swal + Owner: ScrinRebels + Location: 79,57 + Actor160: swal + Owner: ScrinRebels + Location: 80,57 + Actor161: swal + Owner: ScrinRebels + Location: 87,57 + Actor162: swal + Owner: ScrinRebels + Location: 88,57 + Actor163: swal + Owner: ScrinRebels + Location: 89,57 + Actor164: ptur + Owner: ScrinRebels + Location: 80,58 + TurretFacing: 547 + Actor165: ptur + Owner: ScrinRebels + Location: 87,58 + TurretFacing: 452 + Actor167: rea2 + Owner: ScrinRebels + Location: 74,33 + Actor168: rea2 + Owner: ScrinRebels + Location: 77,33 + Actor169: rea2 + Owner: ScrinRebels + Location: 80,33 + Actor171: scrt + Owner: ScrinRebels + Location: 93,43 + Actor172: rea2 + Owner: ScrinRebels + Location: 92,46 + Actor174: rea2 + Owner: ScrinRebels + Location: 90,50 + Actor176: wsph + Owner: ScrinRebels + Location: 85,49 + Actor178: proc.scrin + Owner: ScrinRebels + Location: 88,41 + Actor179: port + Owner: ScrinRebels + Location: 74,49 + Actor180: port + Owner: ScrinRebels + Location: 77,51 + Actor188: swal + Owner: ScrinRebels + Location: 79,45 + Actor189: swal + Owner: ScrinRebels + Location: 78,45 + Actor190: swal + Owner: ScrinRebels + Location: 80,45 + Actor191: swal + Owner: ScrinRebels + Location: 81,45 + Actor192: swal + Owner: ScrinRebels + Location: 78,42 + Purifier: scrinpurifier + Owner: ScrinRebels + Location: 79,42 + Actor194: swal + Owner: ScrinRebels + Location: 79,42 + Actor195: swal + Owner: ScrinRebels + Location: 80,42 + Actor196: swal + Owner: ScrinRebels + Location: 81,42 + Actor197: swal + Owner: ScrinRebels + Location: 78,43 + Actor198: swal + Owner: ScrinRebels + Location: 81,43 + Actor199: swal + Owner: ScrinRebels + Location: 78,44 + Actor200: swal + Owner: ScrinRebels + Location: 79,44 + Actor201: swal + Owner: ScrinRebels + Location: 80,44 + Actor202: swal + Owner: ScrinRebels + Location: 81,44 + Actor203: swal + Owner: ScrinRebels + Location: 77,44 + Actor204: swal + Owner: ScrinRebels + Location: 77,43 + Actor205: swal + Owner: ScrinRebels + Location: 77,42 + Actor206: swal + Owner: ScrinRebels + Location: 82,44 + Actor207: swal + Owner: ScrinRebels + Location: 82,43 + Actor208: swal + Owner: ScrinRebels + Location: 82,42 + Actor209: swal + Owner: ScrinRebels + Location: 78,41 + Actor210: swal + Owner: ScrinRebels + Location: 79,41 + Actor211: swal + Owner: ScrinRebels + Location: 80,41 + Actor212: swal + Owner: ScrinRebels + Location: 81,41 + Actor213: sign + Owner: ScrinRebels + Location: 79,37 + Actor214: nerv + Owner: ScrinRebels + Location: 76,37 + Actor215: srep + Owner: ScrinRebels + Location: 71,41 + Actor217: grav + Owner: ScrinRebels + Location: 71,38 + Actor218: silo.scrin + Owner: ScrinRebels + Location: 71,34 + Actor219: silo.scrin + Owner: ScrinRebels + Location: 71,35 + Actor220: silo.scrin + Owner: ScrinRebels + Location: 71,36 + Actor221: rea2 + Owner: ScrinRebels + Location: 89,47 + Actor222: mani + Owner: ScrinRebels + Location: 83,35 + Actor223: reac + Owner: ScrinRebels + Location: 74,45 + Actor224: reac + Owner: ScrinRebels + Location: 72,45 + Actor225: reac + Owner: ScrinRebels + Location: 77,47 + Actor226: wsph + Owner: ScrinRebels + Location: 80,48 + Actor227: obli + Owner: Nod + Location: 77,55 + Actor228: obli + Owner: Nod + Location: 69,38 + Actor229: obli + Owner: Nod + Location: 71,52 + Actor230: nuk2 + Owner: Nod + Location: 65,23 + Actor231: nuk2 + Owner: Nod + Location: 67,23 + Actor232: nuk2 + Owner: Nod + Location: 69,23 + Actor233: afac + Owner: Nod + Location: 72,23 + Actor234: brik + Owner: Nod + Location: 74,26 + Actor235: brik + Owner: Nod + Location: 73,26 + Actor236: brik + Owner: Nod + Location: 71,26 + Actor237: brik + Owner: Nod + Location: 72,26 + Actor238: brik + Owner: Nod + Location: 69,26 + Actor239: brik + Owner: Nod + Location: 70,26 + Actor240: brik + Owner: Nod + Location: 67,26 + Actor241: brik + Owner: Nod + Location: 68,26 + Actor242: brik + Owner: Nod + Location: 66,26 + Actor243: brik + Owner: Nod + Location: 64,26 + Actor244: brik + Owner: Nod + Location: 65,26 + Actor245: brik + Owner: Nod + Location: 63,26 + Actor246: brik + Owner: Nod + Location: 62,26 + Actor247: brik + Owner: Nod + Location: 61,26 + Actor248: brik + Owner: Nod + Location: 75,26 + Actor249: brik + Owner: Nod + Location: 76,26 + Actor250: brik + Owner: Nod + Location: 76,25 + Actor251: brik + Owner: Nod + Location: 77,25 + Actor252: brik + Owner: Nod + Location: 78,25 + Actor253: brik + Owner: Nod + Location: 79,25 + Actor254: brik + Owner: Nod + Location: 80,25 + Actor255: brik + Owner: Nod + Location: 80,24 + Actor256: brik + Owner: Nod + Location: 79,24 + Actor257: brik + Owner: Nod + Location: 80,23 + Actor258: brik + Owner: Nod + Location: 80,22 + Actor259: brik + Owner: Nod + Location: 80,21 + Actor260: brik + Owner: Nod + Location: 80,20 + Actor261: brik + Owner: Nod + Location: 79,20 + Actor262: brik + Owner: Nod + Location: 79,21 + Actor263: brik + Owner: Nod + Location: 60,26 + Actor264: brik + Owner: Nod + Location: 60,25 + Actor265: brik + Owner: Nod + Location: 60,24 + Actor266: brik + Owner: Nod + Location: 60,23 + Actor267: brik + Owner: Nod + Location: 60,22 + Actor268: brik + Owner: Nod + Location: 60,21 + Actor269: brik + Owner: Nod + Location: 60,20 + Actor270: brik + Owner: Nod + Location: 60,19 + Actor271: brik + Owner: Nod + Location: 61,19 + Actor272: brik + Owner: Nod + Location: 61,20 + Actor273: brik + Owner: Nod + Location: 60,14 + Actor274: brik + Owner: Nod + Location: 60,13 + Actor275: brik + Owner: Nod + Location: 61,13 + Actor276: brik + Owner: Nod + Location: 61,14 + Actor277: brik + Owner: Nod + Location: 60,12 + Actor278: brik + Owner: Nod + Location: 60,11 + Actor279: brik + Owner: Nod + Location: 60,10 + Actor280: brik + Owner: Nod + Location: 60,9 + Actor281: brik + Owner: Nod + Location: 60,8 + Actor282: brik + Owner: Nod + Location: 60,7 + Actor283: brik + Owner: Nod + Location: 60,6 + Actor284: brik + Owner: Nod + Location: 62,6 + Actor285: brik + Owner: Nod + Location: 61,6 + Actor286: brik + Owner: Nod + Location: 63,6 + Actor287: brik + Owner: Nod + Location: 64,6 + Actor288: brik + Owner: Nod + Location: 66,6 + Actor289: brik + Owner: Nod + Location: 65,6 + Actor290: brik + Owner: Nod + Location: 67,6 + Actor291: brik + Owner: Nod + Location: 68,6 + Actor292: brik + Owner: Nod + Location: 69,6 + Actor293: brik + Owner: Nod + Location: 70,6 + Actor294: brik + Owner: Nod + Location: 71,6 + Actor295: brik + Owner: Nod + Location: 72,6 + Actor296: brik + Owner: Nod + Location: 74,6 + Actor297: brik + Owner: Nod + Location: 73,6 + Actor298: brik + Owner: Nod + Location: 80,15 + Actor299: brik + Owner: Nod + Location: 79,15 + Actor300: brik + Owner: Nod + Location: 79,14 + Actor301: brik + Owner: Nod + Location: 80,14 + Actor302: brik + Owner: Nod + Location: 80,13 + Actor303: brik + Owner: Nod + Location: 80,12 + Actor304: brik + Owner: Nod + Location: 80,10 + Actor305: brik + Owner: Nod + Location: 80,11 + Actor306: brik + Owner: Nod + Location: 80,9 + Actor307: brik + Owner: Nod + Location: 80,8 + Actor308: brik + Owner: Nod + Location: 80,7 + Actor309: brik + Owner: Nod + Location: 80,6 + Actor310: brik + Owner: Nod + Location: 79,6 + Actor311: brik + Owner: Nod + Location: 78,6 + Actor312: brik + Owner: Nod + Location: 77,6 + Actor313: brik + Owner: Nod + Location: 76,6 + Actor314: brik + Owner: Nod + Location: 75,6 + Actor315: obli + Owner: Nod + Location: 61,21 + Actor316: obli + Owner: Nod + Location: 61,12 + Actor317: ltur + Owner: Nod + Location: 59,19 + Actor318: ltur + Owner: Nod + Location: 59,14 + Actor319: ltur + Owner: Nod + Location: 81,15 + Actor320: ltur + Owner: Nod + Location: 81,20 + Actor321: obli + Owner: Nod + Location: 79,22 + Actor322: obli + Owner: Nod + Location: 79,13 + Actor323: nsam + Owner: Nod + Location: 61,25 + Actor324: nsam + Owner: Nod + Location: 76,24 + Actor325: nsam + Owner: Nod + Location: 61,7 + Actor326: nsam + Owner: Nod + Location: 78,7 + Actor327: proc.td + Owner: Nod + Location: 74,17 + Actor330: hand + Owner: Nod + Location: 65,19 + Actor331: tmpp + Owner: Nod + Location: 77,8 + Actor332: tmpl + Owner: Nod + Location: 69,7 + Actor333: hq + Owner: Nod + Location: 73,7 + Actor334: nuk2 + Owner: Nod + Location: 71,19 + Actor335: nuk2 + Owner: Nod + Location: 69,19 + Actor336: hpad.td + Owner: Nod + Location: 70,11 + Actor337: hpad.td + Owner: Nod + Location: 72,11 + Actor339: weap.td + Owner: Nod + Location: 64,9 + Actor328: rep + Owner: Nod + Location: 66,14 + Actor329: nuk2 + Owner: Nod + Location: 71,15 + Actor340: nuk2 + Owner: Nod + Location: 63,23 + Actor341: shar + Owner: ScrinRebels + Location: 77,45 + TurretFacing: 372 + Actor342: shar + Owner: ScrinRebels + Location: 77,41 + TurretFacing: 192 + Actor343: shar + Owner: ScrinRebels + Location: 82,41 + TurretFacing: 840 + Actor344: shar + Owner: ScrinRebels + Location: 82,45 + TurretFacing: 642 + Actor345: splitblue + Owner: Neutral + Location: 98,34 + Actor346: splitblue + Owner: Neutral + Location: 92,28 + Actor347: splitblue + Owner: Neutral + Location: 100,29 + Actor348: splitblue + Owner: Neutral + Location: 87,20 + Actor349: splitblue + Owner: Neutral + Location: 90,16 + Actor350: splitblue + Owner: Neutral + Location: 87,8 + Actor351: splitblue + Owner: Neutral + Location: 95,22 + Actor352: splitblue + Owner: Neutral + Location: 105,39 + Actor353: swal + Owner: ScrinRebels + Location: 54,60 + Actor355: swal + Owner: ScrinRebels + Location: 55,59 + Actor356: swal + Owner: ScrinRebels + Location: 55,60 + Actor354: swal + Owner: ScrinRebels + Location: 54,61 + Actor357: swal + Owner: ScrinRebels + Location: 55,61 + Actor358: swal + Owner: ScrinRebels + Location: 56,59 + Actor359: swal + Owner: ScrinRebels + Location: 56,58 + Actor360: swal + Owner: ScrinRebels + Location: 57,58 + Actor361: swal + Owner: ScrinRebels + Location: 57,59 + Actor362: swal + Owner: ScrinRebels + Location: 56,60 + Actor363: swal + Owner: ScrinRebels + Location: 56,57 + Actor364: swal + Owner: ScrinRebels + Location: 57,57 + Actor365: swal + Owner: ScrinRebels + Location: 56,56 + Actor366: swal + Owner: ScrinRebels + Location: 56,55 + Actor367: swal + Owner: ScrinRebels + Location: 56,54 + Actor368: swal + Owner: ScrinRebels + Location: 56,53 + Actor369: swal + Owner: ScrinRebels + Location: 56,52 + Actor370: swal + Owner: ScrinRebels + Location: 55,52 + Actor371: swal + Owner: ScrinRebels + Location: 55,51 + Actor372: swal + Owner: ScrinRebels + Location: 56,51 + Actor373: swal + Owner: ScrinRebels + Location: 64,69 + Actor374: swal + Owner: ScrinRebels + Location: 64,70 + Actor375: swal + Owner: ScrinRebels + Location: 63,69 + Actor376: swal + Owner: ScrinRebels + Location: 63,70 + Actor377: swal + Owner: ScrinRebels + Location: 64,68 + Actor378: swal + Owner: ScrinRebels + Location: 65,68 + Actor379: swal + Owner: ScrinRebels + Location: 65,67 + Actor380: swal + Owner: ScrinRebels + Location: 64,67 + Actor381: swal + Owner: ScrinRebels + Location: 63,68 + Actor382: swal + Owner: ScrinRebels + Location: 66,68 + Actor383: swal + Owner: ScrinRebels + Location: 66,67 + Actor384: swal + Owner: ScrinRebels + Location: 67,68 + Actor385: swal + Owner: ScrinRebels + Location: 68,68 + Actor386: swal + Owner: ScrinRebels + Location: 69,68 + Actor387: swal + Owner: ScrinRebels + Location: 69,69 + Actor388: swal + Owner: ScrinRebels + Location: 70,69 + Actor389: swal + Owner: ScrinRebels + Location: 71,69 + Actor390: swal + Owner: ScrinRebels + Location: 72,69 + Actor391: swal + Owner: ScrinRebels + Location: 72,68 + Actor392: swal + Owner: ScrinRebels + Location: 71,68 + Actor393: swal + Owner: ScrinRebels + Location: 62,67 + Actor394: swal + Owner: ScrinRebels + Location: 62,68 + Actor395: swal + Owner: ScrinRebels + Location: 62,66 + Actor396: swal + Owner: ScrinRebels + Location: 63,66 + Actor397: swal + Owner: ScrinRebels + Location: 64,66 + Actor398: swal + Owner: ScrinRebels + Location: 55,62 + Actor399: swal + Owner: ScrinRebels + Location: 56,62 + Actor400: swal + Owner: ScrinRebels + Location: 57,61 + Actor401: swal + Owner: ScrinRebels + Location: 57,60 + Actor402: swal + Owner: ScrinRebels + Location: 57,62 + Actor409: swal + Owner: ScrinRebels + Location: 95,72 + Actor410: swal + Owner: ScrinRebels + Location: 96,72 + Actor411: swal + Owner: ScrinRebels + Location: 95,71 + Actor412: swal + Owner: ScrinRebels + Location: 96,71 + Actor413: swal + Owner: ScrinRebels + Location: 94,71 + Actor414: swal + Owner: ScrinRebels + Location: 93,71 + Actor415: swal + Owner: ScrinRebels + Location: 97,73 + Actor416: swal + Owner: ScrinRebels + Location: 97,72 + Actor417: swal + Owner: ScrinRebels + Location: 98,72 + Actor418: swal + Owner: ScrinRebels + Location: 98,73 + Actor419: swal + Owner: ScrinRebels + Location: 97,71 + Actor420: swal + Owner: ScrinRebels + Location: 94,70 + Actor421: swal + Owner: ScrinRebels + Location: 93,70 + Actor422: swal + Owner: ScrinRebels + Location: 92,71 + Actor423: swal + Owner: ScrinRebels + Location: 91,71 + Actor424: swal + Owner: ScrinRebels + Location: 91,70 + Actor425: swal + Owner: ScrinRebels + Location: 91,69 + Actor426: swal + Owner: ScrinRebels + Location: 90,69 + Actor427: swal + Owner: ScrinRebels + Location: 90,68 + Actor428: swal + Owner: ScrinRebels + Location: 91,68 + Actor429: swal + Owner: ScrinRebels + Location: 106,68 + Actor430: swal + Owner: ScrinRebels + Location: 105,68 + Actor432: swal + Owner: ScrinRebels + Location: 106,67 + Actor433: swal + Owner: ScrinRebels + Location: 106,66 + Actor434: swal + Owner: ScrinRebels + Location: 107,66 + Actor435: swal + Owner: ScrinRebels + Location: 108,66 + Actor436: swal + Owner: ScrinRebels + Location: 108,65 + Actor437: swal + Owner: ScrinRebels + Location: 107,65 + Actor438: swal + Owner: ScrinRebels + Location: 106,65 + Actor439: swal + Owner: ScrinRebels + Location: 105,66 + Actor440: swal + Owner: ScrinRebels + Location: 104,68 + Actor444: swal + Owner: ScrinRebels + Location: 104,66 + Actor445: swal + Owner: ScrinRebels + Location: 97,70 + Actor446: swal + Owner: ScrinRebels + Location: 99,70 + Actor447: swal + Owner: ScrinRebels + Location: 98,70 + Actor448: swal + Owner: ScrinRebels + Location: 99,71 + Actor449: swal + Owner: ScrinRebels + Location: 99,72 + Actor441: swal + Owner: ScrinRebels + Location: 104,67 + Actor442: swal + Owner: ScrinRebels + Location: 109,65 + Actor443: swal + Owner: ScrinRebels + Location: 110,65 + Actor450: swal + Owner: ScrinRebels + Location: 111,65 + Actor451: swal + Owner: ScrinRebels + Location: 112,65 + Actor452: swal + Owner: ScrinRebels + Location: 113,65 + Actor453: swal + Owner: ScrinRebels + Location: 114,65 + Actor454: swal + Owner: ScrinRebels + Location: 114,64 + Actor455: swal + Owner: ScrinRebels + Location: 113,64 + Actor456: swal + Owner: ScrinRebels + Location: 112,64 + Actor457: swal + Owner: ScrinRebels + Location: 115,65 + Actor458: swal + Owner: ScrinRebels + Location: 116,65 + Actor459: swal + Owner: ScrinRebels + Location: 114,63 + Actor460: swal + Owner: ScrinRebels + Location: 115,63 + Actor461: swal + Owner: ScrinRebels + Location: 116,63 + Actor462: swal + Owner: ScrinRebels + Location: 116,64 + Actor463: swal + Owner: ScrinRebels + Location: 45,29 + Actor464: swal + Owner: ScrinRebels + Location: 45,28 + Actor465: swal + Owner: ScrinRebels + Location: 44,29 + Actor466: swal + Owner: ScrinRebels + Location: 43,29 + Actor467: swal + Owner: ScrinRebels + Location: 43,28 + Actor468: swal + Owner: ScrinRebels + Location: 43,27 + Actor469: swal + Owner: ScrinRebels + Location: 44,27 + Actor470: swal + Owner: ScrinRebels + Location: 45,27 + Actor471: swal + Owner: ScrinRebels + Location: 49,36 + Actor472: swal + Owner: ScrinRebels + Location: 49,34 + Actor473: swal + Owner: ScrinRebels + Location: 49,35 + Actor474: swal + Owner: ScrinRebels + Location: 50,36 + Actor475: swal + Owner: ScrinRebels + Location: 50,34 + Actor476: swal + Owner: ScrinRebels + Location: 51,34 + Actor477: swal + Owner: ScrinRebels + Location: 51,35 + Actor478: swal + Owner: ScrinRebels + Location: 51,36 + Actor479: swal + Owner: ScrinRebels + Location: 53,36 + Actor480: swal + Owner: ScrinRebels + Location: 52,36 + Actor481: swal + Owner: ScrinRebels + Location: 52,35 + Actor482: swal + Owner: ScrinRebels + Location: 53,35 + Actor483: swal + Owner: ScrinRebels + Location: 54,35 + Actor484: swal + Owner: ScrinRebels + Location: 54,36 + Actor485: swal + Owner: ScrinRebels + Location: 54,37 + Actor486: swal + Owner: ScrinRebels + Location: 54,38 + Actor487: swal + Owner: ScrinRebels + Location: 55,38 + Actor488: swal + Owner: ScrinRebels + Location: 55,37 + Actor489: swal + Owner: ScrinRebels + Location: 43,26 + Actor490: swal + Owner: ScrinRebels + Location: 43,25 + Actor491: swal + Owner: ScrinRebels + Location: 44,25 + Actor492: swal + Owner: ScrinRebels + Location: 44,24 + Actor493: swal + Owner: ScrinRebels + Location: 44,23 + Actor494: swal + Owner: ScrinRebels + Location: 45,23 + Actor495: swal + Owner: ScrinRebels + Location: 45,24 + Actor496: swal + Owner: ScrinRebels + Location: 32,7 + Actor497: swal + Owner: ScrinRebels + Location: 32,6 + Actor498: swal + Owner: ScrinRebels + Location: 32,5 + Actor499: swal + Owner: ScrinRebels + Location: 32,4 + Actor500: swal + Owner: ScrinRebels + Location: 32,3 + Actor501: swal + Owner: ScrinRebels + Location: 32,2 + Actor502: swal + Owner: ScrinRebels + Location: 32,1 + Actor503: swal + Owner: ScrinRebels + Location: 33,1 + Actor504: swal + Owner: ScrinRebels + Location: 33,2 + Actor505: swal + Owner: ScrinRebels + Location: 33,3 + Actor506: swal + Owner: ScrinRebels + Location: 33,4 + Actor507: swal + Owner: ScrinRebels + Location: 33,5 + Actor508: swal + Owner: ScrinRebels + Location: 33,6 + Actor509: swal + Owner: ScrinRebels + Location: 33,7 + Actor510: swal + Owner: ScrinRebels + Location: 34,7 + Actor511: swal + Owner: ScrinRebels + Location: 34,6 + Actor512: swal + Owner: ScrinRebels + Location: 34,5 + Actor513: swal + Owner: ScrinRebels + Location: 34,4 + Actor514: swal + Owner: ScrinRebels + Location: 34,3 + Actor515: swal + Owner: ScrinRebels + Location: 34,2 + Actor516: swal + Owner: ScrinRebels + Location: 34,1 + Actor517: swal + Owner: ScrinRebels + Location: 35,5 + Actor518: swal + Owner: ScrinRebels + Location: 36,6 + Actor519: swal + Owner: ScrinRebels + Location: 36,5 + Actor520: swal + Owner: ScrinRebels + Location: 35,7 + Actor521: swal + Owner: ScrinRebels + Location: 36,7 + Actor528: swal + Owner: ScrinRebels + Location: 123,62 + Actor529: swal + Owner: ScrinRebels + Location: 123,63 + Actor530: swal + Owner: ScrinRebels + Location: 123,64 + Actor531: swal + Owner: ScrinRebels + Location: 124,64 + Actor532: swal + Owner: ScrinRebels + Location: 124,62 + Actor533: swal + Owner: ScrinRebels + Location: 125,62 + Actor534: swal + Owner: ScrinRebels + Location: 125,63 + Actor535: swal + Owner: ScrinRebels + Location: 125,64 + Actor536: swal + Owner: ScrinRebels + Location: 126,63 + Actor537: swal + Owner: ScrinRebels + Location: 126,64 + Actor538: swal + Owner: ScrinRebels + Location: 127,63 + Actor539: swal + Owner: ScrinRebels + Location: 127,64 + Actor540: swal + Owner: ScrinRebels + Location: 128,63 + Actor541: swal + Owner: ScrinRebels + Location: 128,64 + Actor542: shar + Location: 126,62 + Owner: ScrinRebelsOuter + TurretFacing: 618 + Actor552: ptur + Location: 122,64 + Owner: ScrinRebelsOuter + TurretFacing: 547 + Actor553: scol + Location: 124,63 + Owner: ScrinRebelsOuter + Actor551: ptur + Owner: ScrinRebelsOuter + Location: 117,65 + TurretFacing: 634 + Actor554: ptur + Owner: ScrinRebelsOuter + Location: 104,69 + TurretFacing: 467 + Actor555: ptur + Owner: ScrinRebelsOuter + Location: 100,71 + TurretFacing: 563 + Actor556: ptur + Owner: ScrinRebelsOuter + Location: 61,67 + TurretFacing: 452 + Actor559: ptur + Owner: ScrinRebelsOuter + Location: 56,63 + TurretFacing: 420 + Actor558: ptur + Owner: ScrinRebelsOuter + Location: 48,35 + TurretFacing: 380 + Actor557: ptur + Owner: ScrinRebelsOuter + Location: 44,30 + TurretFacing: 364 + Actor560: scol + Owner: ScrinRebelsOuter + Location: 115,64 + Actor561: scol + Owner: ScrinRebelsOuter + Location: 105,67 + Actor562: scol + Owner: ScrinRebelsOuter + Location: 98,71 + Actor563: scol + Owner: ScrinRebelsOuter + Location: 63,67 + Actor564: scol + Owner: ScrinRebelsOuter + Location: 56,61 + Actor565: scol + Owner: ScrinRebelsOuter + Location: 50,35 + Actor566: scol + Owner: ScrinRebelsOuter + Location: 44,28 + Actor567: scol + Owner: ScrinRebelsOuter + Location: 35,6 + Actor568: shar + Owner: ScrinRebelsOuter + Location: 113,63 + TurretFacing: 626 + Actor544: shar + Owner: ScrinRebelsOuter + Location: 105,65 + TurretFacing: 650 + Actor545: shar + Owner: ScrinRebelsOuter + Location: 92,70 + TurretFacing: 396 + Actor570: shar + Owner: ScrinRebelsOuter + Location: 57,56 + TurretFacing: 388 + Actor546: shar + TurretFacing: 192 + Owner: ScrinRebelsOuter + Location: 54,45 + Actor547: shar + Owner: ScrinRebelsOuter + Location: 55,36 + TurretFacing: 428 + Actor548: shar + Owner: ScrinRebelsOuter + Location: 44,26 + TurretFacing: 372 + Actor549: shar + Owner: ScrinRebelsOuter + Location: 38,16 + TurretFacing: 364 + Actor550: shar + Owner: ScrinRebelsOuter + Location: 35,4 + TurretFacing: 364 + Actor571: rea2 + Owner: ScrinRebelsOuter + Location: 123,56 + Actor572: rea2 + Owner: ScrinRebelsOuter + Location: 120,56 + Actor573: rea2 + Owner: ScrinRebelsOuter + Location: 120,53 + Actor574: rea2 + Owner: ScrinRebelsOuter + Location: 123,53 + Actor575: rea2 + Owner: ScrinRebelsOuter + Location: 120,50 + Actor576: rea2 + Owner: ScrinRebelsOuter + Location: 123,50 + Actor583: swal + Owner: ScrinRebelsOuter + Location: 126,49 + Actor584: swal + Owner: ScrinRebelsOuter + Location: 126,50 + Actor585: swal + Owner: ScrinRebelsOuter + Location: 126,51 + Actor586: swal + Owner: ScrinRebelsOuter + Location: 126,52 + Actor587: swal + Owner: ScrinRebelsOuter + Location: 126,53 + Actor588: swal + Owner: ScrinRebelsOuter + Location: 126,55 + Actor589: swal + Owner: ScrinRebelsOuter + Location: 126,54 + Actor590: swal + Owner: ScrinRebelsOuter + Location: 126,56 + Actor591: swal + Owner: ScrinRebelsOuter + Location: 126,57 + Actor592: swal + Owner: ScrinRebelsOuter + Location: 126,58 + Actor593: swal + Owner: ScrinRebelsOuter + Location: 120,59 + Actor594: swal + Owner: ScrinRebelsOuter + Location: 121,59 + Actor595: swal + Owner: ScrinRebelsOuter + Location: 122,59 + Actor596: swal + Owner: ScrinRebelsOuter + Location: 124,59 + Actor597: swal + Owner: ScrinRebelsOuter + Location: 123,59 + Actor598: swal + Owner: ScrinRebelsOuter + Location: 125,59 + Actor599: swal + Owner: ScrinRebelsOuter + Location: 126,59 + Actor600: swal + Owner: ScrinRebelsOuter + Location: 119,58 + Actor601: swal + Owner: ScrinRebelsOuter + Location: 119,59 + Actor602: swal + Owner: ScrinRebelsOuter + Location: 119,57 + Actor603: swal + Owner: ScrinRebelsOuter + Location: 119,56 + Actor604: swal + Owner: ScrinRebelsOuter + Location: 119,55 + Actor605: swal + Owner: ScrinRebelsOuter + Location: 119,54 + Actor606: swal + Owner: ScrinRebelsOuter + Location: 119,53 + Actor607: swal + Owner: ScrinRebelsOuter + Location: 119,52 + Actor608: swal + Owner: ScrinRebelsOuter + Location: 119,51 + Actor609: swal + Owner: ScrinRebelsOuter + Location: 119,50 + Actor610: swal + Owner: ScrinRebelsOuter + Location: 119,49 + PlayerStart: waypoint + Owner: Neutral + Location: 17,98 + Actor615: null + Owner: ScrinRebels + Facing: 384 + Location: 65,56 + Actor616: null + Owner: ScrinRebels + Facing: 384 + Location: 68,58 + Actor617: tpod + Owner: ScrinRebels + Facing: 384 + Location: 58,62 + Actor618: tpod + Owner: ScrinRebels + Facing: 384 + Location: 62,65 + Actor619: tpod + Owner: ScrinRebels + Facing: 384 + Location: 63,61 + Actor620: gunw + Owner: ScrinRebels + Facing: 384 + Location: 58,58 + Actor621: gunw + Owner: ScrinRebels + Facing: 384 + Location: 67,64 + Actor622: devo + Owner: ScrinRebels + Facing: 384 + Location: 61,59 + Actor623: devo + Owner: ScrinRebels + Facing: 384 + Location: 66,62 + Actor624: intl + Owner: ScrinRebels + Location: 54,62 + Facing: 384 + Actor625: intl + Owner: ScrinRebels + Location: 62,69 + Facing: 384 + Actor626: impl + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 53,61 + Actor627: impl + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 65,71 + Actor642: swal + Owner: Scrin + Location: 6,82 + Actor643: swal + Owner: Scrin + Location: 6,83 + Actor644: swal + Owner: Scrin + Location: 5,83 + Actor645: swal + Owner: Scrin + Location: 5,82 + Actor646: swal + Owner: Scrin + Location: 4,83 + Actor647: swal + Owner: Scrin + Location: 4,84 + Actor648: swal + Owner: Scrin + Location: 5,84 + Actor649: swal + Owner: Scrin + Location: 2,84 + Actor650: swal + Owner: Scrin + Location: 3,84 + Actor651: swal + Owner: Scrin + Location: 1,84 + Actor652: swal + Owner: Scrin + Location: 1,85 + Actor653: swal + Owner: Scrin + Location: 2,85 + Actor669: swal + Owner: Scrin + Location: 34,95 + Actor670: swal + Owner: Scrin + Location: 35,94 + Actor671: swal + Owner: Scrin + Location: 35,95 + Actor672: swal + Owner: Scrin + Location: 36,95 + Actor673: swal + Owner: Scrin + Location: 36,96 + Actor674: swal + Owner: Scrin + Location: 37,96 + Actor675: swal + Owner: Scrin + Location: 37,95 + Actor676: swal + Owner: Scrin + Location: 37,97 + Actor677: swal + Owner: Scrin + Location: 37,98 + Actor678: swal + Owner: Scrin + Location: 38,98 + Actor679: swal + Owner: Scrin + Location: 39,99 + Actor680: swal + Owner: Scrin + Location: 37,99 + Actor681: swal + Owner: Scrin + Location: 38,99 + Actor682: swal + Owner: Scrin + Location: 39,98 + Actor683: swal + Owner: Scrin + Location: 39,100 + Actor684: swal + Owner: Scrin + Location: 39,101 + Actor685: swal + Owner: Scrin + Location: 38,101 + Actor686: swal + Owner: Scrin + Location: 37,101 + Actor687: swal + Owner: Scrin + Location: 37,102 + Actor688: swal + Owner: Scrin + Location: 39,102 + Actor689: swal + Owner: Scrin + Location: 38,102 + Actor716: shar + Owner: Scrin + Location: 33,95 + Actor717: ptur + Owner: Scrin + Location: 40,101 + TurretFacing: 896 + Actor720: scol + Owner: Scrin + Location: 38,100 + Actor721: scol + Owner: ScrinRebelsOuter + Location: 65,66 + Actor722: scol + Owner: ScrinRebelsOuter + Location: 58,60 + Actor723: swal + Owner: ScrinRebelsOuter + Location: 64,65 + Actor724: swal + Owner: ScrinRebelsOuter + Location: 66,65 + Actor725: swal + Owner: ScrinRebelsOuter + Location: 65,65 + Actor726: swal + Owner: ScrinRebelsOuter + Location: 66,66 + Actor727: swal + Owner: ScrinRebelsOuter + Location: 58,61 + Actor728: swal + Owner: ScrinRebelsOuter + Location: 59,61 + Actor729: swal + Owner: ScrinRebelsOuter + Location: 58,59 + Actor730: swal + Owner: ScrinRebelsOuter + Location: 59,59 + Actor731: swal + Owner: ScrinRebelsOuter + Location: 59,60 + Actor732: rea2 + Owner: ScrinRebelsOuter + Location: 120,47 + Actor733: rea2 + Owner: ScrinRebelsOuter + Location: 123,47 + Actor734: swal + Owner: ScrinRebelsOuter + Location: 126,48 + Actor735: swal + Owner: ScrinRebelsOuter + Location: 126,47 + Actor736: swal + Owner: ScrinRebelsOuter + Location: 126,46 + Actor737: swal + Owner: ScrinRebelsOuter + Location: 124,46 + Actor738: swal + Owner: ScrinRebelsOuter + Location: 125,46 + Actor739: swal + Owner: ScrinRebelsOuter + Location: 123,46 + Actor740: swal + Owner: ScrinRebelsOuter + Location: 121,46 + Actor741: swal + Owner: ScrinRebelsOuter + Location: 122,46 + Actor742: swal + Owner: ScrinRebelsOuter + Location: 120,46 + Actor743: swal + Owner: ScrinRebelsOuter + Location: 119,46 + Actor744: swal + Owner: ScrinRebelsOuter + Location: 119,47 + Actor745: swal + Owner: ScrinRebelsOuter + Location: 119,48 + Actor746: tpod + Location: 52,62 + Facing: 384 + Owner: ScrinRebels + Actor747: tpod + Location: 60,69 + Facing: 384 + Owner: ScrinRebels + Actor750: ruin + Location: 86,69 + Facing: 384 + Owner: ScrinRebels + Actor749: ruin + Facing: 384 + Owner: ScrinRebels + Location: 81,66 + Actor748: ruin + Facing: 384 + Owner: ScrinRebels + Location: 77,67 + Actor751: ruin + Facing: 384 + Owner: ScrinRebels + Location: 54,49 + Actor752: ruin + Facing: 384 + Owner: ScrinRebels + Location: 55,42 + IronCurtain: iron + Owner: USSR + Location: 5,96 + Actor766: brik + Owner: USSR + Location: 4,95 + Actor767: brik + Owner: USSR + Location: 4,96 + Actor768: brik + Owner: USSR + Location: 4,97 + Actor769: brik + Owner: USSR + Location: 5,97 + Actor770: brik + Owner: USSR + Location: 6,97 + Actor771: brik + Owner: USSR + Location: 7,97 + Actor772: brik + Owner: USSR + Location: 7,96 + Actor773: brik + Owner: USSR + Location: 7,95 + Actor774: brik + Owner: USSR + Location: 5,95 + Actor775: brik + Owner: USSR + Location: 6,95 + Actor778: brik + Owner: USSR + Location: 2,100 + Actor779: brik + Owner: USSR + Location: 2,109 + Actor780: brik + Owner: USSR + Location: 2,110 + Actor781: brik + Owner: USSR + Location: 2,108 + Actor782: brik + Owner: USSR + Location: 2,107 + Actor783: brik + Owner: USSR + Location: 2,106 + Actor784: brik + Owner: USSR + Location: 3,100 + Actor785: brik + Owner: USSR + Location: 4,100 + Actor786: brik + Owner: USSR + Location: 5,100 + Actor787: brik + Owner: USSR + Location: 6,100 + Actor788: brik + Owner: USSR + Location: 7,100 + Actor789: brik + Owner: USSR + Location: 8,100 + Actor792: brik + Owner: USSR + Location: 9,100 + Actor793: brik + Owner: USSR + Location: 9,101 + Actor794: brik + Owner: USSR + Location: 2,101 + Actor795: brik + Owner: USSR + Location: 2,102 + Actor796: brik + Owner: USSR + Location: 2,103 + Actor797: brik + Owner: USSR + Location: 2,104 + Actor798: brik + Owner: USSR + Location: 2,105 + Actor799: brik + Owner: USSR + Location: 3,110 + Actor800: brik + Owner: USSR + Location: 5,110 + Actor801: brik + Owner: USSR + Location: 4,110 + Actor802: brik + Owner: USSR + Location: 6,110 + Actor803: brik + Owner: USSR + Location: 7,110 + Actor804: brik + Owner: USSR + Location: 8,110 + Actor805: brik + Owner: USSR + Location: 9,110 + Actor806: brik + Owner: USSR + Location: 9,109 + Actor807: brik + Owner: USSR + Location: 9,108 + Actor808: brik + Owner: USSR + Location: 9,107 + Actor809: brik + Owner: USSR + Location: 9,106 + Actor810: brik + Owner: USSR + Location: 9,105 + Actor811: brik + Owner: USSR + Location: 9,104 + Actor812: brik + Owner: USSR + Location: 9,103 + Actor813: brik + Owner: USSR + Location: 9,102 + Actor777: brik + Owner: USSR + Location: 9,96 + Actor790: brik + Owner: USSR + Location: 9,95 + Actor791: brik + Owner: USSR + Location: 9,94 + Actor815: brik + Owner: USSR + Location: 8,93 + Actor816: brik + Owner: USSR + Location: 7,93 + Actor817: brik + Owner: USSR + Location: 6,93 + Actor818: brik + Owner: USSR + Location: 6,94 + Actor819: brik + Owner: USSR + Location: 8,96 + Actor820: tsla + Owner: USSR + Location: 7,94 + Actor821: tsla + Owner: USSR + Location: 8,95 + Actor814: brik + Owner: USSR + Location: 8,94 + Actor822: sam + Owner: USSR + Location: 8,97 + Actor823: sam + Owner: USSR + Location: 4,94 + Actor827: e1 + Owner: USSR + Location: 21,92 + SubCell: 4 + Facing: 896 + Actor828: e1 + Owner: USSR + Location: 21,92 + SubCell: 5 + Facing: 896 + Actor825: e1 + Owner: USSR + Location: 21,92 + SubCell: 1 + Facing: 896 + Actor826: e1 + Owner: USSR + Location: 21,92 + SubCell: 2 + Facing: 896 + Actor830: e1 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 24,94 + Actor831: e1 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 24,94 + Actor834: e1 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 22,93 + Actor835: e1 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 22,93 + Actor836: e1 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 23,93 + Actor837: e1 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 23,93 + Actor838: e1 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 23,93 + Actor839: e1 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 23,93 + Actor841: e1 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 20,92 + Actor842: e1 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 20,92 + Actor843: e1 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 20,92 + Actor844: e1 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 25,94 + Actor845: e1 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 25,94 + Actor846: e1 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 25,94 + Actor847: e1 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 25,94 + Actor848: e1 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 27,97 + Actor849: e1 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 27,97 + Actor850: e1 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 27,97 + Actor851: e1 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 27,97 + Actor852: e1 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 28,97 + Actor853: e1 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 28,97 + Actor854: e1 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 28,97 + Actor855: e1 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 28,97 + Actor856: e1 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 28,98 + Actor857: e1 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 28,98 + Actor858: e1 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 28,98 + Actor859: e1 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 28,98 + Actor860: e1 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 29,98 + Actor861: e1 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 29,98 + Actor862: e1 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 29,98 + Actor863: e1 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 29,98 + Actor864: e1 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 16,91 + Actor865: e1 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 16,91 + Actor866: e1 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 16,91 + Actor867: e1 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 16,91 + Actor868: e1 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 17,91 + Actor869: e1 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 17,91 + Actor870: e1 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 17,91 + Actor871: e1 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 17,91 + Actor872: e1 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 15,90 + Actor873: e1 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 15,90 + Actor874: e1 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 15,90 + Actor875: e1 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 15,90 + Actor876: e1 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 16,90 + Actor877: e1 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 16,90 + Actor878: e1 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 16,90 + Actor879: e1 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 16,90 + Actor880: e1 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 14,93 + Actor881: e1 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 14,93 + Actor882: e1 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 14,93 + Actor883: e1 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 14,93 + Actor884: e1 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 15,93 + Actor885: e1 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 15,93 + Actor886: e1 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 15,93 + Actor887: e1 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 15,93 + Actor888: e1 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 25,99 + Actor889: e1 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 25,99 + Actor890: e1 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 25,99 + Actor891: e1 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 25,99 + Actor892: e1 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 26,99 + Actor893: e1 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 26,99 + Actor894: e1 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 26,99 + Actor895: e1 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 26,99 + Actor896: e1 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 15,94 + Actor897: e1 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 15,94 + Actor898: e1 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 15,94 + Actor899: e1 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 15,94 + Actor900: e1 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 16,94 + Actor901: e1 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 16,94 + Actor902: e1 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 16,94 + Actor903: e1 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 16,94 + Actor904: e1 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 26,100 + Actor905: e1 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 26,100 + Actor906: e1 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 26,100 + Actor907: e1 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 26,100 + Actor908: e1 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 27,100 + Actor909: e1 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 27,100 + Actor910: e1 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 27,100 + Actor911: e1 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 27,100 + Actor833: e1 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 22,93 + Actor829: e1 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 24,94 + Actor832: e1 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 22,93 + Actor824: e1 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 24,94 + Actor840: e1 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 20,92 + Actor912: e1 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 22,92 + Actor913: e1 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 22,92 + Actor914: e1 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 22,92 + Actor915: e1 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 22,92 + Actor916: e1 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 24,93 + Actor917: e1 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 24,93 + Actor918: e1 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 24,93 + Actor919: e1 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 24,93 + Actor920: e1 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 26,94 + Actor921: e1 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 26,94 + Actor922: e1 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 26,94 + Actor923: e1 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 26,94 + Actor925: tpwr + Owner: USSR + Location: 3,101 + Actor926: tpwr + Owner: USSR + Location: 6,101 + Actor927: tpwr + Owner: USSR + Location: 3,104 + Actor928: tpwr + Owner: USSR + Location: 6,104 + Actor929: tpwr + Owner: USSR + Location: 3,107 + Actor930: tpwr + Owner: USSR + Location: 6,107 + Actor933: cmsr + Owner: USSR + SubCell: 3 + Location: 19,90 + Facing: 896 + Actor934: cmsr + Owner: USSR + SubCell: 3 + Facing: 896 + Location: 24,91 + Actor935: cmsr + Owner: USSR + SubCell: 3 + Facing: 896 + Location: 28,95 + Actor955: e3 + Owner: USSR + Location: 19,94 + SubCell: 4 + Facing: 896 + Actor956: e3 + Owner: USSR + Location: 19,94 + SubCell: 5 + Facing: 896 + Actor954: e3 + Owner: USSR + Location: 19,94 + SubCell: 2 + Facing: 896 + Actor953: e3 + Owner: USSR + Location: 19,94 + SubCell: 1 + Facing: 896 + Actor952: e3 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 20,94 + Actor957: e3 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 20,94 + Actor958: e3 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 20,94 + Actor959: e3 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 20,94 + Actor960: e3 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 21,95 + Actor961: e3 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 21,95 + Actor962: e3 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 21,95 + Actor963: e3 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 21,95 + Actor964: e3 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 22,95 + Actor965: e3 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 22,95 + Actor966: e3 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 22,95 + Actor967: e3 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 22,95 + Actor968: e3 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 23,96 + Actor969: e3 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 23,96 + Actor970: e3 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 23,96 + Actor971: e3 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 23,96 + Actor972: e3 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 24,96 + Actor975: e3 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 24,96 + Actor976: e3 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 22,96 + Actor977: e3 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 22,96 + Actor978: e3 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 22,96 + Actor979: e3 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 22,96 + Actor980: e3 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 20,95 + Actor981: e3 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 20,95 + Actor982: e3 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 20,95 + Actor983: e3 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 20,95 + Actor992: trpc + Owner: USSR + Location: 17,96 + Facing: 896 + Actor993: trpc + Owner: USSR + Location: 23,99 + Facing: 896 + Actor1021: null + Owner: ScrinRebels + Location: 114,59 + Facing: 626 + Actor1022: swal + Owner: ScrinRebels + Location: 21,40 + Actor1023: swal + Owner: ScrinRebels + Location: 21,41 + Actor1024: swal + Owner: ScrinRebels + Location: 21,42 + Actor1025: swal + Owner: ScrinRebels + Location: 21,43 + Actor1026: swal + Owner: ScrinRebels + Location: 21,45 + Actor1027: swal + Owner: ScrinRebels + Location: 21,44 + Actor1028: swal + Owner: ScrinRebels + Location: 21,46 + Actor1029: swal + Owner: ScrinRebels + Location: 21,48 + Actor1030: swal + Owner: ScrinRebels + Location: 21,47 + Actor1031: swal + Owner: ScrinRebels + Location: 22,48 + Actor1032: swal + Owner: ScrinRebels + Location: 22,47 + Actor1033: swal + Owner: ScrinRebels + Location: 22,46 + Actor1034: swal + Owner: ScrinRebels + Location: 22,45 + Actor1035: swal + Owner: ScrinRebels + Location: 22,44 + Actor1036: swal + Owner: ScrinRebels + Location: 22,43 + Actor1037: swal + Owner: ScrinRebels + Location: 22,41 + Actor1038: swal + Owner: ScrinRebels + Location: 22,40 + Actor1039: swal + Owner: ScrinRebels + Location: 22,42 + Actor1040: swal + Owner: ScrinRebels + Location: 22,39 + Actor1041: swal + Owner: ScrinRebels + Location: 22,38 + Actor1042: swal + Owner: ScrinRebels + Location: 23,38 + Actor1043: swal + Owner: ScrinRebels + Location: 23,39 + Actor1044: swal + Owner: ScrinRebels + Location: 23,40 + Actor1045: swal + Owner: ScrinRebels + Location: 23,41 + Actor1046: swal + Owner: ScrinRebels + Location: 23,42 + Actor1047: swal + Owner: ScrinRebels + Location: 23,43 + Actor1048: swal + Owner: ScrinRebels + Location: 23,44 + Actor1049: swal + Owner: ScrinRebels + Location: 23,45 + Actor1050: swal + Owner: ScrinRebels + Location: 23,46 + Actor1051: swal + Owner: ScrinRebels + Location: 23,47 + Actor1052: swal + Owner: ScrinRebels + Location: 23,48 + Actor1053: swal + Owner: ScrinRebels + Location: 24,48 + Actor1054: swal + Owner: ScrinRebels + Location: 24,47 + Actor1055: swal + Owner: ScrinRebels + Location: 24,46 + Actor1056: swal + Owner: ScrinRebels + Location: 24,45 + Actor1057: swal + Owner: ScrinRebels + Location: 24,44 + Actor1058: swal + Owner: ScrinRebels + Location: 24,43 + Actor1059: swal + Owner: ScrinRebels + Location: 24,42 + Actor1060: swal + Owner: ScrinRebels + Location: 24,41 + Actor1061: swal + Owner: ScrinRebels + Location: 24,40 + Actor1062: swal + Owner: ScrinRebels + Location: 24,39 + Actor1063: swal + Owner: ScrinRebels + Location: 24,38 + Actor1064: swal + Owner: ScrinRebels + Location: 22,37 + Actor1065: swal + Owner: ScrinRebels + Location: 23,37 + Actor1066: swal + Owner: ScrinRebels + Location: 24,49 + Actor1067: swal + Owner: ScrinRebels + Location: 25,49 + Actor1068: swal + Owner: ScrinRebels + Location: 25,48 + Actor1069: swal + Owner: ScrinRebels + Location: 25,47 + Actor1070: swal + Owner: ScrinRebels + Location: 25,46 + Actor1071: swal + Owner: ScrinRebels + Location: 25,45 + Actor1072: swal + Owner: ScrinRebels + Location: 25,44 + Actor1073: swal + Owner: ScrinRebels + Location: 25,43 + Actor1074: swal + Owner: ScrinRebels + Location: 25,42 + Actor1075: swal + Owner: ScrinRebels + Location: 25,41 + Actor1076: swal + Owner: ScrinRebels + Location: 26,49 + Actor1077: swal + Owner: ScrinRebels + Location: 26,48 + Actor1078: swal + Owner: ScrinRebels + Location: 26,47 + Actor1079: swal + Owner: ScrinRebels + Location: 26,46 + Actor1080: swal + Owner: ScrinRebels + Location: 26,45 + Actor1081: swal + Owner: ScrinRebels + Location: 26,44 + Actor1082: swal + Owner: ScrinRebels + Location: 27,49 + Actor1083: swal + Owner: ScrinRebels + Location: 27,48 + Actor1084: swal + Owner: ScrinRebels + Location: 27,47 + Actor1086: swal + Owner: ScrinRebels + Location: 28,49 + Actor1087: swal + Owner: ScrinRebels + Location: 28,48 + Actor1088: swal + Owner: ScrinRebels + Location: 28,50 + Actor1089: swal + Owner: ScrinRebels + Location: 29,50 + Actor1090: swal + Owner: ScrinRebels + Location: 29,49 + Actor1091: swal + Owner: ScrinRebels + Location: 29,48 + Actor1092: swal + Owner: ScrinRebels + Location: 28,47 + Actor1165: tpod + Owner: ScrinRebels + Facing: 384 + Location: 45,30 + Actor1166: tpod + Owner: ScrinRebels + Facing: 384 + Location: 48,31 + Actor1167: tpod + Owner: ScrinRebels + Facing: 384 + Location: 48,34 + Actor1168: tpod + Owner: ScrinRebels + Facing: 384 + Location: 66,44 + Actor1169: tpod + Owner: ScrinRebels + Facing: 384 + Location: 67,48 + Actor1170: tpod + Owner: ScrinRebels + Location: 81,56 + Facing: 512 + Actor1171: tpod + Owner: ScrinRebels + Facing: 512 + Location: 86,56 + Actor1173: proc + Owner: USSR + Location: 4,87 + Actor1174: splitblue + Owner: Neutral + Location: 7,74 + Actor1175: splitblue + Owner: Neutral + Location: 5,78 + Actor1176: splitblue + Owner: Neutral + Location: 14,76 + Actor1179: scrinflora1 + Owner: Neutral + Location: 117,77 + Actor1180: scrinflora1 + Owner: Neutral + Location: 125,96 + Actor1181: scrinflora1 + Owner: Neutral + Location: 95,111 + Actor1182: scrinflora1 + Owner: Neutral + Location: 67,100 + Actor1183: scrinflora1 + Owner: Neutral + Location: 11,68 + Actor1184: scrinflora1 + Owner: Neutral + Location: 36,62 + Actor1185: scrinflora1 + Owner: Neutral + Location: 50,42 + Actor1186: scrinflora1 + Owner: Neutral + Location: 7,19 + Actor1187: scrinflora1 + Owner: Neutral + Location: 52,6 + Actor1188: scrinflora1 + Owner: Neutral + Location: 99,57 + Actor1189: scrinflora8 + Owner: Neutral + Location: 100,112 + Actor1190: scrinflora8 + Owner: Neutral + Location: 70,110 + Actor1191: scrinflora8 + Owner: Neutral + Location: 69,87 + Actor1192: scrinflora8 + Owner: Neutral + Location: 34,58 + Actor1193: scrinflora8 + Owner: Neutral + Location: 19,64 + Actor1194: scrinflora8 + Owner: Neutral + Location: 22,36 + Actor1195: scrinflora8 + Owner: Neutral + Location: 13,11 + Actor1196: scrinflora8 + Owner: Neutral + Location: 55,3 + Actor1197: scrinflora8 + Owner: Neutral + Location: 80,3 + Actor1198: scrinflora8 + Owner: Neutral + Location: 106,18 + Actor1199: scrinflora8 + Owner: Neutral + Location: 126,42 + Actor1200: scrinflora8 + Owner: Neutral + Location: 101,47 + Actor1201: scrinflora5 + Owner: Neutral + Location: 124,43 + Actor1202: scrinflora5 + Owner: Neutral + Location: 117,111 + Actor1203: scrinflora5 + Owner: Neutral + Location: 98,112 + Actor1204: scrinflora5 + Owner: Neutral + Location: 75,111 + Actor1205: scrinflora5 + Owner: Neutral + Location: 62,83 + Actor1206: scrinflora5 + Owner: Neutral + Location: 42,81 + Actor1207: scrinflora5 + Owner: Neutral + Location: 22,63 + Actor1208: scrinflora5 + Owner: Neutral + Location: 8,57 + Actor1209: scrinflora5 + Owner: Neutral + Location: 3,25 + Actor1210: scrinflora5 + Owner: Neutral + Location: 36,25 + Actor1211: scrinflora5 + Owner: Neutral + Location: 24,6 + Actor1212: scrinflora5 + Owner: Neutral + Location: 64,33 + Actor1213: scrinflora5 + Owner: Neutral + Location: 58,51 + Actor1214: scrinflora6 + Owner: Neutral + Location: 121,35 + Actor1215: scrinflora6 + Owner: Neutral + Location: 111,87 + Actor1216: scrinflora6 + Owner: Neutral + Location: 119,111 + Actor1217: scrinflora6 + Owner: Neutral + Location: 2,60 + Actor1218: scrinflora7 + Owner: Neutral + Location: 64,99 + Actor1219: scrinflora7 + Owner: Neutral + Location: 102,110 + Actor1220: scrinflora7 + Owner: Neutral + Location: 119,78 + Actor1221: scrinflora7 + Owner: Neutral + Location: 85,77 + Actor1223: scrinflora7 + Owner: Neutral + Location: 36,60 + Actor1222: scrinflora7 + Owner: Neutral + Location: 46,71 + Actor1224: scrinflora7 + Owner: Neutral + Location: 26,3 + Actor1225: scrinflora7 + Owner: Neutral + Location: 3,11 + Actor1226: scrinflora7 + Owner: Neutral + Location: 6,36 + Actor1227: scrinflora7 + Owner: Neutral + Location: 33,111 + Actor1228: scrinflora7 + Owner: Neutral + Location: 122,43 + Actor1229: scrinflora4 + Owner: Neutral + Location: 84,95 + Actor1230: scrinflora4 + Owner: Neutral + Location: 68,110 + Actor1231: scrinflora4 + Owner: Neutral + Location: 51,112 + Actor1232: scrinflora4 + Owner: Neutral + Location: 46,84 + Actor1233: scrinflora4 + Owner: Neutral + Location: 15,67 + Actor1234: scrinflora4 + Owner: Neutral + Location: 3,41 + Actor1235: scrinflora4 + Owner: Neutral + Location: 26,20 + Actor1236: scrinflora4 + Owner: Neutral + Location: 43,3 + Actor1237: scrinflora4 + Owner: Neutral + Location: 5,3 + Actor1238: scrinflora4 + Owner: Neutral + Location: 96,4 + Actor1239: scrinflora4 + Owner: Neutral + Location: 123,34 + Actor1240: scrinflora4 + Owner: Neutral + Location: 100,51 + Actor1241: scrinflora3 + Owner: Neutral + Location: 119,33 + Actor1242: scrinflora3 + Owner: Neutral + Location: 113,110 + Actor1243: scrinflora3 + Owner: Neutral + Location: 37,72 + Actor1244: scrinflora3 + Owner: Neutral + Location: 61,110 + Actor1246: scrinflora2 + Owner: Neutral + Location: 127,40 + Actor1247: scrinflora2 + Owner: Neutral + Location: 122,111 + Actor1248: scrinflora2 + Owner: Neutral + Location: 69,109 + Actor1249: scrinflora2 + Owner: Neutral + Location: 58,91 + Actor1250: scrinflora2 + Owner: Neutral + Location: 47,82 + Actor1251: scrinflora2 + Owner: Neutral + Location: 2,66 + Actor1252: scrinflora2 + Owner: Neutral + Location: 2,58 + Actor1253: scrinflora2 + Owner: Neutral + Location: 4,39 + Actor1254: scrinflora2 + Owner: Neutral + Location: 54,3 + Actor1255: scrinflora2 + Owner: Neutral + Location: 97,2 + Actor1256: scrinflora10 + Owner: Neutral + Location: 5,39 + Actor1257: scrinflora10 + Owner: Neutral + Location: 46,79 + Actor1258: scrinflora10 + Owner: Neutral + Location: 53,112 + Actor1259: scrinflora10 + Owner: Neutral + Location: 65,109 + Actor1260: scrinflora10 + Owner: Neutral + Location: 80,95 + Actor1261: scrinflora10 + Owner: Neutral + Location: 101,110 + Actor1262: scrinflora10 + Owner: Neutral + Location: 116,108 + Actor1263: scrinflora12 + Owner: Neutral + Location: 117,108 + Actor1264: scrinflora12 + Owner: Neutral + Location: 125,102 + Actor1265: scrinflora12 + Owner: Neutral + Location: 113,86 + Actor1266: scrinflora12 + Owner: Neutral + Location: 113,68 + Actor1267: scrinflora12 + Owner: Neutral + Location: 120,35 + Actor1268: scrinflora12 + Owner: Neutral + Location: 109,19 + Actor1269: scrinflora12 + Owner: Neutral + Location: 99,4 + Actor1270: scrinflora12 + Owner: Neutral + Location: 53,7 + Actor1271: scrinflora12 + Owner: Neutral + Location: 15,12 + Actor1272: scrinflora12 + Owner: Neutral + Location: 8,2 + Actor1273: scrinflora12 + Owner: Neutral + Location: 2,25 + Actor1274: scrinflora12 + Owner: Neutral + Location: 18,68 + Actor1275: scrinflora13 + Owner: Neutral + Location: 48,85 + Actor1276: scrinflora13 + Owner: Neutral + Location: 34,60 + Actor1277: scrinflora13 + Owner: Neutral + Location: 20,67 + Actor1278: scrinflora13 + Owner: Neutral + Location: 27,18 + Actor1279: scrinflora13 + Owner: Neutral + Location: 28,2 + Actor1280: scrinflora13 + Owner: Neutral + Location: 87,76 + Actor1281: scrinflora13 + Owner: Neutral + Location: 96,111 + Actor1282: scrinflora13 + Owner: Neutral + Location: 121,80 + Actor1283: scrinflora13 + Owner: Neutral + Location: 124,32 + Actor1284: scrinflora13 + Owner: Neutral + Location: 62,85 + Actor1285: scrinflora14 + Owner: Neutral + Location: 66,100 + Actor1286: scrinflora14 + Owner: Neutral + Location: 46,82 + Actor1287: scrinflora14 + Owner: Neutral + Location: 18,64 + Actor1288: scrinflora14 + Owner: Neutral + Location: 2,62 + Actor1289: scrinflora14 + Owner: Neutral + Location: 8,35 + Actor1290: scrinflora14 + Owner: Neutral + Location: 21,34 + Actor1291: scrinflora14 + Owner: Neutral + Location: 6,19 + Actor1292: scrinflora14 + Owner: Neutral + Location: 3,9 + Actor1293: scrinflora14 + Owner: Neutral + Location: 45,4 + Actor1294: scrinflora14 + Owner: Neutral + Location: 76,2 + Actor1295: scrinflora14 + Owner: Neutral + Location: 125,34 + Actor1296: scrinflora14 + Owner: Neutral + Location: 98,53 + Actor1297: scrinflora14 + Owner: Neutral + Location: 73,72 + Actor1298: scrinflora11 + Owner: Neutral + Location: 74,71 + Actor1299: scrinflora11 + Owner: Neutral + Location: 63,84 + Actor1300: scrinflora11 + Owner: Neutral + Location: 95,107 + Actor1301: scrinflora11 + Owner: Neutral + Location: 118,78 + Actor1302: scrinflora11 + Owner: Neutral + Location: 121,34 + Actor1303: scrinflora11 + Owner: Neutral + Location: 99,5 + Actor1304: scrinflora11 + Owner: Neutral + Location: 53,6 + Actor1305: scrinflora11 + Owner: Neutral + Location: 56,2 + Actor1306: scrinflora11 + Owner: Neutral + Location: 23,6 + Actor1307: scrinflora9 + Owner: Neutral + Location: 12,11 + Actor1308: scrinflora9 + Owner: Neutral + Location: 5,13 + Actor1309: scrinflora9 + Owner: Neutral + Location: 7,37 + Actor1310: scrinflora9 + Owner: Neutral + Location: 7,46 + Actor1311: scrinflora9 + Owner: Neutral + Location: 10,57 + Actor1312: scrinflora10 + Owner: Neutral + Location: 21,65 + Actor1313: scrinflora11 + Owner: Neutral + Location: 34,59 + Actor1314: scrinflora9 + Owner: Neutral + Location: 33,58 + Actor1315: scrinflora9 + Owner: Neutral + Location: 65,102 + Actor1316: scrinflora11 + Owner: Neutral + Location: 68,101 + Actor1317: scrinflora11 + Owner: Neutral + Location: 57,91 + Actor1245: scrinflora3 + Owner: Neutral + Location: 127,92 + Actor1318: avtr + Owner: Nod + Location: 92,61 + Facing: 626 + Actor1319: avtr + Owner: Nod + Location: 94,60 + Facing: 634 + Actor1320: hstk + Owner: Nod + Location: 70,100 + Stance: AttackAnything + Facing: 384 + Actor1321: hstk + Owner: Nod + Location: 69,99 + Facing: 384 + Stance: AttackAnything + Actor1324: bggy + Owner: Nod + Location: 62,104 + Facing: 253 + Actor1323: bggy + Owner: Nod + Facing: 253 + Location: 62,106 + Actor1322: bggy + Owner: Nod + Facing: 253 + Location: 60,96 + Actor1325: bggy + Owner: Nod + Facing: 253 + Location: 64,105 + Actor1326: ltnk + Owner: Nod + Location: 30,67 + Facing: 512 + Actor1327: ltnk + Owner: Nod + Location: 32,67 + Facing: 512 + Actor1332: corr + Owner: ScrinRebels + Facing: 384 + Location: 91,100 + Actor1333: corr + Owner: ScrinRebels + Facing: 384 + Location: 92,101 + Actor1334: gunw + Owner: ScrinRebels + Facing: 384 + Location: 86,99 + Actor1335: gunw + Owner: ScrinRebels + Facing: 384 + Location: 91,105 + Actor1336: gunw + Owner: ScrinRebels + Facing: 384 + Location: 89,101 + Actor1337: s2 + Owner: ScrinRebels + SubCell: 3 + Facing: 384 + Location: 92,103 + Actor1338: s2 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 90,99 + Actor1339: s2 + Owner: ScrinRebels + Facing: 384 + Location: 92,103 + SubCell: 1 + Actor1340: s2 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 89,98 + Actor1341: s1 + Owner: ScrinRebels + SubCell: 3 + Facing: 384 + Location: 90,98 + Actor1342: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 91,99 + Actor1343: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 93,100 + Actor1344: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 95,99 + Actor1360: impl + Owner: ScrinRebels + SubCell: 3 + Facing: 384 + Location: 114,97 + Actor1361: impl + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 117,98 + Actor1362: impl + Owner: ScrinRebels + Facing: 384 + Location: 116,98 + SubCell: 3 + Actor1363: impl + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 114,96 + Actor1364: null + Owner: ScrinRebels + Facing: 384 + Location: 117,96 + Actor1365: null + Owner: ScrinRebels + Facing: 384 + Location: 116,95 + Actor1366: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 113,95 + Actor1367: s1 + Owner: ScrinRebels + Facing: 384 + Location: 113,96 + SubCell: 3 + Actor1368: s1 + Owner: ScrinRebels + Facing: 384 + Location: 113,97 + SubCell: 3 + Actor1369: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 113,99 + Actor1370: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 115,100 + Actor1371: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 114,99 + Actor1372: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 119,98 + Actor1373: gunw + Owner: ScrinRebels + Facing: 384 + Location: 111,94 + Actor1374: gunw + Owner: ScrinRebels + Facing: 384 + Location: 121,99 + Actor1375: s3 + Owner: ScrinRebels + Facing: 384 + Location: 67,67 + SubCell: 3 + Actor1376: s3 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 52,66 + Actor1377: s3 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 55,66 + Actor1378: s3 + Owner: ScrinRebels + Facing: 384 + Location: 55,66 + SubCell: 1 + Actor1379: s3 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 56,69 + Actor1380: s3 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 60,72 + Actor1381: s3 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 67,72 + Actor1382: s3 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 50,62 + Actor1383: s3 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 71,62 + Actor1384: s3 + Owner: ScrinRebels + Facing: 384 + Location: 71,62 + SubCell: 1 + Actor1385: s3 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 71,60 + Actor1386: s1 + Owner: ScrinRebels + Facing: 384 + Location: 66,73 + SubCell: 3 + Actor1387: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 63,72 + Actor1388: s1 + Owner: ScrinRebels + Facing: 384 + Location: 63,72 + SubCell: 1 + Actor1389: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 62,73 + Actor1390: s1 + Owner: ScrinRebels + Facing: 384 + Location: 61,73 + SubCell: 3 + Actor1391: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 57,72 + Actor1392: s1 + Owner: ScrinRebels + Facing: 384 + Location: 57,71 + SubCell: 3 + Actor1393: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 57,67 + Actor1394: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 51,64 + Actor1395: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 49,60 + Actor1396: s1 + Owner: ScrinRebels + Facing: 384 + Location: 49,60 + SubCell: 1 + Actor1397: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 50,56 + Actor1398: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 70,63 + Actor1399: s1 + Owner: ScrinRebels + Facing: 384 + Location: 70,63 + SubCell: 1 + Actor1400: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 66,60 + Actor1401: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 64,58 + Actor1402: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 61,57 + Actor1403: s1 + Owner: ScrinRebels + Facing: 384 + Location: 61,56 + SubCell: 3 + Actor1404: s1 + Owner: ScrinRebels + Facing: 384 + Location: 61,56 + SubCell: 1 + Actor1405: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 63,55 + Actor1406: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 65,59 + Actor1407: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 69,67 + Actor1408: s1 + Owner: ScrinRebels + SubCell: 3 + Facing: 384 + Location: 99,74 + Actor1409: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 106,69 + Actor1410: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 107,70 + Actor1411: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 108,69 + Actor1412: s1 + Owner: ScrinRebels + Facing: 384 + Location: 109,69 + SubCell: 3 + Actor1413: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 106,72 + Actor1414: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 105,74 + Actor1415: s1 + Owner: ScrinRebels + Facing: 384 + Location: 104,75 + SubCell: 3 + Actor1416: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 102,75 + Actor1417: s1 + Owner: ScrinRebels + Facing: 384 + Location: 105,74 + SubCell: 1 + Actor1418: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 109,71 + Actor1419: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 107,72 + Actor1420: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 1 + Location: 106,72 + Actor1421: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 116,67 + Actor1422: s1 + Owner: ScrinRebels + Facing: 384 + Location: 116,67 + SubCell: 1 + Actor1423: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 119,68 + Actor1424: s1 + Owner: ScrinRebels + Facing: 384 + Location: 120,67 + SubCell: 3 + Actor1425: s1 + Owner: ScrinRebels + Facing: 384 + Location: 120,67 + SubCell: 1 + Actor1426: s1 + Owner: ScrinRebels + Facing: 384 + Location: 121,67 + SubCell: 3 + Actor1427: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 123,67 + Actor1428: s1 + Owner: ScrinRebels + Facing: 384 + Location: 124,66 + SubCell: 3 + Actor1429: s1 + Owner: ScrinRebels + Facing: 384 + Location: 125,66 + SubCell: 3 + Actor1430: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 125,68 + Actor1431: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 113,60 + Actor1432: s1 + Owner: ScrinRebels + Facing: 384 + Location: 113,60 + SubCell: 1 + Actor1433: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 110,61 + Actor1434: s1 + Owner: ScrinRebels + Facing: 384 + Location: 110,61 + SubCell: 1 + Actor1435: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 115,56 + Actor1436: s1 + Owner: ScrinRebels + Facing: 384 + Location: 115,56 + SubCell: 1 + Actor1437: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 91,62 + Actor1438: s1 + Owner: ScrinRebels + Facing: 384 + Location: 91,62 + SubCell: 1 + Actor1439: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 88,65 + Actor1440: s1 + Owner: ScrinRebels + SubCell: 3 + Location: 95,62 + Facing: 384 + Actor1441: s1 + Owner: ScrinRebels + Facing: 384 + Location: 96,61 + SubCell: 3 + Actor1442: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 97,60 + Actor1443: s1 + Owner: ScrinRebels + Facing: 384 + Location: 98,59 + SubCell: 3 + Actor1444: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 77,59 + Actor1445: s1 + Owner: ScrinRebels + Facing: 384 + Location: 79,59 + SubCell: 3 + Actor1446: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 81,61 + Actor1447: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 90,58 + Actor1448: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 65,40 + Actor1449: s1 + Owner: ScrinRebels + Facing: 384 + Location: 65,41 + SubCell: 3 + Actor1450: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 64,43 + Actor1451: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 65,51 + Actor1452: s1 + Owner: ScrinRebels + Facing: 384 + Location: 65,51 + SubCell: 1 + Actor1453: s1 + Owner: ScrinRebels + Facing: 384 + Location: 65,50 + SubCell: 3 + Actor1454: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 54,47 + Actor1455: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 46,27 + Actor1456: s1 + Owner: ScrinRebels + Facing: 384 + Location: 47,27 + SubCell: 3 + Actor1457: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 50,29 + Actor1458: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 41,28 + Actor1459: s1 + Owner: ScrinRebels + Facing: 384 + Location: 42,29 + SubCell: 3 + Actor1460: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 43,31 + Actor1461: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 46,35 + Actor1462: s1 + Owner: ScrinRebels + Facing: 384 + Location: 46,35 + SubCell: 1 + Actor1463: s1 + Owner: ScrinRebels + Facing: 384 + Location: 47,36 + SubCell: 3 + Actor1464: s1 + Owner: ScrinRebels + Facing: 384 + Location: 47,36 + SubCell: 1 + Actor1465: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 41,33 + Actor1466: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 29,4 + Actor1467: s1 + Owner: ScrinRebels + Facing: 384 + Location: 29,5 + SubCell: 3 + Actor1468: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 31,10 + Actor1469: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 29,8 + Actor1470: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 29,10 + Actor1471: s1 + Owner: ScrinRebels + Facing: 384 + Location: 29,10 + SubCell: 1 + Actor1472: gunw + Owner: ScrinRebels + Location: 108,70 + Facing: 515 + Actor1473: seek + Owner: ScrinRebels + Location: 104,106 + Facing: 214 + Actor1474: seek + Owner: ScrinRebels + Location: 105,104 + Facing: 166 + Actor1475: seek + Owner: ScrinRebels + Location: 105,102 + Facing: 198 + Actor1476: devo + Owner: ScrinRebels + Facing: 384 + Location: 111,80 + Actor1477: atmz + Owner: ScrinRebels + Facing: 384 + Location: 113,81 + Actor1478: devo + Owner: ScrinRebels + Facing: 384 + Location: 113,79 + Actor1479: s3 + Owner: ScrinRebels + SubCell: 3 + Facing: 384 + Location: 115,80 + Actor1480: s3 + Owner: ScrinRebels + Facing: 384 + Location: 115,80 + SubCell: 1 + Actor1481: s3 + Owner: ScrinRebels + Facing: 384 + Location: 114,80 + SubCell: 3 + Actor1482: s3 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 111,78 + Actor1483: s3 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 110,80 + Actor1484: s4 + Owner: ScrinRebels + SubCell: 3 + Facing: 384 + Location: 116,81 + Actor1485: s4 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 110,79 + Actor1486: intl + Owner: ScrinRebels + Facing: 384 + Location: 110,82 + Actor1487: intl + Owner: ScrinRebels + Location: 103,105 + Facing: 158 + Actor1488: intl + Owner: ScrinRebels + Location: 103,103 + Facing: 174 + Actor569: shar + Owner: ScrinRebelsOuter + Location: 70,68 + TurretFacing: 396 + Actor1489: tpod + Owner: ScrinRebels + Facing: 384 + Location: 118,67 + Actor1490: tpod + Owner: ScrinRebels + Facing: 384 + Location: 122,66 + Actor1491: tpod + Owner: ScrinRebels + Location: 100,73 + Facing: 586 + Actor1492: tpod + Owner: ScrinRebels + Location: 105,70 + Facing: 586 + Actor1493: devo + Owner: ScrinRebels + Location: 107,49 + Facing: 594 + Actor1494: devo + Owner: ScrinRebels + Location: 109,50 + Facing: 570 + Actor1495: devo + Owner: ScrinRebels + Location: 110,48 + Facing: 570 + Actor1496: devo + Owner: ScrinRebels + Location: 112,49 + Facing: 563 + Actor1497: devo + Owner: ScrinRebels + Facing: 384 + Location: 50,26 + Actor1498: devo + Owner: ScrinRebels + Facing: 384 + Location: 51,27 + Actor1499: devo + Owner: ScrinRebels + Facing: 384 + Location: 53,29 + Actor1500: devo + Owner: ScrinRebels + Location: 93,59 + Facing: 618 + Actor1501: intl + Owner: ScrinRebels + Facing: 384 + Location: 124,68 + Actor1502: intl + Owner: ScrinRebels + Location: 101,75 + Facing: 570 + Actor1503: s4 + Owner: ScrinRebels + SubCell: 3 + Location: 103,74 + Facing: 555 + Actor1504: s4 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 124,67 + Actor1505: s3 + Owner: ScrinRebels + SubCell: 3 + Location: 116,62 + Facing: 384 + Actor1506: s3 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 123,61 + Actor1507: s3 + Owner: ScrinRebels + SubCell: 3 + Location: 111,61 + Facing: 563 + Actor1508: s3 + Owner: ScrinRebels + SubCell: 3 + Location: 113,55 + Facing: 626 + Actor1509: s3 + Owner: ScrinRebels + SubCell: 3 + Location: 96,60 + Facing: 602 + Actor1510: s3 + Owner: ScrinRebels + SubCell: 3 + Location: 85,67 + Facing: 384 + Actor1511: s3 + Owner: ScrinRebels + SubCell: 3 + Location: 102,71 + Facing: 610 + Actor1512: s3 + Owner: ScrinRebels + SubCell: 3 + Location: 96,68 + Facing: 586 + Actor1513: rmbc + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 58,14 + Actor1514: rmbc + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 58,20 + Actor1515: rmbc + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 57,16 + Actor1516: rmbc + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 58,12 + Actor1517: rmbc + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 59,17 + Actor1518: rmbc + Owner: Nod + SubCell: 3 + Location: 82,22 + Facing: 626 + Actor1519: rmbc + Owner: Nod + SubCell: 3 + Location: 83,17 + Facing: 602 + Actor1520: rmbc + Owner: Nod + SubCell: 3 + Location: 83,15 + Facing: 682 + Actor1521: rmbc + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 63,57 + Actor1522: rmbc + Owner: Nod + Facing: 384 + Location: 67,60 + SubCell: 3 + Actor1523: rmbc + Owner: Nod + SubCell: 3 + Location: 112,47 + Facing: 610 + Actor1524: rmbc + Owner: Nod + SubCell: 3 + Location: 108,48 + Facing: 515 + Actor1525: tplr + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 30,9 + Actor1526: tplr + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 28,6 + Actor1527: tplr + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 27,8 + Actor1528: tplr + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 32,11 + Actor1529: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 76,14 + Actor1530: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 68,22 + Actor1531: n3 + Owner: Nod + Facing: 384 + Location: 64,21 + SubCell: 3 + Actor1532: n3 + Owner: Nod + SubCell: 3 + Location: 68,17 + Facing: 713 + Actor1533: n3 + Owner: Nod + Facing: 384 + Location: 61,9 + SubCell: 3 + Actor1534: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 65,8 + Actor1535: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 77,23 + Actor1536: n3 + Owner: Nod + SubCell: 3 + Location: 82,25 + TurretFacing: 0 + Facing: 634 + Actor1537: wtnk + Owner: Nod + Facing: 384 + Location: 56,9 + Actor1538: wtnk + Owner: Nod + Facing: 384 + Location: 55,7 + Actor1539: wtnk + Owner: Nod + Facing: 384 + Location: 54,27 + Actor1540: wtnk + Owner: Nod + Location: 30,64 + Facing: 499 + Actor1541: ftnk + Owner: Nod + Location: 16,43 + Facing: 515 + Actor1542: ftnk + Owner: Nod + Location: 14,43 + Facing: 515 + Actor1543: ftnk + Owner: Nod + Location: 11,44 + Facing: 586 + Actor1544: arty.nod + Owner: Nod + Location: 12,41 + Facing: 555 + Actor1545: arty.nod + Owner: Nod + Location: 15,40 + Facing: 499 + Actor1546: howi + Owner: Nod + Facing: 384 + Location: 18,17 + Actor1547: howi + Owner: Nod + Facing: 384 + Location: 19,18 + Actor1548: howi + Owner: Nod + Facing: 384 + Location: 20,20 + Actor1549: mlrs + Owner: Nod + Facing: 384 + Location: 61,23 + Actor1550: mlrs + Owner: Nod + Facing: 384 + Location: 61,10 + Actor1551: ltnk + Owner: Nod + Facing: 384 + Location: 15,18 + Actor1552: ltnk + Owner: Nod + Facing: 384 + Location: 16,19 + Actor1553: ltnk + Owner: Nod + Facing: 384 + Location: 18,21 + Actor1554: ltnk + Owner: Nod + Facing: 384 + Location: 19,22 + Actor1555: ltnk + Owner: Nod + Facing: 384 + Location: 54,9 + Actor1556: ltnk + Owner: Nod + Facing: 384 + Location: 55,16 + Actor1557: ltnk + Owner: Nod + Facing: 384 + Location: 41,4 + Actor1558: ltnk + Owner: Nod + Facing: 384 + Location: 42,5 + Actor1559: bike + Owner: Nod + Facing: 384 + Location: 67,104 + Actor1560: bike + Owner: Nod + Facing: 384 + Location: 65,103 + Actor1561: bike + Owner: Nod + Location: 28,66 + Facing: 634 + Actor1562: bike + Owner: Nod + Location: 35,66 + Facing: 384 + Actor1563: stnk.nod + Owner: Nod + Location: 14,56 + Facing: 666 + Stance: AttackAnything + Actor1564: stnk.nod + Owner: Nod + Location: 16,57 + Facing: 610 + Stance: AttackAnything + Actor1565: n1 + Owner: Nod + SubCell: 3 + Location: 12,43 + TurretFacing: 0 + Facing: 602 + Actor1566: n1 + Owner: Nod + Facing: 384 + Location: 12,43 + SubCell: 1 + Actor1567: n1 + Owner: Nod + SubCell: 3 + Location: 10,43 + Facing: 547 + Actor1568: n1 + Owner: Nod + Location: 10,42 + SubCell: 3 + Facing: 555 + Actor1569: n1 + Owner: Nod + SubCell: 3 + Location: 9,45 + Facing: 658 + Actor1570: n1 + Owner: Nod + SubCell: 3 + Location: 15,44 + Facing: 507 + Actor1571: n1 + Owner: Nod + Facing: 384 + Location: 15,44 + SubCell: 1 + Actor1572: n1 + Owner: Nod + SubCell: 3 + Location: 18,45 + Facing: 384 + Actor1573: n1 + Owner: Nod + SubCell: 3 + Location: 17,43 + Facing: 459 + Actor1574: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 16,42 + Actor1575: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 18,42 + Actor1576: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 13,42 + Actor1577: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 16,40 + Actor1578: n1 + Owner: Nod + Facing: 384 + Location: 19,20 + SubCell: 3 + Actor1579: n1 + Owner: Nod + Facing: 384 + Location: 19,20 + SubCell: 1 + Actor1580: n1 + Owner: Nod + Facing: 384 + Location: 18,19 + SubCell: 3 + Actor1581: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 17,17 + Actor1582: n1 + Owner: Nod + Facing: 384 + Location: 16,16 + SubCell: 3 + Actor1583: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 21,22 + Actor1584: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 20,21 + Actor1585: n1 + Owner: Nod + Facing: 384 + Location: 18,19 + SubCell: 1 + Actor1586: bh + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 18,20 + Actor1587: bh + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 16,18 + Actor1588: bh + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 29,7 + Actor1589: bh + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 43,6 + Actor1590: bh + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 42,4 + Actor1591: bh + Owner: Nod + Facing: 384 + Location: 55,15 + SubCell: 3 + Actor1592: bh + Owner: Nod + SubCell: 3 + Location: 93,62 + Facing: 610 + Actor1593: bh + Owner: Nod + Location: 93,62 + SubCell: 1 + Facing: 570 + Actor1594: bh + Owner: Nod + SubCell: 3 + Location: 95,61 + Facing: 539 + Actor1595: bh + Owner: Nod + SubCell: 3 + Location: 96,59 + Facing: 570 + Actor1596: enli + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 53,64 + Actor1597: enli + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 61,71 + Actor1598: enli + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 62,56 + Actor1599: enli + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 70,58 + Actor1600: enli + Owner: Nod + Facing: 384 + Location: 78,50 + SubCell: 3 + Actor1601: enli + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 75,48 + Actor1602: enli + Owner: Nod + SubCell: 3 + Location: 86,48 + Facing: 563 + Actor1603: rmbc + Owner: Nod + SubCell: 3 + Location: 87,46 + Facing: 586 + Actor1604: rmbc + Owner: Nod + Location: 82,47 + SubCell: 3 + Facing: 515 + Actor1605: reap + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 58,16 + Actor1606: reap + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 56,11 + Actor1607: reap + Owner: Nod + SubCell: 3 + Location: 63,16 + Facing: 364 + Actor1608: reap + Owner: Nod + SubCell: 3 + Location: 75,22 + Facing: 769 + Actor1609: reap + Owner: Nod + SubCell: 3 + Location: 69,13 + Facing: 531 + NodRally1: waypoint + Owner: Neutral + Location: 36,36 + NodRally2: waypoint + Owner: Neutral + Location: 13,46 + StagingAreaEntrance: waypoint + Owner: Neutral + Location: 32,79 + RebelRally1: waypoint + Owner: Neutral + Location: 79,77 + RebelRally2: waypoint + Owner: Neutral + Location: 78,102 + MaleficSpawn2: waypoint + Owner: Neutral + Location: 114,22 + MaleficSpawn1: waypoint + Owner: Neutral + Location: 97,9 + MaleficSpawn3: waypoint + Owner: Neutral + Location: 116,39 + MaleficSpawn4: waypoint + Owner: Neutral + Location: 109,57 + MaleficSpawn5: waypoint + Owner: Neutral + Location: 84,64 + MaleficSpawn6: waypoint + Owner: Neutral + Location: 60,40 + MaleficSpawn7: waypoint + Owner: Neutral + Location: 53,23 + Actor1612: sfac + Owner: ScrinRebels + Location: 84,40 + Exterminator: etpd + Owner: Scrin + Location: 29,85 + Facing: 384 + Actor1613: swal + Owner: ScrinRebels + Location: 86,90 + Actor1614: swal + Owner: ScrinRebels + Location: 86,89 + Actor1615: swal + Owner: ScrinRebels + Location: 87,90 + Actor1616: swal + Owner: ScrinRebels + Location: 87,89 + Actor1617: swal + Owner: ScrinRebels + Location: 88,89 + Actor1618: swal + Owner: ScrinRebels + Location: 88,88 + Actor1619: swal + Owner: ScrinRebels + Location: 87,88 + Actor1620: swal + Owner: ScrinRebels + Location: 89,88 + Actor1621: swal + Owner: ScrinRebels + Location: 89,87 + Actor1622: swal + Owner: ScrinRebels + Location: 88,87 + Actor1623: swal + Owner: ScrinRebels + Location: 90,88 + Actor1624: swal + Owner: ScrinRebels + Location: 90,87 + Actor1625: swal + Owner: ScrinRebels + Location: 91,87 + Actor1626: swal + Owner: ScrinRebels + Location: 91,88 + Actor1627: swal + Owner: ScrinRebels + Location: 92,87 + Actor1628: swal + Owner: ScrinRebels + Location: 92,88 + Actor1629: swal + Owner: ScrinRebels + Location: 93,87 + Actor1630: swal + Owner: ScrinRebels + Location: 93,88 + Actor1631: swal + Owner: ScrinRebels + Location: 94,87 + Actor1632: swal + Owner: ScrinRebels + Location: 94,88 + Actor1633: swal + Owner: ScrinRebels + Location: 92,86 + Actor1634: swal + Owner: ScrinRebels + Location: 92,85 + Actor1635: swal + Owner: ScrinRebels + Location: 91,85 + Actor1636: swal + Owner: ScrinRebels + Location: 91,86 + Actor1637: devo + Owner: ScrinRebels + Facing: 628 + Location: 74,79 + Actor1638: s4 + Owner: ScrinRebels + SubCell: 3 + Facing: 658 + Location: 76,79 + Actor1639: s3 + Owner: ScrinRebels + SubCell: 3 + Facing: 570 + Location: 79,79 + Actor1640: devo + Owner: ScrinRebels + Facing: 628 + Location: 81,79 + Actor1641: s4 + Owner: ScrinRebels + SubCell: 3 + Facing: 650 + Location: 83,79 + Actor1642: devo + Owner: ScrinRebels + Facing: 628 + Location: 78,80 + Actor1643: s4 + Owner: ScrinRebels + SubCell: 3 + Facing: 682 + Location: 80,80 + Actor1644: s3 + Owner: ScrinRebels + SubCell: 3 + Facing: 674 + Location: 74,81 + Actor1645: tpod + Owner: ScrinRebels + TurretFacing: 8 + Facing: 628 + Location: 76,81 + Actor1646: s4 + Owner: ScrinRebels + SubCell: 3 + Facing: 634 + Location: 78,81 + Actor1647: seek + Owner: ScrinRebels + Facing: 628 + Location: 80,81 + Actor1648: seek + Owner: ScrinRebels + Facing: 628 + Location: 83,81 + Actor1649: seek + Owner: ScrinRebels + Facing: 628 + Location: 77,83 + Actor1650: s3 + Owner: ScrinRebels + SubCell: 3 + Facing: 547 + Location: 82,77 + Actor1651: seek + Owner: ScrinRebels + Facing: 628 + Location: 85,79 + Actor1652: swal + Owner: ScrinRebels + Location: 85,92 + Actor1653: swal + Owner: ScrinRebels + Location: 85,91 + Actor1654: swal + Owner: ScrinRebels + Location: 85,90 + Actor1655: swal + Owner: ScrinRebels + Location: 84,90 + Actor1656: swal + Owner: ScrinRebels + Location: 84,91 + Actor1657: swal + Owner: ScrinRebels + Location: 84,92 + Actor1658: swal + Owner: ScrinRebels + Location: 82,92 + Actor1659: swal + Owner: ScrinRebels + Location: 83,92 + Actor1660: swal + Owner: ScrinRebels + Location: 83,91 + Actor1661: swal + Owner: ScrinRebels + Location: 82,91 + Actor1662: swal + Owner: ScrinRebels + Location: 83,90 + Actor1663: swal + Owner: ScrinRebels + Location: 84,89 + Actor1664: swal + Owner: ScrinRebels + Location: 85,89 + Actor1665: swal + Owner: ScrinRebels + Location: 84,88 + Actor1666: swal + Owner: ScrinRebels + Location: 85,88 + Actor1667: swal + Owner: ScrinRebels + Location: 86,88 + Actor1668: swal + Owner: ScrinRebels + Location: 85,87 + Actor1669: swal + Owner: ScrinRebels + Location: 86,87 + Actor1670: swal + Owner: ScrinRebels + Location: 87,87 + Actor1671: swal + Owner: ScrinRebels + Location: 87,86 + Actor1672: swal + Owner: ScrinRebels + Location: 88,86 + Actor1673: swal + Owner: ScrinRebels + Location: 89,86 + Actor1674: swal + Owner: ScrinRebels + Location: 90,86 + Actor1675: swal + Owner: ScrinRebels + Location: 89,85 + Actor1676: swal + Owner: ScrinRebels + Location: 90,85 + Actor1677: swal + Owner: ScrinRebels + Location: 91,84 + Actor1678: swal + Owner: ScrinRebels + Location: 92,84 + Actor1679: swal + Owner: ScrinRebels + Location: 93,84 + Actor1680: swal + Owner: ScrinRebels + Location: 94,84 + Actor1681: swal + Owner: ScrinRebels + Location: 94,83 + Actor1682: swal + Owner: ScrinRebels + Location: 93,83 + Actor1683: swal + Owner: ScrinRebels + Location: 92,83 + Actor1684: swal + Owner: ScrinRebels + Location: 91,83 + Actor1685: swal + Owner: ScrinRebels + Location: 90,84 + Actor1687: swal + Owner: ScrinRebels + Location: 88,85 + Actor1688: swal + Owner: ScrinRebels + Location: 87,85 + Actor1689: swal + Owner: ScrinRebels + Location: 86,86 + Actor1690: swal + Owner: ScrinRebels + Location: 85,86 + Actor1691: swal + Owner: ScrinRebels + Location: 84,87 + Actor1692: swal + Owner: ScrinRebels + Location: 83,88 + Actor1693: swal + Owner: ScrinRebels + Location: 83,89 + Actor1694: swal + Owner: ScrinRebels + Location: 82,90 + Actor1695: swal + Owner: ScrinRebels + Location: 82,89 + Actor1696: swal + Owner: ScrinRebels + Location: 82,88 + Actor1697: swal + Owner: ScrinRebels + Location: 81,89 + Actor1698: swal + Owner: ScrinRebels + Location: 81,90 + Actor1699: swal + Owner: ScrinRebels + Location: 81,91 + Actor1700: swal + Owner: ScrinRebels + Location: 81,92 + Actor1701: swal + Owner: Scrin + Location: 21,108 + Actor1702: swal + Owner: Scrin + Location: 22,108 + Actor1703: swal + Owner: Scrin + Location: 23,108 + Actor1705: swal + Owner: Scrin + Location: 24,108 + Actor1706: swal + Owner: Scrin + Location: 25,108 + Actor1707: swal + Owner: Scrin + Location: 26,108 + Actor1708: swal + Owner: Scrin + Location: 27,108 + Actor1709: swal + Owner: Scrin + Location: 28,108 + Actor1710: swal + Owner: Scrin + Location: 29,108 + Actor1711: swal + Owner: Scrin + Location: 30,108 + Actor1713: swal + Owner: Scrin + Location: 21,109 + Actor1714: rea2 + Owner: Scrin + Location: 22,109 + Actor1715: rea2 + Owner: Scrin + Location: 25,109 + Actor1716: rea2 + Owner: Scrin + Location: 28,109 + Actor1717: swal + Owner: Scrin + Location: 31,109 + Actor1718: swal + Owner: Scrin + Location: 21,110 + Actor1719: swal + Owner: Scrin + Location: 31,110 + Actor1720: swal + Owner: Scrin + Location: 21,111 + Actor1721: swal + Owner: Scrin + Location: 31,111 + Actor1734: swal + Owner: Scrin + Location: 21,112 + Actor1735: swal + Owner: Scrin + Location: 22,112 + Actor1736: swal + Owner: Scrin + Location: 23,112 + Actor1737: swal + Owner: Scrin + Location: 24,112 + Actor1738: swal + Owner: Scrin + Location: 25,112 + Actor1739: swal + Owner: Scrin + Location: 26,112 + Actor1740: swal + Owner: Scrin + Location: 27,112 + Actor1741: swal + Owner: Scrin + Location: 28,112 + Actor1742: swal + Owner: Scrin + Location: 29,112 + Actor1743: swal + Owner: Scrin + Location: 30,112 + Actor1744: swal + Owner: Scrin + Location: 31,112 + Actor1712: swal + Owner: Scrin + Location: 31,108 + Actor1725: 4tnk + Owner: USSR + Facing: 896 + Location: 27,88 + Actor1726: 4tnk + Owner: USSR + Facing: 896 + Location: 24,88 + Actor1727: 4tnk + Owner: USSR + Facing: 896 + Location: 28,90 + Actor1730: 3tnk + Owner: USSR + Facing: 896 + Location: 22,87 + Actor1731: 3tnk + Owner: USSR + Facing: 896 + Location: 25,86 + Actor1732: 3tnk + Owner: USSR + Facing: 896 + Location: 29,88 + Actor1745: 3tnk + Owner: USSR + Facing: 896 + Location: 30,91 + Actor1756: ttrp + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 12,98 + Actor1757: ttrp + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 12,98 + Actor1758: ttrp + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 12,98 + Actor1759: ttrp + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 12,98 + Actor1760: ttrp + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 14,99 + Actor1761: ttrp + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 14,99 + Actor1762: ttrp + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 14,99 + Actor1763: ttrp + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 14,99 + Actor1764: ttrp + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 22,103 + Actor1765: ttrp + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 22,103 + Actor1766: ttrp + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 22,103 + Actor1767: ttrp + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 22,103 + Actor1768: ttrp + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 24,104 + Actor1769: ttrp + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 24,104 + Actor1770: ttrp + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 24,104 + Actor1771: ttrp + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 24,104 + Actor1733: btr + Owner: USSR + Facing: 896 + Location: 16,100 + Actor1775: btr + Owner: USSR + Facing: 896 + Location: 18,100 + Actor1776: btr + Owner: USSR + Facing: 896 + Location: 20,101 + Actor1777: btr + Owner: USSR + Facing: 896 + Location: 18,102 + Actor1782: swal + Owner: Scrin + Location: 12,82 + Actor1784: swal + Owner: Scrin + Location: 13,82 + Actor1785: ptur + Owner: Scrin + TurretFacing: 840 + Location: 22,82 + Actor1786: swal + Owner: Scrin + Location: 12,83 + Actor1787: swal + Owner: Scrin + Location: 13,83 + Actor1788: swal + Owner: Scrin + Location: 14,83 + Actor1789: swal + Owner: Scrin + Location: 21,83 + Actor1790: swal + Owner: Scrin + Location: 22,83 + Actor1791: swal + Owner: Scrin + Location: 23,83 + Actor1792: swal + Owner: Scrin + Location: 13,84 + Actor1793: swal + Owner: Scrin + Location: 14,84 + Actor1794: swal + Owner: Scrin + Location: 15,84 + Actor1795: swal + Owner: Scrin + Location: 16,84 + Actor1796: swal + Owner: Scrin + Location: 17,84 + Actor1797: swal + Owner: Scrin + Location: 18,84 + Actor1798: swal + Owner: Scrin + Location: 19,84 + Actor1799: swal + Owner: Scrin + Location: 20,84 + Actor1800: swal + Owner: Scrin + Location: 21,84 + Actor1801: scol + Owner: Scrin + Location: 22,84 + Actor1802: swal + Owner: Scrin + Location: 23,84 + Actor1804: swal + Owner: Scrin + Location: 17,85 + Actor1805: swal + Owner: Scrin + Location: 18,85 + Actor1806: shar + Owner: Scrin + Location: 19,85 + Actor1807: swal + Owner: Scrin + Location: 20,85 + Actor1808: swal + Owner: Scrin + Location: 21,85 + Actor1809: swal + Owner: Scrin + Location: 22,85 + Actor1810: swal + Owner: Scrin + Location: 23,85 + Actor1724: barr + Owner: USSR + Location: 14,85 + Actor1803: barr + Owner: USSR + Location: 34,100 + Actor1812: ptur + Owner: Scrin + TurretFacing: 840 + Location: 33,87 + Actor1813: swal + Owner: Scrin + Location: 32,88 + Actor1814: swal + Owner: Scrin + Location: 33,88 + Actor1815: swal + Owner: Scrin + Location: 34,88 + Actor1816: swal + Owner: Scrin + Location: 32,89 + Actor1817: scol + Owner: Scrin + Location: 33,89 + Actor1818: swal + Owner: Scrin + Location: 34,89 + Actor1819: swal + Owner: Scrin + Location: 32,90 + Actor1820: swal + Owner: Scrin + Location: 33,90 + Actor1821: swal + Owner: Scrin + Location: 34,90 + Actor1822: swal + Owner: Scrin + Location: 33,91 + Actor1823: swal + Owner: Scrin + Location: 34,91 + Actor1824: swal + Owner: Scrin + Location: 33,92 + Actor1825: swal + Owner: Scrin + Location: 34,92 + Actor1826: swal + Owner: Scrin + Location: 33,93 + Actor1827: swal + Owner: Scrin + Location: 34,93 + Actor1828: swal + Owner: Scrin + Location: 33,94 + Actor1829: swal + Owner: Scrin + Location: 34,94 + Actor1830: scol + Owner: ScrinRebelsOuter + Location: 83,87 + Actor1831: scol + Owner: ScrinRebelsOuter + Location: 86,85 + Actor1686: scol + Owner: ScrinRebelsOuter + Location: 89,84 + Actor1832: scol + Owner: ScrinRebelsOuter + Location: 25,40 + Actor1833: scol + Owner: ScrinRebelsOuter + Location: 26,43 + Actor1834: scol + Owner: ScrinRebelsOuter + Location: 27,46 + Actor1835: camera + Owner: ScrinRebels + Location: 90,91 + Actor1836: camera + Owner: ScrinRebels + Location: 56,75 + Actor1837: camera + Owner: ScrinRebels + Location: 45,56 + Actor1838: camera + Owner: ScrinRebels + Location: 61,44 + Actor1839: camera + Owner: ScrinRebels + Location: 79,63 + Actor1840: camera + Owner: ScrinRebels + Location: 105,55 + Actor1841: camera + Owner: ScrinRebels + Location: 55,19 + Actor1842: camera + Owner: ScrinRebels + Location: 30,31 + Actor1843: camera + Owner: ScrinRebels + Location: 16,50 + Actor1844: camera + Owner: ScrinRebels + Location: 23,77 + Actor1845: camera + Owner: ScrinRebels + Location: 44,95 + Actor1846: dome + Owner: USSR + Location: 11,109 + Actor1847: avtr + Owner: Nod + Location: 76,77 + Facing: 642 + Actor1848: avtr + Owner: Nod + Facing: 642 + Location: 78,76 + Actor1849: splitblue + Owner: Neutral + Location: 51,109 + Actor1850: splitblue + Owner: Neutral + Location: 56,107 + Actor1851: splitblue + Owner: Neutral + Location: 7,30 + Actor1852: splitblue + Owner: Neutral + Location: 6,27 + Actor1610: weap + Owner: USSR + Location: 30,101 + Actor1611: stek + Owner: USSR + Location: 17,109 + Actor1751: deva + Owner: ScrinRebels + Facing: 384 + Location: 69,42 + Actor1752: deva + Owner: ScrinRebels + Facing: 384 + Location: 89,52 + Actor1753: deva + Owner: ScrinRebels + Facing: 384 + Location: 76,53 + Actor1754: deva + Owner: ScrinRebels + Facing: 384 + Location: 72,50 + Actor1755: pac + Owner: ScrinRebels + Facing: 384 + Location: 85,46 + Actor1772: pac + Owner: ScrinRebels + Facing: 384 + Location: 82,39 + Actor1773: pac + Owner: ScrinRebels + Facing: 384 + Location: 91,45 + Actor1774: pac + Owner: ScrinRebels + Location: 110,66 + Facing: 555 + Actor1778: pac + Owner: ScrinRebels + Location: 89,67 + Facing: 384 + Actor1779: pac + Owner: ScrinRebels + Facing: 384 + Location: 75,66 + Actor1780: pac + Owner: ScrinRebels + Facing: 384 + Location: 31,42 + Actor1781: pac + Owner: ScrinRebels + Facing: 384 + Location: 29,39 + KirovSpawn1: waypoint + Owner: Neutral + Location: 1,98 + KirovRally1: waypoint + Owner: Neutral + Location: 9,91 + KirovRally2: waypoint + Owner: Neutral + Location: 27,102 + KirovSpawn2: waypoint + Owner: Neutral + Location: 17,112 + SSMEast1: mlrs + Owner: Nod + Location: 48,87 + Facing: 384 + SSMEast2: mlrs + Owner: Nod + Location: 51,89 + Facing: 384 + SSMNorth: mlrs + Owner: Nod + Location: 25,68 + Facing: 384 + Actor1704: camera + Owner: ScrinRebels + Location: 35,85 + Actor1722: camera + Owner: ScrinRebels + Location: 63,96 + Actor1728: camera + Owner: ScrinRebels + Location: 27,61 + EnervatorPatrol1: waypoint + Owner: Neutral + Location: 84,43 + EnervatorPatrol2: waypoint + Owner: Neutral + Location: 112,42 + EnervatorPatrol3: waypoint + Owner: Neutral + Location: 103,61 + EnervatorPatrol4: waypoint + Owner: Neutral + Location: 84,61 + BansheePatrol1: waypoint + Owner: Neutral + Location: 67,7 + BansheePatrol2: waypoint + Owner: Neutral + Location: 91,3 + BansheePatrol3: waypoint + Owner: Neutral + Location: 83,29 + OverlordSpawn2: waypoint + Owner: Neutral + Location: 73,35 + OverlordSpawn3: waypoint + Owner: Neutral + Location: 92,49 + OverlordSpawn1: waypoint + Owner: Neutral + Location: 73,52 + Actor1729: camera + Owner: ScrinRebels + Location: 12,35 + Actor1746: camera + Owner: ScrinRebels + Location: 20,14 + Actor1747: camera + Owner: ScrinRebels + Location: 98,101 + Actor1748: camera + Owner: ScrinRebels + Location: 119,91 + Actor1749: camera + Owner: ScrinRebels + Location: 111,75 + Actor1783: camera + Owner: ScrinRebels + Location: 120,71 + Actor1811: camera + Owner: ScrinRebels + Location: 89,80 + McvSpawn: waypoint + Owner: Neutral + Location: 14,112 + McvDest: waypoint + Owner: Neutral + Location: 14,104 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|missions/main-campaign/ca42-schism/schism-rules.yaml, ca|rules/custom/coop-rules.yaml, schism-coop-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml, ca|missions/main-campaign/ca42-schism/schism-weapons.yaml diff --git a/mods/ca/missions/coop-campaign/ca42-schism-coop/schism-coop-rules.yaml b/mods/ca/missions/coop-campaign/ca42-schism-coop/schism-coop-rules.yaml new file mode 100644 index 0000000000..0de4720707 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca42-schism-coop/schism-coop-rules.yaml @@ -0,0 +1,6 @@ +World: + LuaScript: + Scripts: campaign.lua, coop.lua, ca|missions/main-campaign/ca42-schism/schism.lua, schism-coop.lua + LobbyMissionInfo@InitialObjectives: + Prefix: Initial Objectives + Text: • Secure the purification device using the Exterminator Tripod. diff --git a/mods/ca/missions/coop-campaign/ca42-schism-coop/schism-coop.lua b/mods/ca/missions/coop-campaign/ca42-schism-coop/schism-coop.lua new file mode 100644 index 0000000000..fd9bf8732f --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca42-schism-coop/schism-coop.lua @@ -0,0 +1,72 @@ + +SetupPlayers = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Multi2 = Player.GetPlayer("Multi2") + Multi3 = Player.GetPlayer("Multi3") + Multi4 = Player.GetPlayer("Multi4") + Multi5 = Player.GetPlayer("Multi5") + USSR = Player.GetPlayer("USSR") + Scrin = Player.GetPlayer("Scrin") + Nod = Player.GetPlayer("Nod") + ScrinRebels = Player.GetPlayer("ScrinRebels") + ScrinRebelsOuter = Player.GetPlayer("ScrinRebelsOuter") + MaleficScrin = Player.GetPlayer("MaleficScrin") + SpyPlaneProvider = Player.GetPlayer("SpyPlaneProvider") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = Utils.Where({ Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 }, function(p) return p ~= nil end) + MissionEnemies = { Nod, ScrinRebels, MaleficScrin } + SinglePlayerPlayer = USSR + CoopInit() +end + +AfterWorldLoaded = function() + local TeslaPlants = USSR.GetActorsByType("tpwr") + + if #MissionPlayers >= 2 then + TeslaPlants[1].Owner = MissionPlayers[2] + Actor1724.Owner = MissionPlayers[2] + Actor820.Owner = MissionPlayers[2] + end + if #MissionPlayers >= 3 then + TeslaPlants[2].Owner = MissionPlayers[3] + Actor1803.Owner = MissionPlayers[3] + Actor821.Owner = MissionPlayers[3] + end + if #MissionPlayers >= 4 then + TeslaPlants[3].Owner = MissionPlayers[4] + Actor1610.Owner = MissionPlayers[4] + Actor822.Owner = MissionPlayers[4] + Actor823.Owner = MissionPlayers[4] + end + if #MissionPlayers >= 5 then + TeslaPlants[4].Owner = MissionPlayers[5] + Actor1846.Owner = MissionPlayers[5] + Actor823.Owner = MissionPlayers[5] + end + if #MissionPlayers >= 6 then + TeslaPlants[5].Owner = MissionPlayers[6] + Actor1611.Owner = MissionPlayers[6] + end + + TransferBaseToPlayer(SinglePlayerPlayer, GetFirstActivePlayer()) + StartCashSpread(3500) +end + +AfterTick = function() + +end + +TransferExterminator = function() + Exterminator.Owner = GetFirstActivePlayer() +end + +DoMcvArrival = function() + local delay = 0 + Utils.Do(GetMcvPlayers(), function(p) + Trigger.AfterDelay(delay, function() + Reinforcements.Reinforce(p, { "mcv" }, { McvSpawn.Location, McvDest.Location }) + end) + delay = delay + DateTime.Seconds(1) + end) +end diff --git a/mods/ca/missions/coop-campaign/ca43-dissection-coop/dissection-coop-rules.yaml b/mods/ca/missions/coop-campaign/ca43-dissection-coop/dissection-coop-rules.yaml new file mode 100644 index 0000000000..28bca197d4 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca43-dissection-coop/dissection-coop-rules.yaml @@ -0,0 +1,6 @@ +World: + LuaScript: + Scripts: campaign.lua, coop.lua, ca|missions/main-campaign/ca43-dissection/dissection.lua, dissection-coop.lua + LobbyMissionInfo@InitialObjectives: + Prefix: Initial Objectives + Text: • Eliminate all Soviet forces.\n• [Optional] Eliminate Soviet Radar Domes to disrupt bombing runs. diff --git a/mods/ca/missions/coop-campaign/ca43-dissection-coop/dissection-coop.lua b/mods/ca/missions/coop-campaign/ca43-dissection-coop/dissection-coop.lua new file mode 100644 index 0000000000..333fe4539b --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca43-dissection-coop/dissection-coop.lua @@ -0,0 +1,123 @@ + +SideAssumedControl = {} + +SetupPlayers = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Multi2 = Player.GetPlayer("Multi2") + Multi3 = Player.GetPlayer("Multi3") + Multi4 = Player.GetPlayer("Multi4") + Multi5 = Player.GetPlayer("Multi5") + Greece = Player.GetPlayer("Greece") + USSR = Player.GetPlayer("USSR") + Scrin = Player.GetPlayer("Scrin") + England = Player.GetPlayer("England") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = Utils.Where({ Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 }, function(p) return p ~= nil end) + MissionEnemies = { USSR } + SinglePlayerPlayer = Greece + CoopInit() +end + +AfterWorldLoaded = function() + StartCashSpread(3500) +end + +AfterTick = function() + +end + +DoMcvArrival = function() + local entryPoints = { + CPos.New(37, 160), + CPos.New(94, 160), + CPos.New(39, 160), + CPos.New(92, 160), + CPos.New(41, 160), + CPos.New(90, 160), + } + + local i = 1 + local mcvPlayers = GetMcvPlayers() + + if #mcvPlayers == 1 and #MissionPlayers > 1 then + table.insert(mcvPlayers, MissionPlayers[2]) + end + + Utils.Do(MissionPlayers, function(p) + local isMcvPlayer = Utils.Any(mcvPlayers, function(mcvPlayer) return p == mcvPlayer end) + local entryPoint = entryPoints[i] + + if #mcvPlayers == 1 and isMcvPlayer then + entryPoint = ReinforcementSpawn.Location + end + + local transport = Actor.Create("lst", true, { Owner = p, Location = entryPoint }) + + if isMcvPlayer then + local mcv = Actor.Create("mcv", false, { Owner = p }) + transport.LoadPassenger(mcv) + end + + local tank = Actor.Create("2tnk", false, { Owner = p }) + transport.LoadPassenger(tank) + + if #mcvPlayers < 4 then + local jeep = Actor.Create("jeep", false, { Owner = p }) + transport.LoadPassenger(jeep) + + if #mcvPlayers < 3 then + local arty = Actor.Create("arty", false, { Owner = p }) + transport.LoadPassenger(arty) + end + + if #mcvPlayers < 2 then + local tank2 = Actor.Create("2tnk", false, { Owner = p }) + transport.LoadPassenger(tank2) + end + end + + transport.Move(CPos.New(entryPoint.X, 151)) + i = i + 1 + + if p.IsLocalPlayer then + Camera.Position = transport.CenterPosition + end + end) +end + +AssumeControl = function(player, side) + AssumedControl = true + + if SideAssumedControl[side] then + return + end + + SideAssumedControl[side] = true + + if player.IsLocalPlayer then + Notification("Command transfer complete.") + MediaCA.PlaySound(MissionDir .. "/r_transfer.aud", 2) + end + + Trigger.AfterDelay(DateTime.Seconds(2), function() + DestroyFlares() + local actorsToFlip = Utils.Where(England.GetActors(), function(a) return a.HasProperty("Health") and a.Type ~= "player" end) + + if side == "west" then + actorsToFlip = Utils.Where(actorsToFlip, function(a) return a.Location.X < 60 end) + else + actorsToFlip = Utils.Where(actorsToFlip, function(a) return a.Location.X > 90 end) + end + + Utils.Do(actorsToFlip, function(a) + if a.HasProperty("Move") and not IsHarvester(a) then + a.Owner = Greece + else + a.Owner = player + end + end) + + CACoopQueueSyncer() + end) +end diff --git a/mods/ca/missions/coop-campaign/ca43-dissection-coop/map.bin b/mods/ca/missions/coop-campaign/ca43-dissection-coop/map.bin new file mode 100644 index 0000000000..82be27e988 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca43-dissection-coop/map.bin differ diff --git a/mods/ca/missions/coop-campaign/ca43-dissection-coop/map.png b/mods/ca/missions/coop-campaign/ca43-dissection-coop/map.png new file mode 100644 index 0000000000..50fd7c2366 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca43-dissection-coop/map.png differ diff --git a/mods/ca/missions/coop-campaign/ca43-dissection-coop/map.yaml b/mods/ca/missions/coop-campaign/ca43-dissection-coop/map.yaml new file mode 100644 index 0000000000..0a749cf91e --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca43-dissection-coop/map.yaml @@ -0,0 +1,4221 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 43: Dissection Co-op + +Author: Darkademic & Gandorques Hikla + +Tileset: DESERT + +MapSize: 142,162 + +Bounds: 1,1,140,160 + +Visibility: Lobby + +Categories: Co-op Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: Greece, England, USSR, Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + PlayerReference@Greece: + Name: Greece + Faction: allies + Color: 99ACF2 + Allies: England, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Scrin, Creeps + PlayerReference@USSR: + Name: USSR + Bot: campaign + Faction: soviet + Color: FE1100 + Allies: Scrin + Enemies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, England, Creeps + PlayerReference@Scrin: + Name: Scrin + Bot: campaign + Faction: scrin + Color: 7700FF + Allies: USSR + Enemies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, England, Creeps + PlayerReference@England: + Name: England + Faction: allies + Color: A1EF8C + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Scrin, Creeps + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 99ACF2 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, England + Enemies: USSR, Scrin, Creeps + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 0B7310 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, England + Enemies: USSR, Scrin, Creeps + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 134691 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, England + Enemies: USSR, Scrin, Creeps + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 775A12 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, England + Enemies: USSR, Scrin, Creeps + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 994050 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, England + Enemies: USSR, Scrin, Creeps + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: EEA8A8 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, England + Enemies: USSR, Scrin, Creeps + +Actors: + Actor1: 2x2searocks2 + Owner: Neutral + Location: 91,143 + Actor2: 2x2searocks4 + Owner: Neutral + Location: 30,146 + Actor3: 2x2searocks1 + Owner: Neutral + Location: 61,149 + Actor4: mt2 + Owner: Neutral + Location: 32,94 + Actor5: mt1 + Owner: Neutral + Location: 127,107 + Actor6: 1x1searocks2 + Owner: Neutral + Location: 110,147 + Actor7: 1x1searocks3 + Owner: Neutral + Location: 132,145 + Actor8: temple + Owner: Neutral + Location: 16,93 + Actor9: 2x2rocks4 + Owner: Neutral + Location: 103,89 + Actor10: 2x1ruins2 + Owner: Neutral + Location: 24,90 + Actor11: 1x1ruins7 + Owner: Neutral + Location: 34,93 + Actor12: 1x1ruins1 + Owner: Neutral + Location: 5,88 + Actor13: 2x1stones2 + Owner: Neutral + Location: 18,96 + Actor14: tgd2 + Owner: Neutral + Location: 16,112 + Actor15: tgb + Owner: Neutral + Location: 47,108 + Actor16: tgc1 + Owner: Neutral + Location: 45,105 + Actor17: tree3 + Owner: Neutral + Location: 61,131 + Actor19: tree4 + Owner: Neutral + Location: 26,126 + Actor20: tgc2 + Owner: Neutral + Location: 35,122 + Actor21: tg2 + Owner: Neutral + Location: 37,124 + Actor23: tgb + Owner: Neutral + Location: 102,124 + Actor24: tgc1 + Owner: Neutral + Location: 130,124 + Actor25: tgd2 + Owner: Neutral + Location: 100,99 + Actor26: tgc2 + Owner: Neutral + Location: 102,96 + Actor27: terroristhouse + Owner: Neutral + Location: 129,133 + Actor28: mebld3b + Owner: Neutral + Location: 9,125 + Actor29: mebld6 + Owner: Neutral + Location: 21,122 + Actor30: mebld5a + Owner: Neutral + Location: 5,125 + Actor31: mebld5d + Owner: Neutral + Location: 22,127 + Actor32: mebld3c + Owner: Neutral + Location: 34,99 + Actor33: mebld1a + Owner: Neutral + Location: 27,93 + Actor34: mebld1b + Owner: Neutral + Location: 9,86 + Actor35: mebld4c + Owner: Neutral + Location: 37,131 + Actor36: tree3 + Owner: Neutral + Location: 38,130 + Actor38: tree5 + Owner: Neutral + Location: 17,124 + Actor37: tree3 + Owner: Neutral + Location: 8,124 + Actor39: tree3 + Owner: Neutral + Location: 23,121 + Actor40: cypr1 + Owner: Neutral + Location: 4,123 + Actor41: cypr2 + Owner: Neutral + Location: 29,119 + Actor42: rock5 + Owner: Neutral + Location: 52,130 + Actor43: mebld5c + Owner: Neutral + Location: 55,133 + Actor44: mebld4b + Owner: Neutral + Location: 45,129 + Actor45: mebld4b + Owner: Neutral + Location: 18,88 + Actor46: mebld1a + Owner: Neutral + Location: 29,60 + Actor47: mebld3c + Owner: Neutral + Location: 119,100 + Actor48: mebld2 + Owner: Neutral + Location: 122,98 + Actor49: mebld3a + Owner: Neutral + Location: 113,94 + Actor50: mebld5b + Owner: Neutral + Location: 124,134 + Actor51: mebld5c + Owner: Neutral + Location: 139,131 + Actor52: mebld1a + Owner: Neutral + Location: 106,130 + Actor55: mebld4c + Owner: Neutral + Location: 92,130 + Actor56: mebld1a + Owner: Neutral + Location: 88,130 + Actor57: mebld5b + Owner: Neutral + Location: 98,127 + Actor58: tree3 + Owner: Neutral + Location: 98,129 + Actor59: tree4 + Owner: Neutral + Location: 90,128 + Actor60: tree2 + Owner: Neutral + Location: 112,129 + Actor61: tree5 + Owner: Neutral + Location: 125,132 + Actor62: tg1 + Owner: Neutral + Location: 105,129 + Actor64: tree1 + Owner: Neutral + Location: 127,133 + Actor65: cypr2 + Owner: Neutral + Location: 137,129 + Actor66: tg2 + Owner: Neutral + Location: 133,136 + Actor22: tree2 + Owner: Neutral + Location: 18,134 + Actor67: v17 + Owner: Neutral + Location: 85,142 + Actor54: mebld4b + Owner: Neutral + Location: 119,136 + Actor53: mebld2 + Owner: Neutral + Location: 102,133 + Actor63: tree5 + Owner: Neutral + Location: 101,132 + Actor68: v23 + Owner: Neutral + Location: 107,130 + Actor69: v10 + Owner: Neutral + Location: 6,67 + Actor70: v22 + Owner: Neutral + Location: 9,63 + Actor71: grtilled0 + Owner: Neutral + Location: 9,64 + Actor72: grtilled2 + Owner: Neutral + Location: 6,68 + Actor73: grtilled1 + Owner: Neutral + Location: 8,60 + Actor74: grtilled0 + Owner: Neutral + Location: 9,53 + Actor75: 1x1ruins1 + Owner: Neutral + Location: 35,62 + Actor76: 2x1ruins2 + Owner: Neutral + Location: 53,66 + Actor77: 2x1ruins1 + Owner: Neutral + Location: 67,49 + Actor78: 1x1ruins3 + Owner: Neutral + Location: 69,40 + Actor79: 1x1ruins5 + Owner: Neutral + Location: 68,60 + Actor80: 1x1ruins7 + Owner: Neutral + Location: 72,69 + Actor81: 1x1ruins8 + Owner: Neutral + Location: 71,73 + Actor82: 1x1ruins9 + Owner: Neutral + Location: 71,81 + Actor83: 2x1ruins2 + Owner: Neutral + Location: 77,86 + Actor84: 2x1stones3 + Owner: Neutral + Location: 76,95 + Actor85: 2x2rocks1 + Owner: Neutral + Location: 76,92 + Actor86: 2x2rocks2 + Owner: Neutral + Location: 7,46 + Actor87: 2x2rocks1 + Owner: Neutral + Location: 131,34 + Actor88: tgd + Owner: Neutral + Location: 12,58 + Actor89: tgb + Owner: Neutral + Location: 113,73 + Actor90: tgc2 + Owner: Neutral + Location: 112,65 + Actor91: cypr2 + Owner: Neutral + Location: 103,67 + Actor93: tg1 + Owner: Neutral + Location: 113,67 + Actor92: tgc1 + Owner: Neutral + Location: 136,64 + Actor94: tree5 + Owner: Neutral + Location: 115,53 + Actor95: tree4 + Owner: Neutral + Location: 122,41 + Actor96: tree6 + Owner: Neutral + Location: 33,43 + Actor97: tree2 + Owner: Neutral + Location: 29,51 + Actor98: tgc2 + Owner: Neutral + Location: 26,47 + Actor99: tree2 + Owner: Neutral + Location: 8,58 + Actor100: tree2 + Owner: Neutral + Location: 9,68 + Actor102: 1x2stones2 + Owner: Neutral + Location: 34,61 + Actor103: grtilled1 + Owner: Neutral + Location: 131,58 + Actor104: grtilled2 + Owner: Neutral + Location: 135,68 + Actor105: grtilled0 + Owner: Neutral + Location: 130,64 + Actor106: mebld1a + Owner: Neutral + Location: 132,63 + Actor107: mebld5b + Owner: Neutral + Location: 132,57 + Actor108: v23 + Owner: Neutral + Location: 131,63 + Actor109: wood + Owner: Neutral + Location: 133,63 + Actor110: wood + Owner: Neutral + Location: 133,64 + Actor111: wood + Owner: Neutral + Location: 133,65 + Actor112: wood + Owner: Neutral + Location: 133,66 + Actor113: wood + Owner: Neutral + Location: 132,66 + Actor114: wood + Owner: Neutral + Location: 133,62 + Actor115: wood + Owner: Neutral + Location: 132,62 + Actor116: wood + Owner: Neutral + Location: 136,67 + Actor117: wood + Owner: Neutral + Location: 137,67 + Actor118: wood + Owner: Neutral + Location: 137,69 + Actor119: wood + Owner: Neutral + Location: 137,68 + Actor120: wood + Owner: Neutral + Location: 137,70 + Actor121: wood + Owner: Neutral + Location: 135,67 + Actor122: wood + Owner: Neutral + Location: 135,66 + Actor123: wood + Owner: Neutral + Location: 134,66 + Actor124: wood + Owner: Neutral + Location: 137,71 + Actor125: wood + Owner: Neutral + Location: 136,71 + Actor126: wood + Owner: Neutral + Location: 135,71 + Actor127: wood + Owner: Neutral + Location: 133,56 + Actor128: wood + Owner: Neutral + Location: 133,57 + Actor129: wood + Owner: Neutral + Location: 133,58 + Actor130: wood + Owner: Neutral + Location: 133,59 + Actor131: wood + Owner: Neutral + Location: 133,60 + Actor132: wood + Owner: Neutral + Location: 132,60 + Actor133: wood + Owner: Neutral + Location: 131,60 + Actor134: wood + Owner: Neutral + Location: 132,56 + Actor135: wood + Owner: Neutral + Location: 131,56 + Actor136: wood + Owner: Neutral + Location: 8,62 + Actor137: wood + Owner: Neutral + Location: 9,62 + Actor138: wood + Owner: Neutral + Location: 7,62 + Actor139: wood + Owner: Neutral + Location: 7,61 + Actor140: wood + Owner: Neutral + Location: 8,63 + Actor141: wood + Owner: Neutral + Location: 8,64 + Actor142: wood + Owner: Neutral + Location: 8,65 + Actor143: wood + Owner: Neutral + Location: 6,66 + Actor144: wood + Owner: Neutral + Location: 6,65 + Actor145: wood + Owner: Neutral + Location: 7,65 + Actor146: wood + Owner: Neutral + Location: 5,66 + Actor147: wood + Owner: Neutral + Location: 5,67 + Actor148: wood + Owner: Neutral + Location: 5,68 + Actor149: wood + Owner: Neutral + Location: 5,69 + Actor150: wood + Owner: Neutral + Location: 5,70 + Actor151: wood + Owner: Neutral + Location: 8,66 + Actor152: wood + Owner: Neutral + Location: 9,66 + Actor153: wood + Owner: Neutral + Location: 11,66 + Actor154: wood + Owner: Neutral + Location: 10,66 + Actor155: wood + Owner: Neutral + Location: 9,52 + Actor156: wood + Owner: Neutral + Location: 10,52 + Actor157: wood + Owner: Neutral + Location: 11,52 + Actor158: wood + Owner: Neutral + Location: 12,52 + Actor159: wood + Owner: Neutral + Location: 13,52 + Actor160: wood + Owner: Neutral + Location: 14,52 + Actor161: wood + Owner: Neutral + Location: 14,53 + Actor162: wood + Owner: Neutral + Location: 6,71 + Actor163: wood + Owner: Neutral + Location: 5,71 + Actor164: wood + Owner: Neutral + Location: 7,71 + Actor165: mebld5a + Owner: Neutral + Location: 12,53 + Actor166: mebld6 + Owner: Neutral + Location: 23,54 + Actor167: tgc1 + Owner: Neutral + Location: 15,51 + Actor168: tgd2 + Owner: Neutral + Location: 4,39 + Actor169: tgc2 + Owner: Neutral + Location: 16,23 + Actor170: tc04 + Owner: Neutral + Location: 31,29 + Actor171: t06 + Owner: Neutral + Location: 32,28 + Actor172: t06 + Owner: Neutral + Location: 33,25 + Actor173: t07 + Owner: Neutral + Location: 34,33 + Actor174: tc05 + Owner: Neutral + Location: 34,21 + Actor175: t16 + Owner: Neutral + Location: 30,25 + Actor176: t06 + Owner: Neutral + Location: 77,17 + Actor177: t02 + Owner: Neutral + Location: 115,18 + Actor178: t16 + Owner: Neutral + Location: 110,12 + Actor179: tc04 + Owner: Neutral + Location: 113,20 + Actor180: t15 + Owner: Neutral + Location: 116,52 + Actor181: t14 + Owner: Neutral + Location: 126,22 + Actor183: t06 + Owner: Neutral + Location: 133,33 + Actor184: tc04 + Owner: Neutral + Location: 132,53 + Actor185: tgb + Owner: Neutral + Location: 134,50 + Actor186: tree4 + Owner: Neutral + Location: 135,47 + Actor187: tree5 + Owner: Neutral + Location: 106,32 + Actor188: tgc1 + Owner: Neutral + Location: 136,92 + Actor189: tgd + Owner: Neutral + Location: 127,102 + Actor190: tree3 + Owner: Neutral + Location: 122,96 + Actor191: tree2 + Owner: Neutral + Location: 113,92 + Actor192: tree5 + Owner: Neutral + Location: 116,99 + Actor193: tree5 + Owner: Neutral + Location: 20,87 + Actor194: tree1 + Owner: Neutral + Location: 28,94 + Actor195: tree3 + Owner: Neutral + Location: 7,86 + Actor196: tree2 + Owner: Neutral + Location: 36,97 + Actor197: tree6 + Owner: Neutral + Location: 19,97 + Actor198: tgc1 + Owner: Neutral + Location: 11,98 + Actor199: tgb + Owner: Neutral + Location: 13,110 + Actor200: tgc2 + Owner: Neutral + Location: 16,110 + Actor201: cypr2 + Owner: Neutral + Location: 12,110 + Actor202: cypr1 + Owner: Neutral + Location: 17,110 + Actor203: cypr2 + Owner: Neutral + Location: 18,109 + Actor204: tree5 + Owner: Neutral + Location: 14,109 + Actor205: tree4 + Owner: Neutral + Location: 12,113 + Actor206: tg1 + Owner: Neutral + Location: 19,113 + Actor207: tree3 + Owner: Neutral + Location: 10,112 + Actor208: t12 + Owner: Neutral + Location: 50,104 + Actor209: t13 + Owner: Neutral + Location: 84,117 + Actor210: tc05 + Owner: Neutral + Location: 116,121 + Actor211: rock3 + Owner: Neutral + Location: 95,116 + Actor212: rock6 + Owner: Neutral + Location: 133,81 + Actor213: t14 + Owner: Neutral + Location: 132,68 + Actor214: t06 + Owner: Neutral + Location: 107,41 + Actor215: tc03 + Owner: Neutral + Location: 15,57 + Actor216: t03 + Owner: Neutral + Location: 14,57 + Actor217: t06 + Owner: Neutral + Location: 30,60 + Actor218: t02 + Owner: Neutral + Location: 40,56 + Actor219: t02 + Owner: Neutral + Location: 68,67 + Actor220: t11 + Owner: Neutral + Location: 86,50 + Actor221: t16 + Owner: Neutral + Location: 55,39 + Actor222: v25 + Owner: Neutral + Location: 133,45 + Actor223: v25 + Owner: Neutral + Location: 18,20 + Actor225: v22 + Owner: Neutral + Location: 15,33 + Actor224: t13 + Owner: Neutral + Location: 5,19 + Actor226: tgb + Owner: Neutral + Location: 88,23 + Actor227: tgc2 + Owner: Neutral + Location: 69,35 + Actor228: 2x1ruins2 + Owner: Neutral + Location: 71,30 + Actor229: 1x1ruins6 + Owner: Neutral + Location: 68,22 + Actor230: 1x1ruins7 + Owner: Neutral + Location: 64,32 + Actor231: mebld5b + Owner: Neutral + Location: 134,31 + Actor232: mebld5c + Owner: Neutral + Location: 128,54 + Actor233: brik + Owner: USSR + Location: 51,91 + Actor234: brik + Owner: USSR + Location: 49,90 + Actor235: brik + Owner: USSR + Location: 49,91 + Actor236: brik + Owner: USSR + Location: 48,90 + Actor237: brik + Owner: USSR + Location: 48,91 + Actor238: brik + Owner: USSR + Location: 50,91 + Actor239: brik + Owner: USSR + Location: 52,91 + Actor240: brik + Owner: USSR + Location: 52,92 + Actor241: brik + Owner: USSR + Location: 52,93 + Actor242: brik + Owner: USSR + Location: 53,93 + Actor243: brik + Owner: USSR + Location: 53,92 + Actor244: brik + Owner: USSR + Location: 52,97 + Actor245: brik + Owner: USSR + Location: 53,97 + Actor246: brik + Owner: USSR + Location: 52,98 + Actor247: brik + Owner: USSR + Location: 53,98 + Actor248: brik + Owner: USSR + Location: 52,99 + Actor249: brik + Owner: USSR + Location: 52,100 + Actor250: brik + Owner: USSR + Location: 52,101 + Actor251: brik + Owner: USSR + Location: 53,101 + Actor252: brik + Owner: USSR + Location: 53,100 + Actor253: brik + Owner: USSR + Location: 84,104 + Actor254: brik + Owner: USSR + Location: 84,105 + Actor255: brik + Owner: USSR + Location: 85,105 + Actor256: brik + Owner: USSR + Location: 85,104 + Actor257: brik + Owner: USSR + Location: 90,104 + Actor258: brik + Owner: USSR + Location: 89,104 + Actor259: brik + Owner: USSR + Location: 89,105 + Actor260: brik + Owner: USSR + Location: 90,105 + Actor261: brik + Owner: USSR + Location: 90,103 + Actor262: brik + Owner: USSR + Location: 90,102 + Actor263: brik + Owner: USSR + Location: 92,102 + Actor264: brik + Owner: USSR + Location: 91,102 + Actor265: brik + Owner: USSR + Location: 93,102 + Actor268: brik + Owner: USSR + Location: 91,93 + Actor269: brik + Owner: USSR + Location: 91,94 + Actor270: brik + Owner: USSR + Location: 90,94 + Actor271: brik + Owner: USSR + Location: 90,93 + Actor272: brik + Owner: USSR + Location: 90,92 + Actor273: brik + Owner: USSR + Location: 89,92 + Actor274: brik + Owner: USSR + Location: 88,92 + Actor275: brik + Owner: USSR + Location: 87,92 + Actor276: brik + Owner: USSR + Location: 87,91 + Actor277: brik + Owner: USSR + Location: 87,90 + Actor278: brik + Owner: USSR + Location: 86,90 + Actor279: brik + Owner: USSR + Location: 86,91 + Actor281: brik + Owner: USSR + Location: 93,99 + Actor283: brik + Owner: USSR + Location: 93,100 + Actor284: brik + Owner: USSR + Location: 94,102 + Actor285: brik + Owner: USSR + Location: 94,101 + Actor286: brik + Owner: USSR + Location: 94,100 + Actor287: brik + Owner: USSR + Location: 94,99 + Actor325: fact + Owner: USSR + Location: 69,75 + Actor372: brik + Owner: USSR + Location: 65,103 + Actor373: brik + Owner: USSR + Location: 65,104 + Actor374: brik + Owner: USSR + Location: 64,104 + Actor375: brik + Owner: USSR + Location: 64,103 + Actor376: brik + Owner: USSR + Location: 62,104 + Actor377: brik + Owner: USSR + Location: 63,104 + Actor378: brik + Owner: USSR + Location: 61,104 + Actor379: brik + Owner: USSR + Location: 60,104 + Actor380: brik + Owner: USSR + Location: 59,104 + Actor381: brik + Owner: USSR + Location: 58,104 + Actor382: brik + Owner: USSR + Location: 57,104 + Actor383: brik + Owner: USSR + Location: 56,104 + Actor384: brik + Owner: USSR + Location: 56,103 + Actor385: brik + Owner: USSR + Location: 56,102 + Actor386: brik + Owner: USSR + Location: 56,101 + Actor387: brik + Owner: USSR + Location: 57,103 + Actor388: brik + Owner: USSR + Location: 57,101 + Actor389: brik + Owner: USSR + Location: 56,100 + Actor390: brik + Owner: USSR + Location: 57,100 + Actor391: brik + Owner: USSR + Location: 70,103 + Actor392: brik + Owner: USSR + Location: 70,104 + Actor393: brik + Owner: USSR + Location: 69,103 + Actor394: brik + Owner: USSR + Location: 69,104 + Actor395: brik + Owner: USSR + Location: 71,104 + Actor396: brik + Owner: USSR + Location: 72,104 + Actor397: brik + Owner: USSR + Location: 73,104 + Actor398: brik + Owner: USSR + Location: 74,104 + Actor399: brik + Owner: USSR + Location: 75,104 + Actor400: brik + Owner: USSR + Location: 76,104 + Actor401: brik + Owner: USSR + Location: 77,104 + Actor402: brik + Owner: USSR + Location: 78,104 + Actor403: brik + Owner: USSR + Location: 79,104 + Actor404: brik + Owner: USSR + Location: 80,104 + Actor405: brik + Owner: USSR + Location: 81,104 + Actor406: brik + Owner: USSR + Location: 81,103 + Actor407: brik + Owner: USSR + Location: 80,103 + Actor408: brik + Owner: USSR + Location: 81,102 + Actor409: brik + Owner: USSR + Location: 81,101 + Actor410: brik + Owner: USSR + Location: 81,100 + Actor411: brik + Owner: USSR + Location: 82,100 + Actor412: brik + Owner: USSR + Location: 82,99 + Actor413: brik + Owner: USSR + Location: 81,99 + Actor414: ftur + Owner: USSR + Location: 51,97 + Actor415: ftur + Owner: USSR + Location: 51,93 + Actor416: ftur + Owner: USSR + Location: 92,94 + Actor417: ftur + Owner: USSR + Location: 94,98 + Actor418: ftur + Owner: USSR + Location: 69,105 + Actor419: ftur + Owner: USSR + Location: 65,105 + Actor420: ftur + Owner: USSR + Location: 85,106 + Actor421: ftur + Owner: USSR + Location: 89,106 + Actor422: ftur + Owner: USSR + Location: 58,125 + Actor423: ftur + Owner: USSR + Location: 62,129 + Actor424: ftur + Owner: USSR + Location: 74,130 + Actor425: ftur + Owner: USSR + Location: 77,125 + Actor426: fenc + Owner: USSR + Location: 59,124 + Actor427: fenc + Owner: USSR + Location: 59,123 + Actor428: fenc + Owner: USSR + Location: 58,123 + Actor429: fenc + Owner: USSR + Location: 58,124 + Actor430: fenc + Owner: USSR + Location: 58,122 + Actor431: fenc + Owner: USSR + Location: 58,121 + Actor432: fenc + Owner: USSR + Location: 57,121 + Actor433: fenc + Owner: USSR + Location: 57,122 + Actor434: fenc + Owner: USSR + Location: 63,128 + Actor435: fenc + Owner: USSR + Location: 63,129 + Actor436: fenc + Owner: USSR + Location: 64,129 + Actor437: fenc + Owner: USSR + Location: 64,128 + Actor438: fenc + Owner: USSR + Location: 65,129 + Actor439: fenc + Owner: USSR + Location: 66,129 + Actor440: fenc + Owner: USSR + Location: 66,130 + Actor441: fenc + Owner: USSR + Location: 67,130 + Actor442: fenc + Owner: USSR + Location: 68,130 + Actor443: fenc + Owner: USSR + Location: 69,130 + Actor444: fenc + Owner: USSR + Location: 69,131 + Actor445: fenc + Owner: USSR + Location: 70,130 + Actor446: fenc + Owner: USSR + Location: 70,131 + Actor448: fenc + Owner: USSR + Location: 71,130 + Actor447: fenc + Owner: USSR + Location: 72,130 + Actor449: fenc + Owner: USSR + Location: 72,129 + Actor450: fenc + Owner: USSR + Location: 73,129 + Actor451: fenc + Owner: USSR + Location: 73,130 + Actor452: fenc + Owner: USSR + Location: 76,121 + Actor453: fenc + Owner: USSR + Location: 75,121 + Actor454: fenc + Owner: USSR + Location: 75,120 + Actor455: fenc + Owner: USSR + Location: 76,120 + Actor456: fenc + Owner: USSR + Location: 74,121 + Actor457: fenc + Owner: USSR + Location: 74,122 + Actor458: fenc + Owner: USSR + Location: 74,123 + Actor459: fenc + Owner: USSR + Location: 74,124 + Actor460: fenc + Owner: USSR + Location: 75,124 + Actor461: fenc + Owner: USSR + Location: 76,124 + Actor462: fenc + Owner: USSR + Location: 76,125 + Actor463: fenc + Owner: USSR + Location: 75,125 + Actor464: fenc + Owner: USSR + Location: 80,122 + Actor465: fenc + Owner: USSR + Location: 81,122 + Actor466: fenc + Owner: USSR + Location: 81,121 + Actor467: fenc + Owner: USSR + Location: 82,121 + Actor468: fenc + Owner: USSR + Location: 83,121 + Actor469: fenc + Owner: USSR + Location: 79,122 + Actor470: fenc + Owner: USSR + Location: 68,117 + Actor471: fenc + Owner: USSR + Location: 69,117 + Actor472: fenc + Owner: USSR + Location: 68,116 + Actor473: fenc + Owner: USSR + Location: 68,115 + Actor474: fenc + Owner: USSR + Location: 67,115 + Actor475: fenc + Owner: USSR + Location: 71,117 + Actor476: fenc + Owner: USSR + Location: 70,117 + Actor477: fenc + Owner: USSR + Location: 63,116 + Actor478: fenc + Owner: USSR + Location: 62,116 + Actor479: fenc + Owner: USSR + Location: 60,116 + Actor480: fenc + Owner: USSR + Location: 61,116 + Actor481: fenc + Owner: USSR + Location: 60,115 + Actor482: fenc + Owner: USSR + Location: 60,114 + Actor483: fenc + Owner: USSR + Location: 59,114 + Actor484: fenc + Owner: USSR + Location: 74,116 + Actor485: fenc + Owner: USSR + Location: 72,117 + Actor486: fenc + Owner: USSR + Location: 74,117 + Actor487: fenc + Owner: USSR + Location: 73,117 + Actor488: fenc + Owner: USSR + Location: 74,115 + Actor489: fenc + Owner: USSR + Location: 75,115 + Actor490: fenc + Owner: USSR + Location: 77,115 + Actor491: fenc + Owner: USSR + Location: 76,114 + Actor492: fenc + Owner: USSR + Location: 76,115 + Actor493: fenc + Owner: USSR + Location: 76,113 + Actor494: fenc + Owner: USSR + Location: 77,113 + Actor495: fenc + Owner: USSR + Location: 78,113 + Actor496: tsla + Owner: USSR + Location: 63,103 + Actor497: tsla + Owner: USSR + Location: 71,103 + Actor499: tsla + Owner: USSR + Location: 89,103 + Actor500: tsla + Owner: USSR + Location: 84,103 + ScriptTags: HardAndAbove + Actor498: tsla + Owner: USSR + Location: 93,101 + ScriptTags: HardAndAbove + Actor501: tsla + Owner: USSR + Location: 89,93 + Actor502: tsla + Owner: USSR + Location: 53,91 + Actor503: tsla + Owner: USSR + Location: 53,99 + Actor504: sam + Owner: USSR + Location: 58,102 + Actor505: sam + Owner: USSR + Location: 78,102 + Actor506: sam + Owner: USSR + Location: 86,93 + Actor507: sam + Owner: USSR + Location: 90,101 + Actor508: sam + Owner: USSR + Location: 54,90 + Actor510: barr + Owner: USSR + Location: 81,93 + Actor511: proc + Owner: USSR + Location: 82,59 + Actor512: brik + Owner: USSR + Location: 89,61 + Actor513: brik + Owner: USSR + Location: 89,62 + Actor514: brik + Owner: USSR + Location: 89,63 + Actor515: brik + Owner: USSR + Location: 88,63 + Actor516: brik + Owner: USSR + Location: 88,62 + Actor517: brik + Owner: USSR + Location: 90,61 + Actor518: brik + Owner: USSR + Location: 91,61 + Actor519: brik + Owner: USSR + Location: 90,60 + Actor520: brik + Owner: USSR + Location: 91,60 + Actor521: brik + Owner: USSR + Location: 81,70 + Actor522: brik + Owner: USSR + Location: 83,70 + Actor523: brik + Owner: USSR + Location: 82,70 + Actor524: brik + Owner: USSR + Location: 85,70 + Actor525: brik + Owner: USSR + Location: 84,70 + Actor526: brik + Owner: USSR + Location: 86,70 + Actor527: brik + Owner: USSR + Location: 86,68 + Actor528: brik + Owner: USSR + Location: 86,69 + Actor529: brik + Owner: USSR + Location: 81,69 + Actor530: brik + Owner: USSR + Location: 82,69 + Actor531: brik + Owner: USSR + Location: 86,67 + Actor532: brik + Owner: USSR + Location: 85,67 + Actor533: brik + Owner: USSR + Location: 85,68 + Actor534: brik + Owner: USSR + Location: 57,64 + Actor535: brik + Owner: USSR + Location: 57,63 + Actor536: brik + Owner: USSR + Location: 57,62 + Actor537: brik + Owner: USSR + Location: 58,64 + Actor538: brik + Owner: USSR + Location: 58,63 + Actor539: brik + Owner: USSR + Location: 59,68 + Actor540: brik + Owner: USSR + Location: 59,69 + Actor541: brik + Owner: USSR + Location: 60,68 + Actor542: brik + Owner: USSR + Location: 60,69 + Actor543: brik + Owner: USSR + Location: 59,70 + Actor544: brik + Owner: USSR + Location: 59,71 + Actor545: brik + Owner: USSR + Location: 61,71 + Actor546: brik + Owner: USSR + Location: 60,71 + Actor547: brik + Owner: USSR + Location: 62,71 + Actor548: brik + Owner: USSR + Location: 62,72 + Actor549: brik + Owner: USSR + Location: 62,73 + Actor550: brik + Owner: USSR + Location: 63,73 + Actor551: brik + Owner: USSR + Location: 63,74 + Actor552: brik + Owner: USSR + Location: 63,75 + Actor553: brik + Owner: USSR + Location: 64,75 + Actor554: brik + Owner: USSR + Location: 64,74 + Actor555: brik + Owner: USSR + Location: 58,62 + Actor556: brik + Owner: USSR + Location: 58,61 + Actor557: brik + Owner: USSR + Location: 59,61 + Actor558: brik + Owner: USSR + Location: 59,60 + Actor559: brik + Owner: USSR + Location: 59,59 + Actor560: brik + Owner: USSR + Location: 59,58 + Actor561: brik + Owner: USSR + Location: 59,57 + Actor562: brik + Owner: USSR + Location: 60,57 + Actor563: brik + Owner: USSR + Location: 60,58 + Actor564: brik + Owner: USSR + Location: 55,27 + Actor565: brik + Owner: USSR + Location: 55,28 + Actor566: brik + Owner: USSR + Location: 56,28 + Actor567: brik + Owner: USSR + Location: 56,27 + Actor568: brik + Owner: USSR + Location: 57,34 + Actor569: brik + Owner: USSR + Location: 56,34 + Actor570: brik + Owner: USSR + Location: 56,33 + Actor571: brik + Owner: USSR + Location: 57,33 + Actor572: brik + Owner: USSR + Location: 58,34 + Actor573: brik + Owner: USSR + Location: 58,35 + Actor574: brik + Owner: USSR + Location: 58,36 + Actor575: brik + Owner: USSR + Location: 59,36 + Actor576: brik + Owner: USSR + Location: 59,37 + Actor577: brik + Owner: USSR + Location: 59,38 + Actor578: brik + Owner: USSR + Location: 60,38 + Actor579: brik + Owner: USSR + Location: 60,37 + Actor580: brik + Owner: USSR + Location: 56,26 + Actor581: brik + Owner: USSR + Location: 57,26 + Actor582: brik + Owner: USSR + Location: 57,25 + Actor583: brik + Owner: USSR + Location: 57,24 + Actor584: brik + Owner: USSR + Location: 58,24 + Actor585: brik + Owner: USSR + Location: 58,23 + Actor586: brik + Owner: USSR + Location: 58,22 + Actor587: brik + Owner: USSR + Location: 58,21 + Actor588: brik + Owner: USSR + Location: 59,21 + Actor589: brik + Owner: USSR + Location: 59,22 + Actor590: brik + Owner: USSR + Location: 80,36 + Actor591: brik + Owner: USSR + Location: 80,35 + Actor592: brik + Owner: USSR + Location: 81,36 + Actor593: brik + Owner: USSR + Location: 81,35 + Actor594: brik + Owner: USSR + Location: 90,34 + Actor595: brik + Owner: USSR + Location: 90,35 + Actor596: brik + Owner: USSR + Location: 89,35 + Actor597: brik + Owner: USSR + Location: 89,34 + Actor598: brik + Owner: USSR + Location: 88,35 + Actor599: brik + Owner: USSR + Location: 87,35 + Actor600: brik + Owner: USSR + Location: 86,35 + Actor601: brik + Owner: USSR + Location: 86,34 + Actor602: brik + Owner: USSR + Location: 87,34 + Actor603: brik + Owner: USSR + Location: 82,36 + Actor604: brik + Owner: USSR + Location: 83,36 + Actor605: brik + Owner: USSR + Location: 83,35 + Actor606: brik + Owner: USSR + Location: 84,35 + Actor607: brik + Owner: USSR + Location: 85,35 + Actor608: brik + Owner: USSR + Location: 86,42 + Actor609: brik + Owner: USSR + Location: 86,43 + Actor610: brik + Owner: USSR + Location: 85,42 + Actor611: brik + Owner: USSR + Location: 84,42 + Actor612: brik + Owner: USSR + Location: 84,43 + Actor614: brik + Owner: USSR + Location: 83,43 + Actor615: brik + Owner: USSR + Location: 83,42 + Actor613: brik + Owner: USSR + Location: 86,44 + Actor616: brik + Owner: USSR + Location: 86,45 + Actor617: brik + Owner: USSR + Location: 86,46 + Actor618: brik + Owner: USSR + Location: 86,47 + Actor619: brik + Owner: USSR + Location: 86,48 + Actor620: brik + Owner: USSR + Location: 86,49 + Actor621: brik + Owner: USSR + Location: 85,49 + Actor622: brik + Owner: USSR + Location: 85,48 + Actor623: brik + Owner: USSR + Location: 78,41 + Actor624: brik + Owner: USSR + Location: 78,42 + Actor625: brik + Owner: USSR + Location: 79,42 + Actor626: brik + Owner: USSR + Location: 79,41 + Actor627: brik + Owner: USSR + Location: 93,20 + Actor628: brik + Owner: USSR + Location: 94,20 + Actor629: brik + Owner: USSR + Location: 93,19 + Actor630: brik + Owner: USSR + Location: 94,19 + Actor631: brik + Owner: USSR + Location: 94,18 + Actor632: brik + Owner: USSR + Location: 94,17 + Actor633: brik + Owner: USSR + Location: 94,16 + Actor634: brik + Owner: USSR + Location: 94,15 + Actor635: brik + Owner: USSR + Location: 93,15 + Actor636: brik + Owner: USSR + Location: 93,16 + Actor637: brik + Owner: USSR + Location: 90,12 + Actor638: brik + Owner: USSR + Location: 90,9 + Actor639: brik + Owner: USSR + Location: 90,8 + Actor640: brik + Owner: USSR + Location: 90,11 + Actor641: brik + Owner: USSR + Location: 90,10 + Actor642: brik + Owner: USSR + Location: 89,12 + Actor643: brik + Owner: USSR + Location: 89,11 + Actor644: brik + Owner: USSR + Location: 89,8 + Actor645: brik + Owner: USSR + Location: 89,9 + Actor646: brik + Owner: USSR + Location: 89,7 + Actor647: brik + Owner: USSR + Location: 89,6 + Actor648: brik + Owner: USSR + Location: 89,5 + Actor654: proc + Owner: USSR + Location: 59,24 + Actor655: tsla + Owner: USSR + Location: 73,103 + ScriptTags: HardAndAbove + Actor656: tsla + Owner: USSR + Location: 61,103 + ScriptTags: HardAndAbove + Actor657: tsla + Owner: USSR + Location: 57,27 + Actor658: tsla + Owner: USSR + Location: 58,33 + Actor659: tsla + Owner: USSR + Location: 82,35 + Actor660: tsla + Owner: USSR + Location: 88,34 + Actor661: tsla + Owner: USSR + Location: 93,17 + Actor662: tsla + Owner: USSR + Location: 89,10 + Actor663: tsla + Owner: USSR + Location: 85,43 + Actor664: tsla + Owner: USSR + Location: 59,62 + Actor665: tsla + Owner: USSR + Location: 60,70 + Actor666: tsla + Owner: USSR + Location: 85,69 + Actor667: tsla + Owner: USSR + Location: 88,61 + Actor669: npwr + Owner: USSR + Location: 52,5 + Actor670: npwr + Owner: USSR + Location: 57,5 + Actor671: tpwr + Owner: USSR + Location: 66,56 + Actor672: tpwr + Owner: USSR + Location: 66,53 + Actor673: tpwr + Owner: USSR + Location: 66,50 + Actor674: tpwr + Owner: USSR + Location: 68,17 + Actor675: tpwr + Owner: USSR + Location: 68,14 + Actor676: tpwr + Owner: USSR + Location: 68,11 + Actor677: tpwr + Owner: USSR + Location: 72,64 + Actor678: tpwr + Owner: USSR + Location: 72,61 + Actor679: tpwr + Owner: USSR + Location: 72,58 + Actor681: indp + Owner: USSR + Location: 66,28 + Actor682: mslo + Owner: USSR + Location: 79,54 + Actor683: sam + Owner: USSR + Location: 81,67 + Actor686: sam + Owner: USSR + Location: 47,53 + Actor693: sam + Owner: USSR + Location: 63,72 + Actor694: sam + Owner: USSR + Location: 76,75 + Actor695: sam + Owner: USSR + Location: 59,56 + Actor696: sam + Owner: USSR + Location: 59,45 + Actor697: sam + Owner: USSR + Location: 75,35 + Actor698: sam + Owner: USSR + Location: 60,36 + Actor699: sam + Owner: USSR + Location: 59,23 + Actor700: sam + Owner: USSR + Location: 72,18 + Actor701: sam + Owner: USSR + Location: 52,9 + Actor702: sam + Owner: USSR + Location: 59,9 + Actor703: ftur + Owner: USSR + Location: 76,54 + Actor704: silo + Owner: USSR + Location: 82,59 + Actor705: silo + Owner: USSR + Location: 84,59 + Actor706: silo + Owner: USSR + Location: 61,24 + Actor707: silo + Owner: USSR + Location: 59,24 + Actor711: afld + Owner: USSR + Location: 77,28 + Actor712: afld + Owner: USSR + Location: 77,25 + Actor713: fix + Owner: USSR + Location: 82,26 + Actor714: afld + Owner: USSR + Location: 83,30 + Actor715: afld + Owner: USSR + Location: 81,23 + Actor716: iron + Owner: USSR + Location: 77,12 + Actor719: barr + Owner: USSR + Location: 72,45 + Actor721: fenc + Owner: USSR + Location: 78,53 + Actor722: fenc + Owner: USSR + Location: 80,53 + Actor723: fenc + Owner: USSR + Location: 79,53 + Actor724: fenc + Owner: USSR + Location: 81,53 + Actor725: fenc + Owner: USSR + Location: 81,54 + Actor726: fenc + Owner: USSR + Location: 78,54 + Actor727: fenc + Owner: USSR + Location: 78,55 + Actor728: fenc + Owner: USSR + Location: 81,55 + Actor729: fenc + Owner: USSR + Location: 80,55 + Actor730: fenc + Owner: USSR + Location: 79,55 + Actor731: fenc + Owner: USSR + Location: 92,55 + Actor732: fenc + Owner: USSR + Location: 91,55 + Actor733: fenc + Owner: USSR + Location: 90,55 + Actor734: fenc + Owner: USSR + Location: 89,55 + Actor735: fenc + Owner: USSR + Location: 88,55 + Actor736: fenc + Owner: USSR + Location: 87,55 + Actor737: fenc + Owner: USSR + Location: 87,54 + Actor738: fenc + Owner: USSR + Location: 43,51 + Actor739: fenc + Owner: USSR + Location: 43,52 + Actor740: fenc + Owner: USSR + Location: 44,52 + Actor741: fenc + Owner: USSR + Location: 44,53 + Actor742: fenc + Owner: USSR + Location: 44,54 + Actor743: fenc + Owner: USSR + Location: 45,54 + Actor744: fenc + Owner: USSR + Location: 45,55 + Actor745: fenc + Owner: USSR + Location: 47,56 + Actor746: fenc + Owner: USSR + Location: 47,55 + Actor747: fenc + Owner: USSR + Location: 48,56 + Actor748: ftur + Owner: USSR + Location: 42,38 + Actor749: ftur + Owner: USSR + Location: 43,43 + Actor750: ftur + Owner: USSR + Location: 40,12 + Actor751: ftur + Owner: USSR + Location: 44,9 + Actor752: fenc + Owner: USSR + Location: 39,11 + Actor753: fenc + Owner: USSR + Location: 39,12 + Actor754: fenc + Owner: USSR + Location: 39,13 + Actor755: fenc + Owner: USSR + Location: 40,11 + Actor756: fenc + Owner: USSR + Location: 41,11 + Actor757: fenc + Owner: USSR + Location: 41,12 + Actor758: fenc + Owner: USSR + Location: 43,9 + Actor759: fenc + Owner: USSR + Location: 43,8 + Actor760: fenc + Owner: USSR + Location: 44,8 + Actor761: fenc + Owner: USSR + Location: 41,37 + Actor762: fenc + Owner: USSR + Location: 41,38 + Actor763: fenc + Owner: USSR + Location: 41,39 + Actor764: fenc + Owner: USSR + Location: 42,39 + Actor765: fenc + Owner: USSR + Location: 43,42 + Actor766: fenc + Owner: USSR + Location: 42,42 + Actor767: fenc + Owner: USSR + Location: 42,43 + Actor768: fenc + Owner: USSR + Location: 42,44 + Actor769: fenc + Owner: USSR + Location: 43,44 + Actor770: fenc + Owner: USSR + Location: 43,45 + Actor771: fenc + Owner: USSR + Location: 44,45 + Actor772: fenc + Owner: USSR + Location: 41,36 + Actor773: ftur + Owner: USSR + Location: 87,68 + Actor774: ftur + Owner: USSR + Location: 89,64 + Actor775: ftur + Owner: USSR + Location: 56,64 + Actor776: ftur + Owner: USSR + Location: 58,69 + Actor777: ftur + Owner: USSR + Location: 83,41 + Actor778: ftur + Owner: USSR + Location: 94,14 + Actor779: ftur + Owner: USSR + Location: 91,11 + Actor780: ftur + Owner: USSR + Location: 54,28 + Actor781: ftur + Owner: USSR + Location: 55,33 + Actor782: powr + Owner: USSR + Location: 67,95 + Actor783: powr + Owner: USSR + Location: 65,95 + Actor784: fix + Owner: USSR + Location: 67,91 + Actor785: apwr + Owner: USSR + Location: 72,91 + Actor786: afld + Owner: USSR + Location: 66,88 + Actor787: afld + Owner: USSR + Location: 71,87 + Actor788: kenn + Owner: USSR + Location: 71,96 + Actor789: sam + Owner: USSR + Location: 64,86 + Actor790: sam + Owner: USSR + Location: 66,60 + Actor791: sam + Owner: USSR + Location: 73,50 + Actor792: brik + Owner: USSR + Location: 50,3 + Actor793: brik + Owner: USSR + Location: 51,3 + Actor794: brik + Owner: USSR + Location: 54,3 + Actor795: brik + Owner: USSR + Location: 52,3 + Actor796: brik + Owner: USSR + Location: 53,3 + Actor797: brik + Owner: USSR + Location: 55,3 + Actor798: brik + Owner: USSR + Location: 56,3 + Actor799: brik + Owner: USSR + Location: 57,3 + Actor800: brik + Owner: USSR + Location: 58,3 + Actor801: brik + Owner: USSR + Location: 59,3 + Actor802: brik + Owner: USSR + Location: 60,3 + Actor803: brik + Owner: USSR + Location: 61,3 + Actor804: brik + Owner: USSR + Location: 62,3 + Actor805: brik + Owner: USSR + Location: 50,4 + Actor806: brik + Owner: USSR + Location: 50,5 + Actor807: brik + Owner: USSR + Location: 50,6 + Actor808: brik + Owner: USSR + Location: 50,7 + Actor809: brik + Owner: USSR + Location: 50,8 + Actor810: brik + Owner: USSR + Location: 62,8 + Actor811: brik + Owner: USSR + Location: 62,7 + Actor812: brik + Owner: USSR + Location: 62,6 + Actor813: brik + Owner: USSR + Location: 62,4 + Actor814: brik + Owner: USSR + Location: 62,5 + Actor816: brik + Owner: USSR + Location: 51,9 + Actor817: brik + Owner: USSR + Location: 50,9 + Actor818: brik + Owner: USSR + Location: 61,9 + Actor820: brik + Owner: USSR + Location: 62,9 + Actor821: chain + Owner: USSR + Location: 52,8 + Actor822: chain + Owner: USSR + Location: 53,8 + Actor823: chain + Owner: USSR + Location: 54,8 + Actor824: chain + Owner: USSR + Location: 58,8 + Actor825: chain + Owner: USSR + Location: 59,8 + Actor826: chain + Owner: USSR + Location: 60,8 + Actor827: chain + Owner: USSR + Location: 57,8 + Actor828: chain + Owner: USSR + Location: 55,8 + Actor829: chain + Owner: USSR + Location: 56,4 + Actor830: chain + Owner: USSR + Location: 56,5 + Actor831: chain + Owner: USSR + Location: 56,6 + Actor832: chain + Owner: USSR + Location: 56,7 + Actor833: chain + Owner: USSR + Location: 56,8 + Actor834: chain + Owner: USSR + Location: 51,7 + Actor835: chain + Owner: USSR + Location: 51,6 + Actor836: chain + Owner: USSR + Location: 51,5 + Actor837: chain + Owner: USSR + Location: 51,4 + Actor838: chain + Owner: USSR + Location: 61,4 + Actor839: chain + Owner: USSR + Location: 61,5 + Actor840: chain + Owner: USSR + Location: 61,6 + Actor841: chain + Owner: USSR + Location: 61,7 + Actor815: chain + Owner: USSR + Location: 61,8 + Actor819: chain + Owner: USSR + Location: 51,8 + Actor842: brik + Owner: USSR + Location: 51,10 + Actor843: brik + Owner: USSR + Location: 50,10 + Actor844: brik + Owner: USSR + Location: 61,10 + Actor845: brik + Owner: USSR + Location: 62,10 + Actor326: fact + Owner: USSR + Location: 62,16 + Actor846: split2 + Owner: Neutral + Location: 96,9 + Actor847: split2 + Owner: Neutral + Location: 99,4 + Actor848: split2 + Owner: Neutral + Location: 49,17 + Actor849: split2 + Owner: Neutral + Location: 53,18 + Actor850: split2 + Owner: Neutral + Location: 50,24 + Actor851: split3 + Owner: Neutral + Location: 50,61 + Actor852: split3 + Owner: Neutral + Location: 46,60 + Actor863: split2 + Owner: Neutral + Location: 97,66 + Actor864: split2 + Owner: Neutral + Location: 103,62 + Actor865: sbag + Owner: England + Location: 104,113 + Actor866: sbag + Owner: England + Location: 104,112 + Actor867: sbag + Owner: England + Location: 104,111 + Actor868: sbag + Owner: England + Location: 104,110 + Actor869: sbag + Owner: England + Location: 105,110 + Actor870: sbag + Owner: England + Location: 106,110 + Actor871: sbag + Owner: England + Location: 109,107 + Actor872: sbag + Owner: England + Location: 109,106 + Actor873: sbag + Owner: England + Location: 109,105 + Actor874: sbag + Owner: England + Location: 109,104 + Actor875: sbag + Owner: England + Location: 109,103 + Actor876: sbag + Owner: England + Location: 110,103 + Actor877: sbag + Owner: England + Location: 111,103 + Actor878: sbag + Owner: England + Location: 110,107 + Actor879: sbag + Owner: England + Location: 103,113 + Actor880: sbag + Owner: England + Location: 103,114 + Actor881: sbag + Owner: England + Location: 103,115 + Actor882: sbag + Owner: England + Location: 102,115 + Actor883: sbag + Owner: England + Location: 102,116 + Actor884: agun + Owner: England + Location: 104,114 + TurretFacing: 88 + Actor885: agun + Owner: England + Location: 110,105 + TurretFacing: 156 + Actor886: powr + Owner: England + Location: 117,107 + Actor887: powr + Owner: England + Location: 119,107 + Actor888: tent + Owner: England + Location: 115,111 + Actor889: gun.nod + Owner: England + Location: 103,112 + TurretFacing: 192 + Health: 73 + Actor890: gun.nod + Owner: England + Location: 108,106 + TurretFacing: 192 + Health: 62 + Actor891: pbox + Owner: England + Location: 104,109 + Health: 64 + Actor892: sbag + Owner: England + Location: 41,117 + Actor893: sbag + Owner: England + Location: 41,115 + Actor894: sbag + Owner: England + Location: 41,116 + Actor895: sbag + Owner: England + Location: 41,114 + Actor896: sbag + Owner: England + Location: 41,113 + Actor897: sbag + Owner: England + Location: 41,112 + Actor898: sbag + Owner: England + Location: 40,112 + Actor899: sbag + Owner: England + Location: 39,112 + Actor900: sbag + Owner: England + Location: 39,111 + Actor901: sbag + Owner: England + Location: 39,105 + Actor902: sbag + Owner: England + Location: 39,104 + Actor903: sbag + Owner: England + Location: 39,103 + Actor904: sbag + Owner: England + Location: 35,102 + Actor905: sbag + Owner: England + Location: 36,102 + Actor906: sbag + Owner: England + Location: 38,102 + Actor907: sbag + Owner: England + Location: 39,102 + Actor908: sbag + Owner: England + Location: 37,102 + Actor910: agun + Owner: England + Location: 37,104 + TurretFacing: 832 + Actor911: agun + Owner: England + Location: 40,114 + Actor909: gun + Owner: England + Location: 41,111 + TurretFacing: 791 + Health: 76 + Actor912: gun + Owner: England + Location: 40,104 + TurretFacing: 777 + Health: 79 + Actor913: pbox + Owner: England + Location: 40,103 + Health: 64 + Actor914: powr + Owner: England + Location: 28,107 + Actor915: powr + Owner: England + Location: 30,107 + Actor916: tent + Owner: England + Location: 35,113 + Actor918: gun + Owner: England + Location: 31,54 + TurretFacing: 736 + Actor919: sbag + Owner: England + Location: 32,53 + Actor920: sbag + Owner: England + Location: 32,54 + Actor921: sbag + Owner: England + Location: 32,55 + Actor922: sbag + Owner: England + Location: 108,39 + Actor923: sbag + Owner: England + Location: 108,37 + Actor924: sbag + Owner: England + Location: 108,38 + Actor925: sbag + Owner: England + Location: 108,36 + Actor926: sbag + Owner: England + Location: 109,36 + Actor927: gun + Owner: England + Location: 107,37 + TurretFacing: 192 + Health: 62 + Actor928: apwr + Owner: England + Location: 111,41 + Health: 32 + Actor929: apwr + Owner: England + Location: 111,44 + Health: 33 + Actor931: powr + Owner: England + Location: 22,48 + Health: 36 + Actor932: powr + Owner: England + Location: 20,47 + Health: 54 + Actor933: proc + Owner: England + Location: 11,71 + Health: 41 + Actor934: proc + Owner: England + Location: 128,76 + Health: 38 + Actor936: 3tnk + Owner: USSR + Location: 108,47 + Facing: 913 + Actor937: 3tnk + Owner: USSR + Location: 110,35 + Facing: 384 + Actor938: 3tnk + Owner: USSR + Facing: 384 + Location: 24,45 + Actor939: 3tnk + Owner: USSR + Location: 16,75 + Facing: 245 + Actor940: e1 + Owner: USSR + Location: 125,74 + SubCell: 3 + Facing: 566 + Actor941: e1 + Owner: USSR + Facing: 384 + Location: 131,74 + SubCell: 3 + Actor942: e1 + Owner: USSR + Facing: 384 + Location: 124,79 + SubCell: 3 + Actor943: e1 + Owner: USSR + Facing: 384 + Location: 112,47 + SubCell: 3 + Actor944: e1 + Owner: USSR + Facing: 384 + Location: 112,35 + SubCell: 3 + Actor945: e1 + Owner: USSR + Facing: 384 + Location: 108,33 + SubCell: 3 + Actor946: e1 + Owner: USSR + Facing: 384 + Location: 34,53 + SubCell: 3 + Actor947: e1 + Owner: USSR + Facing: 384 + Location: 36,50 + SubCell: 3 + Actor948: e1 + Owner: USSR + Facing: 384 + Location: 26,46 + SubCell: 3 + Actor949: e4 + Owner: USSR + Facing: 384 + Location: 25,47 + SubCell: 3 + Actor950: e4 + Owner: USSR + Facing: 384 + Location: 115,39 + SubCell: 3 + Actor951: e4 + Owner: USSR + Facing: 384 + Location: 129,73 + SubCell: 3 + Actor952: e4 + Owner: USSR + Facing: 384 + Location: 16,71 + SubCell: 3 + Actor953: e2 + Owner: USSR + Facing: 384 + Location: 15,70 + SubCell: 3 + Actor954: e2 + Owner: USSR + Facing: 384 + Location: 12,70 + SubCell: 3 + Actor955: e2 + Owner: USSR + Facing: 384 + Location: 104,39 + SubCell: 3 + Actor956: e2 + Owner: USSR + Facing: 384 + Location: 102,36 + SubCell: 3 + Actor957: e2 + Owner: USSR + Facing: 384 + Location: 105,35 + SubCell: 3 + Actor958: e2 + Owner: USSR + Facing: 384 + Location: 45,100 + SubCell: 3 + Actor959: e2 + Owner: USSR + Location: 43,100 + SubCell: 3 + Facing: 384 + Actor960: e2 + Owner: USSR + Location: 97,107 + SubCell: 3 + Facing: 538 + Actor961: e2 + Owner: USSR + Location: 104,100 + SubCell: 3 + Facing: 606 + Actor962: 3tnk + Owner: USSR + Location: 102,104 + Facing: 613 + Actor963: 3tnk + Owner: USSR + Location: 44,101 + Facing: 384 + Actor964: e1 + Owner: USSR + Facing: 384 + Location: 59,125 + SubCell: 3 + Actor965: e1 + Owner: USSR + Facing: 384 + Location: 62,128 + SubCell: 3 + Actor966: e1 + Owner: USSR + Location: 67,128 + SubCell: 3 + Facing: 518 + Actor967: e1 + Owner: USSR + Location: 74,125 + SubCell: 3 + Facing: 634 + Actor968: e1 + Owner: USSR + Location: 76,126 + SubCell: 3 + Facing: 566 + Actor969: e1 + Owner: USSR + Facing: 384 + Location: 51,98 + SubCell: 3 + Actor970: e1 + Owner: USSR + Facing: 384 + Location: 50,93 + SubCell: 3 + Actor971: e1 + Owner: USSR + Facing: 384 + Location: 58,70 + SubCell: 3 + Actor972: e1 + Owner: USSR + Facing: 384 + Location: 57,65 + SubCell: 3 + Actor974: e1 + Owner: USSR + Facing: 384 + Location: 44,42 + SubCell: 3 + Actor975: e1 + Owner: USSR + Facing: 384 + Location: 40,39 + SubCell: 3 + Actor976: e1 + Owner: USSR + Facing: 384 + Location: 38,37 + SubCell: 3 + Actor977: e1 + Owner: USSR + Facing: 384 + Location: 41,44 + SubCell: 3 + Actor978: e1 + Owner: USSR + Facing: 384 + Location: 42,45 + SubCell: 3 + Actor979: e1 + Owner: USSR + Facing: 384 + Location: 55,34 + SubCell: 3 + Actor980: e1 + Owner: USSR + Facing: 384 + Location: 53,28 + SubCell: 3 + Actor981: e1 + Owner: USSR + Facing: 384 + Location: 64,30 + SubCell: 3 + Actor982: e1 + Owner: USSR + Facing: 384 + Location: 60,35 + SubCell: 3 + Actor983: e1 + Owner: USSR + Facing: 384 + Location: 62,39 + SubCell: 3 + Actor984: e1 + Owner: USSR + Facing: 384 + Location: 58,46 + SubCell: 3 + Actor985: e1 + Owner: USSR + Facing: 384 + Location: 68,48 + SubCell: 3 + Actor986: e1 + Owner: USSR + Facing: 384 + Location: 61,17 + SubCell: 3 + Actor987: e1 + Owner: USSR + Facing: 384 + Location: 60,18 + SubCell: 3 + Actor988: e1 + Owner: USSR + Facing: 384 + Location: 55,11 + SubCell: 3 + Actor989: e1 + Owner: USSR + Facing: 384 + Location: 53,11 + SubCell: 3 + Actor990: e1 + Owner: USSR + Facing: 384 + Location: 60,12 + SubCell: 3 + Actor991: e1 + Owner: USSR + Facing: 384 + Location: 61,13 + SubCell: 3 + Actor992: e1 + Owner: USSR + Facing: 384 + Location: 55,10 + SubCell: 3 + Actor993: e1 + Owner: USSR + Facing: 384 + Location: 55,11 + SubCell: 1 + Actor994: e1 + Owner: USSR + Facing: 384 + Location: 43,7 + SubCell: 3 + Actor995: e1 + Owner: USSR + Facing: 384 + Location: 40,10 + SubCell: 3 + Actor997: e1 + Owner: USSR + Facing: 384 + Location: 39,30 + SubCell: 3 + Actor998: e1 + Owner: USSR + Facing: 384 + Location: 54,41 + SubCell: 3 + Actor999: e1 + Owner: USSR + Facing: 384 + Location: 68,78 + SubCell: 3 + Actor1000: e1 + Owner: USSR + Facing: 384 + Location: 67,76 + SubCell: 3 + Actor1001: e1 + Owner: USSR + Facing: 384 + Location: 61,63 + SubCell: 3 + Actor1002: e1 + Owner: USSR + Facing: 384 + Location: 69,98 + SubCell: 3 + Actor1003: e1 + Owner: USSR + Facing: 384 + Location: 64,105 + SubCell: 3 + Actor1004: e1 + Owner: USSR + Facing: 384 + Location: 65,107 + SubCell: 3 + Actor1005: e1 + Owner: USSR + Facing: 384 + Location: 69,107 + SubCell: 3 + Actor1006: e1 + Owner: USSR + Facing: 384 + Location: 62,106 + SubCell: 3 + Actor1007: e1 + Owner: USSR + Location: 85,107 + SubCell: 3 + Facing: 661 + Actor1008: e1 + Owner: USSR + SubCell: 3 + Facing: 661 + Location: 90,106 + Actor1009: e1 + Owner: USSR + SubCell: 3 + Facing: 661 + Location: 87,69 + Actor1010: e1 + Owner: USSR + SubCell: 3 + Facing: 661 + Location: 90,65 + Actor1011: e1 + Owner: USSR + SubCell: 3 + Facing: 661 + Location: 84,65 + Actor1012: e1 + Owner: USSR + SubCell: 3 + Facing: 661 + Location: 91,58 + Actor1013: e1 + Owner: USSR + SubCell: 3 + Facing: 661 + Location: 90,44 + Actor1014: e1 + Owner: USSR + SubCell: 3 + Facing: 661 + Location: 95,15 + Actor1015: e1 + Owner: USSR + SubCell: 3 + Facing: 661 + Location: 72,21 + Actor1016: e1 + Owner: USSR + SubCell: 3 + Facing: 661 + Location: 70,9 + Actor1017: e1 + Owner: USSR + SubCell: 3 + Facing: 661 + Location: 79,23 + Actor1018: e1 + Owner: USSR + SubCell: 3 + Facing: 661 + Location: 83,20 + Actor1019: e1 + Owner: USSR + SubCell: 3 + Facing: 661 + Location: 76,46 + Actor1020: e1 + Owner: USSR + SubCell: 3 + Facing: 661 + Location: 75,43 + Actor1021: e1 + Owner: USSR + SubCell: 3 + Facing: 661 + Location: 78,33 + Actor1022: e1 + Owner: USSR + SubCell: 3 + Facing: 661 + Location: 71,35 + Actor1023: e1 + Owner: USSR + SubCell: 3 + Facing: 661 + Location: 84,51 + Actor1024: e1 + Owner: USSR + SubCell: 3 + Facing: 661 + Location: 86,60 + Actor1025: e1 + Owner: USSR + SubCell: 3 + Facing: 661 + Location: 76,63 + Actor1026: e1 + Owner: USSR + SubCell: 3 + Facing: 661 + Location: 75,65 + Actor1027: e1 + Owner: USSR + SubCell: 3 + Facing: 661 + Location: 73,67 + Actor1028: e1 + Owner: USSR + SubCell: 3 + Facing: 661 + Location: 70,79 + Actor1029: e1 + Owner: USSR + SubCell: 3 + Facing: 661 + Location: 75,78 + Actor1030: e1 + Owner: USSR + SubCell: 3 + Facing: 661 + Location: 84,90 + Actor1031: e1 + Owner: USSR + SubCell: 3 + Facing: 661 + Location: 86,95 + Actor1032: e1 + Owner: USSR + SubCell: 3 + Location: 93,93 + Facing: 913 + Actor1033: e1 + Owner: USSR + SubCell: 3 + Facing: 913 + Location: 94,97 + Actor1034: e1 + Owner: USSR + SubCell: 3 + Facing: 913 + Location: 85,41 + Actor1035: e1 + Owner: USSR + SubCell: 3 + Facing: 913 + Location: 93,31 + Actor1036: e1 + Owner: USSR + SubCell: 3 + Facing: 913 + Location: 89,13 + Actor1037: e1 + Owner: USSR + SubCell: 3 + Facing: 913 + Location: 86,28 + Actor1038: e1 + Owner: USSR + SubCell: 3 + Facing: 913 + Location: 69,74 + Actor1039: e1 + Owner: USSR + SubCell: 3 + Facing: 913 + Location: 86,80 + Actor1040: e3 + Owner: USSR + Facing: 384 + Location: 64,102 + SubCell: 3 + Actor1041: e3 + Owner: USSR + Facing: 384 + Location: 75,103 + SubCell: 3 + Actor1042: e3 + Owner: USSR + Facing: 384 + Location: 54,84 + SubCell: 3 + Actor1043: e3 + Owner: USSR + Facing: 384 + Location: 54,92 + SubCell: 3 + Actor1044: e3 + Owner: USSR + Facing: 384 + Location: 51,92 + SubCell: 3 + Actor1045: e3 + Owner: USSR + Facing: 384 + Location: 60,67 + SubCell: 3 + Actor1046: e3 + Owner: USSR + Facing: 384 + Location: 61,37 + SubCell: 3 + Actor1047: e3 + Owner: USSR + Facing: 384 + Location: 54,35 + SubCell: 3 + Actor1048: e3 + Owner: USSR + Facing: 384 + Location: 44,44 + SubCell: 3 + Actor1049: e3 + Owner: USSR + Facing: 384 + Location: 38,31 + SubCell: 3 + Actor1051: e3 + Owner: USSR + Facing: 384 + Location: 45,10 + SubCell: 3 + Actor1053: e3 + Owner: USSR + Facing: 384 + Location: 56,11 + SubCell: 3 + Actor1054: e3 + Owner: USSR + Facing: 384 + Location: 76,45 + SubCell: 3 + Actor1055: e3 + Owner: USSR + Facing: 384 + Location: 65,49 + SubCell: 3 + Actor1056: e3 + Owner: USSR + Facing: 384 + Location: 60,51 + SubCell: 3 + Actor1057: e3 + Owner: USSR + Facing: 384 + Location: 75,68 + SubCell: 3 + Actor1058: e3 + Owner: USSR + Facing: 384 + Location: 88,58 + SubCell: 3 + Actor1059: e3 + Owner: USSR + Facing: 384 + Location: 79,78 + SubCell: 3 + Actor1060: e3 + Owner: USSR + Facing: 384 + Location: 91,77 + SubCell: 3 + Actor1061: e3 + Owner: USSR + Facing: 384 + Location: 85,88 + SubCell: 3 + Actor1062: e3 + Owner: USSR + Facing: 384 + Location: 88,103 + SubCell: 3 + Actor1063: e3 + Owner: USSR + Facing: 384 + Location: 80,98 + SubCell: 3 + Actor1064: e3 + Owner: USSR + Facing: 384 + Location: 73,94 + SubCell: 3 + Actor1065: e3 + Owner: USSR + Facing: 384 + Location: 66,85 + SubCell: 3 + Actor1066: e3 + Owner: USSR + Facing: 384 + Location: 57,83 + SubCell: 3 + Actor1067: ttrp + Owner: USSR + Facing: 384 + Location: 69,62 + SubCell: 3 + Actor1068: ttrp + Owner: USSR + Location: 72,55 + SubCell: 3 + Facing: 518 + Actor1069: ttrp + Owner: USSR + Location: 73,53 + SubCell: 3 + Facing: 729 + Actor1070: cmsr + Owner: USSR + Facing: 384 + Location: 71,49 + SubCell: 3 + Actor1071: cmsr + Owner: USSR + Facing: 384 + Location: 73,34 + SubCell: 3 + Actor1074: oilb + Owner: USSR + Location: 4,44 + Actor1075: hosp + Owner: Neutral + Location: 15,27 + Actor1076: macs + Owner: Neutral + Location: 134,41 + ReinforcementSpawn: waypoint + Owner: Neutral + Location: 71,160 + ReinforcementDest: waypoint + Owner: Neutral + Location: 71,155 + PlayerStart: waypoint + Owner: Neutral + Location: 71,151 + WestLanding1: waypoint + Owner: Neutral + Location: 24,137 + WestLanding2: waypoint + Owner: Neutral + Location: 29,136 + WestLanding3: waypoint + Owner: Neutral + Location: 35,135 + EastLanding1: waypoint + Owner: Neutral + Location: 109,137 + EastLanding2: waypoint + Owner: Neutral + Location: 113,138 + EastLanding3: waypoint + Owner: Neutral + Location: 116,141 + Actor509: barr + Owner: USSR + Location: 58,92 + Actor718: stek + Owner: USSR + Location: 72,25 + NorthFactory: weap + Owner: USSR + Location: 71,38 + Actor1079: pt + Owner: Greece + Location: 68,152 + Facing: 0 + Actor1080: pt + Owner: Greece + Location: 74,152 + Facing: 0 + Actor1081: camera + Owner: USSR + Location: 40,110 + Actor1082: camera + Owner: USSR + Location: 107,109 + Actor1083: camera + Owner: USSR + Location: 14,72 + Actor1084: camera + Owner: USSR + Location: 126,76 + Actor1085: camera + Owner: USSR + Location: 111,39 + Actor1086: camera + Owner: USSR + Location: 24,47 + Actor1087: camera + Owner: USSR + Location: 29,98 + Actor1088: camera + Owner: USSR + Location: 118,96 + Actor935: 3tnk + Owner: USSR + Facing: 770 + Location: 126,79 + Actor1090: ifv + Owner: England + Location: 117,116 + Facing: 128 + Actor1091: ifv + Owner: England + Facing: 128 + Location: 120,115 + Actor1089: ifv + Owner: England + Facing: 128 + Location: 120,112 + Actor1092: jeep + Owner: England + Location: 28,112 + Facing: 896 + Actor1093: hopl + Owner: England + Location: 30,113 + SubCell: 3 + Facing: 896 + Actor1094: hopl + Owner: England + Location: 27,111 + SubCell: 3 + Facing: 896 + Actor1095: hopl + Owner: England + Location: 28,114 + SubCell: 3 + Facing: 896 + Actor1096: enfo + Owner: England + Location: 30,111 + SubCell: 3 + Facing: 896 + Actor1097: e3 + Owner: England + Location: 31,114 + SubCell: 3 + Facing: 896 + Actor1098: e3 + Owner: England + Location: 26,110 + SubCell: 3 + Facing: 896 + Actor1101: e1 + Owner: England + Location: 118,117 + SubCell: 3 + Facing: 128 + Actor1103: medi + Owner: England + Location: 119,116 + SubCell: 3 + Facing: 128 + Actor1104: medi + Owner: England + Location: 121,114 + SubCell: 3 + Facing: 128 + Actor1102: e1 + Owner: England + SubCell: 3 + Facing: 128 + Location: 117,119 + Actor1100: e1 + Owner: England + SubCell: 3 + Facing: 128 + Location: 119,114 + Actor1099: e1 + Owner: England + SubCell: 3 + Facing: 128 + Location: 122,112 + Actor1106: 3tnk + Owner: USSR + Location: 45,109 + Facing: 259 + Actor1105: 3tnk + Owner: USSR + Facing: 613 + Location: 99,109 + WestFlare: flare + Owner: England + Location: 29,133 + EastFlare: flare + Owner: England + Location: 115,135 + EnglandDome: dome + Owner: England + Location: 112,36 + Health: 88 + Actor1077: 3tnk + Owner: USSR + Facing: 384 + Location: 61,124 + Actor1078: 3tnk + Owner: USSR + Facing: 384 + Location: 63,126 + Actor1107: 3tnk + Owner: USSR + Location: 72,125 + Facing: 642 + Actor1108: 3tnk + Owner: USSR + Location: 66,109 + Facing: 512 + Actor1109: 3tnk + Owner: USSR + Location: 72,107 + Facing: 512 + Actor1110: 3tnk + Owner: USSR + Location: 64,107 + Facing: 512 + Actor1111: 3tnk + Owner: USSR + Facing: 384 + Location: 49,92 + Actor1112: 3tnk + Owner: USSR + Location: 88,107 + Facing: 642 + Actor1113: 3tnk + Owner: USSR + Facing: 642 + Location: 89,67 + Actor1114: 3tnk + Owner: USSR + Facing: 642 + Location: 97,16 + Actor1115: 3tnk + Owner: USSR + Facing: 642 + Location: 85,37 + Actor1116: 3tnk + Owner: USSR + Facing: 384 + Location: 56,66 + Actor1117: 3tnk + Owner: USSR + Facing: 384 + Location: 53,30 + Actor1118: 3tnk + Owner: USSR + Facing: 384 + Location: 46,39 + Actor1119: ttra + Owner: USSR + Facing: 384 + Location: 69,86 + Actor1120: ttra + Owner: USSR + Facing: 384 + Location: 74,95 + Actor1121: ttra + Owner: USSR + Location: 82,87 + Facing: 763 + Actor1122: ovld + Owner: USSR + Location: 70,50 + Facing: 512 + Actor1126: apoc + Owner: USSR + Location: 78,51 + Facing: 384 + ScriptTags: HardAndAbove + Actor1127: apoc + Owner: USSR + Location: 83,55 + Facing: 384 + ScriptTags: HardAndAbove + Actor1123: ovld + Owner: USSR + Location: 70,54 + Facing: 512 + ScriptTags: HardAndAbove + Actor1124: ovld + Owner: USSR + Facing: 512 + Location: 70,57 + Actor1125: ovld + Owner: USSR + Facing: 512 + Location: 70,61 + Actor1128: 4tnk + Owner: USSR + Facing: 384 + Location: 60,49 + Actor1129: 4tnk + Owner: USSR + Facing: 384 + Location: 61,29 + Actor1130: 4tnk + Owner: USSR + Location: 84,18 + Facing: 896 + Actor1131: 4tnk + Owner: USSR + Location: 86,22 + Facing: 896 + Actor1133: btr.ai + Owner: USSR + Facing: 384 + Location: 64,23 + Actor1134: btr.ai + Owner: USSR + Facing: 384 + Location: 80,51 + Actor1142: btr.ai + Owner: USSR + Location: 70,27 + Facing: 512 + Actor1132: btr.ai + Owner: USSR + Facing: 512 + Location: 67,32 + Actor1141: btr.ai + Owner: USSR + Facing: 512 + Location: 67,36 + Actor1140: btr.ai + Owner: USSR + Facing: 512 + Location: 67,39 + Actor1135: btr.ai + Owner: USSR + Facing: 512 + Location: 70,65 + Actor1136: btr.ai + Owner: USSR + Facing: 512 + Location: 70,68 + Actor1138: btr.ai + Owner: USSR + Facing: 512 + Location: 73,80 + Actor1137: btr.ai + Owner: USSR + Facing: 512 + Location: 73,76 + Actor1139: btr.ai + Owner: USSR + Facing: 512 + Location: 79,91 + Actor1143: btr.ai + Owner: USSR + Facing: 512 + Location: 66,16 + Actor1144: btr.ai + Owner: USSR + Facing: 512 + Location: 66,11 + Actor1145: ttra + Owner: USSR + Facing: 763 + Location: 80,31 + GradSpawn: waypoint + Owner: Neutral + Location: 66,1 + EastRally5: waypoint + Owner: Neutral + Location: 93,114 + EastRally4: waypoint + Owner: Neutral + Location: 104,93 + EastRally3: waypoint + Owner: Neutral + Location: 102,74 + EastRally2: waypoint + Owner: Neutral + Location: 100,43 + EastRally1: waypoint + Owner: Neutral + Location: 104,20 + WestRally1: waypoint + Owner: Neutral + Location: 49,36 + WestRally2: waypoint + Owner: Neutral + Location: 47,66 + WestRally3: waypoint + Owner: Neutral + Location: 45,95 + Actor1152: grad.defender + Owner: USSR + Facing: 642 + Location: 94,60 + Actor1153: grad.defender + Owner: USSR + Facing: 642 + Location: 96,59 + Actor1154: grad.defender + Owner: USSR + Facing: 642 + Location: 95,57 + Actor1155: grad.defender + Owner: USSR + Facing: 642 + Location: 95,30 + Actor1156: grad.defender + Owner: USSR + Facing: 642 + Location: 97,29 + Actor1161: grad.defender + Owner: USSR + Location: 69,129 + Facing: 512 + Actor1163: grad.defender + Owner: USSR + Facing: 384 + Location: 45,53 + Actor1164: grad.defender + Owner: USSR + Facing: 384 + Location: 48,55 + Actor1165: grad.defender + Owner: USSR + Facing: 384 + Location: 44,51 + Actor1167: split2 + Owner: Neutral + Location: 110,119 + Actor1168: split2 + Owner: Neutral + Location: 16,103 + Actor1169: split2 + Owner: Neutral + Location: 131,85 + Actor1170: oilb + Owner: USSR + Location: 5,36 + Actor1171: split2 + Owner: Neutral + Location: 17,64 + Actor1072: oilb + Owner: USSR + Location: 121,19 + Actor1073: oilb + Owner: USSR + Location: 117,20 + Actor354: v3rl + Owner: USSR + Location: 50,112 + Facing: 259 + ScriptTags: HardAndAbove + Actor369: v3rl + Owner: USSR + Location: 41,93 + Facing: 470 + Actor352: v3rl + Owner: USSR + Facing: 642 + Location: 104,96 + Actor351: v3rl + Owner: USSR + Location: 91,112 + Facing: 757 + ScriptTags: HardAndAbove + Actor1176: ftur + Owner: USSR + Location: 67,79 + Actor1178: ftur + Owner: USSR + Location: 63,20 + Actor1179: oilb + Owner: USSR + Location: 29,82 + WestBaseCenter: waypoint + Owner: Neutral + Location: 36,109 + EastBaseCenter: waypoint + Owner: Neutral + Location: 120,113 + Actor1180: dome + Owner: USSR + Location: 75,109 + Actor1182: fenc + Owner: USSR + Location: 77,111 + Actor1183: fenc + Owner: USSR + Location: 77,109 + Actor1184: fenc + Owner: USSR + Location: 77,110 + Actor1185: fenc + Owner: USSR + Location: 77,112 + Actor1186: fenc + Owner: USSR + Location: 54,112 + Actor1187: fenc + Owner: USSR + Location: 55,112 + Actor1188: fenc + Owner: USSR + Location: 56,112 + Actor1189: fenc + Owner: USSR + Location: 53,110 + Actor1190: fenc + Owner: USSR + Location: 54,111 + Actor1191: fenc + Owner: USSR + Location: 54,110 + Actor1192: fenc + Owner: USSR + Location: 53,109 + Actor1181: dome + Owner: USSR + Location: 55,109 + Actor680: dome + Owner: USSR + Location: 64,37 + NorthBarracks: barr + Owner: USSR + Location: 64,43 + Actor1199: dog + Owner: USSR + Location: 86,78 + SubCell: 3 + Facing: 572 + Actor1200: dog + Owner: USSR + Facing: 384 + Location: 72,36 + SubCell: 3 + Actor1201: dog + Owner: USSR + Facing: 384 + Location: 91,17 + SubCell: 3 + Actor1202: dog + Owner: USSR + Facing: 384 + Location: 60,32 + SubCell: 3 + Actor1203: dog + Owner: USSR + Facing: 384 + Location: 43,38 + SubCell: 3 + Actor1204: dog + Owner: USSR + Facing: 384 + Location: 56,92 + SubCell: 3 + Actor1205: dog + Owner: USSR + Location: 71,97 + SubCell: 3 + Facing: 606 + Actor1206: dog + Owner: USSR + Facing: 384 + Location: 70,95 + SubCell: 3 + Actor1207: dog + Owner: USSR + Facing: 384 + Location: 64,97 + SubCell: 3 + Actor1208: dog + Owner: USSR + Facing: 384 + Location: 81,92 + SubCell: 3 + Actor1209: dog + Owner: USSR + Location: 59,10 + SubCell: 3 + Facing: 654 + Actor1210: dog + Owner: USSR + Facing: 384 + Location: 52,11 + SubCell: 3 + Actor1211: dog + Owner: USSR + Facing: 384 + Location: 63,11 + SubCell: 3 + Actor1212: dog + Owner: USSR + Facing: 384 + Location: 65,54 + SubCell: 3 + Actor1213: dog + Owner: USSR + Location: 75,61 + SubCell: 3 + Facing: 613 + Actor1214: dog + Owner: USSR + Location: 67,59 + SubCell: 3 + Facing: 743 + Actor1215: dog + Owner: USSR + Facing: 384 + Location: 74,48 + SubCell: 3 + Actor1216: dog + Owner: USSR + Facing: 384 + Location: 74,67 + SubCell: 3 + Actor1217: dog + Owner: USSR + Facing: 384 + Location: 70,20 + SubCell: 3 + Actor1218: dog + Owner: USSR + Facing: 384 + Location: 67,14 + SubCell: 3 + Actor1219: dog + Owner: USSR + Facing: 384 + Location: 71,13 + SubCell: 3 + Actor1220: dog + Owner: USSR + Location: 76,90 + SubCell: 3 + Facing: 675 + Actor1223: dog + Owner: USSR + Location: 91,28 + SubCell: 3 + Facing: 606 + Actor1224: dog + Owner: USSR + Facing: 384 + Location: 93,25 + SubCell: 3 + Actor1227: dog + Owner: USSR + Location: 88,57 + SubCell: 3 + Facing: 384 + Actor1228: dog + Owner: USSR + Location: 89,80 + SubCell: 3 + Facing: 384 + Actor1229: dog + Owner: USSR + Location: 59,86 + SubCell: 3 + Facing: 688 + Actor1230: dog + Owner: USSR + Facing: 384 + Location: 60,84 + SubCell: 3 + Actor1231: dog + Owner: USSR + Facing: 384 + Location: 57,109 + SubCell: 3 + Actor1232: dog + Owner: USSR + Location: 74,111 + SubCell: 3 + Facing: 627 + Actor1233: dog + Owner: USSR + Location: 89,59 + SubCell: 3 + Facing: 559 + Actor1177: ftur + Owner: USSR + Location: 65,40 + Actor1234: dog + Owner: USSR + Facing: 384 + Location: 63,39 + SubCell: 3 + Actor1235: dog + Owner: USSR + Location: 65,36 + SubCell: 3 + Facing: 661 + Actor973: e1 + Owner: USSR + Facing: 384 + Location: 44,49 + SubCell: 3 + Actor1195: dome + Owner: USSR + Location: 46,50 + Actor1226: dog + Owner: USSR + Facing: 647 + Location: 48,49 + SubCell: 3 + Actor1225: dog + Owner: USSR + Facing: 384 + Location: 50,53 + SubCell: 3 + Actor1196: dome + Owner: USSR + Location: 92,57 + Actor684: sam + Owner: USSR + Location: 93,56 + Actor1147: grad.defender + Owner: USSR + Facing: 384 + Location: 49,83 + Actor1148: grad.defender + Owner: USSR + Facing: 384 + Location: 53,86 + Actor1146: grad.defender + Owner: USSR + Facing: 384 + Location: 50,86 + Actor1194: dome + Owner: USSR + Location: 51,83 + Actor1193: dome + Owner: USSR + Location: 95,79 + Actor1149: grad.defender + Owner: USSR + Facing: 642 + Location: 98,81 + Actor1151: grad.defender + Owner: USSR + Facing: 642 + Location: 94,82 + Actor1150: grad.defender + Owner: USSR + Facing: 642 + Location: 97,79 + Actor692: sam + Owner: USSR + Location: 94,78 + Actor690: sam + Owner: USSR + Location: 52,82 + Actor1162: grad.defender + Owner: USSR + Facing: 384 + Location: 37,31 + Actor1166: grad.defender + Owner: USSR + Facing: 384 + Location: 36,27 + Actor1050: e3 + Owner: USSR + Facing: 384 + Location: 36,30 + SubCell: 3 + Actor996: e1 + Owner: USSR + Facing: 384 + Location: 36,26 + SubCell: 3 + Actor1222: dog + Owner: USSR + Facing: 384 + Location: 39,26 + SubCell: 3 + Actor1198: dome + Owner: USSR + Location: 38,27 + Actor1221: dog + Owner: USSR + Facing: 647 + Location: 40,31 + SubCell: 3 + Actor689: sam + Owner: USSR + Location: 40,28 + Actor1197: dome + Owner: USSR + Location: 94,26 + Actor1052: e3 + Owner: USSR + Facing: 384 + Location: 96,26 + SubCell: 3 + Actor688: sam + Owner: USSR + Location: 92,29 + Actor1159: grad.defender + Owner: USSR + Facing: 384 + Location: 59,122 + Actor1157: grad.defender + Owner: USSR + Facing: 642 + Location: 79,121 + Actor1158: split2 + Owner: Neutral + Location: 136,15 + Actor1160: split2 + Owner: Neutral + Location: 135,9 + Actor1172: split2 + Owner: Neutral + Location: 10,18 + Actor1173: split2 + Owner: Neutral + Location: 9,10 + Actor1175: ftur + Owner: USSR + Location: 77,84 + SouthFactory: weap + Owner: USSR + Location: 80,79 + SouthBarracks: barr + Owner: USSR + Location: 76,78 + Actor1174: fix + Owner: England + Location: 123,108 + Actor1236: fix + Owner: England + Location: 31,111 + Actor1237: oilb + Owner: USSR + Location: 117,49 + Actor708: proc + Owner: USSR + Location: 83,11 + Actor709: silo + Owner: USSR + Location: 85,11 + Actor710: silo + Owner: USSR + Location: 83,11 + Actor1259: sam + Owner: USSR + Location: 88,3 + Actor1260: brik + Owner: USSR + Location: 89,4 + Actor1261: brik + Owner: USSR + Location: 90,4 + Actor1262: brik + Owner: USSR + Location: 91,4 + Actor1263: brik + Owner: USSR + Location: 91,3 + Actor1264: brik + Owner: USSR + Location: 90,3 + Actor1238: npwr + Owner: USSR + Location: 81,3 + Actor1239: brik + Owner: USSR + Location: 79,1 + Actor1240: brik + Owner: USSR + Location: 79,3 + Actor1241: brik + Owner: USSR + Location: 79,2 + Actor1242: brik + Owner: USSR + Location: 79,4 + Actor1243: brik + Owner: USSR + Location: 85,1 + Actor1244: brik + Owner: USSR + Location: 84,1 + Actor1245: brik + Owner: USSR + Location: 83,1 + Actor1246: brik + Owner: USSR + Location: 81,1 + Actor1247: brik + Owner: USSR + Location: 82,1 + Actor1248: brik + Owner: USSR + Location: 80,1 + Actor1249: brik + Owner: USSR + Location: 79,5 + Actor1250: brik + Owner: USSR + Location: 79,6 + Actor1252: brik + Owner: USSR + Location: 86,5 + Actor1253: brik + Owner: USSR + Location: 86,4 + Actor1254: brik + Owner: USSR + Location: 86,3 + Actor1255: brik + Owner: USSR + Location: 86,2 + Actor1256: brik + Owner: USSR + Location: 86,1 + Actor1251: brik + Owner: USSR + Location: 86,6 + Actor1257: brik + Owner: USSR + Location: 79,7 + Actor1258: brik + Owner: USSR + Location: 80,7 + Actor1265: brik + Owner: USSR + Location: 79,8 + Actor1266: brik + Owner: USSR + Location: 80,8 + Actor1267: brik + Owner: USSR + Location: 85,8 + Actor1268: brik + Owner: USSR + Location: 85,7 + Actor1269: brik + Owner: USSR + Location: 86,7 + Actor1270: brik + Owner: USSR + Location: 86,8 + Actor1271: chain + Owner: USSR + Location: 80,2 + Actor1272: chain + Owner: USSR + Location: 80,3 + Actor1273: chain + Owner: USSR + Location: 80,4 + Actor1274: chain + Owner: USSR + Location: 80,5 + Actor1275: chain + Owner: USSR + Location: 80,6 + Actor1276: chain + Owner: USSR + Location: 81,6 + Actor1277: chain + Owner: USSR + Location: 83,6 + Actor1278: chain + Owner: USSR + Location: 82,6 + Actor1279: chain + Owner: USSR + Location: 84,6 + Actor1280: chain + Owner: USSR + Location: 85,6 + Actor1281: chain + Owner: USSR + Location: 85,5 + Actor1282: chain + Owner: USSR + Location: 85,4 + Actor1283: chain + Owner: USSR + Location: 85,3 + Actor1284: chain + Owner: USSR + Location: 85,2 + Actor717: sam + Owner: USSR + Location: 82,7 + Actor1285: sam + Owner: USSR + Location: 74,7 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|missions/main-campaign/ca43-dissection/pinkjunglecliffs_rul.yaml, ca|missions/main-campaign/ca43-dissection/mebld_rul.yaml, ca|missions/main-campaign/ca43-dissection/pinkdefaults_rul.yaml, ca|missions/main-campaign/ca43-dissection/pinktrees_rul.yaml, ca|missions/main-campaign/ca43-dissection/dissection-rules.yaml, ca|rules/custom/coop-rules.yaml, dissection-coop-rules.yaml + +Sequences: ca|missions/main-campaign/ca43-dissection/mebld_seq.yaml, ca|missions/main-campaign/ca43-dissection/pinktrees_seq.yaml, ca|missions/main-campaign/ca43-dissection/pinkjunglecliffs_seq.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/coop-campaign/ca44-trepidation-coop/map.bin b/mods/ca/missions/coop-campaign/ca44-trepidation-coop/map.bin new file mode 100644 index 0000000000..b6d4a8e48f Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca44-trepidation-coop/map.bin differ diff --git a/mods/ca/missions/coop-campaign/ca44-trepidation-coop/map.png b/mods/ca/missions/coop-campaign/ca44-trepidation-coop/map.png new file mode 100644 index 0000000000..d02a6d571a Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca44-trepidation-coop/map.png differ diff --git a/mods/ca/missions/coop-campaign/ca44-trepidation-coop/map.yaml b/mods/ca/missions/coop-campaign/ca44-trepidation-coop/map.yaml new file mode 100644 index 0000000000..d2f7abea9f --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca44-trepidation-coop/map.yaml @@ -0,0 +1,2068 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 44: Trepidation Co-op + +Author: Darkademic & Gandorques Hikla + +Tileset: DESERT + +MapSize: 98,100 + +Bounds: 1,1,96,98 + +Visibility: Lobby + +Categories: Co-op Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: Greece, USSR, Scrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + PlayerReference@Greece: + Name: Greece + Faction: allies + Color: 99ACF2 + Allies: England, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: USSR, Scrin, Creeps + PlayerReference@USSR: + Name: USSR + Bot: campaign + Faction: soviet + Color: FE1100 + Allies: Scrin + Enemies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@Scrin: + Name: Scrin + Bot: campaign + Faction: scrin + Color: 7700FF + Allies: USSR + Enemies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@England: + Name: England + Faction: allies + Color: A1EF8C + Allies: Greece + Enemies: USSR, Scrin, Creeps + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 99ACF2 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, England + Enemies: USSR, Scrin, Creeps + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 0B7310 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, England + Enemies: USSR, Scrin, Creeps + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 134691 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, England + Enemies: USSR, Scrin, Creeps + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 775A12 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, England + Enemies: USSR, Scrin, Creeps + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 994050 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, England + Enemies: USSR, Scrin, Creeps + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: EEA8A8 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, England + Enemies: USSR, Scrin, Creeps + +Actors: + Tanya: e7 + Owner: Greece + Location: 87,91 + SubCell: 3 + Facing: 384 + Actor225: rock2 + Owner: Neutral + Location: 13,1 + Actor227: rock3 + Owner: Neutral + Location: 32,1 + Actor228: brik + Owner: USSR + Location: 53,2 + Actor229: brik + Owner: USSR + Location: 54,2 + Actor230: brik + Owner: USSR + Location: 52,2 + Actor231: brik + Owner: USSR + Location: 51,2 + Actor232: brik + Owner: USSR + Location: 50,2 + Actor233: brik + Owner: USSR + Location: 49,2 + Actor234: brik + Owner: USSR + Location: 48,2 + Actor235: brik + Owner: USSR + Location: 47,2 + Actor236: brik + Owner: USSR + Location: 46,2 + Actor241: brik + Owner: USSR + Location: 53,3 + Actor242: brik + Owner: USSR + Location: 54,3 + Actor243: brik + Owner: USSR + Location: 46,3 + Actor244: brik + Owner: USSR + Location: 46,4 + Actor248: brik + Owner: USSR + Location: 58,2 + Actor249: brik + Owner: USSR + Location: 59,2 + Actor250: brik + Owner: USSR + Location: 60,2 + Actor251: brik + Owner: USSR + Location: 61,2 + Actor252: brik + Owner: USSR + Location: 62,2 + Actor253: brik + Owner: USSR + Location: 63,2 + Actor254: brik + Owner: USSR + Location: 64,2 + Actor255: brik + Owner: USSR + Location: 64,2 + Actor256: brik + Owner: USSR + Location: 65,2 + Actor259: brik + Owner: USSR + Location: 58,3 + Actor260: brik + Owner: USSR + Location: 59,3 + Actor264: brik + Owner: USSR + Location: 66,4 + Actor265: brik + Owner: USSR + Location: 66,2 + Actor266: brik + Owner: USSR + Location: 66,3 + Actor267: brik + Owner: USSR + Location: 67,4 + Actor269: brik + Owner: USSR + Location: 68,4 + Actor270: brik + Owner: USSR + Location: 69,4 + Actor273: brik + Owner: USSR + Location: 43,10 + Actor274: brik + Owner: USSR + Location: 43,8 + Actor278: brik + Owner: USSR + Location: 43,9 + Actor285: brik + Owner: USSR + Location: 43,11 + Actor291: brik + Owner: USSR + Location: 43,15 + Actor292: brik + Owner: USSR + Location: 46,5 + Actor293: brik + Owner: USSR + Location: 46,6 + Actor294: brik + Owner: USSR + Location: 46,8 + Actor295: brik + Owner: USSR + Location: 46,7 + Actor296: brik + Owner: USSR + Location: 45,8 + Actor297: brik + Owner: USSR + Location: 44,8 + Actor298: brik + Owner: USSR + Location: 44,11 + Actor299: brik + Owner: USSR + Location: 44,10 + Actor328: brik + Owner: USSR + Location: 44,15 + Actor344: brik + Owner: USSR + Location: 69,5 + Actor345: brik + Owner: USSR + Location: 69,6 + Actor346: brik + Owner: USSR + Location: 69,7 + Actor347: brik + Owner: USSR + Location: 70,7 + Actor348: brik + Owner: USSR + Location: 71,7 + Actor349: brik + Owner: USSR + Location: 72,7 + Actor350: brik + Owner: USSR + Location: 73,7 + Actor351: brik + Owner: USSR + Location: 73,8 + Actor352: brik + Owner: USSR + Location: 73,9 + Actor353: brik + Owner: USSR + Location: 73,10 + Actor354: brik + Owner: USSR + Location: 72,10 + Actor355: brik + Owner: USSR + Location: 72,9 + Actor376: brik + Owner: USSR + Location: 73,14 + Actor377: brik + Owner: USSR + Location: 72,14 + Actor378: brik + Owner: USSR + Location: 72,15 + Actor379: brik + Owner: USSR + Location: 73,15 + Actor386: rock2 + Owner: Neutral + Location: 92,14 + Actor391: brik + Owner: USSR + Location: 43,16 + Actor393: brik + Owner: USSR + Location: 43,18 + Actor394: brik + Owner: USSR + Location: 43,17 + Actor395: brik + Owner: USSR + Location: 43,19 + Actor396: brik + Owner: USSR + Location: 43,20 + Actor397: brik + Owner: USSR + Location: 43,21 + Actor407: brik + Owner: USSR + Location: 43,22 + Actor408: brik + Owner: USSR + Location: 43,23 + Actor421: brik + Owner: USSR + Location: 44,16 + Actor422: brik + Owner: USSR + Location: 44,23 + Actor423: brik + Owner: USSR + Location: 46,23 + Actor424: brik + Owner: USSR + Location: 45,23 + Actor425: brik + Owner: USSR + Location: 47,23 + Actor426: brik + Owner: USSR + Location: 48,23 + Actor427: brik + Owner: USSR + Location: 49,23 + Actor428: brik + Owner: USSR + Location: 49,24 + Actor436: brik + Owner: USSR + Location: 49,25 + Actor437: brik + Owner: USSR + Location: 49,26 + Actor438: brik + Owner: USSR + Location: 51,26 + Actor439: brik + Owner: USSR + Location: 50,26 + Actor440: brik + Owner: USSR + Location: 52,26 + Actor441: brik + Owner: USSR + Location: 52,25 + Actor442: brik + Owner: USSR + Location: 51,25 + Actor451: brik + Owner: USSR + Location: 60,25 + Actor452: brik + Owner: USSR + Location: 60,26 + Actor453: brik + Owner: USSR + Location: 61,26 + Actor454: brik + Owner: USSR + Location: 61,25 + Actor455: brik + Owner: USSR + Location: 62,26 + Actor456: brik + Owner: USSR + Location: 63,26 + Actor457: brik + Owner: USSR + Location: 65,26 + Actor458: brik + Owner: USSR + Location: 64,26 + Actor459: brik + Owner: USSR + Location: 73,16 + Actor460: brik + Owner: USSR + Location: 73,17 + Actor461: brik + Owner: USSR + Location: 73,19 + Actor462: brik + Owner: USSR + Location: 73,18 + Actor463: brik + Owner: USSR + Location: 73,20 + Actor464: brik + Owner: USSR + Location: 73,22 + Actor465: brik + Owner: USSR + Location: 73,21 + Actor466: brik + Owner: USSR + Location: 73,23 + Actor467: brik + Owner: USSR + Location: 73,24 + Actor475: brik + Owner: USSR + Location: 66,26 + Actor476: brik + Owner: USSR + Location: 67,26 + Actor477: brik + Owner: USSR + Location: 68,26 + Actor478: brik + Owner: USSR + Location: 69,26 + Actor479: brik + Owner: USSR + Location: 70,26 + Actor480: brik + Owner: USSR + Location: 71,26 + Actor481: brik + Owner: USSR + Location: 72,26 + Actor482: brik + Owner: USSR + Location: 72,25 + Actor483: brik + Owner: USSR + Location: 73,25 + Actor484: brik + Owner: USSR + Location: 73,26 + Actor485: tc01 + Owner: Neutral + Location: 87,24 + Actor492: t04 + Owner: Neutral + Location: 81,27 + Actor123: ptur + Owner: Scrin + Location: 48,59 + TurretFacing: 668 + Actor124: ptur + Owner: Scrin + Location: 50,67 + TurretFacing: 668 + Actor125: scol + Owner: Scrin + Location: 52,49 + Actor126: scol + Owner: Scrin + Location: 51,53 + Actor128: split2 + Owner: Neutral + Location: 50,30 + Actor130: split2 + Owner: Neutral + Location: 65,30 + Actor131: split2 + Owner: Neutral + Location: 70,29 + Actor132: split2 + Owner: Neutral + Location: 17,26 + Actor133: split2 + Owner: Neutral + Location: 9,26 + Actor134: split2 + Owner: Neutral + Location: 11,19 + Actor135: ftur + Owner: USSR + Location: 52,27 + Actor136: ftur + Owner: USSR + Location: 60,27 + Actor137: ftur + Owner: USSR + Location: 74,14 + Actor138: ftur + Owner: USSR + Location: 74,10 + Actor139: ftur + Owner: USSR + Location: 42,15 + Actor140: ftur + Owner: USSR + Location: 42,11 + Actor141: sam + Owner: USSR + Location: 69,25 + Actor143: sam + Owner: USSR + Location: 44,22 + Actor144: sam + Owner: USSR + Location: 51,11 + Actor145: sam + Owner: USSR + Location: 69,8 + Actor146: sam + Owner: USSR + Location: 47,3 + Actor147: tsla + Owner: USSR + Location: 62,25 + Actor148: tsla + Owner: USSR + Location: 50,25 + Actor149: tsla + Owner: USSR + Location: 44,17 + Actor150: tsla + Owner: USSR + Location: 44,9 + Actor151: tsla + Owner: USSR + Location: 72,16 + Actor152: tsla + Owner: USSR + Location: 72,8 + Actor154: iron + Owner: USSR + Location: 57,11 + Actor156: dog + Owner: USSR + Location: 45,15 + SubCell: 3 + Facing: 245 + Actor157: dog + Owner: USSR + Location: 45,11 + SubCell: 3 + Facing: 613 + Actor158: dog + Owner: USSR + Location: 53,25 + SubCell: 3 + Facing: 709 + Actor159: dog + Owner: USSR + Facing: 384 + Location: 56,24 + SubCell: 3 + Actor160: dog + Owner: USSR + Location: 59,25 + SubCell: 3 + Facing: 259 + Actor161: dog + Owner: USSR + Location: 73,13 + SubCell: 3 + Facing: 716 + Actor162: dog + Owner: USSR + Location: 73,11 + SubCell: 3 + Facing: 757 + Actor163: dog + Owner: USSR + Location: 55,2 + SubCell: 3 + Facing: 661 + Actor164: e1 + Owner: USSR + Location: 74,15 + SubCell: 3 + Facing: 552 + Actor165: e1 + Owner: USSR + Location: 75,10 + SubCell: 3 + Facing: 736 + Actor166: e1 + Owner: USSR + Location: 76,13 + SubCell: 3 + Facing: 620 + Actor167: e1 + Owner: USSR + Location: 53,25 + SubCell: 1 + Facing: 593 + Actor169: e1 + Owner: USSR + Location: 59,26 + SubCell: 3 + Facing: 143 + Actor170: e1 + Owner: USSR + Location: 45,16 + SubCell: 3 + Facing: 109 + Actor171: e1 + Owner: USSR + Facing: 384 + Location: 45,11 + SubCell: 1 + Actor173: tpwr + Owner: USSR + Location: 63,23 + Actor174: tpwr + Owner: USSR + Location: 66,23 + Actor175: tpwr + Owner: USSR + Location: 66,20 + Actor176: tpwr + Owner: USSR + Location: 70,18 + Actor177: tpwr + Owner: USSR + Location: 70,21 + Actor178: fix + Owner: USSR + Location: 53,20 + Actor180: stek + Owner: USSR + Location: 60,12 + Actor181: dome + Owner: USSR + Location: 45,18 + Actor172: fact + Owner: USSR + Location: 47,5 + Actor182: weap + Owner: USSR + Location: 66,5 + Actor183: proc + Owner: USSR + Location: 50,17 + Actor185: afld + Owner: USSR + Location: 49,12 + Actor179: afld + Owner: USSR + Location: 49,14 + Actor184: mslo + Owner: USSR + Location: 60,16 + Actor188: tpwr + Owner: USSR + Location: 53,7 + Actor189: tpwr + Owner: USSR + Location: 57,6 + Actor190: tpwr + Owner: USSR + Location: 63,3 + Actor186: tpwr + Owner: USSR + Location: 61,7 + Actor191: barr + Owner: USSR + Location: 66,10 + Actor193: swal + Owner: Scrin + Location: 11,32 + Actor194: swal + Owner: Scrin + Location: 11,33 + Actor195: swal + Owner: Scrin + Location: 10,32 + Actor196: swal + Owner: Scrin + Location: 10,33 + Actor197: swal + Owner: Scrin + Location: 9,32 + Actor198: swal + Owner: Scrin + Location: 7,32 + Actor199: swal + Owner: Scrin + Location: 8,32 + Actor200: swal + Owner: Scrin + Location: 6,32 + Actor201: swal + Owner: Scrin + Location: 5,32 + Actor202: swal + Owner: Scrin + Location: 4,32 + Actor203: swal + Owner: Scrin + Location: 3,33 + Actor204: swal + Owner: Scrin + Location: 4,33 + Actor205: swal + Owner: Scrin + Location: 3,34 + Actor206: swal + Owner: Scrin + Location: 3,35 + Actor207: swal + Owner: Scrin + Location: 3,36 + Actor208: swal + Owner: Scrin + Location: 3,37 + Actor209: swal + Owner: Scrin + Location: 3,38 + Actor210: swal + Owner: Scrin + Location: 3,39 + Actor211: swal + Owner: Scrin + Location: 3,40 + Actor212: swal + Owner: Scrin + Location: 4,40 + Actor213: swal + Owner: Scrin + Location: 4,41 + Actor214: swal + Owner: Scrin + Location: 4,42 + Actor215: swal + Owner: Scrin + Location: 4,43 + Actor216: swal + Owner: Scrin + Location: 4,44 + Actor217: swal + Owner: Scrin + Location: 4,45 + Actor218: swal + Owner: Scrin + Location: 4,46 + Actor219: swal + Owner: Scrin + Location: 4,47 + Actor220: swal + Owner: Scrin + Location: 5,47 + Actor221: swal + Owner: Scrin + Location: 7,47 + Actor222: swal + Owner: Scrin + Location: 9,47 + Actor223: swal + Owner: Scrin + Location: 11,47 + Actor224: swal + Owner: Scrin + Location: 10,47 + Actor226: swal + Owner: Scrin + Location: 8,47 + Actor237: swal + Owner: Scrin + Location: 6,47 + Actor238: swal + Owner: Scrin + Location: 12,47 + Actor239: swal + Owner: Scrin + Location: 12,46 + Actor240: swal + Owner: Scrin + Location: 11,46 + Actor245: swal + Owner: Scrin + Location: 17,46 + Actor246: swal + Owner: Scrin + Location: 17,47 + Actor247: swal + Owner: Scrin + Location: 19,47 + Actor257: swal + Owner: Scrin + Location: 18,47 + Actor258: swal + Owner: Scrin + Location: 18,46 + Actor261: swal + Owner: Scrin + Location: 20,46 + Actor262: swal + Owner: Scrin + Location: 20,47 + Actor263: swal + Owner: Scrin + Location: 21,46 + Actor268: swal + Owner: Scrin + Location: 22,46 + Actor271: swal + Owner: Scrin + Location: 22,45 + Actor272: swal + Owner: Scrin + Location: 21,45 + Actor275: swal + Owner: Scrin + Location: 22,44 + Actor276: swal + Owner: Scrin + Location: 23,45 + Actor277: swal + Owner: Scrin + Location: 23,44 + Actor279: swal + Owner: Scrin + Location: 24,44 + Actor280: swal + Owner: Scrin + Location: 24,43 + Actor281: swal + Owner: Scrin + Location: 23,43 + Actor282: swal + Owner: Scrin + Location: 25,43 + Actor283: swal + Owner: Scrin + Location: 25,42 + Actor284: swal + Owner: Scrin + Location: 24,42 + Actor286: swal + Owner: Scrin + Location: 26,42 + Actor287: swal + Owner: Scrin + Location: 26,41 + Actor288: swal + Owner: Scrin + Location: 25,41 + Actor289: swal + Owner: Scrin + Location: 26,40 + Actor290: swal + Owner: Scrin + Location: 26,39 + Actor300: swal + Owner: Scrin + Location: 26,38 + Actor301: swal + Owner: Scrin + Location: 26,37 + Actor302: swal + Owner: Scrin + Location: 27,37 + Actor303: swal + Owner: Scrin + Location: 27,36 + Actor304: swal + Owner: Scrin + Location: 26,36 + Actor305: swal + Owner: Scrin + Location: 27,35 + Actor306: swal + Owner: Scrin + Location: 27,34 + Actor307: swal + Owner: Scrin + Location: 27,33 + Actor308: swal + Owner: Scrin + Location: 27,32 + Actor309: swal + Owner: Scrin + Location: 26,32 + Actor310: swal + Owner: Scrin + Location: 26,33 + Actor311: swal + Owner: Scrin + Location: 20,31 + Actor312: swal + Owner: Scrin + Location: 21,31 + Actor313: swal + Owner: Scrin + Location: 20,32 + Actor314: swal + Owner: Scrin + Location: 21,32 + Actor315: swal + Owner: Scrin + Location: 19,31 + Actor316: swal + Owner: Scrin + Location: 18,31 + Actor317: swal + Owner: Scrin + Location: 17,32 + Actor318: swal + Owner: Scrin + Location: 17,31 + Actor319: swal + Owner: Scrin + Location: 18,32 + Actor320: proc.scrin + Owner: Scrin + Location: 18,32 + Actor321: ptur + Owner: Scrin + Location: 11,48 + Actor322: ptur + Owner: Scrin + Location: 18,48 + Actor323: ptur + Owner: Scrin + Location: 26,31 + Actor324: scol + Owner: Scrin + Location: 10,46 + Actor325: scol + Owner: Scrin + Location: 19,46 + Actor327: wsph + Owner: Scrin + Location: 18,38 + Actor329: nerv + Owner: Scrin + Location: 4,37 + Actor330: grav + Owner: Scrin + Location: 5,44 + Actor331: shar + Owner: Scrin + Location: 21,44 + Actor332: shar + Owner: Scrin + Location: 23,42 + Actor333: rea2 + Owner: Scrin + Location: 7,40 + Actor334: rea2 + Owner: Scrin + Location: 7,37 + Actor336: reac + Owner: Scrin + Location: 24,38 + Actor337: reac + Owner: Scrin + Location: 4,34 + Actor335: rea2 + Owner: Scrin + Location: 7,34 + Actor326: port + Owner: Scrin + Location: 15,41 + Actor338: srep + Owner: Scrin + Location: 11,39 + Actor339: rock6 + Owner: Neutral + Faction: scrin + Location: 10,65 + Actor340: rock3 + Owner: Neutral + Faction: scrin + Location: 36,33 + Actor341: v20 + Owner: Neutral + Location: 89,57 + Actor342: v10 + Owner: Neutral + Location: 90,66 + Actor343: v24 + Owner: Neutral + Location: 85,60 + Actor356: v25 + Owner: Neutral + Location: 88,61 + Actor357: t18 + Owner: Neutral + Location: 90,56 + Actor358: v28 + Owner: Neutral + Location: 87,54 + Actor359: v21 + Owner: Neutral + Location: 81,64 + Actor360: v22 + Owner: Neutral + Location: 94,52 + Actor361: rock2 + Owner: Neutral + Location: 80,73 + Actor364: split2 + Owner: Neutral + Location: 9,92 + Actor365: split2 + Owner: Neutral + Location: 20,76 + Actor363: split3 + Owner: Neutral + Location: 41,51 + Actor366: split3 + Owner: Neutral + Location: 46,50 + Actor367: apoc + Owner: USSR + Location: 78,15 + Facing: 641 + Actor368: apoc + Owner: USSR + Location: 54,34 + Facing: 518 + Actor369: btr.ai + Owner: USSR + Facing: 384 + Location: 59,23 + Actor370: btr.ai + Owner: USSR + Facing: 384 + Location: 47,20 + Actor372: btr.ai + Owner: USSR + Facing: 384 + Location: 50,7 + Actor373: btr.ai + Owner: USSR + Location: 64,9 + Facing: 620 + Actor374: 4tnk + Owner: USSR + Facing: 384 + Location: 40,19 + Actor375: 4tnk + Owner: USSR + Facing: 384 + Location: 41,26 + Actor380: 4tnk + Owner: USSR + Location: 61,33 + Facing: 518 + Actor381: isu + Owner: USSR + Location: 79,10 + Facing: 620 + Actor382: 3tnk + Owner: USSR + Location: 78,18 + Facing: 641 + Actor383: 3tnk + Owner: USSR + Location: 81,16 + Facing: 641 + Actor384: 3tnk + Owner: USSR + Location: 58,34 + Facing: 512 + Actor385: 3tnk + Owner: USSR + Facing: 384 + Location: 38,23 + Actor387: v2rl + Owner: USSR + Facing: 384 + Location: 62,15 + Actor388: v2rl + Owner: USSR + Facing: 384 + Location: 56,11 + Actor389: v2rl + Owner: USSR + Facing: 384 + Location: 45,9 + Actor390: v2rl + Owner: USSR + Facing: 384 + Location: 48,22 + Actor392: 4tnk + Owner: USSR + Location: 59,49 + Facing: 511 + Actor398: 3tnk + Owner: USSR + Location: 56,52 + Facing: 512 + Actor399: 3tnk + Owner: USSR + Location: 62,51 + Facing: 512 + Actor400: btr.ai + Owner: USSR + Location: 59,52 + Facing: 512 + Actor401: ttra + Owner: USSR + Facing: 384 + Location: 51,16 + Actor187: sam + Owner: USSR + Location: 58,13 + Actor402: ctnk + Owner: Greece + Location: 86,93 + Facing: 128 + Actor403: ctnk + Owner: Greece + Location: 89,90 + Facing: 128 + Actor404: ttnk + Owner: USSR + Location: 37,84 + Facing: 920 + Actor406: ruin + Owner: Scrin + Location: 37,47 + Facing: 736 + Actor409: ruin + Owner: Scrin + Location: 9,46 + Facing: 552 + Actor410: ruin + Owner: Scrin + Location: 25,37 + Facing: 695 + Actor411: ruin + Owner: Scrin + Location: 20,45 + Facing: 600 + TurretFacing: 1023 + Actor412: corr + Owner: Scrin + Facing: 384 + Location: 43,49 + Actor413: corr + Owner: Scrin + Location: 21,79 + Facing: 600 + Actor414: seek + Owner: Scrin + Location: 47,62 + Facing: 811 + Actor415: seek + Owner: Scrin + Location: 47,64 + Facing: 791 + Actor416: s1 + Owner: Scrin + Location: 58,52 + SubCell: 3 + Facing: 668 + Actor417: s1 + Owner: Scrin + Facing: 384 + Location: 56,51 + SubCell: 3 + Actor418: s1 + Owner: Scrin + Location: 47,61 + SubCell: 3 + Facing: 784 + Actor419: s1 + Owner: Scrin + Location: 43,64 + SubCell: 3 + Facing: 729 + Actor420: s1 + Owner: Scrin + Facing: 384 + Location: 44,53 + SubCell: 3 + Actor429: s1 + Owner: Scrin + Facing: 384 + Location: 32,49 + SubCell: 3 + Actor430: s1 + Owner: Scrin + Location: 9,49 + SubCell: 3 + Facing: 804 + Actor431: s1 + Owner: Scrin + Location: 10,49 + SubCell: 3 + Facing: 668 + Actor432: s1 + Owner: Scrin + Location: 22,49 + SubCell: 3 + Facing: 702 + Actor433: s1 + Owner: Scrin + Location: 23,47 + SubCell: 3 + Facing: 688 + Actor434: s1 + Owner: Scrin + Facing: 384 + Location: 28,44 + SubCell: 3 + Actor435: s1 + Owner: Scrin + Facing: 384 + Location: 22,37 + SubCell: 3 + Actor443: s1 + Owner: Scrin + Facing: 384 + Location: 11,37 + SubCell: 3 + Actor444: s1 + Owner: Scrin + Facing: 384 + Location: 6,40 + SubCell: 3 + Actor445: s1 + Owner: Scrin + Facing: 384 + Location: 6,37 + SubCell: 3 + Actor446: s1 + Owner: Scrin + Facing: 384 + Location: 9,33 + SubCell: 3 + Actor447: s1 + Owner: Scrin + Facing: 384 + Location: 24,77 + SubCell: 3 + Actor448: s1 + Owner: Scrin + Facing: 384 + Location: 24,73 + SubCell: 3 + Actor449: s1 + Owner: Scrin + Facing: 384 + Location: 14,59 + SubCell: 3 + Actor450: s1 + Owner: Scrin + Location: 10,58 + SubCell: 3 + Facing: 634 + Actor468: s1 + Owner: Scrin + Facing: 384 + Location: 8,64 + SubCell: 3 + Actor469: s4 + Owner: Scrin + Location: 10,64 + SubCell: 3 + Facing: 620 + Actor470: s4 + Owner: Scrin + Facing: 384 + Location: 9,58 + SubCell: 3 + Actor471: evis + Owner: Scrin + Facing: 384 + Location: 43,47 + SubCell: 3 + Actor472: evis + Owner: Scrin + Location: 25,73 + SubCell: 3 + Facing: 647 + Actor473: s3 + Owner: Scrin + Facing: 384 + Location: 8,43 + SubCell: 3 + Actor474: s3 + Owner: Scrin + Facing: 384 + Location: 10,36 + SubCell: 3 + Actor486: s3 + Owner: Scrin + Facing: 384 + Location: 26,35 + SubCell: 3 + Actor487: s3 + Owner: Scrin + Facing: 384 + Location: 20,41 + SubCell: 3 + Actor488: s3 + Owner: Scrin + Location: 17,60 + SubCell: 3 + Facing: 634 + Actor489: s3 + Owner: Scrin + Facing: 384 + Location: 11,51 + SubCell: 3 + Actor490: s3 + Owner: Scrin + Location: 30,47 + SubCell: 3 + Facing: 736 + Actor491: tpod + Owner: Scrin + Location: 12,44 + Facing: 600 + Actor493: tpod + Owner: Scrin + Facing: 384 + Location: 24,35 + Actor495: rtpd + Owner: Scrin + Location: 63,28 + Facing: 606 + Actor496: shrw + Owner: Scrin + Location: 30,45 + Facing: 552 + Actor497: shrw + Owner: Scrin + Location: 22,48 + Facing: 606 + Actor498: shrw + Owner: Scrin + Location: 11,50 + Facing: 586 + Actor500: devo + Owner: Scrin + Location: 12,82 + Facing: 384 + Actor501: s1 + Owner: Scrin + Facing: 384 + Location: 13,82 + SubCell: 3 + Actor502: s1 + Owner: Scrin + Facing: 384 + Location: 12,81 + SubCell: 3 + Actor503: s1 + Owner: Scrin + Facing: 384 + Location: 10,83 + SubCell: 3 + Actor504: s1 + Owner: Scrin + Facing: 384 + Location: 17,84 + SubCell: 3 + Actor505: s1 + Owner: Scrin + Facing: 384 + Location: 35,76 + SubCell: 3 + Actor506: e1 + Owner: USSR + Location: 68,87 + SubCell: 3 + Facing: 620 + Actor507: e1 + Owner: USSR + Location: 70,85 + SubCell: 3 + Facing: 668 + Actor508: e1 + Owner: USSR + Facing: 384 + Location: 73,83 + SubCell: 3 + Actor510: e1 + Owner: USSR + Location: 65,87 + SubCell: 3 + Facing: 811 + Actor511: e3 + Owner: USSR + Location: 68,84 + SubCell: 3 + Facing: 538 + Actor509: e2 + Owner: USSR + Location: 69,83 + SubCell: 3 + Facing: 491 + Actor512: 3tnk + Owner: USSR + Location: 55,82 + Facing: 384 + Actor514: v2rl + Owner: USSR + Location: 83,73 + Facing: 384 + Actor516: 3tnk + Owner: USSR + Location: 72,70 + Facing: 128 + Actor519: dog + Owner: USSR + Location: 72,73 + SubCell: 3 + Facing: 150 + Actor520: dog + Owner: USSR + Location: 73,69 + SubCell: 3 + Facing: 177 + Actor521: dog + Owner: USSR + Facing: 384 + Location: 93,61 + SubCell: 3 + Actor522: dog + Owner: USSR + Facing: 384 + Location: 86,43 + SubCell: 3 + Actor523: dog + Owner: USSR + Facing: 384 + Location: 80,24 + SubCell: 3 + Actor524: dog + Owner: USSR + Facing: 384 + Location: 59,37 + SubCell: 3 + Actor525: e1 + Owner: USSR + Facing: 384 + Location: 59,36 + SubCell: 3 + Actor526: e1 + Owner: USSR + Facing: 384 + Location: 81,24 + SubCell: 3 + Actor528: e1 + Owner: USSR + Facing: 384 + Location: 93,60 + SubCell: 3 + Actor529: e1 + Owner: USSR + Location: 85,62 + SubCell: 3 + Facing: 511 + Actor530: e1 + Owner: USSR + Location: 86,66 + SubCell: 3 + Facing: 600 + Actor531: e1 + Owner: USSR + Location: 86,55 + SubCell: 3 + Facing: 531 + Actor532: e1 + Owner: USSR + Facing: 384 + Location: 93,53 + SubCell: 3 + Actor533: e1 + Owner: USSR + Facing: 384 + Location: 93,48 + SubCell: 3 + Actor534: e1 + Owner: USSR + Location: 86,49 + SubCell: 3 + Facing: 600 + Actor535: e1 + Owner: USSR + Location: 74,69 + SubCell: 3 + Facing: 170 + Actor536: e1 + Owner: USSR + Location: 72,72 + SubCell: 3 + Facing: 197 + Actor537: e1 + Owner: USSR + Location: 75,72 + SubCell: 3 + Facing: 231 + Actor538: e1 + Owner: USSR + Location: 70,66 + SubCell: 3 + Facing: 109 + Actor539: e1 + Owner: USSR + Location: 72,65 + SubCell: 3 + Facing: 163 + Actor540: e1 + Owner: USSR + Location: 70,63 + SubCell: 3 + Facing: 163 + Actor541: e1 + Owner: USSR + Location: 59,69 + SubCell: 3 + Facing: 512 + Actor542: e2 + Owner: USSR + Location: 60,70 + SubCell: 3 + Facing: 384 + Actor543: e2 + Owner: USSR + Facing: 384 + Location: 57,73 + SubCell: 3 + Actor544: e2 + Owner: USSR + Facing: 384 + Location: 56,82 + SubCell: 3 + Actor545: e2 + Owner: USSR + Location: 58,94 + SubCell: 3 + Facing: 743 + Actor546: e2 + Owner: USSR + Location: 60,97 + SubCell: 3 + Facing: 845 + Actor547: e1 + Owner: USSR + Location: 57,93 + SubCell: 3 + Facing: 627 + Actor548: e1 + Owner: USSR + Facing: 384 + Location: 57,83 + SubCell: 3 + Actor549: e1 + Owner: USSR + Location: 60,72 + SubCell: 3 + Facing: 512 + Actor550: e1 + Owner: USSR + Facing: 384 + Location: 63,69 + SubCell: 3 + Actor551: e1 + Owner: USSR + Location: 36,83 + SubCell: 3 + Facing: 777 + Actor552: e1 + Owner: USSR + Location: 38,85 + SubCell: 3 + Facing: 627 + Actor553: e1 + Owner: USSR + Location: 42,86 + SubCell: 3 + Facing: 0 + Actor554: e1 + Owner: USSR + Location: 40,84 + SubCell: 3 + Facing: 763 + Actor555: e4 + Owner: USSR + Facing: 384 + Location: 89,60 + SubCell: 3 + Actor556: e4 + Owner: USSR + Facing: 384 + Location: 62,49 + SubCell: 3 + Actor557: e4 + Owner: USSR + Facing: 384 + Location: 57,50 + SubCell: 3 + Actor558: ovld + Owner: USSR + Location: 20,49 + Facing: 627 + ScriptTags: VeryHardAndAbove + Actor559: ovld + Owner: USSR + Facing: 384 + Location: 41,38 + Actor560: tc01 + Owner: Neutral + Faction: soviet + Location: 93,92 + Actor561: t18 + Owner: Neutral + Faction: soviet + Location: 73,96 + Actor562: t18 + Owner: Neutral + Faction: soviet + Location: 67,77 + Actor563: t18 + Owner: Neutral + Faction: soviet + Location: 49,94 + Actor564: t18 + Owner: Neutral + Faction: soviet + Location: 12,64 + Actor565: t18 + Owner: Neutral + Faction: soviet + Location: 71,52 + Actor566: t18 + Owner: Neutral + Faction: soviet + Location: 64,39 + Actor527: e1 + Owner: USSR + Location: 86,42 + SubCell: 3 + Facing: 559 + Actor567: oilb + Owner: USSR + Location: 80,45 + Actor568: e1 + Owner: USSR + Facing: 384 + Location: 8,64 + SubCell: 1 + Actor569: e1 + Owner: USSR + Facing: 384 + Location: 16,59 + SubCell: 3 + Actor570: e1 + Owner: USSR + Facing: 384 + Location: 23,50 + SubCell: 3 + Actor571: e1 + Owner: USSR + Facing: 384 + Location: 39,38 + SubCell: 3 + Actor572: e1 + Owner: USSR + Facing: 384 + Location: 42,38 + SubCell: 3 + Actor573: e1 + Owner: USSR + Facing: 384 + Location: 43,39 + SubCell: 3 + Actor574: e3 + Owner: USSR + Facing: 384 + Location: 41,37 + SubCell: 3 + Actor575: e3 + Owner: USSR + Facing: 384 + Location: 60,35 + SubCell: 3 + Actor576: e3 + Owner: USSR + Location: 34,40 + SubCell: 3 + Facing: 647 + Actor579: jeep + Owner: Greece + Location: 85,90 + Facing: 128 + Gateway: wormholexl + Owner: USSR + Location: 56,15 + Reveal1: waypoint + Owner: Neutral + Location: 79,17 + Reveal2: waypoint + Owner: Neutral + Location: 62,30 + Reveal3: waypoint + Owner: Neutral + Location: 59,53 + Reveal4: waypoint + Owner: Neutral + Location: 50,63 + McvSpawn: waypoint + Owner: Neutral + Location: 90,98 + McvDest: waypoint + Owner: Neutral + Location: 90,92 + SpyTarget: e1 + Owner: USSR + Location: 57,24 + SubCell: 3 + Facing: 384 + Actor578: camera + Owner: USSR + Location: 74,70 + Actor580: camera + Owner: USSR + Location: 59,67 + Actor581: camera + Owner: USSR + Location: 57,86 + SpyDest: waypoint + Owner: Neutral + Location: 59,15 + PlayerStart: waypoint + Owner: Neutral + Location: 84,89 + SpySafety1: waypoint + Owner: Neutral + Location: 73,90 + SpySafety2: waypoint + Owner: Neutral + Location: 74,90 + SpySafety3: waypoint + Owner: Neutral + Location: 75,90 + SpySafety4: waypoint + Owner: Neutral + Location: 76,90 + SpySafety5: waypoint + Owner: Neutral + Location: 76,89 + Kennel: kenn + Owner: USSR + Location: 47,10 + Actor582: e1 + Owner: USSR + Facing: 384 + Location: 83,72 + SubCell: 3 + Actor583: e1 + Owner: USSR + Facing: 384 + Location: 85,75 + SubCell: 3 + Actor584: e1 + Owner: USSR + Facing: 384 + Location: 88,74 + SubCell: 3 + Actor585: e1 + Owner: USSR + Facing: 384 + Location: 89,74 + SubCell: 3 + Actor586: e1 + Owner: USSR + Facing: 384 + Location: 81,71 + SubCell: 3 + Actor587: e1 + Owner: USSR + Facing: 384 + Location: 92,65 + SubCell: 3 + Actor588: e1 + Owner: USSR + Facing: 384 + Location: 94,66 + SubCell: 3 + Actor589: e1 + Owner: USSR + Facing: 384 + Location: 92,52 + SubCell: 3 + Actor590: e1 + Owner: USSR + Facing: 384 + Location: 63,69 + SubCell: 1 + Actor591: e1 + Owner: USSR + Facing: 384 + Location: 58,71 + SubCell: 3 + Actor592: e1 + Owner: USSR + Facing: 384 + Location: 59,81 + SubCell: 3 + Actor593: e2 + Owner: USSR + Facing: 384 + Location: 87,53 + SubCell: 3 + Actor594: e2 + Owner: USSR + Facing: 384 + Location: 86,54 + SubCell: 3 + Actor595: e2 + Owner: USSR + Facing: 384 + Location: 89,33 + SubCell: 3 + Actor596: e2 + Owner: USSR + Facing: 384 + Location: 87,31 + SubCell: 3 + Actor597: e2 + Owner: USSR + Location: 81,35 + SubCell: 3 + Facing: 688 + Actor598: e4 + Owner: USSR + Location: 79,31 + SubCell: 3 + Facing: 661 + Actor599: e4 + Owner: USSR + Location: 80,29 + SubCell: 3 + Facing: 586 + Actor600: e3 + Owner: USSR + Facing: 384 + Location: 92,64 + SubCell: 3 + SovietPath1a: waypoint + Owner: Neutral + Location: 53,39 + SovietPath1b: waypoint + Owner: Neutral + Location: 56,63 + SovietPath2a: waypoint + Owner: Neutral + Location: 41,33 + SovietPath2b: waypoint + Owner: Neutral + Location: 38,61 + ScrinRally1: waypoint + Owner: Neutral + Location: 9,59 + ScrinRally2: waypoint + Owner: Neutral + Location: 27,56 + VeryHardSiegeTank: isu + Owner: USSR + Location: 92,59 + ScriptTags: VeryHardAndAbove + Facing: 384 + HardTank1: 3tnk + Owner: USSR + Location: 74,72 + ScriptTags: HardAndAbove + Facing: 128 + HardTank2: 3tnk + Owner: USSR + Location: 58,83 + ScriptTags: HardAndAbove + Facing: 384 + HardNukeCannon: nukc.defender + Owner: USSR + DeployState: Deployed + ScriptTags: HardAndAbove + Facing: 0 + Location: 75,59 + BrutalNukeCannon1: nukc.defender + Owner: USSR + DeployState: Deployed + ScriptTags: BrutalOnly + Facing: 0 + Location: 48,77 + BrutalNukeCannon2: nukc.defender + Owner: USSR + DeployState: Deployed + ScriptTags: BrutalOnly + Facing: 0 + Location: 51,96 + VeryHardTeslaTank: ttnk + Owner: USSR + Location: 39,85 + ScriptTags: VeryHardAndAbove + Facing: 913 + VeryHardCorrupter2: corr + Owner: Scrin + Location: 80,33 + ScriptTags: VeryHardAndAbove + Facing: 620 + VeryHardCorrupter1: corr + Owner: Scrin + Location: 91,36 + ScriptTags: VeryHardAndAbove + Facing: 384 + HardDevourer: devo + Owner: Scrin + Location: 14,83 + ScriptTags: HardAndAbove + Facing: 384 + Actor494: rtpd + Owner: Scrin + Facing: 384 + Location: 54,30 + Actor513: split2 + Owner: Neutral + Location: 57,31 + Actor499: oilb + Owner: USSR + Location: 86,81 + Actor515: oilb + Owner: USSR + Location: 93,82 + Actor517: brl3 + Owner: USSR + Location: 88,82 + Actor518: brl3 + Owner: USSR + Location: 92,82 + Actor601: barl + Owner: USSR + Location: 92,83 + Actor602: barl + Owner: USSR + Location: 89,81 + Actor603: barl + Owner: USSR + Location: 95,82 + Actor604: brl3 + Owner: USSR + Location: 84,82 + Actor605: barl + Owner: USSR + Location: 83,81 + Actor606: barl + Owner: USSR + Location: 85,82 + Actor608: fenc + Owner: USSR + Location: 28,13 + Actor609: fenc + Owner: USSR + Location: 27,13 + Actor610: fenc + Owner: USSR + Location: 27,14 + Actor611: fenc + Owner: USSR + Location: 27,15 + Actor612: fenc + Owner: USSR + Location: 27,16 + Actor613: fenc + Owner: USSR + Location: 27,17 + Actor614: fenc + Owner: USSR + Location: 27,18 + Actor615: fenc + Owner: USSR + Location: 26,18 + Actor616: fenc + Owner: USSR + Location: 29,13 + Actor617: fenc + Owner: USSR + Location: 30,13 + Actor618: fenc + Owner: USSR + Location: 31,13 + Actor619: fenc + Owner: USSR + Location: 31,12 + SecondaryBarracks: barr + Owner: USSR + Location: 28,14 + Actor607: ftur + Owner: USSR + Location: 31,16 + Actor620: e1 + Owner: USSR + Facing: 384 + Location: 28,19 + SubCell: 3 + Actor621: e1 + Owner: USSR + Location: 28,18 + SubCell: 3 + Facing: 552 + Actor622: e1 + Owner: USSR + Location: 32,17 + SubCell: 3 + Facing: 552 + Actor623: e1 + Owner: USSR + Location: 31,15 + SubCell: 3 + Facing: 688 + Actor624: e1 + Owner: USSR + Location: 33,14 + SubCell: 3 + Facing: 722 + Actor625: e1 + Owner: USSR + Facing: 384 + Location: 28,18 + SubCell: 1 + Actor626: e3 + Owner: USSR + Facing: 384 + Location: 32,16 + SubCell: 3 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|missions/main-campaign/ca44-trepidation/trepidation-rules.yaml, ca|rules/custom/coop-rules.yaml, trepidation-coop-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/coop-campaign/ca44-trepidation-coop/trepidation-coop-rules.yaml b/mods/ca/missions/coop-campaign/ca44-trepidation-coop/trepidation-coop-rules.yaml new file mode 100644 index 0000000000..d301eed008 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca44-trepidation-coop/trepidation-coop-rules.yaml @@ -0,0 +1,6 @@ +World: + LuaScript: + Scripts: campaign.lua, coop.lua, ca|missions/main-campaign/ca44-trepidation/trepidation.lua, trepidation-coop.lua + LobbyMissionInfo@InitialObjectives: + Prefix: Initial Objectives + Text: • Rendezvous with Spy and bring him to the evacuation point.\n• Eliminate all Soviet and Scrin forces. diff --git a/mods/ca/missions/coop-campaign/ca44-trepidation-coop/trepidation-coop.lua b/mods/ca/missions/coop-campaign/ca44-trepidation-coop/trepidation-coop.lua new file mode 100644 index 0000000000..13677ba79b --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca44-trepidation-coop/trepidation-coop.lua @@ -0,0 +1,62 @@ + +SetupPlayers = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Multi2 = Player.GetPlayer("Multi2") + Multi3 = Player.GetPlayer("Multi3") + Multi4 = Player.GetPlayer("Multi4") + Multi5 = Player.GetPlayer("Multi5") + Greece = Player.GetPlayer("Greece") + USSR = Player.GetPlayer("USSR") + Scrin = Player.GetPlayer("Scrin") + England = Player.GetPlayer("England") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = Utils.Where({ Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 }, function(p) return p ~= nil end) + MissionEnemies = { USSR, Scrin } + SinglePlayerPlayer = Greece + CoopInit() +end + +AfterWorldLoaded = function() + StartCashSpread(3500) + + if #MissionPlayers > 4 then + Actor.Create("ctnk", true, { Owner = Greece, Location = CPos.New(84, 95) }) + + if #MissionPlayers > 5 then + Actor.Create("ctnk", true, { Owner = Greece, Location = CPos.New(92, 90) }) + end + end +end + +AfterTick = function() + +end + +CreateSpy = function() + local spyPlayer + if MissionPlayers[2] ~= nil then + spyPlayer = MissionPlayers[2] + else + spyPlayer = Greece + end + + Spy = Actor.Create("spy.noinfil", true, { Owner = spyPlayer, Location = Gateway.Location }) +end + +DoMcvArrival = function() + local interval = 75 + local delay = 1 + + Utils.Do(GetMcvPlayers(), function(p) + Trigger.AfterDelay(delay, function() + Reinforcements.Reinforce(p, { "mcv" }, { McvSpawn.Location, McvDest.Location }) + end) + delay = delay + interval + end) + + Trigger.AfterDelay(delay, function() + local defenders = { "2tnk", "2tnk", "arty", "arty", "e1", "e1", "e1", "e1", "e3", "medi" } + Reinforcements.Reinforce(Greece, defenders, { McvSpawn.Location, McvDest.Location }, interval) + end) +end diff --git a/mods/ca/missions/coop-campaign/ca45-multipolarity-coop/map.bin b/mods/ca/missions/coop-campaign/ca45-multipolarity-coop/map.bin new file mode 100644 index 0000000000..c3ed46d36e Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca45-multipolarity-coop/map.bin differ diff --git a/mods/ca/missions/coop-campaign/ca45-multipolarity-coop/map.png b/mods/ca/missions/coop-campaign/ca45-multipolarity-coop/map.png new file mode 100644 index 0000000000..6db1c8fd8a Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca45-multipolarity-coop/map.png differ diff --git a/mods/ca/missions/coop-campaign/ca45-multipolarity-coop/map.yaml b/mods/ca/missions/coop-campaign/ca45-multipolarity-coop/map.yaml new file mode 100644 index 0000000000..39b401ed1a --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca45-multipolarity-coop/map.yaml @@ -0,0 +1,3845 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 45: Multipolarity Co-op + +Author: Darkademic & Gandorques Hikla + +Tileset: TEMPERAT + +MapSize: 134,134 + +Bounds: 1,1,132,132 + +Visibility: Lobby + +Categories: Co-op Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: Greece, GDI, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + PlayerReference@Greece: + Name: Greece + Faction: allies + Color: 99ACF2 + Allies: England, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: GDI, Creeps + PlayerReference@GDI: + Name: GDI + Bot: campaign + Faction: gdi + Color: F2CF74 + Enemies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@England: + Name: England + NonCombatant: True + Faction: allies + Color: 9AAD95 + PlayerReference@USSR: + Name: USSR + NonCombatant: True + Faction: soviet + Color: 5C4F45 + PlayerReference@Nod: + Name: Nod + NonCombatant: True + Faction: nod + Color: 4F545A + PlayerReference@Scrin: + Name: Scrin + NonCombatant: True + Faction: scrin + Color: 7700FF + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 99ACF2 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: GDI, Creeps + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 0B7310 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: GDI, Creeps + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 134691 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: GDI, Creeps + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 775A12 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: GDI, Creeps + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 994050 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: GDI, Creeps + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: EEA8A8 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: GDI, Creeps + +Actors: + Actor514: apwr + Location: 81,85 + Health: 39 + Owner: England + Actor515: apwr + Location: 80,88 + Health: 44 + Owner: England + Actor516: apwr + Location: 78,85 + Health: 42 + Owner: England + Actor522: fix + Location: 76,88 + Owner: England + Health: 42 + Actor531: atek + Location: 67,80 + Health: 24 + Owner: England + ScriptTags: NormalAndBelow + Actor534: dome + Location: 66,84 + Health: 43 + Owner: England + ScriptTags: HardAndBelow + Actor889: split2 + Owner: Neutral + Location: 49,130 + Actor890: split2 + Owner: Neutral + Location: 55,129 + Actor892: split2 + Owner: Neutral + Location: 44,93 + Actor893: split2 + Owner: Neutral + Location: 49,95 + Actor894: split2 + Owner: Neutral + Location: 93,95 + Actor896: split2 + Owner: Neutral + Location: 95,91 + Actor900: split2 + Owner: Neutral + Location: 119,49 + Actor901: split2 + Owner: Neutral + Location: 127,49 + Actor902: split2 + Owner: Neutral + Location: 8,57 + Actor903: split2 + Owner: Neutral + Location: 13,56 + Actor1006: t17.husk + Owner: Neutral + Faction: germany + Location: 78,101 + Actor1007: tc04.husk + Owner: Neutral + Faction: germany + Location: 84,105 + Actor1008: tc01.husk + Owner: Neutral + Faction: germany + Location: 70,106 + Actor1009: t17.husk + Owner: Neutral + Faction: germany + Location: 61,103 + Actor1010: t16.husk + Owner: Neutral + Faction: germany + Location: 59,91 + Actor1011: tc03.husk + Owner: Neutral + Faction: germany + Location: 59,99 + Actor1012: t14.husk + Owner: Neutral + Faction: germany + Location: 59,104 + Actor1013: t15.husk + Owner: Neutral + Faction: germany + Location: 84,108 + Actor1014: t13.husk + Owner: Neutral + Faction: germany + Location: 82,107 + Actor1015: t13.husk + Owner: Neutral + Faction: germany + Location: 95,106 + Actor1016: tc02.husk + Owner: Neutral + Faction: germany + Location: 89,108 + Actor1017: t17.husk + Owner: Neutral + Faction: germany + Location: 97,103 + Actor1018: t14.husk + Owner: Neutral + Faction: germany + Location: 104,101 + Actor1019: t16.husk + Owner: Neutral + Faction: germany + Location: 106,101 + Actor1020: t10.husk + Owner: Neutral + Faction: germany + Location: 102,90 + Actor1021: tc04.husk + Owner: Neutral + Faction: germany + Location: 50,109 + Actor1022: t15.husk + Owner: Neutral + Faction: germany + Location: 53,110 + Actor1023: t12.husk + Owner: Neutral + Faction: germany + Location: 46,106 + Actor1024: t03.husk + Owner: Neutral + Faction: germany + Location: 41,104 + Actor1025: t11.husk + Owner: Neutral + Faction: germany + Location: 43,54 + Actor1026: t13.husk + Owner: Neutral + Faction: germany + Location: 41,65 + Actor1027: tc01.husk + Owner: Neutral + Faction: germany + Location: 43,69 + Actor1028: t16.husk + Owner: Neutral + Faction: germany + Location: 47,57 + Actor1029: t08.husk + Owner: Neutral + Faction: germany + Location: 46,67 + Actor1030: t16.husk + Owner: Neutral + Faction: germany + Location: 47,66 + Actor1031: tc02.husk + Owner: Neutral + Faction: germany + Location: 39,75 + Actor1032: t14.husk + Owner: Neutral + Faction: germany + Location: 39,73 + Actor1033: t05.husk + Owner: Neutral + Faction: germany + Location: 46,69 + Actor1034: t03.husk + Owner: Neutral + Faction: germany + Location: 46,59 + Actor1036: t10.husk + Owner: Neutral + Faction: germany + Location: 90,64 + Actor1037: t15.husk + Owner: Neutral + Faction: germany + Location: 90,61 + Actor1038: t16.husk + Owner: Neutral + Faction: germany + Location: 90,78 + Actor1039: t15.husk + Owner: Neutral + Faction: germany + Location: 94,84 + Actor1040: t14.husk + Owner: Neutral + Faction: germany + Location: 92,81 + Actor1041: t15.husk + Owner: Neutral + Faction: germany + Location: 86,93 + Actor1042: t03.husk + Owner: Neutral + Faction: germany + Location: 86,91 + Actor1044: t11.husk + Owner: Neutral + Faction: germany + Location: 87,81 + Actor1045: tc01.husk + Owner: Neutral + Faction: germany + Location: 89,82 + Actor1046: t08.husk + Owner: Neutral + Faction: germany + Location: 92,76 + Actor1047: t14.husk + Owner: Neutral + Faction: germany + Location: 91,65 + Actor1048: t16.husk + Owner: Neutral + Faction: germany + Location: 93,68 + Actor1049: t17.husk + Owner: Neutral + Faction: germany + Location: 93,63 + Actor1050: tc03.husk + Owner: Neutral + Faction: germany + Location: 92,67 + Actor1051: tc04.husk + Owner: Neutral + Faction: germany + Location: 31,94 + Actor1052: tc04 + Owner: Neutral + Faction: germany + Location: 42,115 + Actor1053: t02 + Owner: Neutral + Faction: germany + Location: 45,114 + Actor1054: t13 + Owner: Neutral + Faction: germany + Location: 39,116 + Actor1056: tc05 + Owner: Neutral + Faction: germany + Location: 34,116 + Actor1057: t05 + Owner: Neutral + Faction: germany + Location: 37,113 + Actor1058: t02 + Owner: Neutral + Faction: germany + Location: 31,114 + Actor1059: t03 + Owner: Neutral + Faction: germany + Location: 36,127 + Actor1060: tc01 + Owner: Neutral + Faction: germany + Location: 96,112 + Actor1061: t14 + Owner: Neutral + Faction: germany + Location: 100,115 + Actor1062: t13 + Owner: Neutral + Faction: germany + Location: 99,117 + Actor1063: t01 + Owner: Neutral + Faction: germany + Location: 98,115 + Actor1064: t16 + Owner: Neutral + Faction: germany + Location: 106,118 + Actor1065: ice01 + Owner: Neutral + Faction: germany + Location: 27,108 + Actor1066: tc02.husk + Owner: Neutral + Faction: germany + Location: 120,92 + Actor1067: t10.husk + Owner: Neutral + Faction: germany + Location: 125,94 + Actor1068: t06.husk + Owner: Neutral + Faction: germany + Location: 110,77 + Actor1069: t07.husk + Owner: Neutral + Faction: germany + Location: 97,73 + Actor1070: tc05.husk + Owner: Neutral + Faction: germany + Location: 95,56 + Actor1071: tc01.husk + Owner: Neutral + Faction: germany + Location: 97,46 + Actor1073: t07.husk + Owner: Neutral + Faction: germany + Location: 42,46 + Actor1074: t03.husk + Owner: Neutral + Faction: germany + Location: 26,43 + Actor1075: tc05.husk + Owner: Neutral + Faction: germany + Location: 22,30 + Actor1076: t01.husk + Owner: Neutral + Faction: germany + Location: 23,28 + Actor1077: t15.husk + Owner: Neutral + Faction: germany + Location: 19,33 + Actor1078: tc02.husk + Owner: Neutral + Faction: germany + Location: 24,28 + Actor1079: t05.husk + Owner: Neutral + Faction: germany + Location: 18,35 + Actor1080: t08.husk + Owner: Neutral + Faction: germany + Location: 27,30 + Actor1087: tc04.husk + Owner: Neutral + Location: 102,8 + Actor1088: t15.husk + Owner: Neutral + Location: 97,4 + Actor1089: t07.husk + Owner: Neutral + Location: 101,2 + Actor1090: t10.husk + Owner: Neutral + Location: 90,1 + Actor1091: t10.husk + Owner: Neutral + Location: 99,6 + Actor1092: tc05.husk + Owner: Neutral + Location: 96,6 + Actor1093: t17.husk + Owner: Neutral + Location: 108,6 + Actor1094: t13.husk + Owner: Neutral + Location: 111,9 + Actor1095: t11.husk + Owner: Neutral + Location: 110,17 + Actor1098: t11.husk + Owner: Neutral + Location: 127,33 + Actor1099: tc05.husk + Owner: Neutral + Location: 122,38 + Actor1100: t17.husk + Owner: Neutral + Location: 120,37 + Actor1101: t12.husk + Owner: Neutral + Location: 109,31 + Actor1102: tc01.husk + Owner: Neutral + Location: 107,30 + Actor1105: t07.husk + Owner: Neutral + Location: 109,28 + Actor1106: t10.husk + Owner: Neutral + Location: 106,24 + Actor1108: t14.husk + Owner: Neutral + Location: 124,85 + Actor1109: t11.husk + Owner: Neutral + Location: 129,74 + Actor1111: tc04 + Owner: Neutral + Location: 120,126 + Actor1112: t13 + Owner: Neutral + Location: 123,123 + Actor1113: tc03 + Owner: Neutral + Location: 107,129 + Actor1114: tc04.husk + Owner: Neutral + Location: 114,108 + Actor1115: tc01.husk + Owner: Neutral + Location: 120,102 + Actor1116: tc02.husk + Owner: Neutral + Location: 110,98 + Actor1117: t17.husk + Owner: Neutral + Location: 109,96 + Actor1118: t03.husk + Owner: Neutral + Location: 115,83 + Actor1120: t15.husk + Owner: Neutral + Location: 129,104 + Actor1121: t16.husk + Owner: Neutral + Location: 131,100 + Actor1122: t02.husk + Owner: Neutral + Location: 101,62 + Actor1123: split2 + Owner: Neutral + Location: 119,117 + Actor1124: split2 + Owner: Neutral + Location: 13,123 + Actor1125: split2 + Owner: Neutral + Location: 11,119 + Actor1126: split2 + Owner: Neutral + Location: 121,83 + Actor1127: split2 + Owner: Neutral + Location: 126,81 + Actor1128: split2 + Owner: Neutral + Location: 3,90 + Actor1129: tc04.husk + Owner: Neutral + Location: 79,65 + Actor1130: t15.husk + Owner: Neutral + Location: 84,71 + Actor1132: t02.husk + Owner: Neutral + Location: 86,57 + Actor1133: t05.husk + Owner: Neutral + Location: 56,57 + Actor1134: t03.husk + Owner: Neutral + Location: 49,62 + Actor1135: tc03.husk + Owner: Neutral + Location: 54,68 + Actor1136: t15.husk + Owner: Neutral + Location: 59,64 + Actor1137: t12.husk + Owner: Neutral + Location: 51,77 + Actor1138: tc04.husk + Owner: Neutral + Location: 45,79 + Actor1139: tc05.husk + Owner: Neutral + Location: 51,73 + Actor1140: t07.husk + Owner: Neutral + Location: 50,83 + Actor1141: t11.husk + Owner: Neutral + Location: 57,83 + Actor1142: t01.husk + Owner: Neutral + Location: 62,74 + Actor1143: t14.husk + Owner: Neutral + Location: 80,77 + Actor1144: t15.husk + Owner: Neutral + Location: 94,126 + Actor1145: t13.husk + Owner: Neutral + Location: 16,18 + Actor1151: t07.husk + Owner: Neutral + Location: 35,4 + Actor1153: tc01.husk + Owner: Neutral + Location: 13,19 + Actor1154: t15.husk + Owner: Neutral + Location: 6,23 + Actor1155: t07.husk + Owner: Neutral + Location: 1,19 + Actor1317: tc05.husk + Owner: Neutral + Location: 29,78 + Actor1318: t01.husk + Owner: Neutral + Location: 31,70 + Actor1319: t12.husk + Owner: Neutral + Location: 30,76 + Actor1320: t05.husk + Owner: Neutral + Location: 32,59 + Actor1321: t15.husk + Owner: Neutral + Location: 31,52 + Actor1423: t11.husk + Owner: Neutral + Location: 27,2 + Actor1435: tc01.husk + Owner: Neutral + Location: 25,4 + Actor1511: t02.husk + Owner: Neutral + Location: 27,10 + Actor1646: tent + Location: 66,88 + Health: 47 + Owner: England + Actor1648: hpad + Location: 69,89 + Owner: England + Health: 43 + ScriptTags: VeryHardAndBelow + Actor1652: weap + Location: 69,84 + Owner: England + Health: 44 + Actor1110: t07.husk + Owner: Neutral + Location: 130,77 + Actor399: brik + Owner: GDI + Location: 59,34 + Actor400: brik + Owner: GDI + Location: 59,33 + Actor402: brik + Owner: GDI + Location: 60,34 + Actor403: brik + Owner: GDI + Location: 59,32 + Actor404: brik + Owner: GDI + Location: 58,32 + Actor405: brik + Owner: GDI + Location: 58,30 + Actor410: brik + Owner: GDI + Location: 58,31 + Actor411: brik + Owner: GDI + Location: 58,29 + Actor412: brik + Owner: GDI + Location: 58,27 + Actor413: brik + Owner: GDI + Location: 58,28 + Actor415: brik + Owner: GDI + Location: 58,23 + Actor416: brik + Owner: GDI + Location: 59,23 + Actor417: brik + Owner: GDI + Location: 59,22 + Actor418: brik + Owner: GDI + Location: 59,21 + Actor419: brik + Owner: GDI + Location: 58,24 + Actor420: brik + Owner: GDI + Location: 58,25 + Actor421: brik + Owner: GDI + Location: 58,26 + Actor422: brik + Owner: GDI + Location: 60,21 + Actor423: brik + Owner: GDI + Location: 61,21 + Actor424: brik + Owner: GDI + Location: 61,20 + Actor425: brik + Owner: GDI + Location: 61,19 + Actor426: brik + Owner: GDI + Location: 63,19 + Actor427: brik + Owner: GDI + Location: 62,19 + Actor428: brik + Owner: GDI + Location: 64,19 + Actor429: brik + Owner: GDI + Location: 65,19 + Actor430: brik + Owner: GDI + Location: 65,18 + Actor431: brik + Owner: GDI + Location: 66,18 + Actor432: brik + Owner: GDI + Location: 67,18 + Actor433: brik + Owner: GDI + Location: 67,19 + Actor434: brik + Owner: GDI + Location: 68,19 + Actor435: brik + Owner: GDI + Location: 69,19 + Actor438: brik + Owner: GDI + Location: 70,19 + Actor442: brik + Owner: GDI + Location: 71,19 + Actor487: brik + Owner: GDI + Location: 71,20 + Actor488: brik + Owner: GDI + Location: 72,20 + Actor489: brik + Owner: GDI + Location: 72,21 + Actor517: brik + Owner: GDI + Location: 72,22 + Actor518: brik + Owner: GDI + Location: 73,22 + Actor519: brik + Owner: GDI + Location: 73,23 + Actor520: brik + Owner: GDI + Location: 73,24 + Actor521: brik + Owner: GDI + Location: 74,24 + Actor524: brik + Owner: GDI + Location: 74,25 + Actor525: brik + Owner: GDI + Location: 74,26 + Actor526: brik + Owner: GDI + Location: 74,28 + Actor527: brik + Owner: GDI + Location: 74,27 + Actor528: brik + Owner: GDI + Location: 74,29 + Actor532: brik + Owner: GDI + Location: 74,30 + Actor533: brik + Owner: GDI + Location: 74,31 + Actor540: brik + Owner: GDI + Location: 74,32 + Actor541: brik + Owner: GDI + Location: 74,33 + Actor542: brik + Owner: GDI + Location: 73,33 + Actor543: brik + Owner: GDI + Location: 72,33 + Actor544: brik + Owner: GDI + Location: 72,34 + Actor545: brik + Owner: GDI + Location: 71,34 + Actor546: brik + Owner: GDI + Location: 70,34 + Actor547: brik + Owner: GDI + Location: 70,35 + Actor548: brik + Owner: GDI + Location: 61,34 + Actor549: brik + Owner: GDI + Location: 61,35 + Actor550: brik + Owner: GDI + Location: 61,36 + Actor551: brik + Owner: GDI + Location: 61,37 + Actor552: brik + Owner: GDI + Location: 61,38 + Actor553: brik + Owner: GDI + Location: 62,38 + Actor554: brik + Owner: GDI + Location: 63,38 + Actor555: brik + Owner: GDI + Location: 64,38 + Actor556: brik + Owner: GDI + Location: 64,37 + Actor557: brik + Owner: GDI + Location: 63,37 + Actor558: brik + Owner: GDI + Location: 70,36 + Actor559: brik + Owner: GDI + Location: 70,37 + Actor560: brik + Owner: GDI + Location: 70,38 + Actor561: brik + Owner: GDI + Location: 68,38 + Actor562: brik + Owner: GDI + Location: 69,38 + Actor563: brik + Owner: GDI + Location: 67,38 + Actor564: brik + Owner: GDI + Location: 67,37 + Actor565: brik + Owner: GDI + Location: 68,37 + Actor566: afac + Owner: GDI + Location: 52,30 + Actor567: brik + Owner: GDI + Location: 38,38 + Actor568: brik + Owner: GDI + Location: 38,39 + Actor569: brik + Owner: GDI + Location: 39,39 + Actor570: brik + Owner: GDI + Location: 38,37 + Actor571: brik + Owner: GDI + Location: 38,36 + Actor572: brik + Owner: GDI + Location: 39,36 + Actor573: brik + Owner: GDI + Location: 39,37 + Actor574: brik + Owner: GDI + Location: 39,40 + Actor575: brik + Owner: GDI + Location: 39,41 + Actor576: brik + Owner: GDI + Location: 38,31 + Actor577: brik + Owner: GDI + Location: 38,30 + Actor579: brik + Owner: GDI + Location: 38,32 + Actor580: brik + Owner: GDI + Location: 39,32 + Actor581: brik + Owner: GDI + Location: 39,31 + Actor582: brik + Owner: GDI + Location: 38,29 + Actor578: brik + Owner: GDI + Location: 39,29 + Actor583: brik + Owner: GDI + Location: 39,28 + Actor584: brik + Owner: GDI + Location: 39,26 + Actor585: brik + Owner: GDI + Location: 39,25 + Actor586: brik + Owner: GDI + Location: 39,27 + Actor587: brik + Owner: GDI + Location: 40,25 + Actor588: brik + Owner: GDI + Location: 40,24 + Actor589: brik + Owner: GDI + Location: 40,23 + Actor590: brik + Owner: GDI + Location: 40,22 + Actor591: brik + Owner: GDI + Location: 40,21 + Actor592: brik + Owner: GDI + Location: 40,20 + Actor593: brik + Owner: GDI + Location: 41,20 + Actor594: brik + Owner: GDI + Location: 42,20 + Actor595: brik + Owner: GDI + Location: 43,20 + Actor631: brik + Owner: GDI + Location: 40,41 + Actor630: nuk2 + Owner: GDI + Location: 53,26 + Actor652: nuk2 + Owner: GDI + Location: 51,26 + Actor687: nuk2 + Owner: GDI + Location: 48,26 + Actor691: nuk2 + Owner: GDI + Location: 46,26 + Actor700: nuk2 + Owner: GDI + Location: 46,30 + Actor701: nuk2 + Owner: GDI + Location: 48,30 + Actor729: proc.td + Owner: GDI + Location: 41,21 + Actor599: barb + Owner: GDI + Location: 62,39 + Actor601: barb + Owner: GDI + Location: 63,39 + Actor761: barb + Owner: GDI + Location: 68,39 + Actor762: barb + Owner: GDI + Location: 69,39 + Actor765: barb + Owner: GDI + Location: 70,39 + Actor770: atwr + Owner: GDI + Location: 62,37 + Actor772: atwr + Owner: GDI + Location: 69,37 + Actor774: atwr + Owner: GDI + Location: 60,33 + Actor775: atwr + Owner: GDI + Location: 71,33 + Actor776: cram + Owner: GDI + Location: 59,31 + Actor782: cram + Owner: GDI + Location: 73,32 + Actor784: cram + Owner: GDI + Location: 72,23 + Actor785: cram + Owner: GDI + Location: 66,19 + Actor789: cram + Owner: GDI + Location: 60,22 + Actor604: gtwr + Owner: GDI + Location: 64,39 + Actor742: gtwr + Owner: GDI + Location: 67,39 + Actor596: brik + Owner: GDI + Location: 44,21 + Actor597: brik + Owner: GDI + Location: 44,20 + Actor598: brik + Owner: GDI + Location: 45,20 + Actor600: brik + Owner: GDI + Location: 45,21 + Actor605: brik + Owner: GDI + Location: 40,40 + Actor602: eye + Owner: GDI + Location: 52,20 + Actor603: nuk2 + Owner: GDI + Location: 78,26 + Actor606: nuk2 + Owner: GDI + Location: 80,26 + Actor607: nuk2 + Owner: GDI + Location: 83,26 + Actor608: nuk2 + Owner: GDI + Location: 85,26 + Actor609: nuk2 + Owner: GDI + Location: 83,30 + Actor610: nuk2 + Owner: GDI + Location: 85,30 + Actor611: afac + Owner: GDI + Location: 78,30 + Actor612: hq + Owner: GDI + Location: 75,36 + UpgradeCenter: upgc + Owner: GDI + Location: 79,22 + Actor614: patr + Owner: GDI + Location: 54,36 + Actor615: silo.td + Owner: GDI + Location: 79,36 + Actor616: silo.td + Owner: GDI + Location: 80,34 + Actor617: silo.td + Owner: GDI + Location: 82,36 + Actor618: silo.td + Owner: GDI + Location: 83,34 + Actor619: silo.td + Owner: GDI + Location: 85,36 + Actor624: afld.gdi + Owner: GDI + Location: 51,43 + Actor625: afld.gdi + Owner: GDI + Location: 50,46 + Actor626: afld.gdi + Owner: GDI + Location: 52,49 + Actor627: rep + Owner: GDI + Location: 54,45 + Actor628: afld.gdi + Owner: GDI + Location: 56,43 + Actor629: afld.gdi + Owner: GDI + Location: 58,46 + Actor632: afld.gdi + Owner: GDI + Location: 56,49 + Actor633: stwr + Owner: GDI + Location: 62,59 + TurretFacing: 512 + Actor637: stwr + Owner: GDI + Location: 37,37 + TurretFacing: 354 + ScriptTags: HardAndAbove + Actor638: stwr + Owner: GDI + Location: 37,31 + TurretFacing: 192 + ScriptTags: HardAndAbove + Actor639: brik + Owner: GDI + Location: 61,56 + Actor640: brik + Owner: GDI + Location: 61,55 + Actor641: brik + Owner: GDI + Location: 62,56 + Actor642: brik + Owner: GDI + Location: 62,55 + Actor643: brik + Owner: GDI + Location: 63,56 + Actor644: brik + Owner: GDI + Location: 64,56 + Actor645: brik + Owner: GDI + Location: 64,55 + Actor646: brik + Owner: GDI + Location: 65,55 + Actor647: brik + Owner: GDI + Location: 65,56 + Actor648: brik + Owner: GDI + Location: 69,56 + Actor649: brik + Owner: GDI + Location: 69,55 + Actor650: brik + Owner: GDI + Location: 70,55 + Actor651: brik + Owner: GDI + Location: 70,56 + Actor653: brik + Owner: GDI + Location: 71,56 + Actor654: brik + Owner: GDI + Location: 72,56 + Actor673: brik + Owner: GDI + Location: 73,56 + Actor674: brik + Owner: GDI + Location: 72,55 + Actor675: brik + Owner: GDI + Location: 73,55 + Actor676: atwr + Owner: GDI + Location: 63,55 + Actor677: atwr + Owner: GDI + Location: 71,55 + Actor634: stwr + Owner: GDI + Location: 64,59 + ScriptTags: HardAndAbove + TurretFacing: 512 + Actor635: stwr + Owner: GDI + Location: 70,59 + TurretFacing: 512 + ScriptTags: HardAndAbove + Actor636: stwr + Owner: GDI + TurretFacing: 512 + Location: 72,59 + Actor682: gtwr + Owner: GDI + Location: 65,57 + Actor685: gtwr + Owner: GDI + Location: 69,57 + Actor743: nuk2 + Owner: GDI + Location: 83,22 + Actor759: nuk2 + Owner: GDI + Location: 85,22 + Actor760: gtek + Owner: GDI + Location: 48,21 + Actor792: cram + Owner: GDI + Location: 76,53 + TurretFacing: 586 + Actor793: cram + Owner: GDI + Location: 56,53 + TurretFacing: 354 + Actor796: cram + Owner: GDI + Location: 86,51 + Actor799: cram + Owner: GDI + Location: 49,52 + Actor802: cram + Owner: GDI + Location: 45,44 + Actor810: cram + Owner: GDI + Location: 90,25 + Actor815: cram + Owner: GDI + Location: 40,39 + Actor816: cram + Owner: GDI + Location: 40,27 + Actor835: cram + Owner: GDI + Location: 53,24 + Actor836: cram + Owner: GDI + Location: 52,36 + Actor837: cram + Owner: GDI + Location: 78,42 + Actor838: brik + Owner: GDI + Location: 90,43 + Actor839: brik + Owner: GDI + Location: 90,42 + Actor840: brik + Owner: GDI + Location: 90,41 + Actor841: brik + Owner: GDI + Location: 91,41 + Actor842: brik + Owner: GDI + Location: 91,40 + Actor843: brik + Owner: GDI + Location: 90,40 + Actor844: brik + Owner: GDI + Location: 90,36 + Actor845: brik + Owner: GDI + Location: 91,36 + Actor846: brik + Owner: GDI + Location: 91,35 + Actor847: brik + Owner: GDI + Location: 90,35 + Actor848: brik + Owner: GDI + Location: 91,34 + Actor849: brik + Owner: GDI + Location: 90,34 + Actor800: brik + Owner: GDI + Location: 90,45 + Actor804: brik + Owner: GDI + Location: 90,44 + Actor850: brik + Owner: GDI + Location: 89,45 + Actor851: brik + Owner: GDI + Location: 89,44 + Actor852: brik + Owner: GDI + Location: 90,33 + Actor853: brik + Owner: GDI + Location: 90,32 + Actor854: brik + Owner: GDI + Location: 89,32 + Actor855: brik + Owner: GDI + Location: 89,33 + Actor856: gtwr + Owner: GDI + Location: 92,40 + Actor857: gtwr + Owner: GDI + Location: 92,36 + Actor858: stwr + Owner: GDI + Location: 94,35 + TurretFacing: 852 + ScriptTags: HardAndAbove + Actor859: stwr + Owner: GDI + Location: 94,41 + TurretFacing: 702 + ScriptTags: HardAndAbove + Actor860: atwr + Owner: GDI + Location: 89,43 + Actor861: atwr + Owner: GDI + Location: 89,34 + Actor862: atwr + Owner: GDI + Location: 39,30 + Actor863: atwr + Owner: GDI + Location: 39,38 + Actor864: cram + Owner: GDI + Location: 89,47 + Actor865: cram + Owner: GDI + Location: 90,30 + Actor866: split2 + Owner: Neutral + Location: 52,15 + Actor867: split2 + Owner: Neutral + Location: 57,14 + Actor868: split2 + Owner: Neutral + Location: 56,10 + Actor869: split2 + Owner: Neutral + Location: 63,11 + Actor870: split2 + Owner: Neutral + Location: 68,13 + Actor871: split2 + Owner: Neutral + Location: 69,9 + Actor872: split2 + Owner: Neutral + Location: 73,12 + Actor873: split2 + Owner: Neutral + Location: 75,15 + Actor686: proc.td + Owner: GDI + Location: 79,16 + Actor704: proc.td + Owner: GDI + Location: 83,14 + Actor874: nuk2 + Owner: GDI + Location: 75,46 + Actor875: nuk2 + Owner: GDI + Location: 77,45 + Actor876: nuk2 + Owner: GDI + Location: 79,46 + Actor877: nuk2 + Owner: GDI + Location: 81,45 + Actor879: apwr + Owner: USSR + Location: 5,61 + Health: 25 + Actor880: apwr + Owner: USSR + Location: 8,61 + Health: 40 + Actor882: apwr + Owner: USSR + Location: 5,64 + Health: 38 + Actor883: apwr + Owner: USSR + Location: 8,64 + Health: 24 + Actor887: dome + Owner: USSR + Location: 2,72 + Health: 43 + Actor884: stek + Owner: USSR + Location: 2,68 + Health: 30 + Actor886: proc + Owner: USSR + Location: 12,65 + FreeActor@CHARV: False + FreeActor: False + Health: 42 + Actor895: afld + Owner: USSR + Location: 15,74 + Health: 47 + Actor897: nuk2 + Owner: Nod + Location: 130,54 + Health: 30 + Actor898: nuk2 + Owner: Nod + Location: 128,54 + Health: 36 + Actor899: nuk2 + Owner: Nod + Location: 126,54 + Health: 25 + Actor904: nuk2 + Owner: Nod + Location: 124,54 + Health: 24 + Actor907: tmpl + Owner: Nod + Location: 119,58 + Health: 42 + Actor910: proc.td + Owner: Nod + Location: 114,59 + FreeActor@SHARV: False + FreeActor: False + Health: 47 + Actor912: hq + Owner: Nod + Location: 114,64 + Health: 41 + Actor881: apwr + Owner: USSR + Location: 11,61 + Health: 43 + Actor744: brik + Owner: USSR + Location: 16,60 + Actor745: brik + Owner: USSR + Location: 16,61 + Actor746: brik + Owner: USSR + Location: 17,60 + Actor747: brik + Owner: USSR + Location: 17,61 + Actor748: brik + Owner: USSR + Location: 4,60 + Actor749: brik + Owner: USSR + Location: 5,60 + Actor750: brik + Owner: USSR + Location: 7,60 + Actor751: brik + Owner: USSR + Location: 8,60 + Actor752: brik + Owner: USSR + Location: 6,60 + Actor753: brik + Owner: USSR + Location: 9,60 + Actor754: brik + Owner: USSR + Location: 10,60 + Actor755: brik + Owner: USSR + Location: 11,60 + Actor756: brik + Owner: USSR + Location: 13,60 + Actor757: brik + Owner: USSR + Location: 12,60 + Actor758: brik + Owner: USSR + Location: 15,60 + Actor763: brik + Owner: USSR + Location: 14,60 + Actor764: brik + Owner: USSR + Location: 4,61 + Actor766: brik + Owner: USSR + Location: 4,62 + Actor767: brik + Owner: USSR + Location: 3,62 + Actor768: brik + Owner: USSR + Location: 2,62 + Health: 53 + Actor769: brik + Owner: USSR + Location: 1,62 + Actor771: brik + Owner: USSR + Location: 1,63 + Actor773: brik + Owner: USSR + Location: 1,64 + Actor777: brik + Owner: USSR + Location: 1,65 + Actor778: brik + Owner: USSR + Location: 1,76 + Actor779: brik + Owner: USSR + Location: 2,76 + Actor780: brik + Owner: USSR + Location: 1,77 + Actor781: brik + Owner: USSR + Location: 2,77 + Actor783: brik + Owner: USSR + Location: 1,75 + Actor786: brik + Owner: USSR + Location: 1,74 + Actor787: brik + Owner: USSR + Location: 1,73 + Actor788: brik + Owner: USSR + Location: 1,72 + Actor790: brik + Owner: USSR + Location: 1,71 + Actor791: brik + Owner: USSR + Location: 1,70 + Actor794: brik + Owner: USSR + Location: 1,69 + Actor795: brik + Owner: USSR + Location: 1,68 + Actor797: brik + Owner: USSR + Location: 1,67 + Actor798: brik + Owner: USSR + Location: 1,66 + Actor801: brik + Owner: USSR + Location: 5,76 + Actor803: brik + Owner: USSR + Location: 5,77 + Actor805: brik + Owner: USSR + Location: 6,76 + Health: 49 + Actor806: brik + Owner: USSR + Location: 6,77 + Actor807: brik + Owner: USSR + Location: 4,77 + Health: 37 + Actor808: brik + Owner: USSR + Location: 3,77 + Actor809: brik + Owner: USSR + Location: 11,77 + Actor811: brik + Owner: USSR + Location: 10,76 + Actor812: brik + Owner: USSR + Location: 11,76 + Actor813: brik + Owner: USSR + Location: 10,77 + Actor814: brik + Owner: USSR + Location: 13,77 + Actor817: brik + Owner: USSR + Location: 12,77 + Health: 60 + Actor818: brik + Owner: USSR + Location: 14,77 + Actor819: brik + Owner: USSR + Location: 15,77 + Health: 51 + Actor820: brik + Owner: USSR + Location: 16,77 + Actor821: brik + Owner: USSR + Location: 17,77 + Actor822: brik + Owner: USSR + Location: 18,77 + Actor823: brik + Owner: USSR + Location: 19,77 + Actor824: brik + Owner: USSR + Location: 20,77 + Actor825: brik + Owner: USSR + Location: 20,76 + Actor826: brik + Owner: USSR + Location: 20,75 + Actor827: brik + Owner: USSR + Location: 20,74 + Health: 40 + Actor828: brik + Owner: USSR + Location: 19,74 + Actor829: brik + Owner: USSR + Location: 19,75 + Actor830: brik + Owner: USSR + Location: 19,70 + Actor831: brik + Owner: USSR + Location: 19,71 + Actor832: brik + Owner: USSR + Location: 20,71 + Actor833: brik + Owner: USSR + Location: 20,70 + Actor834: brik + Owner: USSR + Location: 20,68 + Actor913: brik + Owner: USSR + Location: 20,67 + Actor914: brik + Owner: USSR + Location: 19,67 + Actor915: brik + Owner: USSR + Location: 19,68 + Actor916: brik + Owner: USSR + Location: 20,69 + Health: 43 + Actor500: brik + Owner: Nod + Location: 117,54 + Actor501: brik + Owner: Nod + Location: 117,53 + Actor502: brik + Owner: Nod + Location: 118,53 + Health: 47 + Actor503: brik + Owner: Nod + Location: 118,54 + Health: 24 + Actor504: brik + Owner: Nod + Location: 119,53 + Health: 71 + Actor505: brik + Owner: Nod + Location: 132,53 + Actor506: brik + Owner: Nod + Location: 131,53 + Actor507: brik + Owner: Nod + Location: 130,53 + Actor508: brik + Owner: Nod + Location: 128,53 + Actor509: brik + Owner: Nod + Location: 120,53 + Actor510: brik + Owner: Nod + Location: 122,53 + Actor511: brik + Owner: Nod + Location: 123,53 + Actor512: brik + Owner: Nod + Location: 121,53 + Actor523: brik + Owner: Nod + Location: 124,53 + Health: 42 + Actor529: brik + Owner: Nod + Location: 125,53 + Actor530: brik + Owner: Nod + Location: 126,53 + Actor535: brik + Owner: Nod + Location: 127,53 + Actor536: brik + Owner: Nod + Location: 129,53 + Actor537: brik + Owner: Nod + Location: 132,54 + Actor538: brik + Owner: Nod + Location: 132,55 + Actor539: brik + Owner: Nod + Location: 132,56 + Actor655: brik + Owner: Nod + Location: 132,57 + Actor656: brik + Owner: Nod + Location: 132,58 + Actor657: brik + Owner: Nod + Location: 132,59 + Actor658: brik + Owner: Nod + Location: 132,60 + Health: 46 + Actor659: brik + Owner: Nod + Location: 132,61 + Health: 45 + Actor660: brik + Owner: Nod + Location: 132,62 + Actor661: brik + Owner: Nod + Location: 132,63 + Actor662: brik + Owner: Nod + Location: 132,64 + Actor663: brik + Owner: Nod + Location: 132,65 + Actor664: brik + Owner: Nod + Location: 132,66 + Actor665: brik + Owner: Nod + Location: 132,67 + Actor666: brik + Owner: Nod + Location: 131,67 + Actor667: brik + Owner: Nod + Location: 130,67 + Actor668: brik + Owner: Nod + Location: 129,67 + Health: 38 + Actor669: brik + Owner: Nod + Location: 128,67 + Actor670: brik + Owner: Nod + Location: 127,67 + Actor671: brik + Owner: Nod + Location: 127,68 + Actor672: brik + Owner: Nod + Location: 126,68 + Actor678: brik + Owner: Nod + Location: 126,69 + Actor679: brik + Owner: Nod + Location: 127,69 + Actor680: brik + Owner: Nod + Location: 125,69 + Health: 72 + Actor681: brik + Owner: Nod + Location: 124,69 + Actor683: brik + Owner: Nod + Location: 123,69 + Actor684: brik + Owner: Nod + Location: 123,68 + Actor688: brik + Owner: Nod + Location: 124,68 + Health: 15 + Actor689: brik + Owner: Nod + Location: 118,68 + Actor690: brik + Owner: Nod + Location: 118,69 + Health: 45 + Actor692: brik + Owner: Nod + Location: 119,68 + Health: 37 + Actor693: brik + Owner: Nod + Location: 119,69 + Actor694: brik + Owner: Nod + Location: 117,69 + Actor695: brik + Owner: Nod + Location: 116,69 + Actor696: brik + Owner: Nod + Location: 115,68 + Actor697: brik + Owner: Nod + Location: 116,68 + Actor698: brik + Owner: Nod + Location: 115,69 + Actor699: brik + Owner: Nod + Location: 115,67 + Actor702: brik + Owner: Nod + Location: 114,67 + Actor703: brik + Owner: Nod + Location: 113,67 + Actor705: brik + Owner: Nod + Location: 112,67 + Health: 46 + Actor706: brik + Owner: Nod + Location: 111,67 + Actor707: brik + Owner: Nod + Location: 111,66 + Actor708: brik + Owner: Nod + Location: 111,65 + Actor710: brik + Owner: Nod + Location: 111,64 + Actor711: brik + Owner: Nod + Location: 111,63 + Actor712: brik + Owner: Nod + Location: 111,62 + Actor713: brik + Owner: Nod + Location: 111,61 + Actor714: brik + Owner: Nod + Location: 111,60 + Actor716: brik + Owner: Nod + Location: 111,58 + Actor717: brik + Owner: Nod + Location: 112,58 + Health: 17 + Actor718: brik + Owner: Nod + Location: 112,59 + Actor715: brik + Owner: Nod + Location: 111,59 + Health: 32 + Actor719: brik + Owner: England + Location: 76,93 + Health: 32 + Actor720: brik + Owner: England + Location: 77,93 + Actor721: brik + Owner: England + Location: 76,94 + Actor722: brik + Owner: England + Location: 77,94 + Actor723: brik + Owner: England + Location: 78,94 + Health: 52 + Actor725: brik + Owner: England + Location: 79,94 + Actor726: brik + Owner: England + Location: 79,93 + Actor727: brik + Owner: England + Location: 80,93 + Actor728: brik + Owner: England + Location: 81,93 + Actor730: brik + Owner: England + Location: 82,93 + Actor731: brik + Owner: England + Location: 82,92 + Actor732: brik + Owner: England + Location: 83,92 + Actor733: brik + Owner: England + Location: 83,88 + Actor734: brik + Owner: England + Location: 83,89 + Actor735: brik + Owner: England + Location: 83,90 + Actor736: brik + Owner: England + Location: 83,91 + Actor737: brik + Owner: England + Location: 84,88 + Actor738: brik + Owner: England + Location: 84,87 + Actor739: brik + Owner: England + Location: 84,85 + Actor740: brik + Owner: England + Location: 84,86 + Actor741: brik + Owner: England + Location: 84,84 + Actor917: brik + Owner: England + Location: 84,83 + Actor918: brik + Owner: England + Location: 84,82 + Actor919: brik + Owner: England + Location: 84,81 + Actor920: brik + Owner: England + Location: 84,80 + Actor921: brik + Owner: England + Location: 84,79 + Actor922: brik + Owner: England + Location: 83,79 + Actor923: brik + Owner: England + Location: 83,80 + Actor924: brik + Owner: England + Location: 82,79 + Actor925: brik + Owner: England + Location: 80,79 + Actor926: brik + Owner: England + Location: 79,79 + Health: 26 + Actor927: brik + Owner: England + Location: 77,79 + Actor928: brik + Owner: England + Location: 76,79 + Actor929: brik + Owner: England + Location: 76,80 + Actor930: brik + Owner: England + Location: 77,80 + Actor931: brik + Owner: England + Location: 78,79 + Actor932: brik + Owner: England + Location: 81,79 + Actor933: brik + Owner: England + Location: 71,80 + Actor934: brik + Owner: England + Location: 71,79 + Actor935: brik + Owner: England + Location: 72,79 + Actor936: brik + Owner: England + Location: 72,80 + Actor937: brik + Owner: England + Location: 69,79 + Actor938: brik + Owner: England + Location: 70,79 + Health: 60 + Actor939: brik + Owner: England + Location: 68,79 + Actor940: brik + Owner: England + Location: 66,79 + Actor941: brik + Owner: England + Location: 65,79 + Actor942: brik + Owner: England + Location: 64,79 + Actor943: brik + Owner: England + Location: 64,80 + Actor944: brik + Owner: England + Location: 65,80 + Actor945: brik + Owner: England + Location: 67,79 + Actor946: brik + Owner: England + Location: 64,81 + Actor947: brik + Owner: England + Location: 64,82 + Actor948: brik + Owner: England + Location: 64,83 + Actor949: brik + Owner: England + Location: 64,84 + Health: 26 + Actor950: brik + Owner: England + Location: 64,85 + Actor951: brik + Owner: England + Location: 63,85 + Actor952: brik + Owner: England + Location: 63,84 + Actor953: brik + Owner: England + Location: 63,90 + Actor954: brik + Owner: England + Location: 63,89 + Actor955: brik + Owner: England + Location: 64,89 + Actor956: brik + Owner: England + Location: 64,90 + Actor957: brik + Owner: England + Location: 64,91 + Actor958: brik + Owner: England + Location: 64,92 + Actor959: brik + Owner: England + Location: 64,93 + Actor960: brik + Owner: England + Location: 64,94 + Actor961: brik + Owner: England + Location: 65,93 + Actor962: brik + Owner: England + Location: 65,94 + Actor963: brik + Owner: England + Location: 67,94 + Actor964: brik + Owner: England + Location: 66,94 + Actor965: brik + Owner: England + Location: 69,94 + Actor966: brik + Owner: England + Location: 68,94 + Actor967: brik + Owner: England + Location: 71,94 + Actor968: brik + Owner: England + Location: 70,94 + Actor969: brik + Owner: England + Location: 72,94 + Actor970: brik + Owner: England + Location: 72,93 + Actor971: brik + Owner: England + Location: 71,93 + Actor905: zdef + Owner: GDI + Facing: 384 + Location: 72,95 + SubCell: 3 + Actor908: zdef + Owner: GDI + Facing: 384 + Location: 76,95 + SubCell: 3 + Actor972: zdef + Owner: GDI + Location: 75,86 + SubCell: 3 + Facing: 511 + Actor973: zdef + Owner: GDI + Facing: 384 + Location: 72,83 + SubCell: 3 + Actor878: n1 + Owner: GDI + Facing: 384 + Location: 77,85 + SubCell: 3 + Actor974: n1 + Owner: GDI + Facing: 384 + Location: 71,87 + SubCell: 3 + Actor975: n1 + Owner: GDI + Facing: 384 + Location: 77,87 + SubCell: 3 + Actor976: n1 + Owner: GDI + Location: 68,88 + SubCell: 3 + Facing: 709 + Actor977: mtnk + Owner: GDI + Location: 74,85 + Facing: 504 + ScriptTags: HardAndAbove + Actor978: apc2 + Owner: GDI + Facing: 384 + Location: 76,84 + Actor979: htnk + Owner: GDI + Location: 122,63 + Facing: 384 + ScriptTags: HardAndAbove + Actor980: vulc + Owner: GDI + Facing: 384 + Location: 124,65 + Actor981: vulc + Owner: GDI + Facing: 384 + Location: 120,62 + Actor983: hmmv + Owner: GDI + Location: 9,72 + Facing: 384 + Actor984: htnk + Owner: GDI + Location: 10,70 + Facing: 627 + ScriptTags: HardAndAbove + Actor985: vulc + Owner: GDI + Location: 16,68 + Facing: 606 + Actor986: vulc + Owner: GDI + Location: 10,68 + Facing: 641 + Actor987: jjet + Owner: GDI + Facing: 384 + Location: 118,61 + Actor988: jjet + Owner: GDI + Facing: 384 + Location: 125,63 + Actor989: jjet + Owner: GDI + Location: 12,70 + Facing: 675 + Actor990: jjet + Owner: GDI + Location: 16,65 + Facing: 722 + Actor991: zdef + Owner: GDI + Location: 8,71 + SubCell: 3 + Facing: 593 + Actor992: zdef + Owner: GDI + Location: 10,78 + SubCell: 3 + Facing: 600 + Actor993: zdef + Owner: GDI + Location: 6,79 + SubCell: 3 + Facing: 688 + Actor994: zdef + Owner: GDI + Location: 21,74 + SubCell: 3 + Facing: 647 + Actor995: zdef + Owner: GDI + Facing: 384 + Location: 118,70 + SubCell: 3 + Actor996: zdef + Owner: GDI + Facing: 384 + Location: 123,70 + SubCell: 3 + Actor997: zdef + Owner: GDI + Facing: 384 + Location: 122,62 + SubCell: 3 + Actor998: zdef + Owner: GDI + Facing: 384 + Location: 125,62 + SubCell: 3 + Actor999: n3 + Owner: GDI + Facing: 384 + Location: 123,63 + SubCell: 3 + Actor1000: n3 + Owner: GDI + Facing: 384 + Location: 120,61 + SubCell: 3 + Actor1001: n3 + Owner: GDI + Location: 14,70 + SubCell: 3 + Facing: 641 + Actor1002: n3 + Owner: GDI + Location: 8,67 + SubCell: 3 + Facing: 702 + Actor1003: n1 + Owner: GDI + Location: 15,67 + SubCell: 3 + Facing: 647 + Actor1004: n1 + Owner: GDI + Location: 10,72 + SubCell: 3 + Facing: 627 + TurretFacing: 886 + Actor1005: n1 + Owner: GDI + Facing: 384 + Location: 9,71 + SubCell: 3 + Actor1035: n1 + Owner: GDI + Location: 21,70 + SubCell: 3 + Facing: 579 + Actor1055: n1 + Owner: GDI + Facing: 384 + Location: 126,61 + SubCell: 3 + Actor1072: n1 + Owner: GDI + Facing: 384 + Location: 127,57 + SubCell: 3 + Actor1081: n1 + Owner: GDI + Facing: 384 + Location: 120,56 + SubCell: 3 + Actor1083: ztrp + Owner: GDI + Facing: 384 + Location: 73,51 + SubCell: 3 + Actor1084: ztrp + Owner: GDI + Facing: 384 + Location: 71,60 + SubCell: 3 + Actor1085: ztrp + Owner: GDI + Facing: 384 + Location: 63,60 + SubCell: 3 + Actor1086: zdef + Owner: GDI + Facing: 384 + Location: 72,61 + SubCell: 3 + Actor1096: zdef + Owner: GDI + Facing: 384 + Location: 63,41 + SubCell: 3 + Actor1097: zdef + Owner: GDI + Facing: 384 + Location: 68,41 + SubCell: 3 + Actor1103: zdef + Owner: GDI + Facing: 384 + Location: 43,40 + SubCell: 3 + Actor1104: zdef + Owner: GDI + Facing: 384 + Location: 43,37 + SubCell: 3 + Actor1107: zdef + Owner: GDI + Facing: 384 + Location: 36,32 + SubCell: 3 + Actor1119: zdef + Owner: GDI + Facing: 384 + Location: 36,37 + SubCell: 3 + Actor1131: zdef + Owner: GDI + Facing: 384 + Location: 94,42 + SubCell: 3 + Actor1146: zdef + Owner: GDI + Facing: 384 + Location: 95,36 + SubCell: 3 + Actor1147: ztrp + Owner: GDI + Facing: 384 + Location: 85,42 + SubCell: 3 + Actor1148: ztrp + Owner: GDI + Facing: 384 + Location: 81,39 + SubCell: 3 + Actor1149: n1 + Owner: GDI + Facing: 384 + Location: 84,40 + SubCell: 3 + Actor1150: n1 + Owner: GDI + Facing: 384 + Location: 86,35 + SubCell: 3 + Actor1152: n1 + Owner: GDI + Facing: 384 + Location: 82,35 + SubCell: 3 + Actor1156: n1 + Owner: GDI + Facing: 384 + Location: 82,33 + SubCell: 3 + Actor1157: n1 + Owner: GDI + Facing: 384 + Location: 51,32 + SubCell: 3 + Actor1158: n1 + Owner: GDI + Facing: 384 + Location: 50,29 + SubCell: 3 + Actor1159: n1 + Owner: GDI + Facing: 384 + Location: 43,29 + SubCell: 3 + Actor1160: n1 + Owner: GDI + Facing: 384 + Location: 43,32 + SubCell: 3 + Actor1161: n1 + Owner: GDI + Facing: 384 + Location: 46,37 + SubCell: 3 + Actor1162: n1 + Owner: GDI + Facing: 384 + Location: 41,30 + SubCell: 3 + Actor1163: n1 + Owner: GDI + Facing: 384 + Location: 50,24 + SubCell: 3 + Actor1164: n1 + Owner: GDI + Facing: 384 + Location: 47,23 + SubCell: 3 + Actor1165: n1 + Owner: GDI + Facing: 384 + Location: 70,20 + SubCell: 3 + Actor1166: n1 + Owner: GDI + Facing: 384 + Location: 71,21 + SubCell: 3 + Actor1167: n1 + Owner: GDI + Facing: 384 + Location: 79,20 + SubCell: 3 + Actor1168: n1 + Owner: GDI + Facing: 384 + Location: 86,20 + SubCell: 3 + Actor1169: n1 + Owner: GDI + Facing: 384 + Location: 88,24 + SubCell: 3 + Actor1170: n1 + Owner: GDI + Facing: 384 + Location: 88,28 + SubCell: 3 + Actor1171: n1 + Owner: GDI + Facing: 384 + Location: 82,48 + SubCell: 3 + Actor1172: n1 + Owner: GDI + Facing: 384 + Location: 77,43 + SubCell: 3 + Actor1173: n1 + Owner: GDI + Facing: 384 + Location: 73,60 + SubCell: 3 + Actor1174: n1 + Owner: GDI + Facing: 384 + Location: 64,60 + SubCell: 3 + Actor1176: n1 + Owner: GDI + Facing: 384 + Location: 68,50 + SubCell: 3 + Actor1177: n1 + Owner: GDI + Facing: 384 + Location: 62,49 + SubCell: 3 + Actor1178: n1 + Owner: GDI + Facing: 384 + Location: 53,45 + SubCell: 3 + Actor1179: n1 + Owner: GDI + Facing: 384 + Location: 46,44 + SubCell: 3 + Actor1180: n3 + Owner: GDI + Facing: 384 + Location: 77,42 + SubCell: 3 + Actor1181: n3 + Owner: GDI + Facing: 384 + Location: 44,40 + SubCell: 3 + Actor1182: n3 + Owner: GDI + Facing: 384 + Location: 49,35 + SubCell: 3 + Actor1183: n3 + Owner: GDI + Facing: 384 + Location: 55,34 + SubCell: 3 + Actor1184: n3 + Owner: GDI + Facing: 384 + Location: 44,28 + SubCell: 3 + Actor1185: n3 + Owner: GDI + Facing: 384 + Location: 87,29 + SubCell: 3 + Actor1186: n3 + Owner: GDI + Facing: 384 + Location: 79,39 + SubCell: 3 + Actor1187: n3 + Owner: GDI + Facing: 384 + Location: 77,35 + SubCell: 3 + Actor1188: n3 + Owner: GDI + Facing: 384 + Location: 71,40 + SubCell: 3 + Actor1189: cram + Owner: GDI + Location: 91,80 + TurretFacing: 832 + ScriptTags: HardAndAbove + Actor1190: cram + Owner: GDI + Location: 41,74 + TurretFacing: 341 + ScriptTags: HardAndAbove + Actor1191: cram + Owner: GDI + Location: 43,87 + TurretFacing: 395 + ScriptTags: HardAndAbove + Actor1192: cram + Owner: GDI + Location: 90,63 + TurretFacing: 832 + ScriptTags: HardAndAbove + Actor1193: cram + Owner: GDI + Location: 46,64 + TurretFacing: 286 + ScriptTags: HardAndAbove + Actor1194: cram + Owner: GDI + Location: 56,96 + ScriptTags: HardAndAbove + TurretFacing: 320 + Actor1195: cram + Owner: GDI + Location: 83,96 + TurretFacing: 716 + ScriptTags: HardAndAbove + Actor1198: disr + Owner: GDI + Location: 86,33 + Facing: 634 + Actor1199: titn + Owner: GDI + Location: 97,36 + Facing: 654 + Actor1200: titn + Owner: GDI + Location: 97,40 + Facing: 627 + Actor1201: titn + Owner: GDI + Location: 65,61 + Facing: 512 + Actor1202: titn + Owner: GDI + Location: 70,61 + Facing: 512 + Actor1203: titn + Owner: GDI + Facing: 384 + Location: 35,36 + Actor1204: titn + Owner: GDI + Facing: 384 + Location: 35,30 + Actor1205: titn + Owner: GDI + Location: 71,42 + Facing: 463 + ScriptTags: VeryHardAndAbove + Actor1206: titn + Owner: GDI + Location: 62,42 + Facing: 600 + ScriptTags: HardAndAbove + Actor1207: xo + Owner: GDI + Facing: 384 + Location: 39,96 + Actor1208: xo + Owner: GDI + Facing: 384 + Location: 43,100 + Actor1209: xo + Owner: GDI + Location: 19,120 + Facing: 647 + Actor1210: xo + Owner: GDI + Location: 17,114 + Facing: 716 + Actor1211: xo + Owner: GDI + Location: 118,113 + Facing: 384 + Actor1212: xo + Owner: GDI + Facing: 384 + Location: 123,117 + Actor1213: xo + Owner: GDI + Facing: 384 + Location: 117,84 + Actor1214: xo + Owner: GDI + Location: 113,47 + Facing: 593 + Actor1215: xo + Owner: GDI + Facing: 384 + Location: 123,45 + Actor1217: htnk.ion + Owner: GDI + Location: 78,40 + Facing: 620 + Actor1218: htnk.ion + Owner: GDI + Facing: 384 + Location: 47,34 + Actor1219: htnk.ion + Owner: GDI + Facing: 384 + Location: 50,36 + Actor1220: jugg + Owner: GDI + Facing: 384 + Location: 77,51 + Actor1221: jugg + Owner: GDI + Facing: 384 + Location: 54,52 + Actor1222: jugg + Owner: GDI + Facing: 384 + Location: 88,46 + Actor1223: jugg + Owner: GDI + Facing: 384 + Location: 41,41 + Actor1224: jugg + Owner: GDI + Facing: 384 + Location: 47,45 + Actor1225: vulc + Owner: GDI + Location: 80,45 + Facing: 518 + Actor1226: vulc + Owner: GDI + Facing: 384 + Location: 52,39 + Actor1227: vulc + Owner: GDI + Facing: 384 + Location: 52,33 + Actor1228: vulc + Owner: GDI + Location: 82,31 + Facing: 647 + Actor1229: vulc + Owner: GDI + Location: 75,45 + Facing: 518 + Actor1230: msam + Owner: GDI + Facing: 384 + Location: 77,48 + Actor1233: wolv + Owner: GDI + Location: 8,77 + Facing: 491 + Actor1234: wolv + Owner: GDI + Facing: 384 + Location: 30,55 + Actor1235: wolv + Owner: GDI + Facing: 384 + Location: 25,53 + Gateway: wormholexxl + Owner: Scrin + Location: 66,27 + Actor1237: chain + Owner: GDI + Location: 66,24 + Actor1238: chain + Owner: GDI + Location: 65,24 + Actor1239: chain + Owner: GDI + Location: 64,24 + Actor1240: chain + Owner: GDI + Location: 63,24 + Actor1241: chain + Owner: GDI + Location: 67,24 + Actor1242: chain + Owner: GDI + Location: 68,24 + Actor1243: chain + Owner: GDI + Location: 69,24 + Actor1244: chain + Owner: GDI + Location: 63,25 + Actor1245: chain + Owner: GDI + Location: 63,26 + Actor1246: chain + Owner: GDI + Location: 63,27 + Actor1247: chain + Owner: GDI + Location: 63,28 + Actor1248: chain + Owner: GDI + Location: 63,29 + Actor1249: chain + Owner: GDI + Location: 63,30 + Actor1252: chain + Owner: GDI + Location: 69,25 + Actor1253: chain + Owner: GDI + Location: 69,26 + Actor1254: chain + Owner: GDI + Location: 69,27 + Actor1255: chain + Owner: GDI + Location: 69,28 + Actor1256: chain + Owner: GDI + Location: 69,29 + Actor1257: chain + Owner: GDI + Location: 69,30 + Actor1258: chain + Owner: GDI + Location: 68,30 + Actor1259: chain + Owner: GDI + Location: 64,30 + Actor1250: barb + Owner: GDI + Location: 63,23 + Actor1251: barb + Owner: GDI + Location: 62,23 + Actor1260: barb + Owner: GDI + Location: 62,24 + Actor1261: barb + Owner: GDI + Location: 62,26 + Actor1262: barb + Owner: GDI + Location: 62,25 + Actor1263: barb + Owner: GDI + Location: 62,27 + Actor1264: barb + Owner: GDI + Location: 62,28 + Actor1265: barb + Owner: GDI + Location: 62,29 + Actor1266: barb + Owner: GDI + Location: 62,30 + Actor1267: barb + Owner: GDI + Location: 62,31 + Actor1268: barb + Owner: GDI + Location: 63,31 + Actor1269: barb + Owner: GDI + Location: 64,31 + Actor1270: barb + Owner: GDI + Location: 68,31 + Actor1271: barb + Owner: GDI + Location: 69,31 + Actor1272: barb + Owner: GDI + Location: 70,31 + Actor1273: barb + Owner: GDI + Location: 70,30 + Actor1274: barb + Owner: GDI + Location: 70,28 + Actor1275: barb + Owner: GDI + Location: 70,29 + Actor1276: barb + Owner: GDI + Location: 70,27 + Actor1277: barb + Owner: GDI + Location: 70,26 + Actor1278: barb + Owner: GDI + Location: 70,25 + Actor1279: barb + Owner: GDI + Location: 70,24 + Actor1280: barb + Owner: GDI + Location: 69,23 + Actor1281: barb + Owner: GDI + Location: 70,23 + Actor1282: barb + Owner: GDI + Location: 67,23 + Actor1283: barb + Owner: GDI + Location: 68,23 + Actor1284: barb + Owner: GDI + Location: 66,23 + Actor1285: barb + Owner: GDI + Location: 65,23 + Actor1286: barb + Owner: GDI + Location: 64,23 + Actor1287: barb + Owner: GDI + Location: 64,32 + Actor1288: barb + Owner: GDI + Location: 68,32 + Actor1289: barb + Owner: GDI + Location: 63,32 + Actor1290: barb + Owner: GDI + Location: 69,32 + Actor1297: jeep + Owner: Greece + Facing: 0 + Location: 72,121 + Actor1298: jeep + Owner: Greece + Facing: 0 + Location: 76,121 + Actor1299: 2tnk + Owner: Greece + Facing: 0 + Location: 71,123 + Actor1300: 2tnk + Owner: Greece + Facing: 0 + Location: 73,123 + Actor1301: 2tnk + Owner: Greece + Facing: 0 + Location: 75,123 + Actor1302: 2tnk + Owner: Greece + Facing: 0 + Location: 77,123 + Actor1312: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 72,125 + Actor1313: e1 + Owner: Greece + SubCell: 2 + Facing: 0 + Location: 70,125 + Actor1314: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 70,125 + Actor1315: e1 + Owner: Greece + SubCell: 2 + Facing: 0 + Location: 72,125 + Actor1322: e1 + Owner: Greece + SubCell: 1 + Facing: 0 + Location: 72,125 + Actor1323: e1 + Owner: Greece + SubCell: 2 + Facing: 0 + Location: 74,125 + Actor1324: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 74,125 + Actor1325: e1 + Owner: Greece + SubCell: 1 + Facing: 0 + Location: 74,125 + Actor1326: e1 + Owner: Greece + SubCell: 2 + Facing: 0 + Location: 76,125 + Actor1327: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 76,125 + Actor1328: e1 + Owner: Greece + SubCell: 1 + Facing: 0 + Location: 76,125 + Actor1329: e1 + Owner: Greece + SubCell: 1 + Facing: 0 + Location: 78,125 + Actor1330: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 78,125 + Actor1293: e3 + Owner: Greece + Location: 71,126 + SubCell: 2 + Facing: 0 + Actor1291: e3 + Owner: Greece + SubCell: 2 + Facing: 0 + Location: 73,126 + Actor1294: e3 + Owner: Greece + SubCell: 1 + Facing: 0 + Location: 73,126 + Actor1295: e3 + Owner: Greece + SubCell: 2 + Facing: 0 + Location: 75,126 + Actor1296: e3 + Owner: Greece + SubCell: 1 + Facing: 0 + Location: 75,126 + Actor1304: e3 + Owner: Greece + SubCell: 1 + Facing: 0 + Location: 77,126 + NodBaseCenter: waypoint + Owner: Neutral + Location: 122,61 + AlliedBaseCenter: waypoint + Owner: Neutral + Location: 74,87 + SovietBaseCenter: waypoint + Owner: Neutral + Location: 10,69 + AlliedBaseFlare: flare + Owner: Greece + Location: 74,88 + Actor1309: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 71,96 + Actor1310: n1 + Owner: GDI + SubCell: 3 + Location: 77,96 + Facing: 559 + WestPath1: waypoint + Owner: Neutral + Location: 34,34 + WestPath2: waypoint + Owner: Neutral + Location: 22,62 + WestPath3: waypoint + Owner: Neutral + Location: 26,87 + WestPath4a: waypoint + Owner: Neutral + Location: 32,120 + WestPath4b: waypoint + Owner: Neutral + Location: 42,107 + MiddlePath1: waypoint + Owner: Neutral + Location: 67,62 + MiddlePath2: waypoint + Owner: Neutral + Location: 74,77 + MiddlePath3: waypoint + Owner: Neutral + Location: 74,101 + EastPath1: waypoint + Owner: Neutral + Location: 99,38 + EastPath2: waypoint + Owner: Neutral + Location: 108,54 + EastPath3: waypoint + Owner: Neutral + Location: 107,70 + EastPath4: waypoint + Owner: Neutral + Location: 104,94 + EastPath5a: waypoint + Owner: Neutral + Location: 93,104 + EastPath5b: waypoint + Owner: Neutral + Location: 103,112 + MiddlePath4a: waypoint + Owner: Neutral + Location: 64,107 + MiddlePath4b: waypoint + Owner: Neutral + Location: 80,106 + McvSpawn: waypoint + Owner: Neutral + Location: 74,132 + McvDest: waypoint + Owner: Neutral + Location: 74,122 + SovietFactory: weap + Owner: USSR + Location: 6,68 + Health: 40 + SovietBarracks: barr + Owner: USSR + Location: 12,71 + Health: 38 + SovietAirfield: fix + Owner: USSR + Location: 15,71 + Health: 45 + NodHand: hand + Owner: Nod + Location: 117,63 + Health: 40 + NodAirstrip: airs + Owner: Nod + Location: 126,63 + Health: 42 + NodHelipad: hpad.td + Owner: Nod + Location: 123,58 + Health: 44 + Coil1: waypoint + Owner: Neutral + Location: 4,76 + Coil2: waypoint + Owner: Neutral + Location: 12,76 + Coil3: waypoint + Owner: Neutral + Location: 19,76 + Coil4: waypoint + Owner: Neutral + Location: 19,69 + FlameTower1: waypoint + Owner: Neutral + Location: 5,78 + FlameTower2: waypoint + Owner: Neutral + Location: 11,78 + FlameTower3: waypoint + Owner: Neutral + Location: 21,75 + FlameTower4: waypoint + Owner: Neutral + Location: 21,69 + Coil5: waypoint + Owner: Neutral + Location: 15,61 + SovietSAM1: waypoint + Owner: Neutral + Location: 6,73 + NodSAM1: waypoint + Owner: Neutral + Location: 120,65 + Obelisk1: waypoint + Owner: Neutral + Location: 125,68 + Obelisk2: waypoint + Owner: Neutral + Location: 117,68 + Obelisk3: waypoint + Owner: Neutral + Location: 112,66 + Obelisk4: waypoint + Owner: Neutral + Location: 112,60 + Obelisk5: waypoint + Owner: Neutral + Location: 119,54 + LasTur1: waypoint + Owner: Neutral + Location: 117,70 + LasTur2: waypoint + Owner: Neutral + Location: 125,70 + LasTur3: waypoint + Owner: Neutral + Location: 110,58 + Actor982: hmmv + Owner: GDI + Facing: 384 + Location: 72,87 + NodRally: waypoint + Owner: Neutral + Location: 89,111 + DisruptorDropSpawn: waypoint + Owner: Neutral + Location: 67,1 + Actor1311: n1 + Owner: GDI + Facing: 384 + Location: 30,54 + SubCell: 3 + Actor1332: n1 + Owner: GDI + Facing: 384 + Location: 29,54 + SubCell: 3 + Actor1333: n1 + Owner: GDI + Facing: 384 + Location: 26,52 + SubCell: 3 + Actor1334: n1 + Owner: GDI + Facing: 384 + Location: 24,52 + SubCell: 3 + Actor1335: n1 + Owner: GDI + Facing: 384 + Location: 24,53 + SubCell: 3 + Actor1336: n1 + Owner: GDI + Facing: 384 + Location: 31,56 + SubCell: 3 + Actor1337: n1 + Owner: GDI + Facing: 384 + Location: 32,55 + SubCell: 3 + Actor1338: n1 + Owner: GDI + Location: 97,54 + SubCell: 3 + Facing: 627 + Actor1339: n1 + Owner: GDI + SubCell: 3 + Facing: 627 + Location: 96,55 + Actor1340: n1 + Owner: GDI + SubCell: 3 + Facing: 627 + Location: 98,54 + Actor1342: n1 + Owner: GDI + SubCell: 3 + Facing: 627 + Location: 102,53 + Actor1341: n1 + Owner: GDI + SubCell: 3 + Facing: 627 + Location: 102,51 + Actor1343: n1 + Owner: GDI + SubCell: 3 + Facing: 627 + Location: 104,51 + Actor1344: n1 + Owner: GDI + SubCell: 3 + Facing: 627 + Location: 97,53 + Actor1345: vulc.ai + Owner: GDI + Location: 96,54 + Facing: 606 + Actor1346: msam + Owner: GDI + Location: 103,49 + Facing: 627 + Actor1347: msam + Owner: GDI + Location: 89,41 + Facing: 647 + Actor1348: mtnk + Owner: GDI + Location: 100,51 + Facing: 606 + SovietRally: waypoint + Owner: Neutral + Location: 25,102 + Actor1349: sbag + Owner: GDI + Location: 61,62 + Actor1350: sbag + Owner: GDI + Location: 61,63 + Actor1351: sbag + Owner: GDI + Location: 62,63 + Actor1352: sbag + Owner: GDI + Location: 63,63 + Actor1353: sbag + Owner: GDI + Location: 64,63 + Actor1355: sbag + Owner: GDI + Location: 70,63 + Actor1356: sbag + Owner: GDI + Location: 71,63 + Actor1357: sbag + Owner: GDI + Location: 72,63 + Actor1358: sbag + Owner: GDI + Location: 73,63 + Actor1359: sbag + Owner: GDI + Location: 74,63 + Actor1360: sbag + Owner: GDI + Location: 74,62 + Actor1361: sbag + Owner: GDI + Location: 60,62 + Actor1362: sbag + Owner: GDI + Location: 60,61 + Actor1363: sbag + Owner: GDI + Location: 75,62 + Actor1364: sbag + Owner: GDI + Location: 75,61 + Actor1354: sbag + Owner: GDI + Location: 32,57 + Actor1365: sbag + Owner: GDI + Location: 31,57 + Actor1366: sbag + Owner: GDI + Location: 30,57 + Actor1367: sbag + Owner: GDI + Location: 29,57 + Actor1368: sbag + Owner: GDI + Location: 29,56 + Actor1369: sbag + Owner: GDI + Location: 24,54 + Actor1370: sbag + Owner: GDI + Location: 23,54 + Actor1371: sbag + Owner: GDI + Location: 23,53 + Actor1372: sbag + Owner: GDI + Location: 23,52 + Actor1373: sbag + Owner: GDI + Location: 23,51 + Actor1374: sbag + Owner: GDI + Location: 22,51 + Actor1375: gtwr + Owner: GDI + Location: 83,19 + Actor1376: gtwr + Owner: GDI + Location: 46,18 + Actor1377: vulc.ai + Owner: GDI + Facing: 384 + Location: 85,20 + Actor1379: vulc.ai + Owner: GDI + Facing: 384 + Location: 87,19 + Actor1380: vulc.ai + Owner: GDI + Facing: 384 + Location: 55,22 + Actor1381: vulc.ai + Owner: GDI + Facing: 384 + Location: 46,20 + Actor1378: vulc.ai + Owner: GDI + Facing: 384 + Location: 51,23 + Actor1082: ztrp + Owner: GDI + Facing: 384 + Location: 72,51 + SubCell: 3 + HawthorneHQ: miss + Owner: GDI + Location: 65,43 + Actor1382: chain + Owner: GDI + Location: 64,42 + Actor1383: chain + Owner: GDI + Location: 66,42 + Actor1384: chain + Owner: GDI + Location: 65,42 + Actor1385: chain + Owner: GDI + Location: 67,42 + Actor1386: chain + Owner: GDI + Location: 68,42 + Actor1387: chain + Owner: GDI + Location: 68,43 + Actor1388: chain + Owner: GDI + Location: 68,44 + Actor1389: chain + Owner: GDI + Location: 68,45 + Actor1390: chain + Owner: GDI + Location: 64,43 + Actor1391: chain + Owner: GDI + Location: 64,44 + Actor1392: chain + Owner: GDI + Location: 64,45 + Actor1393: chain + Owner: GDI + Location: 64,46 + Actor1394: chain + Owner: GDI + Location: 65,46 + Actor1395: chain + Owner: GDI + Location: 68,46 + Actor1396: chain + Owner: GDI + Location: 67,46 + Actor1397: cram + Owner: GDI + Location: 69,45 + Actor1398: cram + Owner: GDI + Location: 69,44 + Actor1399: cram + Owner: GDI + Location: 63,45 + Actor1400: cram + Owner: GDI + Location: 63,44 + Actor1401: gtwr + Owner: GDI + Location: 63,46 + Actor1402: gtwr + Owner: GDI + Location: 69,46 + Actor1403: rmbo + Owner: GDI + Location: 67,47 + SubCell: 3 + Facing: 384 + ScriptTags: HardAndAbove + Actor1232: msam + Owner: GDI + Facing: 491 + Location: 74,54 + Actor1231: msam + Owner: GDI + Facing: 518 + Location: 60,54 + Actor1216: htnk.ion + Owner: GDI + Facing: 511 + Location: 61,50 + Actor1196: disr + Owner: GDI + Facing: 504 + Location: 69,50 + Actor1175: n1 + Owner: GDI + Facing: 384 + Location: 69,49 + SubCell: 3 + PlayerStart: waypoint + Owner: Neutral + Location: 74,119 + Actor1308: split2 + Owner: Neutral + Location: 57,119 + Actor1404: camera + Owner: GDI + Location: 74,82 + Actor1405: camera + Owner: GDI + Location: 15,66 + Actor1406: camera + Owner: GDI + Location: 118,58 + Actor1407: camera + Owner: GDI + Location: 59,109 + Actor1408: camera + Owner: GDI + Location: 67,123 + Actor1409: camera + Owner: GDI + Location: 82,106 + Actor1410: camera + Owner: GDI + Location: 88,119 + Actor1411: camera + Owner: GDI + Location: 35,99 + Actor1412: camera + Owner: GDI + Location: 105,83 + Actor1292: cryt + Owner: Greece + Location: 70,122 + SubCell: 3 + Facing: 0 + Actor1303: cryt + Owner: Greece + Location: 78,122 + SubCell: 3 + Facing: 0 + NormalAndBelowCryo1: cryo + Owner: Greece + Location: 71,127 + Facing: 0 + ScriptTags: NormalAndBelow + NormalAndBelowCryo2: cryo + Owner: Greece + Location: 77,127 + Facing: 0 + ScriptTags: NormalAndBelow + CommandoDropDest: waypoint + Owner: Neutral + Location: 107,126 + CommandoDropWp1: waypoint + Owner: Neutral + Location: 128,120 + EngiDropWp1: waypoint + Owner: Neutral + Location: 10,102 + DisruptorDropDest4: waypoint + Owner: Neutral + Location: 52,82 + DisruptorDropRally: waypoint + Owner: Neutral + Location: 46,68 + DisruptorDropDest3: waypoint + Owner: Neutral + Location: 57,88 + DisruptorDropDest1: waypoint + Owner: Neutral + Location: 62,97 + DisruptorDropDest2: waypoint + Owner: Neutral + Location: 57,107 + LeftDropSpawn: waypoint + Owner: Neutral + Location: 17,1 + RightDropSpawn: waypoint + Owner: Neutral + Location: 124,1 + LeftEngiDropDest: waypoint + Owner: Neutral + Location: 5,67 + RightEngiDropDest: waypoint + Owner: Neutral + Location: 131,61 + RightDropExit: waypoint + Owner: Neutral + Location: 132,124 + LeftDropExit: waypoint + Owner: Neutral + Location: 1,129 + Actor1306: htnk.ion + Owner: GDI + Location: 121,114 + ScriptTags: VeryHardAndAbove + Facing: 384 + Actor1307: htnk.ion + Owner: GDI + Location: 123,115 + ScriptTags: VeryHardAndAbove + Facing: 384 + Actor1316: htnk.ion + Owner: GDI + Location: 17,122 + Facing: 768 + ScriptTags: VeryHardAndAbove + Actor1331: htnk.ion + Owner: GDI + Location: 15,116 + Facing: 768 + ScriptTags: VeryHardAndAbove + Actor1413: htnk.ion + Owner: GDI + Location: 17,118 + Facing: 768 + ScriptTags: VeryHardAndAbove + Actor1414: htnk.ion + Owner: GDI + Facing: 384 + Location: 124,83 + ScriptTags: VeryHardAndAbove + Actor1415: htnk.ion + Owner: GDI + Facing: 384 + Location: 123,81 + ScriptTags: VeryHardAndAbove + Actor1417: htnk.ion + Owner: GDI + Location: 5,87 + Facing: 642 + ScriptTags: VeryHardAndAbove + Actor1416: htnk.ion + Owner: GDI + Location: 5,90 + Facing: 642 + ScriptTags: VeryHardAndAbove + ZR1: zrai + Owner: GDI + Location: 78,37 + SubCell: 3 + Facing: 384 + ZR2: zrai + Owner: GDI + Location: 79,37 + SubCell: 3 + Facing: 586 + ZR3: zrai + Owner: GDI + Location: 80,37 + SubCell: 3 + Facing: 384 + ZR4: zrai + Owner: GDI + Location: 81,37 + SubCell: 3 + Facing: 384 + ScriptTags: HardAndAbove + ZR5: zrai + Owner: GDI + Location: 82,37 + SubCell: 3 + Facing: 511 + ScriptTags: HardAndAbove + ZR6: zrai + Owner: GDI + Location: 83,37 + SubCell: 3 + Facing: 384 + ScriptTags: HardAndAbove + ZR7: zrai + Owner: GDI + Location: 84,37 + SubCell: 3 + Facing: 384 + ScriptTags: VeryHardAndAbove + ZR8: zrai + Owner: GDI + Location: 85,37 + SubCell: 3 + Facing: 654 + ScriptTags: BrutalOnly + ZRWP1: waypoint + Owner: Neutral + Location: 86,50 + ZRWP2: waypoint + Owner: Neutral + Location: 90,54 + ZRWP3: waypoint + Owner: Neutral + Location: 91,81 + ZRWP4: waypoint + Owner: Neutral + Location: 86,90 + ZRWP5b: waypoint + Owner: Neutral + Location: 83,87 + HawthorneSpawn: waypoint + Owner: Neutral + Location: 66,45 + HawthorneJumpDest: waypoint + Owner: Neutral + Location: 66,40 + HardAndBelowMechanic: mech + Owner: Greece + Location: 69,125 + SubCell: 3 + Facing: 0 + ScriptTags: HardAndBelow + HardAndBelowMedic: medi + Owner: Greece + Facing: 0 + Location: 79,125 + SubCell: 3 + ScriptTags: HardAndBelow + NormalAndBelowIFV1: ifv + Owner: Greece + Location: 69,123 + Facing: 0 + ScriptTags: NormalAndBelow + NormalAndBelowIFV2: ifv + Owner: Greece + Location: 79,123 + Facing: 0 + ScriptTags: NormalAndBelow + ZRWP5a: waypoint + Owner: Neutral + Location: 81,92 + ZRWP5c: waypoint + Owner: Neutral + Location: 82,90 + Actor1236: hmmv.tow + Owner: GDI + Location: 47,28 + Facing: 252 + Actor1305: hmmv.tow + Owner: GDI + Location: 49,32 + Facing: 259 + Actor1418: hmmv.tow + Owner: GDI + Location: 80,28 + Facing: 763 + Actor1419: hmmv.tow + Owner: GDI + Location: 85,32 + Facing: 252 + Actor1420: hmmv.tow + Owner: GDI + Facing: 384 + Location: 81,48 + Actor1425: hmmv.tow + Owner: GDI + Facing: 384 + Location: 76,45 + CenterFactory: weap.td + Owner: GDI + Location: 64,48 + CenterBarracks: pyle + Owner: GDI + Location: 71,47 + WestFactory: weap.td + Owner: GDI + Location: 48,38 + WestBarracks: pyle + Owner: GDI + Location: 44,36 + EastFactory: weap.td + Owner: GDI + Location: 81,40 + EastBarracks: pyle + Owner: GDI + Location: 85,38 + Actor1421: atwr + Owner: GDI + Location: 78,8 + Actor1422: atwr + Owner: GDI + Location: 67,7 + Actor1424: atwr + Owner: GDI + Location: 50,10 + Actor1426: atwr + Owner: GDI + Location: 58,7 + Actor1427: nuk2 + Owner: GDI + Location: 87,21 + Actor1428: nuk2 + Owner: GDI + Location: 57,37 + Actor1197: disr + Owner: GDI + Facing: 384 + Location: 56,40 + Actor1429: xo + Owner: GDI + Location: 59,11 + Facing: 384 + Actor1430: xo + Owner: GDI + Facing: 384 + Location: 75,10 + Actor1431: xo + Owner: GDI + Location: 71,16 + Facing: 0 + Actor1432: xo + Owner: GDI + Location: 51,12 + Facing: 641 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|missions/main-campaign/ca45-multipolarity/multipolarity-rules.yaml, ca|rules/custom/coop-rules.yaml, multipolarity-coop-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/coop-campaign/ca45-multipolarity-coop/multipolarity-coop-rules.yaml b/mods/ca/missions/coop-campaign/ca45-multipolarity-coop/multipolarity-coop-rules.yaml new file mode 100644 index 0000000000..ff2157f1db --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca45-multipolarity-coop/multipolarity-coop-rules.yaml @@ -0,0 +1,6 @@ +World: + LuaScript: + Scripts: campaign.lua, coop.lua, ca|missions/main-campaign/ca45-multipolarity/multipolarity.lua, multipolarity-coop.lua + LobbyMissionInfo@InitialObjectives: + Prefix: Initial Objectives + Text: • Secure the decomissioned Allied base.\n• Capture General Hawthorne's Command Center. diff --git a/mods/ca/missions/coop-campaign/ca45-multipolarity-coop/multipolarity-coop.lua b/mods/ca/missions/coop-campaign/ca45-multipolarity-coop/multipolarity-coop.lua new file mode 100644 index 0000000000..cad45245dd --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca45-multipolarity-coop/multipolarity-coop.lua @@ -0,0 +1,93 @@ + +SetupPlayers = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Multi2 = Player.GetPlayer("Multi2") + Multi3 = Player.GetPlayer("Multi3") + Multi4 = Player.GetPlayer("Multi4") + Multi5 = Player.GetPlayer("Multi5") + Greece = Player.GetPlayer("Greece") + GDI = Player.GetPlayer("GDI") + Scrin = Player.GetPlayer("Scrin") + England = Player.GetPlayer("England") + USSR = Player.GetPlayer("USSR") + Nod = Player.GetPlayer("Nod") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = Utils.Where({ Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 }, function(p) return p ~= nil end) + MissionEnemies = { GDI } + SinglePlayerPlayer = Greece + CoopInit() +end + +AfterWorldLoaded = function() + StartCashSpread(3500) +end + +AfterTick = function() + +end + +DoMcvArrival = function() + local x = 70 + Utils.Do(GetMcvPlayers(), function(p) + Reinforcements.Reinforce(p, { "mcv" }, { CPos.New(x, 132), CPos.New(x, 128)}) + x = x + 2 + end) +end + +TransferAlliedAssets = function() + local recipientPlayer = GetFirstActivePlayer() + local highestAssetValue = 0 + + Utils.Do(GetMcvPlayers(), function(p) + local playerAssetsNearby = Utils.Where(Map.ActorsInCircle(AlliedBaseCenter.CenterPosition, WDist.New(20 * 1024)), function(a) + return a.Owner == p + end) + + local playerAssetValue = GetTotalCostOfUnits(playerAssetsNearby) + if playerAssetValue > highestAssetValue then + highestAssetValue = playerAssetValue + recipientPlayer = p + end + end) + + TransferBaseToPlayer(England, recipientPlayer) +end + +TransferSovietAssets = function() + local recipientPlayer = GetFirstActivePlayer() + local highestAssetValue = 0 + + Utils.Do(GetMcvPlayers(), function(p) + local playerAssetsNearby = Utils.Where(Map.ActorsInCircle(SovietBaseCenter.CenterPosition, WDist.New(20 * 1024)), function(a) + return a.Owner == p + end) + + local playerAssetValue = GetTotalCostOfUnits(playerAssetsNearby) + if playerAssetValue > highestAssetValue then + highestAssetValue = playerAssetValue + recipientPlayer = p + end + end) + + TransferBaseToPlayer(USSR, recipientPlayer) +end + +TransferNodAssets = function() + local recipientPlayer = GetFirstActivePlayer() + local highestAssetValue = 0 + + Utils.Do(GetMcvPlayers(), function(p) + local playerAssetsNearby = Utils.Where(Map.ActorsInCircle(NodBaseCenter.CenterPosition, WDist.New(20 * 1024)), function(a) + return a.Owner == p + end) + + local playerAssetValue = GetTotalCostOfUnits(playerAssetsNearby) + if playerAssetValue > highestAssetValue then + highestAssetValue = playerAssetValue + recipientPlayer = p + end + end) + + TransferBaseToPlayer(Nod, recipientPlayer) +end diff --git a/mods/ca/missions/coop-campaign/ca46-intervention-coop/intervention-coop-rules.yaml b/mods/ca/missions/coop-campaign/ca46-intervention-coop/intervention-coop-rules.yaml new file mode 100644 index 0000000000..74683fa719 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca46-intervention-coop/intervention-coop-rules.yaml @@ -0,0 +1,6 @@ +World: + LuaScript: + Scripts: campaign.lua, coop.lua, ca|missions/main-campaign/ca46-intervention/intervention.lua, intervention-coop.lua + LobbyMissionInfo@InitialObjectives: + Prefix: Initial Objectives + Text: • Destroy or capture all Nod Tiberium Silos. diff --git a/mods/ca/missions/coop-campaign/ca46-intervention-coop/intervention-coop.lua b/mods/ca/missions/coop-campaign/ca46-intervention-coop/intervention-coop.lua new file mode 100644 index 0000000000..74006b1fa8 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca46-intervention-coop/intervention-coop.lua @@ -0,0 +1,25 @@ + +SetupPlayers = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Multi2 = Player.GetPlayer("Multi2") + Multi3 = Player.GetPlayer("Multi3") + Multi4 = Player.GetPlayer("Multi4") + Multi5 = Player.GetPlayer("Multi5") + Greece = Player.GetPlayer("Greece") + Nod = Player.GetPlayer("Nod") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = Utils.Where({ Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 }, function(p) return p ~= nil end) + MissionEnemies = { Nod } + SinglePlayerPlayer = Greece + CoopInit() +end + +AfterWorldLoaded = function() + TransferMcvsToPlayers() + StartCashSpread(3500) +end + +AfterTick = function() + +end diff --git a/mods/ca/missions/coop-campaign/ca46-intervention-coop/map.bin b/mods/ca/missions/coop-campaign/ca46-intervention-coop/map.bin new file mode 100644 index 0000000000..f5799a4890 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca46-intervention-coop/map.bin differ diff --git a/mods/ca/missions/coop-campaign/ca46-intervention-coop/map.png b/mods/ca/missions/coop-campaign/ca46-intervention-coop/map.png new file mode 100644 index 0000000000..b976908538 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca46-intervention-coop/map.png differ diff --git a/mods/ca/missions/coop-campaign/ca46-intervention-coop/map.yaml b/mods/ca/missions/coop-campaign/ca46-intervention-coop/map.yaml new file mode 100644 index 0000000000..da6d28ff65 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca46-intervention-coop/map.yaml @@ -0,0 +1,4143 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 46: Intervention Co-op + +Author: Darkademic & Gandorques Hikla + +Tileset: TEMPERAT + +MapSize: 162,194 + +Bounds: 1,1,160,192 + +Visibility: Lobby + +Categories: Co-op Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: Greece, Nod, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + PlayerReference@Greece: + Name: Greece + Faction: allies + Color: 99ACF2 + Allies: Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Nod, Creeps + PlayerReference@Nod: + Name: Nod + Bot: campaign + Faction: nod + Color: FE1100 + Enemies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 99ACF2 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Nod, Creeps + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 0B7310 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Nod, Creeps + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 134691 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Nod, Creeps + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 775A12 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Nod, Creeps + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 994050 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Nod, Creeps + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: EEA8A8 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: Nod, Creeps + +Actors: + Actor0: spen.nod + Owner: Nod + Location: 83,43 + Actor1: spen.nod + Owner: Nod + Location: 126,17 + Actor2: spen.nod + Owner: Nod + Location: 135,17 + Actor3: spen.nod + Owner: Nod + Location: 37,22 + Actor4: tmpl + Owner: Nod + Location: 126,31 + Actor5: tmpp + Owner: Nod + Location: 122,30 + Actor6: brik + Owner: Nod + Location: 126,23 + Actor7: brik + Owner: Nod + Location: 127,23 + Actor8: brik + Owner: Nod + Location: 126,24 + Actor9: brik + Owner: Nod + Location: 127,24 + Actor10: brik + Owner: Nod + Location: 137,23 + Actor11: brik + Owner: Nod + Location: 137,24 + Actor12: brik + Owner: Nod + Location: 138,23 + Actor14: brik + Owner: Nod + Location: 139,23 + Actor15: brik + Owner: Nod + Location: 139,24 + Actor16: brik + Owner: Nod + Location: 136,23 + Actor17: brik + Owner: Nod + Location: 136,24 + Actor18: brik + Owner: Nod + Location: 139,25 + Actor19: brik + Owner: Nod + Location: 140,25 + Actor20: brik + Owner: Nod + Location: 140,26 + Actor21: brik + Owner: Nod + Location: 140,27 + Actor22: brik + Owner: Nod + Location: 140,28 + Actor23: brik + Owner: Nod + Location: 141,28 + Actor24: brik + Owner: Nod + Location: 143,28 + Actor25: brik + Owner: Nod + Location: 144,28 + Actor26: brik + Owner: Nod + Location: 142,28 + Actor27: brik + Owner: Nod + Location: 144,29 + Actor28: brik + Owner: Nod + Location: 145,29 + Actor29: brik + Owner: Nod + Location: 146,29 + Actor30: brik + Owner: Nod + Location: 147,29 + Actor31: brik + Owner: Nod + Location: 147,30 + Actor32: brik + Owner: Nod + Location: 147,31 + Actor33: brik + Owner: Nod + Location: 147,32 + Actor34: brik + Owner: Nod + Location: 147,33 + Actor35: brik + Owner: Nod + Location: 146,33 + Actor36: brik + Owner: Nod + Location: 146,40 + Actor37: brik + Owner: Nod + Location: 146,39 + Actor38: brik + Owner: Nod + Location: 146,38 + Actor39: brik + Owner: Nod + Location: 146,37 + Actor40: brik + Owner: Nod + Location: 146,36 + Actor41: brik + Owner: Nod + Location: 146,35 + Actor42: brik + Owner: Nod + Location: 146,34 + Actor43: brik + Owner: Nod + Location: 125,23 + Actor44: brik + Owner: Nod + Location: 124,23 + Actor45: brik + Owner: Nod + Location: 124,22 + Actor46: brik + Owner: Nod + Location: 123,22 + Actor47: brik + Owner: Nod + Location: 122,22 + Actor48: brik + Owner: Nod + Location: 121,22 + Actor49: brik + Owner: Nod + Location: 121,21 + Actor50: brik + Owner: Nod + Location: 120,21 + Actor51: brik + Owner: Nod + Location: 119,21 + Actor52: brik + Owner: Nod + Location: 118,21 + Actor53: brik + Owner: Nod + Location: 117,21 + Actor54: brik + Owner: Nod + Location: 115,21 + Actor55: brik + Owner: Nod + Location: 116,21 + Actor56: brik + Owner: Nod + Location: 115,22 + Actor57: brik + Owner: Nod + Location: 115,23 + Actor58: brik + Owner: Nod + Location: 115,24 + Actor59: brik + Owner: Nod + Location: 115,25 + Actor60: brik + Owner: Nod + Location: 115,26 + Actor61: brik + Owner: Nod + Location: 116,26 + Actor62: brik + Owner: Nod + Location: 116,25 + Actor63: brik + Owner: Nod + Location: 115,33 + Actor64: brik + Owner: Nod + Location: 116,33 + Actor65: brik + Owner: Nod + Location: 115,34 + Actor66: brik + Owner: Nod + Location: 116,34 + Actor67: brik + Owner: Nod + Location: 115,35 + Actor68: brik + Owner: Nod + Location: 115,36 + Actor69: brik + Owner: Nod + Location: 115,37 + Actor70: brik + Owner: Nod + Location: 115,38 + Actor71: brik + Owner: Nod + Location: 115,39 + Actor72: brik + Owner: Nod + Location: 115,40 + Actor73: brik + Owner: Nod + Location: 116,40 + Actor74: brik + Owner: Nod + Location: 117,40 + Actor75: brik + Owner: Nod + Location: 118,40 + Actor76: brik + Owner: Nod + Location: 119,40 + Actor77: brik + Owner: Nod + Location: 120,40 + Actor78: brik + Owner: Nod + Location: 121,40 + Actor79: brik + Owner: Nod + Location: 121,41 + Actor80: brik + Owner: Nod + Location: 121,42 + Actor81: brik + Owner: Nod + Location: 121,43 + Actor82: brik + Owner: Nod + Location: 121,44 + Actor83: brik + Owner: Nod + Location: 122,44 + Actor84: brik + Owner: Nod + Location: 123,44 + Actor85: brik + Owner: Nod + Location: 124,44 + Actor86: brik + Owner: Nod + Location: 126,44 + Actor87: brik + Owner: Nod + Location: 125,44 + Actor88: brik + Owner: Nod + Location: 127,44 + Actor89: brik + Owner: Nod + Location: 129,44 + Actor90: brik + Owner: Nod + Location: 130,44 + Actor91: brik + Owner: Nod + Location: 128,44 + Actor92: brik + Owner: Nod + Location: 131,44 + Actor93: brik + Owner: Nod + Location: 131,43 + Actor94: brik + Owner: Nod + Location: 132,43 + Actor95: brik + Owner: Nod + Location: 133,43 + Actor96: brik + Owner: Nod + Location: 134,43 + Actor97: brik + Owner: Nod + Location: 134,42 + Actor98: brik + Owner: Nod + Location: 134,41 + Actor99: brik + Owner: Nod + Location: 135,41 + Actor100: brik + Owner: Nod + Location: 135,40 + Actor101: brik + Owner: Nod + Location: 135,39 + Actor102: brik + Owner: Nod + Location: 137,39 + Actor103: brik + Owner: Nod + Location: 138,39 + Actor104: brik + Owner: Nod + Location: 136,39 + Actor105: brik + Owner: Nod + Location: 139,39 + Actor106: brik + Owner: Nod + Location: 140,39 + Actor107: brik + Owner: Nod + Location: 140,40 + Actor108: brik + Owner: Nod + Location: 141,40 + Actor109: brik + Owner: Nod + Location: 142,40 + Actor110: brik + Owner: Nod + Location: 144,40 + Actor111: brik + Owner: Nod + Location: 145,40 + Actor112: brik + Owner: Nod + Location: 143,40 + Actor113: proc.td + Owner: Nod + Location: 118,28 + Actor114: afac + Owner: Nod + Location: 143,37 + Actor116: hpad.td + Owner: Nod + Location: 122,41 + Actor118: hpad.td + Owner: Nod + Location: 125,41 + Actor119: hpad.td + Owner: Nod + Location: 128,41 + Actor115: rep + Owner: Nod + Location: 124,37 + Actor120: hpad.td + Owner: Nod + Location: 128,37 + Actor121: hpad.td + Owner: Nod + Location: 131,39 + Actor122: hq + Owner: Nod + Location: 138,36 + Actor123: nuk2 + Owner: Nod + Location: 116,37 + Actor124: nuk2 + Owner: Nod + Location: 118,37 + Actor125: nuk2 + Owner: Nod + Location: 120,37 + Actor126: nuk2 + Owner: Nod + Location: 145,30 + Actor127: nuk2 + Owner: Nod + Location: 144,33 + Actor128: nuk2 + Owner: Nod + Location: 142,29 + Actor129: nuk2 + Owner: Nod + Location: 140,29 + Actor130: nuk2 + Owner: Nod + Location: 142,33 + Actor131: nuk2 + Owner: Nod + Location: 140,33 + Actor134: hand + Owner: Nod + Location: 123,26 + Actor135: obli + Owner: Nod + Location: 125,24 + Actor136: obli + Owner: Nod + Location: 138,24 + Actor137: obli + Owner: Nod + Location: 141,39 + Actor138: obli + Owner: Nod + Location: 107,36 + Actor139: obli + Owner: Nod + Location: 106,23 + Actor140: nsam + Owner: Nod + Location: 111,20 + Actor141: nsam + Owner: Nod + Location: 110,38 + Actor142: nsam + Owner: Nod + Location: 116,35 + Actor143: nsam + Owner: Nod + Location: 116,23 + Actor144: nsam + Owner: Nod + Location: 141,37 + Actor145: nsam + Owner: Nod + Location: 137,26 + Actor146: nsam + Owner: Nod + Location: 131,37 + Actor147: ltur + Owner: Nod + Location: 128,23 + TurretFacing: 0 + Actor148: ltur + Owner: Nod + Location: 135,23 + TurretFacing: 0 + Actor149: gun.nod + Owner: Nod + Location: 133,23 + TurretFacing: 0 + Actor150: gun.nod + Owner: Nod + Location: 130,23 + TurretFacing: 0 + Actor153: silo.td + Owner: Nod + Location: 137,34 + Actor154: silo.td + Owner: Nod + Location: 137,32 + Actor155: silo.td + Owner: Nod + Location: 137,30 + Actor156: split2 + Owner: Neutral + Location: 110,34 + Actor157: split2 + Owner: Neutral + Location: 109,28 + Actor158: split2 + Owner: Neutral + Location: 112,23 + Actor175: silo.td + Owner: Nod + Location: 99,84 + Actor176: silo.td + Owner: Nod + Location: 99,86 + Actor177: silo.td + Owner: Nod + Location: 99,88 + Actor179: chain + Owner: Nod + Location: 99,82 + Actor180: chain + Owner: Nod + Location: 98,82 + Actor181: chain + Owner: Nod + Location: 98,83 + Actor182: chain + Owner: Nod + Location: 98,84 + Actor183: chain + Owner: Nod + Location: 98,85 + Actor184: chain + Owner: Nod + Location: 98,88 + Actor185: chain + Owner: Nod + Location: 98,87 + Actor191: chain + Owner: Nod + Location: 98,86 + Actor192: silo.td + Owner: Nod + Location: 102,83 + Actor193: silo.td + Owner: Nod + Location: 102,85 + Actor194: silo.td + Owner: Nod + Location: 102,87 + Actor195: chain + Owner: Nod + Location: 103,82 + Actor196: chain + Owner: Nod + Location: 102,82 + Actor197: chain + Owner: Nod + Location: 100,82 + Actor198: chain + Owner: Nod + Location: 101,82 + Actor199: chain + Owner: Nod + Location: 104,82 + Actor200: chain + Owner: Nod + Location: 104,83 + Actor201: chain + Owner: Nod + Location: 104,84 + Actor202: chain + Owner: Nod + Location: 104,85 + Actor203: chain + Owner: Nod + Location: 104,86 + Actor204: chain + Owner: Nod + Location: 104,87 + Actor205: chain + Owner: Nod + Location: 104,88 + Actor206: chain + Owner: Nod + Location: 99,90 + Actor207: chain + Owner: Nod + Location: 98,90 + Actor208: chain + Owner: Nod + Location: 98,89 + Actor209: silo.td + Owner: Nod + Location: 102,89 + Actor210: chain + Owner: Nod + Location: 104,89 + Actor211: chain + Owner: Nod + Location: 104,90 + Actor212: chain + Owner: Nod + Location: 103,90 + Actor189: gun.nod + Owner: Nod + Location: 96,92 + TurretFacing: 409 + Actor190: gun.nod + Owner: Nod + Location: 106,94 + TurretFacing: 579 + Actor213: gun.nod + Owner: Nod + Location: 95,82 + Actor214: nsam + Owner: Nod + Location: 106,88 + Actor215: nsam + Owner: Nod + Location: 95,88 + Actor216: nsam + Owner: Nod + Location: 100,80 + Actor217: silo.td + Owner: Nod + Location: 96,46 + Actor218: silo.td + Owner: Nod + Location: 93,45 + Actor219: silo.td + Owner: Nod + Location: 90,44 + Actor220: silo.td + Owner: Nod + Location: 91,46 + Actor221: silo.td + Owner: Nod + Location: 94,47 + Actor222: silo.td + Owner: Nod + Location: 95,49 + Actor223: silo.td + Owner: Nod + Location: 92,48 + Actor224: silo.td + Owner: Nod + Location: 90,49 + Actor225: gun.nod + Owner: Nod + Location: 97,44 + TurretFacing: 0 + Actor133: airs + Owner: Nod + Location: 131,30 + Actor226: silo.td + Owner: Nod + Location: 136,177 + Actor227: silo.td + Owner: Nod + Location: 135,179 + Actor228: silo.td + Owner: Nod + Location: 134,181 + Actor229: silo.td + Owner: Nod + Location: 137,181 + Actor230: silo.td + Owner: Nod + Location: 136,183 + Actor231: silo.td + Owner: Nod + Location: 139,183 + Actor232: silo.td + Owner: Nod + Location: 138,185 + Actor233: silo.td + Owner: Nod + Location: 134,185 + Actor234: silo.td + Owner: Nod + Location: 132,177 + Actor235: nsam + Owner: Nod + Location: 128,182 + Actor236: nsam + Owner: Nod + Location: 142,180 + Actor237: nsam + Owner: Nod + Location: 141,187 + Actor239: gun.nod + Owner: Nod + Location: 144,178 + TurretFacing: 0 + Actor241: gun.nod + Owner: Nod + Location: 122,186 + Actor242: gun.nod + Owner: Nod + Location: 124,182 + Actor243: gun.nod + Owner: Nod + Location: 149,184 + TurretFacing: 675 + Actor238: oilb + Owner: Nod + Location: 23,87 + Actor240: oilb + Owner: Nod + Location: 24,84 + Actor244: mslo.nod + Owner: Nod + Location: 124,35 + Actor245: brik + Owner: Nod + Location: 155,126 + Actor246: brik + Owner: Nod + Location: 155,127 + Actor247: brik + Owner: Nod + Location: 155,128 + Actor248: brik + Owner: Nod + Location: 155,129 + Actor249: brik + Owner: Nod + Location: 155,130 + Actor250: brik + Owner: Nod + Location: 154,130 + Actor251: brik + Owner: Nod + Location: 153,130 + Actor252: brik + Owner: Nod + Location: 151,130 + Actor253: brik + Owner: Nod + Location: 152,130 + Actor254: brik + Owner: Nod + Location: 156,126 + Actor255: brik + Owner: Nod + Location: 157,125 + Actor256: brik + Owner: Nod + Location: 157,126 + Actor257: brik + Owner: Nod + Location: 158,125 + Actor258: brik + Owner: Nod + Location: 159,125 + Actor259: brik + Owner: Nod + Location: 160,125 + Actor260: brik + Owner: Nod + Location: 160,126 + Actor261: brik + Owner: Nod + Location: 160,127 + Actor262: brik + Owner: Nod + Location: 160,128 + Actor263: brik + Owner: Nod + Location: 160,129 + Actor264: brik + Owner: Nod + Location: 160,130 + Actor265: brik + Owner: Nod + Location: 160,131 + Actor266: brik + Owner: Nod + Location: 160,132 + Actor267: brik + Owner: Nod + Location: 160,133 + Actor268: brik + Owner: Nod + Location: 160,134 + Actor269: brik + Owner: Nod + Location: 150,130 + Actor270: brik + Owner: Nod + Location: 149,130 + Actor271: brik + Owner: Nod + Location: 149,129 + Actor272: brik + Owner: Nod + Location: 148,129 + Actor273: brik + Owner: Nod + Location: 147,129 + Actor274: brik + Owner: Nod + Location: 147,130 + Actor275: brik + Owner: Nod + Location: 146,130 + Actor276: brik + Owner: Nod + Location: 145,130 + Actor277: brik + Owner: Nod + Location: 144,130 + Actor278: brik + Owner: Nod + Location: 144,132 + Actor279: brik + Owner: Nod + Location: 144,131 + Actor280: brik + Owner: Nod + Location: 144,133 + Actor281: brik + Owner: Nod + Location: 144,134 + Actor282: brik + Owner: Nod + Location: 144,135 + Actor283: brik + Owner: Nod + Location: 144,136 + Actor284: brik + Owner: Nod + Location: 145,136 + Actor285: brik + Owner: Nod + Location: 145,135 + Actor286: brik + Owner: Nod + Location: 144,142 + Actor287: brik + Owner: Nod + Location: 144,143 + Actor288: brik + Owner: Nod + Location: 145,142 + Actor289: brik + Owner: Nod + Location: 145,143 + Actor290: brik + Owner: Nod + Location: 144,144 + Actor291: brik + Owner: Nod + Location: 144,145 + Actor292: brik + Owner: Nod + Location: 144,146 + Actor293: brik + Owner: Nod + Location: 146,146 + Actor294: brik + Owner: Nod + Location: 145,146 + Actor295: brik + Owner: Nod + Location: 147,146 + Actor296: brik + Owner: Nod + Location: 148,146 + Actor297: brik + Owner: Nod + Location: 150,146 + Actor298: brik + Owner: Nod + Location: 149,146 + Actor299: brik + Owner: Nod + Location: 152,146 + Actor300: brik + Owner: Nod + Location: 151,146 + Actor301: brik + Owner: Nod + Location: 151,145 + Actor302: brik + Owner: Nod + Location: 152,145 + Actor303: brik + Owner: Nod + Location: 157,145 + Actor304: brik + Owner: Nod + Location: 157,146 + Actor305: brik + Owner: Nod + Location: 158,145 + Actor306: brik + Owner: Nod + Location: 158,146 + Actor307: brik + Owner: Nod + Location: 160,146 + Actor308: brik + Owner: Nod + Location: 159,146 + Actor309: brik + Owner: Nod + Location: 160,145 + Actor310: brik + Owner: Nod + Location: 160,144 + Actor311: brik + Owner: Nod + Location: 160,143 + Actor312: brik + Owner: Nod + Location: 160,142 + Actor313: brik + Owner: Nod + Location: 160,141 + Actor315: brik + Owner: Nod + Location: 160,140 + Actor316: brik + Owner: Nod + Location: 160,139 + Actor317: brik + Owner: Nod + Location: 160,138 + Actor318: brik + Owner: Nod + Location: 160,137 + Actor319: brik + Owner: Nod + Location: 160,136 + Actor320: brik + Owner: Nod + Location: 160,135 + Actor314: hand + Owner: Nod + Location: 149,140 + Actor329: gun.nod + Owner: Nod + Location: 147,157 + TurretFacing: 477 + Actor331: gun.nod + Owner: Nod + Location: 131,155 + TurretFacing: 300 + Actor334: gun.nod + Owner: Nod + Location: 141,128 + TurretFacing: 192 + Actor335: gun.nod + Owner: Nod + Location: 133,137 + Actor336: gun.nod + Owner: Nod + Location: 122,45 + TurretFacing: 470 + Actor337: gun.nod + Owner: Nod + Location: 148,30 + TurretFacing: 627 + Actor338: gun.nod + Owner: Nod + Location: 106,84 + TurretFacing: 811 + Actor339: gun.nod + Owner: Nod + Location: 101,50 + TurretFacing: 811 + Actor340: gun.nod + Owner: Nod + Location: 103,69 + TurretFacing: 572 + Actor341: gun.nod + Owner: Nod + Location: 86,70 + TurretFacing: 606 + Actor342: gun.nod + Owner: Nod + Location: 95,70 + TurretFacing: 443 + Actor344: gun.nod + Owner: Nod + Location: 76,69 + TurretFacing: 634 + Actor343: proc.td + Owner: Nod + Location: 147,133 + Actor345: silo.td + Owner: Nod + Location: 151,136 + Actor346: silo.td + Owner: Nod + Location: 151,134 + Actor347: silo.td + Owner: Nod + Location: 151,132 + Actor348: silo.td + Owner: Nod + Location: 154,135 + Actor349: silo.td + Owner: Nod + Location: 154,133 + Actor350: silo.td + Owner: Nod + Location: 158,126 + Actor351: silo.td + Owner: Nod + Location: 158,128 + Actor352: silo.td + Owner: Nod + Location: 156,127 + Actor353: silo.td + Owner: Nod + Location: 156,129 + Actor354: silo.td + Owner: Nod + Location: 158,130 + Actor355: nuk2 + Owner: Nod + Location: 158,141 + Actor356: nuk2 + Owner: Nod + Location: 158,138 + Actor357: nuk2 + Owner: Nod + Location: 158,135 + Actor358: nuk2 + Owner: Nod + Location: 158,132 + Actor359: hq + Owner: Nod + Location: 154,138 + Actor360: sbag + Owner: Nod + Location: 92,124 + Actor361: sbag + Owner: Nod + Location: 91,124 + Actor362: sbag + Owner: Nod + Location: 90,124 + Actor363: sbag + Owner: Nod + Location: 89,124 + Actor364: sbag + Owner: Nod + Location: 88,124 + Actor365: sbag + Owner: Nod + Location: 87,124 + Actor366: sbag + Owner: Nod + Location: 97,124 + Actor367: sbag + Owner: Nod + Location: 98,124 + Actor368: sbag + Owner: Nod + Location: 99,124 + Actor369: sbag + Owner: Nod + Location: 100,124 + Actor370: sbag + Owner: Nod + Location: 101,124 + Actor371: sbag + Owner: Nod + Location: 101,125 + Actor372: sbag + Owner: Nod + Location: 101,126 + Actor373: sbag + Owner: Nod + Location: 86,124 + Actor374: sbag + Owner: Nod + Location: 86,125 + Actor375: sbag + Owner: Nod + Location: 86,126 + Actor376: sbag + Owner: Nod + Location: 86,127 + Actor377: sbag + Owner: Nod + Location: 86,128 + Actor378: sbag + Owner: Nod + Location: 86,132 + Actor379: sbag + Owner: Nod + Location: 86,133 + Actor380: sbag + Owner: Nod + Location: 86,134 + Actor381: sbag + Owner: Nod + Location: 86,135 + Actor382: sbag + Owner: Nod + Location: 87,136 + Actor383: sbag + Owner: Nod + Location: 86,136 + Actor384: sbag + Owner: Nod + Location: 89,136 + Actor385: sbag + Owner: Nod + Location: 88,136 + Actor386: sbag + Owner: Nod + Location: 91,136 + Actor387: sbag + Owner: Nod + Location: 90,136 + Actor389: sbag + Owner: Nod + Location: 92,136 + Actor393: sbag + Owner: Nod + Location: 98,136 + Actor394: sbag + Owner: Nod + Location: 97,136 + Actor395: sbag + Owner: Nod + Location: 101,127 + Actor396: sbag + Owner: Nod + Location: 101,128 + Actor397: sbag + Owner: Nod + Location: 101,129 + Actor398: sbag + Owner: Nod + Location: 101,130 + Actor399: sbag + Owner: Nod + Location: 101,131 + Actor400: sbag + Owner: Nod + Location: 101,132 + Actor401: sbag + Owner: Nod + Location: 101,133 + Actor402: sbag + Owner: Nod + Location: 101,134 + Actor403: sbag + Owner: Nod + Location: 101,135 + Actor404: sbag + Owner: Nod + Location: 101,136 + Actor405: sbag + Owner: Nod + Location: 100,136 + Actor406: sbag + Owner: Nod + Location: 99,136 + Actor390: hand + Owner: Nod + Location: 90,132 + Actor391: nuke + Owner: Nod + Location: 99,125 + Actor392: nuke + Owner: Nod + Location: 99,128 + Actor407: nuke + Owner: Nod + Location: 99,131 + Actor409: silo.td + Owner: Nod + Location: 91,126 + Actor411: gun.nod + Owner: Nod + Location: 85,127 + Actor412: gun.nod + Owner: Nod + Location: 85,133 + TurretFacing: 279 + Actor413: gun.nod + Owner: Nod + Location: 91,137 + TurretFacing: 450 + Actor414: gun.nod + Owner: Nod + Location: 98,137 + TurretFacing: 620 + Actor415: gun.nod + Owner: Nod + Location: 91,123 + TurretFacing: 0 + Actor416: gun.nod + Owner: Nod + Location: 98,123 + TurretFacing: 0 + Actor333: gun.nod + Owner: Nod + Location: 126,145 + TurretFacing: 286 + Actor330: gun.nod + Owner: Nod + Location: 159,160 + TurretFacing: 375 + Actor417: silo.td + Owner: Nod + Location: 116,118 + Actor418: silo.td + Owner: Nod + Location: 119,118 + Actor419: chain + Owner: Nod + Location: 116,117 + Actor420: chain + Owner: Nod + Location: 115,118 + Actor421: chain + Owner: Nod + Location: 115,117 + Actor422: chain + Owner: Nod + Location: 117,117 + Actor423: chain + Owner: Nod + Location: 118,117 + Actor424: chain + Owner: Nod + Location: 119,117 + Actor425: chain + Owner: Nod + Location: 115,119 + Actor426: chain + Owner: Nod + Location: 120,117 + Actor427: chain + Owner: Nod + Location: 121,117 + Actor428: chain + Owner: Nod + Location: 121,118 + Actor429: chain + Owner: Nod + Location: 121,119 + Actor434: silo.td + Owner: Nod + Location: 116,120 + Actor435: silo.td + Owner: Nod + Location: 119,120 + Actor436: silo.td + Owner: Nod + Location: 116,122 + Actor437: silo.td + Owner: Nod + Location: 119,122 + Actor447: chain + Owner: Nod + Location: 115,120 + Actor448: chain + Owner: Nod + Location: 115,121 + Actor449: chain + Owner: Nod + Location: 115,122 + Actor450: chain + Owner: Nod + Location: 117,123 + Actor451: chain + Owner: Nod + Location: 116,123 + Actor452: chain + Owner: Nod + Location: 115,123 + Actor453: chain + Owner: Nod + Location: 119,123 + Actor454: chain + Owner: Nod + Location: 118,123 + Actor455: chain + Owner: Nod + Location: 121,120 + Actor456: chain + Owner: Nod + Location: 121,123 + Actor457: chain + Owner: Nod + Location: 120,123 + Actor458: chain + Owner: Nod + Location: 121,122 + Actor459: chain + Owner: Nod + Location: 121,121 + Actor430: sbag + Owner: Nod + Location: 45,24 + Actor431: sbag + Owner: Nod + Location: 46,24 + Actor432: sbag + Owner: Nod + Location: 47,24 + Actor433: sbag + Owner: Nod + Location: 48,24 + Actor438: sbag + Owner: Nod + Location: 45,25 + Actor439: sbag + Owner: Nod + Location: 44,25 + Actor440: sbag + Owner: Nod + Location: 44,26 + Actor441: sbag + Owner: Nod + Location: 43,27 + Actor442: sbag + Owner: Nod + Location: 43,26 + Actor443: sbag + Owner: Nod + Location: 55,24 + Actor444: sbag + Owner: Nod + Location: 56,24 + Actor445: sbag + Owner: Nod + Location: 54,24 + Actor446: sbag + Owner: Nod + Location: 57,24 + Actor460: sbag + Owner: Nod + Location: 58,24 + Actor461: sbag + Owner: Nod + Location: 58,25 + Actor462: sbag + Owner: Nod + Location: 58,26 + Actor463: sbag + Owner: Nod + Location: 58,27 + Actor464: sbag + Owner: Nod + Location: 58,28 + Actor465: sbag + Owner: Nod + Location: 59,28 + Actor466: sbag + Owner: Nod + Location: 59,29 + Actor467: sbag + Owner: Nod + Location: 59,30 + Actor468: sbag + Owner: Nod + Location: 59,31 + Actor469: sbag + Owner: Nod + Location: 59,36 + Actor470: sbag + Owner: Nod + Location: 59,37 + Actor471: sbag + Owner: Nod + Location: 59,38 + Actor472: sbag + Owner: Nod + Location: 59,39 + Actor473: sbag + Owner: Nod + Location: 58,39 + Actor474: sbag + Owner: Nod + Location: 53,39 + Actor475: sbag + Owner: Nod + Location: 54,39 + Actor476: sbag + Owner: Nod + Location: 55,39 + Actor477: sbag + Owner: Nod + Location: 57,39 + Actor478: sbag + Owner: Nod + Location: 56,39 + Actor479: sbag + Owner: Nod + Location: 46,39 + Actor480: sbag + Owner: Nod + Location: 45,39 + Actor481: sbag + Owner: Nod + Location: 44,39 + Actor482: sbag + Owner: Nod + Location: 43,39 + Actor483: sbag + Owner: Nod + Location: 43,30 + Actor485: sbag + Owner: Nod + Location: 43,31 + Actor486: sbag + Owner: Nod + Location: 43,37 + Actor487: sbag + Owner: Nod + Location: 43,38 + Actor488: sbag + Owner: Nod + Location: 43,36 + Actor492: sbag + Owner: Nod + Location: 43,29 + Actor493: sbag + Owner: Nod + Location: 43,28 + Actor489: nuk2 + Owner: Nod + Location: 57,36 + Actor490: nuk2 + Owner: Nod + Location: 55,36 + Actor491: nuk2 + Owner: Nod + Location: 53,36 + Actor494: airs + Owner: Nod + Location: 52,31 + Actor495: hand + Owner: Nod + Location: 47,34 + Actor499: sbag + Owner: Nod + Location: 83,52 + Actor500: sbag + Owner: Nod + Location: 83,50 + Actor501: sbag + Owner: Nod + Location: 83,49 + Actor502: sbag + Owner: Nod + Location: 83,51 + Actor503: sbag + Owner: Nod + Location: 84,49 + Actor504: sbag + Owner: Nod + Location: 85,49 + Actor505: sbag + Owner: Nod + Location: 86,48 + Actor506: sbag + Owner: Nod + Location: 86,49 + Actor507: sbag + Owner: Nod + Location: 87,48 + Actor508: sbag + Owner: Nod + Location: 88,48 + Actor509: sbag + Owner: Nod + Location: 98,60 + Actor510: sbag + Owner: Nod + Location: 99,60 + Actor511: sbag + Owner: Nod + Location: 99,59 + Actor512: sbag + Owner: Nod + Location: 100,59 + Actor513: sbag + Owner: Nod + Location: 101,59 + Actor514: sbag + Owner: Nod + Location: 101,58 + Actor515: sbag + Owner: Nod + Location: 101,57 + Actor516: sbag + Owner: Nod + Location: 102,57 + Actor517: sbag + Owner: Nod + Location: 102,56 + Actor518: sbag + Owner: Nod + Location: 102,55 + Actor519: sbag + Owner: Nod + Location: 102,54 + Actor520: sbag + Owner: Nod + Location: 97,60 + Actor521: sbag + Owner: Nod + Location: 97,61 + Actor522: sbag + Owner: Nod + Location: 96,61 + Actor523: sbag + Owner: Nod + Location: 95,61 + Actor524: sbag + Owner: Nod + Location: 94,61 + Actor525: sbag + Owner: Nod + Location: 87,61 + Actor526: sbag + Owner: Nod + Location: 85,61 + Actor527: sbag + Owner: Nod + Location: 84,61 + Actor528: sbag + Owner: Nod + Location: 83,61 + Actor529: sbag + Owner: Nod + Location: 83,60 + Actor530: sbag + Owner: Nod + Location: 83,59 + Actor531: sbag + Owner: Nod + Location: 86,61 + Actor532: sbag + Owner: Nod + Location: 89,61 + Actor533: sbag + Owner: Nod + Location: 88,61 + Actor534: sbag + Owner: Nod + Location: 83,57 + Actor535: sbag + Owner: Nod + Location: 83,58 + Actor536: obli + Owner: Nod + Location: 84,60 + Actor537: obli + Owner: Nod + Location: 96,60 + Actor541: afac + Owner: Nod + Location: 98,53 + Actor543: nsam + Owner: Nod + Location: 103,67 + Actor544: nsam + Owner: Nod + Location: 72,64 + Actor545: nsam + Owner: Nod + Location: 70,52 + Actor546: nsam + Owner: Nod + Location: 77,46 + Actor547: nsam + Owner: Nod + Location: 80,70 + Actor548: nsam + Owner: Nod + Location: 98,135 + Actor549: nsam + Owner: Nod + Location: 87,135 + Actor550: nsam + Owner: Nod + Location: 118,115 + Actor551: nsam + Owner: Nod + Location: 118,125 + Actor552: nsam + Owner: Nod + Location: 145,131 + Actor553: nsam + Owner: Nod + Location: 145,144 + Actor554: nsam + Owner: Nod + Location: 155,131 + Actor555: nsam + Owner: Nod + Location: 92,160 + Actor556: nsam + Owner: Nod + Location: 19,129 + Actor557: nsam + Owner: Nod + Location: 35,113 + Actor558: nsam + Owner: Nod + Location: 36,103 + Actor559: nsam + Owner: Nod + Location: 137,82 + Actor560: nsam + Owner: Nod + Location: 47,175 + Actor561: nsam + Owner: Nod + Location: 47,122 + Actor562: nsam + Owner: Nod + Location: 134,68 + Actor563: nsam + Owner: Nod + Location: 44,38 + Actor564: nsam + Owner: Nod + Location: 56,25 + Actor565: nsam + Owner: Nod + Location: 25,43 + Actor567: split2 + Owner: Neutral + Location: 137,138 + Actor538: nuk2 + Owner: Nod + Location: 91,55 + Actor539: nuk2 + Owner: Nod + Location: 91,51 + Actor540: nuk2 + Owner: Nod + Location: 94,51 + Actor568: nuk2 + Owner: Nod + Location: 94,55 + Actor569: hq + Owner: Nod + Location: 45,27 + Actor570: proc.td + Owner: Nod + Location: 51,26 + Actor571: silo.td + Owner: Nod + Location: 55,27 + Actor572: silo.td + Owner: Nod + Location: 55,29 + Actor579: gun.nod + Owner: Nod + Location: 54,60 + TurretFacing: 627 + Actor580: gun.nod + Owner: Nod + Location: 27,59 + TurretFacing: 334 + Actor581: gun.nod + Owner: Nod + Location: 38,52 + TurretFacing: 436 + Actor582: gun.nod + Owner: Nod + Location: 53,50 + TurretFacing: 641 + Actor583: gun.nod + Owner: Nod + Location: 33,41 + Actor566: nsam + Owner: Nod + Location: 50,49 + Actor584: split2 + Owner: Neutral + Location: 50,19 + Actor585: nsam + Owner: Nod + Location: 40,74 + Actor586: nsam + Owner: Nod + Location: 127,167 + Actor587: gun.nod + Owner: Nod + Location: 125,170 + Actor588: gun.nod + Owner: Nod + Location: 134,168 + TurretFacing: 0 + Actor589: gun.nod + Owner: Nod + Location: 43,158 + TurretFacing: 456 + Actor590: gun.nod + Owner: Nod + Location: 32,151 + TurretFacing: 538 + Actor591: gun.nod + Owner: Nod + Location: 63,165 + Actor592: gun.nod + Owner: Nod + Location: 81,155 + Actor593: hpad.td + Owner: Nod + Location: 124,99 + Actor594: hpad.td + Owner: Nod + Location: 127,99 + Actor595: rep + Owner: Nod + Location: 125,95 + Actor596: chain + Owner: Nod + Location: 126,94 + Actor597: chain + Owner: Nod + Location: 124,94 + Actor598: chain + Owner: Nod + Location: 125,94 + Actor599: chain + Owner: Nod + Location: 127,94 + Actor600: chain + Owner: Nod + Location: 128,94 + Actor601: chain + Owner: Nod + Location: 123,94 + Actor602: chain + Owner: Nod + Location: 123,95 + Actor603: chain + Owner: Nod + Location: 123,96 + Actor604: chain + Owner: Nod + Location: 123,97 + Actor605: chain + Owner: Nod + Location: 123,98 + Actor606: chain + Owner: Nod + Location: 123,99 + Actor607: chain + Owner: Nod + Location: 123,100 + Actor608: chain + Owner: Nod + Location: 123,101 + Actor609: chain + Owner: Nod + Location: 123,102 + Actor610: chain + Owner: Nod + Location: 124,102 + Actor611: chain + Owner: Nod + Location: 125,102 + Actor612: chain + Owner: Nod + Location: 128,102 + Actor613: chain + Owner: Nod + Location: 127,102 + Actor614: chain + Owner: Nod + Location: 129,102 + Actor615: chain + Owner: Nod + Location: 129,101 + Actor616: chain + Owner: Nod + Location: 129,100 + Actor617: chain + Owner: Nod + Location: 129,99 + Actor618: chain + Owner: Nod + Location: 129,98 + Actor619: chain + Owner: Nod + Location: 129,97 + Actor620: chain + Owner: Nod + Location: 129,96 + Actor621: chain + Owner: Nod + Location: 129,95 + Actor622: chain + Owner: Nod + Location: 129,94 + Actor623: nsam + Owner: Nod + Location: 115,96 + Actor624: nsam + Owner: Nod + Location: 136,103 + Actor625: nsam + Owner: Nod + Location: 124,107 + Actor627: nsam + Owner: Nod + Location: 26,93 + Actor628: nsam + Owner: Nod + Location: 20,81 + Actor629: gun.nod + Owner: Nod + Location: 25,96 + TurretFacing: 606 + Actor630: gun.nod + Owner: Nod + Location: 18,89 + TurretFacing: 477 + Actor631: gun.nod + Owner: Nod + Location: 33,85 + TurretFacing: 845 + Actor632: gun.nod + Owner: Nod + Location: 26,78 + TurretFacing: 192 + Actor633: msg + Owner: Nod + Location: 133,179 + Facing: 384 + DeployState: Deployed + Actor634: msg + Owner: Nod + Location: 141,185 + Facing: 384 + DeployState: Deployed + Actor635: msg + Owner: Nod + Location: 118,121 + Facing: 384 + DeployState: Deployed + Actor637: msg + Owner: Nod + Location: 97,86 + DeployState: Deployed + Facing: 384 + StealthGen: sgen + Owner: Nod + Location: 130,34 + Actor639: mcv + Owner: Greece + Location: 7,174 + Facing: 768 + Actor640: ctnk + Owner: Greece + Location: 7,171 + Facing: 768 + Actor641: ctnk + Owner: Greece + Location: 7,177 + Facing: 768 + Actor642: jeep + Owner: Greece + Location: 11,172 + Facing: 768 + Actor643: jeep + Owner: Greece + Location: 11,176 + Facing: 768 + Actor626: nsam + Owner: Nod + Location: 76,104 + Actor644: gun.nod + Owner: Nod + Location: 76,107 + TurretFacing: 443 + Actor645: t10 + Owner: Neutral + Location: 42,154 + Actor646: t03 + Owner: Neutral + Location: 48,150 + Actor647: t13 + Owner: Neutral + Location: 30,147 + Actor648: t13 + Owner: Neutral + Location: 49,173 + Actor649: t15 + Owner: Neutral + Location: 73,157 + Actor650: t14 + Owner: Neutral + Location: 93,161 + Actor651: t12 + Owner: Neutral + Location: 89,157 + Actor652: t12 + Owner: Neutral + Location: 102,134 + Actor653: t03 + Owner: Neutral + Location: 76,125 + Actor654: t17 + Owner: Neutral + Location: 87,142 + Actor655: t14 + Owner: Neutral + Location: 95,141 + Actor656: t15 + Owner: Neutral + Location: 137,156 + Actor657: t13 + Owner: Neutral + Location: 146,153 + Actor658: t13 + Owner: Neutral + Location: 130,148 + Actor659: t03 + Owner: Neutral + Location: 133,155 + Actor660: t12 + Owner: Neutral + Location: 158,154 + Actor661: t12 + Owner: Neutral + Location: 128,143 + Actor662: t11 + Owner: Neutral + Location: 118,131 + Actor663: t13 + Owner: Neutral + Location: 124,121 + Actor664: t12 + Owner: Neutral + Location: 120,124 + Actor665: t03 + Owner: Neutral + Location: 123,118 + Actor666: t03 + Owner: Neutral + Location: 100,122 + Actor667: t11 + Owner: Neutral + Location: 78,122 + Actor668: t14 + Owner: Neutral + Location: 100,109 + Actor669: t15 + Owner: Neutral + Location: 79,110 + Actor670: t13 + Owner: Neutral + Location: 95,85 + Actor671: t10 + Owner: Neutral + Location: 97,80 + Actor672: t12 + Owner: Neutral + Location: 105,90 + Actor673: t03 + Owner: Neutral + Location: 97,92 + Actor674: t03 + Owner: Neutral + Location: 98,66 + Actor675: t17 + Owner: Neutral + Location: 77,66 + Actor676: t11 + Owner: Neutral + Location: 79,65 + Actor677: t14 + Owner: Neutral + Location: 87,64 + Actor678: t13 + Owner: Neutral + Location: 74,61 + Actor679: t13 + Owner: Neutral + Location: 71,62 + Actor680: t13 + Owner: Neutral + Location: 73,55 + Actor681: t15 + Owner: Neutral + Location: 79,49 + Actor682: t17 + Owner: Neutral + Location: 75,53 + Actor683: t03 + Owner: Neutral + Location: 74,47 + Actor684: t12 + Owner: Neutral + Location: 73,58 + Actor685: t12 + Owner: Neutral + Location: 43,49 + Actor686: t15 + Owner: Neutral + Location: 39,47 + Actor687: t12 + Owner: Neutral + Location: 53,44 + Actor688: t03 + Owner: Neutral + Location: 57,42 + Actor689: t13 + Owner: Neutral + Location: 37,40 + Actor690: t14 + Owner: Neutral + Location: 23,39 + Actor691: t15 + Owner: Neutral + Location: 28,44 + Actor692: t11 + Owner: Neutral + Location: 30,56 + Actor693: t10 + Owner: Neutral + Location: 32,51 + Actor694: t11 + Owner: Neutral + Location: 51,56 + Actor695: t11 + Owner: Neutral + Location: 38,56 + Actor696: t17 + Owner: Neutral + Location: 37,55 + Actor697: t12 + Owner: Neutral + Location: 38,61 + Actor698: t12 + Owner: Neutral + Location: 35,35 + Actor699: t03 + Owner: Neutral + Location: 66,34 + Actor700: t13 + Owner: Neutral + Location: 38,28 + Actor701: t15 + Owner: Neutral + Location: 14,15 + Actor702: t11 + Owner: Neutral + Location: 19,10 + Actor703: t13 + Owner: Neutral + Location: 134,74 + Actor704: t13 + Owner: Neutral + Location: 144,70 + Actor705: t11 + Owner: Neutral + Location: 139,79 + Actor706: t03 + Owner: Neutral + Location: 143,76 + Actor707: t12 + Owner: Neutral + Location: 136,72 + Actor708: t12 + Owner: Neutral + Location: 138,148 + Actor709: t12 + Owner: Neutral + Location: 114,121 + Actor710: t12 + Owner: Neutral + Location: 84,122 + Actor711: t11 + Owner: Neutral + Location: 101,138 + Actor712: t03 + Owner: Neutral + Location: 116,100 + Actor713: t12 + Owner: Neutral + Location: 120,93 + Actor714: t14 + Owner: Neutral + Location: 133,99 + Actor715: t15 + Owner: Neutral + Location: 136,98 + Actor716: t11 + Owner: Neutral + Location: 131,107 + Actor717: t13 + Owner: Neutral + Location: 129,105 + Actor718: t11 + Owner: Neutral + Location: 120,100 + Actor719: t10 + Owner: Neutral + Location: 119,98 + Actor720: t15 + Owner: Neutral + Location: 119,106 + Actor721: t15 + Owner: Neutral + Location: 130,96 + Actor722: t15 + Owner: Neutral + Location: 96,64 + Actor723: t17 + Owner: Neutral + Location: 76,59 + Actor724: t13 + Owner: Neutral + Location: 78,64 + Actor725: t11 + Owner: Neutral + Location: 145,182 + Actor726: t03 + Owner: Neutral + Location: 138,174 + Actor727: t03 + Owner: Neutral + Location: 130,184 + Actor728: t13 + Owner: Neutral + Location: 132,182 + Actor729: t15 + Owner: Neutral + Location: 143,186 + Actor730: t11 + Owner: Neutral + Location: 127,170 + Actor731: t14 + Owner: Neutral + Location: 129,166 + Actor732: t03 + Owner: Neutral + Location: 131,168 + Actor733: t12 + Owner: Neutral + Location: 126,166 + Actor734: t12 + Owner: Neutral + Location: 131,181 + Actor735: t15 + Owner: Neutral + Location: 138,179 + Actor736: t12 + Owner: Neutral + Location: 146,181 + Actor737: t17 + Owner: Neutral + Location: 141,182 + Actor738: t10 + Owner: Neutral + Location: 141,178 + Actor739: t10 + Owner: Neutral + Location: 136,155 + Actor740: t13 + Owner: Neutral + Location: 136,158 + Actor741: t13 + Owner: Neutral + Location: 160,156 + Actor742: t13 + Owner: Neutral + Location: 139,65 + Actor743: t11 + Owner: Neutral + Location: 124,44 + Actor744: t10 + Owner: Neutral + Location: 141,40 + Actor745: t10 + Owner: Neutral + Location: 44,72 + Actor746: t12 + Owner: Neutral + Location: 40,76 + Actor747: ice03 + Owner: Neutral + Location: 30,82 + Actor748: t15 + Owner: Neutral + Location: 27,79 + Actor749: t15 + Owner: Neutral + Location: 30,88 + Actor750: t11 + Owner: Neutral + Location: 22,92 + Actor751: t15 + Owner: Neutral + Location: 27,88 + Actor752: t13 + Owner: Neutral + Location: 28,87 + Actor753: t11 + Owner: Neutral + Location: 19,85 + Actor754: t12 + Owner: Neutral + Location: 20,83 + Actor755: t13 + Owner: Neutral + Location: 18,84 + Actor756: t17 + Owner: Neutral + Location: 23,78 + Actor757: t03 + Owner: Neutral + Location: 27,77 + Actor758: t03 + Owner: Neutral + Location: 36,110 + Actor759: t13 + Owner: Neutral + Location: 37,105 + Actor760: t15 + Owner: Neutral + Location: 33,108 + Actor761: t12 + Owner: Neutral + Location: 49,121 + Actor762: t15 + Owner: Neutral + Location: 51,122 + Actor763: t13 + Owner: Neutral + Location: 45,127 + Actor764: t11 + Owner: Neutral + Location: 53,131 + Actor765: t12 + Owner: Neutral + Location: 55,129 + Actor766: t12 + Owner: Neutral + Location: 18,126 + Actor767: t13 + Owner: Neutral + Location: 78,106 + Actor768: t03 + Owner: Neutral + Location: 80,102 + Actor769: t14 + Owner: Neutral + Location: 82,105 + Actor770: t11 + Owner: Neutral + Location: 71,102 + Actor771: tc05 + Owner: Neutral + Location: 2,184 + Actor772: t11 + Owner: Neutral + Location: 5,183 + Actor773: t13 + Owner: Neutral + Location: 5,185 + Actor774: t10 + Owner: Neutral + Location: 1,180 + Actor775: t10 + Owner: Neutral + Location: 2,182 + Actor776: t14 + Owner: Neutral + Location: 0,183 + Actor777: t03 + Owner: Neutral + Location: 4,181 + Actor778: t12 + Owner: Neutral + Location: 1,187 + Actor779: t14 + Owner: Neutral + Location: 2,189 + Actor780: t13 + Owner: Neutral + Location: 21,176 + Actor781: t11 + Owner: Neutral + Location: 18,173 + Actor782: t13 + Owner: Neutral + Location: 18,181 + Actor783: t17 + Owner: Neutral + Location: 19,179 + Actor784: t03 + Owner: Neutral + Location: 30,183 + Actor785: t13 + Owner: Neutral + Location: 31,182 + Actor786: t11 + Owner: Neutral + Location: 32,191 + Actor787: t14 + Owner: Neutral + Location: 30,189 + Actor788: t13 + Owner: Neutral + Location: 30,191 + Actor789: t12 + Owner: Neutral + Location: 29,190 + Actor790: t14 + Owner: Neutral + Location: 24,190 + Actor791: t17 + Owner: Neutral + Location: 38,189 + Actor792: lhus + Owner: Neutral + Location: 82,110 + Actor793: ltur + Owner: Nod + Location: 82,52 + TurretFacing: 163 + Actor794: ltur + Owner: Nod + Location: 82,57 + TurretFacing: 416 + Actor795: ltur + Owner: Nod + Location: 89,62 + TurretFacing: 361 + Actor796: ltur + Owner: Nod + Location: 94,62 + TurretFacing: 627 + Actor542: hand + Owner: Nod + Location: 87,52 + Actor797: howi + Owner: Nod + Facing: 384 + Location: 43,152 + Actor798: howi + Owner: Nod + Facing: 384 + Location: 45,155 + Actor799: bggy + Owner: Nod + Location: 46,158 + Facing: 512 + Actor800: bggy + Owner: Nod + Location: 96,134 + Facing: 512 + Actor801: bggy + Owner: Nod + Facing: 384 + Location: 95,131 + Actor802: bggy + Owner: Nod + Location: 94,142 + Facing: 384 + Actor803: bggy + Owner: Nod + Location: 103,137 + Facing: 512 + Actor804: howi + Owner: Nod + Location: 97,132 + Facing: 512 + Actor805: howi + Owner: Nod + Facing: 384 + Location: 148,144 + Actor806: howi + Owner: Nod + Facing: 384 + Location: 140,151 + Actor807: howi + Owner: Nod + Facing: 384 + Location: 136,148 + Actor808: howi + Owner: Nod + Location: 138,28 + Facing: 0 + Actor809: howi + Owner: Nod + Location: 120,35 + Facing: 384 + Actor810: howi + Owner: Nod + Location: 44,44 + Facing: 512 + Actor811: howi + Owner: Nod + Location: 40,42 + Facing: 512 + Actor812: howi + Owner: Nod + Location: 58,30 + Facing: 770 + Actor813: ftnk + Owner: Nod + Location: 49,39 + Facing: 512 + Actor814: ftnk + Owner: Nod + Location: 45,30 + Facing: 384 + Actor815: ftnk + Owner: Nod + Location: 101,92 + Facing: 512 + Actor816: ftnk + Owner: Nod + Location: 124,104 + Facing: 512 + Actor817: ftnk + Owner: Nod + Location: 155,147 + Facing: 512 + Actor818: ftnk + Owner: Nod + Location: 132,185 + Facing: 256 + Actor819: ftnk + Owner: Nod + Location: 77,158 + Facing: 384 + Actor820: ftnk + Owner: Nod + Facing: 384 + Location: 94,133 + Actor821: ftnk + Owner: Nod + Location: 27,84 + Facing: 512 + Actor822: ftnk + Owner: Nod + Location: 92,60 + Facing: 512 + Actor823: avtr + Owner: Nod + Location: 122,26 + Facing: 784 + Actor824: avtr + Owner: Nod + Location: 134,35 + Facing: 0 + Actor825: ltnk + Owner: Nod + Facing: 384 + Location: 85,130 + Actor826: ltnk + Owner: Nod + Location: 21,86 + Facing: 512 + Actor827: ltnk + Owner: Nod + Location: 51,38 + Facing: 512 + Actor828: ltnk + Owner: Nod + Location: 45,36 + Facing: 256 + Actor829: ltnk + Owner: Nod + Facing: 384 + Location: 85,56 + Actor830: ltnk + Owner: Nod + Location: 94,59 + Facing: 512 + Actor831: ltnk + Owner: Nod + Facing: 384 + Location: 93,68 + Actor832: ltnk + Owner: Nod + Location: 135,29 + Facing: 0 + Actor833: ltnk + Owner: Nod + Location: 133,25 + Facing: 0 + Actor834: ltnk + Owner: Nod + Location: 151,149 + Facing: 512 + Actor835: ltnk + Owner: Nod + Location: 155,144 + Facing: 512 + Actor836: ltnk + Owner: Nod + Location: 127,104 + Facing: 512 + Actor837: ltnk + Owner: Nod + Location: 125,29 + Facing: 896 + Actor838: ltnk + Owner: Nod + Location: 39,32 + Facing: 256 + Actor839: stnk.nod + Owner: Nod + Facing: 384 + Location: 72,171 + Actor840: stnk.nod + Owner: Nod + Facing: 384 + Location: 72,168 + Actor841: stnk.nod + Owner: Nod + Facing: 384 + Location: 54,16 + Actor842: stnk.nod + Owner: Nod + Facing: 384 + Location: 50,16 + Actor843: stnk.nod + Owner: Nod + Facing: 384 + Location: 139,141 + Actor844: stnk.nod + Owner: Nod + Facing: 384 + Location: 139,132 + Actor845: stnk.nod + Owner: Nod + Facing: 384 + Location: 73,130 + Actor846: stnk.nod + Owner: Nod + Facing: 384 + Location: 78,139 + Actor847: stnk.nod + Owner: Nod + Facing: 384 + Location: 97,113 + Actor848: stnk.nod + Owner: Nod + Facing: 384 + Location: 23,12 + Actor849: stnk.nod + Owner: Nod + Facing: 384 + Location: 26,8 + Actor850: hstk + Owner: Nod + Facing: 384 + Location: 23,9 + Actor851: mant + Owner: Nod + Facing: 384 + Location: 99,58 + Actor852: mant + Owner: Nod + Location: 128,35 + Facing: 512 + Actor853: bike + Owner: Nod + Location: 93,57 + Facing: 512 + Actor854: bike + Owner: Nod + Location: 89,55 + Facing: 384 + Actor855: bike + Owner: Nod + Facing: 384 + Location: 95,67 + Actor856: bike + Owner: Nod + Facing: 384 + Location: 83,66 + Actor857: bike + Owner: Nod + Facing: 384 + Location: 77,56 + Actor858: bike + Owner: Nod + Facing: 384 + Location: 84,126 + Actor859: bike + Owner: Nod + Location: 96,129 + Facing: 384 + Actor860: bike + Owner: Nod + Location: 55,43 + Facing: 512 + Actor861: bike + Owner: Nod + Location: 38,50 + Facing: 512 + Actor862: ss2 + Owner: Nod + Facing: 384 + Location: 90,150 + Actor863: ss2 + Owner: Nod + Facing: 384 + Location: 92,151 + Actor864: ss2 + Owner: Nod + Facing: 384 + Location: 89,104 + Actor865: ss2 + Owner: Nod + Facing: 384 + Location: 70,95 + Actor866: ss2 + Owner: Nod + Facing: 384 + Location: 70,89 + Actor867: ss2 + Owner: Nod + Facing: 384 + Location: 61,89 + Actor868: ss2 + Owner: Nod + Facing: 384 + Location: 60,80 + Actor869: ss2 + Owner: Nod + Facing: 384 + Location: 48,82 + Actor870: ss2 + Owner: Nod + Facing: 384 + Location: 109,110 + Actor871: ss2 + Owner: Nod + Facing: 384 + Location: 132,124 + Actor872: ss2 + Owner: Nod + Facing: 384 + Location: 132,162 + Actor873: ss2 + Owner: Nod + Facing: 384 + Location: 36,143 + Actor874: ss2 + Owner: Nod + Facing: 384 + Location: 62,158 + Actor875: ss2 + Owner: Nod + Facing: 384 + Location: 63,128 + Actor876: ss2 + Owner: Nod + Facing: 384 + Location: 43,115 + Actor877: ss2 + Owner: Nod + Facing: 384 + Location: 33,97 + Actor878: ss2 + Owner: Nod + Facing: 384 + Location: 9,133 + Actor879: ss2 + Owner: Nod + Facing: 384 + Location: 12,130 + Actor880: ss2 + Owner: Nod + Facing: 384 + Location: 14,67 + Actor881: ss2 + Owner: Nod + Facing: 384 + Location: 20,61 + Actor882: ss2 + Owner: Nod + Facing: 384 + Location: 10,64 + Actor883: ss2 + Owner: Nod + Location: 127,13 + Facing: 238 + Actor884: ss2 + Owner: Nod + Location: 132,10 + Facing: 252 + Actor885: ss2 + Owner: Nod + Location: 136,14 + Facing: 791 + Actor886: ss2 + Owner: Nod + Location: 143,14 + Facing: 743 + Actor887: ss2 + Owner: Nod + Location: 148,15 + Facing: 750 + Actor888: ss2 + Owner: Nod + Location: 123,16 + Facing: 252 + Actor889: ss2 + Owner: Nod + Facing: 384 + Location: 157,35 + Actor890: ss2 + Owner: Nod + Facing: 384 + Location: 153,36 + Actor891: ss2 + Owner: Nod + Facing: 384 + Location: 101,16 + Actor892: ss2 + Owner: Nod + Facing: 384 + Location: 95,8 + Actor893: ss2 + Owner: Nod + Facing: 384 + Location: 98,11 + Actor894: sb + Owner: Nod + Facing: 384 + Location: 63,105 + Actor895: sb + Owner: Nod + Facing: 384 + Location: 65,109 + Actor896: sb + Owner: Nod + Facing: 384 + Location: 106,148 + Actor897: sb + Owner: Nod + Facing: 384 + Location: 107,151 + Actor898: sb + Owner: Nod + Facing: 384 + Location: 65,135 + Actor899: sb + Owner: Nod + Facing: 384 + Location: 66,132 + Actor900: sb + Owner: Nod + Facing: 384 + Location: 119,168 + Actor901: sb + Owner: Nod + Facing: 384 + Location: 119,164 + Actor902: sb + Owner: Nod + Facing: 384 + Location: 144,104 + Actor903: sb + Owner: Nod + Facing: 384 + Location: 135,90 + Actor904: sb + Owner: Nod + Facing: 384 + Location: 137,92 + Actor905: sb + Owner: Nod + Facing: 384 + Location: 106,76 + Actor906: sb + Owner: Nod + Facing: 384 + Location: 93,75 + Actor907: sb + Owner: Nod + Facing: 384 + Location: 49,76 + Actor908: sb + Owner: Nod + Facing: 384 + Location: 38,83 + Actor909: sb + Owner: Nod + Facing: 384 + Location: 42,103 + Actor910: sb + Owner: Nod + Facing: 384 + Location: 42,107 + Actor911: ss2 + Owner: Nod + Facing: 384 + Location: 81,41 + Actor912: ss2 + Owner: Nod + Facing: 384 + Location: 86,39 + Actor913: ss2 + Owner: Nod + Facing: 384 + Location: 37,19 + Actor914: ss2 + Owner: Nod + Facing: 384 + Location: 33,23 + Actor915: sb + Owner: Nod + Facing: 384 + Location: 32,21 + Actor916: sb + Owner: Nod + Facing: 384 + Location: 82,37 + Actor917: n1 + Owner: Nod + Facing: 384 + Location: 46,124 + SubCell: 3 + Actor918: n1 + Owner: Nod + Facing: 384 + Location: 53,127 + SubCell: 3 + Actor919: n1 + Owner: Nod + Facing: 384 + Location: 54,126 + SubCell: 3 + Actor920: n1 + Owner: Nod + Facing: 384 + Location: 26,87 + SubCell: 3 + Actor921: n1 + Owner: Nod + Facing: 384 + Location: 22,83 + SubCell: 3 + Actor922: n1 + Owner: Nod + Facing: 384 + Location: 29,82 + SubCell: 3 + Actor923: n1 + Owner: Nod + Facing: 384 + Location: 28,83 + SubCell: 3 + Actor924: n1 + Owner: Nod + Facing: 384 + Location: 19,90 + SubCell: 3 + Actor925: n1 + Owner: Nod + Facing: 384 + Location: 25,94 + SubCell: 3 + Actor926: n1 + Owner: Nod + Location: 32,86 + SubCell: 3 + Facing: 586 + Actor927: n1 + Owner: Nod + Facing: 384 + Location: 32,83 + SubCell: 3 + Actor928: n1 + Owner: Nod + Location: 39,51 + SubCell: 3 + Facing: 688 + Actor929: n1 + Owner: Nod + Location: 40,52 + SubCell: 3 + Facing: 675 + Actor930: n1 + Owner: Nod + Facing: 384 + Location: 48,50 + SubCell: 3 + Actor931: n1 + Owner: Nod + Facing: 384 + Location: 53,47 + SubCell: 3 + Actor932: n1 + Owner: Nod + Facing: 384 + Location: 55,45 + SubCell: 3 + Actor933: n1 + Owner: Nod + Facing: 384 + Location: 55,40 + SubCell: 3 + Actor934: n1 + Owner: Nod + Facing: 384 + Location: 52,38 + SubCell: 3 + Actor935: n1 + Owner: Nod + Facing: 384 + Location: 48,39 + SubCell: 3 + Actor936: n1 + Owner: Nod + Facing: 384 + Location: 44,35 + SubCell: 3 + Actor937: n1 + Owner: Nod + Facing: 384 + Location: 39,31 + SubCell: 3 + Actor938: n1 + Owner: Nod + Facing: 384 + Location: 56,28 + SubCell: 3 + Actor939: n1 + Owner: Nod + Facing: 384 + Location: 57,29 + SubCell: 3 + Actor940: n1 + Owner: Nod + Facing: 384 + Location: 47,30 + SubCell: 3 + Actor941: n1 + Owner: Nod + Facing: 384 + Location: 47,28 + SubCell: 3 + Actor942: n1 + Owner: Nod + Facing: 384 + Location: 26,42 + SubCell: 3 + Actor943: n1 + Owner: Nod + Facing: 384 + Location: 27,43 + SubCell: 3 + Actor944: n1 + Owner: Nod + Location: 62,38 + SubCell: 3 + Facing: 716 + Actor945: n1 + Owner: Nod + Location: 64,35 + SubCell: 3 + Facing: 586 + Actor946: n1 + Owner: Nod + Facing: 384 + Location: 43,55 + SubCell: 3 + Actor947: n1 + Owner: Nod + Facing: 384 + Location: 50,59 + SubCell: 3 + Actor948: n1 + Owner: Nod + Location: 40,61 + SubCell: 3 + Facing: 384 + Actor949: n1 + Owner: Nod + Facing: 384 + Location: 32,55 + SubCell: 3 + Actor950: n1 + Owner: Nod + Facing: 384 + Location: 37,61 + SubCell: 3 + Actor951: n1 + Owner: Nod + Location: 90,60 + SubCell: 3 + Facing: 518 + Actor952: n1 + Owner: Nod + Facing: 384 + Location: 86,54 + SubCell: 3 + Actor953: n1 + Owner: Nod + Facing: 384 + Location: 85,51 + SubCell: 3 + Actor954: n1 + Owner: Nod + Facing: 384 + Location: 78,53 + SubCell: 3 + Actor955: n1 + Owner: Nod + Facing: 384 + Location: 80,57 + SubCell: 3 + Actor956: n1 + Owner: Nod + Facing: 384 + Location: 76,64 + SubCell: 3 + Actor957: n1 + Owner: Nod + Facing: 384 + Location: 84,64 + SubCell: 3 + Actor958: n1 + Owner: Nod + Facing: 384 + Location: 87,69 + SubCell: 3 + Actor959: n1 + Owner: Nod + Location: 91,69 + SubCell: 3 + Facing: 484 + Actor960: n1 + Owner: Nod + Facing: 384 + Location: 96,64 + SubCell: 3 + Actor961: n1 + Owner: Nod + Facing: 384 + Location: 101,67 + SubCell: 3 + Actor962: n1 + Owner: Nod + Facing: 384 + Location: 100,66 + SubCell: 3 + Actor963: n1 + Owner: Nod + Facing: 384 + Location: 97,59 + SubCell: 3 + Actor964: n1 + Owner: Nod + Facing: 384 + Location: 102,52 + SubCell: 3 + Actor965: n1 + Owner: Nod + Facing: 384 + Location: 98,49 + SubCell: 3 + Actor966: n1 + Owner: Nod + Facing: 384 + Location: 93,46 + SubCell: 3 + Actor967: n1 + Owner: Nod + Facing: 384 + Location: 87,49 + SubCell: 3 + Actor969: n1 + Owner: Nod + Facing: 384 + Location: 130,40 + SubCell: 3 + Actor970: n1 + Owner: Nod + Facing: 384 + Location: 141,36 + SubCell: 3 + Actor971: n1 + Owner: Nod + Facing: 384 + Location: 142,32 + SubCell: 3 + Actor972: n1 + Owner: Nod + Facing: 384 + Location: 118,36 + SubCell: 3 + Actor973: n1 + Owner: Nod + Facing: 384 + Location: 123,40 + SubCell: 3 + Actor974: n1 + Owner: Nod + Facing: 384 + Location: 133,39 + SubCell: 3 + Actor975: n1 + Owner: Nod + Location: 136,26 + SubCell: 3 + Facing: 279 + Actor978: n1 + Owner: Nod + Facing: 384 + Location: 154,148 + SubCell: 3 + Actor979: n1 + Owner: Nod + Facing: 384 + Location: 149,149 + SubCell: 3 + Actor980: n1 + Owner: Nod + Facing: 384 + Location: 150,143 + SubCell: 3 + Actor981: n1 + Owner: Nod + Facing: 384 + Location: 147,140 + SubCell: 3 + Actor982: n1 + Owner: Nod + Facing: 384 + Location: 156,142 + SubCell: 3 + Actor983: n1 + Owner: Nod + Facing: 384 + Location: 152,138 + SubCell: 3 + Actor984: n1 + Owner: Nod + Facing: 384 + Location: 159,149 + SubCell: 3 + Actor985: n1 + Owner: Nod + Facing: 384 + Location: 137,182 + SubCell: 3 + Actor986: n1 + Owner: Nod + Facing: 384 + Location: 135,178 + SubCell: 3 + Actor987: n1 + Owner: Nod + Facing: 384 + Location: 146,186 + SubCell: 3 + Actor988: n1 + Owner: Nod + Facing: 384 + Location: 135,187 + SubCell: 3 + Actor989: n1 + Owner: Nod + Facing: 384 + Location: 130,183 + SubCell: 3 + Actor990: n1 + Owner: Nod + Facing: 384 + Location: 130,179 + SubCell: 3 + Actor991: n1 + Owner: Nod + Facing: 384 + Location: 79,159 + SubCell: 3 + Actor992: n1 + Owner: Nod + Facing: 384 + Location: 77,155 + SubCell: 3 + Actor993: n1 + Owner: Nod + Facing: 384 + Location: 45,152 + SubCell: 3 + Actor994: n1 + Owner: Nod + Facing: 384 + Location: 44,151 + SubCell: 3 + Actor995: n1 + Owner: Nod + Facing: 384 + Location: 48,159 + SubCell: 3 + Actor996: n1 + Owner: Nod + Facing: 384 + Location: 105,93 + SubCell: 3 + Actor997: n1 + Owner: Nod + Facing: 384 + Location: 97,91 + SubCell: 3 + Actor998: n1 + Owner: Nod + Facing: 384 + Location: 103,86 + SubCell: 3 + Actor999: n1 + Owner: Nod + Facing: 384 + Location: 104,82 + SubCell: 1 + Actor1000: n1 + Owner: Nod + Facing: 384 + Location: 97,88 + SubCell: 3 + Actor1001: n1 + Owner: Nod + Facing: 384 + Location: 128,103 + SubCell: 3 + Actor1002: n1 + Owner: Nod + Location: 122,103 + SubCell: 3 + Facing: 647 + Actor1003: n1 + Owner: Nod + Facing: 384 + Location: 121,97 + SubCell: 3 + Actor1004: n1 + Owner: Nod + Location: 131,101 + SubCell: 3 + Facing: 600 + Actor1005: n1 + Owner: Nod + Location: 131,100 + SubCell: 3 + Facing: 627 + Actor1006: n1 + Owner: Nod + Facing: 384 + Location: 131,100 + SubCell: 1 + Actor1007: n1 + Owner: Nod + Facing: 384 + Location: 134,98 + SubCell: 3 + Actor1008: n1 + Owner: Nod + Facing: 384 + Location: 117,104 + SubCell: 3 + Actor1009: n1 + Owner: Nod + Facing: 384 + Location: 119,124 + SubCell: 3 + Actor1010: n1 + Owner: Nod + Facing: 384 + Location: 122,121 + SubCell: 3 + Actor1011: n1 + Owner: Nod + Facing: 384 + Location: 117,125 + SubCell: 3 + Actor1012: n1 + Owner: Nod + Facing: 384 + Location: 98,138 + SubCell: 3 + Actor1013: n1 + Owner: Nod + Facing: 384 + Location: 97,144 + SubCell: 3 + Actor1014: n1 + Owner: Nod + Facing: 384 + Location: 103,141 + SubCell: 3 + Actor1015: n1 + Owner: Nod + Facing: 384 + Location: 104,140 + SubCell: 3 + Actor1016: n1 + Owner: Nod + Facing: 384 + Location: 104,135 + SubCell: 3 + Actor1017: n1 + Owner: Nod + Facing: 384 + Location: 104,129 + SubCell: 3 + Actor1018: n1 + Owner: Nod + Facing: 384 + Location: 88,137 + SubCell: 3 + Actor1019: n1 + Owner: Nod + Facing: 384 + Location: 92,137 + SubCell: 3 + Actor1020: n1 + Owner: Nod + Facing: 384 + Location: 85,132 + SubCell: 3 + Actor1021: n1 + Owner: Nod + Facing: 384 + Location: 85,125 + SubCell: 3 + Actor1022: n1 + Owner: Nod + Facing: 384 + Location: 83,124 + SubCell: 3 + Actor1023: n1 + Owner: Nod + Facing: 384 + Location: 150,157 + SubCell: 3 + Actor1024: n1 + Owner: Nod + Facing: 384 + Location: 158,159 + SubCell: 3 + Actor1025: n1 + Owner: Nod + Facing: 384 + Location: 157,158 + SubCell: 3 + Actor1026: n1 + Owner: Nod + Facing: 384 + Location: 97,84 + SubCell: 3 + Actor1027: n3 + Owner: Nod + Location: 26,86 + SubCell: 3 + Facing: 552 + Actor1028: n3 + Owner: Nod + Facing: 384 + Location: 43,75 + SubCell: 3 + Actor1029: n3 + Owner: Nod + Facing: 384 + Location: 39,60 + SubCell: 3 + Actor1030: n3 + Owner: Nod + Facing: 384 + Location: 57,46 + SubCell: 3 + Actor1031: n3 + Owner: Nod + Facing: 384 + Location: 35,43 + SubCell: 3 + Actor1032: n3 + Owner: Nod + Facing: 384 + Location: 27,41 + SubCell: 3 + Actor1033: n3 + Owner: Nod + Location: 63,33 + SubCell: 3 + Facing: 688 + Actor1034: n3 + Owner: Nod + Facing: 384 + Location: 42,28 + SubCell: 3 + Actor1035: n3 + Owner: Nod + Facing: 384 + Location: 46,26 + SubCell: 3 + Actor1036: n3 + Owner: Nod + Facing: 384 + Location: 96,48 + SubCell: 3 + Actor1037: n3 + Owner: Nod + Facing: 384 + Location: 95,45 + SubCell: 3 + Actor1038: n3 + Owner: Nod + Facing: 384 + Location: 89,46 + SubCell: 3 + Actor1039: n3 + Owner: Nod + Facing: 384 + Location: 88,49 + SubCell: 3 + Actor1040: n3 + Owner: Nod + Facing: 384 + Location: 97,59 + SubCell: 1 + Actor1041: n3 + Owner: Nod + Facing: 384 + Location: 100,65 + SubCell: 3 + Actor1042: n3 + Owner: Nod + Facing: 384 + Location: 71,49 + SubCell: 3 + Actor1043: n3 + Owner: Nod + Facing: 384 + Location: 122,39 + SubCell: 3 + Actor1044: n3 + Owner: Nod + Facing: 384 + Location: 142,38 + SubCell: 3 + Actor1045: n3 + Owner: Nod + Facing: 384 + Location: 144,32 + SubCell: 3 + Actor1046: n3 + Owner: Nod + Facing: 384 + Location: 139,30 + SubCell: 3 + Actor1047: n3 + Owner: Nod + Facing: 384 + Location: 117,34 + SubCell: 3 + Actor1049: n3 + Owner: Nod + Facing: 384 + Location: 138,66 + SubCell: 3 + Actor1050: n3 + Owner: Nod + Facing: 384 + Location: 137,74 + SubCell: 3 + Actor1051: n3 + Owner: Nod + Facing: 384 + Location: 138,101 + SubCell: 3 + Actor1052: n3 + Owner: Nod + Facing: 384 + Location: 124,93 + SubCell: 3 + Actor1053: n3 + Owner: Nod + Facing: 384 + Location: 117,98 + SubCell: 3 + Actor1054: n3 + Owner: Nod + Facing: 384 + Location: 130,108 + SubCell: 3 + Actor1055: n3 + Owner: Nod + Location: 122,102 + SubCell: 3 + Facing: 384 + Actor1056: n3 + Owner: Nod + Facing: 384 + Location: 122,120 + SubCell: 3 + Actor1057: n3 + Owner: Nod + Facing: 384 + Location: 116,125 + SubCell: 3 + Actor1058: n3 + Owner: Nod + Facing: 384 + Location: 102,141 + SubCell: 3 + Actor1059: n3 + Owner: Nod + Facing: 384 + Location: 92,135 + SubCell: 3 + Actor1060: n3 + Owner: Nod + Facing: 384 + Location: 93,131 + SubCell: 3 + Actor1061: n3 + Owner: Nod + Facing: 384 + Location: 90,129 + SubCell: 3 + Actor1062: n3 + Owner: Nod + Facing: 384 + Location: 95,125 + SubCell: 3 + Actor1063: n3 + Owner: Nod + Facing: 384 + Location: 88,122 + SubCell: 3 + Actor1064: n3 + Owner: Nod + Facing: 384 + Location: 150,157 + SubCell: 1 + Actor1065: n3 + Owner: Nod + Facing: 384 + Location: 141,157 + SubCell: 3 + Actor1066: n3 + Owner: Nod + Facing: 384 + Location: 152,138 + SubCell: 1 + Actor1067: n3 + Owner: Nod + Facing: 384 + Location: 149,138 + SubCell: 3 + Actor1068: n3 + Owner: Nod + Facing: 384 + Location: 157,131 + SubCell: 3 + Actor1069: n3 + Owner: Nod + Facing: 384 + Location: 153,131 + SubCell: 3 + Actor1070: n3 + Owner: Nod + Facing: 384 + Location: 140,181 + SubCell: 3 + Actor1071: n3 + Owner: Nod + Facing: 384 + Location: 138,177 + SubCell: 3 + Actor1072: n3 + Owner: Nod + Facing: 384 + Location: 131,176 + SubCell: 3 + Actor1073: n3 + Owner: Nod + Facing: 384 + Location: 44,149 + SubCell: 3 + Actor1074: n3 + Owner: Nod + Facing: 384 + Location: 81,158 + SubCell: 3 + Actor1075: n3 + Owner: Nod + Facing: 384 + Location: 52,125 + SubCell: 3 + Actor1076: n3 + Owner: Nod + Facing: 384 + Location: 101,88 + SubCell: 3 + Actor1077: n3 + Owner: Nod + Facing: 384 + Location: 99,85 + SubCell: 3 + Actor1078: n3 + Owner: Nod + Facing: 384 + Location: 90,56 + SubCell: 3 + Actor1079: n3 + Owner: Nod + Facing: 384 + Location: 32,51 + SubCell: 3 + Actor1080: n3 + Owner: Nod + Location: 52,56 + SubCell: 3 + Facing: 384 + Actor1081: n3 + Owner: Nod + Facing: 384 + Location: 130,39 + SubCell: 3 + Actor1082: rmbc + Owner: Nod + Location: 123,34 + SubCell: 3 + Facing: 675 + Actor1083: rmbc + Owner: Nod + Location: 121,29 + SubCell: 3 + Facing: 702 + Actor1084: rmbc + Owner: Nod + Location: 137,29 + SubCell: 3 + Facing: 245 + Actor1085: rmbc + Owner: Nod + Location: 125,104 + SubCell: 3 + Facing: 525 + Actor1086: rmbc + Owner: Nod + Facing: 384 + Location: 152,140 + SubCell: 3 + Actor1087: rmbc + Owner: Nod + Facing: 384 + Location: 157,141 + SubCell: 3 + Actor1088: rmbc + Owner: Nod + Facing: 384 + Location: 88,58 + SubCell: 3 + Actor1089: rmbc + Owner: Nod + Facing: 384 + Location: 50,36 + SubCell: 3 + Actor1090: rmbc + Owner: Nod + Facing: 384 + Location: 46,33 + SubCell: 3 + Actor1091: reap + Owner: Nod + Facing: 384 + Location: 129,33 + SubCell: 3 + Actor1092: reap + Owner: Nod + Facing: 384 + Location: 125,32 + SubCell: 3 + Actor1093: reap + Owner: Nod + Location: 136,32 + SubCell: 3 + Facing: 163 + Actor1094: reap + Owner: Nod + Facing: 384 + Location: 98,51 + SubCell: 3 + Actor1095: enli + Owner: Nod + Location: 45,54 + SubCell: 3 + Facing: 504 + Actor1096: bh + Owner: Nod + Facing: 384 + Location: 127,25 + SubCell: 3 + Actor1097: bh + Owner: Nod + Facing: 384 + Location: 136,25 + SubCell: 3 + Actor1098: bh + Owner: Nod + Location: 121,33 + SubCell: 3 + Facing: 572 + Actor1099: conf + Owner: Nod + Facing: 384 + Location: 47,154 + SubCell: 3 + Actor1100: conf + Owner: Nod + Facing: 384 + Location: 30,84 + SubCell: 3 + Actor1101: conf + Owner: Nod + Facing: 384 + Location: 92,130 + SubCell: 3 + Actor1102: conf + Owner: Nod + Facing: 384 + Location: 156,138 + SubCell: 3 + Actor1103: conf + Owner: Nod + Facing: 384 + Location: 90,55 + SubCell: 3 + Actor1104: iok + Owner: Nod + Location: 92,132 + Actor1105: iok + Owner: Nod + Location: 133,28 + Actor1106: conf + Owner: Nod + Location: 132,29 + SubCell: 3 + Facing: 384 + Actor1107: acol + Owner: Nod + Facing: 384 + Location: 23,85 + SubCell: 3 + Actor1108: acol + Owner: Nod + Facing: 384 + Location: 20,88 + SubCell: 3 + Actor1109: acol + Owner: Nod + Facing: 384 + Location: 95,129 + SubCell: 3 + Actor1110: acol + Owner: Nod + Facing: 384 + Location: 139,75 + SubCell: 3 + Actor1111: acol + Owner: Nod + Facing: 384 + Location: 142,72 + SubCell: 3 + Actor1112: silo.td + Owner: Nod + Location: 35,106 + Actor1113: silo.td + Owner: Nod + Location: 35,108 + Actor1114: n1 + Owner: Nod + Facing: 384 + Location: 37,107 + SubCell: 3 + Actor1115: n1 + Owner: Nod + Facing: 384 + Location: 34,107 + SubCell: 3 + Actor1116: n1 + Owner: Nod + Facing: 384 + Location: 35,110 + SubCell: 3 + Actor1117: tplr + Owner: Nod + Facing: 384 + Location: 36,105 + SubCell: 3 + Actor1118: silo.td + Owner: Nod + Location: 139,98 + Actor1119: silo.td + Owner: Nod + Location: 139,100 + Actor1120: silo.td + Owner: Nod + Location: 134,70 + Actor1121: silo.td + Owner: Nod + Location: 138,69 + Actor1122: reap + Owner: Nod + Location: 137,72 + SubCell: 3 + Facing: 545 + InitialTree: split2 + Owner: Neutral + Location: 9,160 + Actor1123: ctnk + Owner: Greece + Facing: 768 + Location: 5,170 + Actor1124: ctnk + Owner: Greece + Facing: 768 + Location: 5,178 + NavalWaypoint1: waypoint + Owner: Neutral + Location: 10,72 + NavalWaypoint2: waypoint + Owner: Neutral + Location: 34,131 + NavalWaypoint3: waypoint + Owner: Neutral + Location: 115,155 + NavalWaypoint4: waypoint + Owner: Neutral + Location: 152,95 + NavalWaypoint5: waypoint + Owner: Neutral + Location: 82,84 + Actor1125: camera + Owner: Nod + Location: 12,163 + Actor1126: camera + Owner: Nod + Location: 29,188 + Actor1127: camera + Owner: Nod + Location: 49,153 + Actor1128: camera + Owner: Nod + Location: 70,171 + Actor1129: camera + Owner: Nod + Location: 136,181 + Actor1130: camera + Owner: Nod + Location: 94,130 + Actor1131: camera + Owner: Nod + Location: 151,138 + Actor1132: camera + Owner: Nod + Location: 49,31 + Actor1133: camera + Owner: Nod + Location: 89,57 + Actor1134: camera + Owner: Nod + Location: 101,86 + Actor1135: camera + Owner: Nod + Location: 76,106 + Actor1136: camera + Owner: Nod + Location: 22,68 + Actor1137: camera + Owner: Nod + Location: 46,89 + Actor1138: camera + Owner: Nod + Location: 61,108 + Actor1139: camera + Owner: Nod + Location: 86,93 + Actor1140: camera + Owner: Nod + Location: 108,118 + Actor1141: camera + Owner: Nod + Location: 139,117 + Actor1142: camera + Owner: Nod + Location: 115,53 + Actor1143: camera + Owner: Nod + Location: 134,54 + Actor1144: camera + Owner: Nod + Location: 152,44 + Actor1145: camera + Owner: Nod + Location: 94,23 + Actor1146: camera + Owner: Nod + Location: 118,10 + Actor1147: camera + Owner: Nod + Location: 36,14 + Actor1148: camera + Owner: Nod + Location: 24,24 + Actor1149: camera + Owner: Nod + Location: 64,51 + Actor1150: camera + Owner: Nod + Location: 80,33 + Actor1151: camera + Owner: Nod + Location: 116,145 + Actor1152: camera + Owner: Nod + Location: 150,166 + Actor1153: camera + Owner: Nod + Location: 109,180 + Actor1154: camera + Owner: Nod + Location: 80,170 + Actor1155: camera + Owner: Nod + Location: 62,139 + Actor1156: camera + Owner: Nod + Location: 5,141 + Actor1157: camera + Owner: Nod + Location: 35,161 + PlayerStart: waypoint + Owner: Neutral + Location: 10,174 + Actor1158: nuk2 + Owner: Nod + Location: 119,22 + Actor1159: nuk2 + Owner: Nod + Location: 121,23 + Actor968: n1 + Owner: Nod + Facing: 384 + Location: 133,37 + SubCell: 3 + Actor1160: nuk2 + Owner: Nod + Location: 136,36 + Actor1161: nuk2 + Owner: Nod + Location: 134,36 + Actor1162: nuk2 + Owner: Nod + Location: 86,57 + Actor1163: nuk2 + Owner: Nod + Location: 143,182 + Actor1164: nuk2 + Owner: Nod + Location: 132,99 + Actor1165: nuk2 + Owner: Nod + Location: 118,96 + Actor1166: n3 + Owner: Nod + Facing: 384 + Location: 119,25 + SubCell: 3 + Actor1167: n3 + Owner: Nod + Facing: 384 + Location: 118,22 + SubCell: 3 + Actor1168: msg + Owner: Nod + Facing: 384 + DeployState: Deployed + Location: 141,32 + Actor1169: msg + Owner: Nod + Facing: 384 + DeployState: Deployed + Location: 119,33 + Actor1170: hpad.td + Owner: Nod + Location: 143,72 + Actor1171: hpad.td + Owner: Nod + Location: 140,75 + SecondTree: split2 + Owner: Neutral + Location: 78,133 + Actor408: silo.td + Owner: Nod + Location: 88,126 + Actor636: msg + Owner: Nod + DeployState: Deployed + Facing: 384 + Location: 105,85 + Actor1172: bggy + Owner: Nod + Facing: 384 + Location: 104,91 + Actor1173: bggy + Owner: Nod + Facing: 384 + Location: 97,126 + Actor1174: bggy + Owner: Nod + Facing: 384 + Location: 144,180 + Actor1175: ltur + Owner: Nod + Location: 152,147 + TurretFacing: 334 + Actor1176: ltur + Owner: Nod + Location: 157,147 + TurretFacing: 463 + Actor1177: ltur + Owner: Nod + Location: 143,142 + TurretFacing: 306 + Actor1178: ltur + Owner: Nod + Location: 143,136 + Actor1179: ltur + Owner: Nod + Location: 42,31 + TurretFacing: 128 + Actor1180: ltur + Owner: Nod + Location: 42,36 + TurretFacing: 463 + Actor1181: ltur + Owner: Nod + Location: 46,40 + TurretFacing: 375 + Actor1182: ltur + Owner: Nod + Location: 53,40 + TurretFacing: 504 + Actor1183: ltur + Owner: Nod + Location: 60,36 + TurretFacing: 709 + Actor1184: ltur + Owner: Nod + Location: 60,31 + TurretFacing: 620 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|missions/main-campaign/ca46-intervention/intervention-rules.yaml, ca|rules/custom/coop-rules.yaml, intervention-coop-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/coop-campaign/ca47-ad-nihilum-coop/ad-nihilum-coop-rules.yaml b/mods/ca/missions/coop-campaign/ca47-ad-nihilum-coop/ad-nihilum-coop-rules.yaml new file mode 100644 index 0000000000..aed9c8b825 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca47-ad-nihilum-coop/ad-nihilum-coop-rules.yaml @@ -0,0 +1,26 @@ +World: + LuaScript: + Scripts: campaign.lua, coop.lua, ca|missions/main-campaign/ca47-ad-nihilum/ad-nihilum.lua, ad-nihilum-coop.lua + ScriptLobbyDropdown@voidfreq: + ID: voidfreq + Label: Void Engine Frequency + Description: Increases the frequency of Void Engine spawns (Void Engines are unaffected by other options besides difficulty). + Values: + 0: +0% + 25: +25% + 50: +50% + 75: +75% + 100: +100% + 125: +125% + 150: +150% + 175: +175% + 200: +200% + 250: +250% + 300: +300% + 350: +350% + 400: +400% + Default: 0 + DisplayOrder: 999 + LobbyMissionInfo@InitialObjectives: + Prefix: Initial Objectives + Text: • Eliminate all Malefic Scrin forces.\n• Do not allow any Void Engines to break through. diff --git a/mods/ca/missions/coop-campaign/ca47-ad-nihilum-coop/ad-nihilum-coop.lua b/mods/ca/missions/coop-campaign/ca47-ad-nihilum-coop/ad-nihilum-coop.lua new file mode 100644 index 0000000000..a26d75b2a7 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca47-ad-nihilum-coop/ad-nihilum-coop.lua @@ -0,0 +1,85 @@ + +local voidFrequencyOptionValue = tonumber(Map.LobbyOption("voidfreq")) + +if voidFrequencyOptionValue ~= nil then + local VoidIntervalMultiplier = 1 + (voidFrequencyOptionValue / 100) + VoidEngineInterval[Difficulty] = math.max(VoidEngineInterval[Difficulty] / VoidIntervalMultiplier, 25) +end + +SetupPlayers = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Multi2 = Player.GetPlayer("Multi2") + Multi3 = Player.GetPlayer("Multi3") + Multi4 = Player.GetPlayer("Multi4") + Multi5 = Player.GetPlayer("Multi5") + Greece = Player.GetPlayer("Greece") + MaleficScrin = Player.GetPlayer("MaleficScrin") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = Utils.Where({ Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 }, function(p) return p ~= nil end) + MissionEnemies = { MaleficScrin } + SinglePlayerPlayer = Greece + StopSpread = true + CoopInit() +end + +AfterWorldLoaded = function() + StartCashSpread(3500) + + local leftSidePlayers = {} + local rightSidePlayers = {} + local isLeft = true + + for _, p in ipairs(MissionPlayers) do + if isLeft then + table.insert(leftSidePlayers, p) + else + table.insert(rightSidePlayers, p) + end + isLeft = not isLeft + end + + if #leftSidePlayers == 0 then + leftSidePlayers = rightSidePlayers + end + + if #rightSidePlayers == 0 then + rightSidePlayers = leftSidePlayers + end + + local units = Utils.Where(Greece.GetActors(), function(a) return a.HasProperty("Move") end) + local leftSideUnits = Utils.Where(units, function(a) return a.Location.X < 112 end) + local rightSideUnits = Utils.Where(units, function(a) return a.Location.X >= 112 end) + + AssignToCoopPlayers(leftSideUnits, leftSidePlayers) + AssignToCoopPlayers(rightSideUnits, rightSidePlayers) +end + +AfterTick = function() + +end + +DoMcvArrival = function() + local mcvPlayers = GetMcvPlayers() + + if #mcvPlayers == 1 and #MissionPlayers > 1 then + table.insert(mcvPlayers, MissionPlayers[2]) + end + + local mcvPaths = { + { McvSpawn1.Location, McvDest1.Location }, + { McvSpawn2.Location, McvDest2.Location }, + { CPos.New(McvSpawn1.Location.X - 2, McvSpawn1.Location.Y), CPos.New(McvDest1.Location.X - 2, McvDest1.Location.Y) }, + { CPos.New(McvSpawn2.Location.X - 2, McvSpawn2.Location.Y), CPos.New(McvDest2.Location.X - 2, McvDest2.Location.Y) }, + { CPos.New(McvSpawn1.Location.X + 2, McvSpawn1.Location.Y), CPos.New(McvDest1.Location.X + 2, McvDest1.Location.Y) }, + { CPos.New(McvSpawn2.Location.X + 2, McvSpawn2.Location.Y), CPos.New(McvDest2.Location.X + 2, McvDest2.Location.Y) }, + } + + local i = 1 + Utils.Do(mcvPlayers, function(p) + Reinforcements.Reinforce(p, { "mcv" }, mcvPaths[i], 75) + i = i + 1 + end) + + StopSpread = false +end diff --git a/mods/ca/missions/coop-campaign/ca47-ad-nihilum-coop/map.bin b/mods/ca/missions/coop-campaign/ca47-ad-nihilum-coop/map.bin new file mode 100644 index 0000000000..6f9ceb269b Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca47-ad-nihilum-coop/map.bin differ diff --git a/mods/ca/missions/coop-campaign/ca47-ad-nihilum-coop/map.png b/mods/ca/missions/coop-campaign/ca47-ad-nihilum-coop/map.png new file mode 100644 index 0000000000..882b152669 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca47-ad-nihilum-coop/map.png differ diff --git a/mods/ca/missions/coop-campaign/ca47-ad-nihilum-coop/map.yaml b/mods/ca/missions/coop-campaign/ca47-ad-nihilum-coop/map.yaml new file mode 100644 index 0000000000..654e797e17 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca47-ad-nihilum-coop/map.yaml @@ -0,0 +1,9024 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 47: Ad Nihilum Co-op + +Author: Darkademic & Gandorques Hikla + +Tileset: TEMPERAT + +MapSize: 194,146 + +Bounds: 1,1,192,144 + +Visibility: Lobby + +Categories: Co-op Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: Greece, MaleficScrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + PlayerReference@Greece: + Name: Greece + Faction: allies + Color: 99ACF2 + Allies: Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: MaleficScrin, Creeps + PlayerReference@MaleficScrin: + Name: MaleficScrin + Bot: campaign + Faction: scrin + Color: 3E4549 + Enemies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 99ACF2 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: MaleficScrin, Creeps + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 0B7310 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: MaleficScrin, Creeps + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 134691 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: MaleficScrin, Creeps + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 775A12 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: MaleficScrin, Creeps + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 994050 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: MaleficScrin, Creeps + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: EEA8A8 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: MaleficScrin, Creeps + +Actors: + Actor1: tc05 + Owner: Neutral + Location: 165,75 + Actor2: tc05 + Owner: Neutral + Location: 103,139 + Actor3: tc05 + Owner: Neutral + Location: 47,130 + Actor4: tc05 + Owner: Neutral + Location: 85,102 + Actor17: tc03 + Owner: Neutral + Location: 18,120 + Actor19: tc03 + Owner: Neutral + Location: 189,29 + Actor20: tc03.husk + Owner: Neutral + Location: 107,140 + Actor22: tc04 + Owner: Neutral + Location: 190,113 + Actor23: tc03 + Owner: Neutral + Location: 171,68 + Actor26: tc04 + Owner: Neutral + Location: 78,96 + Actor27: tc03 + Owner: Neutral + Location: 124,93 + Actor28: tc03 + Owner: Neutral + Location: 0,138 + Actor31: tc04.husk + Owner: Neutral + Location: 16,116 + Actor32: tc04 + Owner: Neutral + Location: 18,128 + Actor34: tc03 + Owner: Neutral + Location: 68,100 + Actor37: tc03 + Owner: Neutral + Location: 51,142 + Actor38: tc04 + Owner: Neutral + Location: 140,31 + Actor43: tc04.husk + Owner: Neutral + Location: 17,118 + Actor45: tc03 + Owner: Neutral + Location: 190,76 + Actor46: tc04 + Owner: Neutral + Location: 101,140 + Actor49: tc04 + Owner: Neutral + Location: 121,86 + Actor53: tc03.husk + Owner: Neutral + Location: 143,31 + Actor54: tc03.husk + Owner: Neutral + Location: 57,107 + Actor55: tc02 + Owner: Neutral + Location: 2,34 + Actor56: tc02 + Owner: Neutral + Location: 170,6 + Actor57: tc02 + Owner: Neutral + Location: 169,72 + Actor58: tc02 + Owner: Neutral + Location: 57,110 + Actor60: tc02 + Owner: Neutral + Location: 12,71 + Actor61: tc02 + Owner: Neutral + Location: 45,128 + Actor63: tc02 + Owner: Neutral + Location: 25,58 + Actor65: tc02 + Owner: Neutral + Location: 22,133 + Actor69: tc02 + Owner: Neutral + Location: 87,131 + Actor70: tc02.husk + Owner: Neutral + Location: 172,78 + Actor72: tc02.husk + Owner: Neutral + Location: 124,91 + Actor75: tc02.husk + Owner: Neutral + Location: 15,119 + Actor76: tc02 + Owner: Neutral + Location: 152,33 + Actor79: tc02 + Owner: Neutral + Location: 187,77 + Actor83: tc02 + Owner: Neutral + Location: 190,119 + Actor84: tc02 + Owner: Neutral + Location: 125,89 + Actor87: tc02 + Owner: Neutral + Location: 69,103 + Actor88: tc02 + Owner: Neutral + Location: 190,0 + Actor91: tc02 + Owner: Neutral + Location: 165,72 + Actor96: t15 + Owner: Neutral + Location: 169,74 + Actor99: t10 + Owner: Neutral + Location: 114,87 + Actor103: t15 + Owner: Neutral + Location: 157,42 + Actor105: tc01 + Owner: Neutral + Location: 15,121 + Actor106: t14 + Owner: Neutral + Location: 174,68 + Actor108: t11.husk + Owner: Neutral + Location: 6,140 + Actor110: tc01 + Owner: Neutral + Location: 191,74 + Actor112: t11 + Owner: Neutral + Location: 15,45 + Actor116: tc01 + Owner: Neutral + Location: 168,71 + Actor122: t11 + Owner: Neutral + Location: 74,100 + Actor124: t11 + Owner: Neutral + Location: 178,44 + Actor126: t15.husk + Owner: Neutral + Location: 187,72 + Actor129: t15 + Owner: Neutral + Location: 99,141 + Actor131: t11 + Owner: Neutral + Location: 1,136 + Actor133: t11 + Owner: Neutral + Location: 18,126 + Actor134: tc01 + Owner: Neutral + Location: 49,139 + Actor135: tc01 + Owner: Neutral + Location: 75,98 + Actor141: t11 + Owner: Neutral + Location: 155,4 + Actor142: t15 + Owner: Neutral + Location: 168,75 + Actor146: t10 + Owner: Neutral + Location: 192,27 + Actor150: t11 + Owner: Neutral + Location: 15,127 + Actor152: t10.husk + Owner: Neutral + Location: 192,28 + Actor153: tc01 + Owner: Neutral + Location: 166,73 + Actor154: tc01 + Owner: Neutral + Location: 25,108 + Actor157: tc01.husk + Owner: Neutral + Location: 171,70 + Actor159: t14 + Owner: Neutral + Location: 189,65 + Actor160: t14 + Owner: Neutral + Location: 27,51 + Actor165: t11 + Owner: Neutral + Location: 189,88 + Actor167: t11 + Owner: Neutral + Location: 59,107 + Actor168: t11 + Owner: Neutral + Location: 169,69 + Actor170: t15 + Owner: Neutral + Location: 173,79 + Actor171: t15 + Owner: Neutral + Location: 100,139 + Actor174: t15 + Owner: Neutral + Location: 88,108 + Actor183: t11 + Owner: Neutral + Location: 24,125 + Actor187: tc01 + Owner: Neutral + Location: 168,77 + Actor192: t14 + Owner: Neutral + Location: 85,106 + Actor194: t15 + Owner: Neutral + Location: 53,120 + Actor200: t11 + Owner: Neutral + Location: 47,128 + Actor203: tc01.husk + Owner: Neutral + Location: 101,142 + Actor204: t10 + Owner: Neutral + Location: 149,113 + Actor207: t11 + Owner: Neutral + Location: 119,90 + Actor208: t11 + Owner: Neutral + Location: 74,113 + Actor210: t14 + Owner: Neutral + Location: 188,70 + Actor215: t11 + Owner: Neutral + Location: 50,123 + Actor216: t14.husk + Owner: Neutral + Location: 188,74 + Actor217: t15 + Owner: Neutral + Location: 159,1 + Actor219: tc01 + Owner: Neutral + Location: 68,98 + Actor221: tc01 + Owner: Neutral + Location: 108,141 + Actor223: t14 + Owner: Neutral + Location: 30,24 + Actor232: t15 + Owner: Neutral + Location: 169,7 + Actor233: t15 + Owner: Neutral + Location: 172,71 + Actor235: t15 + Owner: Neutral + Location: 3,144 + Actor236: tc01 + Owner: Neutral + Location: 55,95 + Actor239: t11 + Owner: Neutral + Location: 77,95 + Actor242: t10 + Owner: Neutral + Location: 102,143 + Actor243: t11 + Owner: Neutral + Location: 145,33 + Actor244: tc01 + Owner: Neutral + Location: 173,69 + Actor245: t11.husk + Owner: Neutral + Location: 107,136 + Actor247: t11 + Owner: Neutral + Location: 56,108 + Actor249: tc01 + Owner: Neutral + Location: 173,75 + Actor251: t15.husk + Owner: Neutral + Location: 189,27 + Actor252: t14 + Owner: Neutral + Location: 151,31 + Actor253: t15 + Owner: Neutral + Location: 86,130 + Actor258: t14 + Owner: Neutral + Location: 87,127 + Actor262: t11 + Owner: Neutral + Location: 176,74 + Actor265: t15 + Owner: Neutral + Location: 23,124 + Actor267: t14 + Owner: Neutral + Location: 88,132 + Actor269: t14 + Owner: Neutral + Location: 187,87 + Actor270: t10 + Owner: Neutral + Location: 81,96 + Actor272: t10 + Owner: Neutral + Location: 25,65 + Actor273: t15 + Owner: Neutral + Location: 15,39 + Actor274: t15.husk + Owner: Neutral + Location: 15,123 + Actor277: t11 + Owner: Neutral + Location: 68,101 + Actor278: t10 + Owner: Neutral + Location: 49,143 + Actor279: t15 + Owner: Neutral + Location: 189,23 + Actor283: t15 + Owner: Neutral + Location: 189,112 + Actor286: t11 + Owner: Neutral + Location: 191,73 + Actor289: t11 + Owner: Neutral + Location: 16,71 + Actor294: t14 + Owner: Neutral + Location: 46,125 + Actor295: t14 + Owner: Neutral + Location: 69,104 + Actor301: t15 + Owner: Neutral + Location: 28,62 + Actor303: t10.husk + Owner: Neutral + Location: 172,66 + Actor305: t14 + Owner: Neutral + Location: 148,112 + Actor307: t14 + Owner: Neutral + Location: 158,2 + Actor312: tc01 + Owner: Neutral + Location: 0,143 + Actor313: t11 + Owner: Neutral + Location: 53,123 + Actor317: t10 + Owner: Neutral + Location: 74,97 + Actor319: t11 + Owner: Neutral + Location: 155,2 + Actor321: tc01 + Owner: Neutral + Location: 23,123 + Actor324: t10 + Owner: Neutral + Location: 69,97 + Actor326: tc01 + Owner: Neutral + Location: 12,42 + Actor327: t14.husk + Owner: Neutral + Location: 0,92 + Actor328: t11 + Owner: Neutral + Location: 190,37 + Actor334: t15.husk + Owner: Neutral + Location: 175,72 + Actor337: t11 + Owner: Neutral + Location: 192,123 + Actor340: t14 + Owner: Neutral + Location: 2,138 + Actor342: t10 + Owner: Neutral + Location: 103,137 + Actor347: t11 + Owner: Neutral + Location: 16,44 + Actor348: t11 + Owner: Neutral + Location: 157,3 + Actor350: t10 + Owner: Neutral + Location: 13,116 + Actor354: t15 + Owner: Neutral + Location: 26,50 + Actor357: t14 + Owner: Neutral + Location: 99,143 + Actor362: t10 + Owner: Neutral + Location: 53,97 + Actor364: t10 + Owner: Neutral + Location: 47,126 + Actor365: t15 + Owner: Neutral + Location: 81,99 + Actor373: t11 + Owner: Neutral + Location: 29,31 + Actor374: t14 + Owner: Neutral + Location: 179,42 + Actor375: t14 + Owner: Neutral + Location: 77,94 + Actor376: tc01.husk + Owner: Neutral + Location: 46,129 + Actor378: t15 + Owner: Neutral + Location: 1,61 + Actor379: t14 + Owner: Neutral + Location: 191,39 + Actor383: t10.husk + Owner: Neutral + Location: 191,85 + Actor384: t11 + Owner: Neutral + Location: 192,20 + Actor385: t15 + Owner: Neutral + Location: 176,43 + Actor386: t14 + Owner: Neutral + Location: 75,96 + Actor387: tc01 + Owner: Neutral + Location: 12,45 + Actor388: tc01 + Owner: Neutral + Location: 190,3 + Actor389: tc01 + Owner: Neutral + Location: 107,138 + Actor390: t10 + Owner: Neutral + Location: 14,141 + Actor396: t10 + Owner: Neutral + Location: 139,33 + Actor399: t15.husk + Owner: Neutral + Location: 165,77 + Actor403: tc01 + Owner: Neutral + Location: 86,129 + Actor404: t10 + Owner: Neutral + Location: 191,117 + Actor405: t14 + Owner: Neutral + Location: 191,78 + Actor406: tc01.husk + Owner: Neutral + Location: 189,77 + Actor407: tc01 + Owner: Neutral + Location: 174,74 + Actor410: tc01 + Owner: Neutral + Location: 171,69 + Actor412: t14 + Owner: Neutral + Location: 46,95 + Actor413: t11 + Owner: Neutral + Location: 169,5 + Actor414: t15 + Owner: Neutral + Location: 26,47 + Actor415: t10 + Owner: Neutral + Location: 119,85 + Actor417: t12 + Owner: Neutral + Location: 83,98 + Actor419: t07 + Owner: Neutral + Location: 87,110 + Actor420: t17 + Owner: Neutral + Location: 103,142 + Actor421: t07 + Owner: Neutral + Location: 190,38 + Actor422: t07 + Owner: Neutral + Location: 155,41 + Actor425: t06 + Owner: Neutral + Location: 112,138 + Actor426: t13 + Owner: Neutral + Location: 126,91 + Actor427: t06 + Owner: Neutral + Location: 80,139 + Actor428: t02.husk + Owner: Neutral + Location: 60,106 + Actor430: t01 + Owner: Neutral + Location: 178,42 + Actor431: t12 + Owner: Neutral + Location: 179,40 + Actor433: t05 + Owner: Neutral + Location: 31,61 + Actor434: t13 + Owner: Neutral + Location: 191,71 + Actor436: t17 + Owner: Neutral + Location: 191,1 + Actor437: t13 + Owner: Neutral + Location: 0,56 + Actor438: t01 + Owner: Neutral + Location: 190,71 + Actor439: t12 + Owner: Neutral + Location: 192,66 + Actor440: t05 + Owner: Neutral + Location: 26,59 + Actor443: t01 + Owner: Neutral + Location: 70,106 + Actor445: t13.husk + Owner: Neutral + Location: 187,74 + Actor446: t17 + Owner: Neutral + Location: 163,70 + Actor448: t07 + Owner: Neutral + Location: 186,83 + Actor449: t13 + Owner: Neutral + Location: 26,67 + Actor460: t03 + Owner: Neutral + Location: 1,141 + Actor463: t05 + Owner: Neutral + Location: 120,93 + Actor464: t16 + Owner: Neutral + Location: 27,53 + Actor469: t01 + Owner: Neutral + Location: 192,37 + Actor472: t05 + Owner: Neutral + Location: 29,25 + Actor473: t07 + Owner: Neutral + Location: 190,35 + Actor474: t03.husk + Owner: Neutral + Location: 147,31 + Actor475: t17 + Owner: Neutral + Location: 8,26 + Actor479: t01.husk + Owner: Neutral + Location: 104,142 + Actor480: t13 + Owner: Neutral + Location: 59,116 + Actor481: t02 + Owner: Neutral + Location: 2,141 + Actor482: t07 + Owner: Neutral + Location: 48,125 + Actor488: t07.husk + Owner: Neutral + Location: 74,103 + Actor489: t05 + Owner: Neutral + Location: 1,55 + Actor493: t16 + Owner: Neutral + Location: 117,83 + Actor494: t02 + Owner: Neutral + Location: 188,69 + Actor496: t06 + Owner: Neutral + Location: 191,29 + Actor499: t07 + Owner: Neutral + Location: 103,138 + Actor500: t05 + Owner: Neutral + Location: 148,30 + Actor502: t02 + Owner: Neutral + Location: 53,99 + Actor503: t07 + Owner: Neutral + Location: 54,118 + Actor507: t02.husk + Owner: Neutral + Location: 27,61 + Actor508: t05 + Owner: Neutral + Location: 0,144 + Actor509: t13 + Owner: Neutral + Location: 16,36 + Actor510: t13 + Owner: Neutral + Location: 15,117 + Actor515: t01 + Owner: Neutral + Location: 72,99 + Actor519: t12 + Owner: Neutral + Location: 29,26 + Actor521: t01 + Owner: Neutral + Location: 26,135 + Actor522: t02 + Owner: Neutral + Location: 188,24 + Actor531: t05 + Owner: Neutral + Location: 152,2 + Actor536: t03 + Owner: Neutral + Location: 50,126 + Actor537: t12 + Owner: Neutral + Location: 1,32 + Actor538: t13 + Owner: Neutral + Location: 54,119 + Actor539: t05 + Owner: Neutral + Location: 156,6 + Actor540: t05 + Owner: Neutral + Location: 186,87 + Actor541: t13 + Owner: Neutral + Location: 172,72 + Actor544: t16 + Owner: Neutral + Location: 147,111 + Actor547: t05 + Owner: Neutral + Location: 109,144 + Actor550: t13 + Owner: Neutral + Location: 189,80 + Actor551: t08 + Owner: Neutral + Location: 167,81 + Actor552: t17 + Owner: Neutral + Location: 31,116 + Actor554: t07 + Owner: Neutral + Location: 79,93 + Actor555: t06 + Owner: Neutral + Location: 149,32 + Actor556: t05 + Owner: Neutral + Location: 168,73 + Actor557: t17.husk + Owner: Neutral + Location: 49,141 + Actor558: t16 + Owner: Neutral + Location: 15,40 + Actor559: t12 + Owner: Neutral + Location: 82,93 + Actor562: t06 + Owner: Neutral + Location: 156,31 + Actor570: t07 + Owner: Neutral + Location: 54,96 + Actor572: t05 + Owner: Neutral + Location: 191,122 + Actor574: t08 + Owner: Neutral + Location: 18,115 + Actor575: t06 + Owner: Neutral + Location: 2,140 + Actor577: t05 + Owner: Neutral + Location: 56,117 + Actor586: t13 + Owner: Neutral + Location: 122,87 + Actor589: t06 + Owner: Neutral + Location: 2,143 + Actor590: t02 + Owner: Neutral + Location: 0,89 + Actor591: t01 + Owner: Neutral + Location: 191,115 + Actor592: t08 + Owner: Neutral + Location: 51,144 + Actor593: t12 + Owner: Neutral + Location: 88,104 + Actor598: t13 + Owner: Neutral + Location: 87,104 + Actor607: t08 + Owner: Neutral + Location: 53,122 + Actor609: t01 + Owner: Neutral + Location: 71,97 + Actor610: t13 + Owner: Neutral + Location: 165,74 + Actor614: t01 + Owner: Neutral + Location: 189,13 + Actor618: t03 + Owner: Neutral + Location: 43,115 + Actor621: t02 + Owner: Neutral + Location: 190,64 + Actor623: t16.husk + Owner: Neutral + Location: 24,54 + Actor624: t07.husk + Owner: Neutral + Location: 156,1 + Actor625: t07 + Owner: Neutral + Location: 67,98 + Actor627: t13 + Owner: Neutral + Location: 157,4 + Actor629: t07 + Owner: Neutral + Location: 190,121 + Actor630: t05 + Owner: Neutral + Location: 105,141 + Actor631: t08 + Owner: Neutral + Location: 52,100 + Actor632: t16 + Owner: Neutral + Location: 174,43 + Actor633: t01 + Owner: Neutral + Location: 33,51 + Actor636: t17 + Owner: Neutral + Location: 192,0 + Actor637: t03 + Owner: Neutral + Location: 27,60 + Actor638: t05 + Owner: Neutral + Location: 31,27 + Actor642: t12 + Owner: Neutral + Location: 7,25 + Actor644: t12 + Owner: Neutral + Location: 2,38 + Actor649: t17 + Owner: Neutral + Location: 55,118 + Actor650: t01 + Owner: Neutral + Location: 72,96 + Actor651: t13 + Owner: Neutral + Location: 150,2 + Actor652: t13 + Owner: Neutral + Location: 89,109 + Actor654: t13.husk + Owner: Neutral + Location: 118,84 + Actor660: t17 + Owner: Neutral + Location: 20,132 + Actor666: t05 + Owner: Neutral + Location: 76,99 + Actor667: t16 + Owner: Neutral + Location: 59,99 + Actor670: t02 + Owner: Neutral + Location: 15,36 + Actor675: t03 + Owner: Neutral + Location: 105,142 + Actor677: t07 + Owner: Neutral + Location: 29,30 + Actor678: t12.husk + Owner: Neutral + Location: 17,144 + Actor679: t08 + Owner: Neutral + Location: 1,143 + Actor681: t17 + Owner: Neutral + Location: 124,89 + Actor683: t17 + Owner: Neutral + Location: 192,72 + Actor685: t13 + Owner: Neutral + Location: 168,8 + Actor686: t13 + Owner: Neutral + Location: 139,32 + Actor687: t13 + Owner: Neutral + Location: 141,27 + Actor688: t02 + Owner: Neutral + Location: 54,99 + Actor692: t06 + Owner: Neutral + Location: 24,55 + Actor704: t16 + Owner: Neutral + Location: 69,106 + Actor706: t08 + Owner: Neutral + Location: 0,94 + Actor711: t02 + Owner: Neutral + Location: 81,93 + Actor713: t07 + Owner: Neutral + Location: 17,142 + Actor714: t06 + Owner: Neutral + Location: 0,96 + Actor716: t02 + Owner: Neutral + Location: 189,19 + Actor717: t01 + Owner: Neutral + Location: 179,79 + Actor721: t08 + Owner: Neutral + Location: 56,98 + Actor722: t16 + Owner: Neutral + Location: 120,88 + Actor723: t17 + Owner: Neutral + Location: 155,7 + Actor724: t03 + Owner: Neutral + Location: 73,101 + Actor725: t08 + Owner: Neutral + Location: 190,23 + Actor728: t17 + Owner: Neutral + Location: 22,129 + Actor729: t06 + Owner: Neutral + Location: 80,140 + Actor731: t13.husk + Owner: Neutral + Location: 30,25 + Actor732: t16.husk + Owner: Neutral + Location: 15,63 + Actor734: t01 + Owner: Neutral + Location: 164,74 + Actor735: t02 + Owner: Neutral + Location: 149,31 + Actor737: t03 + Owner: Neutral + Location: 17,117 + Actor739: t07 + Owner: Neutral + Location: 54,98 + Actor742: t05 + Owner: Neutral + Location: 74,102 + Actor743: t07.husk + Owner: Neutral + Location: 34,52 + Actor744: t06 + Owner: Neutral + Location: 14,88 + Actor745: t05 + Owner: Neutral + Location: 49,95 + Actor747: t17 + Owner: Neutral + Location: 190,74 + Actor748: t17 + Owner: Neutral + Location: 22,131 + Actor750: t12 + Owner: Neutral + Location: 19,127 + Actor756: t03 + Owner: Neutral + Location: 50,94 + Actor757: t03 + Owner: Neutral + Location: 189,72 + Actor758: t08 + Owner: Neutral + Location: 180,42 + Actor759: t02 + Owner: Neutral + Location: 59,112 + Actor763: t08 + Owner: Neutral + Location: 170,79 + Actor765: t07 + Owner: Neutral + Location: 190,84 + Actor767: t05 + Owner: Neutral + Location: 57,109 + Actor768: t07 + Owner: Neutral + Location: 173,72 + Actor772: t05 + Owner: Neutral + Location: 171,44 + Actor773: t05 + Owner: Neutral + Location: 25,63 + Actor778: t05 + Owner: Neutral + Location: 21,129 + Actor780: t06 + Owner: Neutral + Location: 77,97 + Actor781: t12 + Owner: Neutral + Location: 100,144 + Actor782: t07 + Owner: Neutral + Location: 186,71 + Actor787: t03 + Owner: Neutral + Location: 84,129 + Actor792: t05 + Owner: Neutral + Location: 152,112 + Actor794: t16 + Owner: Neutral + Location: 172,8 + Actor796: t16 + Owner: Neutral + Location: 188,32 + Actor800: t12 + Owner: Neutral + Location: 144,29 + Actor801: t01 + Owner: Neutral + Location: 156,41 + Actor804: t08 + Owner: Neutral + Location: 190,118 + Actor805: t06 + Owner: Neutral + Location: 53,98 + Actor807: t16.husk + Owner: Neutral + Location: 89,111 + Actor810: t13 + Owner: Neutral + Location: 189,30 + Actor813: t07 + Owner: Neutral + Location: 57,115 + Actor816: t05.husk + Owner: Neutral + Location: 169,8 + Actor817: t16.husk + Owner: Neutral + Location: 6,141 + Actor819: t13 + Owner: Neutral + Location: 167,71 + Actor820: t03 + Owner: Neutral + Location: 138,30 + Actor821: t07 + Owner: Neutral + Location: 120,86 + Actor823: t13.husk + Owner: Neutral + Location: 82,95 + Actor824: t16 + Owner: Neutral + Location: 2,64 + Actor825: t16 + Owner: Neutral + Location: 25,50 + Actor826: t05.husk + Owner: Neutral + Location: 65,129 + Actor829: t08 + Owner: Neutral + Location: 15,45 + Actor831: t03 + Owner: Neutral + Location: 80,127 + Actor832: t16 + Owner: Neutral + Location: 166,81 + Actor834: t12 + Owner: Neutral + Location: 122,90 + Actor835: t03 + Owner: Neutral + Location: 51,128 + Actor839: t16 + Owner: Neutral + Location: 187,86 + Actor842: t08.husk + Owner: Neutral + Location: 85,106 + Actor845: t03 + Owner: Neutral + Location: 174,71 + Actor847: t02 + Owner: Neutral + Location: 60,110 + Actor849: t01 + Owner: Neutral + Location: 168,10 + Actor851: t16 + Owner: Neutral + Location: 56,114 + Actor852: t13 + Owner: Neutral + Location: 25,55 + Actor853: t16 + Owner: Neutral + Location: 178,43 + Actor857: t12 + Owner: Neutral + Location: 4,141 + Actor858: t12 + Owner: Neutral + Location: 1,34 + Actor859: t06.husk + Owner: Neutral + Location: 1,33 + Actor861: t13 + Owner: Neutral + Location: 3,140 + Actor863: t17 + Owner: Neutral + Location: 80,94 + Actor872: t03 + Owner: Neutral + Location: 59,106 + Actor873: t17 + Owner: Neutral + Location: 161,73 + Actor877: t05 + Owner: Neutral + Location: 190,6 + Actor878: t06.husk + Owner: Neutral + Location: 20,124 + Actor886: t13 + Owner: Neutral + Location: 19,124 + Actor887: t08 + Owner: Neutral + Location: 157,44 + Actor889: t02 + Owner: Neutral + Location: 11,44 + Actor890: t17.husk + Owner: Neutral + Location: 16,37 + Actor892: t13 + Owner: Neutral + Location: 34,51 + Actor893: t05 + Owner: Neutral + Location: 15,124 + Actor897: t07.husk + Owner: Neutral + Location: 31,26 + Actor898: t01.husk + Owner: Neutral + Location: 152,30 + Actor900: t01 + Owner: Neutral + Location: 81,92 + Actor903: t13 + Owner: Neutral + Location: 84,97 + Actor904: t02.husk + Owner: Neutral + Location: 176,41 + Actor906: t06 + Owner: Neutral + Location: 15,47 + Actor907: t05 + Owner: Neutral + Location: 89,107 + Actor908: t05.husk + Owner: Neutral + Location: 108,143 + Actor909: t02 + Owner: Neutral + Location: 14,143 + Actor910: t05 + Owner: Neutral + Location: 102,139 + Actor911: t08 + Owner: Neutral + Location: 160,43 + Actor912: t16 + Owner: Neutral + Location: 15,143 + Actor913: t01 + Owner: Neutral + Location: 7,141 + Actor914: t12 + Owner: Neutral + Location: 190,118 + Actor916: t01 + Owner: Neutral + Location: 154,49 + Actor917: t12 + Owner: Neutral + Location: 170,45 + Actor918: t07 + Owner: Neutral + Location: 168,72 + Actor919: t05 + Owner: Neutral + Location: 74,98 + Actor920: t16 + Owner: Neutral + Location: 169,9 + Actor921: t05 + Owner: Neutral + Location: 85,130 + Actor924: t06 + Owner: Neutral + Location: 15,41 + Actor926: t16 + Owner: Neutral + Location: 18,115 + Actor927: t05 + Owner: Neutral + Location: 81,127 + Actor933: t03 + Owner: Neutral + Location: 30,116 + Actor934: t01 + Owner: Neutral + Location: 85,101 + Actor936: t08 + Owner: Neutral + Location: 172,75 + Actor937: t03.husk + Owner: Neutral + Location: 25,128 + Actor938: t02 + Owner: Neutral + Location: 56,116 + Actor941: t05 + Owner: Neutral + Location: 190,124 + Actor942: t07 + Owner: Neutral + Location: 107,137 + Actor943: t01 + Owner: Neutral + Location: 73,103 + Actor944: t12 + Owner: Neutral + Location: 17,125 + Actor946: t06 + Owner: Neutral + Location: 177,78 + Actor947: t03 + Owner: Neutral + Location: 75,94 + Actor949: t05 + Owner: Neutral + Location: 71,96 + Actor953: t16 + Owner: Neutral + Location: 78,111 + Actor955: t12 + Owner: Neutral + Location: 18,43 + Actor956: t03 + Owner: Neutral + Location: 170,4 + Actor963: t13 + Owner: Neutral + Location: 165,76 + Actor964: t17 + Owner: Neutral + Location: 15,72 + Actor965: t03 + Owner: Neutral + Location: 186,79 + Actor967: t17 + Owner: Neutral + Location: 15,66 + Actor969: t13 + Owner: Neutral + Location: 177,77 + Actor970: t16 + Owner: Neutral + Location: 114,85 + Actor971: t07 + Owner: Neutral + Location: 19,115 + Actor972: t03.husk + Owner: Neutral + Location: 151,4 + Actor973: t01 + Owner: Neutral + Location: 71,99 + Actor974: t03 + Owner: Neutral + Location: 59,111 + Actor975: t13 + Owner: Neutral + Location: 43,120 + Actor980: t05 + Owner: Neutral + Location: 175,77 + Actor985: t07 + Owner: Neutral + Location: 46,126 + Actor987: t03 + Owner: Neutral + Location: 2,88 + Actor988: t12 + Owner: Neutral + Location: 29,111 + Actor989: t17 + Owner: Neutral + Location: 155,6 + Actor992: t17 + Owner: Neutral + Location: 161,45 + Actor993: t01 + Owner: Neutral + Location: 5,143 + Actor995: t05 + Owner: Neutral + Location: 85,108 + Actor998: t06 + Owner: Neutral + Location: 0,87 + Actor1001: t12 + Owner: Neutral + Location: 79,115 + Actor1007: t05 + Owner: Neutral + Location: 155,42 + Actor1009: t13 + Owner: Neutral + Location: 178,39 + Actor1012: t06 + Owner: Neutral + Location: 83,94 + Actor1013: t12.husk + Owner: Neutral + Location: 12,70 + Actor1019: t17 + Owner: Neutral + Location: 152,3 + Actor1020: t06 + Owner: Neutral + Location: 172,77 + Actor1021: t06 + Owner: Neutral + Location: 21,128 + Actor1024: t07 + Owner: Neutral + Location: 154,52 + Actor1030: t13 + Owner: Neutral + Location: 101,138 + Actor1033: t17 + Owner: Neutral + Location: 15,116 + Actor1034: t12 + Owner: Neutral + Location: 13,87 + Actor1038: t05 + Owner: Neutral + Location: 85,107 + Actor1041: t05 + Owner: Neutral + Location: 176,81 + Actor1044: t01 + Owner: Neutral + Location: 1,87 + Actor1045: t13.husk + Owner: Neutral + Location: 152,48 + Actor1047: t06 + Owner: Neutral + Location: 20,126 + Actor1053: t03 + Owner: Neutral + Location: 101,144 + Actor1054: t17 + Owner: Neutral + Location: 76,112 + Actor1055: t02 + Owner: Neutral + Location: 80,98 + Actor1057: t16 + Owner: Neutral + Location: 26,55 + Actor1059: t17 + Owner: Neutral + Location: 49,126 + Actor1061: t13 + Owner: Neutral + Location: 191,114 + Actor1065: t05 + Owner: Neutral + Location: 55,117 + Actor1066: t13.husk + Owner: Neutral + Location: 22,120 + Actor1067: t12 + Owner: Neutral + Location: 90,108 + Actor1068: t01 + Owner: Neutral + Location: 173,68 + Actor1069: t05 + Owner: Neutral + Location: 78,99 + Actor1073: t01 + Owner: Neutral + Location: 14,46 + Actor1075: t03 + Owner: Neutral + Location: 117,84 + Actor1078: t13 + Owner: Neutral + Location: 83,139 + Actor1080: t03 + Owner: Neutral + Location: 161,0 + Actor1083: t13 + Owner: Neutral + Location: 87,105 + Actor1087: t16 + Owner: Neutral + Location: 125,94 + Actor1090: t16 + Owner: Neutral + Location: 72,98 + Actor1093: t06 + Owner: Neutral + Location: 12,44 + Actor1094: t02 + Owner: Neutral + Location: 164,77 + Actor1096: t13 + Owner: Neutral + Location: 106,137 + Actor1099: t06 + Owner: Neutral + Location: 118,87 + Actor1101: t06 + Owner: Neutral + Location: 172,73 + Actor1109: t06 + Owner: Neutral + Location: 1,139 + Actor1110: t02 + Owner: Neutral + Location: 1,56 + Actor1111: t05 + Owner: Neutral + Location: 192,36 + Actor1112: t08 + Owner: Neutral + Location: 49,128 + Actor1116: t13 + Owner: Neutral + Location: 18,121 + Actor1117: t01 + Owner: Neutral + Location: 0,142 + Actor1118: t01.husk + Owner: Neutral + Location: 86,110 + Actor1122: t13 + Owner: Neutral + Location: 2,84 + Actor1125: t01 + Owner: Neutral + Location: 15,126 + Actor1127: t01.husk + Owner: Neutral + Location: 74,99 + Actor1129: t03 + Owner: Neutral + Location: 116,89 + Actor1132: t08 + Owner: Neutral + Location: 192,123 + Actor1133: t06 + Owner: Neutral + Location: 26,109 + Actor1136: t01 + Owner: Neutral + Location: 70,98 + Actor1137: t06 + Owner: Neutral + Location: 52,123 + Actor1140: t08 + Owner: Neutral + Location: 3,135 + Actor1143: t03 + Owner: Neutral + Location: 23,122 + Actor1144: t12 + Owner: Neutral + Location: 55,121 + Actor1147: t12 + Owner: Neutral + Location: 15,42 + Actor1148: t01 + Owner: Neutral + Location: 175,78 + Actor1149: t06.husk + Owner: Neutral + Location: 171,78 + Actor1151: t02 + Owner: Neutral + Location: 30,22 + Actor1154: t17 + Owner: Neutral + Location: 191,120 + Actor1156: t03 + Owner: Neutral + Location: 192,24 + Actor1163: t02 + Owner: Neutral + Location: 53,122 + Actor1165: t06.husk + Owner: Neutral + Location: 29,60 + Actor1168: t17 + Owner: Neutral + Location: 176,83 + Actor1170: t07 + Owner: Neutral + Location: 123,92 + Actor1171: t03 + Owner: Neutral + Location: 25,61 + Actor1173: t16.husk + Owner: Neutral + Location: 148,113 + Actor1174: t16 + Owner: Neutral + Location: 84,139 + Actor1175: t13 + Owner: Neutral + Location: 192,125 + Actor1177: t06 + Owner: Neutral + Location: 110,142 + Actor1179: t02 + Owner: Neutral + Location: 2,63 + Actor1182: t07 + Owner: Neutral + Location: 155,5 + Actor1183: t08 + Owner: Neutral + Location: 189,22 + Actor1186: t03 + Owner: Neutral + Location: 25,124 + Actor1187: t13 + Owner: Neutral + Location: 16,124 + Actor1188: t05 + Owner: Neutral + Location: 75,112 + Actor1189: t16.husk + Owner: Neutral + Location: 58,114 + Actor1198: t01 + Owner: Neutral + Location: 15,37 + Actor1199: t16 + Owner: Neutral + Location: 80,128 + Actor1202: t12 + Owner: Neutral + Location: 52,124 + Actor1204: t17 + Owner: Neutral + Location: 178,38 + Actor1205: t05 + Owner: Neutral + Location: 25,56 + Actor1206: t01 + Owner: Neutral + Location: 52,140 + Actor1207: t02 + Owner: Neutral + Location: 78,113 + Actor1208: t17 + Owner: Neutral + Location: 0,139 + Actor1209: t05 + Owner: Neutral + Location: 16,68 + Actor1214: t08 + Owner: Neutral + Location: 190,22 + Actor1216: t06 + Owner: Neutral + Location: 17,143 + Actor1217: t12 + Owner: Neutral + Location: 124,94 + Actor1221: t02 + Owner: Neutral + Location: 14,123 + Actor1222: t16 + Owner: Neutral + Location: 88,128 + Actor1223: t06 + Owner: Neutral + Location: 107,141 + Actor1225: t12 + Owner: Neutral + Location: 26,53 + Actor1226: t05 + Owner: Neutral + Location: 26,60 + Actor1227: t07 + Owner: Neutral + Location: 161,74 + Actor1228: t01 + Owner: Neutral + Location: 59,114 + Actor1231: t08 + Owner: Neutral + Location: 191,39 + Actor1236: t07 + Owner: Neutral + Location: 189,31 + Actor1238: t12 + Owner: Neutral + Location: 26,48 + Actor1239: t17 + Owner: Neutral + Location: 189,18 + Actor1240: t13 + Owner: Neutral + Location: 73,98 + Actor1243: t01 + Owner: Neutral + Location: 26,56 + Actor1245: t07 + Owner: Neutral + Location: 145,29 + Actor1246: t05 + Owner: Neutral + Location: 57,113 + Actor1247: t06 + Owner: Neutral + Location: 31,117 + Actor1248: t03 + Owner: Neutral + Location: 178,72 + Actor1249: t08 + Owner: Neutral + Location: 20,134 + Actor1250: t05 + Owner: Neutral + Location: 83,96 + Actor1252: t05 + Owner: Neutral + Location: 17,114 + Actor1256: t16 + Owner: Neutral + Location: 24,53 + Actor1257: t16 + Owner: Neutral + Location: 172,45 + Actor1258: t12 + Owner: Neutral + Location: 115,82 + Actor1259: t12 + Owner: Neutral + Location: 59,104 + Actor1264: t05 + Owner: Neutral + Location: 50,127 + Actor1266: t03 + Owner: Neutral + Location: 99,139 + Actor1268: t05 + Owner: Neutral + Location: 1,84 + Actor1270: t06 + Owner: Neutral + Location: 186,84 + Actor1271: t07 + Owner: Neutral + Location: 86,126 + Actor1272: t12 + Owner: Neutral + Location: 56,113 + Actor1275: t01 + Owner: Neutral + Location: 190,73 + Actor1276: t12 + Owner: Neutral + Location: 59,110 + Actor1279: t16 + Owner: Neutral + Location: 150,34 + Actor1280: t01 + Owner: Neutral + Location: 147,32 + Actor1281: t13 + Owner: Neutral + Location: 55,99 + Actor1283: t17 + Owner: Neutral + Location: 20,125 + Actor1285: t05 + Owner: Neutral + Location: 8,140 + Actor1288: t17 + Owner: Neutral + Location: 78,112 + Actor1290: t06 + Owner: Neutral + Location: 189,32 + Actor1292: t03 + Owner: Neutral + Location: 150,112 + Actor1293: t16 + Owner: Neutral + Location: 155,9 + Actor1294: t12 + Owner: Neutral + Location: 154,31 + Actor1295: t01 + Owner: Neutral + Location: 191,26 + Actor1296: t13 + Owner: Neutral + Location: 49,125 + Actor1300: t01 + Owner: Neutral + Location: 8,25 + Actor1303: t08 + Owner: Neutral + Location: 25,50 + Actor1306: t08 + Owner: Neutral + Location: 150,116 + Actor1310: t02.husk + Owner: Neutral + Location: 83,95 + Actor1313: t03 + Owner: Neutral + Location: 57,114 + Actor1314: t17 + Owner: Neutral + Location: 81,140 + Actor1315: t08 + Owner: Neutral + Location: 32,117 + Actor1318: t03 + Owner: Neutral + Location: 155,31 + Actor1319: t07 + Owner: Neutral + Location: 86,128 + Actor1320: t03 + Owner: Neutral + Location: 84,103 + Actor1327: t01 + Owner: Neutral + Location: 122,88 + Actor1328: t17 + Owner: Neutral + Location: 0,88 + Actor1329: t05 + Owner: Neutral + Location: 48,129 + Actor1330: t06 + Owner: Neutral + Location: 89,105 + Actor1332: t05 + Owner: Neutral + Location: 20,131 + Actor1333: t08 + Owner: Neutral + Location: 104,137 + Actor1335: t12 + Owner: Neutral + Location: 25,135 + Actor1336: t12 + Owner: Neutral + Location: 51,121 + Actor1338: t01 + Owner: Neutral + Location: 50,130 + Actor1339: t07 + Owner: Neutral + Location: 100,138 + Actor1342: t06 + Owner: Neutral + Location: 144,32 + Actor1345: t08 + Owner: Neutral + Location: 25,134 + Actor1347: t01 + Owner: Neutral + Location: 1,60 + Actor1351: t07 + Owner: Neutral + Location: 48,95 + Actor1353: t13 + Owner: Neutral + Location: 55,107 + Actor1355: t16 + Owner: Neutral + Location: 141,28 + Actor1356: t17 + Owner: Neutral + Location: 191,23 + Actor1357: t16 + Owner: Neutral + Location: 18,127 + Actor1358: t13 + Owner: Neutral + Location: 192,32 + Actor1360: t13 + Owner: Neutral + Location: 13,36 + Actor1362: t03 + Owner: Neutral + Location: 109,140 + Actor1365: t07 + Owner: Neutral + Location: 12,46 + Actor1366: t01 + Owner: Neutral + Location: 178,41 + Actor1367: t02 + Owner: Neutral + Location: 43,116 + Actor1370: t17 + Owner: Neutral + Location: 1,35 + Actor1371: t03 + Owner: Neutral + Location: 192,2 + Actor1373: t01 + Owner: Neutral + Location: 190,115 + Actor1375: t13 + Owner: Neutral + Location: 56,119 + Actor1376: t13 + Owner: Neutral + Location: 170,77 + Actor1377: t16 + Owner: Neutral + Location: 58,116 + Actor1379: t16 + Owner: Neutral + Location: 77,93 + Actor1380: t03 + Owner: Neutral + Location: 191,65 + Actor1381: t08 + Owner: Neutral + Location: 192,30 + Actor1382: t12 + Owner: Neutral + Location: 68,106 + Actor1383: t16 + Owner: Neutral + Location: 110,144 + Actor1384: t07 + Owner: Neutral + Location: 190,66 + Actor1386: t08 + Owner: Neutral + Location: 137,30 + Actor1389: t16 + Owner: Neutral + Location: 13,46 + Actor1391: t12 + Owner: Neutral + Location: 25,126 + Actor1392: t03.husk + Owner: Neutral + Location: 152,113 + Actor1393: t07 + Owner: Neutral + Location: 170,75 + Actor1394: t01 + Owner: Neutral + Location: 16,144 + Actor1397: t16 + Owner: Neutral + Location: 82,94 + Actor1398: t02 + Owner: Neutral + Location: 11,70 + Actor1399: t02 + Owner: Neutral + Location: 73,100 + Actor1400: t03 + Owner: Neutral + Location: 29,24 + Actor1402: t13 + Owner: Neutral + Location: 72,101 + Actor1404: t01 + Owner: Neutral + Location: 16,112 + Actor1407: t16 + Owner: Neutral + Location: 3,35 + Actor1416: t17 + Owner: Neutral + Location: 52,126 + Actor1418: t06 + Owner: Neutral + Location: 88,129 + Actor1423: t03 + Owner: Neutral + Location: 143,29 + Actor1427: t05 + Owner: Neutral + Location: 176,78 + Actor1428: t16 + Owner: Neutral + Location: 74,96 + Actor1430: t13 + Owner: Neutral + Location: 190,24 + Actor1432: t05 + Owner: Neutral + Location: 15,115 + Actor1439: t07 + Owner: Neutral + Location: 109,139 + Actor1440: t12 + Owner: Neutral + Location: 57,111 + Actor1442: t03 + Owner: Neutral + Location: 158,41 + Actor1443: t01 + Owner: Neutral + Location: 1,88 + Actor1444: t06 + Owner: Neutral + Location: 191,35 + Actor1445: t06 + Owner: Neutral + Location: 162,76 + Actor1446: t01 + Owner: Neutral + Location: 147,33 + Actor1451: t03.husk + Owner: Neutral + Location: 170,43 + Actor1454: t03 + Owner: Neutral + Location: 53,124 + Actor1458: t17.husk + Owner: Neutral + Location: 16,113 + Actor1459: t05 + Owner: Neutral + Location: 80,125 + Actor1461: t12 + Owner: Neutral + Location: 45,125 + Actor1462: t05 + Owner: Neutral + Location: 189,73 + Actor1464: t16 + Owner: Neutral + Location: 106,135 + Actor1465: t16 + Owner: Neutral + Location: 191,2 + Actor1467: t06 + Owner: Neutral + Location: 139,29 + Actor1468: t06 + Owner: Neutral + Location: 24,133 + Actor1469: t16 + Owner: Neutral + Location: 32,22 + Actor1471: t02 + Owner: Neutral + Location: 190,10 + Actor1473: t13 + Owner: Neutral + Location: 20,130 + Actor1474: t02 + Owner: Neutral + Location: 175,70 + Actor1475: t01 + Owner: Neutral + Location: 141,32 + Actor1479: t05 + Owner: Neutral + Location: 28,24 + Actor1480: t06.husk + Owner: Neutral + Location: 178,76 + Actor1481: t12 + Owner: Neutral + Location: 189,71 + Actor1485: t08 + Owner: Neutral + Location: 191,25 + Actor1486: t12 + Owner: Neutral + Location: 177,81 + Actor1488: t08 + Owner: Neutral + Location: 192,112 + Actor1491: t06 + Owner: Neutral + Location: 13,144 + Actor1494: t05 + Owner: Neutral + Location: 16,65 + Actor1495: t08 + Owner: Neutral + Location: 177,38 + Actor1496: t05 + Owner: Neutral + Location: 50,138 + Actor1508: t13 + Owner: Neutral + Location: 59,115 + Actor1510: t07.husk + Owner: Neutral + Location: 106,139 + Actor1511: t05 + Owner: Neutral + Location: 77,99 + Actor1512: t02 + Owner: Neutral + Location: 52,98 + Actor1513: t13 + Owner: Neutral + Location: 49,96 + Actor1515: t17 + Owner: Neutral + Location: 14,115 + Actor1517: t17 + Owner: Neutral + Location: 149,116 + Actor1520: t17 + Owner: Neutral + Location: 113,137 + Actor1521: t07 + Owner: Neutral + Location: 163,79 + Actor1522: t16 + Owner: Neutral + Location: 57,119 + Actor1523: t01 + Owner: Neutral + Location: 1,86 + Actor1526: t06 + Owner: Neutral + Location: 174,81 + Actor1530: t03 + Owner: Neutral + Location: 140,30 + Actor1531: t13 + Owner: Neutral + Location: 85,104 + Actor1533: t12 + Owner: Neutral + Location: 162,75 + Actor1540: t12 + Owner: Neutral + Location: 142,33 + Actor1544: t17 + Owner: Neutral + Location: 59,105 + Actor1547: t05 + Owner: Neutral + Location: 191,31 + Actor1549: t13 + Owner: Neutral + Location: 107,144 + Actor1551: t02 + Owner: Neutral + Location: 121,85 + Actor1552: t06 + Owner: Neutral + Location: 149,117 + Actor1553: t17 + Owner: Neutral + Location: 18,142 + Actor1556: t13 + Owner: Neutral + Location: 138,28 + Actor1557: t01 + Owner: Neutral + Location: 170,70 + Actor1558: t16 + Owner: Neutral + Location: 3,36 + Actor1560: t01.husk + Owner: Neutral + Location: 189,79 + Actor1562: t16 + Owner: Neutral + Location: 175,40 + Actor1566: t07 + Owner: Neutral + Location: 16,125 + Actor1567: t03 + Owner: Neutral + Location: 10,26 + Actor1570: t02 + Owner: Neutral + Location: 171,10 + Actor1573: t13.husk + Owner: Neutral + Location: 106,141 + Actor1574: t01 + Owner: Neutral + Location: 23,131 + Actor1575: t16 + Owner: Neutral + Location: 179,80 + Actor1576: t16 + Owner: Neutral + Location: 124,87 + Actor1577: t05 + Owner: Neutral + Location: 189,69 + Actor1578: t08 + Owner: Neutral + Location: 78,94 + Actor1580: t02.husk + Owner: Neutral + Location: 168,6 + Actor1581: t03 + Owner: Neutral + Location: 62,53 + Actor1583: t03 + Owner: Neutral + Location: 190,1 + Actor1591: t05 + Owner: Neutral + Location: 156,64 + Actor1594: t01 + Owner: Neutral + Location: 51,125 + Actor1598: t17 + Owner: Neutral + Location: 18,69 + Actor1599: t16 + Owner: Neutral + Location: 28,29 + Actor1600: t07 + Owner: Neutral + Location: 111,137 + Actor1603: t12 + Owner: Neutral + Location: 10,27 + Actor1604: t07.husk + Owner: Neutral + Location: 192,38 + Actor1606: t17 + Owner: Neutral + Location: 8,141 + Actor1609: t02 + Owner: Neutral + Location: 188,25 + Actor1610: t07 + Owner: Neutral + Location: 66,52 + Actor1611: t01 + Owner: Neutral + Location: 15,68 + Actor1613: t02 + Owner: Neutral + Location: 81,94 + Actor1614: t07 + Owner: Neutral + Location: 140,28 + Actor1615: t03 + Owner: Neutral + Location: 172,44 + Actor1620: t13 + Owner: Neutral + Location: 151,117 + Actor1623: t16 + Owner: Neutral + Location: 189,26 + Actor1624: t02 + Owner: Neutral + Location: 56,107 + Actor1625: t01 + Owner: Neutral + Location: 23,134 + Actor1626: t01 + Owner: Neutral + Location: 151,33 + Actor1627: t16.husk + Owner: Neutral + Location: 16,66 + Actor1628: t05 + Owner: Neutral + Location: 74,105 + Actor1631: t03 + Owner: Neutral + Location: 82,141 + Actor1635: t03 + Owner: Neutral + Location: 109,134 + Actor1638: t03 + Owner: Neutral + Location: 192,23 + Actor1641: t06 + Owner: Neutral + Location: 81,97 + Actor1644: t06 + Owner: Neutral + Location: 2,59 + Actor1646: t03 + Owner: Neutral + Location: 28,61 + Actor1648: t01 + Owner: Neutral + Location: 3,143 + Actor1649: t05 + Owner: Neutral + Location: 191,79 + Actor1650: t17 + Owner: Neutral + Location: 81,141 + Actor1651: t13 + Owner: Neutral + Location: 23,121 + Actor1654: t08 + Owner: Neutral + Location: 192,127 + Actor1655: t12 + Owner: Neutral + Location: 55,116 + Actor1659: t02 + Owner: Neutral + Location: 18,124 + Actor1660: t12 + Owner: Neutral + Location: 84,141 + Actor1663: t05 + Owner: Neutral + Location: 51,98 + Actor1664: t12 + Owner: Neutral + Location: 52,143 + Actor1666: t06 + Owner: Neutral + Location: 1,89 + Actor1668: t02 + Owner: Neutral + Location: 192,19 + Actor1670: t17.husk + Owner: Neutral + Location: 159,40 + Actor1674: t03 + Owner: Neutral + Location: 190,82 + Actor1675: t16 + Owner: Neutral + Location: 15,144 + Actor1677: t06 + Owner: Neutral + Location: 81,91 + Actor1678: t13 + Owner: Neutral + Location: 154,47 + Actor1679: t06 + Owner: Neutral + Location: 117,86 + Actor1680: t13 + Owner: Neutral + Location: 152,114 + Actor1681: t17 + Owner: Neutral + Location: 15,125 + Actor1684: t02 + Owner: Neutral + Location: 65,44 + Actor1685: t01 + Owner: Neutral + Location: 191,21 + Actor1686: t13 + Owner: Neutral + Location: 22,130 + Actor1687: t17 + Owner: Neutral + Location: 1,70 + Actor1688: t01 + Owner: Neutral + Location: 44,144 + Actor1689: t03 + Owner: Neutral + Location: 190,79 + Actor1690: t03 + Owner: Neutral + Location: 192,31 + Actor1693: t08 + Owner: Neutral + Location: 17,124 + Actor1694: t06 + Owner: Neutral + Location: 58,111 + Actor1695: t12 + Owner: Neutral + Location: 151,112 + Actor1696: t17.husk + Owner: Neutral + Location: 191,30 + Actor1697: t12.husk + Owner: Neutral + Location: 154,3 + Actor1698: t16.husk + Owner: Neutral + Location: 71,103 + Actor1700: t03.husk + Owner: Neutral + Location: 79,99 + Actor1701: t06 + Owner: Neutral + Location: 150,32 + Actor1703: t07.husk + Owner: Neutral + Location: 53,140 + Actor1704: t07 + Owner: Neutral + Location: 51,122 + Actor1706: t17 + Owner: Neutral + Location: 157,5 + Actor1711: t06 + Owner: Neutral + Location: 141,33 + Actor1712: t08 + Owner: Neutral + Location: 58,118 + Actor1713: t08 + Owner: Neutral + Location: 14,143 + Actor1714: t13 + Owner: Neutral + Location: 49,140 + Actor1715: t08 + Owner: Neutral + Location: 168,10 + Actor1720: t16 + Owner: Neutral + Location: 27,109 + Actor1722: t02 + Owner: Neutral + Location: 89,106 + Actor1723: t16 + Owner: Neutral + Location: 83,142 + Actor1726: t16 + Owner: Neutral + Location: 106,136 + Actor1730: t16 + Owner: Neutral + Location: 65,45 + Actor1732: t17 + Owner: Neutral + Location: 192,115 + Actor1733: t13 + Owner: Neutral + Location: 106,142 + Actor1734: t12 + Owner: Neutral + Location: 16,67 + Actor1735: t07.husk + Owner: Neutral + Location: 50,128 + Actor1737: t08 + Owner: Neutral + Location: 13,45 + Actor1743: t17 + Owner: Neutral + Location: 106,138 + Actor1744: t12 + Owner: Neutral + Location: 49,138 + Actor1745: t13 + Owner: Neutral + Location: 171,75 + Actor1747: t05.husk + Owner: Neutral + Location: 55,98 + Actor1749: t16 + Owner: Neutral + Location: 189,36 + Actor1751: t06 + Owner: Neutral + Location: 173,70 + Actor1755: t05 + Owner: Neutral + Location: 14,71 + Actor1757: t01 + Owner: Neutral + Location: 28,109 + Actor1759: t08 + Owner: Neutral + Location: 148,115 + Actor1760: t03 + Owner: Neutral + Location: 143,32 + Actor1761: t01 + Owner: Neutral + Location: 1,63 + Actor1762: t03 + Owner: Neutral + Location: 15,65 + Actor1763: t03 + Owner: Neutral + Location: 177,41 + Actor1765: t06 + Owner: Neutral + Location: 28,63 + Actor1766: t07 + Owner: Neutral + Location: 107,143 + Actor1768: t01 + Owner: Neutral + Location: 31,62 + Actor1771: t13 + Owner: Neutral + Location: 26,51 + Actor1774: t13 + Owner: Neutral + Location: 142,29 + Actor1777: t02 + Owner: Neutral + Location: 18,117 + Actor1782: t17 + Owner: Neutral + Location: 57,112 + Actor1783: t06 + Owner: Neutral + Location: 111,136 + Actor1784: t06 + Owner: Neutral + Location: 88,110 + Actor1786: t01 + Owner: Neutral + Location: 63,52 + Actor1796: t12 + Owner: Neutral + Location: 107,135 + Actor1797: t05 + Owner: Neutral + Location: 88,103 + Actor1800: t06 + Owner: Neutral + Location: 110,143 + Actor1802: t13 + Owner: Neutral + Location: 174,78 + Actor1806: t05 + Owner: Neutral + Location: 51,127 + Actor1807: t13.husk + Owner: Neutral + Location: 124,88 + Actor1813: t05 + Owner: Neutral + Location: 62,144 + Actor1814: t01 + Owner: Neutral + Location: 50,129 + Actor1815: t13 + Owner: Neutral + Location: 171,8 + Actor1816: t05 + Owner: Neutral + Location: 73,114 + Actor1817: t16 + Owner: Neutral + Location: 16,141 + Actor1819: t03 + Owner: Neutral + Location: 114,137 + Actor1820: t07 + Owner: Neutral + Location: 177,39 + Actor1824: t03 + Owner: Neutral + Location: 79,98 + Actor1828: t05 + Owner: Neutral + Location: 190,67 + Actor1831: t17 + Owner: Neutral + Location: 5,141 + Actor1835: t17 + Owner: Neutral + Location: 167,77 + Actor1836: t17 + Owner: Neutral + Location: 0,141 + Actor1837: t06 + Owner: Neutral + Location: 60,99 + Actor1838: t12 + Owner: Neutral + Location: 189,22 + Actor1842: t08 + Owner: Neutral + Location: 73,103 + Actor1843: t05 + Owner: Neutral + Location: 87,111 + Actor1844: t02.husk + Owner: Neutral + Location: 171,4 + Actor1849: t02 + Owner: Neutral + Location: 177,80 + Actor1850: t01 + Owner: Neutral + Location: 165,69 + Actor1851: t05 + Owner: Neutral + Location: 142,28 + Actor1854: t12 + Owner: Neutral + Location: 14,47 + Actor1856: t01.husk + Owner: Neutral + Location: 151,111 + Actor1857: t13.husk + Owner: Neutral + Location: 123,87 + Actor1858: t13 + Owner: Neutral + Location: 84,130 + Actor1861: t06 + Owner: Neutral + Location: 108,135 + Actor1863: t08 + Owner: Neutral + Location: 80,139 + Actor1867: t03 + Owner: Neutral + Location: 119,87 + Actor1869: t02 + Owner: Neutral + Location: 86,131 + Actor1870: t17 + Owner: Neutral + Location: 157,2 + Actor1872: t08 + Owner: Neutral + Location: 189,79 + Actor1875: t03 + Owner: Neutral + Location: 153,4 + Actor1876: t03 + Owner: Neutral + Location: 87,128 + Actor1878: t02 + Owner: Neutral + Location: 176,69 + Actor1880: t17 + Owner: Neutral + Location: 5,140 + Actor1888: t02 + Owner: Neutral + Location: 12,36 + Actor1893: t01 + Owner: Neutral + Location: 55,97 + Actor1896: t05 + Owner: Neutral + Location: 165,71 + Actor1897: t08 + Owner: Neutral + Location: 2,138 + Actor1898: t02 + Owner: Neutral + Location: 1,135 + Actor1900: t13 + Owner: Neutral + Location: 171,7 + Actor1902: t17 + Owner: Neutral + Location: 2,60 + Actor1903: t05 + Owner: Neutral + Location: 19,123 + Actor1905: t06 + Owner: Neutral + Location: 71,104 + Actor1906: t08 + Owner: Neutral + Location: 29,115 + Actor1908: t06 + Owner: Neutral + Location: 81,138 + Actor1911: t17 + Owner: Neutral + Location: 167,79 + Actor1917: t12 + Owner: Neutral + Location: 3,141 + Actor1918: t12 + Owner: Neutral + Location: 81,128 + Actor1920: t07 + Owner: Neutral + Location: 13,117 + Actor1921: t12 + Owner: Neutral + Location: 83,97 + Actor1923: t08 + Owner: Neutral + Location: 110,136 + Actor1925: t13 + Owner: Neutral + Location: 30,26 + Actor1927: t05 + Owner: Neutral + Location: 1,91 + Actor1932: t13 + Owner: Neutral + Location: 191,87 + Actor1933: t12 + Owner: Neutral + Location: 20,127 + Actor1937: t07 + Owner: Neutral + Location: 190,86 + Actor1943: t17 + Owner: Neutral + Location: 51,94 + Actor1945: t02 + Owner: Neutral + Location: 150,116 + Actor1947: t01.husk + Owner: Neutral + Location: 175,73 + Actor1948: t17 + Owner: Neutral + Location: 73,113 + Actor1949: t13.husk + Owner: Neutral + Location: 13,43 + Actor1950: t16 + Owner: Neutral + Location: 190,130 + Actor1955: t13 + Owner: Neutral + Location: 29,110 + Actor1960: t16 + Owner: Neutral + Location: 86,107 + Actor1962: t16 + Owner: Neutral + Location: 169,78 + Actor1963: t13 + Owner: Neutral + Location: 4,138 + Actor1964: t01 + Owner: Neutral + Location: 103,141 + Actor1965: t13 + Owner: Neutral + Location: 148,33 + Actor1970: t02.husk + Owner: Neutral + Location: 165,70 + Actor1973: t05 + Owner: Neutral + Location: 118,86 + Actor1976: t06 + Owner: Neutral + Location: 50,96 + Actor1977: t01 + Owner: Neutral + Location: 27,46 + Actor1978: t16.husk + Owner: Neutral + Location: 20,129 + Actor1980: t13 + Owner: Neutral + Location: 164,72 + Actor1984: t03 + Owner: Neutral + Location: 21,132 + Actor1986: t05 + Owner: Neutral + Location: 16,120 + Actor1987: t05 + Owner: Neutral + Location: 2,139 + Actor1990: t17 + Owner: Neutral + Location: 123,93 + Actor1992: t05 + Owner: Neutral + Location: 86,109 + Actor1994: t07 + Owner: Neutral + Location: 83,128 + Actor1995: t01 + Owner: Neutral + Location: 139,31 + Actor1997: t06 + Owner: Neutral + Location: 105,136 + Actor1999: t16 + Owner: Neutral + Location: 170,76 + Actor2003: t05 + Owner: Neutral + Location: 18,123 + Actor2005: t16 + Owner: Neutral + Location: 1,144 + Actor2006: t02 + Owner: Neutral + Location: 32,23 + Actor2008: t16 + Owner: Neutral + Location: 104,138 + Actor2014: t06 + Owner: Neutral + Location: 178,82 + Actor2015: t08 + Owner: Neutral + Location: 4,143 + Actor2019: t16 + Owner: Neutral + Location: 29,64 + Actor2023: t05 + Owner: Neutral + Location: 116,137 + Actor2024: t16.husk + Owner: Neutral + Location: 153,5 + Actor2029: t16 + Owner: Neutral + Location: 55,96 + Actor2030: t06 + Owner: Neutral + Location: 21,127 + Actor2031: t02 + Owner: Neutral + Location: 166,78 + Actor2032: t02 + Owner: Neutral + Location: 190,72 + Actor2036: t05 + Owner: Neutral + Location: 1,90 + Actor2040: t17.husk + Owner: Neutral + Location: 49,142 + Actor2042: t01 + Owner: Neutral + Location: 191,4 + Actor2044: t06 + Owner: Neutral + Location: 84,101 + Actor2045: t17 + Owner: Neutral + Location: 177,82 + Actor2049: t12 + Owner: Neutral + Location: 73,99 + Actor2051: t06 + Owner: Neutral + Location: 17,122 + Actor2054: t03 + Owner: Neutral + Location: 56,121 + Actor2055: t07 + Owner: Neutral + Location: 160,45 + Actor2058: t12 + Owner: Neutral + Location: 108,134 + Actor2059: t03 + Owner: Neutral + Location: 169,73 + Actor2061: t13 + Owner: Neutral + Location: 178,40 + Actor2062: t13 + Owner: Neutral + Location: 73,95 + Actor2063: t01 + Owner: Neutral + Location: 52,125 + Actor2065: t08 + Owner: Neutral + Location: 169,7 + Actor2066: t05 + Owner: Neutral + Location: 71,102 + Actor2067: t08 + Owner: Neutral + Location: 166,75 + Actor2068: t05 + Owner: Neutral + Location: 175,43 + Actor2071: t16 + Owner: Neutral + Location: 25,53 + Actor2073: t01.husk + Owner: Neutral + Location: 27,64 + Actor2077: t05 + Owner: Neutral + Location: 191,36 + Actor2078: t07 + Owner: Neutral + Location: 191,80 + Actor2080: t13 + Owner: Neutral + Location: 164,71 + Actor2081: t13 + Owner: Neutral + Location: 189,87 + Actor2083: t01 + Owner: Neutral + Location: 125,88 + Actor2085: t13 + Owner: Neutral + Location: 26,66 + Actor2086: t03 + Owner: Neutral + Location: 72,100 + Actor2090: t07 + Owner: Neutral + Location: 190,87 + Actor2091: t02 + Owner: Neutral + Location: 178,83 + Actor2095: t12 + Owner: Neutral + Location: 152,1 + Actor2097: t01 + Owner: Neutral + Location: 192,127 + Actor2098: t01 + Owner: Neutral + Location: 4,34 + Actor2099: t06 + Owner: Neutral + Location: 85,99 + Actor2102: t02 + Owner: Neutral + Location: 190,33 + Actor2103: t03 + Owner: Neutral + Location: 192,22 + Actor2106: t05 + Owner: Neutral + Location: 67,99 + Actor2107: t01 + Owner: Neutral + Location: 1,71 + Actor2108: t06 + Owner: Neutral + Location: 176,39 + Actor2109: t02 + Owner: Neutral + Location: 1,93 + Actor2117: t06 + Owner: Neutral + Location: 111,144 + Actor2119: t02 + Owner: Neutral + Location: 14,45 + Actor2121: t03 + Owner: Neutral + Location: 73,104 + Actor2123: t06 + Owner: Neutral + Location: 192,1 + Actor2125: t12 + Owner: Neutral + Location: 170,44 + Actor2126: t12 + Owner: Neutral + Location: 118,85 + Actor2128: t03 + Owner: Neutral + Location: 148,111 + Actor2132: t16 + Owner: Neutral + Location: 116,83 + Actor2134: t07 + Owner: Neutral + Location: 166,80 + Actor2136: t02 + Owner: Neutral + Location: 109,142 + Actor2138: t16 + Owner: Neutral + Location: 76,100 + Actor2140: t08 + Owner: Neutral + Location: 154,33 + Actor2143: t17 + Owner: Neutral + Location: 67,52 + Actor2146: t16 + Owner: Neutral + Location: 190,80 + Actor2150: t03 + Owner: Neutral + Location: 116,84 + Actor2151: t13 + Owner: Neutral + Location: 21,130 + Actor2152: t13 + Owner: Neutral + Location: 24,134 + Actor2155: t06 + Owner: Neutral + Location: 79,92 + Actor2157: t01.husk + Owner: Neutral + Location: 191,77 + Actor2159: t03 + Owner: Neutral + Location: 188,26 + Actor2161: t07 + Owner: Neutral + Location: 151,3 + Actor2163: t16 + Owner: Neutral + Location: 191,84 + Actor2165: t13 + Owner: Neutral + Location: 53,142 + Actor2166: t03 + Owner: Neutral + Location: 166,69 + Actor2170: t03 + Owner: Neutral + Location: 154,51 + Actor2174: t06.husk + Owner: Neutral + Location: 15,43 + Actor2176: t01 + Owner: Neutral + Location: 177,85 + Actor2179: t08 + Owner: Neutral + Location: 164,79 + Actor2181: t12 + Owner: Neutral + Location: 190,31 + Actor2184: t05 + Owner: Neutral + Location: 137,27 + Actor2185: t17 + Owner: Neutral + Location: 154,1 + Actor2186: t12 + Owner: Neutral + Location: 17,113 + Actor2189: t07 + Owner: Neutral + Location: 27,62 + Actor2190: t17 + Owner: Neutral + Location: 83,140 + Actor2194: t13 + Owner: Neutral + Location: 150,3 + Actor2195: t05 + Owner: Neutral + Location: 25,51 + Actor2196: t07 + Owner: Neutral + Location: 85,131 + Actor2201: t16 + Owner: Neutral + Location: 189,86 + Actor2205: t12.husk + Owner: Neutral + Location: 29,63 + Actor2206: t08 + Owner: Neutral + Location: 99,139 + Actor2208: t05.husk + Owner: Neutral + Location: 14,72 + Actor2209: t07 + Owner: Neutral + Location: 84,96 + Actor2214: t07 + Owner: Neutral + Location: 80,97 + Actor2217: t07 + Owner: Neutral + Location: 31,23 + Actor2218: t12 + Owner: Neutral + Location: 47,131 + Actor2223: t02 + Owner: Neutral + Location: 54,117 + Actor2229: t03 + Owner: Neutral + Location: 172,76 + Actor2231: t06 + Owner: Neutral + Location: 83,100 + Actor2232: t13 + Owner: Neutral + Location: 2,36 + Actor2233: t16 + Owner: Neutral + Location: 21,131 + Actor2235: t02 + Owner: Neutral + Location: 58,108 + Actor2239: t13 + Owner: Neutral + Location: 1,58 + Actor2240: t17 + Owner: Neutral + Location: 90,130 + Actor2241: t08 + Owner: Neutral + Location: 56,95 + Actor2244: t02.husk + Owner: Neutral + Location: 191,88 + Actor2245: t05 + Owner: Neutral + Location: 191,28 + Actor2246: t07 + Owner: Neutral + Location: 160,46 + Actor2250: t16 + Owner: Neutral + Location: 15,140 + Actor2251: t06 + Owner: Neutral + Location: 191,116 + Actor2252: t06 + Owner: Neutral + Location: 154,103 + Actor2255: t12 + Owner: Neutral + Location: 119,86 + Actor2258: t13 + Owner: Neutral + Location: 161,72 + Actor2259: t08 + Owner: Neutral + Location: 64,129 + Actor2261: t05 + Owner: Neutral + Location: 141,29 + Actor2262: t02.husk + Owner: Neutral + Location: 53,118 + Actor2264: t02 + Owner: Neutral + Location: 143,33 + Actor2268: t08.husk + Owner: Neutral + Location: 168,79 + Actor2270: t17 + Owner: Neutral + Location: 170,42 + Actor2272: t05 + Owner: Neutral + Location: 45,127 + Actor2273: t16 + Owner: Neutral + Location: 52,97 + Actor2274: t07 + Owner: Neutral + Location: 145,30 + Actor2280: t03 + Owner: Neutral + Location: 79,97 + Actor2283: t13 + Owner: Neutral + Location: 189,76 + Actor2284: t06 + Owner: Neutral + Location: 87,107 + Actor2285: t12 + Owner: Neutral + Location: 155,30 + Actor2286: t13 + Owner: Neutral + Location: 26,52 + Actor2287: t03 + Owner: Neutral + Location: 169,10 + Actor2288: t01 + Owner: Neutral + Location: 1,140 + Actor2289: t13 + Owner: Neutral + Location: 16,128 + Actor2293: t07 + Owner: Neutral + Location: 168,7 + Actor2294: t06 + Owner: Neutral + Location: 155,3 + Actor2295: t07 + Owner: Neutral + Location: 81,142 + Actor2299: t13 + Owner: Neutral + Location: 86,108 + Actor2302: t13 + Owner: Neutral + Location: 102,138 + Actor2303: t03 + Owner: Neutral + Location: 15,62 + Actor2312: t02 + Owner: Neutral + Location: 83,141 + Actor2313: t16.husk + Owner: Neutral + Location: 154,48 + Actor2318: t03 + Owner: Neutral + Location: 54,121 + Actor2320: t02 + Owner: Neutral + Location: 168,74 + Actor2328: t17 + Owner: Neutral + Location: 15,120 + Actor2330: t08.husk + Owner: Neutral + Location: 82,98 + Actor2332: t12 + Owner: Neutral + Location: 9,26 + Actor2334: t05 + Owner: Neutral + Location: 190,26 + Actor2337: t08.husk + Owner: Neutral + Location: 82,129 + Actor2339: t07.husk + Owner: Neutral + Location: 50,142 + Actor2340: t07 + Owner: Neutral + Location: 147,34 + Actor2342: t17 + Owner: Neutral + Location: 137,28 + Actor2343: t08 + Owner: Neutral + Location: 191,68 + Actor2344: t05 + Owner: Neutral + Location: 19,125 + Actor2345: t05.husk + Owner: Neutral + Location: 57,118 + Actor2348: t02 + Owner: Neutral + Location: 74,104 + Actor2350: t07 + Owner: Neutral + Location: 63,143 + Actor2351: t13.husk + Owner: Neutral + Location: 148,31 + Actor2352: t13 + Owner: Neutral + Location: 164,75 + Actor2357: t02 + Owner: Neutral + Location: 163,78 + Actor2360: t02 + Owner: Neutral + Location: 187,70 + Actor2361: t03 + Owner: Neutral + Location: 81,139 + Actor2366: t17 + Owner: Neutral + Location: 70,105 + Actor2373: t07 + Owner: Neutral + Location: 175,42 + Actor2375: t08 + Owner: Neutral + Location: 87,110 + Actor2376: t06 + Owner: Neutral + Location: 51,140 + Actor2382: t12 + Owner: Neutral + Location: 79,94 + Actor2384: t05 + Owner: Neutral + Location: 192,124 + Actor2387: t01 + Owner: Neutral + Location: 190,120 + Actor2390: t08 + Owner: Neutral + Location: 16,116 + Actor2394: t12 + Owner: Neutral + Location: 76,94 + Actor2396: t17 + Owner: Neutral + Location: 156,30 + Actor2397: t08 + Owner: Neutral + Location: 86,105 + Actor2398: t16 + Owner: Neutral + Location: 188,71 + Actor2399: t05 + Owner: Neutral + Location: 15,71 + Actor2400: t01 + Owner: Neutral + Location: 45,144 + Actor2402: t13 + Owner: Neutral + Location: 192,79 + Actor2404: t07 + Owner: Neutral + Location: 107,134 + Actor2406: t07 + Owner: Neutral + Location: 126,92 + Actor2409: t02 + Owner: Neutral + Location: 49,128 + Actor2416: t02 + Owner: Neutral + Location: 14,144 + Actor2424: t13 + Owner: Neutral + Location: 176,82 + Actor2426: t03 + Owner: Neutral + Location: 154,50 + Actor2428: t08 + Owner: Neutral + Location: 16,44 + Actor2429: t03 + Owner: Neutral + Location: 80,95 + Actor2434: t06 + Owner: Neutral + Location: 191,129 + Actor2435: t07 + Owner: Neutral + Location: 25,60 + Actor2436: t02 + Owner: Neutral + Location: 116,85 + Actor2438: t07 + Owner: Neutral + Location: 152,32 + Actor2439: t16.husk + Owner: Neutral + Location: 189,24 + Actor2441: t12 + Owner: Neutral + Location: 188,78 + Actor2442: t01 + Owner: Neutral + Location: 26,64 + Actor2444: t03 + Owner: Neutral + Location: 63,144 + Actor2447: t17.husk + Owner: Neutral + Location: 154,5 + Actor2450: t01 + Owner: Neutral + Location: 85,100 + Actor2451: t07 + Owner: Neutral + Location: 30,63 + Actor2457: t01.husk + Owner: Neutral + Location: 50,125 + Actor2458: t12 + Owner: Neutral + Location: 90,144 + Actor2462: t08 + Owner: Neutral + Location: 2,71 + Actor2463: t12 + Owner: Neutral + Location: 142,32 + Actor2464: t02 + Owner: Neutral + Location: 55,120 + Actor2468: t16.husk + Owner: Neutral + Location: 187,69 + Actor2472: t13 + Owner: Neutral + Location: 159,41 + Actor2473: t12 + Owner: Neutral + Location: 140,27 + Actor2474: t16.husk + Owner: Neutral + Location: 87,108 + Actor2476: t13 + Owner: Neutral + Location: 115,137 + Actor2478: t08.husk + Owner: Neutral + Location: 154,11 + Actor2480: t17 + Owner: Neutral + Location: 191,72 + Actor2481: t12 + Owner: Neutral + Location: 141,30 + Actor2482: t02 + Owner: Neutral + Location: 176,40 + Actor2483: t16.husk + Owner: Neutral + Location: 160,41 + Actor2484: t03 + Owner: Neutral + Location: 14,43 + Actor2488: t12 + Owner: Neutral + Location: 13,88 + Actor2496: t05 + Owner: Neutral + Location: 84,99 + Actor2497: t06 + Owner: Neutral + Location: 192,3 + Actor2498: t01 + Owner: Neutral + Location: 16,143 + Actor2499: t02 + Owner: Neutral + Location: 107,142 + Actor2500: t12 + Owner: Neutral + Location: 16,38 + Actor2501: t17 + Owner: Neutral + Location: 26,61 + Actor2504: t13 + Owner: Neutral + Location: 1,57 + Actor2505: t13 + Owner: Neutral + Location: 90,109 + Actor2508: t01 + Owner: Neutral + Location: 17,126 + Actor2510: t12 + Owner: Neutral + Location: 18,42 + Actor2511: t07.husk + Owner: Neutral + Location: 152,5 + Actor2513: t01 + Owner: Neutral + Location: 170,8 + Actor2514: t02 + Owner: Neutral + Location: 179,74 + Actor2515: t03 + Owner: Neutral + Location: 12,69 + Actor2516: t17 + Owner: Neutral + Location: 48,127 + Actor2517: t07.husk + Owner: Neutral + Location: 167,70 + Actor2518: t01 + Owner: Neutral + Location: 4,143 + Actor2519: t01 + Owner: Neutral + Location: 139,30 + Actor2520: t13 + Owner: Neutral + Location: 26,54 + Actor2521: t12 + Owner: Neutral + Location: 2,86 + Actor2522: t08 + Owner: Neutral + Location: 181,43 + Actor2523: t01 + Owner: Neutral + Location: 186,78 + Actor2524: t17 + Owner: Neutral + Location: 56,115 + Actor2529: t17 + Owner: Neutral + Location: 154,30 + Actor2530: t06.husk + Owner: Neutral + Location: 0,86 + Actor2535: t03 + Owner: Neutral + Location: 155,32 + Actor2536: t07 + Owner: Neutral + Location: 55,115 + Actor2537: t17 + Owner: Neutral + Location: 14,41 + Actor2538: t06 + Owner: Neutral + Location: 76,113 + Actor2540: t02 + Owner: Neutral + Location: 156,29 + Actor2543: t17 + Owner: Neutral + Location: 25,54 + Actor2545: t03 + Owner: Neutral + Location: 173,67 + Actor2546: t12 + Owner: Neutral + Location: 153,113 + Actor2549: t08 + Owner: Neutral + Location: 82,140 + Actor2550: t17 + Owner: Neutral + Location: 14,87 + Actor2551: t07 + Owner: Neutral + Location: 0,136 + Actor2553: t17 + Owner: Neutral + Location: 83,129 + Actor2555: t05.husk + Owner: Neutral + Location: 161,46 + Actor2556: t02 + Owner: Neutral + Location: 175,41 + Actor2557: t01 + Owner: Neutral + Location: 72,104 + Actor2558: t02.husk + Owner: Neutral + Location: 191,33 + Actor2563: t06 + Owner: Neutral + Location: 60,109 + Actor2564: t06 + Owner: Neutral + Location: 71,100 + Actor2565: t12 + Owner: Neutral + Location: 121,93 + Actor2566: t02 + Owner: Neutral + Location: 20,142 + Actor2567: t07 + Owner: Neutral + Location: 18,122 + Actor2570: t05 + Owner: Neutral + Location: 24,61 + Actor2571: t07 + Owner: Neutral + Location: 43,117 + Actor2572: t12 + Owner: Neutral + Location: 65,52 + Actor2574: t02 + Owner: Neutral + Location: 76,95 + Actor2577: t17 + Owner: Neutral + Location: 190,122 + Actor2578: t02 + Owner: Neutral + Location: 25,64 + Actor2580: t12.husk + Owner: Neutral + Location: 80,92 + Actor2582: t05 + Owner: Neutral + Location: 154,4 + Actor2586: t12.husk + Owner: Neutral + Location: 191,68 + Actor2588: t02 + Owner: Neutral + Location: 88,109 + Actor2589: t08 + Owner: Neutral + Location: 85,129 + Actor2590: t08 + Owner: Neutral + Location: 192,65 + Actor2591: t08.husk + Owner: Neutral + Location: 82,93 + Actor2593: t06 + Owner: Neutral + Location: 146,32 + Actor2594: t13 + Owner: Neutral + Location: 16,64 + Actor2595: t02 + Owner: Neutral + Location: 57,116 + Actor2596: t07 + Owner: Neutral + Location: 77,98 + Actor2597: t12 + Owner: Neutral + Location: 58,105 + Actor2600: t03 + Owner: Neutral + Location: 147,35 + Actor2601: t07 + Owner: Neutral + Location: 27,52 + Actor2603: t08 + Owner: Neutral + Location: 73,97 + Actor2604: t06 + Owner: Neutral + Location: 123,90 + Actor2605: t01 + Owner: Neutral + Location: 72,102 + Actor2607: t12 + Owner: Neutral + Location: 174,72 + Actor2609: t17.husk + Owner: Neutral + Location: 75,99 + Actor2612: t17.husk + Owner: Neutral + Location: 25,127 + Actor2613: t16 + Owner: Neutral + Location: 77,115 + Actor2615: t01 + Owner: Neutral + Location: 56,109 + Actor2617: t02 + Owner: Neutral + Location: 193,113 + Actor2621: t02 + Owner: Neutral + Location: 29,23 + Actor2623: t05 + Owner: Neutral + Location: 82,129 + Actor2625: t06 + Owner: Neutral + Location: 165,78 + Actor2627: t13 + Owner: Neutral + Location: 75,95 + Actor2631: t13 + Owner: Neutral + Location: 156,42 + Actor2632: t02 + Owner: Neutral + Location: 56,96 + Actor2636: t01 + Owner: Neutral + Location: 54,122 + Actor2640: t01.husk + Owner: Neutral + Location: 27,49 + Actor2642: t12 + Owner: Neutral + Location: 155,50 + Actor2645: t03 + Owner: Neutral + Location: 189,14 + Actor2647: t06 + Owner: Neutral + Location: 191,70 + Actor2648: t05 + Owner: Neutral + Location: 62,52 + Actor2649: t03 + Owner: Neutral + Location: 81,98 + Actor2651: t01 + Owner: Neutral + Location: 72,105 + Actor2658: t16.husk + Owner: Neutral + Location: 172,10 + Actor2659: t07.husk + Owner: Neutral + Location: 1,64 + Actor2660: t05 + Owner: Neutral + Location: 186,77 + Actor2661: t07.husk + Owner: Neutral + Location: 50,98 + Actor2663: t02 + Owner: Neutral + Location: 70,99 + Actor2664: t07 + Owner: Neutral + Location: 106,140 + Actor2665: t13 + Owner: Neutral + Location: 2,35 + Actor2670: t16 + Owner: Neutral + Location: 83,130 + Actor2671: t07 + Owner: Neutral + Location: 143,34 + Actor2672: t08 + Owner: Neutral + Location: 99,141 + Actor2673: t13 + Owner: Neutral + Location: 150,117 + Actor2676: t06 + Owner: Neutral + Location: 153,2 + Actor2677: t01 + Owner: Neutral + Location: 51,97 + Actor2678: t16 + Owner: Neutral + Location: 192,86 + Actor2680: t17 + Owner: Neutral + Location: 190,7 + Actor2683: t01.husk + Owner: Neutral + Location: 26,133 + Actor2684: t12 + Owner: Neutral + Location: 188,86 + Actor2690: t12 + Owner: Neutral + Location: 164,80 + Actor2691: t17 + Owner: Neutral + Location: 146,31 + Actor2692: t05 + Owner: Neutral + Location: 115,85 + Actor2693: t05 + Owner: Neutral + Location: 124,90 + Actor2694: t06 + Owner: Neutral + Location: 152,4 + Actor2701: t17 + Owner: Neutral + Location: 32,24 + Actor2702: t03 + Owner: Neutral + Location: 192,30 + Actor2705: t07 + Owner: Neutral + Location: 15,118 + Actor2706: t13 + Owner: Neutral + Location: 74,101 + Actor2707: t08 + Owner: Neutral + Location: 146,30 + Actor2712: t05 + Owner: Neutral + Location: 19,129 + Actor2714: t01.husk + Owner: Neutral + Location: 158,43 + Actor2718: t01 + Owner: Neutral + Location: 179,41 + Actor2722: t03 + Owner: Neutral + Location: 77,113 + Actor2724: t08 + Owner: Neutral + Location: 55,120 + Actor2725: t07 + Owner: Neutral + Location: 171,77 + Actor2727: t16 + Owner: Neutral + Location: 14,40 + Actor2728: t13 + Owner: Neutral + Location: 155,8 + Actor2731: t06.husk + Owner: Neutral + Location: 153,114 + Actor2732: t13 + Owner: Neutral + Location: 50,124 + Actor2736: t12.husk + Owner: Neutral + Location: 17,115 + Actor2738: t05 + Owner: Neutral + Location: 191,124 + Actor2739: t03 + Owner: Neutral + Location: 15,46 + Actor2740: t13 + Owner: Neutral + Location: 59,109 + Actor2742: t02 + Owner: Neutral + Location: 52,144 + Actor2746: t16.husk + Owner: Neutral + Location: 191,121 + Actor2753: t02 + Owner: Neutral + Location: 157,40 + Actor2754: t12.husk + Owner: Neutral + Location: 147,30 + Actor2755: t02 + Owner: Neutral + Location: 179,39 + Actor2756: t07.husk + Owner: Neutral + Location: 144,33 + Actor2759: t07 + Owner: Neutral + Location: 17,43 + Actor2762: t06 + Owner: Neutral + Location: 153,50 + Actor2763: t03 + Owner: Neutral + Location: 27,48 + Actor2766: t02 + Owner: Neutral + Location: 192,77 + Actor2767: t03 + Owner: Neutral + Location: 176,42 + Actor2768: t13 + Owner: Neutral + Location: 14,70 + Actor2770: t07 + Owner: Neutral + Location: 28,28 + Actor2771: t16 + Owner: Neutral + Location: 192,4 + Actor2773: t07 + Owner: Neutral + Location: 9,25 + Actor2776: t16 + Owner: Neutral + Location: 105,137 + Actor2777: t06 + Owner: Neutral + Location: 19,122 + Actor2779: t02 + Owner: Neutral + Location: 51,144 + Actor2780: t08.husk + Owner: Neutral + Location: 170,74 + Actor2781: t17 + Owner: Neutral + Location: 20,123 + Actor2784: t02 + Owner: Neutral + Location: 70,101 + Actor2786: t01 + Owner: Neutral + Location: 99,144 + Actor2789: t12.husk + Owner: Neutral + Location: 85,98 + Actor2794: t17 + Owner: Neutral + Location: 153,31 + Actor2795: t13 + Owner: Neutral + Location: 167,78 + Actor2796: t01 + Owner: Neutral + Location: 87,106 + Actor2798: t06 + Owner: Neutral + Location: 52,122 + Actor2801: t03 + Owner: Neutral + Location: 126,90 + Actor2802: t02 + Owner: Neutral + Location: 18,125 + Actor2809: t03 + Owner: Neutral + Location: 86,105 + Actor2812: t07 + Owner: Neutral + Location: 2,135 + Actor2814: t01.husk + Owner: Neutral + Location: 80,141 + Actor2815: t06 + Owner: Neutral + Location: 45,126 + Actor2816: t16 + Owner: Neutral + Location: 78,114 + Actor2819: t17 + Owner: Neutral + Location: 191,125 + Actor2820: t12.husk + Owner: Neutral + Location: 43,118 + Actor2821: t08 + Owner: Neutral + Location: 84,106 + Actor2822: t16.husk + Owner: Neutral + Location: 71,101 + Actor2823: t01 + Owner: Neutral + Location: 84,98 + Actor2824: t06 + Owner: Neutral + Location: 15,34 + Actor2829: t03.husk + Owner: Neutral + Location: 101,143 + Actor2830: t03 + Owner: Neutral + Location: 3,137 + Actor2831: t17 + Owner: Neutral + Location: 190,30 + Actor2834: t08 + Owner: Neutral + Location: 56,99 + Actor2836: t08.husk + Owner: Neutral + Location: 16,47 + Actor2838: t02 + Owner: Neutral + Location: 190,123 + Actor2839: t01 + Owner: Neutral + Location: 108,142 + Actor2840: t12 + Owner: Neutral + Location: 3,142 + Actor2841: t07 + Owner: Neutral + Location: 171,74 + Actor2843: t12 + Owner: Neutral + Location: 80,99 + Actor2847: t03 + Owner: Neutral + Location: 82,98 + Actor2848: t03 + Owner: Neutral + Location: 53,141 + Actor2853: t13 + Owner: Neutral + Location: 15,142 + Actor2854: t05 + Owner: Neutral + Location: 149,33 + Actor2859: t16 + Owner: Neutral + Location: 58,112 + Actor2860: t07 + Owner: Neutral + Location: 73,105 + Actor2866: t03 + Owner: Neutral + Location: 58,113 + Actor2871: t13 + Owner: Neutral + Location: 12,43 + Actor2877: t16.husk + Owner: Neutral + Location: 32,117 + Actor2882: t07 + Owner: Neutral + Location: 19,130 + Actor2884: t16 + Owner: Neutral + Location: 158,1 + Actor2887: t06 + Owner: Neutral + Location: 47,127 + Actor2888: t08 + Owner: Neutral + Location: 65,47 + Actor2893: t08 + Owner: Neutral + Location: 84,101 + Actor2894: t17 + Owner: Neutral + Location: 174,73 + Actor2900: t17 + Owner: Neutral + Location: 11,43 + Actor2901: t16 + Owner: Neutral + Location: 26,49 + Actor2904: t16 + Owner: Neutral + Location: 30,23 + Actor2906: t16 + Owner: Neutral + Location: 105,135 + Actor2911: t07 + Owner: Neutral + Location: 85,103 + Actor2913: t17 + Owner: Neutral + Location: 15,64 + Actor2914: t02 + Owner: Neutral + Location: 16,122 + Actor2916: t03 + Owner: Neutral + Location: 30,62 + Actor2917: t02 + Owner: Neutral + Location: 0,135 + Actor2921: t12 + Owner: Neutral + Location: 4,139 + Actor2923: t16 + Owner: Neutral + Location: 69,102 + Actor2924: t13 + Owner: Neutral + Location: 72,106 + Actor2927: t07.husk + Owner: Neutral + Location: 140,29 + Actor2928: t01 + Owner: Neutral + Location: 190,116 + Actor2932: t13 + Owner: Neutral + Location: 28,65 + Actor2933: t02 + Owner: Neutral + Location: 17,120 + Actor2935: t08 + Owner: Neutral + Location: 100,143 + Actor2936: t16 + Owner: Neutral + Location: 108,144 + Actor2941: t03 + Owner: Neutral + Location: 190,83 + Actor2942: t07 + Owner: Neutral + Location: 115,83 + Actor2951: t02 + Owner: Neutral + Location: 24,132 + Actor2952: t03 + Owner: Neutral + Location: 77,96 + Actor2953: t01 + Owner: Neutral + Location: 54,116 + Actor2956: t17 + Owner: Neutral + Location: 84,128 + Actor2957: t17 + Owner: Neutral + Location: 85,129 + Actor2959: t02.husk + Owner: Neutral + Location: 173,73 + Actor2961: t02 + Owner: Neutral + Location: 25,59 + Actor2965: t13 + Owner: Neutral + Location: 163,77 + Actor2968: t12 + Owner: Neutral + Location: 28,50 + Actor2969: t16 + Owner: Neutral + Location: 142,30 + Actor2974: t16 + Owner: Neutral + Location: 81,95 + Actor2976: t06 + Owner: Neutral + Location: 191,22 + Actor2978: t06 + Owner: Neutral + Location: 0,85 + Actor2983: t02 + Owner: Neutral + Location: 191,64 + Actor2984: t13 + Owner: Neutral + Location: 174,42 + Actor2985: t06 + Owner: Neutral + Location: 15,122 + Actor2990: t13 + Owner: Neutral + Location: 84,104 + Actor2991: t01 + Owner: Neutral + Location: 156,7 + Actor2992: t07 + Owner: Neutral + Location: 17,127 + Actor2993: t01 + Owner: Neutral + Location: 19,121 + Actor2994: t03 + Owner: Neutral + Location: 168,11 + Actor2996: t02 + Owner: Neutral + Location: 102,141 + Actor2997: t03 + Owner: Neutral + Location: 189,25 + Actor2999: t02 + Owner: Neutral + Location: 71,105 + Actor3000: t16 + Owner: Neutral + Location: 116,86 + Actor3003: t13 + Owner: Neutral + Location: 52,121 + Actor3004: t12 + Owner: Neutral + Location: 190,36 + Actor3006: t12 + Owner: Neutral + Location: 17,128 + Actor3008: t16 + Owner: Neutral + Location: 63,53 + Actor3010: t02 + Owner: Neutral + Location: 30,61 + Actor3011: t16 + Owner: Neutral + Location: 139,28 + Actor3013: t05 + Owner: Neutral + Location: 64,45 + Actor3016: t16 + Owner: Neutral + Location: 22,134 + Actor3017: t02 + Owner: Neutral + Location: 175,69 + Actor3018: t01 + Owner: Neutral + Location: 72,97 + Actor3020: t17 + Owner: Neutral + Location: 17,124 + Actor3022: t05 + Owner: Neutral + Location: 62,143 + Actor3023: t16 + Owner: Neutral + Location: 86,101 + Actor3024: t06 + Owner: Neutral + Location: 83,99 + Actor3026: t01 + Owner: Neutral + Location: 171,71 + Actor3027: t06 + Owner: Neutral + Location: 27,65 + Actor3029: t16 + Owner: Neutral + Location: 69,105 + Actor3032: t16 + Owner: Neutral + Location: 111,135 + Actor3033: t03 + Owner: Neutral + Location: 173,74 + Actor3035: t12 + Owner: Neutral + Location: 70,100 + Actor3036: t12.husk + Owner: Neutral + Location: 190,11 + Actor3037: t05 + Owner: Neutral + Location: 59,117 + Actor3039: t08.husk + Owner: Neutral + Location: 89,131 + Actor3044: t13 + Owner: Neutral + Location: 16,142 + Actor3046: t03 + Owner: Neutral + Location: 80,93 + Actor3052: t05.husk + Owner: Neutral + Location: 177,69 + Actor3055: t17 + Owner: Neutral + Location: 177,38 + Actor3057: t06 + Owner: Neutral + Location: 171,3 + Actor3058: t17 + Owner: Neutral + Location: 193,73 + Actor3059: t05 + Owner: Neutral + Location: 188,82 + Actor3060: t02 + Owner: Neutral + Location: 60,98 + Actor3063: t03 + Owner: Neutral + Location: 154,6 + Actor3064: t03 + Owner: Neutral + Location: 122,92 + Actor3067: t01 + Owner: Neutral + Location: 148,32 + Actor3068: t17 + Owner: Neutral + Location: 189,75 + Actor3069: t07 + Owner: Neutral + Location: 177,40 + Actor3070: t06.husk + Owner: Neutral + Location: 43,114 + Actor3073: t07 + Owner: Neutral + Location: 191,40 + Actor3074: t08 + Owner: Neutral + Location: 24,127 + Actor3075: t03 + Owner: Neutral + Location: 158,40 + Actor3078: t07 + Owner: Neutral + Location: 169,45 + Actor3080: t12 + Owner: Neutral + Location: 53,143 + Actor3084: t16 + Owner: Neutral + Location: 162,73 + Actor3085: t13 + Owner: Neutral + Location: 17,70 + Actor3090: t13 + Owner: Neutral + Location: 13,41 + Actor3093: t08 + Owner: Neutral + Location: 157,2 + Actor3095: t06 + Owner: Neutral + Location: 109,135 + Actor3098: t02 + Owner: Neutral + Location: 71,98 + Actor3099: t17 + Owner: Neutral + Location: 123,91 + Actor3101: t06 + Owner: Neutral + Location: 26,128 + Actor3104: t03 + Owner: Neutral + Location: 14,44 + Actor3108: t12 + Owner: Neutral + Location: 122,93 + Actor3110: t05 + Owner: Neutral + Location: 25,134 + Actor3114: t05 + Owner: Neutral + Location: 2,87 + Actor3117: t17 + Owner: Neutral + Location: 119,84 + Actor3119: t17.husk + Owner: Neutral + Location: 122,89 + Actor3121: t03 + Owner: Neutral + Location: 18,144 + Actor3123: t17 + Owner: Neutral + Location: 190,131 + Actor3124: t05 + Owner: Neutral + Location: 138,29 + Actor3129: t17 + Owner: Neutral + Location: 190,5 + Actor3131: t12 + Owner: Neutral + Location: 14,42 + Actor3133: t01 + Owner: Neutral + Location: 145,31 + Actor3135: t16 + Owner: Neutral + Location: 186,82 + Actor3136: t08 + Owner: Neutral + Location: 189,69 + Actor3137: t08 + Owner: Neutral + Location: 55,123 + Actor3139: t03 + Owner: Neutral + Location: 4,140 + Actor3140: t06 + Owner: Neutral + Location: 63,54 + Actor3142: t12 + Owner: Neutral + Location: 0,140 + Actor3147: t05 + Owner: Neutral + Location: 159,43 + Actor3148: t03 + Owner: Neutral + Location: 34,53 + Actor3149: t13 + Owner: Neutral + Location: 29,61 + Actor3152: t01 + Owner: Neutral + Location: 114,86 + Actor3154: t05 + Owner: Neutral + Location: 120,87 + Actor3155: t16 + Owner: Neutral + Location: 56,118 + Actor3156: t03 + Owner: Neutral + Location: 191,32 + Actor3158: t12 + Owner: Neutral + Location: 51,139 + Actor3159: t02 + Owner: Neutral + Location: 27,66 + Actor3160: t13 + Owner: Neutral + Location: 50,97 + Actor3162: t07.husk + Owner: Neutral + Location: 153,42 + Actor3163: t16 + Owner: Neutral + Location: 167,11 + Actor3165: t07 + Owner: Neutral + Location: 78,98 + Actor3167: t17 + Owner: Neutral + Location: 180,40 + Actor3168: t05 + Owner: Neutral + Location: 123,89 + Actor3172: t01 + Owner: Neutral + Location: 51,126 + Actor3178: t07 + Owner: Neutral + Location: 192,116 + Actor3180: t05 + Owner: Neutral + Location: 24,131 + Actor3181: t01 + Owner: Neutral + Location: 22,132 + Actor3184: t17 + Owner: Neutral + Location: 117,87 + Actor3186: t08 + Owner: Neutral + Location: 66,54 + Actor3187: t16 + Owner: Neutral + Location: 3,139 + Actor3190: t07 + Owner: Neutral + Location: 73,97 + Actor3191: t07 + Owner: Neutral + Location: 82,142 + Actor3192: t08 + Owner: Neutral + Location: 117,86 + Actor3193: t13.husk + Owner: Neutral + Location: 155,48 + Actor3194: t07 + Owner: Neutral + Location: 190,39 + Actor3195: t06 + Owner: Neutral + Location: 14,122 + Actor3199: t07 + Owner: Neutral + Location: 146,30 + Actor3200: t02 + Owner: Neutral + Location: 191,112 + Actor3202: t16 + Owner: Neutral + Location: 138,31 + Actor3205: t08 + Owner: Neutral + Location: 176,74 + Actor3208: t17 + Owner: Neutral + Location: 0,97 + Actor3210: t17 + Owner: Neutral + Location: 16,114 + Actor3213: t02 + Owner: Neutral + Location: 84,102 + Actor3214: t16 + Owner: Neutral + Location: 13,40 + Actor3215: t16 + Owner: Neutral + Location: 190,2 + Actor3217: t13 + Owner: Neutral + Location: 80,126 + Actor3219: t12 + Owner: Neutral + Location: 188,75 + Actor3220: t06 + Owner: Neutral + Location: 163,76 + Actor3222: t17 + Owner: Neutral + Location: 164,79 + Actor3223: t07 + Owner: Neutral + Location: 171,76 + Actor3225: t16 + Owner: Neutral + Location: 89,129 + Actor3226: t03 + Owner: Neutral + Location: 156,3 + Actor3228: t05 + Owner: Neutral + Location: 100,140 + Actor3229: t03 + Owner: Neutral + Location: 163,72 + Actor3230: t06 + Owner: Neutral + Location: 164,70 + Actor3231: t02 + Owner: Neutral + Location: 15,38 + Actor3232: t02 + Owner: Neutral + Location: 176,77 + Actor3233: t02 + Owner: Neutral + Location: 187,78 + Actor3234: t08 + Owner: Neutral + Location: 156,6 + Actor3235: t02 + Owner: Neutral + Location: 191,123 + Actor3236: t17 + Owner: Neutral + Location: 123,88 + Actor3239: t06 + Owner: Neutral + Location: 80,115 + Actor3243: t08.husk + Owner: Neutral + Location: 110,137 + Actor3248: t03 + Owner: Neutral + Location: 159,42 + Actor3250: t01 + Owner: Neutral + Location: 89,131 + Actor3251: t01 + Owner: Neutral + Location: 2,142 + Actor3252: t12 + Owner: Neutral + Location: 74,106 + Actor3253: t17 + Owner: Neutral + Location: 97,130 + Actor3254: t13 + Owner: Neutral + Location: 169,44 + Actor3257: t05.husk + Owner: Neutral + Location: 162,72 + Actor3258: t01 + Owner: Neutral + Location: 191,66 + Actor3261: t12 + Owner: Neutral + Location: 28,64 + Actor3262: t05 + Owner: Neutral + Location: 46,130 + Actor3264: t07 + Owner: Neutral + Location: 165,80 + Actor3265: t05 + Owner: Neutral + Location: 51,93 + Actor3268: t13 + Owner: Neutral + Location: 16,40 + Actor3269: t17.husk + Owner: Neutral + Location: 82,140 + Actor3272: t17 + Owner: Neutral + Location: 177,42 + Actor3273: t13 + Owner: Neutral + Location: 189,38 + Actor3274: t02 + Owner: Neutral + Location: 5,142 + Actor3275: t01 + Owner: Neutral + Location: 116,87 + Actor3276: t17 + Owner: Neutral + Location: 21,133 + Actor3278: t03.husk + Owner: Neutral + Location: 151,2 + Actor3279: t02 + Owner: Neutral + Location: 175,75 + Actor3281: t05 + Owner: Neutral + Location: 82,127 + Actor3283: t03 + Owner: Neutral + Location: 190,129 + Actor3287: t16 + Owner: Neutral + Location: 88,105 + Actor3288: t03 + Owner: Neutral + Location: 191,111 + Actor3290: t03 + Owner: Neutral + Location: 190,78 + Actor3292: t12 + Owner: Neutral + Location: 50,141 + Actor3293: t07 + Owner: Neutral + Location: 189,0 + Actor3294: t06 + Owner: Neutral + Location: 2,33 + Actor3295: t03 + Owner: Neutral + Location: 171,73 + Actor3298: t05 + Owner: Neutral + Location: 190,68 + Actor3300: t05 + Owner: Neutral + Location: 2,144 + Actor3302: t02 + Owner: Neutral + Location: 51,124 + Actor3303: t16 + Owner: Neutral + Location: 172,75 + Actor3306: t17.husk + Owner: Neutral + Location: 59,131 + Actor3307: t08 + Owner: Neutral + Location: 16,127 + Actor3309: t13 + Owner: Neutral + Location: 151,113 + Actor3312: t13 + Owner: Neutral + Location: 191,27 + Actor3314: t08 + Owner: Neutral + Location: 190,26 + Actor3316: t13 + Owner: Neutral + Location: 55,114 + Actor3317: t13 + Owner: Neutral + Location: 145,32 + Actor3319: t02 + Owner: Neutral + Location: 174,70 + Actor3320: t01.husk + Owner: Neutral + Location: 193,79 + Actor3322: t08 + Owner: Neutral + Location: 160,74 + Actor3325: t12 + Owner: Neutral + Location: 109,143 + Actor3327: t13 + Owner: Neutral + Location: 59,113 + Actor3328: t07 + Owner: Neutral + Location: 50,140 + Actor3329: t17 + Owner: Neutral + Location: 153,3 + Actor3330: t01 + Owner: Neutral + Location: 16,70 + Actor3332: t03 + Owner: Neutral + Location: 190,69 + Actor3334: t03 + Owner: Neutral + Location: 78,115 + Actor3336: t01 + Owner: Neutral + Location: 190,70 + Actor3337: t17 + Owner: Neutral + Location: 72,103 + Actor3338: t03 + Owner: Neutral + Location: 190,4 + Actor3344: t05 + Owner: Neutral + Location: 24,62 + Actor3347: t01 + Owner: Neutral + Location: 86,100 + Actor3348: t16 + Owner: Neutral + Location: 155,27 + Actor3349: t07 + Owner: Neutral + Location: 171,72 + Actor3352: t12 + Owner: Neutral + Location: 154,2 + Actor3355: t12 + Owner: Neutral + Location: 19,116 + Actor3357: t05 + Owner: Neutral + Location: 191,25 + Actor3358: t08 + Owner: Neutral + Location: 192,0 + Actor3359: t01 + Owner: Neutral + Location: 28,60 + Actor3363: t16.husk + Owner: Neutral + Location: 191,82 + Actor3364: t16 + Owner: Neutral + Location: 17,121 + Actor3365: t05 + Owner: Neutral + Location: 74,95 + Actor3366: t17 + Owner: Neutral + Location: 79,95 + Actor3369: t06 + Owner: Neutral + Location: 46,94 + Actor3371: t17 + Owner: Neutral + Location: 76,97 + Actor3372: t01 + Owner: Neutral + Location: 102,137 + Actor3373: t08 + Owner: Neutral + Location: 79,141 + Actor3375: t01 + Owner: Neutral + Location: 187,82 + Actor3394: t06 + Owner: Neutral + Location: 115,86 + Actor3400: t07 + Owner: Neutral + Location: 104,141 + Actor5: t01 + Owner: Neutral + Location: 110,59 + Actor6: t03 + Owner: Neutral + Location: 111,59 + Actor8: t01 + Owner: Neutral + Location: 119,58 + Actor9: t12 + Owner: Neutral + Location: 120,58 + Actor10: t02 + Owner: Neutral + Location: 119,57 + Actor12: t05 + Owner: Neutral + Location: 118,57 + Actor18: t08 + Owner: Neutral + Location: 114,58 + Actor21: t02 + Owner: Neutral + Location: 121,58 + Actor25: t17 + Owner: Neutral + Location: 121,54 + Actor29: t16 + Owner: Neutral + Location: 118,59 + Actor33: t16 + Owner: Neutral + Location: 113,59 + Actor35: t02 + Owner: Neutral + Location: 120,56 + Actor36: t02 + Owner: Neutral + Location: 119,56 + Actor39: t07.husk + Owner: Neutral + Location: 120,55 + Actor40: t02 + Owner: Neutral + Location: 115,58 + Actor41: t13 + Owner: Neutral + Location: 119,55 + Actor42: t07 + Owner: Neutral + Location: 118,56 + Actor47: t02 + Owner: Neutral + Location: 118,55 + Actor51: t03 + Owner: Neutral + Location: 113,58 + Actor52: t08 + Owner: Neutral + Location: 115,60 + Actor62: t13 + Owner: Neutral + Location: 121,55 + Actor64: t03 + Owner: Neutral + Location: 119,54 + Actor66: t12 + Owner: Neutral + Location: 121,56 + Actor73: t06 + Owner: Neutral + Location: 120,57 + Actor74: t01 + Owner: Neutral + Location: 121,53 + Actor78: t06 + Owner: Neutral + Location: 112,59 + Actor81: t13 + Owner: Neutral + Location: 120,59 + Actor82: t07 + Owner: Neutral + Location: 113,57 + Actor86: t07 + Owner: Neutral + Location: 120,54 + Actor89: t17.husk + Owner: Neutral + Location: 118,58 + Actor92: t03 + Owner: Neutral + Location: 116,59 + Actor93: t17 + Owner: Neutral + Location: 114,59 + Actor98: t06 + Owner: Neutral + Location: 114,58 + Actor100: tc02 + Owner: Neutral + Location: 121,59 + Actor101: t13 + Owner: Neutral + Location: 115,57 + Actor104: tc05.husk + Owner: Neutral + Location: 117,60 + Actor107: t13 + Owner: Neutral + Location: 121,57 + Actor114: t06 + Owner: Neutral + Location: 117,59 + Actor117: t13 + Owner: Neutral + Location: 122,56 + Actor118: t17 + Owner: Neutral + Location: 122,53 + Actor119: t01 + Owner: Neutral + Location: 127,59 + Actor120: t17 + Owner: Neutral + Location: 123,55 + Actor121: t06 + Owner: Neutral + Location: 122,57 + Actor123: t16 + Owner: Neutral + Location: 123,52 + Actor125: t01 + Owner: Neutral + Location: 125,53 + Actor128: t07 + Owner: Neutral + Location: 124,52 + Actor130: t03 + Owner: Neutral + Location: 125,58 + Actor132: t02 + Owner: Neutral + Location: 125,54 + Actor136: t01 + Owner: Neutral + Location: 122,54 + Actor137: t03 + Owner: Neutral + Location: 127,58 + Actor138: t16 + Owner: Neutral + Location: 126,59 + Actor143: t12 + Owner: Neutral + Location: 124,53 + Actor144: t05.husk + Owner: Neutral + Location: 123,59 + Actor145: t02 + Owner: Neutral + Location: 122,55 + Actor147: t02 + Owner: Neutral + Location: 125,55 + Actor148: t05 + Owner: Neutral + Location: 128,59 + Actor149: t02 + Owner: Neutral + Location: 126,55 + Actor151: t13 + Owner: Neutral + Location: 126,58 + Actor155: t12.husk + Owner: Neutral + Location: 123,53 + Actor156: t08 + Owner: Neutral + Location: 123,55 + Actor161: t03 + Owner: Neutral + Location: 127,56 + Actor162: t03 + Owner: Neutral + Location: 126,54 + Actor164: t07 + Owner: Neutral + Location: 127,57 + Actor166: t01.husk + Owner: Neutral + Location: 124,55 + Actor169: t15.husk + Owner: Neutral + Location: 123,56 + Actor172: t14 + Owner: Neutral + Location: 123,57 + Actor175: t11 + Owner: Neutral + Location: 123,58 + Actor176: t01 + Owner: Neutral + Location: 124,54 + Actor177: tc03 + Owner: Neutral + Location: 125,57 + Actor179: t08 + Owner: Neutral + Location: 110,65 + Actor180: t12 + Owner: Neutral + Location: 110,62 + Actor184: t02 + Owner: Neutral + Location: 110,61 + Actor189: t06.husk + Owner: Neutral + Location: 110,60 + Actor190: tc02 + Owner: Neutral + Location: 110,63 + Actor191: t03 + Owner: Neutral + Location: 111,64 + Actor196: t01 + Owner: Neutral + Location: 115,63 + Actor197: t03 + Owner: Neutral + Location: 113,62 + Actor198: t02 + Owner: Neutral + Location: 115,61 + Actor199: t05 + Owner: Neutral + Location: 118,62 + Actor201: t08 + Owner: Neutral + Location: 112,64 + Actor206: t01 + Owner: Neutral + Location: 118,63 + Actor209: t12.husk + Owner: Neutral + Location: 117,62 + Actor213: t17 + Owner: Neutral + Location: 113,60 + Actor218: t16 + Owner: Neutral + Location: 117,63 + Actor220: t08 + Owner: Neutral + Location: 121,61 + Actor222: t05 + Owner: Neutral + Location: 120,61 + Actor224: t17 + Owner: Neutral + Location: 111,60 + Actor225: t16 + Owner: Neutral + Location: 114,61 + Actor226: t03 + Owner: Neutral + Location: 120,60 + Actor227: t13.husk + Owner: Neutral + Location: 117,61 + Actor228: t11 + Owner: Neutral + Location: 114,60 + Actor229: t01 + Owner: Neutral + Location: 123,60 + Actor231: t05.husk + Owner: Neutral + Location: 122,60 + Actor234: t03 + Owner: Neutral + Location: 128,60 + Actor237: t05 + Owner: Neutral + Location: 127,60 + Actor240: t12 + Owner: Neutral + Location: 129,63 + Actor241: t03 + Owner: Neutral + Location: 129,62 + Actor246: t01.husk + Owner: Neutral + Location: 130,63 + Actor260: t13 + Owner: Neutral + Location: 129,61 + Actor261: t16 + Owner: Neutral + Location: 127,61 + Actor263: t05 + Owner: Neutral + Location: 117,73 + Actor271: t16 + Owner: Neutral + Location: 119,73 + Actor275: t16 + Owner: Neutral + Location: 117,74 + Actor276: t14.husk + Owner: Neutral + Location: 116,72 + Actor280: t14 + Owner: Neutral + Location: 115,73 + Actor284: t13 + Owner: Neutral + Location: 132,74 + Actor285: t16 + Owner: Neutral + Location: 132,78 + Actor287: t06 + Owner: Neutral + Location: 128,78 + Actor290: t07 + Owner: Neutral + Location: 129,77 + Actor292: t12 + Owner: Neutral + Location: 129,78 + Actor293: t02 + Owner: Neutral + Location: 132,77 + Actor297: t15 + Owner: Neutral + Location: 130,76 + Actor298: t10 + Owner: Neutral + Location: 130,77 + Actor7: t06 + Owner: Neutral + Location: 58,25 + Actor30: t06 + Owner: Neutral + Location: 61,29 + Actor68: t05 + Owner: Neutral + Location: 55,28 + Actor80: t06 + Owner: Neutral + Location: 59,28 + Actor102: t08 + Owner: Neutral + Location: 57,28 + Actor140: t13.husk + Owner: Neutral + Location: 60,27 + Actor158: t01.husk + Owner: Neutral + Location: 62,27 + Actor173: t16 + Owner: Neutral + Location: 56,28 + Actor178: t07 + Owner: Neutral + Location: 60,28 + Actor300: t06 + Owner: Neutral + Location: 61,28 + Actor304: t08 + Owner: Neutral + Location: 55,30 + Actor309: t05.husk + Owner: Neutral + Location: 54,28 + Actor310: t03.husk + Owner: Neutral + Location: 56,27 + Actor311: t03 + Owner: Neutral + Location: 58,28 + Actor314: t16 + Owner: Neutral + Location: 63,27 + Actor315: t12 + Owner: Neutral + Location: 60,26 + Actor318: t05 + Owner: Neutral + Location: 59,26 + Actor320: t02 + Owner: Neutral + Location: 57,29 + Actor325: t13 + Owner: Neutral + Location: 58,26 + Actor330: t07 + Owner: Neutral + Location: 63,28 + Actor331: t13 + Owner: Neutral + Location: 57,28 + Actor335: t13 + Owner: Neutral + Location: 61,27 + Actor336: t01 + Owner: Neutral + Location: 56,29 + Actor338: t17 + Owner: Neutral + Location: 61,26 + Actor339: t02 + Owner: Neutral + Location: 54,29 + Actor341: t01 + Owner: Neutral + Location: 55,27 + Actor344: tc01 + Owner: Neutral + Location: 62,29 + Actor345: t10.husk + Owner: Neutral + Location: 59,25 + Actor346: t15 + Owner: Neutral + Location: 58,27 + Actor349: t15 + Owner: Neutral + Location: 56,26 + Actor351: t11.husk + Owner: Neutral + Location: 58,29 + Actor355: tc02 + Owner: Neutral + Location: 59,30 + Actor356: t02 + Owner: Neutral + Location: 64,28 + Actor359: t03 + Owner: Neutral + Location: 54,36 + Actor360: t03 + Owner: Neutral + Location: 62,35 + Actor363: t03 + Owner: Neutral + Location: 59,32 + Actor366: t12 + Owner: Neutral + Location: 61,32 + Actor367: t03 + Owner: Neutral + Location: 62,33 + Actor368: t02 + Owner: Neutral + Location: 55,35 + Actor369: t08 + Owner: Neutral + Location: 53,34 + Actor370: t13 + Owner: Neutral + Location: 54,34 + Actor371: t02 + Owner: Neutral + Location: 57,31 + Actor372: t03 + Owner: Neutral + Location: 62,34 + Actor377: t17 + Owner: Neutral + Location: 61,35 + Actor380: t12 + Owner: Neutral + Location: 55,33 + Actor381: t01 + Owner: Neutral + Location: 55,34 + Actor391: t02 + Owner: Neutral + Location: 54,35 + Actor392: t02 + Owner: Neutral + Location: 58,32 + Actor393: t02.husk + Owner: Neutral + Location: 55,36 + Actor400: t03 + Owner: Neutral + Location: 58,37 + Actor401: t16 + Owner: Neutral + Location: 55,32 + Actor402: t16 + Owner: Neutral + Location: 60,36 + Actor408: t02 + Owner: Neutral + Location: 54,37 + Actor409: t13 + Owner: Neutral + Location: 59,36 + Actor423: t03 + Owner: Neutral + Location: 53,34 + Actor429: t07 + Owner: Neutral + Location: 58,36 + Actor432: t07 + Owner: Neutral + Location: 60,32 + Actor435: t13 + Owner: Neutral + Location: 62,30 + Actor441: t01 + Owner: Neutral + Location: 53,32 + Actor442: t13 + Owner: Neutral + Location: 54,31 + Actor447: t03 + Owner: Neutral + Location: 58,34 + Actor451: t12 + Owner: Neutral + Location: 60,35 + Actor454: t06 + Owner: Neutral + Location: 59,33 + Actor455: t13 + Owner: Neutral + Location: 58,35 + Actor456: t02 + Owner: Neutral + Location: 53,36 + Actor458: t07 + Owner: Neutral + Location: 55,37 + Actor459: t01 + Owner: Neutral + Location: 59,37 + Actor461: t08.husk + Owner: Neutral + Location: 59,32 + Actor462: t01 + Owner: Neutral + Location: 53,35 + Actor466: t08 + Owner: Neutral + Location: 54,33 + Actor467: t12.husk + Owner: Neutral + Location: 58,33 + Actor468: t12 + Owner: Neutral + Location: 54,33 + Actor470: t16 + Owner: Neutral + Location: 61,30 + Actor476: t16 + Owner: Neutral + Location: 55,31 + Actor477: t12 + Owner: Neutral + Location: 58,31 + Actor478: t11.husk + Owner: Neutral + Location: 56,33 + Actor483: tc01 + Owner: Neutral + Location: 56,32 + Actor484: tc01 + Owner: Neutral + Location: 60,31 + Actor485: tc03 + Owner: Neutral + Location: 56,35 + Actor486: tc04 + Owner: Neutral + Location: 56,30 + Actor487: t12.husk + Owner: Neutral + Location: 59,34 + Actor490: tc04 + Owner: Neutral + Location: 53,30 + Actor491: tc03.husk + Owner: Neutral + Location: 60,34 + Actor2053: t16 + Owner: Neutral + Location: 155,1 + Actor11: t07 + Owner: Neutral + Location: 168,64 + Actor13: t10 + Owner: Neutral + Location: 169,65 + Actor15: t13 + Owner: Neutral + Location: 165,67 + Actor24: t13 + Owner: Neutral + Location: 167,66 + Actor48: t01 + Owner: Neutral + Location: 166,66 + Actor50: tc02 + Owner: Neutral + Location: 167,68 + Actor59: t14 + Owner: Neutral + Location: 169,67 + Actor77: t02 + Owner: Neutral + Location: 171,65 + Actor85: t13 + Owner: Neutral + Location: 174,66 + Actor90: t15 + Owner: Neutral + Location: 162,68 + Actor14: t05 + Owner: Neutral + Location: 132,15 + Actor71: t13 + Owner: Neutral + Location: 130,14 + Actor94: t17 + Owner: Neutral + Location: 135,17 + Actor95: t17 + Owner: Neutral + Location: 134,16 + Actor97: t16 + Owner: Neutral + Location: 133,18 + Actor111: t05 + Owner: Neutral + Location: 132,17 + Actor113: t08 + Owner: Neutral + Location: 135,17 + Actor127: t17 + Owner: Neutral + Location: 133,17 + Actor139: t08.husk + Owner: Neutral + Location: 132,17 + Actor163: t07 + Owner: Neutral + Location: 133,16 + Actor181: t12 + Owner: Neutral + Location: 131,16 + Actor182: t03 + Owner: Neutral + Location: 137,16 + Actor193: t13 + Owner: Neutral + Location: 134,18 + Actor212: t05 + Owner: Neutral + Location: 130,13 + Actor214: t07 + Owner: Neutral + Location: 136,16 + Actor230: t07 + Owner: Neutral + Location: 136,14 + Actor238: t16 + Owner: Neutral + Location: 130,16 + Actor248: t05 + Owner: Neutral + Location: 131,15 + Actor250: t05 + Owner: Neutral + Location: 135,18 + Actor254: t03 + Owner: Neutral + Location: 130,15 + Actor255: t03 + Owner: Neutral + Location: 134,17 + Actor256: tc01 + Owner: Neutral + Location: 136,17 + Actor257: t14 + Owner: Neutral + Location: 137,15 + Actor259: t15 + Owner: Neutral + Location: 136,18 + Actor264: tc02 + Owner: Neutral + Location: 137,19 + Actor266: t16 + Owner: Neutral + Location: 139,17 + Actor268: t08.husk + Owner: Neutral + Location: 139,19 + Actor281: t02 + Owner: Neutral + Location: 143,17 + Actor282: t17 + Owner: Neutral + Location: 140,18 + Actor288: t06 + Owner: Neutral + Location: 138,17 + Actor291: t13 + Owner: Neutral + Location: 141,18 + Actor296: t08 + Owner: Neutral + Location: 142,18 + Actor302: t15 + Owner: Neutral + Location: 142,18 + Actor308: t16 + Owner: Neutral + Location: 138,16 + Actor316: t02 + Owner: Neutral + Location: 136,19 + Actor322: t07 + Owner: Neutral + Location: 135,19 + Actor323: t01 + Owner: Neutral + Location: 139,19 + Actor332: t13 + Owner: Neutral + Location: 140,20 + Actor343: t08 + Owner: Neutral + Location: 141,21 + Actor352: t16 + Owner: Neutral + Location: 140,19 + Actor353: t13 + Owner: Neutral + Location: 141,19 + Actor358: t14 + Owner: Neutral + Location: 138,20 + Actor0: t05 + Owner: Neutral + Location: 67,64 + Actor16: t06 + Owner: Neutral + Location: 66,65 + Actor44: t07 + Owner: Neutral + Location: 68,65 + Actor109: t07 + Owner: Neutral + Location: 69,63 + Actor205: t08 + Owner: Neutral + Location: 68,63 + Actor211: t12 + Owner: Neutral + Location: 69,62 + Actor306: t06 + Owner: Neutral + Location: 69,65 + Actor329: t03 + Owner: Neutral + Location: 70,60 + Actor333: t12 + Owner: Neutral + Location: 70,64 + Actor361: t02 + Owner: Neutral + Location: 69,64 + Actor382: t13.husk + Owner: Neutral + Location: 68,63 + Actor395: t08 + Owner: Neutral + Location: 68,65 + Actor397: t07 + Owner: Neutral + Location: 67,65 + Actor398: t12 + Owner: Neutral + Location: 71,61 + Actor411: t17 + Owner: Neutral + Location: 70,65 + Actor416: t11 + Owner: Neutral + Location: 69,61 + Actor418: tc03 + Owner: Neutral + Location: 70,63 + Actor424: t13 + Owner: Neutral + Location: 70,67 + Actor444: t06 + Owner: Neutral + Location: 67,66 + Actor450: t05 + Owner: Neutral + Location: 70,68 + Actor452: t12 + Owner: Neutral + Location: 68,66 + Actor453: t13 + Owner: Neutral + Location: 70,66 + Actor457: t08 + Owner: Neutral + Location: 66,67 + Actor471: t08 + Owner: Neutral + Location: 68,68 + Actor492: t01 + Owner: Neutral + Location: 69,67 + Actor495: t03 + Owner: Neutral + Location: 69,66 + Actor497: t05 + Owner: Neutral + Location: 80,75 + Actor498: t01.husk + Owner: Neutral + Location: 84,75 + Actor501: t07 + Owner: Neutral + Location: 82,69 + Actor504: t08 + Owner: Neutral + Location: 81,75 + Actor505: t08 + Owner: Neutral + Location: 80,71 + Actor506: t17 + Owner: Neutral + Location: 82,71 + Actor511: t06 + Owner: Neutral + Location: 80,76 + Actor513: t06 + Owner: Neutral + Location: 82,73 + Actor516: t16 + Owner: Neutral + Location: 81,70 + Actor517: t06 + Owner: Neutral + Location: 82,68 + Actor518: t06 + Owner: Neutral + Location: 81,69 + Actor520: t12 + Owner: Neutral + Location: 80,74 + Actor523: t03 + Owner: Neutral + Location: 81,71 + Actor524: t03 + Owner: Neutral + Location: 82,70 + Actor525: t06 + Owner: Neutral + Location: 81,68 + Actor526: t07 + Owner: Neutral + Location: 81,75 + Actor527: t17 + Owner: Neutral + Location: 82,74 + Actor528: t05 + Owner: Neutral + Location: 80,71 + Actor529: t12 + Owner: Neutral + Location: 83,73 + Actor530: t16 + Owner: Neutral + Location: 79,76 + Actor532: t05 + Owner: Neutral + Location: 82,72 + Actor533: tc01 + Owner: Neutral + Location: 83,74 + Actor534: t11.husk + Owner: Neutral + Location: 81,76 + Actor535: tc03 + Owner: Neutral + Location: 80,73 + Actor542: t06 + Owner: Neutral + Location: 84,76 + Actor543: t01 + Owner: Neutral + Location: 86,69 + Actor545: t08 + Owner: Neutral + Location: 87,74 + Actor546: t03 + Owner: Neutral + Location: 85,73 + Actor548: t12 + Owner: Neutral + Location: 85,69 + Actor549: t03 + Owner: Neutral + Location: 86,73 + Actor553: t13 + Owner: Neutral + Location: 86,68 + Actor560: t17 + Owner: Neutral + Location: 85,67 + Actor561: t16 + Owner: Neutral + Location: 88,73 + Actor564: t07 + Owner: Neutral + Location: 85,76 + Actor565: t12 + Owner: Neutral + Location: 88,71 + Actor566: t07 + Owner: Neutral + Location: 86,71 + Actor567: t08 + Owner: Neutral + Location: 89,73 + Actor568: t01 + Owner: Neutral + Location: 87,72 + Actor569: t03 + Owner: Neutral + Location: 86,70 + Actor571: t02 + Owner: Neutral + Location: 85,66 + Actor576: t12 + Owner: Neutral + Location: 88,72 + Actor578: t01 + Owner: Neutral + Location: 85,70 + Actor579: t06 + Owner: Neutral + Location: 85,68 + Actor580: t08 + Owner: Neutral + Location: 86,73 + Actor581: t17 + Owner: Neutral + Location: 89,74 + Actor582: t01 + Owner: Neutral + Location: 85,71 + Actor583: t12 + Owner: Neutral + Location: 86,76 + Actor584: t16 + Owner: Neutral + Location: 87,69 + Actor585: t17 + Owner: Neutral + Location: 87,68 + Actor587: t05 + Owner: Neutral + Location: 87,71 + Actor588: t02.husk + Owner: Neutral + Location: 87,74 + Actor594: t12 + Owner: Neutral + Location: 85,75 + Actor595: t03 + Owner: Neutral + Location: 85,72 + Actor596: t14 + Owner: Neutral + Location: 85,74 + Actor597: tc01 + Owner: Neutral + Location: 87,70 + Actor600: tc05 + Owner: Neutral + Location: 86,75 + Actor601: t01 + Owner: Neutral + Location: 89,75 + Actor603: t08 + Owner: Neutral + Location: 83,79 + Actor604: t03 + Owner: Neutral + Location: 80,77 + Actor605: t02 + Owner: Neutral + Location: 83,77 + Actor606: t17 + Owner: Neutral + Location: 82,77 + Actor611: t15 + Owner: Neutral + Location: 79,78 + Actor612: t12 + Owner: Neutral + Location: 88,77 + Actor615: t13 + Owner: Neutral + Location: 89,77 + Actor616: t06 + Owner: Neutral + Location: 89,78 + Actor619: t02 + Owner: Neutral + Location: 88,78 + Actor620: t06 + Owner: Neutral + Location: 87,77 + Actor115: t10 + Owner: Neutral + Location: 64,89 + Actor202: t07 + Owner: Neutral + Location: 61,87 + Actor465: t13 + Owner: Neutral + Location: 59,85 + Actor602: tc02 + Owner: Neutral + Location: 57,87 + Actor608: tc05 + Owner: Neutral + Location: 56,84 + Actor622: t17 + Owner: Neutral + Location: 63,87 + Actor626: t12 + Owner: Neutral + Location: 54,85 + Actor628: t02 + Owner: Neutral + Location: 62,86 + Actor634: t05 + Owner: Neutral + Location: 53,84 + Actor635: tc04 + Owner: Neutral + Location: 118,36 + Actor639: tc02 + Owner: Neutral + Location: 116,37 + Actor640: tc05 + Owner: Neutral + Location: 118,38 + Actor641: t03 + Owner: Neutral + Location: 121,36 + Actor643: t10 + Owner: Neutral + Location: 115,40 + Actor645: t16 + Owner: Neutral + Location: 116,39 + Actor646: tc01 + Owner: Neutral + Location: 121,37 + Actor647: t06 + Owner: Neutral + Location: 122,34 + Actor1968: split2 + Owner: Neutral + Location: 147,25 + Actor1972: split2 + Owner: Neutral + Location: 66,21 + Actor1974: split2 + Owner: Neutral + Location: 34,32 + Actor1975: split2 + Owner: Neutral + Location: 33,67 + Actor1979: split2 + Owner: Neutral + Location: 38,64 + Actor1981: split2 + Owner: Neutral + Location: 130,98 + Actor1982: split2 + Owner: Neutral + Location: 133,94 + Actor1983: split2 + Owner: Neutral + Location: 135,123 + Actor1985: split2 + Owner: Neutral + Location: 130,122 + Actor1991: split2 + Owner: Neutral + Location: 59,139 + Actor1993: split2 + Owner: Neutral + Location: 182,110 + Actor1996: split2 + Owner: Neutral + Location: 185,103 + Actor1998: split2 + Owner: Neutral + Location: 170,27 + Actor2000: split2 + Owner: Neutral + Location: 134,62 + Actor2001: split2 + Owner: Neutral + Location: 139,61 + Actor2002: swal + Owner: MaleficScrin + Location: 138,91 + Actor2004: swal + Owner: MaleficScrin + Location: 138,92 + Actor2007: swal + Owner: MaleficScrin + Location: 139,91 + Actor2009: swal + Owner: MaleficScrin + Location: 139,92 + Actor2010: swal + Owner: MaleficScrin + Location: 140,91 + Actor2011: swal + Owner: MaleficScrin + Location: 140,92 + Actor2012: swal + Owner: MaleficScrin + Location: 141,91 + Actor2013: swal + Owner: MaleficScrin + Location: 141,92 + Actor2016: swal + Owner: MaleficScrin + Location: 146,91 + Actor2017: swal + Owner: MaleficScrin + Location: 146,92 + Actor2018: swal + Owner: MaleficScrin + Location: 147,91 + Actor2020: swal + Owner: MaleficScrin + Location: 147,92 + Actor2021: swal + Owner: MaleficScrin + Location: 148,91 + Actor2022: swal + Owner: MaleficScrin + Location: 148,92 + Actor2025: swal + Owner: MaleficScrin + Location: 149,91 + Actor2026: swal + Owner: MaleficScrin + Location: 149,92 + Actor2027: swal + Owner: MaleficScrin + Location: 149,93 + Actor2028: swal + Owner: MaleficScrin + Location: 150,92 + Actor2034: swal + Owner: MaleficScrin + Location: 150,93 + Actor2035: swal + Owner: MaleficScrin + Location: 151,93 + Actor2037: swal + Owner: MaleficScrin + Location: 150,94 + Actor2038: swal + Owner: MaleficScrin + Location: 151,94 + Actor2039: swal + Owner: MaleficScrin + Location: 152,93 + Actor2041: swal + Owner: MaleficScrin + Location: 154,93 + Actor2043: swal + Owner: MaleficScrin + Location: 153,93 + Actor2046: swal + Owner: MaleficScrin + Location: 155,93 + Actor2047: swal + Owner: MaleficScrin + Location: 155,94 + Actor2048: swal + Owner: MaleficScrin + Location: 155,95 + Actor2050: swal + Owner: MaleficScrin + Location: 156,96 + Actor2052: swal + Owner: MaleficScrin + Location: 156,95 + Actor2056: swal + Owner: MaleficScrin + Location: 155,96 + Actor2057: swal + Owner: MaleficScrin + Location: 156,97 + Actor2060: swal + Owner: MaleficScrin + Location: 157,97 + Actor2064: swal + Owner: MaleficScrin + Location: 157,99 + Actor2069: swal + Owner: MaleficScrin + Location: 157,98 + Actor2070: swal + Owner: MaleficScrin + Location: 158,99 + Actor2072: swal + Owner: MaleficScrin + Location: 159,99 + Actor2074: swal + Owner: MaleficScrin + Location: 159,100 + Actor2075: swal + Owner: MaleficScrin + Location: 160,100 + Actor2076: swal + Owner: MaleficScrin + Location: 160,99 + Actor2079: swal + Owner: MaleficScrin + Location: 122,102 + Actor2082: swal + Owner: MaleficScrin + Location: 122,103 + Actor2084: swal + Owner: MaleficScrin + Location: 123,103 + Actor2087: swal + Owner: MaleficScrin + Location: 123,102 + Actor2088: swal + Owner: MaleficScrin + Location: 122,107 + Actor2089: swal + Owner: MaleficScrin + Location: 122,108 + Actor2092: swal + Owner: MaleficScrin + Location: 123,108 + Actor2093: swal + Owner: MaleficScrin + Location: 123,107 + Actor2094: swal + Owner: MaleficScrin + Location: 124,108 + Actor2096: swal + Owner: MaleficScrin + Location: 123,109 + Actor2100: swal + Owner: MaleficScrin + Location: 124,109 + Actor2101: swal + Owner: MaleficScrin + Location: 125,109 + Actor2104: swal + Owner: MaleficScrin + Location: 125,110 + Actor2105: swal + Owner: MaleficScrin + Location: 126,110 + Actor2110: swal + Owner: MaleficScrin + Location: 126,109 + Actor2111: swal + Owner: MaleficScrin + Location: 105,109 + Actor2112: swal + Owner: MaleficScrin + Location: 105,110 + Actor2113: swal + Owner: MaleficScrin + Location: 106,110 + Actor2114: swal + Owner: MaleficScrin + Location: 105,111 + Actor2115: swal + Owner: MaleficScrin + Location: 106,111 + Actor2116: swal + Owner: MaleficScrin + Location: 106,109 + Actor2118: swal + Owner: MaleficScrin + Location: 107,110 + Actor2120: swal + Owner: MaleficScrin + Location: 107,109 + Actor2122: swal + Owner: MaleficScrin + Location: 108,109 + Actor2124: swal + Owner: MaleficScrin + Location: 110,109 + Actor2127: swal + Owner: MaleficScrin + Location: 109,109 + Actor2129: swal + Owner: MaleficScrin + Location: 111,109 + Actor2130: swal + Owner: MaleficScrin + Location: 111,110 + Actor2131: swal + Owner: MaleficScrin + Location: 110,110 + Actor2133: swal + Owner: MaleficScrin + Location: 121,108 + Actor2135: swal + Owner: MaleficScrin + Location: 120,108 + Actor2137: swal + Owner: MaleficScrin + Location: 119,108 + Actor2139: swal + Owner: MaleficScrin + Location: 117,108 + Actor2141: swal + Owner: MaleficScrin + Location: 118,108 + Actor2142: swal + Owner: MaleficScrin + Location: 117,109 + Actor2144: swal + Owner: MaleficScrin + Location: 118,109 + Actor2145: swal + Owner: MaleficScrin + Location: 142,123 + Actor2147: swal + Owner: MaleficScrin + Location: 142,124 + Actor2148: swal + Owner: MaleficScrin + Location: 143,124 + Actor2149: swal + Owner: MaleficScrin + Location: 143,123 + Actor2153: swal + Owner: MaleficScrin + Location: 144,124 + Actor2154: swal + Owner: MaleficScrin + Location: 145,124 + Actor2156: swal + Owner: MaleficScrin + Location: 145,123 + Actor2158: swal + Owner: MaleficScrin + Location: 144,123 + Actor2160: swal + Owner: MaleficScrin + Location: 151,121 + Actor2162: swal + Owner: MaleficScrin + Location: 151,120 + Actor2164: swal + Owner: MaleficScrin + Location: 152,121 + Actor2167: swal + Owner: MaleficScrin + Location: 152,120 + Actor2168: swal + Owner: MaleficScrin + Location: 153,120 + Actor2169: swal + Owner: MaleficScrin + Location: 153,119 + Actor2171: swal + Owner: MaleficScrin + Location: 154,119 + Actor2172: swal + Owner: MaleficScrin + Location: 154,120 + Actor2173: swal + Owner: MaleficScrin + Location: 154,118 + Actor2175: swal + Owner: MaleficScrin + Location: 155,119 + Actor2177: swal + Owner: MaleficScrin + Location: 155,118 + Actor2178: swal + Owner: MaleficScrin + Location: 155,117 + Actor2180: swal + Owner: MaleficScrin + Location: 156,117 + Actor2182: swal + Owner: MaleficScrin + Location: 156,118 + Actor2183: swal + Owner: MaleficScrin + Location: 156,116 + Actor2187: swal + Owner: MaleficScrin + Location: 156,115 + Actor2188: swal + Owner: MaleficScrin + Location: 157,115 + Actor2191: swal + Owner: MaleficScrin + Location: 157,116 + Actor2192: swal + Owner: MaleficScrin + Location: 156,114 + Actor2193: swal + Owner: MaleficScrin + Location: 157,114 + Actor2198: swal + Owner: MaleficScrin + Location: 159,101 + Actor2199: swal + Owner: MaleficScrin + Location: 159,102 + Actor2200: swal + Owner: MaleficScrin + Location: 158,102 + Actor2202: swal + Owner: MaleficScrin + Location: 158,103 + Actor2203: swal + Owner: MaleficScrin + Location: 157,103 + Actor2204: swal + Owner: MaleficScrin + Location: 157,104 + Actor2207: swal + Owner: MaleficScrin + Location: 156,104 + Actor2210: swal + Owner: MaleficScrin + Location: 156,105 + Actor2211: swal + Owner: MaleficScrin + Location: 156,106 + Actor2212: swal + Owner: MaleficScrin + Location: 156,107 + Actor2213: swal + Owner: MaleficScrin + Location: 156,109 + Actor2215: swal + Owner: MaleficScrin + Location: 156,108 + Actor2216: swal + Owner: MaleficScrin + Location: 156,110 + Actor2219: swal + Owner: MaleficScrin + Location: 156,111 + Actor2220: swal + Owner: MaleficScrin + Location: 156,112 + Actor2221: swal + Owner: MaleficScrin + Location: 156,113 + Actor2222: swal + Owner: MaleficScrin + Location: 114,120 + Actor2224: swal + Owner: MaleficScrin + Location: 114,119 + Actor2225: swal + Owner: MaleficScrin + Location: 115,120 + Actor2226: swal + Owner: MaleficScrin + Location: 115,119 + Actor2227: swal + Owner: MaleficScrin + Location: 120,119 + Actor2228: swal + Owner: MaleficScrin + Location: 120,120 + Actor2230: swal + Owner: MaleficScrin + Location: 121,120 + Actor2234: swal + Owner: MaleficScrin + Location: 121,119 + Actor2236: swal + Owner: MaleficScrin + Location: 123,119 + Actor2237: swal + Owner: MaleficScrin + Location: 122,119 + Actor2238: swal + Owner: MaleficScrin + Location: 122,118 + Actor2242: swal + Owner: MaleficScrin + Location: 123,118 + Actor2243: swal + Owner: MaleficScrin + Location: 113,118 + Actor2247: swal + Owner: MaleficScrin + Location: 114,118 + Actor2248: swal + Owner: MaleficScrin + Location: 113,117 + Actor2249: swal + Owner: MaleficScrin + Location: 114,117 + Actor2253: swal + Owner: MaleficScrin + Location: 112,118 + Actor2254: swal + Owner: MaleficScrin + Location: 111,119 + Actor2256: swal + Owner: MaleficScrin + Location: 111,118 + Actor2257: swal + Owner: MaleficScrin + Location: 110,119 + Actor2260: swal + Owner: MaleficScrin + Location: 110,118 + Actor2263: swal + Owner: MaleficScrin + Location: 177,117 + Actor2265: swal + Owner: MaleficScrin + Location: 176,117 + Actor2266: swal + Owner: MaleficScrin + Location: 174,117 + Actor2267: swal + Owner: MaleficScrin + Location: 172,117 + Actor2269: swal + Owner: MaleficScrin + Location: 171,117 + Actor2271: swal + Owner: MaleficScrin + Location: 171,122 + Actor2275: swal + Owner: MaleficScrin + Location: 171,120 + Actor2276: swal + Owner: MaleficScrin + Location: 171,118 + Actor2277: swal + Owner: MaleficScrin + Location: 171,121 + Actor2278: swal + Owner: MaleficScrin + Location: 171,119 + Actor2279: swal + Owner: MaleficScrin + Location: 173,117 + Actor2281: swal + Owner: MaleficScrin + Location: 175,117 + Actor2290: swal + Owner: MaleficScrin + Location: 178,117 + Actor2291: swal + Owner: MaleficScrin + Location: 178,118 + Actor2292: swal + Owner: MaleficScrin + Location: 177,118 + Actor2296: swal + Owner: MaleficScrin + Location: 178,116 + Actor2298: swal + Owner: MaleficScrin + Location: 179,117 + Actor2300: swal + Owner: MaleficScrin + Location: 179,116 + Actor2297: swal + Owner: MaleficScrin + Location: 184,116 + Actor2301: swal + Owner: MaleficScrin + Location: 185,117 + Actor2304: swal + Owner: MaleficScrin + Location: 184,117 + Actor2305: swal + Owner: MaleficScrin + Location: 185,116 + Actor2306: swal + Owner: MaleficScrin + Location: 186,117 + Actor2307: swal + Owner: MaleficScrin + Location: 186,118 + Actor2308: swal + Owner: MaleficScrin + Location: 185,118 + Actor2309: swal + Owner: MaleficScrin + Location: 187,117 + Actor2310: swal + Owner: MaleficScrin + Location: 188,117 + Actor2311: swal + Owner: MaleficScrin + Location: 189,117 + Actor2314: swal + Owner: MaleficScrin + Location: 189,118 + Actor2315: swal + Owner: MaleficScrin + Location: 189,119 + Actor2316: swal + Owner: MaleficScrin + Location: 189,120 + Actor2317: swal + Owner: MaleficScrin + Location: 189,121 + Actor2319: swal + Owner: MaleficScrin + Location: 189,122 + Actor2321: swal + Owner: MaleficScrin + Location: 189,123 + Actor2322: swal + Owner: MaleficScrin + Location: 189,125 + Actor2323: swal + Owner: MaleficScrin + Location: 189,124 + Actor2197: swal + Owner: MaleficScrin + Location: 171,123 + Actor2324: swal + Owner: MaleficScrin + Location: 171,124 + Actor2325: swal + Owner: MaleficScrin + Location: 170,123 + Actor2326: swal + Owner: MaleficScrin + Location: 170,124 + Actor2327: swal + Owner: MaleficScrin + Location: 170,130 + Actor2329: swal + Owner: MaleficScrin + Location: 170,131 + Actor2331: swal + Owner: MaleficScrin + Location: 171,130 + Actor2333: swal + Owner: MaleficScrin + Location: 171,131 + Actor2335: swal + Owner: MaleficScrin + Location: 171,132 + Actor2336: swal + Owner: MaleficScrin + Location: 172,131 + Actor2338: swal + Owner: MaleficScrin + Location: 172,132 + Actor2370: swal + Owner: MaleficScrin + Location: 189,126 + Actor2371: swal + Owner: MaleficScrin + Location: 189,127 + Actor2372: swal + Owner: MaleficScrin + Location: 189,128 + Actor2374: swal + Owner: MaleficScrin + Location: 189,129 + Actor2378: swal + Owner: MaleficScrin + Location: 189,130 + Actor2379: swal + Owner: MaleficScrin + Location: 189,131 + Actor2380: swal + Owner: MaleficScrin + Location: 189,132 + Actor2381: swal + Owner: MaleficScrin + Location: 189,134 + Actor2383: swal + Owner: MaleficScrin + Location: 189,135 + Actor2385: swal + Owner: MaleficScrin + Location: 189,136 + Actor2386: swal + Owner: MaleficScrin + Location: 189,133 + Actor2365: swal + Owner: MaleficScrin + Location: 37,103 + Actor2368: swal + Owner: MaleficScrin + Location: 37,102 + Actor2393: swal + Owner: MaleficScrin + Location: 38,103 + Actor2395: swal + Owner: MaleficScrin + Location: 38,102 + Actor2401: swal + Owner: MaleficScrin + Location: 35,102 + Actor2403: swal + Owner: MaleficScrin + Location: 35,101 + Actor2405: swal + Owner: MaleficScrin + Location: 36,102 + Actor2407: swal + Owner: MaleficScrin + Location: 36,101 + Actor2408: swal + Owner: MaleficScrin + Location: 34,101 + Actor2411: swal + Owner: MaleficScrin + Location: 33,101 + Actor2413: swal + Owner: MaleficScrin + Location: 33,100 + Actor2414: swal + Owner: MaleficScrin + Location: 34,100 + Actor2410: swal + Owner: MaleficScrin + Location: 32,100 + Actor2412: swal + Owner: MaleficScrin + Location: 31,100 + Actor2415: swal + Owner: MaleficScrin + Location: 31,99 + Actor2417: swal + Owner: MaleficScrin + Location: 32,99 + Actor2418: swal + Owner: MaleficScrin + Location: 30,99 + Actor2419: swal + Owner: MaleficScrin + Location: 29,99 + Actor2420: swal + Owner: MaleficScrin + Location: 29,98 + Actor2421: swal + Owner: MaleficScrin + Location: 30,98 + Actor2422: swal + Owner: MaleficScrin + Location: 25,96 + Actor2423: swal + Owner: MaleficScrin + Location: 25,95 + Actor2425: swal + Owner: MaleficScrin + Location: 26,95 + Actor2427: swal + Owner: MaleficScrin + Location: 26,96 + Actor2430: swal + Owner: MaleficScrin + Location: 24,95 + Actor2431: swal + Owner: MaleficScrin + Location: 23,95 + Actor2432: swal + Owner: MaleficScrin + Location: 23,94 + Actor2433: swal + Owner: MaleficScrin + Location: 24,94 + Actor2437: swal + Owner: MaleficScrin + Location: 22,94 + Actor2440: swal + Owner: MaleficScrin + Location: 21,94 + Actor2443: swal + Owner: MaleficScrin + Location: 21,93 + Actor2445: swal + Owner: MaleficScrin + Location: 22,93 + Actor2446: swal + Owner: MaleficScrin + Location: 20,93 + Actor2448: swal + Owner: MaleficScrin + Location: 19,93 + Actor2449: swal + Owner: MaleficScrin + Location: 19,92 + Actor2452: swal + Owner: MaleficScrin + Location: 20,92 + Actor2453: swal + Owner: MaleficScrin + Location: 18,92 + Actor2454: swal + Owner: MaleficScrin + Location: 17,92 + Actor2455: swal + Owner: MaleficScrin + Location: 16,92 + Actor2456: swal + Owner: MaleficScrin + Location: 16,93 + Actor2459: swal + Owner: MaleficScrin + Location: 15,93 + Actor2460: swal + Owner: MaleficScrin + Location: 15,92 + Actor2461: swal + Owner: MaleficScrin + Location: 15,94 + Actor2465: swal + Owner: MaleficScrin + Location: 15,95 + Actor2466: swal + Owner: MaleficScrin + Location: 15,96 + Actor2467: swal + Owner: MaleficScrin + Location: 14,96 + Actor2469: swal + Owner: MaleficScrin + Location: 12,96 + Actor2470: swal + Owner: MaleficScrin + Location: 13,96 + Actor2471: swal + Owner: MaleficScrin + Location: 12,97 + Actor2475: swal + Owner: MaleficScrin + Location: 11,97 + Actor2477: swal + Owner: MaleficScrin + Location: 11,96 + Actor2479: swal + Owner: MaleficScrin + Location: 7,100 + Actor2485: swal + Owner: MaleficScrin + Location: 7,99 + Actor2486: swal + Owner: MaleficScrin + Location: 6,99 + Actor2489: swal + Owner: MaleficScrin + Location: 6,100 + Actor2490: swal + Owner: MaleficScrin + Location: 5,99 + Actor2491: swal + Owner: MaleficScrin + Location: 5,100 + Actor2492: swal + Owner: MaleficScrin + Location: 5,101 + Actor2493: swal + Owner: MaleficScrin + Location: 5,102 + Actor2494: swal + Owner: MaleficScrin + Location: 5,103 + Actor2502: swal + Owner: MaleficScrin + Location: 6,102 + Actor2503: swal + Owner: MaleficScrin + Location: 6,103 + Actor2495: swal + Owner: MaleficScrin + Location: 7,109 + Actor2506: swal + Owner: MaleficScrin + Location: 7,110 + Actor2507: swal + Owner: MaleficScrin + Location: 8,110 + Actor2509: swal + Owner: MaleficScrin + Location: 8,109 + Actor2512: swal + Owner: MaleficScrin + Location: 9,110 + Actor2525: swal + Owner: MaleficScrin + Location: 9,111 + Actor2526: swal + Owner: MaleficScrin + Location: 9,112 + Actor2528: swal + Owner: MaleficScrin + Location: 9,113 + Actor2531: swal + Owner: MaleficScrin + Location: 10,113 + Actor2533: swal + Owner: MaleficScrin + Location: 10,114 + Actor2534: swal + Owner: MaleficScrin + Location: 9,114 + Actor2541: swal + Owner: MaleficScrin + Location: 13,114 + Actor2544: swal + Owner: MaleficScrin + Location: 13,115 + Actor2547: swal + Owner: MaleficScrin + Location: 15,114 + Actor2548: swal + Owner: MaleficScrin + Location: 14,114 + Actor2552: swal + Owner: MaleficScrin + Location: 15,115 + Actor2554: swal + Owner: MaleficScrin + Location: 14,115 + Actor2559: swal + Owner: MaleficScrin + Location: 27,134 + Actor2560: swal + Owner: MaleficScrin + Location: 27,135 + Actor2561: swal + Owner: MaleficScrin + Location: 27,136 + Actor2562: swal + Owner: MaleficScrin + Location: 28,136 + Actor2568: swal + Owner: MaleficScrin + Location: 28,135 + Actor2569: swal + Owner: MaleficScrin + Location: 28,134 + Actor2573: swal + Owner: MaleficScrin + Location: 33,133 + Actor2575: swal + Owner: MaleficScrin + Location: 34,133 + Actor2579: swal + Owner: MaleficScrin + Location: 36,133 + Actor2581: swal + Owner: MaleficScrin + Location: 35,133 + Actor2583: swal + Owner: MaleficScrin + Location: 36,132 + Actor2584: swal + Owner: MaleficScrin + Location: 35,132 + Actor2585: swal + Owner: MaleficScrin + Location: 33,134 + Actor2587: swal + Owner: MaleficScrin + Location: 34,134 + Actor2592: swal + Owner: MaleficScrin + Location: 27,137 + Actor2598: swal + Owner: MaleficScrin + Location: 27,138 + Actor2599: swal + Owner: MaleficScrin + Location: 28,138 + Actor2602: swal + Owner: MaleficScrin + Location: 27,139 + Actor2606: swal + Owner: MaleficScrin + Location: 28,139 + Actor2608: swal + Owner: MaleficScrin + Location: 29,139 + Actor2610: swal + Owner: MaleficScrin + Location: 29,140 + Actor2611: swal + Owner: MaleficScrin + Location: 28,140 + Actor2614: swal + Owner: MaleficScrin + Location: 36,139 + Actor2616: swal + Owner: MaleficScrin + Location: 36,140 + Actor2618: swal + Owner: MaleficScrin + Location: 37,139 + Actor2619: swal + Owner: MaleficScrin + Location: 37,140 + Actor2620: swal + Owner: MaleficScrin + Location: 37,138 + Actor2622: swal + Owner: MaleficScrin + Location: 38,139 + Actor2624: swal + Owner: MaleficScrin + Location: 38,138 + Actor2626: swal + Owner: MaleficScrin + Location: 37,132 + Actor2628: swal + Owner: MaleficScrin + Location: 38,132 + Actor2629: swal + Owner: MaleficScrin + Location: 39,132 + Actor2630: swal + Owner: MaleficScrin + Location: 39,133 + Actor2633: swal + Owner: MaleficScrin + Location: 40,134 + Actor2634: swal + Owner: MaleficScrin + Location: 40,133 + Actor2635: swal + Owner: MaleficScrin + Location: 41,134 + Actor2637: swal + Owner: MaleficScrin + Location: 41,135 + Actor2638: swal + Owner: MaleficScrin + Location: 41,136 + Actor2639: swal + Owner: MaleficScrin + Location: 41,137 + Actor2641: swal + Owner: MaleficScrin + Location: 39,138 + Actor2643: swal + Owner: MaleficScrin + Location: 40,138 + Actor2644: swal + Owner: MaleficScrin + Location: 41,138 + Actor2646: swal + Owner: MaleficScrin + Location: 39,130 + Actor2650: swal + Owner: MaleficScrin + Location: 39,131 + Actor2652: swal + Owner: MaleficScrin + Location: 40,131 + Actor2653: swal + Owner: MaleficScrin + Location: 40,130 + Actor2654: swal + Owner: MaleficScrin + Location: 41,129 + Actor2655: swal + Owner: MaleficScrin + Location: 40,129 + Actor2656: swal + Owner: MaleficScrin + Location: 41,130 + Actor2662: swal + Owner: MaleficScrin + Location: 41,128 + Actor2666: swal + Owner: MaleficScrin + Location: 42,129 + Actor2667: swal + Owner: MaleficScrin + Location: 42,128 + Actor2668: swal + Owner: MaleficScrin + Location: 42,126 + Actor2669: swal + Owner: MaleficScrin + Location: 42,127 + Actor2674: swal + Owner: MaleficScrin + Location: 43,128 + Actor2675: swal + Owner: MaleficScrin + Location: 43,127 + Actor2679: swal + Owner: MaleficScrin + Location: 43,126 + Actor2681: swal + Owner: MaleficScrin + Location: 44,127 + Actor2682: swal + Owner: MaleficScrin + Location: 44,126 + Actor2685: swal + Owner: MaleficScrin + Location: 43,125 + Actor2686: swal + Owner: MaleficScrin + Location: 44,125 + Actor2687: swal + Owner: MaleficScrin + Location: 40,132 + Actor2689: proc.scrin + Owner: MaleficScrin + Location: 132,115 + Actor2695: proc.scrin + Owner: MaleficScrin + Location: 135,98 + Actor2696: proc.scrin + Owner: MaleficScrin + Location: 185,119 + Actor2532: proc.scrin + Owner: MaleficScrin + Location: 12,109 + Actor2542: sfac + Owner: MaleficScrin + Location: 139,109 + Actor2697: sfac + Owner: MaleficScrin + Location: 172,119 + Actor2698: nerv + Owner: MaleficScrin + Location: 126,112 + Actor2699: nerv + Owner: MaleficScrin + Location: 30,110 + Actor2704: shar + Owner: MaleficScrin + Location: 188,118 + Actor2708: shar + Owner: MaleficScrin + Location: 175,118 + Actor2703: shar + Owner: MaleficScrin + Location: 173,131 + Actor2709: shar + Owner: MaleficScrin + Location: 188,133 + Actor2710: shar + Owner: MaleficScrin + Location: 34,123 + Actor2711: shar + Owner: MaleficScrin + Location: 26,113 + Actor2713: shar + Owner: MaleficScrin + Location: 34,102 + Actor2715: shar + Owner: MaleficScrin + Location: 22,95 + Actor2716: shar + Owner: MaleficScrin + Location: 14,97 + Actor2717: shar + Owner: MaleficScrin + Location: 9,109 + Actor2719: shar + Owner: MaleficScrin + Location: 39,114 + Actor2720: shar + Owner: MaleficScrin + Location: 153,95 + Actor2721: shar + Owner: MaleficScrin + Location: 156,101 + Actor2723: shar + Owner: MaleficScrin + Location: 138,95 + Actor2726: shar + Owner: MaleficScrin + Location: 126,103 + Actor2729: shar + Owner: MaleficScrin + Location: 153,111 + Actor2730: shar + Owner: MaleficScrin + Location: 141,119 + Actor2734: shar + Owner: MaleficScrin + Location: 122,114 + Actor2735: shar + Owner: MaleficScrin + Location: 103,113 + Actor2737: rea2 + Owner: MaleficScrin + Location: 186,128 + Actor2741: rea2 + Owner: MaleficScrin + Location: 186,125 + Actor2743: rea2 + Owner: MaleficScrin + Location: 183,125 + Actor2744: rea2 + Owner: MaleficScrin + Location: 183,128 + Actor2745: rea2 + Owner: MaleficScrin + Location: 150,106 + Actor2747: rea2 + Owner: MaleficScrin + Location: 150,103 + Actor2748: rea2 + Owner: MaleficScrin + Location: 150,100 + Actor2751: rea2 + Owner: MaleficScrin + Location: 133,111 + Actor2752: rea2 + Owner: MaleficScrin + Location: 32,105 + Actor2539: sfac + Owner: MaleficScrin + Location: 19,108 + Actor2778: srep + Owner: MaleficScrin + Location: 139,99 + Actor2791: sign + Owner: MaleficScrin + Location: 138,113 + Actor2792: rfgn + Owner: MaleficScrin + Location: 34,113 + Actor2793: mani + Owner: MaleficScrin + Location: 143,116 + Actor2797: ptur + Owner: MaleficScrin + Location: 178,115 + Actor2799: ptur + Owner: MaleficScrin + Location: 185,115 + Actor2800: ptur + Owner: MaleficScrin + Location: 169,124 + Actor2803: ptur + Owner: MaleficScrin + Location: 169,130 + Actor2804: ptur + Owner: MaleficScrin + Location: 146,125 + TurretFacing: 661 + Actor2805: ptur + Owner: MaleficScrin + Location: 152,122 + TurretFacing: 641 + Actor2806: ptur + Owner: MaleficScrin + Location: 141,90 + TurretFacing: 900 + Actor2807: ptur + Owner: MaleficScrin + Location: 147,90 + TurretFacing: 879 + Actor2808: ptur + Owner: MaleficScrin + Location: 110,108 + Actor2810: ptur + Owner: MaleficScrin + Location: 118,107 + Actor2811: ptur + Owner: MaleficScrin + Location: 121,102 + Actor2813: ptur + Owner: MaleficScrin + Location: 26,94 + TurretFacing: 934 + Actor2817: ptur + Owner: MaleficScrin + Location: 30,97 + TurretFacing: 920 + Actor2818: ptur + Owner: MaleficScrin + Location: 11,95 + Actor2825: ptur + Owner: MaleficScrin + Location: 7,98 + Actor2826: scol + Owner: MaleficScrin + Location: 6,101 + Actor2827: scol + Owner: MaleficScrin + Location: 13,97 + Actor2828: scol + Owner: MaleficScrin + Location: 17,93 + Actor2833: scol + Owner: MaleficScrin + Location: 24,96 + Actor2835: scol + Owner: MaleficScrin + Location: 30,100 + Actor2837: scol + Owner: MaleficScrin + Location: 36,103 + Actor2842: scol + Owner: MaleficScrin + Location: 40,112 + Actor2845: scol + Owner: MaleficScrin + Location: 36,138 + Actor2846: scol + Owner: MaleficScrin + Location: 29,138 + Actor2849: scol + Owner: MaleficScrin + Location: 109,110 + Actor2850: scol + Owner: MaleficScrin + Location: 119,109 + Actor2851: scol + Owner: MaleficScrin + Location: 140,93 + Actor2855: scol + Owner: MaleficScrin + Location: 148,93 + Actor2852: scol + Owner: MaleficScrin + Location: 176,118 + Actor2856: scol + Owner: MaleficScrin + Location: 187,118 + Actor2857: scol + Owner: MaleficScrin + Location: 152,119 + Actor2858: scol + Owner: MaleficScrin + Location: 144,122 + Actor2861: rea2 + Owner: MaleficScrin + Location: 172,122 + Actor2862: rea2 + Owner: MaleficScrin + Location: 150,97 + Actor2863: rea2 + Owner: MaleficScrin + Location: 118,115 + Actor2864: rea2 + Owner: MaleficScrin + Location: 118,112 + Actor2865: rea2 + Owner: MaleficScrin + Location: 114,112 + Actor2867: rea2 + Owner: MaleficScrin + Location: 37,124 + Actor2868: rea2 + Owner: MaleficScrin + Location: 38,121 + Actor2869: rea2 + Owner: MaleficScrin + Location: 15,107 + Actor2870: ptur + Owner: MaleficScrin + Location: 115,121 + Actor2872: ptur + Owner: MaleficScrin + Location: 120,121 + Actor2873: ptur + Owner: MaleficScrin + Location: 30,141 + TurretFacing: 559 + Actor2874: ptur + Owner: MaleficScrin + Location: 35,141 + TurretFacing: 675 + Actor2844: shar + Owner: MaleficScrin + Location: 38,131 + Actor2875: shar + Owner: MaleficScrin + Location: 40,137 + Actor2876: shar + Owner: MaleficScrin + Location: 42,125 + Actor2878: reac + Owner: MaleficScrin + Location: 37,133 + Actor2881: stlk + Owner: MaleficScrin + Location: 24,92 + SubCell: 3 + Facing: 886 + Actor2883: stlk + Owner: MaleficScrin + Location: 26,92 + SubCell: 3 + Facing: 838 + Actor2885: stlk + Owner: MaleficScrin + Location: 32,95 + SubCell: 3 + Facing: 872 + Actor2886: stlk + Owner: MaleficScrin + Location: 33,97 + SubCell: 3 + Facing: 852 + Actor2889: stlk + Owner: MaleficScrin + Location: 36,99 + SubCell: 3 + Facing: 852 + Actor2890: dark + Owner: MaleficScrin + Location: 23,91 + Facing: 896 + Actor2891: dark + Owner: MaleficScrin + Facing: 896 + Location: 35,98 + Actor2892: dark + Owner: MaleficScrin + Facing: 896 + Location: 31,93 + Actor2895: dark + Owner: MaleficScrin + Location: 110,106 + Facing: 128 + Actor2896: dark + Owner: MaleficScrin + Facing: 128 + Location: 117,103 + Actor2897: dark + Owner: MaleficScrin + Location: 142,88 + Facing: 896 + Actor2898: dark + Owner: MaleficScrin + Facing: 896 + Location: 150,89 + Actor2899: dark + Owner: MaleficScrin + Facing: 128 + Location: 175,114 + Actor2902: dark + Owner: MaleficScrin + Facing: 128 + Location: 188,110 + Actor2903: dark + Owner: MaleficScrin + Facing: 128 + Location: 8,94 + Actor2905: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 852 + Location: 144,88 + Actor2907: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 852 + Location: 139,89 + Actor2908: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 852 + Location: 151,90 + Actor2909: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 852 + Location: 154,91 + Actor2910: stlk + Owner: MaleficScrin + SubCell: 3 + Location: 11,93 + Facing: 128 + Actor2915: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 128 + Location: 6,96 + Actor2918: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 128 + Location: 13,93 + Actor2920: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 128 + Location: 112,106 + Actor2922: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 128 + Location: 116,102 + Actor2925: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 128 + Location: 118,102 + Actor2926: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 128 + Location: 176,113 + Actor2929: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 128 + Location: 187,112 + Actor2930: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 128 + Location: 189,107 + Actor2931: split2 + Owner: Neutral + Location: 10,119 + Actor2934: split2 + Owner: Neutral + Location: 11,126 + Actor2939: 2tnk + Owner: Greece + Facing: 512 + Location: 101,10 + Actor2940: 2tnk + Owner: Greece + Facing: 512 + Location: 103,8 + Actor2943: 2tnk + Owner: Greece + Facing: 512 + Location: 124,10 + Actor2944: 2tnk + Owner: Greece + Facing: 512 + Location: 126,8 + Actor2945: 2tnk + Owner: Greece + Facing: 512 + Location: 128,6 + Actor2947: jeep + Owner: Greece + Location: 129,10 + Facing: 512 + Actor2946: jeep + Owner: Greece + Facing: 512 + Location: 98,14 + Actor2949: ptnk + Owner: Greece + Facing: 512 + Location: 101,8 + Actor2950: ptnk + Owner: Greece + Facing: 512 + Location: 124,7 + Actor2955: e1 + Owner: Greece + Location: 101,12 + SubCell: 1 + Facing: 512 + Actor2958: e1 + Owner: Greece + Location: 101,12 + SubCell: 2 + Facing: 512 + Actor2960: e1 + Owner: Greece + Location: 101,12 + SubCell: 4 + Facing: 512 + Actor2962: e1 + Owner: Greece + Location: 101,12 + SubCell: 5 + Facing: 512 + Actor2954: e1 + Owner: Greece + SubCell: 1 + Facing: 512 + Location: 103,10 + Actor2963: e1 + Owner: Greece + SubCell: 2 + Facing: 512 + Location: 103,10 + Actor2964: e1 + Owner: Greece + SubCell: 4 + Facing: 512 + Location: 103,10 + Actor2966: e1 + Owner: Greece + SubCell: 5 + Facing: 512 + Location: 103,10 + Actor2973: e1 + Owner: Greece + SubCell: 1 + Facing: 512 + Location: 127,10 + Actor2975: e1 + Owner: Greece + SubCell: 2 + Facing: 512 + Location: 127,10 + Actor2977: e1 + Owner: Greece + SubCell: 4 + Facing: 512 + Location: 127,10 + Actor2979: e1 + Owner: Greece + SubCell: 5 + Facing: 512 + Location: 127,10 + Actor2980: e1 + Owner: Greece + SubCell: 1 + Facing: 512 + Location: 129,8 + Actor2981: e1 + Owner: Greece + SubCell: 2 + Facing: 512 + Location: 129,8 + Actor2982: e1 + Owner: Greece + SubCell: 4 + Facing: 512 + Location: 129,8 + Actor2986: e1 + Owner: Greece + SubCell: 5 + Facing: 512 + Location: 129,8 + Actor2987: medi + Owner: Greece + Location: 102,6 + SubCell: 3 + Facing: 512 + Actor2998: e3 + Owner: Greece + Location: 99,9 + SubCell: 1 + Facing: 512 + Actor3001: e3 + Owner: Greece + Location: 99,9 + SubCell: 2 + Facing: 512 + Actor3002: e3 + Owner: Greece + Location: 99,9 + SubCell: 4 + Facing: 512 + Actor3005: e3 + Owner: Greece + Location: 99,9 + SubCell: 5 + Facing: 512 + Actor2995: e3 + Owner: Greece + SubCell: 1 + Facing: 512 + Location: 122,9 + Actor3007: e3 + Owner: Greece + SubCell: 2 + Facing: 512 + Location: 122,9 + Actor3009: e3 + Owner: Greece + SubCell: 4 + Facing: 512 + Location: 122,9 + Actor3012: e3 + Owner: Greece + SubCell: 5 + Facing: 512 + Location: 122,9 + Actor2989: medi + Owner: Greece + SubCell: 3 + Facing: 512 + Location: 127,7 + PlayerStart: waypoint + Owner: Neutral + Location: 112,9 + McvSpawn1: waypoint + Owner: Neutral + Location: 98,1 + McvSpawn2: waypoint + Owner: Neutral + Location: 125,1 + McvDest1: waypoint + Owner: Neutral + Location: 98,9 + McvDest2: waypoint + Owner: Neutral + Location: 125,6 + Actor2769: scrt + Owner: MaleficScrin + Location: 154,106 + Actor2880: swal + Owner: MaleficScrin + Location: 171,133 + Actor3019: swal + Owner: MaleficScrin + Location: 172,133 + Actor3021: swal + Owner: MaleficScrin + Location: 172,134 + Actor3025: swal + Owner: MaleficScrin + Location: 172,135 + Actor3028: swal + Owner: MaleficScrin + Location: 172,136 + Actor3030: swal + Owner: MaleficScrin + Location: 172,137 + Actor3031: swal + Owner: MaleficScrin + Location: 172,138 + Actor3034: swal + Owner: MaleficScrin + Location: 172,139 + Actor3038: swal + Owner: MaleficScrin + Location: 171,140 + Actor3040: swal + Owner: MaleficScrin + Location: 171,141 + Actor3042: swal + Owner: MaleficScrin + Location: 172,141 + Actor3043: swal + Owner: MaleficScrin + Location: 172,140 + Actor3045: swal + Owner: MaleficScrin + Location: 173,141 + Actor3047: swal + Owner: MaleficScrin + Location: 173,142 + Actor3048: swal + Owner: MaleficScrin + Location: 174,142 + Actor3049: swal + Owner: MaleficScrin + Location: 174,141 + Actor3050: swal + Owner: MaleficScrin + Location: 188,141 + Actor3051: swal + Owner: MaleficScrin + Location: 187,140 + Actor3053: swal + Owner: MaleficScrin + Location: 188,140 + Actor3054: swal + Owner: MaleficScrin + Location: 187,141 + Actor3056: swal + Owner: MaleficScrin + Location: 188,139 + Actor3061: swal + Owner: MaleficScrin + Location: 189,139 + Actor3062: swal + Owner: MaleficScrin + Location: 189,138 + Actor3065: swal + Owner: MaleficScrin + Location: 188,138 + Actor3066: swal + Owner: MaleficScrin + Location: 189,137 + Actor3071: swal + Owner: MaleficScrin + Location: 175,142 + Actor3072: swal + Owner: MaleficScrin + Location: 176,142 + Actor3076: swal + Owner: MaleficScrin + Location: 177,142 + Actor3077: swal + Owner: MaleficScrin + Location: 178,142 + Actor3079: swal + Owner: MaleficScrin + Location: 179,142 + Actor3081: swal + Owner: MaleficScrin + Location: 180,142 + Actor3082: swal + Owner: MaleficScrin + Location: 181,143 + Actor3083: swal + Owner: MaleficScrin + Location: 181,142 + Actor3086: swal + Owner: MaleficScrin + Location: 180,143 + Actor3087: swal + Owner: MaleficScrin + Location: 182,143 + Actor3088: swal + Owner: MaleficScrin + Location: 182,142 + Actor3089: swal + Owner: MaleficScrin + Location: 183,142 + Actor3091: swal + Owner: MaleficScrin + Location: 184,142 + Actor3092: swal + Owner: MaleficScrin + Location: 185,142 + Actor3094: swal + Owner: MaleficScrin + Location: 186,142 + Actor3096: swal + Owner: MaleficScrin + Location: 186,141 + Actor3097: shar + Owner: MaleficScrin + Location: 173,140 + Actor3100: scol + Owner: MaleficScrin + Location: 172,130 + Actor3102: rea2 + Owner: MaleficScrin + Location: 184,131 + Actor3103: rea2 + Owner: MaleficScrin + Location: 173,133 + Actor2700: nerv + Owner: MaleficScrin + Location: 181,128 + Actor3105: t12 + Owner: Neutral + Location: 111,55 + Actor3106: t07 + Owner: Neutral + Location: 112,50 + Actor3107: t16 + Owner: Neutral + Location: 116,47 + Actor3109: t17 + Owner: Neutral + Location: 116,51 + Actor3111: t07 + Owner: Neutral + Location: 114,54 + Actor3112: t02 + Owner: Neutral + Location: 111,44 + Actor3115: tc02 + Owner: Neutral + Location: 118,48 + Actor3116: t14 + Owner: Neutral + Location: 122,49 + Actor3118: t13 + Owner: Neutral + Location: 123,45 + Actor3120: t15 + Owner: Neutral + Location: 38,46 + Actor3122: t11 + Owner: Neutral + Location: 45,14 + Actor3125: t08 + Owner: Neutral + Location: 49,9 + Actor3126: t10 + Owner: Neutral + Location: 21,16 + Actor3128: t14 + Owner: Neutral + Location: 15,26 + Actor3130: t13 + Owner: Neutral + Location: 141,42 + Actor3132: t16 + Owner: Neutral + Location: 146,42 + Actor3134: t14 + Owner: Neutral + Location: 142,48 + Actor3138: t16 + Owner: Neutral + Location: 156,77 + Actor3141: t13 + Owner: Neutral + Location: 107,88 + Actor3143: t06 + Owner: Neutral + Location: 106,73 + Actor3145: t06 + Owner: Neutral + Location: 45,67 + Actor3146: t06 + Owner: Neutral + Location: 53,63 + Actor3150: t15 + Owner: Neutral + Location: 51,64 + Actor3151: t10 + Owner: Neutral + Location: 54,55 + Actor3153: t13 + Owner: Neutral + Location: 36,82 + Actor3157: t10 + Owner: Neutral + Location: 24,74 + Actor3161: t13 + Owner: Neutral + Location: 6,80 + Actor3164: t12 + Owner: Neutral + Location: 26,76 + Actor3166: t06 + Owner: Neutral + Location: 23,81 + Actor3169: t07 + Owner: Neutral + Location: 150,71 + Actor3170: t07 + Owner: Neutral + Location: 178,17 + Actor3171: t10 + Owner: Neutral + Location: 178,13 + Actor3173: t12 + Owner: Neutral + Location: 189,49 + Actor3174: t13 + Owner: Neutral + Location: 75,5 + Actor3175: tc03 + Owner: Neutral + Location: 72,3 + Actor3176: t12 + Owner: Neutral + Location: 70,2 + Actor3177: t13 + Owner: Neutral + Location: 58,7 + Actor3179: t16 + Owner: Neutral + Location: 60,5 + Actor3182: tc01 + Owner: Neutral + Location: 41,25 + Actor3183: t12 + Owner: Neutral + Location: 43,28 + Actor3185: t10 + Owner: Neutral + Location: 57,19 + Actor3188: tc05 + Owner: Neutral + Location: 41,44 + Actor3189: t17 + Owner: Neutral + Location: 44,43 + Actor3196: t12 + Owner: Neutral + Location: 43,58 + Actor3197: t15 + Owner: Neutral + Location: 43,52 + Actor3198: t13 + Owner: Neutral + Location: 25,38 + Actor3201: t15 + Owner: Neutral + Location: 7,63 + Actor3203: tc02 + Owner: Neutral + Location: 101,96 + Actor3204: t10 + Owner: Neutral + Location: 102,94 + Actor3206: intl.ai + Owner: MaleficScrin + Facing: 384 + Location: 150,109 + Actor3207: intl.ai + Owner: MaleficScrin + Location: 112,102 + Facing: 136 + Actor3209: intl.ai + Owner: MaleficScrin + Location: 146,85 + Facing: 900 + Actor3211: intl.ai + Owner: MaleficScrin + Location: 145,112 + Facing: 0 + Actor3212: intl.ai + Owner: MaleficScrin + Location: 109,114 + Facing: 845 + Actor3216: intl.ai + Owner: MaleficScrin + Location: 108,113 + Facing: 825 + Actor3218: intl.ai + Owner: MaleficScrin + Facing: 384 + Location: 27,91 + Actor3221: intl.ai + Owner: MaleficScrin + Location: 35,96 + Facing: 384 + TurretFacing@SHIELDS: 6 + TurretFacing: 497 + Actor3224: intl.ai + Owner: MaleficScrin + Location: 12,90 + Facing: 115 + Actor3227: intl.ai + Owner: MaleficScrin + Facing: 384 + Location: 34,137 + Actor3237: intl.ai + Owner: MaleficScrin + Facing: 384 + Location: 33,136 + Actor3238: gunw + Owner: MaleficScrin + Location: 36,106 + Facing: 818 + Actor3240: gunw + Owner: MaleficScrin + Location: 109,121 + Facing: 600 + Actor3241: gunw + Owner: MaleficScrin + Facing: 384 + Location: 101,121 + Actor3242: gunw + Owner: MaleficScrin + Location: 100,116 + Facing: 245 + Actor3244: gunw + Owner: MaleficScrin + Location: 32,128 + Facing: 384 + Actor3245: gunw + Owner: MaleficScrin + Location: 26,116 + Facing: 934 + Actor3246: gunw + Owner: MaleficScrin + Location: 22,114 + Facing: 0 + Actor3247: gunw + Owner: MaleficScrin + Location: 37,110 + Facing: 934 + Actor3249: gunw + Owner: MaleficScrin + Location: 10,101 + Facing: 886 + Actor3255: gunw + Owner: MaleficScrin + Location: 136,116 + Facing: 384 + Actor3256: gunw + Owner: MaleficScrin + Location: 141,103 + Facing: 0 + Actor3259: gunw + Owner: MaleficScrin + Location: 132,103 + Facing: 170 + Actor3260: gunw + Owner: MaleficScrin + Facing: 384 + Location: 185,123 + Actor3263: gunw + Owner: MaleficScrin + Location: 182,119 + Facing: 211 + Actor3266: gunw + Owner: MaleficScrin + Location: 185,140 + Facing: 109 + Actor3267: gunw + Owner: MaleficScrin + Location: 174,137 + Facing: 750 + Actor3270: gunw + Owner: MaleficScrin + Facing: 384 + Location: 154,122 + Actor3271: gunw + Owner: MaleficScrin + Facing: 384 + Location: 147,127 + Actor3277: devo + Owner: MaleficScrin + Location: 154,125 + Facing: 531 + Actor3280: devo + Owner: MaleficScrin + Location: 178,95 + Facing: 163 + Actor3282: devo + Owner: MaleficScrin + Location: 181,92 + Facing: 150 + Actor3284: corr + Owner: MaleficScrin + Location: 177,94 + Facing: 143 + Actor3285: gunw + Owner: MaleficScrin + Location: 182,95 + Facing: 75 + Actor3286: gunw + Owner: MaleficScrin + Location: 179,92 + Facing: 68 + Actor3289: dark + Owner: MaleficScrin + Location: 149,62 + Facing: 0 + Actor3301: stlk + Owner: MaleficScrin + Location: 157,60 + SubCell: 3 + Facing: 384 + Actor3299: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 0 + Location: 155,61 + Actor3297: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 0 + Location: 151,61 + Actor3296: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 0 + Location: 151,64 + Actor3291: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 0 + Location: 147,60 + Actor3305: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 0 + Location: 105,67 + Actor3308: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 0 + Location: 108,69 + Actor3310: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 0 + Location: 87,49 + Actor3311: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 0 + Location: 87,53 + Actor3313: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 0 + Location: 89,54 + Actor3321: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 0 + Location: 73,41 + Actor3323: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 0 + Location: 70,34 + Actor3324: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 0 + Location: 72,38 + Actor3326: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 0 + Location: 98,24 + Actor3331: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 0 + Location: 101,24 + Actor3333: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 0 + Location: 103,23 + Actor3335: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 0 + Location: 100,24 + Actor3339: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 0 + Location: 125,20 + Actor3340: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 0 + Location: 126,19 + Actor3341: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 0 + Location: 127,20 + Actor3342: s4 + Owner: MaleficScrin + Facing: 384 + Location: 37,107 + SubCell: 3 + Actor3343: s4 + Owner: MaleficScrin + Facing: 384 + Location: 29,103 + SubCell: 3 + Actor3345: s4 + Owner: MaleficScrin + Facing: 384 + Location: 14,99 + SubCell: 3 + Actor3346: s4 + Owner: MaleficScrin + Facing: 384 + Location: 23,115 + SubCell: 3 + Actor3350: s4 + Owner: MaleficScrin + Facing: 384 + Location: 28,115 + SubCell: 3 + Actor3351: s4 + Owner: MaleficScrin + Facing: 384 + Location: 19,112 + SubCell: 3 + Actor3353: s4 + Owner: MaleficScrin + Location: 33,127 + SubCell: 3 + Facing: 531 + Actor3354: s4 + Owner: MaleficScrin + Facing: 384 + Location: 31,126 + SubCell: 3 + Actor3356: s4 + Owner: MaleficScrin + Facing: 384 + Location: 35,136 + SubCell: 3 + Actor3360: s4 + Owner: MaleficScrin + Facing: 384 + Location: 149,104 + SubCell: 3 + Actor3361: s4 + Owner: MaleficScrin + Location: 149,102 + SubCell: 3 + Facing: 716 + Actor3362: s4 + Owner: MaleficScrin + Facing: 384 + Location: 154,100 + SubCell: 3 + Actor3367: s4 + Owner: MaleficScrin + Facing: 384 + Location: 131,105 + SubCell: 3 + Actor3368: s4 + Owner: MaleficScrin + Facing: 384 + Location: 118,103 + SubCell: 3 + Actor3370: s4 + Owner: MaleficScrin + Facing: 384 + Location: 107,114 + SubCell: 3 + Actor3374: s4 + Owner: MaleficScrin + Facing: 384 + Location: 106,112 + SubCell: 3 + Actor3376: s4 + Owner: MaleficScrin + Facing: 384 + Location: 110,112 + SubCell: 3 + Actor3377: s4 + Owner: MaleficScrin + Facing: 384 + Location: 117,115 + SubCell: 3 + Actor3378: s4 + Owner: MaleficScrin + Facing: 384 + Location: 182,131 + SubCell: 3 + Actor3379: s4 + Owner: MaleficScrin + Facing: 384 + Location: 181,125 + SubCell: 3 + Actor3380: s4 + Owner: MaleficScrin + Facing: 384 + Location: 176,120 + SubCell: 3 + Actor3381: s4 + Owner: MaleficScrin + Facing: 384 + Location: 186,136 + SubCell: 3 + Actor3382: tpod + Owner: MaleficScrin + Facing: 384 + Location: 145,99 + Actor3383: tpod + Owner: MaleficScrin + Location: 115,109 + Facing: 197 + Actor3384: tpod + Owner: MaleficScrin + Facing: 384 + Location: 17,96 + Actor3385: tpod + Owner: MaleficScrin + Facing: 384 + Location: 29,129 + Actor3386: tpod + Owner: MaleficScrin + Location: 187,114 + Facing: 163 + Actor3387: stlk + Owner: MaleficScrin + Location: 62,11 + SubCell: 3 + Facing: 654 + Actor3388: stlk + Owner: MaleficScrin + Location: 64,11 + SubCell: 3 + Facing: 600 + Actor3389: stlk + Owner: MaleficScrin + Location: 64,9 + SubCell: 3 + Facing: 791 + Actor3390: dark + Owner: MaleficScrin + Location: 67,10 + Facing: 647 + ScriptTags: HardAndAbove + Actor3391: tpod + Owner: MaleficScrin + Facing: 384 + Location: 120,126 + Actor3392: s1 + Owner: MaleficScrin + Facing: 384 + Location: 122,126 + SubCell: 3 + Actor3393: s1 + Owner: MaleficScrin + Facing: 384 + Location: 119,124 + SubCell: 3 + Actor3395: s1 + Owner: MaleficScrin + Facing: 384 + Location: 117,124 + SubCell: 3 + Actor3396: s1 + Owner: MaleficScrin + Facing: 384 + Location: 117,125 + SubCell: 3 + Actor3397: s1 + Owner: MaleficScrin + Facing: 384 + Location: 124,129 + SubCell: 3 + Actor3398: s1 + Owner: MaleficScrin + Facing: 384 + Location: 124,129 + SubCell: 1 + Actor3399: s1 + Owner: MaleficScrin + Facing: 384 + Location: 149,102 + SubCell: 1 + Actor3404: s1 + Owner: MaleficScrin + Facing: 384 + Location: 112,104 + SubCell: 3 + Actor3405: s1 + Owner: MaleficScrin + Facing: 384 + Location: 112,104 + SubCell: 1 + Actor3406: s1 + Owner: MaleficScrin + Facing: 384 + Location: 101,119 + SubCell: 3 + Actor3413: s1 + Owner: MaleficScrin + Facing: 384 + Location: 41,120 + SubCell: 3 + Actor3414: s1 + Owner: MaleficScrin + Facing: 384 + Location: 41,120 + SubCell: 1 + Actor3415: s1 + Owner: MaleficScrin + Facing: 384 + Location: 41,118 + SubCell: 3 + Actor3416: s1 + Owner: MaleficScrin + Facing: 384 + Location: 33,119 + SubCell: 3 + Actor3420: s1 + Owner: MaleficScrin + Facing: 384 + Location: 34,138 + SubCell: 3 + Actor3421: s1 + Owner: MaleficScrin + Facing: 384 + Location: 34,138 + SubCell: 1 + Actor3422: s1 + Owner: MaleficScrin + Facing: 384 + Location: 30,130 + SubCell: 3 + Actor3424: s1 + Owner: MaleficScrin + Facing: 384 + Location: 180,93 + SubCell: 3 + Actor3425: s1 + Owner: MaleficScrin + Facing: 384 + Location: 180,93 + SubCell: 1 + Actor3426: s1 + Owner: MaleficScrin + Facing: 384 + Location: 184,92 + SubCell: 3 + Actor3427: s1 + Owner: MaleficScrin + Facing: 384 + Location: 183,91 + SubCell: 3 + Actor3428: s1 + Owner: MaleficScrin + Facing: 384 + Location: 174,97 + SubCell: 3 + Actor3429: s1 + Owner: MaleficScrin + Facing: 384 + Location: 179,96 + SubCell: 3 + Actor3430: s1 + Owner: MaleficScrin + Facing: 384 + Location: 177,96 + SubCell: 3 + Actor3431: s1 + Owner: MaleficScrin + Facing: 384 + Location: 153,61 + SubCell: 3 + Actor3432: s1 + Owner: MaleficScrin + Facing: 384 + Location: 155,63 + SubCell: 3 + Actor3436: s1 + Owner: MaleficScrin + Location: 89,65 + SubCell: 3 + Facing: 1023 + Actor3437: s1 + Owner: MaleficScrin + SubCell: 3 + Location: 96,67 + Facing: 934 + TurretFacing: 497 + Actor3401: s1 + Owner: MaleficScrin + SubCell: 3 + Facing: 934 + Location: 142,105 + Actor3403: s1 + Owner: MaleficScrin + SubCell: 3 + Facing: 934 + Location: 155,101 + Actor3402: s1 + Owner: MaleficScrin + SubCell: 3 + Facing: 934 + Location: 149,107 + Actor3423: s1 + Owner: MaleficScrin + SubCell: 3 + Facing: 934 + Location: 106,122 + Actor3417: s1 + Owner: MaleficScrin + SubCell: 3 + Facing: 934 + Location: 23,117 + Actor3410: s1 + Owner: MaleficScrin + SubCell: 3 + Facing: 934 + Location: 34,109 + Actor3411: s1 + Owner: MaleficScrin + SubCell: 3 + Facing: 934 + Location: 32,103 + Actor3412: s1 + Owner: MaleficScrin + SubCell: 3 + Facing: 934 + Location: 37,112 + Actor3407: s1 + Owner: MaleficScrin + SubCell: 3 + Facing: 934 + Location: 15,99 + Actor3408: s1 + Owner: MaleficScrin + SubCell: 3 + Facing: 934 + Location: 15,98 + Actor3409: s1 + Owner: MaleficScrin + SubCell: 3 + Facing: 934 + Location: 19,96 + Actor3419: s1 + Owner: MaleficScrin + SubCell: 3 + Facing: 934 + Location: 13,108 + Actor3418: s1 + Owner: MaleficScrin + SubCell: 3 + Facing: 934 + Location: 16,110 + Actor3438: s1 + Owner: MaleficScrin + SubCell: 3 + Facing: 934 + Location: 40,98 + Actor3439: s1 + Owner: MaleficScrin + SubCell: 3 + Facing: 934 + Location: 4,92 + Actor3440: stlk + Owner: MaleficScrin + Facing: 384 + Location: 177,33 + SubCell: 3 + Actor3441: stlk + Owner: MaleficScrin + Facing: 384 + Location: 178,34 + SubCell: 3 + Actor3442: stlk + Owner: MaleficScrin + Facing: 384 + Location: 181,37 + SubCell: 3 + Actor3443: stlk + Owner: MaleficScrin + Facing: 384 + Location: 178,22 + SubCell: 3 + Actor3445: stlk + Owner: MaleficScrin + Facing: 384 + Location: 178,21 + SubCell: 3 + Actor3446: stlk + Owner: MaleficScrin + Facing: 384 + Location: 176,23 + SubCell: 3 + Actor3448: stlk + Owner: MaleficScrin + Location: 23,67 + SubCell: 3 + Facing: 913 + Actor3447: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 913 + Location: 21,66 + Actor3444: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 913 + Location: 20,68 + Actor3451: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 913 + Location: 36,52 + Actor3449: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 913 + Location: 38,54 + Actor3450: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 913 + Location: 39,56 + Actor3454: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 913 + Location: 36,19 + Actor3453: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 913 + Location: 34,17 + Actor3452: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 913 + Location: 33,15 + Actor3459: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 913 + Location: 67,77 + Actor3456: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 913 + Location: 69,75 + Actor3457: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 913 + Location: 70,77 + Actor3458: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 913 + Location: 71,78 + Actor3455: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 913 + Location: 63,75 + Actor3461: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 913 + Location: 90,85 + Actor3460: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 913 + Location: 83,89 + Actor3462: lace + Owner: MaleficScrin + Location: 65,73 + Facing: 709 + Actor3463: lace + Owner: MaleficScrin + Location: 69,78 + Facing: 0 + Actor3464: lace + Owner: MaleficScrin + Location: 71,79 + Facing: 934 + Actor3465: lace + Owner: MaleficScrin + Facing: 384 + Location: 155,37 + Actor3466: lace + Owner: MaleficScrin + Facing: 384 + Location: 156,38 + Actor3467: lace + Owner: MaleficScrin + Facing: 384 + Location: 113,127 + Actor3468: lace + Owner: MaleficScrin + Facing: 384 + Location: 120,133 + Actor3469: lace + Owner: MaleficScrin + Facing: 384 + Location: 126,82 + Actor3470: lace + Owner: MaleficScrin + Facing: 384 + Location: 126,79 + Actor3471: lace + Owner: MaleficScrin + Facing: 384 + Location: 123,80 + LeftGateway: wormholexxl + Owner: MaleficScrin + Location: 28,121 + MiddleGateway: wormholexxl + Owner: MaleficScrin + Location: 105,118 + RightGateway: wormholexxl + Owner: MaleficScrin + Location: 180,137 + LeftPath1: waypoint + Owner: Neutral + Location: 20,103 + LeftPath2: waypoint + Owner: Neutral + Location: 34,89 + LeftPath3: waypoint + Owner: Neutral + Location: 53,78 + LeftPath4: waypoint + Owner: Neutral + Location: 52,51 + LeftPath5: waypoint + Owner: Neutral + Location: 71,36 + LeftPath6: waypoint + Owner: Neutral + Location: 88,32 + LeftPath7: waypoint + Owner: Neutral + Location: 96,1 + MiddlePath1: waypoint + Owner: Neutral + Location: 114,100 + MiddlePath3: waypoint + Owner: Neutral + Location: 106,47 + MiddlePath4: waypoint + Owner: Neutral + Location: 100,1 + RightPath1: waypoint + Owner: Neutral + Location: 168,127 + RightPath2: waypoint + Owner: Neutral + Location: 146,121 + RightPath3: waypoint + Owner: Neutral + Location: 144,90 + RightPath4: waypoint + Owner: Neutral + Location: 153,81 + RightPath5: waypoint + Owner: Neutral + Location: 153,56 + RightPath7: waypoint + Owner: Neutral + Location: 124,1 + LeftWarpSphere: wsph + Owner: MaleficScrin + Location: 14,101 + LeftGrav: grav + Owner: MaleficScrin + Location: 36,117 + RightGrav: grav + Owner: MaleficScrin + Location: 176,127 + RightWarpSphere: wsph + Owner: MaleficScrin + Location: 176,121 + RightPortal: port + Owner: MaleficScrin + Location: 181,121 + MiddleGrav1: grav + Owner: MaleficScrin + Location: 138,103 + MiddleGrav3: grav + Owner: MaleficScrin + Location: 145,107 + LeftFlankPath1: waypoint + Owner: Neutral + Location: 20,56 + LeftFlankPath2a: waypoint + Owner: Neutral + Location: 23,26 + LeftFlankPath2b: waypoint + Owner: Neutral + Location: 45,37 + LeftFlankPath3: waypoint + Owner: Neutral + Location: 52,15 + LeftMiddlePath1: waypoint + Owner: Neutral + Location: 87,56 + RightFlankPath1: waypoint + Owner: Neutral + Location: 181,87 + RightFlankPath2: waypoint + Owner: Neutral + Location: 186,45 + MiddleWarpSphere: wsph + Owner: MaleficScrin + Location: 134,103 + MiddleGrav2: grav + Owner: MaleficScrin + Location: 145,102 + Actor2750: rea2 + Owner: MaleficScrin + Location: 147,95 + Actor2749: rea2 + Owner: MaleficScrin + Location: 135,108 + Actor2733: shar + Owner: MaleficScrin + TurretFacing: 192 + Location: 129,114 + MiddlePortal: port + Owner: MaleficScrin + Location: 129,108 + Actor2757: rea2 + Owner: MaleficScrin + Location: 18,98 + LeftPortal: port + Owner: MaleficScrin + Location: 30,102 + Actor2758: rea2 + Owner: MaleficScrin + Location: 27,106 + Actor2760: rea2 + Owner: MaleficScrin + Location: 23,104 + RightFlankPath3: waypoint + Owner: Neutral + Location: 173,15 + RightPath6a: waypoint + Owner: Neutral + Location: 132,36 + RightPath6b: waypoint + Owner: Neutral + Location: 160,25 + Actor2790: split2 + Owner: Neutral + Location: 74,89 + Actor3435: s1 + Owner: MaleficScrin + Facing: 40 + Location: 89,68 + SubCell: 3 + Actor3434: s1 + Owner: MaleficScrin + TurretFacing: 0 + Facing: 947 + Location: 98,71 + SubCell: 3 + Actor3433: s1 + Owner: MaleficScrin + Facing: 934 + Location: 98,73 + SubCell: 3 + Actor3315: stlk + Owner: MaleficScrin + Facing: 0 + Location: 89,56 + SubCell: 3 + Actor3318: stlk + Owner: MaleficScrin + Facing: 0 + Location: 89,52 + SubCell: 3 + Actor3304: stlk + Owner: MaleficScrin + Facing: 0 + Location: 104,69 + SubCell: 3 + Actor2937: 2tnk + Owner: Greece + Location: 93,8 + Facing: 512 + Actor2938: 2tnk + Owner: Greece + Facing: 512 + Location: 95,10 + Actor2948: ptnk + Owner: Greece + Location: 95,8 + Facing: 512 + Actor2967: e1 + Owner: Greece + SubCell: 1 + Facing: 512 + Location: 93,10 + Actor2970: e1 + Owner: Greece + SubCell: 2 + Facing: 512 + Location: 93,10 + Actor2971: e1 + Owner: Greece + SubCell: 4 + Facing: 512 + Location: 93,10 + Actor2972: e1 + Owner: Greece + SubCell: 5 + Facing: 512 + Location: 93,10 + Actor2988: medi + Owner: Greece + SubCell: 3 + Facing: 512 + Location: 94,6 + Actor2761: t16 + Owner: Neutral + Location: 90,131 + Actor2764: t15 + Owner: Neutral + Location: 100,56 + Actor2765: tc02 + Owner: Neutral + Location: 99,59 + Actor2772: t10 + Owner: Neutral + Location: 99,53 + Actor2774: t07 + Owner: Neutral + Location: 102,55 + Actor2775: t13 + Owner: Neutral + Location: 99,57 + Actor2782: t13 + Owner: Neutral + Location: 99,50 + Actor2783: t17 + Owner: Neutral + Location: 103,63 + Actor2785: utilpol2 + Owner: Neutral + Location: 91,93 + Actor2787: utilpol1 + Owner: Neutral + Location: 96,102 + Actor2788: utilpol1 + Owner: Neutral + Location: 91,19 + HighwayExit: waypoint + Owner: Neutral + Location: 94,1 + HighwayPath1: waypoint + Owner: Neutral + Location: 94,100 + MiddlePath2: waypoint + Owner: Neutral + Location: 109,84 + Actor2832: split2 + Owner: Neutral + Location: 77,68 + Actor2879: shrw + Owner: MaleficScrin + Location: 65,137 + Facing: 907 + Actor2912: shrw + Owner: MaleficScrin + Location: 56,134 + Facing: 941 + Actor2919: stlk + Owner: MaleficScrin + Location: 65,135 + SubCell: 3 + Facing: 825 + Actor3014: stlk + Owner: MaleficScrin + Location: 61,132 + SubCell: 3 + Facing: 0 + Actor3015: intl.ai + Owner: MaleficScrin + Facing: 384 + Location: 15,131 + Actor3041: s3 + Owner: MaleficScrin + Facing: 384 + Location: 17,131 + SubCell: 3 + Actor3113: gunw + Owner: MaleficScrin + Facing: 384 + Location: 17,134 + Actor3127: gunw + Owner: MaleficScrin + Facing: 384 + Location: 12,117 + Actor3144: stlk + Owner: MaleficScrin + Facing: 384 + Location: 7,118 + SubCell: 3 + Actor3472: stlk + Owner: MaleficScrin + Facing: 384 + Location: 186,134 + SubCell: 3 + Actor3473: stlk + Owner: MaleficScrin + Facing: 384 + Location: 188,124 + SubCell: 3 + Actor3474: stlk + Owner: MaleficScrin + Facing: 384 + Location: 173,136 + SubCell: 3 + Actor3475: stlk + Owner: MaleficScrin + Facing: 384 + Location: 184,141 + SubCell: 3 + Actor3476: stlk + Owner: MaleficScrin + Facing: 384 + Location: 137,111 + SubCell: 3 + Actor3477: stlk + Owner: MaleficScrin + Facing: 384 + Location: 153,105 + SubCell: 3 + Actor3478: stlk + Owner: MaleficScrin + Facing: 384 + Location: 117,113 + SubCell: 3 + Actor3479: stlk + Owner: MaleficScrin + Facing: 384 + Location: 122,116 + SubCell: 3 + Actor3480: stlk + Owner: MaleficScrin + Facing: 384 + Location: 132,114 + SubCell: 3 + Actor3481: stlk + Owner: MaleficScrin + Facing: 384 + Location: 24,107 + SubCell: 3 + Actor3482: stlk + Owner: MaleficScrin + Facing: 384 + Location: 37,114 + SubCell: 3 + Actor3483: s3 + Owner: MaleficScrin + Location: 16,106 + SubCell: 3 + Facing: 538 + Actor3484: s3 + Owner: MaleficScrin + Facing: 384 + Location: 22,104 + SubCell: 3 + Actor3485: s3 + Owner: MaleficScrin + Facing: 384 + Location: 23,112 + SubCell: 3 + Actor3486: s3 + Owner: MaleficScrin + Location: 18,103 + SubCell: 3 + Facing: 0 + Actor3487: s3 + Owner: MaleficScrin + Facing: 384 + Location: 18,114 + SubCell: 3 + Actor3488: s3 + Owner: MaleficScrin + Location: 16,94 + SubCell: 3 + Facing: 170 + Actor3489: s3 + Owner: MaleficScrin + Location: 42,116 + SubCell: 3 + Facing: 804 + Actor3490: s3 + Owner: MaleficScrin + Facing: 384 + Location: 40,120 + SubCell: 3 + Actor3491: s3 + Owner: MaleficScrin + Location: 38,111 + SubCell: 3 + Facing: 757 + Actor3492: s3 + Owner: MaleficScrin + Location: 22,119 + SubCell: 3 + Facing: 477 + Actor3493: s3 + Owner: MaleficScrin + Facing: 384 + Location: 137,105 + SubCell: 3 + Actor3494: s3 + Owner: MaleficScrin + Location: 142,103 + SubCell: 3 + Facing: 384 + Actor3495: s3 + Owner: MaleficScrin + Facing: 384 + Location: 147,106 + SubCell: 3 + Actor3496: s3 + Owner: MaleficScrin + Facing: 384 + Location: 148,110 + SubCell: 3 + Actor3497: s3 + Owner: MaleficScrin + Location: 141,112 + SubCell: 3 + Facing: 620 + Actor3498: s3 + Owner: MaleficScrin + Facing: 384 + Location: 134,110 + SubCell: 3 + Actor3499: s3 + Owner: MaleficScrin + Facing: 384 + Location: 148,98 + SubCell: 3 + Actor3500: s3 + Owner: MaleficScrin + Location: 136,102 + SubCell: 3 + Facing: 770 + Actor3501: s3 + Owner: MaleficScrin + Location: 135,115 + SubCell: 3 + Facing: 552 + Actor3502: s3 + Owner: MaleficScrin + Location: 147,113 + SubCell: 3 + Facing: 661 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|missions/main-campaign/ca47-ad-nihilum/ad-nihilum-rules.yaml, ca|rules/custom/coop-rules.yaml, ad-nihilum-coop-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/coop-campaign/ca48-banishment-coop/banishment-coop-rules.yaml b/mods/ca/missions/coop-campaign/ca48-banishment-coop/banishment-coop-rules.yaml new file mode 100644 index 0000000000..ae7dbcebde --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca48-banishment-coop/banishment-coop-rules.yaml @@ -0,0 +1,11 @@ +World: + LuaScript: + Scripts: campaign.lua, coop.lua, ca|missions/main-campaign/ca48-banishment/banishment.lua, banishment-coop.lua + ScriptLobbyDropdown@basesharing: + Values: + -0: + Default: 1 + Locked: True + LobbyMissionInfo@InitialObjectives: + Prefix: Initial Objectives + Text: • Secure the four abandoned Allied bases.\n• Destroy all Scrin Nerve Centers. diff --git a/mods/ca/missions/coop-campaign/ca48-banishment-coop/banishment-coop.lua b/mods/ca/missions/coop-campaign/ca48-banishment-coop/banishment-coop.lua new file mode 100644 index 0000000000..67e84cffd0 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca48-banishment-coop/banishment-coop.lua @@ -0,0 +1,70 @@ + +SetupPlayers = function() + Multi0 = Player.GetPlayer("Multi0") + Multi1 = Player.GetPlayer("Multi1") + Multi2 = Player.GetPlayer("Multi2") + Multi3 = Player.GetPlayer("Multi3") + Multi4 = Player.GetPlayer("Multi4") + Multi5 = Player.GetPlayer("Multi5") + Greece = Player.GetPlayer("Greece") + MaleficScrin = Player.GetPlayer("MaleficScrin") + England = Player.GetPlayer("England") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = Utils.Where({ Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 }, function(p) return p ~= nil end) + MissionEnemies = { MaleficScrin } + SinglePlayerPlayer = Greece + CoopInit() +end + +AfterWorldLoaded = function() + StartCashSpread(3500) +end + +AfterTick = function() + +end + +TransferBaseActors = function(base) + local recipientPlayer = GetFirstActivePlayer() + local highestAssetValue = 0 + + Utils.Do(GetMcvPlayers(), function(p) + local playerAssetsNearby = Utils.Where(Map.ActorsInCircle(base.Center.CenterPosition, WDist.New(20 * 1024)), function(a) + return a.Owner == p + end) + + local playerAssetValue = GetTotalCostOfUnits(playerAssetsNearby) + if playerAssetValue > highestAssetValue then + highestAssetValue = playerAssetValue + recipientPlayer = p + end + end) + + local baseActors = Map.ActorsInBox(base.TopLeft.CenterPosition, base.BottomRight.CenterPosition, function(a) + return not a.IsDead and (a.Owner == England or a.Type == "macs" or a.Type == "hosp") + end) + + if base.Name == "McvBase" and not AlliedMcv.IsDead then + local otherMcvPlayers = Utils.Where(GetMcvPlayers(), function(p) return p ~= recipientPlayer end) + Utils.Do(otherMcvPlayers, function(p) + local mcv = Actor.Create("mcv", true, { Owner = p, Location = AlliedMcv.Location }) + mcv.Scatter() + end) + end + + Utils.Do(baseActors, function(a) + a.Owner = recipientPlayer + end) + + CACoopQueueSyncer() +end + +DoMcvArrival = function() + local delay = 0 + Utils.Do(GetMcvPlayers(), function(p) + Trigger.AfterDelay(delay, function() + Reinforcements.Reinforce(p, { "lst.mcv" }, { McvSpawn.Location, McvDest.Location }) + end) + delay = delay + DateTime.Seconds(3) + end) +end diff --git a/mods/ca/missions/coop-campaign/ca48-banishment-coop/map.bin b/mods/ca/missions/coop-campaign/ca48-banishment-coop/map.bin new file mode 100644 index 0000000000..58833d0e21 Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca48-banishment-coop/map.bin differ diff --git a/mods/ca/missions/coop-campaign/ca48-banishment-coop/map.png b/mods/ca/missions/coop-campaign/ca48-banishment-coop/map.png new file mode 100644 index 0000000000..c8b109332b Binary files /dev/null and b/mods/ca/missions/coop-campaign/ca48-banishment-coop/map.png differ diff --git a/mods/ca/missions/coop-campaign/ca48-banishment-coop/map.yaml b/mods/ca/missions/coop-campaign/ca48-banishment-coop/map.yaml new file mode 100644 index 0000000000..7d67772c92 --- /dev/null +++ b/mods/ca/missions/coop-campaign/ca48-banishment-coop/map.yaml @@ -0,0 +1,8506 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 48: Banishment Co-op + +Author: Darkademic & Gandorques Hikla + +Tileset: TEMPERAT + +MapSize: 194,194 + +Bounds: 1,1,192,192 + +Visibility: Lobby + +Categories: Co-op Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: Greece, MaleficScrin, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + PlayerReference@Greece: + Name: Greece + Faction: allies + Color: 99ACF2 + Allies: Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: MaleficScrin, Creeps + PlayerReference@MaleficScrin: + Name: MaleficScrin + Bot: campaign + Faction: scrin + Color: 3E4549 + Enemies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5, Creeps + PlayerReference@England: + Name: England + NonCombatant: True + Faction: allies + Color: A1EF8C + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 99ACF2 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: MaleficScrin, Creeps + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 0B7310 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: MaleficScrin, Creeps + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 134691 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: MaleficScrin, Creeps + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 775A12 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: MaleficScrin, Creeps + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: 994050 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: MaleficScrin, Creeps + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockFaction: True + LockSpawn: True + LockTeam: True + Team: 1 + Faction: allies + Color: EEA8A8 + LockColor: True + Allies: Greece, Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + Enemies: MaleficScrin, Creeps + +Actors: + Actor0: split2 + Owner: Neutral + Location: 81,140 + Actor1: split2 + Owner: Neutral + Location: 87,142 + Actor2: split2 + Owner: Neutral + Location: 83,149 + Actor3: sbag + Owner: England + Location: 75,150 + Actor4: sbag + Owner: England + Location: 76,150 + Actor5: sbag + Owner: England + Location: 76,149 + Health: 36 + Actor6: sbag + Owner: England + Location: 76,148 + Actor7: sbag + Owner: England + Location: 74,150 + Health: 10 + Actor8: sbag + Owner: England + Location: 73,150 + Health: 28 + Actor9: sbag + Owner: England + Location: 72,150 + Health: 30 + Actor10: sbag + Owner: England + Location: 72,149 + Actor11: sbag + Owner: England + Location: 72,148 + Actor12: sbag + Owner: England + Location: 71,148 + Actor13: sbag + Owner: England + Location: 71,147 + Health: 18 + Actor24: brik + Owner: England + Location: 74,140 + Actor25: brik + Owner: England + Location: 74,139 + Actor26: brik + Owner: England + Location: 73,140 + Actor27: brik + Owner: England + Location: 73,139 + Actor40: brik + Owner: England + Location: 82,121 + Actor41: brik + Owner: England + Location: 83,121 + Actor42: brik + Owner: England + Location: 83,122 + Actor43: brik + Owner: England + Location: 82,122 + Actor44: brik + Owner: England + Location: 81,121 + Actor45: brik + Owner: England + Location: 81,120 + Actor46: brik + Owner: England + Location: 81,119 + Actor47: brik + Owner: England + Location: 81,118 + Actor48: brik + Owner: England + Location: 79,118 + Health: 33 + Actor49: brik + Owner: England + Location: 80,118 + Actor51: brik + Owner: England + Location: 77,118 + Health: 26 + Actor52: brik + Owner: England + Location: 76,118 + Actor53: brik + Owner: England + Location: 75,118 + Actor54: brik + Owner: England + Location: 75,119 + Actor55: brik + Owner: England + Location: 76,119 + Actor56: brik + Owner: England + Location: 69,118 + Actor57: brik + Owner: England + Location: 69,119 + Actor58: brik + Owner: England + Location: 68,118 + Actor59: brik + Owner: England + Location: 68,119 + Actor60: brik + Owner: England + Location: 67,118 + Actor61: brik + Owner: England + Location: 65,118 + Actor62: brik + Owner: England + Location: 66,118 + Actor63: brik + Owner: England + Location: 64,118 + Actor64: brik + Owner: England + Location: 64,119 + Actor65: brik + Owner: England + Location: 64,120 + Health: 67 + Actor66: brik + Owner: England + Location: 64,125 + Actor67: brik + Owner: England + Location: 64,124 + Actor68: brik + Owner: England + Location: 64,123 + Actor69: brik + Owner: England + Location: 64,122 + Actor70: brik + Owner: England + Location: 64,121 + Actor71: brik + Owner: England + Location: 65,125 + Actor72: brik + Owner: England + Location: 65,124 + Actor73: brik + Owner: England + Location: 64,130 + Actor74: brik + Owner: England + Location: 65,130 + Actor75: brik + Owner: England + Location: 64,131 + Actor76: brik + Owner: England + Location: 65,131 + Actor77: brik + Owner: England + Location: 64,132 + Actor78: brik + Owner: England + Location: 64,133 + Actor79: brik + Owner: England + Location: 64,134 + Actor80: brik + Owner: England + Location: 64,135 + Health: 46 + Actor81: brik + Owner: England + Location: 64,136 + Health: 28 + Actor82: brik + Owner: England + Location: 64,137 + Health: 16 + Actor83: brik + Owner: England + Location: 64,138 + Actor84: brik + Owner: England + Location: 64,139 + Actor85: brik + Owner: England + Location: 64,140 + Health: 34 + Actor86: brik + Owner: England + Location: 65,140 + Actor87: brik + Owner: England + Location: 68,140 + Health: 59 + Actor88: brik + Owner: England + Location: 72,140 + Health: 20 + Actor89: brik + Owner: England + Location: 70,140 + Health: 1 + Actor91: brik + Owner: England + Location: 69,140 + Actor92: brik + Owner: England + Location: 67,140 + Actor93: brik + Owner: England + Location: 66,140 + Health: 48 + Actor98: sbag + Owner: England + Location: 62,145 + Health: 35 + Actor99: sbag + Owner: England + Location: 62,144 + Actor100: sbag + Owner: England + Location: 61,144 + Actor101: sbag + Owner: England + Location: 61,143 + Actor102: sbag + Owner: England + Location: 60,143 + Actor103: sbag + Owner: England + Location: 60,142 + Health: 15 + Actor104: sbag + Owner: England + Location: 60,141 + Health: 31 + Actor105: sbag + Owner: England + Location: 70,147 + Actor106: sbag + Owner: England + Location: 64,147 + Actor107: sbag + Owner: England + Location: 65,147 + Actor108: sbag + Owner: England + Location: 63,147 + Actor109: sbag + Owner: England + Location: 62,147 + Health: 27 + Actor97: sbag + Owner: England + Location: 59,141 + Actor111: sbag + Owner: England + Location: 59,140 + Actor112: sbag + Owner: England + Location: 59,139 + Actor113: sbag + Owner: England + Location: 59,137 + Actor114: sbag + Owner: England + Location: 59,138 + Health: 25 + Actor115: sbag + Owner: England + Location: 59,136 + Actor119: apwr + Owner: England + Location: 65,137 + Health: 34 + Actor120: apwr + Owner: England + Location: 68,137 + Health: 46 + Actor121: apwr + Owner: England + Location: 65,134 + Health: 44 + Actor122: apwr + Owner: England + Location: 68,134 + Health: 24 + Actor123: gun + Owner: England + Location: 58,137 + TurretFacing: 192 + Health: 42 + Actor124: gun + Owner: England + Location: 70,148 + Health: 26 + TurretFacing: 531 + Actor125: gun + Owner: England + Location: 60,144 + TurretFacing: 192 + Health: 42 + Actor126: pbox + Owner: England + Location: 63,130 + Health: 22 + Actor127: pbox + Owner: England + Location: 63,125 + Health: 48 + Actor128: pbox + Owner: England + Location: 69,117 + Health: 37 + Actor129: pbox + Owner: England + Location: 75,117 + Health: 30 + Actor130: pbox + Owner: England + Location: 74,141 + Health: 43 + Actor131: silo + Owner: England + Location: 74,132 + Health: 24 + Actor132: silo + Owner: England + Location: 76,132 + Health: 34 + Actor134: agun + Owner: England + Location: 79,120 + Health: 28 + TurretFacing: 920 + Actor135: syrd + Owner: England + Location: 84,117 + Health: 24 + Actor136: pris + Owner: England + Location: 65,123 + Health: 37 + Actor137: pris + Owner: England + Location: 65,132 + Health: 36 + Actor138: pris + Owner: England + Location: 67,119 + Health: 33 + Actor139: pbox + Owner: England + Location: 64,148 + Health: 29 + Actor140: pbox + Owner: England + Location: 58,139 + Health: 33 + Actor141: brik + Owner: England + Location: 125,127 + Health: 56 + Actor143: brik + Owner: England + Location: 125,130 + Actor144: brik + Owner: England + Location: 125,129 + Health: 24 + Actor145: brik + Owner: England + Location: 125,131 + Actor146: brik + Owner: England + Location: 127,131 + Health: 39 + Actor147: brik + Owner: England + Location: 126,131 + Actor148: brik + Owner: England + Location: 128,131 + Actor149: brik + Owner: England + Location: 130,131 + Actor150: brik + Owner: England + Location: 129,131 + Actor151: brik + Owner: England + Location: 131,131 + Actor152: brik + Owner: England + Location: 132,130 + Health: 28 + Actor153: brik + Owner: England + Location: 131,130 + Actor154: brik + Owner: England + Location: 132,131 + Actor156: brik + Owner: England + Location: 137,130 + Actor158: brik + Owner: England + Location: 138,130 + Actor159: brik + Owner: England + Location: 138,131 + Actor160: brik + Owner: England + Location: 139,131 + Actor161: brik + Owner: England + Location: 140,131 + Actor155: brik + Owner: England + Location: 141,131 + Actor162: brik + Owner: England + Location: 142,131 + Actor163: brik + Owner: England + Location: 143,131 + Actor164: brik + Owner: England + Location: 143,130 + Actor165: brik + Owner: England + Location: 143,128 + Actor166: brik + Owner: England + Location: 143,129 + Health: 59 + Actor167: brik + Owner: England + Location: 143,127 + Actor168: brik + Owner: England + Location: 143,126 + Actor170: brik + Owner: England + Location: 143,125 + Actor173: brik + Owner: England + Location: 142,126 + Actor174: brik + Owner: England + Location: 142,125 + Health: 56 + Actor169: brik + Owner: England + Location: 125,125 + Actor171: brik + Owner: England + Location: 125,126 + Actor172: brik + Owner: England + Location: 126,126 + Actor175: brik + Owner: England + Location: 126,125 + Actor176: brik + Owner: England + Location: 142,120 + Actor177: brik + Owner: England + Location: 142,119 + Actor178: brik + Owner: England + Location: 143,120 + Actor179: brik + Owner: England + Location: 143,119 + Actor180: brik + Owner: England + Location: 143,118 + Actor181: brik + Owner: England + Location: 143,117 + Actor201: brik + Owner: England + Location: 125,117 + Actor202: brik + Owner: England + Location: 125,118 + Health: 46 + Actor203: brik + Owner: England + Location: 125,120 + Actor204: brik + Owner: England + Location: 126,120 + Health: 27 + Actor205: brik + Owner: England + Location: 125,119 + Actor206: brik + Owner: England + Location: 126,119 + Actor210: powr + Owner: England + Location: 126,128 + Health: 34 + Actor211: powr + Owner: England + Location: 141,128 + Health: 36 + Actor184: brik + Owner: England + Location: 131,116 + Actor185: brik + Owner: England + Location: 131,115 + Actor186: brik + Owner: England + Location: 130,115 + Actor187: brik + Owner: England + Location: 129,115 + Actor188: brik + Owner: England + Location: 128,115 + Actor192: brik + Owner: England + Location: 127,115 + Actor194: brik + Owner: England + Location: 126,115 + Actor195: brik + Owner: England + Location: 125,115 + Actor196: brik + Owner: England + Location: 125,116 + Actor197: brik + Owner: England + Location: 142,115 + Health: 24 + Actor198: brik + Owner: England + Location: 140,115 + Actor199: brik + Owner: England + Location: 141,115 + Actor200: brik + Owner: England + Location: 139,115 + Actor212: brik + Owner: England + Location: 138,115 + Actor213: brik + Owner: England + Location: 137,115 + Actor214: brik + Owner: England + Location: 137,116 + Health: 40 + Actor215: brik + Owner: England + Location: 138,116 + Actor216: brik + Owner: England + Location: 132,116 + Health: 21 + Actor217: brik + Owner: England + Location: 132,115 + Actor218: brik + Owner: England + Location: 143,116 + Actor219: brik + Owner: England + Location: 143,115 + Actor220: powr + Owner: England + Location: 141,116 + Health: 37 + Actor221: powr + Owner: England + Location: 126,116 + Health: 40 + Actor222: pbox + Owner: England + Location: 144,125 + Health: 44 + Actor223: pbox + Owner: England + Location: 144,120 + Health: 40 + Actor224: pbox + Owner: England + Location: 132,132 + Health: 36 + Actor225: pbox + Owner: England + Location: 137,132 + Health: 40 + Actor226: pbox + Owner: England + Location: 137,114 + Health: 39 + Actor227: pbox + Owner: England + Location: 132,114 + Health: 48 + Actor228: pris + Owner: England + Location: 139,130 + Health: 30 + Actor229: pris + Owner: England + Location: 130,130 + Health: 21 + Actor230: pris + Owner: England + Location: 139,116 + Health: 39 + Actor231: pris + Owner: England + Location: 130,116 + Health: 24 + Actor232: brik + Owner: England + Location: 79,58 + Actor233: brik + Owner: England + Location: 79,57 + Actor234: brik + Owner: England + Location: 78,57 + Actor235: brik + Owner: England + Location: 78,58 + Actor236: brik + Owner: England + Location: 76,57 + Actor237: brik + Owner: England + Location: 77,57 + Actor238: brik + Owner: England + Location: 75,57 + Actor239: brik + Owner: England + Location: 74,57 + Actor240: brik + Owner: England + Location: 74,58 + Actor241: brik + Owner: England + Location: 75,58 + Actor242: brik + Owner: England + Location: 69,57 + Actor243: brik + Owner: England + Location: 69,58 + Actor244: brik + Owner: England + Location: 68,58 + Actor245: brik + Owner: England + Location: 68,57 + Actor246: brik + Owner: England + Location: 67,57 + Actor247: brik + Owner: England + Location: 66,57 + Actor248: brik + Owner: England + Location: 65,57 + Actor249: brik + Owner: England + Location: 64,57 + Actor250: brik + Owner: England + Location: 64,58 + Actor252: brik + Owner: England + Location: 64,59 + Health: 32 + Actor254: brik + Owner: England + Location: 64,62 + Health: 15 + Actor255: brik + Owner: England + Location: 64,63 + Actor256: brik + Owner: England + Location: 64,64 + Actor257: brik + Owner: England + Location: 64,65 + Health: 20 + Actor259: brik + Owner: England + Location: 65,65 + Actor260: brik + Owner: England + Location: 65,64 + Health: 46 + Actor258: brik + Owner: England + Location: 64,70 + Actor261: brik + Owner: England + Location: 65,70 + Health: 60 + Actor262: brik + Owner: England + Location: 64,71 + Health: 33 + Actor263: brik + Owner: England + Location: 65,71 + Actor264: brik + Owner: England + Location: 64,72 + Health: 24 + Actor265: brik + Owner: England + Location: 64,73 + Actor266: brik + Owner: England + Location: 64,74 + Actor267: brik + Owner: England + Location: 65,75 + Actor268: brik + Owner: England + Location: 64,75 + Actor269: brik + Owner: England + Location: 67,75 + Actor270: brik + Owner: England + Location: 66,75 + Actor271: brik + Owner: England + Location: 69,75 + Actor272: brik + Owner: England + Location: 68,75 + Actor273: brik + Owner: England + Location: 69,74 + Actor274: brik + Owner: England + Location: 68,74 + Health: 30 + Actor275: brik + Owner: England + Location: 74,74 + Actor276: brik + Owner: England + Location: 74,75 + Actor277: brik + Owner: England + Location: 75,75 + Actor278: brik + Owner: England + Location: 75,74 + Actor279: brik + Owner: England + Location: 76,75 + Actor280: brik + Owner: England + Location: 77,75 + Actor281: brik + Owner: England + Location: 79,75 + Actor282: brik + Owner: England + Location: 80,75 + Actor283: brik + Owner: England + Location: 78,75 + Actor284: brik + Owner: England + Location: 80,74 + Actor285: brik + Owner: England + Location: 79,74 + Actor286: brik + Owner: England + Location: 131,67 + Actor287: brik + Owner: England + Location: 131,66 + Actor288: brik + Owner: England + Location: 132,66 + Actor289: brik + Owner: England + Location: 132,67 + Actor290: brik + Owner: England + Location: 131,65 + Actor291: brik + Owner: England + Location: 131,64 + Actor292: brik + Owner: England + Location: 131,63 + Actor293: brik + Owner: England + Location: 132,63 + Actor294: brik + Owner: England + Location: 131,62 + Actor295: brik + Owner: England + Location: 132,62 + Actor297: tent + Owner: England + Location: 130,119 + Health: 32 + Actor300: hpad + Owner: England + Location: 75,63 + Health: 42 + Actor301: hpad + Owner: England + Location: 78,63 + Health: 48 + Actor302: hpad + Owner: England + Location: 78,67 + Health: 40 + Actor305: chain + Owner: England + Location: 75,62 + Actor307: chain + Owner: England + Location: 74,63 + Health: 36 + Actor308: chain + Owner: England + Location: 74,64 + Actor310: chain + Owner: England + Location: 76,62 + Actor312: chain + Owner: England + Location: 78,62 + Actor313: chain + Owner: England + Location: 79,62 + Actor314: chain + Owner: England + Location: 80,62 + Actor315: chain + Owner: England + Location: 80,63 + Actor316: chain + Owner: England + Location: 80,64 + Actor317: chain + Owner: England + Location: 80,65 + Health: 34 + Actor110: sbag + Owner: England + Location: 62,146 + Health: 37 + Actor116: proc + Owner: England + Location: 74,132 + FreeActor@CHARV: False + FreeActor: False + Health: 46 + Actor157: brik + Owner: England + Location: 137,131 + Health: 31 + NWBaseCenter: waypoint + Owner: Neutral + Location: 73,66 + SEBaseCenter: waypoint + Owner: Neutral + Location: 134,122 + Actor324: brik + Owner: England + Location: 133,72 + Actor331: brik + Owner: England + Location: 134,72 + Actor332: brik + Owner: England + Location: 133,73 + Actor333: brik + Owner: England + Location: 134,73 + Actor334: brik + Owner: England + Location: 133,74 + Actor335: brik + Owner: England + Location: 134,75 + Actor336: brik + Owner: England + Location: 133,75 + Actor337: brik + Owner: England + Location: 135,75 + Actor338: brik + Owner: England + Location: 137,75 + Actor339: brik + Owner: England + Location: 136,75 + Actor340: brik + Owner: England + Location: 138,75 + Actor341: brik + Owner: England + Location: 139,75 + Actor342: brik + Owner: England + Location: 140,75 + Actor343: brik + Owner: England + Location: 141,75 + Actor344: brik + Owner: England + Location: 143,75 + Actor345: brik + Owner: England + Location: 142,75 + Actor346: brik + Owner: England + Location: 143,74 + Actor347: brik + Owner: England + Location: 144,74 + Actor348: brik + Owner: England + Location: 144,73 + Actor349: brik + Owner: England + Location: 143,73 + Actor350: brik + Owner: England + Location: 149,73 + Actor351: brik + Owner: England + Location: 149,74 + Actor352: brik + Owner: England + Location: 150,74 + Actor353: brik + Owner: England + Location: 150,73 + Actor354: brik + Owner: England + Location: 150,72 + Actor355: brik + Owner: England + Location: 150,71 + Actor356: brik + Owner: England + Location: 150,70 + Actor357: brik + Owner: England + Location: 150,69 + Actor358: brik + Owner: England + Location: 150,68 + Actor359: brik + Owner: England + Location: 149,68 + Actor360: brik + Owner: England + Location: 149,69 + Actor361: brik + Owner: England + Location: 149,63 + Actor362: brik + Owner: England + Location: 150,63 + Actor363: brik + Owner: England + Location: 149,62 + Actor364: brik + Owner: England + Location: 150,62 + Actor365: brik + Owner: England + Location: 150,61 + Actor366: brik + Owner: England + Location: 150,60 + Actor367: brik + Owner: England + Location: 150,59 + Actor368: brik + Owner: England + Location: 149,59 + Actor369: brik + Owner: England + Location: 148,59 + Actor370: brik + Owner: England + Location: 147,59 + Actor371: brik + Owner: England + Location: 146,59 + Actor372: brik + Owner: England + Location: 145,59 + Actor373: brik + Owner: England + Location: 144,59 + Actor374: brik + Owner: England + Location: 144,58 + Actor375: brik + Owner: England + Location: 144,57 + Actor376: brik + Owner: England + Location: 143,57 + Actor377: brik + Owner: England + Location: 142,56 + Actor378: brik + Owner: England + Location: 143,56 + Actor379: brik + Owner: England + Location: 141,56 + Actor380: brik + Owner: England + Location: 140,56 + Actor381: brik + Owner: England + Location: 139,56 + Actor382: brik + Owner: England + Location: 138,56 + Actor383: brik + Owner: England + Location: 136,56 + Actor384: brik + Owner: England + Location: 137,56 + Actor385: brik + Owner: England + Location: 135,56 + Actor386: brik + Owner: England + Location: 135,57 + Actor387: brik + Owner: England + Location: 134,57 + Actor388: brik + Owner: England + Location: 134,58 + Actor389: brik + Owner: England + Location: 133,58 + Actor390: brik + Owner: England + Location: 132,58 + Actor391: brik + Owner: England + Location: 132,59 + Actor392: brik + Owner: England + Location: 132,60 + Actor393: brik + Owner: England + Location: 132,61 + Actor394: apwr + Owner: England + Location: 136,57 + Health: 38 + Actor395: apwr + Owner: England + Location: 139,57 + Health: 40 + Actor396: apwr + Owner: England + Location: 139,72 + Health: 44 + Actor397: apwr + Owner: England + Location: 136,72 + Health: 44 + Actor399: proc + Owner: England + Location: 67,60 + Health: 39 + FreeActor@CHARV: False + FreeActor: False + Actor400: pbox + Owner: England + Location: 144,75 + Health: 42 + Actor401: pbox + Owner: England + Location: 149,75 + Health: 43 + Actor402: pbox + Owner: England + Location: 151,68 + Health: 37 + Actor403: pbox + Owner: England + Location: 151,63 + Health: 36 + Actor404: pbox + Owner: England + Location: 130,67 + Health: 34 + Actor405: pbox + Owner: England + Location: 132,72 + Health: 34 + Actor406: agun + Owner: England + Location: 140,69 + Health: 34 + TurretFacing: 422 + Actor407: agun + Owner: England + Location: 134,62 + Health: 38 + TurretFacing: 20 + Actor408: agun + Owner: England + Location: 147,61 + Health: 39 + TurretFacing: 832 + Actor409: gap + Owner: England + Location: 141,66 + Health: 37 + Actor411: pris + Owner: England + Location: 149,61 + Health: 44 + Actor412: pris + Owner: England + Location: 149,72 + Health: 43 + Actor413: pris + Owner: England + Location: 142,74 + Health: 44 + Actor414: pris + Owner: England + Location: 132,65 + Health: 25 + Actor415: pris + Owner: England + Location: 134,74 + Health: 42 + NEBaseCenter: waypoint + Owner: Neutral + Location: 142,66 + Actor416: powr + Owner: England + Location: 79,59 + Health: 34 + Actor417: powr + Owner: England + Location: 77,59 + Health: 38 + Actor418: powr + Owner: England + Location: 75,59 + Health: 30 + Actor419: pbox + Owner: England + Location: 69,76 + Health: 32 + Actor420: pbox + Owner: England + Location: 74,76 + Health: 37 + Actor421: pbox + Owner: England + Location: 63,65 + Health: 28 + Actor422: pbox + Owner: England + Location: 63,70 + Health: 34 + Actor423: pbox + Owner: England + Location: 69,56 + Health: 45 + Actor424: pbox + Owner: England + Location: 74,56 + Health: 46 + Actor429: split2 + Owner: Neutral + Location: 67,54 + Actor430: split2 + Owner: Neutral + Location: 66,49 + Actor432: split2 + Owner: Neutral + Location: 154,59 + Actor433: split2 + Owner: Neutral + Location: 159,57 + Actor434: split2 + Owner: Neutral + Location: 147,117 + Actor435: split2 + Owner: Neutral + Location: 153,119 + Actor428: split2 + Owner: Neutral + Location: 76,52 + Actor431: split2 + Owner: Neutral + Location: 79,49 + Actor436: powr + Owner: England + Location: 65,72 + Health: 36 + Actor437: chain + Owner: England + Location: 80,69 + Health: 13 + Actor438: chain + Owner: England + Location: 80,68 + Actor440: apwr + Owner: England + Location: 128,124 + Health: 46 + Actor442: harv + Owner: England + Location: 72,135 + Facing: 497 + Health: 48 + Actor443: harv + Owner: England + Location: 142,121 + Facing: 252 + Health: 36 + Actor445: harv + Owner: England + Location: 73,61 + Facing: 504 + Health: 41 + Actor446: e3 + Owner: Greece + SubCell: 5 + Facing: 768 + Location: 11,183 + Actor447: e3 + Owner: Greece + SubCell: 4 + Facing: 768 + Location: 11,183 + Actor448: e3 + Owner: Greece + SubCell: 2 + Facing: 768 + Location: 11,183 + Actor449: e3 + Owner: Greece + SubCell: 1 + Facing: 768 + Location: 11,183 + Actor450: medi + Owner: Greece + SubCell: 3 + Facing: 768 + Location: 9,183 + Actor451: e1 + Owner: Greece + SubCell: 2 + Facing: 768 + Location: 17,183 + Actor452: e1 + Owner: Greece + SubCell: 4 + Facing: 768 + Location: 17,183 + Actor453: e1 + Owner: Greece + SubCell: 1 + Facing: 768 + Location: 17,183 + Actor454: e1 + Owner: Greece + SubCell: 5 + Facing: 768 + Location: 17,183 + Actor455: e1 + Owner: Greece + SubCell: 1 + Facing: 768 + Location: 15,183 + Actor456: e1 + Owner: Greece + SubCell: 1 + Facing: 768 + Location: 13,183 + Actor457: e1 + Owner: Greece + SubCell: 2 + Facing: 768 + Location: 13,183 + Actor458: e1 + Owner: Greece + SubCell: 4 + Facing: 768 + Location: 13,183 + Actor459: e1 + Owner: Greece + SubCell: 5 + Facing: 768 + Location: 13,183 + Actor460: e1 + Owner: Greece + SubCell: 2 + Facing: 768 + Location: 15,183 + Actor461: e1 + Owner: Greece + SubCell: 4 + Facing: 768 + Location: 15,183 + Actor462: e1 + Owner: Greece + SubCell: 5 + Facing: 768 + Location: 15,183 + Actor464: ptnk + Owner: Greece + Facing: 768 + Location: 8,185 + Actor465: arty + Owner: Greece + Facing: 768 + Location: 6,185 + Actor467: ptnk + Owner: Greece + Facing: 768 + Location: 8,187 + Actor468: arty + Owner: Greece + Facing: 768 + Location: 6,187 + Actor469: e3 + Owner: Greece + SubCell: 5 + Facing: 768 + Location: 11,189 + Actor470: e3 + Owner: Greece + SubCell: 4 + Facing: 768 + Location: 11,189 + Actor471: e3 + Owner: Greece + SubCell: 2 + Facing: 768 + Location: 11,189 + Actor472: e3 + Owner: Greece + SubCell: 1 + Facing: 768 + Location: 11,189 + Actor474: medi + Owner: Greece + SubCell: 3 + Facing: 768 + Location: 9,189 + Actor475: e1 + Owner: Greece + SubCell: 5 + Facing: 768 + Location: 17,189 + Actor476: e1 + Owner: Greece + SubCell: 4 + Facing: 768 + Location: 17,189 + Actor489: e1 + Owner: Greece + SubCell: 2 + Facing: 768 + Location: 17,189 + Actor494: jeep + Owner: Greece + Facing: 768 + Location: 18,187 + Actor495: e1 + Owner: Greece + SubCell: 1 + Facing: 768 + Location: 15,189 + Actor496: e1 + Owner: Greece + SubCell: 1 + Facing: 768 + Location: 13,189 + Actor497: e1 + Owner: Greece + SubCell: 2 + Facing: 768 + Location: 13,189 + Actor498: e1 + Owner: Greece + SubCell: 4 + Facing: 768 + Location: 13,189 + Actor499: e1 + Owner: Greece + SubCell: 5 + Facing: 768 + Location: 13,189 + Actor500: e1 + Owner: Greece + SubCell: 2 + Facing: 768 + Location: 15,189 + Actor501: e1 + Owner: Greece + SubCell: 4 + Facing: 768 + Location: 15,189 + Actor503: 2tnk + Owner: Greece + Facing: 768 + Location: 14,187 + Actor504: 2tnk + Owner: Greece + Facing: 768 + Location: 16,187 + Actor505: e1 + Owner: Greece + SubCell: 5 + Facing: 768 + Location: 15,189 + Actor506: jeep + Owner: Greece + Location: 18,185 + Facing: 768 + Actor507: 2tnk + Owner: Greece + Facing: 768 + Location: 14,185 + Actor508: 2tnk + Owner: Greece + Facing: 768 + Location: 16,185 + Actor510: e1 + Owner: Greece + SubCell: 1 + Facing: 768 + Location: 17,189 + Actor481: chain + Owner: England + Location: 104,162 + Actor482: chain + Owner: England + Location: 105,162 + Actor483: chain + Owner: England + Location: 106,162 + Actor484: chain + Owner: England + Location: 111,162 + Actor485: chain + Owner: England + Location: 110,162 + Actor486: chain + Owner: England + Location: 112,162 + Actor487: chain + Owner: England + Location: 113,162 + Actor491: chain + Owner: England + Location: 113,161 + Actor492: chain + Owner: England + Location: 113,159 + Actor493: chain + Owner: England + Location: 113,160 + Actor511: chain + Owner: England + Location: 113,158 + Actor512: chain + Owner: England + Location: 113,156 + Actor513: chain + Owner: England + Location: 113,157 + Actor514: chain + Owner: England + Location: 113,155 + Actor515: chain + Owner: England + Location: 113,154 + Actor516: chain + Owner: England + Location: 113,153 + Actor517: chain + Owner: England + Location: 113,152 + Actor518: chain + Owner: England + Location: 111,152 + Actor519: chain + Owner: England + Location: 110,152 + Actor520: chain + Owner: England + Location: 112,152 + Actor521: chain + Owner: England + Location: 104,161 + Actor488: brl3 + Owner: Neutral + Location: 110,161 + Actor490: barl + Owner: Neutral + Location: 111,160 + Actor522: brl3 + Owner: Neutral + Location: 112,157 + Actor523: barl + Owner: Neutral + Location: 112,158 + Actor524: medi + Owner: Greece + SubCell: 3 + Facing: 768 + Location: 8,183 + Actor525: medi + Owner: Greece + SubCell: 3 + Facing: 768 + Location: 8,189 + Actor527: chain + Owner: England + Location: 134,166 + Actor528: chain + Owner: England + Location: 134,165 + Actor529: chain + Owner: England + Location: 134,164 + Actor531: chain + Owner: England + Location: 134,170 + Actor532: chain + Owner: England + Location: 134,171 + Actor530: chain + Owner: England + Location: 134,172 + Actor533: chain + Owner: England + Location: 138,172 + Actor534: chain + Owner: England + Location: 137,172 + Actor535: chain + Owner: England + Location: 136,172 + Actor536: chain + Owner: England + Location: 135,172 + Actor537: chain + Owner: England + Location: 135,164 + Actor538: chain + Owner: England + Location: 136,164 + Actor539: chain + Owner: England + Location: 137,164 + Actor540: chain + Owner: England + Location: 138,164 + Actor541: chain + Owner: England + Location: 140,164 + Actor542: chain + Owner: England + Location: 139,164 + Actor543: chain + Owner: England + Location: 141,164 + Actor544: chain + Owner: England + Location: 142,164 + Actor545: chain + Owner: England + Location: 143,164 + Actor546: chain + Owner: England + Location: 143,165 + Actor547: chain + Owner: England + Location: 143,166 + Actor549: chain + Owner: England + Location: 143,168 + Actor550: chain + Owner: England + Location: 143,169 + Actor551: chain + Owner: England + Location: 143,170 + Actor552: chain + Owner: England + Location: 143,171 + Actor553: chain + Owner: England + Location: 143,172 + Actor554: chain + Owner: England + Location: 142,172 + Actor555: chain + Owner: England + Location: 141,172 + Actor556: chain + Owner: England + Location: 140,172 + Actor557: chain + Owner: England + Location: 139,172 + Actor558: hbox + Owner: England + Location: 133,166 + Health: 30 + Actor559: hbox + Owner: England + Location: 133,170 + Health: 20 + Hospital: hosp + Location: 71,98 + Owner: Neutral + Health: 41 + Actor569: stlk + Owner: MaleficScrin + Location: 30,190 + SubCell: 3 + Facing: 256 + Actor577: swal + Owner: MaleficScrin + Location: 145,1 + Actor578: swal + Owner: MaleficScrin + Location: 146,1 + Actor579: swal + Owner: MaleficScrin + Location: 147,1 + Actor580: swal + Owner: MaleficScrin + Location: 149,1 + Actor581: swal + Owner: MaleficScrin + Location: 148,1 + Actor582: swal + Owner: MaleficScrin + Location: 150,1 + Actor583: swal + Owner: MaleficScrin + Location: 151,1 + Actor584: swal + Owner: MaleficScrin + Location: 152,1 + Actor585: swal + Owner: MaleficScrin + Location: 153,1 + Actor586: swal + Owner: MaleficScrin + Location: 155,1 + Actor587: swal + Owner: MaleficScrin + Location: 154,1 + Actor588: swal + Owner: MaleficScrin + Location: 156,1 + Actor589: swal + Owner: MaleficScrin + Location: 157,1 + Actor590: swal + Owner: MaleficScrin + Location: 159,1 + Actor591: swal + Owner: MaleficScrin + Location: 158,1 + Actor592: swal + Owner: MaleficScrin + Location: 144,1 + Actor593: swal + Owner: MaleficScrin + Location: 143,1 + Actor594: swal + Owner: MaleficScrin + Location: 160,1 + Actor595: swal + Owner: MaleficScrin + Location: 161,1 + Actor597: rea2 + Owner: MaleficScrin + Location: 147,2 + Actor598: rea2 + Owner: MaleficScrin + Location: 155,2 + Actor599: rea2 + Owner: MaleficScrin + Location: 158,2 + Actor600: rea2 + Owner: MaleficScrin + Location: 144,2 + Actor604: nerv + Owner: MaleficScrin + Location: 150,6 + Actor605: scrt + Owner: MaleficScrin + Location: 153,6 + Actor608: sign + Owner: MaleficScrin + Location: 161,2 + Actor611: mani + Owner: MaleficScrin + Location: 160,6 + Actor612: rfgn + Owner: MaleficScrin + Location: 141,3 + Actor613: swal + Owner: MaleficScrin + Location: 142,1 + Actor614: swal + Owner: MaleficScrin + Location: 140,1 + Actor615: swal + Owner: MaleficScrin + Location: 141,1 + Actor616: swal + Owner: MaleficScrin + Location: 139,1 + Actor617: swal + Owner: MaleficScrin + Location: 138,1 + Actor618: swal + Owner: MaleficScrin + Location: 137,1 + Actor619: swal + Owner: MaleficScrin + Location: 137,2 + Actor620: swal + Owner: MaleficScrin + Location: 137,3 + Actor621: swal + Owner: MaleficScrin + Location: 137,4 + Actor622: swal + Owner: MaleficScrin + Location: 137,5 + Actor623: swal + Owner: MaleficScrin + Location: 137,6 + Actor624: swal + Owner: MaleficScrin + Location: 137,7 + Actor625: swal + Owner: MaleficScrin + Location: 137,8 + Actor626: swal + Owner: MaleficScrin + Location: 137,9 + Actor627: swal + Owner: MaleficScrin + Location: 138,9 + Actor628: swal + Owner: MaleficScrin + Location: 138,8 + Actor629: swal + Owner: MaleficScrin + Location: 136,8 + Actor630: swal + Owner: MaleficScrin + Location: 136,7 + Actor631: swal + Owner: MaleficScrin + Location: 164,1 + Actor632: swal + Owner: MaleficScrin + Location: 162,1 + Actor633: swal + Owner: MaleficScrin + Location: 163,1 + Actor634: swal + Owner: MaleficScrin + Location: 165,1 + Actor635: swal + Owner: MaleficScrin + Location: 166,1 + Actor636: swal + Owner: MaleficScrin + Location: 167,1 + Actor637: swal + Owner: MaleficScrin + Location: 167,3 + Actor638: swal + Owner: MaleficScrin + Location: 167,2 + Actor639: swal + Owner: MaleficScrin + Location: 167,4 + Actor640: swal + Owner: MaleficScrin + Location: 167,5 + Actor641: swal + Owner: MaleficScrin + Location: 167,6 + Actor642: swal + Owner: MaleficScrin + Location: 167,7 + Actor644: swal + Owner: MaleficScrin + Location: 168,7 + Actor645: swal + Owner: MaleficScrin + Location: 168,8 + Actor646: swal + Owner: MaleficScrin + Location: 167,8 + Actor647: swal + Owner: MaleficScrin + Location: 166,8 + Actor648: swal + Owner: MaleficScrin + Location: 166,9 + Actor649: swal + Owner: MaleficScrin + Location: 167,9 + Actor643: swal + Owner: MaleficScrin + Location: 146,19 + Actor650: swal + Owner: MaleficScrin + Location: 146,18 + Actor651: swal + Owner: MaleficScrin + Location: 147,19 + Actor652: swal + Owner: MaleficScrin + Location: 147,18 + Actor653: swal + Owner: MaleficScrin + Location: 148,19 + Actor654: swal + Owner: MaleficScrin + Location: 148,20 + Actor655: swal + Owner: MaleficScrin + Location: 147,20 + Actor656: swal + Owner: MaleficScrin + Location: 149,20 + Actor657: swal + Owner: MaleficScrin + Location: 148,21 + Actor658: swal + Owner: MaleficScrin + Location: 149,21 + Actor659: swal + Owner: MaleficScrin + Location: 150,21 + Actor660: swal + Owner: MaleficScrin + Location: 151,21 + Actor661: swal + Owner: MaleficScrin + Location: 153,21 + Actor662: swal + Owner: MaleficScrin + Location: 152,21 + Actor663: swal + Owner: MaleficScrin + Location: 154,21 + Actor664: swal + Owner: MaleficScrin + Location: 156,21 + Actor665: swal + Owner: MaleficScrin + Location: 155,21 + Actor666: swal + Owner: MaleficScrin + Location: 157,21 + Actor667: swal + Owner: MaleficScrin + Location: 157,20 + Actor668: swal + Owner: MaleficScrin + Location: 158,20 + Actor669: swal + Owner: MaleficScrin + Location: 158,21 + Actor670: swal + Owner: MaleficScrin + Location: 158,19 + Actor671: swal + Owner: MaleficScrin + Location: 159,20 + Actor672: swal + Owner: MaleficScrin + Location: 159,19 + Actor673: swal + Owner: MaleficScrin + Location: 159,18 + Actor674: swal + Owner: MaleficScrin + Location: 160,18 + Actor675: swal + Owner: MaleficScrin + Location: 160,19 + Actor676: swal + Owner: MaleficScrin + Location: 163,15 + Actor677: swal + Owner: MaleficScrin + Location: 163,14 + Actor678: swal + Owner: MaleficScrin + Location: 164,14 + Actor679: swal + Owner: MaleficScrin + Location: 164,15 + Actor680: swal + Owner: MaleficScrin + Location: 164,13 + Actor681: swal + Owner: MaleficScrin + Location: 165,14 + Actor682: swal + Owner: MaleficScrin + Location: 165,13 + Actor683: swal + Owner: MaleficScrin + Location: 140,14 + Actor684: swal + Owner: MaleficScrin + Location: 140,15 + Actor685: swal + Owner: MaleficScrin + Location: 141,14 + Actor686: swal + Owner: MaleficScrin + Location: 141,15 + Actor690: swal + Owner: MaleficScrin + Location: 139,14 + Actor691: swal + Owner: MaleficScrin + Location: 139,13 + Actor692: swal + Owner: MaleficScrin + Location: 140,13 + Actor687: shar + Owner: MaleficScrin + Location: 151,19 + Actor688: shar + Owner: MaleficScrin + Location: 155,19 + Actor689: shar + Owner: MaleficScrin + Location: 141,9 + Actor694: shar + Owner: MaleficScrin + Location: 166,3 + Actor695: shar + Owner: MaleficScrin + Location: 138,3 + Actor696: scol + Owner: MaleficScrin + Location: 149,19 + Actor697: scol + Owner: MaleficScrin + Location: 148,18 + ScriptTags: HardAndAbove + Actor698: scol + Owner: MaleficScrin + Location: 157,19 + Actor699: scol + Owner: MaleficScrin + Location: 158,18 + ScriptTags: HardAndAbove + Actor700: scol + Owner: MaleficScrin + Location: 141,13 + Actor701: scol + Owner: MaleficScrin + Location: 163,13 + Actor702: scol + Owner: MaleficScrin + Location: 166,7 + Actor703: scol + Owner: MaleficScrin + Location: 138,7 + Actor704: ptur + Owner: MaleficScrin + Location: 147,21 + TurretFacing: 552 + Actor705: ptur + Owner: MaleficScrin + Location: 139,15 + TurretFacing: 395 + Actor706: ptur + Owner: MaleficScrin + Location: 165,15 + TurretFacing: 606 + Actor707: ptur + Owner: MaleficScrin + Location: 160,20 + TurretFacing: 545 + Actor708: ptur + Owner: MaleficScrin + Location: 146,20 + TurretFacing: 511 + Actor709: ptur + Owner: MaleficScrin + Location: 159,21 + TurretFacing: 470 + Actor710: ptur + Owner: MaleficScrin + Location: 168,9 + TurretFacing: 538 + Actor711: ptur + Owner: MaleficScrin + Location: 136,9 + TurretFacing: 497 + Actor712: reac + Owner: MaleficScrin + Location: 143,7 + Actor603: srep + Owner: MaleficScrin + Location: 151,10 + Actor713: swal + Owner: MaleficScrin + Location: 168,1 + Actor714: swal + Owner: MaleficScrin + Location: 170,1 + Actor715: swal + Owner: MaleficScrin + Location: 169,1 + Actor716: swal + Owner: MaleficScrin + Location: 171,1 + Actor717: swal + Owner: MaleficScrin + Location: 172,1 + Actor718: swal + Owner: MaleficScrin + Location: 174,1 + Actor719: swal + Owner: MaleficScrin + Location: 173,1 + Actor720: swal + Owner: MaleficScrin + Location: 175,1 + Actor721: swal + Owner: MaleficScrin + Location: 177,1 + Actor722: swal + Owner: MaleficScrin + Location: 176,1 + Actor723: swal + Owner: MaleficScrin + Location: 178,1 + Actor724: swal + Owner: MaleficScrin + Location: 178,2 + Actor725: swal + Owner: MaleficScrin + Location: 178,3 + Actor726: swal + Owner: MaleficScrin + Location: 178,4 + Actor727: swal + Owner: MaleficScrin + Location: 178,5 + Actor728: swal + Owner: MaleficScrin + Location: 178,7 + Actor729: swal + Owner: MaleficScrin + Location: 178,6 + Actor730: swal + Owner: MaleficScrin + Location: 178,8 + Actor731: swal + Owner: MaleficScrin + Location: 177,8 + Actor733: swal + Owner: MaleficScrin + Location: 175,8 + Actor734: swal + Owner: MaleficScrin + Location: 176,9 + Actor735: swal + Owner: MaleficScrin + Location: 176,8 + Actor736: swal + Owner: MaleficScrin + Location: 175,9 + Actor737: swal + Owner: MaleficScrin + Location: 177,9 + Actor738: swal + Owner: MaleficScrin + Location: 174,9 + Actor739: swal + Owner: MaleficScrin + Location: 174,10 + Actor740: swal + Owner: MaleficScrin + Location: 175,10 + Actor741: swal + Owner: MaleficScrin + Location: 173,10 + Actor742: swal + Owner: MaleficScrin + Location: 173,11 + Actor743: swal + Owner: MaleficScrin + Location: 172,11 + Actor744: swal + Owner: MaleficScrin + Location: 172,10 + Actor746: rea2 + Owner: MaleficScrin + Location: 175,2 + Actor747: rea2 + Owner: MaleficScrin + Location: 172,2 + Actor748: rea2 + Owner: MaleficScrin + Location: 169,2 + Actor749: rea2 + Owner: MaleficScrin + Location: 172,5 + Actor750: rea2 + Owner: MaleficScrin + Location: 169,5 + Actor751: rea2 + Owner: MaleficScrin + Location: 175,5 + Actor732: swal + Owner: MaleficScrin + Location: 168,5 + Actor745: swal + Owner: MaleficScrin + Location: 168,6 + Actor752: swal + Owner: MaleficScrin + Location: 168,4 + Actor753: swal + Owner: MaleficScrin + Location: 168,3 + Actor754: swal + Owner: MaleficScrin + Location: 168,2 + Actor755: ptur + Owner: MaleficScrin + Location: 173,12 + TurretFacing: 566 + Actor756: proc.scrin + Owner: MaleficScrin + Location: 162,8 + Actor757: shar + Owner: MaleficScrin + Location: 162,14 + Actor758: shar + Owner: MaleficScrin + Location: 173,9 + Actor759: split2 + Owner: Neutral + Location: 171,16 + Actor760: split2 + Owner: Neutral + Location: 166,20 + Actor761: split2 + Owner: Neutral + Location: 177,15 + Actor762: swal + Owner: MaleficScrin + Location: 179,161 + Actor763: swal + Owner: MaleficScrin + Location: 179,162 + Actor764: swal + Owner: MaleficScrin + Location: 180,162 + Actor765: swal + Owner: MaleficScrin + Location: 180,161 + Actor766: swal + Owner: MaleficScrin + Location: 179,160 + Actor767: swal + Owner: MaleficScrin + Location: 178,160 + Actor768: swal + Owner: MaleficScrin + Location: 178,161 + Actor769: swal + Owner: MaleficScrin + Location: 178,159 + Actor770: swal + Owner: MaleficScrin + Location: 178,157 + Actor771: swal + Owner: MaleficScrin + Location: 178,158 + Actor772: swal + Owner: MaleficScrin + Location: 178,156 + Actor773: swal + Owner: MaleficScrin + Location: 178,154 + Actor774: swal + Owner: MaleficScrin + Location: 178,155 + Actor775: swal + Owner: MaleficScrin + Location: 179,154 + Actor776: swal + Owner: MaleficScrin + Location: 179,155 + Actor777: swal + Owner: MaleficScrin + Location: 179,153 + Actor778: swal + Owner: MaleficScrin + Location: 180,154 + Actor779: swal + Owner: MaleficScrin + Location: 180,153 + Actor780: swal + Owner: MaleficScrin + Location: 179,148 + Actor781: swal + Owner: MaleficScrin + Location: 179,147 + Actor782: swal + Owner: MaleficScrin + Location: 180,148 + Actor783: swal + Owner: MaleficScrin + Location: 180,147 + Actor784: swal + Owner: MaleficScrin + Location: 180,146 + Actor785: swal + Owner: MaleficScrin + Location: 180,145 + Actor786: swal + Owner: MaleficScrin + Location: 180,144 + Actor787: swal + Owner: MaleficScrin + Location: 180,143 + Actor788: swal + Owner: MaleficScrin + Location: 181,143 + Actor789: swal + Owner: MaleficScrin + Location: 181,142 + Actor790: swal + Owner: MaleficScrin + Location: 182,142 + Actor791: swal + Owner: MaleficScrin + Location: 182,143 + Actor792: swal + Owner: MaleficScrin + Location: 183,142 + Actor793: swal + Owner: MaleficScrin + Location: 183,143 + Actor794: swal + Owner: MaleficScrin + Location: 184,143 + Actor795: swal + Owner: MaleficScrin + Location: 185,143 + Actor796: swal + Owner: MaleficScrin + Location: 186,142 + Actor797: swal + Owner: MaleficScrin + Location: 186,143 + Actor798: swal + Owner: MaleficScrin + Location: 188,142 + Actor799: swal + Owner: MaleficScrin + Location: 187,142 + Actor800: swal + Owner: MaleficScrin + Location: 189,142 + Actor801: swal + Owner: MaleficScrin + Location: 190,142 + Actor802: swal + Owner: MaleficScrin + Location: 190,141 + Actor806: swal + Owner: MaleficScrin + Location: 192,141 + Actor807: swal + Owner: MaleficScrin + Location: 191,141 + Actor808: swal + Owner: MaleficScrin + Location: 191,142 + Actor809: swal + Owner: MaleficScrin + Location: 192,142 + Actor810: swal + Owner: MaleficScrin + Location: 192,143 + Actor803: swal + Owner: MaleficScrin + Location: 192,144 + Actor804: swal + Owner: MaleficScrin + Location: 192,146 + Actor805: swal + Owner: MaleficScrin + Location: 192,145 + Actor811: swal + Owner: MaleficScrin + Location: 192,147 + Actor812: swal + Owner: MaleficScrin + Location: 192,148 + Actor815: swal + Owner: MaleficScrin + Location: 192,162 + Actor816: swal + Owner: MaleficScrin + Location: 191,162 + Actor817: swal + Owner: MaleficScrin + Location: 191,161 + Actor818: swal + Owner: MaleficScrin + Location: 192,161 + Actor819: swal + Owner: MaleficScrin + Location: 190,162 + Actor820: swal + Owner: MaleficScrin + Location: 189,162 + Actor821: swal + Owner: MaleficScrin + Location: 181,162 + Actor822: swal + Owner: MaleficScrin + Location: 182,162 + Actor823: swal + Owner: MaleficScrin + Location: 182,161 + Actor824: swal + Owner: MaleficScrin + Location: 183,161 + Actor825: swal + Owner: MaleficScrin + Location: 183,162 + Actor826: swal + Owner: MaleficScrin + Location: 189,161 + Actor827: swal + Owner: MaleficScrin + Location: 188,161 + Actor828: swal + Owner: MaleficScrin + Location: 188,162 + Actor813: swal + Owner: MaleficScrin + Location: 192,160 + Actor814: swal + Owner: MaleficScrin + Location: 192,158 + Actor829: swal + Owner: MaleficScrin + Location: 192,159 + Actor830: swal + Owner: MaleficScrin + Location: 192,157 + Actor831: swal + Owner: MaleficScrin + Location: 192,156 + Actor832: swal + Owner: MaleficScrin + Location: 192,155 + Actor833: swal + Owner: MaleficScrin + Location: 192,154 + Actor834: swal + Owner: MaleficScrin + Location: 192,152 + Actor835: swal + Owner: MaleficScrin + Location: 192,153 + Actor836: swal + Owner: MaleficScrin + Location: 192,151 + Actor837: swal + Owner: MaleficScrin + Location: 192,150 + Actor838: swal + Owner: MaleficScrin + Location: 192,149 + Actor842: rea2 + Owner: MaleficScrin + Location: 181,144 + Actor843: rea2 + Owner: MaleficScrin + Location: 184,144 + Actor847: ptur + Owner: MaleficScrin + Location: 182,163 + Actor848: ptur + Owner: MaleficScrin + Location: 189,163 + Actor849: ptur + Owner: MaleficScrin + Location: 178,153 + Actor850: ptur + Owner: MaleficScrin + Location: 178,148 + Actor851: scol + Owner: MaleficScrin + Location: 181,161 + ScriptTags: HardAndAbove + Actor852: scol + Owner: MaleficScrin + Location: 179,159 + ScriptTags: HardAndAbove + Actor853: scol + Owner: MaleficScrin + Location: 190,161 + Actor854: scol + Owner: MaleficScrin + Location: 181,148 + Actor844: rea2 + Owner: MaleficScrin + Location: 189,152 + Actor855: rea2 + Owner: MaleficScrin + Location: 189,149 + Actor856: srep + Owner: MaleficScrin + Location: 187,146 + Actor846: silo.scrin + Owner: MaleficScrin + Location: 191,148 + Actor857: silo.scrin + Owner: MaleficScrin + Location: 191,147 + Actor858: swal + Owner: MaleficScrin + Location: 3,89 + Actor859: swal + Owner: MaleficScrin + Location: 2,89 + Actor860: swal + Owner: MaleficScrin + Location: 1,89 + Actor861: swal + Owner: MaleficScrin + Location: 1,88 + Actor862: swal + Owner: MaleficScrin + Location: 1,86 + Actor863: swal + Owner: MaleficScrin + Location: 1,87 + Actor864: swal + Owner: MaleficScrin + Location: 1,85 + Actor865: swal + Owner: MaleficScrin + Location: 1,83 + Actor866: swal + Owner: MaleficScrin + Location: 1,84 + Actor867: swal + Owner: MaleficScrin + Location: 1,82 + Actor868: swal + Owner: MaleficScrin + Location: 1,81 + Actor869: swal + Owner: MaleficScrin + Location: 1,80 + Actor870: swal + Owner: MaleficScrin + Location: 1,78 + Actor871: swal + Owner: MaleficScrin + Location: 1,79 + Actor872: swal + Owner: MaleficScrin + Location: 1,77 + Actor873: swal + Owner: MaleficScrin + Location: 1,76 + Actor874: swal + Owner: MaleficScrin + Location: 1,75 + Actor875: swal + Owner: MaleficScrin + Location: 1,73 + Actor876: swal + Owner: MaleficScrin + Location: 1,74 + Actor877: swal + Owner: MaleficScrin + Location: 1,72 + Actor878: swal + Owner: MaleficScrin + Location: 1,71 + Actor879: swal + Owner: MaleficScrin + Location: 1,70 + Actor880: swal + Owner: MaleficScrin + Location: 1,69 + Actor882: rea2 + Owner: MaleficScrin + Location: 2,77 + Actor883: rea2 + Owner: MaleficScrin + Location: 2,80 + Actor884: rea2 + Owner: MaleficScrin + Location: 2,83 + Actor885: rea2 + Owner: MaleficScrin + Location: 6,83 + Actor886: rea2 + Owner: MaleficScrin + Location: 6,80 + Actor887: rea2 + Owner: MaleficScrin + Location: 6,77 + Actor888: swal + Owner: MaleficScrin + Location: 2,88 + Actor889: swal + Owner: MaleficScrin + Location: 4,89 + Actor890: swal + Owner: MaleficScrin + Location: 6,89 + Actor891: swal + Owner: MaleficScrin + Location: 5,89 + Actor892: swal + Owner: MaleficScrin + Location: 8,89 + Actor893: swal + Owner: MaleficScrin + Location: 7,89 + Actor894: swal + Owner: MaleficScrin + Location: 9,89 + Actor895: swal + Owner: MaleficScrin + Location: 11,89 + Actor896: swal + Owner: MaleficScrin + Location: 10,89 + Actor897: swal + Owner: MaleficScrin + Location: 11,88 + Actor898: swal + Owner: MaleficScrin + Location: 9,88 + Actor899: swal + Owner: MaleficScrin + Location: 10,88 + Actor900: swal + Owner: MaleficScrin + Location: 16,88 + Actor901: swal + Owner: MaleficScrin + Location: 16,89 + Actor902: swal + Owner: MaleficScrin + Location: 17,89 + Actor903: swal + Owner: MaleficScrin + Location: 17,88 + Actor904: swal + Owner: MaleficScrin + Location: 18,88 + Actor905: swal + Owner: MaleficScrin + Location: 18,89 + Actor906: swal + Owner: MaleficScrin + Location: 19,89 + Actor907: swal + Owner: MaleficScrin + Location: 21,89 + Actor908: swal + Owner: MaleficScrin + Location: 20,89 + Actor909: swal + Owner: MaleficScrin + Location: 21,88 + Actor910: swal + Owner: MaleficScrin + Location: 22,88 + Actor911: swal + Owner: MaleficScrin + Location: 22,89 + Actor912: swal + Owner: MaleficScrin + Location: 22,87 + Actor913: swal + Owner: MaleficScrin + Location: 23,88 + Actor914: swal + Owner: MaleficScrin + Location: 23,87 + Actor915: swal + Owner: MaleficScrin + Location: 23,86 + Actor916: swal + Owner: MaleficScrin + Location: 24,86 + Actor917: swal + Owner: MaleficScrin + Location: 24,87 + Actor918: swal + Owner: MaleficScrin + Location: 24,85 + Actor919: swal + Owner: MaleficScrin + Location: 24,83 + Actor920: swal + Owner: MaleficScrin + Location: 24,84 + Actor921: swal + Owner: MaleficScrin + Location: 24,82 + Actor922: swal + Owner: MaleficScrin + Location: 23,82 + Actor923: swal + Owner: MaleficScrin + Location: 23,83 + Actor924: swal + Owner: MaleficScrin + Location: 23,77 + Actor925: swal + Owner: MaleficScrin + Location: 23,76 + Actor926: swal + Owner: MaleficScrin + Location: 24,76 + Actor927: swal + Owner: MaleficScrin + Location: 24,77 + Actor928: swal + Owner: MaleficScrin + Location: 24,75 + Actor929: swal + Owner: MaleficScrin + Location: 24,74 + Actor930: swal + Owner: MaleficScrin + Location: 24,73 + Actor931: swal + Owner: MaleficScrin + Location: 24,71 + Actor932: swal + Owner: MaleficScrin + Location: 24,72 + Actor933: swal + Owner: MaleficScrin + Location: 23,71 + Actor934: swal + Owner: MaleficScrin + Location: 23,72 + Actor935: swal + Owner: MaleficScrin + Location: 22,70 + Actor936: swal + Owner: MaleficScrin + Location: 22,71 + Actor937: swal + Owner: MaleficScrin + Location: 23,70 + Actor938: swal + Owner: MaleficScrin + Location: 22,69 + Actor939: swal + Owner: MaleficScrin + Location: 21,69 + Actor940: swal + Owner: MaleficScrin + Location: 21,70 + Actor941: swal + Owner: MaleficScrin + Location: 20,69 + Actor942: swal + Owner: MaleficScrin + Location: 20,68 + Actor943: swal + Owner: MaleficScrin + Location: 21,68 + Actor944: swal + Owner: MaleficScrin + Location: 19,68 + Actor945: swal + Owner: MaleficScrin + Location: 18,68 + Actor946: swal + Owner: MaleficScrin + Location: 17,68 + Actor947: swal + Owner: MaleficScrin + Location: 16,68 + Actor948: swal + Owner: MaleficScrin + Location: 15,68 + Actor949: swal + Owner: MaleficScrin + Location: 14,69 + Actor950: swal + Owner: MaleficScrin + Location: 15,69 + Actor951: swal + Owner: MaleficScrin + Location: 14,68 + Actor952: swal + Owner: MaleficScrin + Location: 7,68 + Actor953: swal + Owner: MaleficScrin + Location: 7,69 + Actor954: swal + Owner: MaleficScrin + Location: 6,69 + Actor955: swal + Owner: MaleficScrin + Location: 6,68 + Actor956: swal + Owner: MaleficScrin + Location: 5,68 + Actor957: swal + Owner: MaleficScrin + Location: 4,68 + Actor958: swal + Owner: MaleficScrin + Location: 2,68 + Actor959: swal + Owner: MaleficScrin + Location: 1,68 + Actor960: swal + Owner: MaleficScrin + Location: 3,68 + Actor961: proc.scrin + Owner: MaleficScrin + Location: 15,82 + Actor965: nerv + Owner: MaleficScrin + Location: 10,79 + Actor966: scrt + Owner: MaleficScrin + Location: 2,69 + Actor967: scol + Owner: MaleficScrin + Location: 23,75 + Actor968: scol + Owner: MaleficScrin + Location: 23,84 + Actor969: scol + Owner: MaleficScrin + Location: 16,69 + Actor970: scol + Owner: MaleficScrin + Location: 19,88 + Actor971: scol + Owner: MaleficScrin + Location: 8,88 + Actor972: ptur + Owner: MaleficScrin + Location: 16,90 + TurretFacing: 484 + Actor973: ptur + Owner: MaleficScrin + Location: 11,90 + TurretFacing: 606 + Actor974: ptur + Owner: MaleficScrin + Location: 25,82 + TurretFacing: 702 + Actor975: ptur + Owner: MaleficScrin + Location: 25,77 + TurretFacing: 702 + Actor976: shar + Owner: MaleficScrin + Location: 21,87 + Actor977: shar + Owner: MaleficScrin + Location: 21,71 + Actor980: shar + Owner: MaleficScrin + Location: 3,88 + Actor981: shar + Owner: MaleficScrin + Location: 6,75 + Actor982: shar + Owner: MaleficScrin + Location: 13,80 + Actor984: srep + Owner: MaleficScrin + Location: 5,70 + Actor987: s1 + Owner: MaleficScrin + Facing: 384 + Location: 74,130 + SubCell: 3 + Actor988: s1 + Owner: MaleficScrin + Facing: 384 + Location: 77,130 + SubCell: 3 + Actor991: s1 + Owner: MaleficScrin + Location: 78,129 + SubCell: 3 + Facing: 211 + Actor992: s1 + Owner: MaleficScrin + Location: 67,131 + SubCell: 3 + Facing: 654 + Actor993: s1 + Owner: MaleficScrin + Facing: 384 + Location: 134,129 + SubCell: 3 + Actor994: s1 + Owner: MaleficScrin + Facing: 384 + Location: 132,128 + SubCell: 3 + Actor995: s1 + Owner: MaleficScrin + Facing: 384 + Location: 136,125 + SubCell: 3 + Actor996: s1 + Owner: MaleficScrin + Location: 135,127 + SubCell: 3 + Facing: 654 + Actor997: s1 + Owner: MaleficScrin + Facing: 384 + Location: 140,128 + SubCell: 3 + Actor998: s1 + Owner: MaleficScrin + Location: 141,123 + SubCell: 3 + Facing: 702 + Actor1000: gunw + Owner: MaleficScrin + Facing: 384 + Location: 134,126 + Actor1002: tpod + Owner: MaleficScrin + Location: 133,121 + Facing: 384 + ScriptTags: HardAndAbove + Actor1003: devo + Owner: MaleficScrin + Location: 107,159 + Facing: 525 + Actor1004: devo + Owner: MaleficScrin + Location: 109,158 + Facing: 504 + Actor1005: s4 + Owner: MaleficScrin + Facing: 384 + Location: 133,167 + SubCell: 3 + Actor1006: s4 + Owner: MaleficScrin + Facing: 384 + Location: 135,169 + SubCell: 3 + Actor1007: s1 + Owner: MaleficScrin + Facing: 384 + Location: 132,166 + SubCell: 3 + Actor1008: s1 + Owner: MaleficScrin + Facing: 384 + Location: 132,167 + SubCell: 3 + Actor1009: s1 + Owner: MaleficScrin + Facing: 384 + Location: 137,169 + SubCell: 3 + Actor1010: s3 + Owner: MaleficScrin + Facing: 384 + Location: 135,167 + SubCell: 3 + Actor1011: s3 + Owner: MaleficScrin + Facing: 384 + Location: 137,171 + SubCell: 3 + Actor1012: s3 + Owner: MaleficScrin + Facing: 384 + Location: 133,164 + SubCell: 3 + Actor1013: s3 + Owner: MaleficScrin + Location: 109,159 + SubCell: 3 + Facing: 518 + Actor1014: s3 + Owner: MaleficScrin + Location: 110,156 + SubCell: 3 + Facing: 716 + Actor1015: s3 + Owner: MaleficScrin + Location: 105,159 + SubCell: 3 + Facing: 668 + Actor1016: intl + Owner: MaleficScrin + Facing: 384 + Location: 179,164 + Actor1017: intl + Owner: MaleficScrin + Facing: 384 + Location: 176,161 + Actor1018: intl + Owner: MaleficScrin + Facing: 384 + Location: 174,150 + Actor1019: s1 + Owner: MaleficScrin + Facing: 384 + Location: 188,150 + SubCell: 3 + Actor1020: s1 + Owner: MaleficScrin + Facing: 384 + Location: 185,148 + SubCell: 3 + Actor1021: s1 + Owner: MaleficScrin + Facing: 384 + Location: 185,148 + SubCell: 1 + Actor1022: s1 + Owner: MaleficScrin + Facing: 384 + Location: 183,147 + SubCell: 3 + Actor1023: s1 + Owner: MaleficScrin + Facing: 384 + Location: 190,146 + SubCell: 3 + Actor1024: s1 + Owner: MaleficScrin + Facing: 384 + Location: 191,157 + SubCell: 3 + Actor1025: s3 + Owner: MaleficScrin + Facing: 384 + Location: 191,156 + SubCell: 3 + Actor1026: s3 + Owner: MaleficScrin + Facing: 384 + Location: 185,147 + SubCell: 3 + Actor1027: s3 + Owner: MaleficScrin + Facing: 384 + Location: 191,146 + SubCell: 3 + Actor1028: s3 + Owner: MaleficScrin + Facing: 384 + Location: 164,3 + SubCell: 3 + Actor1029: s3 + Owner: MaleficScrin + Location: 144,5 + SubCell: 3 + Facing: 654 + Actor1030: s3 + Owner: MaleficScrin + Location: 150,3 + SubCell: 3 + Facing: 668 + Actor1031: s3 + Owner: MaleficScrin + Facing: 384 + Location: 156,9 + SubCell: 3 + Actor1032: s3 + Owner: MaleficScrin + Facing: 384 + Location: 163,6 + SubCell: 3 + Actor1033: s3 + Owner: MaleficScrin + Location: 171,8 + SubCell: 3 + Facing: 384 + Actor1034: s3 + Owner: MaleficScrin + Facing: 384 + Location: 139,5 + SubCell: 3 + Actor1035: s1 + Owner: MaleficScrin + Facing: 384 + Location: 145,6 + SubCell: 3 + Actor1036: s1 + Owner: MaleficScrin + Facing: 384 + Location: 142,6 + SubCell: 3 + Actor1037: s1 + Owner: MaleficScrin + Facing: 384 + Location: 152,6 + SubCell: 3 + Actor1038: s1 + Owner: MaleficScrin + Location: 156,5 + SubCell: 3 + Facing: 586 + Actor1039: s1 + Owner: MaleficScrin + Facing: 384 + Location: 154,4 + SubCell: 3 + Actor1040: s1 + Owner: MaleficScrin + Location: 147,5 + SubCell: 3 + Facing: 709 + Actor1041: s1 + Owner: MaleficScrin + Location: 149,10 + SubCell: 3 + Facing: 668 + Actor1042: s1 + Owner: MaleficScrin + Location: 160,9 + SubCell: 3 + Facing: 566 + Actor1043: s1 + Owner: MaleficScrin + Facing: 384 + Location: 164,4 + SubCell: 3 + Actor1045: chain + Owner: England + Location: 74,102 + Actor1046: chain + Owner: England + Location: 69,102 + Health: 34 + Actor1047: chain + Owner: England + Location: 68,102 + Actor1048: chain + Owner: England + Location: 68,101 + Actor1049: chain + Owner: England + Location: 68,99 + Actor1050: chain + Owner: England + Location: 68,100 + Health: 38 + Actor1051: chain + Owner: England + Location: 68,98 + Actor1052: chain + Owner: England + Location: 68,97 + Actor1053: chain + Owner: England + Location: 68,96 + Actor1054: chain + Owner: England + Location: 69,96 + Actor1055: chain + Owner: England + Location: 70,96 + Actor1057: chain + Owner: England + Location: 74,96 + Actor1058: chain + Owner: England + Location: 75,96 + Actor1059: chain + Owner: England + Location: 75,97 + Actor1060: chain + Owner: England + Location: 75,98 + Health: 21 + Actor1061: chain + Owner: England + Location: 75,99 + Actor1062: chain + Owner: England + Location: 75,100 + Actor1063: chain + Owner: England + Location: 75,101 + Actor1064: chain + Owner: England + Location: 75,102 + Actor1065: split2 + Owner: Neutral + Location: 126,77 + Actor1066: split2 + Owner: Neutral + Location: 130,83 + Actor1067: chain + Owner: England + Location: 70,102 + Actor1091: split2 + Owner: Neutral + Location: 183,171 + Actor1097: split2 + Owner: Neutral + Location: 188,170 + Actor1098: split2 + Owner: Neutral + Location: 10,95 + Actor1099: split2 + Owner: Neutral + Location: 19,93 + Actor1100: split2 + Owner: Neutral + Location: 5,92 + Actor839: proc.scrin + Owner: MaleficScrin + Location: 187,156 + Actor1069: dark + Owner: MaleficScrin + Location: 136,65 + Facing: 384 + ScriptTags: HardAndAbove + Actor1071: dark + Owner: MaleficScrin + Location: 141,62 + Facing: 497 + Actor1073: dark + Owner: MaleficScrin + Location: 67,66 + Facing: 531 + Actor1074: shrw + Owner: MaleficScrin + Location: 142,68 + Facing: 518 + Actor1076: stlk + Owner: MaleficScrin + Facing: 384 + Location: 73,70 + SubCell: 3 + Actor1077: stlk + Owner: MaleficScrin + Facing: 384 + Location: 68,64 + SubCell: 3 + Actor1079: stlk + Owner: MaleficScrin + Facing: 384 + Location: 140,67 + SubCell: 3 + Actor1080: stlk + Owner: MaleficScrin + Facing: 384 + Location: 147,64 + SubCell: 3 + Actor1081: stlk + Owner: MaleficScrin + Facing: 384 + Location: 147,71 + SubCell: 3 + Actor1082: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 256 + Location: 32,189 + Actor1083: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 256 + Location: 33,187 + Actor1084: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 256 + Location: 33,184 + Actor1085: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 256 + Location: 31,182 + Actor1086: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 256 + Location: 30,181 + Actor576: dark + Owner: MaleficScrin + Facing: 256 + Location: 35,189 + Actor575: dark + Owner: MaleficScrin + Facing: 256 + Location: 33,181 + Actor562: oilb + Owner: Neutral + Location: 64,173 + Health: 59 + Actor563: oilb + Owner: Neutral + Location: 67,173 + Health: 69 + Actor1092: chain + Owner: Neutral + Location: 48,165 + Actor1093: chain + Owner: Neutral + Location: 47,165 + Actor1095: chain + Owner: Neutral + Location: 46,165 + Actor1096: chain + Owner: Neutral + Location: 52,165 + Actor1132: chain + Owner: Neutral + Location: 53,165 + Actor1131: cycl + Owner: Neutral + Location: 53,164 + Actor1133: cycl + Owner: Neutral + Location: 53,163 + Actor1134: cycl + Owner: Neutral + Location: 53,162 + Actor1135: cycl + Owner: Neutral + Location: 53,161 + Actor1136: cycl + Owner: Neutral + Location: 53,159 + Actor1137: cycl + Owner: Neutral + Location: 53,160 + Actor1138: cycl + Owner: Neutral + Location: 52,159 + Actor1139: cycl + Owner: Neutral + Location: 51,159 + Actor1140: cycl + Owner: Neutral + Location: 50,159 + Actor1141: cycl + Owner: Neutral + Location: 48,159 + Actor1142: cycl + Owner: Neutral + Location: 49,159 + Actor1143: cycl + Owner: Neutral + Location: 47,159 + Actor1144: cycl + Owner: Neutral + Location: 46,159 + Actor1145: cycl + Owner: Neutral + Location: 46,160 + Actor1146: cycl + Owner: Neutral + Location: 46,161 + Actor1147: cycl + Owner: Neutral + Location: 46,163 + Actor1148: cycl + Owner: Neutral + Location: 46,162 + Actor1149: cycl + Owner: Neutral + Location: 46,164 + Actor1087: oilr + Owner: Neutral + Location: 48,161 + Health: 59 + Actor1088: tc04 + Owner: Neutral + Location: 133,173 + Actor1089: t16 + Owner: Neutral + Location: 136,172 + Actor1090: t15 + Owner: Neutral + Location: 137,172 + Actor1094: t11 + Owner: Neutral + Location: 135,175 + Actor1101: tc01 + Owner: Neutral + Location: 134,176 + Actor1102: tc05 + Owner: Neutral + Location: 132,178 + Actor1103: t14 + Owner: Neutral + Location: 134,177 + Actor1104: t12 + Owner: Neutral + Location: 133,176 + Actor1105: t17 + Owner: Neutral + Location: 136,173 + Actor1106: t07 + Owner: Neutral + Location: 137,174 + Actor1107: t02 + Owner: Neutral + Location: 137,176 + Actor1109: tc03 + Owner: Neutral + Location: 136,178 + Actor1108: t13 + Owner: Neutral + Location: 138,177 + Actor1110: t15 + Owner: Neutral + Location: 137,179 + Actor1111: t15 + Owner: Neutral + Location: 131,180 + Actor1112: t06 + Owner: Neutral + Location: 130,182 + Actor1113: tc01 + Owner: Neutral + Location: 131,182 + Actor1114: tc02 + Owner: Neutral + Location: 131,184 + Actor1115: t10 + Owner: Neutral + Location: 132,183 + Actor1116: t14 + Owner: Neutral + Location: 132,181 + Actor1117: t11 + Owner: Neutral + Location: 135,180 + Actor1118: tc01 + Owner: Neutral + Location: 139,175 + Actor1119: t02 + Owner: Neutral + Location: 135,183 + Actor1120: t01 + Owner: Neutral + Location: 137,181 + Actor1121: t05 + Owner: Neutral + Location: 140,172 + Actor1122: t06 + Owner: Neutral + Location: 138,174 + Actor1123: t16 + Owner: Neutral + Location: 136,187 + Actor1124: tc01 + Owner: Neutral + Location: 132,191 + Actor1125: tc03 + Owner: Neutral + Location: 131,186 + Actor1126: t16 + Owner: Neutral + Location: 126,190 + Actor1127: t05 + Owner: Neutral + Location: 124,189 + Actor1128: t02 + Owner: Neutral + Location: 129,188 + Actor1129: t03 + Owner: Neutral + Location: 130,190 + Actor1130: t03 + Owner: Neutral + Location: 138,186 + Actor1150: t12 + Owner: Neutral + Location: 137,190 + Actor1151: t05 + Owner: Neutral + Location: 139,186 + Actor1152: t01 + Owner: Neutral + Location: 119,190 + Actor1153: tc04 + Owner: Neutral + Location: 117,187 + Actor1154: t13 + Owner: Neutral + Location: 120,186 + Actor1155: t11 + Owner: Neutral + Location: 114,191 + Actor1156: t11 + Owner: Neutral + Location: 126,188 + Actor1157: t14 + Owner: Neutral + Location: 110,190 + Actor1158: t11 + Owner: Neutral + Location: 125,184 + Actor1159: t15 + Owner: Neutral + Location: 132,189 + Actor1160: t13 + Owner: Neutral + Location: 142,184 + Actor1161: tc01 + Owner: Neutral + Location: 143,185 + Actor1163: tc01 + Owner: Neutral + Location: 135,162 + Actor1164: tc04 + Owner: Neutral + Location: 133,159 + Actor1165: t03 + Owner: Neutral + Location: 135,160 + Actor1166: t11 + Owner: Neutral + Location: 134,158 + Actor1167: t11 + Owner: Neutral + Location: 130,158 + Actor1168: t10 + Owner: Neutral + Location: 132,157 + Actor1169: t11 + Owner: Neutral + Location: 136,161 + Actor1170: t02 + Owner: Neutral + Location: 132,159 + Actor1171: t01 + Owner: Neutral + Location: 131,157 + Actor1172: t05 + Owner: Neutral + Location: 129,156 + Actor1173: t02 + Owner: Neutral + Location: 126,158 + Actor1174: t01 + Owner: Neutral + Location: 138,159 + Actor1176: tc01 + Owner: Neutral + Location: 138,161 + Actor1177: tc02 + Owner: Neutral + Location: 140,162 + Actor1175: t14 + Owner: Neutral + Location: 138,162 + Actor1178: t13 + Owner: Neutral + Location: 140,160 + Actor1179: t10 + Owner: Neutral + Location: 137,156 + Actor1180: t03 + Owner: Neutral + Location: 142,157 + Actor1181: t01 + Owner: Neutral + Location: 142,161 + Actor1184: t15 + Owner: Neutral + Location: 143,162 + Actor1185: t12 + Owner: Neutral + Location: 143,173 + Actor1188: t13 + Owner: Neutral + Location: 147,161 + Actor1189: t06 + Owner: Neutral + Location: 144,158 + Actor1190: t02 + Owner: Neutral + Location: 150,163 + Actor1191: t01 + Owner: Neutral + Location: 144,152 + Actor1192: t06 + Owner: Neutral + Location: 148,175 + Actor1193: tc01 + Owner: Neutral + Location: 124,168 + Actor1194: tc05 + Owner: Neutral + Location: 119,167 + Actor1195: t13 + Owner: Neutral + Location: 123,171 + Actor1196: t07 + Owner: Neutral + Location: 124,170 + Actor1197: t13 + Owner: Neutral + Location: 122,168 + Actor1198: t11 + Owner: Neutral + Location: 121,170 + Actor1199: t05 + Owner: Neutral + Location: 120,170 + Actor1200: tc04 + Owner: Neutral + Location: 120,173 + Actor1201: t11 + Owner: Neutral + Location: 118,174 + Actor1202: t13 + Owner: Neutral + Location: 120,171 + Actor1203: t03 + Owner: Neutral + Location: 121,172 + Actor1204: t12 + Owner: Neutral + Location: 123,169 + Actor1205: t02 + Owner: Neutral + Location: 122,171 + Actor1206: t05 + Owner: Neutral + Location: 119,169 + Actor1207: t01 + Owner: Neutral + Location: 119,172 + Actor1208: t05 + Owner: Neutral + Location: 118,166 + Actor1209: t02 + Owner: Neutral + Location: 122,166 + Actor1210: tc02 + Owner: Neutral + Location: 114,160 + Actor1212: t02 + Owner: Neutral + Location: 112,162 + Actor1213: t10 + Owner: Neutral + Location: 114,162 + Actor1214: t06 + Owner: Neutral + Location: 116,161 + Actor1215: t01 + Owner: Neutral + Location: 114,158 + Actor1216: tc01 + Owner: Neutral + Location: 117,163 + Actor1217: tc03 + Owner: Neutral + Location: 117,161 + Actor1218: t07 + Owner: Neutral + Location: 119,163 + Actor1219: t12 + Owner: Neutral + Location: 116,162 + Actor1220: t12 + Owner: Neutral + Location: 117,159 + Actor1221: t02 + Owner: Neutral + Location: 115,156 + Actor1222: t14 + Owner: Neutral + Location: 122,163 + Actor1223: t11 + Owner: Neutral + Location: 120,162 + Actor1224: t13 + Owner: Neutral + Location: 115,153 + Actor1225: t10 + Owner: Neutral + Location: 108,173 + Actor1226: t06 + Owner: Neutral + Location: 109,170 + Actor1227: t02 + Owner: Neutral + Location: 115,174 + Actor1228: t01 + Owner: Neutral + Location: 111,178 + Actor1229: t10 + Owner: Neutral + Location: 112,180 + Actor1230: t06 + Owner: Neutral + Location: 113,186 + Actor1231: tc01 + Owner: Neutral + Location: 176,190 + Actor1232: t13 + Owner: Neutral + Location: 183,184 + Actor1233: t10 + Owner: Neutral + Location: 181,186 + Actor1234: tc04 + Owner: Neutral + Location: 187,188 + Actor1235: t15 + Owner: Neutral + Location: 190,188 + Actor1236: t11 + Owner: Neutral + Location: 184,191 + Actor1237: t12 + Owner: Neutral + Location: 185,190 + Actor1238: t11 + Owner: Neutral + Location: 190,182 + Actor1239: t03 + Owner: Neutral + Location: 178,181 + Actor1240: t03 + Owner: Neutral + Location: 171,190 + Actor1241: t06 + Owner: Neutral + Location: 169,187 + Actor1242: t02 + Owner: Neutral + Location: 176,181 + Actor1243: t11 + Owner: Neutral + Location: 187,179 + Actor1244: t11 + Owner: Neutral + Location: 174,185 + Actor1245: tc04 + Owner: Neutral + Location: 185,183 + Actor1246: tc02 + Owner: Neutral + Location: 177,186 + Actor1247: t16 + Owner: Neutral + Location: 179,185 + Actor1248: t02 + Owner: Neutral + Location: 172,189 + Actor1249: t01 + Owner: Neutral + Location: 172,186 + Actor1250: t06 + Owner: Neutral + Location: 173,188 + Actor1251: t05 + Owner: Neutral + Location: 179,180 + Actor1252: t05 + Owner: Neutral + Location: 178,191 + Actor1253: t08 + Owner: Neutral + Location: 175,187 + Actor1254: t17 + Owner: Neutral + Location: 182,190 + Actor1255: t12 + Owner: Neutral + Location: 176,185 + Actor1256: t02 + Owner: Neutral + Location: 180,187 + Actor1257: t15 + Owner: Neutral + Location: 190,178 + Actor1258: t13 + Owner: Neutral + Location: 181,180 + Actor1259: t16 + Owner: Neutral + Location: 169,183 + Actor1260: t16 + Owner: Neutral + Location: 182,184 + Actor1261: t16 + Owner: Neutral + Location: 188,183 + Actor1262: t16 + Owner: Neutral + Location: 192,184 + Actor1263: t16 + Owner: Neutral + Location: 184,179 + Actor1264: t16 + Owner: Neutral + Location: 190,191 + Actor1265: t11 + Owner: Neutral + Location: 187,191 + Actor1266: t13 + Owner: Neutral + Location: 189,186 + Actor1267: t15 + Owner: Neutral + Location: 188,190 + Actor1268: tc01 + Owner: Neutral + Location: 191,190 + Actor1269: split2 + Owner: Neutral + Location: 152,152 + Actor1270: split2 + Owner: Neutral + Location: 157,147 + Actor1271: t16 + Owner: Neutral + Location: 148,171 + Actor1272: t11 + Owner: Neutral + Location: 152,168 + Actor1273: t13 + Owner: Neutral + Location: 153,177 + Actor1274: tc01 + Owner: Neutral + Location: 167,177 + Actor1275: t02 + Owner: Neutral + Location: 170,175 + Actor1276: t01 + Owner: Neutral + Location: 165,165 + Actor1277: t01 + Owner: Neutral + Location: 160,189 + Actor1278: t10 + Owner: Neutral + Location: 161,183 + Actor1279: t10 + Owner: Neutral + Location: 165,160 + Actor1280: t13 + Owner: Neutral + Location: 176,174 + Actor1281: t06 + Owner: Neutral + Location: 159,176 + Actor1282: t12 + Owner: Neutral + Location: 164,156 + Actor1283: t05 + Owner: Neutral + Location: 171,146 + Actor1284: t01 + Owner: Neutral + Location: 168,145 + Actor1285: t08 + Owner: Neutral + Location: 174,146 + Actor1287: t02 + Owner: Neutral + Location: 165,150 + Actor1286: t11 + Owner: Neutral + Location: 167,139 + Actor1288: t03 + Owner: Neutral + Location: 170,134 + Actor1289: t10 + Owner: Neutral + Location: 171,140 + Actor1290: t05 + Owner: Neutral + Location: 164,140 + Actor1291: t01 + Owner: Neutral + Location: 160,138 + Actor1292: t16 + Owner: Neutral + Location: 139,150 + Actor1293: t13 + Owner: Neutral + Location: 133,146 + Actor1294: t17 + Owner: Neutral + Location: 141,142 + Actor1295: tc02 + Owner: Neutral + Location: 123,146 + Actor1296: t10 + Owner: Neutral + Location: 111,144 + Actor1297: t11 + Owner: Neutral + Location: 118,144 + Actor1298: t01 + Owner: Neutral + Location: 116,145 + Actor1299: t05 + Owner: Neutral + Location: 119,152 + Actor1300: v01 + Owner: Neutral + Location: 21,125 + Actor1301: v07 + Owner: Neutral + Location: 22,132 + Actor1302: v07 + Owner: Neutral + Location: 13,125 + Actor1303: v06 + Owner: Neutral + Location: 19,137 + Actor1304: v04 + Owner: Neutral + Location: 17,122 + Actor1305: v03 + Owner: Neutral + Location: 13,114 + Actor1306: v17 + Owner: Neutral + Location: 19,135 + Actor1307: v17 + Owner: Neutral + Location: 18,135 + Actor1308: v16 + Owner: Neutral + Location: 17,135 + Actor1309: v18 + Owner: Neutral + Location: 15,136 + Actor1310: v16 + Owner: Neutral + Location: 14,136 + Actor1311: brl3 + Owner: Neutral + Location: 52,160 + Actor1312: brl3 + Owner: Neutral + Location: 52,164 + Actor1313: barl + Owner: Neutral + Location: 52,163 + Actor1314: barl + Owner: Neutral + Location: 47,163 + Actor1315: brl3 + Owner: Neutral + Location: 47,160 + Actor1316: barl + Owner: Neutral + Location: 69,174 + Actor1317: barl + Owner: Neutral + Location: 63,173 + Actor1318: brl3 + Owner: Neutral + Location: 63,174 + Actor1319: v11 + Owner: Neutral + Location: 28,137 + Actor1321: v10 + Owner: Neutral + Location: 18,129 + Actor1320: v09 + Owner: Neutral + Location: 13,128 + Actor1322: v05 + Owner: Neutral + Location: 17,118 + Actor1323: wood + Owner: Neutral + Location: 14,135 + Actor1324: wood + Owner: Neutral + Location: 15,135 + Actor1325: wood + Owner: Neutral + Location: 16,135 + Actor1326: wood + Owner: Neutral + Location: 17,134 + Actor1327: wood + Owner: Neutral + Location: 18,134 + Actor1328: wood + Owner: Neutral + Location: 19,134 + Actor1329: wood + Owner: Neutral + Location: 20,134 + Actor1330: wood + Owner: Neutral + Location: 16,134 + Actor1331: wood + Owner: Neutral + Location: 28,138 + Actor1332: wood + Owner: Neutral + Location: 29,138 + Actor1333: wood + Owner: Neutral + Location: 29,137 + Actor1334: wood + Owner: Neutral + Location: 14,123 + Actor1335: wood + Owner: Neutral + Location: 13,123 + Actor1336: wood + Owner: Neutral + Location: 12,123 + Actor1337: wood + Owner: Neutral + Location: 11,123 + Actor1338: wood + Owner: Neutral + Location: 11,124 + Actor1339: wood + Owner: Neutral + Location: 13,127 + Actor1340: wood + Owner: Neutral + Location: 14,127 + Actor1341: wood + Owner: Neutral + Location: 18,119 + Actor1342: wood + Owner: Neutral + Location: 19,119 + Actor1343: wood + Owner: Neutral + Location: 20,119 + Actor1344: wood + Owner: Neutral + Location: 20,118 + Actor1345: wood + Owner: Neutral + Location: 23,126 + Actor1346: wood + Owner: Neutral + Location: 23,125 + Actor1347: wood + Owner: Neutral + Location: 23,124 + Actor1348: wood + Owner: Neutral + Location: 20,124 + Actor1349: wood + Owner: Neutral + Location: 22,124 + Actor1350: wood + Owner: Neutral + Location: 21,124 + Actor1351: wood + Owner: Neutral + Location: 24,121 + Actor1352: wood + Owner: Neutral + Location: 25,121 + Actor1353: wood + Owner: Neutral + Location: 10,114 + Actor1354: wood + Owner: Neutral + Location: 10,113 + Actor1355: wood + Owner: Neutral + Location: 11,113 + Actor1356: wood + Owner: Neutral + Location: 12,113 + Actor1357: v15 + Owner: Neutral + Location: 12,124 + Actor1358: v16 + Owner: Neutral + Location: 13,124 + Actor1359: v18 + Owner: Neutral + Location: 11,114 + Actor1360: ice01 + Owner: Neutral + Location: 30,128 + Actor1361: t15 + Owner: Neutral + Location: 33,126 + Actor1362: t17 + Owner: Neutral + Location: 27,125 + Actor1363: t03 + Owner: Neutral + Location: 21,141 + Actor1364: ice03 + Owner: Neutral + Location: 45,119 + Actor1365: tc05 + Owner: Neutral + Location: 48,106 + Actor1366: tc01 + Owner: Neutral + Location: 60,108 + Actor1367: t16 + Owner: Neutral + Location: 56,107 + Actor1368: t11 + Owner: Neutral + Location: 65,107 + Actor1369: t13 + Owner: Neutral + Location: 66,105 + Actor1370: t12 + Owner: Neutral + Location: 67,100 + Actor1371: tc03 + Owner: Neutral + Location: 80,107 + Actor1372: tc04 + Owner: Neutral + Location: 78,109 + Actor1373: t15 + Owner: Neutral + Location: 79,113 + Actor1374: t13 + Owner: Neutral + Location: 76,105 + Actor1375: t03 + Owner: Neutral + Location: 77,103 + Actor1376: t07 + Owner: Neutral + Location: 62,113 + Actor1378: t10 + Owner: Neutral + Location: 50,124 + Actor1379: t07 + Owner: Neutral + Location: 48,119 + Actor1380: t07 + Owner: Neutral + Location: 48,112 + Actor1381: t05 + Owner: Neutral + Location: 55,121 + Actor1382: t11 + Owner: Neutral + Location: 55,119 + Actor1383: tc02 + Owner: Neutral + Location: 56,118 + Actor1384: t07 + Owner: Neutral + Location: 55,117 + Actor1377: t02 + Owner: Neutral + Location: 51,92 + Actor1387: nerv + Owner: MaleficScrin + Location: 18,24 + Actor1388: nerv + Owner: MaleficScrin + Location: 5,30 + Actor1389: nerv + Owner: MaleficScrin + Location: 22,5 + Actor1390: nerv + Owner: MaleficScrin + Location: 27,157 + Actor1391: swal + Owner: MaleficScrin + Location: 32,155 + Actor1392: swal + Owner: MaleficScrin + Location: 32,157 + Actor1393: swal + Owner: MaleficScrin + Location: 32,156 + Actor1394: swal + Owner: MaleficScrin + Location: 32,158 + Actor1395: swal + Owner: MaleficScrin + Location: 32,159 + Actor1396: swal + Owner: MaleficScrin + Location: 33,160 + Actor1397: swal + Owner: MaleficScrin + Location: 32,160 + Actor1398: swal + Owner: MaleficScrin + Location: 32,161 + Actor1399: swal + Owner: MaleficScrin + Location: 33,161 + Actor1400: swal + Owner: MaleficScrin + Location: 33,162 + Actor1401: swal + Owner: MaleficScrin + Location: 33,163 + Actor1402: swal + Owner: MaleficScrin + Location: 33,164 + Actor1403: swal + Owner: MaleficScrin + Location: 32,164 + Actor1404: swal + Owner: MaleficScrin + Location: 32,165 + Actor1405: swal + Owner: MaleficScrin + Location: 33,165 + Actor1406: swal + Owner: MaleficScrin + Location: 31,164 + Actor1407: swal + Owner: MaleficScrin + Location: 30,164 + Actor1408: swal + Owner: MaleficScrin + Location: 29,164 + Actor1409: swal + Owner: MaleficScrin + Location: 29,163 + Actor1410: swal + Owner: MaleficScrin + Location: 28,163 + Actor1411: swal + Owner: MaleficScrin + Location: 28,164 + Actor1412: swal + Owner: MaleficScrin + Location: 25,163 + Actor1413: swal + Owner: MaleficScrin + Location: 25,164 + Actor1414: swal + Owner: MaleficScrin + Location: 26,163 + Actor1415: swal + Owner: MaleficScrin + Location: 26,164 + Actor1416: swal + Owner: MaleficScrin + Location: 27,164 + Actor1417: swal + Owner: MaleficScrin + Location: 20,163 + Actor1418: swal + Owner: MaleficScrin + Location: 20,164 + Actor1419: swal + Owner: MaleficScrin + Location: 19,164 + Actor1420: swal + Owner: MaleficScrin + Location: 19,163 + Actor1421: swal + Owner: MaleficScrin + Location: 18,164 + Actor1422: swal + Owner: MaleficScrin + Location: 17,164 + Actor1423: swal + Owner: MaleficScrin + Location: 16,164 + Actor1424: swal + Owner: MaleficScrin + Location: 15,164 + Actor1425: swal + Owner: MaleficScrin + Location: 15,163 + Actor1426: swal + Owner: MaleficScrin + Location: 16,163 + Actor1427: swal + Owner: MaleficScrin + Location: 14,162 + Actor1428: swal + Owner: MaleficScrin + Location: 15,162 + Actor1429: swal + Owner: MaleficScrin + Location: 14,161 + Actor1430: swal + Owner: MaleficScrin + Location: 14,160 + Actor1431: swal + Owner: MaleficScrin + Location: 15,160 + Actor1432: swal + Owner: MaleficScrin + Location: 15,161 + Actor1433: swal + Owner: MaleficScrin + Location: 32,154 + Actor1434: swal + Owner: MaleficScrin + Location: 33,154 + Actor1435: swal + Owner: MaleficScrin + Location: 34,154 + Actor1436: swal + Owner: MaleficScrin + Location: 34,153 + Actor1437: swal + Owner: MaleficScrin + Location: 32,153 + Actor1438: swal + Owner: MaleficScrin + Location: 33,153 + Actor1439: swal + Owner: MaleficScrin + Location: 32,148 + Actor1440: swal + Owner: MaleficScrin + Location: 33,148 + Actor1441: swal + Owner: MaleficScrin + Location: 32,149 + Actor1442: swal + Owner: MaleficScrin + Location: 33,149 + Actor1443: swal + Owner: MaleficScrin + Location: 34,149 + Actor1444: swal + Owner: MaleficScrin + Location: 34,150 + Actor1445: swal + Owner: MaleficScrin + Location: 33,150 + Actor1446: swal + Owner: MaleficScrin + Location: 34,151 + Actor1447: swal + Owner: MaleficScrin + Location: 35,150 + Actor1448: swal + Owner: MaleficScrin + Location: 35,151 + Actor1449: swal + Owner: MaleficScrin + Location: 36,150 + Actor1450: swal + Owner: MaleficScrin + Location: 36,151 + Actor1451: swal + Owner: MaleficScrin + Location: 34,152 + Actor1452: scol + Owner: MaleficScrin + Location: 27,163 + Actor1453: scol + Owner: MaleficScrin + Location: 18,163 + Actor1454: rea2 + Owner: MaleficScrin + Location: 17,158 + Actor1455: rea2 + Owner: MaleficScrin + Location: 17,155 + Actor1456: rea2 + Owner: MaleficScrin + Location: 17,152 + Actor1457: reac + Owner: MaleficScrin + Location: 14,156 + Actor1458: reac + Owner: MaleficScrin + Location: 14,152 + Actor1459: port + Owner: MaleficScrin + Location: 28,152 + Actor1460: ptur + Owner: MaleficScrin + Location: 34,165 + TurretFacing: 606 + Actor1461: ptur + Owner: MaleficScrin + Location: 27,147 + TurretFacing: 825 + Actor1462: scol + Owner: MaleficScrin + Location: 32,150 + Actor1463: shar + Owner: MaleficScrin + Location: 33,152 + Actor1464: shar + Owner: MaleficScrin + Location: 32,163 + Actor1465: shar + Owner: MaleficScrin + Location: 16,162 + Actor1466: srep + Owner: MaleficScrin + Location: 20,149 + Actor1467: nerv + Owner: MaleficScrin + Location: 186,150 + Actor1468: tc05 + Owner: Neutral + Location: 9,161 + Actor1469: tc02 + Owner: Neutral + Location: 3,159 + Actor1470: tc04 + Owner: Neutral + Location: 7,175 + Actor1471: t16 + Owner: Neutral + Location: 4,176 + Actor1472: t15 + Owner: Neutral + Location: 5,176 + Actor1473: tc04 + Owner: Neutral + Location: 7,163 + Actor1474: tc02 + Owner: Neutral + Location: 15,176 + Actor1475: tc03 + Owner: Neutral + Location: 16,174 + Actor1476: t17 + Owner: Neutral + Location: 12,175 + Actor1477: t11 + Owner: Neutral + Location: 14,172 + Actor1478: tc01 + Owner: Neutral + Location: 10,172 + Actor1479: t16 + Owner: Neutral + Location: 12,171 + Actor1480: t11 + Owner: Neutral + Location: 5,170 + Actor1481: t13 + Owner: Neutral + Location: 17,171 + Actor1482: t12 + Owner: Neutral + Location: 15,168 + Actor1483: t17 + Owner: Neutral + Location: 10,168 + Actor1484: t13 + Owner: Neutral + Location: 10,165 + Actor1485: t14 + Owner: Neutral + Location: 2,170 + Actor1486: tc05 + Owner: Neutral + Location: 2,167 + Actor1487: t16 + Owner: Neutral + Location: 3,166 + Actor1488: t14 + Owner: Neutral + Location: 3,164 + Actor1489: t14 + Owner: Neutral + Location: 1,163 + Actor1490: t12 + Owner: Neutral + Location: 3,162 + Actor1491: t03 + Owner: Neutral + Location: 1,160 + Actor1492: t14 + Owner: Neutral + Location: 0,172 + Actor1493: t15 + Owner: Neutral + Location: 7,167 + Actor1494: t16 + Owner: Neutral + Location: 5,166 + Actor1495: t13 + Owner: Neutral + Location: 6,160 + Actor1496: t14 + Owner: Neutral + Location: 4,162 + Actor1497: t06 + Owner: Neutral + Location: 5,164 + Actor1498: t02 + Owner: Neutral + Location: 4,161 + Actor1499: t06 + Owner: Neutral + Location: 8,159 + Actor1500: t05 + Owner: Neutral + Location: 7,170 + Actor1501: t06 + Owner: Neutral + Location: 3,172 + Actor1502: t02 + Owner: Neutral + Location: 1,170 + Actor1503: t14 + Owner: Neutral + Location: 0,166 + Actor1504: t12 + Owner: Neutral + Location: 7,166 + Actor1505: t02 + Owner: Neutral + Location: 5,168 + Actor1506: t03 + Owner: Neutral + Location: 6,168 + Actor1507: t08 + Owner: Neutral + Location: 8,166 + Actor1508: t12 + Owner: Neutral + Location: 12,164 + Actor1509: t02 + Owner: Neutral + Location: 11,167 + Actor1510: nerv + Owner: MaleficScrin + Location: 105,3 + Actor1511: swal + Owner: MaleficScrin + Location: 104,5 + Actor1512: swal + Owner: MaleficScrin + Location: 104,3 + Actor1513: swal + Owner: MaleficScrin + Location: 104,2 + Actor1514: swal + Owner: MaleficScrin + Location: 104,4 + Actor1515: swal + Owner: MaleficScrin + Location: 104,6 + Actor1516: swal + Owner: MaleficScrin + Location: 106,6 + Actor1517: swal + Owner: MaleficScrin + Location: 105,6 + Actor1518: swal + Owner: MaleficScrin + Location: 107,6 + Actor1519: swal + Owner: MaleficScrin + Location: 107,5 + Actor1520: swal + Owner: MaleficScrin + Location: 107,4 + Actor1521: swal + Owner: MaleficScrin + Location: 107,3 + Actor1522: swal + Owner: MaleficScrin + Location: 107,2 + Actor1523: swal + Owner: MaleficScrin + Location: 106,2 + Actor1524: swal + Owner: MaleficScrin + Location: 105,2 + Actor1525: swal + Owner: MaleficScrin + Location: 104,1 + Actor1526: swal + Owner: MaleficScrin + Location: 105,1 + Actor1527: swal + Owner: MaleficScrin + Location: 103,6 + Actor1528: swal + Owner: MaleficScrin + Location: 104,7 + Actor1529: swal + Owner: MaleficScrin + Location: 103,7 + Actor1530: swal + Owner: MaleficScrin + Location: 107,7 + Actor1531: swal + Owner: MaleficScrin + Location: 108,6 + Actor1532: swal + Owner: MaleficScrin + Location: 108,7 + Actor1533: swal + Owner: MaleficScrin + Location: 106,1 + Actor1534: swal + Owner: MaleficScrin + Location: 107,1 + Actor1535: scol + Owner: MaleficScrin + Location: 102,11 + Actor1536: scol + Owner: MaleficScrin + Location: 105,11 + Actor1537: shar + Owner: MaleficScrin + Location: 105,8 + Actor1538: ptur + Owner: MaleficScrin + Location: 111,5 + TurretFacing: 675 + Actor1539: split2 + Owner: Neutral + Location: 32,118 + Actor1540: split2 + Owner: Neutral + Location: 34,111 + Actor1541: split2 + Owner: Neutral + Location: 104,50 + Actor1542: split2 + Owner: Neutral + Location: 112,45 + Actor1543: tc04 + Owner: Neutral + Location: 182,46 + Actor1544: tc02 + Owner: Neutral + Location: 189,40 + Actor1545: t16 + Owner: Neutral + Location: 186,38 + Actor1546: t13 + Owner: Neutral + Location: 187,48 + Actor1547: t12 + Owner: Neutral + Location: 175,50 + Actor1548: t16 + Owner: Neutral + Location: 169,46 + Actor1549: t16 + Owner: Neutral + Location: 156,49 + Actor1550: tc05 + Owner: Neutral + Location: 152,47 + Actor1551: t15 + Owner: Neutral + Location: 153,45 + Actor1552: t12 + Owner: Neutral + Location: 156,47 + Actor1553: t07 + Owner: Neutral + Location: 148,48 + Actor1554: t05 + Owner: Neutral + Location: 135,40 + Actor1555: t03 + Owner: Neutral + Location: 119,42 + Actor1556: t01 + Owner: Neutral + Location: 129,50 + Actor1557: tc01 + Owner: Neutral + Location: 110,58 + Actor1558: t15 + Owner: Neutral + Location: 116,52 + Actor1559: tc02 + Owner: Neutral + Location: 117,54 + Actor1560: t16 + Owner: Neutral + Location: 114,54 + Actor1561: t14 + Owner: Neutral + Location: 121,50 + Actor1562: t11 + Owner: Neutral + Location: 116,69 + Actor1563: t14 + Owner: Neutral + Location: 117,61 + Actor1564: t10 + Owner: Neutral + Location: 104,71 + Actor1565: tc05 + Owner: Neutral + Location: 105,74 + Actor1566: tc01 + Owner: Neutral + Location: 106,72 + Actor1567: t17 + Owner: Neutral + Location: 103,66 + Actor1568: t11 + Owner: Neutral + Location: 105,65 + Actor1569: t11 + Owner: Neutral + Location: 128,55 + Actor1570: t02 + Owner: Neutral + Location: 127,54 + Actor1571: t05 + Owner: Neutral + Location: 125,56 + Actor1572: t01 + Owner: Neutral + Location: 135,52 + Actor1573: t03 + Owner: Neutral + Location: 160,71 + Actor1574: t10 + Owner: Neutral + Location: 169,68 + Actor1575: tc04 + Owner: Neutral + Location: 170,73 + Actor1576: t15 + Owner: Neutral + Location: 164,74 + Actor1577: t17 + Owner: Neutral + Location: 167,77 + Actor1578: t10 + Owner: Neutral + Location: 168,73 + Actor1579: t11 + Owner: Neutral + Location: 171,71 + Actor1580: t16 + Owner: Neutral + Location: 158,81 + Actor1581: t13 + Owner: Neutral + Location: 177,88 + Actor1582: t15 + Owner: Neutral + Location: 177,77 + Actor1583: t06 + Owner: Neutral + Location: 179,74 + Actor1584: t02 + Owner: Neutral + Location: 187,83 + Actor1585: t05 + Owner: Neutral + Location: 191,80 + Actor1586: t03 + Owner: Neutral + Location: 188,86 + Actor1587: t02 + Owner: Neutral + Location: 184,104 + Actor1588: tc04 + Owner: Neutral + Location: 189,96 + Actor1589: tc02 + Owner: Neutral + Location: 170,100 + Actor1590: t14 + Owner: Neutral + Location: 164,98 + Actor1591: t11 + Owner: Neutral + Location: 170,108 + Actor1592: t16 + Owner: Neutral + Location: 173,100 + Actor1593: t06 + Owner: Neutral + Location: 172,98 + Actor1594: t03 + Owner: Neutral + Location: 171,98 + Actor1595: t10 + Owner: Neutral + Location: 177,102 + Actor1596: t11 + Owner: Neutral + Location: 144,107 + Actor1597: t01 + Owner: Neutral + Location: 160,101 + Actor1598: t05 + Owner: Neutral + Location: 150,138 + Actor1599: t03 + Owner: Neutral + Location: 158,131 + Actor1600: t02 + Owner: Neutral + Location: 159,129 + Actor1601: t10 + Owner: Neutral + Location: 154,133 + Actor1602: t13 + Owner: Neutral + Location: 164,130 + Actor1603: t10 + Owner: Neutral + Location: 163,123 + Actor1604: t14 + Owner: Neutral + Location: 177,131 + Actor1605: t11 + Owner: Neutral + Location: 189,134 + Actor1606: t06 + Owner: Neutral + Location: 175,128 + Actor1607: t02 + Owner: Neutral + Location: 165,122 + Actor1608: t05 + Owner: Neutral + Location: 171,123 + Actor1609: t02 + Owner: Neutral + Location: 170,119 + Actor1610: t14 + Owner: Neutral + Location: 156,126 + Actor1611: t01 + Owner: Neutral + Location: 161,113 + Actor1612: t03 + Owner: Neutral + Location: 160,111 + Actor1613: t01 + Owner: Neutral + Location: 152,105 + Actor1614: t02 + Owner: Neutral + Location: 151,104 + Actor1615: t10 + Owner: Neutral + Location: 183,129 + Actor1616: t07 + Owner: Neutral + Location: 181,128 + Actor1617: t16 + Owner: Neutral + Location: 107,116 + Actor1618: t10 + Owner: Neutral + Location: 107,113 + Actor1619: tc04 + Owner: Neutral + Location: 115,125 + Actor1620: t13 + Owner: Neutral + Location: 112,130 + Actor1621: t14 + Owner: Neutral + Location: 113,121 + Actor1622: t06 + Owner: Neutral + Location: 115,123 + Actor1623: t03 + Owner: Neutral + Location: 117,116 + Actor1624: t01 + Owner: Neutral + Location: 116,109 + Actor1625: t13 + Owner: Neutral + Location: 103,110 + Actor1626: t14 + Owner: Neutral + Location: 125,102 + Actor1627: t02 + Owner: Neutral + Location: 132,99 + Actor1628: t03 + Owner: Neutral + Location: 116,99 + Actor1629: t05 + Owner: Neutral + Location: 118,105 + Actor1630: t11 + Owner: Neutral + Location: 101,100 + Actor1631: t03 + Owner: Neutral + Location: 103,104 + Actor1632: t14 + Owner: Neutral + Location: 112,138 + Actor1633: tc01 + Owner: Neutral + Location: 122,140 + Actor1634: tc04 + Owner: Neutral + Location: 114,137 + Actor1635: t13 + Owner: Neutral + Location: 115,135 + Actor1636: t10 + Owner: Neutral + Location: 121,136 + Actor1637: t02 + Owner: Neutral + Location: 119,135 + Actor1638: t02 + Owner: Neutral + Location: 127,139 + Actor1639: t03 + Owner: Neutral + Location: 121,132 + Actor1641: t11 + Owner: Neutral + Location: 106,127 + Actor1642: t13 + Owner: Neutral + Location: 143,132 + Actor1643: t11 + Owner: Neutral + Location: 143,137 + Actor1644: t12 + Owner: Neutral + Location: 145,136 + Actor1645: t13 + Owner: Neutral + Location: 139,136 + Actor1646: t06 + Owner: Neutral + Location: 140,137 + Actor1647: t06 + Owner: Neutral + Location: 146,141 + Actor1648: t07 + Owner: Neutral + Location: 146,138 + Actor1649: t08 + Owner: Neutral + Location: 145,138 + Actor1650: t15 + Owner: Neutral + Location: 122,109 + Actor1652: t12 + Owner: Neutral + Location: 125,109 + Actor1651: t16 + Owner: Neutral + Location: 124,108 + Actor1653: tc03 + Owner: Neutral + Location: 122,84 + Actor1654: tc04 + Owner: Neutral + Location: 120,86 + Actor1655: t17 + Owner: Neutral + Location: 122,87 + Actor1656: t13 + Owner: Neutral + Location: 122,85 + Actor1657: t12 + Owner: Neutral + Location: 121,85 + Actor1658: t01 + Owner: Neutral + Location: 121,83 + Actor1659: t08 + Owner: Neutral + Location: 121,89 + Actor1660: t14 + Owner: Neutral + Location: 119,82 + Actor1661: tc01 + Owner: Neutral + Location: 143,85 + Actor1662: t11 + Owner: Neutral + Location: 139,84 + Actor1663: t12 + Owner: Neutral + Location: 152,81 + Actor1664: tc01 + Owner: Neutral + Location: 145,94 + Actor1665: tc02 + Owner: Neutral + Location: 135,94 + Actor1666: t13 + Owner: Neutral + Location: 79,91 + Actor1667: t16 + Owner: Neutral + Location: 79,88 + Actor1668: tc02 + Owner: Neutral + Location: 80,86 + Actor1669: tc03 + Owner: Neutral + Location: 80,88 + Actor1670: t15 + Owner: Neutral + Location: 76,82 + Actor1671: t13 + Owner: Neutral + Location: 66,82 + Actor1672: t06 + Owner: Neutral + Location: 70,89 + Actor1673: t16 + Owner: Neutral + Location: 65,86 + Actor1674: tc02 + Owner: Neutral + Location: 63,87 + Actor1675: tc03 + Owner: Neutral + Location: 61,88 + Actor1676: t14 + Owner: Neutral + Location: 61,86 + Actor1677: t11 + Owner: Neutral + Location: 63,85 + Actor1678: t16 + Owner: Neutral + Location: 43,83 + Actor1679: t06 + Owner: Neutral + Location: 42,77 + Actor1680: t13 + Owner: Neutral + Location: 46,72 + Actor1681: t10 + Owner: Neutral + Location: 51,79 + Actor1682: t14 + Owner: Neutral + Location: 49,73 + Actor1683: tc04 + Owner: Neutral + Location: 51,71 + Actor1684: t16 + Owner: Neutral + Location: 53,69 + Actor1685: tc02 + Owner: Neutral + Location: 48,66 + Actor1686: tc01 + Owner: Neutral + Location: 47,64 + Actor1687: t14 + Owner: Neutral + Location: 49,64 + Actor1688: t11 + Owner: Neutral + Location: 47,67 + Actor1689: t16 + Owner: Neutral + Location: 48,60 + Actor1690: t08 + Owner: Neutral + Location: 49,62 + Actor1691: t14 + Owner: Neutral + Location: 42,56 + Actor1692: t13 + Owner: Neutral + Location: 54,55 + Actor1693: t16 + Owner: Neutral + Location: 51,46 + Actor1694: t05 + Owner: Neutral + Location: 60,44 + Actor1695: t02 + Owner: Neutral + Location: 55,40 + Actor1696: t02 + Owner: Neutral + Location: 56,42 + Actor1697: t03 + Owner: Neutral + Location: 52,47 + Actor1698: tc03 + Owner: Neutral + Location: 64,34 + Actor1699: t11 + Owner: Neutral + Location: 63,32 + Actor1700: t12 + Owner: Neutral + Location: 71,40 + Actor1701: t16 + Owner: Neutral + Location: 76,45 + Actor1702: tc01 + Owner: Neutral + Location: 79,40 + Actor1703: tc04 + Owner: Neutral + Location: 77,33 + Actor1704: t15 + Owner: Neutral + Location: 75,28 + Actor1705: t15 + Owner: Neutral + Location: 74,31 + Actor1707: t13 + Owner: Neutral + Location: 59,25 + Actor1708: t14 + Owner: Neutral + Location: 49,27 + Actor1710: t01 + Owner: Neutral + Location: 107,91 + Actor1711: t11 + Owner: Neutral + Location: 105,95 + Actor1712: t01 + Owner: Neutral + Location: 102,90 + Actor1713: t12 + Owner: Neutral + Location: 104,97 + Actor1714: t16 + Owner: Neutral + Location: 107,96 + Actor1715: tc05 + Owner: Neutral + Location: 111,56 + Actor1716: t03 + Owner: Neutral + Location: 138,43 + Actor1717: t14 + Owner: Neutral + Location: 179,56 + Actor1718: t16 + Owner: Neutral + Location: 168,66 + Actor1719: tc01 + Owner: Neutral + Location: 172,58 + Actor1720: tc04 + Owner: Neutral + Location: 173,60 + Actor1721: t16 + Owner: Neutral + Location: 175,62 + Actor1722: t10 + Owner: Neutral + Location: 175,63 + Actor1723: t12 + Owner: Neutral + Location: 172,62 + Actor1724: t13 + Owner: Neutral + Location: 171,56 + Actor1725: t03 + Owner: Neutral + Location: 179,69 + Actor1726: t01 + Owner: Neutral + Location: 181,96 + Actor1727: t15 + Owner: Neutral + Location: 158,93 + Actor1728: t17 + Owner: Neutral + Location: 153,104 + Actor1729: t17 + Owner: Neutral + Location: 180,112 + Actor1730: tc04 + Owner: Neutral + Location: 78,95 + Actor1731: t06 + Owner: Neutral + Location: 58,96 + Actor1732: t02 + Owner: Neutral + Location: 60,92 + Actor1733: t03 + Owner: Neutral + Location: 58,94 + Actor1734: tc01 + Owner: Neutral + Location: 59,94 + Actor1735: tc05 + Owner: Neutral + Location: 60,96 + Actor1736: t06 + Owner: Neutral + Location: 61,100 + Actor1737: t11 + Owner: Neutral + Location: 58,99 + Actor1738: t07 + Owner: Neutral + Location: 55,103 + Actor1739: t14 + Owner: Neutral + Location: 41,110 + Actor1740: tc01 + Owner: Neutral + Location: 39,128 + Actor1742: t13 + Owner: Neutral + Location: 40,127 + Actor1741: t15 + Owner: Neutral + Location: 35,135 + Actor1743: t11 + Owner: Neutral + Location: 51,142 + Actor1744: t02 + Owner: Neutral + Location: 50,139 + Actor1745: t01 + Owner: Neutral + Location: 41,144 + Actor1746: t02 + Owner: Neutral + Location: 44,155 + Actor1747: t06 + Owner: Neutral + Location: 40,151 + Actor1748: t13 + Owner: Neutral + Location: 41,148 + Actor1749: t13 + Owner: Neutral + Location: 58,164 + Actor1750: t17 + Owner: Neutral + Location: 62,154 + Actor1751: tc02 + Owner: Neutral + Location: 58,154 + Actor1752: t12 + Owner: Neutral + Location: 60,153 + Actor1753: t13 + Owner: Neutral + Location: 56,152 + Actor1754: t02 + Owner: Neutral + Location: 55,148 + Actor1755: t03 + Owner: Neutral + Location: 78,157 + Actor1756: t01 + Owner: Neutral + Location: 77,159 + Actor1757: t07 + Owner: Neutral + Location: 70,160 + Actor1758: tc04 + Owner: Neutral + Location: 75,169 + Actor1759: tc01 + Owner: Neutral + Location: 77,167 + Actor1760: t13 + Owner: Neutral + Location: 79,169 + Actor1761: t11 + Owner: Neutral + Location: 81,167 + Actor1762: t06 + Owner: Neutral + Location: 81,173 + Actor1763: t03 + Owner: Neutral + Location: 58,178 + Actor1764: tc01 + Owner: Neutral + Location: 61,179 + Actor1765: tc02 + Owner: Neutral + Location: 72,179 + Actor1766: tc04 + Owner: Neutral + Location: 40,161 + Actor1768: t03 + Owner: Neutral + Location: 43,163 + Actor1769: t12 + Owner: Neutral + Location: 41,165 + Actor1767: t15 + Owner: Neutral + Location: 37,163 + Actor1770: t13 + Owner: Neutral + Location: 53,167 + Actor1771: t15 + Owner: Neutral + Location: 52,169 + Actor1772: tc01 + Owner: Neutral + Location: 46,169 + Actor1773: tc03 + Owner: Neutral + Location: 44,168 + Actor1774: t13 + Owner: Neutral + Location: 38,174 + Actor1775: t15 + Owner: Neutral + Location: 26,174 + Actor1776: t15 + Owner: Neutral + Location: 39,186 + Actor1777: t11 + Owner: Neutral + Location: 50,179 + Actor1778: tc02 + Owner: Neutral + Location: 51,181 + Actor1779: t13 + Owner: Neutral + Location: 47,190 + Actor1780: tc01 + Owner: Neutral + Location: 53,190 + Actor1781: tc04 + Owner: Neutral + Location: 50,189 + Actor1782: t17 + Owner: Neutral + Location: 52,191 + Actor1783: t13 + Owner: Neutral + Location: 41,191 + Actor1784: t15 + Owner: Neutral + Location: 26,190 + Actor1785: t11 + Owner: Neutral + Location: 39,181 + Actor1786: t12 + Owner: Neutral + Location: 39,188 + Actor1787: t12 + Owner: Neutral + Location: 20,191 + Actor1788: t13 + Owner: Neutral + Location: 20,181 + Actor1789: t14 + Owner: Neutral + Location: 2,181 + Actor1790: tc01 + Owner: Neutral + Location: 2,190 + Actor1791: t15 + Owner: Neutral + Location: 3,188 + Actor1792: t10 + Owner: Neutral + Location: 27,188 + Actor1793: t10 + Owner: Neutral + Location: 66,183 + Actor1794: t15 + Owner: Neutral + Location: 71,191 + Actor1795: t11 + Owner: Neutral + Location: 80,186 + Actor1796: t03 + Owner: Neutral + Location: 79,185 + Actor1797: t02 + Owner: Neutral + Location: 82,181 + Actor1798: t06 + Owner: Neutral + Location: 85,177 + Actor1799: t03 + Owner: Neutral + Location: 86,174 + Actor1800: t16 + Owner: Neutral + Location: 82,170 + Actor1801: t16 + Owner: Neutral + Location: 62,166 + Actor1802: t16 + Owner: Neutral + Location: 33,92 + Actor1803: t03 + Owner: Neutral + Location: 36,86 + Actor1804: tc04 + Owner: Neutral + Location: 27,61 + Actor1805: t02 + Owner: Neutral + Location: 29,65 + Actor1806: t07 + Owner: Neutral + Location: 37,65 + Actor1807: t01 + Owner: Neutral + Location: 25,56 + Actor1812: tc01 + Owner: Neutral + Location: 37,41 + Actor1813: t07 + Owner: Neutral + Location: 39,39 + Actor1814: t10 + Owner: Neutral + Location: 35,44 + Actor1815: t13 + Owner: Neutral + Location: 42,53 + Actor1816: t12 + Owner: Neutral + Location: 24,46 + Actor1817: tc01 + Owner: Neutral + Location: 26,45 + Actor1818: t14 + Owner: Neutral + Location: 32,38 + Actor1819: t11 + Owner: Neutral + Location: 42,29 + Actor1820: tc02 + Owner: Neutral + Location: 44,30 + Actor1821: t10 + Owner: Neutral + Location: 56,32 + Actor1822: t08 + Owner: Neutral + Location: 55,33 + Actor1823: t06 + Owner: Neutral + Location: 55,31 + Actor1824: t02 + Owner: Neutral + Location: 54,32 + Actor1825: t01 + Owner: Neutral + Location: 55,22 + Actor1826: t05 + Owner: Neutral + Location: 56,21 + Actor1827: t07 + Owner: Neutral + Location: 69,21 + Actor1828: t03 + Owner: Neutral + Location: 62,15 + Actor1829: t05 + Owner: Neutral + Location: 70,15 + Actor1830: tc04 + Owner: Neutral + Location: 69,9 + Actor1831: tc04 + Owner: Neutral + Location: 77,7 + Actor1832: t15 + Owner: Neutral + Location: 75,8 + Actor1834: t11 + Owner: Neutral + Location: 72,9 + Actor1835: t10 + Owner: Neutral + Location: 79,12 + Actor1838: t10 + Owner: Neutral + Location: 80,1 + Actor1839: tc01 + Owner: Neutral + Location: 79,3 + Actor1841: t17 + Owner: Neutral + Location: 63,4 + Actor1842: t01 + Owner: Neutral + Location: 64,1 + Actor1843: t14 + Owner: Neutral + Location: 61,9 + Actor1844: t15 + Owner: Neutral + Location: 75,13 + Actor1845: t15 + Owner: Neutral + Location: 76,22 + Actor1846: tc02 + Owner: Neutral + Location: 75,23 + Actor1847: t14 + Owner: Neutral + Location: 105,26 + Actor1848: nerv + Owner: MaleficScrin + Location: 33,49 + Actor1808: swal + Owner: MaleficScrin + Location: 33,48 + Actor1809: swal + Owner: MaleficScrin + Location: 32,48 + Actor1810: swal + Owner: MaleficScrin + Location: 32,49 + Actor1811: swal + Owner: MaleficScrin + Location: 32,50 + Actor1849: swal + Owner: MaleficScrin + Location: 32,51 + Actor1850: swal + Owner: MaleficScrin + Location: 32,52 + Actor1851: swal + Owner: MaleficScrin + Location: 33,52 + Actor1852: swal + Owner: MaleficScrin + Location: 34,52 + Actor1853: swal + Owner: MaleficScrin + Location: 35,52 + Actor1854: swal + Owner: MaleficScrin + Location: 35,51 + Actor1855: swal + Owner: MaleficScrin + Location: 35,50 + Actor1856: swal + Owner: MaleficScrin + Location: 35,49 + Actor1857: swal + Owner: MaleficScrin + Location: 35,48 + Actor1858: swal + Owner: MaleficScrin + Location: 34,48 + Actor1859: swal + Owner: MaleficScrin + Location: 31,48 + Actor1860: swal + Owner: MaleficScrin + Location: 30,48 + Actor1861: swal + Owner: MaleficScrin + Location: 30,47 + Actor1862: swal + Owner: MaleficScrin + Location: 30,46 + Actor1863: swal + Owner: MaleficScrin + Location: 31,46 + Actor1864: swal + Owner: MaleficScrin + Location: 32,47 + Actor1865: swal + Owner: MaleficScrin + Location: 32,46 + Actor1866: swal + Owner: MaleficScrin + Location: 35,47 + Actor1867: swal + Owner: MaleficScrin + Location: 35,46 + Actor1868: swal + Owner: MaleficScrin + Location: 36,46 + Actor1869: swal + Owner: MaleficScrin + Location: 37,46 + Actor1870: swal + Owner: MaleficScrin + Location: 37,47 + Actor1871: swal + Owner: MaleficScrin + Location: 36,48 + Actor1872: swal + Owner: MaleficScrin + Location: 37,48 + Actor1873: swal + Owner: MaleficScrin + Location: 36,52 + Actor1874: swal + Owner: MaleficScrin + Location: 35,53 + Actor1875: swal + Owner: MaleficScrin + Location: 35,54 + Actor1876: swal + Owner: MaleficScrin + Location: 37,54 + Actor1877: swal + Owner: MaleficScrin + Location: 36,54 + Actor1878: swal + Owner: MaleficScrin + Location: 37,52 + Actor1879: swal + Owner: MaleficScrin + Location: 37,53 + Actor1880: swal + Owner: MaleficScrin + Location: 31,52 + Actor1881: swal + Owner: MaleficScrin + Location: 30,52 + Actor1882: swal + Owner: MaleficScrin + Location: 30,53 + Actor1883: swal + Owner: MaleficScrin + Location: 30,54 + Actor1884: swal + Owner: MaleficScrin + Location: 31,54 + Actor1885: swal + Owner: MaleficScrin + Location: 32,54 + Actor1886: swal + Owner: MaleficScrin + Location: 32,53 + Actor1887: scol + Owner: MaleficScrin + Location: 31,53 + Actor1888: scol + Owner: MaleficScrin + Location: 31,47 + Actor1889: scol + Owner: MaleficScrin + Location: 36,47 + Actor1890: scol + Owner: MaleficScrin + Location: 36,53 + Actor1891: shar + Owner: MaleficScrin + Location: 31,50 + Actor1892: shar + Owner: MaleficScrin + Location: 36,50 + Actor1893: swal + Owner: MaleficScrin + Location: 31,49 + Actor1894: swal + Owner: MaleficScrin + Location: 31,51 + Actor1895: swal + Owner: MaleficScrin + Location: 36,51 + Actor1896: swal + Owner: MaleficScrin + Location: 36,49 + Actor1897: swal + Owner: MaleficScrin + Location: 34,47 + Actor1898: swal + Owner: MaleficScrin + Location: 33,47 + Actor1899: swal + Owner: MaleficScrin + Location: 33,53 + Actor1900: swal + Owner: MaleficScrin + Location: 34,53 + Actor1901: t02 + Owner: Neutral + Faction: scrin + Location: 8,106 + Actor1902: t12 + Owner: Neutral + Faction: scrin + Location: 11,103 + Actor1903: t12 + Owner: Neutral + Faction: scrin + Location: 31,102 + Actor1904: t13 + Owner: Neutral + Faction: scrin + Location: 33,100 + Actor1905: t15 + Owner: Neutral + Faction: scrin + Location: 2,100 + Actor1906: t05 + Owner: Neutral + Faction: scrin + Location: 34,78 + Actor1907: t13 + Owner: Neutral + Faction: scrin + Location: 19,51 + Actor1908: t15 + Owner: Neutral + Faction: scrin + Location: 19,63 + Actor1909: t02 + Owner: Neutral + Faction: scrin + Location: 23,63 + Actor1910: t11 + Owner: Neutral + Faction: scrin + Location: 9,53 + Actor1911: t14 + Owner: Neutral + Faction: scrin + Location: 10,56 + Actor1912: t03 + Owner: Neutral + Faction: scrin + Location: 8,45 + Actor1913: t06 + Owner: Neutral + Faction: scrin + Location: 20,39 + Actor1914: t15 + Owner: Neutral + Faction: scrin + Location: 15,44 + Actor1915: tc02 + Owner: Neutral + Faction: scrin + Location: 10,38 + Actor1916: t06 + Owner: Neutral + Faction: scrin + Location: 11,36 + Actor1917: t10 + Owner: Neutral + Faction: scrin + Location: 3,39 + Actor1918: t13 + Owner: Neutral + Faction: scrin + Location: 17,31 + Actor1919: t06 + Owner: Neutral + Faction: scrin + Location: 26,26 + Actor1920: t03 + Owner: Neutral + Faction: scrin + Location: 35,33 + Actor1921: t02 + Owner: Neutral + Faction: scrin + Location: 33,26 + Actor1922: tc02 + Owner: Neutral + Faction: scrin + Location: 37,26 + Actor1923: tc01 + Owner: Neutral + Faction: scrin + Location: 27,40 + Actor1924: t11 + Owner: Neutral + Faction: scrin + Location: 28,35 + Actor1925: t13 + Owner: Neutral + Faction: scrin + Location: 31,28 + Actor1926: t02 + Owner: Neutral + Faction: scrin + Location: 21,38 + Actor1927: t01 + Owner: Neutral + Faction: scrin + Location: 20,30 + Actor1928: t03 + Owner: Neutral + Faction: scrin + Location: 30,17 + Actor1929: t02 + Owner: Neutral + Faction: scrin + Location: 37,16 + Actor1930: tc01 + Owner: Neutral + Faction: scrin + Location: 19,11 + Actor1931: tc05.husk + Owner: Neutral + Faction: scrin + Location: 14,14 + Actor1932: tc04.husk + Owner: Neutral + Faction: scrin + Location: 2,18 + Actor1933: t17.husk + Owner: Neutral + Faction: scrin + Location: 13,10 + Actor1935: tc02.husk + Owner: Neutral + Faction: scrin + Location: 16,4 + Actor1936: t17.husk + Owner: Neutral + Faction: scrin + Location: 14,3 + Actor1939: t14.husk + Owner: Neutral + Faction: scrin + Location: 0,14 + Actor1940: t13.husk + Owner: Neutral + Faction: scrin + Location: 6,23 + Actor1941: t01.husk + Owner: Neutral + Faction: scrin + Location: 15,23 + Actor1942: t17.husk + Owner: Neutral + Faction: scrin + Location: 17,18 + Actor1943: tc04 + Owner: Neutral + Faction: scrin + Location: 31,0 + Actor1944: tc01 + Owner: Neutral + Faction: scrin + Location: 28,0 + Actor1945: tc02 + Owner: Neutral + Faction: scrin + Location: 31,3 + Actor1946: t15 + Owner: Neutral + Faction: scrin + Location: 28,6 + Actor1947: t11 + Owner: Neutral + Faction: scrin + Location: 35,5 + Actor1948: t13 + Owner: Neutral + Faction: scrin + Location: 31,10 + Actor1949: swal + Owner: MaleficScrin + Location: 17,23 + Actor1950: swal + Owner: MaleficScrin + Location: 17,24 + Actor1951: swal + Owner: MaleficScrin + Location: 17,25 + Actor1952: swal + Owner: MaleficScrin + Location: 17,26 + Actor1953: swal + Owner: MaleficScrin + Location: 17,27 + Actor1954: swal + Owner: MaleficScrin + Location: 19,27 + Actor1955: swal + Owner: MaleficScrin + Location: 18,27 + Actor1956: swal + Owner: MaleficScrin + Location: 20,27 + Actor1957: swal + Owner: MaleficScrin + Location: 20,26 + Actor1958: swal + Owner: MaleficScrin + Location: 20,25 + Actor1959: swal + Owner: MaleficScrin + Location: 20,24 + Actor1960: swal + Owner: MaleficScrin + Location: 20,23 + Actor1961: swal + Owner: MaleficScrin + Location: 19,23 + Actor1962: swal + Owner: MaleficScrin + Location: 18,23 + Actor1963: swal + Owner: MaleficScrin + Location: 4,29 + Actor1964: swal + Owner: MaleficScrin + Location: 4,31 + Actor1965: swal + Owner: MaleficScrin + Location: 4,32 + Actor1966: swal + Owner: MaleficScrin + Location: 4,30 + Actor1967: swal + Owner: MaleficScrin + Location: 5,29 + Actor1968: swal + Owner: MaleficScrin + Location: 6,29 + Actor1969: swal + Owner: MaleficScrin + Location: 7,29 + Actor1970: swal + Owner: MaleficScrin + Location: 7,30 + Actor1971: swal + Owner: MaleficScrin + Location: 7,32 + Actor1972: swal + Owner: MaleficScrin + Location: 7,31 + Actor1973: swal + Owner: MaleficScrin + Location: 7,33 + Actor1974: swal + Owner: MaleficScrin + Location: 6,33 + Actor1975: swal + Owner: MaleficScrin + Location: 5,33 + Actor1976: swal + Owner: MaleficScrin + Location: 4,33 + Actor1977: swal + Owner: MaleficScrin + Location: 3,33 + Actor1978: swal + Owner: MaleficScrin + Location: 3,34 + Actor1979: swal + Owner: MaleficScrin + Location: 4,34 + Actor1980: swal + Owner: MaleficScrin + Location: 7,34 + Actor1981: swal + Owner: MaleficScrin + Location: 8,33 + Actor1982: swal + Owner: MaleficScrin + Location: 8,34 + Actor1983: swal + Owner: MaleficScrin + Location: 8,29 + Actor1984: swal + Owner: MaleficScrin + Location: 7,28 + Actor1985: swal + Owner: MaleficScrin + Location: 8,28 + Actor1986: swal + Owner: MaleficScrin + Location: 4,28 + Actor1987: swal + Owner: MaleficScrin + Location: 3,28 + Actor1988: swal + Owner: MaleficScrin + Location: 3,29 + Actor1989: swal + Owner: MaleficScrin + Location: 16,27 + Actor1990: swal + Owner: MaleficScrin + Location: 16,26 + Actor1991: swal + Owner: MaleficScrin + Location: 16,23 + Actor1992: swal + Owner: MaleficScrin + Location: 16,22 + Actor1993: swal + Owner: MaleficScrin + Location: 17,22 + Actor1994: swal + Owner: MaleficScrin + Location: 21,27 + Actor1995: swal + Owner: MaleficScrin + Location: 21,26 + Actor1996: swal + Owner: MaleficScrin + Location: 20,22 + Actor1997: swal + Owner: MaleficScrin + Location: 21,22 + Actor1998: swal + Owner: MaleficScrin + Location: 21,23 + Actor1999: swal + Owner: MaleficScrin + Location: 21,7 + Actor2000: swal + Owner: MaleficScrin + Location: 21,6 + Actor2001: swal + Owner: MaleficScrin + Location: 21,4 + Actor2002: swal + Owner: MaleficScrin + Location: 21,5 + Actor2003: swal + Owner: MaleficScrin + Location: 21,8 + Actor2004: swal + Owner: MaleficScrin + Location: 22,8 + Actor2005: swal + Owner: MaleficScrin + Location: 23,8 + Actor2006: swal + Owner: MaleficScrin + Location: 24,8 + Actor2007: swal + Owner: MaleficScrin + Location: 24,7 + Actor2008: swal + Owner: MaleficScrin + Location: 24,5 + Actor2009: swal + Owner: MaleficScrin + Location: 24,4 + Actor2010: swal + Owner: MaleficScrin + Location: 22,4 + Actor2011: swal + Owner: MaleficScrin + Location: 23,4 + Actor2012: swal + Owner: MaleficScrin + Location: 24,6 + Actor2013: swal + Owner: MaleficScrin + Location: 20,8 + Actor2014: swal + Owner: MaleficScrin + Location: 20,9 + Actor2015: swal + Owner: MaleficScrin + Location: 21,9 + Actor2016: swal + Owner: MaleficScrin + Location: 24,9 + Actor2017: swal + Owner: MaleficScrin + Location: 25,8 + Actor2018: swal + Owner: MaleficScrin + Location: 25,9 + Actor2019: swal + Owner: MaleficScrin + Location: 24,3 + Actor2020: swal + Owner: MaleficScrin + Location: 25,4 + Actor2021: swal + Owner: MaleficScrin + Location: 25,3 + Actor2022: swal + Owner: MaleficScrin + Location: 21,3 + Actor2023: swal + Owner: MaleficScrin + Location: 20,3 + Actor2024: swal + Owner: MaleficScrin + Location: 20,4 + Actor2025: scol + Owner: MaleficScrin + Location: 3,32 + Actor2026: scol + Owner: MaleficScrin + Location: 8,32 + Actor2027: scol + Owner: MaleficScrin + Location: 16,25 + Actor2028: scol + Owner: MaleficScrin + Location: 21,25 + Actor2029: scol + Owner: MaleficScrin + Location: 20,7 + Actor2030: scol + Owner: MaleficScrin + Location: 25,7 + Actor2032: shar + Owner: MaleficScrin + Location: 18,22 + Actor2033: shar + Owner: MaleficScrin + Location: 5,28 + Actor2034: shar + Owner: MaleficScrin + Location: 22,3 + Actor2031: shar + Owner: MaleficScrin + Location: 18,28 + Actor2035: shar + Owner: MaleficScrin + Location: 5,34 + Actor2036: shar + Owner: MaleficScrin + Location: 22,9 + Actor2037: swal + Owner: MaleficScrin + Location: 6,34 + Actor2038: swal + Owner: MaleficScrin + Location: 23,9 + Actor2039: swal + Owner: MaleficScrin + Location: 19,22 + Actor2040: swal + Owner: MaleficScrin + Location: 6,28 + Actor2041: swal + Owner: MaleficScrin + Location: 23,3 + Actor2042: swal + Owner: MaleficScrin + Location: 6,20 + Actor2043: swal + Owner: MaleficScrin + Location: 6,19 + Actor2044: swal + Owner: MaleficScrin + Location: 7,19 + Actor2045: swal + Owner: MaleficScrin + Location: 7,20 + Actor2046: swal + Owner: MaleficScrin + Location: 13,17 + Actor2047: swal + Owner: MaleficScrin + Location: 13,16 + Actor2048: swal + Owner: MaleficScrin + Location: 14,16 + Actor2049: swal + Owner: MaleficScrin + Location: 14,17 + Actor2050: swal + Owner: MaleficScrin + Location: 10,49 + Actor2051: swal + Owner: MaleficScrin + Location: 10,48 + Actor2052: swal + Owner: MaleficScrin + Location: 11,48 + Actor2053: swal + Owner: MaleficScrin + Location: 11,49 + Actor2054: swal + Owner: MaleficScrin + Location: 17,49 + Actor2055: swal + Owner: MaleficScrin + Location: 16,48 + Actor2056: swal + Owner: MaleficScrin + Location: 17,48 + Actor2057: swal + Owner: MaleficScrin + Location: 16,49 + Actor2058: ptur + Owner: MaleficScrin + Location: 11,50 + TurretFacing: 518 + Actor2059: ptur + Owner: MaleficScrin + Location: 16,50 + TurretFacing: 566 + Actor2060: rea2 + Owner: MaleficScrin + Location: 10,83 + Actor2061: shar + Owner: MaleficScrin + Location: 26,22 + Actor2062: shar + Owner: MaleficScrin + Location: 12,27 + Actor2063: shar + Owner: MaleficScrin + Location: 34,34 + Actor2064: shar + Owner: MaleficScrin + Location: 37,23 + Actor2065: shar + Owner: MaleficScrin + Location: 35,11 + Actor2066: shar + Owner: MaleficScrin + Location: 25,42 + Actor2067: reac + Owner: MaleficScrin + Location: 24,155 + Actor2068: reac + Owner: MaleficScrin + Location: 13,148 + Actor2069: reac + Owner: MaleficScrin + Location: 16,148 + Actor2071: t06 + Owner: Neutral + Location: 108,24 + Actor2072: t02 + Owner: Neutral + Location: 112,15 + Actor2073: t07 + Owner: Neutral + Location: 117,11 + Actor2074: t02 + Owner: Neutral + Location: 120,22 + Actor2075: t15 + Owner: Neutral + Location: 118,21 + Actor2076: t11 + Owner: Neutral + Location: 125,29 + Actor2077: t15 + Owner: Neutral + Location: 125,19 + Actor2078: t11 + Owner: Neutral + Location: 116,9 + Actor2079: t11 + Owner: Neutral + Location: 118,2 + Actor2080: t13 + Owner: Neutral + Location: 115,27 + Actor2081: tc03 + Owner: Neutral + Location: 109,23 + Actor2082: t16 + Owner: Neutral + Location: 121,28 + Actor2084: t11 + Owner: Neutral + Location: 138,28 + Actor2085: t11 + Owner: Neutral + Location: 129,7 + Actor2086: tc02 + Owner: Neutral + Location: 126,3 + Actor2087: t15 + Owner: Neutral + Location: 128,1 + Actor2088: t17 + Owner: Neutral + Location: 126,1 + Actor2089: t02 + Owner: Neutral + Location: 128,7 + Actor2090: t16 + Owner: Neutral + Location: 131,21 + Actor2091: tc02 + Owner: Neutral + Location: 158,30 + Actor2092: tc01 + Owner: Neutral + Location: 185,24 + Actor2093: t13 + Owner: Neutral + Location: 183,22 + Actor2094: t11 + Owner: Neutral + Location: 134,1 + Actor2095: t13 + Owner: Neutral + Location: 97,12 + Actor2096: t15 + Owner: Neutral + Location: 98,5 + Actor2097: t16 + Owner: Neutral + Location: 127,18 + Actor2098: t06 + Owner: Neutral + Location: 118,23 + Actor2099: t05 + Owner: Neutral + Location: 116,26 + Actor2100: t14 + Owner: Neutral + Location: 181,90 + Actor2101: t08 + Owner: Neutral + Location: 182,89 + Actor2102: t06 + Owner: Neutral + Location: 30,173 + Actor2103: t02 + Owner: Neutral + Location: 24,172 + Actor2104: t16 + Owner: Neutral + Location: 25,173 + Actor2105: t01 + Owner: Neutral + Location: 23,174 + Actor2106: t08 + Owner: Neutral + Location: 24,174 + Actor2107: t08 + Owner: Neutral + Location: 31,173 + Actor2108: t08 + Owner: Neutral + Location: 39,176 + Actor2109: t17 + Owner: Neutral + Location: 21,168 + Actor2110: t08 + Owner: Neutral + Location: 57,159 + Actor2111: t08 + Owner: Neutral + Location: 38,127 + Actor2112: t08 + Owner: Neutral + Location: 2,114 + Actor2114: s3 + Owner: MaleficScrin + Facing: 384 + Location: 10,37 + SubCell: 3 + Actor2115: s3 + Owner: MaleficScrin + Location: 19,42 + SubCell: 3 + Facing: 743 + Actor2116: s3 + Owner: MaleficScrin + Location: 22,41 + SubCell: 3 + Facing: 641 + Actor2117: s3 + Owner: MaleficScrin + Facing: 384 + Location: 22,39 + SubCell: 3 + Actor2118: s3 + Owner: MaleficScrin + Location: 26,35 + SubCell: 3 + Facing: 620 + Actor2119: s3 + Owner: MaleficScrin + Location: 22,32 + SubCell: 3 + Facing: 702 + Actor2120: s3 + Owner: MaleficScrin + Facing: 384 + Location: 23,29 + SubCell: 3 + Actor2121: s3 + Owner: MaleficScrin + Facing: 384 + Location: 14,31 + SubCell: 3 + Actor2122: s3 + Owner: MaleficScrin + Facing: 384 + Location: 27,32 + SubCell: 3 + Actor2123: s3 + Owner: MaleficScrin + Location: 31,33 + SubCell: 3 + Facing: 709 + Actor2124: s3 + Owner: MaleficScrin + Facing: 384 + Location: 16,46 + SubCell: 3 + Actor2125: s3 + Owner: MaleficScrin + Facing: 384 + Location: 9,41 + SubCell: 3 + Actor2126: s3 + Owner: MaleficScrin + Location: 6,41 + SubCell: 3 + Facing: 593 + Actor2127: s3 + Owner: MaleficScrin + Location: 4,44 + SubCell: 3 + Facing: 627 + Actor2128: s3 + Owner: MaleficScrin + Location: 7,39 + SubCell: 3 + Facing: 491 + Actor2129: gunw + Owner: MaleficScrin + Location: 24,35 + Facing: 695 + Actor2130: gunw + Owner: MaleficScrin + Location: 19,32 + Facing: 511 + Actor2131: gunw + Owner: MaleficScrin + Location: 14,33 + Facing: 613 + Actor2132: gunw + Owner: MaleficScrin + Location: 13,38 + Facing: 436 + Actor2133: gunw + Owner: MaleficScrin + Location: 15,42 + Facing: 504 + Actor2134: gunw + Owner: MaleficScrin + Location: 25,38 + Facing: 525 + Actor2135: gunw + Owner: MaleficScrin + Facing: 384 + Location: 28,30 + Actor2136: mast + Owner: MaleficScrin + Facing: 384 + Location: 21,73 + SubCell: 3 + Actor2137: mast + Owner: MaleficScrin + Facing: 384 + Location: 152,8 + SubCell: 3 + Actor2138: tpod + Owner: MaleficScrin + Facing: 384 + Location: 145,20 + Actor2139: tpod + Owner: MaleficScrin + Facing: 384 + Location: 140,17 + Actor2140: tpod + Owner: MaleficScrin + Facing: 384 + Location: 137,12 + Actor2141: tpod + Owner: MaleficScrin + Location: 161,18 + Facing: 606 + Actor2142: tpod + Owner: MaleficScrin + Location: 168,12 + Facing: 654 + Actor2143: dark + Owner: MaleficScrin + Facing: 384 + Location: 149,23 + Actor2144: dark + Owner: MaleficScrin + Location: 158,23 + Facing: 531 + Actor2145: dark + Owner: MaleficScrin + Facing: 384 + Location: 139,19 + Actor2146: dark + Owner: MaleficScrin + Facing: 384 + Location: 134,11 + Actor2147: dark + Owner: MaleficScrin + Location: 167,16 + Facing: 600 + Actor2148: stlk + Owner: MaleficScrin + Facing: 384 + Location: 135,14 + SubCell: 3 + Actor2149: stlk + Owner: MaleficScrin + Facing: 384 + Location: 134,9 + SubCell: 3 + Actor2150: stlk + Owner: MaleficScrin + Facing: 384 + Location: 137,19 + SubCell: 3 + Actor2151: stlk + Owner: MaleficScrin + Facing: 384 + Location: 140,20 + SubCell: 3 + Actor2152: stlk + Owner: MaleficScrin + Facing: 384 + Location: 146,25 + SubCell: 3 + Actor2153: stlk + Owner: MaleficScrin + Facing: 384 + Location: 151,25 + SubCell: 3 + Actor2154: stlk + Owner: MaleficScrin + Location: 152,23 + SubCell: 3 + Facing: 525 + Actor2155: stlk + Owner: MaleficScrin + Location: 156,23 + SubCell: 3 + Facing: 518 + Actor2156: stlk + Owner: MaleficScrin + Location: 158,24 + SubCell: 3 + Facing: 579 + Actor2157: stlk + Owner: MaleficScrin + Location: 160,24 + SubCell: 3 + TurretFacing: 0 + Facing: 682 + Actor2158: stlk + Owner: MaleficScrin + Location: 171,12 + SubCell: 3 + Facing: 654 + Actor2159: s1 + Owner: MaleficScrin + Facing: 384 + Location: 177,150 + SubCell: 3 + Actor2160: s1 + Owner: MaleficScrin + Facing: 384 + Location: 174,148 + SubCell: 3 + Actor2161: s1 + Owner: MaleficScrin + Facing: 384 + Location: 175,152 + SubCell: 3 + Actor2162: s1 + Owner: MaleficScrin + Facing: 384 + Location: 175,154 + SubCell: 3 + Actor2163: s1 + Owner: MaleficScrin + Facing: 384 + Location: 175,157 + SubCell: 3 + Actor2164: s1 + Owner: MaleficScrin + Facing: 384 + Location: 176,160 + SubCell: 3 + Actor2165: s1 + Owner: MaleficScrin + Facing: 384 + Location: 177,162 + SubCell: 3 + Actor2166: s1 + Owner: MaleficScrin + Facing: 384 + Location: 177,159 + SubCell: 3 + Actor2167: s1 + Owner: MaleficScrin + Facing: 384 + Location: 181,164 + SubCell: 3 + Actor2168: s1 + Owner: MaleficScrin + Facing: 384 + Location: 190,164 + SubCell: 3 + Actor2169: corr + Owner: MaleficScrin + Facing: 384 + Location: 174,155 + Actor2170: tpod + Owner: MaleficScrin + Location: 180,157 + Facing: 384 + Actor2171: gunw + Owner: MaleficScrin + Facing: 384 + Location: 180,155 + Actor2172: gunw + Owner: MaleficScrin + Facing: 384 + Location: 183,160 + Actor2173: gunw + Owner: MaleficScrin + Location: 17,165 + Facing: 702 + Actor2174: gunw + Owner: MaleficScrin + Facing: 384 + Location: 30,161 + Actor2175: gunw + Owner: MaleficScrin + Location: 30,158 + Facing: 384 + Actor2176: gunw + Owner: MaleficScrin + Location: 21,154 + Facing: 559 + Actor2177: gunw + Owner: MaleficScrin + Location: 25,149 + Facing: 866 + Actor2178: devo + Owner: MaleficScrin + Facing: 384 + Location: 24,159 + Actor2179: devo + Owner: MaleficScrin + Facing: 384 + Location: 35,162 + Actor2180: stlk + Owner: MaleficScrin + Location: 25,169 + SubCell: 3 + Facing: 627 + Actor2181: stlk + Owner: MaleficScrin + Location: 26,167 + SubCell: 3 + Facing: 777 + Actor2182: stlk + Owner: MaleficScrin + Location: 28,166 + SubCell: 3 + Facing: 484 + Actor2183: stlk + Owner: MaleficScrin + Facing: 384 + Location: 30,166 + SubCell: 3 + Actor2184: stlk + Owner: MaleficScrin + Facing: 384 + Location: 36,164 + SubCell: 3 + Actor2185: stlk + Owner: MaleficScrin + Location: 29,143 + SubCell: 3 + Facing: 872 + Actor2186: stlk + Owner: MaleficScrin + Location: 35,145 + SubCell: 3 + Facing: 770 + Actor2187: stlk + Owner: MaleficScrin + Location: 36,146 + SubCell: 3 + Facing: 654 + Actor2188: stlk + Owner: MaleficScrin + Location: 26,88 + SubCell: 3 + Facing: 702 + Actor2189: stlk + Owner: MaleficScrin + Location: 26,87 + SubCell: 3 + Facing: 627 + Actor2190: stlk + Owner: MaleficScrin + Location: 27,86 + SubCell: 3 + Facing: 688 + Actor2191: stlk + Owner: MaleficScrin + Location: 28,82 + SubCell: 3 + Facing: 777 + Actor2192: stlk + Owner: MaleficScrin + Location: 30,81 + SubCell: 3 + Facing: 729 + Actor2193: stlk + Owner: MaleficScrin + Location: 29,79 + SubCell: 3 + Facing: 763 + Actor2194: stlk + Owner: MaleficScrin + Location: 29,79 + SubCell: 1 + Facing: 763 + Actor2195: stlk + Owner: MaleficScrin + Location: 29,76 + SubCell: 3 + Facing: 770 + Actor2196: stlk + Owner: MaleficScrin + Location: 28,75 + SubCell: 3 + Facing: 886 + Actor2197: stlk + Owner: MaleficScrin + Facing: 384 + Location: 9,62 + SubCell: 3 + Actor2198: stlk + Owner: MaleficScrin + Location: 12,61 + SubCell: 3 + Facing: 531 + Actor2199: stlk + Owner: MaleficScrin + Facing: 384 + Location: 14,64 + SubCell: 3 + Actor2200: stlk + Owner: MaleficScrin + Location: 16,64 + SubCell: 3 + Facing: 491 + Actor2201: stlk + Owner: MaleficScrin + Location: 17,64 + SubCell: 3 + Facing: 641 + Actor2202: stlk + Owner: MaleficScrin + Facing: 384 + Location: 13,82 + SubCell: 3 + Actor2203: stlk + Owner: MaleficScrin + Location: 11,77 + SubCell: 3 + Facing: 675 + Actor2204: stlk + Owner: MaleficScrin + Facing: 384 + Location: 7,76 + SubCell: 3 + Actor2205: stlk + Owner: MaleficScrin + Facing: 384 + Location: 16,71 + SubCell: 3 + Actor2206: stlk + Owner: MaleficScrin + Location: 18,71 + SubCell: 3 + Facing: 668 + Actor2207: stlk + Owner: MaleficScrin + Location: 24,92 + SubCell: 3 + Facing: 613 + Actor2208: dark + Owner: MaleficScrin + Location: 27,89 + Facing: 593 + Actor2209: dark + Owner: MaleficScrin + Location: 28,77 + Facing: 716 + Actor2210: dark + Owner: MaleficScrin + Location: 32,83 + Facing: 682 + Actor2211: stlk + Owner: MaleficScrin + Location: 38,51 + SubCell: 3 + Facing: 606 + Actor2212: stlk + Owner: MaleficScrin + Location: 35,55 + SubCell: 3 + Facing: 702 + Actor2213: stlk + Owner: MaleficScrin + Location: 31,56 + SubCell: 3 + Facing: 504 + Actor2214: stlk + Owner: MaleficScrin + Location: 39,47 + SubCell: 3 + Facing: 825 + Actor2215: stlk + Owner: MaleficScrin + Location: 9,26 + SubCell: 3 + Facing: 204 + Actor2216: stlk + Owner: MaleficScrin + Location: 9,27 + SubCell: 3 + Facing: 777 + Actor2217: stlk + Owner: MaleficScrin + Facing: 384 + Location: 23,22 + SubCell: 3 + Actor2218: stlk + Owner: MaleficScrin + Location: 21,21 + SubCell: 3 + Facing: 0 + Actor2219: stlk + Owner: MaleficScrin + Location: 25,16 + SubCell: 3 + Facing: 934 + Actor2220: stlk + Owner: MaleficScrin + Location: 24,11 + SubCell: 3 + Facing: 545 + Actor2221: stlk + Owner: MaleficScrin + Facing: 384 + Location: 26,5 + SubCell: 3 + Actor2222: stlk + Owner: MaleficScrin + Facing: 384 + Location: 27,4 + SubCell: 3 + Actor2223: stlk + Owner: MaleficScrin + Facing: 384 + Location: 22,13 + SubCell: 3 + Actor2224: gunw + Owner: MaleficScrin + Facing: 384 + Location: 73,101 + Actor2225: wchr + Owner: MaleficScrin + Facing: 384 + Location: 58,113 + SubCell: 3 + Actor2226: wchr + Owner: MaleficScrin + Facing: 384 + Location: 51,133 + SubCell: 3 + Actor2227: wchr + Owner: MaleficScrin + Facing: 384 + Location: 44,128 + SubCell: 3 + Actor2228: wchr + Owner: MaleficScrin + Facing: 384 + Location: 113,116 + SubCell: 3 + Actor2229: wchr + Owner: MaleficScrin + Facing: 384 + Location: 160,124 + SubCell: 3 + Actor2230: wchr + Owner: MaleficScrin + Facing: 384 + Location: 152,93 + SubCell: 3 + Actor2231: stlk + Owner: MaleficScrin + Facing: 384 + Location: 140,93 + SubCell: 3 + Actor2232: stlk + Owner: MaleficScrin + Facing: 384 + Location: 143,91 + SubCell: 3 + Actor2233: stlk + Owner: MaleficScrin + Facing: 384 + Location: 148,90 + SubCell: 3 + Actor2234: stlk + Owner: MaleficScrin + Facing: 384 + Location: 149,95 + SubCell: 3 + Actor2235: stlk + Owner: MaleficScrin + Location: 146,91 + SubCell: 3 + Facing: 384 + Actor2236: gunw + Owner: MaleficScrin + Facing: 384 + Location: 142,93 + Actor2237: gunw + Owner: MaleficScrin + Facing: 384 + Location: 126,97 + Actor2238: mrdr + Owner: MaleficScrin + Facing: 384 + Location: 126,96 + SubCell: 3 + Actor2239: mrdr + Owner: MaleficScrin + Facing: 384 + Location: 128,98 + SubCell: 3 + Actor2240: s4 + Owner: MaleficScrin + Facing: 384 + Location: 73,100 + SubCell: 3 + Actor2241: s4 + Owner: MaleficScrin + Facing: 384 + Location: 69,100 + SubCell: 3 + Actor2242: s4 + Owner: MaleficScrin + Facing: 384 + Location: 64,171 + SubCell: 3 + Actor2243: s4 + Owner: MaleficScrin + Facing: 384 + Location: 70,176 + SubCell: 3 + Actor2244: s4 + Owner: MaleficScrin + Facing: 384 + Location: 61,173 + SubCell: 3 + Actor2245: s4 + Owner: MaleficScrin + Facing: 384 + Location: 49,165 + SubCell: 3 + Actor2246: s1 + Owner: MaleficScrin + Facing: 384 + Location: 70,175 + SubCell: 3 + Actor2247: s1 + Owner: MaleficScrin + Facing: 384 + Location: 66,176 + SubCell: 3 + Actor2248: s1 + Owner: MaleficScrin + Facing: 384 + Location: 65,171 + SubCell: 3 + Actor2249: s1 + Owner: MaleficScrin + Facing: 384 + Location: 63,172 + SubCell: 3 + Actor2250: s1 + Owner: MaleficScrin + Facing: 384 + Location: 50,165 + SubCell: 3 + Actor2251: s1 + Owner: MaleficScrin + Facing: 384 + Location: 50,164 + SubCell: 3 + Actor2252: s1 + Owner: MaleficScrin + Facing: 384 + Location: 48,167 + SubCell: 3 + Actor2253: s1 + Owner: MaleficScrin + Facing: 384 + Location: 51,167 + SubCell: 3 + Actor2254: stlk + Owner: MaleficScrin + Facing: 384 + Location: 25,130 + SubCell: 3 + Actor2255: stlk + Owner: MaleficScrin + Facing: 384 + Location: 17,125 + SubCell: 3 + Actor2256: stlk + Owner: MaleficScrin + Facing: 384 + Location: 15,130 + SubCell: 3 + Actor2257: v01 + Owner: Neutral + Location: 165,170 + Actor2258: v01 + Owner: Neutral + Location: 65,38 + Actor2259: v04 + Owner: Neutral + Location: 66,31 + Actor2260: v07 + Owner: Neutral + Location: 73,42 + Actor2261: v09 + Owner: Neutral + Location: 70,30 + Actor2262: v11 + Owner: Neutral + Location: 70,36 + Actor2263: v17 + Owner: Neutral + Location: 71,32 + Actor2264: v16 + Owner: Neutral + Location: 70,32 + Actor2265: v08 + Owner: Neutral + Location: 61,36 + Actor2266: v03 + Owner: Neutral + Location: 156,173 + Actor2267: v05 + Owner: Neutral + Location: 158,181 + Actor2268: v17 + Owner: Neutral + Location: 161,177 + Actor2269: v16 + Owner: Neutral + Location: 162,177 + Actor2270: v07 + Owner: Neutral + Location: 162,175 + Actor2271: v12 + Owner: Neutral + Location: 155,173 + Actor2272: wood + Owner: Neutral + Location: 167,173 + Actor2273: wood + Owner: Neutral + Location: 168,173 + Actor2274: wood + Owner: Neutral + Location: 169,173 + Actor2275: wood + Owner: Neutral + Location: 169,172 + Actor2276: wood + Owner: Neutral + Location: 169,170 + Actor2277: wood + Owner: Neutral + Location: 169,171 + Actor2278: wood + Owner: Neutral + Location: 168,170 + Actor2279: wood + Owner: Neutral + Location: 165,173 + Actor2280: wood + Owner: Neutral + Location: 155,171 + Actor2281: wood + Owner: Neutral + Location: 156,171 + Actor2282: wood + Owner: Neutral + Location: 158,171 + Actor2283: wood + Owner: Neutral + Location: 66,41 + Actor2284: wood + Owner: Neutral + Location: 65,41 + Actor2285: wood + Owner: Neutral + Location: 63,39 + Actor2286: wood + Owner: Neutral + Location: 62,39 + Actor2287: wood + Owner: Neutral + Location: 70,33 + Actor2288: wood + Owner: Neutral + Location: 72,33 + Actor2289: wood + Owner: Neutral + Location: 71,33 + Actor2290: wood + Owner: Neutral + Location: 69,33 + Actor2291: wood + Owner: Neutral + Location: 72,32 + Actor2292: wood + Owner: Neutral + Location: 70,29 + Actor2293: wood + Owner: Neutral + Location: 71,29 + Actor2294: wood + Owner: Neutral + Location: 60,34 + Actor2295: wood + Owner: Neutral + Location: 70,35 + Actor2296: gunw + Owner: MaleficScrin + Facing: 384 + Location: 148,9 + Actor2297: gunw + Owner: MaleficScrin + Location: 159,8 + Facing: 641 + Actor2298: gunw + Owner: MaleficScrin + Facing: 384 + Location: 141,6 + Actor2299: gunw + Owner: MaleficScrin + Facing: 384 + Location: 16,128 + Actor2300: gunw + Owner: MaleficScrin + Facing: 384 + Location: 27,132 + Actor2301: gunw + Owner: MaleficScrin + Facing: 384 + Location: 9,76 + Actor2302: gunw + Owner: MaleficScrin + Facing: 384 + Location: 9,84 + Actor2303: gunw + Owner: MaleficScrin + Facing: 384 + Location: 5,82 + Actor2304: gunw + Owner: MaleficScrin + Location: 17,76 + Facing: 600 + Actor2305: s1 + Owner: MaleficScrin + Facing: 384 + Location: 110,8 + SubCell: 3 + Actor2306: s1 + Owner: MaleficScrin + Location: 112,6 + SubCell: 3 + Facing: 675 + Actor2307: s1 + Owner: MaleficScrin + Facing: 384 + Location: 112,4 + SubCell: 3 + Actor2308: s1 + Owner: MaleficScrin + Facing: 384 + Location: 106,9 + SubCell: 3 + Actor2309: stlk + Owner: MaleficScrin + Location: 110,6 + SubCell: 3 + Facing: 579 + Actor2310: gunw + Owner: MaleficScrin + Location: 111,7 + Facing: 613 + Actor2311: dark + Owner: MaleficScrin + Facing: 384 + Location: 165,44 + Actor2312: dark + Owner: MaleficScrin + Facing: 384 + Location: 171,43 + Actor2313: dark + Owner: MaleficScrin + Location: 148,42 + Facing: 384 + Actor2314: dark + Owner: MaleficScrin + Facing: 384 + Location: 140,42 + Actor2315: gunw + Owner: MaleficScrin + Facing: 384 + Location: 147,44 + Actor2316: gunw + Owner: MaleficScrin + Facing: 384 + Location: 141,43 + Actor2317: gunw + Owner: MaleficScrin + Location: 167,45 + Facing: 384 + Actor2318: stlk + Owner: MaleficScrin + Facing: 384 + Location: 170,45 + SubCell: 3 + Actor2319: stlk + Owner: MaleficScrin + Facing: 384 + Location: 164,44 + SubCell: 3 + Actor2320: stlk + Owner: MaleficScrin + Facing: 384 + Location: 149,44 + SubCell: 3 + Actor2321: stlk + Owner: MaleficScrin + Facing: 384 + Location: 145,43 + SubCell: 3 + Actor2322: stlk + Owner: MaleficScrin + Facing: 384 + Location: 138,42 + SubCell: 3 + Actor2323: s1 + Owner: MaleficScrin + Facing: 384 + Location: 167,47 + SubCell: 3 + Actor2324: s1 + Owner: MaleficScrin + Facing: 384 + Location: 164,46 + SubCell: 3 + Actor2325: s1 + Owner: MaleficScrin + Facing: 384 + Location: 162,45 + SubCell: 3 + Actor2326: s1 + Owner: MaleficScrin + Facing: 384 + Location: 161,45 + SubCell: 3 + Actor2327: s1 + Owner: MaleficScrin + Facing: 384 + Location: 151,44 + SubCell: 3 + Actor2328: s1 + Owner: MaleficScrin + Facing: 384 + Location: 151,44 + SubCell: 1 + Actor2329: s1 + Owner: MaleficScrin + Facing: 384 + Location: 147,46 + SubCell: 3 + Actor2330: s1 + Owner: MaleficScrin + Facing: 384 + Location: 144,46 + SubCell: 3 + Actor2331: s1 + Owner: MaleficScrin + Facing: 384 + Location: 143,44 + SubCell: 3 + Actor2332: s1 + Owner: MaleficScrin + Facing: 384 + Location: 104,77 + SubCell: 3 + Actor2333: s1 + Owner: MaleficScrin + Facing: 384 + Location: 103,74 + SubCell: 3 + Actor2334: s1 + Owner: MaleficScrin + Facing: 384 + Location: 108,77 + SubCell: 3 + Actor2335: s1 + Owner: MaleficScrin + Facing: 384 + Location: 108,77 + SubCell: 1 + Actor2336: s1 + Owner: MaleficScrin + Facing: 384 + Location: 108,78 + SubCell: 3 + Actor2337: s1 + Owner: MaleficScrin + Facing: 384 + Location: 77,86 + SubCell: 3 + Actor2338: s1 + Owner: MaleficScrin + Facing: 384 + Location: 73,83 + SubCell: 3 + Actor2339: s1 + Owner: MaleficScrin + Facing: 384 + Location: 75,83 + SubCell: 3 + Actor2340: s1 + Owner: MaleficScrin + Facing: 384 + Location: 75,89 + SubCell: 3 + Actor2341: s1 + Owner: MaleficScrin + Facing: 384 + Location: 75,90 + SubCell: 3 + Actor2342: s1 + Owner: MaleficScrin + Facing: 384 + Location: 81,84 + SubCell: 3 + Actor2343: corr + Owner: MaleficScrin + Facing: 384 + Location: 75,86 + Actor2344: s3 + Owner: MaleficScrin + Location: 49,86 + SubCell: 3 + Facing: 668 + Actor2345: s3 + Owner: MaleficScrin + Location: 54,83 + SubCell: 3 + Facing: 682 + Actor2346: lace + Owner: MaleficScrin + Location: 40,51 + Facing: 743 + E1: waypoint + Owner: Neutral + Location: 169,154 + E2a: waypoint + Owner: Neutral + Location: 135,136 + E2b: waypoint + Owner: Neutral + Location: 156,124 + N1a: waypoint + Owner: Neutral + Location: 146,28 + N1b: waypoint + Owner: Neutral + Location: 184,29 + N1c: waypoint + Owner: Neutral + Location: 105,17 + N2c: waypoint + Owner: Neutral + Location: 73,20 + N2a: waypoint + Owner: Neutral + Location: 118,58 + N2b: waypoint + Owner: Neutral + Location: 161,53 + N3a: waypoint + Owner: Neutral + Location: 145,104 + N3b: waypoint + Owner: Neutral + Location: 168,100 + EastSphere: wsph + Owner: MaleficScrin + Location: 183,154 + WestSphere1: wsph + Owner: MaleficScrin + Location: 14,73 + WestSphere2: wsph + Owner: MaleficScrin + Location: 18,74 + WestGrav: grav + Owner: MaleficScrin + Location: 8,73 + WestPortal: port + Owner: MaleficScrin + Location: 16,78 + NorthPortal2: port + Owner: MaleficScrin + Location: 153,13 + NorthPortal1: port + Owner: MaleficScrin + Location: 150,13 + NorthGrav1: grav + Owner: MaleficScrin + Location: 156,6 + NorthGrav2: grav + Owner: MaleficScrin + Location: 146,6 + EastPortal: port + Owner: MaleficScrin + Location: 183,149 + EastGrav: grav + Owner: MaleficScrin + Location: 188,143 + NWFlare: flare + Owner: Greece + Location: 73,65 + NEFlare: flare + Owner: Greece + Location: 142,65 + SEFlare: flare + Owner: Greece + Location: 135,122 + SWFlare: flare + Owner: Greece + Location: 73,129 + Actor2352: tpod + Owner: MaleficScrin + Location: 61,186 + Facing: 384 + ScriptTags: HardAndAbove + Actor2353: s4 + Owner: MaleficScrin + Facing: 384 + Location: 59,185 + SubCell: 3 + Actor2354: s4 + Owner: MaleficScrin + Facing: 384 + Location: 63,190 + SubCell: 3 + Actor2355: s1 + Owner: MaleficScrin + Facing: 384 + Location: 58,186 + SubCell: 3 + Actor2356: s1 + Owner: MaleficScrin + Facing: 384 + Location: 72,187 + SubCell: 3 + Actor2357: s1 + Owner: MaleficScrin + Facing: 384 + Location: 72,186 + SubCell: 3 + Actor2358: s1 + Owner: MaleficScrin + Facing: 384 + Location: 73,184 + SubCell: 3 + Actor2359: s1 + Owner: MaleficScrin + Facing: 384 + Location: 79,190 + SubCell: 3 + Actor2360: s1 + Owner: MaleficScrin + Facing: 384 + Location: 74,187 + SubCell: 3 + Actor2361: stlk + Owner: MaleficScrin + Facing: 384 + Location: 110,174 + SubCell: 3 + Actor2362: stlk + Owner: MaleficScrin + Facing: 384 + Location: 113,175 + SubCell: 3 + Actor2363: stlk + Owner: MaleficScrin + Facing: 384 + Location: 125,183 + SubCell: 3 + Actor2364: stlk + Owner: MaleficScrin + Facing: 384 + Location: 136,146 + SubCell: 3 + Actor2365: stlk + Owner: MaleficScrin + Facing: 384 + Location: 139,148 + SubCell: 3 + Actor2366: gunw + Owner: MaleficScrin + Facing: 384 + Location: 137,148 + Actor2367: stlk + Owner: MaleficScrin + Facing: 384 + Location: 171,129 + SubCell: 3 + Actor2368: stlk + Owner: MaleficScrin + Facing: 384 + Location: 168,128 + SubCell: 3 + Actor2369: s1 + Owner: MaleficScrin + Facing: 384 + Location: 171,130 + SubCell: 3 + Actor2370: s1 + Owner: MaleficScrin + Facing: 384 + Location: 166,127 + SubCell: 3 + Actor2371: s1 + Owner: MaleficScrin + Facing: 384 + Location: 173,124 + SubCell: 3 + Actor2372: s1 + Owner: MaleficScrin + Facing: 384 + Location: 172,129 + SubCell: 3 + Actor2373: s1 + Owner: MaleficScrin + Facing: 384 + Location: 144,179 + SubCell: 3 + Actor2374: s1 + Owner: MaleficScrin + Facing: 384 + Location: 143,177 + SubCell: 3 + Actor2375: s1 + Owner: MaleficScrin + Facing: 384 + Location: 145,179 + SubCell: 3 + Actor2376: stlk + Owner: MaleficScrin + Facing: 384 + Location: 144,178 + SubCell: 3 + Actor2377: s4 + Owner: MaleficScrin + Facing: 384 + Location: 145,181 + SubCell: 3 + SWBaseCenter: waypoint + Owner: Neutral + Location: 74,129 + N3c: waypoint + Owner: Neutral + Location: 71,48 + N3d: waypoint + Owner: Neutral + Location: 117,114 + W1: waypoint + Owner: Neutral + Location: 36,95 + W2a: waypoint + Owner: Neutral + Location: 55,74 + W2b: waypoint + Owner: Neutral + Location: 72,109 + W2c: waypoint + Owner: Neutral + Location: 53,127 + W2d: waypoint + Owner: Neutral + Location: 72,85 + N2d: waypoint + Owner: Neutral + Location: 164,66 + InitNavalYard: syrd + Owner: England + Location: 104,155 + Health: 39 + Tran1: lst + Owner: England + Location: 103,157 + Health: 20 + Facing: 384 + Tran2: lst + Owner: England + Location: 103,155 + Health: 61 + Facing: 384 + Tran3: lst + Owner: England + Location: 106,154 + Health: 38 + Facing: 384 + MiniBase3: waypoint + Owner: Neutral + Location: 138,168 + MiniBase2: waypoint + Owner: Neutral + Location: 108,157 + MiniBase1: waypoint + Owner: Neutral + Location: 73,99 + McvDest: waypoint + Owner: Neutral + Location: 96,176 + McvSpawn: waypoint + Owner: Neutral + Location: 96,192 + Actor2349: camera + Owner: MaleficScrin + Location: 64,128 + Actor2350: camera + Owner: MaleficScrin + Location: 73,119 + Actor2351: camera + Owner: MaleficScrin + Location: 143,123 + Actor2378: camera + Owner: MaleficScrin + Location: 134,133 + Actor2379: camera + Owner: MaleficScrin + Location: 152,66 + Actor2380: camera + Owner: MaleficScrin + Location: 139,61 + Actor2381: camera + Owner: MaleficScrin + Location: 72,60 + Actor2382: camera + Owner: MaleficScrin + Location: 63,68 + Actor2383: camera + Owner: MaleficScrin + Location: 167,156 + Actor2384: camera + Owner: MaleficScrin + Location: 143,150 + Actor2385: camera + Owner: MaleficScrin + Location: 173,171 + Actor2386: camera + Owner: MaleficScrin + Location: 38,116 + Actor2387: camera + Owner: MaleficScrin + Location: 17,100 + Actor2388: camera + Owner: MaleficScrin + Location: 59,53 + Actor2389: camera + Owner: MaleficScrin + Location: 112,49 + NorthSphere2: wsph + Owner: MaleficScrin + Location: 157,11 + NorthSphere1: wsph + Owner: MaleficScrin + Location: 145,11 + PlayerStart: waypoint + Owner: Neutral + Location: 13,186 + E3b: waypoint + Owner: Neutral + Location: 157,69 + E3a: waypoint + Owner: Neutral + Location: 143,82 + E2c: waypoint + Owner: Neutral + Location: 174,115 + Actor2392: s1 + Owner: MaleficScrin + Facing: 384 + Location: 145,70 + SubCell: 3 + RoamRally1: waypoint + Owner: Neutral + Location: 71,163 + RoamRally2: waypoint + Owner: Neutral + Location: 133,153 + RoamRally3: waypoint + Owner: Neutral + Location: 59,30 + RoamRally4: waypoint + Owner: Neutral + Location: 128,94 + Actor2393: cycl + Owner: Neutral + Location: 70,1 + Actor2394: cycl + Owner: Neutral + Location: 71,1 + Actor2395: cycl + Owner: Neutral + Location: 72,1 + Actor2396: cycl + Owner: Neutral + Location: 73,1 + Actor2397: cycl + Owner: Neutral + Location: 74,1 + Actor2398: cycl + Owner: Neutral + Location: 76,1 + Actor2399: cycl + Owner: Neutral + Location: 75,1 + Actor2400: cycl + Owner: Neutral + Location: 77,1 + Actor2401: cycl + Owner: Neutral + Location: 78,1 + Actor2402: cycl + Owner: Neutral + Location: 70,2 + Actor2403: cycl + Owner: Neutral + Location: 70,3 + Health: 32 + Actor2404: cycl + Owner: Neutral + Location: 70,4 + Actor2405: cycl + Owner: Neutral + Location: 70,5 + Actor2406: cycl + Owner: Neutral + Location: 70,6 + Actor2407: cycl + Owner: Neutral + Location: 72,6 + Actor2408: cycl + Owner: Neutral + Location: 71,6 + Health: 44 + Actor2409: cycl + Owner: Neutral + Location: 76,6 + Health: 16 + Actor2410: cycl + Owner: Neutral + Location: 77,6 + Actor2411: cycl + Owner: Neutral + Location: 78,6 + Actor2412: cycl + Owner: Neutral + Location: 78,5 + Actor2413: cycl + Owner: Neutral + Location: 78,4 + Health: 46 + Actor2414: cycl + Owner: Neutral + Location: 78,3 + Actor2415: cycl + Owner: Neutral + Location: 78,2 + Actor2417: dark + Owner: MaleficScrin + Facing: 384 + Location: 77,12 + Actor2418: corr + Owner: MaleficScrin + Facing: 384 + Location: 70,8 + Actor2419: stlk + Owner: MaleficScrin + Facing: 384 + Location: 77,10 + SubCell: 3 + Actor2420: stlk + Owner: MaleficScrin + Facing: 384 + Location: 79,11 + SubCell: 3 + Actor2421: stlk + Owner: MaleficScrin + Facing: 384 + Location: 72,8 + SubCell: 3 + Actor2422: s1 + Owner: MaleficScrin + Facing: 384 + Location: 74,11 + SubCell: 3 + Actor2423: s1 + Owner: MaleficScrin + Facing: 384 + Location: 71,7 + SubCell: 3 + Actor2424: s1 + Owner: MaleficScrin + Facing: 384 + Location: 73,14 + SubCell: 3 + Actor2427: s3 + Owner: MaleficScrin + Facing: 384 + Location: 76,11 + SubCell: 3 + Actor2428: seek + Owner: MaleficScrin + Facing: 384 + Location: 186,147 + Actor2429: seek + Owner: MaleficScrin + Facing: 384 + Location: 159,5 + Actor2430: seek + Owner: MaleficScrin + Facing: 384 + Location: 146,9 + Actor2431: seek + Owner: MaleficScrin + Location: 11,73 + Facing: 613 + Actor2432: seek + Owner: MaleficScrin + Location: 7,73 + Facing: 491 + AlliedMcv: mcv + Owner: England + Location: 76,3 + ScriptTags: VeryHardAndAbove + Health: 58 + Facing: 384 + Actor2425: s1 + Owner: MaleficScrin + Facing: 384 + Location: 75,10 + SubCell: 3 + Actor2426: s3 + Owner: MaleficScrin + Facing: 384 + Location: 78,10 + SubCell: 3 + Actor2416: camera + Owner: MaleficScrin + Location: 120,119 + Actor2433: camera + Owner: MaleficScrin + Location: 73,38 + Actor2434: camera + Owner: MaleficScrin + Location: 74,146 + NorthPlatform: sfac + Owner: MaleficScrin + Location: 151,2 + WestPlatform: sfac + Owner: MaleficScrin + Location: 2,74 + Actor2435: brik + Owner: England + Location: 86,134 + Actor2436: brik + Owner: England + Location: 85,134 + Actor2437: brik + Owner: England + Location: 85,135 + Actor2438: brik + Owner: England + Location: 86,135 + Actor2439: brik + Owner: England + Location: 84,135 + Actor2440: brik + Owner: England + Location: 83,135 + Actor2441: brik + Owner: England + Location: 81,135 + Actor2442: brik + Owner: England + Location: 81,134 + Actor2443: brik + Owner: England + Location: 82,135 + Actor2444: brik + Owner: England + Location: 82,134 + Actor2445: brik + Owner: England + Location: 83,129 + Actor2446: brik + Owner: England + Location: 83,128 + Actor2447: brik + Owner: England + Location: 83,127 + Actor2448: brik + Owner: England + Location: 82,127 + Actor2449: brik + Owner: England + Location: 82,128 + Actor2450: brik + Owner: England + Location: 84,129 + Actor2451: brik + Owner: England + Location: 84,128 + Actor2452: agun + Owner: England + Location: 82,129 + Health: 37 + TurretFacing: 661 + Actor1640: t05 + Owner: Neutral + Location: 107,134 + Actor568: gunw + Owner: MaleficScrin + Facing: 770 + Location: 79,124 + Actor566: tpod + Owner: MaleficScrin + Location: 76,130 + Facing: 384 + ScriptTags: HardAndAbove + Actor441: harv + Owner: England + Health: 66 + Facing: 384 + Location: 78,133 + Actor2453: gun + Owner: England + Location: 63,132 + Actor2454: gun + Owner: England + Location: 63,123 + Actor2456: s1 + Owner: MaleficScrin + Facing: 384 + Location: 147,70 + SubCell: 3 + Actor2457: s1 + Owner: MaleficScrin + Facing: 384 + Location: 146,71 + SubCell: 3 + Actor2458: s1 + Owner: MaleficScrin + Facing: 384 + Location: 136,64 + SubCell: 3 + Actor2459: s1 + Owner: MaleficScrin + Facing: 384 + Location: 139,66 + SubCell: 3 + Actor1709: tc01 + Owner: Neutral + Location: 80,26 + Actor2070: t11 + Owner: Neutral + Location: 104,21 + Actor2083: t12 + Owner: Neutral + Location: 100,22 + Actor2462: ifv + Owner: Greece + Location: 10,185 + Facing: 768 + Actor2463: ifv + Owner: Greece + Location: 10,187 + Facing: 768 + Actor2461: delp + Owner: Greece + Facing: 768 + Location: 12,185 + Actor2460: delp + Owner: Greece + Facing: 768 + Location: 12,187 + Actor2464: seal + Owner: Greece + Location: 19,183 + SubCell: 3 + Facing: 768 + Actor2465: seal + Owner: Greece + Location: 19,189 + SubCell: 3 + Facing: 768 + Actor2466: apwr + Owner: England + Location: 140,165 + Health: 46 + Actor2467: apwr + Owner: England + Location: 140,169 + Health: 35 + Actor548: chain + Owner: England + Location: 143,167 + Actor2468: shar + Owner: MaleficScrin + Location: 51,11 + Actor2469: nerv + Owner: MaleficScrin + Location: 52,12 + Actor2471: silo + Owner: England + Location: 71,129 + Health: 46 + Actor2472: silo + Owner: England + Location: 69,129 + Health: 39 + Actor2470: proc + Owner: England + Location: 69,129 + Health: 38 + FreeActor@CHARV: False + FreeActor: False + Actor298: atek + Owner: England + Health: 42 + Location: 138,62 + Actor2474: powr + Owner: England + Location: 65,58 + Health: 40 + Actor398: proc + Owner: England + FreeActor@CHARV: False + FreeActor: False + Health: 38 + Location: 135,66 + Actor444: harv + Owner: England + Location: 134,70 + Health: 37 + Facing: 256 + Actor2473: dome + Owner: England + Health: 46 + Location: 144,60 + Actor2391: s1 + Owner: MaleficScrin + Facing: 384 + Location: 146,64 + SubCell: 3 + MachineShop: macs + Owner: Neutral + Health: 46 + Location: 137,166 + Actor296: tent + Owner: England + Location: 68,70 + Health: 44 + Actor2390: s1 + Owner: MaleficScrin + Facing: 384 + Location: 66,67 + SubCell: 3 + Actor1078: stlk + Owner: MaleficScrin + Facing: 384 + Location: 66,65 + SubCell: 3 + Actor1072: dark + Owner: MaleficScrin + Location: 72,71 + Facing: 384 + ScriptTags: HardAndAbove + Actor1075: mrdr + Owner: MaleficScrin + Facing: 384 + Location: 71,70 + SubCell: 3 + Actor425: agun + Owner: England + Health: 46 + TurretFacing: 177 + Location: 65,63 + Actor990: s1 + Owner: MaleficScrin + Facing: 627 + Location: 80,123 + SubCell: 3 + Actor2455: gunw + Owner: MaleficScrin + Facing: 384 + Location: 72,122 + Actor985: s1 + Owner: MaleficScrin + Facing: 384 + Location: 72,123 + SubCell: 3 + Actor986: s1 + Owner: MaleficScrin + Facing: 600 + Location: 71,122 + SubCell: 3 + Actor989: s1 + Owner: MaleficScrin + Facing: 384 + Location: 73,122 + SubCell: 3 + Actor299: dome + Owner: England + Health: 27 + Location: 77,121 + Actor426: orep + Owner: England + Health: 42 + Location: 73,125 + Actor118: tent + Owner: England + Health: 38 + Location: 69,124 + Actor439: apwr + Owner: England + Health: 40 + Location: 76,72 + Actor410: tent + Owner: England + Health: 40 + Location: 145,66 + Actor427: proc + Owner: England + FreeActor@CHARV: False + FreeActor: False + Health: 40 + Location: 137,118 + Actor1001: gunw + Owner: MaleficScrin + Facing: 682 + Location: 135,120 + WarFactory: weap + Owner: England + Health: 36 + Location: 137,124 + Actor480: apwr + Owner: England + Health: 40 + Location: 131,124 + Actor2476: rea2 + Owner: MaleficScrin + Location: 3,2 + Actor2477: rea2 + Owner: MaleficScrin + Location: 6,2 + Actor2478: rea2 + Owner: MaleficScrin + Location: 9,2 + Actor2479: rea2 + Owner: MaleficScrin + Location: 3,5 + Actor2480: rea2 + Owner: MaleficScrin + Location: 6,5 + Actor2481: rea2 + Owner: MaleficScrin + Location: 9,5 + Gateway: wormholexxl + Owner: MaleficScrin + Location: 7,12 + Actor2482: swal + Owner: MaleficScrin + Location: 2,1 + Actor2483: swal + Owner: MaleficScrin + Location: 2,2 + Actor2484: swal + Owner: MaleficScrin + Location: 2,3 + Actor2485: swal + Owner: MaleficScrin + Location: 2,4 + Actor2486: swal + Owner: MaleficScrin + Location: 2,5 + Actor2487: swal + Owner: MaleficScrin + Location: 2,6 + Actor2488: swal + Owner: MaleficScrin + Location: 2,7 + Actor2489: swal + Owner: MaleficScrin + Location: 2,8 + Actor2490: swal + Owner: MaleficScrin + Location: 4,8 + Actor2491: swal + Owner: MaleficScrin + Location: 3,8 + Actor2492: swal + Owner: MaleficScrin + Location: 5,8 + Actor2493: swal + Owner: MaleficScrin + Location: 7,8 + Actor2494: swal + Owner: MaleficScrin + Location: 6,8 + Actor2495: swal + Owner: MaleficScrin + Location: 8,8 + Actor2496: swal + Owner: MaleficScrin + Location: 10,8 + Actor2497: swal + Owner: MaleficScrin + Location: 9,8 + Actor2498: swal + Owner: MaleficScrin + Location: 11,8 + Actor2499: swal + Owner: MaleficScrin + Location: 12,8 + Actor2500: swal + Owner: MaleficScrin + Location: 12,7 + Actor2501: swal + Owner: MaleficScrin + Location: 12,6 + Actor2502: swal + Owner: MaleficScrin + Location: 12,5 + Actor2503: swal + Owner: MaleficScrin + Location: 12,4 + Actor2504: swal + Owner: MaleficScrin + Location: 12,3 + Actor2505: swal + Owner: MaleficScrin + Location: 12,2 + Actor2506: swal + Owner: MaleficScrin + Location: 12,1 + Actor2507: swal + Owner: MaleficScrin + Location: 11,1 + Actor2508: swal + Owner: MaleficScrin + Location: 9,1 + Actor2509: swal + Owner: MaleficScrin + Location: 10,1 + Actor2510: swal + Owner: MaleficScrin + Location: 8,1 + Actor2511: swal + Owner: MaleficScrin + Location: 7,1 + Actor2512: swal + Owner: MaleficScrin + Location: 4,1 + Actor2513: swal + Owner: MaleficScrin + Location: 3,1 + Actor2514: swal + Owner: MaleficScrin + Location: 6,1 + Actor2515: swal + Owner: MaleficScrin + Location: 5,1 + Actor2516: shar + Owner: MaleficScrin + Location: 15,6 + Actor2517: shar + Owner: MaleficScrin + Location: 15,13 + Actor2518: shar + Owner: MaleficScrin + Location: 4,20 + Actor2475: weap + Owner: England + Health: 38 + Location: 69,66 + Actor304: fix + Owner: England + Health: 30 + Location: 74,66 + VoidEngine1: veng + Owner: MaleficScrin + Location: 18,36 + Facing: 384 + VoidEngine2: veng + Owner: MaleficScrin + Location: 33,23 + Facing: 384 + ScriptTags: VeryHardAndAbove + SWBaseTopLeft: waypoint + Owner: Neutral + Location: 58,116 + SWBaseBottomRight: waypoint + Owner: Neutral + Location: 87,150 + NWBaseTopLeft: waypoint + Owner: Neutral + Location: 62,55 + NWBaseBottomRight: waypoint + Owner: Neutral + Location: 81,77 + NEBaseTopLeft: waypoint + Owner: Neutral + Location: 130,55 + NEBaseBottomRight: waypoint + Owner: Neutral + Location: 151,76 + SEBaseBottomRight: waypoint + Owner: Neutral + Location: 145,133 + SEBaseTopLeft: waypoint + Owner: Neutral + Location: 123,113 + MiniBase1TopLeft: waypoint + Owner: Neutral + Location: 67,95 + MiniBase1BottomRight: waypoint + Owner: Neutral + Location: 76,103 + MiniBase2TopLeft: waypoint + Owner: Neutral + Location: 101,151 + MiniBase2BottomRight: waypoint + Owner: Neutral + Location: 114,163 + Actor1211: tc05 + Owner: Neutral + Location: 114,163 + MiniBase3TopLeft: waypoint + Owner: Neutral + Location: 131,162 + MiniBase3BottomRight: waypoint + Owner: Neutral + Location: 144,173 + McvReveal: waypoint + Owner: Neutral + Location: 74,5 + McvBaseTopLeft: waypoint + Owner: Neutral + Location: 69,0 + McvBaseBottomRight: waypoint + Owner: Neutral + Location: 80,15 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|missions/main-campaign/ca48-banishment/banishment-rules.yaml, ca|rules/custom/coop-rules.yaml, banishment-coop-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/main-campaign/ca-prologue-01/disturbance.aud b/mods/ca/missions/main-campaign/ca-prologue-01/disturbance.aud new file mode 100644 index 0000000000..bf2c585470 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca-prologue-01/disturbance.aud differ diff --git a/mods/ca/missions/main-campaign/ca-prologue-01/encountering.aud b/mods/ca/missions/main-campaign/ca-prologue-01/encountering.aud new file mode 100644 index 0000000000..4a46e30bf1 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca-prologue-01/encountering.aud differ diff --git a/mods/ca/missions/main-campaign/ca-prologue-01/impossible.aud b/mods/ca/missions/main-campaign/ca-prologue-01/impossible.aud new file mode 100644 index 0000000000..9de9d1854e Binary files /dev/null and b/mods/ca/missions/main-campaign/ca-prologue-01/impossible.aud differ diff --git a/mods/ca/missions/main-campaign/ca-prologue-01/map.bin b/mods/ca/missions/main-campaign/ca-prologue-01/map.bin new file mode 100644 index 0000000000..0c92b3ac7d Binary files /dev/null and b/mods/ca/missions/main-campaign/ca-prologue-01/map.bin differ diff --git a/mods/ca/missions/main-campaign/ca-prologue-01/map.png b/mods/ca/missions/main-campaign/ca-prologue-01/map.png new file mode 100644 index 0000000000..b732f5a030 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca-prologue-01/map.png differ diff --git a/mods/ca/missions/main-campaign/ca-prologue-01/map.yaml b/mods/ca/missions/main-campaign/ca-prologue-01/map.yaml new file mode 100644 index 0000000000..279958ef8d --- /dev/null +++ b/mods/ca/missions/main-campaign/ca-prologue-01/map.yaml @@ -0,0 +1,524 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: i. Relativity + +Author: Darkademic + +Tileset: SNOW + +MapSize: 128,128 + +Bounds: 49,45,30,46 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: USSR, Greece + PlayerReference@USSR: + Name: USSR + Bot: campaign + Faction: soviet + Color: FE1100 + Enemies: Greece, England, Civilians, Creeps + PlayerReference@Greece: + Name: Greece + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: allies + LockColor: True + Color: 99ACF2 + LockSpawn: True + LockTeam: True + Allies: England + Enemies: USSR, Creeps + PlayerReference@England: + Name: England + Faction: allies + Color: A1EF8C + Allies: Greece + Enemies: USSR + PlayerReference@Civilians: + Name: Civilians + NonCombatant: True + Faction: ukraine + Enemies: USSR + +Actors: + Actor0: t16 + Location: 66,46 + Owner: Neutral + Actor1: t17 + Location: 59,46 + Owner: Neutral + Actor2: tc04 + Location: 75,44 + Owner: Neutral + Actor3: tc05 + Location: 76,45 + Owner: Neutral + Actor4: t01 + Location: 52,50 + Owner: Neutral + Actor5: t02 + Location: 70,68 + Owner: Neutral + Actor6: t05 + Location: 73,64 + Owner: Neutral + Actor7: t14 + Location: 59,50 + Owner: Neutral + Actor8: t17 + Location: 56,61 + Owner: Neutral + Actor9: tc01 + Location: 53,64 + Owner: Neutral + Actor10: tc02 + Location: 49,66 + Owner: Neutral + Actor11: t07 + Location: 49,59 + Owner: Neutral + Actor12: tc05 + Location: 49,60 + Owner: Neutral + Actor13: tc04 + Location: 50,58 + Owner: Neutral + Actor14: tc03 + Location: 69,50 + Owner: Neutral + Actor15: t11 + Location: 77,60 + Owner: Neutral + Actor16: t01 + Location: 78,59 + Owner: Neutral + Actor17: tc01 + Location: 76,56 + Owner: Neutral + Actor18: t08 + Location: 66,50 + Owner: Neutral + Actor19: t17 + Location: 57,56 + Owner: Neutral + Actor20: t01 + Location: 73,67 + Owner: Neutral + Actor21: tc01 + Location: 54,45 + Owner: Neutral + NorthEastTeslaCoil: tsla + Location: 71,60 + Owner: USSR + Actor23: powr + Location: 75,64 + Owner: USSR + Actor24: powr + Location: 67,57 + Owner: USSR + BarrelPower: powr + Location: 61,57 + Owner: USSR + Actor27: fact + Location: 69,62 + Owner: USSR + Actor28: dome + Location: 67,65 + Owner: USSR + Actor29: barr + Location: 61,64 + Owner: USSR + Actor30: tsla + Location: 67,68 + Owner: USSR + Actor31: tsla + Location: 60,67 + Owner: USSR + Actor32: weap + Location: 65,62 + Owner: USSR + Actor33: proc + Location: 73,58 + Owner: USSR + Actor34: kenn + Location: 64,65 + Owner: USSR + Actor35: powr + Location: 65,57 + Owner: USSR + Actor36: powr + Location: 77,64 + Owner: USSR + Actor37: powr + Location: 75,67 + Owner: USSR + Actor38: silo + Location: 59,64 + Owner: USSR + Actor39: powr + Location: 77,67 + Owner: USSR + Actor41: brl3 + Location: 60,57 + Owner: USSR + Actor42: barl + Location: 60,56 + Owner: USSR + Actor43: barl + Location: 61,56 + Owner: USSR + Actor44: brl3 + Location: 60,58 + Owner: USSR + Actor45: barl + Location: 58,56 + Owner: USSR + Actor46: barl + Location: 59,59 + Owner: USSR + Actor47: jeep + Location: 63,50 + Owner: Greece + Facing: 512 + Actor49: jeep + Location: 62,50 + Owner: Greece + Facing: 512 + Actor50: jeep + Location: 64,50 + Owner: Greece + Facing: 512 + Actor55: e2 + Location: 73,66 + Owner: USSR + SubCell: 1 + Response3: e1 + Location: 62,67 + Owner: USSR + SubCell: 4 + Facing: 512 + Response5: e1 + Location: 67,67 + Owner: USSR + SubCell: 3 + Facing: 640 + Response4: e1 + Location: 65,67 + Owner: USSR + SubCell: 3 + Facing: 640 + Response1: e1 + Location: 56,60 + Owner: USSR + SubCell: 1 + Facing: 384 + Response2: e1 + Location: 58,60 + Owner: USSR + SubCell: 1 + Facing: 256 + Actor64: e1 + Location: 64,49 + Owner: Greece + SubCell: 1 + Facing: 512 + Actor65: e1 + Location: 63,49 + Owner: Greece + Facing: 512 + SubCell: 0 + Actor66: e1 + Location: 62,49 + Owner: Greece + Facing: 640 + SubCell: 2 + Actor69: e2 + Location: 62,56 + Owner: USSR + Facing: 128 + SubCell: 1 + Actor70: e2 + Location: 62,56 + Owner: USSR + SubCell: 4 + Actor71: e1 + Location: 64,49 + Owner: Greece + SubCell: 2 + Facing: 512 + Actor72: e1 + Location: 62,49 + Owner: Greece + Facing: 512 + SubCell: 1 + Actor48: fenc + Location: 53,60 + Owner: USSR + Actor51: fenc + Location: 53,59 + Owner: USSR + Actor52: fenc + Location: 54,59 + Owner: USSR + Actor60: fenc + Location: 53,63 + Owner: USSR + Actor61: fenc + Location: 54,63 + Owner: USSR + Actor73: fenc + Location: 55,63 + Owner: USSR + Actor74: fenc + Location: 55,64 + Owner: USSR + Actor75: fenc + Location: 55,65 + Owner: USSR + Actor76: fenc + Location: 55,66 + Owner: USSR + Actor77: fenc + Location: 55,67 + Owner: USSR + Actor78: fenc + Location: 56,67 + Owner: USSR + Actor79: fenc + Location: 57,67 + Owner: USSR + Actor80: fenc + Location: 58,67 + Owner: USSR + Actor81: fenc + Location: 58,68 + Owner: USSR + Actor82: fenc + Location: 73,70 + Owner: USSR + Actor83: fenc + Location: 74,70 + Owner: USSR + Actor84: fenc + Location: 78,70 + Owner: USSR + Actor85: fenc + Location: 77,70 + Owner: USSR + Actor86: fenc + Location: 76,70 + Owner: USSR + Actor87: fenc + Location: 78,58 + Owner: USSR + Actor99: fenc + Location: 78,59 + Owner: USSR + Actor88: fenc + Location: 77,58 + Owner: USSR + Actor89: fenc + Location: 78,57 + Owner: USSR + Actor90: fenc + Location: 78,56 + Owner: USSR + Actor91: fenc + Location: 77,56 + Owner: USSR + Actor98: fenc + Location: 76,56 + Owner: USSR + Actor92: fenc + Location: 75,56 + Owner: USSR + Actor93: fenc + Location: 74,56 + Owner: USSR + Actor94: fenc + Location: 74,55 + Owner: USSR + Actor95: fenc + Location: 68,55 + Owner: USSR + Actor96: fenc + Location: 69,55 + Owner: USSR + Actor97: fenc + Location: 68,54 + Owner: USSR + Lab: stek + Location: 61,60 + Owner: USSR + OilPump: v19 + Location: 59,57 + Owner: USSR + LabGuard1: e1 + Location: 64,61 + Owner: USSR + SubCell: 4 + LabGuard2: e1 + Location: 63,63 + Owner: USSR + Facing: 384 + SubCell: 0 + LabGuard3: e1 + Location: 61,63 + Owner: USSR + Facing: 512 + SubCell: 0 + Patrol1: dog + Location: 63,59 + Owner: USSR + SubCell: 2 + Patrol2: e1 + Location: 64,58 + Owner: USSR + SubCell: 3 + Patrol3: e1 + Location: 64,59 + Owner: USSR + SubCell: 2 + Patrol4: e1 + Location: 62,55 + Owner: USSR + SubCell: 4 + Civilian1: c8 + Location: 74,50 + SubCell: 0 + Faction: england + Owner: Civilians + Civilian2: c7 + Location: 76,48 + SubCell: 3 + Faction: england + Owner: Civilians + EinsteinSpawnPoint: waypoint + Location: 62,60 + Owner: Neutral + InsertionEntry: waypoint + Location: 63,45 + Owner: Neutral + InsertionLZ: waypoint + Location: 63,47 + Owner: Neutral + BaseCameraPoint: waypoint + Location: 64,63 + Owner: Neutral + ExtractionLZ: waypoint + Location: 53,49 + Owner: Neutral + ExtractionFlarePoint: waypoint + Location: 54,48 + Owner: Neutral + ExtractionExitPoint: waypoint + Location: 78,49 + Owner: Neutral + CruiserCameraPoint: waypoint + Location: 69,67 + Owner: Neutral + CruiserPoint2: waypoint + Location: 64,75 + Owner: Neutral + CruiserPoint3: waypoint + Location: 68,76 + Owner: Neutral + CivMove: waypoint + Location: 69,56 + Owner: Neutral + CruiserPoint1: waypoint + Owner: Neutral + Location: 60,75 + CruiserPoint4: waypoint + Owner: Neutral + Location: 72,76 + PrismSpawn1: waypoint + Owner: Neutral + Location: 55,61 + PrismSpawn2: waypoint + Owner: Neutral + Location: 53,62 + Actor131: ss + Owner: USSR + Stance: Defend + Location: 58,78 + Facing: 570 + Actor136: ss + Owner: USSR + Stance: Defend + Location: 70,78 + Facing: 420 + Actor137: ss + Owner: USSR + Stance: Defend + Location: 65,78 + Facing: 491 + Actor138: ss + Owner: USSR + Stance: Defend + Location: 62,78 + Facing: 578 + Actor132: ss + Owner: USSR + Stance: Defend + Facing: 475 + Location: 73,78 + Actor135: ss + Owner: USSR + Facing: 713 + Stance: Defend + Location: 56,80 + SouthReinforcementsPoint: waypoint + Owner: Neutral + Location: 55,90 + CruiserSpawn1: waypoint + Owner: Neutral + Location: 60,90 + CruiserSpawn2: waypoint + Owner: Neutral + Location: 64,90 + CruiserSpawn3: waypoint + Owner: Neutral + Location: 68,90 + CruiserSpawn4: waypoint + Owner: Neutral + Location: 72,90 + PrismSpawn3: waypoint + Owner: Neutral + Location: 56,64 + CruiserBeacon: waypoint + Owner: Neutral + Location: 65,88 + PrismBeacon: waypoint + Owner: Neutral + Location: 55,62 + TanyaDest: waypoint + Owner: Neutral + Location: 63,48 + SubPen: spen + Owner: USSR + Location: 75,75 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-coalitions.yaml, relativity-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml, relativity-weapons.yaml diff --git a/mods/ca/missions/main-campaign/ca-prologue-01/r_alliedcruisers.aud b/mods/ca/missions/main-campaign/ca-prologue-01/r_alliedcruisers.aud new file mode 100644 index 0000000000..42fbbb8154 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca-prologue-01/r_alliedcruisers.aud differ diff --git a/mods/ca/missions/main-campaign/ca-prologue-01/r_unidentified.aud b/mods/ca/missions/main-campaign/ca-prologue-01/r_unidentified.aud new file mode 100644 index 0000000000..e64cde63bd Binary files /dev/null and b/mods/ca/missions/main-campaign/ca-prologue-01/r_unidentified.aud differ diff --git a/mods/ca/missions/main-campaign/ca-prologue-01/relativity-rules.yaml b/mods/ca/missions/main-campaign/ca-prologue-01/relativity-rules.yaml new file mode 100644 index 0000000000..7b0b022c80 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca-prologue-01/relativity-rules.yaml @@ -0,0 +1,48 @@ +^Palettes: + FlashPostProcessEffect@CHRONO: + Type: Chronoshift + +World: + LuaScript: + Scripts: campaign.lua, relativity.lua + MissionData: + Briefing: The Soviets have captured one of our most important scientists, Professor Einstein.\n\nHe is currently being held inside a Soviet base not far from the border. It is crucial that he be rescued before he can be transported deeper into Soviet territory.\n\nUsing a small task force led by our special commando Tanya Adams, rescue Einstein and bring him to the extraction point.\n\nThe Soviet base is protected by Tesla Coils. Cutting their power supply will render them inoperative. + -ScriptLobbyDropdown@DIFFICULTY: + ScriptLobbyDropdown@PROLOGUEDIFFICULTY: + ID: prologuedifficulty + Label: dropdown-difficulty.label + Description: dropdown-difficulty.description + Values: + easy: options-difficulty.easy + Default: easy + Locked: True + MusicPlaylist: + StartingMusic: bigf226m + +TRAN.evac: + Cargo: + Types: Einstein + MaxWeight: 1 + RejectsOrders: + -Selectable: + Interactable: + +EINSTEIN: + Passenger: + CargoType: Einstein + +C7: + -Crushable: + -Wanders: + +C8: + -Crushable: + -Wanders: + +TSLA: + Power: + Amount: -150 + +E7: + AutoTarget: + InitialStance: HoldFire diff --git a/mods/ca/missions/main-campaign/ca-prologue-01/relativity-weapons.yaml b/mods/ca/missions/main-campaign/ca-prologue-01/relativity-weapons.yaml new file mode 100644 index 0000000000..2cd82becb3 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca-prologue-01/relativity-weapons.yaml @@ -0,0 +1,5 @@ +8Inch: + InvalidTargets: Submarine, Water + +M1Carbine: + Range: 4c0 diff --git a/mods/ca/missions/main-campaign/ca-prologue-01/relativity.lua b/mods/ca/missions/main-campaign/ca-prologue-01/relativity.lua new file mode 100644 index 0000000000..187fe3b592 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca-prologue-01/relativity.lua @@ -0,0 +1,288 @@ +MissionDir = "ca|missions/main-campaign/ca-prologue-01" + +InsertionHelicopterType = "tran.evac" +InsertionPath = { InsertionEntry.Location, InsertionLZ.Location } +ExtractionHelicopterType = "tran.evac" +ExtractionPath = { SouthReinforcementsPoint.Location, ExtractionLZ.Location } +JeepReinforcements = { "jeep", "jeep" } +TanyaReinforcements = { "e7" } +EinsteinType = "einstein" +FlareType = "flare" +CruisersReinforcements = { "ca", "ca", "ca", "ca" } +OpeningAttack = { Patrol1, Patrol2, Patrol3, Patrol4 } +Responders = { Response1, Response2, Response3, Response4, Response5 } +LabGuardsTeam = { LabGuard1, LabGuard2, LabGuard3 } + +SetupPlayers = function() + Greece = Player.GetPlayer("Greece") + England = Player.GetPlayer("England") + USSR = Player.GetPlayer("USSR") + Civilians = Player.GetPlayer("Civilians") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = { Greece } + MissionEnemies = { USSR } +end + +WorldLoaded = function() + SetupPlayers() + InitObjectives(Greece) + + FindEinsteinObjective = Greece.AddObjective("Find Einstein.") + TanyaSurviveObjective = Greece.AddObjective("Tanya must survive.") + EinsteinSurviveObjective = Greece.AddObjective("Einstein must survive.") + + RunInitialActivities() + + Trigger.OnKilled(Lab, LabDestroyed) + + SovietArmy = USSR.GetGroundAttackers() + + Trigger.OnAllKilled(LabGuardsTeam, LabGuardsKilled) + + Trigger.AfterDelay(DateTime.Seconds(5), function() Actor.Create("camera", true, { Owner = Greece, Location = BaseCameraPoint.Location }) end) + + Camera.Position = InsertionLZ.CenterPosition + + Trigger.OnEnteredProximityTrigger(NorthEastTeslaCoil.CenterPosition, WDist.New(8 * 1024), function(a, id) + if a.Owner == Civilians then + local autoCamera = Actor.Create("smallcamera", true, { Owner = Greece, Location = a.Location }) + Trigger.AfterDelay(DateTime.Seconds(5), autoCamera.Destroy) + end + end) + + Trigger.OnKilled(SubPen, function(self, killer) + if ObjectiveDestroySubPen == nil then + ObjectiveDestroySubPen = Greece.AddObjective("Destroy the Soviet Sub Pen.") + end + + if not Greece.IsObjectiveCompleted(ObjectiveDestroySubPen) then + Greece.MarkCompletedObjective(ObjectiveDestroySubPen) + if not Greece.IsObjectiveFailed(TanyaSurviveObjective) then + Greece.MarkCompletedObjective(TanyaSurviveObjective) + end + end + end) + + Trigger.AfterDelay(DateTime.Seconds(30), function() + Tip("Information is displayed in the bottom right of the screen if any single unit or structure is selected, listing its strengths and weaknesses (as long as Selected Unit Tooltip is enabled in settings).") + end) + + AfterWorldLoaded() +end + +Tick = function() + PanToCruisers() + PanToPrisms() + OncePerSecondChecks() + AfterTick() +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + USSR.Resources = USSR.ResourceCapacity - 500 + end +end + +SendInsertionHelicopter = function() + local passengers = Reinforcements.ReinforceWithTransport(Greece, InsertionHelicopterType, + TanyaReinforcements, InsertionPath, { InsertionEntry.Location })[2] + local tanya = passengers[1] + Trigger.OnKilled(tanya, TanyaKilledInAction) + Trigger.OnAddedToWorld(tanya, function(a) + if not a.IsDead then + a.Move(TanyaDest.Location) + end + end) +end + +RunInitialActivities = function() + SendInsertionHelicopter() + + Utils.Do(OpeningAttack, function(a) + IdleHunt(a) + end) + + Civilian1.Move(CivMove.Location) + + local powerPlants = USSR.GetActorsByType("powr") + Trigger.OnAnyKilled(powerPlants, function() + if not PowerDown then + PowerDown = true + local teslaCoils = USSR.GetActorsByType("tsla") + Utils.Do(teslaCoils, function(self) + if not self.IsDead then + self.GrantCondition("disabled") + end + end) + + if not Civilian2.IsDead then + Civilian2.Move(CivMove.Location) + end + Utils.Do(Responders, function(r) + if not r.IsDead then + IdleHunt(r) + end + end) + end + end) +end + +LabGuardsKilled = function() + CreateEinstein() + + Trigger.AfterDelay(DateTime.Seconds(4), function() + Actor.Create(FlareType, true, { Owner = England, Location = ExtractionFlarePoint.Location }) + PlaySpeechNotificationToMissionPlayers("SignalFlare") + SendExtractionHelicopter() + end) + + Trigger.AfterDelay(DateTime.Seconds(14), function() + Utils.Do(SovietArmy, function(a) + if not a.IsDead and a.HasProperty("Hunt") then + Trigger.OnIdle(a, a.Hunt) + end + end) + end) +end + +SendExtractionHelicopter = function() + Heli = Reinforcements.ReinforceWithTransport(Greece, ExtractionHelicopterType, nil, ExtractionPath)[1] + if not Einstein.IsDead then + Trigger.OnRemovedFromWorld(Einstein, EvacuateHelicopter) + end + Trigger.OnKilled(Heli, RescueFailed) + Trigger.OnRemovedFromWorld(Heli, HelicopterGone) +end + +EvacuateHelicopter = function() + if Heli.HasPassengers then + Heli.Move(ExtractionExitPoint.Location) + Heli.Destroy() + end +end + +SendCruisers = function() + CruisersArrived = true + + Notification("Allied cruisers have arrived.") + MediaCA.PlaySound(MissionDir .. "/r_alliedcruisers.aud", 2); + Actor.Create("camera", true, { Owner = Greece, Location = CruiserCameraPoint.Location }) + Beacon.New(Greece, CruiserBeacon.CenterPosition) + + local i = 1 + + Utils.Do(CruisersReinforcements, function(cruiser) + local ca = Actor.Create(cruiser, true, { Owner = England, Location = Map.NamedActor("CruiserSpawn" .. i).Location }) + ca.Move(Map.NamedActor("CruiserPoint" .. i).Location) + i = i + 1 + end) + + Trigger.AfterDelay(DateTime.Seconds(4), function() + Media.DisplayMessage("Encountering Soviet naval presence! We're under heavy fire!", "Cruiser Captain", HSLColor.FromHex("99ACF2")) + MediaCA.PlaySound(MissionDir .. "/encountering.aud", 2) + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(4)), function() + Media.DisplayMessage("This is impossible! These waters were cleared!", "Cruiser Captain", HSLColor.FromHex("99ACF2")) + MediaCA.PlaySound(MissionDir .. "/impossible.aud", 2) + Trigger.AfterDelay(DateTime.Seconds(2), function() + if not SubPen.IsDead and ObjectiveDestroySubPen == nil then + ObjectiveDestroySubPen = Greece.AddObjective("Destroy the Soviet Sub Pen.") + Beacon.New(Greece, SubPen.CenterPosition) + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(4)), function() + PrismsArrived = true + Trigger.AfterDelay(DateTime.Seconds(1), function() + Lighting.Flash("Chronoshift", 10) + Media.PlaySound(MissionDir .. "/chrono2.aud") + Beacon.New(Greece, PrismBeacon.CenterPosition) + Actor.Create("warpin", true, { Owner = Greece, Location = PrismBeacon.Location }) + Actor.Create("ptnk", true, { Owner = England, Location = PrismSpawn1.Location, Facing = Angle.East }) + Actor.Create("ptnk", true, { Owner = England, Location = PrismSpawn2.Location, Facing = Angle.East }) + Actor.Create("ptnk", true, { Owner = England, Location = PrismSpawn3.Location, Facing = Angle.East }) + Trigger.AfterDelay(DateTime.Seconds(2), function() + Notification("Unidentified Allied units detected.") + MediaCA.PlaySound(MissionDir .. "/r_unidentified.aud", 2) + + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(3)), function() + Media.DisplayMessage("Another temporal disturbance.. Well, we can work this out later. For now, we are at your disposal commander.", "Unknown", HSLColor.FromHex("99ACF2")) + MediaCA.PlaySound(MissionDir .. "/disturbance.aud", 2) + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(5)), function() + local prismTanks = England.GetActorsByType("ptnk") + Utils.Do(prismTanks, function(a) + if not a.IsDead then + a.Owner = Greece + end + end) + end) + end) + end) + end) + end) + end + end) + end) + end) +end + +LabDestroyed = function() + if not Einstein then + RescueFailed() + end +end + +RescueFailed = function() + PlaySpeechNotificationToMissionPlayers("ObjectiveNotMet") + Greece.MarkFailedObjective(EinsteinSurviveObjective) +end + +TanyaKilledInAction = function() + PlaySpeechNotificationToMissionPlayers("ObjectiveNotMet") + Greece.MarkFailedObjective(TanyaSurviveObjective) +end + +CreateEinstein = function() + Greece.MarkCompletedObjective(FindEinsteinObjective) + Einstein = Actor.Create(EinsteinType, true, { Location = EinsteinSpawnPoint.Location, Owner = Greece }) + Einstein.Scatter() + Trigger.OnKilled(Einstein, RescueFailed) + ExtractObjective = Greece.AddObjective("Bring Einstein to the extraction point and board\nthe transport helicopter.") + Trigger.AfterDelay(DateTime.Seconds(1), function() PlaySpeechNotificationToMissionPlayers("TargetFreed") end) +end + +HelicopterGone = function() + if not Heli.IsDead and #Heli.Passengers > 0 then + PlaySpeechNotificationToMissionPlayers("TargetRescued") + Trigger.AfterDelay(DateTime.Seconds(1), function() + Greece.MarkCompletedObjective(ExtractObjective) + Greece.MarkCompletedObjective(EinsteinSurviveObjective) + end) + + Trigger.AfterDelay(DateTime.Seconds(3), function() + SendCruisers() + end) + end +end + +PanToCruisers = function() + if PanToCruisersComplete or not CruisersArrived then + return + end + + local targetPos = CruiserBeacon.CenterPosition + PanToPos(targetPos, 1024) + + if Camera.Position.X == targetPos.X and Camera.Position.Y == targetPos.Y then + PanToCruisersComplete = true + end +end + +PanToPrisms = function() + if PanToPrismsComplete or not PrismsArrived then + return + end + + local targetPos = PrismBeacon.CenterPosition + PanToPos(targetPos, 1024) + + if Camera.Position.X == targetPos.X and Camera.Position.Y == targetPos.Y then + PanToPrismsComplete = true + end +end diff --git a/mods/ca/missions/main-campaign/ca-prologue-02/doubts.aud b/mods/ca/missions/main-campaign/ca-prologue-02/doubts.aud new file mode 100644 index 0000000000..85fd98e8c1 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca-prologue-02/doubts.aud differ diff --git a/mods/ca/missions/main-campaign/ca-prologue-02/greetings.aud b/mods/ca/missions/main-campaign/ca-prologue-02/greetings.aud new file mode 100644 index 0000000000..5e374428fc Binary files /dev/null and b/mods/ca/missions/main-campaign/ca-prologue-02/greetings.aud differ diff --git a/mods/ca/missions/main-campaign/ca-prologue-02/map.bin b/mods/ca/missions/main-campaign/ca-prologue-02/map.bin new file mode 100644 index 0000000000..c8a0bbf3bc Binary files /dev/null and b/mods/ca/missions/main-campaign/ca-prologue-02/map.bin differ diff --git a/mods/ca/missions/main-campaign/ca-prologue-02/map.png b/mods/ca/missions/main-campaign/ca-prologue-02/map.png new file mode 100644 index 0000000000..d2aeefc467 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca-prologue-02/map.png differ diff --git a/mods/ca/missions/main-campaign/ca-prologue-02/map.yaml b/mods/ca/missions/main-campaign/ca-prologue-02/map.yaml new file mode 100644 index 0000000000..e28ac5ed09 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca-prologue-02/map.yaml @@ -0,0 +1,1000 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: ii. Reprisal + +Author: Darkademic + +Tileset: WINTER + +MapSize: 52,52 + +Bounds: 1,1,50,50 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: USSR, Greece, Civilians + PlayerReference@USSR: + Name: USSR + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: soviet + LockColor: True + Color: FE1100 + LockSpawn: True + LockTeam: True + Enemies: Greece, Civilians, Creeps + PlayerReference@Greece: + Name: Greece + Bot: campaign + Faction: allies + Color: 99ACF2 + Enemies: USSR, Creeps + PlayerReference@Civilians: + Name: Civilians + NonCombatant: True + Faction: soviet + Enemies: USSR, Creeps + +Actors: + Actor57: sbag + Owner: Greece + Location: 1,42 + Actor58: sbag + Owner: Greece + Location: 1,43 + Actor60: sbag + Owner: Greece + Location: 1,44 + Actor61: sbag + Owner: Greece + Location: 1,45 + Actor62: sbag + Owner: Greece + Location: 1,46 + Actor63: fact + Owner: Greece + Location: 2,46 + Actor64: sbag + Owner: Greece + Location: 1,47 + Actor65: sbag + Owner: Greece + Location: 1,48 + Actor66: sbag + Owner: Greece + Location: 1,49 + Actor67: sbag + Owner: Greece + Location: 1,50 + Actor68: sbag + Owner: Greece + Location: 2,50 + Actor69: sbag + Owner: Greece + Location: 3,50 + Actor70: sbag + Owner: Greece + Location: 4,50 + Actor71: sbag + Owner: Greece + Location: 5,50 + Actor72: sbag + Owner: Greece + Location: 6,50 + Actor73: sbag + Owner: Greece + Location: 7,50 + Actor74: sbag + Owner: Greece + Location: 12,50 + Actor23: sbag + Owner: Greece + Location: 8,50 + Actor24: sbag + Owner: Greece + Location: 10,50 + Actor25: sbag + Owner: Greece + Location: 9,50 + Actor26: sbag + Owner: Greece + Location: 11,50 + Actor42: sbag + Owner: Greece + Location: 16,45 + Actor43: sbag + Owner: Greece + Location: 16,46 + Actor44: sbag + Owner: Greece + Location: 16,47 + Actor45: sbag + Owner: Greece + Location: 16,48 + Actor46: sbag + Owner: Greece + Location: 16,49 + Actor47: sbag + Owner: Greece + Location: 16,50 + Actor48: sbag + Owner: Greece + Location: 15,50 + Actor49: sbag + Owner: Greece + Location: 14,50 + Actor50: sbag + Owner: Greece + Location: 13,50 + Actor75: proc + Owner: Greece + Location: 11,45 + Actor32: sbag + Owner: Greece + Location: 1,37 + Actor33: sbag + Owner: Greece + Location: 2,37 + Actor34: sbag + Owner: Greece + Location: 3,37 + Actor35: sbag + Owner: Greece + Location: 4,37 + Actor36: sbag + Owner: Greece + Location: 5,37 + Actor37: sbag + Owner: Greece + Location: 6,37 + Actor38: sbag + Owner: Greece + Location: 7,37 + Actor39: sbag + Owner: Greece + Location: 8,37 + Actor40: sbag + Owner: Greece + Location: 12,37 + Actor41: sbag + Owner: Greece + Location: 13,37 + Actor51: sbag + Owner: Greece + Location: 14,37 + Actor52: sbag + Owner: Greece + Location: 15,37 + Actor53: sbag + Owner: Greece + Location: 16,37 + Actor54: sbag + Owner: Greece + Location: 1,38 + Actor55: tent + Owner: Greece + Location: 5,38 + Actor56: weap + Owner: Greece + Location: 13,38 + Actor76: sbag + Owner: Greece + Location: 16,38 + Actor77: sbag + Owner: Greece + Location: 1,39 + Actor78: powr + Owner: Greece + Location: 2,39 + Actor79: sbag + Owner: Greece + Location: 16,39 + Actor80: sbag + Owner: Greece + Location: 1,40 + Actor81: sbag + Owner: Greece + Location: 16,40 + Actor82: sbag + Owner: Greece + Location: 1,41 + Actor83: sbag + Owner: Greece + Location: 16,41 + Actor84: pbox + Owner: Greece + Location: 7,36 + Actor85: pbox + Owner: Greece + Location: 13,36 + Actor86: silo + Owner: Greece + Location: 11,45 + Actor87: silo + Owner: Greece + Location: 13,45 + Actor88: powr + Owner: Greece + Location: 6,45 + Actor89: powr + Owner: Greece + Location: 2,42 + Actor106: t17 + Owner: Neutral + Location: 22,15 + Actor109: tc05 + Owner: Neutral + Location: 30,18 + Actor110: tc02 + Owner: Neutral + Location: 48,14 + Actor111: t12 + Owner: Neutral + Location: 50,17 + Actor112: t02 + Owner: Neutral + Location: 50,12 + Actor113: mine + Owner: Neutral + Location: 44,10 + Actor114: mine + Owner: Neutral + Location: 46,5 + Actor90: wood + Owner: Neutral + Location: 42,30 + Actor91: wood + Owner: Neutral + Location: 43,30 + Actor104: wood + Owner: Neutral + Location: 47,30 + Actor105: wood + Owner: Neutral + Location: 48,30 + Actor115: wood + Owner: Neutral + Location: 49,30 + Actor116: wood + Location: 26,40 + Faction: Random + Owner: Civilians + Actor117: wood + Location: 26,39 + Faction: Random + Owner: Civilians + Actor118: wood + Location: 26,37 + Faction: Random + Owner: Civilians + Actor119: wood + Location: 26,38 + Faction: Random + Owner: Civilians + Actor120: wood + Location: 27,37 + Faction: Random + Owner: Civilians + Actor121: wood + Location: 28,37 + Faction: Random + Owner: Civilians + Actor122: wood + Location: 26,44 + Faction: Random + Owner: Civilians + Actor123: wood + Location: 26,45 + Faction: Random + Owner: Civilians + Actor124: wood + Location: 26,46 + Faction: Random + Owner: Civilians + Actor125: wood + Location: 26,47 + Faction: Random + Owner: Civilians + Actor131: wood + Owner: Neutral + Location: 29,50 + Actor133: wood + Owner: Neutral + Location: 34,50 + Actor134: wood + Owner: Neutral + Location: 33,50 + Actor135: wood + Owner: Neutral + Location: 32,50 + Actor136: wood + Owner: Neutral + Location: 31,50 + Actor137: wood + Owner: Neutral + Location: 30,50 + Actor146: v02 + Location: 33,37 + Faction: Random + Owner: Civilians + Actor147: v04 + Location: 47,35 + Faction: Random + Owner: Civilians + Actor149: v09 + Location: 40,35 + Faction: Random + Owner: Civilians + Actor151: v05 + Location: 30,44 + Faction: Random + Owner: Civilians + Church: v01 + Location: 44,39 + Faction: Random + Owner: Civilians + Actor150: v11 + Location: 48,44 + Faction: Random + Owner: Civilians + Actor132: wood + Owner: Neutral + Location: 50,41 + Actor138: wood + Owner: Neutral + Location: 50,42 + Actor139: wood + Owner: Neutral + Location: 50,43 + Actor140: wood + Owner: Neutral + Location: 50,44 + Actor141: wood + Owner: Neutral + Location: 50,45 + Actor142: wood + Owner: Neutral + Location: 49,45 + Actor143: wood + Owner: Neutral + Location: 50,36 + Actor144: wood + Owner: Neutral + Location: 50,35 + Actor145: wood + Owner: Neutral + Location: 50,34 + Actor154: wood + Owner: Neutral + Location: 50,33 + Actor158: wood + Owner: Neutral + Location: 50,32 + Actor159: wood + Owner: Neutral + Location: 49,32 + Actor160: wood + Owner: Neutral + Location: 49,31 + Actor155: wood + Owner: Neutral + Location: 33,29 + Actor156: wood + Owner: Neutral + Location: 34,29 + Actor157: wood + Owner: Neutral + Location: 35,29 + Actor161: wood + Owner: Neutral + Location: 36,29 + Actor162: wood + Owner: Neutral + Location: 37,29 + Actor163: wood + Owner: Neutral + Location: 33,30 + Actor164: v18 + Owner: Neutral + Location: 34,30 + Actor165: v16 + Owner: Neutral + Location: 35,30 + Actor166: v18 + Owner: Neutral + Location: 36,30 + Actor167: wood + Owner: Neutral + Location: 37,30 + Actor168: wood + Owner: Neutral + Location: 33,31 + Actor172: wood + Owner: Neutral + Location: 33,32 + Actor173: v06 + Location: 34,32 + Faction: Random + Owner: Civilians + Actor174: wood + Owner: Neutral + Location: 33,33 + Actor175: wood + Owner: Neutral + Location: 34,33 + Actor153: wood + Owner: Neutral + Location: 38,30 + Actor169: v10 + Location: 45,43 + Faction: Random + Owner: Civilians + Actor170: v03 + Location: 40,42 + Faction: Random + Owner: Civilians + Actor171: v08 + Location: 37,38 + Faction: Random + Owner: Civilians + Actor148: v07 + Faction: Random + Owner: Civilians + Location: 35,44 + Actor176: tc02 + Owner: Neutral + Location: 29,39 + Actor177: tc01 + Owner: Neutral + Location: 47,41 + Actor178: t17 + Owner: Neutral + Location: 37,35 + Actor179: t15 + Owner: Neutral + Location: 41,31 + Actor180: t13 + Owner: Neutral + Location: 31,47 + Actor181: tc04 + Owner: Neutral + Location: 28,32 + Actor182: t06 + Owner: Neutral + Location: 25,37 + Actor183: tc02 + Owner: Neutral + Location: 35,24 + Actor184: t17 + Owner: Neutral + Location: 33,23 + Actor185: t10 + Owner: Neutral + Location: 31,26 + Actor186: mine + Owner: Neutral + Location: 22,48 + Actor188: mine + Owner: Neutral + Location: 23,32 + Actor187: mine + Owner: Neutral + Location: 9,6 + Actor189: t11 + Owner: Neutral + Location: 2,24 + Actor190: e2 + Owner: USSR + SubCell: 1 + Facing: 512 + Location: 29,6 + Actor191: e2 + Owner: USSR + SubCell: 2 + Facing: 512 + Location: 29,6 + Actor193: e1 + Owner: USSR + SubCell: 4 + Facing: 512 + Location: 29,7 + Actor194: e1 + Owner: USSR + SubCell: 5 + Facing: 512 + Location: 29,7 + Actor196: e2 + Owner: USSR + SubCell: 1 + Facing: 512 + Location: 35,6 + Actor197: e2 + Owner: USSR + SubCell: 2 + Facing: 512 + Location: 35,6 + Actor199: e1 + Owner: USSR + SubCell: 4 + Facing: 512 + Location: 35,7 + Actor200: e1 + Owner: USSR + SubCell: 5 + Facing: 512 + Location: 35,7 + Actor202: t07 + Owner: Neutral + Faction: ukraine + Location: 6,21 + Actor203: tc02 + Owner: Neutral + Faction: ukraine + Location: 10,19 + Actor205: t08 + Owner: Neutral + Faction: ukraine + Location: 9,19 + Actor206: t17 + Owner: Neutral + Faction: ukraine + Location: 9,15 + Actor207: t08 + Owner: Neutral + Faction: ukraine + Location: 10,21 + Actor208: t10 + Owner: Neutral + Faction: ukraine + Location: 9,17 + Actor204: t16 + Owner: Neutral + Faction: ukraine + Location: 22,23 + Actor209: tc05 + Owner: Neutral + Faction: ukraine + Location: 2,34 + Actor210: tc03 + Owner: Neutral + Faction: ukraine + Location: 4,32 + Actor211: t15 + Owner: Neutral + Faction: ukraine + Location: 37,18 + Actor213: jeep + Owner: Greece + Facing: 384 + Location: 46,34 + Actor214: jeep + Owner: Greece + Location: 29,42 + Facing: 761 + Actor216: jeep + Owner: Greece + Location: 15,36 + Facing: 111 + Actor217: jeep + Owner: Greece + Location: 18,40 + Facing: 769 + Actor218: 1tnk + Owner: Greece + Facing: 384 + Location: 13,41 + Actor219: e1 + Owner: Greece + Location: 47,34 + SubCell: 3 + Facing: 384 + Actor220: e1 + Owner: Greece + SubCell: 3 + Location: 45,36 + Facing: 927 + Actor221: e1 + Owner: Greece + Location: 40,34 + SubCell: 3 + Facing: 697 + Actor222: e1 + Owner: Greece + Location: 48,29 + SubCell: 3 + Facing: 0 + Actor223: e1 + Owner: Greece + SubCell: 3 + Location: 43,29 + Facing: 0 + Actor224: e1 + Owner: Greece + SubCell: 3 + Location: 45,19 + Facing: 126 + Actor225: e1 + Owner: Greece + Location: 46,18 + SubCell: 3 + Facing: 95 + TurretFacing: 0 + Actor215: e1 + Owner: Greece + SubCell: 3 + Location: 15,25 + Facing: 856 + Actor228: e1 + Owner: Greece + Location: 14,24 + SubCell: 3 + Facing: 967 + Actor229: e1 + Owner: Greece + SubCell: 3 + Location: 19,27 + Facing: 103 + Actor230: e1 + Owner: Greece + SubCell: 3 + Location: 20,26 + Facing: 79 + Actor231: e1 + Owner: Greece + SubCell: 3 + Location: 12,24 + Facing: 745 + Actor232: e1 + Owner: Greece + SubCell: 3 + Location: 4,26 + Facing: 951 + Actor233: e1 + Owner: Greece + SubCell: 3 + Location: 3,23 + Facing: 721 + Actor234: e1 + Owner: Greece + SubCell: 3 + Location: 6,18 + Facing: 384 + Actor235: e3 + Owner: Greece + SubCell: 3 + Location: 12,38 + Facing: 0 + Actor236: e3 + Owner: Greece + SubCell: 3 + Location: 6,36 + Facing: 0 + Actor237: e3 + Owner: Greece + Location: 17,40 + SubCell: 3 + Facing: 896 + Actor238: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 39,35 + Actor239: medi + Owner: Greece + SubCell: 3 + Location: 7,38 + Facing: 594 + Actor240: e1 + Owner: Greece + SubCell: 3 + Location: 7,35 + Facing: 0 + Actor241: e1 + Owner: Greece + SubCell: 3 + Location: 12,36 + Facing: 0 + Actor242: e1 + Owner: Greece + SubCell: 3 + Location: 19,41 + Facing: 650 + Actor243: e1 + Owner: Greece + Location: 17,39 + SubCell: 3 + Facing: 737 + Actor226: tecn + Owner: Civilians + Facing: 384 + SubCell: 3 + Location: 41,44 + Actor227: c10 + Owner: Civilians + SubCell: 3 + Location: 45,41 + Facing: 309 + Actor244: c6 + Owner: Civilians + Facing: 384 + SubCell: 3 + Location: 38,38 + Actor245: c3 + Owner: Civilians + SubCell: 3 + Location: 49,36 + Facing: 269 + Actor246: c2 + Owner: Civilians + Facing: 384 + SubCell: 3 + Location: 32,38 + Actor247: c8 + Owner: Civilians + SubCell: 3 + Location: 30,45 + Facing: 602 + Actor248: c9 + Owner: Civilians + SubCell: 3 + Location: 37,44 + Facing: 0 + Actor249: c4 + Owner: Civilians + Facing: 384 + SubCell: 3 + Location: 33,36 + Actor250: c2 + Owner: Civilians + SubCell: 3 + Location: 46,43 + Facing: 864 + Actor251: c9 + Owner: Civilians + SubCell: 3 + Location: 36,32 + Facing: 689 + McvSpawn: waypoint + Owner: Neutral + Location: 32,1 + McvRally: waypoint + Owner: Neutral + Location: 32,6 + Actor252: brl3 + Owner: Greece + Location: 48,31 + Actor253: barl + Owner: Greece + Location: 47,31 + Actor254: brl3 + Owner: Greece + Location: 17,37 + Actor255: barl + Owner: Greece + Location: 2,38 + Actor256: brl3 + Owner: Greece + Location: 3,38 + VillageCenter: waypoint + Owner: Neutral + Location: 42,40 + Actor257: wood + Faction: Random + Location: 27,47 + Owner: Civilians + Actor258: wood + Faction: Random + Location: 28,47 + Owner: Civilians + Actor259: wood + Faction: Random + Location: 29,47 + Owner: Civilians + Actor260: wood + Faction: Random + Location: 29,48 + Owner: Civilians + Actor261: wood + Faction: Random + Location: 29,49 + Owner: Civilians + EastAttackRally: waypoint + Owner: Neutral + Location: 45,34 + WestAttackRally: waypoint + Owner: Neutral + Location: 18,14 + SovietBase: waypoint + Owner: Neutral + Location: 34,13 + TeslaSpawn1: waypoint + Owner: Neutral + Location: 43,26 + TeslaBeacon: waypoint + Owner: Neutral + Location: 45,26 + TeslaSpawn2: waypoint + Owner: Neutral + Location: 47,26 + Actor263: jeep + Owner: Greece + Location: 16,27 + Facing: 919 + Actor264: e1 + Owner: Greece + SubCell: 3 + Location: 14,26 + Facing: 626 + TeslaTrigger1: waypoint + Owner: Neutral + Location: 42,24 + TeslaTrigger2: waypoint + Owner: Neutral + Location: 43,24 + TeslaTrigger3: waypoint + Owner: Neutral + Location: 44,24 + TeslaTrigger4: waypoint + Owner: Neutral + Location: 45,24 + TeslaTrigger5: waypoint + Owner: Neutral + Location: 46,24 + TeslaTrigger6: waypoint + Owner: Neutral + Location: 47,24 + TeslaTrigger7: waypoint + Owner: Neutral + Location: 48,24 + Actor262: t12 + Owner: Neutral + Location: 48,24 + Actor198: e1 + Owner: USSR + SubCell: 1 + Facing: 512 + Location: 35,7 + Actor201: e1 + Owner: USSR + SubCell: 2 + Facing: 512 + Location: 35,7 + Actor192: e1 + Owner: USSR + SubCell: 1 + Facing: 512 + Location: 29,7 + Actor195: e1 + Owner: USSR + SubCell: 2 + Facing: 512 + Location: 29,7 + Actor265: e1 + Owner: Greece + SubCell: 3 + Location: 46,20 + Facing: 229 + Actor266: e1 + Owner: Greece + SubCell: 3 + Location: 41,21 + Facing: 0 + Actor267: e1 + Owner: Greece + Location: 42,22 + SubCell: 3 + Facing: 880 + Actor268: c2 + Owner: Civilians + Facing: 384 + SubCell: 3 + Location: 35,41 + Actor269: c3 + Owner: Civilians + Facing: 384 + SubCell: 3 + Location: 39,39 + Actor270: c5 + Owner: Civilians + Facing: 384 + SubCell: 3 + Location: 35,47 + Actor271: c6 + Owner: Civilians + Facing: 384 + SubCell: 3 + Location: 46,39 + Actor272: c7 + Owner: Civilians + Facing: 384 + SubCell: 3 + Location: 49,41 + Actor273: c8 + Owner: Civilians + Facing: 384 + SubCell: 3 + Location: 42,46 + Actor274: c10 + Owner: Civilians + Facing: 384 + SubCell: 3 + Location: 38,43 + TeslaTriggerWest1: waypoint + Owner: Neutral + Location: 15,19 + TeslaTriggerWest2: waypoint + Owner: Neutral + Location: 16,19 + TeslaTriggerWest3: waypoint + Owner: Neutral + Location: 17,19 + TeslaTriggerWest4: waypoint + Owner: Neutral + Location: 18,19 + TeslaTriggerWest5: waypoint + Owner: Neutral + Location: 19,19 + TeslaTriggerWest6: waypoint + Owner: Neutral + Location: 20,19 + TeslaTriggerWest7: waypoint + Owner: Neutral + Location: 21,19 + TeslaTriggerWest8: waypoint + Owner: Neutral + Location: 8,13 + TeslaTriggerWest9: waypoint + Owner: Neutral + Location: 8,12 + TeslaTriggerWest10: waypoint + Owner: Neutral + Location: 8,11 + TeslaTriggerWest11: waypoint + Owner: Neutral + Location: 8,10 + TeslaTriggerWest12: waypoint + Owner: Neutral + Location: 8,9 + TeslaBeaconWest: waypoint + Owner: Neutral + Location: 18,21 + TeslaSpawnWest1: waypoint + Owner: Neutral + Location: 16,21 + TeslaSpawnWest2: waypoint + Owner: Neutral + Location: 20,21 + TeslaTriggerWest13: waypoint + Owner: Neutral + Location: 7,9 + TeslaTriggerWest14: waypoint + Owner: Neutral + Location: 6,9 + TeslaTriggerWest15: waypoint + Owner: Neutral + Location: 5,9 + TeslaTriggerWest16: waypoint + Owner: Neutral + Location: 4,9 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-doctrines.yaml, reprisal-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/main-campaign/ca-prologue-02/reprisal-rules.yaml b/mods/ca/missions/main-campaign/ca-prologue-02/reprisal-rules.yaml new file mode 100644 index 0000000000..dc19922065 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca-prologue-02/reprisal-rules.yaml @@ -0,0 +1,37 @@ +^Palettes: + FlashPostProcessEffect@CHRONO: + Type: Chronoshift + +World: + LuaScript: + Scripts: campaign.lua, reprisal.lua + MissionData: + Briefing: While we extracted all the information we needed from Einstein, Comrade Stalin was most displeased to learn of his escape.\n\nThe traitor who informed the Allies of the scientist's whereabouts has been identified, and Stalin demands retribution.\n\nGo to the village the traitor calls home. Wipe it out. Leave no survivors.\n\nThe Allies have set up a base nearby, to protect the village while they prepare to evacuate it. Once the village is destroyed, destroy the Allied base. + -ScriptLobbyDropdown@DIFFICULTY: + ScriptLobbyDropdown@PROLOGUEDIFFICULTY: + ID: prologuedifficulty + Label: dropdown-difficulty.label + Description: dropdown-difficulty.description + Values: + easy: options-difficulty.easy + Default: easy + Locked: True + MusicPlaylist: + StartingMusic: chaos2 + MapOptions: + TechLevel: low + +Player: + PlayerResources: + DefaultCash: 10000 + +^CivInfantry: + Wanders: + MinMoveDelay: 7500 + MaxMoveDelay: 10000 + +SPEN: + Inherits@CAMPAIGNDISABLED: ^Disabled + +MCV: + Inherits@CAMPAIGNDISABLED: ^Disabled diff --git a/mods/ca/missions/main-campaign/ca-prologue-02/reprisal.lua b/mods/ca/missions/main-campaign/ca-prologue-02/reprisal.lua new file mode 100644 index 0000000000..50843ba897 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca-prologue-02/reprisal.lua @@ -0,0 +1,168 @@ +MissionDir = "ca|missions/main-campaign/ca-prologue-02" + +Difficulty = "easy" + +AlliedAttackPaths = { + { WestAttackRally.Location, SovietBase.Location }, + { EastAttackRally.Location, SovietBase.Location } +} + +TeslaTrigger = { TeslaTrigger1.Location, TeslaTrigger2.Location, TeslaTrigger3.Location, TeslaTrigger4.Location, TeslaTrigger5.Location, TeslaTrigger6.Location, TeslaTrigger7.Location } +TeslaTriggerWest = { TeslaTriggerWest1.Location, TeslaTriggerWest2.Location, TeslaTriggerWest3.Location, TeslaTriggerWest4.Location, TeslaTriggerWest5.Location, TeslaTriggerWest6.Location, TeslaTriggerWest7.Location, + TeslaTriggerWest8.Location, TeslaTriggerWest9.Location, TeslaTriggerWest10.Location, TeslaTriggerWest11.Location, TeslaTriggerWest12.Location, TeslaTriggerWest13.Location, TeslaTriggerWest14.Location, + TeslaTriggerWest15.Location, TeslaTriggerWest16.Location } + +Squads = { + Main = { + Delay = DateTime.Minutes(6), + AttackValuePerSecond = { Min = 10, Max = 10 }, + FollowLeader = true, + Compositions = { + { + Infantry = { "e3", "e1", "e1", "e1" }, + Vehicles = { "jeep" }, + }, + }, + AttackPaths = AlliedAttackPaths, + }, +} + +-- Setup and Tick + +SetupPlayers = function() + Greece = Player.GetPlayer("Greece") + USSR = Player.GetPlayer("USSR") + Civilians = Player.GetPlayer("Civilians") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = { USSR } + MissionEnemies = { Greece } +end + +WorldLoaded = function() + SetupPlayers() + + TimerTicks = 0 + Camera.Position = McvRally.CenterPosition + + InitObjectives(USSR) + InitGreece() + + ObjectiveWipeOutVillage = USSR.AddObjective("Wipe out the village.") + ObjectiveDestroyBase = USSR.AddObjective("Destroy the Allied base.") + + Trigger.AfterDelay(DateTime.Seconds(2), function() + PlaySpeechNotificationToMissionPlayers("ReinforcementsArrived") + Notification("Reinforcements have arrived.") + DoMcvArrival() + end) + + Trigger.AfterDelay(DateTime.Minutes(1), function() + local villageFlare = Actor.Create("flare", true, { Owner = USSR, Location = VillageCenter.Location }) + PlaySpeechNotificationToMissionPlayers("SignalFlare") + Notification("Signal flare detected. Press [" .. UtilsCA.Hotkey("ToLastEvent") .. "] to view location.") + Beacon.New(USSR, VillageCenter.CenterPosition) + Trigger.AfterDelay(DateTime.Minutes(5), villageFlare.Destroy) + end) + + local civilianActors = Civilians.GetActors() + local civilianTargets = Utils.Where(civilianActors, function(a) + return a.HasProperty("Kill") and a.Type ~= "wood" + end) + Trigger.OnAllKilledOrCaptured(civilianTargets, function() + USSR.MarkCompletedObjective(ObjectiveWipeOutVillage) + end) + + local alliedBase = Greece.GetActorsByTypes({ "fact", "powr", "proc", "tent", "weap" }) + Trigger.OnAllKilledOrCaptured(alliedBase, function() + USSR.MarkCompletedObjective(ObjectiveDestroyBase) + end) + + Trigger.OnEnteredFootprint(TeslaTrigger, function(a, id) + if IsMissionPlayer(a.Owner) then + Trigger.RemoveFootprintTrigger(id) + WarpInTeslaTanks(TeslaSpawn1.Location, TeslaSpawn2.Location, TeslaBeacon.Location) + end + end) + + Trigger.OnEnteredFootprint(TeslaTriggerWest, function(a, id) + if IsMissionPlayer(a.Owner) then + Trigger.RemoveFootprintTrigger(id) + WarpInTeslaTanks(TeslaSpawnWest1.Location, TeslaSpawnWest2.Location, TeslaBeaconWest.Location) + end + end) + + Trigger.OnKilled(Church, function(self, killer) + Actor.Create("moneycrate", true, { Owner = USSR, Location = Church.Location }) + end) + + AfterWorldLoaded() +end + +Tick = function() + OncePerSecondChecks() + OncePerFiveSecondChecks() + AfterTick() +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + Greece.Resources = Greece.ResourceCapacity - 500 + + if MissionPlayersHaveNoRequiredUnits() then + if not USSR.IsObjectiveCompleted(ObjectiveWipeOutVillage) then + USSR.MarkFailedObjective(ObjectiveWipeOutVillage) + end + if not USSR.IsObjectiveCompleted(ObjectiveDestroyBase) then + USSR.MarkFailedObjective(ObjectiveDestroyBase) + end + end + end +end + +OncePerFiveSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 125 == 0 then + UpdatePlayerBaseLocations() + end +end + +-- Functions + +InitGreece = function() + AutoRepairBuildings(Greece) + SetupRefAndSilosCaptureCredits(Greece) + AutoReplaceHarvesters(Greece) + InitAttackSquad(Squads.Main, Greece) + + local greeceGroundAttackers = Greece.GetGroundAttackers() + + Utils.Do(greeceGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsGreeceGroundHunterUnit) + end) +end + +-- overridden in co-op version +DoMcvArrival = function() + Reinforcements.Reinforce(USSR, { "mcv" }, { McvSpawn.Location, McvRally.Location }) +end + +WarpInTeslaTanks = function(TankLocation1, TankLocation2, EffectLocation) + if TeslaTanksWarped then + return + end + TeslaTanksWarped = true + Lighting.Flash("Chronoshift", 10) + Media.PlaySound("chrono2.aud") + Actor.Create("warpin", true, { Owner = USSR, Location = EffectLocation }) + Actor.Create("ttnk", true, { Owner = USSR, Location = TankLocation1, Facing = Angle.South }) + Actor.Create("ttnk", true, { Owner = USSR, Location = TankLocation2, Facing = Angle.South }) + Trigger.AfterDelay(DateTime.Seconds(2), function() + Media.DisplayMessage("Greetings Comrades! The Soviet Empire truly knows no boundaries!", "Tesla Tank", HSLColor.FromHex("FF0000")) + MediaCA.PlaySound(MissionDir .. "/greetings.aud", 2) + + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(6)), function() + Media.DisplayMessage("We understand that Comrade Stalin has his doubts about our agreement. We hope these gifts will put his mind at ease.", "Unknown", HSLColor.FromHex("999999")) + MediaCA.PlaySound(MissionDir .. "/doubts.aud", 2) + end) + end) +end diff --git a/mods/ca/missions/main-campaign/ca-prologue-03/chatter1.aud b/mods/ca/missions/main-campaign/ca-prologue-03/chatter1.aud new file mode 100644 index 0000000000..1a0d7a4855 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca-prologue-03/chatter1.aud differ diff --git a/mods/ca/missions/main-campaign/ca-prologue-03/chatter2.aud b/mods/ca/missions/main-campaign/ca-prologue-03/chatter2.aud new file mode 100644 index 0000000000..616a9c3a29 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca-prologue-03/chatter2.aud differ diff --git a/mods/ca/missions/main-campaign/ca-prologue-03/chatter3.aud b/mods/ca/missions/main-campaign/ca-prologue-03/chatter3.aud new file mode 100644 index 0000000000..5e9a5c23ea Binary files /dev/null and b/mods/ca/missions/main-campaign/ca-prologue-03/chatter3.aud differ diff --git a/mods/ca/missions/main-campaign/ca-prologue-03/detachment-rules.yaml b/mods/ca/missions/main-campaign/ca-prologue-03/detachment-rules.yaml new file mode 100644 index 0000000000..fdaa17d87d --- /dev/null +++ b/mods/ca/missions/main-campaign/ca-prologue-03/detachment-rules.yaml @@ -0,0 +1,24 @@ +^Palettes: + FlashPostProcessEffect@CHRONO: + Type: Chronoshift + +World: + LuaScript: + Scripts: campaign.lua, detachment.lua + MissionData: + Briefing: GDI forces have found themselves scattered and confused in unfamiliar surroundings, confronted by hostile soldiers.\n\nOther GDI units have been in radio contact after finding themselves in the same situation.\n\nGunfire can be heard echoing through the trees, and reports of casualties have already been heard over the radio. There is no time to lose.\n\nTake command, locate these other GDI troops, and find a route to safety. + -ScriptLobbyDropdown@DIFFICULTY: + ScriptLobbyDropdown@PROLOGUEDIFFICULTY: + ID: prologuedifficulty + Label: dropdown-difficulty.label + Description: dropdown-difficulty.description + Values: + easy: options-difficulty.easy + Default: easy + Locked: True + MusicPlaylist: + StartingMusic: linefire + +DOME: + Power: + Amount: 0 diff --git a/mods/ca/missions/main-campaign/ca-prologue-03/detachment.lua b/mods/ca/missions/main-campaign/ca-prologue-03/detachment.lua new file mode 100644 index 0000000000..5bd935f20f --- /dev/null +++ b/mods/ca/missions/main-campaign/ca-prologue-03/detachment.lua @@ -0,0 +1,210 @@ +MissionDir = "ca|missions/main-campaign/ca-prologue-03" + +Difficulty = "easy" + +-- Setup and Tick + +SetupPlayers = function() + GDI = Player.GetPlayer("GDI") + USSR = Player.GetPlayer("USSR") + HiddenGDI = Player.GetPlayer("HiddenGDI") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = { GDI } + MissionEnemies = { USSR } +end + +WorldLoaded = function() + SetupPlayers() + + TimerTicks = 0 + GroupsFound = {} + ExitDefendersDead = false + Rescued = false + Camera.Position = PlayerStart.CenterPosition + + InitObjectives(GDI) + InitUSSR() + + ObjectiveLocateForces = GDI.AddObjective("Locate all GDI forces.") + ObjectiveExit = GDI.AddObjective("Find a safe exit route.") + + SetupReveals({ Reveal1, Reveal3, Reveal4 }) + + TroopGroups = { + { Waypoint = Group1, Id = 1 }, + { Waypoint = Group2, Id = 2 }, + { Waypoint = Group3, Id = 3 }, + { Waypoint = Group4, Id = 4 }, + { Waypoint = Group5, Id = 5 }, + } + + Trigger.OnEnteredProximityTrigger(Reveal2.CenterPosition, WDist.New(11 * 1024), function(a, id) + if IsMissionPlayer(a.Owner) and a.Type ~= "smallcamera" and not FirstRevealComplete then + Trigger.RemoveProximityTrigger(id) + FirstRevealComplete = true + local camera = Actor.Create("smallcamera", true, { Owner = GDI, Location = Reveal2.Location }) + + if UtilsCA.FogEnabled() then + Tip("When an enemy structure is destroyed under the fog of war, it won't disappear until its location is revealed again. The explosion sound and screen shake can be used to verify its destruction.") + end + + Trigger.AfterDelay(DateTime.Seconds(4), function() + camera.Destroy() + end) + end + end) + + Utils.Do(TroopGroups, function(g) + Trigger.OnEnteredProximityTrigger(g.Waypoint.CenterPosition, WDist.New(7 * 1024), function(a, id) + if IsMissionPlayer(a.Owner) and not GroupsFound[g.Id] then + Trigger.RemoveProximityTrigger(id) + GroupsFound[g.Id] = true + Notification("GDI forces found.") + MediaCA.PlaySound(MissionDir .. "/gdifound.aud", 2) + + if g.Id == 2 then + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(2)), function() + Media.DisplayMessage("Thank god! You found us!.", "GDI Soldier", HSLColor.FromHex("F2CF74")) + MediaCA.PlaySound(MissionDir .. "/thankgod.aud", 1.5) + end) + end + + local groupActors = Map.ActorsInCircle(g.Waypoint.CenterPosition, WDist.New(8 * 1024)); + Utils.Do(groupActors, function(a) + if a.Owner == HiddenGDI and not a.IsDead then + a.Owner = GDI + end + end) + + local numGroupsFound = 0 + for k,v in pairs(GroupsFound) do + numGroupsFound = numGroupsFound + 1 + end + + if numGroupsFound == 5 then + GDI.MarkCompletedObjective(ObjectiveLocateForces) + + Trigger.AfterDelay(DateTime.Seconds(4), function() + Actor.Create("flare", true, { Owner = GDI, Location = SignalFlare.Location }) + PlaySpeechNotificationToMissionPlayers("SignalFlare") + Notification("Signal flare detected. Press [" .. UtilsCA.Hotkey("ToLastEvent") .. "] to view location.") + Beacon.New(GDI, SignalFlare.CenterPosition) + end) + end + end + end) + end) + + Trigger.AfterDelay(DateTime.Seconds(4), function() + Media.DisplayMessage("Commander what's going on, where the hell are we?!", "GDI Soldier", HSLColor.FromHex("F2CF74")) + Media.PlaySound(MissionDir .. "/wherearewe.aud") + + Trigger.AfterDelay(DateTime.Seconds(20), function() + Media.DisplayMessage("Come in, any GDI units, hostile troops have us pinned down.", "Radio", HSLColor.FromHex("F2CF74")) + MediaCA.PlaySoundAtPos(MissionDir .. "/pinned.aud", 2, Camera.Position + WVec.New(2560, 0, 0)) + end) + end) + + Trigger.AfterDelay(1, function() + local exitActors = Map.ActorsInCircle(SignalFlare.CenterPosition, WDist.New(8 * 1024)); + local exitDefenders = Utils.Where(exitActors, function(a) + return a.Owner == USSR and a.HasProperty("Move") + end) + + Trigger.OnAllKilled(exitDefenders, function() + ExitDefendersDead = true + end) + end) + + DistGuns() + Chatter() + AfterWorldLoaded() +end + +Tick = function() + OncePerSecondChecks() + AfterTick() +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + if MissionPlayersHaveNoRequiredUnits() then + if not GDI.IsObjectiveCompleted(ObjectiveLocateForces) then + GDI.MarkFailedObjective(ObjectiveLocateForces) + end + if not GDI.IsObjectiveCompleted(ObjectiveExit) then + GDI.MarkFailedObjective(ObjectiveExit) + end + end + + if GDI.IsObjectiveCompleted(ObjectiveLocateForces) and ExitDefendersDead and not Rescued then + local exitActors = Map.ActorsInCircle(SignalFlare.CenterPosition, WDist.New(8 * 1024)); + local gdiExitActors = Utils.Where(exitActors, function(a) + return IsMissionPlayer(a.Owner) + end) + + if #gdiExitActors > 0 then + Rescued = true + Trigger.AfterDelay(DateTime.Seconds(2), function() + Reinforcements.Reinforce(GDI, { "n1", "n2", "n1", "n2", "n1", "medi", "mtnk", "mtnk" }, { RescueSpawn.Location, RescueRally1.Location, RescueRally2.Location }) + + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(2)), function() + Media.DisplayMessage("Hold your fire, we're GDI! Damn, we thought we'd lost the whole company! We've got a base not far from here, we'll take you there.", "GDI Soldier", HSLColor.FromHex("F2CF74")) + MediaCA.PlaySound(MissionDir .. "/holdfire.aud", 2) + + Trigger.AfterDelay(DateTime.Seconds(12), function() + GDI.MarkCompletedObjective(ObjectiveExit) + end) + end) + end) + end + end + end +end + +-- Functions + +InitUSSR = function() + AutoRepairBuildings(USSR) + + local ussrGroundAttackers = USSR.GetGroundAttackers() + + Utils.Do(ussrGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsUSSRGroundHunterUnit) + end) +end + +SetupAmbience = function() + DistGuns() + Chatter() +end + +DistGuns = function() + local distGunsDelay = AdjustTimeForGameSpeed(Utils.RandomInteger(DateTime.Seconds(10), DateTime.Seconds(25))) + Trigger.AfterDelay(distGunsDelay, function() + if not GDI.IsObjectiveCompleted(ObjectiveLocateForces) then + local distGunSounds = { MissionDir .. "/distguns.aud", MissionDir .. "/distguns2.aud", MissionDir .. "/distguns3.aud" } + local cameraPos = Camera.Position + local posModifier = WVec.New(Utils.Random({ -5120, 3072, 5120 }), 0, 0) + MediaCA.PlaySoundAtPos(Utils.Random(distGunSounds), 1, cameraPos + posModifier) + DistGuns() + end + end) +end + +Chatter = function() + local chatterSounds = { MissionDir .. "/chatter1.aud", MissionDir .. "/chatter2.aud", MissionDir .. "/chatter3.aud" } + local delay = 0 + + Utils.Do(Utils.Shuffle(chatterSounds), function(s) + delay = delay + AdjustTimeForGameSpeed(Utils.RandomInteger(DateTime.Seconds(60), DateTime.Seconds(120))) + Trigger.AfterDelay(delay, function() + if not GDI.IsObjectiveCompleted(ObjectiveLocateForces) then + local cameraPos = Camera.Position + local posModifier = WVec.New(Utils.Random({ -2560, 2560 }), 0, 0) + MediaCA.PlaySoundAtPos(s, 2, cameraPos + posModifier) + end + end) + end) +end diff --git a/mods/ca/missions/main-campaign/ca-prologue-03/distguns.aud b/mods/ca/missions/main-campaign/ca-prologue-03/distguns.aud new file mode 100644 index 0000000000..7d6f306aa7 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca-prologue-03/distguns.aud differ diff --git a/mods/ca/missions/main-campaign/ca-prologue-03/distguns2.aud b/mods/ca/missions/main-campaign/ca-prologue-03/distguns2.aud new file mode 100644 index 0000000000..133459bd61 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca-prologue-03/distguns2.aud differ diff --git a/mods/ca/missions/main-campaign/ca-prologue-03/distguns3.aud b/mods/ca/missions/main-campaign/ca-prologue-03/distguns3.aud new file mode 100644 index 0000000000..227d1175fa Binary files /dev/null and b/mods/ca/missions/main-campaign/ca-prologue-03/distguns3.aud differ diff --git a/mods/ca/missions/main-campaign/ca-prologue-03/gdifound.aud b/mods/ca/missions/main-campaign/ca-prologue-03/gdifound.aud new file mode 100644 index 0000000000..9f4ea5fe01 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca-prologue-03/gdifound.aud differ diff --git a/mods/ca/missions/main-campaign/ca-prologue-03/holdfire.aud b/mods/ca/missions/main-campaign/ca-prologue-03/holdfire.aud new file mode 100644 index 0000000000..cd089cbfff Binary files /dev/null and b/mods/ca/missions/main-campaign/ca-prologue-03/holdfire.aud differ diff --git a/mods/ca/missions/main-campaign/ca-prologue-03/map.bin b/mods/ca/missions/main-campaign/ca-prologue-03/map.bin new file mode 100644 index 0000000000..9d8c7fce81 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca-prologue-03/map.bin differ diff --git a/mods/ca/missions/main-campaign/ca-prologue-03/map.png b/mods/ca/missions/main-campaign/ca-prologue-03/map.png new file mode 100644 index 0000000000..11fdf6df5d Binary files /dev/null and b/mods/ca/missions/main-campaign/ca-prologue-03/map.png differ diff --git a/mods/ca/missions/main-campaign/ca-prologue-03/map.yaml b/mods/ca/missions/main-campaign/ca-prologue-03/map.yaml new file mode 100644 index 0000000000..85745d79bc --- /dev/null +++ b/mods/ca/missions/main-campaign/ca-prologue-03/map.yaml @@ -0,0 +1,1183 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: iii. Detachment + +Author: Darkademic + +Tileset: WINTER + +MapSize: 98,50 + +Bounds: 1,1,96,48 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: GDI, USSR + PlayerReference@GDI: + Name: GDI + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: gdi + LockColor: True + Color: F2CF74 + LockSpawn: True + LockTeam: True + Enemies: USSR, Creeps + PlayerReference@USSR: + Name: USSR + Bot: campaign + Faction: soviet + Color: FE1100 + Enemies: GDI, Creeps + PlayerReference@HiddenGDI: + Name: HiddenGDI + NonCombatant: True + Faction: gdi + Color: F2CF74 + +Actors: + Actor0: tc05 + Owner: Neutral + Location: 3,17 + Actor1: tc02 + Owner: Neutral + Location: 1,19 + Actor2: t16 + Owner: Neutral + Location: 5,12 + Actor3: t17 + Owner: Neutral + Location: 16,9 + Actor4: tc04 + Owner: Neutral + Location: 15,2 + Actor5: tc02 + Owner: Neutral + Location: 2,1 + Actor6: t13 + Owner: Neutral + Location: 12,1 + Actor7: t13 + Owner: Neutral + Location: 16,6 + Actor8: t12 + Owner: Neutral + Location: 18,4 + Actor9: t05 + Owner: Neutral + Location: 17,10 + Actor10: t07 + Owner: Neutral + Location: 18,0 + Actor11: t01 + Owner: Neutral + Location: 5,15 + Actor12: tc01 + Owner: Neutral + Location: 3,14 + Actor13: t17 + Owner: Neutral + Location: 2,12 + Actor14: t10 + Owner: Neutral + Location: 1,15 + Actor15: t14 + Owner: Neutral + Location: 1,10 + Actor16: t08 + Owner: Neutral + Location: 10,1 + Actor17: tc04 + Owner: Neutral + Location: 24,26 + Actor18: t13 + Owner: Neutral + Location: 31,26 + Actor19: t06 + Owner: Neutral + Location: 28,19 + Actor20: t01 + Owner: Neutral + Location: 25,18 + Actor21: t11 + Owner: Neutral + Location: 19,22 + Actor22: tc02 + Owner: Neutral + Location: 20,24 + Actor23: tc05 + Owner: Neutral + Location: 27,22 + Actor24: t12 + Owner: Neutral + Location: 27,20 + Actor25: t01 + Owner: Neutral + Location: 21,20 + Actor26: t06 + Owner: Neutral + Location: 20,26 + Actor27: t16 + Owner: Neutral + Location: 29,25 + Actor28: tc03 + Owner: Neutral + Location: 21,22 + Actor29: tc01 + Owner: Neutral + Location: 26,24 + Actor30: t07 + Owner: Neutral + Location: 22,27 + Actor31: t01 + Owner: Neutral + Location: 23,25 + Actor32: t11 + Owner: Neutral + Location: 23,23 + Actor33: t12 + Owner: Neutral + Location: 25,25 + Actor34: t14 + Owner: Neutral + Location: 22,20 + Actor35: t10 + Owner: Neutral + Location: 25,21 + Actor36: t08 + Owner: Neutral + Location: 24,22 + Actor37: t07 + Owner: Neutral + Location: 26,19 + Actor38: t02 + Owner: Neutral + Location: 50,19 + Actor39: t01 + Owner: Neutral + Location: 49,14 + Actor40: t11 + Owner: Neutral + Location: 46,8 + Actor41: t13 + Owner: Neutral + Location: 46,29 + Actor42: tc01 + Owner: Neutral + Location: 27,0 + Actor43: tc02 + Owner: Neutral + Location: 29,0 + Actor44: t16 + Owner: Neutral + Location: 32,0 + Actor45: t17 + Owner: Neutral + Location: 31,0 + Actor46: t07 + Owner: Neutral + Location: 33,0 + Actor48: t01 + Owner: Neutral + Location: 41,5 + Actor49: t11 + Owner: Neutral + Location: 40,1 + Actor50: n1 + Owner: GDI + SubCell: 3 + Location: 7,9 + Facing: 674 + Actor51: n1 + Owner: GDI + Location: 7,9 + SubCell: 1 + Facing: 507 + Actor53: n1 + Owner: GDI + SubCell: 3 + Location: 11,9 + Facing: 483 + Actor56: n2 + Owner: GDI + SubCell: 3 + Location: 10,8 + Facing: 539 + Actor57: n2 + Owner: GDI + Location: 10,8 + SubCell: 1 + Facing: 547 + Actor58: n2 + Owner: GDI + SubCell: 3 + Location: 8,8 + Facing: 634 + Actor62: n1 + Owner: GDI + Location: 10,10 + SubCell: 1 + Facing: 523 + Actor61: e1 + Owner: USSR + SubCell: 3 + Location: 10,13 + Facing: 0 + Actor63: e1 + Owner: USSR + SubCell: 3 + Location: 12,12 + Facing: 71 + Actor64: e2 + Owner: USSR + SubCell: 3 + Location: 19,17 + Facing: 222 + Actor69: ftur + Owner: USSR + Location: 27,33 + Actor70: ftur + Owner: USSR + Location: 31,36 + Actor71: msam + Owner: HiddenGDI + Facing: 384 + Location: 31,3 + Actor72: msam + Owner: HiddenGDI + Facing: 384 + Location: 32,4 + Actor74: n1 + Owner: HiddenGDI + SubCell: 3 + Location: 32,5 + Facing: 523 + Actor75: n1 + Owner: HiddenGDI + SubCell: 3 + Facing: 293 + Location: 30,4 + Actor76: n1 + Owner: HiddenGDI + SubCell: 3 + Location: 9,31 + Facing: 610 + Actor77: n1 + Owner: HiddenGDI + Facing: 384 + Location: 9,31 + SubCell: 1 + Actor79: n1 + Owner: HiddenGDI + SubCell: 3 + Location: 12,32 + Facing: 384 + Actor80: n1 + Owner: HiddenGDI + SubCell: 3 + Location: 10,32 + Facing: 547 + Actor82: medi + Owner: HiddenGDI + Location: 12,30 + SubCell: 1 + Facing: 547 + Actor83: medi + Owner: HiddenGDI + SubCell: 3 + Location: 10,31 + Facing: 539 + Actor84: n2 + Owner: HiddenGDI + Location: 14,31 + SubCell: 2 + Facing: 594 + Actor78: n1 + Owner: HiddenGDI + SubCell: 3 + Location: 14,31 + Facing: 372 + Actor81: hmmv + Owner: HiddenGDI + Location: 11,31 + Facing: 515 + Actor88: e1 + Owner: USSR + SubCell: 3 + Location: 54,25 + Facing: 499 + Actor89: e1 + Owner: USSR + SubCell: 3 + Location: 53,24 + Facing: 483 + Actor90: e1 + Owner: USSR + SubCell: 3 + Location: 56,26 + Facing: 499 + Actor91: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 57,25 + Actor92: e1 + Owner: USSR + Facing: 384 + Location: 56,26 + SubCell: 1 + Actor94: e4 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 57,27 + Actor96: mtnk + Owner: HiddenGDI + Location: 67,46 + Facing: 245 + Actor95: mtnk + Owner: HiddenGDI + Location: 67,44 + Facing: 253 + Actor99: dome + Owner: USSR + Location: 67,33 + Actor97: fenc + Owner: USSR + Location: 57,29 + Actor100: fenc + Owner: USSR + Location: 56,29 + Actor101: fenc + Owner: USSR + Location: 50,27 + Actor102: fenc + Owner: USSR + Location: 51,27 + Actor103: fenc + Owner: USSR + Location: 59,20 + Actor104: fenc + Owner: USSR + Location: 59,21 + Actor105: fenc + Owner: USSR + Location: 59,19 + Actor106: fenc + Owner: USSR + Location: 59,18 + Actor107: fenc + Owner: USSR + Location: 60,30 + Actor108: fenc + Owner: USSR + Location: 61,30 + Actor109: fenc + Owner: USSR + Location: 62,30 + Actor110: fenc + Owner: USSR + Location: 63,30 + Actor111: fenc + Owner: USSR + Location: 67,30 + Actor112: fenc + Owner: USSR + Location: 68,30 + Actor113: fenc + Owner: USSR + Location: 70,30 + Actor114: fenc + Owner: USSR + Location: 69,30 + Actor115: fenc + Owner: USSR + Location: 71,30 + Actor116: fenc + Owner: USSR + Location: 72,30 + Actor118: fenc + Owner: USSR + Location: 73,31 + Actor119: fenc + Owner: USSR + Location: 74,32 + Actor120: fenc + Owner: USSR + Location: 73,32 + Actor121: fenc + Owner: USSR + Location: 74,31 + Actor117: fenc + Owner: USSR + Location: 72,31 + Actor122: fenc + Owner: USSR + Location: 60,31 + Actor123: fenc + Owner: USSR + Location: 59,32 + Actor124: fenc + Owner: USSR + Location: 60,32 + Actor126: vulc + Faction: eagle + Location: 62,3 + Facing: 245 + Owner: HiddenGDI + Actor127: vulc + Faction: eagle + Location: 63,5 + Facing: 134 + Owner: HiddenGDI + Actor130: n1 + Faction: eagle + SubCell: 3 + Location: 62,6 + Facing: 142 + Owner: HiddenGDI + Actor131: n1 + Faction: eagle + Location: 63,4 + SubCell: 3 + Owner: HiddenGDI + Facing: 253 + Actor132: n2 + Faction: eagle + SubCell: 3 + Location: 62,5 + Owner: HiddenGDI + Facing: 384 + Actor135: htnk + Faction: eagle + Owner: HiddenGDI + Location: 90,4 + Facing: 384 + Actor136: htnk + Faction: eagle + Owner: HiddenGDI + Location: 92,5 + Facing: 384 + Actor133: n1 + Faction: eagle + SubCell: 3 + Location: 88,4 + Facing: 531 + Owner: HiddenGDI + Actor134: n1 + Faction: eagle + Location: 92,4 + SubCell: 3 + Facing: 384 + Owner: HiddenGDI + Actor137: n1 + Faction: eagle + SubCell: 3 + Location: 94,6 + Facing: 142 + Owner: HiddenGDI + Actor138: n1 + Faction: eagle + SubCell: 3 + Location: 92,6 + Facing: 293 + Owner: HiddenGDI + Actor139: e1 + Owner: USSR + SubCell: 3 + Location: 55,38 + Facing: 384 + Actor140: e1 + Owner: USSR + SubCell: 3 + Location: 51,37 + Facing: 531 + Actor141: e1 + Owner: USSR + SubCell: 3 + Location: 56,37 + Facing: 384 + Actor142: e1 + Owner: USSR + SubCell: 3 + Location: 37,25 + Facing: 785 + Actor143: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 40,28 + Actor144: e1 + Owner: USSR + SubCell: 3 + Location: 41,27 + Facing: 0 + Actor145: e3 + Owner: USSR + SubCell: 3 + Location: 40,25 + Facing: 285 + Actor146: n1 + Owner: GDI + SubCell: 3 + Location: 8,11 + Facing: 689 + Actor147: ice02 + Owner: Neutral + Faction: russia + Location: 80,20 + Actor148: ice01 + Owner: Neutral + Faction: russia + Location: 75,22 + Actor154: brl3 + Owner: USSR + Location: 89,10 + Actor151: brl3 + Owner: USSR + Location: 88,9 + Actor150: brl3 + Owner: USSR + Location: 87,8 + Actor149: barl + Owner: USSR + Location: 87,9 + Actor152: barl + Owner: USSR + Location: 88,10 + Actor153: fenc + Owner: USSR + Location: 89,9 + Actor155: fenc + Owner: USSR + Location: 89,8 + Actor156: fenc + Owner: USSR + Location: 90,8 + Actor157: fenc + Owner: USSR + Location: 86,9 + Actor158: fenc + Owner: USSR + Location: 85,9 + Actor159: fenc + Owner: USSR + Location: 84,8 + Actor160: fenc + Owner: USSR + Location: 84,9 + Actor161: btr + Owner: USSR + Location: 84,13 + Facing: 261 + Actor162: e3 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 85,12 + Actor163: e1 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 82,9 + Actor164: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 89,13 + Actor165: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 84,14 + Actor166: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 86,13 + Actor167: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 81,11 + Actor168: tc04 + Owner: Neutral + Location: 83,0 + Actor169: t12 + Owner: Neutral + Location: 86,0 + Actor170: tc05 + Owner: Neutral + Location: 94,1 + Actor171: tc02 + Owner: Neutral + Location: 91,0 + Actor172: t07 + Owner: Neutral + Location: 88,0 + Actor173: t01 + Owner: Neutral + Location: 96,5 + Actor174: t13 + Owner: Neutral + Location: 96,8 + Actor175: tc03 + Owner: Neutral + Location: 95,7 + Actor176: t05 + Owner: Neutral + Location: 84,4 + Actor177: t01 + Owner: Neutral + Location: 68,4 + Actor178: t06 + Owner: Neutral + Location: 96,24 + Actor179: t12 + Owner: Neutral + Location: 96,21 + Actor180: t14 + Owner: Neutral + Location: 92,25 + Actor181: tc04 + Owner: Neutral + Location: 93,12 + Actor182: tc05 + Owner: Neutral + Location: 75,7 + Actor183: t13 + Owner: Neutral + Location: 75,13 + Actor184: t12 + Owner: Neutral + Location: 73,19 + Actor185: t14 + Owner: Neutral + Location: 59,16 + Actor186: tc01 + Owner: Neutral + Location: 69,16 + Actor187: tc02 + Owner: Neutral + Location: 46,4 + Actor188: t05 + Owner: Neutral + Location: 48,1 + Actor189: t03 + Owner: Neutral + Location: 69,8 + Actor190: t07 + Owner: Neutral + Location: 63,12 + Actor191: t17 + Owner: Neutral + Location: 47,34 + Actor192: tc04 + Owner: Neutral + Location: 46,31 + Actor193: t16 + Owner: Neutral + Location: 48,28 + Actor194: t14 + Owner: Neutral + Location: 61,39 + Actor197: t07 + Owner: Neutral + Location: 58,40 + Actor198: t05 + Owner: Neutral + Location: 70,42 + Actor199: t15 + Owner: Neutral + Location: 69,47 + Actor200: t13 + Owner: Neutral + Location: 54,46 + Actor202: tc04 + Owner: Neutral + Location: 36,44 + Actor203: t11 + Owner: Neutral + Location: 46,43 + Actor204: t16 + Owner: Neutral + Location: 40,36 + Actor205: t01 + Owner: Neutral + Location: 35,39 + Actor206: t01 + Owner: Neutral + Location: 15,22 + Actor207: t13 + Owner: Neutral + Location: 6,5 + Actor208: t10 + Owner: Neutral + Location: 49,11 + Actor209: t05 + Owner: Neutral + Location: 55,9 + Actor210: t01 + Owner: Neutral + Location: 50,8 + Actor211: t16 + Owner: Neutral + Location: 46,26 + Actor212: t03 + Owner: Neutral + Location: 47,21 + Actor213: t10 + Owner: Neutral + Location: 38,20 + Actor214: t05 + Owner: Neutral + Location: 33,14 + Actor215: t07 + Owner: Neutral + Location: 25,7 + Actor216: t10 + Owner: Neutral + Location: 33,7 + Actor217: t01 + Owner: Neutral + Location: 36,5 + Actor218: t15 + Owner: Neutral + Location: 21,3 + Actor219: t06 + Owner: Neutral + Location: 21,17 + Actor220: t05 + Owner: Neutral + Location: 8,20 + Actor221: t01 + Owner: Neutral + Location: 5,37 + Actor222: t14 + Owner: Neutral + Location: 27,42 + Actor223: t17 + Owner: Neutral + Location: 35,37 + Actor224: t05 + Owner: Neutral + Location: 35,30 + Actor225: t15 + Owner: Neutral + Location: 40,42 + Actor226: t12 + Owner: Neutral + Location: 56,32 + Actor227: tc05 + Owner: Neutral + Location: 82,37 + Actor228: tc04 + Owner: Neutral + Location: 80,41 + Actor229: tc03 + Owner: Neutral + Location: 89,32 + Actor230: tc02 + Owner: Neutral + Location: 89,41 + Actor231: t14 + Owner: Neutral + Location: 79,45 + Actor232: t13 + Owner: Neutral + Location: 95,31 + Actor233: t10 + Owner: Neutral + Location: 76,35 + Actor234: tc02 + Owner: Neutral + Location: 85,19 + Actor235: tc03 + Owner: Neutral + Location: 81,24 + Actor236: tc01 + Owner: Neutral + Location: 61,28 + Actor237: ftur + Owner: USSR + Location: 41,15 + Actor238: dog + Owner: USSR + SubCell: 3 + Location: 52,36 + Facing: 515 + Actor239: dog + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 18,17 + Actor240: e1 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 28,32 + Actor241: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 32,36 + Actor242: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 30,33 + Actor243: e1 + Owner: USSR + SubCell: 3 + Location: 41,11 + Facing: 384 + Actor244: e1 + Owner: USSR + SubCell: 3 + Location: 40,17 + Facing: 142 + Actor245: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 50,11 + Actor246: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 55,15 + Actor247: e2 + Owner: USSR + SubCell: 3 + Location: 80,28 + Facing: 229 + Actor248: e2 + Owner: USSR + SubCell: 3 + Location: 87,32 + Facing: 166 + Actor249: e2 + Owner: USSR + SubCell: 3 + Location: 69,32 + Facing: 384 + Actor250: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 66,35 + Actor251: e1 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 69,35 + Actor252: e1 + Owner: USSR + Location: 69,29 + SubCell: 3 + Facing: 103 + Actor253: e1 + Owner: USSR + SubCell: 3 + Location: 64,29 + Facing: 0 + Actor254: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 64,12 + Actor255: e1 + Owner: USSR + Facing: 384 + Location: 70,18 + SubCell: 3 + Actor256: e1 + Owner: USSR + SubCell: 3 + Location: 71,7 + Facing: 555 + Actor257: e1 + Owner: USSR + SubCell: 3 + Location: 72,5 + Facing: 650 + Actor258: e1 + Owner: USSR + SubCell: 3 + Location: 49,7 + Facing: 626 + Actor259: e1 + Owner: USSR + SubCell: 3 + Location: 48,8 + Facing: 578 + Actor262: n2 + Owner: HiddenGDI + Facing: 384 + Location: 91,3 + SubCell: 3 + Actor263: n2 + Owner: HiddenGDI + SubCell: 3 + Location: 66,47 + Facing: 206 + Actor264: n1 + Owner: HiddenGDI + SubCell: 3 + Location: 69,44 + Facing: 253 + Actor265: n1 + Owner: HiddenGDI + SubCell: 3 + Location: 66,43 + Facing: 261 + Actor266: barr + Owner: USSR + Location: 62,31 + Actor267: btr + Owner: USSR + Location: 65,30 + Facing: 0 + Actor268: 3tnk + Owner: USSR + Location: 90,38 + Facing: 95 + Actor269: 3tnk + Owner: USSR + Location: 91,36 + Facing: 103 + Actor270: n3 + Owner: HiddenGDI + SubCell: 3 + Location: 68,45 + Facing: 384 + Actor272: n3 + Owner: HiddenGDI + Facing: 384 + SubCell: 3 + Location: 87,3 + Group1: waypoint + Owner: Neutral + Location: 11,32 + Group2: waypoint + Owner: Neutral + Location: 31,4 + Group3: waypoint + Owner: Neutral + Location: 67,45 + Group4: waypoint + Owner: Neutral + Location: 62,4 + Group5: waypoint + Owner: Neutral + Location: 91,4 + SignalFlare: waypoint + Owner: Neutral + Location: 87,38 + Reveal1: waypoint + Owner: Neutral + Location: 29,34 + Reveal2: waypoint + Owner: Neutral + Location: 41,15 + Reveal4: waypoint + Owner: Neutral + Location: 65,30 + PlayerStart: waypoint + Owner: Neutral + Location: 9,9 + Actor273: e2 + Owner: USSR + SubCell: 3 + Facing: 222 + Location: 18,15 + Actor274: powr + Owner: USSR + Location: 70,31 + Actor275: e1 + Owner: USSR + SubCell: 3 + Location: 88,35 + Facing: 253 + Actor276: e1 + Owner: USSR + SubCell: 3 + Location: 85,38 + Facing: 237 + Actor277: e1 + Owner: USSR + SubCell: 3 + Location: 83,36 + Facing: 7 + Actor278: e1 + Owner: USSR + SubCell: 3 + Location: 92,35 + Facing: 245 + Actor279: e1 + Owner: USSR + SubCell: 3 + Location: 89,36 + Facing: 253 + Actor280: e1 + Owner: USSR + SubCell: 3 + Location: 91,33 + Facing: 134 + Actor281: e1 + Owner: USSR + SubCell: 3 + Location: 81,37 + Facing: 87 + RescueSpawn: waypoint + Owner: Neutral + Location: 96,44 + Actor282: btr + Owner: USSR + Facing: 261 + Location: 92,32 + Actor283: e2 + Owner: USSR + SubCell: 3 + Facing: 222 + Location: 33,34 + Actor284: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 40,33 + Actor285: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 60,19 + RescueRally1: waypoint + Owner: Neutral + Location: 87,44 + RescueRally2: waypoint + Owner: Neutral + Location: 87,36 + Reveal3: waypoint + Owner: Neutral + Location: 59,26 + Actor286: 3tnk + Owner: USSR + Facing: 384 + Location: 59,25 + Actor287: e4 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 60,26 + Actor288: medi + Owner: HiddenGDI + Facing: 384 + SubCell: 3 + Location: 63,2 + Actor289: n3 + Owner: HiddenGDI + Facing: 384 + SubCell: 3 + Location: 61,2 + Actor290: n1 + Faction: eagle + SubCell: 3 + Facing: 523 + Owner: HiddenGDI + Location: 62,2 + Actor291: n1 + Faction: eagle + SubCell: 1 + Facing: 384 + Owner: HiddenGDI + Location: 62,2 + Actor292: e1 + Owner: USSR + SubCell: 3 + Location: 12,44 + Facing: 134 + Actor293: e1 + Owner: USSR + SubCell: 3 + Location: 15,45 + Facing: 15 + Actor294: e2 + Owner: USSR + SubCell: 3 + Location: 16,41 + Facing: 253 + Actor295: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 27,42 + Actor296: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 39,45 + Actor297: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 46,43 + Actor298: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 45,45 + Actor299: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 57,46 + Actor300: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 56,44 + Actor301: e1 + Owner: USSR + SubCell: 3 + Location: 49,4 + Facing: 602 + Actor302: e1 + Owner: USSR + SubCell: 3 + Location: 90,21 + Facing: 79 + Actor303: e2 + Owner: USSR + SubCell: 3 + Location: 87,22 + Facing: 253 + Actor304: e2 + Owner: USSR + SubCell: 3 + Location: 92,24 + Facing: 384 + Actor305: tc02 + Owner: Neutral + Location: 60,44 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, detachment-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/main-campaign/ca-prologue-03/pinned.aud b/mods/ca/missions/main-campaign/ca-prologue-03/pinned.aud new file mode 100644 index 0000000000..3753d70825 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca-prologue-03/pinned.aud differ diff --git a/mods/ca/missions/main-campaign/ca-prologue-03/thankgod.aud b/mods/ca/missions/main-campaign/ca-prologue-03/thankgod.aud new file mode 100644 index 0000000000..66bf33e5c0 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca-prologue-03/thankgod.aud differ diff --git a/mods/ca/missions/main-campaign/ca-prologue-03/wherearewe.aud b/mods/ca/missions/main-campaign/ca-prologue-03/wherearewe.aud new file mode 100644 index 0000000000..b3f953b208 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca-prologue-03/wherearewe.aud differ diff --git a/mods/ca/missions/main-campaign/ca-prologue-04/juncture-notifications.yaml b/mods/ca/missions/main-campaign/ca-prologue-04/juncture-notifications.yaml new file mode 100644 index 0000000000..045fc4171b --- /dev/null +++ b/mods/ca/missions/main-campaign/ca-prologue-04/juncture-notifications.yaml @@ -0,0 +1,3 @@ +Speech: + Prefixes: + nod: c_ diff --git a/mods/ca/missions/main-campaign/ca-prologue-04/juncture-rules.yaml b/mods/ca/missions/main-campaign/ca-prologue-04/juncture-rules.yaml new file mode 100644 index 0000000000..68a256827e --- /dev/null +++ b/mods/ca/missions/main-campaign/ca-prologue-04/juncture-rules.yaml @@ -0,0 +1,100 @@ +^Palettes: + FlashPostProcessEffect@CHRONO: + Type: Chronoshift + +World: + LuaScript: + Scripts: campaign.lua, juncture.lua + MissionData: + Briefing: Critical components and supplies are being transported to a secret staging area. Few in the Brotherhood know the full details of this operation, but all will be revealed in time.\n\nGDI continue to threaten vital transportation routes, and you have been chosen to secure one such route in Egypt.\n\nGDI is blockading the Nile river with their fleet, and this is unacceptably delaying our progress.\n\nEstablish a foothold, then your objective is to destroy the GDI anti-aircraft systems that line the river bank. Once those are out of the way, Kane has a surprise in store for GDI's navy. + -ScriptLobbyDropdown@DIFFICULTY: + ScriptLobbyDropdown@PROLOGUEDIFFICULTY: + ID: prologuedifficulty + Label: dropdown-difficulty.label + Description: dropdown-difficulty.description + Values: + easy: options-difficulty.easy + Default: easy + Locked: True + MusicPlaylist: + StartingMusic: fist226m + MapOptions: + TechLevel: medium + +Player: + PlayerResources: + DefaultCash: 10000 + +AIRS: + -ParatroopersPowerCA@blackhairdrop: + +HQ: + -DropPodsPowerCA@Zocom: + -AirstrikePowerCA@BlackhandFirebomb: + +LTNK: + Mobile: + Locomotor: tracked + +JJET: + Inherits@CAMPAIGNDISABLED: ^Disabled + +BJET: + Inherits@CAMPAIGNDISABLED: ^Disabled + +MECH: + Inherits@CAMPAIGNDISABLED: ^Disabled + +SAB: + Inherits@CAMPAIGNDISABLED: ^Disabled + +STNK.Nod: + Inherits@CAMPAIGNDISABLED: ^Disabled + +MNLY: + Inherits@CAMPAIGNDISABLED: ^Disabled + +AMCV: + Inherits@CAMPAIGNDISABLED: ^Disabled + +SPEN.nod: + Inherits@CAMPAIGNDISABLED: ^Disabled + +SYRD.gdi: + Inherits@CAMPAIGNDISABLED: ^Disabled + Capturable: + Types: none + +TRAN: + Inherits@CAMPAIGNDISABLED: ^Disabled + +APCH: + Inherits@CAMPAIGNDISABLED: ^Disabled + +RAH: + Inherits@CAMPAIGNDISABLED: ^Disabled + +LTUR: + Inherits@CAMPAIGNDISABLED: ^Disabled + +OBLI: + Inherits@CAMPAIGNDISABLED: ^Disabled + +LASP: + Inherits@CAMPAIGNDISABLED: ^Disabled + +HPAD.TD: + Inherits@CAMPAIGNDISABLED: ^Disabled + Power: + Amount: 0 + +AFLD.GDI: + Inherits@CAMPAIGNDISABLED: ^Disabled + +DD2: + Armament@PRIMARY: + Weapon: Stinger + +SCRN: + AmmoPool: + Ammo: 72 diff --git a/mods/ca/missions/main-campaign/ca-prologue-04/juncture.lua b/mods/ca/missions/main-campaign/ca-prologue-04/juncture.lua new file mode 100644 index 0000000000..b8eda34c91 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca-prologue-04/juncture.lua @@ -0,0 +1,159 @@ +MissionDir = "ca|missions/main-campaign/ca-prologue-04" + +Difficulty = "easy" + +GDIAttackPaths = { + { AttackPath1.Location, AttackPath1.Location, AttackPath3.Location, AttackPath4.Location }, +} + +Squads = { + Main = { + Delay = DateTime.Minutes(5), + AttackValuePerSecond = { Min = 12, Max = 12 }, + FollowLeader = true, + Compositions = { + { + Infantry = { "e1", "e1", "e1", "e2" }, + Vehicles = { { "hmmv", "mtnk", "apc2" } }, + }, + }, + AttackPaths = GDIAttackPaths, + }, +} + +-- Setup and Tick + +SetupPlayers = function() + GDI = Player.GetPlayer("GDI") + Nod = Player.GetPlayer("Nod") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = { Nod } + MissionEnemies = { GDI } +end + +WorldLoaded = function() + SetupPlayers() + + Camera.Position = PlayerStart.CenterPosition + WarpInBeaconPos = RocksToRemove1.CenterPosition + + InitObjectives(Nod) + InitGDI() + + ObjectiveDestroyAA = Nod.AddObjective("Destroy GDI anti-aircraft defenses.") + + local aaGuns = GDI.GetActorsByType("cram") + Trigger.OnAllKilled(aaGuns, function() + local frigates = GDI.GetActorsByType("dd2") + ObjectiveDestroyFrigates = Nod.AddObjective("Destroy GDI naval blockade.") + + Trigger.AfterDelay(DateTime.Seconds(6), function() + InitReinforcements() + end) + + Trigger.OnAllKilled(frigates, function() + Nod.MarkCompletedObjective(ObjectiveDestroyFrigates) + end) + + Nod.MarkCompletedObjective(ObjectiveDestroyAA) + end) + + AfterWorldLoaded() +end + +Tick = function() + OncePerSecondChecks() + OncePerFiveSecondChecks() + PanToBanshees() + AfterTick() +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + GDI.Resources = GDI.ResourceCapacity - 500 + + if MissionPlayersHaveNoRequiredUnits() then + if not Nod.IsObjectiveCompleted(ObjectiveDestroyAA) then + Nod.MarkFailedObjective(ObjectiveDestroyAA) + end + if ObjectiveDestroyFrigates ~= nil and not Nod.IsObjectiveCompleted(ObjectiveDestroyFrigates) then + Nod.MarkFailedObjective(ObjectiveDestroyFrigates) + end + end + end +end + +OncePerFiveSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 125 == 0 then + UpdatePlayerBaseLocations() + end +end + +-- Functions + +InitGDI = function() + AutoRepairBuildings(GDI) + SetupRefAndSilosCaptureCredits(GDI) + AutoReplaceHarvesters(GDI) + InitAttackSquad(Squads.Main, GDI) + + local gdiGroundAttackers = GDI.GetGroundAttackers() + + Utils.Do(gdiGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsGDIGroundHunterUnit) + end) +end + +InitReinforcements = function() + if BansheesWarped then + return + end + BansheesWarped = true + Trigger.AfterDelay(DateTime.Seconds(1), function() + Lighting.Flash("Chronoshift", 10) + Media.PlaySound("chrono2.aud") + Actor.Create("warpin", true, { Owner = Nod, Location = RocksToRemove1.Location }) + Beacon.New(Nod, WarpInBeaconPos) + + RocksToRemove1.Destroy() + RocksToRemove2.Destroy() + + WarpInBanshees() + + Trigger.AfterDelay(DateTime.Seconds(2), function() + PlaySpeechNotificationToMissionPlayers("ReinforcementsArrived") + Notification("Reinforcements have arrived.") + + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(3)), function() + Media.DisplayMessage("You have done well commander! Now behold; a taste of things to come. Use them wisely.", "Kane", HSLColor.FromHex("FF0000")) + MediaCA.PlaySound(MissionDir .. "/thingstocome.aud", 2) + end) + end) + end) +end + +PanToBanshees = function() + if PanToBansheesComplete or not BansheesWarped then + return + end + + local targetPos = WarpInBeaconPos + PanToPos(targetPos, 1024) + + if Camera.Position.X == targetPos.X and Camera.Position.Y == targetPos.Y then + PanToBansheesComplete = true + end +end + +-- overridden in co-op version +WarpInBanshees = function() + local hpad1 = Actor.Create("hpad.td", true, { Owner = Nod, Location = HpadSpawn1.Location }) + local hpad2 = Actor.Create("hpad.td", true, { Owner = Nod, Location = HpadSpawn2.Location }) + Trigger.AfterDelay(10, function() + local banshee1 = Actor.Create("scrn", true, { Owner = Nod, Location = hpad1.Location, CenterPosition = hpad1.CenterPosition, Facing = Angle.NorthEast }) + local banshee2 = Actor.Create("scrn", true, { Owner = Nod, Location = hpad1.Location, CenterPosition = hpad2.CenterPosition, Facing = Angle.NorthEast }) + banshee1.Move(hpad1.Location) + banshee2.Move(hpad2.Location) + end) +end diff --git a/mods/ca/missions/main-campaign/ca-prologue-04/map.bin b/mods/ca/missions/main-campaign/ca-prologue-04/map.bin new file mode 100644 index 0000000000..39b70246ef Binary files /dev/null and b/mods/ca/missions/main-campaign/ca-prologue-04/map.bin differ diff --git a/mods/ca/missions/main-campaign/ca-prologue-04/map.png b/mods/ca/missions/main-campaign/ca-prologue-04/map.png new file mode 100644 index 0000000000..e59b51f74a Binary files /dev/null and b/mods/ca/missions/main-campaign/ca-prologue-04/map.png differ diff --git a/mods/ca/missions/main-campaign/ca-prologue-04/map.yaml b/mods/ca/missions/main-campaign/ca-prologue-04/map.yaml new file mode 100644 index 0000000000..7295671976 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca-prologue-04/map.yaml @@ -0,0 +1,781 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: iv. Juncture + +Author: Darkademic + +Tileset: DESERT + +MapSize: 56,56 + +Bounds: 1,1,54,54 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: Nod, GDI + PlayerReference@Nod: + Name: Nod + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: nod + LockColor: True + Color: FE1100 + LockSpawn: True + LockTeam: True + Enemies: GDI, Creeps + PlayerReference@GDI: + Name: GDI + Bot: campaign + Faction: gdi + Color: F2CF74 + Enemies: Nod, Creeps + +Actors: + Actor0: dd2 + Owner: GDI + Location: 49,17 + Facing: 512 + Actor3: dd2 + Owner: GDI + Facing: 512 + Location: 51,22 + Actor6: dd2 + Owner: GDI + Facing: 512 + Location: 51,11 + Actor7: syrd.gdi + Owner: GDI + Location: 43,7 + Actor8: brik + Owner: GDI + Location: 41,13 + Actor9: brik + Owner: GDI + Location: 41,12 + Actor10: brik + Owner: GDI + Location: 40,13 + Actor11: brik + Owner: GDI + Location: 40,12 + Actor12: brik + Owner: GDI + Location: 36,13 + Actor13: brik + Owner: GDI + Location: 38,13 + Actor14: brik + Owner: GDI + Location: 39,13 + Actor15: brik + Owner: GDI + Location: 37,13 + Actor16: brik + Owner: GDI + Location: 35,13 + Actor17: brik + Owner: GDI + Location: 35,12 + Actor18: brik + Owner: GDI + Location: 36,12 + Actor19: brik + Owner: GDI + Location: 31,12 + Actor20: brik + Owner: GDI + Location: 31,13 + Actor21: brik + Owner: GDI + Location: 30,13 + Actor22: brik + Owner: GDI + Location: 30,12 + Actor23: brik + Owner: GDI + Location: 29,13 + Actor24: brik + Owner: GDI + Location: 28,13 + Actor25: brik + Owner: GDI + Location: 27,13 + Actor26: brik + Owner: GDI + Location: 27,12 + Actor27: brik + Owner: GDI + Location: 27,10 + Actor28: brik + Owner: GDI + Location: 27,11 + Actor29: brik + Owner: GDI + Location: 27,9 + Actor30: brik + Owner: GDI + Location: 27,8 + Actor31: brik + Owner: GDI + Location: 27,7 + Actor32: brik + Owner: GDI + Location: 27,6 + Actor33: brik + Owner: GDI + Location: 27,5 + Actor34: brik + Owner: GDI + Location: 27,4 + Actor35: brik + Owner: GDI + Location: 27,3 + Actor36: brik + Owner: GDI + Location: 27,2 + Actor37: brik + Owner: GDI + Location: 27,1 + Actor38: brik + Owner: GDI + Location: 28,1 + Actor39: brik + Owner: GDI + Location: 29,1 + Actor40: brik + Owner: GDI + Location: 30,1 + Actor41: brik + Owner: GDI + Location: 31,1 + Actor42: brik + Owner: GDI + Location: 33,1 + Actor43: brik + Owner: GDI + Location: 32,1 + Actor44: brik + Owner: GDI + Location: 34,1 + Actor45: brik + Owner: GDI + Location: 36,1 + Actor46: brik + Owner: GDI + Location: 35,1 + Actor47: brik + Owner: GDI + Location: 37,1 + Actor48: brik + Owner: GDI + Location: 38,1 + Actor49: brik + Owner: GDI + Location: 39,1 + Actor50: brik + Owner: GDI + Location: 40,1 + Actor51: brik + Owner: GDI + Location: 40,2 + Actor52: brik + Owner: GDI + Location: 39,2 + Actor53: hq + Owner: GDI + Location: 28,2 + Actor54: afac + Owner: GDI + Location: 36,2 + Actor55: atwr + Owner: GDI + Location: 29,12 + Actor56: atwr + Owner: GDI + Location: 37,12 + Actor57: gtwr + Owner: GDI + Location: 31,14 + Actor58: gtwr + Owner: GDI + Location: 35,14 + Actor59: proc.td + Owner: GDI + Location: 29,6 + Actor60: nuk2 + Owner: GDI + Location: 34,2 + Actor61: nuk2 + Owner: GDI + Location: 32,2 + Actor62: nuk2 + Owner: GDI + Location: 30,2 + Actor63: pyle + Owner: GDI + Location: 35,8 + Actor64: weap.td + Owner: GDI + Location: 38,7 + Actor65: silo.td + Owner: GDI + Location: 39,3 + Actor66: silo.td + Owner: GDI + Location: 39,4 + Actor68: cram + Owner: GDI + Location: 39,33 + TurretFacing: 245 + Actor70: cram + Owner: GDI + Location: 40,20 + TurretFacing: 237 + Actor71: cram + Owner: GDI + Location: 34,27 + TurretFacing: 222 + Actor72: sbag + Owner: GDI + Location: 39,20 + Actor73: sbag + Owner: GDI + Location: 39,19 + Actor74: sbag + Owner: GDI + Location: 40,19 + Actor75: sbag + Owner: GDI + Location: 41,19 + Actor76: sbag + Owner: GDI + Location: 41,20 + Actor77: sbag + Owner: GDI + Location: 41,21 + Actor78: sbag + Owner: GDI + Location: 40,21 + Actor79: sbag + Owner: GDI + Location: 39,21 + Actor80: sbag + Owner: GDI + Location: 34,26 + Actor81: sbag + Owner: GDI + Location: 35,26 + Actor82: sbag + Owner: GDI + Location: 35,27 + Actor83: sbag + Owner: GDI + Location: 33,26 + Actor84: sbag + Owner: GDI + Location: 33,28 + Actor85: sbag + Owner: GDI + Location: 33,27 + Actor86: sbag + Owner: GDI + Location: 34,28 + Actor87: sbag + Owner: GDI + Location: 35,28 + Actor88: sbag + Owner: GDI + Location: 38,32 + Actor89: sbag + Owner: GDI + Location: 39,32 + Actor90: sbag + Owner: GDI + Location: 40,32 + Actor91: sbag + Owner: GDI + Location: 40,33 + Actor92: sbag + Owner: GDI + Location: 38,33 + Actor93: sbag + Owner: GDI + Location: 38,34 + Actor94: sbag + Owner: GDI + Location: 39,34 + Actor95: sbag + Owner: GDI + Location: 40,34 + Actor104: cram + Owner: GDI + Location: 33,51 + TurretFacing: 293 + Actor105: sbag + Owner: GDI + Location: 34,51 + Actor106: sbag + Owner: GDI + Location: 34,52 + Actor107: sbag + Owner: GDI + Location: 33,52 + Actor108: sbag + Owner: GDI + Location: 32,52 + Actor109: sbag + Owner: GDI + Location: 32,51 + Actor110: sbag + Owner: GDI + Location: 32,50 + Actor111: sbag + Owner: GDI + Location: 33,50 + Actor112: sbag + Owner: GDI + Location: 34,50 + Actor101: sbag + Owner: GDI + Location: 39,41 + Actor102: sbag + Owner: GDI + Location: 40,41 + Actor103: sbag + Owner: GDI + Location: 41,41 + Actor113: sbag + Owner: GDI + Location: 39,42 + Actor114: cram + Owner: GDI + Location: 40,42 + TurretFacing: 293 + Actor115: sbag + Owner: GDI + Location: 41,42 + Actor116: sbag + Owner: GDI + Location: 39,43 + Actor117: sbag + Owner: GDI + Location: 40,43 + Actor118: sbag + Owner: GDI + Location: 41,43 + Actor119: dd2 + Owner: GDI + Facing: 512 + Location: 49,27 + Actor120: dd2 + Owner: GDI + Facing: 512 + Location: 51,32 + RocksToRemove1: rock6 + Owner: Neutral + Location: 4,42 + RocksToRemove2: rock5 + Owner: Neutral + Location: 4,44 + Actor123: split2 + Owner: Neutral + Location: 5,50 + Actor124: split2 + Owner: Neutral + Location: 11,45 + Actor125: split2 + Owner: Neutral + Location: 23,12 + Actor126: split2 + Owner: Neutral + Location: 24,5 + Actor127: split2 + Owner: Neutral + Location: 3,30 + Actor128: t18 + Owner: Neutral + Location: 19,25 + Actor129: t18 + Owner: Neutral + Location: 5,11 + Actor130: t18 + Owner: Neutral + Location: 13,26 + Actor131: tc01 + Owner: Neutral + Location: 34,41 + Actor132: t08 + Owner: Neutral + Location: 25,33 + Actor133: t09 + Owner: Neutral + Location: 25,18 + Actor134: v33 + Owner: Neutral + Location: 9,7 + Actor135: v32 + Owner: Neutral + Location: 14,10 + Actor137: v31 + Owner: Neutral + Location: 10,3 + Actor136: v23 + Owner: Neutral + Location: 11,10 + Actor138: v26 + Owner: Neutral + Location: 14,6 + Actor139: v27 + Owner: Neutral + Location: 14,16 + Actor140: v21 + Owner: Neutral + Location: 5,2 + Actor141: c5 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 7,5 + Actor142: c8 + Owner: Neutral + SubCell: 3 + Location: 15,9 + Facing: 697 + Actor143: mtnk + Owner: GDI + Location: 23,20 + Facing: 256 + Actor144: mtnk + Owner: GDI + Location: 25,20 + Facing: 256 + Actor145: apc.ai + Owner: GDI + Location: 27,20 + Facing: 256 + Actor146: mtnk + Owner: GDI + Facing: 384 + Location: 36,15 + Actor147: mtnk + Owner: GDI + Location: 40,10 + Facing: 618 + Actor148: hmmv + Owner: GDI + Location: 11,29 + Facing: 634 + Actor149: hmmv + Owner: GDI + Facing: 384 + Location: 35,32 + Actor150: hmmv + Owner: GDI + Location: 8,9 + Facing: 626 + Actor151: mtnk + Owner: GDI + Location: 12,7 + Facing: 523 + Actor156: n1 + Owner: GDI + SubCell: 3 + Location: 13,29 + Facing: 384 + Actor157: n1 + Owner: GDI + Location: 10,30 + SubCell: 3 + Facing: 547 + Actor158: n1 + Owner: GDI + SubCell: 3 + Location: 15,31 + Facing: 475 + Actor159: n1 + Owner: GDI + Location: 14,28 + SubCell: 3 + Facing: 586 + Actor160: n2 + Owner: GDI + SubCell: 3 + Location: 12,28 + Facing: 618 + Actor161: n1 + Owner: GDI + SubCell: 3 + Location: 35,30 + Facing: 285 + Actor162: n1 + Owner: GDI + SubCell: 3 + Location: 37,32 + Facing: 626 + Actor164: n1 + Owner: GDI + Facing: 384 + Location: 37,33 + SubCell: 1 + Actor163: n1 + Owner: GDI + SubCell: 3 + Location: 38,40 + Facing: 174 + Actor165: n1 + Owner: GDI + SubCell: 3 + Location: 36,43 + Facing: 642 + Actor166: n1 + Owner: GDI + SubCell: 3 + Location: 35,41 + Facing: 158 + Actor167: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 35,15 + Actor168: n1 + Owner: GDI + Facing: 384 + Location: 30,14 + SubCell: 3 + Actor169: n1 + Owner: GDI + SubCell: 3 + Location: 34,12 + Facing: 507 + Actor170: n1 + Owner: GDI + Location: 37,10 + SubCell: 3 + Facing: 523 + Actor171: n1 + Owner: GDI + Facing: 384 + Location: 34,8 + SubCell: 3 + Actor172: n1 + Owner: GDI + SubCell: 3 + Location: 35,7 + Facing: 483 + Actor173: n1 + Owner: GDI + SubCell: 3 + Location: 8,10 + Facing: 499 + Actor174: n1 + Owner: GDI + Facing: 384 + Location: 8,10 + SubCell: 1 + Actor175: n1 + Owner: GDI + SubCell: 3 + Location: 13,8 + Facing: 563 + Actor176: n1 + Owner: GDI + SubCell: 3 + Location: 16,11 + Facing: 626 + Actor177: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 11,9 + Actor178: n2 + Owner: GDI + SubCell: 3 + Facing: 384 + Location: 14,12 + Actor179: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 7,16 + Actor180: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 38,31 + Actor181: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 38,21 + Actor182: n1 + Owner: GDI + Facing: 384 + Location: 38,20 + SubCell: 3 + Actor183: n1 + Owner: GDI + Facing: 384 + Location: 25,33 + SubCell: 1 + Actor184: n1 + Owner: GDI + SubCell: 3 + Location: 25,28 + Facing: 745 + Actor185: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 31,51 + Actor186: n1 + Owner: GDI + SubCell: 3 + Location: 6,9 + Facing: 634 + Actor187: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 24,21 + Actor188: n2 + Owner: GDI + Location: 25,19 + SubCell: 3 + Facing: 174 + Actor189: n1 + Owner: GDI + SubCell: 3 + Location: 22,19 + Facing: 79 + Actor190: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 22,21 + Actor191: n1 + Owner: GDI + SubCell: 3 + Location: 26,21 + Facing: 384 + AttackPath1: waypoint + Owner: Neutral + Location: 32,20 + AttackPath2: waypoint + Owner: Neutral + Location: 12,18 + AttackPath3: waypoint + Owner: Neutral + Location: 5,25 + AttackPath4: waypoint + Owner: Neutral + Location: 16,39 + Actor193: amcv + Owner: Nod + Facing: 0 + Location: 22,51 + PlayerStart: waypoint + Owner: Neutral + Location: 22,50 + Actor192: bggy + Owner: Nod + Location: 24,49 + Facing: 0 + Actor194: bggy + Owner: Nod + Location: 20,49 + Facing: 0 + Actor196: n1 + Owner: GDI + SubCell: 3 + Location: 17,36 + Facing: 491 + Actor197: n1 + Owner: GDI + SubCell: 3 + Location: 16,37 + Facing: 634 + Actor198: n2 + Owner: GDI + SubCell: 3 + Location: 14,38 + Facing: 555 + Actor199: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 19,37 + Actor206: n1 + Owner: Nod + SubCell: 1 + Facing: 0 + Location: 20,47 + Actor207: n1 + Owner: Nod + SubCell: 4 + Facing: 0 + Location: 20,47 + Actor209: n1 + Owner: Nod + SubCell: 5 + Facing: 0 + Location: 20,47 + Actor210: n1 + Owner: Nod + SubCell: 2 + Facing: 0 + Location: 20,47 + Actor211: n1 + Owner: Nod + SubCell: 1 + Facing: 0 + Location: 24,47 + Actor212: n1 + Owner: Nod + SubCell: 4 + Facing: 0 + Location: 24,47 + Actor213: n1 + Owner: Nod + SubCell: 5 + Facing: 0 + Location: 24,47 + Actor214: n1 + Owner: Nod + SubCell: 2 + Facing: 0 + Location: 24,47 + Actor201: n1 + Owner: GDI + Location: 25,22 + SubCell: 1 + Facing: 229 + HpadSpawn1: waypoint + Owner: Neutral + Location: 3,43 + HpadSpawn2: waypoint + Owner: Neutral + Location: 5,42 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-covenants.yaml, juncture-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml + +Notifications: juncture-notifications.yaml diff --git a/mods/ca/missions/main-campaign/ca-prologue-04/thingstocome.aud b/mods/ca/missions/main-campaign/ca-prologue-04/thingstocome.aud new file mode 100644 index 0000000000..6392f83c41 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca-prologue-04/thingstocome.aud differ diff --git a/mods/ca/missions/main-campaign/ca01-crossrip/crossrip-rules.yaml b/mods/ca/missions/main-campaign/ca01-crossrip/crossrip-rules.yaml new file mode 100644 index 0000000000..22f43bf288 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca01-crossrip/crossrip-rules.yaml @@ -0,0 +1,136 @@ + +^Palettes: + TintPostProcessEffect: + +World: + LuaScript: + Scripts: campaign.lua, crossrip.lua + MissionData: + Briefing: Strange and inexplicable occurrences continue to leave our best scientists dumbfounded.\n\nWe have detected unusual energy readings emanating from a Soviet facility in the area, and there may be a connection.\n\nEstablish a base and investigate.\n\nIf the Soviets put up strong resistance then they must be hiding something of importance, in which case you are authorized to launch a full scale attack.\n\nUnfortunately we can't commit our most advanced equipment or aircraft until we've assessed if there is a significant threat. + WinVideo: crontest.vqa + LossVideo: battle.vqa + MapOptions: + ShortGameCheckboxEnabled: True + TechLevel: medium + MusicPlaylist: + StartingMusic: radio2ca + +Player: + PlayerResources: + DefaultCash: 6000 + +# Disable powers for AI + +^ParabombsPower: + AirstrikePowerCA@Russianparabombs: + Prerequisites: ~support.parabombs, ~!botplayer + +^ParatroopersPower: + ParatroopersPowerCA@paratroopers: + Prerequisites: ~support.paratroopers, ~!botplayer + +# To silence unit lost notifications when announcer is speaking + +UNITLOSTSILENCER: + Inherits@DUMMY: ^InvisibleDummy + ProvidesPrerequisite: + +^Infantry: + ActorLostNotification: + RequiresCondition: !unit-lost-notification-silenced + GrantConditionOnPrerequisite@UNITLOSTSILENCED: + Condition: unit-lost-notification-silenced + Prerequisites: unitlostsilencer + +^VEHICLE-NOUPG: + ActorLostNotification: + RequiresCondition: !unit-lost-notification-silenced + GrantConditionOnPrerequisite@UNITLOSTSILENCED: + Condition: unit-lost-notification-silenced + Prerequisites: unitlostsilencer + +BRUT.Mutating: + ActorLostNotification: + RequiresCondition: !unit-lost-notification-silenced + +GSCR.Mutating: + ActorLostNotification: + RequiresCondition: !unit-lost-notification-silenced + +# Chronosphere modifications + +PDOX: + Inherits@CAMPAIGNDISABLED: ^Disabled + -ChronoshiftPowerCA@chronoshift: + -DetonateWeaponPower@ChronoAI: + -GrantExternalConditionPowerCA@TimeWarp: + Power: + Amount: 0 + ExternalCondition@DISABLED: + Condition: disabled + -GrantConditionOnPowerState@LOWPOWER: + -GrantCondition@IDISABLE: + -FireWarheadsOnDeath: + -SpawnActorOnDeath: + -SpawnRandomActorOnDeath: + AnnounceOnSeen: + PingRadar: true + -GrantConditionOnPrerequisite@OwnedByAi: + -GrantConditionOnPrerequisite@AiSuperweaponsEnabled: + +PDOX.CROSSRIP: + Inherits@1: ^ExistsInWorld + Inherits@2: ^SpriteActor + Inherits@SHAPE: ^2x2Shape + WithSpriteBody: + RenderSprites: + Interactable: + WithRestartableIdleOverlay: + Image: chronobubble + StartSequence: warpin + RestartSequence: warpin + Sequence: warpout + PlayOnce: true + Palette: ra2effect-ignore-lighting-alpha75 + Building: + Footprint: xx xx + Dimensions: 2,2 + TerrainTypes: Clear,Road + FrozenUnderFog: + PeriodicExplosion: + Weapon: Crossrip + +# Disable tech + +HPAD: + Inherits@CAMPAIGNDISABLED: ^Disabled + +SYRD: + Inherits@CAMPAIGNDISABLED: ^Disabled + +SPEN: + Inherits@CAMPAIGNDISABLED: ^Disabled + +hazmat.upgrade: + Inherits@CAMPAIGNDISABLED: ^Disabled + +# Misc + +MIG: + AutoTarget: + InitialStanceAI: HoldFire + +TSLA: + -Targetable@TeslaBoost: + +WORMHOLE: + -Targetable: + +# Hunt() requires only 1 AttackBase +DEVA: + -AttackFrontalCharged: + -Armament@PRIMARYUPG: + -AmbientSound@CHARGE: + -WithIdleOverlay@CHARGE1: + -WithIdleOverlay@CHARGE2: + -WithIdleOverlay@CHARGE3: diff --git a/mods/ca/missions/main-campaign/ca01-crossrip/crossrip-sequences.yaml b/mods/ca/missions/main-campaign/ca01-crossrip/crossrip-sequences.yaml new file mode 100644 index 0000000000..1131dc6f39 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca01-crossrip/crossrip-sequences.yaml @@ -0,0 +1,9 @@ +pdox.crossrip: + Inherits: ^StructureOverlays + idle: + Filename: pdox.shp + Frames: 5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27 + Length: 23 + Tick: 140 + icon: + Filename: pdoxicon.shp diff --git a/mods/ca/missions/main-campaign/ca01-crossrip/crossrip-weapons.yaml b/mods/ca/missions/main-campaign/ca01-crossrip/crossrip-weapons.yaml new file mode 100644 index 0000000000..7edf0dd7ff --- /dev/null +++ b/mods/ca/missions/main-campaign/ca01-crossrip/crossrip-weapons.yaml @@ -0,0 +1,23 @@ + +Crossrip: + ReloadDelay: 10000 + Projectile: InstantExplode + Warhead@1Dam: SpreadDamage + Spread: 8c0 + Damage: 80000 + ValidTargets: Structure, Wall, Trees + Versus: + Wood: 150 + Concrete: 150 + DamageTypes: Prone50Percent, TriggerProne, FireDeath, Incendiary + Warhead@1Eff: CreateEffect + Explosions: chronowarpbig_effect + ExplosionPalette: ra2effect-ignore-lighting-alpha75 + ImpactSounds: crossrip.aud + ValidTargets: Ground, Water, Air + Warhead@2Eff: CreateEffect + Explosions: mindblast + ExplosionPalette: ra2effect-ignore-lighting-alpha75 + ValidTargets: Ground, Trees, Water, Underwater, Air, AirSmall + Delay: 25 + Warhead@3Flash: ChronoFlashEffect diff --git a/mods/ca/missions/main-campaign/ca01-crossrip/crossrip.lua b/mods/ca/missions/main-campaign/ca01-crossrip/crossrip.lua new file mode 100644 index 0000000000..0bd3044180 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca01-crossrip/crossrip.lua @@ -0,0 +1,602 @@ +MissionDir = "ca|missions/main-campaign/ca01-crossrip" + +-- Locations + +SovietBorder = { CPos.New(9,32), CPos.New(10,32), CPos.New(11,32), CPos.New(12,32), CPos.New(13,32), CPos.New(14,32), CPos.New(15,32), CPos.New(16,32), CPos.New(17,32), CPos.New(18,32) } +SovietMainBaseEntrance = { CPos.New(39,3), CPos.New(39,4), CPos.New(39,5), CPos.New(39,6), CPos.New(39,7), CPos.New(39,8), CPos.New(39,9), CPos.New(39,10), CPos.New(39,11), CPos.New(39,12), CPos.New(39,13) } +SovietChronosphereLocation = CPos.New(60,25) +WormholeSpawns = { WormholeSpawn1.Location, WormholeSpawn2.Location, WormholeSpawn3.Location, WormholeSpawn4.Location, WormholeSpawn5.Location } + +TreesToTransform = { + { Actor = TreeToTransform1, Location = TreeToTransform1.Location }, + { Actor = TreeToTransform2, Location = TreeToTransform2.Location }, + { Actor = TreeToTransform3, Location = TreeToTransform3.Location }, + { Actor = TreeToTransform4, Location = TreeToTransform4.Location } +} + +SovietAttackPaths = { + { AttackWaypoint1.Location, AttackWaypoint2.Location, AttackWaypoint3.Location, AttackWaypoint5.Location }, + { AttackWaypoint1.Location, AttackWaypoint2.Location, AttackWaypoint3.Location, AttackWaypoint4.Location, AttackWaypoint5.Location } +} + +AirAttackPaths = { + { DevastatorSpawn1.Location, DevastatorDestination1.Location }, + { DevastatorSpawn2.Location, DevastatorDestination2.Location }, + { DevastatorSpawn3.Location, DevastatorDestination3.Location } +} + +ScrinAttackPaths = { + { AttackWaypoint4.Location, AttackWaypoint5.Location }, + { AttackWaypoint5.Location }, +} + +WestPatrolPath = { WestPatrolWaypoint1.Location, WestPatrolWaypoint2.Location } + +-- Other Variables + +WestPatrolUnits = { WestPatrolUnit1, WestPatrolUnit2, WestPatrolUnit3, WestPatrolUnit4 } + +ScrinInfantrySquads = { + easy = { "s1", "s1", "s1", "s3" }, + normal = { "s1", "s1", "s1", "s2", "s3" }, + hard = { "s1", "s1", "s1", "s2", "s3", "s4" }, + vhard = { "s1", "s1", "s1", "s2", "s3", "s4" }, + brutal = { "s1", "s1", "s1", "s2", "s3", "s4", "s1" } +} + +ScrinVehicleTypes = { + easy = { "gunw", "seek", "intl", "gscr" }, + normal = { "gunw", "seek", "intl", "corr" }, + hard = { "gunw", "seek", "corr", "devo", "intl", "tpod" }, + vhard = { "gunw", "seek", "corr", "devo", "intl", "tpod" }, + brutal = { "shrw", "seek", "corr", "devo", "intl", "rtpd" } +} + +ScrinVehiclesIntervalMultiplier = { + easy = 4, + normal = 4, + hard = 3, + vhard = 3, + brutal = 3 +} + +EvacuationTime = { + easy = DateTime.Minutes(4) + DateTime.Seconds(30), + normal = DateTime.Minutes(5), + hard = DateTime.Minutes(5) + DateTime.Seconds(30), + vhard = DateTime.Minutes(5) + DateTime.Seconds(30), + brutal = DateTime.Minutes(5) + DateTime.Seconds(30), +} + +HaloDropEntryPaths = { + { HaloSpawn1.Location, HaloLanding1.Location }, + { HaloSpawn2.Location, HaloLanding2.Location }, + { HaloSpawn3.Location, HaloLanding3.Location } +} + +HaloDropStart = AdjustDelayForDifficulty(DateTime.Minutes(12)) +HaloDropAttackValue = AdjustAttackValuesForDifficulty({ Min = 12, Max = 24, RampDuration = DateTime.Minutes(10) }) +NavalDropStart = AdjustDelayForDifficulty(DateTime.Minutes(18)) +NavalDropAttackValue = AdjustAttackValuesForDifficulty({ Min = 6, Max = 6 }) + +-- Squads + +HardAndAboveMainCompositions = { + { + Infantry = { "e3", "e1", "e1", "e1", "e1", "e1", "e2", "e3", "e4" }, + Vehicles = { "3tnk", "btr.ai", "3tnk" }, + MaxTime = DateTime.Minutes(6) + }, + { + Infantry = { "e3", "e1", "e1", "e3", "shok", "e1", { "shok", "e8" }, "e1", "e2", "e3", "e4" }, + Vehicles = { { "3tnk", "3tnk.atomic" }, "4tnk", "btr.ai", { "katy", "v2rl" }, "ttra" }, + MinTime = DateTime.Minutes(6), + MaxTime = DateTime.Minutes(16) + }, +} + +if Difficulty == "brutal" then + HardAndAboveMainCompositions[2].MaxTime = DateTime.Minutes(16) + + table.insert(HardAndAboveMainCompositions, { + Infantry = { "e3", "e1", "e1", "e3", "shok", "e1", { "ttrp", "deso" }, "e1", "e2", "e3", "e4", "e1", "e1", "e1", "e1", "e3", "e1", { "ttrp", "deso" } }, + Vehicles = { { "3tnk", "3tnk.atomic" }, "4tnk", "btr.ai", "v2rl", "v2rl", "grad", "ttra" }, + MinTime = DateTime.Minutes(16) + }) +end + +Squads = { + Main = { + Delay = AdjustDelayForDifficulty(DateTime.Minutes(3)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 35, Max = 45 }), + FollowLeader = true, + ProducerActors = { Infantry = { SovietBarracks }, Vehicles = { SovietWarFactory } }, + Compositions = { + easy = { + { + Infantry = { "e3", "e1", "e1", "e1", "e2", "e4" }, + Vehicles = { "3tnk", "btr" }, + MaxTime = DateTime.Minutes(12) + }, + { + Infantry = { "e3", "e1", "e1", "shok", "shok", "e1", "e2", "e3", "e4" }, + Vehicles = { "4tnk", "btr.ai" }, + MinTime = DateTime.Minutes(12) + } + }, + normal = { + { + Infantry = { "e3", "e1", "e1", "e1", "e1", "e2", "e4" }, + Vehicles = { "3tnk", "btr.ai" }, + MaxTime = DateTime.Minutes(9) + }, + { + Infantry = { "e3", "e1", "e1", "shok", "e1", "e2", "e3", "e4" }, + Vehicles = { { "3tnk", "3tnk.atomic" }, "4tnk", "katy" }, + MinTime = DateTime.Minutes(9) + } + }, + hard = HardAndAboveMainCompositions, + vhard = HardAndAboveMainCompositions, + brutal = HardAndAboveMainCompositions + }, + AttackPaths = SovietAttackPaths, + }, + Western = { + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 10, Max = 20 }), + FollowLeader = true, + ProducerActors = { Infantry = { SovietWestBarracks } }, + Compositions = AdjustCompositionsForDifficulty({ + { Infantry = { "e3", "e1", "e2", "e1", "e4", "e1", "shok", "e1" } } + }), + AttackPaths = { + { AttackWaypoint4.Location, AttackWaypoint5.Location } + } + }, + Migs = { + Delay = AdjustAirDelayForDifficulty(DateTime.Minutes(11)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 8, Max = 12 }), + Compositions = { + easy = { + { Aircraft = { "mig" } } + }, + normal = { + { Aircraft = { "mig", "mig" } } + }, + hard = { + { Aircraft = { "mig", "mig", "mig" } } + }, + vhard = { + { Aircraft = { "mig", "mig", "mig" } } + }, + brutal = { + { Aircraft = { "mig", "mig", "mig", "mig" } } + } + } + } +} + +-- Setup and Tick + +SetupPlayers = function() + Greece = Player.GetPlayer("Greece") + USSR = Player.GetPlayer("USSR") + Scrin = Player.GetPlayer("Scrin") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = { Greece } + MissionEnemies = { USSR, Scrin } +end + +WorldLoaded = function() + SetupPlayers() + + TimerTicks = 0 + Camera.Position = PlayerMcv.CenterPosition + + InitObjectives(Greece) + AdjustPlayerStartingCashForDifficulty() + RemoveActorsBasedOnDifficultyTags() + InitUSSR() + + Trigger.AfterDelay(1, function() + ObjectiveEstablishBase = Greece.AddObjective("Establish a base.") + UserInterface.SetMissionText("Establish a base.", HSLColor.Yellow) + end) + + Trigger.OnKilled(Church, function(self, killer) + Actor.Create("moneycrate", true, { Owner = Greece, Location = Church.Location }) + end) + + Trigger.OnEnteredProximityTrigger(SovietChronosphere.CenterPosition, WDist.New(7 * 1024), function(a, id) + if IsMissionPlayer(a.Owner) then + Trigger.RemoveProximityTrigger(id) + ChronosphereDiscovered() + end + end) + + Trigger.AfterDelay(DateTime.Seconds(2), function() + BaseFlare = Actor.Create("flare", true, { Owner = Greece, Location = DeploySuggestion.Location }) + PlaySpeechNotificationToMissionPlayers("SignalFlare") + Notification("Signal flare detected. Press [" .. UtilsCA.Hotkey("ToLastEvent") .. "] to view location.") + Beacon.New(Greece, DeploySuggestion.CenterPosition) + Trigger.AfterDelay(DateTime.Seconds(2), function() + Tip("Press [" .. UtilsCA.Hotkey("OpenTeamChat") .. "] to open the chat panel to read previous notification messages.") + end) + + Trigger.OnEnteredProximityTrigger(DeploySuggestion.CenterPosition, WDist.New(6 * 1024), function(a, id) + if IsMissionPlayer(a.Owner) and a.Type ~= "waypoint" and a.Type ~= "flare" and not IsDeploySuggestionReached then + IsDeploySuggestionReached = true + Trigger.RemoveProximityTrigger(id) + BaseFlare.Destroy() + end + end) + end) + + SetupReveals({ EntranceReveal1, EntranceReveal2 }) + AfterWorldLoaded() +end + +Tick = function() + if not IsBaseEstablished and MissionPlayersHaveConyard() then + IsBaseEstablished = true + if ObjectiveInvestigateArea == nil then + ObjectiveInvestigateArea = Greece.AddObjective("Investigate the area.") + UserInterface.SetMissionText("") + end + Greece.MarkCompletedObjective(ObjectiveEstablishBase) + + if IsHardOrBelow() then + InitUSSRAttacks() + + Trigger.AfterDelay(DateTime.Seconds(5), function() + Tip("Build a barracks for access to static defenses which should allow you to hold off any early attacks. Use Pillboxes against infantry and Turrets against vehicles.") + end) + + Trigger.AfterDelay(DateTime.Minutes(2), function() + Tip("Mechanics can repair your vehicles in the field. Putting a Mechanic inside an IFV turns it into a repair vehicle. Build a Supply Depot for access to Mechanics.") + end) + + Trigger.AfterDelay(DateTime.Minutes(3), function() + Tip("Prism Tanks are excellent long range support units that are effective against infantry, defenses and light vehicles. Build a Radar Dome for access to Prism Tanks.") + end) + end + end + + OncePerSecondChecks() + OncePerFiveSecondChecks() + AfterTick() +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + USSR.Resources = USSR.ResourceCapacity - 500 + + if TimerTicks > 0 then + if TimerTicks > 25 then + TimerTicks = TimerTicks - 25 + UserInterface.SetMissionText("Evacuation begins in " .. UtilsCA.FormatTimeForGameSpeed(TimerTicks), HSLColor.Yellow) + else + TimerTicks = 0 + UserInterface.SetMissionText("Evacuation underway.", HSLColor.Yellow) + Greece.MarkCompletedObjective(ObjectiveDefendUntilEvacuation) + end + end + + if MissionPlayersHaveNoRequiredUnits() then + if ObjectiveEstablishBase ~= nil and not Greece.IsObjectiveCompleted(ObjectiveEstablishBase) then + Greece.MarkFailedObjective(ObjectiveEstablishBase) + end + if ObjectiveInvestigateArea ~= nil and not Greece.IsObjectiveCompleted(ObjectiveInvestigateArea) then + Greece.MarkFailedObjective(ObjectiveInvestigateArea) + end + if ObjectiveCaptureOrDestroyChronosphere ~= nil and not Greece.IsObjectiveCompleted(ObjectiveCaptureOrDestroyChronosphere) then + Greece.MarkFailedObjective(ObjectiveCaptureOrDestroyChronosphere) + end + if ObjectiveDefendUntilEvacuation ~= nil and not Greece.IsObjectiveCompleted(ObjectiveDefendUntilEvacuation) then + Greece.MarkFailedObjective(ObjectiveDefendUntilEvacuation) + end + end + end +end + +OncePerFiveSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 125 == 0 then + UpdatePlayerBaseLocations() + end +end + +-- Functions + +InitUSSR = function() + if Difficulty == "easy" then + RebuildExcludes.USSR = { Types = { "tsla", "ftur" } } + elseif Difficulty == "normal" then + RebuildExcludes.USSR = { Types = { "tsla" } } + end + + AutoRepairAndRebuildBuildings(USSR, 10) + SetupRefAndSilosCaptureCredits(USSR) + AutoReplaceHarvesters(USSR) + AutoRebuildConyards(USSR) + + if IsVeryHardOrAbove() then + InitUSSRAttacks() + end + + -- Set western patrol + Utils.Do(WestPatrolUnits, function(unit) + if not unit.IsDead then + unit.Patrol(WestPatrolPath, true, 100) + end + end) + + -- Halo drops + Trigger.AfterDelay(HaloDropStart, DoHaloDrop) + + -- Beach landings + if Difficulty ~= "easy" then + Trigger.AfterDelay(NavalDropStart, DoSovietNavalDrop) + end + + -- On player crossing Soviet border start making infantry at western barracks + Trigger.OnEnteredFootprint(SovietBorder, function(a, id) + if IsMissionPlayer(a.Owner) then + Trigger.RemoveFootprintTrigger(id) + if not IsWesternSquadActive then + IsWesternSquadActive = true + InitAttackSquad(Squads.Western, USSR) + end + end + end) + + -- On destroying or capturing Chronosphere + Trigger.OnKilled(SovietChronosphere, function(self, killer) + Actor.Create("pdox.crossrip", true, { Owner = USSR, Location = SovietChronosphereLocation}) + ChronosphereDiscovered() + InterdimensionalCrossrip() + end) + + Trigger.OnCapture(SovietChronosphere, function(self, captor, oldOwner, newOwner) + SovietChronosphere.Kill() + end) +end + +InitUSSRAttacks = function() + InitAttackSquad(Squads.Main, USSR) + InitAirAttackSquad(Squads.Migs, USSR) +end + +ScrinInvasion = function() + local wormholes = Scrin.GetActorsByType("wormhole") + + Utils.Do(wormholes, function(wormhole) + local units = Reinforcements.Reinforce(Scrin, ScrinInfantrySquads[Difficulty], { wormhole.Location }, 1) + Utils.Do(units, function(unit) + unit.Scatter() + Trigger.AfterDelay(5, function() + AssaultPlayerBaseOrHunt(unit, MissionPlayers, GetScrinAssaultWaypoints()) + end) + end) + end) + + Trigger.AfterDelay(GetInvasionInterval(), ScrinInvasion) + if not IsInvasionStarted then + Trigger.AfterDelay(GetInvasionInterval() * 2, CreateScrinVehicles) + IsInvasionStarted = true + end +end + +CreateScrinVehicles = function() + local wormholes = Scrin.GetActorsByType("wormhole") + + Utils.Do(wormholes, function(wormhole) + local units = Reinforcements.Reinforce(Scrin, { Utils.Random(ScrinVehicleTypes[Difficulty]) }, { wormhole.Location }, 1) + Utils.Do(units, function(unit) + unit.Scatter() + Trigger.AfterDelay(5, function() + AssaultPlayerBaseOrHunt(unit, MissionPlayers, GetScrinAssaultWaypoints()) + end) + end) + end) + + Trigger.AfterDelay(GetInvasionInterval() * ScrinVehiclesIntervalMultiplier[Difficulty], CreateScrinVehicles) +end + +GetScrinAssaultWaypoints = function() + local assaultWaypoints = { AttackWaypoint5.Location } + + if Utils.RandomInteger(0,2) == 1 then + assaultWaypoints = { AttackWaypoint4.Location, AttackWaypoint5.Location } + end + + return assaultWaypoints +end + +ChronosphereDiscovered = function() + if not IsChronosphereDiscovered then + IsBaseEstablished = true + IsChronosphereDiscovered = true + Notification("Commander, the Soviets have been attempting to reverse engineer stolen Chronosphere technology! Use whatever means necessary to cease their experiments.") + MediaCA.PlaySound(MissionDir .. "/r_chronodisc.aud", 2) + + local autoCamera = Actor.Create("smallcamera", true, { Owner = Greece, Location = SovietChronosphereLocation }) + Trigger.AfterDelay(DateTime.Seconds(5), autoCamera.Destroy) + + ObjectiveCaptureOrDestroyChronosphere = Greece.AddObjective("Capture or destroy the Soviet Chronosphere.") + UserInterface.SetMissionText("Capture or destroy the Soviet Chronosphere.", HSLColor.Yellow) + + if ObjectiveEstablishBase ~= nil and not Greece.IsObjectiveCompleted(ObjectiveEstablishBase) then + Greece.MarkCompletedObjective(ObjectiveEstablishBase) + end + if ObjectiveInvestigateArea ~= nil and not Greece.IsObjectiveCompleted(ObjectiveInvestigateArea) then + Greece.MarkCompletedObjective(ObjectiveInvestigateArea) + end + end +end + +InterdimensionalCrossrip = function() + if IsCrossRipped then + return + end + + IsCrossRipped = true + + if not SovietWarFactory.IsDead then + SovietWarFactory.Kill() + end + + local sovietGroundAttackers = USSR.GetGroundAttackers() + Utils.Do(sovietGroundAttackers, function(a) + Trigger.AfterDelay(Utils.RandomInteger(5,250), function() + if not a.IsDead then + a.Kill("ExplosionDeath") + end + end) + end) + + Lighting.Ambient = 0.8 + Lighting.Red = 0.8 + Lighting.Blue = 0.9 + Lighting.Green = 1.2 + + Trigger.AfterDelay(1, SpawnWormhole) + Trigger.AfterDelay(2, SpawnTibTree) + + ObjectiveDefendUntilEvacuation = Greece.AddObjective("Defend your base until evacuation is prepared.") + + if ObjectiveCaptureOrDestroyChronosphere ~= nil then + Greece.MarkCompletedObjective(ObjectiveCaptureOrDestroyChronosphere) + end + + local unitLostSilencers = {} + + Utils.Do(MissionPlayers, function(p) + table.insert(unitLostSilencers, Actor.Create("unitlostsilencer", true, { Owner = p })) + end) + + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(2)), function() + ScrinInvasion() + Notification("Unidentified hostile forces detected. Fall back to your base, and prepare for evacuation.") + MediaCA.PlaySound(MissionDir .. "/r_evac.aud", 2) + TimerTicks = EvacuationTime[Difficulty] + Trigger.AfterDelay(DateTime.Seconds(7), function() + Utils.Do(unitLostSilencers, function(silencer) + silencer.Destroy() + end) + end) + end) + + Actor.Create("flare", true, { Owner = Greece, Location = Evac1.Location }) + Actor.Create("flare", true, { Owner = Greece, Location = Evac2.Location }) + Actor.Create("flare", true, { Owner = Greece, Location = Evac3.Location }) + + Trigger.AfterDelay(EvacuationTime[Difficulty] - DateTime.Seconds(12), function() + Reinforcements.ReinforceWithTransport(Greece, "nhaw.paradrop", nil, { CPos.New(Evac1.Location.X - 10, Evac1.Location.Y + 15), CPos.New(Evac1.Location.X, Evac1.Location.Y - 1) }) + Reinforcements.ReinforceWithTransport(Greece, "nhaw.paradrop", nil, { CPos.New(Evac2.Location.X - 10, Evac2.Location.Y + 15), CPos.New(Evac2.Location.X, Evac2.Location.Y - 1) }) + Reinforcements.ReinforceWithTransport(Greece, "nhaw.paradrop", nil, { CPos.New(Evac3.Location.X - 10, Evac3.Location.Y + 15), CPos.New(Evac3.Location.X, Evac3.Location.Y - 1) }) + end) + + Trigger.AfterDelay(EvacuationTime[Difficulty] - DateTime.Seconds(40), SendDevastators) +end + +SpawnTibTree = function() + local tibTree = TreesToTransform[#TreesToTransform] + if not tibTree.Actor.IsDead then + tibTree.Actor.Destroy() + end + Actor.Create("split2", true, { Owner = Neutral, Location = tibTree.Location}) + table.remove(TreesToTransform, #TreesToTransform) + + if #TreesToTransform > 0 then + Trigger.AfterDelay(1, SpawnTibTree) + end +end + +SpawnWormhole = function() + local loc = WormholeSpawns[#WormholeSpawns] + Actor.Create("wormhole", true, { Owner = Scrin, Location = loc}) + table.remove(WormholeSpawns, #WormholeSpawns) + + if #WormholeSpawns > 0 then + Trigger.AfterDelay(1, SpawnWormhole) + end +end + +DoHaloDrop = function() + if SovietWarFactory.IsDead or IsCrossRipped then + return + end + + local entryPath = Utils.Random(HaloDropEntryPaths) + + local haloDropUnits = { "e1", "e1", "e1", "e2", "e3", "e4" } + if IsHardOrAbove() and DateTime.GameTime > DateTime.Minutes(15) then + haloDropUnits = { "e1", "e1", "e1", "e1", "e2", "e2", "e3", "e3", "e4", "shok" } + end + + DoHelicopterDrop(USSR, entryPath, "halo.paradrop", haloDropUnits, AssaultPlayerBaseOrHunt, function(t) + Trigger.AfterDelay(DateTime.Seconds(5), function() + if not t.IsDead then + t.Move(entryPath[1]) + + end + end) + Trigger.AfterDelay(DateTime.Seconds(12), function() + if not t.IsDead then + t.Destroy() + end + end) + end) + + local delayUntilNext = CalculateInterval(GetTotalCostOfUnits(haloDropUnits), HaloDropAttackValue, HaloDropStart) + Trigger.AfterDelay(delayUntilNext, DoHaloDrop) +end + +DoSovietNavalDrop = function() + if SovietWarFactory.IsDead or IsCrossRipped then + return + end + + local navalDropPath = { CPos.New(NavalDrop.Location.X - 3, NavalDrop.Location.Y - 1), NavalDrop.Location } + local navalDropExitPath = { navalDropPath[2], navalDropPath[1] } + local navalDropUnits = { "3tnk", "v2rl" } + + if IsHardOrAbove() then + navalDropUnits = { "3tnk", "v2rl", "3tnk" } + end + + DoNavalTransportDrop(USSR, navalDropPath, navalDropExitPath, "lst", navalDropUnits, AssaultPlayerBaseOrHunt) + + local delayUntilNext = CalculateInterval(GetTotalCostOfUnits(navalDropUnits), NavalDropAttackValue, NavalDropStart) + Trigger.AfterDelay(delayUntilNext, DoSovietNavalDrop) +end + +SendDevastators = function() + local deva1 = Reinforcements.Reinforce(Scrin, { "deva" }, { DevastatorSpawn1.Location, DevastatorDestination1.Location }) + local deva2 = Reinforcements.Reinforce(Scrin, { "deva" }, { DevastatorSpawn2.Location, DevastatorDestination2.Location }) + local deva3 = Reinforcements.Reinforce(Scrin, { "deva" }, { DevastatorSpawn3.Location, DevastatorDestination3.Location }) + local units = { deva1[1], deva2[1], deva3[1] } + + Utils.Do(units, function(unit) + Trigger.AfterDelay(5, function() + AssaultPlayerBaseOrHunt(unit) + end) + end) +end + +GetInvasionInterval = function() + local armyValue = GetMissionPlayersArmyValue() + local baseInterval = DateTime.Seconds(23) + local secondsToSubtract = math.floor(armyValue / 5000) + local minimumInterval = DateTime.Seconds(10) + + if Difficulty == "easy" then + minimumInterval = DateTime.Seconds(21) + elseif Difficulty == "normal" then + minimumInterval = DateTime.Seconds(18) + elseif Difficulty == "hard" then + minimumInterval = DateTime.Seconds(15) + end + + return math.max(baseInterval - DateTime.Seconds(secondsToSubtract), minimumInterval) +end diff --git a/mods/ca/missions/main-campaign/ca01-crossrip/map.bin b/mods/ca/missions/main-campaign/ca01-crossrip/map.bin new file mode 100644 index 0000000000..33a9076daf Binary files /dev/null and b/mods/ca/missions/main-campaign/ca01-crossrip/map.bin differ diff --git a/mods/ca/missions/main-campaign/ca01-crossrip/map.png b/mods/ca/missions/main-campaign/ca01-crossrip/map.png new file mode 100644 index 0000000000..fbb7e8bfe5 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca01-crossrip/map.png differ diff --git a/mods/ca/missions/main-campaign/ca01-crossrip/map.yaml b/mods/ca/missions/main-campaign/ca01-crossrip/map.yaml new file mode 100644 index 0000000000..c9d4933e0d --- /dev/null +++ b/mods/ca/missions/main-campaign/ca01-crossrip/map.yaml @@ -0,0 +1,1639 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 01: Crossrip + +Author: Darkademic + +Tileset: TEMPERAT + +MapSize: 66,66 + +Bounds: 1,1,64,64 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: england + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: england + Enemies: USSR, Greece, Scrin + PlayerReference@USSR: + Name: USSR + Bot: campaign + Faction: soviet + Color: FE1100 + Enemies: Greece, Scrin, Creeps + PlayerReference@Greece: + Name: Greece + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: allies + LockColor: True + Color: 99ACF2 + LockSpawn: True + LockTeam: True + Enemies: USSR, Scrin, Creeps + PlayerReference@Scrin: + Name: Scrin + Bot: campaign + Faction: scrin + Color: 7700FF + Enemies: USSR, Greece, Creeps + +Actors: + SovietConyard: fact + Owner: USSR + Location: 53,19 + Actor19: brik + Owner: USSR + Location: 56,22 + Actor20: brik + Owner: USSR + Location: 52,23 + Actor21: brik + Owner: USSR + Location: 53,23 + Actor22: brik + Owner: USSR + Location: 54,23 + Actor23: brik + Owner: USSR + Location: 55,23 + Actor24: brik + Owner: USSR + Location: 56,23 + Actor25: brik + Owner: USSR + Location: 56,24 + Actor26: brik + Owner: USSR + Location: 56,25 + Actor27: brik + Owner: USSR + Location: 57,25 + SovietChronosphere: pdox + Owner: USSR + Location: 60,25 + Actor29: brik + Owner: USSR + Location: 57,26 + Actor30: brik + Owner: USSR + Location: 57,27 + Actor32: brik + Owner: USSR + Location: 57,28 + Actor34: brik + Owner: USSR + Location: 57,29 + Actor35: brik + Owner: USSR + Location: 58,29 + Actor36: brik + Owner: USSR + Location: 59,29 + Actor39: brik + Owner: USSR + Location: 62,29 + Actor40: brik + Owner: USSR + Location: 63,29 + Actor41: brik + Owner: USSR + Location: 64,29 + Actor43: brik + Owner: USSR + Location: 64,28 + Actor45: brik + Owner: USSR + Location: 64,26 + Actor46: brik + Owner: USSR + Location: 64,25 + Actor47: brik + Owner: USSR + Location: 64,24 + Actor48: brik + Owner: USSR + Location: 64,23 + Actor49: brik + Owner: USSR + Location: 64,22 + Actor50: brik + Owner: USSR + Location: 51,23 + Actor51: brik + Owner: USSR + Location: 57,22 + Actor52: brik + Owner: USSR + Location: 58,22 + Actor53: brik + Owner: USSR + Location: 59,22 + Actor54: brik + Owner: USSR + Location: 57,24 + Actor55: brik + Owner: USSR + Location: 57,23 + Actor56: brik + Owner: USSR + Location: 63,22 + Actor57: brik + Owner: USSR + Location: 62,22 + Actor58: brik + Owner: USSR + Location: 59,21 + Actor59: brik + Owner: USSR + Location: 58,21 + Actor60: brik + Owner: USSR + Location: 62,21 + Actor61: brik + Owner: USSR + Location: 63,21 + Actor62: chain + Owner: USSR + Location: 59,23 + Actor63: chain + Owner: USSR + Location: 58,23 + Actor64: chain + Owner: USSR + Location: 58,24 + Actor65: chain + Owner: USSR + Location: 58,25 + Actor66: chain + Owner: USSR + Location: 58,26 + Actor67: chain + Owner: USSR + Location: 58,28 + Actor68: chain + Owner: USSR + Location: 58,27 + Actor69: chain + Owner: USSR + Location: 59,28 + Actor70: chain + Owner: USSR + Location: 60,28 + Actor71: chain + Owner: USSR + Location: 62,28 + Actor72: chain + Owner: USSR + Location: 61,28 + Actor73: chain + Owner: USSR + Location: 63,28 + Actor75: chain + Owner: USSR + Location: 63,26 + Actor76: chain + Owner: USSR + Location: 63,25 + Actor77: chain + Owner: USSR + Location: 63,24 + Actor78: chain + Owner: USSR + Location: 63,23 + Actor79: chain + Owner: USSR + Location: 62,23 + Actor80: brik + Owner: USSR + Location: 50,23 + Actor81: brik + Owner: USSR + Location: 50,24 + Actor82: brik + Owner: USSR + Location: 49,24 + Actor83: brik + Owner: USSR + Location: 47,24 + Actor84: brik + Owner: USSR + Location: 44,24 + Actor85: brik + Owner: USSR + Location: 46,24 + Actor86: brik + Owner: USSR + Location: 45,24 + Actor87: brik + Owner: USSR + Location: 48,24 + Actor88: brik + Owner: USSR + Location: 44,23 + Actor89: brik + Owner: USSR + Location: 45,23 + Actor90: brik + Owner: USSR + Location: 44,22 + Actor91: brik + Owner: USSR + Location: 44,21 + Actor92: brik + Owner: USSR + Location: 44,20 + Actor93: brik + Owner: USSR + Location: 45,21 + Actor94: brik + Owner: USSR + Location: 45,20 + SovietRefinery: proc + Owner: USSR + Location: 48,16 + Actor100: silo + Owner: USSR + Location: 48,16 + Actor101: silo + Owner: USSR + Location: 50,16 + Actor114: brik + Owner: USSR + Location: 44,4 + Actor115: brik + Owner: USSR + Location: 44,3 + Actor139: brik + Owner: USSR + Location: 64,3 + Actor140: brik + Owner: USSR + Location: 64,4 + Actor141: brik + Owner: USSR + Location: 64,5 + Actor142: brik + Owner: USSR + Location: 64,6 + Actor143: brik + Owner: USSR + Location: 64,7 + Actor144: brik + Owner: USSR + Location: 64,8 + Actor145: brik + Owner: USSR + Location: 64,9 + Actor146: brik + Owner: USSR + Location: 64,10 + Actor147: brik + Owner: USSR + Location: 64,11 + Actor148: brik + Owner: USSR + Location: 64,12 + Actor149: brik + Owner: USSR + Location: 64,13 + Actor150: brik + Owner: USSR + Location: 64,14 + Actor151: brik + Owner: USSR + Location: 64,15 + Actor152: brik + Owner: USSR + Location: 64,16 + Actor153: brik + Owner: USSR + Location: 64,18 + Actor154: brik + Owner: USSR + Location: 64,17 + Actor155: brik + Owner: USSR + Location: 64,19 + Actor156: brik + Owner: USSR + Location: 63,19 + Actor157: brik + Owner: USSR + Location: 63,18 + SovietBarracks: barr + Owner: USSR + Location: 48,7 + SovietWarFactory: weap + Owner: USSR + Location: 52,9 + SovietServiceDepot: fix + Owner: USSR + Location: 54,13 + TeslaCoil3: tsla + Owner: USSR + Location: 45,22 + ScriptTags: HardAndAbove + Actor169: ftur + Owner: USSR + Location: 60,19 + Actor171: tc05 + Owner: Neutral + Location: 51,26 + Actor175: sam + Owner: USSR + Location: 48,23 + Actor176: brik + Owner: USSR + Location: 59,30 + Actor177: brik + Owner: USSR + Location: 60,30 + Actor178: brik + Owner: USSR + Location: 61,30 + Actor179: brik + Owner: USSR + Location: 62,30 + Actor180: brik + Owner: USSR + Location: 63,30 + Actor181: brik + Owner: USSR + Location: 58,30 + Actor182: sam + Owner: USSR + Location: 60,29 + SovietTechCenter: stek + Owner: USSR + Location: 57,7 + NonEasyMammoth1: 4tnk + Owner: USSR + Location: 39,12 + Facing: 128 + ScriptTags: NormalAndAbove + Actor185: 4tnk + Owner: USSR + Location: 40,10 + Facing: 128 + Actor186: e1 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 39,10 + Actor187: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 38,12 + Actor188: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 40,11 + Actor189: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 42,6 + Actor190: e1 + Owner: USSR + Facing: 384 + Location: 42,6 + SubCell: 1 + Actor191: e1 + Owner: USSR + SubCell: 3 + Location: 60,22 + Facing: 0 + Actor192: e1 + Owner: USSR + SubCell: 3 + Location: 61,22 + Facing: 0 + Actor193: e3 + Owner: USSR + SubCell: 3 + Location: 41,11 + Facing: 384 + Actor194: tc01 + Owner: Neutral + Location: 46,26 + Actor195: tc02 + Owner: Neutral + Location: 57,32 + Actor196: t14 + Owner: Neutral + Location: 44,28 + Actor197: t16 + Owner: Neutral + Location: 46,28 + Actor198: t02 + Owner: Neutral + Location: 47,28 + Actor199: tc04 + Owner: Neutral + Location: 49,27 + Actor200: tc03 + Owner: Neutral + Location: 47,27 + Actor201: t10 + Owner: Neutral + Location: 55,32 + Actor202: t16 + Owner: Neutral + Location: 54,30 + Actor203: t14 + Owner: Neutral + Location: 53,28 + Actor204: t17 + Owner: Neutral + Location: 64,31 + Actor205: mine + Owner: Neutral + Location: 40,22 + Actor206: mine + Owner: Neutral + Location: 38,19 + Actor207: v05 + Owner: Neutral + Location: 47,50 + Actor208: t05 + Owner: Neutral + Location: 47,53 + Actor209: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 49,57 + Actor210: e1 + Owner: Greece + SubCell: 1 + Facing: 0 + Location: 49,57 + Actor211: e1 + Owner: Greece + SubCell: 2 + Facing: 0 + Location: 49,57 + Actor212: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 51,57 + Actor213: e1 + Owner: Greece + SubCell: 1 + Facing: 0 + Location: 51,57 + Actor214: e1 + Owner: Greece + SubCell: 2 + Facing: 0 + Location: 51,57 + Actor215: 2tnk + Owner: Greece + Facing: 1023 + Location: 48,58 + Actor216: 2tnk + Owner: Greece + Facing: 0 + Location: 52,58 + Actor217: v07 + Owner: Neutral + Location: 57,58 + Actor218: e3 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 49,59 + Actor219: medi + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 50,59 + Actor220: e3 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 51,59 + Actor221: v12 + Owner: Neutral + Location: 58,59 + PlayerMcv: mcv + Owner: Greece + Facing: 0 + Location: 50,61 + Actor223: tc04 + Owner: Neutral + Location: 61,62 + Actor224: tc02 + Owner: Neutral + Location: 58,64 + Actor226: tc05 + Owner: Neutral + Location: 39,50 + Actor225: asianhut + Owner: Neutral + Location: 44,55 + Actor227: v02 + Owner: Neutral + Location: 45,60 + Actor229: tc05 + Owner: Neutral + Location: 39,28 + Actor230: tc03 + Owner: Neutral + Location: 37,28 + Actor231: mine + Owner: Neutral + Location: 30,58 + Actor233: mine + Owner: Neutral + Location: 31,61 + Actor232: mine + Owner: Neutral + Location: 32,54 + Actor234: tc04 + Owner: Neutral + Location: 44,39 + Actor235: t16 + Owner: Neutral + Location: 50,41 + Actor236: t07 + Owner: Neutral + Location: 48,36 + Actor237: t01 + Owner: Neutral + Location: 54,39 + Actor238: tc02 + Owner: Neutral + Location: 55,41 + Actor239: t05 + Owner: Neutral + Location: 55,37 + Actor240: t02 + Owner: Neutral + Location: 62,37 + TreeToTransform4: t10 + Owner: Neutral + Location: 59,39 + Actor242: t14 + Owner: Neutral + Location: 58,43 + Actor251: dog + Owner: USSR + SubCell: 3 + Location: 58,47 + Facing: 384 + Actor252: e1 + Owner: USSR + Facing: 384 + Location: 58,46 + SubCell: 3 + Actor253: e1 + Owner: USSR + Facing: 384 + Location: 58,47 + SubCell: 1 + Actor254: e1 + Owner: USSR + SubCell: 3 + Location: 54,47 + Facing: 640 + Actor255: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 49,41 + Actor256: e1 + Owner: USSR + Facing: 384 + Location: 58,44 + SubCell: 1 + Actor257: e1 + Owner: USSR + SubCell: 3 + Location: 45,42 + Facing: 768 + Actor259: e1 + Owner: USSR + Location: 43,44 + SubCell: 1 + Facing: 640 + Actor258: e3 + Owner: USSR + Location: 58,46 + SubCell: 1 + Facing: 384 + HeavyTank1: 3tnk + Owner: USSR + Location: 44,43 + Facing: 768 + ScriptTags: HardAndAbove + NonEasyHeavyTank1: 3tnk + Owner: USSR + Location: 15,35 + Facing: 640 + ScriptTags: NormalAndAbove + Actor261: kenn + Owner: USSR + Location: 49,12 + Actor262: e1 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 14,36 + Actor263: e1 + Owner: USSR + SubCell: 3 + Location: 16,35 + Facing: 384 + Actor264: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 15,33 + Actor265: e3 + Owner: USSR + Facing: 384 + Location: 14,34 + SubCell: 3 + Actor266: e2 + Owner: USSR + Facing: 384 + Location: 50,41 + SubCell: 3 + Actor271: brik + Owner: USSR + Location: 6,23 + Actor272: brik + Owner: USSR + Location: 7,23 + Actor273: brik + Owner: USSR + Location: 6,24 + Actor274: brik + Owner: USSR + Location: 7,24 + Actor275: brik + Owner: USSR + Location: 5,24 + Actor276: brik + Owner: USSR + Location: 3,24 + Actor277: brik + Owner: USSR + Location: 1,24 + Actor278: brik + Owner: USSR + Location: 2,24 + Actor279: brik + Owner: USSR + Location: 4,24 + Actor280: brik + Owner: USSR + Location: 1,23 + Actor281: brik + Owner: USSR + Location: 1,22 + Actor282: brik + Owner: USSR + Location: 1,21 + Actor283: brik + Owner: USSR + Location: 1,20 + Actor284: brik + Owner: USSR + Location: 1,19 + Actor285: brik + Owner: USSR + Location: 1,18 + Actor286: brik + Owner: USSR + Location: 1,17 + Actor287: brik + Owner: USSR + Location: 1,16 + SovietWestRefinery: proc + Owner: USSR + Location: 2,19 + SovietWestFlameTower1: ftur + Owner: USSR + Location: 8,21 + SovietWestFlameTower2: ftur + Owner: USSR + Location: 9,19 + ScriptTags: NormalAndAbove + Actor299: silo + Owner: USSR + Location: 2,19 + Actor300: silo + Owner: USSR + Location: 4,19 + Actor289: brik + Owner: USSR + Location: 1,15 + Actor290: brik + Owner: USSR + Location: 1,14 + Actor291: brik + Owner: USSR + Location: 2,14 + Actor301: brik + Owner: USSR + Location: 3,14 + Actor307: mine + Owner: Neutral + Location: 4,28 + TreeToTransform3: t15 + Owner: Neutral + Location: 25,37 + Actor309: t13 + Owner: Neutral + Location: 38,34 + Actor311: tc01 + Owner: Neutral + Location: 9,48 + Actor310: t11 + Owner: Neutral + Location: 7,58 + Actor312: v02 + Owner: Neutral + Location: 3,45 + Actor313: v06 + Owner: Neutral + Location: 1,52 + Actor314: v16 + Owner: Neutral + Location: 2,54 + Actor315: v16 + Owner: Neutral + Location: 3,54 + Actor316: v17 + Owner: Neutral + Location: 1,54 + Actor317: wood + Owner: Neutral + Location: 1,55 + Actor318: wood + Owner: Neutral + Location: 2,55 + Actor319: wood + Owner: Neutral + Location: 3,55 + Actor320: wood + Owner: Neutral + Location: 3,52 + Actor321: wood + Owner: Neutral + Location: 3,51 + Actor322: wood + Owner: Neutral + Location: 2,51 + Actor323: wood + Owner: Neutral + Location: 1,51 + Actor324: wood + Owner: Neutral + Location: 7,51 + Actor325: wood + Owner: Neutral + Location: 7,52 + Actor326: wood + Owner: Neutral + Location: 8,51 + Actor327: wood + Owner: Neutral + Location: 9,51 + Actor328: wood + Owner: Neutral + Location: 9,52 + Actor329: v12 + Owner: Neutral + Location: 8,52 + Church: v01 + Owner: Neutral + Location: 3,48 + Actor331: v04 + Owner: Neutral + Location: 6,55 + Actor332: v05 + Owner: Neutral + Location: 10,60 + Actor333: v09 + Owner: Neutral + Location: 1,58 + Actor334: v07 + Owner: Neutral + Location: 8,46 + Actor335: v10 + Owner: Neutral + Location: 4,61 + Actor336: t03 + Owner: Neutral + Location: 1,49 + Actor337: t12 + Owner: Neutral + Location: 4,43 + Actor338: mine + Owner: Neutral + Location: 13,52 + Actor339: windmill + Owner: Neutral + Location: 8,42 + NonEasyHeavyTank2: 3tnk + Owner: USSR + Location: 10,21 + Facing: 640 + ScriptTags: NormalAndAbove + NonEasyV2: v2rl + Owner: USSR + Location: 6,20 + Facing: 640 + ScriptTags: NormalAndAbove + Actor342: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 12,28 + Actor343: e1 + Owner: USSR + Facing: 384 + Location: 12,28 + SubCell: 1 + Actor345: e1 + Owner: USSR + Facing: 384 + Location: 14,28 + SubCell: 1 + Actor346: e1 + Owner: USSR + Facing: 384 + Location: 14,28 + SubCell: 2 + Actor344: e3 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 16,27 + Actor347: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 11,28 + Actor348: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 9,22 + Actor349: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 10,18 + Actor350: e1 + Owner: USSR + SubCell: 3 + Location: 10,19 + Facing: 384 + Actor351: e1 + Owner: USSR + Facing: 384 + Location: 10,19 + SubCell: 1 + Actor352: 3tnk + Owner: USSR + Location: 29,23 + Facing: 384 + NonEasyHeavyTank3: 3tnk + Owner: USSR + Location: 31,24 + Facing: 384 + ScriptTags: NormalAndAbove + Actor355: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 28,24 + Actor357: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 31,26 + Actor356: e1 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 29,25 + Actor358: e1 + Owner: USSR + Facing: 384 + Location: 29,25 + SubCell: 1 + Actor359: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 30,24 + Actor360: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 32,25 + WestPatrolUnit1: e1 + Owner: USSR + SubCell: 3 + Location: 6,44 + Facing: 384 + WestPatrolUnit4: e1 + Owner: USSR + Location: 6,44 + SubCell: 1 + Facing: 384 + WestPatrolUnit3: dog + Owner: USSR + SubCell: 3 + Location: 7,43 + Facing: 384 + WestPatrolUnit2: e2 + Owner: USSR + SubCell: 3 + Location: 8,43 + Facing: 384 + Actor365: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 34,46 + Actor366: e1 + Owner: USSR + Facing: 384 + Location: 33,45 + SubCell: 3 + Actor367: e1 + Owner: USSR + Facing: 384 + Location: 33,45 + SubCell: 1 + Flamer2: e4 + Owner: USSR + SubCell: 3 + Location: 33,43 + Facing: 384 + Actor369: e3 + Owner: USSR + Facing: 384 + Location: 32,45 + SubCell: 3 + Actor370: tc01 + Owner: Neutral + Location: 34,43 + Actor371: t17 + Owner: Neutral + Location: 17,61 + Actor373: t06 + Owner: Neutral + Location: 31,17 + Actor376: tc03 + Owner: Neutral + Location: 36,0 + Actor377: tc02 + Owner: Neutral + Location: 34,1 + TreeToTransform1: t10 + Owner: Neutral + Location: 32,11 + Actor379: tc04 + Owner: Neutral + Location: 16,0 + Actor381: t02 + Owner: Neutral + Location: 17,2 + Actor382: t05 + Owner: Neutral + Location: 14,0 + Actor383: t08 + Owner: Neutral + Location: 13,0 + Actor385: tc04 + Owner: Neutral + Location: 2,11 + Actor387: tc02 + Owner: Neutral + Location: 12,1 + Actor389: t11 + Owner: Neutral + Location: 19,0 + Actor388: t14 + Owner: Neutral + Location: 15,2 + Actor390: t17 + Owner: Neutral + Location: 11,4 + TreeToTransform2: t07 + Owner: Neutral + Location: 18,22 + Actor395: tc02 + Owner: Neutral + Location: 11,14 + Actor396: t01 + Owner: Neutral + Location: 10,13 + Actor397: t05 + Owner: Neutral + Location: 14,8 + Actor398: t07 + Owner: Neutral + Location: 22,4 + Actor399: t02 + Owner: Neutral + Location: 25,2 + Actor386: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 14,21 + Actor400: e1 + Owner: USSR + Facing: 384 + Location: 18,16 + SubCell: 3 + Actor401: e1 + Owner: USSR + Facing: 384 + Location: 16,14 + SubCell: 3 + Actor402: e1 + Owner: USSR + SubCell: 3 + Location: 15,9 + Facing: 384 + Actor403: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 18,7 + Actor404: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 17,4 + Actor405: e1 + Owner: USSR + Facing: 384 + Location: 21,5 + SubCell: 3 + Actor406: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 24,3 + Actor407: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 12,5 + Actor408: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 29,20 + Actor409: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 32,18 + Actor410: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 26,15 + Actor411: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 22,25 + Actor412: e1 + Owner: USSR + Facing: 384 + Location: 22,25 + SubCell: 1 + Actor413: e4 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 31,21 + Actor414: dog + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 18,4 + Actor415: e4 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 7,22 + Actor416: e4 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 25,4 + Actor417: lhus + Owner: Neutral + Location: 3,6 + Actor418: btr + Owner: USSR + Location: 42,42 + TurretFacing: 0 + Facing: 768 + Actor419: btr + Owner: USSR + Facing: 384 + Location: 17,15 + Actor420: shok + Owner: USSR + SubCell: 3 + Location: 60,23 + Facing: 0 + Actor421: shok + Owner: USSR + Location: 61,23 + SubCell: 3 + Facing: 0 + Actor422: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 53,16 + Actor423: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 51,6 + Actor424: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 59,12 + Actor426: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 46,20 + Actor427: e1 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 52,6 + Actor430: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 56,9 + Actor431: e1 + Owner: USSR + Facing: 384 + Location: 53,16 + SubCell: 1 + Actor433: e1 + Owner: USSR + Facing: 384 + Location: 40,3 + SubCell: 3 + Actor434: e1 + Owner: USSR + Facing: 384 + Location: 40,3 + SubCell: 1 + Actor432: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 41,4 + Actor435: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 22,6 + NonEasyHeavyTank4: 3tnk + Owner: USSR + Location: 20,4 + Facing: 384 + ScriptTags: NormalAndAbove + Actor437: apwr + Owner: USSR + Location: 61,3 + SovietRadar: dome + Owner: USSR + Location: 48,3 + SovietAirfield: afld + Owner: USSR + Location: 53,3 + Actor443: brik + Owner: USSR + Location: 44,2 + Actor444: brik + Owner: USSR + Location: 45,2 + Actor445: brik + Owner: USSR + Location: 46,2 + Actor446: brik + Owner: USSR + Location: 47,2 + Actor447: brik + Owner: USSR + Location: 48,2 + Actor448: brik + Owner: USSR + Location: 49,2 + Actor449: brik + Owner: USSR + Location: 50,2 + Actor450: brik + Owner: USSR + Location: 51,2 + Actor451: brik + Owner: USSR + Location: 52,2 + Actor452: brik + Owner: USSR + Location: 53,2 + Actor453: brik + Owner: USSR + Location: 54,2 + Actor454: brik + Owner: USSR + Location: 55,2 + Actor455: brik + Owner: USSR + Location: 56,2 + Actor456: brik + Owner: USSR + Location: 57,2 + Actor457: brik + Owner: USSR + Location: 58,2 + Actor458: brik + Owner: USSR + Location: 59,2 + Actor459: brik + Owner: USSR + Location: 60,2 + Actor460: brik + Owner: USSR + Location: 61,2 + Actor461: brik + Owner: USSR + Location: 62,2 + Actor462: brik + Owner: USSR + Location: 63,2 + Actor463: brik + Owner: USSR + Location: 64,2 + Actor464: sam + Owner: USSR + Location: 43,31 + Actor465: sam + Owner: USSR + Location: 54,32 + Actor466: sam + Owner: USSR + Location: 36,26 + Actor467: t12 + Owner: Neutral + Location: 36,24 + Actor468: t07 + Owner: Neutral + Location: 37,26 + Actor469: t08 + Owner: Neutral + Location: 36,27 + Actor470: sam + Owner: USSR + Location: 63,33 + Actor471: t01 + Owner: Neutral + Location: 65,33 + WestPatrolWaypoint2: waypoint + Location: 5,60 + Owner: Neutral + WestPatrolWaypoint1: waypoint + Location: 6,43 + Owner: Neutral + AttackWaypoint1: waypoint + Location: 37,7 + Owner: Neutral + AttackWaypoint2: waypoint + Location: 14,6 + Owner: Neutral + AttackWaypoint3: waypoint + Location: 14,19 + Owner: Neutral + AttackWaypoint5: waypoint + Location: 24,46 + Owner: Neutral + Actor438: apwr + Owner: USSR + Location: 61,6 + Actor439: apwr + Owner: USSR + Location: 61,9 + Actor440: apwr + Owner: USSR + Location: 61,12 + Actor441: apwr + Owner: USSR + Location: 61,15 + Actor425: fenc + Owner: USSR + Location: 17,34 + Actor428: fenc + Owner: USSR + Location: 16,34 + Actor429: fenc + Owner: USSR + Location: 13,35 + Actor442: fenc + Owner: USSR + Location: 12,35 + Actor473: fenc + Owner: USSR + Location: 15,28 + Actor474: fenc + Owner: USSR + Location: 16,28 + Actor475: fenc + Owner: USSR + Location: 10,29 + Actor476: fenc + Owner: USSR + Location: 11,29 + Actor472: apwr + Owner: USSR + Location: 58,3 + Actor477: brik + Owner: USSR + Location: 4,14 + Actor478: brik + Owner: USSR + Location: 5,14 + Actor479: brik + Owner: USSR + Location: 6,14 + Actor480: brik + Owner: USSR + Location: 7,14 + Actor481: brik + Owner: USSR + Location: 8,14 + SovietWestBarracks: barr + Owner: USSR + Location: 4,15 + Actor483: brik + Owner: USSR + Location: 8,15 + Actor484: brik + Owner: USSR + Location: 7,16 + Actor485: brik + Owner: USSR + Location: 8,16 + Actor486: brik + Owner: USSR + Location: 7,17 + Actor487: brik + Owner: USSR + Location: 8,17 + Actor488: powr + Owner: USSR + Location: 2,15 + WormholeSpawn1: waypoint + Location: 59,26 + Owner: Neutral + WormholeSpawn2: waypoint + Location: 62,24 + Owner: Neutral + WormholeSpawn3: waypoint + Location: 52,13 + Owner: Neutral + Actor482: c3 + Owner: Neutral + Facing: 384 + Location: 7,54 + SubCell: 3 + Actor489: c6 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 2,57 + Actor491: c9 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 6,58 + HardOnlyKatyusha: katy + Owner: USSR + Location: 31,31 + Facing: 640 + ScriptTags: HardAndAbove + NonEasyKatyusha: katy + Owner: USSR + Location: 21,32 + Facing: 384 + ScriptTags: NormalAndAbove + Evac1: waypoint + Owner: Neutral + Location: 46,58 + Evac2: waypoint + Owner: Neutral + Location: 54,56 + Evac3: waypoint + Owner: Neutral + Location: 52,62 + HaloLanding2: waypoint + Location: 40,38 + Owner: Neutral + Actor497: ttra + Owner: USSR + Location: 57,17 + Facing: 128 + Actor498: ttra + Owner: USSR + Location: 32,6 + Facing: 384 + HaloLanding3: waypoint + Owner: Neutral + Location: 5,53 + WormholeSpawn5: waypoint + Owner: Neutral + Location: 5,8 + WormholeSpawn4: waypoint + Owner: Neutral + Location: 28,10 + NavalDrop: waypoint + Owner: Neutral + Location: 4,39 + HaloLanding1: waypoint + Owner: Neutral + Location: 58,38 + AttackWaypoint4: waypoint + Owner: Neutral + Location: 11,39 + DevastatorSpawn1: waypoint + Owner: Neutral + Location: 1,28 + DevastatorDestination1: waypoint + Owner: Neutral + Location: 5,30 + DevastatorSpawn2: waypoint + Owner: Neutral + Location: 30,1 + DevastatorDestination2: waypoint + Owner: Neutral + Location: 30,4 + DevastatorSpawn3: waypoint + Owner: Neutral + Location: 64,27 + DevastatorDestination3: waypoint + Owner: Neutral + Location: 56,36 + Actor490: camera + Owner: USSR + Location: 18,40 + Actor492: camera + Owner: Scrin + Location: 19,41 + Ranger1: jeep + Owner: Greece + Location: 50,58 + Facing: 1023 + ScriptTags: NormalAndBelow + DeploySuggestion: waypoint + Owner: Neutral + Location: 24,51 + EntranceReveal1: waypoint + Owner: Neutral + Location: 10,22 + Actor499: tc01 + Owner: Neutral + Location: 23,14 + EntranceReveal2: waypoint + Owner: Neutral + Location: 41,12 + Actor500: brik + Owner: USSR + Location: 44,5 + Actor501: brik + Owner: USSR + Location: 44,6 + TeslaCoil1: tsla + Owner: USSR + Location: 45,6 + ScriptTags: NormalAndAbove + Actor503: brik + Owner: USSR + Location: 44,7 + Actor504: brik + Owner: USSR + Location: 45,7 + Actor505: ftur + Owner: USSR + Location: 43,8 + Actor506: brik + Owner: USSR + Location: 44,8 + Actor507: brik + Owner: USSR + Location: 45,8 + Actor508: brik + Owner: USSR + Location: 44,12 + Actor509: brik + Owner: USSR + Location: 45,12 + Actor510: brik + Owner: USSR + Location: 44,13 + Actor511: brik + Owner: USSR + Location: 45,13 + Actor512: brik + Owner: USSR + Location: 44,14 + TeslaCoil2: tsla + Owner: USSR + Location: 45,14 + ScriptTags: NormalAndAbove + Actor514: brik + Owner: USSR + Location: 44,15 + Actor515: brik + Owner: USSR + Location: 45,15 + Actor516: brik + Owner: USSR + Location: 44,16 + Actor517: brik + Owner: USSR + Location: 45,16 + Actor518: ftur + Owner: USSR + Location: 43,14 + Actor493: ftur + Owner: USSR + Location: 43,20 + HardOnlyV2: v2rl + Owner: USSR + Location: 46,15 + Facing: 128 + ScriptTags: HardAndAbove + Actor513: v2rl + Owner: USSR + Location: 45,4 + Facing: 384 + Actor74: chain + Owner: USSR + Location: 63,27 + Actor494: brik + Owner: USSR + Location: 64,27 + HaloSpawn2: waypoint + Owner: Neutral + Location: 53,1 + HaloSpawn1: waypoint + Owner: Neutral + Location: 64,20 + HaloSpawn3: waypoint + Owner: Neutral + Location: 1,26 + Flamer1: e4 + Owner: USSR + Facing: 384 + Location: 56,46 + SubCell: 3 + ScriptTags: HardAndAbove + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-coalitions.yaml, crossrip-rules.yaml + +Sequences: crossrip-sequences.yaml + +Weapons: ca|weapons/custom/campaign.yaml, crossrip-weapons.yaml diff --git a/mods/ca/missions/main-campaign/ca01-crossrip/r_chronodisc.aud b/mods/ca/missions/main-campaign/ca01-crossrip/r_chronodisc.aud new file mode 100644 index 0000000000..8972d00f43 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca01-crossrip/r_chronodisc.aud differ diff --git a/mods/ca/missions/main-campaign/ca01-crossrip/r_evac.aud b/mods/ca/missions/main-campaign/ca01-crossrip/r_evac.aud new file mode 100644 index 0000000000..08aa3617c2 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca01-crossrip/r_evac.aud differ diff --git a/mods/ca/missions/main-campaign/ca02-displacement/displacement-rules.yaml b/mods/ca/missions/main-campaign/ca02-displacement/displacement-rules.yaml new file mode 100644 index 0000000000..fcb4e9b2f7 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca02-displacement/displacement-rules.yaml @@ -0,0 +1,93 @@ + +^Palettes: + TintPostProcessEffect: + +World: + LuaScript: + Scripts: campaign.lua, displacement.lua + MissionData: + Briefing: The effects of the ruptured Soviet Chronosphere continue to ripple outward.\n\nAlien invaders continue to pour through their portals, but there are reports of even more unbelievable occurrences. Towns disappearing. The landscape itself being transformed. Sightings of military units of unknown origins and allegiances.\n\nWe must regroup. Your mission is to assist in the evacuation of our forces north of the Neris river. Alien forces have occupied the northern bank, cutting off our retreat.\n\nUse the limited resources we have to push back across the river and clear a path for our retreating convoys, then destroy the Alien base to stem the tide of their advance. + MapOptions: + ShortGameCheckboxEnabled: False + MusicPlaylist: + StartingMusic: rollout + +Player: + PlayerResources: + DefaultCash: 2500 + +# Disable tech + +SPY: + Inherits@CAMPAIGNDISABLED: ^Disabled + +ENFO: + Inherits@CAMPAIGNDISABLED: ^Disabled + +E7: + Inherits@CAMPAIGNDISABLED: ^Disabled + +PMAK: + Inherits@CAMPAIGNDISABLED: ^Disabled + +MCV: + Inherits@CAMPAIGNDISABLED: ^Disabled + +MSHP: + Inherits@CAMPAIGNDISABLED: ^Disabled + +hazmat.upgrade: + Inherits@CAMPAIGNDISABLED: ^Disabled + +flakarmor.upgrade: + Inherits@CAMPAIGNDISABLED: ^Disabled + +cryw.upgrade: + Inherits@CAMPAIGNDISABLED: ^Disabled + +pcan.upgrade: + Inherits@CAMPAIGNDISABLED: ^Disabled + +charv.upgrade: + Inherits@CAMPAIGNDISABLED: ^Disabled + +# Disable GPS for player + +ATEK: + -GrantConditionOnPrerequisite@OwnedByAi: + -DummyGpsPower@NOFOG: + -DummyGpsPower@FOG: + -ProduceActorPowerCA@SatelliteLaunched: + -ProduceActorPowerCA@InitialSatelliteScan: + -ProduceActorPowerCA@SatelliteScan: + -ProduceActorPowerCA@SatelliteScanNoFog: + -GrantExternalConditionPowerCA@FSHIELD: + +# Misc + +DD: + Health: + HP: 80000 + +SCOL: + Power: + Amount: -80 + +STMR: + AutoTarget: + InitialStanceAI: HoldFire + +FIX: + ProximityExternalCondition@AIRCRAFTREPAIR: + Range: 12c0 + WithRangeCircle@AIRCRAFTREPAIR: + Range: 12c0 + +# Hunt() requires only 1 AttackBase +DEVA: + -AttackFrontalCharged: + -Armament@PRIMARYUPG: + -AmbientSound@CHARGE: + -WithIdleOverlay@CHARGE1: + -WithIdleOverlay@CHARGE2: + -WithIdleOverlay@CHARGE3: diff --git a/mods/ca/missions/main-campaign/ca02-displacement/displacement.lua b/mods/ca/missions/main-campaign/ca02-displacement/displacement.lua new file mode 100644 index 0000000000..828f5408a7 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca02-displacement/displacement.lua @@ -0,0 +1,428 @@ +MissionDir = "ca|missions/main-campaign/ca02-displacement" + +-- Locations and Paths + +Convoys = { + { + Spawn = { FirstConvoyPath1.Location, FirstConvoyPath2.Location }, + Path = { FirstConvoyPath3.Location, FirstConvoyPath4.Location, FirstConvoyPath5.Location, FirstConvoyPath6.Location, FirstConvoyPath7.Location, FirstConvoyPath8.Location, FirstConvoyPath9.Location, FirstConvoyPath10.Location, FirstConvoyPath11.Location, FirstConvoyPath12.Location, FirstConvoyPath13.Location, FirstConvoyPath14.Location, FirstConvoyPath15.Location, FirstConvoyPath16.Location, FirstConvoyPath17.Location, FirstConvoyPath18.Location }, + FlareWaypoint = FirstConvoyPath2 + }, + { + Spawn = { SecondConvoyPath1.Location, SecondConvoyPath2.Location }, + Path = { SecondConvoyPath3.Location, SecondConvoyPath4.Location, SecondConvoyPath5.Location, SecondConvoyPath6.Location, SecondConvoyPath7.Location, SecondConvoyPath8.Location, SecondConvoyPath9.Location }, + FlareWaypoint = SecondConvoyFlare + }, + { + Spawn = { ThirdConvoyPath1.Location, ThirdConvoyPath2.Location }, + Path = { ThirdConvoyPath3.Location, ThirdConvoyPath4.Location, ThirdConvoyPath5.Location, ThirdConvoyPath6.Location, ThirdConvoyPath7.Location, ThirdConvoyPath8.Location, ThirdConvoyPath9.Location, ThirdConvoyPath10.Location, SecondConvoyPath2.Location, SecondConvoyPath3.Location, SecondConvoyPath4.Location, SecondConvoyPath5.Location, SecondConvoyPath6.Location, SecondConvoyPath7.Location, SecondConvoyPath8.Location, SecondConvoyPath9.Location }, + FlareWaypoint = ThirdConvoyPath2 + }, + { + Spawn = { FourthConvoyPath1.Location, FourthConvoyPath2.Location }, + Path = { FourthConvoyPath3.Location, FourthConvoyPath4.Location, FourthConvoyPath5.Location, FourthConvoyPath6.Location, FourthConvoyPath7.Location, FourthConvoyPath8.Location, FourthConvoyPath9.Location, FourthConvoyPath10.Location, FourthConvoyPath11.Location, FourthConvoyPath12.Location, FourthConvoyPath13.Location, FourthConvoyPath14.Location, FourthConvoyPath15.Location, FourthConvoyPath16.Location, SecondConvoyPath6.Location, SecondConvoyPath7.Location, SecondConvoyPath8.Location, SecondConvoyPath9.Location }, + FlareWaypoint = FourthConvoyPath2 + } +} + +ExitCells = {} + +for x = 13, 53 do + table.insert(ExitCells, CPos.New(x, 64)) +end + +ScrinAttackPaths = { + { ScrinAttackAssembly1.Location, PlayerRefinery.Location }, + { ScrinAttackAssembly2.Location, PlayerRefinery.Location }, + { ScrinAttackAssembly3.Location, PlayerRefinery.Location } +} + +-- Other Variables + +ConvoyUnits = { "truk", "truk", "truk", "truk", "truk" } + +MaxLosses = { + easy = 9, + normal = 4, + hard = 1, + vhard = 0, + brutal = 0 +} + +NavalReinforcementsDelay = { + easy = DateTime.Minutes(2), + normal = DateTime.Minutes(4), +} + +TimeBetweenConvoys = { + easy = { DateTime.Minutes(3), DateTime.Minutes(8), DateTime.Minutes(4), DateTime.Minutes(5) }, + normal = { DateTime.Minutes(2), DateTime.Minutes(7), DateTime.Minutes(3), DateTime.Minutes(4) + DateTime.Seconds(30) }, + hard = { DateTime.Minutes(1), DateTime.Minutes(6), DateTime.Minutes(2), DateTime.Minutes(4) }, + vhard = { DateTime.Minutes(1), DateTime.Minutes(6), DateTime.Minutes(2), DateTime.Minutes(4) }, + brutal = { DateTime.Minutes(1), DateTime.Minutes(6), DateTime.Minutes(2), DateTime.Minutes(4) } +} + +-- Squads + +Squads = { + Main = { + Delay = AdjustDelayForDifficulty(DateTime.Seconds(160)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 28, Max = 36, RampDuration = DateTime.Minutes(13) }), + Compositions = AdjustCompositionsForDifficulty({ + { + Infantry = { "s3", "s1", "s1", "s1", "s1", "s3", "s4" }, + Vehicles = { "intl.ai2", "gunw", "seek", "intl.ai2" }, + MaxTime = DateTime.Minutes(9), + }, + { + Infantry = { "s3", "s1", "s1", "s1", "s1", "s3", "s1", "s1", "s2", "s2", "s4", "s1" }, + Vehicles = { "intl.ai2", "gunw", "seek", "corr", "devo", "seek", "intl.ai2", "tpod", "seek" }, + MinTime = DateTime.Minutes(9), + } + }), + AttackPaths = ScrinAttackPaths, + }, + Stormriders = { + Delay = AdjustAirDelayForDifficulty(DateTime.Seconds(270)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 12, Max = 12 }), + Compositions = AdjustCompositionsForDifficulty({ + { Aircraft = { "stmr", "stmr", "stmr", "stmr" } } + }) + }, + Devastators = { + Delay = AdjustAirDelayForDifficulty(DateTime.Minutes(16)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 15, Max = 15 }), + Compositions = { + normal = { + { Aircraft = { "deva" } } + }, + hard = { + { Aircraft = { "deva", "deva" } } + }, + vhard = { + { Aircraft = { "deva", "deva" } } + }, + brutal = { + { Aircraft = { "deva", "deva", "deva" } } + } + } + } +} + +-- Setup and Tick + +SetupPlayers = function() + Greece = Player.GetPlayer("Greece") + England = Player.GetPlayer("England") + Scrin = Player.GetPlayer("Scrin") + USSR = Player.GetPlayer("USSR") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = { Greece } + MissionEnemies = { Scrin } +end + +WorldLoaded = function() + SetupPlayers() + + TimerTicks = 0 + TrucksLost = 0 + TrucksLostCurrentConvoy = 0 + NextConvoyIdx = 1 + CurrentConvoyArrivalComplete = false + PathsClear = false + + Camera.Position = PlayerBarracks.CenterPosition + + InitObjectives(Greece) + AdjustPlayerStartingCashForDifficulty() + InitScrin() + + ObjectiveClearPath = Greece.AddObjective("Clear a path for inbound convoys.") + + if IsHardOrBelow() then + ObjectiveProtectConvoys = Greece.AddObjective("Do not lose more than " .. MaxLosses[Difficulty] .. " convoy trucks.") + else + ObjectiveProtectConvoys = Greece.AddObjective("Do not lose any convoy trucks.") + end + + if IsNormalOrBelow() then + HardOnlyTripod1.Destroy() + HardOnlyShardLauncher1.Destroy() + HardOnlyShardLauncher2.Destroy() + HardOnlyStormColumn1.Destroy() + HardOnlyStormColumn2.Destroy() + + if Difficulty == "easy" then + NonEasyStormColumn1.Destroy() + NonEasyStormColumn2.Destroy() + NonEasyStormColumn3.Destroy() + NonEasyCorrupter1.Destroy() + end + + Trigger.AfterDelay(NavalReinforcementsDelay[Difficulty], function() + NavalReinforcements() + end) + + Trigger.AfterDelay(DateTime.Minutes(1), function() + Tip("Resources in the vicinity are limited. Explore to find additional sources of income.") + end) + end + + Trigger.AfterDelay(DateTime.Seconds(15), function() + InitConvoy() + end) + + -- When convoy units reach destination, remove them + Trigger.OnEnteredFootprint(ExitCells, function(a, id) + if a.Owner == England then + a.Destroy() + end + end) + + -- Easter egg + Trigger.OnKilled(Church, function(a) + Media.PlaySound(MissionDir .. "/screams.aud") + local congregation1 = Reinforcements.Reinforce(Neutral, { "c1" }, { Church.Location, CPos.New(Church.Location.X - 2, Church.Location.Y - 1) })[1] + local congregation2 = Reinforcements.Reinforce(Neutral, { "c3" }, { Church.Location, CPos.New(Church.Location.X - 2, Church.Location.Y) })[1] + local congregation3 = Reinforcements.Reinforce(Neutral, { "c4" }, { Church.Location, CPos.New(Church.Location.X - 2, Church.Location.Y + 1) })[1] + local congregation4 = Reinforcements.Reinforce(Neutral, { "c8" }, { Church.Location, CPos.New(Church.Location.X - 2, Church.Location.Y + 2) })[1] + Trigger.AfterDelay(DateTime.Seconds(1), function() + Media.FloatingText("WHY??", congregation2.CenterPosition, 30, HSLColor.Red) + end) + congregation1.Scatter() + congregation3.Scatter() + end) + + SetupReveals({ EntranceReveal1, EntranceReveal2, EntranceReveal3 }) + AfterWorldLoaded() +end + +Tick = function() + OncePerSecondChecks() + OncePerFiveSecondChecks() + AfterTick() +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + Scrin.Resources = Scrin.ResourceCapacity - 500 + + if TimerTicks > 0 then + if TimerTicks > 25 then + TimerTicks = TimerTicks - 25 + else + TimerTicks = 0 + end + UpdateConvoyCountdown() + end + + if MissionPlayersHaveNoRequiredUnits() then + if ObjectiveClearPath ~= nil and not Greece.IsObjectiveCompleted(ObjectiveClearPath) then + Greece.MarkFailedObjective(ObjectiveClearPath) + end + if ObjectiveProtectConvoys ~= nil and not Greece.IsObjectiveCompleted(ObjectiveProtectConvoys) then + Greece.MarkFailedObjective(ObjectiveProtectConvoys) + end + if ObjectiveDestroyScrinBase ~= nil and not Greece.IsObjectiveCompleted(ObjectiveDestroyScrinBase) then + Greece.MarkFailedObjective(ObjectiveDestroyScrinBase) + end + end + + if DateTime.GameTime > DateTime.Minutes(15) and not PlayerHasBuildings(Scrin) then + if ObjectiveDestroyScrinBase ~= nil and not Greece.IsObjectiveCompleted(ObjectiveDestroyScrinBase) then + Greece.MarkCompletedObjective(ObjectiveDestroyScrinBase) + end + if not PathsClear and #Scrin.GetActorsByTypes({ "scol", "ptur" }) == 0 then + PathsClear = true + end + end + end +end + +OncePerFiveSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 125 == 0 then + UpdatePlayerBaseLocations() + end +end + +-- Functions + +UpdateConvoyCountdown = function() + if TimerTicks == 0 then + if MaxLosses[Difficulty] == 0 then + UserInterface.SetMissionText("Protect the convoy. All trucks must survive." , HSLColor.Yellow) + else + if TrucksLost == MaxLosses[Difficulty] then + UserInterface.SetMissionText("Protect the convoy. No more trucks can be lost.", HSLColor.Yellow) + else + UserInterface.SetMissionText("Protect the convoy. Acceptable losses: " .. TrucksLost .. " / " .. MaxLosses[Difficulty] , HSLColor.Yellow) + end + end + else + UserInterface.SetMissionText("Next convoy arrives in " .. UtilsCA.FormatTimeForGameSpeed(TimerTicks), HSLColor.Yellow) + end +end + +InitConvoy = function() + local nextConvoy = Convoys[NextConvoyIdx] + + -- Spawn and announce flare + ConvoyFlare = Actor.Create("flare", true, { Owner = Greece, Location = nextConvoy.FlareWaypoint.Location }) + PlaySpeechNotificationToMissionPlayers("SignalFlare") + Beacon.New(Greece, nextConvoy.FlareWaypoint.CenterPosition) + + if not FirstConvoyAnnounced then + FirstConvoyAnnounced = true + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(3)), function() + MediaCA.PlaySound(MissionDir .. "/r_firstconvoy.aud", 1.5) + end) + end + + -- Set the timer + if PathsClear then + TimerTicks = DateTime.Seconds(20) + else + TimerTicks = TimeBetweenConvoys[Difficulty][NextConvoyIdx] + end + + UpdateConvoyCountdown() + + -- Schedule convoy to arrive after timer expires + Trigger.AfterDelay(TimerTicks, function() + ConvoyFlare.Destroy() + UpdateConvoyCountdown() + PlaySpeechNotificationToMissionPlayers("ConvoyApproaching") + Notification("Convoy approaching.") + CurrentConvoyArrivalComplete = false + + local trucks = Reinforcements.Reinforce(England, ConvoyUnits, nextConvoy.Spawn, 50, function(truck) + Utils.Do(nextConvoy.Path, function(waypoint) + truck.Move(waypoint) + end) + Trigger.OnIdle(truck, function(self) + if not self.IsDead then + self.Move(Utils.Random(ExitCells)) + end + end) + end) + + Trigger.AfterDelay(DateTime.Seconds(15), function() + CurrentConvoyArrivalComplete = true + end) + + Utils.Do(trucks, function(truck) + Trigger.OnKilled(truck, function(self, killer) + TrucksLost = TrucksLost + 1 + TrucksLostCurrentConvoy = TrucksLostCurrentConvoy + 1 + PlaySpeechNotificationToMissionPlayers("ConvoyUnitLost") + Media.PlaySoundNotification(nil, "AlertBuzzer") + + if TimerTicks == 0 then + UpdateConvoyCountdown() + end + + if TrucksLost > MaxLosses[Difficulty] then + Greece.MarkFailedObjective(ObjectiveClearPath) + Greece.MarkFailedObjective(ObjectiveProtectConvoys) + elseif TrucksLostCurrentConvoy == 5 then + QueueNextConvoy(DateTime.Seconds(45)) + end + end) + + Trigger.OnRemovedFromWorld(truck, function(a) + if truck.IsDead then + return + end + if CurrentConvoyArrivalComplete then + local numTrucks = #England.GetActorsByType("truk") + if numTrucks == 0 then + QueueNextConvoy(DateTime.Seconds(15)) + end + end + end) + + Trigger.AfterDelay(DateTime.Seconds(180), function() + if not truck.IsDead and truck.IsInWorld then + truck.Destroy() + end + end) + end) + end) +end + +QueueNextConvoy = function(timeUntilNext) + NextConvoyIdx = NextConvoyIdx + 1 + TrucksLostCurrentConvoy = 0 + if NextConvoyIdx <= #Convoys then + UserInterface.SetMissionText("Awaiting next convoy.") + Trigger.AfterDelay(timeUntilNext, function() + InitConvoy() + end) + else + ObjectiveDestroyScrinBase = Greece.AddObjective("Destroy the alien stronghold.") + Greece.MarkCompletedObjective(ObjectiveClearPath) + Greece.MarkCompletedObjective(ObjectiveProtectConvoys) + UserInterface.SetMissionText("Destroy the alien stronghold.", HSLColor.Yellow) + end +end + +InitScrin = function() + if Difficulty == "easy" then + RebuildExcludes.Scrin = { Types = { "scol", "ptur" } } + end + + AutoRepairAndRebuildBuildings(Scrin, 15) + SetupRefAndSilosCaptureCredits(Scrin) + AutoReplaceHarvesters(Scrin) + AutoRebuildConyards(Scrin) + InitAttackSquad(Squads.Main, Scrin) + InitAirAttackSquad(Squads.Stormriders, Scrin) + + if IsNormalOrAbove() then + InitAirAttackSquad(Squads.Devastators, Scrin, MissionPlayers, { "dome", "atek", "apwr", "pris", "fix" }) + end + + StormriderAttacker1.Attack(PlayerRefinery) + StormriderAttacker2.Attack(PlayerRefinery) + + StormriderPatroller1.Patrol({ ScrinAirPatrol1a.Location, ScrinAirPatrol1b.Location, ScrinAirPatrol1c.Location, ScrinAirPatrol1b.Location }) + StormriderPatroller2.Patrol({ ScrinAirPatrol1a.Location, ScrinAirPatrol1b.Location, ScrinAirPatrol1c.Location, ScrinAirPatrol1b.Location }) + + StormriderPatroller3.Patrol({ ScrinAirPatrol2a.Location, ScrinAirPatrol2b.Location }) + StormriderPatroller4.Patrol({ ScrinAirPatrol2a.Location, ScrinAirPatrol2b.Location }) + + SeekerPatroller1.Patrol({ SeekerPatrol1a.Location, SeekerPatrol1b.Location }) + SeekerPatroller2.Patrol({ SeekerPatrol1a.Location, SeekerPatrol1b.Location }) + SeekerPatroller3.Patrol({ SeekerPatrol1a.Location, SeekerPatrol1b.Location }) + + local scrinGroundAttackers = Scrin.GetGroundAttackers() + + Utils.Do(scrinGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsScrinGroundHunterUnit) + end) + + local stormriders = Scrin.GetActorsByType("stmr") + Utils.Do(stormriders, function(a) + Trigger.OnDamaged(a, function(self, attacker, damage) + if not self.IsDead and self.AmmoCount() == 0 then + Trigger.ClearAll(self) + self.Stop() + self.ReturnToBase() + Trigger.AfterDelay(DateTime.Seconds(1), function() + InitAttackAircraft(self, Greece, { "dome", "atek", "apwr", "apwr", "apwr", "ptnk", "cryo", "heli", "harr" }) + end) + end + end) + end) +end + +NavalReinforcements = function() + if not NavalReinforcementsArrived then + NavalReinforcementsArrived = true + PlaySpeechNotificationToMissionPlayers("ReinforcementsArrived") + Beacon.New(Greece, DestroyerSpawn1.CenterPosition) + Reinforcements.Reinforce(Greece, { "dd" }, { DestroyerSpawn1.Location, DestroyerRally1.Location }) + Reinforcements.Reinforce(Greece, { "dd" }, { DestroyerSpawn2.Location, DestroyerRally2.Location }) + end +end diff --git a/mods/ca/missions/main-campaign/ca02-displacement/map.bin b/mods/ca/missions/main-campaign/ca02-displacement/map.bin new file mode 100644 index 0000000000..c1168087c3 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca02-displacement/map.bin differ diff --git a/mods/ca/missions/main-campaign/ca02-displacement/map.png b/mods/ca/missions/main-campaign/ca02-displacement/map.png new file mode 100644 index 0000000000..1c1fe55fda Binary files /dev/null and b/mods/ca/missions/main-campaign/ca02-displacement/map.png differ diff --git a/mods/ca/missions/main-campaign/ca02-displacement/map.yaml b/mods/ca/missions/main-campaign/ca02-displacement/map.yaml new file mode 100644 index 0000000000..2c049a55c1 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca02-displacement/map.yaml @@ -0,0 +1,2979 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 02: Displacement + +Author: Darkademic + +Tileset: WINTER + +MapSize: 130,66 + +Bounds: 1,1,128,64 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: USSR, Greece, England, Scrin + PlayerReference@Greece: + Name: Greece + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: allies + LockColor: True + Color: 99ACF2 + LockSpawn: True + LockTeam: True + Enemies: Scrin, Creeps + PlayerReference@Scrin: + Name: Scrin + Bot: campaign + Faction: scrin + Color: 7700FF + Enemies: Greece, England, USSR, Creeps + PlayerReference@England: + Name: England + Bot: campaign + Faction: allies + Color: A1EF8C + Allies: Greece + Enemies: Scrin, Creeps + PlayerReference@USSR: + Name: USSR + Bot: campaign + Faction: soviet + Color: FE1100 + Enemies: Scrin, Creeps + +Actors: + Actor21: v02 + Location: 11,16 + Faction: germany + Owner: Neutral + Actor22: t03 + Owner: Neutral + Faction: germany + Location: 15,18 + Actor34: sbag + Owner: Greece + Location: 25,44 + Actor35: sbag + Owner: Greece + Location: 25,45 + Actor36: sbag + Owner: Greece + Location: 26,44 + Actor37: sbag + Owner: Greece + Location: 27,44 + Actor38: sbag + Owner: Greece + Location: 27,45 + Actor39: sbag + Owner: Greece + Location: 16,45 + Actor40: sbag + Owner: Greece + Location: 16,44 + Actor41: sbag + Owner: Greece + Location: 16,43 + Actor42: sbag + Owner: Greece + Location: 15,43 + Actor44: sbag + Owner: Greece + Location: 15,42 + Actor45: sbag + Owner: Greece + Location: 14,42 + Actor43: pris + Owner: Greece + Location: 15,44 + Actor46: pris + Owner: Greece + Location: 26,45 + Actor19: sbag + Owner: Greece + Location: 43,42 + Actor20: sbag + Owner: Greece + Location: 42,42 + Actor24: sbag + Owner: Greece + Location: 44,42 + Actor25: sbag + Owner: Greece + Location: 44,43 + Actor29: sbag + Owner: Greece + Location: 42,43 + Actor51: pris + Owner: Greece + Location: 43,43 + Actor79: apwr + Owner: Greece + Location: 4,51 + Actor80: apwr + Owner: Greece + Location: 7,51 + Actor81: apwr + Owner: Greece + Location: 10,51 + Actor82: apwr + Owner: Greece + Location: 4,54 + Actor83: apwr + Owner: Greece + Location: 7,54 + Actor84: apwr + Owner: Greece + Location: 10,54 + Actor85: chain + Owner: Greece + Location: 3,56 + Actor86: chain + Owner: Greece + Location: 3,55 + Actor87: chain + Owner: Greece + Location: 3,54 + Actor88: chain + Owner: Greece + Location: 3,53 + Actor89: chain + Owner: Greece + Location: 3,50 + Actor90: chain + Owner: Greece + Location: 3,51 + Actor91: chain + Owner: Greece + Location: 3,52 + Actor92: chain + Owner: Greece + Location: 4,50 + Actor93: chain + Owner: Greece + Location: 5,50 + Actor94: chain + Owner: Greece + Location: 7,50 + Actor95: chain + Owner: Greece + Location: 6,50 + Actor96: chain + Owner: Greece + Location: 8,50 + Actor97: chain + Owner: Greece + Location: 10,50 + Actor98: chain + Owner: Greece + Location: 9,50 + Actor99: chain + Owner: Greece + Location: 11,50 + Actor100: chain + Owner: Greece + Location: 12,50 + Actor101: chain + Owner: Greece + Location: 13,50 + Actor108: chain + Owner: Greece + Location: 3,57 + Actor118: chain + Owner: Greece + Location: 13,57 + Actor119: brik + Owner: Greece + Location: 14,50 + Actor120: brik + Owner: Greece + Location: 14,51 + Actor121: brik + Owner: Greece + Location: 14,52 + Actor124: brik + Owner: Greece + Location: 14,49 + Actor125: brik + Owner: Greece + Location: 14,48 + Actor126: brik + Owner: Greece + Location: 15,48 + Actor127: brik + Owner: Greece + Location: 16,48 + Actor128: brik + Owner: Greece + Location: 17,48 + Actor129: brik + Owner: Greece + Location: 18,48 + Actor132: brik + Owner: Greece + Location: 24,48 + Actor134: brik + Owner: Greece + Location: 25,48 + Actor136: brik + Owner: Greece + Location: 26,48 + Actor137: brik + Owner: Greece + Location: 28,48 + Actor138: brik + Owner: Greece + Location: 27,48 + Actor139: brik + Owner: Greece + Location: 29,48 + Actor140: brik + Owner: Greece + Location: 29,49 + Actor141: brik + Owner: Greece + Location: 29,50 + Actor142: brik + Owner: Greece + Location: 29,51 + Actor146: brik + Owner: Greece + Location: 14,55 + Actor147: brik + Owner: Greece + Location: 14,56 + Actor150: brik + Owner: Greece + Location: 14,57 + Actor151: brik + Owner: Greece + Location: 14,58 + Actor152: brik + Owner: Greece + Location: 14,59 + Actor153: brik + Owner: Greece + Location: 15,59 + Actor154: brik + Owner: Greece + Location: 16,59 + Actor155: brik + Owner: Greece + Location: 17,59 + Actor156: brik + Owner: Greece + Location: 18,59 + Actor159: brik + Owner: Greece + Location: 18,58 + Actor161: brik + Owner: Greece + Location: 25,59 + Actor163: brik + Owner: Greece + Location: 26,59 + Actor164: brik + Owner: Greece + Location: 24,58 + Actor165: brik + Owner: Greece + Location: 24,59 + Actor166: brik + Owner: Greece + Location: 27,59 + Actor167: brik + Owner: Greece + Location: 28,59 + Actor169: brik + Owner: Greece + Location: 29,55 + Actor171: brik + Owner: Greece + Location: 29,56 + Actor172: brik + Owner: Greece + Location: 29,57 + Actor173: brik + Owner: Greece + Location: 29,58 + Actor174: brik + Owner: Greece + Location: 29,59 + Actor176: weap + Owner: Greece + Location: 15,49 + Actor144: brik + Owner: Greece + Location: 13,55 + Actor145: brik + Owner: Greece + Location: 13,56 + Actor148: brik + Owner: Greece + Location: 13,51 + Actor149: brik + Owner: Greece + Location: 13,52 + Actor157: brik + Owner: Greece + Location: 18,49 + Actor158: brik + Owner: Greece + Location: 19,49 + Actor175: brik + Owner: Greece + Location: 19,48 + Actor178: brik + Owner: Greece + Location: 24,49 + Actor179: brik + Owner: Greece + Location: 23,48 + Actor180: brik + Owner: Greece + Location: 23,49 + Actor181: brik + Owner: Greece + Location: 23,58 + Actor182: brik + Owner: Greece + Location: 23,59 + Actor183: brik + Owner: Greece + Location: 19,58 + Actor184: brik + Owner: Greece + Location: 19,59 + PlayerRefinery: proc + Owner: Greece + Location: 19,53 + Actor162: fix + Owner: Greece + Location: 24,53 + Actor170: atek + Owner: Greece + Location: 27,56 + Actor206: silo + Owner: Greece + Location: 21,53 + Actor207: silo + Owner: Greece + Location: 19,53 + Actor208: pbox + Owner: Greece + Location: 24,47 + Actor209: pbox + Owner: Greece + Location: 18,47 + Actor135: chain + Owner: Greece + Location: 12,57 + Actor187: chain + Owner: Greece + Location: 10,57 + Actor188: chain + Owner: Greece + Location: 9,57 + Actor189: chain + Owner: Greece + Location: 4,57 + Actor210: chain + Owner: Greece + Location: 6,57 + Actor211: chain + Owner: Greece + Location: 5,57 + Actor212: chain + Owner: Greece + Location: 7,57 + Actor213: chain + Owner: Greece + Location: 8,57 + Actor214: chain + Owner: Greece + Location: 11,57 + Actor133: dome + Owner: Greece + Location: 15,56 + PlayerBarracks: tent + Owner: Greece + Location: 27,49 + Actor203: brik + Owner: Greece + Location: 30,50 + Actor201: brik + Owner: Greece + Location: 30,51 + Actor143: brik + Owner: Greece + Location: 30,55 + Actor185: brik + Owner: Greece + Location: 30,56 + Actor186: swal + Owner: Scrin + Location: 93,20 + Actor202: swal + Owner: Scrin + Location: 93,19 + Actor204: swal + Owner: Scrin + Location: 93,18 + Actor205: swal + Owner: Scrin + Location: 92,18 + Actor215: swal + Owner: Scrin + Location: 92,17 + Actor216: swal + Owner: Scrin + Location: 92,16 + Actor217: swal + Owner: Scrin + Location: 91,16 + Actor218: swal + Owner: Scrin + Location: 90,16 + Actor219: swal + Owner: Scrin + Location: 94,20 + Actor220: swal + Owner: Scrin + Location: 95,20 + Actor221: swal + Owner: Scrin + Location: 96,20 + Actor222: swal + Owner: Scrin + Location: 97,20 + Actor223: swal + Owner: Scrin + Location: 99,20 + Actor224: swal + Owner: Scrin + Location: 98,20 + Actor225: swal + Owner: Scrin + Location: 89,16 + Actor226: swal + Owner: Scrin + Location: 89,15 + Actor227: swal + Owner: Scrin + Location: 90,15 + Actor228: swal + Owner: Scrin + Location: 100,20 + Actor229: swal + Owner: Scrin + Location: 101,20 + Actor230: swal + Owner: Scrin + Location: 101,21 + Actor231: swal + Owner: Scrin + Location: 102,21 + Actor232: swal + Owner: Scrin + Location: 102,20 + Actor233: swal + Owner: Scrin + Location: 89,14 + Actor234: swal + Owner: Scrin + Location: 89,13 + Actor235: swal + Owner: Scrin + Location: 89,12 + Actor236: swal + Owner: Scrin + Location: 90,12 + Actor237: swal + Owner: Scrin + Location: 90,13 + Actor245: swal + Owner: Scrin + Location: 89,4 + Actor248: swal + Owner: Scrin + Location: 89,3 + Actor249: swal + Owner: Scrin + Location: 89,2 + Actor250: swal + Owner: Scrin + Location: 89,1 + Actor251: swal + Owner: Scrin + Location: 90,1 + Actor252: swal + Owner: Scrin + Location: 91,1 + Actor253: swal + Owner: Scrin + Location: 92,1 + Actor254: swal + Owner: Scrin + Location: 93,1 + Actor255: swal + Owner: Scrin + Location: 94,1 + Actor256: swal + Owner: Scrin + Location: 96,1 + Actor257: swal + Owner: Scrin + Location: 95,1 + Actor258: swal + Owner: Scrin + Location: 97,1 + Actor259: swal + Owner: Scrin + Location: 98,1 + Actor261: swal + Owner: Scrin + Location: 90,2 + Actor246: swal + Owner: Scrin + Location: 99,1 + Actor269: ptur + Owner: Scrin + Location: 88,13 + TurretFacing: 277 + Actor270: scol + Owner: Scrin + Location: 90,14 + Actor272: rea2 + Owner: Scrin + Location: 94,17 + Actor273: rea2 + Owner: Scrin + Location: 97,17 + Actor274: srep + Owner: Scrin + Location: 102,15 + Actor247: swal + Owner: Scrin + Location: 100,1 + Actor260: swal + Owner: Scrin + Location: 101,1 + Actor277: swal + Owner: Scrin + Location: 102,1 + Actor278: swal + Owner: Scrin + Location: 103,1 + Actor279: swal + Owner: Scrin + Location: 104,1 + Actor280: swal + Owner: Scrin + Location: 105,1 + Actor281: swal + Owner: Scrin + Location: 106,1 + Actor282: swal + Owner: Scrin + Location: 107,1 + Actor283: swal + Owner: Scrin + Location: 108,1 + Actor284: swal + Owner: Scrin + Location: 108,2 + Actor285: swal + Owner: Scrin + Location: 108,3 + Actor286: swal + Owner: Scrin + Location: 108,4 + Actor287: swal + Owner: Scrin + Location: 108,5 + Actor288: swal + Owner: Scrin + Location: 108,6 + Actor289: swal + Owner: Scrin + Location: 108,7 + Actor290: swal + Owner: Scrin + Location: 108,8 + Actor291: swal + Owner: Scrin + Location: 108,9 + Actor292: swal + Owner: Scrin + Location: 108,10 + Actor293: swal + Owner: Scrin + Location: 107,9 + Actor294: swal + Owner: Scrin + Location: 107,10 + Actor295: swal + Owner: Scrin + Location: 107,15 + Actor296: swal + Owner: Scrin + Location: 108,15 + Actor297: swal + Owner: Scrin + Location: 107,16 + Actor298: swal + Owner: Scrin + Location: 108,16 + Actor299: swal + Owner: Scrin + Location: 108,17 + Actor300: swal + Owner: Scrin + Location: 108,18 + Actor301: swal + Owner: Scrin + Location: 108,19 + Actor302: swal + Owner: Scrin + Location: 108,20 + Actor303: swal + Owner: Scrin + Location: 108,21 + Actor304: swal + Owner: Scrin + Location: 106,21 + Actor305: swal + Owner: Scrin + Location: 105,21 + Actor306: swal + Owner: Scrin + Location: 105,20 + Actor307: swal + Owner: Scrin + Location: 107,21 + Actor308: swal + Owner: Scrin + Location: 106,20 + Actor275: scrt + Owner: Scrin + Location: 106,2 + Actor276: nerv + Owner: Scrin + Location: 103,2 + Actor265: port + Owner: Scrin + Location: 99,11 + Actor310: ptur + Owner: Scrin + Location: 106,22 + TurretFacing: 555 + Actor311: ptur + Owner: Scrin + Location: 109,16 + TurretFacing: 666 + Actor312: ptur + Owner: Scrin + Location: 109,9 + TurretFacing: 658 + Actor313: scol + Owner: Scrin + Location: 107,20 + Actor314: scol + Owner: Scrin + Location: 107,8 + Actor315: shar + Owner: Scrin + Location: 101,18 + TurretFacing: 634 + Actor316: shar + Owner: Scrin + Location: 93,15 + TurretFacing: 364 + Actor317: shar + Owner: Scrin + Location: 91,4 + TurretFacing: 372 + Actor319: split2 + Owner: Neutral + Location: 114,6 + Actor320: split2 + Owner: Neutral + Location: 117,12 + Actor321: split2 + Owner: Neutral + Location: 121,8 + Actor322: split2 + Owner: Neutral + Location: 118,3 + Actor323: split2 + Owner: Neutral + Location: 113,18 + Actor318: proc.scrin + Owner: Scrin + Location: 103,10 + GravityStabilizer1: grav + Owner: Scrin + Location: 97,3 + GravityStabilizer2: grav + Owner: Scrin + Location: 98,7 + Actor324: sfac + Owner: Scrin + Location: 102,7 + Actor262: wsph + Owner: Scrin + Location: 94,8 + Actor264: wsph + Owner: Scrin + Location: 93,4 + Actor266: port + Owner: Scrin + Location: 95,12 + Actor309: mine + Owner: Neutral + Location: 16,62 + Actor326: mine + Owner: Neutral + Location: 74,57 + Actor327: mine + Owner: Neutral + Location: 76,61 + Actor328: chain + Owner: Greece + Location: 32,55 + Actor329: chain + Owner: Greece + Location: 33,55 + Actor330: chain + Owner: Greece + Location: 34,55 + Actor331: chain + Owner: Greece + Location: 35,55 + Actor332: chain + Owner: Greece + Location: 36,55 + Actor333: chain + Owner: Greece + Location: 37,55 + Actor334: chain + Owner: Greece + Location: 32,56 + Actor335: hpad + Owner: Greece + Location: 33,56 + Actor336: hpad + Owner: Greece + Location: 35,56 + Actor337: chain + Owner: Greece + Location: 37,56 + Actor338: chain + Owner: Greece + Location: 32,57 + Actor339: chain + Owner: Greece + Location: 37,57 + Actor340: chain + Owner: Greece + Location: 32,58 + Actor341: chain + Owner: Greece + Location: 37,58 + Actor342: tc04 + Owner: Neutral + Location: 4,58 + Actor343: tc05 + Owner: Neutral + Location: 8,59 + Actor344: t14 + Owner: Neutral + Location: 6,61 + Actor345: t10 + Owner: Neutral + Location: 11,63 + Actor346: t07 + Owner: Neutral + Location: 2,56 + Actor347: t02 + Owner: Neutral + Location: 3,47 + Actor348: t15 + Owner: Neutral + Location: 8,48 + Actor349: tc01 + Owner: Neutral + Location: 11,48 + Actor350: tc02 + Owner: Neutral + Location: 10,45 + Actor351: t14 + Owner: Neutral + Location: 11,42 + Actor352: t03 + Owner: Neutral + Location: 12,46 + Actor353: t02 + Owner: Neutral + Location: 30,58 + Actor354: tc02 + Owner: Neutral + Location: 34,63 + Actor355: tc04 + Owner: Neutral + Location: 35,60 + Actor356: t15 + Owner: Neutral + Location: 40,56 + Actor357: t14 + Owner: Neutral + Location: 43,52 + Actor358: t06 + Owner: Neutral + Location: 48,54 + Actor359: tc02 + Owner: Neutral + Location: 57,55 + Actor360: tc01 + Owner: Neutral + Location: 56,58 + Actor361: t15 + Owner: Neutral + Location: 57,60 + Actor362: t12 + Owner: Neutral + Location: 59,58 + Actor363: tc01 + Owner: Neutral + Location: 57,63 + Actor364: t11 + Owner: Neutral + Location: 57,57 + Actor365: t07 + Owner: Neutral + Location: 56,56 + Actor366: t12 + Owner: Neutral + Location: 57,62 + Actor367: c1 + Owner: Neutral + SubCell: 3 + Facing: 384 + Location: 47,57 + Church: v01 + Owner: Neutral + Location: 48,50 + Actor369: v02 + Owner: Neutral + Location: 45,59 + Actor370: v04 + Owner: Neutral + Location: 49,55 + Actor371: v05 + Owner: Neutral + Location: 39,51 + Actor372: v06 + Owner: Neutral + Location: 54,48 + Actor373: v16 + Owner: Neutral + Location: 55,49 + Actor374: v16 + Owner: Neutral + Location: 56,49 + Actor375: v18 + Owner: Neutral + Location: 57,49 + Actor376: v07 + Owner: Neutral + Location: 57,47 + Actor377: wood + Owner: Neutral + Location: 54,49 + Actor378: wood + Owner: Neutral + Location: 54,50 + Actor379: wood + Owner: Neutral + Location: 55,50 + Actor380: wood + Owner: Neutral + Location: 56,50 + Actor381: wood + Owner: Neutral + Location: 57,50 + Actor382: wood + Owner: Neutral + Location: 58,50 + Actor383: wood + Owner: Neutral + Location: 58,49 + Actor384: wood + Owner: Neutral + Location: 58,48 + Actor385: wood + Owner: Neutral + Location: 57,48 + Actor386: wood + Owner: Neutral + Location: 56,48 + Actor387: wood + Owner: Neutral + Location: 56,47 + Actor388: wood + Owner: Neutral + Location: 55,47 + Actor389: wood + Owner: Neutral + Location: 49,49 + Actor390: wood + Owner: Neutral + Location: 50,49 + Actor391: wood + Owner: Neutral + Location: 50,50 + Actor392: wood + Owner: Neutral + Location: 50,51 + Actor393: wood + Owner: Neutral + Location: 50,52 + Actor394: wood + Owner: Neutral + Location: 49,52 + Actor395: v11 + Owner: Neutral + Location: 41,62 + Actor396: t11 + Owner: Neutral + Location: 59,49 + Actor397: tc05 + Owner: Neutral + Location: 67,51 + Actor398: t16 + Owner: Neutral + Location: 66,49 + Actor399: t15 + Owner: Neutral + Location: 63,41 + Actor400: tc03 + Owner: Neutral + Location: 67,49 + Actor401: t14 + Owner: Neutral + Location: 53,46 + Actor402: tc03 + Owner: Neutral + Location: 39,47 + Actor403: t17 + Owner: Neutral + Location: 42,46 + Actor404: t07 + Owner: Neutral + Location: 43,48 + Actor405: t08 + Owner: Neutral + Location: 35,46 + Actor406: tc05 + Owner: Neutral + Faction: germany + Location: 45,16 + Actor407: tc03 + Owner: Neutral + Faction: germany + Location: 46,7 + Actor408: t15 + Owner: Neutral + Faction: germany + Location: 42,7 + Actor409: t14 + Owner: Neutral + Faction: germany + Location: 51,15 + Actor410: t11 + Owner: Neutral + Faction: germany + Location: 26,20 + Actor411: tc03 + Owner: Neutral + Faction: germany + Location: 13,9 + Actor412: t17 + Owner: Neutral + Faction: germany + Location: 12,9 + Actor413: ptur + Owner: Scrin + Location: 31,14 + TurretFacing: 388 + Actor414: ptur + Owner: Scrin + Location: 44,18 + TurretFacing: 594 + Actor452: jeep + Owner: Greece + Location: 16,53 + Facing: 640 + Actor457: e1 + Owner: Greece + SubCell: 3 + Location: 22,50 + Facing: 563 + Actor458: e1 + Owner: Greece + Facing: 384 + Location: 22,50 + SubCell: 1 + Actor466: e3 + Owner: Greece + Location: 23,50 + SubCell: 3 + Facing: 384 + Actor470: snip + Owner: Greece + Location: 17,47 + SubCell: 3 + Facing: 0 + Actor471: snip + Owner: Greece + SubCell: 3 + Location: 25,47 + Facing: 1023 + Actor472: agun + Owner: Greece + Location: 25,49 + Actor473: agun + Owner: Greece + Location: 25,58 + Actor474: e1 + Owner: Greece + Location: 11,15 + SubCell: 3 + Facing: 1023 + Actor476: e1 + Owner: Greece + Location: 13,16 + SubCell: 3 + Facing: 840 + Actor477: e1 + Owner: Greece + SubCell: 3 + Location: 13,18 + Facing: 705 + Actor478: e1 + Owner: Greece + SubCell: 1 + Location: 13,16 + Facing: 896 + Actor479: medi + Owner: Greece + SubCell: 3 + Location: 12,18 + Facing: 721 + Actor480: s1 + Owner: Scrin + SubCell: 3 + Location: 13,12 + Facing: 531 + Actor481: s1 + Owner: Scrin + SubCell: 3 + Location: 15,14 + Facing: 384 + Actor482: s1 + Owner: Scrin + SubCell: 3 + Location: 16,17 + Facing: 214 + Actor483: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 32,14 + Actor487: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 34,13 + Actor488: s3 + Owner: Scrin + Facing: 384 + Location: 35,13 + SubCell: 3 + Actor490: s3 + Owner: Scrin + SubCell: 3 + Location: 43,17 + Facing: 570 + Actor493: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 30,22 + Actor494: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 29,21 + Actor496: tpod + Owner: Scrin + Location: 103,22 + Facing: 512 + Actor497: tpod + Owner: Scrin + Location: 87,11 + Facing: 384 + Actor499: corr + Owner: Scrin + Location: 111,16 + Facing: 640 + Actor500: harv.scrin + Owner: Scrin + Location: 114,12 + Facing: 7 + Actor501: s1 + Owner: Scrin + SubCell: 3 + Location: 105,23 + Facing: 642 + Actor502: s1 + Owner: Scrin + Location: 105,23 + SubCell: 1 + Facing: 384 + Actor503: s1 + Owner: Scrin + Location: 105,23 + SubCell: 2 + Facing: 547 + NonEasyStormColumn1: scol + Owner: Scrin + Location: 51,12 + Actor506: scol + Owner: Scrin + Location: 77,23 + HardOnlyStormColumn3: scol + Owner: Scrin + Location: 106,36 + Actor510: scol + Owner: Scrin + Location: 119,38 + Actor512: shar + Owner: Scrin + TurretFacing: 384 + Location: 84,36 + Actor509: shar + Owner: Scrin + TurretFacing: 384 + Location: 106,48 + Actor518: rea2 + Owner: Scrin + Location: 124,22 + Actor519: rea2 + Owner: Scrin + Location: 121,22 + Actor520: rea2 + Owner: Scrin + Location: 118,22 + Actor521: swal + Owner: Scrin + Location: 117,22 + Actor522: swal + Owner: Scrin + Location: 117,23 + Actor523: swal + Owner: Scrin + Location: 117,24 + Actor525: swal + Owner: Scrin + Location: 117,25 + Actor538: swal + Owner: Scrin + Location: 127,25 + Actor539: swal + Owner: Scrin + Location: 127,24 + Actor540: swal + Owner: Scrin + Location: 127,23 + Actor541: swal + Owner: Scrin + Location: 127,22 + Actor542: swal + Owner: Scrin + Location: 127,21 + Actor543: swal + Owner: Scrin + Location: 126,21 + Actor544: swal + Owner: Scrin + Location: 124,21 + Actor545: swal + Owner: Scrin + Location: 117,21 + Actor546: swal + Owner: Scrin + Location: 118,21 + Actor547: swal + Owner: Scrin + Location: 119,21 + Actor548: swal + Owner: Scrin + Location: 120,21 + Actor549: swal + Owner: Scrin + Location: 121,21 + Actor550: swal + Owner: Scrin + Location: 122,21 + Actor551: swal + Owner: Scrin + Location: 123,21 + Actor552: swal + Owner: Scrin + Location: 125,21 + Actor524: swal + Owner: Scrin + Location: 117,26 + Actor526: rea2 + Owner: Scrin + Location: 118,25 + Actor527: rea2 + Owner: Scrin + Location: 121,25 + Actor528: rea2 + Owner: Scrin + Location: 124,25 + Actor529: swal + Owner: Scrin + Location: 127,26 + Actor530: swal + Owner: Scrin + Location: 117,27 + Actor531: swal + Owner: Scrin + Location: 127,27 + Actor532: swal + Owner: Scrin + Location: 117,28 + Actor533: swal + Owner: Scrin + Location: 118,28 + Actor534: swal + Owner: Scrin + Location: 119,28 + Actor535: swal + Owner: Scrin + Location: 120,28 + Actor536: swal + Owner: Scrin + Location: 121,28 + Actor537: swal + Owner: Scrin + Location: 122,28 + Actor554: swal + Owner: Scrin + Location: 123,28 + Actor555: swal + Owner: Scrin + Location: 124,28 + Actor556: swal + Owner: Scrin + Location: 125,28 + Actor557: swal + Owner: Scrin + Location: 126,28 + Actor558: swal + Owner: Scrin + Location: 127,28 + Actor516: tc02 + Owner: Neutral + Location: 24,8 + Actor517: tc05 + Owner: Neutral + Location: 18,13 + Actor559: t02 + Owner: Neutral + Location: 42,2 + Actor560: tc04 + Owner: Neutral + Location: 34,1 + Actor561: t11 + Owner: Neutral + Location: 29,6 + Actor562: t15 + Owner: Neutral + Location: 38,1 + Actor563: t03 + Owner: Neutral + Location: 31,4 + Actor564: tc05 + Owner: Neutral + Location: 26,3 + Actor565: t06 + Owner: Neutral + Location: 30,1 + Actor566: t08 + Owner: Neutral + Location: 31,2 + Actor568: t10 + Owner: Neutral + Location: 22,3 + Actor567: t15 + Owner: Neutral + Location: 21,5 + Actor569: t15 + Owner: Neutral + Location: 10,5 + Actor570: tc04 + Owner: Neutral + Location: 7,13 + Actor571: t17 + Owner: Neutral + Location: 5,11 + Actor572: tc01 + Owner: Neutral + Location: 1,16 + Actor573: t15 + Owner: Neutral + Location: 1,1 + Actor574: tc03 + Owner: Neutral + Location: 3,23 + Actor575: t17 + Owner: Neutral + Location: 0,28 + Actor576: t10 + Owner: Neutral + Location: 1,19 + Actor577: t15 + Owner: Neutral + Location: 5,2 + Actor578: t14 + Owner: Neutral + Location: 17,3 + Actor579: t12 + Owner: Neutral + Location: 20,17 + Actor580: t14 + Owner: Neutral + Location: 6,20 + Actor581: v03 + Owner: Neutral + Location: 4,8 + Actor582: v05 + Owner: Neutral + Location: 16,5 + Actor583: v04 + Owner: Neutral + Location: 27,24 + Actor585: v06 + Owner: Neutral + Location: 4,25 + Actor586: v18 + Owner: Neutral + Location: 4,27 + Actor587: v18 + Owner: Neutral + Location: 5,27 + Actor588: v16 + Owner: Neutral + Location: 5,26 + Actor589: v16 + Owner: Neutral + Location: 6,26 + Actor590: wood + Owner: Neutral + Location: 4,26 + Actor591: wood + Owner: Neutral + Location: 3,26 + Actor592: wood + Owner: Neutral + Location: 3,27 + Actor593: wood + Owner: Neutral + Location: 3,28 + Actor594: wood + Owner: Neutral + Location: 4,28 + Actor595: wood + Owner: Neutral + Location: 6,28 + Actor596: wood + Owner: Neutral + Location: 5,28 + Actor597: wood + Owner: Neutral + Location: 6,27 + Actor598: wood + Owner: Neutral + Location: 7,27 + Actor599: wood + Owner: Neutral + Location: 7,26 + Actor600: wood + Owner: Neutral + Location: 7,25 + Actor601: wood + Owner: Neutral + Location: 6,25 + Actor602: wood + Owner: Neutral + Location: 15,5 + Actor603: wood + Owner: Neutral + Location: 15,6 + Actor604: wood + Owner: Neutral + Location: 16,6 + Actor605: wood + Owner: Neutral + Location: 17,6 + Actor606: wood + Owner: Neutral + Location: 15,24 + Actor607: wood + Owner: Neutral + Location: 16,24 + Actor608: brl3 + Owner: Creeps + Location: 38,57 + Actor609: v09 + Owner: Neutral + Location: 15,23 + Actor610: t02 + Owner: Neutral + Location: 52,62 + Actor611: t03 + Owner: Neutral + Location: 47,59 + FirstConvoyPath2: waypoint + Owner: Neutral + Location: 11,3 + FirstConvoyPath3: waypoint + Owner: Neutral + Location: 10,4 + FirstConvoyPath4: waypoint + Owner: Neutral + Location: 9,4 + FirstConvoyPath5: waypoint + Owner: Neutral + Location: 8,5 + FirstConvoyPath6: waypoint + Owner: Neutral + Location: 8,7 + FirstConvoyPath7: waypoint + Owner: Neutral + Location: 9,8 + FirstConvoyPath8: waypoint + Owner: Neutral + Location: 15,8 + FirstConvoyPath9: waypoint + Owner: Neutral + Location: 16,9 + FirstConvoyPath10: waypoint + Owner: Neutral + Location: 16,13 + FirstConvoyPath11: waypoint + Owner: Neutral + Location: 15,14 + FirstConvoyPath12: waypoint + Owner: Neutral + Location: 14,14 + FirstConvoyPath13: waypoint + Owner: Neutral + Location: 13,15 + FirstConvoyPath14: waypoint + Owner: Neutral + Location: 13,19 + FirstConvoyPath15: waypoint + Owner: Neutral + Location: 14,21 + FirstConvoyPath16: waypoint + Owner: Neutral + Location: 20,21 + FirstConvoyPath17: waypoint + Owner: Neutral + Location: 21,22 + SecondConvoyPath2: waypoint + Owner: Neutral + Location: 49,18 + SecondConvoyPath3: waypoint + Owner: Neutral + Location: 48,19 + SecondConvoyPath4: waypoint + Owner: Neutral + Location: 47,19 + SecondConvoyPath5: waypoint + Owner: Neutral + Location: 46,20 + SecondConvoyPath6: waypoint + Owner: Neutral + Location: 46,54 + SecondConvoyPath7: waypoint + Owner: Neutral + Location: 45,55 + SecondConvoyPath8: waypoint + Owner: Neutral + Location: 43,55 + ThirdConvoyPath2: waypoint + Owner: Neutral + Location: 74,6 + ThirdConvoyPath3: waypoint + Owner: Neutral + Location: 67,13 + ThirdConvoyPath4: waypoint + Owner: Neutral + Location: 62,13 + ThirdConvoyPath5: waypoint + Owner: Neutral + Location: 61,14 + ThirdConvoyPath6: waypoint + Owner: Neutral + Location: 61,16 + ThirdConvoyPath7: waypoint + Owner: Neutral + Location: 55,16 + ThirdConvoyPath8: waypoint + Owner: Neutral + Location: 53,14 + ThirdConvoyPath9: waypoint + Owner: Neutral + Location: 51,14 + ThirdConvoyPath10: waypoint + Owner: Neutral + Location: 49,16 + FourthConvoyPath2: waypoint + Owner: Neutral + Location: 126,40 + FourthConvoyPath3: waypoint + Owner: Neutral + Location: 118,40 + FourthConvoyPath4: waypoint + Owner: Neutral + Location: 116,38 + FourthConvoyPath5: waypoint + Owner: Neutral + Location: 106,38 + FourthConvoyPath6: waypoint + Owner: Neutral + Location: 104,36 + FourthConvoyPath9: waypoint + Owner: Neutral + Location: 85,29 + FourthConvoyPath10: waypoint + Owner: Neutral + Location: 85,27 + FourthConvoyPath11: waypoint + Owner: Neutral + Location: 83,27 + FourthConvoyPath12: waypoint + Owner: Neutral + Location: 81,25 + FourthConvoyPath13: waypoint + Owner: Neutral + Location: 71,25 + FourthConvoyPath14: waypoint + Owner: Neutral + Location: 69,23 + Actor656: medi + Owner: Greece + SubCell: 3 + Facing: 721 + Location: 10,16 + HardOnlyStormColumn1: scol + Owner: Scrin + Location: 63,10 + Actor658: devo + Owner: Scrin + Facing: 384 + Location: 68,9 + Actor659: devo + Owner: Scrin + Location: 70,13 + Facing: 384 + NonEasyCorrupter1: corr + Owner: Scrin + Location: 69,11 + Facing: 384 + Actor661: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 68,10 + Actor662: s1 + Owner: Scrin + Facing: 384 + Location: 68,10 + SubCell: 1 + Actor663: s1 + Owner: Scrin + Facing: 384 + Location: 71,12 + SubCell: 3 + Actor664: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 69,13 + Actor665: s2 + Owner: Scrin + Facing: 384 + Location: 70,12 + SubCell: 3 + Actor666: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 69,10 + Actor667: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 52,12 + Actor668: s1 + Owner: Scrin + Location: 52,12 + SubCell: 1 + Facing: 384 + Actor669: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 46,9 + Actor670: intl + Owner: Scrin + Facing: 384 + Location: 33,16 + Actor671: intl + Owner: Scrin + Location: 46,19 + Facing: 523 + Actor673: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 58,10 + Actor674: s1 + Owner: Scrin + SubCell: 3 + Location: 59,9 + Facing: 586 + Actor675: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 71,11 + Actor676: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 48,8 + Actor677: s3 + Owner: Scrin + Facing: 384 + Location: 59,9 + SubCell: 1 + Actor678: gunw + Owner: Scrin + Location: 86,24 + Facing: 436 + Actor680: tc03.husk + Owner: Neutral + Location: 88,35 + Actor681: tc04 + Owner: Neutral + Location: 126,53 + Actor682: tc02 + Owner: Neutral + Location: 122,52 + Actor683: t11 + Owner: Neutral + Location: 120,54 + Actor684: tc01 + Owner: Neutral + Location: 122,58 + Actor685: tc03 + Owner: Neutral + Location: 124,52 + Actor686: t14 + Owner: Neutral + Location: 117,52 + Actor687: t17 + Owner: Neutral + Location: 122,63 + Actor688: tc02 + Owner: Neutral + Location: 126,60 + Actor689: tc05 + Owner: Neutral + Location: 127,61 + Actor690: tc03 + Owner: Neutral + Location: 116,56 + Actor691: t14 + Owner: Neutral + Location: 117,60 + Actor692: t06 + Owner: Neutral + Location: 119,64 + Actor693: t07 + Owner: Neutral + Location: 117,58 + Actor694: t07 + Owner: Neutral + Location: 127,51 + Actor695: t05 + Owner: Neutral + Location: 112,51 + Actor696: moneycrate + Owner: Neutral + Location: 116,59 + Actor697: tc05 + Owner: Neutral + Location: 81,0 + Actor698: t17 + Owner: Neutral + Location: 81,1 + Actor699: t16 + Owner: Neutral + Location: 82,2 + Actor700: t12 + Owner: Neutral + Location: 78,4 + Actor702: tc04 + Owner: Neutral + Location: 86,20 + Actor703: t11 + Owner: Neutral + Location: 85,19 + Actor706: t12 + Owner: Neutral + Location: 79,21 + Actor710: tc04 + Owner: Neutral + Location: 123,31 + Actor711: t17 + Owner: Neutral + Location: 121,35 + Actor712: t11 + Owner: Neutral + Location: 121,46 + Actor713: t12 + Owner: Neutral + Location: 123,45 + Actor714: tc02 + Owner: Neutral + Location: 111,46 + Actor715: tc01 + Owner: Neutral + Location: 106,42 + Actor717: t10 + Owner: Neutral + Location: 115,43 + Actor726: t03 + Owner: Neutral + Location: 127,34 + Actor727: ptur + Owner: Scrin + Location: 99,29 + TurretFacing: 341 + Actor728: silo.scrin + Owner: Scrin + Location: 94,2 + Actor729: silo.scrin + Owner: Scrin + Location: 93,2 + Actor730: silo.scrin + Owner: Scrin + Location: 95,2 + SeekerPatroller1: seek + Owner: Scrin + Location: 121,40 + Facing: 277 + SeekerPatroller3: seek + Owner: Scrin + Location: 122,41 + Facing: 245 + SeekerPatroller2: seek + Owner: Scrin + Location: 122,39 + Facing: 269 + Actor742: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 84,16 + Actor743: s1 + Owner: Scrin + Facing: 384 + Location: 84,15 + SubCell: 3 + Actor744: s1 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 84,16 + Actor745: s3 + Owner: Scrin + Facing: 384 + Location: 84,16 + SubCell: 2 + Actor746: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 86,16 + Actor747: s4 + Owner: Scrin + SubCell: 3 + Location: 85,15 + Facing: 547 + Actor748: gunw + Owner: Scrin + Facing: 384 + Location: 47,9 + Actor749: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 48,9 + Actor750: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 52,3 + Actor751: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 51,4 + Actor752: ptur + Owner: Scrin + Location: 47,4 + TurretFacing: 594 + Actor731: s1 + Owner: Scrin + SubCell: 3 + Location: 125,38 + Facing: 658 + Actor732: s1 + Owner: Scrin + Facing: 384 + Location: 125,38 + SubCell: 1 + Actor733: s1 + Owner: Scrin + Location: 124,37 + SubCell: 3 + Facing: 491 + Actor753: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 127,38 + Actor754: s3 + Owner: Scrin + Facing: 384 + Location: 124,38 + SubCell: 3 + Actor755: s3 + Owner: Scrin + SubCell: 3 + Location: 124,42 + Facing: 896 + Actor756: s1 + Owner: Scrin + SubCell: 3 + Location: 125,42 + Facing: 0 + Actor757: s1 + Owner: Scrin + Location: 123,42 + SubCell: 3 + Facing: 0 + Actor758: s1 + Owner: Scrin + SubCell: 1 + Location: 123,42 + Facing: 384 + Actor759: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 90,4 + Actor760: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 100,10 + Actor761: s4 + Owner: Scrin + Facing: 384 + Location: 100,10 + SubCell: 1 + Actor762: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 101,5 + Actor763: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 100,3 + Actor764: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 106,6 + Actor765: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 105,15 + Actor766: s1 + Owner: Scrin + Facing: 384 + Location: 105,15 + SubCell: 1 + Actor767: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 101,11 + Actor768: s1 + Owner: Scrin + Facing: 384 + Location: 106,6 + SubCell: 1 + Actor769: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 102,4 + Actor770: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 100,15 + Actor771: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 107,17 + Actor772: s3 + Owner: Scrin + Facing: 384 + Location: 100,15 + SubCell: 1 + Actor773: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 96,16 + Actor774: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 105,18 + Actor775: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 105,6 + Actor776: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 122,11 + Actor777: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 120,16 + Actor778: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 116,9 + Actor779: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 118,6 + Actor780: s1 + Owner: Scrin + Facing: 384 + Location: 120,16 + SubCell: 1 + Actor781: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 118,17 + Actor782: s1 + Owner: Scrin + Facing: 384 + Location: 122,11 + SubCell: 1 + Actor783: s1 + Owner: Scrin + Facing: 384 + Location: 116,9 + SubCell: 1 + Actor784: s4 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 123,13 + Actor785: gunw + Owner: Scrin + Location: 119,14 + Facing: 467 + Actor786: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 116,25 + Actor787: s3 + Owner: Scrin + Facing: 384 + Location: 116,25 + SubCell: 1 + Actor788: s3 + Owner: Scrin + SubCell: 3 + Location: 121,29 + Facing: 539 + Actor789: s3 + Owner: Scrin + Facing: 384 + Location: 121,29 + SubCell: 1 + Actor790: s1 + Owner: Scrin + SubCell: 3 + Location: 122,29 + Facing: 384 + Actor791: s1 + Owner: Scrin + Location: 122,29 + SubCell: 1 + Facing: 384 + Actor792: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 124,29 + Actor801: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 120,37 + Actor803: s1 + Owner: Scrin + Facing: 384 + Location: 107,48 + SubCell: 3 + Actor804: s1 + Owner: Scrin + Facing: 384 + Location: 105,48 + SubCell: 3 + Actor805: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 84,37 + Actor806: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 83,36 + Actor812: seek + Owner: Scrin + Facing: 384 + Location: 44,16 + Actor813: seek + Owner: Scrin + Facing: 384 + Location: 52,20 + Actor814: devo + Owner: Scrin + Location: 76,2 + Facing: 309 + Actor815: gunw + Owner: Scrin + Location: 71,4 + Facing: 642 + Actor816: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 70,4 + Actor817: s1 + Owner: Scrin + Facing: 384 + Location: 71,3 + SubCell: 3 + Actor818: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 77,3 + Actor819: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 76,1 + Actor820: s3 + Owner: Scrin + Facing: 384 + Location: 77,3 + SubCell: 1 + Actor821: s3 + Owner: Scrin + Facing: 384 + Location: 71,2 + SubCell: 3 + Actor822: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 76,4 + Actor831: s1 + Owner: Scrin + Facing: 384 + Location: 87,24 + SubCell: 3 + Actor832: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 88,24 + Actor833: s1 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 87,24 + Actor834: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 88,26 + Actor835: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 89,25 + Actor836: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 86,23 + Actor837: s4 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 89,24 + Actor838: smedi + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 100,14 + Actor839: smedi + Owner: Scrin + Facing: 384 + Location: 106,17 + SubCell: 3 + Actor841: smedi + Owner: Scrin + Facing: 384 + Location: 88,24 + SubCell: 1 + Actor842: smedi + Owner: Scrin + Facing: 384 + Location: 71,12 + SubCell: 1 + Actor843: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 30,21 + HardOnlyTripod1: tpod + Owner: Scrin + Location: 94,33 + Facing: 174 + Actor845: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 94,34 + Actor846: s3 + Owner: Scrin + SubCell: 3 + Location: 95,33 + Facing: 499 + Actor847: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 25,17 + Actor848: gunw + Owner: Scrin + Facing: 384 + Location: 26,17 + Actor849: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 26,18 + Actor850: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 12,4 + Actor851: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 9,3 + Actor852: s3 + Owner: Scrin + Location: 12,4 + SubCell: 1 + Facing: 384 + Actor853: s3 + Owner: Scrin + SubCell: 3 + Location: 6,6 + Facing: 705 + Actor854: s3 + Owner: Scrin + SubCell: 3 + Location: 15,4 + Facing: 269 + Actor855: s3 + Owner: Scrin + Facing: 384 + Location: 16,17 + SubCell: 1 + Actor856: ice03 + Owner: Neutral + Location: 41,30 + Actor857: ice02 + Owner: Neutral + Location: 65,37 + Actor859: ice03 + Owner: Neutral + Location: 99,46 + Actor860: ice04 + Owner: Neutral + Location: 72,45 + Actor861: ice04 + Owner: Neutral + Location: 85,61 + Actor862: ice05 + Owner: Neutral + Location: 111,60 + Actor863: ice01 + Owner: Neutral + Location: 5,44 + Actor865: ice04 + Owner: Neutral + Location: 8,39 + HardOnlyStormColumn2: scol + Owner: Scrin + Location: 41,8 + Actor866: t11 + Owner: Neutral + Location: 125,16 + Actor867: t16 + Owner: Neutral + Location: 125,5 + Actor868: t03 + Owner: Neutral + Location: 124,19 + SecondConvoyFlare: waypoint + Owner: Neutral + Location: 49,4 + Actor870: e1 + Owner: Greece + Location: 44,44 + SubCell: 1 + Facing: 1023 + Actor872: e1 + Owner: Greece + SubCell: 3 + Location: 19,45 + Facing: 880 + Actor873: e1 + Owner: Greece + SubCell: 3 + Location: 23,45 + Facing: 71 + Actor874: s1 + Owner: Scrin + Facing: 384 + Location: 26,18 + SubCell: 1 + Actor875: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 31,21 + Actor876: s1 + Owner: Scrin + Facing: 384 + Location: 31,21 + SubCell: 1 + Actor878: s1 + Owner: Scrin + Facing: 384 + Location: 32,14 + SubCell: 1 + Actor879: s1 + Owner: Scrin + SubCell: 3 + Location: 13,3 + Facing: 618 + Actor880: s1 + Owner: Scrin + Facing: 384 + Location: 13,3 + SubCell: 1 + Actor881: s1 + Owner: Scrin + Facing: 384 + Location: 48,9 + SubCell: 1 + Actor883: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 51,19 + Actor884: s1 + Owner: Scrin + Facing: 384 + Location: 51,19 + SubCell: 1 + Actor885: s1 + Owner: Scrin + Facing: 384 + Location: 43,17 + SubCell: 1 + Actor887: s1 + Owner: Scrin + Facing: 384 + Location: 44,19 + SubCell: 1 + Actor886: s1 + Owner: Scrin + Location: 44,19 + SubCell: 2 + Facing: 642 + Actor889: s1 + Owner: Scrin + Facing: 384 + Location: 95,33 + SubCell: 1 + Actor893: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 87,13 + Actor894: s1 + Owner: Scrin + Facing: 384 + Location: 88,14 + SubCell: 3 + FirstConvoyPath18: waypoint + Owner: Neutral + Location: 21,64 + SecondConvoyPath9: waypoint + Owner: Neutral + Location: 43,64 + FirstConvoyPath1: waypoint + Owner: Neutral + Location: 11,1 + SecondConvoyPath1: waypoint + Owner: Neutral + Location: 49,1 + ThirdConvoyPath1: waypoint + Owner: Neutral + Location: 74,1 + FourthConvoyPath1: waypoint + Owner: Neutral + Location: 128,42 + Actor869: sbag + Owner: Neutral + Location: 64,54 + Actor896: sbag + Owner: Neutral + Location: 62,54 + Actor897: sbag + Owner: Neutral + Location: 63,54 + Health: 33 + Actor898: sbag + Owner: Neutral + Location: 62,55 + Actor899: sbag + Owner: Neutral + Location: 62,56 + Actor900: sbag + Owner: Neutral + Location: 62,57 + Actor901: sbag + Owner: Neutral + Location: 62,58 + Health: 33 + Actor902: sbag + Owner: Neutral + Location: 62,59 + Actor903: sbag + Owner: Neutral + Location: 62,60 + Actor904: sbag + Owner: Neutral + Location: 62,61 + Actor908: sbag + Owner: Neutral + Location: 62,63 + Actor909: sbag + Owner: Neutral + Location: 62,64 + Actor910: sbag + Owner: Neutral + Location: 63,64 + Actor911: sbag + Owner: Neutral + Location: 64,64 + Actor912: sbag + Owner: Neutral + Location: 69,62 + Health: 33 + Actor913: sbag + Owner: Neutral + Location: 69,63 + Actor914: sbag + Owner: Neutral + Location: 69,64 + Actor915: sbag + Owner: Neutral + Location: 68,64 + Health: 33 + Actor916: sbag + Owner: Neutral + Location: 67,64 + Actor917: sbag + Owner: Neutral + Location: 67,54 + Health: 33 + Actor918: sbag + Owner: Neutral + Location: 68,54 + Actor919: sbag + Owner: Neutral + Location: 69,54 + Actor920: sbag + Owner: Neutral + Location: 69,55 + Actor922: sbag + Owner: Neutral + Location: 62,62 + Health: 33 + Actor905: t02 + Owner: Neutral + Location: 61,61 + Actor906: t08 + Owner: Neutral + Location: 61,63 + StormriderPatroller4: stmr + Owner: Scrin + Location: 117,46 + Facing: 384 + StormriderPatroller3: stmr + Owner: Scrin + Location: 120,43 + Facing: 384 + ScrinAirPatrol2a: waypoint + Owner: Neutral + Location: 113,42 + ScrinAirPatrol2b: waypoint + Owner: Neutral + Location: 55,10 + SeekerPatrol1a: waypoint + Owner: Neutral + Location: 120,40 + SeekerPatrol1b: waypoint + Owner: Neutral + Location: 55,18 + StormriderPatroller1: stmr + Owner: Scrin + Location: 98,60 + Facing: 384 + Stance: Defend + StormriderPatroller2: stmr + Owner: Scrin + Location: 104,60 + Facing: 384 + Stance: Defend + ScrinAirPatrol1b: waypoint + Owner: Neutral + Location: 68,29 + ScrinAirPatrol1c: waypoint + Owner: Neutral + Location: 33,30 + ScrinAirPatrol1a: waypoint + Owner: Neutral + Location: 99,52 + Actor907: oilb + Owner: Neutral + Location: 22,16 + Actor828: intl.ai2 + Owner: Scrin + Facing: 384 + Location: 87,15 + Actor923: intl.ai2 + Owner: Scrin + Location: 58,16 + Facing: 277 + Actor924: intl.ai2 + Owner: Scrin + Location: 87,25 + Facing: 384 + Actor925: intl.ai2 + Owner: Scrin + Facing: 384 + Location: 105,35 + Actor926: intl.ai2 + Owner: Scrin + Facing: 384 + Location: 62,8 + Actor927: swal + Owner: Scrin + Location: 89,5 + Actor928: swal + Owner: Scrin + Location: 89,6 + Actor929: scol + Owner: Scrin + Location: 90,6 + Actor930: ptur + Owner: Scrin + TurretFacing: 333 + Location: 88,7 + Actor931: swal + Owner: Scrin + Location: 89,7 + Actor932: swal + Owner: Scrin + Location: 90,7 + Actor933: swal + Owner: Scrin + Location: 89,8 + Actor934: swal + Owner: Scrin + Location: 90,8 + Actor936: intl + Owner: Scrin + Location: 85,6 + Facing: 475 + Actor937: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 86,6 + Actor938: corr + Owner: Scrin + Facing: 436 + Location: 86,7 + StormriderAttacker1: stmr + Owner: Scrin + Location: 62,40 + Facing: 384 + StormriderAttacker2: stmr + Owner: Scrin + Location: 65,43 + Facing: 384 + Actor829: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 55,25 + Actor882: s1 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 55,25 + Actor891: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 57,26 + Actor892: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 58,26 + Actor941: t16 + Owner: Neutral + Location: 29,9 + Actor942: tc01 + Owner: Neutral + Location: 36,20 + Actor943: tc01 + Owner: Neutral + Location: 36,20 + Actor944: t14 + Owner: Neutral + Location: 37,19 + Actor945: t16 + Owner: Neutral + Location: 35,21 + Actor946: t06 + Owner: Neutral + Location: 39,16 + Actor947: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 35,16 + Actor948: s1 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 35,16 + FourthConvoyPath16: waypoint + Owner: Neutral + Location: 49,24 + FourthConvoyPath15: waypoint + Owner: Neutral + Location: 61,25 + Actor949: t08 + Owner: Neutral + Location: 62,24 + Actor888: s1 + Owner: Scrin + Facing: 384 + Location: 62,27 + SubCell: 3 + Actor890: s3 + Owner: Scrin + Facing: 384 + Location: 63,27 + SubCell: 3 + Actor935: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 36,17 + Actor951: sbag + Owner: Greece + Location: 51,42 + Actor952: sbag + Owner: Greece + Location: 52,42 + Actor953: sbag + Owner: Greece + Location: 53,42 + Actor954: sbag + Owner: Greece + Location: 51,43 + Actor955: pris + Owner: Greece + Location: 52,43 + Actor956: sbag + Owner: Greece + Location: 53,43 + Actor871: t17 + Owner: Neutral + Location: 57,37 + Actor958: t16 + Owner: Neutral + Location: 95,26 + Actor959: tc04 + Owner: Neutral + Location: 97,23 + Actor960: t14 + Owner: Neutral + Location: 92,22 + Actor961: t06 + Owner: Neutral + Location: 92,26 + Actor962: tc01 + Owner: Neutral + Location: 100,23 + Actor963: e1 + Owner: Greece + SubCell: 3 + Location: 50,44 + Facing: 737 + Actor964: e1 + Owner: Greece + Location: 54,43 + SubCell: 3 + Facing: 737 + Actor965: e1 + Owner: Greece + Facing: 384 + Location: 54,43 + SubCell: 1 + Actor966: e3 + Owner: Greece + Facing: 384 + Location: 50,44 + SubCell: 1 + EntranceReveal1: waypoint + Owner: Neutral + Location: 88,10 + EntranceReveal2: waypoint + Owner: Neutral + Location: 104,22 + EntranceReveal3: waypoint + Owner: Neutral + Location: 45,19 + DestroyerSpawn1: waypoint + Owner: Neutral + Location: 97,64 + DestroyerSpawn2: waypoint + Owner: Neutral + Location: 102,64 + DestroyerRally2: waypoint + Owner: Neutral + Location: 74,36 + DestroyerRally1: waypoint + Owner: Neutral + Location: 71,38 + NonEasyStormColumn2: scol + Owner: Scrin + Location: 64,20 + HardOnlyShardLauncher2: shar + Owner: Scrin + Location: 73,29 + TurretFacing: 384 + Actor877: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 75,30 + Actor858: tc02 + Owner: Neutral + Location: 97,38 + FourthConvoyPath7: waypoint + Owner: Neutral + Location: 104,34 + FourthConvoyPath8: waypoint + Owner: Neutral + Location: 86,34 + NonEasyStormColumn3: scol + Owner: Scrin + Location: 89,31 + Actor827: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 116,32 + Actor957: devo + Owner: Scrin + Facing: 384 + Location: 113,33 + Actor969: gunw + Owner: Scrin + Facing: 384 + Location: 115,33 + Actor970: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 117,33 + Actor971: devo + Owner: Scrin + Facing: 384 + Location: 116,34 + Actor972: ptur + Owner: Scrin + TurretFacing: 428 + Location: 116,29 + Actor895: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 112,30 + Actor973: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 110,31 + Actor974: s4 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 110,31 + Actor975: t15 + Owner: Neutral + Location: 111,31 + Actor976: tc01 + Owner: Neutral + Location: 109,26 + Actor826: t05 + Owner: Neutral + Location: 73,16 + Actor844: t17 + Owner: Neutral + Location: 67,17 + Actor864: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 87,3 + Actor950: s3 + Owner: Scrin + SubCell: 3 + Facing: 483 + Location: 88,3 + Actor967: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 86,4 + Actor968: s1 + Owner: Scrin + SubCell: 1 + Facing: 586 + Location: 86,4 + Actor977: s1 + Owner: Scrin + SubCell: 3 + Facing: 531 + Location: 87,4 + Actor978: s3 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 87,4 + Actor979: smedi + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 88,4 + Actor980: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 88,5 + Actor981: s3 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 88,5 + Actor840: devo + Owner: Scrin + Location: 87,6 + Facing: 436 + Actor830: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 83,7 + Actor982: s1 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 83,7 + HardOnlyShardLauncher1: shar + Owner: Scrin + Location: 60,28 + TurretFacing: 384 + Actor824: wood + Owner: Neutral + Location: 108,41 + Actor825: wood + Owner: Neutral + Location: 109,41 + Actor939: wood + Owner: Neutral + Location: 108,42 + Actor940: v15 + Owner: Neutral + Location: 109,42 + Actor983: wood + Owner: Neutral + Location: 108,43 + Actor984: v16 + Owner: Neutral + Location: 109,43 + Actor985: wood + Owner: Neutral + Location: 108,44 + Actor986: v11 + Owner: Neutral + Location: 109,44 + ScrinAttackAssembly1: waypoint + Owner: Neutral + Location: 34,14 + ScrinAttackAssembly2: waypoint + Owner: Neutral + Location: 57,19 + ScrinAttackAssembly3: waypoint + Owner: Neutral + Location: 83,29 + SovietRefinery: proc + Location: 66,57 + FreeActor@CHARV: False + FreeActor: False + Faction: germany + Owner: USSR + Health: 37 + SovietSilo2: silo + Location: 68,57 + Faction: germany + Owner: USSR + Health: 30 + SovietSilo1: silo + Location: 66,57 + Faction: germany + Owner: USSR + Health: 20 + SovietPower1: powr + Location: 63,55 + Faction: germany + Owner: USSR + Health: 22 + SovietPower2: powr + Location: 63,58 + Faction: germany + Owner: USSR + Health: 40 + SovietPower3: powr + Owner: USSR + Location: 63,61 + Health: 48 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-coalitions.yaml, displacement-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/main-campaign/ca02-displacement/r_firstconvoy.aud b/mods/ca/missions/main-campaign/ca02-displacement/r_firstconvoy.aud new file mode 100644 index 0000000000..ec42de8fe9 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca02-displacement/r_firstconvoy.aud differ diff --git a/mods/ca/missions/main-campaign/ca02-displacement/screams.aud b/mods/ca/missions/main-campaign/ca02-displacement/screams.aud new file mode 100644 index 0000000000..cafb4e483b Binary files /dev/null and b/mods/ca/missions/main-campaign/ca02-displacement/screams.aud differ diff --git a/mods/ca/missions/main-campaign/ca03-deliverance/deliverance-rules.yaml b/mods/ca/missions/main-campaign/ca03-deliverance/deliverance-rules.yaml new file mode 100644 index 0000000000..397b2a4043 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca03-deliverance/deliverance-rules.yaml @@ -0,0 +1,204 @@ +^Palettes: + TintPostProcessEffect: + +World: + LuaScript: + Scripts: campaign.lua, deliverance.lua + MissionData: + Briefing: We have been contacted by forces belonging to a group calling themselves the Global Defense Initiative. Though we have no knowledge of such an organization, we have reason to believe they can shed some light on everything that has been happening.\n\nA GDI base apparently materialized inside Soviet territory. Their commander was taken prisoner and they are soon to be overrun by Soviet forces.\n\nTake a detachment to find the base and—assuming this is not a Soviet ruse—defend it until reinforcements arrive.\n\nWith their commander captured and their chain of command in disarray due to the temporal and dimensional upheaval, the GDI forces have agreed to follow your orders. Once our position is secure, locate and rescue the GDI commander.\n\nWe don't know yet if we can trust these people, so remain vigilant. Hopefully we have found ourselves a new ally, and rescuing their commander is surely a good first step towards securing such an alliance. + LossVideo: battle.vqa + MapOptions: + ShortGameCheckboxEnabled: False + MusicPlaylist: + StartingMusic: aoi + +Player: + PlayerResources: + DefaultCash: 3500 + +# Disable powers for AI + +^ParabombsPower: + AirstrikePowerCA@Russianparabombs: + Prerequisites: ~support.parabombs, ~!botplayer + +^ParatroopersPower: + ParatroopersPowerCA@paratroopers: + Prerequisites: ~support.paratroopers, ~!botplayer + +# Voice overrides so GDI forces use TD voices + +^VehicleTD-NOUPG: + Voiced: + VoiceSet: VehicleTDVoice + +^PlaneTD: + Voiced: + VoiceSet: VehicleTDVoice + +^HelicopterTD: + Voiced: + VoiceSet: VehicleTDVoice + +^GDIInfantry: + Voiced: + VoiceSet: GenericTDVoice + +N1: + Voiced: + VoiceSet: GenericTDVoice + +N2: + Voiced: + VoiceSet: GenericTDVoice + +N3: + Voiced: + VoiceSet: GenericTDVoice + +N6: + Voiced: + VoiceSet: GenericTDVoice + +# Prerequisite adjustments + +N6: + Buildable: + Prerequisites: ~infantry.any + +MEDI: + Buildable: + Prerequisites: ~tent + +MNLY: + Buildable: + Prerequisites: ~vehicles.allies, repair + +ORCA: + Buildable: + Prerequisites: hpad.td + +vulcan.upgrade: + Buildable: + Prerequisites: anyradar, ~radar.gdi + +delp.upgrade: + Buildable: + Prerequisites: anyradar, ~radar.allies + +# Disable tech + +E6: + Inherits@CAMPAIGNDISABLED: ^Disabled + +JJET: + Inherits@CAMPAIGNDISABLED: ^Disabled + +BJET: + Inherits@CAMPAIGNDISABLED: ^Disabled + +RMBO: + Inherits@CAMPAIGNDISABLED: ^Disabled + +E7: + Inherits@CAMPAIGNDISABLED: ^Disabled + +BORI: + Inherits@CAMPAIGNDISABLED: ^Disabled + +XO: + Inherits@CAMPAIGNDISABLED: ^Disabled + +PBUL: + Inherits@CAMPAIGNDISABLED: ^Disabled + +WOLV: + Inherits@CAMPAIGNDISABLED: ^Disabled + +DISR: + Inherits@CAMPAIGNDISABLED: ^Disabled + +MSAR: + Inherits@CAMPAIGNDISABLED: ^Disabled + +HTNK: + Inherits@CAMPAIGNDISABLED: ^Disabled + +MEMP: + Inherits@CAMPAIGNDISABLED: ^Disabled + +A10: + Inherits@CAMPAIGNDISABLED: ^Disabled + +OCAR: + Inherits@CAMPAIGNDISABLED: ^Disabled + +ORCB: + Inherits@CAMPAIGNDISABLED: ^Disabled + +AMCV: + Inherits@CAMPAIGNDISABLED: ^Disabled + +CA: + Inherits@CAMPAIGNDISABLED: ^Disabled + +PDOX: + Inherits@CAMPAIGNDISABLED: ^Disabled + +IRON: + Inherits@CAMPAIGNDISABLED: ^Disabled + +OREP: + Inherits@CAMPAIGNDISABLED: ^Disabled + +INDP: + Inherits@CAMPAIGNDISABLED: ^Disabled + +WEAT: + Inherits@CAMPAIGNDISABLED: ^Disabled + +MSLO: + Inherits@CAMPAIGNDISABLED: ^Disabled + +charv.upgrade: + Inherits@CAMPAIGNDISABLED: ^Disabled + +# Disable powers + +HQ: + -AirstrikePowerCA@uav: + +HPAD.TD: + -InterceptorPower@AirDef: + +# Misc + +REP: + ProximityExternalCondition@AIRCRAFTREPAIR: + Range: 12c0 + WithRangeCircle@AIRCRAFTREPAIR: + Range: 12c0 + +MISS: + Tooltip: + Name: Prison + TooltipDescription: + Description: Prisoners of war are kept here. + ValidRelationships: Ally, Enemy, Neutral + Health: + HP: 200000 + +GNRL: + Tooltip: + Name: GDI Commander + -Valued: + Health: + HP: 80000 + +V3RL: + AutoTargetPriority@DEFAULT: + ValidTargets: Structure, Defense + +MSLO: + Power: + Amount: 0 diff --git a/mods/ca/missions/main-campaign/ca03-deliverance/deliverance-voices.yaml b/mods/ca/missions/main-campaign/ca03-deliverance/deliverance-voices.yaml new file mode 100644 index 0000000000..7e29266cf3 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca03-deliverance/deliverance-voices.yaml @@ -0,0 +1,21 @@ +GenericTDVoice: + DefaultVariant: .c01 + Variants: + germany: .c01, .c03 + Voices: + Select: await1,ready,report1,yessir1 + Action: ackno,affirm1,noprob,overout,ritaway,roger,ugotit + Die: dedman1,dedman2,dedman3,dedman4,dedman5,dedman7,dedman8,nuyell1,nuyell12,nuyell3,nuyell4,nuyell5 + Burned: dedman10,yell1 + Zapped: dedman6,nuyell3 + Poisoned: vtoxb,vtoxc,vtoxd,vtoxe,vtoxf,vtoxh + DisableVariants: Die, Burned, Zapped, Poisoned + +VehicleTDVoice: + DefaultVariant: .c00 + Variants: + germany: .c00, .c02 + Voices: + Select: vehic1,yessir1,report1,await1,unit1 + Action: ackno,affirm1,movout1 + Unload: movout1 diff --git a/mods/ca/missions/main-campaign/ca03-deliverance/deliverance.lua b/mods/ca/missions/main-campaign/ca03-deliverance/deliverance.lua new file mode 100644 index 0000000000..15ab11b4b9 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca03-deliverance/deliverance.lua @@ -0,0 +1,643 @@ +MissionDir = "ca|missions/main-campaign/ca03-deliverance" + +-- Locations + +SovietMainAttackPaths = { + { EastAssembly.Location, NorthAttackRally.Location }, + { EastAssembly.Location, NorthEastAttackRally.Location }, + { EastAssembly.Location, EastAttackRally.Location } +} + +SovietNorthernAttackPaths = { + { NorthAssembly.Location, NorthAttackRally.Location }, + { NorthAssembly.Location, NorthEastAttackRally.Location }, + { NorthAssembly.Location, EastAttackRally.Location } +} + +SovietNavalAttackPaths = { { NavalSouthAssembly.Location, NavalSouthRally.Location, NavalForwardRally.Location } } + +SovietNavalFallbackAttackPaths = { { NavalEastAssembly.Location, NavalSouthEastAssembly.Location, NavalSouthAssembly.Location, NavalSouthRally.Location, NavalForwardRally.Location } } + +SovietCenterPatrolPath = { CentralPatrol1.Location, CentralPatrol2.Location, CentralPatrol3.Location, CentralPatrol4.Location, CentralPatrol3.Location, CentralPatrol2.Location } + +SovietShorePatrolPath = { ShorePatrol1.Location, ShorePatrol2.Location } + +SovietHindPatrolPath = { NavalEastAssembly.Location, NavalSouthEastAssembly.Location, NavalSouthAssembly.Location, NavalSouthRally.Location, NavalForwardRally.Location, EastAssembly.Location, CentralPatrol3.Location } + +HaloDropPaths = { + { HaloSpawn1.Location, HaloDrop1Mid.Location, HaloDrop1Landing.Location }, + { HaloSpawn1.Location, HaloDrop2Landing.Location }, + { HaloSpawn1.Location, HaloDrop1Mid.Location, HaloDrop3Landing.Location }, + { HaloSpawn1.Location, HaloDrop1Mid.Location, HaloDrop4Landing.Location }, + { HaloSpawn2.Location, HaloDrop5Landing.Location }, + { HaloSpawn2.Location, HaloDrop6Landing.Location }, + { HaloSpawn2.Location, HaloDrop6Landing.Location, HaloDrop7Landing.Location } +} + +LateHaloDropPaths = { + { LateHaloDrop1Spawn.Location, LateHaloDrop1Landing.Location }, + { LateHaloDrop2Spawn.Location, LateHaloDrop2Landing.Location }, + { LateHaloDrop3Spawn.Location, LateHaloDrop3Landing.Location } +} + +NavalDropPaths = { + { RaidSpawn.Location, RaidLanding1.Location }, + { RaidSpawn.Location, RaidLanding2.Location }, + { RaidSpawn.Location, RaidLanding3.Location } +} + +-- Other Variables + +HaloDropStart = AdjustDelayForDifficulty(DateTime.Minutes(15)) +HaloDropAttackValue = AdjustAttackValuesForDifficulty({ Min = 12, Max = 24, RampDuration = DateTime.Minutes(5) }) +NavalDropStart = AdjustDelayForDifficulty(DateTime.Minutes(17)) +NavalDropAttackValue = AdjustAttackValuesForDifficulty({ Min = 6, Max = 14, RampDuration = DateTime.Minutes(5) }) + +HoldOutTime = { + easy = DateTime.Minutes(7), + normal = DateTime.Minutes(8), + hard = DateTime.Minutes(9), + vhard = DateTime.Minutes(10), + brutal = DateTime.Minutes(11) +} + +-- Squads + +Squads = { + Main = { + Delay = AdjustDelayForDifficulty(DateTime.Seconds(80)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 26, Max = 32, RampDuration = DateTime.Minutes(14) }), + FollowLeader = true, + ProducerActors = { Infantry = { SovietMainBarracks1, SovietMainBarracks2 }, Vehicles = { SovietMainFactory1, SovietMainFactory2 } }, + Compositions = AdjustCompositionsForDifficulty(UnitCompositions.Soviet), + AttackPaths = SovietMainAttackPaths, + }, + Northern = { + Delay = AdjustDelayForDifficulty(DateTime.Seconds(60)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 20, Max = 24, RampDuration = DateTime.Minutes(14) }), + FollowLeader = true, + ProducerActors = { Infantry = { SovietNorthBarracks1, SovietNorthBarracks2 }, Vehicles = { SovietNorthFactory } }, + Compositions = { + easy = { + { + Infantry = { "e3", "e1", "e1", "e1", "e2" }, + Vehicles = { "btr" } + } + }, + normal = { + { + Infantry = { "e3", "e1", "e1", "e1", "e1", "e2", "e4" }, + Vehicles = { "3tnk", "btr.ai" } + } + }, + hard = { + { + Infantry = { "e3", "e1", "e1", "e1", "e1", "e1", "e2", "e3", "e4" }, + Vehicles = { "3tnk", "btr.ai", "3tnk" } + } + }, + vhard = AdjustCompositionsForDifficulty(UnitCompositions.Soviet), + brutal = AdjustCompositionsForDifficulty(UnitCompositions.Soviet) + }, + AttackPaths = SovietNorthernAttackPaths + }, + Migs = { + Delay = AdjustAirDelayForDifficulty(DateTime.Minutes(13)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 12, Max = 12 }), + Compositions = { + easy = { + { Aircraft = { "mig" } } + }, + normal = { + { Aircraft = { "mig", "mig" } } + }, + hard = { + { Aircraft = { "mig", "mig", "mig" } } + }, + vhard = { + { Aircraft = { "mig", "mig", "mig" } } + }, + brutal = { + { Aircraft = { "mig", "mig", "mig" } } + } + }, + }, + Naval = { + ActiveCondition = function() + return MissionPlayersHaveNavalPresence() + end, + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 16, Max = 16 }), + ProducerActors = { Ships = { SovietSouthSubPen1, SovietSouthSubPen2 } }, + Compositions = { + easy = { + { Ships = { "ss", "seas" } } + }, + normal = { + { Ships = { "ss", "seas" } } + }, + hard = { + { Ships = { "ss", "ss", "seas" } } + }, + vhard = { + { Ships = { "ss", "ss", "seas" } } + }, + brutal = { + { Ships = { "ss", "ss", "seas" } } + } + }, + AttackPaths = SovietNavalAttackPaths + } +} + +-- Setup and Tick + +SetupPlayers = function() + Greece = Player.GetPlayer("Greece") + GDI = Player.GetPlayer("GDI") + USSR = Player.GetPlayer("USSR") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = { Greece } + MissionEnemies = { USSR } +end + +WorldLoaded = function() + SetupPlayers() + + TimerTicks = 0 + GDICommanderAlive = true + Camera.Position = PlayerStart.CenterPosition + + InitObjectives(Greece) + AdjustPlayerStartingCashForDifficulty() + RemoveActorsBasedOnDifficultyTags() + InitUSSR() + + if IsVeryHardOrBelow() then + MissileSilo.Destroy() + + if IsNormalOrBelow() then + SovietMammoth1.Destroy() + SovietV22.Destroy() + + SovietV23.Destroy() + SovietV24.Destroy() + SovietMammoth3.Destroy() + + HardOnlySub1.Destroy() + HardOnlySub2.Destroy() + HardOnlySub3.Destroy() + HardOnlySub4.Destroy() + HardOnlySub5.Destroy() + + HardOnlyTeslaCoil1.Destroy() + HardOnlyTeslaCoil2.Destroy() + HardOnlyTeslaCoil3.Destroy() + + HardOnlyKatyusha1.Destroy() + HardOnlyKatyusha2.Destroy() + + Trigger.AfterDelay(DateTime.Seconds(3), function() + Tip("If you put a Mechanic inside an IFV it becomes a repair vehicle.") + end) + + if Difficulty == "easy" then + SovietMammoth2.Destroy() + SovietV21.Destroy() + end + end + end + + ObjectiveFindBase = Greece.AddObjective("Find besieged GDI base.") + UserInterface.SetMissionText("Find besieged GDI base.", HSLColor.Yellow) + + -- On finding the GDI base, transfer ownership to player + Trigger.OnEnteredProximityTrigger(GDIBaseTopRight.CenterPosition, WDist.New(16 * 1024), function(a, id) + if IsMissionPlayer(a.Owner) then + Trigger.RemoveProximityTrigger(id) + GDIBaseFound() + end + end) + + -- On proximity to prison, reveal it and update objectives. + Trigger.OnEnteredProximityTrigger(SovietPrison.CenterPosition, WDist.New(10 * 1024), function(a, id) + if IsMissionPlayer(a.Owner) then + Trigger.RemoveProximityTrigger(id) + RevealPrison() + end + end) + + Trigger.OnDamaged(SovietPrison, function(self, attacker, damage) + RevealPrison() + end) + + Trigger.OnCapture(SovietPrison, function(self, captor, oldOwner, newOwner) + if IsMissionPlayer(newOwner) then + local commander = Reinforcements.Reinforce(GDI, { "gnrl" }, { GDICommanderSpawn.Location, GDICommanderRally.Location })[1] + + if ObjectiveLocateCommander ~= nil and not Greece.IsObjectiveCompleted(ObjectiveLocateCommander) then + Greece.MarkCompletedObjective(ObjectiveLocateCommander) + end + + Trigger.OnKilled(commander, function(self, killer) + GDICommanderAlive = false + end) + + Trigger.AfterDelay(DateTime.Seconds(3), function() + if GDICommanderAlive then + Notification("The GDI commander has been freed.") + MediaCA.PlaySound(MissionDir .. "/r_gdicmdrfreed.aud", 2) + end + + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(3)), function() + MediaCA.PlaySound(MissionDir .. "/r_gditraninbound.aud", 2) + Reinforcements.ReinforceWithTransport(GDI, "tran.evac", nil, { GDIRescueSpawn.Location, GDIRescueRally.Location }, nil, function(transport, cargo) + + Trigger.AfterDelay(DateTime.Seconds(1), function() + if not commander.IsDead then + commander.EnterTransport(transport) + Trigger.OnIdle(commander, function(c) + if not c.IsDead then + c.EnterTransport(transport) + end + end) + end + end) + + Trigger.OnPassengerEntered(transport, function(t, passenger) + PlaySpeechNotificationToMissionPlayers("TargetRescued") + t.Move(GDIReinforcementsEntry.Location) + t.Destroy() + Trigger.AfterDelay(DateTime.Seconds(7), function() + Greece.MarkCompletedObjective(ObjectiveCapturePrison) + + if not IsHoldOutComplete then + Notification("Continue holding your position, we need to keep the Soviets busy so they don't pursue the GDI commander.") + end + end) + end) + end) + end) + end) + end + end) + + Trigger.OnKilled(SovietPrison, function(self, killer) + if not IsMissionPlayer(self.Owner) then + GDICommanderAlive = false + end + end) + + SetupReveals({ EntranceReveal1, EntranceReveal2, EntranceReveal3, EntranceReveal4 }) + AfterWorldLoaded() +end + +Tick = function() + OncePerSecondChecks() + OncePerFiveSecondChecks() + OncePerThirtySecondChecks() + AfterTick() +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + USSR.Resources = USSR.ResourceCapacity - 500 + + if TimerTicks > 0 then + if TimerTicks > 25 then + TimerTicks = TimerTicks - 25 + else + TimerTicks = 0 + end + UpdateReinforcementCountdown() + end + + if MissionPlayersHaveNoRequiredUnits() or not GDICommanderAlive then + if ObjectiveFindBase ~= nil and not Greece.IsObjectiveCompleted(ObjectiveFindBase) then + Greece.MarkFailedObjective(ObjectiveFindBase) + end + if ObjectiveHoldOut ~= nil and not Greece.IsObjectiveCompleted(ObjectiveHoldOut) then + Greece.MarkFailedObjective(ObjectiveHoldOut) + end + if ObjectiveLocateCommander ~= nil and not Greece.IsObjectiveCompleted(ObjectiveLocateCommander) then + Greece.MarkFailedObjective(ObjectiveLocateCommander) + end + if ObjectiveCapturePrison ~= nil and not Greece.IsObjectiveCompleted(ObjectiveCapturePrison) then + Greece.MarkFailedObjective(ObjectiveCapturePrison) + end + end + + NavalReinforcements() + end +end + +OncePerFiveSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 125 == 0 then + UpdatePlayerBaseLocations() + end +end + +OncePerThirtySecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % DateTime.Seconds(30) == 0 then + CalculatePlayerCharacteristics() + end +end + +-- Functions + +GDIBaseFound = function() + if not IsGDIBaseFound then + IsGDIBaseFound = true + MediaCA.PlaySound(MissionDir .. "/r_gdibasediscovered.aud", 2) + + TransferGDIUnits() + InitUSSRAttacks() + + TimerTicks = HoldOutTime[Difficulty] + + Trigger.AfterDelay(DateTime.Seconds(1), function() + ObjectiveHoldOut = Greece.AddObjective("Hold out until reinforcements arrive.") + UpdateReinforcementCountdown() + Greece.MarkCompletedObjective(ObjectiveFindBase) + end) + + Trigger.AfterDelay(HoldOutTime[Difficulty] - DateTime.Seconds(20), function() + McvFlare = Actor.Create("flare", true, { Owner = Greece, Location = McvRally.Location }) + PlaySpeechNotificationToMissionPlayers("SignalFlare") + Notification("Signal flare detected, reinforcements inbound. Press [" .. UtilsCA.Hotkey("ToLastEvent") .. "] to view location.") + Beacon.New(Greece, McvRally.CenterPosition) + Trigger.AfterDelay(DateTime.Seconds(20), function() + McvFlare.Destroy() + end) + end) + + Trigger.AfterDelay(HoldOutTime[Difficulty], function() + HoldOutComplete() + end) + + if IsNormalOrBelow() then + Trigger.AfterDelay(DateTime.Seconds(792), function() + PlaySpeechNotificationToMissionPlayers("ReinforcementsArrived") + Beacon.New(Greece, GDIReinforcementsEntry.CenterPosition) + local gdiReinforcements = { "mtnk", "htnk" } + if Difficulty == "easy" then + gdiReinforcements = { "htnk" , "htnk" } + end + Reinforcements.Reinforce(Greece, gdiReinforcements, { GDIReinforcementsEntry.Location, GDIReinforcementsRally.Location }, 75) + end) + end + end +end + +-- overridden in co-op version +TransferGDIUnits = function() + Greece.PlayLowPowerNotification = false + Trigger.AfterDelay(DateTime.Seconds(10), function() + Greece.PlayLowPowerNotification = true + end) + + local gdiForces = GDI.GetActors() + Utils.Do(gdiForces, function(a) + if a.Type ~= "player" then + a.Owner = Greece + end + end) + + Trigger.AfterDelay(1, function() + Actor.Create("QueueUpdaterDummy", true, { Owner = Greece }) + end) +end + +UpdateReinforcementCountdown = function() + if not IsHoldOutComplete and (not IsPrisonRevealed or (ObjectiveCapturePrison ~= nil and Greece.IsObjectiveCompleted(ObjectiveCapturePrison))) then + UserInterface.SetMissionText("Hold out until reinforcements arrive: " .. UtilsCA.FormatTimeForGameSpeed(TimerTicks), HSLColor.Yellow) + end +end + +HoldOutComplete = function() + if not IsHoldOutComplete then + IsHoldOutComplete = true + + if ObjectiveLocateCommander == nil then + ObjectiveLocateCommander = Greece.AddObjective("Locate the GDI commander.") + UserInterface.SetMissionText("Locate the GDI commander.", HSLColor.Yellow) + end + + Greece.MarkCompletedObjective(ObjectiveHoldOut) + + if ObjectiveCapturePrison == nil or not Greece.IsObjectiveCompleted(ObjectiveCapturePrison) then + Trigger.AfterDelay(DateTime.Seconds(1), function() + PlaySpeechNotificationToMissionPlayers("ReinforcementsArrived") + Notification("Reinforcements have arrived.") + DoMcvArrival() + Beacon.New(Greece, McvRally.CenterPosition) + end) + end + + if Difficulty == "brutal" then + Trigger.AfterDelay(DateTime.Minutes(10), function() + Actor.Create("ai.superweapons.enabled", true, { Owner = USSR }) + end) + end + end +end + +-- overridden in co-op version +DoMcvArrival = function() + Reinforcements.Reinforce(Greece, { "2tnk", "mcv", "2tnk" }, { McvEntry.Location, McvRally.Location }, 75) +end + +RevealPrison = function() + if not IsPrisonRevealed then + Beacon.New(Greece, GDICommanderSpawn.CenterPosition) + + if ObjectiveLocateCommander == nil then + ObjectiveLocateCommander = Greece.AddObjective("Locate the GDI commander.") + end + + Trigger.AfterDelay(DateTime.Seconds(1), function() + ObjectiveCapturePrison = Greece.AddObjective("Take control of prison and rescue GDI commander.") + + if not Greece.IsObjectiveCompleted(ObjectiveLocateCommander) then + Greece.MarkCompletedObjective(ObjectiveLocateCommander) + end + + UserInterface.SetMissionText("Take control of prison and rescue GDI commander.", HSLColor.Yellow) + PrisonCamera = Actor.Create("camera.paradrop", true, { Owner = Greece, Location = SovietPrison.Location }) + + Trigger.AfterDelay(DateTime.Seconds(5), function() + PrisonCamera.Destroy() + end) + end) + + IsPrisonRevealed = true + end +end + +InitUSSR = function() + if Difficulty == "easy" then + RebuildExcludes.USSR = { Types = { "tsla", "ftur" }, Actors = { NorthSAM1, NorthSAM2 } } + elseif Difficulty == "normal" then + RebuildExcludes.USSR = { Types = { "tsla" }, Actors = { NorthSAM1, NorthSAM2 } } + end + + AutoRepairAndRebuildBuildings(USSR, 15) + SetupRefAndSilosCaptureCredits(USSR) + AutoReplaceHarvesters(USSR) + AutoRebuildConyards(USSR) + InitAiUpgrades(USSR) + InitUSSRPatrols() + + local ussrGroundAttackers = USSR.GetGroundAttackers() + + Utils.Do(ussrGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsUSSRGroundHunterUnit) + end) + + -- If main sub pens are destroyed, update naval attack path + Utils.Do({ SovietSouthSubPen1, SovietSouthSubPen2 }, function(a) + Trigger.OnRemovedFromWorld(a, function(self) + if SovietSouthSubPen1.IsDead and SovietSouthSubPen2.IsDead and not SovietNorthSubPen.IsDead then + Squads.Naval.AttackPaths = SovietNavalFallbackAttackPaths + Squads.Naval.ProducerActors.Ships = { SovietNorthSubPen } + end + end) + end) + + local hinds = USSR.GetActorsByType("hind") + Utils.Do(hinds, function(a) + Trigger.OnDamaged(a, function(self, attacker, damage) + if not self.IsDead and self.AmmoCount() == 0 then + Trigger.ClearAll(self) + self.Stop() + self.ReturnToBase() + Trigger.AfterDelay(DateTime.Seconds(1), function() + if not self.IsDead then + self.Patrol(SovietHindPatrolPath, true) + end + end) + end + end) + end) +end + +InitUSSRPatrols = function() + local centerPatrollers = { SovietCenterPatroller1, SovietCenterPatroller2, SovietCenterPatroller3, SovietCenterPatroller4, SovietCenterPatroller5, SovietCenterPatroller6, SovietCenterPatroller7, SovietCenterPatroller8 } + local shorePatrollers = { SovietShorePatroller1, SovietShorePatroller2, SovietShorePatroller3, SovietShorePatroller4, SovietShorePatroller5, SovietShorePatroller6, SovietShorePatroller7 } + local hindPatrollers = { SovietHindPatroller1, SovietHindPatroller2 } + + Utils.Do(centerPatrollers, function(unit) + if not unit.IsDead then + unit.Patrol(SovietCenterPatrolPath, true, 100) + end + end) + + Utils.Do(shorePatrollers, function(unit) + if not unit.IsDead then + unit.Patrol(SovietShorePatrolPath, true, 100) + end + end) + + Utils.Do(hindPatrollers, function(unit) + if not unit.IsDead then + unit.Patrol(SovietHindPatrolPath, true) + end + end) +end + +InitUSSRAttacks = function() + Trigger.AfterDelay(DateTime.Seconds(4), function() + local siegeUnits = Map.ActorsInBox(SiegeUnitsBoxTopLeft.CenterPosition, SiegeUnitsBoxBottomRight.CenterPosition, function(a) + return a.Owner == USSR and not a.IsDead and a.HasProperty("Hunt") + end) + + Utils.Do(siegeUnits, function(a) + a.Hunt() + end) + end) + + InitAttackSquad(Squads.Main, USSR) + InitAttackSquad(Squads.Northern, USSR) + InitAirAttackSquad(Squads.Migs, USSR) + InitNavalAttackSquad(Squads.Naval, USSR) + + Trigger.AfterDelay(HaloDropStart, DoHaloDrop) + Trigger.AfterDelay(NavalDropStart, DoNavalDrop) +end + +DoHaloDrop = function() + local entryPath + + if SovietNorthFactory.IsDead or SovietNorthFactory.Owner ~= USSR then + entryPath = Utils.Random(LateHaloDropPaths) + else + entryPath = Utils.Random(HaloDropPaths) + end + + local haloDropUnits = { "e1", "e1", "e1", "e2", "e3", "e4" } + + if IsHardOrAbove() and DateTime.GameTime > DateTime.Minutes(15) then + haloDropUnits = { "e1", "e1", "e1", "e1", "e2", "e2", "e3", "e3", "e4", "shok" } + end + + DoHelicopterDrop(USSR, entryPath, "halo.paradrop", haloDropUnits, AssaultPlayerBaseOrHunt, function(t) + Trigger.AfterDelay(DateTime.Seconds(5), function() + if not t.IsDead then + t.Move(entryPath[1]) + t.Destroy() + end + end) + end) + + local delayUntilNext = CalculateInterval(GetTotalCostOfUnits(haloDropUnits), HaloDropAttackValue, HaloDropStart) + Trigger.AfterDelay(delayUntilNext, DoHaloDrop) +end + +DoNavalDrop = function() + if SovietSouthSubPen1.IsDead and SovietSouthSubPen2.IsDead then + return + end + + local navalDropPath = Utils.Random(NavalDropPaths) + local navalDropExitPath = { navalDropPath[2], navalDropPath[1] } + local navalDropUnits = { "3tnk", "btr.ai" } + + if Difficulty == "normal" then + navalDropUnits = { "3tnk", "v2rl", "btr.ai" } + elseif IsHardOrAbove() then + if DateTime.GameTime > DateTime.Minutes(18) then + navalDropUnits = { "3tnk", "v3rl", "3tnk", "btr.ai" } + else + navalDropUnits = { "3tnk", "v2rl", "3tnk", "btr.ai" } + end + end + + DoNavalTransportDrop(USSR, navalDropPath, navalDropExitPath, "lst", navalDropUnits, AssaultPlayerBaseOrHunt) + + local delayUntilNext = CalculateInterval(GetTotalCostOfUnits(navalDropUnits), NavalDropAttackValue, NavalDropStart) + Trigger.AfterDelay(delayUntilNext, DoNavalDrop) +end + +NavalReinforcements = function() + if not NavalReinforcementsArrived and PlayerHasNavalProduction(Greece) then + NavalReinforcementsArrived = true + Trigger.AfterDelay(DateTime.Seconds(5), function() + local cruisers = { "ca", "ca" } + + if IsHardOrAbove() then + cruisers = { "ca" } + end + + local destroyers = { "dd", "dd", "dd" } + + if Difficulty == "easy" then + destroyers = { "dd", "dd", "dd", "dd" } + end + + PlaySpeechNotificationToMissionPlayers("ReinforcementsArrived") + Beacon.New(Greece, CruiserSpawn.CenterPosition) + Reinforcements.Reinforce(Greece, cruisers, { CruiserSpawn.Location, CruiserDestination.Location }, 75) + Reinforcements.Reinforce(Greece, destroyers, { DestroyerSpawn.Location, DestroyerDestination.Location }, 75) + end) + end +end diff --git a/mods/ca/missions/main-campaign/ca03-deliverance/gdi-palette.yaml b/mods/ca/missions/main-campaign/ca03-deliverance/gdi-palette.yaml new file mode 100644 index 0000000000..c17ee888eb --- /dev/null +++ b/mods/ca/missions/main-campaign/ca03-deliverance/gdi-palette.yaml @@ -0,0 +1,35 @@ +# Palette overrides so GDI forces are gold regardless of player color + +^TDPalette: + RenderSprites: + Palette: temptd + +^GDIInfantry: + RenderSprites: + Palette: temptd + WithDeathAnimation: + DeathSequencePalette: temptd + DeathPaletteIsPlayerPalette: false + CrushedSequencePalette: temptd + CrushedPaletteIsPlayerPalette: false + +^BuildingTD: + WithDeathAnimation: + DeathSequencePalette: temptd + DeathPaletteIsPlayerPalette: false + +N1: + Inherits@GDIPAL: ^GDIInfantry + +N2: + Inherits@GDIPAL: ^GDIInfantry + +N3: + Inherits@GDIPAL: ^GDIInfantry + +N6: + Inherits@GDIPAL: ^GDIInfantry + +CRYO: + RenderSprites: + -Palette: diff --git a/mods/ca/missions/main-campaign/ca03-deliverance/map.bin b/mods/ca/missions/main-campaign/ca03-deliverance/map.bin new file mode 100644 index 0000000000..c8ceda0f3c Binary files /dev/null and b/mods/ca/missions/main-campaign/ca03-deliverance/map.bin differ diff --git a/mods/ca/missions/main-campaign/ca03-deliverance/map.png b/mods/ca/missions/main-campaign/ca03-deliverance/map.png new file mode 100644 index 0000000000..c9ea42a2c8 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca03-deliverance/map.png differ diff --git a/mods/ca/missions/main-campaign/ca03-deliverance/map.yaml b/mods/ca/missions/main-campaign/ca03-deliverance/map.yaml new file mode 100644 index 0000000000..c6b7814e35 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca03-deliverance/map.yaml @@ -0,0 +1,3713 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 03: Deliverance + +Author: Darkademic + +Tileset: WINTER + +MapSize: 130,98 + +Bounds: 1,1,128,96 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + PlayerReference@Greece: + Name: Greece + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: allies + LockColor: True + Color: 99ACF2 + LockSpawn: True + LockTeam: True + Enemies: USSR, Creeps + PlayerReference@GDI: + Name: GDI + NonCombatant: True + Faction: gdi + Color: F2CF74 + Allies: Neutral + Enemies: Creeps + PlayerReference@USSR: + Name: USSR + Bot: campaign + Faction: soviet + Color: FE1100 + Enemies: Greece, Creeps + +Actors: + Actor3: sbag + Owner: GDI + Location: 29,50 + Actor4: sbag + Owner: GDI + Location: 30,50 + Actor5: sbag + Owner: GDI + Location: 31,50 + Actor6: sbag + Owner: GDI + Location: 32,50 + Actor7: sbag + Owner: GDI + Location: 32,49 + Actor8: sbag + Owner: GDI + Location: 32,48 + Actor11: sbag + Owner: GDI + Location: 32,43 + Actor12: sbag + Owner: GDI + Location: 32,42 + Actor13: sbag + Owner: GDI + Location: 31,42 + Actor14: sbag + Owner: GDI + Location: 30,42 + Actor15: sbag + Owner: GDI + Location: 29,42 + Actor16: sbag + Owner: GDI + Location: 28,42 + Actor17: sbag + Owner: GDI + Location: 27,42 + Actor18: sbag + Owner: GDI + Location: 25,42 + Actor19: sbag + Owner: GDI + Location: 26,42 + Actor20: sbag + Owner: GDI + Location: 24,42 + Actor24: sbag + Owner: GDI + Location: 17,42 + Actor25: sbag + Owner: GDI + Location: 16,42 + Actor26: sbag + Owner: GDI + Location: 15,42 + Actor27: sbag + Owner: GDI + Location: 14,42 + Actor28: sbag + Owner: GDI + Location: 13,42 + Actor29: sbag + Owner: GDI + Location: 12,42 + Actor30: sbag + Owner: GDI + Location: 12,43 + Actor31: sbag + Owner: GDI + Location: 12,44 + Actor32: sbag + Owner: GDI + Location: 12,45 + Actor33: sbag + Owner: GDI + Location: 12,49 + Actor34: sbag + Owner: GDI + Location: 12,50 + Actor35: sbag + Owner: GDI + Location: 12,51 + Actor36: sbag + Owner: GDI + Location: 12,52 + Actor37: sbag + Owner: GDI + Location: 12,53 + Actor38: sbag + Owner: GDI + Location: 12,54 + Actor39: sbag + Owner: GDI + Location: 12,55 + Actor40: sbag + Owner: GDI + Location: 12,56 + Actor41: sbag + Owner: GDI + Location: 13,56 + Actor42: sbag + Owner: GDI + Location: 15,56 + Actor43: sbag + Owner: GDI + Location: 14,56 + Actor44: sbag + Owner: GDI + Location: 16,56 + Actor45: sbag + Owner: GDI + Location: 17,56 + Actor46: sbag + Owner: GDI + Location: 23,56 + Actor55: sbag + Owner: GDI + Location: 26,59 + Actor56: sbag + Owner: GDI + Location: 25,59 + Actor57: sbag + Owner: GDI + Location: 27,59 + Actor58: sbag + Owner: GDI + Location: 28,59 + Actor60: sbag + Owner: GDI + Location: 30,59 + Actor61: sbag + Owner: GDI + Location: 29,59 + Actor64: sbag + Owner: GDI + Location: 31,59 + Actor65: sbag + Owner: GDI + Location: 31,58 + Actor66: sbag + Owner: GDI + Location: 31,55 + Actor67: sbag + Owner: GDI + Location: 31,54 + Actor59: sbag + Owner: GDI + Location: 24,56 + Actor62: sbag + Owner: GDI + Location: 24,57 + Actor68: sbag + Owner: GDI + Location: 24,58 + Actor69: sbag + Owner: GDI + Location: 25,58 + Actor21: sbag + Owner: GDI + Location: 23,42 + Actor10: sbag + Owner: GDI + Location: 32,44 + Actor63: htnk + Location: 19,44 + Owner: GDI + Facing: 927 + Health: 28 + Actor70: htnk + Location: 29,48 + Owner: GDI + Health: 38 + Facing: 904 + Actor72: gtwr + Owner: GDI + Location: 33,49 + Health: 45 + Actor73: gtwr + Owner: GDI + Location: 33,43 + Health: 84 + Actor74: gtwr + Owner: GDI + Location: 24,41 + Health: 68 + Actor75: gtwr + Owner: GDI + Location: 16,41 + Health: 34 + GDIBarracks: pyle + Owner: GDI + Location: 16,45 + Health: 37 + Actor77: nuk2 + Owner: GDI + Location: 13,53 + Health: 44 + Actor78: nuk2 + Owner: GDI + Location: 15,53 + Health: 44 + GDIRefinery: proc.td + Owner: GDI + Location: 19,50 + FreeActor: False + Health: 39 + GDICommsCenter: hq + Owner: GDI + Location: 14,49 + Health: 44 + GDISilo1: silo.td + Owner: GDI + Location: 26,43 + Health: 41 + GDISilo2: silo.td + Owner: GDI + Location: 29,43 + Health: 44 + GDIFactory: weap.td + Owner: GDI + Location: 24,51 + Health: 41 + GDIRepairFacility: rep + Owner: GDI + Location: 23,46 + Health: 38 + GDIHelipad: hpad.td + Owner: GDI + Location: 27,56 + Health: 48 + Actor85: harv.td + Owner: GDI + Location: 19,53 + Facing: 384 + Health: 74 + Actor86: hmmv + Owner: GDI + Location: 27,45 + Facing: 602 + Actor87: apc2 + Owner: GDI + Location: 24,44 + Facing: 142 + Health: 72 + Actor88: msam + Owner: GDI + Location: 19,48 + Facing: 896 + Health: 45 + Actor89: mtnk + Owner: GDI + Location: 30,49 + Facing: 896 + Health: 44 + Actor90: mtnk + Owner: GDI + Location: 22,44 + Facing: 1023 + Health: 58 + Actor91: n1 + Owner: GDI + SubCell: 3 + Location: 20,45 + Facing: 951 + Actor92: n1 + Owner: GDI + Facing: 384 + Location: 20,45 + SubCell: 1 + Actor93: n1 + Owner: GDI + SubCell: 3 + Location: 17,43 + Facing: 1023 + Actor94: n1 + Owner: GDI + Location: 24,43 + SubCell: 3 + Facing: 222 + Health: 76 + Actor95: n1 + Owner: GDI + SubCell: 3 + Location: 32,45 + Facing: 745 + Actor96: n1 + Owner: GDI + Location: 32,45 + SubCell: 1 + Facing: 888 + Actor97: n1 + Owner: GDI + SubCell: 3 + Location: 31,48 + Facing: 1023 + Actor98: n1 + Owner: GDI + SubCell: 3 + Location: 28,45 + Facing: 911 + Actor99: n1 + Owner: GDI + Facing: 384 + Location: 28,45 + SubCell: 1 + Actor100: n2 + Owner: GDI + SubCell: 3 + Location: 27,48 + Facing: 384 + Health: 86 + Actor101: n2 + Owner: GDI + SubCell: 3 + Location: 20,46 + Health: 75 + Facing: 610 + Actor102: split2 + Owner: Neutral + Location: 13,60 + Actor103: split2 + Owner: Neutral + Location: 7,74 + Actor104: split2 + Owner: Neutral + Location: 6,65 + Actor105: gtwr + Owner: GDI + Location: 16,57 + Actor106: gtwr + Owner: GDI + Location: 32,58 + Health: 87 + Actor109: 2tnk + Owner: Greece + Facing: 0 + Location: 19,90 + Actor136: ifv + Owner: Greece + Location: 17,90 + Facing: 0 + Actor137: ifv + Owner: Greece + Facing: 0 + Location: 21,90 + Actor170: tc02 + Owner: Neutral + Location: 11,85 + Actor171: t16 + Owner: Neutral + Location: 17,79 + Actor172: t03 + Owner: Neutral + Location: 14,90 + Actor173: t05 + Owner: Neutral + Location: 12,86 + Actor174: tc04 + Owner: Neutral + Location: 8,84 + Actor175: t16 + Owner: Neutral + Location: 5,84 + Actor176: tc01 + Owner: Neutral + Location: 4,80 + Actor177: t14 + Owner: Neutral + Location: 5,82 + Actor178: t10 + Owner: Neutral + Location: 16,82 + Actor179: t03 + Owner: Neutral + Location: 19,77 + Actor180: t07 + Owner: Neutral + Location: 24,81 + Actor181: tc05 + Owner: Neutral + Location: 25,85 + Actor198: e1 + Owner: Greece + SubCell: 1 + Facing: 0 + Location: 18,91 + Actor199: e1 + Owner: Greece + SubCell: 2 + Facing: 0 + Location: 18,91 + Actor200: e1 + Owner: Greece + SubCell: 4 + Facing: 0 + Location: 18,91 + Actor202: e1 + Owner: Greece + SubCell: 1 + Facing: 0 + Location: 20,91 + Actor203: e1 + Owner: Greece + SubCell: 2 + Facing: 0 + Location: 20,91 + Actor207: e3 + Owner: Greece + Location: 18,93 + SubCell: 1 + Facing: 0 + Actor208: e3 + Owner: Greece + Location: 18,93 + SubCell: 2 + Facing: 0 + Actor206: e3 + Owner: Greece + SubCell: 1 + Facing: 0 + Location: 20,93 + Actor211: e3 + Owner: Greece + SubCell: 2 + Facing: 0 + Location: 20,93 + PlayerStart: waypoint + Owner: Neutral + Location: 19,90 + Actor217: tc01 + Owner: Neutral + Faction: germany + Location: 42,94 + Actor218: tc04 + Owner: Neutral + Faction: germany + Location: 38,94 + Actor219: tc02 + Owner: Neutral + Faction: germany + Location: 37,73 + Actor220: t10 + Owner: Neutral + Faction: germany + Location: 57,70 + Actor221: t14 + Owner: Neutral + Faction: germany + Location: 57,94 + Actor222: t15 + Owner: Neutral + Faction: germany + Location: 59,87 + Actor223: tc04 + Owner: Neutral + Faction: germany + Location: 46,92 + Actor225: v06 + Owner: Neutral + Location: 39,67 + Actor227: v16 + Owner: Neutral + Location: 41,68 + Actor228: v16 + Owner: Neutral + Location: 40,68 + Actor226: wood + Owner: Neutral + Location: 39,68 + Actor229: wood + Owner: Neutral + Location: 39,69 + Actor230: wood + Owner: Neutral + Location: 40,69 + Actor231: wood + Owner: Neutral + Location: 41,69 + Actor232: wood + Owner: Neutral + Location: 42,69 + Actor233: wood + Owner: Neutral + Location: 42,68 + Actor234: wood + Owner: Neutral + Location: 42,67 + Actor235: wood + Owner: Neutral + Location: 41,67 + Actor236: wood + Owner: Neutral + Location: 39,66 + Actor237: wood + Owner: Neutral + Location: 39,65 + Actor238: wood + Owner: Neutral + Location: 38,65 + Actor239: v07 + Owner: Neutral + Location: 41,71 + Actor240: v03 + Owner: Neutral + Location: 35,69 + Actor241: v11 + Owner: Neutral + Location: 47,61 + Actor242: v02 + Owner: Neutral + Location: 39,62 + Actor243: v05 + Owner: Neutral + Location: 31,64 + Actor244: t03 + Owner: Neutral + Location: 34,68 + Actor245: t10 + Owner: Neutral + Location: 43,64 + Actor246: t08 + Owner: Neutral + Location: 48,61 + Actor247: t01 + Owner: Neutral + Location: 25,64 + SovietSouthSubPen1: spen + Owner: USSR + Location: 104,80 + SovietSouthSubPen2: spen + Owner: USSR + Location: 106,84 + Actor250: brik + Owner: USSR + Location: 100,78 + Actor251: brik + Owner: USSR + Location: 94,77 + Actor252: brik + Owner: USSR + Location: 94,78 + Actor253: brik + Owner: USSR + Location: 95,77 + Actor254: brik + Owner: USSR + Location: 95,78 + Actor255: brik + Owner: USSR + Location: 96,78 + Actor256: brik + Owner: USSR + Location: 97,78 + Actor257: brik + Owner: USSR + Location: 98,78 + Actor258: brik + Owner: USSR + Location: 99,78 + Actor259: brik + Owner: USSR + Location: 101,78 + Actor260: brik + Owner: USSR + Location: 101,77 + Actor261: brik + Owner: USSR + Location: 102,77 + Actor262: brik + Owner: USSR + Location: 103,77 + Actor263: brik + Owner: USSR + Location: 103,76 + Actor264: brik + Owner: USSR + Location: 102,76 + Actor265: brik + Owner: USSR + Location: 88,76 + Actor266: brik + Owner: USSR + Location: 88,75 + Actor267: brik + Owner: USSR + Location: 87,75 + Actor268: brik + Owner: USSR + Location: 87,76 + Actor269: brik + Owner: USSR + Location: 86,76 + Actor270: brik + Owner: USSR + Location: 85,76 + Actor271: brik + Owner: USSR + Location: 85,75 + Actor272: brik + Owner: USSR + Location: 85,74 + Actor273: brik + Owner: USSR + Location: 85,73 + Actor274: brik + Owner: USSR + Location: 85,72 + Actor275: brik + Owner: USSR + Location: 85,70 + Actor276: brik + Owner: USSR + Location: 85,71 + Actor277: brik + Owner: USSR + Location: 85,69 + Actor278: brik + Owner: USSR + Location: 85,68 + Actor279: brik + Owner: USSR + Location: 86,68 + Actor280: brik + Owner: USSR + Location: 86,69 + Actor286: brik + Owner: USSR + Location: 85,60 + Actor287: brik + Owner: USSR + Location: 85,59 + Actor288: brik + Owner: USSR + Location: 85,58 + Actor289: brik + Owner: USSR + Location: 86,58 + Actor290: brik + Owner: USSR + Location: 87,58 + Actor291: brik + Owner: USSR + Location: 88,58 + Actor292: brik + Owner: USSR + Location: 89,58 + Actor305: brik + Owner: USSR + Location: 102,58 + Actor306: brik + Owner: USSR + Location: 110,78 + Actor307: brik + Owner: USSR + Location: 110,77 + Actor308: brik + Owner: USSR + Location: 111,77 + Actor309: brik + Owner: USSR + Location: 111,78 + Actor310: brik + Owner: USSR + Location: 111,76 + Actor311: brik + Owner: USSR + Location: 111,75 + Actor312: brik + Owner: USSR + Location: 111,74 + Actor313: brik + Owner: USSR + Location: 111,73 + Actor314: brik + Owner: USSR + Location: 111,72 + Actor315: brik + Owner: USSR + Location: 110,72 + Actor316: brik + Owner: USSR + Location: 110,73 + Actor317: brik + Owner: USSR + Location: 110,66 + Actor318: brik + Owner: USSR + Location: 110,65 + Actor319: brik + Owner: USSR + Location: 111,65 + Actor320: brik + Owner: USSR + Location: 111,66 + Actor321: brik + Owner: USSR + Location: 111,64 + Actor322: brik + Owner: USSR + Location: 111,63 + Actor323: brik + Owner: USSR + Location: 111,62 + Actor324: brik + Owner: USSR + Location: 111,61 + Actor325: brik + Owner: USSR + Location: 111,60 + Actor326: brik + Owner: USSR + Location: 111,59 + Actor327: brik + Owner: USSR + Location: 104,58 + Actor328: brik + Owner: USSR + Location: 103,58 + Actor329: brik + Owner: USSR + Location: 105,58 + Actor330: brik + Owner: USSR + Location: 107,58 + Actor331: brik + Owner: USSR + Location: 106,58 + Actor332: brik + Owner: USSR + Location: 108,58 + Actor333: brik + Owner: USSR + Location: 109,58 + Actor334: brik + Owner: USSR + Location: 109,58 + Actor335: brik + Owner: USSR + Location: 111,58 + Actor336: brik + Owner: USSR + Location: 110,58 + Actor337: fact + Owner: USSR + Location: 98,74 + Actor340: proc + Owner: USSR + Location: 105,63 + Actor341: proc + Owner: USSR + Location: 105,68 + Actor342: sam + Owner: USSR + Location: 95,75 + Actor343: sam + Owner: USSR + Location: 87,73 + Actor345: sam + Owner: USSR + Location: 79,79 + Actor346: sam + Owner: USSR + Location: 97,84 + Actor347: sam + Owner: USSR + Location: 108,60 + Actor348: sam + Owner: USSR + Location: 108,75 + Actor349: tsla + Owner: USSR + Location: 86,75 + Actor350: tsla + Owner: USSR + Location: 96,77 + Actor351: tsla + Owner: USSR + Location: 86,70 + Actor355: tsla + Owner: USSR + Location: 110,64 + Actor356: tsla + Owner: USSR + Location: 110,74 + Actor344: sam + Owner: USSR + Location: 88,60 + Actor353: brik + Owner: USSR + Location: 90,58 + Actor357: brik + Owner: USSR + Location: 91,58 + Actor358: brik + Owner: USSR + Location: 92,58 + Actor359: brik + Owner: USSR + Location: 93,58 + Actor360: tsla + Owner: USSR + Location: 91,59 + Actor361: brik + Owner: USSR + Location: 92,59 + Actor362: brik + Owner: USSR + Location: 93,59 + Actor369: ftur + Owner: USSR + Location: 93,57 + Actor372: ftur + Owner: USSR + Location: 84,68 + Actor373: ftur + Owner: USSR + Location: 88,77 + Actor374: ftur + Owner: USSR + Location: 93,78 + Actor377: apwr + Owner: USSR + Location: 95,69 + Actor378: apwr + Owner: USSR + Location: 95,66 + Actor379: apwr + Owner: USSR + Location: 95,63 + Actor376: stek + Owner: USSR + Location: 100,70 + Actor375: dome + Owner: USSR + Location: 101,66 + Actor383: fix + Owner: USSR + Location: 104,73 + Actor384: tsla + Owner: USSR + Location: 112,88 + Actor385: sam + Owner: USSR + Location: 114,87 + Actor386: sam + Owner: USSR + Location: 118,30 + Actor390: sam + Owner: USSR + Location: 112,14 + Actor392: tsla + Owner: USSR + Location: 112,12 + Actor398: chain + Owner: USSR + Location: 121,18 + Actor399: chain + Owner: USSR + Location: 122,18 + Actor400: chain + Owner: USSR + Location: 123,18 + Actor401: chain + Owner: USSR + Location: 124,18 + Actor402: chain + Owner: USSR + Location: 125,18 + Actor403: chain + Owner: USSR + Location: 126,18 + Actor404: chain + Owner: USSR + Location: 127,18 + Actor406: chain + Owner: USSR + Location: 121,19 + Actor407: chain + Owner: USSR + Location: 127,19 + SovietPrison: miss + Owner: USSR + Location: 123,20 + Actor410: chain + Owner: USSR + Location: 127,20 + Actor411: chain + Owner: USSR + Location: 127,21 + Actor412: chain + Owner: USSR + Location: 127,22 + Actor414: chain + Owner: USSR + Location: 121,23 + Actor415: chain + Owner: USSR + Location: 127,23 + Actor421: chain + Owner: USSR + Location: 121,24 + Actor422: chain + Owner: USSR + Location: 122,24 + Actor423: chain + Owner: USSR + Location: 123,24 + Actor424: chain + Owner: USSR + Location: 124,24 + Actor425: chain + Owner: USSR + Location: 125,24 + Actor426: chain + Owner: USSR + Location: 126,24 + Actor427: chain + Owner: USSR + Location: 127,24 + SovietNorthSubPen: spen + Owner: USSR + Location: 124,8 + Actor363: ftur + Owner: USSR + Location: 97,57 + Actor364: brik + Owner: USSR + Location: 97,58 + Actor365: brik + Owner: USSR + Location: 98,58 + Actor366: brik + Owner: USSR + Location: 99,58 + Actor367: brik + Owner: USSR + Location: 100,58 + Actor368: brik + Owner: USSR + Location: 101,58 + Actor370: brik + Owner: USSR + Location: 97,59 + Actor435: brik + Owner: USSR + Location: 98,59 + Actor436: tsla + Owner: USSR + Location: 99,59 + Actor380: apwr + Owner: USSR + Location: 104,59 + Actor381: apwr + Owner: USSR + Location: 101,59 + SovietMainBarracks2: barr + Owner: USSR + Location: 100,62 + Actor371: brik + Owner: USSR + Location: 85,61 + Actor438: brik + Owner: USSR + Location: 85,62 + Actor439: tsla + Owner: USSR + Location: 86,62 + Actor440: brik + Owner: USSR + Location: 85,63 + Actor441: brik + Owner: USSR + Location: 86,63 + Actor442: ftur + Owner: USSR + Location: 84,64 + Actor443: brik + Owner: USSR + Location: 85,64 + Actor444: brik + Owner: USSR + Location: 86,64 + Actor445: brik + Owner: USSR + Location: 93,38 + Actor446: brik + Owner: USSR + Location: 97,38 + Actor447: brik + Owner: USSR + Location: 97,37 + Actor448: brik + Owner: USSR + Location: 93,37 + Actor449: brik + Owner: USSR + Location: 92,38 + Actor450: brik + Owner: USSR + Location: 92,37 + Actor451: brik + Owner: USSR + Location: 98,37 + Actor452: brik + Owner: USSR + Location: 98,38 + Actor453: brik + Owner: USSR + Location: 99,38 + Actor454: brik + Owner: USSR + Location: 100,38 + Actor455: brik + Owner: USSR + Location: 101,38 + Actor456: brik + Owner: USSR + Location: 102,38 + Actor457: brik + Owner: USSR + Location: 102,37 + Actor475: brik + Owner: USSR + Location: 91,38 + Actor476: brik + Owner: USSR + Location: 89,38 + Actor477: brik + Owner: USSR + Location: 90,38 + Actor478: brik + Owner: USSR + Location: 88,38 + Actor479: brik + Owner: USSR + Location: 87,38 + Actor480: brik + Owner: USSR + Location: 86,38 + Actor481: brik + Owner: USSR + Location: 86,37 + Actor482: brik + Owner: USSR + Location: 86,36 + Actor464: brik + Owner: USSR + Location: 86,35 + Actor465: brik + Owner: USSR + Location: 86,34 + Actor466: brik + Owner: USSR + Location: 86,33 + Actor467: brik + Owner: USSR + Location: 86,32 + Actor468: brik + Owner: USSR + Location: 87,32 + Actor469: brik + Owner: USSR + Location: 87,33 + Actor470: brik + Owner: USSR + Location: 86,28 + Actor471: brik + Owner: USSR + Location: 87,28 + Actor472: brik + Owner: USSR + Location: 86,27 + Actor473: brik + Owner: USSR + Location: 87,27 + Actor474: brik + Owner: USSR + Location: 86,26 + Actor485: brik + Owner: USSR + Location: 86,25 + Actor486: brik + Owner: USSR + Location: 87,25 + Actor487: brik + Owner: USSR + Location: 88,25 + Actor488: brik + Owner: USSR + Location: 89,25 + Actor489: brik + Owner: USSR + Location: 90,25 + Actor490: brik + Owner: USSR + Location: 91,25 + Actor491: brik + Owner: USSR + Location: 92,25 + Actor492: brik + Owner: USSR + Location: 92,26 + Actor493: brik + Owner: USSR + Location: 91,26 + Actor495: apwr + Owner: USSR + Location: 88,26 + Actor496: apwr + Owner: USSR + Location: 91,28 + Actor497: apwr + Owner: USSR + Location: 94,31 + Actor501: ftur + Owner: USSR + Location: 85,28 + Actor502: ftur + Owner: USSR + Location: 85,32 + Actor503: ftur + Owner: USSR + Location: 93,39 + Actor504: ftur + Owner: USSR + Location: 97,39 + SovietEastBarracks: barr + Owner: USSR + Location: 89,33 + Actor508: mine + Owner: Neutral + Faction: russia + Location: 102,53 + Actor509: mine + Owner: Neutral + Faction: russia + Location: 104,48 + Actor510: mine + Owner: Neutral + Faction: russia + Location: 100,43 + Actor511: mine + Owner: Neutral + Faction: russia + Location: 110,52 + Actor512: ftur + Owner: USSR + Location: 112,66 + Actor513: ftur + Owner: USSR + Location: 112,72 + Actor515: sam + Owner: USSR + Location: 123,13 + Actor517: brik + Owner: USSR + Location: 42,15 + Actor518: brik + Owner: USSR + Location: 42,14 + Actor519: brik + Owner: USSR + Location: 41,14 + Actor520: brik + Owner: USSR + Location: 41,15 + Actor521: brik + Owner: USSR + Location: 46,14 + Actor522: brik + Owner: USSR + Location: 46,15 + Actor523: brik + Owner: USSR + Location: 47,15 + Actor524: brik + Owner: USSR + Location: 47,14 + Actor525: brik + Owner: USSR + Location: 48,15 + Actor526: brik + Owner: USSR + Location: 49,15 + Actor527: brik + Owner: USSR + Location: 50,15 + Actor528: brik + Owner: USSR + Location: 51,15 + Actor529: brik + Owner: USSR + Location: 52,15 + Actor530: brik + Owner: USSR + Location: 40,15 + Actor531: brik + Owner: USSR + Location: 39,15 + Actor532: brik + Owner: USSR + Location: 38,15 + Actor533: brik + Owner: USSR + Location: 37,15 + Actor534: brik + Owner: USSR + Location: 36,15 + Actor535: brik + Owner: USSR + Location: 36,14 + Actor536: brik + Owner: USSR + Location: 36,12 + Actor537: brik + Owner: USSR + Location: 36,13 + Actor538: brik + Owner: USSR + Location: 36,10 + Actor539: brik + Owner: USSR + Location: 36,11 + Actor540: brik + Owner: USSR + Location: 36,9 + Actor541: brik + Owner: USSR + Location: 36,8 + Actor542: brik + Owner: USSR + Location: 36,7 + Actor543: brik + Owner: USSR + Location: 36,6 + Actor544: brik + Owner: USSR + Location: 36,5 + Actor545: brik + Owner: USSR + Location: 36,4 + Actor546: brik + Owner: USSR + Location: 36,3 + Actor547: brik + Owner: USSR + Location: 36,2 + Actor548: brik + Owner: USSR + Location: 36,1 + Actor549: brik + Owner: USSR + Location: 37,1 + Actor550: brik + Owner: USSR + Location: 39,1 + Actor551: brik + Owner: USSR + Location: 38,1 + Actor552: brik + Owner: USSR + Location: 40,1 + Actor553: brik + Owner: USSR + Location: 41,1 + Actor554: brik + Owner: USSR + Location: 42,1 + Actor555: brik + Owner: USSR + Location: 43,1 + Actor556: brik + Owner: USSR + Location: 44,1 + Actor557: brik + Owner: USSR + Location: 45,1 + Actor558: brik + Owner: USSR + Location: 46,1 + Actor559: brik + Owner: USSR + Location: 53,15 + Actor560: brik + Owner: USSR + Location: 53,14 + Actor561: brik + Owner: USSR + Location: 53,12 + Actor562: brik + Owner: USSR + Location: 53,13 + Actor563: brik + Owner: USSR + Location: 53,11 + Actor564: brik + Owner: USSR + Location: 53,10 + Actor565: brik + Owner: USSR + Location: 52,10 + Actor566: brik + Owner: USSR + Location: 52,11 + Actor567: brik + Owner: USSR + Location: 52,6 + Actor568: brik + Owner: USSR + Location: 53,6 + Actor569: brik + Owner: USSR + Location: 52,5 + Actor570: brik + Owner: USSR + Location: 53,5 + Actor571: brik + Owner: USSR + Location: 53,4 + Actor572: brik + Owner: USSR + Location: 53,3 + Actor573: brik + Owner: USSR + Location: 53,2 + Actor574: brik + Owner: USSR + Location: 53,1 + Actor575: brik + Owner: USSR + Location: 52,1 + Actor576: brik + Owner: USSR + Location: 51,1 + Actor577: brik + Owner: USSR + Location: 50,1 + Actor578: brik + Owner: USSR + Location: 49,1 + Actor579: brik + Owner: USSR + Location: 48,1 + Actor580: brik + Owner: USSR + Location: 47,1 + Actor581: apwr + Owner: USSR + Location: 50,2 + Actor582: apwr + Owner: USSR + Location: 47,2 + Actor583: apwr + Owner: USSR + Location: 44,2 + HardOnlyTeslaCoil1: tsla + Owner: USSR + Location: 40,14 + HardOnlyTeslaCoil2: tsla + Owner: USSR + Location: 48,14 + HardOnlyTeslaCoil3: tsla + Owner: USSR + Location: 52,12 + Actor589: ftur + Owner: USSR + Location: 42,16 + Actor590: ftur + Owner: USSR + Location: 46,16 + Actor591: ftur + Owner: USSR + Location: 54,10 + Actor592: ftur + Owner: USSR + Location: 54,6 + Actor593: sam + Owner: USSR + Location: 51,14 + Actor594: sam + Owner: USSR + Location: 37,14 + Actor595: proc + Owner: USSR + Location: 47,6 + Actor596: silo + Owner: USSR + Location: 49,6 + Actor597: silo + Owner: USSR + Location: 47,6 + Actor598: silo + Owner: USSR + Location: 107,68 + Actor599: silo + Owner: USSR + Location: 105,68 + Actor600: silo + Owner: USSR + Location: 105,63 + Actor601: silo + Owner: USSR + Location: 107,63 + Actor602: apwr + Owner: USSR + Location: 41,2 + SovietNorthFactory: weap + Owner: USSR + Location: 37,2 + SovietNorthBarracks1: barr + Owner: USSR + Location: 38,8 + SovietNorthBarracks2: barr + Owner: USSR + Location: 41,7 + Actor603: kenn + Owner: USSR + Location: 44,7 + Actor606: sam + Owner: USSR + Location: 89,37 + NorthSAM2: sam + Owner: USSR + Location: 32,9 + NorthSAM1: sam + Owner: USSR + Location: 32,4 + Actor609: tc01 + Owner: Neutral + Location: 32,7 + Actor610: t15 + Owner: Neutral + Location: 32,2 + Actor611: tc04 + Owner: Neutral + Location: 29,12 + Actor612: tc05 + Owner: Neutral + Location: 29,3 + Actor613: t15 + Owner: Neutral + Location: 31,5 + Actor614: t11 + Owner: Neutral + Location: 31,9 + Actor615: t02 + Owner: Neutral + Location: 30,10 + Actor616: t08 + Owner: Neutral + Location: 30,7 + Actor617: t17 + Owner: Neutral + Location: 31,14 + Actor618: t12 + Owner: Neutral + Location: 29,1 + Actor619: t07 + Owner: Neutral + Location: 33,11 + Actor620: t07 + Owner: Neutral + Location: 34,17 + Actor621: mine + Owner: Neutral + Location: 59,11 + Actor622: mine + Owner: Neutral + Location: 62,5 + Actor623: tc04 + Owner: Neutral + Location: 56,25 + Actor624: tc05 + Owner: Neutral + Location: 52,30 + Actor625: tc01 + Owner: Neutral + Location: 59,32 + Actor626: t15 + Owner: Neutral + Location: 65,28 + Actor627: t07 + Owner: Neutral + Location: 63,21 + Actor628: t15 + Owner: Neutral + Location: 61,20 + Actor629: tc02 + Owner: Neutral + Location: 64,33 + Actor630: tc03 + Owner: Neutral + Location: 60,33 + Actor631: t17 + Owner: Neutral + Location: 54,33 + Actor632: t14 + Owner: Neutral + Location: 48,29 + Actor633: t17 + Owner: Neutral + Location: 59,25 + Actor634: t12 + Owner: Neutral + Location: 66,24 + Actor635: t10 + Owner: Neutral + Location: 41,24 + Actor636: t16 + Owner: Neutral + Location: 37,28 + Actor637: t16 + Owner: Neutral + Location: 51,25 + Actor638: tc03 + Owner: Neutral + Location: 51,21 + Actor639: t15 + Owner: Neutral + Location: 28,20 + Actor640: t16 + Owner: Neutral + Location: 77,37 + Actor641: t07 + Owner: Neutral + Location: 77,22 + Actor643: t02 + Owner: Neutral + Location: 50,55 + Actor644: t16 + Owner: Neutral + Location: 14,18 + Actor645: tc05 + Owner: Neutral + Location: 9,19 + Actor646: t14 + Owner: Neutral + Location: 11,21 + Actor647: t10 + Owner: Neutral + Location: 15,17 + Actor648: tc02 + Owner: Neutral + Location: 78,42 + Actor649: t14 + Owner: Neutral + Location: 82,54 + Actor651: t14 + Owner: Neutral + Location: 83,50 + Actor650: t11 + Owner: Neutral + Location: 81,49 + Actor652: tc02 + Owner: Neutral + Location: 81,48 + Actor653: tc02 + Owner: Neutral + Location: 78,74 + Actor654: t10 + Owner: Neutral + Location: 82,79 + Actor655: tc05 + Owner: Neutral + Location: 114,83 + Actor656: t12 + Owner: Neutral + Location: 116,79 + Actor657: t12 + Owner: Neutral + Location: 115,62 + Actor658: t08 + Owner: Neutral + Location: 116,61 + Actor659: t10 + Owner: Neutral + Location: 92,44 + Actor660: t16 + Owner: Neutral + Location: 93,50 + Actor661: t07 + Owner: Neutral + Location: 85,36 + Actor662: t12 + Owner: Neutral + Location: 87,41 + Actor663: tsla + Owner: USSR + Location: 121,42 + Actor664: tc02 + Owner: Neutral + Location: 121,40 + Actor666: mine + Owner: Neutral + Location: 31,92 + Actor667: mine + Owner: Neutral + Location: 41,89 + Actor672: fenc + Owner: USSR + Location: 89,13 + Actor673: fenc + Owner: USSR + Location: 90,13 + Actor674: fenc + Owner: USSR + Location: 91,13 + Actor675: v01 + Owner: Neutral + Location: 94,6 + Actor676: v07 + Owner: Neutral + Location: 87,6 + Actor677: v03 + Owner: Neutral + Location: 91,3 + Actor678: v05 + Owner: Neutral + Location: 84,3 + Actor679: v02 + Owner: Neutral + Location: 83,14 + Actor680: v04 + Owner: Neutral + Location: 84,19 + Actor681: v17 + Owner: Neutral + Location: 84,13 + Actor682: v17 + Owner: Neutral + Location: 83,13 + Actor683: v18 + Owner: Neutral + Location: 85,6 + Actor684: v18 + Owner: Neutral + Location: 84,6 + Actor685: t03 + Owner: Neutral + Location: 85,1 + Actor686: t11 + Owner: Neutral + Location: 78,11 + Actor687: t05 + Owner: Neutral + Location: 70,14 + Actor688: t11 + Owner: Neutral + Location: 88,20 + Actor689: wood + Owner: Neutral + Location: 82,14 + Actor690: wood + Owner: Neutral + Location: 82,15 + Actor691: wood + Owner: Neutral + Location: 82,16 + Actor692: wood + Owner: Neutral + Location: 83,16 + Actor693: wood + Owner: Neutral + Location: 92,5 + Actor694: wood + Owner: Neutral + Location: 93,5 + Actor695: wood + Owner: Neutral + Location: 93,4 + Actor696: wood + Owner: Neutral + Location: 93,3 + Actor697: wood + Owner: Neutral + Location: 93,2 + Actor698: wood + Owner: Neutral + Location: 92,2 + Actor699: wood + Owner: Neutral + Location: 83,5 + Actor700: wood + Owner: Neutral + Location: 83,6 + Actor701: wood + Owner: Neutral + Location: 83,7 + Actor702: wood + Owner: Neutral + Location: 84,5 + Actor703: wood + Owner: Neutral + Location: 85,5 + Actor704: wood + Owner: Neutral + Location: 86,5 + Actor705: wood + Owner: Neutral + Location: 86,6 + Actor706: wood + Owner: Neutral + Location: 83,12 + Actor707: wood + Owner: Neutral + Location: 84,12 + Actor708: wood + Owner: Neutral + Location: 82,12 + Actor668: fenc + Owner: USSR + Location: 58,36 + Actor669: fenc + Owner: USSR + Location: 58,37 + Actor670: fenc + Owner: USSR + Location: 58,38 + Actor671: fenc + Owner: USSR + Location: 58,39 + Actor709: fenc + Owner: USSR + Location: 58,48 + Actor710: fenc + Owner: USSR + Location: 58,47 + Actor711: fenc + Owner: USSR + Location: 58,46 + Actor712: fenc + Owner: USSR + Location: 58,45 + Actor713: ftur + Owner: USSR + Location: 57,46 + Actor714: ftur + Owner: USSR + Location: 57,38 + HardOnlyKatyusha2: katy + Owner: USSR + Location: 60,46 + Facing: 253 + HardOnlyKatyusha1: katy + Owner: USSR + Location: 60,37 + Facing: 253 + Actor718: btr.ai + Owner: USSR + Location: 61,42 + Facing: 261 + Actor719: btr.ai + Owner: USSR + Facing: 384 + Location: 45,11 + Actor720: btr.ai + Owner: USSR + Facing: 384 + Location: 89,62 + Actor721: btr.ai + Owner: USSR + Location: 115,74 + Facing: 650 + Actor724: btr.ai + Owner: USSR + Facing: 384 + Location: 79,68 + Actor726: 3tnk + Owner: USSR + Facing: 384 + Location: 82,71 + Actor727: 3tnk + Owner: USSR + Location: 77,57 + Facing: 103 + Actor728: 3tnk + Owner: USSR + Location: 83,45 + Facing: 253 + Actor729: 3tnk + Owner: USSR + Facing: 253 + Location: 82,30 + Actor730: 3tnk + Owner: USSR + Facing: 384 + Location: 88,10 + Actor732: btr.ai + Owner: USSR + Facing: 384 + Location: 60,80 + Actor733: 3tnk + Owner: USSR + Facing: 384 + Location: 59,78 + Actor731: 3tnk + Owner: USSR + Location: 114,17 + Facing: 1023 + Actor736: ttra + Owner: USSR + Facing: 384 + Location: 47,12 + Actor737: v2rl + Owner: USSR + Location: 49,14 + Facing: 467 + SovietV24: v2rl + Owner: USSR + Location: 39,14 + Facing: 491 + Actor739: v2rl + Owner: USSR + Location: 86,59 + Facing: 111 + SovietV23: v2rl + Owner: USSR + Location: 86,71 + Facing: 317 + Actor741: v2rl + Owner: USSR + Location: 100,59 + Facing: 0 + Actor742: ss + Owner: USSR + Facing: 384 + Location: 122,87 + HardOnlySub4: ss + Owner: USSR + Location: 124,89 + Facing: 384 + Actor745: ss + Owner: USSR + Location: 111,92 + Facing: 277 + Actor748: ss + Owner: USSR + Location: 86,92 + Facing: 198 + Actor749: ss + Owner: USSR + Location: 81,86 + Facing: 190 + Actor751: seas + Owner: USSR + Facing: 384 + Location: 101,88 + Actor752: seas + Owner: USSR + Facing: 384 + Location: 104,91 + Actor753: seas + Owner: USSR + Location: 84,89 + Facing: 214 + Actor757: ss + Owner: USSR + Location: 123,69 + Facing: 507 + HardOnlySub3: ss + Owner: USSR + Location: 126,73 + Facing: 384 + Actor761: ss + Owner: USSR + Location: 120,47 + Facing: 563 + Actor763: ss + Owner: USSR + Location: 123,49 + Facing: 539 + HardOnlySub1: ss + Owner: USSR + Location: 109,34 + Facing: 578 + Actor773: ss + Owner: USSR + Facing: 384 + Location: 122,35 + HardOnlySub2: ss + Owner: USSR + Location: 125,36 + Facing: 384 + Actor775: seas + Owner: USSR + Facing: 384 + Location: 116,35 + Actor778: seas + Owner: USSR + Location: 125,67 + Facing: 459 + Actor779: seas + Owner: USSR + Facing: 384 + Location: 126,80 + Actor781: v2rl + Owner: USSR + Facing: 317 + Location: 87,34 + Actor782: split2 + Owner: USSR + Location: 20,15 + Actor783: split2 + Owner: USSR + Location: 6,16 + Actor784: tc04 + Owner: Neutral + Location: 19,4 + Actor785: tc01 + Owner: Neutral + Location: 18,1 + Actor786: tc02 + Owner: Neutral + Location: 24,1 + Actor787: t15 + Owner: Neutral + Location: 24,0 + Actor788: t14 + Owner: Neutral + Location: 25,7 + Actor789: tc05 + Owner: Neutral + Location: 24,4 + Actor790: tc03 + Owner: Neutral + Location: 13,4 + Actor791: t15 + Owner: Neutral + Location: 11,1 + Actor792: t17 + Owner: Neutral + Location: 16,0 + Actor793: t15 + Owner: Neutral + Location: 10,8 + Actor794: tc01 + Owner: Neutral + Location: 72,48 + Actor795: tc04 + Owner: Neutral + Location: 4,52 + Actor796: t07 + Owner: Neutral + Location: 5,42 + Actor797: t11 + Owner: Neutral + Location: 8,39 + Actor798: tc04 + Owner: Neutral + Location: 8,31 + Actor799: tc05 + Owner: Neutral + Location: 3,28 + Actor800: t15 + Owner: Neutral + Location: 3,32 + Actor801: t07 + Owner: Neutral + Location: 6,33 + Actor802: t12 + Owner: Neutral + Location: 3,24 + Actor803: tc03 + Owner: Neutral + Location: 1,32 + Actor804: t14 + Owner: Neutral + Location: 5,31 + Actor805: t16 + Owner: Neutral + Location: 2,26 + Actor806: tc01 + Owner: Neutral + Location: 1,23 + Actor808: t11 + Owner: Neutral + Location: 39,50 + Actor811: tc01 + Owner: Neutral + Location: 70,31 + Actor812: t15 + Owner: Neutral + Location: 71,29 + Actor813: tc03 + Owner: Neutral + Location: 61,48 + Actor810: t12 + Owner: Neutral + Location: 34,24 + Actor816: tc01 + Owner: Neutral + Location: 19,28 + Actor817: tc03 + Owner: Neutral + Location: 20,30 + Actor818: t17 + Owner: Neutral + Location: 19,29 + Actor819: tc01 + Owner: Neutral + Location: 33,50 + Actor820: t07 + Owner: Neutral + Location: 38,46 + Actor821: t10 + Owner: Neutral + Location: 40,55 + Actor822: t16 + Owner: Neutral + Location: 57,63 + Actor824: t15 + Owner: Neutral + Location: 51,82 + Actor823: t12 + Owner: Neutral + Location: 50,76 + Actor825: t17 + Owner: Neutral + Location: 29,82 + Actor826: t13 + Owner: Neutral + Location: 15,72 + Actor827: t11 + Owner: Neutral + Location: 3,60 + Actor828: tc04 + Owner: Neutral + Location: 74,17 + Actor829: t15 + Owner: Neutral + Location: 72,18 + Actor830: t14 + Owner: Neutral + Location: 74,15 + Actor831: t07 + Owner: Neutral + Location: 56,17 + Actor832: t01 + Owner: Neutral + Location: 69,3 + Actor835: t08 + Owner: Neutral + Location: 2,8 + Actor834: t11 + Owner: Neutral + Location: 6,5 + Actor836: t01 + Owner: Neutral + Location: 5,4 + Actor814: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 89,78 + Actor815: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 87,77 + Actor833: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 95,82 + Actor837: e1 + Owner: USSR + SubCell: 3 + Location: 96,81 + Facing: 384 + Actor838: e3 + Owner: USSR + Facing: 384 + Location: 96,81 + SubCell: 1 + Actor839: e3 + Owner: USSR + Facing: 384 + Location: 87,77 + SubCell: 1 + Actor840: e3 + Owner: USSR + Location: 95,74 + SubCell: 3 + Facing: 594 + Actor841: e3 + Owner: USSR + Facing: 384 + Location: 102,64 + SubCell: 3 + Actor843: dog + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 45,8 + Actor844: e1 + Owner: USSR + SubCell: 3 + Location: 42,17 + Facing: 531 + Actor845: e1 + Owner: USSR + Facing: 384 + Location: 42,17 + SubCell: 1 + Actor846: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 47,16 + Actor847: e1 + Owner: USSR + SubCell: 3 + Location: 40,16 + Facing: 594 + Actor848: e4 + Owner: USSR + Location: 48,16 + SubCell: 3 + Facing: 384 + Actor849: e3 + Owner: USSR + Facing: 384 + Location: 40,16 + SubCell: 1 + Actor850: e3 + Owner: USSR + Location: 48,11 + SubCell: 3 + Facing: 610 + Actor851: e1 + Owner: USSR + Facing: 384 + Location: 48,11 + SubCell: 1 + Actor852: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 50,12 + Actor853: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 55,14 + Actor854: e1 + Owner: USSR + Location: 54,14 + SubCell: 3 + Facing: 467 + Actor855: e1 + Owner: USSR + Location: 54,14 + SubCell: 1 + Facing: 618 + Actor856: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 55,12 + SovietCenterPatroller2: e1 + Owner: USSR + SubCell: 3 + Location: 36,28 + Facing: 658 + SovietCenterPatroller3: e1 + Owner: USSR + Location: 36,28 + SubCell: 1 + Facing: 384 + SovietCenterPatroller1: e2 + Owner: USSR + SubCell: 3 + Location: 37,27 + Facing: 499 + SovietCenterPatroller4: e2 + Owner: USSR + Location: 35,28 + SubCell: 3 + Facing: 384 + Actor861: e1 + Owner: USSR + SubCell: 3 + Location: 59,45 + Facing: 384 + Actor862: e1 + Owner: USSR + Location: 59,45 + SubCell: 1 + Facing: 95 + Actor863: e1 + Owner: USSR + SubCell: 3 + Location: 56,37 + Facing: 222 + Actor864: e1 + Owner: USSR + Facing: 384 + Location: 56,37 + SubCell: 1 + Actor865: e1 + Owner: USSR + Facing: 384 + Location: 56,38 + SubCell: 3 + Actor866: e1 + Owner: USSR + Location: 57,36 + SubCell: 3 + Facing: 134 + Actor867: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 56,47 + Actor868: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 56,46 + Actor869: e2 + Owner: USSR + Facing: 384 + Location: 56,46 + SubCell: 1 + Actor870: e2 + Owner: USSR + SubCell: 3 + Location: 60,48 + Facing: 384 + Actor871: e3 + Owner: USSR + SubCell: 3 + Location: 61,37 + Facing: 253 + Actor872: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 59,35 + Actor873: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 57,48 + Actor874: e1 + Owner: USSR + SubCell: 3 + Location: 83,44 + Facing: 245 + Actor875: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 84,46 + Actor876: e1 + Owner: USSR + Location: 84,45 + SubCell: 3 + Facing: 206 + Actor877: e2 + Owner: USSR + Facing: 384 + Location: 84,45 + SubCell: 1 + Actor878: e4 + Owner: USSR + SubCell: 3 + Location: 81,46 + Facing: 198 + Actor879: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 85,34 + Actor881: e3 + Owner: USSR + Location: 117,19 + SubCell: 3 + Facing: 325 + Actor884: e1 + Owner: USSR + SubCell: 3 + Location: 114,16 + Facing: 384 + Actor885: e1 + Owner: USSR + Location: 114,16 + SubCell: 1 + Facing: 1023 + Actor886: e1 + Owner: USSR + SubCell: 3 + Location: 117,15 + Facing: 0 + Actor887: e1 + Owner: USSR + SubCell: 3 + Location: 113,20 + Facing: 214 + Actor888: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 114,23 + Actor889: e1 + Owner: USSR + SubCell: 3 + Location: 116,25 + Facing: 229 + Actor891: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 120,28 + Actor892: e1 + Owner: USSR + SubCell: 3 + Location: 111,21 + Facing: 261 + Actor893: e4 + Owner: USSR + SubCell: 3 + Location: 121,14 + Facing: 182 + Actor894: e3 + Owner: USSR + SubCell: 3 + Location: 116,16 + Facing: 0 + Actor895: e2 + Owner: USSR + Location: 113,16 + SubCell: 3 + Facing: 166 + Actor896: e2 + Owner: USSR + Facing: 384 + Location: 90,14 + SubCell: 3 + Actor897: e1 + Owner: USSR + Facing: 384 + Location: 89,14 + SubCell: 3 + Actor898: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 91,15 + Actor899: e1 + Owner: USSR + Facing: 384 + Location: 91,15 + SubCell: 1 + Actor900: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 85,16 + Actor901: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 81,13 + Actor902: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 84,27 + Actor903: e1 + Owner: USSR + Facing: 384 + Location: 84,27 + SubCell: 1 + Actor904: e1 + Owner: USSR + Facing: 384 + Location: 85,26 + SubCell: 3 + Actor905: e1 + Owner: USSR + SubCell: 3 + Location: 84,28 + Facing: 190 + Actor906: e1 + Owner: USSR + Location: 84,34 + SubCell: 1 + Facing: 253 + Actor880: e4 + Owner: USSR + SubCell: 3 + Location: 81,30 + Facing: 384 + Actor907: e4 + Owner: USSR + SubCell: 3 + Location: 82,31 + Facing: 253 + Actor908: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 79,69 + Actor909: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 78,67 + Actor910: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 80,69 + Actor911: e1 + Owner: USSR + Facing: 384 + Location: 80,69 + SubCell: 1 + Actor912: e1 + Owner: USSR + Facing: 384 + Location: 83,71 + SubCell: 3 + Actor913: e1 + Owner: USSR + Facing: 384 + Location: 82,72 + SubCell: 3 + Actor914: e1 + Owner: USSR + SubCell: 3 + Location: 77,58 + Facing: 150 + Actor915: e1 + Owner: USSR + SubCell: 3 + Location: 76,57 + Facing: 0 + Actor916: e1 + Owner: USSR + SubCell: 3 + Location: 79,57 + Facing: 182 + Actor917: e1 + Owner: USSR + Location: 79,56 + SubCell: 3 + Facing: 182 + Actor918: e1 + Owner: USSR + Facing: 384 + Location: 94,51 + SubCell: 3 + Actor919: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 93,53 + Actor920: e1 + Owner: USSR + Facing: 384 + Location: 94,51 + SubCell: 1 + Actor921: e3 + Owner: USSR + Facing: 384 + Location: 94,51 + SubCell: 2 + Actor922: e3 + Owner: USSR + Location: 79,57 + SubCell: 1 + Facing: 206 + Actor923: e3 + Owner: USSR + Facing: 384 + Location: 80,69 + SubCell: 2 + Actor924: e3 + Owner: USSR + Location: 84,45 + SubCell: 2 + Facing: 150 + SovietMammoth3: 4tnk + Owner: USSR + Facing: 0 + Location: 95,52 + Actor927: 4tnk + Owner: USSR + Facing: 0 + Location: 95,49 + Actor925: 4tnk + Owner: USSR + Facing: 0 + Location: 80,63 + Actor928: ttra + Owner: USSR + Location: 92,71 + Facing: 245 + Actor929: ttnk + Owner: USSR + Location: 98,56 + Facing: 95 + Actor930: dog + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 115,75 + Actor931: e1 + Owner: USSR + SubCell: 3 + Location: 116,73 + Facing: 578 + Actor932: e1 + Owner: USSR + Facing: 384 + Location: 116,73 + SubCell: 1 + Actor933: e1 + Owner: USSR + SubCell: 3 + Location: 116,76 + Facing: 777 + Actor934: e1 + Owner: USSR + SubCell: 3 + Location: 114,76 + Facing: 658 + Actor935: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 116,65 + Actor936: e1 + Owner: USSR + SubCell: 3 + Location: 116,67 + Facing: 610 + Actor937: e4 + Owner: USSR + Facing: 384 + Location: 116,67 + SubCell: 1 + Actor938: e2 + Owner: USSR + SubCell: 3 + Location: 116,75 + Facing: 650 + Actor939: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 113,66 + Actor940: e3 + Owner: USSR + Facing: 384 + Location: 114,76 + SubCell: 1 + Actor941: e3 + Owner: USSR + SubCell: 3 + Location: 109,64 + Facing: 384 + Actor943: shok + Owner: USSR + Facing: 384 + Location: 102,64 + SubCell: 1 + Actor944: shok + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 90,59 + Actor945: shok + Owner: USSR + SubCell: 3 + Location: 97,56 + Facing: 103 + Actor946: shok + Owner: USSR + SubCell: 3 + Location: 98,55 + Facing: 142 + Actor947: shok + Owner: USSR + SubCell: 3 + Location: 81,62 + Facing: 0 + Actor948: shok + Owner: USSR + SubCell: 3 + Location: 79,62 + Facing: 0 + Actor949: shok + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 96,51 + Actor954: powr + Owner: USSR + Location: 122,29 + Actor955: fenc + Owner: USSR + Location: 16,19 + Actor956: fenc + Owner: USSR + Location: 16,19 + Actor957: fenc + Owner: USSR + Location: 17,19 + Actor958: fenc + Owner: USSR + Location: 18,19 + Actor959: fenc + Owner: USSR + Location: 22,19 + Actor960: fenc + Owner: USSR + Location: 23,19 + Actor961: fenc + Owner: USSR + Location: 24,19 + Actor962: fenc + Owner: USSR + Location: 25,18 + Actor963: fenc + Owner: USSR + Location: 25,19 + Actor964: fenc + Owner: USSR + Location: 8,21 + Actor965: fenc + Owner: USSR + Location: 7,21 + Actor966: fenc + Owner: USSR + Location: 9,21 + Actor967: fenc + Owner: USSR + Location: 9,22 + Actor968: fenc + Owner: USSR + Location: 7,20 + Actor969: fenc + Owner: USSR + Location: 6,20 + Actor970: fenc + Owner: USSR + Location: 5,20 + Actor971: fenc + Owner: USSR + Location: 21,19 + Actor972: 3tnk + Owner: USSR + Facing: 384 + Location: 21,18 + Actor973: 3tnk + Owner: USSR + Location: 8,19 + Facing: 626 + Actor974: btr.ai + Owner: USSR + Location: 13,20 + Facing: 610 + Actor975: e1 + Owner: USSR + Facing: 384 + Location: 8,22 + SubCell: 3 + Actor976: e1 + Owner: USSR + Facing: 384 + Location: 8,22 + SubCell: 1 + Actor977: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 19,20 + Actor978: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 21,21 + Actor979: e1 + Owner: USSR + Facing: 384 + Location: 26,19 + SubCell: 3 + Actor980: e3 + Owner: USSR + Facing: 384 + Location: 21,20 + SubCell: 3 + Actor981: e3 + Owner: USSR + Facing: 384 + Location: 26,19 + SubCell: 1 + Actor982: e4 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 15,21 + Actor983: e2 + Owner: USSR + Facing: 384 + Location: 13,19 + SubCell: 3 + Actor984: e2 + Owner: USSR + Facing: 384 + Location: 17,18 + SubCell: 3 + Actor985: e2 + Owner: USSR + Facing: 384 + Location: 7,22 + SubCell: 3 + SovietShorePatroller4: e1 + Owner: USSR + SubCell: 3 + Location: 52,69 + Facing: 384 + SovietShorePatroller3: e1 + Owner: USSR + Location: 52,69 + SubCell: 1 + Facing: 384 + SovietShorePatroller6: e1 + Owner: USSR + Location: 52,70 + SubCell: 3 + Facing: 384 + SovietShorePatroller2: e2 + Owner: USSR + Location: 52,68 + SubCell: 3 + Facing: 384 + SovietShorePatroller5: e2 + Owner: USSR + Location: 52,69 + SubCell: 2 + Facing: 384 + SovietShorePatroller7: e3 + Owner: USSR + Location: 52,70 + SubCell: 1 + Facing: 384 + SovietShorePatroller1: btr.ai + Owner: USSR + Location: 52,67 + Facing: 523 + NorthAssembly: waypoint + Owner: Neutral + Location: 44,20 + EastAttackRally: waypoint + Owner: Neutral + Location: 47,45 + EastAssembly: waypoint + Owner: Neutral + Location: 69,40 + NavalSouthAssembly: waypoint + Owner: Neutral + Location: 99,91 + NavalEastAssembly: waypoint + Owner: Neutral + Location: 113,38 + NavalSouthRally: waypoint + Owner: Neutral + Location: 71,87 + NavalForwardRally: waypoint + Owner: Neutral + Location: 66,62 + NavalSouthEastAssembly: waypoint + Owner: Neutral + Location: 122,91 + ShorePatrol1: waypoint + Owner: Neutral + Location: 52,60 + CentralPatrol1: waypoint + Owner: Neutral + Location: 30,27 + CentralPatrol3: waypoint + Owner: Neutral + Location: 79,25 + CentralPatrol2: waypoint + Owner: Neutral + Location: 60,19 + Actor993: 3tnk + Owner: USSR + Facing: 253 + Location: 57,39 + Actor994: 3tnk + Owner: USSR + Facing: 253 + Location: 57,45 + Actor995: n1 + Owner: GDI + SubCell: 3 + Location: 23,39 + Facing: 848 + Actor996: n1 + Owner: GDI + SubCell: 3 + Location: 24,40 + Facing: 832 + Actor1001: n1 + Owner: GDI + SubCell: 3 + Location: 34,42 + Facing: 808 + Actor1002: n1 + Owner: GDI + SubCell: 3 + Location: 36,45 + Facing: 911 + Actor1003: n1 + Owner: GDI + Location: 36,45 + SubCell: 1 + Facing: 1023 + Actor1004: n1 + Owner: GDI + Location: 37,45 + SubCell: 3 + Facing: 745 + Actor1005: n3 + Owner: GDI + SubCell: 3 + Location: 35,44 + Facing: 800 + Actor1006: n3 + Owner: GDI + SubCell: 3 + Location: 26,41 + Facing: 935 + Actor1007: n3 + Owner: GDI + SubCell: 3 + Location: 20,39 + Facing: 800 + Actor1008: n3 + Owner: GDI + Facing: 384 + Location: 31,43 + SubCell: 3 + RaidLanding1: waypoint + Owner: Neutral + Location: 62,79 + RaidLanding2: waypoint + Owner: Neutral + Location: 57,58 + GDIReinforcementsEntry: waypoint + Owner: Neutral + Location: 1,46 + GDIReinforcementsRally: waypoint + Owner: Neutral + Location: 9,47 + Actor1011: 3tnk + Owner: USSR + Facing: 384 + Location: 91,40 + Actor1012: 3tnk + Owner: USSR + Facing: 384 + Location: 93,41 + Actor1013: e1 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 90,40 + Actor1014: e1 + Owner: USSR + Facing: 384 + Location: 90,40 + SubCell: 1 + Actor1015: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 91,41 + Actor1016: e1 + Owner: USSR + Facing: 384 + Location: 93,40 + SubCell: 3 + Actor1017: e1 + Owner: USSR + Facing: 384 + Location: 94,41 + SubCell: 3 + Actor1018: e4 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 92,41 + Actor1019: e4 + Owner: USSR + Facing: 384 + Location: 92,41 + SubCell: 1 + Actor1020: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 91,39 + Actor1021: dog + Owner: USSR + Facing: 384 + Location: 81,71 + SubCell: 3 + Actor1022: e1 + Owner: USSR + Facing: 384 + Location: 85,78 + SubCell: 3 + Actor1029: e1 + Owner: USSR + SubCell: 3 + Location: 20,74 + Facing: 618 + Actor1030: e1 + Owner: USSR + SubCell: 3 + Location: 22,75 + Facing: 570 + Actor1031: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 23,74 + Actor1033: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 24,73 + Actor1034: e1 + Owner: USSR + Facing: 384 + Location: 24,75 + SubCell: 1 + Actor1032: e1 + Owner: USSR + Facing: 384 + Location: 58,78 + SubCell: 3 + Actor1035: e1 + Owner: USSR + Facing: 384 + Location: 58,79 + SubCell: 3 + Actor1036: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 60,81 + Actor1039: e1 + Owner: USSR + Facing: 384 + Location: 58,82 + SubCell: 1 + Actor1037: e1 + Owner: USSR + Facing: 384 + Location: 58,79 + SubCell: 1 + Actor1038: e4 + Owner: USSR + Facing: 384 + Location: 59,80 + SubCell: 3 + Actor1040: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 58,77 + Actor1041: e1 + Owner: USSR + SubCell: 3 + Location: 34,70 + Facing: 182 + Actor1042: e1 + Owner: USSR + SubCell: 3 + Location: 36,71 + Facing: 602 + Actor1046: e3 + Owner: USSR + Facing: 384 + Location: 37,69 + SubCell: 1 + Actor1043: e1 + Owner: USSR + SubCell: 3 + Location: 38,69 + Facing: 309 + Actor1045: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 50,53 + Actor1047: e1 + Owner: USSR + Facing: 384 + Location: 50,53 + SubCell: 1 + Actor1048: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 46,53 + Actor1051: e4 + Owner: USSR + Facing: 384 + Location: 47,52 + SubCell: 2 + Actor1044: e2 + Owner: USSR + Facing: 384 + Location: 46,53 + SubCell: 1 + Actor1049: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 53,54 + Actor1050: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 44,54 + Actor1052: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 56,20 + Actor1054: e1 + Owner: USSR + Facing: 384 + SubCell: 1 + Location: 56,20 + Actor1053: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 57,19 + Actor1056: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 55,19 + Actor1055: e1 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 72,20 + Actor1057: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 71,19 + Actor1058: e1 + Owner: USSR + Facing: 384 + SubCell: 1 + Location: 72,20 + Actor1059: e4 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 74,21 + Actor1060: e3 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 73,20 + Actor1061: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 71,18 + Actor1062: 3tnk + Owner: USSR + Location: 70,20 + Facing: 384 + Actor1063: 3tnk + Owner: USSR + Facing: 384 + Location: 72,21 + CentralPatrol4: waypoint + Owner: Neutral + Location: 79,40 + NorthAttackRally: waypoint + Owner: Neutral + Location: 21,34 + NorthEastAttackRally: waypoint + Owner: Neutral + Location: 40,34 + HaloDrop1Landing: waypoint + Owner: Neutral + Location: 5,50 + HaloDrop2Landing: waypoint + Owner: Neutral + Location: 44,41 + GDICommanderSpawn: waypoint + Owner: Neutral + Location: 124,21 + GDICommanderRally: waypoint + Owner: Neutral + Location: 124,23 + GDIRescueRally: waypoint + Owner: Neutral + Location: 122,23 + SovietCenterPatroller5: btr.ai + Owner: USSR + Location: 39,27 + Facing: 245 + SovietCenterPatroller8: btr.ai + Owner: USSR + Location: 70,23 + Facing: 769 + SovietCenterPatroller6: e1 + Owner: USSR + SubCell: 3 + Location: 40,28 + Facing: 384 + SovietCenterPatroller7: e1 + Owner: USSR + SubCell: 3 + Location: 41,27 + Facing: 384 + SovietHindPatroller2: hind + Owner: USSR + Location: 109,37 + Facing: 634 + SovietHindPatroller1: hind + Owner: USSR + Location: 112,31 + Facing: 642 + SovietMainFactory2: weap + Owner: USSR + Location: 90,72 + SovietMainFactory1: weap + Owner: USSR + Location: 90,67 + SovietMainBarracks1: barr + Owner: USSR + Location: 91,62 + ShorePatrol2: waypoint + Owner: Neutral + Location: 52,78 + Actor205: e1 + Owner: Greece + SubCell: 5 + Facing: 0 + Location: 20,91 + Actor108: 2tnk + Owner: Greece + Facing: 0 + Location: 19,92 + Actor201: e1 + Owner: Greece + SubCell: 5 + Facing: 0 + Location: 18,91 + Actor204: e1 + Owner: Greece + SubCell: 4 + Facing: 0 + Location: 20,91 + RaidSpawn: waypoint + Owner: Neutral + Location: 128,92 + GDIBaseCenter: waypoint + Owner: Neutral + Location: 22,49 + VillageCenter: waypoint + Owner: Neutral + Location: 31,70 + ShoreCenter: waypoint + Owner: Neutral + Location: 54,81 + Actor1009: shok + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 59,36 + Actor1010: shok + Owner: USSR + Facing: 384 + Location: 59,46 + SubCell: 3 + Actor1064: shok + Owner: USSR + Facing: 384 + Location: 96,74 + SubCell: 3 + Actor1065: shok + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 97,71 + Actor1066: shok + Owner: USSR + SubCell: 3 + Location: 87,62 + Facing: 384 + Actor1067: shok + Owner: USSR + Facing: 384 + Location: 90,59 + SubCell: 1 + Actor1068: shok + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 86,60 + Actor1069: shok + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 46,11 + Actor1070: shok + Owner: USSR + Facing: 384 + Location: 44,8 + SubCell: 3 + GDIBaseTopRight: waypoint + Owner: Neutral + Location: 28,43 + HaloDrop3Landing: waypoint + Owner: Neutral + Location: 6,40 + HaloDrop4Landing: waypoint + Owner: Neutral + Location: 14,33 + HaloDrop5Landing: waypoint + Owner: Neutral + Location: 44,50 + HaloDrop6Landing: waypoint + Owner: Neutral + Location: 17,70 + RaidLanding3: waypoint + Owner: Neutral + Location: 57,52 + LateHaloDrop1Spawn: waypoint + Owner: Neutral + Location: 128,3 + LateHaloDrop1Landing: waypoint + Owner: Neutral + Location: 89,17 + LateHaloDrop2Spawn: waypoint + Owner: Neutral + Location: 128,44 + LateHaloDrop2Landing: waypoint + Owner: Neutral + Location: 83,41 + LateHaloDrop3Spawn: waypoint + Owner: Neutral + Location: 128,63 + LateHaloDrop3Landing: waypoint + Owner: Neutral + Location: 73,45 + HaloDrop7Landing: waypoint + Owner: Neutral + Location: 5,59 + CruiserSpawn: waypoint + Owner: Neutral + Location: 65,96 + CruiserDestination: waypoint + Owner: Neutral + Location: 65,68 + DestroyerSpawn: waypoint + Owner: Neutral + Location: 67,96 + DestroyerDestination: waypoint + Owner: Neutral + Location: 67,68 + HardOnlySub5: ss + Owner: USSR + Location: 94,93 + Facing: 261 + Actor1072: ss + Owner: USSR + Facing: 384 + Location: 97,87 + Actor1073: ss + Owner: USSR + Facing: 384 + Location: 97,87 + Actor1074: camera + Owner: USSR + Location: 26,46 + Actor1075: camera + Owner: USSR + Location: 54,79 + Actor1076: camera + Owner: USSR + Location: 46,58 + Actor1077: camera + Owner: USSR + Location: 35,54 + Actor1078: camera + Owner: USSR + Location: 54,65 + Actor1079: camera + Owner: USSR + Location: 19,38 + Actor1081: seas + Owner: USSR + Facing: 214 + Location: 73,62 + McvEntry: waypoint + Owner: Neutral + Location: 19,96 + McvRally: waypoint + Owner: Neutral + Location: 19,91 + Actor1082: gtwr + Owner: GDI + Location: 11,50 + EntranceReveal1: waypoint + Owner: Neutral + Location: 44,16 + EntranceReveal2: waypoint + Owner: Neutral + Location: 84,30 + EntranceReveal4: waypoint + Owner: Neutral + Location: 95,57 + EntranceReveal3: waypoint + Owner: Neutral + Location: 84,66 + Actor1071: ss + Owner: USSR + Facing: 578 + Location: 104,5 + Actor1084: ss + Owner: USSR + Facing: 578 + Location: 101,6 + Actor1083: sam + Owner: USSR + Location: 124,4 + Actor1085: sam + Owner: USSR + Location: 116,2 + Actor1087: e1 + Owner: USSR + Facing: 384 + Location: 125,29 + SubCell: 1 + Actor1086: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 122,2 + Actor1088: e1 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 117,3 + Actor807: t15 + Owner: Neutral + Location: 42,36 + Actor1080: camera + Owner: USSR + Location: 37,40 + Actor1110: 3tnk + Owner: USSR + Facing: 523 + Location: 18,31 + Actor1111: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 19,31 + Actor1105: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 16,31 + Actor1106: e1 + Owner: USSR + Facing: 384 + SubCell: 1 + Location: 16,31 + Actor1112: e1 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 15,32 + Actor1096: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 24,30 + Actor1097: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 23,31 + Actor1098: e1 + Owner: USSR + SubCell: 1 + Facing: 384 + Location: 23,31 + SovietMammoth1: 4tnk + Owner: USSR + Location: 27,30 + Facing: 452 + SovietV21: v2rl + Owner: USSR + Location: 31,30 + Facing: 384 + Actor1102: e1 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 29,31 + Actor1103: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 30,31 + Actor1104: e1 + Owner: USSR + Facing: 384 + SubCell: 1 + Location: 30,31 + Actor1113: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 30,32 + Actor1114: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 32,31 + Actor1115: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 33,32 + Actor1116: e4 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 34,32 + Actor1117: 3tnk + Owner: USSR + Facing: 459 + Location: 35,32 + Actor1118: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 38,32 + Actor1119: e4 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 36,33 + Actor1120: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 37,34 + Actor1121: e1 + Owner: USSR + Facing: 384 + SubCell: 1 + Location: 37,34 + SovietMammoth2: 4tnk + Owner: USSR + Location: 41,37 + Facing: 348 + Actor1089: 3tnk + Owner: USSR + Facing: 293 + Location: 44,40 + Actor1090: e1 + Owner: USSR + SubCell: 3 + Location: 43,41 + Facing: 384 + Actor1091: e1 + Owner: USSR + SubCell: 1 + Facing: 384 + Location: 43,41 + Actor1093: e3 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 43,39 + Actor1094: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 42,38 + SovietV22: v2rl + Owner: USSR + Location: 41,33 + Facing: 384 + SiegeUnitsBoxTopLeft: waypoint + Owner: Neutral + Location: 14,29 + SiegeUnitsBoxBottomRight: waypoint + Owner: Neutral + Location: 45,41 + Actor1092: tc05 + Owner: Neutral + Location: 40,77 + HaloSpawn1: waypoint + Owner: Neutral + Location: 75,1 + HaloDrop1Mid: waypoint + Owner: Neutral + Location: 14,13 + HaloSpawn2: waypoint + Owner: Neutral + Location: 128,75 + Actor809: e1 + Owner: USSR + SubCell: 3 + Location: 91,79 + Facing: 384 + Actor1095: powr + Owner: USSR + Location: 126,14 + Actor1024: brik + Owner: USSR + Location: 103,37 + Actor1025: brik + Owner: USSR + Location: 103,38 + Actor1100: 4tnk + Owner: USSR + Location: 116,21 + Facing: 412 + Actor1028: ftur + Owner: USSR + Location: 113,23 + Actor1026: e3 + Owner: USSR + Facing: 384 + SubCell: 1 + Location: 111,18 + Actor388: sam + Owner: USSR + Location: 126,30 + Actor1027: sam + Owner: USSR + Location: 109,21 + Actor1101: sam + Owner: USSR + Location: 116,24 + Actor1107: fenc + Owner: USSR + Location: 120,23 + Actor1108: fenc + Owner: USSR + Location: 120,24 + Actor1109: fenc + Owner: USSR + Location: 120,19 + Actor1122: fenc + Owner: USSR + Location: 120,18 + Actor1123: fenc + Owner: USSR + Location: 119,19 + Actor1124: fenc + Owner: USSR + Location: 119,23 + Actor1125: powr + Owner: USSR + Location: 111,16 + Actor1126: afld + Owner: USSR + Location: 124,26 + Actor1127: afld + Owner: USSR + Location: 120,26 + Actor1099: apwr + Owner: USSR + Location: 118,14 + Actor1128: kenn + Owner: USSR + Location: 98,33 + Actor1129: dog + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 97,33 + Actor1130: silo + Owner: USSR + Location: 87,36 + Actor1131: silo + Owner: USSR + Location: 87,37 + Actor1132: ttra + Owner: USSR + Facing: 384 + Location: 105,29 + Actor1133: powr + Owner: USSR + Location: 102,34 + Actor1134: powr + Owner: USSR + Location: 92,32 + GDIRescueSpawn: waypoint + Owner: Neutral + Location: 108,1 + Actor1023: ss + Owner: USSR + Facing: 578 + Location: 97,25 + Actor1135: seas + Owner: USSR + Facing: 491 + Location: 106,9 + Actor1136: mech + Owner: Greece + SubCell: 3 + Facing: 1023 + Location: 17,92 + Actor1137: medi + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 19,94 + Actor1138: mech + Owner: Greece + SubCell: 3 + Facing: 1023 + Location: 21,92 + MissileSilo: mslo + Owner: USSR + Location: 114,81 + ScriptTags: BrutalOnly + Actor1139: powr + Owner: USSR + Location: 98,66 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-coalitions.yaml, gdi-palette.yaml, deliverance-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml + +Voices: deliverance-voices.yaml diff --git a/mods/ca/missions/main-campaign/ca03-deliverance/r_gdibasediscovered.aud b/mods/ca/missions/main-campaign/ca03-deliverance/r_gdibasediscovered.aud new file mode 100644 index 0000000000..f7c136b985 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca03-deliverance/r_gdibasediscovered.aud differ diff --git a/mods/ca/missions/main-campaign/ca03-deliverance/r_gdicmdrfreed.aud b/mods/ca/missions/main-campaign/ca03-deliverance/r_gdicmdrfreed.aud new file mode 100644 index 0000000000..a7a2871868 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca03-deliverance/r_gdicmdrfreed.aud differ diff --git a/mods/ca/missions/main-campaign/ca03-deliverance/r_gditraninbound.aud b/mods/ca/missions/main-campaign/ca03-deliverance/r_gditraninbound.aud new file mode 100644 index 0000000000..8e581f4641 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca03-deliverance/r_gditraninbound.aud differ diff --git a/mods/ca/missions/main-campaign/ca04-containment/containment-rules.yaml b/mods/ca/missions/main-campaign/ca04-containment/containment-rules.yaml new file mode 100644 index 0000000000..471af95db0 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca04-containment/containment-rules.yaml @@ -0,0 +1,275 @@ + +^Palettes: + TintPostProcessEffect: + WeatherOverlay@RAIN: + WindTick: 300, 550 + UseSquares: false + ScatterDirection: 0, 0 + Gravity: 35, 45 + SwingOffset: 0, 0 + SwingSpeed: 0, 0 + SwingAmplitude: 0, 0 + ParticleColors: aaaaaa, 999999, aa6666, 66aa66 + LineTailAlphaValue: 12 + ParticleSize: 1, 1 + ParticleDensityFactor: 10 + +World: + LuaScript: + Scripts: campaign.lua, containment.lua + MissionData: + Briefing: Intel reports that the Soviets are preparing to strike their ruptured Chronosphere with atomic weapons in an attempt to put an end to the damage that it continues to cause. They don't know what they are dealing with. If they succeed, the consequences could be apocalyptic.\n\nThere isn't enough time to launch a full offensive, so our best option is a small, covert operation to take out their missile silos.\n\nThe bulk of the Soviet forces in the region are busy pushing back the alien invaders, so the bases here are vulnerable to such an attack. If all goes to plan, by the time they realize there's a significant threat it will be too late.\n\nWe have been preparing our own means of containing the Chronosphere, and assuming we succeed in stopping the Soviets from launching, this would be as good a time as any to put it to the test.\n\nFirst, you must take out the three atomic reactors that power the Soviet Tesla Coils so that our team can slip by the remaining defenses.\n\nNext, take out the SAM sites along the shoreline to clear a path for our attempt at containment.\n\nThirdly, destroy the two missile silos that are preparing to launch.\n\nThen we will send in our experimental weapon. Escort it to the Chronosphere and neutralize it. + MapOptions: + ShortGameCheckboxEnabled: False + ScriptLobbyDropdown@RESPAWN: + ID: respawn + Label: Respawns + Description: Enable/disable respawning on death + Values: + enabled: Enabled + disabled: Disabled + Default: disabled + DisplayOrder: 999 + MusicPlaylist: + StartingMusic: run1226m + Locomotor@SEAL: + TerrainSpeeds: + Rough: 100 + Ford: 100 + Beach: 100 + Water: 100 + Ore: 100 + +Player: + PlayerResources: + DefaultCash: 0 + +^EnemyDifficultyModifiers: + Inherits@ActorDifficultyConditions: ^ActorDifficultyConditions + SpeedMultiplier@BRUTAL: + Modifier: 110 + RequiresCondition: difficulty-brutal + +E1: + Inherits@EnemyDifficultyModifiers: ^EnemyDifficultyModifiers + RangeMultiplier@EASY: + Modifier: 80 + RequiresCondition: difficulty-easy + RangeMultiplier@NORMAL: + Modifier: 90 + RequiresCondition: difficulty-normal + +E2: + Inherits@EnemyDifficultyModifiers: ^EnemyDifficultyModifiers + Mobile: + Speed: 46 + +E3: + Inherits@EnemyDifficultyModifiers: ^EnemyDifficultyModifiers + Mobile: + Speed: 46 + +E4: + Inherits@EnemyDifficultyModifiers: ^EnemyDifficultyModifiers + Mobile: + Speed: 46 + +SHOK: + Inherits@EnemyDifficultyModifiers: ^EnemyDifficultyModifiers + Mobile: + Speed: 46 + +DOG: + Inherits@EnemyDifficultyModifiers: ^EnemyDifficultyModifiers + Mobile: + Speed: 46 + Health: + HP: 4500 + +PDOX.CROSSRIP: + Inherits: PDOX + Targetable: + TargetTypes: Temporal + Tooltip: + Name: Ruptured Chronosphere + Health: + HP: 35000 + Armor: + Type: Concrete + -TooltipExtras: + Buildable: + Description: Causes temporal and interdimensional crossrips. + -Valued: + -WithBuildingBib: + -WithColoredOverlay@IDISABLE: + -InfiltrateForSupportPowerReset: + -Targetable@INFILTRATION: + -WithMakeAnimation: + -DetonateWeaponPower@ChronoAI: + -GrantExternalConditionPowerCA@TimeWarp: + -CaptureManager: + -Capturable: + -CapturableProgressBar: + -CapturableProgressBlink: + -Sellable: + -Targetable@HACKABLE: + -GrantConditionOnPrerequisite@OwnedByAi: + -GrantConditionOnPrerequisite@AiSuperweaponsEnabled: + +TSLA: + -Targetable@TeslaBoost: + +SAM: + -SpawnActorOnDeath: + -SpawnRandomActorOnDeath: + +WORMHOLE: + -Targetable: + +SPY: + RevealsShroud: + Range: 9c512 + Mobile: + Speed: 60 + Selectable: + Priority: 10 + TooltipExtras: + Attributes: • Disguise as enemy infantry by right-clicking them + +SEAL: + Inherits@ActorDifficultyConditions: ^ActorDifficultyConditions + Health: + HP: 10000 + RevealsShroud: + Range: 7c0 + AutoTarget: + InitialStance: HoldFire + Mobile: + Speed: 54 + DamageMultiplier@EASY: + Modifier: 60 + RequiresCondition: difficulty-easy + DamageMultiplier@NORMAL: + Modifier: 80 + RequiresCondition: difficulty-normal + ReloadDelayMultiplier@BRUTAL: + Modifier: 110 + RequiresCondition: difficulty-brutal + RangeMultiplier@EASY: + Modifier: 115 + RequiresCondition: difficulty-easy + RevealsShroudMultiplier@NORMALEASY: + Modifier: 115 + RequiresCondition: difficulty-normal || difficulty-easy + +CHPR: + Inherits@ActorDifficultyConditions: ^ActorDifficultyConditions + DamageMultiplier@EASY: + Modifier: 60 + RequiresCondition: difficulty-easy + DamageMultiplier@NORMAL: + Modifier: 80 + RequiresCondition: difficulty-normal + +^GDIPalette: + RenderSprites: + Palette: temptd + +OCAR.CHPR: + Inherits: OCAR + Inherits@GDIPAL: ^GDIPalette + RejectsOrders: + -Selectable: + Interactable: + Aircraft: + InitialFacing: 512 + Carryall: + InitialActor: chpr + Health: + HP: 100000 + +OCAR.Husk: + Inherits@GDIPAL: ^GDIPalette + +SEAS: + RevealsShroud: + Range: 4c512 + MinRange: 0 + -RevealsShroud@GAPGEN: + +SAPC: + ExternalCondition@FORCEUNCLOAK: + Condition: cloak-force-disabled + AutoTarget: + InitialStanceAI: HoldFire + -Targetable: + +MSLO: + NukePower@ABomb: + DisplayTimerRelationships: None + AllowMultiple: true + -InfiltrateForSupportPowerReset: + -Targetable@INFILTRATION: + Health: + HP: 60000 + +^NukeDummy: + Inherits@ABOMBPOWER: ^ABombPower + AlwaysVisible: + Interactable: + ScriptTriggers: + NukePower@ABomb: + -PauseOnCondition: + +NukeDummyEasy: + Inherits: ^NukeDummy + NukePower@ABomb: + ChargeInterval: 60000 + +NukeDummyNormal: + Inherits: ^NukeDummy + NukePower@ABomb: + ChargeInterval: 45000 + +NukeDummyHard: + Inherits: ^NukeDummy + NukePower@ABomb: + ChargeInterval: 30000 + +SPEN: + -InfiltrateToCreateProxyActor: + -Targetable@INFILTRATION: + +DOME: + -InfiltrateForExploration: + -Targetable@INFILTRATION: + +WEAP: + -Targetable@INFILTRATION: + -InfiltrateToCreateProxyActor: + +HPAD: + -Targetable@GrantSupportPowerInfiltrate: + -InfiltrateToCreateProxyActor@SpySupportPower: + -InfiltrateForTimedCondition@SpySupportPower: + +AFLD: + -Targetable@GrantSupportPowerInfiltrate: + -InfiltrateToCreateProxyActor@SpySupportPower: + -InfiltrateForTimedCondition@SpySupportPower: + +POWR: + -Targetable@PowerOutageInfiltrate: + -InfiltrateForPowerOutage: + +APWR: + -Targetable@PowerOutageInfiltrate: + -InfiltrateForPowerOutage: + +NPWR: + -Targetable@PowerOutageInfiltrate: + -InfiltrateForPowerOutage: + +BARR: + -Targetable@INFILTRATION: + -InfiltrateToCreateProxyActor@spy: diff --git a/mods/ca/missions/main-campaign/ca04-containment/containment-sequences.yaml b/mods/ca/missions/main-campaign/ca04-containment/containment-sequences.yaml new file mode 100644 index 0000000000..1131dc6f39 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca04-containment/containment-sequences.yaml @@ -0,0 +1,9 @@ +pdox.crossrip: + Inherits: ^StructureOverlays + idle: + Filename: pdox.shp + Frames: 5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27 + Length: 23 + Tick: 140 + icon: + Filename: pdoxicon.shp diff --git a/mods/ca/missions/main-campaign/ca04-containment/containment-weapons.yaml b/mods/ca/missions/main-campaign/ca04-containment/containment-weapons.yaml new file mode 100644 index 0000000000..34f07b5fd9 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca04-containment/containment-weapons.yaml @@ -0,0 +1,40 @@ + +MP5: + ReloadDelay: 25 + Burst: 1 + Range: 7c0 + Warhead@1Dam: SpreadDamage + Spread: 64 + Damage: 4700 + Versus: + None: 400 + Warhead@2Eff: CreateEffect + Explosions: piffs + Warhead@3EffWater: CreateEffect + Explosions: water_piffs + +FireballLauncher: + Projectile: BulletCA + Speed: 200 + +FLAK-SEAS-AG: + Range: 4c512 + Warhead@1Dam: SpreadDamage + Versus: + None: 100 + +CrateNuke: + Warhead@18Radio: CreateTintedCells + Falloff: 100, 75, 52, 37, 24 + +SCUD: + Projectile: Bullet + Speed: 180 + +PlaceC4Seal: + Range: 1c511 + Warhead@AttachDelayedWeapon: AttachDelayedWeapon + TriggerTime: 30 + +DogJaw: + Range: 3c0 diff --git a/mods/ca/missions/main-campaign/ca04-containment/containment.lua b/mods/ca/missions/main-campaign/ca04-containment/containment.lua new file mode 100644 index 0000000000..9b908f2f30 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca04-containment/containment.lua @@ -0,0 +1,502 @@ +MissionDir = "ca|missions/main-campaign/ca04-containment" + +RespawnEnabled = Map.LobbyOption("respawn") == "enabled" + +Patrols = { + { + Units = { PatrolBoat, PatrolBoat2 }, + Path = { BoatPatrol1.Location, BoatPatrol2.Location, BoatPatrol3.Location, BoatPatrol2.Location } + }, + { + Units = { PatrollerA1, PatrollerA2, PatrollerA3, PatrollerA4, PatrollerA5, PatrollerA6, PatrollerA7 }, + Path = { PatrolA1.Location, PatrolA2.Location, PatrolA3.Location, PatrolA4.Location, PatrolA5.Location, PatrolA6.Location, PatrolA1.Location, PatrolA7.Location, PatrolA8.Location, PatrolA9.Location, PatrolA8.Location, PatrolA7.Location } + }, + { + Units = { PatrollerB1, PatrollerB2, PatrollerB3, PatrollerB4, PatrollerB5, PatrollerB6 }, + Path = { PatrolB1.Location, PatrolB2.Location, PatrolB3.Location, PatrolB2.Location, PatrolB4.Location, PatrolB5.Location, PatrolB6.Location, PatrolB7.Location, PatrolB8.Location, PatrolB9.Location, PatrolB8.Location, PatrolB7.Location, PatrolB6.Location, PatrolB5.Location, PatrolB4.Location } + }, + { + Units = { PatrollerC1, PatrollerC2, PatrollerC3, PatrollerC4, PatrollerC5, PatrollerC6, PatrollerC7, PatrollerC8, PatrollerC9, PatrollerC10 }, + Path = { PatrolC1.Location, PatrolC2.Location, PatrolC3.Location, PatrolC4.Location, PatrolC5.Location, PatrolC4.Location, PatrolC3.Location, PatrolC2.Location } + }, + { + Units = { PatrollerD1, PatrollerD2, PatrollerD3, PatrollerD4, PatrollerD5, PatrollerD6 }, + Path = { PatrolD1.Location, PatrolD2.Location, PatrolD3.Location, PatrolD4.Location, PatrolD3.Location, PatrolD2.Location } + }, + { + Units = { PatrollerE1, PatrollerE2, PatrollerE3, PatrollerE4, PatrollerE5, PatrollerE6 }, + Path = { PatrolE1.Location, PatrolE2.Location, PatrolE3.Location, PatrolE4.Location, PatrolE5.Location, PatrolE6.Location, PatrolE5.Location, PatrolE7.Location, PatrolE8.Location, PatrolE9.Location, PatrolE10.Location, PatrolE11.Location, PatrolE10.Location, PatrolE9.Location, PatrolE8.Location, PatrolE7.Location, PatrolE5.Location, PatrolE4.Location, PatrolE3.Location, PatrolE2.Location } + }, + { + Units = { PatrollerF1, PatrollerF2, PatrollerF3, PatrollerF4, PatrollerF5, PatrollerF6, PatrollerF7 }, + Path = { PatrolF1.Location, PatrolF2.Location, PatrolF3.Location, PatrolF4.Location, PatrolF3.Location, PatrolF2.Location } + } +} + +Reactors = { EastReactor, SouthReactor, WestReactor } + +ShoreSAMs = { ShoreSAM1, ShoreSAM2, ShoreSAM3, ShoreSAM4, ShoreSAM5 } +ShoreSAMFlareLocation = ShoreSAM5.Location +ShoreSAMBeaconPosition = ShoreSAM5.CenterPosition + +MissileSilos = { TopSilo, BottomSilo } + +NukeTimer = { + easy = DateTime.Minutes(40), + normal = DateTime.Minutes(30), + hard = DateTime.Minutes(20), + vhard = DateTime.Minutes(20), + brutal = DateTime.Minutes(20), +} + +-- Setup and Tick + +SetupPlayers = function() + Greece = Player.GetPlayer("Greece") + USSR = Player.GetPlayer("USSR") + Scrin = Player.GetPlayer("Scrin") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = { Greece } + MissionEnemies = { USSR } +end + +WorldLoaded = function() + SetupPlayers() + InitObjectives(Greece) + InitUSSR() + + TimerTicks = 0 + Camera.Position = PlayerStart.CenterPosition + + Lighting.Ambient = 0.22 + Lighting.Red = 2.5 + Lighting.Blue = 0.85 + Lighting.Green = 1.6 + + Sunrise() + + ObjectiveKillReactors = Greece.AddObjective("Destroy the three Atomic Reactors.") + ObjectiveKillSAMSites = Greece.AddObjective("Destroy Soviet SAM sites along shoreline.") + ObjectiveKillSilos = Greece.AddObjective("Destroy Atom Bomb silos before they launch.") + ObjectiveNeutralizeChronosphere = Greece.AddObjective("Neutralize the Chronosphere.") + ObjectiveKeepAlive = Greece.AddSecondaryObjective("Keep all team members alive.") + + LandingCraft.Move(LandingCraftExit.Location) + LandingCraft.Destroy() + + Utils.Do(MissionPlayers, function(p) + Actor.Create("radar.dummy", true, { Owner = p }) + end) + + SetupUnits() + + Utils.Do(Seals, function(a) + Trigger.OnKilled(a, function(self, killer) + Greece.MarkFailedObjective(ObjectiveKeepAlive) + + if not RespawnEnabled then + local allSealsDead = false + + if #Utils.Where(Seals, function(a) return not a.IsDead end) == 0 then + allSealsDead = true + end + + if allSealsDead then + if not AllReactorsDead then + Greece.MarkFailedObjective(ObjectiveKillReactors) + end + + if not BothNukeSilosDead then + Greece.MarkFailedObjective(ObjectiveKillSilos) + end + + if not AllSAMSitesDead then + Greece.MarkFailedObjective(ObjectiveKillSAMSites) + end + + if not AllReactorsDead or not BothNukeSilosDead or not AllSAMSitesDead then + Greece.MarkFailedObjective(ObjectiveNeutralizeChronosphere) + end + end + end + end) + end) + + Trigger.OnKilled(Spy, function(self, killer) + Greece.MarkFailedObjective(ObjectiveKeepAlive) + end) + + Trigger.OnKilled(WestReactor, function(self, killer) + DisableWestTeslas() + end) + + Trigger.OnKilled(EastReactor, function(self, killer) + DisableEastTeslas() + if SouthReactor.IsDead then + DisableNorthTeslas() + end + end) + + Trigger.OnKilled(SouthReactor, function(self, killer) + DisableSouthTeslas() + DoShoreSAMFlare() + if EastReactor.IsDead then + DisableNorthTeslas() + end + end) + + Trigger.OnAllKilled(Reactors, function() + AllReactorsDead = true + Greece.MarkCompletedObjective(ObjectiveKillReactors) + end) + + Trigger.OnAllKilled(ShoreSAMs, function() + AllSAMSitesDead = true + Greece.MarkCompletedObjective(ObjectiveKillSAMSites) + + if BothNukeSilosDead then + DropChronoPrison() + end + end) + + Trigger.OnAllKilled(MissileSilos, function() + BothNukeSilosDead = true + Greece.MarkCompletedObjective(ObjectiveKillSilos) + + if not NukeDummy.IsDead then + NukeDummy.Destroy() + end + + if AllSAMSitesDead then + DropChronoPrison() + end + end) + + Trigger.OnKilled(Chronosphere, function(self, killer) + if not Greece.IsObjectiveFailed(ObjectiveKeepAlive) then + Greece.MarkCompletedObjective(ObjectiveKeepAlive) + end + Greece.MarkCompletedObjective(ObjectiveNeutralizeChronosphere) + end) + + if IsNormalOrAbove() then + HealCrate1.Destroy() + HealCrate3.Destroy() + if IsHardOrAbove() then + HealCrate2.Destroy() + end + end + + if IsNormalOrBelow() then + V22.Destroy() + + Utils.Do(Seals, function(a) + a.GrantCondition("difficulty-" .. Difficulty) + end) + + Trigger.AfterDelay(DateTime.Seconds(3), function() + Tip('Disguise your spy by "attacking" enemy infantry. Dogs can see through the disguise.') + Tip("Navy SEALs can swim.") + end) + + if Difficulty == "easy" then + V21.Destroy() + end + end + + if IsHardOrBelow() then + PatrollerA7.Destroy() + PatrollerC10.Destroy() + PatrolBoat2.Destroy() + end + + if IsVeryHardOrBelow() then + BrutalOnlyV2_1.Destroy() + BrutalOnlyV2_2.Destroy() + Utils.Do(Patrols[7].Units, function(a) + a.Destroy() + end) + end + + Trigger.OnEnteredProximityTrigger(Chronosphere.CenterPosition, WDist.New(8192), function(a, id) + if not IsChronosphereReached and IsMissionPlayer(a.Owner) then + IsChronosphereReached = true + Trigger.RemoveProximityTrigger(id) + SAPC1.GrantCondition("cloak-force-disabled", 25) + SAPC2.GrantCondition("cloak-force-disabled", 25) + Trigger.AfterDelay(DateTime.Seconds(3), function() + SAPC1.Move(SAPCRally1.Location) + SAPC1.Move(NodExit.Location) + SAPC1.Destroy() + SAPC2.Move(SAPCRally2.Location) + SAPC2.Move(NodExit.Location) + SAPC2.Destroy() + end) + end + end) + + Trigger.AfterDelay(NukeTimer[Difficulty] + DateTime.Seconds(3), function() + if not NukeDummy.IsDead then + if not TopSilo.IsDead then + TopSilo.ActivateNukePower(Chronosphere.Location) + elseif not BottomSilo.IsDead then + BottomSilo.ActivateNukePower(Chronosphere.Location) + end + NukeDummy.Destroy() + Media.PlaySound("nukelaunch.aud") + PlaySpeechNotificationToMissionPlayers("AbombLaunchDetected") + Notification("A-Bomb launch detected.") + + Trigger.AfterDelay(DateTime.Seconds(15), function() + WhiteOut = true + Media.PlaySound("crossrip.aud") + Trigger.AfterDelay(DateTime.Seconds(2), function() + if not Greece.IsObjectiveCompleted(ObjectiveKillSilos) then + Greece.MarkFailedObjective(ObjectiveKillSilos) + end + if not Greece.IsObjectiveCompleted(ObjectiveNeutralizeChronosphere) then + Greece.MarkFailedObjective(ObjectiveNeutralizeChronosphere) + end + end) + end) + end + end) + + AfterWorldLoaded() +end + +-- overridden in co-op version +SetupUnits = function() + Seals = { Seal1, Seal2 } + RespawnTrigger(Seal1, Seal1.Location) + RespawnTrigger(Seal2, Seal2.Location) + RespawnTrigger(Spy, Spy.Location) +end + +Sunrise = function() + local active = false + + if Lighting.Ambient < 0.85 then + Lighting.Ambient = Lighting.Ambient + 0.0002 + active = true + end + + if Lighting.Red > 0.9 then + Lighting.Red = Lighting.Red - 0.0005 + active = true + end + + if Lighting.Green > 1.25 then + Lighting.Green = Lighting.Green - 0.0002 + active = true + end + + if active then + Trigger.AfterDelay(5, function() + Sunrise() + end) + end +end + +DisableEastTeslas = function() + local teslaCoils = { EastTesla1, EastTesla2, EastTesla3, EastTesla4, EastTesla5 } + Utils.Do(teslaCoils, function(self) + if not self.IsDead then + self.GrantCondition("disabled") + end + end) +end + +DisableSouthTeslas = function() + local teslaCoils = { SouthTesla1, SouthTesla2 } + Utils.Do(teslaCoils, function(self) + if not self.IsDead then + self.GrantCondition("disabled") + end + end) +end + +DisableWestTeslas = function() + local teslaCoils = { WestTesla1, WestTesla2, WestTesla3, WestTesla4, WestTesla5 } + Utils.Do(teslaCoils, function(self) + if not self.IsDead then + self.GrantCondition("disabled") + end + end) +end + +DisableNorthTeslas = function() + local teslaCoils = { NorthTesla1, NorthTesla2, NorthTesla3, NorthTesla4, NorthTesla5, NorthTesla6 } + Utils.Do(teslaCoils, function(self) + if not self.IsDead then + self.GrantCondition("disabled") + end + end) +end + +DoShoreSAMFlare = function() + Trigger.AfterDelay(DateTime.Seconds(4), function() + ShoreSAMFlare = Actor.Create("flare", true, { Owner = Greece, Location = ShoreSAMFlareLocation }) + Notification("Signal flare detected. A shore SAM Site has been located. Press [" .. UtilsCA.Hotkey("ToLastEvent") .. "] to view location.") + MediaCA.PlaySound(MissionDir .. "/r_samlocated.aud", 2) + Beacon.New(Greece, ShoreSAMBeaconPosition) + Trigger.AfterDelay(DateTime.Seconds(10), function() + ShoreSAMFlare.Destroy() + end) + end) +end + +Tick = function() + if WhiteOut ~= nil and WhiteOut then + Lighting.Ambient = Lighting.Ambient + 0.015 + Lighting.Blue = Lighting.Blue + 0.01 + Lighting.Green = Lighting.Green + 0.005 + end + + OncePerSecondChecks() + OncePerFiveSecondChecks() + AfterTick() +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + USSR.Resources = USSR.ResourceCapacity - 500 + + if TimerTicks > 0 then + if TimerTicks > 25 then + TimerTicks = TimerTicks - 25 + else + TimerTicks = 0 + end + end + end +end + +OncePerFiveSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 125 == 0 then + + end +end + +OncePerThirtySecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % DateTime.Seconds(30) == 0 then + ResetBoats() + end +end + +-- Functions + +InitUSSR = function() + AutoRepairBuildings(USSR) + + Actor.Create("ai.unlimited.power", true, { Owner = USSR }) + + local ussrGroundAttackers = USSR.GetGroundAttackers() + + Utils.Do(ussrGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(4096), IsUSSRGroundHunterUnit) + end) + + if IsHardOrAbove() then + NukeDummy = Actor.Create("NukeDummyHard", true, { Owner = USSR, Location = Chronosphere.Location }) + elseif Difficulty == "easy" then + NukeDummy = Actor.Create("NukeDummyEasy", true, { Owner = USSR, Location = Chronosphere.Location }) + else + NukeDummy = Actor.Create("NukeDummyNormal", true, { Owner = USSR, Location = Chronosphere.Location }) + end + + if IsNormalOrBelow() then + local sovietInf = USSR.GetActorsByTypes({ "e1", "e2", "e3", "e4", "shok", "dog" }) + Utils.Do(sovietInf, function(a) + a.GrantCondition("difficulty-" .. Difficulty) + end) + end + + Trigger.AfterDelay(1, function() + Utils.Do(Patrols, function(p) + Utils.Do(p.Units, function(unit) + if not unit.IsDead then + unit.Patrol(p.Path, true) + end + end) + end) + end) +end + +ResetBoats = function() + Utils.Do(Patrols[1].Units, function(boat) + if not boat.IsDead then + local enemies = Utils.Where(Map.ActorsInCircle(boat.CenterPosition, WDist.New(5120)), function(a) + return IsMissionPlayer(a.Owner) + end) + if #enemies == 0 then + boat.Stop() + boat.Patrol(Patrols[1].Path, true) + end + end + end) +end + +DropChronoPrison = function() + ChronoPrisonFlare = Actor.Create("flare", true, { Owner = Greece, Location = CarryallDropPoint.Location }) + PlaySpeechNotificationToMissionPlayers("SignalFlare") + + Trigger.AfterDelay(DateTime.Seconds(1), function() + Notification("Signal flare detected. Press [" .. UtilsCA.Hotkey("ToLastEvent") .. "] to view location.") + Beacon.New(Greece, CarryallDropPoint.CenterPosition) + end) + + Trigger.AfterDelay(DateTime.Seconds(10), function() + local entryPath = { CarryallEntryPoint.Location, CarryallDropPoint.Location } + local exitPath = { CarryallEntryPoint.Location } + ReinforcementsCA.ReinforceWithTransport(Greece, "ocar.chpr", nil, entryPath, exitPath) + Notification("Rendezvous with the Chrono Prison and proceed to the Chronosphere.") + MediaCA.PlaySound(MissionDir .. "/r_cprendezvous.aud", 2) + + Trigger.OnEnteredProximityTrigger(CarryallDropPoint.CenterPosition, WDist.New(2048), function(a, id) + if a.Type == "chpr" then + Trigger.RemoveProximityTrigger(id) + ChronoPrisonFlare.Destroy() + a.GrantCondition("difficulty-" .. Difficulty) + TransferChronoPrisonOwnership(a) + + Trigger.OnKilled(a, function(self, killer) + if RespawnEnabled then + DropChronoPrison() + else + Greece.MarkFailedObjective(ObjectiveNeutralizeChronosphere) + end + end) + end + end) + end) +end + +RespawnTrigger = function(a, loc) + if RespawnEnabled then + Trigger.OnKilled(a, function(self, killer) + local name + if a.Type == "spy" then + name = "Spy" + else + name = "SEAL" + end + Notification(name .. " respawns in 20 seconds.") + Trigger.AfterDelay(DateTime.Seconds(20), function() + local respawnedActor = Actor.Create(a.Type, true, { Owner = a.Owner, Location = loc }) + Beacon.New(a.Owner, PlayerStart.CenterPosition) + Media.PlaySpeechNotification(a.Owner, "ReinforcementsArrived") + if a.Type == "seal" then + respawnedActor.GrantCondition("difficulty-" .. Difficulty) + end + RespawnTrigger(respawnedActor, loc) + end) + end) + end +end + +-- overridden in co-op version +TransferChronoPrisonOwnership = function(chronoPrison) + -- do nothing +end diff --git a/mods/ca/missions/main-campaign/ca04-containment/map.bin b/mods/ca/missions/main-campaign/ca04-containment/map.bin new file mode 100644 index 0000000000..0bafa62345 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca04-containment/map.bin differ diff --git a/mods/ca/missions/main-campaign/ca04-containment/map.png b/mods/ca/missions/main-campaign/ca04-containment/map.png new file mode 100644 index 0000000000..71c040b939 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca04-containment/map.png differ diff --git a/mods/ca/missions/main-campaign/ca04-containment/map.yaml b/mods/ca/missions/main-campaign/ca04-containment/map.yaml new file mode 100644 index 0000000000..c9079d7f39 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca04-containment/map.yaml @@ -0,0 +1,3498 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 04: Containment + +Author: Darkademic + +Tileset: TEMPERAT + +MapSize: 114,82 + +Bounds: 1,1,112,80 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: USSR, Greece + PlayerReference@Greece: + Name: Greece + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: allies + LockColor: True + Color: 99ACF2 + LockSpawn: True + LockTeam: True + Enemies: USSR, Creeps + PlayerReference@USSR: + Name: USSR + Bot: dormant + Faction: soviet + Color: FE1100 + Enemies: Greece, Creeps + PlayerReference@Nod: + Name: Nod + NonCombatant: True + Faction: nod + Color: FE1100 + +Actors: + Actor72: brik + Owner: Neutral + Location: 2,49 + Actor73: brik + Owner: Neutral + Location: 3,49 + Health: 62 + Actor74: brik + Owner: Neutral + Location: 4,49 + Health: 70 + Actor75: brik + Owner: Neutral + Location: 5,49 + Actor76: brik + Owner: Neutral + Location: 6,49 + Actor77: brik + Owner: Neutral + Location: 7,49 + Actor78: brik + Owner: Neutral + Location: 8,49 + Health: 72 + Actor79: brik + Owner: Neutral + Location: 9,49 + Health: 48 + Actor80: brik + Owner: Neutral + Location: 10,49 + Health: 60 + Actor81: brik + Owner: Neutral + Location: 11,49 + Actor82: brik + Owner: Neutral + Location: 12,49 + Actor83: brik + Owner: Neutral + Location: 13,49 + Health: 73 + Actor84: brik + Owner: Neutral + Location: 14,49 + Actor85: brik + Owner: Neutral + Location: 15,49 + Actor86: brik + Owner: Neutral + Location: 16,49 + Health: 54 + Actor87: brik + Owner: Neutral + Location: 17,49 + Health: 62 + Actor88: brik + Owner: Neutral + Location: 18,49 + Health: 45 + Actor89: brik + Owner: Neutral + Location: 19,49 + Actor90: brik + Owner: Neutral + Location: 20,49 + Health: 32 + Actor91: brik + Owner: Neutral + Location: 21,49 + Actor92: brik + Owner: Neutral + Location: 22,49 + Actor93: brik + Owner: Neutral + Location: 2,50 + Actor98: brik + Owner: Neutral + Location: 22,50 + Actor99: brik + Owner: Neutral + Location: 2,51 + Actor100: brik + Owner: Neutral + Location: 22,51 + Health: 64 + Actor101: brik + Owner: Neutral + Location: 2,52 + Health: 54 + Actor103: brik + Owner: Neutral + Location: 22,52 + Health: 73 + Actor104: brik + Owner: Neutral + Location: 2,53 + Actor105: brik + Owner: Neutral + Location: 3,53 + Actor107: brik + Owner: Neutral + Location: 22,53 + Actor108: brik + Owner: Neutral + Location: 2,54 + Health: 26 + Actor109: brik + Owner: Neutral + Location: 3,54 + Actor112: brik + Owner: Neutral + Location: 22,54 + Actor113: brik + Owner: Neutral + Location: 22,55 + Health: 67 + Actor116: brik + Owner: Neutral + Location: 22,56 + Health: 38 + Actor117: brik + Owner: Neutral + Location: 22,57 + Health: 40 + Actor118: brik + Owner: Neutral + Location: 2,58 + Actor119: brik + Owner: Neutral + Location: 3,58 + Actor120: brik + Owner: Neutral + Location: 22,58 + Health: 60 + Actor121: brik + Owner: Neutral + Location: 2,59 + Actor122: brik + Owner: Neutral + Location: 3,59 + Health: 23 + Actor125: brik + Owner: Neutral + Location: 22,59 + Health: 62 + Actor126: brik + Owner: Neutral + Location: 2,60 + Actor129: brik + Owner: Neutral + Location: 22,60 + Health: 61 + Actor130: brik + Owner: Neutral + Location: 2,61 + Health: 31 + Actor131: brik + Owner: Neutral + Location: 3,61 + Actor132: brik + Owner: Neutral + Location: 22,61 + Health: 62 + Actor133: brik + Owner: Neutral + Location: 2,62 + Actor134: brik + Owner: Neutral + Location: 3,62 + Health: 31 + Actor136: brik + Owner: Neutral + Location: 22,62 + Health: 28 + Actor140: brik + Owner: Neutral + Location: 22,63 + Health: 30 + Actor141: brik + Owner: Neutral + Location: 22,64 + Health: 24 + Actor142: brik + Owner: Neutral + Location: 21,65 + Health: 22 + Actor143: brik + Owner: Neutral + Location: 22,65 + Health: 14 + Actor145: brik + Owner: Neutral + Location: 21,66 + Health: 19 + Actor146: brik + Owner: Neutral + Location: 22,66 + Health: 18 + Actor147: brik + Owner: Neutral + Location: 2,67 + Actor148: brik + Owner: Neutral + Location: 3,67 + Health: 25 + Actor149: brik + Owner: Neutral + Location: 2,68 + Actor150: brik + Owner: Neutral + Location: 3,68 + Health: 25 + Actor155: brik + Owner: Neutral + Location: 2,69 + Health: 58 + Actor164: brik + Owner: Neutral + Location: 2,70 + Actor165: brik + Owner: Neutral + Location: 3,70 + Actor166: brik + Owner: Neutral + Location: 8,70 + Health: 37 + Actor167: brik + Owner: Neutral + Location: 9,70 + Health: 43 + Actor168: brik + Owner: Neutral + Location: 10,70 + Health: 65 + Actor169: brik + Owner: Neutral + Location: 11,70 + Health: 43 + Actor170: brik + Owner: Neutral + Location: 12,70 + Health: 28 + Actor179: brik + Owner: Neutral + Location: 2,71 + Actor180: brik + Owner: Neutral + Location: 3,71 + Actor181: brik + Owner: Neutral + Location: 4,71 + Health: 64 + Actor182: brik + Owner: Neutral + Location: 5,71 + Actor183: brik + Owner: Neutral + Location: 6,71 + Health: 56 + Actor184: brik + Owner: Neutral + Location: 7,71 + Health: 45 + Actor185: brik + Owner: Neutral + Location: 8,71 + Health: 30 + Chronosphere: pdox.crossrip + Owner: Creeps + Location: 18,72 + Actor197: tc05.husk + Owner: Neutral + Location: 9,73 + Actor202: tc01.husk + Owner: Neutral + Location: 4,73 + Actor203: tc03.husk + Owner: Neutral + Location: 5,74 + Actor205: tc04.husk + Owner: Neutral + Location: 7,74 + Actor206: t14.husk + Owner: Neutral + Location: 11,75 + Actor209: t14.husk + Owner: Neutral + Location: 11,75 + Actor211: t17.husk + Owner: Neutral + Location: 22,78 + Actor212: t17.husk + Owner: Neutral + Location: 22,78 + Actor213: tc02.husk + Owner: Neutral + Location: 15,79 + Actor215: t01.husk + Owner: Neutral + Location: 12,77 + Actor214: t12.husk + Owner: Neutral + Location: 4,75 + Actor216: t07.husk + Owner: Neutral + Location: 5,75 + Actor217: t14.husk + Owner: Neutral + Location: 2,75 + Actor218: t14.husk + Owner: Neutral + Location: 2,75 + Actor210: t10.husk + Owner: Neutral + Location: 13,79 + Actor94: tc05.husk + Owner: Neutral + Location: 26,56 + Actor95: t16.husk + Owner: Neutral + Location: 29,57 + Actor96: t10.husk + Owner: Neutral + Location: 25,63 + Actor97: t11.husk + Owner: Neutral + Location: 25,52 + Actor106: t15.husk + Owner: Neutral + Location: 26,70 + Actor110: tc04.husk + Owner: Neutral + Location: 27,75 + Actor111: t05.husk + Owner: Neutral + Location: 31,65 + Actor114: t13.husk + Owner: Neutral + Location: 11,45 + Actor115: tc03.husk + Owner: Neutral + Location: 16,45 + Actor124: t16.husk + Owner: Neutral + Location: 3,45 + Actor127: t12.husk + Owner: Neutral + Location: 1,45 + Actor128: t16.husk + Owner: Neutral + Location: 25,59 + Actor135: t14.husk + Owner: Neutral + Location: 24,57 + Actor137: tc05.husk + Owner: Neutral + Location: 28,78 + LandingCraft: lst.reinforce + Owner: Greece + Location: 98,6 + Facing: 384 + Actor312: brik + Owner: USSR + Location: 82,8 + Actor313: brik + Owner: USSR + Location: 81,8 + Actor314: brik + Owner: USSR + Location: 82,9 + Actor315: brik + Owner: USSR + Location: 81,9 + Actor316: brik + Owner: USSR + Location: 82,10 + Actor317: brik + Owner: USSR + Location: 83,10 + Actor318: brik + Owner: USSR + Location: 83,11 + Actor319: brik + Owner: USSR + Location: 83,12 + Actor320: brik + Owner: USSR + Location: 83,13 + Actor321: brik + Owner: USSR + Location: 84,13 + Actor322: brik + Owner: USSR + Location: 85,13 + Actor323: brik + Owner: USSR + Location: 86,13 + Actor324: brik + Owner: USSR + Location: 86,14 + Actor325: brik + Owner: USSR + Location: 85,14 + NorthTesla3: tsla + Owner: USSR + Location: 84,14 + Actor269: brik + Owner: USSR + Location: 72,20 + Actor337: brik + Owner: USSR + Location: 72,21 + Actor338: brik + Owner: USSR + Location: 73,21 + Actor339: brik + Owner: USSR + Location: 73,20 + Actor340: brik + Owner: USSR + Location: 74,21 + Actor341: brik + Owner: USSR + Location: 76,21 + Actor342: brik + Owner: USSR + Location: 75,21 + Actor343: brik + Owner: USSR + Location: 77,21 + Actor344: brik + Owner: USSR + Location: 77,20 + Actor345: brik + Owner: USSR + Location: 76,20 + Actor346: brik + Owner: USSR + Location: 82,20 + Actor347: brik + Owner: USSR + Location: 82,21 + Actor348: brik + Owner: USSR + Location: 83,21 + Actor350: brik + Owner: USSR + Location: 84,21 + Actor351: brik + Owner: USSR + Location: 85,21 + Actor352: brik + Owner: USSR + Location: 86,21 + Actor353: brik + Owner: USSR + Location: 86,20 + Actor354: brik + Owner: USSR + Location: 86,19 + Actor355: brik + Owner: USSR + Location: 86,18 + Actor356: brik + Owner: USSR + Location: 86,17 + Actor357: brik + Owner: USSR + Location: 85,17 + Actor358: brik + Owner: USSR + Location: 85,18 + NorthTesla1: tsla + Owner: USSR + Location: 75,20 + Actor361: ftur + Owner: USSR + Location: 77,22 + Actor363: ftur + Owner: USSR + Location: 81,22 + Actor364: ftur + Owner: USSR + Location: 81,22 + Actor349: brik + Owner: USSR + Location: 81,20 + Actor362: brik + Owner: USSR + Location: 81,21 + NorthTesla2: tsla + Owner: USSR + Location: 83,20 + PlayerStart: waypoint + Owner: Neutral + Location: 98,9 + Actor309: proc + Owner: USSR + Location: 79,14 + Actor295: ftur + Owner: USSR + Location: 96,24 + Actor296: ftur + Owner: USSR + Location: 100,24 + NorthBarracks1: barr + Owner: USSR + Location: 76,15 + Actor524: e1 + Owner: USSR + SubCell: 3 + Location: 97,18 + Facing: 888 + Actor525: e1 + Owner: USSR + SubCell: 3 + Location: 100,18 + Facing: 0 + Actor526: e1 + Owner: USSR + Location: 97,18 + SubCell: 1 + Facing: 166 + Actor527: e1 + Owner: USSR + SubCell: 3 + Location: 102,17 + Facing: 840 + Actor528: dog + Owner: USSR + Location: 100,18 + SubCell: 1 + Facing: 79 + NorthTesla4: tsla + Owner: USSR + Location: 81,10 + Actor605: ftur + Owner: USSR + Location: 83,7 + Actor609: e1 + Owner: USSR + SubCell: 3 + Location: 82,7 + Facing: 682 + Actor610: dog + Owner: USSR + Location: 82,7 + SubCell: 1 + Facing: 808 + Actor612: e1 + Owner: USSR + SubCell: 3 + Facing: 729 + Location: 81,6 + Actor613: e1 + Owner: USSR + SubCell: 1 + Facing: 793 + Location: 81,6 + Actor614: dog + Owner: USSR + SubCell: 2 + Facing: 753 + Location: 81,6 + Actor617: dog + Owner: USSR + SubCell: 3 + Facing: 570 + Location: 77,23 + Actor618: e1 + Owner: USSR + SubCell: 1 + Facing: 658 + Location: 77,23 + Actor619: dog + Owner: USSR + SubCell: 3 + Facing: 682 + Location: 81,23 + Actor620: e1 + Owner: USSR + SubCell: 1 + Facing: 507 + Location: 81,23 + Actor621: e1 + Owner: USSR + SubCell: 2 + Location: 81,23 + Facing: 697 + Actor606: e4 + Owner: USSR + Location: 77,23 + SubCell: 2 + Facing: 674 + Spy: spy + Owner: Greece + SubCell: 3 + Location: 98,11 + Facing: 531 + Seal1: seal + Owner: Greece + SubCell: 3 + Location: 97,9 + Facing: 388 + Seal2: seal + Owner: Greece + SubCell: 3 + Location: 99,9 + Facing: 697 + Actor289: spen + Owner: USSR + Location: 108,35 + Actor290: brik + Owner: USSR + Location: 100,36 + Actor291: brik + Owner: USSR + Location: 100,37 + Actor292: brik + Owner: USSR + Location: 101,36 + Actor293: brik + Owner: USSR + Location: 101,37 + Actor294: brik + Owner: USSR + Location: 102,36 + Actor297: brik + Owner: USSR + Location: 103,36 + Actor298: brik + Owner: USSR + Location: 103,37 + Actor299: brik + Owner: USSR + Location: 104,37 + Actor300: brik + Owner: USSR + Location: 104,36 + Actor301: brik + Owner: USSR + Location: 96,36 + Actor302: brik + Owner: USSR + Location: 96,37 + Actor303: brik + Owner: USSR + Location: 95,37 + Actor304: brik + Owner: USSR + Location: 95,36 + Actor305: brik + Owner: USSR + Location: 94,36 + Actor306: brik + Owner: USSR + Location: 93,36 + Actor310: brik + Owner: USSR + Location: 92,36 + Actor311: brik + Owner: USSR + Location: 92,37 + Actor326: brik + Owner: USSR + Location: 93,37 + Actor328: brik + Owner: USSR + Location: 88,34 + Actor367: brik + Owner: USSR + Location: 88,35 + Actor368: brik + Owner: USSR + Location: 91,36 + Actor466: brik + Owner: USSR + Location: 89,36 + Actor467: brik + Owner: USSR + Location: 90,36 + Actor468: brik + Owner: USSR + Location: 88,36 + Actor469: brik + Owner: USSR + Location: 87,34 + Actor470: brik + Owner: USSR + Location: 87,35 + Actor471: brik + Owner: USSR + Location: 86,34 + Actor472: brik + Owner: USSR + Location: 85,34 + Actor473: brik + Owner: USSR + Location: 84,34 + Actor474: brik + Owner: USSR + Location: 84,35 + Actor475: brik + Owner: USSR + Location: 85,35 + Actor476: brik + Owner: USSR + Location: 104,38 + Actor477: brik + Owner: USSR + Location: 104,39 + Actor489: brik + Owner: USSR + Location: 104,50 + Actor522: brik + Owner: USSR + Location: 84,47 + Actor530: brik + Owner: USSR + Location: 84,48 + Actor531: brik + Owner: USSR + Location: 84,49 + Actor532: brik + Owner: USSR + Location: 84,50 + EastTesla4: tsla + Owner: USSR + Location: 102,37 + EastTesla3: tsla + Owner: USSR + Location: 94,37 + EastTesla1: tsla + Owner: USSR + Location: 86,35 + Actor510: brik + Owner: USSR + Location: 84,36 + Actor511: brik + Owner: USSR + Location: 84,37 + Actor516: brik + Owner: USSR + Location: 84,38 + Actor541: brik + Owner: USSR + Location: 85,38 + Actor545: brik + Owner: USSR + Location: 84,39 + Actor547: brik + Owner: USSR + Location: 85,39 + Actor514: brik + Owner: USSR + Location: 84,43 + Actor515: brik + Owner: USSR + Location: 85,43 + Actor518: brik + Owner: USSR + Location: 84,44 + Actor519: brik + Owner: USSR + Location: 85,44 + Actor520: brik + Owner: USSR + Location: 84,45 + EastTesla5: tsla + Owner: USSR + Location: 85,45 + Actor542: brik + Owner: USSR + Location: 84,46 + Actor490: brik + Owner: USSR + Location: 84,51 + Actor491: brik + Owner: USSR + Location: 104,51 + Actor492: brik + Owner: USSR + Location: 84,52 + Actor493: brik + Owner: USSR + Location: 90,52 + Actor494: brik + Owner: USSR + Location: 91,52 + Actor495: brik + Owner: USSR + Location: 95,52 + Actor496: brik + Owner: USSR + Location: 96,52 + Actor497: brik + Owner: USSR + Location: 103,52 + Actor498: brik + Owner: USSR + Location: 104,52 + Actor499: brik + Owner: USSR + Location: 84,53 + Actor500: brik + Owner: USSR + Location: 85,53 + Actor501: brik + Owner: USSR + Location: 86,53 + Actor502: brik + Owner: USSR + Location: 87,53 + Actor503: brik + Owner: USSR + Location: 88,53 + Actor504: brik + Owner: USSR + Location: 89,53 + Actor505: brik + Owner: USSR + Location: 90,53 + Actor506: brik + Owner: USSR + Location: 91,53 + Actor507: brik + Owner: USSR + Location: 95,53 + Actor508: brik + Owner: USSR + Location: 96,53 + Actor509: brik + Owner: USSR + Location: 97,53 + Actor533: brik + Owner: USSR + Location: 98,53 + Actor534: brik + Owner: USSR + Location: 99,53 + Actor535: brik + Owner: USSR + Location: 100,53 + Actor536: brik + Owner: USSR + Location: 101,53 + Actor537: brik + Owner: USSR + Location: 102,53 + Actor546: brik + Owner: USSR + Location: 103,53 + Actor553: brik + Owner: USSR + Location: 104,53 + Actor555: chain + Owner: USSR + Location: 92,43 + Actor556: chain + Owner: USSR + Location: 93,43 + Actor557: chain + Owner: USSR + Location: 94,43 + Actor558: chain + Owner: USSR + Location: 95,43 + Actor559: chain + Owner: USSR + Location: 96,43 + Actor560: chain + Owner: USSR + Location: 97,43 + Actor561: chain + Owner: USSR + Location: 92,44 + Actor562: chain + Owner: USSR + Location: 97,44 + Actor563: chain + Owner: USSR + Location: 92,45 + EastReactor: npwr + Owner: USSR + Location: 93,45 + Actor565: chain + Owner: USSR + Location: 97,45 + Actor566: chain + Owner: USSR + Location: 92,46 + Actor567: chain + Owner: USSR + Location: 97,46 + Actor568: chain + Owner: USSR + Location: 92,47 + Actor569: chain + Owner: USSR + Location: 97,47 + Actor570: chain + Owner: USSR + Location: 92,48 + Actor571: chain + Owner: USSR + Location: 93,48 + Actor572: chain + Owner: USSR + Location: 96,48 + Actor573: chain + Owner: USSR + Location: 97,48 + Actor478: brik + Owner: USSR + Location: 104,40 + Actor479: brik + Owner: USSR + Location: 104,41 + Actor480: brik + Owner: USSR + Location: 103,42 + Actor481: brik + Owner: USSR + Location: 104,42 + Actor484: brik + Owner: USSR + Location: 103,43 + Actor548: brik + Owner: USSR + Location: 104,43 + Actor482: brik + Owner: USSR + Location: 103,47 + Actor483: brik + Owner: USSR + Location: 104,47 + Actor485: brik + Owner: USSR + Location: 103,48 + Actor486: brik + Owner: USSR + Location: 104,48 + Actor487: brik + Owner: USSR + Location: 104,49 + EastBarracks: barr + Owner: USSR + Location: 89,37 + EastKennel: kenn + Owner: USSR + Location: 87,38 + Actor550: apwr + Owner: USSR + Location: 85,50 + Actor551: apwr + Owner: USSR + Location: 85,47 + Actor552: fenc + Owner: USSR + Location: 98,48 + Actor554: fenc + Owner: USSR + Location: 98,47 + Actor574: fenc + Owner: USSR + Location: 98,46 + Actor575: fenc + Owner: USSR + Location: 98,45 + Actor576: fenc + Owner: USSR + Location: 98,44 + Actor577: fenc + Owner: USSR + Location: 98,43 + Actor578: fenc + Owner: USSR + Location: 91,43 + Actor579: fenc + Owner: USSR + Location: 91,44 + Actor580: fenc + Owner: USSR + Location: 91,45 + Actor581: fenc + Owner: USSR + Location: 91,46 + Actor582: fenc + Owner: USSR + Location: 91,47 + Actor583: fenc + Owner: USSR + Location: 91,48 + Actor587: brik + Owner: USSR + Location: 64,20 + Actor588: brik + Owner: USSR + Location: 64,19 + Actor589: brik + Owner: USSR + Location: 65,19 + Actor590: brik + Owner: USSR + Location: 65,20 + Actor591: brik + Owner: USSR + Location: 64,18 + Actor592: brik + Owner: USSR + Location: 64,17 + Actor593: brik + Owner: USSR + Location: 64,16 + Actor594: brik + Owner: USSR + Location: 65,16 + Actor595: brik + Owner: USSR + Location: 65,17 + Actor596: brik + Owner: USSR + Location: 64,12 + Actor597: brik + Owner: USSR + Location: 65,12 + Actor598: brik + Owner: USSR + Location: 64,11 + Actor599: brik + Owner: USSR + Location: 65,11 + Actor601: brik + Owner: USSR + Location: 64,10 + Actor602: brik + Owner: USSR + Location: 64,9 + Actor603: brik + Owner: USSR + Location: 64,8 + Actor604: brik + Owner: USSR + Location: 64,7 + Actor616: brik + Owner: USSR + Location: 65,7 + Actor622: brik + Owner: USSR + Location: 66,7 + ShoreSAM5: sam + Owner: USSR + Location: 61,73 + ShoreSAM4: sam + Owner: USSR + Location: 57,62 + ShoreSAM3: sam + Owner: USSR + Location: 64,55 + ShoreSAM2: sam + Owner: USSR + Location: 52,46 + Actor633: fenc + Owner: USSR + Location: 63,54 + Actor634: fenc + Owner: USSR + Location: 64,54 + Actor641: fenc + Owner: USSR + Location: 58,63 + Actor635: fenc + Owner: USSR + Location: 63,73 + Actor640: fenc + Owner: USSR + Location: 62,72 + Actor642: fenc + Owner: USSR + Location: 63,72 + Actor643: fenc + Owner: USSR + Location: 63,74 + Actor644: fenc + Owner: USSR + Location: 62,74 + Actor638: fenc + Owner: USSR + Location: 59,61 + Actor646: fenc + Owner: USSR + Location: 59,62 + Actor647: fenc + Owner: USSR + Location: 59,63 + Actor649: fenc + Owner: USSR + Location: 53,47 + Actor650: fenc + Owner: USSR + Location: 54,47 + Actor651: fenc + Owner: USSR + Location: 54,46 + Actor652: fenc + Owner: USSR + Location: 54,45 + Actor694: brik + Owner: USSR + Location: 91,67 + Actor701: brik + Owner: USSR + Location: 90,67 + Actor703: brik + Owner: USSR + Location: 88,67 + Actor704: brik + Owner: USSR + Location: 88,68 + Actor705: brik + Owner: USSR + Location: 88,69 + Actor706: brik + Owner: USSR + Location: 88,70 + Actor707: brik + Owner: USSR + Location: 88,71 + Actor708: brik + Owner: USSR + Location: 88,72 + Actor709: brik + Owner: USSR + Location: 89,72 + Actor715: brik + Owner: USSR + Location: 88,77 + Actor716: brik + Owner: USSR + Location: 88,78 + Actor717: brik + Owner: USSR + Location: 88,79 + Actor718: brik + Owner: USSR + Location: 88,80 + Actor719: brik + Owner: USSR + Location: 89,80 + Actor720: brik + Owner: USSR + Location: 90,80 + Actor721: brik + Owner: USSR + Location: 89,77 + Actor722: brik + Owner: USSR + Location: 89,73 + Actor728: brik + Owner: USSR + Location: 88,73 + Actor710: brik + Owner: USSR + Location: 91,80 + Actor711: brik + Owner: USSR + Location: 92,80 + Actor712: brik + Owner: USSR + Location: 93,80 + Actor733: brik + Owner: USSR + Location: 94,80 + Actor737: brik + Owner: USSR + Location: 95,80 + Actor739: brik + Owner: USSR + Location: 96,80 + Actor740: brik + Owner: USSR + Location: 97,80 + Actor744: brik + Owner: USSR + Location: 99,80 + Actor747: brik + Owner: USSR + Location: 98,80 + Actor667: brik + Owner: USSR + Location: 108,68 + Actor668: brik + Owner: USSR + Location: 108,69 + Actor669: brik + Owner: USSR + Location: 108,70 + Actor673: brik + Owner: USSR + Location: 108,71 + Actor678: brik + Owner: USSR + Location: 89,78 + Actor682: ftur + Owner: USSR + Location: 91,65 + Actor686: brik + Owner: USSR + Location: 88,66 + Actor692: brik + Owner: USSR + Location: 89,66 + Actor713: brik + Owner: USSR + Location: 90,66 + Actor714: brik + Owner: USSR + Location: 91,66 + Actor661: ftur + Owner: USSR + Location: 95,65 + Actor663: brik + Owner: USSR + Location: 95,66 + Actor666: brik + Owner: USSR + Location: 96,66 + Actor693: brik + Owner: USSR + Location: 97,66 + Actor695: brik + Owner: USSR + Location: 98,66 + Actor697: brik + Owner: USSR + Location: 99,66 + Actor699: brik + Owner: USSR + Location: 100,66 + Actor700: brik + Owner: USSR + Location: 101,66 + Actor702: brik + Owner: USSR + Location: 102,66 + Actor723: brik + Owner: USSR + Location: 103,66 + Actor724: brik + Owner: USSR + Location: 104,66 + Actor725: brik + Owner: USSR + Location: 105,66 + Actor726: brik + Owner: USSR + Location: 106,66 + Actor727: brik + Owner: USSR + Location: 107,66 + Actor729: brik + Owner: USSR + Location: 108,66 + Actor730: brik + Owner: USSR + Location: 95,67 + Actor731: brik + Owner: USSR + Location: 96,67 + Actor732: brik + Owner: USSR + Location: 108,67 + SouthTesla1: tsla + Owner: USSR + Location: 97,67 + SouthTesla2: tsla + Owner: USSR + Location: 89,67 + Actor698: brik + Owner: USSR + Location: 107,72 + Actor734: brik + Owner: USSR + Location: 108,72 + Actor753: brik + Owner: USSR + Location: 101,80 + Actor754: brik + Owner: USSR + Location: 100,80 + Actor755: brik + Owner: USSR + Location: 102,80 + Actor756: brik + Owner: USSR + Location: 102,80 + Actor757: brik + Owner: USSR + Location: 103,80 + Actor758: brik + Owner: USSR + Location: 104,80 + Actor759: brik + Owner: USSR + Location: 106,80 + Actor760: brik + Owner: USSR + Location: 105,80 + Actor761: brik + Owner: USSR + Location: 107,80 + Actor762: brik + Owner: USSR + Location: 108,80 + Actor763: brik + Owner: USSR + Location: 108,79 + Actor764: brik + Owner: USSR + Location: 108,78 + Actor664: fenc + Owner: USSR + Location: 97,70 + Actor665: chain + Owner: USSR + Location: 98,70 + Actor670: chain + Owner: USSR + Location: 99,70 + Actor671: chain + Owner: USSR + Location: 100,70 + Actor672: chain + Owner: USSR + Location: 101,70 + Actor674: chain + Owner: USSR + Location: 102,70 + Actor675: chain + Owner: USSR + Location: 103,70 + Actor676: fenc + Owner: USSR + Location: 104,70 + Actor677: fenc + Owner: USSR + Location: 97,71 + Actor679: chain + Owner: USSR + Location: 98,71 + Actor680: chain + Owner: USSR + Location: 103,71 + Actor681: fenc + Owner: USSR + Location: 104,71 + Actor683: fenc + Owner: USSR + Location: 97,72 + Actor684: chain + Owner: USSR + Location: 98,72 + SouthReactor: npwr + Owner: USSR + Location: 99,72 + Actor687: chain + Owner: USSR + Location: 103,72 + Actor688: fenc + Owner: USSR + Location: 104,72 + Actor689: fenc + Owner: USSR + Location: 97,73 + Actor690: chain + Owner: USSR + Location: 98,73 + Actor691: chain + Owner: USSR + Location: 103,73 + Actor736: fenc + Owner: USSR + Location: 104,73 + Actor738: fenc + Owner: USSR + Location: 97,74 + Actor741: chain + Owner: USSR + Location: 98,74 + Actor742: chain + Owner: USSR + Location: 103,74 + Actor745: fenc + Owner: USSR + Location: 97,75 + Actor746: chain + Owner: USSR + Location: 98,75 + Actor748: chain + Owner: USSR + Location: 99,75 + Actor749: chain + Owner: USSR + Location: 102,75 + Actor750: chain + Owner: USSR + Location: 103,75 + Actor735: brik + Owner: USSR + Location: 107,71 + Actor752: brik + Owner: USSR + Location: 107,76 + Actor765: brik + Owner: USSR + Location: 108,76 + Actor766: brik + Owner: USSR + Location: 107,77 + Actor767: brik + Owner: USSR + Location: 108,77 + NorthFactory: weap + Owner: USSR + Location: 69,15 + Actor751: fix + Owner: USSR + Location: 73,11 + NorthBarracks2: barr + Owner: USSR + Location: 76,7 + Actor769: kenn + Owner: USSR + Location: 78,12 + PatrollerA1: e1 + Owner: USSR + SubCell: 3 + Location: 89,41 + Facing: 384 + PatrollerA2: e1 + Owner: USSR + Location: 89,41 + SubCell: 1 + Facing: 384 + PatrollerA3: e1 + Owner: USSR + Location: 88,41 + SubCell: 3 + Facing: 384 + PatrollerA6: dog + Owner: USSR + Location: 90,41 + SubCell: 3 + Facing: 384 + PatrollerA5: e3 + Owner: USSR + Location: 89,40 + SubCell: 3 + Facing: 384 + Actor776: mine + Owner: Neutral + Location: 87,26 + Actor777: mine + Owner: Neutral + Location: 89,18 + SouthBarracks: barr + Owner: USSR + Location: 94,72 + SouthKennel: kenn + Owner: USSR + Location: 91,70 + NorthTesla5: tsla + Owner: USSR + Location: 65,18 + NorthTesla6: tsla + Owner: USSR + Location: 65,10 + Actor787: ftur + Owner: USSR + Location: 63,16 + Actor788: ftur + Owner: USSR + Location: 63,12 + Actor790: brik + Owner: USSR + Location: 15,12 + Actor791: brik + Owner: USSR + Location: 16,12 + Actor792: brik + Owner: USSR + Location: 17,12 + Actor793: brik + Owner: USSR + Location: 18,12 + Actor794: brik + Owner: USSR + Location: 19,12 + Actor795: brik + Owner: USSR + Location: 20,12 + Actor796: brik + Owner: USSR + Location: 21,12 + Actor797: brik + Owner: USSR + Location: 22,12 + Actor798: brik + Owner: USSR + Location: 23,12 + Actor799: brik + Owner: USSR + Location: 24,12 + Actor800: brik + Owner: USSR + Location: 25,12 + Actor801: brik + Owner: USSR + Location: 29,12 + Actor802: brik + Owner: USSR + Location: 30,12 + Actor803: brik + Owner: USSR + Location: 30,12 + Actor804: brik + Owner: USSR + Location: 31,12 + Actor805: brik + Owner: USSR + Location: 32,12 + Actor806: brik + Owner: USSR + Location: 33,12 + Actor807: brik + Owner: USSR + Location: 34,12 + Actor808: brik + Owner: USSR + Location: 35,12 + Actor809: brik + Owner: USSR + Location: 36,12 + Actor810: brik + Owner: USSR + Location: 37,12 + Actor811: brik + Owner: USSR + Location: 38,12 + Actor812: brik + Owner: USSR + Location: 15,13 + Actor813: brik + Owner: USSR + Location: 24,13 + Actor814: brik + Owner: USSR + Location: 25,13 + Actor815: brik + Owner: USSR + Location: 29,13 + Actor816: brik + Owner: USSR + Location: 30,13 + Actor817: brik + Owner: USSR + Location: 30,13 + Actor818: fact + Owner: USSR + Location: 35,13 + Actor819: brik + Owner: USSR + Location: 38,13 + Actor820: brik + Owner: USSR + Location: 15,14 + Actor821: brik + Owner: USSR + Location: 38,14 + Actor822: brik + Owner: USSR + Location: 15,15 + Actor824: brik + Owner: USSR + Location: 38,15 + Actor825: brik + Owner: USSR + Location: 15,16 + Actor827: brik + Owner: USSR + Location: 38,16 + Actor828: brik + Owner: USSR + Location: 38,17 + Actor829: brik + Owner: USSR + Location: 38,18 + Actor850: brik + Owner: USSR + Location: 15,22 + Actor854: brik + Owner: USSR + Location: 15,23 + Actor858: brik + Owner: USSR + Location: 38,23 + Actor859: brik + Owner: USSR + Location: 15,24 + Actor865: brik + Owner: USSR + Location: 38,24 + Actor866: brik + Owner: USSR + Location: 15,25 + Actor867: brik + Owner: USSR + Location: 15,26 + Actor868: brik + Owner: USSR + Location: 15,27 + Actor870: brik + Owner: USSR + Location: 38,27 + Actor871: brik + Owner: USSR + Location: 15,28 + Actor873: brik + Owner: USSR + Location: 38,28 + Actor874: brik + Owner: USSR + Location: 15,29 + Actor875: brik + Owner: USSR + Location: 38,29 + Actor876: brik + Owner: USSR + Location: 15,30 + Actor877: brik + Owner: USSR + Location: 16,30 + Actor878: brik + Owner: USSR + Location: 37,30 + Actor879: brik + Owner: USSR + Location: 38,30 + Actor880: brik + Owner: USSR + Location: 15,31 + Actor881: brik + Owner: USSR + Location: 16,31 + Actor882: brik + Owner: USSR + Location: 17,31 + Actor883: brik + Owner: USSR + Location: 18,31 + Actor884: brik + Owner: USSR + Location: 19,31 + Actor885: brik + Owner: USSR + Location: 20,31 + Actor886: brik + Owner: USSR + Location: 21,31 + Actor887: brik + Owner: USSR + Location: 22,31 + Actor888: brik + Owner: USSR + Location: 23,31 + Actor889: brik + Owner: USSR + Location: 24,31 + Actor893: brik + Owner: USSR + Location: 28,31 + Actor894: brik + Owner: USSR + Location: 29,31 + Actor895: brik + Owner: USSR + Location: 30,31 + Actor896: brik + Owner: USSR + Location: 31,31 + Actor897: brik + Owner: USSR + Location: 32,31 + Actor898: brik + Owner: USSR + Location: 33,31 + Actor899: brik + Owner: USSR + Location: 34,31 + Actor900: brik + Owner: USSR + Location: 35,31 + Actor901: brik + Owner: USSR + Location: 36,31 + Actor902: brik + Owner: USSR + Location: 37,31 + Actor903: brik + Owner: USSR + Location: 38,31 + Actor848: proc + Owner: USSR + Location: 31,20 + Actor830: chain + Owner: USSR + Location: 23,18 + Actor831: chain + Owner: USSR + Location: 24,18 + Actor832: chain + Owner: USSR + Location: 25,18 + Actor833: chain + Owner: USSR + Location: 26,18 + Actor834: chain + Owner: USSR + Location: 27,18 + Actor835: chain + Owner: USSR + Location: 28,18 + Actor839: chain + Owner: USSR + Location: 23,19 + Actor840: chain + Owner: USSR + Location: 28,19 + WestReactor: npwr + Owner: USSR + Location: 24,20 + Actor847: chain + Owner: USSR + Location: 28,20 + Actor852: chain + Owner: USSR + Location: 28,21 + Actor856: chain + Owner: USSR + Location: 28,22 + Actor860: chain + Owner: USSR + Location: 23,23 + Actor861: chain + Owner: USSR + Location: 24,23 + Actor862: chain + Owner: USSR + Location: 27,23 + Actor863: chain + Owner: USSR + Location: 28,23 + TopSilo: mslo + Owner: USSR + Location: 5,5 + Actor905: chain + Owner: USSR + Location: 4,4 + Actor906: chain + Owner: USSR + Location: 4,5 + Actor907: chain + Owner: USSR + Location: 5,4 + Actor908: chain + Owner: USSR + Location: 6,4 + Actor909: chain + Owner: USSR + Location: 7,4 + Actor911: chain + Owner: USSR + Location: 7,6 + Actor912: chain + Owner: USSR + Location: 4,6 + Actor913: chain + Owner: USSR + Location: 5,6 + Actor914: chain + Owner: USSR + Location: 7,5 + Actor915: chain + Owner: USSR + Location: 4,19 + Actor916: chain + Owner: USSR + Location: 4,20 + Actor917: chain + Owner: USSR + Location: 4,21 + BottomSilo: mslo + Owner: USSR + Location: 5,20 + Actor924: chain + Owner: USSR + Location: 6,21 + Actor932: chain + Owner: USSR + Location: 7,21 + Actor933: chain + Owner: USSR + Location: 5,19 + Actor934: chain + Owner: USSR + Location: 6,19 + Actor935: chain + Owner: USSR + Location: 7,19 + Actor937: chain + Owner: USSR + Location: 7,20 + Actor836: brik + Owner: USSR + Location: 38,19 + Actor841: brik + Owner: USSR + Location: 37,19 + Actor842: brik + Owner: USSR + Location: 37,18 + Actor910: brik + Owner: USSR + Location: 38,24 + Actor918: brik + Owner: USSR + Location: 38,25 + Actor919: brik + Owner: USSR + Location: 38,26 + Actor857: brik + Owner: USSR + Location: 37,23 + Actor849: brik + Owner: USSR + Location: 37,24 + Actor837: brik + Owner: USSR + Location: 15,18 + Actor838: brik + Owner: USSR + Location: 15,17 + Actor843: brik + Owner: USSR + Location: 16,17 + Actor844: brik + Owner: USSR + Location: 16,18 + Actor823: brik + Owner: USSR + Location: 16,22 + Actor826: brik + Owner: USSR + Location: 16,23 + ShoreSAM1: sam + Owner: USSR + Location: 58,35 + Actor630: fenc + Owner: USSR + Location: 58,36 + Actor654: fenc + Owner: USSR + Location: 60,36 + Actor655: fenc + Owner: USSR + Location: 59,36 + Actor656: fenc + Owner: USSR + Location: 57,36 + Actor657: fenc + Owner: USSR + Location: 60,35 + Actor785: silo + Owner: USSR + Location: 79,14 + Actor864: silo + Owner: USSR + Location: 81,14 + Actor869: silo + Owner: USSR + Location: 33,20 + Actor872: silo + Owner: USSR + Location: 31,20 + Actor920: sam + Owner: USSR + Location: 9,5 + Actor921: sam + Owner: USSR + Location: 4,9 + Actor923: sam + Owner: USSR + Location: 5,17 + Actor925: sam + Owner: USSR + Location: 8,24 + WestFactory: weap + Owner: USSR + Location: 17,26 + Actor927: stek + Owner: USSR + Location: 16,13 + NorthRadar: dome + Owner: USSR + Location: 70,8 + WestRadar: dome + Owner: USSR + Location: 34,27 + WestTesla1: tsla + Owner: USSR + Location: 37,17 + WestTesla2: tsla + Owner: USSR + Location: 37,25 + Actor940: ftur + Owner: USSR + Location: 39,23 + Actor941: ftur + Owner: USSR + Location: 39,19 + Actor942: brik + Owner: USSR + Location: 24,30 + Actor943: brik + Owner: USSR + Location: 23,30 + Actor944: brik + Owner: USSR + Location: 28,30 + Actor945: brik + Owner: USSR + Location: 29,30 + WestTesla3: tsla + Owner: USSR + Location: 30,30 + WestTesla4: tsla + Owner: USSR + Location: 22,30 + WestBarracks: barr + Owner: USSR + Location: 32,13 + Actor930: fix + Owner: USSR + Location: 28,26 + WestKennel: kenn + Owner: USSR + Location: 32,17 + Actor936: sam + Owner: USSR + Location: 20,14 + Actor946: ftur + Owner: USSR + Location: 24,32 + Actor947: ftur + Owner: USSR + Location: 28,32 + Actor948: ftur + Owner: USSR + Location: 83,43 + Actor949: ftur + Owner: USSR + Location: 83,39 + EastTesla2: tsla + Owner: USSR + Location: 85,37 + Actor951: ftur + Owner: USSR + Location: 96,35 + Actor952: ftur + Owner: USSR + Location: 100,35 + Actor953: tc05 + Owner: Neutral + Faction: russia + Location: 59,8 + Actor954: tc04 + Owner: Neutral + Faction: russia + Location: 49,10 + Actor955: t15 + Owner: Neutral + Faction: russia + Location: 45,5 + Actor956: t10 + Owner: Neutral + Faction: russia + Location: 44,1 + Actor957: t12 + Owner: Neutral + Faction: russia + Location: 46,9 + Actor958: t17 + Owner: Neutral + Faction: russia + Location: 46,17 + Actor959: tc02 + Owner: Neutral + Faction: russia + Location: 49,32 + Actor960: tc01 + Owner: Neutral + Faction: russia + Location: 43,41 + Actor961: t05 + Owner: Neutral + Faction: russia + Location: 43,45 + Actor962: t07 + Owner: Neutral + Faction: russia + Location: 41,44 + Actor964: t06 + Owner: Neutral + Faction: russia + Location: 40,44 + Actor965: t07 + Owner: Neutral + Faction: russia + Location: 48,41 + Actor966: tc04 + Owner: Neutral + Faction: russia + Location: 40,33 + Actor967: t15 + Owner: Neutral + Faction: russia + Location: 41,34 + Actor968: t12 + Owner: Neutral + Faction: russia + Location: 39,34 + Actor969: t16 + Owner: Neutral + Faction: russia + Location: 16,36 + Actor970: tc05.husk + Owner: Neutral + Location: 28,61 + Actor971: tc01.husk + Owner: Neutral + Location: 33,51 + Actor973: t06.husk + Owner: Neutral + Location: 33,55 + Actor974: t12.husk + Owner: Neutral + Location: 29,53 + Actor972: tc02.husk + Owner: Neutral + Location: 36,57 + Actor975: t12.husk + Owner: Neutral + Location: 34,63 + Actor976: t10.husk + Owner: Neutral + Location: 17,41 + Actor977: tc02.husk + Owner: Neutral + Location: 18,39 + Actor978: tc04.husk + Owner: Neutral + Location: 10,41 + Actor980: t15.husk + Owner: Neutral + Location: 11,38 + Actor981: t11.husk + Owner: Neutral + Location: 11,29 + Actor982: t15.husk + Owner: Neutral + Location: 12,36 + Actor983: t14.husk + Owner: Neutral + Location: 10,36 + Actor984: t12.husk + Owner: Neutral + Location: 14,39 + Actor985: tc04.husk + Owner: Neutral + Location: 10,33 + Actor986: tc05.husk + Owner: Neutral + Location: 7,30 + Actor987: t14.husk + Owner: Neutral + Location: 8,32 + Actor988: t12.husk + Owner: Neutral + Location: 3,29 + Actor989: t07.husk + Owner: Neutral + Location: 11,31 + Actor990: t10.husk + Owner: Neutral + Location: 12,35 + Actor991: t13.husk + Owner: Neutral + Location: 7,35 + Actor992: t06.husk + Owner: Neutral + Location: 2,38 + Actor993: tc02.husk + Owner: Neutral + Location: 2,33 + Actor994: t14.husk + Owner: Neutral + Location: 4,33 + Actor995: t17.husk + Owner: Neutral + Location: 8,39 + Actor996: t16.husk + Owner: Neutral + Location: 4,42 + Actor997: tc01.husk + Owner: Neutral + Location: 4,38 + Actor998: tc01.husk + Owner: Neutral + Location: 38,75 + Actor999: t14.husk + Owner: Neutral + Location: 35,76 + Actor1000: t12.husk + Owner: Neutral + Location: 34,75 + Actor1002: t10.husk + Owner: Neutral + Location: 34,69 + Actor1003: t13.husk + Owner: Neutral + Location: 33,68 + Actor1004: t16.husk + Owner: Neutral + Location: 42,77 + Actor1006: tc01.husk + Owner: Neutral + Location: 46,61 + Actor1007: t15.husk + Owner: Neutral + Location: 38,63 + Actor1008: t07.husk + Owner: Neutral + Location: 49,61 + Actor1009: t06.husk + Owner: Neutral + Location: 52,64 + Actor1010: tc01.husk + Owner: Neutral + Location: 50,65 + Actor1011: t15.husk + Owner: Neutral + Location: 55,67 + Actor1012: tc04.husk + Owner: Neutral + Location: 52,74 + Actor1013: tc01.husk + Owner: Neutral + Location: 49,76 + Actor1014: tc03.husk + Owner: Neutral + Location: 42,69 + Actor1015: t15.husk + Owner: Neutral + Location: 40,70 + Actor1016: t16.husk + Owner: Neutral + Location: 55,78 + Actor1017: t17.husk + Owner: Neutral + Location: 28,47 + Actor102: t02.husk + Owner: Neutral + Location: 23,45 + Actor963: tc05 + Owner: Neutral + Location: 28,40 + Actor1001: t17 + Owner: Neutral + Location: 37,42 + Actor1005: tc03 + Owner: Neutral + Location: 47,48 + Actor1018: t16 + Owner: Neutral + Location: 48,46 + Actor1019: t11.husk + Owner: Neutral + Location: 39,50 + Actor1020: t15.husk + Owner: Neutral + Location: 34,50 + Actor1021: t05.husk + Owner: Neutral + Location: 32,45 + Actor1022: t17.husk + Owner: Neutral + Location: 41,66 + Actor1023: tc05 + Owner: Neutral + Location: 10,15 + Actor1025: t17 + Owner: Neutral + Location: 7,23 + Actor1026: t11 + Owner: Neutral + Location: 9,22 + Actor1027: t13 + Owner: Neutral + Location: 13,25 + Actor1028: tc01 + Owner: Neutral + Location: 5,11 + Actor1029: t07 + Owner: Neutral + Location: 3,8 + Actor1030: t01 + Owner: Neutral + Location: 10,3 + Actor1031: tc03 + Owner: Neutral + Location: 8,4 + Actor1032: tc02 + Owner: Neutral + Location: 4,2 + Actor1033: tc02 + Owner: Neutral + Location: 9,8 + Actor1034: t10 + Owner: Neutral + Location: 9,7 + Actor1035: t12 + Owner: Neutral + Location: 8,8 + Actor1036: t15 + Owner: Neutral + Location: 22,10 + Actor1037: t12 + Owner: Neutral + Location: 27,4 + Actor1040: t02 + Owner: Neutral + Location: 22,3 + Actor1041: t01 + Owner: Neutral + Location: 20,8 + Actor1042: t07 + Owner: Neutral + Location: 4,25 + Actor1043: t13 + Owner: Neutral + Location: 3,16 + Actor1044: tc02 + Owner: Neutral + Location: 3,15 + Actor1045: t02 + Owner: Neutral + Location: 5,14 + Actor1046: t01 + Owner: Neutral + Location: 4,14 + Actor1047: t01 + Owner: Neutral + Location: 8,15 + Actor1051: t07 + Owner: Neutral + Location: 58,19 + Actor1052: t15 + Owner: Neutral + Location: 55,20 + Actor1056: tc04 + Owner: Neutral + Location: 72,0 + Actor1057: tc01 + Owner: Neutral + Location: 79,2 + Actor1058: t15 + Owner: Neutral + Location: 74,1 + Actor1059: t15 + Owner: Neutral + Location: 74,1 + Actor1061: t17 + Owner: Neutral + Location: 78,1 + Actor1064: tc01 + Owner: Neutral + Location: 54,5 + Actor1065: t16 + Owner: Neutral + Location: 53,5 + Actor1066: t07 + Owner: Neutral + Location: 56,4 + Actor1067: mine + Owner: Neutral + Location: 44,14 + Actor1068: mine + Owner: Neutral + Location: 20,34 + Actor1069: t11 + Owner: Neutral + Location: 41,26 + Actor1070: t02 + Owner: Neutral + Location: 45,28 + Actor1071: t06 + Owner: Neutral + Location: 32,34 + Actor1072: t07 + Owner: Neutral + Location: 28,36 + Actor1073: t05 + Owner: Neutral + Location: 51,40 + Actor1074: t02 + Owner: Neutral + Location: 57,30 + Actor1075: t07 + Owner: Neutral + Location: 56,42 + Actor1076: t11 + Owner: Neutral + Location: 58,39 + Actor1077: tc01 + Owner: Neutral + Location: 60,45 + Actor1078: t12 + Owner: Neutral + Location: 57,43 + Actor1079: t11 + Owner: Neutral + Location: 55,54 + Actor1080: tc04 + Owner: Neutral + Location: 56,51 + Actor1083: t12 + Owner: Neutral + Location: 66,59 + Actor1084: t05 + Owner: Neutral + Location: 59,57 + Actor1085: t02 + Owner: Neutral + Location: 54,59 + Actor1086: tc04 + Owner: Neutral + Location: 66,69 + Actor1087: tc03 + Owner: Neutral + Location: 68,68 + Actor1088: t06 + Owner: Neutral + Location: 67,67 + Actor1089: t02 + Owner: Neutral + Location: 64,78 + Actor1090: t14 + Owner: Neutral + Location: 61,77 + Actor1091: t17 + Owner: Neutral + Location: 64,52 + Actor1092: tc01 + Owner: Neutral + Location: 83,70 + Actor1093: tc05 + Owner: Neutral + Location: 109,48 + Actor1094: tc02 + Owner: Neutral + Location: 75,31 + Actor1095: t12 + Owner: Neutral + Location: 80,28 + Actor1096: t17 + Owner: Neutral + Location: 76,43 + Actor1097: t12 + Owner: Neutral + Location: 87,77 + Actor1098: t12 + Owner: Neutral + Location: 87,77 + Actor1099: t16 + Owner: Neutral + Location: 106,60 + Actor1100: t02 + Owner: Neutral + Location: 111,63 + Actor1101: tc03 + Owner: Neutral + Location: 105,11 + PatrolA6: waypoint + Owner: Neutral + Location: 89,49 + PatrolA5: waypoint + Owner: Neutral + Location: 90,50 + PatrolA4: waypoint + Owner: Neutral + Location: 99,50 + PatrolA3: waypoint + Owner: Neutral + Location: 100,49 + PatrolA2: waypoint + Owner: Neutral + Location: 100,41 + PatrolA7: waypoint + Owner: Neutral + Location: 80,41 + PatrolA8: waypoint + Owner: Neutral + Location: 79,40 + PatrolA9: waypoint + Owner: Neutral + Location: 79,27 + PatrolA1: waypoint + Owner: Neutral + Location: 89,41 + PatrollerA4: e4 + Owner: USSR + SubCell: 3 + Location: 89,42 + Facing: 384 + PatrollerB4: dog + Owner: USSR + SubCell: 3 + Location: 83,75 + Facing: 384 + PatrollerB2: e1 + Owner: USSR + Location: 84,75 + SubCell: 3 + Facing: 384 + PatrollerB5: e1 + Owner: USSR + Location: 82,75 + SubCell: 3 + Facing: 384 + PatrollerB3: e1 + Owner: USSR + SubCell: 1 + Location: 84,75 + Facing: 384 + PatrollerB6: e2 + Owner: USSR + Location: 82,75 + SubCell: 1 + Facing: 384 + PatrolB1: waypoint + Owner: Neutral + Location: 83,75 + PatrolB2: waypoint + Owner: Neutral + Location: 93,75 + PatrolB3: waypoint + Owner: Neutral + Location: 93,50 + PatrolB4: waypoint + Owner: Neutral + Location: 95,75 + PatrolB5: waypoint + Owner: Neutral + Location: 97,77 + PatrolB6: waypoint + Owner: Neutral + Location: 104,77 + PatrolB7: waypoint + Owner: Neutral + Location: 105,76 + PatrolB8: waypoint + Owner: Neutral + Location: 105,74 + PatrolB9: waypoint + Owner: Neutral + Location: 112,74 + BoatPatrol1: waypoint + Owner: Neutral + Location: 73,76 + PatrolBoat: seas + Owner: USSR + Location: 73,75 + Facing: 512 + Actor846: e1 + Owner: USSR + Location: 95,35 + SubCell: 3 + Facing: 1007 + Actor904: e1 + Owner: USSR + Location: 101,35 + SubCell: 3 + Facing: 1023 + Actor922: e1 + Owner: USSR + SubCell: 3 + Location: 97,36 + Facing: 872 + Actor1102: e1 + Owner: USSR + SubCell: 3 + Location: 99,36 + Facing: 166 + Actor1103: e2 + Owner: USSR + SubCell: 3 + Location: 105,47 + Facing: 911 + Actor1104: e2 + Owner: USSR + SubCell: 3 + Location: 106,48 + Facing: 1023 + Actor1105: dog + Owner: USSR + SubCell: 3 + Location: 78,21 + Facing: 666 + PatrollerC6: e1 + Owner: USSR + SubCell: 3 + Location: 64,76 + Facing: 384 + PatrollerC5: e1 + Owner: USSR + Location: 64,76 + SubCell: 1 + Facing: 384 + PatrollerC4: e1 + Owner: USSR + SubCell: 3 + Location: 65,75 + Facing: 384 + PatrollerC8: e4 + Owner: USSR + SubCell: 3 + Location: 65,77 + Facing: 384 + PatrollerC7: e2 + Owner: USSR + Location: 64,77 + SubCell: 3 + Facing: 384 + PatrollerC2: e2 + Owner: USSR + SubCell: 3 + Location: 66,74 + Facing: 384 + PatrollerC3: e1 + Owner: USSR + SubCell: 1 + Location: 66,74 + Facing: 384 + PatrollerC1: e1 + Owner: USSR + Location: 66,74 + SubCell: 2 + Facing: 384 + Actor1063: brik + Owner: USSR + Location: 67,7 + Actor1106: brik + Owner: USSR + Location: 67,8 + Actor1109: brik + Owner: USSR + Location: 65,8 + Actor1053: brik + Owner: USSR + Location: 68,7 + Actor1107: brik + Owner: USSR + Location: 68,8 + PatrollerD2: e1 + Owner: USSR + SubCell: 3 + Location: 48,8 + Facing: 384 + PatrollerD3: e1 + Owner: USSR + Location: 48,8 + SubCell: 1 + Facing: 384 + PatrollerD4: dog + Owner: USSR + SubCell: 3 + Location: 47,8 + Facing: 384 + PatrollerD1: e1 + Owner: USSR + Location: 48,9 + SubCell: 3 + Facing: 384 + PatrollerD6: e4 + Owner: USSR + Location: 47,7 + SubCell: 3 + Facing: 384 + PatrollerD5: e2 + Owner: USSR + Location: 46,8 + SubCell: 3 + Facing: 384 + PatrolD1: waypoint + Owner: Neutral + Location: 48,8 + PatrolD2: waypoint + Owner: Neutral + Location: 48,36 + V21: v2rl + Owner: USSR + Location: 78,18 + Facing: 523 + V22: v2rl + Owner: USSR + Location: 19,4 + Facing: 682 + Actor1111: ftur + Owner: USSR + Location: 63,42 + Actor1112: ftur + Owner: USSR + Location: 68,67 + PatrollerE1: e1 + Owner: USSR + SubCell: 3 + Location: 27,11 + Facing: 384 + PatrollerE2: dog + Owner: USSR + Location: 27,10 + SubCell: 3 + Facing: 384 + PatrollerE5: e1 + Owner: USSR + SubCell: 3 + Location: 27,9 + Facing: 384 + PatrollerE6: e4 + Owner: USSR + SubCell: 1 + Location: 27,9 + Facing: 384 + PatrollerE3: e2 + Owner: USSR + Location: 26,10 + SubCell: 3 + Facing: 384 + PatrollerE4: e3 + Owner: USSR + Location: 28,10 + SubCell: 3 + Facing: 384 + PatrolE1: waypoint + Owner: Neutral + Location: 27,12 + PatrolE2: waypoint + Owner: Neutral + Location: 27,15 + PatrolE3: waypoint + Owner: Neutral + Location: 26,16 + PatrolE4: waypoint + Owner: Neutral + Location: 20,16 + PatrolE5: waypoint + Owner: Neutral + Location: 20,20 + PatrolE6: waypoint + Owner: Neutral + Location: 12,20 + PatrolE7: waypoint + Owner: Neutral + Location: 20,24 + PatrolE8: waypoint + Owner: Neutral + Location: 21,25 + PatrolE9: waypoint + Owner: Neutral + Location: 34,25 + PatrolE10: waypoint + Owner: Neutral + Location: 35,24 + PatrolE11: waypoint + Owner: Neutral + Location: 35,21 + Actor1113: v2rl + Owner: USSR + Location: 36,30 + Facing: 634 + Actor1115: apoc + Owner: USSR + Location: 37,73 + Facing: 769 + Actor1116: e1 + Owner: USSR + SubCell: 3 + Location: 36,72 + Facing: 682 + Actor1117: e1 + Owner: USSR + Location: 36,72 + SubCell: 1 + Facing: 761 + Actor1118: e1 + Owner: USSR + SubCell: 3 + Location: 36,75 + Facing: 848 + Actor1119: e4 + Owner: USSR + SubCell: 3 + Location: 36,71 + Facing: 650 + Actor1120: e4 + Owner: USSR + SubCell: 3 + Location: 37,70 + Facing: 705 + Actor1121: e2 + Owner: USSR + SubCell: 3 + Location: 37,76 + Facing: 824 + Actor1122: e2 + Owner: USSR + Location: 37,76 + SubCell: 1 + Facing: 713 + Actor1123: 4tnk + Owner: USSR + Location: 34,58 + Facing: 1015 + Actor1124: e1 + Owner: USSR + SubCell: 3 + Location: 33,57 + Facing: 816 + Actor1125: e1 + Owner: USSR + Location: 33,57 + SubCell: 1 + Facing: 991 + Actor1126: e1 + Owner: USSR + SubCell: 3 + Location: 36,59 + Facing: 384 + Actor1127: e1 + Owner: USSR + SubCell: 3 + Location: 39,58 + Facing: 166 + Actor1128: e4 + Owner: USSR + SubCell: 3 + Location: 38,59 + Facing: 1023 + Actor1129: e3 + Owner: USSR + SubCell: 3 + Location: 35,60 + Facing: 943 + Actor1130: dog + Owner: USSR + SubCell: 3 + Location: 35,57 + Facing: 1023 + Actor1131: e1 + Owner: USSR + SubCell: 3 + Location: 21,4 + Facing: 499 + Actor1132: e1 + Owner: USSR + SubCell: 3 + Location: 19,5 + Facing: 626 + Actor1133: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 8,6 + Actor1134: e2 + Owner: USSR + SubCell: 3 + Location: 9,12 + Facing: 896 + Actor1135: e2 + Owner: USSR + SubCell: 3 + Location: 10,13 + Facing: 1023 + Actor1136: e1 + Owner: USSR + SubCell: 3 + Location: 8,10 + Facing: 761 + Actor1139: e1 + Owner: USSR + SubCell: 3 + Location: 63,57 + Facing: 384 + Actor1140: e1 + Owner: USSR + Facing: 384 + Location: 63,57 + SubCell: 1 + Actor1141: e1 + Owner: USSR + Location: 65,58 + SubCell: 3 + Facing: 570 + Actor1142: e1 + Owner: USSR + SubCell: 3 + Location: 54,48 + Facing: 793 + Actor1143: e1 + Owner: USSR + Facing: 384 + Location: 54,48 + SubCell: 1 + Actor1144: e1 + Owner: USSR + SubCell: 3 + Location: 55,47 + Facing: 1023 + Actor1146: e1 + Owner: USSR + SubCell: 3 + Location: 64,42 + Facing: 919 + Actor1147: e1 + Owner: USSR + SubCell: 3 + Location: 58,37 + Facing: 697 + Actor1148: e1 + Owner: USSR + Location: 58,37 + SubCell: 1 + Facing: 523 + Actor1149: e1 + Owner: USSR + SubCell: 3 + Location: 61,34 + Facing: 864 + Actor1150: e1 + Owner: USSR + SubCell: 3 + Location: 69,67 + Facing: 880 + Actor1151: e1 + Owner: USSR + Location: 69,67 + SubCell: 1 + Facing: 848 + Actor1152: e1 + Owner: USSR + SubCell: 3 + Location: 61,75 + Facing: 523 + Actor1153: e1 + Owner: USSR + Location: 63,71 + SubCell: 3 + Facing: 1023 + Actor1154: e1 + Owner: USSR + Location: 60,73 + SubCell: 3 + Facing: 610 + Actor1155: e4 + Owner: USSR + Facing: 384 + Location: 75,9 + SubCell: 3 + Actor1158: e1 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 71,11 + Actor1159: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 72,7 + Actor1160: e1 + Owner: USSR + SubCell: 3 + Location: 69,19 + Facing: 800 + Actor1161: e1 + Owner: USSR + SubCell: 3 + Location: 62,18 + Facing: 384 + Actor1162: e1 + Owner: USSR + Location: 61,17 + SubCell: 3 + Facing: 7 + Actor1163: e1 + Owner: USSR + Location: 62,18 + SubCell: 1 + Facing: 118 + Actor1164: e1 + Owner: USSR + SubCell: 3 + Location: 48,4 + Facing: 785 + Actor1167: e1 + Owner: USSR + SubCell: 3 + Location: 51,24 + Facing: 150 + Actor1168: e2 + Owner: USSR + SubCell: 3 + Location: 51,25 + Facing: 0 + Actor1169: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 40,20 + Actor1170: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 25,26 + Actor1171: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 29,23 + PatrollerB1: e4 + Owner: USSR + SubCell: 3 + Location: 85,75 + Facing: 384 + BoatPatrol2: waypoint + Owner: Neutral + Location: 72,50 + CarryallEntryPoint: waypoint + Owner: Neutral + Location: 76,81 + Actor1173: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 83,32 + Actor1175: e2 + Owner: USSR + Facing: 384 + Location: 84,31 + SubCell: 3 + Actor1177: e4 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 84,28 + Actor1178: e4 + Owner: USSR + SubCell: 3 + Location: 78,43 + Facing: 880 + Actor1186: 3tnk + Owner: USSR + Location: 34,47 + Facing: 753 + Actor1187: dog + Owner: USSR + SubCell: 3 + Location: 33,45 + Facing: 642 + Actor1188: e1 + Owner: USSR + SubCell: 1 + Location: 33,45 + Facing: 610 + Actor1189: e1 + Owner: USSR + SubCell: 3 + Location: 33,46 + Facing: 713 + Actor1180: e3 + Owner: USSR + SubCell: 3 + Facing: 0 + Location: 37,51 + Actor1183: dog + Owner: USSR + SubCell: 3 + Location: 36,49 + Facing: 943 + Actor1184: dog + Owner: USSR + SubCell: 3 + Location: 38,51 + Facing: 103 + Actor1081: fenc + Owner: USSR + Location: 58,61 + Actor1179: fenc + Owner: USSR + Location: 53,45 + LandingCraftExit: waypoint + Owner: Neutral + Location: 100,1 + Actor1181: fenc + Owner: USSR + Location: 64,56 + Actor1182: fenc + Owner: USSR + Location: 65,56 + Actor1185: e1 + Owner: USSR + SubCell: 3 + Facing: 888 + Location: 56,58 + Actor1190: e1 + Owner: USSR + SubCell: 1 + Facing: 1023 + Location: 56,58 + Actor608: e1 + Owner: USSR + SubCell: 3 + Location: 80,6 + Facing: 713 + Actor950: e2 + Owner: USSR + Location: 44,2 + SubCell: 1 + Facing: 610 + Actor1137: e2 + Owner: USSR + SubCell: 3 + Location: 9,20 + Facing: 880 + Actor1138: e2 + Owner: USSR + SubCell: 3 + Location: 10,26 + Facing: 384 + Actor1191: e2 + Owner: USSR + Location: 10,26 + SubCell: 1 + Facing: 737 + Actor1192: e2 + Owner: USSR + SubCell: 3 + Location: 8,23 + Facing: 729 + Actor1193: e2 + Owner: USSR + Location: 22,18 + SubCell: 3 + Facing: 214 + Actor1194: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 73,26 + Actor1195: e2 + Owner: USSR + Facing: 384 + SubCell: 1 + Location: 73,26 + Actor1114: e2 + Owner: USSR + Facing: 384 + SubCell: 1 + Location: 95,74 + Actor1174: e2 + Owner: USSR + Location: 96,75 + SubCell: 3 + Facing: 301 + Actor1176: e1 + Owner: USSR + SubCell: 3 + Location: 101,78 + Facing: 317 + Actor1197: e2 + Owner: USSR + SubCell: 3 + Location: 80,77 + Facing: 1023 + Actor1198: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 95,56 + Actor1199: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 61,49 + Actor1200: e2 + Owner: USSR + Facing: 384 + Location: 45,62 + SubCell: 3 + Actor1203: e1 + Owner: USSR + SubCell: 3 + Location: 49,74 + Facing: 1023 + Actor1204: e1 + Owner: USSR + SubCell: 3 + Location: 52,71 + Facing: 1023 + Actor1205: e4 + Owner: USSR + SubCell: 3 + Location: 50,70 + Facing: 158 + Actor1206: e2 + Owner: USSR + SubCell: 3 + Location: 31,39 + Facing: 840 + Actor1207: e2 + Owner: USSR + SubCell: 3 + Location: 18,24 + Facing: 785 + CarryallDropPoint: waypoint + Owner: Neutral + Location: 45,45 + Actor1209: e2 + Owner: USSR + SubCell: 3 + Location: 43,39 + Facing: 642 + Actor1211: e1 + Owner: USSR + SubCell: 3 + Location: 43,33 + Facing: 832 + Actor1212: e1 + Owner: USSR + SubCell: 3 + Location: 31,34 + Facing: 658 + Actor1213: e2 + Owner: USSR + SubCell: 3 + Location: 4,24 + Facing: 626 + Actor1202: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 49,67 + Actor1201: t02 + Owner: Neutral + Location: 61,67 + Actor979: e4 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 73,27 + Actor1145: e4 + Owner: USSR + SubCell: 3 + Facing: 666 + Location: 77,11 + Actor1196: e1 + Owner: USSR + SubCell: 1 + Facing: 483 + Location: 77,11 + Actor1172: ttra + Owner: USSR + Facing: 682 + Location: 35,18 + Actor1156: e1 + Owner: USSR + SubCell: 3 + Location: 96,79 + Facing: 261 + Actor1157: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 91,20 + Actor1208: e1 + Owner: USSR + SubCell: 3 + Location: 27,6 + Facing: 586 + Actor1038: tc02 + Owner: Neutral + Location: 13,2 + Actor1039: ftur + Owner: USSR + Location: 14,11 + Actor1062: chain + Owner: USSR + Location: 23,22 + WestTesla5: tsla + Owner: USSR + Location: 9,19 + Actor1082: t06 + Owner: Neutral + Location: 62,63 + SAPC1: sapc + Owner: Nod + Location: 17,71 + Facing: 128 + SAPC2: sapc + Owner: Nod + Location: 18,70 + Facing: 128 + NodExit: waypoint + Owner: Neutral + Location: 1,56 + SAPCRally1: waypoint + Owner: Neutral + Location: 14,68 + SAPCRally2: waypoint + Owner: Neutral + Location: 15,67 + HealCrate1: healcrate + Owner: Neutral + Location: 108,56 + HealCrate2: healcrate + Owner: Neutral + Location: 60,24 + BoatPatrol3: waypoint + Owner: Neutral + Location: 67,28 + HealCrate3: healcrate + Owner: Neutral + Location: 27,43 + Actor1024: tc02.husk + Owner: Neutral + Location: 7,43 + Actor1054: t16.husk + Owner: Neutral + Location: 7,41 + PatrolC1: waypoint + Owner: Neutral + Location: 65,71 + PatrolC2: waypoint + Owner: Neutral + Location: 64,59 + PatrolC3: waypoint + Owner: Neutral + Location: 61,55 + PatrolC4: waypoint + Owner: Neutral + Location: 61,47 + PatrolC5: waypoint + Owner: Neutral + Location: 61,38 + Actor1210: e1 + Owner: USSR + SubCell: 3 + Facing: 729 + Location: 66,35 + Actor1215: e1 + Owner: USSR + SubCell: 3 + Facing: 737 + Location: 71,37 + Actor1055: e2 + Owner: USSR + Location: 71,36 + SubCell: 1 + Facing: 753 + Actor1060: tc01 + Owner: Neutral + Location: 52,23 + Actor1050: tc03 + Owner: Neutral + Location: 52,25 + Actor1049: tc05 + Owner: Neutral + Location: 52,26 + Actor1048: e1 + Owner: USSR + SubCell: 3 + Location: 53,22 + Facing: 214 + Actor1166: e4 + Owner: USSR + SubCell: 3 + Location: 4,10 + Facing: 808 + Actor1214: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 23,33 + Actor1110: ftur + Owner: USSR + Location: 45,34 + Actor1216: e4 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 44,34 + Actor1217: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 41,32 + Actor1218: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 73,23 + PatrolD3: waypoint + Owner: Neutral + Location: 47,37 + PatrolD4: waypoint + Owner: Neutral + Location: 34,37 + PatrollerC9: dog + Owner: USSR + Location: 65,76 + SubCell: 3 + Facing: 384 + Actor1219: e4 + Owner: USSR + SubCell: 3 + Facing: 919 + Location: 49,34 + Actor1220: e1 + Owner: USSR + SubCell: 3 + Facing: 943 + Location: 50,31 + Actor1108: e1 + Owner: USSR + SubCell: 3 + Facing: 1023 + Location: 47,78 + Actor1165: e1 + Owner: USSR + SubCell: 3 + Facing: 1023 + Location: 45,77 + Actor1221: e2 + Owner: USSR + SubCell: 3 + Location: 88,14 + Facing: 555 + PatrollerC10: shok + Owner: USSR + Location: 65,77 + SubCell: 5 + Facing: 384 + PatrollerA7: shok + Owner: USSR + Location: 87,42 + SubCell: 3 + Facing: 384 + PatrolBoat2: seas + Owner: USSR + Location: 74,66 + Facing: 384 + PatrollerF1: e1 + Owner: USSR + Location: 63,15 + SubCell: 3 + Facing: 384 + PatrollerF2: shok + Owner: USSR + Location: 65,15 + SubCell: 3 + Facing: 384 + PatrollerF3: e2 + Owner: USSR + Location: 64,14 + SubCell: 3 + Facing: 384 + PatrollerF4: e1 + Owner: USSR + Location: 65,14 + SubCell: 1 + Facing: 384 + PatrollerF5: e1 + Owner: USSR + Location: 65,14 + SubCell: 3 + Facing: 384 + PatrollerF6: dog + Owner: USSR + Location: 65,14 + SubCell: 2 + Facing: 384 + PatrollerF7: e1 + Owner: USSR + Location: 66,14 + SubCell: 3 + Facing: 384 + PatrolF1: waypoint + Owner: Neutral + Location: 67,14 + PatrolF2: waypoint + Owner: Neutral + Location: 49,14 + PatrolF3: waypoint + Owner: Neutral + Location: 49,22 + PatrolF4: waypoint + Owner: Neutral + Location: 35,22 + BrutalOnlyV2_2: v2rl + Owner: USSR + Location: 100,77 + Facing: 256 + BrutalOnlyV2_1: v2rl + Owner: USSR + Location: 75,40 + Facing: 384 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-coalitions.yaml, ca|rules/custom/commando-mission.yaml, containment-rules.yaml + +Sequences: containment-sequences.yaml + +Weapons: ca|weapons/custom/campaign.yaml, containment-weapons.yaml diff --git a/mods/ca/missions/main-campaign/ca04-containment/r_cprendezvous.aud b/mods/ca/missions/main-campaign/ca04-containment/r_cprendezvous.aud new file mode 100644 index 0000000000..9ee74e5024 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca04-containment/r_cprendezvous.aud differ diff --git a/mods/ca/missions/main-campaign/ca04-containment/r_samlocated.aud b/mods/ca/missions/main-campaign/ca04-containment/r_samlocated.aud new file mode 100644 index 0000000000..f622a265bb Binary files /dev/null and b/mods/ca/missions/main-campaign/ca04-containment/r_samlocated.aud differ diff --git a/mods/ca/missions/main-campaign/ca05-apprehension/apprehension-rules.yaml b/mods/ca/missions/main-campaign/ca05-apprehension/apprehension-rules.yaml new file mode 100644 index 0000000000..d50fae53fe --- /dev/null +++ b/mods/ca/missions/main-campaign/ca05-apprehension/apprehension-rules.yaml @@ -0,0 +1,105 @@ + +^Palettes: + TintPostProcessEffect: + +World: + LuaScript: + Scripts: campaign.lua, apprehension.lua + MissionData: + Briefing: Just as the Chronosphere was neutralized, we detected transports moving away that quickly vanished. Information provided by GDI suggests these forces likely belong to a group known as the Brotherhood of Nod who make extensive use of this apparent stealth technology.\n\nWe do not know what they were doing there, but from what we can gather it would be extremely bad for Chronosphere technology to fall into their hands.\n\nWe have been tracking Nod troop movements heading south, and have identified a small base on the coast as being their most likely destination. We now have a window of opportunity to capture these transports and gain some insight into Nod operations.\n\nTake a strike force into the forests surrounding the Nod base and take out their SAM sites. We're banking on Nod sending their troops out to investigate in small numbers, allowing you to ambush them piecemeal rather than taking on all of their forces at once.\n\nOnce all the SAM sites are taken out, we'll send in air support to eliminate the base's defenses. Then you should be able to clear out whatever troops are left in the base and apprehend those transports. + MapOptions: + ShortGameCheckboxEnabled: False + MusicPlaylist: + StartingMusic: dense_r + +Player: + PlayerResources: + DefaultCash: 6000 + +HQ: + Power: + Amount: 0 + +RTNK: + Mirage: + DefaultTargetTypes: t01m, t02m, t03m, t05m, t06m, t07m, t12m, t13m, t14m, t16m, t17m + GainsExperienceMultiplier@HalfXp: + Modifier: 50 + +APC: + GainsExperienceMultiplier@HalfXp: + Modifier: 50 + +T01m: + Inherits: T01 + -MapEditorData: +T02m: + Inherits: T02 + -MapEditorData: +T03m: + Inherits: T03 + -MapEditorData: +T05m: + Inherits: T05 + -MapEditorData: +T06m: + Inherits: T06 + -MapEditorData: +T07m: + Inherits: T07 + -MapEditorData: +T12m: + Inherits: T12 + -MapEditorData: +T13m: + Inherits: T13 + -MapEditorData: +T14m: + Inherits: T14 + -MapEditorData: +T16m: + Inherits: T16 + -MapEditorData: +T17m: + Inherits: T17 + -MapEditorData: + +N1: + Mobile: + Speed: 46 + +N3: + Mobile: + Speed: 46 + AutoTargetPriority@DEFAULT: + ValidTargets: Infantry, Vehicle, Water, Underwater, Defense + AutoTargetPriority@DEFAULTAA: + ValidTargets: Vehicle + +N4: + Mobile: + Speed: 46 + +SAPC: + ExternalCondition@DisableCloaking: + Condition: cloak-force-disabled + Health: + HP: 60000 + +NSAM: + Health: + HP: 25000 + +JEEP: + GrantTimedConditionOnDeploy@Optics: + DeployedTicks: 375 + CooldownTicks: 250 + +BIKE: + Mobile: + Speed: 144 + TurnSpeed: 40 + +SAPC: + Health: + HP: 60000 diff --git a/mods/ca/missions/main-campaign/ca05-apprehension/apprehension-sequences.yaml b/mods/ca/missions/main-campaign/ca05-apprehension/apprehension-sequences.yaml new file mode 100644 index 0000000000..b44555c82a --- /dev/null +++ b/mods/ca/missions/main-campaign/ca05-apprehension/apprehension-sequences.yaml @@ -0,0 +1,44 @@ +t01m: + Inherits: t01 + Defaults: + Offset: 10,-10 +t02m: + Inherits: t02 + Defaults: + Offset: 10,-10 +t03m: + Inherits: t03 + Defaults: + Offset: 10,-10 +t05m: + Inherits: t05 + Defaults: + Offset: 10,-10 +t06m: + Inherits: t06 + Defaults: + Offset: 10,-10 +t07m: + Inherits: t07 + Defaults: + Offset: 10,-10 +t12m: + Inherits: t12 + Defaults: + Offset: 10,-10 +t13m: + Inherits: t13 + Defaults: + Offset: 10,-10 +t14m: + Inherits: t14 + Defaults: + Offset: 10,-10 +t16m: + Inherits: t16 + Defaults: + Offset: 10,-10 +t17m: + Inherits: t17 + Defaults: + Offset: 10,-10 diff --git a/mods/ca/missions/main-campaign/ca05-apprehension/apprehension-weapons.yaml b/mods/ca/missions/main-campaign/ca05-apprehension/apprehension-weapons.yaml new file mode 100644 index 0000000000..04c3030f43 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca05-apprehension/apprehension-weapons.yaml @@ -0,0 +1,4 @@ +120mmHEAT: + Warhead@1Dam: SpreadDamage + Versus: + Concrete: 50 diff --git a/mods/ca/missions/main-campaign/ca05-apprehension/apprehension.lua b/mods/ca/missions/main-campaign/ca05-apprehension/apprehension.lua new file mode 100644 index 0000000000..fd88bef0e4 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca05-apprehension/apprehension.lua @@ -0,0 +1,287 @@ +MissionDir = "ca|missions/main-campaign/ca05-apprehension" + +SAMs = { + { SAMSite = SAM1, Pos = SAM1Squad.CenterPosition, Rally = SAM1SquadRally.Location }, + { SAMSite = SAM2, Pos = SAM2Squad.CenterPosition, Rally = SAM2SquadRally.Location }, + { SAMSite = SAM3, Pos = SAM3Squad.CenterPosition, Rally = SAM3SquadRally.Location }, + { SAMSite = SAM4, Pos = SAM4Squad.CenterPosition, Rally = SAM4SquadRally.Location }, + { SAMSite = SAM5, Pos = SAM5Squad.CenterPosition, Rally = SAM5SquadRally.Location }, + { SAMSite = SAM6, Pos = SAM6Squad.CenterPosition, Rally = SAM6SquadRally.Location }, + { SAMSite = SAM7, Pos = SAM7Squad.CenterPosition, Rally = SAM7SquadRally.Location }, +} + +Patrols = { + { NodPatrol1_1.Location, NodPatrol1_2.Location, NodPatrol1_3.Location, NodPatrol1_4.Location, NodPatrol1_5.Location }, + { NodPatrol2_1.Location, NodPatrol2_2.Location, NodPatrol2_3.Location }, +} + +Squads = { + Main = { + Delay = AdjustDelayForDifficulty(DateTime.Minutes(5)), + AttackValuePerSecond = { + vhard = { Min = 4, Max = 8 }, + brutal = { Min = 8, Max = 16 }, + }, + FollowLeader = true, + Compositions = AdjustCompositionsForDifficulty({ + { Infantry = { "e3", "n1", "n1", "n1", "bh", "n1", "n1", "bh" } }, + }), + } +} + +-- Setup and Tick + +SetupPlayers = function() + Greece = Player.GetPlayer("Greece") + Nod = Player.GetPlayer("Nod") + England = Player.GetPlayer("England") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = { Greece } + MissionEnemies = { Nod } +end + +WorldLoaded = function() + SetupPlayers() + + TimerTicks = 0 + local samsRemaining = Nod.GetActorsByType("nsam") + SAMCount = #samsRemaining + + Camera.Position = PlayerStart.CenterPosition + + InitObjectives(Greece) + InitNod() + + Utils.Do(MissionPlayers, function(p) + Actor.Create("optics.upgrade", true, { Owner = p }) + Actor.Create("radar.dummy", true, { Owner = p }) + end) + + ObjectiveDestroySAMSites = Greece.AddObjective("Destroy Nod SAM Sites.") + ObjectiveClearBase = Greece.AddObjective("Clear the Nod naval base.") + ObjectiveApprehendTransports = Greece.AddObjective("Secure Nod transports.") + + UpdateMissionText() + + NodBaseCamera.Destroy() + + if IsNormalOrAbove() then + Medic2.Destroy() + Mechanic.Destroy() + + if IsHardOrAbove() then + Medic1.Destroy() + Ranger2.Destroy() + NonHardSniper1.Destroy() + NonHardMirage1.Destroy() + + if IsVeryHardOrAbove() then + NonHardSniper2.Destroy() + + if Difficulty == "brutal" then + Raider1.Destroy() + Raider2.Destroy() + end + end + end + end + + if IsVeryHardOrBelow() then + local brutalOnlyUnits = Nod.GetActorsByTypes({ "shad", "hftk" }) + Utils.Do(brutalOnlyUnits, function(a) a.Destroy() end) + + if IsHardOrBelow() then + local blackHand = Nod.GetActorsByType("bh") + Utils.Do(blackHand, function(a) a.Destroy() end) + + VeryHardOnlyFlameTank1.Destroy() + VeryHardOnlyFlameTank2.Destroy() + + if IsNormalOrBelow() then + HardOnlySSM.Destroy() + HardOnlyFlameTank1.Destroy() + HardOnlyFlameTank2.Destroy() + HardOnlyFlameTank3.Destroy() + HardOnlyFlameTank4.Destroy() + HardOnlyFlameTank5.Destroy() + end + end + end + + Utils.Do(SAMs, function(s) + Trigger.OnKilled(s.SAMSite, function(self, killer) + local defenders = Map.ActorsInCircle(s.Pos, WDist.New(4 * 1024)); + + Utils.Do(defenders, function(a) + if a.Owner == Nod and a.HasProperty("AttackMove") then + a.AttackMove(s.Rally, 4) + a.AttackMove(s.SAMSite.Location, 4) + if IsHardOrAbove() then + IdleHunt(a) + end + end + end) + + SAMCount = #Nod.GetActorsByType("nsam") + UpdateMissionText() + end) + end) + + Trigger.OnAllKilled({ SAM1, SAM2, SAM3, SAM4, SAM5, SAM6, SAM7 }, function() + Greece.MarkCompletedObjective(ObjectiveDestroySAMSites) + InitLongbows() + end) + + Trigger.OnAnyKilled({ Transport1, Transport2 }, function() + if not Greece.IsObjectiveCompleted(ObjectiveApprehendTransports) then + Greece.MarkFailedObjective(ObjectiveApprehendTransports) + end + end) + + Trigger.AfterDelay(1, function() + Utils.Do(Patrols, function(p) + local patrollers = Map.ActorsInCircle(Map.CenterOfCell(p[1]), WDist.New(4 * 1024)); + + Utils.Do(patrollers, function(a) + if a.Owner == Nod and a.HasProperty("AttackMove") then + a.Patrol(p) + end + end) + end) + end) + + Trigger.AfterDelay(DateTime.Seconds(5), function() + local rangersDesc + if IsHardOrAbove() then + rangersDesc = "Rangers are" + else + rangersDesc = "Ranger is" + end + Tip("Your " .. rangersDesc .. " equipped with the Advanced Optics upgrade. Press [" .. UtilsCA.Hotkey("Deploy") .. "] (deploy) to activate for increased vision for a limited time.") + end) + + AfterWorldLoaded() +end + +Tick = function() + OncePerSecondChecks() + OncePerFiveSecondChecks() + AfterTick() +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + Nod.Resources = Nod.ResourceCapacity - 500 + + if MissionPlayersHaveNoRequiredUnits() then + if not Greece.IsObjectiveCompleted(ObjectiveDestroySAMSites) then + Greece.MarkFailedObjective(ObjectiveDestroySAMSites) + end + if not Greece.IsObjectiveCompleted(ObjectiveClearBase) then + Greece.MarkFailedObjective(ObjectiveClearBase) + end + if not Greece.IsObjectiveCompleted(ObjectiveApprehendTransports) then + Greece.MarkFailedObjective(ObjectiveApprehendTransports) + end + end + end +end + +OncePerFiveSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 125 == 0 then + UpdatePlayerBaseLocations() + + if not Greece.IsObjectiveCompleted(ObjectiveClearBase) then + local nodForces = Map.ActorsInBox(NodBaseTopLeft.CenterPosition, NodBaseBottomRight.CenterPosition, function(a) + return a.Owner == Nod and not a.IsDead and a.HasProperty("Attack") + end) + + if #nodForces == 0 then + Greece.MarkCompletedObjective(ObjectiveClearBase) + + Trigger.AfterDelay(DateTime.Seconds(4), function() + + if not Transport1.IsDead then + Transport1.GrantCondition("cloak-force-disabled") + end + + if not Transport2.IsDead then + Transport2.GrantCondition("cloak-force-disabled") + end + + Trigger.AfterDelay(DateTime.Seconds(2), function() + if not Greece.IsObjectiveCompleted(ObjectiveApprehendTransports) then + if Transport1.IsDead or Transport2.IsDead then + Greece.MarkFailedObjective(ObjectiveApprehendTransports) + else + Greece.MarkCompletedObjective(ObjectiveApprehendTransports) + end + end + end) + end) + end + end + end +end + +UpdateMissionText = function() + if SAMCount > 0 then + UserInterface.SetMissionText(SAMCount .. " SAM sites remaining.", HSLColor.Yellow) + else + UserInterface.SetMissionText("") + end +end + +-- Functions + +InitNod = function() + AutoRepairBuildings(Nod) + SetupRefAndSilosCaptureCredits(Nod) + AutoReplaceHarvesters(Nod) + + if IsVeryHardOrAbove() then + InitAttackSquad(Squads.Main, Nod) + end + + local nodGroundAttackers = Nod.GetGroundAttackers() + + Utils.Do(nodGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsNodGroundHunterUnit) + end) +end + +InitLongbows = function() + PlaySpeechNotificationToMissionPlayers("ReinforcementsArrived") + Notification("Air support inbound.") + local targets = { Obelisk3, Obelisk1, Obelisk2, Turret1, Turret2 } + local delay = DateTime.Seconds(2) + + Utils.Do(targets, function(t) + if t.IsDead then + return + end + + local unitList = { "heli", "heli" } + Utils.Do(unitList, function(u) + Trigger.AfterDelay(delay, function() + local spawn = CPos.New(Utils.RandomInteger(35,85), 0) + local rally = CPos.New(t.Location.X + Utils.RandomInteger(-8, 8), t.Location.Y - 8) + local lb = Reinforcements.Reinforce(England, { u }, {spawn})[1] + Trigger.AfterDelay(DateTime.Seconds(5), function() + Trigger.OnEnteredProximityTrigger(Map.CenterOfCell(spawn), WDist.New(2 * 1024), function(a, id) + if lb == a then + Trigger.RemoveProximityTrigger(id) + lb.Stop() + lb.Destroy() + end + end) + end) + lb.Move(rally) + lb.Attack(t) + lb.Move(spawn) + end) + delay = delay + 15 + end) + end) +end diff --git a/mods/ca/missions/main-campaign/ca05-apprehension/map.bin b/mods/ca/missions/main-campaign/ca05-apprehension/map.bin new file mode 100644 index 0000000000..19bd7a2677 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca05-apprehension/map.bin differ diff --git a/mods/ca/missions/main-campaign/ca05-apprehension/map.png b/mods/ca/missions/main-campaign/ca05-apprehension/map.png new file mode 100644 index 0000000000..fcec9f4711 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca05-apprehension/map.png differ diff --git a/mods/ca/missions/main-campaign/ca05-apprehension/map.yaml b/mods/ca/missions/main-campaign/ca05-apprehension/map.yaml new file mode 100644 index 0000000000..2cb5cef794 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca05-apprehension/map.yaml @@ -0,0 +1,7980 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 05: Apprehension + +Author: Darkademic + +Tileset: TEMPERAT + +MapSize: 98,98 + +Bounds: 1,1,96,96 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: Greece, England, Nod, NodTransports + PlayerReference@Greece: + Name: Greece + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: allies + LockColor: True + Color: 99ACF2 + LockSpawn: True + LockTeam: True + Allies: England + Enemies: Nod, Creeps + PlayerReference@Nod: + Name: Nod + Bot: campaign + Faction: nod + Color: FE1100 + Enemies: Greece, England, Creeps + PlayerReference@England: + Name: England + Faction: allies + Color: A1EF8C + Allies: Greece + Enemies: Nod + PlayerReference@NodTransports: + Name: NodTransports + Bot: dormant + Faction: nod + Color: E6E6FF + Enemies: Creeps + +Actors: + Actor0: tc05 + Owner: Neutral + Location: 24,81 + Actor2: tc05 + Owner: Neutral + Location: 19,20 + Actor4: tc05 + Owner: Neutral + Location: 10,61 + Actor5: tc05 + Owner: Neutral + Location: 12,35 + Actor6: tc05 + Owner: Neutral + Location: 15,34 + Actor8: tc05 + Owner: Neutral + Location: 2,43 + Actor9: tc05.husk + Owner: Neutral + Location: 40,65 + Actor10: tc05 + Owner: Neutral + Location: 58,73 + Actor12: tc04 + Owner: Neutral + Location: 55,56 + Actor14: tc03 + Owner: Neutral + Location: 62,6 + Actor15: tc03 + Owner: Neutral + Location: 21,61 + Actor16: tc03 + Owner: Neutral + Location: 59,13 + Actor17: tc03 + Owner: Neutral + Location: 48,69 + Actor18: tc04 + Owner: Neutral + Location: 85,48 + Actor19: tc03 + Owner: Neutral + Location: 79,25 + Actor20: tc04 + Owner: Neutral + Location: 8,55 + Actor21: tc03 + Owner: Neutral + Location: 55,7 + Actor22: tc04 + Owner: Neutral + Location: 15,28 + Actor24: tc03 + Owner: Neutral + Location: 26,75 + Actor26: tc03 + Owner: Neutral + Location: 12,78 + Actor28: tc04 + Owner: Neutral + Location: 40,58 + Actor29: tc04 + Owner: Neutral + Location: 12,79 + Actor30: tc03 + Owner: Neutral + Location: 0,41 + Actor31: tc03 + Owner: Neutral + Location: 10,79 + Actor33: tc03.husk + Owner: Neutral + Location: 93,39 + Actor37: tc04 + Owner: Neutral + Location: 44,64 + Actor38: tc04 + Owner: Neutral + Location: 49,22 + Actor40: tc03 + Owner: Neutral + Location: 21,12 + Actor42: tc03 + Owner: Neutral + Location: 48,81 + Actor43: tc03 + Owner: Neutral + Location: 40,48 + Actor44: tc03 + Owner: Neutral + Location: 43,61 + Actor45: tc04 + Owner: Neutral + Location: 78,20 + Actor46: tc03 + Owner: Neutral + Location: 52,45 + Actor48: tc03 + Owner: Neutral + Location: 11,52 + Actor49: tc03 + Owner: Neutral + Location: 56,53 + Actor51: tc02 + Owner: Neutral + Location: 14,94 + Actor52: tc02 + Owner: Neutral + Location: 0,48 + Actor53: tc02 + Owner: Neutral + Location: 39,45 + Actor55: tc02 + Owner: Neutral + Location: 47,23 + Actor57: tc02 + Owner: Neutral + Location: 59,46 + Actor58: tc02 + Owner: Neutral + Location: 46,80 + Actor59: tc02 + Owner: Neutral + Location: 11,0 + Actor60: tc02 + Owner: Neutral + Location: 43,44 + Actor61: tc02 + Owner: Neutral + Location: 90,57 + Actor62: tc02.husk + Owner: Neutral + Location: 75,47 + Actor64: tc02.husk + Owner: Neutral + Location: 86,3 + Actor65: tc02 + Owner: Neutral + Location: 38,70 + Actor67: tc02 + Owner: Neutral + Location: 51,48 + Actor68: tc02 + Owner: Neutral + Location: 82,1 + Actor71: tc02 + Owner: Neutral + Location: 58,57 + Actor72: t11 + Owner: Neutral + Location: 49,51 + Actor73: t14 + Owner: Neutral + Location: 44,5 + Actor74: t10 + Owner: Neutral + Location: 39,64 + Actor75: t14 + Owner: Neutral + Location: 51,38 + Actor76: t14 + Owner: Neutral + Location: 36,69 + Actor77: t15 + Owner: Neutral + Location: 79,14 + Actor78: t11 + Owner: Neutral + Location: 81,25 + Actor79: t10 + Owner: Neutral + Location: 38,71 + Actor80: t14 + Owner: Neutral + Location: 71,10 + Actor82: t14.husk + Owner: Neutral + Location: 16,68 + Actor83: t10 + Owner: Neutral + Location: 78,16 + Actor85: t14 + Owner: Neutral + Location: 55,31 + Actor86: t15 + Owner: Neutral + Location: 84,35 + Actor87: tc01 + Owner: Neutral + Location: 0,37 + Actor88: t11 + Owner: Neutral + Location: 45,71 + Actor89: t15 + Owner: Neutral + Location: 45,16 + Actor90: t10 + Owner: Neutral + Location: 10,77 + Actor91: t11.husk + Owner: Neutral + Location: 50,39 + Actor92: t15 + Owner: Neutral + Location: 15,27 + Actor93: tc01 + Owner: Neutral + Location: 80,54 + Actor94: t14 + Owner: Neutral + Location: 12,55 + Actor95: t15 + Owner: Neutral + Location: 60,75 + Actor96: t14 + Owner: Neutral + Location: 38,63 + Actor97: t14 + Owner: Neutral + Location: 50,23 + Actor98: t11 + Owner: Neutral + Location: 83,55 + Actor99: t11 + Owner: Neutral + Location: 47,72 + Actor100: t10 + Owner: Neutral + Location: 31,77 + Actor101: t10 + Owner: Neutral + Location: 17,76 + Actor102: t14 + Owner: Neutral + Location: 80,2 + Actor103: t14 + Owner: Neutral + Location: 10,82 + Actor104: tc01 + Owner: Neutral + Location: 41,20 + Actor106: t15 + Owner: Neutral + Location: 77,13 + Actor107: t15 + Owner: Neutral + Location: 81,53 + Actor108: t14 + Owner: Neutral + Location: 0,3 + Actor110: t15 + Owner: Neutral + Location: 16,67 + Actor111: tc01.husk + Owner: Neutral + Location: 14,95 + Actor112: t15 + Owner: Neutral + Location: 51,33 + Actor113: t10 + Owner: Neutral + Location: 87,69 + Actor114: t10 + Owner: Neutral + Location: 81,56 + Actor115: tc01 + Owner: Neutral + Location: 39,80 + Actor117: t15.husk + Owner: Neutral + Location: 4,38 + Actor118: t14 + Owner: Neutral + Location: 18,73 + Actor119: t10 + Owner: Neutral + Location: 9,56 + Actor121: t15 + Owner: Neutral + Location: 61,73 + Actor122: t10 + Owner: Neutral + Location: 53,34 + Actor124: t14 + Owner: Neutral + Location: 60,48 + Actor125: tc01 + Owner: Neutral + Location: 8,67 + Actor126: t11 + Owner: Neutral + Location: 62,7 + Actor128: t14 + Owner: Neutral + Location: 85,40 + Actor130: t11 + Owner: Neutral + Location: 42,41 + Actor131: t15 + Owner: Neutral + Location: 1,49 + Actor132: tc01.husk + Owner: Neutral + Location: 19,67 + Actor133: t10 + Owner: Neutral + Location: 61,56 + Actor137: t11.husk + Owner: Neutral + Location: 45,17 + Actor138: t11 + Owner: Neutral + Location: 87,0 + Actor140: t10 + Owner: Neutral + Location: 30,81 + Actor141: t14 + Owner: Neutral + Location: 12,76 + Actor142: t11 + Owner: Neutral + Location: 92,60 + Actor143: t10 + Owner: Neutral + Location: 86,70 + Actor147: t10 + Owner: Neutral + Location: 14,75 + Actor148: t14 + Owner: Neutral + Location: 74,28 + Actor150: t14 + Owner: Neutral + Location: 59,77 + Actor151: t15 + Owner: Neutral + Location: 58,11 + Actor152: t14 + Owner: Neutral + Location: 79,15 + Actor153: tc01 + Owner: Neutral + Location: 20,41 + Actor154: tc01 + Owner: Neutral + Location: 45,72 + Actor155: tc01 + Owner: Neutral + Location: 17,74 + Actor156: t15 + Owner: Neutral + Location: 41,63 + Actor157: t11.husk + Owner: Neutral + Location: 16,65 + Actor158: t11 + Owner: Neutral + Location: 85,2 + Actor159: tc01 + Owner: Neutral + Location: 16,30 + Actor160: t11 + Owner: Neutral + Location: 80,12 + Actor161: t11 + Owner: Neutral + Location: 59,6 + Actor162: t11 + Owner: Neutral + Location: 88,4 + Actor163: t15 + Owner: Neutral + Location: 8,1 + Actor164: t14 + Owner: Neutral + Location: 55,33 + Actor165: t10 + Owner: Neutral + Location: 85,43 + Actor166: t11.husk + Owner: Neutral + Location: 1,0 + Actor168: t10 + Owner: Neutral + Location: 80,49 + Actor170: t15 + Owner: Neutral + Location: 48,70 + Actor174: t10 + Owner: Neutral + Location: 78,26 + Actor176: t15 + Owner: Neutral + Location: 52,40 + Actor177: tc01 + Owner: Neutral + Location: 80,55 + Actor178: tc01 + Owner: Neutral + Location: 6,68 + Actor179: t14 + Owner: Neutral + Location: 0,13 + Actor180: t15 + Owner: Neutral + Location: 15,33 + Actor181: t14 + Owner: Neutral + Location: 81,24 + Actor183: t10 + Owner: Neutral + Location: 5,46 + Actor184: tc01.husk + Owner: Neutral + Location: 3,47 + Actor185: tc01 + Owner: Neutral + Location: 48,18 + Actor186: t15.husk + Owner: Neutral + Location: 51,57 + Actor187: t14 + Owner: Neutral + Location: 56,12 + Actor188: t11 + Owner: Neutral + Location: 75,25 + Actor190: t11 + Owner: Neutral + Location: 46,20 + Actor191: t10 + Owner: Neutral + Location: 18,19 + Actor193: t10 + Owner: Neutral + Location: 49,50 + Actor195: t14 + Owner: Neutral + Location: 41,72 + Actor196: tc01 + Owner: Neutral + Location: 23,84 + Actor198: tc01 + Owner: Neutral + Location: 78,58 + Actor199: t11 + Owner: Neutral + Location: 1,4 + Actor201: t10 + Owner: Neutral + Location: 13,80 + Actor202: tc01 + Owner: Neutral + Location: 86,67 + Actor204: t15 + Owner: Neutral + Location: 95,31 + Actor205: t11 + Owner: Neutral + Location: 62,75 + Actor206: t10 + Owner: Neutral + Location: 5,89 + Actor209: t15 + Owner: Neutral + Location: 50,53 + Actor211: t11 + Owner: Neutral + Location: 27,84 + Actor212: t15 + Owner: Neutral + Location: 92,54 + Actor213: t11 + Owner: Neutral + Location: 90,69 + Actor214: t15 + Owner: Neutral + Location: 81,57 + Actor215: t14 + Owner: Neutral + Location: 95,34 + Actor216: t15 + Owner: Neutral + Location: 2,40 + Actor217: t11 + Owner: Neutral + Location: 39,66 + Actor218: t15 + Owner: Neutral + Location: 80,11 + Actor219: t11 + Owner: Neutral + Location: 16,75 + Actor220: t15 + Owner: Neutral + Location: 39,68 + Actor221: t15 + Owner: Neutral + Location: 95,60 + Actor222: t15 + Owner: Neutral + Location: 53,35 + Actor223: t14 + Owner: Neutral + Location: 79,53 + Actor224: tc01 + Owner: Neutral + Location: 94,37 + Actor227: t14 + Owner: Neutral + Location: 14,48 + Actor228: tc01 + Owner: Neutral + Location: 77,24 + Actor229: t14 + Owner: Neutral + Location: 0,52 + Actor230: tc01.husk + Owner: Neutral + Location: 13,61 + Actor231: tc01 + Owner: Neutral + Location: 82,2 + Actor232: t11 + Owner: Neutral + Location: 89,1 + Actor233: t10 + Owner: Neutral + Location: 1,42 + Actor234: t15 + Owner: Neutral + Location: 7,10 + Actor235: t14.husk + Owner: Neutral + Location: 86,65 + Actor237: t14 + Owner: Neutral + Location: 78,54 + Actor239: t14 + Owner: Neutral + Location: 86,1 + Actor240: t11 + Owner: Neutral + Location: 38,81 + Actor241: t10 + Owner: Neutral + Location: 52,10 + Actor242: t14 + Owner: Neutral + Location: 4,40 + Actor243: t14 + Owner: Neutral + Location: 83,52 + Actor244: tc01 + Owner: Neutral + Location: 14,78 + Actor245: t11 + Owner: Neutral + Location: 39,61 + Actor246: t11 + Owner: Neutral + Location: 0,36 + Actor247: t11 + Owner: Neutral + Location: 42,42 + Actor249: t14.husk + Owner: Neutral + Location: 54,52 + Actor250: tc01 + Owner: Neutral + Location: 78,23 + Actor251: t10 + Owner: Neutral + Location: 49,73 + Actor252: t15 + Owner: Neutral + Location: 13,74 + Actor254: t11 + Owner: Neutral + Location: 96,25 + Actor255: t15 + Owner: Neutral + Location: 44,22 + Actor257: t15 + Owner: Neutral + Location: 79,3 + Actor258: t10 + Owner: Neutral + Location: 95,40 + Actor259: t14 + Owner: Neutral + Location: 51,80 + Actor261: t11 + Owner: Neutral + Location: 0,83 + Actor263: t14 + Owner: Neutral + Location: 52,9 + Actor264: t11 + Owner: Neutral + Location: 60,78 + Actor265: tc01 + Owner: Neutral + Location: 75,50 + Actor266: t10 + Owner: Neutral + Location: 83,48 + Actor267: t14.husk + Owner: Neutral + Location: 94,65 + Actor269: tc01 + Owner: Neutral + Location: 1,12 + Actor270: t10 + Owner: Neutral + Location: 89,70 + Actor272: t15 + Owner: Neutral + Location: 16,61 + Actor273: tc01 + Owner: Neutral + Location: 15,81 + Actor277: t15.husk + Owner: Neutral + Location: 16,55 + Actor278: t15 + Owner: Neutral + Location: 31,82 + Actor279: t10.husk + Owner: Neutral + Location: 4,0 + Actor281: t11 + Owner: Neutral + Location: 57,45 + Actor282: t11 + Owner: Neutral + Location: 96,35 + Actor283: t11 + Owner: Neutral + Location: 18,18 + Actor284: t11.husk + Owner: Neutral + Location: 89,0 + Actor286: t11.husk + Owner: Neutral + Location: 2,1 + Actor287: tc01 + Owner: Neutral + Location: 14,30 + Actor289: t11 + Owner: Neutral + Location: 56,11 + Actor290: tc01 + Owner: Neutral + Location: 95,61 + Actor291: t14.husk + Owner: Neutral + Location: 91,0 + Actor293: t14 + Owner: Neutral + Location: 7,2 + Actor294: t11 + Owner: Neutral + Location: 59,58 + Actor296: t14 + Owner: Neutral + Location: 49,34 + Actor297: t11 + Owner: Neutral + Location: 13,27 + Actor298: t11 + Owner: Neutral + Location: 44,63 + Actor301: t10 + Owner: Neutral + Location: 13,9 + Actor302: tc01 + Owner: Neutral + Location: 76,54 + Actor303: t10 + Owner: Neutral + Location: 13,33 + Actor306: t14 + Owner: Neutral + Location: 80,39 + Actor307: t11 + Owner: Neutral + Location: 4,2 + Actor308: t14.husk + Owner: Neutral + Location: 51,41 + Actor309: t14 + Owner: Neutral + Location: 93,55 + Actor310: tc01 + Owner: Neutral + Location: 42,73 + Actor311: t10 + Owner: Neutral + Location: 41,44 + Actor313: t15 + Owner: Neutral + Location: 60,66 + Actor316: t13.husk + Owner: Neutral + Location: 46,81 + Actor317: t12 + Owner: Neutral + Location: 58,38 + Actor318: t01 + Owner: Neutral + Location: 40,20 + Actor320: t06 + Owner: Neutral + Location: 0,44 + Actor321: t06 + Owner: Neutral + Location: 13,83 + Actor323: t05 + Owner: Neutral + Location: 55,53 + Actor324: t13 + Owner: Neutral + Location: 47,16 + Actor325: t17 + Owner: Neutral + Location: 2,80 + Actor327: t12.husk + Owner: Neutral + Location: 18,21 + Actor329: t16 + Owner: Neutral + Location: 50,69 + Actor330: t03 + Owner: Neutral + Location: 15,20 + Actor331: t13 + Owner: Neutral + Location: 81,38 + Actor334: t01 + Owner: Neutral + Location: 45,18 + Actor335: t03 + Owner: Neutral + Location: 47,17 + Actor336: t12 + Owner: Neutral + Location: 8,44 + Actor337: t02 + Owner: Neutral + Location: 11,36 + Actor338: t16 + Owner: Neutral + Location: 82,55 + Actor339: t13 + Owner: Neutral + Location: 20,73 + Actor340: t03 + Owner: Neutral + Location: 15,32 + Actor341: t17 + Owner: Neutral + Location: 71,52 + Actor342: t06 + Owner: Neutral + Location: 17,11 + Actor344: t08 + Owner: Neutral + Location: 13,9 + Actor346: t02 + Owner: Neutral + Location: 65,36 + Actor347: t17 + Owner: Neutral + Location: 2,48 + Actor349: t12 + Owner: Neutral + Location: 56,42 + Actor350: t02 + Owner: Neutral + Location: 19,66 + Actor351: t13 + Owner: Neutral + Location: 20,43 + Actor353: t03 + Owner: Neutral + Location: 77,56 + Actor354: t06 + Owner: Neutral + Location: 16,8 + Actor355: t13 + Owner: Neutral + Location: 41,71 + Actor357: t02 + Owner: Neutral + Location: 81,23 + Actor358: t12.husk + Owner: Neutral + Location: 43,47 + Actor361: t01 + Owner: Neutral + Location: 11,81 + Actor363: t02 + Owner: Neutral + Location: 5,39 + Actor364: t17 + Owner: Neutral + Location: 54,50 + Actor365: t16.husk + Owner: Neutral + Location: 68,67 + Actor366: t17 + Owner: Neutral + Location: 1,6 + Actor367: t06 + Owner: Neutral + Location: 41,40 + Actor368: t17 + Owner: Neutral + Location: 12,75 + Actor369: t12 + Owner: Neutral + Location: 46,61 + Actor371: t07 + Owner: Neutral + Location: 35,12 + Actor372: t05 + Owner: Neutral + Location: 58,9 + Actor374: t06 + Owner: Neutral + Location: 9,7 + Actor376: t17 + Owner: Neutral + Location: 22,20 + Actor377: t12 + Owner: Neutral + Location: 96,42 + Actor378: t08 + Owner: Neutral + Location: 82,39 + Actor379: t12 + Owner: Neutral + Location: 11,76 + Actor380: t05 + Owner: Neutral + Location: 58,10 + Actor383: t06.husk + Owner: Neutral + Location: 53,47 + Actor384: t12 + Owner: Neutral + Location: 90,61 + Actor385: t02 + Owner: Neutral + Location: 1,45 + Actor386: t03 + Owner: Neutral + Location: 52,11 + Actor387: t01 + Owner: Neutral + Location: 12,59 + Actor388: t17 + Owner: Neutral + Location: 54,31 + Actor389: t16.husk + Owner: Neutral + Location: 88,47 + Actor390: t01 + Owner: Neutral + Location: 21,67 + Actor391: t12.husk + Owner: Neutral + Location: 28,80 + Actor392: t12.husk + Owner: Neutral + Location: 56,8 + Actor393: t02 + Owner: Neutral + Location: 67,66 + Actor394: t05 + Owner: Neutral + Location: 54,11 + Actor396: t07 + Owner: Neutral + Location: 50,37 + Actor398: t02 + Owner: Neutral + Location: 15,11 + Actor399: t08 + Owner: Neutral + Location: 90,5 + Actor400: t06 + Owner: Neutral + Location: 27,80 + Actor401: t03 + Owner: Neutral + Location: 30,79 + Actor402: t03 + Owner: Neutral + Location: 17,32 + Actor404: t12 + Owner: Neutral + Location: 94,0 + Actor405: t13 + Owner: Neutral + Location: 42,40 + Actor406: t07 + Owner: Neutral + Location: 12,49 + Actor408: t01 + Owner: Neutral + Location: 25,75 + Actor409: t12 + Owner: Neutral + Location: 74,57 + Actor411: t07 + Owner: Neutral + Location: 15,10 + Actor412: t07 + Owner: Neutral + Location: 95,72 + Actor413: t16 + Owner: Neutral + Location: 0,50 + Actor414: t07 + Owner: Neutral + Location: 41,81 + Actor416: t01.husk + Owner: Neutral + Location: 58,58 + Actor417: t07 + Owner: Neutral + Location: 52,42 + Actor418: t01 + Owner: Neutral + Location: 82,50 + Actor420: t13 + Owner: Neutral + Location: 1,2 + Actor421: t12 + Owner: Neutral + Location: 78,50 + Actor422: t01.husk + Owner: Neutral + Location: 80,45 + Actor423: t02 + Owner: Neutral + Location: 50,46 + Actor424: t02 + Owner: Neutral + Location: 84,37 + Actor425: t08 + Owner: Neutral + Location: 50,41 + Actor427: t01.husk + Owner: Neutral + Location: 61,70 + Actor428: t05 + Owner: Neutral + Location: 56,9 + Actor432: t07 + Owner: Neutral + Location: 25,77 + Actor435: t12 + Owner: Neutral + Location: 3,0 + Actor437: t17 + Owner: Neutral + Location: 45,41 + Actor438: t07 + Owner: Neutral + Location: 57,41 + Actor439: t08 + Owner: Neutral + Location: 30,76 + Actor441: t05 + Owner: Neutral + Location: 8,54 + Actor442: t01 + Owner: Neutral + Location: 78,51 + Actor444: t13 + Owner: Neutral + Location: 83,3 + Actor445: t05 + Owner: Neutral + Location: 63,38 + Actor446: t16 + Owner: Neutral + Location: 52,51 + Actor447: t03 + Owner: Neutral + Location: 7,87 + Actor448: t08 + Owner: Neutral + Location: 26,73 + Actor449: t08 + Owner: Neutral + Location: 0,0 + Actor450: t08 + Owner: Neutral + Location: 80,27 + Actor451: t08 + Owner: Neutral + Location: 7,14 + Actor452: t05 + Owner: Neutral + Location: 32,87 + Actor453: t13.husk + Owner: Neutral + Location: 14,8 + Actor455: t08 + Owner: Neutral + Location: 8,1 + Actor456: t02 + Owner: Neutral + Location: 24,78 + Actor459: t03 + Owner: Neutral + Location: 72,37 + Actor460: t01 + Owner: Neutral + Location: 46,27 + Actor461: t03 + Owner: Neutral + Location: 53,49 + Actor462: t06 + Owner: Neutral + Location: 45,24 + Actor463: t01 + Owner: Neutral + Location: 58,72 + Actor464: t16 + Owner: Neutral + Location: 96,38 + Actor466: t07 + Owner: Neutral + Location: 58,52 + Actor467: t06 + Owner: Neutral + Location: 91,66 + Actor468: t12 + Owner: Neutral + Location: 20,44 + Actor469: t12 + Owner: Neutral + Location: 19,56 + Actor470: t13 + Owner: Neutral + Location: 23,85 + Actor471: t16 + Owner: Neutral + Location: 38,48 + Actor472: t01 + Owner: Neutral + Location: 90,60 + Actor473: t05 + Owner: Neutral + Location: 7,67 + Actor475: t16 + Owner: Neutral + Location: 45,44 + Actor477: t05 + Owner: Neutral + Location: 19,74 + Actor478: t02 + Owner: Neutral + Location: 61,47 + Actor479: t08 + Owner: Neutral + Location: 54,52 + Actor480: t01 + Owner: Neutral + Location: 15,36 + Actor482: t08 + Owner: Neutral + Location: 58,50 + Actor483: t17.husk + Owner: Neutral + Location: 49,35 + Actor485: t06 + Owner: Neutral + Location: 27,73 + Actor486: t17 + Owner: Neutral + Location: 69,3 + Actor487: t06 + Owner: Neutral + Location: 51,79 + Actor488: t13 + Owner: Neutral + Location: 20,11 + Actor489: t02 + Owner: Neutral + Location: 42,24 + Actor490: t08 + Owner: Neutral + Location: 52,40 + Actor493: t16 + Owner: Neutral + Location: 88,64 + Actor495: t16 + Owner: Neutral + Location: 13,82 + Actor496: t13 + Owner: Neutral + Location: 79,51 + Actor497: t05 + Owner: Neutral + Location: 12,34 + Actor498: t08 + Owner: Neutral + Location: 50,42 + Actor499: t07 + Owner: Neutral + Location: 54,9 + Actor501: t07 + Owner: Neutral + Location: 13,54 + Actor502: t12 + Owner: Neutral + Location: 8,80 + Actor503: t06 + Owner: Neutral + Location: 60,49 + Actor504: t01 + Owner: Neutral + Location: 95,71 + Actor505: t07 + Owner: Neutral + Location: 44,40 + Actor506: t07 + Owner: Neutral + Location: 45,42 + Actor508: t16 + Owner: Neutral + Location: 83,28 + Actor509: t08 + Owner: Neutral + Location: 17,30 + Actor510: t17 + Owner: Neutral + Location: 79,1 + Actor512: t13 + Owner: Neutral + Location: 82,48 + Actor513: t07.husk + Owner: Neutral + Location: 40,71 + Actor514: t03 + Owner: Neutral + Location: 22,84 + Actor515: t02 + Owner: Neutral + Location: 2,47 + Actor516: t06 + Owner: Neutral + Location: 74,51 + Actor517: t01.husk + Owner: Neutral + Location: 54,38 + Actor520: t02.husk + Owner: Neutral + Location: 87,4 + Actor521: t13.husk + Owner: Neutral + Location: 96,9 + Actor522: t07 + Owner: Neutral + Location: 80,21 + Actor525: t02 + Owner: Neutral + Location: 40,22 + Actor526: t16 + Owner: Neutral + Location: 76,53 + Actor527: t01 + Owner: Neutral + Location: 95,58 + Actor529: t12 + Owner: Neutral + Location: 62,54 + Actor532: t08 + Owner: Neutral + Location: 8,69 + Actor533: t13 + Owner: Neutral + Location: 91,60 + Actor534: t03 + Owner: Neutral + Location: 9,54 + Actor535: t08 + Owner: Neutral + Location: 36,11 + Actor536: t16.husk + Owner: Neutral + Location: 9,89 + Actor538: t12 + Owner: Neutral + Location: 79,43 + Actor539: t07 + Owner: Neutral + Location: 14,26 + Actor540: t02 + Owner: Neutral + Location: 43,81 + Actor542: t05 + Owner: Neutral + Location: 16,36 + Actor543: t13 + Owner: Neutral + Location: 41,79 + Actor544: t16 + Owner: Neutral + Location: 11,50 + Actor545: t16 + Owner: Neutral + Location: 26,83 + Actor547: t16 + Owner: Neutral + Location: 13,1 + Actor548: t16 + Owner: Neutral + Location: 55,60 + Actor549: t03 + Owner: Neutral + Location: 42,80 + Actor550: t08.husk + Owner: Neutral + Location: 12,75 + Actor551: t17 + Owner: Neutral + Location: 44,80 + Actor552: t16 + Owner: Neutral + Location: 42,22 + Actor553: t12 + Owner: Neutral + Location: 30,83 + Actor554: t06 + Owner: Neutral + Location: 64,63 + Actor555: t17 + Owner: Neutral + Location: 96,41 + Actor556: t07 + Owner: Neutral + Location: 16,57 + Actor558: t13 + Owner: Neutral + Location: 80,0 + Actor559: t12 + Owner: Neutral + Location: 8,90 + Actor560: t06 + Owner: Neutral + Location: 61,69 + Actor561: t17 + Owner: Neutral + Location: 88,67 + Actor562: t13 + Owner: Neutral + Location: 44,79 + Actor563: t07 + Owner: Neutral + Location: 43,40 + Actor564: t06 + Owner: Neutral + Location: 8,89 + Actor565: t17 + Owner: Neutral + Location: 9,75 + Actor566: t17 + Owner: Neutral + Location: 39,59 + Actor567: t13 + Owner: Neutral + Location: 62,78 + Actor568: t01 + Owner: Neutral + Location: 58,6 + Actor569: t07 + Owner: Neutral + Location: 9,68 + Actor570: t07 + Owner: Neutral + Location: 1,35 + Actor571: t07 + Owner: Neutral + Location: 43,43 + Actor572: t03 + Owner: Neutral + Location: 14,2 + Actor573: t05 + Owner: Neutral + Location: 7,45 + Actor574: t07 + Owner: Neutral + Location: 50,74 + Actor575: t03 + Owner: Neutral + Location: 75,54 + Actor576: t01 + Owner: Neutral + Location: 75,52 + Actor577: t16 + Owner: Neutral + Location: 2,6 + Actor578: t12 + Owner: Neutral + Location: 50,24 + Actor580: t01 + Owner: Neutral + Location: 0,1 + Actor581: t08 + Owner: Neutral + Location: 39,21 + Actor582: t08.husk + Owner: Neutral + Location: 30,85 + Actor583: t05 + Owner: Neutral + Location: 88,65 + Actor585: t12 + Owner: Neutral + Location: 81,4 + Actor586: t13 + Owner: Neutral + Location: 94,70 + Actor587: t08 + Owner: Neutral + Location: 46,6 + Actor589: t17 + Owner: Neutral + Location: 0,42 + Actor590: t02 + Owner: Neutral + Location: 89,69 + Actor591: t16 + Owner: Neutral + Location: 46,18 + Actor592: t17 + Owner: Neutral + Location: 53,8 + Actor593: t02 + Owner: Neutral + Location: 81,17 + Actor594: t01 + Owner: Neutral + Location: 0,47 + Actor595: t07 + Owner: Neutral + Location: 47,22 + Actor596: t07 + Owner: Neutral + Location: 6,0 + Actor597: t16 + Owner: Neutral + Location: 67,65 + Actor598: t13 + Owner: Neutral + Location: 60,56 + Actor599: t03 + Owner: Neutral + Location: 49,54 + Actor600: t07 + Owner: Neutral + Location: 7,62 + Actor601: t07 + Owner: Neutral + Location: 42,45 + Actor603: t03 + Owner: Neutral + Location: 45,26 + Actor604: t12 + Owner: Neutral + Location: 85,36 + Actor606: t05 + Owner: Neutral + Location: 13,51 + Actor607: t07 + Owner: Neutral + Location: 48,21 + Actor608: t13 + Owner: Neutral + Location: 75,51 + Actor609: t08 + Owner: Neutral + Location: 65,80 + Actor610: t05 + Owner: Neutral + Location: 40,79 + Actor611: t07 + Owner: Neutral + Location: 96,29 + Actor614: t08 + Owner: Neutral + Location: 20,19 + Actor615: t13 + Owner: Neutral + Location: 77,51 + Actor616: t13 + Owner: Neutral + Location: 13,10 + Actor617: t08 + Owner: Neutral + Location: 32,82 + Actor619: t17 + Owner: Neutral + Location: 15,82 + Actor620: t01 + Owner: Neutral + Location: 45,15 + Actor621: t13 + Owner: Neutral + Location: 62,66 + Actor622: t05 + Owner: Neutral + Location: 7,60 + Actor623: t13 + Owner: Neutral + Location: 86,50 + Actor624: t08 + Owner: Neutral + Location: 85,39 + Actor625: t02 + Owner: Neutral + Location: 0,76 + Actor626: t12 + Owner: Neutral + Location: 83,38 + Actor627: t05 + Owner: Neutral + Location: 0,17 + Actor628: t12 + Owner: Neutral + Location: 45,81 + Actor629: t16 + Owner: Neutral + Location: 60,55 + Actor630: t13 + Owner: Neutral + Location: 53,52 + Actor633: t02 + Owner: Neutral + Location: 35,70 + Actor634: t02.husk + Owner: Neutral + Location: 11,75 + Actor635: t08 + Owner: Neutral + Location: 63,66 + Actor638: t13 + Owner: Neutral + Location: 14,82 + Actor640: t01 + Owner: Neutral + Location: 15,1 + Actor641: t16 + Owner: Neutral + Location: 23,61 + Actor642: t16 + Owner: Neutral + Location: 77,45 + Actor643: t03 + Owner: Neutral + Location: 28,83 + Actor645: t16 + Owner: Neutral + Location: 76,28 + Actor646: t06 + Owner: Neutral + Location: 82,49 + Actor648: t01 + Owner: Neutral + Location: 61,71 + Actor649: t07 + Owner: Neutral + Location: 51,36 + Actor650: t03 + Owner: Neutral + Location: 28,72 + Actor651: t17.husk + Owner: Neutral + Location: 44,42 + Actor652: t07 + Owner: Neutral + Location: 13,0 + Actor653: t01 + Owner: Neutral + Location: 50,45 + Actor654: t03 + Owner: Neutral + Location: 51,34 + Actor655: t03 + Owner: Neutral + Location: 17,57 + Actor656: t16 + Owner: Neutral + Location: 86,49 + Actor657: t05 + Owner: Neutral + Location: 0,18 + Actor659: t07 + Owner: Neutral + Location: 9,9 + Actor661: t17 + Owner: Neutral + Location: 80,22 + Actor662: t16 + Owner: Neutral + Location: 6,58 + Actor663: t01 + Owner: Neutral + Location: 17,77 + Actor664: t17 + Owner: Neutral + Location: 2,9 + Actor666: t01 + Owner: Neutral + Location: 90,67 + Actor668: t07 + Owner: Neutral + Location: 19,75 + Actor669: t12 + Owner: Neutral + Location: 97,28 + Actor671: t16 + Owner: Neutral + Location: 45,4 + Actor673: t02 + Owner: Neutral + Location: 15,26 + Actor674: t06 + Owner: Neutral + Location: 95,0 + Actor676: t02 + Owner: Neutral + Location: 29,78 + Actor678: t06 + Owner: Neutral + Location: 57,39 + Actor679: t01 + Owner: Neutral + Location: 3,3 + Actor680: t17 + Owner: Neutral + Location: 29,8 + Actor681: t08 + Owner: Neutral + Location: 7,89 + Actor683: t02 + Owner: Neutral + Location: 45,80 + Actor684: t07.husk + Owner: Neutral + Location: 23,36 + Actor685: t02 + Owner: Neutral + Location: 93,52 + Actor686: t03 + Owner: Neutral + Location: 78,57 + Actor687: t01 + Owner: Neutral + Location: 82,17 + Actor688: t03 + Owner: Neutral + Location: 81,21 + Actor689: t17 + Owner: Neutral + Location: 78,1 + Actor691: t06.husk + Owner: Neutral + Location: 52,74 + Actor692: t16 + Owner: Neutral + Location: 25,78 + Actor693: t13 + Owner: Neutral + Location: 64,65 + Actor694: t02 + Owner: Neutral + Location: 80,51 + Actor695: t05 + Owner: Neutral + Location: 75,56 + Actor696: t03 + Owner: Neutral + Location: 26,85 + Actor697: t12 + Owner: Neutral + Location: 53,54 + Actor698: t02 + Owner: Neutral + Location: 18,62 + Actor699: t08 + Owner: Neutral + Location: 91,63 + Actor700: t02 + Owner: Neutral + Location: 51,47 + Actor701: t02 + Owner: Neutral + Location: 42,48 + Actor702: t05 + Owner: Neutral + Location: 95,57 + Actor703: t17.husk + Owner: Neutral + Location: 87,12 + Actor704: t08 + Owner: Neutral + Location: 43,68 + Actor705: t08.husk + Owner: Neutral + Location: 31,80 + Actor707: t01 + Owner: Neutral + Location: 48,71 + Actor708: t08 + Owner: Neutral + Location: 43,85 + Actor709: t12 + Owner: Neutral + Location: 79,29 + Actor710: t08 + Owner: Neutral + Location: 53,47 + Actor711: t01 + Owner: Neutral + Location: 1,9 + Actor712: t01 + Owner: Neutral + Location: 22,67 + Actor713: t16 + Owner: Neutral + Location: 79,11 + Actor714: t08 + Owner: Neutral + Location: 9,78 + Actor715: t07 + Owner: Neutral + Location: 1,11 + Actor717: t08 + Owner: Neutral + Location: 50,45 + Actor718: t12 + Owner: Neutral + Location: 51,32 + Actor719: t08.husk + Owner: Neutral + Location: 78,53 + Actor720: t17 + Owner: Neutral + Location: 57,58 + Actor721: t02 + Owner: Neutral + Location: 43,25 + Actor722: t06 + Owner: Neutral + Location: 51,43 + Actor723: t01 + Owner: Neutral + Location: 82,51 + Actor724: t03 + Owner: Neutral + Location: 0,51 + Actor725: t03 + Owner: Neutral + Location: 14,81 + Actor726: t02 + Owner: Neutral + Location: 86,37 + Actor727: t01 + Owner: Neutral + Location: 3,38 + Actor728: t17 + Owner: Neutral + Location: 14,0 + Actor730: t06 + Owner: Neutral + Location: 46,6 + Actor731: t01.husk + Owner: Neutral + Location: 61,38 + Actor732: t13 + Owner: Neutral + Location: 15,31 + Actor733: t12 + Owner: Neutral + Location: 77,14 + Actor734: t08 + Owner: Neutral + Location: 18,64 + Actor735: t17.husk + Owner: Neutral + Location: 81,59 + Actor736: t06 + Owner: Neutral + Location: 13,52 + Actor737: t03 + Owner: Neutral + Location: 22,85 + Actor738: t06 + Owner: Neutral + Location: 46,73 + Actor739: t06 + Owner: Neutral + Location: 70,13 + Actor740: t17.husk + Owner: Neutral + Location: 39,65 + Actor741: t12 + Owner: Neutral + Location: 24,62 + Actor742: t13 + Owner: Neutral + Location: 40,63 + Actor743: t07 + Owner: Neutral + Location: 25,86 + Actor745: t12 + Owner: Neutral + Location: 20,10 + Actor746: t13 + Owner: Neutral + Location: 75,19 + Actor747: t05 + Owner: Neutral + Location: 64,79 + Actor748: t02 + Owner: Neutral + Location: 74,54 + Actor749: t02 + Owner: Neutral + Location: 55,51 + Actor750: t16 + Owner: Neutral + Location: 2,81 + Actor751: t16 + Owner: Neutral + Location: 53,56 + Actor752: t06 + Owner: Neutral + Location: 6,41 + Actor754: t06 + Owner: Neutral + Location: 61,11 + Actor755: t17 + Owner: Neutral + Location: 43,68 + Actor756: t16 + Owner: Neutral + Location: 64,5 + Actor757: t06 + Owner: Neutral + Location: 41,67 + Actor759: t08 + Owner: Neutral + Location: 81,1 + Actor760: t01 + Owner: Neutral + Location: 86,52 + Actor761: t05 + Owner: Neutral + Location: 67,67 + Actor763: t01 + Owner: Neutral + Location: 28,5 + Actor764: t02 + Owner: Neutral + Location: 57,46 + Actor765: t12 + Owner: Neutral + Location: 27,83 + Actor766: t07 + Owner: Neutral + Location: 82,23 + Actor767: t08 + Owner: Neutral + Location: 58,48 + Actor768: t05 + Owner: Neutral + Location: 49,25 + Actor769: t01 + Owner: Neutral + Location: 0,81 + Actor772: t03 + Owner: Neutral + Location: 50,21 + Actor773: t17 + Owner: Neutral + Location: 15,76 + Actor774: t02 + Owner: Neutral + Location: 79,52 + Actor775: t07 + Owner: Neutral + Location: 95,30 + Actor776: t08 + Owner: Neutral + Location: 74,21 + Actor778: t08 + Owner: Neutral + Location: 16,75 + Actor779: t08 + Owner: Neutral + Location: 11,81 + Actor780: t01 + Owner: Neutral + Location: 80,52 + Actor782: t16 + Owner: Neutral + Location: 17,20 + Actor783: t06 + Owner: Neutral + Location: 7,55 + Actor784: t13 + Owner: Neutral + Location: 96,49 + Actor785: t06 + Owner: Neutral + Location: 79,13 + Actor786: t03 + Owner: Neutral + Location: 82,3 + Actor787: t03.husk + Owner: Neutral + Location: 16,73 + Actor788: t16 + Owner: Neutral + Location: 21,40 + Actor791: t07 + Owner: Neutral + Location: 32,76 + Actor792: t12 + Owner: Neutral + Location: 5,47 + Actor793: t16 + Owner: Neutral + Location: 0,8 + Actor795: t01 + Owner: Neutral + Location: 43,62 + Actor797: t07 + Owner: Neutral + Location: 23,86 + Actor798: t01 + Owner: Neutral + Location: 7,61 + Actor799: t01 + Owner: Neutral + Location: 22,13 + Actor800: t12 + Owner: Neutral + Location: 30,9 + Actor802: t12 + Owner: Neutral + Location: 79,55 + Actor803: t16 + Owner: Neutral + Location: 28,79 + Actor804: t03 + Owner: Neutral + Location: 17,66 + Actor808: t17 + Owner: Neutral + Location: 21,63 + Actor809: t17 + Owner: Neutral + Location: 96,57 + Actor810: t12 + Owner: Neutral + Location: 61,76 + Actor811: t07 + Owner: Neutral + Location: 50,35 + Actor812: t13 + Owner: Neutral + Location: 43,83 + Actor813: t06 + Owner: Neutral + Location: 45,66 + Actor814: t16 + Owner: Neutral + Location: 85,47 + Actor815: t02.husk + Owner: Neutral + Location: 14,62 + Actor816: t06 + Owner: Neutral + Location: 16,32 + Actor817: t06 + Owner: Neutral + Location: 87,66 + Actor819: t03 + Owner: Neutral + Location: 47,73 + Actor820: t08 + Owner: Neutral + Location: 51,51 + Actor821: t16 + Owner: Neutral + Location: 60,54 + Actor822: t03 + Owner: Neutral + Location: 38,68 + Actor823: t03 + Owner: Neutral + Location: 24,79 + Actor825: t03 + Owner: Neutral + Location: 60,76 + Actor826: t13 + Owner: Neutral + Location: 30,80 + Actor828: t02 + Owner: Neutral + Location: 48,53 + Actor829: t06 + Owner: Neutral + Location: 76,24 + Actor830: t01 + Owner: Neutral + Location: 11,54 + Actor831: t08 + Owner: Neutral + Location: 17,32 + Actor832: t08 + Owner: Neutral + Location: 95,30 + Actor833: t16.husk + Owner: Neutral + Location: 44,69 + Actor834: t17 + Owner: Neutral + Location: 88,46 + Actor835: t13 + Owner: Neutral + Location: 24,80 + Actor838: t17 + Owner: Neutral + Location: 83,26 + Actor840: t05 + Owner: Neutral + Location: 14,55 + Actor841: t07 + Owner: Neutral + Location: 15,8 + Actor842: t07 + Owner: Neutral + Location: 93,49 + Actor845: t03 + Owner: Neutral + Location: 79,40 + Actor846: t01 + Owner: Neutral + Location: 9,81 + Actor847: t12 + Owner: Neutral + Location: 80,13 + Actor849: t08.husk + Owner: Neutral + Location: 53,38 + Actor850: t16 + Owner: Neutral + Location: 9,76 + Actor851: t13 + Owner: Neutral + Location: 52,49 + Actor852: t16 + Owner: Neutral + Location: 30,82 + Actor853: t06 + Owner: Neutral + Location: 47,4 + Actor854: t02 + Owner: Neutral + Location: 73,24 + Actor855: t07 + Owner: Neutral + Location: 8,88 + Actor856: t07 + Owner: Neutral + Location: 14,58 + Actor858: t07 + Owner: Neutral + Location: 95,62 + Actor859: t08 + Owner: Neutral + Location: 50,21 + Actor860: t03 + Owner: Neutral + Location: 84,36 + Actor861: t16 + Owner: Neutral + Location: 79,10 + Actor862: t02 + Owner: Neutral + Location: 47,25 + Actor864: t02 + Owner: Neutral + Location: 58,74 + Actor865: t05 + Owner: Neutral + Location: 81,1 + Actor866: t17 + Owner: Neutral + Location: 88,3 + Actor867: t03 + Owner: Neutral + Location: 96,69 + Actor870: t12 + Owner: Neutral + Location: 51,82 + Actor871: t07 + Owner: Neutral + Location: 80,59 + Actor873: t13 + Owner: Neutral + Location: 53,80 + Actor875: t02 + Owner: Neutral + Location: 27,72 + Actor876: t03 + Owner: Neutral + Location: 15,38 + Actor878: t16.husk + Owner: Neutral + Location: 60,68 + Actor879: t03 + Owner: Neutral + Location: 29,76 + Actor880: t03.husk + Owner: Neutral + Location: 85,0 + Actor881: t02 + Owner: Neutral + Location: 8,13 + Actor883: t02 + Owner: Neutral + Location: 95,36 + Actor884: t16 + Owner: Neutral + Location: 38,52 + Actor885: t03 + Owner: Neutral + Location: 43,46 + Actor886: t08 + Owner: Neutral + Location: 3,49 + Actor887: t17 + Owner: Neutral + Location: 7,42 + Actor888: t08 + Owner: Neutral + Location: 8,79 + Actor889: t07 + Owner: Neutral + Location: 54,8 + Actor890: t01 + Owner: Neutral + Location: 20,19 + Actor892: t17 + Owner: Neutral + Location: 91,2 + Actor893: t13 + Owner: Neutral + Location: 16,58 + Actor894: t17 + Owner: Neutral + Location: 78,15 + Actor895: t05 + Owner: Neutral + Location: 57,6 + Actor896: t16 + Owner: Neutral + Location: 7,56 + Actor898: t13 + Owner: Neutral + Location: 44,71 + Actor899: t07 + Owner: Neutral + Location: 71,11 + Actor900: t01 + Owner: Neutral + Location: 80,16 + Actor901: t01 + Owner: Neutral + Location: 19,31 + Actor904: t01 + Owner: Neutral + Location: 3,45 + Actor905: t03 + Owner: Neutral + Location: 11,57 + Actor906: t03 + Owner: Neutral + Location: 10,1 + Actor907: t08.husk + Owner: Neutral + Location: 84,48 + Actor908: t13 + Owner: Neutral + Location: 51,10 + Actor909: t16 + Owner: Neutral + Location: 55,12 + Actor912: t08 + Owner: Neutral + Location: 40,51 + Actor913: t06 + Owner: Neutral + Location: 61,67 + Actor914: t03 + Owner: Neutral + Location: 96,30 + Actor915: t01 + Owner: Neutral + Location: 26,84 + Actor916: t12 + Owner: Neutral + Location: 57,44 + Actor917: t08 + Owner: Neutral + Location: 96,44 + Actor918: t16 + Owner: Neutral + Location: 95,35 + Actor919: t12 + Owner: Neutral + Location: 74,55 + Actor920: t12 + Owner: Neutral + Location: 47,5 + Actor921: t13 + Owner: Neutral + Location: 92,56 + Actor922: t06 + Owner: Neutral + Location: 20,62 + Actor923: t13 + Owner: Neutral + Location: 44,82 + Actor924: t16 + Owner: Neutral + Location: 2,45 + Actor925: t12 + Owner: Neutral + Location: 18,66 + Actor926: t16.husk + Owner: Neutral + Location: 1,1 + Actor927: t05 + Owner: Neutral + Location: 89,2 + Actor928: t17 + Owner: Neutral + Location: 96,8 + Actor929: t01 + Owner: Neutral + Location: 39,44 + Actor930: t06.husk + Owner: Neutral + Location: 51,42 + Actor931: t01 + Owner: Neutral + Location: 72,9 + Actor932: t02 + Owner: Neutral + Location: 53,36 + Actor933: t12.husk + Owner: Neutral + Location: 93,0 + Actor934: t05 + Owner: Neutral + Location: 92,52 + Actor937: t05 + Owner: Neutral + Location: 43,70 + Actor938: t16 + Owner: Neutral + Location: 45,73 + Actor939: t01 + Owner: Neutral + Location: 40,78 + Actor941: t05.husk + Owner: Neutral + Location: 38,66 + Actor942: t08.husk + Owner: Neutral + Location: 58,45 + Actor943: t12 + Owner: Neutral + Location: 12,25 + Actor944: t05 + Owner: Neutral + Location: 1,44 + Actor946: t13 + Owner: Neutral + Location: 10,9 + Actor947: t02 + Owner: Neutral + Location: 51,81 + Actor949: t16 + Owner: Neutral + Location: 19,63 + Actor950: t01 + Owner: Neutral + Location: 81,18 + Actor952: t13.husk + Owner: Neutral + Location: 13,50 + Actor953: t08 + Owner: Neutral + Location: 96,73 + Actor954: t08 + Owner: Neutral + Location: 50,26 + Actor955: t05 + Owner: Neutral + Location: 29,84 + Actor957: t05 + Owner: Neutral + Location: 18,65 + Actor958: t03 + Owner: Neutral + Location: 14,49 + Actor959: t06 + Owner: Neutral + Location: 42,81 + Actor960: t01 + Owner: Neutral + Location: 87,63 + Actor961: t02 + Owner: Neutral + Location: 16,64 + Actor963: t08 + Owner: Neutral + Location: 78,15 + Actor964: t01 + Owner: Neutral + Location: 39,50 + Actor965: t13 + Owner: Neutral + Location: 53,53 + Actor967: t05 + Owner: Neutral + Location: 64,13 + Actor968: t06 + Owner: Neutral + Location: 78,42 + Actor969: t13 + Owner: Neutral + Location: 17,10 + Actor970: t16 + Owner: Neutral + Location: 42,69 + Actor972: t17 + Owner: Neutral + Location: 49,32 + Actor973: t03 + Owner: Neutral + Location: 43,71 + Actor974: t07 + Owner: Neutral + Location: 51,44 + Actor976: t06 + Owner: Neutral + Location: 45,21 + Actor977: t13 + Owner: Neutral + Location: 45,60 + Actor978: t06 + Owner: Neutral + Location: 85,37 + Actor979: t07 + Owner: Neutral + Location: 57,34 + Actor980: t12 + Owner: Neutral + Location: 89,65 + Actor981: t02 + Owner: Neutral + Location: 17,19 + Actor983: t08 + Owner: Neutral + Location: 10,81 + Actor984: t03 + Owner: Neutral + Location: 28,4 + Actor985: t16 + Owner: Neutral + Location: 21,85 + Actor986: t16 + Owner: Neutral + Location: 62,72 + Actor987: t07 + Owner: Neutral + Location: 69,67 + Actor988: t13 + Owner: Neutral + Location: 19,21 + Actor989: t13 + Owner: Neutral + Location: 40,70 + Actor990: t08.husk + Owner: Neutral + Location: 78,0 + Actor991: t12.husk + Owner: Neutral + Location: 16,31 + Actor992: t12 + Owner: Neutral + Location: 43,24 + Actor993: t06 + Owner: Neutral + Location: 15,12 + Actor994: t03 + Owner: Neutral + Location: 83,35 + Actor995: t16 + Owner: Neutral + Location: 38,44 + Actor996: t03 + Owner: Neutral + Location: 12,56 + Actor997: t08 + Owner: Neutral + Location: 77,28 + Actor998: t08 + Owner: Neutral + Location: 55,12 + Actor999: t05 + Owner: Neutral + Location: 0,2 + Actor1000: t17 + Owner: Neutral + Location: 84,51 + Actor1001: t12 + Owner: Neutral + Location: 19,58 + Actor1003: t17 + Owner: Neutral + Location: 14,29 + Actor1004: t17 + Owner: Neutral + Location: 2,44 + Actor1006: t12 + Owner: Neutral + Location: 15,0 + Actor1007: t06 + Owner: Neutral + Location: 75,55 + Actor1008: t03 + Owner: Neutral + Location: 82,37 + Actor1009: t01 + Owner: Neutral + Location: 44,24 + Actor1010: t12 + Owner: Neutral + Location: 48,79 + Actor1011: t01 + Owner: Neutral + Location: 27,2 + Actor1013: t02 + Owner: Neutral + Location: 10,89 + Actor1014: t13 + Owner: Neutral + Location: 0,84 + Actor1016: t08 + Owner: Neutral + Location: 89,67 + Actor1018: t06 + Owner: Neutral + Location: 18,32 + Actor1019: t06.husk + Owner: Neutral + Location: 12,31 + Actor1020: t13 + Owner: Neutral + Location: 21,42 + Actor1025: t12 + Owner: Neutral + Location: 19,29 + Actor1026: t17 + Owner: Neutral + Location: 48,25 + Actor1027: t13 + Owner: Neutral + Location: 15,61 + Actor1028: t02 + Owner: Neutral + Location: 10,51 + Actor1029: t01 + Owner: Neutral + Location: 42,61 + Actor1030: t01 + Owner: Neutral + Location: 90,71 + Actor1032: t02 + Owner: Neutral + Location: 54,49 + Actor1033: t16 + Owner: Neutral + Location: 41,80 + Actor1034: t06 + Owner: Neutral + Location: 16,62 + Actor1035: t06.husk + Owner: Neutral + Location: 74,24 + Actor1036: t06 + Owner: Neutral + Location: 7,58 + Actor1037: t12 + Owner: Neutral + Location: 26,79 + Actor1038: t17.husk + Owner: Neutral + Location: 56,54 + Actor1040: t06 + Owner: Neutral + Location: 44,72 + Actor1041: t01 + Owner: Neutral + Location: 80,40 + Actor1042: t16 + Owner: Neutral + Location: 76,19 + Actor1043: t03 + Owner: Neutral + Location: 59,9 + Actor1044: t06 + Owner: Neutral + Location: 15,35 + Actor1045: t08 + Owner: Neutral + Location: 58,54 + Actor1047: t07 + Owner: Neutral + Location: 28,81 + Actor1048: t13 + Owner: Neutral + Location: 90,58 + Actor1049: t13.husk + Owner: Neutral + Location: 83,36 + Actor1050: t13 + Owner: Neutral + Location: 48,17 + Actor1051: t02 + Owner: Neutral + Location: 94,72 + Actor1053: t02 + Owner: Neutral + Location: 56,41 + Actor1054: t06 + Owner: Neutral + Location: 0,0 + Actor1055: t13 + Owner: Neutral + Location: 11,58 + Actor1056: t16.husk + Owner: Neutral + Location: 22,63 + Actor1057: t05 + Owner: Neutral + Location: 41,69 + Actor1059: t16 + Owner: Neutral + Location: 16,77 + Actor1060: t06 + Owner: Neutral + Location: 47,18 + Actor1061: t02 + Owner: Neutral + Location: 55,54 + Actor1063: t16 + Owner: Neutral + Location: 77,26 + Actor1064: t16 + Owner: Neutral + Location: 19,30 + Actor1065: t01 + Owner: Neutral + Location: 51,37 + Actor1066: t01 + Owner: Neutral + Location: 79,50 + Actor1067: t07 + Owner: Neutral + Location: 49,71 + Actor1069: t13 + Owner: Neutral + Location: 42,78 + Actor1070: t01 + Owner: Neutral + Location: 42,83 + Actor1071: t17 + Owner: Neutral + Location: 12,1 + Actor1072: t12 + Owner: Neutral + Location: 80,27 + Actor1074: t13 + Owner: Neutral + Location: 85,54 + Actor1076: t06 + Owner: Neutral + Location: 73,53 + Actor1078: t17 + Owner: Neutral + Location: 9,0 + Actor1079: t01 + Owner: Neutral + Location: 79,56 + Actor1080: t03 + Owner: Neutral + Location: 40,72 + Actor1081: t16 + Owner: Neutral + Location: 79,44 + Actor1084: t08 + Owner: Neutral + Location: 85,52 + Actor1085: t03 + Owner: Neutral + Location: 23,82 + Actor1086: t07 + Owner: Neutral + Location: 84,50 + Actor1087: t08 + Owner: Neutral + Location: 28,77 + Actor1088: t17 + Owner: Neutral + Location: 72,51 + Actor1089: t08 + Owner: Neutral + Location: 2,14 + Actor1090: t13 + Owner: Neutral + Location: 85,67 + Actor1092: t07 + Owner: Neutral + Location: 87,49 + Actor1093: t12 + Owner: Neutral + Location: 20,56 + Actor1094: t07 + Owner: Neutral + Location: 84,43 + Actor1095: t13 + Owner: Neutral + Location: 43,79 + Actor1096: t08 + Owner: Neutral + Location: 58,38 + Actor1097: t12.husk + Owner: Neutral + Location: 72,36 + Actor1099: t13 + Owner: Neutral + Location: 85,42 + Actor1100: t17 + Owner: Neutral + Location: 20,29 + Actor1101: t12.husk + Owner: Neutral + Location: 90,65 + Actor1102: t08 + Owner: Neutral + Location: 59,50 + Actor1103: t17 + Owner: Neutral + Location: 5,90 + Actor1104: t03 + Owner: Neutral + Location: 80,29 + Actor1106: t08 + Owner: Neutral + Location: 80,24 + Actor1107: t13 + Owner: Neutral + Location: 8,7 + Actor1108: t12 + Owner: Neutral + Location: 77,17 + Actor1109: t13 + Owner: Neutral + Location: 20,28 + Actor1110: t17 + Owner: Neutral + Location: 21,22 + Actor1112: t17 + Owner: Neutral + Location: 88,61 + Actor1114: t07 + Owner: Neutral + Location: 1,46 + Actor1116: t02 + Owner: Neutral + Location: 96,36 + Actor1118: t12 + Owner: Neutral + Location: 52,52 + Actor1119: t01 + Owner: Neutral + Location: 24,61 + Actor1120: t12 + Owner: Neutral + Location: 16,20 + Actor1121: t17 + Owner: Neutral + Location: 20,63 + Actor1123: t06 + Owner: Neutral + Location: 89,63 + Actor1124: t03 + Owner: Neutral + Location: 48,54 + Actor1126: t12 + Owner: Neutral + Location: 41,45 + Actor1128: t13 + Owner: Neutral + Location: 24,86 + Actor1129: t03 + Owner: Neutral + Location: 57,32 + Actor1130: t06 + Owner: Neutral + Location: 96,73 + Actor1131: t13 + Owner: Neutral + Location: 43,22 + Actor1133: t16 + Owner: Neutral + Location: 51,73 + Actor1135: t03 + Owner: Neutral + Location: 64,4 + Actor1136: t02 + Owner: Neutral + Location: 77,46 + Actor1137: t07 + Owner: Neutral + Location: 53,31 + Actor1138: t06 + Owner: Neutral + Location: 50,42 + Actor1139: t07 + Owner: Neutral + Location: 1,79 + Actor1140: t01.husk + Owner: Neutral + Location: 43,23 + Actor1141: t16 + Owner: Neutral + Location: 61,57 + Actor1142: t05 + Owner: Neutral + Location: 76,55 + Actor1144: t01 + Owner: Neutral + Location: 74,56 + Actor1145: t06.husk + Owner: Neutral + Location: 5,1 + Actor1146: t16 + Owner: Neutral + Location: 90,63 + Actor1147: t01 + Owner: Neutral + Location: 91,63 + Actor1148: t01 + Owner: Neutral + Location: 96,70 + Actor1149: t05 + Owner: Neutral + Location: 2,39 + Actor1151: t05 + Owner: Neutral + Location: 10,62 + Actor1152: t02.husk + Owner: Neutral + Location: 83,53 + Actor1155: t08 + Owner: Neutral + Location: 7,60 + Actor1156: t05 + Owner: Neutral + Location: 39,53 + Actor1157: t01 + Owner: Neutral + Location: 11,63 + Actor1158: t07 + Owner: Neutral + Location: 21,28 + Actor1159: t16 + Owner: Neutral + Location: 42,52 + Actor1160: t16 + Owner: Neutral + Location: 62,74 + Actor1161: t12 + Owner: Neutral + Location: 51,56 + Actor1162: t03 + Owner: Neutral + Location: 44,39 + Actor1163: t01 + Owner: Neutral + Location: 1,17 + Actor1165: t05 + Owner: Neutral + Location: 40,40 + Actor1166: t06 + Owner: Neutral + Location: 0,49 + Actor1167: t01 + Owner: Neutral + Location: 10,81 + Actor1168: t01 + Owner: Neutral + Location: 80,1 + Actor1169: t16 + Owner: Neutral + Location: 83,56 + Actor1170: t07 + Owner: Neutral + Location: 54,7 + Actor1172: t01 + Owner: Neutral + Location: 54,55 + Actor1174: t07 + Owner: Neutral + Location: 78,44 + Actor1176: t16 + Owner: Neutral + Location: 2,77 + Actor1177: t02 + Owner: Neutral + Location: 56,59 + Actor1178: t07 + Owner: Neutral + Location: 6,45 + Actor1179: t08 + Owner: Neutral + Location: 24,84 + Actor1182: t01.husk + Owner: Neutral + Location: 43,63 + Actor1183: t06 + Owner: Neutral + Location: 48,4 + Actor1184: t01 + Owner: Neutral + Location: 56,32 + Actor1186: t06 + Owner: Neutral + Location: 13,56 + Actor1187: t16 + Owner: Neutral + Location: 74,25 + Actor1189: t17 + Owner: Neutral + Location: 46,62 + Actor1190: t16 + Owner: Neutral + Location: 96,58 + Actor1192: t06 + Owner: Neutral + Location: 76,16 + Actor1194: t05 + Owner: Neutral + Location: 40,52 + Actor1195: t02 + Owner: Neutral + Location: 58,56 + Actor1197: t12 + Owner: Neutral + Location: 96,24 + Actor1198: t02.husk + Owner: Neutral + Location: 42,23 + Actor1201: t07 + Owner: Neutral + Location: 29,7 + Actor1202: t13 + Owner: Neutral + Location: 87,68 + Actor1203: t13 + Owner: Neutral + Location: 55,8 + Actor1204: t08 + Owner: Neutral + Location: 15,75 + Actor1205: t01 + Owner: Neutral + Location: 3,46 + Actor1207: t02 + Owner: Neutral + Location: 50,43 + Actor1208: t05 + Owner: Neutral + Location: 96,37 + Actor1209: t06 + Owner: Neutral + Location: 2,37 + Actor1210: t16 + Owner: Neutral + Location: 88,68 + Actor1211: t12 + Owner: Neutral + Location: 42,59 + Actor1213: t13 + Owner: Neutral + Location: 12,50 + Actor1214: t08 + Owner: Neutral + Location: 0,10 + Actor1215: t16 + Owner: Neutral + Location: 7,43 + Actor1216: t06 + Owner: Neutral + Location: 92,63 + Actor1217: t02 + Owner: Neutral + Location: 53,58 + Actor1218: t12 + Owner: Neutral + Location: 10,63 + Actor1219: t05 + Owner: Neutral + Location: 50,56 + Actor1220: t16 + Owner: Neutral + Location: 61,54 + Actor1221: t12 + Owner: Neutral + Location: 55,58 + Actor1224: t13 + Owner: Neutral + Location: 18,20 + Actor1225: t02 + Owner: Neutral + Location: 42,68 + Actor1226: t07.husk + Owner: Neutral + Location: 3,81 + Actor1231: t07 + Owner: Neutral + Location: 49,52 + Actor1232: t02 + Owner: Neutral + Location: 42,79 + Actor1234: t17 + Owner: Neutral + Location: 2,7 + Actor1235: t05 + Owner: Neutral + Location: 13,75 + Actor1237: t16 + Owner: Neutral + Location: 27,5 + Actor1238: t01 + Owner: Neutral + Location: 61,68 + Actor1239: t03 + Owner: Neutral + Location: 60,57 + Actor1243: t05 + Owner: Neutral + Location: 41,70 + Actor1244: t03 + Owner: Neutral + Location: 74,47 + Actor1245: t08 + Owner: Neutral + Location: 83,50 + Actor1246: t03 + Owner: Neutral + Location: 76,52 + Actor1247: t17 + Owner: Neutral + Location: 69,4 + Actor1248: t03 + Owner: Neutral + Location: 18,9 + Actor1250: t01 + Owner: Neutral + Location: 42,62 + Actor1252: t17 + Owner: Neutral + Location: 64,64 + Actor1253: t17 + Owner: Neutral + Location: 38,64 + Actor1254: t12 + Owner: Neutral + Location: 42,35 + Actor1255: t08.husk + Owner: Neutral + Location: 38,48 + Actor1256: t01 + Owner: Neutral + Location: 80,50 + Actor1257: t17 + Owner: Neutral + Location: 39,60 + Actor1258: t01 + Owner: Neutral + Location: 85,50 + Actor1259: t06 + Owner: Neutral + Location: 49,20 + Actor1260: t01 + Owner: Neutral + Location: 27,3 + Actor1261: t07.husk + Owner: Neutral + Location: 0,12 + Actor1262: t02 + Owner: Neutral + Location: 84,39 + Actor1264: t03 + Owner: Neutral + Location: 92,64 + Actor1265: t03 + Owner: Neutral + Location: 14,50 + Actor1266: t08 + Owner: Neutral + Location: 62,66 + Actor1267: t05 + Owner: Neutral + Location: 11,56 + Actor1268: t12 + Owner: Neutral + Location: 82,21 + Actor1269: t03 + Owner: Neutral + Location: 38,49 + Actor1270: t06 + Owner: Neutral + Location: 92,55 + Actor1271: t01.husk + Owner: Neutral + Location: 1,10 + Actor1273: t07 + Owner: Neutral + Location: 22,82 + Actor1274: t16 + Owner: Neutral + Location: 51,11 + Actor1276: t02 + Owner: Neutral + Location: 36,11 + Actor1277: t01 + Owner: Neutral + Location: 48,20 + Actor1279: t07.husk + Owner: Neutral + Location: 39,78 + Actor1281: t13 + Owner: Neutral + Location: 86,38 + Actor1282: t05 + Owner: Neutral + Location: 2,41 + Actor1283: t12 + Owner: Neutral + Location: 82,59 + Actor1285: t03 + Owner: Neutral + Location: 57,7 + Actor1286: t07 + Owner: Neutral + Location: 86,0 + Actor1287: t17 + Owner: Neutral + Location: 79,49 + Actor1288: t16 + Owner: Neutral + Location: 16,10 + Actor1289: t07 + Owner: Neutral + Location: 77,22 + Actor1290: t06 + Owner: Neutral + Location: 51,45 + Actor1291: t05 + Owner: Neutral + Location: 30,76 + Actor1292: t08 + Owner: Neutral + Location: 51,50 + Actor1294: t02 + Owner: Neutral + Location: 89,62 + Actor1295: t02 + Owner: Neutral + Location: 84,3 + Actor1296: t12 + Owner: Neutral + Location: 56,43 + Actor1297: t13 + Owner: Neutral + Location: 73,42 + Actor1298: t06 + Owner: Neutral + Location: 30,74 + Actor1299: t16 + Owner: Neutral + Location: 18,28 + Actor1300: t12 + Owner: Neutral + Location: 29,1 + Actor1302: t06 + Owner: Neutral + Location: 41,64 + Actor1303: t02 + Owner: Neutral + Location: 44,37 + Actor1305: t01 + Owner: Neutral + Location: 54,59 + Actor1306: t16 + Owner: Neutral + Location: 27,79 + Actor1307: t05 + Owner: Neutral + Location: 36,52 + Actor1308: t08 + Owner: Neutral + Location: 8,77 + Actor1309: t12 + Owner: Neutral + Location: 57,33 + Actor1310: t12 + Owner: Neutral + Location: 20,58 + Actor1311: t01 + Owner: Neutral + Location: 3,35 + Actor1312: t17 + Owner: Neutral + Location: 87,11 + Actor1313: t03 + Owner: Neutral + Location: 16,56 + Actor1315: t12 + Owner: Neutral + Location: 17,27 + Actor1316: t07 + Owner: Neutral + Location: 27,81 + Actor1317: t01 + Owner: Neutral + Location: 10,0 + Actor1318: t17 + Owner: Neutral + Location: 86,66 + Actor1319: t06 + Owner: Neutral + Location: 8,8 + Actor1320: t07 + Owner: Neutral + Location: 6,40 + Actor1321: t05 + Owner: Neutral + Location: 40,67 + Actor1322: t08 + Owner: Neutral + Location: 13,60 + Actor1323: t08 + Owner: Neutral + Location: 47,82 + Actor1324: t05 + Owner: Neutral + Location: 59,55 + Actor1325: t07 + Owner: Neutral + Location: 45,68 + Actor1326: t07 + Owner: Neutral + Location: 19,43 + Actor1327: t05 + Owner: Neutral + Location: 50,79 + Actor1328: t12 + Owner: Neutral + Location: 8,12 + Actor1331: t17 + Owner: Neutral + Location: 91,55 + Actor1332: t05.husk + Owner: Neutral + Location: 77,57 + Actor1333: t08 + Owner: Neutral + Location: 44,63 + Actor1334: t07 + Owner: Neutral + Location: 28,85 + Actor1335: t12 + Owner: Neutral + Location: 3,82 + Actor1337: t05 + Owner: Neutral + Location: 1,16 + Actor1339: t13 + Owner: Neutral + Location: 53,50 + Actor1340: t07 + Owner: Neutral + Location: 44,41 + Actor1342: t08 + Owner: Neutral + Location: 28,74 + Actor1343: t16 + Owner: Neutral + Location: 49,79 + Actor1346: t07 + Owner: Neutral + Location: 2,14 + Actor1347: t02 + Owner: Neutral + Location: 3,49 + Actor1348: t12.husk + Owner: Neutral + Location: 28,82 + Actor1349: t07 + Owner: Neutral + Location: 39,79 + Actor1351: t05 + Owner: Neutral + Location: 7,1 + Actor1352: t05.husk + Owner: Neutral + Location: 47,70 + Actor1353: t03 + Owner: Neutral + Location: 84,38 + Actor1354: t01 + Owner: Neutral + Location: 50,80 + Actor1356: t01 + Owner: Neutral + Location: 38,67 + Actor1357: t08 + Owner: Neutral + Location: 23,82 + Actor1358: t08 + Owner: Neutral + Location: 36,13 + Actor1359: t07 + Owner: Neutral + Location: 54,10 + Actor1360: t17 + Owner: Neutral + Location: 87,64 + Actor1361: t05 + Owner: Neutral + Location: 88,2 + Actor1362: t01 + Owner: Neutral + Location: 50,70 + Actor1363: t01 + Owner: Neutral + Location: 3,4 + Actor1364: t16 + Owner: Neutral + Location: 40,49 + Actor1365: t07 + Owner: Neutral + Location: 58,42 + Actor1367: t07 + Owner: Neutral + Location: 8,69 + Actor1368: t12 + Owner: Neutral + Location: 6,62 + Actor1369: t16 + Owner: Neutral + Location: 32,25 + Actor1370: t03 + Owner: Neutral + Location: 39,48 + Actor1371: t17 + Owner: Neutral + Location: 29,4 + Actor1372: t05 + Owner: Neutral + Location: 38,46 + Actor1373: t06 + Owner: Neutral + Location: 71,12 + Actor1374: t08 + Owner: Neutral + Location: 62,56 + Actor1375: t08 + Owner: Neutral + Location: 58,47 + Actor1376: t02.husk + Owner: Neutral + Location: 41,68 + Actor1377: t17 + Owner: Neutral + Location: 45,65 + Actor1379: t16 + Owner: Neutral + Location: 1,84 + Actor1381: t02 + Owner: Neutral + Location: 86,46 + Actor1383: t03 + Owner: Neutral + Location: 39,21 + Actor1385: t06 + Owner: Neutral + Location: 85,68 + Actor1386: t08.husk + Owner: Neutral + Location: 38,51 + Actor1387: t08 + Owner: Neutral + Location: 2,18 + Actor1388: t17 + Owner: Neutral + Location: 20,17 + Actor1389: t13 + Owner: Neutral + Location: 26,76 + Actor1390: t02.husk + Owner: Neutral + Location: 76,15 + Actor1391: t06 + Owner: Neutral + Location: 0,45 + Actor1392: t08 + Owner: Neutral + Location: 8,12 + Actor1393: t01 + Owner: Neutral + Location: 13,7 + Actor1394: t01 + Owner: Neutral + Location: 46,66 + Actor1395: t02 + Owner: Neutral + Location: 15,49 + Actor1396: t06.husk + Owner: Neutral + Location: 42,82 + Actor1397: t06 + Owner: Neutral + Location: 14,10 + Actor1398: t12 + Owner: Neutral + Location: 90,3 + Actor1399: t16 + Owner: Neutral + Location: 2,16 + Actor1400: t17 + Owner: Neutral + Location: 58,12 + Actor1402: t12.husk + Owner: Neutral + Location: 4,1 + Actor1403: t13 + Owner: Neutral + Location: 16,26 + Actor1404: t12 + Owner: Neutral + Location: 43,59 + Actor1405: t03 + Owner: Neutral + Location: 91,64 + Actor1406: t01 + Owner: Neutral + Location: 60,53 + Actor1408: t01 + Owner: Neutral + Location: 96,45 + Actor1409: t03 + Owner: Neutral + Location: 16,54 + Actor1410: t05 + Owner: Neutral + Location: 53,48 + Actor1412: t05.husk + Owner: Neutral + Location: 77,44 + Actor1413: t02 + Owner: Neutral + Location: 17,62 + Actor1414: t12 + Owner: Neutral + Location: 89,61 + Actor1415: t03 + Owner: Neutral + Location: 77,52 + Actor1416: t07 + Owner: Neutral + Location: 0,10 + Actor1417: t03 + Owner: Neutral + Location: 25,79 + Actor1418: t03 + Owner: Neutral + Location: 42,43 + Actor1419: t02 + Owner: Neutral + Location: 79,0 + Actor1423: t13 + Owner: Neutral + Location: 58,75 + Actor1425: t02 + Owner: Neutral + Location: 1,8 + Actor1426: t13 + Owner: Neutral + Location: 45,62 + Actor1427: t06 + Owner: Neutral + Location: 77,47 + Actor1428: t17.husk + Owner: Neutral + Location: 38,51 + Actor1429: t05 + Owner: Neutral + Location: 76,17 + Actor1430: t05 + Owner: Neutral + Location: 44,47 + Actor1431: t16 + Owner: Neutral + Location: 22,86 + Actor1433: t03 + Owner: Neutral + Location: 12,57 + Actor1436: t13 + Owner: Neutral + Location: 55,50 + Actor1437: t07 + Owner: Neutral + Location: 13,58 + Actor1438: t07 + Owner: Neutral + Location: 86,35 + Actor1439: t12 + Owner: Neutral + Location: 42,34 + Actor1440: t16 + Owner: Neutral + Location: 57,10 + Actor1441: t16 + Owner: Neutral + Location: 62,68 + Actor1442: t03 + Owner: Neutral + Location: 79,2 + Actor1443: t08 + Owner: Neutral + Location: 56,45 + Actor1444: t08 + Owner: Neutral + Location: 15,14 + Actor1446: t06.husk + Owner: Neutral + Location: 78,45 + Actor1447: t03 + Owner: Neutral + Location: 9,10 + Actor1449: t08 + Owner: Neutral + Location: 70,5 + Actor1450: t17 + Owner: Neutral + Location: 1,43 + Actor1451: t02 + Owner: Neutral + Location: 58,48 + Actor1452: t13 + Owner: Neutral + Location: 62,76 + Actor1454: t06 + Owner: Neutral + Location: 62,71 + Actor1455: t05 + Owner: Neutral + Location: 60,11 + Actor1456: t01 + Owner: Neutral + Location: 47,26 + Actor1457: t05 + Owner: Neutral + Location: 64,66 + Actor1458: t05 + Owner: Neutral + Location: 5,44 + Actor1459: t08 + Owner: Neutral + Location: 96,29 + Actor1460: t07 + Owner: Neutral + Location: 57,42 + Actor1461: t13 + Owner: Neutral + Location: 83,29 + Actor1462: t08 + Owner: Neutral + Location: 10,3 + Actor1463: t17 + Owner: Neutral + Location: 2,2 + Actor1466: t05 + Owner: Neutral + Location: 89,67 + Actor1467: t13.husk + Owner: Neutral + Location: 87,46 + Actor1468: t08 + Owner: Neutral + Location: 75,28 + Actor1469: t05 + Owner: Neutral + Location: 95,27 + Actor1470: t02 + Owner: Neutral + Location: 5,42 + Actor1471: t05 + Owner: Neutral + Location: 32,79 + Actor1472: t03 + Owner: Neutral + Location: 51,54 + Actor1473: t12 + Owner: Neutral + Location: 42,60 + Actor1474: t07 + Owner: Neutral + Location: 76,56 + Actor1475: t16 + Owner: Neutral + Location: 56,45 + Actor1476: t02 + Owner: Neutral + Location: 97,27 + Actor1477: t07 + Owner: Neutral + Location: 2,78 + Actor1478: t05 + Owner: Neutral + Location: 8,42 + Actor1479: t08 + Owner: Neutral + Location: 1,19 + Actor1480: t12 + Owner: Neutral + Location: 61,45 + Actor1481: t02 + Owner: Neutral + Location: 15,19 + Actor1483: t12 + Owner: Neutral + Location: 49,53 + Actor1484: t02 + Owner: Neutral + Location: 20,64 + Actor1485: t02 + Owner: Neutral + Location: 96,71 + Actor1486: t13 + Owner: Neutral + Location: 85,52 + Actor1487: t03 + Owner: Neutral + Location: 84,40 + Actor1489: t16 + Owner: Neutral + Location: 83,51 + Actor1490: t07 + Owner: Neutral + Location: 11,8 + Actor1491: t02.husk + Owner: Neutral + Location: 39,72 + Actor1492: t02 + Owner: Neutral + Location: 18,56 + Actor1493: t08 + Owner: Neutral + Location: 6,2 + Actor1494: t02 + Owner: Neutral + Location: 41,49 + Actor1495: t13 + Owner: Neutral + Location: 60,71 + Actor1496: t13 + Owner: Neutral + Location: 25,83 + Actor1497: t12 + Owner: Neutral + Location: 75,57 + Actor1498: t13 + Owner: Neutral + Location: 60,37 + Actor1499: t16 + Owner: Neutral + Location: 24,63 + Actor1500: t07 + Owner: Neutral + Location: 39,67 + Actor1501: t13.husk + Owner: Neutral + Location: 54,48 + Actor1502: t03 + Owner: Neutral + Location: 8,9 + Actor1505: t05 + Owner: Neutral + Location: 24,85 + Actor1507: t13 + Owner: Neutral + Location: 19,62 + Actor1508: t12 + Owner: Neutral + Location: 39,46 + Actor1509: t07 + Owner: Neutral + Location: 50,81 + Actor1510: t03 + Owner: Neutral + Location: 58,41 + Actor1511: t17 + Owner: Neutral + Location: 22,39 + Actor1512: t02 + Owner: Neutral + Location: 1,54 + Actor1513: t01 + Owner: Neutral + Location: 25,85 + Actor1514: t05 + Owner: Neutral + Location: 12,54 + Actor1515: t01 + Owner: Neutral + Location: 55,9 + Actor1516: t08 + Owner: Neutral + Location: 16,79 + Actor1518: t17 + Owner: Neutral + Location: 61,39 + Actor1519: t07 + Owner: Neutral + Location: 52,81 + Actor1521: t17 + Owner: Neutral + Location: 95,39 + Actor1522: t05 + Owner: Neutral + Location: 12,37 + Actor1523: t08 + Owner: Neutral + Location: 93,35 + Actor1526: t12 + Owner: Neutral + Location: 56,34 + Actor1527: t16 + Owner: Neutral + Location: 89,72 + Actor1530: t06 + Owner: Neutral + Location: 64,14 + Actor1531: t06 + Owner: Neutral + Location: 1,38 + Actor1533: t06.husk + Owner: Neutral + Location: 11,55 + Actor1534: t06 + Owner: Neutral + Location: 8,91 + Actor1535: t08 + Owner: Neutral + Location: 29,84 + Actor1536: t03.husk + Owner: Neutral + Location: 14,31 + Actor1539: t06 + Owner: Neutral + Location: 95,41 + Actor1540: t17 + Owner: Neutral + Location: 1,7 + Actor1541: t16 + Owner: Neutral + Location: 33,25 + Actor1542: t02 + Owner: Neutral + Location: 18,57 + Actor1544: t02 + Owner: Neutral + Location: 56,10 + Actor1545: t03 + Owner: Neutral + Location: 87,71 + Actor1546: t17.husk + Owner: Neutral + Location: 84,54 + Actor1547: t13 + Owner: Neutral + Location: 43,45 + Actor1548: t06 + Owner: Neutral + Location: 60,47 + Actor1549: t01 + Owner: Neutral + Location: 25,76 + Actor1551: t03 + Owner: Neutral + Location: 61,46 + Actor1552: t01.husk + Owner: Neutral + Location: 2,79 + Actor1553: t12 + Owner: Neutral + Location: 52,36 + Actor1555: t17 + Owner: Neutral + Location: 9,79 + Actor1557: t02 + Owner: Neutral + Location: 0,78 + Actor1558: t16 + Owner: Neutral + Location: 59,10 + Actor1559: t17 + Owner: Neutral + Location: 61,55 + Actor1560: t17 + Owner: Neutral + Location: 77,50 + Actor1562: t08 + Owner: Neutral + Location: 86,48 + Actor1564: t03.husk + Owner: Neutral + Location: 65,78 + Actor1566: t12 + Owner: Neutral + Location: 17,21 + Actor1567: t13 + Owner: Neutral + Location: 86,64 + Actor1568: t05.husk + Owner: Neutral + Location: 62,69 + Actor1569: t05.husk + Owner: Neutral + Location: 79,46 + Actor1571: t06 + Owner: Neutral + Location: 50,49 + Actor1572: t08 + Owner: Neutral + Location: 96,28 + Actor1573: t13 + Owner: Neutral + Location: 2,38 + Actor1574: t13 + Owner: Neutral + Location: 94,40 + Actor1575: t16.husk + Owner: Neutral + Location: 53,55 + Actor1577: t12.husk + Owner: Neutral + Location: 4,46 + Actor1579: t13 + Owner: Neutral + Location: 96,56 + Actor1580: t06.husk + Owner: Neutral + Location: 77,53 + Actor1582: t05 + Owner: Neutral + Location: 45,25 + Actor1584: t17 + Owner: Neutral + Location: 87,62 + Actor1585: t06 + Owner: Neutral + Location: 55,32 + Actor1586: t06 + Owner: Neutral + Location: 13,26 + Actor1587: t08 + Owner: Neutral + Location: 57,41 + Actor1589: t17 + Owner: Neutral + Location: 25,84 + Actor1590: t13 + Owner: Neutral + Location: 57,8 + Actor1591: t12 + Owner: Neutral + Location: 89,71 + Actor1592: t13 + Owner: Neutral + Location: 29,73 + Actor1593: t12 + Owner: Neutral + Location: 15,55 + Actor1594: t07 + Owner: Neutral + Location: 49,24 + Actor1596: t02 + Owner: Neutral + Location: 81,37 + Actor1601: t03 + Owner: Neutral + Location: 43,65 + Actor1602: t13 + Owner: Neutral + Location: 8,87 + Actor1604: t12 + Owner: Neutral + Location: 0,4 + Actor1605: t01 + Owner: Neutral + Location: 12,8 + Actor1606: t03 + Owner: Neutral + Location: 61,72 + Actor1607: t16 + Owner: Neutral + Location: 6,43 + Actor1608: t16 + Owner: Neutral + Location: 17,79 + Actor1609: t13 + Owner: Neutral + Location: 78,56 + Actor1610: t05 + Owner: Neutral + Location: 3,42 + Actor1611: t17 + Owner: Neutral + Location: 54,33 + Actor1613: t13 + Owner: Neutral + Location: 27,85 + Actor1614: t03 + Owner: Neutral + Location: 39,52 + Actor1616: t08 + Owner: Neutral + Location: 53,43 + Actor1618: t06 + Owner: Neutral + Location: 86,51 + Actor1619: t02 + Owner: Neutral + Location: 74,53 + Actor1621: t03 + Owner: Neutral + Location: 43,80 + Actor1622: t13.husk + Owner: Neutral + Location: 82,18 + Actor1623: t03 + Owner: Neutral + Location: 88,66 + Actor1624: t03 + Owner: Neutral + Location: 42,84 + Actor1630: t17 + Owner: Neutral + Location: 62,64 + Actor1631: t03 + Owner: Neutral + Location: 1,50 + Actor1632: t13 + Owner: Neutral + Location: 19,64 + Actor1633: t01 + Owner: Neutral + Location: 90,64 + Actor1634: t07 + Owner: Neutral + Location: 13,34 + Actor1636: t02 + Owner: Neutral + Location: 85,66 + Actor1637: t01 + Owner: Neutral + Location: 81,13 + Actor1638: t08 + Owner: Neutral + Location: 89,4 + Actor1640: t03 + Owner: Neutral + Location: 21,62 + Actor1641: t05 + Owner: Neutral + Location: 47,63 + Actor1642: t06 + Owner: Neutral + Location: 35,14 + Actor1643: t16 + Owner: Neutral + Location: 35,11 + Actor1644: t13 + Owner: Neutral + Location: 52,35 + Actor1645: t05 + Owner: Neutral + Location: 10,76 + Actor1646: t13 + Owner: Neutral + Location: 15,56 + Actor1647: t12 + Owner: Neutral + Location: 78,43 + Actor1649: t13 + Owner: Neutral + Location: 50,71 + Actor1652: t13 + Owner: Neutral + Location: 52,43 + Actor1653: t03 + Owner: Neutral + Location: 5,41 + Actor1654: t17 + Owner: Neutral + Location: 45,43 + Actor1655: t08 + Owner: Neutral + Location: 47,72 + Actor1656: t13 + Owner: Neutral + Location: 60,67 + Actor1657: t06 + Owner: Neutral + Location: 13,60 + Actor1658: t12 + Owner: Neutral + Location: 82,22 + Actor1659: t16 + Owner: Neutral + Location: 18,64 + Actor1660: t03 + Owner: Neutral + Location: 16,76 + Actor1661: t06 + Owner: Neutral + Location: 29,79 + Actor1662: t08 + Owner: Neutral + Location: 42,47 + Actor1664: t13 + Owner: Neutral + Location: 52,56 + Actor1665: t06 + Owner: Neutral + Location: 69,14 + Actor1666: t16 + Owner: Neutral + Location: 75,18 + Actor1669: t08 + Owner: Neutral + Location: 26,74 + Actor1670: t17 + Owner: Neutral + Location: 19,55 + Actor1671: t01 + Owner: Neutral + Location: 29,74 + Actor1672: t08.husk + Owner: Neutral + Location: 88,2 + Actor1673: t07 + Owner: Neutral + Location: 44,23 + Actor1674: t13.husk + Owner: Neutral + Location: 78,0 + Actor1675: t06 + Owner: Neutral + Location: 22,41 + Actor1676: t12 + Owner: Neutral + Location: 1,80 + Actor1677: t02 + Owner: Neutral + Location: 15,37 + Actor1678: t12 + Owner: Neutral + Location: 76,18 + Actor1679: t12 + Owner: Neutral + Location: 77,43 + Actor1681: t07 + Owner: Neutral + Location: 41,62 + Actor1682: t01.husk + Owner: Neutral + Location: 52,53 + Actor1683: t07 + Owner: Neutral + Location: 48,52 + Actor1684: t03 + Owner: Neutral + Location: 14,11 + Actor1685: t05.husk + Owner: Neutral + Location: 53,11 + Actor1686: t06 + Owner: Neutral + Location: 79,12 + Actor1689: t12 + Owner: Neutral + Location: 43,72 + Actor1690: t17 + Owner: Neutral + Location: 0,80 + Actor1691: t13 + Owner: Neutral + Location: 68,66 + Actor1692: t08 + Owner: Neutral + Location: 16,12 + Actor1694: t07 + Owner: Neutral + Location: 44,81 + Actor1695: t16 + Owner: Neutral + Location: 82,52 + Actor1696: t02 + Owner: Neutral + Location: 82,34 + Actor1697: t06 + Owner: Neutral + Location: 80,56 + Actor1698: t17 + Owner: Neutral + Location: 18,27 + Actor1699: t01 + Owner: Neutral + Location: 51,31 + Actor1700: t05 + Owner: Neutral + Location: 6,90 + Actor1701: t12 + Owner: Neutral + Location: 12,82 + Actor1704: t05 + Owner: Neutral + Location: 22,21 + Actor1705: t03 + Owner: Neutral + Location: 15,79 + Actor1706: t01 + Owner: Neutral + Location: 45,67 + Actor1707: t03 + Owner: Neutral + Location: 90,66 + Actor1708: t07 + Owner: Neutral + Location: 50,55 + Actor1709: t03 + Owner: Neutral + Location: 21,17 + Actor1711: t08 + Owner: Neutral + Location: 43,36 + Actor1712: t12 + Owner: Neutral + Location: 4,48 + Actor1713: t07 + Owner: Neutral + Location: 30,10 + Actor1714: t12 + Owner: Neutral + Location: 63,66 + Actor1715: t17 + Owner: Neutral + Location: 51,51 + Actor1716: t05 + Owner: Neutral + Location: 14,66 + Actor1717: t03 + Owner: Neutral + Location: 94,71 + Actor1718: t05 + Owner: Neutral + Location: 90,68 + Actor1719: t07 + Owner: Neutral + Location: 40,53 + Actor1720: t01 + Owner: Neutral + Location: 64,78 + Actor1721: t05 + Owner: Neutral + Location: 0,77 + Actor1722: t17 + Owner: Neutral + Location: 9,2 + Actor1723: t06 + Owner: Neutral + Location: 91,58 + Actor1724: t12 + Owner: Neutral + Location: 62,67 + Actor1725: t02 + Owner: Neutral + Location: 2,46 + Actor1726: t01 + Owner: Neutral + Location: 40,62 + Actor1728: t13 + Owner: Neutral + Location: 2,11 + Actor1729: t03 + Owner: Neutral + Location: 13,81 + Actor1732: t03 + Owner: Neutral + Location: 94,1 + Actor1733: t13 + Owner: Neutral + Location: 55,55 + Actor1736: t07.husk + Owner: Neutral + Location: 10,7 + Actor1737: t17 + Owner: Neutral + Location: 2,8 + Actor1738: t08 + Owner: Neutral + Location: 21,67 + Actor1739: t17 + Owner: Neutral + Location: 46,25 + Actor1740: t05 + Owner: Neutral + Location: 15,67 + Actor1742: t13 + Owner: Neutral + Location: 92,59 + Actor1743: t03 + Owner: Neutral + Location: 81,51 + Actor1744: t13.husk + Owner: Neutral + Location: 78,12 + Actor1746: t08.husk + Owner: Neutral + Location: 13,30 + Actor1747: t01 + Owner: Neutral + Location: 29,6 + Actor1748: t07 + Owner: Neutral + Location: 36,13 + Actor1751: t13 + Owner: Neutral + Location: 14,39 + Actor1752: t07 + Owner: Neutral + Location: 14,38 + Actor1753: t07 + Owner: Neutral + Location: 15,57 + Actor1754: t03 + Owner: Neutral + Location: 6,88 + Actor1755: t03.husk + Owner: Neutral + Location: 14,83 + Actor1756: t02 + Owner: Neutral + Location: 80,57 + Actor1757: t02.husk + Owner: Neutral + Location: 51,40 + Actor1758: t02 + Owner: Neutral + Location: 23,60 + Actor1759: t13 + Owner: Neutral + Location: 46,22 + Actor1761: t06 + Owner: Neutral + Location: 8,58 + Actor1762: t08 + Owner: Neutral + Location: 7,58 + Actor1763: t12 + Owner: Neutral + Location: 52,50 + Actor1765: t17 + Owner: Neutral + Location: 45,23 + Actor1766: t17 + Owner: Neutral + Location: 87,50 + Actor1768: t06 + Owner: Neutral + Location: 16,29 + Actor1769: t12 + Owner: Neutral + Location: 51,52 + Actor1770: t07 + Owner: Neutral + Location: 51,19 + Actor1771: t03 + Owner: Neutral + Location: 86,68 + Actor1772: t17 + Owner: Neutral + Location: 14,77 + Actor1773: t05 + Owner: Neutral + Location: 6,63 + Actor1774: t07 + Owner: Neutral + Location: 3,37 + Actor1775: t12 + Owner: Neutral + Location: 0,85 + Actor1776: t03 + Owner: Neutral + Location: 91,59 + Actor1777: t07 + Owner: Neutral + Location: 81,45 + Actor1778: t06 + Owner: Neutral + Location: 39,47 + Actor1780: t03.husk + Owner: Neutral + Location: 83,50 + Actor1781: t13 + Owner: Neutral + Location: 1,53 + Actor1783: t07 + Owner: Neutral + Location: 7,0 + Actor1784: t13 + Owner: Neutral + Location: 86,39 + Actor1785: t05 + Owner: Neutral + Location: 40,60 + Actor1787: t13 + Owner: Neutral + Location: 37,47 + Actor1788: t08 + Owner: Neutral + Location: 41,23 + Actor1789: t07.husk + Owner: Neutral + Location: 80,58 + Actor1791: t16 + Owner: Neutral + Location: 58,43 + Actor1792: t08 + Owner: Neutral + Location: 28,79 + Actor1793: t01 + Owner: Neutral + Location: 89,59 + Actor1794: t17 + Owner: Neutral + Location: 25,36 + Actor1795: t07 + Owner: Neutral + Location: 23,80 + Actor1796: t07 + Owner: Neutral + Location: 13,48 + Actor1797: t01.husk + Owner: Neutral + Location: 53,41 + Actor1798: t08 + Owner: Neutral + Location: 50,39 + Actor1799: t13 + Owner: Neutral + Location: 84,53 + Actor1801: t12 + Owner: Neutral + Location: 38,69 + Actor1802: t05 + Owner: Neutral + Location: 61,74 + Actor1803: t06 + Owner: Neutral + Location: 74,52 + Actor1804: t01 + Owner: Neutral + Location: 23,83 + Actor1805: t07 + Owner: Neutral + Location: 53,33 + Actor1806: t12 + Owner: Neutral + Location: 12,10 + Actor1807: t08 + Owner: Neutral + Location: 24,38 + Actor1810: t03 + Owner: Neutral + Location: 71,39 + Actor1812: t13 + Owner: Neutral + Location: 63,78 + Actor1813: t06 + Owner: Neutral + Location: 52,34 + Actor1814: t16 + Owner: Neutral + Location: 62,38 + Actor1815: t13.husk + Owner: Neutral + Location: 40,21 + Actor1816: t08 + Owner: Neutral + Location: 54,58 + Actor1817: t16 + Owner: Neutral + Location: 85,1 + Actor1818: t03 + Owner: Neutral + Location: 46,15 + Actor1819: t07 + Owner: Neutral + Location: 11,64 + Actor1821: t01 + Owner: Neutral + Location: 79,22 + Actor1822: t01 + Owner: Neutral + Location: 1,39 + Actor1824: t06 + Owner: Neutral + Location: 11,9 + Actor1826: t06 + Owner: Neutral + Location: 9,88 + Actor1828: t17 + Owner: Neutral + Location: 43,82 + Actor1829: t13 + Owner: Neutral + Location: 19,28 + Actor1830: t07 + Owner: Neutral + Location: 1,76 + Actor1831: t02.husk + Owner: Neutral + Location: 1,51 + Actor1833: t13 + Owner: Neutral + Location: 29,2 + Actor1834: t16 + Owner: Neutral + Location: 2,82 + Actor1835: t01 + Owner: Neutral + Location: 29,65 + Actor1836: t02 + Owner: Neutral + Location: 95,63 + Actor1837: t12.husk + Owner: Neutral + Location: 2,5 + Actor1838: t02 + Owner: Neutral + Location: 61,49 + Actor1839: t08 + Owner: Neutral + Location: 80,18 + Actor1842: t12 + Owner: Neutral + Location: 16,79 + Actor1843: t12 + Owner: Neutral + Location: 79,45 + Actor1844: t07 + Owner: Neutral + Location: 61,50 + Actor1848: t08.husk + Owner: Neutral + Location: 54,37 + Actor1851: t16 + Owner: Neutral + Location: 24,82 + Actor1852: t16 + Owner: Neutral + Location: 81,48 + Actor1853: t13 + Owner: Neutral + Location: 86,41 + Actor1856: t01 + Owner: Neutral + Location: 7,69 + Actor1858: t08 + Owner: Neutral + Location: 23,63 + Actor1859: t12 + Owner: Neutral + Location: 12,58 + Actor1860: t12 + Owner: Neutral + Location: 38,80 + Actor1861: t17 + Owner: Neutral + Location: 42,71 + Actor1862: t16 + Owner: Neutral + Location: 77,55 + Actor1863: t05 + Owner: Neutral + Location: 7,9 + Actor1864: t06 + Owner: Neutral + Location: 7,63 + Actor1866: t07 + Owner: Neutral + Location: 38,20 + Actor1867: t05 + Owner: Neutral + Location: 61,10 + Actor1868: t02.husk + Owner: Neutral + Location: 94,29 + Actor1870: t17 + Owner: Neutral + Location: 17,9 + Actor1871: t07 + Owner: Neutral + Location: 62,70 + Actor1873: t16 + Owner: Neutral + Location: 93,53 + Actor1874: t03 + Owner: Neutral + Location: 82,58 + Actor1875: t05 + Owner: Neutral + Location: 27,1 + Actor1876: t03 + Owner: Neutral + Location: 16,19 + Actor1877: t17.husk + Owner: Neutral + Location: 76,27 + Actor1878: t13 + Owner: Neutral + Location: 54,32 + Actor1880: t17.husk + Owner: Neutral + Location: 57,43 + Actor1881: t05 + Owner: Neutral + Location: 46,26 + Actor1882: t16 + Owner: Neutral + Location: 46,65 + Actor1884: t01 + Owner: Neutral + Location: 17,63 + Actor1885: t06 + Owner: Neutral + Location: 15,96 + Actor1886: t08 + Owner: Neutral + Location: 50,33 + Actor1887: t07 + Owner: Neutral + Location: 39,51 + Actor1888: t12 + Owner: Neutral + Location: 72,38 + Actor1890: t01 + Owner: Neutral + Location: 70,14 + Actor1891: t16.husk + Owner: Neutral + Location: 88,63 + Actor1892: t16 + Owner: Neutral + Location: 96,65 + Actor1893: t01 + Owner: Neutral + Location: 2,83 + Actor1894: t03 + Owner: Neutral + Location: 47,67 + Actor1895: t13.husk + Owner: Neutral + Location: 8,79 + Actor1896: t12 + Owner: Neutral + Location: 4,45 + Actor1898: t17 + Owner: Neutral + Location: 49,72 + Actor1900: t03 + Owner: Neutral + Location: 89,60 + Actor1901: t05 + Owner: Neutral + Location: 48,16 + Actor1904: t12 + Owner: Neutral + Location: 1,78 + Actor1905: t06 + Owner: Neutral + Location: 84,56 + Actor1906: t12 + Owner: Neutral + Location: 87,45 + Actor1907: t16 + Owner: Neutral + Location: 85,39 + Actor1908: t05 + Owner: Neutral + Location: 45,61 + Actor1909: t06.husk + Owner: Neutral + Location: 17,56 + Actor1910: t12 + Owner: Neutral + Location: 55,10 + Actor1911: t16 + Owner: Neutral + Location: 49,55 + Actor1912: t13 + Owner: Neutral + Location: 44,46 + Actor1913: t05 + Owner: Neutral + Location: 60,38 + Actor1914: t13.husk + Owner: Neutral + Location: 15,80 + Actor1915: t16 + Owner: Neutral + Location: 77,15 + Actor1916: t17 + Owner: Neutral + Location: 37,70 + Actor1917: t02 + Owner: Neutral + Location: 1,82 + Actor1918: t03 + Owner: Neutral + Location: 41,46 + Actor1921: t01 + Owner: Neutral + Location: 51,74 + Actor1922: t05 + Owner: Neutral + Location: 41,18 + Actor1926: t05 + Owner: Neutral + Location: 29,81 + Actor1927: t12 + Owner: Neutral + Location: 81,3 + Actor1928: t05 + Owner: Neutral + Location: 56,58 + Actor1931: t12.husk + Owner: Neutral + Location: 10,75 + Actor1933: t08 + Owner: Neutral + Location: 79,43 + Actor1934: t02 + Owner: Neutral + Location: 57,47 + Actor1935: t01 + Owner: Neutral + Location: 88,70 + Actor1937: t01 + Owner: Neutral + Location: 78,55 + Actor1939: t12 + Owner: Neutral + Location: 90,59 + Actor1940: t06 + Owner: Neutral + Location: 80,42 + Actor1941: t13.husk + Owner: Neutral + Location: 7,11 + Actor1943: t06 + Owner: Neutral + Location: 14,60 + Actor1944: t13 + Owner: Neutral + Location: 18,33 + Actor1945: t07 + Owner: Neutral + Location: 11,69 + Actor1946: t06 + Owner: Neutral + Location: 76,51 + Actor1947: t12 + Owner: Neutral + Location: 96,7 + Actor1948: t03 + Owner: Neutral + Location: 36,70 + Actor1949: t17 + Owner: Neutral + Location: 20,57 + Actor1950: t05 + Owner: Neutral + Location: 18,75 + Actor1951: t16 + Owner: Neutral + Location: 39,43 + Actor1952: t06 + Owner: Neutral + Location: 59,75 + Actor1953: t05 + Owner: Neutral + Location: 13,49 + Actor1954: t13 + Owner: Neutral + Location: 23,22 + Actor1955: t12 + Owner: Neutral + Location: 43,66 + Actor1956: t02 + Owner: Neutral + Location: 30,7 + Actor1958: t16 + Owner: Neutral + Location: 59,72 + Actor1959: t16 + Owner: Neutral + Location: 51,35 + Actor1960: t13 + Owner: Neutral + Location: 9,80 + Actor1961: t08 + Owner: Neutral + Location: 44,22 + Actor1962: t12 + Owner: Neutral + Location: 8,77 + Actor1963: t05 + Owner: Neutral + Location: 20,27 + Actor1964: t03 + Owner: Neutral + Location: 38,59 + Actor1966: t01 + Owner: Neutral + Location: 13,38 + Actor1967: t05.husk + Owner: Neutral + Location: 23,37 + Actor1968: t12 + Owner: Neutral + Location: 41,78 + Actor1969: t07.husk + Owner: Neutral + Location: 9,90 + Actor1970: t01 + Owner: Neutral + Location: 81,50 + Actor1972: t17 + Owner: Neutral + Location: 54,54 + Actor1974: t03 + Owner: Neutral + Location: 1,81 + Actor1977: t08 + Owner: Neutral + Location: 67,63 + Actor1979: t01 + Owner: Neutral + Location: 49,49 + Actor1980: t03 + Owner: Neutral + Location: 53,38 + Actor1981: t07 + Owner: Neutral + Location: 42,70 + Actor1982: t08 + Owner: Neutral + Location: 46,24 + Actor1983: t05 + Owner: Neutral + Location: 43,69 + Actor1984: t12 + Owner: Neutral + Location: 92,61 + Actor1985: t07 + Owner: Neutral + Location: 38,60 + Actor1986: t08 + Owner: Neutral + Location: 19,66 + Actor1987: t05 + Owner: Neutral + Location: 27,82 + Actor1988: t16 + Owner: Neutral + Location: 84,29 + Actor1989: t05 + Owner: Neutral + Location: 83,4 + Actor1991: t16 + Owner: Neutral + Location: 29,3 + Actor1992: t06 + Owner: Neutral + Location: 77,16 + Actor1996: t01 + Owner: Neutral + Location: 0,15 + Actor1997: t07 + Owner: Neutral + Location: 28,3 + Actor1998: t06.husk + Owner: Neutral + Location: 14,57 + Actor1999: t02 + Owner: Neutral + Location: 41,21 + Actor2000: t06 + Owner: Neutral + Location: 0,6 + Actor2001: t05 + Owner: Neutral + Location: 54,37 + Actor2002: t03 + Owner: Neutral + Location: 86,69 + Actor2004: t13 + Owner: Neutral + Location: 50,72 + Actor2005: t02 + Owner: Neutral + Location: 26,86 + Actor2006: t03 + Owner: Neutral + Location: 35,13 + Actor2007: t06 + Owner: Neutral + Location: 64,37 + Actor2008: t06 + Owner: Neutral + Location: 77,18 + Actor2009: t02 + Owner: Neutral + Location: 14,51 + Actor2010: t01.husk + Owner: Neutral + Location: 93,50 + Actor2011: t08.husk + Owner: Neutral + Location: 95,39 + Actor2012: t17 + Owner: Neutral + Location: 43,78 + Actor2013: t05 + Owner: Neutral + Location: 78,46 + Actor2014: t13 + Owner: Neutral + Location: 2,3 + Actor2015: t08 + Owner: Neutral + Location: 84,50 + Actor2016: t17 + Owner: Neutral + Location: 53,51 + Actor2017: t13 + Owner: Neutral + Location: 60,69 + Actor2020: t06 + Owner: Neutral + Location: 65,65 + Actor2021: t13 + Owner: Neutral + Location: 50,48 + Actor2022: t17 + Owner: Neutral + Location: 40,46 + Actor2024: t13 + Owner: Neutral + Location: 79,57 + Actor2025: t13 + Owner: Neutral + Location: 85,69 + Actor2026: t12 + Owner: Neutral + Location: 50,36 + Actor2027: t16 + Owner: Neutral + Location: 53,32 + Actor2028: t01 + Owner: Neutral + Location: 74,19 + Actor2029: t03 + Owner: Neutral + Location: 81,26 + Actor2032: t03 + Owner: Neutral + Location: 28,74 + Actor2033: t06 + Owner: Neutral + Location: 56,55 + Actor2034: t13 + Owner: Neutral + Location: 81,16 + Actor2035: t12 + Owner: Neutral + Location: 18,67 + Actor2036: t17.husk + Owner: Neutral + Location: 35,69 + Actor2037: t06 + Owner: Neutral + Location: 38,65 + Actor2038: t13 + Owner: Neutral + Location: 48,73 + Actor2039: t16 + Owner: Neutral + Location: 12,63 + Actor2040: t13 + Owner: Neutral + Location: 81,52 + Actor2041: t17.husk + Owner: Neutral + Location: 87,47 + Actor2042: t01 + Owner: Neutral + Location: 7,90 + Actor2043: t13 + Owner: Neutral + Location: 42,67 + Actor2044: t16.husk + Owner: Neutral + Location: 52,37 + Actor2046: t07 + Owner: Neutral + Location: 25,80 + Actor2047: t06 + Owner: Neutral + Location: 84,1 + Actor2048: t06 + Owner: Neutral + Location: 17,64 + Actor2049: t02 + Owner: Neutral + Location: 46,24 + Actor2051: t16 + Owner: Neutral + Location: 55,59 + Actor2053: t07 + Owner: Neutral + Location: 95,66 + Actor2054: t02 + Owner: Neutral + Location: 20,42 + Actor2055: t03 + Owner: Neutral + Location: 79,17 + Actor2056: t02 + Owner: Neutral + Location: 14,32 + Actor2057: t12.husk + Owner: Neutral + Location: 53,39 + Actor2058: t06.husk + Owner: Neutral + Location: 7,89 + Actor2059: t03 + Owner: Neutral + Location: 16,12 + Actor2060: t17 + Owner: Neutral + Location: 50,52 + Actor2061: t02 + Owner: Neutral + Location: 91,61 + Actor2062: t12.husk + Owner: Neutral + Location: 47,21 + Actor2064: t13 + Owner: Neutral + Location: 5,43 + Actor2065: t07 + Owner: Neutral + Location: 39,62 + Actor2068: t06 + Owner: Neutral + Location: 1,5 + Actor2069: t17 + Owner: Neutral + Location: 40,81 + Actor2070: t05 + Owner: Neutral + Location: 12,9 + Actor2071: t08 + Owner: Neutral + Location: 83,38 + Actor2072: t02 + Owner: Neutral + Location: 37,68 + Actor2073: t17.husk + Owner: Neutral + Location: 15,64 + Actor2074: t13.husk + Owner: Neutral + Location: 41,59 + Actor2075: t01 + Owner: Neutral + Location: 92,53 + Actor2076: t03 + Owner: Neutral + Location: 33,24 + Actor2077: t03.husk + Owner: Neutral + Location: 37,64 + Actor2078: t05.husk + Owner: Neutral + Location: 20,61 + Actor2079: t16 + Owner: Neutral + Location: 81,29 + Actor2080: t07 + Owner: Neutral + Location: 75,24 + Actor2081: t08 + Owner: Neutral + Location: 79,22 + Actor2082: t06 + Owner: Neutral + Location: 59,76 + Actor2084: t13 + Owner: Neutral + Location: 0,43 + Actor2085: t12 + Owner: Neutral + Location: 70,11 + Actor2086: t06 + Owner: Neutral + Location: 73,51 + Actor2087: t05.husk + Owner: Neutral + Location: 0,86 + Actor2089: t05 + Owner: Neutral + Location: 67,34 + Actor2090: t03 + Owner: Neutral + Location: 13,32 + Actor2091: t13 + Owner: Neutral + Location: 16,66 + Actor2092: t08 + Owner: Neutral + Location: 53,44 + Actor2093: t06 + Owner: Neutral + Location: 32,80 + Actor2094: t12.husk + Owner: Neutral + Location: 49,21 + Actor2095: t13 + Owner: Neutral + Location: 19,27 + Actor2096: t12 + Owner: Neutral + Location: 90,2 + Actor2097: t01 + Owner: Neutral + Location: 75,26 + Actor2098: t17.husk + Owner: Neutral + Location: 9,78 + Actor2099: t12 + Owner: Neutral + Location: 34,69 + Actor2100: t08 + Owner: Neutral + Location: 59,48 + Actor2101: t06 + Owner: Neutral + Location: 92,62 + Actor2102: t16 + Owner: Neutral + Location: 93,2 + Actor2103: t06 + Owner: Neutral + Location: 75,23 + Actor2104: t08 + Owner: Neutral + Location: 27,5 + Actor2105: t01 + Owner: Neutral + Location: 13,57 + Actor2106: t05 + Owner: Neutral + Location: 44,83 + Actor2107: t01 + Owner: Neutral + Location: 7,44 + Actor2108: t02 + Owner: Neutral + Location: 50,26 + Actor2109: t02 + Owner: Neutral + Location: 10,10 + Actor2110: t08 + Owner: Neutral + Location: 86,12 + Actor2111: t03 + Owner: Neutral + Location: 10,8 + Actor2112: t03 + Owner: Neutral + Location: 4,41 + Actor2113: t02 + Owner: Neutral + Location: 44,66 + Actor2114: t12.husk + Owner: Neutral + Location: 47,69 + Actor2117: t02.husk + Owner: Neutral + Location: 77,23 + Actor2118: t03 + Owner: Neutral + Location: 49,36 + Actor2119: t13 + Owner: Neutral + Location: 90,62 + Actor2121: t08 + Owner: Neutral + Location: 60,40 + Actor2122: t02 + Owner: Neutral + Location: 0,7 + Actor2123: t08 + Owner: Neutral + Location: 66,79 + Actor2125: t05 + Owner: Neutral + Location: 28,75 + Actor2126: t16 + Owner: Neutral + Location: 18,30 + Actor2127: t02 + Owner: Neutral + Location: 84,0 + Actor2128: t12 + Owner: Neutral + Location: 42,21 + Actor2129: t17 + Owner: Neutral + Location: 22,62 + Actor2130: t16 + Owner: Neutral + Location: 18,31 + Actor2132: t07 + Owner: Neutral + Location: 1,15 + Actor2133: t03 + Owner: Neutral + Location: 0,16 + Actor2134: t01 + Owner: Neutral + Location: 44,25 + Actor2135: t13 + Owner: Neutral + Location: 82,54 + Actor2136: t03 + Owner: Neutral + Location: 57,54 + Actor2137: t08 + Owner: Neutral + Location: 78,23 + Actor2140: t05 + Owner: Neutral + Location: 14,1 + Actor2141: t02.husk + Owner: Neutral + Location: 65,64 + Actor2142: t06.husk + Owner: Neutral + Location: 31,76 + Actor2143: t08 + Owner: Neutral + Location: 9,9 + Actor2144: t16 + Owner: Neutral + Location: 42,47 + Actor2145: t17 + Owner: Neutral + Location: 85,70 + Actor2146: t16 + Owner: Neutral + Location: 43,64 + Actor2147: t12 + Owner: Neutral + Location: 44,45 + Actor2148: t01 + Owner: Neutral + Location: 78,18 + Actor2149: t08 + Owner: Neutral + Location: 5,46 + Actor2150: t06 + Owner: Neutral + Location: 83,34 + Actor2152: t08 + Owner: Neutral + Location: 16,10 + Actor2155: t05 + Owner: Neutral + Location: 61,6 + Actor2156: t02 + Owner: Neutral + Location: 1,14 + Actor2157: t13 + Owner: Neutral + Location: 3,39 + Actor2158: t01 + Owner: Neutral + Location: 77,19 + Actor2159: t12 + Owner: Neutral + Location: 37,40 + Actor2160: t07 + Owner: Neutral + Location: 50,47 + Actor2161: t13 + Owner: Neutral + Location: 32,75 + Actor2163: t16 + Owner: Neutral + Location: 29,9 + Actor2164: t12 + Owner: Neutral + Location: 57,31 + Actor2165: t08 + Owner: Neutral + Location: 46,80 + Actor2166: t17.husk + Owner: Neutral + Location: 88,62 + Actor2168: t16 + Owner: Neutral + Location: 2,18 + Actor2169: t03 + Owner: Neutral + Location: 12,36 + Actor2170: t12 + Owner: Neutral + Location: 53,57 + Actor2171: t07 + Owner: Neutral + Location: 72,52 + Actor2172: t13 + Owner: Neutral + Location: 79,41 + Actor2173: t07 + Owner: Neutral + Location: 75,53 + Actor2174: t12 + Owner: Neutral + Location: 26,4 + Actor2176: t16 + Owner: Neutral + Location: 89,64 + Actor2177: t08.husk + Owner: Neutral + Location: 83,55 + Actor2178: t06 + Owner: Neutral + Location: 11,53 + Actor2179: t05 + Owner: Neutral + Location: 57,38 + Actor2180: t05 + Owner: Neutral + Location: 84,2 + Actor2182: t12 + Owner: Neutral + Location: 11,59 + Actor2184: t07 + Owner: Neutral + Location: 37,71 + Actor2185: t08 + Owner: Neutral + Location: 22,84 + Actor2186: t16 + Owner: Neutral + Location: 50,33 + Actor2188: t01 + Owner: Neutral + Location: 1,77 + Actor2189: t08 + Owner: Neutral + Location: 13,38 + Actor2190: t01 + Owner: Neutral + Location: 24,60 + Actor2191: t08.husk + Owner: Neutral + Location: 2,11 + Actor2192: t07 + Owner: Neutral + Location: 21,86 + Actor2193: t17.husk + Owner: Neutral + Location: 7,41 + Actor2194: t17 + Owner: Neutral + Location: 15,77 + Actor2195: t12 + Owner: Neutral + Location: 59,45 + Actor2196: t01 + Owner: Neutral + Location: 8,57 + Actor2198: t08 + Owner: Neutral + Location: 68,6 + Actor2199: t16 + Owner: Neutral + Location: 37,65 + Actor2200: t07 + Owner: Neutral + Location: 41,61 + Actor2201: t07 + Owner: Neutral + Location: 6,44 + Actor2202: t02 + Owner: Neutral + Location: 2,15 + Actor2203: t05 + Owner: Neutral + Location: 8,15 + Actor2204: t03 + Owner: Neutral + Location: 48,24 + Actor2205: t16 + Owner: Neutral + Location: 44,73 + Actor2206: t02 + Owner: Neutral + Location: 40,51 + Actor2207: t08 + Owner: Neutral + Location: 11,2 + Actor2208: t12.husk + Owner: Neutral + Location: 57,9 + Actor2209: t16 + Owner: Neutral + Location: 83,57 + Actor2210: t07 + Owner: Neutral + Location: 13,53 + Actor2211: t02 + Owner: Neutral + Location: 18,77 + Actor2212: t13 + Owner: Neutral + Location: 46,63 + Actor2214: t03 + Owner: Neutral + Location: 20,66 + Actor2216: t08 + Owner: Neutral + Location: 87,37 + Actor2217: t01 + Owner: Neutral + Location: 49,33 + Actor2219: t03 + Owner: Neutral + Location: 29,80 + Actor2220: t17 + Owner: Neutral + Location: 10,88 + Actor2221: t03 + Owner: Neutral + Location: 13,39 + Actor2222: t03 + Owner: Neutral + Location: 51,46 + Actor2224: t06 + Owner: Neutral + Location: 48,67 + Actor2225: t12 + Owner: Neutral + Location: 86,36 + Actor2227: t06 + Owner: Neutral + Location: 52,31 + Actor2228: t08 + Owner: Neutral + Location: 31,79 + Actor2229: t01 + Owner: Neutral + Location: 0,5 + Actor2230: t13 + Owner: Neutral + Location: 58,13 + Actor2231: t05 + Owner: Neutral + Location: 89,68 + Actor2232: t17 + Owner: Neutral + Location: 95,70 + Actor2233: t05 + Owner: Neutral + Location: 14,28 + Actor2234: t16 + Owner: Neutral + Location: 81,58 + Actor2235: t12 + Owner: Neutral + Location: 58,55 + Actor2236: t03 + Owner: Neutral + Location: 73,41 + Actor2237: t02 + Owner: Neutral + Location: 20,60 + Actor2238: t08 + Owner: Neutral + Location: 15,10 + Actor2240: t08.husk + Owner: Neutral + Location: 52,33 + Actor2241: t02 + Owner: Neutral + Location: 47,62 + Actor2242: t05.husk + Owner: Neutral + Location: 41,60 + Actor2243: t05 + Owner: Neutral + Location: 29,75 + Actor2244: t02 + Owner: Neutral + Location: 74,27 + Actor2247: t01 + Owner: Neutral + Location: 32,78 + Actor2248: t16 + Owner: Neutral + Location: 54,53 + Actor2249: t17 + Owner: Neutral + Location: 14,37 + Actor2250: t17 + Owner: Neutral + Location: 0,11 + Actor2251: t17 + Owner: Neutral + Location: 43,48 + Actor2252: t03 + Owner: Neutral + Location: 30,78 + Actor2253: t02 + Owner: Neutral + Location: 12,81 + Actor2254: t13 + Owner: Neutral + Location: 3,41 + Actor2255: t06 + Owner: Neutral + Location: 15,83 + Actor2256: t06 + Owner: Neutral + Location: 21,27 + Actor2257: t17.husk + Owner: Neutral + Location: 38,79 + Actor2259: t05 + Owner: Neutral + Location: 3,2 + Actor2260: t06 + Owner: Neutral + Location: 80,38 + Actor2261: t02 + Owner: Neutral + Location: 17,78 + Actor2262: t13 + Owner: Neutral + Location: 81,22 + Actor2263: t08 + Owner: Neutral + Location: 29,6 + Actor2267: t13 + Owner: Neutral + Location: 37,52 + Actor2268: t06.husk + Owner: Neutral + Location: 13,2 + Actor2269: t05 + Owner: Neutral + Location: 22,22 + Actor2271: t16 + Owner: Neutral + Location: 91,65 + Actor2272: t02 + Owner: Neutral + Location: 15,2 + Actor2273: t05 + Owner: Neutral + Location: 28,2 + Actor2274: t12 + Owner: Neutral + Location: 57,55 + Actor2275: t08 + Owner: Neutral + Location: 48,33 + Actor2278: t13 + Owner: Neutral + Location: 78,53 + Actor2279: t12 + Owner: Neutral + Location: 10,69 + Actor2281: t03 + Owner: Neutral + Location: 85,53 + Actor2283: t08 + Owner: Neutral + Location: 11,89 + Actor2284: t05 + Owner: Neutral + Location: 0,53 + Actor2285: t08 + Owner: Neutral + Location: 23,64 + Actor2286: t06 + Owner: Neutral + Location: 15,58 + Actor2288: t16 + Owner: Neutral + Location: 12,7 + Actor2289: t01 + Owner: Neutral + Location: 14,56 + Actor2291: t03 + Owner: Neutral + Location: 25,37 + Actor2293: t06 + Owner: Neutral + Location: 44,67 + Actor2294: t16 + Owner: Neutral + Location: 31,75 + Actor2295: t06 + Owner: Neutral + Location: 45,79 + Actor2300: t01 + Owner: Neutral + Location: 6,42 + Actor2302: t05 + Owner: Neutral + Location: 40,69 + Actor2304: t13 + Owner: Neutral + Location: 76,57 + Actor2305: t03 + Owner: Neutral + Location: 47,19 + Actor2306: t12 + Owner: Neutral + Location: 18,29 + Actor2307: t17 + Owner: Neutral + Location: 46,4 + Actor2308: t05 + Owner: Neutral + Location: 26,78 + Actor2310: t02 + Owner: Neutral + Location: 82,26 + Actor2311: t13 + Owner: Neutral + Location: 52,46 + Actor2312: t02 + Owner: Neutral + Location: 44,16 + Actor2313: t12.husk + Owner: Neutral + Location: 16,80 + Actor2314: t08 + Owner: Neutral + Location: 0,15 + Actor2315: t01 + Owner: Neutral + Location: 93,51 + Actor2316: t17 + Owner: Neutral + Location: 80,41 + Actor2317: t12 + Owner: Neutral + Location: 61,65 + Actor2318: t01 + Owner: Neutral + Location: 42,50 + Actor2320: t12 + Owner: Neutral + Location: 8,43 + Actor2322: t08 + Owner: Neutral + Location: 29,83 + Actor2323: t08.husk + Owner: Neutral + Location: 12,54 + Actor2324: t02 + Owner: Neutral + Location: 57,37 + Actor2325: t08 + Owner: Neutral + Location: 0,80 + Actor2326: t03 + Owner: Neutral + Location: 78,41 + Actor2327: t08 + Owner: Neutral + Location: 47,25 + Actor2329: t06 + Owner: Neutral + Location: 76,22 + Actor2330: t16 + Owner: Neutral + Location: 70,12 + Actor2331: t08 + Owner: Neutral + Location: 1,0 + Actor2332: t02 + Owner: Neutral + Location: 0,82 + Actor2333: t05 + Owner: Neutral + Location: 82,0 + Actor2334: t08 + Owner: Neutral + Location: 94,59 + Actor2335: t08 + Owner: Neutral + Location: 11,34 + Actor2336: t02 + Owner: Neutral + Location: 60,10 + Actor2337: t06 + Owner: Neutral + Location: 12,96 + Actor2338: t16.husk + Owner: Neutral + Location: 73,52 + Actor2339: t05 + Owner: Neutral + Location: 14,76 + Actor2341: t13 + Owner: Neutral + Location: 44,68 + Actor2342: t13 + Owner: Neutral + Location: 11,28 + Actor2343: t08 + Owner: Neutral + Location: 25,5 + Actor2345: t12 + Owner: Neutral + Location: 14,13 + Actor2346: t08 + Owner: Neutral + Location: 83,48 + Actor2347: t17 + Owner: Neutral + Location: 46,68 + Actor2348: t08 + Owner: Neutral + Location: 61,8 + Actor2349: t16 + Owner: Neutral + Location: 82,20 + Actor2350: t16 + Owner: Neutral + Location: 28,77 + Actor2351: t06 + Owner: Neutral + Location: 46,70 + Actor2352: t12 + Owner: Neutral + Location: 13,28 + Actor2353: t13 + Owner: Neutral + Location: 27,76 + Actor2354: t03 + Owner: Neutral + Location: 78,47 + Actor2355: t07 + Owner: Neutral + Location: 80,46 + Actor2356: t13 + Owner: Neutral + Location: 82,47 + Actor2357: t02 + Owner: Neutral + Location: 12,11 + Actor2358: t16 + Owner: Neutral + Location: 10,60 + Actor2359: t13 + Owner: Neutral + Location: 56,40 + Actor2360: t01 + Owner: Neutral + Location: 56,39 + Actor2045: brik + Owner: Nod + Location: 66,65 + Actor2052: brik + Owner: Nod + Location: 66,64 + Actor2066: brik + Owner: Nod + Location: 67,64 + Actor2067: brik + Owner: Nod + Location: 67,65 + Actor2083: brik + Owner: Nod + Location: 66,66 + Actor2088: brik + Owner: Nod + Location: 66,67 + Actor2116: brik + Owner: Nod + Location: 65,67 + Actor2124: brik + Owner: Nod + Location: 65,68 + Actor2138: brik + Owner: Nod + Location: 64,68 + Actor2139: brik + Owner: Nod + Location: 63,68 + Actor2151: brik + Owner: Nod + Location: 63,69 + Actor2153: brik + Owner: Nod + Location: 63,70 + Actor2154: brik + Owner: Nod + Location: 63,71 + Actor2162: brik + Owner: Nod + Location: 63,72 + Actor2175: brik + Owner: Nod + Location: 63,73 + Actor2181: brik + Owner: Nod + Location: 63,74 + Actor2187: brik + Owner: Nod + Location: 64,74 + Actor2197: brik + Owner: Nod + Location: 64,75 + Actor2223: brik + Owner: Nod + Location: 64,76 + Actor2226: brik + Owner: Nod + Location: 64,77 + Actor2239: brik + Owner: Nod + Location: 65,77 + Actor2264: brik + Owner: Nod + Location: 65,76 + Actor2265: brik + Owner: Nod + Location: 68,64 + Actor2266: brik + Owner: Nod + Location: 69,64 + Actor2277: brik + Owner: Nod + Location: 70,64 + Actor2280: brik + Owner: Nod + Location: 70,65 + Actor2287: brik + Owner: Nod + Location: 69,65 + Actor2290: brik + Owner: Nod + Location: 76,64 + Actor2292: brik + Owner: Nod + Location: 76,65 + Actor2296: brik + Owner: Nod + Location: 77,65 + Actor2298: brik + Owner: Nod + Location: 77,64 + Actor2299: brik + Owner: Nod + Location: 78,64 + Actor2303: brik + Owner: Nod + Location: 80,64 + Actor2319: brik + Owner: Nod + Location: 79,64 + Actor2321: brik + Owner: Nod + Location: 81,64 + Actor2328: brik + Owner: Nod + Location: 82,64 + Actor2340: brik + Owner: Nod + Location: 83,64 + Actor2361: brik + Owner: Nod + Location: 84,64 + Actor2362: brik + Owner: Nod + Location: 84,65 + Actor2363: brik + Owner: Nod + Location: 84,66 + Actor2364: brik + Owner: Nod + Location: 84,67 + Actor2365: brik + Owner: Nod + Location: 84,68 + Actor2366: brik + Owner: Nod + Location: 84,69 + Actor2367: brik + Owner: Nod + Location: 84,70 + Actor2368: brik + Owner: Nod + Location: 84,71 + Actor2369: brik + Owner: Nod + Location: 84,72 + Actor2370: brik + Owner: Nod + Location: 85,72 + Actor2371: brik + Owner: Nod + Location: 86,72 + Actor2372: brik + Owner: Nod + Location: 86,73 + Actor2373: brik + Owner: Nod + Location: 85,73 + Actor2374: brik + Owner: Nod + Location: 75,81 + Actor2375: brik + Owner: Nod + Location: 74,81 + Actor2376: brik + Owner: Nod + Location: 74,80 + Actor2377: brik + Owner: Nod + Location: 75,80 + Actor2378: brik + Owner: Nod + Location: 76,81 + Actor2379: brik + Owner: Nod + Location: 77,81 + Actor2380: brik + Owner: Nod + Location: 78,81 + Actor2381: brik + Owner: Nod + Location: 80,81 + Actor2382: brik + Owner: Nod + Location: 79,81 + Actor2383: brik + Owner: Nod + Location: 81,81 + Actor2384: brik + Owner: Nod + Location: 81,80 + Actor2385: brik + Owner: Nod + Location: 80,80 + SubPen: spen.nod + Owner: Nod + Location: 77,84 + Obelisk2: obli + Owner: Nod + Location: 78,65 + Obelisk1: obli + Owner: Nod + Location: 68,65 + Turret2: gun.nod + Owner: Nod + Location: 76,63 + TurretFacing: 192 + Turret1: gun.nod + Owner: Nod + Location: 70,63 + TurretFacing: 192 + Actor2395: silo.td + Owner: Nod + Location: 64,69 + Actor2396: silo.td + Owner: Nod + Location: 64,71 + Actor2397: silo.td + Owner: Nod + Location: 64,73 + Actor2401: nuk2 + Owner: Nod + Location: 81,74 + Actor2403: afac + Owner: Nod + Location: 77,78 + SAM6: nsam + Owner: Nod + Location: 85,23 + SAM1: nsam + Owner: Nod + Location: 11,16 + SAM3: nsam + Owner: Nod + Location: 36,44 + SAM2: nsam + Owner: Nod + Location: 16,60 + SAM7: nsam + Owner: Nod + Location: 75,46 + SAM4: nsam + Owner: Nod + Location: 29,89 + Actor2410: tc05 + Owner: Neutral + Location: 60,20 + Actor2411: t16 + Owner: Neutral + Location: 63,21 + Actor2412: t10 + Owner: Neutral + Location: 61,23 + Actor2413: t15 + Owner: Neutral + Location: 63,22 + Actor2414: t07 + Owner: Neutral + Location: 65,25 + Actor2415: gun + Owner: Nod + Location: 86,83 + TurretFacing: 380 + Actor2416: gun + Owner: Nod + Location: 93,86 + TurretFacing: 444 + Actor2344: t13 + Owner: Neutral + Location: 0,20 + Actor2417: t05 + Owner: Neutral + Location: 1,20 + Actor2423: t08.husk + Owner: Neutral + Location: 2,21 + Actor2426: t08 + Owner: Neutral + Location: 0,22 + Actor2427: t08.husk + Owner: Neutral + Location: 1,22 + Actor2434: t08.husk + Owner: Neutral + Location: 2,22 + Actor2435: t06 + Owner: Neutral + Location: 3,21 + Actor2436: t12 + Owner: Neutral + Location: 0,22 + Actor2437: t13 + Owner: Neutral + Location: 1,22 + Actor2438: t02.husk + Owner: Neutral + Location: 2,22 + Actor2440: t03 + Owner: Neutral + Location: 0,23 + Actor2441: t02 + Owner: Neutral + Location: 1,23 + Actor2443: t17 + Owner: Neutral + Location: 0,24 + Actor2446: t13 + Owner: Neutral + Location: 0,25 + Actor2450: t02 + Owner: Neutral + Location: 0,26 + Actor2442: snip + Owner: Greece + Location: 3,26 + SubCell: 4 + Facing: 896 + Actor2458: rtnk + Owner: Greece + Location: 5,30 + Facing: 768 + Actor2459: rtnk + Owner: Greece + Location: 7,33 + Facing: 768 + NonHardMirage1: rtnk + Owner: Greece + Location: 7,37 + Facing: 642 + Actor2463: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 66,78 + Actor2464: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 73,81 + Actor2465: n1 + Owner: Nod + Facing: 384 + Location: 73,81 + SubCell: 1 + Actor2466: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 74,82 + Actor2467: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 71,83 + Actor2468: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 65,75 + Actor2469: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 57,82 + Actor2471: n1 + Owner: Nod + SubCell: 3 + Location: 75,62 + Facing: 158 + Actor2472: n1 + Owner: Nod + SubCell: 3 + Location: 74,64 + Facing: 174 + Actor2473: n1 + Owner: Nod + Location: 74,64 + SubCell: 1 + Facing: 190 + Actor2474: n1 + Owner: Nod + SubCell: 3 + Location: 72,63 + Facing: 158 + Actor2475: n1 + Owner: Nod + SubCell: 3 + Location: 68,63 + Facing: 158 + Actor2476: n1 + Owner: Nod + SubCell: 3 + Location: 79,63 + Facing: 158 + Actor2455: snip + Owner: Greece + SubCell: 4 + Location: 7,35 + Facing: 768 + Actor2461: rtnk + Owner: Greece + Location: 5,26 + Facing: 896 + Actor2477: t03 + Owner: Neutral + Location: 28,30 + Actor2478: t12 + Owner: Neutral + Location: 30,30 + PlayerStart: waypoint + Owner: Neutral + Location: 7,31 + SAM5: nsam + Owner: Nod + Location: 43,20 + Ranger1: jeep + Owner: Greece + Location: 9,29 + Facing: 896 + Ranger2: jeep + Owner: Greece + Location: 9,34 + Facing: 769 + Actor2481: ltnk + Owner: Nod + Location: 72,64 + Facing: 142 + Actor2482: ltnk + Owner: Nod + Location: 74,61 + Facing: 150 + Obelisk3: obli + Owner: Nod + Location: 69,81 + Actor2215: t07 + Owner: Neutral + Location: 75,70 + Actor2282: t02 + Owner: Neutral + Location: 74,71 + Actor2392: t08 + Owner: Neutral + Location: 75,72 + Actor2398: t06 + Owner: Neutral + Location: 75,72 + Actor2485: rep + Owner: Nod + Location: 72,69 + Actor2486: nuk2 + Owner: Nod + Location: 76,75 + Actor2488: nuk2 + Owner: Nod + Location: 80,77 + Actor2399: nuk2 + Owner: Nod + Location: 78,74 + Actor2394: nuk2 + Owner: Nod + Location: 82,70 + Actor2487: airs + Owner: Nod + Location: 77,68 + Actor2400: t13 + Owner: Neutral + Location: 94,60 + Actor2489: t03 + Owner: Neutral + Location: 94,61 + Actor2490: t11 + Owner: Neutral + Location: 93,62 + Actor2491: t10 + Owner: Neutral + Location: 93,58 + Actor2492: t15 + Owner: Neutral + Location: 95,67 + Actor2131: t07 + Owner: Neutral + Location: 96,63 + Actor2493: n1 + Owner: Nod + SubCell: 3 + Location: 18,60 + Facing: 737 + Actor2494: n1 + Owner: Nod + SubCell: 3 + Location: 22,59 + Facing: 111 + Actor2495: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 14,68 + Actor2496: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 12,66 + Actor2497: n1 + Owner: Nod + Location: 25,62 + SubCell: 3 + Facing: 666 + Actor2498: n3 + Owner: Nod + SubCell: 3 + Location: 19,61 + Facing: 713 + Actor2500: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 57,60 + Actor2501: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 48,63 + Actor2502: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 72,54 + Actor2503: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 72,49 + Actor2504: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 74,44 + Actor2505: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 87,24 + Actor2506: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 86,21 + Actor2507: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 45,20 + Actor2509: n3 + Owner: Nod + SubCell: 3 + Location: 31,90 + Facing: 384 + Actor2510: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 38,86 + Actor2511: n3 + Owner: Nod + SubCell: 3 + Location: 18,88 + Facing: 222 + Actor2513: t05 + Owner: Neutral + Location: 1,85 + Actor2514: t02 + Owner: Neutral + Location: 2,85 + Actor2515: t14 + Owner: Neutral + Location: 1,86 + Actor2516: t07 + Owner: Neutral + Location: 1,87 + Actor2517: t12 + Owner: Neutral + Location: 2,87 + Actor2518: t07 + Owner: Neutral + Location: 1,88 + Actor2519: t02 + Owner: Neutral + Location: 2,88 + Actor2520: t01 + Owner: Neutral + Location: 1,89 + Actor2521: t16 + Owner: Neutral + Location: 2,89 + Actor2522: t02.husk + Owner: Neutral + Location: 1,90 + Actor2523: t17 + Owner: Neutral + Location: 2,90 + Actor2524: t12 + Owner: Neutral + Location: 1,91 + Actor2525: t02 + Owner: Neutral + Location: 2,91 + Actor2526: t02 + Owner: Neutral + Location: 3,90 + Actor2527: tc05 + Owner: Neutral + Location: 1,94 + Actor2528: t07 + Owner: Neutral + Location: 4,94 + Actor2529: t07 + Owner: Neutral + Location: 5,94 + Actor2530: t05 + Owner: Neutral + Location: 6,94 + Actor2531: t16 + Owner: Neutral + Location: 1,95 + Actor2532: t05 + Owner: Neutral + Location: 4,95 + Actor2533: t12.husk + Owner: Neutral + Location: 5,95 + Actor2534: t08 + Owner: Neutral + Location: 6,96 + Actor2535: t06 + Owner: Neutral + Location: 9,95 + Actor2536: t03 + Owner: Neutral + Location: 10,94 + Actor2537: t17 + Owner: Neutral + Location: 11,94 + Actor2538: t08 + Owner: Neutral + Location: 12,95 + Actor2539: t17 + Owner: Neutral + Location: 10,95 + Actor2540: t16.husk + Owner: Neutral + Location: 11,95 + Actor2541: t08 + Owner: Neutral + Location: 12,96 + Actor2542: t05 + Owner: Neutral + Location: 4,93 + Actor2543: t03 + Owner: Neutral + Location: 7,93 + Actor2544: t13 + Owner: Neutral + Location: 1,56 + Actor2545: t06 + Owner: Neutral + Location: 0,57 + Actor2546: t16 + Owner: Neutral + Location: 1,57 + Actor2547: t03 + Owner: Neutral + Location: 0,58 + Actor2548: t05 + Owner: Neutral + Location: 1,58 + Actor2549: t02 + Owner: Neutral + Location: 2,58 + Actor2550: t13 + Owner: Neutral + Location: 0,59 + Actor2551: t14 + Owner: Neutral + Location: 1,59 + Actor2552: t06 + Owner: Neutral + Location: 3,59 + Actor2553: t16 + Owner: Neutral + Location: 0,60 + Actor2554: t07 + Owner: Neutral + Location: 1,60 + Actor2555: t12 + Owner: Neutral + Location: 2,60 + Actor2556: t02 + Owner: Neutral + Location: 3,60 + Actor2557: t02 + Owner: Neutral + Location: 0,61 + Actor2558: t07 + Owner: Neutral + Location: 1,61 + Actor2559: t02 + Owner: Neutral + Location: 2,61 + Actor2560: t05 + Owner: Neutral + Location: 0,62 + Actor2561: t01 + Owner: Neutral + Location: 1,62 + Actor2562: t16 + Owner: Neutral + Location: 2,62 + Actor2563: t02 + Owner: Neutral + Location: 0,63 + Actor2564: t12 + Owner: Neutral + Location: 1,63 + Actor2565: t07 + Owner: Neutral + Location: 2,63 + Actor2566: t08 + Owner: Neutral + Location: 0,65 + Actor2567: t07 + Owner: Neutral + Location: 1,64 + Actor2568: t01.husk + Owner: Neutral + Location: 2,64 + Actor2569: t17 + Owner: Neutral + Location: 0,65 + Actor2570: t12 + Owner: Neutral + Location: 1,65 + Actor2571: t17 + Owner: Neutral + Location: 2,65 + Actor2572: t01 + Owner: Neutral + Location: 0,66 + Actor2573: t03 + Owner: Neutral + Location: 1,66 + Actor2574: t16 + Owner: Neutral + Location: 2,66 + Actor2575: t07.husk + Owner: Neutral + Location: 3,66 + Actor2576: t02 + Owner: Neutral + Location: 0,67 + Actor2577: t02 + Owner: Neutral + Location: 1,67 + Actor2578: t16 + Owner: Neutral + Location: 2,67 + Actor2579: t12 + Owner: Neutral + Location: 3,67 + Actor2297: t01 + Owner: Neutral + Location: 4,62 + Actor2580: t12 + Owner: Neutral + Location: 3,63 + Actor2581: t07 + Owner: Neutral + Location: 4,63 + Actor2582: t05 + Owner: Neutral + Location: 3,64 + Actor2583: t06 + Owner: Neutral + Location: 4,64 + Actor2584: t01 + Owner: Neutral + Location: 5,65 + Actor2585: t12 + Owner: Neutral + Location: 4,66 + Actor2586: t07 + Owner: Neutral + Location: 5,66 + Actor2587: t05 + Owner: Neutral + Location: 4,67 + Actor2588: t06 + Owner: Neutral + Location: 5,67 + Actor2589: t13 + Owner: Neutral + Location: 6,64 + Actor2590: t07 + Owner: Neutral + Location: 5,68 + Actor2591: t07 + Owner: Neutral + Location: 16,0 + Actor2592: t07 + Owner: Neutral + Location: 17,0 + Actor2593: t08 + Owner: Neutral + Location: 18,1 + Actor2594: t17 + Owner: Neutral + Location: 19,0 + Actor2595: t01 + Owner: Neutral + Location: 20,0 + Actor2596: tc02 + Owner: Neutral + Location: 21,0 + Actor2597: t07 + Owner: Neutral + Location: 23,0 + Actor2598: t17 + Owner: Neutral + Location: 24,0 + Actor2599: t12 + Owner: Neutral + Location: 25,0 + Actor2600: t17 + Owner: Neutral + Location: 26,0 + Actor2601: t08 + Owner: Neutral + Location: 16,2 + Actor2602: t05 + Owner: Neutral + Location: 17,1 + Actor2603: t15 + Owner: Neutral + Location: 18,1 + Actor2604: t03 + Owner: Neutral + Location: 20,1 + Actor2605: t08 + Owner: Neutral + Location: 21,2 + Actor2606: t17 + Owner: Neutral + Location: 22,1 + Actor2607: t16 + Owner: Neutral + Location: 23,1 + Actor2608: t05 + Owner: Neutral + Location: 24,1 + Actor2609: t01 + Owner: Neutral + Location: 25,1 + Actor2610: t13.husk + Owner: Neutral + Location: 26,1 + Actor2611: t08 + Owner: Neutral + Location: 16,3 + Actor2615: t06.husk + Owner: Neutral + Location: 23,2 + Actor2616: t03 + Owner: Neutral + Location: 24,2 + Actor2617: t02 + Owner: Neutral + Location: 25,2 + Actor2612: t15 + Owner: Neutral + Location: 17,2 + Actor2613: t07 + Owner: Neutral + Location: 21,2 + Actor2614: t02 + Owner: Neutral + Location: 33,12 + Actor2618: t07 + Owner: Neutral + Location: 33,6 + Actor2619: t08 + Owner: Neutral + Location: 34,7 + Actor2620: tc03 + Owner: Neutral + Location: 39,10 + Actor2622: t08 + Owner: Neutral + Location: 38,11 + Actor2623: t10 + Owner: Neutral + Location: 37,11 + Actor2624: t16 + Owner: Neutral + Location: 39,11 + Actor2625: t12 + Owner: Neutral + Location: 37,12 + Actor2626: t02 + Owner: Neutral + Location: 38,12 + Actor2213: t14.husk + Owner: Neutral + Location: 46,0 + Actor2218: t13 + Owner: Neutral + Location: 48,0 + Actor2245: t13 + Owner: Neutral + Location: 49,0 + Actor2276: tc01 + Owner: Neutral + Location: 50,0 + Actor2309: t16 + Owner: Neutral + Location: 52,0 + Actor2621: t08 + Owner: Neutral + Location: 53,1 + Actor2627: t16 + Owner: Neutral + Location: 54,0 + Actor2628: tc01 + Owner: Neutral + Location: 55,0 + Actor2629: t12 + Owner: Neutral + Location: 57,0 + Actor2630: t06 + Owner: Neutral + Location: 58,0 + Actor2631: t03 + Owner: Neutral + Location: 59,0 + Actor2632: t06.husk + Owner: Neutral + Location: 60,0 + Actor2633: t11 + Owner: Neutral + Location: 61,0 + Actor2634: t10 + Owner: Neutral + Location: 46,1 + Actor2635: t02 + Owner: Neutral + Location: 48,1 + Actor2636: t02 + Owner: Neutral + Location: 49,1 + Actor2637: t16.husk + Owner: Neutral + Location: 50,1 + Actor2638: t14.husk + Owner: Neutral + Location: 51,1 + Actor2639: t10 + Owner: Neutral + Location: 53,1 + Actor2640: t10 + Owner: Neutral + Location: 55,1 + Actor2641: t16 + Owner: Neutral + Location: 48,2 + Actor2642: t12 + Owner: Neutral + Location: 49,2 + Actor2643: t01.husk + Owner: Neutral + Location: 50,2 + Actor2644: t01 + Owner: Neutral + Location: 51,2 + Actor2645: t17.husk + Owner: Neutral + Location: 52,2 + Actor2646: t07 + Owner: Neutral + Location: 53,2 + Actor2647: t05 + Owner: Neutral + Location: 48,3 + Actor2648: t06 + Owner: Neutral + Location: 49,3 + Actor2649: t05.husk + Owner: Neutral + Location: 50,3 + Actor2650: t11.husk + Owner: Neutral + Location: 51,3 + Actor2651: t16 + Owner: Neutral + Location: 63,0 + Actor2652: t17 + Owner: Neutral + Location: 64,0 + Actor2653: t06 + Owner: Neutral + Location: 65,0 + Actor2654: t14 + Owner: Neutral + Location: 62,1 + Actor2655: t08 + Owner: Neutral + Location: 64,2 + Actor2656: t12 + Owner: Neutral + Location: 65,1 + Actor2657: t06 + Owner: Neutral + Location: 64,2 + Actor2658: t05 + Owner: Neutral + Location: 62,3 + Actor2659: t12.husk + Owner: Neutral + Location: 63,3 + Actor2660: t02 + Owner: Neutral + Location: 62,4 + Actor2661: t16 + Owner: Neutral + Location: 63,4 + Actor2662: t12 + Owner: Neutral + Location: 66,3 + Actor2663: t06 + Owner: Neutral + Location: 59,1 + Actor2664: t10 + Owner: Neutral + Location: 61,2 + Actor2665: t01 + Owner: Neutral + Location: 31,9 + Actor2666: t08 + Owner: Neutral + Location: 32,10 + Actor2667: t01 + Owner: Neutral + Location: 32,10 + Actor2668: t07 + Owner: Neutral + Location: 32,11 + Actor2669: t02 + Owner: Neutral + Location: 33,11 + Actor2670: tc03 + Owner: Neutral + Location: 30,12 + Actor2671: t16 + Owner: Neutral + Location: 34,12 + Actor2672: t14 + Owner: Neutral + Location: 30,5 + Actor2673: t07 + Owner: Neutral + Location: 33,10 + Actor2674: t15 + Owner: Neutral + Location: 30,2 + Actor2675: t17 + Owner: Neutral + Location: 27,7 + Actor2676: t13 + Owner: Neutral + Location: 96,11 + Actor2677: t05 + Owner: Neutral + Location: 95,12 + Actor2678: t17 + Owner: Neutral + Location: 96,12 + Actor2679: t01 + Owner: Neutral + Location: 95,13 + Actor2680: t16 + Owner: Neutral + Location: 96,13 + Actor2681: t15 + Owner: Neutral + Location: 95,15 + Actor2682: tc01 + Owner: Neutral + Location: 95,16 + Actor2683: t07 + Owner: Neutral + Location: 95,17 + Actor2684: t02 + Owner: Neutral + Location: 95,18 + Actor2685: t07 + Owner: Neutral + Location: 96,18 + Actor2686: t14.husk + Owner: Neutral + Location: 94,20 + Actor2687: t16 + Owner: Neutral + Location: 96,20 + Actor2688: t07 + Owner: Neutral + Location: 95,21 + Actor2689: t15 + Owner: Neutral + Location: 95,22 + Actor2690: t14.husk + Owner: Neutral + Location: 94,3 + Actor2691: t16 + Owner: Neutral + Location: 96,3 + Actor2692: t07 + Owner: Neutral + Location: 95,4 + Actor2693: t15 + Owner: Neutral + Location: 95,5 + Actor2694: t02 + Owner: Neutral + Location: 96,1 + Actor2695: t13 + Owner: Neutral + Location: 93,4 + Actor2391: bggy + Owner: Nod + Facing: 384 + Location: 75,83 + Actor2697: bggy + Owner: Nod + Location: 71,68 + Facing: 0 + Actor2701: bggy + Owner: Nod + Location: 89,22 + Facing: 634 + Actor2706: arty.nod + Owner: Nod + Location: 66,68 + Facing: 253 + Actor2707: arty.nod + Owner: Nod + Location: 65,74 + Facing: 253 + Actor2708: ltnk + Owner: Nod + Location: 52,66 + Facing: 150 + Actor2709: ltnk + Owner: Nod + Location: 54,64 + Facing: 134 + Actor2712: bggy + Owner: Nod + Location: 18,51 + Facing: 0 + Actor2713: bggy + Owner: Nod + Location: 5,79 + Facing: 0 + Actor2715: n1 + Owner: Nod + SubCell: 3 + Location: 53,68 + Facing: 0 + Actor2716: n1 + Owner: Nod + SubCell: 3 + Location: 54,65 + Facing: 166 + Actor2717: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 56,65 + Actor2718: n1 + Owner: Nod + Location: 56,64 + SubCell: 3 + Facing: 237 + Actor2719: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 48,65 + Actor2720: n1 + Owner: Nod + SubCell: 3 + Location: 74,46 + Facing: 384 + Actor2721: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 87,22 + Actor2722: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 90,21 + Actor2723: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 43,18 + Actor2724: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 36,46 + Actor2725: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 35,44 + Actor2726: n1 + Owner: Nod + SubCell: 3 + Location: 19,51 + Facing: 0 + Actor2727: n1 + Owner: Nod + SubCell: 3 + Location: 17,52 + Facing: 0 + Actor2732: n1 + Owner: Nod + SubCell: 3 + Location: 18,89 + Facing: 713 + Actor2734: n1 + Owner: Nod + SubCell: 3 + Location: 7,82 + Facing: 0 + Actor2735: n1 + Owner: Nod + SubCell: 3 + Location: 32,89 + Facing: 674 + Actor2741: n1 + Owner: Nod + SubCell: 3 + Location: 23,70 + Facing: 848 + Actor2743: n1 + Owner: Nod + SubCell: 3 + Location: 49,43 + TurretFacing: 0 + Facing: 0 + Actor2748: n1 + Owner: Nod + SubCell: 3 + Location: 89,39 + Facing: 0 + Actor2749: n1 + Owner: Nod + SubCell: 3 + Location: 91,40 + Facing: 0 + Actor2750: n1 + Owner: Nod + SubCell: 3 + Location: 89,41 + Facing: 0 + Actor2751: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 4,52 + Actor2752: n1 + Owner: Nod + SubCell: 3 + Facing: 848 + Location: 6,78 + Actor2760: n4 + Owner: Nod + SubCell: 3 + Location: 20,79 + Facing: 0 + Actor2761: n4 + Owner: Nod + SubCell: 3 + Location: 72,30 + Facing: 55 + Actor2762: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 92,32 + Actor2766: n1 + Owner: Nod + SubCell: 3 + Location: 12,17 + Facing: 384 + Actor2767: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 10,15 + Actor2768: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 41,16 + Actor2771: n4 + Owner: Nod + SubCell: 3 + Facing: 269 + Location: 78,6 + Actor2773: n4 + Owner: Nod + SubCell: 3 + Facing: 222 + Location: 78,8 + Actor2774: ftnk + Owner: Nod + Facing: 253 + Location: 79,7 + Actor2795: t17 + Owner: Neutral + Location: 27,92 + Actor2775: t17 + Owner: Neutral + Location: 44,87 + Actor2776: t08 + Owner: Neutral + Location: 45,88 + Actor2778: t13 + Owner: Neutral + Location: 44,88 + Actor2779: t13 + Owner: Neutral + Location: 44,89 + Actor2780: t16 + Owner: Neutral + Location: 45,89 + Actor2781: t05 + Owner: Neutral + Location: 46,89 + Actor2783: t17 + Owner: Neutral + Location: 45,90 + Actor2784: t02 + Owner: Neutral + Location: 46,90 + Actor2421: t07 + Owner: Neutral + Location: 41,82 + Actor2422: tc01 + Owner: Neutral + Location: 49,82 + Actor2424: t13 + Owner: Neutral + Location: 49,83 + Actor2425: t05 + Owner: Neutral + Location: 50,83 + Actor2428: t07 + Owner: Neutral + Location: 49,84 + Actor2429: t13 + Owner: Neutral + Location: 50,84 + Actor2430: tc05 + Owner: Neutral + Location: 46,87 + Actor2431: tc04 + Owner: Neutral + Location: 46,83 + Actor2432: chain + Owner: Nod + Location: 37,85 + Actor2508: chain + Owner: Nod + Location: 36,85 + Actor2736: chain + Owner: Nod + Location: 33,85 + Actor2738: chain + Owner: Nod + Location: 34,85 + Actor2772: chain + Owner: Nod + Location: 41,88 + Actor2785: chain + Owner: Nod + Location: 41,89 + Actor2786: chain + Owner: Nod + Location: 41,90 + Actor2787: chain + Owner: Nod + Location: 41,91 + Actor2788: chain + Owner: Nod + Location: 41,92 + Actor2789: chain + Owner: Nod + Location: 41,93 + Actor2790: chain + Owner: Nod + Location: 40,93 + Actor2791: chain + Owner: Nod + Location: 39,93 + Actor2792: chain + Owner: Nod + Location: 38,93 + Actor2793: chain + Owner: Nod + Location: 37,93 + Actor2794: chain + Owner: Nod + Location: 32,93 + Actor2796: chain + Owner: Nod + Location: 31,93 + Actor2797: chain + Owner: Nod + Location: 30,93 + Actor2798: chain + Owner: Nod + Location: 29,93 + Actor2799: chain + Owner: Nod + Location: 29,92 + Actor2800: chain + Owner: Nod + Location: 29,91 + Actor2801: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 34,84 + Actor2802: n1 + Owner: Nod + SubCell: 3 + Location: 37,84 + Facing: 214 + NodComms: hq + Owner: Nod + Location: 38,89 + Actor2433: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 37,94 + Actor2777: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 33,93 + Actor2393: hand + Owner: Nod + Location: 68,71 + Actor2402: t03 + Owner: Neutral + Location: 72,74 + Actor2484: bggy + Owner: Nod + Location: 36,90 + Facing: 531 + Actor2782: arty.nod + Owner: Nod + Location: 60,45 + Facing: 384 + Actor2737: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 46,13 + Actor2805: e1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 9,14 + Actor2806: e1 + Owner: Nod + Location: 12,17 + SubCell: 1 + Facing: 384 + Actor2808: e1 + Owner: Nod + SubCell: 3 + Location: 37,45 + Facing: 384 + Actor2809: e1 + Owner: Nod + SubCell: 3 + Location: 20,53 + Facing: 0 + Actor2810: e1 + Owner: Nod + Location: 19,53 + SubCell: 3 + Facing: 0 + Actor2811: gun + Owner: Nod + TurretFacing: 563 + Location: 50,86 + Actor2419: t12 + Owner: Neutral + Location: 89,77 + Actor2420: t17 + Owner: Neutral + Location: 90,77 + Actor2814: t01 + Owner: Neutral + Location: 90,78 + Actor2815: t13 + Owner: Neutral + Location: 91,78 + Actor2698: n1 + Owner: Nod + SubCell: 3 + Facing: 848 + Location: 14,85 + Actor2733: n1 + Owner: Nod + SubCell: 3 + Facing: 848 + Location: 15,87 + Actor2813: n1 + Owner: Nod + SubCell: 3 + Facing: 848 + Location: 17,87 + Actor2816: n1 + Owner: Nod + SubCell: 3 + Facing: 848 + Location: 16,88 + Actor2817: n1 + Owner: Nod + SubCell: 3 + Facing: 848 + Location: 16,90 + Actor2818: bggy + Owner: Nod + Facing: 0 + Location: 15,91 + Actor2819: n1 + Owner: Nod + SubCell: 3 + Facing: 848 + Location: 19,88 + Actor2820: n1 + Owner: Nod + SubCell: 3 + Facing: 848 + Location: 20,89 + Actor2512: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 53,64 + Actor2753: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 52,67 + Actor2405: t13 + Owner: Neutral + Location: 40,74 + Actor2407: t14.husk + Owner: Neutral + Location: 41,74 + Actor2739: tc03 + Owner: Neutral + Location: 43,75 + Actor2740: t13 + Owner: Neutral + Location: 40,75 + Actor2754: t16 + Owner: Neutral + Location: 41,75 + Actor2755: t05 + Owner: Neutral + Location: 42,75 + Actor2756: t12 + Owner: Neutral + Location: 40,76 + Actor2821: t17 + Owner: Neutral + Location: 41,76 + Actor2822: t02 + Owner: Neutral + Location: 42,76 + Actor2823: t17.husk + Owner: Neutral + Location: 43,76 + Actor2824: t03 + Owner: Neutral + Location: 44,76 + Actor2825: t16.husk + Owner: Neutral + Location: 40,77 + Actor2826: t01 + Owner: Neutral + Location: 41,77 + Actor2827: t13 + Owner: Neutral + Location: 42,77 + Actor2828: t06 + Owner: Neutral + Location: 43,77 + Actor2829: t12 + Owner: Neutral + Location: 44,77 + Actor2830: t05 + Owner: Neutral + Location: 45,74 + Actor2831: t16 + Owner: Neutral + Location: 46,74 + Actor2832: t17 + Owner: Neutral + Location: 47,74 + Actor2833: t08 + Owner: Neutral + Location: 48,75 + Actor2834: tc02 + Owner: Neutral + Location: 44,76 + Actor2835: t13 + Owner: Neutral + Location: 46,75 + Actor2836: t10 + Owner: Neutral + Location: 47,75 + Actor2837: t03 + Owner: Neutral + Location: 46,76 + Actor2838: t16 + Owner: Neutral + Location: 47,76 + Actor2839: t11 + Owner: Neutral + Location: 45,77 + Actor2470: t11 + Owner: Neutral + Location: 46,78 + Actor2840: tc01 + Owner: Neutral + Location: 47,77 + Actor2841: t16 + Owner: Neutral + Location: 49,75 + Actor2842: t17 + Owner: Neutral + Location: 52,78 + Actor2847: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 38,4 + Actor2848: e1 + Owner: Nod + Facing: 384 + SubCell: 1 + Location: 38,4 + Actor2850: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 39,5 + Actor2843: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 38,5 + Actor2845: bike + Owner: Nod + Facing: 134 + Location: 19,90 + SAM2Squad: waypoint + Owner: Neutral + Location: 17,88 + SAM1Squad: waypoint + Owner: Neutral + Location: 39,6 + SAM4Squad: waypoint + Owner: Neutral + Location: 54,66 + Actor2406: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 38,6 + Actor2409: n1 + Owner: Nod + SubCell: 3 + Location: 40,6 + Facing: 384 + Actor2700: n1 + Owner: Nod + SubCell: 3 + Facing: 166 + Location: 65,38 + Actor2746: n1 + Owner: Nod + SubCell: 3 + Facing: 1023 + Location: 67,36 + Actor2745: n1 + Owner: Nod + SubCell: 3 + Location: 59,44 + Facing: 618 + Actor2499: bggy + Owner: Nod + Facing: 134 + Location: 56,76 + Actor2702: bggy + Owner: Nod + Facing: 134 + Location: 55,77 + Actor2703: bike + Owner: Nod + Facing: 134 + Location: 57,77 + Actor2404: bike + Owner: Nod + Facing: 134 + Location: 58,78 + SAM3Squad: waypoint + Owner: Neutral + Location: 56,77 + Actor2408: bike + Owner: Nod + Facing: 134 + Location: 55,78 + Actor2704: bggy + Owner: Nod + Facing: 134 + Location: 57,78 + Actor2699: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 41,7 + Actor2710: e1 + Owner: Nod + Facing: 384 + SubCell: 1 + Location: 41,7 + Actor2731: n1 + Owner: Nod + SubCell: 3 + Facing: 848 + Location: 66,43 + Actor2744: n1 + Owner: Nod + SubCell: 3 + Facing: 848 + Location: 68,43 + Actor2747: n1 + Owner: Nod + SubCell: 3 + Facing: 848 + Location: 67,44 + SAM5Squad: waypoint + Owner: Neutral + Location: 68,44 + Actor2770: n3 + Owner: Nod + SubCell: 3 + Facing: 222 + Location: 69,44 + Actor2803: n1 + Owner: Nod + SubCell: 3 + Facing: 848 + Location: 70,44 + Actor2844: n1 + Owner: Nod + SubCell: 3 + Facing: 713 + Location: 69,45 + Actor2846: n1 + Owner: Nod + SubCell: 3 + Facing: 848 + Location: 71,45 + Actor2851: n1 + Owner: Nod + SubCell: 3 + Facing: 848 + Location: 67,46 + Actor2852: bike + Owner: Nod + Facing: 134 + Location: 70,46 + Actor2853: bggy + Owner: Nod + Facing: 0 + Location: 66,47 + Actor2854: n1 + Owner: Nod + SubCell: 3 + Facing: 848 + Location: 68,46 + SAM6Squad: waypoint + Owner: Neutral + Location: 73,62 + Actor2730: bike + Owner: Nod + Location: 72,61 + Facing: 134 + Actor2705: n1 + Owner: Nod + SubCell: 3 + Facing: 174 + Location: 75,60 + Actor2769: n1 + Owner: Nod + SubCell: 1 + Facing: 190 + Location: 75,60 + SAM7Squad: waypoint + Owner: Neutral + Location: 73,82 + Transport1: sapc + Owner: NodTransports + Location: 68,76 + Facing: 384 + Transport2: sapc + Owner: NodTransports + Location: 70,77 + Facing: 384 + Actor2418: bggy + Owner: Nod + Facing: 412 + Location: 72,83 + Actor2855: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 74,83 + Actor2858: n1 + Owner: Nod + Facing: 384 + SubCell: 1 + Location: 74,83 + Actor2859: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 73,83 + Actor2860: n1 + Owner: Nod + Facing: 384 + SubCell: 1 + Location: 73,83 + Actor2861: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 72,81 + Actor2759: n1 + Owner: Nod + SubCell: 3 + Facing: 174 + Location: 71,61 + Actor2862: n1 + Owner: Nod + SubCell: 1 + Facing: 190 + Location: 71,61 + Actor2863: n3 + Owner: Nod + SubCell: 3 + Location: 74,62 + Facing: 222 + Actor2864: n4 + Owner: Nod + SubCell: 3 + Location: 42,55 + Facing: 269 + Actor2865: ftnk + Owner: Nod + Location: 42,56 + Facing: 253 + Actor2866: n4 + Owner: Nod + SubCell: 3 + Facing: 222 + Location: 42,57 + Actor2714: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 53,28 + Actor2757: e1 + Owner: Nod + Facing: 384 + SubCell: 1 + Location: 53,28 + Actor2758: bggy + Owner: Nod + Facing: 515 + Location: 52,29 + Actor2867: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 54,29 + Actor2711: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 48,44 + Actor2728: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 31,28 + Actor2729: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 35,28 + Actor2742: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 32,29 + Actor2807: bggy + Owner: Nod + Facing: 634 + Location: 34,29 + Actor2868: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 12,48 + Actor2869: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 11,49 + LongbowRally2: waypoint + Owner: Neutral + Location: 81,53 + LongbowRally1: waypoint + Owner: Neutral + Location: 55,55 + Actor2483: bggy + Owner: Nod + Facing: 412 + Location: 73,75 + Actor2764: n1 + Owner: Nod + SubCell: 1 + Facing: 190 + Location: 79,73 + Raider1: apc + Owner: Greece + Location: 3,28 + Facing: 768 + Raider2: apc + Owner: Greece + Location: 3,32 + Facing: 768 + Actor2804: snip + Owner: Greece + SubCell: 4 + Location: 5,32 + Facing: 768 + Actor2856: snip + Owner: Greece + SubCell: 1 + Location: 5,32 + Facing: 768 + Actor2870: snip + Owner: Greece + SubCell: 4 + Location: 5,28 + Facing: 896 + Actor2872: snip + Owner: Greece + SubCell: 1 + Location: 5,28 + Facing: 896 + Actor2439: rtnk + Owner: Greece + Location: 8,28 + Facing: 896 + NodBaseTopLeft: waypoint + Owner: Neutral + Location: 63,63 + NodBaseBottomRight: waypoint + Owner: Neutral + Location: 85,84 + NonHardSniper2: snip + Owner: Greece + SubCell: 5 + Location: 5,32 + Facing: 768 + Actor2763: snip + Owner: Greece + SubCell: 2 + Location: 5,32 + Facing: 768 + Actor2871: snip + Owner: Greece + SubCell: 5 + Location: 5,28 + Facing: 896 + NonHardSniper1: snip + Owner: Greece + SubCell: 2 + Location: 5,28 + Facing: 896 + SAM2SquadRally: waypoint + Owner: Neutral + Location: 29,58 + SAM1SquadRally: waypoint + Owner: Neutral + Location: 31,20 + SAM3SquadRally: waypoint + Owner: Neutral + Location: 29,48 + SAM4SquadRally: waypoint + Owner: Neutral + Location: 31,56 + SAM5SquadRally: waypoint + Owner: Neutral + Location: 56,23 + SAM6SquadRally: waypoint + Owner: Neutral + Location: 67,31 + SAM7SquadRally: waypoint + Owner: Neutral + Location: 67,41 + Actor2444: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 90,40 + Actor2445: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 91,42 + Actor2447: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 90,43 + Actor2448: n1 + Owner: Nod + Facing: 384 + Location: 91,42 + SubCell: 1 + Actor2449: n1 + Owner: Nod + Facing: 384 + Location: 90,40 + SubCell: 1 + Actor2451: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 89,38 + Actor2452: n3 + Owner: Nod + Facing: 384 + Location: 90,41 + SubCell: 3 + Actor2454: n3 + Owner: Nod + Facing: 384 + Location: 90,39 + SubCell: 3 + Actor2456: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 90,42 + NodPatrol1_1: waypoint + Owner: Neutral + Location: 90,40 + Actor2457: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 34,73 + Actor2765: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 34,74 + Actor2873: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 35,74 + Actor2874: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 35,75 + Actor2875: n1 + Owner: Nod + Facing: 384 + SubCell: 1 + Location: 35,75 + NodPatrol2_1: waypoint + Owner: Neutral + Location: 35,75 + Actor2877: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 36,75 + Actor2878: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 34,76 + Actor2879: n3 + Owner: Nod + SubCell: 3 + Location: 35,76 + Facing: 384 + Actor2880: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 35,77 + Actor2881: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 36,77 + Actor2882: n1 + Owner: Nod + Facing: 384 + SubCell: 1 + Location: 36,77 + Actor2883: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 35,78 + NodPatrol2_2: waypoint + Owner: Neutral + Location: 47,47 + NodPatrol2_3: waypoint + Owner: Neutral + Location: 57,18 + NodPatrol1_2: waypoint + Owner: Neutral + Location: 87,9 + NodPatrol1_3: waypoint + Owner: Neutral + Location: 67,21 + NodPatrol1_4: waypoint + Owner: Neutral + Location: 66,60 + NodPatrol1_5: waypoint + Owner: Neutral + Location: 85,61 + Actor2696: ftnk + Owner: Nod + Location: 71,82 + Facing: 384 + Medic1: medi + Owner: Greece + SubCell: 3 + Location: 3,30 + Facing: 384 + Mechanic: mech + Owner: Greece + SubCell: 3 + Location: 3,31 + Facing: 384 + Medic2: medi + Owner: Greece + SubCell: 3 + Location: 3,29 + Facing: 384 + HardOnlySSM: mlrs + Owner: Nod + Location: 80,66 + Facing: 111 + Actor2462: bggy + Owner: Nod + Facing: 515 + Location: 39,8 + Actor2479: n4 + Owner: Nod + SubCell: 3 + Facing: 269 + Location: 78,33 + HardOnlyFlameTank1: ftnk + Owner: Nod + Location: 79,34 + Facing: 253 + Actor2812: n4 + Owner: Nod + SubCell: 3 + Facing: 222 + Location: 78,35 + HardOnlyFlameTank2: ftnk + Owner: Nod + Location: 71,72 + Facing: 0 + Actor2480: n4 + Owner: Nod + SubCell: 3 + Facing: 222 + Location: 55,28 + Actor2849: n4 + Owner: Nod + SubCell: 3 + Facing: 222 + Location: 49,46 + Actor2857: n4 + Owner: Nod + SubCell: 3 + Facing: 222 + Location: 16,45 + Actor2876: n4 + Owner: Nod + SubCell: 3 + Location: 6,16 + Facing: 523 + Actor2884: n4 + Owner: Nod + SubCell: 3 + Facing: 523 + Location: 7,15 + HardOnlyFlameTank3: ftnk + Owner: Nod + Location: 65,56 + Facing: 0 + HardOnlyFlameTank4: ftnk + Owner: Nod + Location: 67,56 + Facing: 0 + HardOnlyFlameTank5: ftnk + Owner: Nod + Location: 39,16 + Facing: 384 + HardOnlyBlackHand4: bh + Owner: Nod + SubCell: 3 + Location: 70,72 + Facing: 0 + HardOnlyBlackHand3: bh + Owner: Nod + SubCell: 3 + Location: 73,73 + Facing: 0 + HardOnlyBlackHand2: bh + Owner: Nod + Location: 76,72 + SubCell: 3 + Facing: 0 + HardOnlyBlackHand1: bh + Owner: Nod + SubCell: 3 + Location: 78,71 + Facing: 0 + NodBaseCamera: camera + Owner: Greece + Location: 73,72 + Actor2885: shad + Owner: Nod + Location: 34,87 + SubCell: 3 + Facing: 384 + Actor2886: shad + Owner: Nod + Location: 35,88 + SubCell: 3 + Facing: 384 + Actor2887: shad + Owner: Nod + Facing: 384 + Location: 36,86 + SubCell: 3 + Actor2888: shad + Owner: Nod + Facing: 384 + Location: 86,18 + SubCell: 3 + Actor2889: shad + Owner: Nod + Facing: 384 + Location: 85,19 + SubCell: 3 + Actor2890: shad + Owner: Nod + Facing: 384 + Location: 76,66 + SubCell: 3 + Actor2891: shad + Owner: Nod + Location: 70,67 + SubCell: 3 + Facing: 0 + Actor2892: shad + Owner: Nod + Facing: 384 + Location: 46,53 + SubCell: 3 + Actor2893: shad + Owner: Nod + Location: 47,59 + SubCell: 3 + Facing: 384 + Actor2894: bh + Owner: Nod + Facing: 384 + Location: 43,16 + SubCell: 3 + Actor2895: bh + Owner: Nod + Location: 33,53 + SubCell: 3 + Facing: 384 + Actor2896: bh + Owner: Nod + Location: 34,51 + SubCell: 3 + Facing: 384 + Actor2897: bh + Owner: Nod + Location: 33,49 + SubCell: 3 + Facing: 384 + Actor2898: bh + Owner: Nod + Facing: 384 + Location: 75,39 + SubCell: 3 + Actor2899: bh + Owner: Nod + Location: 73,40 + SubCell: 3 + Facing: 384 + VeryHardOnlyFlameTank1: ftnk + Owner: Nod + Location: 62,31 + Facing: 95 + VeryHardOnlyFlameTank2: ftnk + Owner: Nod + Location: 64,28 + Facing: 245 + Actor2900: hftk + Owner: Nod + Location: 68,59 + Facing: 95 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-coalitions.yaml, apprehension-rules.yaml + +Sequences: apprehension-sequences.yaml + +Weapons: ca|weapons/custom/campaign.yaml, apprehension-weapons.yaml diff --git a/mods/ca/missions/main-campaign/ca06-machinations/machinations-rules.yaml b/mods/ca/missions/main-campaign/ca06-machinations/machinations-rules.yaml new file mode 100644 index 0000000000..8b5e6abd93 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca06-machinations/machinations-rules.yaml @@ -0,0 +1,87 @@ +^Palettes: + TintPostProcessEffect: + +World: + LuaScript: + Scripts: campaign.lua, machinations.lua + MissionData: + Briefing: Intelligence gathered from the Nod naval base has put us hot on Nod's trail. The transports we captured were waiting to board a disguised cargo vessel which has now also been captured. Based on its navigational logs we have used our satellites and located what appears to be a research facility hidden in a disused quarry in North Africa.\n\nNod submarines will make a large scale landing difficult, but if we can establish a base on the coast we'll be able to launch an offensive from there.\n\nWith GDI's assistance we have been able to augment our harvesters and refineries to harvest the Tiberium crystals that are becoming widespread. Nod also has a harvesting operation in the area. Gather what resources you can without alerting Nod to our presence, build up your forces, then capture their research facility. + MapOptions: + ShortGameCheckboxEnabled: False + MusicPlaylist: + StartingMusic: ind + +Player: + PlayerResources: + DefaultCash: 6000 + +# Disable powers for AI + +^SatHackPower: + SpawnActorPowerCA@sathack: + Prerequisites: ~radar.nod, ~!player.legion, ~!botplayer + +^NodAirdropPowers: + ParatroopersPowerCA@NodAirDrop: + Prerequisites: ~!botplayer + +# Disable tech + +TMPL: + Inherits@CAMPAIGNDISABLED: ^Disabled + +TMPP: + Inherits@CAMPAIGNDISABLED: ^Disabled + +ENLI: + Inherits@CAMPAIGNDISABLED: ^Disabled + +RMBC: + Inherits@CAMPAIGNDISABLED: ^Disabled + +# Enable subfaction specific tech + +SNIP: + Buildable: + Prerequisites: ~tent, anyradar + +RTNK: + Buildable: + Prerequisites: ~vehicles.allies + +TNKD: + Buildable: + Prerequisites: anyradar, ~vehicles.allies + +CHPR: + Buildable: + Prerequisites: atek, ~vehicles.allies + +BATF: + Buildable: + Prerequisites: atek, ~vehicles.allies + +NHAW: + Buildable: + Prerequisites: ~aircraft.allies + +apb.upgrade: + Buildable: + Prerequisites: atek + +# Misc + +charv.upgrade: + Buildable: + Prerequisites: ~player.allies, atek, ~techlevel.high + +BIO: + -ProvidesPrerequisite@mortar: + -ProvidesPrerequisite@toxintruck: + Tooltip: + Name: Research Lab + Health: + HP: 200000 + +TTRK: + -Buildable: diff --git a/mods/ca/missions/main-campaign/ca06-machinations/machinations.lua b/mods/ca/missions/main-campaign/ca06-machinations/machinations.lua new file mode 100644 index 0000000000..70cae01d61 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca06-machinations/machinations.lua @@ -0,0 +1,352 @@ +MissionDir = "ca|missions/main-campaign/ca06-machinations" + +InitialUnits = { + easy = { "jeep", "mcv", "2tnk", "e1", "e1", "e1", "e3" }, + normal = { "jeep", "mcv", "e1", "e1", "e1", "e3" }, + hard = { "jeep", "mcv", "e1", "e1", "e3" }, + vhard = { "jeep", "mcv", "e1", "e1" }, + brutal = { "jeep", "mcv" } +} + +NodSouthAttackPaths = { + { LeftAttack1.Location, LeftAttack2.Location, LeftAttack3.Location }, + { MiddleAttack1.Location, MiddleAttack2.Location, MiddleAttack3.Location, RightAttack3.Location }, + { MiddleAttack1.Location, MiddleAttack2.Location, MiddleAttack3.Location, LeftAttack3.Location } +} + +NodEastAttackPaths = { + { RightAttack1.Location, RightAttack2.Location, RightAttack3.Location }, + { RightAttack1.Location, MiddleAttack2.Location, MiddleAttack3.Location, RightAttack3.Location }, + { RightAttack1.Location, MiddleAttack2.Location, MiddleAttack3.Location, LeftAttack3.Location } +} + +NodNavalAttackPath = { + { NodNavalAttack1.Location, NodNavalAttack2.Location, NodNavalAttack3.Location, NodNavalAttack4.Location, NodNavalAttack5.Location, NodNavalAttack6.Location } +} + +Patrols = { + { + Units = { LTPatroller1, LTPatroller2 }, + Path = { LTPatrol1.Location, LTPatrol2.Location, LTPatrol3.Location, LTPatrol4.Location, LTPatrol5.Location, LTPatrol6.Location, LTPatrol7.Location, LTPatrol8.Location, LTPatrol9.Location, LTPatrol10.Location, LTPatrol11.Location, LTPatrol12.Location, LTPatrol13.Location } + }, + { + Units = { EastPatroller1, EastPatroller2, EastPatroller3, EastPatroller4, EastPatroller5, EastPatroller6, EastPatroller7 }, + Path = { EastPatrol1.Location, EastPatrol2.Location, EastPatrol3.Location, EastPatrol2.Location, EastPatrol4.Location, EastPatrol2.Location } + }, + { + Units = { SouthPatroller1, SouthPatroller2, SouthPatroller3, SouthPatroller4 }, + Path = { SouthPatrol1.Location, SouthPatrol2.Location } + } +} + +SuperweaponsEnabledTime = { + easy = DateTime.Minutes(40), + normal = DateTime.Minutes(25), + hard = DateTime.Minutes(15), + vhard = DateTime.Minutes(10), + brutal = DateTime.Minutes(10) +} + +PreparationTime = { + easy = DateTime.Minutes(60), + normal = DateTime.Minutes(20), + hard = DateTime.Minutes(16), + vhard = DateTime.Minutes(14), + brutal = DateTime.Minutes(10) +} + +-- Squads + +LabDefenseCompositions = { + easy = { + { Infantry = { "n1c", "n1c", "n1c", "n3c" }, Vehicles = { "ltnk" } }, + }, + normal = { + { Infantry = { "n1c", "n1c", "n1c", "n3c", "n5", "n1c", "acol" }, Vehicles = { "ltnk", "bggy", "bike", "bike" } }, + }, + hard = { + { Infantry = { "n1c", "n1c", "n1c", "n3c", "n5", "n1c", "tplr", "tplr", "rmbc" }, Vehicles = { "ltnk", "mlrs", "stnk.nod", "hftk", "ltnk" } }, + }, + vhard = { + { Infantry = { "n1c", "n1c", "n1c", "n3c", "n5", "n1c", "tplr", "tplr", "rmbc", "enli", "n1c", "n3c" }, Vehicles = { "ltnk", "mlrs", "stnk.nod", "hftk", "ltnk" } }, + }, + brutal = { + { Infantry = { "n1c", "n1c", "n1c", "n3c", "n5", "n1c", "tplr", "rmbc", "n1c", "n3c", "tplr", "rmbc", "enli", "n1c", "n1c", "n3c" }, Vehicles = { "ltnk", "mlrs", "stnk.nod", "hftk", "avtr" } }, + } +} + +AdjustedNodCompositions = AdjustCompositionsForDifficulty(UnitCompositions.Nod) + +Squads = { + South = { + Delay = AdjustDelayForDifficulty(DateTime.Minutes(4)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 20, Max = 40 }), + DispatchDelay = DateTime.Seconds(15), + FollowLeader = true, + ProducerActors = { Infantry = { NodSouthHand }, Vehicles = { NodSouthAirstrip } }, + Compositions = AdjustedNodCompositions, + AttackPaths = NodSouthAttackPaths, + }, + East = { + Delay = AdjustDelayForDifficulty(DateTime.Minutes(2)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 20, Max = 40 }), + DispatchDelay = DateTime.Seconds(15), + FollowLeader = true, + ProducerActors = { Infantry = { NodEastHand1, NodEastHand2 }, Vehicles = { NodEastAirstrip } }, + Compositions = AdjustedNodCompositions, + AttackPaths = NodEastAttackPaths, + }, + Air = { + Delay = AdjustAirDelayForDifficulty(DateTime.Minutes(13)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 12, Max = 12 }), + Compositions = AirCompositions.Nod, + }, + Naval = { + ActiveCondition = function() + return PlayerHasNavalProduction(Greece) + end, + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 14, Max = 14 }), + Compositions = { + easy = { + { Ships = { "sb", "ss2" } } + }, + normal = { + { Ships = { "sb", "ss2", "sb" } } + }, + hard = { + { Ships = { "sb", "sb", "ss2", "ss2" } } + }, + vhard = { + { Ships = { "sb", "sb", "ss2", "ss2" } } + }, + brutal = { + { Ships = { "sb", "sb", "ss2", "ss2" } } + } + }, + AttackPaths = NodNavalAttackPath + }, + ICBMSubs = { + Delay = DateTime.Minutes(15), + AttackValuePerSecond = { Min = 8, Max = 16 }, + Compositions = { + brutal = { + { Ships = { "isub" } } + }, + }, + AttackPaths = NodNavalAttackPath + }, + LabDefense = { + ActiveCondition = function() + return CountConyards(Nod) < 2 and DateTime.GameTime >= DateTime.Minutes(15) + end, + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 20, Max = 20 }), + DispatchDelay = DateTime.Seconds(15), + FollowLeader = true, + ProducerActors = { Infantry = { NodQuarryHand }, Vehicles = { NodQuarryAirstrip } }, + Compositions = LabDefenseCompositions, + AttackPaths = NodSouthAttackPaths + } +} + +-- Setup and Tick + +SetupPlayers = function() + Greece = Player.GetPlayer("Greece") + Nod = Player.GetPlayer("Nod") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = { Greece } + MissionEnemies = { Nod } +end + +WorldLoaded = function() + SetupPlayers() + + TimerTicks = 0 + Camera.Position = McvLanding.CenterPosition + + InitObjectives(Greece) + AdjustPlayerStartingCashForDifficulty() + InitNod() + SetupChurchMoneyCrates() + DoMcvArrival() + + if IsNormalOrBelow() then + EastObelisk2.Destroy() + EastObelisk4.Destroy() + SouthWestObelisk2.Destroy() + SouthWestObelisk3.Destroy() + RiverTurret1.Destroy() + + if Difficulty == "easy" then + SouthWestObelisk1.Destroy() + EastObelisk1.Destroy() + EastObelisk3.Destroy() + LabObelisk1.Destroy() + LabObelisk2.Destroy() + end + end + + Trigger.AfterDelay(PreparationTime[Difficulty], function() + InitNodAttacks() + end) + + ObjectiveFindLab = Greece.AddObjective("Locate the Nod research lab.") + + -- On proximity to lab, reveal it and update objectives. + Trigger.OnEnteredProximityTrigger(ResearchLab.CenterPosition, WDist.New(10 * 1024), function(a, id) + if IsMissionPlayer(a.Owner) then + Trigger.RemoveProximityTrigger(id) + RevealLab() + end + end) + + Trigger.OnCapture(ResearchLab, function(self, captor, oldOwner, newOwner) + if IsMissionPlayer(newOwner) then + Greece.MarkCompletedObjective(ObjectiveCaptureLab) + end + end) + + Trigger.OnDamaged(ResearchLab, function(self, attacker, damage) + RevealLab() + end) + + Trigger.OnKilled(ResearchLab, function(self, killer) + RevealLab() + Greece.MarkFailedObjective(ObjectiveCaptureLab) + end) + + Utils.Do({ Turret1, Turret2, Turret3, Turret4, LeftAttack2, MiddleAttack3, EastBoundary }, function (t) + Trigger.OnEnteredProximityTrigger(t.CenterPosition, WDist.New(7 * 1024), function(a, id) + if IsMissionPlayer(a.Owner) then + Trigger.RemoveProximityTrigger(id) + InitNodAttacks() + end + end) + end) + + SetupReveals({ EntranceReveal1, EntranceReveal2, EntranceReveal3, EntranceReveal4 }) + AfterWorldLoaded() +end + +Tick = function() + OncePerSecondChecks() + OncePerFiveSecondChecks() + OncePerThirtySecondChecks() + AfterTick() +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + Nod.Resources = Nod.ResourceCapacity - 500 + + if TimerTicks > 0 then + if TimerTicks > 25 then + TimerTicks = TimerTicks - 25 + else + TimerTicks = 0 + end + end + + if DateTime.GameTime > DateTime.Seconds(10) then + if MissionPlayersHaveNoRequiredUnits() then + if ObjectiveFindLab ~= nil and not Greece.IsObjectiveCompleted(ObjectiveFindLab) then + Greece.MarkFailedObjective(ObjectiveFindLab) + end + if ObjectiveCaptureLab ~= nil and not Greece.IsObjectiveCompleted(ObjectiveCaptureLab) then + Greece.MarkFailedObjective(ObjectiveCaptureLab) + end + end + end + end +end + +OncePerFiveSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 125 == 0 then + UpdatePlayerBaseLocations() + end +end + +OncePerThirtySecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % DateTime.Seconds(30) == 0 then + CalculatePlayerCharacteristics() + end +end + +InitNod = function() + if Difficulty == "easy" then + RebuildExcludes.Nod = { Types = { "obli", "gun.nod" } } + end + + AutoRepairAndRebuildBuildings(Nod, 15) + SetupRefAndSilosCaptureCredits(Nod) + AutoReplaceHarvesters(Nod) + AutoRebuildConyards(Nod) + InitAiUpgrades(Nod) + + Trigger.AfterDelay(SuperweaponsEnabledTime[Difficulty], function() + Actor.Create("ai.minor.superweapons.enabled", true, { Owner = Nod }) + end) + + local nodGroundAttackers = Nod.GetGroundAttackers() + + Utils.Do(nodGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsNodGroundHunterUnit) + end) + + InitNavalAttackSquad(Squads.Naval, Nod) + InitAttackSquad(Squads.LabDefense, Nod) +end + +InitNodAttacks = function() + if not NodAttacksInitialized then + NodAttacksInitialized = true + Notification("Nod forces have been alerted to your presence, prepare your defenses!") + MediaCA.PlaySound(MissionDir .. "/r_nodalerted.aud", 2) + + InitAttackSquad(Squads.South, Nod) + InitAttackSquad(Squads.East, Nod) + InitAirAttackSquad(Squads.Air, Nod) + + if Difficulty == "brutal" then + InitNavalAttackSquad(Squads.ICBMSubs, Nod) + end + + Utils.Do(Patrols, function(p) + Utils.Do(p.Units, function(unit) + if not unit.IsDead then + unit.Patrol(p.Path, true) + end + end) + end) + end +end + +-- overridden in co-op version +DoMcvArrival = function() + local mcvArrivalPath = { McvEntry.Location, McvLanding.Location } + local mcvExitPath = { McvEntry.Location } + DoNavalTransportDrop(Greece, mcvArrivalPath, mcvExitPath, "lst.reinforce", InitialUnits[Difficulty], function(a) + a.Move(McvRally.Location) + end) +end + +RevealLab = function() + if not IsLabRevealed then + Beacon.New(Greece, ResearchLab.CenterPosition) + ObjectiveCaptureLab = Greece.AddObjective("Capture the Nod research lab.") + + if ObjectiveFindLab ~= nil and not Greece.IsObjectiveCompleted(ObjectiveFindLab) then + Greece.MarkCompletedObjective(ObjectiveFindLab) + end + + UserInterface.SetMissionText("Capture the Nod research lab.", HSLColor.Yellow) + LabCamera = Actor.Create("camera.paradrop", true, { Owner = Greece, Location = ResearchLab.Location }) + + Trigger.AfterDelay(DateTime.Seconds(5), function() + LabCamera.Destroy() + end) + + IsLabRevealed = true + end +end diff --git a/mods/ca/missions/main-campaign/ca06-machinations/map.bin b/mods/ca/missions/main-campaign/ca06-machinations/map.bin new file mode 100644 index 0000000000..9a829045d8 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca06-machinations/map.bin differ diff --git a/mods/ca/missions/main-campaign/ca06-machinations/map.png b/mods/ca/missions/main-campaign/ca06-machinations/map.png new file mode 100644 index 0000000000..546a758de8 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca06-machinations/map.png differ diff --git a/mods/ca/missions/main-campaign/ca06-machinations/map.yaml b/mods/ca/missions/main-campaign/ca06-machinations/map.yaml new file mode 100644 index 0000000000..628e7435ae --- /dev/null +++ b/mods/ca/missions/main-campaign/ca06-machinations/map.yaml @@ -0,0 +1,2328 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 06: Machinations + +Author: Darkademic + +Tileset: DESERT + +MapSize: 98,98 + +Bounds: 1,1,96,96 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: Nod, Greece + PlayerReference@Greece: + Name: Greece + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: allies + LockColor: True + Color: 99ACF2 + LockSpawn: True + LockTeam: True + Enemies: Nod, Creeps + PlayerReference@Nod: + Name: Nod + Bot: campaign + Faction: nod + Color: FE1100 + Enemies: Greece, Creeps + +Actors: + Actor30: brik + Owner: Nod + Location: 40,64 + Actor31: brik + Owner: Nod + Location: 41,64 + Actor32: brik + Owner: Nod + Location: 42,64 + Actor33: brik + Owner: Nod + Location: 43,64 + Actor35: brik + Owner: Nod + Location: 46,79 + Actor36: brik + Owner: Nod + Location: 46,78 + Actor38: brik + Owner: Nod + Location: 44,64 + Actor39: brik + Owner: Nod + Location: 45,64 + Actor40: brik + Owner: Nod + Location: 46,64 + Actor41: brik + Owner: Nod + Location: 46,65 + Actor42: brik + Owner: Nod + Location: 45,65 + Actor43: brik + Owner: Nod + Location: 50,64 + Actor44: brik + Owner: Nod + Location: 50,65 + Actor45: brik + Owner: Nod + Location: 51,65 + Actor46: brik + Owner: Nod + Location: 51,64 + Actor47: brik + Owner: Nod + Location: 52,64 + Actor48: brik + Owner: Nod + Location: 53,64 + Actor49: brik + Owner: Nod + Location: 54,64 + Actor50: brik + Owner: Nod + Location: 55,64 + Actor51: brik + Owner: Nod + Location: 56,64 + Actor52: brik + Owner: Nod + Location: 57,64 + Actor53: brik + Owner: Nod + Location: 58,64 + Actor54: brik + Owner: Nod + Location: 59,64 + Actor55: brik + Owner: Nod + Location: 59,65 + Actor56: brik + Owner: Nod + Location: 59,66 + Actor57: brik + Owner: Nod + Location: 59,67 + Actor58: brik + Owner: Nod + Location: 59,68 + Actor59: brik + Owner: Nod + Location: 58,69 + Actor60: brik + Owner: Nod + Location: 59,69 + Actor61: brik + Owner: Nod + Location: 58,68 + Actor62: brik + Owner: Nod + Location: 58,73 + Actor63: brik + Owner: Nod + Location: 59,73 + Actor64: brik + Owner: Nod + Location: 58,74 + Actor65: brik + Owner: Nod + Location: 59,74 + Actor66: brik + Owner: Nod + Location: 59,75 + Actor67: brik + Owner: Nod + Location: 59,76 + Actor68: brik + Owner: Nod + Location: 59,78 + Actor69: brik + Owner: Nod + Location: 59,77 + Actor70: brik + Owner: Nod + Location: 59,79 + Actor71: brik + Owner: Nod + Location: 59,80 + Actor72: brik + Owner: Nod + Location: 57,80 + Actor73: brik + Owner: Nod + Location: 58,80 + Actor74: brik + Owner: Nod + Location: 56,80 + Actor75: brik + Owner: Nod + Location: 55,80 + Actor76: brik + Owner: Nod + Location: 53,80 + Actor77: brik + Owner: Nod + Location: 54,80 + Actor78: brik + Owner: Nod + Location: 53,79 + Actor79: brik + Owner: Nod + Location: 54,79 + Actor80: obli + Owner: Nod + Location: 44,65 + Actor82: obli + Owner: Nod + Location: 52,65 + Actor83: obli + Owner: Nod + Location: 58,67 + Actor85: obli + Owner: Nod + Location: 58,75 + Actor86: obli + Owner: Nod + Location: 58,75 + Actor87: nuk2 + Owner: Nod + Location: 57,77 + Actor88: nuk2 + Owner: Nod + Location: 55,77 + Actor84: brik + Owner: Nod + Location: 38,73 + Actor93: brik + Owner: Nod + Location: 39,73 + Actor94: brik + Owner: Nod + Location: 38,74 + Actor95: brik + Owner: Nod + Location: 39,74 + Actor96: brik + Owner: Nod + Location: 38,75 + SouthWestObelisk2: obli + Owner: Nod + Location: 39,75 + Actor98: brik + Owner: Nod + Location: 38,76 + Actor99: nuk2 + Owner: Nod + Location: 39,76 + Actor100: nuk2 + Owner: Nod + Location: 41,76 + Actor101: nuk2 + Owner: Nod + Location: 43,76 + Actor102: brik + Owner: Nod + Location: 38,77 + Actor103: brik + Owner: Nod + Location: 38,78 + Actor104: brik + Owner: Nod + Location: 38,79 + Actor105: brik + Owner: Nod + Location: 39,79 + Actor106: brik + Owner: Nod + Location: 40,79 + Actor107: brik + Owner: Nod + Location: 41,79 + Actor108: brik + Owner: Nod + Location: 42,79 + Actor109: brik + Owner: Nod + Location: 43,79 + Actor110: brik + Owner: Nod + Location: 44,79 + Actor111: brik + Owner: Nod + Location: 45,79 + Actor112: brik + Owner: Nod + Location: 45,78 + Actor113: brik + Owner: Nod + Location: 38,64 + Actor114: brik + Owner: Nod + Location: 39,64 + Actor115: brik + Owner: Nod + Location: 38,65 + Actor116: brik + Owner: Nod + Location: 38,66 + Actor117: brik + Owner: Nod + Location: 38,67 + SouthWestObelisk1: obli + Owner: Nod + Location: 39,67 + Actor119: brik + Owner: Nod + Location: 38,68 + Actor120: brik + Owner: Nod + Location: 39,68 + Actor121: brik + Owner: Nod + Location: 38,69 + Actor122: brik + Owner: Nod + Location: 39,69 + Actor123: proc.td + Owner: Nod + Location: 41,67 + Actor124: silo.td + Owner: Nod + Location: 39,65 + Actor125: silo.td + Owner: Nod + Location: 41,65 + Actor126: nsam + Owner: Nod + Location: 41,74 + Actor128: nsam + Owner: Nod + Location: 55,74 + Actor127: gun.nod + Owner: Nod + Location: 37,69 + Actor129: gun.nod + Owner: Nod + Location: 37,73 + TurretFacing: 293 + Actor130: gun.nod + Owner: Nod + Location: 46,63 + TurretFacing: 0 + Actor131: gun.nod + Owner: Nod + Location: 50,63 + TurretFacing: 0 + Actor132: gun.nod + Owner: Nod + Location: 60,69 + TurretFacing: 935 + Actor133: gun.nod + Owner: Nod + Location: 60,73 + TurretFacing: 769 + NodSouthSubPen1: spen.nod + Owner: Nod + Location: 54,83 + NodSouthSubPen2: spen.nod + Owner: Nod + Location: 48,83 + Actor137: rep + Owner: Nod + Location: 45,72 + NodSouthAirstrip: airs + Owner: Nod + Location: 47,68 + Actor136: silo.td + Owner: Nod + Location: 57,65 + Actor143: silo.td + Owner: Nod + Location: 55,65 + NodSouthHand: hand + Owner: Nod + Location: 54,68 + Actor139: afac + Owner: Nod + Location: 49,76 + Actor142: brik + Owner: Nod + Location: 79,18 + Actor144: brik + Owner: Nod + Location: 80,18 + Actor145: brik + Owner: Nod + Location: 79,19 + Actor146: brik + Owner: Nod + Location: 80,19 + Actor147: brik + Owner: Nod + Location: 81,18 + Actor148: brik + Owner: Nod + Location: 82,18 + Actor149: brik + Owner: Nod + Location: 83,18 + Actor150: brik + Owner: Nod + Location: 84,18 + Actor151: brik + Owner: Nod + Location: 85,18 + Actor152: brik + Owner: Nod + Location: 86,18 + Actor153: brik + Owner: Nod + Location: 86,19 + Actor154: brik + Owner: Nod + Location: 85,19 + Actor155: brik + Owner: Nod + Location: 90,18 + Actor156: brik + Owner: Nod + Location: 90,19 + Actor157: brik + Owner: Nod + Location: 91,19 + Actor158: brik + Owner: Nod + Location: 91,18 + Actor159: brik + Owner: Nod + Location: 92,18 + Actor160: brik + Owner: Nod + Location: 93,18 + Actor161: brik + Owner: Nod + Location: 94,18 + Actor162: brik + Owner: Nod + Location: 95,18 + Actor163: brik + Owner: Nod + Location: 96,18 + Actor164: brik + Owner: Nod + Location: 96,19 + Actor165: brik + Owner: Nod + Location: 96,20 + Actor166: brik + Owner: Nod + Location: 96,21 + Actor167: brik + Owner: Nod + Location: 96,22 + Actor168: brik + Owner: Nod + Location: 96,23 + Actor169: brik + Owner: Nod + Location: 96,24 + Actor170: afac + Owner: Nod + Location: 93,19 + Actor171: nsam + Owner: Nod + Location: 90,21 + EastObelisk4: obli + Owner: Nod + Location: 92,19 + Actor173: brik + Owner: Nod + Location: 79,20 + Actor174: brik + Owner: Nod + Location: 79,21 + Actor175: brik + Owner: Nod + Location: 79,22 + Actor176: brik + Owner: Nod + Location: 79,23 + Actor177: brik + Owner: Nod + Location: 79,24 + Actor178: brik + Owner: Nod + Location: 79,25 + Actor179: brik + Owner: Nod + Location: 79,26 + Actor180: brik + Owner: Nod + Location: 79,27 + Actor181: brik + Owner: Nod + Location: 80,27 + Actor182: brik + Owner: Nod + Location: 80,26 + Actor183: brik + Owner: Nod + Location: 79,31 + Actor184: brik + Owner: Nod + Location: 80,31 + Actor185: brik + Owner: Nod + Location: 79,32 + Actor186: brik + Owner: Nod + Location: 80,32 + Actor187: brik + Owner: Nod + Location: 79,33 + Actor188: brik + Owner: Nod + Location: 79,34 + Actor189: brik + Owner: Nod + Location: 79,35 + Actor190: brik + Owner: Nod + Location: 79,36 + Actor191: brik + Owner: Nod + Location: 80,36 + Actor192: brik + Owner: Nod + Location: 81,36 + Actor193: brik + Owner: Nod + Location: 82,36 + Actor194: brik + Owner: Nod + Location: 83,36 + Actor195: brik + Owner: Nod + Location: 84,36 + Actor196: brik + Owner: Nod + Location: 85,36 + Actor197: brik + Owner: Nod + Location: 86,36 + Actor198: brik + Owner: Nod + Location: 86,35 + Actor199: brik + Owner: Nod + Location: 85,35 + Actor200: brik + Owner: Nod + Location: 90,35 + Actor201: brik + Owner: Nod + Location: 90,36 + Actor202: brik + Owner: Nod + Location: 91,36 + Actor203: brik + Owner: Nod + Location: 91,35 + Actor204: brik + Owner: Nod + Location: 92,36 + Actor205: brik + Owner: Nod + Location: 93,36 + Actor206: brik + Owner: Nod + Location: 94,36 + Actor207: brik + Owner: Nod + Location: 95,36 + Actor208: brik + Owner: Nod + Location: 96,36 + Actor209: brik + Owner: Nod + Location: 96,35 + Actor210: brik + Owner: Nod + Location: 96,34 + Actor211: brik + Owner: Nod + Location: 96,33 + Actor212: brik + Owner: Nod + Location: 96,32 + Actor213: brik + Owner: Nod + Location: 96,31 + Actor214: brik + Owner: Nod + Location: 96,30 + Actor215: brik + Owner: Nod + Location: 96,29 + Actor216: brik + Owner: Nod + Location: 96,28 + Actor217: brik + Owner: Nod + Location: 96,27 + Actor218: brik + Owner: Nod + Location: 96,26 + Actor219: brik + Owner: Nod + Location: 96,25 + NodEastAirstrip: airs + Owner: Nod + Location: 84,25 + NodEastHand1: hand + Owner: Nod + Location: 83,31 + Actor222: obli + Owner: Nod + Location: 80,33 + Actor223: obli + Owner: Nod + Location: 80,25 + EastObelisk3: obli + Owner: Nod + Location: 84,19 + EastObelisk1: obli + Owner: Nod + Location: 84,35 + EastObelisk2: obli + Owner: Nod + Location: 92,35 + Actor227: hq + Owner: Nod + Location: 94,33 + Actor228: nuk2 + Owner: Nod + Location: 94,30 + Actor229: nuk2 + Owner: Nod + Location: 94,27 + Actor230: nuk2 + Owner: Nod + Location: 94,24 + Actor231: proc.td + Owner: Nod + Location: 90,23 + Actor232: silo.td + Owner: Nod + Location: 81,19 + Actor233: silo.td + Owner: Nod + Location: 80,21 + Actor234: silo.td + Owner: Nod + Location: 83,21 + Actor235: nuk2 + Owner: Nod + Location: 91,28 + NodEastHand2: hand + Owner: Nod + Location: 86,30 + Actor237: gun.nod + Owner: Nod + Location: 78,27 + Actor238: gun.nod + Owner: Nod + Location: 78,31 + Actor239: gun.nod + Owner: Nod + Location: 86,37 + Actor240: gun.nod + Owner: Nod + Location: 90,37 + Actor241: gun.nod + Owner: Nod + Location: 86,17 + Actor242: gun.nod + Owner: Nod + Location: 90,17 + Actor245: split2 + Owner: Neutral + Location: 91,5 + Actor243: split2 + Owner: Neutral + Location: 92,13 + Actor244: nsam + Owner: Nod + Location: 80,35 + Turret4: gun.nod + Owner: Nod + Location: 36,43 + TurretFacing: 785 + Turret1: gun.nod + Owner: Nod + Location: 30,42 + TurretFacing: 325 + Actor248: rock3 + Owner: Neutral + Location: 33,40 + Actor249: t09 + Owner: Neutral + Location: 36,42 + Actor250: t04 + Owner: Neutral + Location: 31,41 + Actor253: gun.nod + Owner: Nod + Location: 59,29 + Actor254: gun.nod + Owner: Nod + Location: 60,24 + Actor251: gun.nod + Owner: Nod + Location: 57,36 + Actor255: split2 + Owner: Neutral + Location: 28,81 + Actor256: split2 + Owner: Neutral + Location: 36,81 + Turret2: gun.nod + Owner: Nod + Location: 31,32 + TurretFacing: 348 + Turret3: gun.nod + Owner: Nod + Location: 35,28 + TurretFacing: 0 + Church1: v25 + Location: 65,2 + Owner: Neutral + Actor260: v24 + Owner: Neutral + Location: 61,1 + Actor261: v26 + Owner: Neutral + Location: 57,4 + Actor262: v29 + Owner: Neutral + Location: 65,6 + Actor263: v27 + Owner: Neutral + Location: 69,4 + Actor264: v20 + Owner: Neutral + Location: 53,1 + Actor265: v23 + Owner: Neutral + Location: 59,5 + Actor266: c8 + Owner: Neutral + Facing: 384 + Location: 65,5 + SubCell: 3 + Actor267: c8 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 56,3 + Actor268: tecn + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 60,2 + Actor269: c10 + Owner: Neutral + SubCell: 3 + Facing: 384 + Location: 67,2 + Actor270: c5 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 68,6 + Actor271: tc01 + Owner: Neutral + Location: 51,9 + Actor272: t09 + Owner: Neutral + Location: 57,14 + Actor273: v22 + Owner: Neutral + Location: 64,14 + Actor274: v21 + Owner: Neutral + Location: 58,11 + Actor275: v34 + Owner: Neutral + Location: 56,9 + Actor276: v31 + Owner: Neutral + Location: 50,7 + Actor277: rock4 + Owner: Neutral + Location: 67,12 + Actor278: t08 + Owner: Neutral + Location: 52,20 + Actor279: tc01 + Owner: Neutral + Location: 39,24 + Actor280: split2 + Owner: Neutral + Location: 9,19 + Actor281: split2 + Owner: Neutral + Location: 18,40 + Actor282: split2 + Owner: Neutral + Location: 24,45 + Church2: v25 + Owner: Neutral + Location: 18,69 + Actor284: v20 + Owner: Neutral + Location: 16,72 + Actor285: v22 + Owner: Neutral + Location: 12,71 + Actor286: v21 + Owner: Neutral + Location: 24,73 + Actor287: v24 + Owner: Neutral + Location: 19,65 + Actor288: v29 + Owner: Neutral + Location: 23,67 + Actor289: v31 + Owner: Neutral + Location: 27,70 + Actor290: v26 + Owner: Neutral + Location: 28,65 + Actor291: t08 + Owner: Neutral + Location: 23,72 + Actor292: t18 + Owner: Neutral + Location: 10,73 + Actor293: v36 + Owner: Neutral + Location: 15,67 + Actor294: v14 + Owner: Neutral + Location: 27,71 + Actor295: v30 + Owner: Neutral + Location: 25,68 + Actor296: t09 + Owner: Neutral + Location: 24,70 + Actor297: t04 + Owner: Neutral + Location: 20,63 + Actor298: v16 + Owner: Neutral + Location: 13,77 + Actor299: v09 + Owner: Neutral + Location: 15,70 + Actor300: c10 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 17,71 + Actor301: c8 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 13,72 + Actor302: c8 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 26,71 + Actor303: c5 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 27,65 + Actor304: c5 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 16,67 + Actor305: c4 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 14,75 + ResearchLab: bio + Owner: Nod + Location: 82,71 + Actor307: rock6 + Owner: Neutral + Faction: blackh + Location: 84,66 + Actor308: rock4 + Owner: Neutral + Faction: blackh + Location: 83,81 + LabObelisk2: obli + Owner: Nod + Location: 78,80 + Actor310: obli + Owner: Nod + Location: 77,65 + LabObelisk1: obli + Owner: Nod + Location: 76,74 + Actor312: obli + Owner: Nod + Location: 87,83 + Actor313: obli + Owner: Nod + Location: 87,65 + Actor314: obli + Owner: Nod + Location: 70,61 + Actor315: obli + Owner: Nod + Location: 69,78 + Actor316: chain + Owner: Nod + Location: 81,73 + Actor319: chain + Owner: Nod + Location: 84,73 + Actor317: chain + Owner: Nod + Location: 82,73 + Actor318: nsam + Owner: Nod + Location: 80,67 + Actor320: nsam + Owner: Nod + Location: 85,81 + Actor321: nsam + Owner: Nod + Location: 87,61 + Actor322: nsam + Owner: Nod + Location: 74,58 + Actor323: nsam + Owner: Nod + Location: 73,88 + Actor324: nsam + Owner: Nod + Location: 76,82 + Actor328: nuk2 + Owner: Nod + Location: 68,92 + Actor329: nuk2 + Owner: Nod + Location: 70,92 + Actor330: nuk2 + Owner: Nod + Location: 72,92 + Actor331: chain + Owner: Nod + Location: 67,95 + Actor332: chain + Owner: Nod + Location: 67,94 + Actor333: chain + Owner: Nod + Location: 67,93 + Actor334: chain + Owner: Nod + Location: 67,92 + Actor335: chain + Owner: Nod + Location: 67,91 + Actor336: chain + Owner: Nod + Location: 69,91 + Actor337: chain + Owner: Nod + Location: 68,91 + Actor338: chain + Owner: Nod + Location: 70,91 + Actor339: chain + Owner: Nod + Location: 71,91 + Actor340: chain + Owner: Nod + Location: 72,91 + Actor341: chain + Owner: Nod + Location: 73,91 + Actor342: chain + Owner: Nod + Location: 74,91 + Actor343: chain + Owner: Nod + Location: 74,92 + Actor344: chain + Owner: Nod + Location: 74,93 + Actor345: chain + Owner: Nod + Location: 74,94 + Actor346: chain + Owner: Nod + Location: 74,95 + Actor347: chain + Owner: Nod + Location: 68,95 + Actor348: chain + Owner: Nod + Location: 69,95 + Actor349: chain + Owner: Nod + Location: 70,95 + Actor350: chain + Owner: Nod + Location: 71,95 + Actor351: chain + Owner: Nod + Location: 72,95 + Actor352: chain + Owner: Nod + Location: 73,95 + Actor353: chain + Owner: Nod + Location: 94,80 + Actor354: chain + Owner: Nod + Location: 93,80 + Actor355: chain + Owner: Nod + Location: 92,80 + Actor356: chain + Owner: Nod + Location: 92,81 + Actor357: chain + Owner: Nod + Location: 92,82 + Actor358: chain + Owner: Nod + Location: 92,83 + Actor359: chain + Owner: Nod + Location: 92,84 + Actor360: chain + Owner: Nod + Location: 92,85 + Actor361: chain + Owner: Nod + Location: 92,86 + Actor362: chain + Owner: Nod + Location: 92,87 + Actor363: chain + Owner: Nod + Location: 92,88 + Actor364: chain + Owner: Nod + Location: 92,89 + Actor365: chain + Owner: Nod + Location: 92,90 + Actor366: chain + Owner: Nod + Location: 93,90 + NodQuarryHand: hand + Owner: Nod + Location: 79,91 + Actor368: ltur + Owner: Nod + Location: 78,90 + NodQuarryAirstrip: airs + Owner: Nod + Location: 84,88 + NodHelipad3: hpad.td + Owner: Nod + Location: 77,46 + NodHelipad2: hpad.td + Owner: Nod + Location: 74,46 + NodHelipad1: hpad.td + Owner: Nod + Location: 71,46 + Actor373: tmpl + Owner: Nod + Location: 91,73 + Actor374: nsam + Owner: Nod + Location: 93,79 + Actor375: nsam + Owner: Nod + Location: 94,53 + Actor377: obli + Owner: Nod + Location: 91,56 + Actor376: chain + Owner: Nod + Location: 70,45 + Actor378: chain + Owner: Nod + Location: 71,45 + Actor379: chain + Owner: Nod + Location: 72,45 + Actor380: chain + Owner: Nod + Location: 73,45 + Actor381: chain + Owner: Nod + Location: 74,45 + Actor382: chain + Owner: Nod + Location: 76,45 + Actor383: chain + Owner: Nod + Location: 75,45 + Actor384: chain + Owner: Nod + Location: 77,45 + Actor385: chain + Owner: Nod + Location: 78,45 + Actor386: chain + Owner: Nod + Location: 79,45 + Actor387: chain + Owner: Nod + Location: 79,46 + Actor388: chain + Owner: Nod + Location: 79,47 + Actor389: chain + Owner: Nod + Location: 79,48 + Actor390: chain + Owner: Nod + Location: 70,48 + Actor391: chain + Owner: Nod + Location: 70,47 + Actor392: chain + Owner: Nod + Location: 70,46 + Actor393: hand + Owner: Nod + Location: 63,44 + Actor394: nsam + Owner: Nod + Location: 67,42 + Actor395: obli + Owner: Nod + Location: 70,43 + Actor396: gun.nod + Owner: Nod + Location: 63,49 + Actor397: t18 + Owner: Neutral + Location: 75,54 + Actor398: nuk2 + Owner: Nod + Location: 70,51 + Actor400: nuk2 + Owner: Nod + Location: 68,45 + Actor399: obli + Owner: Nod + Location: 68,54 + Actor401: gun.nod + Owner: Nod + Location: 65,55 + Actor402: gun.nod + Owner: Nod + Location: 22,59 + TurretFacing: 55 + Actor403: gun.nod + Owner: Nod + Location: 33,56 + TurretFacing: 95 + RiverTurret1: gun.nod + Owner: Nod + Location: 27,56 + TurretFacing: 0 + Actor405: chain + Owner: Nod + Location: 89,77 + Actor406: chain + Owner: Nod + Location: 89,76 + Actor409: chain + Owner: Nod + Location: 89,73 + Actor410: chain + Owner: Nod + Location: 89,72 + Actor407: nuk2 + Owner: Nod + Location: 91,31 + Actor408: nuk2 + Owner: Nod + Location: 72,51 + Actor411: nuk2 + Owner: Nod + Location: 52,72 + Actor412: nuk2 + Owner: Nod + Location: 50,72 + SouthWestObelisk3: obli + Owner: Nod + Location: 46,77 + Actor415: gun.nod + Owner: Nod + Location: 65,88 + Actor414: ltur + Owner: Nod + Location: 63,89 + Actor416: n1 + Owner: Nod + SubCell: 3 + Location: 21,59 + Facing: 1023 + Actor417: n1 + Owner: Nod + SubCell: 3 + Location: 28,56 + Facing: 158 + Actor418: n1 + Owner: Nod + SubCell: 3 + Facing: 1023 + Location: 35,53 + Actor419: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 78,32 + Actor420: n3 + Owner: Nod + SubCell: 3 + Location: 81,22 + Facing: 237 + Actor421: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 90,29 + Actor422: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 90,56 + Actor423: n3 + Owner: Nod + SubCell: 3 + Location: 86,69 + Facing: 650 + Actor424: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 78,83 + Actor425: n3 + Owner: Nod + Location: 66,92 + SubCell: 3 + Facing: 237 + Actor426: n3 + Owner: Nod + SubCell: 3 + Location: 56,76 + Facing: 0 + Actor427: n3 + Owner: Nod + SubCell: 3 + Location: 42,66 + Facing: 610 + Actor428: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 56,66 + Actor429: n3 + Owner: Nod + SubCell: 3 + Location: 54,44 + Facing: 71 + Actor430: n3 + Owner: Nod + SubCell: 3 + Location: 68,51 + Facing: 222 + Actor431: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 80,55 + Actor432: n3 + Owner: Nod + Facing: 384 + Location: 65,13 + SubCell: 3 + Actor435: bggy + Owner: Nod + Facing: 384 + Location: 61,13 + Actor436: ftnk + Owner: Nod + Facing: 384 + Location: 69,48 + Actor437: ftnk + Owner: Nod + Location: 80,60 + Facing: 245 + Actor438: stnk.nod + Owner: Nod + Location: 68,68 + Facing: 158 + Stance: Defend + Actor439: stnk.nod + Owner: Nod + Location: 67,72 + Facing: 158 + Stance: Defend + Actor440: mlrs + Owner: Nod + Location: 81,82 + Facing: 384 + Actor441: mlrs + Owner: Nod + Location: 79,65 + Facing: 245 + Actor442: mlrs + Owner: Nod + Location: 71,63 + Facing: 261 + Actor443: mlrs + Owner: Nod + Location: 70,76 + Facing: 150 + Actor444: ltnk + Owner: Nod + Location: 73,70 + Facing: 261 + LTPatroller1: ltnk + Owner: Nod + Location: 43,57 + Facing: 777 + LTPatroller2: ltnk + Owner: Nod + Location: 45,57 + Facing: 769 + Actor433: gun.nod + Owner: Nod + Location: 71,16 + TurretFacing: 364 + Actor434: n1 + Owner: Nod + SubCell: 3 + Location: 70,77 + Facing: 111 + Actor447: n1 + Owner: Nod + SubCell: 3 + Location: 70,75 + Facing: 71 + Actor448: n1 + Owner: Nod + SubCell: 3 + Location: 73,71 + Facing: 253 + Actor449: n1 + Owner: Nod + Location: 73,71 + SubCell: 1 + Facing: 229 + Actor450: n1 + Owner: Nod + Location: 73,69 + SubCell: 3 + Facing: 158 + Actor451: n1 + Owner: Nod + Location: 68,67 + SubCell: 3 + Facing: 174 + Actor452: n1 + Owner: Nod + Location: 68,72 + SubCell: 3 + Facing: 118 + Actor453: n1 + Owner: Nod + SubCell: 3 + Location: 67,73 + Facing: 134 + Actor454: n1 + Owner: Nod + SubCell: 3 + Location: 60,74 + Facing: 880 + Actor455: n1 + Owner: Nod + Facing: 384 + Location: 57,69 + SubCell: 3 + Actor456: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 44,66 + Actor457: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 47,78 + Actor458: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 52,79 + Actor459: n1 + Owner: Nod + Facing: 384 + Location: 47,78 + SubCell: 1 + Actor460: n1 + Owner: Nod + SubCell: 3 + Location: 36,74 + Facing: 285 + Actor461: n1 + Owner: Nod + Location: 37,68 + SubCell: 3 + Facing: 245 + Actor462: n1 + Owner: Nod + Location: 37,68 + SubCell: 1 + Facing: 118 + Actor463: n1 + Owner: Nod + SubCell: 3 + Location: 36,64 + Facing: 118 + Actor464: n1 + Owner: Nod + SubCell: 3 + Location: 51,55 + Facing: 586 + Actor465: nsam + Owner: Nod + Location: 49,51 + Actor466: n1 + Owner: Nod + SubCell: 3 + Location: 69,52 + Facing: 475 + Actor467: n1 + Owner: Nod + Facing: 384 + Location: 69,52 + SubCell: 1 + Actor468: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 65,44 + Actor469: n1 + Owner: Nod + Location: 81,55 + SubCell: 3 + Facing: 626 + Actor470: n1 + Owner: Nod + Facing: 384 + Location: 80,55 + SubCell: 1 + Actor471: n1 + Owner: Nod + SubCell: 3 + Location: 74,52 + Facing: 737 + Actor472: n1 + Owner: Nod + SubCell: 3 + Location: 76,46 + Facing: 642 + Actor473: n1 + Owner: Nod + Location: 73,47 + SubCell: 3 + Facing: 384 + Actor474: n1 + Owner: Nod + SubCell: 3 + Location: 82,48 + Facing: 793 + Actor475: n1 + Owner: Nod + SubCell: 3 + Location: 87,37 + Facing: 650 + Actor476: n1 + Owner: Nod + SubCell: 3 + Location: 85,37 + Facing: 507 + Actor477: n1 + Owner: Nod + Facing: 384 + Location: 85,37 + SubCell: 1 + Actor478: n1 + Owner: Nod + SubCell: 3 + Location: 92,38 + Facing: 222 + Actor479: n1 + Owner: Nod + SubCell: 3 + Location: 78,26 + Facing: 126 + Actor480: n1 + Owner: Nod + SubCell: 3 + Location: 72,16 + Facing: 222 + Actor481: n1 + Owner: Nod + Facing: 384 + Location: 72,16 + SubCell: 1 + Actor482: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 62,8 + Actor483: n1 + Owner: Nod + SubCell: 3 + Location: 66,6 + Facing: 499 + Actor484: n1 + Owner: Nod + SubCell: 3 + Location: 55,3 + Facing: 689 + Actor485: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 57,10 + Actor486: n1 + Owner: Nod + SubCell: 3 + Location: 63,14 + Facing: 475 + Actor487: n1 + Owner: Nod + SubCell: 3 + Location: 28,66 + Facing: 0 + Actor488: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 23,68 + Actor489: n1 + Owner: Nod + SubCell: 3 + Location: 18,66 + Facing: 864 + Actor490: n1 + Owner: Nod + SubCell: 3 + Location: 28,71 + Facing: 166 + Actor491: n1 + Owner: Nod + SubCell: 3 + Location: 42,48 + Facing: 71 + Actor492: n1 + Owner: Nod + SubCell: 3 + Location: 33,35 + Facing: 483 + Actor493: n1 + Owner: Nod + Facing: 384 + Location: 33,35 + SubCell: 1 + Actor495: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 83,12 + Actor496: n1 + Owner: Nod + SubCell: 3 + Location: 81,10 + Facing: 198 + Actor497: n1 + Owner: Nod + SubCell: 3 + Location: 84,10 + Facing: 555 + Actor498: n3 + Owner: Nod + Facing: 384 + Location: 84,10 + SubCell: 1 + Actor499: n4 + Owner: Nod + SubCell: 3 + Location: 84,12 + Facing: 547 + Actor500: n4 + Owner: Nod + SubCell: 3 + Location: 34,56 + Facing: 134 + Actor501: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 49,53 + Actor502: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 51,52 + Actor503: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 73,67 + Actor504: n4 + Owner: Nod + SubCell: 3 + Location: 75,82 + Facing: 103 + Actor505: n4 + Owner: Nod + SubCell: 3 + Location: 93,76 + Facing: 563 + Actor506: n4 + Owner: Nod + SubCell: 3 + Location: 93,63 + Facing: 229 + Actor507: n4 + Owner: Nod + SubCell: 3 + Location: 81,63 + Facing: 118 + Actor508: n4 + Owner: Nod + Location: 82,48 + SubCell: 1 + Facing: 634 + Actor509: n4 + Owner: Nod + Facing: 384 + Location: 92,38 + SubCell: 1 + Actor510: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 92,22 + Actor511: ss2 + Owner: Nod + Location: 45,88 + Facing: 245 + Actor512: ss2 + Owner: Nod + Location: 49,90 + Facing: 277 + Actor513: ss2 + Owner: Nod + Location: 54,91 + Facing: 277 + Actor514: ss2 + Owner: Nod + Location: 47,94 + Facing: 261 + Actor515: sb + Owner: Nod + Location: 15,94 + Facing: 111 + Actor516: sb + Owner: Nod + Location: 19,93 + Facing: 111 + Actor520: ss2 + Owner: Nod + Location: 16,83 + Facing: 142 + Actor523: ss2 + Owner: Nod + Location: 10,62 + Facing: 0 + Actor524: ss2 + Owner: Nod + Location: 2,58 + Facing: 0 + Actor525: ss2 + Owner: Nod + Location: 3,43 + Facing: 0 + Actor527: ss2 + Owner: Nod + Location: 9,46 + Facing: 0 + Actor528: sb + Owner: Nod + Location: 9,65 + Facing: 0 + Actor530: sb + Owner: Nod + Location: 9,55 + Facing: 0 + Actor531: ltnk + Owner: Nod + Location: 75,29 + Facing: 261 + Actor532: ltnk + Owner: Nod + Location: 77,37 + Facing: 380 + Actor533: ltnk + Owner: Nod + Location: 82,14 + Facing: 261 + Actor534: ltnk + Owner: Nod + Location: 34,69 + Facing: 103 + Actor535: ltnk + Owner: Nod + Location: 63,59 + Facing: 111 + Actor536: ltnk + Owner: Nod + Location: 61,60 + Facing: 118 + Actor537: ftnk + Owner: Nod + Location: 30,62 + Facing: 0 + Actor538: bggy + Owner: Nod + Location: 54,43 + Facing: 245 + Actor539: ltnk + Owner: Nod + Location: 77,88 + Facing: 134 + Actor540: ltnk + Owner: Nod + Location: 81,59 + Facing: 253 + Actor541: ltnk + Owner: Nod + Facing: 384 + Location: 59,45 + Actor542: ltnk + Owner: Nod + Location: 60,18 + Facing: 245 + Actor543: n1 + Owner: Nod + Location: 60,17 + SubCell: 3 + Facing: 222 + Actor544: n1 + Owner: Nod + SubCell: 3 + Location: 61,19 + Facing: 261 + Actor545: tc01 + Owner: Neutral + Location: 54,56 + Actor546: t08 + Owner: Neutral + Location: 58,35 + Actor547: t08 + Owner: Neutral + Location: 48,47 + Actor548: t09 + Owner: Neutral + Location: 19,53 + Actor549: t09 + Owner: Neutral + Location: 68,57 + Actor550: t04 + Owner: Neutral + Location: 63,40 + Actor551: t04 + Owner: Neutral + Location: 74,20 + Actor552: n3 + SubCell: 3 + Location: 79,70 + Faction: england + Facing: 594 + Owner: Nod + Actor553: n3 + Location: 79,70 + SubCell: 1 + Faction: england + Facing: 158 + Owner: Nod + Actor554: n3 + SubCell: 3 + Location: 84,76 + Faction: england + Facing: 384 + Owner: Nod + Actor555: n3 + Owner: Nod + SubCell: 3 + Location: 74,70 + Facing: 384 + Actor556: n3 + Owner: Nod + Location: 74,70 + SubCell: 1 + Facing: 261 + Actor557: rmbc + Owner: Nod + SubCell: 3 + Location: 90,72 + Facing: 0 + Actor558: rmbc + Owner: Nod + SubCell: 3 + Location: 92,77 + Facing: 491 + Actor559: rmbc + Owner: Nod + SubCell: 3 + Location: 93,70 + Facing: 87 + Actor560: rmbc + Owner: Nod + SubCell: 3 + Location: 90,75 + Facing: 384 + Actor561: rmbc + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 82,75 + Actor562: bh + Owner: Nod + SubCell: 3 + Location: 73,73 + Facing: 190 + Actor563: bh + Owner: Nod + SubCell: 3 + Location: 91,76 + Facing: 459 + Actor564: bh + Owner: Nod + SubCell: 3 + Location: 90,73 + Facing: 356 + Actor565: bh + Owner: Nod + SubCell: 3 + Location: 92,71 + Facing: 47 + Actor568: tplr + Owner: Nod + Location: 78,88 + SubCell: 1 + Facing: 126 + Actor569: tplr + Owner: Nod + Location: 77,89 + SubCell: 1 + Facing: 103 + Actor566: n1c + Owner: Nod + Location: 76,88 + SubCell: 3 + Facing: 126 + Actor567: n3c + Owner: Nod + SubCell: 3 + Location: 79,89 + Facing: 245 + Actor570: mlrs + Owner: Nod + Facing: 150 + Location: 40,66 + Actor571: mlrs + Owner: Nod + Facing: 261 + Location: 80,23 + Actor572: ltnk + Owner: Nod + Location: 83,50 + Facing: 0 + Actor573: ltnk + Owner: Nod + Location: 75,27 + Facing: 261 + Actor574: ltnk + Owner: Nod + Location: 21,52 + Facing: 0 + Actor576: bggy + Owner: Nod + Facing: 384 + Location: 54,30 + Actor577: bggy + Owner: Nod + Facing: 384 + Location: 52,32 + Actor578: bggy + Owner: Nod + Location: 41,48 + Facing: 0 + LeftAttack1: waypoint + Owner: Neutral + Location: 30,71 + LeftAttack2: waypoint + Owner: Neutral + Location: 20,44 + MiddleAttack1: waypoint + Owner: Neutral + Location: 48,59 + MiddleAttack3: waypoint + Owner: Neutral + Location: 36,37 + LTPatrol4: waypoint + Owner: Neutral + Location: 57,45 + RightAttack1: waypoint + Owner: Neutral + Location: 70,29 + RightAttack2: waypoint + Owner: Neutral + Location: 55,18 + LeftAttack3: waypoint + Owner: Neutral + Location: 18,28 + RightAttack3: waypoint + Owner: Neutral + Location: 36,15 + LTPatrol1: waypoint + Owner: Neutral + Location: 51,57 + LTPatrol2: waypoint + Owner: Neutral + Location: 53,59 + LTPatrol3: waypoint + Owner: Neutral + Location: 57,59 + MiddleAttack2: waypoint + Owner: Neutral + Location: 56,46 + LTPatrol5: waypoint + Owner: Neutral + Location: 51,43 + LTPatrol6: waypoint + Owner: Neutral + Location: 45,41 + LTPatrol7: waypoint + Owner: Neutral + Location: 35,37 + LTPatrol8: waypoint + Owner: Neutral + Location: 23,38 + LTPatrol9: waypoint + Owner: Neutral + Location: 21,42 + LTPatrol10: waypoint + Owner: Neutral + Location: 21,49 + LTPatrol11: waypoint + Owner: Neutral + Location: 24,50 + LTPatrol12: waypoint + Owner: Neutral + Location: 24,55 + LTPatrol13: waypoint + Owner: Neutral + Location: 40,56 + McvEntry: waypoint + Location: 11,1 + Faction: germany + Owner: Neutral + McvLanding: waypoint + Location: 15,9 + Faction: germany + Owner: Neutral + McvRally: waypoint + Location: 15,14 + Faction: germany + Owner: Neutral + EastPatrol3: waypoint + Owner: Neutral + Location: 61,40 + EastPatrol4: waypoint + Owner: Neutral + Location: 94,44 + EastPatrol2: waypoint + Owner: Neutral + Location: 70,34 + EastPatrol1: waypoint + Owner: Neutral + Location: 69,22 + EastPatroller2: n1 + Owner: Nod + SubCell: 3 + Location: 68,22 + Facing: 384 + EastPatroller3: n1 + Owner: Nod + Location: 68,22 + SubCell: 1 + Facing: 384 + EastPatroller5: n1 + Owner: Nod + Location: 69,21 + SubCell: 3 + Facing: 384 + EastPatroller6: n1 + Owner: Nod + Location: 68,20 + SubCell: 3 + Facing: 384 + EastPatroller1: n3 + Owner: Nod + SubCell: 3 + Location: 69,23 + Facing: 384 + EastPatroller4: n3 + Owner: Nod + Location: 68,21 + SubCell: 3 + Facing: 384 + EastPatroller7: n4 + Owner: Nod + SubCell: 3 + Location: 67,19 + Facing: 384 + SouthPatroller4: n5 + Owner: Nod + SubCell: 3 + Location: 64,85 + Facing: 384 + SouthPatroller3: n5 + Owner: Nod + SubCell: 3 + Location: 65,84 + Facing: 384 + SouthPatroller1: n5 + Owner: Nod + Location: 64,83 + SubCell: 3 + Facing: 384 + SouthPatroller2: n5 + Owner: Nod + Location: 65,84 + SubCell: 1 + Facing: 384 + SouthPatrol1: waypoint + Owner: Neutral + Location: 65,85 + SouthPatrol2: waypoint + Owner: Neutral + Location: 63,61 + NodNavalAttack1: waypoint + Owner: Neutral + Location: 41,91 + NodNavalAttack2: waypoint + Owner: Neutral + Location: 14,90 + NodNavalAttack3: waypoint + Owner: Neutral + Location: 4,75 + NodNavalAttack4: waypoint + Owner: Neutral + Location: 5,49 + NodNavalAttack5: waypoint + Owner: Neutral + Location: 3,29 + NodNavalAttack6: waypoint + Owner: Neutral + Location: 8,5 + Actor592: stnk.nod + Owner: Nod + Location: 76,59 + Facing: 384 + Stance: Defend + Actor593: stnk.nod + Owner: Nod + Location: 93,61 + Facing: 384 + Stance: Defend + Actor594: stnk.nod + Owner: Nod + Location: 91,87 + Facing: 384 + Stance: Defend + Actor595: stnk.nod + Owner: Nod + Location: 65,91 + Stance: Defend + Facing: 384 + Actor596: stnk.nod + Owner: Nod + Location: 54,76 + Facing: 384 + Stance: Defend + Actor597: stnk.nod + Owner: Nod + Location: 21,69 + Facing: 1023 + Stance: Defend + Actor598: hpad.td + Owner: Nod + Location: 74,9 + Actor599: hpad.td + Owner: Nod + Location: 16,64 + Actor600: tplr + Owner: Nod + SubCell: 1 + Facing: 126 + Location: 79,86 + Actor601: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 48,51 + Actor602: n3 + Owner: Nod + SubCell: 3 + Location: 35,57 + Facing: 0 + Actor603: n3 + Owner: Nod + SubCell: 3 + Location: 29,60 + Facing: 87 + Actor604: n3 + Owner: Nod + SubCell: 3 + Location: 18,64 + Facing: 0 + Actor605: n3 + Owner: Nod + SubCell: 3 + Location: 15,65 + Facing: 721 + Actor606: n3 + Owner: Nod + SubCell: 3 + Location: 63,47 + Facing: 103 + Actor607: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 61,49 + Actor608: n3 + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 61,32 + Actor609: n3 + Owner: Nod + Facing: 384 + Location: 51,9 + SubCell: 3 + Actor610: n3 + Owner: Nod + SubCell: 3 + Location: 73,12 + Facing: 222 + Actor611: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 75,13 + Actor612: n3 + Owner: Nod + SubCell: 3 + Location: 77,9 + Facing: 277 + Actor613: n3 + Owner: Nod + Facing: 384 + Location: 83,19 + SubCell: 3 + Actor614: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 82,35 + Actor615: n3 + Owner: Nod + Location: 94,35 + SubCell: 3 + Facing: 531 + Actor616: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 92,33 + Actor617: n3 + Owner: Nod + SubCell: 3 + Location: 71,60 + Facing: 118 + Actor618: n3 + Owner: Nod + SubCell: 3 + Location: 68,58 + Facing: 206 + Actor619: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 64,89 + Actor620: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 60,82 + Actor621: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 53,39 + Actor622: n3 + Owner: Nod + SubCell: 3 + Location: 55,31 + Facing: 214 + Actor623: camera + Owner: Nod + Location: 22,42 + Actor624: camera + Owner: Nod + Location: 33,15 + Actor625: camera + Owner: Nod + Location: 26,26 + Actor626: camera + Owner: Nod + Location: 15,19 + Actor627: camera + Owner: Nod + Location: 48,19 + Actor628: camera + Owner: Nod + Location: 41,41 + Actor629: camera + Owner: Nod + Location: 70,70 + Actor630: camera + Owner: Nod + Location: 64,51 + Actor631: mlrs + Owner: Nod + Location: 65,45 + Facing: 404 + Actor632: mlrs + Owner: Nod + Facing: 404 + Location: 80,34 + Actor325: nuk2 + Owner: Nod + Location: 93,87 + Actor326: nuk2 + Owner: Nod + Location: 93,84 + Actor327: nuk2 + Owner: Nod + Location: 93,81 + Actor633: nuke + Owner: Nod + Location: 93,94 + Actor634: split2 + Owner: Neutral + Location: 45,13 + Actor635: split2 + Owner: Neutral + Location: 49,33 + Actor636: split2 + Owner: Neutral + Location: 51,29 + EastBoundary: waypoint + Owner: Neutral + Location: 49,19 + Actor637: n1 + Owner: Nod + SubCell: 3 + Facing: 95 + Location: 48,22 + Actor638: n1 + Owner: Nod + SubCell: 3 + Location: 48,17 + Facing: 444 + Actor639: bggy + Owner: Nod + Facing: 911 + Location: 19,44 + EntranceReveal1: waypoint + Owner: Neutral + Location: 78,29 + EntranceReveal3: waypoint + Owner: Neutral + Location: 48,63 + EntranceReveal4: waypoint + Owner: Neutral + Location: 37,71 + EntranceReveal2: waypoint + Owner: Neutral + Location: 88,37 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-coalitions.yaml, machinations-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/main-campaign/ca06-machinations/r_nodalerted.aud b/mods/ca/missions/main-campaign/ca06-machinations/r_nodalerted.aud new file mode 100644 index 0000000000..7e972ce71d Binary files /dev/null and b/mods/ca/missions/main-campaign/ca06-machinations/r_nodalerted.aud differ diff --git a/mods/ca/missions/main-campaign/ca07-conspiracy/conspiracy-rules.yaml b/mods/ca/missions/main-campaign/ca07-conspiracy/conspiracy-rules.yaml new file mode 100644 index 0000000000..e9960bb285 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca07-conspiracy/conspiracy-rules.yaml @@ -0,0 +1,95 @@ +^Palettes: + TintPostProcessEffect: + +World: + LuaScript: + Scripts: campaign.lua, conspiracy.lua + MissionData: + Briefing: The Allied attack on our research facility in North Africa happened more swiftly than anticipated. While most of our assets were safely removed, two highly valued researchers were captured.\n\nWhile I have no reason to doubt their loyalty to the Brotherhood, their captivity is unacceptable. Any information falling into enemy hands jeopardizes our mission.\n\nYour objective is two-fold. A GDI base exists close to where the researchers are currently being held. One of our sleeper cells recently moved into position there and is poised to take control of the base. Take a small force to distract and weaken the GDI forces, and when the time is right our brothers will make their allegiance known.\n\nWith the base under our control, locate our captured brethren and bring them home.\n\nEven if the Allies don't suspect GDI of outright treachery, the fact that they were so deeply compromised will surely make the Allies reconsider how closely they cooperate in future. + MapOptions: + ShortGameCheckboxEnabled: False + MusicPlaylist: + StartingMusic: nomercy + +Player: + PlayerResources: + DefaultCash: 6000 + +# Disable tech + +MSLO.Nod: + Inherits@CAMPAIGNDISABLED: ^Disabled + +ENLI: + Inherits@CAMPAIGNDISABLED: ^Disabled + +RMBC: + Inherits@CAMPAIGNDISABLED: ^Disabled + +TMPP: + Inherits@CAMPAIGNDISABLED: ^Disabled + +cyborgarmor.upgrade: + Inherits@CAMPAIGNDISABLED: ^Disabled + +cyborgspeed.upgrade: + Inherits@CAMPAIGNDISABLED: ^Disabled + +# Misc + +## Remove Nod logo from Legion Conyard + +AFAC: + RenderSprites: + -FactionImages: + +CHAN: + -Wanders: + Selectable: + -Class: + Mobile: + Speed: 54 + Tooltip: + Name: Nod Researcher + -Valued: + Health: + HP: 15000 + +MOEBIUS: + Tooltip: + Name: Nod Researcher + Voiced: + VoiceSet: CivilianMaleVoice + -Valued: + Health: + HP: 15000 + +HQ: + SpawnActorPowerCA@sathack: + LifeTime: 75 + ChargeInterval: 4500 + +HOSP: + Inherits@HACKABLE: ^Hackable + -GrantConditionOnPrerequisite@OwnedByAi: + -PeriodicProducerCA@MEDIC: + -PeriodicProducerCA@REJUVENATOR: + -GrantConditionIfOwnerIsNeutral: + -GrantConditionOnPrerequisite@SCRIN: + -RallyPoint: + TooltipExtras: + Description: When controlled, heals nearby infantry. + -TooltipDescription@ally: + -TooltipDescription@other: + +HOSP.Rebuilt: + -PeriodicProducerCA@MEDIC: + -PeriodicProducerCA@REJUVENATOR: + +WEAT: + Power: + Amount: 0 + +# Hunt() requires only 1 AttackBase +BATF.AI: + -AttackFrontal: diff --git a/mods/ca/missions/main-campaign/ca07-conspiracy/conspiracy-weapons.yaml b/mods/ca/missions/main-campaign/ca07-conspiracy/conspiracy-weapons.yaml new file mode 100644 index 0000000000..83d5a5107d --- /dev/null +++ b/mods/ca/missions/main-campaign/ca07-conspiracy/conspiracy-weapons.yaml @@ -0,0 +1,18 @@ +HonestJohn: + Warhead@1Dam: SpreadDamage + ValidRelationships: Enemy, Ally + Warhead@2Dam: SpreadDamage + ValidRelationships: Enemy, Ally + Warhead@3Dam: SpreadDamage + ValidRelationships: Enemy, Ally + Warhead@4Dam: SpreadDamage + ValidRelationships: Enemy, Ally + +155mm: + Warhead@1Dam: SpreadDamage + ValidRelationships: Enemy, Ally + +155mmSpec: + Warhead@1Dam: SpreadDamage + Versus: + Concrete: 120 diff --git a/mods/ca/missions/main-campaign/ca07-conspiracy/conspiracy.lua b/mods/ca/missions/main-campaign/ca07-conspiracy/conspiracy.lua new file mode 100644 index 0000000000..496523c467 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca07-conspiracy/conspiracy.lua @@ -0,0 +1,482 @@ +MissionDir = "ca|missions/main-campaign/ca07-conspiracy" + +SleeperAwakenTrigger = { LeftBaseTrigger1.Location, LeftBaseTrigger2.Location, LeftBaseTrigger3.Location, LeftBaseTrigger4.Location, LeftBaseTrigger5.Location, LeftBaseTrigger6.Location, LeftBaseTrigger7.Location, RightBaseTrigger1.Location, RightBaseTrigger2.Location, RightBaseTrigger3.Location, RightBaseTrigger4.Location, RightBaseTrigger5.Location, RightBaseTrigger6.Location, RightBaseTrigger7.Location } + +Researchers = { Researcher1, Researcher2 } + +GDIDefenders = { GDIDefender1, GDIDefender2, GDIDefender3, GDIDefender4, GDIDefender5, GDIDefender6 } + +ChinookDropPaths = { + { ChinookDrop1Spawn.Location, ChinookDrop1Landing.Location }, + { ChinookDrop2Spawn.Location, ChinookDrop2Mid.Location, ChinookDrop2Landing.Location }, + { ChinookDrop3Spawn.Location, ChinookDrop3Landing.Location }, + { ChinookDrop4Spawn.Location, ChinookDrop4Landing.Location } +} + +GDIReinforcementPath = { GDIReinforceSpawn.Location, GDIReinforceRally.Location } + +GreeceSouthAttackPaths = { + { SouthAttack1.Location, SouthAttack2.Location, SouthWestAttack1.Location }, + { SouthAttack1.Location, SouthAttack2.Location, SouthCentralAttack1.Location }, + { SouthAttack1.Location, SouthEastAttack1.Location }, + { EastAttack1.Location, EastAttack2.Location } +} + +GreeceNorthAttackPaths = { + { NorthAttack1.Location, NorthWestAttack1.Location, NorthWestAttack2.Location }, + { NorthAttack1.Location, NorthEastAttack1.Location } +} + +Patrols = { + { + Units = { AlliedPatroller1, AlliedPatroller2 }, + Path = { AlliedPatrol1.Location, AlliedPatrol2.Location } + }, +} + +ChinookDropStart = AdjustDelayForDifficulty(DateTime.Minutes(12)) +ChinookDropAttackValue = AdjustAttackValuesForDifficulty({ Min = 12, Max = 24, RampDuration = DateTime.Minutes(10) }) + +GDIReinforcementDelay = { + easy = DateTime.Minutes(17), + normal = DateTime.Minutes(15), + hard = DateTime.Minutes(13), + vhard = DateTime.Minutes(11), + brutal = DateTime.Minutes(10) +} + +-- Squads + +if Difficulty == "brutal" then + table.insert(UnitCompositions.Allied, { + Infantry = { "hopl", "hopl", "hopl", "hopl", "hopl", "hopl", "hopl", "hopl" }, Vehicles = { "ptnk", "ptnk", "ptnk", "pcan", "pcan", "pcan" }, MinTime = DateTime.Minutes(15), IsSpecial = true + }) +end + +AdjustedAlliedCompositions = AdjustCompositionsForDifficulty(UnitCompositions.Allied) + +Squads = { + South = { + Delay = AdjustDelayForDifficulty(DateTime.Seconds(270)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 20, Max = 36, RampDuration = DateTime.Minutes(14) }), + FollowLeader = true, + ProducerActors = { Infantry = { AlliedSouthBarracks }, Vehicles = { AlliedSouthFactory } }, + Compositions = AdjustedAlliedCompositions, + AttackPaths = GreeceSouthAttackPaths, + }, + North = { + Delay = AdjustDelayForDifficulty(DateTime.Seconds(150)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 20, Max = 36, RampDuration = DateTime.Minutes(14) }), + FollowLeader = true, + ProducerActors = { Infantry = { AlliedNorthBarracks }, Vehicles = { AlliedNorthFactory } }, + Compositions = AdjustedAlliedCompositions, + AttackPaths = GreeceNorthAttackPaths, + }, + Air = { + Delay = AdjustAirDelayForDifficulty(DateTime.Minutes(13)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 12, Max = 12 }), + Compositions = AirCompositions.Allied, + } +} + +-- Setup and Tick + +SetupPlayers = function() + Nod = Player.GetPlayer("Nod") + Greece = Player.GetPlayer("Greece") + GDI = Player.GetPlayer("GDI") + Legion = Player.GetPlayer("Legion") + EvacPlayer = Player.GetPlayer("Evac") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = { Nod } + MissionEnemies = { Greece, GDI } +end + +WorldLoaded = function() + SetupPlayers() + + TimerTicks = 0 + Camera.Position = PlayerStart.CenterPosition + + InitObjectives(Nod) + AdjustPlayerStartingCashForDifficulty() + InitGDI() + InitGreece() + + if IsVeryHardOrBelow() then + WeatherControl.Destroy() + + if IsNormalOrBelow() then + GDIDefender2.Destroy() + NorthGapGenerator.Destroy() + HardOnlyPower.Destroy() + Cryo1.Destroy() + Cryo2.Destroy() + Cryo3.Destroy() + Cryo4.Destroy() + Cryo5.Destroy() + Prism1.Destroy() + + if Difficulty == "easy" then + GDIDefender1.Destroy() + SouthGapGenerator1.Destroy() + SouthGapGenerator2.Destroy() + SouthGapGenerator3.Destroy() + HardAndNormalOnlyPower.Destroy() + AGT1.Owner = Legion + Prism2.Destroy() + Prism3.Destroy() + end + end + end + + Trigger.AfterDelay(DateTime.Seconds(3), function() + Tip("Stealth units can be detected by enemy defenses and certain units (see tooltips), as well as all infantry at close range.") + end) + + ObjectiveTakeOverBase = Nod.AddObjective("Take control of the GDI base due south.") + UserInterface.SetMissionText("Take control of the GDI base due south.", HSLColor.Yellow) + + local startingUnits = Nod.GetActors() + Utils.Do(startingUnits, function(a) + if a.HasProperty("Kill") then + Trigger.OnKilled(a, function(self, killer) + local livingStartingUnits = Utils.Where(startingUnits, function(u) + return u.HasProperty("Kill") and not u.IsDead + end) + if #livingStartingUnits == 0 and not Nod.IsObjectiveCompleted(ObjectiveTakeOverBase) then + Nod.MarkFailedObjective(ObjectiveTakeOverBase) + end + end) + end + end) + + Trigger.AfterDelay(1, function() + Utils.Do(Patrols, function(p) + Utils.Do(p.Units, function(unit) + if not unit.IsDead then + unit.Patrol(p.Path, true) + end + end) + end) + end) + + -- On player reaching GDI base + Trigger.OnEnteredFootprint(SleeperAwakenTrigger, function(a, id) + if IsMissionPlayer(a.Owner) then + Trigger.RemoveFootprintTrigger(id) + AwakenSleeperCell() + end + end) + + -- If player tries to go through the Allied base before going to GDI base, begin attacks after a delay + Trigger.OnEnteredProximityTrigger(BaseTriggerBackup.CenterPosition, WDist.New(10 * 1024), function(a, id) + if IsMissionPlayer(a.Owner) then + Trigger.RemoveProximityTrigger(id) + Trigger.AfterDelay(DateTime.Minutes(2), function() + InitAlliedAttacks() + end) + end + end) + + -- Finding researchers + Utils.Do(Researchers, function(researcher) + Trigger.OnEnteredProximityTrigger(researcher.CenterPosition, WDist.New(8 * 1024), function(a, id) + if IsMissionPlayer(a.Owner) then + Trigger.RemoveProximityTrigger(id) + Notification("Researcher located.") + MediaCA.PlaySound(MissionDir .. "/n_researcherlocated.aud", 2) + if ObjectiveRescueResearchers == nil then + ObjectiveRescueResearchers = Nod.AddObjective("Locate and rescue Nod researchers.") + end + local researcherCamera = Actor.Create("camera.paradrop", true, { Owner = Nod, Location = researcher.Location }) + Trigger.AfterDelay(DateTime.Seconds(10), function() + researcherCamera.Destroy() + end) + end + end) + + Trigger.OnEnteredProximityTrigger(researcher.CenterPosition, WDist.New(2 * 1024), function(a, id) + if IsMissionPlayer(a.Owner) and a.HasProperty("Move") and not a.HasProperty("Land") then + Trigger.RemoveProximityTrigger(id) + researcher.Owner = a.Owner + Notification("Escort researcher to evacuation point.") + MediaCA.PlaySound(MissionDir .. "/n_escortresearcher.aud", 2) + InitEvacSite() + end + end) + + Trigger.OnKilled(researcher, function(self, killer) + if not EvacExiting and ObjectiveRescueResearchers ~= nil and not Nod.IsObjectiveCompleted(ObjectiveRescueResearchers) then + Nod.MarkFailedObjective(ObjectiveRescueResearchers) + end + end) + end) + + Trigger.OnEnteredProximityTrigger(EvacPoint.CenterPosition, WDist.New(6 * 1024), function(a, id) + if IsMissionPlayer(a.Owner) and (a == Researcher1 or a == Researcher2) then + a.Owner = EvacPlayer + + if a == Researcher1 then + a.Move(CPos.New(EvacPoint.Location.X - 1, EvacPoint.Location.Y + 1)) + else + a.Move(CPos.New(EvacPoint.Location.X + 1, EvacPoint.Location.Y + 1)) + end + + Trigger.AfterDelay(DateTime.Seconds(2), function() + if Researcher1.Owner == EvacPlayer and Researcher2.Owner == EvacPlayer and not EvacStarted then + EvacStarted = true + + Notification("Evacuation transport inbound.") + MediaCA.PlaySound(MissionDir .. "/n_evacinbound.aud", 2) + + Trigger.AfterDelay(DateTime.Seconds(3), function() + if EvacFlare ~= nil then + EvacFlare.Destroy() + end + + Reinforcements.ReinforceWithTransport(EvacPlayer, "tran.evac", nil, { EvacSpawn.Location, EvacPoint.Location }, nil, function(transport, cargo) + + Trigger.AfterDelay(DateTime.Seconds(1), function() + Utils.Do({ Researcher1, Researcher2 }, function(r) + if not r.IsDead then + r.EnterTransport(transport) + Trigger.OnIdle(r, function(r) + if not r.IsDead then + r.EnterTransport(transport) + end + end) + end + end) + end) + + Trigger.OnPassengerEntered(transport, function(t, passenger) + if t.PassengerCount == 2 then + EvacExiting = true + PlaySpeechNotificationToMissionPlayers("TargetRescued") + t.Move(EvacSpawn.Location) + t.Destroy() + Trigger.AfterDelay(DateTime.Seconds(4), function() + Nod.MarkCompletedObjective(ObjectiveRescueResearchers) + end) + end + end) + end) + end) + else + Notification("A researcher has reached the evacuation point. Waiting for the second.") + end + end) + end + end) + + SetupReveals({ EntranceReveal1, EntranceReveal2, EntranceReveal3, EntranceReveal4, EntranceReveal5, EntranceReveal6 }) + AfterWorldLoaded() +end + +Tick = function() + OncePerSecondChecks() + OncePerFiveSecondChecks() + OncePerThirtySecondChecks() + AfterTick() +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + Greece.Resources = Greece.ResourceCapacity - 500 + GDI.Resources = GDI.ResourceCapacity - 500 + + if TimerTicks > 0 then + if TimerTicks > 25 then + TimerTicks = TimerTicks - 25 + else + TimerTicks = 0 + end + end + + if not EvacExiting and MissionPlayersHaveNoRequiredUnits() then + if ObjectiveRescueResearchers ~= nil and not Nod.IsObjectiveCompleted(ObjectiveRescueResearchers) then + Nod.MarkFailedObjective(ObjectiveRescueResearchers) + end + end + + if not EvacExiting and (Researcher1.IsDead or Researcher2.IsDead) then + if ObjectiveRescueResearchers ~= nil and not Nod.IsObjectiveCompleted(ObjectiveRescueResearchers) then + Nod.MarkFailedObjective(ObjectiveRescueResearchers) + end + end + end +end + +OncePerFiveSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 125 == 0 then + UpdatePlayerBaseLocations() + end +end + +OncePerThirtySecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % DateTime.Seconds(30) == 0 then + CalculatePlayerCharacteristics() + end +end + +AwakenSleeperCell = function() + if SleeperCellAwakened then + return + end + SleeperCellAwakened = true + Media.DisplayMessage("The time has come, warriors of Nod.", "Nod Soldier", HSLColor.FromHex("FF0000")) + MediaCA.PlaySound(MissionDir .. "/timehascome.aud", 2) + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(4)), function() + Media.DisplayMessage("Down with GDI!", "Nod Soldier", HSLColor.FromHex("FF0000")) + MediaCA.PlaySound(MissionDir .. "/downwithgdi.aud", 2) + Trigger.AfterDelay(15, function() + UserInterface.SetMissionText("") + TransferLegionForces() + + if not GDIBarracks.IsDead then + GDIBarracks.Kill() + end + + if not GDICommsCenter.IsDead then + GDICommsCenter.Kill() + end + + Trigger.AfterDelay(DateTime.Seconds(60), function() + Utils.Do(GDIDefenders, function(self) + if not self.IsDead then + self.AttackMove(GDIBaseCenter.Location) + CallForHelp(self, WDist.New(10240), IsGDIGroundHunterUnit) + end + end) + end) + + if not GDIHarvester.IsDead then + GDIHarvester.Owner = Nod + end + + if ObjectiveRescueResearchers == nil then + ObjectiveRescueResearchers = Nod.AddObjective("Locate and rescue Nod researchers.") + end + + if ObjectiveTakeOverBase ~= nil and not Nod.IsObjectiveCompleted(ObjectiveTakeOverBase) then + Nod.MarkCompletedObjective(ObjectiveTakeOverBase) + end + + local extraPower1 = Actor.Create("apwr", true, { Owner = Greece, Location = ExtraPower1.Location }) + local extraPower2 = Actor.Create("apwr", true, { Owner = Greece, Location = ExtraPower2.Location }) + AutoRepairBuilding(extraPower1, Greece) + AutoRebuildBuilding(extraPower1, Greece, 15) + AutoRepairBuilding(extraPower2, Greece) + AutoRebuildBuilding(extraPower2, Greece, 15) + + -- Initialise Allied attacks + InitAlliedAttacks() + end) + end) +end + +-- overridden in co-op version +TransferLegionForces = function() + local legionForces = Legion.GetActors() + + Utils.Do(legionForces, function(self) + if self.Type ~= "player" then + self.Owner = Nod + end + end) + + Trigger.AfterDelay(1, function() + Actor.Create("QueueUpdaterDummy", true, { Owner = Nod }) + end) +end + +InitEvacSite = function() + if not EvacSiteInitialized then + EvacSiteInitialized = true + Beacon.New(Nod, EvacPoint.CenterPosition) + EvacFlare = Actor.Create("flare", true, { Owner = Nod, Location = EvacPoint.Location }) + end +end + +InitGDI = function() + AutoRepairAndRebuildBuildings(GDI, 15) + local gdiGroundAttackers = GDI.GetGroundAttackers() + + Utils.Do(gdiGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsGDIGroundHunterUnit) + end) +end + +InitGreece = function() + if Difficulty == "easy" then + RebuildExcludes.Greece = { Types = { "htur", "pris", "gun", "pbox" } } + end + + AutoRepairAndRebuildBuildings(Greece, 15) + SetupRefAndSilosCaptureCredits(Greece) + AutoReplaceHarvesters(Greece) + AutoRebuildConyards(Greece) + InitAiUpgrades(Greece) + + local greeceGroundAttackers = Greece.GetGroundAttackers() + + Utils.Do(greeceGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsGreeceGroundHunterUnit) + end) +end + +InitAlliedAttacks = function() + if not AlliedAttacksInitialized then + AlliedAttacksInitialized = true + InitAttackSquad(Squads.South, Greece) + InitAttackSquad(Squads.North, Greece) + InitAirAttackSquad(Squads.Air, Greece) + + Trigger.AfterDelay(ChinookDropStart, DoChinookDrop) + + Trigger.AfterDelay(GDIReinforcementDelay[Difficulty], function() + local gdiReinforcements = { "mtnk", "mtnk" } + if IsHardOrAbove() then + gdiReinforcements = { "htnk" , "htnk" } + if Difficulty == "brutal" then + gdiReinforcements = { "titn" , "titn", "thwk", "thwk" } + end + end + + Reinforcements.Reinforce(GDI, gdiReinforcements, GDIReinforcementPath, 75, function(a) + AssaultPlayerBaseOrHunt(a) + end) + end) + + if Difficulty == "brutal" then + Trigger.AfterDelay(DateTime.Minutes(10), function() + Actor.Create("ai.superweapons.enabled", true, { Owner = Greece }) + end) + end + end +end + +DoChinookDrop = function() + local entryPath + entryPath = Utils.Random(ChinookDropPaths) + local chinookDropUnits = { "e1", "e1", "e1", "e3", "e3" } + + if IsHardOrAbove() and DateTime.GameTime > DateTime.Minutes(16) then + chinookDropUnits = { "e1", "e1", "e1", "e1", "e1", "e3", "seal", "seal", "seal" } + end + + DoHelicopterDrop(Greece, entryPath, "tran.paradrop", chinookDropUnits, AssaultPlayerBaseOrHunt, function(t) + Trigger.AfterDelay(DateTime.Seconds(5), function() + if not t.IsDead then + t.Move(entryPath[1]) + t.Destroy() + end + end) + end) + + local delayUntilNext = CalculateInterval(GetTotalCostOfUnits(chinookDropUnits), ChinookDropAttackValue, ChinookDropStart) + Trigger.AfterDelay(delayUntilNext, DoChinookDrop) +end diff --git a/mods/ca/missions/main-campaign/ca07-conspiracy/downwithgdi.aud b/mods/ca/missions/main-campaign/ca07-conspiracy/downwithgdi.aud new file mode 100644 index 0000000000..072787bd02 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca07-conspiracy/downwithgdi.aud differ diff --git a/mods/ca/missions/main-campaign/ca07-conspiracy/map.bin b/mods/ca/missions/main-campaign/ca07-conspiracy/map.bin new file mode 100644 index 0000000000..bdad38e34d Binary files /dev/null and b/mods/ca/missions/main-campaign/ca07-conspiracy/map.bin differ diff --git a/mods/ca/missions/main-campaign/ca07-conspiracy/map.png b/mods/ca/missions/main-campaign/ca07-conspiracy/map.png new file mode 100644 index 0000000000..cc511c7a3c Binary files /dev/null and b/mods/ca/missions/main-campaign/ca07-conspiracy/map.png differ diff --git a/mods/ca/missions/main-campaign/ca07-conspiracy/map.yaml b/mods/ca/missions/main-campaign/ca07-conspiracy/map.yaml new file mode 100644 index 0000000000..3963a39130 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca07-conspiracy/map.yaml @@ -0,0 +1,3962 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 07: Conspiracy + +Author: Darkademic + +Tileset: TEMPERAT + +MapSize: 98,98 + +Bounds: 1,1,96,96 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: Nod, Greece, GDI, Legion, Evac + PlayerReference@Nod: + Name: Nod + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: nod + LockColor: True + Color: FE1100 + LockSpawn: True + LockTeam: True + Allies: Evac + Enemies: Greece, GDI, Creeps + PlayerReference@Greece: + Name: Greece + Bot: campaign + Faction: allies + Color: 99ACF2 + Allies: GDI + Enemies: Nod, Creeps, Evac + PlayerReference@GDI: + Name: GDI + Bot: campaign + Faction: gdi + Color: F2CF74 + Allies: Greece + Enemies: Nod, Creeps, Evac + PlayerReference@Legion: + Name: Legion + Bot: campaign + Faction: legion + Color: F2CF74 + Enemies: Creeps + PlayerReference@Evac: + Name: Evac + Bot: campaign + Faction: legion + Color: E6E6FF + Allies: Nod + Enemies: Greece, GDI, Creeps + +Actors: + Actor0: t01 + Owner: Neutral + Location: 27,13 + Actor25: tc05 + Owner: Neutral + Faction: germany + Location: 13,7 + Actor26: tc04 + Owner: Neutral + Faction: germany + Location: 20,9 + Actor27: t16 + Owner: Neutral + Faction: germany + Location: 21,4 + Actor28: v01 + Owner: Neutral + Location: 19,5 + Actor29: v03 + Owner: Neutral + Location: 10,9 + Actor30: v05 + Owner: Neutral + Location: 20,15 + Actor31: v11 + Owner: Neutral + Location: 15,5 + Actor32: v04 + Owner: Neutral + Location: 24,10 + Actor33: t01 + Owner: Neutral + Location: 9,7 + Actor34: t02 + Owner: Neutral + Location: 26,9 + Actor35: t03 + Owner: Neutral + Location: 27,8 + Actor36: tc05 + Owner: Neutral + Location: 6,2 + Actor37: tc03 + Owner: Neutral + Location: 25,3 + Actor38: t14 + Owner: Neutral + Location: 25,1 + Actor39: t07 + Owner: Neutral + Location: 24,1 + Actor41: t06 + Owner: Neutral + Location: 11,4 + Actor42: t06 + Owner: Neutral + Location: 16,15 + Actor43: t13 + Owner: Neutral + Location: 18,19 + Actor44: t15 + Owner: Neutral + Location: 3,13 + Actor45: t14 + Owner: Neutral + Location: 1,4 + Actor46: t10 + Owner: Neutral + Location: 7,16 + Actor47: shad + Owner: Nod + SubCell: 3 + Facing: 512 + Location: 32,11 + Actor48: shad + Owner: Nod + SubCell: 3 + Facing: 512 + Location: 33,11 + Actor49: shad + Owner: Nod + SubCell: 3 + Location: 34,11 + Facing: 512 + Actor50: n3 + Owner: Nod + SubCell: 1 + Facing: 512 + Location: 31,5 + Actor51: n3 + Owner: Nod + SubCell: 4 + Facing: 512 + Location: 31,5 + Actor52: n3 + Owner: Nod + SubCell: 2 + Facing: 512 + Location: 31,5 + Actor53: n3 + Owner: Nod + SubCell: 5 + Facing: 512 + Location: 31,5 + Actor54: n1 + Owner: Nod + SubCell: 1 + Facing: 512 + Location: 33,5 + Actor55: n1 + Owner: Nod + SubCell: 4 + Facing: 512 + Location: 33,5 + Actor56: n1 + Owner: Nod + SubCell: 2 + Facing: 512 + Location: 33,5 + Actor57: n1 + Owner: Nod + SubCell: 5 + Facing: 512 + Location: 33,5 + Actor60: sapc + Owner: Nod + Facing: 512 + Location: 31,7 + Actor61: sapc + Owner: Nod + Facing: 512 + Location: 33,7 + Actor58: spec + Owner: Nod + Location: 32,3 + Facing: 523 + Actor59: brik + Owner: Greece + Location: 49,13 + Actor62: brik + Owner: Greece + Location: 49,12 + Actor63: brik + Owner: Greece + Location: 50,13 + Actor64: brik + Owner: Greece + Location: 50,12 + Actor65: brik + Owner: Greece + Location: 49,17 + Actor66: brik + Owner: Greece + Location: 49,18 + Actor67: brik + Owner: Greece + Location: 50,17 + Actor68: brik + Owner: Greece + Location: 50,18 + Actor69: brik + Owner: Greece + Location: 49,11 + Actor70: brik + Owner: Greece + Location: 49,10 + Actor71: brik + Owner: Greece + Location: 49,9 + Actor72: brik + Owner: Greece + Location: 49,8 + Actor73: brik + Owner: Greece + Location: 49,7 + Actor74: brik + Owner: Greece + Location: 49,6 + Actor75: brik + Owner: Greece + Location: 49,5 + Actor76: brik + Owner: Greece + Location: 49,4 + Actor77: brik + Owner: Greece + Location: 49,3 + Actor78: brik + Owner: Greece + Location: 49,2 + Actor79: brik + Owner: Greece + Location: 49,1 + Actor80: brik + Owner: Greece + Location: 50,1 + Actor81: brik + Owner: Greece + Location: 51,1 + Actor82: brik + Owner: Greece + Location: 52,1 + Actor83: brik + Owner: Greece + Location: 53,1 + Actor84: brik + Owner: Greece + Location: 49,19 + Actor85: brik + Owner: Greece + Location: 49,20 + Actor86: brik + Owner: Greece + Location: 49,21 + Actor87: brik + Owner: Greece + Location: 49,22 + Actor88: brik + Owner: Greece + Location: 50,22 + Actor89: brik + Owner: Greece + Location: 51,22 + Actor90: brik + Owner: Greece + Location: 52,22 + Actor91: brik + Owner: Greece + Location: 53,22 + Actor92: brik + Owner: Greece + Location: 54,22 + Actor93: brik + Owner: Greece + Location: 55,22 + Actor94: brik + Owner: Greece + Location: 57,22 + Actor95: brik + Owner: Greece + Location: 56,22 + Actor96: brik + Owner: Greece + Location: 57,21 + Actor97: brik + Owner: Greece + Location: 56,21 + Actor98: sbag + Owner: Greece + Location: 46,19 + Actor99: sbag + Owner: Greece + Location: 46,20 + Actor103: sbag + Owner: Greece + Location: 47,12 + Actor104: sbag + Owner: Greece + Location: 46,12 + Actor105: sbag + Owner: Greece + Location: 46,11 + Actor106: sbag + Owner: Greece + Location: 46,10 + Actor110: sbag + Owner: Greece + Location: 46,18 + Actor112: sbag + Owner: Greece + Location: 47,18 + Actor102: agun + Owner: Greece + Location: 50,21 + Actor113: pris + Owner: Greece + Location: 50,19 + Actor114: pris + Owner: Greece + Location: 50,11 + Actor115: arty + Owner: Greece + Location: 47,11 + Facing: 256 + Actor116: arty + Owner: Greece + Location: 47,19 + Facing: 256 + Actor117: sbag + Owner: Greece + Location: 47,20 + Actor118: sbag + Owner: Greece + Location: 47,10 + Actor100: split2 + Owner: Neutral + Location: 42,5 + Actor101: split3 + Owner: Neutral + Location: 43,8 + Actor107: tc02 + Owner: Neutral + Location: 25,26 + Actor108: t16 + Owner: Neutral + Location: 21,23 + Actor119: t15 + Owner: Neutral + Location: 28,23 + Actor120: t10 + Owner: Neutral + Location: 19,22 + Actor213: nuk2 + Owner: GDI + Location: 22,46 + Actor214: nuk2 + Owner: GDI + Location: 24,46 + AGT1: atwr + Location: 31,58 + Owner: GDI + Actor220: gtwr + Owner: GDI + Location: 12,51 + Actor223: gtwr + Owner: GDI + Location: 37,51 + Actor224: gtwr + Location: 25,60 + Owner: Legion + Actor225: gtwr + Owner: GDI + Location: 29,60 + Actor230: rep + Owner: GDI + Location: 21,51 + Actor215: nuk2 + Owner: Legion + Location: 26,46 + Actor218: afac + Owner: Legion + Location: 31,45 + Actor212: weap.td + Owner: Legion + Location: 18,46 + GDIBarracks: pyle + Location: 17,55 + Owner: GDI + Actor226: atwr + Owner: Legion + Location: 34,50 + Actor227: atwr + Owner: Legion + Location: 15,50 + Actor216: atwr + Location: 23,58 + Owner: Legion + Actor221: gtwr + Owner: Legion + Location: 12,55 + Actor222: gtwr + Owner: Legion + Location: 37,55 + GDICommsCenter: hq + Owner: GDI + Location: 28,46 + Actor186: brik + Owner: Legion + Location: 24,59 + Actor187: brik + Owner: Legion + Location: 24,58 + Actor200: brik + Owner: Legion + Location: 25,58 + Actor201: brik + Owner: Legion + Location: 25,59 + Actor202: brik + Owner: Legion + Location: 23,59 + Actor203: brik + Owner: Legion + Location: 13,55 + Actor204: brik + Owner: Legion + Location: 14,55 + Actor205: brik + Owner: Legion + Location: 13,56 + Actor206: brik + Owner: Legion + Location: 14,56 + Actor207: brik + Owner: Legion + Location: 13,57 + Actor208: brik + Owner: Legion + Location: 13,58 + Actor209: brik + Owner: Legion + Location: 13,59 + Actor210: brik + Owner: Legion + Location: 14,59 + Actor211: brik + Owner: Legion + Location: 15,59 + Actor231: brik + Owner: Legion + Location: 17,59 + Actor232: brik + Owner: Legion + Location: 16,59 + Actor233: brik + Owner: Legion + Location: 18,59 + Actor234: brik + Owner: Legion + Location: 19,59 + Actor235: brik + Owner: Legion + Location: 20,59 + Actor236: brik + Owner: Legion + Location: 21,59 + Actor237: brik + Owner: Legion + Location: 22,59 + Actor191: brik + Owner: Legion + Location: 29,58 + Actor192: brik + Owner: Legion + Location: 29,59 + Actor193: brik + Owner: Legion + Location: 30,59 + Actor194: brik + Owner: Legion + Location: 30,58 + Actor195: brik + Owner: Legion + Location: 31,59 + Actor196: brik + Owner: Legion + Location: 32,59 + Actor197: brik + Owner: Legion + Location: 33,59 + Actor198: brik + Owner: Legion + Location: 34,59 + Actor199: brik + Owner: Legion + Location: 35,59 + Actor238: brik + Owner: Legion + Location: 36,59 + Actor239: brik + Owner: Legion + Location: 36,55 + Actor240: brik + Owner: Legion + Location: 35,55 + Actor241: brik + Owner: Legion + Location: 35,56 + Actor242: brik + Owner: Legion + Location: 36,56 + Actor243: brik + Owner: Legion + Location: 36,57 + Actor244: brik + Owner: Legion + Location: 36,58 + Actor245: brik + Owner: Legion + Location: 35,51 + Actor246: brik + Owner: Legion + Location: 36,51 + Actor247: brik + Owner: Legion + Location: 36,50 + Actor248: brik + Owner: Legion + Location: 35,50 + Actor249: brik + Owner: Legion + Location: 35,49 + Actor250: brik + Owner: Legion + Location: 34,49 + Actor251: brik + Owner: Legion + Location: 34,48 + Actor252: brik + Owner: Legion + Location: 34,47 + Actor253: brik + Owner: Legion + Location: 34,46 + Actor172: brik + Owner: Legion + Location: 13,50 + Actor173: brik + Owner: Legion + Location: 13,51 + Actor174: brik + Owner: Legion + Location: 14,51 + Actor175: brik + Owner: Legion + Location: 14,50 + Actor176: brik + Owner: Legion + Location: 14,49 + Actor177: brik + Owner: Legion + Location: 15,49 + Actor178: brik + Owner: Legion + Location: 16,49 + Actor179: brik + Owner: Legion + Location: 16,48 + Actor180: brik + Owner: Legion + Location: 16,47 + Actor181: brik + Owner: Legion + Location: 17,47 + Actor182: brik + Owner: Legion + Location: 17,46 + Actor183: brik + Owner: Legion + Location: 17,45 + Actor184: brik + Owner: Legion + Location: 19,45 + Actor185: brik + Owner: Legion + Location: 18,45 + Actor188: brik + Owner: Legion + Location: 20,45 + Actor189: brik + Owner: Legion + Location: 21,45 + Actor190: brik + Owner: Legion + Location: 22,45 + Actor254: brik + Owner: Legion + Location: 23,45 + Actor255: brik + Owner: Legion + Location: 24,45 + Actor256: brik + Owner: Legion + Location: 25,45 + Actor257: brik + Owner: Legion + Location: 26,45 + Actor258: brik + Owner: Legion + Location: 27,45 + Actor259: brik + Owner: Legion + Location: 28,45 + Actor260: brik + Owner: Legion + Location: 29,45 + Actor261: brik + Owner: Legion + Location: 29,44 + Actor262: brik + Owner: Legion + Location: 30,44 + Actor263: brik + Owner: Legion + Location: 31,44 + Actor264: brik + Owner: Legion + Location: 32,44 + Actor265: brik + Owner: Legion + Location: 34,44 + Actor266: brik + Owner: Legion + Location: 33,44 + Actor267: brik + Owner: Legion + Location: 34,45 + Actor268: nuk2 + Owner: Legion + Location: 25,50 + Actor269: nuk2 + Owner: Legion + Location: 27,50 + Actor228: proc.td + Owner: Legion + Location: 30,52 + FreeActor: False + Actor270: mtnk + Owner: Legion + Facing: 384 + Location: 19,50 + Actor272: n1 + Owner: Legion + SubCell: 3 + Location: 20,51 + Facing: 539 + Actor275: n1 + Owner: Legion + SubCell: 3 + Location: 23,50 + Facing: 570 + Actor276: n1 + Owner: Legion + Facing: 384 + SubCell: 3 + Location: 31,49 + Actor277: n1 + Owner: Legion + Facing: 384 + SubCell: 3 + Location: 34,51 + Actor278: n3 + Owner: Legion + SubCell: 3 + Location: 21,50 + Facing: 745 + Actor279: n3 + Owner: Legion + SubCell: 3 + Location: 14,57 + Facing: 384 + Actor280: apc2 + Owner: Legion + Facing: 384 + Location: 22,49 + Actor281: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 26,60 + Actor282: n1 + Owner: GDI + Location: 36,54 + SubCell: 3 + Facing: 634 + Actor283: n1 + Owner: GDI + SubCell: 3 + Location: 38,52 + Facing: 785 + Actor284: n1 + Owner: GDI + SubCell: 3 + Location: 32,50 + Facing: 713 + Actor285: n1 + Owner: GDI + Location: 20,54 + SubCell: 1 + Facing: 341 + Actor274: n2 + Owner: GDI + SubCell: 3 + Location: 28,58 + Facing: 384 + Actor287: n2 + Owner: GDI + SubCell: 3 + Location: 20,58 + Facing: 975 + Actor288: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 30,61 + Actor289: n1 + Owner: Legion + Facing: 384 + SubCell: 3 + Location: 16,50 + Actor297: n1 + Owner: GDI + SubCell: 3 + Location: 35,32 + Facing: 0 + Actor299: n1 + Owner: GDI + SubCell: 3 + Location: 37,34 + Facing: 0 + Actor304: n1 + Owner: GDI + SubCell: 3 + Facing: 951 + Location: 10,26 + Actor305: n2 + Owner: GDI + SubCell: 1 + Location: 10,26 + Facing: 1023 + Actor306: n1 + Owner: GDI + SubCell: 3 + Location: 13,27 + Facing: 222 + Actor307: n1 + Owner: GDI + SubCell: 3 + Location: 12,28 + Facing: 111 + Actor292: proc + Owner: Greece + Location: 52,10 + AlliedNorthFactory: weap + Owner: Greece + Location: 54,16 + Actor296: apwr + Owner: Greece + Location: 50,2 + Actor301: apwr + Owner: Greece + Location: 53,2 + Actor302: apwr + Owner: Greece + Location: 56,2 + Actor309: brik + Owner: Greece + Location: 54,1 + Actor310: brik + Owner: Greece + Location: 55,1 + Actor311: brik + Owner: Greece + Location: 56,1 + Actor312: brik + Owner: Greece + Location: 57,1 + Actor313: brik + Owner: Greece + Location: 58,1 + Actor314: brik + Owner: Greece + Location: 59,1 + Actor315: brik + Owner: Greece + Location: 60,1 + Actor316: brik + Owner: Greece + Location: 61,1 + Actor317: brik + Owner: Greece + Location: 62,1 + Actor318: brik + Owner: Greece + Location: 63,1 + Actor319: brik + Owner: Greece + Location: 64,1 + AlliedNorthBarracks: tent + Owner: Greece + Location: 59,14 + Actor332: brik + Owner: Greece + Location: 64,12 + Actor333: brik + Owner: Greece + Location: 65,12 + Actor334: brik + Owner: Greece + Location: 64,13 + Actor335: brik + Owner: Greece + Location: 65,13 + Actor336: brik + Owner: Greece + Location: 65,14 + Actor337: brik + Owner: Greece + Location: 61,21 + Actor338: brik + Owner: Greece + Location: 61,22 + Actor339: brik + Owner: Greece + Location: 62,22 + Actor340: brik + Owner: Greece + Location: 62,21 + Actor341: brik + Owner: Greece + Location: 63,22 + Actor342: brik + Owner: Greece + Location: 64,22 + Actor343: brik + Owner: Greece + Location: 65,15 + Actor344: brik + Owner: Greece + Location: 65,16 + Actor345: brik + Owner: Greece + Location: 65,18 + Actor346: brik + Owner: Greece + Location: 65,17 + Actor347: brik + Owner: Greece + Location: 65,19 + Actor348: brik + Owner: Greece + Location: 65,20 + Actor349: brik + Owner: Greece + Location: 65,21 + Actor350: brik + Owner: Greece + Location: 65,22 + NorthGapGenerator: gap + Owner: Greece + Location: 59,19 + Actor353: pris + Owner: Greece + Location: 55,21 + Actor354: pris + Owner: Greece + Location: 63,21 + Actor355: pris + Owner: Greece + Location: 64,14 + Actor358: sbag + Owner: Greece + Location: 54,24 + Actor359: sbag + Owner: Greece + Location: 56,24 + Actor360: sbag + Owner: Greece + Location: 54,25 + Actor366: sbag + Owner: Greece + Location: 55,25 + Actor367: sbag + Owner: Greece + Location: 56,25 + Actor356: sbag + Owner: Greece + Location: 62,24 + Actor357: sbag + Owner: Greece + Location: 64,24 + Actor361: sbag + Owner: Greece + Location: 62,25 + Actor362: sbag + Owner: Greece + Location: 63,25 + Actor363: sbag + Owner: Greece + Location: 64,25 + Actor364: pbox + Owner: Greece + Location: 46,17 + Actor365: pbox + Owner: Greece + Location: 46,13 + Actor368: pbox + Owner: Greece + Location: 57,25 + Actor369: pbox + Owner: Greece + Location: 61,25 + Actor370: gun + Owner: Greece + Location: 48,23 + Actor371: silo + Owner: Greece + Location: 54,10 + Actor372: silo + Owner: Greece + Location: 52,10 + Actor373: agun + Owner: Greece + Location: 63,18 + Actor352: agun + Owner: Greece + Location: 54,6 + Actor374: fix + Owner: Greece + Location: 57,9 + Actor375: split2 + Owner: Neutral + Location: 16,68 + Actor376: split2 + Owner: Neutral + Location: 20,73 + GDIDefender2: htnk + Owner: GDI + Location: 10,56 + Facing: 128 + Actor379: tc05 + Owner: Neutral + Location: 1,69 + Actor381: tc01 + Owner: Neutral + Location: 1,72 + Actor382: t14 + Owner: Neutral + Location: 1,73 + Actor383: t07 + Owner: Neutral + Location: 1,74 + Actor384: t05 + Owner: Neutral + Location: 2,75 + Actor385: tc04 + Owner: Neutral + Location: 1,76 + Actor386: t02 + Owner: Neutral + Location: 2,68 + Actor387: t05 + Owner: Neutral + Location: 3,66 + Actor388: t11 + Owner: Neutral + Location: 9,71 + Actor390: t17 + Owner: Neutral + Location: 4,58 + Actor391: tc01 + Owner: Neutral + Location: 8,59 + Actor392: tc03 + Owner: Neutral + Location: 1,51 + Actor393: t14 + Owner: Neutral + Location: 1,49 + Actor394: t12 + Owner: Neutral + Location: 2,46 + Actor395: tc04 + Owner: Neutral + Location: 3,31 + Actor396: t16 + Owner: Neutral + Location: 1,34 + Actor397: tc02 + Owner: Neutral + Location: 2,33 + Actor398: tc02 + Owner: Neutral + Location: 13,33 + Actor399: tc01 + Owner: Neutral + Location: 4,37 + Actor401: t16 + Owner: Neutral + Location: 32,21 + Actor402: t06 + Owner: Neutral + Location: 40,22 + Actor403: t02 + Owner: Neutral + Location: 25,22 + Actor404: t01 + Owner: Neutral + Location: 6,20 + Actor405: tc01 + Owner: Neutral + Location: 12,22 + Actor407: t17 + Owner: Neutral + Location: 3,25 + Actor408: t17 + Owner: Neutral + Location: 42,37 + Actor409: t16 + Owner: Neutral + Location: 33,36 + Actor412: t02 + Owner: Neutral + Location: 43,39 + Actor413: t07 + Owner: Neutral + Location: 45,30 + Actor414: t15 + Owner: Neutral + Location: 42,23 + Actor416: v02 + Owner: Neutral + Location: 11,18 + Actor380: brik + Owner: Greece + Location: 70,82 + Actor418: brik + Owner: Greece + Location: 70,81 + Actor419: brik + Owner: Greece + Location: 71,81 + Actor420: brik + Owner: Greece + Location: 71,82 + Actor421: brik + Owner: Greece + Location: 70,80 + Actor422: brik + Owner: Greece + Location: 70,79 + Actor423: brik + Owner: Greece + Location: 70,78 + Actor424: brik + Owner: Greece + Location: 70,77 + Actor425: brik + Owner: Greece + Location: 70,76 + Actor426: brik + Owner: Greece + Location: 70,74 + Actor427: brik + Owner: Greece + Location: 70,75 + Actor428: brik + Owner: Greece + Location: 70,73 + Actor429: brik + Owner: Greece + Location: 70,72 + Actor430: brik + Owner: Greece + Location: 70,71 + Actor431: brik + Owner: Greece + Location: 70,70 + Actor432: brik + Owner: Greece + Location: 72,70 + Actor433: brik + Owner: Greece + Location: 71,70 + Actor434: brik + Owner: Greece + Location: 73,70 + Actor435: brik + Owner: Greece + Location: 74,70 + Actor436: brik + Owner: Greece + Location: 75,70 + Actor449: brik + Owner: Greece + Location: 87,70 + Actor450: brik + Owner: Greece + Location: 88,70 + Actor451: brik + Owner: Greece + Location: 89,70 + Actor452: brik + Owner: Greece + Location: 90,70 + Actor453: brik + Owner: Greece + Location: 91,70 + Actor454: brik + Owner: Greece + Location: 91,71 + Actor455: brik + Owner: Greece + Location: 70,86 + Actor456: brik + Owner: Greece + Location: 71,86 + Actor457: brik + Owner: Greece + Location: 70,87 + Actor458: brik + Owner: Greece + Location: 71,87 + Actor459: brik + Owner: Greece + Location: 70,88 + Actor460: brik + Owner: Greece + Location: 70,89 + Actor461: brik + Owner: Greece + Location: 70,90 + Actor462: brik + Owner: Greece + Location: 70,91 + Actor463: brik + Owner: Greece + Location: 70,92 + Actor464: brik + Owner: Greece + Location: 71,92 + Actor465: brik + Owner: Greece + Location: 71,91 + Actor466: arty + Owner: Greece + Location: 55,24 + Facing: 512 + Actor467: arty + Owner: Greece + Location: 63,24 + Facing: 512 + Actor468: brik + Owner: Greece + Location: 90,71 + AlliedSouthFactory: weap + Owner: Greece + Location: 74,80 + Actor478: atek + Owner: Greece + Location: 88,83 + Actor483: apwr + Owner: Greece + Location: 89,79 + SouthGapGenerator3: gap + Owner: Greece + Location: 87,81 + SouthGapGenerator1: gap + Owner: Greece + Location: 73,84 + SouthGapGenerator2: gap + Owner: Greece + Location: 82,73 + AlliedSouthBarracks: tent + Owner: Greece + Location: 73,75 + Actor477: silo + Owner: Greece + Location: 76,73 + Actor489: proc + Owner: Greece + Location: 76,73 + Actor490: silo + Owner: Greece + Location: 78,73 + Actor470: pris + Owner: Greece + Location: 71,80 + Actor488: pris + Owner: Greece + Location: 71,88 + Actor492: gun + Owner: Greece + Location: 69,80 + Actor493: gun + Owner: Greece + Location: 69,88 + Actor496: pbox + Owner: Greece + Location: 69,81 + Actor497: pbox + Owner: Greece + Location: 69,87 + Actor500: agun + Owner: Greece + Location: 72,72 + Actor502: agun + Owner: Greece + Location: 73,89 + TurretFacing: 832 + Actor480: hpad + Owner: Greece + Location: 80,82 + Actor481: hpad + Owner: Greece + Location: 83,82 + Actor505: chain + Owner: Greece + Location: 80,81 + Actor506: chain + Owner: Greece + Location: 81,81 + Actor507: chain + Owner: Greece + Location: 82,81 + Actor508: chain + Owner: Greece + Location: 83,81 + Actor509: chain + Owner: Greece + Location: 84,81 + Actor510: chain + Owner: Greece + Location: 85,81 + Actor511: chain + Owner: Greece + Location: 79,81 + Actor512: chain + Owner: Greece + Location: 79,82 + Actor513: chain + Owner: Greece + Location: 79,83 + Actor514: chain + Owner: Greece + Location: 79,84 + Actor515: chain + Owner: Greece + Location: 85,84 + Actor516: chain + Owner: Greece + Location: 85,83 + Actor517: chain + Owner: Greece + Location: 85,82 + Actor484: fix + Owner: Greece + Location: 81,77 + Actor518: apwr + Owner: Greece + Location: 89,76 + Actor519: apwr + Owner: Greece + Location: 89,73 + Actor479: dome + Owner: Greece + Location: 86,75 + Actor501: agun + Owner: Greece + Location: 87,73 + Actor520: split2 + Owner: Neutral + Location: 9,91 + Actor521: split2 + Owner: Neutral + Location: 16,92 + Actor523: split2 + Owner: Neutral + Location: 23,91 + Actor522: apwr + Owner: Greece + Location: 59,2 + Actor525: agun + Owner: Greece + Location: 60,6 + Actor526: sbag + Owner: Greece + Location: 56,49 + Actor527: sbag + Owner: Greece + Location: 56,48 + Actor528: sbag + Owner: Greece + Location: 56,47 + Actor529: sbag + Owner: Greece + Location: 56,46 + Actor530: sbag + Owner: Greece + Location: 56,45 + Actor531: sbag + Owner: Greece + Location: 56,44 + Actor532: sbag + Owner: Greece + Location: 56,43 + Actor533: sbag + Owner: Greece + Location: 57,43 + Actor534: sbag + Owner: Greece + Location: 58,43 + Actor535: sbag + Owner: Greece + Location: 59,43 + Actor536: sbag + Owner: Greece + Location: 60,43 + Actor537: sbag + Owner: Greece + Location: 61,43 + Actor538: sbag + Owner: Greece + Location: 62,43 + Actor539: sbag + Owner: Greece + Location: 63,43 + Actor540: sbag + Owner: Greece + Location: 64,43 + Actor541: sbag + Owner: Greece + Location: 65,43 + Actor542: sbag + Owner: Greece + Location: 66,43 + Actor543: sbag + Owner: Greece + Location: 67,43 + Actor544: sbag + Owner: Greece + Location: 68,43 + Actor545: sbag + Owner: Greece + Location: 69,43 + Actor546: sbag + Owner: Greece + Location: 70,43 + Actor547: sbag + Owner: Greece + Location: 70,44 + Actor548: sbag + Owner: Greece + Location: 70,45 + Actor549: sbag + Owner: Greece + Location: 70,46 + Actor550: sbag + Owner: Greece + Location: 70,47 + Actor551: sbag + Owner: Greece + Location: 70,51 + Actor552: sbag + Owner: Greece + Location: 70,52 + Actor553: sbag + Owner: Greece + Location: 56,53 + Actor554: sbag + Owner: Greece + Location: 56,54 + Actor555: sbag + Owner: Greece + Location: 57,55 + Actor556: sbag + Owner: Greece + Location: 56,55 + Actor557: sbag + Owner: Greece + Location: 58,55 + Actor558: sbag + Owner: Greece + Location: 59,55 + Actor559: sbag + Owner: Greece + Location: 60,55 + Actor560: sbag + Owner: Greece + Location: 61,55 + Actor564: sbag + Owner: Greece + Location: 65,55 + Actor565: sbag + Owner: Greece + Location: 66,55 + Actor566: sbag + Owner: Greece + Location: 67,55 + Actor567: sbag + Owner: Greece + Location: 68,55 + Actor568: sbag + Owner: Greece + Location: 69,55 + Actor569: sbag + Owner: Greece + Location: 70,55 + Actor570: sbag + Owner: Greece + Location: 70,54 + Actor571: sbag + Owner: Greece + Location: 70,53 + Actor575: gun + Owner: Greece + Location: 55,48 + Actor576: pbox + Owner: Greece + Location: 55,49 + Actor577: pbox + Owner: Greece + Location: 71,52 + Actor578: gun + Owner: Greece + Location: 71,51 + AlliedCenterFactory: weap + Owner: Greece + Location: 67,44 + Actor582: powr + Owner: Greece + Location: 68,52 + Actor583: powr + Owner: Greece + Location: 66,52 + Actor572: silo + Owner: Greece + Location: 62,49 + Actor584: proc + Owner: Greece + Location: 62,49 + Actor585: silo + Owner: Greece + Location: 64,49 + AlliedCenterBarracks: tent + Owner: Greece + Location: 58,52 + Actor574: sbag + Owner: Greece + Location: 59,44 + Actor580: sbag + Owner: Greece + Location: 62,44 + Actor581: sbag + Owner: Greece + Location: 65,44 + Actor586: powr + Owner: Greece + Location: 60,44 + Actor587: powr + Owner: Greece + Location: 57,44 + Actor588: powr + Owner: Greece + Location: 63,44 + Actor589: sbag + Owner: Greece + Location: 59,45 + Actor590: sbag + Owner: Greece + Location: 62,45 + Actor591: sbag + Owner: Greece + Location: 65,45 + Actor592: split2 + Owner: Neutral + Location: 71,18 + Actor593: split2 + Owner: Neutral + Location: 76,16 + Actor594: split2 + Owner: Neutral + Location: 61,62 + Actor595: split2 + Owner: Neutral + Location: 59,68 + Actor596: split2 + Owner: Neutral + Location: 90,63 + Actor597: split2 + Owner: Neutral + Location: 91,57 + Actor598: tc01 + Owner: Neutral + Location: 31,88 + Actor599: tc04 + Owner: Neutral + Location: 31,90 + Actor600: tc05 + Owner: Neutral + Location: 30,93 + Actor601: t16 + Owner: Neutral + Location: 30,91 + Actor602: t16 + Owner: Neutral + Location: 15,76 + Actor603: t02 + Owner: Neutral + Location: 30,75 + Actor604: t01 + Owner: Neutral + Location: 29,65 + Actor605: t16 + Owner: Neutral + Location: 35,73 + Actor606: t11 + Owner: Neutral + Location: 47,63 + Actor607: tc01 + Owner: Neutral + Location: 51,52 + Actor608: t16 + Owner: Neutral + Location: 54,58 + Actor609: tc04 + Owner: Neutral + Location: 48,58 + Actor611: t07 + Owner: Neutral + Location: 45,50 + Actor612: t14 + Owner: Neutral + Location: 42,59 + Actor613: t12 + Owner: Neutral + Location: 38,63 + Actor614: v05 + Owner: Neutral + Location: 75,47 + Actor615: v02 + Owner: Neutral + Location: 80,46 + Actor616: v03 + Owner: Neutral + Location: 89,48 + Actor617: v04 + Owner: Neutral + Location: 80,38 + Actor618: v01 + Owner: Neutral + Location: 83,34 + Actor619: v09 + Owner: Neutral + Location: 75,40 + Actor620: v06 + Owner: Neutral + Location: 84,44 + Actor621: v16 + Owner: Neutral + Location: 85,42 + Actor622: v16 + Owner: Neutral + Location: 86,42 + Actor623: v17 + Owner: Neutral + Location: 87,42 + Actor624: v16 + Owner: Neutral + Location: 87,39 + Actor625: v18 + Owner: Neutral + Location: 86,39 + Actor626: v07 + Owner: Neutral + Location: 76,35 + Actor627: wood + Owner: Neutral + Location: 84,42 + Actor628: wood + Owner: Neutral + Location: 84,41 + Actor629: wood + Owner: Neutral + Location: 85,41 + Actor630: wood + Owner: Neutral + Location: 86,41 + Actor631: wood + Owner: Neutral + Location: 87,41 + Actor632: wood + Owner: Neutral + Location: 88,41 + Actor633: wood + Owner: Neutral + Location: 88,42 + Actor634: wood + Owner: Neutral + Location: 88,43 + Actor635: wood + Owner: Neutral + Location: 87,43 + Actor636: wood + Owner: Neutral + Location: 86,38 + Actor637: wood + Owner: Neutral + Location: 87,38 + Actor638: wood + Owner: Neutral + Location: 88,38 + Actor639: wood + Owner: Neutral + Location: 88,39 + Actor640: wood + Owner: Neutral + Location: 85,38 + Actor641: wood + Owner: Neutral + Location: 86,44 + Actor642: wood + Owner: Neutral + Location: 86,45 + Actor643: wood + Owner: Neutral + Location: 87,44 + Actor644: wood + Owner: Neutral + Location: 86,46 + Actor645: wood + Owner: Neutral + Location: 85,46 + Actor646: wood + Owner: Neutral + Location: 89,47 + Actor647: wood + Owner: Neutral + Location: 90,47 + Actor648: wood + Owner: Neutral + Location: 91,47 + Actor649: wood + Owner: Neutral + Location: 92,48 + Actor650: wood + Owner: Neutral + Location: 92,47 + Actor651: wood + Owner: Neutral + Location: 73,39 + Actor652: wood + Owner: Neutral + Location: 73,40 + Actor653: wood + Owner: Neutral + Location: 73,41 + Actor654: wood + Owner: Neutral + Location: 73,42 + Actor655: wood + Owner: Neutral + Location: 74,42 + Actor656: wood + Owner: Neutral + Location: 75,42 + Actor657: wood + Owner: Neutral + Location: 75,43 + Actor658: wood + Owner: Neutral + Location: 73,35 + Actor659: wood + Owner: Neutral + Location: 73,34 + Actor660: wood + Owner: Neutral + Location: 74,34 + Actor661: wood + Owner: Neutral + Location: 75,34 + Actor662: wood + Owner: Neutral + Location: 87,34 + Actor663: wood + Owner: Neutral + Location: 87,35 + Actor664: t08 + Owner: Neutral + Location: 74,41 + Actor665: t03 + Owner: Neutral + Location: 89,40 + Actor666: t16 + Owner: Neutral + Location: 90,45 + Actor667: tc02 + Owner: Neutral + Location: 69,34 + Actor668: t06 + Owner: Neutral + Location: 73,32 + Actor669: t05 + Owner: Neutral + Location: 83,30 + Actor670: t02 + Owner: Neutral + Location: 92,23 + Actor671: tc04 + Owner: Neutral + Location: 93,28 + Actor672: t16 + Owner: Neutral + Location: 92,11 + Actor673: tc02 + Owner: Neutral + Location: 93,18 + Actor674: t11 + Owner: Neutral + Location: 94,15 + Actor675: t15 + Owner: Neutral + Location: 93,12 + Actor676: tc04 + Owner: Neutral + Location: 92,5 + Actor677: tc05 + Owner: Neutral + Location: 91,3 + Actor678: t11 + Owner: Neutral + Location: 94,2 + Actor679: t16 + Owner: Neutral + Location: 92,2 + Actor680: t02 + Owner: Neutral + Location: 90,1 + Actor681: t05 + Owner: Neutral + Location: 80,3 + Actor682: tc02 + Owner: Neutral + Location: 78,1 + Actor683: t10 + Owner: Neutral + Location: 81,1 + Actor684: t14 + Owner: Neutral + Location: 85,3 + Actor685: t17 + Owner: Neutral + Location: 87,5 + Actor686: t02 + Owner: Neutral + Location: 79,2 + Actor687: t01 + Owner: Neutral + Location: 80,2 + Actor689: t05 + Owner: Neutral + Location: 72,2 + Actor690: tc04 + Owner: Neutral + Location: 79,7 + Actor691: t16 + Owner: Neutral + Location: 75,8 + Actor692: t02 + Owner: Neutral + Location: 71,7 + Actor693: tc01 + Owner: Neutral + Location: 85,15 + Actor694: tc05 + Owner: Neutral + Location: 88,34 + Actor695: tc03 + Owner: Neutral + Location: 71,25 + Actor696: t07 + Owner: Neutral + Location: 69,27 + Actor697: t02 + Owner: Neutral + Location: 68,25 + Actor698: t05 + Owner: Neutral + Location: 77,23 + Actor699: t16 + Owner: Neutral + Location: 51,34 + Actor700: t06 + Owner: Neutral + Location: 55,86 + Actor701: tc02 + Owner: Neutral + Location: 50,89 + Actor702: t16 + Owner: Neutral + Location: 48,93 + Actor703: tc01 + Owner: Neutral + Location: 36,94 + Actor704: tc04 + Owner: Neutral + Location: 39,91 + Actor705: tc05 + Owner: Neutral + Location: 42,92 + Actor706: t10 + Owner: Neutral + Location: 43,90 + Actor707: t12 + Owner: Neutral + Location: 45,92 + Actor708: t05 + Owner: Neutral + Location: 46,93 + Actor709: t02 + Owner: Neutral + Location: 47,95 + Actor710: t12 + Owner: Neutral + Location: 52,92 + Actor711: t11 + Owner: Neutral + Location: 44,81 + Actor712: t02 + Owner: Neutral + Location: 54,74 + Actor713: t01 + Owner: Neutral + Location: 63,92 + Actor714: t10 + Owner: Neutral + Location: 65,90 + Actor715: tc01 + Owner: Neutral + Location: 64,89 + Actor716: tc04 + Owner: Neutral + Location: 63,75 + Actor717: t16 + Owner: Neutral + Location: 65,71 + Actor718: tc02 + Owner: Neutral + Location: 66,58 + Actor719: tc01 + Owner: Neutral + Location: 79,58 + Actor720: t16 + Owner: Neutral + Location: 78,59 + Actor721: t11 + Owner: Neutral + Location: 77,57 + Actor722: t11 + Owner: Neutral + Location: 69,41 + Actor723: t13 + Owner: Neutral + Location: 47,46 + Actor724: t06 + Owner: Neutral + Location: 48,47 + Actor725: t16 + Owner: Neutral + Location: 59,35 + Actor726: t06 + Owner: Neutral + Location: 57,36 + Actor728: t02 + Owner: Neutral + Location: 12,84 + Actor729: t05 + Owner: Neutral + Location: 28,83 + Actor730: t07 + Owner: Neutral + Location: 36,86 + Actor731: tc01 + Owner: Neutral + Location: 34,79 + Actor732: tc02 + Owner: Neutral + Location: 44,72 + Actor733: t11 + Owner: Neutral + Location: 45,70 + Actor734: sbag + Owner: Greece + Location: 65,54 + Actor735: sbag + Owner: Greece + Location: 61,54 + Actor736: 2tnk + Owner: Greece + Facing: 384 + Location: 54,52 + Actor737: 2tnk + Owner: Greece + Location: 47,15 + Facing: 256 + Actor738: 2tnk + Owner: Greece + Location: 59,28 + Facing: 507 + Actor739: mrj + Owner: Greece + Location: 52,20 + Facing: 384 + Actor740: mrj + Owner: Greece + Facing: 384 + Location: 73,73 + Actor741: mrj + Owner: Greece + Location: 93,82 + Facing: 384 + AlliedPatroller2: 1tnk + Owner: Greece + Location: 17,82 + Facing: 761 + AlliedPatroller1: 1tnk + Owner: Greece + Location: 19,82 + Facing: 753 + Actor744: 1tnk + Owner: Greece + Facing: 384 + Location: 53,47 + Actor745: 1tnk + Owner: Greece + Location: 56,38 + Facing: 111 + Actor746: jeep + Owner: Greece + Location: 47,68 + Facing: 166 + Actor747: apc.ai + Owner: Greece + Location: 46,22 + Facing: 245 + Actor748: arty + Owner: Greece + Location: 71,77 + Facing: 317 + Actor749: arty + Owner: Greece + Location: 71,90 + Facing: 214 + Actor754: mgg + Owner: Greece + Facing: 384 + Location: 60,51 + Actor755: ptnk + Owner: Greece + Location: 59,37 + Facing: 111 + Prism2: ptnk + Owner: Greece + Location: 65,75 + Facing: 384 + Prism1: ptnk + Owner: Greece + Location: 64,75 + Facing: 384 + Cryo1: cryo + Owner: Greece + Location: 71,76 + Facing: 325 + Cryo3: cryo + Owner: Greece + Location: 73,87 + Facing: 261 + Cryo5: cryo + Owner: Greece + Location: 57,47 + Facing: 384 + Cryo4: cryo + Owner: Greece + Location: 52,21 + Facing: 384 + Actor763: ifv + Owner: Greece + Facing: 384 + Location: 56,14 + Actor764: ifv + Owner: Greece + Facing: 384 + Location: 55,7 + Actor766: batf.ai + Owner: Greece + Location: 77,85 + Facing: 253 + Prism3: pcan + Owner: Greece + Location: 68,90 + Facing: 134 + Actor768: 2tnk + Owner: Greece + Location: 66,88 + Facing: 256 + Actor769: 2tnk + Owner: Greece + Location: 65,87 + Facing: 256 + Actor770: 2tnk + Owner: Greece + Location: 65,82 + Facing: 256 + Actor771: apc.ai + Owner: Greece + Location: 49,86 + Facing: 253 + Actor772: sbag + Owner: Greece + Location: 40,86 + Actor773: sbag + Owner: Greece + Location: 40,87 + Actor774: sbag + Owner: Greece + Location: 41,87 + Actor775: sbag + Owner: Greece + Location: 41,87 + Actor776: sbag + Owner: Greece + Location: 42,87 + Actor779: sbag + Owner: Greece + Location: 42,79 + Actor780: sbag + Owner: Greece + Location: 41,79 + Actor781: sbag + Owner: Greece + Location: 42,80 + Actor784: pbox + Owner: Greece + Location: 41,80 + Actor785: pbox + Owner: Greece + Location: 38,86 + Actor786: agun + Owner: Greece + Location: 41,86 + TurretFacing: 832 + Actor777: sbag + Owner: Greece + Location: 42,86 + Actor778: sbag + Owner: Greece + Location: 43,80 + Actor782: sbag + Owner: Greece + Location: 44,80 + Actor783: sbag + Owner: Greece + Location: 43,86 + Actor787: e1 + Owner: Greece + SubCell: 3 + Location: 66,89 + Facing: 261 + Actor788: e1 + Owner: Greece + SubCell: 3 + Location: 66,87 + Facing: 277 + Actor789: e1 + Owner: Greece + SubCell: 3 + Location: 66,81 + Facing: 301 + Actor790: e1 + Owner: Greece + Location: 66,81 + SubCell: 1 + Facing: 222 + Actor791: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 66,76 + Actor792: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 65,74 + Actor794: e1 + Owner: Greece + SubCell: 3 + Location: 74,86 + Facing: 166 + Actor795: e1 + Owner: Greece + SubCell: 3 + Location: 80,76 + Facing: 0 + Actor796: e1 + Owner: Greece + SubCell: 3 + Location: 84,74 + Facing: 658 + Actor797: e1 + Owner: Greece + Location: 84,74 + SubCell: 1 + Facing: 0 + Actor809: e1 + Owner: Greece + SubCell: 3 + Location: 71,53 + Facing: 682 + Actor810: e1 + Owner: Greece + Location: 71,53 + SubCell: 1 + Facing: 785 + Actor811: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 71,47 + Actor812: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 73,46 + Actor813: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 72,44 + Actor814: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 58,38 + Actor815: e1 + Owner: Greece + Facing: 384 + Location: 58,38 + SubCell: 1 + Actor816: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 60,37 + Actor817: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 54,38 + Actor818: e1 + Owner: Greece + Facing: 384 + Location: 54,39 + SubCell: 3 + Actor819: e1 + Owner: Greece + Location: 58,28 + SubCell: 3 + Facing: 507 + Actor820: e1 + Owner: Greece + Facing: 384 + Location: 58,28 + SubCell: 1 + Actor821: e1 + Owner: Greece + Location: 60,28 + SubCell: 3 + Facing: 634 + Actor822: e1 + Owner: Greece + SubCell: 3 + Location: 63,28 + Facing: 634 + Actor823: e1 + Owner: Greece + SubCell: 3 + Location: 48,24 + Facing: 634 + Actor824: e1 + Owner: Greece + Location: 46,23 + SubCell: 3 + Facing: 384 + Actor825: e1 + Owner: Greece + SubCell: 3 + Location: 45,21 + Facing: 301 + Actor826: e1 + Owner: Greece + SubCell: 3 + Location: 47,17 + Facing: 245 + Actor827: e1 + Owner: Greece + Location: 47,17 + SubCell: 1 + Facing: 206 + Actor828: e1 + Owner: Greece + Location: 48,18 + SubCell: 3 + Facing: 206 + Actor829: e1 + Owner: Greece + Location: 45,13 + SubCell: 3 + Facing: 229 + Actor830: e1 + Owner: Greece + Location: 45,12 + SubCell: 3 + Facing: 269 + Actor831: e1 + Owner: Greece + SubCell: 3 + Location: 65,26 + Facing: 602 + Actor832: e1 + Owner: Greece + SubCell: 3 + Location: 62,18 + Facing: 384 + Actor833: e1 + Owner: Greece + Location: 62,18 + SubCell: 1 + Facing: 293 + Actor834: e1 + Owner: Greece + SubCell: 3 + Location: 63,15 + Facing: 935 + Actor835: e1 + Owner: Greece + SubCell: 3 + Location: 56,13 + Facing: 523 + Actor836: e1 + Owner: Greece + Facing: 384 + Location: 56,13 + SubCell: 1 + Actor837: e1 + Owner: Greece + SubCell: 3 + Location: 56,7 + Facing: 650 + Actor838: e1 + Owner: Greece + Location: 57,6 + SubCell: 3 + Facing: 499 + Actor840: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 47,21 + Actor842: e1 + Owner: Greece + SubCell: 3 + Location: 80,41 + Facing: 761 + Actor843: e1 + Owner: Greece + SubCell: 3 + Location: 79,40 + Facing: 0 + Actor844: e1 + Owner: Greece + SubCell: 3 + Location: 79,36 + Facing: 245 + Actor845: e1 + Owner: Greece + SubCell: 3 + Location: 75,38 + Facing: 253 + Actor846: e1 + Owner: Greece + SubCell: 3 + Location: 85,37 + Facing: 0 + Actor848: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 86,48 + Actor849: e3 + Owner: Greece + Facing: 384 + Location: 58,38 + SubCell: 2 + Actor850: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 55,39 + Actor852: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 54,48 + Actor853: e3 + Owner: Greece + Facing: 384 + Location: 60,52 + SubCell: 3 + Actor854: e1 + Owner: Greece + SubCell: 3 + Facing: 384 + Location: 52,47 + Actor855: e1 + Owner: Greece + Facing: 384 + Location: 54,47 + SubCell: 3 + Actor856: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 51,45 + Actor857: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 55,54 + Actor858: e1 + Owner: Greece + Facing: 384 + Location: 54,54 + SubCell: 3 + Actor859: e1 + Owner: Greece + Facing: 384 + Location: 54,54 + SubCell: 1 + Actor860: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 49,68 + Actor861: e1 + Owner: Greece + Facing: 384 + Location: 46,69 + SubCell: 3 + Actor862: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 48,68 + Actor863: e1 + Owner: Greece + Location: 50,85 + SubCell: 3 + Facing: 237 + Actor864: e1 + Owner: Greece + Location: 50,85 + SubCell: 1 + Facing: 0 + Actor865: e1 + Owner: Greece + SubCell: 3 + Location: 46,86 + Facing: 237 + Actor866: e1 + Owner: Greece + SubCell: 3 + Location: 41,85 + Facing: 237 + Actor867: e1 + Owner: Greece + SubCell: 3 + Location: 39,85 + Facing: 87 + Actor868: e1 + Owner: Greece + Location: 39,87 + SubCell: 3 + Facing: 111 + Actor869: e1 + Owner: Greece + SubCell: 3 + Location: 37,87 + Facing: 0 + Actor870: e1 + Owner: Greece + SubCell: 3 + Location: 40,82 + Facing: 174 + Actor871: e1 + Owner: Greece + Facing: 384 + Location: 41,82 + SubCell: 3 + Actor872: e1 + Owner: Greece + Location: 40,81 + SubCell: 3 + Facing: 309 + Actor873: e1 + Owner: Greece + SubCell: 1 + Location: 40,82 + Facing: 150 + Actor874: e1 + Owner: Greece + SubCell: 3 + Location: 40,79 + Facing: 384 + Actor875: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 55,86 + Actor876: e1 + Owner: Greece + SubCell: 3 + Location: 50,88 + Facing: 0 + Actor877: e1 + Owner: Greece + SubCell: 3 + Location: 61,92 + Facing: 309 + Actor878: e1 + Owner: Greece + SubCell: 3 + Location: 60,86 + Facing: 253 + Actor879: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 52,64 + Actor880: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 51,66 + Actor881: e1 + Owner: Greece + SubCell: 3 + Location: 84,20 + Facing: 658 + Actor882: e1 + Owner: Greece + Facing: 384 + Location: 84,20 + SubCell: 1 + Actor884: e1 + Owner: Greece + Location: 82,21 + SubCell: 3 + Facing: 384 + Actor885: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 85,15 + Actor886: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 84,31 + Actor887: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 75,33 + Actor888: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 72,27 + Actor889: e1 + Owner: Greece + Location: 87,48 + SubCell: 3 + Facing: 467 + Actor890: e1 + Owner: Greece + SubCell: 3 + Location: 76,56 + Facing: 166 + Actor891: e1 + Owner: Greece + Location: 76,56 + SubCell: 1 + Facing: 0 + Actor892: e1 + Owner: Greece + SubCell: 3 + Location: 77,53 + Facing: 0 + Actor893: e1 + Owner: Greece + SubCell: 3 + Location: 73,60 + Facing: 0 + Actor894: e1 + Owner: Greece + SubCell: 3 + Location: 72,58 + Facing: 214 + Actor895: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 69,72 + Actor896: e1 + Owner: Greece + SubCell: 3 + Location: 81,86 + Facing: 388 + Actor897: e1 + Owner: Greece + Location: 81,86 + SubCell: 1 + Facing: 206 + Actor898: e1 + Owner: Greece + SubCell: 3 + Location: 86,86 + Facing: 384 + Actor899: e1 + Owner: Greece + SubCell: 3 + Location: 90,85 + Facing: 547 + Actor901: e1 + Owner: Greece + SubCell: 3 + Location: 51,91 + Facing: 626 + Actor902: e1 + Owner: Greece + SubCell: 3 + Location: 52,90 + Facing: 1023 + Actor903: e3 + Owner: Greece + Location: 52,90 + SubCell: 1 + Facing: 182 + Actor904: e3 + Owner: Greece + SubCell: 3 + Location: 43,87 + Facing: 721 + Actor905: e3 + Owner: Greece + Location: 43,87 + SubCell: 1 + Facing: 39 + Actor906: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 47,69 + Actor907: e3 + Owner: Greece + Facing: 384 + Location: 54,54 + SubCell: 2 + Actor908: e3 + Owner: Greece + Facing: 384 + Location: 63,28 + SubCell: 1 + Actor909: e3 + Owner: Greece + Facing: 384 + Location: 47,21 + SubCell: 1 + Actor910: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 47,13 + Actor911: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 50,8 + Actor912: e3 + Owner: Greece + Facing: 384 + Location: 57,6 + SubCell: 1 + Actor913: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 59,7 + Actor914: e3 + Owner: Greece + SubCell: 3 + Location: 62,14 + Facing: 769 + Actor915: e3 + Owner: Greece + Location: 82,21 + SubCell: 1 + Facing: 261 + Actor916: e3 + Owner: Greece + SubCell: 3 + Location: 85,18 + Facing: 650 + Actor917: e3 + Owner: Greece + Facing: 384 + Location: 80,41 + SubCell: 1 + Actor919: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 66,51 + Actor920: e3 + Owner: Greece + SubCell: 3 + Location: 74,73 + Facing: 0 + Actor923: e3 + Owner: Greece + SubCell: 3 + Location: 86,85 + Facing: 785 + Actor924: e3 + Owner: Greece + Location: 90,85 + SubCell: 1 + Facing: 384 + Actor925: e3 + Owner: Greece + SubCell: 3 + Location: 92,82 + Facing: 237 + Actor926: e3 + Owner: Greece + SubCell: 3 + Location: 72,91 + Facing: 150 + Actor927: e3 + Owner: Greece + SubCell: 3 + Location: 64,91 + Facing: 158 + Actor928: mech + Owner: Greece + Location: 74,86 + SubCell: 1 + Facing: 182 + Actor929: mech + Owner: Greece + SubCell: 3 + Location: 72,75 + Facing: 285 + Actor931: mech + Owner: Greece + Facing: 384 + Location: 84,84 + SubCell: 3 + Actor932: mech + Owner: Greece + SubCell: 3 + Location: 48,87 + Facing: 880 + Actor933: medi + Owner: Greece + Facing: 384 + SubCell: 1 + Location: 47,69 + Actor934: medi + Owner: Greece + Facing: 384 + Location: 55,47 + SubCell: 3 + Actor935: medi + Owner: Greece + Facing: 384 + Location: 55,39 + SubCell: 1 + Actor936: medi + Owner: Greece + SubCell: 3 + Location: 48,19 + Facing: 214 + Actor937: medi + Owner: Greece + SubCell: 3 + Location: 48,13 + Facing: 237 + Actor938: medi + Owner: Greece + Facing: 384 + Location: 62,14 + SubCell: 1 + Actor939: medi + Owner: Greece + SubCell: 3 + Location: 85,19 + Facing: 384 + Actor941: medi + Owner: Greece + Facing: 384 + Location: 55,53 + SubCell: 3 + Actor942: medi + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 41,83 + Actor943: medi + Owner: Greece + SubCell: 3 + Location: 67,81 + Facing: 277 + Actor944: medi + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 67,75 + Actor945: medi + Owner: Greece + Location: 81,76 + SubCell: 3 + Facing: 0 + Actor946: hosp + Owner: Greece + Location: 80,30 + Actor947: v10 + Owner: Greece + Location: 88,27 + Actor948: v08 + Owner: Greece + Location: 87,24 + Actor949: v12 + Owner: Greece + Location: 89,21 + Actor950: barl + Owner: Creeps + Location: 39,88 + Actor951: brl3 + Owner: Creeps + Location: 40,88 + Actor952: brl3 + Owner: Creeps + Location: 84,80 + Actor953: brl3 + Owner: Creeps + Location: 66,44 + Actor954: barl + Owner: Creeps + Location: 66,45 + Actor955: barl + Owner: Creeps + Location: 55,44 + Actor956: gun + Owner: Greece + Location: 67,12 + Actor957: gun + Owner: Greece + Location: 51,67 + Actor958: gun + Owner: Greece + Location: 37,88 + Actor959: gun + Owner: Greece + Location: 56,84 + Actor960: gun + Owner: Greece + Location: 58,36 + Actor961: sbag + Owner: Greece + Location: 46,30 + Actor962: sbag + Owner: Greece + Location: 46,31 + Actor963: sbag + Owner: Greece + Location: 47,31 + Actor964: sbag + Owner: Greece + Location: 46,29 + Actor965: sbag + Owner: Greece + Location: 47,32 + Actor966: agun + Owner: Greece + Location: 47,30 + TurretFacing: 832 + Actor967: agun + Owner: Greece + Location: 54,78 + TurretFacing: 832 + Actor969: sbag + Owner: Greece + Location: 53,77 + Actor970: sbag + Owner: Greece + Location: 54,77 + Actor971: sbag + Owner: Greece + Location: 53,78 + Actor972: sbag + Owner: Greece + Location: 53,79 + Actor973: sbag + Owner: Greece + Location: 54,79 + Actor968: hpad + Owner: Greece + Location: 91,39 + Actor974: hpad + Owner: Greece + Location: 93,39 + Actor975: sbag + Owner: Greece + Location: 90,38 + Actor976: sbag + Owner: Greece + Location: 90,39 + Actor977: sbag + Owner: Greece + Location: 90,40 + Actor978: sbag + Owner: Greece + Location: 90,41 + Actor979: sbag + Owner: Greece + Location: 91,38 + Actor980: sbag + Owner: Greece + Location: 92,38 + Actor981: sbag + Owner: Greece + Location: 93,38 + Actor982: sbag + Owner: Greece + Location: 94,38 + Actor983: sbag + Owner: Greece + Location: 95,38 + Actor984: sbag + Owner: Greece + Location: 95,39 + Actor985: sbag + Owner: Greece + Location: 95,40 + Actor986: sbag + Owner: Greece + Location: 95,41 + Actor987: sbag + Owner: Greece + Location: 95,42 + Actor988: sbag + Owner: Greece + Location: 90,42 + Actor989: sbag + Owner: Greece + Location: 91,42 + Actor990: sbag + Owner: Greece + Location: 94,42 + Actor991: pbox + Owner: Greece + Location: 92,44 + Actor992: agun + Owner: Greece + Location: 93,36 + Actor993: sbag + Owner: Greece + Location: 92,36 + Actor994: sbag + Owner: Greece + Location: 92,35 + Actor995: sbag + Owner: Greece + Location: 93,35 + Actor996: sbag + Owner: Greece + Location: 94,35 + Actor997: sbag + Owner: Greece + Location: 94,36 + Actor998: mech + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 57,48 + Actor999: n1 + Owner: GDI + SubCell: 3 + Location: 10,47 + Facing: 31 + Actor1000: n1 + Owner: GDI + Location: 11,46 + SubCell: 3 + Facing: 0 + Actor1001: n1 + Owner: GDI + SubCell: 3 + Location: 33,38 + Facing: 721 + Actor1002: n1 + Owner: GDI + Facing: 384 + Location: 33,38 + SubCell: 1 + Actor1003: n1 + Owner: GDI + SubCell: 3 + Location: 8,34 + Facing: 951 + Actor1004: n1 + Owner: GDI + SubCell: 3 + Location: 8,35 + Facing: 737 + Actor1005: n1 + Owner: GDI + Location: 8,35 + SubCell: 1 + Facing: 0 + Actor1006: n2 + Owner: GDI + SubCell: 3 + Location: 7,36 + Facing: 475 + Actor1007: n2 + Owner: GDI + SubCell: 3 + Location: 34,37 + Facing: 919 + Actor1008: n2 + Owner: GDI + SubCell: 3 + Location: 13,35 + Facing: 214 + Actor1010: n2 + Owner: GDI + Location: 10,47 + SubCell: 1 + Facing: 111 + Actor1011: n2 + Owner: GDI + SubCell: 3 + Location: 12,46 + Facing: 880 + Actor1009: htur + Owner: Greece + Location: 68,77 + TurretFacing: 277 + Actor1021: sbag + Owner: Greece + Location: 69,76 + Actor1022: sbag + Owner: Greece + Location: 68,76 + Actor1023: sbag + Owner: Greece + Location: 67,76 + Actor1024: sbag + Owner: Greece + Location: 67,77 + Actor1025: sbag + Owner: Greece + Location: 67,78 + Actor1026: sbag + Owner: Greece + Location: 67,79 + Actor1027: sbag + Owner: Greece + Location: 68,79 + Actor1028: sbag + Owner: Greece + Location: 69,79 + Actor1013: sbag + Owner: Greece + Location: 61,33 + Actor1014: sbag + Owner: Greece + Location: 61,32 + Actor1020: sbag + Owner: Greece + Location: 62,33 + Actor1032: sbag + Owner: Greece + Location: 61,31 + Actor1033: htur + Owner: Greece + Location: 62,31 + TurretFacing: 325 + Actor1034: sbag + Owner: Greece + Location: 63,33 + Actor1035: sbag + Owner: Greece + Location: 64,33 + Actor1036: sbag + Owner: Greece + Location: 64,32 + Actor1037: sbag + Owner: Greece + Location: 64,31 + Actor1038: sbag + Owner: Greece + Location: 61,30 + Actor1039: sbag + Owner: Greece + Location: 62,30 + Actor1040: sbag + Owner: Greece + Location: 63,30 + Actor1041: sbag + Owner: Greece + Location: 64,30 + Actor1042: mtnk + Owner: GDI + Location: 17,89 + Facing: 0 + Actor1043: hmmv + Owner: GDI + Location: 27,57 + Facing: 384 + Actor1044: hmmv + Owner: GDI + Location: 32,63 + Facing: 634 + Actor1045: n1 + Owner: GDI + SubCell: 3 + Facing: 384 + Location: 31,63 + Actor1046: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 33,66 + Actor1047: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 21,60 + Actor1048: n1 + Owner: GDI + SubCell: 3 + Location: 44,46 + Facing: 190 + Actor1049: n1 + Owner: GDI + SubCell: 3 + Location: 25,42 + Facing: 118 + Actor1050: n2 + Owner: GDI + SubCell: 3 + Location: 26,41 + Facing: 0 + Actor1051: brik + Owner: Greece + Location: 65,1 + Actor1052: brik + Owner: Greece + Location: 66,1 + Actor1053: brik + Owner: Greece + Location: 67,1 + Actor1054: brik + Owner: Greece + Location: 67,2 + Actor1055: brik + Owner: Greece + Location: 67,3 + Actor1056: brik + Owner: Greece + Location: 67,4 + Actor1057: brik + Owner: Greece + Location: 67,5 + Actor1058: brik + Owner: Greece + Location: 67,6 + Actor1059: brik + Owner: Greece + Location: 67,7 + Actor1060: brik + Owner: Greece + Location: 67,8 + Actor1061: brik + Owner: Greece + Location: 66,8 + Actor1062: brik + Owner: Greece + Location: 66,7 + Actor1063: chain + Owner: Greece + Location: 62,2 + Actor1064: chain + Owner: Greece + Location: 63,2 + Actor1065: chain + Owner: Greece + Location: 64,2 + Actor1066: chain + Owner: Greece + Location: 65,2 + Actor1067: chain + Owner: Greece + Location: 66,2 + Actor1068: chain + Owner: Greece + Location: 66,3 + Actor1069: chain + Owner: Greece + Location: 66,4 + Actor1070: chain + Owner: Greece + Location: 66,5 + Actor1071: chain + Owner: Greece + Location: 66,6 + Actor1072: chain + Owner: Greece + Location: 62,3 + Actor1073: chain + Owner: Greece + Location: 62,4 + Actor1074: chain + Owner: Greece + Location: 62,5 + Actor1075: chain + Owner: Greece + Location: 62,6 + Actor1076: chain + Owner: Greece + Location: 65,6 + Actor1077: chain + Owner: Greece + Location: 63,6 + Actor1078: chain + Owner: Greece + Location: 65,7 + Actor1079: chain + Owner: Greece + Location: 65,8 + Actor1080: chain + Owner: Greece + Location: 63,7 + Actor1081: chain + Owner: Greece + Location: 63,8 + Actor1082: chain + Owner: Greece + Location: 92,76 + Actor1083: chain + Owner: Greece + Location: 92,77 + Actor1084: chain + Owner: Greece + Location: 92,78 + Actor1085: chain + Owner: Greece + Location: 92,79 + Actor1086: chain + Owner: Greece + Location: 93,76 + Actor1087: chain + Owner: Greece + Location: 94,76 + Actor1088: chain + Owner: Greece + Location: 95,76 + Actor1089: chain + Owner: Greece + Location: 96,76 + Actor1090: chain + Owner: Greece + Location: 96,77 + Actor1091: chain + Owner: Greece + Location: 96,78 + Actor1092: chain + Owner: Greece + Location: 96,79 + Actor1093: chain + Owner: Greece + Location: 96,80 + Actor1094: chain + Owner: Greece + Location: 92,80 + Actor1095: chain + Owner: Greece + Location: 93,80 + Actor1096: chain + Owner: Greece + Location: 95,80 + Researcher2: moebius + Owner: Neutral + SubCell: 3 + Location: 94,77 + Facing: 384 + Researcher1: chan + Owner: Neutral + SubCell: 3 + Location: 64,3 + Facing: 384 + Actor1099: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 93,81 + Actor1100: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 95,81 + Actor1101: e1 + Owner: Greece + SubCell: 3 + Location: 95,77 + Facing: 384 + Actor1102: e1 + Owner: Greece + Facing: 384 + Location: 93,77 + SubCell: 3 + Actor1103: e1 + Owner: Greece + Facing: 384 + Location: 62,7 + SubCell: 3 + Actor1104: e1 + Owner: Greece + Facing: 384 + Location: 63,3 + SubCell: 3 + Actor1105: e1 + Owner: Greece + Location: 65,3 + SubCell: 3 + Facing: 384 + Actor1106: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 66,9 + Actor1107: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 62,9 + Actor1108: pbox + Owner: Greece + Location: 68,7 + Actor1109: apwr + Owner: Greece + Location: 50,5 + HardAndNormalOnlyPower: powr + Owner: Greece + Location: 61,10 + Actor1113: apwr + Owner: Greece + Location: 81,88 + Actor1114: apwr + Owner: Greece + Location: 84,88 + Actor1115: powr + Owner: Greece + Location: 87,87 + PlayerStart: waypoint + Owner: Neutral + Location: 33,9 + LeftBaseTrigger1: waypoint + Owner: Neutral + Location: 5,48 + LeftBaseTrigger2: waypoint + Owner: Neutral + Location: 6,48 + LeftBaseTrigger3: waypoint + Owner: Neutral + Location: 7,48 + LeftBaseTrigger4: waypoint + Owner: Neutral + Location: 8,48 + LeftBaseTrigger5: waypoint + Owner: Neutral + Location: 9,48 + LeftBaseTrigger6: waypoint + Owner: Neutral + Location: 10,48 + LeftBaseTrigger7: waypoint + Owner: Neutral + Location: 11,48 + RightBaseTrigger1: waypoint + Owner: Neutral + Location: 37,44 + RightBaseTrigger2: waypoint + Owner: Neutral + Location: 38,44 + RightBaseTrigger3: waypoint + Owner: Neutral + Location: 39,44 + RightBaseTrigger4: waypoint + Owner: Neutral + Location: 40,44 + RightBaseTrigger5: waypoint + Owner: Neutral + Location: 41,44 + RightBaseTrigger6: waypoint + Owner: Neutral + Location: 42,44 + RightBaseTrigger7: waypoint + Owner: Neutral + Location: 43,44 + Actor1117: tc01 + Owner: Neutral + Location: 22,29 + Actor1121: t02 + Owner: Neutral + Location: 27,34 + Actor1122: t01 + Owner: Neutral + Location: 19,32 + GDIHarvester: harv.td + Owner: GDI + Location: 23,73 + Facing: 384 + Actor1123: pbox + Owner: Greece + Location: 51,36 + EvacPoint: waypoint + Owner: Neutral + Location: 18,8 + EvacSpawn: waypoint + Owner: Neutral + Location: 21,1 + GDIDefender1: htnk + Owner: GDI + Location: 40,52 + Facing: 916 + GDIBaseCenter: waypoint + Owner: Neutral + Location: 25,53 + NorthAttack1: waypoint + Owner: Neutral + Location: 35,19 + EastAttack2: waypoint + Owner: Neutral + Location: 41,53 + NorthWestAttack1: waypoint + Owner: Neutral + Location: 6,23 + NorthWestAttack2: waypoint + Owner: Neutral + Location: 9,53 + SouthEastAttack1: waypoint + Owner: Neutral + Location: 41,62 + SouthAttack2: waypoint + Owner: Neutral + Location: 32,82 + SouthCentralAttack1: waypoint + Owner: Neutral + Location: 27,66 + EastAttack1: waypoint + Owner: Neutral + Location: 77,49 + BaseTriggerBackup: waypoint + Owner: Neutral + Location: 56,30 + Actor1097: mtnk + Owner: Legion + Location: 28,54 + Facing: 640 + Actor1098: n3 + Owner: Legion + Facing: 384 + SubCell: 3 + Location: 29,53 + Actor1116: n1 + Owner: Legion + SubCell: 3 + Location: 31,56 + Facing: 384 + Actor1124: powr + Owner: Greece + Location: 89,87 + HardOnlyPower: apwr + Owner: Greece + Location: 91,83 + SouthWestAttack1: waypoint + Owner: Neutral + Location: 6,73 + NorthEastAttack1: waypoint + Owner: Neutral + Location: 41,46 + SouthAttack1: waypoint + Owner: Neutral + Location: 53,84 + Actor1126: batf.ai + Owner: Greece + Location: 60,46 + Facing: 253 + Actor1129: atwr + Owner: GDI + Location: 31,30 + Actor1118: n2 + Owner: GDI + SubCell: 3 + Facing: 0 + Location: 34,33 + Actor1130: n1 + Owner: GDI + SubCell: 1 + Facing: 943 + Location: 34,33 + Actor1127: atwr + Owner: GDI + Location: 15,30 + Actor1128: t15 + Owner: Neutral + Location: 14,26 + GDIDefender5: mtnk + Owner: GDI + Facing: 0 + Location: 11,27 + Actor1132: n1 + Owner: GDI + SubCell: 3 + Facing: 1007 + Location: 8,33 + Actor1134: n1 + Owner: GDI + SubCell: 3 + Facing: 0 + Location: 38,42 + Actor1135: n2 + Owner: GDI + SubCell: 3 + Facing: 880 + Location: 39,42 + Actor1131: n1 + Owner: GDI + SubCell: 3 + Facing: 142 + Location: 34,31 + GDIDefender6: mtnk + Owner: GDI + Location: 35,30 + Facing: 0 + GDIDefender3: msam + Owner: GDI + Location: 16,36 + Facing: 128 + GDIDefender4: msam + Owner: GDI + Location: 30,36 + Facing: 864 + Actor1138: camera + Owner: Greece + Location: 34,53 + Actor1139: camera + Owner: Greece + Location: 27,58 + Actor1140: camera + Owner: Greece + Location: 14,53 + Actor1141: camera + Owner: Greece + Location: 28,80 + Actor1142: camera + Owner: Greece + Location: 11,77 + ChinookDrop2Landing: waypoint + Owner: Neutral + Location: 5,69 + ChinookDrop1Landing: waypoint + Owner: Neutral + Location: 52,61 + ChinookDrop3Landing: waypoint + Owner: Neutral + Location: 41,33 + ChinookDrop4Landing: waypoint + Owner: Neutral + Location: 19,30 + GDIReinforceSpawn: waypoint + Owner: Neutral + Location: 1,23 + GDIReinforceRally: waypoint + Owner: Neutral + Location: 8,23 + ChinookDrop3Spawn: waypoint + Owner: Neutral + Location: 46,1 + AlliedPatrol1: waypoint + Owner: Neutral + Location: 36,82 + AlliedPatrol2: waypoint + Owner: Neutral + Location: 10,80 + Actor1133: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 51,40 + Actor1143: e3 + Owner: Greece + Facing: 384 + SubCell: 1 + Location: 51,40 + Actor1144: n1 + Owner: Legion + Location: 20,51 + SubCell: 1 + Facing: 384 + Actor1145: n1 + Owner: Legion + SubCell: 3 + Location: 27,53 + Facing: 384 + Actor1146: n1 + Owner: Legion + Facing: 384 + Location: 27,53 + SubCell: 1 + Actor1147: n1 + Owner: Legion + Location: 17,53 + SubCell: 1 + Facing: 384 + Actor1148: n1 + Owner: Legion + SubCell: 3 + Location: 17,51 + Facing: 384 + Actor1149: n1 + Owner: Legion + SubCell: 3 + Location: 11,55 + Facing: 384 + Actor1150: n1 + Owner: GDI + SubCell: 3 + Location: 18,54 + Facing: 79 + Actor1151: n1 + Owner: GDI + SubCell: 3 + Location: 38,57 + Facing: 384 + Actor1152: n1 + Owner: GDI + SubCell: 3 + Location: 41,55 + Facing: 0 + Actor1153: n1 + Owner: GDI + SubCell: 3 + Facing: 31 + Location: 39,43 + Actor1154: n2 + Owner: GDI + SubCell: 1 + Facing: 111 + Location: 39,43 + Actor1136: n1 + Owner: GDI + SubCell: 3 + Location: 6,54 + Facing: 1007 + Actor1137: mtnk + Owner: Legion + Location: 7,58 + Facing: 904 + Actor1155: mtnk + Owner: Legion + Location: 39,57 + Facing: 0 + Actor1156: n3 + Owner: Legion + SubCell: 3 + Facing: 384 + Location: 40,57 + Actor1157: n3 + Owner: Legion + Facing: 384 + SubCell: 3 + Location: 43,56 + Actor1158: n1 + Owner: Legion + SubCell: 3 + Location: 39,56 + Facing: 0 + Actor1159: n1 + Owner: Legion + SubCell: 3 + Location: 44,54 + Facing: 174 + Actor1160: tc01 + Owner: Neutral + Location: 31,16 + Actor1161: e1 + Owner: Greece + SubCell: 3 + Facing: 253 + Location: 78,61 + Actor1162: ifv + Owner: Greece + Facing: 245 + Location: 77,62 + Actor1163: e1 + Owner: Greece + SubCell: 3 + Facing: 126 + Location: 76,63 + Actor1164: e1 + Owner: Greece + SubCell: 3 + Facing: 642 + Location: 78,63 + Actor1165: mech + Owner: Greece + SubCell: 1 + Facing: 71 + Location: 78,63 + Actor1166: e1 + Owner: Greece + SubCell: 3 + Facing: 198 + Location: 74,64 + Actor1167: 1tnk + Owner: Greece + Facing: 111 + Location: 75,64 + Actor1168: 1tnk + Owner: Greece + Facing: 111 + Location: 76,64 + Actor1169: e1 + Owner: Greece + SubCell: 3 + Facing: 31 + Location: 77,64 + Actor1170: sbag + Owner: Greece + Location: 71,67 + Actor1171: sbag + Owner: Greece + Location: 72,67 + Actor1172: sbag + Owner: Greece + Location: 73,67 + Actor1173: sbag + Owner: Greece + Location: 74,67 + Actor1174: sbag + Owner: Greece + Location: 71,68 + Actor1175: htur + Owner: Greece + TurretFacing: 95 + Location: 72,68 + Actor1176: sbag + Owner: Greece + Location: 74,68 + Actor1177: sbag + Owner: Greece + Location: 71,69 + Actor1178: sbag + Owner: Greece + Location: 74,69 + Actor1179: arty + Owner: Greece + Facing: 0 + Location: 74,71 + Actor1180: gun + Owner: Greece + Location: 76,69 + Actor1181: pbox + Owner: Greece + Location: 77,69 + Actor1182: brik + Owner: Greece + Location: 76,70 + Actor1183: brik + Owner: Greece + Location: 77,70 + Actor1184: brik + Owner: Greece + Location: 78,70 + Actor1185: pris + Owner: Greece + Location: 76,71 + Actor1186: brik + Owner: Greece + Location: 77,71 + Actor1187: brik + Owner: Greece + Location: 78,71 + Actor1188: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 84,68 + Actor1189: e1 + Owner: Greece + SubCell: 1 + Facing: 190 + TurretFacing: 967 + Location: 84,68 + Actor1190: pbox + Owner: Greece + Location: 83,69 + Actor1191: gun + Owner: Greece + Location: 84,69 + Actor1192: brik + Owner: Greece + Location: 82,70 + Actor1193: brik + Owner: Greece + Location: 83,70 + Actor1194: brik + Owner: Greece + Location: 84,70 + Actor1195: brik + Owner: Greece + Location: 85,70 + Actor1196: brik + Owner: Greece + Location: 86,70 + Actor1197: brik + Owner: Greece + Location: 82,71 + Actor1198: brik + Owner: Greece + Location: 83,71 + Actor1199: pris + Owner: Greece + Location: 84,71 + Actor1200: e3 + Owner: Greece + SubCell: 3 + Facing: 602 + Location: 83,76 + Actor1205: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 80,45 + Actor1206: medi + Owner: Greece + SubCell: 1 + Facing: 229 + Location: 80,45 + Actor1203: e1 + Owner: Greece + SubCell: 3 + Facing: 586 + Location: 76,45 + Cryo2: cryo + Owner: Greece + Location: 71,71 + Facing: 71 + Actor1202: e3 + Owner: Greece + SubCell: 3 + Location: 88,78 + Facing: 785 + Actor1204: e3 + Owner: Greece + SubCell: 3 + Location: 87,78 + Facing: 388 + SouthEastBaseCenter: waypoint + Owner: Neutral + Location: 80,78 + Actor1207: 1tnk + Owner: Greece + Facing: 111 + Location: 69,31 + Actor1208: 2tnk + Owner: Greece + Facing: 507 + Location: 58,21 + Actor1209: e1 + Owner: Greece + SubCell: 3 + Facing: 507 + Location: 58,19 + Actor1210: e1 + Owner: Greece + Facing: 384 + SubCell: 1 + Location: 58,19 + Actor1211: e1 + Owner: Greece + SubCell: 3 + Facing: 634 + Location: 64,20 + Actor1212: e3 + Owner: Greece + Facing: 384 + SubCell: 1 + Location: 64,20 + ExtraPower2: waypoint + Owner: Neutral + Location: 78,88 + ExtraPower1: waypoint + Owner: Neutral + Location: 75,88 + EntranceReveal5: waypoint + Owner: Neutral + Location: 46,15 + EntranceReveal4: waypoint + Owner: Neutral + Location: 55,51 + EntranceReveal2: waypoint + Owner: Neutral + Location: 69,84 + EntranceReveal1: waypoint + Owner: Neutral + Location: 40,83 + EntranceReveal3: waypoint + Owner: Neutral + Location: 80,69 + EntranceReveal6: waypoint + Owner: Neutral + Location: 59,25 + ChinookDrop2Spawn: waypoint + Owner: Neutral + Location: 96,87 + ChinookDrop2Mid: waypoint + Owner: Neutral + Location: 20,92 + ChinookDrop4Spawn: waypoint + Owner: Neutral + Location: 71,1 + ChinookDrop1Spawn: waypoint + Owner: Neutral + Location: 96,72 + Actor1120: agun + Owner: Greece + TurretFacing: 832 + Location: 95,92 + Actor1119: fact + Owner: Greece + Location: 92,86 + Actor1110: ifv + Owner: Greece + Location: 87,90 + Facing: 384 + Actor1111: ifv + Owner: Greece + Location: 91,89 + Facing: 531 + Actor1216: chain + Owner: Greece + Location: 91,93 + Actor1217: chain + Owner: Greece + Location: 90,93 + Actor1218: chain + Owner: Greece + Location: 92,93 + Actor1219: chain + Owner: Greece + Location: 92,92 + Actor1220: chain + Owner: Greece + Location: 92,91 + Actor1221: chain + Owner: Greece + Location: 92,90 + Actor1222: chain + Owner: Greece + Location: 91,90 + Actor1125: chain + Owner: Greece + Location: 90,90 + WeatherControl: weat + Owner: Greece + Location: 90,91 + Actor1112: e3 + Owner: Greece + Facing: 384 + Location: 88,90 + SubCell: 3 + Actor1223: e3 + Owner: Greece + Facing: 384 + Location: 89,94 + SubCell: 3 + Actor503: agun + Owner: Greece + Location: 68,95 + TurretFacing: 832 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-covenants.yaml, conspiracy-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml, conspiracy-weapons.yaml diff --git a/mods/ca/missions/main-campaign/ca07-conspiracy/n_escortresearcher.aud b/mods/ca/missions/main-campaign/ca07-conspiracy/n_escortresearcher.aud new file mode 100644 index 0000000000..c1979ef1b4 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca07-conspiracy/n_escortresearcher.aud differ diff --git a/mods/ca/missions/main-campaign/ca07-conspiracy/n_evacinbound.aud b/mods/ca/missions/main-campaign/ca07-conspiracy/n_evacinbound.aud new file mode 100644 index 0000000000..64d3dff4ff Binary files /dev/null and b/mods/ca/missions/main-campaign/ca07-conspiracy/n_evacinbound.aud differ diff --git a/mods/ca/missions/main-campaign/ca07-conspiracy/n_researcherlocated.aud b/mods/ca/missions/main-campaign/ca07-conspiracy/n_researcherlocated.aud new file mode 100644 index 0000000000..ababc70aa0 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca07-conspiracy/n_researcherlocated.aud differ diff --git a/mods/ca/missions/main-campaign/ca07-conspiracy/timehascome.aud b/mods/ca/missions/main-campaign/ca07-conspiracy/timehascome.aud new file mode 100644 index 0000000000..b1652ac1d2 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca07-conspiracy/timehascome.aud differ diff --git a/mods/ca/missions/main-campaign/ca08-subversion/map.bin b/mods/ca/missions/main-campaign/ca08-subversion/map.bin new file mode 100644 index 0000000000..352aff6e23 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca08-subversion/map.bin differ diff --git a/mods/ca/missions/main-campaign/ca08-subversion/map.png b/mods/ca/missions/main-campaign/ca08-subversion/map.png new file mode 100644 index 0000000000..74f00552af Binary files /dev/null and b/mods/ca/missions/main-campaign/ca08-subversion/map.png differ diff --git a/mods/ca/missions/main-campaign/ca08-subversion/map.yaml b/mods/ca/missions/main-campaign/ca08-subversion/map.yaml new file mode 100644 index 0000000000..0f3cad6aa5 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca08-subversion/map.yaml @@ -0,0 +1,4363 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 08: Subversion + +Author: Darkademic + +Tileset: TEMPERAT + +MapSize: 114,82 + +Bounds: 1,1,112,80 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: Nod, Greece, GDI + PlayerReference@Nod: + Name: Nod + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: nod + LockColor: True + Color: FE1100 + LockSpawn: True + LockTeam: True + Enemies: Greece, GDI, Creeps + PlayerReference@Greece: + Name: Greece + Bot: campaign + Faction: allies + Color: 99ACF2 + Allies: GDI + Enemies: Nod, Creeps + PlayerReference@GDI: + Name: GDI + Bot: campaign + Faction: gdi + Color: F2CF74 + Allies: Greece + Enemies: Nod, Creeps + +Actors: + Commando: rmbo + Owner: Nod + SubCell: 3 + Location: 9,72 + Facing: 0 + Actor3: gtwr + Owner: GDI + Location: 7,63 + Actor4: n1 + Owner: GDI + SubCell: 3 + Location: 7,60 + Facing: 658 + Actor5: n1 + Owner: GDI + SubCell: 3 + Location: 9,59 + Facing: 384 + Actor6: n1 + Owner: GDI + SubCell: 3 + Location: 6,61 + Facing: 618 + Actor7: n2 + Owner: GDI + Location: 9,59 + SubCell: 1 + Facing: 523 + Actor8: tc01 + Owner: Neutral + Location: 7,56 + Actor9: tc02 + Owner: Neutral + Location: 4,63 + Actor10: tc04 + Owner: Neutral + Location: 16,69 + Actor11: tc05 + Owner: Neutral + Location: 18,59 + Actor12: t05 + Owner: Neutral + Location: 15,58 + Actor13: t02 + Owner: Neutral + Location: 20,65 + Actor14: t06 + Owner: Neutral + Location: 12,76 + Actor15: t16 + Owner: Neutral + Location: 3,76 + Actor16: t14 + Owner: Neutral + Location: 13,73 + Actor17: t11 + Owner: Neutral + Location: 5,69 + Actor18: tc03 + Owner: Neutral + Location: 7,51 + Actor19: t02 + Owner: Neutral + Location: 7,49 + Actor20: t16 + Owner: Neutral + Location: 17,50 + Actor21: t06 + Owner: Neutral + Location: 13,41 + Actor22: t01 + Owner: Neutral + Location: 10,43 + Actor23: t01 + Owner: Neutral + Location: 30,64 + Actor24: t16 + Owner: Neutral + Location: 28,67 + Actor25: t07 + Owner: Neutral + Location: 34,67 + Actor26: tc05 + Owner: Neutral + Location: 22,78 + Actor27: tc04 + Owner: Neutral + Location: 27,74 + Actor28: t16 + Owner: Neutral + Location: 26,75 + Actor29: t07 + Owner: Neutral + Location: 25,77 + Actor30: t02 + Owner: Neutral + Location: 22,76 + Actor31: t14 + Owner: Neutral + Location: 23,73 + Actor32: t06 + Owner: Neutral + Location: 27,60 + Actor33: t16 + Owner: Neutral + Location: 24,58 + Actor34: t07 + Owner: Neutral + Location: 9,52 + Actor35: windmill + Owner: Neutral + Location: 25,53 + Hacker1: hack + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 7,73 + StealthTank1: stnk.nod + Owner: Nod + Facing: 0 + Location: 8,74 + StealthTank2: stnk.nod + Owner: Nod + Facing: 0 + Location: 10,74 + Actor42: sbag + Owner: GDI + Location: 8,33 + Actor43: sbag + Owner: GDI + Location: 8,34 + Actor44: sbag + Owner: GDI + Location: 8,30 + Actor45: sbag + Owner: GDI + Location: 8,31 + Actor46: sbag + Owner: GDI + Location: 8,29 + Actor47: sbag + Owner: GDI + Location: 8,28 + Actor48: sbag + Owner: GDI + Location: 8,27 + Actor49: sbag + Owner: GDI + Location: 8,35 + Actor62: sbag + Owner: GDI + Location: 1,35 + Actor63: sbag + Owner: GDI + Location: 1,34 + Actor64: sbag + Owner: GDI + Location: 1,33 + Actor65: sbag + Owner: GDI + Location: 1,32 + Actor66: sbag + Owner: GDI + Location: 1,31 + Actor67: sbag + Owner: GDI + Location: 1,30 + Actor68: sbag + Owner: GDI + Location: 1,29 + Actor69: sbag + Owner: GDI + Location: 1,28 + Actor70: sbag + Owner: GDI + Location: 1,27 + Actor71: sbag + Owner: GDI + Location: 7,27 + Actor72: sbag + Owner: GDI + Location: 6,27 + Actor73: sbag + Owner: GDI + Location: 5,27 + Actor74: sbag + Owner: GDI + Location: 4,27 + Actor75: sbag + Owner: GDI + Location: 3,27 + Actor76: sbag + Owner: GDI + Location: 2,27 + Actor77: rep + Owner: GDI + Location: 3,31 + Actor79: sbag + Owner: GDI + Location: 1,36 + Actor81: sbag + Owner: GDI + Location: 8,36 + Actor82: sbag + Owner: GDI + Location: 1,37 + Actor83: sbag + Owner: GDI + Location: 2,37 + Actor84: sbag + Owner: GDI + Location: 3,37 + Actor85: sbag + Owner: GDI + Location: 4,37 + Actor86: sbag + Owner: GDI + Location: 5,37 + Actor87: sbag + Owner: GDI + Location: 6,37 + Actor88: sbag + Owner: GDI + Location: 7,37 + Actor89: sbag + Owner: GDI + Location: 8,37 + Actor90: gtwr + Owner: GDI + Location: 9,34 + Actor91: gtwr + Owner: GDI + Location: 9,30 + Actor92: brl3 + Owner: GDI + Location: 2,36 + Actor93: brl3 + Owner: GDI + Location: 3,35 + Actor94: barl + Owner: GDI + Location: 2,35 + Actor95: barl + Owner: GDI + Location: 2,34 + Actor185: mtnk + Owner: GDI + Location: 37,71 + Facing: 245 + Actor186: mtnk + Owner: GDI + Location: 36,73 + Facing: 253 + Actor189: n1 + Owner: GDI + SubCell: 3 + Location: 36,74 + Facing: 237 + Actor190: n1 + Owner: GDI + Location: 36,74 + SubCell: 1 + Facing: 245 + Actor191: n1 + Owner: GDI + SubCell: 3 + Location: 37,70 + Facing: 384 + Actor193: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 37,74 + Actor125: brik + Owner: GDI + Location: 47,55 + Actor126: brik + Owner: GDI + Location: 63,55 + Actor127: brik + Owner: GDI + Location: 47,56 + Actor128: brik + Owner: GDI + Location: 63,56 + Actor129: brik + Owner: GDI + Location: 47,57 + Actor130: brik + Owner: GDI + Location: 63,57 + Actor131: brik + Owner: GDI + Location: 47,58 + Actor132: brik + Owner: GDI + Location: 63,58 + Actor133: brik + Owner: GDI + Location: 47,59 + Actor134: brik + Owner: GDI + Location: 63,59 + Actor135: brik + Owner: GDI + Location: 47,60 + Actor136: brik + Owner: GDI + Location: 48,60 + Actor137: brik + Owner: GDI + Location: 62,60 + Actor138: brik + Owner: GDI + Location: 63,60 + Actor139: brik + Owner: GDI + Location: 47,61 + Actor140: brik + Owner: GDI + Location: 48,61 + Actor141: brik + Owner: GDI + Location: 62,61 + Actor142: brik + Owner: GDI + Location: 63,61 + Actor143: brik + Owner: GDI + Location: 47,65 + Actor144: brik + Owner: GDI + Location: 48,65 + Actor145: brik + Owner: GDI + Location: 62,65 + Actor146: brik + Owner: GDI + Location: 63,65 + Actor147: brik + Owner: GDI + Location: 47,66 + Actor148: brik + Owner: GDI + Location: 48,66 + Actor149: brik + Owner: GDI + Location: 62,66 + Actor150: brik + Owner: GDI + Location: 63,66 + Actor151: brik + Owner: GDI + Location: 47,67 + Actor152: brik + Owner: GDI + Location: 63,67 + Actor153: brik + Owner: GDI + Location: 47,68 + Actor154: brik + Owner: GDI + Location: 63,68 + Actor155: brik + Owner: GDI + Location: 47,69 + Actor156: brik + Owner: GDI + Location: 63,69 + Actor157: brik + Owner: GDI + Location: 47,70 + Actor158: brik + Owner: GDI + Location: 63,70 + Actor159: brik + Owner: GDI + Location: 47,71 + Actor160: brik + Owner: GDI + Location: 63,71 + Actor161: brik + Owner: GDI + Location: 47,72 + Actor162: brik + Owner: GDI + Location: 48,72 + Actor163: brik + Owner: GDI + Location: 52,72 + Actor164: brik + Owner: GDI + Location: 53,72 + Actor165: brik + Owner: GDI + Location: 57,72 + Actor166: brik + Owner: GDI + Location: 58,72 + Actor167: brik + Owner: GDI + Location: 63,72 + Actor168: brik + Owner: GDI + Location: 47,73 + Actor169: brik + Owner: GDI + Location: 48,73 + Actor170: brik + Owner: GDI + Location: 49,73 + Actor171: brik + Owner: GDI + Location: 50,73 + Actor172: brik + Owner: GDI + Location: 51,73 + Actor173: brik + Owner: GDI + Location: 52,73 + Actor174: brik + Owner: GDI + Location: 53,73 + Actor175: brik + Owner: GDI + Location: 57,73 + Actor176: brik + Owner: GDI + Location: 58,73 + Actor177: brik + Owner: GDI + Location: 59,73 + Actor178: brik + Owner: GDI + Location: 60,73 + Actor179: brik + Owner: GDI + Location: 61,73 + Actor180: brik + Owner: GDI + Location: 62,73 + Actor181: brik + Owner: GDI + Location: 63,73 + Actor182: atwr + Owner: GDI + Location: 48,67 + Actor194: atwr + Owner: GDI + Location: 48,59 + Actor195: atwr + Owner: GDI + Location: 62,67 + Actor196: atwr + Owner: GDI + Location: 62,59 + Actor197: brik + Owner: GDI + Location: 47,49 + Actor198: brik + Owner: GDI + Location: 48,49 + Actor199: brik + Owner: GDI + Location: 49,49 + Actor200: brik + Owner: GDI + Location: 50,49 + Actor201: brik + Owner: GDI + Location: 51,49 + Actor202: brik + Owner: GDI + Location: 52,49 + Actor203: brik + Owner: GDI + Location: 53,49 + Actor204: brik + Owner: GDI + Location: 54,49 + Actor205: brik + Owner: GDI + Location: 55,49 + Actor206: brik + Owner: GDI + Location: 56,49 + Actor207: brik + Owner: GDI + Location: 57,49 + Actor208: brik + Owner: GDI + Location: 58,49 + Actor209: brik + Owner: GDI + Location: 59,49 + Actor210: brik + Owner: GDI + Location: 60,49 + Actor211: brik + Owner: GDI + Location: 61,49 + Actor212: brik + Owner: GDI + Location: 62,49 + Actor213: brik + Owner: GDI + Location: 63,49 + Actor214: brik + Owner: GDI + Location: 47,50 + Actor216: brik + Owner: GDI + Location: 63,50 + Actor217: brik + Owner: GDI + Location: 47,51 + Actor218: brik + Owner: GDI + Location: 63,51 + Actor219: brik + Owner: GDI + Location: 47,52 + Actor220: brik + Owner: GDI + Location: 63,52 + Actor221: brik + Owner: GDI + Location: 47,53 + Actor222: brik + Owner: GDI + Location: 63,53 + Actor223: brik + Owner: GDI + Location: 47,54 + Actor224: brik + Owner: GDI + Location: 63,54 + Actor215: afac + Owner: GDI + Location: 60,70 + Actor225: weap.td + Owner: GDI + Location: 54,61 + Actor226: rep + Owner: GDI + Location: 54,65 + Actor228: nuk2 + Owner: GDI + Location: 48,50 + Actor229: nuk2 + Owner: GDI + Location: 51,50 + Actor230: nuk2 + Owner: GDI + Location: 61,50 + Actor231: nuk2 + Owner: GDI + Location: 58,50 + Actor232: nuk2 + Owner: GDI + Location: 61,54 + Actor233: nuk2 + Owner: GDI + Location: 48,54 + Actor234: gtek + Owner: GDI + Location: 54,50 + Actor237: proc.td + Owner: GDI + Location: 50,67 + Actor238: atwr + Owner: GDI + Location: 51,72 + Actor239: atwr + Owner: GDI + Location: 59,72 + Actor240: gtwr + Owner: GDI + Location: 53,74 + Actor241: gtwr + Owner: GDI + Location: 57,74 + Actor242: gtwr + Owner: GDI + Location: 46,65 + Actor243: gtwr + Owner: GDI + Location: 46,61 + Actor244: gtwr + Owner: GDI + Location: 64,61 + Actor245: gtwr + Owner: GDI + Location: 64,65 + Actor246: cram + Owner: GDI + Location: 48,71 + Actor247: cram + Owner: GDI + Location: 59,68 + Actor248: cram + Owner: GDI + Location: 51,56 + Actor249: cram + Owner: GDI + Location: 59,60 + Actor235: hpad.td + Owner: GDI + Location: 54,55 + Actor236: hpad.td + Owner: GDI + Location: 57,55 + Actor250: chain + Owner: GDI + Location: 54,54 + Actor251: chain + Owner: GDI + Location: 53,54 + Actor252: chain + Owner: GDI + Location: 53,55 + Actor253: chain + Owner: GDI + Location: 53,56 + Actor254: chain + Owner: GDI + Location: 53,57 + Actor255: chain + Owner: GDI + Location: 59,57 + Actor256: chain + Owner: GDI + Location: 59,56 + Actor257: chain + Owner: GDI + Location: 59,55 + Actor258: chain + Owner: GDI + Location: 59,54 + Actor259: chain + Owner: GDI + Location: 58,54 + Actor260: chain + Owner: GDI + Location: 57,54 + Actor261: chain + Owner: GDI + Location: 56,54 + Actor262: chain + Owner: GDI + Location: 55,54 + Actor263: chain + Owner: GDI + Location: 53,58 + Actor264: chain + Owner: GDI + Location: 54,58 + Actor265: chain + Owner: GDI + Location: 59,58 + Actor266: chain + Owner: GDI + Location: 58,58 + Actor267: chain + Owner: GDI + Location: 55,58 + Actor268: chain + Owner: GDI + Location: 57,58 + Actor269: htnk + Owner: GDI + Location: 46,63 + Facing: 256 + Actor272: msam + Owner: GDI + Location: 48,69 + Facing: 111 + Actor273: msam + Owner: GDI + Location: 62,69 + Facing: 919 + Actor274: msam + Owner: GDI + Location: 60,65 + Facing: 761 + Actor275: msam + Owner: GDI + Location: 50,65 + Facing: 253 + Actor277: vulc + Owner: GDI + Facing: 384 + Location: 52,62 + Actor278: htnk + Owner: GDI + Location: 64,63 + Facing: 768 + Actor279: mtnk + Owner: GDI + Location: 45,67 + Facing: 118 + Actor280: mtnk + Owner: GDI + Location: 65,67 + Facing: 919 + Actor281: n1 + Owner: GDI + Location: 52,60 + SubCell: 3 + Facing: 697 + Actor282: n1 + Owner: GDI + Facing: 384 + SubCell: 1 + Location: 51,60 + Actor283: n1 + Owner: GDI + Location: 51,60 + SubCell: 2 + Facing: 816 + Actor284: n1 + Owner: GDI + SubCell: 3 + Location: 51,61 + Facing: 507 + Actor285: n1 + Owner: GDI + SubCell: 3 + Location: 59,61 + Facing: 467 + Actor286: n1 + Owner: GDI + SubCell: 3 + Location: 60,60 + Facing: 689 + Actor287: n1 + Owner: GDI + SubCell: 3 + Location: 65,65 + Facing: 721 + Actor288: n1 + Owner: GDI + Location: 64,66 + SubCell: 3 + Facing: 602 + Actor289: n1 + Owner: GDI + SubCell: 3 + Location: 60,66 + Facing: 674 + Actor290: n1 + Owner: GDI + Location: 59,65 + SubCell: 3 + Facing: 880 + Actor291: n1 + Owner: GDI + SubCell: 3 + Location: 51,65 + Facing: 103 + Actor292: n1 + Owner: GDI + SubCell: 3 + Location: 57,64 + Facing: 737 + Actor293: n1 + Owner: GDI + SubCell: 3 + Location: 54,69 + Facing: 586 + Actor294: n1 + Owner: GDI + Location: 54,69 + SubCell: 1 + Facing: 531 + Actor295: n1 + Owner: GDI + SubCell: 3 + Location: 53,68 + Facing: 626 + Actor296: n1 + Owner: GDI + SubCell: 3 + Location: 53,71 + Facing: 674 + Actor297: n1 + Owner: GDI + SubCell: 3 + Location: 49,65 + Facing: 384 + Actor298: n1 + Owner: GDI + SubCell: 3 + Location: 48,64 + Facing: 214 + Actor299: n1 + Owner: GDI + Location: 46,60 + SubCell: 3 + Facing: 174 + Actor300: n1 + Owner: GDI + Location: 46,60 + SubCell: 1 + Facing: 150 + Actor301: n1 + Owner: GDI + SubCell: 3 + Location: 45,61 + Facing: 111 + Actor302: n1 + Owner: GDI + SubCell: 3 + Location: 46,68 + Facing: 384 + Actor303: n1 + Owner: GDI + SubCell: 3 + Location: 46,67 + Facing: 150 + Actor304: n1 + Owner: GDI + Location: 46,67 + SubCell: 1 + Facing: 214 + Actor305: n1 + Owner: GDI + SubCell: 3 + Location: 65,68 + Facing: 753 + Actor306: n1 + Owner: GDI + SubCell: 3 + Location: 58,59 + Facing: 586 + Actor307: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 54,59 + Actor308: n1 + Owner: GDI + Location: 58,68 + SubCell: 3 + Facing: 594 + Actor309: n1 + Owner: GDI + SubCell: 3 + Location: 58,71 + Facing: 452 + Actor310: n1 + Owner: GDI + Facing: 384 + Location: 58,71 + SubCell: 1 + Actor311: n2 + Owner: GDI + Facing: 384 + Location: 51,61 + SubCell: 1 + Actor312: n2 + Owner: GDI + Location: 52,61 + SubCell: 3 + Facing: 658 + Actor313: n2 + Owner: GDI + Facing: 384 + Location: 49,60 + SubCell: 3 + Actor314: n2 + Owner: GDI + Facing: 384 + Location: 51,60 + SubCell: 3 + Actor315: n2 + Owner: GDI + Location: 65,65 + SubCell: 1 + Facing: 618 + Actor316: n2 + Owner: GDI + SubCell: 3 + Location: 46,59 + Facing: 253 + Actor317: n2 + Owner: GDI + SubCell: 3 + Location: 45,65 + Facing: 301 + Actor318: n2 + Owner: GDI + SubCell: 3 + Location: 54,70 + Facing: 523 + Actor319: n2 + Owner: GDI + Facing: 384 + Location: 58,68 + SubCell: 1 + Actor321: chain + Owner: GDI + Location: 28,42 + Actor322: chain + Owner: GDI + Location: 28,43 + Actor323: chain + Owner: GDI + Location: 28,44 + Actor324: chain + Owner: GDI + Location: 28,45 + Actor325: chain + Owner: GDI + Location: 28,46 + Actor326: chain + Owner: GDI + Location: 29,42 + Actor327: chain + Owner: GDI + Location: 30,42 + Actor335: chain + Owner: GDI + Location: 28,47 + Actor336: chain + Owner: GDI + Location: 29,47 + Actor328: chain + Owner: GDI + Location: 31,42 + Actor329: chain + Owner: GDI + Location: 32,42 + Actor330: chain + Owner: GDI + Location: 33,42 + Actor331: chain + Owner: GDI + Location: 33,43 + Hospital: hosp + Owner: GDI + Location: 30,44 + Actor332: chain + Owner: GDI + Location: 33,44 + Actor333: chain + Owner: GDI + Location: 33,45 + Actor334: chain + Owner: GDI + Location: 33,46 + Actor338: chain + Owner: GDI + Location: 32,47 + Actor337: chain + Owner: GDI + Location: 33,47 + Actor339: split2 + Owner: Neutral + Location: 57,78 + Actor340: split2 + Owner: Neutral + Location: 65,77 + Actor341: split2 + Owner: Neutral + Location: 69,73 + Actor342: brik + Owner: GDI + Location: 51,19 + Actor344: brik + Owner: GDI + Location: 50,19 + Actor345: brik + Owner: GDI + Location: 50,18 + Actor346: brik + Owner: GDI + Location: 49,18 + Actor347: brik + Owner: GDI + Location: 48,18 + Actor348: brik + Owner: GDI + Location: 48,17 + Actor349: brik + Owner: GDI + Location: 48,16 + Actor350: brik + Owner: GDI + Location: 48,15 + Actor351: brik + Owner: GDI + Location: 48,14 + Actor352: brik + Owner: GDI + Location: 47,14 + Actor353: brik + Owner: GDI + Location: 46,14 + Actor354: brik + Owner: GDI + Location: 45,14 + Actor355: brik + Owner: GDI + Location: 44,14 + Actor357: brik + Owner: GDI + Location: 43,13 + Actor358: brik + Owner: GDI + Location: 42,13 + Actor359: brik + Owner: GDI + Location: 41,13 + Actor360: brik + Owner: GDI + Location: 40,13 + Actor361: brik + Owner: GDI + Location: 40,12 + Actor362: brik + Owner: GDI + Location: 40,11 + Actor363: brik + Owner: GDI + Location: 40,10 + Actor364: brik + Owner: GDI + Location: 40,9 + Actor367: brik + Owner: GDI + Location: 40,8 + Actor368: brik + Owner: GDI + Location: 40,7 + Actor370: brik + Owner: GDI + Location: 40,6 + Actor371: brik + Owner: GDI + Location: 40,5 + Actor372: brik + Owner: GDI + Location: 40,4 + Actor373: brik + Owner: GDI + Location: 41,4 + Actor374: brik + Owner: GDI + Location: 42,4 + Actor377: brik + Owner: GDI + Location: 44,3 + Actor378: brik + Owner: GDI + Location: 45,3 + Actor379: brik + Owner: GDI + Location: 46,3 + Actor380: brik + Owner: GDI + Location: 47,3 + Actor381: brik + Owner: GDI + Location: 48,3 + Actor382: brik + Owner: GDI + Location: 49,3 + Actor385: brik + Owner: GDI + Location: 50,3 + Actor392: brik + Owner: GDI + Location: 57,22 + Actor393: brik + Owner: GDI + Location: 58,22 + Actor394: brik + Owner: GDI + Location: 59,22 + Actor395: brik + Owner: GDI + Location: 60,22 + Actor396: brik + Owner: GDI + Location: 61,22 + Actor397: brik + Owner: GDI + Location: 63,22 + Actor398: brik + Owner: GDI + Location: 62,22 + Actor400: brik + Owner: GDI + Location: 26,32 + Actor401: brik + Owner: GDI + Location: 27,32 + Actor402: brik + Owner: GDI + Location: 26,33 + Actor403: brik + Owner: GDI + Location: 27,33 + Actor404: brik + Owner: GDI + Location: 26,34 + Actor405: brik + Owner: GDI + Location: 26,35 + Actor406: brik + Owner: GDI + Location: 26,36 + Actor407: brik + Owner: GDI + Location: 26,37 + Actor408: brik + Owner: GDI + Location: 26,38 + Actor409: brik + Owner: GDI + Location: 26,39 + Actor411: brik + Owner: GDI + Location: 27,39 + Actor410: brik + Owner: GDI + Location: 27,38 + Actor412: brik + Owner: GDI + Location: 31,39 + Actor413: brik + Owner: GDI + Location: 30,39 + Actor414: brik + Owner: GDI + Location: 29,39 + Actor415: brik + Owner: GDI + Location: 28,39 + Actor416: brik + Owner: GDI + Location: 32,39 + Actor417: brik + Owner: GDI + Location: 32,38 + Actor419: brik + Owner: GDI + Location: 26,28 + Actor420: brik + Owner: GDI + Location: 27,28 + Actor421: brik + Owner: GDI + Location: 27,27 + Actor422: brik + Owner: GDI + Location: 26,27 + Actor423: brik + Owner: GDI + Location: 26,26 + Actor424: brik + Owner: GDI + Location: 26,25 + Actor425: brik + Owner: GDI + Location: 26,24 + Actor426: brik + Owner: GDI + Location: 26,23 + Actor427: brik + Owner: GDI + Location: 26,21 + Actor428: brik + Owner: GDI + Location: 26,22 + Actor429: brik + Owner: GDI + Location: 26,20 + Actor430: brik + Owner: GDI + Location: 27,20 + Actor431: brik + Owner: GDI + Location: 27,21 + Actor432: brik + Owner: GDI + Location: 28,20 + Actor433: brik + Owner: GDI + Location: 29,20 + Actor434: brik + Owner: GDI + Location: 30,20 + Actor435: brik + Owner: GDI + Location: 31,20 + Actor436: brik + Owner: GDI + Location: 32,20 + Actor437: brik + Owner: GDI + Location: 33,20 + Actor438: brik + Owner: GDI + Location: 34,20 + Actor439: brik + Owner: GDI + Location: 35,20 + Actor440: brik + Owner: GDI + Location: 36,20 + Actor441: brik + Owner: GDI + Location: 37,20 + Actor442: brik + Owner: GDI + Location: 38,20 + Actor443: brik + Owner: GDI + Location: 38,21 + Actor444: brik + Owner: GDI + Location: 37,21 + Actor445: memp + Owner: GDI + Location: 37,37 + Facing: 111 + Actor446: chain + Owner: GDI + Location: 39,34 + Actor447: chain + Owner: GDI + Location: 38,34 + Actor448: chain + Owner: GDI + Location: 34,34 + Actor454: chain + Owner: GDI + Location: 35,34 + Actor456: chain + Owner: GDI + Location: 34,39 + Actor457: chain + Owner: GDI + Location: 35,39 + Actor458: chain + Owner: GDI + Location: 36,39 + Actor459: chain + Owner: GDI + Location: 37,39 + Actor460: chain + Owner: GDI + Location: 38,39 + Actor461: chain + Owner: GDI + Location: 39,39 + Actor462: chain + Owner: GDI + Location: 39,35 + Actor463: chain + Owner: GDI + Location: 39,36 + Actor464: chain + Owner: GDI + Location: 39,37 + Actor465: chain + Owner: GDI + Location: 39,38 + Actor466: chain + Owner: GDI + Location: 34,35 + Actor467: chain + Owner: GDI + Location: 34,36 + Actor468: chain + Owner: GDI + Location: 34,37 + Actor469: chain + Owner: GDI + Location: 34,38 + Actor449: brik + Owner: GDI + Location: 33,38 + Actor450: brik + Owner: GDI + Location: 33,39 + Actor451: hq + Owner: GDI + Location: 29,35 + Actor452: atwr + Owner: GDI + Location: 27,26 + Actor453: atwr + Owner: GDI + Location: 27,34 + Actor455: gtwr + Owner: GDI + Location: 25,32 + Actor470: gtwr + Owner: GDI + Location: 25,28 + Actor471: weap.td + Owner: GDI + Location: 29,26 + Actor477: afld.gdi + Owner: GDI + Location: 34,27 + Actor478: afld.gdi + Owner: GDI + Location: 34,30 + Actor480: msam + Owner: GDI + Facing: 634 + Location: 58,62 + Actor481: n1 + Owner: GDI + SubCell: 3 + Location: 60,53 + Facing: 634 + Actor482: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 57,52 + Actor483: n1 + Owner: GDI + SubCell: 3 + Location: 60,51 + Facing: 269 + Actor485: brik + Owner: GDI + Location: 64,22 + Actor486: brik + Owner: GDI + Location: 65,22 + Actor487: brik + Owner: GDI + Location: 66,22 + Actor488: brik + Owner: GDI + Location: 67,22 + Actor489: brik + Owner: GDI + Location: 67,21 + Actor490: brik + Owner: GDI + Location: 66,21 + Actor491: brik + Owner: GDI + Location: 71,21 + Actor492: brik + Owner: GDI + Location: 71,22 + Actor493: brik + Owner: GDI + Location: 72,22 + Actor494: brik + Owner: GDI + Location: 72,21 + Actor495: brik + Owner: GDI + Location: 73,22 + Actor496: brik + Owner: GDI + Location: 74,22 + Actor497: brik + Owner: GDI + Location: 74,21 + Actor498: brik + Owner: GDI + Location: 74,20 + Actor499: brik + Owner: GDI + Location: 74,19 + Actor500: brik + Owner: GDI + Location: 74,18 + Actor501: brik + Owner: GDI + Location: 74,16 + Actor502: brik + Owner: GDI + Location: 74,17 + Actor503: brik + Owner: GDI + Location: 74,15 + Actor515: brik + Owner: GDI + Location: 66,12 + Actor516: brik + Owner: GDI + Location: 66,11 + Actor517: brik + Owner: GDI + Location: 66,10 + Actor505: brik + Owner: GDI + Location: 66,13 + Actor506: brik + Owner: GDI + Location: 67,13 + Actor507: brik + Owner: GDI + Location: 68,13 + Actor508: brik + Owner: GDI + Location: 69,13 + Actor509: brik + Owner: GDI + Location: 70,13 + Actor510: brik + Owner: GDI + Location: 71,13 + Actor511: brik + Owner: GDI + Location: 72,13 + Actor512: brik + Owner: GDI + Location: 73,13 + Actor513: brik + Owner: GDI + Location: 74,13 + Actor519: brik + Owner: GDI + Location: 74,14 + Actor521: brik + Owner: GDI + Location: 55,10 + Actor522: brik + Owner: GDI + Location: 57,10 + Actor523: brik + Owner: GDI + Location: 56,10 + Actor524: brik + Owner: GDI + Location: 59,10 + Actor525: brik + Owner: GDI + Location: 58,10 + Actor526: brik + Owner: GDI + Location: 60,10 + Actor527: brik + Owner: GDI + Location: 61,10 + Actor528: brik + Owner: GDI + Location: 62,10 + Actor529: brik + Owner: GDI + Location: 63,10 + Actor530: brik + Owner: GDI + Location: 54,10 + Actor531: brik + Owner: GDI + Location: 54,9 + Actor532: brik + Owner: GDI + Location: 54,8 + Actor534: brik + Owner: GDI + Location: 53,7 + Actor535: brik + Owner: GDI + Location: 53,6 + Actor536: brik + Owner: GDI + Location: 53,5 + Actor537: brik + Owner: GDI + Location: 53,4 + Actor538: brik + Owner: GDI + Location: 52,4 + Actor539: brik + Owner: GDI + Location: 52,3 + Actor540: brik + Owner: GDI + Location: 51,3 + Actor533: brik + Owner: GDI + Location: 53,8 + Actor541: brik + Owner: GDI + Location: 44,13 + Actor542: atwr + Owner: GDI + Location: 65,21 + Actor543: atwr + Owner: GDI + Location: 73,21 + Actor544: gtwr + Owner: GDI + Location: 67,23 + Actor545: gtwr + Owner: GDI + Location: 71,23 + Actor547: chain + Owner: GDI + Location: 41,12 + Actor548: chain + Owner: GDI + Location: 41,11 + Actor549: chain + Owner: GDI + Location: 41,10 + Actor550: chain + Owner: GDI + Location: 41,9 + Actor551: chain + Owner: GDI + Location: 41,8 + Actor552: chain + Owner: GDI + Location: 41,7 + Actor553: chain + Owner: GDI + Location: 41,6 + Actor554: chain + Owner: GDI + Location: 41,5 + Actor555: chain + Owner: GDI + Location: 43,5 + Actor556: chain + Owner: GDI + Location: 42,5 + Actor559: chain + Owner: GDI + Location: 45,4 + Actor560: chain + Owner: GDI + Location: 46,4 + Actor561: chain + Owner: GDI + Location: 47,4 + Actor562: chain + Owner: GDI + Location: 48,4 + Actor566: chain + Owner: GDI + Location: 42,12 + Actor567: chain + Owner: GDI + Location: 43,12 + Actor568: chain + Owner: GDI + Location: 44,12 + Actor569: chain + Owner: GDI + Location: 45,12 + Actor570: chain + Owner: GDI + Location: 45,13 + Actor571: chain + Owner: GDI + Location: 46,13 + Actor572: chain + Owner: GDI + Location: 48,5 + Actor573: chain + Owner: GDI + Location: 48,6 + Actor574: chain + Owner: GDI + Location: 48,7 + Actor575: chain + Owner: GDI + Location: 47,13 + Actor576: chain + Owner: GDI + Location: 48,13 + Actor577: chain + Owner: GDI + Location: 48,12 + Actor578: chain + Owner: GDI + Location: 48,11 + Actor579: chain + Owner: GDI + Location: 48,10 + Actor563: cram + Owner: GDI + Location: 42,11 + Actor564: cram + Owner: GDI + Location: 47,5 + Actor565: cram + Owner: GDI + Location: 42,6 + Actor580: cram + Owner: GDI + Location: 47,12 + TurretFacing: 832 + Actor581: brik + Owner: GDI + Location: 44,4 + Actor582: brik + Owner: GDI + Location: 43,4 + Actor557: chain + Owner: GDI + Location: 45,5 + Actor558: chain + Owner: GDI + Location: 44,5 + IonControl: eye + Owner: GDI + Location: 44,7 + Actor583: brik + Owner: Greece + Location: 96,40 + Actor584: brik + Owner: Greece + Location: 97,40 + Actor585: brik + Owner: Greece + Location: 96,39 + Actor586: brik + Owner: Greece + Location: 97,39 + Actor587: brik + Owner: Greece + Location: 96,38 + Actor588: brik + Owner: Greece + Location: 96,37 + Actor589: brik + Owner: Greece + Location: 97,37 + Actor590: brik + Owner: Greece + Location: 97,36 + Actor591: brik + Owner: Greece + Location: 97,35 + Actor592: brik + Owner: Greece + Location: 96,36 + Actor593: brik + Owner: Greece + Location: 97,34 + Actor594: brik + Owner: Greece + Location: 97,33 + Actor595: brik + Owner: Greece + Location: 97,31 + Actor596: brik + Owner: Greece + Location: 97,32 + Actor597: brik + Owner: Greece + Location: 98,31 + Actor598: brik + Owner: Greece + Location: 99,31 + Actor599: brik + Owner: Greece + Location: 100,31 + Actor600: brik + Owner: Greece + Location: 101,31 + Actor601: brik + Owner: Greece + Location: 101,30 + Actor602: brik + Owner: Greece + Location: 102,30 + Actor603: brik + Owner: Greece + Location: 102,30 + Actor604: brik + Owner: Greece + Location: 103,30 + Actor605: brik + Owner: Greece + Location: 104,30 + Actor606: brik + Owner: Greece + Location: 105,30 + Actor607: brik + Owner: Greece + Location: 105,29 + Actor608: brik + Owner: Greece + Location: 105,28 + Actor609: brik + Owner: Greece + Location: 106,28 + Actor610: brik + Owner: Greece + Location: 107,28 + Actor611: brik + Owner: Greece + Location: 108,28 + Actor612: brik + Owner: Greece + Location: 109,28 + Actor613: brik + Owner: Greece + Location: 109,29 + Actor614: brik + Owner: Greece + Location: 110,29 + Actor615: brik + Owner: Greece + Location: 111,29 + Actor616: brik + Owner: Greece + Location: 112,29 + Actor617: brik + Owner: Greece + Location: 112,30 + Actor618: brik + Owner: Greece + Location: 96,44 + Actor619: brik + Owner: Greece + Location: 97,44 + Actor620: brik + Owner: Greece + Location: 96,45 + Actor621: brik + Owner: Greece + Location: 97,45 + Actor622: brik + Owner: Greece + Location: 95,45 + Actor623: brik + Owner: Greece + Location: 94,45 + Actor624: brik + Owner: Greece + Location: 94,46 + Actor625: brik + Owner: Greece + Location: 94,47 + Actor626: brik + Owner: Greece + Location: 94,48 + Actor627: brik + Owner: Greece + Location: 94,49 + Actor628: brik + Owner: Greece + Location: 94,50 + Actor629: brik + Owner: Greece + Location: 94,51 + Actor630: brik + Owner: Greece + Location: 94,52 + Actor631: brik + Owner: Greece + Location: 94,54 + Actor632: brik + Owner: Greece + Location: 94,53 + Actor633: brik + Owner: Greece + Location: 94,55 + Actor634: brik + Owner: Greece + Location: 94,57 + Actor635: brik + Owner: Greece + Location: 94,56 + Actor636: brik + Owner: Greece + Location: 94,58 + Actor637: brik + Owner: Greece + Location: 94,59 + Actor638: brik + Owner: Greece + Location: 94,60 + Actor639: brik + Owner: Greece + Location: 95,60 + Actor640: brik + Owner: Greece + Location: 96,60 + Actor641: brik + Owner: Greece + Location: 98,60 + Actor642: brik + Owner: Greece + Location: 97,60 + Actor643: brik + Owner: Greece + Location: 99,60 + Actor644: brik + Owner: Greece + Location: 99,59 + Actor645: brik + Owner: Greece + Location: 98,59 + Actor646: brik + Owner: Greece + Location: 103,59 + Actor647: brik + Owner: Greece + Location: 103,60 + Actor648: brik + Owner: Greece + Location: 104,59 + Actor649: brik + Owner: Greece + Location: 104,60 + Actor650: brik + Owner: Greece + Location: 105,60 + Actor651: brik + Owner: Greece + Location: 106,60 + Actor652: brik + Owner: Greece + Location: 107,60 + Actor653: brik + Owner: Greece + Location: 108,60 + Actor654: brik + Owner: Greece + Location: 109,60 + Actor655: brik + Owner: Greece + Location: 111,60 + Actor656: brik + Owner: Greece + Location: 112,60 + Actor657: brik + Owner: Greece + Location: 110,60 + Actor658: brik + Owner: Greece + Location: 112,31 + Actor659: brik + Owner: Greece + Location: 112,32 + Actor660: brik + Owner: Greece + Location: 112,34 + Actor661: brik + Owner: Greece + Location: 112,59 + Actor662: brik + Owner: Greece + Location: 112,57 + Actor663: brik + Owner: Greece + Location: 112,58 + Actor664: brik + Owner: Greece + Location: 112,56 + Actor665: brik + Owner: Greece + Location: 112,55 + Actor666: brik + Owner: Greece + Location: 112,54 + Actor667: brik + Owner: Greece + Location: 112,53 + Actor668: brik + Owner: Greece + Location: 112,52 + Actor669: brik + Owner: Greece + Location: 112,51 + Actor670: brik + Owner: Greece + Location: 112,50 + Actor671: brik + Owner: Greece + Location: 112,49 + Actor672: brik + Owner: Greece + Location: 112,48 + Actor673: brik + Owner: Greece + Location: 112,47 + Actor674: brik + Owner: Greece + Location: 112,46 + Actor675: brik + Owner: Greece + Location: 112,45 + Actor676: brik + Owner: Greece + Location: 112,44 + Actor677: brik + Owner: Greece + Location: 112,42 + Actor678: brik + Owner: Greece + Location: 112,43 + Actor679: brik + Owner: Greece + Location: 112,40 + Actor680: brik + Owner: Greece + Location: 112,41 + Actor681: brik + Owner: Greece + Location: 112,39 + Actor682: brik + Owner: Greece + Location: 112,38 + Actor683: brik + Owner: Greece + Location: 112,36 + Actor684: brik + Owner: Greece + Location: 112,35 + Actor685: brik + Owner: Greece + Location: 112,37 + Actor686: brik + Owner: Greece + Location: 112,33 + AlliedConyard: fact + Owner: Greece + Location: 106,29 + Actor703: hpad + Owner: Greece + Location: 105,42 + Actor704: hpad + Owner: Greece + Location: 102,42 + Actor705: tent + Owner: Greece + Location: 100,53 + Actor706: tent + Owner: Greece + Location: 103,53 + AlliedRefinery: proc + Owner: Greece + Location: 107,54 + Actor709: silo + Owner: Greece + Location: 107,54 + Actor710: silo + Owner: Greece + Location: 109,54 + Actor711: pbox + Owner: Greece + Location: 95,44 + Actor713: pbox + Owner: Greece + Location: 99,61 + Actor714: pbox + Owner: Greece + Location: 103,61 + Actor715: pris + Owner: Greece + Location: 97,59 + Actor716: pris + Owner: Greece + Location: 105,59 + Actor717: pris + Owner: Greece + Location: 95,46 + Actor718: pris + Owner: Greece + Location: 97,38 + Actor720: agun + Owner: Greece + Location: 98,32 + Actor721: agun + Owner: Greece + Location: 95,59 + Actor722: agun + Owner: Greece + Location: 111,59 + Actor723: agun + Owner: Greece + Location: 111,30 + Actor724: agun + Owner: Greece + Location: 104,33 + Actor719: agun + Owner: Greece + Location: 95,52 + Actor695: apwr + Owner: Greece + Location: 109,34 + Actor696: apwr + Owner: Greece + Location: 109,37 + Actor697: apwr + Owner: Greece + Location: 109,40 + Actor698: apwr + Owner: Greece + Location: 109,43 + Actor699: apwr + Owner: Greece + Location: 109,46 + Actor725: apwr + Owner: Greece + Location: 109,49 + Actor726: apwr + Owner: Greece + Location: 105,47 + Actor727: apwr + Owner: Greece + Location: 95,48 + Actor728: apwr + Owner: Greece + Location: 100,38 + AlliedRadar: dome + Owner: Greece + Location: 100,33 + AlliedTechCenter: atek + Owner: Greece + Location: 105,36 + AlliedWarFactory: weap + Owner: Greece + Location: 101,49 + Actor707: fix + Owner: Greece + Location: 99,45 + Actor729: powr + Owner: Greece + Location: 97,52 + Actor731: syrd + Owner: Greece + Location: 97,26 + Actor732: syrd + Owner: Greece + Location: 105,23 + Actor733: brik + Owner: GDI + Location: 65,10 + Actor734: brik + Owner: GDI + Location: 64,10 + Actor735: lhus + Owner: Neutral + Location: 83,6 + Actor736: weap.td + Owner: GDI + Location: 71,14 + Actor737: nuk2 + Owner: GDI + Location: 64,11 + Actor738: nuk2 + Owner: GDI + Location: 62,11 + Actor739: nuk2 + Owner: GDI + Location: 60,11 + Actor740: nuk2 + Owner: GDI + Location: 49,15 + Actor741: nuk2 + Owner: GDI + Location: 49,12 + Actor742: nuk2 + Owner: GDI + Location: 57,19 + Actor743: nuk2 + Owner: GDI + Location: 59,19 + Actor744: nuk2 + Owner: GDI + Location: 61,19 + Actor746: afac + Owner: GDI + Location: 59,15 + Actor747: silo.td + Owner: GDI + Location: 63,17 + Actor748: silo.td + Owner: GDI + Location: 63,16 + Actor749: silo.td + Owner: GDI + Location: 63,15 + Actor751: rep + Owner: GDI + Location: 52,13 + Actor752: n1 + Owner: GDI + SubCell: 3 + Location: 26,29 + Facing: 301 + Actor753: n1 + Owner: GDI + Location: 26,29 + SubCell: 1 + Facing: 309 + Actor754: n1 + Owner: GDI + SubCell: 3 + Location: 27,31 + Facing: 384 + Actor755: n1 + Owner: GDI + Location: 28,33 + SubCell: 3 + Facing: 0 + Actor756: n1 + Owner: GDI + Location: 30,34 + SubCell: 3 + Facing: 384 + Actor757: n1 + Owner: GDI + SubCell: 3 + Location: 31,33 + Facing: 705 + Actor758: n1 + Owner: GDI + SubCell: 3 + Location: 28,27 + Facing: 507 + Actor759: n3 + Owner: GDI + Facing: 384 + Location: 53,68 + SubCell: 1 + Actor760: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 59,69 + Actor761: n3 + Owner: GDI + SubCell: 3 + Location: 64,68 + Facing: 0 + Actor762: n3 + Owner: GDI + SubCell: 3 + Location: 28,32 + Facing: 729 + Actor763: n3 + Owner: GDI + SubCell: 3 + Location: 27,37 + Facing: 317 + Actor764: n3 + Owner: GDI + Facing: 384 + Location: 27,24 + SubCell: 3 + Actor766: medi + Owner: GDI + SubCell: 3 + Location: 69,19 + Facing: 483 + Actor767: medi + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 53,28 + Actor768: medi + Owner: GDI + SubCell: 3 + Location: 32,35 + Facing: 166 + Actor769: medi + Owner: GDI + Facing: 384 + Location: 28,32 + SubCell: 1 + Actor770: n1 + Owner: GDI + Facing: 384 + Location: 53,28 + SubCell: 1 + Actor771: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 50,28 + Actor772: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 53,30 + Actor774: n1 + Owner: GDI + SubCell: 3 + Location: 46,31 + Facing: 602 + Actor775: n1 + Owner: GDI + SubCell: 3 + Location: 49,33 + Facing: 539 + Actor776: n1 + Owner: GDI + SubCell: 3 + Location: 47,35 + Facing: 610 + Actor778: n2 + Owner: GDI + SubCell: 3 + Location: 47,33 + Facing: 674 + Actor779: n2 + Owner: GDI + Location: 47,33 + SubCell: 1 + Facing: 642 + Actor782: n2 + Owner: GDI + SubCell: 3 + Location: 58,40 + Facing: 0 + MammothDrone: htnk.drone + Owner: GDI + Location: 48,34 + Facing: 618 + GuardianPatroller1: gdrn + Owner: GDI + Location: 27,72 + Facing: 256 + Actor786: split2 + Owner: Neutral + Location: 106,66 + Actor787: split2 + Owner: Neutral + Location: 109,68 + Actor789: split2 + Owner: Neutral + Location: 96,65 + Actor790: split2 + Owner: Neutral + Location: 100,76 + Actor791: split2 + Owner: Neutral + Location: 107,78 + Actor788: htnk + Owner: GDI + Location: 25,30 + Facing: 256 + Actor792: mtnk + Owner: GDI + Facing: 384 + Location: 24,26 + Actor793: htnk + Owner: GDI + Location: 69,23 + Facing: 491 + Actor796: msam + Owner: GDI + Facing: 610 + Location: 67,19 + Actor797: tc05 + Owner: Neutral + Location: 62,43 + Actor800: tc02 + Owner: Neutral + Location: 74,40 + Actor802: t01 + Owner: Neutral + Location: 79,39 + Actor804: t01 + Owner: Neutral + Location: 79,19 + Actor808: tc03 + Owner: Neutral + Location: 63,46 + Actor809: t16 + Owner: Neutral + Location: 64,51 + Actor810: t17 + Owner: Neutral + Location: 75,52 + Actor811: t16 + Owner: Neutral + Location: 76,46 + Actor812: t14 + Owner: Neutral + Location: 76,56 + Actor813: tc04 + Owner: Neutral + Location: 77,65 + Actor814: tc02 + Owner: Neutral + Location: 76,74 + Actor815: t16 + Owner: Neutral + Location: 72,65 + Actor816: t02 + Owner: Neutral + Location: 70,53 + Actor817: t05 + Owner: Neutral + Location: 76,11 + Actor819: tc04 + Owner: Neutral + Location: 42,26 + Actor820: t16 + Owner: Neutral + Location: 43,25 + Actor821: t13 + Owner: Neutral + Location: 42,24 + Actor822: t16 + Owner: Neutral + Location: 42,35 + Actor823: t17 + Owner: Neutral + Location: 42,32 + Actor824: t16 + Owner: Neutral + Location: 41,30 + Actor825: t02 + Owner: Neutral + Location: 42,17 + Actor826: t01 + Owner: Neutral + Location: 41,22 + Actor827: t01 + Owner: Neutral + Location: 47,20 + Actor828: t12 + Owner: Neutral + Location: 44,21 + Actor829: t16 + Owner: Neutral + Location: 37,12 + Actor830: t17 + Owner: Neutral + Location: 36,11 + Actor831: tc04 + Owner: Neutral + Location: 34,1 + Actor832: tc02 + Owner: Neutral + Location: 36,4 + Actor833: tc01 + Owner: Neutral + Location: 32,1 + Actor834: t16 + Owner: Neutral + Location: 36,3 + Actor835: t12 + Owner: Neutral + Location: 37,2 + Actor836: t10 + Owner: Neutral + Location: 33,0 + Actor837: t14 + Owner: Neutral + Location: 36,0 + Actor838: t16 + Owner: Neutral + Location: 56,3 + Actor839: t03 + Owner: Neutral + Location: 59,5 + Actor840: t12 + Owner: Neutral + Location: 83,16 + Actor841: t07 + Owner: Neutral + Location: 84,27 + Actor842: t02 + Owner: Neutral + Location: 93,52 + Actor843: t16 + Owner: Neutral + Location: 78,50 + Actor844: t11 + Owner: Neutral + Location: 30,50 + Actor845: t12 + Owner: Neutral + Location: 34,44 + Actor846: t07 + Owner: Neutral + Location: 43,45 + Actor847: t06 + Owner: Neutral + Location: 45,49 + Actor848: tc01 + Owner: Neutral + Location: 38,52 + Actor849: tc04 + Owner: Neutral + Location: 32,59 + Actor850: t07 + Owner: Neutral + Location: 33,58 + Actor851: t16 + Owner: Neutral + Location: 32,58 + Actor852: t10 + Owner: Neutral + Location: 32,57 + Actor853: t06 + Owner: Neutral + Location: 32,56 + Actor854: t07 + Owner: Neutral + Location: 27,53 + Actor855: t02 + Owner: Neutral + Location: 21,51 + Actor856: t03 + Owner: Neutral + Location: 22,48 + Actor857: tc05 + Owner: Neutral + Location: 40,45 + Actor858: t05 + Owner: Neutral + Location: 38,46 + Actor859: t06 + Owner: Neutral + Location: 47,76 + Actor860: tc01 + Owner: Neutral + Location: 44,75 + Actor861: tc03 + Owner: Neutral + Location: 36,77 + Actor862: tc04 + Owner: Neutral + Location: 38,78 + Actor863: tc05 + Owner: Neutral + Location: 44,77 + Actor864: t16 + Owner: Neutral + Location: 43,77 + Actor865: t06 + Owner: Neutral + Location: 41,77 + Actor866: t02 + Owner: Neutral + Location: 36,79 + Actor867: t15 + Owner: Neutral + Location: 41,78 + Actor868: t16 + Owner: Neutral + Location: 43,79 + Actor869: t15 + Owner: Neutral + Location: 47,78 + Actor871: t16 + Owner: Neutral + Location: 43,71 + Actor872: t07 + Owner: Neutral + Location: 41,68 + Actor873: t02 + Owner: Neutral + Location: 40,74 + Actor870: t17 + Owner: Neutral + Location: 32,76 + Actor874: t12 + Owner: Neutral + Location: 33,78 + Actor875: t08 + Owner: Neutral + Location: 32,78 + Actor876: t12 + Owner: Neutral + Location: 15,79 + Actor877: t12 + Owner: Neutral + Location: 17,31 + Actor878: t06 + Owner: Neutral + Location: 18,23 + Actor879: tc04 + Owner: Neutral + Location: 4,4 + Actor880: tc01 + Owner: Neutral + Location: 3,9 + Actor881: tc02 + Owner: Neutral + Location: 3,7 + Actor882: t16 + Owner: Neutral + Location: 3,6 + Actor883: t15 + Owner: Neutral + Location: 2,8 + Actor884: t13 + Owner: Neutral + Location: 1,9 + Actor885: tc05 + Owner: Neutral + Location: 0,5 + Actor886: t16 + Owner: Neutral + Location: 3,4 + Actor887: t17 + Owner: Neutral + Location: 2,1 + Actor888: tc04 + Owner: Neutral + Location: 14,2 + Actor889: t17 + Owner: Neutral + Location: 13,3 + Actor890: t16 + Owner: Neutral + Location: 17,3 + Actor891: t07 + Owner: Neutral + Location: 10,3 + Actor892: t02 + Owner: Neutral + Location: 29,2 + Actor893: t06 + Owner: Neutral + Location: 25,10 + Actor894: t16 + Owner: Neutral + Location: 27,16 + Actor895: t07 + Owner: Neutral + Location: 34,10 + Actor896: t02 + Owner: Neutral + Location: 35,15 + Actor897: t10 + Owner: Neutral + Location: 30,5 + Actor898: t05 + Owner: Neutral + Location: 33,6 + Actor899: tc01 + Owner: Neutral + Location: 29,18 + Actor900: t07 + Owner: Neutral + Location: 31,17 + Actor901: t05 + Owner: Neutral + Location: 37,18 + Actor902: t07 + Owner: Neutral + Location: 38,17 + Actor903: tc02 + Owner: Neutral + Location: 33,18 + Actor904: t15 + Owner: Neutral + Location: 29,9 + Actor905: t05 + Owner: Neutral + Location: 22,8 + Actor906: tc02 + Owner: Neutral + Location: 23,6 + Actor907: t16 + Owner: Neutral + Location: 17,7 + Actor908: tc04 + Owner: Neutral + Location: 19,12 + Actor909: t06 + Owner: Neutral + Location: 22,15 + Actor910: v01 + Owner: Neutral + Location: 9,15 + Actor911: t05 + Owner: Neutral + Location: 10,18 + Actor912: v02 + Owner: Neutral + Location: 10,20 + Actor913: v03 + Owner: Neutral + Location: 15,19 + Actor914: v09 + Owner: Neutral + Location: 13,13 + Actor915: v11 + Owner: Neutral + Location: 7,18 + Actor916: v07 + Owner: Neutral + Location: 18,15 + Actor917: v04 + Owner: Neutral + Location: 11,23 + Actor918: v06 + Owner: Neutral + Location: 4,15 + Actor919: v16 + Owner: Neutral + Location: 3,18 + Actor920: v16 + Owner: Neutral + Location: 4,18 + Actor921: v17 + Owner: Neutral + Location: 5,21 + Actor922: v17 + Owner: Neutral + Location: 6,21 + Actor923: v10 + Owner: Neutral + Location: 9,8 + Actor924: wood + Owner: Neutral + Location: 3,17 + Actor925: wood + Owner: Neutral + Location: 2,17 + Actor926: wood + Owner: Neutral + Location: 2,18 + Actor927: wood + Owner: Neutral + Location: 2,19 + Actor928: wood + Owner: Neutral + Location: 3,19 + Actor929: wood + Owner: Neutral + Location: 4,19 + Actor930: wood + Owner: Neutral + Location: 5,19 + Actor931: wood + Owner: Neutral + Location: 5,18 + Actor932: wood + Owner: Neutral + Location: 5,17 + Actor933: wood + Owner: Neutral + Location: 4,21 + Actor935: wood + Owner: Neutral + Location: 4,22 + Actor936: wood + Owner: Neutral + Location: 5,22 + Actor937: wood + Owner: Neutral + Location: 6,22 + Actor938: wood + Owner: Neutral + Location: 7,22 + Actor939: wood + Owner: Neutral + Location: 7,21 + Actor940: wood + Owner: Neutral + Location: 7,20 + Actor934: wood + Owner: Neutral + Location: 6,20 + Actor941: wood + Owner: Neutral + Location: 5,13 + Actor942: wood + Owner: Neutral + Location: 6,13 + Actor943: wood + Owner: Neutral + Location: 7,13 + Actor944: wood + Owner: Neutral + Location: 8,13 + Actor945: wood + Owner: Neutral + Location: 4,13 + Actor946: wood + Owner: Neutral + Location: 8,12 + Actor947: wood + Owner: Neutral + Location: 15,18 + Actor948: wood + Owner: Neutral + Location: 16,18 + Actor949: wood + Owner: Neutral + Location: 17,18 + Actor950: wood + Owner: Neutral + Location: 17,19 + Actor951: wood + Owner: Neutral + Location: 17,20 + Actor952: wood + Owner: Neutral + Location: 14,18 + Actor953: wood + Owner: Neutral + Location: 18,14 + Actor954: wood + Owner: Neutral + Location: 18,13 + Actor955: wood + Owner: Neutral + Location: 17,13 + Actor956: wood + Owner: Neutral + Location: 15,10 + Actor957: wood + Owner: Neutral + Location: 14,10 + Actor958: wood + Owner: Neutral + Location: 11,10 + Actor959: wood + Owner: Neutral + Location: 10,10 + Actor960: wood + Owner: Neutral + Location: 9,10 + Actor961: wood + Owner: Neutral + Location: 16,26 + Actor962: wood + Owner: Neutral + Location: 17,26 + Actor963: wood + Owner: Neutral + Location: 17,25 + Actor964: pcan + Owner: Greece + Facing: 384 + Location: 100,42 + Actor965: pcan + Owner: Greece + Location: 106,40 + Facing: 491 + Actor966: apc.ai + Owner: Greece + Location: 106,51 + Facing: 618 + Actor967: arty + Owner: Greece + Location: 102,31 + Stance: Defend + Facing: 95 + Actor968: arty + Owner: Greece + Location: 110,30 + Facing: 118 + Actor969: arty + Owner: Greece + Facing: 384 + Location: 95,57 + Actor970: arty + Owner: Greece + Facing: 384 + Location: 108,59 + Actor971: arty + Owner: Greece + Location: 95,51 + Facing: 245 + Actor972: arty + Owner: Greece + Location: 96,46 + Facing: 111 + Actor976: 2tnk + Owner: Greece + Location: 102,57 + Facing: 507 + Actor977: ptnk + Owner: Greece + Facing: 384 + Location: 108,52 + Actor978: ptnk + Owner: Greece + Location: 103,37 + Facing: 507 + Actor979: ptnk + Owner: Greece + Facing: 384 + Location: 107,34 + Actor980: cryo + Owner: Greece + Facing: 384 + Location: 98,34 + Actor981: cryo + Owner: Greece + Location: 98,44 + Facing: 245 + Actor982: cryo + Owner: Greece + Facing: 384 + Location: 99,58 + Actor983: jeep + Owner: Greece + Location: 105,39 + Facing: 245 + Actor984: jeep + Owner: Greece + Location: 103,46 + Facing: 658 + Actor985: e1 + Owner: Greece + SubCell: 3 + Location: 101,42 + Facing: 578 + Actor986: e1 + Owner: Greece + SubCell: 3 + Location: 91,41 + Facing: 245 + Actor987: e1 + Owner: Greece + Facing: 384 + Location: 91,41 + SubCell: 1 + Actor995: e1 + Owner: Greece + SubCell: 3 + Location: 95,71 + Facing: 237 + Actor996: e1 + Owner: Greece + SubCell: 3 + Location: 98,71 + Facing: 190 + Actor997: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 98,61 + Actor998: e1 + Owner: Greece + Facing: 384 + Location: 104,61 + SubCell: 3 + Actor999: e1 + Owner: Greece + Facing: 384 + Location: 104,61 + SubCell: 1 + Actor1000: e1 + Owner: Greece + Location: 104,55 + SubCell: 1 + Facing: 384 + Actor1001: e1 + Owner: Greece + SubCell: 3 + Location: 103,56 + Facing: 705 + Actor1002: e1 + Owner: Greece + Location: 103,56 + SubCell: 1 + Facing: 384 + Actor1003: e1 + Owner: Greece + Location: 104,56 + SubCell: 3 + Facing: 555 + Actor1004: e1 + Owner: Greece + Location: 105,55 + SubCell: 3 + Facing: 384 + Actor1005: e1 + Owner: Greece + Facing: 384 + Location: 102,55 + SubCell: 3 + Actor1006: e1 + Owner: Greece + SubCell: 1 + Location: 101,55 + Facing: 384 + Actor1007: e1 + Owner: Greece + Location: 100,55 + SubCell: 1 + Facing: 563 + Actor1008: e1 + Owner: Greece + Location: 99,56 + SubCell: 3 + Facing: 650 + Actor1009: e1 + Owner: Greece + Location: 100,55 + SubCell: 2 + Facing: 586 + Actor1010: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 99,52 + Actor1011: e1 + Owner: Greece + SubCell: 3 + Location: 98,50 + Facing: 578 + Actor1012: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 100,49 + Actor1013: e1 + Owner: Greece + SubCell: 3 + Location: 105,40 + Facing: 539 + Actor1014: e1 + Owner: Greece + Facing: 384 + Location: 105,40 + SubCell: 1 + Actor1015: e1 + Owner: Greece + SubCell: 3 + Location: 107,39 + Facing: 384 + Actor1016: e1 + Owner: Greece + SubCell: 3 + Location: 104,38 + Facing: 531 + Actor1017: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 104,35 + Actor1018: e1 + Owner: Greece + SubCell: 3 + Location: 102,36 + Facing: 563 + Actor1019: e1 + Owner: Greece + SubCell: 3 + Location: 103,33 + Facing: 618 + Actor1020: e1 + Owner: Greece + Location: 108,33 + SubCell: 3 + Facing: 384 + Actor1021: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 108,45 + Actor1022: e1 + Owner: Greece + Facing: 384 + Location: 100,45 + SubCell: 1 + Actor1023: e1 + Owner: Greece + SubCell: 3 + Location: 101,44 + Facing: 658 + Actor1024: e1 + Owner: Greece + SubCell: 3 + Location: 99,38 + Facing: 384 + Actor1025: e1 + Owner: Greece + SubCell: 3 + Location: 110,53 + Facing: 697 + Actor1026: e1 + Owner: Greece + Facing: 384 + Location: 110,52 + SubCell: 3 + Actor1027: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 107,50 + Actor1028: e1 + Owner: Greece + SubCell: 3 + Location: 111,56 + Facing: 214 + Actor1029: e1 + Owner: Greece + SubCell: 3 + Location: 110,57 + Facing: 0 + Actor1030: e1 + Owner: Greece + Facing: 384 + Location: 111,57 + SubCell: 3 + Actor1031: e1 + Owner: Greece + Facing: 384 + SubCell: 1 + Location: 111,56 + Actor1032: e3 + Owner: Greece + Location: 105,55 + SubCell: 1 + Facing: 142 + Actor1033: e3 + Owner: Greece + Location: 103,55 + SubCell: 1 + Facing: 384 + Actor1034: e3 + Owner: Greece + Facing: 384 + SubCell: 2 + Location: 104,55 + Actor1035: e3 + Owner: Greece + Location: 102,56 + SubCell: 3 + Facing: 563 + Actor1036: e3 + Owner: Greece + Facing: 384 + Location: 99,51 + SubCell: 3 + Actor1037: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 100,48 + Actor1038: e3 + Owner: Greece + Facing: 384 + Location: 100,45 + SubCell: 2 + Actor1039: e3 + Owner: Greece + Facing: 384 + Location: 101,44 + SubCell: 1 + Actor1040: e3 + Owner: Greece + Facing: 384 + Location: 104,38 + SubCell: 1 + Actor1041: e3 + Owner: Greece + Location: 104,35 + SubCell: 1 + Facing: 384 + Actor1042: e3 + Owner: Greece + SubCell: 3 + Location: 110,32 + Facing: 166 + Actor1043: medi + Owner: Greece + Location: 105,40 + SubCell: 2 + Facing: 705 + Actor1044: medi + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 101,45 + Actor1045: medi + Owner: Greece + Facing: 384 + Location: 99,52 + SubCell: 1 + Actor1046: medi + Owner: Greece + SubCell: 1 + Location: 102,55 + Facing: 384 + Actor1047: medi + Owner: Greece + SubCell: 3 + Location: 100,56 + Facing: 650 + Actor1049: mech + Owner: Greece + Location: 101,42 + SubCell: 1 + Facing: 384 + Actor1050: mech + Owner: Greece + SubCell: 3 + Location: 98,48 + Facing: 729 + Actor1051: mech + Owner: Greece + SubCell: 3 + Location: 98,45 + Facing: 563 + Actor1052: mech + Owner: Greece + Location: 108,51 + SubCell: 3 + Facing: 261 + Actor1053: xo + Owner: GDI + Location: 70,18 + Facing: 547 + Actor1054: xo + Owner: GDI + Location: 66,17 + Facing: 610 + Actor1055: n1 + Owner: GDI + Location: 69,19 + SubCell: 1 + Facing: 515 + TurretFacing: 943 + Actor1056: n1 + Owner: GDI + SubCell: 3 + Location: 68,18 + Facing: 467 + Actor1057: n1 + Owner: GDI + SubCell: 3 + Location: 70,17 + Facing: 499 + Actor1058: n1 + Owner: GDI + Location: 71,17 + SubCell: 3 + Facing: 384 + Actor1059: n1 + Owner: GDI + SubCell: 1 + Location: 70,17 + Facing: 507 + Actor1060: n1 + Owner: GDI + SubCell: 3 + Location: 65,19 + Facing: 594 + Actor1061: n1 + Owner: GDI + SubCell: 3 + Location: 64,18 + Facing: 610 + Actor1062: n1 + Owner: GDI + SubCell: 3 + Location: 48,23 + Facing: 650 + Actor1063: n1 + Owner: GDI + Location: 11,23 + SubCell: 1 + Facing: 682 + Actor1064: n1 + Owner: GDI + SubCell: 3 + Location: 14,19 + Facing: 384 + Actor1065: n1 + Owner: GDI + SubCell: 3 + Location: 18,21 + Facing: 642 + Actor1067: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 8,15 + Actor1069: n1 + Owner: GDI + SubCell: 3 + Location: 14,11 + Facing: 491 + Actor1070: n1 + Owner: GDI + SubCell: 3 + Location: 15,6 + Facing: 384 + Actor1071: n1 + Owner: GDI + SubCell: 3 + Location: 19,7 + Facing: 269 + Actor1072: n1 + Owner: GDI + SubCell: 3 + Location: 21,5 + Facing: 174 + Actor1073: n1 + Owner: GDI + SubCell: 3 + Location: 21,4 + Facing: 452 + Actor1074: n1 + Owner: GDI + SubCell: 3 + Location: 27,10 + Facing: 245 + Actor1075: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 30,8 + Actor1076: n1 + Owner: GDI + SubCell: 3 + Location: 27,6 + Facing: 190 + Actor1077: n1 + Owner: GDI + SubCell: 3 + Location: 34,9 + Facing: 293 + Actor1078: n1 + Owner: GDI + SubCell: 3 + Location: 35,24 + Facing: 384 + Actor1079: n1 + Owner: GDI + SubCell: 3 + Location: 51,4 + Facing: 531 + Actor1080: n1 + Owner: GDI + Facing: 384 + Location: 51,4 + SubCell: 1 + Actor1081: n1 + Owner: GDI + SubCell: 3 + Location: 49,6 + Facing: 602 + Actor1083: n1 + Owner: GDI + SubCell: 3 + Location: 46,7 + Facing: 729 + Actor1084: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 56,18 + Actor1085: n1 + Owner: GDI + SubCell: 3 + Location: 52,16 + Facing: 563 + Actor1086: n1 + Owner: GDI + SubCell: 3 + Location: 58,16 + Facing: 384 + Actor1087: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 78,20 + Actor1088: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 79,27 + Actor1089: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 81,29 + Actor1090: n1 + Owner: GDI + SubCell: 3 + Location: 85,21 + Facing: 642 + Actor1091: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 82,16 + Actor1092: n1 + Owner: GDI + Facing: 384 + Location: 82,16 + SubCell: 1 + Actor1093: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 82,8 + Actor1094: n1 + Owner: GDI + Location: 82,8 + SubCell: 1 + Facing: 384 + Actor1095: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 79,9 + Actor1096: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 77,15 + Actor1102: n1 + Owner: GDI + SubCell: 3 + Location: 72,56 + Facing: 384 + Actor1103: n1 + Owner: GDI + Location: 72,56 + SubCell: 1 + Facing: 507 + Actor1105: n1 + Owner: GDI + Facing: 384 + Location: 73,57 + SubCell: 3 + Actor1107: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 84,14 + Actor1109: n3 + Owner: GDI + Facing: 384 + Location: 75,57 + SubCell: 3 + Actor1111: n2 + Owner: GDI + SubCell: 3 + Location: 83,27 + Facing: 515 + Actor1112: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 78,15 + Actor1113: n2 + Owner: GDI + Facing: 384 + Location: 83,8 + SubCell: 3 + Actor1116: n2 + Owner: GDI + Facing: 384 + Location: 14,11 + SubCell: 1 + Actor1117: n2 + Owner: GDI + SubCell: 3 + Location: 27,5 + Facing: 384 + Actor1118: n2 + Owner: GDI + SubCell: 3 + Location: 24,8 + Facing: 523 + Actor1119: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 13,3 + Actor1121: n2 + Owner: GDI + SubCell: 3 + Location: 16,21 + Facing: 539 + Actor1122: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 17,14 + Actor1123: n2 + Owner: GDI + Facing: 384 + Location: 25,26 + SubCell: 3 + Actor1124: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 43,71 + Actor1125: n2 + Owner: GDI + SubCell: 3 + Location: 29,48 + Facing: 642 + Actor1126: n2 + Owner: GDI + SubCell: 3 + Location: 32,49 + Facing: 475 + Actor1127: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 33,48 + Actor1128: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 35,47 + Actor1129: n1 + Owner: GDI + SubCell: 3 + Location: 28,51 + Facing: 658 + Actor1130: n1 + Owner: GDI + SubCell: 3 + Location: 38,52 + Facing: 483 + Actor1132: n1 + Owner: GDI + SubCell: 3 + Location: 32,56 + Facing: 634 + Actor1131: n1 + Owner: GDI + SubCell: 3 + Location: 44,51 + Facing: 158 + Actor1133: n2 + Owner: GDI + SubCell: 3 + Location: 11,49 + Facing: 642 + Actor1134: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 15,51 + Actor1135: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 25,58 + Actor1136: n2 + Owner: GDI + SubCell: 3 + Location: 29,67 + Facing: 384 + Actor1137: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 24,73 + Actor1138: n1 + Owner: GDI + Location: 29,66 + SubCell: 3 + Facing: 491 + Actor1139: n1 + Owner: GDI + SubCell: 3 + Location: 30,69 + Facing: 269 + Actor1140: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 27,59 + Actor1142: n1 + Owner: GDI + SubCell: 3 + Location: 12,50 + Facing: 563 + Actor1143: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 15,43 + Actor1144: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 21,45 + Actor1145: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 19,40 + Actor1147: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 20,39 + Actor1146: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 16,36 + Actor1148: n2 + Owner: GDI + SubCell: 3 + Location: 9,35 + Facing: 602 + Actor1151: n1 + Owner: GDI + SubCell: 3 + Location: 10,30 + Facing: 634 + Actor1153: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 17,31 + Actor1154: n1 + Owner: GDI + SubCell: 3 + Location: 3,23 + Facing: 602 + Actor1155: dd + Owner: Greece + Facing: 384 + Location: 102,23 + Actor1156: dd + Owner: Greece + Facing: 384 + Location: 108,21 + Actor1157: dd + Owner: Greece + Facing: 384 + Location: 105,18 + Actor1158: pt + Owner: Greece + Facing: 384 + Location: 105,20 + Actor1159: pt + Owner: Greece + Facing: 384 + Location: 99,23 + Actor1160: mtnk + Owner: GDI + Location: 7,16 + Facing: 642 + Actor1161: titn + Owner: GDI + Location: 66,15 + Facing: 650 + Actor1162: e2 + Owner: GDI + SubCell: 3 + Location: 47,11 + Facing: 785 + Actor1163: e2 + Owner: GDI + SubCell: 3 + Location: 46,10 + Facing: 753 + Actor1164: e2 + Owner: GDI + SubCell: 3 + Location: 52,7 + Facing: 384 + GuardianPatrol1: waypoint + Owner: Neutral + Location: 26,72 + GuardianPatrol2: waypoint + Owner: Neutral + Location: 25,63 + GuardianPatrol3: waypoint + Owner: Neutral + Location: 13,61 + GuardianPatrol4: waypoint + Owner: Neutral + Location: 13,51 + Hacker2: hack + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 11,73 + Actor1165: n2 + Owner: GDI + SubCell: 3 + Facing: 816 + Location: 8,21 + Actor1166: n1 + Owner: GDI + SubCell: 3 + Facing: 689 + Location: 9,21 + Actor1120: n1 + Owner: GDI + SubCell: 3 + Facing: 666 + Location: 15,13 + Actor1167: n1 + Owner: GDI + SubCell: 3 + Facing: 563 + Location: 14,49 + Actor1168: n1 + Owner: GDI + SubCell: 3 + Facing: 721 + Location: 9,37 + Actor1152: n2 + Owner: GDI + SubCell: 3 + Facing: 602 + Location: 9,27 + Actor1149: n2 + Owner: GDI + SubCell: 3 + Location: 6,30 + Facing: 594 + Actor1150: brl3 + Owner: GDI + Location: 7,36 + Actor1169: brl3 + Owner: GDI + Location: 7,28 + Actor1170: barl + Owner: GDI + Location: 6,36 + Actor1171: n2 + Owner: GDI + SubCell: 3 + Facing: 384 + Location: 72,57 + Actor1172: n2 + Owner: GDI + Facing: 384 + Location: 70,55 + SubCell: 3 + BattleTankPatrol4: waypoint + Owner: Neutral + Location: 68,50 + BattleTankPatrol5: waypoint + Owner: Neutral + Location: 71,49 + Actor1173: msam + Owner: GDI + Facing: 253 + Location: 50,63 + Actor1174: vulc + Owner: GDI + Facing: 626 + Location: 60,61 + Actor1175: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 31,7 + Actor1176: n2 + Owner: GDI + SubCell: 3 + Facing: 674 + Location: 49,22 + Actor1177: n2 + Owner: GDI + SubCell: 1 + Facing: 642 + Location: 49,22 + Actor1048: medi + Owner: Greece + SubCell: 3 + Location: 105,52 + Facing: 384 + AlliedBase1: waypoint + Owner: Greece + Location: 104,34 + AlliedBase2: waypoint + Owner: Greece + Location: 104,44 + AlliedBase3: waypoint + Owner: Greece + Location: 105,53 + Actor1179: n1 + Owner: GDI + SubCell: 3 + Facing: 269 + Location: 16,50 + Actor1141: n1 + Owner: GDI + SubCell: 3 + Facing: 602 + Location: 18,29 + Actor1180: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 15,35 + Actor1181: n2 + Owner: GDI + SubCell: 3 + Facing: 475 + Location: 33,54 + Actor1183: mtnk + Owner: GDI + Location: 81,7 + Facing: 512 + Actor1184: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 47,22 + Actor1186: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 58,6 + Actor1188: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 29,30 + Actor1187: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 38,31 + Actor1189: n2 + Owner: GDI + SubCell: 3 + Facing: 253 + Location: 38,33 + JumpJet1: jjet + Owner: GDI + Location: 10,14 + Facing: 512 + JumpJet2: jjet + Owner: GDI + Location: 16,12 + Facing: 512 + HardOnlyBattleTank1: mtnk + Owner: GDI + Location: 38,49 + Facing: 384 + HardOnlyHumvee: hmmv + Owner: GDI + Location: 18,37 + Facing: 384 + HardOnlyBattleTank2: mtnk + Owner: GDI + Location: 56,15 + Facing: 911 + HardOnlyDisruptor2: disr + Owner: GDI + Location: 83,21 + Facing: 512 + HardOnlyMammoth: htnk + Owner: GDI + Location: 35,72 + Facing: 261 + Actor1190: n2 + Owner: GDI + SubCell: 3 + Facing: 507 + Location: 64,41 + Actor1191: n2 + Owner: GDI + SubCell: 3 + Facing: 808 + Location: 52,39 + Actor1192: n2 + Owner: GDI + SubCell: 3 + Location: 53,40 + Facing: 563 + Actor1193: n1 + Owner: GDI + SubCell: 3 + Facing: 705 + Location: 56,39 + AlliedBase5: waypoint + Owner: Neutral + Location: 97,42 + AlliedBase4: waypoint + Owner: Neutral + Location: 98,55 + Actor1194: n2 + Owner: GDI + SubCell: 3 + Facing: 594 + Location: 2,29 + Actor1195: n1 + Owner: GDI + SubCell: 3 + Facing: 721 + Location: 3,34 + HardOnlyBattleTank3: mtnk + Owner: GDI + Location: 26,4 + Facing: 384 + Actor1196: htnk + Owner: GDI + Facing: 384 + Location: 80,63 + Actor1197: n3 + Owner: GDI + SubCell: 3 + Facing: 384 + Location: 47,30 + Actor1198: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 44,44 + Actor1199: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 47,46 + Actor1201: gtwr + Owner: GDI + Location: 48,24 + Actor1200: e3 + Owner: GDI + SubCell: 3 + Location: 51,31 + Facing: 384 + Actor1202: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 56,14 + Actor1203: n2 + Owner: GDI + SubCell: 3 + Location: 57,15 + Facing: 384 + Actor1204: n2 + Owner: GDI + SubCell: 3 + Location: 27,36 + Facing: 301 + Actor1205: n2 + Owner: GDI + SubCell: 3 + Location: 28,35 + Facing: 111 + Actor1206: n2 + Owner: GDI + Location: 28,33 + SubCell: 1 + Facing: 384 + Actor1207: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 28,25 + Actor1208: n2 + Owner: GDI + Facing: 384 + Location: 28,25 + SubCell: 1 + Actor1209: n2 + Owner: GDI + Facing: 384 + Location: 28,28 + SubCell: 3 + Actor1210: n2 + Owner: GDI + Facing: 384 + Location: 49,60 + SubCell: 1 + Actor1211: n2 + Owner: GDI + Facing: 384 + Location: 65,19 + SubCell: 1 + Actor1212: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 72,20 + Actor1213: n2 + Owner: GDI + Facing: 384 + Location: 72,20 + SubCell: 1 + Actor1214: n2 + Owner: GDI + SubCell: 3 + Location: 73,18 + Facing: 475 + Actor1215: n2 + Owner: GDI + SubCell: 3 + Location: 63,21 + Facing: 610 + Actor1216: n2 + Owner: GDI + Facing: 384 + Location: 63,21 + SubCell: 1 + Actor1217: n2 + Owner: GDI + SubCell: 3 + Location: 63,20 + Facing: 682 + Actor1218: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 71,20 + AlliedBoundary1: waypoint + Owner: Neutral + Location: 89,41 + AlliedBoundary2: waypoint + Owner: Neutral + Location: 89,42 + AlliedBoundary3: waypoint + Owner: Neutral + Location: 89,43 + AlliedBoundary4: waypoint + Owner: Neutral + Location: 87,70 + AlliedBoundary5: waypoint + Owner: Neutral + Location: 87,71 + AlliedBoundary6: waypoint + Owner: Neutral + Location: 87,72 + Actor1182: brik + Owner: GDI + Location: 56,22 + Actor1185: brik + Owner: GDI + Location: 56,21 + Actor1220: brik + Owner: GDI + Location: 56,20 + Actor1221: brik + Owner: GDI + Location: 56,19 + Actor1222: brik + Owner: GDI + Location: 55,19 + Actor1223: brik + Owner: GDI + Location: 53,19 + Actor1224: brik + Owner: GDI + Location: 52,19 + Actor1225: brik + Owner: GDI + Location: 54,19 + Actor1226: mtnk + Owner: GDI + Location: 51,23 + Facing: 618 + Actor1219: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 51,29 + HardOnlyDisruptor1: disr + Owner: GDI + Location: 59,35 + Facing: 618 + Actor1178: mtnk + Owner: GDI + Facing: 512 + Location: 66,23 + Actor1227: mtnk + Owner: GDI + Facing: 512 + Location: 72,23 + Actor1228: atwr + Owner: GDI + Location: 69,18 + Actor1229: msam + Owner: GDI + Location: 76,42 + Facing: 388 + Actor1230: htnk + Owner: GDI + Facing: 384 + Location: 73,40 + Actor1231: htnk + Owner: GDI + Facing: 384 + Location: 71,39 + BattleTankPatrol1: waypoint + Owner: Neutral + Location: 75,67 + BattleTankPatroller1: mtnk + Owner: GDI + Facing: 0 + Location: 75,68 + BattleTankPatrol2: waypoint + Owner: Neutral + Location: 75,59 + BattleTankPatrol3: waypoint + Owner: Neutral + Location: 68,59 + BattleTankPatrol6: waypoint + Owner: Neutral + Location: 71,41 + Actor1232: xo + Owner: GDI + Facing: 384 + Location: 74,42 + Actor1233: xo + Owner: GDI + Facing: 384 + Location: 73,41 + Actor1234: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 75,43 + Actor1235: n1 + Owner: GDI + Facing: 384 + Location: 76,43 + SubCell: 3 + Actor1236: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 73,42 + Actor1237: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 71,40 + Actor1238: n1 + Owner: GDI + Facing: 384 + Location: 76,41 + SubCell: 3 + Actor1239: n2 + Owner: GDI + SubCell: 3 + Facing: 507 + Location: 61,35 + Actor1240: n3 + Owner: GDI + SubCell: 3 + Facing: 309 + Location: 80,39 + Actor1241: n2 + Owner: GDI + SubCell: 3 + Location: 59,28 + Facing: 158 + Actor1242: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 75,31 + Actor1243: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 82,12 + Actor1244: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 48,32 + Actor1245: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 50,34 + Actor1246: n1 + Owner: GDI + SubCell: 3 + Facing: 578 + Location: 64,60 + Actor1247: htnk + Owner: GDI + Facing: 384 + Location: 79,56 + Actor1248: n1 + Owner: GDI + SubCell: 3 + Facing: 384 + Location: 51,6 + Actor1249: atwr + Owner: GDI + Location: 53,9 + Actor1250: hmmv + Owner: GDI + Location: 50,30 + Facing: 384 + HardOnlyBattleTank4: mtnk + Owner: GDI + Location: 53,23 + Facing: 531 + Actor1251: e3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 52,22 + Actor1252: e3 + Owner: GDI + Facing: 384 + Location: 50,23 + SubCell: 3 + Actor1253: e3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 55,25 + Actor1254: e3 + Owner: GDI + Facing: 384 + Location: 53,30 + SubCell: 1 + DroneTip5: waypoint + Owner: Neutral + Location: 50,41 + DroneTip4: waypoint + Owner: Neutral + Location: 51,41 + DroneTip3: waypoint + Owner: Neutral + Location: 52,41 + DroneTip2: waypoint + Owner: Neutral + Location: 53,41 + DroneTip1: waypoint + Owner: Neutral + Location: 53,40 + EmpTip2: waypoint + Owner: Neutral + Location: 28,70 + EmpTip1: waypoint + Owner: Neutral + Location: 30,69 + EmpTip3: waypoint + Owner: Neutral + Location: 28,71 + EmpTip4: waypoint + Owner: Neutral + Location: 28,72 + EmpTip5: waypoint + Owner: Neutral + Location: 28,73 + EmpTip6: waypoint + Owner: Neutral + Location: 28,74 + Actor1255: vulc + Owner: GDI + Facing: 384 + Location: 36,70 + Actor1257: n1 + Owner: GDI + SubCell: 3 + Facing: 384 + Location: 35,71 + Actor1259: vulc + Owner: GDI + Facing: 245 + Location: 37,72 + Actor1260: n2 + Owner: GDI + Facing: 384 + Location: 37,73 + SubCell: 3 + Actor1261: n3 + Owner: GDI + SubCell: 1 + Location: 37,73 + Facing: 384 + Actor1262: hmmv + Owner: GDI + Facing: 384 + Location: 27,29 + Actor1256: hpad.td + Owner: GDI + Location: 30,21 + Actor1263: hpad.td + Owner: GDI + Location: 33,21 + EntranceReveal1: waypoint + Owner: Neutral + Location: 26,30 + EntranceReveal2: waypoint + Owner: Neutral + Location: 48,63 + EntranceReveal3: waypoint + Owner: Neutral + Location: 69,21 + Actor1258: n1 + Owner: GDI + Facing: 384 + Location: 36,71 + SubCell: 3 + Actor1264: n1 + Owner: GDI + Facing: 384 + SubCell: 1 + Location: 36,71 + BridgeDefendersReveal1: waypoint + Owner: Neutral + Location: 36,72 + EntranceReveal4: waypoint + Owner: Neutral + Location: 9,32 + BridgeDefendersReveal2: waypoint + Owner: Neutral + Location: 72,42 + EmpDroneReveal: waypoint + Owner: Neutral + Location: 37,36 + RespawnRally: waypoint + Owner: Neutral + Location: 9,70 + Respawn: waypoint + Owner: Neutral + Location: 4,80 + SouthBarracks: pyle + Owner: GDI + Location: 50,58 + NorthBarracks: pyle + Owner: GDI + Location: 68,14 + WestBarracks: pyle + Owner: GDI + Location: 29,31 + Actor1265: e1 + Owner: Greece + SubCell: 3 + Facing: 134 + Location: 91,42 + Actor1268: 2tnk + Owner: Greece + Facing: 256 + Location: 92,42 + Actor1269: 2tnk + Owner: Greece + Facing: 256 + Location: 92,41 + Actor1270: e1 + Owner: Greece + SubCell: 3 + Facing: 245 + Location: 93,41 + Actor1271: e1 + Owner: Greece + Facing: 384 + SubCell: 1 + Location: 93,41 + Actor1272: e1 + Owner: Greece + SubCell: 3 + Facing: 261 + Location: 94,42 + Actor1273: e1 + Owner: Greece + SubCell: 3 + Facing: 134 + Location: 93,42 + Actor1274: 2tnk + Owner: Greece + Facing: 256 + Location: 90,71 + Actor1275: 2tnk + Owner: Greece + Facing: 256 + Location: 90,70 + Actor1276: e1 + Owner: Greece + SubCell: 3 + Facing: 222 + Location: 91,71 + Actor1277: e1 + Owner: Greece + SubCell: 3 + Facing: 222 + Location: 92,70 + Actor1278: e1 + Owner: Greece + SubCell: 1 + Facing: 277 + Location: 92,70 + Actor1279: e1 + Owner: Greece + SubCell: 3 + Facing: 253 + Location: 91,70 + Actor1280: e1 + Owner: Greece + SubCell: 1 + Facing: 253 + Location: 91,70 + VeryHardOnlyTank1: mtnk + Owner: GDI + Location: 46,34 + Facing: 627 + Actor1266: 2tnk + Owner: Greece + Location: 101,64 + Facing: 512 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-covenants.yaml, ca|rules/custom/commando-mission.yaml, subversion-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml, subversion-weapons.yaml diff --git a/mods/ca/missions/main-campaign/ca08-subversion/n_useioncannon.aud b/mods/ca/missions/main-campaign/ca08-subversion/n_useioncannon.aud new file mode 100644 index 0000000000..b522d4bfe3 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca08-subversion/n_useioncannon.aud differ diff --git a/mods/ca/missions/main-campaign/ca08-subversion/subversion-rules.yaml b/mods/ca/missions/main-campaign/ca08-subversion/subversion-rules.yaml new file mode 100644 index 0000000000..d6d820c178 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca08-subversion/subversion-rules.yaml @@ -0,0 +1,252 @@ +^Palettes: + TintPostProcessEffect: + +World: + LuaScript: + Scripts: campaign.lua, subversion.lua + MissionData: + Briefing: The Allies are now gripped by fear and suspicion. We must seize this opportunity to further destabilize their uneasy alliance with GDI.\n\nVery recently GDI launched one of their orbital weapons platforms. Both groups are being cautious about what information they give each other. The Allies were only partially informed and are predictably concerned, given recent events.\n\nLet us turn their fear into anger. Take control of GDI's Ion Cannon control systems and use the weapon against the Allies. + MapOptions: + ShortGameCheckboxEnabled: False + ScriptLobbyDropdown@RESPAWN: + ID: respawn + Label: Respawns + Description: Enable/disable respawning on death + Values: + enabled: Enabled + disabled: Disabled + Default: disabled + DisplayOrder: 999 + MusicPlaylist: + StartingMusic: subvn + +Player: + PlayerResources: + DefaultCash: 0 + +# Disable tech + +cyborgarmor.upgrade: + Inherits@CAMPAIGNDISABLED: ^Disabled + +cyborgspeed.upgrade: + Inherits@CAMPAIGNDISABLED: ^Disabled + +# Disable powers + +HQ: + -DropPodsPowerCA@Zocom: + -AirstrikePowerCA@uav: + +AFLD.GDI: + -InterceptorPower@AirDef: + +HPAD.TD: + -InterceptorPower@AirDef: + +# Remove radar/power requirements from drones + +MEMP: + -ExternalCondition@DRONECONTROL: + -GrantConditionOnPrerequisite@DRONECONTROL: + -WithColoredOverlay@DRONEDISABLE: + -WithDecoration@DRONEDISABLE: + ExternalCondition@IMMOBILISE: + Condition: notmobile + Mobile: + PauseOnCondition: triggered || being-captured || empdisable || being-warped || driver-dead || notmobile + GrantTimedConditionOnDeploy: + RequiresCondition: !(empdisable || being-warped) + Tooltip: + Name: E.M.P Drone + GenericVisibility: None + Voiced: + -RequiresCondition: + -Voiced@OFFLINE: + +HTNK.Drone: + -ExternalCondition@DRONECONTROL: + -GrantConditionOnPrerequisite@DRONECONTROL: + -WithColoredOverlay@DRONEDISABLE: + -WithDecoration@DRONEDISABLE: + ExternalCondition@IMMOBILISE: + Condition: notmobile + Mobile: + PauseOnCondition: empdisable || being-captured || empdisable || being-warped || driver-dead || notmobile + AttackTurreted: + PauseOnCondition: empdisable || being-warped + Tooltip: + GenericVisibility: None + Voiced: + -RequiresCondition: + -Voiced@OFFLINE: + +MTNK.Drone: + -ExternalCondition@DRONECONTROL: + -GrantConditionOnPrerequisite@DRONECONTROL: + -WithColoredOverlay@DRONEDISABLE: + -WithDecoration@DRONEDISABLE: + ExternalCondition@IMMOBILISE: + Condition: notmobile + Mobile: + PauseOnCondition: empdisable || being-captured || empdisable || being-warped || driver-dead || notmobile + AttackTurreted: + PauseOnCondition: empdisable || being-warped + Tooltip: + GenericVisibility: None + Voiced: + -RequiresCondition: + -Voiced@OFFLINE: + +GDRN: + ExternalCondition@IMMOBILISE: + Condition: notmobile + Tooltip: + GenericVisibility: None + +# Difficulty adjustments for Stealth Tank / Commando / Hackers + +^DifficultyModifiers: + Inherits@ActorDifficultyConditions: ^ActorDifficultyConditions + DamageMultiplier@NORMAL: + Modifier: 80 + RequiresCondition: difficulty-normal + DamageMultiplier@EASY: + Modifier: 60 + RequiresCondition: difficulty-easy + RevealsShroudMultiplier@NORMAL: + Modifier: 115 + RequiresCondition: difficulty-normal + RevealsShroudMultiplier@EASY: + Modifier: 130 + RequiresCondition: difficulty-easy + RangeMultiplier@EASY: + Modifier: 115 + RequiresCondition: difficulty-easy + +STNK.Nod: + Inherits@DIFFICULTY: ^DifficultyModifiers + GainsExperienceMultiplier@TenPercentXp: + Modifier: 10 + GrantCondition: + Condition: tibcore-upgrade + RevealsShroud: + Range: 8c0 + +RMBO: + Inherits@DIFFICULTY: ^DifficultyModifiers + AutoTarget: + InitialStance: HoldFire + RevealsShroud: + Range: 8c0 + ChangesHealth@HOSPITAL: + Step: 1000 + +HACK: + Inherits@DIFFICULTY: ^DifficultyModifiers + -WithMindControlArc@HACK: + TooltipExtras: + Attributes: • Can take control of enemy structures & drones from range\n• Control lost if the Hacker dies + Selectable: + Priority: 10 + +# Disable stolen tech from hacking + +PYLE: + -SpawnActorOnMindControlled@STOLENTECH: + +WEAP.TD: + -SpawnActorOnMindControlled@STOLENTECH: + +HPAD.TD: + -SpawnActorOnMindControlled@STOLENTECH: + +AFLD.GDI: + -SpawnActorOnMindControlled@STOLENTECH: + +# Satellite Hack + +sathack.dummy: + AlwaysVisible: + Interactable: + ScriptTriggers: + SpawnActorPowerCA@sathack: + Actor: camera.sathack + LifeTime: 75 + OrderName: sathack + Icon: hacksat + ChargeInterval: 3000 + Name: Hack Satellite Uplink + Description: \nReveals the targeted area for a short time. + LaunchSound: hacksat.aud + SelectTargetSpeechNotification: SelectTarget + EffectImage: empty + EffectSequence: idle + EffectPalette: tseffect-ignore-lighting-alpha75 + TargetCircleRange: 9c512 + TargetCircleColor: 999999AA + SupportPowerPaletteOrder: 50 + +# Misc + +BRIDGEHUT: + -Targetable: + -Demolishable: + +BRIDGEHUT.small: + -Targetable: + -Demolishable: + +GTWR: + -Power: + +REP: + -Power: + +HOSP: + Inherits@HACKABLE: ^Hackable + -GrantConditionOnPrerequisite@OwnedByAi: + -PeriodicProducerCA@MEDIC: + -PeriodicProducerCA@REJUVENATOR: + -GrantConditionIfOwnerIsNeutral: + -GrantConditionOnPrerequisite@SCRIN: + -RallyPoint: + TooltipExtras: + Description: When controlled, heals nearby infantry. + -TooltipDescription@ally: + -TooltipDescription@other: + +HOSP.Rebuilt: + -PeriodicProducerCA@MEDIC: + -PeriodicProducerCA@REJUVENATOR: + +HOSP.Husk: + -ChangesHealth: + +NUKE: + WithDecoration@HACKED: + Sequence: hacked + -ChangesHealth@HACKED: + +NUK2: + WithDecoration@HACKED: + Sequence: hacked + -ChangesHealth@HACKED: + +EYE: + DetonateWeaponPower@IonStorm: + DisplayTimerRelationships: Ally + ChargeInterval: 375 + -PauseOnCondition: + -BeginChargeSpeechNotification: + IonCannonPower@SurgicalStrike: + ChargeInterval: 125 + -PauseOnCondition: + -Prerequisites: + Power: + Amount: 0 + -Buildable: + +# Hunt() requires only 1 AttackBase +BATF.AI: + -AttackFrontal: diff --git a/mods/ca/missions/main-campaign/ca08-subversion/subversion-weapons.yaml b/mods/ca/missions/main-campaign/ca08-subversion/subversion-weapons.yaml new file mode 100644 index 0000000000..8c283467c2 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca08-subversion/subversion-weapons.yaml @@ -0,0 +1,34 @@ +Hack: + Range: 8c0 + Warhead@immobilise: GrantExternalConditionCA + Range: 0c511 + Duration: 50 + Condition: notmobile + ValidTargets: Vehicle + ValidRelationships: Neutral, Enemy + +SMG: + ReloadDelay: 25 + InvalidTargets: Vehicle, Ship, Water, Structure, Husk + Warhead@1Dam: SpreadDamage + Damage: 25000 + ValidTargets: Infantry, Wall + Versus: + Brick: 8 + +IonCannon: + Warhead@1Dam: SpreadDamage + Damage: 20000 + +IonBolt: + Warhead@1Dam_impact: SpreadDamage + Damage: 4000 + +MEMP: + Warhead@emp: GrantExternalConditionCA + Duration: 600 + +StnkMissile: + Warhead@1Dam: SpreadDamage + Versus: + None: 20 diff --git a/mods/ca/missions/main-campaign/ca08-subversion/subversion.lua b/mods/ca/missions/main-campaign/ca08-subversion/subversion.lua new file mode 100644 index 0000000000..f7e6459956 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca08-subversion/subversion.lua @@ -0,0 +1,353 @@ +MissionDir = "ca|missions/main-campaign/ca08-subversion" + +RespawnEnabled = Map.LobbyOption("respawn") == "enabled" + +BattleTankPatrolPath = { BattleTankPatrol1.Location, BattleTankPatrol2.Location, BattleTankPatrol3.Location, BattleTankPatrol4.Location, BattleTankPatrol5.Location, BattleTankPatrol6.Location, BattleTankPatrol5.Location, BattleTankPatrol4.Location, BattleTankPatrol3.Location, BattleTankPatrol2.Location } + +GuardianPatrolPath = { GuardianPatrol1.Location, GuardianPatrol2.Location, GuardianPatrol3.Location, GuardianPatrol4.Location, GuardianPatrol3.Location, GuardianPatrol2.Location } + +AlliedKeyBuildings = { AlliedTechCenter, AlliedWarFactory, AlliedConyard, AlliedRefinery, AlliedRadar } + +DroneTipLocations = { DroneTip1.Location, DroneTip2.Location, DroneTip3.Location, DroneTip4.Location, DroneTip5.Location } + +EmpTipLocations = { EmpTip1.Location, EmpTip2.Location, EmpTip3.Location, EmpTip4.Location, EmpTip5.Location, EmpTip6.Location } + +VeryHardAndAboveCompositions = { + { Infantry = { "n1", "n1", "n2", "n1", "n1", "n2", "n1" }, MaxTime = DateTime.Minutes(16) }, + { Infantry = { "n1", "n1", "n2", "n1", "n1", "n2", "ztrp", "n1" }, MinTime = DateTime.Minutes(16) }, +} + +if Difficulty == "brutal" then + table.insert(VeryHardAndAboveCompositions, { + { Infantry = { "zrai", "zrai", "zrai" }, MinTime = DateTime.Minutes(26) }, + }) +end + +Squads = { + Main = { + Delay = AdjustDelayForDifficulty(DateTime.Minutes(6)), + AttackValuePerSecond = { + vhard = { Min = 5, Max = 15 }, + brutal = { Min = 10, Max = 20 }, + }, + FollowLeader = true, + ProducerActors = { Infantry = { WestBarracks, SouthBarracks, NorthBarracks } }, + Compositions = AdjustCompositionsForDifficulty(VeryHardAndAboveCompositions), + }, +} + +-- Setup and Tick + +SetupPlayers = function() + Nod = Player.GetPlayer("Nod") + Greece = Player.GetPlayer("Greece") + GDI = Player.GetPlayer("GDI") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = { Nod } + MissionEnemies = { GDI, Greece } +end + +WorldLoaded = function() + SetupPlayers() + + TimerTicks = 0 + Camera.Position = Commando.CenterPosition + + InitObjectives(Nod) + InitGDI() + InitGreece() + + if IsVeryHardOrBelow() then + VeryHardOnlyTank1.Destroy() + end + + if IsHardOrAbove() then + local hospitalLocation = Hospital.Location + Hospital.Destroy() + Actor.Create("hosp.husk", true, { Owner = Neutral, Location = hospitalLocation }) + else + Commando.GrantCondition("difficulty-" .. Difficulty) + Hacker1.GrantCondition("difficulty-" .. Difficulty) + Hacker2.GrantCondition("difficulty-" .. Difficulty) + StealthTank1.GrantCondition("difficulty-" .. Difficulty) + StealthTank2.GrantCondition("difficulty-" .. Difficulty) + + JumpJet1.Destroy() + JumpJet2.Destroy() + HardOnlyBattleTank1.Destroy() + HardOnlyBattleTank2.Destroy() + HardOnlyBattleTank3.Destroy() + HardOnlyBattleTank4.Destroy() + HardOnlyHumvee.Destroy() + HardOnlyDisruptor1.Destroy() + HardOnlyDisruptor2.Destroy() + HardOnlyMammoth.Destroy() + + if Difficulty == "easy" then + Utils.Do(MissionPlayers, function(p) + Actor.Create("sathack.dummy", true, { Owner = p, Location = Commando.Location }) + end) + end + + Trigger.AfterDelay(DateTime.Seconds(3), function() + Tip("Hackers can remotely take control of enemy structures, defenses and drone vehicles.") + Tip("Stealth units can be detected by enemy defenses, as well as infantry at close range.") + end) + end + + ObjectiveHackIonControl = Nod.AddObjective("Hack into GDI Advanced Comms Center.") + + CommandoDeathTrigger(Commando) + HackerDeathTrigger(Hacker1) + HackerDeathTrigger(Hacker2) + StealthTankDeathTrigger(StealthTank1) + StealthTankDeathTrigger(StealthTank2) + + Utils.Do(MissionPlayers, function(p) + Actor.Create("radar.dummy", true, { Owner = p }) + end) + + Trigger.OnKilled(IonControl, function(self, killer) + if ObjectiveHackIonControl ~= nil and not Nod.IsObjectiveCompleted(ObjectiveHackIonControl) then + Nod.MarkFailedObjective(ObjectiveHackIonControl) + end + if ObjectiveDestroyAlliedBase ~= nil and not Nod.IsObjectiveCompleted(ObjectiveDestroyAlliedBase) then + Nod.MarkFailedObjective(ObjectiveDestroyAlliedBase) + end + end) + + Trigger.OnAllKilled(AlliedKeyBuildings, function() + if not Nod.IsObjectiveCompleted(ObjectiveHackIonControl) then + Nod.MarkCompletedObjective(ObjectiveHackIonControl) + end + if ObjectiveDestroyAlliedBase ~= nil then + Nod.MarkCompletedObjective(ObjectiveDestroyAlliedBase) + end + end) + + if IsNormalOrBelow() then + Trigger.OnEnteredFootprint(DroneTipLocations, function(a, id) + if IsMissionPlayer(a.Owner) and not DroneTipShown then + DroneTipShown = true + Trigger.RemoveFootprintTrigger(id) + if not MammothDrone.IsDead and not IsMissionPlayer(MammothDrone.Owner) then + Tip("Mammoth Drone detected. Hackers can take control of this vehicle.") + end + end + end) + end + + local revealPoints = { EntranceReveal1, EntranceReveal2, EntranceReveal3, EntranceReveal4, BridgeDefendersReveal1, BridgeDefendersReveal2, EmpDroneReveal } + Utils.Do(revealPoints, function(p) + Trigger.OnEnteredProximityTrigger(p.CenterPosition, WDist.New(11 * 1024), function(a, id) + if IsMissionPlayer(a.Owner) and a.Type ~= "smallcamera" then + Trigger.RemoveProximityTrigger(id) + if p == BridgeDefendersReveal1 and not BridgeTipShown then + BridgeTipShown = true + Tip("Too many guards up ahead. Find a way to neutralise them.") + end + if IsNormalOrBelow() and p == EmpDroneReveal and not EmpDroneTipShown then + EmpDroneTipShown = true + Media.DisplayMessage("That E.M.P Drone could come in handy.", "Hacker", HSLColor.FromHex("00FF00")) + end + local camera = Actor.Create("smallcamera", true, { Owner = Nod, Location = p.Location }) + Trigger.AfterDelay(DateTime.Seconds(4), function() + camera.Destroy() + end) + end + end) + end) + + local bridgeParts = Utils.Where(Map.ActorsInWorld, function(b) return b.Type =="brh1" or b.Type == "brh2" or b.Type == "brh3" end) + local northBridgeParts = Utils.Where(bridgeParts, function(b) return b.Location.Y < 50 end) + local southBridgeParts = Utils.Where(bridgeParts, function(b) return b.Location.Y > 50 end) + + Trigger.OnAnyKilled(northBridgeParts, function() + NorthBridgeDestroyed = true + if SouthBridgeDestroyed then + InitBridgesObjective() + Nod.MarkCompletedObjective(ObjectiveDestroyBridges) + end + end) + + Trigger.OnAnyKilled(southBridgeParts, function() + SouthBridgeDestroyed = true + if NorthBridgeDestroyed then + InitBridgesObjective() + Nod.MarkCompletedObjective(ObjectiveDestroyBridges) + end + end) + + AfterWorldLoaded() +end + +Tick = function() + OncePerSecondChecks() + OncePerFiveSecondChecks() + AfterTick() +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + Greece.Resources = Greece.ResourceCapacity - 500 + GDI.Resources = GDI.ResourceCapacity - 500 + + if TimerTicks > 0 then + if TimerTicks > 25 then + TimerTicks = TimerTicks - 25 + else + TimerTicks = 0 + end + end + + if not IonControlHacked and IsMissionPlayer(IonControl.Owner) then + IonControlHacked = true + InitBridgesObjective() + ObjectiveDestroyAlliedBase = Nod.AddObjective("Use the Ion Cannon to destroy the Allied base.") + Nod.MarkCompletedObjective(ObjectiveHackIonControl) + UserInterface.SetMissionText("Destroy bridges then use the Ion Cannon to destroy the Allied base.", HSLColor.Yellow) + MediaCA.PlaySound(MissionDir .. "/n_useioncannon.aud", 2) + BaseCamera1 = Actor.Create("camera", true, { Owner = Nod, Location = AlliedBase1.Location }) + BaseCamera2 = Actor.Create("camera", true, { Owner = Nod, Location = AlliedBase2.Location }) + BaseCamera3 = Actor.Create("camera", true, { Owner = Nod, Location = AlliedBase3.Location }) + BaseCamera4 = Actor.Create("camera", true, { Owner = Nod, Location = AlliedBase4.Location }) + BaseCamera5 = Actor.Create("camera", true, { Owner = Nod, Location = AlliedBase5.Location }) + BridgeCamera1 = Actor.Create("camera", true, { Owner = Nod, Location = AlliedBoundary2.Location }) + BridgeCamera2 = Actor.Create("camera", true, { Owner = Nod, Location = AlliedBoundary5.Location }) + Beacon.New(Nod, AlliedBase2.CenterPosition) + Trigger.AfterDelay(DateTime.Seconds(6), function() + BaseCamera1.Destroy() + BaseCamera2.Destroy() + BaseCamera3.Destroy() + BaseCamera4.Destroy() + BaseCamera5.Destroy() + BridgeCamera1.Destroy() + BridgeCamera2.Destroy() + end) + InitIonControl() + end + end +end + +InitIonControl = function() + -- overridden in co-op version for damage scoreboard +end + +OncePerFiveSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 125 == 0 then + -- nothing + end +end + +InitGDI = function() + RebuildExcludes.GDI = { Types = { "gtwr", "atwr" } } + + AutoRepairAndRebuildBuildings(GDI, 15) + SetupRefAndSilosCaptureCredits(GDI) + AutoReplaceHarvesters(GDI) + InitAiUpgrades(GDI) + InitGDIPatrols() + if IsVeryHardOrAbove() then + InitAttackSquad(Squads.Main, GDI) + end + local gdiGroundAttackers = GDI.GetGroundAttackers() + + Utils.Do(gdiGroundAttackers, function(a) + TargetSwapChance(a, 10) + if a.Type ~= "memp" and a.Type ~= "gdrn" and a.Type ~= "htnk.drone" and a.Type ~= "mtnk.drone" then + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsGDIGroundHunterUnit) + end + end) +end + +InitGreece = function() + AutoRepairAndRebuildBuildings(Greece, 15) + SetupRefAndSilosCaptureCredits(Greece) + AutoReplaceHarvesters(Greece) + InitAiUpgrades(Greece) + + local greeceGroundAttackers = Greece.GetGroundAttackers() + + Utils.Do(greeceGroundAttackers, function(a) + Trigger.OnDamaged(a, function(self, attacker, damage) + if not self.IsDead and not attacker.IsDead and self.HasProperty("Attack") and self.CanTarget(attacker) then + self.Attack(attacker) + elseif not self.IsDead and self.HasProperty("Scatter") then + self.Scatter() + end + end) + end) +end + +InitGDIPatrols = function() + if not GuardianPatroller1.IsDead then + GuardianPatroller1.Patrol(GuardianPatrolPath, true) + end + + if not BattleTankPatroller1.IsDead then + BattleTankPatroller1.Patrol(BattleTankPatrolPath, true) + end +end + +CommandoDeathTrigger = function(commando) + Trigger.OnKilled(commando, function(self, killer) + if RespawnEnabled then + Notification("Commando arriving in 20 seconds.") + Trigger.AfterDelay(DateTime.Seconds(20), function() + local respawnedCommando = Reinforcements.Reinforce(self.Owner, { "rmbo" }, { Respawn.Location, RespawnRally.Location })[1] + Beacon.New(self.Owner, RespawnRally.CenterPosition) + Media.PlaySpeechNotification(self.Owner, "ReinforcementsArrived") + if IsNormalOrBelow() then + respawnedCommando.GrantCondition("difficulty-" .. Difficulty) + end + CommandoDeathTrigger(respawnedCommando) + end) + end + end) +end + +HackerDeathTrigger = function(hacker) + Trigger.OnKilled(hacker, function(self, killer) + if #self.Owner.GetActorsByType("hack") == 0 and not Nod.IsObjectiveCompleted(ObjectiveHackIonControl) then + if RespawnEnabled then + Notification("Hacker arriving in 20 seconds.") + Trigger.AfterDelay(DateTime.Seconds(20), function() + local respawnedHacker = Reinforcements.Reinforce(self.Owner, { "hack" }, { Respawn.Location, RespawnRally.Location })[1] + Beacon.New(self.Owner, RespawnRally.CenterPosition) + Media.PlaySpeechNotification(self.Owner, "ReinforcementsArrived") + if IsNormalOrBelow() then + respawnedHacker.GrantCondition("difficulty-" .. Difficulty) + end + HackerDeathTrigger(respawnedHacker) + end) + elseif #GetMissionPlayersActorsByTypes({ "hack" }) == 0 then + Nod.MarkFailedObjective(ObjectiveHackIonControl) + end + end + end) +end + +StealthTankDeathTrigger = function(stealthTank) + Trigger.OnKilled(stealthTank, function(self, killer) + if #self.Owner.GetActorsByType("stnk.nod") == 0 then + if RespawnEnabled then + Notification("Stealth Tank arriving in 20 seconds.") + Trigger.AfterDelay(DateTime.Seconds(20), function() + local respawnedStealthTank = Reinforcements.Reinforce(self.Owner, { "stnk.nod" }, { Respawn.Location, RespawnRally.Location })[1] + Beacon.New(self.Owner, RespawnRally.CenterPosition) + Media.PlaySpeechNotification(self.Owner, "ReinforcementsArrived") + if IsNormalOrBelow() then + respawnedStealthTank.GrantCondition("difficulty-" .. Difficulty) + end + StealthTankDeathTrigger(respawnedStealthTank) + end) + end + end + end) +end + +InitBridgesObjective = function() + if ObjectiveDestroyBridges == nil then + ObjectiveDestroyBridges = Nod.AddObjective("Destroy bridges leading to Allied base.") + end +end diff --git a/mods/ca/missions/main-campaign/ca09-salvation/map.bin b/mods/ca/missions/main-campaign/ca09-salvation/map.bin new file mode 100644 index 0000000000..8ce0288752 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca09-salvation/map.bin differ diff --git a/mods/ca/missions/main-campaign/ca09-salvation/map.png b/mods/ca/missions/main-campaign/ca09-salvation/map.png new file mode 100644 index 0000000000..11b00318c6 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca09-salvation/map.png differ diff --git a/mods/ca/missions/main-campaign/ca09-salvation/map.yaml b/mods/ca/missions/main-campaign/ca09-salvation/map.yaml new file mode 100644 index 0000000000..6c3f29bb05 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca09-salvation/map.yaml @@ -0,0 +1,1890 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 09: Salvation + +Author: Darkademic + +Tileset: DESERT + +MapSize: 98,98 + +Bounds: 1,1,96,96 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: Nod, Scrin, Civilian + PlayerReference@Nod: + Name: Nod + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: nod + LockColor: True + Color: FE1100 + LockSpawn: True + LockTeam: True + Allies: Civilian + Enemies: Scrin, Creeps + PlayerReference@Scrin: + Name: Scrin + Bot: campaign + Faction: scrin + Color: 7700FF + Enemies: Nod, Creeps, Civilian + PlayerReference@Civilian: + Name: Civilian + NonCombatant: True + Faction: Random + Allies: Nod + Enemies: Scrin, Creeps + +Actors: + Hospital: hosp + Owner: Nod + Location: 14,39 + Actor14: sbag + Owner: Nod + Location: 23,41 + Actor15: sbag + Owner: Nod + Location: 23,42 + Actor16: sbag + Owner: Nod + Location: 23,43 + Actor17: sbag + Owner: Nod + Location: 22,43 + Actor18: sbag + Owner: Nod + Location: 24,41 + Actor19: sbag + Owner: Nod + Location: 18,49 + Actor20: sbag + Owner: Nod + Location: 18,50 + Actor21: sbag + Owner: Nod + Location: 19,50 + Actor26: sbag + Owner: Nod + Location: 22,44 + Actor27: gun.nod + Owner: Nod + Location: 23,44 + TurretFacing: 721 + Actor28: gun.nod + Owner: Nod + Location: 19,51 + TurretFacing: 515 + Actor29: sbag + Owner: Nod + Location: 12,30 + Actor30: sbag + Owner: Nod + Location: 13,30 + Actor31: sbag + Owner: Nod + Location: 14,30 + Actor32: sbag + Owner: Nod + Location: 12,31 + Actor33: gun.nod + Owner: Nod + Location: 13,29 + Actor34: nsam + Owner: Nod + Location: 21,42 + Actor35: nsam + Owner: Nod + Location: 13,31 + Actor36: obli + Owner: Nod + Location: 19,49 + Actor37: nuk2 + Owner: Nod + Location: 19,32 + Actor38: nuk2 + Owner: Nod + Location: 13,33 + Actor39: rep + Owner: Nod + Location: 18,37 + Actor40: hq + Owner: Nod + Location: 5,35 + Actor41: nuk2 + Owner: Nod + Location: 14,46 + Actor150: sbag + Owner: Nod + Location: 20,49 + Actor151: sbag + Owner: Nod + Location: 20,50 + Actor76: v25 + Owner: Neutral + Location: 55,72 + Actor77: v30 + Owner: Neutral + Location: 60,74 + Actor78: v20 + Owner: Neutral + Location: 56,76 + Actor79: v33 + Owner: Neutral + Location: 51,80 + Actor80: v36 + Owner: Neutral + Location: 52,76 + Actor81: v29 + Owner: Neutral + Location: 60,78 + Actor82: v11 + Owner: Neutral + Location: 51,68 + Actor83: v32 + Owner: Neutral + Location: 61,84 + Actor84: v27 + Owner: Neutral + Location: 59,70 + Actor85: v35 + Owner: Neutral + Location: 62,72 + Actor86: v24 + Owner: Neutral + Location: 50,72 + Actor87: t09 + Owner: Neutral + Location: 61,79 + Actor88: tc01 + Owner: Neutral + Location: 64,75 + Actor89: t18 + Owner: Neutral + Location: 47,69 + Actor90: t08 + Owner: Neutral + Location: 47,79 + Actor91: t18 + Owner: Neutral + Location: 49,89 + Actor92: rock7 + Owner: Neutral + Location: 62,86 + Actor93: rock3 + Owner: Neutral + Location: 63,44 + Actor94: v25 + Owner: Neutral + Location: 48,52 + Actor95: t18 + Owner: Neutral + Location: 49,54 + Actor96: v27 + Owner: Neutral + Location: 53,51 + Actor97: v24 + Owner: Neutral + Location: 61,50 + Actor98: v20 + Owner: Neutral + Location: 55,44 + Actor99: v21 + Owner: Neutral + Location: 53,58 + Actor100: v35 + Owner: Neutral + Location: 57,57 + Actor101: v32 + Owner: Neutral + Location: 50,47 + Actor102: v30 + Owner: Neutral + Location: 60,45 + Actor103: v31 + Owner: Neutral + Location: 41,58 + Actor104: v34 + Owner: Neutral + Location: 39,58 + Actor105: v26 + Owner: Neutral + Location: 56,51 + Actor106: v29 + Owner: Neutral + Location: 46,43 + Actor107: t04 + Owner: Neutral + Location: 48,43 + Actor108: t08 + Owner: Neutral + Location: 51,43 + Actor109: t18 + Owner: Neutral + Location: 60,60 + Actor110: v31 + Owner: Neutral + Location: 65,48 + Actor111: v33 + Owner: Neutral + Location: 53,55 + Actor112: v09 + Owner: Neutral + Location: 62,55 + Actor113: v09 + Owner: Neutral + Location: 45,84 + Actor114: v08 + Owner: Neutral + Location: 49,84 + Actor115: t04 + Owner: Neutral + Location: 45,82 + Actor116: v23 + Owner: Neutral + Location: 58,82 + Actor117: v24 + Owner: Neutral + Location: 19,10 + Actor118: v25 + Owner: Neutral + Location: 19,3 + Actor119: v21 + Owner: Neutral + Location: 31,12 + Actor120: v27 + Owner: Neutral + Location: 32,10 + Actor121: v28 + Owner: Neutral + Location: 24,11 + Actor122: v29 + Owner: Neutral + Location: 9,5 + Actor123: v32 + Owner: Neutral + Location: 13,7 + Actor124: v25 + Owner: Neutral + Location: 71,10 + Actor126: v21 + Owner: Neutral + Location: 73,5 + Actor127: v33 + Owner: Neutral + Location: 62,12 + Actor128: v36 + Owner: Neutral + Location: 67,8 + Actor129: v32 + Owner: Neutral + Location: 75,8 + Actor130: v24 + Owner: Neutral + Location: 60,7 + Actor131: v31 + Owner: Neutral + Location: 65,5 + Actor132: t08 + Owner: Neutral + Location: 72,3 + Actor133: t18 + Owner: Neutral + Location: 72,15 + Actor134: v27 + Owner: Neutral + Location: 80,12 + Actor135: v22 + Owner: Neutral + Location: 73,13 + Actor136: v22 + Owner: Neutral + Location: 11,11 + Actor137: v36 + Owner: Neutral + Location: 20,8 + Actor138: v30 + Owner: Neutral + Location: 16,7 + Actor139: tc01 + Owner: Neutral + Location: 16,10 + Actor140: v33 + Owner: Neutral + Location: 27,12 + Actor141: v34 + Owner: Neutral + Location: 6,12 + Actor142: v29 + Owner: Neutral + Location: 35,14 + Actor143: v27 + Owner: Neutral + Location: 9,15 + Actor144: v20 + Owner: Neutral + Location: 23,6 + Actor145: v31 + Owner: Neutral + Location: 6,7 + Actor146: t08 + Owner: Neutral + Location: 26,9 + Actor147: v25 + Owner: Neutral + Location: 14,84 + Actor148: v27 + Owner: Neutral + Location: 19,85 + Actor149: v32 + Owner: Neutral + Location: 22,86 + Actor152: v24 + Owner: Neutral + Location: 26,89 + Actor153: v26 + Owner: Neutral + Location: 37,7 + Actor154: t18 + Owner: Neutral + Location: 39,6 + Actor155: tc01 + Owner: Neutral + Location: 31,19 + Actor156: tc01 + Owner: Neutral + Location: 28,79 + Actor157: v30 + Owner: Neutral + Location: 26,86 + Actor158: v31 + Owner: Neutral + Location: 15,88 + Actor159: v23 + Owner: Neutral + Location: 18,89 + Actor160: t18 + Owner: Neutral + Location: 20,92 + Actor161: v28 + Owner: Neutral + Location: 24,92 + Actor162: v29 + Owner: Neutral + Location: 31,82 + Actor163: v35 + Owner: Neutral + Location: 28,83 + Actor164: v34 + Owner: Neutral + Location: 21,83 + Actor165: t18 + Owner: Neutral + Location: 11,87 + Actor166: t08 + Owner: Neutral + Location: 23,84 + Actor167: v27 + Owner: Neutral + Location: 71,25 + Actor168: v26 + Owner: Neutral + Location: 88,26 + Actor169: v32 + Owner: Neutral + Location: 79,26 + Actor170: v33 + Owner: Neutral + Location: 72,29 + Actor171: v21 + Owner: Neutral + Location: 86,31 + Actor172: v20 + Owner: Neutral + Location: 63,23 + Actor173: v22 + Owner: Neutral + Location: 69,22 + Actor174: v24 + Owner: Neutral + Location: 79,28 + Actor175: v36 + Owner: Neutral + Location: 73,32 + Actor176: v33 + Owner: Neutral + Location: 92,32 + Actor177: t18 + Owner: Neutral + Location: 85,29 + Actor178: v22 + Owner: Neutral + Location: 91,9 + Actor179: v29 + Owner: Neutral + Location: 83,17 + Actor180: v35 + Owner: Neutral + Location: 57,8 + Actor181: v34 + Owner: Neutral + Location: 85,8 + Actor182: v28 + Owner: Neutral + Location: 80,16 + Actor183: v28 + Owner: Neutral + Location: 68,28 + Actor184: v35 + Owner: Neutral + Location: 82,30 + Actor185: v29 + Owner: Neutral + Location: 76,32 + Actor186: tc01 + Owner: Neutral + Location: 67,23 + Actor187: t08 + Owner: Neutral + Location: 83,26 + Actor188: tc01 + Owner: Neutral + Location: 71,45 + Actor189: tc01 + Owner: Neutral + Location: 8,77 + Actor190: tc01 + Owner: Neutral + Location: 11,60 + Actor191: t08 + Owner: Neutral + Location: 31,47 + Actor192: t18 + Owner: Neutral + Location: 33,40 + Actor193: tc01 + Owner: Neutral + Location: 39,30 + Actor194: rock6 + Owner: Neutral + Location: 46,32 + Actor195: rock2 + Owner: Neutral + Location: 24,58 + Actor196: rock1 + Owner: Neutral + Location: 29,51 + Actor197: rock4 + Owner: Neutral + Location: 7,72 + Actor198: rock5 + Owner: Neutral + Location: 40,88 + Actor199: rock6 + Owner: Neutral + Location: 63,79 + Actor200: rock2 + Owner: Neutral + Location: 83,63 + Actor201: rock1 + Owner: Neutral + Location: 89,67 + Actor202: t18 + Owner: Neutral + Location: 83,71 + Actor203: t08 + Owner: Neutral + Location: 92,66 + Actor204: t04 + Owner: Neutral + Location: 72,67 + Actor205: tc01 + Owner: Neutral + Location: 79,91 + Actor206: t18 + Owner: Neutral + Location: 92,82 + Actor207: t08 + Owner: Neutral + Location: 80,86 + Actor208: split2 + Owner: Neutral + Location: 88,87 + Actor209: split2 + Owner: Neutral + Location: 93,60 + Actor210: split2 + Owner: Neutral + Location: 80,70 + Actor211: split2 + Owner: Neutral + Location: 78,45 + Actor212: c5 + Owner: Civilian + SubCell: 3 + Location: 9,11 + Facing: 856 + Actor213: c5 + Owner: Civilian + SubCell: 3 + Location: 27,11 + Facing: 166 + Actor214: c5 + Owner: Civilian + Facing: 384 + SubCell: 3 + Location: 19,90 + Actor215: c5 + Owner: Civilian + Facing: 384 + SubCell: 3 + Location: 28,86 + Actor216: c8 + Owner: Civilian + Facing: 384 + SubCell: 3 + Location: 22,90 + Actor217: c8 + Owner: Civilian + SubCell: 3 + Location: 18,83 + Facing: 214 + Actor218: c8 + Owner: Civilian + SubCell: 3 + Location: 11,15 + Facing: 467 + Actor219: c8 + Owner: Civilian + SubCell: 3 + Location: 18,6 + Facing: 555 + Actor220: c10 + Owner: Civilian + SubCell: 3 + Facing: 384 + Location: 21,5 + Actor221: c10 + Owner: Civilian + SubCell: 3 + Location: 23,88 + Facing: 0 + Actor222: c4 + Owner: Civilian + SubCell: 3 + Location: 14,87 + Facing: 515 + Actor223: c4 + Owner: Civilian + SubCell: 3 + Location: 25,14 + Facing: 697 + Actor224: c4 + Owner: Civilian + Facing: 384 + SubCell: 3 + Location: 10,8 + Actor225: c2 + Owner: Civilian + SubCell: 3 + Location: 26,93 + Facing: 0 + Actor226: c2 + Owner: Civilian + Facing: 384 + SubCell: 3 + Location: 20,14 + NodCamera4: c3 + Owner: Civilian + SubCell: 3 + Location: 15,12 + Facing: 384 + Actor228: c3 + Owner: Civilian + SubCell: 3 + Location: 26,83 + Facing: 658 + Actor255: s1 + Owner: Scrin + Facing: 384 + Location: 45,46 + SubCell: 3 + Actor256: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 45,44 + Actor293: devo + Owner: Scrin + Facing: 384 + Location: 56,81 + Actor299: devo + Owner: Scrin + Location: 63,53 + Facing: 222 + Actor306: gunw + Owner: Scrin + Facing: 384 + Location: 47,45 + Actor311: seek + Owner: Scrin + Facing: 384 + Location: 67,45 + Actor312: seek + Owner: Scrin + Facing: 384 + Location: 69,46 + Actor313: seek + Owner: Scrin + Location: 69,65 + Facing: 182 + Actor314: tpod + Owner: Scrin + Facing: 384 + Location: 70,44 + Actor316: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 45,47 + Actor325: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 67,46 + Actor330: gscr + Owner: Scrin + Facing: 384 + Location: 54,80 + SubCell: 3 + Actor343: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 47,46 + Actor338: s3 + Owner: Scrin + Facing: 384 + Location: 50,60 + SubCell: 3 + Actor346: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 56,49 + Actor348: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 64,53 + Actor349: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 63,54 + Actor350: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 65,52 + Actor351: gscr + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 62,56 + Actor352: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 65,53 + Actor354: s1 + Owner: Scrin + Facing: 384 + Location: 69,45 + SubCell: 1 + Actor356: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 71,44 + Actor360: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 71,85 + Actor361: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 72,84 + Actor362: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 72,82 + Actor363: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 69,66 + Actor372: intl.ai + Owner: Scrin + Facing: 384 + Location: 61,6 + Actor386: corr + Owner: Scrin + Facing: 384 + Location: 86,28 + Actor388: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 85,27 + Actor394: rtpd + Owner: Scrin + Facing: 384 + Location: 78,71 + Actor395: rtpd + Owner: Scrin + Location: 80,67 + Facing: 111 + Actor396: ltur + Owner: Nod + Location: 40,14 + TurretFacing: 904 + Actor397: ltur + Owner: Nod + Location: 40,10 + TurretFacing: 785 + Actor398: ltur + Owner: Nod + Location: 31,79 + TurretFacing: 650 + Actor399: n1 + Owner: Nod + SubCell: 3 + Location: 27,84 + Facing: 729 + Actor400: n1 + Owner: Nod + Location: 27,84 + SubCell: 1 + Facing: 816 + Actor401: n1 + Owner: Nod + SubCell: 3 + Location: 30,80 + Facing: 824 + Actor402: n1 + Owner: Nod + SubCell: 3 + Location: 29,89 + Facing: 0 + Actor403: n1 + Owner: Nod + SubCell: 3 + Location: 40,15 + Facing: 634 + Actor404: n1 + Owner: Nod + Facing: 384 + Location: 40,15 + SubCell: 1 + Actor405: n1 + Owner: Nod + SubCell: 3 + Location: 39,10 + Facing: 729 + Actor406: n1 + Owner: Nod + SubCell: 3 + Location: 38,8 + Facing: 745 + Actor407: proc.scrin + Owner: Scrin + Location: 87,76 + Actor408: scol + Owner: Scrin + Location: 79,81 + Actor409: scol + Owner: Scrin + Location: 87,65 + Actor410: rea2 + Owner: Scrin + Location: 93,74 + Actor411: rea2 + Owner: Scrin + Location: 90,72 + Actor412: silo.scrin + Owner: Scrin + Location: 91,76 + Actor413: ptur + Owner: Scrin + Location: 87,73 + Actor414: lace + Owner: Scrin + Location: 41,34 + Facing: 689 + Actor415: lace + Owner: Scrin + Location: 43,33 + Facing: 570 + Actor420: tc01 + Owner: Neutral + Location: 51,22 + Actor421: t04 + Owner: Neutral + Location: 48,27 + Actor422: hand + Owner: Nod + Location: 17,43 + PlayerStart: waypoint + Owner: Neutral + Location: 12,41 + Actor427: camera + Owner: Scrin + Location: 60,10 + Actor430: camera + Owner: Scrin + Location: 71,12 + Actor431: camera + Owner: Scrin + Location: 82,11 + Actor432: camera + Owner: Scrin + Location: 79,19 + Actor433: camera + Owner: Scrin + Location: 69,27 + Actor434: camera + Owner: Scrin + Location: 84,30 + Actor435: camera + Owner: Scrin + Location: 68,47 + Actor436: camera + Owner: Scrin + Location: 54,50 + Actor437: camera + Owner: Scrin + Location: 43,47 + Actor438: camera + Owner: Scrin + Location: 46,58 + Actor439: camera + Owner: Scrin + Location: 40,84 + Actor440: camera + Owner: Scrin + Location: 49,82 + Actor441: camera + Owner: Scrin + Location: 57,75 + Actor442: camera + Owner: Scrin + Location: 64,83 + Actor443: camera + Owner: Scrin + Location: 75,83 + Actor444: camera + Owner: Scrin + Location: 71,65 + Actor445: camera + Owner: Scrin + Location: 65,57 + Actor446: camera + Owner: Scrin + Location: 45,36 + Actor447: camera + Owner: Scrin + Location: 20,46 + Actor448: camera + Owner: Scrin + Location: 10,31 + Actor449: camera + Owner: Scrin + Location: 49,11 + Actor450: v26 + Owner: Neutral + Location: 15,72 + Actor451: v31 + Owner: Neutral + Location: 27,68 + Actor452: v24 + Owner: Neutral + Location: 11,66 + Actor453: v22 + Owner: Neutral + Location: 9,69 + Actor454: v36 + Owner: Neutral + Location: 25,72 + Actor455: v34 + Owner: Neutral + Location: 28,65 + Actor456: v23 + Owner: Neutral + Location: 18,65 + Actor457: v21 + Owner: Neutral + Location: 10,73 + Actor458: v20 + Owner: Neutral + Location: 18,63 + Actor459: v27 + Owner: Neutral + Location: 22,66 + Actor460: c8 + Owner: Civilian + Facing: 384 + SubCell: 3 + Location: 26,67 + Actor461: c10 + Owner: Civilian + Facing: 384 + SubCell: 3 + Location: 11,69 + Actor462: c4 + Owner: Civilian + SubCell: 3 + Facing: 384 + Location: 16,68 + Actor463: c5 + Owner: Civilian + SubCell: 3 + Facing: 384 + Location: 9,72 + Actor464: c9 + Owner: Civilian + Facing: 384 + SubCell: 3 + Location: 17,73 + Actor466: atmz + Owner: Scrin + Location: 71,83 + Facing: 253 + WormholeSpawn1a: waypoint + Owner: Neutral + Location: 24,9 + WormholeSpawn2b: waypoint + Owner: Neutral + Location: 75,11 + WormholeSpawn3a: waypoint + Owner: Neutral + Location: 61,26 + WormholeSpawn4b: waypoint + Owner: Neutral + Location: 43,34 + WormholeSpawn5a: waypoint + Owner: Neutral + Location: 59,53 + WormholeSpawn6a: waypoint + Owner: Neutral + Location: 62,70 + WormholeSpawn7a: waypoint + Owner: Neutral + Location: 31,85 + WormholeSpawn8a: waypoint + Owner: Neutral + Location: 84,35 + WormholeSpawn9a: waypoint + Owner: Neutral + Location: 50,86 + Actor467: camera + Owner: Nod + Location: 14,12 + NodCamera5: camera + Owner: Nod + Location: 24,12 + NodCamera6: camera + Owner: Nod + Location: 33,12 + NodCamera1: camera + Owner: Nod + Location: 13,72 + NodCamera2: camera + Owner: Nod + Location: 17,86 + NodCamera3: camera + Owner: Nod + Location: 25,85 + Actor472: bggy + Owner: Nod + Facing: 0 + Location: 4,42 + Actor473: bggy + Owner: Nod + Facing: 0 + Location: 5,42 + Actor474: bggy + Owner: Nod + Facing: 0 + Location: 4,43 + Actor475: bggy + Owner: Nod + Facing: 0 + Location: 5,43 + Actor476: ltnk + Owner: Nod + Facing: 0 + Location: 7,42 + Actor477: ltnk + Owner: Nod + Facing: 0 + Location: 9,42 + Actor478: ltnk + Owner: Nod + Facing: 0 + Location: 11,42 + Actor479: ftnk + Owner: Nod + Facing: 0 + Location: 8,43 + Actor480: ftnk + Owner: Nod + Facing: 0 + Location: 10,43 + Actor481: bike + Owner: Nod + Facing: 0 + Location: 13,42 + Actor482: bike + Owner: Nod + Facing: 0 + Location: 14,42 + Actor483: bike + Owner: Nod + Facing: 0 + Location: 13,43 + Actor484: bike + Owner: Nod + Facing: 0 + Location: 14,43 + Actor489: n3 + Owner: Nod + SubCell: 1 + Facing: 0 + Location: 7,46 + Actor490: n3 + Owner: Nod + SubCell: 2 + Facing: 0 + Location: 7,46 + Actor491: n3 + Owner: Nod + SubCell: 4 + Facing: 0 + Location: 7,46 + Actor492: n3 + Owner: Nod + SubCell: 5 + Facing: 0 + Location: 7,46 + Actor493: n3 + Owner: Nod + SubCell: 1 + Facing: 0 + Location: 11,46 + Actor494: n3 + Owner: Nod + SubCell: 2 + Facing: 0 + Location: 11,46 + Actor495: n3 + Owner: Nod + SubCell: 4 + Facing: 0 + Location: 11,46 + Actor496: n3 + Owner: Nod + SubCell: 5 + Facing: 0 + Location: 11,46 + Actor468: n1 + Owner: Nod + SubCell: 1 + Facing: 0 + Location: 7,44 + Actor469: n1 + Owner: Nod + SubCell: 2 + Facing: 0 + Location: 7,44 + Actor470: n1 + Owner: Nod + SubCell: 4 + Facing: 0 + Location: 7,44 + Actor471: n1 + Owner: Nod + SubCell: 5 + Facing: 0 + Location: 7,44 + Actor485: n1 + Owner: Nod + SubCell: 1 + Facing: 0 + Location: 9,44 + Actor486: n1 + Owner: Nod + SubCell: 2 + Facing: 0 + Location: 9,44 + Actor487: n1 + Owner: Nod + SubCell: 4 + Facing: 0 + Location: 9,44 + Actor488: n1 + Owner: Nod + SubCell: 5 + Facing: 0 + Location: 9,44 + Actor497: n1 + Owner: Nod + SubCell: 1 + Facing: 0 + Location: 11,44 + Actor498: n1 + Owner: Nod + SubCell: 2 + Facing: 0 + Location: 11,44 + Actor499: n1 + Owner: Nod + SubCell: 4 + Facing: 0 + Location: 11,44 + Actor500: n1 + Owner: Nod + SubCell: 5 + Facing: 0 + Location: 11,44 + Actor501: n4 + Owner: Nod + SubCell: 1 + Facing: 0 + Location: 9,46 + Actor502: n4 + Owner: Nod + SubCell: 2 + Facing: 0 + Location: 9,46 + Actor503: n4 + Owner: Nod + SubCell: 4 + Facing: 0 + Location: 9,46 + Actor504: n4 + Owner: Nod + SubCell: 5 + Facing: 0 + Location: 9,46 + Actor505: mech + Owner: Nod + SubCell: 1 + Location: 9,48 + Facing: 0 + Actor506: mech + Owner: Nod + SubCell: 2 + Location: 9,48 + Facing: 0 + Actor507: mech + Owner: Nod + SubCell: 4 + Location: 9,48 + Facing: 0 + Actor508: mech + Owner: Nod + SubCell: 5 + Location: 9,48 + Facing: 0 + Actor509: airs + Owner: Nod + Location: 9,37 + Actor510: oilb + Owner: Nod + Location: 26,37 + Actor511: oilb + Owner: Neutral + Location: 38,3 + Actor512: oilb + Owner: Neutral + Location: 34,66 + Actor513: oilb + Owner: Neutral + Location: 48,67 + Actor514: oilb + Owner: Neutral + Location: 62,88 + Actor515: oilb + Owner: Neutral + Location: 85,43 + Actor516: oilb + Owner: Neutral + Location: 79,8 + Actor517: v26 + Owner: Neutral + Location: 82,9 + Actor518: v20 + Owner: Neutral + Location: 90,6 + Actor519: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 45,48 + Actor522: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 46,47 + Actor523: s3 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 46,47 + Actor521: s1 + Owner: Scrin + SubCell: 3 + Facing: 229 + Location: 55,49 + Actor525: s1 + Owner: Scrin + SubCell: 3 + Facing: 285 + Location: 55,51 + Actor526: s1 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 55,49 + Actor527: s2 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 55,51 + Actor524: oilb + Owner: Neutral + Location: 66,54 + Actor528: intl + Owner: Scrin + Location: 48,60 + Facing: 23 + Actor529: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 49,61 + Actor530: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 46,62 + Actor531: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 47,61 + Actor532: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 45,61 + Actor465: s4 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 64,55 + Actor533: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 64,54 + Actor534: gscr + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 45,33 + Actor535: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 41,35 + Actor536: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 44,32 + Actor537: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 42,33 + Actor538: s3 + Owner: Scrin + Facing: 384 + Location: 43,32 + SubCell: 3 + Actor539: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 70,64 + Actor540: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 68,44 + Actor541: s3 + Owner: Scrin + Facing: 384 + Location: 70,46 + SubCell: 3 + Actor542: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 39,87 + Actor543: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 40,86 + Actor544: seek + Owner: Scrin + Facing: 384 + Location: 41,87 + Actor545: seek + Owner: Scrin + Facing: 384 + Location: 40,89 + Actor546: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 39,89 + Actor547: s3 + Owner: Scrin + Facing: 384 + Location: 40,87 + SubCell: 3 + Actor548: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 54,81 + Actor549: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 55,80 + Actor551: devo + Owner: Scrin + Facing: 384 + Location: 54,83 + Actor552: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 55,82 + Actor423: lchr + Owner: Scrin + Location: 54,69 + Facing: 507 + Actor424: lchr + Owner: Scrin + Facing: 384 + Location: 56,69 + Actor425: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 55,68 + Actor426: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 52,70 + Actor428: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 57,70 + Actor429: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 55,69 + Actor550: s1 + Owner: Scrin + Facing: 384 + Location: 53,69 + SubCell: 3 + Actor553: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 55,70 + Actor554: gunw + Owner: Scrin + Facing: 384 + Location: 63,74 + Actor555: gunw + Owner: Scrin + Facing: 384 + Location: 63,76 + Actor556: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 63,75 + Actor557: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 64,74 + Actor558: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 64,77 + Actor559: s1 + Owner: Scrin + Facing: 384 + Location: 62,74 + SubCell: 3 + Actor560: intl + Owner: Scrin + Location: 70,84 + Facing: 253 + Actor561: intl + Owner: Scrin + Location: 46,60 + Facing: 7 + Actor563: n6 + Owner: Nod + Location: 11,48 + SubCell: 1 + Facing: 0 + Actor564: n6 + Owner: Nod + Location: 11,48 + SubCell: 2 + Facing: 0 + Actor562: intl + Owner: Scrin + Location: 69,67 + Facing: 214 + Actor565: stcr + Owner: Scrin + Facing: 384 + Location: 86,39 + Actor566: stcr + Owner: Scrin + Facing: 261 + Location: 88,36 + Actor567: s4 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 87,40 + Actor568: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 89,37 + Actor569: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 87,39 + Actor570: s3 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 87,39 + Actor571: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 89,38 + Actor572: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 87,36 + Actor573: gscr + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 86,37 + Actor574: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 88,38 + Actor575: devo + Owner: Scrin + Facing: 384 + Location: 74,34 + Actor576: tpod + Owner: Scrin + Facing: 166 + Location: 76,31 + Actor577: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 74,33 + Actor578: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 76,34 + Actor579: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 74,32 + Actor580: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 77,32 + Actor581: s4 + Owner: Scrin + Facing: 384 + Location: 75,32 + SubCell: 3 + Actor582: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 74,31 + Actor583: seek + Owner: Scrin + Facing: 384 + Location: 76,33 + Actor584: gscr + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 87,29 + Actor585: s2 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 87,27 + Actor586: s2 + Owner: Scrin + Facing: 384 + Location: 87,27 + SubCell: 1 + Actor587: s2 + Owner: Scrin + SubCell: 3 + Location: 86,26 + Facing: 384 + Actor588: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 85,28 + Actor589: s1 + Owner: Scrin + Facing: 384 + Location: 87,28 + SubCell: 3 + Actor590: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 89,29 + Actor591: ruin + Owner: Scrin + Location: 64,25 + Facing: 586 + Actor592: ruin + Owner: Scrin + Location: 66,23 + Facing: 507 + Actor593: shrw + Owner: Scrin + Location: 66,25 + Facing: 523 + Actor594: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 65,24 + Actor595: s1 + Owner: Scrin + Facing: 384 + Location: 65,24 + SubCell: 1 + Actor596: s1 + Owner: Scrin + Facing: 384 + Location: 65,23 + SubCell: 3 + Actor597: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 63,26 + Actor598: s1 + Owner: Scrin + Facing: 384 + Location: 67,25 + SubCell: 3 + Actor599: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 66,24 + Actor600: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 62,25 + Actor601: gscr + Owner: Scrin + Facing: 384 + Location: 75,33 + SubCell: 3 + Actor602: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 57,14 + Actor603: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 58,14 + Actor604: s1 + Owner: Scrin + Facing: 384 + Location: 58,14 + SubCell: 1 + Actor605: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 57,13 + Actor606: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 57,15 + Actor607: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 59,15 + Actor608: s1 + Owner: Scrin + Facing: 384 + Location: 59,16 + SubCell: 3 + Actor609: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 59,14 + Actor610: s3 + Owner: Scrin + Facing: 384 + Location: 58,15 + SubCell: 3 + Actor611: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 61,5 + Actor612: s4 + Owner: Scrin + Facing: 384 + Location: 61,5 + SubCell: 1 + Actor613: s4 + Owner: Scrin + Facing: 384 + Location: 62,6 + SubCell: 3 + Actor614: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 62,7 + Actor615: s3 + Owner: Scrin + Facing: 384 + Location: 60,6 + SubCell: 3 + Actor616: seek + Owner: Scrin + Facing: 384 + Location: 63,5 + Actor617: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 72,9 + Actor618: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 73,11 + Actor619: devo + Owner: Scrin + Facing: 384 + Location: 73,10 + Actor622: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 75,10 + Actor623: s3 + Owner: Scrin + Facing: 384 + Location: 73,8 + SubCell: 3 + Actor624: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 70,8 + Actor620: intl + Owner: Scrin + Facing: 384 + Location: 72,8 + Actor621: intl + Owner: Scrin + Location: 65,56 + Facing: 198 + Actor625: intl + Owner: Scrin + Location: 68,85 + Facing: 245 + Actor626: tpod + Owner: Scrin + Facing: 384 + Location: 65,55 + Actor627: corr + Owner: Scrin + Facing: 214 + Location: 54,52 + Actor628: corr + Owner: Scrin + Facing: 261 + Location: 55,50 + WormholeSpawn1b: waypoint + Owner: Neutral + Location: 15,5 + WormholeSpawn1c: waypoint + Owner: Neutral + Location: 32,17 + WormholeSpawn2c: waypoint + Owner: Neutral + Location: 86,12 + WormholeSpawn2a: waypoint + Owner: Neutral + Location: 67,15 + WormholeSpawn3b: waypoint + Owner: Neutral + Location: 76,27 + WormholeSpawn3c: waypoint + Owner: Neutral + Location: 85,25 + WormholeSpawn8b: waypoint + Owner: Neutral + Location: 90,43 + WormholeSpawn8c: waypoint + Owner: Neutral + Location: 77,38 + WormholeSpawn4a: waypoint + Owner: Neutral + Location: 42,30 + WormholeSpawn4c: waypoint + Owner: Neutral + Location: 43,41 + WormholeSpawn5c: waypoint + Owner: Neutral + Location: 53,61 + WormholeSpawn6b: waypoint + Owner: Neutral + Location: 50,70 + WormholeSpawn6c: waypoint + Owner: Neutral + Location: 62,78 + WormholeSpawn9b: waypoint + Owner: Neutral + Location: 59,90 + WormholeSpawn9c: waypoint + Owner: Neutral + Location: 44,80 + WormholeSpawn7b: waypoint + Owner: Neutral + Location: 24,70 + WormholeSpawn7c: waypoint + Owner: Neutral + Location: 16,90 + TopBoundary: waypoint + Owner: Neutral + Location: 42,10 + BottomBoundary: waypoint + Owner: Neutral + Location: 32,83 + TopTownCenter: waypoint + Owner: Neutral + Location: 16,15 + BottomTownCenter: waypoint + Owner: Neutral + Location: 21,85 + WormholeSpawn7d: waypoint + Owner: Neutral + Location: 11,76 + WormholeSpawn4e: waypoint + Owner: Neutral + Location: 40,60 + WormholeSpawn5b: waypoint + Owner: Neutral + Location: 58,44 + WormholeSpawn7e: waypoint + Owner: Neutral + Location: 35,70 + WormholeSpawn1d: waypoint + Owner: Neutral + Location: 6,10 + WormholeSpawn2d: waypoint + Owner: Neutral + Location: 64,6 + WormholeSpawn4d: waypoint + Owner: Neutral + Location: 30,54 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-covenants.yaml, salvation-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/main-campaign/ca09-salvation/n_scrinportal.aud b/mods/ca/missions/main-campaign/ca09-salvation/n_scrinportal.aud new file mode 100644 index 0000000000..924a290700 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca09-salvation/n_scrinportal.aud differ diff --git a/mods/ca/missions/main-campaign/ca09-salvation/salvation-rules.yaml b/mods/ca/missions/main-campaign/ca09-salvation/salvation-rules.yaml new file mode 100644 index 0000000000..c71043576c --- /dev/null +++ b/mods/ca/missions/main-campaign/ca09-salvation/salvation-rules.yaml @@ -0,0 +1,158 @@ +^Palettes: + TintPostProcessEffect: + +World: + LuaScript: + Scripts: campaign.lua, salvation.lua + MissionData: + Briefing: The visitors, the Scrin, have taken control of a peninsula that is home to many innocent people, in order to seed it with Tiberium.\n\nThese peoples' cries for help have been predictably ignored. The Brotherhood is their only hope. Their homes, and indeed their lives, are in our hands.\n\nTake a detachment and liberate the peninsula. Show these people that after having been forsaken by all others, the Brotherhood of Nod will protect them, and in turn I am certain that many of them will join our cause.\n\nAs the Scrin control the Tiberium fields here, you will need to take control of the oil derricks here to fund your efforts. + MapOptions: + ShortGameCheckboxEnabled: False + TechLevel: medium + MusicPlaylist: + StartingMusic: chrg226m + +Player: + PlayerResources: + DefaultCash: 0 + +# Enable subfaction specific tech + +BH: + Buildable: + Prerequisites: anyradar + +# Disable tech + +SAPC: + Inherits@CAMPAIGNDISABLED: ^Disabled + +AMCV: + Inherits@CAMPAIGNDISABLED: ^Disabled + +MLRS: + Inherits@CAMPAIGNDISABLED: ^Disabled + +RMBO: + Inherits@CAMPAIGNDISABLED: ^Disabled + +ENLI: + Inherits@CAMPAIGNDISABLED: ^Disabled + +RMBC: + Inherits@CAMPAIGNDISABLED: ^Disabled + +# Disable powers + +HQ: + -SpawnActorPowerCA@sathack: + -SpawnActorPowerCA@sathacklegion: + +# Misc + +tibcore.upgrade: + -AnnounceOnCreation: + +HOSP: + -GrantConditionOnPrerequisite@OwnedByAi: + -PeriodicProducerCA@MEDIC: + -PeriodicProducerCA@REJUVENATOR: + -GrantConditionIfOwnerIsNeutral: + -GrantConditionOnPrerequisite@SCRIN: + -RallyPoint: + TooltipExtras: + Description: When controlled, heals nearby infantry. + -TooltipDescription@ally: + -TooltipDescription@other: + +HOSP.Rebuilt: + -PeriodicProducerCA@MEDIC: + -PeriodicProducerCA@REJUVENATOR: + +S1: + AutoTarget: + ScanRadius: 7 + +S2: + AutoTarget: + ScanRadius: 7 + +S3: + AutoTarget: + ScanRadius: 7 + +S4: + AutoTarget: + ScanRadius: 7 + +GUNW: + AutoTarget: + ScanRadius: 7 + +SHRW: + AutoTarget: + ScanRadius: 7 + +SEEK: + AutoTarget: + ScanRadius: 7 + +LACE: + AutoTarget: + ScanRadius: 7 + +CORR: + AutoTarget: + ScanRadius: 7 + +LCHR: + AutoTarget: + ScanRadius: 7 + +DEVO: + AutoTarget: + ScanRadius: 7 + +ATMZ: + AutoTarget: + ScanRadius: 7 + +INTL: + AutoTarget: + ScanRadius: 7 + +GSCR: + AutoTarget: + ScanRadius: 7 + +STCR: + AutoTarget: + ScanRadius: 7 + +TPOD: + AutoTarget: + ScanRadius: 7 + +RTPD: + AutoTarget: + ScanRadius: 7 + +WORMHOLE: + MustBeDestroyed: + RequiredForShortGame: true + Health: + HP: 100000 + +OILB: + CashTrickler: + Interval: 375 + Amount: 200 + +# Hunt() requires only 1 AttackBase +DEVA: + -AttackFrontalCharged: + -Armament@PRIMARYUPG: + -AmbientSound@CHARGE: + -WithIdleOverlay@CHARGE1: + -WithIdleOverlay@CHARGE2: + -WithIdleOverlay@CHARGE3: diff --git a/mods/ca/missions/main-campaign/ca09-salvation/salvation.lua b/mods/ca/missions/main-campaign/ca09-salvation/salvation.lua new file mode 100644 index 0000000000..49beccea78 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca09-salvation/salvation.lua @@ -0,0 +1,327 @@ +MissionDir = "ca|missions/main-campaign/ca09-salvation" + +Wormholes = { + { Locations = { WormholeSpawn1a.Location, WormholeSpawn1b.Location, WormholeSpawn1c.Location, WormholeSpawn1d.Location }, Actor = nil, SpawnCount = 0, Phase = 1 }, + { Locations = { WormholeSpawn4a.Location, WormholeSpawn4b.Location, WormholeSpawn4c.Location, WormholeSpawn4d.Location, WormholeSpawn4e.Location }, Actor = nil, SpawnCount = 0, Phase = 1 }, + { Locations = { WormholeSpawn7a.Location, WormholeSpawn7b.Location, WormholeSpawn7c.Location, WormholeSpawn7d.Location, WormholeSpawn7e.Location }, Actor = nil, SpawnCount = 0, Phase = 1 }, + + { Locations = { WormholeSpawn9a.Location, WormholeSpawn9b.Location, WormholeSpawn9c.Location }, Actor = nil, SpawnCount = 0, Phase = 2 }, -- Bottom outer + { Locations = { WormholeSpawn5a.Location, WormholeSpawn5b.Location, WormholeSpawn5c.Location }, Actor = nil, SpawnCount = 0, Phase = 2 }, -- Center main + { Locations = { WormholeSpawn2a.Location, WormholeSpawn2b.Location, WormholeSpawn2c.Location, WormholeSpawn2d.Location }, Actor = nil, SpawnCount = 0, Phase = 2 }, -- North-east corner + + { Locations = { WormholeSpawn3a.Location, WormholeSpawn3b.Location, WormholeSpawn3c.Location }, Actor = nil, SpawnCount = 0, Phase = 3 }, -- North-east inner + { Locations = { WormholeSpawn6a.Location, WormholeSpawn6b.Location, WormholeSpawn6c.Location }, Actor = nil, SpawnCount = 0, Phase = 3 }, -- Bottom inner + { Locations = { WormholeSpawn8a.Location, WormholeSpawn8b.Location, WormholeSpawn8c.Location }, Actor = nil, SpawnCount = 0, Phase = 3 }, -- Far east + +} + +WormholeDelay = { + easy = DateTime.Minutes(6), + normal = DateTime.Minutes(5) + DateTime.Seconds(30), + hard = DateTime.Minutes(5), + vhard = DateTime.Minutes(4) + DateTime.Seconds(30), + brutal = DateTime.Minutes(4) +} + +WormholeInterval = { + easy = DateTime.Minutes(1) + DateTime.Seconds(40), + normal = DateTime.Minutes(1) + DateTime.Seconds(30), + hard = DateTime.Minutes(1) + DateTime.Seconds(20), + vhard = DateTime.Minutes(1) + DateTime.Seconds(10), + brutal = DateTime.Minutes(1), +} + +WormholeUnitsDelay = { + easy = DateTime.Seconds(70), + normal = DateTime.Seconds(50), + hard = DateTime.Seconds(35), + vhard = DateTime.Seconds(30), + brutal = DateTime.Seconds(25) +} + +WormholeUnitsInterval = { + easy = DateTime.Seconds(140), + normal = DateTime.Seconds(120), + hard = DateTime.Seconds(100), + vhard = DateTime.Seconds(80), + brutal = DateTime.Seconds(60) +} + +Phase2Start = { + easy = DateTime.Minutes(13), + normal = DateTime.Minutes(11), + hard = DateTime.Minutes(9), + vhard = DateTime.Minutes(8), + brutal = DateTime.Minutes(7) +} + +Phase3Start = { + easy = DateTime.Minutes(16), + normal = DateTime.Minutes(14), + hard = DateTime.Minutes(12), + vhard = DateTime.Minutes(11), + brutal = DateTime.Minutes(10) +} + +WormholeUnitGroups = { + { "seek", "seek", "gscr", "gscr", "s3", "s3", "s3", "s1" }, + { "intl", "intl", "gscr", "gscr", "s3", "s3", "s4", "s1" }, + { "corr", "corr", "gscr", "gscr", "s2", "s2", "s1", "s1" }, + { "lchr", "lchr", "gscr", "gscr", "s2", "s2", "s1", "s1" }, + { "tpod", "devo", "gscr", "gscr", "s3", "s3", "s3", "s1" }, + { "gunw", "atmz", "gscr", "gscr", "s3", "s3", "s3", "s4" }, + { "ruin", "shrw", "gscr", "gscr", "s1", "s1", "s2", "s2" }, + { "gunw", "gunw", "gscr", "gscr", "s1", "s1", "s2", "s2" }, +} + +-- Setup and Tick + +SetupPlayers = function() + Nod = Player.GetPlayer("Nod") + Scrin = Player.GetPlayer("Scrin") + Civilian = Player.GetPlayer("Civilian") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = { Nod } + MissionEnemies = { Scrin } +end + +WorldLoaded = function() + SetupPlayers() + + TimerTicks = 0 + Camera.Position = PlayerStart.CenterPosition + + InitObjectives(Nod) + InitScrin() + + ObjectivePurgeScrin = Nod.AddObjective("Eliminate the Scrin presence.") + ObjectiveSaveAllCivilians = Nod.AddSecondaryObjective("Allow no civilians to be killed.") + Notification("The Scrin are preparing reinforcements, we must eliminate their foothold here quickly.") + + NodCamera1.Destroy() + NodCamera2.Destroy() + NodCamera3.Destroy() + NodCamera4.Destroy() + NodCamera5.Destroy() + NodCamera6.Destroy() + + Utils.Do(MissionPlayers, function(p) + Actor.Create("tibcore.upgrade", true, { Owner = p }) + + if Difficulty == "easy" then + p.Cash = 4800 + elseif Difficulty == "normal" then + p.Cash = 2300 + end + end) + + Trigger.AfterDelay(WormholeDelay[Difficulty], function() + SpawnWormhole() + end) + + local scrinActors = Scrin.GetActors() + local scrinRemaining = Utils.Where(scrinActors, function(a) + return not a.IsDead and a.HasProperty("Kill") + end) + + Utils.Do(scrinRemaining, function(a) + Trigger.OnKilled(a, function(self, killer) + UpdateScrinCounter() + end) + end) + + local civilianActors = Civilian.GetActors() + Utils.Do(civilianActors, function(a) + Trigger.OnKilled(a, function(self, killer) + if ObjectiveSaveAllCivilians ~= nil and not Nod.IsObjectiveCompleted(ObjectiveSaveAllCivilians) then + Nod.MarkFailedObjective(ObjectiveSaveAllCivilians) + end + end) + end) + + Trigger.OnEnteredProximityTrigger(TopBoundary.CenterPosition, WDist.New(5 * 1024), function(a, id) + if a.Owner == Civilian and a.HasProperty("Move") then + a.Stop() + a.Move(TopTownCenter.Location) + end + end) + + Trigger.OnEnteredProximityTrigger(BottomBoundary.CenterPosition, WDist.New(5 * 1024), function(a, id) + if a.Owner == Civilian and a.HasProperty("Move") then + a.Stop() + a.Move(BottomTownCenter.Location) + end + end) + + UpdateScrinCounter() + AfterWorldLoaded() +end + +Tick = function() + OncePerSecondChecks() + OncePerFiveSecondChecks() + AfterTick() +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + Scrin.Resources = Scrin.ResourceCapacity - 500 + + if TimerTicks > 0 then + if TimerTicks > 25 then + TimerTicks = TimerTicks - 25 + else + TimerTicks = 0 + end + end + + if Scrin.HasNoRequiredUnits() then + if ObjectivePurgeScrin ~= nil and not Nod.IsObjectiveCompleted(ObjectivePurgeScrin) then + Nod.MarkCompletedObjective(ObjectivePurgeScrin) + end + if ObjectiveSaveAllCivilians ~= nil and not Nod.IsObjectiveFailed(ObjectiveSaveAllCivilians) then + Nod.MarkCompletedObjective(ObjectiveSaveAllCivilians) + end + end + + if MissionPlayersHaveNoRequiredUnits() then + if ObjectivePurgeScrin ~= nil and not Nod.IsObjectiveCompleted(ObjectivePurgeScrin) then + Nod.MarkFailedObjective(ObjectivePurgeScrin) + end + end + end +end + +OncePerFiveSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 125 == 0 then + UpdatePlayerBaseLocations() + end +end + +InitScrin = function() + AutoRepairAndRebuildBuildings(Scrin, 15) + SetupRefAndSilosCaptureCredits(Scrin) + + local scrinGroundAttackers = Scrin.GetGroundAttackers() + + Utils.Do(scrinGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsScrinGroundHunterUnit) + end) +end + +SpawnWormhole = function() + ShuffleInPlace(Wormholes) + + local dormantWormholes = Utils.Where(Wormholes, function(w) + return + (w.Actor == nil or w.Actor.IsDead) + and ((w.Phase == 1 and DateTime.GameTime < Phase2Start[Difficulty]) + or (w.Phase == 2 and DateTime.GameTime >= Phase2Start[Difficulty] and DateTime.GameTime < Phase3Start[Difficulty]) + or (w.Phase == 3 and DateTime.GameTime >= Phase3Start[Difficulty]) + or DateTime.GameTime > DateTime.Minutes(25)) + end) + + if #dormantWormholes > 0 then + local randomDormantWormhole = Utils.Random(dormantWormholes) + local randomLocation = Utils.Random(randomDormantWormhole.Locations) + + randomDormantWormhole.Actor = Actor.Create("wormhole", true, { Owner = Scrin, Location = randomLocation }) + randomDormantWormhole.SpawnCount = 0 + local camera = Actor.Create("smallcamera", true, { Owner = Nod, Location = randomLocation }) + Beacon.New(Nod, randomDormantWormhole.Actor.CenterPosition) + Notification("Scrin portal detected. Destroy it before Scrin reinforcements arrive.") + MediaCA.PlaySound(MissionDir .. "/n_scrinportal.aud", 2) + + UpdateScrinCounter() + + Trigger.AfterDelay(DateTime.Seconds(10), function() + camera.Destroy() + end) + + Trigger.OnKilled(randomDormantWormhole.Actor, function(self, killer) + UpdateScrinCounter() + end) + + -- Begin spawning units + Trigger.AfterDelay(WormholeUnitsDelay[Difficulty], function() + SpawnWormholeUnits(randomDormantWormhole) + end) + + -- Wormhole is active, spawn another after interval + Trigger.AfterDelay(WormholeInterval[Difficulty], function() + SpawnWormhole() + end) + + -- If there aren't any dormant wormholes, try again every 10 seconds + else + Trigger.AfterDelay(DateTime.Seconds(10), function() + SpawnWormhole() + end) + end +end + +SpawnWormholeUnits = function(wormhole) + + if wormhole.Actor == nil or wormhole.Actor.IsDead then + return + end + + local unitTypes = Utils.Random(WormholeUnitGroups) + local units = Reinforcements.Reinforce(Scrin, unitTypes, { wormhole.Actor.Location }, 15) + + Utils.Do(units, function(a) + -- If units have been spawned already, send this group to attack + if wormhole.SpawnCount > 0 then + AssaultPlayerBaseOrHunt(a) + + -- Otherwise scatter + else + Trigger.AfterDelay(135, function() + if not a.IsDead then + a.Scatter() + end + end) + Trigger.AfterDelay(160, function() + if not a.IsDead then + a.Scatter() + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsScrinGroundHunterUnit) + end + end) + end + + Trigger.OnKilled(a, function(self, killer) + UpdateScrinCounter() + end) + end) + + Trigger.AfterDelay(135, function() + UpdateScrinCounter() + end) + + wormhole.SpawnCount = wormhole.SpawnCount + 1 + + -- Continue spawning units + Trigger.AfterDelay(WormholeUnitsDelay[Difficulty], function() + SpawnWormholeUnits(wormhole) + end) +end + +ShuffleInPlace = function(t) + for i = #t, 2, -1 do + local j = Utils.RandomInteger(1, i) + t[i], t[j] = t[j], t[i] + end +end + +UpdateScrinCounter = function() + Trigger.AfterDelay(1, function() + local scrinActors = Scrin.GetActors() + local scrinRemaining = Utils.Where(scrinActors, function(a) + return not a.IsDead and a.HasProperty("Kill") and not string.match(a.Type, "husk") + end) + + UserInterface.SetMissionText("Scrin remaining: " .. #scrinRemaining, HSLColor.Yellow) + end) +end diff --git a/mods/ca/missions/main-campaign/ca10-zenith/map.bin b/mods/ca/missions/main-campaign/ca10-zenith/map.bin new file mode 100644 index 0000000000..6a8bcf900a Binary files /dev/null and b/mods/ca/missions/main-campaign/ca10-zenith/map.bin differ diff --git a/mods/ca/missions/main-campaign/ca10-zenith/map.png b/mods/ca/missions/main-campaign/ca10-zenith/map.png new file mode 100644 index 0000000000..86b6b971b8 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca10-zenith/map.png differ diff --git a/mods/ca/missions/main-campaign/ca10-zenith/map.yaml b/mods/ca/missions/main-campaign/ca10-zenith/map.yaml new file mode 100644 index 0000000000..700df2fee2 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca10-zenith/map.yaml @@ -0,0 +1,4455 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 10: Zenith + +Author: Darkademic + +Tileset: SNOW + +MapSize: 114,114 + +Bounds: 1,1,112,112 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: Nod, USSR, USSRUnits + PlayerReference@Nod: + Name: Nod + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: nod + LockColor: True + Color: FE1100 + LockSpawn: True + LockTeam: True + Enemies: USSR, USSRUnits, Creeps + PlayerReference@USSR: + Name: USSR + Bot: campaign + Faction: soviet + Color: 994050 + Allies: USSRUnits + Enemies: Nod, Creeps + PlayerReference@USSRUnits: + Name: USSRUnits + Bot: campaign + Faction: soviet + Color: 994050 + Allies: USSR + Enemies: Nod, Creeps + +Actors: + Airfield2: afld + Owner: USSR + Location: 72,21 + Airfield3: afld + Owner: USSR + Location: 72,24 + Actor18: sam + Owner: USSR + Location: 54,25 + Actor19: sam + Owner: USSR + Location: 60,25 + Actor24: sam + Owner: USSR + Location: 57,27 + Airfield4: afld + Owner: USSR + Location: 72,27 + Actor30: brik + Owner: USSR + Location: 55,28 + Actor31: brik + Owner: USSR + Location: 56,28 + Actor32: brik + Owner: USSR + Location: 57,28 + Actor33: brik + Owner: USSR + Location: 58,28 + Actor34: brik + Owner: USSR + Location: 59,28 + Actor35: brik + Owner: USSR + Location: 60,28 + Actor38: brik + Owner: USSR + Location: 55,29 + Actor39: barb + Owner: USSR + Location: 56,29 + Actor40: barb + Owner: USSR + Location: 57,29 + Actor41: barb + Owner: USSR + Location: 58,29 + Actor42: barb + Owner: USSR + Location: 59,29 + Actor43: brik + Owner: USSR + Location: 60,29 + Actor45: brik + Owner: USSR + Location: 55,30 + Actor46: barb + Owner: USSR + Location: 56,30 + NukeSilo1: mslo + Owner: USSR + Location: 57,30 + Actor48: barb + Owner: USSR + Location: 59,30 + Actor49: brik + Owner: USSR + Location: 60,30 + Airfield5: afld + Owner: USSR + Location: 72,30 + Actor54: brik + Owner: USSR + Location: 55,31 + Actor55: barb + Owner: USSR + Location: 56,31 + Actor56: barb + Owner: USSR + Location: 57,31 + Actor57: barb + Owner: USSR + Location: 58,31 + Actor58: barb + Owner: USSR + Location: 59,31 + Actor59: brik + Owner: USSR + Location: 60,31 + Actor61: sam + Owner: USSR + Location: 51,32 + Actor62: brik + Owner: USSR + Location: 55,32 + Actor63: barb + Owner: USSR + Location: 56,32 + NukeSilo2: mslo + Owner: USSR + Location: 57,32 + Actor65: barb + Owner: USSR + Location: 59,32 + Actor66: brik + Owner: USSR + Location: 60,32 + Actor69: brik + Owner: USSR + Location: 55,33 + Actor70: barb + Owner: USSR + Location: 56,33 + Actor71: barb + Owner: USSR + Location: 57,33 + Actor72: barb + Owner: USSR + Location: 58,33 + Actor73: barb + Owner: USSR + Location: 59,33 + Actor74: brik + Owner: USSR + Location: 60,33 + Helipad1: hpad + Owner: USSR + Location: 77,33 + Helipad2: hpad + Owner: USSR + Location: 80,33 + Helipad3: hpad + Owner: USSR + Location: 83,33 + Actor82: brik + Owner: USSR + Location: 55,34 + Actor83: barb + Owner: USSR + Location: 56,34 + NukeSilo3: mslo + Owner: USSR + Location: 57,34 + Actor85: barb + Owner: USSR + Location: 59,34 + Actor86: brik + Owner: USSR + Location: 60,34 + Actor87: tsla + Owner: USSR + Location: 61,34 + Actor88: sam + Owner: USSR + Location: 67,34 + Actor91: brik + Owner: USSR + Location: 55,35 + Actor92: barb + Owner: USSR + Location: 56,35 + Actor93: barb + Owner: USSR + Location: 57,35 + Actor94: barb + Owner: USSR + Location: 58,35 + Actor95: barb + Owner: USSR + Location: 59,35 + Actor96: brik + Owner: USSR + Location: 60,35 + Actor99: brik + Owner: USSR + Location: 55,36 + Actor100: barb + Owner: USSR + Location: 56,36 + NukeSilo4: mslo + Owner: USSR + Location: 57,36 + Actor102: barb + Owner: USSR + Location: 59,36 + Actor103: brik + Owner: USSR + Location: 60,36 + Actor104: brik + Owner: USSR + Location: 64,36 + Actor105: brik + Owner: USSR + Location: 65,36 + Actor106: brik + Owner: USSR + Location: 66,36 + Actor107: brik + Owner: USSR + Location: 32,37 + Actor113: brik + Owner: USSR + Location: 55,37 + Actor114: barb + Owner: USSR + Location: 56,37 + Actor115: barb + Owner: USSR + Location: 57,37 + Actor116: barb + Owner: USSR + Location: 58,37 + Actor117: barb + Owner: USSR + Location: 59,37 + Actor118: brik + Owner: USSR + Location: 60,37 + Actor119: brik + Owner: USSR + Location: 63,37 + Actor120: brik + Owner: USSR + Location: 64,37 + Actor121: brik + Owner: USSR + Location: 66,37 + Actor122: brik + Owner: USSR + Location: 67,37 + Actor123: brik + Owner: USSR + Location: 68,37 + Actor124: brik + Owner: USSR + Location: 69,37 + OuterSAM10: sam + Owner: USSR + Location: 76,37 + Actor126: brik + Owner: USSR + Location: 32,38 + Actor132: brik + Owner: USSR + Location: 55,38 + Actor133: sam + Owner: USSR + Location: 56,38 + Actor134: sam + Owner: USSR + Location: 58,38 + Actor135: brik + Owner: USSR + Location: 60,38 + Actor136: brik + Owner: USSR + Location: 63,38 + Actor137: brik + Owner: USSR + Location: 64,38 + Actor138: brik + Owner: USSR + Location: 69,38 + Actor139: brik + Owner: USSR + Location: 32,39 + Actor140: brik + Owner: USSR + Location: 33,39 + Actor141: brik + Owner: USSR + Location: 34,39 + Actor142: brik + Owner: USSR + Location: 35,39 + Actor143: brik + Owner: USSR + Location: 36,39 + Actor144: brik + Owner: USSR + Location: 37,39 + Actor146: brik + Owner: USSR + Location: 55,39 + Actor147: brik + Owner: USSR + Location: 56,39 + Actor148: brik + Owner: USSR + Location: 59,39 + Actor149: brik + Owner: USSR + Location: 60,39 + Actor150: brik + Owner: USSR + Location: 69,39 + Actor151: brik + Owner: USSR + Location: 70,39 + Actor152: brik + Owner: USSR + Location: 37,40 + Actor153: brik + Owner: USSR + Location: 38,40 + Actor154: brik + Owner: USSR + Location: 39,40 + Actor155: brik + Owner: USSR + Location: 40,40 + Actor158: brik + Owner: USSR + Location: 55,40 + Actor159: brik + Owner: USSR + Location: 56,40 + Actor160: brik + Owner: USSR + Location: 59,40 + Actor161: brik + Owner: USSR + Location: 60,40 + Actor162: brik + Owner: USSR + Location: 70,40 + Actor163: ftur + Owner: USSR + Location: 56,41 + Actor164: ftur + Owner: USSR + Location: 59,41 + Actor165: brik + Owner: USSR + Location: 70,41 + Actor166: brik + Owner: USSR + Location: 34,42 + Actor167: brik + Owner: USSR + Location: 35,42 + Actor168: brik + Owner: USSR + Location: 36,42 + Actor169: tsla + Owner: USSR + Location: 54,42 + Actor170: brik + Owner: USSR + Location: 70,42 + SubPen1: spen + Owner: USSR + Location: 17,43 + Actor173: brik + Owner: USSR + Location: 34,43 + Actor174: brik + Owner: USSR + Location: 36,43 + Actor175: brik + Owner: USSR + Location: 37,43 + Actor176: brik + Owner: USSR + Location: 38,43 + Actor177: brik + Owner: USSR + Location: 39,43 + Actor178: brik + Owner: USSR + Location: 40,43 + Actor179: brik + Owner: USSR + Location: 41,43 + Actor180: brik + Owner: USSR + Location: 42,43 + Actor181: brik + Owner: USSR + Location: 43,43 + Actor182: brik + Owner: USSR + Location: 44,43 + Actor183: brik + Owner: USSR + Location: 45,43 + Actor184: brik + Owner: USSR + Location: 46,43 + Actor185: brik + Owner: USSR + Location: 47,43 + Actor186: fact + Owner: USSR + Location: 62,43 + Actor187: brik + Owner: USSR + Location: 70,43 + Actor188: brik + Owner: USSR + Location: 71,43 + SubPen2: spen + Owner: USSR + Location: 92,43 + Actor192: brik + Owner: USSR + Location: 46,44 + Actor193: brik + Owner: USSR + Location: 47,44 + Actor194: sam + Owner: USSR + Location: 58,44 + Actor195: brik + Owner: USSR + Location: 71,44 + Actor196: brik + Owner: USSR + Location: 33,45 + Actor197: brik + Owner: USSR + Location: 71,45 + Actor198: brik + Owner: USSR + Location: 31,46 + Actor199: brik + Owner: USSR + Location: 32,46 + Actor200: brik + Owner: USSR + Location: 33,46 + Actor201: brik + Owner: USSR + Location: 69,46 + Actor202: brik + Owner: USSR + Location: 70,46 + Actor203: brik + Owner: USSR + Location: 71,46 + Actor204: brik + Owner: USSR + Location: 30,47 + Actor205: brik + Owner: USSR + Location: 31,47 + Actor206: brik + Owner: USSR + Location: 33,47 + Actor207: brik + Owner: USSR + Location: 34,47 + Actor208: brik + Owner: USSR + Location: 35,47 + Actor209: brik + Owner: USSR + Location: 36,47 + Actor210: brik + Owner: USSR + Location: 37,47 + Actor211: brik + Owner: USSR + Location: 38,47 + Actor212: brik + Owner: USSR + Location: 69,47 + Actor213: brik + Owner: USSR + Location: 30,48 + Actor214: brik + Owner: USSR + Location: 31,48 + Actor215: brik + Owner: USSR + Location: 32,48 + Actor216: brik + Owner: USSR + Location: 33,48 + Actor217: brik + Owner: USSR + Location: 38,48 + Actor218: brik + Owner: USSR + Location: 39,48 + Actor219: brik + Owner: USSR + Location: 42,48 + Actor220: brik + Owner: USSR + Location: 43,48 + Actor221: brik + Owner: USSR + Location: 47,48 + Actor222: brik + Owner: USSR + Location: 48,48 + Actor223: brik + Owner: USSR + Location: 50,48 + Actor224: brik + Owner: USSR + Location: 51,48 + Actor225: brik + Owner: USSR + Location: 68,48 + Actor226: brik + Owner: USSR + Location: 69,48 + Actor227: brik + Owner: USSR + Location: 38,49 + Actor228: brik + Owner: USSR + Location: 39,49 + Actor229: brik + Owner: USSR + Location: 40,49 + Actor230: brik + Owner: USSR + Location: 42,49 + Actor231: brik + Owner: USSR + Location: 43,49 + Actor232: brik + Owner: USSR + Location: 47,49 + Actor233: brik + Owner: USSR + Location: 48,49 + Actor234: brik + Owner: USSR + Location: 49,49 + Actor235: brik + Owner: USSR + Location: 50,49 + Actor236: brik + Owner: USSR + Location: 51,49 + Actor237: brik + Owner: USSR + Location: 68,49 + Actor238: brik + Owner: USSR + Location: 40,50 + Actor239: brik + Owner: USSR + Location: 41,50 + Actor240: brik + Owner: USSR + Location: 42,50 + Actor241: brik + Owner: USSR + Location: 68,50 + Actor242: brik + Owner: USSR + Location: 42,51 + Actor243: brik + Owner: USSR + Location: 68,51 + Actor244: brik + Owner: USSR + Location: 42,52 + Actor245: brik + Owner: USSR + Location: 68,52 + Actor246: brik + Owner: USSR + Location: 42,53 + Actor247: brik + Owner: USSR + Location: 43,53 + Actor248: brik + Owner: USSR + Location: 44,53 + Actor249: brik + Owner: USSR + Location: 45,53 + Actor250: brik + Owner: USSR + Location: 60,53 + Actor251: brik + Owner: USSR + Location: 61,53 + Actor252: tsla + Owner: USSR + Location: 62,53 + Actor253: brik + Owner: USSR + Location: 63,53 + Actor254: brik + Owner: USSR + Location: 64,53 + Actor255: brik + Owner: USSR + Location: 67,53 + Actor256: brik + Owner: USSR + Location: 68,53 + Actor257: brik + Owner: USSR + Location: 45,54 + Actor258: brik + Owner: USSR + Location: 59,54 + Actor259: brik + Owner: USSR + Location: 60,54 + Actor260: brik + Owner: USSR + Location: 61,54 + Actor261: brik + Owner: USSR + Location: 62,54 + Actor262: brik + Owner: USSR + Location: 63,54 + Actor263: brik + Owner: USSR + Location: 64,54 + Actor264: brik + Owner: USSR + Location: 67,54 + Actor265: brik + Owner: USSR + Location: 68,54 + Actor266: brik + Owner: USSR + Location: 45,55 + Actor267: brik + Owner: USSR + Location: 58,55 + Actor268: brik + Owner: USSR + Location: 59,55 + Actor269: brik + Owner: USSR + Location: 45,56 + Actor270: brik + Owner: USSR + Location: 58,56 + Actor271: brik + Owner: USSR + Location: 45,57 + Actor272: brik + Owner: USSR + Location: 58,57 + Actor273: brik + Owner: USSR + Location: 45,58 + Actor274: brik + Owner: USSR + Location: 57,58 + Actor275: brik + Owner: USSR + Location: 58,58 + Actor276: brik + Owner: USSR + Location: 45,59 + Actor277: brik + Owner: USSR + Location: 46,59 + Actor278: brik + Owner: USSR + Location: 47,59 + Actor279: brik + Owner: USSR + Location: 56,59 + Actor280: brik + Owner: USSR + Location: 57,59 + Actor281: brik + Owner: USSR + Location: 58,59 + Actor282: brik + Owner: USSR + Location: 47,60 + Actor283: brik + Owner: USSR + Location: 48,60 + Actor284: brik + Owner: USSR + Location: 49,60 + Actor285: brik + Owner: USSR + Location: 52,60 + Actor286: brik + Owner: USSR + Location: 53,60 + Actor287: brik + Owner: USSR + Location: 54,60 + Actor288: brik + Owner: USSR + Location: 55,60 + Actor289: brik + Owner: USSR + Location: 56,60 + Actor290: brik + Owner: USSR + Location: 19,61 + Actor291: brik + Owner: USSR + Location: 20,61 + Actor292: brik + Owner: USSR + Location: 49,61 + Actor293: tsla + Owner: USSR + Location: 50,61 + Actor294: tsla + Owner: USSR + Location: 51,61 + Actor295: brik + Owner: USSR + Location: 52,61 + Actor296: brik + Owner: USSR + Location: 19,62 + Actor297: brik + Owner: USSR + Location: 20,62 + Actor298: brik + Owner: USSR + Location: 49,62 + Actor299: brik + Owner: USSR + Location: 50,62 + Actor300: brik + Owner: USSR + Location: 51,62 + Actor301: brik + Owner: USSR + Location: 52,62 + Actor302: brik + Owner: USSR + Location: 19,63 + Actor303: brik + Owner: USSR + Location: 77,63 + Actor304: brik + Owner: USSR + Location: 78,63 + Actor305: brik + Owner: USSR + Location: 19,64 + Actor306: brik + Owner: USSR + Location: 20,64 + Actor307: brik + Owner: USSR + Location: 76,64 + Actor308: brik + Owner: USSR + Location: 77,64 + Actor309: brik + Owner: USSR + Location: 78,64 + Actor310: brik + Owner: USSR + Location: 20,65 + OuterTesla1: tsla + Owner: USSR + Location: 21,65 + Actor313: brik + Owner: USSR + Location: 71,65 + Actor314: brik + Owner: USSR + Location: 72,65 + Actor315: brik + Owner: USSR + Location: 73,65 + Actor316: brik + Owner: USSR + Location: 74,65 + Actor317: brik + Owner: USSR + Location: 75,65 + Actor318: brik + Owner: USSR + Location: 76,65 + Actor319: brik + Owner: USSR + Location: 86,65 + Actor320: brik + Owner: USSR + Location: 87,65 + Actor321: brik + Owner: USSR + Location: 20,66 + Actor322: brik + Owner: USSR + Location: 21,66 + Actor323: brik + Owner: USSR + Location: 25,66 + Actor324: brik + Owner: USSR + Location: 26,66 + OuterTesla8: tsla + Owner: USSR + Location: 67,66 + Actor326: brik + Owner: USSR + Location: 71,66 + Actor327: brik + Owner: USSR + Location: 85,66 + Actor328: brik + Owner: USSR + Location: 86,66 + Actor329: brik + Owner: USSR + Location: 87,66 + Actor330: brik + Owner: USSR + Location: 20,67 + Actor331: brik + Owner: USSR + Location: 21,67 + Actor332: brik + Owner: USSR + Location: 25,67 + Actor333: brik + Owner: USSR + Location: 26,67 + Actor334: brik + Owner: USSR + Location: 70,67 + Actor335: brik + Owner: USSR + Location: 71,67 + Actor336: brik + Owner: USSR + Location: 85,67 + Actor337: brik + Owner: USSR + Location: 70,68 + Actor338: brik + Owner: USSR + Location: 71,68 + Actor339: brik + Owner: USSR + Location: 84,68 + Actor340: brik + Owner: USSR + Location: 85,68 + Actor341: brik + Owner: USSR + Location: 70,69 + Actor342: brik + Owner: USSR + Location: 71,69 + Actor343: brik + Owner: USSR + Location: 84,69 + Actor344: brik + Owner: USSR + Location: 76,70 + Actor345: brik + Owner: USSR + Location: 77,70 + Actor346: brik + Owner: USSR + Location: 78,70 + Actor347: brik + Owner: USSR + Location: 79,70 + Actor348: brik + Owner: USSR + Location: 80,70 + Actor349: brik + Owner: USSR + Location: 81,70 + Actor350: brik + Owner: USSR + Location: 82,70 + Actor351: brik + Owner: USSR + Location: 83,70 + Actor352: brik + Owner: USSR + Location: 84,70 + Actor353: brik + Owner: USSR + Location: 76,71 + Actor354: brik + Owner: USSR + Location: 73,72 + Actor355: brik + Owner: USSR + Location: 74,72 + OuterTesla9: tsla + Owner: USSR + Location: 75,72 + Actor357: brik + Owner: USSR + Location: 76,72 + Actor358: brik + Owner: USSR + Location: 73,73 + Actor359: brik + Owner: USSR + Location: 74,73 + Actor360: brik + Owner: USSR + Location: 75,73 + Actor361: brik + Owner: USSR + Location: 76,73 + Actor362: oilb + Owner: Neutral + Location: 93,95 + Actor363: t15 + Owner: Neutral + Location: 95,94 + Actor364: t03 + Owner: Neutral + Location: 91,97 + Actor366: barl + Owner: Creeps + Location: 92,95 + Actor367: brl3 + Owner: Creeps + Location: 92,96 + Actor368: barl + Owner: Creeps + Location: 91,96 + Actor369: spen.nod + Owner: Nod + Location: 22,94 + Actor372: gun.nod + Owner: Nod + Location: 30,98 + TurretFacing: 0 + Actor373: gun.nod + Owner: Nod + Location: 47,100 + TurretFacing: 71 + Actor374: gun.nod + Owner: Nod + Location: 55,99 + TurretFacing: 943 + Actor375: gun.nod + Owner: Nod + Location: 62,102 + TurretFacing: 793 + Actor376: gun.nod + Owner: Nod + Location: 13,98 + TurretFacing: 911 + Actor379: brik + Owner: Nod + Location: 17,100 + Actor380: brik + Owner: Nod + Location: 17,101 + Actor381: brik + Owner: Nod + Location: 17,102 + Actor382: brik + Owner: Nod + Location: 17,103 + Actor383: brik + Owner: Nod + Location: 18,100 + Actor384: brik + Owner: Nod + Location: 19,100 + Actor385: brik + Owner: Nod + Location: 20,100 + Actor386: brik + Owner: Nod + Location: 21,100 + Actor387: brik + Owner: Nod + Location: 22,100 + Actor388: brik + Owner: Nod + Location: 23,100 + Actor390: brik + Owner: Nod + Location: 24,100 + Actor393: brik + Owner: Nod + Location: 24,101 + Actor391: brik + Owner: Nod + Location: 33,100 + Actor392: brik + Owner: Nod + Location: 33,101 + Actor395: brik + Owner: Nod + Location: 34,100 + Actor396: brik + Owner: Nod + Location: 34,101 + Actor397: brik + Owner: Nod + Location: 35,100 + Actor398: brik + Owner: Nod + Location: 36,100 + Actor399: brik + Owner: Nod + Location: 37,100 + Actor400: brik + Owner: Nod + Location: 37,101 + Actor401: brik + Owner: Nod + Location: 37,102 + Actor402: brik + Owner: Nod + Location: 37,103 + Actor409: brik + Owner: Nod + Location: 36,112 + Actor411: brik + Owner: Nod + Location: 37,111 + Actor412: brik + Owner: Nod + Location: 37,112 + Actor413: brik + Owner: Nod + Location: 35,112 + Actor414: brik + Owner: Nod + Location: 33,112 + Actor415: brik + Owner: Nod + Location: 34,112 + Actor416: brik + Owner: Nod + Location: 17,112 + Actor417: brik + Owner: Nod + Location: 32,112 + Actor418: brik + Owner: Nod + Location: 30,112 + Actor419: brik + Owner: Nod + Location: 29,112 + Actor420: brik + Owner: Nod + Location: 31,112 + Actor421: brik + Owner: Nod + Location: 19,112 + Actor422: brik + Owner: Nod + Location: 18,112 + Actor423: brik + Owner: Nod + Location: 17,111 + Actor424: brik + Owner: Nod + Location: 17,110 + Actor425: brik + Owner: Nod + Location: 17,109 + Actor426: brik + Owner: Nod + Location: 18,109 + Actor427: brik + Owner: Nod + Location: 18,110 + Actor428: brik + Owner: Nod + Location: 18,103 + Actor429: brik + Owner: Nod + Location: 18,102 + Actor430: brik + Owner: Nod + Location: 21,112 + Actor431: brik + Owner: Nod + Location: 20,112 + Actor432: brik + Owner: Nod + Location: 23,112 + Actor433: brik + Owner: Nod + Location: 22,112 + Actor434: brik + Owner: Nod + Location: 24,112 + Actor435: brik + Owner: Nod + Location: 25,112 + Actor436: brik + Owner: Nod + Location: 26,112 + Actor437: brik + Owner: Nod + Location: 27,112 + Actor438: brik + Owner: Nod + Location: 28,112 + Actor444: hand + Owner: Nod + Location: 33,103 + Actor449: split2 + Owner: Neutral + Location: 6,102 + Actor450: split2 + Owner: Neutral + Location: 10,108 + Actor455: nsam + Owner: Nod + Location: 35,101 + Actor456: nsam + Owner: Nod + Location: 18,101 + Actor480: split2 + Owner: Neutral + Location: 54,108 + Actor481: tc04 + Owner: Neutral + Location: 61,108 + Actor482: t16 + Owner: Neutral + Location: 61,105 + Actor488: ss2 + Owner: Nod + Location: 22,92 + Facing: 0 + Actor489: ss2 + Owner: Nod + Location: 30,93 + Facing: 919 + Actor490: sb + Owner: Nod + Location: 35,95 + Facing: 880 + Actor491: brl3 + Owner: Creeps + Location: 7,73 + Actor492: t03 + Owner: Neutral + Location: 8,72 + Actor493: t12 + Owner: Neutral + Location: 8,76 + Actor494: oilb + Owner: Neutral + Location: 8,79 + Actor495: barl + Owner: Creeps + Location: 8,81 + Actor496: brl3 + Owner: Creeps + Location: 7,82 + Actor497: oilb + Location: 102,10 + Faction: england + Owner: USSR + Actor498: oilb + Location: 98,10 + Faction: england + Owner: USSR + Actor499: t10 + Owner: Neutral + Location: 95,11 + Actor500: brl3 + Owner: Creeps + Location: 101,11 + Actor501: brl3 + Owner: Creeps + Location: 105,10 + Actor502: barl + Owner: Creeps + Location: 104,10 + Actor503: barl + Owner: Creeps + Location: 101,12 + Actor504: barl + Owner: Creeps + Location: 97,11 + Actor505: t01 + Owner: Neutral + Location: 99,12 + Actor506: t02 + Owner: Neutral + Location: 104,7 + Actor507: brik + Owner: USSR + Location: 32,36 + Actor508: brik + Owner: USSR + Location: 32,35 + Actor509: brik + Owner: USSR + Location: 32,34 + Actor510: brik + Owner: USSR + Location: 32,33 + Actor511: brik + Owner: USSR + Location: 33,33 + Actor512: brik + Owner: USSR + Location: 33,34 + Actor513: brik + Owner: USSR + Location: 33,29 + Actor514: brik + Owner: USSR + Location: 32,29 + Actor515: brik + Owner: USSR + Location: 32,28 + Actor516: brik + Owner: USSR + Location: 33,28 + Actor517: brik + Owner: USSR + Location: 32,27 + Actor528: brik + Owner: USSR + Location: 36,23 + Actor529: brik + Owner: USSR + Location: 35,23 + Actor530: brik + Owner: USSR + Location: 34,23 + Actor531: brik + Owner: USSR + Location: 33,23 + Actor532: brik + Owner: USSR + Location: 32,23 + Actor533: brik + Owner: USSR + Location: 32,24 + Actor534: brik + Owner: USSR + Location: 32,25 + Actor535: brik + Owner: USSR + Location: 32,26 + Actor564: fenc + Owner: USSR + Location: 36,78 + Actor565: fenc + Owner: USSR + Location: 37,78 + Actor566: fenc + Owner: USSR + Location: 38,78 + Actor567: fenc + Owner: USSR + Location: 35,78 + Actor568: fenc + Owner: USSR + Location: 44,79 + Actor569: fenc + Owner: USSR + Location: 45,79 + Actor570: fenc + Owner: USSR + Location: 46,79 + Actor571: fenc + Owner: USSR + Location: 52,78 + Actor572: fenc + Owner: USSR + Location: 52,79 + Actor573: fenc + Owner: USSR + Location: 52,80 + Actor574: fenc + Owner: USSR + Location: 53,80 + Actor575: fenc + Owner: USSR + Location: 53,81 + Actor576: fenc + Owner: USSR + Location: 55,81 + Actor577: fenc + Owner: USSR + Location: 54,81 + Actor578: fenc + Owner: USSR + Location: 30,74 + Actor579: fenc + Owner: USSR + Location: 31,74 + Actor580: fenc + Owner: USSR + Location: 32,74 + Actor581: fenc + Owner: USSR + Location: 38,72 + Actor582: fenc + Owner: USSR + Location: 38,73 + Actor585: apwr + Owner: USSR + Location: 63,40 + Actor588: brik + Owner: USSR + Location: 80,22 + Actor589: brik + Owner: USSR + Location: 81,22 + Actor590: brik + Owner: USSR + Location: 80,23 + Actor591: brik + Owner: USSR + Location: 81,23 + Actor592: brik + Owner: USSR + Location: 81,24 + Actor593: brik + Owner: USSR + Location: 81,25 + Actor594: brik + Owner: USSR + Location: 81,26 + Actor595: brik + Owner: USSR + Location: 80,26 + Actor596: brik + Owner: USSR + Location: 80,25 + Actor597: brik + Owner: USSR + Location: 87,38 + Actor598: brik + Owner: USSR + Location: 88,38 + Actor599: brik + Owner: USSR + Location: 87,37 + Actor600: brik + Owner: USSR + Location: 88,37 + Actor601: brik + Owner: USSR + Location: 88,36 + Actor602: brik + Owner: USSR + Location: 88,35 + Actor603: brik + Owner: USSR + Location: 87,35 + Actor604: brik + Owner: USSR + Location: 87,34 + Actor605: brik + Owner: USSR + Location: 87,33 + Actor606: brik + Owner: USSR + Location: 87,32 + Actor607: brik + Owner: USSR + Location: 87,31 + Actor609: brik + Owner: USSR + Location: 85,30 + Actor610: brik + Owner: USSR + Location: 86,30 + Actor611: brik + Owner: USSR + Location: 84,30 + Actor612: brik + Owner: USSR + Location: 86,31 + Actor608: brik + Owner: USSR + Location: 83,30 + Actor613: brik + Owner: USSR + Location: 83,31 + Actor614: brik + Owner: USSR + Location: 84,31 + Actor615: ftur + Owner: USSR + Location: 82,24 + Actor616: ftur + Owner: USSR + Location: 85,29 + OuterTesla13: tsla + Owner: USSR + Location: 85,31 + OuterTesla14: tsla + Owner: USSR + Location: 80,24 + OuterTesla12: tsla + Owner: USSR + Location: 87,36 + OuterTesla15: tsla + Owner: USSR + Location: 33,35 + OuterTesla16: tsla + Owner: USSR + Location: 33,27 + Actor624: ftur + Owner: USSR + Location: 31,33 + Actor625: ftur + Owner: USSR + Location: 31,29 + Actor622: ftur + Owner: USSR + Location: 64,55 + Actor623: ftur + Owner: USSR + Location: 67,55 + Actor626: ftur + Owner: USSR + Location: 70,70 + Actor627: ftur + Owner: USSR + Location: 72,73 + Actor628: ftur + Owner: USSR + Location: 21,68 + Actor629: ftur + Owner: USSR + Location: 25,68 + Actor630: brik + Owner: USSR + Location: 26,65 + Actor631: brik + Owner: USSR + Location: 26,64 + Actor632: brik + Owner: USSR + Location: 25,64 + Actor633: brik + Owner: USSR + Location: 25,63 + Actor634: brik + Owner: USSR + Location: 26,63 + OuterTesla2: tsla + Owner: USSR + Location: 25,65 + Actor638: apwr + Owner: USSR + Location: 52,57 + Actor639: apwr + Owner: USSR + Location: 48,57 + Actor636: stek + Owner: USSR + Location: 48,44 + Actor642: fix + Owner: USSR + Location: 77,28 + Actor643: barr + Owner: USSR + Location: 81,66 + Actor644: apwr + Owner: USSR + Location: 43,44 + Actor645: apwr + Owner: USSR + Location: 40,44 + Actor646: apwr + Owner: USSR + Location: 37,44 + Actor647: apwr + Owner: USSR + Location: 34,44 + Actor648: brik + Owner: USSR + Location: 33,44 + Actor649: brik + Owner: USSR + Location: 33,43 + Actor650: brik + Owner: USSR + Location: 35,43 + Actor651: tsla + Owner: USSR + Location: 32,47 + Actor652: tsla + Owner: USSR + Location: 49,48 + Actor653: tsla + Owner: USSR + Location: 41,49 + Actor641: fix + Owner: USSR + Location: 79,46 + Actor658: kenn + Owner: USSR + Location: 78,67 + Actor661: barr + Owner: USSR + Location: 56,51 + Actor662: ftur + Owner: USSR + Location: 43,50 + Actor663: ftur + Owner: USSR + Location: 49,50 + Actor664: ftur + Owner: USSR + Location: 75,51 + Actor665: brik + Owner: USSR + Location: 32,65 + Actor666: brik + Owner: USSR + Location: 32,66 + Actor667: brik + Owner: USSR + Location: 33,65 + Actor668: brik + Owner: USSR + Location: 33,66 + Actor669: brik + Owner: USSR + Location: 34,66 + Actor670: brik + Owner: USSR + Location: 35,66 + Actor671: brik + Owner: USSR + Location: 36,66 + Actor672: brik + Owner: USSR + Location: 36,65 + Actor673: brik + Owner: USSR + Location: 35,65 + Actor674: brik + Owner: USSR + Location: 35,64 + Actor675: brik + Owner: USSR + Location: 34,64 + Actor676: brik + Owner: USSR + Location: 33,64 + Actor677: brik + Owner: USSR + Location: 47,71 + Actor678: brik + Owner: USSR + Location: 48,71 + Actor679: brik + Owner: USSR + Location: 49,71 + Actor680: brik + Owner: USSR + Location: 50,71 + Actor681: brik + Owner: USSR + Location: 47,70 + Actor682: brik + Owner: USSR + Location: 48,70 + Actor683: brik + Owner: USSR + Location: 50,70 + Actor684: brik + Owner: USSR + Location: 51,70 + Actor685: brik + Owner: USSR + Location: 51,71 + Actor686: brik + Owner: USSR + Location: 48,69 + Actor687: brik + Owner: USSR + Location: 49,69 + Actor688: brik + Owner: USSR + Location: 50,69 + Actor689: brik + Owner: USSR + Location: 60,76 + Actor690: brik + Owner: USSR + Location: 60,75 + Actor691: brik + Owner: USSR + Location: 61,76 + Actor692: brik + Owner: USSR + Location: 61,75 + Actor693: brik + Owner: USSR + Location: 62,76 + Actor694: brik + Owner: USSR + Location: 63,76 + Actor695: brik + Owner: USSR + Location: 64,76 + Actor696: brik + Owner: USSR + Location: 64,75 + Actor697: brik + Owner: USSR + Location: 63,75 + Actor698: brik + Owner: USSR + Location: 61,74 + Actor699: brik + Owner: USSR + Location: 62,74 + Actor700: brik + Owner: USSR + Location: 63,74 + Actor701: brik + Owner: USSR + Location: 42,59 + Actor702: brik + Owner: USSR + Location: 41,59 + Actor703: brik + Owner: USSR + Location: 40,59 + Actor704: brik + Owner: USSR + Location: 39,59 + Actor705: brik + Owner: USSR + Location: 42,60 + Actor706: brik + Owner: USSR + Location: 41,60 + Actor707: brik + Owner: USSR + Location: 39,60 + Actor708: brik + Owner: USSR + Location: 38,59 + Actor709: brik + Owner: USSR + Location: 38,60 + Actor710: brik + Owner: USSR + Location: 39,61 + Actor711: brik + Owner: USSR + Location: 40,61 + Actor712: brik + Owner: USSR + Location: 41,61 + OuterTesla3: tsla + Owner: USSR + Location: 34,65 + OuterTesla4: tsla + Owner: USSR + Location: 40,60 + OuterTesla5: tsla + Owner: USSR + Location: 49,70 + OuterTesla6: tsla + Owner: USSR + Location: 62,75 + Actor717: ftur + Owner: USSR + Location: 38,58 + Actor724: brik + Owner: USSR + Location: 63,70 + Actor725: brik + Owner: USSR + Location: 64,70 + Actor726: brik + Owner: USSR + Location: 63,69 + Actor727: brik + Owner: USSR + Location: 63,71 + Actor728: brik + Owner: USSR + Location: 64,71 + Actor729: brik + Owner: USSR + Location: 63,68 + Actor730: brik + Owner: USSR + Location: 63,67 + Actor731: brik + Owner: USSR + Location: 64,67 + Actor732: brik + Owner: USSR + Location: 64,68 + OuterTesla7: tsla + Owner: USSR + Location: 64,69 + Actor734: ftur + Owner: USSR + Location: 62,69 + Actor736: silo + Owner: USSR + Location: 29,52 + Actor737: silo + Owner: USSR + Location: 29,53 + Actor738: silo + Owner: USSR + Location: 30,53 + Actor739: silo + Owner: USSR + Location: 30,52 + Actor740: silo + Owner: USSR + Location: 31,52 + Actor741: silo + Owner: USSR + Location: 31,53 + Actor742: chain + Owner: USSR + Location: 28,51 + Actor743: chain + Owner: USSR + Location: 28,52 + Actor744: chain + Owner: USSR + Location: 28,53 + Actor745: chain + Owner: USSR + Location: 28,54 + Actor746: chain + Owner: USSR + Location: 29,54 + Actor747: chain + Owner: USSR + Location: 29,51 + Actor748: chain + Owner: USSR + Location: 30,51 + Actor749: chain + Owner: USSR + Location: 30,51 + Actor750: chain + Owner: USSR + Location: 31,51 + Actor751: chain + Owner: USSR + Location: 32,51 + Actor752: chain + Owner: USSR + Location: 32,52 + Actor753: chain + Owner: USSR + Location: 32,53 + Actor754: chain + Owner: USSR + Location: 32,54 + Actor755: chain + Owner: USSR + Location: 31,54 + Actor718: ftur + Owner: USSR + Location: 49,65 + Airfield1: afld + Owner: USSR + Location: 72,18 + OuterSAM11: sam + Owner: USSR + Location: 69,17 + Actor721: tc04 + Owner: Neutral + Location: 66,23 + Actor722: tc05 + Owner: Neutral + Location: 62,21 + Actor723: tc01 + Owner: Neutral + Location: 66,30 + Actor735: tc02 + Owner: Neutral + Location: 65,26 + Actor756: t17 + Owner: Neutral + Location: 65,24 + Actor757: t14 + Owner: Neutral + Location: 66,25 + Actor758: t07 + Owner: Neutral + Location: 67,27 + Actor759: t16 + Owner: Neutral + Location: 66,28 + Actor760: t13 + Owner: Neutral + Location: 66,29 + Actor761: t07 + Owner: Neutral + Location: 65,23 + Actor762: tc01 + Owner: Neutral + Location: 66,21 + Actor763: tc02 + Owner: Neutral + Location: 65,20 + Actor764: tc04 + Owner: Neutral + Location: 60,19 + Actor765: t14 + Owner: Neutral + Location: 60,21 + Actor766: t15 + Owner: Neutral + Location: 62,19 + Actor767: t11 + Owner: Neutral + Location: 64,18 + Actor768: t16 + Owner: Neutral + Location: 64,20 + Actor769: tc01 + Owner: Neutral + Location: 63,17 + Actor770: tc02 + Owner: Neutral + Location: 63,15 + Actor771: t12 + Owner: Neutral + Location: 62,16 + Actor772: t02 + Owner: Neutral + Location: 61,17 + Actor773: t05 + Owner: Neutral + Location: 59,13 + Actor774: t02 + Owner: Neutral + Location: 61,15 + Actor775: t01 + Owner: Neutral + Location: 61,13 + Actor776: t10 + Owner: Neutral + Location: 62,14 + Actor777: t13 + Owner: Neutral + Location: 60,18 + Actor778: t17 + Owner: Neutral + Location: 62,17 + Actor779: tc05 + Owner: Neutral + Location: 51,13 + Actor780: t05 + Owner: Neutral + Location: 54,16 + Actor781: t07 + Owner: Neutral + Location: 53,20 + Actor782: tc01 + Owner: Neutral + Location: 57,23 + Actor783: t16 + Owner: Neutral + Location: 57,21 + Actor784: t17 + Owner: Neutral + Location: 56,22 + Actor785: t01 + Owner: Neutral + Location: 57,16 + Actor786: t11 + Owner: Neutral + Location: 56,20 + Actor787: t12 + Owner: Neutral + Location: 57,18 + Actor788: t14 + Owner: Neutral + Location: 53,19 + Actor789: tc02 + Owner: Neutral + Location: 49,15 + Actor791: tc01 + Owner: Neutral + Location: 31,21 + Actor792: tc05 + Owner: Neutral + Location: 29,23 + Actor793: t10 + Owner: Neutral + Location: 30,22 + Actor794: t07 + Owner: Neutral + Location: 31,25 + Actor795: t13 + Owner: Neutral + Location: 20,24 + Actor796: tc03 + Owner: Neutral + Location: 24,43 + Actor797: tc02 + Owner: Neutral + Location: 30,40 + Actor798: t11 + Owner: Neutral + Location: 27,42 + Actor799: tc04 + Owner: Neutral + Location: 23,37 + Actor800: t14 + Owner: Neutral + Location: 24,35 + Actor801: t17 + Owner: Neutral + Location: 26,37 + Actor802: t11 + Owner: Neutral + Location: 25,26 + Actor803: t10 + Owner: Neutral + Location: 24,19 + Actor805: tc03 + Owner: Neutral + Location: 28,18 + Actor808: t02 + Owner: Neutral + Location: 28,35 + Actor810: tc01 + Owner: Neutral + Location: 49,19 + Actor811: t15 + Owner: Neutral + Location: 78,58 + Actor812: t12 + Owner: Neutral + Location: 86,60 + Actor813: t02 + Owner: Neutral + Location: 86,56 + Actor814: t01 + Owner: Neutral + Location: 88,50 + Actor815: t14 + Owner: Neutral + Location: 70,61 + Actor816: t14 + Owner: Neutral + Location: 63,60 + Actor817: tc04 + Owner: Neutral + Location: 66,59 + Actor818: t07 + Owner: Neutral + Location: 72,57 + Actor819: t02 + Owner: Neutral + Location: 87,51 + Actor820: t06 + Owner: Neutral + Location: 87,44 + Actor821: weap + Owner: USSR + Location: 77,42 + Actor822: weap + Owner: USSR + Location: 81,42 + Actor823: brik + Owner: USSR + Location: 76,41 + Actor824: brik + Owner: USSR + Location: 76,42 + Actor825: brik + Owner: USSR + Location: 76,44 + Actor826: brik + Owner: USSR + Location: 76,43 + Actor827: brik + Owner: USSR + Location: 77,41 + Actor828: brik + Owner: USSR + Location: 79,41 + Actor829: brik + Owner: USSR + Location: 78,41 + Actor830: brik + Owner: USSR + Location: 80,41 + Actor831: brik + Owner: USSR + Location: 81,41 + Actor832: brik + Owner: USSR + Location: 82,41 + Actor833: brik + Owner: USSR + Location: 83,41 + Actor834: brik + Owner: USSR + Location: 84,41 + Actor835: brik + Owner: USSR + Location: 84,42 + Actor836: brik + Owner: USSR + Location: 84,43 + Actor837: brik + Owner: USSR + Location: 84,44 + Actor838: brik + Owner: USSR + Location: 84,45 + Actor839: brik + Owner: USSR + Location: 76,45 + Actor840: brik + Owner: USSR + Location: 75,45 + Actor841: brik + Owner: USSR + Location: 75,44 + Actor842: brik + Owner: USSR + Location: 85,45 + Actor843: brik + Owner: USSR + Location: 85,44 + Actor844: brik + Owner: USSR + Location: 81,53 + Actor845: brik + Owner: USSR + Location: 81,54 + Actor846: brik + Owner: USSR + Location: 82,54 + Actor847: brik + Owner: USSR + Location: 83,54 + Actor848: brik + Owner: USSR + Location: 83,53 + Actor849: brik + Owner: USSR + Location: 83,52 + Actor850: brik + Owner: USSR + Location: 82,52 + Actor851: brik + Owner: USSR + Location: 81,52 + OuterTesla11: tsla + Owner: USSR + Location: 82,53 + OuterSAM7: sam + Owner: USSR + Location: 86,59 + OuterSAM6: sam + Owner: USSR + Location: 72,66 + OuterSAM4: sam + Owner: USSR + Location: 66,82 + OuterSAM9: sam + Owner: USSR + Location: 88,47 + OuterSAM2: sam + Owner: USSR + Location: 41,71 + OuterSAM1: sam + Owner: USSR + Location: 29,64 + Actor859: sam + Owner: USSR + Location: 36,52 + Actor860: sam + Owner: USSR + Location: 39,47 + OuterSAM14: sam + Owner: USSR + Location: 38,39 + OuterSAM15: sam + Owner: USSR + Location: 33,24 + OuterSAM13: sam + Owner: USSR + Location: 33,38 + Actor865: sam + Owner: USSR + Location: 46,58 + Actor866: sam + Owner: USSR + Location: 56,57 + Actor867: sam + Owner: USSR + Location: 66,49 + Actor868: sam + Owner: USSR + Location: 44,52 + OuterSAM5: sam + Owner: USSR + Location: 71,77 + OuterSAM8: sam + Owner: USSR + Location: 74,59 + Actor871: apwr + Owner: USSR + Location: 66,38 + Actor874: brik + Owner: USSR + Location: 81,61 + Actor875: brik + Owner: USSR + Location: 82,61 + Actor876: brik + Owner: USSR + Location: 83,61 + Actor877: brik + Owner: USSR + Location: 81,62 + OuterTesla10: tsla + Owner: USSR + Location: 82,62 + Actor879: brik + Owner: USSR + Location: 83,62 + Actor880: brik + Owner: USSR + Location: 81,63 + Actor881: brik + Owner: USSR + Location: 82,63 + Actor882: brik + Owner: USSR + Location: 83,63 + OuterSAM3: sam + Owner: USSR + Location: 53,72 + PlayerStart: waypoint + Owner: Neutral + Location: 27,102 + Actor854: tpwr + Owner: USSR + Location: 59,49 + Actor855: tpwr + Owner: USSR + Location: 62,48 + Actor852: apwr + Owner: USSR + Location: 48,54 + Actor853: apwr + Owner: USSR + Location: 52,54 + Actor856: tpwr + Owner: USSR + Location: 53,45 + Actor857: dome + Owner: USSR + Location: 56,44 + OuterSAM12: sam + Owner: USSR + Location: 26,42 + Actor858: 3tnk + Owner: USSRUnits + Facing: 384 + Location: 44,76 + Actor861: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 43,76 + Actor862: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 45,77 + Actor863: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 47,78 + Actor864: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 39,76 + Actor869: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 35,77 + Actor870: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 38,74 + Actor878: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 33,74 + Actor883: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 50,77 + Actor888: e1 + Owner: USSRUnits + Facing: 384 + Location: 54,80 + SubCell: 4 + Actor884: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 53,79 + Actor889: e1 + Owner: USSRUnits + Facing: 384 + Location: 55,80 + SubCell: 4 + Actor885: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 54,79 + Actor886: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 49,76 + Actor887: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 41,75 + Actor893: e3 + Owner: USSRUnits + Facing: 384 + Location: 31,73 + SubCell: 4 + Actor890: e4 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 43,77 + Actor891: dog + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 44,77 + Actor892: shok + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 44,48 + Actor894: shok + Owner: USSRUnits + Facing: 384 + Location: 44,48 + SubCell: 1 + Actor895: shok + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 46,49 + Actor896: shok + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 46,47 + Actor897: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 20,37 + Actor898: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 23,42 + Actor899: e1 + Owner: USSRUnits + Facing: 384 + Location: 23,42 + SubCell: 1 + Actor900: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 22,40 + Actor901: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 21,35 + Actor902: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 22,27 + Actor903: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 23,25 + Actor904: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 22,67 + Actor905: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 24,68 + Actor906: e1 + Owner: USSRUnits + Facing: 384 + Location: 24,68 + SubCell: 1 + Actor907: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 21,69 + Actor908: e1 + Owner: USSRUnits + Facing: 384 + Location: 26,68 + SubCell: 3 + Actor909: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 22,65 + Actor910: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 24,60 + Actor911: e1 + Owner: USSRUnits + Facing: 384 + Location: 24,60 + SubCell: 1 + Actor912: e1 + Owner: USSRUnits + Facing: 384 + Location: 24,60 + SubCell: 2 + Actor913: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 23,58 + Actor914: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 27,61 + Actor915: e4 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 24,64 + Actor916: e4 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 36,64 + Actor917: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 35,63 + Actor918: e1 + Owner: USSRUnits + Facing: 384 + Location: 35,63 + SubCell: 1 + Actor919: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 39,62 + Actor920: e1 + Owner: USSRUnits + SubCell: 3 + Location: 37,66 + Facing: 384 + Actor921: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 46,64 + Actor922: e1 + Owner: USSRUnits + Facing: 384 + Location: 46,64 + SubCell: 1 + Actor923: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 45,63 + Actor924: e1 + Owner: USSRUnits + Facing: 384 + Location: 46,63 + SubCell: 3 + Actor925: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 46,65 + Actor926: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 45,70 + Actor927: e1 + Owner: USSRUnits + Facing: 384 + Location: 45,70 + SubCell: 1 + Actor928: e1 + Owner: USSRUnits + Facing: 384 + Location: 46,69 + SubCell: 3 + Actor929: e1 + Owner: USSRUnits + Facing: 384 + Location: 44,70 + SubCell: 3 + Actor930: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 61,68 + Actor931: e1 + Owner: USSRUnits + Facing: 384 + Location: 61,68 + SubCell: 1 + Actor932: e1 + Owner: USSRUnits + Facing: 384 + Location: 60,67 + SubCell: 3 + Actor933: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 61,71 + Actor934: e1 + Owner: USSRUnits + Facing: 384 + Location: 61,71 + SubCell: 1 + Actor935: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 72,71 + Actor936: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 73,70 + Actor937: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 72,69 + Actor938: e1 + Owner: USSRUnits + Facing: 384 + Location: 72,69 + SubCell: 1 + Actor939: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 74,71 + Actor940: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 71,75 + Actor941: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 71,78 + Actor942: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 67,78 + Actor943: e1 + Owner: USSRUnits + Facing: 384 + Location: 67,78 + SubCell: 1 + Actor944: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 66,76 + Actor945: e1 + Owner: USSRUnits + Facing: 384 + Location: 66,76 + SubCell: 1 + Actor946: e1 + Owner: USSRUnits + Facing: 384 + Location: 65,76 + SubCell: 3 + Actor947: e1 + Owner: USSRUnits + Facing: 384 + Location: 60,74 + SubCell: 3 + Actor948: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 81,69 + Actor949: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 80,68 + Actor950: e1 + Owner: USSRUnits + Facing: 384 + Location: 80,68 + SubCell: 1 + Actor951: e1 + Owner: USSRUnits + Facing: 384 + Location: 80,67 + SubCell: 3 + Actor952: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 80,66 + Actor953: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 83,66 + Actor954: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 79,69 + Actor955: barr + Owner: USSR + Location: 85,62 + Actor956: 4tnk + Owner: USSRUnits + Facing: 384 + Location: 70,72 + Actor957: 4tnk + Owner: USSRUnits + Facing: 777 + Location: 63,58 + Actor959: 4tnk + Owner: USSRUnits + Facing: 777 + Location: 63,60 + Actor958: ttnk + Owner: USSRUnits + Facing: 384 + Location: 75,68 + Actor960: katy + Owner: USSRUnits + Location: 66,80 + Facing: 174 + Actor961: btr.ai + Owner: USSRUnits + Location: 38,64 + Facing: 150 + Actor964: 3tnk + Owner: USSRUnits + Location: 29,27 + Facing: 253 + Actor963: 3tnk + Owner: USSRUnits + Facing: 253 + Location: 29,34 + Actor965: katy + Owner: USSRUnits + Location: 30,37 + Facing: 166 + Actor967: v2rl + Owner: USSRUnits + Location: 57,55 + Facing: 650 + Actor968: v2rl + Owner: USSRUnits + Location: 67,52 + Facing: 618 + Actor969: v2rl + Owner: USSRUnits + Location: 59,53 + Facing: 634 + Actor970: v2rl + Owner: USSRUnits + Facing: 384 + Location: 33,25 + Actor972: katy + Owner: USSRUnits + Location: 86,32 + Facing: 0 + Actor974: 3tnk + Owner: USSRUnits + Location: 81,28 + Facing: 904 + Actor977: ttra + Owner: USSRUnits + Location: 60,47 + Facing: 602 + Actor978: ttra + Owner: USSRUnits + Location: 57,49 + Facing: 642 + MADTank: qtnk + Owner: USSRUnits + Location: 82,58 + Facing: 523 + Actor979: btr.ai + Owner: USSRUnits + Facing: 384 + Location: 86,49 + Actor980: btr.ai + Owner: USSRUnits + Location: 75,48 + Facing: 634 + Actor981: btr.ai + Owner: USSRUnits + Facing: 384 + Location: 58,42 + Actor982: btr.ai + Owner: USSRUnits + Location: 51,44 + Facing: 523 + Actor983: 3tnk + Owner: USSRUnits + Location: 46,51 + Facing: 618 + Actor984: apoc + Owner: USSRUnits + Location: 51,51 + Facing: 642 + Actor985: v2rl + Owner: USSRUnits + Facing: 384 + Location: 77,65 + Actor986: 3tnk + Owner: USSRUnits + Location: 47,67 + Facing: 245 + Actor987: 3tnk + Owner: USSRUnits + Location: 49,67 + Facing: 245 + Actor988: 3tnk + Owner: USSRUnits + Facing: 384 + Location: 26,59 + Actor989: 3tnk + Owner: USSRUnits + Facing: 384 + Location: 25,58 + Actor990: 4tnk + Owner: USSRUnits + Facing: 384 + Location: 84,48 + Actor991: 4tnk + Owner: USSRUnits + Location: 77,48 + Facing: 626 + Actor992: v2rl + Owner: USSRUnits + Location: 76,46 + Facing: 602 + Actor993: 3tnk + Owner: USSRUnits + Facing: 384 + Location: 82,45 + Actor994: isu + Owner: USSRUnits + Facing: 384 + Location: 36,54 + Actor995: 3tnk + Owner: USSRUnits + Facing: 384 + Location: 37,55 + Actor996: ttnk + Owner: USSRUnits + Location: 81,30 + Facing: 896 + Actor997: 3tnk + Owner: USSRUnits + Location: 75,26 + Facing: 761 + Actor998: e1 + Owner: USSRUnits + SubCell: 3 + Location: 100,8 + Facing: 237 + Actor999: e1 + Owner: USSRUnits + SubCell: 3 + Location: 97,8 + Facing: 158 + Actor1000: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 36,55 + Actor1001: e1 + Owner: USSRUnits + Facing: 384 + Location: 36,55 + SubCell: 1 + Actor1002: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 34,54 + Actor1003: e1 + Owner: USSRUnits + Facing: 384 + Location: 37,55 + SubCell: 1 + Actor1004: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 39,56 + Actor1005: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 35,53 + Actor1006: e4 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 36,56 + Actor1007: e3 + Owner: USSRUnits + SubCell: 3 + Facing: 384 + Location: 39,55 + Actor1008: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 33,53 + Actor1009: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 40,62 + Actor1010: e3 + Owner: USSRUnits + Facing: 384 + Location: 46,64 + SubCell: 2 + Actor1011: e3 + Owner: USSRUnits + Facing: 384 + Location: 47,69 + SubCell: 3 + Actor1012: e3 + Owner: USSRUnits + Facing: 384 + Location: 61,70 + SubCell: 3 + Actor1013: e3 + Owner: USSRUnits + Facing: 384 + Location: 61,67 + SubCell: 3 + Actor1014: e3 + Owner: USSRUnits + Facing: 384 + Location: 66,77 + SubCell: 3 + Actor1015: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 71,76 + Actor1016: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 1 + Location: 71,76 + Actor1017: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 69,81 + Actor1018: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 57,81 + Actor1019: e3 + Owner: USSRUnits + Facing: 384 + Location: 81,69 + SubCell: 1 + Actor1020: e3 + Owner: USSRUnits + Facing: 384 + Location: 80,68 + SubCell: 2 + Actor1021: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 83,67 + Actor1022: e3 + Owner: USSRUnits + Facing: 384 + Location: 84,66 + SubCell: 3 + Actor1023: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 84,64 + Actor1024: e3 + Owner: USSRUnits + Facing: 384 + Location: 76,48 + SubCell: 3 + Actor1025: e3 + Owner: USSRUnits + Facing: 384 + Location: 76,48 + SubCell: 1 + Actor1026: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 78,46 + Actor1027: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 84,46 + Actor1028: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 86,48 + Actor1029: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 89,48 + Actor1030: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 73,48 + Actor1031: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 63,55 + Actor1032: e3 + Owner: USSRUnits + Facing: 384 + Location: 63,55 + SubCell: 1 + Actor1033: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 61,59 + Actor1034: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 62,61 + Actor1035: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 64,63 + Actor1036: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 69,62 + Actor1037: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 50,51 + Actor1038: e3 + Owner: USSRUnits + Facing: 384 + Location: 52,50 + SubCell: 3 + Actor1039: e3 + Owner: USSRUnits + Facing: 384 + Location: 52,50 + SubCell: 1 + Actor1040: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 56,50 + Actor1041: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 58,49 + Actor1042: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 64,47 + Actor1043: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 66,43 + Actor1044: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 54,40 + Actor1045: e3 + Owner: USSRUnits + Facing: 384 + Location: 54,40 + SubCell: 1 + Actor1046: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 58,40 + Actor1047: e3 + Owner: USSRUnits + Facing: 384 + Location: 59,43 + SubCell: 3 + Actor1051: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 35,28 + Actor1052: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 35,37 + Actor1053: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 30,28 + Actor1054: e3 + Owner: USSRUnits + Facing: 384 + Location: 30,28 + SubCell: 1 + Actor1055: e3 + Owner: USSRUnits + Facing: 384 + Location: 30,27 + SubCell: 3 + Actor1056: e3 + Owner: USSRUnits + Facing: 384 + Location: 28,22 + SubCell: 3 + Actor1057: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 29,36 + Actor1058: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 30,39 + Actor1059: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 27,41 + Actor1061: e3 + Owner: USSRUnits + Facing: 384 + Location: 52,44 + SubCell: 3 + Actor1062: e3 + Owner: USSRUnits + Facing: 384 + Location: 45,47 + SubCell: 3 + Actor1063: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 46,53 + Actor1064: e3 + Owner: USSRUnits + Facing: 384 + Location: 56,56 + SubCell: 3 + Actor1065: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 58,52 + Actor1066: e2 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 24,67 + Actor1067: e2 + Owner: USSRUnits + Facing: 384 + Location: 35,77 + SubCell: 1 + Actor1068: e2 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 47,74 + Actor1069: e2 + Owner: USSRUnits + Facing: 384 + SubCell: 1 + Location: 54,79 + Actor1070: e2 + Owner: USSRUnits + Facing: 384 + Location: 50,77 + SubCell: 1 + Actor1071: e2 + Owner: USSRUnits + Facing: 384 + Location: 46,70 + SubCell: 3 + Actor1072: e2 + Owner: USSRUnits + Facing: 384 + Location: 45,63 + SubCell: 1 + Actor1073: e2 + Owner: USSRUnits + Facing: 384 + SubCell: 1 + Location: 39,62 + Actor1074: e2 + Owner: USSRUnits + Facing: 384 + Location: 34,63 + SubCell: 3 + Actor1075: e2 + Owner: USSRUnits + Facing: 384 + Location: 61,68 + SubCell: 2 + Actor1076: e2 + Owner: USSRUnits + Facing: 384 + Location: 66,77 + SubCell: 1 + Actor1077: e2 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 74,70 + Actor1078: e2 + Owner: USSRUnits + Facing: 384 + Location: 82,69 + SubCell: 3 + Actor1079: e2 + Owner: USSRUnits + Facing: 384 + Location: 83,68 + SubCell: 3 + Actor1080: e2 + Owner: USSRUnits + Facing: 384 + Location: 79,68 + SubCell: 3 + Actor1081: e2 + Owner: USSRUnits + Facing: 384 + Location: 84,64 + SubCell: 1 + Actor1082: e2 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 76,49 + Actor1083: e2 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 84,50 + Actor1084: e2 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 73,51 + Actor1085: e2 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 65,56 + Actor1086: e2 + Owner: USSRUnits + Facing: 384 + Location: 65,56 + SubCell: 1 + Actor1087: e2 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 69,56 + Actor1088: e2 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 66,50 + Actor1089: e2 + Owner: USSRUnits + Facing: 384 + Location: 56,56 + SubCell: 1 + Actor1090: e2 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 57,54 + Actor1091: e2 + Owner: USSRUnits + Facing: 384 + Location: 49,51 + SubCell: 3 + Actor1092: e2 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 45,49 + Actor1093: e2 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 52,46 + Actor1094: e1 + Owner: USSRUnits + Facing: 384 + Location: 73,51 + SubCell: 1 + Actor1095: e4 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 82,48 + Actor1096: e4 + Owner: USSRUnits + Facing: 384 + Location: 80,69 + SubCell: 3 + Actor1097: e4 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 84,65 + Actor1098: e4 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 84,62 + Actor1099: e4 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 69,61 + Actor1100: e4 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 59,73 + Actor1101: e4 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 22,68 + Actor1102: e4 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 23,59 + Actor1103: e4 + Owner: USSRUnits + Facing: 384 + Location: 22,40 + SubCell: 1 + Actor1104: e4 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 22,36 + Actor1105: e4 + Owner: USSRUnits + Facing: 384 + Location: 22,27 + SubCell: 1 + Actor1106: e4 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 26,24 + Actor1107: e4 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 30,33 + Actor1108: e4 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 29,29 + Actor1109: e4 + Owner: USSRUnits + Facing: 384 + SubCell: 1 + Location: 36,29 + Actor1110: e4 + Owner: USSRUnits + Facing: 384 + Location: 34,27 + SubCell: 3 + Actor1111: e2 + Owner: USSRUnits + Facing: 384 + Location: 24,36 + SubCell: 1 + Actor1112: e2 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 23,27 + Actor1113: e2 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 26,21 + Actor1118: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 27,22 + Actor1120: e1 + Owner: USSRUnits + Facing: 384 + Location: 66,43 + SubCell: 1 + Actor1121: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 62,51 + Actor1122: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 82,26 + Actor1123: e1 + Owner: USSRUnits + Facing: 384 + Location: 82,26 + SubCell: 1 + Actor1124: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 84,28 + Actor1125: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 87,29 + Actor1126: e1 + Owner: USSRUnits + SubCell: 3 + Location: 82,22 + Facing: 384 + Actor1127: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 82,30 + Actor1128: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 83,27 + Actor1129: e3 + Owner: USSRUnits + Facing: 384 + Location: 79,26 + SubCell: 3 + Actor1130: e3 + Owner: USSRUnits + Facing: 384 + Location: 84,32 + SubCell: 3 + Actor1131: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 86,36 + Actor1132: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 75,35 + Actor1133: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 74,23 + Actor1134: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 76,19 + Actor1135: e3 + Owner: USSRUnits + Facing: 384 + Location: 73,29 + SubCell: 3 + Actor1136: e2 + Owner: USSRUnits + SubCell: 3 + Location: 79,27 + Facing: 384 + Actor1137: e2 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 76,23 + Actor1138: e2 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 84,27 + Actor1139: e2 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 79,31 + Actor1140: e2 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 77,32 + Actor1141: e8 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 50,52 + Actor1142: e8 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 53,51 + Actor1143: shok + Owner: USSRUnits + SubCell: 3 + Location: 81,65 + Facing: 384 + Actor1144: shok + Owner: USSRUnits + Facing: 384 + Location: 75,71 + SubCell: 3 + Actor1145: ss + Owner: USSRUnits + Facing: 384 + Location: 96,54 + Actor1146: ss + Owner: USSRUnits + Facing: 384 + Location: 98,56 + Actor1147: ss + Owner: USSRUnits + Location: 107,57 + Facing: 570 + Actor1148: ss + Owner: USSRUnits + Location: 97,46 + Facing: 610 + Actor1149: ss + Owner: USSRUnits + Location: 14,74 + Facing: 586 + Actor1150: ss + Owner: USSRUnits + Location: 15,68 + Facing: 539 + Actor1151: ss + Owner: USSRUnits + Facing: 384 + Location: 34,83 + Actor1152: ss + Owner: USSRUnits + Facing: 384 + Location: 52,87 + Actor1153: ss + Owner: USSRUnits + Facing: 384 + Location: 42,86 + Actor1154: ss + Owner: USSRUnits + Facing: 384 + Location: 85,89 + Actor1155: ss + Owner: USSRUnits + Location: 90,18 + Facing: 555 + Actor1156: ss + Owner: USSRUnits + Location: 110,17 + Facing: 531 + Actor1157: ss + Owner: USSRUnits + Location: 96,30 + Facing: 563 + Actor1158: seas + Owner: USSRUnits + Facing: 384 + Location: 49,8 + Actor1159: seas + Owner: USSRUnits + Facing: 384 + Location: 46,6 + Actor1160: seas + Owner: USSRUnits + Facing: 384 + Location: 85,87 + Actor1161: seas + Owner: USSRUnits + Facing: 384 + Location: 105,68 + Actor1162: seas + Owner: USSRUnits + Facing: 384 + Location: 11,50 + Actor1163: ss + Owner: USSRUnits + Facing: 384 + Location: 10,48 + Actor1164: ss + Owner: USSRUnits + Facing: 384 + Location: 13,44 + Actor1165: ss + Owner: USSRUnits + Facing: 384 + Location: 12,30 + Actor1166: ss + Owner: USSRUnits + Facing: 384 + Location: 44,9 + Actor1167: ss + Owner: USSRUnits + Facing: 384 + Location: 41,3 + Actor1168: ss + Owner: USSRUnits + Facing: 384 + Location: 37,3 + Actor1169: ss + Owner: USSRUnits + Facing: 384 + Location: 44,12 + Actor1170: ss + Owner: USSRUnits + Location: 68,10 + Facing: 642 + Actor1171: seas + Owner: USSRUnits + Location: 70,7 + Facing: 626 + Actor1172: ss + Owner: USSRUnits + Facing: 642 + Location: 67,7 + Actor1173: ss + Owner: USSRUnits + Facing: 642 + Location: 71,5 + Actor1174: ss + Owner: USSRUnits + Facing: 642 + Location: 75,3 + Actor1175: seas + Owner: USSRUnits + Facing: 626 + Location: 72,3 + Actor1176: ltnk + Owner: Nod + Location: 26,100 + Facing: 0 + Actor1177: ltnk + Owner: Nod + Facing: 0 + Location: 28,98 + Actor1178: ltnk + Owner: Nod + Facing: 0 + Location: 30,101 + Actor1179: ltnk + Owner: Nod + Facing: 0 + Location: 30,107 + Actor1180: ltnk + Owner: Nod + Facing: 0 + Location: 25,103 + Actor1181: ftnk + Owner: Nod + Location: 28,100 + Facing: 0 + Actor1183: bike + Owner: Nod + Location: 32,107 + Facing: 0 + Actor1184: stnk.nod + Owner: Nod + Location: 26,106 + Facing: 0 + Actor1185: stnk.nod + Owner: Nod + Location: 27,107 + Facing: 0 + Actor1186: arty.nod + Owner: Nod + Location: 26,104 + Facing: 0 + Actor1187: arty.nod + Owner: Nod + Location: 34,107 + Facing: 0 + Actor1189: n1 + Owner: Nod + Location: 31,100 + SubCell: 1 + Facing: 0 + Actor1190: n1 + Owner: Nod + Location: 31,100 + SubCell: 2 + Facing: 0 + Actor1191: n1 + Owner: Nod + Location: 31,100 + SubCell: 4 + Facing: 0 + Actor1192: n1 + Owner: Nod + Location: 31,100 + SubCell: 5 + Facing: 0 + Actor1194: n1 + Owner: Nod + Location: 32,102 + SubCell: 1 + Facing: 0 + Actor1195: n1 + Owner: Nod + Location: 32,102 + SubCell: 2 + Facing: 0 + Actor1196: n1 + Owner: Nod + Location: 32,102 + SubCell: 4 + Facing: 0 + Actor1197: n1 + Owner: Nod + Location: 32,102 + SubCell: 5 + Facing: 0 + Actor1199: n3 + Owner: Nod + Location: 29,102 + SubCell: 1 + Facing: 0 + Actor1200: n3 + Owner: Nod + Location: 29,102 + SubCell: 2 + Facing: 0 + Actor1201: n3 + Owner: Nod + Location: 29,102 + SubCell: 4 + Facing: 0 + Actor1202: n3 + Owner: Nod + Location: 29,102 + SubCell: 5 + Facing: 0 + Actor1204: n4 + Owner: Nod + Location: 24,104 + SubCell: 1 + Facing: 0 + Actor1205: n4 + Owner: Nod + Location: 24,104 + SubCell: 2 + Facing: 0 + Actor1206: n4 + Owner: Nod + Location: 24,104 + SubCell: 4 + Facing: 0 + Actor1207: n4 + Owner: Nod + Location: 24,104 + SubCell: 5 + Facing: 0 + Actor1198: dog + Owner: USSRUnits + SubCell: 3 + Location: 37,37 + Facing: 174 + Actor1203: tpwr + Owner: USSR + Location: 66,45 + Actor1208: tpwr + Owner: USSR + Location: 67,41 + Actor1209: nuk2 + Owner: Nod + Location: 33,109 + Actor1210: nuk2 + Owner: Nod + Location: 31,109 + Actor1211: nuk2 + Owner: Nod + Location: 29,109 + Actor1212: afac + Owner: Nod + Location: 20,109 + Actor1213: hq + Owner: Nod + Location: 24,109 + Actor1214: proc.td + Owner: Nod + Location: 20,101 + Actor1215: brik + Owner: Nod + Location: 23,101 + Actor1216: brik + Owner: Nod + Location: 36,102 + Actor1217: brik + Owner: Nod + Location: 36,103 + Actor1218: brik + Owner: Nod + Location: 36,109 + Actor1219: brik + Owner: Nod + Location: 36,110 + Actor1220: brik + Owner: Nod + Location: 37,109 + Actor1221: brik + Owner: Nod + Location: 37,110 + Actor1222: airs + Owner: Nod + Location: 28,104 + Actor1182: bike + Owner: Nod + Facing: 0 + Location: 25,107 + Actor1249: camera + Owner: USSRUnits + Location: 51,77 + Actor1250: camera + Owner: USSRUnits + Location: 38,75 + Actor1251: camera + Owner: USSRUnits + Location: 28,70 + Actor1252: camera + Owner: USSRUnits + Location: 27,57 + Actor1253: camera + Owner: USSRUnits + Location: 42,65 + Actor1254: camera + Owner: USSRUnits + Location: 56,68 + Actor1255: camera + Owner: USSRUnits + Location: 68,74 + Actor1256: camera + Owner: USSRUnits + Location: 79,65 + Actor1257: camera + Owner: USSRUnits + Location: 80,53 + Actor1258: camera + Owner: USSRUnits + Location: 68,58 + Actor1259: camera + Owner: USSRUnits + Location: 54,52 + Actor1260: camera + Owner: USSRUnits + Location: 66,42 + Actor1261: camera + Owner: USSRUnits + Location: 34,31 + Actor1262: camera + Owner: USSRUnits + Location: 80,28 + Actor1263: e3 + Owner: USSRUnits + Facing: 384 + Location: 60,74 + SubCell: 1 + Actor1264: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 67,77 + Actor1265: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 63,64 + Actor1266: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 46,57 + Actor1267: e3 + Owner: USSRUnits + Facing: 384 + Location: 56,58 + SubCell: 3 + Actor1268: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 24,58 + Actor1269: 3tnk + Owner: USSRUnits + Location: 43,67 + Facing: 245 + Actor1270: 3tnk + Owner: USSRUnits + Facing: 245 + Location: 45,67 + Actor1271: btr.ai + Owner: USSRUnits + Facing: 150 + Location: 54,67 + Actor1272: btr.ai + Owner: USSRUnits + Facing: 150 + Location: 74,61 + Actor1273: 3tnk + Owner: USSRUnits + Facing: 618 + Location: 23,69 + Actor1274: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 62,57 + Actor1275: e1 + Owner: USSRUnits + Facing: 384 + Location: 62,57 + SubCell: 1 + Actor1276: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 65,62 + Actor1277: e1 + Owner: USSRUnits + Facing: 384 + Location: 65,62 + SubCell: 1 + Actor1278: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 68,63 + Actor1279: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 77,51 + Actor1280: e1 + Owner: USSRUnits + Facing: 384 + Location: 77,51 + SubCell: 1 + Actor1281: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 85,49 + Actor1282: e1 + Owner: USSRUnits + Facing: 384 + Location: 85,49 + SubCell: 1 + Actor1283: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 72,49 + Actor1284: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 89,50 + Actor1285: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 1 + Location: 82,69 + Actor1286: ss + Owner: USSRUnits + Facing: 384 + Location: 70,86 + Actor1287: ss + Owner: USSRUnits + Facing: 539 + Location: 9,61 + Actor1288: ss + Owner: USSRUnits + Facing: 539 + Location: 11,60 + Actor1289: ss + Owner: USSRUnits + Facing: 539 + Location: 14,21 + Actor1290: ss + Owner: USSRUnits + Facing: 384 + Location: 94,75 + Actor1291: ss + Owner: USSRUnits + Facing: 384 + Location: 97,76 + Actor1292: katy + Owner: USSRUnits + Facing: 384 + Location: 32,64 + Actor1293: katy + Owner: USSRUnits + Location: 42,61 + Facing: 126 + Actor1294: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 26,58 + Actor1295: e1 + Owner: USSRUnits + Facing: 384 + Location: 26,58 + SubCell: 1 + Actor1296: e2 + Owner: USSRUnits + SubCell: 3 + Facing: 384 + Location: 38,54 + Actor1297: e2 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 28,59 + Actor1223: chain + Owner: Nod + Location: 41,104 + Actor1224: chain + Owner: Nod + Location: 42,104 + Actor1225: chain + Owner: Nod + Location: 43,104 + Actor1226: chain + Owner: Nod + Location: 44,104 + Actor1227: chain + Owner: Nod + Location: 45,104 + Actor1228: chain + Owner: Nod + Location: 46,104 + Actor1229: chain + Owner: Nod + Location: 47,104 + Actor1234: chain + Owner: Nod + Location: 41,105 + Actor1235: hpad.td + Owner: Nod + Location: 42,105 + Actor1236: hpad.td + Owner: Nod + Location: 45,105 + Actor1240: chain + Owner: Nod + Location: 47,105 + Actor1241: chain + Owner: Nod + Location: 41,106 + Actor1244: chain + Owner: Nod + Location: 47,106 + Actor1246: chain + Owner: Nod + Location: 41,107 + Actor1248: chain + Owner: Nod + Location: 47,107 + Actor1301: rep + Owner: Nod + Location: 43,109 + Actor1302: chain + Owner: Nod + Location: 41,111 + Actor1303: chain + Owner: Nod + Location: 47,111 + Actor1304: chain + Owner: Nod + Location: 41,112 + Actor1305: chain + Owner: Nod + Location: 42,112 + Actor1306: chain + Owner: Nod + Location: 43,112 + Actor1307: chain + Owner: Nod + Location: 44,112 + Actor1308: chain + Owner: Nod + Location: 45,112 + Actor1309: chain + Owner: Nod + Location: 46,112 + Actor1310: chain + Owner: Nod + Location: 47,112 + Actor1231: brl3 + Owner: Creeps + Location: 108,79 + Actor1232: brl3 + Owner: Creeps + Location: 103,76 + Actor1233: oilb + Owner: Neutral + Location: 105,77 + Patrol1: waypoint + Owner: Neutral + Location: 69,58 + Patrol2: waypoint + Owner: Neutral + Location: 81,49 + Patrol3: waypoint + Owner: Neutral + Location: 80,65 + Patrol4: waypoint + Owner: Neutral + Location: 69,73 + Patrol5: waypoint + Owner: Neutral + Location: 54,69 + Patrol6: waypoint + Owner: Neutral + Location: 36,61 + Patrol7: waypoint + Owner: Neutral + Location: 23,63 + Patrol8: waypoint + Owner: Neutral + Location: 34,74 + Patrol9: waypoint + Owner: Neutral + Location: 48,77 + Actor1230: tsla + Owner: USSR + Location: 74,57 + Actor1237: tsla + Owner: USSR + Location: 59,27 + Actor1238: tsla + Owner: USSR + Location: 56,27 + Actor1242: tsla + Owner: USSR + Location: 52,37 + PatrolDropLanding: waypoint + Owner: Neutral + Location: 65,51 + PatrolDropSpawn: waypoint + Owner: Neutral + Location: 60,1 + SatHack: waypoint + Owner: Neutral + Location: 57,33 + Actor1243: sam + Owner: USSR + Location: 51,18 + Actor1239: dog + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 36,24 + Actor1245: barr + Owner: USSR + Location: 35,25 + Actor1312: powr + Owner: USSR + Location: 35,30 + Actor1313: powr + Owner: USSR + Location: 35,34 + Actor1317: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 1 + Location: 37,34 + Actor1318: e3 + Owner: USSRUnits + SubCell: 3 + Facing: 384 + Location: 37,34 + Actor1315: ttra + Owner: USSRUnits + Location: 37,28 + Facing: 356 + Actor1314: e3 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 37,26 + Actor1247: chain + Owner: USSR + Location: 38,24 + Actor1319: chain + Owner: USSR + Location: 38,25 + Actor1320: chain + Owner: USSR + Location: 38,26 + Actor1321: chain + Owner: USSR + Location: 38,27 + Actor1324: chain + Owner: USSR + Location: 38,28 + Actor1325: chain + Owner: USSR + Location: 38,29 + Actor1326: chain + Owner: USSR + Location: 38,30 + Actor1329: chain + Owner: USSR + Location: 38,31 + Actor1330: chain + Owner: USSR + Location: 38,32 + Actor1331: chain + Owner: USSR + Location: 38,33 + Actor1334: chain + Owner: USSR + Location: 38,34 + Actor1335: chain + Owner: USSR + Location: 38,35 + Actor1188: tc05 + Owner: Neutral + Location: 45,30 + Actor1193: tc04 + Owner: Neutral + Location: 45,35 + Actor1311: tc01 + Owner: Neutral + Location: 46,33 + Actor1316: t05 + Owner: Neutral + Location: 46,29 + Actor1322: t17 + Owner: Neutral + Location: 45,31 + Actor1323: t11 + Owner: Neutral + Location: 46,34 + Actor1327: t16 + Owner: Neutral + Location: 42,39 + Actor1328: t13 + Owner: Neutral + Location: 68,31 + Actor1332: t16 + Owner: Neutral + Location: 68,29 + Actor1333: t17 + Owner: Neutral + Location: 45,37 + TeslaReactor4: tpwr + Owner: USSR + Location: 39,32 + TeslaReactor3: tpwr + Owner: USSR + Location: 39,29 + TeslaReactor2: tpwr + Owner: USSR + Location: 39,26 + TeslaReactor1: tpwr + Owner: USSR + Location: 39,23 + Actor1340: brik + Owner: USSR + Location: 36,22 + Actor1341: brik + Owner: USSR + Location: 36,21 + Actor1344: chain + Owner: USSR + Location: 39,35 + Actor1345: chain + Owner: USSR + Location: 40,35 + Actor1346: chain + Owner: USSR + Location: 41,35 + Actor1347: chain + Owner: USSR + Location: 38,23 + Actor1348: chain + Owner: USSR + Location: 38,22 + Actor1352: chain + Owner: USSR + Location: 41,22 + Actor1353: chain + Owner: USSR + Location: 40,22 + Actor1354: chain + Owner: USSR + Location: 39,22 + Actor1355: brik + Owner: USSR + Location: 37,21 + Actor1356: brik + Owner: USSR + Location: 38,21 + Actor1357: brik + Owner: USSR + Location: 39,21 + Actor1358: brik + Owner: USSR + Location: 40,21 + Actor1363: brik + Owner: USSR + Location: 45,21 + Actor1364: brik + Owner: USSR + Location: 45,22 + Actor1365: brik + Owner: USSR + Location: 45,23 + Actor1366: brik + Owner: USSR + Location: 45,24 + Actor1367: brik + Owner: USSR + Location: 45,25 + Actor1368: brik + Owner: USSR + Location: 45,26 + Actor1369: brik + Owner: USSR + Location: 45,27 + Actor1370: brik + Owner: USSR + Location: 45,28 + Actor1371: brik + Owner: USSR + Location: 42,29 + Actor1372: brik + Owner: USSR + Location: 42,30 + Actor1373: brik + Owner: USSR + Location: 42,31 + Actor1374: brik + Owner: USSR + Location: 42,32 + Actor1375: brik + Owner: USSR + Location: 42,33 + Actor1376: brik + Owner: USSR + Location: 42,34 + Actor1377: brik + Owner: USSR + Location: 42,35 + Actor1378: brik + Owner: USSR + Location: 42,36 + Actor1379: brik + Owner: USSR + Location: 41,36 + Actor1380: brik + Owner: USSR + Location: 40,36 + Actor1381: brik + Owner: USSR + Location: 40,37 + Actor1382: brik + Owner: USSR + Location: 40,38 + Actor1383: brik + Owner: USSR + Location: 40,39 + Actor1384: brik + Owner: USSR + Location: 42,28 + Actor1385: brik + Owner: USSR + Location: 43,28 + Actor1386: brik + Owner: USSR + Location: 44,28 + Actor1342: brik + Owner: USSR + Location: 45,20 + Actor1343: brik + Owner: USSR + Location: 44,20 + Actor1349: brik + Owner: USSR + Location: 43,20 + Actor1350: brik + Owner: USSR + Location: 42,20 + Actor1351: brik + Owner: USSR + Location: 41,20 + TeslaReactor6: tpwr + Owner: USSR + Location: 42,25 + TeslaReactor5: tpwr + Owner: USSR + Location: 42,22 + Actor1359: chain + Owner: USSR + Location: 41,21 + Actor1362: chain + Owner: USSR + Location: 42,21 + Actor1387: chain + Owner: USSR + Location: 43,21 + Actor1388: chain + Owner: USSR + Location: 44,21 + Actor1389: brik + Owner: USSR + Location: 40,20 + Actor1390: t10 + Owner: Neutral + Location: 44,17 + Actor1391: t11 + Owner: Neutral + Location: 34,17 + Actor1392: e2 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 37,18 + Actor1393: e2 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 32,19 + Actor1394: e1 + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 47,18 + Actor1395: dog + Owner: USSRUnits + Facing: 384 + SubCell: 3 + Location: 41,19 + SubPatrol1: waypoint + Owner: Neutral + Location: 56,8 + SubPatrol2: waypoint + Owner: Neutral + Location: 14,15 + SubPatrol3: waypoint + Owner: Neutral + Location: 18,79 + SubPatrol4: waypoint + Owner: Neutral + Location: 56,87 + SubPatrol5: waypoint + Owner: Neutral + Location: 91,76 + SubPatrol6: waypoint + Owner: Neutral + Location: 92,18 + Bombard1: waypoint + Owner: Neutral + Location: 27,88 + Bombard2: waypoint + Owner: Neutral + Location: 47,94 + HaloTrigger1: waypoint + Owner: Neutral + Location: 29,69 + HaloTrigger2: waypoint + Owner: Neutral + Location: 29,70 + HaloTrigger3: waypoint + Owner: Neutral + Location: 29,71 + HaloTrigger4: waypoint + Owner: Neutral + Location: 29,72 + LandingCraft1: lst + Owner: Nod + Location: 25,98 + Facing: 384 + LandingCraft2: lst + Owner: Nod + Location: 26,96 + Facing: 384 + LandingCraft3: lst + Owner: Nod + Location: 31,96 + Facing: 384 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-covenants.yaml, zenith-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml, zenith-weapons.yaml diff --git a/mods/ca/missions/main-campaign/ca10-zenith/zenith-rules.yaml b/mods/ca/missions/main-campaign/ca10-zenith/zenith-rules.yaml new file mode 100644 index 0000000000..05ab4dd0c9 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca10-zenith/zenith-rules.yaml @@ -0,0 +1,143 @@ +^Palettes: + TintPostProcessEffect: + Red: 0.8 + Green: 0.8 + Blue: 1 + Ambient: 0.9 + WeatherOverlay: + ParticleDensityFactor: 16 + Gravity: 16, 24 + WindTick: 150, 425 + ScatterDirection: -12, 12 + ParticleSize: 2, 3 + ParticleColors: ECECEC44, E4E4E444, D0D0D044, BCBCBC44 + LineTailAlphaValue: 0 + +World: + LuaScript: + Scripts: campaign.lua, zenith.lua + MissionData: + Briefing: Despite my assurances, the Soviets have begun a large scale offensive towards our Temple Prime facility. Stalin always was a short-sighted fool.\n\nTo ensure the safety of the temple, we must take the Soviet nuclear arsenal out of the equation. My informants tell me that the Soviets plan to launch their missiles to wipe out the bulk of our defense forces, and then roll in with their tanks to clean up any survivors.\n\nThe Soviet missile silos are located on a heavily fortified island. We are not in an ideal position to strike, but with the Soviet army moving south we should be able to set up a staging area on the coast and storm the island before the Soviets can send reinforcements. + MapOptions: + ShortGameCheckboxEnabled: False + MusicPlaylist: + StartingMusic: smsh226m + +Player: + PlayerResources: + DefaultCash: 6000 + +# Enable subfaction specific tech + +BH: + Buildable: + Prerequisites: anyradar + +WTNK: + Buildable: + Prerequisites: ~vehicles.nod, anyradar + +# Disable tech + +cyborgarmor.upgrade: + Inherits@CAMPAIGNDISABLED: ^Disabled + +cyborgspeed.upgrade: + Inherits@CAMPAIGNDISABLED: ^Disabled + +MSLO.Nod: + Inherits@CAMPAIGNDISABLED: ^Disabled + +ENLI: + Inherits@CAMPAIGNDISABLED: ^Disabled + +RMBC: + Inherits@CAMPAIGNDISABLED: ^Disabled + +TMPL: + -NukePower@Cluster: + -GrantConditionOnPrerequisite@OwnedByAi: + -GrantConditionOnPrerequisite@AiSuperweaponsEnabled: + +TMPP: + Inherits@CAMPAIGNDISABLED: ^Disabled + +# Disable powers + +AIRS: + -ParatroopersPowerCA@NodAirDrop: + +# Misc + +TSLA: + -Targetable@TeslaBoost: + +MSLO: + NukePower@ABomb: + DisplayTimerRelationships: Ally + ChargeInterval: 25 + AllowMultiple: true + -InfiltrateForSupportPowerReset: + -Targetable@INFILTRATION: + Health: + HP: 200000 + +^NukeDummy: + Inherits@ABOMBPOWER: ^ABombPower + AlwaysVisible: + Interactable: + ScriptTriggers: + NukePower@ABomb: + -PauseOnCondition: + +NukeDummyEasy: + Inherits: ^NukeDummy + NukePower@ABomb: + ChargeInterval: 90000 + +NukeDummyNormal: + Inherits: ^NukeDummy + NukePower@ABomb: + ChargeInterval: 67500 + +NukeDummyHard: + Inherits: ^NukeDummy + NukePower@ABomb: + ChargeInterval: 52500 + +NukeDummyVeryHard: + Inherits: ^NukeDummy + NukePower@ABomb: + ChargeInterval: 45000 + +NukeDummyBrutal: + Inherits: ^NukeDummy + NukePower@ABomb: + ChargeInterval: 37500 + +OILB: + CashTrickler: + Interval: 375 + Amount: 200 + +E2: + Mobile: + Speed: 46 + +E3: + Mobile: + Speed: 46 + +E4: + Mobile: + Speed: 46 + +C17: + Health: + HP: 15000 + +camera.sathack: + DetectCloaked: + Range: 8c0 + RevealsShroud: + Range: 8c0 diff --git a/mods/ca/missions/main-campaign/ca10-zenith/zenith-weapons.yaml b/mods/ca/missions/main-campaign/ca10-zenith/zenith-weapons.yaml new file mode 100644 index 0000000000..29ebd398f1 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca10-zenith/zenith-weapons.yaml @@ -0,0 +1,6 @@ +V3ExplodeAirborne: + Warhead@1Dam: SpreadDamage + Damage: 250 + +ICBMLauncher: + Range: 18c0 diff --git a/mods/ca/missions/main-campaign/ca10-zenith/zenith.lua b/mods/ca/missions/main-campaign/ca10-zenith/zenith.lua new file mode 100644 index 0000000000..c613fa7995 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca10-zenith/zenith.lua @@ -0,0 +1,333 @@ +MissionDir = "ca|missions/main-campaign/ca10-zenith" + +NukeSilos = { NukeSilo1, NukeSilo2, NukeSilo3, NukeSilo4 } + +NukeTimer = { + easy = DateTime.Minutes(120), + normal = DateTime.Minutes(60), + hard = DateTime.Minutes(35), + vhard = DateTime.Minutes(30), + brutal = DateTime.Minutes(25), +} + +HaloDropStart = AdjustDelayForDifficulty(DateTime.Minutes(6)) +HaloDropAttackValue = AdjustAttackValuesForDifficulty({ Min = 5, Max = 8, RampDuration = DateTime.Minutes(6) }) + +TeslaReactors = { TeslaReactor1, TeslaReactor2, TeslaReactor3, TeslaReactor4, TeslaReactor5, TeslaReactor6 } +AirbaseStructures = { Airfield1, Airfield2, Airfield3, Airfield4, Airfield5, Helipad1, Helipad2, Helipad3 } +PatrolPath = { Patrol1.Location, Patrol2.Location, Patrol3.Location, Patrol4.Location, Patrol5.Location, Patrol6.Location, Patrol7.Location, Patrol8.Location, Patrol9.Location } + +Squads = { + Planes = { + Delay = AdjustAirDelayForDifficulty(DateTime.Minutes(8)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 12, Max = 12 }), + Compositions = { + easy = { + { Aircraft = { "yak" } }, + { Aircraft = { "mig" } } + }, + normal = { + { Aircraft = { "yak", "yak" } }, + { Aircraft = { "mig", "yak" } } + }, + hard = { + { Aircraft = { "mig", "mig", "yak" } }, + { Aircraft = { "mig", "yak", "yak" } } + }, + vhard = { + { Aircraft = { "mig", "mig", "mig" } }, + { Aircraft = { "yak", "yak", MigOrSukhoi } } + }, + brutal = { + { Aircraft = { "mig", "mig", "yak", MigOrSukhoi } }, + { Aircraft = { "mig", "yak", "yak", MigOrSukhoi } } + } + }, + }, + Helicopters = { + Delay = AdjustAirDelayForDifficulty(DateTime.Minutes(6)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 12, Max = 12 }), + Compositions = { + easy = { + { Aircraft = { "hind" } } + }, + normal = { + { Aircraft = { "hind", "hind" } } + }, + hard = { + { Aircraft = { "hind", "hind", "hind" } } + }, + vhard = { + { Aircraft = { "hind", "hind", "hind" } } + }, + brutal = { + { Aircraft = { "hind", "hind", "hind", "hind" } } + } + }, + }, + Naval = { + ActiveCondition = function() + return PlayerHasICBMSubs() + end, + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 15, Max = 20 }), + Compositions = { + { Ships = { "ss" } } + }, + AttackPaths = { + { SubPatrol1.Location, SubPatrol2.Location, SubPatrol3.Location, SubPatrol4.Location, SubPatrol5.Location, SubPatrol6.Location }, + { SubPatrol1.Location, SubPatrol6.Location, SubPatrol5.Location, SubPatrol4.Location, SubPatrol3.Location, SubPatrol2.Location }, + }, + }, + MissileSubs = { + Delay = DateTime.Minutes(10), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 15, Max = 30 }), + Compositions = { + brutal = { + { Ships = { "msub", "msub" } } + } + }, + AttackPaths = { + { Bombard1.Location }, + { Bombard2.Location }, + } + }, + AirToAir = AirToAirSquad({ "mig" }, AdjustAirDelayForDifficulty(DateTime.Minutes(10))) +} + +-- Setup and Tick + +SetupPlayers = function() + Nod = Player.GetPlayer("Nod") + USSR = Player.GetPlayer("USSR") + USSRUnits = Player.GetPlayer("USSRUnits") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = { Nod } + MissionEnemies = { USSR } +end + +WorldLoaded = function() + SetupPlayers() + + TimerTicks = 0 + Camera.Position = PlayerStart.CenterPosition + + InitObjectives(Nod) + AdjustPlayerStartingCashForDifficulty() + InitUSSR() + + ObjectiveKillSilos = Nod.AddObjective("Destroy Soviet missile silos before launch.") + ObjectiveKillReactors = Nod.AddSecondaryObjective("Destroy reactors on north-west of island.") + ObjectiveKillAirbase = Nod.AddSecondaryObjective("Destroy airbase on north-east of island.") + + if Difficulty == "brutal" then + NukeDummy = Actor.Create("NukeDummyBrutal", true, { Owner = USSR, Location = NukeSilo1.Location }) + elseif Difficulty == "vhard" then + NukeDummy = Actor.Create("NukeDummyVeryHard", true, { Owner = USSR, Location = NukeSilo1.Location }) + elseif Difficulty == "hard" then + NukeDummy = Actor.Create("NukeDummyHard", true, { Owner = USSR, Location = NukeSilo1.Location }) + elseif Difficulty == "normal" then + NukeDummy = Actor.Create("NukeDummyNormal", true, { Owner = USSR, Location = NukeSilo1.Location }) + else + NukeDummy = Actor.Create("NukeDummyEasy", true, { Owner = USSR, Location = NukeSilo1.Location }) + end + + local satHack = Actor.Create("camera.sathack", true, { Owner = Nod, Location = SatHack.Location }) + + Trigger.AfterDelay(DateTime.Seconds(4), function() + satHack.Destroy() + end) + + Trigger.AfterDelay(NukeTimer[Difficulty] + DateTime.Seconds(3), function() + if not NukeDummy.IsDead then + if not NukeSilo1.IsDead then + NukeSilo1.ActivateNukePower(PlayerStart.Location) + NukeLaunched = true + elseif not NukeSilo2.IsDead then + NukeSilo2.ActivateNukePower(PlayerStart.Location) + NukeLaunched = true + elseif not NukeSilo3.IsDead then + NukeSilo3.ActivateNukePower(PlayerStart.Location) + NukeLaunched = true + elseif not NukeSilo4.IsDead then + NukeSilo4.ActivateNukePower(PlayerStart.Location) + NukeLaunched = true + end + NukeDummy.Destroy() + Media.PlaySound("nukelaunch.aud") + PlaySpeechNotificationToMissionPlayers("AbombLaunchDetected") + Notification("A-Bomb launch detected.") + + Trigger.AfterDelay(DateTime.Seconds(3), function() + if not Nod.IsObjectiveCompleted(ObjectiveKillSilos) then + Nod.MarkFailedObjective(ObjectiveKillSilos) + end + end) + end + end) + + Trigger.OnEnteredFootprint({ HaloTrigger1.Location, HaloTrigger2.Location, HaloTrigger3.Location, HaloTrigger4.Location }, function(a, id) + if IsMissionPlayer(a.Owner) and not HaloDropsTriggered then + HaloDropsTriggered = true + Trigger.RemoveFootprintTrigger(id) + DoHaloDrop() + end + end) + + AfterWorldLoaded() +end + +Tick = function() + OncePerSecondChecks() + OncePerFiveSecondChecks() + AfterTick() +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + USSR.Resources = USSR.ResourceCapacity - 500 + + if TimerTicks > 0 then + if TimerTicks > 25 then + TimerTicks = TimerTicks - 25 + else + TimerTicks = 0 + end + end + + if MissionPlayersHaveNoRequiredUnits() then + if not Nod.IsObjectiveCompleted(ObjectiveKillSilos) then + Nod.MarkFailedObjective(ObjectiveKillSilos) + end + end + end +end + +OncePerFiveSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 125 == 0 then + -- nothing + end +end + +InitUSSR = function() + RebuildExcludes.USSR = { Types = { "tsla", "ftur", "tpwr", "afld", "hpad", "mslo" } } + + if Difficulty == "easy" then + AutoRepairBuildings(USSR) + else + AutoRepairAndRebuildBuildings(USSR, 5) + end + + SetupRefAndSilosCaptureCredits(USSR) + InitAiUpgrades(USSR) + InitAirAttackSquad(Squads.Planes, USSR) + InitAirAttackSquad(Squads.Helicopters, USSR) + + if IsNormalOrAbove() then + InitNavalAttackSquad(Squads.Naval, USSR) + + if IsHardOrAbove() then + InitAirAttackSquad(Squads.AirToAir, USSR, MissionPlayers, { "Aircraft" }, "ArmorType") + + if Difficulty == "brutal" then + InitNavalAttackSquad(Squads.MissileSubs, USSR) + end + end + end + + Actor.Create("ai.unlimited.power", true, { Owner = USSR }) + + Trigger.OnAllKilledOrCaptured(NukeSilos, function() + if not NukeLaunched then + Nod.MarkCompletedObjective(ObjectiveKillSilos) + end + end) + + Trigger.OnAllKilledOrCaptured(TeslaReactors, function() + local teslaCoils = USSR.GetActorsByType("tsla") + Utils.Do(teslaCoils, function(a) + if not a.IsDead then + a.GrantCondition("disabled") + end + end) + Nod.MarkCompletedObjective(ObjectiveKillReactors) + Trigger.AfterDelay(DateTime.Seconds(2), function() + Notification("Excellent! The north-west Tesla Reactors have been neutralised; all Soviet Tesla Coils are now offline.") + end) + end) + + Trigger.OnAllKilledOrCaptured(AirbaseStructures, function() + Nod.MarkCompletedObjective(ObjectiveKillAirbase) + Trigger.AfterDelay(DateTime.Seconds(2), function() + Notification("Good work commander! Their airbase has been neutralised, so you no longer have to worry about being attacked from the air.") + end) + end) + + local ussrGroundAttackers = USSRUnits.GetGroundAttackers() + + Utils.Do(ussrGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsUSSRGroundHunterUnit) + end) + + Trigger.OnEnteredProximityTrigger(MADTank.CenterPosition, WDist.New(7 * 1024), function(a, id) + if not MADTank.IsDead and not IsMADTankDetonated and IsMissionPlayer(a.Owner) and not a.HasProperty("Land") and a.HasProperty("Health") then + IsMADTankDetonated = true + Trigger.RemoveProximityTrigger(id) + MADTank.MadTankDetonate() + local madTankCamera = Actor.Create("smallcamera", true, { Owner = Nod, Location = MADTank.Location }) + Trigger.AfterDelay(DateTime.Seconds(4), function() + madTankCamera.Destroy() + end) + end + end) +end + +DoHaloDrop = function() + local entryPath + + if Nod.IsObjectiveCompleted(ObjectiveKillAirbase) then + return + end + + entryPath = { PatrolDropSpawn.Location, PatrolDropLanding.Location } + + local haloDropUnits = { "e1", "e1", "e1", "e2", "e3", "e4" } + + if IsHardOrAbove() and DateTime.GameTime > DateTime.Minutes(15) then + haloDropUnits = { "e1", "e1", "e1", "e1", "e2", "e2", "e3", "e3", "e4", "shok" } + end + + DoHelicopterDrop(USSRUnits, entryPath, "halo.paradrop", haloDropUnits, + function(u) + if not u.IsDead then + u.Patrol(PatrolPath) + end + end, + function(t) + Trigger.AfterDelay(DateTime.Seconds(5), function() + if not t.IsDead then + t.Move(entryPath[1]) + t.Destroy() + end + end) + end + ) + + local delayUntilNext = CalculateInterval(GetTotalCostOfUnits(haloDropUnits), HaloDropAttackValue, HaloDropStart) + Trigger.AfterDelay(delayUntilNext, DoHaloDrop) +end + +PlayerHasICBMSubs = function() + local icbmSubs = Nod.GetActorsByType("isub") + return #icbmSubs > 0 +end + +IdleHunt = function(actor) + if actor.HasProperty("HuntCA") and not actor.IsDead then + Trigger.OnIdle(actor, function(a) + if not a.IsDead and a.IsInWorld and not IsMissionPlayer(a.Owner) then + a.HuntCA() + end + end) + end +end diff --git a/mods/ca/missions/main-campaign/ca11-awakening/awakening-rules.yaml b/mods/ca/missions/main-campaign/ca11-awakening/awakening-rules.yaml new file mode 100644 index 0000000000..50fd033f2c --- /dev/null +++ b/mods/ca/missions/main-campaign/ca11-awakening/awakening-rules.yaml @@ -0,0 +1,137 @@ +^Palettes: + TintPostProcessEffect: + +World: + LuaScript: + Scripts: campaign.lua, awakening.lua + MissionData: + Briefing: The first warriors of our new army are almost ready. Our efforts to drive a wedge between GDI and the Allies were successful enough to keep them from interfering, however Soviet forces now march towards the Temple Prime complex.\n\nOnce our new army is unleashed the Soviets will not stand a chance, however their preparation cannot be hastened. Protect the temple at all costs. + MapOptions: + ShortGameCheckboxEnabled: False + MusicPlaylist: + StartingMusic: prp + +Player: + PlayerResources: + DefaultCash: 6000 + +# Enable subfaction specific tech + +BH: + Buildable: + Prerequisites: anyradar, ~hand + +WTNK: + Buildable: + Prerequisites: anyradar, ~vehicles.nod + +HFTK: + Buildable: + Prerequisites: anyradar, ~vehicles.nod + +quantum.upgrade: + Buildable: + Prerequisites: tmpl + +hstk.upgrade: + Buildable: + Prerequisites: tmpl + +blacknapalm.upgrade: + Buildable: + Prerequisites: tmpl + +# Make non-cyborg infantry available with Temple Prime + +N1: + Buildable: + Prerequisites: ~infantry.td + +N3: + Buildable: + Prerequisites: ~infantry.td + +N4: + Buildable: + Prerequisites: ~hand + +MECH: + Buildable: + Prerequisites: repair, ~infantry.mech + +# Disable cyborgs + +N1C: + Inherits@CAMPAIGNDISABLED: ^Disabled + +N3C: + Inherits@CAMPAIGNDISABLED: ^Disabled + +N5: + Inherits@CAMPAIGNDISABLED: ^Disabled + +CMEC: + Inherits@CAMPAIGNDISABLED: ^Disabled + +RMBC: + Inherits@CAMPAIGNDISABLED: ^Disabled + Health: + HP: 80000 + +BIO: + -OwnerLostAction: + -SpawnActorOnDeath: + -ProvidesPrerequisite@mortar: + -ProvidesPrerequisite@toxintruck: + Tooltip: + Name: Weapons Lab + FireWarheadsOnDeath: + Type: Footprint + Weapon: BuildingExplode + EmptyWeapon: BuildingExplode + Exit@1: + SpawnOffset: -190,880,0 + ExitCell: 1,2 + ProductionTypes: Cyborg + Exit@2: + SpawnOffset: 190,-400,0 + ExitCell: 1,-1 + ProductionTypes: Cyborg + Production: + Produces: Cyborg + RallyPoint: + Targetable@V3Ignore: + TargetTypes: V3Ignore + +TTRK: + -Buildable: + +TMPP: + UnitConverter: + RequiresCondition: awakening-complete + ExternalCondition@AWAKENING: + Condition: awakening-complete + -Sellable: + Targetable@V3Ignore: + TargetTypes: V3Ignore + DummyConditionConsumer@build-incomplete: + Condition: build-incomplete + Power: + Amount: 0 + +MIG: + -MustBeDestroyed: + +YAK: + -MustBeDestroyed: + +SUK: + -MustBeDestroyed: + +HIND: + -MustBeDestroyed: + +V3RL: + AutoTargetPriority@DEFAULT: + ValidTargets: Structure, Defense + InvalidTargets: NoAutoTarget, WaterStructure, AntiAirDefense, V3Ignore diff --git a/mods/ca/missions/main-campaign/ca11-awakening/awakening.lua b/mods/ca/missions/main-campaign/ca11-awakening/awakening.lua new file mode 100644 index 0000000000..506ec7f44c --- /dev/null +++ b/mods/ca/missions/main-campaign/ca11-awakening/awakening.lua @@ -0,0 +1,460 @@ +MissionDir = "ca|missions/main-campaign/ca11-awakening" + + +-- Squads + +AttackPaths = { + { AttackSpawn1.Location, AttackDest1.Location }, + { AttackSpawn2.Location, AttackDest2.Location }, + { AttackSpawn3.Location, AttackDest3.Location }, + { AttackSpawn4.Location, AttackDest4.Location }, + { AttackSpawn5.Location, AttackDest5.Location }, + { AttackSpawn6.Location, AttackDest6.Location }, + { AttackSpawn7.Location, AttackDest7.Location }, + { AttackSpawn8.Location, AttackDest8.Location }, + { AttackSpawn9.Location, AttackDest9.Location }, + { AttackSpawn9.Location, AttackDest10.Location }, +} + +HaloDropPaths = { + { HaloDropSpawn1.Location, HaloDropLanding1.Location }, + { HaloDropSpawn1.Location, HaloDropLanding2.Location }, + { HaloDropSpawn1.Location, HaloDropLanding3.Location }, + { HaloDropSpawn2.Location, HaloDropLanding4.Location }, + { HaloDropSpawn3.Location, HaloDropLanding5.Location }, + { HaloDropSpawn3.Location, HaloDropLanding6.Location }, + { HaloDropSpawn3.Location, HaloDropLanding7.Location }, + { HaloDropSpawn4.Location, HaloDropLanding8.Location }, + { HaloDropSpawn4.Location, HaloDropLanding9.Location }, + { HaloDropSpawn4.Location, HaloDropLanding10.Location }, + { HaloDropSpawn4.Location, HaloDropLanding11.Location }, +} + +GroundAttackInterval = { + easy = DateTime.Seconds(30), + normal = DateTime.Seconds(26), + hard = DateTime.Seconds(24), + vhard = DateTime.Seconds(22), + brutal = DateTime.Seconds(21) +} + +HaloDropStart = AdjustDelayForDifficulty(DateTime.Minutes(7)) +HaloDropAttackValue = AdjustAttackValuesForDifficulty({ Min = 12, Max = 24, RampDuration = DateTime.Minutes(10) }) + +AirAttackStart = { + easy = DateTime.Minutes(10), + normal = DateTime.Minutes(8), + hard = DateTime.Minutes(6), + vhard = DateTime.Minutes(5) + DateTime.Seconds(30), + brutal = DateTime.Minutes(5) +} + +AirAttackInterval = { + easy = DateTime.Minutes(2), + normal = DateTime.Minutes(2), + hard = DateTime.Minutes(2), + vhard = DateTime.Minutes(2), + brutal = DateTime.Minutes(2) +} + +HoldOutTime = { + easy = DateTime.Minutes(25), + normal = DateTime.Minutes(25), + hard = DateTime.Minutes(25), + vhard = DateTime.Minutes(25), + brutal = DateTime.Minutes(25) +} + +CyborgFactories = { CyborgFactory1, CyborgFactory2, CyborgFactory3, CyborgFactory4 } +CyborgTypes = { "n1c", "n1c", "n3c", "n5", "acol", "tplr", "enli", "rmbc" } +CyborgRallyPoints = { CyborgRally1.Location, CyborgRally2.Location } +MaxCyborgWaves = 50 + +HardAndAboveCompositions = { + { Units = { "e1", "e1", "e1", "e2", "e3", "3tnk", "3tnk", "btr.ai", "e3", "e1", "e2", "e1", "e1" }, MaxTime = DateTime.Minutes(19) }, + { Units = { "e1", "e1", "e1", "e2", "e3", "3tnk", "v2rl", "btr.ai", "e3", "e1", "e2", "e1", "e1" }, MinTime = DateTime.Minutes(4), MaxTime = DateTime.Minutes(8) }, + { Units = { "e1", "e1", "e1", "e2", "e3", "e1", "btr.ai", "3tnk", "ttra", "e3", "e1", "e2", "e1", "e1" }, MinTime = DateTime.Minutes(4), MaxTime = DateTime.Minutes(17) }, + { Units = { "e1", "e1", "e1", "e2", "e3", "4tnk", "btr.ai", "shok", "e8", "katy" }, MinTime = DateTime.Minutes(6), MaxTime = DateTime.Minutes(18) }, + { Units = { "shok", "shok", "shok", "shok", "shok", "ttnk", "ttnk", "shok", "e3", "ttra", "shok" }, MinTime = DateTime.Minutes(7) }, + { Units = { "e1", "e1", "e1", "e2", "e3", "e3", "e3", "3tnk", "3tnk", "btr.ai", "e2", "e3", "e1", "e1" }, MinTime = DateTime.Minutes(8) }, + { Units = { "e1", "e1", "e1", "e2", "e3", "e3", "4tnk", "v3rl", "v2rl", "e3", "shok", "e3", "e1", "e1", "e2", "btr.ai" }, MinTime = DateTime.Minutes(8) }, + { Units = { "e1", "e1", "e1", "e2", "e3", "e3", "3tnk", "3tnk", "e3", "3tnk", "btr.ai", "e1", "e1", "e2" }, MinTime = DateTime.Minutes(9) }, + { Units = { "e1", "e1", "e1", "e2", "e3", "e3", "shok", "apoc", "4tnk", "e3", "btr.ai", "v3rl" }, MinTime = DateTime.Minutes(10) }, + { Units = { "e1", "e1", "e1", "e2", "e3", "e3", "3tnk", "4tnk", "btr.ai", "btr.ai", "v3rl", "v3rl" }, MinTime = DateTime.Minutes(15) }, + { Units = { "e1", "e1", "e1", "e2", "e3", "e3", "e8", "e8", "4tnk.erad", "e3", "4tnk", "btr.ai", "btr.ai", "v3rl", "v3rl" }, MinTime = DateTime.Minutes(17) }, +} + +if IsVeryHardOrAbove then + table.insert(HardAndAboveCompositions, { + Units = { "e1", "e1", "e1", "e2", "cmsr", "e1", "e3", "ttrp", "cmsr", "ttrp", "ttrp", "e1", "e1", "e1", "cmsr", "e3", "e3", "e1", "e1", "e1", + "e1", "cmsr", "e1", "e2", "e1", "deso", "e1", "ttrp", "e1", "e1", "e1", "e1", "e1", "e1", "e1", "e1", "e1", "cmsr", "e1", "e2", "e3", "e1" + }, + MinTime = DateTime.Minutes(15), + IsSpecial = true + }) + + if Difficulty == "brutal" then + table.insert(HardAndAboveCompositions, { + Units = { "apoc.atomic", "apoc.atomic", "apoc.atomic", "apoc.atomic", "isu", "isu", "isu", "3tnk.rhino", "3tnk.rhino" }, + MinTime = DateTime.Minutes(15), + IsSpecial = true + }) + end +end + +GroundAttackCompositions = { + easy = { + { Units = { "e1", "e1", "e1", "e2", "e3", "btr.ai", "e1", "e1" } }, + { Units = { "e1", "e1", "e1", "e2", "e3", "3tnk", "katy", "e1", "e1" }, MinTime = DateTime.Minutes(6) }, + { Units = { "e1", "e1", "e1", "e2", "e3", "3tnk", "v2rl", "e1", "e1" }, MinTime = DateTime.Minutes(8) }, + { Units = { "shok", "shok", "shok", "ttnk", "ttra", "shok" }, MinTime = DateTime.Minutes(9) }, + { Units = { "e1", "e1", "e1", "e2", "e3", "v3rl", "e3", "e1", "e1", "e2" }, MinTime = DateTime.Minutes(12) }, + { Units = { "e1", "e1", "e1", "e2", "e3", "e3", "4tnk", "3tnk" }, MinTime = DateTime.Minutes(14) }, + { Units = { "e1", "e1", "e1", "e2", "e3", "v2rl", "e3", "v3rl" }, MinTime = DateTime.Minutes(17) }, + { Units = { "e1", "e1", "e1", "e2", "e3", "e3", "apoc", "v3rl", "btr.ai" }, MinTime = DateTime.Minutes(19) }, + }, + normal = { + { Units = { "e1", "e1", "e1", "e2", "e3", "3tnk", "btr.ai", "e3", "e1", "e2", "e1" } }, + { Units = { "e1", "e1", "e1", "e2", "e3", "3tnk", "katy", "e3", "e1", "e2", "e1" }, MinTime = DateTime.Minutes(4) }, + { Units = { "e1", "e1", "e1", "e2", "e3", "3tnk", "v2rl", "btr.ai" }, MinTime = DateTime.Minutes(6) }, + { Units = { "shok", "shok", "shok", "shok", "shok", "ttnk", "shok", "ttra", "shok" }, MinTime = DateTime.Minutes(8) }, + { Units = { "e1", "e1", "e1", "e2", "e3", "e3", "3tnk", "3tnk", "e3", "e1", "e1", "e2" }, MinTime = DateTime.Minutes(9) }, + { Units = { "e1", "e1", "e1", "e2", "e3", "e3", "4tnk", "v3rl", "e3", "e1", "e1", "e2", "e3" }, MinTime = DateTime.Minutes(10) }, + { Units = { "e1", "e1", "e1", "e2", "e3", "v3rl", "e3", "v3rl", "e3", "btr.ai", "e1", "e1", "e2", "e3" }, MinTime = DateTime.Minutes(17) }, + { Units = { "e1", "e1", "e1", "e2", "e3", "apoc", "e3", "v3rl", "btr.ai", "e3", "e1", "e1", "e2" }, MinTime = DateTime.Minutes(18) }, + { Units = { "e1", "e1", "e1", "e2", "e3", "e8", "4tnk.erad", "e3", "v3rl", "btr.ai", "e3", "e1", "e1", "e2" }, MinTime = DateTime.Minutes(19) }, + }, + hard = HardAndAboveCompositions, + vhard = HardAndAboveCompositions, + brutal = HardAndAboveCompositions, +} + +AirAttackCompositions = { + easy = { + { "mig" }, + { "yak" }, + { "hind" }, + { "suk" }, + }, + normal = { + { "mig", "mig" }, + { "yak", "hind" }, + { "hind", "mig" }, + { "suk", "yak" }, + { "kiro" }, + }, + hard = { + { "mig", "mig", "mig" }, + { "yak", "yak", "hind" }, + { "hind", "hind", "hind" }, + { "suk", "suk", "hind" }, + { "kiro", "kiro", "mig" }, + }, + vhard = { + { "mig", "mig", "mig" }, + { "yak", "yak", "hind" }, + { "hind", "hind", "hind" }, + { "suk", "suk", "hind" }, + { "kiro", "kiro", "mig" }, + }, + brutal = { + { "mig", "mig", "mig", "mig" }, + { "yak", "yak", "yak", "hind" }, + { "hind", "hind", "hind", "hind" }, + { "suk", "suk", "suk", "hind" }, + { "kiro", "kiro", "kiro", "mig" }, + }, +} + +-- Setup and Tick + +SetupPlayers = function() + Nod = Player.GetPlayer("Nod") + USSR = Player.GetPlayer("USSR") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = { Nod } + MissionEnemies = { USSR } +end + +WorldLoaded = function() + SetupPlayers() + + TimerTicks = HoldOutTime[Difficulty] + CyborgWaves = 0 + Camera.Position = PlayerStart.CenterPosition + + InitObjectives(Nod) + AdjustPlayerStartingCashForDifficulty() + InitUSSR() + + ObjectiveProtectTemple = Nod.AddObjective("Protect Temple Prime.") + + if IsHardOrAbove() then + Utils.Do(GetMissionPlayersActorsByType("mlrs"), function(a) + a.Destroy() + end) + end + + Trigger.AfterDelay(DateTime.Seconds(2), function() + MediaCA.PlaySound(MissionDir .. "/n_defendtemple.aud", 2) + end) + + Trigger.OnKilled(TemplePrime, function(self, killer) + if not Nod.IsObjectiveCompleted(ObjectiveProtectTemple) then + Nod.MarkFailedObjective(ObjectiveProtectTemple) + end + end) + + AfterWorldLoaded() +end + +Tick = function() + OncePerSecondChecks() + OncePerFiveSecondChecks() + AfterTick() +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + USSR.Resources = USSR.ResourceCapacity - 500 + + if TimerTicks > 0 then + if TimerTicks > 25 then + TimerTicks = TimerTicks - 25 + else + TimerTicks = 0 + end + + UserInterface.SetMissionText("Protect Temple Prime - Time Remaining: " .. UtilsCA.FormatTimeForGameSpeed(TimerTicks), HSLColor.Yellow) + + elseif not Nod.IsObjectiveCompleted(ObjectiveProtectTemple) then + UserInterface.SetMissionText("Destroy all Soviet forces.", HSLColor.Yellow) + ObjectiveDestroySovietForces = Nod.AddObjective("Destroy all Soviet forces.") + Nod.MarkCompletedObjective(ObjectiveProtectTemple) + + Utils.Do(MissionPlayers, function(p) + Actor.Create("cyborgspeed.upgrade", true, { Owner = p }) + Actor.Create("cyborgarmor.upgrade", true, { Owner = p }) + end) + + if not TemplePrime.IsDead then + TemplePrime.GrantCondition("awakening-complete") + end + + MediaCA.PlaySound(MissionDir .. "/n_cyborgscomplete.aud", 2) + DeployCyborgs() + + if ObjectiveDestroyBases ~= nil then + local sovietBuildings = USSR.GetActorsByTypes({ "mcv", "fact", "proc", "tsla" }) + local sovietHarvesters = USSR.GetActorsByType("harv") + + if #sovietBuildings == 0 then + Nod.MarkCompletedObjective(ObjectiveDestroyBases) + else + Nod.MarkFailedObjective(ObjectiveDestroyBases) + + Utils.Do(sovietBuildings, function(a) + a.Sell() + end) + end + + Utils.Do(sovietHarvesters, function(a) + if not a.IsDead then + a.Kill() + end + end) + end + + Trigger.AfterDelay(DateTime.Seconds(15), function() + CleanUp() + end) + + elseif ObjectiveDestroySovietForces ~= nil and not Nod.IsObjectiveCompleted(ObjectiveDestroySovietForces) and MissionPlayersHaveNoRequiredUnits() then + Nod.MarkFailedObjective(ObjectiveDestroySovietForces) + end + + if CyborgWaves >= MaxCyborgWaves then + if USSR.HasNoRequiredUnits() then + Nod.MarkCompletedObjective(ObjectiveDestroySovietForces) + end + end + end +end + +OncePerFiveSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 125 == 0 then + UpdatePlayerBaseLocations() + end +end + +InitUSSR = function() + AutoRepairAndRebuildBuildings(USSR, 15) + SetupRefAndSilosCaptureCredits(USSR) + InitAiUpgrades(USSR, 0) + + Actor.Create("ai.unlimited.power", true, { Owner = USSR }) + + local ussrGroundAttackers = USSR.GetGroundAttackers() + + Trigger.AfterDelay(GroundAttackInterval[Difficulty], function() + DoGroundAttack() + end) + + Trigger.AfterDelay(AirAttackStart[Difficulty], function() + DoAirAttack() + end) + + Trigger.AfterDelay(HaloDropStart, DoHaloDrop) + + BaseAttemptLocations = { + { SpawnLocation = AttackSpawn8.Location, DeployLocation = ConyardPosition1.Location, RefLocation = RefPosition1.Location, TeslaCoilLocation = TeslaCoilPosition1.Location }, + { SpawnLocation = AttackSpawn5.Location, DeployLocation = ConyardPosition2.Location, RefLocation = RefPosition2.Location, TeslaCoilLocation = TeslaCoilPosition2.Location }, + { SpawnLocation = AttackSpawn2.Location, DeployLocation = ConyardPosition3.Location, RefLocation = RefPosition3.Location, TeslaCoilLocation = TeslaCoilPosition3.Location }, + } + + BaseAttemptTimes = { DateTime.Seconds(543), DateTime.Seconds(755), DateTime.Seconds(954) } + local attemptCount = 0 + + Utils.Do(Utils.Shuffle(BaseAttemptLocations), function(attempt) + attemptCount = attemptCount + 1 + Trigger.AfterDelay(BaseAttemptTimes[attemptCount], function() + if ObjectiveDestroyBases == nil then + Notification("The Soviets are attempting to set up a base in the area.") + MediaCA.PlaySound(MissionDir .. "/n_sovietbase.aud", 2) + ObjectiveDestroyBases = Nod.AddSecondaryObjective("Crush any Soviet attempts to establish a base\nbefore the timer runs out.") + else + Notification("The Soviets are attempting to set up another base.") + MediaCA.PlaySound(MissionDir .. "/n_anothersovietbase.aud", 2) + end + Reinforcements.Reinforce(USSR, { "mcv" }, { attempt.SpawnLocation, attempt.DeployLocation }, 0, function(a) + a.Deploy() + Trigger.AfterDelay(DateTime.Seconds(2), function() + Actor.Create("proc", true, { Owner = USSR, Location = attempt.RefLocation }) + end) + Trigger.AfterDelay(DateTime.Seconds(3), function() + Actor.Create("tsla", true, { Owner = USSR, Location = attempt.TeslaCoilLocation }) + end) + end) + end) + end) +end + +DoGroundAttack = function(isAdditional) + local randomAttackPath = Utils.Random(AttackPaths) + local difficultyCompositions = GroundAttackCompositions[Difficulty] + local validCompositions = Utils.Where(difficultyCompositions, function(c) + return (c.MinTime == nil or DateTime.GameTime >= c.MinTime) and (c.MaxTime == nil or DateTime.GameTime <= c.MaxTime) + end) + if #validCompositions > 0 then + local randomComposition = Utils.Random(validCompositions) + + local units = Reinforcements.Reinforce(USSR, randomComposition.Units, randomAttackPath, 25, function(a) + a.Scatter() + a.Scatter() + Trigger.AfterDelay(DateTime.Seconds(2), function() + AssaultPlayerBaseOrHunt(a) + end) + end) + + if not isAdditional and CyborgWaves < MaxCyborgWaves then + Trigger.AfterDelay(GroundAttackInterval[Difficulty], DoGroundAttack) + + if DateTime.GameTime >= DateTime.Minutes(24) then + Trigger.AfterDelay(DateTime.Seconds(3), function() + DoGroundAttack(true) + end) + end + if DateTime.GameTime >= DateTime.Minutes(23) then + Trigger.AfterDelay(DateTime.Seconds(5), function() + DoGroundAttack(true) + end) + end + if DateTime.GameTime >= DateTime.Minutes(22) then + Trigger.AfterDelay(DateTime.Seconds(7), function() + DoGroundAttack(true) + end) + end + end + end +end + +DoAirAttack = function() + local randomAttackPath = Utils.Random(AttackPaths) + local randomComposition = Utils.Random(AirAttackCompositions[Difficulty]) + + local units = Reinforcements.Reinforce(USSR, randomComposition, randomAttackPath, 25, function(a) + Trigger.AfterDelay(DateTime.Seconds(2), function() + InitAttackAircraft(a, Nod, { "nuke", "nuk2", "obli", "gun.nod", "mlrs", "arty.nod", "harv.td", "ltnk" }) + end) + end) + + if CyborgWaves < MaxCyborgWaves then + Trigger.AfterDelay(AirAttackInterval[Difficulty], DoAirAttack) + end +end + +DoHaloDrop = function() + local entryPath = Utils.Random(HaloDropPaths) + local haloDropUnits = { "e1", "e1", "e1", "e2", "e3", "e4" } + + if IsHardOrAbove() and DateTime.GameTime > DateTime.Minutes(15) then + haloDropUnits = { "e1", "e1", "e1", "e1", "e2", "e2", "e3", "e3", "e4", "shok" } + end + + DoHelicopterDrop(USSR, entryPath, "halo.paradrop", haloDropUnits, AssaultPlayerBaseOrHunt, function(t) + Trigger.AfterDelay(DateTime.Seconds(5), function() + if not t.IsDead then + t.Move(entryPath[1]) + t.Destroy() + end + end) + end) + + if CyborgWaves < MaxCyborgWaves then + local delayUntilNext = CalculateInterval(GetTotalCostOfUnits(haloDropUnits), HaloDropAttackValue, HaloDropStart) + Trigger.AfterDelay(delayUntilNext, DoHaloDrop) + end +end + +DeployCyborgs = function() + if CyborgWaves == 0 then + CyborgFactory1.RallyPoint = CyborgRally1.Location + CyborgFactory2.RallyPoint = CyborgRally2.Location + CyborgFactory3.RallyPoint = CyborgRally1.Location + CyborgFactory4.RallyPoint = CyborgRally2.Location + end + + Utils.Do(CyborgFactories, function(f) + if not f.IsDead then + local randomCyborg = Utils.Random(CyborgTypes) + f.Produce(randomCyborg) + end + end) + + if not TemplePrime.IsDead then + TemplePrime.Produce("rmbc") + CyborgWaves = CyborgWaves + 1 + end + + if CyborgWaves < MaxCyborgWaves then + Trigger.AfterDelay(DateTime.Seconds(2), DeployCyborgs) + end +end + +CleanUp = function() + local sovietForces = USSR.GetGroundAttackers() + + if #sovietForces == 0 then + return + end + + Utils.Do(sovietForces, function(a) + a.Stop() + Trigger.ClearAll(a) + AssaultPlayerBaseOrHunt(a) + end) + + Trigger.AfterDelay(DateTime.Seconds(30), function() + CleanUp() + end) +end diff --git a/mods/ca/missions/main-campaign/ca11-awakening/map.bin b/mods/ca/missions/main-campaign/ca11-awakening/map.bin new file mode 100644 index 0000000000..193dcee867 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca11-awakening/map.bin differ diff --git a/mods/ca/missions/main-campaign/ca11-awakening/map.png b/mods/ca/missions/main-campaign/ca11-awakening/map.png new file mode 100644 index 0000000000..6951fcafed Binary files /dev/null and b/mods/ca/missions/main-campaign/ca11-awakening/map.png differ diff --git a/mods/ca/missions/main-campaign/ca11-awakening/map.yaml b/mods/ca/missions/main-campaign/ca11-awakening/map.yaml new file mode 100644 index 0000000000..0d5c94c1dc --- /dev/null +++ b/mods/ca/missions/main-campaign/ca11-awakening/map.yaml @@ -0,0 +1,1776 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 11: Awakening + +Author: Darkademic + +Tileset: DESERT + +MapSize: 130,98 + +Bounds: 1,1,128,96 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: Nod, USSR + PlayerReference@Nod: + Name: Nod + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: nod + LockColor: True + Color: FE1100 + LockSpawn: True + LockTeam: True + Enemies: USSR, Creeps + PlayerReference@USSR: + Name: USSR + Bot: campaign + Faction: soviet + Color: 994050 + Enemies: Nod, Creeps + +Actors: + Actor0: tmpl + Owner: Nod + Location: 64,75 + Actor1: nsam + Owner: Nod + Location: 61,76 + Actor2: nsam + Owner: Nod + Location: 68,76 + CyborgFactory1: bio + Owner: Nod + Location: 63,79 + CyborgFactory2: bio + Owner: Nod + Location: 66,79 + Actor5: nsam + Owner: Nod + Location: 58,80 + Actor6: nsam + Owner: Nod + Location: 71,80 + TemplePrime: tmpp + Owner: Nod + Location: 64,82 + CyborgFactory3: bio + Owner: Nod + Location: 63,86 + CyborgFactory4: bio + Owner: Nod + Location: 66,86 + Actor10: rock1 + Owner: Neutral + Location: 56,76 + Actor11: brik + Owner: Nod + Location: 91,77 + Actor12: brik + Owner: Nod + Location: 91,79 + Actor13: brik + Owner: Nod + Location: 91,78 + Actor14: brik + Owner: Nod + Location: 90,79 + Actor15: brik + Owner: Nod + Location: 90,78 + Actor16: brik + Owner: Nod + Location: 91,76 + Actor17: brik + Owner: Nod + Location: 91,75 + Actor18: brik + Owner: Nod + Location: 91,74 + Actor19: brik + Owner: Nod + Location: 90,74 + Actor20: brik + Owner: Nod + Location: 90,75 + Actor21: brik + Owner: Nod + Location: 91,86 + Actor22: brik + Owner: Nod + Location: 90,86 + Actor23: brik + Owner: Nod + Location: 90,87 + Actor24: brik + Owner: Nod + Location: 91,87 + Actor25: brik + Owner: Nod + Location: 91,88 + Actor26: brik + Owner: Nod + Location: 91,89 + Actor27: brik + Owner: Nod + Location: 91,90 + Actor28: brik + Owner: Nod + Location: 91,91 + Actor29: brik + Owner: Nod + Location: 90,91 + Actor30: brik + Owner: Nod + Location: 90,90 + Actor31: brik + Owner: Nod + Location: 90,92 + Actor32: brik + Owner: Nod + Location: 90,93 + Actor33: brik + Owner: Nod + Location: 90,94 + Actor34: brik + Owner: Nod + Location: 90,95 + Actor35: brik + Owner: Nod + Location: 90,96 + Actor36: brik + Owner: Nod + Location: 85,96 + Actor37: brik + Owner: Nod + Location: 87,96 + Actor38: brik + Owner: Nod + Location: 86,96 + Actor39: brik + Owner: Nod + Location: 88,96 + Actor40: brik + Owner: Nod + Location: 89,96 + Actor41: brik + Owner: Nod + Location: 85,95 + Actor42: brik + Owner: Nod + Location: 84,95 + Actor43: brik + Owner: Nod + Location: 84,94 + Actor44: brik + Owner: Nod + Location: 84,93 + Actor45: brik + Owner: Nod + Location: 84,92 + Actor46: brik + Owner: Nod + Location: 84,91 + Actor47: brik + Owner: Nod + Location: 83,91 + Actor48: brik + Owner: Nod + Location: 82,91 + Actor49: brik + Owner: Nod + Location: 81,91 + Actor50: brik + Owner: Nod + Location: 81,90 + Actor51: brik + Owner: Nod + Location: 82,90 + Actor52: obli + Owner: Nod + Location: 90,77 + Actor53: obli + Owner: Nod + Location: 90,88 + Actor54: gun.nod + Owner: Nod + Location: 92,87 + TurretFacing: 785 + Actor55: gun.nod + Owner: Nod + Location: 92,78 + TurretFacing: 769 + Actor56: gun.nod + Owner: Nod + Location: 92,82 + TurretFacing: 777 + Actor57: brik + Owner: Nod + Location: 85,58 + Actor58: brik + Owner: Nod + Location: 85,59 + Actor59: brik + Owner: Nod + Location: 86,58 + Actor60: brik + Owner: Nod + Location: 86,59 + Actor61: brik + Owner: Nod + Location: 87,58 + Actor62: brik + Owner: Nod + Location: 87,59 + Actor63: brik + Owner: Nod + Location: 87,60 + Actor65: brik + Owner: Nod + Location: 87,61 + Actor66: brik + Owner: Nod + Location: 86,61 + Actor67: brik + Owner: Nod + Location: 86,62 + Actor68: brik + Owner: Nod + Location: 86,63 + Actor69: brik + Owner: Nod + Location: 86,64 + Actor70: brik + Owner: Nod + Location: 87,64 + Actor71: brik + Owner: Nod + Location: 87,65 + Actor72: brik + Owner: Nod + Location: 86,65 + Actor73: brik + Owner: Nod + Location: 80,58 + Actor74: brik + Owner: Nod + Location: 81,58 + Actor75: brik + Owner: Nod + Location: 81,59 + Actor76: brik + Owner: Nod + Location: 80,59 + Actor77: brik + Owner: Nod + Location: 79,58 + Actor78: brik + Owner: Nod + Location: 78,58 + Actor79: brik + Owner: Nod + Location: 77,58 + Actor80: brik + Owner: Nod + Location: 77,59 + Actor81: brik + Owner: Nod + Location: 76,58 + Actor82: brik + Owner: Nod + Location: 76,59 + Actor83: brik + Owner: Nod + Location: 62,57 + Actor84: brik + Owner: Nod + Location: 62,58 + Actor85: brik + Owner: Nod + Location: 63,57 + Actor86: brik + Owner: Nod + Location: 63,58 + Actor87: brik + Owner: Nod + Location: 61,57 + Actor88: brik + Owner: Nod + Location: 60,57 + Actor89: brik + Owner: Nod + Location: 59,57 + Actor90: brik + Owner: Nod + Location: 59,58 + Actor91: brik + Owner: Nod + Location: 60,58 + Actor92: brik + Owner: Nod + Location: 55,58 + Actor93: brik + Owner: Nod + Location: 55,57 + Actor94: brik + Owner: Nod + Location: 54,57 + Actor95: brik + Owner: Nod + Location: 54,58 + Actor96: brik + Owner: Nod + Location: 53,57 + Actor97: brik + Owner: Nod + Location: 52,57 + Actor98: brik + Owner: Nod + Location: 51,57 + Actor99: brik + Owner: Nod + Location: 51,58 + Actor100: brik + Owner: Nod + Location: 52,58 + Actor101: brik + Owner: Nod + Location: 45,61 + Actor102: brik + Owner: Nod + Location: 46,61 + Actor103: brik + Owner: Nod + Location: 47,61 + Actor104: brik + Owner: Nod + Location: 47,62 + Actor105: brik + Owner: Nod + Location: 46,62 + Actor106: brik + Owner: Nod + Location: 43,61 + Actor107: brik + Owner: Nod + Location: 44,61 + Actor108: brik + Owner: Nod + Location: 43,62 + Actor109: brik + Owner: Nod + Location: 44,62 + Actor110: brik + Owner: Nod + Location: 43,63 + Actor111: brik + Owner: Nod + Location: 43,64 + Actor112: brik + Owner: Nod + Location: 43,65 + Actor113: brik + Owner: Nod + Location: 44,65 + Actor114: brik + Owner: Nod + Location: 44,64 + Actor115: brik + Owner: Nod + Location: 43,69 + Actor116: brik + Owner: Nod + Location: 44,69 + Actor117: brik + Owner: Nod + Location: 43,70 + Actor118: brik + Owner: Nod + Location: 44,70 + Actor119: brik + Owner: Nod + Location: 43,71 + Actor120: brik + Owner: Nod + Location: 43,72 + Actor121: brik + Owner: Nod + Location: 43,73 + Actor122: brik + Owner: Nod + Location: 43,74 + Actor123: brik + Owner: Nod + Location: 43,75 + Actor124: brik + Owner: Nod + Location: 43,76 + Actor125: brik + Owner: Nod + Location: 44,76 + Actor126: brik + Owner: Nod + Location: 44,75 + Actor127: brik + Owner: Nod + Location: 43,80 + Actor128: brik + Owner: Nod + Location: 44,80 + Actor129: brik + Owner: Nod + Location: 43,81 + Actor130: brik + Owner: Nod + Location: 44,81 + Actor131: brik + Owner: Nod + Location: 43,82 + Actor132: brik + Owner: Nod + Location: 43,83 + Actor133: brik + Owner: Nod + Location: 43,84 + Actor134: brik + Owner: Nod + Location: 43,85 + Actor135: brik + Owner: Nod + Location: 43,86 + Actor136: brik + Owner: Nod + Location: 43,87 + Actor137: brik + Owner: Nod + Location: 44,87 + Actor138: brik + Owner: Nod + Location: 44,86 + Actor139: obli + Owner: Nod + Location: 53,58 + Actor140: obli + Owner: Nod + Location: 61,58 + Actor141: obli + Owner: Nod + Location: 45,62 + Actor142: obli + Owner: Nod + Location: 44,63 + Actor143: obli + Owner: Nod + Location: 44,71 + Actor144: obli + Owner: Nod + Location: 44,74 + Actor145: obli + Owner: Nod + Location: 44,82 + Actor146: obli + Owner: Nod + Location: 44,85 + Actor147: obli + Owner: Nod + Location: 79,59 + Actor148: obli + Owner: Nod + Location: 86,60 + Actor149: obli + Owner: Nod + Location: 74,49 + Actor150: nuk2 + Owner: Nod + Location: 63,69 + Actor151: nuk2 + Owner: Nod + Location: 65,69 + Actor152: nuk2 + Owner: Nod + Location: 67,69 + Actor153: nuk2 + Owner: Nod + Location: 69,69 + Actor154: nuk2 + Owner: Nod + Location: 63,66 + Actor155: nuk2 + Owner: Nod + Location: 65,66 + Actor156: nuk2 + Owner: Nod + Location: 67,66 + Actor157: nuk2 + Owner: Nod + Location: 69,66 + Actor158: chain + Owner: Nod + Location: 62,72 + Actor159: chain + Owner: Nod + Location: 63,72 + Actor160: chain + Owner: Nod + Location: 65,72 + Actor161: chain + Owner: Nod + Location: 64,72 + Actor162: chain + Owner: Nod + Location: 67,72 + Actor163: chain + Owner: Nod + Location: 66,72 + Actor164: chain + Owner: Nod + Location: 68,72 + Actor165: chain + Owner: Nod + Location: 69,72 + Actor166: chain + Owner: Nod + Location: 70,72 + Actor167: chain + Owner: Nod + Location: 71,72 + Actor168: chain + Owner: Nod + Location: 71,71 + Actor169: chain + Owner: Nod + Location: 71,69 + Actor170: chain + Owner: Nod + Location: 71,67 + Actor171: chain + Owner: Nod + Location: 71,68 + Actor172: chain + Owner: Nod + Location: 71,70 + Actor173: chain + Owner: Nod + Location: 62,71 + Actor174: chain + Owner: Nod + Location: 62,70 + Actor175: chain + Owner: Nod + Location: 62,69 + Actor176: chain + Owner: Nod + Location: 62,68 + Actor177: chain + Owner: Nod + Location: 62,67 + Actor178: chain + Owner: Nod + Location: 62,66 + Actor179: chain + Owner: Nod + Location: 62,65 + Actor180: chain + Owner: Nod + Location: 63,65 + Actor181: chain + Owner: Nod + Location: 64,65 + Actor182: chain + Owner: Nod + Location: 66,65 + Actor183: chain + Owner: Nod + Location: 65,65 + Actor184: chain + Owner: Nod + Location: 67,65 + Actor185: chain + Owner: Nod + Location: 68,65 + Actor186: chain + Owner: Nod + Location: 69,65 + Actor187: chain + Owner: Nod + Location: 70,65 + Actor188: chain + Owner: Nod + Location: 71,65 + Actor189: chain + Owner: Nod + Location: 71,66 + Actor190: afac + Owner: Nod + Location: 58,67 + Actor191: airs + Owner: Nod + Location: 67,59 + Actor193: hq + Owner: Nod + Location: 75,65 + Actor194: rep + Owner: Nod + Location: 49,76 + Actor195: hand + Owner: Nod + Location: 79,63 + Actor196: hand + Owner: Nod + Location: 56,62 + Actor197: hand + Owner: Nod + Location: 50,70 + Actor198: hpad.td + Owner: Nod + Location: 78,80 + Actor199: hpad.td + Owner: Nod + Location: 78,76 + Actor200: hpad.td + Owner: Nod + Location: 81,78 + Actor201: proc.td + Owner: Nod + Location: 85,72 + Actor202: proc.td + Owner: Nod + Location: 87,67 + Actor203: nuk2 + Owner: Nod + Location: 79,68 + Actor204: nuk2 + Owner: Nod + Location: 79,71 + Actor205: nuk2 + Owner: Nod + Location: 55,67 + Actor206: nuk2 + Owner: Nod + Location: 53,67 + Actor207: nuk2 + Owner: Nod + Location: 64,61 + Actor208: nuk2 + Owner: Nod + Location: 62,61 + Actor209: nuk2 + Owner: Nod + Location: 54,86 + Actor210: nuk2 + Owner: Nod + Location: 52,86 + Actor211: nuk2 + Owner: Nod + Location: 75,86 + Actor212: nsam + Owner: Nod + Location: 57,88 + Actor213: nsam + Owner: Nod + Location: 72,88 + Actor214: nsam + Owner: Nod + Location: 71,50 + Actor215: nsam + Owner: Nod + Location: 66,56 + Actor216: nsam + Owner: Nod + Location: 59,63 + Actor217: nsam + Owner: Nod + Location: 46,72 + Actor218: nsam + Owner: Nod + Location: 46,83 + Actor219: nsam + Owner: Nod + Location: 46,64 + Actor220: nsam + Owner: Nod + Location: 85,67 + Actor221: nsam + Owner: Nod + Location: 89,73 + Actor222: nsam + Owner: Nod + Location: 87,87 + Actor223: nuk2 + Owner: Nod + Location: 88,93 + Actor224: nuk2 + Owner: Nod + Location: 86,93 + Actor225: nuk2 + Owner: Nod + Location: 86,90 + Actor226: nuk2 + Owner: Nod + Location: 88,90 + Actor227: gun.nod + Owner: Nod + Location: 42,81 + Actor228: gun.nod + Owner: Nod + Location: 42,75 + TurretFacing: 277 + Actor229: gun.nod + Owner: Nod + Location: 42,70 + TurretFacing: 245 + Actor230: gun.nod + Owner: Nod + Location: 42,64 + TurretFacing: 245 + Actor231: gun.nod + Owner: Nod + Location: 46,60 + Actor233: gun.nod + Owner: Nod + Location: 54,56 + TurretFacing: 118 + Actor234: gun.nod + Owner: Nod + Location: 60,56 + TurretFacing: 0 + Actor235: gun.nod + Owner: Nod + Location: 50,57 + Actor236: gun.nod + Owner: Nod + Location: 80,57 + TurretFacing: 15 + Actor237: gun.nod + Owner: Nod + Location: 86,57 + TurretFacing: 0 + Actor238: rep + Owner: Nod + Location: 83,81 + Actor239: rep + Owner: Nod + Location: 73,61 + Actor240: airs + Owner: Nod + Location: 49,81 + Actor243: nuk2 + Owner: Nod + Location: 50,86 + Actor244: nuk2 + Owner: Nod + Location: 77,88 + Actor245: obli + Owner: Nod + Location: 74,78 + Actor246: obli + Owner: Nod + Location: 69,87 + Actor247: obli + Owner: Nod + Location: 61,87 + Actor248: obli + Owner: Nod + Location: 55,73 + Actor249: ltur + Owner: Nod + Location: 56,79 + TurretFacing: 245 + Actor250: ltur + Owner: Nod + Location: 75,81 + TurretFacing: 721 + Actor251: ltur + Owner: Nod + Location: 73,85 + TurretFacing: 745 + Actor252: ltur + Owner: Nod + Location: 57,85 + TurretFacing: 293 + SSM1: mlrs + Owner: Nod + Location: 72,52 + Facing: 919 + SSM2: mlrs + Owner: Nod + Location: 89,75 + Facing: 634 + SSM3: mlrs + Owner: Nod + Location: 88,88 + Facing: 769 + SSM4: mlrs + Owner: Nod + Location: 45,83 + Facing: 261 + SSM5: mlrs + Owner: Nod + Location: 45,72 + Facing: 253 + SSM6: mlrs + Owner: Nod + Location: 49,62 + Facing: 126 + SSM7: mlrs + Owner: Nod + Location: 64,57 + Facing: 95 + Actor260: split2 + Owner: Neutral + Location: 101,91 + Actor261: split2 + Owner: Neutral + Location: 111,86 + Actor262: split2 + Owner: Neutral + Location: 123,91 + Actor263: split2 + Owner: Neutral + Location: 99,74 + Actor264: rock1 + Owner: Neutral + Location: 64,50 + Actor265: rock6 + Owner: Neutral + Location: 54,46 + Actor266: rock2 + Owner: Neutral + Location: 32,41 + Actor267: rock4 + Owner: Neutral + Location: 14,59 + Actor268: rock5 + Owner: Neutral + Location: 12,63 + Actor269: rock1 + Owner: Neutral + Location: 10,44 + Actor270: rock3 + Owner: Neutral + Location: 24,44 + Actor271: rock7 + Owner: Neutral + Location: 93,36 + Actor274: tc01 + Owner: Neutral + Location: 38,47 + Actor275: tc01 + Owner: Neutral + Location: 13,49 + Actor276: tc01 + Owner: Neutral + Location: 5,27 + Actor277: tc01 + Owner: Neutral + Location: 33,25 + Actor278: tc01 + Owner: Neutral + Location: 60,10 + Actor279: tc01 + Owner: Neutral + Location: 84,26 + Actor280: tc01 + Owner: Neutral + Location: 109,47 + Actor281: tc01 + Owner: Neutral + Location: 109,26 + Actor282: tc01 + Owner: Neutral + Location: 102,62 + Actor284: tc01 + Owner: Neutral + Location: 121,78 + Actor285: tc01 + Owner: Neutral + Location: 34,91 + Actor286: tc01 + Owner: Neutral + Location: 27,76 + Actor287: tc01 + Owner: Neutral + Location: 18,16 + Actor288: rock6 + Owner: Neutral + Location: 22,71 + Actor289: rock6 + Owner: Neutral + Location: 113,32 + Actor290: rock6 + Owner: Neutral + Location: 76,13 + Actor291: rock1 + Owner: Neutral + Location: 116,76 + Actor292: rock1 + Owner: Neutral + Location: 40,8 + Actor293: rock4 + Owner: Neutral + Location: 41,7 + Actor294: rock4 + Owner: Neutral + Location: 57,23 + Actor295: rock4 + Owner: Neutral + Location: 22,84 + Actor296: rock2 + Owner: Neutral + Location: 107,20 + Actor297: t09 + Owner: Neutral + Location: 83,54 + Actor298: t09 + Owner: Neutral + Location: 59,36 + Actor299: t08 + Owner: Neutral + Location: 28,58 + Actor300: t08 + Owner: Neutral + Location: 56,27 + Actor301: t08 + Owner: Neutral + Location: 37,3 + Actor302: t08 + Owner: Neutral + Location: 111,5 + Actor303: t08 + Owner: Neutral + Location: 113,37 + Actor304: t08 + Owner: Neutral + Location: 103,38 + Actor305: t08 + Owner: Neutral + Location: 111,60 + Actor306: t08 + Owner: Neutral + Location: 109,76 + Actor307: t08 + Owner: Neutral + Location: 126,58 + Actor308: t08 + Owner: Neutral + Location: 35,80 + Actor309: t08 + Owner: Neutral + Location: 39,22 + Actor310: t08 + Owner: Neutral + Location: 13,15 + Actor311: t08 + Owner: Neutral + Location: 8,38 + Actor312: t08 + Owner: Neutral + Location: 86,50 + Actor313: v28 + Owner: Neutral + Location: 109,16 + Actor314: v24 + Owner: Neutral + Location: 111,12 + Actor315: v25 + Owner: Neutral + Location: 121,7 + Actor316: v31 + Owner: Neutral + Location: 123,13 + Actor317: v22 + Owner: Neutral + Location: 124,11 + Actor318: v21 + Owner: Neutral + Location: 119,19 + Actor319: v20 + Owner: Neutral + Location: 105,12 + Actor320: v36 + Owner: Neutral + Location: 104,18 + Actor321: v26 + Owner: Neutral + Location: 115,16 + Actor322: v27 + Owner: Neutral + Location: 116,8 + Actor323: v30 + Owner: Neutral + Location: 108,23 + Actor324: v23 + Owner: Neutral + Location: 113,18 + Actor325: v28 + Owner: Neutral + Location: 114,2 + Actor326: v29 + Owner: Neutral + Location: 125,8 + Actor327: v34 + Owner: Neutral + Location: 121,12 + Actor328: v35 + Owner: Neutral + Location: 113,9 + Actor329: v32 + Owner: Neutral + Location: 101,21 + Actor330: t04 + Owner: Neutral + Location: 101,15 + Actor331: t04 + Owner: Neutral + Location: 119,14 + Actor332: rock2 + Owner: Neutral + Location: 10,2 + Actor333: t08 + Owner: Neutral + Location: 9,5 + Actor334: t18 + Owner: Neutral + Location: 25,1 + Actor335: t09 + Owner: Neutral + Location: 25,8 + Actor336: t04 + Owner: Neutral + Location: 7,10 + Actor337: t04 + Owner: Neutral + Location: 21,21 + Actor338: t08 + Owner: Neutral + Location: 19,26 + Actor340: t09 + Owner: Neutral + Location: 21,41 + Actor341: t09 + Owner: Neutral + Location: 43,41 + Actor342: t09 + Owner: Neutral + Location: 35,62 + Actor343: rock4 + Owner: Neutral + Location: 28,62 + Actor344: t18 + Owner: Neutral + Location: 122,61 + Actor345: rock1 + Owner: Neutral + Location: 124,54 + Actor346: rock4 + Owner: Neutral + Location: 127,63 + Actor347: rock4 + Owner: Neutral + Location: 103,52 + Actor348: rock5 + Owner: Neutral + Location: 95,57 + Actor349: ltnk + Owner: Nod + Location: 40,76 + Facing: 256 + Actor350: ltnk + Owner: Nod + Location: 38,67 + Facing: 256 + Actor351: ltnk + Owner: Nod + Location: 40,62 + Facing: 256 + Actor352: ltnk + Owner: Nod + Location: 40,81 + Facing: 256 + Actor353: ltnk + Owner: Nod + Location: 45,59 + Facing: 111 + Actor354: ltnk + Owner: Nod + Location: 49,55 + Facing: 118 + Actor355: ltnk + Owner: Nod + Location: 56,55 + Facing: 0 + Actor356: ltnk + Owner: Nod + Location: 62,53 + Facing: 0 + Actor357: ltnk + Owner: Nod + Location: 85,55 + Facing: 0 + Actor358: ltnk + Owner: Nod + Location: 78,54 + Facing: 0 + Actor359: ltnk + Owner: Nod + Location: 90,84 + Facing: 753 + Actor360: bike + Owner: Nod + Facing: 384 + Location: 49,84 + Actor361: bike + Owner: Nod + Facing: 384 + Location: 50,84 + Actor362: bike + Owner: Nod + Facing: 384 + Location: 51,84 + Actor363: bike + Owner: Nod + Facing: 384 + Location: 68,62 + Actor364: bike + Owner: Nod + Facing: 384 + Location: 69,62 + Actor365: bike + Owner: Nod + Facing: 384 + Location: 67,62 + Actor366: stnk.nod + Owner: Nod + Facing: 384 + Location: 59,83 + Actor367: stnk.nod + Owner: Nod + Facing: 384 + Location: 56,81 + Actor368: stnk.nod + Owner: Nod + Location: 72,82 + Facing: 666 + Actor369: hftk + Owner: Nod + Location: 86,78 + Facing: 658 + Actor370: hftk + Owner: Nod + Location: 52,62 + Facing: 118 + Actor371: ftnk + Owner: Nod + Location: 83,61 + Facing: 0 + Actor372: n1 + Owner: Nod + SubCell: 3 + Location: 41,82 + Facing: 206 + Actor373: n1 + Owner: Nod + Location: 41,82 + SubCell: 1 + Facing: 198 + Actor374: n1 + Owner: Nod + SubCell: 3 + Location: 42,80 + Facing: 190 + Actor375: n1 + Owner: Nod + SubCell: 3 + Location: 41,76 + Facing: 214 + Actor376: n1 + Owner: Nod + Location: 41,75 + SubCell: 3 + Facing: 222 + Actor377: n1 + Owner: Nod + Location: 41,75 + SubCell: 1 + Facing: 237 + Actor378: n1 + Owner: Nod + SubCell: 3 + Location: 41,72 + Facing: 206 + Actor379: n1 + Owner: Nod + Location: 42,69 + SubCell: 3 + Facing: 158 + Actor380: n1 + Owner: Nod + Location: 42,69 + SubCell: 1 + Facing: 190 + Actor381: n1 + Owner: Nod + SubCell: 3 + Location: 41,64 + Facing: 384 + Actor382: n1 + Owner: Nod + SubCell: 3 + Location: 41,62 + Facing: 384 + Actor383: n1 + Owner: Nod + Location: 41,62 + SubCell: 1 + Facing: 150 + Actor384: n1 + Owner: Nod + SubCell: 3 + Location: 44,60 + Facing: 277 + Actor385: n1 + Owner: Nod + SubCell: 3 + Location: 46,58 + Facing: 174 + Actor386: n1 + Owner: Nod + SubCell: 3 + Location: 49,58 + Facing: 198 + Actor387: n1 + Owner: Nod + SubCell: 3 + Location: 50,56 + Facing: 0 + Actor388: n1 + Owner: Nod + Location: 50,56 + SubCell: 1 + Facing: 198 + Actor389: n1 + Owner: Nod + SubCell: 3 + Location: 48,56 + Facing: 0 + Actor390: n1 + Owner: Nod + SubCell: 3 + Location: 56,56 + Facing: 0 + Actor391: n1 + Owner: Nod + SubCell: 3 + Location: 59,55 + Facing: 39 + Actor392: n1 + Owner: Nod + SubCell: 3 + Location: 61,56 + Facing: 0 + Actor393: n1 + Owner: Nod + SubCell: 3 + Location: 62,54 + Facing: 142 + Actor394: n1 + Owner: Nod + Location: 62,54 + SubCell: 1 + Facing: 0 + Actor395: n1 + Owner: Nod + SubCell: 3 + Location: 77,55 + Facing: 0 + Actor396: n1 + Owner: Nod + SubCell: 3 + Location: 77,53 + Facing: 0 + Actor397: n1 + Owner: Nod + Location: 77,53 + SubCell: 1 + Facing: 0 + Actor398: n1 + Owner: Nod + SubCell: 3 + Location: 81,55 + Facing: 0 + Actor399: n1 + Owner: Nod + SubCell: 3 + Location: 80,54 + Facing: 39 + Actor400: n1 + Owner: Nod + SubCell: 3 + Location: 85,54 + Facing: 919 + Actor401: n1 + Owner: Nod + Location: 85,54 + SubCell: 1 + Facing: 745 + Actor402: n1 + Owner: Nod + SubCell: 3 + Location: 87,55 + Facing: 721 + Actor403: n1 + Owner: Nod + SubCell: 3 + Location: 92,80 + Facing: 856 + Actor404: n1 + Owner: Nod + Location: 92,80 + SubCell: 1 + Facing: 793 + Actor405: n1 + Owner: Nod + SubCell: 3 + Location: 92,84 + Facing: 737 + Actor406: n1 + Owner: Nod + SubCell: 3 + Location: 93,86 + Facing: 872 + Actor407: n1 + Owner: Nod + Location: 93,86 + SubCell: 1 + Facing: 785 + Actor408: n1 + Owner: Nod + SubCell: 3 + Location: 92,85 + Facing: 626 + Actor409: mech + Owner: Nod + Facing: 384 + Location: 84,80 + SubCell: 3 + Actor410: mech + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 87,82 + Actor411: mech + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 86,85 + Actor412: mech + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 81,84 + Actor413: mech + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 48,78 + Actor414: mech + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 49,75 + Actor415: mech + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 52,79 + Actor416: mech + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 52,76 + Actor417: mech + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 72,64 + Actor418: mech + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 72,61 + Actor419: mech + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 77,63 + Actor420: mech + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 76,61 + Actor421: n4 + Owner: Nod + SubCell: 3 + Location: 90,81 + Facing: 745 + Actor422: n4 + Owner: Nod + SubCell: 3 + Location: 89,85 + Facing: 737 + Actor423: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 87,77 + Actor424: n4 + Owner: Nod + SubCell: 3 + Location: 84,60 + Facing: 0 + Actor425: n4 + Owner: Nod + SubCell: 3 + Location: 80,61 + Facing: 0 + Actor426: n4 + Owner: Nod + SubCell: 3 + Location: 57,58 + Facing: 15 + Actor427: n4 + Owner: Nod + SubCell: 3 + Location: 42,67 + Facing: 190 + Actor428: n4 + Owner: Nod + SubCell: 3 + Location: 42,79 + Facing: 317 + Actor429: n4 + Owner: Nod + SubCell: 3 + Location: 48,59 + Facing: 182 + Actor430: n3 + Owner: Nod + SubCell: 3 + Location: 46,70 + Facing: 610 + Actor431: n3 + Owner: Nod + Facing: 384 + Location: 46,70 + SubCell: 1 + Actor432: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 46,76 + Actor433: n3 + Owner: Nod + SubCell: 3 + Location: 45,81 + Facing: 301 + Actor434: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 45,64 + Actor435: n3 + Owner: Nod + SubCell: 3 + Location: 50,59 + Facing: 158 + Actor436: n3 + Owner: Nod + SubCell: 3 + Location: 56,59 + Facing: 7 + Actor437: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 65,57 + Actor438: n3 + Owner: Nod + SubCell: 3 + Location: 71,54 + Facing: 0 + Actor439: n3 + Owner: Nod + SubCell: 3 + Location: 79,55 + Facing: 0 + Actor440: n3 + Owner: Nod + SubCell: 3 + Location: 85,57 + Facing: 0 + Actor441: n3 + Owner: Nod + SubCell: 3 + Location: 85,62 + Facing: 0 + Actor442: n3 + Owner: Nod + SubCell: 3 + Location: 73,58 + Facing: 0 + Actor443: n3 + Owner: Nod + Location: 89,81 + SubCell: 3 + Facing: 721 + Actor444: n3 + Owner: Nod + SubCell: 3 + Location: 90,85 + Facing: 864 + Actor445: split2 + Owner: Neutral + Location: 95,24 + Actor446: split2 + Owner: Neutral + Location: 46,43 + Actor448: split2 + Owner: Neutral + Location: 53,41 + Actor447: split2 + Owner: Neutral + Location: 113,45 + Actor339: t09 + Owner: Neutral + Location: 5,20 + Actor449: split2 + Owner: Neutral + Location: 19,54 + Actor450: camera + Owner: USSR + Location: 83,58 + Actor451: camera + Owner: USSR + Location: 71,55 + Actor452: camera + Owner: USSR + Location: 57,57 + Actor453: camera + Owner: USSR + Location: 49,60 + Actor454: camera + Owner: USSR + Location: 44,67 + Actor455: camera + Owner: USSR + Location: 44,78 + Actor456: camera + Owner: USSR + Location: 91,82 + Actor457: camera + Owner: USSR + Location: 55,66 + Actor458: camera + Owner: USSR + Location: 77,67 + Actor459: camera + Owner: USSR + Location: 77,79 + Actor460: camera + Owner: USSR + Location: 54,80 + Actor461: camera + Owner: USSR + Location: 65,81 + Actor462: tc01 + Owner: Neutral + Location: 47,93 + Actor463: rock2 + Owner: Neutral + Location: 50,92 + Actor464: rock4 + Owner: Neutral + Location: 45,91 + AttackSpawn1: waypoint + Owner: Neutral + Location: 1,84 + AttackSpawn2: waypoint + Owner: Neutral + Location: 1,28 + AttackSpawn3: waypoint + Owner: Neutral + Location: 1,13 + AttackSpawn4: waypoint + Owner: Neutral + Location: 22,1 + AttackSpawn5: waypoint + Owner: Neutral + Location: 41,1 + AttackSpawn6: waypoint + Owner: Neutral + Location: 58,1 + AttackSpawn7: waypoint + Owner: Neutral + Location: 110,1 + AttackSpawn8: waypoint + Owner: Neutral + Location: 128,36 + Actor466: tc01 + Owner: Neutral + Location: 92,42 + HaloDropLanding2: waypoint + Owner: Neutral + Location: 24,68 + HaloDropLanding1: waypoint + Owner: Neutral + Location: 21,80 + HaloDropLanding3: waypoint + Owner: Neutral + Location: 25,40 + HaloDropLanding4: waypoint + Owner: Neutral + Location: 29,30 + HaloDropLanding5: waypoint + Owner: Neutral + Location: 49,19 + HaloDropLanding6: waypoint + Owner: Neutral + Location: 67,28 + HaloDropLanding7: waypoint + Owner: Neutral + Location: 82,16 + HaloDropLanding8: waypoint + Owner: Neutral + Location: 91,34 + HaloDropLanding9: waypoint + Owner: Neutral + Location: 104,31 + HaloDropLanding10: waypoint + Owner: Neutral + Location: 104,56 + HaloDropLanding11: waypoint + Owner: Neutral + Location: 122,69 + Actor477: bggy + Owner: Nod + Facing: 384 + Location: 48,65 + Actor478: bggy + Owner: Nod + Facing: 384 + Location: 47,81 + Actor479: bggy + Owner: Nod + Location: 82,86 + Facing: 761 + Actor480: bggy + Owner: Nod + Location: 84,65 + Facing: 0 + PlayerStart: waypoint + Owner: Neutral + Location: 65,76 + AttackDest1: waypoint + Owner: Neutral + Location: 8,84 + AttackDest2: waypoint + Owner: Neutral + Location: 10,40 + AttackDest3: waypoint + Owner: Neutral + Location: 21,19 + AttackDest4: waypoint + Owner: Neutral + Location: 22,18 + AttackDest5: waypoint + Owner: Neutral + Location: 42,17 + AttackDest6: waypoint + Owner: Neutral + Location: 58,15 + AttackDest7: waypoint + Owner: Neutral + Location: 110,18 + AttackDest8: waypoint + Owner: Neutral + Location: 110,40 + AttackSpawn9: waypoint + Owner: Neutral + Location: 59,1 + AttackDest9: waypoint + Owner: Neutral + Location: 82,19 + HaloDropSpawn1: waypoint + Owner: Neutral + Location: 1,62 + HaloDropSpawn2: waypoint + Owner: Neutral + Location: 10,1 + HaloDropSpawn3: waypoint + Owner: Neutral + Location: 67,1 + HaloDropSpawn4: waypoint + Owner: Neutral + Location: 128,26 + AttackSpawn10: waypoint + Owner: Neutral + Location: 111,1 + AttackDest10: waypoint + Owner: Neutral + Location: 89,38 + CyborgRally1: waypoint + Owner: Neutral + Location: 55,82 + CyborgRally2: waypoint + Owner: Neutral + Location: 75,83 + ConyardPosition1: waypoint + Owner: Neutral + Location: 113,25 + RefPosition1: waypoint + Owner: Neutral + Location: 102,24 + ConyardPosition2: waypoint + Owner: Neutral + Location: 46,26 + RefPosition2: waypoint + Owner: Neutral + Location: 37,30 + TeslaCoilPosition2: waypoint + Owner: Neutral + Location: 44,28 + TeslaCoilPosition1: waypoint + Owner: Neutral + Location: 111,27 + ConyardPosition3: waypoint + Owner: Neutral + Location: 18,40 + RefPosition3: waypoint + Owner: Neutral + Location: 18,45 + TeslaCoilPosition3: waypoint + Owner: Neutral + Location: 21,41 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-covenants.yaml, awakening-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/main-campaign/ca11-awakening/n_anothersovietbase.aud b/mods/ca/missions/main-campaign/ca11-awakening/n_anothersovietbase.aud new file mode 100644 index 0000000000..206ab250f2 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca11-awakening/n_anothersovietbase.aud differ diff --git a/mods/ca/missions/main-campaign/ca11-awakening/n_cyborgscomplete.aud b/mods/ca/missions/main-campaign/ca11-awakening/n_cyborgscomplete.aud new file mode 100644 index 0000000000..7daf2edbd7 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca11-awakening/n_cyborgscomplete.aud differ diff --git a/mods/ca/missions/main-campaign/ca11-awakening/n_defendtemple.aud b/mods/ca/missions/main-campaign/ca11-awakening/n_defendtemple.aud new file mode 100644 index 0000000000..b26108691e Binary files /dev/null and b/mods/ca/missions/main-campaign/ca11-awakening/n_defendtemple.aud differ diff --git a/mods/ca/missions/main-campaign/ca11-awakening/n_sovietbase.aud b/mods/ca/missions/main-campaign/ca11-awakening/n_sovietbase.aud new file mode 100644 index 0000000000..c64f350152 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca11-awakening/n_sovietbase.aud differ diff --git a/mods/ca/missions/main-campaign/ca12-supremacy/map.bin b/mods/ca/missions/main-campaign/ca12-supremacy/map.bin new file mode 100644 index 0000000000..b802d7c8e8 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca12-supremacy/map.bin differ diff --git a/mods/ca/missions/main-campaign/ca12-supremacy/map.png b/mods/ca/missions/main-campaign/ca12-supremacy/map.png new file mode 100644 index 0000000000..f701be0d27 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca12-supremacy/map.png differ diff --git a/mods/ca/missions/main-campaign/ca12-supremacy/map.yaml b/mods/ca/missions/main-campaign/ca12-supremacy/map.yaml new file mode 100644 index 0000000000..18adce2b68 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca12-supremacy/map.yaml @@ -0,0 +1,3397 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 12: Supremacy + +Author: Darkademic + +Tileset: DESERT + +MapSize: 162,130 + +Bounds: 1,1,160,128 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + PlayerReference@Nod: + Name: Nod + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: nod + LockColor: True + Color: FE1100 + LockSpawn: True + LockTeam: True + Enemies: GDI, Greece, Creeps + PlayerReference@Greece: + Name: Greece + Bot: campaign + Faction: allies + Color: 99ACF2 + Allies: GDI + Enemies: Nod, Nod2, Nod3, Creeps + PlayerReference@GDI: + Name: GDI + Bot: campaign + Faction: gdi + Color: F2CF74 + Allies: Greece + Enemies: Nod, Nod2, Nod3, Creeps + PlayerReference@Nod2: + Name: Nod2 + Faction: nod + Color: 6D738C + Allies: Nod, Nod3 + Enemies: GDI, Greece, Creeps + PlayerReference@Nod3: + Name: Nod3 + Faction: nod + Color: 6D738C + Allies: Nod, Nod2 + Enemies: GDI, Greece, Creeps + +Actors: + Actor0: nuk2 + Location: 94,124 + Owner: Nod2 + Health: 45 + Actor1: nuk2 + Location: 96,124 + Owner: Nod2 + Health: 37 + Actor2: nuk2 + Location: 98,124 + Owner: Nod2 + Health: 24 + Actor3: proc.td + Location: 102,114 + Owner: Nod2 + FreeActor@SHARV: False + FreeActor: False + Health: 45 + Actor4: hand + Location: 88,111 + Owner: Nod2 + Health: 35 + Actor5: airs + Location: 90,116 + Owner: Nod2 + Health: 37 + Actor6: obli + Location: 100,109 + Owner: Nod2 + Health: 45 + Actor7: hq + Location: 89,125 + Owner: Nod2 + Health: 33 + Actor8: airs + Owner: Nod3 + Location: 13,40 + Health: 37 + Actor9: nuk2 + Owner: Nod3 + Location: 3,40 + Health: 37 + Actor10: nuk2 + Owner: Nod3 + Location: 4,33 + Health: 24 + Actor11: nuk2 + Owner: Nod3 + Location: 4,36 + Health: 45 + Actor12: hand + Owner: Nod3 + Location: 20,32 + Health: 35 + Actor13: proc.td + Owner: Nod3 + Location: 7,31 + FreeActor@SHARV: False + FreeActor: False + Health: 45 + Actor15: obli + Owner: Nod3 + Location: 25,34 + Health: 45 + Actor16: hq + Owner: Nod3 + Location: 16,35 + Health: 33 + Actor17: nsam + Owner: Nod3 + Location: 22,28 + Health: 41 + Actor18: nsam + Owner: Nod2 + Location: 100,111 + TurretFacing: 0 + Health: 41 + Actor20: rmbc + Owner: Nod + Location: 8,119 + SubCell: 1 + Facing: 896 + Actor26: rmbc + Owner: Nod + SubCell: 1 + Facing: 896 + Location: 14,123 + Actor28: reap + Owner: Nod + SubCell: 3 + Location: 7,120 + Facing: 896 + Actor29: reap + Owner: Nod + SubCell: 3 + Facing: 896 + Location: 13,124 + Actor30: reap + Owner: Nod + SubCell: 3 + Facing: 896 + Location: 10,122 + Actor33: n1c + Owner: Nod + Location: 10,117 + SubCell: 2 + Facing: 896 + Actor35: n1c + Owner: Nod + Location: 10,117 + SubCell: 5 + Facing: 896 + Actor32: n1c + Owner: Nod + Location: 10,117 + SubCell: 1 + Facing: 896 + Actor23: rmbc + Owner: Nod + Location: 8,119 + SubCell: 5 + Facing: 896 + Actor25: rmbc + Owner: Nod + SubCell: 5 + Facing: 896 + Location: 14,123 + Actor37: n3c + Owner: Nod + Location: 11,119 + SubCell: 2 + Facing: 896 + Actor39: n3c + Owner: Nod + Location: 11,119 + SubCell: 5 + Facing: 896 + Actor36: n3c + Owner: Nod + Location: 11,119 + SubCell: 1 + Facing: 896 + Actor40: n3c + Owner: Nod + SubCell: 2 + Facing: 896 + Location: 13,120 + Actor42: n3c + Owner: Nod + SubCell: 5 + Location: 13,120 + Facing: 896 + Actor43: n3c + Owner: Nod + SubCell: 1 + Facing: 896 + Location: 13,120 + Actor44: n1c + Owner: Nod + SubCell: 2 + Facing: 896 + Location: 13,118 + Actor46: n1c + Owner: Nod + SubCell: 5 + Facing: 896 + Location: 13,118 + Actor47: n1c + Owner: Nod + SubCell: 1 + Facing: 896 + Location: 13,118 + Actor48: n1c + Owner: Nod + SubCell: 2 + Facing: 896 + Location: 15,120 + Actor50: n1c + Owner: Nod + SubCell: 5 + Facing: 896 + Location: 15,120 + Actor51: n1c + Owner: Nod + SubCell: 1 + Facing: 896 + Location: 15,120 + Actor52: cmec + Owner: Nod + SubCell: 3 + Location: 9,121 + Facing: 896 + Actor53: cmec + Owner: Nod + SubCell: 3 + Location: 12,122 + Facing: 896 + Actor54: n1 + Owner: GDI + SubCell: 3 + Facing: 384 + Location: 28,116 + Actor55: n1 + Owner: GDI + SubCell: 3 + Location: 29,122 + Facing: 103 + Actor56: n1 + Owner: GDI + Facing: 384 + Location: 28,116 + SubCell: 1 + Actor57: n1 + Owner: GDI + SubCell: 3 + Location: 9,101 + Facing: 650 + Actor58: n1 + Owner: GDI + SubCell: 3 + Location: 10,100 + Facing: 555 + Actor59: n1 + Owner: GDI + Location: 9,101 + SubCell: 1 + Facing: 586 + Actor60: mtnk + Owner: GDI + Location: 29,119 + Facing: 261 + Actor61: mtnk + Owner: GDI + Location: 11,99 + Facing: 491 + Actor62: mtnk + Owner: GDI + Location: 13,98 + Facing: 499 + Actor63: mtnk + Owner: GDI + Facing: 261 + Location: 30,117 + Actor64: n3 + Owner: GDI + SubCell: 3 + Location: 31,119 + Facing: 245 + Actor65: n3 + Owner: GDI + SubCell: 3 + Location: 30,116 + Facing: 384 + Actor66: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 12,98 + Actor67: n3 + Owner: GDI + Location: 9,100 + SubCell: 3 + Facing: 602 + Actor68: avtr + Owner: Nod2 + Location: 93,114 + Health: 69 + Facing: 896 + Actor69: n1 + Owner: Nod2 + SubCell: 3 + Location: 91,111 + Facing: 0 + Actor70: n1 + Owner: Nod2 + Location: 91,111 + SubCell: 1 + Facing: 0 + Actor71: n1 + Owner: Nod2 + SubCell: 3 + Location: 99,112 + Facing: 103 + Actor72: n1 + Owner: Nod2 + SubCell: 3 + Location: 103,118 + Facing: 721 + Actor73: n1 + Owner: Nod2 + SubCell: 3 + Location: 90,110 + Facing: 848 + Actor74: n1 + Owner: Nod2 + SubCell: 3 + Location: 90,114 + Facing: 769 + Actor75: n1 + Owner: Nod2 + SubCell: 3 + Location: 103,121 + Facing: 785 + Actor76: n1 + Owner: Nod2 + Location: 103,121 + SubCell: 1 + Facing: 745 + Actor77: n1 + SubCell: 3 + Location: 22,34 + Owner: Nod3 + Facing: 618 + Actor78: n1 + Location: 22,34 + SubCell: 1 + Owner: Nod3 + Facing: 531 + Actor79: n1 + SubCell: 3 + Location: 19,30 + Owner: Nod3 + Facing: 7 + Actor80: n1 + SubCell: 3 + Location: 12,31 + Facing: 0 + Owner: Nod3 + Actor81: n1 + Location: 12,31 + SubCell: 1 + Facing: 0 + Owner: Nod3 + Actor82: n1 + SubCell: 3 + Location: 17,31 + Facing: 0 + Owner: Nod3 + Actor83: n1 + SubCell: 3 + Location: 22,37 + Owner: Nod3 + Facing: 808 + Actor84: n1 + SubCell: 3 + Location: 21,40 + Owner: Nod3 + Facing: 642 + Helipad1: hpad.td + Location: 7,38 + Owner: Nod3 + Health: 44 + Helipad2: hpad.td + Location: 6,42 + Owner: Nod3 + Health: 41 + Actor87: ltnk + Owner: Nod2 + Location: 96,114 + Facing: 896 + Actor88: ltnk + Owner: Nod2 + Location: 91,112 + Facing: 896 + Actor89: hftk + Owner: Nod2 + Location: 95,117 + Facing: 896 + Actor90: hftk + Owner: Nod2 + Location: 88,115 + Facing: 896 + Actor91: hstk + Owner: Nod3 + Location: 19,39 + Facing: 768 + Actor92: hstk + Owner: Nod3 + Location: 20,36 + Facing: 768 + Actor93: mlrs + Owner: Nod3 + Location: 17,33 + Facing: 896 + Actor94: mlrs + Owner: Nod3 + Location: 12,37 + TurretFacing: 0 + Facing: 896 + Banshee2: scrn + Owner: Nod3 + Location: 6,42 + Facing: 896 + Banshee1: scrn + Owner: Nod3 + Location: 7,38 + Facing: 896 + Actor97: e3 + Owner: Nod3 + SubCell: 3 + Location: 18,37 + Facing: 697 + Actor98: e3 + Owner: Nod3 + SubCell: 3 + Location: 15,34 + Facing: 0 + Actor99: e3 + Owner: Nod3 + SubCell: 3 + Location: 19,41 + Facing: 832 + Actor100: e3 + Owner: Nod3 + SubCell: 3 + Location: 12,34 + Facing: 0 + Actor101: n3 + Owner: Nod2 + SubCell: 3 + Location: 98,118 + Facing: 793 + Actor102: n3 + Owner: Nod2 + SubCell: 3 + Location: 98,116 + Facing: 658 + Actor103: n3 + Owner: Nod2 + SubCell: 3 + Location: 91,115 + Facing: 602 + Actor104: n3 + Owner: Nod2 + SubCell: 3 + Location: 87,113 + Facing: 896 + Actor105: gun + Owner: Nod2 + Location: 108,115 + Health: 70 + TurretFacing: 785 + Actor106: split2 + Owner: Neutral + Location: 22,5 + Actor107: split2 + Owner: Neutral + Location: 14,3 + Actor109: split2 + Owner: Neutral + Location: 24,68 + Actor110: split2 + Owner: Neutral + Location: 126,122 + Actor111: split2 + Owner: Neutral + Location: 122,110 + Actor112: split2 + Owner: Neutral + Location: 5,24 + Actor115: htnk + Owner: GDI + Location: 12,71 + Facing: 512 + Actor116: htnk + Owner: GDI + Location: 15,71 + Facing: 512 + Actor119: vulc.ai + Owner: GDI + Location: 10,70 + Facing: 512 + Actor120: vulc.ai + Owner: GDI + Location: 17,70 + Facing: 512 + Actor121: n1 + Owner: GDI + SubCell: 3 + Location: 46,98 + Facing: 237 + Actor122: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 45,95 + Actor123: n1 + Owner: GDI + SubCell: 3 + Location: 46,96 + Facing: 384 + Actor124: n1 + Owner: GDI + Facing: 384 + Location: 45,95 + SubCell: 1 + Actor125: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 47,96 + Actor126: n1 + Owner: GDI + SubCell: 3 + Location: 48,99 + Facing: 245 + Actor128: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 46,94 + Actor129: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 44,93 + Actor130: n2 + Owner: GDI + SubCell: 3 + Location: 13,88 + Facing: 737 + Actor131: n2 + Owner: GDI + SubCell: 3 + Location: 14,84 + Facing: 555 + Actor132: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 18,85 + Actor133: n1 + Owner: GDI + Location: 14,88 + SubCell: 3 + Facing: 713 + Actor134: n1 + Owner: GDI + SubCell: 3 + Location: 14,86 + Facing: 682 + Actor135: n1 + Owner: GDI + Location: 14,86 + SubCell: 1 + Facing: 602 + Actor136: n1 + Owner: GDI + SubCell: 3 + Location: 16,85 + Facing: 682 + Actor137: n1 + Owner: GDI + SubCell: 3 + Location: 18,86 + Facing: 682 + Actor138: n1 + Owner: GDI + SubCell: 3 + Location: 17,84 + Facing: 384 + Actor139: medi + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 13,86 + Actor140: medi + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 17,83 + Actor141: medi + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 45,93 + Actor142: medi + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 48,98 + Actor143: vulc.ai + Owner: GDI + Facing: 128 + Location: 60,111 + Actor144: vulc.ai + Owner: GDI + Facing: 128 + Location: 55,112 + Actor145: htnk + Owner: GDI + Facing: 128 + Location: 58,112 + Actor146: htnk + Owner: GDI + Facing: 128 + Location: 55,114 + Actor147: tc01 + Owner: Neutral + Location: 58,102 + Actor148: tc01 + Owner: Neutral + Location: 20,111 + Actor149: t18 + Owner: Neutral + Location: 5,92 + Actor150: t18 + Owner: Neutral + Location: 25,83 + Actor151: t18 + Owner: Neutral + Location: 10,63 + Actor152: t18 + Owner: Neutral + Location: 26,52 + Actor153: t18 + Owner: Neutral + Location: 26,17 + Actor154: t08 + Owner: Neutral + Location: 4,17 + Actor155: t08 + Owner: Neutral + Location: 7,57 + Actor156: t08 + Owner: Neutral + Location: 40,106 + Actor157: t08 + Owner: Neutral + Location: 58,121 + Actor158: rock3 + Owner: Neutral + Location: 2,96 + Actor159: rock3 + Owner: Neutral + Location: 32,60 + Actor160: rock3 + Owner: Neutral + Location: 69,108 + Actor161: rock2 + Owner: Neutral + Location: 108,104 + Actor162: rock1 + Owner: Neutral + Location: 21,78 + Actor163: t09 + Owner: Neutral + Location: 10,79 + Actor164: t09 + Owner: Neutral + Location: 26,98 + Actor165: t09 + Owner: Neutral + Location: 42,115 + Actor166: t09 + Owner: Neutral + Location: 55,99 + Actor167: t09 + Owner: Neutral + Location: 81,107 + Actor168: t09 + Owner: Neutral + Location: 113,108 + Actor169: t09 + Owner: Neutral + Location: 109,126 + Actor170: t04 + Owner: Neutral + Location: 109,105 + Actor171: t04 + Owner: Neutral + Location: 59,119 + Actor172: t04 + Owner: Neutral + Location: 19,104 + Actor173: t04 + Owner: Neutral + Location: 3,106 + Actor174: t04 + Owner: Neutral + Location: 2,79 + Actor175: t04 + Owner: Neutral + Location: 2,62 + Actor176: rock7 + Owner: Neutral + Location: 36,36 + Actor177: tc01 + Owner: Neutral + Location: 118,126 + Actor178: syrd.gdi + Owner: GDI + Location: 82,3 + Actor179: syrd.gdi + Owner: GDI + Location: 152,59 + Actor180: cv + Owner: GDI + Location: 145,62 + Facing: 253 + Actor181: cv + Owner: GDI + Location: 150,63 + Facing: 253 + Actor182: cv + Owner: GDI + Location: 111,61 + Facing: 245 + Actor183: cv + Owner: GDI + Location: 121,62 + Facing: 269 + Actor184: cv + Owner: GDI + Location: 77,11 + Facing: 515 + Actor185: cv + Owner: GDI + Location: 79,17 + Facing: 531 + Actor186: cv + Owner: GDI + Facing: 384 + Location: 81,48 + Actor187: cv + Owner: GDI + Location: 86,54 + Facing: 384 + Actor188: dd2 + Owner: GDI + Location: 76,15 + Facing: 491 + Actor189: dd2 + Owner: GDI + Facing: 384 + Location: 78,45 + Actor190: dd2 + Owner: GDI + Facing: 384 + Location: 89,57 + Actor191: dd2 + Owner: GDI + Location: 116,64 + Facing: 261 + Actor192: dd2 + Owner: GDI + Location: 124,64 + Facing: 261 + Actor193: dd2 + Owner: GDI + Location: 144,64 + Facing: 245 + Actor194: brik + Owner: GDI + Location: 160,8 + Actor195: brik + Owner: GDI + Location: 158,8 + Actor196: brik + Owner: GDI + Location: 159,8 + Actor197: brik + Owner: GDI + Location: 157,8 + Actor198: brik + Owner: GDI + Location: 156,8 + Actor199: brik + Owner: GDI + Location: 155,8 + Actor200: brik + Owner: GDI + Location: 155,9 + Actor201: brik + Owner: GDI + Location: 156,9 + Actor202: brik + Owner: GDI + Location: 160,9 + Actor203: brik + Owner: GDI + Location: 160,11 + Actor204: brik + Owner: GDI + Location: 160,10 + Actor205: brik + Owner: GDI + Location: 160,12 + Actor206: brik + Owner: GDI + Location: 160,14 + Actor207: brik + Owner: GDI + Location: 160,13 + Actor208: brik + Owner: GDI + Location: 160,15 + Actor209: brik + Owner: GDI + Location: 160,16 + Actor210: brik + Owner: GDI + Location: 160,17 + Actor211: brik + Owner: GDI + Location: 160,18 + Actor212: brik + Owner: GDI + Location: 160,20 + Actor213: brik + Owner: GDI + Location: 160,19 + Actor214: brik + Owner: GDI + Location: 160,21 + Actor215: brik + Owner: GDI + Location: 160,22 + Actor216: brik + Owner: GDI + Location: 160,23 + Actor217: brik + Owner: GDI + Location: 159,23 + Actor218: brik + Owner: GDI + Location: 158,23 + Actor219: brik + Owner: GDI + Location: 157,23 + Actor220: brik + Owner: GDI + Location: 156,23 + Actor221: brik + Owner: GDI + Location: 154,23 + Actor222: brik + Owner: GDI + Location: 155,23 + Actor223: brik + Owner: GDI + Location: 153,23 + Actor224: brik + Owner: GDI + Location: 151,23 + Actor225: brik + Owner: GDI + Location: 152,23 + Actor226: brik + Owner: GDI + Location: 150,23 + Actor227: brik + Owner: GDI + Location: 150,22 + Actor228: brik + Owner: GDI + Location: 151,22 + Actor229: brik + Owner: GDI + Location: 144,22 + Actor230: brik + Owner: GDI + Location: 144,23 + Actor231: brik + Owner: GDI + Location: 143,23 + Actor232: brik + Owner: GDI + Location: 143,22 + Actor233: brik + Owner: GDI + Location: 142,23 + Actor234: brik + Owner: GDI + Location: 141,23 + Actor235: brik + Owner: GDI + Location: 140,23 + Actor236: brik + Owner: GDI + Location: 139,23 + Actor237: brik + Owner: GDI + Location: 138,23 + Actor238: brik + Owner: GDI + Location: 137,23 + Actor239: brik + Owner: GDI + Location: 136,23 + Actor240: brik + Owner: GDI + Location: 135,23 + Actor241: brik + Owner: GDI + Location: 134,23 + Actor242: brik + Owner: GDI + Location: 133,23 + Actor243: brik + Owner: GDI + Location: 132,23 + Actor244: brik + Owner: GDI + Location: 132,22 + Actor245: brik + Owner: GDI + Location: 132,21 + Actor246: brik + Owner: GDI + Location: 132,20 + Actor247: brik + Owner: GDI + Location: 132,17 + Actor248: brik + Owner: GDI + Location: 132,18 + Actor249: brik + Owner: GDI + Location: 132,19 + Actor250: brik + Owner: GDI + Location: 132,16 + Actor251: brik + Owner: GDI + Location: 133,16 + Actor252: brik + Owner: GDI + Location: 133,17 + Actor253: brik + Owner: GDI + Location: 132,11 + Actor254: brik + Owner: GDI + Location: 132,10 + Actor255: brik + Owner: GDI + Location: 133,10 + Actor256: brik + Owner: GDI + Location: 133,11 + Actor257: brik + Owner: GDI + Location: 132,9 + Actor258: brik + Owner: GDI + Location: 132,8 + Actor259: brik + Owner: GDI + Location: 141,8 + Actor260: brik + Owner: GDI + Location: 140,8 + Actor261: brik + Owner: GDI + Location: 138,8 + Actor262: brik + Owner: GDI + Location: 135,8 + Actor263: brik + Owner: GDI + Location: 134,8 + Actor264: brik + Owner: GDI + Location: 133,8 + Actor265: brik + Owner: GDI + Location: 137,8 + Actor266: brik + Owner: GDI + Location: 136,8 + Actor267: brik + Owner: GDI + Location: 139,8 + Actor268: brik + Owner: GDI + Location: 142,8 + Actor269: brik + Owner: GDI + Location: 144,8 + Actor270: brik + Owner: GDI + Location: 143,8 + Actor271: brik + Owner: GDI + Location: 145,8 + Actor272: brik + Owner: GDI + Location: 147,8 + Actor273: brik + Owner: GDI + Location: 146,8 + Actor274: brik + Owner: GDI + Location: 148,8 + Actor275: brik + Owner: GDI + Location: 148,9 + Actor276: brik + Owner: GDI + Location: 147,9 + Actor279: eye + Owner: GDI + Location: 158,9 + Actor280: afac + Owner: GDI + Location: 155,10 + Actor281: gtwr + Owner: GDI + Location: 131,11 + Actor282: gtwr + Owner: GDI + Location: 131,16 + Actor283: gtwr + Owner: GDI + Location: 144,24 + Actor284: gtwr + Owner: GDI + Location: 150,24 + Actor277: atwr + Owner: GDI + Location: 142,22 + Actor278: atwr + Owner: GDI + Location: 152,22 + Actor285: atwr + Owner: GDI + Location: 133,18 + Actor286: atwr + Owner: GDI + Location: 133,9 + Actor287: atwr + Owner: GDI + Location: 146,9 + Actor294: silo.td + Owner: GDI + Location: 134,9 + Actor295: silo.td + Owner: GDI + Location: 136,9 + Actor290: nuk2 + Owner: GDI + Location: 138,9 + Actor291: nuk2 + Owner: GDI + Location: 140,9 + Actor292: nuk2 + Owner: GDI + Location: 142,9 + Actor296: nuk2 + Owner: GDI + Location: 144,9 + Actor293: proc.td + Owner: GDI + Location: 136,12 + Actor297: proc.td + Owner: GDI + Location: 139,13 + Actor298: nuk2 + Owner: GDI + Location: 142,12 + Actor299: nuk2 + Owner: GDI + Location: 144,12 + GDIFactory1: weap.td + Owner: GDI + Location: 145,17 + GDIBarracks1: pyle + Owner: GDI + Location: 150,17 + Actor289: silo.td + Owner: GDI + Location: 154,22 + Actor302: silo.td + Owner: GDI + Location: 158,22 + Actor303: silo.td + Owner: GDI + Location: 156,22 + Actor304: nuk2 + Owner: GDI + Location: 158,18 + Actor305: nuk2 + Owner: GDI + Location: 156,18 + Actor308: hq + Owner: GDI + Location: 133,20 + Actor310: cram + Owner: GDI + Location: 135,11 + Actor311: cram + Owner: GDI + Location: 159,13 + Actor312: cram + Owner: GDI + Location: 154,20 + Actor313: cram + Owner: GDI + Location: 137,22 + Actor315: upgc + Owner: GDI + Location: 148,13 + Actor316: rep + Owner: GDI + Location: 152,13 + Actor309: cram + Owner: GDI + Location: 151,11 + Actor314: gtek + Owner: GDI + Location: 136,18 + Actor317: brik + Owner: GDI + Location: 65,86 + Actor318: brik + Owner: GDI + Location: 65,85 + Actor319: brik + Owner: GDI + Location: 66,86 + Actor320: brik + Owner: GDI + Location: 66,85 + Actor321: brik + Owner: GDI + Location: 65,84 + Actor322: brik + Owner: GDI + Location: 64,84 + Actor323: brik + Owner: GDI + Location: 64,83 + Actor324: brik + Owner: GDI + Location: 67,86 + Actor325: brik + Owner: GDI + Location: 68,86 + Actor326: brik + Owner: GDI + Location: 69,86 + Actor327: brik + Owner: GDI + Location: 69,85 + Actor328: brik + Owner: GDI + Location: 68,85 + Actor329: brik + Owner: GDI + Location: 70,85 + Actor330: brik + Owner: GDI + Location: 71,85 + Actor331: brik + Owner: GDI + Location: 72,85 + Actor332: brik + Owner: GDI + Location: 74,85 + Actor333: brik + Owner: GDI + Location: 73,85 + Actor334: brik + Owner: GDI + Location: 74,84 + Actor335: brik + Owner: GDI + Location: 73,84 + Actor336: brik + Owner: GDI + Location: 64,82 + Actor337: brik + Owner: GDI + Location: 65,82 + Actor338: brik + Owner: GDI + Location: 65,81 + Actor339: brik + Owner: GDI + Location: 64,81 + Actor340: brik + Owner: GDI + Location: 64,77 + Actor341: brik + Owner: GDI + Location: 64,76 + Actor342: brik + Owner: GDI + Location: 65,77 + Actor343: brik + Owner: GDI + Location: 65,76 + Actor344: brik + Owner: GDI + Location: 64,75 + Actor345: brik + Owner: GDI + Location: 64,74 + Actor346: brik + Owner: GDI + Location: 65,74 + Actor347: brik + Owner: GDI + Location: 65,72 + Actor348: brik + Owner: GDI + Location: 65,73 + Actor349: brik + Owner: GDI + Location: 67,72 + Actor350: brik + Owner: GDI + Location: 66,72 + Actor351: brik + Owner: GDI + Location: 68,72 + Actor352: brik + Owner: GDI + Location: 69,72 + Actor353: brik + Owner: GDI + Location: 69,71 + Actor354: brik + Owner: GDI + Location: 70,71 + Actor355: brik + Owner: GDI + Location: 71,71 + Actor356: brik + Owner: GDI + Location: 73,71 + Actor357: brik + Owner: GDI + Location: 72,71 + Actor358: brik + Owner: GDI + Location: 73,72 + Actor359: brik + Owner: GDI + Location: 72,72 + Actor364: brik + Owner: GDI + Location: 82,85 + Actor365: brik + Owner: GDI + Location: 83,85 + Actor366: brik + Owner: GDI + Location: 84,85 + Actor367: brik + Owner: GDI + Location: 84,84 + Actor368: brik + Owner: GDI + Location: 85,84 + Actor369: brik + Owner: GDI + Location: 85,83 + Actor370: brik + Owner: GDI + Location: 85,82 + Actor371: brik + Owner: GDI + Location: 85,81 + Actor372: brik + Owner: GDI + Location: 85,80 + Actor373: brik + Owner: GDI + Location: 85,79 + Actor374: brik + Owner: GDI + Location: 84,79 + Actor375: brik + Owner: GDI + Location: 84,80 + Actor378: brik + Owner: GDI + Location: 81,71 + Actor380: brik + Owner: GDI + Location: 82,71 + Actor381: brik + Owner: GDI + Location: 83,71 + Actor382: brik + Owner: GDI + Location: 84,71 + Actor383: brik + Owner: GDI + Location: 85,71 + Actor384: brik + Owner: GDI + Location: 85,72 + Actor385: brik + Owner: GDI + Location: 85,73 + Actor386: brik + Owner: GDI + Location: 84,74 + Actor387: brik + Owner: GDI + Location: 84,75 + Actor388: brik + Owner: GDI + Location: 85,75 + Actor389: brik + Owner: GDI + Location: 85,74 + Actor390: atwr + Owner: GDI + Location: 67,85 + Actor391: atwr + Owner: GDI + Location: 65,83 + Actor393: atwr + Owner: GDI + Location: 65,75 + Actor394: atwr + Owner: GDI + Location: 84,81 + Actor395: atwr + Owner: GDI + Location: 84,72 + Actor396: cram + Owner: GDI + Location: 84,83 + Actor397: cram + Owner: GDI + Location: 66,73 + Actor398: cram + Owner: GDI + Location: 66,84 + GDIFactory2: weap.td + Owner: GDI + Location: 68,74 + Actor402: nuk2 + Owner: GDI + Location: 68,82 + Actor403: nuk2 + Owner: GDI + Location: 70,82 + Actor405: nuk2 + Owner: GDI + Location: 70,79 + Actor406: nuk2 + Owner: GDI + Location: 68,79 + Actor407: gtwr + Owner: GDI + Location: 74,86 + Actor409: gtwr + Owner: GDI + Location: 63,81 + Actor410: gtwr + Owner: GDI + Location: 63,77 + Actor411: gtwr + Owner: GDI + Location: 86,75 + Actor412: gtwr + Owner: GDI + Location: 86,79 + Actor413: gtwr + Owner: GDI + Location: 73,70 + Actor414: gtwr + Owner: GDI + Location: 78,70 + Actor415: brik + Owner: GDI + Location: 78,71 + Actor416: brik + Owner: GDI + Location: 79,71 + Actor417: brik + Owner: GDI + Location: 80,71 + Actor418: brik + Owner: GDI + Location: 78,72 + Actor419: brik + Owner: GDI + Location: 79,72 + Actor408: brik + Owner: GDI + Location: 79,84 + Actor420: brik + Owner: GDI + Location: 80,84 + Actor421: atwr + Owner: GDI + Location: 81,84 + Actor422: brik + Owner: GDI + Location: 79,85 + Actor423: brik + Owner: GDI + Location: 80,85 + Actor424: brik + Owner: GDI + Location: 81,85 + Actor425: gtwr + Owner: GDI + Location: 79,86 + GDIBarracks2: pyle + Owner: GDI + Location: 74,80 + Actor427: proc.td + Owner: GDI + Location: 80,72 + Actor429: nuk2 + Owner: GDI + Location: 78,78 + Actor430: nuk2 + Owner: GDI + Location: 80,78 + Actor431: split2 + Owner: Neutral + Location: 79,65 + Actor432: split2 + Owner: Neutral + Location: 91,71 + Actor433: split2 + Owner: Neutral + Location: 86,67 + Actor434: split2 + Owner: Neutral + Location: 95,93 + Actor435: amcv + Owner: Nod + Location: 7,124 + Facing: 896 + Actor436: split2 + Owner: Neutral + Location: 36,87 + Actor437: split2 + Owner: Neutral + Location: 40,83 + Actor438: split2 + Owner: Neutral + Location: 57,49 + Actor439: split2 + Owner: Neutral + Location: 56,42 + Actor440: split2 + Owner: Neutral + Location: 125,8 + Actor441: split2 + Owner: Neutral + Location: 104,8 + Actor442: split2 + Owner: Neutral + Location: 110,17 + Actor446: v25 + Owner: Neutral + Location: 152,124 + Actor447: macs + Owner: Neutral + Location: 157,104 + Actor448: v09 + Owner: Neutral + Location: 148,115 + Actor449: tc01 + Owner: Neutral + Location: 147,122 + Actor450: v20 + Owner: Neutral + Location: 148,107 + Actor451: v10 + Owner: Neutral + Location: 142,125 + Actor452: v27 + Owner: Neutral + Location: 152,113 + Actor453: v24 + Owner: Neutral + Location: 148,119 + Actor454: v26 + Owner: Neutral + Location: 145,104 + Actor455: t08 + Owner: Neutral + Location: 153,111 + Actor456: v21 + Owner: Neutral + Location: 158,109 + Actor457: v23 + Owner: Neutral + Location: 152,123 + Actor458: v34 + Owner: Neutral + Location: 145,117 + Actor459: v35 + Owner: Neutral + Location: 159,117 + Actor460: t04 + Owner: Neutral + Location: 157,116 + Actor461: utilpol1 + Owner: Neutral + Location: 145,125 + Actor462: utilpol2 + Owner: Neutral + Location: 150,104 + Actor463: rock2 + Owner: Neutral + Location: 145,95 + Actor464: hosp + Owner: Neutral + Location: 47,10 + Actor465: v25 + Owner: Neutral + Location: 52,4 + Actor466: oilb + Owner: Neutral + Location: 63,7 + Actor467: oilb + Owner: Neutral + Location: 64,3 + Actor468: v22 + Owner: Neutral + Location: 58,12 + Actor469: v20 + Owner: Neutral + Location: 45,4 + Actor470: v35 + Owner: Neutral + Location: 50,16 + Actor471: v27 + Owner: Neutral + Location: 40,7 + Actor472: v24 + Owner: Neutral + Location: 38,1 + Actor473: v31 + Owner: Neutral + Location: 35,10 + Actor474: t18 + Owner: Neutral + Location: 59,10 + Actor475: brl3 + Owner: Neutral + Location: 65,5 + Actor476: brl3 + Owner: Neutral + Location: 62,9 + Actor477: barl + Owner: Neutral + Location: 63,9 + Actor478: barl + Owner: Neutral + Location: 66,4 + Actor479: barl + Owner: Neutral + Location: 63,3 + Actor480: barl + Owner: Neutral + Location: 66,10 + Actor481: chain + Owner: Neutral + Location: 62,1 + Actor482: chain + Owner: Neutral + Location: 63,1 + Actor483: chain + Owner: Neutral + Location: 64,1 + Actor484: chain + Owner: Neutral + Location: 65,1 + Actor485: chain + Owner: Neutral + Location: 66,1 + Actor486: chain + Owner: Neutral + Location: 61,1 + Actor487: chain + Owner: Neutral + Location: 60,1 + Actor488: chain + Owner: Neutral + Location: 60,2 + Actor489: chain + Owner: Neutral + Location: 60,3 + Actor490: chain + Owner: Neutral + Location: 60,4 + Actor491: chain + Owner: Neutral + Location: 60,9 + Actor492: chain + Owner: Neutral + Location: 62,10 + Actor493: chain + Owner: Neutral + Location: 61,10 + Actor494: chain + Owner: Neutral + Location: 60,10 + Actor495: chain + Owner: Neutral + Location: 63,10 + Actor496: chain + Owner: Neutral + Location: 64,10 + Actor497: wood + Owner: Neutral + Location: 47,9 + Actor498: wood + Owner: Neutral + Location: 48,9 + Actor499: wood + Owner: Neutral + Location: 49,9 + Actor500: wood + Owner: Neutral + Location: 46,9 + Actor501: wood + Owner: Neutral + Location: 45,9 + Actor502: wood + Owner: Neutral + Location: 45,10 + Actor503: wood + Owner: Neutral + Location: 45,11 + Actor504: t18 + Owner: Neutral + Location: 45,37 + Actor505: t18 + Owner: Neutral + Location: 57,62 + Actor506: t18 + Owner: Neutral + Location: 49,80 + Actor507: t18 + Owner: Neutral + Location: 102,79 + Actor508: t18 + Owner: Neutral + Location: 117,102 + Actor509: t18 + Owner: Neutral + Location: 72,126 + Actor510: t18 + Owner: Neutral + Location: 140,72 + Actor511: t18 + Owner: Neutral + Location: 155,43 + Actor512: t18 + Owner: Neutral + Location: 114,29 + Actor513: t18 + Owner: Neutral + Location: 99,24 + Actor514: t08 + Owner: Neutral + Location: 67,25 + Actor515: t08 + Owner: Neutral + Location: 146,40 + Actor516: t08 + Owner: Neutral + Location: 156,56 + Actor517: t08 + Owner: Neutral + Location: 118,42 + Actor518: t08 + Owner: Neutral + Location: 99,101 + Actor520: t08 + Owner: Neutral + Location: 48,50 + Actor522: t08 + Owner: Neutral + Location: 31,79 + Actor523: rock4 + Owner: Neutral + Location: 51,86 + Actor524: rock2 + Owner: Neutral + Location: 44,56 + Actor525: rock6 + Owner: Neutral + Location: 39,21 + Actor526: rock6 + Owner: Neutral + Location: 96,11 + Actor527: rock6 + Owner: Neutral + Location: 156,38 + Actor528: v34 + Owner: Neutral + Location: 120,38 + Actor529: v31 + Owner: Neutral + Location: 140,42 + Actor530: v33 + Owner: Neutral + Location: 151,40 + Actor531: v34 + Owner: Neutral + Location: 98,26 + Actor532: v29 + Owner: Neutral + Location: 96,31 + Actor533: v26 + Owner: Neutral + Location: 128,38 + Actor534: v24 + Owner: Neutral + Location: 150,43 + Actor535: t04 + Owner: Neutral + Location: 130,38 + Actor536: t04 + Owner: Neutral + Location: 152,34 + Actor537: nuk2 + Owner: GDI + Location: 146,10 + Actor538: proc.td + Owner: GDI + Location: 62,41 + Actor539: gtwr + Owner: GDI + Location: 59,34 + Actor540: gtwr + Owner: GDI + Location: 65,52 + Actor541: sbag + Owner: GDI + Location: 65,51 + Actor542: sbag + Owner: GDI + Location: 64,51 + Actor543: sbag + Owner: GDI + Location: 66,51 + Actor544: sbag + Owner: GDI + Location: 66,50 + Actor545: sbag + Owner: GDI + Location: 66,49 + Actor546: sbag + Owner: GDI + Location: 64,50 + Actor547: sbag + Owner: GDI + Location: 59,35 + Actor548: sbag + Owner: GDI + Location: 60,35 + Actor549: sbag + Owner: GDI + Location: 61,35 + Actor550: sbag + Owner: GDI + Location: 61,34 + Actor551: sbag + Owner: GDI + Location: 62,34 + Actor552: sbag + Owner: GDI + Location: 63,34 + Actor553: sbag + Owner: GDI + Location: 59,36 + Actor554: cram + Owner: GDI + Location: 62,35 + Actor555: cram + Owner: GDI + Location: 65,50 + Actor556: atwr + Owner: GDI + Location: 99,40 + Actor557: atwr + Owner: GDI + Location: 120,47 + Actor558: atwr + Owner: GDI + Location: 149,48 + Actor559: atwr + Owner: GDI + Location: 129,45 + Actor560: atwr + Owner: GDI + Location: 94,22 + Actor561: vulc.ai + Owner: GDI + Facing: 512 + Location: 79,82 + Actor562: vulc.ai + Owner: GDI + Facing: 512 + Location: 73,83 + Actor563: vulc.ai + Owner: GDI + Location: 62,76 + Facing: 364 + Actor564: mtnk + Owner: GDI + Facing: 491 + Location: 75,87 + Actor565: mtnk + Owner: GDI + Facing: 491 + Location: 78,87 + Actor566: mtnk + Owner: GDI + Location: 61,80 + Facing: 396 + Actor567: n3 + Owner: GDI + SubCell: 3 + Facing: 602 + Location: 72,86 + Actor568: n1 + Owner: GDI + SubCell: 3 + Facing: 555 + Location: 73,86 + Actor569: n1 + Owner: GDI + SubCell: 3 + Facing: 650 + Location: 72,87 + Actor570: n1 + Owner: GDI + SubCell: 1 + Facing: 586 + Location: 72,87 + Actor571: medi + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 89,77 + Actor572: n1 + Owner: GDI + SubCell: 3 + Facing: 384 + Location: 89,78 + Actor573: n1 + Owner: GDI + SubCell: 3 + Facing: 682 + Location: 88,79 + Actor574: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 90,79 + Actor575: n1 + Owner: GDI + SubCell: 3 + Facing: 682 + Location: 90,80 + Actor576: n1 + Owner: GDI + SubCell: 3 + Facing: 384 + Location: 59,77 + Actor577: n1 + Owner: GDI + Facing: 384 + SubCell: 1 + Location: 59,77 + Actor578: n3 + Owner: GDI + SubCell: 3 + Facing: 384 + Location: 61,77 + Actor582: titn.rail + Owner: GDI + Location: 141,24 + Facing: 512 + Actor579: titn.rail + Owner: GDI + Facing: 512 + Location: 143,25 + Actor580: titn.rail + Owner: GDI + Facing: 512 + Location: 151,25 + Actor581: titn.rail + Owner: GDI + Facing: 512 + Location: 153,24 + Actor583: titn.rail + Owner: GDI + Location: 130,17 + Facing: 256 + Actor584: titn.rail + Owner: GDI + Facing: 256 + Location: 128,15 + Actor585: pbul + Owner: GDI + Facing: 384 + Location: 146,49 + Actor586: pbul + Owner: GDI + Facing: 384 + Location: 148,51 + Actor588: pbul + Owner: GDI + Facing: 384 + Location: 123,46 + Actor589: pbul + Owner: GDI + Facing: 384 + Location: 126,45 + Actor587: pbul + Owner: GDI + Facing: 384 + Location: 96,22 + Actor590: pbul + Owner: GDI + Facing: 384 + Location: 95,20 + Actor591: pbul + Owner: GDI + Facing: 384 + Location: 101,40 + Actor592: pbul + Owner: GDI + Facing: 384 + Location: 99,38 + Actor593: wolv + Owner: GDI + Location: 131,53 + Facing: 570 + Actor594: wolv + Owner: GDI + Location: 139,53 + Facing: 512 + Actor595: wolv + Owner: GDI + Facing: 570 + Location: 96,50 + Actor596: wolv + Owner: GDI + Facing: 570 + Location: 102,50 + Actor597: wolv + Owner: GDI + Location: 87,29 + Facing: 256 + Actor598: wolv + Owner: GDI + Facing: 256 + Location: 88,35 + Actor599: msam + Owner: GDI + Facing: 384 + Location: 155,31 + Actor600: msam + Owner: GDI + Facing: 384 + Location: 140,21 + Actor601: msam + Owner: GDI + Facing: 384 + Location: 135,22 + Actor602: msam + Owner: GDI + Facing: 384 + Location: 135,18 + Actor603: msam + Owner: GDI + Facing: 384 + Location: 154,18 + Actor604: msam + Owner: GDI + Facing: 384 + Location: 122,18 + Actor605: msam + Owner: GDI + Facing: 384 + Location: 137,29 + Actor606: msam + Owner: GDI + Facing: 384 + Location: 61,36 + Actor607: msam + Owner: GDI + Facing: 384 + Location: 83,84 + Actor608: msam + Owner: GDI + Facing: 384 + Location: 70,72 + Actor609: htnk + Owner: GDI + Facing: 384 + Location: 128,27 + Actor610: htnk + Owner: GDI + Facing: 384 + Location: 130,29 + Actor611: htnk + Owner: GDI + Location: 133,52 + Facing: 512 + Actor612: htnk + Owner: GDI + Facing: 384 + Location: 100,48 + Actor613: htnk + Owner: GDI + Location: 92,33 + Facing: 256 + Actor614: vulc.ai + Owner: GDI + Location: 111,31 + Facing: 523 + Actor615: vulc.ai + Owner: GDI + Facing: 384 + Location: 145,85 + Actor616: vulc.ai + Owner: GDI + Facing: 384 + Location: 146,86 + Actor617: vulc.ai + Owner: GDI + Facing: 384 + Location: 148,44 + Actor618: vulc.ai + Owner: GDI + Facing: 384 + Location: 87,6 + Actor619: hmmv + Owner: GDI + Facing: 384 + Location: 62,65 + Actor620: hmmv + Owner: GDI + Facing: 384 + Location: 60,67 + Actor621: hmmv + Owner: GDI + Location: 146,111 + Facing: 0 + Actor622: hmmv + Owner: GDI + Location: 146,109 + Facing: 0 + Actor625: mtnk + Owner: GDI + Facing: 384 + Location: 144,87 + Actor626: mtnk + Owner: GDI + Location: 148,112 + Facing: 0 + Actor627: vulc.ai + Owner: GDI + Facing: 384 + Location: 63,49 + Actor628: mtnk + Owner: GDI + Facing: 384 + Location: 62,52 + Actor629: mtnk + Owner: GDI + Location: 65,31 + Facing: 256 + Actor630: mtnk + Owner: GDI + Location: 67,31 + Facing: 256 + Actor631: jugg + Owner: GDI + Facing: 384 + Location: 157,30 + Actor632: jugg + Owner: GDI + Facing: 384 + Location: 143,15 + Actor633: bh + Owner: Nod3 + SubCell: 3 + Location: 16,38 + Facing: 491 + Actor634: bh + Owner: Nod3 + SubCell: 3 + Location: 15,37 + Facing: 384 + Actor635: ftnk + Location: 95,112 + Owner: Nod2 + Facing: 904 + Actor636: bggy + Owner: Nod3 + Location: 10,42 + Facing: 384 + Actor637: bike + Owner: Nod3 + Location: 16,43 + Facing: 634 + Actor638: bike + Owner: Nod3 + Location: 17,42 + Facing: 618 + PlayerStart: waypoint + Owner: Neutral + Location: 12,120 + Actor639: ztrp + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 141,29 + Actor640: ztrp + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 151,31 + Actor641: ztrp + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 144,26 + Actor642: ztrp + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 152,26 + Actor643: ztrp + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 132,30 + Actor644: ztrp + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 130,28 + Actor645: ztrp + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 126,25 + Actor646: ztrp + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 123,18 + Actor647: ztrp + Owner: GDI + SubCell: 3 + Location: 131,18 + Facing: 277 + Actor648: zdef + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 142,24 + Actor649: zdef + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 153,30 + Actor650: zdef + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 122,17 + Actor651: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 156,24 + Actor652: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 139,24 + Actor653: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 139,20 + Actor654: n3 + Owner: GDI + Facing: 384 + Location: 133,19 + SubCell: 3 + Actor655: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 155,17 + Actor656: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 158,14 + Actor657: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 154,8 + Actor658: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 153,9 + Actor659: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 137,10 + Actor660: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 123,26 + Actor661: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 150,45 + Actor662: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 122,46 + Actor663: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 141,52 + Actor664: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 101,43 + Actor665: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 105,52 + Actor666: n3 + Owner: GDI + SubCell: 3 + Location: 94,35 + Facing: 384 + Actor667: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 94,19 + Actor668: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 63,16 + Actor669: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 64,35 + Actor670: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 64,48 + Actor671: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 83,82 + Actor672: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 66,74 + Actor673: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 83,73 + Actor674: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 141,53 + Actor675: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 129,51 + Actor676: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 125,45 + Actor677: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 128,45 + Actor678: n1 + Owner: GDI + Facing: 384 + Location: 150,48 + SubCell: 3 + Actor679: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 149,46 + Actor680: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 100,39 + Actor681: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 102,40 + Actor682: n1 + Owner: GDI + Location: 93,35 + SubCell: 3 + Facing: 126 + Actor683: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 88,28 + Actor684: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 89,29 + Actor685: n1 + Owner: GDI + SubCell: 3 + Location: 91,38 + Facing: 79 + Actor686: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 97,21 + Actor687: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 125,19 + Actor688: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 121,16 + Actor689: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 157,28 + Actor690: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 139,29 + Actor691: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 139,33 + Actor692: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 150,32 + Actor693: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 133,29 + Actor694: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 155,6 + Actor695: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 150,7 + Actor696: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 144,84 + Actor697: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 146,88 + Actor698: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 150,111 + Actor699: t08 + Owner: Neutral + Location: 31,26 + Actor700: t08 + Owner: Neutral + Location: 46,67 + Actor701: cratermaker1 + Owner: Neutral + Location: 98,107 + Actor702: cratermaker1 + Owner: Neutral + Location: 97,106 + Actor703: cratermaker1 + Owner: Neutral + Location: 94,105 + Actor704: cratermaker1 + Owner: Neutral + Location: 94,107 + Actor705: cratermaker1 + Owner: Neutral + Location: 92,105 + Actor706: cratermaker1 + Owner: Neutral + Location: 90,105 + Actor707: cratermaker1 + Owner: Neutral + Location: 88,104 + Actor708: cratermaker2 + Owner: Neutral + Location: 91,104 + Actor709: cratermaker2 + Owner: Neutral + Location: 93,105 + Actor710: cratermaker2 + Owner: Neutral + Location: 97,107 + Actor711: cratermaker2 + Owner: Neutral + Location: 109,114 + Actor712: cratermaker2 + Owner: Neutral + Location: 110,116 + Actor713: cratermaker2 + Owner: Neutral + Location: 108,119 + Actor714: cratermaker1 + Owner: Neutral + Location: 111,117 + Actor715: cratermaker1 + Owner: Neutral + Location: 110,115 + Actor716: scorchmaker1 + Owner: Neutral + Location: 99,109 + Actor717: scorchmaker1 + Owner: Neutral + Location: 104,109 + Actor718: scorchmaker2 + Owner: Neutral + Location: 103,108 + Actor719: scorchmaker2 + Owner: Neutral + Location: 100,104 + Actor720: cratermaker1 + Owner: Neutral + Location: 104,105 + Actor721: cratermaker1 + Owner: Neutral + Location: 91,101 + Actor722: cratermaker2 + Owner: Neutral + Location: 98,103 + Actor733: cratermaker1 + Owner: Neutral + Location: 28,40 + Actor734: cratermaker1 + Owner: Neutral + Location: 30,37 + Actor735: cratermaker1 + Owner: Neutral + Location: 28,32 + Actor736: cratermaker1 + Owner: Neutral + Location: 27,35 + Actor743: cratermaker1 + Owner: Neutral + Location: 28,35 + Actor744: cratermaker1 + Owner: Neutral + Location: 29,39 + Actor745: cratermaker1 + Owner: Neutral + Location: 19,25 + Actor746: cratermaker1 + Owner: Neutral + Location: 17,23 + Actor747: cratermaker1 + Owner: Neutral + Location: 14,25 + Actor748: cratermaker1 + Owner: Neutral + Location: 11,26 + Actor749: cratermaker1 + Owner: Neutral + Location: 19,28 + Actor750: cratermaker2 + Owner: Neutral + Location: 28,34 + Actor751: cratermaker2 + Owner: Neutral + Location: 15,24 + Actor752: cratermaker2 + Owner: Neutral + Location: 16,24 + Actor753: cratermaker2 + Owner: Neutral + Location: 28,36 + Actor754: scorchmaker2 + Owner: Neutral + Location: 23,29 + Actor755: scorchmaker2 + Owner: Neutral + Location: 17,25 + Actor756: scorchmaker2 + Owner: Neutral + Location: 28,39 + Actor758: msam + Owner: GDI + Facing: 384 + Location: 41,33 + Actor759: msam + Owner: GDI + Facing: 384 + Location: 41,30 + Actor760: msam + Owner: GDI + Facing: 384 + Location: 103,94 + Actor761: msam + Owner: GDI + Facing: 384 + Location: 108,96 + Actor763: htnk + Owner: GDI + Facing: 384 + Location: 101,96 + Actor764: htnk + Owner: GDI + Facing: 384 + Location: 104,97 + Actor765: htnk + Owner: GDI + Facing: 384 + Location: 36,30 + Actor766: htnk + Owner: GDI + Facing: 384 + Location: 38,33 + Actor767: mtnk + Owner: GDI + Facing: 384 + Location: 36,32 + Actor768: mtnk + Owner: GDI + Facing: 384 + Location: 39,34 + Actor769: mtnk + Owner: GDI + Location: 34,29 + Facing: 384 + Actor770: mtnk + Owner: GDI + Facing: 384 + Location: 107,98 + Actor771: mtnk + Owner: GDI + Facing: 384 + Location: 102,97 + Actor772: mtnk + Owner: GDI + Facing: 384 + Location: 99,95 + Actor773: n3 + Owner: GDI + SubCell: 3 + Location: 106,95 + Facing: 384 + Actor774: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 105,94 + Actor775: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 103,93 + Actor776: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 107,93 + Actor777: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 110,96 + Actor778: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 40,32 + Actor779: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 38,30 + Actor780: n3 + Owner: GDI + Facing: 384 + Location: 38,29 + SubCell: 3 + Actor781: n3 + Owner: GDI + Facing: 384 + Location: 37,28 + SubCell: 3 + Actor782: n3 + Owner: GDI + SubCell: 3 + Location: 39,31 + Facing: 384 + Actor783: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 35,30 + Actor784: n1 + Owner: GDI + Facing: 384 + Location: 35,30 + SubCell: 1 + Actor785: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 35,32 + Actor786: n1 + Owner: GDI + Facing: 384 + Location: 35,32 + SubCell: 1 + Actor787: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 38,32 + Actor788: n1 + Owner: GDI + Facing: 384 + Location: 38,32 + SubCell: 1 + Actor789: n1 + Owner: GDI + Facing: 384 + Location: 38,34 + SubCell: 3 + Actor790: n1 + Owner: GDI + Facing: 384 + Location: 38,34 + SubCell: 1 + Actor791: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 40,35 + Actor792: n1 + Owner: GDI + Facing: 384 + Location: 40,35 + SubCell: 1 + Actor793: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 36,31 + Actor794: n1 + Owner: GDI + Facing: 384 + Location: 36,31 + SubCell: 1 + Actor795: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 105,98 + Actor796: n1 + Owner: GDI + Facing: 384 + Location: 105,98 + SubCell: 1 + Actor797: n1 + Owner: GDI + Facing: 384 + Location: 104,98 + SubCell: 3 + Actor798: n1 + Owner: GDI + Facing: 384 + Location: 104,98 + SubCell: 1 + Actor799: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 103,96 + Actor800: n1 + Owner: GDI + Facing: 384 + Location: 103,96 + SubCell: 1 + Actor801: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 101,97 + Actor802: n1 + Owner: GDI + Facing: 384 + Location: 101,97 + SubCell: 1 + Actor803: n1 + Owner: GDI + Facing: 384 + Location: 101,95 + SubCell: 3 + Actor804: n1 + Owner: GDI + Facing: 384 + Location: 101,95 + SubCell: 1 + Actor805: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 106,97 + Actor806: n1 + Owner: GDI + Facing: 384 + Location: 106,97 + SubCell: 1 + Actor807: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 42,34 + Actor808: n1 + Owner: GDI + Facing: 384 + Location: 42,34 + SubCell: 1 + Actor809: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 33,29 + Actor810: n1 + Owner: GDI + Facing: 384 + Location: 33,29 + SubCell: 1 + Actor811: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 109,98 + Actor812: n1 + Owner: GDI + Facing: 384 + Location: 109,98 + SubCell: 1 + Actor813: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 103,92 + Actor814: n1 + Owner: GDI + Facing: 384 + Location: 103,92 + SubCell: 1 + Actor815: zrai + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 105,96 + Actor816: zrai + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 104,93 + Actor817: zrai + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 109,95 + Actor818: zrai + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 41,32 + Actor819: zrai + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 36,29 + Actor820: zrai + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 41,28 + Actor821: wolv + Owner: GDI + Facing: 384 + Location: 37,31 + Actor822: wolv + Owner: GDI + Location: 104,95 + Facing: 380 + GDIEastAttack: waypoint + Owner: Neutral + Location: 105,95 + GDIWestAttack: waypoint + Owner: Neutral + Location: 38,31 + Actor823: ltnk + Owner: Nod + Location: 15,118 + Facing: 896 + Actor824: ltnk + Owner: Nod + Location: 12,116 + Facing: 896 + EastBaseCenter: waypoint + Owner: Neutral + Location: 92,115 + WestBaseCenter: waypoint + Owner: Neutral + Location: 14,35 + Actor825: n1 + Owner: GDI + SubCell: 3 + Facing: 682 + Location: 18,83 + Actor826: n1 + Owner: GDI + SubCell: 1 + Facing: 602 + Location: 18,83 + Actor827: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 48,97 + Actor828: n1 + Owner: GDI + Facing: 384 + SubCell: 1 + Location: 48,97 + EastRally4: waypoint + Owner: Neutral + Location: 69,103 + EastRally2: waypoint + Owner: Neutral + Location: 95,86 + EastRally1: waypoint + Owner: Neutral + Location: 134,82 + EastRally3: waypoint + Owner: Neutral + Location: 143,121 + WestRally1: waypoint + Owner: Neutral + Location: 37,60 + WestRally2: waypoint + Owner: Neutral + Location: 39,28 + WestRally3: waypoint + Owner: Neutral + Location: 22,19 + WestRally4: waypoint + Owner: Neutral + Location: 94,73 + Actor829: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 98,46 + Actor830: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 99,47 + Actor831: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 101,49 + Actor832: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 97,50 + Actor833: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 104,50 + Actor834: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 134,52 + Actor835: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 133,53 + Actor836: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 142,51 + Actor837: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 138,53 + Actor838: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 68,32 + Actor839: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 66,30 + Actor840: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 65,32 + Actor841: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 93,31 + Actor842: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 87,28 + Actor844: thwk + Owner: GDI + Location: 92,45 + Facing: 256 + Actor843: thwk + Owner: GDI + Facing: 256 + Location: 92,43 + Actor845: thwk + Owner: GDI + Facing: 256 + Location: 94,44 + Actor846: camera + Owner: GDI + Location: 26,38 + Actor847: camera + Owner: GDI + Location: 22,23 + Actor848: camera + Owner: GDI + Location: 95,109 + Actor849: camera + Owner: GDI + Location: 111,111 + Actor850: camera + Owner: GDI + Location: 65,79 + Actor851: camera + Owner: GDI + Location: 84,77 + Actor852: camera + Owner: GDI + Location: 136,75 + Actor853: camera + Owner: GDI + Location: 98,71 + Actor854: camera + Owner: GDI + Location: 68,34 + Actor855: camera + Owner: GDI + Location: 61,58 + Actor856: patr + Owner: GDI + Location: 76,75 + TurretFacing: 192 + Actor857: rep + Owner: GDI + Location: 72,75 + Actor858: split2 + Owner: Neutral + Location: 155,90 + Actor859: split2 + Owner: Neutral + Location: 154,81 + Actor108: split2 + Owner: Neutral + Location: 4,6 + Actor860: pt2 + Owner: GDI + Location: 116,60 + Facing: 256 + Actor861: pt2 + Owner: GDI + Location: 126,60 + Facing: 256 + Actor862: pt2 + Owner: GDI + Location: 155,64 + Facing: 256 + Actor863: pt2 + Owner: GDI + Location: 149,65 + Facing: 256 + Actor864: pt2 + Owner: GDI + Location: 148,60 + Facing: 256 + Actor865: pt2 + Owner: GDI + Facing: 384 + Location: 82,51 + Actor866: pt2 + Owner: GDI + Facing: 384 + Location: 92,58 + Actor867: pt2 + Owner: GDI + Facing: 384 + Location: 78,43 + Actor868: pt2 + Owner: GDI + Location: 80,13 + Facing: 523 + Actor869: pt2 + Owner: GDI + Facing: 523 + Location: 72,12 + Actor870: htnk + Owner: GDI + Location: 55,25 + Facing: 256 + Actor871: htnk + Owner: GDI + Location: 52,23 + Facing: 256 + Actor872: vulc.ai + Owner: GDI + Location: 54,22 + Facing: 256 + Actor873: vulc.ai + Owner: GDI + Location: 54,27 + Facing: 256 + Actor874: ztrp + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 53,21 + Actor875: ztrp + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 56,23 + Actor876: zdef + Owner: GDI + SubCell: 3 + Facing: 384 + Location: 54,24 + Actor877: zdef + Owner: GDI + Facing: 384 + Location: 56,26 + SubCell: 3 + Actor878: zdef + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 55,28 + Actor879: htnk + Owner: GDI + Location: 133,72 + Facing: 512 + Actor880: htnk + Owner: GDI + Location: 136,72 + Facing: 512 + Actor881: vulc.ai + Owner: GDI + Location: 131,71 + Facing: 512 + Actor882: vulc.ai + Owner: GDI + Location: 138,71 + TurretFacing: 0 + Facing: 512 + Actor883: ztrp + Owner: GDI + SubCell: 3 + Location: 134,71 + Facing: 512 + Actor884: ztrp + Owner: GDI + SubCell: 3 + Location: 130,70 + Facing: 512 + Actor885: ztrp + Owner: GDI + SubCell: 3 + Location: 139,70 + Facing: 512 + Actor886: ztrp + Owner: GDI + SubCell: 3 + Facing: 512 + Location: 94,68 + Actor887: ztrp + Owner: GDI + SubCell: 3 + Facing: 512 + Location: 103,68 + Actor888: vulc.ai + Owner: GDI + Facing: 512 + Location: 95,69 + Actor889: ztrp + Owner: GDI + SubCell: 3 + Facing: 512 + Location: 98,69 + Actor890: vulc.ai + Owner: GDI + TurretFacing: 0 + Facing: 512 + Location: 102,69 + Actor891: htnk + Owner: GDI + Facing: 512 + Location: 97,70 + Actor892: htnk + Owner: GDI + Facing: 512 + Location: 100,70 + Actor893: camera + Owner: GDI + Location: 9,40 + Actor894: camera + Owner: GDI + Location: 93,123 + Actor895: vulc + Owner: GDI + Facing: 384 + Location: 101,18 + ScriptTags: BrutalOnly + Actor896: vulc + Owner: GDI + Location: 100,16 + Facing: 384 + ScriptTags: BrutalOnly + Actor897: vulc + Owner: GDI + Facing: 384 + Location: 105,23 + ScriptTags: BrutalOnly + Actor898: vulc + Owner: GDI + Facing: 384 + Location: 118,22 + ScriptTags: BrutalOnly + Actor899: vulc + Owner: GDI + Facing: 384 + Location: 119,24 + ScriptTags: BrutalOnly + Actor901: vulc + Owner: GDI + Facing: 384 + Location: 120,22 + ScriptTags: BrutalOnly + Actor900: vulc + Owner: GDI + Location: 136,27 + ScriptTags: BrutalOnly + Facing: 384 + Actor902: vulc + Owner: GDI + Facing: 384 + Location: 138,27 + ScriptTags: BrutalOnly + Actor903: vulc + Owner: GDI + Facing: 384 + Location: 127,23 + ScriptTags: BrutalOnly + Actor904: vulc + Owner: GDI + Facing: 384 + Location: 126,21 + ScriptTags: BrutalOnly + Actor905: vulc + Owner: GDI + Facing: 384 + Location: 158,26 + ScriptTags: BrutalOnly + Actor906: vulc + Owner: GDI + Facing: 384 + Location: 156,26 + ScriptTags: BrutalOnly + Actor907: hpad.td + Owner: GDI + Location: 92,3 + Actor908: hpad.td + Owner: GDI + Location: 94,3 + Actor909: chain + Owner: GDI + Location: 93,2 + Actor910: chain + Owner: GDI + Location: 92,2 + Actor911: chain + Owner: GDI + Location: 91,2 + Actor912: chain + Owner: GDI + Location: 91,3 + Actor913: chain + Owner: GDI + Location: 91,4 + Actor914: chain + Owner: GDI + Location: 91,5 + Actor915: chain + Owner: GDI + Location: 96,5 + Actor916: chain + Owner: GDI + Location: 96,4 + Actor917: chain + Owner: GDI + Location: 96,3 + Actor918: chain + Owner: GDI + Location: 96,2 + Actor919: chain + Owner: GDI + Location: 95,2 + Actor920: chain + Owner: GDI + Location: 94,2 + Actor921: chain + Owner: GDI + Location: 91,6 + Actor922: chain + Owner: GDI + Location: 92,6 + Actor923: chain + Owner: GDI + Location: 96,6 + Actor924: n3r1 + Owner: GDI + Facing: 384 + Location: 92,7 + SubCell: 3 + Actor925: n3r1 + Owner: GDI + Facing: 384 + Location: 97,5 + SubCell: 3 + Actor926: n3r1 + Owner: GDI + Facing: 384 + Location: 90,5 + SubCell: 3 + Actor927: chain + Owner: GDI + Location: 95,6 + MainHelipad1: hpad.td + Owner: GDI + Location: 156,15 + MainHelipad2: hpad.td + Owner: GDI + Location: 158,15 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, supremacy-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/main-campaign/ca12-supremacy/supremacy-rules.yaml b/mods/ca/missions/main-campaign/ca12-supremacy/supremacy-rules.yaml new file mode 100644 index 0000000000..9da58c5550 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca12-supremacy/supremacy-rules.yaml @@ -0,0 +1,47 @@ + +^Palettes: + TintPostProcessEffect: + +World: + LuaScript: + Scripts: campaign.lua, supremacy.lua + MissionData: + Briefing: The Soviets have been dealt a devastating blow by our new cyborg army, but it is not yet enough. For my plan to succeed their power and obedience must be shown to be unequaled.\n\nWord of our great victory has already reached GDI and the Allies, and they have set their mistrust aside. While the Allies attempt to take advantage of the Soviet defeat to make advances on that front, GDI have begun an assault against us.\n\nTwo bases in particular are soon to fall. Sacrifice one base to lull GDI into a false sense of security, and reinforce the other. Once you establish cyborg manufacturing, GDI will not stand a chance. Show no mercy, let all bear witness to the glorious evolution that shall bring the brotherhood to ultimate victory. + MapOptions: + ShortGameCheckboxEnabled: False + MusicPlaylist: + StartingMusic: stopthem + +Player: + PlayerResources: + DefaultCash: 0 + +# Enable subfaction specific tech + +BH: + Buildable: + Prerequisites: ~hand, anyradar + +WTNK: + Buildable: + Prerequisites: anyradar, ~vehicles.nod + +HFTK: + Buildable: + Prerequisites: anyradar, ~vehicles.nod + +SPEC: + Buildable: + Prerequisites: tmpl, ~vehicles.nod + +quantum.upgrade: + Buildable: + Prerequisites: tmpl + +hstk.upgrade: + Buildable: + Prerequisites: tmpl + +blacknapalm.upgrade: + Buildable: + Prerequisites: tmpl diff --git a/mods/ca/missions/main-campaign/ca12-supremacy/supremacy.lua b/mods/ca/missions/main-campaign/ca12-supremacy/supremacy.lua new file mode 100644 index 0000000000..f6e160cdc5 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca12-supremacy/supremacy.lua @@ -0,0 +1,408 @@ +MissionDir = "ca|missions/main-campaign/ca12-supremacy" + +IonCannonEnabledTime = { + easy = DateTime.Seconds((60 * 40) + 48), + normal = DateTime.Seconds((60 * 25) + 48), + hard = DateTime.Seconds((60 * 15) + 48), + vhard = DateTime.Seconds((60 * 10) + 48), + brutal = DateTime.Seconds((60 * 8) + 48) +} + +-- overrides +RampDurationMultipliers.vhard = 0.82 +RampDurationMultipliers.brutal = 0.76 + +AdjustedGDICompositions = AdjustCompositionsForDifficulty(UnitCompositions.GDI) + +Squads = { + Main = { + InitTimeAdjustment = -DateTime.Minutes(3), + Delay = AdjustDelayForDifficulty(DateTime.Minutes(5)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 20, Max = 40, RampDuration = DateTime.Minutes(15) }), + FollowLeader = true, + ProducerActors = { Infantry = { GDIBarracks1 }, Vehicles = { GDIFactory1 } }, + Compositions = AdjustedGDICompositions, + AttackPaths = { + -- set on init + }, + }, + Forward = { + InitTimeAdjustment = -DateTime.Minutes(2), + Delay = AdjustDelayForDifficulty(DateTime.Minutes(3)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 20, Max = 40, RampDuration = DateTime.Minutes(15) }), + FollowLeader = true, + ProducerActors = { Infantry = { GDIBarracks2 }, Vehicles = { GDIFactory2 } }, + Compositions = AdjustedGDICompositions, + AttackPaths = { + -- set on init + }, + }, + GDIAir = { + Delay = AdjustAirDelayForDifficulty(DateTime.Minutes(13)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 12, Max = 12 }), + Compositions = AirCompositions.GDI, + }, + AntiHeavyAir = AntiHeavyAirSquad({ "orcb" }, AdjustAirDelayForDifficulty(DateTime.Minutes(10))), + AirToAir = AirToAirSquad({ "orca" }, AdjustAirDelayForDifficulty(DateTime.Minutes(10))), +} + +-- Setup and Tick + +SetupPlayers = function() + Nod = Player.GetPlayer("Nod") + Nod2 = Player.GetPlayer("Nod2") + Nod3 = Player.GetPlayer("Nod3") + GDI = Player.GetPlayer("GDI") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = { Nod } + MissionEnemies = { GDI } +end + +WorldLoaded = function() + SetupPlayers() + + TimerTicks = 0 + Camera.Position = PlayerStart.CenterPosition + + InitObjectives(Nod) + AdjustPlayerStartingCashForDifficulty() + RemoveActorsBasedOnDifficultyTags() + InitGDI() + InitNod() + + NodRadarProviders = {} + + Utils.Do(MissionPlayers, function(p) + table.insert(NodRadarProviders, Actor.Create("radar.dummy", true, { Owner = p })) + end) + + ObjectiveReinforce = Nod.AddObjective("Reinforce one of the two Nod bases.") + + local eastAttackTriggerCells = {} + for x = 9, 18 do + local cell = CPos.New(x, 78) + table.insert(eastAttackTriggerCells, cell) + end + + local westAttackTriggerCells = {} + for x = 47, 56 do + local cell = CPos.New(x, 101) + table.insert(westAttackTriggerCells, cell) + end + + Trigger.OnEnteredFootprint(eastAttackTriggerCells, function(a, id) + if IsMissionPlayer(a.Owner) then + Trigger.RemoveFootprintTrigger(id) + InitGDIEast() + end + end) + + Trigger.OnEnteredFootprint(westAttackTriggerCells, function(a, id) + if IsMissionPlayer(a.Owner) then + Trigger.RemoveFootprintTrigger(id) + InitGDIWest() + end + end) + + Trigger.OnEnteredProximityTrigger(WestBaseCenter.CenterPosition, WDist.New(15 * 1024), function(a, id) + if IsMissionPlayer(a.Owner) then + Trigger.RemoveProximityTrigger(id) + FlipWestBase() + end + end) + + Trigger.OnEnteredProximityTrigger(EastBaseCenter.CenterPosition, WDist.New(15 * 1024), function(a, id) + if IsMissionPlayer(a.Owner) then + Trigger.RemoveProximityTrigger(id) + FlipEastBase() + end + end) + + Banshee1.ReturnToBase(Helipad1) + Banshee2.ReturnToBase(Helipad2) + + AfterWorldLoaded() +end + +Tick = function() + OncePerSecondChecks() + OncePerFiveSecondChecks() + OncePerThirtySecondChecks() + AfterTick() +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + GDI.Resources = GDI.ResourceCapacity - 500 + + if MissionPlayersHaveNoRequiredUnits() then + if not Nod.IsObjectiveCompleted(ObjectiveReinforce) then + Nod.MarkFailedObjective(ObjectiveReinforce) + end + + if ObjectiveDestroyGDI ~= nil and not Nod.IsObjectiveCompleted(ObjectiveDestroyGDI) then + Nod.MarkFailedObjective(ObjectiveDestroyGDI) + end + end + + if not Nod.IsObjectiveCompleted(ObjectiveReinforce) then + if not PlayerHasBuildings(Nod2) and not PlayerHasBuildings(Nod3) then + Nod.MarkFailedObjective(ObjectiveReinforce) + end + end + end +end + +OncePerFiveSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 125 == 0 then + UpdatePlayerBaseLocations() + + if ObjectiveDestroyGDI ~= nil and not PlayerHasBuildings(GDI) then + Nod.MarkCompletedObjective(ObjectiveDestroyGDI) + end + end +end + +OncePerThirtySecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % DateTime.Seconds(30) == 0 then + CalculatePlayerCharacteristics() + end +end + +-- Functions + +InitNod = function() + local nod2Forces = Nod2.GetGroundAttackers() + Utils.Do(nod2Forces, function(a) + CallForHelpOnDamagedOrKilled(a, WDist.New(10240), IsGroundHunterUnit, function(p) return true end) + end) + local nod3Forces = Nod3.GetGroundAttackers() + Utils.Do(nod3Forces, function(a) + CallForHelpOnDamagedOrKilled(a, WDist.New(10240), IsGroundHunterUnit, function(p) return true end) + end) +end + +InitGDI = function() + AutoRepairAndRebuildBuildings(GDI) + SetupRefAndSilosCaptureCredits(GDI) + AutoReplaceHarvesters(GDI) + AutoRebuildConyards(GDI) + + if IsHardOrAbove() then + InitAirAttackSquad(Squads.AntiHeavyAir, GDI, MissionPlayers, { "rmbc", "enli", "reap", "avtr" }) + InitAirAttackSquad(Squads.AirToAir, GDI, MissionPlayers, { "Aircraft" }, "ArmorType") + end + + local gdiGroundAttackers = GDI.GetGroundAttackers() + + Utils.Do(gdiGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsGDIGroundHunterUnit) + end) + + Trigger.AfterDelay(DateTime.Minutes(8), function() + Actor.Create("ai.minor.superweapons.enabled", true, { Owner = GDI }) + end) + + Trigger.AfterDelay(IonCannonEnabledTime[Difficulty], function() + Actor.Create("ai.superweapons.enabled", true, { Owner = GDI }) + end) +end + +InitGDIWest = function() + if GDIEastInitialized or GDIWestInitialized then + return + end + + GDIWestInitialized = true + + InitWestAttackers() + + -- main attacks will head to east base + + Squads.Main.AttackPaths = { + { EastRally1.Location }, + { EastRally2.Location }, + { EastRally3.Location }, + } + + Squads.Forward.AttackPaths = { + { EastRally2.Location }, + { EastRally4.Location }, + } + + InitGDIAttacks() +end + +InitWestAttackers = function() + local westAttackers = Utils.Where(Map.ActorsInCircle(GDIWestAttack.CenterPosition, WDist.New(7 * 1024)), function(a) + return a.HasProperty("AttackMove") + end) + + Utils.Do(westAttackers, function(a) + if a.Owner == GDI and not a.IsDead then + local dest = CPos.New(WestBaseCenter.Location.X + Utils.RandomInteger(-5,5), WestBaseCenter.Location.Y + Utils.RandomInteger(-5,5)) + a.AttackMove(dest) + a.Hunt() + Trigger.AfterDelay(DateTime.Seconds(75), function() + if not a.IsDead then + a.Stop() + Trigger.AfterDelay(DateTime.Minutes(1), function() + if not a.IsDead then + a.AttackMove(EastRally4.Location) + if IsHardOrAbove() then + Trigger.AfterDelay(DateTime.Minutes(1), function() + if not a.IsDead then + a.Hunt() + end + end) + end + end + end) + end + end) + end + end) + + local westDefenders = Nod3.GetGroundAttackers() + Utils.Do(westDefenders, function(a) + if not a.IsDead then + a.Hunt() + end + end) +end + +InitGDIEast = function() + if GDIEastInitialized or GDIWestInitialized then + return + end + + GDIEastInitialized = true + + InitEastAttackers() + + -- main attacks will head to west base + + Squads.Main.AttackPaths = { + { WestRally1.Location }, + { WestRally2.Location }, + { WestRally3.Location }, + { WestRally4.Location, WestRally1.Location }, + } + + Squads.Forward.AttackPaths = { + { WestRally1.Location }, + { WestRally2.Location }, + { WestRally3.Location }, + } + + InitGDIAttacks() +end + +InitEastAttackers = function() + local eastAttackers = Utils.Where(Map.ActorsInCircle(GDIEastAttack.CenterPosition, WDist.New(7 * 1024)), function(a) + return a.HasProperty("AttackMove") + end) + + Utils.Do(eastAttackers, function(a) + if a.Owner == GDI and not a.IsDead then + local dest = CPos.New(EastBaseCenter.Location.X + Utils.RandomInteger(-5,5), EastBaseCenter.Location.Y + Utils.RandomInteger(-5,5)) + a.AttackMove(dest) + a.Hunt() + Trigger.AfterDelay(DateTime.Seconds(75), function() + if not a.IsDead then + a.Stop() + Trigger.AfterDelay(DateTime.Minutes(1), function() + if not a.IsDead then + a.AttackMove(WestRally1.Location) + if IsHardOrAbove() then + Trigger.AfterDelay(DateTime.Minutes(1), function() + if not a.IsDead then + a.Hunt() + end + end) + end + end + end) + end + end) + end + end) + + local eastDefenders = Nod2.GetGroundAttackers() + Utils.Do(eastDefenders, function(a) + if not a.IsDead then + a.Hunt() + end + end) +end + +FlipEastBase = function() + if not Nod.IsObjectiveCompleted(ObjectiveReinforce) then + Utils.Do(MissionPlayers, function(p) + p.Cash = 6000 + CashAdjustments[Difficulty] + end) + + Utils.Do(NodRadarProviders, function(p) + p.Destroy() + end) + + ObjectiveDestroyGDI = Nod.AddObjective("Destroy GDI forces.") + Nod.MarkCompletedObjective(ObjectiveReinforce) + TransferEastNod() + + if IsNormalOrAbove() then + Trigger.AfterDelay(DateTime.Seconds(15), function() + InitEastAttackers() + end) + end + end +end + +-- overridden in co-op version +TransferEastNod = function() + local nod2Assets = Nod2.GetActors() + Utils.Do(nod2Assets, function(a) + if not a.IsDead and a.Type ~= "player" then + a.Owner = Nod + end + end) +end + +FlipWestBase = function() + if not Nod.IsObjectiveCompleted(ObjectiveReinforce) then + Utils.Do(MissionPlayers, function(p) + p.Cash = 6000 + CashAdjustments[Difficulty] + end) + + Utils.Do(NodRadarProviders, function(p) + p.Destroy() + end) + + ObjectiveDestroyGDI = Nod.AddObjective("Destroy GDI forces.") + Nod.MarkCompletedObjective(ObjectiveReinforce) + TransferWestNod() + + if IsNormalOrAbove() then + Trigger.AfterDelay(DateTime.Seconds(15), function() + InitWestAttackers() + end) + end + end +end + +-- overridden in co-op version +TransferWestNod = function() + local nod3Assets = Nod3.GetActors() + Utils.Do(nod3Assets, function(a) + if not a.IsDead and a.Type ~= "player" then + a.Owner = Nod + end + end) +end + +InitGDIAttacks = function() + InitAttackSquad(Squads.Main, GDI) + InitAttackSquad(Squads.Forward, GDI) + InitAirAttackSquad(Squads.GDIAir, GDI) +end diff --git a/mods/ca/missions/main-campaign/ca13-abasement/abasement-rules.yaml b/mods/ca/missions/main-campaign/ca13-abasement/abasement-rules.yaml new file mode 100644 index 0000000000..64074e9fed --- /dev/null +++ b/mods/ca/missions/main-campaign/ca13-abasement/abasement-rules.yaml @@ -0,0 +1,93 @@ +^Palettes: + FlashPostProcessEffect@LIGHTNINGSTRIKE: + Type: LightningStrike + WeatherOverlay@RAIN: + WindTick: 150, 550 + UseSquares: false + ScatterDirection: 0, 0 + Gravity: 20, 25 + SwingOffset: 0, 0 + SwingSpeed: 0, 0 + SwingAmplitude: 0, 0 + ParticleColors: 72aaae, 72aea6, 5caea3, 6da69f + LineTailAlphaValue: 30 + ParticleSize: 1, 1 + ParticleDensityFactor: 10 + TerrainLighting: + TintPostProcessEffect: + Red: 1.22 + Green: 1.27 + Blue: 1.15 + Ambient: 0.55 + +World: + LuaScript: + Scripts: campaign.lua, abasement.lua + MissionData: + Briefing: Comrade General, our forces were too late to stop the madman Kane from unleashing his new army of cyborgs. Our forces suffered a catastrophic defeat as a result.\n\nThe situation is grim on all fronts. The Allies and their GDI friends have resumed their assaults on our western territories, and the alien invaders continue to pour through their wormholes wherever Tiberium is found.\n\nKane's army unexpectedly halted their advance and we have been presented with an offer. If we assist the Brotherhood in retaking territory they have lost to the Scrin and capture one of their Signal Transmitters, Kane promises to cease hostilities against us.\n\nFor now, we have little choice.\n\nEstablish a base in former Nod territory now occupied by the Scrin. Nod will provide reinforcements if we can secure their abandoned bases. Build up your forces and capture the Signal Transmitter that we know has been built in the area. + MapOptions: + ShortGameCheckboxEnabled: False + MusicPlaylist: + StartingMusic: tren226m + +Player: + PlayerResources: + DefaultCash: 6000 + +# Disable powers for AI + +^NodAirdropPowers: + ParatroopersPowerCA@NodAirDrop: + Prerequisites: ~!botplayer + +# Disable tech + +BORI: + Inherits@CAMPAIGNDISABLED: ^Disabled + +MSLO: + Inherits@CAMPAIGNDISABLED: ^Disabled + +MSHP: + Inherits@CAMPAIGNDISABLED: ^Disabled + +TMPL: + Inherits@CAMPAIGNDISABLED: ^Disabled + +TMPP: + Inherits@CAMPAIGNDISABLED: ^Disabled + +SGEN: + Inherits@CAMPAIGNDISABLED: ^Disabled + +# Misc + +SIGN: + Inherits@CAMPAIGNDISABLED: ^Disabled + CaptureNotification: + TextNotification: Structure captured. + LoseNotification: OurBuildingCaptured + LoseTextNotification: Structure lost (captured). + CaptureManager: + Capturable: + RequiresCondition: !build-incomplete && !being-warped + Types: building + CapturableProgressBar: + CapturableProgressBlink: + Tooltip: + GenericVisibility: None + TooltipExtras: + Attributes: • Maximum 1 can be built + +SCOL: + Power: + Amount: -20 + +# Hunt() requires only 1 AttackBase +DEVA: + -AttackFrontalCharged: + -Armament@PRIMARYUPG: + -AmbientSound@CHARGE: + -WithIdleOverlay@CHARGE1: + -WithIdleOverlay@CHARGE2: + -WithIdleOverlay@CHARGE3: diff --git a/mods/ca/missions/main-campaign/ca13-abasement/abasement.lua b/mods/ca/missions/main-campaign/ca13-abasement/abasement.lua new file mode 100644 index 0000000000..d05bd991f9 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca13-abasement/abasement.lua @@ -0,0 +1,377 @@ +MissionDir = "ca|missions/main-campaign/ca13-abasement" + + +ScrinWaterAttackPaths = { + { NorthAttackRally.Location, NorthAttack1.Location, NorthAttack2.Location, NorthAttack3.Location }, + { EastAttackRally.Location, EastAttack1.Location }, +} + +ScrinGroundAttackPaths = { + { SouthAttackRally.Location, SouthAttack1.Location, SouthAttack2a.Location, SouthAttack3.Location }, + { SouthAttackRally.Location, SouthAttack1.Location, SouthAttack2b.Location, SouthAttack3.Location }, +} + +SignalTransmitterLocation = SignalTransmitter.Location + +if Difficulty == "brutal" then + table.insert(ScrinWaterCompositions.brutal, { Aircraft = { "deva", "deva", "deva", "deva", "deva", "deva", "deva", "deva" }, MinTime = DateTime.Minutes(20) }) +end + +Squads = { + ScrinMain = { + Delay = AdjustDelayForDifficulty(DateTime.Seconds(150)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 28, Max = 55 }), + FollowLeader = true, + Compositions = AdjustCompositionsForDifficulty(UnitCompositions.Scrin), + AttackPaths = ScrinGroundAttackPaths, + }, + ScrinWater = { + Delay = AdjustDelayForDifficulty(DateTime.Seconds(180)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 12, Max = 25 }), + Compositions = ScrinWaterCompositions, + AttackPaths = ScrinWaterAttackPaths, + }, + ScrinAir = { + Delay = AdjustAirDelayForDifficulty(DateTime.Minutes(5)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 12, Max = 12 }), + Compositions = AirCompositions.Scrin + }, + ScrinAirToAir = AirToAirSquad({ "stmr", "enrv", "torm" }, AdjustAirDelayForDifficulty(DateTime.Minutes(10))), + NodNorth = { + AttackValuePerSecond = { Min = 10, Max = 10 }, + ActiveCondition = function() + local portals = Scrin.GetActorsByType("port") + local warpSpheres = Scrin.GetActorsByType("wsph") + return #portals > 0 and #warpSpheres > 0 + end, + FollowLeader = false, + ProducerActors = { Infantry = { NorthHand } }, + Compositions = { { Infantry = { "n3", "n1", "n1", "n4", "n3", "n1", "n1" } } }, + AttackPaths = { { NodRally.Location, ScrinBaseCenter.Location } } + }, + NodSouth = { + AttackValuePerSecond = { Min = 20, Max = 20 }, + ActiveCondition = function() + local portals = Scrin.GetActorsByType("port") + local warpSpheres = Scrin.GetActorsByType("wsph") + return #portals > 0 and #warpSpheres > 0 + end, + DispatchDelay = DateTime.Seconds(15), + FollowLeader = false, + ProducerActors = { Infantry = { SouthHand }, Vehicles = { SouthAirstrip } }, + Compositions = { + easy = { + { Infantry = { "n3", "n1", "n1", "n4", "n3", "n1", "n1" }, Vehicles = { "ltnk", "ftnk", "arty.nod" } }, + { Infantry = {}, Vehicles = { "bike", "bike", "bike", "bike", "bggy" } } + }, + normal = { + { Infantry = { "n3", "n1", "n1", "n4", "n3", "n1", "n1" }, Vehicles = { "ltnk", "ftnk", "howi" } }, + { Infantry = {}, Vehicles = { "bike", "bike", "bike", "bggy" } } + }, + hard = { + { Infantry = { "n3", "n1", "n1", "n4", "n3", "n1", "n1" }, Vehicles = { "ltnk", "ftnk", "bggy" } }, + { Infantry = {}, Vehicles = { "bike", "bike", "bike" } } + }, + vhard = { + { Infantry = { "n3", "n1", "n1", "n4", "n3", "n1", "n1" }, Vehicles = { "ltnk", "ftnk", "bggy" } }, + { Infantry = {}, Vehicles = { "bike", "bike", "bike" } } + }, + brutal = { + { Infantry = { "n3", "n1", "n1", "n4", "n3", "n1", "n1" }, Vehicles = { "ltnk", "ftnk", "bggy" } }, + { Infantry = {}, Vehicles = { "bike", "bike", "bike" } } + } + }, + AttackPaths = { { NodRally.Location, ScrinBaseCenter.Location } } + }, +} + +SetupPlayers = function() + USSR = Player.GetPlayer("USSR") + Nod = Player.GetPlayer("Nod") + NodAbandoned = Player.GetPlayer("NodAbandoned") + Scrin = Player.GetPlayer("Scrin") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = { USSR } + MissionEnemies = { Scrin } +end + +WorldLoaded = function() + SetupPlayers() + + TimerTicks = 0 + NodAbandoned.Cash = 0 + NodAbandoned.Resources = 0 + Camera.Position = PlayerStart.CenterPosition + + InitObjectives(USSR) + AdjustPlayerStartingCashForDifficulty() + InitScrin() + InitNod() + SetupLightning() + + ObjectiveCaptureSignalTransmitter = USSR.AddObjective("Locate and capture Scrin Signal Transmitter.") + ObjectiveSecureNorthNodBase = USSR.AddSecondaryObjective("Secure northern Nod base.") + ObjectiveSecureSouthNodBase = USSR.AddSecondaryObjective("Secure southern Nod base.") + + Trigger.OnCapture(SignalTransmitter, function(self, captor, oldOwner, newOwner) + if IsMissionPlayer(newOwner) then + USSR.MarkCompletedObjective(ObjectiveCaptureSignalTransmitter) + end + end) + + Trigger.OnKilled(SignalTransmitter, function(self, killer) + if not USSR.IsObjectiveCompleted(ObjectiveCaptureSignalTransmitter) then + USSR.MarkFailedObjective(ObjectiveCaptureSignalTransmitter) + end + end) + + Trigger.OnEnteredProximityTrigger(SignalTransmitter.CenterPosition, WDist.New(8 * 1024), function(a, id) + if IsMissionPlayer(a.Owner) then + Trigger.RemoveProximityTrigger(id) + SignalTransmitterDiscovered() + end + end) + + AfterWorldLoaded() +end + +Tick = function() + OncePerSecondChecks() + OncePerFiveSecondChecks() + OncePerThirtySecondChecks() + AfterTick() +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + Scrin.Resources = Scrin.ResourceCapacity - 500 + Nod.Resources = Nod.ResourceCapacity - 500 + + if TimerTicks > 0 then + if TimerTicks > 25 then + TimerTicks = TimerTicks - 25 + else + TimerTicks = 0 + end + end + + if MissionPlayersHaveNoRequiredUnits() then + if ObjectiveCaptureSignalTransmitter ~= nil and not USSR.IsObjectiveCompleted(ObjectiveCaptureSignalTransmitter) then + USSR.MarkFailedObjective(ObjectiveCaptureSignalTransmitter) + end + end + end +end + +OncePerFiveSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 125 == 0 then + UpdatePlayerBaseLocations() + CheckNorthBase() + CheckSouthBase() + end +end + +OncePerThirtySecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % DateTime.Seconds(30) == 0 then + CalculatePlayerCharacteristics() + end +end + +InitScrin = function() + if Difficulty == "easy" then + RebuildExcludes.Scrin = { Types = { "scol", "ptur" } } + end + + AutoRepairAndRebuildBuildings(Scrin, 15) + SetupRefAndSilosCaptureCredits(Scrin) + AutoReplaceHarvesters(Scrin) + AutoRebuildConyards(Scrin) + InitAiUpgrades(Scrin) + InitAttackSquad(Squads.ScrinMain, Scrin) + InitAttackSquad(Squads.ScrinWater, Scrin) + InitAirAttackSquad(Squads.ScrinAir, Scrin) + + if IsHardOrAbove() then + InitAirAttackSquad(Squads.ScrinAirToAir, Scrin, MissionPlayers, { "Aircraft" }, "ArmorType") + end + + local scrinGroundAttackers = Scrin.GetGroundAttackers() + + Utils.Do(scrinGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsScrinGroundHunterUnit) + end) +end + +InitNod = function() + Actor.Create("ai.unlimited.power", true, { Owner = Nod }) + Actor.Create("hazmat.upgrade", true, { Owner = Nod }) + + -- Prevent Nod forces destroying Signal Transmitter + Trigger.OnEnteredProximityTrigger(NodAttackLimiter.CenterPosition, WDist.New(8 * 1024), function(a, id) + if a.Owner == Nod then + Trigger.ClearAll(a) + Trigger.AfterDelay(1, function() + if not a.IsDead and a.HasProperty("Hunt") then + a.Stop() + a.Move(NodRally.Location) + a.Hunt() + end + end) + EndNodAttacks = true + end + end) +end + +SetupLightning = function() + local nextStrikeDelay = Utils.RandomInteger(DateTime.Seconds(4), DateTime.Seconds(30)) + Trigger.AfterDelay(nextStrikeDelay, function() + LightningStrike() + SetupLightning() + end) +end + +LightningStrike = function() + local duration = Utils.RandomInteger(5, 8) + local thunderDelay = Utils.RandomInteger(5, 65) + local soundNumber + Lighting.Flash("LightningStrike", duration) + + repeat + soundNumber = Utils.RandomInteger(1, 7) + until(soundNumber ~= LastSoundNumber) + LastSoundNumber = soundNumber + + Trigger.AfterDelay(thunderDelay, function() + Media.PlaySound("thunder" .. soundNumber .. ".aud") + end) +end + +CheckNorthBase = function() + if not USSR.IsObjectiveCompleted(ObjectiveSecureNorthNodBase) then + local scrinNearby = Map.ActorsInBox(NorthBaseTopLeft.CenterPosition, NorthBaseBottomRight.CenterPosition, function(a) + return a.Owner == Scrin and a.Type ~= "camera" + end) + + if #scrinNearby == 0 then + USSR.MarkCompletedObjective(ObjectiveSecureNorthNodBase) + FlipNorthBase() + end + end +end + +CheckSouthBase = function() + if not USSR.IsObjectiveCompleted(ObjectiveSecureSouthNodBase) then + local scrinNearby = Map.ActorsInBox(SouthBaseTopLeft.CenterPosition, SouthBaseBottomRight.CenterPosition, function(a) + return a.Owner == Scrin and a.Type ~= "camera" + end) + + if #scrinNearby == 0 then + USSR.MarkCompletedObjective(ObjectiveSecureSouthNodBase) + FlipSouthBase() + end + end +end + +FlipNorthBase = function() + local northBaseStructures = Map.ActorsInBox(NorthBaseTopLeft.CenterPosition, NorthBaseBottomRight.CenterPosition, function(a) + return a.Owner == NodAbandoned and not a.IsDead + end) + Utils.Do(northBaseStructures, function(a) + a.Owner = Nod + if a.HasProperty("StartBuildingRepairs") then + AutoRepairBuilding(a, Nod) + AutoRebuildBuilding(a, Nod) + Trigger.AfterDelay(5, function() + if not a.IsDead then + a.StartBuildingRepairs() + end + end) + end + end) + + InitAttackSquad(Squads.NodNorth, Nod, Scrin) + + local turret1 = Actor.Create("gun.nod", true, { Owner = Nod, Location = NodTurret1.Location }) + AutoRepairBuilding(turret1, Nod) + AutoRebuildBuilding(turret1, Nod) + + Trigger.AfterDelay(15, function() + local turret2 = Actor.Create("gun.nod", true, { Owner = Nod, Location = NodTurret2.Location }) + AutoRepairBuilding(turret2, Nod) + AutoRebuildBuilding(turret2, Nod) + end) + + Trigger.AfterDelay(30, function() + local turret3 = Actor.Create("gun.nod", true, { Owner = Nod, Location = NodTurret3.Location }) + AutoRepairBuilding(turret3, Nod) + AutoRebuildBuilding(turret3, Nod) + end) + + MediaCA.PlaySound(MissionDir .. "/r2_northernnodbasesecured.aud", 2) + BaseFlipNotification() +end + +FlipSouthBase = function() + local southBaseStructures = Map.ActorsInBox(SouthBaseTopLeft.CenterPosition, SouthBaseBottomRight.CenterPosition, function(a) + return a.Owner == NodAbandoned and not a.IsDead + end) + Utils.Do(southBaseStructures, function(a) + a.Owner = Nod + if a.HasProperty("StartBuildingRepairs") then + AutoRepairBuilding(a, Nod) + AutoRebuildBuilding(a, Nod) + + Trigger.AfterDelay(5, function() + if not a.IsDead then + a.StartBuildingRepairs() + end + end) + end + end) + + InitAttackSquad(Squads.NodSouth, Nod, Scrin) + + local airstrips = Nod.GetActorsByType("airs") + if #airstrips > 0 then + airstrips[1].Produce("harv.td") + end + + local turret4 = Actor.Create("gun.nod", true, { Owner = Nod, Location = NodTurret4.Location }) + AutoRepairBuilding(turret4, Nod) + AutoRebuildBuilding(turret4, Nod) + + Trigger.AfterDelay(15, function() + local turret5 = Actor.Create("gun.nod", true, { Owner = Nod, Location = NodTurret5.Location }) + AutoRepairBuilding(turret5, Nod) + AutoRebuildBuilding(turret5, Nod) + end) + + MediaCA.PlaySound(MissionDir .. "/r2_southernnodbasesecured.aud", 2) + BaseFlipNotification() +end + +SignalTransmitterDiscovered = function() + if not IsSignalTransmitterDiscovered then + IsSignalTransmitterDiscovered = true + Beacon.New(USSR, SignalTransmitter.CenterPosition) + Notification("Signal Transmitter located.") + MediaCA.PlaySound(MissionDir .. "/r2_signaltransmitterlocated.aud", 2) + local autoCamera = Actor.Create("smallcamera", true, { Owner = USSR, Location = SignalTransmitterLocation }) + Trigger.AfterDelay(DateTime.Seconds(5), autoCamera.Destroy) + end +end + +BaseFlipNotification = function() + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(4)), function() + if not IsFirstBaseFlipped then + IsFirstBaseFlipped = true + MediaCA.PlaySound(MissionDir .. "/seth_appreciate.aud", 2) + Media.DisplayMessage("The Brotherhood appreciates your efforts. We will begin deploying our troops to assist you.", "Nod Commander", HSLColor.FromHex("FF0000")) + elseif not IsSecondBaseFlipped then + IsSecondBaseFlipped = true + MediaCA.PlaySound(MissionDir .. "/seth_kanepleased.aud", 2) + Media.DisplayMessage("Kane will be pleased. Now focus your efforts on securing the Signal Transmitter.", "Nod Commander", HSLColor.FromHex("FF0000")) + end + end) +end diff --git a/mods/ca/missions/main-campaign/ca13-abasement/map.bin b/mods/ca/missions/main-campaign/ca13-abasement/map.bin new file mode 100644 index 0000000000..f8df1b0dbb Binary files /dev/null and b/mods/ca/missions/main-campaign/ca13-abasement/map.bin differ diff --git a/mods/ca/missions/main-campaign/ca13-abasement/map.png b/mods/ca/missions/main-campaign/ca13-abasement/map.png new file mode 100644 index 0000000000..81bf89ba43 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca13-abasement/map.png differ diff --git a/mods/ca/missions/main-campaign/ca13-abasement/map.yaml b/mods/ca/missions/main-campaign/ca13-abasement/map.yaml new file mode 100644 index 0000000000..842fae2f38 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca13-abasement/map.yaml @@ -0,0 +1,2104 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 13: Abasement + +Author: Darkademic + +Tileset: TEMPERAT + +MapSize: 98,98 + +Bounds: 1,1,96,96 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: USSR, Scrin, Nod + PlayerReference@USSR: + Name: USSR + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: soviet + LockColor: True + Color: FE1100 + LockSpawn: True + LockTeam: True + Allies: Nod + Enemies: Scrin, Creeps + PlayerReference@Scrin: + Name: Scrin + Bot: campaign + Faction: scrin + Color: 7700FF + Enemies: USSR, Nod, Creeps + PlayerReference@Nod: + Name: Nod + Bot: campaign + Faction: nod + Color: 6D738C + Allies: USSR + Enemies: Scrin, Creeps + PlayerReference@NodAbandoned: + Name: NodAbandoned + Bot: campaign + Faction: nod + Color: 6D738C + +Actors: + SignalTransmitter: sign + Owner: Scrin + Location: 9,5 + Actor14: shar + Owner: Scrin + Location: 8,13 + TurretFacing: 396 + Actor15: shar + Owner: Scrin + Location: 19,19 + TurretFacing: 404 + Actor16: shar + Owner: Scrin + Location: 21,11 + TurretFacing: 642 + Actor17: shar + Owner: Scrin + Location: 6,3 + TurretFacing: 269 + Actor18: shar + Owner: Scrin + Location: 17,4 + TurretFacing: 888 + Actor19: shar + Owner: Scrin + Location: 15,13 + TurretFacing: 523 + Actor20: grav + Owner: Scrin + Location: 18,13 + Actor21: ptur + Owner: Scrin + Location: 26,10 + TurretFacing: 808 + Actor22: ptur + Owner: Scrin + Location: 24,4 + TurretFacing: 713 + Actor23: scol + Owner: Scrin + Location: 20,9 + Actor24: scol + Owner: Scrin + Location: 13,10 + Actor25: scol + Owner: Scrin + Location: 5,9 + Actor35: swal + Owner: Scrin + Location: 18,48 + Actor36: swal + Owner: Scrin + Location: 18,47 + Actor37: swal + Owner: Scrin + Location: 18,46 + Actor38: swal + Owner: Scrin + Location: 18,45 + Actor39: swal + Owner: Scrin + Location: 18,44 + Actor40: swal + Owner: Scrin + Location: 18,43 + Actor41: swal + Owner: Scrin + Location: 18,42 + Actor42: swal + Owner: Scrin + Location: 18,41 + Actor43: swal + Owner: Scrin + Location: 19,41 + Actor44: swal + Owner: Scrin + Location: 19,40 + Actor45: swal + Owner: Scrin + Location: 20,40 + Actor46: swal + Owner: Scrin + Location: 21,40 + Actor47: swal + Owner: Scrin + Location: 22,40 + Actor48: swal + Owner: Scrin + Location: 23,40 + Actor49: swal + Owner: Scrin + Location: 23,39 + Actor50: swal + Owner: Scrin + Location: 23,38 + Actor51: swal + Owner: Scrin + Location: 23,37 + Actor52: swal + Owner: Scrin + Location: 23,36 + Actor53: swal + Owner: Scrin + Location: 23,35 + Actor54: swal + Owner: Scrin + Location: 22,35 + Actor55: swal + Owner: Scrin + Location: 22,34 + Actor56: swal + Owner: Scrin + Location: 23,34 + Actor57: swal + Owner: Scrin + Location: 29,29 + Actor58: swal + Owner: Scrin + Location: 29,30 + Actor59: swal + Owner: Scrin + Location: 30,29 + Actor60: swal + Owner: Scrin + Location: 30,30 + Actor61: swal + Owner: Scrin + Location: 31,30 + Actor62: swal + Owner: Scrin + Location: 32,30 + Actor63: swal + Owner: Scrin + Location: 33,30 + Actor64: swal + Owner: Scrin + Location: 34,30 + Actor65: swal + Owner: Scrin + Location: 34,29 + Actor66: swal + Owner: Scrin + Location: 35,29 + Actor67: swal + Owner: Scrin + Location: 35,30 + Actor68: swal + Owner: Scrin + Location: 36,31 + Actor69: swal + Owner: Scrin + Location: 38,31 + Actor70: swal + Owner: Scrin + Location: 39,31 + Actor71: swal + Owner: Scrin + Location: 37,31 + Actor72: swal + Owner: Scrin + Location: 35,31 + Actor73: swal + Owner: Scrin + Location: 39,32 + Actor74: swal + Owner: Scrin + Location: 40,32 + Actor75: swal + Owner: Scrin + Location: 40,33 + Actor76: swal + Owner: Scrin + Location: 41,33 + Actor77: swal + Owner: Scrin + Location: 41,34 + Actor78: swal + Owner: Scrin + Location: 42,34 + Actor79: swal + Owner: Scrin + Location: 19,48 + Actor80: swal + Owner: Scrin + Location: 20,48 + Actor81: swal + Owner: Scrin + Location: 21,48 + Actor82: swal + Owner: Scrin + Location: 22,48 + Actor83: swal + Owner: Scrin + Location: 23,48 + Actor84: swal + Owner: Scrin + Location: 24,48 + Actor85: swal + Owner: Scrin + Location: 24,49 + Actor86: swal + Owner: Scrin + Location: 25,49 + Actor87: swal + Owner: Scrin + Location: 26,49 + Actor88: swal + Owner: Scrin + Location: 27,49 + Actor89: swal + Owner: Scrin + Location: 27,48 + Actor90: swal + Owner: Scrin + Location: 28,48 + Actor91: swal + Owner: Scrin + Location: 29,48 + Actor92: swal + Owner: Scrin + Location: 30,48 + Actor93: swal + Owner: Scrin + Location: 31,48 + Actor94: swal + Owner: Scrin + Location: 32,48 + Actor95: swal + Owner: Scrin + Location: 32,47 + Actor96: swal + Owner: Scrin + Location: 31,47 + Actor97: swal + Owner: Scrin + Location: 37,47 + Actor98: swal + Owner: Scrin + Location: 37,48 + Actor99: swal + Owner: Scrin + Location: 38,48 + Actor100: swal + Owner: Scrin + Location: 38,47 + Actor101: swal + Owner: Scrin + Location: 42,35 + Actor102: swal + Owner: Scrin + Location: 42,36 + Actor103: swal + Owner: Scrin + Location: 39,48 + Actor104: swal + Owner: Scrin + Location: 41,48 + Actor105: swal + Owner: Scrin + Location: 40,48 + Actor106: swal + Owner: Scrin + Location: 42,37 + Actor107: swal + Owner: Scrin + Location: 42,45 + Actor108: swal + Owner: Scrin + Location: 42,46 + Actor109: swal + Owner: Scrin + Location: 42,47 + Actor110: swal + Owner: Scrin + Location: 42,48 + Actor111: swal + Owner: Scrin + Location: 41,44 + Actor112: swal + Owner: Scrin + Location: 41,45 + Actor113: swal + Owner: Scrin + Location: 42,44 + Actor114: swal + Owner: Scrin + Location: 42,38 + Actor115: swal + Owner: Scrin + Location: 42,39 + Actor116: swal + Owner: Scrin + Location: 41,39 + Actor117: swal + Owner: Scrin + Location: 41,38 + Actor118: sfac + Owner: Scrin + Location: 24,38 + Actor119: rea2 + Owner: Scrin + Location: 19,45 + Actor120: rea2 + Owner: Scrin + Location: 19,42 + Actor121: rea2 + Owner: Scrin + Location: 32,31 + Actor122: rea2 + Owner: Scrin + Location: 29,31 + Actor124: proc.scrin + Owner: Scrin + Location: 37,36 + Actor127: nerv + Owner: Scrin + Location: 37,32 + Actor128: scrt + Owner: Scrin + Location: 23,42 + Portal2: port + Owner: Scrin + Location: 37,42 + WarpSphere1: wsph + Owner: Scrin + Location: 26,44 + Actor131: proc.scrin + Owner: Scrin + Location: 28,39 + Actor126: grav + Owner: Scrin + Location: 29,35 + Actor132: rea2 + Owner: Scrin + Location: 24,34 + Actor133: silo.scrin + Owner: Scrin + Location: 30,39 + Actor134: silo.scrin + Owner: Scrin + Location: 28,39 + Actor135: silo.scrin + Owner: Scrin + Location: 37,36 + Actor136: silo.scrin + Owner: Scrin + Location: 39,36 + Actor137: ptur + Owner: Scrin + Location: 32,49 + TurretFacing: 523 + Actor138: ptur + Owner: Scrin + Location: 37,49 + TurretFacing: 594 + Actor139: ptur + Owner: Scrin + Location: 43,44 + TurretFacing: 697 + Actor140: ptur + Owner: Scrin + Location: 43,39 + TurretFacing: 769 + Actor141: scol + Owner: Scrin + Location: 41,47 + Actor142: scol + Owner: Scrin + Location: 30,47 + Actor143: scol + Owner: Scrin + Location: 41,37 + Actor144: shar + Owner: Scrin + Location: 25,48 + Actor145: shar + Owner: Scrin + Location: 40,34 + Actor146: shar + Owner: Scrin + Location: 39,47 + Actor147: shar + Owner: Scrin + Location: 20,41 + Actor148: scol + Owner: Scrin + Location: 25,31 + Actor149: ptur + Owner: Scrin + Location: 22,33 + Actor150: ptur + Owner: Scrin + Location: 28,29 + Actor151: rea2 + Owner: Scrin + Location: 5,5 + Actor152: rea2 + Owner: Scrin + Location: 7,9 + Actor153: rea2 + Owner: Scrin + Location: 11,12 + Actor154: ptur + Owner: Scrin + Location: 9,4 + TurretFacing: 642 + Actor241: sbag + Owner: NodAbandoned + Location: 89,1 + Actor242: sbag + Owner: NodAbandoned + Location: 88,1 + Actor243: sbag + Owner: NodAbandoned + Location: 87,1 + Actor244: sbag + Owner: NodAbandoned + Location: 86,1 + Actor245: sbag + Owner: NodAbandoned + Location: 85,1 + Actor246: sbag + Owner: NodAbandoned + Location: 84,1 + Actor247: sbag + Owner: NodAbandoned + Location: 83,1 + Actor248: sbag + Owner: NodAbandoned + Location: 82,1 + Actor249: sbag + Owner: NodAbandoned + Location: 81,1 + Actor250: sbag + Owner: NodAbandoned + Location: 80,1 + Actor251: sbag + Owner: NodAbandoned + Location: 90,1 + Actor252: sbag + Owner: NodAbandoned + Location: 90,2 + Health: 8 + Actor253: sbag + Owner: NodAbandoned + Location: 79,1 + Actor254: sbag + Owner: NodAbandoned + Location: 77,1 + Actor255: sbag + Owner: NodAbandoned + Location: 78,1 + Actor262: sbag + Owner: NodAbandoned + Location: 90,4 + Health: 30 + Actor271: sbag + Owner: NodAbandoned + Location: 74,1 + Actor272: sbag + Owner: NodAbandoned + Location: 75,1 + Actor273: sbag + Owner: NodAbandoned + Location: 76,1 + Actor274: sbag + Owner: NodAbandoned + Location: 74,2 + Actor275: sbag + Owner: NodAbandoned + Location: 74,3 + Health: 41 + Actor281: sbag + Owner: NodAbandoned + Location: 77,11 + Actor282: sbag + Owner: NodAbandoned + Location: 79,11 + Actor283: sbag + Owner: NodAbandoned + Location: 76,11 + Health: 23 + Actor284: sbag + Owner: NodAbandoned + Location: 78,11 + Health: 28 + Actor276: sbag + Owner: NodAbandoned + Location: 76,8 + Health: 29 + Actor278: sbag + Owner: NodAbandoned + Location: 76,9 + Actor279: sbag + Owner: NodAbandoned + Location: 76,10 + Health: 24 + Actor277: sbag + Owner: NodAbandoned + Location: 75,8 + Actor280: sbag + Owner: NodAbandoned + Location: 74,8 + Health: 48 + Actor285: sbag + Owner: NodAbandoned + Location: 74,7 + Health: 21 + Actor268: sbag + Owner: NodAbandoned + Location: 80,11 + Health: 43 + Actor269: sbag + Owner: NodAbandoned + Location: 81,11 + Health: 38 + Actor270: sbag + Owner: NodAbandoned + Location: 86,11 + Actor286: sbag + Owner: NodAbandoned + Location: 87,11 + Health: 35 + Actor287: sbag + Owner: NodAbandoned + Location: 88,11 + Actor288: sbag + Owner: NodAbandoned + Location: 89,11 + Actor289: sbag + Owner: NodAbandoned + Location: 90,11 + Health: 20 + Actor290: sbag + Owner: NodAbandoned + Location: 90,10 + Actor292: sbag + Owner: NodAbandoned + Location: 90,8 + Health: 35 + Actor291: sbag + Owner: NodAbandoned + Location: 90,9 + Actor261: sbag + Owner: NodAbandoned + Location: 90,3 + Actor293: brik + Owner: NodAbandoned + Location: 36,79 + Actor294: brik + Owner: NodAbandoned + Location: 37,79 + Actor295: brik + Owner: NodAbandoned + Health: 32 + Location: 38,79 + Actor296: brik + Owner: NodAbandoned + Location: 39,79 + Actor297: brik + Owner: NodAbandoned + Health: 65 + Location: 40,79 + Actor298: brik + Owner: NodAbandoned + Health: 68 + Location: 41,79 + Actor299: brik + Owner: NodAbandoned + Health: 25 + Location: 42,79 + Actor300: brik + Owner: NodAbandoned + Health: 28 + Location: 44,79 + Actor301: brik + Owner: NodAbandoned + Health: 58 + Location: 45,79 + Actor302: brik + Owner: NodAbandoned + Location: 46,79 + Actor303: brik + Owner: NodAbandoned + Location: 47,79 + Actor304: brik + Owner: NodAbandoned + Health: 31 + Location: 51,79 + Actor305: brik + Owner: NodAbandoned + Location: 52,79 + Actor306: brik + Owner: NodAbandoned + Health: 32 + Location: 53,79 + Actor307: brik + Owner: NodAbandoned + Location: 54,79 + Actor308: brik + Owner: NodAbandoned + Health: 60 + Location: 55,79 + Actor309: brik + Owner: NodAbandoned + Health: 24 + Location: 56,79 + Actor310: brik + Owner: NodAbandoned + Health: 24 + Location: 57,79 + Actor311: brik + Owner: NodAbandoned + Location: 36,80 + Actor312: nuk2 + Owner: NodAbandoned + Location: 37,80 + Health: 31 + Actor313: nuk2 + Owner: NodAbandoned + Location: 39,80 + Health: 14 + Actor314: nuk2 + Owner: NodAbandoned + Location: 41,80 + Health: 31 + Actor315: brik + Owner: NodAbandoned + Health: 31 + Location: 46,80 + Actor316: brik + Owner: NodAbandoned + Location: 47,80 + Actor317: brik + Owner: NodAbandoned + Location: 51,80 + Actor318: brik + Owner: NodAbandoned + Health: 39 + Location: 52,80 + Actor319: brik + Owner: NodAbandoned + Health: 27 + Location: 57,80 + Actor320: brik + Owner: NodAbandoned + Location: 36,81 + Actor321: brik + Owner: NodAbandoned + Location: 57,81 + Actor322: brik + Owner: NodAbandoned + Location: 36,82 + Actor323: brik + Owner: NodAbandoned + Location: 57,82 + Actor324: brik + Owner: NodAbandoned + Location: 36,83 + SouthHand: hand + Owner: NodAbandoned + Location: 51,83 + Health: 19 + Actor327: brik + Owner: NodAbandoned + Health: 42 + Location: 57,83 + Actor328: brik + Owner: NodAbandoned + Location: 36,84 + Actor329: brik + Owner: NodAbandoned + Health: 57 + Location: 37,84 + SouthAirstrip: airs + Owner: NodAbandoned + Location: 42,84 + Health: 20 + Actor331: brik + Owner: NodAbandoned + Location: 56,84 + Actor332: brik + Owner: NodAbandoned + Health: 31 + Location: 57,84 + Actor333: brik + Owner: NodAbandoned + Health: 22 + Location: 36,85 + Actor334: brik + Owner: NodAbandoned + Location: 37,85 + Actor335: brik + Owner: NodAbandoned + Location: 56,85 + Actor336: brik + Owner: NodAbandoned + Health: 16 + Location: 57,85 + Actor337: rep + Owner: NodAbandoned + Location: 48,87 + Health: 24 + Actor339: brik + Owner: NodAbandoned + Location: 36,89 + Actor340: brik + Owner: NodAbandoned + Health: 23 + Location: 37,89 + Actor341: brik + Owner: NodAbandoned + Location: 56,89 + Actor342: brik + Owner: NodAbandoned + Health: 19 + Location: 57,89 + Actor343: brik + Owner: NodAbandoned + Health: 25 + Location: 36,90 + Actor344: brik + Owner: NodAbandoned + Location: 37,90 + Actor345: brik + Owner: NodAbandoned + Health: 38 + Location: 56,90 + Actor346: brik + Owner: NodAbandoned + Health: 8 + Location: 57,90 + Actor347: brik + Owner: NodAbandoned + Location: 36,91 + Actor348: brik + Owner: NodAbandoned + Health: 68 + Location: 57,91 + Actor349: brik + Owner: NodAbandoned + Health: 52 + Location: 36,92 + Actor350: brik + Owner: NodAbandoned + Location: 46,92 + Actor351: brik + Owner: NodAbandoned + Location: 47,92 + Actor352: brik + Owner: NodAbandoned + Location: 51,92 + Actor353: brik + Owner: NodAbandoned + Health: 41 + Location: 52,92 + Actor354: brik + Owner: NodAbandoned + Location: 57,92 + Actor355: brik + Owner: NodAbandoned + Health: 58 + Location: 36,93 + Actor356: brik + Owner: NodAbandoned + Location: 37,93 + Actor357: brik + Owner: NodAbandoned + Health: 48 + Location: 38,93 + Actor358: brik + Owner: NodAbandoned + Location: 39,93 + Actor359: brik + Owner: NodAbandoned + Health: 32 + Location: 40,93 + Actor360: brik + Owner: NodAbandoned + Health: 16 + Location: 42,93 + Actor361: brik + Owner: NodAbandoned + Location: 43,93 + Actor362: brik + Owner: NodAbandoned + Health: 58 + Location: 44,93 + Actor363: brik + Owner: NodAbandoned + Location: 45,93 + Actor364: brik + Owner: NodAbandoned + Location: 46,93 + Actor365: brik + Owner: NodAbandoned + Location: 47,93 + Actor366: brik + Owner: NodAbandoned + Health: 39 + Location: 51,93 + Actor367: brik + Owner: NodAbandoned + Location: 52,93 + Actor368: brik + Owner: NodAbandoned + Health: 58 + Location: 53,93 + Actor369: brik + Owner: NodAbandoned + Health: 26 + Location: 54,93 + Actor370: brik + Owner: NodAbandoned + Health: 58 + Location: 55,93 + Actor371: brik + Owner: NodAbandoned + Location: 56,93 + Actor372: brik + Owner: NodAbandoned + Location: 57,93 + Actor375: afac + Owner: NodAbandoned + Location: 53,90 + Health: 30 + Actor265: split2 + Owner: Neutral + Location: 91,30 + Actor373: split2 + Owner: Neutral + Location: 88,34 + Actor374: e1 + Owner: USSR + SubCell: 1 + Facing: 256 + Location: 85,44 + Actor376: e1 + Owner: USSR + SubCell: 4 + Facing: 256 + Location: 85,44 + Actor377: 3tnk + Owner: USSR + Facing: 256 + Location: 87,44 + Actor378: e2 + Owner: USSR + SubCell: 1 + Facing: 256 + Location: 85,46 + Actor379: e2 + Owner: USSR + SubCell: 4 + Facing: 256 + Location: 85,46 + Actor380: mcv + Owner: USSR + Location: 91,46 + Facing: 256 + Actor381: e1 + Owner: USSR + SubCell: 1 + Facing: 256 + Location: 85,48 + Actor382: e1 + Owner: USSR + SubCell: 4 + Facing: 256 + Location: 85,48 + Actor383: 3tnk + Owner: USSR + Location: 87,48 + Facing: 256 + Actor338: hq + Owner: NodAbandoned + Location: 44,88 + Health: 41 + Actor384: proc.td + Owner: NodAbandoned + Location: 40,88 + FreeActor: False + Health: 24 + NorthHelipad: hpad.td + Owner: NodAbandoned + Location: 87,8 + Health: 18 + Actor387: split2 + Owner: Neutral + Location: 70,8 + Actor388: split2 + Owner: Neutral + Location: 68,4 + Actor386: nuke + Owner: NodAbandoned + Location: 81,2 + Health: 20 + Actor389: nuke + Owner: NodAbandoned + Location: 83,2 + Health: 30 + Actor390: nuke + Owner: NodAbandoned + Location: 85,2 + Health: 16 + Actor392: silo.td + Owner: NodAbandoned + Location: 82,6 + Health: 41 + Actor393: silo.td + Owner: NodAbandoned + Location: 83,8 + Health: 22 + Actor394: silo.td + Owner: NodAbandoned + Location: 85,6 + Health: 39 + Actor395: split2 + Owner: Neutral + Location: 45,26 + Actor396: split2 + Owner: Neutral + Location: 46,34 + Actor397: split2 + Owner: Neutral + Location: 41,53 + Actor398: split2 + Owner: Neutral + Location: 28,54 + Actor399: scol + Owner: Scrin + Location: 56,56 + Actor400: shar + Owner: Scrin + Location: 47,18 + TurretFacing: 721 + Actor401: shar + Owner: Scrin + Location: 38,19 + TurretFacing: 705 + Actor402: shar + Owner: Scrin + Location: 36,10 + TurretFacing: 753 + Actor403: shar + Owner: Scrin + Location: 35,2 + TurretFacing: 777 + Actor404: shar + Owner: Scrin + Location: 32,23 + TurretFacing: 666 + Actor405: shar + Owner: Scrin + Location: 5,23 + TurretFacing: 428 + Actor406: t15.husk + Owner: Neutral + Location: 35,63 + Actor407: tc04.husk + Owner: Neutral + Location: 34,65 + Actor408: t03.husk + Owner: Neutral + Location: 43,61 + Actor409: t07.husk + Owner: Neutral + Location: 46,57 + Actor410: t13.husk + Owner: Neutral + Location: 47,63 + Actor411: tc05 + Owner: Neutral + Location: 73,61 + Actor412: tc03 + Owner: Neutral + Location: 72,60 + Actor413: t16 + Owner: Neutral + Location: 73,58 + Actor414: t17 + Owner: Neutral + Location: 78,62 + Actor415: t15 + Owner: Neutral + Location: 86,66 + Actor416: tc01 + Owner: Neutral + Location: 84,63 + Actor417: tc02 + Owner: Neutral + Location: 85,61 + Actor418: t17 + Owner: Neutral + Location: 84,62 + Actor419: t15 + Owner: Neutral + Location: 85,62 + Actor420: t07 + Owner: Neutral + Location: 82,61 + Actor421: t02 + Owner: Neutral + Location: 87,64 + Actor422: t02 + Owner: Neutral + Location: 71,63 + Actor423: t12 + Owner: Neutral + Location: 69,62 + Actor424: t01 + Owner: Neutral + Location: 70,70 + Actor425: t15 + Owner: Neutral + Location: 62,72 + Actor426: tc05 + Owner: Neutral + Location: 50,71 + Actor427: t12 + Owner: Neutral + Location: 73,74 + Actor428: tc01 + Owner: Neutral + Location: 94,68 + Actor429: tc02 + Owner: Neutral + Location: 59,55 + Actor430: t11 + Owner: Neutral + Location: 64,51 + Actor431: t15 + Owner: Neutral + Location: 63,26 + Actor432: t11 + Owner: Neutral + Location: 83,22 + Actor433: t16 + Owner: Neutral + Location: 79,26 + Actor434: t17 + Owner: Neutral + Location: 68,18 + Actor435: t01 + Owner: Neutral + Location: 60,22 + Actor436: t06 + Owner: Neutral + Location: 51,3 + Actor437: t14 + Owner: Neutral + Location: 52,21 + Actor438: t07 + Owner: Neutral + Location: 53,18 + Actor439: t06 + Owner: Neutral + Location: 58,14 + Actor440: t02 + Owner: Neutral + Location: 56,11 + Actor441: t10 + Owner: Neutral + Location: 57,7 + Actor442: t15 + Owner: Neutral + Location: 89,16 + Actor443: t06 + Owner: Neutral + Location: 92,17 + Actor444: t01 + Owner: Neutral + Location: 74,15 + Actor445: t03 + Owner: Neutral + Location: 92,11 + Actor446: srep + Owner: Scrin + Location: 33,34 + WarpSphere2: wsph + Owner: Scrin + Location: 33,37 + Actor448: scol + Owner: Scrin + Location: 57,69 + Actor450: scol + Owner: Scrin + Location: 59,18 + Actor484: scol + Owner: Scrin + Location: 6,65 + Actor485: scol + Owner: Scrin + Location: 22,60 + Actor486: scol + Owner: Scrin + Location: 39,68 + Actor495: scol + Owner: Scrin + Location: 60,46 + Actor496: tc01 + Owner: Neutral + Location: 58,45 + Actor497: tc05 + Owner: Neutral + Location: 54,45 + Actor498: t15 + Owner: Neutral + Location: 56,47 + Actor499: t16 + Owner: Neutral + Location: 55,48 + Actor500: tc03 + Owner: Neutral + Location: 55,50 + Actor501: t17 + Owner: Neutral + Location: 52,46 + Actor502: t17 + Owner: Neutral + Location: 55,25 + Actor503: tc04 + Owner: Neutral + Location: 55,3 + Actor504: tc03 + Owner: Neutral + Location: 72,14 + Actor505: split2 + Owner: Neutral + Location: 78,90 + Actor506: split2 + Owner: Neutral + Location: 82,91 + Actor507: split2 + Owner: Neutral + Location: 29,81 + Actor508: split2 + Owner: Neutral + Location: 22,91 + Actor509: tc04 + Owner: Neutral + Location: 7,58 + Actor510: tc04 + Owner: Neutral + Location: 12,23 + Actor511: t02 + Owner: Neutral + Location: 11,27 + Actor512: t06 + Owner: Neutral + Location: 11,24 + Actor513: t06 + Owner: Neutral + Location: 8,56 + Actor514: t16 + Owner: Neutral + Location: 13,50 + Actor515: sbag + Owner: NodAbandoned + Location: 85,11 + Actor516: t16 + Owner: Neutral + Location: 87,83 + Actor517: tc02 + Owner: Neutral + Location: 93,80 + Actor518: t16 + Owner: Neutral + Location: 88,73 + Actor519: t17 + Owner: Neutral + Location: 82,76 + Actor520: t16 + Owner: Neutral + Location: 67,83 + Actor521: t12 + Owner: Neutral + Location: 65,91 + Actor522: t07 + Owner: Neutral + Location: 93,90 + Actor523: t02 + Owner: Neutral + Location: 23,70 + Actor524: tc01 + Owner: Neutral + Location: 28,68 + Actor525: tc02 + Owner: Neutral + Location: 5,72 + Actor526: tc05 + Owner: Neutral + Location: 23,76 + Actor527: t16 + Owner: Neutral + Location: 26,74 + Actor528: t08 + Owner: Neutral + Location: 33,74 + Actor529: t03 + Owner: Neutral + Location: 8,84 + Actor530: tc03 + Owner: Neutral + Location: 52,95 + Actor531: t16 + Owner: Neutral + Location: 35,95 + Actor532: tc01 + Owner: Neutral + Location: 36,95 + Actor533: t16 + Owner: Neutral + Location: 32,95 + Actor534: t16 + Owner: Neutral + Location: 62,95 + Actor535: t07 + Owner: Neutral + Location: 71,94 + Actor536: t03 + Owner: Neutral + Location: 13,95 + Actor537: t11 + Owner: Neutral + Location: 15,95 + Actor538: t16 + Owner: Neutral + Location: 17,95 + Actor539: t07 + Owner: Neutral + Location: 14,94 + Actor540: t16 + Owner: Neutral + Location: 13,36 + Actor541: e1 + Owner: USSR + SubCell: 1 + Facing: 256 + Location: 94,44 + Actor542: e1 + Owner: USSR + SubCell: 4 + Facing: 256 + Location: 94,44 + Actor543: e1 + Owner: USSR + SubCell: 1 + Facing: 256 + Location: 94,48 + Actor544: e1 + Owner: USSR + SubCell: 4 + Facing: 256 + Location: 94,48 + PlayerStart: waypoint + Owner: Neutral + Location: 91,46 + Actor545: s1 + Owner: Scrin + SubCell: 3 + Location: 65,78 + Facing: 896 + Actor546: s1 + Owner: Scrin + Location: 65,78 + SubCell: 1 + Facing: 848 + Actor547: s1 + Owner: Scrin + SubCell: 3 + Location: 66,77 + Facing: 967 + Actor548: s1 + Owner: Scrin + SubCell: 3 + Location: 64,76 + Facing: 761 + Actor550: s3 + Owner: Scrin + SubCell: 3 + Location: 66,79 + Facing: 935 + Actor551: s3 + Owner: Scrin + SubCell: 3 + Location: 61,77 + Facing: 856 + Actor552: s1 + Owner: Scrin + SubCell: 3 + Location: 58,66 + Facing: 896 + Actor553: s1 + Owner: Scrin + Location: 58,66 + SubCell: 1 + Facing: 848 + Actor554: s1 + Owner: Scrin + SubCell: 3 + Location: 59,67 + Facing: 95 + Actor558: s1 + Owner: Scrin + SubCell: 3 + Location: 69,76 + Facing: 816 + Actor559: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 93,75 + Actor560: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 95,73 + Actor561: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 80,13 + Actor562: s1 + Owner: Scrin + Facing: 384 + Location: 80,13 + SubCell: 1 + Actor563: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 81,16 + Actor564: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 85,17 + Actor565: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 88,14 + Actor566: gunw + Owner: Scrin + Facing: 384 + Location: 85,15 + Actor567: corr + Owner: Scrin + Location: 56,64 + Facing: 824 + Actor568: gunw + Owner: Scrin + Location: 62,76 + Facing: 896 + Actor569: corr + Owner: Scrin + Location: 34,58 + Facing: 586 + Actor570: corr + Owner: Scrin + Location: 34,55 + Facing: 586 + Portal1: port + Owner: Scrin + Location: 33,41 + Actor549: s1 + Owner: Scrin + SubCell: 3 + Location: 63,77 + Facing: 911 + Actor449: scol + Owner: Scrin + Location: 63,79 + Actor555: s1 + Owner: Scrin + SubCell: 3 + Location: 57,67 + Facing: 729 + Actor452: deva + Owner: Scrin + Location: 15,6 + Facing: 697 + Actor453: deva + Owner: Scrin + Location: 11,10 + Facing: 626 + Actor454: pac + Owner: Scrin + Location: 17,10 + Facing: 650 + Actor455: deva + Owner: Scrin + Location: 21,38 + Facing: 618 + Actor456: deva + Owner: Scrin + Location: 27,33 + Facing: 626 + Actor457: intl.ai2 + Owner: Scrin + Location: 32,55 + Facing: 586 + Actor458: intl.ai2 + Owner: Scrin + Location: 94,77 + Facing: 71 + Actor459: intl.ai2 + Owner: Scrin + Location: 58,71 + Facing: 864 + Actor460: devo + Owner: Scrin + Location: 14,61 + Facing: 515 + Actor461: devo + Owner: Scrin + Location: 17,61 + Facing: 531 + Actor462: ruin + Owner: Scrin + Location: 16,58 + Facing: 515 + Actor463: tpod + Owner: Scrin + Location: 33,48 + Facing: 523 + Actor464: tpod + Owner: Scrin + Location: 43,46 + Facing: 610 + Actor465: devo + Owner: Scrin + Location: 40,51 + Facing: 674 + Actor466: devo + Owner: Scrin + Location: 24,8 + Facing: 761 + Actor467: devo + Owner: Scrin + Location: 23,3 + Facing: 682 + Actor468: intl.ai2 + Owner: Scrin + Location: 30,4 + Facing: 650 + Actor469: intl.ai2 + Owner: Scrin + Facing: 384 + Location: 25,22 + Actor470: intl.ai2 + Owner: Scrin + Facing: 384 + Location: 28,23 + Actor471: intl.ai2 + Owner: Scrin + Location: 38,49 + Facing: 499 + Actor472: intl.ai2 + Owner: Scrin + Location: 41,68 + Facing: 650 + Actor473: lchr + Owner: Scrin + Location: 40,70 + Facing: 658 + Actor474: intl.ai2 + Owner: Scrin + Location: 90,87 + Facing: 951 + Actor475: shrw + Owner: Scrin + Location: 92,88 + Facing: 23 + Actor476: shrw + Owner: Scrin + Facing: 384 + Location: 36,12 + Actor477: shrw + Owner: Scrin + Facing: 384 + Location: 27,22 + Actor478: shrw + Owner: Scrin + Facing: 384 + Location: 47,48 + Actor479: shrw + Owner: Scrin + Facing: 384 + Location: 20,59 + Actor480: shrw + Owner: Scrin + Location: 11,60 + Facing: 697 + Actor481: shrw + Owner: Scrin + Location: 16,70 + Facing: 563 + Actor482: gunw + Owner: Scrin + Location: 60,91 + Facing: 967 + Actor483: gunw + Owner: Scrin + Location: 63,87 + Facing: 0 + Actor487: rtpd + Owner: Scrin + Facing: 384 + Location: 78,88 + Actor488: lace + Owner: Scrin + Location: 62,18 + Facing: 682 + Actor489: lace + Owner: Scrin + Location: 63,16 + Facing: 689 + Actor490: gunw + Owner: Scrin + Facing: 384 + Location: 80,14 + Actor491: s3 + Owner: Scrin + Facing: 384 + Location: 81,15 + SubCell: 3 + Actor492: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 89,13 + Actor493: s3 + Owner: Scrin + SubCell: 3 + Location: 61,17 + Facing: 626 + Actor494: s3 + Owner: Scrin + SubCell: 3 + Location: 55,67 + Facing: 1023 + Actor556: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 95,77 + Actor557: s3 + Owner: Scrin + SubCell: 3 + Location: 91,88 + Facing: 0 + Actor572: s3 + Owner: Scrin + SubCell: 3 + Location: 94,89 + Facing: 0 + Actor573: s3 + Owner: Scrin + Location: 59,90 + SubCell: 3 + Facing: 848 + Actor574: s3 + Owner: Scrin + SubCell: 3 + Location: 62,93 + Facing: 824 + Actor575: s3 + Owner: Scrin + SubCell: 3 + Location: 65,88 + Facing: 0 + Actor576: s3 + Owner: Scrin + SubCell: 3 + Location: 39,70 + Facing: 594 + Actor577: s3 + Owner: Scrin + SubCell: 3 + Location: 33,57 + Facing: 602 + Actor578: s3 + Owner: Scrin + SubCell: 3 + Location: 36,55 + Facing: 610 + Actor579: s3 + Owner: Scrin + SubCell: 3 + Location: 47,50 + Facing: 384 + Actor580: s3 + Owner: Scrin + SubCell: 3 + Location: 13,59 + Facing: 531 + Actor581: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 19,63 + Actor582: s3 + Owner: Scrin + SubCell: 3 + Location: 18,71 + Facing: 689 + Actor583: s3 + Owner: Scrin + SubCell: 3 + Location: 7,44 + Facing: 642 + Actor584: s3 + Owner: Scrin + Location: 7,44 + SubCell: 1 + Facing: 618 + Actor585: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 12,43 + Actor586: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 24,20 + Actor587: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 35,20 + Actor588: s3 + Owner: Scrin + SubCell: 3 + Location: 21,18 + Facing: 682 + TurretFacing: 0 + Actor589: s3 + Owner: Scrin + SubCell: 3 + Location: 19,4 + Facing: 785 + Actor590: s3 + Owner: Scrin + SubCell: 3 + Location: 23,4 + Facing: 674 + Actor591: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 9,13 + Actor592: s3 + Owner: Scrin + SubCell: 3 + Location: 4,10 + Facing: 384 + Actor593: s2 + Owner: Scrin + SubCell: 3 + Location: 30,10 + Facing: 777 + Actor594: s2 + Owner: Scrin + SubCell: 3 + Location: 33,4 + Facing: 761 + Actor595: s2 + Owner: Scrin + SubCell: 3 + Location: 25,5 + Facing: 793 + Actor596: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 27,26 + Actor597: s2 + Owner: Scrin + SubCell: 3 + Location: 23,24 + Facing: 507 + Actor598: s2 + Owner: Scrin + SubCell: 3 + Location: 5,28 + Facing: 697 + Actor599: s2 + Owner: Scrin + SubCell: 3 + Location: 9,25 + Facing: 610 + Actor600: s2 + Owner: Scrin + SubCell: 3 + Location: 17,24 + Facing: 650 + Actor601: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 12,44 + Actor602: s2 + Owner: Scrin + SubCell: 3 + Location: 4,43 + Facing: 666 + Actor603: s2 + Owner: Scrin + Location: 14,59 + SubCell: 3 + Facing: 578 + Actor604: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 20,58 + Actor605: s2 + Owner: Scrin + SubCell: 3 + Location: 55,71 + Facing: 856 + Actor606: s2 + Owner: Scrin + SubCell: 3 + Location: 41,67 + Facing: 682 + Actor607: s2 + Owner: Scrin + SubCell: 3 + Location: 60,92 + Facing: 824 + Actor608: s2 + Owner: Scrin + SubCell: 3 + Location: 96,76 + Facing: 0 + Actor609: s4 + Owner: Scrin + SubCell: 3 + Location: 90,77 + Facing: 103 + Actor610: s4 + Owner: Scrin + Facing: 384 + Location: 85,13 + SubCell: 3 + Actor611: s4 + Owner: Scrin + SubCell: 3 + Location: 61,15 + Facing: 808 + Actor613: seek + Owner: Scrin + Location: 54,6 + Facing: 705 + Actor614: s1 + Owner: Scrin + SubCell: 3 + Location: 53,7 + Facing: 737 + Actor615: s1 + Owner: Scrin + Facing: 384 + Location: 53,7 + SubCell: 1 + Actor616: s1 + Owner: Scrin + SubCell: 3 + Location: 53,4 + Facing: 721 + Actor617: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 6,45 + Actor618: s1 + Owner: Scrin + Facing: 384 + Location: 13,44 + SubCell: 3 + Actor619: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 12,49 + Actor620: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 18,63 + Actor621: s3 + Owner: Scrin + SubCell: 3 + Location: 41,35 + Facing: 800 + Actor622: s3 + Owner: Scrin + SubCell: 3 + Location: 35,32 + Facing: 927 + Actor623: s3 + Owner: Scrin + SubCell: 3 + Location: 21,41 + Facing: 753 + Actor624: s3 + Owner: Scrin + Location: 23,47 + SubCell: 3 + Facing: 666 + Actor625: s3 + Owner: Scrin + SubCell: 3 + Location: 20,19 + Facing: 384 + Actor626: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 9,3 + Actor627: s3 + Owner: Scrin + SubCell: 3 + Location: 14,10 + Facing: 753 + Actor628: s1 + Owner: Scrin + Location: 34,57 + SubCell: 3 + Facing: 674 + Actor629: s1 + Owner: Scrin + SubCell: 3 + Location: 35,55 + Facing: 586 + Actor630: s1 + Owner: Scrin + SubCell: 3 + Location: 34,60 + Facing: 904 + Actor631: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 32,50 + Actor632: s1 + Owner: Scrin + SubCell: 3 + Location: 39,49 + Facing: 563 + Actor633: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 16,72 + Actor634: s1 + Owner: Scrin + Facing: 384 + Location: 16,72 + SubCell: 1 + Actor635: s1 + Owner: Scrin + SubCell: 3 + Location: 13,70 + Facing: 570 + Actor636: s1 + Owner: Scrin + Location: 17,70 + SubCell: 3 + Facing: 713 + SouthAttackRally: waypoint + Owner: Neutral + Location: 40,60 + NorthAttackRally: waypoint + Owner: Neutral + Location: 22,26 + EastAttackRally: waypoint + Owner: Neutral + Location: 47,37 + SouthAttack3: waypoint + Owner: Neutral + Location: 71,55 + EastAttack1: waypoint + Owner: Neutral + Location: 70,41 + NorthAttack1: waypoint + Owner: Neutral + Location: 50,5 + NorthAttack3: waypoint + Owner: Neutral + Location: 73,27 + Actor637: obli + Owner: NodAbandoned + Location: 45,80 + Health: 25 + Actor638: obli + Owner: NodAbandoned + Location: 53,80 + Health: 23 + NodTurret1: waypoint + Owner: Neutral + Location: 80,12 + NodTurret2: waypoint + Owner: Neutral + Location: 86,12 + NorthBaseTopLeft: waypoint + Owner: Neutral + Location: 70,1 + SouthBaseTopLeft: waypoint + Owner: Neutral + Location: 34,75 + SouthBaseBottomRight: waypoint + Owner: Neutral + Location: 68,94 + Actor639: intl.ai2 + Owner: Scrin + Facing: 864 + Location: 47,85 + Actor640: s1 + Owner: Scrin + SubCell: 3 + Location: 49,84 + Facing: 967 + Actor641: s1 + Owner: Scrin + SubCell: 3 + Facing: 896 + Location: 48,85 + Actor642: s1 + Owner: Scrin + SubCell: 1 + Location: 48,85 + Facing: 848 + Actor643: s3 + Owner: Scrin + SubCell: 3 + Facing: 935 + Location: 49,86 + Actor644: corr + Owner: Scrin + Facing: 824 + Location: 40,86 + Actor645: gunw + Owner: Scrin + Facing: 967 + Location: 47,90 + NorthHand: hand + Owner: NodAbandoned + Location: 78,7 + Health: 44 + Actor646: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 81,7 + Actor647: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 80,8 + Actor648: seek + Owner: Scrin + Facing: 705 + Location: 76,6 + NodRally: waypoint + Owner: Neutral + Location: 47,73 + NodAttackLimiter: waypoint + Owner: Neutral + Location: 33,10 + ScrinBaseCenter: waypoint + Owner: Neutral + Location: 32,40 + SouthAttack2b: waypoint + Owner: Neutral + Location: 48,84 + NorthAttack2: waypoint + Owner: Neutral + Location: 81,6 + SouthAttack1: waypoint + Owner: Neutral + Location: 48,73 + SouthAttack2a: waypoint + Owner: Neutral + Location: 74,67 + Actor571: nuke + Owner: NodAbandoned + Health: 16 + Location: 87,2 + NodTurret4: waypoint + Owner: Neutral + Location: 46,78 + NodTurret5: waypoint + Owner: Neutral + Location: 52,78 + Actor649: camera + Owner: Scrin + Location: 83,11 + Actor650: camera + Owner: Scrin + Location: 74,5 + Actor651: camera + Owner: Scrin + Location: 73,32 + Actor652: camera + Owner: Scrin + Location: 69,46 + Actor653: camera + Owner: Scrin + Location: 80,61 + Actor654: camera + Owner: Scrin + Location: 44,77 + Actor655: camera + Owner: Scrin + Location: 63,75 + Actor656: nsam + Owner: NodAbandoned + Location: 75,2 + Health: 36 + NodTurret3: waypoint + Owner: Neutral + Location: 73,3 + Actor612: scol + Owner: Scrin + Location: 74,20 + Actor657: seek + Owner: Scrin + Facing: 384 + Location: 81,21 + NorthBaseBottomRight: waypoint + Owner: Neutral + Location: 91,17 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-doctrines.yaml, abasement-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/main-campaign/ca13-abasement/r2_northernnodbasesecured.aud b/mods/ca/missions/main-campaign/ca13-abasement/r2_northernnodbasesecured.aud new file mode 100644 index 0000000000..355c993f7b Binary files /dev/null and b/mods/ca/missions/main-campaign/ca13-abasement/r2_northernnodbasesecured.aud differ diff --git a/mods/ca/missions/main-campaign/ca13-abasement/r2_signaltransmitterlocated.aud b/mods/ca/missions/main-campaign/ca13-abasement/r2_signaltransmitterlocated.aud new file mode 100644 index 0000000000..ad67e0045f Binary files /dev/null and b/mods/ca/missions/main-campaign/ca13-abasement/r2_signaltransmitterlocated.aud differ diff --git a/mods/ca/missions/main-campaign/ca13-abasement/r2_southernnodbasesecured.aud b/mods/ca/missions/main-campaign/ca13-abasement/r2_southernnodbasesecured.aud new file mode 100644 index 0000000000..d7d04157be Binary files /dev/null and b/mods/ca/missions/main-campaign/ca13-abasement/r2_southernnodbasesecured.aud differ diff --git a/mods/ca/missions/main-campaign/ca13-abasement/r_northernnodbasesecured.aud b/mods/ca/missions/main-campaign/ca13-abasement/r_northernnodbasesecured.aud new file mode 100644 index 0000000000..4b57ad00cf Binary files /dev/null and b/mods/ca/missions/main-campaign/ca13-abasement/r_northernnodbasesecured.aud differ diff --git a/mods/ca/missions/main-campaign/ca13-abasement/r_signaltransmitterlocated.aud b/mods/ca/missions/main-campaign/ca13-abasement/r_signaltransmitterlocated.aud new file mode 100644 index 0000000000..fda5b03b94 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca13-abasement/r_signaltransmitterlocated.aud differ diff --git a/mods/ca/missions/main-campaign/ca13-abasement/r_southernnodbasesecured.aud b/mods/ca/missions/main-campaign/ca13-abasement/r_southernnodbasesecured.aud new file mode 100644 index 0000000000..58f95d7d3d Binary files /dev/null and b/mods/ca/missions/main-campaign/ca13-abasement/r_southernnodbasesecured.aud differ diff --git a/mods/ca/missions/main-campaign/ca13-abasement/seth_appreciate.aud b/mods/ca/missions/main-campaign/ca13-abasement/seth_appreciate.aud new file mode 100644 index 0000000000..7e4b3c5344 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca13-abasement/seth_appreciate.aud differ diff --git a/mods/ca/missions/main-campaign/ca13-abasement/seth_kanepleased.aud b/mods/ca/missions/main-campaign/ca13-abasement/seth_kanepleased.aud new file mode 100644 index 0000000000..bbcf18c8f9 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca13-abasement/seth_kanepleased.aud differ diff --git a/mods/ca/missions/main-campaign/ca14-treachery/map.bin b/mods/ca/missions/main-campaign/ca14-treachery/map.bin new file mode 100644 index 0000000000..b8cd2b4273 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca14-treachery/map.bin differ diff --git a/mods/ca/missions/main-campaign/ca14-treachery/map.png b/mods/ca/missions/main-campaign/ca14-treachery/map.png new file mode 100644 index 0000000000..6bde3acce0 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca14-treachery/map.png differ diff --git a/mods/ca/missions/main-campaign/ca14-treachery/map.yaml b/mods/ca/missions/main-campaign/ca14-treachery/map.yaml new file mode 100644 index 0000000000..6c737e6974 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca14-treachery/map.yaml @@ -0,0 +1,3432 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 14: Treachery + +Author: Darkademic + +Tileset: WINTER + +MapSize: 98,114 + +Bounds: 1,1,96,112 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: USSR, Greece, Traitor + PlayerReference@USSR: + Name: USSR + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: soviet + LockColor: True + Color: FE1100 + LockSpawn: True + LockTeam: True + Enemies: Greece, Traitor, Creeps + PlayerReference@Greece: + Name: Greece + Bot: campaign + Faction: allies + Color: 99ACF2 + Allies: Traitor + Enemies: USSR, Creeps + PlayerReference@Traitor: + Name: Traitor + Bot: campaign + Faction: soviet + Color: FF9922 + Allies: Greece + Enemies: USSR, Creeps + PlayerReference@USSRAbandoned: + Name: USSRAbandoned + NonCombatant: True + Faction: soviet + Color: FE1100 + +Actors: + Actor0: fenc + Owner: USSRAbandoned + Location: 38,2 + Actor1: fenc + Owner: USSRAbandoned + Location: 39,2 + Actor2: fenc + Owner: USSRAbandoned + Location: 40,2 + Actor3: fenc + Owner: USSRAbandoned + Location: 41,2 + Actor4: fenc + Owner: USSRAbandoned + Location: 42,2 + Actor5: fenc + Owner: USSRAbandoned + Location: 43,2 + Actor6: t01 + Owner: Neutral + Location: 63,1 + Actor7: t14 + Owner: Neutral + Location: 64,1 + Actor8: fenc + Owner: USSRAbandoned + Location: 37,3 + Actor9: fenc + Owner: USSRAbandoned + Location: 38,3 + AbandonedHelipad: hpad.abandoned + Owner: Neutral + Location: 40,3 + Health: 10 + Actor11: fenc + Owner: USSRAbandoned + Location: 43,3 + Actor12: fenc + Owner: USSRAbandoned + Location: 44,3 + Actor13: t02 + Owner: Neutral + Location: 62,2 + Actor14: t11 + Owner: Neutral + Location: 69,2 + Actor15: t02 + Owner: Neutral + Location: 76,2 + Actor16: e6 + Owner: USSR + SubCell: 3 + Location: 85,3 + Facing: 384 + Actor17: e6 + Owner: USSR + SubCell: 3 + Location: 87,3 + Facing: 384 + Actor18: fenc + Owner: USSRAbandoned + Location: 37,4 + Actor19: fenc + Owner: USSRAbandoned + Location: 44,4 + Actor20: fenc + Owner: USSRAbandoned + Location: 37,5 + AbandonedHalo: halo + Owner: Neutral + Location: 42,5 + Health: 7 + Facing: 384 + Actor22: fenc + Owner: USSRAbandoned + Location: 44,5 + Boris: bori + Owner: USSR + SubCell: 3 + Location: 86,5 + Facing: 384 + PlayerStart: waypoint + Owner: Neutral + Location: 86,5 + Actor25: v04 + Owner: Neutral + Location: 70,6 + Actor26: t13 + Owner: Neutral + Location: 72,5 + Actor27: tc04 + Owner: Neutral + Faction: russia + Location: 42,7 + Actor28: t11 + Owner: Neutral + Faction: russia + Location: 53,7 + Actor29: t15 + Owner: Neutral + Faction: russia + Location: 55,8 + Actor30: t17 + Owner: Neutral + Location: 75,8 + Actor31: t16 + Owner: Neutral + Location: 81,8 + Actor32: t13 + Owner: Neutral + Location: 85,10 + Actor33: t06 + Owner: Neutral + Location: 92,10 + Actor34: t11 + Owner: Neutral + Location: 72,11 + Actor35: t16 + Owner: Neutral + Faction: russia + Location: 52,13 + Actor36: t01 + Owner: Neutral + Location: 91,13 + Actor37: t13 + Owner: Neutral + Faction: russia + Location: 61,14 + Actor38: t14 + Owner: Neutral + Location: 87,14 + Actor39: t12 + Owner: Neutral + Faction: russia + Location: 56,15 + Actor40: t17 + Owner: Neutral + Faction: russia + Location: 52,16 + Actor41: t17 + Owner: Neutral + Location: 94,16 + Actor42: t06 + Owner: Neutral + Location: 24,21 + Actor43: brik + Owner: USSRAbandoned + Location: 13,43 + Health: 24 + Actor44: brik + Owner: USSRAbandoned + Location: 19,43 + Actor45: brik + Owner: USSRAbandoned + Location: 13,44 + Actor46: brik + Owner: USSRAbandoned + Location: 12,43 + Actor47: brik + Owner: USSRAbandoned + Location: 12,44 + Health: 22 + Actor48: brik + Owner: USSRAbandoned + Location: 19,44 + Actor49: brik + Owner: USSRAbandoned + Location: 20,43 + Actor50: brik + Owner: USSRAbandoned + Location: 20,44 + Health: 17 + Actor51: brik + Owner: USSRAbandoned + Location: 11,43 + Health: 41 + Actor52: brik + Owner: USSRAbandoned + Location: 10,43 + Health: 56 + Actor53: brik + Owner: USSRAbandoned + Location: 9,43 + Health: 59 + Actor54: brik + Owner: USSRAbandoned + Location: 8,43 + Actor55: brik + Owner: USSRAbandoned + Location: 7,43 + Actor56: brik + Owner: USSRAbandoned + Location: 6,43 + Actor57: brik + Owner: USSRAbandoned + Location: 6,44 + Actor58: brik + Owner: USSRAbandoned + Location: 21,43 + Actor59: brik + Owner: USSRAbandoned + Location: 22,43 + Actor60: brik + Owner: USSRAbandoned + Location: 23,43 + Health: 46 + Actor61: brik + Owner: USSRAbandoned + Location: 24,43 + Actor62: brik + Owner: USSRAbandoned + Location: 25,43 + Health: 74 + Actor63: brik + Owner: USSRAbandoned + Location: 26,43 + Health: 21 + Actor64: brik + Owner: USSRAbandoned + Location: 26,44 + Actor65: brik + Owner: USSRAbandoned + Location: 26,45 + Health: 31 + Actor66: brik + Owner: USSRAbandoned + Location: 26,50 + Actor67: brik + Owner: USSRAbandoned + Location: 26,49 + Health: 55 + Actor68: brik + Owner: USSRAbandoned + Location: 26,48 + Actor69: brik + Owner: USSRAbandoned + Location: 26,47 + Actor70: brik + Owner: USSRAbandoned + Location: 26,46 + Actor71: brik + Owner: USSRAbandoned + Location: 26,51 + Actor72: brik + Owner: USSRAbandoned + Location: 26,52 + Actor73: brik + Owner: USSRAbandoned + Location: 25,52 + Health: 74 + Actor74: brik + Owner: USSRAbandoned + Location: 25,51 + Actor75: brik + Owner: USSRAbandoned + Location: 6,52 + Actor76: brik + Owner: USSRAbandoned + Location: 6,51 + Health: 34 + Actor77: brik + Owner: USSRAbandoned + Location: 6,49 + Actor78: brik + Owner: USSRAbandoned + Location: 6,47 + Actor79: brik + Owner: USSRAbandoned + Location: 6,46 + Health: 45 + Actor80: brik + Owner: USSRAbandoned + Location: 6,45 + Actor81: brik + Owner: USSRAbandoned + Location: 6,48 + Actor82: brik + Owner: USSRAbandoned + Location: 6,50 + Actor83: brik + Owner: USSRAbandoned + Location: 7,52 + Actor84: brik + Owner: USSRAbandoned + Location: 7,51 + Actor85: brik + Owner: USSRAbandoned + Location: 6,56 + Health: 79 + Actor86: brik + Owner: USSRAbandoned + Location: 7,56 + Health: 31 + Actor87: brik + Owner: USSRAbandoned + Location: 6,57 + Actor88: brik + Owner: USSRAbandoned + Location: 7,57 + Health: 41 + Actor89: brik + Owner: USSRAbandoned + Location: 26,56 + Actor90: brik + Owner: USSRAbandoned + Location: 25,56 + Health: 68 + Actor91: brik + Owner: USSRAbandoned + Location: 25,57 + Actor92: brik + Owner: USSRAbandoned + Location: 26,57 + Actor93: brik + Owner: USSRAbandoned + Location: 6,58 + Actor94: brik + Owner: USSRAbandoned + Location: 6,59 + Actor95: brik + Owner: USSRAbandoned + Location: 6,61 + Actor96: brik + Owner: USSRAbandoned + Location: 6,60 + Actor97: brik + Owner: USSRAbandoned + Location: 6,62 + Health: 63 + Actor98: brik + Owner: USSRAbandoned + Location: 6,63 + Actor99: brik + Owner: USSRAbandoned + Location: 7,63 + Actor100: brik + Owner: USSRAbandoned + Location: 8,63 + Actor101: brik + Owner: USSRAbandoned + Location: 9,63 + Health: 65 + Actor102: brik + Owner: USSRAbandoned + Location: 10,63 + Health: 53 + Actor103: brik + Owner: USSRAbandoned + Location: 13,62 + Actor104: brik + Owner: USSRAbandoned + Location: 13,63 + Actor105: brik + Owner: USSRAbandoned + Location: 12,63 + Actor106: brik + Owner: USSRAbandoned + Location: 11,63 + Health: 37 + Actor107: brik + Owner: USSRAbandoned + Location: 12,62 + Actor108: brik + Owner: USSRAbandoned + Location: 19,62 + Actor109: brik + Owner: USSRAbandoned + Location: 19,63 + Actor110: brik + Owner: USSRAbandoned + Location: 20,63 + Actor111: brik + Owner: USSRAbandoned + Location: 20,62 + Health: 34 + Actor112: brik + Owner: USSRAbandoned + Location: 21,63 + Health: 70 + Actor113: brik + Owner: USSRAbandoned + Location: 23,63 + Health: 79 + Actor114: brik + Owner: USSRAbandoned + Location: 22,63 + Actor115: brik + Owner: USSRAbandoned + Location: 25,63 + Actor116: brik + Owner: USSRAbandoned + Location: 24,63 + Health: 64 + Actor117: brik + Owner: USSRAbandoned + Location: 26,63 + Health: 37 + Actor118: brik + Owner: USSRAbandoned + Location: 26,62 + Health: 32 + Actor119: brik + Owner: USSRAbandoned + Location: 26,61 + Health: 13 + Actor120: brik + Owner: USSRAbandoned + Location: 26,59 + Actor121: brik + Owner: USSRAbandoned + Location: 26,58 + Health: 48 + Actor122: brik + Owner: USSRAbandoned + Location: 26,60 + Actor123: apwr + Owner: USSRAbandoned + Location: 7,44 + Health: 17 + Actor124: apwr + Owner: USSRAbandoned + Location: 7,47 + Health: 35 + Actor125: weap + Owner: USSRAbandoned + Location: 20,56 + Health: 37 + Actor130: barr + Owner: USSRAbandoned + Location: 19,51 + Health: 26 + Actor131: tsla + Owner: USSRAbandoned + Location: 21,62 + Health: 30 + Actor132: tsla + Owner: USSRAbandoned + Location: 25,58 + Health: 38 + Actor133: tsla + Owner: USSRAbandoned + Location: 25,50 + Health: 48 + Actor134: tsla + Owner: USSRAbandoned + Location: 11,62 + Health: 15 + Actor135: ftur + Owner: USSRAbandoned + Location: 19,64 + Health: 17 + Actor136: ftur + Owner: USSRAbandoned + Location: 13,64 + Health: 20 + Actor137: ftur + Owner: USSRAbandoned + Location: 27,56 + Health: 29 + Actor138: ftur + Owner: USSRAbandoned + Location: 27,52 + Health: 41 + Actor140: apwr + Owner: USSRAbandoned + Location: 7,59 + Health: 46 + Actor141: apwr + Owner: USSRAbandoned + Location: 9,55 + Health: 31 + Actor142: sam + Owner: USSRAbandoned + Location: 23,61 + Health: 35 + Actor143: sam + Owner: USSRAbandoned + Location: 23,45 + Health: 27 + Actor144: proc + Owner: USSRAbandoned + Location: 19,46 + FreeActor: False + FreeActor@CHARV: False + Health: 24 + Actor146: kenn + Owner: USSRAbandoned + Location: 22,52 + Health: 31 + Actor145: silo + Owner: USSRAbandoned + Location: 19,46 + Health: 9 + Actor147: silo + Owner: USSRAbandoned + Location: 21,46 + Health: 11 + Actor149: fix + Owner: USSRAbandoned + Location: 15,56 + Health: 41 + Actor150: apwr + Owner: USSRAbandoned + Location: 9,51 + Health: 23 + AbandonedAirfield: afld + Owner: USSRAbandoned + Location: 14,52 + Health: 34 + Actor152: sbag + Owner: Greece + Location: 46,29 + Actor153: sbag + Owner: Greece + Location: 47,29 + Actor154: sbag + Owner: Greece + Location: 48,29 + Actor155: sbag + Owner: Greece + Location: 46,30 + Actor156: sbag + Owner: Greece + Location: 46,31 + Actor157: sbag + Owner: Greece + Location: 47,31 + Actor158: sbag + Owner: Greece + Location: 48,31 + Actor159: sbag + Owner: Greece + Location: 48,30 + Actor160: sbag + Owner: Greece + Location: 37,29 + Actor161: sbag + Owner: Greece + Location: 37,30 + Actor162: sbag + Owner: Greece + Location: 37,31 + Actor163: sbag + Owner: Greece + Location: 38,31 + Actor164: sbag + Owner: Greece + Location: 39,31 + Actor165: sbag + Owner: Greece + Location: 38,29 + Actor166: sbag + Owner: Greece + Location: 39,29 + Actor167: sbag + Owner: Greece + Location: 39,30 + Actor168: sbag + Owner: Greece + Location: 55,22 + Actor169: sbag + Owner: Greece + Location: 54,22 + Actor170: sbag + Owner: Greece + Location: 53,22 + Actor171: sbag + Owner: Greece + Location: 53,23 + Actor172: sbag + Owner: Greece + Location: 53,24 + Actor173: sbag + Owner: Greece + Location: 54,24 + Actor174: sbag + Owner: Greece + Location: 55,24 + Actor175: sbag + Owner: Greece + Location: 55,23 + Actor176: agun + Owner: Greece + Location: 54,23 + TurretFacing: 111 + Actor177: agun + Owner: Greece + Location: 47,30 + TurretFacing: 1007 + Actor178: agun + Owner: Greece + Location: 38,30 + TurretFacing: 166 + Actor179: sbag + Owner: Greece + Location: 69,20 + Actor180: sbag + Owner: Greece + Location: 70,20 + Actor181: sbag + Owner: Greece + Location: 71,20 + Actor182: sbag + Owner: Greece + Location: 69,21 + Actor183: agun + Owner: Greece + Location: 70,21 + TurretFacing: 79 + Actor184: sbag + Owner: Greece + Location: 71,21 + Actor185: sbag + Owner: Greece + Location: 69,22 + Actor186: sbag + Owner: Greece + Location: 70,22 + Actor187: sbag + Owner: Greece + Location: 71,22 + Actor188: sbag + Owner: Greece + Location: 83,18 + Actor189: sbag + Owner: Greece + Location: 84,18 + Actor190: sbag + Owner: Greece + Location: 85,18 + Actor191: sbag + Owner: Greece + Location: 83,19 + Actor192: agun + Owner: Greece + Location: 84,19 + Health: 93 + TurretFacing: 71 + Actor193: sbag + Owner: Greece + Location: 85,19 + Actor194: sbag + Owner: Greece + Location: 83,20 + Actor195: sbag + Owner: Greece + Location: 84,20 + Actor196: sbag + Owner: Greece + Location: 85,20 + Actor197: sbag + Owner: Greece + Location: 24,31 + Actor198: sbag + Owner: Greece + Location: 25,31 + Actor199: sbag + Owner: Greece + Location: 26,31 + Actor200: sbag + Owner: Greece + Location: 24,32 + Actor201: agun + Owner: Greece + TurretFacing: 166 + Location: 25,32 + Actor202: sbag + Owner: Greece + Location: 26,32 + Actor203: sbag + Owner: Greece + Location: 24,33 + Actor204: sbag + Owner: Greece + Location: 25,33 + Actor205: sbag + Owner: Greece + Location: 26,33 + Actor206: pbox + Owner: Greece + Location: 66,15 + Actor207: pbox + Owner: Greece + Location: 41,13 + Actor210: pbox + Owner: Greece + Location: 46,28 + Actor208: pbox + Owner: Greece + Location: 39,28 + Actor209: apc.ai + Owner: Greece + Location: 43,30 + Facing: 0 + Actor211: 2tnk + Owner: Greece + Location: 41,29 + Facing: 0 + Actor212: 2tnk + Owner: Greece + Facing: 0 + Location: 44,29 + Actor213: split2 + Owner: Neutral + Location: 30,46 + Actor214: split2 + Owner: Neutral + Location: 35,52 + Actor215: split2 + Owner: Neutral + Location: 26,40 + Actor216: t13 + Owner: Neutral + Location: 6,5 + Actor217: tc02 + Owner: Neutral + Location: 5,1 + Actor218: tc05 + Owner: Neutral + Location: 0,1 + Actor219: tc04 + Owner: Neutral + Location: 1,7 + Actor220: t14 + Owner: Neutral + Location: 1,5 + Actor221: t05 + Owner: Neutral + Location: 1,4 + Actor222: t02 + Owner: Neutral + Location: 3,0 + Actor223: t06 + Owner: Neutral + Location: 1,18 + Actor224: t08 + Owner: Neutral + Location: 1,11 + Actor225: t02 + Owner: Neutral + Location: 10,7 + Actor226: t11 + Owner: Neutral + Location: 10,4 + Actor227: t15 + Owner: Neutral + Location: 20,11 + Actor228: v02 + Owner: Neutral + Location: 13,12 + Actor229: v03 + Owner: Neutral + Location: 6,16 + Actor230: v05 + Owner: Neutral + Location: 5,13 + Actor231: v01 + Owner: Neutral + Location: 16,15 + Actor232: v07 + Owner: Neutral + Location: 11,21 + Actor233: v06 + Owner: Neutral + Location: 19,22 + Actor234: v18 + Owner: Neutral + Location: 18,20 + Actor235: v18 + Owner: Neutral + Location: 20,20 + Actor236: v17 + Owner: Neutral + Location: 19,20 + Actor237: wood + Owner: Neutral + Location: 17,20 + Actor238: wood + Owner: Neutral + Location: 17,19 + Actor239: wood + Owner: Neutral + Location: 18,19 + Actor240: wood + Owner: Neutral + Location: 19,19 + Actor241: wood + Owner: Neutral + Location: 20,19 + Actor242: wood + Owner: Neutral + Location: 21,19 + Actor243: wood + Owner: Neutral + Location: 21,20 + Actor244: wood + Owner: Neutral + Location: 21,21 + Actor245: wood + Owner: Neutral + Location: 20,21 + Actor246: wood + Owner: Neutral + Location: 21,22 + Actor247: wood + Owner: Neutral + Location: 21,23 + Actor248: wood + Owner: Neutral + Location: 20,23 + Actor249: wood + Owner: Neutral + Location: 19,21 + Actor250: wood + Owner: Neutral + Location: 20,24 + Actor251: wood + Owner: Neutral + Location: 19,24 + Actor252: c4 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 16,20 + Actor253: c3 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 18,23 + Actor254: tecn + Owner: Neutral + SubCell: 3 + Facing: 384 + Location: 5,17 + Actor255: c9 + Owner: Neutral + SubCell: 3 + Facing: 384 + Location: 6,15 + Actor256: c6 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 19,15 + Actor257: c10 + Owner: Neutral + SubCell: 3 + Facing: 384 + Location: 16,17 + Actor258: c8 + Owner: Neutral + Facing: 384 + SubCell: 3 + Location: 4,21 + Actor259: brl3 + Owner: Creeps + Location: 67,16 + Actor260: barl + Owner: Creeps + Location: 67,15 + Actor261: sbag + Owner: Greece + Location: 67,43 + Actor262: sbag + Owner: Greece + Location: 68,43 + Actor263: sbag + Owner: Greece + Location: 69,43 + Actor264: sbag + Owner: Greece + Location: 67,44 + Actor265: agun + Owner: Greece + TurretFacing: 79 + Location: 68,44 + Actor266: sbag + Owner: Greece + Location: 69,44 + Actor267: sbag + Owner: Greece + Location: 67,45 + Actor268: sbag + Owner: Greece + Location: 68,45 + Actor269: sbag + Owner: Greece + Location: 69,45 + Actor270: sbag + Owner: Greece + Location: 90,27 + Actor271: sbag + Owner: Greece + Location: 91,27 + Actor272: sbag + Owner: Greece + Location: 92,27 + Actor273: sbag + Owner: Greece + Location: 90,28 + Actor274: agun + Owner: Greece + Health: 93 + TurretFacing: 71 + Location: 91,28 + Actor275: sbag + Owner: Greece + Location: 92,28 + Actor276: sbag + Owner: Greece + Location: 90,29 + Actor277: sbag + Owner: Greece + Location: 91,29 + Actor278: sbag + Owner: Greece + Location: 92,29 + Actor285: sbag + Owner: Greece + Location: 62,34 + Actor286: sbag + Owner: Greece + Location: 62,35 + Actor287: sbag + Owner: Greece + Location: 63,35 + Actor288: sbag + Owner: Greece + Location: 63,36 + Actor289: sbag + Owner: Greece + Location: 63,37 + Actor290: sbag + Owner: Greece + Location: 63,38 + Actor291: sbag + Owner: Greece + Location: 63,39 + Actor292: sbag + Owner: Greece + Location: 64,39 + Actor293: sbag + Owner: Greece + Location: 65,39 + Actor294: sbag + Owner: Greece + Location: 66,39 + Actor295: sbag + Owner: Greece + Location: 63,34 + Actor296: sbag + Owner: Greece + Location: 64,34 + Actor297: sbag + Owner: Greece + Location: 64,33 + Actor298: sbag + Owner: Greece + Location: 65,33 + Actor299: sbag + Owner: Greece + Location: 66,33 + Actor300: sbag + Owner: Greece + Location: 66,32 + Actor301: sbag + Owner: Greece + Location: 66,31 + Actor302: sbag + Owner: Greece + Location: 67,31 + Actor303: sbag + Owner: Greece + Location: 67,30 + Actor304: sbag + Owner: Greece + Location: 67,29 + Actor305: sbag + Owner: Greece + Location: 68,29 + Actor306: sbag + Owner: Greece + Location: 69,29 + Actor307: sbag + Owner: Greece + Location: 69,30 + Actor308: sbag + Owner: Greece + Location: 70,30 + Actor309: sbag + Owner: Greece + Location: 71,30 + Actor310: sbag + Owner: Greece + Location: 72,30 + Actor311: sbag + Owner: Greece + Location: 68,30 + Actor312: sbag + Owner: Greece + Location: 73,30 + Actor313: sbag + Owner: Greece + Location: 74,30 + Actor314: sbag + Owner: Greece + Location: 75,30 + Actor315: sbag + Owner: Greece + Location: 67,39 + Actor316: sbag + Owner: Greece + Location: 68,39 + Actor317: sbag + Owner: Greece + Location: 69,39 + Actor318: sbag + Owner: Greece + Location: 70,39 + Actor319: sbag + Owner: Greece + Location: 71,39 + Actor320: sbag + Owner: Greece + Location: 71,39 + Actor321: sbag + Owner: Greece + Location: 72,39 + Actor322: sbag + Owner: Greece + Location: 72,40 + Actor323: sbag + Owner: Greece + Location: 72,41 + Actor324: sbag + Owner: Greece + Location: 73,41 + Actor325: sbag + Owner: Greece + Location: 73,42 + Actor326: sbag + Owner: Greece + Location: 73,43 + Actor327: sbag + Owner: Greece + Location: 73,44 + Actor328: sbag + Owner: Greece + Location: 74,44 + Actor329: sbag + Owner: Greece + Location: 76,44 + Actor330: sbag + Owner: Greece + Location: 75,44 + Actor331: sbag + Owner: Greece + Location: 77,44 + Actor332: sbag + Owner: Greece + Location: 78,44 + Actor333: sbag + Owner: Greece + Location: 83,42 + Actor334: sbag + Owner: Greece + Location: 83,41 + Actor335: sbag + Owner: Greece + Location: 83,40 + Actor336: sbag + Owner: Greece + Location: 83,39 + Actor337: sbag + Owner: Greece + Location: 84,39 + Actor338: sbag + Owner: Greece + Location: 84,38 + Actor339: sbag + Owner: Greece + Location: 84,37 + Actor340: sbag + Owner: Greece + Location: 84,32 + Actor341: sbag + Owner: Greece + Location: 84,31 + Actor342: sbag + Owner: Greece + Location: 83,31 + Actor343: sbag + Owner: Greece + Location: 83,30 + Actor344: sbag + Owner: Greece + Location: 84,33 + Actor345: sbag + Owner: Greece + Location: 83,27 + Actor346: sbag + Owner: Greece + Location: 83,28 + Actor347: sbag + Owner: Greece + Location: 83,29 + Actor348: sbag + Owner: Greece + Location: 82,27 + Actor349: sbag + Owner: Greece + Location: 82,26 + Actor350: sbag + Owner: Greece + Location: 81,26 + Actor351: sbag + Owner: Greece + Location: 80,26 + Actor352: sbag + Owner: Greece + Location: 79,26 + Actor353: sbag + Owner: Greece + Location: 78,26 + Actor354: sbag + Owner: Greece + Location: 78,26 + Actor355: sbag + Owner: Greece + Location: 78,27 + Actor356: sbag + Owner: Greece + Location: 77,27 + Actor357: sbag + Owner: Greece + Location: 77,28 + Actor358: sbag + Owner: Greece + Location: 77,29 + Actor359: sbag + Owner: Greece + Location: 76,29 + Actor360: sbag + Owner: Greece + Location: 75,29 + Actor367: hpad + Owner: Greece + Location: 64,36 + Actor368: hpad + Owner: Greece + Location: 67,36 + Actor369: hpad + Owner: Greece + Location: 70,36 + Actor366: dome + Owner: Greece + Location: 76,30 + Actor371: pbox + Owner: Greece + Location: 79,45 + Actor372: pbox + Owner: Greece + Location: 84,43 + Actor373: pbox + Owner: Greece + Location: 85,37 + HardOnlyTurret5: gun + Owner: Greece + Location: 81,43 + TurretFacing: 618 + Actor374: pbox + Owner: Greece + Location: 85,32 + HardOnlyTurret4: gun + Owner: Greece + Location: 83,35 + TurretFacing: 808 + Actor377: brik + Owner: Greece + Location: 38,98 + Actor378: brik + Owner: Greece + Location: 38,99 + Actor379: brik + Owner: Greece + Location: 39,98 + Actor380: brik + Owner: Greece + Location: 39,99 + Actor381: brik + Owner: Greece + Location: 38,100 + Actor382: brik + Owner: Greece + Location: 38,101 + Actor383: brik + Owner: Greece + Location: 38,102 + Actor384: brik + Owner: Greece + Location: 39,102 + Actor385: brik + Owner: Greece + Location: 39,101 + Actor386: brik + Owner: Greece + Location: 38,106 + Actor387: brik + Owner: Greece + Location: 39,106 + Actor388: brik + Owner: Greece + Location: 38,107 + Actor389: brik + Owner: Greece + Location: 39,107 + Actor390: brik + Owner: Greece + Location: 38,108 + Actor391: brik + Owner: Greece + Location: 38,109 + Actor392: brik + Owner: Greece + Location: 38,110 + Actor393: brik + Owner: Greece + Location: 38,111 + Actor394: brik + Owner: Greece + Location: 38,112 + Actor395: brik + Owner: Greece + Location: 38,112 + Actor396: brik + Owner: Greece + Location: 39,111 + Actor397: brik + Owner: Greece + Location: 39,112 + Actor398: brik + Owner: Greece + Location: 60,92 + Actor399: brik + Owner: Greece + Location: 61,92 + Actor400: brik + Owner: Greece + Location: 60,93 + Actor401: brik + Owner: Greece + Location: 61,93 + Actor402: brik + Owner: Greece + Location: 61,95 + Actor403: brik + Owner: Greece + Location: 61,94 + Actor404: brik + Owner: Greece + Location: 60,96 + Actor405: brik + Owner: Greece + Location: 61,96 + Actor406: brik + Owner: Greece + Location: 60,97 + Actor407: brik + Owner: Greece + Location: 61,97 + Actor408: brik + Owner: Greece + Location: 61,102 + Actor409: brik + Owner: Greece + Location: 61,101 + Actor410: brik + Owner: Greece + Location: 60,101 + Actor411: brik + Owner: Greece + Location: 60,102 + Actor412: brik + Owner: Greece + Location: 61,103 + Actor413: brik + Owner: Greece + Location: 61,105 + Actor414: brik + Owner: Greece + Location: 61,104 + Actor415: brik + Owner: Greece + Location: 61,106 + Actor416: brik + Owner: Greece + Location: 61,107 + Actor417: brik + Owner: Greece + Location: 61,108 + Actor418: brik + Owner: Greece + Location: 61,109 + Actor419: brik + Owner: Greece + Location: 60,111 + Actor420: brik + Owner: Greece + Location: 61,110 + Actor421: brik + Owner: Greece + Location: 61,111 + Actor422: brik + Owner: Greece + Location: 61,112 + Actor423: brik + Owner: Greece + Location: 60,112 + Actor424: brik + Owner: Greece + Location: 40,112 + Actor425: brik + Owner: Greece + Location: 41,112 + Actor426: brik + Owner: Greece + Location: 42,112 + Actor427: brik + Owner: Greece + Location: 43,112 + Actor428: brik + Owner: Greece + Location: 44,112 + Actor429: brik + Owner: Greece + Location: 45,112 + Actor430: brik + Owner: Greece + Location: 46,112 + Actor431: brik + Owner: Greece + Location: 47,112 + Actor432: brik + Owner: Greece + Location: 48,112 + Actor433: brik + Owner: Greece + Location: 51,112 + Actor434: brik + Owner: Greece + Location: 49,112 + Actor435: brik + Owner: Greece + Location: 50,112 + Actor436: brik + Owner: Greece + Location: 52,112 + Actor437: brik + Owner: Greece + Location: 54,112 + Actor438: brik + Owner: Greece + Location: 53,112 + Actor439: brik + Owner: Greece + Location: 55,112 + Actor440: brik + Owner: Greece + Location: 56,112 + Actor441: brik + Owner: Greece + Location: 57,112 + Actor442: brik + Owner: Greece + Location: 57,112 + Actor443: brik + Owner: Greece + Location: 58,112 + Actor444: brik + Owner: Greece + Location: 59,112 + Actor445: sbag + Owner: Greece + Location: 45,78 + Actor446: sbag + Owner: Greece + Location: 45,77 + Actor447: sbag + Owner: Greece + Location: 46,78 + Actor448: sbag + Owner: Greece + Location: 47,78 + Actor449: sbag + Owner: Greece + Location: 48,78 + Actor450: sbag + Owner: Greece + Location: 49,78 + Actor451: sbag + Owner: Greece + Location: 57,76 + Actor452: sbag + Owner: Greece + Location: 57,76 + Actor453: sbag + Owner: Greece + Location: 55,76 + Actor454: sbag + Owner: Greece + Location: 56,76 + Actor455: sbag + Owner: Greece + Location: 57,75 + Actor456: sbag + Owner: Greece + Location: 57,74 + Actor457: sbag + Owner: Greece + Location: 58,74 + Actor458: sbag + Owner: Greece + Location: 58,73 + Actor459: sbag + Owner: Greece + Location: 58,72 + Actor460: sbag + Owner: Greece + Location: 58,71 + Actor461: sbag + Owner: Greece + Location: 58,70 + Actor462: sbag + Owner: Greece + Location: 59,70 + Actor463: sbag + Owner: Greece + Location: 45,76 + Actor464: sbag + Owner: Greece + Location: 45,75 + Actor465: sbag + Owner: Greece + Location: 45,74 + Actor466: sbag + Owner: Greece + Location: 45,74 + Actor467: sbag + Owner: Greece + Location: 45,70 + Actor468: sbag + Owner: Greece + Location: 45,69 + Actor469: sbag + Owner: Greece + Location: 45,68 + Actor470: sbag + Owner: Greece + Location: 45,67 + Actor471: sbag + Owner: Greece + Location: 45,66 + Actor472: sbag + Owner: Greece + Location: 45,65 + Actor473: sbag + Owner: Greece + Location: 47,65 + Actor474: sbag + Owner: Greece + Location: 46,65 + Actor475: sbag + Owner: Greece + Location: 48,65 + Actor476: sbag + Owner: Greece + Location: 49,65 + Actor477: sbag + Owner: Greece + Location: 50,65 + Actor478: sbag + Owner: Greece + Location: 55,65 + Actor479: sbag + Owner: Greece + Location: 56,65 + Actor480: sbag + Owner: Greece + Location: 58,65 + Actor481: sbag + Owner: Greece + Location: 57,65 + Actor482: sbag + Owner: Greece + Location: 59,65 + Actor483: sbag + Owner: Greece + Location: 59,66 + Actor484: sbag + Owner: Greece + Location: 59,69 + Actor485: syrd + Owner: Greece + Location: 51,79 + Actor486: fact + Owner: Greece + Location: 49,107 + Actor488: dome + Owner: Greece + Location: 54,108 + Actor491: apwr + Owner: Greece + Location: 58,108 + Actor493: apwr + Owner: Greece + Location: 58,105 + Actor494: apwr + Owner: Greece + Location: 54,104 + Actor495: apwr + Owner: Greece + Location: 49,103 + Actor496: apwr + Owner: Greece + Location: 49,100 + Actor498: apwr + Owner: Greece + Location: 46,92 + Actor499: apwr + Owner: Greece + Location: 54,91 + Actor497: powr + Owner: Greece + Location: 44,92 + Actor500: powr + Owner: Greece + Location: 49,92 + AlliedSouthBarracks: tent + Owner: Greece + Location: 55,100 + Actor503: fix + Owner: Greece + Location: 47,96 + Actor504: pris + Owner: Greece + Location: 39,100 + Actor505: pris + Owner: Greece + Location: 39,108 + Actor506: pris + Owner: Greece + Location: 60,95 + Actor507: pris + Owner: Greece + Location: 60,103 + Actor508: gun + Owner: Greece + Location: 37,101 + Actor509: gun + Owner: Greece + Location: 37,107 + Actor510: gun + Owner: Greece + Location: 37,107 + Actor511: gun + Owner: Greece + Location: 62,102 + Actor512: gun + Owner: Greece + Location: 62,96 + HardOnlyTurret1: gun + Owner: Greece + Location: 23,97 + TurretFacing: 192 + HardOnlyTurret2: gun + Owner: Greece + Location: 16,97 + TurretFacing: 192 + Actor515: pbox + Owner: Greece + Location: 14,82 + Actor516: pbox + Owner: Greece + Location: 20,100 + Actor517: agun + Owner: Greece + Location: 41,97 + Actor518: agun + Owner: Greece + Location: 52,93 + Actor519: agun + Owner: Greece + Location: 59,92 + Actor520: agun + Owner: Greece + Location: 39,110 + Actor521: agun + Owner: Greece + Location: 58,102 + TraitorGeneral: gnrl + Owner: Traitor + Location: 46,104 + SubCell: 3 + Facing: 499 + Bodyguard2: shok + Owner: Traitor + SubCell: 3 + Location: 45,105 + Facing: 384 + Bodyguard1: shok + Owner: Traitor + SubCell: 3 + Location: 47,105 + Facing: 586 + HardOnlyTeslaCoil: tsla + Owner: Traitor + Location: 46,66 + Actor534: tsla + Owner: Traitor + Location: 80,42 + Actor535: ftur + Owner: Traitor + Location: 23,81 + AlliedSouthFactory: weap + Owner: Greece + Location: 56,95 + Actor537: proc + Owner: Greece + Location: 52,95 + Actor538: proc + Owner: Greece + Location: 54,68 + Actor539: gun + Owner: Greece + Location: 49,64 + TurretFacing: 192 + Actor541: gun + Owner: Greece + Location: 44,75 + Actor543: agun + Owner: Greece + Location: 57,66 + Actor544: agun + Owner: Greece + Location: 48,66 + Actor545: tent + Owner: Greece + Location: 48,68 + Actor546: powr + Owner: Greece + Location: 46,75 + Actor547: powr + Owner: Greece + Location: 48,75 + Actor548: powr + Owner: Greece + Location: 55,73 + Actor549: apwr + Owner: Greece + Location: 51,73 + Actor552: powr + Owner: Greece + Location: 73,38 + Actor553: powr + Owner: Greece + Location: 74,41 + Actor554: tent + Owner: Greece + Location: 77,38 + Actor555: 3tnk + Owner: Traitor + Location: 80,47 + Facing: 634 + Actor557: 3tnk + Owner: Traitor + Location: 35,100 + Facing: 253 + Actor559: 3tnk + Owner: Traitor + Location: 63,94 + Facing: 753 + Actor561: v2rl + Owner: Traitor + Location: 59,93 + Facing: 650 + Actor562: e2 + Owner: Traitor + SubCell: 3 + Location: 37,102 + Facing: 384 + Actor564: e2 + Owner: Traitor + SubCell: 3 + Location: 63,93 + Facing: 785 + Actor565: e2 + Owner: Traitor + Facing: 384 + Location: 80,43 + SubCell: 3 + Actor566: e1 + Owner: Traitor + Location: 81,42 + SubCell: 3 + Facing: 384 + Actor567: e1 + Owner: Traitor + Facing: 384 + SubCell: 3 + Location: 84,44 + Actor568: e1 + Owner: Traitor + SubCell: 3 + Location: 63,103 + Facing: 880 + Actor569: e1 + Owner: Traitor + Location: 63,103 + SubCell: 1 + Facing: 0 + Actor570: e1 + Owner: Traitor + Facing: 384 + SubCell: 3 + Location: 40,101 + Actor571: e1 + Owner: Traitor + SubCell: 3 + Location: 48,102 + Facing: 793 + Actor572: e1 + Owner: Traitor + Facing: 384 + SubCell: 3 + Location: 35,99 + Actor573: e1 + Owner: Traitor + SubCell: 3 + Location: 36,108 + Facing: 182 + Actor574: e1 + Owner: Traitor + Facing: 384 + SubCell: 3 + Location: 24,81 + Actor575: e1 + Owner: Traitor + Location: 14,81 + SubCell: 3 + Facing: 31 + Actor576: e1 + Owner: Traitor + SubCell: 3 + Location: 51,64 + Facing: 0 + Actor577: e1 + Owner: Traitor + SubCell: 3 + Location: 43,73 + Facing: 222 + Actor578: e1 + Owner: Traitor + Location: 44,73 + SubCell: 3 + Facing: 253 + Actor579: e2 + Owner: Traitor + SubCell: 3 + Location: 45,72 + Facing: 150 + Actor580: e3 + Owner: Traitor + SubCell: 3 + Location: 50,67 + Facing: 237 + Actor581: e3 + Owner: Traitor + Facing: 384 + SubCell: 3 + Location: 58,92 + Actor582: split2 + Owner: Neutral + Location: 65,67 + Actor583: split2 + Owner: Neutral + Location: 72,65 + Actor586: split2 + Owner: Neutral + Location: 68,105 + Actor587: v2rl + Owner: Traitor + Location: 40,98 + Facing: 301 + Actor588: e1 + Owner: Greece + SubCell: 3 + Location: 51,106 + Facing: 0 + Actor589: e1 + Owner: Greece + SubCell: 3 + Location: 52,111 + Facing: 618 + Actor590: e1 + Owner: Greece + SubCell: 3 + Location: 56,107 + Facing: 904 + Actor591: e3 + Owner: Greece + Location: 53,108 + SubCell: 3 + Facing: 610 + Actor592: e3 + Owner: Greece + SubCell: 3 + Location: 59,111 + Facing: 808 + Actor593: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 44,96 + Actor594: e3 + Owner: Greece + SubCell: 3 + Location: 41,111 + Facing: 642 + Actor584: split2 + Owner: Neutral + Location: 71,101 + Actor585: split2 + Owner: Neutral + Location: 75,102 + Actor597: e3 + Owner: Traitor + SubCell: 3 + Facing: 384 + Location: 6,37 + Actor598: e3 + Owner: Traitor + Facing: 384 + Location: 7,36 + SubCell: 3 + Actor599: e3 + Owner: Traitor + Facing: 384 + SubCell: 3 + Location: 12,35 + Actor600: e3 + Owner: Traitor + Facing: 384 + SubCell: 3 + Location: 3,39 + Actor601: e3 + Owner: Greece + SubCell: 3 + Location: 27,32 + Facing: 0 + Actor602: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 36,31 + Actor603: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 33,33 + Actor604: e3 + Owner: Greece + Location: 49,31 + SubCell: 3 + Facing: 689 + Actor605: e3 + Owner: Greece + SubCell: 3 + Location: 56,24 + Facing: 23 + Actor606: e3 + Owner: Greece + SubCell: 3 + Location: 61,23 + Facing: 0 + Actor607: e3 + Owner: Greece + SubCell: 3 + Location: 76,18 + Facing: 0 + Actor608: e3 + Owner: Greece + SubCell: 3 + Location: 89,22 + Facing: 0 + Actor609: e3 + Owner: Greece + Location: 82,20 + SubCell: 3 + Facing: 158 + Actor612: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 65,34 + Actor613: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 62,30 + Actor614: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 53,39 + Actor615: sbag + Owner: Greece + Location: 90,61 + Actor616: sbag + Owner: Greece + Location: 91,61 + Actor617: sbag + Owner: Greece + Location: 92,61 + Actor618: sbag + Owner: Greece + Location: 90,62 + Actor619: agun + Owner: Greece + Health: 93 + TurretFacing: 71 + Location: 91,62 + Actor620: sbag + Owner: Greece + Location: 92,62 + Actor621: sbag + Owner: Greece + Location: 90,63 + Actor622: sbag + Owner: Greece + Location: 91,63 + Actor623: sbag + Owner: Greece + Location: 92,63 + Actor624: sbag + Owner: Greece + Location: 26,97 + Actor625: sbag + Owner: Greece + Location: 27,97 + Actor626: sbag + Owner: Greece + Location: 28,97 + Actor627: sbag + Owner: Greece + Location: 26,98 + Actor628: agun + Owner: Greece + Health: 93 + TurretFacing: 71 + Location: 27,98 + Actor629: sbag + Owner: Greece + Location: 28,98 + Actor630: sbag + Owner: Greece + Location: 26,99 + Actor631: sbag + Owner: Greece + Location: 27,99 + Actor632: sbag + Owner: Greece + Location: 28,99 + Actor633: sbag + Owner: Greece + Location: 36,80 + Actor634: sbag + Owner: Greece + Location: 37,80 + Actor635: sbag + Owner: Greece + Location: 38,80 + Actor636: sbag + Owner: Greece + Location: 36,81 + Actor637: agun + Owner: Greece + Health: 93 + TurretFacing: 71 + Location: 37,81 + Actor638: sbag + Owner: Greece + Location: 38,81 + Actor639: sbag + Owner: Greece + Location: 36,82 + Actor640: sbag + Owner: Greece + Location: 37,82 + Actor641: sbag + Owner: Greece + Location: 38,82 + Actor660: tc04 + Owner: Neutral + Location: 95,45 + Actor662: t16 + Owner: Neutral + Location: 96,40 + Actor663: t17 + Owner: Neutral + Location: 96,41 + Actor664: t10 + Owner: Neutral + Location: 95,42 + Actor665: t12 + Owner: Neutral + Location: 95,44 + Actor661: t05 + Owner: Neutral + Location: 96,43 + Actor666: tc05 + Owner: Neutral + Location: 90,47 + Actor667: tc02 + Owner: Neutral + Location: 93,53 + Actor668: t16 + Owner: Neutral + Location: 89,52 + Actor669: t10 + Owner: Neutral + Location: 86,56 + Actor670: t11 + Owner: Neutral + Location: 93,59 + Actor671: t14 + Owner: Neutral + Location: 79,55 + Actor672: t13 + Owner: Neutral + Location: 73,52 + Actor673: t15 + Owner: Neutral + Location: 64,57 + Actor674: t11 + Owner: Neutral + Location: 50,54 + Actor675: t07 + Owner: Neutral + Location: 57,59 + Actor676: t02 + Owner: Neutral + Location: 45,54 + Actor681: sbag + Owner: Greece + Location: 87,94 + Actor682: sbag + Owner: Greece + Location: 88,94 + Actor683: sbag + Owner: Greece + Location: 89,94 + Actor684: sbag + Owner: Greece + Location: 87,95 + Actor685: agun + Owner: Greece + Health: 93 + TurretFacing: 71 + Location: 88,95 + Actor686: sbag + Owner: Greece + Location: 89,95 + Actor687: sbag + Owner: Greece + Location: 87,96 + Actor688: sbag + Owner: Greece + Location: 88,96 + Actor689: sbag + Owner: Greece + Location: 89,96 + Actor677: tc05 + Owner: Neutral + Location: 92,110 + Actor678: tc03 + Owner: Neutral + Location: 93,104 + Actor679: t14 + Owner: Neutral + Location: 86,105 + Actor680: t14 + Owner: Neutral + Location: 86,105 + Actor690: t16 + Owner: Neutral + Location: 83,95 + Actor691: tc01 + Owner: Neutral + Location: 82,107 + Actor692: t16 + Owner: Neutral + Location: 76,108 + Actor693: t14 + Owner: Neutral + Location: 79,111 + Actor694: t11 + Owner: Neutral + Location: 84,64 + Actor695: t16 + Owner: Neutral + Location: 83,65 + Actor696: t05 + Owner: Neutral + Location: 19,77 + Actor697: tc01 + Owner: Neutral + Location: 17,78 + Actor698: tc03 + Owner: Neutral + Location: 20,74 + Actor700: tc04 + Owner: Neutral + Location: 31,74 + Actor701: tc05 + Owner: Neutral + Location: 39,78 + Actor702: tc02 + Owner: Neutral + Location: 34,73 + Actor703: t14 + Owner: Neutral + Location: 33,74 + Actor704: t10 + Owner: Neutral + Location: 29,75 + Actor705: t16 + Owner: Neutral + Location: 30,77 + Actor706: t05 + Owner: Neutral + Location: 34,76 + Actor707: t13 + Owner: Neutral + Location: 32,65 + Actor708: t05 + Owner: Neutral + Location: 29,61 + Actor709: t10 + Owner: Neutral + Location: 10,75 + Actor710: t13 + Owner: Neutral + Location: 42,50 + Actor711: t16 + Owner: Neutral + Location: 39,40 + Actor712: t10 + Owner: Neutral + Location: 37,43 + Actor713: t13 + Owner: Neutral + Location: 52,35 + Actor714: tc04 + Owner: Neutral + Location: 56,44 + Actor715: t15 + Owner: Neutral + Location: 54,46 + Actor716: t10 + Owner: Neutral + Location: 62,46 + Actor717: t13 + Owner: Neutral + Location: 63,27 + Actor718: t06 + Owner: Neutral + Location: 66,24 + Actor719: t01 + Owner: Neutral + Location: 78,20 + Actor720: t12 + Owner: Neutral + Location: 55,28 + Actor721: tc02 + Owner: Neutral + Location: 94,21 + Actor722: tc05 + Owner: Neutral + Location: 92,25 + Actor723: tc03 + Owner: Neutral + Location: 93,28 + Actor724: tc03 + Owner: Neutral + Location: 93,28 + Actor725: t14 + Owner: Neutral + Location: 94,31 + Actor726: t17 + Owner: Neutral + Location: 30,67 + Actor727: tc05 + Owner: Neutral + Location: 4,98 + Actor728: tc02 + Owner: Neutral + Location: 3,96 + Actor729: tc03 + Owner: Neutral + Location: 7,98 + Actor730: tc02 + Owner: Neutral + Location: 4,108 + Actor731: tc01 + Owner: Neutral + Location: 2,100 + Actor732: tc04 + Owner: Neutral + Location: 1,104 + Actor733: t15 + Owner: Neutral + Location: 3,106 + Actor734: t17 + Owner: Neutral + Location: 6,107 + Actor735: t14 + Owner: Neutral + Location: 1,107 + Actor736: t11 + Owner: Neutral + Location: 2,102 + Actor737: t13 + Owner: Neutral + Location: 1,98 + Actor738: t08 + Owner: Neutral + Location: 3,98 + Actor740: ice05 + Owner: Neutral + Location: 38,89 + Actor742: ice04 + Owner: Neutral + Location: 60,84 + Actor743: ice05 + Owner: Neutral + Location: 94,71 + Actor745: ice03 + Owner: Neutral + Location: 63,74 + Actor746: ice04 + Owner: Neutral + Location: 35,95 + Actor747: t13 + Owner: Neutral + Location: 22,102 + Actor748: split2 + Owner: Neutral + Location: 27,109 + Actor749: split2 + Owner: Neutral + Location: 12,103 + Actor750: tc02 + Owner: Neutral + Location: 9,111 + Actor751: tc03 + Owner: Neutral + Location: 7,69 + Actor752: ttra + Owner: Traitor + Facing: 384 + Location: 40,102 + Actor753: ttra + Owner: Traitor + Location: 65,101 + Facing: 880 + Actor755: 1tnk + Owner: Greece + Location: 25,80 + Facing: 111 + Actor756: 2tnk + Owner: Greece + Location: 55,62 + Facing: 118 + Actor757: 2tnk + Owner: Greece + Location: 83,45 + Facing: 626 + Actor758: 2tnk + Owner: Greece + Location: 34,107 + Facing: 261 + Actor759: gap + Owner: Greece + Location: 41,107 + Actor760: gap + Owner: Greece + Location: 58,104 + HardOnlyGapGenerator: gap + Owner: Greece + Location: 76,42 + Actor762: dd + Owner: Greece + Location: 25,92 + Facing: 261 + Actor763: dd + Owner: Greece + Location: 26,89 + Facing: 261 + Actor764: dd + Owner: Greece + Location: 13,93 + Facing: 761 + Actor766: dd + Owner: Greece + Location: 90,73 + Facing: 285 + Actor768: dd + Owner: Greece + Location: 79,74 + Facing: 745 + Actor770: pt + Owner: Greece + Location: 79,78 + Facing: 761 + Actor771: pt + Owner: Greece + Location: 89,80 + Facing: 277 + Actor772: dd + Owner: Greece + Facing: 384 + Location: 47,82 + Actor773: dd + Owner: Greece + Location: 59,79 + Facing: 880 + Actor774: pt + Owner: Greece + Facing: 384 + Location: 52,83 + Actor775: e1 + Owner: Greece + SubCell: 3 + Location: 15,82 + Facing: 896 + Actor776: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 20,81 + Actor777: e1 + Owner: Greece + Facing: 384 + Location: 29,76 + SubCell: 1 + Actor778: e1 + Owner: Greece + Facing: 384 + Location: 30,68 + SubCell: 1 + Actor779: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 37,42 + Actor780: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 39,44 + Actor781: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 46,45 + Actor782: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 47,52 + Actor783: e1 + Owner: Greece + SubCell: 3 + Location: 68,46 + Facing: 491 + Actor784: e1 + Owner: Greece + SubCell: 3 + Location: 66,45 + Facing: 261 + Actor785: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 55,25 + Actor786: e1 + Owner: Greece + SubCell: 3 + Location: 70,23 + Facing: 222 + Actor787: e1 + Owner: Greece + Facing: 384 + Location: 82,20 + SubCell: 1 + Actor788: e1 + Owner: Greece + SubCell: 3 + Location: 84,21 + Facing: 384 + Actor789: e1 + Owner: Greece + Location: 92,30 + SubCell: 3 + Facing: 618 + Actor790: e1 + Owner: Greece + SubCell: 3 + Location: 90,22 + Facing: 384 + Actor791: e1 + Owner: Greece + SubCell: 3 + Location: 89,62 + Facing: 0 + Actor792: e1 + Owner: Greece + SubCell: 3 + Location: 87,64 + Facing: 222 + Actor793: e1 + Owner: Greece + SubCell: 3 + Location: 78,47 + Facing: 578 + Actor794: e1 + Owner: Greece + SubCell: 3 + Location: 77,48 + Facing: 384 + Actor795: e1 + Owner: Greece + SubCell: 3 + Location: 85,44 + Facing: 642 + Actor796: e1 + Owner: Greece + Location: 57,64 + SubCell: 3 + Facing: 87 + Actor797: e1 + Owner: Greece + SubCell: 3 + Location: 54,65 + Facing: 0 + Actor798: e1 + Owner: Greece + Location: 44,72 + SubCell: 3 + Facing: 158 + Actor799: e1 + Owner: Greece + SubCell: 3 + Location: 43,76 + Facing: 245 + Actor800: e1 + Owner: Greece + Facing: 384 + Location: 44,68 + SubCell: 3 + Actor801: e1 + Owner: Greece + SubCell: 3 + Location: 58,62 + Facing: 237 + Actor802: e1 + Owner: Greece + SubCell: 3 + Location: 37,99 + Facing: 384 + Actor803: e1 + Owner: Greece + Location: 37,99 + SubCell: 1 + Facing: 245 + Actor806: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 34,101 + Actor807: e1 + Owner: Greece + SubCell: 3 + Location: 33,107 + Facing: 134 + Actor808: e1 + Owner: Greece + Facing: 384 + Location: 41,111 + SubCell: 1 + Actor809: e1 + Owner: Greece + SubCell: 3 + Location: 50,95 + Facing: 384 + Actor810: e1 + Owner: Greece + SubCell: 3 + Location: 64,95 + Facing: 785 + Actor811: e1 + Owner: Greece + Location: 63,92 + SubCell: 3 + Facing: 642 + Actor812: e1 + Owner: Greece + Location: 64,101 + SubCell: 3 + Facing: 872 + Actor813: e1 + Owner: Greece + Location: 62,101 + SubCell: 3 + Facing: 753 + Actor814: e1 + Owner: Greece + SubCell: 3 + Location: 62,97 + Facing: 785 + Actor815: 3tnk + Owner: Traitor + Facing: 777 + Location: 63,97 + Actor816: e2 + Owner: Traitor + SubCell: 3 + Location: 62,98 + Facing: 769 + Actor817: 3tnk + Owner: Traitor + Facing: 245 + Location: 35,109 + Actor804: e1 + Owner: Greece + Location: 36,110 + SubCell: 3 + Facing: 190 + Actor805: e1 + Owner: Greece + SubCell: 3 + Location: 25,99 + Facing: 126 + Actor818: e1 + Owner: Greece + Location: 25,99 + SubCell: 1 + Facing: 158 + Actor819: e1 + Owner: Greece + SubCell: 3 + Location: 18,100 + Facing: 0 + Actor820: e1 + Owner: Greece + SubCell: 3 + Location: 15,99 + Facing: 856 + Actor821: e1 + Owner: Greece + Location: 15,99 + SubCell: 1 + Facing: 0 + Actor822: e1 + Owner: Greece + SubCell: 3 + Location: 25,97 + Facing: 0 + Actor823: e3 + Owner: Greece + Location: 17,100 + SubCell: 3 + Facing: 39 + Actor824: e3 + Owner: Greece + SubCell: 3 + Location: 23,98 + Facing: 190 + Actor825: e3 + Owner: Greece + Location: 35,81 + SubCell: 3 + Facing: 142 + Actor826: e1 + Owner: Greece + Location: 37,79 + SubCell: 3 + Facing: 0 + Actor827: e1 + Owner: Greece + Location: 14,81 + SubCell: 1 + Facing: 0 + Actor828: e1 + Owner: Greece + SubCell: 3 + Location: 13,81 + Facing: 0 + Actor831: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 27,71 + Actor832: e1 + Owner: Greece + SubCell: 3 + Location: 51,35 + Facing: 384 + Actor833: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 45,30 + Actor834: e1 + Owner: Greece + SubCell: 3 + Location: 47,28 + Facing: 63 + Actor835: e1 + Owner: Greece + Location: 47,28 + SubCell: 1 + Facing: 158 + Actor836: e1 + Owner: Greece + SubCell: 3 + Location: 37,28 + Facing: 0 + Actor837: e1 + Owner: Greece + SubCell: 3 + Location: 39,27 + Facing: 0 + Actor838: e1 + Owner: Greece + SubCell: 3 + Location: 48,26 + Facing: 134 + Actor839: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 40,31 + Actor840: e1 + Owner: Greece + SubCell: 3 + Location: 37,32 + Facing: 539 + Actor841: e1 + Owner: Greece + Location: 57,24 + SubCell: 3 + Facing: 658 + Actor842: e1 + Owner: Greece + SubCell: 3 + Location: 75,6 + Facing: 713 + Actor843: e1 + Owner: Greece + SubCell: 3 + Location: 78,11 + Facing: 808 + Actor845: e1 + Owner: Greece + SubCell: 3 + Location: 72,9 + Facing: 872 + Actor846: e1 + Owner: Greece + SubCell: 3 + Location: 69,7 + Facing: 507 + Actor847: e1 + Owner: Greece + SubCell: 3 + Location: 65,14 + Facing: 0 + Actor848: e1 + Owner: Greece + SubCell: 3 + Location: 62,17 + Facing: 753 + Actor850: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 52,13 + Actor851: e1 + Owner: Greece + SubCell: 3 + Location: 55,15 + Facing: 705 + Actor849: e1 + Owner: Greece + SubCell: 3 + Location: 58,9 + Facing: 499 + Actor852: e1 + Owner: Greece + SubCell: 3 + Location: 49,9 + Facing: 697 + Actor853: e1 + Owner: Greece + SubCell: 3 + Location: 39,13 + Facing: 800 + Actor854: e1 + Owner: Greece + Location: 39,13 + SubCell: 1 + Facing: 483 + Actor855: e1 + Owner: Greece + SubCell: 3 + Location: 41,11 + Health: 68 + Facing: 745 + Actor856: e1 + Owner: Greece + SubCell: 3 + Location: 37,11 + Facing: 808 + Actor857: e1 + Owner: Greece + SubCell: 3 + Location: 42,18 + Facing: 0 + Actor858: e1 + Owner: Greece + SubCell: 3 + Location: 35,14 + Facing: 491 + Actor859: e3 + Owner: Greece + SubCell: 3 + Location: 33,10 + Facing: 586 + Actor860: e3 + Owner: Greece + SubCell: 3 + Location: 65,16 + Facing: 753 + Actor861: e3 + Owner: Greece + SubCell: 3 + Location: 66,8 + Facing: 682 + Actor862: e3 + Owner: Greece + SubCell: 3 + Location: 75,12 + Facing: 384 + Actor844: e1 + Owner: Greece + SubCell: 3 + Location: 45,27 + Facing: 0 + Actor863: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 90,31 + Actor864: e1 + Owner: Greece + Location: 88,63 + SubCell: 3 + Facing: 118 + Actor865: e1 + Owner: Greece + SubCell: 3 + Location: 84,84 + Facing: 118 + Actor866: e1 + Owner: Greece + Location: 84,84 + SubCell: 1 + Facing: 0 + Actor867: e1 + Owner: Greece + SubCell: 3 + Location: 89,86 + Facing: 0 + Actor868: e1 + Owner: Greece + SubCell: 3 + Location: 79,87 + Facing: 864 + Actor869: e1 + Owner: Greece + SubCell: 3 + Location: 78,83 + Facing: 935 + Actor870: e1 + Owner: Greece + SubCell: 3 + Location: 86,88 + Facing: 0 + Actor871: ptnk + Owner: Greece + Location: 36,111 + Facing: 253 + Actor872: ptnk + Owner: Greece + Location: 62,91 + Facing: 761 + Actor873: e1 + Owner: Greece + SubCell: 3 + Location: 66,110 + Facing: 745 + Actor874: e1 + Owner: Greece + SubCell: 3 + Location: 73,111 + Facing: 0 + Actor875: e1 + Owner: Greece + SubCell: 3 + Location: 78,109 + Facing: 888 + Actor876: e1 + Owner: Greece + SubCell: 3 + Location: 81,110 + Facing: 713 + Actor877: e1 + Owner: Greece + SubCell: 3 + Location: 12,14 + Facing: 0 + Actor878: e1 + Owner: Greece + SubCell: 3 + Location: 14,16 + Facing: 206 + Actor880: e1 + Owner: Greece + SubCell: 3 + Location: 7,18 + Facing: 507 + Actor881: e1 + Owner: Greece + SubCell: 3 + Location: 15,21 + Facing: 158 + Actor882: e1 + Owner: Greece + SubCell: 3 + Location: 5,25 + Facing: 761 + Actor883: e3 + Owner: Greece + SubCell: 3 + Location: 17,24 + Facing: 832 + Actor884: e3 + Owner: Greece + SubCell: 3 + Location: 8,16 + Facing: 959 + Actor885: e1 + Owner: Greece + SubCell: 3 + Location: 11,24 + Facing: 0 + Actor886: e1 + Owner: Greece + SubCell: 3 + Location: 20,35 + Facing: 0 + HardOnlyMGG: mgg + Owner: Greece + Location: 52,69 + Facing: 384 + Actor888: jeep + Owner: Greece + Facing: 384 + Location: 27,72 + Actor889: jeep + Owner: Greece + Facing: 384 + Location: 54,37 + Actor890: jeep + Owner: Greece + Location: 88,62 + Facing: 142 + Actor891: arty + Owner: Greece + Location: 76,43 + Facing: 384 + Actor892: arty + Owner: Greece + Location: 66,38 + Facing: 384 + Actor894: arty + Owner: Greece + Location: 25,98 + Facing: 15 + Actor895: arty + Owner: Greece + Location: 91,84 + Facing: 158 + Actor896: rtnk + Owner: Greece + Location: 48,60 + Facing: 261 + Actor897: rtnk + Owner: Greece + Location: 46,48 + Facing: 245 + Actor898: pcan + Owner: Greece + Location: 43,95 + Facing: 384 + Actor900: pbox + Owner: Greece + Location: 88,84 + Actor901: pbox + Owner: Greece + Location: 81,84 + HardOnlyTurret3: gun + Owner: Greece + Location: 85,84 + TurretFacing: 0 + Actor903: gun + Owner: Greece + Location: 88,64 + Actor904: gun + Owner: Greece + Location: 14,33 + TurretFacing: 192 + Actor905: gun + Owner: Greece + Location: 80,67 + Actor906: pbox + Owner: Greece + Location: 89,67 + Actor907: ifv + Owner: Greece + Location: 18,101 + Facing: 0 + Actor909: ifv + Owner: Greece + Location: 90,66 + Facing: 126 + Actor910: 1tnk + Owner: Greece + Location: 11,73 + Facing: 904 + Actor911: apc.ai + Owner: Greece + Facing: 384 + Location: 66,51 + Actor912: apc.ai + Owner: Greece + Facing: 384 + Location: 67,53 + Actor913: 2tnk + Owner: Greece + Location: 86,77 + Facing: 0 + Actor914: 2tnk + Owner: Greece + Location: 19,89 + Facing: 0 + Actor915: cryo + Owner: Greece + Location: 60,94 + Facing: 761 + HardOnlyCryoLauncher: cryo + Owner: Greece + Location: 75,39 + Facing: 523 + Actor917: rtnk + Owner: Greece + Location: 70,89 + Facing: 904 + Actor919: apc.ai + Owner: Greece + Location: 72,92 + Facing: 927 + Actor918: rtnk + Owner: Greece + Facing: 904 + Location: 73,88 + Actor920: e1 + Owner: Greece + SubCell: 3 + Facing: 745 + Location: 64,112 + AbandonedBaseTopLeft: waypoint + Owner: Neutral + Location: 5,42 + AbandonedBaseBottomRight: waypoint + Owner: Neutral + Location: 27,64 + Actor922: e1 + Owner: Greece + SubCell: 3 + Location: 59,19 + Facing: 150 + Actor923: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 55,8 + Actor924: e1 + Owner: Greece + SubCell: 3 + Location: 43,16 + Facing: 555 + AbandonedBaseCenter: waypoint + Owner: Neutral + Location: 16,50 + SouthAttackRally: waypoint + Owner: Neutral + Location: 20,104 + EastAttackRally: waypoint + Owner: Neutral + Location: 83,86 + EastAttack1: waypoint + Owner: Neutral + Location: 82,58 + Actor926: waypoint + Owner: Neutral + Location: 82,58 + EastAttack2: waypoint + Owner: Neutral + Location: 55,56 + EastAttack3b: waypoint + Owner: Neutral + Location: 32,38 + EastAttack3a: waypoint + Owner: Neutral + Location: 31,54 + SouthAttack1: waypoint + Owner: Neutral + Location: 16,66 + Actor925: tsla + Owner: Traitor + Location: 53,101 + Actor928: e1 + Owner: Greece + SubCell: 3 + Facing: 745 + Location: 72,112 + Actor929: e1 + Owner: Greece + SubCell: 3 + Facing: 745 + Location: 77,111 + Actor921: e1 + Owner: Greece + SubCell: 3 + Facing: 745 + Location: 70,111 + Actor930: camera + Owner: Greece + Location: 16,61 + Actor931: camera + Owner: Greece + Location: 26,54 + Actor932: camera + Owner: Greece + Location: 16,45 + Actor933: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 13,20 + Actor934: e1 + Owner: Greece + SubCell: 3 + Facing: 507 + Location: 3,23 + TraitorGeneralSafePoint: waypoint + Owner: Neutral + Location: 42,99 + Actor937: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 79,85 + Actor938: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 95,98 + Actor939: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 53,37 + Actor940: e1 + Owner: Greece + Facing: 384 + Location: 68,53 + SubCell: 3 + Actor941: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 67,52 + Actor942: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 66,49 + Actor943: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 74,52 + Actor944: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 86,56 + Actor945: e1 + Owner: Greece + Facing: 384 + Location: 91,47 + SubCell: 3 + Actor946: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 39,7 + Actor947: e3 + Owner: Greece + SubCell: 3 + Facing: 586 + Location: 37,6 + Actor948: e3 + Owner: Greece + SubCell: 3 + Location: 9,10 + Facing: 872 + TraitorTechCenter: stek + Owner: Traitor + Location: 79,27 + Actor950: ss + Owner: Traitor + Location: 42,87 + Facing: 888 + Actor951: ss + Owner: Traitor + Facing: 384 + Location: 72,76 + Actor952: v2rl + Owner: Traitor + Location: 81,30 + Facing: 594 + Actor953: dome + Owner: USSRAbandoned + Location: 11,46 + Health: 46 + Actor954: dd + Owner: Greece + Facing: 777 + Location: 13,88 + Actor956: pt + Owner: Greece + Facing: 285 + Location: 31,90 + Cruiser: ca + Owner: Greece + Location: 6,91 + Facing: 777 + CruiserPatrol1: waypoint + Owner: Neutral + Location: 6,91 + CruiserPatrol2: waypoint + Owner: Neutral + Location: 38,91 + CruiserPatrol3: waypoint + Owner: Neutral + Location: 41,88 + CruiserPatrol4: waypoint + Owner: Neutral + Location: 44,88 + CruiserPatrol5: waypoint + Owner: Neutral + Location: 46,86 + CruiserPatrol6: waypoint + Owner: Neutral + Location: 55,86 + CruiserPatrol7: waypoint + Owner: Neutral + Location: 64,77 + CruiserPatrol8: waypoint + Owner: Neutral + Location: 91,77 + Actor949: hosp + Owner: Neutral + Location: 46,22 + Actor955: e3 + Owner: Greece + Facing: 384 + Location: 44,96 + SubCell: 1 + Actor957: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 49,94 + Actor958: e3 + Owner: Greece + Facing: 384 + Location: 19,108 + Actor959: e3 + Owner: Greece + Facing: 384 + Location: 52,101 + SubCell: 3 + Actor960: e3 + Owner: Greece + Facing: 384 + Location: 40,99 + SubCell: 3 + Actor962: barr + Owner: USSRAbandoned + Location: 14,47 + Health: 44 + TraitorConyard: fact + Owner: Traitor + Location: 68,31 + Actor961: afld + Owner: Traitor + Location: 72,31 + Actor965: afld + Owner: Traitor + Location: 72,33 + Actor963: powr + Owner: Greece + Location: 76,34 + Actor966: split2 + Owner: Neutral + Location: 20,38 + Actor967: split2 + Owner: Neutral + Location: 9,39 + Actor935: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 13,35 + Actor936: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 23,34 + Actor968: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 24,35 + Actor969: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 18,41 + Actor970: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 14,41 + TraitorHQ: fcom + Owner: Traitor + Location: 45,102 + TraitorBarracks: barr + Owner: Traitor + Location: 42,102 + TraitorFactory: weap + Owner: Traitor + Location: 43,98 + Actor964: atek + Owner: Greece + Location: 42,108 + Actor973: apwr + Owner: Greece + Location: 45,108 + TraitorHQSpawn: waypoint + Owner: Neutral + Location: 45,103 + GuardsReveal1: waypoint + Owner: Neutral + Location: 43,28 + ReinforcementsSpawn: waypoint + Owner: Neutral + Location: 15,1 + ReinforcementsDestination: waypoint + Owner: Neutral + Location: 15,10 + Actor974: pbox + Owner: Greece + Location: 56,64 + Actor975: pbox + Owner: Greece + Location: 44,69 + TraitorTechCenterFlare: waypoint + Owner: Neutral + Location: 80,29 + Actor976: silo + Owner: Traitor + Location: 82,28 + Actor977: silo + Owner: Traitor + Location: 82,29 + Actor978: silo + Owner: Traitor + Location: 78,29 + Actor979: silo + Owner: Traitor + Location: 78,28 + EastParadrop1: waypoint + Owner: Neutral + Location: 84,34 + Actor980: e3 + Owner: Traitor + Facing: 384 + SubCell: 3 + Location: 71,31 + Actor981: powr + Owner: Greece + Location: 79,32 + TraitorSAM2: sam + Owner: Traitor + Location: 80,39 + TraitorSAM1: sam + Owner: Traitor + Location: 80,36 + EastParadrop3: waypoint + Owner: Neutral + Location: 70,35 + EastParadrop2: waypoint + Owner: Neutral + Location: 77,37 + Actor982: ptnk + Owner: Greece + Facing: 0 + Location: 20,106 + Actor983: 4tnk + Owner: Traitor + Location: 24,106 + Facing: 118 + Actor971: oilb + Owner: Neutral + Location: 5,66 + Actor972: oilb + Owner: Neutral + Location: 34,60 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-doctrines.yaml, treachery-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/main-campaign/ca14-treachery/r2_boriskilled.aud b/mods/ca/missions/main-campaign/ca14-treachery/r2_boriskilled.aud new file mode 100644 index 0000000000..7a60c80e31 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca14-treachery/r2_boriskilled.aud differ diff --git a/mods/ca/missions/main-campaign/ca14-treachery/r2_yegeroveliminated.aud b/mods/ca/missions/main-campaign/ca14-treachery/r2_yegeroveliminated.aud new file mode 100644 index 0000000000..82d4821f0d Binary files /dev/null and b/mods/ca/missions/main-campaign/ca14-treachery/r2_yegeroveliminated.aud differ diff --git a/mods/ca/missions/main-campaign/ca14-treachery/r_boriskilled.aud b/mods/ca/missions/main-campaign/ca14-treachery/r_boriskilled.aud new file mode 100644 index 0000000000..00dfb6b06d Binary files /dev/null and b/mods/ca/missions/main-campaign/ca14-treachery/r_boriskilled.aud differ diff --git a/mods/ca/missions/main-campaign/ca14-treachery/r_yegeroveliminated.aud b/mods/ca/missions/main-campaign/ca14-treachery/r_yegeroveliminated.aud new file mode 100644 index 0000000000..57b39022de Binary files /dev/null and b/mods/ca/missions/main-campaign/ca14-treachery/r_yegeroveliminated.aud differ diff --git a/mods/ca/missions/main-campaign/ca14-treachery/treachery-rules.yaml b/mods/ca/missions/main-campaign/ca14-treachery/treachery-rules.yaml new file mode 100644 index 0000000000..7fb2edf3d2 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca14-treachery/treachery-rules.yaml @@ -0,0 +1,147 @@ +^Palettes: + TintPostProcessEffect: + +World: + LuaScript: + Scripts: campaign.lua, treachery.lua + MissionData: + Briefing: We have been betrayed! Our recent losses were enough for the coward General Yegorov to show his true colours. He, along with an unknown number of troops loyal to him, have defected to the Allies.\n\nHe was not counting on hostilities with the Brotherhood of Nod ending so soon, and must now be feeling very nervous.\n\nHe deserves no mercy. Put an end to the traitor and anyone who tries to protect him.\n\nBoris believes he can kill the traitor by himself. If you don't share his confidence then the safer approach would be to find our abandoned base, build up a force, and overwhelm Yegorov's defenders. + MapOptions: + ShortGameCheckboxEnabled: False + MusicPlaylist: + StartingMusic: terminat + +Player: + PlayerResources: + DefaultCash: 6000 + +# Disable powers for AI + +^SpyPlanePower: + AirstrikePowerCA@spyplane: + Prerequisites: ~!botplayer + +^ParabombsPower: + AirstrikePowerCA@Russianparabombs: + Prerequisites: ~support.parabombs, ~!botplayer + +^ParatroopersPower: + ParatroopersPowerCA@paratroopers: + Prerequisites: ~support.paratroopers, ~!botplayer + +# Disable tech + +MCV: + Inherits@CAMPAIGNDISABLED: ^Disabled + +MSLO: + Inherits@CAMPAIGNDISABLED: ^Disabled + +DOME: + -ParatroopersPowerCA@paratroopers: + AirstrikePowerCA@spyplane: + ChargeInterval: 4500 + +PROC: + StoresPlayerResources: + Capacity: 30000 + +HPAD.Abandoned: + Inherits: HPAD + RenderSprites: + Image: hpad + Exit@1: + Facing: 384 + Power: + Amount: 0 + -AirstrikePowerCA@Russianparabombs: + -RallyPoint: + -FreeActorCA@QUEUEUPDATER: + -GrantDelayedCondition@QUEUEUPDATER: + -GrantConditionOnPrerequisite@MQF: + -GrantConditionOnPrerequisite@MQS: + -PrimaryBuilding: + -WithDecoration@primary: + -ProductionQueue@MQAIR: + -Production@SQAIR: + -Production@MQAIR: + -ProductionBar@SQAIR: + -ProductionBar@MQAIR: + +HALO: + GrantConditionIfOwnerIsNeutral@NEUTRAL: + Condition: is-neutral + WithIdleOverlay@ROTOR1GROUND: + PauseOnCondition: is-neutral + RevealsShroud: + Range: 10c0 + +BORI: + RevealsShroud: + Range: 8c0 + -Demolition: + AutoTarget: + InitialStance: HoldFire + -Buildable: + +GNRL: + Tooltip: + Name: General Yegorov + RenderSprites: + Image: boris + -Palette: + PlayerPalette: playertd + WithDeathAnimation: + DeathSequencePalette: playertd + GrantTimedCondition@IMPERVIOUS: + Condition: impervious + Duration: 15 + DamageMultiplier@IMPERVIOUS: + Modifier: 0 + RequiresCondition: impervious + -Valued: + -AttackFrontal: + -AttackMove: + -Guard: + -GrantConditionOnFaction@RA: + -GrantConditionOnFaction@TD: + -Armament@RA: + -Armament@TD: + -AutoTarget: + -AutoTargetPriority@DEFAULT: + -AutoTargetPriority@ATTACKANYTHING: + +FCOM: + Health: + HP: 200000 + Tooltip: + Name: General Yegorov's HQ + -GenericVisibility: + -BaseProvider: + -SpawnActorOnDeath: + RepairableBuilding: + RepairStep: 500 + RepairPercent: 30 + RepairingNotification: Repairing + +powerproxy.halodrop: + ParatroopersPower: + DisplayBeacon: False + DropItems: E1, E1, E3, E2, E1, E1, E3, E8, E1 + UnitType: halo.paradrop.invuln + AlwaysVisible: + +powerproxy.shockdrop: + ParatroopersPower: + DisplayBeacon: False + DropItems: SHOK, SHOK, SHOK, SHOK, SHOK + UnitType: halo.paradrop.invuln + AlwaysVisible: + +HALO.paradrop.invuln: + Inherits: HALO.paradrop + -Targetable@AIRBORNE: + +# Hunt() requires only 1 AttackBase +BATF.AI: + -AttackFrontal: diff --git a/mods/ca/missions/main-campaign/ca14-treachery/treachery.lua b/mods/ca/missions/main-campaign/ca14-treachery/treachery.lua new file mode 100644 index 0000000000..5a05840dd6 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca14-treachery/treachery.lua @@ -0,0 +1,381 @@ +MissionDir = "ca|missions/main-campaign/ca14-treachery" + + +GreeceMainAttackPaths = { + { SouthAttackRally.Location, SouthAttack1.Location }, + { EastAttackRally.Location, EastAttack1.Location, EastAttack2.Location, EastAttack3a.Location }, + { EastAttackRally.Location, EastAttack1.Location, EastAttack2.Location, EastAttack3b.Location }, +} + +CruiserPatrolPath = { CruiserPatrol1.Location, CruiserPatrol2.Location, CruiserPatrol3.Location, CruiserPatrol4.Location, CruiserPatrol5.Location, CruiserPatrol6.Location, CruiserPatrol7.Location, CruiserPatrol8.Location, CruiserPatrol7.Location, CruiserPatrol6.Location, CruiserPatrol5.Location, CruiserPatrol4.Location, CruiserPatrol3.Location, CruiserPatrol2.Location } + +TraitorCompositions = { + easy = { + { Infantry = { "e3", "e1", "e1", "e1", "e3", "e1" }, Vehicles = { "btr" }, MaxTime = DateTime.Minutes(14) }, + { Infantry = { "e3", "e1", "e1", "e1", "e3", "e1", "shok" }, Vehicles = { "btr", "katy" }, MinTime = DateTime.Minutes(14) }, + }, + normal = { + { Infantry = { "e3", "e1", "e1", "e1", "e3", "e1" }, Vehicles = { "3tnk" }, MaxTime = DateTime.Minutes(12) }, + { Infantry = { "e3", "e1", "e1", "e1", "e3", "e1", "shok" }, Vehicles = { "3tnk", "katy" }, MinTime = DateTime.Minutes(12) }, + }, + hard = { + { Infantry = { "e3", "e1", "e1", "e1", "e3", "e1" }, Vehicles = { "3tnk", "btr" }, MaxTime = DateTime.Minutes(10) }, + { Infantry = { "e3", "e1", "e1", "e1", "e3", "e1", "shok" }, Vehicles = { "3tnk", "v2rl", "ttra" }, MinTime = DateTime.Minutes(10) }, + }, + vhard = { + { Infantry = { "e3", "e1", "e1", "e1", "e3", "e1", "e1", "e1" }, Vehicles = { "4tnk", "btr" }, MaxTime = DateTime.Minutes(9) }, + { Infantry = { "e3", "e1", "e1", "e1", "e3", "e1", "shok", "e1", "e1" }, Vehicles = { "4tnk", "btr.ai", "v2rl", "ttra" }, MinTime = DateTime.Minutes(9) }, + }, + brutal = { + { Infantry = { "e3", "e1", "e1", "e1", "e3", "e1", "e1", "e1" }, Vehicles = { "4tnk", "btr.ai" }, MaxTime = DateTime.Minutes(8) }, + { Infantry = { "e3", "e1", "e1", "e1", "e3", "e1", "e1", "e1", "ttrp", "e1", "e1", "e1", "ttrp" }, Vehicles = { "4tnk", "btr.ai", "v3rl", "v2rl", "ttra" }, MinTime = DateTime.Minutes(8) }, + } +} + +ReinforcementsDelay = { + easy = DateTime.Minutes(3), + normal = DateTime.Minutes(7), + hard = DateTime.Minutes(10), + vhard = DateTime.Minutes(11), + brutal = DateTime.Minutes(12) +} + +Squads = { + Main = { + Delay = AdjustDelayForDifficulty(DateTime.Seconds(210)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 28, Max = 55, RampDuration = DateTime.Minutes(15) }), + FollowLeader = true, + ProducerActors = { Infantry = { AlliedSouthBarracks }, Vehicles = { AlliedSouthFactory } }, + Compositions = AdjustCompositionsForDifficulty(UnitCompositions.Allied), + AttackPaths = GreeceMainAttackPaths, + }, + Traitor = { + Delay = AdjustDelayForDifficulty(DateTime.Minutes(4)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 12, Max = 25, RampDuration = DateTime.Minutes(15) }), + FollowLeader = true, + ProducerActors = { Infantry = { TraitorBarracks }, Vehicles = { TraitorFactory } }, + Compositions = TraitorCompositions, + AttackPaths = GreeceMainAttackPaths, + }, + Air = { + Delay = AdjustAirDelayForDifficulty(DateTime.Minutes(13)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 12, Max = 12 }), + Compositions = AirCompositions.Allied, + } +} + +SetupPlayers = function() + USSR = Player.GetPlayer("USSR") + Greece = Player.GetPlayer("Greece") + Traitor = Player.GetPlayer("Traitor") + USSRAbandoned = Player.GetPlayer("USSRAbandoned") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = { USSR } + MissionEnemies = { Greece, Traitor } +end + +WorldLoaded = function() + SetupPlayers() + + TimerTicks = 0 + Camera.Position = PlayerStart.CenterPosition + + InitObjectives(USSR) + AdjustPlayerStartingCashForDifficulty() + InitGreece() + + HaloDropper = Actor.Create("powerproxy.halodrop", false, { Owner = USSR }) + ShockDropper = Actor.Create("powerproxy.shockdrop", false, { Owner = USSR }) + + ObjectiveKillTraitor = USSR.AddObjective("Find and kill the traitor General Yegorov.") + ObjectiveFindSovietBase = USSR.AddSecondaryObjective("Take control of abandoned Soviet base.") + + AbandonedHalo.ReturnToBase(AbandonedHelipad) + SetupRefAndSilosCaptureCredits(Traitor) + + if IsHardOrAbove() then + Cruiser.Patrol(CruiserPatrolPath) + AbandonedAirfield.Destroy() + else + Cruiser.Destroy() + HardOnlyMGG.Destroy() + HardOnlyTurret1.Destroy() + HardOnlyTurret2.Destroy() + HardOnlyTurret3.Destroy() + HardOnlyTurret4.Destroy() + HardOnlyTurret5.Destroy() + HardOnlyGapGenerator.Destroy() + HardOnlyTeslaCoil.Destroy() + HardOnlyCryoLauncher.Destroy() + end + + Trigger.OnCapture(AbandonedHelipad, function(self, captor, oldOwner, newOwner) + if IsMissionPlayer(newOwner) then + AbandonedHalo.Owner = newOwner + + if IsNormalOrBelow() then + Trigger.AfterDelay(DateTime.Seconds(5), function() + local islandFlare = Actor.Create("flare", true, { Owner = USSR, Location = ReinforcementsDestination.Location }) + Trigger.AfterDelay(DateTime.Seconds(10), islandFlare.Destroy) + Beacon.New(USSR, ReinforcementsDestination.CenterPosition) + PlaySpeechNotificationToMissionPlayers("SignalFlare") + end) + end + end + end) + + Trigger.OnEnteredProximityTrigger(GuardsReveal1.CenterPosition, WDist.New(11 * 1024), function(a, id) + if IsMissionPlayer(a.Owner) and not a.HasProperty("Land") then + Trigger.RemoveProximityTrigger(id) + local camera = Actor.Create("smallcamera", true, { Owner = USSR, Location = GuardsReveal1.Location }) + Trigger.AfterDelay(DateTime.Seconds(5), function() + camera.Destroy() + end) + end + end) + + Trigger.OnEnteredProximityTrigger(TraitorTechCenter.CenterPosition, WDist.New(9 * 1024), function(a, id) + if IsMissionPlayer(a.Owner) and a.Type ~= "smig" then + Trigger.RemoveProximityTrigger(id) + TraitorTechCenterDiscovered() + end + end) + + Trigger.OnEnteredProximityTrigger(AbandonedBaseCenter.CenterPosition, WDist.New(10 * 1024), function(a, id) + if IsMissionPlayer(a.Owner) and not a.HasProperty("Land") then + Trigger.RemoveProximityTrigger(id) + AbandonedBaseDiscovered() + end + end) + + Trigger.OnKilled(Boris, function(self, killer) + Trigger.AfterDelay(DateTime.Seconds(1), function() + Notification("Boris has been killed.") + MediaCA.PlaySound(MissionDir .. "/r2_boriskilled.aud", 2) + end) + end) + + Trigger.OnKilled(Bodyguard1, function(self, killer) + Trigger.AfterDelay(DateTime.Seconds(4), function() + if not TraitorGeneral.IsDead and TraitorGeneral.IsInWorld then + TraitorGeneral.Move(TraitorGeneralSafePoint.Location) + end + end) + end) + + Trigger.OnKilled(TraitorGeneral, function(self, killer) + USSR.MarkCompletedObjective(ObjectiveKillTraitor) + MediaCA.PlaySound(MissionDir .. "/r2_yegeroveliminated.aud", 2) + end) + + Trigger.OnAllKilled({ TraitorSAM1, TraitorSAM2 }, function() + PlaySpeechNotificationToMissionPlayers("ReinforcementsArrived") + HaloDropper.TargetParatroopers(EastParadrop1.CenterPosition, Angle.West) + + Trigger.AfterDelay(DateTime.Seconds(2), function() + ShockDropper.TargetParatroopers(EastParadrop2.CenterPosition, Angle.West) + end) + + Trigger.AfterDelay(DateTime.Seconds(4), function() + HaloDropper.TargetParatroopers(EastParadrop3.CenterPosition, Angle.West) + end) + end) + + Trigger.OnCapture(TraitorConyard, function(self, captor, oldOwner, newOwner) + Trigger.AfterDelay(DateTime.Minutes(1), function() + InitAlliedAttacks() + end) + end) + + Trigger.OnCapture(TraitorTechCenter, function(self, captor, oldOwner, newOwner) + if IsMissionPlayer(newOwner) then + if ObjectiveCaptureTraitorTechCenter == nil then + ObjectiveCaptureTraitorTechCenter = USSR.AddSecondaryObjective("Capture Traitor's Tech Center.") + end + USSR.MarkCompletedObjective(ObjectiveCaptureTraitorTechCenter) + Trigger.AfterDelay(DateTime.Seconds(2), function() + Notification("The traitor's tech center is ours! Let us rain down V3 rockets on the traitor, or perhaps crush him under the tracks of a Mammoth Tank!") + end) + end + end) + + Trigger.OnKilled(TraitorTechCenter, function(self, killer) + if ObjectiveCaptureTraitorTechCenter ~= nil and not USSR.IsObjectiveCompleted(ObjectiveCaptureTraitorTechCenter) then + USSR.MarkFailedObjective(ObjectiveCaptureTraitorTechCenter) + end + end) + + Trigger.OnKilled(TraitorHQ, function(self, killer) + TraitorHQKilledOrCaptured() + end) + + Trigger.OnCapture(TraitorHQ, function(self, captor, oldOwner, newOwner) + TraitorHQKilledOrCaptured() + end) + + AfterWorldLoaded() +end + +Tick = function() + OncePerSecondChecks() + OncePerFiveSecondChecks() + OncePerThirtySecondChecks() + AfterTick() +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + Greece.Resources = Greece.ResourceCapacity - 500 + Traitor.Resources = Traitor.ResourceCapacity - 500 + + if TimerTicks > 0 then + if TimerTicks > 25 then + TimerTicks = TimerTicks - 25 + else + TimerTicks = 0 + end + end + end +end + +OncePerFiveSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 125 == 0 then + UpdatePlayerBaseLocations() + + if MissionPlayersHaveNoRequiredUnits() then + if ObjectiveKillTraitor ~= nil and not USSR.IsObjectiveCompleted(ObjectiveKillTraitor) then + USSR.MarkFailedObjective(ObjectiveKillTraitor) + end + end + end +end + +OncePerThirtySecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % DateTime.Seconds(30) == 0 then + CalculatePlayerCharacteristics() + end +end + +InitGreece = function() + if Difficulty == "easy" then + RebuildExcludes.Greece = { Types = { "gun", "pbox", "pris" } } + end + + AutoRepairAndRebuildBuildings(Greece, 15) + SetupRefAndSilosCaptureCredits(Greece) + AutoReplaceHarvesters(Greece) + AutoRebuildConyards(Greece) + InitAiUpgrades(Greece) + InitAiUpgrades(Traitor) + + Actor.Create("ai.unlimited.power", true, { Owner = Traitor }) + + local alliedGroundAttackers = Greece.GetGroundAttackers() + + Utils.Do(alliedGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsGreeceGroundHunterUnit) + end) + + local traitorGroundAttackers = Traitor.GetGroundAttackers() + + Utils.Do(traitorGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsGroundHunterUnit) + end) +end + +TraitorTechCenterDiscovered = function() + if IsTraitorTechCenterDiscovered then + return + end + + IsTraitorTechCenterDiscovered = true + + local traitorTechCenterFlare = Actor.Create("flare", true, { Owner = USSR, Location = TraitorTechCenterFlare.Location }) + Trigger.AfterDelay(DateTime.Seconds(10), traitorTechCenterFlare.Destroy) + Beacon.New(USSR, TraitorTechCenterFlare.CenterPosition) + PlaySpeechNotificationToMissionPlayers("SignalFlare") + + if ObjectiveCaptureTraitorTechCenter == nil then + ObjectiveCaptureTraitorTechCenter = USSR.AddSecondaryObjective("Capture Traitor's Tech Center.") + if TraitorTechCenter.IsDead then + USSR.MarkFailedObjective(ObjectiveCaptureTraitorTechCenter) + end + end +end + +AbandonedBaseDiscovered = function() + if IsAbandonedBaseDiscovered then + return + end + + IsAbandonedBaseDiscovered = true + + -- Yegorov retreats to HQ + if TraitorGeneral.IsInWorld then + TraitorGeneral.Destroy() + end + + TransferAbandonedBase() + + USSR.MarkCompletedObjective(ObjectiveFindSovietBase) + + Trigger.AfterDelay(DateTime.Seconds(10), function() + TraitorTechCenterDiscovered() + end) + + InitAlliedAttacks() + + Trigger.AfterDelay(ReinforcementsDelay[Difficulty], function() + PlaySpeechNotificationToMissionPlayers("ReinforcementsArrived") + Beacon.New(USSR, ReinforcementsDestination.CenterPosition) + local reinforcements = { "4tnk", "4tnk", "v3rl", "v3rl", "btr" } + if IsHardOrAbove() then + reinforcements = { "4tnk", "4tnk", "v2rl", "btr" } + end + Reinforcements.Reinforce(USSR, reinforcements, { ReinforcementsSpawn.Location, ReinforcementsDestination.Location }, 75) + end) + + Trigger.AfterDelay(DateTime.Seconds(30), function() + PlaySpeechNotificationToMissionPlayers("ReinforcementsArrived") + ShockDropper.TargetParatroopers(AbandonedBaseCenter.CenterPosition, Angle.SouthWest) + end) +end + +TransferAbandonedBase = function() + local baseBuildings = Map.ActorsInBox(AbandonedBaseTopLeft.CenterPosition, AbandonedBaseBottomRight.CenterPosition, function(a) + return a.Owner == USSRAbandoned + end) + + Utils.Do(baseBuildings, function(a) + a.Owner = USSR + end) + + Trigger.AfterDelay(1, function() + Actor.Create("QueueUpdaterDummy", true, { Owner = USSR }) + end) +end + +TraitorHQKilledOrCaptured = function() + -- Spawn Yegorov (unless he's outside already) + if not TraitorGeneral.IsInWorld then + local traitorGeneral = Actor.Create("gnrl", true, { Owner = Traitor, Location = TraitorHQSpawn.Location }) + traitorGeneral.Move(TraitorGeneralSafePoint.Location) + Trigger.OnKilled(traitorGeneral, function(self, killer) + MediaCA.PlaySound(MissionDir .. "/r2_yegeroveliminated.aud", 2) + Trigger.AfterDelay(DateTime.Seconds(2), function() + USSR.MarkCompletedObjective(ObjectiveKillTraitor) + end) + end) + end +end + +InitAlliedAttacks = function() + if not AttacksStarted then + AttacksStarted = true + InitAttackSquad(Squads.Main, Greece) + InitAttackSquad(Squads.Traitor, Traitor) + InitAirAttackSquad(Squads.Air, Greece) + end +end diff --git a/mods/ca/missions/main-campaign/ca15-ironclad/ironclad-rules.yaml b/mods/ca/missions/main-campaign/ca15-ironclad/ironclad-rules.yaml new file mode 100644 index 0000000000..7c42e7051c --- /dev/null +++ b/mods/ca/missions/main-campaign/ca15-ironclad/ironclad-rules.yaml @@ -0,0 +1,49 @@ +^Palettes: + TintPostProcessEffect: + Red: 0.85 + Green: 0.85 + Blue: 1 + Ambient: 0.9 + WeatherOverlay: + ParticleDensityFactor: 4 + Gravity: 16, 24 + WindTick: 150, 425 + ScatterDirection: -12, 12 + ParticleSize: 2, 3 + ParticleColors: ECECEC44, E4E4E444, D0D0D044, BCBCBC44 + LineTailAlphaValue: 0 + +World: + LuaScript: + Scripts: campaign.lua, ironclad.lua + MissionData: + Briefing: GDI and Allied forces have launched an offensive in an attempt to take control of one of our Iron Curtain devices. Our situation remains precarious, so it is vital that we do not lose any more of our advanced military assets.\n\nThe battle has raged for days and the base in which the Iron Curtain resides has been badly damaged. It is now besieged on all sides and our troops will soon be overrun - or worse - be forced to surrender.\n\nWe have dispatched a team of engineers to restore power. Take command, break the siege, and wipe out all GDI and Allied forces. + MapOptions: + ShortGameCheckboxEnabled: False + MusicPlaylist: + StartingMusic: bigf226m + +Player: + PlayerResources: + DefaultCash: 0 + +IRON: + GrantExternalConditionPowerCA@IRONCURTAIN: + StartFullyCharged: True + +MSLO: + Inherits@CAMPAIGNDISABLED: ^Disabled + +HALO.engis: + Inherits: HALO.paradrop + RevealsShroud: + Range: 8c0 + Type: GroundPosition + +PATR: + Power: + Amount: 0 + +# Hunt() requires only 1 AttackBase +BATF.AI: + -AttackFrontal: diff --git a/mods/ca/missions/main-campaign/ca15-ironclad/ironclad.lua b/mods/ca/missions/main-campaign/ca15-ironclad/ironclad.lua new file mode 100644 index 0000000000..164a1f68b8 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca15-ironclad/ironclad.lua @@ -0,0 +1,245 @@ +MissionDir = "ca|missions/main-campaign/ca15-ironclad" + + +GreeceAttackPaths = { + { AlliedAttackRally.Location, AlliedAttack1a.Location }, + { AlliedAttackRally.Location, AlliedAttack1b.Location }, + { AlliedAttackRally.Location, AlliedAttack1c.Location }, + { AlliedAttackRally.Location, AlliedAttack1c.Location, AlliedAttack2.Location }, +} + +GDIAttackPaths = { + { GDIAttackRally.Location, GDIAttack1a.Location, GDIAttack2a.Location }, + { GDIAttackRally.Location, GDIAttack1b.Location, GDIAttack2b.Location }, +} + +Squads = { + GreeceMain = { + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 20, Max = 36 }), + FollowLeader = true, + Compositions = AdjustCompositionsForDifficulty(UnitCompositions.Allied), + AttackPaths = GreeceAttackPaths, + }, + GDIMain = { + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 20, Max = 36 }), + FollowLeader = true, + Compositions = AdjustCompositionsForDifficulty(UnitCompositions.GDI), + AttackPaths = GDIAttackPaths, + }, + GDIAir = { + Delay = AdjustAirDelayForDifficulty(DateTime.Minutes(13)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 12, Max = 12 }), + ActiveCondition = function() + return not GDIHelipad1.IsDead or not GDIHelipad2.IsDead or not GDIHelipad3.IsDead or not GDIHelipad4.IsDead + end, + Compositions = AirCompositions.GDI, + } +} + +SiegeBreakThreshold = { + easy = 90, + normal = 75, + hard = 65, + vhard = 60, + brutal = 55 +} + +AutoSiegeBreakTime = { + easy = DateTime.Minutes(30), + normal = DateTime.Minutes(20), + hard = DateTime.Minutes(11), + vhard = DateTime.Minutes(10), + brutal = DateTime.Minutes(9) +} + +AutoAttackStartTime = { + easy = DateTime.Minutes(16), + normal = DateTime.Minutes(12), + hard = DateTime.Minutes(10), + vhard = DateTime.Minutes(8), + brutal = DateTime.Minutes(7) +} + +SetupPlayers = function() + USSR = Player.GetPlayer("USSR") + GDI = Player.GetPlayer("GDI") + Greece = Player.GetPlayer("Greece") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = { USSR } + MissionEnemies = { GDI, Greece } +end + +WorldLoaded = function() + SetupPlayers() + + TimerTicks = 0 + SiegeLosses = 0 + SiegeBroken = false + AttacksStarted = false + Camera.Position = PlayerStart.CenterPosition + USSR.PlayLowPowerNotification = false + + InitObjectives(USSR) + InitGDI() + InitGreece() + + if IsVeryHardOrBelow() then + EMPMissile.Destroy() + end + + ObjectiveDestroyBases = USSR.AddObjective("Break the siege and destroy the enemy bases.") + ObjectiveProtectIronCurtain = USSR.AddObjective("Do not lose the Iron Curtain.") + EngineerDrop() + + Trigger.AfterDelay(5, function() + SiegeActors = Map.ActorsInBox(SiegeTopLeft.CenterPosition, SiegeBottomRight.CenterPosition, function(a) + return (a.Owner == Greece or a.Owner == GDI) and a.Type ~= "camera" and a.HasProperty("Move") + end) + + Utils.Do(SiegeActors, function(a) + Trigger.OnKilled(a, function(self, killer) + SiegeLosses = SiegeLosses + 1 + end) + end) + end) + + Trigger.AfterDelay(AutoAttackStartTime[Difficulty], function() + StartAttacks() + end) + + Trigger.OnKilled(IronCurtain, function(self, killer) + USSR.MarkFailedObjective(ObjectiveProtectIronCurtain) + end) + + Trigger.OnSold(IronCurtain, function(self) + USSR.MarkFailedObjective(ObjectiveProtectIronCurtain) + end) + + AfterWorldLoaded() +end + +Tick = function() + OncePerSecondChecks() + OncePerFiveSecondChecks() + OncePerThirtySecondChecks() + AfterTick() +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + GDI.Resources = GDI.ResourceCapacity - 500 + Greece.Resources = Greece.ResourceCapacity - 500 + + if TimerTicks > 0 then + if TimerTicks > 25 then + TimerTicks = TimerTicks - 25 + else + TimerTicks = 0 + end + end + + if not PlayerHasBuildings(GDI) and not PlayerHasBuildings(Greece) then + USSR.MarkCompletedObjective(ObjectiveDestroyBases) + USSR.MarkCompletedObjective(ObjectiveProtectIronCurtain) + end + + if MissionPlayersHaveNoRequiredUnits() then + USSR.MarkFailedObjective(ObjectiveDestroyBases) + end + end + + if SiegeBroken == false and (SiegeLosses >= SiegeBreakThreshold[Difficulty] or DateTime.GameTime > AutoSiegeBreakTime[Difficulty]) then + SiegeBroken = true + + Utils.Do(SiegeActors, function(a) + AssaultPlayerBaseOrHunt(a) + end) + + StartAttacks() + end +end + +OncePerFiveSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 125 == 0 then + UpdatePlayerBaseLocations() + end +end + +OncePerThirtySecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % DateTime.Seconds(30) == 0 then + CalculatePlayerCharacteristics() + end +end + +InitGreece = function() + if Difficulty == "easy" then + RebuildExcludes.Greece = { Types = { "gun", "pbox", "pris" } } + end + + AutoRepairAndRebuildBuildings(Greece, 15) + SetupRefAndSilosCaptureCredits(Greece) + AutoReplaceHarvesters(Greece) + AutoRebuildConyards(Greece) + InitAiUpgrades(Greece) + + local alliedGroundAttackers = Greece.GetGroundAttackers() + + Utils.Do(alliedGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(6656), IsGreeceGroundHunterUnit) + end) +end + +InitGDI = function() + if Difficulty == "easy" then + RebuildExcludes.GDI = { Types = { "gtwr", "atwr" } } + end + + AutoRepairAndRebuildBuildings(GDI, 15) + SetupRefAndSilosCaptureCredits(GDI) + AutoReplaceHarvesters(GDI) + AutoRebuildConyards(GDI) + InitAiUpgrades(GDI) + + local gdiGroundAttackers = GDI.GetGroundAttackers() + + Utils.Do(gdiGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(6656), IsGDIGroundHunterUnit) + end) + + if Difficulty == "brutal" then + Actor.Create("ai.minor.superweapons.enabled", true, { Owner = GDI }) + end +end + +EngineerDrop = function() + local entryPath + entryPath = { EngiDropSpawn.Location, EngiDropLanding.Location } + + local haloDropUnits = { "e6", "e6", "e6", "e6", "e6", "e6", "e6", "e6" } + + Trigger.AfterDelay(DateTime.Seconds(2), function() + Notification("Engineering team inbound.") + MediaCA.PlaySound(MissionDir .. "/r2_engineeringteam.aud", 2) + end) + + DoHelicopterDrop(USSR, entryPath, "halo.engis", haloDropUnits, nil, function(t) + Trigger.AfterDelay(DateTime.Seconds(5), function() + USSR.PlayLowPowerNotification = true + if not t.IsDead then + t.Move(entryPath[1]) + t.Destroy() + end + end) + end) +end + +StartAttacks = function() + if AttacksStarted == false then + AttacksStarted = true + InitAttackSquad(Squads.GreeceMain, Greece) + InitAttackSquad(Squads.GDIMain, GDI) + InitAirAttackSquad(Squads.GDIAir, GDI) + end +end diff --git a/mods/ca/missions/main-campaign/ca15-ironclad/map.bin b/mods/ca/missions/main-campaign/ca15-ironclad/map.bin new file mode 100644 index 0000000000..612c354c48 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca15-ironclad/map.bin differ diff --git a/mods/ca/missions/main-campaign/ca15-ironclad/map.png b/mods/ca/missions/main-campaign/ca15-ironclad/map.png new file mode 100644 index 0000000000..1989871acf Binary files /dev/null and b/mods/ca/missions/main-campaign/ca15-ironclad/map.png differ diff --git a/mods/ca/missions/main-campaign/ca15-ironclad/map.yaml b/mods/ca/missions/main-campaign/ca15-ironclad/map.yaml new file mode 100644 index 0000000000..dc94eab7b8 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca15-ironclad/map.yaml @@ -0,0 +1,3708 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 15: Ironclad + +Author: Darkademic + +Tileset: SNOW + +MapSize: 98,130 + +Bounds: 1,1,96,128 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: USSR, Greece, GDI + PlayerReference@USSR: + Name: USSR + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: soviet + LockColor: True + Color: FE1100 + LockSpawn: True + LockTeam: True + Enemies: Greece, GDI, Creeps + PlayerReference@Greece: + Name: Greece + Bot: campaign + Faction: allies + Color: 99ACF2 + Allies: GDI + Enemies: USSR, Creeps + PlayerReference@GDI: + Name: GDI + Bot: campaign + Faction: gdi + Color: F2CF74 + Allies: Greece + Enemies: USSR, Creeps + +Actors: + IronCurtain: iron + Owner: USSR + Location: 47,64 + Actor1: chain + Owner: USSR + Location: 47,63 + Actor3: chain + Owner: USSR + Location: 46,63 + Actor4: chain + Owner: USSR + Location: 46,64 + Actor5: chain + Owner: USSR + Location: 46,65 + Actor6: chain + Owner: USSR + Location: 47,65 + Actor7: chain + Owner: USSR + Location: 48,65 + Actor8: chain + Owner: USSR + Location: 49,65 + Actor9: chain + Owner: USSR + Location: 49,64 + Actor10: chain + Owner: USSR + Location: 49,63 + Actor11: chain + Owner: USSR + Location: 48,63 + Actor12: fenc + Owner: USSR + Location: 50,65 + Actor13: fenc + Owner: USSR + Location: 50,64 + Actor14: fenc + Owner: USSR + Location: 50,63 + Actor15: fenc + Owner: USSR + Location: 45,63 + Actor16: fenc + Owner: USSR + Location: 45,64 + Actor17: fenc + Owner: USSR + Location: 45,65 + Actor18: sam + Owner: USSR + Location: 47,60 + Health: 72 + Actor19: sam + Owner: USSR + Location: 47,68 + Health: 79 + Actor20: ftur + Owner: USSR + Location: 44,64 + Health: 93 + Actor21: ftur + Owner: USSR + Location: 51,64 + Health: 93 + Actor29: proc + Owner: USSR + Location: 57,62 + Health: 44 + FreeActor: False + FreeActor@CHARV: False + Actor67: brik + Owner: USSR + Location: 44,54 + Actor68: brik + Owner: USSR + Location: 44,55 + Actor69: brik + Owner: USSR + Location: 45,54 + Actor70: brik + Owner: USSR + Location: 46,54 + Health: 64 + Actor71: brik + Owner: USSR + Location: 47,54 + Actor48: brik + Owner: USSR + Location: 30,54 + Actor49: brik + Owner: USSR + Location: 31,54 + Actor50: brik + Owner: USSR + Location: 32,54 + Actor51: brik + Owner: USSR + Location: 33,54 + Actor52: brik + Owner: USSR + Location: 34,54 + Health: 44 + Actor53: brik + Owner: USSR + Location: 35,54 + Actor57: brik + Owner: USSR + Location: 36,54 + Actor58: brik + Owner: USSR + Location: 37,54 + Actor59: brik + Owner: USSR + Location: 38,54 + Actor60: brik + Owner: USSR + Location: 39,54 + Actor61: brik + Owner: USSR + Location: 40,54 + Actor62: brik + Owner: USSR + Location: 30,55 + Actor63: brik + Owner: USSR + Location: 39,55 + Actor64: brik + Owner: USSR + Location: 40,55 + Actor65: brik + Owner: USSR + Location: 30,56 + Health: 75 + Actor66: brik + Owner: USSR + Location: 30,57 + Actor79: brik + Owner: USSR + Location: 30,58 + Health: 64 + Actor80: brik + Owner: USSR + Location: 30,59 + Actor81: brik + Owner: USSR + Location: 30,60 + Health: 34 + Actor83: brik + Owner: USSR + Location: 30,61 + Actor84: brik + Owner: USSR + Location: 30,62 + Actor85: fact + Owner: USSR + Location: 36,62 + Health: 47 + Actor91: brik + Owner: USSR + Location: 45,55 + Actor72: brik + Owner: USSR + Location: 48,54 + Health: 62 + Actor73: brik + Owner: USSR + Location: 49,54 + Actor74: brik + Owner: USSR + Location: 50,54 + Actor75: brik + Owner: USSR + Location: 51,54 + Health: 77 + Actor76: brik + Owner: USSR + Location: 55,54 + Actor77: brik + Owner: USSR + Location: 56,54 + Actor78: brik + Owner: USSR + Location: 57,54 + Actor92: brik + Owner: USSR + Location: 58,54 + Actor93: brik + Owner: USSR + Location: 58,54 + Actor94: brik + Owner: USSR + Location: 59,54 + Actor95: brik + Owner: USSR + Location: 60,54 + Actor96: brik + Owner: USSR + Location: 61,54 + Actor97: brik + Owner: USSR + Location: 62,54 + Actor100: brik + Owner: USSR + Location: 50,55 + Actor101: brik + Owner: USSR + Location: 51,55 + Actor102: brik + Owner: USSR + Location: 55,55 + Health: 35 + Actor103: brik + Owner: USSR + Location: 56,55 + Actor98: brik + Owner: USSR + Location: 63,54 + Actor99: brik + Owner: USSR + Location: 64,54 + Health: 53 + Actor104: brik + Owner: USSR + Location: 65,54 + Health: 33 + Actor105: brik + Owner: USSR + Location: 65,55 + Actor106: brik + Owner: USSR + Location: 65,56 + Health: 70 + Actor107: brik + Owner: USSR + Location: 65,57 + Actor108: brik + Owner: USSR + Location: 65,58 + Actor109: brik + Owner: USSR + Location: 65,59 + Actor110: brik + Owner: USSR + Location: 65,60 + Actor116: brik + Owner: USSR + Location: 31,62 + Actor117: brik + Owner: USSR + Location: 31,61 + Actor118: brik + Owner: USSR + Location: 31,66 + Actor119: brik + Owner: USSR + Location: 30,66 + Health: 31 + Actor120: brik + Owner: USSR + Location: 30,67 + Health: 11 + Actor121: brik + Owner: USSR + Location: 31,67 + Actor88: brik + Owner: USSR + Location: 64,61 + Health: 17 + Actor89: brik + Owner: USSR + Location: 65,61 + Health: 22 + Actor111: brik + Owner: USSR + Location: 64,62 + Actor112: brik + Owner: USSR + Location: 65,62 + Health: 16 + Actor113: brik + Owner: USSR + Location: 64,66 + Actor114: brik + Owner: USSR + Location: 65,66 + Actor115: brik + Owner: USSR + Location: 64,67 + Actor122: brik + Owner: USSR + Location: 65,67 + Actor123: brik + Owner: USSR + Location: 44,74 + Health: 32 + Actor124: brik + Owner: USSR + Location: 45,74 + Actor125: brik + Owner: USSR + Location: 46,74 + Actor126: brik + Owner: USSR + Location: 47,74 + Health: 65 + Actor127: brik + Owner: USSR + Location: 48,74 + Actor128: brik + Owner: USSR + Location: 49,74 + Actor129: brik + Owner: USSR + Location: 50,74 + Actor130: brik + Owner: USSR + Location: 51,74 + Actor131: brik + Owner: USSR + Location: 44,73 + Actor132: brik + Owner: USSR + Location: 45,73 + Actor133: brik + Owner: USSR + Location: 51,73 + Actor134: brik + Owner: USSR + Location: 50,73 + Actor135: brik + Owner: USSR + Location: 39,73 + Actor136: brik + Owner: USSR + Location: 39,74 + Actor138: brik + Owner: USSR + Location: 38,74 + Health: 73 + Actor139: brik + Owner: USSR + Location: 56,73 + Actor140: brik + Owner: USSR + Location: 40,73 + Actor141: brik + Owner: USSR + Location: 40,74 + Actor137: brik + Owner: USSR + Location: 55,73 + Health: 17 + Actor142: brik + Owner: USSR + Location: 55,74 + Actor143: brik + Owner: USSR + Location: 56,74 + Actor144: brik + Owner: USSR + Location: 57,74 + Actor145: brik + Owner: USSR + Location: 65,68 + Health: 73 + Actor146: brik + Owner: USSR + Location: 65,69 + Health: 51 + Actor147: brik + Owner: USSR + Location: 65,70 + Actor148: brik + Owner: USSR + Location: 65,71 + Actor149: brik + Owner: USSR + Location: 65,72 + Actor150: brik + Owner: USSR + Location: 65,73 + Actor151: brik + Owner: USSR + Location: 65,74 + Actor152: brik + Owner: USSR + Location: 58,74 + Actor153: brik + Owner: USSR + Location: 60,74 + Health: 63 + Actor154: brik + Owner: USSR + Location: 59,74 + Actor155: brik + Owner: USSR + Location: 61,74 + Actor156: brik + Owner: USSR + Location: 62,74 + Health: 27 + Actor157: brik + Owner: USSR + Location: 63,74 + Actor158: brik + Owner: USSR + Location: 64,74 + Actor159: brik + Owner: USSR + Location: 30,68 + Health: 22 + Actor160: brik + Owner: USSR + Location: 30,69 + Actor161: brik + Owner: USSR + Location: 30,70 + Actor162: brik + Owner: USSR + Location: 30,71 + Actor163: brik + Owner: USSR + Location: 30,73 + Actor164: brik + Owner: USSR + Location: 30,72 + Actor165: brik + Owner: USSR + Location: 30,74 + Actor166: brik + Owner: USSR + Location: 37,74 + Actor167: brik + Owner: USSR + Location: 36,74 + Health: 61 + Actor168: brik + Owner: USSR + Location: 34,74 + Health: 65 + Actor169: brik + Owner: USSR + Location: 32,74 + Actor170: brik + Owner: USSR + Location: 31,74 + Health: 68 + Actor171: brik + Owner: USSR + Location: 33,74 + Health: 44 + Actor172: brik + Owner: USSR + Location: 35,74 + Actor173: barr + Owner: USSR + Location: 35,68 + Health: 72 + Actor174: dome + Owner: USSR + Location: 59,68 + Health: 61 + Actor175: tsla + Owner: USSR + Location: 46,55 + Health: 44 + Actor176: tsla + Owner: USSR + Location: 49,55 + Actor177: tsla + Owner: USSR + Location: 57,55 + Health: 82 + Actor178: tsla + Owner: USSR + Location: 38,55 + Health: 70 + Actor181: tsla + Owner: USSR + Location: 46,73 + Health: 77 + Actor182: tsla + Owner: USSR + Location: 49,73 + Health: 48 + Actor183: tsla + Owner: USSR + Location: 57,73 + Health: 80 + Actor184: tsla + Owner: USSR + Location: 64,68 + Health: 80 + Actor185: tsla + Owner: USSR + Location: 64,60 + Health: 48 + Actor186: tsla + Owner: USSR + Location: 31,68 + Health: 62 + Actor187: tsla + Owner: USSR + Location: 31,60 + Health: 77 + Actor188: ftur + Owner: USSR + Location: 40,75 + Health: 44 + Actor189: ftur + Owner: USSR + Location: 44,75 + Health: 67 + Actor190: ftur + Owner: USSR + Location: 51,75 + Health: 89 + Actor191: ftur + Owner: USSR + Location: 55,75 + Health: 87 + Actor192: ftur + Owner: USSR + Location: 66,66 + Health: 83 + Actor193: ftur + Owner: USSR + Location: 66,62 + Health: 72 + Actor194: ftur + Owner: USSR + Location: 55,53 + Health: 75 + Actor195: ftur + Owner: USSR + Location: 51,53 + Health: 86 + Actor196: ftur + Owner: USSR + Location: 44,53 + Health: 48 + Actor197: ftur + Owner: USSR + Location: 40,53 + Health: 63 + Actor198: ftur + Owner: USSR + Location: 29,62 + Health: 80 + Actor199: ftur + Owner: USSR + Location: 29,66 + Health: 35 + Actor200: sam + Owner: USSR + Location: 62,56 + Health: 89 + Actor201: sam + Owner: USSR + Location: 32,56 + Health: 85 + Actor203: sam + Owner: USSR + Location: 32,72 + Health: 40 + Actor204: sam + Owner: USSR + Location: 62,72 + Health: 82 + Actor180: tsla + Owner: USSR + Location: 38,73 + Health: 41 + Actor208: brik + Owner: Greece + Location: 34,128 + Actor209: brik + Owner: Greece + Location: 34,127 + Actor210: brik + Owner: Greece + Location: 35,128 + Actor211: brik + Owner: Greece + Location: 34,126 + Actor212: brik + Owner: Greece + Location: 34,124 + Actor213: brik + Owner: Greece + Location: 34,125 + Actor214: brik + Owner: Greece + Location: 34,123 + Actor215: brik + Owner: Greece + Location: 34,122 + Actor216: brik + Owner: Greece + Location: 36,128 + Actor217: brik + Owner: Greece + Location: 37,128 + Actor218: brik + Owner: Greece + Location: 38,128 + Actor219: brik + Owner: Greece + Location: 40,128 + Actor220: brik + Owner: Greece + Location: 39,128 + Actor221: brik + Owner: Greece + Location: 41,128 + Actor222: brik + Owner: Greece + Location: 42,128 + Actor223: brik + Owner: Greece + Location: 43,128 + Actor224: brik + Owner: Greece + Location: 34,121 + Actor225: brik + Owner: Greece + Location: 34,120 + Actor226: brik + Owner: Greece + Location: 34,119 + Actor227: brik + Owner: Greece + Location: 35,119 + Actor228: brik + Owner: Greece + Location: 35,120 + Actor229: fact + Owner: Greece + Location: 35,124 + Actor230: weap + Owner: Greece + Location: 40,116 + Actor231: weap + Owner: Greece + Location: 44,116 + Actor232: apwr + Owner: Greece + Location: 39,125 + Actor233: apwr + Owner: Greece + Location: 42,125 + Actor234: apwr + Owner: Greece + Location: 45,125 + Actor235: apwr + Owner: Greece + Location: 48,125 + Actor237: apwr + Owner: Greece + Location: 39,121 + Actor238: apwr + Owner: Greece + Location: 42,121 + Actor239: apwr + Owner: Greece + Location: 45,121 + Actor240: apwr + Owner: Greece + Location: 48,121 + Actor241: tent + Owner: Greece + Location: 39,112 + AlliedHelipad1: hpad + Owner: Greece + Location: 49,114 + Actor243: fix + Owner: Greece + Location: 52,113 + AlliedHelipad2: hpad + Owner: Greece + Location: 56,114 + Actor245: atek + Owner: Greece + Location: 54,119 + Actor246: dome + Owner: Greece + Location: 54,123 + Actor247: proc + Owner: Greece + Location: 59,114 + Actor248: silo + Owner: Greece + Location: 59,114 + Actor249: silo + Owner: Greece + Location: 61,114 + Actor250: proc + Owner: Greece + Location: 42,111 + Actor251: silo + Owner: Greece + Location: 42,111 + Actor252: silo + Owner: Greece + Location: 44,111 + Actor253: brik + Owner: Greece + Location: 58,128 + Actor254: brik + Owner: Greece + Location: 58,127 + Actor255: brik + Owner: Greece + Location: 56,128 + Actor256: brik + Owner: Greece + Location: 55,128 + Actor257: brik + Owner: Greece + Location: 54,128 + Actor258: brik + Owner: Greece + Location: 53,128 + Actor259: brik + Owner: Greece + Location: 44,128 + Actor260: brik + Owner: Greece + Location: 45,128 + Actor261: brik + Owner: Greece + Location: 46,128 + Actor262: brik + Owner: Greece + Location: 47,128 + Actor263: brik + Owner: Greece + Location: 48,128 + Actor264: brik + Owner: Greece + Location: 49,128 + Actor265: brik + Owner: Greece + Location: 50,128 + Actor266: brik + Owner: Greece + Location: 51,128 + Actor267: brik + Owner: Greece + Location: 52,128 + Actor268: brik + Owner: Greece + Location: 57,128 + Actor269: brik + Owner: Greece + Location: 58,126 + Actor270: brik + Owner: Greece + Location: 58,125 + Actor271: brik + Owner: Greece + Location: 58,124 + Actor272: brik + Owner: Greece + Location: 58,123 + Actor273: brik + Owner: Greece + Location: 58,122 + Actor274: brik + Owner: Greece + Location: 58,121 + Actor275: brik + Owner: Greece + Location: 58,120 + Actor276: brik + Owner: Greece + Location: 59,120 + Actor277: brik + Owner: Greece + Location: 60,120 + Actor278: brik + Owner: Greece + Location: 61,120 + Actor279: brik + Owner: Greece + Location: 62,120 + Actor280: brik + Owner: Greece + Location: 62,119 + Actor281: brik + Owner: Greece + Location: 61,119 + Actor282: brik + Owner: Greece + Location: 66,119 + Actor283: brik + Owner: Greece + Location: 66,120 + Actor284: brik + Owner: Greece + Location: 67,120 + Actor285: brik + Owner: Greece + Location: 67,119 + Actor286: brik + Owner: Greece + Location: 67,118 + Actor287: brik + Owner: Greece + Location: 67,117 + Actor288: brik + Owner: Greece + Location: 67,116 + Actor289: brik + Owner: Greece + Location: 67,115 + Actor290: brik + Owner: Greece + Location: 67,114 + Actor291: brik + Owner: Greece + Location: 67,114 + Actor292: brik + Owner: Greece + Location: 67,113 + Actor293: brik + Owner: Greece + Location: 67,112 + Actor294: brik + Owner: Greece + Location: 67,111 + Actor295: brik + Owner: Greece + Location: 66,111 + Actor296: brik + Owner: Greece + Location: 65,111 + Actor297: brik + Owner: Greece + Location: 64,111 + Actor298: brik + Owner: Greece + Location: 63,111 + Actor299: brik + Owner: Greece + Location: 63,110 + Actor300: brik + Owner: Greece + Location: 62,110 + Actor301: brik + Owner: Greece + Location: 61,110 + Actor302: brik + Owner: Greece + Location: 61,109 + Actor305: brik + Owner: Greece + Location: 59,108 + Actor306: brik + Owner: Greece + Location: 58,108 + Actor307: brik + Owner: Greece + Location: 57,108 + Actor308: brik + Owner: Greece + Location: 61,108 + Actor309: brik + Owner: Greece + Location: 60,108 + Actor303: brik + Owner: Greece + Location: 53,108 + Actor304: brik + Owner: Greece + Location: 54,108 + Actor310: brik + Owner: Greece + Location: 55,108 + Actor311: brik + Owner: Greece + Location: 56,108 + Actor312: brik + Owner: Greece + Location: 52,108 + Actor313: brik + Owner: Greece + Location: 52,109 + Actor314: brik + Owner: Greece + Location: 53,109 + Actor315: brik + Owner: Greece + Location: 47,108 + Actor316: brik + Owner: Greece + Location: 47,109 + Actor317: brik + Owner: Greece + Location: 48,108 + Actor318: brik + Owner: Greece + Location: 48,109 + Actor319: brik + Owner: Greece + Location: 46,108 + Actor320: brik + Owner: Greece + Location: 45,108 + Actor321: brik + Owner: Greece + Location: 44,108 + Actor322: brik + Owner: Greece + Location: 42,108 + Actor323: brik + Owner: Greece + Location: 43,108 + Actor324: brik + Owner: Greece + Location: 41,108 + Actor325: brik + Owner: Greece + Location: 40,108 + Actor326: brik + Owner: Greece + Location: 39,108 + Actor327: brik + Owner: Greece + Location: 37,108 + Actor328: brik + Owner: Greece + Location: 38,108 + Actor329: brik + Owner: Greece + Location: 35,115 + Actor330: brik + Owner: Greece + Location: 34,115 + Actor331: brik + Owner: Greece + Location: 34,114 + Actor332: brik + Owner: Greece + Location: 35,114 + Actor333: brik + Owner: Greece + Location: 34,113 + Actor334: brik + Owner: Greece + Location: 34,112 + Actor335: brik + Owner: Greece + Location: 34,111 + Actor336: brik + Owner: Greece + Location: 34,110 + Actor337: brik + Owner: Greece + Location: 34,109 + Actor338: brik + Owner: Greece + Location: 34,108 + Actor339: brik + Owner: Greece + Location: 35,108 + Actor340: brik + Owner: Greece + Location: 36,108 + Actor341: sbag + Owner: Greece + Location: 54,118 + Actor342: sbag + Owner: Greece + Location: 55,118 + Actor343: sbag + Owner: Greece + Location: 56,118 + Actor344: sbag + Owner: Greece + Location: 56,119 + Actor345: sbag + Owner: Greece + Location: 56,120 + Actor346: sbag + Owner: Greece + Location: 56,121 + Actor347: sbag + Owner: Greece + Location: 53,118 + Actor348: sbag + Owner: Greece + Location: 56,126 + Actor349: sbag + Owner: Greece + Location: 56,125 + Actor350: sbag + Owner: Greece + Location: 56,124 + Actor351: sbag + Owner: Greece + Location: 56,123 + Actor352: sbag + Owner: Greece + Location: 56,122 + Actor353: sbag + Owner: Greece + Location: 55,126 + Actor354: sbag + Owner: Greece + Location: 54,126 + Actor355: sbag + Owner: Greece + Location: 53,126 + Actor356: sbag + Owner: Greece + Location: 64,112 + Actor357: sbag + Owner: Greece + Location: 65,112 + Actor358: sbag + Owner: Greece + Location: 66,112 + Actor359: sbag + Owner: Greece + Location: 66,113 + Actor360: sbag + Owner: Greece + Location: 66,114 + Actor361: sbag + Owner: Greece + Location: 66,115 + Actor362: sbag + Owner: Greece + Location: 40,110 + Actor363: sbag + Owner: Greece + Location: 39,110 + Actor364: sbag + Owner: Greece + Location: 38,110 + Actor365: sbag + Owner: Greece + Location: 37,110 + Actor366: sbag + Owner: Greece + Location: 36,110 + Actor367: sbag + Owner: Greece + Location: 40,111 + Actor368: sbag + Owner: Greece + Location: 41,111 + Actor369: sbag + Owner: Greece + Location: 41,112 + Actor370: sbag + Owner: Greece + Location: 41,113 + Actor371: agun + Owner: Greece + Location: 39,111 + Actor373: agun + Owner: Greece + Location: 65,113 + Actor372: agun + Owner: Greece + Location: 55,122 + Actor374: gap + Owner: Greece + Location: 50,112 + Actor375: gap + Owner: Greece + Location: 52,122 + Actor376: pbox + Owner: Greece + Location: 48,107 + Actor377: pbox + Owner: Greece + Location: 52,107 + Actor378: pbox + Owner: Greece + Location: 62,121 + Actor379: pbox + Owner: Greece + Location: 66,121 + Actor380: pbox + Owner: Greece + Location: 33,115 + Actor381: pbox + Owner: Greece + Location: 33,119 + Actor382: pris + Owner: Greece + Location: 54,109 + Actor383: pris + Owner: Greece + Location: 46,109 + Actor384: pris + Owner: Greece + Location: 35,113 + Actor385: pris + Owner: Greece + Location: 35,121 + Actor386: pris + Owner: Greece + Location: 64,117 + Actor387: tent + Owner: Greece + Location: 58,110 + Actor388: brik + Owner: GDI + Location: 3,32 + Actor389: brik + Owner: GDI + Location: 2,32 + Actor390: brik + Owner: GDI + Location: 1,32 + Actor391: brik + Owner: GDI + Location: 1,31 + Actor392: brik + Owner: GDI + Location: 1,30 + Actor393: brik + Owner: GDI + Location: 1,29 + Actor394: brik + Owner: GDI + Location: 1,28 + Actor395: brik + Owner: GDI + Location: 4,31 + Actor396: brik + Owner: GDI + Location: 4,32 + Actor397: brik + Owner: GDI + Location: 5,31 + Actor398: brik + Owner: GDI + Location: 5,32 + Actor399: brik + Owner: GDI + Location: 9,31 + Actor400: brik + Owner: GDI + Location: 9,32 + Actor401: brik + Owner: GDI + Location: 10,31 + Actor402: brik + Owner: GDI + Location: 10,32 + Actor403: brik + Owner: GDI + Location: 11,32 + Actor404: brik + Owner: GDI + Location: 12,32 + Actor405: brik + Owner: GDI + Location: 13,32 + Actor406: brik + Owner: GDI + Location: 13,31 + Actor407: brik + Owner: GDI + Location: 13,30 + Actor408: brik + Owner: GDI + Location: 13,29 + Actor409: brik + Owner: GDI + Location: 13,28 + Actor410: rep + Owner: GDI + Location: 6,25 + GDIHelipad3: hpad.td + Owner: GDI + Location: 2,27 + GDIHelipad4: hpad.td + Owner: GDI + Location: 11,27 + GDIHelipad2: hpad.td + Owner: GDI + Location: 11,24 + GDIHelipad1: hpad.td + Owner: GDI + Location: 2,24 + Actor415: brik + Owner: GDI + Location: 13,27 + Actor416: brik + Owner: GDI + Location: 13,26 + Actor417: brik + Owner: GDI + Location: 13,25 + Actor418: brik + Owner: GDI + Location: 13,24 + Actor419: brik + Owner: GDI + Location: 13,23 + Actor420: brik + Owner: GDI + Location: 13,22 + Actor421: brik + Owner: GDI + Location: 13,21 + Actor422: brik + Owner: GDI + Location: 12,21 + Actor423: brik + Owner: GDI + Location: 11,21 + Actor424: brik + Owner: GDI + Location: 10,21 + Actor425: brik + Owner: GDI + Location: 9,22 + Actor426: brik + Owner: GDI + Location: 10,22 + Actor427: brik + Owner: GDI + Location: 9,21 + Actor428: brik + Owner: GDI + Location: 1,27 + Actor429: brik + Owner: GDI + Location: 1,26 + Actor430: brik + Owner: GDI + Location: 1,25 + Actor431: brik + Owner: GDI + Location: 1,24 + Actor432: brik + Owner: GDI + Location: 1,23 + Actor433: brik + Owner: GDI + Location: 1,22 + Actor434: brik + Owner: GDI + Location: 1,21 + Actor435: brik + Owner: GDI + Location: 2,21 + Actor436: brik + Owner: GDI + Location: 3,21 + Actor437: brik + Owner: GDI + Location: 4,21 + Actor438: brik + Owner: GDI + Location: 4,22 + Actor440: brik + Owner: GDI + Location: 5,21 + Actor441: brik + Owner: GDI + Location: 5,22 + Actor439: atwr + Owner: GDI + Location: 11,31 + Actor442: atwr + Owner: GDI + Location: 11,22 + Actor443: gtwr + Owner: GDI + Location: 5,33 + Actor444: gtwr + Owner: GDI + Location: 9,33 + Actor445: gtwr + Owner: GDI + Location: 5,20 + Actor446: gtwr + Owner: GDI + Location: 9,20 + Actor447: cram + Owner: GDI + Location: 9,29 + Actor449: nuk2 + Owner: GDI + Location: 71,2 + Actor450: nuk2 + Owner: GDI + Location: 69,2 + Actor451: nuk2 + Owner: GDI + Location: 67,2 + Actor452: nuk2 + Owner: GDI + Location: 65,2 + Actor453: nuk2 + Owner: GDI + Location: 78,2 + Actor455: gtek + Owner: GDI + Location: 69,6 + Actor456: silo.td + Owner: GDI + Location: 66,6 + Actor457: silo.td + Owner: GDI + Location: 66,8 + Actor458: rep + Owner: GDI + Location: 66,10 + Actor460: afld.gdi + Owner: GDI + Location: 61,9 + Actor461: afld.gdi + Owner: GDI + Location: 61,6 + Actor462: weap.td + Owner: GDI + Location: 71,11 + Actor463: pyle + Owner: GDI + Location: 62,13 + Actor464: pyle + Owner: GDI + Location: 76,13 + Actor465: nuk2 + Owner: GDI + Location: 59,2 + Actor466: brik + Owner: GDI + Location: 80,1 + Actor467: brik + Owner: GDI + Location: 59,1 + Actor468: brik + Owner: GDI + Location: 58,1 + Actor469: brik + Owner: GDI + Location: 60,1 + Actor470: brik + Owner: GDI + Location: 61,1 + Actor471: brik + Owner: GDI + Location: 62,1 + Actor472: brik + Owner: GDI + Location: 63,1 + Actor473: brik + Owner: GDI + Location: 64,1 + Actor474: brik + Owner: GDI + Location: 65,1 + Actor475: brik + Owner: GDI + Location: 66,1 + Actor476: brik + Owner: GDI + Location: 67,1 + Actor477: brik + Owner: GDI + Location: 68,1 + Actor478: brik + Owner: GDI + Location: 70,1 + Actor479: brik + Owner: GDI + Location: 69,1 + Actor480: brik + Owner: GDI + Location: 71,1 + Actor481: brik + Owner: GDI + Location: 72,1 + Actor482: brik + Owner: GDI + Location: 73,1 + Actor483: brik + Owner: GDI + Location: 75,1 + Actor484: brik + Owner: GDI + Location: 74,1 + Actor485: brik + Owner: GDI + Location: 76,1 + Actor486: brik + Owner: GDI + Location: 77,1 + Actor487: brik + Owner: GDI + Location: 78,1 + Actor488: brik + Owner: GDI + Location: 79,1 + Actor489: brik + Owner: GDI + Location: 80,2 + Actor490: brik + Owner: GDI + Location: 80,3 + Actor491: brik + Owner: GDI + Location: 80,4 + Actor492: brik + Owner: GDI + Location: 80,5 + Actor493: brik + Owner: GDI + Location: 80,6 + Actor494: brik + Owner: GDI + Location: 80,7 + Actor495: brik + Owner: GDI + Location: 79,7 + Actor497: brik + Owner: GDI + Location: 80,13 + Actor498: brik + Owner: GDI + Location: 79,13 + Actor500: brik + Owner: GDI + Location: 80,14 + Actor501: brik + Owner: GDI + Location: 80,15 + Actor502: brik + Owner: GDI + Location: 80,16 + Actor503: brik + Owner: GDI + Location: 80,17 + Actor504: brik + Owner: GDI + Location: 80,18 + Actor505: brik + Owner: GDI + Location: 78,18 + Actor506: brik + Owner: GDI + Location: 77,18 + Actor507: brik + Owner: GDI + Location: 76,18 + Actor508: brik + Owner: GDI + Location: 75,18 + Actor509: brik + Owner: GDI + Location: 73,18 + Actor510: brik + Owner: GDI + Location: 79,18 + Actor511: brik + Owner: GDI + Location: 74,18 + Actor512: brik + Owner: GDI + Location: 73,17 + Actor513: brik + Owner: GDI + Location: 72,17 + Actor514: brik + Owner: GDI + Location: 72,18 + Actor515: brik + Owner: GDI + Location: 68,18 + Actor516: brik + Owner: GDI + Location: 68,17 + Actor517: brik + Owner: GDI + Location: 67,17 + Actor518: brik + Owner: GDI + Location: 67,18 + Actor519: brik + Owner: GDI + Location: 66,18 + Actor520: brik + Owner: GDI + Location: 65,18 + Actor521: brik + Owner: GDI + Location: 64,18 + Actor522: brik + Owner: GDI + Location: 63,18 + Actor523: brik + Owner: GDI + Location: 62,18 + Actor524: brik + Owner: GDI + Location: 61,18 + Actor525: brik + Owner: GDI + Location: 57,1 + Actor526: brik + Owner: GDI + Location: 56,1 + Actor527: brik + Owner: GDI + Location: 56,2 + Actor528: brik + Owner: GDI + Location: 56,3 + Actor529: brik + Owner: GDI + Location: 56,4 + Actor530: brik + Owner: GDI + Location: 56,5 + Actor531: brik + Owner: GDI + Location: 56,6 + Actor532: brik + Owner: GDI + Location: 56,7 + Actor533: brik + Owner: GDI + Location: 56,8 + Actor534: brik + Owner: GDI + Location: 57,8 + Actor535: brik + Owner: GDI + Location: 57,7 + Actor536: brik + Owner: GDI + Location: 56,12 + Actor537: brik + Owner: GDI + Location: 57,12 + Actor538: brik + Owner: GDI + Location: 56,13 + Actor539: brik + Owner: GDI + Location: 57,13 + Actor540: brik + Owner: GDI + Location: 56,15 + Actor541: brik + Owner: GDI + Location: 56,14 + Actor542: brik + Owner: GDI + Location: 56,16 + Actor543: brik + Owner: GDI + Location: 56,17 + Actor544: brik + Owner: GDI + Location: 56,18 + Actor545: brik + Owner: GDI + Location: 57,18 + Actor546: brik + Owner: GDI + Location: 58,18 + Actor547: brik + Owner: GDI + Location: 59,18 + Actor548: brik + Owner: GDI + Location: 60,18 + Actor549: atwr + Owner: GDI + Location: 66,17 + Actor550: atwr + Owner: GDI + Location: 74,17 + Actor552: atwr + Owner: GDI + Location: 57,14 + Actor553: atwr + Owner: GDI + Location: 57,6 + Actor554: brik + Owner: GDI + Location: 79,8 + Actor555: brik + Owner: GDI + Location: 80,8 + Actor556: brik + Owner: GDI + Location: 79,12 + Actor557: brik + Owner: GDI + Location: 80,12 + Actor558: atwr + Owner: GDI + Location: 79,14 + Actor559: gtwr + Owner: GDI + Location: 68,19 + Actor560: gtwr + Owner: GDI + Location: 72,19 + Actor561: gtwr + Owner: GDI + Location: 81,12 + Actor563: gtwr + Owner: GDI + Location: 55,8 + Actor564: gtwr + Owner: GDI + Location: 55,12 + Actor565: split2 + Owner: Neutral + Location: 88,5 + Actor566: split2 + Owner: Neutral + Location: 85,11 + Actor568: split2 + Owner: Neutral + Location: 93,9 + Actor569: split2 + Owner: Neutral + Location: 89,15 + Actor567: split2 + Owner: Neutral + Location: 64,124 + Actor570: split2 + Owner: Neutral + Location: 72,125 + Actor571: split2 + Owner: Neutral + Location: 72,117 + Actor572: split2 + Owner: Neutral + Location: 82,56 + Actor573: split2 + Owner: Neutral + Location: 91,58 + Actor574: split2 + Owner: Neutral + Location: 86,62 + Actor575: split2 + Owner: Neutral + Location: 83,69 + Actor576: split2 + Owner: Neutral + Location: 9,63 + Actor577: split2 + Owner: Neutral + Location: 7,72 + Actor578: apc.ai + Owner: Greece + Location: 41,83 + Facing: 0 + Actor580: apc.ai + Owner: Greece + Location: 56,83 + Facing: 0 + Actor582: arty + Owner: Greece + Location: 18,68 + Facing: 769 + Actor583: arty + Owner: Greece + Location: 18,62 + Facing: 761 + Actor584: arty + Owner: Greece + Location: 37,85 + Facing: 0 + Actor585: arty + Owner: Greece + Location: 49,85 + Facing: 0 + Actor586: arty + Owner: Greece + Location: 58,84 + Facing: 0 + Actor594: 2tnk + Owner: Greece + Location: 63,82 + Facing: 0 + Actor589: 2tnk + Owner: Greece + Facing: 0 + Location: 54,82 + Actor588: 2tnk + Owner: Greece + Facing: 0 + Location: 52,82 + Actor591: 2tnk + Owner: Greece + Facing: 0 + Location: 43,82 + Actor590: 2tnk + Owner: Greece + Facing: 0 + Location: 39,82 + Actor593: 2tnk + Owner: Greece + Facing: 0 + Location: 32,82 + Actor595: 2tnk + Owner: Greece + Facing: 768 + Location: 20,66 + Actor596: 2tnk + Owner: Greece + Facing: 768 + Location: 20,61 + AlliedSiegeUnit3: ptnk + Owner: Greece + Location: 41,85 + Facing: 0 + AlliedSiegeUnit1: ptnk + Owner: Greece + Location: 18,60 + Facing: 768 + AlliedSiegeUnit2: ptnk + Owner: Greece + Location: 18,66 + Facing: 768 + AlliedSiegeUnit4: ptnk + Owner: Greece + Facing: 0 + Location: 53,85 + AlliedSiegeUnit5: ptnk + Owner: Greece + Facing: 0 + Location: 63,84 + GDISiegeUnit4: htnk + Owner: GDI + Location: 59,47 + Facing: 512 + GDISiegeUnit6: htnk + Owner: GDI + Location: 74,65 + Facing: 256 + GDISiegeUnit3: htnk + Owner: GDI + Location: 53,46 + Facing: 512 + GDISiegeUnit5: htnk + Owner: GDI + Location: 74,60 + Facing: 256 + Actor609: mtnk + Owner: GDI + Location: 74,58 + Facing: 256 + Actor613: mtnk + Owner: GDI + Location: 32,47 + Facing: 512 + Actor614: mtnk + Owner: GDI + Facing: 256 + Location: 74,67 + Actor610: mtnk + Owner: GDI + Facing: 512 + Location: 56,46 + Actor615: mtnk + Owner: GDI + Facing: 512 + Location: 64,47 + Actor624: vulc.ai + Owner: GDI + Location: 28,48 + Facing: 512 + Actor626: vulc.ai + Owner: GDI + Location: 75,56 + Facing: 256 + Actor625: vulc.ai + Owner: GDI + Facing: 512 + Location: 59,45 + Actor621: msam + Owner: GDI + Facing: 256 + Location: 77,61 + Actor627: weap + Owner: USSR + Location: 35,57 + Health: 46 + Actor629: 4tnk + Owner: USSR + Location: 57,67 + Health: 19 + Facing: 769 + Actor628: fix + Owner: USSR + Location: 58,57 + Health: 38 + Actor634: apwr + Owner: USSR + Location: 53,68 + Health: 32 + Actor635: apwr + Owner: USSR + Location: 53,65 + Health: 24 + Actor636: apwr + Owner: USSR + Location: 53,62 + Health: 29 + Actor637: apwr + Owner: USSR + Location: 53,59 + Health: 17 + Actor630: apwr + Owner: USSR + Location: 40,59 + Health: 31 + Actor631: apwr + Owner: USSR + Location: 40,62 + Health: 12 + Actor632: apwr + Owner: USSR + Location: 40,65 + Health: 18 + Actor633: apwr + Owner: USSR + Location: 40,68 + Health: 37 + Actor638: shok + Owner: USSR + SubCell: 3 + Location: 38,71 + Facing: 384 + Health: 65 + Actor639: shok + Owner: USSR + SubCell: 3 + Location: 34,66 + Facing: 384 + Health: 51 + Actor640: shok + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 51,58 + Actor641: shok + Owner: USSR + SubCell: 3 + Location: 62,58 + Facing: 384 + Health: 71 + Actor642: e1 + Owner: USSR + SubCell: 3 + Location: 60,62 + Facing: 384 + Health: 82 + Actor643: e1 + Owner: USSR + SubCell: 3 + Location: 61,67 + Facing: 384 + Health: 75 + Actor644: e1 + Owner: USSR + Facing: 384 + Location: 61,67 + SubCell: 1 + Actor645: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 49,59 + Actor646: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 39,57 + Actor647: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 34,63 + Actor648: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 34,62 + Actor649: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 36,72 + Actor650: e1 + Owner: USSR + Location: 34,70 + SubCell: 3 + Facing: 384 + Health: 87 + Actor651: e1 + Owner: USSR + SubCell: 3 + Location: 39,67 + Facing: 384 + Health: 75 + Actor652: e1 + Owner: USSR + Facing: 384 + Location: 39,67 + SubCell: 1 + Actor653: v2rl + Owner: USSR + Location: 45,58 + Facing: 190 + Health: 37 + Actor654: 3tnk + Owner: USSR + Location: 44,69 + Facing: 384 + Health: 72 + Actor655: 3tnk + Owner: USSR + Location: 51,71 + Facing: 618 + Health: 37 + Actor656: btr + Owner: USSR + Location: 61,60 + Facing: 618 + Health: 27 + Actor657: btr + Owner: USSR + Location: 34,61 + Facing: 253 + Health: 65 + PlayerStart: waypoint + Owner: Neutral + Location: 47,64 + Actor658: ifv + Owner: Greece + Location: 35,83 + Facing: 0 + Actor659: ifv + Owner: Greece + Location: 16,62 + Facing: 768 + Actor661: ifv + Owner: Greece + Facing: 0 + Location: 61,85 + Actor662: ifv + Owner: Greece + Facing: 768 + Location: 17,65 + EngiDropLanding: waypoint + Owner: Neutral + Location: 57,69 + Actor663: t10 + Owner: Neutral + Location: 23,56 + Actor664: t11 + Owner: Neutral + Location: 19,51 + Actor665: t03 + Owner: Neutral + Location: 10,52 + Actor666: t06 + Owner: Neutral + Location: 7,47 + Actor667: t01 + Owner: Neutral + Location: 14,46 + Actor668: t10 + Owner: Neutral + Location: 14,38 + Actor669: t02 + Owner: Neutral + Location: 2,38 + Actor670: tc04 + Owner: Neutral + Location: 24,37 + Actor671: tc05 + Owner: Neutral + Location: 18,31 + Actor672: t03 + Owner: Neutral + Location: 22,36 + Actor673: t06 + Owner: Neutral + Location: 1,60 + Actor674: t13 + Owner: Neutral + Location: 66,49 + Actor675: t11 + Owner: Neutral + Location: 76,50 + Actor676: t14 + Owner: Neutral + Location: 72,76 + Actor677: tc01 + Owner: Neutral + Location: 67,79 + Actor678: tc05 + Owner: Neutral + Location: 27,80 + Actor679: t16 + Owner: Neutral + Location: 24,83 + Actor680: t11 + Owner: Neutral + Location: 17,77 + Actor681: t05 + Owner: Neutral + Location: 61,41 + Actor682: t06 + Owner: Neutral + Location: 46,37 + Actor683: t14 + Owner: Neutral + Location: 56,35 + Actor684: t06 + Owner: Neutral + Location: 61,28 + Actor685: t17 + Owner: Neutral + Location: 62,27 + Actor686: t01 + Owner: Neutral + Location: 67,29 + Actor687: t11 + Owner: Neutral + Location: 71,30 + Actor688: t13 + Owner: Neutral + Location: 29,13 + Actor689: tc01 + Owner: Neutral + Location: 31,13 + Actor690: t05 + Owner: Neutral + Location: 32,11 + Actor691: t06 + Owner: Neutral + Location: 35,6 + Actor692: t01 + Owner: Neutral + Location: 18,8 + Actor693: t12 + Owner: Neutral + Location: 15,11 + Actor694: tc02 + Owner: Neutral + Location: 8,12 + Actor695: tc04 + Owner: Neutral + Location: 41,3 + Actor696: t13 + Owner: Neutral + Location: 47,4 + Actor697: t06 + Owner: Neutral + Location: 54,2 + Actor698: ice02 + Owner: Neutral + Location: 39,26 + Actor699: ice04 + Owner: Neutral + Location: 34,29 + Actor700: ice03 + Owner: Neutral + Location: 33,25 + Actor701: ice05 + Owner: Neutral + Location: 40,27 + Actor702: t17 + Owner: Neutral + Location: 40,30 + Actor703: tc03 + Owner: Neutral + Location: 45,26 + Actor704: t14 + Owner: Neutral + Location: 44,24 + Actor705: t11 + Owner: Neutral + Location: 26,20 + Actor706: v02 + Owner: Neutral + Location: 28,20 + Actor707: v03 + Owner: Neutral + Location: 25,10 + Actor708: v01 + Owner: Neutral + Location: 10,10 + Actor709: v05 + Owner: Neutral + Location: 36,10 + Actor710: v07 + Owner: Neutral + Location: 21,14 + Actor711: v10 + Owner: Neutral + Location: 21,7 + Actor712: v04 + Owner: Neutral + Location: 41,8 + Actor713: v09 + Owner: Neutral + Location: 15,9 + Actor714: v11 + Owner: Neutral + Location: 46,8 + Actor715: v08 + Owner: Neutral + Location: 35,16 + Actor716: tc05 + Owner: Neutral + Location: 94,126 + Actor717: tc01 + Owner: Neutral + Location: 95,124 + Actor718: tc03 + Owner: Neutral + Location: 92,127 + Actor719: t17 + Owner: Neutral + Location: 90,127 + Actor720: t17 + Owner: Neutral + Location: 90,127 + Actor721: t13 + Owner: Neutral + Location: 95,122 + Actor722: tc04 + Owner: Neutral + Location: 92,124 + Actor723: tc02 + Owner: Neutral + Location: 93,122 + Actor724: t05 + Owner: Neutral + Location: 93,123 + Actor725: t01 + Owner: Neutral + Location: 96,120 + Actor726: t03 + Owner: Neutral + Location: 91,126 + Actor727: t15 + Owner: Neutral + Location: 95,118 + Actor728: t13 + Owner: Neutral + Location: 88,127 + Actor729: t05 + Owner: Neutral + Location: 89,126 + Actor730: t06 + Owner: Neutral + Location: 90,124 + Actor731: t01 + Owner: Neutral + Location: 86,127 + Actor732: t02 + Owner: Neutral + Location: 88,125 + Actor733: tc01 + Owner: Neutral + Location: 89,121 + Actor734: t03 + Owner: Neutral + Location: 90,120 + Actor735: t12 + Owner: Neutral + Location: 89,124 + Actor736: t10 + Owner: Neutral + Location: 88,120 + Actor737: t07 + Owner: Neutral + Location: 89,118 + Actor738: t05 + Owner: Neutral + Location: 93,116 + Actor739: t08 + Owner: Neutral + Location: 86,125 + Actor740: t02 + Owner: Neutral + Location: 93,111 + Actor741: t11 + Owner: Neutral + Location: 86,111 + Actor742: t07 + Owner: Neutral + Location: 77,113 + Actor743: t01 + Owner: Neutral + Location: 83,103 + Actor744: tc04.husk + Owner: Neutral + Location: 83,76 + Actor745: t16.husk + Owner: Neutral + Location: 89,82 + Actor746: tc01.husk + Owner: Neutral + Location: 82,88 + Actor747: tc05.husk + Owner: Neutral + Location: 87,47 + Actor748: tc05.husk + Owner: Neutral + Location: 5,83 + Actor749: tc03.husk + Owner: Neutral + Location: 17,107 + Actor750: t02.husk + Owner: Neutral + Location: 65,91 + Actor751: v03 + Owner: Neutral + Location: 92,88 + Actor752: hosp + Owner: Neutral + Location: 91,82 + Actor753: tc01 + Owner: Neutral + Location: 58,93 + Actor754: ice01 + Owner: Neutral + Location: 84,96 + Actor755: ice02 + Owner: Neutral + Location: 86,97 + Actor756: ice04 + Owner: Neutral + Location: 86,95 + Actor757: ice03 + Owner: Neutral + Location: 84,92 + Actor758: tc05 + Owner: Neutral + Location: 94,101 + Actor759: tc04 + Owner: Neutral + Location: 92,109 + Actor760: sbag + Owner: Greece + Location: 29,86 + Actor761: sbag + Owner: Greece + Location: 30,86 + Actor762: sbag + Owner: Greece + Location: 31,86 + Actor763: sbag + Owner: Greece + Location: 32,86 + Actor764: sbag + Owner: Greece + Location: 33,86 + Actor765: sbag + Owner: Greece + Location: 33,87 + Actor766: sbag + Owner: Greece + Location: 39,89 + Actor767: sbag + Owner: Greece + Location: 40,89 + Actor768: sbag + Owner: Greece + Location: 41,89 + Actor769: sbag + Owner: Greece + Location: 42,89 + Actor770: sbag + Owner: Greece + Location: 43,89 + Actor771: sbag + Owner: Greece + Location: 43,90 + Actor772: sbag + Owner: Greece + Location: 39,90 + Actor773: hbox + Owner: Greece + Location: 40,88 + Actor774: hbox + Owner: Greece + Location: 31,85 + Actor777: e1 + Owner: Greece + SubCell: 3 + Location: 29,85 + Facing: 872 + Actor778: e1 + Owner: Greece + Location: 29,85 + SubCell: 1 + Facing: 872 + Actor787: cryo + Owner: Greece + Location: 31,87 + Facing: 943 + Actor788: cryo + Owner: Greece + Location: 41,90 + Facing: 0 + Actor789: split2 + Owner: Neutral + Location: 14,98 + Actor790: split2 + Owner: Neutral + Location: 10,92 + Actor791: split2 + Owner: Neutral + Location: 84,35 + Actor792: split2 + Owner: Neutral + Location: 90,34 + Actor793: split2 + Owner: Neutral + Location: 22,24 + Actor794: split2 + Owner: Neutral + Location: 25,28 + Actor795: tc03 + Owner: Neutral + Location: 61,106 + Actor796: t14 + Owner: Neutral + Location: 63,103 + Actor797: tc05 + Owner: Neutral + Location: 64,101 + Actor798: tc03 + Owner: Neutral + Location: 67,99 + Actor799: t17 + Owner: Neutral + Location: 68,100 + Actor800: t14 + Owner: Neutral + Location: 65,100 + Actor801: t11 + Owner: Neutral + Location: 69,96 + Actor802: t13 + Owner: Neutral + Location: 71,103 + Actor803: t07 + Owner: Neutral + Location: 71,99 + Actor804: t06 + Owner: Neutral + Location: 61,99 + Actor805: t08 + Owner: Neutral + Location: 66,105 + Actor806: t10 + Owner: Neutral + Location: 68,106 + Actor807: tc01 + Owner: Neutral + Location: 59,106 + Actor808: t02 + Owner: Neutral + Location: 62,108 + Actor809: tc04 + Owner: Neutral + Location: 64,108 + Actor810: t08 + Owner: Neutral + Location: 63,109 + Actor811: t15 + Owner: Neutral + Location: 62,107 + Actor812: t06 + Owner: Neutral + Location: 37,100 + Actor813: t08 + Owner: Neutral + Location: 35,100 + Actor814: t05 + Owner: Neutral + Location: 39,97 + Actor815: proc.td + Owner: GDI + Location: 75,7 + Actor816: mech + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 30,88 + Actor817: mech + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 41,91 + Actor818: hmmv + Owner: GDI + Facing: 384 + Location: 67,47 + Actor819: hmmv + Owner: GDI + Location: 25,49 + Facing: 658 + Actor822: jeep + Owner: Greece + Location: 19,56 + Facing: 650 + Actor823: hmmv + Owner: GDI + Location: 74,70 + Facing: 142 + Actor824: 2tnk + Owner: Greece + Location: 54,106 + Facing: 0 + Actor825: 2tnk + Owner: Greece + Location: 69,113 + Facing: 919 + Actor826: 2tnk + Owner: Greece + Location: 32,113 + Facing: 128 + Actor827: 2tnk + Owner: Greece + Facing: 128 + Location: 30,120 + Actor829: 2tnk + Owner: Greece + Facing: 0 + Location: 46,106 + Actor828: arty + Owner: Greece + Location: 35,109 + Facing: 128 + Actor830: arty + Owner: Greece + Location: 60,109 + Facing: 0 + Actor831: cryo + Owner: Greece + Location: 43,109 + Facing: 103 + Actor832: cryo + Owner: Greece + Location: 62,111 + Facing: 0 + Actor833: ptnk + Owner: Greece + Location: 32,120 + Facing: 126 + Actor834: apc.ai + Owner: Greece + Location: 57,105 + Facing: 79 + Actor835: 1tnk + Owner: Greece + Location: 30,116 + Facing: 111 + Actor837: apc.ai + Owner: Greece + Location: 46,113 + Facing: 880 + Actor836: jeep + Owner: Greece + Facing: 384 + Location: 69,100 + Actor838: jeep + Owner: Greece + Location: 24,101 + Facing: 911 + Actor841: 1tnk + Owner: Greece + Location: 94,93 + Facing: 0 + Actor839: 1tnk + Owner: Greece + Facing: 0 + Location: 93,95 + Actor840: mrj + Owner: Greece + Facing: 384 + Location: 55,109 + Actor842: ifv + Owner: Greece + Facing: 384 + Location: 51,118 + Actor843: ifv + Owner: Greece + Location: 65,104 + Facing: 245 + Actor846: e1 + Owner: Greece + SubCell: 3 + Location: 28,117 + Facing: 15 + Actor847: e1 + Owner: Greece + Location: 28,117 + SubCell: 1 + Facing: 103 + Actor850: e1 + Owner: Greece + SubCell: 3 + Location: 47,106 + Facing: 0 + Actor851: e1 + Owner: Greece + SubCell: 3 + Location: 49,104 + Facing: 0 + Actor862: e1 + Owner: Greece + SubCell: 3 + Location: 62,118 + Facing: 547 + Actor863: e1 + Owner: Greece + SubCell: 3 + Location: 64,119 + Facing: 586 + Actor864: e1 + Owner: Greece + Facing: 384 + Location: 65,118 + SubCell: 3 + Actor865: e1 + Owner: Greece + Location: 63,119 + SubCell: 3 + Facing: 547 + Actor866: e1 + Owner: Greece + Facing: 384 + Location: 63,119 + SubCell: 1 + Actor868: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 53,117 + Actor871: e1 + Owner: Greece + Location: 57,118 + SubCell: 3 + Facing: 666 + Actor872: e1 + Owner: Greece + Facing: 384 + Location: 38,114 + SubCell: 3 + Actor873: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 37,112 + Actor877: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 52,125 + Actor878: e3 + Owner: Greece + Facing: 384 + Location: 63,119 + SubCell: 2 + Actor879: e3 + Owner: Greece + SubCell: 3 + Location: 74,111 + Facing: 0 + Actor880: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 68,104 + Actor881: e3 + Owner: Greece + Facing: 384 + Location: 82,103 + SubCell: 3 + Actor882: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 92,112 + Actor883: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 58,95 + Actor884: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 49,94 + Actor885: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 39,100 + Actor888: e3 + Owner: Greece + SubCell: 3 + Location: 16,67 + Facing: 808 + Actor889: e3 + Owner: Greece + SubCell: 3 + Location: 18,59 + Facing: 705 + Actor891: e1 + Owner: Greece + SubCell: 3 + Location: 19,65 + Facing: 737 + Actor896: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 8,86 + Actor897: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 95,92 + Actor898: htnk + Owner: GDI + Location: 74,20 + Facing: 512 + Actor899: htnk + Owner: GDI + Location: 66,20 + Facing: 512 + Actor900: msam + Owner: GDI + Facing: 512 + Location: 63,17 + Actor901: msam + Owner: GDI + Facing: 512 + Location: 57,17 + Actor902: msam + Owner: GDI + Facing: 512 + Location: 79,17 + Actor903: mtnk + Owner: GDI + Facing: 512 + Location: 54,17 + Actor904: mtnk + Owner: GDI + Location: 51,8 + Facing: 404 + Actor905: vulc.ai + Owner: GDI + Facing: 512 + Location: 59,14 + Actor906: vulc.ai + Owner: GDI + Facing: 512 + Location: 67,15 + Actor908: vulc.ai + Owner: GDI + Location: 77,21 + Facing: 512 + Actor909: htnk.ion + Owner: GDI + Location: 6,35 + Facing: 634 + Actor910: mtnk + Owner: GDI + Location: 11,34 + Facing: 634 + Actor911: vulc + Owner: GDI + Location: 5,24 + Facing: 515 + Actor912: msam + Owner: GDI + Location: 5,30 + Facing: 626 + Actor913: n1 + Owner: GDI + SubCell: 3 + Location: 34,47 + Facing: 499 + Actor914: n1 + Owner: GDI + SubCell: 3 + Location: 30,47 + Facing: 658 + Actor915: n1 + Owner: GDI + SubCell: 3 + Location: 39,45 + Facing: 610 + Actor917: n1 + Owner: GDI + SubCell: 3 + Location: 45,45 + Facing: 531 + Actor921: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 54,45 + Actor922: n1 + Owner: GDI + Facing: 384 + Location: 54,44 + SubCell: 3 + Actor923: n1 + Owner: GDI + Facing: 384 + Location: 58,46 + SubCell: 3 + Actor924: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 62,47 + Actor925: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 68,48 + Actor926: n1 + Owner: GDI + SubCell: 3 + Location: 67,19 + Facing: 531 + Actor927: n1 + Owner: GDI + Facing: 384 + Location: 67,19 + SubCell: 1 + Actor928: n1 + Owner: GDI + SubCell: 3 + Location: 70,18 + Facing: 555 + Actor929: n1 + Owner: GDI + Location: 69,17 + SubCell: 3 + Facing: 547 + Actor930: n1 + Owner: GDI + Location: 72,16 + SubCell: 3 + Facing: 523 + Actor931: n1 + Owner: GDI + SubCell: 3 + Location: 77,20 + Facing: 563 + Actor932: n1 + Owner: GDI + Location: 77,20 + SubCell: 1 + Facing: 547 + Actor933: n1 + Owner: GDI + SubCell: 3 + Location: 75,19 + Facing: 547 + Actor935: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 54,18 + Actor936: n1 + Owner: GDI + Facing: 384 + Location: 54,18 + SubCell: 1 + Actor937: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 52,16 + Actor938: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 54,14 + Actor939: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 52,12 + Actor940: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 51,7 + Actor941: n1 + Owner: GDI + Facing: 384 + Location: 51,7 + SubCell: 1 + Actor942: n2 + Owner: GDI + SubCell: 3 + Location: 76,17 + Facing: 618 + Actor943: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 64,14 + Actor944: n2 + Owner: GDI + SubCell: 3 + Location: 60,14 + Facing: 618 + Actor945: n2 + Owner: GDI + SubCell: 3 + Location: 64,20 + Facing: 384 + Actor946: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 67,43 + Actor947: n2 + Owner: GDI + Facing: 384 + Location: 68,48 + SubCell: 1 + Actor948: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 63,45 + Actor949: n2 + Owner: GDI + Location: 41,46 + SubCell: 3 + Facing: 483 + Actor950: n2 + Owner: GDI + SubCell: 3 + Location: 74,57 + Facing: 269 + Actor951: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 76,60 + Actor952: n2 + Owner: GDI + SubCell: 3 + Location: 75,69 + Facing: 309 + Actor953: n1 + Owner: GDI + SubCell: 3 + Location: 76,64 + Facing: 309 + Actor955: n1 + Owner: GDI + SubCell: 3 + Location: 74,54 + Facing: 253 + Actor956: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 72,37 + Actor957: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 74,38 + Actor958: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 70,35 + Actor959: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 75,36 + Actor960: n3 + Owner: GDI + SubCell: 3 + Facing: 384 + Location: 74,37 + Actor961: n3 + Owner: GDI + Facing: 384 + Location: 74,37 + SubCell: 1 + Actor962: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 52,45 + Actor963: n3 + Owner: GDI + Facing: 384 + Location: 65,47 + SubCell: 3 + Actor964: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 68,46 + Actor965: n3 + Owner: GDI + Location: 32,46 + SubCell: 3 + Facing: 531 + Actor967: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 77,62 + Actor968: n3 + Owner: GDI + SubCell: 3 + Location: 75,57 + Facing: 384 + Actor971: e1 + Owner: Greece + SubCell: 3 + Location: 42,84 + Facing: 943 + Actor972: vulc.ai + Owner: GDI + Facing: 512 + Location: 52,43 + Actor981: mtnk + Owner: GDI + Facing: 512 + Location: 42,43 + Actor982: n1 + Owner: GDI + Location: 11,33 + SubCell: 3 + Facing: 650 + Actor983: n1 + Owner: GDI + Facing: 384 + Location: 11,33 + SubCell: 1 + Actor984: n1 + Owner: GDI + SubCell: 3 + Location: 13,34 + Facing: 547 + Actor985: n1 + Owner: GDI + SubCell: 3 + Location: 3,35 + Facing: 658 + Actor986: n1 + Owner: GDI + SubCell: 3 + Location: 7,30 + Facing: 507 + Actor987: n1 + Owner: GDI + SubCell: 3 + Location: 11,20 + Facing: 824 + Actor988: n1 + Owner: GDI + SubCell: 3 + Location: 7,19 + Facing: 864 + Actor989: n1 + Owner: GDI + SubCell: 3 + Location: 4,18 + Facing: 0 + Actor990: n1 + Owner: GDI + SubCell: 3 + Location: 4,19 + Facing: 0 + Actor991: n1 + Owner: GDI + SubCell: 3 + Location: 15,26 + Facing: 634 + Actor992: 3tnk + Owner: USSR + Location: 55,57 + Facing: 618 + Health: 43 + Actor993: dog + Owner: USSR + SubCell: 3 + Location: 61,64 + Facing: 594 + Actor994: kenn + Owner: USSR + Location: 38,68 + Health: 45 + Actor995: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 44,107 + Actor996: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 56,107 + Actor997: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 54,105 + Actor998: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 59,105 + Actor999: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 67,103 + Actor1000: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 69,102 + Actor1001: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 70,101 + Actor1002: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 72,110 + Actor1003: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 68,109 + Actor1004: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 69,112 + Actor1007: e3 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 29,119 + Actor1008: e3 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 24,112 + Actor1009: e3 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 37,109 + Actor1010: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 31,114 + Actor1011: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 31,121 + Actor1012: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 50,118 + Actor1013: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 54,112 + Actor1014: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 46,112 + Actor970: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 38,82 + Actor969: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 33,84 + Actor1015: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 34,88 + Actor1016: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 38,89 + Actor1017: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 39,88 + Actor1018: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 43,88 + Actor973: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 50,84 + Actor974: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 54,84 + Actor975: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 57,82 + Actor976: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 59,84 + Actor977: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 64,85 + Actor1005: e3 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 57,109 + Actor1019: e3 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 28,86 + Actor1020: e3 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 34,87 + Actor980: e3 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 39,84 + Actor978: e3 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 63,86 + Actor979: e3 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 49,87 + Actor1021: e3 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 43,91 + Actor1022: e1 + Owner: Greece + SubCell: 3 + Facing: 737 + Location: 17,61 + Actor1023: e1 + Owner: Greece + SubCell: 3 + Facing: 737 + Location: 20,55 + Actor1024: e1 + Owner: Greece + SubCell: 3 + Facing: 737 + Location: 19,72 + Actor1025: e1 + Owner: Greece + SubCell: 3 + Facing: 737 + Location: 19,69 + Actor1026: e1 + Owner: Greece + SubCell: 3 + Location: 21,73 + Facing: 737 + SiegeTopLeft: waypoint + Owner: Neutral + Location: 16,43 + SiegeBottomRight: waypoint + Owner: Neutral + Location: 78,90 + Actor1029: camera + Owner: Greece + Location: 32,64 + Actor1030: camera + Owner: GDI + Location: 42,56 + Actor1031: camera + Owner: GDI + Location: 53,56 + Actor1032: camera + Owner: GDI + Location: 63,64 + Actor1033: camera + Owner: Greece + Location: 42,72 + Actor1034: camera + Owner: Greece + Location: 53,72 + GDIAttackRally: waypoint + Owner: Neutral + Location: 70,23 + GDIAttack1a: waypoint + Owner: Neutral + Location: 73,44 + GDIAttack1b: waypoint + Owner: Neutral + Location: 38,38 + GDIAttack2b: waypoint + Owner: Neutral + Location: 42,49 + Actor954: n1 + Owner: GDI + SubCell: 3 + Location: 74,63 + Facing: 206 + GDIAttack2a: waypoint + Owner: Neutral + Location: 71,64 + AlliedAttackRally: waypoint + Owner: Neutral + Location: 50,100 + AlliedAttack1a: waypoint + Owner: Neutral + Location: 72,85 + AlliedAttack1b: waypoint + Owner: Neutral + Location: 47,82 + AlliedAttack1c: waypoint + Owner: Neutral + Location: 18,82 + AlliedAttack2: waypoint + Owner: Neutral + Location: 21,68 + Actor1027: msam + Owner: GDI + Facing: 512 + Location: 33,44 + Actor1035: n1 + Owner: GDI + SubCell: 3 + Location: 34,45 + Facing: 602 + Actor1036: n3 + Owner: GDI + SubCell: 3 + Facing: 384 + Location: 76,59 + Actor966: n2 + Owner: GDI + SubCell: 3 + Facing: 309 + Location: 74,68 + Actor1037: msam + Owner: GDI + Facing: 256 + Location: 77,64 + Actor1039: mtnk + Owner: GDI + Facing: 384 + Location: 87,29 + Actor1040: hmmv + Owner: GDI + Location: 85,28 + Facing: 253 + Actor1041: jeep + Owner: Greece + Facing: 904 + Location: 27,84 + Actor1042: jeep + Owner: Greece + Location: 6,87 + Facing: 618 + Actor1043: hmmv + Owner: GDI + Location: 5,47 + Facing: 384 + Actor1044: n1 + Owner: GDI + SubCell: 3 + Facing: 384 + Location: 6,48 + Actor1045: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 12,44 + Actor1046: n1 + Owner: GDI + SubCell: 3 + Location: 4,50 + Facing: 705 + Actor1047: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 15,48 + Actor1048: e1 + Owner: Greece + SubCell: 3 + Facing: 384 + Location: 4,85 + Actor1049: e3 + Owner: Greece + SubCell: 3 + Location: 16,90 + Facing: 848 + Actor1050: vulc.ai + Owner: GDI + Location: 70,9 + Facing: 512 + Actor1051: brik + Owner: GDI + Location: 80,19 + Actor1052: brik + Owner: GDI + Location: 80,20 + Actor1053: brik + Owner: GDI + Location: 81,20 + Actor1054: brik + Owner: GDI + Location: 82,20 + Actor1055: brik + Owner: GDI + Location: 83,20 + Actor1056: brik + Owner: GDI + Location: 83,19 + Actor1057: brik + Owner: GDI + Location: 82,19 + Actor1058: brik + Owner: GDI + Location: 87,19 + Actor1059: brik + Owner: GDI + Location: 87,20 + Actor1060: brik + Owner: GDI + Location: 88,19 + Actor1061: brik + Owner: GDI + Location: 88,20 + Actor1062: brik + Owner: GDI + Location: 89,20 + Actor1063: brik + Owner: GDI + Location: 90,20 + Actor1064: brik + Owner: GDI + Location: 91,20 + Actor1065: brik + Owner: GDI + Location: 92,20 + Actor1066: brik + Owner: GDI + Location: 93,20 + Actor1067: brik + Owner: GDI + Location: 94,20 + Actor1068: brik + Owner: GDI + Location: 95,20 + Actor1069: brik + Owner: GDI + Location: 96,20 + Actor1070: brik + Owner: GDI + Location: 96,19 + Actor1071: brik + Owner: GDI + Location: 96,18 + Actor1072: brik + Owner: GDI + Location: 96,17 + Actor1073: brik + Owner: GDI + Location: 96,16 + Actor1074: brik + Owner: GDI + Location: 96,14 + Actor1075: brik + Owner: GDI + Location: 96,15 + Actor1076: brik + Owner: GDI + Location: 96,13 + Actor1077: brik + Owner: GDI + Location: 96,12 + Actor1078: brik + Owner: GDI + Location: 96,11 + Actor1079: brik + Owner: GDI + Location: 96,10 + Actor1080: brik + Owner: GDI + Location: 96,9 + Actor1081: brik + Owner: GDI + Location: 96,8 + Actor1082: brik + Owner: GDI + Location: 96,7 + Actor1083: brik + Owner: GDI + Location: 96,6 + Actor1084: brik + Owner: GDI + Location: 96,5 + Actor1085: brik + Owner: GDI + Location: 96,4 + Actor1086: brik + Owner: GDI + Location: 81,1 + Actor1087: brik + Owner: GDI + Location: 82,1 + Actor1088: brik + Owner: GDI + Location: 83,1 + Actor1089: brik + Owner: GDI + Location: 84,1 + Actor1090: brik + Owner: GDI + Location: 85,1 + Actor1091: brik + Owner: GDI + Location: 86,1 + Actor1092: brik + Owner: GDI + Location: 87,1 + Actor1093: brik + Owner: GDI + Location: 88,1 + Actor1094: brik + Owner: GDI + Location: 89,1 + Actor1095: brik + Owner: GDI + Location: 90,1 + Actor1096: brik + Owner: GDI + Location: 91,1 + Actor1097: brik + Owner: GDI + Location: 92,1 + Actor1098: brik + Owner: GDI + Location: 93,1 + Actor1099: brik + Owner: GDI + Location: 94,1 + Actor1100: brik + Owner: GDI + Location: 95,1 + Actor1101: brik + Owner: GDI + Location: 96,1 + Actor1102: brik + Owner: GDI + Location: 96,2 + Actor1103: brik + Owner: GDI + Location: 96,3 + Actor1104: atwr + Owner: GDI + Location: 81,19 + Actor1105: gtwr + Owner: GDI + Location: 83,21 + Actor1106: gtwr + Owner: GDI + Location: 87,21 + Actor1107: afac + Owner: GDI + Location: 73,2 + Actor1108: nuk2 + Owner: GDI + Location: 76,2 + Actor1109: hq + Owner: GDI + Location: 61,2 + Actor1110: nuk2 + Owner: GDI + Location: 63,2 + Actor1111: cram + Owner: GDI + Location: 89,19 + Actor1112: cram + Owner: GDI + Location: 79,6 + Actor1113: cram + Owner: GDI + Location: 59,16 + Actor1114: cram + Owner: GDI + Location: 59,6 + Actor1115: nuk2 + Owner: GDI + Location: 57,2 + Actor1116: arty + Owner: Greece + Facing: 0 + Location: 64,86 + Actor1038: jeep + Owner: Greece + Facing: 118 + Location: 67,82 + Actor1117: e3 + Owner: Greece + SubCell: 3 + Location: 18,74 + Facing: 666 + Actor1118: 2tnk + Owner: Greece + Facing: 768 + Location: 20,73 + Actor1119: apc.ai + Owner: Greece + Facing: 761 + Location: 20,71 + Actor1121: chpr + Owner: Greece + Facing: 253 + Location: 38,116 + Actor1120: pcan + Owner: Greece + Facing: 0 + Location: 55,117 + Actor1122: msam + Owner: GDI + Facing: 512 + Location: 64,44 + Actor1125: msam + Owner: GDI + Facing: 512 + Location: 58,42 + Actor1123: msam + Owner: GDI + Facing: 512 + Location: 39,42 + Actor1124: mtnk + Owner: GDI + Facing: 512 + Location: 40,46 + GDISiegeUnit1: htnk + Owner: GDI + Location: 37,46 + Facing: 512 + GDISiegeUnit2: htnk + Owner: GDI + Location: 44,45 + Facing: 512 + Actor1126: n1 + Owner: GDI + SubCell: 3 + Facing: 563 + Location: 46,46 + Actor1127: n1 + Owner: GDI + SubCell: 3 + Facing: 563 + Location: 40,43 + Actor1128: n1 + Owner: GDI + SubCell: 3 + Facing: 563 + Location: 36,45 + EngiDropSpawn: waypoint + Owner: Neutral + Location: 96,84 + Actor1130: camera + Owner: Greece + Location: 23,59 + Actor1131: camera + Owner: Greece + Location: 22,72 + Actor1132: camera + Owner: GDI + Location: 72,57 + Actor1133: camera + Owner: GDI + Location: 72,69 + EMPMissile: patr + Owner: GDI + Location: 2,21 + TurretFacing: 192 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-doctrines.yaml, ironclad-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/main-campaign/ca15-ironclad/r2_engineeringteam.aud b/mods/ca/missions/main-campaign/ca15-ironclad/r2_engineeringteam.aud new file mode 100644 index 0000000000..aff4166c02 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca15-ironclad/r2_engineeringteam.aud differ diff --git a/mods/ca/missions/main-campaign/ca15-ironclad/r_engineeringteam.aud b/mods/ca/missions/main-campaign/ca15-ironclad/r_engineeringteam.aud new file mode 100644 index 0000000000..c5e60e8eb2 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca15-ironclad/r_engineeringteam.aud differ diff --git a/mods/ca/missions/main-campaign/ca16-expulsion/expulsion-rules.yaml b/mods/ca/missions/main-campaign/ca16-expulsion/expulsion-rules.yaml new file mode 100644 index 0000000000..20f93cec58 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca16-expulsion/expulsion-rules.yaml @@ -0,0 +1,28 @@ +^Palettes: + TintPostProcessEffect: + Red: 0.85 + Green: 0.85 + Blue: 1 + Ambient: 0.85 + WeatherOverlay: + ParticleDensityFactor: 4 + Gravity: 16, 24 + WindTick: 150, 425 + ScatterDirection: -12, 12 + ParticleSize: 2, 3 + ParticleColors: ECECEC44, E4E4E444, D0D0D044, BCBCBC44 + LineTailAlphaValue: 0 + +World: + LuaScript: + Scripts: campaign.lua, expulsion.lua + MissionData: + Briefing: Allied and GDI forces are on the retreat. We must seize the initiative and take back our territory before they have a chance to stabilize and regroup.\n\nGDI have been holding an area of great strategic importance that provides access to a region rich in both oil and Tiberium from which we are currently cut off.\n\nWe need these resources to rebuild our severely weakened forces. Remove the GDI presence and take back what is rightfully ours. + MapOptions: + ShortGameCheckboxEnabled: False + MusicPlaylist: + StartingMusic: hell226m + +Player: + PlayerResources: + DefaultCash: 6000 diff --git a/mods/ca/missions/main-campaign/ca16-expulsion/expulsion.lua b/mods/ca/missions/main-campaign/ca16-expulsion/expulsion.lua new file mode 100644 index 0000000000..47f8875696 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca16-expulsion/expulsion.lua @@ -0,0 +1,184 @@ +MissionDir = "ca|missions/main-campaign/ca16-expulsion" + +GDIMainAttackPaths = { + { GDIRallyAlpha.Location, GDIAttack1.Location, GDIAttack2.Location, GDIAttack3.Location, GDIAttack4.Location, GDIAttack5.Location, GDIAttack6.Location }, + { GDIRallyAlpha.Location, GDIAttack7.Location, GDIAttack4.Location, GDIAttack5.Location, GDIAttack6.Location }, + { GDIRallyAlpha.Location, GDIAttack7.Location, GDIAttack4.Location, GDIAttack8.Location, GDIAttack9.Location, GDIAttack6.Location }, + { GDIRallyBravo.Location, GDIAttack10.Location, GDIAttack8.Location, GDIAttack9.Location, GDIAttack6.Location }, + { GDIRallyBravo.Location, GDIAttack10.Location, GDIAttack11.Location, GDIAttack12.Location, GDIAttack9.Location, GDIAttack6.Location }, +} + +GDISouthAttackPaths = { + { GDIAttack2.Location, GDIAttack3.Location, GDIAttack4.Location, GDIAttack5.Location, GDIAttack6.Location }, +} + +GDINorthEastAttackPaths = { + { GDIAttack10.Location, GDIAttack8.Location, GDIAttack9.Location, GDIAttack6.Location }, + { GDIAttack11.Location, GDIAttack12.Location, GDIAttack9.Location, GDIAttack6.Location }, +} + +EmpMissileEnabledTime = { + normal = DateTime.Minutes(20), + hard = DateTime.Minutes(10), + vhard = DateTime.Minutes(10), + brutal = DateTime.Minutes(10) +} + +Squads = { + GDIMain = { + Delay = AdjustDelayForDifficulty(DateTime.Seconds(210)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 24, Max = 48 }), + FollowLeader = true, + ProducerActors = { Infantry = { GDIMainBarracks }, Vehicles = { GDIFactory } }, + Compositions = AdjustCompositionsForDifficulty(UnitCompositions.GDI), + AttackPaths = GDIMainAttackPaths, + }, + GDISouth = { + Delay = AdjustDelayForDifficulty(DateTime.Minutes(8)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 8, Max = 16 }), + FollowLeader = true, + ProducerActors = { Infantry = { GDISouthBarracks } }, + Compositions = { + easy = { { Infantry = { "n3", "n1", "n1", "n1", "n2" } } } , + normal = { { Infantry = { "n3", "n1", "n1", "n1", "n3", "n2" } } }, + hard = { { Infantry = { "n3", "n1", "n1", "n1", "n3", "n2", "n1", "n1" } } }, + vhard = { { Infantry = { "n3", "n1", "n1", "n1", "n3", "n2", ZoneTrooperVariant } } }, + brutal = { { Infantry = { "n3", "n1", "n1", "n1", "n3", "n2", "n1", ZoneTrooperVariant, ZoneTrooperVariant } } }, + }, + AttackPaths = GDISouthAttackPaths, + }, + GDINorthEast = { + Delay = AdjustDelayForDifficulty(DateTime.Minutes(8)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 8, Max = 16 }), + FollowLeader = true, + ProducerActors = { Infantry = { GDINorthEastBarracks } }, + Compositions = { + easy = { { Infantry = { "n3", "n1", "n1", "n1", "n2" } } }, + normal = { { Infantry = { "n3", "n1", "n1", "n1", "n3", "n2" } } }, + hard = { { Infantry = { "n3", "n1", "n1", "n1", "n3", "n2", "n1", "n1" } } }, + vhard = { { Infantry = { "n3", "n1", "n1", "n1", "n3", "n2", ZoneTrooperVariant } } }, + brutal = { { Infantry = { "n3", "n1", "n1", "n1", "n3", "n2", "n1", ZoneTrooperVariant, ZoneTrooperVariant } } }, + }, + AttackPaths = GDINorthEastAttackPaths, + }, + GDIAir = { + Delay = AdjustAirDelayForDifficulty(DateTime.Minutes(13)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 10, Max = 10 }), + Compositions = AirCompositions.GDI, + } +} + +SetupPlayers = function() + USSR = Player.GetPlayer("USSR") + GDI = Player.GetPlayer("GDI") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = { USSR } + MissionEnemies = { GDI } +end + +WorldLoaded = function() + SetupPlayers() + + TimerTicks = 0 + McvArrived = false + Camera.Position = McvRally.CenterPosition + + InitObjectives(USSR) + AdjustPlayerStartingCashForDifficulty() + InitGDI() + + ObjectiveExpelGDI = USSR.AddObjective("Remove the GDI presence.") + + if Difficulty == "easy" then + BattleTank1.Destroy() + BattleTank2.Destroy() + end + + local initialAttackers = { InitialAttacker1, InitialAttacker2, InitialAttacker3, InitialAttacker4, InitialAttacker5, InitialAttacker6 } + + Trigger.AfterDelay(DateTime.Seconds(8), function() + PlaySpeechNotificationToMissionPlayers("ReinforcementsArrived") + Notification("Reinforcements have arrived.") + DoMcvArrival() + McvArrived = true + + Utils.Do(initialAttackers, function(a) + if not a.IsDead then + a.Hunt() + end + end) + end) + + AfterWorldLoaded() +end + +Tick = function() + OncePerSecondChecks() + OncePerFiveSecondChecks() + OncePerThirtySecondChecks() + AfterTick() +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + GDI.Resources = GDI.ResourceCapacity - 500 + + if TimerTicks > 0 then + if TimerTicks > 25 then + TimerTicks = TimerTicks - 25 + else + TimerTicks = 0 + end + end + + if not PlayerHasBuildings(GDI) then + USSR.MarkCompletedObjective(ObjectiveExpelGDI) + end + + if MissionPlayersHaveNoRequiredUnits() then + USSR.MarkFailedObjective(ObjectiveExpelGDI) + end + end +end + +OncePerFiveSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 125 == 0 then + UpdatePlayerBaseLocations() + end +end + +OncePerThirtySecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % DateTime.Seconds(30) == 0 then + CalculatePlayerCharacteristics() + end +end + +InitGDI = function() + AutoRepairAndRebuildBuildings(GDI, 15) + SetupRefAndSilosCaptureCredits(GDI) + AutoReplaceHarvesters(GDI) + AutoRebuildConyards(GDI) + InitAiUpgrades(GDI) + InitAttackSquad(Squads.GDIMain, GDI) + InitAttackSquad(Squads.GDISouth, GDI) + InitAttackSquad(Squads.GDINorthEast, GDI) + InitAirAttackSquad(Squads.GDIAir, GDI) + + local gdiGroundAttackers = GDI.GetGroundAttackers() + + Utils.Do(gdiGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsGDIGroundHunterUnit) + end) + + if Difficulty ~= "easy" then + Trigger.AfterDelay(EmpMissileEnabledTime[Difficulty], function() + Actor.Create("ai.minor.superweapons.enabled", true, { Owner = GDI }) + end) + end +end + +-- overridden in co-op version +DoMcvArrival = function() + Reinforcements.Reinforce(USSR, { "mcv" }, { McvSpawn.Location, McvRally.Location }, 75) +end \ No newline at end of file diff --git a/mods/ca/missions/main-campaign/ca16-expulsion/map.bin b/mods/ca/missions/main-campaign/ca16-expulsion/map.bin new file mode 100644 index 0000000000..1da5122299 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca16-expulsion/map.bin differ diff --git a/mods/ca/missions/main-campaign/ca16-expulsion/map.png b/mods/ca/missions/main-campaign/ca16-expulsion/map.png new file mode 100644 index 0000000000..1ae8ebd816 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca16-expulsion/map.png differ diff --git a/mods/ca/missions/main-campaign/ca16-expulsion/map.yaml b/mods/ca/missions/main-campaign/ca16-expulsion/map.yaml new file mode 100644 index 0000000000..21a34323b9 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca16-expulsion/map.yaml @@ -0,0 +1,2297 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 16: Expulsion + +Author: Darkademic + +Tileset: SNOW + +MapSize: 114,98 + +Bounds: 1,1,112,96 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: USSR, GDI + PlayerReference@USSR: + Name: USSR + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: soviet + LockColor: True + Color: FE1100 + LockSpawn: True + LockTeam: True + Enemies: GDI, Creeps + PlayerReference@GDI: + Name: GDI + Bot: campaign + Faction: gdi + Color: F2CF74 + Enemies: USSR, Creeps + +Actors: + Actor1: 4tnk + Owner: USSR + Location: 106,84 + Facing: 128 + Actor2: 4tnk + Owner: USSR + Facing: 128 + Location: 101,88 + Actor3: e1 + Owner: USSR + SubCell: 3 + Location: 102,87 + Facing: 128 + Actor4: e1 + Owner: USSR + Location: 102,87 + SubCell: 1 + Facing: 128 + Actor5: e1 + Owner: USSR + Location: 102,87 + SubCell: 2 + Facing: 128 + Actor9: e2 + Owner: USSR + SubCell: 3 + Location: 100,89 + Facing: 128 + Actor10: e2 + Owner: USSR + SubCell: 3 + Location: 106,82 + Facing: 128 + Actor7: e1 + Owner: USSR + SubCell: 3 + Facing: 128 + Location: 104,83 + Actor8: e1 + Owner: USSR + SubCell: 1 + Facing: 128 + Location: 104,83 + Actor11: e1 + Owner: USSR + SubCell: 2 + Facing: 128 + Location: 104,83 + McvSpawn: waypoint + Owner: Neutral + Location: 111,96 + McvRally: waypoint + Owner: Neutral + Location: 104,87 + InitialAttacker1: mtnk + Owner: GDI + Location: 89,85 + Facing: 768 + InitialAttacker6: n1 + Owner: GDI + SubCell: 3 + Location: 89,89 + Facing: 785 + InitialAttacker3: n1 + Owner: GDI + SubCell: 3 + Location: 91,82 + Facing: 737 + InitialAttacker2: apc2.gdiai + Owner: GDI + Location: 86,83 + Facing: 768 + InitialAttacker4: n1 + Owner: GDI + SubCell: 3 + Location: 91,87 + Facing: 737 + InitialAttacker5: e3 + Owner: GDI + SubCell: 3 + Location: 90,87 + Facing: 768 + Actor19: oilb + Owner: Neutral + Location: 100,76 + Actor20: t16 + Owner: Neutral + Location: 111,79 + Actor21: t01 + Owner: Neutral + Location: 93,79 + Actor22: t10 + Owner: Neutral + Location: 98,91 + Actor23: ice01 + Owner: Neutral + Location: 103,94 + Actor24: ice02 + Owner: Neutral + Location: 88,77 + Actor25: ice03 + Owner: Neutral + Location: 99,70 + Actor26: ice04 + Owner: Neutral + Location: 110,75 + Actor27: t12 + Owner: Neutral + Location: 76,91 + Actor28: oilb + Location: 72,57 + Faction: Random + Owner: GDI + Actor29: oilb + Owner: Neutral + Location: 107,4 + Actor30: brik + Owner: GDI + Location: 23,96 + Actor31: brik + Owner: GDI + Location: 22,96 + Actor32: brik + Owner: GDI + Location: 21,96 + Actor33: brik + Owner: GDI + Location: 23,95 + Actor34: brik + Owner: GDI + Location: 23,93 + Actor35: brik + Owner: GDI + Location: 23,94 + Actor36: brik + Owner: GDI + Location: 23,92 + Actor37: brik + Owner: GDI + Location: 23,91 + Actor38: brik + Owner: GDI + Location: 23,90 + Actor39: brik + Owner: GDI + Location: 23,89 + Actor40: brik + Owner: GDI + Location: 23,88 + Actor41: brik + Owner: GDI + Location: 23,87 + Actor42: brik + Owner: GDI + Location: 23,86 + Actor43: brik + Owner: GDI + Location: 23,85 + Actor44: brik + Owner: GDI + Location: 23,84 + Actor45: brik + Owner: GDI + Location: 23,83 + Actor46: brik + Owner: GDI + Location: 23,82 + Actor47: brik + Owner: GDI + Location: 23,81 + Actor48: brik + Owner: GDI + Location: 22,81 + Actor49: brik + Owner: GDI + Location: 21,81 + Actor50: brik + Owner: GDI + Location: 20,81 + Actor51: brik + Owner: GDI + Location: 19,81 + Actor52: brik + Owner: GDI + Location: 18,81 + Actor53: brik + Owner: GDI + Location: 17,81 + Actor54: brik + Owner: GDI + Location: 17,82 + Actor55: brik + Owner: GDI + Location: 18,82 + Actor56: brik + Owner: GDI + Location: 13,81 + Actor57: brik + Owner: GDI + Location: 13,82 + Actor58: brik + Owner: GDI + Location: 12,81 + Actor59: brik + Owner: GDI + Location: 12,82 + Actor60: brik + Owner: GDI + Location: 11,81 + Actor61: brik + Owner: GDI + Location: 10,81 + Actor62: brik + Owner: GDI + Location: 9,81 + Actor63: brik + Owner: GDI + Location: 8,81 + Actor64: brik + Owner: GDI + Location: 7,81 + Actor65: brik + Owner: GDI + Location: 6,81 + Actor66: brik + Owner: GDI + Location: 6,82 + Actor67: brik + Owner: GDI + Location: 7,82 + Actor68: brik + Owner: GDI + Location: 6,83 + Actor69: brik + Owner: GDI + Location: 6,84 + Actor70: brik + Owner: GDI + Location: 6,85 + Actor71: brik + Owner: GDI + Location: 6,86 + Actor72: brik + Owner: GDI + Location: 6,87 + Actor73: brik + Owner: GDI + Location: 7,87 + Actor74: brik + Owner: GDI + Location: 7,86 + Actor75: brik + Owner: GDI + Location: 6,91 + Actor76: brik + Owner: GDI + Location: 7,91 + Actor77: brik + Owner: GDI + Location: 7,92 + Actor78: brik + Owner: GDI + Location: 6,92 + Actor79: brik + Owner: GDI + Location: 6,93 + Actor80: brik + Owner: GDI + Location: 6,94 + Actor81: brik + Owner: GDI + Location: 6,95 + Actor82: brik + Owner: GDI + Location: 6,96 + Actor83: brik + Owner: GDI + Location: 7,96 + Actor84: brik + Owner: GDI + Location: 8,96 + Actor85: brik + Owner: GDI + Location: 9,96 + Actor86: brik + Owner: GDI + Location: 10,96 + Actor87: brik + Owner: GDI + Location: 11,96 + Actor88: brik + Owner: GDI + Location: 12,96 + Actor89: brik + Owner: GDI + Location: 13,96 + Actor90: brik + Owner: GDI + Location: 14,96 + Actor91: brik + Owner: GDI + Location: 15,96 + Actor92: brik + Owner: GDI + Location: 16,96 + Actor93: brik + Owner: GDI + Location: 17,96 + Actor94: brik + Owner: GDI + Location: 19,96 + Actor95: brik + Owner: GDI + Location: 18,96 + Actor96: brik + Owner: GDI + Location: 20,96 + Actor103: rep + Owner: GDI + Location: 18,88 + Actor104: atwr + Owner: GDI + Location: 19,82 + Actor105: atwr + Owner: GDI + Location: 11,82 + Actor106: gtwr + Owner: GDI + Location: 17,80 + Actor107: gtwr + Owner: GDI + Location: 13,80 + Actor111: cram + Owner: GDI + Location: 22,82 + Actor114: silo.td + Owner: GDI + Location: 20,85 + Actor115: silo.td + Owner: GDI + Location: 17,85 + Actor116: brik + Owner: GDI + Location: 15,1 + Actor117: brik + Owner: GDI + Location: 15,2 + Actor118: brik + Owner: GDI + Location: 16,1 + Actor119: brik + Owner: GDI + Location: 17,1 + Actor120: brik + Owner: GDI + Location: 18,1 + Actor121: brik + Owner: GDI + Location: 15,3 + Actor122: brik + Owner: GDI + Location: 15,4 + Actor123: brik + Owner: GDI + Location: 15,5 + Actor124: brik + Owner: GDI + Location: 16,5 + Actor125: brik + Owner: GDI + Location: 16,5 + Actor126: brik + Owner: GDI + Location: 16,4 + Actor127: brik + Owner: GDI + Location: 15,9 + Actor128: brik + Owner: GDI + Location: 16,9 + Actor129: brik + Owner: GDI + Location: 15,10 + Actor130: brik + Owner: GDI + Location: 16,10 + Actor131: brik + Owner: GDI + Location: 15,11 + Actor132: brik + Owner: GDI + Location: 15,12 + Actor133: brik + Owner: GDI + Location: 15,13 + Actor134: brik + Owner: GDI + Location: 15,14 + Actor135: brik + Owner: GDI + Location: 15,14 + Actor136: brik + Owner: GDI + Location: 15,15 + Actor137: brik + Owner: GDI + Location: 15,16 + Actor138: brik + Owner: GDI + Location: 17,16 + Actor139: brik + Owner: GDI + Location: 16,16 + Actor140: brik + Owner: GDI + Location: 18,16 + Actor141: brik + Owner: GDI + Location: 19,16 + Actor142: brik + Owner: GDI + Location: 20,16 + Actor143: brik + Owner: GDI + Location: 21,16 + Actor144: brik + Owner: GDI + Location: 22,16 + Actor145: brik + Owner: GDI + Location: 24,16 + Actor146: brik + Owner: GDI + Location: 23,16 + Actor147: brik + Owner: GDI + Location: 24,15 + Actor148: brik + Owner: GDI + Location: 23,15 + Actor149: brik + Owner: GDI + Location: 28,15 + Actor150: brik + Owner: GDI + Location: 28,16 + Actor151: brik + Owner: GDI + Location: 29,15 + Actor152: brik + Owner: GDI + Location: 29,16 + Actor153: brik + Owner: GDI + Location: 30,16 + Actor154: brik + Owner: GDI + Location: 32,16 + Actor155: brik + Owner: GDI + Location: 31,16 + Actor156: brik + Owner: GDI + Location: 33,16 + Actor157: brik + Owner: GDI + Location: 34,16 + Actor158: brik + Owner: GDI + Location: 35,16 + Actor159: brik + Owner: GDI + Location: 36,16 + Actor160: brik + Owner: GDI + Location: 37,16 + Actor161: brik + Owner: GDI + Location: 38,16 + Actor162: brik + Owner: GDI + Location: 38,15 + Actor163: brik + Owner: GDI + Location: 38,14 + Actor164: brik + Owner: GDI + Location: 38,13 + Actor165: brik + Owner: GDI + Location: 38,12 + Actor166: brik + Owner: GDI + Location: 38,11 + Actor167: brik + Owner: GDI + Location: 37,10 + Actor168: brik + Owner: GDI + Location: 38,10 + Actor169: brik + Owner: GDI + Location: 37,9 + Actor170: brik + Owner: GDI + Location: 38,9 + Actor171: brik + Owner: GDI + Location: 37,5 + Actor172: brik + Owner: GDI + Location: 37,4 + Actor173: brik + Owner: GDI + Location: 38,4 + Actor174: brik + Owner: GDI + Location: 38,5 + Actor175: brik + Owner: GDI + Location: 38,3 + Actor176: brik + Owner: GDI + Location: 38,2 + Actor177: brik + Owner: GDI + Location: 38,1 + Actor178: brik + Owner: GDI + Location: 19,1 + Actor179: brik + Owner: GDI + Location: 21,1 + Actor180: brik + Owner: GDI + Location: 20,1 + Actor181: brik + Owner: GDI + Location: 23,1 + Actor182: brik + Owner: GDI + Location: 22,1 + Actor183: brik + Owner: GDI + Location: 25,1 + Actor184: brik + Owner: GDI + Location: 24,1 + Actor185: brik + Owner: GDI + Location: 26,1 + Actor186: brik + Owner: GDI + Location: 27,1 + Actor187: brik + Owner: GDI + Location: 28,1 + Actor188: brik + Owner: GDI + Location: 30,1 + Actor189: brik + Owner: GDI + Location: 29,1 + Actor190: brik + Owner: GDI + Location: 31,1 + Actor191: brik + Owner: GDI + Location: 32,1 + Actor192: brik + Owner: GDI + Location: 33,1 + Actor193: brik + Owner: GDI + Location: 35,1 + Actor194: brik + Owner: GDI + Location: 34,1 + Actor195: brik + Owner: GDI + Location: 36,1 + Actor196: brik + Owner: GDI + Location: 37,1 + GDIFactory: weap.td + Owner: GDI + Location: 22,10 + Actor198: afac + Owner: GDI + Location: 22,2 + Actor199: nuk2 + Owner: GDI + Location: 26,2 + Actor200: nuk2 + Owner: GDI + Location: 28,2 + Actor201: nuk2 + Owner: GDI + Location: 30,2 + Actor202: nuk2 + Owner: GDI + Location: 32,2 + Actor203: nuk2 + Owner: GDI + Location: 34,2 + Actor204: hq + Owner: GDI + Location: 35,12 + GDIMainBarracks: pyle + Owner: GDI + Location: 27,10 + Actor206: gtek + Owner: GDI + Location: 27,6 + Actor207: proc.td + Owner: GDI + Location: 18,2 + GDIAirfield2: afld.gdi + Owner: GDI + Location: 32,9 + GDIAirfield1: afld.gdi + Owner: GDI + Location: 32,6 + Actor212: atwr + Owner: GDI + Location: 22,15 + Actor213: atwr + Owner: GDI + Location: 30,15 + Actor214: atwr + Owner: GDI + Location: 37,11 + Actor215: atwr + Owner: GDI + Location: 37,3 + Actor216: atwr + Owner: GDI + Location: 16,3 + Actor217: atwr + Owner: GDI + Location: 16,11 + Actor218: gtwr + Owner: GDI + Location: 39,9 + Actor219: gtwr + Owner: GDI + Location: 39,5 + Actor220: gtwr + Owner: GDI + Location: 28,17 + Actor221: gtwr + Owner: GDI + Location: 24,17 + Actor222: cram + Owner: GDI + Location: 37,15 + Actor224: cram + Owner: GDI + Location: 33,13 + Actor225: silo.td + Owner: GDI + Location: 18,11 + Actor226: silo.td + Owner: GDI + Location: 18,9 + Actor227: split2 + Owner: Neutral + Location: 5,8 + Actor228: split2 + Owner: Neutral + Location: 5,8 + Actor229: split2 + Owner: Neutral + Location: 10,13 + Actor230: split2 + Owner: Neutral + Location: 9,4 + Actor231: sbag + Owner: GDI + Location: 87,12 + Actor232: sbag + Owner: GDI + Location: 86,12 + Actor233: sbag + Owner: GDI + Location: 86,13 + Actor234: sbag + Owner: GDI + Location: 86,14 + Actor235: sbag + Owner: GDI + Location: 86,15 + Actor236: sbag + Owner: GDI + Location: 86,19 + Actor237: sbag + Owner: GDI + Location: 86,20 + Actor238: sbag + Owner: GDI + Location: 86,21 + Actor239: sbag + Owner: GDI + Location: 86,22 + Actor240: sbag + Owner: GDI + Location: 87,22 + Actor241: sbag + Owner: GDI + Location: 88,22 + Actor242: sbag + Owner: GDI + Location: 90,22 + Actor243: sbag + Owner: GDI + Location: 89,22 + Actor244: sbag + Owner: GDI + Location: 91,22 + Actor245: sbag + Owner: GDI + Location: 92,22 + Actor246: sbag + Owner: GDI + Location: 92,21 + Actor247: sbag + Owner: GDI + Location: 94,21 + Actor248: sbag + Owner: GDI + Location: 93,21 + Actor249: sbag + Owner: GDI + Location: 95,21 + Actor250: sbag + Owner: GDI + Location: 96,21 + Actor251: sbag + Owner: GDI + Location: 96,20 + Actor252: sbag + Owner: GDI + Location: 97,20 + Actor253: sbag + Owner: GDI + Location: 98,20 + Actor254: sbag + Owner: GDI + Location: 99,20 + Actor255: sbag + Owner: GDI + Location: 99,19 + Actor256: sbag + Owner: GDI + Location: 99,15 + Actor257: sbag + Owner: GDI + Location: 99,14 + Actor258: sbag + Owner: GDI + Location: 99,13 + Actor259: sbag + Owner: GDI + Location: 99,12 + Actor260: sbag + Owner: GDI + Location: 98,12 + Actor261: sbag + Owner: GDI + Location: 88,12 + Actor262: sbag + Owner: GDI + Location: 89,12 + Actor263: sbag + Owner: GDI + Location: 90,12 + Actor264: sbag + Owner: GDI + Location: 96,12 + Actor265: sbag + Owner: GDI + Location: 95,12 + Actor266: sbag + Owner: GDI + Location: 97,12 + Actor267: sbag + Owner: GDI + Location: 91,12 + Actor270: gtwr + Owner: GDI + Location: 100,19 + Actor271: gtwr + Owner: GDI + Location: 100,15 + Actor272: gtwr + Owner: GDI + Location: 85,15 + Actor273: gtwr + Owner: GDI + Location: 85,19 + Actor274: silo.td + Owner: GDI + Location: 87,21 + Actor275: silo.td + Owner: GDI + Location: 90,21 + Actor276: silo.td + Owner: GDI + Location: 93,20 + Actor277: silo.td + Owner: GDI + Location: 97,13 + Actor278: silo.td + Owner: GDI + Location: 87,13 + Actor279: cram + Owner: GDI + Location: 97,19 + Actor280: hq + Owner: GDI + Location: 89,15 + GDINorthEastBarracks: pyle + Owner: GDI + Location: 95,15 + Actor284: split2 + Owner: Neutral + Location: 5,75 + Actor283: proc.td + Owner: GDI + Location: 10,84 + GDISouthBarracks: pyle + Owner: GDI + Location: 14,86 + Actor286: t13 + Owner: Neutral + Location: 20,27 + Actor287: t11 + Owner: Neutral + Location: 31,23 + Actor288: t14 + Owner: Neutral + Location: 43,25 + Actor289: t03 + Owner: Neutral + Location: 49,15 + Actor290: t01 + Owner: Neutral + Location: 56,12 + Actor291: t05 + Owner: Neutral + Location: 59,29 + Actor292: t02 + Owner: Neutral + Location: 54,40 + Actor293: t10 + Owner: Neutral + Location: 39,38 + Actor294: t11 + Owner: Neutral + Location: 28,56 + Actor295: t03 + Owner: Neutral + Location: 18,48 + Actor296: t02 + Owner: Neutral + Location: 8,40 + Actor297: t05 + Owner: Neutral + Location: 9,26 + Actor298: t12 + Owner: Neutral + Location: 4,21 + Actor299: t07 + Owner: Neutral + Location: 51,6 + Actor300: t01 + Owner: Neutral + Location: 80,18 + Actor301: t01 + Owner: Neutral + Location: 80,18 + Actor302: t17 + Owner: Neutral + Location: 78,22 + Actor303: t13 + Owner: Neutral + Location: 79,35 + Actor304: t11 + Owner: Neutral + Location: 88,67 + Actor305: t01 + Owner: Neutral + Location: 67,79 + Actor306: t02 + Owner: Neutral + Location: 59,71 + Actor307: t08 + Owner: Neutral + Location: 70,63 + Actor308: tc05 + Owner: Neutral + Location: 49,63 + Actor309: t08 + Owner: Neutral + Location: 46,63 + Actor310: t06 + Owner: Neutral + Location: 50,53 + Actor311: t14 + Owner: Neutral + Location: 40,59 + Actor312: t03 + Owner: Neutral + Location: 50,45 + Actor313: t06 + Owner: Neutral + Location: 76,46 + Actor314: t01 + Owner: Neutral + Location: 70,26 + Actor315: t12 + Owner: Neutral + Location: 73,15 + Actor316: t12 + Owner: Neutral + Location: 111,17 + Actor317: t06 + Owner: Neutral + Location: 103,29 + Actor318: t14 + Owner: Neutral + Location: 110,54 + Actor319: t13 + Owner: Neutral + Location: 95,65 + Actor320: t03 + Owner: Neutral + Location: 59,85 + GDIAttack3b: t01 + Owner: Neutral + Location: 35,82 + Actor322: v07 + Owner: Neutral + Location: 43,81 + Actor323: v05 + Owner: Neutral + Location: 76,16 + Actor324: v08 + Owner: Neutral + Location: 80,22 + Actor325: v09 + Owner: Neutral + Location: 69,21 + Actor326: v10 + Owner: Neutral + Location: 66,11 + Actor327: v03 + Owner: Neutral + Location: 50,11 + Actor328: htnk + Owner: GDI + Location: 22,18 + Facing: 531 + Actor329: htnk + Owner: GDI + Location: 30,18 + Facing: 507 + Actor330: vulc.ai + Owner: GDI + Facing: 384 + Location: 34,18 + Actor331: vulc.ai + Owner: GDI + Facing: 384 + Location: 14,29 + Actor332: vulc.ai + Owner: GDI + Location: 59,20 + Facing: 642 + Actor333: vulc + Owner: GDI + Location: 107,17 + Facing: 384 + Actor334: mtnk + Owner: GDI + Location: 108,26 + Facing: 523 + Actor335: mtnk + Owner: GDI + Location: 85,37 + Facing: 499 + BattleTank2: mtnk + Owner: GDI + Location: 98,61 + Facing: 384 + Actor337: mtnk + Owner: GDI + Location: 62,69 + Facing: 523 + Actor338: mtnk + Owner: GDI + Location: 68,54 + Facing: 384 + BattleTank1: mtnk + Owner: GDI + Location: 70,55 + Facing: 384 + Actor340: mtnk + Owner: GDI + Location: 45,60 + Facing: 777 + Actor341: mtnk + Owner: GDI + Location: 45,49 + Facing: 515 + Actor342: mtnk + Owner: GDI + Location: 21,77 + Facing: 927 + Actor343: mtnk + Owner: GDI + Location: 18,74 + Facing: 911 + Actor344: mtnk + Owner: GDI + Location: 9,36 + Facing: 618 + Actor345: mtnk + Owner: GDI + Location: 28,41 + Facing: 523 + Actor346: mtnk + Owner: GDI + Location: 24,61 + Facing: 515 + Actor347: mtnk + Owner: GDI + Location: 84,54 + Facing: 626 + Actor348: hmmv + Owner: GDI + Facing: 384 + Location: 84,67 + Actor349: hmmv + Owner: GDI + Location: 63,92 + Facing: 872 + Actor350: hmmv + Owner: GDI + Facing: 384 + Location: 79,43 + Actor351: hmmv + Owner: GDI + Facing: 384 + Location: 83,22 + Actor352: hmmv + Owner: GDI + Location: 106,39 + Facing: 634 + Actor353: hmmv.tow + Owner: GDI + Location: 26,28 + Facing: 245 + Actor354: msam + Owner: GDI + Facing: 384 + Location: 33,15 + Actor355: msam + Owner: GDI + Location: 20,15 + Facing: 507 + Actor356: msam + Owner: GDI + Location: 20,82 + Facing: 1023 + Actor357: msam + Owner: GDI + Location: 98,14 + Facing: 769 + Actor358: titn + Owner: GDI + Location: 40,14 + Facing: 666 + Actor359: disr + Owner: GDI + Location: 51,29 + Facing: 642 + Actor360: jugg + Owner: GDI + Location: 26,13 + Facing: 499 + Actor361: apc2.gdiai + Owner: GDI + Location: 48,57 + Facing: 626 + Actor362: apc2.gdiai + Owner: GDI + Facing: 384 + Location: 96,60 + Actor363: apc2.gdiai + Owner: GDI + Location: 67,25 + Facing: 261 + Actor364: mtnk + Owner: GDI + Location: 42,9 + Facing: 642 + Actor365: mtnk + Owner: GDI + Facing: 642 + Location: 14,18 + Actor366: n1 + Owner: GDI + SubCell: 3 + Location: 21,17 + Facing: 483 + Actor367: n1 + Owner: GDI + Location: 21,17 + SubCell: 1 + Facing: 491 + Actor368: n1 + Owner: GDI + Location: 23,18 + SubCell: 3 + Facing: 555 + Actor369: n1 + Owner: GDI + SubCell: 3 + Location: 29,19 + Facing: 475 + Actor370: n1 + Owner: GDI + Location: 30,17 + SubCell: 3 + Facing: 570 + Actor371: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 35,17 + Actor372: n1 + Owner: GDI + Facing: 384 + Location: 33,18 + SubCell: 3 + Actor373: n1 + Owner: GDI + SubCell: 3 + Location: 15,18 + Facing: 682 + Actor374: n1 + Owner: GDI + SubCell: 3 + Location: 13,19 + Facing: 602 + Actor375: n1 + Owner: GDI + SubCell: 3 + Location: 27,29 + Facing: 261 + Actor376: n1 + Owner: GDI + Location: 26,27 + SubCell: 3 + Facing: 229 + Actor377: n1 + Owner: GDI + SubCell: 3 + Location: 14,30 + Facing: 384 + Actor378: n1 + Owner: GDI + SubCell: 3 + Location: 11,29 + Facing: 384 + Actor379: n1 + Owner: GDI + SubCell: 3 + Location: 9,37 + Facing: 618 + Actor380: n1 + Owner: GDI + Location: 9,37 + SubCell: 1 + Facing: 689 + Actor381: n1 + Owner: GDI + SubCell: 3 + Location: 10,36 + Facing: 610 + Actor382: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 30,40 + Actor383: n1 + Owner: GDI + SubCell: 3 + Location: 27,41 + Facing: 531 + Actor384: n1 + Owner: GDI + SubCell: 3 + Location: 26,40 + Facing: 602 + Actor385: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 43,50 + Actor386: n1 + Owner: GDI + Facing: 384 + Location: 43,49 + SubCell: 3 + Actor387: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 46,48 + Actor388: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 44,60 + Actor389: n1 + Owner: GDI + Facing: 384 + Location: 44,60 + SubCell: 1 + Actor390: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 47,57 + Actor391: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 47,60 + Actor392: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 45,62 + Actor393: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 71,56 + Actor394: n1 + Owner: GDI + Location: 71,56 + SubCell: 1 + Facing: 384 + Actor398: n1 + Owner: GDI + SubCell: 3 + Location: 61,71 + Facing: 512 + Actor401: n1 + Owner: GDI + SubCell: 3 + Location: 62,90 + Facing: 927 + Actor402: n1 + Owner: GDI + Location: 62,90 + SubCell: 1 + Facing: 888 + Actor403: n1 + Owner: GDI + SubCell: 3 + Location: 65,93 + Facing: 904 + Actor404: n1 + Owner: GDI + SubCell: 3 + Location: 64,94 + Facing: 896 + Actor405: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 83,65 + Actor406: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 84,66 + Actor407: n1 + Owner: GDI + Facing: 384 + Location: 84,66 + SubCell: 1 + Actor409: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 85,68 + Actor410: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 96,59 + Actor411: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 99,58 + Actor412: n1 + Owner: GDI + Facing: 384 + Location: 99,58 + SubCell: 1 + Actor413: n1 + Owner: GDI + Facing: 384 + Location: 100,60 + SubCell: 3 + Actor414: n1 + Owner: GDI + Facing: 384 + Location: 97,61 + SubCell: 3 + Actor417: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 101,62 + Actor416: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 110,39 + Actor418: n1 + Owner: GDI + Facing: 384 + Location: 110,39 + SubCell: 1 + Actor419: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 108,38 + Actor420: n1 + Owner: GDI + SubCell: 3 + Location: 105,26 + Facing: 547 + Actor421: n1 + Owner: GDI + Location: 105,26 + SubCell: 1 + Facing: 384 + Actor425: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 106,15 + Actor426: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 108,17 + Actor427: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 110,18 + Actor428: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 105,17 + Actor429: n1 + Owner: GDI + SubCell: 3 + Location: 99,17 + Facing: 785 + Actor430: n1 + Owner: GDI + SubCell: 3 + Location: 101,18 + Facing: 729 + Actor431: n1 + Owner: GDI + Location: 101,18 + SubCell: 1 + Facing: 674 + Actor432: n1 + Owner: GDI + SubCell: 3 + Location: 101,20 + Facing: 697 + Actor433: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 100,13 + Actor434: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 83,15 + Actor435: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 85,14 + Actor436: n1 + Owner: GDI + Facing: 384 + Location: 85,13 + SubCell: 3 + Actor437: n1 + Owner: GDI + SubCell: 3 + Location: 85,21 + Facing: 384 + Actor438: n1 + Owner: GDI + Facing: 384 + Location: 85,21 + SubCell: 1 + Actor439: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 92,19 + Actor440: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 72,13 + Actor441: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 75,18 + Actor442: n1 + Owner: GDI + SubCell: 3 + Location: 71,26 + Facing: 729 + Actor443: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 66,26 + Actor444: n1 + Owner: GDI + SubCell: 3 + Location: 60,19 + Facing: 523 + Actor445: n1 + Owner: GDI + Facing: 384 + Location: 60,19 + SubCell: 1 + Actor446: n1 + Owner: GDI + Location: 60,18 + SubCell: 3 + Facing: 800 + Actor447: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 58,20 + Actor448: n1 + Owner: GDI + SubCell: 3 + Location: 49,28 + Facing: 539 + Actor449: n1 + Owner: GDI + SubCell: 3 + Location: 53,29 + Facing: 610 + Actor450: n1 + Owner: GDI + Facing: 384 + Location: 53,29 + SubCell: 1 + Actor451: n1 + Owner: GDI + SubCell: 3 + Location: 55,28 + Facing: 570 + Actor452: n1 + Owner: GDI + SubCell: 3 + Location: 51,28 + Facing: 618 + Actor453: n1 + Owner: GDI + SubCell: 3 + Location: 42,10 + Facing: 586 + Actor454: n1 + Owner: GDI + SubCell: 3 + Location: 40,12 + Facing: 761 + Actor455: n1 + Owner: GDI + Location: 40,12 + SubCell: 1 + Facing: 618 + Actor456: n1 + Owner: GDI + SubCell: 3 + Location: 43,15 + Facing: 650 + Actor457: n1 + Owner: GDI + SubCell: 3 + Location: 43,13 + Facing: 610 + Actor458: n1 + Owner: GDI + SubCell: 3 + Location: 47,8 + Facing: 689 + Actor459: n1 + Owner: GDI + SubCell: 3 + Location: 43,6 + Facing: 682 + Actor460: n1 + Owner: GDI + SubCell: 3 + Location: 21,20 + Facing: 531 + Actor461: n1 + Owner: GDI + SubCell: 3 + Location: 29,10 + Facing: 658 + Actor462: n1 + Owner: GDI + Facing: 384 + Location: 29,10 + SubCell: 1 + Actor463: n1 + Owner: GDI + SubCell: 3 + Location: 30,9 + Facing: 384 + Actor464: n1 + Owner: GDI + SubCell: 3 + Location: 25,8 + Facing: 570 + Actor465: n1 + Owner: GDI + SubCell: 3 + Location: 30,5 + Facing: 539 + Actor466: n1 + Owner: GDI + SubCell: 3 + Location: 20,8 + Facing: 563 + Actor467: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 50,38 + Actor468: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 28,54 + Actor469: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 31,57 + Actor470: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 30,56 + Actor471: n1 + Owner: GDI + SubCell: 3 + Location: 27,56 + Facing: 384 + Actor472: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 26,62 + Actor473: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 22,61 + Actor474: n1 + Owner: GDI + SubCell: 3 + Location: 21,79 + Facing: 864 + Actor475: n1 + Owner: GDI + Location: 21,79 + SubCell: 1 + Facing: 872 + Actor476: n1 + Owner: GDI + SubCell: 3 + Location: 23,78 + Facing: 729 + Actor477: n1 + Owner: GDI + SubCell: 3 + Location: 17,77 + Facing: 753 + Actor478: n1 + Owner: GDI + SubCell: 3 + Location: 16,75 + Facing: 87 + Actor479: n1 + Owner: GDI + SubCell: 3 + Location: 24,80 + Facing: 896 + Actor480: n1 + Owner: GDI + SubCell: 3 + Location: 13,78 + Facing: 785 + Actor481: n1 + Owner: GDI + SubCell: 3 + Location: 19,86 + Facing: 384 + Actor482: n1 + Owner: GDI + SubCell: 3 + Location: 21,87 + Facing: 0 + Actor483: n1 + Owner: GDI + SubCell: 3 + Location: 13,90 + Facing: 0 + Actor484: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 10,89 + Actor485: n1 + Owner: GDI + SubCell: 3 + Location: 38,81 + Facing: 896 + Actor486: n1 + Owner: GDI + SubCell: 3 + Location: 40,76 + Facing: 0 + Actor487: n1 + Owner: GDI + Location: 40,76 + SubCell: 1 + Facing: 0 + Actor488: n1 + Owner: GDI + SubCell: 3 + Location: 45,78 + Facing: 0 + Actor489: n1 + Owner: GDI + SubCell: 3 + Location: 42,79 + Facing: 0 + Actor490: n1 + Owner: GDI + SubCell: 3 + Location: 43,77 + Facing: 0 + Actor491: n1 + Owner: GDI + Facing: 384 + Location: 53,41 + SubCell: 3 + Actor495: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 80,43 + Actor496: n1 + Owner: GDI + SubCell: 3 + Location: 83,36 + Facing: 666 + Actor497: n1 + Owner: GDI + Facing: 384 + Location: 83,36 + SubCell: 1 + Actor498: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 87,35 + Actor500: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 82,37 + Actor499: n1 + Owner: GDI + SubCell: 3 + Facing: 384 + Location: 111,52 + Actor501: n1 + Owner: GDI + SubCell: 3 + Location: 81,73 + Facing: 499 + Actor502: n1 + Owner: GDI + SubCell: 3 + Location: 71,82 + Facing: 666 + Actor503: n1 + Owner: GDI + SubCell: 3 + Location: 70,83 + Facing: 816 + Actor504: n1 + Owner: GDI + SubCell: 3 + Location: 82,73 + Facing: 602 + Actor505: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 106,41 + Actor506: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 111,53 + Actor507: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 28,40 + Actor508: n2 + Owner: GDI + Facing: 384 + Location: 51,38 + SubCell: 3 + Actor509: n2 + Owner: GDI + SubCell: 3 + Location: 53,28 + Facing: 610 + Actor510: n2 + Owner: GDI + SubCell: 3 + Location: 28,27 + Facing: 269 + Actor511: n2 + Owner: GDI + SubCell: 3 + Location: 12,30 + Facing: 547 + Actor512: n2 + Owner: GDI + SubCell: 3 + Location: 8,38 + Facing: 626 + Actor513: n2 + Owner: GDI + Location: 17,77 + SubCell: 1 + Facing: 745 + Actor514: n2 + Owner: GDI + Location: 43,79 + SubCell: 3 + Facing: 0 + Actor515: n2 + Owner: GDI + SubCell: 3 + Location: 39,77 + Facing: 0 + Actor516: n2 + Owner: GDI + SubCell: 3 + Location: 62,70 + Facing: 512 + Actor517: n2 + Owner: GDI + SubCell: 3 + Location: 70,81 + Facing: 793 + Actor518: n2 + Owner: GDI + SubCell: 3 + Location: 65,94 + Facing: 911 + Actor519: n2 + Owner: GDI + Facing: 384 + Location: 85,67 + SubCell: 3 + Actor520: n2 + Owner: GDI + Facing: 384 + Location: 98,60 + SubCell: 3 + Actor521: n2 + Owner: GDI + Location: 83,53 + SubCell: 3 + Facing: 689 + Actor522: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 85,36 + Actor523: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 84,22 + Actor524: n2 + Owner: GDI + SubCell: 3 + Location: 103,14 + Facing: 452 + Actor525: n2 + Owner: GDI + Location: 105,25 + SubCell: 3 + Facing: 602 + Actor526: n2 + Owner: GDI + SubCell: 3 + Location: 67,27 + Facing: 269 + Actor527: n2 + Owner: GDI + SubCell: 3 + Location: 42,14 + Facing: 586 + Actor528: n2 + Owner: GDI + SubCell: 3 + Location: 32,17 + Facing: 507 + Actor529: n2 + Owner: GDI + SubCell: 3 + Location: 18,17 + Facing: 563 + Actor530: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 25,61 + Actor531: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 29,55 + Actor532: n2 + Owner: GDI + SubCell: 3 + Location: 22,79 + Facing: 872 + Actor533: n2 + Owner: GDI + SubCell: 3 + Location: 14,77 + Facing: 904 + Actor534: n2 + Owner: GDI + Location: 21,84 + SubCell: 3 + Facing: 689 + Actor535: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 9,82 + Actor536: n3 + Owner: GDI + SubCell: 3 + Location: 38,80 + Facing: 0 + Health: 89 + Actor537: n3 + Owner: GDI + Facing: 384 + Location: 45,48 + SubCell: 3 + Actor538: n3 + Owner: GDI + SubCell: 3 + Location: 52,27 + Facing: 634 + Actor539: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 59,19 + Actor540: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 73,13 + Actor541: n3 + Owner: GDI + Facing: 384 + Location: 85,14 + SubCell: 1 + Actor542: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 85,22 + Actor543: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 109,16 + Actor544: n3 + Owner: GDI + SubCell: 3 + Location: 110,27 + Facing: 384 + Actor545: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 105,38 + Actor546: n3 + Owner: GDI + Facing: 384 + Location: 99,58 + SubCell: 2 + Actor547: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 85,66 + Actor548: n3 + Owner: GDI + SubCell: 3 + Location: 81,72 + Facing: 626 + Actor549: n3 + Owner: GDI + SubCell: 3 + Location: 62,93 + Facing: 911 + Actor550: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 62,68 + Actor551: n3 + Owner: GDI + Facing: 384 + Location: 71,54 + SubCell: 3 + Actor552: n3 + Owner: GDI + Facing: 384 + Location: 45,59 + SubCell: 3 + Actor553: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 52,39 + Actor554: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 23,60 + Actor555: n3 + Owner: GDI + SubCell: 3 + Location: 7,37 + Facing: 674 + Actor556: n3 + Owner: GDI + SubCell: 3 + Location: 12,18 + Facing: 594 + Actor557: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 19,12 + Actor558: n3 + Owner: GDI + SubCell: 3 + Location: 21,8 + Facing: 610 + Actor559: n3 + Owner: GDI + SubCell: 3 + Location: 26,5 + Facing: 634 + Actor560: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 35,11 + Actor561: n3 + Owner: GDI + Facing: 384 + Location: 35,18 + SubCell: 3 + Actor562: n3 + Owner: GDI + Facing: 384 + Location: 49,15 + SubCell: 3 + Actor563: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 56,6 + Actor564: n1 + Owner: GDI + SubCell: 3 + Facing: 512 + Location: 60,70 + Actor565: n1 + Owner: GDI + SubCell: 3 + Facing: 512 + Location: 64,70 + Actor566: n1 + Owner: GDI + SubCell: 3 + Facing: 512 + Location: 68,56 + Actor567: n1 + Owner: GDI + SubCell: 3 + Facing: 512 + Location: 70,54 + Actor568: n1 + Owner: GDI + SubCell: 3 + Facing: 512 + Location: 71,53 + Actor569: n1 + Owner: GDI + SubCell: 3 + Facing: 512 + Location: 85,53 + Actor570: n1 + Owner: GDI + SubCell: 3 + Facing: 512 + Location: 82,54 + Actor571: n1 + Owner: GDI + SubCell: 3 + Facing: 512 + Location: 84,51 + Actor572: n1 + Owner: GDI + SubCell: 3 + Facing: 512 + Location: 87,67 + Actor573: n1 + Owner: GDI + SubCell: 3 + Facing: 512 + Location: 107,42 + Actor574: n1 + Owner: GDI + SubCell: 3 + Facing: 512 + Location: 105,28 + Actor575: n1 + Owner: GDI + SubCell: 3 + Location: 110,26 + Facing: 512 + Actor576: n1 + Owner: GDI + SubCell: 3 + Facing: 512 + Location: 106,24 + GDIRallyAlpha: waypoint + Owner: Neutral + Location: 14,23 + GDIRallyBravo: waypoint + Owner: Neutral + Location: 52,19 + GDIAttack1: waypoint + Owner: Neutral + Location: 25,46 + GDIAttack2: waypoint + Owner: Neutral + Location: 22,75 + GDIAttack5: waypoint + Owner: Neutral + Location: 68,88 + GDIAttack7: waypoint + Owner: Neutral + Location: 46,44 + GDIAttack3: waypoint + Owner: Neutral + Location: 41,78 + GDIAttack4: waypoint + Owner: Neutral + Location: 53,60 + GDIAttack8: waypoint + Owner: Neutral + Location: 79,49 + GDIAttack9: waypoint + Owner: Neutral + Location: 91,61 + GDIAttack6: waypoint + Owner: Neutral + Location: 92,85 + GDIAttack10: waypoint + Owner: Neutral + Location: 78,18 + GDIAttack11: waypoint + Owner: Neutral + Location: 107,19 + GDIAttack12: waypoint + Owner: Neutral + Location: 109,50 + Actor577: camera + Owner: GDI + Location: 95,84 + Actor578: camera + Owner: GDI + Location: 67,86 + Actor579: camera + Owner: GDI + Location: 62,60 + Actor580: camera + Owner: GDI + Location: 94,61 + Actor581: camera + Owner: GDI + Location: 86,37 + Actor582: camera + Owner: GDI + Location: 46,43 + Actor583: camera + Owner: GDI + Location: 18,45 + Actor584: camera + Owner: GDI + Location: 42,65 + Actor585: camera + Owner: GDI + Location: 24,67 + Actor586: camera + Owner: GDI + Location: 54,17 + Actor587: nuk2 + Owner: GDI + Location: 92,15 + Actor588: nuk2 + Owner: GDI + Location: 7,93 + Actor589: nuk2 + Owner: GDI + Location: 9,93 + Actor590: nuk2 + Owner: GDI + Location: 11,93 + Actor591: nuk2 + Owner: GDI + Location: 13,93 + Actor592: nuk2 + Owner: GDI + Location: 15,93 + Actor593: hq + Owner: GDI + Location: 18,93 + Actor594: silo.td + Owner: GDI + Location: 21,95 + Actor595: silo.td + Owner: GDI + Location: 21,93 + Actor596: gtwr + Owner: GDI + Location: 5,87 + Actor597: cram + Owner: GDI + Location: 16,15 + Actor598: nuk2 + Owner: GDI + Location: 22,6 + Actor599: cram + Owner: GDI + Location: 25,7 + Actor600: oilb + Owner: Neutral + Location: 71,93 + Actor601: oilb + Owner: Neutral + Location: 106,1 + Actor602: oilb + Faction: Random + Location: 75,24 + Owner: GDI + Actor603: oilb + Faction: Random + Location: 37,37 + Owner: GDI + Actor604: camera + Owner: GDI + Location: 85,17 + Actor605: camera + Owner: GDI + Location: 77,48 + Actor606: camera + Owner: GDI + Location: 83,70 + Actor607: camera + Owner: GDI + Location: 63,74 + Actor608: patr + Owner: GDI + Location: 11,89 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-doctrines.yaml, expulsion-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/main-campaign/ca17-domination/domination-rules.yaml b/mods/ca/missions/main-campaign/ca17-domination/domination-rules.yaml new file mode 100644 index 0000000000..b181d315bf --- /dev/null +++ b/mods/ca/missions/main-campaign/ca17-domination/domination-rules.yaml @@ -0,0 +1,208 @@ +^Palettes: + TintPostProcessEffect: + +World: + LuaScript: + Scripts: campaign.lua, domination.lua + MissionData: + Briefing: Now that the Allies and GDI are no longer on our doorstep and we have begun to replenish our forces, we can turn our attention to the Brotherhood of Nod.\n\nKane cannot be trusted. He thinks that his cyborg army gives him such an advantage, and that we have been so weakened, that we will do his bidding without question. His arrogant overconfidence will be his downfall.\n\nIt is time to make use of our own secret weapon, Yuri. With his psionic powers he can turn our enemies into loyal servants.\n\nThere is but one obstacle. Kane's cyborgs are impervious to Yuri's powers, as their minds are protected by their cybernetic implants.\n\nIn order for Yuri to be able to control the minds of these cyborgs, we must break through the encryption that protects them.\n\nMake use of one of our best thieves to infiltrate a Nod cybernetics lab to steal the encryption algorithms. Without this protection the cyborgs will be vulnerable to Yuri, and we will be able to use Kane's own cyborgs against him. + MapOptions: + ShortGameCheckboxEnabled: False + ScriptLobbyDropdown@RESPAWN: + ID: respawn + Label: Respawns + Description: Enable/disable respawning on death + Values: + enabled: Enabled + disabled: Disabled + Default: disabled + DisplayOrder: 999 + MusicPlaylist: + StartingMusic: shut_it + +Player: + PlayerResources: + DefaultCash: 2000 + PowerManager: + AdviceInterval: 240000 + +# Disable powers for AI + +^SatHackPower: + SpawnActorPowerCA@sathack: + Prerequisites: ~radar.nod, ~!player.legion, ~!botplayer + +^NodAirdropPowers: + ParatroopersPowerCA@NodAirDrop: + Prerequisites: ~!botplayer + +# Misc + +YURI: + RevealsShroud: + Range: 10c0 + AutoTarget: + InitialStance: HoldFire + Buildable: + Description: Elite specialist infantry able to mind-control\n enemy units (up to 3). + -Captures@DRIVER_KILL: + -GainsExperience: + -ProducibleWithLevel: + Health: + HP: 15000 + ExternalCondition@VET: + Condition: rank-veteran + DamageMultiplier@YAMLFIX: + Modifier: 100 + RequiresCondition: maxcontrolled + -RangedGpsRadarProvider: + -WithRangeCircle: + Passenger: + CargoType: Yuri + +powerproxy.mutabomb: + Inherits@MUTABOMBPOWER: ^MutaBombPower + AirstrikePowerCA@MutaBomb: + -Prerequisites: + -PauseOnCondition: + ChargeInterval: 7500 + StartFullyCharged: true + AlwaysVisible: + +BRUT: + AutoTarget: + InitialStance: Defend + +THF: + Buildable: + Description: Normally steals enemy credits and hijacks enemy vehicles.\n\nCurrent mission to steal encryption codes. + -Captures: + -Captures@DRIVER_KILL: + Infiltrates: + Types: ThiefInfiltrate + +LASW: + Inherits: BRIK + -Buildable: + Tooltip: + Name: Laser Fence + -SoundOnDamageTransition: + DamageMultiplier: + Modifier: 0 + -Crushable: + LineBuild: + NodeTypes: lasw + LineBuildNode: + Types: lasw + WithWallSpriteBody: + Type: lasw + RenderSprites: + Image: lasw + -Targetable: + +N4: + Mobile: + Speed: 46 + +^Cyborg: + Tooltip: + GenericName: Cyborg + +^DecryptableCyborg: + Targetable@MINDCONTROL: + RequiresCondition: !mindcontrolled && decrypted + GrantConditionOnPrerequisite@DECRYPTED: + Condition: decrypted + Prerequisites: cyborgsdecrypted + +N1C: + Inherits@DECRYPT: ^DecryptableCyborg + +N3C: + Inherits@DECRYPT: ^DecryptableCyborg + +N5: + Inherits@DECRYPT: ^DecryptableCyborg + +RMBC: + Inherits@DECRYPT: ^DecryptableCyborg + DamageMultiplier@MCBUFF: + Modifier: 75 + RequiresCondition: mindcontrolled + +ENLI: + Inherits@DECRYPT: ^DecryptableCyborg + DamageMultiplier@MCBUFF: + Modifier: 70 + RequiresCondition: mindcontrolled + +ACOL: + Inherits@DECRYPT: ^DecryptableCyborg + DamageMultiplier@MCBUFF: + Modifier: 60 + RequiresCondition: mindcontrolled + +TPLR: + Inherits@DECRYPT: ^DecryptableCyborg + DamageMultiplier@MCBUFF: + Modifier: 60 + RequiresCondition: mindcontrolled + +MISS: + Tooltip: + Name: Cybernetics Lab + TooltipDescription: + Description: Nod cyborg research facility and data warehouse. + ValidRelationships: Ally, Enemy + InfiltrateToCreateProxyActor@DECRYPT: + Types: ThiefInfiltrate + Proxy: cyborgsdecrypted + InfiltrationNotification: BuildingInfiltrated + InfiltratedNotification: BaseAttack + Targetable@DECRYPT: + TargetTypes: ThiefInfiltrate + +cyborgsdecrypted: + AlwaysVisible: + Interactable: + ScriptTriggers: + ProvidesPrerequisite: + +BADR.MBomber: + Health: + HP: 10000 + +NUKE: + Health: + HP: 35000 + -SpawnActorOnDeath: + -SpawnRandomActorOnDeath: + +NUK2: + Health: + HP: 35000 + -SpawnActorOnDeath: + -SpawnRandomActorOnDeath: + +NSAM: + Targetable: + TargetTypes: Ground, Structure + +OBLI: + Targetable: + TargetTypes: Ground, Structure + Targetable@Defense: + TargetTypes: Defense + RequiresCondition: !disabled + +LASP: + DamageMultiplier@REDUC: + Modifier: 20 + RepairableBuilding: + RepairStep: 3600 + +HALO.paradrop: + DamageMultiplier@INVULN: + Modifier: 0 + Cargo: + Types: Yuri diff --git a/mods/ca/missions/main-campaign/ca17-domination/domination-sequences.yaml b/mods/ca/missions/main-campaign/ca17-domination/domination-sequences.yaml new file mode 100644 index 0000000000..85d8122e09 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca17-domination/domination-sequences.yaml @@ -0,0 +1,5 @@ +lasw: + idle: + Filename: lasf.shp + Frames: 3,7,1,1,6,5,1,5,2,2,0,0,2,5,0,0 + Length: 16 diff --git a/mods/ca/missions/main-campaign/ca17-domination/domination-weapons.yaml b/mods/ca/missions/main-campaign/ca17-domination/domination-weapons.yaml new file mode 100644 index 0000000000..7466bedfd4 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca17-domination/domination-weapons.yaml @@ -0,0 +1,14 @@ +MicrowaveZap: + Warhead@1Dam: SpreadDamage + Versus: + None: 25 + Warhead@EmpDefense: GrantExternalConditionCA + Range: 0c511 + Duration: 175 + Condition: empdisable + ValidTargets: Defense + +TurretGun: + Warhead@1Dam: SpreadDamage + Versus: + None: 15 diff --git a/mods/ca/missions/main-campaign/ca17-domination/domination.lua b/mods/ca/missions/main-campaign/ca17-domination/domination.lua new file mode 100644 index 0000000000..b2ff6d3c2a --- /dev/null +++ b/mods/ca/missions/main-campaign/ca17-domination/domination.lua @@ -0,0 +1,424 @@ +MissionDir = "ca|missions/main-campaign/ca17-domination" + +RespawnEnabled = Map.LobbyOption("respawn") == "enabled" + +CommandoRespawnDelay = { + hard = DateTime.Minutes(3) + DateTime.Seconds(30), + vhard = DateTime.Minutes(2) + DateTime.Seconds(30), + brutal = DateTime.Minutes(1) + DateTime.Seconds(30) +} + +Patrols = { + { + Units = { NodPatroller1a, NodPatroller1b, NodPatroller1c }, + Path = { NodPatrol1a.Location, NodPatrol1b.Location, NodPatrol1c.Location, NodPatrol1d.Location, NodPatrol1c.Location, NodPatrol1b.Location } + }, + { + Units = { NodPatroller2a, NodPatroller2b, NodPatroller2c }, + Path = { NodPatrol2a.Location, NodPatrol2b.Location } + }, + { + Units = { NodPatroller3a, NodPatroller3b, NodPatroller3c, NodPatroller3d }, + Path = { NodPatrol3a.Location, NodPatrol3b.Location, NodPatrol3c.Location, NodPatrol3b.Location } + }, + { + Units = { NodPatroller4a, NodPatroller4b, NodPatroller4c }, + Path = { NodPatrol4a.Location, NodPatrol4b.Location, NodPatrol4c.Location, NodPatrol4d.Location, NodPatrol4e.Location } + }, +} + +StartPowerPlants = { StartPower1, StartPower2 } +SouthWestPowerPlants = { SouthWestPower1, SouthWestPower2, SouthWestPower3, SouthWestPower4, SouthWestPower5, SouthWestPower6 } +SouthEastPowerPlants = { SouthEastPower1, SouthEastPower2, SouthEastPower3, SouthEastPower4 } +NorthPowerPlants = { NorthPower1, NorthPower2, NorthPower3, NorthPower4 } + +VeryHardAndAboveCompositions = { + Infantry = { "n3", "n1", "n1", "n4", "n3", "n1", "n1", "n1" }, + Infantry = { "n4", "n4", "n4", "n4", "n4" }, +} + +Squads = { + Main = { + Delay = AdjustDelayForDifficulty(DateTime.Minutes(3)), + ActiveCondition = function() + return LaserFencesDown + end, + AttackValuePerSecond = { + vhard = { Min = 10, Max = 15 }, + brutal = { Min = 15, Max = 20 }, + }, + FollowLeader = true, + RandomProducerActor = true, + Compositions = AdjustCompositionsForDifficulty(VeryHardAndAboveCompositions), + }, +} + +SetupPlayers = function() + USSR = Player.GetPlayer("USSR") + Nod = Player.GetPlayer("Nod") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = { USSR } + MissionEnemies = { Nod } +end + +WorldLoaded = function() + SetupPlayers() + + TimerTicks = 0 + TempleOfNodLocation = TempleOfNod.Location + LaserFencesDown = false + Camera.Position = PlayerStart.CenterPosition + + InitObjectives(USSR) + InitNod() + + ObjectiveStealCodes = USSR.AddObjective("Steal Nod cyborg encryption codes.") + + if Difficulty == "easy" then + StartLightTank.Destroy() + StartTurret3.Destroy() + SouthWestTurret1.Destroy() + SouthWestTurret2.Destroy() + FirstStealthTank.Destroy() + NodAssassin3.Destroy() + else + EasyGren1.Destroy() + EasyGren2.Destroy() + end + + if IsHardOrAbove() then + HealCrate1.Destroy() + HealCrate2.Destroy() + end + + if IsVeryHardOrBelow() then + NodAssassin1.Destroy() + NodAssassin2.Destroy() + SouthStealthTank.Destroy() + + if IsNormalOrBelow() then + HardOnlyAcolyte1.Destroy() + HardOnlyAcolyte2.Destroy() + HardOnlyAcolyte3.Destroy() + HardOnlyChemWarrior1.Destroy() + HardOnlyChemWarrior2.Destroy() + HardOnlyTurret1.Destroy() + end + end + + if RespawnEnabled then + ObjectiveKeepYuriAlive = USSR.AddSecondaryObjective("Keep Yuri alive.") + RespawnTrigger(Yuri) + RespawnTrigger(Thief) + else + ObjectiveKeepYuriAlive = USSR.AddObjective("Yuri must survive.") + Trigger.OnKilled(Thief, function(self, killer) + if not USSR.IsObjectiveCompleted(ObjectiveStealCodes) then + USSR.MarkFailedObjective(ObjectiveStealCodes) + end + end) + + Trigger.OnKilled(Yuri, function(self, killer) + USSR.MarkFailedObjective(ObjectiveKeepYuriAlive) + if ObjectiveEscape ~= nil and not USSR.IsObjectiveCompleted(ObjectiveEscape) then + USSR.MarkFailedObjective(ObjectiveEscape) + end + end) + end + + Trigger.AfterDelay(DateTime.Seconds(3), function() + Tip("Yuri can mind control up to three enemy units. Mind controlling a fourth will kill the earliest controlled.") + Trigger.AfterDelay(DateTime.Seconds(3), function() + Tip("Deploying Yuri releases a mind blast around Yuri and his slaves (the slaves will be unharmed).") + end) + end) + + Trigger.OnAllKilledOrCaptured(StartPowerPlants, function() + local startSAMs = { StartSAM1, StartSAM2 } + DisableDefenses(startSAMs) + end) + + Trigger.OnAllKilledOrCaptured(SouthWestPowerPlants, function() + local centerDefenses = { SouthWestSAM, CenterObelisk1, CenterObelisk2, CenterObelisk3, CenterObelisk4, CenterSAM1, CenterSAM2, CenterSAM3, LeftObelisk } + DisableDefenses(centerDefenses) + DisableLaserFences() + Media.PlaySound("powrdn1.aud") + Actor.Create("powerproxy.mutabomb", true, { Owner = MissionPlayers[1] }) + Trigger.AfterDelay(DateTime.Seconds(3), function() + Tip("The Genetic Mutation Bomb support power can turn enemy infantry into Brutes under your command. Avoid enemy SAM sites by holding the mouse button when selecting the target, allowing you to control the approach angle.") + end) + end) + + Trigger.OnAllKilledOrCaptured(SouthEastPowerPlants, function() + local southEastDefenses = { SouthEastSAM1, SouthEastSAM2, SouthEastSAM3, SouthEastSAM4, SouthEastObelisk1, SouthEastObelisk2, SouthEastObelisk3, SouthEastObelisk4 } + DisableDefenses(southEastDefenses) + end) + + Trigger.OnAllKilledOrCaptured(NorthPowerPlants, function() + local northDefenses = { NorthSAM1, NorthSAM2, NorthSAM3, NorthSAM4, NorthObelisk1, NorthObelisk2, NorthObelisk3, NorthObelisk4 } + DisableDefenses(northDefenses) + end) + + Trigger.OnKilled(CyberneticsLab, function(self, killer) + if not USSR.IsObjectiveCompleted(ObjectiveStealCodes) then + USSR.MarkFailedObjective(ObjectiveStealCodes) + end + end) + + Trigger.OnInfiltrated(CyberneticsLab, function(self, infiltrator) + Actor.Create("cyborgsdecrypted", true, { Owner = Nod }) + ObjectiveDestroyTemple = USSR.AddObjective("Locate and destroy the Temple of Nod.") + USSR.MarkCompletedObjective(ObjectiveStealCodes) + + if TempleOfNod.IsDead then + USSR.MarkCompletedObjective(ObjectiveDestroyTemple) + InitEvacSite() + end + + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(2)), function() + MediaCA.PlaySound(MissionDir .. "/r2_codesacquired.aud", 2) + Notification("Cyborg encryption codes acquired.") + + if EvacStarted then + SendEvac() + end + end) + end) + + Trigger.OnKilled(TempleOfNod, function(self, killer) + TempleDestroyed() + end) + + Trigger.OnSold(TempleOfNod, function(self) + TempleDestroyed() + end) + + Trigger.OnEnteredProximityTrigger(EvacLanding.CenterPosition, WDist.New(2560), function(a, id) + if ObjectiveEscape ~= nil and not EvacStarted and IsMissionPlayer(a.Owner) and a.Type == "yuri" then + EvacStarted = true + Trigger.RemoveProximityTrigger(id) + + if ObjectiveStealCodes == nil or not USSR.IsObjectiveCompleted(ObjectiveStealCodes) then + Notification("Encryption codes are required for mission completion.") + MediaCA.PlaySound(MissionDir .. "/r2_codesrequired.aud", 2) + return + end + + SendEvac() + end + end) + + Trigger.OnEnteredProximityTrigger(TempleOfNod.CenterPosition, WDist.New(10 * 1024), function(a, id) + if IsMissionPlayer(a.Owner) and ObjectiveDestroyTemple ~= nil then + Trigger.RemoveProximityTrigger(id) + TempleDiscovered() + end + end) + + if IsHardOrAbove() then + Trigger.OnProduction(NorthHand1, function(p, produced) + if produced.Type == "rmbo" and not produced.IsDead then + produced.Hunt() + + Trigger.OnKilled(produced, function(self, killer) + Trigger.AfterDelay(CommandoRespawnDelay[Difficulty], function() + SpawnCommando() + end) + end) + end + end) + + Utils.Do({ CommandoTrigger1, CommandoTrigger2 }, function(t) + Trigger.OnEnteredProximityTrigger(t.CenterPosition, WDist.New(9 * 1024), function(a, id) + if IsMissionPlayer(a.Owner) and not a.HasProperty("Land") then + Trigger.RemoveProximityTrigger(id) + if not CommandosInitialized then + CommandosInitialized = true + SpawnCommando() + end + end + end) + end) + end + + SetupReveals({ LaserFenceReveal, EntranceReveal1, EntranceReveal2, EntranceReveal3 }) + AfterWorldLoaded() +end + +Tick = function() + OncePerSecondChecks() + OncePerFiveSecondChecks() + AfterTick() +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + Nod.Resources = Nod.ResourceCapacity - 500 + + if TimerTicks > 0 then + if TimerTicks > 25 then + TimerTicks = TimerTicks - 25 + else + TimerTicks = 0 + end + end + end +end + +OncePerFiveSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 125 == 0 then + UpdatePlayerBaseLocations() + end +end + +InitNod = function() + RebuildExcludes.Nod = { Types = { "nuke", "nuk2", "tmpl", "obli", "gun.nod", "nsam" }, Actors = { StartHand, StartComms, MidHand, MidComms } } + + AutoRepairAndRebuildBuildings(Nod, 15) + SetupRefAndSilosCaptureCredits(Nod) + AutoReplaceHarvesters(Nod) + InitAiUpgrades(Nod) + InitAttackSquad(Squads.Main, Nod) + + Actor.Create("ai.unlimited.power", true, { Owner = Nod }) + + local nodGroundAttackers = Nod.GetGroundAttackers() + + Utils.Do(nodGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsNodGroundHunterUnit) + end) + + Trigger.AfterDelay(1, function() + Utils.Do(Patrols, function(p) + Utils.Do(p.Units, function(unit) + if not unit.IsDead then + unit.Patrol(p.Path, true, 10) + end + end) + end) + end) +end + +SpawnCommando = function() + if not NorthHand1.IsDead then + NorthHand1.Produce("rmbo") + end +end + +DisableLaserFences = function() + LaserFencesDown = true + local fences = Nod.GetActorsByType("lasw") + + Utils.Do(fences, function(a) + if not a.IsDead then + a.Destroy() + end + end) + + DisableDefenses(Nod.GetActorsByType("lasp")) +end + +DisableDefenses = function(actors) + Utils.Do(actors, function(a) + if not a.IsDead then + a.GrantCondition("disabled") + end + end) +end + +TempleDestroyed = function() + ObjectiveEscape = USSR.AddObjective("Bring Yuri to the extraction point.") + + if ObjectiveDestroyTemple ~= nil then + USSR.MarkCompletedObjective(ObjectiveDestroyTemple) + end + + if ObjectiveStealCodes ~= nil and USSR.IsObjectiveCompleted(ObjectiveStealCodes) then + InitEvacSite() + end +end + +TempleDiscovered = function() + if not IsTempleDiscovered then + IsTempleDiscovered = true + Beacon.New(USSR, TempleOfNod.CenterPosition) + Notification("Temple of Nod located.") + MediaCA.PlaySound(MissionDir .. "/r2_templelocated.aud", 2) + local autoCamera = Actor.Create("smallcamera", true, { Owner = USSR, Location = TempleOfNodLocation }) + Trigger.AfterDelay(DateTime.Seconds(5), autoCamera.Destroy) + end +end + +InitEvacSite = function() + if not EvacSiteInitialized then + EvacSiteInitialized = true + Beacon.New(USSR, EvacLanding.CenterPosition) + EvacFlare = Actor.Create("flare", true, { Owner = USSR, Location = EvacLanding.Location }) + end +end + +SendEvac = function() + if EvacFlare ~= nil then + EvacFlare.Destroy() + end + + Notification("Extraction transport inbound.") + MediaCA.PlaySound(MissionDir .. "/r2_extraction.aud", 2) + + Reinforcements.ReinforceWithTransport(USSR, "halo.paradrop", nil, { EvacSpawn.Location, EvacLanding.Location }, nil, function(transport, cargo) + Trigger.OnPassengerEntered(transport, function(t, passenger) + t.Stop() + if passenger.Type == "yuri" then + EvacExiting = true + t.Move(EvacSpawn.Location) + Trigger.AfterDelay(DateTime.Seconds(2), function() + USSR.MarkCompletedObjective(ObjectiveEscape) + if ObjectiveKeepYuriAlive ~= nil then + USSR.MarkCompletedObjective(ObjectiveKeepYuriAlive) + end + end) + end + end) + + transport.Land(EvacLanding) + end) +end + +RespawnTrigger = function(a) + Trigger.OnKilled(a, function(self, killer) + if a.Type == "yuri" then + message = "Yuri has used his tremendous psionic power to cheat death. He will return in 20 seconds." + USSR.MarkFailedObjective(ObjectiveKeepYuriAlive) + else + message = "Yuri has used his tremendous psionic power to save the Thief from death. He will return in 20 seconds." + end + + Notification(message) + + local respawnLocation = PlayerStart.Location + + if USSR.IsObjectiveCompleted(ObjectiveStealCodes) then + if a.Type == "thf" then + return + end + respawnLocation = MidRespawn.Location + end + + if not RespawnFlare or RespawnFlare.IsDead then + RespawnFlare = Actor.Create("flare", true, { Owner = a.Owner, Location = respawnLocation }) + end + + Beacon.New(a.Owner, Map.CenterOfCell(respawnLocation), DateTime.Seconds(20)) + + Trigger.AfterDelay(DateTime.Seconds(20), function() + local respawnedActor = Actor.Create(a.Type, true, { Owner = a.Owner, Location = respawnLocation }) + Media.PlaySpeechNotification(a.Owner, "ReinforcementsArrived") + Beacon.New(a.Owner, Map.CenterOfCell(respawnLocation)) + RespawnTrigger(respawnedActor) + if not RespawnFlare or RespawnFlare.IsDead then + RespawnFlare.Destroy() + end + end) + end) +end diff --git a/mods/ca/missions/main-campaign/ca17-domination/map.bin b/mods/ca/missions/main-campaign/ca17-domination/map.bin new file mode 100644 index 0000000000..c55a4c864d Binary files /dev/null and b/mods/ca/missions/main-campaign/ca17-domination/map.bin differ diff --git a/mods/ca/missions/main-campaign/ca17-domination/map.png b/mods/ca/missions/main-campaign/ca17-domination/map.png new file mode 100644 index 0000000000..5647508982 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca17-domination/map.png differ diff --git a/mods/ca/missions/main-campaign/ca17-domination/map.yaml b/mods/ca/missions/main-campaign/ca17-domination/map.yaml new file mode 100644 index 0000000000..0ae509f9d2 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca17-domination/map.yaml @@ -0,0 +1,2351 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 17: Domination + +Author: Darkademic + +Tileset: DESERT + +MapSize: 114,92 + +Bounds: 1,1,112,90 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: USSR, Nod + PlayerReference@USSR: + Name: USSR + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: soviet + LockColor: True + Color: FE1100 + LockSpawn: True + LockTeam: True + Enemies: Nod, Creeps + PlayerReference@Nod: + Name: Nod + Bot: campaign + Faction: nod + Color: 6D738C + Enemies: USSR, Creeps + +Actors: + Actor6: sbag + Owner: Nod + Location: 12,25 + Actor7: sbag + Owner: Nod + Location: 11,25 + Actor8: sbag + Owner: Nod + Location: 10,25 + Actor9: sbag + Owner: Nod + Location: 9,25 + Actor10: sbag + Owner: Nod + Location: 9,26 + Actor11: sbag + Owner: Nod + Location: 9,27 + Actor12: sbag + Owner: Nod + Location: 19,25 + Actor13: sbag + Owner: Nod + Location: 20,25 + Actor14: sbag + Owner: Nod + Location: 21,25 + Actor15: sbag + Owner: Nod + Location: 18,25 + Actor16: sbag + Owner: Nod + Location: 22,25 + Actor17: sbag + Owner: Nod + Location: 23,25 + Actor18: sbag + Owner: Nod + Location: 24,25 + Actor19: sbag + Owner: Nod + Location: 24,26 + Actor20: sbag + Owner: Nod + Location: 24,27 + Actor21: sbag + Owner: Nod + Location: 9,28 + Actor22: sbag + Owner: Nod + Location: 9,29 + Actor23: sbag + Owner: Nod + Location: 24,28 + Actor24: sbag + Owner: Nod + Location: 24,29 + Actor25: sbag + Owner: Nod + Location: 24,33 + Actor26: sbag + Owner: Nod + Location: 24,34 + Actor27: sbag + Owner: Nod + Location: 9,33 + Actor28: sbag + Owner: Nod + Location: 9,34 + Actor29: sbag + Owner: Nod + Location: 9,35 + Actor30: sbag + Owner: Nod + Location: 9,36 + Actor31: sbag + Owner: Nod + Location: 11,36 + Actor32: sbag + Owner: Nod + Location: 10,36 + Actor33: sbag + Owner: Nod + Location: 12,36 + Actor34: sbag + Owner: Nod + Location: 13,36 + Actor35: sbag + Owner: Nod + Location: 18,36 + Actor36: sbag + Owner: Nod + Location: 19,36 + Actor37: sbag + Owner: Nod + Location: 21,36 + Actor38: sbag + Owner: Nod + Location: 20,36 + Actor39: sbag + Owner: Nod + Location: 22,36 + Actor40: sbag + Owner: Nod + Location: 23,36 + Actor41: sbag + Owner: Nod + Location: 24,36 + Actor42: sbag + Owner: Nod + Location: 24,35 + Actor53: n4 + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 18,30 + Actor56: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 20,35 + StartSAM2: nsam + Owner: Nod + Location: 21,26 + StartSAM1: nsam + Owner: Nod + Location: 11,35 + StartPower1: nuke + Owner: Nod + Location: 10,26 + Actor66: n1 + Owner: Nod + SubCell: 3 + Facing: 87 + Location: 17,17 + Thief: thf + Owner: USSR + SubCell: 3 + Location: 11,5 + Facing: 512 + Yuri: yuri + Owner: USSR + SubCell: 3 + Location: 11,7 + Facing: 512 + InitialBrute1: brut + Owner: USSR + SubCell: 3 + Location: 10,9 + Facing: 512 + InitialBrute2: brut + Owner: USSR + SubCell: 3 + Location: 12,9 + Facing: 512 + PlayerStart: waypoint + Owner: Neutral + Location: 11,7 + StartTurret1: gun.nod + Owner: Nod + Location: 18,24 + TurretFacing: 87 + StartFlameTank: ftnk + Owner: Nod + Location: 15,25 + Facing: 0 + Actor74: n1 + Owner: Nod + SubCell: 3 + Location: 13,18 + Facing: 0 + Actor75: n3 + Owner: Nod + SubCell: 3 + Facing: 793 + Location: 23,28 + Actor78: chain + Owner: Nod + Location: 2,76 + Actor79: chain + Owner: Nod + Location: 2,75 + Actor80: chain + Owner: Nod + Location: 2,74 + Actor81: chain + Owner: Nod + Location: 2,72 + Actor82: chain + Owner: Nod + Location: 2,73 + Actor83: chain + Owner: Nod + Location: 2,71 + Actor84: chain + Owner: Nod + Location: 2,70 + Actor85: chain + Owner: Nod + Location: 2,68 + Actor86: chain + Owner: Nod + Location: 2,69 + Actor87: chain + Owner: Nod + Location: 2,67 + Actor88: chain + Owner: Nod + Location: 3,67 + Actor89: chain + Owner: Nod + Location: 4,67 + Actor90: chain + Owner: Nod + Location: 5,67 + Actor91: chain + Owner: Nod + Location: 6,67 + Actor92: chain + Owner: Nod + Location: 2,77 + Actor93: chain + Owner: Nod + Location: 2,78 + Actor94: chain + Owner: Nod + Location: 2,79 + Actor95: chain + Owner: Nod + Location: 2,80 + Actor96: chain + Owner: Nod + Location: 2,81 + Actor97: chain + Owner: Nod + Location: 2,82 + Actor98: chain + Owner: Nod + Location: 2,84 + Actor99: chain + Owner: Nod + Location: 2,83 + Actor100: chain + Owner: Nod + Location: 2,85 + Actor101: chain + Owner: Nod + Location: 3,85 + Actor102: chain + Owner: Nod + Location: 4,85 + Actor103: chain + Owner: Nod + Location: 6,85 + Actor104: chain + Owner: Nod + Location: 5,85 + Actor105: chain + Owner: Nod + Location: 7,85 + Actor106: chain + Owner: Nod + Location: 8,85 + Actor107: chain + Owner: Nod + Location: 10,85 + Actor108: chain + Owner: Nod + Location: 9,85 + Actor109: chain + Owner: Nod + Location: 6,68 + Actor110: chain + Owner: Nod + Location: 7,68 + Actor111: chain + Owner: Nod + Location: 8,68 + Actor112: chain + Owner: Nod + Location: 9,68 + Actor113: chain + Owner: Nod + Location: 10,68 + Actor114: chain + Owner: Nod + Location: 10,69 + Actor115: chain + Owner: Nod + Location: 10,70 + Actor116: chain + Owner: Nod + Location: 10,71 + Actor117: chain + Owner: Nod + Location: 10,72 + Actor118: chain + Owner: Nod + Location: 10,84 + Actor119: chain + Owner: Nod + Location: 10,83 + Actor120: chain + Owner: Nod + Location: 10,81 + Actor121: chain + Owner: Nod + Location: 10,82 + Actor122: chain + Owner: Nod + Location: 10,80 + Actor123: chain + Owner: Nod + Location: 10,73 + Actor124: chain + Owner: Nod + Location: 10,74 + SouthWestPower4: nuk2 + Owner: Nod + Location: 3,74 + SouthWestPower5: nuk2 + Owner: Nod + Location: 5,74 + SouthWestPower6: nuk2 + Owner: Nod + Location: 7,74 + SouthWestPower1: nuk2 + Owner: Nod + Location: 3,70 + SouthWestPower2: nuk2 + Owner: Nod + Location: 5,70 + SouthWestPower3: nuk2 + Owner: Nod + Location: 7,70 + SouthWestSAM: nsam + Owner: Nod + Location: 3,68 + SouthWestTurret1: gun.nod + Owner: Nod + Location: 14,73 + TurretFacing: 840 + SouthWestTurret2: gun.nod + Owner: Nod + Location: 14,80 + TurretFacing: 761 + Actor140: tc01 + Owner: Neutral + Location: 5,46 + Actor141: tc01 + Owner: Neutral + Location: 23,68 + Actor143: rock2 + Owner: Neutral + Location: 20,54 + Actor142: rock6 + Owner: Neutral + Location: 21,79 + Actor144: t09 + Owner: Neutral + Location: 18,20 + Actor145: t09 + Owner: Neutral + Location: 19,60 + Actor129: rep + Owner: Nod + Location: 4,78 + Actor125: lasp + Owner: Nod + Location: 28,21 + Actor130: lasp + Owner: Nod + Location: 31,21 + Actor148: lasw + Owner: Nod + Location: 29,21 + Actor149: lasw + Owner: Nod + Location: 30,21 + Actor150: lasw + Owner: Nod + Location: 32,21 + Actor151: lasw + Owner: Nod + Location: 33,21 + Actor152: lasw + Owner: Nod + Location: 34,21 + Actor159: lasp + Owner: Nod + Location: 35,21 + Actor160: lasw + Owner: Nod + Location: 36,21 + Actor161: lasw + Owner: Nod + Location: 37,21 + Actor166: lasp + Owner: Nod + Location: 38,21 + CyberneticsLab: miss + Owner: Nod + Location: 44,44 + CenterSAM1: nsam + Owner: Nod + Location: 39,39 + CenterSAM2: nsam + Owner: Nod + Location: 38,51 + CenterSAM3: nsam + Owner: Nod + Location: 54,46 + CenterObelisk1: obli + Owner: Nod + Location: 41,38 + CenterObelisk2: obli + Owner: Nod + Location: 51,37 + CenterObelisk3: obli + Owner: Nod + Location: 40,53 + CenterObelisk4: obli + Owner: Nod + Location: 49,53 + Actor176: chain + Owner: Nod + Location: 43,46 + Actor177: chain + Owner: Nod + Location: 43,45 + Actor178: chain + Owner: Nod + Location: 43,44 + Actor179: chain + Owner: Nod + Location: 43,43 + Actor180: chain + Owner: Nod + Location: 44,43 + Actor181: chain + Owner: Nod + Location: 45,43 + Actor182: chain + Owner: Nod + Location: 46,43 + Actor183: chain + Owner: Nod + Location: 47,43 + Actor184: chain + Owner: Nod + Location: 47,44 + Actor185: chain + Owner: Nod + Location: 47,45 + Actor186: chain + Owner: Nod + Location: 47,46 + Actor187: chain + Owner: Nod + Location: 43,47 + Actor188: chain + Owner: Nod + Location: 44,47 + Actor189: chain + Owner: Nod + Location: 46,47 + Actor190: chain + Owner: Nod + Location: 47,47 + Actor191: lasp + Owner: Nod + Location: 43,36 + Actor192: lasp + Owner: Nod + Location: 49,36 + Actor193: lasp + Owner: Nod + Location: 41,54 + Actor194: lasp + Owner: Nod + Location: 47,54 + Actor195: lasw + Owner: Nod + Location: 42,54 + Actor196: lasw + Owner: Nod + Location: 43,54 + Actor197: lasw + Owner: Nod + Location: 44,54 + Actor198: lasw + Owner: Nod + Location: 45,54 + Actor199: lasw + Owner: Nod + Location: 46,54 + Actor200: lasw + Owner: Nod + Location: 44,36 + Actor201: lasw + Owner: Nod + Location: 45,36 + Actor202: lasw + Owner: Nod + Location: 47,36 + Actor203: lasw + Owner: Nod + Location: 46,36 + Actor204: lasw + Owner: Nod + Location: 48,36 + Actor205: enli + Owner: Nod + SubCell: 3 + Location: 11,74 + Facing: 793 + Actor206: enli + Owner: Nod + SubCell: 3 + Location: 11,80 + Facing: 785 + Actor208: n1c + Owner: Nod + SubCell: 3 + Facing: 610 + Location: 10,30 + Actor207: brik + Owner: Nod + Location: 72,70 + Actor209: brik + Owner: Nod + Location: 72,71 + Actor210: brik + Owner: Nod + Location: 72,72 + Actor211: brik + Owner: Nod + Location: 72,73 + Actor212: brik + Owner: Nod + Location: 72,74 + Actor213: brik + Owner: Nod + Location: 72,75 + Actor214: brik + Owner: Nod + Location: 72,83 + Actor215: brik + Owner: Nod + Location: 72,82 + Actor216: brik + Owner: Nod + Location: 72,81 + Actor217: brik + Owner: Nod + Location: 72,80 + Actor218: brik + Owner: Nod + Location: 72,78 + Actor219: brik + Owner: Nod + Location: 72,77 + Actor220: brik + Owner: Nod + Location: 72,76 + Actor221: brik + Owner: Nod + Location: 72,79 + Actor222: brik + Owner: Nod + Location: 72,84 + Actor223: brik + Owner: Nod + Location: 73,70 + Actor224: brik + Owner: Nod + Location: 75,70 + Actor225: brik + Owner: Nod + Location: 74,70 + Actor226: brik + Owner: Nod + Location: 76,70 + Actor227: brik + Owner: Nod + Location: 77,70 + Actor228: brik + Owner: Nod + Location: 79,70 + Actor229: brik + Owner: Nod + Location: 78,70 + Actor230: brik + Owner: Nod + Location: 80,70 + Actor231: brik + Owner: Nod + Location: 73,84 + Actor232: brik + Owner: Nod + Location: 74,84 + Actor233: brik + Owner: Nod + Location: 75,84 + Actor234: brik + Owner: Nod + Location: 76,84 + Actor235: brik + Owner: Nod + Location: 77,84 + Actor236: brik + Owner: Nod + Location: 79,84 + Actor237: brik + Owner: Nod + Location: 80,84 + Actor238: brik + Owner: Nod + Location: 78,84 + Actor239: brik + Owner: Nod + Location: 80,83 + Actor240: brik + Owner: Nod + Location: 79,83 + Actor241: brik + Owner: Nod + Location: 80,71 + Actor242: brik + Owner: Nod + Location: 79,71 + Actor243: brik + Owner: Nod + Location: 85,70 + Actor244: brik + Owner: Nod + Location: 85,71 + Actor245: brik + Owner: Nod + Location: 84,70 + Actor246: brik + Owner: Nod + Location: 84,71 + Actor247: brik + Owner: Nod + Location: 86,70 + Actor248: brik + Owner: Nod + Location: 87,70 + Actor249: brik + Owner: Nod + Location: 88,70 + Actor250: brik + Owner: Nod + Location: 90,70 + Actor251: brik + Owner: Nod + Location: 89,70 + Actor252: brik + Owner: Nod + Location: 91,70 + Actor253: brik + Owner: Nod + Location: 92,70 + Actor254: brik + Owner: Nod + Location: 93,70 + Actor255: brik + Owner: Nod + Location: 94,70 + Actor256: brik + Owner: Nod + Location: 94,71 + Actor257: brik + Owner: Nod + Location: 94,72 + Actor258: brik + Owner: Nod + Location: 84,83 + Actor259: brik + Owner: Nod + Location: 84,84 + Actor260: brik + Owner: Nod + Location: 85,84 + Actor261: brik + Owner: Nod + Location: 85,83 + Actor262: brik + Owner: Nod + Location: 86,84 + Actor263: brik + Owner: Nod + Location: 87,84 + Actor264: brik + Owner: Nod + Location: 88,84 + Actor265: brik + Owner: Nod + Location: 89,84 + Actor266: brik + Owner: Nod + Location: 90,84 + Actor267: brik + Owner: Nod + Location: 91,84 + Actor268: brik + Owner: Nod + Location: 92,84 + Actor269: brik + Owner: Nod + Location: 93,84 + Actor270: brik + Owner: Nod + Location: 94,75 + Actor271: brik + Owner: Nod + Location: 94,74 + Actor272: brik + Owner: Nod + Location: 94,73 + Actor273: brik + Owner: Nod + Location: 93,75 + Actor274: brik + Owner: Nod + Location: 93,74 + Actor275: brik + Owner: Nod + Location: 93,79 + Actor276: brik + Owner: Nod + Location: 94,79 + Actor277: brik + Owner: Nod + Location: 93,80 + Actor278: brik + Owner: Nod + Location: 94,80 + Actor279: brik + Owner: Nod + Location: 94,81 + Actor280: brik + Owner: Nod + Location: 94,82 + Actor281: brik + Owner: Nod + Location: 94,83 + Actor282: brik + Owner: Nod + Location: 94,84 + Actor284: hand + Owner: Nod + Location: 88,71 + Actor286: gun.nod + Owner: Nod + Location: 79,69 + TurretFacing: 15 + Actor287: gun.nod + Owner: Nod + Location: 85,69 + TurretFacing: 0 + SouthEastPower2: nuk2 + Owner: Nod + Location: 73,74 + SouthEastPower1: nuk2 + Owner: Nod + Location: 73,71 + SouthEastObelisk1: obli + Owner: Nod + Location: 78,71 + SouthEastObelisk2: obli + Owner: Nod + Location: 86,71 + Actor295: hq + Owner: Nod + Location: 88,81 + SouthEastSAM2: nsam + Owner: Nod + Location: 92,71 + SouthEastSAM1: nsam + Owner: Nod + Location: 75,71 + SouthEastSAM4: nsam + Owner: Nod + Location: 76,83 + SouthEastSAM3: nsam + Owner: Nod + Location: 92,83 + SouthEastObelisk3: obli + Owner: Nod + Location: 93,73 + SouthEastObelisk4: obli + Owner: Nod + Location: 93,81 + Actor305: gun.nod + Owner: Nod + Location: 95,80 + TurretFacing: 753 + Actor306: gun.nod + Owner: Nod + Location: 95,74 + TurretFacing: 808 + Actor307: sbag + Owner: Nod + Location: 70,44 + Actor308: sbag + Owner: Nod + Location: 70,45 + Actor309: sbag + Owner: Nod + Location: 70,46 + Actor310: sbag + Owner: Nod + Location: 70,47 + Actor311: sbag + Owner: Nod + Location: 68,47 + Actor312: sbag + Owner: Nod + Location: 69,47 + Actor313: sbag + Owner: Nod + Location: 67,47 + Actor314: sbag + Owner: Nod + Location: 66,47 + Actor315: sbag + Owner: Nod + Location: 65,47 + Actor316: sbag + Owner: Nod + Location: 64,47 + Actor317: sbag + Owner: Nod + Location: 63,47 + Actor318: sbag + Owner: Nod + Location: 62,47 + Actor319: sbag + Owner: Nod + Location: 62,46 + Actor320: sbag + Owner: Nod + Location: 62,44 + Actor321: sbag + Owner: Nod + Location: 62,43 + Actor322: sbag + Owner: Nod + Location: 62,42 + Actor323: sbag + Owner: Nod + Location: 62,41 + Actor324: sbag + Owner: Nod + Location: 62,40 + Actor325: sbag + Owner: Nod + Location: 62,39 + Actor326: sbag + Owner: Nod + Location: 62,38 + Actor327: sbag + Owner: Nod + Location: 62,37 + Actor328: sbag + Owner: Nod + Location: 63,37 + Actor329: sbag + Owner: Nod + Location: 64,37 + Actor330: sbag + Owner: Nod + Location: 70,41 + Actor331: sbag + Owner: Nod + Location: 70,40 + Actor332: sbag + Owner: Nod + Location: 70,39 + Actor333: sbag + Owner: Nod + Location: 70,42 + Actor334: sbag + Owner: Nod + Location: 70,38 + Actor335: sbag + Owner: Nod + Location: 70,37 + Actor336: sbag + Owner: Nod + Location: 68,37 + Actor337: sbag + Owner: Nod + Location: 67,37 + Actor338: sbag + Owner: Nod + Location: 66,37 + Actor339: sbag + Owner: Nod + Location: 65,37 + Actor340: sbag + Owner: Nod + Location: 69,37 + Actor341: rep + Owner: Nod + Location: 65,40 + Actor342: brl3 + Owner: Nod + Location: 69,46 + Actor343: barl + Owner: Nod + Location: 69,45 + Actor344: brl3 + Owner: Nod + Location: 68,45 + Actor345: barl + Owner: Nod + Location: 68,46 + Actor346: barl + Owner: Nod + Location: 69,38 + Actor347: brl3 + Owner: Nod + Location: 69,39 + Actor348: ammobox1 + Owner: Nod + Location: 67,46 + Actor349: ammobox3 + Owner: Nod + Location: 68,38 + Actor350: n6 + Owner: Nod + SubCell: 3 + Location: 64,44 + Facing: 499 + Actor351: n6 + Owner: Nod + Location: 66,39 + SubCell: 3 + Facing: 610 + Actor352: nsam + Owner: Nod + Location: 63,38 + Actor353: nsam + Owner: Nod + Location: 63,46 + Actor354: split2 + Owner: Neutral + Location: 104,74 + Actor355: split2 + Owner: Neutral + Location: 105,86 + Actor356: split2 + Owner: Neutral + Location: 101,83 + Actor357: split2 + Owner: Neutral + Location: 72,88 + Actor358: brik + Owner: Nod + Location: 66,16 + Actor359: brik + Owner: Nod + Location: 66,15 + Actor360: brik + Owner: Nod + Location: 66,14 + Actor361: brik + Owner: Nod + Location: 66,13 + Actor362: brik + Owner: Nod + Location: 67,16 + Actor363: brik + Owner: Nod + Location: 68,16 + Actor364: brik + Owner: Nod + Location: 69,16 + Actor365: brik + Owner: Nod + Location: 69,15 + Actor366: brik + Owner: Nod + Location: 68,15 + Actor367: brik + Owner: Nod + Location: 73,16 + Actor368: brik + Owner: Nod + Location: 73,15 + Actor369: brik + Owner: Nod + Location: 74,15 + Actor370: brik + Owner: Nod + Location: 74,16 + Actor371: brik + Owner: Nod + Location: 75,16 + Actor372: brik + Owner: Nod + Location: 76,16 + Actor373: brik + Owner: Nod + Location: 76,15 + Actor374: brik + Owner: Nod + Location: 76,14 + Actor375: brik + Owner: Nod + Location: 76,13 + Actor376: brik + Owner: Nod + Location: 76,12 + Actor377: brik + Owner: Nod + Location: 78,12 + Actor378: brik + Owner: Nod + Location: 77,12 + Actor379: brik + Owner: Nod + Location: 66,12 + Actor380: brik + Owner: Nod + Location: 65,12 + Actor381: brik + Owner: Nod + Location: 64,12 + Actor383: brik + Owner: Nod + Location: 62,11 + Actor384: brik + Owner: Nod + Location: 63,11 + Actor385: brik + Owner: Nod + Location: 62,10 + Actor386: brik + Owner: Nod + Location: 62,9 + Actor387: brik + Owner: Nod + Location: 61,9 + Actor388: brik + Owner: Nod + Location: 61,8 + Actor389: brik + Owner: Nod + Location: 61,7 + Actor390: brik + Owner: Nod + Location: 78,11 + Actor391: brik + Owner: Nod + Location: 79,11 + Actor392: brik + Owner: Nod + Location: 81,11 + Actor393: brik + Owner: Nod + Location: 80,11 + Actor394: brik + Owner: Nod + Location: 82,11 + Actor395: brik + Owner: Nod + Location: 82,10 + Actor396: brik + Owner: Nod + Location: 82,9 + Actor397: brik + Owner: Nod + Location: 82,8 + Actor398: brik + Owner: Nod + Location: 82,7 + Actor399: brik + Owner: Nod + Location: 82,6 + Actor400: brik + Owner: Nod + Location: 61,6 + Actor401: brik + Owner: Nod + Location: 61,5 + Actor402: brik + Owner: Nod + Location: 61,4 + Actor403: brik + Owner: Nod + Location: 61,3 + Actor404: brik + Owner: Nod + Location: 62,3 + Actor405: brik + Owner: Nod + Location: 62,2 + Actor406: brik + Owner: Nod + Location: 62,1 + Actor407: brik + Owner: Nod + Location: 82,5 + Actor408: brik + Owner: Nod + Location: 82,4 + Actor409: brik + Owner: Nod + Location: 82,3 + Actor410: brik + Owner: Nod + Location: 82,2 + Actor411: brik + Owner: Nod + Location: 82,1 + Actor412: brik + Owner: Nod + Location: 63,1 + Actor413: brik + Owner: Nod + Location: 64,1 + Actor414: brik + Owner: Nod + Location: 65,1 + Actor415: brik + Owner: Nod + Location: 66,1 + Actor416: brik + Owner: Nod + Location: 67,1 + Actor417: brik + Owner: Nod + Location: 68,1 + Actor418: brik + Owner: Nod + Location: 69,1 + Actor419: brik + Owner: Nod + Location: 70,1 + Actor420: brik + Owner: Nod + Location: 72,1 + Actor421: brik + Owner: Nod + Location: 71,1 + Actor422: brik + Owner: Nod + Location: 74,1 + Actor423: brik + Owner: Nod + Location: 73,1 + Actor424: brik + Owner: Nod + Location: 75,1 + Actor425: brik + Owner: Nod + Location: 77,1 + Actor426: brik + Owner: Nod + Location: 78,1 + Actor427: brik + Owner: Nod + Location: 76,1 + Actor428: brik + Owner: Nod + Location: 79,1 + Actor429: brik + Owner: Nod + Location: 81,1 + Actor430: brik + Owner: Nod + Location: 80,1 + NorthObelisk3: obli + Owner: Nod + Location: 67,15 + NorthObelisk4: obli + Owner: Nod + Location: 75,15 + NorthPower4: nuk2 + Owner: Nod + Location: 80,8 + NorthPower2: nuk2 + Owner: Nod + Location: 80,5 + TempleOfNod: tmpl + Owner: Nod + Location: 70,5 + NorthHand1: hand + Owner: Nod + Location: 66,8 + Actor438: hand + Owner: Nod + Location: 75,8 + Actor440: hq + Owner: Nod + Location: 62,6 + Actor441: airs + Owner: Nod + Location: 70,9 + NorthPower1: nuk2 + Owner: Nod + Location: 78,5 + NorthPower3: nuk2 + Owner: Nod + Location: 78,8 + Actor445: gun.nod + Owner: Nod + Location: 68,19 + TurretFacing: 483 + Actor446: gun.nod + Owner: Nod + Location: 74,19 + TurretFacing: 570 + NorthSAM1: nsam + Owner: Nod + Location: 67,6 + NorthSAM2: nsam + Owner: Nod + Location: 74,6 + NorthObelisk1: obli + Owner: Nod + Location: 68,4 + NorthObelisk2: obli + Owner: Nod + Location: 74,4 + Actor451: arty.nod + Owner: Nod + Location: 36,83 + Facing: 911 + Actor453: n3c + Owner: Nod + SubCell: 3 + Location: 41,57 + Facing: 618 + Actor454: t18 + Owner: Neutral + Location: 45,72 + Actor455: t18 + Owner: Neutral + Location: 76,59 + Actor457: t18 + Owner: Neutral + Location: 96,34 + Actor458: t18 + Owner: Neutral + Location: 106,24 + Actor459: t18 + Owner: Neutral + Location: 95,2 + Actor460: t08 + Owner: Neutral + Location: 79,19 + Actor461: t08 + Owner: Neutral + Location: 56,25 + Actor462: t08 + Owner: Neutral + Location: 74,38 + Actor463: t08 + Owner: Neutral + Location: 92,48 + Actor464: t08 + Owner: Neutral + Location: 63,79 + Actor465: t08 + Owner: Neutral + Location: 39,62 + Actor466: t08 + Owner: Neutral + Location: 20,83 + Actor467: t08 + Owner: Neutral + Location: 3,26 + Actor468: t08 + Owner: Neutral + Location: 45,9 + Actor469: t09 + Owner: Neutral + Location: 35,31 + Actor470: t09 + Owner: Neutral + Location: 28,72 + Actor471: t04 + Owner: Neutral + Location: 14,56 + Actor472: t04 + Owner: Neutral + Location: 40,84 + Actor473: t04 + Owner: Neutral + Location: 67,71 + Actor474: v32 + Owner: Neutral + Location: 8,45 + Actor475: v24 + Owner: Neutral + Location: 2,35 + Actor476: rock6 + Owner: Neutral + Location: 83,46 + Actor477: rock4 + Owner: Neutral + Location: 87,45 + Actor478: t09 + Owner: Neutral + Location: 81,44 + Actor479: rock2 + Owner: Neutral + Location: 109,19 + Actor480: t18 + Owner: Neutral + Location: 109,5 + Actor481: t04 + Owner: Neutral + Location: 110,10 + Actor482: t08 + Owner: Neutral + Location: 108,4 + Actor483: v31 + Owner: Neutral + Location: 98,2 + Actor488: rock3 + Owner: Neutral + Location: 55,88 + Actor489: rock3 + Owner: Neutral + Location: 28,80 + Actor490: rock5 + Owner: Neutral + Location: 28,67 + Actor491: t04 + Owner: Neutral + Location: 3,54 + Actor492: rock5 + Owner: Neutral + Location: 11,69 + Actor493: rock4 + Owner: Neutral + Location: 13,83 + Actor495: n1 + Owner: Nod + SubCell: 3 + Location: 12,47 + Facing: 777 + Actor496: n1 + Owner: Nod + SubCell: 3 + Location: 17,48 + Facing: 864 + Actor497: n4 + Owner: Nod + SubCell: 3 + Location: 14,50 + Facing: 816 + Actor498: mech + Owner: Nod + SubCell: 3 + Location: 3,78 + Facing: 682 + Actor499: mech + Owner: Nod + SubCell: 3 + Location: 7,80 + Facing: 71 + Actor500: n1 + Owner: Nod + SubCell: 3 + Location: 52,41 + Facing: 539 + Actor501: n1 + Owner: Nod + Location: 52,41 + SubCell: 1 + Facing: 610 + Actor502: n1 + Owner: Nod + SubCell: 3 + Location: 54,40 + Facing: 384 + Actor503: n3 + Owner: Nod + SubCell: 3 + Location: 53,42 + Facing: 150 + Actor504: n4 + Owner: Nod + SubCell: 3 + Location: 53,41 + Facing: 384 + NodPatroller1a: n4 + Owner: Nod + SubCell: 3 + Location: 20,62 + Facing: 384 + NodPatroller1c: n4 + Owner: Nod + SubCell: 3 + Location: 21,63 + Facing: 384 + NodPatroller1b: n1 + Owner: Nod + SubCell: 3 + Location: 19,63 + Facing: 384 + NodPatroller2b: n1 + Owner: Nod + SubCell: 3 + Location: 20,69 + Facing: 384 + NodPatroller2a: n1 + Owner: Nod + SubCell: 3 + Location: 21,68 + Facing: 384 + NodPatroller2c: n4 + Owner: Nod + SubCell: 3 + Location: 22,69 + Facing: 384 + NodPatrol1a: waypoint + Owner: Neutral + Location: 21,63 + NodPatrol1b: waypoint + Owner: Neutral + Location: 6,61 + NodPatrol1c: waypoint + Owner: Neutral + Location: 5,53 + NodPatrol1d: waypoint + Owner: Neutral + Location: 10,49 + NodPatrol2a: waypoint + Owner: Neutral + Location: 21,65 + NodPatrol2b: waypoint + Owner: Neutral + Location: 21,77 + Actor505: ltnk + Owner: Nod + Location: 49,32 + Facing: 128 + Actor506: bggy + Owner: Nod + Facing: 384 + Location: 36,12 + Actor507: mlrs + Owner: Nod + Facing: 384 + Location: 90,26 + FirstStealthTank: stnk.nod + Owner: Nod + Location: 48,66 + Stance: Defend + Facing: 245 + Actor509: ltnk + Owner: Nod + Location: 86,66 + Facing: 128 + Actor510: bggy + Owner: Nod + Facing: 384 + Location: 75,45 + Actor511: n1 + Owner: Nod + Location: 88,74 + SubCell: 3 + Facing: 384 + Actor512: n1 + Owner: Nod + SubCell: 3 + Location: 87,73 + Facing: 602 + Actor513: n1 + Owner: Nod + Facing: 384 + Location: 88,74 + SubCell: 1 + Actor514: n1 + Owner: Nod + SubCell: 3 + Location: 88,75 + Facing: 142 + Actor515: n1 + Owner: Nod + SubCell: 3 + Location: 91,74 + Facing: 602 + Actor516: e3 + Owner: Nod + SubCell: 3 + Location: 89,74 + Facing: 563 + Actor517: n1 + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 76,45 + Actor518: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 74,44 + Actor519: n1 + Owner: Nod + SubCell: 3 + Location: 85,66 + Facing: 0 + Actor520: n1 + Owner: Nod + SubCell: 3 + Location: 87,63 + Facing: 206 + Actor521: n3 + Owner: Nod + SubCell: 3 + Location: 35,79 + Facing: 793 + Actor522: n3 + Owner: Nod + SubCell: 3 + Location: 39,83 + Facing: 71 + Actor525: afac + Owner: Nod + Location: 79,2 + Actor526: hpad.td + Owner: Nod + Location: 63,2 + Actor528: silo.td + Owner: Nod + Location: 76,2 + Actor529: rmbc + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 82,80 + Actor530: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 71,28 + Actor531: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 67,29 + Actor532: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 66,27 + Actor534: n1 + Owner: Nod + Facing: 384 + Location: 73,28 + SubCell: 1 + Actor533: n1 + Owner: Nod + Facing: 384 + Location: 69,28 + SubCell: 1 + NodPatroller3b: n1 + Owner: Nod + SubCell: 3 + Location: 60,79 + Facing: 785 + NodPatroller3a: n1 + Owner: Nod + Location: 60,79 + SubCell: 1 + Facing: 896 + NodPatroller3d: n1 + Owner: Nod + SubCell: 3 + Location: 61,82 + Facing: 872 + Actor538: bh + Owner: Nod + SubCell: 3 + Location: 72,13 + Facing: 507 + Actor539: tplr + Owner: Nod + Location: 50,57 + SubCell: 3 + Facing: 384 + Actor527: n1 + Owner: Nod + SubCell: 3 + Location: 39,49 + Facing: 674 + Actor540: n1 + Owner: Nod + SubCell: 3 + Location: 50,52 + Facing: 384 + Actor541: n1 + Owner: Nod + SubCell: 3 + Location: 38,45 + Facing: 864 + Actor542: n4 + Owner: Nod + SubCell: 3 + Location: 54,49 + Facing: 190 + NodPatroller3c: n4 + Owner: Nod + SubCell: 3 + Location: 61,80 + Facing: 1023 + NodPatrol3a: waypoint + Owner: Neutral + Location: 60,81 + NodPatrol3b: waypoint + Owner: Neutral + Location: 64,76 + NodPatrol3c: waypoint + Owner: Neutral + Location: 64,64 + Actor536: ftnk + Owner: Nod + Facing: 384 + Location: 94,9 + NodPatroller4b: bike + Owner: Nod + Location: 68,58 + Facing: 808 + NodPatroller4a: bike + Owner: Nod + Location: 70,57 + Facing: 737 + NodPatroller4c: bike + Owner: Nod + Location: 67,56 + Facing: 753 + NodPatrol4a: waypoint + Owner: Neutral + Location: 69,56 + NodPatrol4b: waypoint + Owner: Neutral + Location: 94,60 + NodPatrol4c: waypoint + Owner: Neutral + Location: 101,47 + NodPatrol4d: waypoint + Owner: Neutral + Location: 93,35 + NodPatrol4e: waypoint + Owner: Neutral + Location: 72,36 + Actor535: split2 + Owner: Neutral + Location: 102,32 + Actor543: v33 + Owner: Neutral + Location: 107,59 + Actor544: v32 + Owner: Neutral + Location: 102,60 + Actor545: v31 + Owner: Neutral + Location: 108,56 + Actor546: t08 + Owner: Neutral + Location: 107,63 + Actor547: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 93,51 + Actor548: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 101,55 + Actor549: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 90,21 + Actor550: n1 + Owner: Nod + SubCell: 3 + Location: 95,17 + Facing: 0 + Actor551: n1 + Owner: Nod + SubCell: 3 + Location: 96,8 + Facing: 515 + Actor552: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 92,7 + Actor553: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 103,18 + Actor555: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 110,59 + Actor556: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 81,75 + Actor557: n4 + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 79,54 + Actor558: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 69,21 + Actor559: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 75,11 + Actor560: n1 + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 66,11 + Actor561: n1 + Owner: Nod + SubCell: 3 + Location: 68,9 + Facing: 666 + Actor562: n1 + Owner: Nod + Facing: 384 + Location: 65,9 + SubCell: 3 + Actor563: n1 + Owner: Nod + Facing: 384 + Location: 66,11 + SubCell: 1 + SouthEastPower4: nuk2 + Owner: Nod + Location: 73,81 + SouthEastPower3: nuk2 + Owner: Nod + Location: 73,78 + Actor564: afac + Owner: Nod + Location: 76,79 + Actor565: wtnk + Owner: Nod + Facing: 384 + Location: 31,29 + EvacSpawn: waypoint + Owner: Neutral + Location: 100,1 + EvacLanding: waypoint + Owner: Neutral + Location: 94,23 + Actor567: rmbc + Owner: Nod + SubCell: 3 + Location: 82,72 + Facing: 0 + Actor568: tplr + SubCell: 3 + Location: 59,70 + Owner: Nod + Facing: 150 + Actor569: n1 + Owner: Nod + SubCell: 3 + Location: 38,68 + Facing: 0 + Actor571: n1 + Owner: Nod + SubCell: 3 + Location: 36,69 + Facing: 761 + Actor572: n1 + Owner: Nod + Location: 36,69 + SubCell: 1 + Facing: 967 + Actor570: ltnk + Owner: Nod + Facing: 384 + Location: 93,38 + Actor573: ltnk + Owner: Nod + Location: 63,23 + Facing: 650 + Actor574: stnk.nod + Owner: Nod + Facing: 384 + Location: 74,26 + Actor575: bggy + Owner: Nod + Location: 79,65 + Facing: 0 + Actor576: ltnk + Owner: Nod + Location: 97,77 + Facing: 777 + Actor577: n1 + Owner: Nod + SubCell: 3 + Location: 15,79 + Facing: 840 + Actor578: n1 + Owner: Nod + SubCell: 3 + Location: 14,75 + Facing: 689 + Actor579: n1 + Owner: Nod + Location: 15,74 + SubCell: 3 + Facing: 832 + Actor580: n3 + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 22,81 + Actor581: n4 + Owner: Nod + SubCell: 3 + Location: 8,76 + Facing: 697 + Actor582: n1 + Owner: Nod + Location: 17,37 + SubCell: 3 + Facing: 384 + Actor583: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 14,37 + Actor584: n1 + Owner: Nod + SubCell: 3 + Location: 13,25 + Facing: 0 + Actor587: n1 + Owner: Nod + Location: 17,25 + SubCell: 2 + Facing: 0 + Actor585: n1 + Owner: Nod + SubCell: 3 + Location: 34,29 + Facing: 404 + Actor588: n3 + Owner: Nod + SubCell: 3 + Facing: 118 + Location: 20,13 + HardOnlyAcolyte1: acol + Owner: Nod + SubCell: 3 + Location: 32,8 + Facing: 555 + HardOnlyAcolyte2: acol + Owner: Nod + SubCell: 3 + Location: 34,7 + Facing: 384 + HardOnlyChemWarrior1: n5 + Owner: Nod + SubCell: 3 + Location: 45,18 + Facing: 0 + HardOnlyChemWarrior2: n5 + Owner: Nod + SubCell: 3 + Location: 47,16 + Facing: 87 + SouthStealthTank: stnk.nod + Owner: Nod + Stance: Defend + Location: 50,81 + Facing: 245 + HealCrate2: healcrate + Owner: Neutral + Location: 111,50 + HealCrate1: healcrate + Owner: Neutral + Location: 58,41 + Actor590: n5 + Owner: Nod + Location: 92,52 + SubCell: 1 + Facing: 384 + Actor589: n5 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 84,28 + Actor591: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 75,19 + HardOnlyAcolyte3: acol + Owner: Nod + SubCell: 3 + Location: 45,50 + Facing: 384 + Actor592: split2 + Owner: Nod + Location: 23,7 + HealCrate3: healcrate + Owner: Neutral + Location: 30,89 + Actor593: ftnk + Owner: Nod + Location: 65,62 + Facing: 384 + Actor594: ftnk + Owner: Nod + Location: 69,65 + Facing: 384 + Actor595: n5 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 42,9 + Actor596: n4 + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 31,23 + Actor597: n4 + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 35,23 + Actor598: n5 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 42,70 + Actor599: n5 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 60,69 + Actor601: n3 + Owner: Nod + SubCell: 3 + Location: 74,14 + Facing: 467 + Actor602: n3 + Owner: Nod + SubCell: 3 + Location: 75,13 + Facing: 650 + Actor537: bh + Owner: Nod + SubCell: 3 + Location: 70,13 + Facing: 578 + Actor603: n4 + Owner: Nod + SubCell: 3 + Location: 16,49 + Facing: 864 + Actor605: n4 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 3,59 + Actor606: enli + Owner: Nod + SubCell: 3 + Location: 69,19 + Facing: 384 + Actor607: enli + Owner: Nod + SubCell: 3 + Location: 73,19 + Facing: 650 + Actor608: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 97,9 + Actor609: n1 + Owner: Nod + SubCell: 3 + Location: 82,41 + Facing: 174 + Actor610: n1 + Owner: Nod + Location: 83,40 + SubCell: 3 + Facing: 0 + Actor611: n1 + Owner: Nod + Location: 83,40 + SubCell: 1 + Facing: 182 + Actor612: n1 + Owner: Nod + SubCell: 3 + Location: 84,39 + Facing: 0 + Actor613: n1 + Owner: Nod + SubCell: 3 + Location: 84,42 + Facing: 31 + Actor614: n5 + Owner: Nod + SubCell: 3 + Location: 84,40 + Facing: 71 + Actor616: n4 + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 104,26 + Actor617: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 100,51 + Actor618: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 68,28 + Actor620: n4 + Owner: Nod + Location: 72,12 + SubCell: 1 + Facing: 384 + Actor615: n3 + Owner: Nod + SubCell: 3 + Location: 13,46 + Facing: 602 + StartTurret2: gun.nod + Owner: Nod + Location: 11,37 + TurretFacing: 618 + StartPower2: nuke + Owner: Nod + Location: 19,33 + StartLightTank: ltnk + Owner: Nod + Location: 15,31 + Facing: 0 + Actor619: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 10,37 + EasyGren1: e2 + Owner: USSR + SubCell: 3 + Location: 10,6 + Facing: 512 + EasyGren2: e2 + Owner: USSR + SubCell: 3 + Location: 12,6 + Facing: 512 + StartTurret3: gun.nod + Owner: Nod + Location: 8,34 + TurretFacing: 166 + Actor624: bggy + Owner: Nod + Facing: 384 + Location: 6,27 + Ivan: ivan + Owner: USSR + SubCell: 3 + Location: 11,9 + Facing: 512 + Actor621: gun.nod + Owner: Nod + Location: 56,72 + TurretFacing: 745 + HardOnlyTurret1: gun.nod + Owner: Nod + Location: 38,23 + TurretFacing: 404 + Actor622: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 100,7 + Actor623: n1 + SubCell: 3 + Location: 53,68 + Facing: 206 + Owner: Nod + Actor625: n1 + SubCell: 3 + Location: 54,67 + Facing: 87 + Owner: Nod + Actor626: hq + Owner: Nod + Location: 3,82 + Actor627: silo.td + Owner: Nod + Location: 6,84 + Actor628: silo.td + Owner: Nod + Location: 8,84 + Actor629: arty.nod + Owner: Nod + Facing: 384 + Location: 106,42 + Actor630: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 102,40 + Actor631: airs + Owner: Nod + Location: 81,76 + Actor632: proc.td + Owner: Nod + Location: 87,76 + Actor633: n1 + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 67,13 + Actor634: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 68,10 + Actor639: n1 + Owner: Nod + Facing: 384 + Location: 67,11 + SubCell: 4 + Actor635: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 72,17 + Actor636: n1 + Owner: Nod + SubCell: 3 + Location: 97,21 + Facing: 126 + Actor637: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 103,9 + Actor638: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 104,18 + Actor640: tplr + Owner: Nod + SubCell: 3 + Location: 72,29 + Facing: 626 + Actor641: ltnk + Owner: Nod + Facing: 384 + Location: 95,52 + Actor642: mech + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 68,42 + Actor643: rmbc + Owner: Nod + SubCell: 3 + Facing: 674 + Location: 69,7 + Actor644: ftnk + Owner: Nod + Facing: 261 + Location: 72,8 + EntranceReveal2: waypoint + Owner: Neutral + Location: 82,69 + EntranceReveal1: waypoint + Owner: Neutral + Location: 15,76 + EntranceReveal3: waypoint + Owner: Neutral + Location: 71,19 + MidRespawn: waypoint + Owner: Neutral + Location: 46,40 + Actor645: mlrs + Owner: Nod + Location: 69,5 + Facing: 512 + Actor646: mlrs + Owner: Nod + Location: 73,5 + Facing: 512 + NodAssassin3: assa + Owner: Nod + SubCell: 3 + Location: 65,7 + Facing: 384 + NodAssassin2: assa + Owner: Nod + SubCell: 3 + Location: 72,3 + Facing: 491 + NodAssassin1: assa + Owner: Nod + Location: 74,10 + SubCell: 3 + Facing: 634 + NorthSAM4: nsam + Owner: Nod + Location: 76,11 + NorthSAM3: nsam + Owner: Nod + Location: 64,11 + Actor649: brik + Owner: Nod + Location: 63,12 + CommandoTrigger1: waypoint + Owner: Neutral + Location: 72,48 + CommandoTrigger2: waypoint + Owner: Neutral + Location: 99,48 + Actor647: bggy + Owner: Nod + Location: 67,77 + Facing: 128 + Actor648: bggy + Owner: Nod + Location: 78,77 + Facing: 0 + Actor650: bggy + Owner: Nod + Location: 91,75 + Facing: 384 + Actor651: bggy + Owner: Nod + Facing: 384 + Location: 90,61 + LeftObelisk: obli + Owner: Nod + Location: 36,20 + LaserFenceReveal: waypoint + Owner: Neutral + Location: 33,22 + StartHand: hand + Owner: Nod + Location: 17,27 + StartComms: hq + Owner: Nod + Location: 22,33 + MidHand: hand + Owner: Nod + Location: 52,38 + MidComms: hq + Owner: Nod + Location: 51,50 + Actor652: camera + Owner: Nod + Location: 32,12 + Actor653: camera + Owner: Nod + Location: 50,61 + Actor654: camera + Owner: Nod + Location: 72,38 + Actor655: camera + Owner: Nod + Location: 71,20 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-doctrines.yaml, ca|rules/custom/commando-mission.yaml, domination-rules.yaml + +Sequences: domination-sequences.yaml + +Weapons: ca|weapons/custom/campaign.yaml, domination-weapons.yaml diff --git a/mods/ca/missions/main-campaign/ca17-domination/r2_codesacquired.aud b/mods/ca/missions/main-campaign/ca17-domination/r2_codesacquired.aud new file mode 100644 index 0000000000..b9a49fcbb8 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca17-domination/r2_codesacquired.aud differ diff --git a/mods/ca/missions/main-campaign/ca17-domination/r2_codesrequired.aud b/mods/ca/missions/main-campaign/ca17-domination/r2_codesrequired.aud new file mode 100644 index 0000000000..8c2e3e99ec Binary files /dev/null and b/mods/ca/missions/main-campaign/ca17-domination/r2_codesrequired.aud differ diff --git a/mods/ca/missions/main-campaign/ca17-domination/r2_extraction.aud b/mods/ca/missions/main-campaign/ca17-domination/r2_extraction.aud new file mode 100644 index 0000000000..8daa990d50 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca17-domination/r2_extraction.aud differ diff --git a/mods/ca/missions/main-campaign/ca17-domination/r2_templelocated.aud b/mods/ca/missions/main-campaign/ca17-domination/r2_templelocated.aud new file mode 100644 index 0000000000..52a186ffaa Binary files /dev/null and b/mods/ca/missions/main-campaign/ca17-domination/r2_templelocated.aud differ diff --git a/mods/ca/missions/main-campaign/ca17-domination/r_codesacquired.aud b/mods/ca/missions/main-campaign/ca17-domination/r_codesacquired.aud new file mode 100644 index 0000000000..a6bb355b3c Binary files /dev/null and b/mods/ca/missions/main-campaign/ca17-domination/r_codesacquired.aud differ diff --git a/mods/ca/missions/main-campaign/ca17-domination/r_codesrequired.aud b/mods/ca/missions/main-campaign/ca17-domination/r_codesrequired.aud new file mode 100644 index 0000000000..4aab00e3b3 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca17-domination/r_codesrequired.aud differ diff --git a/mods/ca/missions/main-campaign/ca17-domination/r_extraction.aud b/mods/ca/missions/main-campaign/ca17-domination/r_extraction.aud new file mode 100644 index 0000000000..f96541c4d8 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca17-domination/r_extraction.aud differ diff --git a/mods/ca/missions/main-campaign/ca17-domination/r_templelocated.aud b/mods/ca/missions/main-campaign/ca17-domination/r_templelocated.aud new file mode 100644 index 0000000000..d9fe06c8da Binary files /dev/null and b/mods/ca/missions/main-campaign/ca17-domination/r_templelocated.aud differ diff --git a/mods/ca/missions/main-campaign/ca18-succession/map.bin b/mods/ca/missions/main-campaign/ca18-succession/map.bin new file mode 100644 index 0000000000..257774db10 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca18-succession/map.bin differ diff --git a/mods/ca/missions/main-campaign/ca18-succession/map.png b/mods/ca/missions/main-campaign/ca18-succession/map.png new file mode 100644 index 0000000000..e8a1de3bf9 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca18-succession/map.png differ diff --git a/mods/ca/missions/main-campaign/ca18-succession/map.yaml b/mods/ca/missions/main-campaign/ca18-succession/map.yaml new file mode 100644 index 0000000000..3981452e7f --- /dev/null +++ b/mods/ca/missions/main-campaign/ca18-succession/map.yaml @@ -0,0 +1,3091 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 18: Succession + +Author: Darkademic + +Tileset: DESERT + +MapSize: 130,130 + +Bounds: 1,1,128,128 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: USSR, Nod, Nod2 + PlayerReference@USSR: + Name: USSR + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: soviet + LockColor: True + Color: FE1100 + LockSpawn: True + LockTeam: True + Allies: SpyPlaneProvider + Enemies: Nod, Nod2, Creeps + PlayerReference@Nod: + Name: Nod + Bot: campaign + Faction: nod + Color: 6D738C + Allies: Nod2 + Enemies: USSR, Creeps + PlayerReference@Nod2: + Name: Nod2 + Bot: campaign + Faction: nod + Color: 6D738C + Allies: Nod + Enemies: USSR, Creeps + PlayerReference@SpyPlaneProvider: + Name: SpyPlaneProvider + NonCombatant: True + Faction: soviet + Color: FE1100 + Allies: USSR + +Actors: + Actor44: rock2 + Owner: Neutral + Location: 10,34 + Actor45: t18 + Owner: Neutral + Location: 25,33 + Actor47: t08 + Owner: Neutral + Location: 37,35 + Actor48: t08 + Owner: Neutral + Location: 9,37 + Actor49: t08 + Owner: Neutral + Location: 111,37 + Actor50: rock4 + Owner: Neutral + Location: 41,39 + Actor52: t09 + Owner: Neutral + Location: 25,40 + Actor55: rock1 + Owner: Neutral + Location: 40,40 + Actor57: t04 + Owner: Neutral + Location: 7,42 + Actor58: tc01 + Owner: Neutral + Location: 60,42 + Actor64: rock6 + Owner: Neutral + Location: 76,45 + Actor65: t08 + Owner: Neutral + Location: 13,47 + Actor66: t04 + Owner: Neutral + Location: 119,46 + Actor67: t04 + Owner: Neutral + Location: 101,47 + Actor70: tc01 + Owner: Neutral + Location: 18,48 + Actor74: t09 + Owner: Neutral + Location: 5,52 + Actor75: rock2 + Owner: Neutral + Location: 107,52 + Actor77: t04 + Owner: Neutral + Location: 21,53 + Actor78: t08 + Owner: Neutral + Location: 39,54 + Actor79: rock4 + Owner: Neutral + Location: 57,55 + Actor81: split2 + Owner: Neutral + Location: 95,56 + Actor82: t08 + Owner: Neutral + Location: 19,58 + Actor83: tc01 + Owner: Neutral + Location: 33,57 + Actor84: t08 + Owner: Neutral + Location: 56,59 + Actor85: tc01 + Owner: Neutral + Location: 84,58 + Actor86: tc01 + Owner: Neutral + Location: 109,58 + Actor87: tc01 + Owner: Neutral + Location: 5,59 + Actor88: rock6 + Owner: Neutral + Location: 113,64 + Actor89: t09 + Owner: Neutral + Location: 59,68 + Actor90: rock7 + Owner: Neutral + Location: 93,68 + Actor91: t08 + Owner: Neutral + Location: 113,69 + Actor92: t08 + Owner: Neutral + Location: 8,70 + Actor93: t08 + Owner: Neutral + Location: 103,70 + Actor94: rock2 + Owner: Neutral + Location: 32,73 + Actor95: t09 + Owner: Neutral + Location: 43,73 + Actor96: split2 + Owner: Neutral + Location: 53,73 + Actor97: split2 + Owner: Neutral + Location: 46,75 + Actor98: tc01 + Owner: Neutral + Location: 92,74 + Actor99: rock1 + Owner: Neutral + Location: 10,76 + Actor100: rock3 + Owner: Neutral + Location: 24,76 + Actor101: split2 + Owner: Neutral + Location: 113,77 + Actor102: rock6 + Owner: Neutral + Location: 54,78 + Actor103: tc01 + Owner: Neutral + Location: 38,79 + Actor104: tc01 + Owner: Neutral + Location: 109,79 + Actor105: obli + Owner: Nod + Location: 74,81 + Actor106: tc01 + Owner: Neutral + Location: 13,81 + Actor107: nsam + Owner: Nod + Location: 71,82 + Actor108: t08 + Owner: Neutral + Location: 86,82 + Actor109: rock1 + Owner: Neutral + Location: 64,82 + Actor110: mlrs + Owner: Nod + Facing: 919 + Location: 72,84 + Actor111: rock4 + Owner: Neutral + Location: 103,84 + Actor112: ltnk + Owner: Nod + Facing: 0 + Location: 62,85 + Actor113: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 77,85 + Actor114: n1 + Owner: Nod + SubCell: 1 + Facing: 0 + Location: 77,85 + Actor115: split2 + Owner: Neutral + Location: 19,86 + Actor116: n1 + Owner: Nod + SubCell: 3 + Facing: 142 + Location: 62,86 + Actor117: n1 + Owner: Nod + SubCell: 1 + Facing: 0 + Location: 62,86 + Actor118: n3 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 71,86 + Actor119: ltnk + Owner: Nod + Facing: 0 + Location: 78,86 + Actor120: n1 + Owner: Nod + SubCell: 3 + Facing: 39 + Location: 80,86 + Actor121: t09 + Owner: Neutral + Location: 83,86 + Actor122: n1 + Owner: Nod + SubCell: 3 + Facing: 919 + Location: 85,86 + Actor123: n1 + Owner: Nod + SubCell: 1 + Facing: 745 + Location: 85,86 + Actor124: ltnk + Owner: Nod + Facing: 118 + Location: 49,87 + Actor125: ltnk + Owner: Nod + Facing: 0 + Location: 56,87 + Actor126: n1 + Owner: Nod + SubCell: 3 + Facing: 39 + Location: 59,87 + Actor127: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 77,87 + Actor128: n3 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 79,87 + Actor129: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 81,87 + Actor130: ltnk + Owner: Nod + Facing: 0 + Location: 85,87 + Actor131: n1 + Owner: Nod + SubCell: 3 + Facing: 721 + Location: 87,87 + Actor132: rock1 + Owner: Neutral + Location: 124,86 + Actor133: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 48,88 + Actor134: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 50,88 + Actor135: n1 + Owner: Nod + SubCell: 1 + Facing: 198 + Location: 50,88 + Actor136: gun.nod + Owner: Nod + TurretFacing: 118 + Location: 54,88 + Actor137: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 56,88 + Actor138: gun.nod + Owner: Nod + TurretFacing: 0 + Location: 60,88 + Actor139: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 61,88 + Actor140: nsam + Owner: Nod + Location: 66,88 + Actor141: gun.nod + Owner: Nod + Location: 50,89 + Actor142: brik + Owner: Nod + Location: 51,89 + Actor143: brik + Owner: Nod + Location: 52,89 + Actor144: brik + Owner: Nod + Location: 53,89 + Actor145: brik + Owner: Nod + Location: 54,89 + Actor146: brik + Owner: Nod + Location: 55,89 + Actor147: brik + Owner: Nod + Location: 59,89 + Actor148: brik + Owner: Nod + Location: 60,89 + Actor149: brik + Owner: Nod + Location: 61,89 + Actor150: brik + Owner: Nod + Location: 62,89 + Actor151: brik + Owner: Nod + Location: 63,89 + Actor152: mlrs + Owner: Nod + Facing: 95 + Location: 64,89 + Actor153: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 65,89 + Actor154: gun.nod + Owner: Nod + TurretFacing: 15 + Location: 80,89 + Actor155: n3 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 85,89 + Actor156: gun.nod + Owner: Nod + TurretFacing: 0 + Location: 86,89 + Actor158: t08 + Owner: Neutral + Location: 28,90 + Actor159: n1 + Owner: Nod + SubCell: 3 + Facing: 174 + Location: 46,90 + Actor160: n1 + Owner: Nod + SubCell: 3 + Facing: 198 + Location: 49,90 + Actor161: brik + Owner: Nod + Location: 51,90 + Actor162: brik + Owner: Nod + Location: 52,90 + Actor163: obli + Owner: Nod + Location: 53,90 + Actor164: brik + Owner: Nod + Location: 54,90 + Actor165: brik + Owner: Nod + Location: 55,90 + Actor166: n4 + Owner: Nod + SubCell: 3 + Facing: 15 + Location: 57,90 + Actor167: brik + Owner: Nod + Location: 59,90 + Actor168: brik + Owner: Nod + Location: 60,90 + Actor169: obli + Owner: Nod + Location: 61,90 + Actor170: brik + Owner: Nod + Location: 62,90 + Actor171: brik + Owner: Nod + Location: 63,90 + Actor172: n3 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 73,90 + Actor173: brik + Owner: Nod + Location: 76,90 + Actor174: brik + Owner: Nod + Location: 77,90 + Actor175: brik + Owner: Nod + Location: 78,90 + Actor176: brik + Owner: Nod + Location: 79,90 + Actor177: brik + Owner: Nod + Location: 80,90 + Actor178: brik + Owner: Nod + Location: 81,90 + Actor179: brik + Owner: Nod + Location: 85,90 + Actor180: brik + Owner: Nod + Location: 86,90 + Actor181: brik + Owner: Nod + Location: 87,90 + Actor182: t08 + Owner: Neutral + Location: 126,90 + Actor183: rock4 + Owner: Neutral + Location: 14,91 + Actor184: ltnk + Owner: Nod + Facing: 111 + Location: 45,91 + Actor185: n4 + Owner: Nod + SubCell: 3 + Facing: 182 + Location: 48,91 + Actor186: n3 + Owner: Nod + SubCell: 3 + Facing: 158 + Location: 50,91 + Actor187: n3 + Owner: Nod + SubCell: 3 + Facing: 7 + Location: 56,91 + Actor188: airs + Owner: Nod + Location: 67,91 + Actor189: brik + Owner: Nod + Location: 76,91 + Actor190: brik + Owner: Nod + Location: 77,91 + Actor191: obli + Owner: Nod + Location: 79,91 + Actor192: brik + Owner: Nod + Location: 80,91 + Actor193: brik + Owner: Nod + Location: 81,91 + Actor194: brik + Owner: Nod + Location: 85,91 + Actor195: brik + Owner: Nod + Location: 86,91 + Actor196: brik + Owner: Nod + Location: 87,91 + Actor197: n1 + Owner: Nod + SubCell: 3 + Facing: 277 + Location: 44,92 + Actor198: gun.nod + Owner: Nod + Location: 46,92 + Actor199: n4 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 84,92 + Actor200: obli + Owner: Nod + Location: 86,92 + Actor201: brik + Owner: Nod + Location: 87,92 + Actor202: t08 + Owner: Neutral + Location: 111,92 + Actor203: brik + Owner: Nod + Location: 43,93 + Actor204: brik + Owner: Nod + Location: 44,93 + Actor205: brik + Owner: Nod + Location: 45,93 + Actor206: brik + Owner: Nod + Location: 46,93 + Actor207: brik + Owner: Nod + Location: 47,93 + Actor208: nuk2 + Owner: Nod + Location: 62,93 + Actor209: nuk2 + Owner: Nod + Location: 64,93 + Actor210: rep + Owner: Nod + Location: 73,93 + Actor211: n4 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 80,93 + Actor213: brik + Owner: Nod + Location: 86,93 + Actor214: brik + Owner: Nod + Location: 87,93 + Actor215: rock4 + Owner: Neutral + Location: 28,94 + Actor216: t09 + Owner: Neutral + Location: 35,94 + Actor217: ltnk + Owner: Nod + Facing: 256 + Location: 40,94 + Actor218: n1 + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 41,94 + Actor219: n1 + Owner: Nod + SubCell: 1 + Facing: 150 + Location: 41,94 + Actor220: brik + Owner: Nod + Location: 43,94 + Actor221: brik + Owner: Nod + Location: 44,94 + Actor222: obli + Owner: Nod + Location: 45,94 + Actor223: brik + Owner: Nod + Location: 46,94 + Actor224: brik + Owner: Nod + Location: 47,94 + Actor225: mlrs + Owner: Nod + Facing: 126 + Location: 49,94 + Actor226: hftk + Owner: Nod + Facing: 118 + Location: 52,94 + Actor227: hand + Owner: Nod + Location: 56,94 + Actor228: n3 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 85,94 + Actor229: brik + Owner: Nod + Location: 86,94 + Actor230: t18 + Owner: Neutral + Location: 122,93 + Actor231: rock5 + Owner: Neutral + Location: 12,95 + Actor232: brik + Owner: Nod + Location: 43,95 + Actor233: obli + Owner: Nod + Location: 44,95 + Actor234: nsam + Owner: Nod + Location: 59,95 + Actor235: hand + Owner: Nod + Location: 79,95 + Actor236: brik + Owner: Nod + Location: 86,95 + Actor237: tc01 + Owner: Neutral + Location: 102,94 + Actor238: rock4 + Owner: Neutral + Location: 127,95 + Actor239: n1 + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 41,96 + Actor240: gun.nod + Owner: Nod + TurretFacing: 245 + Location: 42,96 + Actor241: brik + Owner: Nod + Location: 43,96 + Actor242: brik + Owner: Nod + Location: 44,96 + Actor243: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 45,96 + Actor244: nsam + Owner: Nod + Location: 46,96 + Actor245: brik + Owner: Nod + Location: 86,96 + Actor246: brik + Owner: Nod + Location: 87,96 + Actor247: brik + Owner: Nod + Location: 43,97 + Actor248: brik + Owner: Nod + Location: 44,97 + Actor249: chain + Owner: Nod + Location: 62,97 + Actor250: chain + Owner: Nod + Location: 63,97 + Actor251: chain + Owner: Nod + Location: 64,97 + Actor252: chain + Owner: Nod + Location: 65,97 + Actor253: chain + Owner: Nod + Location: 66,97 + Actor254: chain + Owner: Nod + Location: 67,97 + Actor255: chain + Owner: Nod + Location: 68,97 + Actor256: chain + Owner: Nod + Location: 69,97 + Actor257: chain + Owner: Nod + Location: 70,97 + Actor258: chain + Owner: Nod + Location: 71,97 + Actor259: hq + Owner: Nod + Location: 75,97 + Actor260: brik + Owner: Nod + Location: 86,97 + Actor261: brik + Owner: Nod + Location: 87,97 + Actor262: chain + Owner: Nod + Location: 62,98 + Actor263: nuk2 + Owner: Nod + Location: 63,98 + Actor264: nuk2 + Owner: Nod + Location: 65,98 + Actor265: nuk2 + Owner: Nod + Location: 67,98 + Actor266: nuk2 + Owner: Nod + Location: 69,98 + Actor267: chain + Owner: Nod + Location: 71,98 + Actor268: ltnk + Owner: Nod + Facing: 256 + Location: 38,99 + Actor269: n4 + Owner: Nod + SubCell: 3 + Facing: 190 + Location: 42,99 + Actor270: nuk2 + Owner: Nod + Location: 53,99 + Actor271: nuk2 + Owner: Nod + Location: 55,99 + Actor272: afac + Owner: Nod + Location: 58,99 + Actor273: chain + Owner: Nod + Location: 62,99 + Actor274: chain + Owner: Nod + Location: 71,99 + Actor275: nsam + Owner: Nod + Location: 85,99 + Actor280: proc.td + Owner: Nod + Location: 87,99 + Actor282: chain + Owner: Nod + Location: 62,100 + Actor283: chain + Owner: Nod + Location: 71,100 + Actor284: nuk2 + Owner: Nod + Location: 79,100 + Actor285: n1 + Owner: Nod + SubCell: 3 + Facing: 158 + Location: 42,101 + Actor286: n1 + Owner: Nod + SubCell: 1 + Facing: 190 + Location: 42,101 + Actor288: brik + Owner: Nod + Location: 43,101 + Actor289: brik + Owner: Nod + Location: 44,101 + Actor291: chain + Owner: Nod + Location: 62,101 + Actor295: nuk2 + Owner: Nod + Location: 63,101 + Actor297: nuk2 + Owner: Nod + Location: 65,101 + Actor298: nuk2 + Owner: Nod + Location: 67,101 + Actor299: nuk2 + Owner: Nod + Location: 69,101 + Actor303: chain + Owner: Nod + Location: 71,101 + Actor304: gun.nod + Owner: Nod + TurretFacing: 245 + Location: 42,102 + Actor305: brik + Owner: Nod + Location: 43,102 + Actor306: brik + Owner: Nod + Location: 44,102 + Actor307: n3 + Owner: Nod + SubCell: 3 + Facing: 610 + Location: 46,102 + Actor308: n3 + Owner: Nod + Facing: 384 + SubCell: 1 + Location: 46,102 + Actor311: hand + Owner: Nod + Location: 50,102 + Actor312: chain + Owner: Nod + Location: 62,102 + Actor340: chain + Owner: Nod + Location: 71,102 + Actor341: brik + Owner: Nod + Location: 43,103 + Actor342: obli + Owner: Nod + Location: 44,103 + Actor343: chain + Owner: Nod + Location: 62,103 + Actor344: chain + Owner: Nod + Location: 71,103 + Actor345: nuk2 + Owner: Nod + Location: 79,103 + Actor346: rock6 + Owner: Neutral + Location: 22,103 + Actor347: n1 + Owner: Nod + SubCell: 3 + Facing: 206 + Location: 41,104 + Actor348: brik + Owner: Nod + Location: 43,104 + Actor349: mlrs + Owner: Nod + Facing: 253 + Location: 45,104 + Actor350: nsam + Owner: Nod + Location: 46,104 + Actor351: chain + Owner: Nod + Location: 62,104 + Actor352: chain + Owner: Nod + Location: 63,104 + Actor353: chain + Owner: Nod + Location: 64,104 + Actor354: chain + Owner: Nod + Location: 65,104 + Actor355: chain + Owner: Nod + Location: 66,104 + Actor356: chain + Owner: Nod + Location: 67,104 + Actor357: chain + Owner: Nod + Location: 68,104 + Actor358: chain + Owner: Nod + Location: 69,104 + Actor359: chain + Owner: Nod + Location: 70,104 + Actor360: chain + Owner: Nod + Location: 71,104 + Actor361: proc.td + Owner: Nod + Location: 85,104 + Actor362: brik + Owner: Nod + Location: 43,105 + Actor363: obli + Owner: Nod + Location: 55,105 + Actor364: nsam + Owner: Nod + Location: 89,105 + Actor365: brik + Owner: Nod + Location: 43,106 + Actor366: obli + Owner: Nod + Location: 44,106 + Actor367: brik + Owner: Nod + Location: 90,106 + Actor368: brik + Owner: Nod + Location: 91,106 + Actor369: split2 + Owner: Neutral + Location: 99,106 + Actor370: n1 + Owner: Nod + SubCell: 3 + Facing: 222 + Location: 41,107 + Actor371: n1 + Owner: Nod + SubCell: 1 + Facing: 237 + Location: 41,107 + Actor372: gun.nod + Owner: Nod + TurretFacing: 277 + Location: 42,107 + Actor373: brik + Owner: Nod + Location: 43,107 + Actor374: brik + Owner: Nod + Location: 44,107 + Actor375: tmpl + Owner: Nod + Location: 64,107 + Actor376: mlrs + Owner: Nod + Facing: 634 + Location: 89,107 + Actor377: brik + Owner: Nod + Location: 90,107 + Actor378: brik + Owner: Nod + Location: 91,107 + Actor379: ltnk + Owner: Nod + Facing: 256 + Location: 40,108 + Actor380: n1 + Owner: Nod + SubCell: 3 + Facing: 214 + Location: 41,108 + Actor381: brik + Owner: Nod + Location: 43,108 + Actor382: brik + Owner: Nod + Location: 44,108 + Actor383: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 46,108 + Actor384: rep + Owner: Nod + Location: 49,108 + Actor385: nsam + Owner: Nod + Location: 61,108 + Actor386: waypoint + Owner: Neutral + Location: 65,108 + Actor387: nsam + Owner: Nod + Location: 68,108 + Actor388: hpad.td + Owner: Nod + Location: 78,108 + Actor389: brik + Owner: Nod + Location: 91,108 + Actor390: t08 + Owner: Neutral + Location: 109,108 + Actor391: tc01 + Owner: Neutral + Location: 27,108 + Actor392: rock1 + Owner: Neutral + Location: 56,108 + Actor393: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 87,109 + Actor394: obli + Owner: Nod + Location: 90,109 + Actor395: brik + Owner: Nod + Location: 91,109 + Actor396: rock1 + Owner: Neutral + Location: 116,108 + Actor397: obli + Owner: Nod + Location: 74,110 + Actor398: hpad.td + Owner: Nod + Location: 81,110 + Actor399: hftk + Owner: Nod + Facing: 658 + Location: 86,110 + Actor400: brik + Owner: Nod + Location: 90,110 + Actor401: brik + Owner: Nod + Location: 91,110 + Actor402: gun.nod + Owner: Nod + TurretFacing: 769 + Location: 92,110 + Actor403: n4 + Owner: Nod + SubCell: 3 + Facing: 317 + Location: 42,111 + Actor404: ltur + Owner: Nod + TurretFacing: 245 + Location: 56,111 + CyborgFactory1: bio + Owner: Nod + Location: 63,111 + CyborgFactory2: bio + Owner: Nod + Location: 66,111 + Actor407: brik + Owner: Nod + Location: 90,111 + Actor408: brik + Owner: Nod + Location: 91,111 + Actor409: tc01 + Owner: Neutral + Location: 121,110 + Actor410: t08 + Owner: Neutral + Location: 35,112 + Actor411: n1 + Owner: Nod + SubCell: 3 + Location: 42,112 + Facing: 190 + Actor412: brik + Owner: Nod + Location: 43,112 + Actor413: brik + Owner: Nod + Location: 44,112 + Actor414: nsam + Owner: Nod + Location: 58,112 + Actor415: nsam + Owner: Nod + Location: 71,112 + Actor416: hpad.td + Owner: Nod + Location: 78,112 + Actor417: n1 + Owner: Nod + SubCell: 3 + Facing: 856 + Location: 92,112 + Actor418: n1 + Owner: Nod + SubCell: 1 + Facing: 793 + Location: 92,112 + Actor419: ltnk + Owner: Nod + Facing: 256 + Location: 40,113 + Actor420: gun.nod + Owner: Nod + Location: 42,113 + Actor421: brik + Owner: Nod + Location: 43,113 + Actor422: brik + Owner: Nod + Location: 44,113 + Actor423: n3 + Owner: Nod + SubCell: 3 + Facing: 301 + Location: 45,113 + Actor424: airs + Owner: Nod + Location: 49,113 + Actor425: ltur + Owner: Nod + TurretFacing: 721 + Location: 75,113 + Actor427: n3 + Owner: Nod + SubCell: 3 + Facing: 721 + Location: 89,113 + Actor428: n4 + Owner: Nod + SubCell: 3 + Facing: 745 + Location: 90,113 + Actor429: n1 + Owner: Nod + SubCell: 3 + Facing: 206 + Location: 41,114 + Actor430: n1 + Owner: Nod + SubCell: 1 + Facing: 198 + Location: 41,114 + Actor431: brik + Owner: Nod + Location: 43,114 + Actor432: obli + Owner: Nod + Location: 44,114 + Actor433: gun.nod + Owner: Nod + TurretFacing: 777 + Location: 92,114 + Actor434: brik + Owner: Nod + Location: 43,115 + Actor435: mlrs + Owner: Nod + Facing: 261 + Location: 45,115 + Actor436: nsam + Owner: Nod + Location: 46,115 + TemplePrime: tmpp + Owner: Nod + Location: 64,114 + Actor438: rock4 + Owner: Neutral + Location: 22,116 + Actor439: brik + Owner: Nod + Location: 43,116 + Actor440: ltnk + Owner: Nod + Facing: 753 + Location: 90,116 + Actor441: n1 + Owner: Nod + SubCell: 3 + Facing: 737 + Location: 92,116 + Actor442: brik + Owner: Nod + Location: 43,117 + Actor443: obli + Owner: Nod + Location: 44,117 + Actor444: ltur + Owner: Nod + TurretFacing: 293 + Location: 57,117 + Actor446: ltur + Owner: Nod + TurretFacing: 745 + Location: 73,117 + Actor447: n4 + Owner: Nod + SubCell: 3 + Facing: 737 + Location: 89,117 + Actor448: n3 + Owner: Nod + SubCell: 3 + Facing: 864 + Location: 90,117 + Actor449: n1 + Owner: Nod + SubCell: 3 + Facing: 626 + Location: 92,117 + Actor450: brik + Owner: Nod + Location: 43,118 + Actor451: brik + Owner: Nod + Location: 44,118 + Actor452: nuk2 + Owner: Nod + Location: 50,118 + Actor453: nuk2 + Owner: Nod + Location: 52,118 + Actor454: nuk2 + Owner: Nod + Location: 54,118 + CyborgFactory3: bio + Owner: Nod + Location: 63,118 + CyborgFactory4: bio + Owner: Nod + Location: 66,118 + Actor457: nuk2 + Owner: Nod + Location: 75,118 + Actor458: brik + Owner: Nod + Location: 90,118 + Actor459: brik + Owner: Nod + Location: 91,118 + Actor460: n1 + Owner: Nod + SubCell: 3 + Facing: 872 + Location: 93,118 + Actor461: n1 + Owner: Nod + SubCell: 1 + Facing: 785 + Location: 93,118 + Actor462: split2 + Owner: Neutral + Location: 111,118 + Actor463: brik + Owner: Nod + Location: 43,119 + Actor464: brik + Owner: Nod + Location: 44,119 + Actor465: obli + Owner: Nod + Location: 61,119 + Actor466: obli + Owner: Nod + Location: 69,119 + Actor467: nsam + Owner: Nod + Location: 87,119 + Actor468: brik + Owner: Nod + Location: 90,119 + Actor469: brik + Owner: Nod + Location: 91,119 + Actor470: gun.nod + Owner: Nod + TurretFacing: 785 + Location: 92,119 + Actor471: nsam + Owner: Nod + Location: 57,120 + Actor472: nsam + Owner: Nod + Location: 72,120 + Actor473: nuk2 + Owner: Nod + Location: 77,120 + Actor474: mlrs + Owner: Nod + Facing: 769 + Location: 88,120 + Actor475: obli + Owner: Nod + Location: 90,120 + Actor476: brik + Owner: Nod + Location: 91,120 + Actor477: brik + Owner: Nod + Location: 91,121 + Actor478: brik + Owner: Nod + Location: 81,122 + Actor479: brik + Owner: Nod + Location: 82,122 + Actor480: nuk2 + Owner: Nod + Location: 86,122 + Actor481: nuk2 + Owner: Nod + Location: 88,122 + Actor482: brik + Owner: Nod + Location: 90,122 + Actor483: brik + Owner: Nod + Location: 91,122 + Actor484: rock4 + Owner: Neutral + Location: 45,123 + Actor485: brik + Owner: Nod + Location: 81,123 + Actor486: brik + Owner: Nod + Location: 82,123 + Actor487: brik + Owner: Nod + Location: 83,123 + Actor488: brik + Owner: Nod + Location: 84,123 + Actor489: brik + Owner: Nod + Location: 90,123 + Actor490: brik + Owner: Nod + Location: 91,123 + Actor491: split2 + Owner: Neutral + Location: 101,123 + Actor492: split2 + Owner: Neutral + Location: 123,123 + Actor493: tc01 + Owner: Neutral + Location: 34,123 + Actor494: rock2 + Owner: Neutral + Location: 50,124 + Actor495: brik + Owner: Nod + Location: 84,124 + Actor496: brik + Owner: Nod + Location: 90,124 + Actor497: brik + Owner: Nod + Location: 84,125 + Actor498: nuk2 + Owner: Nod + Location: 86,125 + Actor499: nuk2 + Owner: Nod + Location: 88,125 + Actor500: brik + Owner: Nod + Location: 90,125 + Actor501: tc01 + Owner: Neutral + Location: 47,125 + Actor502: brik + Owner: Nod + Location: 84,126 + Actor503: brik + Owner: Nod + Location: 90,126 + Actor504: brik + Owner: Nod + Location: 84,127 + Actor505: brik + Owner: Nod + Location: 85,127 + Actor506: brik + Owner: Nod + Location: 90,127 + Actor507: brik + Owner: Nod + Location: 85,128 + Actor508: brik + Owner: Nod + Location: 86,128 + Actor509: brik + Owner: Nod + Location: 87,128 + Actor510: brik + Owner: Nod + Location: 88,128 + Actor511: brik + Owner: Nod + Location: 89,128 + Actor512: brik + Owner: Nod + Location: 90,128 + Actor513: split2 + Owner: Neutral + Location: 6,22 + Actor514: split2 + Owner: Neutral + Location: 5,16 + Actor515: split2 + Owner: Neutral + Location: 115,13 + Actor516: split2 + Owner: Neutral + Location: 121,11 + Actor445: split2 + Owner: Neutral + Location: 54,22 + Actor517: split2 + Owner: Neutral + Location: 60,23 + Actor518: tc01 + Owner: Neutral + Location: 71,27 + Actor519: tc01 + Owner: Neutral + Location: 33,24 + Actor521: tc01 + Owner: Neutral + Location: 103,9 + Actor522: tc01 + Owner: Neutral + Location: 112,22 + Actor523: rock6 + Owner: Neutral + Location: 93,25 + Actor524: rock2 + Owner: Neutral + Location: 96,18 + Actor525: rock7 + Owner: Neutral + Location: 27,18 + Actor526: t08 + Owner: Neutral + Location: 74,18 + Actor527: t08 + Owner: Neutral + Location: 98,20 + Actor528: t08 + Owner: Neutral + Location: 123,3 + Actor529: t08 + Owner: Neutral + Location: 126,18 + Actor530: t08 + Owner: Neutral + Location: 17,19 + Actor531: rock6 + Owner: Neutral + Location: 30,15 + Actor520: mcv + Owner: USSR + Location: 47,4 + Facing: 523 + Yuri: yuri + Owner: USSR + SubCell: 3 + Location: 47,10 + Facing: 384 + Actor532: rmbc + Owner: USSR + SubCell: 3 + Location: 45,12 + Facing: 512 + Actor533: rmbc + Owner: USSR + SubCell: 3 + Facing: 512 + Location: 46,12 + Actor534: rmbc + Owner: USSR + SubCell: 3 + Facing: 512 + Location: 47,12 + Actor535: rmbc + Owner: USSR + SubCell: 3 + Facing: 512 + Location: 48,12 + Actor536: rmbc + Owner: USSR + SubCell: 3 + Facing: 512 + Location: 50,12 + Actor537: rmbc + Owner: USSR + SubCell: 3 + Facing: 512 + Location: 49,12 + Actor538: rmbc + Owner: USSR + SubCell: 3 + Facing: 512 + Location: 44,12 + Actor539: tplr + Owner: USSR + SubCell: 3 + Location: 47,13 + Facing: 512 + Actor540: tplr + Owner: USSR + SubCell: 3 + Facing: 512 + Location: 46,13 + Actor541: tplr + Owner: USSR + SubCell: 3 + Facing: 512 + Location: 45,13 + Actor542: tplr + Owner: USSR + SubCell: 3 + Facing: 512 + Location: 44,13 + Actor543: tplr + Owner: USSR + SubCell: 3 + Facing: 512 + Location: 48,13 + Actor544: tplr + Owner: USSR + SubCell: 3 + Facing: 512 + Location: 49,13 + Actor545: tplr + Owner: USSR + SubCell: 3 + Facing: 512 + Location: 50,13 + Actor546: brut + Owner: USSR + SubCell: 3 + Location: 46,10 + Facing: 512 + Actor547: brut + Owner: USSR + Location: 48,10 + SubCell: 3 + Facing: 512 + Actor559: n1c + Owner: USSR + Location: 44,16 + SubCell: 1 + Facing: 512 + Actor560: n1c + Owner: USSR + Location: 44,16 + SubCell: 2 + Facing: 512 + Actor561: n1c + Owner: USSR + Location: 44,16 + SubCell: 4 + Facing: 512 + Actor562: n1c + Owner: USSR + Location: 44,16 + SubCell: 5 + Facing: 512 + Actor557: n3c + Owner: USSR + Location: 46,15 + SubCell: 1 + Facing: 512 + Actor558: n3c + Owner: USSR + Location: 46,15 + SubCell: 2 + Facing: 512 + Actor563: n3c + Owner: USSR + Location: 46,15 + SubCell: 4 + Facing: 512 + Actor564: n3c + Owner: USSR + Location: 46,15 + SubCell: 5 + Facing: 512 + Actor548: n3c + Owner: USSR + SubCell: 1 + Facing: 512 + Location: 48,15 + Actor565: n3c + Owner: USSR + SubCell: 2 + Facing: 512 + Location: 48,15 + Actor566: n3c + Owner: USSR + SubCell: 4 + Facing: 512 + Location: 48,15 + Actor567: n3c + Owner: USSR + SubCell: 5 + Facing: 512 + Location: 48,15 + Actor551: n1c + Owner: USSR + SubCell: 1 + Facing: 512 + Location: 47,16 + Actor568: n1c + Owner: USSR + SubCell: 2 + Facing: 512 + Location: 47,16 + Actor569: n1c + Owner: USSR + SubCell: 4 + Facing: 512 + Location: 47,16 + Actor570: n1c + Owner: USSR + SubCell: 5 + Facing: 512 + Location: 47,16 + Actor554: n1c + Owner: USSR + SubCell: 1 + Facing: 512 + Location: 50,16 + Actor571: n1c + Owner: USSR + SubCell: 2 + Facing: 512 + Location: 50,16 + Actor572: n1c + Owner: USSR + SubCell: 4 + Facing: 512 + Location: 50,16 + Actor573: n1c + Owner: USSR + SubCell: 5 + Facing: 512 + Location: 50,16 + Actor549: n1c + Owner: USSR + SubCell: 3 + Facing: 512 + Location: 49,16 + Actor550: n1c + Owner: USSR + SubCell: 3 + Facing: 512 + Location: 48,16 + Actor552: n1c + Owner: USSR + SubCell: 3 + Facing: 512 + Location: 46,16 + Actor553: n1c + Owner: USSR + SubCell: 3 + Facing: 512 + Location: 45,16 + Actor555: n1c + Owner: USSR + SubCell: 3 + Facing: 512 + Location: 43,16 + Actor556: n1c + Owner: USSR + SubCell: 3 + Facing: 512 + Location: 51,16 + Actor574: enli + Owner: USSR + SubCell: 3 + Location: 45,9 + Facing: 512 + Actor575: enli + Owner: USSR + SubCell: 3 + Facing: 512 + Location: 49,9 + Actor576: afac + Owner: Nod + Location: 83,113 + Actor577: barb + Owner: Nod + Location: 53,66 + Actor578: barb + Owner: Nod + Location: 53,65 + Actor579: barb + Owner: Nod + Location: 54,65 + Actor580: barb + Owner: Nod + Location: 55,65 + Actor581: barb + Owner: Nod + Location: 55,66 + Actor582: barb + Owner: Nod + Location: 58,66 + Actor583: barb + Owner: Nod + Location: 58,65 + Actor584: barb + Owner: Nod + Location: 59,65 + Actor585: barb + Owner: Nod + Location: 60,65 + Actor586: barb + Owner: Nod + Location: 60,66 + Actor587: barb + Owner: Nod + Location: 32,65 + Actor588: barb + Owner: Nod + Location: 32,66 + Actor589: barb + Owner: Nod + Location: 31,65 + Actor590: barb + Owner: Nod + Location: 30,65 + Actor591: barb + Owner: Nod + Location: 29,65 + Actor592: barb + Owner: Nod + Location: 28,65 + Actor593: barb + Owner: Nod + Location: 28,66 + Actor594: barb + Owner: Nod + Location: 36,66 + Actor595: barb + Owner: Nod + Location: 36,65 + Actor596: barb + Owner: Nod + Location: 37,65 + Actor597: barb + Owner: Nod + Location: 39,65 + Actor598: barb + Owner: Nod + Location: 38,65 + Actor599: barb + Owner: Nod + Location: 39,66 + Actor605: gun.nod + Location: 54,64 + TurretFacing: 0 + Owner: Nod2 + Actor611: barb + Owner: Nod + Location: 101,59 + Actor612: barb + Owner: Nod + Location: 101,60 + Actor613: barb + Owner: Nod + Location: 101,58 + Actor614: barb + Owner: Nod + Location: 102,58 + Actor615: barb + Owner: Nod + Location: 103,58 + Actor616: barb + Owner: Nod + Location: 104,58 + Actor617: barb + Owner: Nod + Location: 105,58 + Actor618: barb + Owner: Nod + Location: 105,59 + Actor619: barb + Owner: Nod + Location: 106,59 + Actor620: barb + Owner: Nod + Location: 106,60 + Actor621: barb + Owner: Nod + Location: 114,56 + Actor622: barb + Owner: Nod + Location: 115,56 + Actor623: barb + Owner: Nod + Location: 115,57 + Actor624: barb + Owner: Nod + Location: 113,56 + Actor625: barb + Owner: Nod + Location: 112,56 + Actor626: barb + Owner: Nod + Location: 111,56 + Actor628: barb + Owner: Nod + Location: 111,58 + Actor636: nsam + Location: 122,63 + Owner: Nod2 + Actor638: barb + Owner: Nod + Location: 8,66 + Actor639: barb + Owner: Nod + Location: 8,65 + Actor640: barb + Owner: Nod + Location: 9,64 + Actor641: barb + Owner: Nod + Location: 8,64 + Actor642: barb + Owner: Nod + Location: 10,64 + Actor643: barb + Owner: Nod + Location: 11,64 + Actor644: barb + Owner: Nod + Location: 11,65 + Actor646: obli + Location: 9,65 + Owner: Nod2 + Actor647: barb + Owner: Nod + Location: 79,55 + Actor648: barb + Owner: Nod + Location: 80,55 + Actor649: barb + Owner: Nod + Location: 80,56 + Actor650: barb + Owner: Nod + Location: 80,57 + Actor661: brik + Owner: Nod + Location: 103,85 + Actor662: brik + Owner: Nod + Location: 102,85 + Actor663: brik + Owner: Nod + Location: 101,85 + Actor666: brik + Owner: Nod + Location: 100,85 + Actor674: brik + Owner: Nod + Location: 100,92 + Actor675: brik + Owner: Nod + Location: 101,92 + Actor677: brik + Owner: Nod + Location: 103,92 + Actor678: brik + Owner: Nod + Location: 102,92 + Actor693: ltnk + Owner: Nod + Location: 32,63 + Facing: 0 + Actor694: ftnk + Owner: Nod + Location: 34,66 + Facing: 0 + Actor695: stnk.nod + Owner: Nod + Facing: 384 + Location: 118,11 + Actor696: stnk.nod + Owner: Nod + Facing: 384 + Location: 119,13 + Actor698: stnk.nod + Owner: Nod + Location: 4,20 + Facing: 768 + Actor697: stnk.nod + Owner: Nod + Facing: 768 + Location: 4,18 + Actor699: ftnk + Owner: Nod + Facing: 0 + Location: 57,68 + Actor700: ftnk + Owner: Nod + Facing: 0 + Location: 82,56 + Actor701: ftnk + Owner: Nod + Facing: 0 + Location: 107,57 + Actor702: ftnk + Owner: Nod + Facing: 0 + Location: 6,68 + Actor703: ltnk + Owner: Nod + Facing: 0 + Location: 36,63 + Actor704: ltnk + Owner: Nod + Facing: 0 + Location: 55,63 + Actor705: ltnk + Owner: Nod + Facing: 0 + Location: 58,63 + Actor706: ltnk + Owner: Nod + Facing: 0 + Location: 84,54 + Actor707: ltnk + Owner: Nod + Facing: 0 + Location: 103,56 + Actor708: ltnk + Owner: Nod + Facing: 0 + Location: 109,56 + Actor709: ltnk + Owner: Nod + Facing: 0 + Location: 7,65 + Actor710: split2 + Owner: Neutral + Location: 84,8 + Actor712: gun.nod + TurretFacing: 0 + Owner: Nod2 + Location: 38,64 + Actor713: gun.nod + TurretFacing: 0 + Owner: Nod2 + Location: 30,64 + Actor645: gun.nod + TurretFacing: 0 + Owner: Nod2 + Location: 9,63 + Actor714: gun.nod + TurretFacing: 0 + Owner: Nod2 + Location: 65,47 + Actor715: gun.nod + TurretFacing: 0 + Owner: Nod2 + Location: 65,54 + Actor716: gun.nod + TurretFacing: 0 + Owner: Nod2 + Location: 75,55 + Actor711: gun.nod + TurretFacing: 0 + Owner: Nod2 + Location: 59,64 + Actor629: gun.nod + TurretFacing: 0 + Owner: Nod2 + Location: 104,57 + Actor630: gun.nod + TurretFacing: 0 + Owner: Nod2 + Location: 112,55 + Actor635: nsam + Owner: Nod2 + Location: 102,59 + Actor652: nsam + Owner: Nod2 + Location: 88,46 + Actor633: nsam + Owner: Nod2 + Location: 66,48 + Actor634: nsam + Owner: Nod2 + Location: 64,65 + Actor653: nsam + Owner: Nod2 + Location: 45,69 + Actor637: nsam + Owner: Nod2 + Location: 14,70 + Actor717: obli + Owner: Nod2 + Location: 30,66 + Actor718: obli + Owner: Nod2 + Location: 38,66 + Actor719: obli + Owner: Nod2 + Location: 54,66 + Actor720: obli + Owner: Nod2 + Location: 59,66 + Actor631: obli + Owner: Nod2 + Location: 104,59 + Actor627: barb + Owner: Nod + Location: 111,57 + Actor632: obli + Owner: Nod2 + Location: 112,57 + Actor651: obli + Owner: Nod2 + Location: 79,56 + Actor688: nsam + Owner: Nod2 + Location: 101,84 + Actor607: brik + Owner: Nod + Location: 104,85 + Actor608: brik + Owner: Nod + Location: 105,85 + Actor609: brik + Owner: Nod + Location: 106,85 + Actor610: obli + Owner: Nod2 + Location: 107,85 + Actor656: nsam + Owner: Nod2 + Location: 108,85 + Actor657: nuk2 + Location: 104,86 + Owner: Nod2 + Actor660: brik + Owner: Nod + Location: 106,86 + Actor679: brik + Owner: Nod + Location: 106,87 + Actor680: brik + Owner: Nod + Location: 106,88 + Actor681: nuk2 + Location: 104,89 + Owner: Nod2 + Actor682: brik + Owner: Nod + Location: 106,89 + Actor683: brik + Owner: Nod + Location: 106,90 + Actor684: brik + Owner: Nod + Location: 106,91 + Actor685: brik + Owner: Nod + Location: 104,92 + Actor686: brik + Owner: Nod + Location: 105,92 + Actor687: brik + Owner: Nod + Location: 106,92 + Actor157: rock5 + Owner: Neutral + Location: 95,89 + Actor689: nsam + Owner: Nod2 + Location: 94,85 + Actor690: obli + Owner: Nod2 + Location: 96,85 + Actor654: brik + Owner: Nod + Location: 97,85 + Actor659: brik + Owner: Nod + Location: 98,85 + Actor664: brik + Owner: Nod + Location: 99,85 + Actor665: brik + Owner: Nod + Location: 97,86 + Actor667: nuk2 + Location: 98,86 + Owner: Nod2 + Actor668: brik + Owner: Nod + Location: 97,87 + Actor669: brik + Owner: Nod + Location: 97,88 + Actor670: brik + Owner: Nod + Location: 97,89 + Actor672: brik + Owner: Nod + Location: 97,90 + Actor673: brik + Owner: Nod + Location: 97,91 + Actor676: brik + Owner: Nod + Location: 97,92 + Actor691: brik + Owner: Nod + Location: 98,92 + Actor692: brik + Owner: Nod + Location: 99,92 + Actor655: nuk2 + Location: 100,86 + Owner: Nod2 + Actor658: nuk2 + Location: 102,86 + Owner: Nod2 + Actor722: nuk2 + Location: 102,89 + Owner: Nod2 + Actor671: nuk2 + Owner: Nod2 + Location: 100,89 + Actor721: nuk2 + Owner: Nod2 + Location: 98,89 + Actor723: cratermaker2 + Owner: Neutral + Location: 105,45 + Actor724: cratermaker2 + Owner: Neutral + Location: 106,45 + Actor725: cratermaker2 + Owner: Neutral + Location: 111,45 + Actor726: cratermaker1 + Owner: Neutral + Location: 112,45 + Actor727: cratermaker1 + Owner: Neutral + Location: 116,40 + Actor728: cratermaker2 + Owner: Neutral + Location: 116,48 + Actor729: cratermaker1 + Owner: Neutral + Location: 115,48 + Actor730: scorchmaker1 + Owner: Neutral + Location: 117,49 + Actor731: scorchmaker2 + Owner: Neutral + Location: 108,48 + Actor732: cratermaker2 + Owner: Neutral + Location: 109,48 + Actor733: cratermaker2 + Owner: Neutral + Location: 122,40 + Actor734: cratermaker1 + Owner: Neutral + Location: 121,40 + Actor735: cratermaker1 + Owner: Neutral + Location: 122,39 + Actor736: scorchmaker2 + Owner: Neutral + Location: 121,39 + Actor737: cratermaker1 + Owner: Neutral + Location: 119,52 + Actor738: cratermaker2 + Owner: Neutral + Location: 120,52 + Actor739: scorchmaker1 + Owner: Neutral + Location: 113,34 + Actor740: scorchmaker1 + Owner: Neutral + Location: 114,35 + Actor741: cratermaker2 + Owner: Neutral + Location: 114,34 + Actor742: cratermaker1 + Owner: Neutral + Location: 125,40 + Actor743: cratermaker2 + Owner: Neutral + Location: 125,43 + Actor744: cratermaker1 + Owner: Neutral + Location: 124,43 + Actor745: cratermaker1 + Owner: Neutral + Location: 123,45 + Actor746: scorchmaker1 + Owner: Neutral + Location: 120,44 + Actor747: cratermaker1 + Owner: Neutral + Location: 121,44 + Actor748: cratermaker1 + Owner: Neutral + Location: 113,41 + Actor749: cratermaker1 + Owner: Neutral + Location: 113,50 + Actor750: cratermaker2 + Owner: Neutral + Location: 104,50 + Actor751: rmbc + Owner: Nod + SubCell: 3 + Location: 57,112 + Facing: 256 + Actor753: rmbc + Owner: Nod + SubCell: 3 + Facing: 602 + Location: 74,113 + Actor754: rmbc + Owner: Nod + SubCell: 3 + Facing: 602 + Location: 73,114 + Actor755: rmbc + Owner: Nod + SubCell: 3 + Facing: 602 + Location: 73,115 + Actor756: rmbc + Owner: Nod + SubCell: 3 + Facing: 602 + Location: 72,116 + Actor757: rmbc + Owner: Nod + SubCell: 3 + Facing: 602 + Location: 72,117 + Actor758: rmbc + Owner: Nod + SubCell: 3 + Facing: 256 + Location: 57,113 + Actor759: rmbc + Owner: Nod + SubCell: 3 + Facing: 256 + Location: 57,114 + Actor760: rmbc + Owner: Nod + SubCell: 3 + Facing: 256 + Location: 57,115 + Actor761: rmbc + Owner: Nod + SubCell: 3 + Facing: 256 + Location: 57,116 + Actor752: rmbc + Owner: Nod + SubCell: 3 + Location: 39,107 + Facing: 384 + Actor762: rmbc + Owner: Nod + SubCell: 3 + Location: 40,112 + Facing: 293 + Actor763: rmbc + Owner: Nod + SubCell: 3 + Location: 39,99 + Facing: 285 + Actor764: rmbc + Owner: Nod + SubCell: 3 + Location: 41,93 + Facing: 111 + Actor765: rmbc + Owner: Nod + Location: 49,88 + SubCell: 3 + Facing: 118 + Actor766: rmbc + Owner: Nod + SubCell: 3 + Facing: 118 + Location: 59,88 + Actor767: rmbc + Owner: Nod + SubCell: 3 + Facing: 118 + Location: 86,87 + Actor768: rmbc + Owner: Nod + SubCell: 3 + Location: 78,84 + Facing: 919 + Actor769: rmbc + Owner: Nod + SubCell: 3 + Facing: 919 + Location: 54,87 + Actor770: tplr + Owner: Nod + SubCell: 3 + Location: 60,68 + Facing: 103 + Actor771: tplr + Owner: Nod + SubCell: 3 + Location: 53,67 + Facing: 888 + Actor772: tplr + Owner: Nod + SubCell: 3 + Facing: 888 + Location: 29,64 + Actor773: tplr + Owner: Nod + SubCell: 3 + Facing: 888 + Location: 31,67 + Actor774: tplr + Owner: Nod + SubCell: 3 + Facing: 103 + Location: 39,64 + Actor775: tplr + Owner: Nod + SubCell: 3 + Facing: 103 + Location: 37,66 + Actor776: tplr + Owner: Nod + SubCell: 3 + Facing: 103 + Location: 84,56 + Actor777: tplr + Owner: Nod + SubCell: 3 + Facing: 103 + Location: 111,55 + Actor778: tplr + Owner: Nod + SubCell: 3 + Facing: 888 + Location: 103,57 + Actor779: tplr + Owner: Nod + SubCell: 3 + Facing: 888 + Location: 80,54 + Actor780: tplr + Owner: Nod + SubCell: 3 + Facing: 888 + Location: 4,66 + Actor781: n1c + Owner: Nod + SubCell: 3 + Location: 114,59 + Facing: 118 + Actor782: n1c + Owner: Nod + SubCell: 3 + Facing: 118 + Location: 115,55 + Actor783: n1c + Owner: Nod + SubCell: 3 + Facing: 118 + Location: 105,56 + Actor784: n1c + Owner: Nod + SubCell: 3 + Facing: 118 + Location: 113,54 + Actor785: n1c + Owner: Nod + SubCell: 3 + Facing: 118 + Location: 84,55 + Actor786: n1c + Owner: Nod + SubCell: 3 + Facing: 118 + Location: 61,62 + Actor787: n1c + Owner: Nod + SubCell: 3 + Facing: 118 + Location: 60,63 + Actor788: n1c + Owner: Nod + SubCell: 3 + Facing: 118 + Location: 39,63 + Actor789: n1c + Owner: Nod + SubCell: 3 + Facing: 118 + Location: 37,64 + Actor790: n1c + Owner: Nod + SubCell: 3 + Facing: 118 + Location: 11,62 + Actor791: n1c + Owner: Nod + SubCell: 3 + Facing: 118 + Location: 10,63 + Actor792: n1c + Owner: Nod + SubCell: 3 + Location: 29,63 + Facing: 856 + Actor793: n1c + Owner: Nod + SubCell: 3 + Facing: 856 + Location: 28,62 + Actor794: n1c + Owner: Nod + SubCell: 3 + Facing: 856 + Location: 54,63 + Actor795: n1c + Owner: Nod + SubCell: 3 + Facing: 856 + Location: 79,54 + Actor796: n1c + Owner: Nod + SubCell: 3 + Facing: 856 + Location: 102,57 + Actor797: n1c + Owner: Nod + SubCell: 3 + Facing: 856 + Location: 78,85 + Actor798: n1c + Owner: Nod + SubCell: 3 + Facing: 856 + Location: 86,86 + Actor799: enli + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 60,111 + Actor800: enli + Owner: Nod + SubCell: 3 + Location: 72,111 + Facing: 642 + NodRally1: waypoint + Owner: Neutral + Location: 9,54 + NodRally2: waypoint + Owner: Neutral + Location: 34,60 + NodRally3: waypoint + Owner: Neutral + Location: 58,52 + NodRally4: waypoint + Owner: Neutral + Location: 78,49 + NodRally5: waypoint + Owner: Neutral + Location: 106,36 + Actor803: mslo.nod + Owner: Nod + Location: 82,118 + KirovSpawn1: waypoint + Owner: Neutral + Location: 37,1 + KirovRally1: waypoint + Owner: Neutral + Location: 37,12 + KirovRally2: waypoint + Owner: Neutral + Location: 57,12 + KirovSpawn2: waypoint + Owner: Neutral + Location: 57,1 + PlayerStart: waypoint + Owner: Neutral + Location: 47,14 + Actor801: n3c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 62,120 + Actor802: n3c + Owner: Nod + SubCell: 3 + Location: 65,120 + Facing: 674 + Actor804: n3c + Owner: Nod + Facing: 384 + Location: 65,120 + SubCell: 1 + Actor805: n3c + Owner: Nod + SubCell: 3 + Location: 67,120 + Facing: 674 + Actor806: n3c + Owner: Nod + Location: 65,119 + SubCell: 3 + Facing: 634 + Actor807: n3c + Owner: Nod + SubCell: 3 + Location: 69,117 + Facing: 618 + Actor808: n3c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 61,117 + Actor809: n3c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 59,116 + Actor810: n3c + Owner: Nod + SubCell: 3 + Location: 71,116 + Facing: 737 + Actor811: n3c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 59,113 + Actor812: n3c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 61,110 + Actor813: n3c + Owner: Nod + SubCell: 3 + Location: 70,110 + Facing: 824 + Actor814: n3c + Owner: Nod + SubCell: 3 + Location: 71,111 + Facing: 769 + Actor815: n3c + Owner: Nod + SubCell: 3 + Location: 67,107 + Facing: 0 + Actor816: n3c + Owner: Nod + SubCell: 3 + Location: 63,108 + Facing: 0 + Actor817: n1c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 56,118 + Actor818: n1c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 55,116 + Actor819: n1c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 56,115 + Actor820: n1c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 54,114 + Actor821: n1c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 54,112 + Actor822: n1c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 53,111 + Actor823: n1c + Owner: Nod + Facing: 384 + Location: 53,110 + SubCell: 3 + Actor824: n1c + Owner: Nod + Location: 75,117 + SubCell: 3 + Facing: 658 + Actor825: n1c + Owner: Nod + SubCell: 3 + Location: 74,116 + Facing: 682 + Actor826: n1c + Owner: Nod + SubCell: 3 + Location: 76,115 + Facing: 689 + Actor827: n1c + Owner: Nod + Location: 76,115 + SubCell: 1 + Facing: 674 + Actor828: n1c + Owner: Nod + Location: 76,114 + SubCell: 3 + Facing: 689 + Actor829: n1c + Owner: Nod + SubCell: 3 + Location: 77,113 + Facing: 737 + Actor830: n1c + Owner: Nod + Location: 77,112 + SubCell: 3 + Facing: 658 + Actor831: reap + Owner: Nod + SubCell: 3 + Location: 60,112 + Facing: 384 + Actor832: reap + Owner: Nod + SubCell: 3 + Location: 69,111 + Facing: 721 + Actor833: reap + Owner: Nod + SubCell: 3 + Location: 62,110 + Facing: 491 + Actor836: reap + Owner: Nod + SubCell: 3 + Location: 31,34 + Facing: 864 + Actor840: acol + Owner: Nod + SubCell: 3 + Location: 30,33 + Facing: 919 + Actor834: reap + Owner: Nod + SubCell: 3 + Facing: 864 + Location: 33,35 + Actor835: reap + Owner: Nod + SubCell: 3 + Facing: 864 + Location: 35,36 + Actor837: acol + Owner: Nod + SubCell: 3 + Facing: 919 + Location: 32,34 + Actor838: acol + Owner: Nod + SubCell: 3 + Facing: 919 + Location: 34,35 + Actor839: acol + Owner: Nod + SubCell: 3 + Facing: 919 + Location: 36,36 + Actor841: ftnk + Owner: Nod + Location: 33,33 + Facing: 896 + Actor842: bike + Owner: Nod + Location: 70,7 + Facing: 384 + Actor843: bike + Owner: Nod + Facing: 384 + Location: 72,8 + Actor844: bike + Owner: Nod + Facing: 384 + Location: 74,6 + Actor845: bike + Owner: Nod + Facing: 384 + Location: 77,5 + Actor846: bike + Owner: Nod + Facing: 384 + Location: 75,7 + Actor847: bike + Owner: Nod + Facing: 384 + Location: 80,4 + Actor848: spec + Owner: Nod + Location: 57,41 + Facing: 0 + Stance: AttackAnything + Actor849: spec + Owner: Nod + Location: 59,40 + Facing: 0 + Stance: AttackAnything + Actor850: spec + Owner: Nod + Location: 61,39 + Facing: 0 + Stance: AttackAnything + Actor852: n1 + Owner: Nod + Location: 45,36 + SubCell: 3 + Facing: 0 + Actor853: n1 + Owner: Nod + Location: 45,37 + SubCell: 3 + Facing: 0 + Actor854: n1 + Owner: Nod + Location: 45,37 + SubCell: 1 + Facing: 0 + Actor851: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 44,36 + Actor857: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 47,37 + Actor858: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 48,37 + Actor860: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 49,36 + Actor859: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 49,37 + Actor861: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 46,36 + Actor862: n1 + Owner: Nod + SubCell: 1 + Facing: 0 + Location: 46,36 + Actor855: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 47,36 + Actor856: n1 + Owner: Nod + SubCell: 1 + Facing: 0 + Location: 47,36 + Actor863: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 61,35 + Actor864: n1 + Owner: Nod + SubCell: 1 + Facing: 0 + Location: 61,35 + Actor865: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 62,34 + Actor866: n1 + Owner: Nod + SubCell: 1 + Facing: 0 + Location: 62,34 + Actor867: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 64,35 + Actor868: n1 + Owner: Nod + SubCell: 1 + Facing: 0 + Location: 64,35 + Actor869: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 65,33 + Actor870: n1 + Owner: Nod + SubCell: 1 + Facing: 0 + Location: 65,33 + Actor871: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 22,7 + Actor872: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 20,6 + Actor873: n4 + Owner: Nod + Facing: 384 + Location: 19,7 + SubCell: 3 + Actor874: n4 + Owner: Nod + Facing: 384 + Location: 21,6 + SubCell: 3 + Actor875: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 23,5 + Actor876: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 20,5 + Actor877: n4 + Owner: Nod + Facing: 384 + Location: 19,6 + SubCell: 3 + Actor878: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 18,6 + Actor879: n3 + Owner: Nod + Facing: 384 + Location: 47,38 + SubCell: 3 + Actor880: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 44,37 + Actor881: n3 + Owner: Nod + Facing: 384 + Location: 48,38 + SubCell: 3 + Actor882: n3 + Owner: Nod + Facing: 384 + Location: 50,36 + SubCell: 3 + Actor883: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 63,35 + Actor884: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 63,33 + Actor885: n3 + Owner: Nod + Facing: 384 + Location: 66,33 + SubCell: 3 + Actor886: n3 + Owner: Nod + Facing: 384 + Location: 60,35 + SubCell: 3 + Actor889: ltnk + Owner: Nod + Location: 35,33 + Facing: 927 + InitSquad3: waypoint + Owner: Neutral + Location: 22,6 + InitSquad2: waypoint + Owner: Neutral + Location: 76,6 + InitSquad4: waypoint + Owner: Neutral + Location: 61,36 + InitSquad1: waypoint + Owner: Neutral + Location: 47,35 + InitSquad5: waypoint + Owner: Neutral + Location: 34,34 + Actor890: bggy + Location: 71,6 + Faction: Random + Facing: 384 + Owner: Nod + Actor891: bggy + Location: 70,5 + Faction: Random + Facing: 384 + Owner: Nod + Actor892: bggy + Location: 75,9 + Faction: Random + Facing: 384 + Owner: Nod + Actor893: ltnk + Owner: Nod + Facing: 0 + Location: 43,38 + Actor894: ltnk + Owner: Nod + Facing: 0 + Location: 50,38 + Actor887: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 46,39 + Actor888: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 47,39 + Actor895: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 47,41 + Actor896: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 48,41 + Actor897: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 63,37 + Actor898: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 64,37 + Actor899: camera + Owner: Nod + Location: 55,18 + Actor900: camera + Owner: Nod + Location: 37,18 + Actor901: camera + Owner: Nod + Location: 69,12 + Actor902: camera + Owner: Nod + Location: 22,12 + Actor903: camera + Owner: Nod + Location: 14,21 + Actor904: camera + Owner: Nod + Location: 38,32 + Actor905: camera + Owner: Nod + Location: 70,32 + Actor906: camera + Owner: Nod + Location: 104,17 + Actor907: camera + Owner: Nod + Location: 57,70 + Actor908: camera + Owner: Nod + Location: 34,70 + Actor909: camera + Owner: Nod + Location: 81,61 + Actor910: camera + Owner: Nod + Location: 111,61 + Actor911: camera + Owner: Nod + Location: 15,73 + Actor912: camera + Owner: Nod + Location: 103,80 + Actor913: camera + Owner: Nod + Location: 50,83 + Actor914: camera + Owner: Nod + Location: 33,101 + Actor915: camera + Owner: Nod + Location: 107,107 + Actor916: camera + Owner: Nod + Location: 71,78 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-doctrines.yaml, succession-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/main-campaign/ca18-succession/succession-rules.yaml b/mods/ca/missions/main-campaign/ca18-succession/succession-rules.yaml new file mode 100644 index 0000000000..8292c81f44 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca18-succession/succession-rules.yaml @@ -0,0 +1,79 @@ + +^Palettes: + TerrainLighting: + TintPostProcessEffect: + Red: 0.9 + Green: 1.0 + Blue: 1.2 + Ambient: 0.75 + +World: + LuaScript: + Scripts: campaign.lua, succession.lua + MissionData: + Briefing: Revenge is ours Comrade General! Kane's overconfidence made him careless and Yuri now commands many of his cyborgs.\n\nWhile this is excellent news, Kane is still able to produce cyborgs too fast for Yuri to manage. Research into using Tiberium to enhance Yuri's powers has begun, but it will be some time before significant progress is made.\n\nYou must return to where the cyborgs were first unleashed, where your predecessor failed miserably to contain them. The primary cyborg production facilities are still there, and we must take control of them to prevent Kane from overwhelming us again. With the cyborg factories under our control, nothing will be able to stop us. + MapOptions: + ShortGameCheckboxEnabled: False + MusicPlaylist: + StartingMusic: drok + +Player: + PlayerResources: + DefaultCash: 6000 + +^PowerDrainable: + Power@DiscPowerDrain: + Amount: -50 + +TMPP: + Inherits@CAMPAIGNDISABLED: ^Disabled + CaptureManager: + Capturable: + RequiresCondition: !build-incomplete && !being-warped + Types: building + CapturableProgressBar: + CapturableProgressBlink: + Health: + HP: 300000 + -Sellable: + Targetable@NoAutoTarget: + TargetTypes: NoAutoTarget + +BIO: + -OwnerLostAction: + -SpawnActorOnDeath: + -ProvidesPrerequisite@mortar: + -ProvidesPrerequisite@toxintruck: + Tooltip: + Name: Cyborg Factory + FireWarheadsOnDeath: + Type: Footprint + Weapon: BuildingExplode + EmptyWeapon: BuildingExplode + Health: + HP: 300000 + RepairableBuilding: + RepairStep: 500 + RepairPercent: 30 + RepairingNotification: Repairing + Targetable@NoAutoTarget: + TargetTypes: NoAutoTarget + +TTRK: + -Buildable: + +BRUT: + Buildable: + Prerequisites: barr, anyradar + +DISC: + Buildable: + Prerequisites: afld, stek + +lasher.upgrade: + Buildable: + Prerequisites: anyradar + +gattling.upgrade: + Buildable: + Prerequisites: anyradar diff --git a/mods/ca/missions/main-campaign/ca18-succession/succession.lua b/mods/ca/missions/main-campaign/ca18-succession/succession.lua new file mode 100644 index 0000000000..54680a899c --- /dev/null +++ b/mods/ca/missions/main-campaign/ca18-succession/succession.lua @@ -0,0 +1,254 @@ +MissionDir = "ca|missions/main-campaign/ca18-succession" + +SuperweaponsEnabledTime = { + easy = DateTime.Seconds((60 * 45) + 41), + normal = DateTime.Seconds((60 * 30) + 41), + hard = DateTime.Seconds((60 * 15) + 41), + vhard = DateTime.Seconds((60 * 12) + 41), + brutal = DateTime.Seconds((60 * 10) + 41) +} + +MaxAntiTankAir = { + hard = 8, + vhard = 12, + brutal = 16 +} + +MaxAirToAir = { + vhard = 12, + brutal = 18 +} + +table.insert(UnitCompositions.Nod, { + Infantry = { "n3", "n1", "n1", "n1", "n4", "n1", "n3", "n1", "n1", "n1", "n1", "n1", "n1", "n3", "n1", "n1" }, + Vehicles = { "mlrs", "mlrs", "mlrs", "mlrs", "mlrs", "mlrs", "mlrs" }, + MinTime = DateTime.Minutes(15), + IsSpecial = true +}) + +AdjustedNodCompositions = AdjustCompositionsForDifficulty(UnitCompositions.Nod) + +Squads = { + Main1 = { + InitTimeAdjustment = -DateTime.Minutes(10), + Delay = AdjustDelayForDifficulty(DateTime.Minutes(1) + DateTime.Seconds(30)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 20, Max = 40, RampDuration = DateTime.Minutes(15) }), + FollowLeader = true, + DispatchDelay = DateTime.Seconds(15), + Compositions = AdjustedNodCompositions, + AttackPaths = { + { NodRally1.Location }, + { NodRally2.Location }, + { NodRally3.Location }, + { NodRally4.Location }, + { NodRally5.Location }, + }, + }, + Main2 = { + InitTimeAdjustment = -DateTime.Minutes(10), + Delay = AdjustDelayForDifficulty(DateTime.Minutes(4)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 20, Max = 40, RampDuration = DateTime.Minutes(15) }), + FollowLeader = true, + DispatchDelay = DateTime.Seconds(15), + Compositions = AdjustedNodCompositions, + AttackPaths = { + { NodRally1.Location }, + { NodRally2.Location }, + { NodRally3.Location }, + { NodRally4.Location }, + { NodRally5.Location }, + }, + }, + Air = { + Delay = AdjustAirDelayForDifficulty(DateTime.Minutes(11)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 12, Max = 12 }), + Compositions = AirCompositions.Nod, + }, + AntiHeavyAir = AntiHeavyAirSquad({ "scrn" }, AdjustAirDelayForDifficulty(DateTime.Minutes(10))), + AirToAir = AirToAirSquad({ "scrn", "apch", "venm" }, AdjustAirDelayForDifficulty(DateTime.Minutes(10))), +} + +SetupPlayers = function() + USSR = Player.GetPlayer("USSR") + Nod = Player.GetPlayer("Nod") + SpyPlaneProvider = Player.GetPlayer("SpyPlaneProvider") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = { USSR } + MissionEnemies = { Nod } +end + +WorldLoaded = function() + SetupPlayers() + + TimerTicks = 0 + NumFactoriesCaptured = 0 + Camera.Position = PlayerStart.CenterPosition + + InitNod() + + for y = 62, 120 do + for x = 20, 110 do + + -- random 10% chance + if Utils.RandomInteger(1, 10) == 1 then + + local actor = Utils.Random({ "CraterMaker1", "CraterMaker2", "ScorchMaker1", "ScorchMaker2" }) + local loc = CPos.New(x, y) + + Actor.Create(actor, true, { Owner = Neutral, Location = loc }) + end + end + end + + local spyPlaneDummy1 = Actor.Create("spy.plane.dummy", true, { Owner = SpyPlaneProvider }) + + Trigger.AfterDelay(DateTime.Seconds(5), function() + spyPlaneDummy1.TargetAirstrike(TemplePrime.CenterPosition, Angle.South) + spyPlaneDummy1.Destroy() + end) + + ObjectiveCaptureTemplePrime = USSR.AddObjective("Capture Temple Prime.") + ObjectiveCaptureFactories = USSR.AddObjective("Capture all four cyborg manufacturing facilities.") + ObjectiveYuriMustSurvive = USSR.AddSecondaryObjective("Protect Yuri.") + + local factories = { CyborgFactory1, CyborgFactory2, CyborgFactory3, CyborgFactory4 } + Utils.Do(factories, function(f) + Trigger.OnCapture(f, function(self, captor, oldOwner, newOwner) + NumFactoriesCaptured = NumFactoriesCaptured + 1 + if NumFactoriesCaptured == 4 then + USSR.MarkCompletedObjective(ObjectiveCaptureFactories) + + if USSR.IsObjectiveCompleted(ObjectiveCaptureTemplePrime) then + USSR.MarkCompletedObjective(ObjectiveYuriMustSurvive) + end + end + end) + + Trigger.OnKilled(f, function(self, killer) + if not USSR.IsObjectiveCompleted(ObjectiveCaptureFactories) then + USSR.MarkFailedObjective(ObjectiveCaptureFactories) + end + end) + end) + + Trigger.OnCapture(TemplePrime, function(self, captor, oldOwner, newOwner) + USSR.MarkCompletedObjective(ObjectiveCaptureTemplePrime) + + if USSR.IsObjectiveCompleted(ObjectiveCaptureFactories) then + USSR.MarkCompletedObjective(ObjectiveYuriMustSurvive) + end + end) + + Trigger.OnKilled(TemplePrime, function(self, killer) + if not USSR.IsObjectiveCompleted(ObjectiveCaptureTemplePrime) then + USSR.MarkFailedObjective(ObjectiveCaptureTemplePrime) + end + end) + + Trigger.OnKilled(Yuri, function(self, killer) + if not USSR.IsObjectiveCompleted(ObjectiveYuriMustSurvive) then + USSR.MarkFailedObjective(ObjectiveYuriMustSurvive) + end + Notification("Yuri used his psionic powers to cheat death and has fled the battlefield to recuperate.") + end) + + Trigger.AfterDelay(DateTime.Seconds(5), function() + PlaySpeechNotificationToMissionPlayers("ReinforcementsArrived") + Notification("Reinforcements have arrived.") + SendKirovs() + end) + + Trigger.AfterDelay(1, function() + for k, v in pairs({ InitSquad1, InitSquad2, InitSquad3, InitSquad4, InitSquad5 }) do + local actors = Map.ActorsInCircle(v.CenterPosition, WDist.New(8 * 1024)); + local attackers = Utils.Where(actors, function(a) + return a.Owner == Nod and a.HasProperty("Hunt") + end) + + if (k > 3 and Difficulty == "easy") or (k > 4 and Difficulty == "normal") then + Utils.Do(attackers, function(a) + a.Destroy() + end) + else + Trigger.AfterDelay(DateTime.Seconds(k * 8), function() + Utils.Do(attackers, function(a) + if not a.IsDead then + a.Hunt() + end + end) + end) + end + end + end) + + AfterWorldLoaded() +end + +Tick = function() + OncePerSecondChecks() + OncePerFiveSecondChecks() + OncePerThirtySecondChecks() + AfterTick() +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + Nod.Resources = Nod.ResourceCapacity - 500 + + if MissionPlayersHaveNoRequiredUnits() then + if not USSR.IsObjectiveCompleted(ObjectiveCaptureFactories) then + USSR.MarkFailedObjective(ObjectiveCaptureFactories) + end + + if not USSR.IsObjectiveCompleted(ObjectiveCaptureTemplePrime) then + USSR.MarkFailedObjective(ObjectiveCaptureTemplePrime) + end + end + end +end + +OncePerFiveSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 125 == 0 then + UpdatePlayerBaseLocations() + end +end + +OncePerThirtySecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % DateTime.Seconds(30) == 0 then + CalculatePlayerCharacteristics() + end +end + +InitNod = function() + AutoRepairAndRebuildBuildings(Nod, 15) + SetupRefAndSilosCaptureCredits(Nod) + AutoReplaceHarvesters(Nod) + AutoRebuildConyards(Nod) + InitAiUpgrades(Nod) + InitAttackSquad(Squads.Main1, Nod) + InitAttackSquad(Squads.Main2, Nod) + InitAirAttackSquad(Squads.Air, Nod) + + if IsHardOrAbove() then + InitAirAttackSquad(Squads.AntiHeavyAir, Nod, MissionPlayers, { "4tnk", "4tnk.atomic", "apoc", "apoc.atomic" }) + InitAirAttackSquad(Squads.AirToAir, Nod, MissionPlayers, { "Aircraft" }, "ArmorType") + end + + local nodGroundAttackers = Nod.GetGroundAttackers() + + Utils.Do(nodGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsNodGroundHunterUnit) + end) + + Trigger.AfterDelay(SuperweaponsEnabledTime[Difficulty], function() + Actor.Create("ai.minor.superweapons.enabled", true, { Owner = Nod }) + Actor.Create("ai.superweapons.enabled", true, { Owner = Nod }) + end) +end + +-- overridden in co-op version +SendKirovs = function() + Reinforcements.Reinforce(USSR, { "kiro" }, { KirovSpawn1.Location, KirovRally1.Location }) + Reinforcements.Reinforce(USSR, { "kiro" }, { KirovSpawn2.Location, KirovRally2.Location }) +end \ No newline at end of file diff --git a/mods/ca/missions/main-campaign/ca19-proliferation/charred.pal b/mods/ca/missions/main-campaign/ca19-proliferation/charred.pal new file mode 100644 index 0000000000..735ad5986e Binary files /dev/null and b/mods/ca/missions/main-campaign/ca19-proliferation/charred.pal differ diff --git a/mods/ca/missions/main-campaign/ca19-proliferation/map.bin b/mods/ca/missions/main-campaign/ca19-proliferation/map.bin new file mode 100644 index 0000000000..904763bc94 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca19-proliferation/map.bin differ diff --git a/mods/ca/missions/main-campaign/ca19-proliferation/map.png b/mods/ca/missions/main-campaign/ca19-proliferation/map.png new file mode 100644 index 0000000000..53a67dc2e6 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca19-proliferation/map.png differ diff --git a/mods/ca/missions/main-campaign/ca19-proliferation/map.yaml b/mods/ca/missions/main-campaign/ca19-proliferation/map.yaml new file mode 100644 index 0000000000..13902bb757 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca19-proliferation/map.yaml @@ -0,0 +1,2258 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 19: Proliferation + +Author: Darkademic + +Tileset: TEMPERAT + +MapSize: 130,114 + +Bounds: 1,1,128,112 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: Scrin, Nod + PlayerReference@Scrin: + Name: Scrin + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: scrin + LockColor: True + Color: 7700FF + LockSpawn: True + LockTeam: True + Enemies: Nod, Creeps + PlayerReference@Nod: + Name: Nod + Bot: campaign + Faction: nod + Color: FE1100 + Enemies: Scrin, Creeps + +Actors: + Actor0: splitblue + Owner: Neutral + Location: 14,67 + Actor1: splitblue + Owner: Neutral + Location: 13,74 + Actor2: proc.scrin + Owner: Scrin + Location: 23,71 + Actor3: proc.scrin + Owner: Scrin + Location: 21,64 + Actor10: srep + Owner: Scrin + Location: 38,55 + Actor11: srep + Owner: Scrin + Location: 43,61 + Actor13: scol + Owner: Scrin + Location: 41,51 + Actor14: scol + Owner: Scrin + Location: 49,69 + Actor15: scol + Owner: Scrin + Location: 33,74 + Actor16: scol + Owner: Scrin + Location: 28,62 + Actor17: scol + Owner: Scrin + Location: 32,54 + Actor18: scol + Owner: Scrin + Location: 49,61 + Actor19: ptur + Owner: Scrin + Location: 51,71 + Actor20: ptur + Owner: Scrin + Location: 52,61 + Actor21: ptur + Owner: Scrin + Location: 43,49 + Actor22: ptur + Owner: Scrin + Location: 30,52 + Actor23: ptur + Owner: Scrin + Location: 20,61 + Actor24: ptur + Owner: Scrin + Location: 23,76 + Actor25: scol + Owner: Scrin + Location: 23,71 + Actor26: shar + Owner: Scrin + Location: 38,75 + Actor27: shar + Owner: Scrin + Location: 29,57 + Actor28: shar + Owner: Scrin + Location: 44,54 + Actor29: shar + Owner: Scrin + Location: 46,70 + Actor30: shar + Owner: Scrin + Location: 47,58 + Actor35: rea2 + Owner: Scrin + Location: 38,67 + Actor36: rea2 + Owner: Scrin + Location: 40,65 + Actor33: nerv + Owner: Scrin + Location: 35,71 + Actor39: corr + Owner: Scrin + Location: 35,55 + Facing: 0 + Actor41: corr + Owner: Scrin + Location: 44,67 + Facing: 634 + Actor42: gunw + Owner: Scrin + Location: 35,51 + Facing: 0 + Actor43: gunw + Owner: Scrin + Location: 37,50 + Facing: 0 + Actor44: gunw + Owner: Scrin + Location: 51,65 + Facing: 769 + Actor45: gunw + Owner: Scrin + Location: 51,67 + Facing: 769 + Actor46: intl + Owner: Scrin + Location: 38,52 + Facing: 0 + Actor47: intl + Owner: Scrin + Location: 34,53 + Facing: 0 + Actor48: intl + Owner: Scrin + Location: 48,63 + Facing: 729 + Actor49: intl + Owner: Scrin + Location: 49,65 + Facing: 729 + Actor57: t10.husk + Owner: Neutral + Location: 22,78 + Actor58: tc04.husk + Owner: Neutral + Location: 8,58 + Actor59: t17.husk + Owner: Neutral + Location: 5,63 + Actor60: tc02.husk + Owner: Neutral + Location: 47,75 + Actor61: tc03.husk + Owner: Neutral + Location: 45,76 + Actor62: tc01.husk + Owner: Neutral + Location: 47,78 + Actor63: t10.husk + Owner: Neutral + Location: 6,61 + Actor64: t15.husk + Owner: Neutral + Location: 20,82 + Actor65: t17.husk + Owner: Neutral + Location: 25,85 + Actor66: splitblue + Owner: Neutral + Location: 21,25 + Actor67: splitblue + Owner: Neutral + Location: 28,26 + NWRef: proc.td + Owner: Nod + Location: 26,13 + FreeActor: False + NWDef1: gun.nod + Owner: Nod + Location: 18,18 + TurretFacing: 150 + NWDef2: gun.nod + Owner: Nod + Location: 35,17 + TurretFacing: 602 + NWDef3: gun.nod + Owner: Nod + Location: 17,33 + TurretFacing: 634 + NWDef4: gun.nod + Owner: Nod + Location: 30,36 + TurretFacing: 555 + Actor73: t11.husk + Owner: Neutral + Faction: blackh + Location: 37,30 + Actor74: t15.husk + Owner: Neutral + Faction: blackh + Location: 30,33 + Actor75: ltnk + Owner: Nod + Facing: 384 + Location: 22,34 + Actor76: ltnk + Owner: Nod + Location: 22,18 + Facing: 512 + SRef2: proc.td + Owner: Nod + Location: 60,98 + FreeActor: False + SRef1: proc.td + Owner: Nod + Location: 63,103 + FreeActor: False + Actor79: splitblue + Owner: Neutral + Location: 54,106 + Actor81: splitblue + Owner: Neutral + Location: 42,106 + Actor82: splitblue + Owner: Neutral + Location: 48,109 + Actor80: splitblue + Owner: Neutral + Location: 49,102 + SWDef1: gun.nod + Owner: Nod + Location: 42,97 + TurretFacing: 126 + SWDef2: gun.nod + Owner: Nod + Location: 49,94 + TurretFacing: 192 + SWDef3: gun.nod + Owner: Nod + Location: 58,98 + TurretFacing: 7 + Actor86: gun.nod + Owner: Nod + Location: 80,36 + TurretFacing: 380 + Actor87: gun.nod + Owner: Nod + Location: 91,29 + TurretFacing: 452 + Actor88: gun.nod + Owner: Nod + Location: 77,18 + TurretFacing: 285 + NRef: proc.td + Owner: Nod + Location: 78,15 + FreeActor: False + Actor90: splitblue + Owner: Neutral + Location: 80,28 + Actor91: splitblue + Owner: Neutral + Location: 84,24 + Actor92: splitblue + Owner: Neutral + Location: 102,90 + Actor93: splitblue + Owner: Neutral + Location: 109,87 + Actor94: splitblue + Owner: Neutral + Location: 123,44 + Actor95: splitblue + Owner: Neutral + Location: 120,50 + SERef1: proc.td + Owner: Nod + Location: 109,75 + FreeActor: False + SERef2: proc.td + Owner: Nod + Location: 116,83 + FreeActor: False + NERef: proc.td + Owner: Nod + Location: 121,33 + FreeActor: False + Obelisk2: obli + Owner: Nod + Location: 118,36 + Obelisk3: obli + Owner: Nod + Location: 110,45 + Obelisk5: obli + Owner: Nod + Location: 107,79 + Obelisk4: obli + Owner: Nod + Location: 117,88 + SEDef4: gun.nod + Owner: Nod + Location: 101,80 + TurretFacing: 192 + SEDef1: gun.nod + Owner: Nod + Location: 97,96 + TurretFacing: 356 + SEDef3: gun.nod + Owner: Nod + Location: 108,99 + TurretFacing: 364 + Actor106: gun.nod + Owner: Nod + Location: 110,49 + TurretFacing: 333 + Actor107: gun.nod + Owner: Nod + Location: 115,56 + TurretFacing: 396 + Actor108: gun.nod + Owner: Nod + Location: 115,37 + TurretFacing: 269 + Actor109: hand + Owner: Nod + Location: 118,32 + Actor110: sbag + Owner: Nod + Location: 115,34 + Actor111: sbag + Owner: Nod + Location: 115,33 + Actor112: sbag + Owner: Nod + Location: 115,32 + Actor113: sbag + Owner: Nod + Location: 115,31 + Actor114: sbag + Owner: Nod + Location: 115,30 + Actor115: sbag + Owner: Nod + Location: 116,30 + Actor116: sbag + Owner: Nod + Location: 117,30 + Actor117: sbag + Owner: Nod + Location: 118,30 + Actor118: sbag + Owner: Nod + Location: 119,30 + Actor119: sbag + Owner: Nod + Location: 121,30 + Actor120: sbag + Owner: Nod + Location: 120,30 + Actor121: sbag + Owner: Nod + Location: 122,30 + Actor122: sbag + Owner: Nod + Location: 123,30 + Actor123: sbag + Owner: Nod + Location: 128,35 + Actor124: sbag + Owner: Nod + Location: 128,34 + Actor125: sbag + Owner: Nod + Location: 128,33 + Actor126: sbag + Owner: Nod + Location: 128,32 + Actor127: sbag + Owner: Nod + Location: 128,31 + Actor128: sbag + Owner: Nod + Location: 128,30 + Actor129: sbag + Owner: Nod + Location: 126,30 + Actor130: sbag + Owner: Nod + Location: 127,30 + Actor131: sbag + Owner: Nod + Location: 125,30 + Actor132: sbag + Owner: Nod + Location: 124,30 + Actor133: nsam + Owner: Nod + Location: 116,31 + Actor134: silo.td + Owner: Nod + Location: 126,31 + Actor135: silo.td + Owner: Nod + Location: 126,33 + Actor136: silo.td + Owner: Nod + Location: 123,31 + Actor137: gun.nod + Owner: Nod + Location: 126,38 + TurretFacing: 364 + SWDef4: ltur + Owner: Nod + Location: 46,96 + TurretFacing: 128 + SEDef2: ltur + Owner: Nod + Location: 102,98 + TurretFacing: 325 + Actor140: ltur + Owner: Nod + Location: 112,53 + TurretFacing: 380 + Actor141: ltur + Owner: Nod + Location: 86,32 + TurretFacing: 626 + Actor146: s1 + Owner: Scrin + SubCell: 3 + Location: 36,52 + Facing: 0 + Actor147: s1 + Owner: Scrin + Location: 36,52 + SubCell: 1 + Facing: 0 + Actor148: s1 + Owner: Scrin + SubCell: 3 + Location: 34,51 + Facing: 0 + Actor149: s1 + Owner: Scrin + SubCell: 3 + Location: 38,53 + Facing: 0 + Actor150: s1 + Owner: Scrin + SubCell: 3 + Location: 41,53 + Facing: 0 + Actor151: s1 + Owner: Scrin + SubCell: 3 + Location: 52,64 + Facing: 761 + Actor152: s1 + Owner: Scrin + Location: 52,64 + SubCell: 1 + Facing: 777 + Actor153: s1 + Owner: Scrin + SubCell: 3 + Location: 54,65 + Facing: 737 + Actor154: s1 + Owner: Scrin + SubCell: 3 + Location: 53,66 + Facing: 800 + Actor155: s1 + Owner: Scrin + SubCell: 3 + Location: 52,69 + Facing: 658 + Actor142: s3 + Owner: Scrin + SubCell: 3 + Location: 36,53 + Facing: 0 + Actor143: s3 + Owner: Scrin + SubCell: 3 + Location: 39,52 + Facing: 0 + Actor144: s3 + Owner: Scrin + SubCell: 3 + Location: 51,63 + Facing: 808 + Actor145: s3 + Owner: Scrin + Location: 51,68 + SubCell: 3 + Facing: 634 + Actor156: devo + Owner: Scrin + Location: 37,54 + Facing: 0 + Actor157: devo + Owner: Scrin + Location: 46,64 + Facing: 721 + Actor158: tc04.husk + Owner: Neutral + Location: 76,55 + Actor159: tc05.husk + Owner: Neutral + Location: 79,60 + Actor160: tc03.husk + Owner: Neutral + Location: 80,58 + Actor161: tc01.husk + Owner: Neutral + Location: 95,57 + Actor162: t17.husk + Owner: Neutral + Location: 94,44 + Actor163: tc01.husk + Owner: Neutral + Location: 103,18 + Actor164: tc02.husk + Owner: Neutral + Location: 47,40 + Actor165: t17.husk + Owner: Neutral + Location: 50,41 + Actor166: t10.husk + Owner: Neutral + Location: 50,36 + Actor167: t13.husk + Owner: Neutral + Location: 46,21 + Actor168: t10.husk + Owner: Neutral + Location: 13,42 + Actor169: t13.husk + Owner: Neutral + Location: 110,105 + Actor170: t16.husk + Owner: Neutral + Location: 123,92 + Actor171: t12.husk + Owner: Neutral + Location: 123,101 + Actor172: t15.husk + Owner: Neutral + Location: 90,103 + Actor173: t10.husk + Owner: Neutral + Location: 90,98 + Actor174: t08.husk + Owner: Neutral + Location: 90,92 + Actor175: tc01.husk + Owner: Neutral + Location: 91,91 + Actor176: t14.husk + Owner: Neutral + Location: 90,89 + Actor177: t16.husk + Owner: Neutral + Location: 86,82 + Actor178: tc03.husk + Owner: Neutral + Location: 89,78 + Actor179: t14.husk + Owner: Neutral + Location: 88,76 + Actor180: tc02.husk + Owner: Neutral + Location: 85,84 + Actor181: tc05.husk + Owner: Neutral + Location: 92,82 + Actor182: tc02.husk + Owner: Neutral + Location: 87,69 + Actor183: t17.husk + Owner: Neutral + Location: 71,56 + Actor184: t13.husk + Owner: Neutral + Location: 29,83 + Actor185: tc04.husk + Owner: Neutral + Location: 39,85 + Actor186: t15.husk + Owner: Neutral + Location: 38,83 + Actor187: t10.husk + Owner: Neutral + Location: 47,84 + Actor188: t17.husk + Owner: Neutral + Location: 44,85 + Actor189: t17.husk + Owner: Neutral + Location: 47,82 + Actor190: t14.husk + Owner: Neutral + Location: 62,85 + Actor191: t10.husk + Owner: Neutral + Location: 67,73 + Actor192: t12.husk + Owner: Neutral + Location: 68,81 + Actor193: t17.husk + Owner: Neutral + Location: 64,80 + Actor194: tc05.husk + Owner: Neutral + Location: 62,77 + Actor195: t12.husk + Owner: Neutral + Location: 83,78 + Actor196: t06.husk + Owner: Neutral + Location: 31,40 + Actor197: t08.husk + Owner: Neutral + Location: 18,43 + Actor198: t14.husk + Owner: Neutral + Location: 30,14 + Actor199: t02.husk + Owner: Neutral + Location: 114,29 + Actor200: t05.husk + Owner: Neutral + Location: 103,33 + Actor201: t11.husk + Owner: Neutral + Location: 107,20 + Actor202: t14.husk + Owner: Neutral + Location: 101,23 + Actor203: t07.husk + Owner: Neutral + Location: 103,22 + Actor204: t01.husk + Owner: Neutral + Location: 99,13 + Actor205: t03.husk + Owner: Neutral + Location: 98,12 + Actor206: t02.husk + Owner: Neutral + Location: 109,63 + Actor207: t15.husk + Owner: Neutral + Location: 112,63 + Actor208: t17.husk + Owner: Neutral + Location: 108,64 + Actor209: t16.husk + Owner: Neutral + Location: 109,60 + Actor210: t11.husk + Owner: Neutral + Location: 96,62 + Actor211: t05.husk + Owner: Neutral + Location: 97,61 + Actor212: t17.husk + Owner: Neutral + Location: 92,65 + Actor213: t03.husk + Owner: Neutral + Location: 86,58 + Actor214: t03.husk + Owner: Neutral + Location: 100,56 + Actor215: t11.husk + Owner: Neutral + Location: 101,49 + Actor216: t06.husk + Owner: Neutral + Location: 91,50 + Actor217: t02.husk + Owner: Neutral + Location: 120,69 + Actor218: t13.husk + Owner: Neutral + Location: 123,64 + Actor219: t06.husk + Owner: Neutral + Location: 118,101 + Actor220: t07.husk + Owner: Neutral + Location: 126,96 + Actor221: t10.husk + Owner: Neutral + Location: 127,95 + Actor222: t06.husk + Owner: Neutral + Location: 121,108 + Actor223: tc04.husk + Owner: Neutral + Location: 103,102 + Actor224: tc04.husk + Owner: Neutral + Location: 71,110 + Actor225: tc04.husk + Owner: Neutral + Location: 31,102 + Actor226: tc04.husk + Owner: Neutral + Location: 44,25 + Actor227: t01.husk + Owner: Neutral + Location: 43,26 + Actor228: t06.husk + Owner: Neutral + Location: 46,27 + Actor229: t12.husk + Owner: Neutral + Location: 44,28 + Actor230: t05.husk + Owner: Neutral + Location: 42,31 + Actor231: t07.husk + Owner: Neutral + Location: 60,22 + Actor232: t03.husk + Owner: Neutral + Location: 65,30 + Actor233: t10.husk + Owner: Neutral + Location: 70,23 + Actor234: tc05.husk + Owner: Neutral + Location: 57,12 + Actor235: tc04.husk + Owner: Neutral + Location: 63,9 + Actor236: tc03.husk + Owner: Neutral + Location: 62,12 + Actor237: tc02.husk + Owner: Neutral + Location: 52,12 + Actor238: t12.husk + Owner: Neutral + Location: 54,10 + Actor239: t14.husk + Owner: Neutral + Location: 60,11 + Actor240: t12.husk + Owner: Neutral + Location: 62,10 + Actor241: t08.husk + Owner: Neutral + Location: 49,15 + Actor242: tc02.husk + Owner: Neutral + Location: 63,67 + Actor243: tc02.husk + Owner: Neutral + Location: 112,20 + Actor244: t06.husk + Owner: Neutral + Location: 53,51 + Actor245: t05.husk + Owner: Neutral + Location: 40,38 + Actor246: t03.husk + Owner: Neutral + Location: 61,49 + Actor247: t07.husk + Owner: Neutral + Location: 64,43 + Actor248: t10.husk + Owner: Neutral + Location: 75,45 + Actor249: t14.husk + Owner: Neutral + Location: 77,48 + Actor250: t11.husk + Owner: Neutral + Location: 65,35 + Actor251: t15.husk + Owner: Neutral + Location: 82,36 + Actor252: t16.husk + Owner: Neutral + Location: 88,15 + Actor253: t01.husk + Owner: Neutral + Location: 81,11 + Actor254: t02.husk + Owner: Neutral + Location: 68,14 + Actor255: tc01.husk + Owner: Neutral + Location: 107,74 + Actor256: tc03.husk + Owner: Neutral + Location: 109,73 + Actor257: t13.husk + Owner: Neutral + Location: 107,71 + Actor258: tc01.husk + Owner: Neutral + Location: 66,92 + Actor259: t05.husk + Owner: Neutral + Location: 61,90 + Actor260: t07.husk + Owner: Neutral + Location: 70,98 + Actor261: t14.husk + Owner: Neutral + Location: 66,103 + Actor262: tc05.husk + Owner: Neutral + Location: 55,87 + Actor263: t14.husk + Owner: Neutral + Location: 55,85 + Actor264: stnk.nod + Owner: Nod + Location: 104,87 + Stance: Defend + Facing: 261 + Actor265: stnk.nod + Owner: Nod + Stance: Defend + Location: 109,91 + Facing: 531 + Actor266: stnk.nod + Owner: Nod + Stance: Defend + Location: 110,83 + Facing: 166 + Actor267: stnk.nod + Owner: Nod + Stance: Defend + Location: 119,43 + Facing: 309 + Actor268: stnk.nod + Owner: Nod + Stance: Defend + Location: 122,47 + Facing: 539 + Actor269: stnk.nod + Owner: Nod + Stance: Defend + Location: 123,53 + Facing: 384 + Actor270: stnk.nod + Owner: Nod + Facing: 384 + Stance: Defend + Location: 78,23 + Actor271: stnk.nod + Owner: Nod + Facing: 384 + Stance: Defend + Location: 85,27 + Actor272: stnk.nod + Owner: Nod + Stance: Defend + Location: 25,28 + Facing: 555 + Actor273: stnk.nod + Owner: Nod + Stance: Defend + Location: 19,24 + Facing: 626 + Actor274: stnk.nod + Owner: Nod + Stance: Defend + Location: 31,23 + Facing: 253 + Actor275: stnk.nod + Owner: Nod + Stance: Defend + Location: 42,110 + Facing: 848 + Actor276: stnk.nod + Owner: Nod + Stance: Defend + Location: 47,105 + Facing: 0 + Actor277: stnk.nod + Owner: Nod + Stance: Defend + Location: 53,108 + Facing: 190 + Actor278: stnk.nod + Owner: Nod + Stance: Defend + Location: 54,102 + Facing: 309 + Actor279: tc04.husk + Owner: Neutral + Location: 1,20 + Actor280: tc01.husk + Owner: Neutral + Location: 2,18 + Actor281: t14.husk + Owner: Neutral + Location: 1,13 + Actor282: t15.husk + Owner: Neutral + Location: 2,12 + Actor283: tc01.husk + Owner: Neutral + Location: 1,11 + Actor284: tc02.husk + Owner: Neutral + Location: 1,16 + Actor285: t12.husk + Owner: Neutral + Location: 3,14 + Actor286: tc01.husk + Owner: Neutral + Location: 3,10 + Actor287: tc04.husk + Owner: Neutral + Location: 1,1 + Actor288: tc05.husk + Owner: Neutral + Location: 3,3 + Actor289: tc01.husk + Owner: Neutral + Location: 1,5 + Actor290: t06.husk + Owner: Neutral + Location: 1,7 + Actor291: t12.husk + Owner: Neutral + Location: 1,9 + Actor292: t03.husk + Owner: Neutral + Location: 4,1 + Actor293: t10.husk + Owner: Neutral + Location: 4,7 + Actor294: t10.husk + Owner: Neutral + Location: 6,1 + Actor295: t12.husk + Owner: Neutral + Location: 9,1 + Actor296: tc01.husk + Owner: Neutral + Location: 7,2 + Actor297: tc02.husk + Owner: Neutral + Location: 11,3 + Actor298: tc03.husk + Owner: Neutral + Location: 12,1 + Actor299: tc04.husk + Owner: Neutral + Location: 15,1 + Actor300: t10.husk + Owner: Neutral + Location: 18,2 + Actor301: t11.husk + Owner: Neutral + Location: 8,4 + Actor302: t10.husk + Owner: Neutral + Location: 2,8 + Actor304: t14.husk + Owner: Neutral + Location: 5,11 + Actor305: t11.husk + Owner: Neutral + Location: 17,7 + Actor306: t05.husk + Owner: Neutral + Location: 16,9 + Actor303: t12.husk + Owner: Neutral + Location: 10,13 + Actor307: tc01.husk + Owner: Neutral + Location: 21,11 + Actor308: tc02.husk + Owner: Neutral + Location: 6,18 + Actor309: t16.husk + Owner: Neutral + Location: 5,15 + Actor310: t10.husk + Owner: Neutral + Location: 5,24 + Actor311: t13.husk + Owner: Neutral + Location: 1,26 + Actor312: t16.husk + Owner: Neutral + Location: 2,23 + Actor313: t03.husk + Owner: Neutral + Location: 6,21 + Actor314: t08.husk + Owner: Neutral + Location: 4,27 + Actor315: t07.husk + Owner: Neutral + Location: 2,31 + Actor316: tc02.husk + Owner: Neutral + Location: 24,1 + Actor317: t10.husk + Owner: Neutral + Location: 28,4 + Actor319: t07.husk + Owner: Neutral + Location: 28,11 + Actor320: t05.husk + Owner: Neutral + Location: 27,9 + Actor321: t08.husk + Owner: Neutral + Location: 23,5 + Actor322: t07.husk + Owner: Neutral + Location: 15,17 + Actor323: t14.husk + Owner: Neutral + Location: 13,15 + Actor324: t06.husk + Owner: Neutral + Location: 12,104 + Actor325: tc05.husk + Owner: Neutral + Location: 5,104 + Actor326: t15.husk + Owner: Neutral + Location: 14,111 + Actor327: t12.husk + Owner: Neutral + Location: 13,102 + Actor328: t10.husk + Owner: Neutral + Location: 3,95 + Actor329: t07.husk + Owner: Neutral + Location: 16,108 + Actor330: t06.husk + Owner: Neutral + Location: 6,109 + Actor331: t03.husk + Owner: Neutral + Location: 1,100 + Actor332: tc03.husk + Owner: Neutral + Location: 2,104 + Actor333: t10.husk + Owner: Neutral + Location: 10,110 + Actor334: tc04.husk + Owner: Neutral + Location: 1,110 + Actor335: t10.husk + Owner: Neutral + Location: 2,107 + Actor336: t06.husk + Owner: Neutral + Location: 1,102 + Actor337: t08.husk + Owner: Neutral + Location: 3,109 + Actor338: t17.husk + Owner: Neutral + Location: 4,106 + Actor339: t15.husk + Owner: Neutral + Location: 10,99 + Actor340: t05.husk + Owner: Neutral + Location: 5,100 + Actor341: t11.husk + Owner: Neutral + Location: 11,107 + Actor342: rea2 + Owner: Scrin + Location: 40,72 + Actor343: rea2 + Owner: Scrin + Location: 42,70 + NWField: waypoint + Owner: Neutral + Location: 25,26 + NField: waypoint + Owner: Neutral + Location: 82,25 + NEField: waypoint + Owner: Neutral + Location: 122,46 + SWField: waypoint + Owner: Neutral + Location: 14,71 + SField: waypoint + Owner: Neutral + Location: 50,105 + SEField: waypoint + Owner: Neutral + Location: 107,87 + RaidSpawn1: waypoint + Owner: Neutral + Location: 36,1 + RaidSpawn2: waypoint + Owner: Neutral + Location: 97,1 + RaidSpawn3: waypoint + Owner: Neutral + Location: 128,25 + RaidSpawn10: waypoint + Owner: Neutral + Location: 1,43 + RaidSpawn9: waypoint + Owner: Neutral + Location: 1,86 + RaidSpawn8: waypoint + Owner: Neutral + Location: 26,112 + RaidSpawn7: waypoint + Owner: Neutral + Location: 69,112 + RaidSpawn6: waypoint + Owner: Neutral + Location: 109,112 + RaidSpawn5: waypoint + Owner: Neutral + Location: 128,99 + RaidSpawn4: waypoint + Owner: Neutral + Location: 128,68 + Actor355: n1 + Owner: Nod + SubCell: 3 + Location: 18,34 + Facing: 384 + Actor356: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 30,37 + Actor357: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 31,36 + Actor358: n1 + Owner: Nod + SubCell: 3 + Location: 36,19 + Facing: 793 + Actor359: n1 + Owner: Nod + SubCell: 3 + Location: 24,16 + Facing: 507 + Actor360: n1 + Owner: Nod + Facing: 384 + Location: 24,16 + SubCell: 1 + Actor361: n1 + Owner: Nod + SubCell: 3 + Location: 23,15 + Facing: 126 + Actor362: n1 + Owner: Nod + Location: 30,15 + SubCell: 1 + Facing: 555 + Actor363: n1 + Owner: Nod + SubCell: 3 + Location: 36,21 + Facing: 666 + Actor364: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 21,36 + Actor365: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 25,37 + Actor366: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 22,16 + Actor367: bggy + Owner: Nod + Location: 66,97 + Facing: 245 + Actor368: bggy + Owner: Nod + Location: 44,96 + Facing: 0 + Actor369: ftnk + Owner: Nod + Location: 60,96 + Facing: 111 + Actor370: ltnk + Owner: Nod + Location: 61,94 + Facing: 95 + Actor371: n3 + Owner: Nod + SubCell: 3 + Location: 37,20 + Facing: 594 + Actor372: n3 + Owner: Nod + SubCell: 3 + Location: 25,14 + Facing: 384 + Actor373: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 33,34 + Actor374: n3 + Owner: Nod + SubCell: 3 + Location: 65,101 + Facing: 142 + Actor375: n3 + Owner: Nod + SubCell: 3 + Location: 53,93 + Facing: 182 + Actor376: n3 + Owner: Nod + SubCell: 3 + Location: 40,97 + Facing: 150 + Actor377: n4 + Owner: Nod + SubCell: 3 + Location: 43,95 + Facing: 142 + Actor378: n4 + Owner: Nod + SubCell: 3 + Location: 51,93 + Facing: 0 + Actor379: n4 + Owner: Nod + SubCell: 3 + Location: 70,102 + Facing: 63 + Actor380: n1 + Owner: Nod + SubCell: 3 + Location: 41,96 + Facing: 0 + Actor382: n1 + Owner: Nod + SubCell: 1 + Location: 40,96 + Facing: 0 + Actor383: n1 + Owner: Nod + SubCell: 3 + Location: 46,94 + Facing: 0 + Actor384: n1 + Owner: Nod + SubCell: 3 + Location: 57,95 + Facing: 0 + Actor385: n1 + Owner: Nod + SubCell: 3 + Location: 59,97 + Facing: 166 + Actor386: n1 + Owner: Nod + Location: 59,97 + SubCell: 1 + Facing: 71 + Actor387: n1 + Owner: Nod + SubCell: 3 + Location: 63,95 + Facing: 0 + Actor388: n1 + Owner: Nod + SubCell: 3 + Location: 65,107 + Facing: 134 + Actor389: rmbc + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 114,34 + Actor390: rmbc + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 116,36 + Actor391: rmbc + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 116,33 + Actor392: enli + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 112,38 + Actor393: enli + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 111,43 + Actor394: n1c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 110,51 + Actor396: n1c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 113,55 + Actor397: n1c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 116,58 + Actor398: n5 + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 112,52 + Actor399: n5 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 119,59 + Actor400: acol + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 109,42 + Actor401: acol + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 112,35 + Actor402: tplr + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 111,52 + Actor403: ltnk + Owner: Nod + Facing: 384 + Location: 90,33 + Actor404: ltnk + Owner: Nod + Location: 72,12 + Facing: 134 + Actor405: ltnk + Owner: Nod + Location: 76,13 + Facing: 134 + Actor406: ftnk + Owner: Nod + Location: 71,39 + Facing: 269 + Actor407: ftnk + Owner: Nod + Location: 71,41 + Facing: 269 + Actor408: mlrs + Owner: Nod + Facing: 384 + Location: 120,31 + Actor409: mlrs + Owner: Nod + Facing: 384 + Location: 117,78 + Actor410: mlrs + Owner: Nod + Facing: 384 + Location: 118,94 + Actor411: wtnk + Owner: Nod + Facing: 384 + Location: 92,71 + Actor412: ltnk + Owner: Nod + Facing: 384 + Location: 113,56 + Actor413: ltnk + Owner: Nod + Facing: 384 + Location: 108,40 + Actor414: bggy + Owner: Nod + Facing: 384 + Location: 75,38 + Actor416: bggy + Owner: Nod + Location: 55,28 + Facing: 658 + Actor417: arty.nod + Owner: Nod + Facing: 384 + Location: 74,52 + Actor418: arty.nod + Owner: Nod + Location: 81,72 + Facing: 301 + Actor419: arty.nod + Owner: Nod + Location: 81,82 + Facing: 158 + Actor420: howi + Owner: Nod + Facing: 384 + Location: 40,28 + Actor421: howi + Owner: Nod + Facing: 384 + Location: 42,26 + Actor422: ftnk + Owner: Nod + Location: 103,79 + Facing: 158 + Actor423: ftnk + Owner: Nod + Location: 105,77 + Facing: 150 + Actor424: hftk + Owner: Nod + Location: 56,8 + Facing: 261 + Actor425: hftk + Owner: Nod + Facing: 261 + Location: 78,101 + Actor426: hftk + Owner: Nod + Facing: 261 + Location: 78,104 + Actor427: hftk + Owner: Nod + Facing: 261 + Location: 74,76 + Actor428: hftk + Owner: Nod + Facing: 261 + Location: 74,79 + Actor429: hpad.td + Owner: Nod + Location: 113,8 + Actor430: hpad.td + Owner: Nod + Location: 116,8 + Actor431: hpad.td + Owner: Nod + Location: 114,4 + Obelisk1: obli + Owner: Nod + Location: 109,15 + Actor433: gun.nod + Owner: Nod + Location: 103,5 + TurretFacing: 325 + Actor434: gun.nod + Owner: Nod + Location: 105,11 + TurretFacing: 404 + Actor435: gun.nod + Owner: Nod + Location: 117,18 + TurretFacing: 507 + Actor436: gun.nod + Owner: Nod + Location: 125,15 + TurretFacing: 555 + Actor437: nsam + Owner: Nod + Location: 106,3 + Actor438: nsam + Owner: Nod + Location: 115,15 + Actor439: rep + Owner: Nod + Location: 119,5 + SESilo1: silo.td + Owner: Nod + Location: 119,81 + SESilo2: silo.td + Owner: Nod + Location: 120,83 + Actor442: nuk2 + Owner: Nod + Location: 123,8 + Actor443: nuk2 + Owner: Nod + Location: 111,2 + Actor444: nuk2 + Owner: Nod + Location: 109,3 + Actor445: nuk2 + Owner: Nod + Location: 109,11 + Actor446: nuk2 + Owner: Nod + Location: 112,12 + Actor447: nuk2 + Owner: Nod + Location: 120,9 + Actor448: nuk2 + Owner: Nod + Location: 123,11 + Actor449: nuk2 + Owner: Nod + Location: 120,12 + Actor450: sbag + Owner: Nod + Location: 110,9 + Actor451: sbag + Owner: Nod + Location: 110,8 + Actor452: sbag + Owner: Nod + Location: 110,7 + Actor453: sbag + Owner: Nod + Location: 109,7 + Actor454: sbag + Owner: Nod + Location: 108,7 + Actor455: sbag + Owner: Nod + Location: 107,7 + Actor456: sbag + Owner: Nod + Location: 107,6 + Actor457: sbag + Owner: Nod + Location: 116,13 + Actor458: sbag + Owner: Nod + Location: 117,13 + Actor459: sbag + Owner: Nod + Location: 118,13 + Actor460: sbag + Owner: Nod + Location: 115,13 + Actor461: n3 + Owner: Nod + Facing: 384 + Location: 108,6 + SubCell: 3 + Actor462: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 111,9 + Actor463: n3 + Owner: Nod + Facing: 384 + Location: 116,12 + SubCell: 3 + Actor466: n3 + Owner: Nod + Facing: 384 + Location: 117,12 + SubCell: 1 + Actor464: n4 + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 119,17 + Actor465: n4 + Owner: Nod + SubCell: 3 + Location: 123,16 + Facing: 491 + Actor467: n4 + Owner: Nod + Location: 105,10 + SubCell: 3 + Facing: 198 + Actor468: n4 + Owner: Nod + SubCell: 3 + Location: 103,6 + Facing: 198 + Actor469: bh + Owner: Nod + SubCell: 3 + Location: 121,15 + Facing: 467 + Actor470: cmec + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 116,34 + Actor471: n1 + Owner: Nod + SubCell: 3 + Location: 102,18 + Facing: 578 + Actor472: n1 + Owner: Nod + Facing: 384 + Location: 102,18 + SubCell: 1 + Actor473: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 104,18 + Actor474: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 107,20 + Actor475: n1 + Owner: Nod + SubCell: 3 + Location: 105,21 + Facing: 483 + Actor476: n3 + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 106,20 + Actor477: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 103,20 + Actor478: n4 + Owner: Nod + SubCell: 3 + Location: 74,12 + Facing: 103 + Actor479: n4 + Owner: Nod + Location: 74,12 + SubCell: 1 + Facing: 39 + Actor480: n1 + Owner: Nod + SubCell: 3 + Location: 57,6 + Facing: 174 + Actor481: n1 + Owner: Nod + Facing: 384 + Location: 57,6 + SubCell: 1 + Actor482: n1 + Owner: Nod + SubCell: 3 + Location: 54,7 + Facing: 253 + Actor483: n1 + Owner: Nod + SubCell: 3 + Location: 58,10 + Facing: 277 + Actor484: n1 + Owner: Nod + SubCell: 3 + Location: 72,13 + Facing: 174 + Actor485: n1 + Owner: Nod + Location: 81,17 + SubCell: 3 + Facing: 0 + Actor486: n1 + Owner: Nod + SubCell: 3 + Location: 76,18 + Facing: 126 + Actor487: n1 + Owner: Nod + SubCell: 3 + Location: 93,29 + Facing: 610 + Actor488: n1 + Owner: Nod + Facing: 384 + Location: 93,29 + SubCell: 1 + Actor489: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 88,32 + Actor490: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 83,34 + Actor491: n1 + Owner: Nod + SubCell: 3 + Location: 88,34 + Facing: 384 + Actor492: n1 + Owner: Nod + SubCell: 3 + Location: 105,79 + Facing: 103 + Actor493: n1 + Owner: Nod + Location: 105,79 + SubCell: 1 + Facing: 158 + Actor494: n1 + Owner: Nod + SubCell: 3 + Location: 102,80 + Facing: 182 + Actor495: n1 + Owner: Nod + SubCell: 3 + Location: 107,76 + Facing: 190 + Actor496: n1 + Owner: Nod + SubCell: 3 + Location: 106,74 + Facing: 166 + Actor497: n1 + Owner: Nod + SubCell: 3 + Location: 108,72 + Facing: 158 + Actor498: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 115,77 + Actor499: n1 + Owner: Nod + SubCell: 3 + Location: 119,93 + Facing: 618 + Actor500: n1 + Owner: Nod + SubCell: 3 + Location: 117,96 + Facing: 475 + Actor501: n1 + Owner: Nod + Facing: 384 + Location: 107,99 + SubCell: 3 + Actor502: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 103,98 + Actor503: n1 + Owner: Nod + Facing: 384 + Location: 103,98 + SubCell: 1 + Actor504: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 99,97 + Actor505: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 91,71 + Actor506: n1 + Owner: Nod + Facing: 384 + Location: 91,71 + SubCell: 1 + Actor507: n1 + Owner: Nod + SubCell: 3 + Location: 93,73 + Facing: 384 + Actor508: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 81,73 + Actor509: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 82,71 + Actor510: n1 + Owner: Nod + SubCell: 3 + Location: 80,81 + Facing: 158 + Actor511: n1 + Owner: Nod + SubCell: 3 + Location: 81,80 + Facing: 118 + Actor512: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 83,97 + Actor513: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 86,102 + Actor514: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 84,104 + Actor515: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 84,102 + Actor516: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 94,93 + Actor517: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 96,97 + Actor518: n1 + Owner: Nod + Facing: 384 + Location: 96,97 + SubCell: 1 + Actor519: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 93,87 + Actor520: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 91,88 + Actor521: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 93,90 + Actor522: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 54,29 + Actor524: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 56,27 + Actor525: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 41,25 + Actor526: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 42,28 + Actor527: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 52,36 + Actor528: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 54,39 + Actor529: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 53,37 + Actor530: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 15,33 + Actor531: stnk.nod + Owner: Nod + Location: 105,8 + Facing: 384 + Stance: Defend + Actor532: stnk.nod + Owner: Nod + Location: 121,17 + Facing: 384 + Stance: Defend + Actor533: mlrs + Owner: Nod + Facing: 384 + Location: 109,6 + Actor534: mlrs + Owner: Nod + Facing: 384 + Location: 115,12 + Actor535: apch + Owner: Nod + Location: 108,9 + Facing: 384 + Stance: Defend + Actor536: apch + Owner: Nod + Location: 118,15 + Facing: 384 + Stance: Defend + Actor537: n3 + Owner: Nod + Facing: 384 + Location: 88,32 + SubCell: 1 + Actor538: n3 + Owner: Nod + SubCell: 3 + Location: 58,8 + Facing: 222 + Actor539: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 101,97 + Actor540: n3 + Owner: Nod + SubCell: 3 + Location: 117,95 + Facing: 384 + Actor541: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 93,88 + Actor542: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 82,72 + Actor543: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 94,71 + Actor544: n3 + Owner: Nod + SubCell: 3 + Location: 74,13 + Facing: 384 + Actor545: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 14,21 + Actor546: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 45,28 + Actor547: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 64,52 + Actor548: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 66,56 + Actor549: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 76,76 + Actor550: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 75,80 + Actor551: n3 + Owner: Nod + SubCell: 3 + Location: 118,80 + Facing: 745 + SESAM2: nsam + Owner: Nod + Location: 112,77 + RiverSAM4: nsam + Owner: Nod + Location: 82,94 + RiverSAM2: nsam + Owner: Nod + Location: 71,49 + RiverSAM1: nsam + Owner: Nod + Location: 66,18 + RiverSAM3: nsam + Owner: Nod + Location: 81,63 + Actor558: nsam + Owner: Nod + Location: 98,67 + SSAM2: nsam + Owner: Nod + Location: 55,96 + NWSAM2: nsam + Owner: Nod + Location: 32,14 + Actor559: n1c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 109,50 + NWHarv: harv.td + Owner: Nod + Location: 25,19 + Facing: 384 + NHarv: harv.td + Owner: Nod + Location: 80,22 + Facing: 384 + NEHarv: harv.td + Owner: Nod + Location: 122,41 + Facing: 384 + SWHarv1: harv.td + Owner: Nod + Location: 52,103 + Facing: 384 + SWHarv2: harv.td + Owner: Nod + Location: 61,107 + Facing: 384 + SEHarv1: harv.td + Owner: Nod + Location: 105,80 + Facing: 384 + SEHarv2: harv.td + Owner: Nod + Location: 115,89 + Facing: 384 + RaidDest1: waypoint + Owner: Neutral + Location: 36,7 + RaidDest2: waypoint + Owner: Neutral + Location: 97,8 + RaidDest3: waypoint + Owner: Neutral + Location: 120,25 + RaidDest4: waypoint + Owner: Neutral + Location: 119,66 + RaidDest5: waypoint + Owner: Neutral + Location: 121,86 + RaidDest6: waypoint + Owner: Neutral + Location: 109,107 + RaidDest7: waypoint + Owner: Neutral + Location: 69,105 + RaidDest8: waypoint + Owner: Neutral + Location: 26,106 + RaidDest9: waypoint + Owner: Neutral + Location: 7,86 + RaidDest10: waypoint + Owner: Neutral + Location: 7,43 + WormholePoint2: waypoint + Owner: Neutral + Location: 22,55 + WormholePoint1: waypoint + Owner: Neutral + Location: 55,76 + SWStormriderDest: waypoint + Owner: Neutral + Location: 52,87 + NWStormriderDest: waypoint + Owner: Neutral + Location: 39,35 + Actor575: sfac + Owner: Scrin + Location: 32,66 + Actor573: rea2 + Owner: Scrin + Location: 31,59 + Actor574: rea2 + Owner: Scrin + Location: 33,57 + Actor577: rea2 + Owner: Scrin + Location: 37,60 + Actor578: corr + Owner: Scrin + Facing: 832 + Location: 47,60 + Actor579: grav + Owner: Scrin + Location: 41,58 + Actor580: camera + Owner: Nod + Location: 36,56 + Actor581: camera + Owner: Nod + Location: 25,68 + Actor582: camera + Owner: Nod + Location: 44,69 + Actor583: camera + Owner: Nod + Location: 45,94 + Actor584: camera + Owner: Nod + Location: 64,99 + Actor585: camera + Owner: Nod + Location: 24,36 + Actor586: camera + Owner: Nod + Location: 35,14 + Actor587: camera + Owner: Nod + Location: 76,16 + Actor588: camera + Owner: Nod + Location: 86,35 + Actor589: camera + Owner: Nod + Location: 115,35 + Actor590: camera + Owner: Nod + Location: 109,54 + Actor591: camera + Owner: Nod + Location: 102,76 + Actor592: camera + Owner: Nod + Location: 119,79 + Actor593: camera + Owner: Nod + Location: 100,100 + Actor594: camera + Owner: Nod + Location: 120,95 + Actor595: camera + Owner: Nod + Location: 12,70 + Actor596: bggy + Owner: Nod + Location: 38,29 + Facing: 658 + Actor597: bggy + Owner: Nod + Facing: 384 + Location: 55,37 + McvReplace: waypoint + Owner: Neutral + Location: 36,66 + PlayerStart: waypoint + Owner: Neutral + Location: 39,63 + NWSAM1: nsam + Owner: Nod + Location: 15,32 + SSAM1: nsam + Owner: Nod + Location: 37,97 + SAirSpawn: waypoint + Owner: Neutral + Location: 80,112 + SAirDest: waypoint + Owner: Neutral + Location: 74,62 + NSAM1: nsam + Owner: Nod + Location: 92,27 + NSAM2: nsam + Owner: Nod + Location: 82,17 + SESAM1: nsam + Owner: Nod + Location: 118,91 + NAirSpawn: waypoint + Owner: Neutral + Location: 68,1 + Actor598: scrt + Owner: Scrin + Location: 35,61 + Actor599: rea2 + Owner: Scrin + Location: 32,70 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-allegiances.yaml, proliferation-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/main-campaign/ca19-proliferation/proliferation-rules.yaml b/mods/ca/missions/main-campaign/ca19-proliferation/proliferation-rules.yaml new file mode 100644 index 0000000000..2654d760af --- /dev/null +++ b/mods/ca/missions/main-campaign/ca19-proliferation/proliferation-rules.yaml @@ -0,0 +1,119 @@ +^Palettes: + PaletteFromFile@terrain-temperat: + Filename: ca|missions/main-campaign/ca19-proliferation/charred.pal + TintPostProcessEffect: + Red: 1 + Green: 1 + Blue: 1.1 + Ambient: 0.8 + +World: + LuaScript: + Scripts: campaign.lua, proliferation.lua + MissionData: + Briefing: We have yet to re-establish communication with the homeworld so we must maximise preservation of our remaining forces here. To that end, the supervisor seeks to make changes to the operational command structure. You have been identified as having potential, and must now demonstrate your command effectiveness.\n\nAn area rich in blue ichor has been identified which is currently controlled by the indigenous faction led by the one known as Kane.\n\nUsing the outpost we have established, take control of all blue ichor fields and begin harvesting operations at each of them. Human harvesting operations must be removed.\n\nThe Supervisor is coordinating the allocation of all planetary forces. Reinforcements will be provided that are proportional to the value of your harvesting operation, and the surplus ichor you harvest will be diverted to the central repository. + MapOptions: + ShortGameCheckboxEnabled: True + MusicPlaylist: + StartingMusic: dmachine + +Player: + PlayerResources: + DefaultCash: 0 + -ResourceStorageWarning: + +PROC.SCRIN: + StoresPlayerResources: + Capacity: 2000000 + -SpawnActorsOnSellCA: + +WORMHOLE: + -Targetable: + +SFAC: + -SpawnActorsOnSellCA: + +REAC: + -SpawnActorsOnSellCA: + +REA2: + -SpawnActorsOnSellCA: + +SREP: + Buildable: + Prerequisites: ~structures.scrin + -SpawnActorsOnSellCA: + +STMR: + Inherits@CAMPAIGNDISABLED: ^Disabled + +DEVA: + Inherits@CAMPAIGNDISABLED: ^Disabled + +PAC: + Inherits@CAMPAIGNDISABLED: ^Disabled + +MSHP: + Inherits@CAMPAIGNDISABLED: ^Disabled + +NERV: + Inherits@IONSURGEPOWER: ^IonSurgePower + RevealActorsPower@RESOURCESCAN: + ChargeInterval: 22500 + DetonateWeaponPower@STORMSPIKE: + -Prerequisites: + DetonateWeaponPower@IONSURGE: + -Prerequisites: + -SpawnActorsOnSellCA: + +PORT: + Inherits@CAMPAIGNDISABLED: ^Disabled + +WSPH: + Inherits@CAMPAIGNDISABLED: ^Disabled + +GRAV: + Inherits@CAMPAIGNDISABLED: ^Disabled + +SCRT: + Inherits@CAMPAIGNDISABLED: ^Disabled + +SIGN: + Inherits@CAMPAIGNDISABLED: ^Disabled + +SWAL: + Inherits@CAMPAIGNDISABLED: ^Disabled + +SILO.SCRIN: + Inherits@CAMPAIGNDISABLED: ^Disabled + +PTUR: + Inherits@CAMPAIGNDISABLED: ^Disabled + +SHAR: + Inherits@CAMPAIGNDISABLED: ^Disabled + +SCOL: + Inherits@CAMPAIGNDISABLED: ^Disabled + +MANI: + Inherits@CAMPAIGNDISABLED: ^Disabled + +RFGN: + Inherits@CAMPAIGNDISABLED: ^Disabled + +SPLITBLUE: + SeedsResourceCA: + Interval: 50 + +carapace.upgrade: + Inherits@CAMPAIGNDISABLED: ^Disabled + +blink.upgrade: + Inherits@CAMPAIGNDISABLED: ^Disabled + +shrw.upgrade: + Inherits@CAMPAIGNDISABLED: ^Disabled + +shields.upgrade: + Inherits@CAMPAIGNDISABLED: ^Disabled diff --git a/mods/ca/missions/main-campaign/ca19-proliferation/proliferation.lua b/mods/ca/missions/main-campaign/ca19-proliferation/proliferation.lua new file mode 100644 index 0000000000..89f0ebde53 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca19-proliferation/proliferation.lua @@ -0,0 +1,436 @@ +MissionDir = "ca|missions/main-campaign/ca19-proliferation" + +Fields = { + { Reinforced = false, Waypoint = NWField, Reinforcements = { "gunw", "intl", "s1", "s1", "s3", "s1", "s1", "s3", "s1", "s4" } }, + { Reinforced = false, Waypoint = NField, Reinforcements = { "devo", "corr", "s1", "s1", "s3", "s1", "s2", "s1", "s1", "s3" } }, + { Reinforced = false, Waypoint = NEField, Reinforcements = { "rtpd", "lchr", "s4", "s4", "s2", "s1", "s1", "s1", "s1", "s1" } }, + { Reinforced = false, Waypoint = SEField, Reinforcements = { "tpod", "seek", "shrw", "s1", "s1", "s3", "s2", "s1", "s1", "s1" } }, + { Reinforced = false, Waypoint = SField, Reinforcements = { "devo", "shrw", "seek", "s3", "s3", "s4", "s1", "s1", "s1", "s1" } }, + { Reinforced = true, Waypoint = SWField, Reinforcements = nil } +} + +AirReinforcements = { + { + SAMSites = { NWSAM1, NWSAM2 }, + Spawn = RaidSpawn1, + Dest = NWField, + }, + { + SAMSites = { SSAM1, SSAM2 }, + Spawn = RaidSpawn8, + Dest = SField, + }, + { + SAMSites = { SESAM1, SESAM2 }, + Spawn = RaidSpawn6, + Dest = SEField, + }, + { + SAMSites = { NSAM1, NSAM2 }, + Spawn = NAirSpawn, + Dest = NField, + }, + { + SAMSites = { RiverSAM1, RiverSAM2, RiverSAM3, RiverSAM4 }, + Spawn = SAirSpawn, + Dest = SAirDest, + }, +} + +NodHarvestActors = { NWRef, NRef, NERef, SRef1, SRef2, SERef1, SERef2, NWHarv, NHarv, NEHarv, SWHarv1, SWHarv2, SEHarv1, SEHarv2 } + +MaintenanceDuration = { + easy = DateTime.Minutes(4), + normal = DateTime.Minutes(4), + hard = DateTime.Minutes(4), + vhard = DateTime.Minutes(4), + brutal = DateTime.Minutes(4) +} + +RaidStart = { + easy = DateTime.Seconds(120), + normal = DateTime.Seconds(90), + hard = DateTime.Seconds(70), + vhard = DateTime.Seconds(60), + brutal = DateTime.Seconds(50) +} + +RaidInterval = { + easy = DateTime.Seconds(80), + normal = DateTime.Seconds(70), + hard = DateTime.Seconds(60), + vhard = DateTime.Seconds(55), + brutal = DateTime.Seconds(50) +} + +ReinforcementInitialThreshold = { + easy = 27500, + normal = 35000, + hard = 42500, + vhard = 42500, + brutal = 42500 +} + +ReinforcementFinalThreshold = { + easy = 60000, + normal = 70000, + hard = 80000, + vhard = 90000, + brutal = 100000 +} + +ReinforcementThresholdIncrement = 5000 + +HardAndAboveCompositions = { + { Units = { "bike", "bike", "bggy" }, MaxTime = DateTime.Minutes(8) }, + + { Units = { "bike", "bike", "bike", "bggy", "bggy", "n1", "n1", "n3" }, MinTime = DateTime.Minutes(8) }, + { Units = { "stnk.nod", "stnk.nod", "stnk.nod", "bggy" }, MinTime = DateTime.Minutes(8) }, + { Units = { "ltnk", "ltnk", "ftnk", "ftnk", "n3", "n1", "n1", "n4", "n1", "n3" }, MinTime = DateTime.Minutes(8) }, + { Units = { "arty.nod", "ltnk", "bggy", "hftk", "n4", "n4", "n1" }, MinTime = DateTime.Minutes(10) }, +} + +RaidCompositions = { + easy = { + { Units = { "bike", "bggy" }, MaxTime = DateTime.Minutes(9) }, + + { Units = { "bike", "bike", "bggy", "n1" }, MinTime = DateTime.Minutes(9) }, + { Units = { "stnk.nod", "bggy" }, MinTime = DateTime.Minutes(9) }, + { Units = { "ltnk", "ftnk", "n3", "n1", "n1", "n4" }, MinTime = DateTime.Minutes(9) }, + }, + normal = { + { Units = { "bike", "bggy", "bggy" }, MaxTime = DateTime.Minutes(8) }, + + { Units = { "bike", "bike", "bggy", "bggy", "n1", "n3" }, MinTime = DateTime.Minutes(8) }, + { Units = { "stnk.nod", "stnk.nod", "bggy" }, MinTime = DateTime.Minutes(8) }, + { Units = { "ltnk", "ftnk", "ftnk", "n3", "n1", "n1", "n4", "n1" }, MinTime = DateTime.Minutes(8) }, + + { Units = { "arty.nod", "ltnk", "bggy", "n4", "n4", "n1" }, MinTime = DateTime.Minutes(10) }, + }, + hard = AdjustCompositionsForDifficulty(HardAndAboveCompositions), + vhard = AdjustCompositionsForDifficulty(HardAndAboveCompositions), + brutal = AdjustCompositionsForDifficulty(HardAndAboveCompositions), +} + +RaidEntryPaths = { + { RaidSpawn1.Location, RaidDest1.Location }, + { RaidSpawn2.Location, RaidDest2.Location }, + { RaidSpawn3.Location, RaidDest3.Location }, + { RaidSpawn4.Location, RaidDest4.Location }, + { RaidSpawn5.Location, RaidDest5.Location }, + { RaidSpawn6.Location, RaidDest6.Location }, + { RaidSpawn7.Location, RaidDest7.Location }, + { RaidSpawn8.Location, RaidDest8.Location }, + { RaidSpawn9.Location, RaidDest9.Location }, + { RaidSpawn10.Location, RaidDest10.Location }, +} + +Squads = { + Air = { + Delay = AdjustAirDelayForDifficulty(DateTime.Minutes(13)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 10, Max = 10 }), + Compositions = { + easy = { + { Aircraft = { "scrn" } } + }, + normal = { + { Aircraft = { "scrn" } }, + }, + hard = { + { Aircraft = { "scrn", "scrn" } }, + }, + vhard = { + { Aircraft = { "scrn", "scrn" } }, + }, + brutal = { + { Aircraft = { "scrn", "scrn", "scrn" } }, + }, + }, + }, +} + +SetupPlayers = function() + Scrin = Player.GetPlayer("Scrin") + Nod = Player.GetPlayer("Nod") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = { Scrin } + MissionEnemies = { Nod } +end + +WorldLoaded = function() + SetupPlayers() + + TimerTicks = MaintenanceDuration[Difficulty] + FieldsClearedAndBeingHarvested = 0 + NextReinforcementThreshold = ReinforcementInitialThreshold[Difficulty] + Camera.Position = PlayerStart.CenterPosition + + InitObjectives(Scrin) + InitNod() + + ObjectiveEliminateNodHarvesting = Scrin.AddObjective("Eliminate all enemy harvesting operations.") + ObjectiveHarvestFields = Scrin.AddObjective("Establish and maintain harvesting operations\nat all six blue ichor fields.") + + Trigger.AfterDelay(DateTime.Seconds(7), function() + Tip("A tiberium field is considered occupied when it has been cleared of Nod forces and when you have both a refinery and an active harvester nearby.") + Trigger.AfterDelay(DateTime.Seconds(7), function() + Tip("The more lucrative your harvesting operation becomes, the more reinforcements will be provided to you.") + end) + end) + + Trigger.AfterDelay(1, function() + CheckFields() + UpdateObjectiveMessage() + end) + + Trigger.OnAllKilledOrCaptured(NodHarvestActors, function() + Scrin.MarkCompletedObjective(ObjectiveEliminateNodHarvesting) + end) + + local powerPlants = Nod.GetActorsByType("nuk2") + local poweredDefenses = Nod.GetActorsByTypes({ "obli", "nsam" }) + + Trigger.OnAllKilledOrCaptured(powerPlants, function() + Utils.Do(poweredDefenses, function(self) + if not self.IsDead then + self.GrantCondition("disabled") + end + end) + end) + + Utils.Do(AirReinforcements, function(r) + Trigger.OnAllKilled(r.SAMSites, function() + Trigger.AfterDelay(DateTime.Seconds(2), function() + PlaySpeechNotificationToMissionPlayers("ReinforcementsArrived") + Notification("Reinforcements have arrived.") + Beacon.New(Scrin, r.Spawn.CenterPosition) + Reinforcements.Reinforce(Scrin, { "stmr" }, { r.Spawn.Location, r.Dest.Location }, 25) + end) + end) + end) + + AfterWorldLoaded() +end + +Tick = function() + OncePerSecondChecks() + OncePerFiveSecondChecks() + AfterTick() +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + Nod.Cash = Nod.ResourceCapacity - 1000 + Nod.Resources = Nod.ResourceCapacity - 1000 + + if MissionPlayersHaveNoRequiredUnits() then + if ObjectiveEliminateNodHarvesting ~= nil and not Scrin.IsObjectiveCompleted(ObjectiveEliminateNodHarvesting) then + Scrin.MarkFailedObjective(ObjectiveDestroyFactories) + end + if ObjectiveHarvestFields ~= nil and not Scrin.IsObjectiveCompleted(ObjectiveHarvestFields) then + Scrin.MarkFailedObjective(ObjectiveHarvestFields) + end + end + + if FieldsClearedAndBeingHarvested == 6 and TimerTicks > 0 then + if TimerTicks > 25 then + TimerTicks = TimerTicks - 25 + else + TimerTicks = 0 + Scrin.MarkCompletedObjective(ObjectiveHarvestFields) + end + end + + UpdateObjectiveMessage() + end +end + +OncePerFiveSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 125 == 0 then + CheckReinforcementThreshold() + UpdateRaidTarget() + CheckFields() + CheckColonyPlatform() + end +end + +InitNod = function() + Actor.Create("ai.unlimited.power", true, { Owner = Nod }) + + AutoRepairBuildings(Nod) + SetupRefAndSilosCaptureCredits(Nod) + InitAiUpgrades(Nod) + InitAirAttackSquad(Squads.Air, Nod, MissionPlayers, { "harv", "harv.td", "proc", "proc.scrin" }) + + local nodGroundAttackers = Nod.GetGroundAttackers() + + Utils.Do(nodGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(6 * 1024), IsNodGroundHunterUnit) + end) + + Trigger.AfterDelay(RaidStart[Difficulty], function() + DoRaid() + end) +end + +CheckFields = function() + PreviousFieldsClearedAndBeingHarvested = FieldsClearedAndBeingHarvested + FieldsClearedAndBeingHarvested = 0 + + Utils.Do(Fields, function(field) + local nodStructuresCleared = true + local hasScrinHarv = false + local hasScrinRef = false + + local actors = Map.ActorsInCircle(field.Waypoint.CenterPosition, WDist.New(18 * 1024), function(a) + return not a.IsDead and (a.Type == "harv" or a.Type == "harv.scrin" or a.HasProperty("StartBuildingRepairs") and a.Type ~= "nsam") + end) + + Utils.Do(actors, function(a) + if IsMissionPlayer(a.Owner) then + if a.Type == "harv" or a.Type == "harv.scrin" then + hasScrinHarv = true + elseif a.Type == "proc.scrin" or a.Type == "proc.td" then + hasScrinRef = true + end + elseif a.Owner == Nod then + nodStructuresCleared = false + end + end) + + if not field.Reinforced and nodStructuresCleared then + field.Reinforced = true + Trigger.AfterDelay(DateTime.Seconds(2), function() + local wormhole = Actor.Create("wormhole", true, { Owner = Scrin, Location = field.Waypoint.Location }) + + Trigger.AfterDelay(DateTime.Seconds(2), function() + PlaySpeechNotificationToMissionPlayers("ReinforcementsArrived") + Notification("Reinforcements have arrived.") + Beacon.New(Scrin, field.Waypoint.CenterPosition) + + local reinforcements = Reinforcements.Reinforce(Scrin, field.Reinforcements, { field.Waypoint.Location }, 10, function(a) + a.Scatter() + end) + end) + + Trigger.AfterDelay(DateTime.Seconds(10), function() + wormhole.Kill() + end) + end) + end + + if hasScrinHarv and hasScrinRef and nodStructuresCleared then + FieldsClearedAndBeingHarvested = FieldsClearedAndBeingHarvested + 1 + end + end) + + if FieldsClearedAndBeingHarvested < PreviousFieldsClearedAndBeingHarvested then + Notification("You have lost control of an ichor field.") + MediaCA.PlaySound(MissionDir .. "/s_ichorfieldlost.aud", 2) + end +end + +-- overridden in co-op version +UpdateObjectiveMessage = function() + if FieldsClearedAndBeingHarvested == 6 then + UserInterface.SetMissionText("6 of 6 fields occupied.\n Maintain for " .. UtilsCA.FormatTimeForGameSpeed(TimerTicks), HSLColor.Lime) + else + local missionText = FieldsClearedAndBeingHarvested .. " of 6 fields occupied - Next reinforcement threshold: $" .. Scrin.Cash + Scrin.Resources .. "/" .. NextReinforcementThreshold + UserInterface.SetMissionText(missionText, HSLColor.Yellow) + end +end + +DoRaid = function() + local randomEntryPath = Utils.Random(RaidEntryPaths) + local difficultyCompositions = RaidCompositions[Difficulty] + local validCompositions = Utils.Where(difficultyCompositions, function(c) + return (c.MinTime == nil or DateTime.GameTime >= c.MinTime) and (c.MaxTime == nil or DateTime.GameTime <= c.MaxTime) + end) + if #validCompositions > 0 then + local randomComposition = Utils.Random(validCompositions) + local units = Reinforcements.Reinforce(Nod, randomComposition.Units, randomEntryPath, 25, function(a) + Trigger.AfterDelay(DateTime.Seconds(2), function() + AssaultPlayerBaseOrHunt(a) + end) + end) + end + + Trigger.AfterDelay(RaidInterval[Difficulty], function() + DoRaid() + end) +end + +UpdateRaidTarget = function() + local possibleRaidTargets = { PlayerStart } + + Utils.Do(Fields, function(field) + if field.Reinforced then + table.insert(possibleRaidTargets, field.Waypoint) + end + end) + + local randomRaidTarget = Utils.Random(possibleRaidTargets) + PlayerBaseLocations[Scrin.InternalName] = randomRaidTarget.Location +end + +DoReinforcements = function() + local reinforcementsWaypoint = Utils.Random({ WormholePoint1, WormholePoint2 }) + local wormhole = Actor.Create("wormhole", true, { Owner = Scrin, Location = reinforcementsWaypoint.Location }) + + Trigger.AfterDelay(DateTime.Seconds(2), function() + PlaySpeechNotificationToMissionPlayers("ReinforcementsArrived") + Notification("Reinforcements have arrived.") + Beacon.New(Scrin, reinforcementsWaypoint.CenterPosition) + + local reinforcements = Reinforcements.Reinforce(Scrin, { "s1", "s1", "s1", "s3", "s3", "gunw", "seek", "intl", "s1", "s1", "s4", "s1" }, { reinforcementsWaypoint.Location }, 10, function(a) + a.Scatter() + end) + end) + + Trigger.AfterDelay(DateTime.Seconds(10), function() + wormhole.Kill() + end) + + UpdateObjectiveMessage() +end + +-- overridden in co-op version +CheckReinforcementThreshold = function() + local playerTotalFunds = Scrin.Cash + Scrin.Resources + Scrin.Cash = 0 + Scrin.Resources = playerTotalFunds + + if Scrin.Resources >= NextReinforcementThreshold then + Scrin.Resources = Scrin.Resources - NextReinforcementThreshold + + if NextReinforcementThreshold < ReinforcementFinalThreshold[Difficulty] then + NextReinforcementThreshold = NextReinforcementThreshold + ReinforcementThresholdIncrement + end + + DoReinforcements() + end +end + +-- overridden in co-op version +CheckColonyPlatform = function() + local colonyPlatformsAndMcvs = Scrin.GetActorsByTypes({ "smcv", "sfac" }) + if #colonyPlatformsAndMcvs == 0 and not ColonyPlatformBeingReplaced then + ColonyPlatformBeingReplaced = true + Trigger.AfterDelay(DateTime.Seconds(15), function() + local wormhole = Actor.Create("wormhole", true, { Owner = Scrin, Location = McvReplace.Location }) + + Trigger.AfterDelay(DateTime.Seconds(2), function() + PlaySpeechNotificationToMissionPlayers("ReinforcementsArrived") + Notification("Reinforcements have arrived.") + Beacon.New(Scrin, McvReplace.CenterPosition) + ColonyPlatformBeingReplaced = false + Reinforcements.Reinforce(Scrin, { "smcv" }, { McvReplace.Location }) + end) + + Trigger.AfterDelay(DateTime.Seconds(5), function() + wormhole.Kill() + end) + end) + end +end diff --git a/mods/ca/missions/main-campaign/ca19-proliferation/s_ichorfieldlost.aud b/mods/ca/missions/main-campaign/ca19-proliferation/s_ichorfieldlost.aud new file mode 100644 index 0000000000..e7949daea4 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca19-proliferation/s_ichorfieldlost.aud differ diff --git a/mods/ca/missions/main-campaign/ca20-encroachment/encroachment-rules.yaml b/mods/ca/missions/main-campaign/ca20-encroachment/encroachment-rules.yaml new file mode 100644 index 0000000000..8e54140b67 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca20-encroachment/encroachment-rules.yaml @@ -0,0 +1,83 @@ +^Palettes: + TintPostProcessEffect: + +World: + LuaScript: + Scripts: campaign.lua, encroachment.lua + MissionData: + Briefing: You have impressed the Supervisor and have been deemed worthy of greater command responsibility. In the absence of reinforcements from the homeworld, we must now work towards securing territory around our central ichor repository.\n\nThe bulk of our fleet is engaged with human forces, providing us with an opportunity to launch a ground assault against two high priority targets.\n\nTwo cooperating human factions have been observed making use of powerful offensive assets, in the form of an orbital weapons platform and a machine capable of manipulating atmospheric conditions to create localised storms.\n\nIf our central repository is discovered, they will no doubt attempt to use these weapons against it. They must be destroyed to remove this possibility. + MapOptions: + ShortGameCheckboxEnabled: False + MusicPlaylist: + StartingMusic: defense + +Player: + PlayerResources: + DefaultCash: 6000 + +TPOD: + Buildable: + Prerequisites: scrt, ~vehicles.scrin + +ENRV: + Buildable: + Prerequisites: scrt, ~aircraft.scrin + +RMBO: + Inherits@CAMPAIGNDISABLED: ^Disabled + +E7: + Inherits@CAMPAIGNDISABLED: ^Disabled + +MAST: + Inherits@CAMPAIGNDISABLED: ^Disabled + +DEVA: + Inherits@CAMPAIGNDISABLED: ^Disabled + +PAC: + Inherits@CAMPAIGNDISABLED: ^Disabled + +MSHP: + Inherits@CAMPAIGNDISABLED: ^Disabled + +SIGN: + Inherits@CAMPAIGNDISABLED: ^Disabled + +RFGN: + Inherits@CAMPAIGNDISABLED: ^Disabled + +blink.upgrade: + Inherits@CAMPAIGNDISABLED: ^Disabled + +shields.upgrade: + Inherits@CAMPAIGNDISABLED: ^Disabled + +EYE: + DetonateWeaponPower@IonStorm: + ChargeInterval: 15000 + IonCannonPower@SurgicalStrike: + ChargeInterval: 7500 + Health: + HP: 150000 + +WEAT: + DetonateWeaponPower@LightningStorm: + ChargeInterval: 15000 + Health: + HP: 150000 + +WORMHOLE: + -Targetable: + +OCAR.HTNK.ION: + Inherits: OCAR + -Buildable: + Aircraft: + InitialFacing: 768 + Carryall: + InitialActor: htnk.ion + +# Hunt() requires only 1 AttackBase +BATF.AI: + -AttackFrontal: diff --git a/mods/ca/missions/main-campaign/ca20-encroachment/encroachment-weapons.yaml b/mods/ca/missions/main-campaign/ca20-encroachment/encroachment-weapons.yaml new file mode 100644 index 0000000000..1f3a0dd46f --- /dev/null +++ b/mods/ca/missions/main-campaign/ca20-encroachment/encroachment-weapons.yaml @@ -0,0 +1,4 @@ +IonCannon: + Warhead@1Dam: SpreadDamage + Versus: + Concrete: 125 diff --git a/mods/ca/missions/main-campaign/ca20-encroachment/encroachment.lua b/mods/ca/missions/main-campaign/ca20-encroachment/encroachment.lua new file mode 100644 index 0000000000..7b7ef0aff8 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca20-encroachment/encroachment.lua @@ -0,0 +1,356 @@ +MissionDir = "ca|missions/main-campaign/ca20-encroachment" + + +AlliedAttackPaths = { + { AlliedAttack1.Location, AlliedAttack2a.Location, AlliedAttack3.Location, AlliedAttack4.Location, AlliedAttack5a.Location }, + { AlliedAttack1.Location, AlliedAttack2a.Location, AlliedAttack3.Location, AlliedAttack4.Location, AlliedAttack5b.Location }, + { AlliedAttack1.Location, AlliedAttack2b.Location, AlliedAttack3.Location, AlliedAttack4.Location, AlliedAttack5a.Location }, + { AlliedAttack1.Location, AlliedAttack2b.Location, AlliedAttack3.Location, AlliedAttack4.Location, AlliedAttack5b.Location }, +} + +GDIAttackPaths = { + { GDIAttack1.Location, GDIAttack2a.Location, GDIAttack3.Location}, + { GDIAttack1.Location, GDIAttack2b.Location, GDIAttack3.Location}, +} + +ReinforcementGroups = { + { + Waypoint = NEWormhole, + Targets = { NEBuilding1, NEBuilding2, NEBuilding3, NEBuilding4, NEBuilding5, NEBuilding6, NEBuilding7, NEBuilding8 }, + Units = { "gunw", "s1", "s1", "s1", "s3", "s3", "intl" } + }, + { + Waypoint = NWWormhole, + Targets = { NWBuilding1, NWBuilding2, NWBuilding3, NWBuilding4 }, + Units = { "intl", "s1", "s1", "s1", "s3", "s3", "lace", "lace" } + }, + { + Waypoint = MWormhole, + Targets = { MBuilding1, MBuilding2, MBuilding3, MBuilding4, MBuilding5, MBuilding6 }, + Units = { "rtpd", "s1", "s1", "s4", "s2", "ruin" } + }, +} + +PowerGrids = { + { + Providers = { WPower1, WPower2, WPower3, WPower4, WPower5, WPower6 }, + Consumers = { WPowered1, WPowered2, WPowered3, WPowered4, WPowered5, WPowered6, WPowered7, WPowered8, WPowered9, WPowered10, WPowered11 }, + }, + { + Providers = { SWPower1, SWPower2, SWPower3 }, + Consumers = { SWPowered1, SWPowered2, SWPowered3, SWPowered4, SWPowered5, SWPowered6, SWPowered7, SWPowered8 }, + }, + { + Providers = { SEPower1, SEPower2, SEPower3, SEPower4, SEPower5, SEPower6, SEPower7 }, + Consumers = { SEPowered1, SEPowered2, SEPowered3, SEPowered4, SEPowered5, SEPowered6, SEPowered7, SEPowered8, SEPowered9, SEPowered10, SEPowered11, SEPowered12 }, + }, +} + +WeatherStormEnabledTime = { + easy = DateTime.Seconds((60 * 25) + 17), + normal = DateTime.Seconds((60 * 20) + 17), + hard = DateTime.Seconds((60 * 15) + 17), + vhard = DateTime.Seconds((60 * 10) + 17), + brutal = DateTime.Seconds((60 * 9) + 17) +} + +IonCannonEnabledTime = { + easy = DateTime.Seconds((60 * 28) + 48), + normal = DateTime.Seconds((60 * 23) + 48), + hard = DateTime.Seconds((60 * 18) + 48), + vhard = DateTime.Seconds((60 * 13) + 48), + brutal = DateTime.Seconds((60 * 12) + 48) +} + +AlliedDropInterval = { + vhard = DateTime.Minutes(4), + brutal = DateTime.Minutes(2) +} + +Squads = { + AlliedMain = { + Delay = AdjustDelayForDifficulty(DateTime.Minutes(5)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 20, Max = 40 }), + FollowLeader = true, + ProducerActors = { Infantry = { AlliedSouthBarracks }, Vehicles = { AlliedSouthFactory } }, + Compositions = AdjustCompositionsForDifficulty(UnitCompositions.Allied), + AttackPaths = AlliedAttackPaths, + }, + GDIMain = { + Delay = AdjustDelayForDifficulty(DateTime.Minutes(5)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 20, Max = 40 }), + FollowLeader = true, + ProducerActors = { Infantry = { GDISouthBarracks }, Vehicles = { GDISouthFactory } }, + Compositions = AdjustCompositionsForDifficulty(UnitCompositions.GDI), + AttackPaths = GDIAttackPaths, + }, + AlliedAir = { + Delay = AdjustAirDelayForDifficulty(DateTime.Minutes(13)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 12, Max = 12 }), + Compositions = AirCompositions.Allied, + }, + GDIAir = { + Delay = AdjustAirDelayForDifficulty(DateTime.Minutes(13)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 12, Max = 12 }), + ActiveCondition = function() + return (not GDIHelipad1.IsDead and GDIHelipad1.Owner == GDI) or (not GDIHelipad2.IsDead and GDIHelipad2.Owner == GDI) or (not GDIHelipad3.IsDead and GDIHelipad3.Owner == GDI) + end, + Compositions = AirCompositions.GDI, + } +} + +SetupPlayers = function() + Scrin = Player.GetPlayer("Scrin") + Greece = Player.GetPlayer("Greece") + GDI = Player.GetPlayer("GDI") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = { Scrin } + MissionEnemies = { Greece, GDI } +end + +WorldLoaded = function() + SetupPlayers() + + Camera.Position = PlayerStart.CenterPosition + + InitObjectives(Scrin) + AdjustPlayerStartingCashForDifficulty() + InitGreece() + InitGDI() + + if IsVeryHardOrAbove() then + SellOnCaptureAttempt({ NWBuilding4, NEBuilding1 }) + end + + ObjectiveDestroyAdvComms = Scrin.AddObjective("Destroy GDI Advanced Communications Center.") + ObjectiveDestroyWeatherControl = Scrin.AddObjective("Destroy Allied Weather Control Device.") + + Trigger.OnKilledOrCaptured(AdvancedComms, function() + Scrin.MarkCompletedObjective(ObjectiveDestroyAdvComms) + end) + + Trigger.OnKilledOrCaptured(WeatherControl, function() + Scrin.MarkCompletedObjective(ObjectiveDestroyWeatherControl) + end) + + Utils.Do(PowerGrids, function(grid) + Trigger.OnAllKilledOrCaptured(grid.Providers, function() + Utils.Do(grid.Consumers, function(consumer) + if not consumer.IsDead then + consumer.GrantCondition("disabled") + end + end) + end) + end) + + Utils.Do(ReinforcementGroups, function(group) + Trigger.OnAllKilledOrCaptured(group.Targets, function() + Trigger.AfterDelay(DateTime.Seconds(2), function() + local wormhole = Actor.Create("wormhole", true, { Owner = Scrin, Location = group.Waypoint.Location }) + + Trigger.AfterDelay(DateTime.Seconds(2), function() + PlaySpeechNotificationToMissionPlayers("ReinforcementsArrived") + Notification("Reinforcements have arrived.") + Beacon.New(Scrin, group.Waypoint.CenterPosition) + + local reinforcements = Reinforcements.Reinforce(Scrin, group.Units, { group.Waypoint.Location }, 10, function(a) + a.Scatter() + end) + end) + + Trigger.AfterDelay(DateTime.Seconds(10), function() + wormhole.Kill() + end) + + if group.Waypoint == NEWormhole then + DoAlliedSealDrop() + elseif group.Waypoint == NWWormhole then + DoIonMammothDrop() + elseif group.Waypoint == MWormhole then + Trigger.AfterDelay(DateTime.Seconds(30), function() + InitAlliedDrops() + end) + end + end) + end) + end) + + AfterWorldLoaded() +end + +Tick = function() + OncePerSecondChecks() + OncePerFiveSecondChecks() + OncePerThirtySecondChecks() + AfterTick() +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + Greece.Resources = Greece.ResourceCapacity - 500 + GDI.Resources = GDI.ResourceCapacity - 500 + + if MissionPlayersHaveNoRequiredUnits() then + if ObjectiveDestroyAdvComms ~= nil and not Scrin.IsObjectiveCompleted(ObjectiveDestroyAdvComms) then + Scrin.MarkFailedObjective(ObjectiveDestroyAdvComms) + end + if ObjectiveDestroyWeatherControl ~= nil and not Scrin.IsObjectiveCompleted(ObjectiveDestroyWeatherControl) then + Scrin.MarkFailedObjective(ObjectiveDestroyWeatherControl) + end + end + end +end + +OncePerFiveSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 125 == 0 then + UpdatePlayerBaseLocations() + end +end + +OncePerThirtySecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % DateTime.Seconds(30) == 0 then + CalculatePlayerCharacteristics() + end +end + +InitGreece = function() + if Difficulty == "easy" then + RebuildExcludes.Greece = { Types = { "gun", "pbox", "pris", "awpr", "weat" } } + else + RebuildExcludes.Greece = { Types = { "awpr", "weat" } } + + if Difficulty == "normal" then + RebuildExcludes.Greece.Actors = { NWPillbox1, NWPillbox2, NWPillbox3, NWPillbox4 } + end + end + + AutoRepairAndRebuildBuildings(Greece, 15) + SetupRefAndSilosCaptureCredits(Greece) + AutoReplaceHarvesters(Greece) + AutoRebuildConyards(Greece) + InitAiUpgrades(Greece) + InitAttackSquad(Squads.AlliedMain, Greece) + InitAirAttackSquad(Squads.AlliedAir, Greece) + + Actor.Create("ai.unlimited.power", true, { Owner = Greece }) + + Trigger.AfterDelay(WeatherStormEnabledTime[Difficulty], function() + Actor.Create("ai.superweapons.enabled", true, { Owner = Greece }) + end) + + local alliedGroundAttackers = Greece.GetGroundAttackers() + + Utils.Do(alliedGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsGreeceGroundHunterUnit) + end) +end + +InitGDI = function() + Actor.Create("ai.unlimited.power", true, { Owner = GDI }) + + if Difficulty == "easy" then + RebuildExcludes.GDI = { Types = { "gtwr", "atwr", "stwr", "nuk2", "eye" } } + else + RebuildExcludes.GDI = { Types = { "nuk2", "eye" } } + + if Difficulty == "normal" then + RebuildExcludes.GDI.Actors = { NETower1, NETower2, NETower3, NETower4, NEBuilding7, NEBuilding8 } + end + end + + AutoRepairAndRebuildBuildings(GDI, 15) + SetupRefAndSilosCaptureCredits(GDI) + AutoReplaceHarvesters(GDI) + AutoRebuildConyards(GDI) + InitAiUpgrades(GDI) + InitAttackSquad(Squads.GDIMain, GDI) + InitAirAttackSquad(Squads.GDIAir, GDI) + + local gdiGroundAttackers = GDI.GetGroundAttackers() + + Utils.Do(gdiGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsGDIGroundHunterUnit) + end) + + Trigger.AfterDelay(IonCannonEnabledTime[Difficulty], function() + Actor.Create("ai.superweapons.enabled", true, { Owner = GDI }) + end) +end + +DoIonMammothDrop = function() + if IsHardOrBelow() then + return + end + + Trigger.AfterDelay(DateTime.Seconds(40), function() + local dropPoints = { GDIDrop1.Location, GDIDrop2.Location } + + if Difficulty == "brutal" then + table.insert(dropPoints, GDIDrop3.Location) + end + + local delay = 1 + + Utils.Do(dropPoints, function(p) + Trigger.AfterDelay(delay, function() + local entryPath = { GDIDropSpawn.Location, GDIDropRally.Location, p } + local exitPath = { GDIDropExit.Location } + ReinforcementsCA.ReinforceWithTransport(GDI, "ocar.htnk.ion", nil, entryPath, exitPath) + end) + delay = delay + DateTime.Seconds(1) + Trigger.OnEnteredFootprint({p}, function(a, id) + if a.Owner == GDI and a.Type == "htnk.ion" and not a.IsDead then + Trigger.RemoveFootprintTrigger(id) + AssaultPlayerBaseOrHunt(a) + end + end) + end) + end) +end + +DoAlliedSealDrop = function() + if IsHardOrBelow() then + return + end + + Trigger.AfterDelay(DateTime.Seconds(40), function() + local entryPath = { SealDropSpawn.Location, SealDropDest.Location } + local units = { "seal", "seal", "seal", "seal" } + + if Difficulty == "brutal" then + units = { "seal", "seal", "seal", "seal", "seal", "seal" } + end + + DoHelicopterDrop(Greece, entryPath, "tran.paradrop", units, AssaultPlayerBaseOrHunt, function(t) + Trigger.AfterDelay(DateTime.Seconds(5), function() + if not t.IsDead then + t.Move(entryPath[1]) + t.Destroy() + end + end) + end) + end) +end + +InitAlliedDrops = function() + if IsHardOrBelow() then + return + end + + local barracks = Greece.GetActorsByType("tent") + local factories = Greece.GetActorsByType("weap") + + if #barracks > 0 then + barracks[1].Produce("u3.squad") + end + + if #factories > 0 then + factories[1].Produce("gtnk.squad") + end + + Trigger.AfterDelay(AlliedDropInterval[Difficulty], function() + InitAlliedDrops() + end) +end diff --git a/mods/ca/missions/main-campaign/ca20-encroachment/map.bin b/mods/ca/missions/main-campaign/ca20-encroachment/map.bin new file mode 100644 index 0000000000..224b59b356 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca20-encroachment/map.bin differ diff --git a/mods/ca/missions/main-campaign/ca20-encroachment/map.png b/mods/ca/missions/main-campaign/ca20-encroachment/map.png new file mode 100644 index 0000000000..8a14180d5e Binary files /dev/null and b/mods/ca/missions/main-campaign/ca20-encroachment/map.png differ diff --git a/mods/ca/missions/main-campaign/ca20-encroachment/map.yaml b/mods/ca/missions/main-campaign/ca20-encroachment/map.yaml new file mode 100644 index 0000000000..34469a86a4 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca20-encroachment/map.yaml @@ -0,0 +1,3283 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 20: Encroachment + +Author: Darkademic + +Tileset: WINTER + +MapSize: 98,114 + +Bounds: 1,1,96,112 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: Scrin, Greece, GDI + PlayerReference@Scrin: + Name: Scrin + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: scrin + LockColor: True + Color: 7700FF + LockSpawn: True + LockTeam: True + Enemies: Greece, GDI, Creeps + PlayerReference@Greece: + Name: Greece + Bot: campaign + Faction: allies + Color: 99ACF2 + Allies: GDI + Enemies: Scrin, Creeps + PlayerReference@GDI: + Name: GDI + Bot: campaign + Faction: gdi + Color: F2CF74 + Allies: Greece + Enemies: Scrin, Creeps + +Actors: + Actor0: t07 + Owner: Neutral + Location: 46,14 + Actor1: tc01 + Owner: Neutral + Location: 64,19 + Actor2: tc05 + Owner: Neutral + Location: 71,15 + Actor3: t05 + Owner: Neutral + Location: 73,18 + Actor4: sfac + Owner: Scrin + Location: 47,7 + Actor5: reac + Owner: Scrin + Location: 51,5 + Actor6: port + Owner: Scrin + Location: 41,8 + Actor7: proc.scrin + Owner: Scrin + Location: 52,9 + Actor8: split2 + Owner: Neutral + Location: 61,13 + Actor9: split2 + Owner: Neutral + Location: 60,19 + Actor10: seek + Owner: Scrin + Facing: 384 + Location: 37,9 + Actor11: seek + Owner: Scrin + Location: 57,9 + Facing: 658 + Actor12: gunw + Owner: Scrin + Location: 39,11 + Facing: 384 + Actor13: gunw + Owner: Scrin + Location: 54,14 + Facing: 578 + Actor14: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 38,10 + Actor15: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 36,8 + Actor16: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 40,13 + Actor17: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 38,12 + Actor18: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 57,10 + Actor19: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 56,13 + Actor20: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 54,7 + Actor21: sbag + Owner: Greece + Location: 13,7 + Actor22: sbag + Owner: Greece + Location: 13,8 + Actor23: sbag + Owner: Greece + Location: 12,7 + Actor24: sbag + Owner: Greece + Location: 11,7 + Actor25: sbag + Owner: Greece + Location: 10,7 + Actor26: sbag + Owner: Greece + Location: 5,7 + Actor27: sbag + Owner: Greece + Location: 4,7 + Actor28: sbag + Owner: Greece + Location: 3,7 + Actor29: sbag + Owner: Greece + Location: 2,7 + Actor30: sbag + Owner: Greece + Location: 1,7 + Actor31: sbag + Owner: Greece + Location: 1,8 + Actor32: sbag + Owner: Greece + Location: 1,9 + Actor33: sbag + Owner: Greece + Location: 1,10 + Actor34: sbag + Owner: Greece + Location: 1,11 + Actor35: sbag + Owner: Greece + Location: 1,12 + Actor36: sbag + Owner: Greece + Location: 1,13 + Actor37: sbag + Owner: Greece + Location: 1,14 + Actor38: sbag + Owner: Greece + Location: 1,15 + Actor39: sbag + Owner: Greece + Location: 1,16 + Actor40: sbag + Owner: Greece + Location: 2,16 + Actor41: sbag + Owner: Greece + Location: 3,16 + Actor42: sbag + Owner: Greece + Location: 5,16 + Actor43: sbag + Owner: Greece + Location: 4,16 + Actor44: sbag + Owner: Greece + Location: 10,16 + Actor45: sbag + Owner: Greece + Location: 6,16 + Actor46: sbag + Owner: Greece + Location: 6,7 + Actor47: sbag + Owner: Greece + Location: 12,16 + Actor48: sbag + Owner: Greece + Location: 11,16 + Actor49: sbag + Owner: Greece + Location: 13,16 + Actor50: sbag + Owner: Greece + Location: 13,9 + Actor51: sbag + Owner: Greece + Location: 13,10 + Actor52: sbag + Owner: Greece + Location: 13,15 + Actor53: sbag + Owner: Greece + Location: 13,14 + Actor54: sbag + Owner: Greece + Location: 13,13 + Actor55: split2 + Owner: Neutral + Location: 16,15 + NWBuilding3: proc + Owner: Greece + Location: 9,11 + Actor58: silo + Owner: Greece + Location: 11,11 + Actor59: silo + Owner: Greece + Location: 9,11 + WPowered10: agun + Owner: Greece + Location: 12,8 + TurretFacing: 832 + WPowered9: agun + Owner: Greece + Location: 2,15 + TurretFacing: 832 + NWBuilding1: powr + Owner: Greece + Location: 2,8 + NWBuilding2: powr + Owner: Greece + Location: 4,8 + NWBuilding4: tent + Owner: Greece + Location: 4,12 + Actor70: sbag + Owner: GDI + Location: 75,26 + Actor71: sbag + Owner: GDI + Location: 76,26 + Actor72: sbag + Owner: GDI + Location: 77,26 + Actor73: sbag + Owner: GDI + Location: 78,26 + Actor74: sbag + Owner: GDI + Location: 82,26 + Actor75: sbag + Owner: GDI + Location: 83,26 + Actor76: sbag + Owner: GDI + Location: 84,26 + Actor77: sbag + Owner: GDI + Location: 85,26 + Actor78: sbag + Owner: GDI + Location: 86,26 + Actor79: sbag + Owner: GDI + Location: 87,26 + Actor80: sbag + Owner: GDI + Location: 74,26 + Actor81: sbag + Owner: GDI + Location: 73,26 + Actor82: sbag + Owner: GDI + Location: 73,27 + Actor83: sbag + Owner: GDI + Location: 73,28 + Actor84: sbag + Owner: GDI + Location: 73,29 + Actor85: sbag + Owner: GDI + Location: 73,33 + Actor86: sbag + Owner: GDI + Location: 73,34 + Actor87: sbag + Owner: GDI + Location: 73,35 + Actor88: sbag + Owner: GDI + Location: 73,36 + Actor89: sbag + Owner: GDI + Location: 74,36 + Actor90: sbag + Owner: GDI + Location: 76,36 + Actor91: sbag + Owner: GDI + Location: 75,36 + Actor92: sbag + Owner: GDI + Location: 77,36 + Actor93: sbag + Owner: GDI + Location: 78,36 + Actor94: sbag + Owner: GDI + Location: 82,36 + Actor95: sbag + Owner: GDI + Location: 83,36 + Actor96: sbag + Owner: GDI + Location: 85,36 + Actor97: sbag + Owner: GDI + Location: 84,36 + Actor98: sbag + Owner: GDI + Location: 86,36 + Actor99: sbag + Owner: GDI + Location: 87,27 + Actor100: sbag + Owner: GDI + Location: 87,28 + Actor101: sbag + Owner: GDI + Location: 87,29 + Actor105: sbag + Owner: GDI + Location: 87,33 + Actor106: sbag + Owner: GDI + Location: 87,34 + Actor107: sbag + Owner: GDI + Location: 87,35 + Actor108: sbag + Owner: GDI + Location: 87,36 + NEBuilding6: nuke + Owner: GDI + Location: 85,33 + NEBuilding5: nuke + Owner: GDI + Location: 83,33 + NEBuilding1: pyle + Owner: GDI + Location: 76,28 + NEBuilding8: gtwr + Owner: GDI + Location: 77,25 + NEBuilding7: gtwr + Owner: GDI + Location: 72,28 + NEBuilding2: proc.td + Owner: GDI + Location: 83,28 + NEBuilding3: silo.td + Owner: GDI + Location: 74,35 + NEBuilding4: silo.td + Owner: GDI + Location: 76,35 + Actor122: cram + Owner: GDI + Location: 80,31 + TurretFacing: 832 + Actor121: split2 + Owner: Neutral + Location: 91,31 + AdvancedComms: eye + Owner: GDI + Location: 77,93 + Actor125: chain + Owner: GDI + Location: 77,91 + Actor126: chain + Owner: GDI + Location: 76,91 + Actor127: chain + Owner: GDI + Location: 75,91 + Actor128: chain + Owner: GDI + Location: 75,92 + Actor129: chain + Owner: GDI + Location: 75,94 + Actor130: chain + Owner: GDI + Location: 75,93 + Actor131: chain + Owner: GDI + Location: 75,95 + Actor132: chain + Owner: GDI + Location: 78,91 + Actor133: chain + Owner: GDI + Location: 79,91 + Actor134: chain + Owner: GDI + Location: 80,91 + Actor135: chain + Owner: GDI + Location: 80,92 + Actor136: chain + Owner: GDI + Location: 80,93 + Actor137: chain + Owner: GDI + Location: 80,94 + Actor138: chain + Owner: GDI + Location: 80,95 + Actor139: chain + Owner: GDI + Location: 75,96 + Actor140: chain + Owner: GDI + Location: 75,97 + Actor141: chain + Owner: GDI + Location: 76,97 + Actor142: chain + Owner: GDI + Location: 79,97 + Actor143: chain + Owner: GDI + Location: 80,97 + Actor144: chain + Owner: GDI + Location: 80,96 + Actor145: gun + Owner: Greece + Location: 27,30 + TurretFacing: 872 + Actor146: gun + Owner: Greece + Location: 34,33 + TurretFacing: 935 + Actor196: hpad + Owner: Greece + Location: 40,42 + Actor197: hpad + Owner: Greece + Location: 37,42 + Actor198: chain + Owner: Greece + Location: 37,41 + Actor199: chain + Owner: Greece + Location: 38,41 + Actor200: chain + Owner: Greece + Location: 39,41 + Actor201: chain + Owner: Greece + Location: 40,41 + Actor202: chain + Owner: Greece + Location: 41,41 + Actor203: chain + Owner: Greece + Location: 42,41 + Actor204: chain + Owner: Greece + Location: 42,42 + Actor205: chain + Owner: Greece + Location: 42,43 + Actor206: chain + Owner: Greece + Location: 42,44 + Actor207: chain + Owner: Greece + Location: 36,41 + Actor208: chain + Owner: Greece + Location: 36,42 + Actor209: chain + Owner: Greece + Location: 36,43 + Actor210: chain + Owner: Greece + Location: 36,44 + Actor211: chain + Owner: Greece + Location: 36,46 + Actor212: chain + Owner: Greece + Location: 36,47 + Actor213: chain + Owner: Greece + Location: 38,47 + Actor214: chain + Owner: Greece + Location: 37,47 + Actor215: chain + Owner: Greece + Location: 39,47 + Actor216: chain + Owner: Greece + Location: 40,47 + Actor217: chain + Owner: Greece + Location: 41,47 + Actor218: chain + Owner: Greece + Location: 42,47 + Actor219: chain + Owner: Greece + Location: 42,46 + WPowered7: agun + Owner: Greece + Location: 37,46 + TurretFacing: 832 + WPowered8: agun + Owner: Greece + Location: 41,46 + TurretFacing: 832 + Actor222: pbox + Owner: Greece + Location: 35,43 + Actor223: split2 + Owner: Neutral + Location: 87,4 + Actor224: split2 + Owner: Neutral + Location: 90,12 + Actor187: brik + Owner: Greece + Location: 4,36 + Actor188: brik + Owner: Greece + Location: 5,36 + Actor189: brik + Owner: Greece + Location: 6,36 + Actor190: brik + Owner: Greece + Location: 7,36 + Actor191: brik + Owner: Greece + Location: 8,36 + Actor192: brik + Owner: Greece + Location: 9,36 + Actor193: brik + Owner: Greece + Location: 10,36 + Actor226: brik + Owner: Greece + Location: 11,36 + Actor227: brik + Owner: Greece + Location: 12,36 + Actor228: brik + Owner: Greece + Location: 13,36 + Actor229: brik + Owner: Greece + Location: 4,37 + WPower1: apwr + Owner: Greece + Location: 5,37 + WPower4: apwr + Owner: Greece + Location: 8,37 + Actor232: brik + Owner: Greece + Location: 13,37 + Actor234: brik + Owner: Greece + Location: 4,38 + Actor235: brik + Owner: Greece + Location: 12,38 + Actor236: brik + Owner: Greece + Location: 13,38 + Actor238: brik + Owner: Greece + Location: 4,39 + Actor239: brik + Owner: Greece + Location: 12,39 + Actor241: brik + Owner: Greece + Location: 13,39 + Actor242: pbox + Owner: Greece + Location: 14,39 + Actor243: brik + Owner: Greece + Location: 4,40 + WPower2: apwr + Owner: Greece + Location: 5,40 + WPower5: apwr + Owner: Greece + Location: 8,40 + Actor248: brik + Owner: Greece + Location: 4,41 + WPowered1: gap + Owner: Greece + Location: 12,41 + Actor252: brik + Owner: Greece + Location: 4,42 + Actor253: brik + Owner: Greece + Location: 4,43 + WPower3: apwr + Owner: Greece + Location: 5,43 + WPower6: apwr + Owner: Greece + Location: 8,43 + Actor257: brik + Owner: Greece + Location: 12,43 + Actor258: brik + Owner: Greece + Location: 13,43 + Actor260: pbox + Owner: Greece + Location: 14,43 + Actor264: brik + Owner: Greece + Location: 4,44 + Actor265: brik + Owner: Greece + Location: 12,44 + Actor266: brik + Owner: Greece + Location: 13,44 + Actor267: brik + Owner: Greece + Location: 4,45 + Actor268: brik + Owner: Greece + Location: 13,45 + Actor269: brik + Owner: Greece + Location: 4,46 + Actor270: brik + Owner: Greece + Location: 5,46 + Actor271: brik + Owner: Greece + Location: 6,46 + Actor272: brik + Owner: Greece + Location: 7,46 + Actor273: brik + Owner: Greece + Location: 8,46 + Actor274: brik + Owner: Greece + Location: 9,46 + Actor275: brik + Owner: Greece + Location: 10,46 + Actor276: brik + Owner: Greece + Location: 11,46 + Actor277: brik + Owner: Greece + Location: 12,46 + Actor278: brik + Owner: Greece + Location: 13,46 + WPowered2: agun + Owner: Greece + Location: 12,37 + TurretFacing: 832 + WPowered3: agun + Owner: Greece + Location: 12,45 + TurretFacing: 832 + Actor237: brik + Owner: Greece + Location: 14,33 + Actor240: brik + Owner: Greece + Location: 14,32 + Actor244: brik + Owner: Greece + Location: 15,32 + Actor247: brik + Owner: Greece + Location: 16,32 + Actor249: brik + Owner: Greece + Location: 17,32 + Actor250: brik + Owner: Greece + Location: 15,33 + Actor256: brik + Owner: Greece + Location: 17,33 + Actor259: brik + Owner: Greece + Location: 18,33 + Actor261: brik + Owner: Greece + Location: 18,32 + Actor262: brik + Owner: Greece + Location: 22,32 + Actor263: brik + Owner: Greece + Location: 22,33 + Actor279: brik + Owner: Greece + Location: 23,32 + Actor280: brik + Owner: Greece + Location: 23,33 + Actor281: brik + Owner: Greece + Location: 24,32 + Actor282: brik + Owner: Greece + Location: 25,32 + Actor283: brik + Owner: Greece + Location: 26,32 + Actor284: brik + Owner: Greece + Location: 27,32 + Actor285: brik + Owner: Greece + Location: 28,32 + Actor286: brik + Owner: Greece + Location: 28,33 + Actor287: brik + Owner: Greece + Location: 27,33 + Actor288: sbag + Owner: Greece + Location: 14,31 + Actor289: sbag + Owner: Greece + Location: 15,31 + Actor290: sbag + Owner: Greece + Location: 16,31 + Actor291: sbag + Owner: Greece + Location: 17,31 + Actor292: sbag + Owner: Greece + Location: 18,31 + Actor293: sbag + Owner: Greece + Location: 22,31 + Actor294: sbag + Owner: Greece + Location: 23,31 + Actor295: sbag + Owner: Greece + Location: 24,31 + Actor296: sbag + Owner: Greece + Location: 25,31 + Actor297: sbag + Owner: Greece + Location: 26,31 + Actor298: sbag + Owner: Greece + Location: 27,31 + WPowered4: pris + Owner: Greece + Location: 16,33 + WPowered5: pris + Owner: Greece + Location: 24,33 + WPowered6: agun + Owner: Greece + Location: 26,33 + TurretFacing: 832 + WPowered11: agun + Owner: Greece + Location: 36,36 + TurretFacing: 832 + Actor304: pbox + Owner: Greece + Location: 22,30 + Actor305: pbox + Owner: Greece + Location: 18,30 + Actor303: split2 + Owner: Neutral + Location: 24,50 + Actor306: split2 + Owner: Neutral + Location: 26,55 + Actor307: split2 + Owner: Neutral + Location: 18,56 + Actor309: sbag + Owner: Greece + Location: 30,59 + Actor310: sbag + Owner: Greece + Location: 31,59 + Actor311: sbag + Owner: Greece + Location: 30,60 + Actor312: sbag + Owner: Greece + Location: 30,61 + Actor313: sbag + Owner: Greece + Location: 29,61 + Actor308: sbag + Owner: Greece + Location: 29,62 + Actor314: sbag + Owner: Greece + Location: 28,62 + Actor315: sbag + Owner: Greece + Location: 27,62 + Actor316: sbag + Owner: Greece + Location: 27,63 + Actor317: sbag + Owner: Greece + Location: 32,59 + Actor318: sbag + Owner: Greece + Location: 36,59 + Actor319: sbag + Owner: Greece + Location: 37,59 + Actor320: sbag + Owner: Greece + Location: 38,59 + Actor321: sbag + Owner: Greece + Location: 39,59 + Actor322: sbag + Owner: Greece + Location: 40,59 + Actor324: sbag + Owner: Greece + Location: 27,68 + Actor325: sbag + Owner: Greece + Location: 27,69 + Actor326: sbag + Owner: Greece + Location: 27,70 + Actor327: sbag + Owner: Greece + Location: 28,70 + Actor328: sbag + Owner: Greece + Location: 29,70 + Actor329: sbag + Owner: Greece + Location: 30,70 + Actor330: sbag + Owner: Greece + Location: 31,70 + Actor331: sbag + Owner: Greece + Location: 36,70 + Actor332: sbag + Owner: Greece + Location: 32,70 + Actor333: sbag + Owner: Greece + Location: 37,70 + Actor334: sbag + Owner: Greece + Location: 38,70 + Actor335: sbag + Owner: Greece + Location: 39,70 + Actor336: sbag + Owner: Greece + Location: 40,70 + Actor337: sbag + Owner: Greece + Location: 41,59 + Actor338: sbag + Owner: Greece + Location: 41,60 + MBuilding1: proc + Owner: Greece + Location: 30,61 + Actor340: silo + Owner: Greece + Location: 28,63 + MBuilding3: tent + Owner: Greece + Location: 39,60 + MBuilding4: dome + Owner: Greece + Location: 28,67 + MBuilding5: powr + Owner: Greece + Location: 37,67 + MBuilding6: powr + Owner: Greece + Location: 39,67 + Actor347: sbag + Owner: Greece + Location: 41,68 + Actor348: sbag + Owner: Greece + Location: 41,69 + Actor349: sbag + Owner: Greece + Location: 41,70 + Actor350: sbag + Owner: Greece + Location: 41,62 + Actor351: sbag + Owner: Greece + Location: 41,61 + Actor345: sbag + Owner: Greece + Location: 41,63 + Actor352: sbag + Owner: Greece + Location: 41,67 + Actor353: sbag + Owner: Greece + Location: 27,67 + MBuilding2: powr + Owner: Greece + Location: 37,60 + Actor346: pbox + Owner: Greece + Location: 31,58 + Actor354: pbox + Owner: Greece + Location: 37,58 + Actor355: pbox + Owner: Greece + Location: 31,71 + Actor356: pbox + Owner: Greece + Location: 37,71 + Actor357: t10 + Owner: Neutral + Faction: germany + Location: 40,39 + Actor358: t02 + Owner: Neutral + Faction: germany + Location: 76,47 + Actor359: tc05 + Owner: Neutral + Faction: germany + Location: 86,39 + Actor373: afac + Owner: GDI + Location: 82,101 + SEPower6: nuk2 + Owner: GDI + Location: 79,101 + SEPower5: nuk2 + Owner: GDI + Location: 77,101 + SEPower4: nuk2 + Owner: GDI + Location: 75,101 + SEPower2: nuk2 + Owner: GDI + Location: 66,96 + SEPower1: nuk2 + Owner: GDI + Location: 65,93 + GDISouthFactory: weap.td + Owner: GDI + Location: 80,85 + Actor385: proc.td + Owner: GDI + Location: 70,86 + SEPowered7: stwr + Owner: GDI + Location: 71,81 + TurretFacing: 63 + SEPowered8: stwr + Owner: GDI + Location: 79,80 + TurretFacing: 23 + SEPowered1: atwr + Owner: GDI + Location: 65,96 + SEPowered2: atwr + Owner: GDI + Location: 86,88 + Actor390: gtwr + Owner: GDI + Location: 69,81 + Actor391: gtwr + Owner: GDI + Location: 81,80 + Actor392: hq + Owner: GDI + Location: 69,95 + Actor381: upgc + Owner: GDI + Location: 69,100 + TurretFacing: 384 + SEPower3: nuk2 + Owner: GDI + Location: 72,100 + GDISouthBarracks: pyle + Owner: GDI + Location: 75,86 + Actor396: silo.td + Owner: GDI + Location: 70,91 + Actor397: silo.td + Owner: GDI + Location: 69,93 + Actor399: afld.gdi + Owner: GDI + Location: 84,93 + SEPower7: nuk2 + Owner: GDI + Location: 86,100 + Actor393: gtek + Owner: GDI + Location: 84,96 + Actor361: chain + Owner: Greece + Location: 9,86 + Actor362: chain + Owner: Greece + Location: 10,86 + Actor363: chain + Owner: Greece + Location: 11,86 + Actor364: chain + Owner: Greece + Location: 12,86 + Actor365: chain + Owner: Greece + Location: 13,86 + Actor367: chain + Owner: Greece + Location: 14,86 + Actor369: chain + Owner: Greece + Location: 9,87 + Actor370: chain + Owner: Greece + Location: 14,87 + Actor374: chain + Owner: Greece + Location: 9,88 + WeatherControl: weat + Owner: Greece + Location: 11,88 + Actor377: chain + Owner: Greece + Location: 14,88 + Actor401: chain + Owner: Greece + Location: 9,89 + Actor402: chain + Owner: Greece + Location: 9,90 + Actor403: chain + Owner: Greece + Location: 14,90 + Actor404: chain + Owner: Greece + Location: 9,91 + Actor405: chain + Owner: Greece + Location: 10,91 + Actor406: chain + Owner: Greece + Location: 13,91 + Actor407: chain + Owner: Greece + Location: 14,91 + Actor360: brik + Owner: Greece + Location: 8,86 + Actor366: brik + Owner: Greece + Location: 8,87 + Actor368: brik + Owner: Greece + Location: 8,88 + Actor371: brik + Owner: Greece + Location: 8,89 + Actor372: brik + Owner: Greece + Location: 8,90 + Actor375: brik + Owner: Greece + Location: 8,91 + Actor408: brik + Owner: Greece + Location: 8,85 + Actor409: brik + Owner: Greece + Location: 9,85 + Actor410: brik + Owner: Greece + Location: 9,84 + Actor411: brik + Owner: Greece + Location: 10,84 + Actor412: brik + Owner: Greece + Location: 11,84 + Actor413: brik + Owner: Greece + Location: 12,84 + Actor414: brik + Owner: Greece + Location: 13,84 + Actor415: brik + Owner: Greece + Location: 13,83 + Actor416: brik + Owner: Greece + Location: 14,83 + Actor417: brik + Owner: Greece + Location: 15,83 + Actor418: brik + Owner: Greece + Location: 16,83 + Actor419: brik + Owner: Greece + Location: 17,83 + Actor420: brik + Owner: Greece + Location: 17,82 + Actor421: brik + Owner: Greece + Location: 18,82 + Actor422: brik + Owner: Greece + Location: 19,82 + Actor423: brik + Owner: Greece + Location: 20,82 + Actor424: brik + Owner: Greece + Location: 21,82 + Actor425: brik + Owner: Greece + Location: 8,92 + Actor426: brik + Owner: Greece + Location: 8,94 + Actor427: brik + Owner: Greece + Location: 8,93 + Actor428: brik + Owner: Greece + Location: 8,95 + Actor429: brik + Owner: Greece + Location: 8,96 + Actor430: brik + Owner: Greece + Location: 8,97 + Actor431: brik + Owner: Greece + Location: 8,99 + Actor432: brik + Owner: Greece + Location: 8,98 + Actor433: brik + Owner: Greece + Location: 8,100 + Actor434: brik + Owner: Greece + Location: 8,101 + Actor435: brik + Owner: Greece + Location: 8,102 + Actor436: brik + Owner: Greece + Location: 8,103 + Actor437: brik + Owner: Greece + Location: 8,104 + Actor438: brik + Owner: Greece + Location: 9,104 + Actor439: brik + Owner: Greece + Location: 10,104 + Actor440: brik + Owner: Greece + Location: 11,104 + Actor441: brik + Owner: Greece + Location: 12,104 + Actor442: brik + Owner: Greece + Location: 13,104 + Actor443: brik + Owner: Greece + Location: 14,104 + Actor444: brik + Owner: Greece + Location: 14,103 + Actor445: brik + Owner: Greece + Location: 13,103 + Actor446: brik + Owner: Greece + Location: 18,103 + Actor447: brik + Owner: Greece + Location: 18,104 + Actor448: brik + Owner: Greece + Location: 19,103 + Actor449: brik + Owner: Greece + Location: 19,104 + Actor450: brik + Owner: Greece + Location: 20,104 + Actor451: brik + Owner: Greece + Location: 21,104 + Actor452: brik + Owner: Greece + Location: 22,104 + Actor453: brik + Owner: Greece + Location: 23,104 + Actor454: brik + Owner: Greece + Location: 24,104 + Actor455: brik + Owner: Greece + Location: 25,104 + Actor456: brik + Owner: Greece + Location: 25,103 + Actor457: brik + Owner: Greece + Location: 25,102 + Actor458: brik + Owner: Greece + Location: 25,101 + Actor459: brik + Owner: Greece + Location: 25,100 + Actor460: brik + Owner: Greece + Location: 25,99 + Actor461: brik + Owner: Greece + Location: 25,98 + Actor462: brik + Owner: Greece + Location: 25,97 + Actor463: brik + Owner: Greece + Location: 25,96 + Actor464: brik + Owner: Greece + Location: 25,82 + Actor465: brik + Owner: Greece + Location: 24,82 + Actor466: brik + Owner: Greece + Location: 23,82 + Actor467: brik + Owner: Greece + Location: 22,82 + Actor468: brik + Owner: Greece + Location: 25,83 + Actor469: brik + Owner: Greece + Location: 25,84 + Actor470: brik + Owner: Greece + Location: 25,85 + Actor471: brik + Owner: Greece + Location: 25,86 + Actor472: brik + Owner: Greece + Location: 25,87 + Actor473: brik + Owner: Greece + Location: 25,88 + Actor474: brik + Owner: Greece + Location: 25,90 + Actor475: brik + Owner: Greece + Location: 25,89 + Actor476: brik + Owner: Greece + Location: 25,94 + Actor477: brik + Owner: Greece + Location: 25,95 + Actor478: brik + Owner: Greece + Location: 24,94 + Actor479: brik + Owner: Greece + Location: 24,95 + Actor480: brik + Owner: Greece + Location: 24,90 + Actor481: brik + Owner: Greece + Location: 24,89 + SWPower3: apwr + Owner: Greece + Location: 9,101 + SWPower2: apwr + Owner: Greece + Location: 9,98 + SWPower1: apwr + Owner: Greece + Location: 9,95 + Actor485: fact + Owner: Greece + Location: 13,97 + Actor486: proc + Owner: Greece + Location: 21,99 + Actor487: dome + Owner: Greece + Location: 22,84 + AlliedSouthFactory: weap + Owner: Greece + Location: 19,89 + Actor489: atek + Owner: Greece + Location: 19,84 + SWPowered8: gap + Owner: Greece + Location: 23,92 + SWPowered5: agun + Owner: Greece + Location: 24,83 + TurretFacing: 832 + SWPowered1: agun + Owner: Greece + Location: 10,85 + TurretFacing: 832 + SWPowered3: agun + Owner: Greece + Location: 14,84 + TurretFacing: 832 + SWPowered4: agun + Owner: Greece + Location: 18,83 + TurretFacing: 832 + SWPowered2: agun + Owner: Greece + Location: 9,93 + TurretFacing: 832 + Actor496: pbox + Owner: Greece + Location: 26,94 + Actor497: pbox + Owner: Greece + Location: 26,90 + Actor498: pbox + Owner: Greece + Location: 14,105 + Actor499: pbox + Owner: Greece + Location: 18,105 + SWPowered7: pris + Owner: Greece + Location: 24,96 + SWPowered6: pris + Owner: Greece + Location: 24,88 + AlliedSouthBarracks: tent + Owner: Greece + Location: 19,94 + Actor503: powr + Owner: Greece + Location: 16,86 + Actor504: powr + Owner: Greece + Location: 13,93 + Actor505: powr + Owner: Greece + Location: 16,90 + SEPowered3: cram + Owner: GDI + Location: 74,90 + TurretFacing: 832 + SEPowered5: cram + Owner: GDI + Location: 74,98 + TurretFacing: 832 + SEPowered6: cram + Owner: GDI + Location: 81,98 + TurretFacing: 832 + SEPowered4: cram + Owner: GDI + Location: 81,90 + TurretFacing: 832 + Actor510: rep + Owner: GDI + Location: 83,89 + Actor511: barb + Owner: GDI + Location: 74,91 + Actor512: barb + Owner: GDI + Location: 74,92 + Actor513: barb + Owner: GDI + Location: 74,93 + Actor514: barb + Owner: GDI + Location: 74,94 + Actor515: barb + Owner: GDI + Location: 74,95 + Actor516: barb + Owner: GDI + Location: 74,96 + Actor517: barb + Owner: GDI + Location: 74,97 + Actor518: barb + Owner: GDI + Location: 81,97 + Actor519: barb + Owner: GDI + Location: 81,96 + Actor520: barb + Owner: GDI + Location: 81,95 + Actor521: barb + Owner: GDI + Location: 81,94 + Actor522: barb + Owner: GDI + Location: 81,93 + Actor523: barb + Owner: GDI + Location: 81,92 + Actor524: barb + Owner: GDI + Location: 81,91 + Actor525: barb + Owner: GDI + Location: 76,90 + Actor526: barb + Owner: GDI + Location: 75,90 + Actor527: barb + Owner: GDI + Location: 77,90 + Actor528: barb + Owner: GDI + Location: 78,90 + Actor529: barb + Owner: GDI + Location: 79,90 + Actor530: barb + Owner: GDI + Location: 80,90 + Actor531: barb + Owner: GDI + Location: 75,98 + Actor532: barb + Owner: GDI + Location: 76,98 + Actor533: barb + Owner: GDI + Location: 79,98 + Actor534: barb + Owner: GDI + Location: 80,98 + Actor535: tc02 + Owner: Neutral + Faction: germany + Location: 79,67 + Actor536: tc01 + Owner: Neutral + Faction: germany + Location: 74,66 + Actor537: t13 + Owner: Neutral + Faction: germany + Location: 75,65 + Actor538: t12 + Owner: Neutral + Faction: germany + Location: 83,68 + Actor539: t05 + Owner: Neutral + Faction: germany + Location: 70,64 + Actor540: t02 + Owner: Neutral + Faction: germany + Location: 85,68 + Actor543: t17 + Owner: Neutral + Faction: germany + Location: 87,68 + Actor544: t05 + Owner: Neutral + Faction: germany + Location: 79,70 + Actor545: t02 + Owner: Neutral + Faction: germany + Location: 66,65 + Actor546: tc05 + Owner: Neutral + Faction: germany + Location: 56,62 + Actor547: t07 + Owner: Neutral + Faction: germany + Location: 53,61 + Actor548: t10 + Owner: Neutral + Faction: germany + Location: 60,63 + Actor549: t02 + Owner: Neutral + Faction: germany + Location: 66,62 + Actor550: t08 + Owner: Neutral + Faction: germany + Location: 65,63 + Actor551: t01 + Owner: Neutral + Faction: germany + Location: 69,63 + Actor552: t07 + Owner: Neutral + Faction: germany + Location: 92,71 + Actor553: tc04 + Owner: Neutral + Faction: germany + Location: 63,101 + Actor554: t06 + Owner: Neutral + Faction: germany + Location: 69,106 + Actor555: tc04 + Owner: Neutral + Faction: germany + Location: 89,104 + Actor556: tc03 + Owner: Neutral + Faction: germany + Location: 87,105 + Actor557: tc02 + Owner: Neutral + Faction: germany + Location: 91,103 + Actor558: t14 + Owner: Neutral + Faction: germany + Location: 91,99 + Actor559: t11 + Owner: Neutral + Faction: germany + Location: 90,95 + Actor560: tc05 + Owner: Neutral + Faction: germany + Location: 94,90 + Actor561: t12 + Owner: Neutral + Faction: germany + Location: 93,93 + Actor562: t13 + Owner: Neutral + Faction: germany + Location: 93,98 + Actor563: t14 + Owner: Neutral + Faction: germany + Location: 86,107 + Actor564: tc05 + Owner: Neutral + Faction: germany + Location: 43,92 + Actor565: t06 + Owner: Neutral + Faction: germany + Location: 45,95 + Actor566: split2 + Owner: Neutral + Location: 10,108 + Actor567: split2 + Owner: Neutral + Location: 18,109 + Actor568: split2 + Owner: Neutral + Location: 24,107 + Actor569: split2 + Owner: Neutral + Location: 73,55 + Actor570: split2 + Owner: Neutral + Location: 80,53 + Actor571: tc04 + Owner: Neutral + Location: 36,101 + Actor572: tc05 + Owner: Neutral + Location: 43,106 + Actor573: tc02 + Owner: Neutral + Location: 40,104 + Actor574: t14 + Owner: Neutral + Location: 39,102 + Actor575: t10 + Owner: Neutral + Location: 38,100 + Actor576: t13 + Owner: Neutral + Location: 36,104 + Actor577: tc01 + Owner: Neutral + Location: 36,110 + Actor578: tc04 + Owner: Neutral + Location: 36,108 + Actor579: tc03 + Owner: Neutral + Location: 37,107 + Actor580: t16 + Owner: Neutral + Location: 38,105 + Actor581: t01 + Owner: Neutral + Location: 39,110 + Actor582: t02 + Owner: Neutral + Location: 40,107 + Actor583: tc02 + Owner: Neutral + Location: 41,110 + Actor584: t16 + Owner: Neutral + Location: 40,111 + Actor585: t12 + Owner: Neutral + Location: 40,109 + Actor586: t14 + Owner: Neutral + Location: 40,106 + Actor587: t15 + Owner: Neutral + Location: 41,108 + Actor588: t17 + Owner: Neutral + Location: 44,109 + Actor589: t14 + Owner: Neutral + Location: 43,111 + Actor590: t16 + Owner: Neutral + Location: 48,111 + Actor591: tc01 + Owner: Neutral + Location: 48,108 + Actor592: t14 + Owner: Neutral + Location: 48,106 + Actor593: tc02 + Owner: Neutral + Location: 49,102 + Actor594: t17 + Owner: Neutral + Location: 50,99 + Actor595: t11 + Owner: Neutral + Location: 48,89 + Actor596: t06 + Owner: Neutral + Location: 54,76 + Actor597: t01 + Owner: Neutral + Location: 49,76 + Actor598: t03 + Owner: Neutral + Location: 50,75 + Actor599: t16 + Owner: Neutral + Location: 48,81 + Actor600: t05 + Owner: Neutral + Location: 49,80 + Actor601: t05 + Owner: Neutral + Location: 51,86 + Actor602: tc01 + Owner: Neutral + Location: 50,85 + Actor603: t15 + Owner: Neutral + Location: 48,81 + Actor604: t02 + Owner: Neutral + Location: 50,79 + Actor605: t02 + Owner: Neutral + Location: 51,75 + Actor606: t17 + Owner: Neutral + Location: 50,82 + Actor607: t11 + Owner: Neutral + Location: 52,76 + Actor608: t10 + Owner: Neutral + Location: 49,77 + Actor609: t14 + Owner: Neutral + Location: 49,87 + Actor610: t17 + Owner: Neutral + Location: 50,90 + Actor611: t14 + Owner: Neutral + Location: 49,97 + Actor612: t16 + Owner: Neutral + Location: 49,91 + Actor613: t01 + Owner: Neutral + Location: 49,95 + Actor614: t02 + Owner: Neutral + Location: 49,93 + Actor615: t01 + Owner: Neutral + Location: 49,104 + Actor616: t05 + Owner: Neutral + Location: 50,105 + Actor617: t12 + Owner: Neutral + Location: 49,100 + Actor618: t13 + Owner: Neutral + Location: 50,110 + Actor619: t15 + Owner: Neutral + Location: 49,107 + Actor620: t12 + Owner: Neutral + Location: 47,17 + Actor621: tc05 + Owner: Neutral + Location: 27,13 + Actor622: t06 + Owner: Neutral + Location: 27,6 + Actor623: t05 + Owner: Neutral + Location: 23,4 + Actor624: t15 + Owner: Neutral + Location: 19,19 + Actor625: tc02 + Owner: Neutral + Location: 33,29 + Actor626: t15 + Owner: Neutral + Location: 38,32 + Actor627: t14 + Owner: Neutral + Location: 41,27 + Actor629: t07 + Owner: Neutral + Location: 44,24 + Actor631: t02 + Owner: Neutral + Location: 45,25 + Actor632: t01 + Owner: Neutral + Location: 61,25 + Actor634: t10 + Owner: Neutral + Location: 66,23 + Actor635: t13 + Owner: Neutral + Location: 53,30 + Actor636: t05 + Owner: Neutral + Location: 50,23 + Actor637: t14 + Owner: Neutral + Location: 50,24 + Actor638: t14 + Owner: Neutral + Location: 65,5 + Actor639: t01 + Owner: Neutral + Location: 79,14 + Actor640: t10 + Owner: Neutral + Location: 72,10 + Actor641: t11 + Owner: Neutral + Location: 82,13 + Actor642: t13 + Owner: Neutral + Location: 87,20 + Actor643: tc02 + Owner: Neutral + Location: 73,23 + Actor644: t17 + Owner: Neutral + Location: 90,22 + Actor645: t11 + Owner: Neutral + Location: 92,25 + Actor646: t12 + Owner: Neutral + Location: 91,38 + Actor647: t10 + Owner: Neutral + Location: 95,40 + Actor648: t06 + Owner: Neutral + Location: 93,40 + Actor649: t02 + Owner: Neutral + Location: 64,35 + Actor650: t01 + Owner: Neutral + Location: 65,42 + Actor651: t05 + Owner: Neutral + Location: 68,41 + Actor652: t10 + Owner: Neutral + Location: 66,39 + Actor653: t06 + Owner: Neutral + Location: 75,44 + Actor654: t07 + Owner: Neutral + Location: 61,46 + Actor655: tc01 + Owner: Neutral + Location: 60,49 + Actor656: t15 + Owner: Neutral + Location: 56,57 + Actor657: t12 + Owner: Neutral + Location: 62,59 + Actor658: tc02 + Owner: Neutral + Location: 64,57 + Actor659: tc03 + Owner: Neutral + Location: 63,59 + Actor660: t17 + Owner: Neutral + Location: 77,60 + Actor663: tc04 + Owner: Neutral + Location: 84,59 + Actor665: t02 + Owner: Neutral + Location: 91,47 + Actor666: t01 + Owner: Neutral + Location: 85,44 + Actor667: t05 + Owner: Neutral + Location: 37,51 + Actor668: t01 + Owner: Neutral + Location: 44,53 + Actor669: t14 + Owner: Neutral + Location: 43,50 + Actor670: t12 + Owner: Neutral + Location: 40,50 + Actor671: t08 + Owner: Neutral + Location: 41,52 + Actor672: t02 + Owner: Neutral + Location: 47,57 + Actor673: t14 + Owner: Neutral + Location: 16,49 + Actor674: t02 + Owner: Neutral + Location: 28,42 + Actor675: t01 + Owner: Neutral + Location: 29,35 + Actor676: t02 + Owner: Neutral + Location: 10,27 + Actor677: tc04 + Owner: Neutral + Location: 2,26 + Actor678: t14 + Owner: Neutral + Location: 4,25 + Actor679: t11 + Owner: Neutral + Location: 4,20 + Actor680: t08 + Owner: Neutral + Location: 10,22 + Actor681: t16 + Owner: Neutral + Location: 16,23 + Actor683: t01 + Owner: Neutral + Location: 2,5 + Actor684: tc01 + Owner: Neutral + Location: 23,23 + Actor685: t12 + Owner: Neutral + Location: 31,1 + Actor687: t12 + Owner: Neutral + Location: 3,1 + Actor688: t10 + Owner: Neutral + Location: 61,84 + Actor689: tc05 + Owner: Neutral + Location: 54,82 + Actor690: t13 + Owner: Neutral + Location: 57,79 + Actor693: t01 + Owner: Neutral + Location: 94,83 + Actor694: t05 + Owner: Neutral + Location: 86,82 + Actor696: t02 + Owner: Neutral + Location: 54,93 + Actor697: t15 + Owner: Neutral + Location: 61,96 + Actor698: t10 + Owner: Neutral + Location: 54,101 + Actor699: tc03 + Owner: Neutral + Location: 55,94 + Actor700: t03 + Owner: Neutral + Location: 56,99 + Actor701: t06 + Owner: Neutral + Location: 55,89 + Actor702: t01 + Owner: Neutral + Location: 54,86 + Actor703: t02 + Owner: Neutral + Location: 65,89 + Actor704: t05 + Owner: Neutral + Location: 66,87 + Actor705: t06 + Owner: Neutral + Location: 75,105 + Actor706: tc01 + Owner: Neutral + Location: 56,102 + Actor707: t15 + Owner: Neutral + Location: 56,103 + Actor708: t12 + Owner: Neutral + Location: 54,106 + Actor709: t05 + Owner: Neutral + Location: 84,106 + Actor710: tc04 + Owner: Neutral + Location: 81,108 + Actor711: tc02 + Owner: Neutral + Location: 79,109 + Actor712: tc04 + Owner: Neutral + Location: 76,111 + Actor713: tc05 + Owner: Neutral + Location: 73,111 + Actor714: tc01 + Owner: Neutral + Location: 71,111 + Actor715: t16 + Owner: Neutral + Location: 84,111 + Actor716: t14 + Owner: Neutral + Location: 88,111 + Actor717: t10 + Owner: Neutral + Location: 94,109 + Actor718: t05 + Owner: Neutral + Location: 90,109 + Actor719: split2 + Owner: Neutral + Location: 82,75 + Actor720: split2 + Owner: Neutral + Location: 87,78 + Actor721: split2 + Owner: Neutral + Location: 92,78 + Actor691: msam + Owner: GDI + Location: 71,84 + Facing: 0 + Actor692: msam + Owner: GDI + Location: 80,83 + Facing: 0 + Actor695: htnk + Owner: GDI + Location: 74,80 + Facing: 0 + Actor722: htnk + Owner: GDI + Location: 76,80 + Facing: 0 + Actor723: hmmv + Owner: GDI + Location: 78,71 + Facing: 904 + Actor724: hmmv + Owner: GDI + Location: 72,70 + Facing: 904 + Actor725: vulc.ai + Owner: GDI + Location: 84,87 + Facing: 0 + Actor726: mtnk + Owner: GDI + Location: 75,83 + Facing: 0 + Actor727: mtnk + Owner: GDI + Location: 79,25 + Facing: 0 + Actor728: vulc + Owner: GDI + Facing: 384 + Location: 76,33 + Actor730: atwr + Owner: GDI + Location: 71,44 + Actor729: proc.td + Owner: GDI + Location: 70,47 + Actor731: gtwr + Owner: GDI + Location: 67,52 + Actor732: htnk + Owner: GDI + Location: 88,52 + Facing: 0 + Actor733: hsam + Owner: GDI + Location: 57,46 + Facing: 927 + Actor734: hsam + Owner: GDI + Location: 57,44 + Facing: 904 + Actor735: mtnk + Owner: GDI + Location: 88,49 + Facing: 0 + Actor736: 1tnk + Owner: Greece + Location: 7,19 + Facing: 626 + Actor737: 1tnk + Owner: Greece + Location: 12,18 + Facing: 634 + Actor738: apc.ai + Owner: Greece + Location: 6,11 + Facing: 642 + Actor739: 2tnk + Owner: Greece + Location: 16,29 + Facing: 0 + Actor740: 2tnk + Owner: Greece + Location: 17,39 + Facing: 919 + Actor741: 2tnk + Owner: Greece + Location: 34,47 + Facing: 118 + Actor742: 2tnk + Owner: Greece + Location: 34,60 + Facing: 0 + Actor743: 1tnk + Owner: Greece + Location: 33,72 + Facing: 523 + Actor744: 1tnk + Owner: Greece + Location: 43,66 + Facing: 761 + Actor745: cryo + Owner: Greece + Location: 24,98 + Facing: 888 + Actor746: ptnk + Owner: Greece + Location: 27,96 + Facing: 848 + Actor747: ptnk + Owner: Greece + Location: 26,88 + Facing: 840 + Actor748: ifv + Owner: Greece + Location: 27,101 + Facing: 515 + Actor749: jeep + Owner: Greece + Facing: 384 + Location: 37,63 + Actor750: jeep + Owner: Greece + Facing: 384 + Location: 35,40 + Actor751: jeep + Owner: Greece + Location: 22,22 + Facing: 896 + Actor752: jeep + Owner: Greece + Facing: 384 + Location: 11,53 + Actor753: jeep + Owner: Greece + Location: 60,61 + Facing: 919 + Actor754: 2tnk + Owner: Greece + Location: 29,90 + Facing: 769 + Actor755: 2tnk + Owner: Greece + Location: 29,94 + Facing: 761 + Actor756: arty + Owner: Greece + Location: 45,86 + Facing: 63 + Actor757: ptnk + Owner: Greece + Facing: 384 + Location: 43,53 + Actor758: n1 + Owner: GDI + SubCell: 3 + Location: 87,50 + Facing: 15 + Actor759: n1 + Owner: GDI + SubCell: 3 + Location: 89,48 + Facing: 943 + Actor760: n1 + Owner: GDI + SubCell: 3 + Location: 89,50 + Facing: 71 + Actor761: n1 + Owner: GDI + SubCell: 3 + Location: 86,52 + Facing: 134 + Actor762: n1 + Owner: GDI + SubCell: 3 + Location: 90,53 + Facing: 904 + Actor763: n1 + Owner: GDI + SubCell: 3 + Location: 66,53 + Facing: 384 + Actor764: n1 + Owner: GDI + SubCell: 3 + Location: 65,51 + Facing: 47 + Actor765: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 67,39 + Actor766: n1 + Owner: GDI + Location: 71,35 + SubCell: 3 + Facing: 158 + Actor767: n1 + Owner: GDI + SubCell: 3 + Location: 71,29 + Facing: 87 + Actor768: n1 + Owner: GDI + SubCell: 3 + Location: 83,24 + Facing: 47 + Actor769: n1 + Owner: GDI + Location: 82,25 + SubCell: 3 + Facing: 111 + Actor770: n1 + Owner: GDI + SubCell: 3 + Location: 88,25 + Facing: 785 + Actor771: n1 + Owner: GDI + SubCell: 3 + Location: 77,39 + Facing: 384 + Actor772: n1 + Owner: GDI + SubCell: 3 + Location: 80,38 + Facing: 555 + Actor773: n1 + Owner: GDI + Location: 72,24 + SubCell: 3 + Facing: 111 + Actor774: n1 + Owner: GDI + SubCell: 3 + Location: 77,23 + Facing: 0 + Actor775: n1 + Owner: GDI + SubCell: 3 + Location: 83,20 + Facing: 0 + Actor776: n1 + Owner: GDI + Location: 62,36 + SubCell: 3 + Facing: 888 + Actor777: n1 + Owner: GDI + SubCell: 3 + Location: 65,35 + Facing: 0 + Actor778: n1 + Owner: GDI + SubCell: 3 + Location: 61,45 + Facing: 0 + Actor779: n1 + Owner: GDI + SubCell: 3 + Location: 63,48 + Facing: 0 + Actor780: n1 + Owner: GDI + SubCell: 3 + Location: 82,67 + Facing: 793 + Actor781: n1 + Owner: GDI + SubCell: 3 + Location: 78,65 + Facing: 880 + Actor782: n1 + Owner: GDI + SubCell: 3 + Location: 71,64 + Facing: 0 + Actor783: n1 + Owner: GDI + SubCell: 3 + Location: 73,71 + Facing: 745 + Actor784: n1 + Owner: GDI + SubCell: 3 + Location: 70,70 + Facing: 911 + Actor785: n1 + Owner: GDI + SubCell: 3 + Location: 76,74 + Facing: 0 + Actor786: n1 + Owner: GDI + Location: 69,80 + SubCell: 3 + Facing: 0 + Actor787: n1 + Owner: GDI + SubCell: 3 + Location: 70,79 + Facing: 0 + Actor788: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 73,82 + Actor789: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 72,84 + Actor790: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 78,84 + Actor791: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 83,84 + Actor792: n1 + Owner: GDI + SubCell: 3 + Location: 72,90 + Facing: 904 + Actor793: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 74,87 + Actor794: n1 + Owner: GDI + Facing: 384 + Location: 74,88 + SubCell: 3 + Actor795: n1 + Owner: GDI + Facing: 384 + Location: 77,89 + SubCell: 3 + Actor796: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 82,97 + Actor797: n1 + Owner: GDI + SubCell: 3 + Location: 91,95 + Facing: 872 + Actor798: n1 + Owner: GDI + SubCell: 3 + Location: 62,96 + Facing: 31 + Actor799: n1 + Owner: GDI + SubCell: 3 + Location: 72,106 + Facing: 384 + Actor800: n1 + Owner: GDI + SubCell: 3 + Location: 92,108 + Facing: 253 + Actor801: n1 + Owner: GDI + SubCell: 3 + Location: 65,71 + Facing: 0 + Actor802: n1 + Owner: GDI + SubCell: 3 + Location: 79,46 + Facing: 0 + Actor803: n2 + Owner: GDI + Location: 89,50 + SubCell: 1 + Facing: 0 + Actor804: n2 + Owner: GDI + SubCell: 3 + Location: 73,25 + Facing: 245 + Actor805: n2 + Owner: GDI + SubCell: 3 + Location: 62,49 + Facing: 0 + Actor806: n2 + Owner: GDI + SubCell: 3 + Location: 72,72 + Facing: 880 + Actor807: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 79,83 + Actor808: n2 + Owner: GDI + SubCell: 3 + Location: 68,91 + Facing: 729 + Actor809: n2 + Owner: GDI + Location: 56,99 + SubCell: 3 + Facing: 904 + Actor810: n2 + Owner: GDI + Facing: 384 + Location: 83,108 + SubCell: 3 + Actor811: n2 + Owner: GDI + SubCell: 3 + Location: 80,45 + Facing: 0 + Actor812: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 69,85 + Actor813: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 67,93 + Actor814: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 85,88 + Actor815: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 86,92 + Actor816: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 69,98 + Actor817: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 83,100 + Actor818: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 76,100 + Actor819: e1 + Owner: Greece + SubCell: 3 + Location: 9,16 + Facing: 578 + Actor820: e1 + Owner: Greece + Location: 6,19 + SubCell: 3 + Facing: 626 + Actor821: e1 + Owner: Greece + SubCell: 3 + Location: 14,5 + Facing: 761 + Actor822: e1 + Owner: Greece + SubCell: 3 + Location: 11,5 + Facing: 896 + Actor823: e1 + Owner: Greece + SubCell: 3 + Location: 8,7 + Facing: 848 + Actor824: e1 + Owner: Greece + SubCell: 3 + Location: 12,19 + Facing: 713 + Actor825: e1 + Owner: Greece + SubCell: 3 + Location: 21,20 + Facing: 951 + Actor826: e1 + Owner: Greece + SubCell: 3 + Location: 21,23 + Facing: 0 + Actor827: e1 + Owner: Greece + Location: 22,5 + SubCell: 3 + Facing: 872 + Actor828: e1 + Owner: Greece + SubCell: 3 + Location: 22,29 + Facing: 1023 + Actor829: e1 + Owner: Greece + SubCell: 3 + Location: 17,30 + Facing: 935 + Actor830: e1 + Owner: Greece + SubCell: 3 + Location: 15,30 + Facing: 1023 + Actor831: e1 + Owner: Greece + SubCell: 3 + Location: 18,40 + Facing: 840 + Actor832: e1 + Owner: Greece + SubCell: 3 + Location: 16,37 + Facing: 983 + Actor833: e1 + Owner: Greece + SubCell: 3 + Location: 17,41 + Facing: 832 + Actor834: e1 + Owner: Greece + SubCell: 3 + Location: 18,44 + Facing: 856 + Actor835: e1 + Owner: Greece + SubCell: 3 + Location: 18,43 + Facing: 919 + Actor836: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 34,42 + Actor837: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 34,45 + Actor838: e1 + Owner: Greece + SubCell: 3 + Location: 34,72 + Facing: 539 + Actor839: e1 + Owner: Greece + SubCell: 3 + Location: 29,71 + Facing: 384 + Actor840: e1 + Owner: Greece + SubCell: 3 + Location: 37,72 + Facing: 578 + Actor841: e1 + Owner: Greece + SubCell: 3 + Location: 43,67 + Facing: 959 + Actor842: e1 + Owner: Greece + SubCell: 3 + Location: 43,63 + Facing: 689 + Actor843: e1 + Owner: Greece + Location: 42,63 + SubCell: 3 + Facing: 761 + Actor844: e1 + Owner: Greece + Location: 39,58 + SubCell: 3 + Facing: 111 + Actor845: e1 + Owner: Greece + SubCell: 3 + Location: 37,57 + Facing: 0 + Actor846: e1 + Owner: Greece + SubCell: 3 + Location: 32,58 + Facing: 0 + Actor847: e1 + Owner: Greece + SubCell: 3 + Location: 26,63 + Facing: 341 + Actor848: e1 + Owner: Greece + SubCell: 3 + Location: 26,68 + Facing: 7 + Actor849: e1 + Owner: Greece + SubCell: 3 + Location: 25,69 + Facing: 384 + Actor850: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 42,52 + Actor851: e1 + Owner: Greece + Facing: 384 + Location: 45,54 + SubCell: 3 + Actor852: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 37,37 + Actor853: e1 + Owner: Greece + SubCell: 3 + Location: 25,35 + Facing: 384 + Actor854: e1 + Owner: Greece + SubCell: 3 + Location: 8,53 + Facing: 888 + Actor855: e1 + Owner: Greece + SubCell: 3 + Location: 7,55 + Facing: 1023 + Actor856: e1 + Owner: Greece + SubCell: 3 + Location: 11,58 + Facing: 785 + Actor857: e1 + Owner: Greece + SubCell: 3 + Location: 11,69 + Facing: 904 + Actor858: e1 + Owner: Greece + SubCell: 3 + Location: 12,70 + Facing: 0 + Actor859: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 26,87 + Actor860: e1 + Owner: Greece + Facing: 384 + Location: 27,88 + SubCell: 3 + Actor861: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 28,90 + Actor862: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 29,88 + Actor863: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 27,86 + Actor864: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 27,98 + Actor865: e1 + Owner: Greece + Facing: 384 + Location: 27,99 + SubCell: 3 + Actor866: e1 + Owner: Greece + Facing: 384 + SubCell: 1 + Location: 27,98 + Actor867: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 26,96 + Actor868: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 22,96 + Actor869: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 19,99 + Actor870: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 17,93 + Actor871: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 18,88 + Actor872: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 22,87 + Actor873: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 17,102 + Actor874: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 26,98 + Actor875: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 22,97 + Actor876: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 24,86 + Actor877: e3 + Owner: Greece + Facing: 384 + Location: 17,89 + SubCell: 3 + Actor878: e3 + Owner: Greece + Facing: 384 + Location: 19,99 + SubCell: 1 + Actor879: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 46,85 + Actor880: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 38,63 + Actor881: e3 + Owner: Greece + Facing: 384 + Location: 42,63 + SubCell: 1 + Actor882: e3 + Owner: Greece + SubCell: 3 + Location: 31,60 + Facing: 158 + Actor883: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 37,40 + Actor884: e3 + Owner: Greece + SubCell: 3 + Location: 14,45 + Facing: 0 + Actor885: e3 + Owner: Greece + Location: 6,14 + SubCell: 3 + Facing: 642 + Actor886: e3 + Owner: Greece + SubCell: 3 + Location: 42,70 + Facing: 919 + Actor887: v03 + Owner: Neutral + Location: 16,66 + Actor888: v04 + Owner: Neutral + Location: 5,63 + Actor889: v02 + Owner: Neutral + Location: 11,65 + Actor890: v07 + Owner: Neutral + Location: 14,61 + Actor891: v09 + Owner: Neutral + Location: 6,67 + Actor892: brl3 + Owner: Creeps + Location: 11,8 + Actor893: barl + Owner: Creeps + Location: 12,9 + Actor894: barl + Owner: Creeps + Location: 84,25 + Actor895: brl3 + Owner: Creeps + Location: 76,25 + Actor896: t01 + Owner: Neutral + Location: 19,78 + Actor897: t01 + Owner: Neutral + Location: 19,78 + Actor898: tc02 + Owner: Neutral + Location: 21,78 + Actor899: tc05 + Owner: Neutral + Location: 28,78 + Actor900: t06 + Owner: Neutral + Location: 24,77 + Actor901: t02 + Owner: Neutral + Location: 21,74 + Actor902: t15 + Owner: Neutral + Location: 21,73 + Actor903: t11 + Owner: Neutral + Location: 27,74 + Actor904: t10 + Owner: Neutral + Location: 16,73 + Actor905: t12 + Owner: Neutral + Location: 20,71 + Actor906: t15 + Owner: Neutral + Location: 38,76 + Actor907: tc01 + Owner: Neutral + Location: 41,75 + Actor908: t10 + Owner: Neutral + Location: 48,72 + Actor909: tc04 + Owner: Neutral + Location: 46,70 + Actor910: t17 + Owner: Neutral + Location: 45,77 + Actor911: t02 + Owner: Neutral + Location: 54,68 + Actor912: t01 + Owner: Neutral + Location: 61,67 + Actor913: t07 + Owner: Neutral + Location: 60,76 + Actor914: t05 + Owner: Neutral + Location: 63,83 + Actor915: t11 + Owner: Neutral + Location: 17,60 + Actor916: t02 + Owner: Neutral + Location: 15,65 + Actor917: t05 + Owner: Neutral + Location: 1,62 + Actor918: t07 + Owner: Neutral + Location: 7,70 + Actor919: t05 + Owner: Neutral + Location: 2,49 + Actor920: t10 + Owner: Neutral + Location: 5,48 + Actor921: hmmv + Owner: GDI + Facing: 384 + Location: 83,18 + Actor922: hmmv + Owner: GDI + Location: 56,85 + Facing: 658 + AlliedAttack1: waypoint + Owner: Neutral + Location: 32,92 + AlliedAttack2a: waypoint + Owner: Neutral + Location: 34,65 + AlliedAttack2b: waypoint + Owner: Neutral + Location: 10,58 + AlliedAttack3: waypoint + Owner: Neutral + Location: 20,36 + AlliedAttack4: waypoint + Owner: Neutral + Location: 24,20 + AlliedAttack5a: waypoint + Owner: Neutral + Location: 25,3 + AlliedAttack5b: waypoint + Owner: Neutral + Location: 36,26 + GDIAttack1: waypoint + Owner: Neutral + Location: 73,75 + GDIAttack2a: waypoint + Owner: Neutral + Location: 85,47 + GDIAttack2b: waypoint + Owner: Neutral + Location: 58,29 + GDIAttack3: waypoint + Owner: Neutral + Location: 70,7 + Actor926: chain + Owner: GDI + Location: 91,55 + Actor927: chain + Owner: GDI + Location: 92,55 + Actor928: chain + Owner: GDI + Location: 93,55 + Actor929: chain + Owner: GDI + Location: 94,55 + Actor930: chain + Owner: GDI + Location: 95,55 + Actor931: chain + Owner: GDI + Location: 96,55 + Actor932: chain + Owner: GDI + Location: 96,56 + Actor933: chain + Owner: GDI + Location: 96,57 + Actor934: chain + Owner: GDI + Location: 96,58 + Actor935: chain + Owner: GDI + Location: 96,59 + Actor936: chain + Owner: GDI + Location: 96,60 + Actor937: chain + Owner: GDI + Location: 96,61 + Actor938: chain + Owner: GDI + Location: 96,62 + Actor939: chain + Owner: GDI + Location: 96,63 + Actor940: chain + Owner: GDI + Location: 96,64 + Actor941: chain + Owner: GDI + Location: 91,65 + Actor942: chain + Owner: GDI + Location: 93,65 + Actor943: chain + Owner: GDI + Location: 94,65 + Actor944: chain + Owner: GDI + Location: 95,65 + Actor945: chain + Owner: GDI + Location: 96,65 + Actor946: chain + Owner: GDI + Location: 92,65 + Actor947: chain + Owner: GDI + Location: 89,65 + Actor948: chain + Owner: GDI + Location: 90,65 + Actor949: chain + Owner: GDI + Location: 88,65 + Actor950: chain + Owner: GDI + Location: 88,64 + Actor951: chain + Owner: GDI + Location: 88,63 + Actor952: chain + Owner: GDI + Location: 90,55 + Actor953: chain + Owner: GDI + Location: 90,56 + Actor954: chain + Owner: GDI + Location: 88,61 + Actor955: chain + Owner: GDI + Location: 88,62 + Actor956: chain + Owner: GDI + Location: 88,60 + Actor957: chain + Owner: GDI + Location: 89,60 + Actor958: gtwr + Owner: GDI + Location: 89,59 + GDIHelipad3: hpad.td + Owner: GDI + Location: 94,62 + GDIHelipad1: hpad.td + Owner: GDI + Location: 94,56 + GDIHelipad2: hpad.td + Owner: GDI + Location: 94,59 + Actor925: rep + Owner: GDI + Location: 89,61 + Actor959: cram + Owner: GDI + Location: 92,57 + PlayerStart: waypoint + Owner: Neutral + Location: 49,8 + SEPowered12: cram + Owner: GDI + Location: 67,92 + TurretFacing: 832 + SEPowered10: cram + Owner: GDI + Location: 94,94 + TurretFacing: 832 + SEPowered9: cram + Owner: GDI + Location: 53,97 + TurretFacing: 832 + SEPowered11: cram + Owner: GDI + Location: 73,105 + TurretFacing: 832 + Actor923: camera + Owner: Greece + Location: 35,12 + Actor924: camera + Owner: Greece + Location: 26,19 + Actor960: camera + Owner: Greece + Location: 39,28 + Actor961: camera + Owner: Greece + Location: 35,38 + Actor962: camera + Owner: Greece + Location: 16,45 + Actor963: camera + Owner: Greece + Location: 40,57 + Actor964: camera + Owner: Greece + Location: 10,61 + Actor965: camera + Owner: Greece + Location: 37,74 + Actor966: camera + Owner: Greece + Location: 7,13 + Actor967: camera + Owner: GDI + Location: 59,12 + Actor968: camera + Owner: GDI + Location: 78,12 + Actor969: camera + Owner: GDI + Location: 62,30 + Actor970: camera + Owner: GDI + Location: 79,32 + Actor971: camera + Owner: GDI + Location: 69,50 + Actor972: camera + Owner: GDI + Location: 92,59 + Actor973: camera + Owner: GDI + Location: 73,62 + Actor974: camera + Owner: GDI + Location: 67,76 + NWWormhole: waypoint + Owner: Neutral + Location: 4,4 + NEWormhole: waypoint + Owner: Neutral + Location: 91,34 + MWormhole: waypoint + Owner: Neutral + Location: 31,54 + Actor975: t13 + Owner: Neutral + Location: 14,1 + Actor976: t07 + Owner: Neutral + Location: 20,10 + Actor977: t01 + Owner: Neutral + Location: 33,19 + NWPillbox1: pbox + Owner: Greece + Location: 5,6 + NWPillbox2: pbox + Owner: Greece + Location: 11,6 + NWPillbox3: pbox + Owner: Greece + Location: 5,17 + NWPillbox4: pbox + Owner: Greece + Location: 11,17 + NETower1: gtwr + Owner: GDI + Location: 83,25 + NETower2: gtwr + Owner: GDI + Location: 83,37 + NETower3: gtwr + Owner: GDI + Location: 77,37 + NETower4: gtwr + Owner: GDI + Location: 72,34 + GDIDropSpawn: waypoint + Owner: Neutral + Location: 92,112 + GDIDropRally: waypoint + Owner: Neutral + Location: 93,22 + GDIDrop1: waypoint + Owner: Neutral + Location: 91,6 + GDIDrop2: waypoint + Owner: Neutral + Location: 91,9 + GDIDrop3: waypoint + Owner: Neutral + Location: 93,12 + GDIDropExit: waypoint + Owner: Neutral + Location: 96,47 + SealDropSpawn: waypoint + Owner: Neutral + Location: 1,78 + SealDropDest: waypoint + Owner: Neutral + Location: 47,25 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-allegiances.yaml, encroachment-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml, encroachment-weapons.yaml diff --git a/mods/ca/missions/main-campaign/ca21-incapacitation/incapacitation-rules.yaml b/mods/ca/missions/main-campaign/ca21-incapacitation/incapacitation-rules.yaml new file mode 100644 index 0000000000..d02d2c386e --- /dev/null +++ b/mods/ca/missions/main-campaign/ca21-incapacitation/incapacitation-rules.yaml @@ -0,0 +1,126 @@ +^Palettes: + PaletteFromFile@terrain-temperat: + Filename: ca|missions/main-campaign/ca21-incapacitation/incapacitation.pal + FlashPostProcessEffect@LIGHTNINGSTRIKE: + Type: LightningStrike + FlashPostProcessEffect@IONSTRIKE: + Type: IonStrike + Color: D48FFF + TintPostProcessEffect: + Red: 1.2 + Green: 1 + Blue: 1.2 + Ambient: 0.7 + +World: + LuaScript: + Scripts: campaign.lua, incapacitation.lua + MissionData: + Briefing: A concentration of aircraft belonging to the same two human factions has been identified in this area and has been evaluated as the next significant threat to be dealt with.\n\nYou have been allocated a small task force with which you must eliminate these aircraft and their landing areas.\n\nYou must also neutralise all anti-aircraft defensive structures. This will ensure our fleet can be redeployed to the central repository with minimal airborne resistance.\n\nAn ion storm has been created to ensure that all hostile aircraft will be confined to the ground for the duration of this mission. The energy required to maintain the storm is substantial; waste no time. + MapOptions: + ShortGameCheckboxEnabled: False + ScriptLobbyDropdown@RESPAWN: + ID: respawn + Label: Respawns + Description: Enable/disable respawning on death + Values: + enabled: Enabled + disabled: Disabled + Default: disabled + DisplayOrder: 999 + MusicPlaylist: + StartingMusic: rainnite + +Player: + PlayerResources: + DefaultCash: 0 + +^GroundedAircraft: + ExternalCondition@GROUNDED: + Condition: grounded + AutoTarget: + InitialStanceAI: HoldFire + DamageMultiplier@GROUNDED: + Modifier: 200 + RequiresCondition: grounded + +ORCA: + Inherits@GROUNDED: ^GroundedAircraft + -SpawnActorOnDeath: + +A10: + Inherits@GROUNDED: ^GroundedAircraft + -SpawnActorOnDeath: + +HELI: + Inherits@GROUNDED: ^GroundedAircraft + WithIdleOverlay@ROTORGROUND: + PauseOnCondition: grounded + -SpawnActorOnDeath: + +HARR: + Inherits@GROUNDED: ^GroundedAircraft + -SpawnActorOnDeath: + +AURO: + Inherits@GROUNDED: ^GroundedAircraft + -SpawnActorOnDeath: + +WORMHOLE: + -Targetable: + +GRAV: + Power: + Amount: 0 + +^DifficultyModifiers: + Inherits@ActorDifficultyConditions: ^ActorDifficultyConditions + RevealsShroudMultiplier@NORMALEASY: + Modifier: 115 + RequiresCondition: difficulty-normal || difficulty-easy + +STMR: + Inherits@CAMPAIGNDISABLED: ^Disabled + +DEVA: + Inherits@CAMPAIGNDISABLED: ^Disabled + +PAC: + Inherits@CAMPAIGNDISABLED: ^Disabled + +MSHP: + Inherits@CAMPAIGNDISABLED: ^Disabled + +S4: + Inherits@DIFFICULTY: ^DifficultyModifiers + RevealsShroud: + Range: 8c0 + PortableChronoCA: + MaxDistance: 8 + ChargeDelay: 200 + AutoTarget: + InitialStance: HoldFire + GainsExperienceMultiplier@TenPercentXp: + Modifier: 10 + +LCHR: + Inherits@DIFFICULTY: ^DifficultyModifiers + RevealsShroud: + MinRange: 0 + Range: 8c0 + -RevealGeneratedShroud: + -RevealsShroud@GAPGEN: + RangeMultiplier@REDUCEDRANGE: + Modifier: 94 + AutoTarget: + InitialStance: HoldFire + GainsExperienceMultiplier@TenPercentXp: + Modifier: 10 + TooltipExtras: + Attributes: • Disables power plants and radars\n• Slows vehicles & cyborgs\n• Regenerates and heals allies when in coalescence form\n• Special Ability: Coalescence + +LCHR.Orb: + Health: + HP: 15000 + ReloadAmmoPoolCA: + Delay: 250 \ No newline at end of file diff --git a/mods/ca/missions/main-campaign/ca21-incapacitation/incapacitation-weapons.yaml b/mods/ca/missions/main-campaign/ca21-incapacitation/incapacitation-weapons.yaml new file mode 100644 index 0000000000..3a9840a890 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca21-incapacitation/incapacitation-weapons.yaml @@ -0,0 +1,4 @@ +IntruderDiscs: + Warhead@1Dam: SpreadDamage + Versus: + None: 25 diff --git a/mods/ca/missions/main-campaign/ca21-incapacitation/incapacitation.lua b/mods/ca/missions/main-campaign/ca21-incapacitation/incapacitation.lua new file mode 100644 index 0000000000..7d6248866d --- /dev/null +++ b/mods/ca/missions/main-campaign/ca21-incapacitation/incapacitation.lua @@ -0,0 +1,506 @@ +MissionDir = "ca|missions/main-campaign/ca21-incapacitation" + +RespawnEnabled = Map.LobbyOption("respawn") == "enabled" + +PowerGrids = { + { + Providers = { NWPower1, NWPower2, NWPower3, NWPower4 }, + Consumers = { NWPowered1, NWPowered2, NWPowered3, NWPowered4, NWPowered5, NWPowered6, NWPowered7, NWPowered8, NWPowered9, NPowered10 }, + }, + { + Providers = { NPower1, NPower2, NPower3, NPower4 }, + Consumers = { NPowered1, NPowered2, NPowered3, NPowered4, NPowered5, NPowered6, NPowered7, NPowered8, NPowered9 }, + }, + { + Providers = { NEPower1, NEPower2, NEPower3, NEPower4 }, + Consumers = { NEPowered1, NEPowered2, NEPowered3, NEPowered4, NEPowered5 }, + }, + { + Providers = { SWPower1, SWPower2, SWPower3, SWPower4 }, + Consumers = { SWPowered1, SWPowered2, SWPowered3, SWPowered4, SWPowered5, SWPowered6, SWPowered7, SWPowered8, SWPowered9, SWPowered10, SWPowered11 }, + }, + { + Providers = { SPower1, SPower2, SPower3, SPower4, SPower5 }, + Consumers = { SPowered1, SPowered2, SPowered3, SPowered4, SPowered5, SPowered6}, + }, + { + Providers = { SEPower1, SEPower2, SEPower3, SEPower4 }, + Consumers = { SEPowered1, SEPowered2, SEPowered3, SEPowered4, SEPowered5, SEPowered6, SEPowered7 }, + }, +} + +PowerPlants = { NWPower1, NWPower2, NWPower3, NWPower4, NPower1, NPower2, NPower3, NPower4, NEPower1, NEPower2, NEPower3, NEPower4, SWPower1, SWPower2, SWPower3, SWPower4, SPower1, SPower2, SPower3, SPower4, SPower5, SEPower1, SEPower2, SEPower3, SEPower4 } +AircraftStructures = { OrcaPad1, OrcaPad2, OrcaPad3, OrcaPad4, WarthogAirfield1, WarthogAirfield2, WarthogAirfield3, WarthogAirfield4, AuroraAirfield1, AuroraAirfield2, LongbowPad1, LongbowPad2, LongbowPad3, LongbowPad4, HarrierPad1, HarrierPad2 } +CoastAAGuns = { CoastAAGun1, CoastAAGun2, CoastAAGun3, CoastAAGun4, CoastAAGun5 } + +DisabledAntiAir = { } + +GroundedAircraft = { + { Orca1, OrcaPad1 }, + { Orca2, OrcaPad2 }, + { Orca3, OrcaPad3 }, + { Orca4, OrcaPad4 }, + { Warthog1, WarthogAirfield1 }, + { Warthog2, WarthogAirfield2 }, + { Warthog3, WarthogAirfield3 }, + { Warthog4, WarthogAirfield4 }, + { Aurora1, AuroraAirfield1 }, + { Aurora2, AuroraAirfield2 }, + { Longbow1, LongbowPad1 }, + { Longbow2, LongbowPad2 }, + { Longbow3, LongbowPad3 }, + { Longbow4, LongbowPad4 }, + { Harrier1, HarrierPad1 }, + { Harrier2, HarrierPad2 }, +} + +OrbsRespawning = { } + +Squads = { + Allied = { + Delay = AdjustDelayForDifficulty(DateTime.Minutes(6)), + AttackValuePerSecond = { + vhard = { Min = 2, Max = 7 }, + brutal = { Min = 5, Max = 10 }, + }, + FollowLeader = true, + ProducerActors = { Infantry = { AlliedSouthBarracks } }, + Compositions = AdjustCompositionsForDifficulty({ + { Infantry = { "e1", "e1", "e1", "e1", "e3", "e1", "e3", "e1" } }, + }), + }, + GDI = { + Delay = AdjustDelayForDifficulty(DateTime.Minutes(6) + DateTime.Seconds(30)), + AttackValuePerSecond = { + vhard = { Min = 2, Max = 7 }, + brutal = { Min = 5, Max = 10 }, + }, + FollowLeader = true, + ProducerActors = { Infantry = { GDINorthBarracks } }, + Compositions = AdjustCompositionsForDifficulty({ + { Infantry = { "n2", "n2", "n2", "n2" } }, + }), + } +} + +SetupPlayers = function() + Scrin = Player.GetPlayer("Scrin") + Greece = Player.GetPlayer("Greece") + GDI = Player.GetPlayer("GDI") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = { Scrin } + MissionEnemies = { Greece, GDI } +end + +WorldLoaded = function() + SetupPlayers() + + TimerTicks = 0 + StormsEnded = false + Camera.Position = PlayerStart.CenterPosition + AntiAir = Utils.Concat(Greece.GetActorsByType("agun"), GDI.GetActorsByType("cram")) + + InitObjectives(Scrin) + InitGreece() + InitGDI() + SetupLightning() + SetupIonStorm() + UpdateObjective() + + ObjectiveDestroyAirfields = Scrin.AddObjective("Destroy all airfields and helipads.") + ObjectiveDestroyAntiAir = Scrin.AddObjective("Destroy or disable all air defense structures.") + + Utils.Do(MissionPlayers, function(p) + Actor.Create("radar.dummy", true, { Owner = p }) + Actor.Create("blink.upgrade", true, { Owner = p }) + Actor.Create("coalescence.upgrade", true, { Owner = p }) + end) + + if Difficulty ~= "easy" then + EasyOnlyIntruder1.Destroy() + EasyOnlyIntruder2.Destroy() + end + + if IsHardOrAbove() then + EasyNormalOnlyIntruder.Destroy() + end + + Utils.Do(Scrin.GetActorsByType("s4"), function(a) + a.GrantCondition("difficulty-" .. Difficulty) + IntruderDeathTrigger(a) + end) + + Trigger.AfterDelay(DateTime.Seconds(3), function() + Tip("Intruders can teleport short distances using either the deploy command [" .. UtilsCA.Hotkey("Deploy") .. "] or force move (they can be teleported as a group).") + end) + + Utils.Do(GroundedAircraft, function(i) + i[1].ReturnToBase(i[2]) + end) + + Trigger.AfterDelay(DateTime.Seconds(10), function() + Utils.Do(GroundedAircraft, function(i) + i[1].GrantCondition("grounded") + end) + end) + + Utils.Do(PowerGrids, function(grid) + Trigger.OnAllKilledOrCaptured(grid.Providers, function() + Utils.Do(grid.Consumers, function(consumer) + if not consumer.IsDead then + consumer.GrantCondition("disabled") + if consumer.Type == "agun" or consumer.Type == "cram" then + DisabledAntiAir[tostring(consumer)] = true + end + end + end) + UpdateObjective() + end) + end) + + Trigger.AfterDelay(DateTime.Seconds(5), function() + SpawnInitialLeechers() + + Trigger.AfterDelay(DateTime.Seconds(5), function() + Tip("Leechers can be deployed using [" .. UtilsCA.Hotkey("Deploy") .. "] to temporarily transform into balls of bio-matter which heal nearby allies.") + end) + + Trigger.AfterDelay(DateTime.Seconds(10), function() + Tip("Leechers also transform in this way to avoid death and attempt to regenerate. In either case they are vulnerable in this state.") + end) + end) + + Trigger.OnAllKilled(AircraftStructures, function() + Scrin.MarkCompletedObjective(ObjectiveDestroyAirfields) + Trigger.AfterDelay(DateTime.Seconds(3), function() + StormsEnded = true + end) + end) + + Trigger.OnAllKilled(CoastAAGuns, function() + CoastAAGunsDestroyed = true + if PowerPlantsDestroyed then + Scrin.MarkCompletedObjective(ObjectiveDestroyAntiAir) + end + end) + + Trigger.OnAllKilled(PowerPlants, function() + PowerPlantsDestroyed = true + if CoastAAGunsDestroyed then + Scrin.MarkCompletedObjective(ObjectiveDestroyAntiAir) + end + end) + + Utils.Do(AircraftStructures, function(actor) + Trigger.OnDamaged(actor, function(self, attacker, damage) + if IsMissionPlayer(attacker.Owner) then + local nearbyUnits = Map.ActorsInCircle(self.CenterPosition, WDist.New(3072), function(a) return IsGroundHunterUnit(a) and (a.Owner == GDI or a.Owner == Greece) end) + Utils.Do(nearbyUnits, function(nearbyUnit) + nearbyUnit.Attack(attacker) + end) + end + end) + end) + + Utils.Do(Utils.Concat(AntiAir, AircraftStructures), function(a) + Trigger.OnKilled(a, function(self, killer) + UpdateObjective() + end) + end) + + SetupReveals({ EntranceReveal1, EntranceReveal2, EntranceReveal3, EntranceReveal4, EntranceReveal5, EntranceReveal6, EntranceReveal7, EntranceReveal8 }) + + Trigger.OnEnteredProximityTrigger(EntranceReveal6Alt.CenterPosition, WDist.New(7 * 1024), function(a, id) + if IsMissionPlayer(a.Owner) and a.Type ~= "smallcamera" then + Trigger.RemoveProximityTrigger(id) + local camera = Actor.Create("smallcamera", true, { Owner = a.Owner, Location = EntranceReveal6.Location }) + Trigger.AfterDelay(DateTime.Seconds(4), function() + camera.Destroy() + end) + end + end) + + AfterWorldLoaded() +end + +Tick = function() + OncePerSecondChecks() + OncePerFiveSecondChecks() + + if StormsEnded then + if Lighting.Red > 1 then + Lighting.Red = Lighting.Red - 0.005 + end + + if Lighting.Blue > 1 then + Lighting.Blue = Lighting.Blue - 0.005 + end + + if Lighting.Ambient < 1 then + Lighting.Ambient = Lighting.Ambient + 0.005 + end + end + + AfterTick() +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + Greece.Resources = Greece.ResourceCapacity - 500 + GDI.Resources = GDI.ResourceCapacity - 500 + + if TimerTicks > 0 then + if TimerTicks > 25 then + TimerTicks = TimerTicks - 25 + else + TimerTicks = 0 + end + end + + local intruders = GetMissionPlayersActorsByType("s4") + local leechers = GetMissionPlayersActorsByTypes({ "lchr", "lchr.orb" }) + + if not RespawnEnabled and #intruders + #leechers == 0 then + if ObjectiveDestroyAirfields ~= nil and not Scrin.IsObjectiveCompleted(ObjectiveDestroyAirfields) then + Scrin.MarkFailedObjective(ObjectiveDestroyAirfields) + end + if ObjectiveDestroyAntiAir ~= nil and not Scrin.IsObjectiveCompleted(ObjectiveDestroyAntiAir) then + Scrin.MarkFailedObjective(ObjectiveDestroyAntiAir) + end + end + end +end + +OncePerFiveSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 125 == 0 then + UpdatePlayerBaseLocations() + LeecherRespawnCheck() + end +end + +InitGreece = function() + RebuildExcludes.Greece = { Types = { "powr", "apwr", "hpad", "agun", "pbox", "pris" } } + + AutoRepairAndRebuildBuildings(Greece, 15) + SetupRefAndSilosCaptureCredits(Greece) + AutoReplaceHarvesters(Greece) + InitAiUpgrades(Greece) + + if IsVeryHardOrAbove() then + InitAttackSquad(Squads.Allied, Greece) + end + + Actor.Create("ai.unlimited.power", true, { Owner = Greece }) + + local alliedGroundAttackers = Greece.GetGroundAttackers() + + Utils.Do(alliedGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsGreeceGroundHunterUnit) + end) +end + +InitGDI = function() + RebuildExcludes.GDI = { Types = { "nuke", "nuk2", "hpad.td", "afld.gdi", "cram", "gtwr", "atwr" } } + + AutoRepairAndRebuildBuildings(GDI, 15) + SetupRefAndSilosCaptureCredits(GDI) + AutoReplaceHarvesters(GDI) + InitAiUpgrades(GDI) + + if IsVeryHardOrAbove() then + InitAttackSquad(Squads.GDI, GDI) + end + + Actor.Create("ai.unlimited.power", true, { Owner = GDI }) + + local gdiGroundAttackers = GDI.GetGroundAttackers() + + Utils.Do(gdiGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsGDIGroundHunterUnit) + end) + + local titanTriggerFootprint = { TitanTrigger1.Location, TitanTrigger2.Location, TitanTrigger3.Location, TitanTrigger4.Location, TitanTrigger5.Location } + Trigger.OnEnteredFootprint(titanTriggerFootprint, function(a, id) + if IsMissionPlayer(a.Owner) and not TitanPatroller.IsDead and not IsTitanSpotted then + IsTitanSpotted = true + Trigger.RemoveFootprintTrigger(id) + local camera = Actor.Create("smallcamera", true, { Owner = Scrin, Location = TitanPatroller.Location }) + Beacon.New(Scrin, TitanPatroller.CenterPosition) + Media.PlaySound("beacon.aud") + Notification("Dangerous unit patrolling. Evasion recommended. Press [" .. UtilsCA.Hotkey("ToLastEvent") .. "] to view.") + Trigger.AfterDelay(DateTime.Seconds(4), function() + camera.Destroy() + end) + local titanPatrolPath = { TitanPatrol1.Location, TitanPatrol2.Location, TitanPatrol3.Location, TitanPatrol4.Location, TitanPatrol5.Location, TitanPatrol6.Location } + TitanPatroller.Patrol(titanPatrolPath, true) + end + end) + + local miniDronePatrolPath = { MiniDronePatrol1.Location, MiniDronePatrol2.Location, MiniDronePatrol3.Location, MiniDronePatrol4.Location, MiniDronePatrol5.Location, MiniDronePatrol6.Location, MiniDronePatrol5.Location, MiniDronePatrol4.Location, MiniDronePatrol3.Location, MiniDronePatrol2.Location } + MiniDronePatroller1.Patrol(miniDronePatrolPath, true) + MiniDronePatroller2.Patrol(miniDronePatrolPath, true) +end + +SetupLightning = function() + local nextStrikeDelay = Utils.RandomInteger(DateTime.Seconds(8), DateTime.Seconds(25)) + Trigger.AfterDelay(nextStrikeDelay, function() + if not StormsEnded then + LightningStrike() + SetupLightning() + end + end) +end + +SetupIonStorm = function() + local nextStrikeDelay = Utils.RandomInteger(DateTime.Seconds(8), DateTime.Seconds(25)) + Trigger.AfterDelay(nextStrikeDelay, function() + if not StormsEnded then + IonStorm() + SetupIonStorm() + end + end) +end + +LightningStrike = function() + local duration = Utils.RandomInteger(5, 8) + local thunderDelay = Utils.RandomInteger(5, 65) + local soundNumber + Lighting.Flash("LightningStrike", duration) + + repeat + soundNumber = Utils.RandomInteger(1, 7) + until(soundNumber ~= LastSoundNumber) + LastSoundNumber = soundNumber + + Trigger.AfterDelay(thunderDelay, function() + Media.PlaySound("thunder" .. soundNumber .. ".aud") + end) +end + +IonStorm = function() + local duration = Utils.RandomInteger(5, 8) + local soundNumber + Lighting.Flash("IonStrike", duration) + repeat + soundNumber = Utils.RandomInteger(1, 4) + until(soundNumber ~= LastIonSoundNumber) + LastIonSoundNumber = soundNumber + Media.PlaySound("ionstorm" .. soundNumber .. ".aud") +end + +UpdateObjective = function() + local activeAA = Utils.Where(AntiAir, function(a) return not a.IsDead and not DisabledAntiAir[tostring(a)] end) + local aircraftStructuresRemaining = Utils.Where(AircraftStructures, function(a) return not a.IsDead end) + UserInterface.SetMissionText(#activeAA .. " active anti-aircraft defenses remaining. " .. #aircraftStructuresRemaining .. " aircraft structures remaining.", HSLColor.Yellow) +end + +SpawnInitialLeechers = function() + local wormhole = Actor.Create("wormhole", true, { Owner = Scrin, Location = LeecherSpawn.Location }) + Beacon.New(Scrin, LeecherSpawn.CenterPosition, DateTime.Seconds(20)) + + Trigger.AfterDelay(DateTime.Seconds(2), function() + PlaySpeechNotificationToMissionPlayers("ReinforcementsArrived") + + local leecherSquad = { "lchr", "lchr" } + if IsHardOrAbove() then + leecherSquad = { "lchr" } + end + + local leechers = Reinforcements.Reinforce(Scrin, leecherSquad, { LeecherSpawn.Location }, 1) + Utils.Do(leechers, function(leecher) + leecher.GrantCondition("difficulty-" .. Difficulty) + leecher.Scatter() + end) + + SetupLeecherRespawning() + + Trigger.AfterDelay(DateTime.Seconds(5), function() + wormhole.Kill() + end) + end) +end + +SetupLeecherRespawning = function() + if not RespawnEnabled then + return + end + + LeecherStatuses = {} + + Trigger.AfterDelay(10, function() + local leechers = GetMissionPlayersActorsByType("lchr") + Utils.Do(leechers, function(leecher) + if not LeecherStatuses[leecher.Owner.InternalName] then + LeecherStatuses[leecher.Owner.InternalName] = { Owner = leecher.Owner, IsRespawning = false, Count = 0 } + end + LeecherStatuses[leecher.Owner.InternalName].Count = LeecherStatuses[leecher.Owner.InternalName].Count + 1 + end) + end) +end + +LeecherRespawnCheck = function() + if not RespawnEnabled or not LeecherStatuses then + return + end + Utils.Do(LeecherStatuses, function(status) + if not status.IsRespawning then + local leecherCount = #status.Owner.GetActorsByTypes({ "lchr", "lchr.orb" }) + if leecherCount < status.Count then + status.IsRespawning = true + RespawnLeecher(status) + end + end + end) +end + +RespawnLeecher = function(status) + Notification("Leecher arriving in 20 seconds.") + + local player = status.Owner + local spawnCell = CPos.New(LeecherSpawn.Location.X + Utils.RandomInteger(-1, 1), LeecherSpawn.Location.Y + Utils.RandomInteger(-1, 1)) + + Trigger.AfterDelay(DateTime.Seconds(20), function() + local wormhole = Actor.Create("wormhole", true, { Owner = player, Location = spawnCell }) + + Trigger.AfterDelay(DateTime.Seconds(1), function() + local leecher = Reinforcements.Reinforce(player, { "lchr" }, { spawnCell }, 1)[1] + leecher.Scatter() + Beacon.New(player, leecher.CenterPosition) + Media.PlaySpeechNotification(player, "ReinforcementsArrived") + leecher.GrantCondition("difficulty-" .. Difficulty) + status.IsRespawning = false + end) + + Trigger.AfterDelay(DateTime.Seconds(5), function() + wormhole.Kill() + end) + end) +end + +IntruderDeathTrigger = function(a) + if RespawnEnabled then + Trigger.OnKilled(a, function(self, killer) + local spawnCell = CPos.New(IntruderSpawn.Location.X + Utils.RandomInteger(-2, 2), IntruderSpawn.Location.Y + Utils.RandomInteger(-2, 2)) + Notification("Intruder arriving in 20 seconds.") + + Trigger.AfterDelay(DateTime.Seconds(20), function() + local wormhole = Actor.Create("wormhole", true, { Owner = Scrin, Location = spawnCell }) + + Trigger.AfterDelay(DateTime.Seconds(1), function() + local intruder = Reinforcements.Reinforce(self.Owner, { "s4" }, { spawnCell }, 1)[1] + intruder.Scatter() + Beacon.New(self.Owner, intruder.CenterPosition) + Media.PlaySpeechNotification(self.Owner, "ReinforcementsArrived") + intruder.GrantCondition("difficulty-" .. Difficulty) + IntruderDeathTrigger(intruder) + end) + + Trigger.AfterDelay(DateTime.Seconds(5), function() + wormhole.Kill() + end) + end) + end) + end +end diff --git a/mods/ca/missions/main-campaign/ca21-incapacitation/incapacitation.pal b/mods/ca/missions/main-campaign/ca21-incapacitation/incapacitation.pal new file mode 100644 index 0000000000..b0f5b74c48 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca21-incapacitation/incapacitation.pal differ diff --git a/mods/ca/missions/main-campaign/ca21-incapacitation/map.bin b/mods/ca/missions/main-campaign/ca21-incapacitation/map.bin new file mode 100644 index 0000000000..3705353964 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca21-incapacitation/map.bin differ diff --git a/mods/ca/missions/main-campaign/ca21-incapacitation/map.png b/mods/ca/missions/main-campaign/ca21-incapacitation/map.png new file mode 100644 index 0000000000..915a122658 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca21-incapacitation/map.png differ diff --git a/mods/ca/missions/main-campaign/ca21-incapacitation/map.yaml b/mods/ca/missions/main-campaign/ca21-incapacitation/map.yaml new file mode 100644 index 0000000000..d7a88bc821 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca21-incapacitation/map.yaml @@ -0,0 +1,3769 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 21: Incapacitation + +Author: Darkademic + +Tileset: TEMPERAT + +MapSize: 114,82 + +Bounds: 1,1,112,80 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: Scrin, Greece, GDI + PlayerReference@Scrin: + Name: Scrin + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: scrin + LockColor: True + Color: 7700FF + LockSpawn: True + LockTeam: True + Enemies: Greece, GDI, Creeps + PlayerReference@Greece: + Name: Greece + Bot: campaign + Faction: allies + Color: 99ACF2 + Allies: GDI + Enemies: Scrin, Creeps + PlayerReference@GDI: + Name: GDI + Bot: campaign + Faction: gdi + Color: F2CF74 + Allies: Greece + Enemies: Scrin, Creeps + +Actors: + Actor0: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 8,10 + Actor1: n2 + Owner: GDI + SubCell: 3 + Facing: 682 + Location: 5,11 + Actor2: brik + Owner: GDI + Location: 22,12 + Actor3: brik + Owner: GDI + Location: 23,12 + Actor4: brik + Owner: GDI + Location: 24,12 + Actor5: brik + Owner: GDI + Location: 25,12 + Actor6: brik + Owner: GDI + Location: 26,12 + Actor7: brik + Owner: GDI + Location: 27,12 + Actor8: brik + Owner: GDI + Location: 28,12 + Actor9: brik + Owner: GDI + Location: 29,12 + Actor10: brik + Owner: GDI + Location: 30,12 + Actor11: brik + Owner: GDI + Location: 31,12 + Actor12: brik + Owner: GDI + Location: 32,12 + Actor13: brik + Owner: GDI + Location: 33,12 + Actor14: brik + Owner: GDI + Location: 34,12 + Actor15: brik + Owner: GDI + Location: 35,12 + Actor16: brik + Owner: GDI + Location: 36,12 + Actor17: brik + Owner: GDI + Location: 37,12 + Actor18: brik + Owner: GDI + Location: 38,12 + Actor19: brik + Owner: GDI + Location: 22,13 + NWPower1: nuk2 + Owner: GDI + Location: 23,13 + NWPower2: nuk2 + Owner: GDI + Location: 25,13 + NWPower3: nuk2 + Owner: GDI + Location: 27,13 + NWPower4: nuk2 + Owner: GDI + Location: 29,13 + Actor24: afac + Owner: GDI + Location: 35,13 + Actor25: brik + Owner: GDI + Location: 38,13 + Actor26: brik + Owner: GDI + Location: 22,14 + Actor28: brik + Owner: GDI + Location: 38,14 + Actor29: brik + Owner: GDI + Location: 22,15 + Actor30: brik + Owner: GDI + Location: 38,15 + Actor31: brik + Owner: GDI + Location: 22,16 + Actor32: brik + Owner: GDI + Location: 38,16 + Actor33: brik + Owner: GDI + Location: 22,17 + Actor34: brik + Owner: GDI + Location: 23,17 + Actor38: brik + Owner: GDI + Location: 38,17 + Actor39: brik + Owner: GDI + Location: 22,18 + Actor40: brik + Owner: GDI + Location: 23,18 + Actor41: brik + Owner: GDI + Location: 38,18 + Actor42: gtwr + Owner: GDI + Location: 22,19 + Actor46: brik + Owner: GDI + Location: 38,19 + Actor47: brik + Owner: GDI + Location: 38,20 + Actor50: brik + Owner: GDI + Location: 38,21 + NWPowered6: atwr + Owner: GDI + Location: 37,22 + Actor52: brik + Owner: GDI + Location: 38,22 + Actor54: gtwr + Owner: GDI + Location: 22,23 + Actor55: brik + Owner: GDI + Location: 37,23 + Actor56: brik + Owner: GDI + Location: 38,23 + Actor57: brik + Owner: GDI + Location: 22,24 + Actor58: brik + Owner: GDI + Location: 23,24 + Actor59: brik + Owner: GDI + Location: 37,24 + Actor60: brik + Owner: GDI + Location: 38,24 + Actor61: gtwr + Owner: GDI + Location: 39,24 + Actor62: n2 + Owner: GDI + SubCell: 3 + Location: 40,24 + Facing: 674 + Actor63: brik + Owner: GDI + Location: 22,25 + Actor64: brik + Owner: GDI + Location: 23,25 + Actor65: pyle + Owner: GDI + Location: 27,25 + Actor66: n1 + Owner: GDI + SubCell: 3 + Location: 39,25 + Facing: 658 + Actor67: brik + Owner: GDI + Location: 22,26 + NWPowered7: atwr + Owner: GDI + Location: 23,26 + Actor69: weap.td + Owner: GDI + Location: 31,26 + Actor70: brik + Owner: GDI + Location: 22,27 + Actor71: n1 + Owner: GDI + SubCell: 3 + Location: 26,27 + Facing: 150 + Actor72: n1 + Owner: GDI + SubCell: 2 + Location: 29,27 + Facing: 919 + Actor73: n1 + Owner: GDI + SubCell: 4 + Location: 29,27 + Facing: 753 + Actor75: brik + Owner: GDI + Location: 22,28 + NWPowered4: cram + Owner: GDI + Location: 25,28 + TurretFacing: 832 + Actor77: n2 + Owner: GDI + SubCell: 3 + Location: 27,28 + Facing: 800 + Actor78: n1 + Owner: GDI + SubCell: 3 + Location: 28,28 + Facing: 483 + Actor79: n1 + Owner: GDI + SubCell: 1 + Location: 28,28 + Facing: 384 + Actor80: brik + Owner: GDI + Location: 37,28 + Actor81: brik + Owner: GDI + Location: 38,28 + Actor82: gtwr + Owner: GDI + Location: 39,28 + Actor84: brik + Owner: GDI + Location: 22,29 + Actor85: hq + Owner: GDI + Location: 23,29 + Actor86: n1 + Owner: GDI + SubCell: 3 + Location: 27,29 + Facing: 578 + Actor87: n2 + Owner: GDI + SubCell: 1 + Location: 27,29 + Facing: 705 + Actor89: brik + Owner: GDI + Location: 37,29 + Actor90: brik + Owner: GDI + Location: 38,29 + Actor91: n1 + Owner: GDI + SubCell: 3 + Location: 40,29 + Facing: 642 + Actor92: brik + Owner: GDI + Location: 22,30 + NWPowered9: atwr + Owner: GDI + Location: 37,30 + Actor94: brik + Owner: GDI + Location: 38,30 + Actor99: brik + Owner: GDI + Location: 22,31 + NPowered10: atwr + Owner: GDI + Location: 26,31 + Actor101: brik + Owner: GDI + Location: 27,31 + Actor102: brik + Owner: GDI + Location: 28,31 + Actor103: brik + Owner: GDI + Location: 32,31 + Actor104: brik + Owner: GDI + Location: 33,31 + NWPowered8: atwr + Owner: GDI + Location: 34,31 + Actor106: brik + Owner: GDI + Location: 38,31 + Actor107: brik + Owner: GDI + Location: 22,32 + Actor108: brik + Owner: GDI + Location: 23,32 + Actor109: brik + Owner: GDI + Location: 24,32 + Actor110: brik + Owner: GDI + Location: 25,32 + Actor111: brik + Owner: GDI + Location: 26,32 + Actor112: brik + Owner: GDI + Location: 27,32 + Actor113: brik + Owner: GDI + Location: 28,32 + Actor114: n1 + Owner: GDI + SubCell: 3 + Location: 31,32 + Facing: 507 + Actor115: brik + Owner: GDI + Location: 32,32 + Actor116: brik + Owner: GDI + Location: 33,32 + Actor117: brik + Owner: GDI + Location: 34,32 + Actor118: brik + Owner: GDI + Location: 35,32 + Actor119: brik + Owner: GDI + Location: 36,32 + Actor120: brik + Owner: GDI + Location: 37,32 + Actor121: brik + Owner: GDI + Location: 38,32 + Actor123: n1 + Owner: GDI + SubCell: 3 + Location: 25,33 + Facing: 642 + Actor124: gtwr + Owner: GDI + Location: 28,33 + Actor125: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 29,33 + Actor126: gtwr + Owner: GDI + Location: 32,33 + Actor127: n2 + Owner: GDI + SubCell: 3 + Location: 33,34 + Facing: 666 + Actor131: t08 + Owner: Neutral + Location: 18,2 + Actor132: t15 + Owner: Neutral + Location: 19,1 + Actor133: tc02 + Owner: Neutral + Location: 22,1 + Actor134: t12 + Owner: Neutral + Location: 6,19 + Actor135: t16 + Owner: Neutral + Location: 10,16 + Actor136: tc02 + Owner: Neutral + Location: 11,7 + Actor137: t07 + Owner: Neutral + Location: 16,4 + Actor138: t01 + Owner: Neutral + Location: 28,7 + Actor139: t03 + Owner: Neutral + Location: 27,6 + Actor140: tc01 + Owner: Neutral + Location: 18,12 + Actor141: t15 + Owner: Neutral + Location: 15,8 + Actor143: mtnk + Owner: GDI + Location: 7,6 + Facing: 512 + Actor144: n2 + Owner: GDI + SubCell: 3 + Location: 19,6 + Facing: 317 + Actor145: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 22,8 + Actor146: htnk + Owner: GDI + Location: 30,34 + Facing: 638 + Actor147: n1 + Owner: GDI + Location: 22,22 + SubCell: 3 + Facing: 285 + Actor148: n1 + Owner: GDI + SubCell: 3 + Location: 22,20 + Facing: 269 + CoastAAGun1: agun + Owner: Greece + Location: 3,48 + TurretFacing: 79 + CoastAAGun2: agun + Owner: Greece + Location: 9,47 + TurretFacing: 31 + CoastAAGun3: agun + Owner: Greece + Location: 15,46 + TurretFacing: 31 + CoastAAGun5: agun + Owner: Greece + Location: 24,38 + TurretFacing: 229 + Actor154: sbag + Owner: Greece + Location: 23,37 + Actor155: sbag + Owner: Greece + Location: 23,37 + Actor156: sbag + Owner: Greece + Location: 24,37 + Actor157: sbag + Owner: Greece + Location: 25,37 + Actor158: sbag + Owner: Greece + Location: 25,38 + Actor160: sbag + Owner: Greece + Location: 23,38 + Actor171: sbag + Owner: Greece + Location: 3,47 + Actor172: sbag + Owner: Greece + Location: 2,47 + Actor174: sbag + Owner: Greece + Location: 4,47 + Actor175: sbag + Owner: Greece + Location: 4,48 + Actor179: sbag + Owner: Greece + Location: 8,46 + Actor180: sbag + Owner: Greece + Location: 8,46 + Actor181: sbag + Owner: Greece + Location: 9,46 + Actor182: sbag + Owner: Greece + Location: 10,46 + Actor183: sbag + Owner: Greece + Location: 8,47 + Actor187: sbag + Owner: Greece + Location: 10,47 + Actor188: sbag + Owner: Greece + Location: 14,45 + Actor189: sbag + Owner: Greece + Location: 15,45 + Actor190: sbag + Owner: Greece + Location: 16,45 + Actor191: sbag + Owner: Greece + Location: 16,46 + Actor194: sbag + Owner: Greece + Location: 14,46 + Actor197: sbag + Owner: Greece + Location: 17,39 + Actor198: sbag + Owner: Greece + Location: 18,39 + Actor200: sbag + Owner: Greece + Location: 19,39 + Actor201: sbag + Owner: Greece + Location: 17,40 + CoastAAGun4: agun + Owner: Greece + Location: 18,40 + TurretFacing: 134 + Actor206: sbag + Owner: Greece + Location: 19,40 + Actor202: e1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 6,7 + Actor203: e1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 8,6 + Actor204: e1 + Owner: GDI + SubCell: 3 + Location: 15,6 + Facing: 301 + NWPowered1: cram + Owner: GDI + Location: 13,17 + TurretFacing: 832 + Actor173: sbag + Owner: Greece + Location: 2,48 + NWPowered5: cram + Owner: GDI + Location: 35,28 + TurretFacing: 832 + NWPowered3: cram + Owner: GDI + Location: 35,17 + TurretFacing: 832 + NWPowered2: cram + Owner: GDI + Location: 25,17 + TurretFacing: 832 + Actor192: silo.td + Owner: GDI + Location: 32,15 + Actor193: silo.td + Owner: GDI + Location: 32,13 + OrcaPad1: hpad.td + Owner: GDI + Location: 28,17 + OrcaPad2: hpad.td + Owner: GDI + Location: 31,17 + Actor199: n1 + Owner: GDI + SubCell: 3 + Location: 33,19 + Facing: 840 + Actor207: n1 + Owner: GDI + SubCell: 3 + Location: 30,21 + Facing: 515 + Actor209: vulc + Owner: GDI + Location: 29,31 + Facing: 634 + Actor211: vulc + Owner: GDI + Location: 38,26 + Facing: 634 + Actor212: n1 + Owner: GDI + SubCell: 3 + Facing: 729 + Location: 37,27 + Actor213: tc01 + Owner: Neutral + Location: 61,7 + Actor214: t02 + Owner: Neutral + Location: 67,7 + Actor215: t12 + Owner: Neutral + Location: 68,6 + Actor216: chain + Owner: GDI + Location: 69,1 + Actor217: chain + Owner: GDI + Location: 69,2 + Actor218: chain + Owner: GDI + Location: 69,3 + Actor219: chain + Owner: GDI + Location: 69,4 + Actor220: chain + Owner: GDI + Location: 69,5 + Actor221: chain + Owner: GDI + Location: 69,6 + Actor222: chain + Owner: GDI + Location: 69,7 + Actor223: chain + Owner: GDI + Location: 69,8 + Actor224: chain + Owner: GDI + Location: 69,9 + Actor225: chain + Owner: GDI + Location: 69,10 + Actor226: chain + Owner: GDI + Location: 69,11 + Actor227: chain + Owner: GDI + Location: 69,12 + Actor228: chain + Owner: GDI + Location: 70,12 + Actor229: chain + Owner: GDI + Location: 71,12 + Actor230: chain + Owner: GDI + Location: 70,1 + Actor231: chain + Owner: GDI + Location: 71,1 + Actor232: chain + Owner: GDI + Location: 72,1 + Actor233: chain + Owner: GDI + Location: 73,1 + Actor234: chain + Owner: GDI + Location: 72,12 + Actor235: chain + Owner: GDI + Location: 73,12 + NPower1: nuk2 + Owner: GDI + Location: 73,4 + NPower3: nuk2 + Owner: GDI + Location: 73,7 + NPower4: nuk2 + Owner: GDI + Location: 75,7 + NPower2: nuk2 + Owner: GDI + Location: 75,4 + Actor240: chain + Owner: GDI + Location: 72,10 + Actor241: chain + Owner: GDI + Location: 72,9 + Actor242: chain + Owner: GDI + Location: 72,8 + Actor243: chain + Owner: GDI + Location: 72,7 + Actor244: chain + Owner: GDI + Location: 72,6 + Actor245: chain + Owner: GDI + Location: 72,5 + Actor246: chain + Owner: GDI + Location: 72,4 + Actor247: chain + Owner: GDI + Location: 72,3 + Actor248: chain + Owner: GDI + Location: 73,3 + Actor249: chain + Owner: GDI + Location: 74,3 + Actor250: chain + Owner: GDI + Location: 75,3 + Actor251: chain + Owner: GDI + Location: 76,3 + Actor252: chain + Owner: GDI + Location: 77,3 + Actor253: chain + Owner: GDI + Location: 77,4 + Actor254: chain + Owner: GDI + Location: 77,5 + Actor255: chain + Owner: GDI + Location: 73,10 + Actor256: chain + Owner: GDI + Location: 74,10 + Actor257: chain + Owner: GDI + Location: 75,10 + Actor258: chain + Owner: GDI + Location: 76,10 + Actor259: chain + Owner: GDI + Location: 77,10 + Actor260: chain + Owner: GDI + Location: 77,9 + Actor261: chain + Owner: GDI + Location: 77,8 + Actor262: chain + Owner: GDI + Location: 77,7 + Actor263: chain + Owner: GDI + Location: 77,6 + Actor264: chain + Owner: GDI + Location: 74,1 + Actor265: chain + Owner: GDI + Location: 75,1 + Actor266: chain + Owner: GDI + Location: 76,1 + Actor267: chain + Owner: GDI + Location: 77,1 + Actor268: chain + Owner: GDI + Location: 78,1 + Actor269: chain + Owner: GDI + Location: 79,1 + Actor270: chain + Owner: GDI + Location: 80,1 + Actor271: chain + Owner: GDI + Location: 81,1 + Actor272: chain + Owner: GDI + Location: 74,12 + Actor273: chain + Owner: GDI + Location: 75,12 + Actor274: chain + Owner: GDI + Location: 76,12 + Actor275: chain + Owner: GDI + Location: 77,12 + Actor276: chain + Owner: GDI + Location: 78,12 + Actor277: chain + Owner: GDI + Location: 79,12 + Actor278: chain + Owner: GDI + Location: 80,12 + Actor279: chain + Owner: GDI + Location: 81,12 + Actor280: chain + Owner: GDI + Location: 81,2 + Actor281: chain + Owner: GDI + Location: 81,11 + Actor282: gtwr + Owner: GDI + Location: 81,9 + Actor283: gtwr + Owner: GDI + Location: 81,4 + Actor284: chain + Owner: GDI + Location: 81,3 + Actor285: chain + Owner: GDI + Location: 81,10 + NPowered2: cram + Owner: GDI + Location: 70,11 + TurretFacing: 832 + NPowered1: cram + Owner: GDI + Location: 70,2 + TurretFacing: 832 + Actor288: n3 + Owner: GDI + SubCell: 3 + Location: 80,10 + Facing: 642 + Actor289: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 82,3 + Actor290: n2 + Owner: GDI + SubCell: 3 + Location: 82,9 + Facing: 785 + Actor291: n2 + Owner: GDI + SubCell: 3 + Location: 81,5 + Facing: 769 + Actor292: n1 + Owner: GDI + Location: 81,5 + SubCell: 1 + Facing: 491 + Actor293: n1 + Owner: GDI + SubCell: 3 + Location: 83,7 + Facing: 650 + NPowered3: atwr + Owner: GDI + Location: 58,15 + NPowered4: atwr + Owner: GDI + Location: 66,15 + NPowered6: atwr + Owner: GDI + Location: 51,22 + NPowered5: cram + Owner: GDI + Location: 51,17 + TurretFacing: 832 + Actor298: t11 + Owner: Neutral + Location: 53,16 + Actor299: t16 + Owner: Neutral + Location: 50,19 + Actor300: t02 + Owner: Neutral + Location: 65,17 + Actor301: n1 + Owner: GDI + SubCell: 3 + Location: 61,16 + Facing: 7 + Actor302: n1 + Owner: GDI + SubCell: 3 + Location: 63,16 + Facing: 0 + Actor303: n1 + Owner: GDI + SubCell: 3 + Location: 59,17 + Facing: 47 + Actor304: n1 + Owner: GDI + SubCell: 3 + Location: 64,19 + Facing: 182 + Actor305: n2 + Owner: GDI + SubCell: 3 + Location: 65,15 + Facing: 166 + Actor306: t02 + Owner: Neutral + Location: 64,25 + Actor307: t03 + Owner: Neutral + Location: 68,25 + Actor308: t11 + Owner: Neutral + Location: 65,26 + Actor309: t07 + Owner: Neutral + Location: 64,26 + Actor310: t06 + Owner: Neutral + Location: 66,25 + Actor311: tc01 + Owner: Neutral + Location: 72,27 + Actor312: tc02 + Owner: Neutral + Location: 73,25 + Actor313: t17 + Owner: Neutral + Location: 75,25 + Actor314: t13 + Owner: Neutral + Location: 67,26 + Actor315: t06 + Owner: Neutral + Location: 68,26 + Actor316: t08 + Owner: Neutral + Location: 65,26 + Actor317: t01 + Owner: Neutral + Location: 67,25 + Actor318: t08 + Owner: Neutral + Location: 73,27 + Actor320: hmmv + Owner: GDI + Location: 59,28 + Facing: 1023 + Actor321: t16 + Owner: Neutral + Location: 2,1 + Actor322: t08 + Owner: Neutral + Location: 3,2 + Actor323: brik + Owner: GDI + Location: 88,17 + Actor324: brik + Owner: GDI + Location: 90,17 + Actor325: brik + Owner: GDI + Location: 89,17 + Actor326: brik + Owner: GDI + Location: 88,16 + Actor327: brik + Owner: GDI + Location: 88,15 + Actor328: brik + Owner: GDI + Location: 88,14 + Actor329: brik + Owner: GDI + Location: 88,12 + Actor330: brik + Owner: GDI + Location: 88,13 + Actor331: brik + Owner: GDI + Location: 88,11 + Actor332: brik + Owner: GDI + Location: 88,10 + Actor333: brik + Owner: GDI + Location: 91,17 + Actor334: brik + Owner: GDI + Location: 93,17 + Actor335: brik + Owner: GDI + Location: 94,17 + Actor336: brik + Owner: GDI + Location: 92,17 + Actor340: brik + Owner: GDI + Location: 95,17 + Actor341: brik + Owner: GDI + Location: 95,16 + Actor337: brik + Owner: GDI + Location: 94,16 + Actor338: brik + Owner: GDI + Location: 99,16 + Actor339: brik + Owner: GDI + Location: 99,17 + Actor342: brik + Owner: GDI + Location: 100,16 + Actor343: brik + Owner: GDI + Location: 100,17 + Actor344: brik + Owner: GDI + Location: 101,17 + Actor345: brik + Owner: GDI + Location: 102,17 + Actor346: brik + Owner: GDI + Location: 103,17 + Actor347: brik + Owner: GDI + Location: 104,17 + Actor348: brik + Owner: GDI + Location: 105,17 + Actor349: brik + Owner: GDI + Location: 107,17 + Actor350: brik + Owner: GDI + Location: 106,17 + Actor351: brik + Owner: GDI + Location: 108,17 + Actor352: brik + Owner: GDI + Location: 108,16 + Actor353: brik + Owner: GDI + Location: 109,16 + Actor354: brik + Owner: GDI + Location: 109,15 + Actor355: brik + Owner: GDI + Location: 109,14 + Actor356: brik + Owner: GDI + Location: 109,13 + Actor357: brik + Owner: GDI + Location: 109,12 + Actor358: brik + Owner: GDI + Location: 109,11 + Actor359: brik + Owner: GDI + Location: 109,10 + Actor360: brik + Owner: GDI + Location: 109,8 + Actor361: brik + Owner: GDI + Location: 109,9 + Actor362: brik + Owner: GDI + Location: 109,7 + Actor363: brik + Owner: GDI + Location: 109,6 + Actor364: brik + Owner: GDI + Location: 109,5 + Actor365: brik + Owner: GDI + Location: 109,4 + Actor366: brik + Owner: GDI + Location: 108,4 + Actor367: brik + Owner: GDI + Location: 106,4 + Actor368: brik + Owner: GDI + Location: 107,4 + Actor369: brik + Owner: GDI + Location: 105,4 + Actor370: brik + Owner: GDI + Location: 103,4 + Actor371: brik + Owner: GDI + Location: 104,4 + Actor372: brik + Owner: GDI + Location: 101,4 + Actor373: brik + Owner: GDI + Location: 102,4 + Actor374: brik + Owner: GDI + Location: 100,4 + Actor375: brik + Owner: GDI + Location: 99,4 + Actor376: brik + Owner: GDI + Location: 99,5 + Actor377: brik + Owner: GDI + Location: 100,5 + Actor378: brik + Owner: GDI + Location: 95,5 + Actor379: brik + Owner: GDI + Location: 95,4 + Actor380: brik + Owner: GDI + Location: 94,4 + Actor381: brik + Owner: GDI + Location: 94,5 + Actor382: brik + Owner: GDI + Location: 93,4 + Actor383: brik + Owner: GDI + Location: 92,4 + Actor384: brik + Owner: GDI + Location: 91,4 + Actor385: brik + Owner: GDI + Location: 90,4 + Actor386: brik + Owner: GDI + Location: 89,4 + Actor387: brik + Owner: GDI + Location: 88,4 + Actor388: brik + Owner: GDI + Location: 88,5 + Actor389: brik + Owner: GDI + Location: 89,5 + Actor390: brik + Owner: GDI + Location: 88,9 + Actor391: brik + Owner: GDI + Location: 89,9 + Actor392: brik + Owner: GDI + Location: 89,10 + NEPowered3: atwr + Owner: GDI + Location: 101,16 + NEPowered2: atwr + Owner: GDI + Location: 93,16 + Actor395: gtwr + Owner: GDI + Location: 95,18 + Actor396: gtwr + Owner: GDI + Location: 99,18 + Actor398: hq + Owner: GDI + Location: 89,14 + NEPower4: nuk2 + Owner: GDI + Location: 107,5 + NEPower3: nuk2 + Owner: GDI + Location: 105,5 + NEPower2: nuk2 + Owner: GDI + Location: 103,5 + NEPower1: nuk2 + Owner: GDI + Location: 101,5 + WarthogAirfield1: afld.gdi + Owner: GDI + Location: 93,9 + WarthogAirfield2: afld.gdi + Owner: GDI + Location: 93,12 + Actor397: rep + Owner: GDI + Location: 97,10 + WarthogAirfield4: afld.gdi + Owner: GDI + Location: 101,12 + WarthogAirfield3: afld.gdi + Owner: GDI + Location: 101,9 + NEPowered5: cram + Owner: GDI + Location: 107,16 + TurretFacing: 832 + NEPowered1: cram + Owner: GDI + Location: 90,5 + TurretFacing: 832 + NEPowered4: cram + Owner: GDI + Location: 98,9 + TurretFacing: 832 + Actor411: n1 + Owner: GDI + SubCell: 3 + Location: 91,13 + Facing: 618 + Actor412: n1 + Owner: GDI + SubCell: 3 + Location: 91,10 + Facing: 118 + Actor413: n1 + Owner: GDI + SubCell: 3 + Location: 92,11 + Facing: 634 + Actor415: n1 + Owner: GDI + Location: 91,13 + SubCell: 1 + Facing: 277 + Actor418: n1 + Owner: GDI + Location: 92,13 + SubCell: 4 + Facing: 777 + Actor419: n1 + Owner: GDI + SubCell: 3 + Location: 91,15 + Facing: 507 + Actor414: n2 + Owner: GDI + SubCell: 3 + Facing: 384 + Location: 99,7 + Actor416: mtnk + Owner: GDI + Facing: 384 + Location: 100,19 + Actor417: tc02 + Owner: Neutral + Location: 89,19 + Actor420: tc01 + Owner: Neutral + Location: 105,18 + Actor421: t16 + Owner: Neutral + Location: 112,16 + Actor422: t17 + Owner: Neutral + Location: 102,19 + Actor423: tc02 + Owner: Neutral + Location: 110,1 + Actor424: t13 + Owner: Neutral + Location: 83,1 + Actor425: t16 + Owner: Neutral + Location: 84,11 + Actor426: t06 + Owner: Neutral + Location: 85,12 + Actor427: mtnk + Owner: GDI + Facing: 261 + Location: 87,24 + Actor428: mtnk + Owner: GDI + Facing: 261 + Location: 87,26 + Actor429: tc04 + Owner: Neutral + Location: 84,47 + Actor430: t17 + Owner: Neutral + Location: 86,44 + Actor431: tc05 + Owner: Neutral + Location: 89,41 + Actor432: tc02 + Owner: Neutral + Location: 82,36 + Actor433: t16 + Owner: Neutral + Location: 80,39 + Actor434: t15 + Owner: Neutral + Location: 82,39 + Actor435: t11 + Owner: Neutral + Location: 86,37 + Actor436: t07 + Owner: Neutral + Location: 85,35 + Actor437: t14 + Owner: Neutral + Location: 80,42 + Actor438: tc02 + Owner: Neutral + Location: 93,40 + Actor439: tc04 + Owner: Neutral + Location: 88,33 + Actor440: t16 + Owner: Neutral + Location: 89,32 + Actor442: t06 + Owner: Neutral + Location: 91,38 + Actor443: t07 + Owner: Neutral + Location: 88,38 + Actor444: t13 + Owner: Neutral + Location: 90,31 + Actor445: tc03 + Owner: Neutral + Location: 90,37 + Actor446: t16 + Owner: Neutral + Location: 94,33 + Actor447: t07 + Owner: Neutral + Location: 95,38 + Actor448: t13 + Owner: Neutral + Location: 93,36 + Actor449: t07 + Owner: Neutral + Location: 95,31 + Actor450: t13 + Owner: Neutral + Location: 97,36 + Actor441: t01 + Owner: Neutral + Location: 99,34 + Actor451: t06 + Owner: Neutral + Location: 98,33 + Actor452: t03 + Owner: Neutral + Location: 99,39 + Actor453: brik + Owner: Greece + Location: 27,57 + Actor454: brik + Owner: Greece + Location: 31,57 + Actor455: brik + Owner: Greece + Location: 32,57 + Actor456: brik + Owner: Greece + Location: 31,58 + Actor457: brik + Owner: Greece + Location: 32,58 + Actor458: brik + Owner: Greece + Location: 27,58 + Actor459: brik + Owner: Greece + Location: 26,58 + Actor460: brik + Owner: Greece + Location: 26,57 + Actor461: brik + Owner: Greece + Location: 25,57 + Actor462: brik + Owner: Greece + Location: 24,57 + Actor463: brik + Owner: Greece + Location: 23,57 + Actor464: brik + Owner: Greece + Location: 22,57 + Actor465: brik + Owner: Greece + Location: 21,57 + Actor466: brik + Owner: Greece + Location: 21,58 + Actor467: brik + Owner: Greece + Location: 21,59 + Actor468: brik + Owner: Greece + Location: 21,61 + Actor469: brik + Owner: Greece + Location: 21,60 + Actor470: brik + Owner: Greece + Location: 21,62 + Actor471: brik + Owner: Greece + Location: 22,62 + Actor472: brik + Owner: Greece + Location: 22,61 + Actor473: brik + Owner: Greece + Location: 21,66 + Actor474: brik + Owner: Greece + Location: 22,66 + Actor475: brik + Owner: Greece + Location: 21,67 + Actor476: brik + Owner: Greece + Location: 22,67 + Actor477: brik + Owner: Greece + Location: 21,68 + Actor478: brik + Owner: Greece + Location: 21,69 + Actor479: brik + Owner: Greece + Location: 21,70 + Actor480: brik + Owner: Greece + Location: 22,70 + Actor481: brik + Owner: Greece + Location: 22,69 + Actor482: brik + Owner: Greece + Location: 22,71 + Actor483: brik + Owner: Greece + Location: 22,72 + Actor484: brik + Owner: Greece + Location: 23,72 + Actor485: brik + Owner: Greece + Location: 23,71 + Actor505: brik + Owner: Greece + Location: 33,57 + Actor506: brik + Owner: Greece + Location: 34,57 + Actor507: brik + Owner: Greece + Location: 35,57 + Actor508: brik + Owner: Greece + Location: 36,57 + Actor509: brik + Owner: Greece + Location: 37,57 + Actor510: brik + Owner: Greece + Location: 38,57 + Actor514: brik + Owner: Greece + Location: 39,60 + Actor515: brik + Owner: Greece + Location: 39,59 + Actor516: brik + Owner: Greece + Location: 39,58 + Actor517: brik + Owner: Greece + Location: 39,57 + SWPower1: apwr + Owner: Greece + Location: 32,73 + SWPower2: apwr + Owner: Greece + Location: 28,71 + Actor523: proc + Owner: Greece + Location: 25,62 + Actor526: pbox + Owner: Greece + Location: 27,56 + Actor527: pbox + Owner: Greece + Location: 31,56 + Actor532: fact + Owner: Greece + Location: 24,67 + SWPowered1: agun + Owner: Greece + Location: 24,72 + TurretFacing: 832 + SWPowered6: agun + Owner: Greece + Location: 38,58 + TurretFacing: 832 + SWPowered11: agun + Owner: Greece + Location: 22,58 + TurretFacing: 832 + SWPowered2: pris + Owner: Greece + Location: 22,68 + SWPowered3: pris + Owner: Greece + Location: 22,60 + SWPowered5: pris + Owner: Greece + Location: 33,58 + SWPowered4: pris + Owner: Greece + Location: 25,58 + Actor488: brik + Owner: Greece + Location: 39,73 + Actor489: brik + Owner: Greece + Location: 38,73 + Actor490: brik + Owner: Greece + Location: 38,72 + Actor491: brik + Owner: Greece + Location: 39,72 + Actor492: brik + Owner: Greece + Location: 39,71 + Actor493: brik + Owner: Greece + Location: 39,70 + Actor494: brik + Owner: Greece + Location: 39,69 + Actor495: brik + Owner: Greece + Location: 39,68 + Actor496: brik + Owner: Greece + Location: 39,67 + Actor497: brik + Owner: Greece + Location: 39,66 + Actor498: brik + Owner: Greece + Location: 38,66 + Actor499: brik + Owner: Greece + Location: 38,67 + Actor500: brik + Owner: Greece + Location: 38,62 + Actor501: brik + Owner: Greece + Location: 38,61 + Actor502: brik + Owner: Greece + Location: 39,61 + Actor503: brik + Owner: Greece + Location: 39,62 + SWPowered8: pris + Owner: Greece + Location: 38,68 + SWPowered7: pris + Owner: Greece + Location: 38,60 + SWPowered10: agun + Owner: Greece + Location: 37,75 + TurretFacing: 832 + Actor513: pbox + Owner: Greece + Location: 40,66 + Actor518: pbox + Owner: Greece + Location: 40,62 + Actor530: silo + Owner: Greece + Location: 27,62 + Actor531: silo + Owner: Greece + Location: 25,62 + Actor534: split2 + Owner: Neutral + Location: 15,58 + Actor540: split2 + Owner: Neutral + Location: 11,60 + Actor541: split2 + Owner: Neutral + Location: 13,66 + Actor544: split2 + Owner: Neutral + Location: 7,63 + Actor524: weap + Owner: Greece + Location: 34,60 + Actor525: tent + Owner: Greece + Location: 31,60 + Actor545: dome + Owner: Greece + Location: 37,69 + SWPower3: apwr + Owner: Greece + Location: 32,70 + SWPower4: apwr + Owner: Greece + Location: 28,68 + LongbowPad1: hpad + Owner: Greece + Location: 32,65 + LongbowPad2: hpad + Owner: Greece + Location: 34,65 + SWPowered9: agun + Owner: Greece + Location: 29,64 + TurretFacing: 832 + Actor548: sbag + Owner: Greece + Location: 31,65 + Actor549: sbag + Owner: Greece + Location: 31,64 + Actor550: sbag + Owner: Greece + Location: 32,64 + Actor551: sbag + Owner: Greece + Location: 33,64 + Actor552: sbag + Owner: Greece + Location: 34,64 + Actor553: sbag + Owner: Greece + Location: 35,64 + Actor554: sbag + Owner: Greece + Location: 36,64 + Actor555: sbag + Owner: Greece + Location: 36,65 + Actor556: sbag + Owner: Greece + Location: 36,66 + Actor557: sbag + Owner: Greece + Location: 31,66 + Orca1: orca + Owner: GDI + Location: 30,17 + Facing: 384 + Orca2: orca + Owner: GDI + Location: 33,17 + Facing: 384 + Warthog1: a10 + Owner: GDI + Location: 96,8 + Facing: 384 + Warthog2: a10 + Owner: GDI + Location: 95,11 + Facing: 384 + Warthog3: a10 + Owner: GDI + Location: 103,8 + Facing: 384 + Warthog4: a10 + Owner: GDI + Location: 104,11 + Facing: 384 + Longbow1: heli + Owner: Greece + Location: 33,68 + Facing: 384 + Longbow2: heli + Owner: Greece + Location: 35,68 + Facing: 384 + Actor566: 2tnk + Owner: Greece + Location: 29,55 + Facing: 103 + Actor568: 2tnk + Owner: Greece + Location: 41,64 + Facing: 769 + Actor567: jeep + Owner: Greece + Location: 8,51 + Facing: 111 + Actor569: jeep + Owner: Greece + Location: 10,64 + Facing: 1023 + Actor570: 2tnk + Owner: Greece + Location: 17,42 + Facing: 626 + Actor571: e1 + Owner: Greece + Location: 11,47 + SubCell: 3 + Facing: 721 + Actor572: e1 + Owner: Greece + SubCell: 3 + Location: 18,41 + Facing: 610 + Actor573: e1 + Owner: Greece + SubCell: 3 + Location: 16,43 + Facing: 515 + Actor574: e1 + Owner: Greece + SubCell: 3 + Location: 22,39 + Facing: 610 + Actor575: e1 + Owner: Greece + SubCell: 3 + Location: 5,49 + Facing: 578 + Actor576: e1 + Owner: Greece + SubCell: 3 + Location: 28,50 + Facing: 0 + Actor577: e1 + Owner: Greece + SubCell: 3 + Location: 23,51 + Facing: 0 + Actor578: e3 + Owner: Greece + SubCell: 3 + Facing: 384 + Location: 6,47 + Actor580: e3 + Owner: Greece + SubCell: 3 + Location: 28,60 + Facing: 384 + Actor581: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 23,59 + Actor582: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 23,70 + Actor584: seal + Owner: Greece + Location: 30,61 + SubCell: 3 + Facing: 285 + Actor588: e1 + Owner: Greece + Location: 33,61 + SubCell: 3 + Facing: 610 + Actor590: e1 + Owner: Greece + SubCell: 1 + Location: 30,62 + Facing: 55 + Actor591: e1 + Owner: Greece + SubCell: 2 + Location: 30,62 + Facing: 777 + Actor592: e1 + Owner: Greece + SubCell: 3 + Location: 30,62 + Facing: 634 + Actor585: e1 + Owner: Greece + Facing: 384 + Location: 33,62 + SubCell: 1 + Actor583: seal + Owner: Greece + Location: 29,62 + SubCell: 3 + Facing: 95 + Actor586: medi + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 33,60 + Actor589: brik + Owner: Greece + Location: 62,64 + Actor593: brik + Owner: Greece + Location: 63,64 + Actor594: brik + Owner: Greece + Location: 64,64 + Actor595: brik + Owner: Greece + Location: 65,64 + Actor596: brik + Owner: Greece + Location: 66,64 + Actor597: brik + Owner: Greece + Location: 67,64 + Actor598: brik + Owner: Greece + Location: 68,64 + Actor599: brik + Owner: Greece + Location: 69,64 + Actor600: brik + Owner: Greece + Location: 70,64 + Actor601: brik + Owner: Greece + Location: 74,64 + Actor602: brik + Owner: Greece + Location: 75,64 + Actor603: brik + Owner: Greece + Location: 76,64 + Actor604: brik + Owner: Greece + Location: 77,64 + Actor605: brik + Owner: Greece + Location: 78,64 + Actor606: brik + Owner: Greece + Location: 79,64 + Actor607: brik + Owner: Greece + Location: 80,64 + Actor608: brik + Owner: Greece + Location: 81,64 + Actor609: brik + Owner: Greece + Location: 62,65 + Actor610: brik + Owner: Greece + Location: 69,65 + Actor611: brik + Owner: Greece + Location: 70,65 + Actor612: brik + Owner: Greece + Location: 74,65 + Actor613: brik + Owner: Greece + Location: 75,65 + Actor614: brik + Owner: Greece + Location: 81,65 + Actor616: brik + Owner: Greece + Location: 81,66 + Actor624: brik + Owner: Greece + Location: 81,67 + Actor627: brik + Owner: Greece + Location: 81,68 + Actor638: brik + Owner: Greece + Location: 81,69 + Actor663: brik + Owner: Greece + Location: 81,70 + Actor670: brik + Owner: Greece + Location: 81,71 + Actor675: brik + Owner: Greece + Location: 81,72 + Actor680: brik + Owner: Greece + Location: 81,73 + Actor682: brik + Owner: Greece + Location: 81,74 + Actor683: brik + Owner: Greece + Location: 62,75 + Actor684: brik + Owner: Greece + Location: 81,75 + Actor685: brik + Owner: Greece + Location: 62,76 + Actor686: brik + Owner: Greece + Location: 81,76 + Actor687: brik + Owner: Greece + Location: 62,77 + Actor688: brik + Owner: Greece + Location: 81,77 + Actor689: brik + Owner: Greece + Location: 62,78 + Actor690: brik + Owner: Greece + Location: 81,78 + Actor691: brik + Owner: Greece + Location: 62,79 + Actor692: brik + Owner: Greece + Location: 63,79 + Actor693: brik + Owner: Greece + Location: 64,79 + Actor694: brik + Owner: Greece + Location: 65,79 + Actor695: brik + Owner: Greece + Location: 66,79 + Actor696: brik + Owner: Greece + Location: 67,79 + Actor697: brik + Owner: Greece + Location: 68,79 + Actor698: brik + Owner: Greece + Location: 69,79 + Actor699: brik + Owner: Greece + Location: 70,79 + Actor700: brik + Owner: Greece + Location: 71,79 + Actor701: brik + Owner: Greece + Location: 72,79 + Actor702: brik + Owner: Greece + Location: 73,79 + Actor703: brik + Owner: Greece + Location: 74,79 + Actor704: brik + Owner: Greece + Location: 75,79 + Actor705: brik + Owner: Greece + Location: 76,79 + Actor706: brik + Owner: Greece + Location: 77,79 + Actor707: brik + Owner: Greece + Location: 78,79 + Actor708: brik + Owner: Greece + Location: 79,79 + Actor709: brik + Owner: Greece + Location: 80,79 + Actor710: brik + Owner: Greece + Location: 81,79 + Actor652: n1 + Owner: GDI + SubCell: 3 + Facing: 658 + Location: 39,23 + Actor810: split2 + Owner: Neutral + Location: 96,78 + SPowered1: agun + Owner: Greece + Location: 63,78 + TurretFacing: 832 + SPowered3: agun + Owner: Greece + Location: 80,65 + TurretFacing: 832 + SPowered2: agun + Owner: Greece + Location: 80,78 + TurretFacing: 832 + SPower3: apwr + Owner: Greece + Location: 70,76 + SPower2: apwr + Owner: Greece + Location: 73,76 + SPower1: apwr + Owner: Greece + Location: 76,76 + Actor820: weap + Owner: Greece + Location: 78,66 + Actor821: pbox + Owner: Greece + Location: 70,63 + Actor822: pbox + Owner: Greece + Location: 74,63 + SPower4: apwr + Owner: Greece + Location: 67,76 + SPowered6: pris + Owner: Greece + Location: 76,65 + SPowered5: pris + Owner: Greece + Location: 68,65 + SPowered4: pris + Owner: Greece + Location: 63,65 + Actor809: split2 + Owner: Neutral + Location: 90,72 + Actor711: chain + Owner: GDI + Location: 105,50 + Actor712: chain + Owner: GDI + Location: 106,50 + Actor713: chain + Owner: GDI + Location: 107,50 + Actor714: chain + Owner: GDI + Location: 108,50 + Actor715: chain + Owner: GDI + Location: 109,50 + Actor716: chain + Owner: GDI + Location: 110,50 + Actor717: chain + Owner: GDI + Location: 111,50 + Actor718: chain + Owner: GDI + Location: 112,50 + Actor719: chain + Owner: GDI + Location: 105,51 + Actor720: chain + Owner: GDI + Location: 112,51 + Actor721: chain + Owner: GDI + Location: 105,52 + OrcaPad3: hpad.td + Owner: GDI + Location: 107,52 + OrcaPad4: hpad.td + Owner: GDI + Location: 109,52 + Actor724: chain + Owner: GDI + Location: 112,52 + Actor725: chain + Owner: GDI + Location: 105,53 + Actor726: chain + Owner: GDI + Location: 112,53 + Actor727: chain + Owner: GDI + Location: 105,54 + Actor728: chain + Owner: GDI + Location: 112,54 + Actor729: gtwr + Owner: GDI + Location: 96,55 + Actor730: gtwr + Owner: GDI + Location: 100,55 + Actor731: chain + Owner: GDI + Location: 105,55 + Actor732: chain + Owner: GDI + Location: 112,55 + Actor733: brik + Owner: GDI + Location: 93,56 + Actor734: brik + Owner: GDI + Location: 94,56 + Actor735: brik + Owner: GDI + Location: 95,56 + Actor736: brik + Owner: GDI + Location: 96,56 + Actor737: brik + Owner: GDI + Location: 100,56 + Actor738: brik + Owner: GDI + Location: 101,56 + Actor739: brik + Owner: GDI + Location: 102,56 + Actor740: brik + Owner: GDI + Location: 103,56 + Actor741: brik + Owner: GDI + Location: 104,56 + Actor742: brik + Owner: GDI + Location: 105,56 + Actor743: brik + Owner: GDI + Location: 106,56 + Actor744: brik + Owner: GDI + Location: 107,56 + Actor745: brik + Owner: GDI + Location: 108,56 + Actor746: brik + Owner: GDI + Location: 111,56 + Actor750: brik + Owner: GDI + Location: 112,56 + Actor751: brik + Owner: GDI + Location: 93,57 + SEPowered2: atwr + Owner: GDI + Location: 94,57 + Actor753: brik + Owner: GDI + Location: 95,57 + Actor754: brik + Owner: GDI + Location: 96,57 + Actor755: brik + Owner: GDI + Location: 100,57 + Actor756: brik + Owner: GDI + Location: 101,57 + SEPowered1: atwr + Owner: GDI + Location: 102,57 + Actor758: hq + Owner: GDI + Location: 104,57 + Actor759: brik + Owner: GDI + Location: 107,57 + Actor760: brik + Owner: GDI + Location: 108,57 + Actor761: brik + Owner: GDI + Location: 111,57 + Actor763: brik + Owner: GDI + Location: 112,57 + Actor764: brik + Owner: GDI + Location: 93,58 + SEPowered7: cram + Owner: GDI + Location: 111,58 + TurretFacing: 832 + Actor767: brik + Owner: GDI + Location: 112,58 + Actor778: brik + Owner: GDI + Location: 93,59 + Actor779: pyle + Owner: GDI + Location: 95,59 + Actor780: brik + Owner: GDI + Location: 112,59 + Actor781: brik + Owner: GDI + Location: 93,60 + SEPowered3: cram + Owner: GDI + Location: 101,60 + TurretFacing: 832 + Actor783: brik + Owner: GDI + Location: 112,60 + Actor784: brik + Owner: GDI + Location: 93,61 + SEPower1: nuk2 + Owner: GDI + Location: 110,61 + Actor786: brik + Owner: GDI + Location: 112,61 + Actor787: brik + Owner: GDI + Location: 93,62 + AuroraAirfield1: afld.gdi + Owner: GDI + Location: 104,62 + Actor789: brik + Owner: GDI + Location: 112,62 + Actor790: brik + Owner: GDI + Location: 93,63 + Actor791: weap.td + Owner: GDI + Location: 95,63 + Actor792: rep + Owner: GDI + Location: 100,63 + Actor793: brik + Owner: GDI + Location: 112,63 + Actor794: brik + Owner: GDI + Location: 93,64 + SEPower2: nuk2 + Owner: GDI + Location: 110,64 + Actor796: brik + Owner: GDI + Location: 112,64 + Actor797: brik + Owner: GDI + Location: 93,65 + AuroraAirfield2: afld.gdi + Owner: GDI + Location: 104,65 + Actor799: brik + Owner: GDI + Location: 112,65 + Actor800: brik + Owner: GDI + Location: 93,66 + Actor801: brik + Owner: GDI + Location: 112,66 + Actor802: brik + Owner: GDI + Location: 93,67 + Actor803: proc.td + Owner: GDI + Location: 95,67 + Actor805: silo.td + Owner: GDI + Location: 99,67 + SEPower3: nuk2 + Owner: GDI + Location: 110,67 + Actor807: brik + Owner: GDI + Location: 112,67 + Actor828: brik + Owner: GDI + Location: 93,68 + Actor829: brik + Owner: GDI + Location: 112,68 + Actor830: brik + Owner: GDI + Location: 93,69 + Actor831: silo.td + Owner: GDI + Location: 99,69 + SEPowered4: cram + Owner: GDI + Location: 103,69 + TurretFacing: 832 + Actor833: brik + Owner: GDI + Location: 112,69 + Actor834: brik + Owner: GDI + Location: 93,70 + Actor835: afac + Owner: GDI + Location: 106,70 + SEPower4: nuk2 + Owner: GDI + Location: 110,70 + Actor837: brik + Owner: GDI + Location: 112,70 + Actor838: brik + Owner: GDI + Location: 93,71 + Actor839: brik + Owner: GDI + Location: 112,71 + Actor840: brik + Owner: GDI + Location: 93,72 + SEPowered5: atwr + Owner: GDI + Location: 94,72 + Actor842: brik + Owner: GDI + Location: 95,72 + Actor843: brik + Owner: GDI + Location: 96,72 + Actor844: brik + Owner: GDI + Location: 100,72 + Actor845: brik + Owner: GDI + Location: 101,72 + SEPowered6: atwr + Owner: GDI + Location: 102,72 + Actor847: brik + Owner: GDI + Location: 112,72 + Actor848: brik + Owner: GDI + Location: 93,73 + Actor849: brik + Owner: GDI + Location: 94,73 + Actor850: brik + Owner: GDI + Location: 95,73 + Actor851: brik + Owner: GDI + Location: 96,73 + Actor852: brik + Owner: GDI + Location: 100,73 + Actor853: brik + Owner: GDI + Location: 101,73 + Actor854: brik + Owner: GDI + Location: 102,73 + Actor855: brik + Owner: GDI + Location: 103,73 + Actor856: brik + Owner: GDI + Location: 104,73 + Actor857: brik + Owner: GDI + Location: 105,73 + Actor858: brik + Owner: GDI + Location: 106,73 + Actor859: brik + Owner: GDI + Location: 107,73 + Actor860: brik + Owner: GDI + Location: 108,73 + Actor861: brik + Owner: GDI + Location: 109,73 + Actor862: brik + Owner: GDI + Location: 110,73 + Actor863: brik + Owner: GDI + Location: 111,73 + Actor864: brik + Owner: GDI + Location: 112,73 + Actor804: tc01 + Owner: Neutral + Location: 104,79 + Actor808: tc02 + Owner: Neutral + Location: 109,78 + Actor865: t16 + Owner: Neutral + Location: 112,79 + Actor866: t12 + Owner: Neutral + Location: 105,74 + Actor867: t15 + Owner: Neutral + Location: 82,76 + Actor868: t02 + Owner: Neutral + Location: 86,77 + Actor823: brik + Owner: Greece + Location: 62,66 + Actor824: brik + Owner: Greece + Location: 63,66 + Actor827: pbox + Owner: Greece + Location: 61,67 + Actor869: brik + Owner: Greece + Location: 62,67 + Actor870: brik + Owner: Greece + Location: 63,67 + Actor871: pbox + Owner: Greece + Location: 61,71 + Actor872: brik + Owner: Greece + Location: 62,71 + Actor873: brik + Owner: Greece + Location: 63,71 + Actor874: brik + Owner: Greece + Location: 62,72 + Actor875: brik + Owner: Greece + Location: 63,72 + Actor876: brik + Owner: Greece + Location: 62,73 + Actor878: brik + Owner: Greece + Location: 62,74 + Actor879: v01 + Owner: Neutral + Location: 48,67 + Actor880: v03 + Owner: Neutral + Location: 53,61 + Actor881: v04 + Owner: Neutral + Location: 54,64 + Actor882: v05 + Owner: Neutral + Location: 54,54 + Actor883: v08 + Owner: Neutral + Location: 59,57 + Actor884: v11 + Owner: Neutral + Location: 51,59 + Actor885: v10 + Owner: Neutral + Location: 49,71 + Actor886: v09 + Owner: Neutral + Location: 50,64 + Actor887: v07 + Owner: Neutral + Location: 50,56 + Actor888: t01 + Owner: Neutral + Location: 50,53 + Actor889: tc04 + Owner: Neutral + Location: 63,55 + Actor890: t03 + Owner: Neutral + Location: 62,56 + Actor891: t02 + Owner: Neutral + Location: 61,54 + Actor892: t07 + Owner: Neutral + Location: 56,65 + Actor893: t11 + Owner: Neutral + Location: 55,60 + Actor894: t12 + Owner: Neutral + Location: 53,59 + Actor895: t02 + Owner: Neutral + Location: 54,56 + Actor896: tc05 + Owner: Neutral + Location: 46,60 + Actor897: t05 + Owner: Neutral + Location: 43,51 + Actor898: t02 + Owner: Neutral + Location: 52,73 + Actor899: t17 + Owner: Neutral + Location: 58,61 + Actor900: tc03 + Owner: Neutral + Location: 62,51 + Actor901: t06 + Owner: Neutral + Location: 54,72 + Actor902: tc04 + Owner: Neutral + Location: 55,78 + Actor903: tc02 + Owner: Neutral + Location: 56,76 + Actor904: t16 + Owner: Neutral + Location: 60,74 + Actor905: t13 + Owner: Neutral + Location: 51,76 + Actor906: t14 + Owner: Neutral + Location: 43,70 + Actor907: t07 + Owner: Neutral + Location: 45,65 + Actor908: t02 + Owner: Neutral + Location: 43,56 + Actor909: t06 + Owner: Neutral + Location: 50,50 + Actor910: t08 + Owner: Neutral + Location: 46,48 + Actor911: t05 + Owner: Neutral + Location: 38,48 + Actor912: tc01 + Owner: Neutral + Location: 35,50 + Actor913: hmmv + Owner: GDI + Location: 100,30 + Facing: 626 + Actor915: htnk.ion + Owner: GDI + Location: 98,55 + Facing: 0 + TitanPatroller: titn.rail + Owner: GDI + Location: 76,21 + Facing: 256 + Actor917: hmmv.tow + Owner: GDI + Facing: 384 + Location: 109,43 + MiniDronePatroller1: mdrn + Owner: GDI + SubCell: 3 + Location: 37,38 + Facing: 768 + MiniDronePatroller2: mdrn + Owner: GDI + SubCell: 3 + Location: 34,39 + Facing: 768 + Actor921: vulc + Owner: GDI + Facing: 384 + Location: 86,11 + Actor922: gdrn + Owner: GDI + Location: 105,9 + Facing: 512 + Actor923: gdrn + Owner: GDI + Location: 106,10 + Facing: 512 + Actor924: 1tnk + Owner: Greece + Facing: 384 + Location: 54,69 + Actor925: 1tnk + Owner: Greece + Location: 52,53 + Facing: 642 + Actor926: chpr + Owner: Greece + Location: 72,63 + Facing: 1023 + Actor927: cryo + Owner: Greece + Location: 36,54 + Facing: 95 + Actor928: 2tnk + Owner: Greece + Location: 72,52 + Facing: 0 + Actor930: apc.ai + Owner: Greece + Location: 61,65 + Facing: 111 + Actor931: e1 + Owner: Greece + SubCell: 3 + Location: 49,58 + Facing: 507 + Actor932: e1 + Owner: Greece + Location: 50,55 + SubCell: 3 + Facing: 697 + Actor933: e1 + Owner: Greece + Location: 52,72 + SubCell: 3 + Facing: 1023 + Actor934: e1 + Owner: Greece + SubCell: 3 + Location: 53,73 + Facing: 166 + Actor935: e1 + Owner: Greece + SubCell: 3 + Location: 75,52 + Facing: 0 + Actor936: e1 + Owner: Greece + SubCell: 3 + Location: 69,54 + Facing: 384 + Actor937: e1 + Owner: Greece + SubCell: 3 + Location: 70,52 + Facing: 0 + Actor938: e1 + Owner: Greece + SubCell: 3 + Location: 78,62 + Facing: 0 + Actor939: e1 + Owner: Greece + SubCell: 3 + Location: 71,62 + Facing: 0 + Actor949: e1 + Owner: Greece + Location: 62,70 + SubCell: 1 + Facing: 118 + Actor951: e1 + Owner: Greece + SubCell: 3 + Location: 61,63 + Facing: 277 + Actor952: e1 + Owner: Greece + SubCell: 3 + Location: 48,51 + Facing: 594 + Actor953: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 38,53 + Actor954: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 34,56 + Actor955: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 44,58 + Actor956: e1 + Owner: Greece + SubCell: 3 + Location: 82,57 + Facing: 142 + Actor957: e3 + Owner: Greece + SubCell: 3 + Facing: 384 + Location: 83,54 + Actor958: e3 + Owner: Greece + Facing: 384 + Location: 77,65 + SubCell: 3 + Actor961: e3 + Owner: Greece + SubCell: 3 + Location: 63,62 + Facing: 888 + Actor962: e3 + Owner: Greece + Facing: 384 + Location: 53,63 + SubCell: 3 + Actor963: e3 + Owner: Greece + Facing: 384 + Location: 65,55 + SubCell: 3 + Actor964: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 20,63 + Actor965: n1 + Owner: GDI + SubCell: 3 + Location: 85,40 + Facing: 689 + Actor966: n1 + Owner: GDI + SubCell: 3 + Location: 89,40 + Facing: 71 + Actor967: n1 + Owner: GDI + SubCell: 3 + Location: 90,35 + Facing: 459 + Actor968: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 95,40 + Actor969: n1 + Owner: GDI + SubCell: 3 + Location: 96,39 + Facing: 563 + Actor970: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 94,33 + Actor971: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 86,36 + Actor973: n2 + Owner: GDI + Location: 87,36 + SubCell: 1 + Facing: 634 + Actor972: n2 + Owner: GDI + Facing: 384 + SubCell: 1 + Location: 96,39 + Actor974: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 95,35 + Actor975: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 100,38 + Actor976: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 83,44 + Actor977: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 79,41 + Actor978: n2 + Owner: GDI + SubCell: 3 + Location: 102,31 + Facing: 507 + Actor979: n2 + Owner: GDI + SubCell: 3 + Location: 101,55 + Facing: 0 + Actor980: n2 + Owner: GDI + SubCell: 3 + Location: 69,31 + Facing: 214 + Actor981: n2 + Owner: GDI + SubCell: 3 + Location: 55,29 + Facing: 729 + Actor982: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 77,19 + Actor983: n2 + Owner: GDI + SubCell: 3 + Location: 94,19 + Facing: 674 + Actor984: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 100,21 + Actor985: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 91,12 + Actor986: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 95,46 + Actor987: n3 + Owner: GDI + Location: 95,55 + SubCell: 3 + Facing: 0 + Actor989: n1 + Owner: GDI + Facing: 384 + Location: 96,61 + SubCell: 1 + Actor990: n1 + Owner: GDI + SubCell: 3 + Location: 97,60 + Facing: 721 + Actor991: n1 + Owner: GDI + Location: 94,61 + SubCell: 3 + Facing: 118 + Actor992: n1 + Owner: GDI + SubCell: 3 + Location: 97,61 + Facing: 578 + Actor993: n1 + Owner: GDI + Facing: 384 + Location: 97,61 + SubCell: 1 + Actor996: n3 + Owner: GDI + Location: 97,61 + SubCell: 2 + Facing: 705 + Actor997: n3 + Owner: GDI + SubCell: 3 + Location: 109,66 + Facing: 182 + Actor998: n3 + Owner: GDI + SubCell: 3 + Location: 68,30 + Facing: 467 + Actor999: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 82,17 + Actor1000: n3 + Owner: GDI + SubCell: 3 + Location: 53,23 + Facing: 384 + Actor1001: n3 + Owner: GDI + SubCell: 3 + Location: 57,6 + Facing: 602 + Actor1002: n1 + Owner: GDI + SubCell: 3 + Location: 60,5 + Facing: 483 + Actor918: medi + Owner: GDI + SubCell: 3 + Facing: 384 + Location: 63,6 + Actor1004: medi + Owner: GDI + SubCell: 3 + Location: 95,62 + Facing: 309 + Orca3: orca + Owner: GDI + Location: 108,51 + Facing: 384 + Orca4: orca + Owner: GDI + Location: 110,51 + Facing: 384 + NPowered7: atwr + Owner: GDI + Location: 69,38 + NPowered8: atwr + Owner: GDI + Location: 75,38 + NPowered9: atwr + Owner: GDI + Location: 93,28 + Actor1017: n1 + Owner: GDI + SubCell: 3 + Facing: 384 + Location: 56,41 + Actor1018: n1 + Owner: GDI + SubCell: 3 + Location: 59,47 + Facing: 71 + Actor1019: n1 + Owner: GDI + SubCell: 3 + Location: 42,40 + Facing: 0 + Actor1020: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 55,40 + Actor1021: n3 + Owner: GDI + SubCell: 3 + Location: 67,43 + Facing: 261 + Actor1022: n3 + Owner: GDI + SubCell: 3 + Location: 58,49 + Facing: 158 + Actor1023: n3 + Owner: GDI + SubCell: 3 + Location: 39,41 + Facing: 761 + Actor1024: n2 + Owner: GDI + SubCell: 3 + Location: 43,42 + Facing: 0 + Actor1025: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 59,40 + Actor1026: n2 + Owner: GDI + SubCell: 3 + Location: 81,32 + Facing: 158 + Actor1027: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 88,23 + Actor1028: e1 + Owner: Greece + SubCell: 3 + Location: 30,44 + Facing: 0 + Actor1032: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 97,59 + Actor995: e1 + Owner: Greece + SubCell: 3 + Facing: 737 + Location: 78,71 + Actor1029: e1 + Owner: Greece + Facing: 384 + SubCell: 1 + Location: 78,71 + Actor1031: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 73,64 + Actor1003: medi + Owner: GDI + Facing: 384 + Location: 91,11 + SubCell: 3 + Actor1033: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 37,55 + Actor529: pbox + Owner: Greece + Location: 20,66 + Actor528: pbox + Owner: Greece + Location: 20,62 + Actor1034: e1 + Owner: Greece + SubCell: 3 + Location: 6,51 + Facing: 864 + SPower5: powr + Owner: Greece + Location: 64,74 + Actor1037: atek + Owner: Greece + Location: 79,71 + Actor1038: tc04 + Owner: Neutral + Location: 49,33 + Actor1039: tc01 + Owner: Neutral + Location: 48,41 + Actor1040: tc02 + Owner: Neutral + Location: 37,35 + Actor1041: t15 + Owner: Neutral + Location: 33,42 + Actor1042: t16 + Owner: Neutral + Location: 27,41 + Actor1043: t13 + Owner: Neutral + Location: 28,40 + Actor1044: tc02 + Owner: Neutral + Location: 19,46 + Actor1045: t16 + Owner: Neutral + Location: 20,45 + Actor1046: t07 + Owner: Neutral + Location: 21,44 + Actor1047: t03 + Owner: Neutral + Location: 29,46 + Actor1048: t14 + Owner: Neutral + Location: 45,29 + Actor1049: t13 + Owner: Neutral + Location: 46,25 + Actor1050: t16 + Owner: Neutral + Location: 45,23 + Actor1051: t03 + Owner: Neutral + Location: 42,31 + Actor1052: t02 + Owner: Neutral + Location: 55,47 + Actor1053: tc02 + Owner: Neutral + Location: 62,38 + Actor1054: t16 + Owner: Neutral + Location: 62,41 + Actor1055: t15 + Owner: Neutral + Location: 75,42 + Actor1056: t07 + Owner: Neutral + Location: 74,31 + Actor1057: t13 + Owner: Neutral + Location: 77,36 + Actor1058: t02 + Owner: Neutral + Location: 59,36 + Actor1059: t01 + Owner: Neutral + Location: 60,21 + Actor1060: t08 + Owner: Neutral + Location: 64,22 + Actor1061: t01 + Owner: Neutral + Location: 75,17 + Actor1062: t05 + Owner: Neutral + Location: 79,27 + Actor1063: t16 + Owner: Neutral + Location: 86,20 + Actor1064: t13 + Owner: Neutral + Location: 105,30 + Actor1065: tc05 + Owner: Neutral + Location: 107,24 + Actor1066: t16 + Owner: Neutral + Location: 110,21 + Actor1067: t07 + Owner: Neutral + Location: 109,33 + Actor1068: t03 + Owner: Neutral + Location: 109,30 + Actor1069: t05 + Owner: Neutral + Location: 102,23 + Actor1070: t05 + Owner: Neutral + Location: 106,46 + Actor1071: tc04 + Owner: Neutral + Location: 107,45 + Actor1072: t13 + Owner: Neutral + Location: 106,44 + Actor1073: t11 + Owner: Neutral + Location: 98,48 + Actor1074: t12 + Owner: Neutral + Location: 100,46 + Actor1075: t05 + Owner: Neutral + Location: 74,56 + Actor1076: t07 + Owner: Neutral + Location: 78,52 + Actor1077: t06 + Owner: Neutral + Location: 89,53 + Actor1078: t05 + Owner: Neutral + Location: 93,47 + Actor1079: t05 + Owner: Neutral + Location: 66,48 + Actor1080: windmill + Owner: Neutral + Location: 44,50 + Actor1081: brl3 + Owner: Creeps + Location: 103,3 + Actor1082: barl + Owner: Creeps + Location: 102,3 + Actor959: chain + Owner: Greece + Location: 67,69 + Actor960: chain + Owner: Greece + Location: 68,69 + Actor994: chain + Owner: Greece + Location: 69,69 + Actor1005: chain + Owner: Greece + Location: 70,69 + Actor1006: chain + Owner: Greece + Location: 71,69 + Actor1007: chain + Owner: Greece + Location: 72,69 + Actor1008: chain + Owner: Greece + Location: 73,69 + Actor1009: chain + Owner: Greece + Location: 74,69 + Actor1030: chain + Owner: Greece + Location: 75,69 + Actor1035: chain + Owner: Greece + Location: 76,69 + Actor1083: chain + Owner: Greece + Location: 77,69 + Actor1084: chain + Owner: Greece + Location: 67,70 + LongbowPad3: hpad + Owner: Greece + Location: 68,70 + LongbowPad4: hpad + Owner: Greece + Location: 70,70 + HarrierPad1: hpad + Owner: Greece + Location: 73,70 + HarrierPad2: hpad + Owner: Greece + Location: 75,70 + Actor1089: chain + Owner: Greece + Location: 77,70 + Actor1090: chain + Owner: Greece + Location: 67,71 + Actor1091: chain + Owner: Greece + Location: 77,71 + Actor1092: chain + Owner: Greece + Location: 67,72 + Actor1093: chain + Owner: Greece + Location: 77,72 + Longbow3: heli + Owner: Greece + Location: 69,73 + Facing: 384 + Longbow4: heli + Owner: Greece + Location: 71,73 + Facing: 384 + Actor1098: e1 + Owner: Greece + Location: 72,70 + SubCell: 3 + Facing: 515 + Actor1099: e1 + Owner: Greece + Facing: 384 + Location: 66,70 + SubCell: 3 + Actor1100: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 67,65 + Actor1101: e1 + Owner: Greece + Facing: 384 + Location: 67,67 + SubCell: 3 + Actor1102: e1 + Owner: Greece + Facing: 384 + Location: 68,66 + SubCell: 3 + Actor1103: e1 + Owner: Greece + Facing: 384 + Location: 64,67 + SubCell: 3 + Actor1104: e1 + Owner: Greece + SubCell: 1 + Location: 72,70 + Facing: 384 + Actor1105: e1 + Owner: Greece + Location: 72,70 + SubCell: 2 + Facing: 666 + Actor1106: e3 + Owner: Greece + Facing: 384 + Location: 72,68 + SubCell: 3 + Actor988: n3 + Owner: GDI + SubCell: 3 + Location: 100,58 + Facing: 0 + Actor914: vulc + Owner: GDI + Location: 98,58 + Facing: 0 + Actor1107: n1 + Owner: GDI + SubCell: 3 + Location: 107,49 + Facing: 95 + Actor1108: n1 + Owner: GDI + SubCell: 3 + Location: 109,48 + Facing: 39 + Actor1109: n1 + Owner: GDI + SubCell: 3 + Location: 111,49 + Facing: 87 + Actor1110: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 111,52 + Actor1111: n1 + Owner: GDI + SubCell: 3 + Location: 111,45 + Facing: 277 + TitanPatrol1: waypoint + Owner: Neutral + Location: 57,19 + TitanPatrol2: waypoint + Owner: Neutral + Location: 57,29 + TitanPatrol3: waypoint + Owner: Neutral + Location: 62,34 + TitanPatrol4: waypoint + Owner: Neutral + Location: 76,34 + TitanPatrol5: waypoint + Owner: Neutral + Location: 81,30 + TitanPatrol6: waypoint + Owner: Neutral + Location: 82,21 + MiniDronePatrol1: waypoint + Owner: Neutral + Location: 31,38 + MiniDronePatrol2: waypoint + Owner: Neutral + Location: 46,38 + MiniDronePatrol3: waypoint + Owner: Neutral + Location: 53,44 + MiniDronePatrol4: waypoint + Owner: Neutral + Location: 60,44 + MiniDronePatrol5: waypoint + Owner: Neutral + Location: 64,46 + MiniDronePatrol6: waypoint + Owner: Neutral + Location: 78,46 + PlayerStart: waypoint + Owner: Neutral + Location: 7,31 + Aurora1: auro + Owner: GDI + Location: 108,62 + Facing: 384 + Aurora2: auro + Owner: GDI + Location: 108,65 + Facing: 384 + Harrier1: harr + Owner: Greece + Location: 74,74 + Facing: 384 + Harrier2: harr + Owner: Greece + Location: 76,74 + Facing: 384 + Actor1010: split2 + Owner: Neutral + Location: 15,24 + Actor1011: split2 + Owner: Neutral + Location: 15,17 + Actor1012: proc.td + Owner: GDI + Location: 25,20 + Actor1013: n1 + Owner: GDI + SubCell: 3 + Facing: 103 + Location: 27,19 + Actor1014: rep + Owner: GDI + Location: 30,21 + EasyOnlyIntruder1: s4 + Owner: Scrin + SubCell: 3 + Location: 5,30 + Facing: 768 + Actor1016: s4 + Owner: Scrin + Location: 6,30 + SubCell: 3 + Facing: 768 + EasyNormalOnlyIntruder: s4 + Owner: Scrin + SubCell: 3 + Location: 5,31 + TurretFacing: 0 + Facing: 768 + EasyOnlyIntruder2: s4 + Owner: Scrin + Location: 5,32 + SubCell: 3 + Facing: 768 + Actor1086: s4 + Owner: Scrin + Location: 6,31 + SubCell: 3 + Facing: 768 + Actor1087: s4 + Owner: Scrin + Location: 6,32 + SubCell: 3 + Facing: 768 + LeecherSpawn: waypoint + Owner: Neutral + Location: 5,19 + Actor1015: n1 + Owner: GDI + SubCell: 3 + Location: 96,10 + Facing: 563 + Actor1036: n1 + Owner: GDI + SubCell: 3 + Location: 97,8 + Facing: 919 + Actor1085: n1 + Owner: GDI + SubCell: 3 + Location: 94,8 + Facing: 285 + Actor1088: n1 + Owner: GDI + Location: 97,8 + SubCell: 1 + Facing: 0 + Actor1094: htnk + Owner: GDI + Facing: 638 + Location: 34,33 + Actor1095: mtnk + Owner: GDI + Location: 41,28 + Facing: 642 + Actor1096: n1 + Owner: GDI + Facing: 384 + Location: 69,31 + SubCell: 1 + Actor1097: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 71,32 + Actor1112: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 66,31 + Actor1113: n1 + Owner: GDI + SubCell: 3 + Location: 61,27 + Facing: 118 + Actor1114: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 88,28 + Actor1115: n3 + Owner: GDI + SubCell: 3 + Location: 84,44 + Facing: 245 + Actor1116: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 90,39 + Actor1117: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 91,33 + Actor1118: n1 + Owner: GDI + Facing: 384 + Location: 87,35 + SubCell: 3 + Actor1119: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 110,43 + Actor1120: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 108,42 + Actor1121: n2 + Owner: GDI + Facing: 384 + Location: 111,49 + SubCell: 1 + Actor1122: hmmv + Owner: GDI + Facing: 384 + Location: 44,42 + Actor1123: jeep + Owner: Greece + Facing: 650 + Location: 77,62 + Actor1124: 2tnk + Owner: Greece + Facing: 0 + Location: 75,54 + Actor1125: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 78,70 + Actor1126: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 66,69 + Actor1127: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 30,74 + Actor1128: e1 + Owner: Greece + Facing: 384 + Location: 6,51 + SubCell: 1 + Actor1129: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 19,45 + Actor1130: e1 + Owner: Greece + Facing: 384 + Location: 13,46 + SubCell: 3 + Actor1131: e1 + Owner: Greece + Location: 28,49 + SubCell: 3 + Facing: 111 + Actor1132: e1 + Owner: Greece + SubCell: 3 + Location: 24,50 + Facing: 47 + Actor1133: n1 + Owner: Greece + SubCell: 3 + Location: 31,45 + Facing: 95 + Actor1134: n1 + Owner: Greece + SubCell: 3 + Location: 28,45 + Facing: 0 + Actor1135: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 49,50 + Actor1136: e1 + Owner: Greece + Facing: 384 + Location: 53,64 + SubCell: 3 + Actor1137: e1 + Owner: Greece + SubCell: 3 + Location: 55,72 + Facing: 166 + Actor1138: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 55,69 + Actor1139: e3 + Owner: Greece + Facing: 384 + Location: 55,72 + SubCell: 1 + Actor1140: n2 + Owner: GDI + SubCell: 3 + Location: 100,66 + Facing: 729 + Actor1141: n2 + Owner: GDI + SubCell: 3 + Location: 101,68 + Facing: 856 + Actor1142: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 98,74 + Actor1143: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 97,73 + Actor1144: hmmv + Owner: GDI + Facing: 626 + Location: 89,23 + Actor1145: vulc + Owner: GDI + Location: 53,37 + Facing: 650 + Actor1146: n1 + Owner: GDI + Facing: 384 + Location: 63,6 + SubCell: 1 + Actor1147: n1 + Owner: GDI + Facing: 384 + Location: 64,5 + SubCell: 3 + Actor1148: n2 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 63,3 + Actor1149: n2 + Owner: GDI + SubCell: 3 + Location: 61,19 + Facing: 1023 + EntranceReveal1: waypoint + Owner: Neutral + Location: 30,32 + EntranceReveal2: waypoint + Owner: Neutral + Location: 39,26 + EntranceReveal3: waypoint + Owner: Neutral + Location: 62,15 + EntranceReveal4: waypoint + Owner: Neutral + Location: 97,17 + EntranceReveal5: waypoint + Owner: Neutral + Location: 98,54 + EntranceReveal6: waypoint + Owner: Neutral + Location: 72,63 + EntranceReveal7: waypoint + Owner: Neutral + Location: 29,56 + Actor1150: gtwr + Owner: GDI + Location: 81,7 + Actor1151: gtwr + Owner: GDI + Location: 81,6 + EntranceReveal8: waypoint + Owner: Neutral + Location: 22,21 + TitanTrigger1: waypoint + Owner: Neutral + Location: 60,14 + TitanTrigger2: waypoint + Owner: Neutral + Location: 61,14 + TitanTrigger3: waypoint + Owner: Neutral + Location: 62,14 + TitanTrigger4: waypoint + Owner: Neutral + Location: 63,14 + TitanTrigger5: waypoint + Owner: Neutral + Location: 64,14 + IntruderSpawn: waypoint + Owner: Neutral + Location: 6,16 + AlliedSouthBarracks: tent + Owner: Greece + Location: 65,65 + GDINorthBarracks: pyle + Owner: GDI + Location: 89,11 + EntranceReveal6Alt: waypoint + Owner: Neutral + Location: 84,67 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-allegiances.yaml, incapacitation-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml, incapacitation-weapons.yaml diff --git a/mods/ca/missions/main-campaign/ca22-decimation/decimation-rules.yaml b/mods/ca/missions/main-campaign/ca22-decimation/decimation-rules.yaml new file mode 100644 index 0000000000..e2dec14541 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca22-decimation/decimation-rules.yaml @@ -0,0 +1,129 @@ +^Palettes: + TintPostProcessEffect: + +World: + LuaScript: + Scripts: campaign.lua, decimation.lua + MissionData: + Briefing: Another of the human factions, the Soviets, have recently turned the tide in their favour.\n\nTheir numbers include one named Yuri who possesses substantial psionic power, which has enabled the Soviets to assert control over a large portion of Kane's cybernetically enhanced troops.\n\nThe Soviets are now in the process of rebuilding their armies which had suffered significant losses, and if left unchecked they could threaten us.\n\nUltimately we seek to usurp Yuri's domination of the cyborgs, but it is critical that the already sizeable Soviet armies are not bolstered further.\n\nYour mission is to launch a full scale attack against the Soviet industrial heartland. Numerous factories are located here which are rapidly producing new equipment. Many of their vehicles are without crews, pending final maintenance and preparations.\n\nThey must be destroyed along with the factories that produced them. + MapOptions: + ShortGameCheckboxEnabled: False + MusicPlaylist: + StartingMusic: valves1b + +Player: + PlayerResources: + DefaultCash: 6000 + +INTL.Loaded: + Inherits: INTL + RenderSprites: + Image: intl + Cargo: + InitialUnits: S1,S1,S1,S3,S3 + -Buildable: + +fleetaccess: + AlwaysVisible: + Interactable: + ScriptTriggers: + ProvidesPrerequisite: + +reaperaccess: + AlwaysVisible: + Interactable: + ScriptTriggers: + ProvidesPrerequisite: + +NERV: + Inherits@IONSURGEPOWER: ^IonSurgePower + DetonateWeaponPower@STORMSPIKE: + -Prerequisites: + DetonateWeaponPower@IONSURGE: + -Prerequisites: + +# Enable subfaction specific tech + +STCR: + Buildable: + Prerequisites: anyradar, ~vehicles.scrin + +LCHR: + Buildable: + Prerequisites: anyradar, ~vehicles.scrin + +RUIN: + Buildable: + Prerequisites: scrt, ~vehicles.scrin + +ATMZ: + Buildable: + Prerequisites: scrt, ~vehicles.scrin + +stellar.upgrade: + Buildable: + Prerequisites: scrt + +coalescence.upgrade: + Buildable: + Prerequisites: scrt + +# Triggered access to Reaper Tripods, Enervators, Devastators, Carriers + +RTPD: + Buildable: + Prerequisites: scrt, ~vehicles.scrin, ~reaperaccess + +ENRV: + Buildable: + Prerequisites: scrt, ~aircraft.scrin, ~fleetaccess + +DEVA: + Buildable: + Prerequisites: scrt, ~aircraft.scrin, ~fleetaccess + +PAC: + Buildable: + Prerequisites: sign, scrt, ~aircraft.scrin, ~fleetaccess + +SIGN: + Buildable: + Prerequisites: ~structures.scrin, scrt, ~fleetaccess + +shields.upgrade: + Buildable: + Prerequisites: ~player.scrin, sign, ~fleetaccess + +# Disable tech + +MAST: + Inherits@CAMPAIGNDISABLED: ^Disabled + +THF: + Inherits@CAMPAIGNDISABLED: ^Disabled + +BORI: + Inherits@CAMPAIGNDISABLED: ^Disabled + +MSHP: + Inherits@CAMPAIGNDISABLED: ^Disabled + +DOME: + ParatroopersPowerCA@paratroopers: + RequiresCondition: paratroopers-enabled + ExternalCondition@paratroopers: + Condition: paratroopers-enabled + +AFLD: + AirstrikePowerCA@Russianparabombs: + RequiresCondition: parabombs-enabled + ExternalCondition@parabombs: + Condition: parabombs-enabled + +V3RL: + AutoTargetPriority@DEFAULT: + ValidTargets: Structure, Defense + +MSLO: + Power: + Amount: 0 diff --git a/mods/ca/missions/main-campaign/ca22-decimation/decimation.lua b/mods/ca/missions/main-campaign/ca22-decimation/decimation.lua new file mode 100644 index 0000000000..f97c6a7f98 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca22-decimation/decimation.lua @@ -0,0 +1,387 @@ +MissionDir = "ca|missions/main-campaign/ca22-decimation" + +PowerGrids = { + { + Providers = { AtomicPower1, AtomicPower2, AtomicPower3, TeslaPower1, TeslaPower2, TeslaPower3, TeslaPower4, TeslaPower5, TeslaPower6 }, + Consumers = { TeslaCoil1, TeslaCoil2, TeslaCoil3, TeslaCoil4, TeslaCoil5, TeslaCoil6, TeslaCoil7, TeslaCoil8, TeslaCoil9, TeslaCoil10, TeslaCoil11, TeslaCoil12, TeslaCoil13, TeslaCoil14, TeslaCoil15, TeslaCoil16, TeslaCoil17, TeslaCoil18, TeslaCoil19, TeslaCoil20, TeslaCoil21, TeslaCoil22, TeslaCoil23, TeslaCoil24, TeslaCoil25 }, + }, +} + +ForwardSAMs = { ForwardSAM1, ForwardSAM2, ForwardSAM3, ForwardSAM4, ForwardSAM5, ForwardSAM6, ForwardSAM7, ForwardSAM8 } + +IslandAirfields = { IslandAirfield1, IslandAirfield2, IslandAirfield3, IslandAirfield4, IslandAirfield5 } + +IslandSAMs = { IslandSAM1, IslandSAM2, IslandSAM3 } + +EastAttackPaths = { + { EastAttack1.Location, EastAttack2.Location, EastAttack3.Location, EastAttack4.Location }, + { EastAttack1.Location, EastAttack2.Location, EastAttack4.Location } +} + +WestAttackPaths = { + { WestAttack1.Location, WestAttack2.Location, WestAttack3.Location, WestAttack4.Location } +} + +AirFleetKillersThreshold = { + normal = 6, + hard = 4, + vhard = 3, + brutal = 2 +} + +MaxFleetKillers = { + normal = 3, + hard = 5, + vhard = 8, + brutal = 12 +} + +TripodKillersThreshold = { + normal = 11, + hard = 9, + vhard = 7, + brutal = 5 +} + +MaxTripodKillers = { + normal = 3, + hard = 5, + vhard = 8, + brutal = 12 +} + +ParabombsEnabledDelay = { + easy = DateTime.Minutes(6), + normal = DateTime.Minutes(5), + hard = DateTime.Minutes(4), + vhard = DateTime.Minutes(3), + brutal = DateTime.Minutes(2) +} + +ParatroopersEnabledDelay = { + easy = DateTime.Minutes(5) + DateTime.Seconds(30), + normal = DateTime.Minutes(4) + DateTime.Seconds(30), + hard = DateTime.Minutes(3) + DateTime.Seconds(30), + vhard = DateTime.Minutes(2) + DateTime.Seconds(30), + brutal = DateTime.Minutes(1) + DateTime.Seconds(30) +} + +IronCurtainEnabledDelay = { + easy = DateTime.Minutes(25), + normal = DateTime.Minutes(15), + hard = DateTime.Minutes(8), + vhard = DateTime.Minutes(5), + brutal = DateTime.Minutes(5) +} + +if IsVeryHardOrAbove() then + UnitCompositions.Soviet = Utils.Concat(UnitCompositions.Soviet, { + { + Infantry = { "deso", "deso", "deso", "deso", "deso", "deso", "deso", "deso", "deso" }, + Vehicles = { "apoc.erad", "apoc.erad", "apoc.erad", "apoc.erad", "4tnk.erad", "4tnk.erad", "4tnk.erad", "4tnk.erad" }, + MinTime = DateTime.Minutes(18), + IsSpecial = true + }, + { + Infantry = { "rmbc", "rmbc", "rmbc", "enli", "enli", "n1c", "n1c", "rmbc", "n1c", "n1c", "n1c", "n1c", "n1c", "n1c"}, + Vehicles = { "apoc", "3tnk", "3tnk", "katy" }, + MinTime = DateTime.Minutes(18), + IsSpecial = true + } + }) +end + +AdjustedSovietCompositions = AdjustCompositionsForDifficulty(UnitCompositions.Soviet) + +Squads = { + East = { + Delay = AdjustDelayForDifficulty(DateTime.Minutes(6)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 20, Max = 40 }), + FollowLeader = true, + ProducerActors = { Infantry = { MainBarracks }, Vehicles = { MainFactory } }, + Compositions = AdjustedSovietCompositions, + AttackPaths = EastAttackPaths, + }, + West = { + Delay = AdjustDelayForDifficulty(DateTime.Minutes(4)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 20, Max = 40 }), + FollowLeader = true, + ProducerActors = { Infantry = { Barracks1, Barracks2 }, Vehicles = { Factory1, Factory2, Factory3, Factory4, Factory5 } }, + Compositions = AdjustedSovietCompositions, + AttackPaths = WestAttackPaths, + }, + AirMain = { + Delay = AdjustAirDelayForDifficulty(DateTime.Minutes(13)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 12, Max = 12 }), + ActiveCondition = function() + return not IslandAirfieldsEliminated + end, + Compositions = AirCompositions.Soviet, + }, + AirFleetKillers = { + ActiveCondition = function(squad) + local scrinFleet = GetMissionPlayersActorsByTypes({ "pac", "deva" }) + return #scrinFleet > AirFleetKillersThreshold[Difficulty] and not IslandAirfieldsEliminated + end, + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 50, Max = 50 }), + Compositions = function(squad) + local migs = { "mig" } + local numFleetShips = #GetMissionPlayersActorsByTypes({ "pac", "deva" }) + for i = 1, math.min(numFleetShips, MaxFleetKillers[Difficulty]) do + table.insert(migs, "mig") + end + return { { Aircraft = migs } } + end + }, + TripodKillers = { + ActiveCondition = function(squad) + local tripods = GetMissionPlayersActorsByTypes({ "tpod", "rtpd" }) + return #tripods > TripodKillersThreshold[Difficulty] and not IslandAirfieldsEliminated + end, + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 30, Max = 30 }), + Compositions = function(squad) + local sukhois = { "suk" } + local numTripods = #GetMissionPlayersActorsByTypes({ "tpod", "rtpd" }) + for i = 1, math.min(numTripods, MaxTripodKillers[Difficulty]) do + table.insert(sukhois, "suk") + end + return { { Aircraft = sukhois } } + end + } +} + +SetupPlayers = function() + Scrin = Player.GetPlayer("Scrin") + USSR = Player.GetPlayer("USSR") + USSRUnmanned = Player.GetPlayer("USSRUnmanned") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = { Scrin } + MissionEnemies = { USSR } +end + +WorldLoaded = function() + SetupPlayers() + + IslandAirfieldsEliminated = false + IslandSAMsDestroyed = false + DefensesOffline = false + Camera.Position = PlayerStart.CenterPosition + + InitObjectives(Scrin) + AdjustPlayerStartingCashForDifficulty() + InitUSSR() + + if Difficulty == "brutal" then + Trigger.AfterDelay(DateTime.Minutes(10), function() + Actor.Create("ai.superweapons.enabled", true, { Owner = USSR }) + end) + end + + ObjectiveDestroyBases = Scrin.AddObjective("Eliminate Soviet bases.") + ObjectiveDestroyUncrewed = Scrin.AddObjective("Destroy all uncrewed Soviet vehicles.") + ObjectiveDestroySAMs = Scrin.AddSecondaryObjective("Destroy front line of Soviet SAM Sites.") + + Trigger.AfterDelay(DateTime.Seconds(5), function() + PlaySpeechNotificationToMissionPlayers("ReinforcementsArrived") + Notification("Reinforcements have arrived.") + Reinforcements.Reinforce(Scrin, { "devo" }, { ScrinReinforce1Spawn.Location, ScrinReinforce1Dest.Location }, 75) + Reinforcements.Reinforce(Scrin, { "devo" }, { ScrinReinforce2Spawn.Location, ScrinReinforce2Dest.Location }, 75) + end) + + Trigger.AfterDelay(DateTime.Minutes(20), function() + Utils.Do(MissionPlayers, function(p) + Actor.Create("reaperaccess", true, { Owner = p }) + end) + Notification("You have been granted access to Reaper Tripods.") + MediaCA.PlaySound(MissionDir .. "/s_reaperaccess.aud", 2) + end) + + Utils.Do(PowerGrids, function(grid) + Trigger.OnAllKilledOrCaptured(grid.Providers, function() + Utils.Do(grid.Consumers, function(consumer) + if not consumer.IsDead then + consumer.GrantCondition("disabled") + end + end) + DefensesOffline = true + Notification("Soviet power supply neutralized; defenses are now offline.") + MediaCA.PlaySound(MissionDir .. "/s_sovietpoweroffline.aud", 2) + end) + end) + + local unmannedVehicles = USSRUnmanned.GetActorsByTypes({ "btr", "3tnk", "4tnk", "apoc", "ttra", "ttnk" }) + + Trigger.OnAllKilledOrCaptured(unmannedVehicles, function() + Scrin.MarkCompletedObjective(ObjectiveDestroyUncrewed) + end) + + Trigger.OnAllKilledOrCaptured(IslandSAMs, function() + IslandSAMsDestroyed = true + + if IslandAirfieldsEliminated then + DevastatorReinforcements() + end + end) + + Trigger.OnAllKilledOrCaptured(ForwardSAMs, function() + Utils.Do(MissionPlayers, function(p) + Actor.Create("fleetaccess", true, { Owner = p }) + end) + Scrin.MarkCompletedObjective(ObjectiveDestroySAMs) + Notification("Scrin fleet vessels now available.") + MediaCA.PlaySound(MissionDir .. "/s_scrinfleet.aud", 2) + + Trigger.AfterDelay(DateTime.Seconds(5), function() + Notification("Reinforcements have arrived.") + PlaySpeechNotificationToMissionPlayers("ReinforcementsArrived") + Reinforcements.Reinforce(Scrin, { "pac" }, { ScrinReinforce1Spawn.Location, ScrinReinforce1Dest.Location }, 75) + Reinforcements.Reinforce(Scrin, { "pac" }, { ScrinReinforce2Spawn.Location, ScrinReinforce2Dest.Location }, 75) + end) + end) + + Trigger.OnAllKilledOrCaptured(IslandAirfields, function() + IslandAirfieldsEliminated = true + + if IslandSAMsDestroyed then + DevastatorReinforcements() + end + end) + + Trigger.OnEnteredProximityTrigger(TankYardReveal.CenterPosition, WDist.New(11 * 1024), function(a, id) + if IsMissionPlayer(a.Owner) and a.Type ~= "camera" then + Trigger.RemoveProximityTrigger(id) + + Notification("The entrance to the Soviet equipment holding area has been located.") + MediaCA.PlaySound(MissionDir .. "/s_sovietholdingarea.aud", 2) + + if not DefensesOffline then + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(5)), function() + Notification("Substantial defenses detected. Recommened neutralizing power before beginning assault.") + MediaCA.PlaySound(MissionDir .. "/s_neutralizepower.aud", 2) + end) + end + + Beacon.New(Scrin, TankYardReveal.CenterPosition) + local camera = Actor.Create("camera", true, { Owner = Scrin, Location = TankYardReveal.Location }) + Trigger.AfterDelay(DateTime.Seconds(4), function() + camera.Destroy() + end) + end + end) + + AfterWorldLoaded() +end + +Tick = function() + OncePerSecondChecks() + OncePerFiveSecondChecks() + OncePerThirtySecondChecks() + AfterTick() +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + USSR.Resources = USSR.ResourceCapacity - 500 + + if not PlayerHasBuildings(USSR) then + if not Scrin.IsObjectiveCompleted(ObjectiveDestroyBases) then + Scrin.MarkCompletedObjective(ObjectiveDestroyBases) + end + end + + if MissionPlayersHaveNoRequiredUnits() then + if ObjectiveDestroyBases ~= nil and not Scrin.IsObjectiveCompleted(ObjectiveDestroyBases) then + Scrin.MarkFailedObjective(ObjectiveDestroyBases) + end + if ObjectiveDestroyUncrewed ~= nil and not Scrin.IsObjectiveCompleted(ObjectiveDestroyUncrewed) then + Scrin.MarkFailedObjective(ObjectiveDestroyUncrewed) + end + end + end +end + +OncePerFiveSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 125 == 0 then + UpdatePlayerBaseLocations() + end +end + +OncePerThirtySecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % DateTime.Seconds(30) == 0 then + CalculatePlayerCharacteristics() + end +end + +InitUSSR = function() + RebuildExcludes.USSR = { Types = { "npwr", "tpwr", "tsla" }, Actors = { IslandAirfield1, IslandAirfield2, IslandAirfield3, IslandAirfield4, IslandAirfield5 } } + + AutoRepairAndRebuildBuildings(USSR, 15) + SetupRefAndSilosCaptureCredits(USSR) + AutoReplaceHarvesters(USSR) + AutoRebuildConyards(USSR) + InitAiUpgrades(USSR) + InitAttackSquad(Squads.West, USSR) + InitAttackSquad(Squads.East, USSR) + InitAirAttackSquad(Squads.AirMain, USSR) + + if IsVeryHardOrAbove() then + SellOnCaptureAttempt({ SWBarracks, SEBarracks1, SEBarracks2 }) + + if Difficulty == "brutal" then + Trigger.AfterDelay(DateTime.Minutes(20), function() + CompositionValueMultipliers.brutal = 1.4 + end) + end + end + + if Difficulty ~= "easy" then + InitAirAttackSquad(Squads.AirFleetKillers, USSR, MissionPlayers, { "pac", "deva", "stmr", "enrv", "torm" }) + end + + if Difficulty ~= "easy" then + InitAirAttackSquad(Squads.TripodKillers, USSR, MissionPlayers, { "tpod", "rtpd" }) + end + + Actor.Create("ai.unlimited.power", true, { Owner = USSR }) + + local ussrGroundAttackers = USSR.GetGroundAttackers() + + Utils.Do(ussrGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsUSSRGroundHunterUnit) + end) + + Trigger.AfterDelay(DateTime.Seconds(5), function() + Utils.Do({ ShoreInf1, ShoreInf2, ShoreInf3, ShoreInf4, ShoreHeavyTank1, ShoreHeavyTank2 }, function(self) + if not self.IsDead then + self.AttackMove(Shore.Location) + self.Hunt() + end + end) + end) + + Trigger.AfterDelay(IronCurtainEnabledDelay[Difficulty], function() + Actor.Create("ai.minor.superweapons.enabled", true, { Owner = USSR }) + end) + + Trigger.AfterDelay(ParabombsEnabledDelay[Difficulty], function() + if not MainAirfield.IsDead then + MainAirfield.GrantCondition("parabombs-enabled") + end + end) + + Trigger.AfterDelay(ParatroopersEnabledDelay[Difficulty], function() + if not SovietRadar.IsDead then + SovietRadar.GrantCondition("paratroopers-enabled") + end + end) +end + +DevastatorReinforcements = function() + Trigger.AfterDelay(DateTime.Seconds(5), function() + Notification("Reinforcements have arrived.") + PlaySpeechNotificationToMissionPlayers("ReinforcementsArrived") + Reinforcements.Reinforce(Scrin, { "deva" }, { ScrinReinforce1Spawn.Location, ScrinReinforce1Dest.Location }, 75) + Reinforcements.Reinforce(Scrin, { "deva" }, { ScrinReinforce2Spawn.Location, ScrinReinforce2Dest.Location }, 75) + end) +end diff --git a/mods/ca/missions/main-campaign/ca22-decimation/fall.pal b/mods/ca/missions/main-campaign/ca22-decimation/fall.pal new file mode 100644 index 0000000000..525250ee0d Binary files /dev/null and b/mods/ca/missions/main-campaign/ca22-decimation/fall.pal differ diff --git a/mods/ca/missions/main-campaign/ca22-decimation/fall.yaml b/mods/ca/missions/main-campaign/ca22-decimation/fall.yaml new file mode 100644 index 0000000000..60e4f6529c --- /dev/null +++ b/mods/ca/missions/main-campaign/ca22-decimation/fall.yaml @@ -0,0 +1,179 @@ +^Palettes: + PaletteFromFile@terrain-temperat: + Filename: ca|missions/main-campaign/ca22-decimation/fall.pal + FixedColorPalette@Red4: + Base: terrain + Name: Red4 + RemapIndex: 153, 154, 155 + Color: b00000 + FixedColorPalette@Red3: + Base: Red4 + Name: Red3 + RemapIndex: 151 + Color: b00000 + FixedColorPalette@Red2: + Base: Red3 + Name: Red2 + RemapIndex: 150 + Color: a00000 + FixedColorPalette@Red1: + Base: Red2 + Name: Red1 + RemapIndex: 152 + Color: 900000 + FixedColorPalette@Red: + Base: Red1 + Name: Red + RemapIndex: 26, 30 + Color: 700000 + FixedColorPalette@Orange4: + Base: terrain + Name: Orange4 + RemapIndex: 153, 154, 155 + Color: c06000 + FixedColorPalette@Orange3: + Base: Orange4 + Name: Orange3 + RemapIndex: 151 + Color: c06000 + FixedColorPalette@Orange2: + Base: Orange3 + Name: Orange2 + RemapIndex: 150 + Color: b06000 + FixedColorPalette@Orange1: + Base: Orange2 + Name: Orange1 + RemapIndex: 152 + Color: a05000 + FixedColorPalette@Orange: + Base: Orange1 + Name: Orange + RemapIndex: 26, 30 + Color: 704000 + FixedColorPalette@Yellow4: + Base: terrain + Name: Yellow4 + RemapIndex: 153, 154, 155 + Color: c0c000 + FixedColorPalette@Yellow3: + Base: Yellow4 + Name: Yellow3 + RemapIndex: 151 + Color: c0c000 + FixedColorPalette@Yellow2: + Base: Yellow3 + Name: Yellow2 + RemapIndex: 150 + Color: b0b000 + FixedColorPalette@Yellow1: + Base: Yellow2 + Name: Yellow1 + RemapIndex: 152 + Color: a0a000 + FixedColorPalette@Yellow: + Base: Yellow1 + Name: Yellow + RemapIndex: 26, 30 + Color: 707000 + FixedColorPalette@LGreen4: + Base: terrain + Name: LGreen4 + RemapIndex: 153, 154, 155 + Color: 60c000 + FixedColorPalette@LGreen3: + Base: LGreen4 + Name: LGreen3 + RemapIndex: 151 + Color: 60c000 + FixedColorPalette@LGreen2: + Base: LGreen3 + Name: LGreen2 + RemapIndex: 150 + Color: 60b000 + FixedColorPalette@LGreen1: + Base: LGreen2 + Name: LGreen1 + RemapIndex: 152 + Color: 50a000 + FixedColorPalette@LGreen: + Base: LGreen1 + Name: LGreen + RemapIndex: 26, 30 + Color: 407000 + PaletteFromPaletteWithAlpha@Orange25: + Name: Orange25 + BasePalette: Orange + Alpha: 0.25 + PaletteFromPaletteWithAlpha@Orange50: + Name: Orange50 + BasePalette: Orange + Alpha: 0.50 + PaletteFromPaletteWithAlpha@Orange75: + Name: Orange75 + BasePalette: Orange + Alpha: 0.75 + PaletteFromPaletteWithAlpha@LGreen50: + Name: LGreen50 + BasePalette: LGreen + Alpha: 0.50 + +^ColoredTrees: + WithIdleOverlay@Red: + Sequence: idle + RequiresCondition: RedOrange25 || RedOrange50 || RedOrange75 + Palette: Red + WithIdleOverlay@Orange: + Sequence: idle + RequiresCondition: Orange + Palette: Orange + WithIdleOverlay@Yellow: + Sequence: idle + RequiresCondition: Orange25Yellow || Orange50Yellow || Orange75Yellow || Yellow + Palette: Yellow + WithIdleOverlay@Orange25: + Sequence: idle + RequiresCondition: RedOrange25 || Orange25Yellow + Palette: Orange25 + WithIdleOverlay@Orange50: + Sequence: idle + RequiresCondition: RedOrange50 || Orange50Yellow + Palette: Orange50 + WithIdleOverlay@Orange75: + Sequence: idle + RequiresCondition: RedOrange75 || Orange75Yellow + Palette: Orange75 + GrantRandomCondition@COLORS: + Conditions: RedOrange25, RedOrange50, RedOrange75, Orange, Orange75Yellow, Orange50Yellow, Orange25Yellow, Yellow + WithSpriteBody: + RequiresCondition: !RedOrange25 && !RedOrange50 && !RedOrange75 && !Orange && !Orange75Yellow && !Orange50Yellow && !Orange25Yellow && !Yellow + +T03: + Inherits@COLOR: ^ColoredTrees + +T10: + Inherits@COLOR: ^ColoredTrees + +T11: + Inherits@COLOR: ^ColoredTrees + +T12: + Inherits@COLOR: ^ColoredTrees + +T13: + Inherits@COLOR: ^ColoredTrees + +T14: + Inherits@COLOR: ^ColoredTrees + +T15: + Inherits@COLOR: ^ColoredTrees + +T17: + Inherits@COLOR: ^ColoredTrees + +TC02: + Inherits@COLOR: ^ColoredTrees + +TC05: + Inherits@COLOR: ^ColoredTrees diff --git a/mods/ca/missions/main-campaign/ca22-decimation/map.bin b/mods/ca/missions/main-campaign/ca22-decimation/map.bin new file mode 100644 index 0000000000..7b7716d8f1 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca22-decimation/map.bin differ diff --git a/mods/ca/missions/main-campaign/ca22-decimation/map.png b/mods/ca/missions/main-campaign/ca22-decimation/map.png new file mode 100644 index 0000000000..4dd88b4f0c Binary files /dev/null and b/mods/ca/missions/main-campaign/ca22-decimation/map.png differ diff --git a/mods/ca/missions/main-campaign/ca22-decimation/map.yaml b/mods/ca/missions/main-campaign/ca22-decimation/map.yaml new file mode 100644 index 0000000000..c0b9024168 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca22-decimation/map.yaml @@ -0,0 +1,4493 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 22: Decimation + +Author: Darkademic + +Tileset: TEMPERAT + +MapSize: 114,114 + +Bounds: 1,1,112,112 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: Scrin, USSR + PlayerReference@Scrin: + Name: Scrin + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: scrin + LockColor: True + Color: 7700FF + LockSpawn: True + LockTeam: True + Enemies: USSR, USSRUnmanned, Creeps + PlayerReference@USSR: + Name: USSR + Bot: campaign + Faction: soviet + Color: FE1100 + Enemies: Scrin, Creeps + PlayerReference@USSRUnmanned: + Name: USSRUnmanned + Bot: campaign + Faction: soviet + Color: D5A39F + +Actors: + Actor0: smcv + Owner: Scrin + Location: 8,106 + Facing: 912 + Actor2: intl.loaded + Owner: Scrin + Location: 8,103 + Facing: 912 + Actor3: intl.loaded + Owner: Scrin + Location: 12,105 + Facing: 912 + Actor9: tc05 + Owner: Neutral + Faction: reaper + Location: 15,58 + Actor10: tc04 + Owner: Neutral + Faction: reaper + Location: 22,60 + ForwardSAM6: sam + Owner: USSR + Location: 18,62 + ForwardSAM8: sam + Owner: USSR + Location: 4,59 + ForwardSAM7: sam + Owner: USSR + Location: 12,56 + Actor15: split2 + Owner: Neutral + Location: 26,102 + Actor16: split2 + Owner: Neutral + Location: 30,104 + ForwardSAM4: sam + Owner: USSR + Location: 41,79 + ForwardSAM3: sam + Owner: USSR + Location: 59,91 + ForwardSAM1: sam + Owner: USSR + Location: 63,109 + Actor20: fenc + Owner: USSR + Location: 64,108 + Actor21: fenc + Owner: USSR + Location: 63,108 + Actor22: fenc + Owner: USSR + Location: 62,108 + Actor23: fenc + Owner: USSR + Location: 62,109 + Actor24: fenc + Owner: USSR + Location: 62,110 + Actor25: fenc + Owner: USSR + Location: 63,110 + Actor26: fenc + Owner: USSR + Location: 64,110 + Actor27: fenc + Owner: USSR + Location: 65,110 + Actor28: fenc + Owner: USSR + Location: 65,109 + Actor29: fenc + Owner: USSR + Location: 65,108 + Actor30: fenc + Owner: USSR + Location: 58,90 + Actor31: fenc + Owner: USSR + Location: 58,91 + Actor32: fenc + Owner: USSR + Location: 58,92 + Actor33: fenc + Owner: USSR + Location: 59,92 + Actor34: fenc + Owner: USSR + Location: 60,92 + Actor35: fenc + Owner: USSR + Location: 61,92 + Actor36: fenc + Owner: USSR + Location: 61,91 + Actor37: fenc + Owner: USSR + Location: 61,90 + Actor38: fenc + Owner: USSR + Location: 59,90 + Actor39: fenc + Owner: USSR + Location: 60,90 + Actor40: fenc + Owner: USSR + Location: 41,80 + Actor41: fenc + Owner: USSR + Location: 40,80 + Actor42: fenc + Owner: USSR + Location: 40,79 + Actor43: fenc + Owner: USSR + Location: 40,78 + Actor44: fenc + Owner: USSR + Location: 41,78 + Actor45: fenc + Owner: USSR + Location: 41,78 + Actor46: fenc + Owner: USSR + Location: 42,78 + Actor47: fenc + Owner: USSR + Location: 43,78 + Actor48: fenc + Owner: USSR + Location: 43,79 + Actor49: fenc + Owner: USSR + Location: 43,80 + Actor50: fenc + Owner: USSR + Location: 42,80 + Actor51: fenc + Owner: USSR + Location: 18,61 + Actor52: fenc + Owner: USSR + Location: 19,61 + Actor53: fenc + Owner: USSR + Location: 20,61 + Actor54: fenc + Owner: USSR + Location: 20,62 + Actor55: fenc + Owner: USSR + Location: 12,57 + Actor56: fenc + Owner: USSR + Location: 13,57 + Actor57: fenc + Owner: USSR + Location: 14,57 + Actor58: fenc + Owner: USSR + Location: 11,57 + Actor59: fenc + Owner: USSR + Location: 11,56 + Actor60: fenc + Owner: USSR + Location: 11,55 + Actor61: fenc + Owner: USSR + Location: 12,55 + Actor62: fenc + Owner: USSR + Location: 13,55 + Actor63: fenc + Owner: USSR + Location: 14,55 + Actor64: fenc + Owner: USSR + Location: 14,56 + Actor65: fenc + Owner: USSR + Location: 3,59 + Actor66: fenc + Owner: USSR + Location: 3,58 + Actor67: fenc + Owner: USSR + Location: 5,58 + Actor68: fenc + Owner: USSR + Location: 4,58 + Actor69: fenc + Owner: USSR + Location: 6,58 + Actor70: fenc + Owner: USSR + Location: 6,59 + Actor71: ftur + Owner: USSR + Location: 48,88 + Actor72: ftur + Owner: USSR + Location: 45,85 + Actor73: ftur + Owner: USSR + Location: 58,98 + Actor74: ftur + Owner: USSR + Location: 60,103 + Actor75: ftur + Owner: USSR + Location: 35,78 + Actor76: ftur + Owner: USSR + Location: 28,76 + Actor77: fenc + Owner: USSR + Location: 27,76 + Actor78: fenc + Owner: USSR + Location: 27,77 + Actor79: fenc + Owner: USSR + Location: 27,75 + Actor80: fenc + Owner: USSR + Location: 28,75 + Actor81: fenc + Owner: USSR + Location: 28,77 + Actor82: fenc + Owner: USSR + Location: 29,77 + Actor83: fenc + Owner: USSR + Location: 34,78 + Actor84: fenc + Owner: USSR + Location: 34,79 + Actor85: fenc + Owner: USSR + Location: 35,79 + Actor86: fenc + Owner: USSR + Location: 45,86 + Actor87: fenc + Owner: USSR + Location: 44,86 + Actor88: fenc + Owner: USSR + Location: 44,85 + Actor89: fenc + Owner: USSR + Location: 47,88 + Actor90: fenc + Owner: USSR + Location: 47,87 + Actor91: fenc + Owner: USSR + Location: 48,87 + Actor92: fenc + Owner: USSR + Location: 57,98 + Actor93: fenc + Owner: USSR + Location: 57,99 + Actor94: fenc + Owner: USSR + Location: 58,99 + Actor95: fenc + Owner: USSR + Location: 60,102 + Actor96: fenc + Owner: USSR + Location: 59,102 + Actor97: fenc + Owner: USSR + Location: 59,103 + Actor111: fenc + Owner: USSR + Location: 68,97 + Actor112: fenc + Owner: USSR + Location: 69,97 + Actor114: fenc + Owner: USSR + Location: 70,97 + Actor115: fenc + Owner: USSR + Location: 71,97 + Actor118: fenc + Owner: USSR + Location: 68,98 + ForwardSAM2: sam + Owner: USSR + Location: 69,98 + Actor120: fenc + Owner: USSR + Location: 71,98 + Actor121: fenc + Owner: USSR + Location: 68,99 + Actor122: fenc + Owner: USSR + Location: 69,99 + Actor123: fenc + Owner: USSR + Location: 70,99 + Actor124: fenc + Owner: USSR + Location: 71,99 + Actor117: fenc + Owner: USSR + Location: 28,66 + Actor125: fenc + Owner: USSR + Location: 29,66 + Actor126: fenc + Owner: USSR + Location: 30,66 + Actor127: fenc + Owner: USSR + Location: 31,66 + Actor128: fenc + Owner: USSR + Location: 28,67 + ForwardSAM5: sam + Owner: USSR + Location: 29,67 + Actor130: fenc + Owner: USSR + Location: 31,67 + Actor131: fenc + Owner: USSR + Location: 28,68 + Actor132: fenc + Owner: USSR + Location: 29,68 + Actor133: fenc + Owner: USSR + Location: 30,68 + Actor134: fenc + Owner: USSR + Location: 31,68 + Actor163: brik + Owner: USSR + Location: 99,94 + Actor164: brik + Owner: USSR + Location: 100,94 + Actor165: brik + Owner: USSR + Location: 101,94 + Actor166: brik + Owner: USSR + Location: 101,95 + Actor167: brik + Owner: USSR + Location: 101,96 + Actor168: brik + Owner: USSR + Location: 101,97 + Actor169: brik + Owner: USSR + Location: 101,98 + Actor170: brik + Owner: USSR + Location: 100,98 + Actor171: brik + Owner: USSR + Location: 100,97 + Actor172: brik + Owner: USSR + Location: 100,104 + Actor173: brik + Owner: USSR + Location: 101,104 + Actor174: brik + Owner: USSR + Location: 100,105 + Actor175: brik + Owner: USSR + Location: 101,105 + Actor176: brik + Owner: USSR + Location: 101,106 + Actor177: brik + Owner: USSR + Location: 101,107 + Actor178: brik + Owner: USSR + Location: 100,108 + Actor179: brik + Owner: USSR + Location: 101,108 + Actor180: brik + Owner: USSR + Location: 99,108 + Actor151: brik + Owner: USSR + Location: 84,94 + Actor152: brik + Owner: USSR + Location: 85,94 + Actor153: brik + Owner: USSR + Location: 86,94 + Actor154: brik + Owner: USSR + Location: 87,94 + Actor155: brik + Owner: USSR + Location: 88,94 + Actor156: brik + Owner: USSR + Location: 89,94 + Actor157: brik + Owner: USSR + Location: 90,94 + Actor158: brik + Owner: USSR + Location: 91,94 + Actor159: brik + Owner: USSR + Location: 92,94 + Actor160: brik + Owner: USSR + Location: 93,94 + Actor161: brik + Owner: USSR + Location: 94,94 + Actor162: brik + Owner: USSR + Location: 95,94 + Actor181: brik + Owner: USSR + Location: 96,94 + Actor182: brik + Owner: USSR + Location: 97,94 + Actor183: brik + Owner: USSR + Location: 98,94 + Actor184: brik + Owner: USSR + Location: 84,95 + Actor185: brik + Owner: USSR + Location: 84,96 + Actor186: brik + Owner: USSR + Location: 84,97 + Actor187: brik + Owner: USSR + Location: 85,97 + Actor203: brik + Owner: USSR + Location: 84,98 + Actor204: brik + Owner: USSR + Location: 85,98 + Actor227: brik + Owner: USSR + Location: 84,104 + Actor228: brik + Owner: USSR + Location: 85,104 + Actor231: brik + Owner: USSR + Location: 84,105 + Actor232: brik + Owner: USSR + Location: 85,105 + Actor235: brik + Owner: USSR + Location: 84,106 + Actor248: brik + Owner: USSR + Location: 84,107 + Actor249: brik + Owner: USSR + Location: 84,108 + Actor250: brik + Owner: USSR + Location: 85,108 + Actor251: brik + Owner: USSR + Location: 86,108 + Actor252: brik + Owner: USSR + Location: 87,108 + Actor253: brik + Owner: USSR + Location: 88,108 + Actor254: brik + Owner: USSR + Location: 89,108 + Actor255: brik + Owner: USSR + Location: 90,108 + Actor256: brik + Owner: USSR + Location: 91,108 + Actor257: brik + Owner: USSR + Location: 92,108 + Actor258: brik + Owner: USSR + Location: 93,108 + Actor259: brik + Owner: USSR + Location: 94,108 + Actor260: brik + Owner: USSR + Location: 95,108 + Actor261: brik + Owner: USSR + Location: 96,108 + Actor262: brik + Owner: USSR + Location: 97,108 + Actor263: brik + Owner: USSR + Location: 98,108 + Actor189: chain + Owner: USSR + Location: 87,96 + Actor190: chain + Owner: USSR + Location: 88,96 + Actor191: chain + Owner: USSR + Location: 89,96 + Actor192: chain + Owner: USSR + Location: 90,96 + Actor193: chain + Owner: USSR + Location: 91,96 + Actor194: chain + Owner: USSR + Location: 92,96 + Actor195: chain + Owner: USSR + Location: 93,96 + Actor196: chain + Owner: USSR + Location: 94,96 + Actor197: chain + Owner: USSR + Location: 95,96 + Actor200: chain + Owner: USSR + Location: 96,96 + Actor201: chain + Owner: USSR + Location: 97,96 + Actor205: chain + Owner: USSR + Location: 98,96 + Actor206: chain + Owner: USSR + Location: 87,97 + Actor207: chain + Owner: USSR + Location: 98,97 + Actor208: chain + Owner: USSR + Location: 87,98 + AtomicPower1: npwr + Owner: USSR + Location: 88,98 + AtomicPower2: npwr + Owner: USSR + Location: 94,98 + Actor211: chain + Owner: USSR + Location: 98,98 + Actor212: chain + Owner: USSR + Location: 87,99 + Actor213: chain + Owner: USSR + Location: 98,99 + Actor214: chain + Owner: USSR + Location: 87,100 + Actor215: chain + Owner: USSR + Location: 98,100 + Actor216: chain + Owner: USSR + Location: 87,101 + Actor217: chain + Owner: USSR + Location: 88,101 + Actor218: chain + Owner: USSR + Location: 89,101 + Actor219: chain + Owner: USSR + Location: 90,101 + Actor220: chain + Owner: USSR + Location: 95,101 + Actor221: chain + Owner: USSR + Location: 96,101 + Actor222: chain + Owner: USSR + Location: 97,101 + Actor223: chain + Owner: USSR + Location: 98,101 + Actor224: chain + Owner: USSR + Location: 90,102 + AtomicPower3: npwr + Owner: USSR + Location: 91,102 + Actor229: chain + Owner: USSR + Location: 95,102 + Actor230: chain + Owner: USSR + Location: 90,103 + Actor233: chain + Owner: USSR + Location: 95,103 + Actor234: chain + Owner: USSR + Location: 90,104 + Actor236: chain + Owner: USSR + Location: 95,104 + Actor237: chain + Owner: USSR + Location: 90,105 + Actor238: chain + Owner: USSR + Location: 91,105 + Actor239: chain + Owner: USSR + Location: 92,105 + Actor240: chain + Owner: USSR + Location: 93,105 + Actor241: chain + Owner: USSR + Location: 94,105 + Actor242: chain + Owner: USSR + Location: 95,105 + TeslaCoil3: tsla + Owner: USSR + Location: 100,101 + IslandAirfield4: afld + Owner: USSR + Location: 70,58 + IslandAirfield1: afld + Owner: USSR + Location: 58,49 + IslandAirfield5: afld + Owner: USSR + Location: 70,61 + Actor355: fix + Owner: USSR + Location: 58,52 + IslandSAM1: sam + Owner: USSR + Location: 55,51 + IslandSAM2: sam + Owner: USSR + Location: 60,59 + IslandSAM3: sam + Owner: USSR + Location: 69,65 + Actor362: ftur + Owner: USSR + Location: 63,61 + TeslaCoil5: tsla + Owner: USSR + Location: 68,63 + TeslaCoil4: tsla + Owner: USSR + Location: 58,56 + Actor360: fenc + Owner: USSR + Location: 67,63 + Actor361: fenc + Owner: USSR + Location: 67,64 + Actor365: fenc + Owner: USSR + Location: 68,64 + Actor366: fenc + Owner: USSR + Location: 69,64 + Actor367: fenc + Owner: USSR + Location: 70,64 + Actor368: fenc + Owner: USSR + Location: 68,65 + Actor370: fenc + Owner: USSR + Location: 57,56 + Actor371: fenc + Owner: USSR + Location: 57,57 + Actor372: fenc + Owner: USSR + Location: 58,57 + Actor373: fenc + Owner: USSR + Location: 56,56 + Actor374: fenc + Owner: USSR + Location: 59,57 + Actor375: fenc + Owner: USSR + Location: 55,52 + Actor376: fenc + Owner: USSR + Location: 55,53 + Actor377: fenc + Owner: USSR + Location: 55,54 + Actor378: fenc + Owner: USSR + Location: 56,54 + Actor379: fenc + Owner: USSR + Location: 56,55 + Actor380: fenc + Owner: USSR + Location: 66,63 + Actor381: fenc + Owner: USSR + Location: 65,62 + Actor382: fenc + Owner: USSR + Location: 66,62 + Actor369: fix + Owner: USSR + Location: 65,58 + Actor356: hpad + Owner: USSR + Location: 61,55 + Actor383: brik + Owner: USSR + Location: 25,17 + Actor384: brik + Owner: USSR + Location: 25,16 + Actor385: brik + Owner: USSR + Location: 26,16 + Actor386: brik + Owner: USSR + Location: 26,17 + Actor387: brik + Owner: USSR + Location: 24,17 + Actor388: brik + Owner: USSR + Location: 23,17 + Actor389: brik + Owner: USSR + Location: 22,17 + Actor390: brik + Owner: USSR + Location: 22,16 + Actor391: brik + Owner: USSR + Location: 23,16 + Actor392: brik + Owner: USSR + Location: 30,16 + Actor393: brik + Owner: USSR + Location: 30,17 + Actor394: brik + Owner: USSR + Location: 31,16 + Actor395: brik + Owner: USSR + Location: 31,17 + Actor396: brik + Owner: USSR + Location: 32,17 + Actor397: brik + Owner: USSR + Location: 33,17 + Actor398: brik + Owner: USSR + Location: 33,16 + Actor399: brik + Owner: USSR + Location: 34,16 + Actor400: brik + Owner: USSR + Location: 34,17 + Actor401: apoc + Owner: USSRUnmanned + Location: 23,4 + Facing: 512 + Stance: HoldFire + Actor402: apoc + Owner: USSRUnmanned + Location: 25,4 + Facing: 512 + Stance: HoldFire + Actor403: apoc + Owner: USSRUnmanned + Location: 27,4 + Facing: 512 + Stance: HoldFire + Actor404: 4tnk + Owner: USSRUnmanned + Location: 29,5 + Facing: 512 + Stance: HoldFire + Actor405: 4tnk + Owner: USSRUnmanned + Location: 31,5 + Facing: 512 + Stance: HoldFire + Actor406: 4tnk + Owner: USSRUnmanned + Location: 33,5 + Facing: 512 + Stance: HoldFire + Actor407: 4tnk + Owner: USSRUnmanned + Location: 35,4 + Facing: 512 + Stance: HoldFire + Actor408: 4tnk + Owner: USSRUnmanned + Facing: 512 + Location: 37,4 + Stance: HoldFire + Actor409: 4tnk + Owner: USSRUnmanned + Location: 39,4 + Facing: 384 + Stance: HoldFire + Actor410: 4tnk + Owner: USSRUnmanned + Location: 41,4 + Facing: 384 + Stance: HoldFire + Actor411: 4tnk + Owner: USSRUnmanned + Location: 21,5 + Facing: 512 + Stance: HoldFire + Actor412: 4tnk + Owner: USSRUnmanned + Location: 19,5 + Facing: 512 + Stance: HoldFire + Actor413: 4tnk + Owner: USSRUnmanned + Location: 17,4 + Facing: 634 + Stance: HoldFire + Actor414: 4tnk + Owner: USSRUnmanned + Location: 15,4 + Facing: 634 + Stance: HoldFire + Actor415: 3tnk + Owner: USSRUnmanned + Location: 15,6 + Facing: 634 + Stance: HoldFire + Actor416: 3tnk + Owner: USSRUnmanned + Location: 17,6 + Facing: 634 + Stance: HoldFire + Actor417: 3tnk + Owner: USSRUnmanned + Facing: 512 + Location: 19,7 + Stance: HoldFire + Actor418: 3tnk + Owner: USSRUnmanned + Facing: 512 + Location: 21,7 + Stance: HoldFire + Actor419: 3tnk + Owner: USSRUnmanned + Facing: 512 + Location: 23,6 + Stance: HoldFire + Actor420: 3tnk + Owner: USSRUnmanned + Facing: 512 + Location: 25,6 + Stance: HoldFire + Actor421: 3tnk + Owner: USSRUnmanned + Facing: 512 + Location: 27,6 + Stance: HoldFire + Actor422: 3tnk + Owner: USSRUnmanned + Facing: 512 + Location: 29,7 + Stance: HoldFire + Actor424: 3tnk + Owner: USSRUnmanned + Facing: 512 + Location: 31,7 + Stance: HoldFire + Actor425: 3tnk + Owner: USSRUnmanned + Facing: 512 + Location: 33,7 + Stance: HoldFire + Actor423: 3tnk + Owner: USSRUnmanned + Facing: 512 + Location: 35,6 + Stance: HoldFire + Actor426: 3tnk + Owner: USSRUnmanned + Facing: 512 + Location: 37,6 + Stance: HoldFire + Actor427: 3tnk + Owner: USSRUnmanned + Location: 39,6 + Facing: 384 + Stance: HoldFire + Actor428: 3tnk + Owner: USSRUnmanned + Location: 41,6 + Facing: 384 + Stance: HoldFire + Actor439: btr + Owner: USSRUnmanned + Location: 15,8 + Facing: 634 + Stance: HoldFire + Actor440: btr + Owner: USSRUnmanned + Location: 15,10 + Facing: 634 + Stance: HoldFire + Actor441: btr + Owner: USSRUnmanned + Location: 15,12 + Facing: 634 + Stance: HoldFire + Actor442: ttra + Owner: USSRUnmanned + Facing: 384 + Location: 43,6 + Stance: HoldFire + Actor443: ttra + Owner: USSRUnmanned + Facing: 384 + Location: 43,8 + Stance: HoldFire + Actor444: ttra + Owner: USSRUnmanned + Facing: 384 + Location: 43,10 + Stance: HoldFire + Actor445: ttra + Owner: USSRUnmanned + Facing: 384 + Location: 43,12 + Stance: HoldFire + Actor429: ttra + Owner: USSRUnmanned + Facing: 384 + Location: 41,8 + Stance: HoldFire + Actor430: ttra + Owner: USSRUnmanned + Facing: 384 + Location: 41,10 + Stance: HoldFire + Actor431: ttra + Owner: USSRUnmanned + Facing: 384 + Location: 41,12 + Stance: HoldFire + Actor432: 3tnk + Owner: USSRUnmanned + Facing: 512 + Location: 23,8 + Stance: HoldFire + Actor433: 3tnk + Owner: USSRUnmanned + Facing: 512 + Location: 25,8 + Stance: HoldFire + Actor434: 3tnk + Owner: USSRUnmanned + Facing: 512 + Location: 27,8 + Stance: HoldFire + Actor446: 3tnk + Owner: USSRUnmanned + Facing: 512 + Location: 35,8 + Stance: HoldFire + Actor447: 3tnk + Owner: USSRUnmanned + Facing: 512 + Location: 37,8 + Stance: HoldFire + Actor448: btr + Owner: USSRUnmanned + Facing: 634 + Location: 17,8 + Stance: HoldFire + Actor449: btr + Owner: USSRUnmanned + Facing: 634 + Location: 17,10 + Stance: HoldFire + Actor450: btr + Owner: USSRUnmanned + Facing: 634 + Location: 17,12 + Stance: HoldFire + Actor451: btr + Owner: USSRUnmanned + Location: 19,9 + Facing: 512 + Stance: HoldFire + Actor452: btr + Owner: USSRUnmanned + Facing: 512 + Location: 21,9 + Stance: HoldFire + Actor453: btr + Owner: USSRUnmanned + Facing: 512 + Location: 19,11 + Stance: HoldFire + Actor454: btr + Owner: USSRUnmanned + Facing: 512 + Location: 21,11 + Stance: HoldFire + Actor455: btr + Owner: USSRUnmanned + Facing: 512 + Location: 23,10 + Stance: HoldFire + Actor456: btr + Owner: USSRUnmanned + Facing: 512 + Location: 25,10 + Stance: HoldFire + Actor459: btr + Owner: USSRUnmanned + Location: 35,10 + Facing: 512 + Stance: HoldFire + Actor460: btr + Owner: USSRUnmanned + Facing: 512 + Location: 37,10 + Stance: HoldFire + Actor437: ttnk + Owner: USSRUnmanned + Facing: 512 + Location: 35,12 + Stance: HoldFire + Actor438: ttnk + Owner: USSRUnmanned + Facing: 512 + Location: 37,12 + Stance: HoldFire + Actor461: ttnk + Owner: USSRUnmanned + Facing: 512 + Location: 19,13 + Stance: HoldFire + Actor462: ttnk + Owner: USSRUnmanned + Facing: 512 + Location: 21,13 + Stance: HoldFire + Actor435: btr + Owner: USSRUnmanned + Facing: 512 + Location: 27,10 + Stance: HoldFire + Actor436: btr + Owner: USSRUnmanned + Facing: 512 + Location: 29,9 + Stance: HoldFire + Actor457: btr + Owner: USSRUnmanned + Facing: 512 + Location: 31,9 + Stance: HoldFire + Actor458: btr + Owner: USSRUnmanned + Facing: 512 + Location: 33,9 + Stance: HoldFire + Actor463: btr + Owner: USSRUnmanned + Facing: 512 + Location: 30,11 + Stance: HoldFire + Actor464: btr + Owner: USSRUnmanned + Facing: 512 + Location: 32,11 + Stance: HoldFire + Actor465: 3tnk + Owner: USSRUnmanned + Facing: 384 + Location: 39,8 + Stance: HoldFire + Actor466: 3tnk + Owner: USSRUnmanned + Facing: 384 + Location: 39,10 + Stance: HoldFire + Actor467: ttra + Owner: USSRUnmanned + Facing: 384 + Location: 39,12 + Stance: HoldFire + TeslaCoil23: tsla + Owner: USSR + Location: 24,16 + TeslaCoil22: tsla + Owner: USSR + Location: 32,16 + Actor470: ftur + Owner: USSR + Location: 26,18 + Actor471: ftur + Owner: USSR + Location: 30,18 + Actor473: brik + Owner: USSR + Location: 49,1 + Actor474: brik + Owner: USSR + Location: 49,2 + Actor475: brik + Owner: USSR + Location: 49,3 + Actor476: brik + Owner: USSR + Location: 50,1 + Actor477: brik + Owner: USSR + Location: 50,2 + Actor478: brik + Owner: USSR + Location: 50,3 + Actor479: brik + Owner: USSR + Location: 50,4 + Actor480: brik + Owner: USSR + Location: 50,5 + Actor481: brik + Owner: USSR + Location: 50,6 + Actor482: brik + Owner: USSR + Location: 50,7 + Actor483: brik + Owner: USSR + Location: 51,7 + Actor484: brik + Owner: USSR + Location: 51,6 + Actor485: brik + Owner: USSR + Location: 52,7 + Actor486: brik + Owner: USSR + Location: 53,7 + Actor487: brik + Owner: USSR + Location: 53,6 + Actor488: brik + Owner: USSR + Location: 54,6 + Actor489: brik + Owner: USSR + Location: 54,7 + Actor490: brik + Owner: USSR + Location: 50,12 + Actor491: brik + Owner: USSR + Location: 50,13 + Actor492: brik + Owner: USSR + Location: 50,14 + Actor493: brik + Owner: USSR + Location: 50,15 + Actor494: brik + Owner: USSR + Location: 51,15 + Actor495: brik + Owner: USSR + Location: 53,15 + Actor496: brik + Owner: USSR + Location: 52,15 + Actor497: brik + Owner: USSR + Location: 54,15 + Actor498: brik + Owner: USSR + Location: 51,12 + Actor499: brik + Owner: USSR + Location: 51,13 + Actor500: brik + Owner: USSR + Location: 52,12 + Actor501: brik + Owner: USSR + Location: 53,12 + Actor502: brik + Owner: USSR + Location: 54,12 + Actor503: brik + Owner: USSR + Location: 53,13 + Actor504: brik + Owner: USSR + Location: 54,13 + Actor506: brik + Owner: USSR + Location: 55,15 + Actor507: brik + Owner: USSR + Location: 55,16 + Actor508: brik + Owner: USSR + Location: 55,17 + Actor509: brik + Owner: USSR + Location: 56,16 + Actor510: brik + Owner: USSR + Location: 56,17 + Actor505: brik + Owner: USSR + Location: 57,17 + Actor511: brik + Owner: USSR + Location: 58,17 + Actor512: brik + Owner: USSR + Location: 58,16 + Actor513: brik + Owner: USSR + Location: 59,16 + Actor514: brik + Owner: USSR + Location: 59,17 + Actor515: brik + Owner: USSR + Location: 63,16 + Actor516: brik + Owner: USSR + Location: 63,17 + Actor517: brik + Owner: USSR + Location: 64,16 + Actor518: brik + Owner: USSR + Location: 64,17 + Actor519: brik + Owner: USSR + Location: 65,17 + Actor520: brik + Owner: USSR + Location: 66,17 + Actor521: brik + Owner: USSR + Location: 66,16 + Actor522: brik + Owner: USSR + Location: 67,16 + Actor523: brik + Owner: USSR + Location: 67,17 + Actor524: brik + Owner: USSR + Location: 68,17 + Actor525: brik + Owner: USSR + Location: 69,17 + Actor526: brik + Owner: USSR + Location: 70,17 + Actor527: brik + Owner: USSR + Location: 71,17 + Actor528: brik + Owner: USSR + Location: 72,17 + Actor529: brik + Owner: USSR + Location: 72,16 + Actor530: brik + Owner: USSR + Location: 69,16 + Actor531: brik + Owner: USSR + Location: 70,16 + Actor532: brik + Owner: USSR + Location: 73,16 + Actor533: brik + Owner: USSR + Location: 73,17 + Actor549: brik + Owner: USSR + Location: 51,1 + Actor550: brik + Owner: USSR + Location: 53,1 + Actor551: brik + Owner: USSR + Location: 54,1 + Actor552: brik + Owner: USSR + Location: 52,1 + Actor553: brik + Owner: USSR + Location: 55,1 + Actor554: brik + Owner: USSR + Location: 56,1 + Actor555: brik + Owner: USSR + Location: 57,1 + Actor556: brik + Owner: USSR + Location: 58,1 + Actor557: brik + Owner: USSR + Location: 59,1 + Actor558: brik + Owner: USSR + Location: 60,1 + Actor559: brik + Owner: USSR + Location: 61,1 + Actor560: brik + Owner: USSR + Location: 63,1 + Actor561: brik + Owner: USSR + Location: 62,1 + Actor562: brik + Owner: USSR + Location: 65,1 + Actor563: brik + Owner: USSR + Location: 64,1 + Actor564: brik + Owner: USSR + Location: 67,1 + Actor565: brik + Owner: USSR + Location: 66,1 + Actor566: brik + Owner: USSR + Location: 68,1 + Actor567: brik + Owner: USSR + Location: 70,1 + Actor568: brik + Owner: USSR + Location: 71,1 + Actor569: brik + Owner: USSR + Location: 72,1 + Actor570: brik + Owner: USSR + Location: 69,1 + Factory1: weap + Owner: USSR + Location: 56,2 + Factory2: weap + Owner: USSR + Location: 60,2 + Factory3: weap + Owner: USSR + Location: 64,2 + Factory4: weap + Owner: USSR + Location: 68,2 + Actor548: brik + Owner: USSR + Location: 73,1 + Factory5: weap + Owner: USSR + Location: 72,2 + Actor535: brik + Owner: USSR + Location: 74,1 + Actor536: brik + Owner: USSR + Location: 75,1 + Actor541: brik + Owner: USSR + Location: 75,6 + Actor542: brik + Owner: USSR + Location: 75,7 + Actor543: brik + Owner: USSR + Location: 75,8 + Actor544: brik + Owner: USSR + Location: 75,10 + Actor545: brik + Owner: USSR + Location: 75,9 + Actor546: brik + Owner: USSR + Location: 75,11 + Actor547: brik + Owner: USSR + Location: 75,12 + Actor571: brik + Owner: USSR + Location: 75,14 + Actor572: brik + Owner: USSR + Location: 75,13 + Actor573: brik + Owner: USSR + Location: 75,15 + Actor574: brik + Owner: USSR + Location: 75,16 + Actor579: brik + Owner: USSR + Location: 75,17 + Actor580: brik + Owner: USSR + Location: 74,17 + TeslaCoil15: tsla + Owner: USSR + Location: 65,16 + TeslaCoil14: tsla + Owner: USSR + Location: 68,16 + TeslaCoil13: tsla + Owner: USSR + Location: 71,16 + TeslaCoil12: tsla + Owner: USSR + Location: 74,16 + TeslaCoil17: tsla + Owner: USSR + Location: 57,16 + TeslaCoil19: tsla + Owner: USSR + Location: 52,6 + TeslaCoil18: tsla + Owner: USSR + Location: 52,13 + Actor586: ftur + Owner: USSR + Location: 59,18 + Actor587: ftur + Owner: USSR + Location: 63,18 + TeslaCoil24: tsla + Owner: USSR + Location: 21,15 + TeslaCoil21: tsla + Owner: USSR + Location: 35,15 + TeslaCoil25: tsla + Owner: USSR + Location: 18,15 + TeslaCoil20: tsla + Owner: USSR + Location: 38,16 + Actor594: sam + Owner: USSR + Location: 51,14 + Actor595: sam + Owner: USSR + Location: 53,14 + Actor596: sam + Owner: USSR + Location: 69,15 + Actor597: sam + Owner: USSR + Location: 66,15 + Actor598: sam + Owner: USSR + Location: 72,15 + Actor601: indp + Owner: USSR + Location: 70,7 + Actor602: stek + Owner: USSR + Location: 51,2 + Actor603: brik + Owner: USSR + Location: 54,2 + Actor604: brik + Owner: USSR + Location: 55,2 + Barracks2: barr + Owner: USSR + Location: 72,11 + Barracks1: barr + Owner: USSR + Location: 69,11 + TeslaCoil16: tsla + Owner: USSR + Location: 61,15 + Actor599: fix + Owner: USSR + Location: 63,7 + Actor600: fix + Owner: USSR + Location: 63,10 + Actor608: silo + Owner: USSR + Location: 56,12 + Actor609: silo + Owner: USSR + Location: 58,12 + Actor610: silo + Owner: USSR + Location: 57,13 + Actor611: silo + Owner: USSR + Location: 59,13 + Actor613: silo + Owner: USSR + Location: 74,7 + Actor614: silo + Owner: USSR + Location: 74,8 + Actor615: silo + Owner: USSR + Location: 74,9 + Actor612: ftur + Owner: USSR + Location: 59,8 + Actor616: brik + Owner: USSR + Location: 86,28 + Actor617: brik + Owner: USSR + Location: 86,29 + Actor618: brik + Owner: USSR + Location: 86,30 + Actor619: brik + Owner: USSR + Location: 86,32 + Actor620: brik + Owner: USSR + Location: 86,31 + Actor621: brik + Owner: USSR + Location: 86,33 + Actor622: brik + Owner: USSR + Location: 87,33 + Actor623: brik + Owner: USSR + Location: 87,32 + Actor624: brik + Owner: USSR + Location: 86,27 + Actor625: brik + Owner: USSR + Location: 87,27 + Actor626: brik + Owner: USSR + Location: 88,27 + Actor627: brik + Owner: USSR + Location: 89,27 + Actor628: brik + Owner: USSR + Location: 90,27 + Actor629: brik + Owner: USSR + Location: 92,27 + Actor630: brik + Owner: USSR + Location: 91,27 + Actor631: brik + Owner: USSR + Location: 93,27 + Actor632: brik + Owner: USSR + Location: 94,27 + Actor633: brik + Owner: USSR + Location: 95,27 + Actor634: brik + Owner: USSR + Location: 95,28 + Actor635: brik + Owner: USSR + Location: 94,28 + Actor636: brik + Owner: USSR + Location: 99,27 + Actor637: brik + Owner: USSR + Location: 99,28 + Actor638: brik + Owner: USSR + Location: 100,27 + Actor639: brik + Owner: USSR + Location: 100,28 + Actor640: brik + Owner: USSR + Location: 101,27 + Actor641: brik + Owner: USSR + Location: 102,27 + Actor642: brik + Owner: USSR + Location: 103,27 + Actor643: brik + Owner: USSR + Location: 105,27 + Actor644: brik + Owner: USSR + Location: 104,27 + Actor645: brik + Owner: USSR + Location: 106,27 + Actor655: brik + Owner: USSR + Location: 86,37 + Actor656: brik + Owner: USSR + Location: 87,37 + Actor657: brik + Owner: USSR + Location: 86,38 + Actor658: brik + Owner: USSR + Location: 87,38 + Actor659: brik + Owner: USSR + Location: 86,39 + Actor660: brik + Owner: USSR + Location: 86,39 + Actor661: brik + Owner: USSR + Location: 86,40 + Actor662: brik + Owner: USSR + Location: 86,40 + Actor663: brik + Owner: USSR + Location: 86,41 + Actor664: brik + Owner: USSR + Location: 86,42 + Actor665: brik + Owner: USSR + Location: 86,43 + Actor666: brik + Owner: USSR + Location: 87,43 + Actor667: brik + Owner: USSR + Location: 88,43 + Actor668: brik + Owner: USSR + Location: 89,43 + Actor669: brik + Owner: USSR + Location: 91,43 + Actor670: brik + Owner: USSR + Location: 90,43 + Actor671: brik + Owner: USSR + Location: 92,43 + Actor672: brik + Owner: USSR + Location: 93,43 + Actor673: brik + Owner: USSR + Location: 94,43 + Actor674: brik + Owner: USSR + Location: 95,43 + Actor675: brik + Owner: USSR + Location: 95,42 + Actor676: brik + Owner: USSR + Location: 94,42 + Actor677: brik + Owner: USSR + Location: 99,42 + Actor678: brik + Owner: USSR + Location: 99,43 + Actor679: brik + Owner: USSR + Location: 100,42 + Actor680: brik + Owner: USSR + Location: 100,43 + Actor681: brik + Owner: USSR + Location: 101,43 + Actor682: brik + Owner: USSR + Location: 102,43 + Actor683: brik + Owner: USSR + Location: 103,43 + Actor684: brik + Owner: USSR + Location: 104,43 + Actor685: brik + Owner: USSR + Location: 105,43 + Actor686: brik + Owner: USSR + Location: 106,43 + TeslaCoil8: tsla + Owner: USSR + Location: 87,39 + TeslaCoil9: tsla + Owner: USSR + Location: 87,31 + TeslaCoil6: tsla + Owner: USSR + Location: 93,42 + TeslaCoil7: tsla + Owner: USSR + Location: 101,42 + Actor700: ftur + Owner: USSR + Location: 95,44 + Actor701: ftur + Owner: USSR + Location: 99,44 + Actor702: ftur + Owner: USSR + Location: 85,37 + Actor703: ftur + Owner: USSR + Location: 85,33 + Actor704: sam + Owner: USSR + Location: 87,42 + Actor705: sam + Owner: USSR + Location: 87,28 + MainFactory: weap + Owner: USSR + Location: 90,30 + MainBarracks: barr + Owner: USSR + Location: 90,37 + Actor710: proc + Owner: USSR + Location: 100,36 + Actor687: brik + Owner: USSR + Location: 107,43 + Actor688: brik + Owner: USSR + Location: 107,42 + Actor689: brik + Owner: USSR + Location: 106,42 + Actor690: brik + Owner: USSR + Location: 105,42 + Actor691: brik + Owner: USSR + Location: 106,28 + Actor692: brik + Owner: USSR + Location: 105,28 + Actor695: sam + Owner: USSR + Location: 103,42 + Actor693: brik + Owner: USSR + Location: 107,27 + Actor694: brik + Owner: USSR + Location: 107,28 + Actor706: sam + Owner: USSR + Location: 103,28 + Actor707: fact + Owner: USSR + Location: 106,36 + Actor711: stek + Owner: USSR + Location: 106,32 + SovietRadar: dome + Owner: USSR + Location: 103,31 + Actor713: proc + Owner: USSR + Location: 99,30 + Actor714: silo + Owner: USSR + Location: 99,30 + Actor715: silo + Owner: USSR + Location: 101,30 + Actor716: silo + Owner: USSR + Location: 100,36 + Actor717: silo + Owner: USSR + Location: 102,36 + Actor719: tc02 + Owner: Neutral + Faction: russia + Location: 1,50 + Actor720: tc01 + Owner: Neutral + Faction: russia + Location: 3,56 + Actor721: t17 + Owner: Neutral + Faction: russia + Location: 4,54 + Actor722: t15 + Owner: Neutral + Faction: russia + Location: 1,52 + Actor723: tc05 + Owner: Neutral + Faction: russia + Location: 0,41 + Actor725: t11 + Owner: Neutral + Faction: russia + Location: 2,46 + Actor724: t06 + Owner: Neutral + Faction: russia + Location: 1,48 + Actor727: t13 + Owner: Neutral + Faction: russia + Location: 21,44 + Actor728: tc05 + Owner: Neutral + Faction: russia + Location: 32,52 + Actor729: t16 + Owner: Neutral + Faction: russia + Location: 11,9 + Actor730: tc02 + Owner: Neutral + Faction: russia + Location: 10,7 + Actor731: t03 + Owner: Neutral + Faction: russia + Location: 10,9 + Actor732: t02 + Owner: Neutral + Faction: russia + Location: 11,5 + Actor733: t07 + Owner: Neutral + Faction: russia + Location: 8,11 + Actor734: tc04 + Owner: Neutral + Faction: russia + Location: 15,16 + Actor735: tc01 + Owner: Neutral + Faction: russia + Location: 9,16 + Actor736: t17 + Owner: Neutral + Faction: russia + Location: 11,16 + Actor737: t11 + Owner: Neutral + Faction: russia + Location: 18,17 + Actor738: t13 + Owner: Neutral + Faction: russia + Location: 6,18 + Actor739: t14 + Owner: Neutral + Faction: russia + Location: 1,18 + Actor746: tc04 + Owner: Neutral + Faction: russia + Location: 1,12 + Actor747: tc02 + Owner: Neutral + Faction: russia + Location: 4,15 + Actor748: tc03 + Owner: Neutral + Faction: russia + Location: 6,14 + Actor749: tc05 + Owner: Neutral + Faction: russia + Location: 5,8 + Actor750: t06 + Owner: Neutral + Faction: russia + Location: 7,12 + Actor751: t13 + Owner: Neutral + Faction: russia + Location: 4,13 + Actor752: t15 + Owner: Neutral + Faction: russia + Location: 5,11 + Actor753: t17 + Owner: Neutral + Faction: russia + Location: 3,11 + Actor754: t12 + Owner: Neutral + Faction: russia + Location: 4,10 + Actor755: t03 + Owner: Neutral + Faction: russia + Location: 3,8 + Actor756: t13 + Owner: Neutral + Faction: russia + Location: 2,10 + Actor757: tc01 + Owner: Neutral + Faction: russia + Location: 1,8 + Actor758: tc02 + Owner: Neutral + Faction: russia + Location: 2,7 + Actor760: tc03 + Owner: Neutral + Faction: russia + Location: 1,5 + Actor761: tc04 + Owner: Neutral + Faction: russia + Location: 6,4 + Actor762: t15 + Owner: Neutral + Faction: russia + Location: 4,6 + Actor763: t13 + Owner: Neutral + Faction: russia + Location: 7,2 + Actor759: tc05 + Owner: Neutral + Faction: russia + Location: 1,1 + Actor764: t03 + Owner: Neutral + Faction: russia + Location: 3,5 + Actor765: t17 + Owner: Neutral + Faction: russia + Location: 5,5 + Actor766: t14 + Owner: Neutral + Faction: russia + Location: 3,4 + Actor767: tc01 + Owner: Neutral + Faction: russia + Location: 5,2 + Actor768: t02 + Owner: Neutral + Faction: russia + Location: 6,1 + Actor769: t01 + Owner: Neutral + Faction: russia + Location: 4,3 + Actor770: t03 + Owner: Neutral + Faction: russia + Location: 1,3 + Actor771: t12 + Owner: Neutral + Faction: russia + Location: 5,1 + Actor772: t12 + Owner: Neutral + Faction: russia + Location: 10,1 + Actor773: apoc + Owner: USSR + Location: 28,18 + Facing: 512 + TeslaCoil10: tsla + Owner: USSR + Location: 93,28 + TeslaCoil11: tsla + Owner: USSR + Location: 101,28 + ShoreHeavyTank1: 3tnk + Owner: USSR + Location: 22,89 + Facing: 384 + ShoreHeavyTank2: 3tnk + Owner: USSR + Location: 24,87 + Facing: 384 + ShoreInf2: e1 + Owner: USSR + SubCell: 3 + Location: 22,88 + Facing: 384 + ShoreInf1: e1 + Owner: USSR + Location: 24,86 + SubCell: 3 + Facing: 384 + ShoreInf3: e1 + Owner: USSR + SubCell: 3 + Location: 23,90 + Facing: 384 + ShoreInf4: e2 + Owner: USSR + SubCell: 3 + Location: 24,89 + Facing: 384 + Actor782: tc04 + Owner: Neutral + Location: 110,20 + Actor783: t12 + Owner: Neutral + Location: 110,24 + Actor784: tc01 + Owner: Neutral + Location: 111,26 + Actor785: tc01 + Owner: Neutral + Location: 111,26 + Actor786: t13 + Owner: Neutral + Location: 112,28 + Actor787: t07 + Owner: Neutral + Location: 110,17 + Actor788: t11 + Owner: Neutral + Location: 111,18 + Actor789: t03 + Owner: Neutral + Location: 111,13 + Actor790: t06 + Owner: Neutral + Location: 111,16 + Actor791: t02 + Owner: Neutral + Location: 112,12 + Actor792: t10 + Owner: Neutral + Location: 110,15 + Actor793: t16 + Owner: Neutral + Location: 111,23 + Actor794: t14 + Owner: Neutral + Location: 110,30 + Actor795: spen + Owner: USSR + Location: 101,11 + Actor796: spen + Owner: USSR + Location: 95,9 + Actor797: sam + Owner: USSR + Location: 99,15 + Actor798: sam + Owner: USSR + Location: 94,13 + Actor799: split2 + Owner: Neutral + Location: 102,23 + Actor800: split2 + Owner: Neutral + Location: 91,24 + Actor801: split2 + Owner: Neutral + Location: 103,47 + Actor802: ftur + Owner: USSR + Location: 18,95 + Actor803: ftur + Owner: USSR + Location: 10,92 + Actor804: fenc + Owner: USSR + Location: 9,92 + Actor805: fenc + Owner: USSR + Location: 9,93 + Actor806: fenc + Owner: USSR + Location: 10,93 + Actor807: fenc + Owner: USSR + Location: 11,93 + Actor808: fenc + Owner: USSR + Location: 11,92 + Actor809: fenc + Owner: USSR + Location: 9,91 + Actor810: fenc + Owner: USSR + Location: 17,95 + Actor811: fenc + Owner: USSR + Location: 17,96 + Actor812: fenc + Owner: USSR + Location: 17,94 + Actor813: fenc + Owner: USSR + Location: 18,96 + Actor814: fenc + Owner: USSR + Location: 19,96 + Actor815: fenc + Owner: USSR + Location: 19,95 + Actor816: fenc + Owner: USSR + Location: 16,94 + Actor817: fenc + Owner: USSR + Location: 12,93 + Actor818: fenc + Owner: USSR + Location: 8,92 + Actor819: fenc + Owner: USSR + Location: 20,95 + Actor820: fenc + Owner: USSR + Location: 23,96 + Actor821: fenc + Owner: USSR + Location: 24,96 + Actor822: fenc + Owner: USSR + Location: 25,96 + Actor823: fenc + Owner: USSR + Location: 23,95 + Actor824: fenc + Owner: USSR + Location: 5,90 + Actor825: fenc + Owner: USSR + Location: 5,91 + Actor826: fenc + Owner: USSR + Location: 4,91 + Actor827: fenc + Owner: USSR + Location: 3,91 + Actor828: fenc + Owner: USSR + Location: 3,90 + Actor829: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 13,93 + Actor830: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 22,95 + Actor831: e1 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 4,90 + Actor832: e1 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 6,91 + Actor833: e1 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 22,97 + Actor834: e1 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 11,90 + ScrinReinforce1Spawn: waypoint + Owner: Neutral + Location: 1,107 + ScrinReinforce2Spawn: waypoint + Owner: Neutral + Location: 7,112 + ScrinReinforce1Dest: waypoint + Owner: Neutral + Location: 6,102 + PlayerStart: waypoint + Owner: Neutral + Location: 10,104 + ScrinReinforce2Dest: waypoint + Owner: Neutral + Location: 14,106 + Actor839: seek + Owner: Scrin + Facing: 912 + Location: 16,105 + Actor837: seek + Owner: Scrin + Facing: 912 + Location: 7,100 + Shore: waypoint + Owner: Neutral + Location: 13,95 + Actor835: ftur + Owner: USSR + Location: 94,62 + Actor836: ftur + Owner: USSR + Location: 100,62 + Actor838: fenc + Owner: USSR + Location: 95,62 + Actor840: fenc + Owner: USSR + Location: 95,63 + Actor841: fenc + Owner: USSR + Location: 94,63 + Actor842: fenc + Owner: USSR + Location: 93,63 + Actor843: fenc + Owner: USSR + Location: 93,62 + Actor844: fenc + Owner: USSR + Location: 99,62 + Actor845: fenc + Owner: USSR + Location: 99,63 + Actor846: fenc + Owner: USSR + Location: 101,63 + Actor847: fenc + Owner: USSR + Location: 100,63 + Actor848: fenc + Owner: USSR + Location: 101,62 + Actor849: fenc + Owner: USSR + Location: 102,62 + Actor850: fenc + Owner: USSR + Location: 92,62 + Actor851: ftur + Owner: USSR + Location: 26,42 + Actor852: ftur + Owner: USSR + Location: 33,42 + Actor853: fenc + Owner: USSR + Location: 32,42 + Actor854: fenc + Owner: USSR + Location: 32,43 + Actor855: fenc + Owner: USSR + Location: 33,43 + Actor856: fenc + Owner: USSR + Location: 34,43 + Actor857: fenc + Owner: USSR + Location: 34,42 + Actor858: fenc + Owner: USSR + Location: 35,42 + Actor859: fenc + Owner: USSR + Location: 25,42 + Actor860: fenc + Owner: USSR + Location: 25,43 + Actor861: fenc + Owner: USSR + Location: 26,43 + Actor862: fenc + Owner: USSR + Location: 27,43 + Actor863: fenc + Owner: USSR + Location: 27,42 + Actor864: fenc + Owner: USSR + Location: 24,42 + Actor865: sbag + Owner: USSR + Location: 48,65 + Actor866: sbag + Owner: USSR + Location: 47,65 + Actor867: sbag + Owner: USSR + Location: 46,65 + Actor868: sbag + Owner: USSR + Location: 46,66 + Actor869: sbag + Owner: USSR + Location: 46,67 + Actor870: sbag + Owner: USSR + Location: 46,71 + Actor871: sbag + Owner: USSR + Location: 46,72 + Actor872: sbag + Owner: USSR + Location: 46,73 + Actor873: sbag + Owner: USSR + Location: 46,74 + Actor874: sbag + Owner: USSR + Location: 47,74 + Actor875: sbag + Owner: USSR + Location: 48,74 + Actor877: sbag + Owner: USSR + Location: 48,75 + Actor876: sbag + Owner: USSR + Location: 48,76 + Actor878: sbag + Owner: USSR + Location: 49,76 + Actor879: sbag + Owner: USSR + Location: 50,76 + Actor880: sbag + Owner: USSR + Location: 51,76 + Actor881: sbag + Owner: USSR + Location: 55,76 + Actor882: sbag + Owner: USSR + Location: 56,76 + Actor883: sbag + Owner: USSR + Location: 57,76 + Actor884: sbag + Owner: USSR + Location: 58,76 + Actor885: sbag + Owner: USSR + Location: 59,76 + Actor886: sbag + Owner: USSR + Location: 60,76 + Actor887: sbag + Owner: USSR + Location: 61,76 + Actor888: sbag + Owner: USSR + Location: 61,75 + Actor890: powr + Owner: USSR + Location: 50,66 + Actor891: powr + Owner: USSR + Location: 59,73 + Actor892: proc + Owner: USSR + Location: 50,71 + Actor895: split2 + Owner: Neutral + Location: 61,80 + Actor896: split2 + Owner: Neutral + Location: 54,82 + Actor897: silo + Owner: USSR + Location: 52,71 + Actor898: silo + Owner: USSR + Location: 50,71 + Actor899: silo + Owner: USSR + Location: 51,70 + Actor900: v2rl + Owner: USSR + Facing: 384 + Location: 88,87 + Actor901: v2rl + Owner: USSR + Facing: 384 + Location: 96,89 + Actor902: v2rl + Owner: USSR + Facing: 384 + Location: 101,76 + Actor903: katy + Owner: USSR + Facing: 384 + Location: 35,40 + Actor904: katy + Owner: USSR + Facing: 384 + Location: 101,60 + Actor905: 3tnk + Owner: USSR + Location: 97,62 + Facing: 512 + Actor906: 3tnk + Owner: USSR + Location: 29,42 + Facing: 512 + TeslaCoil2: tsla + Owner: USSR + Location: 85,101 + Actor908: tc01 + Owner: Neutral + Location: 30,27 + Actor909: t16 + Owner: Neutral + Location: 37,25 + Actor910: t12 + Owner: Neutral + Location: 46,20 + Actor911: t11 + Owner: Neutral + Location: 46,30 + Actor912: t13 + Owner: Neutral + Location: 50,24 + Actor913: t10 + Owner: Neutral + Location: 55,33 + Actor914: t11 + Owner: Neutral + Location: 74,23 + Actor915: t13 + Owner: Neutral + Location: 73,32 + Actor916: t16 + Owner: Neutral + Location: 66,32 + Actor919: t10 + Owner: Neutral + Location: 38,35 + Actor920: t03 + Owner: Neutral + Location: 40,30 + Actor922: t10 + Owner: Neutral + Location: 21,52 + Actor924: t10 + Owner: Neutral + Location: 42,62 + Actor925: t10 + Owner: Neutral + Location: 38,66 + Actor926: t03 + Owner: Neutral + Location: 89,68 + Actor927: t11 + Owner: Neutral + Location: 85,49 + Actor928: t10 + Owner: Neutral + Location: 79,42 + Actor929: t11 + Owner: Neutral + Location: 80,28 + Actor930: t03 + Owner: Neutral + Location: 81,20 + Actor931: t10 + Owner: Neutral + Location: 77,9 + Actor933: t02 + Owner: Neutral + Location: 82,11 + Actor934: t12 + Owner: Neutral + Location: 84,12 + Actor935: t13 + Owner: Neutral + Location: 76,14 + Actor937: t02 + Owner: Neutral + Location: 85,26 + Actor938: t02 + Owner: Neutral + Location: 91,52 + Actor939: t02 + Owner: Neutral + Location: 108,70 + Actor940: t13 + Owner: Neutral + Location: 104,72 + Actor941: t11 + Owner: Neutral + Location: 107,74 + Actor943: t15 + Owner: Neutral + Location: 67,92 + Actor944: t15 + Owner: Neutral + Location: 86,74 + Actor945: t15 + Owner: Neutral + Location: 40,76 + Actor946: t14 + Owner: Neutral + Location: 60,88 + Actor947: t14 + Owner: Neutral + Location: 60,108 + Actor948: t14 + Owner: Neutral + Location: 85,110 + Actor949: t14 + Owner: Neutral + Location: 85,110 + Actor950: tc01 + Owner: Neutral + Location: 94,110 + Actor951: t17 + Owner: Neutral + Location: 103,107 + Actor952: tc01 + Owner: Neutral + Location: 106,102 + Actor953: tc04 + Owner: Neutral + Location: 77,85 + Actor954: t02 + Owner: Neutral + Location: 73,83 + Actor955: t03 + Owner: Neutral + Location: 81,80 + Actor956: t01 + Owner: Neutral + Location: 85,88 + Actor958: t08 + Owner: Neutral + Location: 112,88 + Actor959: t07 + Owner: Neutral + Location: 109,83 + Actor960: t03 + Owner: Neutral + Location: 110,81 + Actor961: t11 + Owner: Neutral + Location: 98,83 + Actor962: t13 + Owner: Neutral + Location: 97,76 + Actor963: t14 + Owner: Neutral + Location: 103,67 + Actor964: t13 + Owner: Neutral + Location: 25,62 + Actor965: t10 + Owner: Neutral + Location: 38,93 + Actor966: t13 + Owner: Neutral + Location: 25,93 + Actor967: tc01 + Owner: Neutral + Location: 33,99 + Actor968: tc02 + Owner: Neutral + Location: 50,92 + Actor969: t17 + Owner: Neutral + Location: 49,93 + Actor970: t13 + Owner: Neutral + Location: 51,94 + Actor971: t01 + Owner: Neutral + Location: 37,85 + Actor972: t11 + Owner: Neutral + Location: 44,105 + Actor973: t15 + Owner: Neutral + Location: 39,110 + Actor974: t10 + Owner: Neutral + Location: 38,107 + Actor975: t12 + Owner: Neutral + Location: 37,108 + Actor976: t11 + Owner: Neutral + Location: 55,107 + Actor977: t06 + Owner: Neutral + Location: 53,104 + Actor978: t02 + Owner: Neutral + Location: 49,106 + Actor979: t16 + Owner: Neutral + Location: 48,111 + Actor980: t15 + Owner: Neutral + Location: 49,96 + Actor981: t14 + Owner: Neutral + Location: 31,84 + Actor982: t11 + Owner: Neutral + Location: 26,81 + Actor983: t02 + Owner: Neutral + Location: 18,82 + Actor984: t06 + Owner: Neutral + Location: 25,84 + Actor985: t05 + Owner: Neutral + Location: 31,91 + Actor986: t03 + Owner: Neutral + Location: 30,90 + Actor987: t10 + Owner: Neutral + Location: 2,87 + Actor988: t02 + Owner: Neutral + Location: 8,86 + Actor989: t01 + Owner: Neutral + Location: 6,76 + Actor990: t02 + Owner: Neutral + Location: 35,111 + Actor991: split2 + Owner: Neutral + Location: 38,102 + IslandAirfield2: afld + Owner: USSR + Location: 65,52 + IslandAirfield3: afld + Owner: USSR + Location: 64,55 + Actor994: tc05 + Owner: Neutral + Location: 77,36 + Actor995: tc01 + Owner: Neutral + Location: 63,39 + Actor996: tc03 + Owner: Neutral + Location: 46,28 + Actor997: ice01 + Owner: Neutral + Location: 65,24 + Actor998: ice03 + Owner: Neutral + Location: 24,36 + Actor999: t15 + Owner: Neutral + Location: 39,92 + Actor1000: t10 + Owner: Neutral + Location: 26,94 + Actor1001: t15 + Owner: Neutral + Location: 43,104 + Actor1002: t13 + Owner: Neutral + Location: 54,108 + Actor1003: t14 + Owner: Neutral + Location: 59,111 + Actor1004: t13 + Owner: Neutral + Location: 50,90 + Actor1005: t10 + Owner: Neutral + Location: 41,75 + Actor1006: t13 + Owner: Neutral + Location: 43,76 + Actor1007: t11 + Owner: Neutral + Location: 39,65 + Actor1008: t13 + Owner: Neutral + Location: 32,51 + Actor1009: t13 + Owner: Neutral + Location: 12,60 + Actor1010: t12 + Owner: Neutral + Location: 18,58 + Actor1011: t10 + Owner: Neutral + Location: 22,59 + Actor1012: t17 + Owner: Neutral + Location: 39,94 + Actor1013: t03 + Owner: Neutral + Location: 1,89 + Actor1014: t13 + Owner: Neutral + Location: 40,67 + Actor1015: t11 + Owner: Neutral + Location: 107,101 + Actor1017: t11 + Owner: Neutral + Location: 103,71 + Actor1018: t13 + Owner: Neutral + Location: 85,74 + Actor1020: t10 + Owner: Neutral + Location: 59,109 + Actor1021: t10 + Owner: Neutral + Location: 73,89 + Actor1022: t12 + Owner: Neutral + Location: 67,91 + Actor1023: t10 + Owner: Neutral + Location: 87,72 + Actor1024: t14 + Owner: Neutral + Location: 82,50 + Actor1025: t13 + Owner: Neutral + Location: 80,37 + Actor1026: t12 + Owner: Neutral + Location: 74,31 + Actor1027: t13 + Owner: Neutral + Location: 73,22 + Actor1028: t11 + Owner: Neutral + Location: 57,32 + Actor1031: t03 + Owner: Neutral + Location: 51,23 + Actor1032: t14 + Owner: Neutral + Location: 52,23 + Actor1033: 3tnk + Owner: USSR + Location: 79,98 + Facing: 256 + Actor1034: 3tnk + Owner: USSR + Location: 79,103 + Facing: 256 + Actor1035: 3tnk + Owner: USSR + Location: 8,55 + Facing: 610 + Actor1036: 3tnk + Owner: USSR + Facing: 384 + Location: 34,21 + Actor1037: 3tnk + Owner: USSR + Location: 58,21 + Facing: 512 + Actor1038: 3tnk + Owner: USSR + Location: 64,21 + Facing: 512 + Actor1039: 3tnk + Owner: USSR + Location: 82,33 + Facing: 256 + Actor1040: 3tnk + Owner: USSR + Location: 83,38 + Facing: 256 + Actor1041: 3tnk + Owner: USSR + Location: 94,47 + Facing: 512 + Actor1042: 3tnk + Owner: USSR + Location: 99,49 + Facing: 512 + Actor1043: 3tnk + Owner: USSR + Location: 69,40 + Facing: 927 + Actor1044: 3tnk + Owner: USSR + Location: 29,58 + Facing: 626 + Actor1045: 3tnk + Owner: USSR + Location: 31,60 + Facing: 634 + Actor1046: ttra + Owner: USSR + Facing: 384 + Location: 95,38 + Actor1047: ttra + Owner: USSR + Location: 89,29 + Facing: 384 + Actor1048: ttnk + Owner: USSR + Location: 97,38 + Facing: 512 + Actor1049: v2rl + Owner: USSR + Facing: 384 + Location: 89,41 + Actor1050: btr + Owner: USSR + Facing: 384 + Location: 25,40 + Actor1051: btr + Owner: USSR + Facing: 384 + Location: 30,75 + Actor1052: btr + Owner: USSR + Facing: 384 + Location: 47,84 + Actor1053: btr + Owner: USSR + Location: 62,101 + Facing: 256 + Actor1054: isu + Owner: USSR + Location: 66,19 + Facing: 512 + Actor1055: 4tnk.erad.atomic + Owner: USSR + Location: 23,20 + Facing: 626 + Actor1056: 4tnk + Owner: USSR + Location: 43,23 + Facing: 256 + Actor1057: btr + Owner: USSR + Location: 45,23 + Facing: 256 + Actor1058: e1 + Owner: USSR + SubCell: 3 + Location: 7,56 + Facing: 761 + Actor1059: e1 + Owner: USSR + SubCell: 3 + Location: 9,54 + Facing: 689 + Actor1061: e1 + Owner: USSR + SubCell: 3 + Location: 10,55 + Facing: 626 + Actor1062: e1 + Owner: USSR + Location: 10,55 + SubCell: 1 + Facing: 642 + Actor1063: e1 + Owner: USSR + SubCell: 3 + Location: 30,57 + Facing: 642 + Actor1064: e1 + Owner: USSR + SubCell: 3 + Location: 31,59 + Facing: 689 + Actor1065: e1 + Owner: USSR + SubCell: 3 + Location: 29,60 + Facing: 697 + Actor1066: e1 + Owner: USSR + SubCell: 3 + Location: 33,61 + Facing: 515 + Actor1067: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 46,68 + Actor1068: e1 + Owner: USSR + Facing: 384 + Location: 45,71 + SubCell: 3 + Actor1069: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 52,76 + Actor1070: e1 + Owner: USSR + Facing: 384 + Location: 54,76 + SubCell: 3 + Actor1071: e1 + Owner: USSR + Facing: 384 + Location: 47,76 + SubCell: 3 + Actor1072: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 48,86 + Actor1073: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 50,88 + Actor1074: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 34,77 + Actor1075: e1 + Owner: USSR + Facing: 384 + Location: 28,78 + SubCell: 3 + Actor1076: e1 + Owner: USSR + SubCell: 3 + Location: 34,80 + Facing: 475 + Actor1077: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 30,76 + Actor1078: e1 + Owner: USSR + Location: 56,98 + SubCell: 3 + Facing: 214 + Actor1079: e1 + Owner: USSR + SubCell: 3 + Location: 58,103 + Facing: 261 + Actor1080: e1 + Owner: USSR + SubCell: 3 + Location: 59,99 + Facing: 261 + Actor1081: e1 + Owner: USSR + SubCell: 3 + Location: 62,102 + Facing: 253 + Actor1082: e1 + Owner: USSR + SubCell: 3 + Location: 64,107 + Facing: 0 + Actor1083: e1 + Owner: USSR + SubCell: 3 + Location: 66,111 + Facing: 0 + Actor1084: e1 + Owner: USSR + SubCell: 3 + Location: 69,100 + Facing: 269 + Actor1085: e1 + Owner: USSR + SubCell: 3 + Location: 68,96 + Facing: 222 + Actor1086: e1 + Owner: USSR + Location: 72,98 + SubCell: 3 + Facing: 293 + Actor1087: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 60,93 + Actor1088: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 57,91 + Actor1089: e1 + Owner: USSR + Facing: 384 + Location: 59,89 + SubCell: 3 + Actor1090: e1 + Owner: USSR + Location: 19,60 + SubCell: 3 + Facing: 610 + Actor1091: e1 + Owner: USSR + SubCell: 3 + Location: 21,62 + Facing: 570 + Actor1092: e1 + Owner: USSR + SubCell: 3 + Location: 29,65 + Facing: 507 + Actor1093: e1 + Owner: USSR + Location: 27,67 + SubCell: 3 + Facing: 384 + Actor1094: e1 + Owner: USSR + SubCell: 3 + Location: 30,69 + Facing: 618 + Actor1095: e1 + Owner: USSR + Location: 11,58 + SubCell: 3 + Facing: 666 + Actor1096: e1 + Owner: USSR + Location: 7,59 + SubCell: 3 + Facing: 682 + Actor1097: e1 + Owner: USSR + Location: 4,54 + SubCell: 3 + Facing: 602 + Actor1098: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 32,51 + Actor1099: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 37,25 + Actor1100: e1 + Owner: USSR + SubCell: 3 + Location: 68,41 + Facing: 0 + Actor1101: e1 + Owner: USSR + SubCell: 3 + Location: 66,39 + Facing: 0 + Actor1102: e1 + Owner: USSR + Location: 69,39 + SubCell: 3 + Facing: 126 + Actor1103: e1 + Owner: USSR + SubCell: 3 + Location: 74,41 + Facing: 919 + Actor1104: e1 + Owner: USSR + SubCell: 3 + Location: 84,38 + Facing: 384 + Actor1105: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 83,37 + Actor1106: e1 + Owner: USSR + SubCell: 3 + Location: 84,33 + Facing: 198 + Actor1107: e1 + Owner: USSR + Location: 84,33 + SubCell: 1 + Facing: 301 + Actor1108: e1 + Owner: USSR + SubCell: 3 + Location: 83,32 + Facing: 150 + Actor1109: e1 + Owner: USSR + SubCell: 3 + Location: 92,45 + Facing: 570 + Actor1111: e1 + Owner: USSR + Location: 93,45 + SubCell: 1 + Facing: 515 + Actor1112: e1 + Owner: USSR + SubCell: 3 + Location: 95,46 + Facing: 539 + Actor1113: e1 + Owner: USSR + Facing: 384 + Location: 98,49 + SubCell: 3 + Actor1114: e1 + Owner: USSR + SubCell: 3 + Location: 93,48 + Facing: 594 + Actor1110: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 94,38 + Actor1115: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 91,36 + Actor1116: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 98,33 + Actor1117: e1 + Owner: USSR + SubCell: 3 + Location: 100,34 + Facing: 602 + Actor1118: e1 + Owner: USSR + SubCell: 3 + Location: 93,31 + Facing: 832 + Actor1119: e1 + Owner: USSR + SubCell: 3 + Location: 96,30 + Facing: 0 + Actor1121: e1 + Owner: USSR + Location: 65,18 + SubCell: 3 + Facing: 618 + Actor1122: e1 + Owner: USSR + SubCell: 3 + Location: 64,20 + Facing: 697 + Actor1124: e1 + Owner: USSR + Facing: 384 + Location: 63,21 + SubCell: 1 + Actor1125: e1 + Owner: USSR + SubCell: 3 + Location: 58,20 + Facing: 642 + Actor1126: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 56,20 + Actor1127: e1 + Owner: USSR + SubCell: 3 + Location: 57,18 + Facing: 547 + Actor1120: shok + Owner: USSR + Facing: 384 + Location: 64,20 + SubCell: 1 + Actor1123: shok + Owner: USSR + SubCell: 3 + Location: 45,24 + Facing: 309 + Actor1128: shok + Owner: USSR + Facing: 384 + Location: 34,20 + SubCell: 3 + Actor1129: shok + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 20,20 + Actor1130: shok + Owner: USSR + SubCell: 3 + Location: 6,53 + Facing: 563 + Actor1131: shok + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 72,93 + Actor1134: e1 + Owner: USSR + SubCell: 3 + Location: 82,97 + Facing: 182 + Actor1135: e1 + Owner: USSR + SubCell: 3 + Location: 83,94 + Facing: 158 + Actor1136: e1 + Owner: USSR + SubCell: 3 + Location: 80,104 + Facing: 214 + Actor1137: e1 + Owner: USSR + Location: 82,107 + SubCell: 3 + Facing: 214 + Actor1138: e1 + Owner: USSR + SubCell: 3 + Location: 79,106 + Facing: 206 + Actor1139: e1 + Owner: USSR + SubCell: 3 + Location: 80,100 + Facing: 245 + Actor1140: e1 + Owner: USSR + SubCell: 3 + Location: 88,106 + Facing: 384 + Actor1141: e1 + Owner: USSR + Location: 88,106 + SubCell: 1 + Facing: 214 + Actor1142: e1 + Owner: USSR + Location: 89,106 + SubCell: 3 + Facing: 697 + Actor1143: e1 + Owner: USSR + SubCell: 3 + Location: 98,104 + Facing: 602 + Actor1144: e1 + Owner: USSR + SubCell: 3 + Location: 99,102 + Facing: 594 + Actor1145: e1 + Owner: USSR + Facing: 384 + Location: 97,105 + SubCell: 3 + Actor1146: e1 + Owner: USSR + SubCell: 3 + Location: 99,105 + Facing: 467 + Actor1147: e1 + Owner: USSR + SubCell: 3 + Location: 102,100 + Facing: 697 + Actor1148: e1 + Owner: USSR + SubCell: 3 + Location: 103,104 + Facing: 642 + Actor1149: e1 + Owner: USSR + SubCell: 3 + Location: 103,98 + Facing: 777 + Actor1150: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 88,85 + Actor1151: e1 + Owner: USSR + SubCell: 3 + Location: 98,88 + Facing: 872 + Actor1152: e1 + Owner: USSR + SubCell: 3 + Location: 97,87 + Facing: 570 + Actor1153: e1 + Owner: USSR + SubCell: 3 + Location: 103,76 + Facing: 674 + Actor1154: e1 + Owner: USSR + SubCell: 3 + Location: 104,75 + Facing: 63 + Actor1155: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 101,74 + Actor1156: e4 + Owner: USSR + Facing: 384 + Location: 62,91 + SubCell: 3 + Actor1157: e4 + Owner: USSR + Facing: 384 + Location: 54,75 + SubCell: 3 + Actor1158: e4 + Owner: USSR + Facing: 384 + SubCell: 1 + Location: 46,68 + Actor1159: e4 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 36,76 + Actor1160: e4 + Owner: USSR + SubCell: 3 + Location: 58,101 + Facing: 269 + Actor1161: e4 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 46,88 + Actor1162: e4 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 16,78 + Actor1163: dog + Owner: USSR + SubCell: 3 + Location: 31,58 + Facing: 650 + Actor1164: dog + Owner: USSR + SubCell: 3 + Location: 8,58 + Facing: 666 + Actor1165: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 21,19 + Actor1166: e3 + Owner: USSR + SubCell: 3 + Location: 25,14 + Facing: 674 + Actor1167: e3 + Owner: USSR + SubCell: 3 + Location: 40,15 + Facing: 384 + Actor1168: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 72,14 + Actor1169: e3 + Owner: USSR + Facing: 384 + Location: 68,13 + SubCell: 3 + Actor1170: e3 + Owner: USSR + SubCell: 3 + Location: 69,8 + Facing: 594 + Actor1171: e3 + Owner: USSR + Facing: 384 + Location: 74,6 + SubCell: 3 + Actor1172: e3 + Owner: USSR + SubCell: 3 + Location: 59,7 + Facing: 737 + Actor1173: e3 + Owner: USSR + SubCell: 3 + Location: 54,3 + Facing: 539 + Actor1174: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 90,29 + Actor1175: e3 + Owner: USSR + Facing: 384 + Location: 100,34 + SubCell: 1 + Actor1176: e3 + Owner: USSR + SubCell: 3 + Location: 104,35 + Facing: 721 + Actor1177: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 100,41 + Actor1178: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 91,42 + Actor1179: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 91,44 + Actor1180: e3 + Owner: USSR + SubCell: 3 + Location: 85,40 + Facing: 384 + Actor1181: e3 + Owner: USSR + SubCell: 3 + Location: 94,61 + Facing: 507 + Actor1182: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 91,62 + Actor1183: e3 + Owner: USSR + SubCell: 3 + Location: 105,76 + Facing: 586 + Actor1184: e3 + Owner: USSR + Facing: 384 + Location: 97,87 + SubCell: 1 + Actor1185: e3 + Owner: USSR + Facing: 384 + SubCell: 1 + Location: 98,104 + Actor1186: e3 + Owner: USSR + Location: 89,106 + SubCell: 1 + Facing: 499 + Actor1187: e3 + Owner: USSR + Location: 82,97 + SubCell: 1 + Facing: 253 + Actor1188: e3 + Owner: USSR + Location: 70,100 + SubCell: 3 + Facing: 384 + Actor1189: e3 + Owner: USSR + Location: 59,98 + SubCell: 3 + Facing: 237 + Actor1190: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 49,87 + Actor1191: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 29,74 + Actor1192: e3 + Owner: USSR + Location: 64,107 + SubCell: 1 + Facing: 222 + Actor1193: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 58,73 + Actor1194: e3 + Owner: USSR + SubCell: 3 + Location: 57,51 + Facing: 650 + Actor1195: e3 + Owner: USSR + Facing: 384 + Location: 57,50 + SubCell: 3 + Actor1196: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 62,60 + Actor1198: e3 + Owner: USSR + SubCell: 3 + Location: 74,61 + Facing: 384 + Actor1199: e3 + Owner: USSR + SubCell: 3 + Location: 67,61 + Facing: 705 + Actor1197: e2 + Owner: USSR + Location: 32,60 + SubCell: 3 + Facing: 674 + Actor1200: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 32,41 + Actor1202: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 24,41 + Actor1201: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 28,41 + Actor1203: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 31,44 + Actor1204: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 34,45 + Actor1205: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 22,42 + Actor1206: e3 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 36,42 + Actor1207: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 102,63 + Actor1208: e1r1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 92,65 + Actor1209: e1r1 + Owner: USSR + SubCell: 3 + Location: 95,65 + Facing: 483 + Actor1210: e1r1 + Owner: USSR + SubCell: 3 + Location: 99,64 + Facing: 563 + Actor1211: e1r1 + Owner: USSR + SubCell: 3 + Location: 96,64 + Facing: 586 + Actor1212: e1r1 + Owner: USSR + SubCell: 3 + Location: 101,65 + Facing: 594 + Actor1213: e1r1 + Owner: USSR + Facing: 384 + SubCell: 1 + Location: 59,52 + Actor1214: e1r1 + Owner: USSR + Location: 64,54 + SubCell: 3 + Facing: 0 + Actor1215: e1r1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 69,58 + Actor1216: e1r1 + Owner: USSR + SubCell: 3 + Location: 65,58 + Facing: 705 + Actor1217: e1r1 + Owner: USSR + Location: 69,58 + SubCell: 1 + Facing: 0 + Actor1218: e1r1 + Owner: USSR + Location: 75,41 + SubCell: 3 + Facing: 785 + Actor1219: e4 + Owner: USSR + Location: 68,40 + SubCell: 3 + Facing: 0 + Actor1220: e2 + Owner: USSR + SubCell: 1 + Location: 75,41 + Facing: 856 + Actor1222: e2 + Owner: USSR + Facing: 384 + Location: 94,32 + SubCell: 3 + Actor1223: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 93,13 + Actor1224: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 98,14 + Actor1225: e2 + Owner: USSR + Facing: 384 + Location: 98,14 + SubCell: 1 + Actor1226: e2 + Owner: USSR + SubCell: 3 + Location: 67,22 + Facing: 618 + Actor1227: e2 + Owner: USSR + Location: 67,10 + SubCell: 3 + Facing: 594 + Actor1228: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 57,8 + Actor1229: e2 + Owner: USSR + SubCell: 3 + Location: 53,5 + Facing: 602 + Actor1230: e2 + Owner: USSR + SubCell: 3 + Location: 27,15 + Facing: 555 + Actor1231: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 34,19 + Actor1232: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 31,20 + Actor1233: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 32,19 + Actor1234: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 24,21 + Actor1235: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 23,19 + Actor1236: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 21,23 + Actor1237: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 35,22 + Actor1238: split2 + Owner: Neutral + Location: 27,35 + Actor1239: split2 + Owner: Neutral + Location: 23,30 + Actor1240: split2 + Owner: Neutral + Location: 107,95 + Actor1241: split2 + Owner: Neutral + Location: 109,101 + Actor1242: split2 + Owner: Neutral + Location: 102,90 + Actor1243: split2 + Owner: Neutral + Location: 36,57 + Actor1244: 3tnk + Owner: USSR + Location: 67,8 + Facing: 384 + Actor1245: 3tnk + Owner: USSR + Facing: 384 + Location: 54,30 + Actor1248: e1 + Owner: USSR + SubCell: 3 + Facing: 697 + Location: 56,30 + Actor1250: e1 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 53,29 + Actor1251: e1 + Owner: USSR + SubCell: 1 + Facing: 214 + Location: 53,29 + Actor1249: e3 + Owner: USSR + SubCell: 1 + Facing: 499 + Location: 56,30 + Actor1246: e8 + Owner: USSR + Location: 86,101 + SubCell: 3 + Facing: 384 + Actor1247: e8 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 92,106 + Actor1252: e8 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 99,100 + Actor1253: ttur + Owner: USSR + Location: 83,104 + Actor1254: ttur + Owner: USSR + Location: 83,98 + Actor1255: ttur + Owner: USSR + Location: 102,98 + Actor1256: ttur + Owner: USSR + Location: 102,104 + Actor1258: brik + Owner: USSR + Location: 94,44 + Actor1259: brik + Owner: USSR + Location: 93,44 + Actor1260: brik + Owner: USSR + Location: 100,44 + Actor1261: brik + Owner: USSR + Location: 101,44 + Actor1262: brik + Owner: USSR + Location: 85,38 + Actor1263: brik + Owner: USSR + Location: 85,39 + Actor1264: brik + Owner: USSR + Location: 85,32 + Actor1221: brik + Owner: USSR + Location: 85,31 + Actor1265: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 84,30 + Actor1266: brik + Owner: USSR + Location: 93,26 + Actor1267: brik + Owner: USSR + Location: 94,26 + Actor1268: brik + Owner: USSR + Location: 100,26 + Actor1269: brik + Owner: USSR + Location: 101,26 + Actor1270: brik + Owner: USSR + Location: 66,18 + Actor1271: brik + Owner: USSR + Location: 67,18 + Actor1272: brik + Owner: USSR + Location: 69,18 + Actor1273: brik + Owner: USSR + Location: 70,18 + Actor1274: brik + Owner: USSR + Location: 73,18 + Actor1275: brik + Owner: USSR + Location: 72,18 + Actor1276: brik + Owner: USSR + Location: 75,18 + Actor1277: brik + Owner: USSR + Location: 76,18 + Actor1278: brik + Owner: USSR + Location: 76,17 + Actor1279: brik + Owner: USSR + Location: 76,16 + Actor1280: brik + Owner: USSR + Location: 25,18 + Actor1281: brik + Owner: USSR + Location: 24,18 + Actor1282: brik + Owner: USSR + Location: 31,18 + Actor1283: brik + Owner: USSR + Location: 32,18 + Actor1284: ss + Owner: USSR + Location: 102,9 + Facing: 198 + Actor1285: iron + Owner: USSR + Location: 106,30 + EastAttack1: waypoint + Owner: Neutral + Location: 97,47 + EastAttack2: waypoint + Owner: Neutral + Location: 97,69 + EastAttack4: waypoint + Owner: Neutral + Location: 81,101 + EastAttack3: waypoint + Owner: Neutral + Location: 104,100 + EastAttack5: waypoint + Owner: Neutral + Location: 66,101 + WestAttack1: waypoint + Owner: Neutral + Location: 61,27 + WestAttack2: waypoint + Owner: Neutral + Location: 33,28 + WestAttack3: waypoint + Owner: Neutral + Location: 26,56 + WestAttack4: waypoint + Owner: Neutral + Location: 35,69 + MainAirfield: afld + Owner: USSR + Location: 94,33 + Actor1287: fix + Owner: USSR + Location: 94,35 + Actor1288: camera + Owner: USSR + Location: 28,86 + Actor1289: camera + Owner: USSR + Location: 42,92 + Actor1290: camera + Owner: USSR + Location: 53,101 + Actor1291: camera + Owner: USSR + Location: 14,83 + Actor1292: camera + Owner: USSR + Location: 43,69 + Actor1293: camera + Owner: USSR + Location: 66,89 + Actor1294: camera + Owner: USSR + Location: 92,97 + Actor1295: camera + Owner: USSR + Location: 29,46 + Actor1296: camera + Owner: USSR + Location: 17,52 + Actor1297: camera + Owner: USSR + Location: 30,61 + Actor1298: ttur + Owner: USSR + Location: 75,99 + Actor1299: btr.ai + Owner: USSR + Facing: 384 + Location: 99,106 + Actor1300: btr + Owner: USSR + Location: 85,107 + Facing: 256 + Actor1301: btr + Owner: USSR + Location: 85,95 + Facing: 256 + Actor1302: btr + Owner: USSR + Facing: 384 + Location: 90,90 + Actor1303: btr + Owner: USSR + Facing: 384 + Location: 63,58 + Actor1286: apoc + Owner: USSR + Facing: 384 + Location: 98,36 + TankYardReveal: waypoint + Owner: Neutral + Location: 28,19 + Actor1304: brik + Owner: USSR + Location: 4,30 + Actor1305: brik + Owner: USSR + Location: 5,30 + Actor1306: brik + Owner: USSR + Location: 6,30 + Actor1307: brik + Owner: USSR + Location: 7,30 + Actor1308: brik + Owner: USSR + Location: 8,30 + Actor1309: brik + Owner: USSR + Location: 9,30 + Actor1310: brik + Owner: USSR + Location: 10,30 + Actor1311: brik + Owner: USSR + Location: 11,30 + Actor1312: brik + Owner: USSR + Location: 12,30 + Actor1313: brik + Owner: USSR + Location: 13,30 + Actor1314: brik + Owner: USSR + Location: 14,30 + Actor1315: brik + Owner: USSR + Location: 4,31 + Actor1316: chain + Owner: USSR + Location: 5,31 + Actor1317: chain + Owner: USSR + Location: 6,31 + Actor1318: chain + Owner: USSR + Location: 7,31 + Actor1319: chain + Owner: USSR + Location: 8,31 + Actor1320: chain + Owner: USSR + Location: 9,31 + Actor1321: chain + Owner: USSR + Location: 10,31 + Actor1322: chain + Owner: USSR + Location: 11,31 + Actor1323: chain + Owner: USSR + Location: 12,31 + Actor1324: chain + Owner: USSR + Location: 13,31 + Actor1325: brik + Owner: USSR + Location: 14,31 + Actor1326: brik + Owner: USSR + Location: 4,32 + Actor1327: chain + Owner: USSR + Location: 5,32 + TeslaPower1: tpwr + Owner: USSR + Location: 6,32 + TeslaPower2: tpwr + Owner: USSR + Location: 10,32 + Actor1330: chain + Owner: USSR + Location: 13,32 + Actor1331: brik + Owner: USSR + Location: 14,32 + Actor1332: brik + Owner: USSR + Location: 4,33 + Actor1333: chain + Owner: USSR + Location: 5,33 + Actor1334: chain + Owner: USSR + Location: 13,33 + Actor1335: brik + Owner: USSR + Location: 14,33 + Actor1336: brik + Owner: USSR + Location: 4,34 + Actor1337: chain + Owner: USSR + Location: 5,34 + Actor1338: chain + Owner: USSR + Location: 13,34 + Actor1339: brik + Owner: USSR + Location: 14,34 + Actor1340: brik + Owner: USSR + Location: 4,35 + Actor1341: chain + Owner: USSR + Location: 5,35 + TeslaPower3: tpwr + Owner: USSR + Location: 6,35 + TeslaPower4: tpwr + Owner: USSR + Location: 10,35 + Actor1344: chain + Owner: USSR + Location: 13,35 + Actor1345: brik + Owner: USSR + Location: 14,35 + Actor1346: brik + Owner: USSR + Location: 4,36 + Actor1347: chain + Owner: USSR + Location: 5,36 + Actor1348: chain + Owner: USSR + Location: 13,36 + Actor1349: brik + Owner: USSR + Location: 14,36 + Actor1350: brik + Owner: USSR + Location: 4,37 + Actor1351: chain + Owner: USSR + Location: 5,37 + Actor1352: chain + Owner: USSR + Location: 13,37 + Actor1353: brik + Owner: USSR + Location: 14,37 + Actor1354: brik + Owner: USSR + Location: 4,38 + Actor1355: chain + Owner: USSR + Location: 5,38 + TeslaPower5: tpwr + Owner: USSR + Location: 6,38 + TeslaPower6: tpwr + Owner: USSR + Location: 10,38 + Actor1358: chain + Owner: USSR + Location: 13,38 + Actor1359: brik + Owner: USSR + Location: 14,38 + Actor1360: brik + Owner: USSR + Location: 4,39 + Actor1361: chain + Owner: USSR + Location: 5,39 + Actor1362: chain + Owner: USSR + Location: 13,39 + Actor1363: brik + Owner: USSR + Location: 14,39 + Actor1364: brik + Owner: USSR + Location: 4,40 + Actor1365: chain + Owner: USSR + Location: 5,40 + Actor1366: chain + Owner: USSR + Location: 13,40 + Actor1367: brik + Owner: USSR + Location: 14,40 + Actor1368: brik + Owner: USSR + Location: 4,41 + Actor1369: chain + Owner: USSR + Location: 5,41 + Actor1370: chain + Owner: USSR + Location: 6,41 + Actor1371: chain + Owner: USSR + Location: 7,41 + Actor1372: chain + Owner: USSR + Location: 11,41 + Actor1373: chain + Owner: USSR + Location: 12,41 + Actor1374: chain + Owner: USSR + Location: 13,41 + Actor1375: brik + Owner: USSR + Location: 14,41 + Actor1376: brik + Owner: USSR + Location: 4,42 + Actor1377: brik + Owner: USSR + Location: 5,42 + Actor1378: brik + Owner: USSR + Location: 6,42 + Actor1379: brik + Owner: USSR + Location: 7,42 + TeslaCoil1: tsla + Owner: USSR + Location: 9,42 + Actor1381: brik + Owner: USSR + Location: 11,42 + Actor1382: brik + Owner: USSR + Location: 12,42 + Actor1383: brik + Owner: USSR + Location: 13,42 + Actor1384: brik + Owner: USSR + Location: 14,42 + Actor1385: brik + Owner: USSR + Location: 6,43 + Actor1386: brik + Owner: USSR + Location: 7,43 + Actor1387: brik + Owner: USSR + Location: 11,43 + Actor1388: brik + Owner: USSR + Location: 12,43 + Actor1389: shok + Owner: USSR + SubCell: 3 + Facing: 563 + Location: 14,43 + Actor1390: ftur + Owner: USSR + Location: 7,44 + Actor1391: ftur + Owner: USSR + Location: 11,44 + Actor1392: e1 + Owner: USSR + SubCell: 3 + Facing: 610 + Location: 13,44 + Actor1257: tc04 + Owner: Neutral + Location: 9,48 + Actor1393: tc01 + Owner: Neutral + Location: 2,38 + Actor1394: t13 + Owner: Neutral + Location: 3,43 + Actor1395: t15 + Owner: Neutral + Location: 10,51 + Actor1396: t11 + Owner: Neutral + Location: 12,46 + Actor1397: t12 + Owner: Neutral + Location: 3,50 + SWBarracks: barr + Owner: USSR + Location: 54,71 + SBarracks1: barr + Owner: USSR + Location: 88,102 + SBarracks2: barr + Owner: USSR + Location: 96,102 + Actor1329: brik + Owner: USSR + Location: 76,6 + Actor1342: brik + Owner: USSR + Location: 78,6 + Actor1343: brik + Owner: USSR + Location: 77,6 + Actor1356: brik + Owner: USSR + Location: 79,6 + Actor1357: brik + Owner: USSR + Location: 80,6 + Actor1380: brik + Owner: USSR + Location: 80,5 + Actor1398: brik + Owner: USSR + Location: 80,4 + Actor1399: brik + Owner: USSR + Location: 80,3 + Actor1400: brik + Owner: USSR + Location: 80,2 + Actor1401: brik + Owner: USSR + Location: 80,1 + Actor1402: brik + Owner: USSR + Location: 79,1 + Actor1403: brik + Owner: USSR + Location: 78,1 + Actor1404: brik + Owner: USSR + Location: 77,1 + Actor1405: brik + Owner: USSR + Location: 76,1 + MissileSilo: mslo + Owner: USSR + Location: 77,3 + ScriptTags: BrutalOnly + Actor1328: silo + Owner: USSR + Location: 78,5 + Actor1407: silo + Owner: USSR + Location: 79,5 + Actor1408: fenc + Owner: USSR + Location: 77,2 + Actor1409: fenc + Owner: USSR + Location: 76,2 + Actor1410: fenc + Owner: USSR + Location: 78,2 + Actor1411: fenc + Owner: USSR + Location: 79,2 + Actor1412: fenc + Owner: USSR + Location: 79,3 + Actor1413: fenc + Owner: USSR + Location: 79,4 + Actor1414: fenc + Owner: USSR + Location: 75,2 + Actor1415: sam + Owner: USSR + Location: 76,5 + Actor1416: 3tnk + Owner: USSR + Facing: 384 + Location: 76,3 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-allegiances.yaml, decimation-rules.yaml, fall.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/main-campaign/ca22-decimation/s_neutralizepower.aud b/mods/ca/missions/main-campaign/ca22-decimation/s_neutralizepower.aud new file mode 100644 index 0000000000..59f1b63636 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca22-decimation/s_neutralizepower.aud differ diff --git a/mods/ca/missions/main-campaign/ca22-decimation/s_reaperaccess.aud b/mods/ca/missions/main-campaign/ca22-decimation/s_reaperaccess.aud new file mode 100644 index 0000000000..913309b8c3 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca22-decimation/s_reaperaccess.aud differ diff --git a/mods/ca/missions/main-campaign/ca22-decimation/s_scrinfleet.aud b/mods/ca/missions/main-campaign/ca22-decimation/s_scrinfleet.aud new file mode 100644 index 0000000000..ab50d37d87 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca22-decimation/s_scrinfleet.aud differ diff --git a/mods/ca/missions/main-campaign/ca22-decimation/s_sovietholdingarea.aud b/mods/ca/missions/main-campaign/ca22-decimation/s_sovietholdingarea.aud new file mode 100644 index 0000000000..90f2552e21 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca22-decimation/s_sovietholdingarea.aud differ diff --git a/mods/ca/missions/main-campaign/ca22-decimation/s_sovietpoweroffline.aud b/mods/ca/missions/main-campaign/ca22-decimation/s_sovietpoweroffline.aud new file mode 100644 index 0000000000..ce1a19b6f6 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca22-decimation/s_sovietpoweroffline.aud differ diff --git a/mods/ca/missions/main-campaign/ca23-subjugation/brown.pal b/mods/ca/missions/main-campaign/ca23-subjugation/brown.pal new file mode 100644 index 0000000000..706111e8f8 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca23-subjugation/brown.pal differ diff --git a/mods/ca/missions/main-campaign/ca23-subjugation/map.bin b/mods/ca/missions/main-campaign/ca23-subjugation/map.bin new file mode 100644 index 0000000000..643d616d9b Binary files /dev/null and b/mods/ca/missions/main-campaign/ca23-subjugation/map.bin differ diff --git a/mods/ca/missions/main-campaign/ca23-subjugation/map.png b/mods/ca/missions/main-campaign/ca23-subjugation/map.png new file mode 100644 index 0000000000..aeaa4fb59b Binary files /dev/null and b/mods/ca/missions/main-campaign/ca23-subjugation/map.png differ diff --git a/mods/ca/missions/main-campaign/ca23-subjugation/map.yaml b/mods/ca/missions/main-campaign/ca23-subjugation/map.yaml new file mode 100644 index 0000000000..28ffd560f8 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca23-subjugation/map.yaml @@ -0,0 +1,3619 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 23: Subjugation + +Author: Darkademic + +Tileset: TEMPERAT + +MapSize: 98,98 + +Bounds: 1,1,96,96 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: Scrin, USSR + PlayerReference@Scrin: + Name: Scrin + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: scrin + LockColor: True + Color: 7700FF + LockSpawn: True + LockTeam: True + Enemies: USSR, Creeps + PlayerReference@USSR: + Name: USSR + Bot: campaign + Faction: soviet + Color: FE1100 + Enemies: Scrin, Creeps + +Actors: + Mastermind: mast + Owner: Scrin + SubCell: 3 + Location: 92,5 + Facing: 384 + Actor1: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 87,5 + Actor2: gunw + Owner: Scrin + Facing: 384 + Location: 86,6 + Actor3: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 87,6 + Actor5: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 89,7 + Actor6: gunw + Owner: Scrin + Facing: 384 + Location: 88,8 + Actor7: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 91,8 + Actor9: gunw + Owner: Scrin + Facing: 384 + Location: 91,9 + Actor10: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 92,9 + Actor11: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 93,9 + Actor207: fenc + Owner: USSR + Location: 69,2 + Actor208: fenc + Owner: USSR + Location: 69,3 + Actor209: fenc + Owner: USSR + Location: 69,4 + Actor210: fenc + Owner: USSR + Location: 69,5 + Actor211: ftur + Owner: USSR + Location: 70,5 + Actor212: ftur + Owner: USSR + Location: 70,9 + Actor213: fenc + Owner: USSR + Location: 69,9 + Actor214: fenc + Owner: USSR + Location: 69,10 + Actor215: fenc + Owner: USSR + Location: 69,11 + Actor216: fenc + Owner: USSR + Location: 68,11 + Actor217: fenc + Owner: USSR + Location: 66,11 + Actor218: fenc + Owner: USSR + Location: 67,11 + Actor222: sbag + Owner: USSR + Location: 68,1 + Actor223: sbag + Owner: USSR + Location: 67,1 + Actor224: sbag + Owner: USSR + Location: 66,1 + Actor225: sbag + Owner: USSR + Location: 65,1 + Actor226: sbag + Owner: USSR + Location: 64,1 + Actor227: sbag + Owner: USSR + Location: 63,1 + Actor228: sbag + Owner: USSR + Location: 62,1 + Actor229: sbag + Owner: USSR + Location: 61,1 + Actor230: sbag + Owner: USSR + Location: 60,1 + Actor231: sbag + Owner: USSR + Location: 59,1 + Actor232: sbag + Owner: USSR + Location: 58,1 + Actor233: sbag + Owner: USSR + Location: 57,1 + Actor234: sbag + Owner: USSR + Location: 57,2 + Actor235: sbag + Owner: USSR + Location: 57,3 + Actor236: sbag + Owner: USSR + Location: 57,4 + Actor237: sbag + Owner: USSR + Location: 68,4 + Actor238: sbag + Owner: USSR + Location: 68,3 + Actor239: sbag + Owner: USSR + Location: 68,2 + Actor240: sbag + Owner: USSR + Location: 68,9 + Actor241: sbag + Owner: USSR + Location: 68,10 + Actor242: sbag + Owner: USSR + Location: 68,5 + Actor243: sbag + Owner: USSR + Location: 67,10 + Actor244: sbag + Owner: USSR + Location: 66,10 + Actor245: sbag + Owner: USSR + Location: 65,10 + Actor246: sbag + Owner: USSR + Location: 64,10 + Actor249: sbag + Owner: USSR + Location: 57,9 + Actor250: sbag + Owner: USSR + Location: 57,10 + Actor251: sbag + Owner: USSR + Location: 58,10 + Actor252: sbag + Owner: USSR + Location: 59,10 + Actor253: sbag + Owner: USSR + Location: 60,10 + Actor247: sbag + Owner: USSR + Location: 57,5 + Actor248: powr + Owner: USSR + Location: 58,2 + Actor254: powr + Owner: USSR + Location: 60,2 + Actor255: fenc + Owner: USSR + Location: 69,1 + Actor256: fenc + Owner: USSR + Location: 70,4 + Actor257: fenc + Owner: USSR + Location: 70,10 + Actor63: brik + Owner: USSR + Location: 39,41 + Actor64: brik + Owner: USSR + Location: 40,41 + Actor65: brik + Owner: USSR + Location: 41,41 + Actor66: brik + Owner: USSR + Location: 42,41 + Actor67: brik + Owner: USSR + Location: 43,41 + Actor68: brik + Owner: USSR + Location: 44,41 + Actor69: brik + Owner: USSR + Location: 45,41 + Actor70: brik + Owner: USSR + Location: 46,41 + Actor71: brik + Owner: USSR + Location: 47,41 + Actor72: brik + Owner: USSR + Location: 51,41 + Actor73: brik + Owner: USSR + Location: 52,41 + Actor74: brik + Owner: USSR + Location: 53,41 + Actor75: brik + Owner: USSR + Location: 54,41 + Actor76: brik + Owner: USSR + Location: 55,41 + Actor77: brik + Owner: USSR + Location: 56,41 + Actor78: brik + Owner: USSR + Location: 57,41 + Actor79: brik + Owner: USSR + Location: 58,41 + Actor80: brik + Owner: USSR + Location: 59,41 + Actor81: brik + Owner: USSR + Location: 39,42 + Actor83: n3c + Owner: USSR + SubCell: 3 + Facing: 0 + Location: 44,42 + CPowered2: tsla + Owner: USSR + Location: 45,42 + Actor85: brik + Owner: USSR + Location: 46,42 + Actor86: brik + Owner: USSR + Location: 47,42 + Actor87: rmbc + Owner: USSR + SubCell: 3 + Facing: 0 + Location: 48,42 + Actor88: rmbc + Owner: USSR + SubCell: 3 + Facing: 0 + Location: 50,42 + Actor89: brik + Owner: USSR + Location: 51,42 + Actor90: brik + Owner: USSR + Location: 52,42 + CPowered3: tsla + Owner: USSR + Location: 53,42 + Actor92: n3c + Owner: USSR + SubCell: 3 + Facing: 0 + Location: 54,42 + Actor94: brik + Owner: USSR + Location: 59,42 + Actor95: brik + Owner: USSR + Location: 39,43 + Actor96: brik + Owner: USSR + Location: 59,43 + Actor97: brik + Owner: USSR + Location: 39,44 + Actor98: brut + Owner: USSR + SubCell: 3 + Facing: 0 + Location: 48,44 + Actor99: brut + Owner: USSR + SubCell: 3 + Facing: 0 + Location: 50,44 + Actor100: brik + Owner: USSR + Location: 59,44 + Actor101: brik + Owner: USSR + Location: 39,45 + Actor102: brik + Owner: USSR + Location: 59,45 + Actor103: brik + Owner: USSR + Location: 39,46 + Actor104: n3c + Owner: USSR + SubCell: 3 + Facing: 256 + Location: 40,46 + CPowered11: sam + Owner: USSR + Location: 46,46 + Actor106: ftur + Owner: USSR + Location: 48,46 + Actor107: ftur + Owner: USSR + Location: 50,46 + CPowered12: sam + Owner: USSR + Location: 51,46 + Actor109: n3c + Owner: USSR + SubCell: 3 + Facing: 768 + Location: 58,46 + Actor110: brik + Owner: USSR + Location: 59,46 + Actor111: brik + Owner: USSR + Location: 39,47 + CPowered1: tsla + Owner: USSR + Location: 40,47 + Actor113: brik + Owner: USSR + Location: 45,47 + Actor114: brik + Owner: USSR + Location: 46,47 + Actor115: brik + Owner: USSR + Location: 47,47 + Actor116: brik + Owner: USSR + Location: 48,47 + Actor117: brik + Owner: USSR + Location: 50,47 + Actor118: brik + Owner: USSR + Location: 51,47 + Actor119: brik + Owner: USSR + Location: 52,47 + Actor120: brik + Owner: USSR + Location: 53,47 + CPowered4: tsla + Owner: USSR + Location: 58,47 + Actor122: brik + Owner: USSR + Location: 59,47 + Actor123: brik + Owner: USSR + Location: 39,48 + Actor124: brik + Owner: USSR + Location: 40,48 + Actor125: enli + Owner: USSR + SubCell: 3 + Facing: 256 + Location: 44,48 + Actor126: brik + Owner: USSR + Location: 45,48 + Actor128: brik + Owner: USSR + Location: 47,48 + Actor129: brik + Owner: USSR + Location: 48,48 + Actor130: brik + Owner: USSR + Location: 50,48 + Actor131: brik + Owner: USSR + Location: 51,48 + Actor133: brik + Owner: USSR + Location: 53,48 + Actor134: enli + Owner: USSR + SubCell: 3 + Facing: 768 + Location: 54,48 + Actor135: brik + Owner: USSR + Location: 58,48 + Actor136: brik + Owner: USSR + Location: 59,48 + Actor137: brik + Owner: USSR + Location: 39,49 + Actor138: brik + Owner: USSR + Location: 40,49 + Actor139: tplr + Owner: USSR + SubCell: 3 + Facing: 256 + Location: 44,49 + Actor140: brik + Owner: USSR + Location: 45,49 + Actor141: brik + Owner: USSR + Location: 46,49 + Actor142: brik + Owner: USSR + Location: 47,49 + Actor143: brik + Owner: USSR + Location: 51,49 + Actor144: brik + Owner: USSR + Location: 52,49 + Actor145: brik + Owner: USSR + Location: 53,49 + Actor146: tplr + Owner: USSR + SubCell: 3 + Facing: 768 + Location: 54,49 + Actor147: brik + Owner: USSR + Location: 58,49 + Actor148: brik + Owner: USSR + Location: 59,49 + Actor149: rmbc + Owner: USSR + SubCell: 3 + Facing: 256 + Location: 39,50 + Actor150: brut + Owner: USSR + SubCell: 3 + Facing: 256 + Location: 42,50 + Actor151: ftur + Owner: USSR + Location: 44,50 + Actor152: brik + Owner: USSR + Location: 45,50 + Actor153: brik + Owner: USSR + Location: 46,50 + YuriHQ: miss + Owner: USSR + Location: 48,50 + Actor155: brik + Owner: USSR + Location: 52,50 + Actor156: brik + Owner: USSR + Location: 53,50 + Actor157: ftur + Owner: USSR + Location: 54,50 + Actor158: brut + Owner: USSR + SubCell: 3 + Facing: 768 + Location: 56,50 + Actor159: rmbc + Owner: USSR + SubCell: 3 + Facing: 768 + Location: 59,50 + Actor160: rmbc + Owner: USSR + SubCell: 3 + Facing: 256 + Location: 39,52 + Actor161: brut + Owner: USSR + SubCell: 3 + Facing: 256 + Location: 42,52 + Actor162: ftur + Owner: USSR + Location: 44,52 + Actor163: brik + Owner: USSR + Location: 45,52 + Actor164: brik + Owner: USSR + Location: 46,52 + Actor165: brik + Owner: USSR + Location: 52,52 + Actor166: brik + Owner: USSR + Location: 53,52 + Actor167: ftur + Owner: USSR + Location: 54,52 + Actor168: brut + Owner: USSR + SubCell: 3 + Facing: 768 + Location: 56,52 + Actor169: rmbc + Owner: USSR + SubCell: 3 + Facing: 768 + Location: 59,52 + Actor170: brik + Owner: USSR + Location: 39,53 + Actor171: brik + Owner: USSR + Location: 40,53 + Actor172: tplr + Owner: USSR + SubCell: 3 + Facing: 256 + Location: 44,53 + Actor173: brik + Owner: USSR + Location: 45,53 + Actor174: brik + Owner: USSR + Location: 46,53 + Actor175: brik + Owner: USSR + Location: 47,53 + Actor176: brik + Owner: USSR + Location: 51,53 + Actor177: brik + Owner: USSR + Location: 52,53 + Actor178: brik + Owner: USSR + Location: 53,53 + Actor179: tplr + Owner: USSR + SubCell: 3 + Facing: 768 + Location: 54,53 + Actor180: brik + Owner: USSR + Location: 58,53 + Actor181: brik + Owner: USSR + Location: 59,53 + Actor182: brik + Owner: USSR + Location: 39,54 + Actor183: brik + Owner: USSR + Location: 40,54 + Actor184: enli + Owner: USSR + SubCell: 3 + Facing: 256 + Location: 44,54 + Actor185: brik + Owner: USSR + Location: 45,54 + Actor187: brik + Owner: USSR + Location: 47,54 + Actor188: brik + Owner: USSR + Location: 48,54 + Actor189: brik + Owner: USSR + Location: 50,54 + Actor190: brik + Owner: USSR + Location: 51,54 + Actor192: brik + Owner: USSR + Location: 53,54 + Actor193: enli + Owner: USSR + SubCell: 3 + Facing: 768 + Location: 54,54 + Actor194: brik + Owner: USSR + Location: 58,54 + Actor195: brik + Owner: USSR + Location: 59,54 + Actor196: brik + Owner: USSR + Location: 39,55 + CPowered8: tsla + Owner: USSR + Location: 40,55 + Actor198: brik + Owner: USSR + Location: 45,55 + Actor199: brik + Owner: USSR + Location: 46,55 + Actor200: brik + Owner: USSR + Location: 47,55 + Actor201: brik + Owner: USSR + Location: 48,55 + Actor202: brik + Owner: USSR + Location: 50,55 + Actor203: brik + Owner: USSR + Location: 51,55 + Actor204: brik + Owner: USSR + Location: 52,55 + Actor205: brik + Owner: USSR + Location: 53,55 + CPowered5: tsla + Owner: USSR + Location: 58,55 + Actor220: brik + Owner: USSR + Location: 59,55 + Actor221: brik + Owner: USSR + Location: 39,56 + Actor258: n3c + Owner: USSR + SubCell: 3 + Facing: 256 + Location: 40,56 + CPowered13: sam + Owner: USSR + Location: 46,56 + Actor260: ftur + Owner: USSR + Location: 48,56 + Actor261: ftur + Owner: USSR + Location: 50,56 + CPowered14: sam + Owner: USSR + Location: 51,56 + Actor263: n3c + Owner: USSR + SubCell: 3 + Facing: 768 + Location: 58,56 + Actor264: brik + Owner: USSR + Location: 59,56 + Actor265: brik + Owner: USSR + Location: 39,57 + Actor266: brik + Owner: USSR + Location: 59,57 + Actor267: brik + Owner: USSR + Location: 39,58 + Actor268: brut + Owner: USSR + SubCell: 3 + Facing: 512 + Location: 48,58 + Actor269: brut + Owner: USSR + SubCell: 3 + Facing: 512 + Location: 50,58 + Actor270: brik + Owner: USSR + Location: 59,58 + Actor271: brik + Owner: USSR + Location: 39,59 + Actor272: brik + Owner: USSR + Location: 59,59 + Actor273: brik + Owner: USSR + Location: 39,60 + Actor275: n3c + Owner: USSR + SubCell: 3 + Facing: 512 + Location: 44,60 + CPowered7: tsla + Owner: USSR + Location: 45,60 + Actor277: brik + Owner: USSR + Location: 46,60 + Actor278: brik + Owner: USSR + Location: 47,60 + Actor279: rmbc + Owner: USSR + SubCell: 3 + Facing: 512 + Location: 48,60 + Actor280: rmbc + Owner: USSR + SubCell: 3 + Facing: 512 + Location: 50,60 + Actor281: brik + Owner: USSR + Location: 51,60 + Actor282: brik + Owner: USSR + Location: 52,60 + CPowered6: tsla + Owner: USSR + Location: 53,60 + Actor284: n3c + Owner: USSR + SubCell: 3 + Facing: 512 + Location: 54,60 + Actor286: brik + Owner: USSR + Location: 59,60 + Actor287: brik + Owner: USSR + Location: 39,61 + Actor288: brik + Owner: USSR + Location: 40,61 + Actor289: brik + Owner: USSR + Location: 41,61 + Actor290: brik + Owner: USSR + Location: 42,61 + Actor291: brik + Owner: USSR + Location: 43,61 + Actor292: brik + Owner: USSR + Location: 44,61 + Actor293: brik + Owner: USSR + Location: 45,61 + Actor294: brik + Owner: USSR + Location: 46,61 + Actor295: brik + Owner: USSR + Location: 47,61 + Actor296: brik + Owner: USSR + Location: 51,61 + Actor297: brik + Owner: USSR + Location: 52,61 + Actor298: brik + Owner: USSR + Location: 53,61 + Actor299: brik + Owner: USSR + Location: 54,61 + Actor300: brik + Owner: USSR + Location: 55,61 + Actor301: brik + Owner: USSR + Location: 56,61 + Actor302: brik + Owner: USSR + Location: 57,61 + Actor305: brik + Owner: USSR + Location: 58,61 + Actor306: brik + Owner: USSR + Location: 59,61 + Actor307: 3tnk.yuri + Owner: USSR + Location: 71,7 + Facing: 768 + PlayerStart: waypoint + Owner: Neutral + Location: 89,7 + Actor308: fix + Owner: USSR + Location: 62,6 + Actor309: sam + Owner: USSR + Location: 58,9 + Actor310: sam + Owner: USSR + Location: 66,9 + Actor311: brik + Owner: USSR + Location: 86,30 + Actor312: brik + Owner: USSR + Location: 90,30 + Actor313: brik + Owner: USSR + Location: 90,31 + Actor314: brik + Owner: USSR + Location: 91,30 + Actor315: brik + Owner: USSR + Location: 91,31 + Actor316: brik + Owner: USSR + Location: 92,30 + Actor317: brik + Owner: USSR + Location: 93,30 + Actor318: brik + Owner: USSR + Location: 93,31 + Actor319: brik + Owner: USSR + Location: 94,31 + Actor320: brik + Owner: USSR + Location: 94,30 + Actor321: brik + Owner: USSR + Location: 86,31 + Actor322: brik + Owner: USSR + Location: 85,31 + Actor323: brik + Owner: USSR + Location: 85,30 + Actor324: brik + Owner: USSR + Location: 84,30 + Actor325: brik + Owner: USSR + Location: 83,30 + Actor326: brik + Owner: USSR + Location: 82,30 + Actor327: brik + Owner: USSR + Location: 82,31 + Actor328: brik + Owner: USSR + Location: 83,31 + Actor329: brik + Owner: USSR + Location: 82,32 + Actor330: brik + Owner: USSR + Location: 82,33 + Actor331: brik + Owner: USSR + Location: 82,34 + Actor332: brik + Owner: USSR + Location: 82,35 + Actor333: brik + Owner: USSR + Location: 82,36 + Actor334: brik + Owner: USSR + Location: 82,37 + Actor335: brik + Owner: USSR + Location: 82,38 + Actor336: brik + Owner: USSR + Location: 83,38 + Actor337: brik + Owner: USSR + Location: 83,37 + Actor338: brik + Owner: USSR + Location: 95,30 + Actor339: brik + Owner: USSR + Location: 96,30 + Actor340: brik + Owner: USSR + Location: 96,31 + Actor341: brik + Owner: USSR + Location: 96,32 + Actor342: brik + Owner: USSR + Location: 96,33 + Actor343: brik + Owner: USSR + Location: 96,34 + Actor344: brik + Owner: USSR + Location: 96,35 + Actor345: brik + Owner: USSR + Location: 96,36 + Actor346: brik + Owner: USSR + Location: 96,37 + Actor347: brik + Owner: USSR + Location: 96,38 + Actor348: brik + Owner: USSR + Location: 96,39 + Actor349: brik + Owner: USSR + Location: 82,42 + Actor350: brik + Owner: USSR + Location: 83,42 + Actor351: brik + Owner: USSR + Location: 82,43 + Actor352: brik + Owner: USSR + Location: 83,43 + Actor353: brik + Owner: USSR + Location: 82,44 + Actor354: brik + Owner: USSR + Location: 82,45 + Actor355: brik + Owner: USSR + Location: 82,46 + Actor356: brik + Owner: USSR + Location: 83,46 + Actor357: brik + Owner: USSR + Location: 84,46 + Actor358: brik + Owner: USSR + Location: 85,46 + Actor359: brik + Owner: USSR + Location: 86,46 + Actor360: brik + Owner: USSR + Location: 87,46 + Actor361: brik + Owner: USSR + Location: 88,46 + Actor362: brik + Owner: USSR + Location: 89,46 + Actor363: brik + Owner: USSR + Location: 90,46 + Actor364: brik + Owner: USSR + Location: 91,46 + Actor365: brik + Owner: USSR + Location: 92,46 + Actor366: brik + Owner: USSR + Location: 93,46 + Actor367: brik + Owner: USSR + Location: 95,46 + Actor368: brik + Owner: USSR + Location: 94,46 + Actor369: brik + Owner: USSR + Location: 96,46 + Actor370: brik + Owner: USSR + Location: 96,44 + Actor371: brik + Owner: USSR + Location: 96,42 + Actor372: brik + Owner: USSR + Location: 96,41 + Actor373: brik + Owner: USSR + Location: 96,40 + Actor374: brik + Owner: USSR + Location: 96,43 + Actor375: brik + Owner: USSR + Location: 96,45 + EPower3: tpwr + Owner: USSR + Location: 93,43 + EPower2: tpwr + Owner: USSR + Location: 90,43 + EPower1: tpwr + Owner: USSR + Location: 87,43 + EPowered2: tsla + Owner: USSR + Location: 84,31 + EPowered3: tsla + Owner: USSR + Location: 92,31 + EPowered1: tsla + Owner: USSR + Location: 83,36 + Actor382: ftur + Owner: USSR + Location: 81,38 + Actor383: ftur + Owner: USSR + Location: 86,29 + Actor384: ftur + Owner: USSR + Location: 90,29 + Actor385: ftur + Owner: USSR + Location: 81,42 + EPowered4: sam + Owner: USSR + Location: 83,33 + EPowered5: sam + Owner: USSR + Location: 83,45 + Actor407: brik + Owner: USSR + Location: 40,6 + Actor408: brik + Owner: USSR + Location: 39,6 + Actor409: brik + Owner: USSR + Location: 39,5 + Actor410: brik + Owner: USSR + Location: 40,5 + Actor411: brik + Owner: USSR + Location: 40,4 + Actor412: brik + Owner: USSR + Location: 40,3 + Actor413: brik + Owner: USSR + Location: 40,2 + Actor414: brik + Owner: USSR + Location: 40,1 + Actor415: brik + Owner: USSR + Location: 39,1 + Actor416: brik + Owner: USSR + Location: 39,2 + Actor417: brik + Owner: USSR + Location: 39,11 + Actor418: brik + Owner: USSR + Location: 39,10 + Actor419: brik + Owner: USSR + Location: 40,10 + Actor420: brik + Owner: USSR + Location: 40,11 + Actor421: brik + Owner: USSR + Location: 40,12 + Actor422: brik + Owner: USSR + Location: 40,13 + Actor423: brik + Owner: USSR + Location: 40,14 + Actor424: brik + Owner: USSR + Location: 40,15 + Actor425: brik + Owner: USSR + Location: 40,16 + Actor426: brik + Owner: USSR + Location: 39,16 + Actor427: brik + Owner: USSR + Location: 38,16 + Actor428: brik + Owner: USSR + Location: 37,16 + Actor429: brik + Owner: USSR + Location: 36,16 + Actor430: brik + Owner: USSR + Location: 35,16 + Actor431: brik + Owner: USSR + Location: 34,16 + Actor432: brik + Owner: USSR + Location: 33,16 + Actor433: brik + Owner: USSR + Location: 33,16 + Actor434: brik + Owner: USSR + Location: 32,16 + Actor435: brik + Owner: USSR + Location: 32,15 + Actor436: brik + Owner: USSR + Location: 33,15 + Actor437: brik + Owner: USSR + Location: 28,15 + Actor438: brik + Owner: USSR + Location: 28,16 + Actor439: brik + Owner: USSR + Location: 27,15 + Actor440: brik + Owner: USSR + Location: 27,16 + Actor441: brik + Owner: USSR + Location: 26,16 + Actor442: brik + Owner: USSR + Location: 25,16 + Actor443: brik + Owner: USSR + Location: 25,16 + Actor475: brik + Owner: USSR + Location: 25,1 + Actor476: brik + Owner: USSR + Location: 26,1 + Actor477: brik + Owner: USSR + Location: 27,1 + Actor478: brik + Owner: USSR + Location: 28,1 + Actor479: brik + Owner: USSR + Location: 29,1 + Actor480: brik + Owner: USSR + Location: 30,1 + Actor481: brik + Owner: USSR + Location: 31,1 + Actor482: brik + Owner: USSR + Location: 32,1 + Actor483: brik + Owner: USSR + Location: 33,1 + Actor484: brik + Owner: USSR + Location: 34,1 + Actor485: brik + Owner: USSR + Location: 35,1 + Actor486: brik + Owner: USSR + Location: 37,1 + Actor487: brik + Owner: USSR + Location: 36,1 + Actor488: brik + Owner: USSR + Location: 38,1 + NPowered2: tsla + Owner: USSR + Location: 34,15 + NPowered1: tsla + Owner: USSR + Location: 26,15 + NPowered3: tsla + Owner: USSR + Location: 39,12 + NPowered4: tsla + Owner: USSR + Location: 39,4 + NPowered6: sam + Owner: USSR + Location: 38,15 + NTibFacility: bio + Owner: USSR + Location: 28,4 + Actor499: chain + Owner: USSR + Location: 28,2 + Actor500: chain + Owner: USSR + Location: 27,2 + Actor501: chain + Owner: USSR + Location: 26,2 + Actor502: chain + Owner: USSR + Location: 29,2 + Actor503: chain + Owner: USSR + Location: 30,2 + Actor504: chain + Owner: USSR + Location: 31,2 + Actor505: chain + Owner: USSR + Location: 31,3 + Actor506: chain + Owner: USSR + Location: 26,3 + Actor507: chain + Owner: USSR + Location: 26,4 + Actor508: chain + Owner: USSR + Location: 26,6 + Actor509: chain + Owner: USSR + Location: 26,5 + Actor510: chain + Owner: USSR + Location: 26,7 + Actor511: chain + Owner: USSR + Location: 27,7 + Actor512: chain + Owner: USSR + Location: 31,7 + Actor513: chain + Owner: USSR + Location: 30,7 + Actor514: chain + Owner: USSR + Location: 31,6 + Actor515: chain + Owner: USSR + Location: 31,5 + Actor516: chain + Owner: USSR + Location: 31,4 + Actor517: barb + Owner: USSR + Location: 25,2 + Actor518: barb + Owner: USSR + Location: 25,3 + Actor519: barb + Owner: USSR + Location: 25,4 + Actor520: barb + Owner: USSR + Location: 32,2 + Actor521: barb + Owner: USSR + Location: 32,3 + Actor522: barb + Owner: USSR + Location: 32,4 + Actor523: barb + Owner: USSR + Location: 25,5 + Actor524: barb + Owner: USSR + Location: 32,5 + Actor496: weap + Owner: USSR + Location: 34,2 + Actor529: ftur + Owner: USSR + Location: 28,17 + Actor530: ftur + Owner: USSR + Location: 32,17 + Actor531: ftur + Owner: USSR + Location: 41,10 + Actor532: ftur + Owner: USSR + Location: 41,6 + Actor536: silo + Owner: USSR + Location: 95,39 + Actor534: silo + Owner: USSR + Location: 95,37 + Actor535: silo + Owner: USSR + Location: 95,35 + Actor456: brik + Owner: USSR + Location: 24,1 + Actor539: brik + Owner: USSR + Location: 24,16 + Actor452: brik + Owner: USSR + Location: 17,1 + Actor453: brik + Owner: USSR + Location: 18,1 + Actor454: brik + Owner: USSR + Location: 19,1 + Actor455: brik + Owner: USSR + Location: 20,1 + Actor457: brik + Owner: USSR + Location: 21,1 + Actor458: brik + Owner: USSR + Location: 22,1 + Actor459: brik + Owner: USSR + Location: 23,1 + NPower1: tpwr + Owner: USSR + Location: 18,2 + NPower2: tpwr + Owner: USSR + Location: 21,2 + Actor528: brik + Owner: USSR + Location: 17,16 + Actor537: brik + Owner: USSR + Location: 18,16 + Actor538: brik + Owner: USSR + Location: 19,16 + Actor540: brik + Owner: USSR + Location: 20,16 + Actor541: brik + Owner: USSR + Location: 21,16 + Actor542: brik + Owner: USSR + Location: 22,16 + Actor543: brik + Owner: USSR + Location: 23,16 + Actor474: brik + Owner: USSR + Location: 15,1 + Actor493: brik + Owner: USSR + Location: 16,1 + Actor494: brik + Owner: USSR + Location: 15,2 + Actor525: brik + Owner: USSR + Location: 15,3 + Actor527: brik + Owner: USSR + Location: 15,4 + Actor544: brik + Owner: USSR + Location: 15,5 + Actor545: brik + Owner: USSR + Location: 16,5 + Actor546: brik + Owner: USSR + Location: 15,6 + Actor547: brik + Owner: USSR + Location: 16,6 + Actor548: brik + Owner: USSR + Location: 15,10 + Actor549: brik + Owner: USSR + Location: 16,10 + Actor550: brik + Owner: USSR + Location: 15,11 + Actor551: brik + Owner: USSR + Location: 16,11 + Actor552: brik + Owner: USSR + Location: 15,12 + Actor553: brik + Owner: USSR + Location: 15,13 + Actor554: brik + Owner: USSR + Location: 15,14 + Actor555: brik + Owner: USSR + Location: 15,15 + NPowered5: sam + Owner: USSR + Location: 16,15 + Actor557: brik + Owner: USSR + Location: 15,16 + Actor558: brik + Owner: USSR + Location: 16,16 + NPower3: tpwr + Owner: USSR + Location: 20,5 + Actor559: silo + Owner: USSR + Location: 63,2 + Actor560: katy + Owner: USSR + Facing: 384 + Location: 18,6 + NPower4: tpwr + Owner: USSR + Location: 29,10 + NTibTruck: truk + Owner: USSR + Location: 28,6 + Facing: 634 + Actor564: barr + Owner: USSR + Location: 22,9 + Actor568: brik + Owner: USSR + Location: 14,74 + Actor569: brik + Owner: USSR + Location: 15,74 + Actor570: brik + Owner: USSR + Location: 16,74 + Actor571: brik + Owner: USSR + Location: 17,74 + Actor572: brik + Owner: USSR + Location: 18,74 + Actor573: brik + Owner: USSR + Location: 22,74 + Actor574: brik + Owner: USSR + Location: 23,74 + Actor575: brik + Owner: USSR + Location: 24,74 + Actor576: brik + Owner: USSR + Location: 25,74 + Actor577: brik + Owner: USSR + Location: 26,74 + Actor579: brik + Owner: USSR + Location: 17,75 + Actor580: brik + Owner: USSR + Location: 18,75 + Actor581: brik + Owner: USSR + Location: 22,75 + Actor582: brik + Owner: USSR + Location: 23,75 + Actor583: brik + Owner: USSR + Location: 25,75 + Actor584: brik + Owner: USSR + Location: 26,75 + Actor586: brik + Owner: USSR + Location: 26,76 + Actor587: brik + Owner: USSR + Location: 11,77 + Actor588: brik + Owner: USSR + Location: 26,77 + Actor589: brik + Owner: USSR + Location: 27,77 + Actor590: brik + Owner: USSR + Location: 28,77 + Actor591: brik + Owner: USSR + Location: 29,77 + Actor592: brik + Owner: USSR + Location: 11,78 + Actor593: brik + Owner: USSR + Location: 29,78 + Actor594: brik + Owner: USSR + Location: 11,79 + Actor595: brik + Owner: USSR + Location: 12,79 + Actor596: brik + Owner: USSR + Location: 28,79 + Actor597: brik + Owner: USSR + Location: 29,79 + Actor598: brik + Owner: USSR + Location: 11,80 + Actor599: brik + Owner: USSR + Location: 12,80 + Actor600: brik + Owner: USSR + Location: 28,80 + Actor601: brik + Owner: USSR + Location: 29,80 + Actor602: brik + Owner: USSR + Location: 11,84 + Actor603: brik + Owner: USSR + Location: 12,84 + Actor604: brik + Owner: USSR + Location: 28,84 + Actor605: brik + Owner: USSR + Location: 29,84 + Actor606: brik + Owner: USSR + Location: 11,85 + Actor607: brik + Owner: USSR + Location: 12,85 + Actor608: brik + Owner: USSR + Location: 28,85 + Actor609: brik + Owner: USSR + Location: 29,85 + Actor610: brik + Owner: USSR + Location: 11,86 + Actor611: brik + Owner: USSR + Location: 29,86 + Actor612: brik + Owner: USSR + Location: 11,87 + Actor613: brik + Owner: USSR + Location: 28,87 + Actor614: brik + Owner: USSR + Location: 29,87 + Actor615: brik + Owner: USSR + Location: 11,88 + Actor616: brik + Owner: USSR + Location: 12,88 + Actor617: brik + Owner: USSR + Location: 28,88 + Actor618: brik + Owner: USSR + Location: 28,88 + Actor619: brik + Owner: USSR + Location: 29,88 + Actor620: brik + Owner: USSR + Location: 12,89 + Actor621: brik + Owner: USSR + Location: 28,89 + Actor622: brik + Owner: USSR + Location: 29,89 + Actor623: brik + Owner: USSR + Location: 12,90 + Actor624: brik + Owner: USSR + Location: 13,90 + Actor625: brik + Owner: USSR + Location: 14,90 + Actor626: brik + Owner: USSR + Location: 14,90 + Actor627: brik + Owner: USSR + Location: 15,90 + Actor628: brik + Owner: USSR + Location: 16,90 + Actor629: brik + Owner: USSR + Location: 17,90 + Actor630: brik + Owner: USSR + Location: 18,90 + Actor631: brik + Owner: USSR + Location: 19,90 + Actor632: brik + Owner: USSR + Location: 20,90 + Actor633: brik + Owner: USSR + Location: 21,90 + Actor634: brik + Owner: USSR + Location: 22,90 + Actor635: brik + Owner: USSR + Location: 23,90 + Actor636: brik + Owner: USSR + Location: 24,90 + Actor637: brik + Owner: USSR + Location: 25,90 + Actor638: brik + Owner: USSR + Location: 26,90 + Actor639: brik + Owner: USSR + Location: 27,90 + Actor640: brik + Owner: USSR + Location: 28,90 + Actor641: brik + Owner: USSR + Location: 29,90 + SPowered3: tsla + Owner: USSR + Location: 28,78 + SPowered2: tsla + Owner: USSR + Location: 24,75 + SPowered4: tsla + Owner: USSR + Location: 28,86 + SPowered1: tsla + Owner: USSR + Location: 16,75 + Actor387: chain + Owner: USSR + Location: 87,34 + Actor386: chain + Owner: USSR + Location: 88,34 + Actor388: chain + Owner: USSR + Location: 89,34 + Actor396: chain + Owner: USSR + Location: 90,34 + Actor397: chain + Owner: USSR + Location: 91,34 + Actor398: chain + Owner: USSR + Location: 92,34 + Actor389: chain + Owner: USSR + Location: 87,35 + Actor399: chain + Owner: USSR + Location: 92,35 + Actor390: chain + Owner: USSR + Location: 87,36 + ETibFacility: bio + Owner: USSR + Location: 89,36 + Actor400: chain + Owner: USSR + Location: 92,36 + Actor391: chain + Owner: USSR + Location: 87,37 + Actor401: chain + Owner: USSR + Location: 92,37 + Actor392: chain + Owner: USSR + Location: 87,38 + ETibTruck: truk + Owner: USSR + Location: 89,38 + Facing: 634 + Actor402: chain + Owner: USSR + Location: 92,38 + Actor393: chain + Owner: USSR + Location: 87,39 + Actor394: chain + Owner: USSR + Location: 88,39 + Actor404: chain + Owner: USSR + Location: 91,39 + Actor403: chain + Owner: USSR + Location: 92,39 + Actor646: chain + Owner: USSR + Location: 15,82 + Actor647: chain + Owner: USSR + Location: 16,82 + Actor648: chain + Owner: USSR + Location: 17,82 + Actor649: chain + Owner: USSR + Location: 18,82 + Actor650: chain + Owner: USSR + Location: 19,82 + Actor651: chain + Owner: USSR + Location: 20,82 + Actor652: chain + Owner: USSR + Location: 15,83 + Actor653: chain + Owner: USSR + Location: 20,83 + Actor654: chain + Owner: USSR + Location: 15,84 + STibFacility: bio + Owner: USSR + Location: 17,84 + Actor657: chain + Owner: USSR + Location: 15,85 + Actor659: chain + Owner: USSR + Location: 15,86 + Actor661: chain + Owner: USSR + Location: 20,86 + Actor662: chain + Owner: USSR + Location: 15,87 + Actor663: chain + Owner: USSR + Location: 16,87 + Actor664: chain + Owner: USSR + Location: 19,87 + Actor665: chain + Owner: USSR + Location: 20,87 + Actor656: chain + Owner: USSR + Location: 17,87 + Actor658: chain + Owner: USSR + Location: 18,87 + STibTruck: truk + Owner: USSR + Location: 19,84 + Facing: 634 + Actor671: chain + Owner: USSR + Location: 83,78 + Actor672: chain + Owner: USSR + Location: 84,78 + Actor673: chain + Owner: USSR + Location: 85,78 + Actor674: chain + Owner: USSR + Location: 86,78 + Actor675: chain + Owner: USSR + Location: 83,79 + Actor677: silo + Owner: USSR + Location: 84,79 + Actor679: silo + Owner: USSR + Location: 85,79 + Actor681: chain + Owner: USSR + Location: 86,79 + Actor683: chain + Owner: USSR + Location: 83,80 + Actor685: silo + Owner: USSR + Location: 84,80 + Actor686: silo + Owner: USSR + Location: 85,80 + Actor687: chain + Owner: USSR + Location: 86,80 + Actor688: chain + Owner: USSR + Location: 83,81 + Actor689: silo + Owner: USSR + Location: 84,81 + Actor690: silo + Owner: USSR + Location: 85,81 + Actor691: chain + Owner: USSR + Location: 86,81 + Actor692: chain + Owner: USSR + Location: 83,82 + Actor693: chain + Owner: USSR + Location: 84,82 + Actor694: chain + Owner: USSR + Location: 85,82 + Actor695: chain + Owner: USSR + Location: 86,82 + Actor668: sam + Owner: USSR + Location: 75,75 + Actor669: sam + Owner: USSR + Location: 83,88 + Actor676: fix + Owner: USSR + Location: 78,84 + Actor682: ftur + Owner: USSR + Location: 83,72 + Actor684: ftur + Owner: USSR + Location: 87,87 + Actor660: ftur + Owner: USSR + Location: 72,87 + Actor667: fenc + Owner: USSR + Location: 72,86 + Actor678: fenc + Owner: USSR + Location: 73,86 + Actor680: fenc + Owner: USSR + Location: 73,87 + Actor696: fenc + Owner: USSR + Location: 83,73 + Actor697: fenc + Owner: USSR + Location: 83,74 + Actor698: fenc + Owner: USSR + Location: 82,72 + Actor699: fenc + Owner: USSR + Location: 82,73 + Actor700: fenc + Owner: USSR + Location: 86,87 + Actor701: fenc + Owner: USSR + Location: 86,86 + Actor702: fenc + Owner: USSR + Location: 87,86 + Actor703: fenc + Owner: USSR + Location: 85,86 + Actor704: fenc + Owner: USSR + Location: 73,85 + SPower3: tpwr + Owner: USSR + Location: 8,74 + SPower1: tpwr + Owner: USSR + Location: 8,71 + SPower2: tpwr + Owner: USSR + Location: 11,71 + Actor645: brik + Owner: USSR + Location: 7,70 + Actor655: brik + Owner: USSR + Location: 14,73 + Actor666: brik + Owner: USSR + Location: 14,72 + Actor705: brik + Owner: USSR + Location: 14,71 + Actor706: brik + Owner: USSR + Location: 14,70 + Actor707: brik + Owner: USSR + Location: 12,70 + Actor708: brik + Owner: USSR + Location: 9,70 + Actor709: brik + Owner: USSR + Location: 8,70 + Actor710: brik + Owner: USSR + Location: 10,70 + Actor711: brik + Owner: USSR + Location: 11,70 + Actor712: brik + Owner: USSR + Location: 13,70 + Actor714: brik + Owner: USSR + Location: 7,71 + Actor716: brik + Owner: USSR + Location: 7,72 + Actor717: brik + Owner: USSR + Location: 7,73 + Actor718: brik + Owner: USSR + Location: 7,74 + Actor719: brik + Owner: USSR + Location: 7,75 + Actor720: brik + Owner: USSR + Location: 7,76 + Actor721: brik + Owner: USSR + Location: 7,77 + Actor722: brik + Owner: USSR + Location: 8,77 + Actor723: brik + Owner: USSR + Location: 9,77 + Actor724: brik + Owner: USSR + Location: 10,77 + Actor713: brik + Owner: USSR + Location: 7,69 + Actor715: brik + Owner: USSR + Location: 6,69 + Actor725: brik + Owner: USSR + Location: 6,70 + Actor726: brik + Owner: USSR + Location: 6,71 + Actor727: brik + Owner: USSR + Location: 8,69 + Actor728: brik + Owner: USSR + Location: 13,69 + Actor729: brik + Owner: USSR + Location: 14,69 + Actor730: brik + Owner: USSR + Location: 15,69 + Actor731: brik + Owner: USSR + Location: 15,70 + Actor732: brik + Owner: USSR + Location: 15,71 + Actor733: brik + Owner: USSR + Location: 6,76 + Actor734: brik + Owner: USSR + Location: 6,77 + Actor735: brik + Owner: USSR + Location: 6,78 + Actor736: brik + Owner: USSR + Location: 7,78 + Actor737: brik + Owner: USSR + Location: 8,78 + Actor738: ftur + Owner: USSR + Location: 7,68 + Actor739: ftur + Owner: USSR + Location: 14,68 + Actor740: ftur + Owner: USSR + Location: 10,85 + Actor741: ftur + Owner: USSR + Location: 30,80 + Actor742: ftur + Owner: USSR + Location: 30,84 + Actor743: ftur + Owner: USSR + Location: 18,73 + Actor744: ftur + Owner: USSR + Location: 22,73 + Actor748: tc04 + Owner: Neutral + Location: 80,18 + Actor749: tc01 + Owner: Neutral + Location: 92,15 + Actor750: tc02 + Owner: Neutral + Location: 66,18 + Actor751: t15 + Owner: Neutral + Location: 68,15 + Actor752: t10 + Owner: Neutral + Location: 75,4 + Actor753: t13 + Owner: Neutral + Location: 74,18 + Actor754: tc01 + Owner: Neutral + Location: 69,33 + Actor755: tc03 + Owner: Neutral + Location: 75,32 + Actor756: t13 + Owner: Neutral + Location: 93,26 + Actor757: t12 + Owner: Neutral + Location: 69,39 + Actor758: t06 + Owner: Neutral + Location: 60,27 + Actor759: t03 + Owner: Neutral + Location: 50,13 + Actor760: t02 + Owner: Neutral + Location: 47,2 + Actor761: tc05 + Owner: Neutral + Location: 24,28 + Actor762: t16 + Owner: Neutral + Location: 20,19 + Actor763: t08 + Owner: Neutral + Location: 18,21 + Actor764: t08 + Owner: Neutral + Location: 9,24 + Actor765: t03 + Owner: Neutral + Location: 6,19 + Actor766: tc03 + Owner: Neutral + Location: 7,1 + Actor767: tc02 + Owner: Neutral + Location: 9,1 + Actor768: t11 + Owner: Neutral + Location: 4,2 + Actor769: t17 + Owner: Neutral + Location: 1,10 + Actor770: t02 + Owner: Neutral + Location: 2,23 + Actor771: t02 + Owner: Neutral + Location: 80,49 + Actor772: t16 + Owner: Neutral + Location: 84,60 + Actor773: tc02 + Owner: Neutral + Location: 89,65 + Actor774: tc04 + Owner: Neutral + Location: 93,81 + Actor775: t13 + Owner: Neutral + Location: 93,75 + Actor776: t08 + Owner: Neutral + Location: 64,93 + Actor777: tc01 + Owner: Neutral + Location: 68,94 + Actor778: tc02 + Owner: Neutral + Location: 56,81 + Actor779: tc05 + Owner: Neutral + Location: 40,72 + Actor780: t11 + Owner: Neutral + Location: 44,74 + Actor781: t13 + Owner: Neutral + Location: 37,73 + Actor782: t06 + Owner: Neutral + Location: 45,72 + Actor783: t12 + Owner: Neutral + Location: 45,76 + Actor784: t16 + Owner: Neutral + Location: 39,74 + Actor785: tc03 + Owner: Neutral + Location: 45,84 + Actor786: t17 + Owner: Neutral + Location: 44,81 + Actor787: t07 + Owner: Neutral + Location: 34,92 + Actor788: t06 + Owner: Neutral + Location: 27,60 + Actor789: t08 + Owner: Neutral + Location: 10,59 + Actor790: tc04 + Owner: Neutral + Location: 12,55 + Actor791: t02 + Owner: Neutral + Location: 8,53 + Actor792: t15 + Owner: Neutral + Location: 12,38 + Actor793: t03 + Owner: Neutral + Location: 25,41 + Actor794: tc01 + Owner: Neutral + Location: 30,35 + Actor795: tc03 + Owner: Neutral + Location: 61,32 + Actor796: t16 + Owner: Neutral + Location: 32,34 + Actor797: tc05 + Owner: Neutral + Location: 64,42 + Actor798: t13 + Owner: Neutral + Location: 63,39 + Actor799: t11 + Owner: Neutral + Location: 34,42 + Actor800: t11 + Owner: Neutral + Location: 50,33 + Actor801: t12 + Owner: Neutral + Location: 48,34 + Actor802: t12 + Owner: Neutral + Location: 37,19 + Actor803: t03 + Owner: Neutral + Location: 23,64 + Actor804: t11 + Owner: Neutral + Location: 23,58 + Actor805: t13 + Owner: Neutral + Location: 26,53 + Actor806: tc01 + Owner: Neutral + Location: 13,47 + Actor807: t10 + Owner: Neutral + Location: 4,44 + Actor808: t13 + Owner: Neutral + Location: 2,38 + Actor809: t12 + Owner: Neutral + Location: 1,40 + Actor810: t02 + Owner: Neutral + Location: 6,46 + Actor811: t06 + Owner: Neutral + Location: 2,59 + Actor812: t05 + Owner: Neutral + Location: 3,71 + Actor813: t07 + Owner: Neutral + Location: 27,67 + Actor814: t07 + Owner: Neutral + Location: 27,93 + Actor815: t12 + Owner: Neutral + Location: 12,93 + Actor816: t13 + Owner: Neutral + Location: 31,94 + Actor817: t07 + Owner: Neutral + Location: 39,92 + Actor818: t06 + Owner: Neutral + Location: 67,81 + Actor819: t06 + Owner: Neutral + Location: 78,65 + Actor820: tc02 + Owner: Neutral + Location: 72,57 + Actor821: t16 + Owner: Neutral + Location: 91,64 + Actor822: t17 + Owner: Neutral + Location: 91,52 + Actor823: t13 + Owner: Neutral + Location: 81,51 + Actor824: t08 + Owner: Neutral + Location: 71,43 + Actor825: ice01 + Owner: Neutral + Location: 59,66 + Actor826: t16 + Owner: Neutral + Location: 61,65 + Actor827: t14 + Owner: Neutral + Location: 52,68 + Actor828: t03 + Owner: Neutral + Location: 65,61 + Actor829: t02 + Owner: Neutral + Location: 62,74 + Actor830: t05 + Owner: Neutral + Location: 35,85 + Actor831: tc03 + Owner: Neutral + Location: 79,90 + Actor832: t13 + Owner: Neutral + Location: 78,94 + Actor833: t14 + Owner: Neutral + Location: 88,92 + Actor834: t16 + Owner: Neutral + Location: 93,89 + Actor835: t13 + Owner: Neutral + Location: 93,95 + Actor836: t16 + Owner: Neutral + Location: 70,95 + Actor837: 3tnk.atomicyuri + Owner: USSR + Location: 47,62 + Facing: 512 + Actor838: 3tnk.atomicyuri + Owner: USSR + Location: 51,62 + Facing: 512 + Actor839: 3tnk.atomicyuri + Owner: USSR + Location: 60,53 + Facing: 768 + Actor840: 3tnk.atomicyuri + Owner: USSR + Location: 60,49 + Facing: 768 + Actor841: 3tnk.atomicyuri + Owner: USSR + Location: 51,40 + Facing: 0 + Actor842: 3tnk.atomicyuri + Owner: USSR + Location: 47,40 + Facing: 0 + Actor843: 3tnk.atomicyuri + Owner: USSR + Location: 38,49 + Facing: 256 + Actor844: 3tnk.atomicyuri + Owner: USSR + Location: 38,53 + Facing: 256 + Actor845: silo + Owner: USSR + Location: 12,86 + Actor846: silo + Owner: USSR + Location: 12,87 + Actor847: silo + Owner: USSR + Location: 20,15 + Actor848: silo + Owner: USSR + Location: 22,15 + Actor849: dome + Owner: USSR + Location: 80,80 + Actor850: stek + Owner: USSR + Location: 17,79 + Actor851: 4tnk + Owner: USSR + Location: 32,82 + Facing: 761 + Actor852: 4tnk + Owner: USSR + Location: 20,71 + Facing: 0 + Actor853: ttra + Owner: USSR + Location: 18,76 + Facing: 0 + Actor854: 3tnk + Owner: USSR + Location: 42,8 + Facing: 769 + Actor855: 3tnk + Owner: USSR + Location: 30,18 + Facing: 523 + Actor856: hpad + Owner: USSR + Location: 75,84 + Actor859: sbag + Owner: USSR + Location: 2,19 + Actor865: sbag + Owner: USSR + Location: 3,19 + Actor866: sbag + Owner: USSR + Location: 4,19 + Actor869: sbag + Owner: USSR + Location: 2,20 + Actor870: silo + Owner: USSR + Location: 3,20 + Actor871: sbag + Owner: USSR + Location: 4,20 + Actor872: sbag + Owner: USSR + Location: 2,21 + Actor873: silo + Owner: USSR + Location: 3,21 + Actor874: sbag + Owner: USSR + Location: 4,21 + Actor875: sbag + Owner: USSR + Location: 2,22 + Actor876: sbag + Owner: USSR + Location: 3,22 + Actor877: sbag + Owner: USSR + Location: 4,22 + Actor857: sbag + Owner: USSR + Location: 2,48 + Actor858: sbag + Owner: USSR + Location: 3,48 + Actor860: sbag + Owner: USSR + Location: 4,48 + Actor861: sbag + Owner: USSR + Location: 2,49 + Actor862: silo + Owner: USSR + Location: 3,49 + Actor863: sbag + Owner: USSR + Location: 4,49 + Actor864: sbag + Owner: USSR + Location: 2,50 + Actor867: silo + Owner: USSR + Location: 3,50 + Actor868: sbag + Owner: USSR + Location: 4,50 + Actor878: sbag + Owner: USSR + Location: 2,51 + Actor879: sbag + Owner: USSR + Location: 3,51 + Actor880: sbag + Owner: USSR + Location: 4,51 + Actor881: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 27,17 + Actor882: e1 + Owner: USSR + SubCell: 3 + Location: 32,18 + Facing: 618 + Actor883: e1 + Owner: USSR + SubCell: 3 + Location: 34,17 + Facing: 642 + Actor884: e1 + Owner: USSR + SubCell: 3 + Location: 41,11 + Facing: 737 + Actor885: e1 + Owner: USSR + SubCell: 3 + Location: 44,9 + Facing: 800 + Actor886: e1 + Owner: USSR + SubCell: 3 + Location: 43,6 + Facing: 674 + Actor887: e1 + Owner: USSR + SubCell: 3 + Location: 71,4 + Facing: 634 + Actor888: e1 + Owner: USSR + SubCell: 3 + Location: 71,11 + Facing: 848 + Actor889: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 61,12 + Actor890: e1 + Owner: USSR + SubCell: 3 + Location: 62,11 + Facing: 586 + Actor891: e1 + Owner: USSR + SubCell: 3 + Location: 55,9 + Facing: 384 + Actor892: e1 + Owner: USSR + SubCell: 3 + Location: 54,20 + Facing: 959 + Actor893: e1 + Owner: USSR + SubCell: 3 + Location: 56,22 + Facing: 1023 + Actor894: e1 + Owner: USSR + SubCell: 3 + Location: 58,21 + Facing: 999 + Actor895: e1 + Owner: USSR + SubCell: 3 + Location: 85,28 + Facing: 0 + Actor896: e1 + Owner: USSR + SubCell: 3 + Location: 91,28 + Facing: 0 + Actor897: e1 + Owner: USSR + SubCell: 3 + Location: 89,30 + Facing: 190 + Actor898: e1 + Owner: USSR + SubCell: 3 + Location: 80,37 + Facing: 166 + Actor899: e1 + Owner: USSR + SubCell: 3 + Location: 80,40 + Facing: 269 + Actor900: e1 + Owner: USSR + SubCell: 3 + Location: 79,43 + Facing: 384 + Actor901: e1 + Owner: USSR + SubCell: 3 + Location: 85,72 + Facing: 800 + Actor902: e1 + Owner: USSR + SubCell: 3 + Location: 79,71 + Facing: 0 + Actor903: e1 + Owner: USSR + SubCell: 3 + Location: 83,71 + Facing: 0 + Actor904: e1 + Owner: USSR + SubCell: 3 + Location: 87,88 + Facing: 689 + Actor905: e1 + Owner: USSR + SubCell: 3 + Location: 88,87 + Facing: 793 + Actor906: e1 + Owner: USSR + SubCell: 3 + Location: 89,85 + Facing: 650 + Actor907: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 74,90 + Actor908: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 71,88 + Actor909: e1 + Owner: USSR + SubCell: 3 + Location: 69,87 + Facing: 206 + Actor910: e1 + Owner: USSR + SubCell: 3 + Location: 32,80 + Facing: 642 + Actor912: e1 + Owner: USSR + SubCell: 3 + Location: 31,85 + Facing: 840 + Actor913: e1 + Owner: USSR + Location: 32,81 + SubCell: 1 + Facing: 705 + Actor911: e1 + Owner: USSR + SubCell: 3 + Location: 22,72 + Facing: 87 + Actor914: e1 + Owner: USSR + Location: 22,72 + SubCell: 1 + Facing: 0 + Actor915: e1 + Owner: USSR + SubCell: 3 + Location: 19,71 + Facing: 0 + Actor916: e1 + Owner: USSR + Location: 9,85 + SubCell: 3 + Facing: 384 + Actor917: e1 + Owner: USSR + SubCell: 3 + Location: 8,80 + Facing: 384 + Actor918: e1 + Owner: USSR + SubCell: 3 + Location: 4,77 + Facing: 237 + Actor919: e1 + Owner: USSR + Facing: 384 + Location: 4,77 + SubCell: 1 + Actor920: e1 + Owner: USSR + SubCell: 3 + Location: 4,67 + Facing: 840 + Actor921: e1 + Owner: USSR + SubCell: 3 + Location: 22,93 + Facing: 626 + Actor922: e1 + Owner: USSR + SubCell: 3 + Location: 32,90 + Facing: 618 + Actor923: e1 + Owner: USSR + SubCell: 3 + Location: 32,65 + Facing: 388 + Actor924: e1 + Owner: USSR + Location: 32,65 + SubCell: 1 + Facing: 182 + Actor925: e1 + Owner: USSR + SubCell: 3 + Location: 35,68 + Facing: 384 + Actor927: e1 + Owner: USSR + SubCell: 3 + Location: 71,49 + Facing: 705 + Actor928: e1 + Owner: USSR + SubCell: 3 + Location: 27,46 + Facing: 245 + Actor929: e1 + Owner: USSR + SubCell: 3 + Location: 38,29 + Facing: 721 + Actor930: e1 + Owner: USSR + Location: 38,29 + SubCell: 1 + Facing: 856 + Actor931: e1 + Owner: USSR + SubCell: 3 + Location: 31,25 + Facing: 832 + Actor932: e1 + Owner: USSR + SubCell: 3 + Location: 25,28 + Facing: 0 + Actor933: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 11,23 + Actor934: e1 + Owner: USSR + SubCell: 3 + Location: 9,17 + Facing: 658 + Actor935: e1 + Owner: USSR + Location: 9,17 + SubCell: 1 + Facing: 594 + Actor936: e1 + Owner: USSR + SubCell: 3 + Location: 4,17 + Facing: 610 + Actor937: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 13,6 + Actor938: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 12,4 + Actor939: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 14,12 + Actor940: e1 + Owner: USSR + SubCell: 3 + Location: 79,17 + Facing: 808 + Actor941: e1 + Owner: USSR + SubCell: 3 + Location: 83,19 + Facing: 721 + Actor942: e1 + Owner: USSR + Location: 83,19 + SubCell: 1 + Facing: 999 + Actor943: e1 + Owner: USSR + SubCell: 3 + Location: 79,19 + Facing: 1023 + Actor944: e1 + Owner: USSR + SubCell: 3 + Location: 71,19 + Facing: 1023 + Actor945: e1 + Owner: USSR + SubCell: 3 + Location: 48,28 + Facing: 0 + Actor946: e2 + Owner: USSR + SubCell: 3 + Location: 85,75 + Facing: 0 + Actor947: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 82,83 + Actor948: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 71,86 + Actor949: e2 + Owner: USSR + SubCell: 3 + Location: 86,90 + Facing: 547 + Actor950: e2 + Owner: USSR + Location: 80,40 + SubCell: 1 + Facing: 229 + Actor951: e2 + Owner: USSR + Location: 89,30 + SubCell: 1 + Facing: 71 + TurretFacing: 856 + Actor952: e2 + Owner: USSR + SubCell: 3 + Location: 78,20 + Facing: 927 + Actor953: e2 + Owner: USSR + SubCell: 3 + Location: 66,5 + Facing: 634 + Actor954: e2 + Owner: USSR + SubCell: 3 + Location: 60,5 + Facing: 666 + Actor955: e2 + Owner: USSR + Location: 56,22 + SubCell: 1 + Facing: 1023 + Actor956: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 13,10 + Actor957: e2 + Owner: USSR + SubCell: 3 + Location: 26,45 + Facing: 237 + Actor958: e2 + Owner: USSR + Location: 10,68 + SubCell: 3 + Facing: 0 + Actor959: e2 + Owner: USSR + SubCell: 3 + Location: 23,72 + Facing: 0 + Actor960: e2 + Owner: USSR + SubCell: 3 + Location: 35,85 + Facing: 666 + Actor961: e2 + Owner: USSR + SubCell: 3 + Location: 32,94 + Facing: 0 + Actor962: e2 + Owner: USSR + SubCell: 3 + Location: 68,66 + Facing: 753 + Actor963: e2 + Owner: USSR + Facing: 384 + Location: 89,65 + SubCell: 3 + Actor964: e2 + Owner: USSR + SubCell: 3 + Location: 89,53 + Facing: 491 + Actor965: e1 + Owner: USSR + SubCell: 3 + Location: 87,51 + Facing: 610 + Actor966: e1 + Owner: USSR + SubCell: 3 + Location: 24,11 + Facing: 634 + Actor967: e1 + Owner: USSR + SubCell: 3 + Location: 22,8 + Facing: 594 + Actor968: e1 + Owner: USSR + Location: 34,12 + SubCell: 3 + Facing: 491 + Actor969: e1 + Owner: USSR + Location: 35,11 + SubCell: 3 + Facing: 586 + Actor970: 3tnk + Owner: USSR + Location: 35,5 + Facing: 512 + Actor971: brut + Owner: USSR + SubCell: 3 + Location: 78,18 + Facing: 888 + Actor972: brut + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 92,41 + Actor973: brut + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 80,44 + Actor974: brut + Owner: USSR + SubCell: 3 + Location: 69,53 + Facing: 737 + Actor975: brut + Owner: USSR + SubCell: 3 + Location: 84,71 + Facing: 927 + Actor976: brut + Owner: USSR + SubCell: 3 + Location: 88,84 + Facing: 713 + Actor977: brut + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 72,90 + Actor978: brut + Owner: USSR + SubCell: 3 + Location: 32,83 + Facing: 793 + Actor979: brut + Owner: USSR + SubCell: 3 + Location: 23,70 + Facing: 118 + Actor980: brut + Owner: USSR + SubCell: 3 + Location: 33,67 + Facing: 348 + Actor981: brut + Owner: USSR + SubCell: 3 + Location: 6,50 + Facing: 880 + Actor982: brut + Owner: USSR + SubCell: 3 + Location: 14,28 + Facing: 816 + Actor983: brut + Owner: USSR + SubCell: 3 + Location: 5,20 + Facing: 689 + Actor984: brut + Owner: USSR + SubCell: 3 + Location: 32,20 + Facing: 499 + Actor985: brut + Owner: USSR + Facing: 384 + Location: 12,10 + SubCell: 3 + Actor986: brut + Owner: USSR + SubCell: 3 + Location: 42,10 + Facing: 769 + Actor987: brut + Owner: USSR + SubCell: 3 + Location: 56,21 + Facing: 0 + Actor988: brut + Owner: USSR + SubCell: 3 + Location: 42,30 + Facing: 840 + Actor989: brut + Owner: USSR + SubCell: 3 + Location: 39,77 + Facing: 626 + Actor990: e4 + Owner: USSR + SubCell: 3 + Location: 22,49 + Facing: 150 + Actor991: e4 + Owner: USSR + SubCell: 3 + Location: 8,20 + Facing: 674 + Actor992: e4 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 28,18 + Actor993: e4 + Owner: USSR + Location: 15,68 + SubCell: 3 + Facing: 0 + Actor994: e4 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 90,52 + Actor995: ivan + Owner: USSR + SubCell: 3 + Location: 77,80 + Facing: 570 + Actor996: e3 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 24,84 + Actor997: e3 + Owner: USSR + SubCell: 3 + Location: 16,81 + Facing: 384 + Actor998: e3 + Owner: USSR + Facing: 384 + Location: 6,75 + SubCell: 3 + Actor999: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 14,87 + Actor1000: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 37,73 + Actor1001: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 24,56 + Actor1003: e3 + Owner: USSR + Location: 23,12 + SubCell: 3 + Facing: 626 + Actor1004: e3 + Owner: USSR + SubCell: 3 + Location: 59,22 + Facing: 800 + Actor1005: e3 + Owner: USSR + Location: 84,77 + SubCell: 3 + Facing: 689 + Actor1006: e3 + Owner: USSR + SubCell: 3 + Location: 77,75 + Facing: 737 + Actor1007: e3 + Owner: USSR + Location: 84,87 + SubCell: 3 + Facing: 618 + Actor1008: e3 + Owner: USSR + SubCell: 3 + Location: 61,74 + Facing: 491 + Actor1009: e3 + Owner: USSR + SubCell: 3 + Location: 59,93 + Facing: 0 + Actor1010: e4 + Owner: USSR + SubCell: 3 + Location: 62,95 + TurretFacing: 0 + Facing: 0 + Actor1011: e1 + Owner: USSR + SubCell: 3 + Location: 43,93 + Facing: 674 + Actor1012: e1 + Owner: USSR + SubCell: 3 + Location: 45,88 + Facing: 745 + Actor1015: e1 + Owner: USSR + SubCell: 3 + Location: 4,37 + Facing: 927 + Actor1017: e1 + Owner: USSR + SubCell: 3 + Location: 4,38 + Facing: 721 + Actor1016: e8 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 22,80 + Actor1018: btr + Owner: USSR + Facing: 384 + Location: 77,82 + ETibTruckPath1: waypoint + Owner: Neutral + Location: 90,39 + ETibTruckPath2: waypoint + Owner: Neutral + Location: 76,40 + ETibTruckPath3: waypoint + Owner: Neutral + Location: 76,51 + ETibTruckPath4: waypoint + Owner: Neutral + Location: 51,51 + NTibTruckPath1: waypoint + Owner: Neutral + Location: 29,7 + NTibTruckPath2: waypoint + Owner: Neutral + Location: 27,10 + NTibTruckPath3: waypoint + Owner: Neutral + Location: 27,14 + NTibTruckPath4: waypoint + Owner: Neutral + Location: 30,14 + NTibTruckPath5: waypoint + Owner: Neutral + Location: 30,21 + NTibTruckPath6: waypoint + Owner: Neutral + Location: 35,21 + NTibTruckPath7: waypoint + Owner: Neutral + Location: 44,23 + NTibTruckPath8: waypoint + Owner: Neutral + Location: 44,37 + NTibTruckPath9: waypoint + Owner: Neutral + Location: 49,38 + NTibTruckPath10: waypoint + Owner: Neutral + Location: 49,49 + STibTruckPath1: waypoint + Owner: Neutral + Location: 21,84 + STibTruckPath2: waypoint + Owner: Neutral + Location: 20,70 + STibTruckPath3: waypoint + Owner: Neutral + Location: 29,71 + STibTruckPath4: waypoint + Owner: Neutral + Location: 36,64 + STibTruckPath5: waypoint + Owner: Neutral + Location: 49,65 + STibTruckPath6: waypoint + Owner: Neutral + Location: 49,52 + Hind1: hind + Owner: USSR + Location: 76,81 + Facing: 384 + Hind2: hind + Owner: USSR + Location: 82,79 + Facing: 384 + HindPatrol1: waypoint + Owner: Neutral + Location: 83,64 + HindPatrol2: waypoint + Owner: Neutral + Location: 79,82 + HindPatrol3: waypoint + Owner: Neutral + Location: 60,89 + HindPatrol4: waypoint + Owner: Neutral + Location: 39,86 + HindPatrol5: waypoint + Owner: Neutral + Location: 21,61 + HindPatrol6: waypoint + Owner: Neutral + Location: 18,46 + Actor1020: e1 + Owner: USSR + SubCell: 3 + Location: 5,49 + Facing: 800 + Actor1021: e1 + Owner: USSR + SubCell: 3 + Location: 6,53 + Facing: 0 + Actor1022: e2 + Owner: USSR + SubCell: 3 + Location: 7,51 + Facing: 832 + Actor1023: btr + Owner: USSR + Facing: 384 + Location: 91,55 + Actor1024: oilb + Owner: USSR + Location: 5,91 + Actor1027: oilb + Owner: USSR + Location: 46,74 + SPowered5: sam + Owner: USSR + Location: 26,89 + SPowered7: sam + Owner: USSR + Location: 13,76 + SPowered6: sam + Owner: USSR + Location: 13,89 + HindPatrol9: waypoint + Owner: Neutral + Location: 69,71 + HindPatrol8: waypoint + Owner: Neutral + Location: 50,69 + HindPatrol7: waypoint + Owner: Neutral + Location: 33,61 + Actor1028: camera + Owner: USSR + Location: 85,11 + Actor1029: camera + Owner: USSR + Location: 62,9 + Actor1030: camera + Owner: USSR + Location: 36,9 + Actor1031: camera + Owner: USSR + Location: 21,9 + Actor1032: camera + Owner: USSR + Location: 15,73 + Actor1033: camera + Owner: USSR + Location: 28,82 + Actor1034: camera + Owner: USSR + Location: 79,80 + Actor1035: camera + Owner: USSR + Location: 69,51 + Actor1036: camera + Owner: USSR + Location: 44,30 + Actor1037: camera + Owner: USSR + Location: 28,45 + Actor1038: camera + Owner: USSR + Location: 34,66 + Actor1039: camera + Owner: USSR + Location: 85,37 + Actor1040: camera + Owner: USSR + Location: 15,43 + Actor1041: camera + Owner: USSR + Location: 41,80 + Actor1042: s4 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 92,8 + Actor1043: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 88,6 + Actor1046: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 91,6 + Actor1047: s1 + Owner: Scrin + Facing: 384 + Location: 86,5 + SubCell: 3 + Actor1048: s1 + Owner: Scrin + Facing: 384 + Location: 93,10 + SubCell: 3 + Actor1044: e1 + Owner: USSR + SubCell: 3 + Facing: 745 + Location: 63,54 + Actor1045: e1 + Owner: USSR + SubCell: 3 + Facing: 705 + Location: 72,55 + Actor1051: seek + Owner: Scrin + Facing: 384 + Location: 84,8 + Actor1052: seek + Owner: Scrin + Facing: 384 + Location: 89,11 + EntranceReveal1: waypoint + Owner: Neutral + Location: 88,29 + EntranceReveal2: waypoint + Owner: Neutral + Location: 81,40 + EntranceReveal3: waypoint + Owner: Neutral + Location: 70,7 + EntranceReveal4: waypoint + Owner: Neutral + Location: 41,8 + EntranceReveal5: waypoint + Owner: Neutral + Location: 30,17 + EntranceReveal6: waypoint + Owner: Neutral + Location: 20,72 + EntranceReveal7: waypoint + Owner: Neutral + Location: 31,82 + Actor1049: e3 + Owner: USSR + SubCell: 3 + Facing: 198 + Location: 19,43 + Actor1050: e1 + Owner: USSR + SubCell: 3 + Facing: 39 + Location: 16,44 + Actor1053: btr + Owner: USSR + Facing: 118 + Location: 18,44 + Actor1055: e1 + Owner: USSR + SubCell: 1 + Facing: 103 + Location: 19,44 + Actor1019: oilb + Owner: USSR + Location: 73,79 + EntranceReveal8: waypoint + Owner: Neutral + Location: 38,51 + EntranceReveal9: waypoint + Owner: Neutral + Location: 49,40 + EntranceReveal10: waypoint + Owner: Neutral + Location: 60,51 + EntranceReveal11: waypoint + Owner: Neutral + Location: 49,62 + CPower3: tpwr + Owner: USSR + Location: 40,58 + CPower1: tpwr + Owner: USSR + Location: 40,42 + CPower2: tpwr + Owner: USSR + Location: 56,42 + CPower4: tpwr + Owner: USSR + Location: 56,58 + CPowered10: sam + Owner: USSR + Location: 54,45 + CPowered9: sam + Owner: USSR + Location: 43,45 + CPowered15: sam + Owner: USSR + Location: 43,57 + CPowered16: sam + Owner: USSR + Location: 54,57 + SouthEastBarracks: barr + Owner: USSR + Location: 76,77 + SouthWestBarracks: barr + Owner: USSR + Location: 23,78 + NorthWestBarracks: barr + Owner: USSR + Location: 33,9 + NorthEastBarracks: barr + Owner: USSR + Location: 66,2 + CPowered18: tsla + Owner: USSR + Location: 46,48 + CPowered17: tsla + Owner: USSR + Location: 52,48 + CPowered19: tsla + Owner: USSR + Location: 52,54 + CPowered20: tsla + Owner: USSR + Location: 46,54 + Actor1054: fenc + Owner: USSR + Location: 35,36 + Actor1056: fenc + Owner: USSR + Location: 34,36 + Actor1057: fenc + Owner: USSR + Location: 34,37 + Actor1058: fenc + Owner: USSR + Location: 34,38 + Actor1059: fenc + Owner: USSR + Location: 34,39 + Actor1060: fenc + Owner: USSR + Location: 37,39 + Actor1061: fenc + Owner: USSR + Location: 36,36 + Actor1062: fenc + Owner: USSR + Location: 37,36 + Actor1063: fenc + Owner: USSR + Location: 37,37 + Actor1064: fenc + Owner: USSR + Location: 37,38 + Actor1065: fenc + Owner: USSR + Location: 38,36 + Actor1066: fenc + Owner: USSR + Location: 33,38 + Actor1067: fenc + Owner: USSR + Location: 32,38 + Actor1068: fenc + Owner: USSR + Location: 33,39 + Actor1069: fenc + Owner: USSR + Location: 54,62 + Actor1070: fenc + Owner: USSR + Location: 55,62 + Actor1071: fenc + Owner: USSR + Location: 53,62 + Actor1072: fenc + Owner: USSR + Location: 56,62 + Actor1073: fenc + Owner: USSR + Location: 58,62 + Actor1074: fenc + Owner: USSR + Location: 57,62 + Actor1075: fenc + Owner: USSR + Location: 56,63 + Actor1076: fenc + Owner: USSR + Location: 56,64 + Actor1077: fenc + Owner: USSR + Location: 56,65 + Actor1078: fenc + Owner: USSR + Location: 56,66 + Actor1080: fenc + Owner: USSR + Location: 39,36 + Actor1081: fenc + Owner: USSR + Location: 40,36 + Actor1082: fenc + Owner: USSR + Location: 40,37 + Actor1083: fenc + Owner: USSR + Location: 40,38 + CentralBarracks: barr + Owner: USSR + Location: 38,37 + Actor1084: ftur + Owner: USSR + Location: 32,39 + Actor1085: ftur + Owner: USSR + Location: 55,66 + CentralDome: dome + Owner: USSR + Location: 35,37 + CentralHelipad: hpad + Owner: USSR + Location: 54,63 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-allegiances.yaml, ca|rules/custom/commando-mission.yaml, subjugation-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml, subjugation-weapons.yaml diff --git a/mods/ca/missions/main-campaign/ca23-subjugation/s_firstichorshipment.aud b/mods/ca/missions/main-campaign/ca23-subjugation/s_firstichorshipment.aud new file mode 100644 index 0000000000..684044809c Binary files /dev/null and b/mods/ca/missions/main-campaign/ca23-subjugation/s_firstichorshipment.aud differ diff --git a/mods/ca/missions/main-campaign/ca23-subjugation/s_ichorconsumed.aud b/mods/ca/missions/main-campaign/ca23-subjugation/s_ichorconsumed.aud new file mode 100644 index 0000000000..31b2545fe2 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca23-subjugation/s_ichorconsumed.aud differ diff --git a/mods/ca/missions/main-campaign/ca23-subjugation/s_ichorshipment.aud b/mods/ca/missions/main-campaign/ca23-subjugation/s_ichorshipment.aud new file mode 100644 index 0000000000..059016ff20 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca23-subjugation/s_ichorshipment.aud differ diff --git a/mods/ca/missions/main-campaign/ca23-subjugation/s_prodigy.aud b/mods/ca/missions/main-campaign/ca23-subjugation/s_prodigy.aud new file mode 100644 index 0000000000..b1da1bb838 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca23-subjugation/s_prodigy.aud differ diff --git a/mods/ca/missions/main-campaign/ca23-subjugation/s_yuripower.aud b/mods/ca/missions/main-campaign/ca23-subjugation/s_yuripower.aud new file mode 100644 index 0000000000..7c5d61ab1b Binary files /dev/null and b/mods/ca/missions/main-campaign/ca23-subjugation/s_yuripower.aud differ diff --git a/mods/ca/missions/main-campaign/ca23-subjugation/subjugation-rules.yaml b/mods/ca/missions/main-campaign/ca23-subjugation/subjugation-rules.yaml new file mode 100644 index 0000000000..58ddec4172 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca23-subjugation/subjugation-rules.yaml @@ -0,0 +1,308 @@ +^Palettes: + TintPostProcessEffect: + PaletteFromFile@terrain-temperat: + Filename: ca|missions/main-campaign/ca23-subjugation/brown.pal + WeatherOverlay@RAIN: + WindTick: 150, 550 + UseSquares: false + ScatterDirection: 0, 0 + Gravity: 20, 25 + SwingOffset: 0, 0 + SwingSpeed: 0, 0 + SwingAmplitude: 0, 0 + ParticleColors: 72aaae, 72aea6, 5caea3, 6da69f + LineTailAlphaValue: 25 + ParticleSize: 1, 1 + ParticleDensityFactor: 5 + +World: + LuaScript: + Scripts: campaign.lua, subjugation.lua + MissionData: + Briefing: We have located the one known as Yuri. Cloistered and protected by his cybernetic and genetically engineered slaves, he has been using an enriched form of ichor to empower his already considerable psionic powers.\n\nHe must be stopped, but kept alive so that we may learn more of his experiments.\n\nWe believe the enriched ichor will be similarly effective at increasing the power of our Masterminds. To test this theory, capture Yuri's enrichment facilities. The enriched ichor will be consumed by the Mastermind who will then be capable of protecting your other units against Yuri's influence.\n\nOnce all of the available enriched ichor has been consumed, use whatever forces you have remaining, along with any you have enslaved, to assault and capture Yuri's command center. + MapOptions: + ShortGameCheckboxEnabled: False + ScriptLobbyDropdown@RESPAWN: + ID: respawn + Label: Respawns + Description: Enable/disable respawning on death + Values: + enabled: Enabled + disabled: Disabled + Default: disabled + DisplayOrder: 999 + MusicPlaylist: + StartingMusic: duskhour + +Player: + PlayerResources: + DefaultCash: 0 + +^Bridge: + Health: + HP: 250000 + +^MindControllable: + Targetable@MINDCONTROL: + TargetTypes: MindControllable + -RequiresCondition: + ExternalCondition@MCPROTECTION: + Condition: mc-protection + Targetable@MCPROTECTION: + RequiresCondition: mc-protection + TargetTypes: YuriMindControlImmune + +^DifficultyModifiers: + Inherits@ActorDifficultyConditions: ^ActorDifficultyConditions + DamageMultiplier@EASY: + Modifier: 60 + RequiresCondition: difficulty-easy + DamageMultiplier@NORMAL: + Modifier: 80 + RequiresCondition: difficulty-normal + RevealsShroudMultiplier@EASY: + Modifier: 130 + RequiresCondition: difficulty-easy + RevealsShroudMultiplier@NORMAL: + Modifier: 115 + RequiresCondition: difficulty-normal + RangeMultiplier@EASY: + Modifier: 130 + RequiresCondition: difficulty-easy + RangeMultiplier@NORMAL: + Modifier: 115 + RequiresCondition: difficulty-normal + +MAST: + Inherits@DIFFICULTY: ^DifficultyModifiers + Inherits@RESOURCESCANPOWER: ^ResourceScanPower + -GainsExperience: + -ProducibleWithLevel: + Health: + HP: 15000 + ExternalCondition@VET: + Condition: rank-veteran + RevealActorsPower@RESOURCESCAN: + -PauseOnCondition: + TargetActors: bio, miss, truk + LifeTime: 125 + ChargeInterval: 4500 + Description: \nReveals high concentrations of Tiberium. + ProximityExternalCondition@MCPROTECTION: + RequiresCondition: rank-elite + Condition: mc-protection + ValidRelationships: Ally, Enemy, Neutral + Range: 20c0 + WithRangeCircle@MCPROTECTION: + Type: Psi + Visible: Always + ValidRelationships: Ally + Color: 7700ffaa + Range: 20c0 + RequiresCondition: rank-elite + RevealsShroud: + Range: 7c0 + AutoTarget: + InitialStance: HoldFire + -RangeMultiplier@RANK-ELITE: + Targetable@MASTERMIND: + TargetTypes: Mastermind + +MSPK: + -Selectable: + -SelectionDecorations: + -WithSpriteControlGroupDecoration: + -DrawLineToTarget: + Interactable: + Wanders: + WanderMoveRadius: 1 + ReduceMoveRadiusDelay: 3 + Aircraft: + Speed: 30 + KillsSelf: + Delay: 250 + +SEEK: + RevealsShroud: + Range: 8c512 + +camera.resourcescan: + RevealsShroud: + Range: 4c0 + +MISS: + Inherits@AUTOTARGET: ^AutoTargetAll + Tooltip: + Name: Yuri's Command Center + WithRangeCircle@0: + Type: Psi + Visible: Always + ValidRelationships: Enemy + Color: ff00ff66 + Range: 20c0 + RequiresCondition: !enriched + WithRangeCircle@1: + Type: Psi + Visible: Always + ValidRelationships: Enemy + Color: ff00ff66 + Range: 26c0 + RequiresCondition: enriched == 1 + WithRangeCircle@2: + Type: Psi + Visible: Always + ValidRelationships: Enemy + Color: ff00ff66 + Range: 32c0 + RequiresCondition: enriched == 2 + WithRangeCircle@3: + Type: Psi + Visible: Always + ValidRelationships: Enemy + Color: ff00ff66 + Range: 38c0 + RequiresCondition: enriched >= 3 + RangeMultiplier@1: + Modifier: 130 + RequiresCondition: enriched == 1 + RangeMultiplier@2: + Modifier: 160 + RequiresCondition: enriched == 2 + RangeMultiplier@3: + Modifier: 190 + RequiresCondition: enriched >= 3 + GrantConditionOnPrerequisite@OwnedByAi: + Condition: owned-by-ai + Prerequisites: botplayer + AttackOmni: + RequiresCondition: owned-by-ai + Armament@0: + Weapon: Subjugate + Health: + HP: 500000 + ExternalCondition@ENRICHED: + Condition: enriched + RevealsShroud: + Range: 20c0 + RevealsShroudMultiplier@1: + Modifier: 130 + RequiresCondition: enriched == 1 + RevealsShroudMultiplier@2: + Modifier: 160 + RequiresCondition: enriched == 2 + RevealsShroudMultiplier@3: + Modifier: 190 + RequiresCondition: enriched >= 3 + +BIO: + Tooltip: + Name: Tiberium Enrichment Facility + Health: + HP: 120000 + -ProvidesPrerequisite@mortar: + -ProvidesPrerequisite@toxintruck: + +TTRK: + -Buildable: + +DOME: + -AirstrikePowerCA@spyplane: + -ParatroopersPowerCA@paratroopers: + AirstrikePowerCA@MutaBomb: + RequiresCondition: bombs-enabled + -Prerequisites: + -PauseOnCondition: + ExternalCondition@BombsEnabled: + Condition: bombs-enabled + +HPAD: + -AirstrikePowerCA@Russianparabombs: + AirstrikePowerCA@ChaosBombs: + RequiresCondition: bombs-enabled + -Prerequisites: + -PauseOnCondition: + ExternalCondition@BombsEnabled: + Condition: bombs-enabled + +SILO: + Power: + Amount: 0 + +YURI: + Inherits@CAMPAIGNDISABLED: ^Disabled + +MCV: + Inherits@CAMPAIGNDISABLED: ^Disabled + +BRUT: + Inherits@CAMPAIGNDISABLED: ^Disabled + +SHOK: + Inherits@CAMPAIGNDISABLED: ^Disabled + +THF: + Inherits@CAMPAIGNDISABLED: ^Disabled + +DOG: + Inherits@CAMPAIGNDISABLED: ^Disabled + +BORI: + Inherits@CAMPAIGNDISABLED: ^Disabled + +HALO: + Inherits@MC: ^MindControllable + Buildable: + Prerequisites: hpad + Health: + HP: 17000 + KillsSelf@YURIMC: + RequiresCondition: yurimc + GrantConditionOnBotOwner@YURIMC: + Bots: campaign + Condition: yurimc + -EjectOnDeath: + +HIND: + Inherits@MC: ^MindControllable + Buildable: + Prerequisites: hpad + Health: + HP: 17000 + +YAK: + Inherits@CAMPAIGNDISABLED: ^Disabled + +MIG: + Inherits@CAMPAIGNDISABLED: ^Disabled + +KIRO: + Inherits@CAMPAIGNDISABLED: ^Disabled + +SUK: + Inherits@CAMPAIGNDISABLED: ^Disabled + +shrw.upgrade: + Inherits@CAMPAIGNDISABLED: ^Disabled + +E4: + Inherits@CAMPAIGNDISABLED: ^Disabled + +TTRA: + Inherits@CAMPAIGNDISABLED: ^Disabled + +APOC: + Inherits@CAMPAIGNDISABLED: ^Disabled + +E6: + Voiced: + VoiceSet: GenericVoice + +3TNK.YURI: + Voiced: + VoiceSet: VehicleVoice + AttackTurreted: + -Voice: + Mobile: + -Voice: + Passenger: + -Voice: diff --git a/mods/ca/missions/main-campaign/ca23-subjugation/subjugation-weapons.yaml b/mods/ca/missions/main-campaign/ca23-subjugation/subjugation-weapons.yaml new file mode 100644 index 0000000000..40e7f6782e --- /dev/null +++ b/mods/ca/missions/main-campaign/ca23-subjugation/subjugation-weapons.yaml @@ -0,0 +1,43 @@ +Subjugate: + ReloadDelay: 5 + Range: 20c0 + Report: iyurat1a.aud + ValidTargets: MindControllable + InvalidTargets: MindControlImmune, YuriMindControlImmune + Projectile: InstantHit + Warhead@1Change: ChangeOwner + Range: 0c511 + ValidRelationships: Enemy + ValidTargets: MindControllable + InvalidTargets: MindControlImmune, YuriMindControlImmune + +TPWRZap: + Warhead@1Dam: SpreadDamage + Damage: 20 + +TPWRArc1: + Warhead@1Dam: SpreadDamage + Damage: 20 + +TPWRArc2: + Warhead@1Dam: SpreadDamage + Damage: 20 + +ChainGun: + InvalidTargets: Mastermind + Warhead@1Dam: SpreadDamage + InvalidTargets: Mastermind + +HindRockets: + InvalidTargets: Infantry, Mastermind + Warhead@1Dam: SpreadDamage + InvalidTargets: Mastermind + +HindRockets.AnyTarget: + InvalidTargets: Mastermind + +EnslaveInfantry: + InvalidTargets: Vehicle, Ship, MindControlImmune, Air + +EnslaveVehicle: + InvalidTargets: Infantry, MindControlImmune, Air diff --git a/mods/ca/missions/main-campaign/ca23-subjugation/subjugation.lua b/mods/ca/missions/main-campaign/ca23-subjugation/subjugation.lua new file mode 100644 index 0000000000..155b83fcc8 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca23-subjugation/subjugation.lua @@ -0,0 +1,402 @@ +MissionDir = "ca|missions/main-campaign/ca23-subjugation" + +RespawnEnabled = Map.LobbyOption("respawn") == "enabled" + +PowerGrids = { + { + Providers = { NPower1, NPower2, NPower3, NPower4 }, + Consumers = { NPowered1, NPowered2, NPowered3, NPowered4, NPowered5, NPowered6 }, + }, + { + Providers = { EPower1, EPower2, EPower3 }, + Consumers = { EPowered1, EPowered2, EPowered3, EPowered4, EPowered5 }, + }, + { + Providers = { SPower1, SPower2, SPower3 }, + Consumers = { SPowered1, SPowered2, SPowered3, SPowered4, SPowered5, SPowered6, SPowered7 }, + }, + { + Providers = { CPower1, CPower2, CPower3, CPower4 }, + Consumers = { CPowered1, CPowered2, CPowered3, CPowered4, CPowered5, CPowered6, CPowered7, CPowered8, CPowered9, CPowered10, CPowered11, CPowered12, CPowered13, CPowered14, CPowered15, CPowered16 }, + }, +} + +TibTrucks = { + First = { + Actor = ETibTruck, + Delay = { + easy = DateTime.Minutes(6), + normal = DateTime.Minutes(5), + hard = DateTime.Minutes(4), + vhard = DateTime.Minutes(4), + brutal = DateTime.Minutes(4), + }, + Path = { ETibTruckPath1.Location, ETibTruckPath2.Location, ETibTruckPath3.Location, ETibTruckPath4.Location }, + ObjectiveText = "Prevent first enriched Tiberium delivery\nfrom reaching Yuri.", + Objective = nil, + }, + Second = { + Actor = NTibTruck, + Delay = { + easy = DateTime.Minutes(15), + normal = DateTime.Minutes(12), + hard = DateTime.Minutes(10), + vhard = DateTime.Minutes(10), + brutal = DateTime.Minutes(10), + }, + Path = { NTibTruckPath1.Location, NTibTruckPath2.Location, NTibTruckPath3.Location, NTibTruckPath4.Location, NTibTruckPath5.Location, NTibTruckPath6.Location, NTibTruckPath7.Location, NTibTruckPath8.Location, NTibTruckPath9.Location, NTibTruckPath10.Location }, + ObjectiveText = "Prevent second enriched Tiberium delivery\nfrom reaching Yuri.", + Objective = nil, + }, + Third = { + Actor = STibTruck, + Delay = { + easy = DateTime.Minutes(25), + normal = DateTime.Minutes(20), + hard = DateTime.Minutes(16), + vhard = DateTime.Minutes(16), + brutal = DateTime.Minutes(16), + }, + Path = { STibTruckPath1.Location, STibTruckPath2.Location, STibTruckPath3.Location, STibTruckPath4.Location, STibTruckPath5.Location, STibTruckPath6.Location }, + ObjectiveText = "Prevent third enriched Tiberium delivery\nfrom reaching Yuri.", + Objective = nil, + }, +} + +TibFacilities = { NTibFacility, STibFacility, ETibFacility } + +HindPatrolPath = { HindPatrol1.Location, HindPatrol2.Location, HindPatrol3.Location, HindPatrol4.Location, HindPatrol5.Location, HindPatrol6.Location, HindPatrol7.Location, HindPatrol8.Location, HindPatrol9.Location } + +BombsEnabledTime = { + vhard = DateTime.Minutes(20), + brutal = DateTime.Minutes(10), +} + +Squads = { + Main = { + Delay = AdjustDelayForDifficulty(DateTime.Minutes(6)), + AttackValuePerSecond = { + vhard = { Min = 5, Max = 15 }, + brutal = { Min = 10, Max = 20 }, + }, + FollowLeader = true, + ProducerActors = { Infantry = { NorthEastBarracks, NorthWestBarracks, SouthEastBarracks, SouthWestBarracks, CentralBarracks } }, + Compositions = AdjustCompositionsForDifficulty({ + { Infantry = { "e3", "e1", "e1", "e1", "e1", "e2", "brut" } }, + { Infantry = { "e3", "e2", "tplr", "e1", "e1", "e1", "e1" } }, + { Infantry = { "e3", "e2", "enli", "e1", "e1", "e1", "e1" }, MinTime = DateTime.Minutes(16) }, + { Infantry = { "e3", "e2", "rmbc", "e1", "e1", "e1", "e1" }, MinTime = DateTime.Minutes(20) }, + }), + }, +} + +SetupPlayers = function() + Scrin = Player.GetPlayer("Scrin") + USSR = Player.GetPlayer("USSR") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = { Scrin } + MissionEnemies = { USSR } +end + +WorldLoaded = function() + SetupPlayers() + + TimerTicks = 0 + TibFacilitiesCaptured = 0 + Camera.Position = PlayerStart.CenterPosition + + InitObjectives(Scrin) + InitUSSR() + + ObjectiveCaptureTibFacilities = Scrin.AddObjective("Capture three Tiberium enrichment facilities.") + if not RespawnEnabled then + ObjectiveMastermindSurvives = Scrin.AddObjective("Mastermind must survive.") + end + + Mastermind.GrantCondition("difficulty-" .. Difficulty) + + if IsHardOrAbove() then + CapturedCreditsAmount = 1000 + elseif Difficulty == "normal" then + CapturedCreditsAmount = 1250 + elseif Difficulty == "easy" then + CapturedCreditsAmount = 1500 + end + + Utils.Do(MissionPlayers, function(p) + Actor.Create("blink.upgrade", true, { Owner = p }) + Actor.Create("radar.dummy", true, { Owner = p }) + end) + + Trigger.AfterDelay(DateTime.Seconds(7), function() + Media.DisplayMessage("Your powers are no match for me. Flee through your wormholes, while you can.", "Yuri", HSLColor.FromHex("FF00BB")) + MediaCA.PlaySound(MissionDir .. "/yuri_taunt.aud", 2) + Trigger.AfterDelay(DateTime.Seconds(7), function() + Tip("The Mastermind can mind control up to three enemy units. Mind controlling a fourth will kill the earliest controlled.") + Trigger.AfterDelay(DateTime.Seconds(7), function() + Tip("The Mastermind has a targeted ability that creates mind sparks from himself and his slaves which damage and slow nearby enemies (the slaves will be unharmed).") + Trigger.AfterDelay(DateTime.Seconds(7), function() + Tip("The Mastermind can take control of enemy buildings. Production structures will be able to produce permanently enslaved units.") + Trigger.AfterDelay(DateTime.Seconds(7), function() + Tip("Stay out of Yuri's area of influence until your Mastermind becomes powerful enough to protect your units.") + end) + end) + end) + end) + end) + + MastermindDeathTrigger(Mastermind) + + Utils.Do(PowerGrids, function(grid) + Trigger.OnAllKilledOrCaptured(grid.Providers, function() + Utils.Do(grid.Consumers, function(consumer) + if not consumer.IsDead then + consumer.GrantCondition("disabled") + end + end) + end) + end) + + Utils.Do(TibFacilities, function(a) + Trigger.OnKilled(a, function(self, killer) + if not IsMissionPlayer(self.Owner) then + Scrin.MarkFailedObjective(ObjectiveCaptureTibFacilities) + end + end) + + Trigger.OnCapture(a, function(self, captor, oldOwner, newOwner) + if IsMissionPlayer(newOwner) then + TibFacilitiesCaptured = TibFacilitiesCaptured + 1 + Mastermind.GrantCondition("rank-veteran") + Mastermind.Health = Mastermind.MaxHealth + end + + if TibFacilitiesCaptured == 3 then + if ObjectiveCaptureYuriHQ == nil then + ObjectiveCaptureYuriHQ = Scrin.AddObjective("Capture Yuri's command center.") + end + Scrin.MarkCompletedObjective(ObjectiveCaptureTibFacilities) + Trigger.AfterDelay(DateTime.Seconds(2), function() + Notification("Enriched ichor consumed. Your Mastermind has become a Prodigy and is able to protect nearby units from Yuri's influence.") + MediaCA.PlaySound(MissionDir .. "/s_prodigy.aud", 2) + end) + else + Trigger.AfterDelay(DateTime.Seconds(2), function() + Notification("Enriched ichor consumed. Mastermind mind control capacity increased by 1.") + MediaCA.PlaySound(MissionDir .. "/s_ichorconsumed.aud", 2) + end) + end + end) + end) + + Trigger.OnKilled(YuriHQ, function(self, killer) + if ObjectiveCaptureYuriHQ == nil then + ObjectiveCaptureYuriHQ = Scrin.AddObjective("Capture Yuri's command center.") + end + + if not IsMissionPlayer(self.Owner) then + Scrin.MarkFailedObjective(ObjectiveCaptureYuriHQ) + end + end) + + Trigger.OnCapture(YuriHQ, function(self, captor, oldOwner, newOwner) + if ObjectiveCaptureYuriHQ == nil then + ObjectiveCaptureYuriHQ = Scrin.AddObjective("Capture Yuri's command center.") + end + + Scrin.MarkCompletedObjective(ObjectiveCaptureYuriHQ) + if not RespawnEnabled then + Scrin.MarkCompletedObjective(ObjectiveMastermindSurvives) + end + end) + + Utils.Do(TibTrucks, function(t) + Trigger.AfterDelay(t.Delay[Difficulty], function() + if not t.Actor.IsDead and t.Actor.Owner == USSR and t.Objective == nil then + + if not FirstShipmentAnnounced then + FirstShipmentAnnounced = true + Notification("Enriched ichor shipment detected. Dispatch is imminent. Prevent it from reaching Yuri's command center.") + MediaCA.PlaySound(MissionDir .. "/s_firstichorshipment.aud", 2) + else + Notification("Enriched ichor shipment detected.") + MediaCA.PlaySound(MissionDir .. "/s_ichorshipment.aud", 2) + end + + t.Objective = Scrin.AddSecondaryObjective(t.ObjectiveText) + local camera = Actor.Create("smallcamera", true, { Owner = Scrin, Location = t.Actor.Location }) + Trigger.AfterDelay(DateTime.Seconds(10), function() + camera.Destroy() + end) + Beacon.New(Scrin, t.Actor.CenterPosition) + Trigger.AfterDelay(DateTime.Seconds(30), function() + if not t.Actor.IsDead and t.Actor.Owner == USSR and not Scrin.IsObjectiveFailed(t.Objective) then + Utils.Do(t.Path, function(waypoint) + t.Actor.Move(waypoint) + end) + Trigger.OnEnteredFootprint({ t.Path[#t.Path] }, function(a, id) + if not YuriHQ.IsDead and YuriHQ.Owner == USSR and a == t.Actor and a.Owner == USSR then + Trigger.RemoveFootprintTrigger(id) + YuriHQ.GrantCondition("enriched") + a.Destroy() + Notification("A shipment of enriched ichor has reached Yuri's command center and he has grown more powerful.") + MediaCA.PlaySound(MissionDir .. "/s_yuripower.aud", 2) + if t.Objective ~= nil and not Scrin.IsObjectiveCompleted(t.Objective) then + Scrin.MarkFailedObjective(t.Objective) + end + end + end) + end + end) + end + end) + Trigger.OnKilled(t.Actor, function(self, killer) + if t.Objective == nil then + t.Objective = Scrin.AddSecondaryObjective(t.ObjectiveText) + end + Trigger.AfterDelay(2, function() + if not Scrin.IsObjectiveFailed(t.Objective) then + Scrin.MarkCompletedObjective(t.Objective) + end + end) + end) + end) + + Trigger.OnEnteredProximityTrigger(YuriHQ.CenterPosition, WDist.New(18 * 1024), function(a, id) + if IsMissionPlayer(a.Owner) and a.Type ~= "smallcamera" then + Trigger.RemoveProximityTrigger(id) + if not YuriDefenderTipShown then + YuriDefenderTipShown = true + Tip("Yuri's command center is heavily guarded. Brute force is unlikely to be the best approach.") + end + end + end) + + SetupReveals({ EntranceReveal1, EntranceReveal2, EntranceReveal3, EntranceReveal4, EntranceReveal5, EntranceReveal6, EntranceReveal7, EntranceReveal8, EntranceReveal9, EntranceReveal10, EntranceReveal11 }, "smallcamera") + AfterWorldLoaded() +end + +Tick = function() + OncePerSecondChecks() + OncePerFiveSecondChecks() + AfterTick() +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + USSR.Resources = USSR.ResourceCapacity - 500 + + if TimerTicks > 0 then + if TimerTicks > 25 then + TimerTicks = TimerTicks - 25 + else + TimerTicks = 0 + end + end + end +end + +OncePerFiveSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 125 == 0 then + UpdatePlayerBaseLocations() + + Utils.Do(TibTrucks, function(t) + if not t.Actor.IsDead and IsMissionPlayer(t.Actor.Owner) then + if t.Objective ~= nil and not Scrin.IsObjectiveFailed(t.Objective) then + Scrin.MarkCompletedObjective(t.Objective) + end + end + end) + end +end + +InitUSSR = function() + AutoRepairBuildings(USSR) + SetupRefAndSilosCaptureCredits(USSR) + InitAiUpgrades(USSR, 0) + + if IsVeryHardOrAbove() then + InitAttackSquad(Squads.Main, USSR) + Trigger.AfterDelay(BombsEnabledTime[Difficulty], function() + if not CentralDome.IsDead then + CentralDome.GrantCondition("bombs-enabled") + end + if not CentralHelipad.IsDead then + CentralHelipad.GrantCondition("bombs-enabled") + end + end) + end + + Actor.Create("ai.unlimited.power", true, { Owner = USSR }) + Actor.Create("cyborgspeed.upgrade", true, { Owner = USSR }) + Actor.Create("cyborgarmor.upgrade", true, { Owner = USSR }) + + local ussrGroundAttackers = USSR.GetGroundAttackers() + + Utils.Do(ussrGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsUSSRGroundHunterUnit) + end) + + local hinds = USSR.GetActorsByType("hind") + Utils.Do(hinds, function(a) + a.Patrol(HindPatrolPath, true) + Trigger.OnDamaged(a, function(self, attacker, damage) + if not self.IsDead and self.AmmoCount() == 0 then + Trigger.ClearAll(self) + self.Stop() + self.ReturnToBase() + Trigger.AfterDelay(DateTime.Seconds(1), function() + if not self.IsDead then + self.Patrol(HindPatrolPath, true) + end + end) + end + end) + end) +end + +RespawnMastermind = function() + local mastermindName = "Mastermind" + + if TibFacilitiesCaptured == 3 then + mastermindName = "Prodigy" + end + + Notification("The " .. mastermindName .. " used its considerable psionic powers to cheat death. It will return in 20 seconds.") + + Trigger.AfterDelay(DateTime.Seconds(20), function() + local wormhole = Actor.Create("wormhole", true, { Owner = Scrin, Location = PlayerStart.Location }) + Beacon.New(Scrin, PlayerStart.CenterPosition, DateTime.Seconds(20)) + + Trigger.AfterDelay(DateTime.Seconds(2), function() + PlaySpeechNotificationToMissionPlayers("ReinforcementsArrived") + Mastermind = Reinforcements.Reinforce(Scrin, { "mast" }, { PlayerStart.Location }, 1)[1] + Mastermind.Scatter() + + if IsNormalOrBelow() then + Mastermind.GrantCondition("difficulty-" .. Difficulty) + end + + for i=1, TibFacilitiesCaptured do + Mastermind.GrantCondition("rank-veteran") + end + + Trigger.AfterDelay(DateTime.Seconds(5), function() + wormhole.Kill() + end) + + MastermindDeathTrigger(Mastermind) + end) + end) +end + +MastermindDeathTrigger = function(mastermind) + Trigger.OnKilled(mastermind, function(self, killer) + if RespawnEnabled then + RespawnMastermind() + else + Scrin.MarkFailedObjective(ObjectiveMastermindSurvives) + end + end) +end diff --git a/mods/ca/missions/main-campaign/ca23-subjugation/yuri_taunt.aud b/mods/ca/missions/main-campaign/ca23-subjugation/yuri_taunt.aud new file mode 100644 index 0000000000..eb5b048142 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca23-subjugation/yuri_taunt.aud differ diff --git a/mods/ca/missions/main-campaign/ca24-culmination/brown.pal b/mods/ca/missions/main-campaign/ca24-culmination/brown.pal new file mode 100644 index 0000000000..706111e8f8 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca24-culmination/brown.pal differ diff --git a/mods/ca/missions/main-campaign/ca24-culmination/culmination-rules.yaml b/mods/ca/missions/main-campaign/ca24-culmination/culmination-rules.yaml new file mode 100644 index 0000000000..7211f20de1 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca24-culmination/culmination-rules.yaml @@ -0,0 +1,165 @@ + +^Palettes: + TintPostProcessEffect: + Red: 1 + Green: 1 + Blue: 1.2 + Ambient: 0.8 + PaletteFromFile@terrain-temperat: + Filename: ca|missions/main-campaign/ca24-culmination/brown.pal + FlashPostProcessEffect@Subjugation: + Type: Subjugation + Color: a400f2 + +World: + LuaScript: + Scripts: campaign.lua, culmination.lua + MissionData: + Briefing: The cyborg army is now under our control. Our Mastermind has grown substantially in power - becoming a Prodigy - and has supplanted Yuri as the master of this cybernetic force. Yuri has been imprisoned, he may prove useful.\n\nThe cyborgs will all but ensure our primary goal is achieved here, but we must leave nothing to chance. Our Prodigy has accumulated a vast amount of psionic energy, and the Supervisor believes we should remove all possibility of defeat by subjugating additional human forces.\n\nWe have drawn three of the most weakened human factions into a trap. They believe our Prodigy is vulnerable and that they have an opportunity to eliminate it, but in reality the Prodigy will be able to take control of an entire base from a great distance. Use your best judgement to decide which faction to bring under your control first. The Prodigy will only be able to perform this feat once and then will need to leave the battlefield to recuperate, so the other two factions will need to be subjugated more gradually. + MapOptions: + ShortGameCheckboxEnabled: False + MusicPlaylist: + StartingMusic: timebomb + +Player: + PlayerResources: + DefaultCash: 6000 + +# Enable subfaction specific tech + +STCR: + Buildable: + Prerequisites: anyradar, ~vehicles.scrin + +LCHR: + Buildable: + Prerequisites: anyradar, ~vehicles.scrin + +RUIN: + Buildable: + Prerequisites: scrt, ~vehicles.scrin + +OBLT: + Buildable: + Prerequisites: scrt, ~vehicles.scrin + +ATMZ: + Buildable: + Prerequisites: scrt, ~vehicles.scrin + +ENRV: + Buildable: + Prerequisites: scrt, ~aircraft.scrin + +stellar.upgrade: + Buildable: + Prerequisites: scrt + +coalescence.upgrade: + Buildable: + Prerequisites: scrt + +# Disable tech + +RMBO: + Inherits@CAMPAIGNDISABLED: ^Disabled + +BORI: + Inherits@CAMPAIGNDISABLED: ^Disabled + +E7: + Inherits@CAMPAIGNDISABLED: ^Disabled + +MSHP: + Inherits@CAMPAIGNDISABLED: ^Disabled + +# Misc + +WORMHOLE.Exit: + Inherits: ^WormholeBase + RenderSprites: + Image: wormhole + Immobile: + OccupiesSpace: false + Health: + HP: 300000 + +MAST: + GainsExperienceMultiplier@ThirdXp: + Modifier: 33 + +PDGY: + GrantExternalConditionPowerCA@Subjugation: + OrderName: subjugation + Icon: subjugation + IconPalette: chromes + ChargeInterval: 125 + ExplosionWeapon: SubjugationSpawner + Name: Subjugation + Condition: subjugated + Range: 18c0 + MinTargets: 1 + ValidTargets: Infantry, Vehicle, Ship, Structure + ValidRelationships: Enemy + Duration: 25 + AllowMultiple: false + Description: \nPermanently mind controls units and structures in target area. + OnFireSound: mastermind-fire.aud + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + InsufficientPowerSpeechNotification: InsufficientPower + EndChargeSpeechNotification: SubjugationReady + EndChargeTextNotification: Subjugation ready. + DisplayRadarPing: True + Cursor: mc-capture + SupportPowerPaletteOrder: 0 + ShowTargetCircle: true + ShowSelectionBoxes: true + TargetTintColor: a400f233 + TargetCircleColor: a400f2cc + SelectionBoxColor: a400f2 + OneShot: true + +subjugation.dummy: + Interactable: + Bounds: 64, 64 + ScriptTriggers: + RenderSprites: + Image: empty + WithSpriteBody: + ClassicFacingBodyOrientation: + QuantizedFacings: 1 + HiddenUnderFog: + Type: GroundPosition + HitShape: + Immobile: + OccupiesSpace: false + PeriodicExplosion: + Weapon: SubjugationEffect + KillsSelf: + Delay: 25 + +^Infantry: + ExternalCondition@Subjugatable: + Condition: subjugated + WithColoredOverlay@Subjugated: + RequiresCondition: subjugated + Color: a400f233 + +^Building: + ExternalCondition@Subjugatable: + Condition: subjugated + WithColoredOverlay@Subjugated: + RequiresCondition: subjugated + Color: a400f233 + +^Vehicle-NOUPG: + ExternalCondition@Subjugatable: + Condition: subjugated + WithColoredOverlay@Subjugated: + RequiresCondition: subjugated + Color: a400f233 + +# Hunt() requires only 1 AttackBase +BATF.AI: + -AttackFrontal: diff --git a/mods/ca/missions/main-campaign/ca24-culmination/culmination-sequences.yaml b/mods/ca/missions/main-campaign/ca24-culmination/culmination-sequences.yaml new file mode 100644 index 0000000000..a71f7a8dc1 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca24-culmination/culmination-sequences.yaml @@ -0,0 +1,3 @@ +icon: + subjugation: + Filename: ca|missions/main-campaign/ca24-culmination/subjugationicon.shp diff --git a/mods/ca/missions/main-campaign/ca24-culmination/culmination-weapons.yaml b/mods/ca/missions/main-campaign/ca24-culmination/culmination-weapons.yaml new file mode 100644 index 0000000000..ba31654d29 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca24-culmination/culmination-weapons.yaml @@ -0,0 +1,20 @@ +SubjugationSpawner: + Projectile: InstantHit + ReloadDelay: 5000 + Warhead@Spawn: SpawnActor + Actors: subjugation.dummy + Range: 1 + ForceGround: false + ValidTargets: Ground, Water + ImpactActors: false + +SubjugationEffect: + Projectile: InstantHit + ReloadDelay: 5000 + Warhead@FlashEffect: FlashEffect + Duration: 20 + FlashType: Subjugation + Warhead@1Change: ChangeOwner + Range: 18c0 + ValidRelationships: Enemy + ValidTargets: Infantry, Vehicle, Ship, Structure diff --git a/mods/ca/missions/main-campaign/ca24-culmination/culmination.lua b/mods/ca/missions/main-campaign/ca24-culmination/culmination.lua new file mode 100644 index 0000000000..43eee89756 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca24-culmination/culmination.lua @@ -0,0 +1,452 @@ +MissionDir = "ca|missions/main-campaign/ca24-culmination" + +AlliedSavedAdvancedBuildings = {} +USSRSavedAdvancedBuildings = {} +NodSavedAdvancedBuildings = {} + +AlliesVsNodPaths = { { AlliesVsNodRally1.Location }, { AlliesVsNodRally2.Location }, { AlliesVsNodRally3.Location }, { AlliesVsNodRally4.Location } } +AlliesVsSovietPaths = { { AlliesVsSovietsRally1.Location }, { AlliesVsSovietsRally2.Location }, { AlliesVsSovietsRally3.Location }, { AlliesVsSovietsRally4.Location } } +SovietsVsNodPaths = { { SovietsVsNodRally1.Location }, { SovietsVsNodRally2.Location }, { SovietsVsNodRally3.Location }, { SovietsVsNodRally4.Location } } +SovietsVsAlliesPaths = { { SovietsVsAlliesRally1.Location }, { SovietsVsAlliesRally2.Location }, { SovietsVsAlliesRally3.Location }, { SovietsVsAlliesRally4.Location } } +NodVsAlliesPaths = { { NodVsAlliesRally1.Location }, { NodVsAlliesRally2.Location }, { NodVsAlliesRally3.Location } } +NodVsSovietPaths = { { NodVsSovietsRally1.Location }, { NodVsSovietsRally2.Location }, { NodVsSovietsRally3.Location } } + +NodBaseCameras = { NodBaseCam1, NodBaseCam2, NodBaseCam3 } +AlliedBaseCameras = { AlliedBaseCam1, AlliedBaseCam2 } +SovietBaseCameras = { SovietBaseCam1, SovietBaseCam2, SovietBaseCam3 } + +SuperweaponsEnabledTime = { + easy = DateTime.Seconds((60 * 45) + 17), + normal = DateTime.Seconds((60 * 30) + 17), + hard = DateTime.Seconds((60 * 15) + 17), + vhard = DateTime.Seconds((60 * 10) + 17), + brutal = DateTime.Seconds((60 * 8) + 17) +} + +Squads = { + Allies = { + InitTimeAdjustment = -DateTime.Minutes(10), + Delay = AdjustDelayForDifficulty(DateTime.Minutes(1)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 20, Max = 40, RampDuration = DateTime.Minutes(12) }), + FollowLeader = true, + Compositions = AdjustCompositionsForDifficulty(UnitCompositions.Allied), + AttackPaths = { + -- set on init + }, + }, + Nod = { + InitTimeAdjustment = -DateTime.Minutes(10), + Delay = AdjustDelayForDifficulty(DateTime.Minutes(1)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 20, Max = 40, RampDuration = DateTime.Minutes(12) }), + DispatchDelay = DateTime.Seconds(15), + FollowLeader = true, + Compositions = AdjustCompositionsForDifficulty(UnitCompositions.Nod), + AttackPaths = { + -- set on init + }, + }, + Soviets = { + InitTimeAdjustment = -DateTime.Minutes(10), + Delay = AdjustDelayForDifficulty(DateTime.Minutes(1)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 20, Max = 40, RampDuration = DateTime.Minutes(12) }), + FollowLeader = true, + Compositions = AdjustCompositionsForDifficulty(UnitCompositions.Soviet), + AttackPaths = { + -- set on init + }, + }, + AlliedAir = { + Delay = AdjustAirDelayForDifficulty(DateTime.Minutes(4)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 12, Max = 20 }), + Compositions = AirCompositions.Allied, + }, + NodAir = { + Delay = AdjustAirDelayForDifficulty(DateTime.Minutes(4)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 12, Max = 20 }), + Compositions = AirCompositions.Nod, + }, + SovietAir = { + Delay = AdjustAirDelayForDifficulty(DateTime.Minutes(4)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 12, Max = 20 }), + Compositions = AirCompositions.Soviet, + } +} + +-- Setup and Tick + +SetupPlayers = function() + Scrin = Player.GetPlayer("Scrin") + ScrinNoControl = Player.GetPlayer("ScrinNoControl") + USSR = Player.GetPlayer("USSR") + Greece = Player.GetPlayer("Greece") + Nod = Player.GetPlayer("Nod") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = { Scrin } + MissionEnemies = { USSR, Greece, Nod } +end + +WorldLoaded = function() + SetupPlayers() + + TimerTicks = 0 + Camera.Position = PlayerStart.CenterPosition + + InitObjectives(Scrin) + AdjustPlayerStartingCashForDifficulty() + + ObjectiveInitialSubjugation = Scrin.AddObjective("Subjugate one of the three human bases.") + + local greeceAdvancedBuildings = Greece.GetActorsByTypes({ "atek", "alhq", "weat", "pdox", "dome", "hpad" }) + local ussrAdvancedBuildings = USSR.GetActorsByTypes({ "stek", "npwr", "mslo", "iron", "dome", "afld" }) + local nodAdvancedBuildings = Nod.GetActorsByTypes({ "tmpl", "tmpp", "sgen", "mslo.nod", "hq", "hpad.td" }) + + table.insert(greeceAdvancedBuildings, AlliedExtraPower1) + table.insert(greeceAdvancedBuildings, AlliedExtraPower2) + table.insert(nodAdvancedBuildings, NodExtraPower1) + table.insert(nodAdvancedBuildings, NodExtraPower2) + + Utils.Do(greeceAdvancedBuildings, function(a) + local building = { Type = a.Type, Location = a.Location } + table.insert(AlliedSavedAdvancedBuildings, building) + a.Destroy() + end) + + Utils.Do(ussrAdvancedBuildings, function(a) + local building = { Type = a.Type, Location = a.Location } + table.insert(USSRSavedAdvancedBuildings, building) + a.Destroy() + end) + + Utils.Do(nodAdvancedBuildings, function(a) + local building = { Type = a.Type, Location = a.Location } + table.insert(NodSavedAdvancedBuildings, building) + a.Destroy() + end) + + Utils.Do(MissionPlayers, function(p) + Actor.Create("radar.dummy", true, { Owner = p }) + end) + + local nodCamera = Actor.Create("largecamera", true, { Owner = Scrin, Location = NodBase.Location }) + local greeceCamera = Actor.Create("largecamera", true, { Owner = Scrin, Location = AlliedBase.Location }) + local ussrCamera = Actor.Create("largecamera", true, { Owner = Scrin, Location = SovietBase.Location }) + + Trigger.OnEnteredProximityTrigger(AlliedBase.CenterPosition, WDist.New(14 * 1024), function(a, id) + if IsMissionPlayer(a.Owner) and a.Type == "subjugation.dummy" then + Trigger.RemoveProximityTrigger(id) + + if not Scrin.IsObjectiveCompleted(ObjectiveInitialSubjugation) then + ObjectiveSubjugateRemaining = Scrin.AddObjective("Capture Nod and Soviet Construction Yards.") + Scrin.MarkCompletedObjective(ObjectiveInitialSubjugation) + DestroyCameras() + WarpOutProdigy() + InitUSSR(SovietsVsAlliesPaths, AlliedBaseCameras) + InitNod(NodVsAlliesPaths, AlliedBaseCameras) + CreateWormholes(AlliedBase.Location) + Trigger.AfterDelay(1, function() + Utils.Do(MissionPlayers, function(p) + Actor.Create("QueueUpdaterDummy", true, { Owner = p }) + end) + end) + SetupMainObjectives({ NodConyard, SovietConyard }) + if IsHardOrAbove() then + Trigger.AfterDelay(DateTime.Minutes(1), function() + local alliedGroundAttackers = Utils.Where(Greece.GetGroundAttackers(), IsGreeceGroundHunterUnit) + Utils.Do(alliedGroundAttackers, IdleHunt) + end) + end + end + end + end) + + Trigger.OnEnteredProximityTrigger(SovietBase.CenterPosition, WDist.New(14 * 1024), function(a, id) + if IsMissionPlayer(a.Owner) and a.Type == "subjugation.dummy" then + Trigger.RemoveProximityTrigger(id) + if not Scrin.IsObjectiveCompleted(ObjectiveInitialSubjugation) then + ObjectiveSubjugateRemaining = Scrin.AddObjective("Capture Allied and Nod Construction Yards.") + Scrin.MarkCompletedObjective(ObjectiveInitialSubjugation) + DestroyCameras() + WarpOutProdigy() + InitGreece(AlliesVsSovietPaths, SovietBaseCameras) + InitNod(NodVsSovietPaths, SovietBaseCameras) + CreateWormholes(SovietBase.Location) + Trigger.AfterDelay(1, function() + Utils.Do(MissionPlayers, function(p) + Actor.Create("QueueUpdaterDummy", true, { Owner = p }) + end) + end) + SetupMainObjectives({ NodConyard, AlliedConyard }) + if IsHardOrAbove() then + Trigger.AfterDelay(DateTime.Minutes(1), function() + local ussrGroundAttackers = Utils.Where(USSR.GetGroundAttackers(), IsUSSRGroundHunterUnit) + Utils.Do(ussrGroundAttackers, IdleHunt) + end) + end + end + end + end) + + Trigger.OnEnteredProximityTrigger(NodBase.CenterPosition, WDist.New(14 * 1024), function(a, id) + if IsMissionPlayer(a.Owner) and a.Type == "subjugation.dummy" then + Trigger.RemoveProximityTrigger(id) + if not Scrin.IsObjectiveCompleted(ObjectiveInitialSubjugation) then + ObjectiveSubjugateRemaining = Scrin.AddObjective("Capture Allied and Soviet Construction Yards.") + Scrin.MarkCompletedObjective(ObjectiveInitialSubjugation) + DestroyCameras() + WarpOutProdigy() + InitUSSR(SovietsVsNodPaths, NodBaseCameras) + InitGreece(AlliesVsNodPaths, NodBaseCameras) + CreateWormholes(NodBase.Location) + Trigger.AfterDelay(1, function() + Utils.Do(MissionPlayers, function(p) + Actor.Create("QueueUpdaterDummy", true, { Owner = p }) + end) + end) + SetupMainObjectives({ SovietConyard, AlliedConyard }) + if IsHardOrAbove() then + Trigger.AfterDelay(DateTime.Minutes(1), function() + local nodGroundAttackers = Utils.Where(Nod.GetGroundAttackers(), IsNodGroundHunterUnit) + Utils.Do(nodGroundAttackers, IdleHunt) + end) + end + end + end + end) + + AfterWorldLoaded() +end + +Tick = function() + OncePerSecondChecks() + OncePerFiveSecondChecks() + OncePerThirtySecondChecks() + AfterTick() +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + Greece.Resources = Greece.ResourceCapacity - 500 + Nod.Resources = Nod.ResourceCapacity - 500 + USSR.Resources = USSR.ResourceCapacity - 500 + + if TimerTicks > 0 then + if TimerTicks > 25 then + TimerTicks = TimerTicks - 25 + UserInterface.SetMissionText("Wormhole closes in " .. UtilsCA.FormatTimeForGameSpeed(TimerTicks), HSLColor.Yellow) + else + TimerTicks = 0 + UserInterface.SetMissionText("") + Wormhole1.Kill() + Wormhole2.Kill() + end + end + + if MissionPlayersHaveNoRequiredUnits() then + if ObjectiveInitialSubjugation ~= nil and not Scrin.IsObjectiveCompleted(ObjectiveInitialSubjugation) then + Scrin.MarkFailedObjective(ObjectiveInitialSubjugation) + end + + if ObjectiveSubjugateRemaining ~= nil and not Scrin.IsObjectiveCompleted(ObjectiveSubjugateRemaining) then + Scrin.MarkFailedObjective(ObjectiveSubjugateRemaining) + end + + if ObjectiveDefeatRemaining ~= nil and not Scrin.IsObjectiveCompleted(ObjectiveDefeatRemaining) then + Scrin.MarkFailedObjective(ObjectiveDefeatRemaining) + end + end + end +end + +OncePerFiveSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 125 == 0 then + UpdatePlayerBaseLocations() + + if ObjectiveDefeatRemaining ~= nil and not Scrin.IsObjectiveCompleted(ObjectiveDefeatRemaining) then + if not PlayerHasBuildings(Greece) and not PlayerHasBuildings(USSR) and not PlayerHasBuildings(Nod) then + Scrin.MarkCompletedObjective(ObjectiveDefeatRemaining) + end + end + end +end + +OncePerThirtySecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % DateTime.Seconds(30) == 0 then + CalculatePlayerCharacteristics() + end +end + +-- Functions + +InitUSSR = function(paths, cameras) + Squads.Soviets.AttackPaths = paths + + InitAttackSquad(Squads.Soviets, USSR) + InitAirAttackSquad(Squads.SovietAir, USSR) + + local ussrGroundAttackers = USSR.GetGroundAttackers() + + Utils.Do(ussrGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsUSSRGroundHunterUnit) + end) + + Trigger.AfterDelay(DateTime.Seconds(1), function() + Utils.Do(USSRSavedAdvancedBuildings, function(b) + Actor.Create(b.Type, true, { Location = b.Location, Owner = USSR }) + end) + + Trigger.AfterDelay(1, function() + AutoRepairAndRebuildBuildings(USSR) + SetupRefAndSilosCaptureCredits(USSR) + AutoReplaceHarvesters(USSR) + AutoRebuildConyards(USSR) + InitAiUpgrades(USSR) + end) + end) + + Trigger.AfterDelay(SuperweaponsEnabledTime[Difficulty], function() + Actor.Create("ai.superweapons.enabled", true, { Owner = USSR }) + Actor.Create("ai.minor.superweapons.enabled", true, { Owner = USSR }) + end) + + Utils.Do(cameras, function(c) + Actor.Create("largecamera", true, { Owner = USSR, Location = c.Location }) + end) +end + +InitGreece = function(paths, cameras) + Squads.Allies.AttackPaths = paths + + InitAttackSquad(Squads.Allies, Greece) + InitAirAttackSquad(Squads.AlliedAir, Greece) + + local greeceGroundAttackers = Greece.GetGroundAttackers() + + Utils.Do(greeceGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsGreeceGroundHunterUnit) + end) + + Trigger.AfterDelay(DateTime.Seconds(1), function() + Utils.Do(AlliedSavedAdvancedBuildings, function(b) + Actor.Create(b.Type, true, { Location = b.Location, Owner = Greece }) + end) + + Trigger.AfterDelay(1, function() + AutoRepairAndRebuildBuildings(Greece) + SetupRefAndSilosCaptureCredits(Greece) + AutoReplaceHarvesters(Greece) + AutoRebuildConyards(Greece) + InitAiUpgrades(Greece) + end) + end) + + Trigger.AfterDelay(SuperweaponsEnabledTime[Difficulty], function() + Actor.Create("ai.superweapons.enabled", true, { Owner = Greece }) + Actor.Create("ai.minor.superweapons.enabled", true, { Owner = Greece }) + end) + + Utils.Do(cameras, function(c) + Actor.Create("largecamera", true, { Owner = Greece, Location = c.Location }) + end) +end + +InitNod = function(paths, cameras) + Squads.Nod.AttackPaths = paths + + InitAttackSquad(Squads.Nod, Nod) + InitAirAttackSquad(Squads.NodAir, Nod) + + local nodGroundAttackers = Nod.GetGroundAttackers() + + Utils.Do(nodGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsNodGroundHunterUnit) + end) + + Trigger.AfterDelay(DateTime.Seconds(1), function() + Utils.Do(NodSavedAdvancedBuildings, function(b) + Actor.Create(b.Type, true, { Location = b.Location, Owner = Nod }) + end) + + Trigger.AfterDelay(1, function() + AutoRepairAndRebuildBuildings(Nod) + SetupRefAndSilosCaptureCredits(Nod) + AutoReplaceHarvesters(Nod) + AutoRebuildConyards(Nod) + InitAiUpgrades(Nod) + end) + end) + + Trigger.AfterDelay(SuperweaponsEnabledTime[Difficulty], function() + Actor.Create("ai.superweapons.enabled", true, { Owner = Nod }) + Actor.Create("ai.minor.superweapons.enabled", true, { Owner = Nod }) + end) + + Utils.Do(cameras, function(c) + Actor.Create("largecamera", true, { Owner = Nod, Location = c.Location }) + end) +end + +DestroyCameras = function() + Utils.Do(Scrin.GetActorsByType("largecamera"), function(a) + a.Destroy() + end) +end + +CreateWormholes = function(dest) + Wormhole1 = Actor.Create("wormhole", true, { Owner = Scrin, Location = PlayerStart.Location }) + Wormhole2 = Actor.Create("wormhole", true, { Owner = Scrin, Location = dest }) + TimerTicks = DateTime.Minutes(1) +end + +SetupMainObjectives = function(conyards) + ObjectiveDefeatRemaining = Scrin.AddObjective("Defeat the remaining human forces.") + ConyardsCaptured = 0 + + Utils.Do(conyards, function(c) + Trigger.OnCapture(c, function(self, captor, oldOwner, newOwner) + if IsMissionPlayer(newOwner) then + ConyardsCaptured = ConyardsCaptured + 1 + if ConyardsCaptured == 2 then + Scrin.MarkCompletedObjective(ObjectiveSubjugateRemaining) + end + end + end) + + Trigger.OnKilled(c, function(self, killer) + if not IsMissionPlayer(self.Owner) then + Scrin.MarkFailedObjective(ObjectiveSubjugateRemaining) + end + end) + end) +end + +WarpOutProdigy = function() + Prodigy.Owner = ScrinNoControl + Prodigy.Stop() + Trigger.AfterDelay(DateTime.Seconds(3), function() + Notification("The Prodigy will now leave the battlefield to recuperate.") + local prodigyExitWormhole = Actor.Create("wormhole.exit", true, { Owner = ScrinNoControl, Location = ProdigyExit.Location }) + Prodigy.Move(prodigyExitWormhole.Location) + Trigger.OnEnteredFootprint({ ProdigyExit.Location }, function(a, id) + if a == Prodigy then + Trigger.RemoveFootprintTrigger(id) + Prodigy.Destroy() + Trigger.AfterDelay(DateTime.Seconds(2), function() + if not prodigyExitWormhole.IsDead then + prodigyExitWormhole.Kill() + end + end) + end + end) + Trigger.AfterDelay(DateTime.Seconds(20), function() + if not Prodigy.IsDead then + Prodigy.Destroy() + end + if not prodigyExitWormhole.IsDead then + prodigyExitWormhole.Kill() + end + end) + end) +end diff --git a/mods/ca/missions/main-campaign/ca24-culmination/map.bin b/mods/ca/missions/main-campaign/ca24-culmination/map.bin new file mode 100644 index 0000000000..027ee06468 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca24-culmination/map.bin differ diff --git a/mods/ca/missions/main-campaign/ca24-culmination/map.png b/mods/ca/missions/main-campaign/ca24-culmination/map.png new file mode 100644 index 0000000000..be9534972c Binary files /dev/null and b/mods/ca/missions/main-campaign/ca24-culmination/map.png differ diff --git a/mods/ca/missions/main-campaign/ca24-culmination/map.yaml b/mods/ca/missions/main-campaign/ca24-culmination/map.yaml new file mode 100644 index 0000000000..4bd39c3e7b --- /dev/null +++ b/mods/ca/missions/main-campaign/ca24-culmination/map.yaml @@ -0,0 +1,7904 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 24: Culmination + +Author: Darkademic + +Tileset: TEMPERAT + +MapSize: 146,130 + +Bounds: 1,1,144,128 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: USSR, Greece, Nod, Scrin + PlayerReference@Scrin: + Name: Scrin + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: scrin + LockColor: True + Color: 7700FF + LockSpawn: True + LockTeam: True + Enemies: USSR, Greece, Nod, Creeps + PlayerReference@Greece: + Name: Greece + Bot: campaign + Faction: allies + Color: 99ACF2 + Allies: USSR, Nod + Enemies: Scrin, Creeps + PlayerReference@USSR: + Name: USSR + Bot: campaign + Faction: soviet + Color: FE1100 + Allies: Nod, Greece + Enemies: Scrin, Creeps + PlayerReference@Nod: + Name: Nod + Bot: campaign + Faction: nod + Color: 6D738C + Allies: Greece, USSR + Enemies: Scrin, Creeps + PlayerReference@ScrinNoControl: + Name: ScrinNoControl + NonCombatant: True + Faction: scrin + Color: 7700FF + Allies: Scrin + +Actors: + Actor0: tc05 + Owner: Neutral + Location: 18,39 + Actor2: tc05 + Owner: Neutral + Location: 1,57 + Actor3: tc05 + Owner: Neutral + Location: 39,76 + Actor4: tc05.husk + Owner: Neutral + Location: 0,125 + Actor5: tc05 + Owner: Neutral + Location: 123,55 + Actor6: tc05 + Owner: Neutral + Location: 96,87 + Actor7: tc05 + Owner: Neutral + Location: 45,79 + Actor8: tc05 + Owner: Neutral + Location: 97,19 + Actor9: tc05 + Owner: Neutral + Location: 124,68 + Actor11: tc03 + Owner: Neutral + Location: 59,94 + Actor12: tc03 + Owner: Neutral + Location: 114,22 + Actor15: tc03 + Owner: Neutral + Location: 4,127 + Actor16: tc04 + Owner: Neutral + Location: 98,102 + Actor17: tc04 + Owner: Neutral + Location: 142,69 + Actor18: tc04 + Owner: Neutral + Location: 91,19 + Actor19: tc03 + Owner: Neutral + Location: 90,86 + Actor20: tc03 + Owner: Neutral + Location: 38,21 + Actor21: tc03 + Owner: Neutral + Location: 40,24 + Actor22: tc03 + Owner: Neutral + Location: 37,26 + Actor23: tc04 + Owner: Neutral + Location: 55,99 + Actor24: tc03 + Owner: Neutral + Location: 35,88 + Actor25: tc03 + Owner: Neutral + Location: 31,26 + Actor26: tc04 + Owner: Neutral + Location: 50,74 + Actor27: tc03 + Owner: Neutral + Location: 48,77 + Actor28: tc03.husk + Owner: Neutral + Location: 2,62 + Actor29: tc03 + Owner: Neutral + Location: 38,23 + Actor30: tc03 + Owner: Neutral + Location: 88,17 + Actor32: tc04 + Owner: Neutral + Location: 55,111 + Actor34: tc02 + Owner: Neutral + Location: 114,47 + Actor35: tc02 + Owner: Neutral + Location: 82,120 + Actor36: tc02 + Owner: Neutral + Location: 140,19 + Actor37: tc02 + Owner: Neutral + Location: 49,83 + Actor38: tc02 + Owner: Neutral + Location: 109,37 + Actor39: tc02 + Owner: Neutral + Location: 41,43 + Actor40: tc02 + Owner: Neutral + Location: 11,127 + Actor41: tc02 + Owner: Neutral + Location: 41,25 + Actor43: tc02 + Owner: Neutral + Location: 4,125 + Actor45: tc02 + Owner: Neutral + Location: 52,83 + Actor48: tc02 + Owner: Neutral + Location: 49,78 + Actor50: tc02.husk + Owner: Neutral + Location: 33,26 + Actor51: tc02 + Owner: Neutral + Location: 105,88 + Actor52: t15 + Owner: Neutral + Location: 45,75 + Actor53: t11 + Owner: Neutral + Location: 90,122 + Actor54: t14.husk + Owner: Neutral + Location: 29,24 + Actor55: t14 + Owner: Neutral + Location: 113,51 + Actor56: tc01 + Owner: Neutral + Location: 7,126 + Actor57: t15 + Owner: Neutral + Location: 81,1 + Actor58: tc01 + Owner: Neutral + Location: 6,71 + Actor59: t15 + Owner: Neutral + Location: 114,53 + Actor60: t15 + Owner: Neutral + Location: 16,128 + Actor61: tc01 + Owner: Neutral + Location: 53,94 + Actor63: t15 + Owner: Neutral + Location: 98,100 + Actor64: t15 + Owner: Neutral + Location: 92,84 + Actor65: tc01 + Owner: Neutral + Location: 90,81 + Actor66: tc01 + Owner: Neutral + Location: 88,20 + Actor67: t14 + Owner: Neutral + Location: 50,79 + Actor69: t14.husk + Owner: Neutral + Location: 69,63 + Actor71: t10.husk + Owner: Neutral + Location: 140,63 + Actor72: tc01 + Owner: Neutral + Location: 137,1 + Actor73: t14 + Owner: Neutral + Location: 61,42 + Actor74: t11 + Owner: Neutral + Location: 143,15 + Actor75: t11 + Owner: Neutral + Location: 26,93 + Actor76: t15 + Owner: Neutral + Location: 97,106 + Actor77: t10 + Owner: Neutral + Location: 50,76 + Actor78: tc01.husk + Owner: Neutral + Location: 54,81 + Actor79: t15 + Owner: Neutral + Location: 53,112 + Actor80: tc01 + Owner: Neutral + Location: 32,17 + Actor81: t11 + Owner: Neutral + Location: 89,126 + Actor82: t10 + Owner: Neutral + Location: 51,80 + Actor83: tc01 + Owner: Neutral + Location: 8,10 + Actor84: t14 + Owner: Neutral + Location: 104,44 + Actor85: tc01 + Owner: Neutral + Location: 6,70 + Actor86: t14 + Owner: Neutral + Location: 93,88 + Actor88: t15 + Owner: Neutral + Location: 94,102 + Actor89: t15 + Owner: Neutral + Location: 42,21 + Actor90: t14 + Owner: Neutral + Location: 68,61 + Actor91: t11 + Owner: Neutral + Location: 104,86 + Actor92: t11 + Owner: Neutral + Location: 19,25 + Actor93: t15 + Owner: Neutral + Location: 57,94 + Actor94: tc01 + Owner: Neutral + Location: 89,24 + Actor95: t15 + Owner: Neutral + Location: 138,2 + Actor96: t15 + Owner: Neutral + Location: 95,111 + Actor97: t11 + Owner: Neutral + Location: 32,87 + Actor98: t15 + Owner: Neutral + Location: 90,38 + Actor99: tc01 + Owner: Neutral + Location: 56,78 + Actor100: t15 + Owner: Neutral + Location: 125,70 + Actor101: tc01 + Owner: Neutral + Location: 60,45 + Actor102: t15 + Owner: Neutral + Location: 84,0 + Actor103: t14 + Owner: Neutral + Location: 94,84 + Actor105: t11 + Owner: Neutral + Location: 3,70 + Actor106: t15 + Owner: Neutral + Location: 10,126 + Actor107: t10 + Owner: Neutral + Location: 63,61 + Actor108: t14.husk + Owner: Neutral + Location: 18,24 + Actor109: tc01 + Owner: Neutral + Location: 98,90 + Actor111: t10 + Owner: Neutral + Location: 11,125 + Actor112: tc01 + Owner: Neutral + Location: 143,10 + Actor113: t14 + Owner: Neutral + Location: 3,82 + Actor114: t11 + Owner: Neutral + Location: 53,77 + Actor115: t15 + Owner: Neutral + Location: 142,11 + Actor116: t11 + Owner: Neutral + Location: 91,121 + Actor117: t10 + Owner: Neutral + Location: 102,66 + Actor118: tc01 + Owner: Neutral + Location: 107,44 + Actor119: t15 + Owner: Neutral + Location: 50,73 + Actor121: t15 + Owner: Neutral + Location: 142,12 + Actor122: t15 + Owner: Neutral + Location: 94,81 + Actor123: t14.husk + Owner: Neutral + Location: 36,23 + Actor124: t10 + Owner: Neutral + Location: 42,22 + Actor125: t11 + Owner: Neutral + Location: 87,126 + Actor126: t10 + Owner: Neutral + Location: 15,125 + Actor127: t10 + Owner: Neutral + Location: 126,65 + Actor128: t14 + Owner: Neutral + Location: 58,111 + Actor129: tc01.husk + Owner: Neutral + Location: 9,127 + Actor131: t10 + Owner: Neutral + Location: 112,48 + Actor132: tc01 + Owner: Neutral + Location: 36,20 + Actor133: t11 + Owner: Neutral + Location: 0,122 + Actor135: tc01 + Owner: Neutral + Location: 104,67 + Actor136: t10.husk + Owner: Neutral + Location: 124,51 + Actor137: t15 + Owner: Neutral + Location: 56,80 + Actor138: t11 + Owner: Neutral + Location: 84,119 + Actor139: t14 + Owner: Neutral + Location: 144,107 + Actor140: t15 + Owner: Neutral + Location: 52,75 + Actor142: t11.husk + Owner: Neutral + Location: 72,36 + Actor143: t15 + Owner: Neutral + Location: 105,42 + Actor144: t14 + Owner: Neutral + Location: 2,54 + Actor145: t15.husk + Owner: Neutral + Location: 121,52 + Actor146: t11 + Owner: Neutral + Location: 53,73 + Actor147: t10 + Owner: Neutral + Location: 104,69 + Actor148: t14 + Owner: Neutral + Location: 48,12 + Actor149: t14 + Owner: Neutral + Location: 34,27 + Actor151: t11.husk + Owner: Neutral + Location: 2,77 + Actor152: t11 + Owner: Neutral + Location: 102,87 + Actor154: t10 + Owner: Neutral + Location: 95,82 + Actor155: t10 + Owner: Neutral + Location: 90,83 + Actor157: t10 + Owner: Neutral + Location: 144,66 + Actor158: t14 + Owner: Neutral + Location: 144,122 + Actor159: tc01 + Owner: Neutral + Location: 46,81 + Actor160: t15 + Owner: Neutral + Location: 31,28 + Actor161: t10 + Owner: Neutral + Location: 53,98 + Actor162: t11 + Owner: Neutral + Location: 82,121 + Actor163: t10 + Owner: Neutral + Location: 94,99 + Actor164: t15 + Owner: Neutral + Location: 54,95 + Actor165: t11 + Owner: Neutral + Location: 95,109 + Actor167: t15 + Owner: Neutral + Location: 66,64 + Actor168: t10 + Owner: Neutral + Location: 53,74 + Actor169: t15 + Owner: Neutral + Location: 32,19 + Actor170: tc01 + Owner: Neutral + Location: 57,95 + Actor171: tc01 + Owner: Neutral + Location: 54,78 + Actor172: tc01.husk + Owner: Neutral + Location: 20,26 + Actor173: t10 + Owner: Neutral + Location: 128,66 + Actor174: t14 + Owner: Neutral + Location: 143,7 + Actor175: t15.husk + Owner: Neutral + Location: 44,109 + Actor176: t14 + Owner: Neutral + Location: 89,84 + Actor177: t10 + Owner: Neutral + Location: 48,11 + Actor178: t11 + Owner: Neutral + Location: 30,20 + Actor179: t11 + Owner: Neutral + Location: 91,120 + Actor180: t15 + Owner: Neutral + Location: 64,45 + Actor181: t11 + Owner: Neutral + Location: 82,124 + Actor183: t11.husk + Owner: Neutral + Location: 116,93 + Actor184: tc01 + Owner: Neutral + Location: 95,79 + Actor185: tc01 + Owner: Neutral + Location: 88,18 + Actor186: t10 + Owner: Neutral + Location: 29,23 + Actor187: t15 + Owner: Neutral + Location: 143,68 + Actor188: tc01.husk + Owner: Neutral + Location: 90,37 + Actor190: t14 + Owner: Neutral + Location: 19,23 + Actor191: t14 + Owner: Neutral + Location: 110,39 + Actor192: t11 + Owner: Neutral + Location: 131,67 + Actor193: t15 + Owner: Neutral + Location: 112,43 + Actor194: t11 + Owner: Neutral + Location: 3,80 + Actor195: t10 + Owner: Neutral + Location: 86,107 + Actor196: t10 + Owner: Neutral + Location: 3,53 + Actor197: tc01 + Owner: Neutral + Location: 7,128 + Actor198: t15 + Owner: Neutral + Location: 116,95 + Actor199: tc01 + Owner: Neutral + Location: 56,112 + Actor200: t15 + Owner: Neutral + Location: 104,70 + Actor203: t10 + Owner: Neutral + Location: 56,96 + Actor206: t10 + Owner: Neutral + Location: 112,38 + Actor209: t14 + Owner: Neutral + Location: 113,103 + Actor210: t15 + Owner: Neutral + Location: 88,122 + Actor211: t11 + Owner: Neutral + Location: 93,89 + Actor212: t10 + Owner: Neutral + Location: 93,122 + Actor213: t15 + Owner: Neutral + Location: 93,87 + Actor214: t10 + Owner: Neutral + Location: 58,97 + Actor215: t11 + Owner: Neutral + Location: 40,78 + Actor217: tc01 + Owner: Neutral + Location: 51,81 + Actor218: t15 + Owner: Neutral + Location: 98,44 + Actor219: tc01 + Owner: Neutral + Location: 37,24 + Actor220: t11 + Owner: Neutral + Location: 144,65 + Actor221: t14 + Owner: Neutral + Location: 142,18 + Actor222: t15 + Owner: Neutral + Location: 123,66 + Actor223: t11 + Owner: Neutral + Location: 140,1 + Actor225: t14.husk + Owner: Neutral + Location: 82,122 + Actor226: t14 + Owner: Neutral + Location: 58,80 + Actor227: t11 + Owner: Neutral + Location: 93,86 + Actor228: t11 + Owner: Neutral + Location: 96,107 + Actor229: t15 + Owner: Neutral + Location: 98,101 + Actor230: t11 + Owner: Neutral + Location: 102,69 + Actor231: t14 + Owner: Neutral + Location: 94,42 + Actor232: t10 + Owner: Neutral + Location: 96,20 + Actor234: t10 + Owner: Neutral + Location: 8,6 + Actor235: t14 + Owner: Neutral + Location: 88,14 + Actor236: t11 + Owner: Neutral + Location: 58,90 + Actor237: t14 + Owner: Neutral + Location: 34,21 + Actor238: tc01 + Owner: Neutral + Location: 96,85 + Actor239: t11 + Owner: Neutral + Location: 140,15 + Actor240: t10.husk + Owner: Neutral + Location: 4,77 + Actor241: t11 + Owner: Neutral + Location: 86,19 + Actor242: tc01 + Owner: Neutral + Location: 143,67 + Actor243: tc01 + Owner: Neutral + Location: 1,73 + Actor245: t08 + Owner: Neutral + Location: 92,89 + Actor246: t02 + Owner: Neutral + Location: 29,21 + Actor247: t03 + Owner: Neutral + Location: 86,17 + Actor248: t03 + Owner: Neutral + Location: 84,118 + Actor249: t07 + Owner: Neutral + Location: 4,60 + Actor250: t17.husk + Owner: Neutral + Location: 34,23 + Actor251: t13 + Owner: Neutral + Location: 96,32 + Actor252: t12 + Owner: Neutral + Location: 43,77 + Actor253: t01 + Owner: Neutral + Location: 0,85 + Actor254: t16 + Owner: Neutral + Location: 6,125 + Actor255: t05 + Owner: Neutral + Location: 143,17 + Actor256: t17 + Owner: Neutral + Location: 37,128 + Actor257: t02 + Owner: Neutral + Location: 2,78 + Actor258: t06 + Owner: Neutral + Location: 1,121 + Actor259: t01 + Owner: Neutral + Location: 90,36 + Actor260: t05 + Owner: Neutral + Location: 120,67 + Actor261: t08 + Owner: Neutral + Location: 145,12 + Actor262: t06 + Owner: Neutral + Location: 4,55 + Actor263: t01 + Owner: Neutral + Location: 110,40 + Actor264: t16 + Owner: Neutral + Location: 140,13 + Actor265: t12 + Owner: Neutral + Location: 130,68 + Actor266: t03 + Owner: Neutral + Location: 60,79 + Actor267: t05 + Owner: Neutral + Location: 105,63 + Actor268: t07 + Owner: Neutral + Location: 143,13 + Actor269: t12 + Owner: Neutral + Location: 26,91 + Actor270: t13 + Owner: Neutral + Location: 111,43 + Actor271: t02 + Owner: Neutral + Location: 19,38 + Actor272: t17 + Owner: Neutral + Location: 21,27 + Actor274: t05 + Owner: Neutral + Location: 92,36 + Actor275: t13 + Owner: Neutral + Location: 97,102 + Actor276: t13 + Owner: Neutral + Location: 4,128 + Actor277: t12 + Owner: Neutral + Location: 42,74 + Actor278: t16 + Owner: Neutral + Location: 66,67 + Actor279: t02 + Owner: Neutral + Location: 125,50 + Actor280: t13 + Owner: Neutral + Location: 19,22 + Actor281: t03 + Owner: Neutral + Location: 40,59 + Actor282: t16.husk + Owner: Neutral + Location: 92,99 + Actor283: t17 + Owner: Neutral + Location: 55,72 + Actor284: t01 + Owner: Neutral + Location: 100,90 + Actor285: t03 + Owner: Neutral + Location: 7,127 + Actor286: t12.husk + Owner: Neutral + Location: 123,58 + Actor287: t16 + Owner: Neutral + Location: 47,82 + Actor288: t08 + Owner: Neutral + Location: 17,30 + Actor289: t02 + Owner: Neutral + Location: 10,116 + Actor290: t03 + Owner: Neutral + Location: 145,94 + Actor292: t02 + Owner: Neutral + Location: 8,42 + Actor293: t05 + Owner: Neutral + Location: 117,92 + Actor294: t03 + Owner: Neutral + Location: 56,113 + Actor295: t07 + Owner: Neutral + Location: 44,79 + Actor296: t02 + Owner: Neutral + Location: 60,40 + Actor297: t03 + Owner: Neutral + Location: 3,73 + Actor299: t08 + Owner: Neutral + Location: 145,94 + Actor300: t12 + Owner: Neutral + Location: 3,79 + Actor301: t08 + Owner: Neutral + Location: 7,11 + Actor302: t01 + Owner: Neutral + Location: 67,63 + Actor303: t01 + Owner: Neutral + Location: 92,41 + Actor304: t03 + Owner: Neutral + Location: 47,9 + Actor305: t05 + Owner: Neutral + Location: 132,68 + Actor307: t08 + Owner: Neutral + Location: 56,101 + Actor308: t02 + Owner: Neutral + Location: 82,77 + Actor309: t16 + Owner: Neutral + Location: 113,96 + Actor310: t16 + Owner: Neutral + Location: 108,43 + Actor311: t12 + Owner: Neutral + Location: 89,36 + Actor312: t12 + Owner: Neutral + Location: 133,11 + Actor313: t05.husk + Owner: Neutral + Location: 142,14 + Actor314: t08 + Owner: Neutral + Location: 35,26 + Actor315: t13 + Owner: Neutral + Location: 2,86 + Actor316: t12 + Owner: Neutral + Location: 145,102 + Actor317: t06 + Owner: Neutral + Location: 105,43 + Actor318: t02 + Owner: Neutral + Location: 47,11 + Actor320: t07 + Owner: Neutral + Location: 107,87 + Actor321: t08.husk + Owner: Neutral + Location: 142,18 + Actor322: t01 + Owner: Neutral + Location: 117,97 + Actor323: t13 + Owner: Neutral + Location: 92,98 + Actor324: t03 + Owner: Neutral + Location: 125,52 + Actor325: t06 + Owner: Neutral + Location: 98,43 + Actor326: t03 + Owner: Neutral + Location: 61,48 + Actor327: t12 + Owner: Neutral + Location: 83,75 + Actor328: t05 + Owner: Neutral + Location: 52,95 + Actor329: t17 + Owner: Neutral + Location: 33,24 + Actor330: t13 + Owner: Neutral + Location: 68,60 + Actor332: t06.husk + Owner: Neutral + Location: 113,49 + Actor333: t02 + Owner: Neutral + Location: 37,30 + Actor334: t13 + Owner: Neutral + Location: 25,92 + Actor335: t16.husk + Owner: Neutral + Location: 77,32 + Actor336: t13 + Owner: Neutral + Location: 128,69 + Actor337: t13 + Owner: Neutral + Location: 39,61 + Actor338: t17 + Owner: Neutral + Location: 52,98 + Actor339: t07 + Owner: Neutral + Location: 64,44 + Actor340: t06 + Owner: Neutral + Location: 70,78 + Actor341: t06 + Owner: Neutral + Location: 94,21 + Actor342: t03 + Owner: Neutral + Location: 97,36 + Actor343: t08 + Owner: Neutral + Location: 45,78 + Actor345: t12.husk + Owner: Neutral + Location: 101,119 + Actor346: t08 + Owner: Neutral + Location: 100,101 + Actor347: t12 + Owner: Neutral + Location: 108,46 + Actor348: t07 + Owner: Neutral + Location: 66,62 + Actor349: t17 + Owner: Neutral + Location: 70,64 + Actor350: t02 + Owner: Neutral + Location: 24,12 + Actor351: t03 + Owner: Neutral + Location: 121,99 + Actor352: t03 + Owner: Neutral + Location: 94,36 + Actor353: t02 + Owner: Neutral + Location: 107,64 + Actor354: t01 + Owner: Neutral + Location: 140,18 + Actor355: t06 + Owner: Neutral + Location: 99,88 + Actor356: t07 + Owner: Neutral + Location: 55,79 + Actor357: t01 + Owner: Neutral + Location: 96,19 + Actor358: t05 + Owner: Neutral + Location: 121,66 + Actor359: t03.husk + Owner: Neutral + Location: 143,9 + Actor360: t17 + Owner: Neutral + Location: 21,36 + Actor361: t13 + Owner: Neutral + Location: 39,90 + Actor362: t05 + Owner: Neutral + Location: 115,48 + Actor363: t13 + Owner: Neutral + Location: 97,42 + Actor364: t03.husk + Owner: Neutral + Location: 144,11 + Actor365: t06 + Owner: Neutral + Location: 142,66 + Actor366: t03 + Owner: Neutral + Location: 54,79 + Actor367: t01 + Owner: Neutral + Location: 48,7 + Actor368: t03 + Owner: Neutral + Location: 39,93 + Actor369: t16 + Owner: Neutral + Location: 113,55 + Actor370: t03 + Owner: Neutral + Location: 33,27 + Actor371: t05 + Owner: Neutral + Location: 144,19 + Actor372: t01 + Owner: Neutral + Location: 122,98 + Actor373: t12 + Owner: Neutral + Location: 85,121 + Actor374: t12 + Owner: Neutral + Location: 94,40 + Actor375: t08.husk + Owner: Neutral + Location: 18,41 + Actor376: t03 + Owner: Neutral + Location: 86,121 + Actor377: t01 + Owner: Neutral + Location: 11,4 + Actor378: t16 + Owner: Neutral + Location: 18,127 + Actor379: t08 + Owner: Neutral + Location: 26,90 + Actor380: t02 + Owner: Neutral + Location: 113,40 + Actor381: t16 + Owner: Neutral + Location: 43,25 + Actor382: t13 + Owner: Neutral + Location: 104,66 + Actor383: t05 + Owner: Neutral + Location: 120,98 + Actor384: t13 + Owner: Neutral + Location: 142,74 + Actor385: t12 + Owner: Neutral + Location: 14,125 + Actor386: t02 + Owner: Neutral + Location: 88,128 + Actor387: t13 + Owner: Neutral + Location: 42,58 + Actor388: t03 + Owner: Neutral + Location: 41,57 + Actor389: t12 + Owner: Neutral + Location: 19,125 + Actor390: t12 + Owner: Neutral + Location: 94,110 + Actor391: t17 + Owner: Neutral + Location: 29,22 + Actor392: t02 + Owner: Neutral + Location: 103,43 + Actor393: t06 + Owner: Neutral + Location: 48,10 + Actor394: t07 + Owner: Neutral + Location: 89,15 + Actor395: t17 + Owner: Neutral + Location: 4,61 + Actor396: t06 + Owner: Neutral + Location: 83,118 + Actor397: t12 + Owner: Neutral + Location: 90,21 + Actor398: t01 + Owner: Neutral + Location: 41,20 + Actor399: t01 + Owner: Neutral + Location: 85,122 + Actor400: t02 + Owner: Neutral + Location: 27,90 + Actor401: t02 + Owner: Neutral + Location: 127,66 + Actor402: t13 + Owner: Neutral + Location: 143,63 + Actor404: t13 + Owner: Neutral + Location: 45,73 + Actor405: t08 + Owner: Neutral + Location: 47,77 + Actor406: t08 + Owner: Neutral + Location: 48,14 + Actor407: t01 + Owner: Neutral + Location: 78,78 + Actor408: t16 + Owner: Neutral + Location: 53,99 + Actor409: t16 + Owner: Neutral + Location: 52,94 + Actor410: t16.husk + Owner: Neutral + Location: 33,18 + Actor411: t07 + Owner: Neutral + Location: 14,117 + Actor412: t03 + Owner: Neutral + Location: 96,89 + Actor415: t16 + Owner: Neutral + Location: 1,68 + Actor416: t03 + Owner: Neutral + Location: 80,80 + Actor417: t16 + Owner: Neutral + Location: 3,84 + Actor418: t02 + Owner: Neutral + Location: 90,23 + Actor419: t13 + Owner: Neutral + Location: 97,121 + Actor420: t16 + Owner: Neutral + Location: 83,0 + Actor421: t12 + Owner: Neutral + Location: 0,53 + Actor422: t05 + Owner: Neutral + Location: 31,18 + Actor423: t13 + Owner: Neutral + Location: 56,101 + Actor424: t16 + Owner: Neutral + Location: 9,124 + Actor425: t16 + Owner: Neutral + Location: 141,16 + Actor426: t13 + Owner: Neutral + Location: 3,122 + Actor427: t17 + Owner: Neutral + Location: 48,48 + Actor428: t17 + Owner: Neutral + Location: 31,27 + Actor429: t12 + Owner: Neutral + Location: 35,24 + Actor430: t08 + Owner: Neutral + Location: 42,27 + Actor431: t13.husk + Owner: Neutral + Location: 86,128 + Actor432: t17 + Owner: Neutral + Location: 91,87 + Actor433: t12 + Owner: Neutral + Location: 130,64 + Actor434: t07 + Owner: Neutral + Location: 68,62 + Actor435: t03 + Owner: Neutral + Location: 95,108 + Actor436: t08 + Owner: Neutral + Location: 128,52 + Actor437: t06 + Owner: Neutral + Location: 88,36 + Actor438: t02 + Owner: Neutral + Location: 95,33 + Actor439: t17 + Owner: Neutral + Location: 99,103 + Actor440: t17 + Owner: Neutral + Location: 116,55 + Actor441: t03 + Owner: Neutral + Location: 140,7 + Actor442: t16 + Owner: Neutral + Location: 127,68 + Actor443: t07.husk + Owner: Neutral + Location: 142,64 + Actor444: t16 + Owner: Neutral + Location: 1,61 + Actor445: t05 + Owner: Neutral + Location: 55,76 + Actor446: t06 + Owner: Neutral + Location: 97,112 + Actor447: t01 + Owner: Neutral + Location: 96,81 + Actor448: t05 + Owner: Neutral + Location: 54,99 + Actor449: t13 + Owner: Neutral + Location: 52,97 + Actor450: t03 + Owner: Neutral + Location: 16,126 + Actor452: t13 + Owner: Neutral + Location: 0,84 + Actor454: t03 + Owner: Neutral + Location: 85,126 + Actor455: t07 + Owner: Neutral + Location: 96,34 + Actor456: t08 + Owner: Neutral + Location: 116,23 + Actor458: t17 + Owner: Neutral + Location: 138,128 + Actor459: t12 + Owner: Neutral + Location: 116,54 + Actor460: t05 + Owner: Neutral + Location: 110,46 + Actor461: t07 + Owner: Neutral + Location: 3,125 + Actor462: t13 + Owner: Neutral + Location: 64,43 + Actor463: t06 + Owner: Neutral + Location: 35,20 + Actor464: t12 + Owner: Neutral + Location: 71,63 + Actor465: t17 + Owner: Neutral + Location: 107,67 + Actor466: t16 + Owner: Neutral + Location: 104,60 + Actor467: t08 + Owner: Neutral + Location: 123,57 + Actor468: t05 + Owner: Neutral + Location: 60,91 + Actor469: t02 + Owner: Neutral + Location: 44,76 + Actor470: t13 + Owner: Neutral + Location: 92,35 + Actor471: t02 + Owner: Neutral + Location: 5,81 + Actor472: t05 + Owner: Neutral + Location: 102,88 + Actor473: t06 + Owner: Neutral + Location: 103,44 + Actor474: t08.husk + Owner: Neutral + Location: 57,99 + Actor475: t06.husk + Owner: Neutral + Location: 142,3 + Actor476: t07.husk + Owner: Neutral + Location: 81,78 + Actor477: t07 + Owner: Neutral + Location: 98,120 + Actor478: t13 + Owner: Neutral + Location: 65,64 + Actor482: t03 + Owner: Neutral + Location: 3,55 + Actor483: t08 + Owner: Neutral + Location: 92,106 + Actor484: t01 + Owner: Neutral + Location: 94,101 + Actor485: t13 + Owner: Neutral + Location: 28,92 + Actor486: t08 + Owner: Neutral + Location: 17,39 + Actor487: t07 + Owner: Neutral + Location: 115,51 + Actor488: t13 + Owner: Neutral + Location: 69,77 + Actor489: t05 + Owner: Neutral + Location: 62,62 + Actor490: t07 + Owner: Neutral + Location: 144,0 + Actor491: t08 + Owner: Neutral + Location: 93,83 + Actor492: t05 + Owner: Neutral + Location: 43,74 + Actor493: t13 + Owner: Neutral + Location: 45,108 + Actor494: t06 + Owner: Neutral + Location: 111,38 + Actor495: t01 + Owner: Neutral + Location: 95,88 + Actor496: t05 + Owner: Neutral + Location: 34,19 + Actor497: t13 + Owner: Neutral + Location: 90,25 + Actor498: t16 + Owner: Neutral + Location: 107,38 + Actor499: t17 + Owner: Neutral + Location: 131,16 + Actor500: t07 + Owner: Neutral + Location: 88,35 + Actor501: t06 + Owner: Neutral + Location: 142,7 + Actor502: t12 + Owner: Neutral + Location: 142,73 + Actor503: t17 + Owner: Neutral + Location: 115,56 + Actor504: t02 + Owner: Neutral + Location: 84,121 + Actor506: t02 + Owner: Neutral + Location: 43,93 + Actor507: t06 + Owner: Neutral + Location: 123,94 + Actor508: t02.husk + Owner: Neutral + Location: 108,37 + Actor509: t08 + Owner: Neutral + Location: 95,38 + Actor511: t17.husk + Owner: Neutral + Location: 120,99 + Actor512: t13 + Owner: Neutral + Location: 30,22 + Actor513: t17 + Owner: Neutral + Location: 88,107 + Actor514: t16 + Owner: Neutral + Location: 34,22 + Actor515: t07 + Owner: Neutral + Location: 1,32 + Actor516: t05 + Owner: Neutral + Location: 50,11 + Actor517: t12 + Owner: Neutral + Location: 2,30 + Actor518: t17 + Owner: Neutral + Location: 93,97 + Actor520: t06 + Owner: Neutral + Location: 55,5 + Actor521: t17 + Owner: Neutral + Location: 120,121 + Actor523: t13 + Owner: Neutral + Location: 33,25 + Actor525: t05 + Owner: Neutral + Location: 109,98 + Actor526: t05 + Owner: Neutral + Location: 48,49 + Actor527: t16 + Owner: Neutral + Location: 92,122 + Actor528: t17 + Owner: Neutral + Location: 44,81 + Actor529: t17 + Owner: Neutral + Location: 15,126 + Actor530: t05 + Owner: Neutral + Location: 4,75 + Actor531: t17 + Owner: Neutral + Location: 144,14 + Actor533: t02 + Owner: Neutral + Location: 103,89 + Actor534: t12 + Owner: Neutral + Location: 89,125 + Actor535: t12 + Owner: Neutral + Location: 14,126 + Actor536: t16 + Owner: Neutral + Location: 3,126 + Actor537: t16 + Owner: Neutral + Location: 48,80 + Actor538: t13 + Owner: Neutral + Location: 124,67 + Actor539: t05 + Owner: Neutral + Location: 4,54 + Actor540: t01.husk + Owner: Neutral + Location: 104,63 + Actor541: t03 + Owner: Neutral + Location: 96,88 + Actor542: t17 + Owner: Neutral + Location: 139,1 + Actor543: t01 + Owner: Neutral + Location: 140,62 + Actor545: t02 + Owner: Neutral + Location: 34,90 + Actor546: t13 + Owner: Neutral + Location: 9,4 + Actor547: t07 + Owner: Neutral + Location: 96,104 + Actor548: t02 + Owner: Neutral + Location: 96,83 + Actor549: t06 + Owner: Neutral + Location: 141,14 + Actor550: t12 + Owner: Neutral + Location: 53,78 + Actor551: t17 + Owner: Neutral + Location: 124,54 + Actor552: t07 + Owner: Neutral + Location: 49,75 + Actor553: t06 + Owner: Neutral + Location: 2,121 + Actor554: t06 + Owner: Neutral + Location: 119,120 + Actor555: t13 + Owner: Neutral + Location: 19,11 + Actor556: t16 + Owner: Neutral + Location: 125,53 + Actor558: t17 + Owner: Neutral + Location: 113,50 + Actor559: t13 + Owner: Neutral + Location: 89,121 + Actor560: t01 + Owner: Neutral + Location: 67,59 + Actor561: t03 + Owner: Neutral + Location: 111,47 + Actor563: t17.husk + Owner: Neutral + Location: 60,90 + Actor564: t03.husk + Owner: Neutral + Location: 57,100 + Actor565: t13 + Owner: Neutral + Location: 1,78 + Actor566: t16 + Owner: Neutral + Location: 105,68 + Actor568: t05 + Owner: Neutral + Location: 101,88 + Actor569: t08 + Owner: Neutral + Location: 1,55 + Actor570: t07 + Owner: Neutral + Location: 58,114 + Actor571: t03 + Owner: Neutral + Location: 133,68 + Actor572: t03 + Owner: Neutral + Location: 67,56 + Actor574: t07 + Owner: Neutral + Location: 97,79 + Actor575: t01 + Owner: Neutral + Location: 86,127 + Actor576: t17 + Owner: Neutral + Location: 141,2 + Actor577: t16 + Owner: Neutral + Location: 125,71 + Actor579: t03 + Owner: Neutral + Location: 97,33 + Actor580: t03 + Owner: Neutral + Location: 3,81 + Actor581: t08.husk + Owner: Neutral + Location: 122,98 + Actor582: t07 + Owner: Neutral + Location: 44,74 + Actor583: t06 + Owner: Neutral + Location: 89,86 + Actor584: t02.husk + Owner: Neutral + Location: 141,8 + Actor585: t05 + Owner: Neutral + Location: 42,20 + Actor586: t08 + Owner: Neutral + Location: 37,30 + Actor587: t16 + Owner: Neutral + Location: 128,67 + Actor588: t08 + Owner: Neutral + Location: 80,80 + Actor589: t17 + Owner: Neutral + Location: 54,110 + Actor590: t06 + Owner: Neutral + Location: 53,114 + Actor591: t06 + Owner: Neutral + Location: 13,116 + Actor592: t05 + Owner: Neutral + Location: 143,65 + Actor593: t01 + Owner: Neutral + Location: 0,69 + Actor594: t13 + Owner: Neutral + Location: 54,80 + Actor595: t02 + Owner: Neutral + Location: 91,16 + Actor596: t13 + Owner: Neutral + Location: 9,7 + Actor597: t01 + Owner: Neutral + Location: 59,78 + Actor598: t12 + Owner: Neutral + Location: 110,38 + Actor599: t12 + Owner: Neutral + Location: 48,74 + Actor600: t13 + Owner: Neutral + Location: 2,120 + Actor601: t05 + Owner: Neutral + Location: 25,93 + Actor602: t02 + Owner: Neutral + Location: 95,101 + Actor603: t12 + Owner: Neutral + Location: 95,41 + Actor604: t05 + Owner: Neutral + Location: 8,127 + Actor605: t06 + Owner: Neutral + Location: 121,120 + Actor606: t16 + Owner: Neutral + Location: 52,73 + Actor607: t07 + Owner: Neutral + Location: 144,35 + Actor609: t16 + Owner: Neutral + Location: 95,85 + Actor610: t13 + Owner: Neutral + Location: 53,80 + Actor611: t02.husk + Owner: Neutral + Location: 2,83 + Actor612: t01 + Owner: Neutral + Location: 141,11 + Actor613: t13 + Owner: Neutral + Location: 40,41 + Actor614: t13 + Owner: Neutral + Location: 97,90 + Actor615: t13 + Owner: Neutral + Location: 36,21 + Actor616: t08 + Owner: Neutral + Location: 113,53 + Actor617: t02 + Owner: Neutral + Location: 81,122 + Actor618: t02 + Owner: Neutral + Location: 108,79 + Actor619: t01 + Owner: Neutral + Location: 76,78 + Actor620: t01 + Owner: Neutral + Location: 30,26 + Actor621: t02 + Owner: Neutral + Location: 58,110 + Actor622: t02 + Owner: Neutral + Location: 120,120 + Actor623: t02 + Owner: Neutral + Location: 36,19 + Actor625: t12 + Owner: Neutral + Location: 44,113 + Actor626: t08 + Owner: Neutral + Location: 104,88 + Actor627: t02 + Owner: Neutral + Location: 39,42 + Actor628: t02 + Owner: Neutral + Location: 3,83 + Actor629: t08 + Owner: Neutral + Location: 37,28 + Actor630: t01 + Owner: Neutral + Location: 2,64 + Actor632: t17 + Owner: Neutral + Location: 40,26 + Actor633: t02 + Owner: Neutral + Location: 116,96 + Actor634: t05 + Owner: Neutral + Location: 94,83 + Actor637: t17 + Owner: Neutral + Location: 61,93 + Actor638: t03 + Owner: Neutral + Location: 112,23 + Actor639: t07 + Owner: Neutral + Location: 43,79 + Actor640: t08 + Owner: Neutral + Location: 37,29 + Actor641: t02 + Owner: Neutral + Location: 95,89 + Actor642: t13 + Owner: Neutral + Location: 42,72 + Actor643: t08 + Owner: Neutral + Location: 50,11 + Actor644: t05 + Owner: Neutral + Location: 18,41 + Actor645: t17 + Owner: Neutral + Location: 47,74 + Actor646: t17 + Owner: Neutral + Location: 140,0 + Actor647: t03 + Owner: Neutral + Location: 57,101 + Actor648: t17 + Owner: Neutral + Location: 45,113 + Actor649: t12 + Owner: Neutral + Location: 117,96 + Actor650: t05 + Owner: Neutral + Location: 70,68 + Actor651: t12 + Owner: Neutral + Location: 104,41 + Actor653: t05 + Owner: Neutral + Location: 16,127 + Actor654: t08 + Owner: Neutral + Location: 126,52 + Actor655: t08 + Owner: Neutral + Location: 51,96 + Actor656: t01 + Owner: Neutral + Location: 144,78 + Actor657: t03 + Owner: Neutral + Location: 18,26 + Actor658: t06 + Owner: Neutral + Location: 8,8 + Actor660: t07 + Owner: Neutral + Location: 101,45 + Actor661: t05 + Owner: Neutral + Location: 144,16 + Actor662: t01 + Owner: Neutral + Location: 145,123 + Actor663: t12 + Owner: Neutral + Location: 91,36 + Actor664: t06 + Owner: Neutral + Location: 140,10 + Actor665: t16 + Owner: Neutral + Location: 105,89 + Actor666: t01 + Owner: Neutral + Location: 52,79 + Actor667: t02.husk + Owner: Neutral + Location: 17,127 + Actor668: t07 + Owner: Neutral + Location: 56,79 + Actor669: t01 + Owner: Neutral + Location: 101,87 + Actor670: t06 + Owner: Neutral + Location: 68,67 + Actor671: t05.husk + Owner: Neutral + Location: 103,63 + Actor672: t02 + Owner: Neutral + Location: 58,112 + Actor674: t01 + Owner: Neutral + Location: 89,25 + Actor676: t08 + Owner: Neutral + Location: 50,8 + Actor677: t12 + Owner: Neutral + Location: 3,76 + Actor678: t13 + Owner: Neutral + Location: 19,26 + Actor680: t02 + Owner: Neutral + Location: 117,94 + Actor681: t13 + Owner: Neutral + Location: 60,43 + Actor682: t13 + Owner: Neutral + Location: 2,71 + Actor683: t08 + Owner: Neutral + Location: 46,78 + Actor684: t01 + Owner: Neutral + Location: 126,53 + Actor685: t13 + Owner: Neutral + Location: 119,119 + Actor686: t06.husk + Owner: Neutral + Location: 104,54 + Actor687: t13 + Owner: Neutral + Location: 1,64 + Actor688: t02 + Owner: Neutral + Location: 88,127 + Actor689: t02 + Owner: Neutral + Location: 115,54 + Actor690: t03 + Owner: Neutral + Location: 13,127 + Actor691: t13 + Owner: Neutral + Location: 48,84 + Actor692: t06 + Owner: Neutral + Location: 53,81 + Actor693: t17 + Owner: Neutral + Location: 38,28 + Actor694: t12 + Owner: Neutral + Location: 103,88 + Actor696: t05 + Owner: Neutral + Location: 4,81 + Actor698: t01 + Owner: Neutral + Location: 35,31 + Actor699: t07 + Owner: Neutral + Location: 100,86 + Actor700: t06 + Owner: Neutral + Location: 38,18 + Actor701: t12.husk + Owner: Neutral + Location: 29,20 + Actor702: t13 + Owner: Neutral + Location: 111,36 + Actor703: t13 + Owner: Neutral + Location: 61,92 + Actor704: t05 + Owner: Neutral + Location: 19,28 + Actor705: t16 + Owner: Neutral + Location: 58,113 + Actor706: t03 + Owner: Neutral + Location: 68,69 + Actor707: t08 + Owner: Neutral + Location: 58,100 + Actor709: t06 + Owner: Neutral + Location: 20,27 + Actor710: t13 + Owner: Neutral + Location: 90,125 + Actor711: t13 + Owner: Neutral + Location: 122,57 + Actor712: t07 + Owner: Neutral + Location: 96,110 + Actor713: t05 + Owner: Neutral + Location: 39,25 + Actor714: t03 + Owner: Neutral + Location: 95,18 + Actor715: t13 + Owner: Neutral + Location: 0,33 + Actor718: t07 + Owner: Neutral + Location: 107,45 + Actor720: t16.husk + Owner: Neutral + Location: 19,74 + Actor721: t01 + Owner: Neutral + Location: 41,26 + Actor722: t12 + Owner: Neutral + Location: 0,83 + Actor723: t08 + Owner: Neutral + Location: 0,63 + Actor724: t02 + Owner: Neutral + Location: 34,87 + Actor725: t03 + Owner: Neutral + Location: 97,104 + Actor726: t01 + Owner: Neutral + Location: 45,24 + Actor727: t12 + Owner: Neutral + Location: 39,27 + Actor728: t06 + Owner: Neutral + Location: 96,100 + Actor729: t08 + Owner: Neutral + Location: 111,45 + Actor730: t17 + Owner: Neutral + Location: 131,65 + Actor731: t08 + Owner: Neutral + Location: 107,43 + Actor732: t01 + Owner: Neutral + Location: 90,82 + Actor733: t12 + Owner: Neutral + Location: 46,78 + Actor734: t01 + Owner: Neutral + Location: 143,31 + Actor735: t12 + Owner: Neutral + Location: 92,87 + Actor737: t03.husk + Owner: Neutral + Location: 3,123 + Actor738: t07 + Owner: Neutral + Location: 19,10 + Actor739: t17 + Owner: Neutral + Location: 2,11 + Actor740: t01 + Owner: Neutral + Location: 88,120 + Actor741: t07 + Owner: Neutral + Location: 26,90 + Actor742: t12 + Owner: Neutral + Location: 64,63 + Actor743: t12 + Owner: Neutral + Location: 114,99 + Actor744: t13 + Owner: Neutral + Location: 1,31 + Actor745: t13.husk + Owner: Neutral + Location: 41,22 + Actor746: t06 + Owner: Neutral + Location: 107,63 + Actor747: t08 + Owner: Neutral + Location: 51,79 + Actor748: t08.husk + Owner: Neutral + Location: 144,121 + Actor749: t03 + Owner: Neutral + Location: 103,54 + Actor751: t17 + Owner: Neutral + Location: 140,14 + Actor752: t06 + Owner: Neutral + Location: 64,62 + Actor753: t08 + Owner: Neutral + Location: 126,67 + Actor754: t05 + Owner: Neutral + Location: 94,111 + Actor755: t06 + Owner: Neutral + Location: 112,51 + Actor756: t12 + Owner: Neutral + Location: 56,92 + Actor757: t13 + Owner: Neutral + Location: 3,60 + Actor758: t16 + Owner: Neutral + Location: 1,76 + Actor759: t13 + Owner: Neutral + Location: 84,1 + Actor760: t13 + Owner: Neutral + Location: 85,108 + Actor761: t01 + Owner: Neutral + Location: 102,119 + Actor763: t08 + Owner: Neutral + Location: 142,66 + Actor764: t08 + Owner: Neutral + Location: 2,124 + Actor765: t05 + Owner: Neutral + Location: 96,33 + Actor766: t08 + Owner: Neutral + Location: 103,57 + Actor767: t05 + Owner: Neutral + Location: 2,127 + Actor768: t13 + Owner: Neutral + Location: 102,120 + Actor769: t07 + Owner: Neutral + Location: 140,9 + Actor770: t05 + Owner: Neutral + Location: 59,43 + Actor771: t02.husk + Owner: Neutral + Location: 110,44 + Actor772: t02 + Owner: Neutral + Location: 94,33 + Actor773: t17 + Owner: Neutral + Location: 105,59 + Actor774: t16 + Owner: Neutral + Location: 114,55 + Actor775: t01 + Owner: Neutral + Location: 98,31 + Actor776: t07 + Owner: Neutral + Location: 93,33 + Actor777: t06 + Owner: Neutral + Location: 60,47 + Actor778: t05 + Owner: Neutral + Location: 114,28 + Actor779: t01 + Owner: Neutral + Location: 55,75 + Actor780: t03 + Owner: Neutral + Location: 56,94 + Actor781: t13 + Owner: Neutral + Location: 95,39 + Actor782: t06 + Owner: Neutral + Location: 36,17 + Actor784: t07 + Owner: Neutral + Location: 93,41 + Actor785: t13 + Owner: Neutral + Location: 17,27 + Actor786: t13 + Owner: Neutral + Location: 65,44 + Actor787: t17 + Owner: Neutral + Location: 0,128 + Actor789: t17 + Owner: Neutral + Location: 119,53 + Actor790: t02 + Owner: Neutral + Location: 18,25 + Actor791: t13 + Owner: Neutral + Location: 0,49 + Actor792: t13 + Owner: Neutral + Location: 34,29 + Actor794: t07 + Owner: Neutral + Location: 142,15 + Actor795: t02 + Owner: Neutral + Location: 145,120 + Actor796: t16 + Owner: Neutral + Location: 119,54 + Actor797: t01.husk + Owner: Neutral + Location: 35,86 + Actor798: t03 + Owner: Neutral + Location: 9,125 + Actor799: t06 + Owner: Neutral + Location: 33,28 + Actor801: t02 + Owner: Neutral + Location: 114,49 + Actor802: t06 + Owner: Neutral + Location: 142,0 + Actor804: t13 + Owner: Neutral + Location: 2,79 + Actor805: t08 + Owner: Neutral + Location: 122,95 + Actor806: t03 + Owner: Neutral + Location: 93,98 + Actor807: t02 + Owner: Neutral + Location: 143,121 + Actor808: t06 + Owner: Neutral + Location: 39,74 + Actor810: t02.husk + Owner: Neutral + Location: 59,40 + Actor812: t16.husk + Owner: Neutral + Location: 129,68 + Actor815: t01 + Owner: Neutral + Location: 0,121 + Actor816: t06 + Owner: Neutral + Location: 137,0 + Actor817: t12 + Owner: Neutral + Location: 112,46 + Actor819: t05 + Owner: Neutral + Location: 1,53 + Actor820: t12 + Owner: Neutral + Location: 35,28 + Actor823: t07 + Owner: Neutral + Location: 97,99 + Actor824: t05 + Owner: Neutral + Location: 48,8 + Actor826: t08 + Owner: Neutral + Location: 91,24 + Actor827: t16 + Owner: Neutral + Location: 61,40 + Actor828: t07 + Owner: Neutral + Location: 3,52 + Actor829: t01 + Owner: Neutral + Location: 32,18 + Actor830: t16 + Owner: Neutral + Location: 142,10 + Actor833: t03 + Owner: Neutral + Location: 103,55 + Actor834: t02 + Owner: Neutral + Location: 96,102 + Actor835: t02 + Owner: Neutral + Location: 60,41 + Actor836: t05 + Owner: Neutral + Location: 0,79 + Actor837: t02 + Owner: Neutral + Location: 95,87 + Actor838: t02 + Owner: Neutral + Location: 98,36 + Actor839: t02 + Owner: Neutral + Location: 0,64 + Actor840: t08 + Owner: Neutral + Location: 141,67 + Actor841: t08 + Owner: Neutral + Location: 9,44 + Actor842: t07 + Owner: Neutral + Location: 42,79 + Actor843: t02 + Owner: Neutral + Location: 68,80 + Actor844: t13 + Owner: Neutral + Location: 123,51 + Actor846: t17 + Owner: Neutral + Location: 102,54 + Actor847: t05 + Owner: Neutral + Location: 0,31 + Actor848: t08 + Owner: Neutral + Location: 69,81 + Actor849: t05 + Owner: Neutral + Location: 12,117 + Actor850: t05 + Owner: Neutral + Location: 43,23 + Actor851: t16 + Owner: Neutral + Location: 98,37 + Actor852: t12 + Owner: Neutral + Location: 86,126 + Actor853: t17.husk + Owner: Neutral + Location: 51,77 + Actor854: t13 + Owner: Neutral + Location: 120,55 + Actor855: t05 + Owner: Neutral + Location: 143,66 + Actor856: t17 + Owner: Neutral + Location: 15,124 + Actor857: t13 + Owner: Neutral + Location: 4,59 + Actor858: t01.husk + Owner: Neutral + Location: 4,69 + Actor859: t07 + Owner: Neutral + Location: 126,50 + Actor860: t08 + Owner: Neutral + Location: 67,69 + Actor861: t05 + Owner: Neutral + Location: 20,24 + Actor862: t05 + Owner: Neutral + Location: 44,24 + Actor863: t17 + Owner: Neutral + Location: 104,64 + Actor864: t16 + Owner: Neutral + Location: 88,84 + Actor865: t08 + Owner: Neutral + Location: 90,129 + Actor866: t06 + Owner: Neutral + Location: 57,110 + Actor867: t05 + Owner: Neutral + Location: 32,20 + Actor868: t17 + Owner: Neutral + Location: 13,128 + Actor869: t06 + Owner: Neutral + Location: 105,64 + Actor870: t05 + Owner: Neutral + Location: 115,92 + Actor871: t07 + Owner: Neutral + Location: 93,120 + Actor872: t06 + Owner: Neutral + Location: 87,121 + Actor873: t06 + Owner: Neutral + Location: 55,80 + Actor874: t12 + Owner: Neutral + Location: 44,114 + Actor875: t13.husk + Owner: Neutral + Location: 53,110 + Actor876: t02 + Owner: Neutral + Location: 37,92 + Actor877: t13 + Owner: Neutral + Location: 1,10 + Actor878: t13 + Owner: Neutral + Location: 55,94 + Actor879: t07 + Owner: Neutral + Location: 96,18 + Actor880: t07 + Owner: Neutral + Location: 1,80 + Actor881: t07 + Owner: Neutral + Location: 39,24 + Actor882: t03 + Owner: Neutral + Location: 67,62 + Actor883: t01 + Owner: Neutral + Location: 98,18 + Actor884: t16.husk + Owner: Neutral + Location: 47,48 + Actor885: t06 + Owner: Neutral + Location: 96,103 + Actor886: t02 + Owner: Neutral + Location: 53,95 + Actor887: t06.husk + Owner: Neutral + Location: 145,114 + Actor888: t13 + Owner: Neutral + Location: 58,79 + Actor889: t16 + Owner: Neutral + Location: 81,0 + Actor890: t06 + Owner: Neutral + Location: 105,87 + Actor891: t02 + Owner: Neutral + Location: 144,9 + Actor892: t13 + Owner: Neutral + Location: 5,128 + Actor894: t01 + Owner: Neutral + Location: 92,123 + Actor895: t03 + Owner: Neutral + Location: 96,40 + Actor896: t13 + Owner: Neutral + Location: 96,98 + Actor897: t06 + Owner: Neutral + Location: 59,42 + Actor898: t08 + Owner: Neutral + Location: 55,114 + Actor899: t05 + Owner: Neutral + Location: 135,0 + Actor900: t01 + Owner: Neutral + Location: 117,51 + Actor901: t12 + Owner: Neutral + Location: 113,39 + Actor902: t03 + Owner: Neutral + Location: 116,94 + Actor904: t07 + Owner: Neutral + Location: 5,76 + Actor905: t17.husk + Owner: Neutral + Location: 1,59 + Actor906: t13 + Owner: Neutral + Location: 61,47 + Actor907: t16 + Owner: Neutral + Location: 2,53 + Actor908: t13 + Owner: Neutral + Location: 106,61 + Actor909: t01 + Owner: Neutral + Location: 45,78 + Actor910: t05.husk + Owner: Neutral + Location: 63,47 + Actor911: t02 + Owner: Neutral + Location: 96,108 + Actor912: t17 + Owner: Neutral + Location: 92,37 + Actor913: t13 + Owner: Neutral + Location: 132,15 + Actor914: t07 + Owner: Neutral + Location: 84,122 + Actor915: t12.husk + Owner: Neutral + Location: 1,63 + Actor916: t17 + Owner: Neutral + Location: 98,84 + Actor917: t12 + Owner: Neutral + Location: 124,70 + Actor918: t06 + Owner: Neutral + Location: 7,4 + Actor919: t16.husk + Owner: Neutral + Location: 132,66 + Actor921: t16 + Owner: Neutral + Location: 143,29 + Actor922: t12 + Owner: Neutral + Location: 118,50 + Actor923: t02 + Owner: Neutral + Location: 96,121 + Actor924: t08 + Owner: Neutral + Location: 98,59 + Actor925: t16 + Owner: Neutral + Location: 97,105 + Actor926: t17 + Owner: Neutral + Location: 94,109 + Actor927: t17 + Owner: Neutral + Location: 58,98 + Actor929: t01.husk + Owner: Neutral + Location: 8,4 + Actor931: t03 + Owner: Neutral + Location: 103,70 + Actor932: t13 + Owner: Neutral + Location: 91,34 + Actor933: t08 + Owner: Neutral + Location: 103,65 + Actor935: t05 + Owner: Neutral + Location: 45,114 + Actor936: t12 + Owner: Neutral + Location: 27,89 + Actor937: t06 + Owner: Neutral + Location: 109,97 + Actor938: t17 + Owner: Neutral + Location: 88,13 + Actor939: t02 + Owner: Neutral + Location: 0,56 + Actor940: t17 + Owner: Neutral + Location: 3,78 + Actor941: t07 + Owner: Neutral + Location: 36,90 + Actor942: t01.husk + Owner: Neutral + Location: 89,82 + Actor943: t01 + Owner: Neutral + Location: 8,124 + Actor944: t13 + Owner: Neutral + Location: 79,122 + Actor945: t13 + Owner: Neutral + Location: 95,103 + Actor946: t07 + Owner: Neutral + Location: 59,96 + Actor947: t02 + Owner: Neutral + Location: 82,123 + Actor948: t05 + Owner: Neutral + Location: 1,77 + Actor949: t03 + Owner: Neutral + Location: 113,46 + Actor950: t03 + Owner: Neutral + Location: 110,43 + Actor951: t08 + Owner: Neutral + Location: 85,121 + Actor952: t05.husk + Owner: Neutral + Location: 87,122 + Actor953: t06 + Owner: Neutral + Location: 118,10 + Actor954: t06 + Owner: Neutral + Location: 9,42 + Actor955: t02 + Owner: Neutral + Location: 40,22 + Actor956: t05 + Owner: Neutral + Location: 109,42 + Actor957: t13 + Owner: Neutral + Location: 39,60 + Actor958: t17 + Owner: Neutral + Location: 89,127 + Actor959: t12 + Owner: Neutral + Location: 103,42 + Actor960: t02 + Owner: Neutral + Location: 136,1 + Actor961: t17 + Owner: Neutral + Location: 13,117 + Actor962: t08 + Owner: Neutral + Location: 35,91 + Actor963: t03 + Owner: Neutral + Location: 131,13 + Actor964: t05 + Owner: Neutral + Location: 125,66 + Actor965: t02 + Owner: Neutral + Location: 88,26 + Actor966: t05 + Owner: Neutral + Location: 29,93 + Actor967: t05 + Owner: Neutral + Location: 95,80 + Actor968: t03 + Owner: Neutral + Location: 16,25 + Actor969: t03 + Owner: Neutral + Location: 1,69 + Actor970: t03 + Owner: Neutral + Location: 109,39 + Actor971: t02 + Owner: Neutral + Location: 96,120 + Actor972: t02 + Owner: Neutral + Location: 25,91 + Actor973: t17 + Owner: Neutral + Location: 33,23 + Actor974: t16 + Owner: Neutral + Location: 94,112 + Actor976: t02 + Owner: Neutral + Location: 43,80 + Actor977: t02 + Owner: Neutral + Location: 64,47 + Actor978: t06 + Owner: Neutral + Location: 3,127 + Actor979: t12 + Owner: Neutral + Location: 12,27 + Actor980: t05 + Owner: Neutral + Location: 40,61 + Actor982: t05 + Owner: Neutral + Location: 60,95 + Actor983: t03 + Owner: Neutral + Location: 2,56 + Actor985: t06 + Owner: Neutral + Location: 144,17 + Actor986: t16 + Owner: Neutral + Location: 31,22 + Actor987: t05 + Owner: Neutral + Location: 108,85 + Actor988: t16 + Owner: Neutral + Location: 118,54 + Actor990: t13.husk + Owner: Neutral + Location: 48,81 + Actor991: t08 + Owner: Neutral + Location: 67,62 + Actor992: t17 + Owner: Neutral + Location: 61,41 + Actor993: t17 + Owner: Neutral + Location: 97,59 + Actor994: t13 + Owner: Neutral + Location: 16,29 + Actor996: t02 + Owner: Neutral + Location: 97,58 + Actor997: t07 + Owner: Neutral + Location: 53,113 + Actor998: t01 + Owner: Neutral + Location: 92,20 + Actor999: t05 + Owner: Neutral + Location: 10,125 + Actor1000: t01 + Owner: Neutral + Location: 112,50 + Actor1001: t06.husk + Owner: Neutral + Location: 1,74 + Actor1002: t02 + Owner: Neutral + Location: 128,65 + Actor1003: t06 + Owner: Neutral + Location: 106,68 + Actor1004: t12 + Owner: Neutral + Location: 36,30 + Actor1005: t12 + Owner: Neutral + Location: 114,23 + Actor1007: t13 + Owner: Neutral + Location: 94,97 + Actor1008: t01 + Owner: Neutral + Location: 55,101 + Actor1009: t07 + Owner: Neutral + Location: 89,120 + Actor1010: t08 + Owner: Neutral + Location: 84,121 + Actor1011: t13 + Owner: Neutral + Location: 113,23 + Actor1012: t03 + Owner: Neutral + Location: 17,39 + Actor1013: t16 + Owner: Neutral + Location: 125,57 + Actor1014: t08 + Owner: Neutral + Location: 66,81 + Actor1015: t06 + Owner: Neutral + Location: 0,76 + Actor1016: t16.husk + Owner: Neutral + Location: 90,18 + Actor1017: t07 + Owner: Neutral + Location: 123,57 + Actor1018: t08 + Owner: Neutral + Location: 142,2 + Actor1019: t06 + Owner: Neutral + Location: 72,65 + Actor1022: t16 + Owner: Neutral + Location: 10,6 + Actor1023: t17 + Owner: Neutral + Location: 54,111 + Actor1024: t12 + Owner: Neutral + Location: 143,16 + Actor1025: t01 + Owner: Neutral + Location: 134,0 + Actor1026: t08 + Owner: Neutral + Location: 90,23 + Actor1027: t05 + Owner: Neutral + Location: 103,86 + Actor1028: t12 + Owner: Neutral + Location: 60,48 + Actor1029: t01 + Owner: Neutral + Location: 132,11 + Actor1030: t05 + Owner: Neutral + Location: 93,111 + Actor1031: t08 + Owner: Neutral + Location: 94,101 + Actor1032: t08 + Owner: Neutral + Location: 9,10 + Actor1033: t17 + Owner: Neutral + Location: 56,77 + Actor1034: t13 + Owner: Neutral + Location: 94,103 + Actor1035: t03 + Owner: Neutral + Location: 95,32 + Actor1036: t05 + Owner: Neutral + Location: 33,22 + Actor1037: t01 + Owner: Neutral + Location: 4,123 + Actor1038: t13 + Owner: Neutral + Location: 1,79 + Actor1039: t06 + Owner: Neutral + Location: 42,76 + Actor1040: t13 + Owner: Neutral + Location: 38,90 + Actor1041: t17 + Owner: Neutral + Location: 94,16 + Actor1042: t17 + Owner: Neutral + Location: 96,16 + Actor1043: t13 + Owner: Neutral + Location: 111,37 + Actor1045: t05 + Owner: Neutral + Location: 84,106 + Actor1046: t05 + Owner: Neutral + Location: 7,13 + Actor1047: t12 + Owner: Neutral + Location: 66,79 + Actor1048: t05 + Owner: Neutral + Location: 118,119 + Actor1049: t01 + Owner: Neutral + Location: 102,62 + Actor1050: t12 + Owner: Neutral + Location: 67,60 + Actor1051: t01 + Owner: Neutral + Location: 36,18 + Actor1052: t13.husk + Owner: Neutral + Location: 123,70 + Actor1053: t12 + Owner: Neutral + Location: 66,43 + Actor1054: t08 + Owner: Neutral + Location: 97,90 + Actor1056: t02 + Owner: Neutral + Location: 33,89 + Actor1057: t16 + Owner: Neutral + Location: 52,82 + Actor1058: t05 + Owner: Neutral + Location: 39,18 + Actor1059: t01 + Owner: Neutral + Location: 0,32 + Actor1060: t03 + Owner: Neutral + Location: 112,36 + Actor1061: t16 + Owner: Neutral + Location: 51,82 + Actor1062: t08 + Owner: Neutral + Location: 48,52 + Actor1063: t08 + Owner: Neutral + Location: 15,21 + Actor1064: t05 + Owner: Neutral + Location: 122,51 + Actor1066: t07 + Owner: Neutral + Location: 62,46 + Actor1067: t06 + Owner: Neutral + Location: 90,35 + Actor1068: t08 + Owner: Neutral + Location: 46,50 + Actor1069: t05 + Owner: Neutral + Location: 2,55 + Actor1070: t08.husk + Owner: Neutral + Location: 94,40 + Actor1071: t03 + Owner: Neutral + Location: 95,16 + Actor1072: t17 + Owner: Neutral + Location: 142,13 + Actor1073: t16 + Owner: Neutral + Location: 102,56 + Actor1074: t08 + Owner: Neutral + Location: 47,76 + Actor1075: t03 + Owner: Neutral + Location: 2,69 + Actor1076: t06 + Owner: Neutral + Location: 144,33 + Actor1077: t06.husk + Owner: Neutral + Location: 32,21 + Actor1078: t17 + Owner: Neutral + Location: 14,116 + Actor1079: t17 + Owner: Neutral + Location: 123,68 + Actor1080: t17 + Owner: Neutral + Location: 93,20 + Actor1081: t13 + Owner: Neutral + Location: 108,42 + Actor1082: t05 + Owner: Neutral + Location: 144,72 + Actor1083: t03 + Owner: Neutral + Location: 53,79 + Actor1084: t07 + Owner: Neutral + Location: 43,78 + Actor1085: t08 + Owner: Neutral + Location: 58,97 + Actor1086: t13 + Owner: Neutral + Location: 108,87 + Actor1087: t06 + Owner: Neutral + Location: 124,69 + Actor1088: t16 + Owner: Neutral + Location: 35,29 + Actor1089: t03 + Owner: Neutral + Location: 145,18 + Actor1090: t05 + Owner: Neutral + Location: 38,19 + Actor1091: t02 + Owner: Neutral + Location: 18,11 + Actor1092: t01 + Owner: Neutral + Location: 107,88 + Actor1094: t12 + Owner: Neutral + Location: 106,44 + Actor1095: t02 + Owner: Neutral + Location: 81,121 + Actor1096: t06 + Owner: Neutral + Location: 44,78 + Actor1097: t07 + Owner: Neutral + Location: 49,74 + Actor1098: t13 + Owner: Neutral + Location: 113,53 + Actor1099: t06 + Owner: Neutral + Location: 88,101 + Actor1100: t06.husk + Owner: Neutral + Location: 8,125 + Actor1102: t01 + Owner: Neutral + Location: 35,26 + Actor1103: t16 + Owner: Neutral + Location: 92,83 + Actor1104: t17 + Owner: Neutral + Location: 53,96 + Actor1105: t13 + Owner: Neutral + Location: 81,79 + Actor1106: t13 + Owner: Neutral + Location: 34,24 + Actor1107: t16 + Owner: Neutral + Location: 63,46 + Actor1108: t07.husk + Owner: Neutral + Location: 105,61 + Actor1109: t03 + Owner: Neutral + Location: 40,27 + Actor1111: t12 + Owner: Neutral + Location: 114,48 + Actor1112: t12 + Owner: Neutral + Location: 11,5 + Actor1113: t07 + Owner: Neutral + Location: 6,76 + Actor1115: t02 + Owner: Neutral + Location: 28,21 + Actor1116: t03 + Owner: Neutral + Location: 127,67 + Actor1117: t13 + Owner: Neutral + Location: 91,17 + Actor1118: t16 + Owner: Neutral + Location: 1,70 + Actor1119: t12 + Owner: Neutral + Location: 7,125 + Actor1120: t05 + Owner: Neutral + Location: 1,84 + Actor1121: t12 + Owner: Neutral + Location: 59,44 + Actor1122: t05 + Owner: Neutral + Location: 98,99 + Actor1123: t05 + Owner: Neutral + Location: 61,43 + Actor1124: t05 + Owner: Neutral + Location: 44,23 + Actor1125: t03 + Owner: Neutral + Location: 91,21 + Actor1126: t17 + Owner: Neutral + Location: 121,93 + Actor1127: t16 + Owner: Neutral + Location: 103,68 + Actor1128: t05 + Owner: Neutral + Location: 116,98 + Actor1129: t16 + Owner: Neutral + Location: 97,21 + Actor1130: t08 + Owner: Neutral + Location: 41,59 + Actor1132: t05 + Owner: Neutral + Location: 6,128 + Actor1133: t06 + Owner: Neutral + Location: 4,56 + Actor1134: t13 + Owner: Neutral + Location: 11,128 + Actor1137: t01 + Owner: Neutral + Location: 35,17 + Actor1138: t16 + Owner: Neutral + Location: 60,46 + Actor1140: t03 + Owner: Neutral + Location: 114,50 + Actor1141: t01 + Owner: Neutral + Location: 97,16 + Actor1142: t08 + Owner: Neutral + Location: 49,83 + Actor1144: t03 + Owner: Neutral + Location: 92,39 + Actor1145: t12 + Owner: Neutral + Location: 114,56 + Actor1146: t06 + Owner: Neutral + Location: 133,128 + Actor1147: t05 + Owner: Neutral + Location: 75,80 + Actor1149: t07 + Owner: Neutral + Location: 47,50 + Actor1150: t12 + Owner: Neutral + Location: 33,90 + Actor1152: t02 + Owner: Neutral + Location: 4,58 + Actor1153: t16 + Owner: Neutral + Location: 98,104 + Actor1154: t05 + Owner: Neutral + Location: 91,128 + Actor1155: t07 + Owner: Neutral + Location: 114,57 + Actor1156: t06 + Owner: Neutral + Location: 121,121 + Actor1157: t03.husk + Owner: Neutral + Location: 12,88 + Actor1158: t05 + Owner: Neutral + Location: 65,78 + Actor1159: t06 + Owner: Neutral + Location: 92,82 + Actor1160: t03 + Owner: Neutral + Location: 37,22 + Actor1161: t03 + Owner: Neutral + Location: 8,11 + Actor1162: t13.husk + Owner: Neutral + Location: 98,16 + Actor1163: t07 + Owner: Neutral + Location: 53,72 + Actor1164: t13 + Owner: Neutral + Location: 0,60 + Actor1165: t02 + Owner: Neutral + Location: 108,88 + Actor1166: t17 + Owner: Neutral + Location: 38,91 + Actor1167: t07 + Owner: Neutral + Location: 109,80 + Actor1168: t02.husk + Owner: Neutral + Location: 85,123 + Actor1170: t16 + Owner: Neutral + Location: 144,18 + Actor1171: t08.husk + Owner: Neutral + Location: 93,84 + Actor1172: t02 + Owner: Neutral + Location: 142,20 + Actor1173: t08.husk + Owner: Neutral + Location: 49,11 + Actor1174: t05 + Owner: Neutral + Location: 112,53 + Actor1175: t02.husk + Owner: Neutral + Location: 54,113 + Actor1177: t13 + Owner: Neutral + Location: 99,99 + Actor1178: t03 + Owner: Neutral + Location: 63,45 + Actor1179: t17 + Owner: Neutral + Location: 96,35 + Actor1180: t13 + Owner: Neutral + Location: 95,100 + Actor1181: t01 + Owner: Neutral + Location: 113,22 + Actor1182: t13 + Owner: Neutral + Location: 95,112 + Actor1183: t12 + Owner: Neutral + Location: 77,78 + Actor1184: t13 + Owner: Neutral + Location: 133,127 + Actor1185: t16 + Owner: Neutral + Location: 145,5 + Actor1186: t17 + Owner: Neutral + Location: 83,74 + Actor1187: t17 + Owner: Neutral + Location: 1,128 + Actor1188: t05 + Owner: Neutral + Location: 32,24 + Actor1189: t08 + Owner: Neutral + Location: 69,61 + Actor1190: t01 + Owner: Neutral + Location: 59,41 + Actor1191: t03 + Owner: Neutral + Location: 123,54 + Actor1192: t06 + Owner: Neutral + Location: 129,50 + Actor1193: t03 + Owner: Neutral + Location: 43,26 + Actor1194: t06 + Owner: Neutral + Location: 105,58 + Actor1196: t16 + Owner: Neutral + Location: 88,121 + Actor1197: t07 + Owner: Neutral + Location: 98,89 + Actor1198: t12 + Owner: Neutral + Location: 95,38 + Actor1199: t06 + Owner: Neutral + Location: 98,98 + Actor1200: t05 + Owner: Neutral + Location: 92,81 + Actor1202: t05 + Owner: Neutral + Location: 7,6 + Actor1203: t03 + Owner: Neutral + Location: 114,102 + Actor1204: t02 + Owner: Neutral + Location: 81,120 + Actor1207: t08 + Owner: Neutral + Location: 144,2 + Actor1208: t12 + Owner: Neutral + Location: 110,47 + Actor1209: t12 + Owner: Neutral + Location: 88,19 + Actor1210: t17 + Owner: Neutral + Location: 93,42 + Actor1211: t05 + Owner: Neutral + Location: 1,55 + Actor1212: t12 + Owner: Neutral + Location: 90,16 + Actor1213: t12 + Owner: Neutral + Location: 43,75 + Actor1214: t06 + Owner: Neutral + Location: 1,127 + Actor1215: t16 + Owner: Neutral + Location: 122,53 + Actor1216: t13 + Owner: Neutral + Location: 38,27 + Actor1217: t12 + Owner: Neutral + Location: 54,75 + Actor1218: t05 + Owner: Neutral + Location: 89,88 + Actor1219: t06 + Owner: Neutral + Location: 12,3 + Actor1220: t13 + Owner: Neutral + Location: 44,50 + Actor1221: t05 + Owner: Neutral + Location: 56,110 + Actor1222: t03 + Owner: Neutral + Location: 54,100 + Actor1223: t03 + Owner: Neutral + Location: 51,98 + Actor1224: t16 + Owner: Neutral + Location: 83,103 + Actor1225: t13 + Owner: Neutral + Location: 93,85 + Actor1226: t02 + Owner: Neutral + Location: 98,21 + Actor1227: t08 + Owner: Neutral + Location: 104,91 + Actor1228: t07 + Owner: Neutral + Location: 141,65 + Actor1229: t16 + Owner: Neutral + Location: 102,63 + Actor1230: t07 + Owner: Neutral + Location: 31,23 + Actor1231: t17 + Owner: Neutral + Location: 112,52 + Actor1232: t02 + Owner: Neutral + Location: 61,46 + Actor1233: t02 + Owner: Neutral + Location: 75,79 + Actor1234: t02 + Owner: Neutral + Location: 106,69 + Actor1235: t12 + Owner: Neutral + Location: 2,128 + Actor1236: t05 + Owner: Neutral + Location: 142,63 + Actor1237: t02 + Owner: Neutral + Location: 98,83 + Actor1238: t07 + Owner: Neutral + Location: 47,10 + Actor1239: t05 + Owner: Neutral + Location: 125,67 + Actor1240: t03 + Owner: Neutral + Location: 145,12 + Actor1241: t06 + Owner: Neutral + Location: 124,53 + Actor1242: t08 + Owner: Neutral + Location: 63,63 + Actor1244: t16 + Owner: Neutral + Location: 89,23 + Actor1245: t07 + Owner: Neutral + Location: 56,95 + Actor1246: t13 + Owner: Neutral + Location: 93,121 + Actor1247: t02 + Owner: Neutral + Location: 53,93 + Actor1248: t03 + Owner: Neutral + Location: 41,59 + Actor1249: t03 + Owner: Neutral + Location: 36,25 + Actor1250: t17 + Owner: Neutral + Location: 9,11 + Actor1251: t05 + Owner: Neutral + Location: 105,60 + Actor1252: t08 + Owner: Neutral + Location: 98,86 + Actor1253: t08 + Owner: Neutral + Location: 116,93 + Actor1255: t16 + Owner: Neutral + Location: 36,31 + Actor1257: t16.husk + Owner: Neutral + Location: 112,44 + Actor1258: t02.husk + Owner: Neutral + Location: 1,75 + Actor1259: t17 + Owner: Neutral + Location: 143,77 + Actor1260: t01.husk + Owner: Neutral + Location: 114,24 + Actor1261: t13 + Owner: Neutral + Location: 5,83 + Actor1263: t12 + Owner: Neutral + Location: 32,27 + Actor1264: t05 + Owner: Neutral + Location: 95,120 + Actor1265: t17 + Owner: Neutral + Location: 109,43 + Actor1266: t05 + Owner: Neutral + Location: 1,60 + Actor1268: t02 + Owner: Neutral + Location: 10,5 + Actor1269: t05 + Owner: Neutral + Location: 4,65 + Actor1270: t17 + Owner: Neutral + Location: 51,84 + Actor1271: t16 + Owner: Neutral + Location: 144,123 + Actor1272: t16 + Owner: Neutral + Location: 84,101 + Actor1274: t01 + Owner: Neutral + Location: 0,119 + Actor1275: t08 + Owner: Neutral + Location: 98,122 + Actor1276: t01 + Owner: Neutral + Location: 55,77 + Actor1277: t01 + Owner: Neutral + Location: 47,49 + Actor1278: t06.husk + Owner: Neutral + Location: 52,9 + Actor1279: t03 + Owner: Neutral + Location: 109,38 + Actor1280: t13 + Owner: Neutral + Location: 69,79 + Actor1281: t05 + Owner: Neutral + Location: 40,21 + Actor1282: t02 + Owner: Neutral + Location: 98,105 + Actor1283: t13 + Owner: Neutral + Location: 55,93 + Actor1285: t06 + Owner: Neutral + Location: 103,65 + Actor1286: t05.husk + Owner: Neutral + Location: 107,43 + Actor1287: t02 + Owner: Neutral + Location: 83,123 + Actor1288: t12.husk + Owner: Neutral + Location: 96,41 + Actor1289: t08 + Owner: Neutral + Location: 34,21 + Actor1290: t06.husk + Owner: Neutral + Location: 9,5 + Actor1291: t08 + Owner: Neutral + Location: 95,99 + Actor1292: t07 + Owner: Neutral + Location: 30,19 + Actor1293: t05 + Owner: Neutral + Location: 63,43 + Actor1294: t02 + Owner: Neutral + Location: 61,44 + Actor1296: t06 + Owner: Neutral + Location: 41,79 + Actor1297: t12 + Owner: Neutral + Location: 52,76 + Actor1298: t03 + Owner: Neutral + Location: 60,80 + Actor1299: t03 + Owner: Neutral + Location: 54,72 + Actor1301: t12 + Owner: Neutral + Location: 92,18 + Actor1302: t17 + Owner: Neutral + Location: 57,81 + Actor1303: t17 + Owner: Neutral + Location: 68,68 + Actor1304: t03 + Owner: Neutral + Location: 104,88 + Actor1306: t17 + Owner: Neutral + Location: 2,122 + Actor1307: t07 + Owner: Neutral + Location: 91,24 + Actor1308: t13 + Owner: Neutral + Location: 106,65 + Actor1309: t03.husk + Owner: Neutral + Location: 46,50 + Actor1310: t13 + Owner: Neutral + Location: 46,8 + Actor1311: t08 + Owner: Neutral + Location: 123,98 + Actor1312: t08 + Owner: Neutral + Location: 96,85 + Actor1313: t03 + Owner: Neutral + Location: 39,77 + Actor1314: t07 + Owner: Neutral + Location: 4,76 + Actor1315: t02 + Owner: Neutral + Location: 57,91 + Actor1317: t03 + Owner: Neutral + Location: 34,28 + Actor1318: t05.husk + Owner: Neutral + Location: 19,27 + Actor1319: t07 + Owner: Neutral + Location: 2,70 + Actor1320: t08 + Owner: Neutral + Location: 115,59 + Actor1321: t16 + Owner: Neutral + Location: 126,71 + Actor1322: t02 + Owner: Neutral + Location: 95,36 + Actor1323: t17.husk + Owner: Neutral + Location: 1,124 + Actor1324: t16.husk + Owner: Neutral + Location: 53,6 + Actor1325: t03 + Owner: Neutral + Location: 124,71 + Actor1326: t03 + Owner: Neutral + Location: 127,50 + Actor1328: t02 + Owner: Neutral + Location: 56,93 + Actor1329: t06 + Owner: Neutral + Location: 90,121 + Actor1330: t05 + Owner: Neutral + Location: 4,83 + Actor1331: t06 + Owner: Neutral + Location: 106,63 + Actor1332: t06 + Owner: Neutral + Location: 4,78 + Actor1334: t13 + Owner: Neutral + Location: 102,53 + Actor1335: t17 + Owner: Neutral + Location: 48,75 + Actor1336: t05 + Owner: Neutral + Location: 95,107 + Actor1337: t13 + Owner: Neutral + Location: 142,67 + Actor1338: t05 + Owner: Neutral + Location: 136,0 + Actor1339: t08 + Owner: Neutral + Location: 108,87 + Actor1340: t13 + Owner: Neutral + Location: 86,120 + Actor1342: t07 + Owner: Neutral + Location: 55,82 + Actor1343: t16 + Owner: Neutral + Location: 8,44 + Actor1344: t17 + Owner: Neutral + Location: 48,82 + Actor1345: t16 + Owner: Neutral + Location: 64,79 + Actor1346: t12 + Owner: Neutral + Location: 137,25 + Actor1348: t16 + Owner: Neutral + Location: 106,89 + Actor1349: t07.husk + Owner: Neutral + Location: 19,12 + Actor1350: t07 + Owner: Neutral + Location: 92,80 + Actor1351: t13 + Owner: Neutral + Location: 0,81 + Actor1352: t07 + Owner: Neutral + Location: 26,92 + Actor1353: t17 + Owner: Neutral + Location: 143,120 + Actor1354: t12 + Owner: Neutral + Location: 99,17 + Actor1355: t08 + Owner: Neutral + Location: 131,67 + Actor1357: t13 + Owner: Neutral + Location: 121,97 + Actor1358: t16 + Owner: Neutral + Location: 132,12 + Actor1359: t13 + Owner: Neutral + Location: 92,34 + Actor1360: t12 + Owner: Neutral + Location: 36,27 + Actor1361: t07 + Owner: Neutral + Location: 115,29 + Actor1362: t05 + Owner: Neutral + Location: 72,64 + Actor1364: t01 + Owner: Neutral + Location: 94,120 + Actor1365: t12 + Owner: Neutral + Location: 118,94 + Actor1366: t13 + Owner: Neutral + Location: 4,71 + Actor1367: t13.husk + Owner: Neutral + Location: 80,66 + Actor1368: t05 + Owner: Neutral + Location: 88,24 + Actor1369: t03 + Owner: Neutral + Location: 145,96 + Actor1370: t05 + Owner: Neutral + Location: 3,75 + Actor1371: t03 + Owner: Neutral + Location: 50,80 + Actor1372: t08 + Owner: Neutral + Location: 7,73 + Actor1373: t02.husk + Owner: Neutral + Location: 142,9 + Actor1375: t16 + Owner: Neutral + Location: 39,26 + Actor1376: t07 + Owner: Neutral + Location: 87,127 + Actor1377: t16 + Owner: Neutral + Location: 97,101 + Actor1378: t08 + Owner: Neutral + Location: 94,42 + Actor1379: t05 + Owner: Neutral + Location: 9,8 + Actor1380: t01 + Owner: Neutral + Location: 55,109 + Actor1381: t05 + Owner: Neutral + Location: 113,56 + Actor1382: t06 + Owner: Neutral + Location: 33,30 + Actor1383: t16 + Owner: Neutral + Location: 89,101 + Actor1384: t16 + Owner: Neutral + Location: 107,89 + Actor1385: t16 + Owner: Neutral + Location: 137,128 + Actor1386: t16 + Owner: Neutral + Location: 43,49 + Actor1387: t06 + Owner: Neutral + Location: 100,87 + Actor1388: t02 + Owner: Neutral + Location: 31,75 + Actor1391: t01 + Owner: Neutral + Location: 109,36 + Actor1392: t05 + Owner: Neutral + Location: 143,30 + Actor1393: t13 + Owner: Neutral + Location: 144,64 + Actor1394: t08 + Owner: Neutral + Location: 141,1 + Actor1395: t05 + Owner: Neutral + Location: 98,34 + Actor1396: t16 + Owner: Neutral + Location: 20,28 + Actor1397: t05 + Owner: Neutral + Location: 18,29 + Actor1398: t01 + Owner: Neutral + Location: 37,19 + Actor1399: t13 + Owner: Neutral + Location: 49,79 + Actor1400: t01 + Owner: Neutral + Location: 143,72 + Actor1401: t17 + Owner: Neutral + Location: 96,39 + Actor1402: t01 + Owner: Neutral + Location: 87,108 + Actor1403: t17 + Owner: Neutral + Location: 141,9 + Actor1404: t02 + Owner: Neutral + Location: 37,91 + Actor1405: t03 + Owner: Neutral + Location: 100,101 + Actor1406: t08 + Owner: Neutral + Location: 145,96 + Actor1407: t03 + Owner: Neutral + Location: 4,84 + Actor1408: t06 + Owner: Neutral + Location: 134,1 + Actor1409: t12 + Owner: Neutral + Location: 55,73 + Actor1410: t05 + Owner: Neutral + Location: 60,89 + Actor1411: t17 + Owner: Neutral + Location: 40,25 + Actor1412: t17 + Owner: Neutral + Location: 91,25 + Actor1413: t12.husk + Owner: Neutral + Location: 118,95 + Actor1414: t08 + Owner: Neutral + Location: 0,49 + Actor1415: t16 + Owner: Neutral + Location: 18,37 + Actor1416: t06 + Owner: Neutral + Location: 1,72 + Actor1417: t08.husk + Owner: Neutral + Location: 81,124 + Actor1418: t02 + Owner: Neutral + Location: 50,6 + Actor1419: t03 + Owner: Neutral + Location: 2,65 + Actor1420: t12 + Owner: Neutral + Location: 116,59 + Actor1421: t01 + Owner: Neutral + Location: 48,79 + Actor1422: t13 + Owner: Neutral + Location: 40,60 + Actor1423: t12 + Owner: Neutral + Location: 18,128 + Actor1424: t12 + Owner: Neutral + Location: 40,42 + Actor1426: t01 + Owner: Neutral + Location: 104,68 + Actor1427: t06 + Owner: Neutral + Location: 145,17 + Actor1428: t17 + Owner: Neutral + Location: 52,96 + Actor1429: t06 + Owner: Neutral + Location: 47,77 + Actor1430: t03 + Owner: Neutral + Location: 135,1 + Actor1431: t05 + Owner: Neutral + Location: 37,17 + Actor1432: t17.husk + Owner: Neutral + Location: 17,26 + Actor1433: t08 + Owner: Neutral + Location: 73,67 + Actor1434: t08 + Owner: Neutral + Location: 57,94 + Actor1436: t12 + Owner: Neutral + Location: 138,0 + Actor1437: t08 + Owner: Neutral + Location: 17,29 + Actor1438: t13 + Owner: Neutral + Location: 32,29 + Actor1439: t05 + Owner: Neutral + Location: 0,80 + Actor1440: t06.husk + Owner: Neutral + Location: 97,98 + Actor1441: t03 + Owner: Neutral + Location: 89,123 + Actor1442: t05.husk + Owner: Neutral + Location: 14,124 + Actor1443: t17 + Owner: Neutral + Location: 108,38 + Actor1444: t03 + Owner: Neutral + Location: 95,35 + Actor1445: t07 + Owner: Neutral + Location: 123,69 + Actor1446: t01 + Owner: Neutral + Location: 99,104 + Actor1447: t02 + Owner: Neutral + Location: 129,67 + Actor1449: t07 + Owner: Neutral + Location: 95,40 + Actor1450: t08 + Owner: Neutral + Location: 105,63 + Actor1451: t06 + Owner: Neutral + Location: 52,78 + Actor1452: t02 + Owner: Neutral + Location: 71,65 + Actor1454: t08 + Owner: Neutral + Location: 136,27 + Actor1455: t07 + Owner: Neutral + Location: 30,21 + Actor1456: t03 + Owner: Neutral + Location: 142,19 + Actor1457: t06.husk + Owner: Neutral + Location: 44,80 + Actor1458: t17 + Owner: Neutral + Location: 33,29 + Actor1459: t03 + Owner: Neutral + Location: 44,25 + Actor1460: t01 + Owner: Neutral + Location: 116,102 + Actor1461: t17 + Owner: Neutral + Location: 20,36 + Actor1462: t08 + Owner: Neutral + Location: 41,22 + Actor1463: t07 + Owner: Neutral + Location: 21,40 + Actor1464: t12 + Owner: Neutral + Location: 85,118 + Actor1465: t07 + Owner: Neutral + Location: 137,2 + Actor1466: t05 + Owner: Neutral + Location: 93,38 + Actor1467: t07 + Owner: Neutral + Location: 104,55 + Actor1468: t05 + Owner: Neutral + Location: 94,43 + Actor1469: t07 + Owner: Neutral + Location: 141,64 + Actor1470: t16 + Owner: Neutral + Location: 9,128 + Actor1471: t06 + Owner: Neutral + Location: 124,57 + Actor1472: t07 + Owner: Neutral + Location: 65,62 + Actor1473: t12 + Owner: Neutral + Location: 121,54 + Actor1474: t08 + Owner: Neutral + Location: 107,87 + Actor1475: t17 + Owner: Neutral + Location: 76,79 + Actor1476: t07 + Owner: Neutral + Location: 118,93 + Actor1477: t01 + Owner: Neutral + Location: 62,61 + Actor1478: t01 + Owner: Neutral + Location: 115,52 + Actor1479: t07 + Owner: Neutral + Location: 54,6 + Actor1480: t06 + Owner: Neutral + Location: 36,26 + Actor1481: t13 + Owner: Neutral + Location: 97,103 + Actor1482: t07 + Owner: Neutral + Location: 115,55 + Actor1484: t17 + Owner: Neutral + Location: 97,86 + Actor1485: t05 + Owner: Neutral + Location: 5,80 + Actor1486: t01 + Owner: Neutral + Location: 18,38 + Actor1487: t05 + Owner: Neutral + Location: 6,80 + Actor1488: t06 + Owner: Neutral + Location: 144,13 + Actor1489: t02 + Owner: Neutral + Location: 106,86 + Actor1490: t01 + Owner: Neutral + Location: 36,28 + Actor1492: t01 + Owner: Neutral + Location: 106,67 + Actor1493: t17 + Owner: Neutral + Location: 98,119 + Actor1495: t05 + Owner: Neutral + Location: 96,86 + Actor1497: t03.husk + Owner: Neutral + Location: 108,78 + Actor1498: t03 + Owner: Neutral + Location: 103,62 + Actor1499: t12 + Owner: Neutral + Location: 1,58 + Actor1500: t05 + Owner: Neutral + Location: 66,68 + Actor1501: t02.husk + Owner: Neutral + Location: 108,39 + Actor1502: t17.husk + Owner: Neutral + Location: 55,92 + Actor1503: t03 + Owner: Neutral + Location: 63,79 + Actor1504: t06 + Owner: Neutral + Location: 58,44 + Actor1505: t08.husk + Owner: Neutral + Location: 37,22 + Actor1506: t16 + Owner: Neutral + Location: 132,127 + Actor1507: t06 + Owner: Neutral + Location: 2,81 + Actor1508: t16 + Owner: Neutral + Location: 56,97 + Actor1509: t16 + Owner: Neutral + Location: 48,50 + Actor1510: t17 + Owner: Neutral + Location: 48,78 + Actor1511: t08.husk + Owner: Neutral + Location: 144,9 + Actor1512: t01 + Owner: Neutral + Location: 43,76 + Actor1513: t07.husk + Owner: Neutral + Location: 98,57 + Actor1514: t08 + Owner: Neutral + Location: 1,57 + Actor1515: t01 + Owner: Neutral + Location: 142,16 + Actor1516: t16 + Owner: Neutral + Location: 54,96 + Actor1517: t01 + Owner: Neutral + Location: 88,106 + Actor1518: t16 + Owner: Neutral + Location: 69,67 + Actor1519: t08 + Owner: Neutral + Location: 99,120 + Actor1520: t17 + Owner: Neutral + Location: 140,20 + Actor1521: t05 + Owner: Neutral + Location: 141,17 + Actor1522: t08.husk + Owner: Neutral + Location: 43,95 + Actor1523: t05.husk + Owner: Neutral + Location: 53,97 + Actor1524: t07 + Owner: Neutral + Location: 21,37 + Actor1526: t08 + Owner: Neutral + Location: 38,93 + Actor1527: t17 + Owner: Neutral + Location: 0,124 + Actor1528: t13 + Owner: Neutral + Location: 120,100 + Actor1529: t07 + Owner: Neutral + Location: 96,105 + Actor1530: t03.husk + Owner: Neutral + Location: 95,106 + Actor1531: t05 + Owner: Neutral + Location: 17,124 + Actor1532: t17 + Owner: Neutral + Location: 86,18 + Actor1533: t07 + Owner: Neutral + Location: 145,16 + Actor1534: t12 + Owner: Neutral + Location: 94,119 + Actor1535: t01 + Owner: Neutral + Location: 117,98 + Actor1536: t17 + Owner: Neutral + Location: 141,20 + Actor1537: t07 + Owner: Neutral + Location: 42,75 + Actor1539: t03 + Owner: Neutral + Location: 120,53 + Actor1540: t17 + Owner: Neutral + Location: 50,81 + Actor1541: t01 + Owner: Neutral + Location: 90,80 + Actor1542: t17.husk + Owner: Neutral + Location: 1,123 + Actor1543: t08 + Owner: Neutral + Location: 67,68 + Actor1544: t13 + Owner: Neutral + Location: 7,42 + Actor1545: t01 + Owner: Neutral + Location: 83,73 + Actor1546: t16 + Owner: Neutral + Location: 92,100 + Actor1547: t07 + Owner: Neutral + Location: 63,42 + Actor1548: t07 + Owner: Neutral + Location: 62,45 + Actor1549: t17 + Owner: Neutral + Location: 94,85 + Actor1550: t17.husk + Owner: Neutral + Location: 43,50 + Actor1551: t08 + Owner: Neutral + Location: 107,38 + Actor1553: t16 + Owner: Neutral + Location: 2,84 + Actor1554: t07.husk + Owner: Neutral + Location: 1,62 + Actor1555: t16 + Owner: Neutral + Location: 123,52 + Actor1556: t05 + Owner: Neutral + Location: 56,81 + Actor1557: t05 + Owner: Neutral + Location: 56,98 + Actor1559: t02 + Owner: Neutral + Location: 5,82 + Actor1560: t13 + Owner: Neutral + Location: 19,37 + Actor1561: t16 + Owner: Neutral + Location: 89,124 + Actor1562: t13 + Owner: Neutral + Location: 98,33 + Actor1564: t12 + Owner: Neutral + Location: 12,128 + Actor1565: t03 + Owner: Neutral + Location: 94,121 + Actor1566: t12 + Owner: Neutral + Location: 6,124 + Actor1567: t13 + Owner: Neutral + Location: 142,2 + Actor1569: t08 + Owner: Neutral + Location: 31,25 + Actor1570: t02.husk + Owner: Neutral + Location: 94,82 + Actor1571: t02 + Owner: Neutral + Location: 83,102 + Actor1572: t03 + Owner: Neutral + Location: 7,11 + Actor1573: t17 + Owner: Neutral + Location: 8,7 + Actor1574: t16 + Owner: Neutral + Location: 42,73 + Actor1577: t16 + Owner: Neutral + Location: 91,123 + Actor1578: t08 + Owner: Neutral + Location: 83,0 + Actor1579: t08 + Owner: Neutral + Location: 84,124 + Actor1581: t16 + Owner: Neutral + Location: 79,78 + Actor1582: t05 + Owner: Neutral + Location: 54,109 + Actor1583: t13 + Owner: Neutral + Location: 41,42 + Actor1584: t05 + Owner: Neutral + Location: 45,76 + Actor1585: t06 + Owner: Neutral + Location: 97,17 + Actor1586: t01 + Owner: Neutral + Location: 105,65 + Actor1587: t06 + Owner: Neutral + Location: 7,12 + Actor1588: t03 + Owner: Neutral + Location: 35,30 + Actor1589: t12 + Owner: Neutral + Location: 136,27 + Actor1590: t08.husk + Owner: Neutral + Location: 112,41 + Actor1591: t01 + Owner: Neutral + Location: 121,53 + Actor1592: t13 + Owner: Neutral + Location: 16,21 + Actor1593: t05 + Owner: Neutral + Location: 52,72 + Actor1594: t17 + Owner: Neutral + Location: 17,40 + Actor1595: t16 + Owner: Neutral + Location: 69,64 + Actor1596: t08 + Owner: Neutral + Location: 53,112 + Actor1597: t17 + Owner: Neutral + Location: 59,45 + Actor1598: t01 + Owner: Neutral + Location: 97,83 + Actor1599: t08 + Owner: Neutral + Location: 59,47 + Actor1600: t05 + Owner: Neutral + Location: 115,99 + Actor1601: t06 + Owner: Neutral + Location: 103,121 + Actor1602: t02 + Owner: Neutral + Location: 95,86 + Actor1603: t05 + Owner: Neutral + Location: 42,23 + Actor1604: t17 + Owner: Neutral + Location: 95,34 + Actor1605: t06 + Owner: Neutral + Location: 28,91 + Actor1606: t13 + Owner: Neutral + Location: 90,123 + Actor1608: t06 + Owner: Neutral + Location: 70,80 + Actor1609: t07 + Owner: Neutral + Location: 11,124 + Actor1610: t01 + Owner: Neutral + Location: 106,64 + Actor1611: t07 + Owner: Neutral + Location: 144,6 + Actor1612: t08 + Owner: Neutral + Location: 143,71 + Actor1613: t02 + Owner: Neutral + Location: 112,37 + Actor1615: t02.husk + Owner: Neutral + Location: 109,46 + Actor1616: t03 + Owner: Neutral + Location: 111,40 + Actor1617: t16 + Owner: Neutral + Location: 89,83 + Actor1619: t03 + Owner: Neutral + Location: 59,79 + Actor1620: t05 + Owner: Neutral + Location: 93,99 + Actor1621: t07 + Owner: Neutral + Location: 97,22 + Actor1622: t16 + Owner: Neutral + Location: 60,44 + Actor1625: t17 + Owner: Neutral + Location: 109,85 + Actor1626: t01 + Owner: Neutral + Location: 89,128 + Actor1627: t07 + Owner: Neutral + Location: 115,59 + Actor1628: t02 + Owner: Neutral + Location: 144,121 + Actor1629: t17 + Owner: Neutral + Location: 133,12 + Actor1630: t16 + Owner: Neutral + Location: 68,63 + Actor1631: t01 + Owner: Neutral + Location: 76,80 + Actor1632: t17 + Owner: Neutral + Location: 130,66 + Actor1633: t05 + Owner: Neutral + Location: 102,55 + Actor1634: t13 + Owner: Neutral + Location: 124,52 + Actor1635: t05 + Owner: Neutral + Location: 93,43 + Actor1637: t06 + Owner: Neutral + Location: 104,57 + Actor1638: t13 + Owner: Neutral + Location: 130,67 + Actor1639: t02 + Owner: Neutral + Location: 64,78 + Actor1640: t01 + Owner: Neutral + Location: 6,81 + Actor1641: t17 + Owner: Neutral + Location: 9,126 + Actor1642: t13 + Owner: Neutral + Location: 113,47 + Actor1643: t01 + Owner: Neutral + Location: 105,45 + Actor1644: t17 + Owner: Neutral + Location: 82,76 + Actor1645: t17 + Owner: Neutral + Location: 87,25 + Actor1646: t07 + Owner: Neutral + Location: 92,16 + Actor1647: t03 + Owner: Neutral + Location: 123,53 + Actor1648: t07 + Owner: Neutral + Location: 29,88 + Actor1649: t08 + Owner: Neutral + Location: 97,38 + Actor1650: t16 + Owner: Neutral + Location: 37,94 + Actor1651: t03 + Owner: Neutral + Location: 90,120 + Actor1652: t05 + Owner: Neutral + Location: 91,127 + Actor1654: t17 + Owner: Neutral + Location: 121,98 + Actor1655: t12 + Owner: Neutral + Location: 59,91 + Actor1656: t01 + Owner: Neutral + Location: 98,17 + Actor1657: t13 + Owner: Neutral + Location: 93,39 + Actor1658: t01 + Owner: Neutral + Location: 140,12 + Actor1659: t02.husk + Owner: Neutral + Location: 51,83 + Actor1660: t03 + Owner: Neutral + Location: 91,82 + Actor1661: t17 + Owner: Neutral + Location: 71,64 + Actor1662: t12 + Owner: Neutral + Location: 13,125 + Actor1663: t01 + Owner: Neutral + Location: 93,40 + Actor1664: t01 + Owner: Neutral + Location: 145,3 + Actor1665: t16 + Owner: Neutral + Location: 19,124 + Actor1666: t16 + Owner: Neutral + Location: 99,32 + Actor1667: t05 + Owner: Neutral + Location: 16,20 + Actor1668: t05 + Owner: Neutral + Location: 143,79 + Actor1670: t01.husk + Owner: Neutral + Location: 122,58 + Actor1671: t16 + Owner: Neutral + Location: 102,86 + Actor1672: t07 + Owner: Neutral + Location: 128,68 + Actor1674: t06 + Owner: Neutral + Location: 2,85 + Actor1677: t02.husk + Owner: Neutral + Location: 140,8 + Actor1678: t12 + Owner: Neutral + Location: 3,124 + Actor1679: t13.husk + Owner: Neutral + Location: 122,66 + Actor1680: t06 + Owner: Neutral + Location: 55,71 + Actor1681: t05 + Owner: Neutral + Location: 118,118 + Actor1682: t03.husk + Owner: Neutral + Location: 83,101 + Actor1683: t01 + Owner: Neutral + Location: 2,63 + Actor1684: t07 + Owner: Neutral + Location: 102,43 + Actor1685: t08 + Owner: Neutral + Location: 55,111 + Actor1686: t02 + Owner: Neutral + Location: 4,124 + Actor1687: t16 + Owner: Neutral + Location: 3,59 + Actor1688: t13 + Owner: Neutral + Location: 143,8 + Actor1689: t06 + Owner: Neutral + Location: 121,100 + Actor1690: t16 + Owner: Neutral + Location: 103,67 + Actor1691: t12 + Owner: Neutral + Location: 35,19 + Actor1692: t16 + Owner: Neutral + Location: 51,94 + Actor1694: t13 + Owner: Neutral + Location: 120,102 + Actor1695: t03 + Owner: Neutral + Location: 68,64 + Actor1696: t16 + Owner: Neutral + Location: 59,47 + Actor1697: t08 + Owner: Neutral + Location: 70,36 + Actor1699: t17.husk + Owner: Neutral + Location: 18,27 + Actor1700: t05 + Owner: Neutral + Location: 100,104 + Actor1701: t16 + Owner: Neutral + Location: 38,93 + Actor1702: t01 + Owner: Neutral + Location: 139,0 + Actor1703: t03 + Owner: Neutral + Location: 96,101 + Actor1705: t01.husk + Owner: Neutral + Location: 45,81 + Actor1706: t12 + Owner: Neutral + Location: 136,2 + Actor1707: t02 + Owner: Neutral + Location: 15,127 + Actor1708: t17 + Owner: Neutral + Location: 37,87 + Actor1709: t08 + Owner: Neutral + Location: 0,31 + Actor1710: t13 + Owner: Neutral + Location: 58,91 + Actor1711: t05 + Owner: Neutral + Location: 100,103 + Actor1712: t16 + Owner: Neutral + Location: 73,78 + Actor1713: t05 + Owner: Neutral + Location: 51,75 + Actor1714: t06 + Owner: Neutral + Location: 101,86 + Actor1715: t16 + Owner: Neutral + Location: 87,24 + Actor1716: t16 + Owner: Neutral + Location: 84,104 + Actor1717: t01 + Owner: Neutral + Location: 106,45 + Actor1718: t17 + Owner: Neutral + Location: 145,97 + Actor1719: t16 + Owner: Neutral + Location: 77,33 + Actor1720: t16.husk + Owner: Neutral + Location: 92,128 + Actor1721: t03 + Owner: Neutral + Location: 130,65 + Actor1722: t08 + Owner: Neutral + Location: 104,63 + Actor1723: t06 + Owner: Neutral + Location: 141,3 + Actor1724: t06 + Owner: Neutral + Location: 90,17 + Actor1725: t03.husk + Owner: Neutral + Location: 69,78 + Actor1726: t03 + Owner: Neutral + Location: 40,43 + Actor1727: t17 + Owner: Neutral + Location: 77,79 + Actor1728: t06 + Owner: Neutral + Location: 2,60 + Actor1729: t17 + Owner: Neutral + Location: 17,126 + Actor1730: t08 + Owner: Neutral + Location: 115,24 + Actor1731: t03 + Owner: Neutral + Location: 91,88 + Actor1734: t03 + Owner: Neutral + Location: 36,22 + Actor1735: t07 + Owner: Neutral + Location: 14,128 + Actor1736: t07 + Owner: Neutral + Location: 98,35 + Actor1737: t01 + Owner: Neutral + Location: 57,79 + Actor1738: t03 + Owner: Neutral + Location: 90,67 + Actor1739: t06 + Owner: Neutral + Location: 92,38 + Actor1740: t03 + Owner: Neutral + Location: 10,128 + Actor1741: t05 + Owner: Neutral + Location: 92,42 + Actor1743: t12 + Owner: Neutral + Location: 114,54 + Actor1744: t06 + Owner: Neutral + Location: 58,92 + Actor1745: t17 + Owner: Neutral + Location: 27,91 + Actor1746: t07 + Owner: Neutral + Location: 89,85 + Actor1747: t13 + Owner: Neutral + Location: 58,81 + Actor1748: t08 + Owner: Neutral + Location: 104,57 + Actor1749: t16 + Owner: Neutral + Location: 96,99 + Actor1750: t13 + Owner: Neutral + Location: 144,12 + Actor1751: t16 + Owner: Neutral + Location: 14,127 + Actor1752: t08 + Owner: Neutral + Location: 34,87 + Actor1753: t01 + Owner: Neutral + Location: 31,19 + Actor1754: t06 + Owner: Neutral + Location: 59,95 + Actor1756: t02.husk + Owner: Neutral + Location: 62,44 + Actor1757: t07 + Owner: Neutral + Location: 113,37 + Actor1758: t02.husk + Owner: Neutral + Location: 54,93 + Actor1759: t01 + Owner: Neutral + Location: 1,82 + Actor1760: t12 + Owner: Neutral + Location: 53,100 + Actor1761: t07 + Owner: Neutral + Location: 139,61 + Actor1762: t17 + Owner: Neutral + Location: 18,28 + Actor1763: t06.husk + Owner: Neutral + Location: 53,109 + Actor1764: t01 + Owner: Neutral + Location: 54,71 + Actor1766: t07 + Owner: Neutral + Location: 60,42 + Actor1767: t16 + Owner: Neutral + Location: 99,89 + Actor1768: t12 + Owner: Neutral + Location: 107,39 + Actor1769: t16 + Owner: Neutral + Location: 88,15 + Actor1770: t13 + Owner: Neutral + Location: 57,113 + Actor1772: t12 + Owner: Neutral + Location: 127,51 + Actor1773: t06 + Owner: Neutral + Location: 18,124 + Actor1774: t02 + Owner: Neutral + Location: 90,39 + Actor1775: t13 + Owner: Neutral + Location: 121,55 + Actor1776: t06 + Owner: Neutral + Location: 108,45 + Actor1777: t16 + Owner: Neutral + Location: 94,38 + Actor1778: t12.husk + Owner: Neutral + Location: 96,38 + Actor1779: t02 + Owner: Neutral + Location: 99,105 + Actor1780: t05.husk + Owner: Neutral + Location: 4,79 + Actor1781: t08 + Owner: Neutral + Location: 99,122 + Actor1782: t01 + Owner: Neutral + Location: 5,71 + Actor1783: t16 + Owner: Neutral + Location: 82,75 + Actor1784: t07 + Owner: Neutral + Location: 129,65 + Actor1785: t05 + Owner: Neutral + Location: 112,47 + Actor1786: t13 + Owner: Neutral + Location: 121,94 + Actor1787: t13 + Owner: Neutral + Location: 62,40 + Actor1788: t03 + Owner: Neutral + Location: 75,78 + Actor1789: t06 + Owner: Neutral + Location: 83,100 + Actor1790: t03 + Owner: Neutral + Location: 79,65 + Actor1791: t16 + Owner: Neutral + Location: 85,127 + Actor1792: t05 + Owner: Neutral + Location: 28,93 + Actor1793: t06 + Owner: Neutral + Location: 1,67 + Actor1794: t13 + Owner: Neutral + Location: 2,80 + Actor1795: t02 + Owner: Neutral + Location: 118,22 + Actor1796: t06 + Owner: Neutral + Location: 113,54 + Actor1797: t07 + Owner: Neutral + Location: 33,88 + Actor1798: t12 + Owner: Neutral + Location: 42,77 + Actor1799: t05 + Owner: Neutral + Location: 89,22 + Actor1800: t12 + Owner: Neutral + Location: 2,74 + Actor1801: t02 + Owner: Neutral + Location: 96,112 + Actor1802: t07 + Owner: Neutral + Location: 2,72 + Actor1803: t08 + Owner: Neutral + Location: 103,120 + Actor1804: t12 + Owner: Neutral + Location: 110,45 + Actor1805: t07 + Owner: Neutral + Location: 4,73 + Actor1806: t06 + Owner: Neutral + Location: 92,21 + Actor1807: t16.husk + Owner: Neutral + Location: 12,4 + Actor1808: t08 + Owner: Neutral + Location: 3,75 + Actor1809: t13 + Owner: Neutral + Location: 82,0 + Actor1810: t16.husk + Owner: Neutral + Location: 96,106 + Actor1811: t08 + Owner: Neutral + Location: 13,127 + Actor1812: t12 + Owner: Neutral + Location: 115,57 + Actor1813: t13 + Owner: Neutral + Location: 86,108 + Actor1814: t16 + Owner: Neutral + Location: 95,119 + Actor1815: t03 + Owner: Neutral + Location: 104,65 + Actor1816: t03 + Owner: Neutral + Location: 97,84 + Actor1817: t12 + Owner: Neutral + Location: 106,62 + Actor1818: t06 + Owner: Neutral + Location: 140,11 + Actor1819: t13.husk + Owner: Neutral + Location: 70,65 + Actor1820: t06 + Owner: Neutral + Location: 96,42 + Actor1821: t03 + Owner: Neutral + Location: 49,81 + Actor1822: t02 + Owner: Neutral + Location: 111,46 + Actor1823: t17 + Owner: Neutral + Location: 68,79 + Actor1824: t02 + Owner: Neutral + Location: 108,23 + Actor1825: t08 + Owner: Neutral + Location: 87,17 + Actor1826: t07 + Owner: Neutral + Location: 36,24 + Actor1827: t05 + Owner: Neutral + Location: 109,84 + Actor1828: t13 + Owner: Neutral + Location: 58,100 + Actor1829: t05 + Owner: Neutral + Location: 97,18 + Actor1831: t01 + Owner: Neutral + Location: 1,66 + Actor1833: t03 + Owner: Neutral + Location: 51,128 + Actor1834: t13 + Owner: Neutral + Location: 52,99 + Actor1835: t16 + Owner: Neutral + Location: 35,23 + Actor1836: t17 + Owner: Neutral + Location: 100,119 + Actor1837: t17 + Owner: Neutral + Location: 86,16 + Actor1838: t13 + Owner: Neutral + Location: 80,78 + Actor1839: t12 + Owner: Neutral + Location: 64,42 + Actor1840: t13 + Owner: Neutral + Location: 52,100 + Actor1841: t13 + Owner: Neutral + Location: 0,61 + Actor1842: t13 + Owner: Neutral + Location: 129,51 + Actor1843: t01 + Owner: Neutral + Location: 88,25 + Actor1844: t06 + Owner: Neutral + Location: 80,122 + Actor1845: t06 + Owner: Neutral + Location: 115,102 + Actor1846: t17 + Owner: Neutral + Location: 45,110 + Actor1847: t12 + Owner: Neutral + Location: 96,17 + Actor1848: t01 + Owner: Neutral + Location: 54,82 + Actor1849: t05 + Owner: Neutral + Location: 63,60 + Actor1850: t08 + Owner: Neutral + Location: 84,0 + Actor1851: t01 + Owner: Neutral + Location: 141,7 + Actor1852: t16.husk + Owner: Neutral + Location: 0,123 + Actor1853: t08 + Owner: Neutral + Location: 49,81 + Actor1856: t13 + Owner: Neutral + Location: 71,35 + Actor1857: t08 + Owner: Neutral + Location: 102,90 + Actor1858: t08 + Owner: Neutral + Location: 28,90 + Actor1859: t02 + Owner: Neutral + Location: 138,3 + Actor1860: t07 + Owner: Neutral + Location: 142,8 + Actor1861: t16.husk + Owner: Neutral + Location: 65,79 + Actor1862: t07 + Owner: Neutral + Location: 65,43 + Actor1863: t13.husk + Owner: Neutral + Location: 104,89 + Actor1864: t12 + Owner: Neutral + Location: 95,83 + Actor1865: t02 + Owner: Neutral + Location: 121,95 + Actor1866: t05 + Owner: Neutral + Location: 108,36 + Actor1867: t08 + Owner: Neutral + Location: 2,11 + Actor1868: t05 + Owner: Neutral + Location: 52,108 + Actor1870: t17.husk + Owner: Neutral + Location: 0,82 + Actor1871: t16 + Owner: Neutral + Location: 0,120 + Actor1872: t06 + Owner: Neutral + Location: 43,24 + Actor1873: t05 + Owner: Neutral + Location: 46,76 + Actor1874: t08 + Owner: Neutral + Location: 22,29 + Actor1875: t16 + Owner: Neutral + Location: 63,41 + Actor1876: t13 + Owner: Neutral + Location: 21,28 + Actor1877: t06 + Owner: Neutral + Location: 112,54 + Actor1878: t05 + Owner: Neutral + Location: 33,21 + Actor1879: t17.husk + Owner: Neutral + Location: 141,13 + Actor1880: t08 + Owner: Neutral + Location: 144,35 + Actor1881: t07 + Owner: Neutral + Location: 3,85 + Actor1882: t16 + Owner: Neutral + Location: 34,31 + Actor1883: t12 + Owner: Neutral + Location: 34,30 + Actor1884: t05 + Owner: Neutral + Location: 6,127 + Actor1885: t05 + Owner: Neutral + Location: 6,77 + Actor1886: t03 + Owner: Neutral + Location: 90,127 + Actor1887: t17 + Owner: Neutral + Location: 84,105 + Actor1888: t07 + Owner: Neutral + Location: 8,5 + Actor1889: t05 + Owner: Neutral + Location: 70,79 + Actor1890: t06 + Owner: Neutral + Location: 118,23 + Actor1891: t17 + Owner: Neutral + Location: 33,20 + Actor1892: t16 + Owner: Neutral + Location: 104,43 + Actor1893: t05 + Owner: Neutral + Location: 112,39 + Actor1894: t06 + Owner: Neutral + Location: 37,93 + Actor1895: t07 + Owner: Neutral + Location: 93,16 + Actor1896: t03 + Owner: Neutral + Location: 106,66 + Actor1897: t06 + Owner: Neutral + Location: 89,37 + Actor1898: t03 + Owner: Neutral + Location: 123,67 + Actor1899: t13 + Owner: Neutral + Location: 54,5 + Actor1900: t08.husk + Owner: Neutral + Location: 120,55 + Actor1901: t01 + Owner: Neutral + Location: 13,124 + Actor1902: t08 + Owner: Neutral + Location: 92,18 + Actor1903: t08 + Owner: Neutral + Location: 7,74 + Actor1904: t06 + Owner: Neutral + Location: 93,112 + Actor1905: t07 + Owner: Neutral + Location: 99,87 + Actor1906: t05.husk + Owner: Neutral + Location: 113,36 + Actor1907: t07 + Owner: Neutral + Location: 98,32 + Actor1908: t05 + Owner: Neutral + Location: 65,42 + Actor1909: t01 + Owner: Neutral + Location: 63,44 + Actor1910: t12 + Owner: Neutral + Location: 95,104 + Actor1911: t01 + Owner: Neutral + Location: 0,75 + Actor1912: t17 + Owner: Neutral + Location: 61,94 + Actor1913: t16 + Owner: Neutral + Location: 6,4 + Actor1918: t03 + Owner: Neutral + Location: 102,90 + Actor1919: t12 + Owner: Neutral + Location: 52,77 + Actor1920: t03.husk + Owner: Neutral + Location: 109,45 + Actor1921: t01 + Owner: Neutral + Location: 81,66 + Actor1922: t01 + Owner: Neutral + Location: 5,70 + Actor1923: t05 + Owner: Neutral + Location: 114,58 + Actor1925: t01 + Owner: Neutral + Location: 31,21 + Actor1927: t07 + Owner: Neutral + Location: 11,117 + Actor1928: t01 + Owner: Neutral + Location: 12,90 + Actor1929: t08 + Owner: Neutral + Location: 126,58 + Actor1930: t07 + Owner: Neutral + Location: 92,86 + Actor1932: t17 + Owner: Neutral + Location: 59,92 + Actor1933: t12 + Owner: Neutral + Location: 97,122 + Actor1934: t07.husk + Owner: Neutral + Location: 4,66 + Actor1935: t05 + Owner: Neutral + Location: 58,93 + Actor1936: t16 + Owner: Neutral + Location: 45,50 + Actor1937: t02 + Owner: Neutral + Location: 19,41 + Actor1938: t13 + Owner: Neutral + Location: 43,73 + Actor1939: t05 + Owner: Neutral + Location: 0,63 + Actor1940: t12 + Owner: Neutral + Location: 141,12 + Actor1941: t03 + Owner: Neutral + Location: 95,105 + Actor1942: t16 + Owner: Neutral + Location: 34,18 + Actor1943: t17 + Owner: Neutral + Location: 64,46 + Actor1944: t02 + Owner: Neutral + Location: 2,59 + Actor1945: t12 + Owner: Neutral + Location: 60,92 + Actor1946: t13 + Owner: Neutral + Location: 0,78 + Actor1947: t13 + Owner: Neutral + Location: 69,68 + Actor1948: t05 + Owner: Neutral + Location: 141,10 + Actor1949: t02 + Owner: Neutral + Location: 97,124 + Actor1950: t03.husk + Owner: Neutral + Location: 53,76 + Actor1951: t07 + Owner: Neutral + Location: 8,43 + Actor1952: t01 + Owner: Neutral + Location: 142,72 + Actor1953: t06 + Owner: Neutral + Location: 97,123 + Actor1954: t08 + Owner: Neutral + Location: 51,97 + Actor1955: t03 + Owner: Neutral + Location: 39,41 + Actor1958: t02 + Owner: Neutral + Location: 76,52 + Actor1959: t05 + Owner: Neutral + Location: 104,61 + Actor1960: t02 + Owner: Neutral + Location: 45,80 + Actor1961: t03 + Owner: Neutral + Location: 59,110 + Actor1962: t17 + Owner: Neutral + Location: 109,44 + Actor1963: t16 + Owner: Neutral + Location: 2,76 + Actor1964: t13 + Owner: Neutral + Location: 62,47 + Actor1966: t05 + Owner: Neutral + Location: 141,21 + Actor1967: t01 + Owner: Neutral + Location: 37,18 + Actor1968: t06 + Owner: Neutral + Location: 99,120 + Actor1969: t06 + Owner: Neutral + Location: 32,22 + Actor1970: t12 + Owner: Neutral + Location: 35,22 + Actor1971: t08 + Owner: Neutral + Location: 61,96 + Actor1972: t01 + Owner: Neutral + Location: 44,75 + Actor1973: t17 + Owner: Neutral + Location: 145,0 + Actor1974: t16 + Owner: Neutral + Location: 62,93 + Actor1975: t01 + Owner: Neutral + Location: 121,96 + Actor1976: t08 + Owner: Neutral + Location: 34,89 + Actor1977: t02 + Owner: Neutral + Location: 108,35 + Actor1978: t05 + Owner: Neutral + Location: 67,79 + Actor1979: t08 + Owner: Neutral + Location: 42,81 + Actor1980: t13 + Owner: Neutral + Location: 93,37 + Actor1982: t02 + Owner: Neutral + Location: 96,37 + Actor1983: t13 + Owner: Neutral + Location: 17,21 + Actor1984: t01 + Owner: Neutral + Location: 30,25 + Actor1985: t13 + Owner: Neutral + Location: 114,52 + Actor1986: t05 + Owner: Neutral + Location: 42,78 + Actor1987: t06 + Owner: Neutral + Location: 51,97 + Actor1988: t17 + Owner: Neutral + Location: 76,81 + Actor1989: t13 + Owner: Neutral + Location: 88,37 + Actor1990: t12 + Owner: Neutral + Location: 54,76 + Actor1991: t05 + Owner: Neutral + Location: 92,85 + Actor1992: t06.husk + Owner: Neutral + Location: 121,101 + Actor1993: t08 + Owner: Neutral + Location: 143,65 + Actor1994: t07 + Owner: Neutral + Location: 87,18 + Actor1995: t17 + Owner: Neutral + Location: 97,100 + Actor1996: t06 + Owner: Neutral + Location: 91,80 + Actor1997: t12 + Owner: Neutral + Location: 82,119 + Actor1998: t03 + Owner: Neutral + Location: 107,23 + Actor1999: t03.husk + Owner: Neutral + Location: 1,85 + Actor2000: t07 + Owner: Neutral + Location: 71,68 + Actor2001: t08 + Owner: Neutral + Location: 107,69 + Actor2002: t13 + Owner: Neutral + Location: 99,62 + Actor2003: t16 + Owner: Neutral + Location: 87,128 + Actor2004: t13 + Owner: Neutral + Location: 91,39 + Actor2006: t07 + Owner: Neutral + Location: 48,9 + Actor2007: t05 + Owner: Neutral + Location: 1,120 + Actor2008: t03 + Owner: Neutral + Location: 96,21 + Actor2009: t07 + Owner: Neutral + Location: 1,83 + Actor2010: t03 + Owner: Neutral + Location: 35,18 + Actor2011: t07 + Owner: Neutral + Location: 47,8 + Actor2012: t08.husk + Owner: Neutral + Location: 46,75 + Actor2013: t17 + Owner: Neutral + Location: 45,74 + Actor2014: t16 + Owner: Neutral + Location: 19,128 + Actor2015: t01 + Owner: Neutral + Location: 143,19 + Actor2016: t07 + Owner: Neutral + Location: 104,42 + Actor2017: t05 + Owner: Neutral + Location: 32,23 + Actor2018: t08 + Owner: Neutral + Location: 65,81 + Actor2019: t16 + Owner: Neutral + Location: 62,43 + Actor2020: t07 + Owner: Neutral + Location: 42,49 + Actor2021: t02 + Owner: Neutral + Location: 57,92 + Actor2022: t13 + Owner: Neutral + Location: 93,123 + Actor2023: t17 + Owner: Neutral + Location: 0,65 + Actor2025: t03 + Owner: Neutral + Location: 1,81 + Actor2026: t08 + Owner: Neutral + Location: 12,125 + Actor2027: t13 + Owner: Neutral + Location: 18,22 + Actor2028: t13 + Owner: Neutral + Location: 117,54 + Actor2029: t05 + Owner: Neutral + Location: 142,71 + Actor2030: t13 + Owner: Neutral + Location: 4,57 + Actor2031: t12 + Owner: Neutral + Location: 111,45 + Actor2032: t13 + Owner: Neutral + Location: 6,126 + Actor2034: t12 + Owner: Neutral + Location: 106,43 + Actor2035: t07 + Owner: Neutral + Location: 97,34 + Actor2036: t13 + Owner: Neutral + Location: 91,84 + Actor2037: t03 + Owner: Neutral + Location: 105,66 + Actor2038: t06 + Owner: Neutral + Location: 89,107 + Actor2040: t17 + Owner: Neutral + Location: 80,65 + Actor2041: t12 + Owner: Neutral + Location: 76,82 + Actor2042: t17 + Owner: Neutral + Location: 97,35 + Actor2043: t02 + Owner: Neutral + Location: 7,124 + Actor2044: t03 + Owner: Neutral + Location: 142,68 + Actor2045: t16.husk + Owner: Neutral + Location: 115,93 + Actor2046: t16 + Owner: Neutral + Location: 128,50 + Actor2047: t08 + Owner: Neutral + Location: 87,16 + Actor2049: t07 + Owner: Neutral + Location: 99,21 + Actor2050: t17 + Owner: Neutral + Location: 96,36 + Actor2051: t03 + Owner: Neutral + Location: 45,82 + Actor2052: t01 + Owner: Neutral + Location: 8,9 + Actor2053: t07 + Owner: Neutral + Location: 101,54 + Actor2054: t06.husk + Owner: Neutral + Location: 103,53 + Actor2055: t12.husk + Owner: Neutral + Location: 2,75 + Actor2057: t03 + Owner: Neutral + Location: 33,53 + Actor2058: t03.husk + Owner: Neutral + Location: 0,77 + Actor2059: t03 + Owner: Neutral + Location: 105,33 + Actor2060: t02 + Owner: Neutral + Location: 94,44 + Actor2061: t05 + Owner: Neutral + Location: 89,35 + Actor2062: t03 + Owner: Neutral + Location: 95,110 + Actor2063: t05 + Owner: Neutral + Location: 101,57 + Actor2065: t07 + Owner: Neutral + Location: 44,77 + Actor2066: t13 + Owner: Neutral + Location: 19,36 + Actor2067: t13 + Owner: Neutral + Location: 2,82 + Actor2069: t14 + Owner: Neutral + Location: 120,47 + Actor2070: t10 + Owner: Neutral + Location: 117,49 + Actor2071: t16 + Owner: Neutral + Location: 117,42 + Actor2072: t06 + Owner: Neutral + Location: 102,61 + Actor2073: t17 + Owner: Neutral + Location: 65,63 + Actor2074: t12 + Owner: Neutral + Location: 103,58 + Actor2075: t08 + Owner: Neutral + Location: 123,51 + Actor2076: t12 + Owner: Neutral + Location: 118,51 + Actor2077: t07 + Owner: Neutral + Location: 117,44 + Actor2078: t07 + Owner: Neutral + Location: 91,35 + Actor2080: t13 + Owner: Neutral + Location: 117,50 + Actor2081: t06 + Owner: Neutral + Location: 20,37 + Actor2082: t03 + Owner: Neutral + Location: 118,45 + Actor2083: t08 + Owner: Neutral + Location: 116,45 + Actor2084: t16 + Owner: Neutral + Location: 122,48 + Actor2085: t06 + Owner: Neutral + Location: 103,60 + Actor2086: t07 + Owner: Neutral + Location: 119,50 + Actor2087: t16 + Owner: Neutral + Location: 107,85 + Actor2088: t01 + Owner: Neutral + Location: 109,40 + Actor2089: t16 + Owner: Neutral + Location: 120,97 + Actor2090: t08 + Owner: Neutral + Location: 116,100 + Actor2091: t03 + Owner: Neutral + Location: 53,71 + Actor2092: t05 + Owner: Neutral + Location: 72,66 + Actor2093: t16 + Owner: Neutral + Location: 69,65 + Actor2094: t03 + Owner: Neutral + Location: 50,72 + Actor2095: t01 + Owner: Neutral + Location: 120,52 + Actor2096: t08 + Owner: Neutral + Location: 100,86 + Actor2097: t03 + Owner: Neutral + Location: 53,5 + Actor2033: t08 + Owner: Neutral + Location: 76,98 + Actor2048: t06 + Owner: Neutral + Location: 77,97 + Actor2064: t01 + Owner: Neutral + Location: 78,97 + Actor2098: t03 + Owner: Neutral + Location: 79,97 + Actor2099: t16.husk + Owner: Neutral + Location: 80,97 + Actor2100: t02 + Owner: Neutral + Location: 78,98 + Actor2101: t08 + Owner: Neutral + Location: 79,99 + Actor2102: t01.husk + Owner: Neutral + Location: 80,98 + Actor2103: t16.husk + Owner: Neutral + Location: 81,98 + Actor2104: t12 + Owner: Neutral + Location: 77,99 + Actor2105: t02 + Owner: Neutral + Location: 78,99 + Actor2106: t05 + Owner: Neutral + Location: 79,99 + Actor2107: t12 + Owner: Neutral + Location: 80,99 + Actor2108: t06 + Owner: Neutral + Location: 81,99 + Actor2109: t08 + Owner: Neutral + Location: 79,101 + Actor2039: brik + Owner: Nod + Location: 64,23 + Actor2110: brik + Owner: Nod + Location: 64,22 + Actor2111: brik + Owner: Nod + Location: 65,22 + Actor2112: brik + Owner: Nod + Location: 65,23 + Actor2113: brik + Owner: Nod + Location: 66,23 + Actor2114: brik + Owner: Nod + Location: 67,23 + Actor2115: brik + Owner: Nod + Location: 68,23 + Actor2116: brik + Owner: Nod + Location: 68,24 + Actor2117: brik + Owner: Nod + Location: 69,24 + Actor2118: brik + Owner: Nod + Location: 70,24 + Actor2119: brik + Owner: Nod + Location: 71,24 + Actor2120: brik + Owner: Nod + Location: 71,23 + Actor2121: brik + Owner: Nod + Location: 71,22 + Actor2122: brik + Owner: Nod + Location: 72,22 + Actor2123: brik + Owner: Nod + Location: 74,22 + Actor2124: brik + Owner: Nod + Location: 73,22 + Actor2125: brik + Owner: Nod + Location: 75,22 + Actor2126: brik + Owner: Nod + Location: 75,21 + Actor2127: brik + Owner: Nod + Location: 74,21 + Actor2128: brik + Owner: Nod + Location: 79,16 + Actor2129: brik + Owner: Nod + Location: 79,15 + Actor2130: brik + Owner: Nod + Location: 80,15 + Actor2131: brik + Owner: Nod + Location: 80,16 + Actor2132: brik + Owner: Nod + Location: 80,14 + Actor2133: brik + Owner: Nod + Location: 80,13 + Actor2134: brik + Owner: Nod + Location: 80,12 + Actor2135: brik + Owner: Nod + Location: 80,11 + Actor2136: brik + Owner: Nod + Location: 79,11 + Actor2137: brik + Owner: Nod + Location: 79,12 + Actor2138: brik + Owner: Nod + Location: 58,18 + Actor2139: brik + Owner: Nod + Location: 58,17 + Actor2140: brik + Owner: Nod + Location: 59,18 + Actor2141: brik + Owner: Nod + Location: 59,17 + Actor2142: brik + Owner: Nod + Location: 58,16 + Actor2143: brik + Owner: Nod + Location: 58,15 + Actor2144: brik + Owner: Nod + Location: 58,14 + Actor2145: brik + Owner: Nod + Location: 58,13 + Actor2146: brik + Owner: Nod + Location: 58,12 + Actor2150: brik + Owner: Nod + Location: 58,8 + Actor2151: brik + Owner: Nod + Location: 58,7 + Actor2152: brik + Owner: Nod + Location: 58,6 + Actor2153: brik + Owner: Nod + Location: 58,5 + Actor2154: brik + Owner: Nod + Location: 58,4 + Actor2155: brik + Owner: Nod + Location: 58,3 + Actor2156: brik + Owner: Nod + Location: 58,1 + Actor2157: brik + Owner: Nod + Location: 58,2 + Actor2158: brik + Owner: Nod + Location: 59,1 + Actor2159: brik + Owner: Nod + Location: 61,1 + Actor2160: brik + Owner: Nod + Location: 60,1 + Actor2161: brik + Owner: Nod + Location: 63,1 + Actor2162: brik + Owner: Nod + Location: 62,1 + Actor2163: brik + Owner: Nod + Location: 64,1 + Actor2164: brik + Owner: Nod + Location: 66,1 + Actor2165: brik + Owner: Nod + Location: 65,1 + Actor2166: brik + Owner: Nod + Location: 67,1 + Actor2079: brik + Owner: Nod + Location: 79,6 + Actor2167: brik + Owner: Nod + Location: 79,5 + Actor2168: brik + Owner: Nod + Location: 80,5 + Actor2169: brik + Owner: Nod + Location: 80,6 + Actor2170: brik + Owner: Nod + Location: 80,4 + Actor2171: brik + Owner: Nod + Location: 80,3 + Actor2172: brik + Owner: Nod + Location: 80,2 + Actor2173: brik + Owner: Nod + Location: 80,1 + Actor2174: brik + Owner: Nod + Location: 79,1 + Actor2175: brik + Owner: Nod + Location: 77,1 + Actor2176: brik + Owner: Nod + Location: 69,1 + Actor2177: brik + Owner: Nod + Location: 68,1 + Actor2178: brik + Owner: Nod + Location: 70,1 + Actor2179: brik + Owner: Nod + Location: 71,1 + Actor2180: brik + Owner: Nod + Location: 72,1 + Actor2181: brik + Owner: Nod + Location: 73,1 + Actor2182: brik + Owner: Nod + Location: 74,1 + Actor2183: brik + Owner: Nod + Location: 75,1 + Actor2184: brik + Owner: Nod + Location: 76,1 + Actor2185: brik + Owner: Nod + Location: 78,1 + Actor2186: brik + Owner: Greece + Location: 28,97 + Actor2187: brik + Owner: Greece + Location: 28,98 + Actor2188: brik + Owner: Greece + Location: 27,97 + Actor2189: brik + Owner: Greece + Location: 27,98 + Actor2190: brik + Owner: Greece + Location: 26,97 + Actor2191: brik + Owner: Greece + Location: 24,97 + Actor2192: brik + Owner: Greece + Location: 25,97 + Actor2193: brik + Owner: Greece + Location: 24,98 + Actor2194: brik + Owner: Greece + Location: 25,98 + Actor2195: brik + Owner: Greece + Location: 28,99 + Actor2196: brik + Owner: Greece + Location: 28,100 + Actor2197: brik + Owner: Greece + Location: 28,101 + Actor2198: brik + Owner: Greece + Location: 28,102 + Actor2199: brik + Owner: Greece + Location: 28,103 + Actor2200: brik + Owner: Greece + Location: 28,104 + Actor2201: brik + Owner: Greece + Location: 27,104 + Actor2203: brik + Owner: Greece + Location: 27,111 + Actor2204: brik + Owner: Greece + Location: 28,111 + Actor2205: brik + Owner: Greece + Location: 28,112 + Actor2206: brik + Owner: Greece + Location: 27,112 + Actor2207: brik + Owner: Greece + Location: 28,113 + Actor2208: brik + Owner: Greece + Location: 28,114 + Actor2209: brik + Owner: Greece + Location: 28,115 + Actor2210: brik + Owner: Greece + Location: 28,116 + Actor2211: brik + Owner: Greece + Location: 27,116 + Actor2212: brik + Owner: Greece + Location: 27,115 + Actor2213: brik + Owner: Greece + Location: 26,116 + Actor2214: brik + Owner: Greece + Location: 25,116 + Actor2215: brik + Owner: Greece + Location: 24,116 + Actor2216: brik + Owner: Greece + Location: 23,116 + Actor2217: brik + Owner: Greece + Location: 22,116 + Actor2218: brik + Owner: Greece + Location: 21,116 + Actor2219: brik + Owner: Greece + Location: 20,116 + Actor2220: brik + Owner: Greece + Location: 20,115 + Actor2221: brik + Owner: Greece + Location: 21,115 + Actor2222: brik + Owner: Greece + Location: 12,97 + Actor2223: brik + Owner: Greece + Location: 11,97 + Actor2224: brik + Owner: Greece + Location: 11,98 + Actor2225: brik + Owner: Greece + Location: 12,98 + Actor2226: brik + Owner: Greece + Location: 13,97 + Actor2227: brik + Owner: Greece + Location: 14,97 + Actor2228: brik + Owner: Greece + Location: 15,97 + Actor2229: brik + Owner: Greece + Location: 16,97 + Actor2230: brik + Owner: Greece + Location: 17,97 + Actor2231: brik + Owner: Greece + Location: 18,97 + Actor2232: brik + Owner: Greece + Location: 18,98 + Actor2233: brik + Owner: Greece + Location: 17,98 + Actor2234: brik + Owner: Greece + Location: 14,116 + Actor2235: brik + Owner: Greece + Location: 14,115 + Actor2236: brik + Owner: Greece + Location: 13,115 + Actor2237: brik + Owner: Greece + Location: 13,116 + Actor2238: brik + Owner: Greece + Location: 12,116 + Actor2239: brik + Owner: Greece + Location: 10,116 + Actor2240: brik + Owner: Greece + Location: 11,116 + Actor2241: brik + Owner: Greece + Location: 9,116 + Actor2242: brik + Owner: Greece + Location: 8,116 + Actor2243: brik + Owner: Greece + Location: 7,116 + Actor2244: brik + Owner: Greece + Location: 5,116 + Actor2245: brik + Owner: Greece + Location: 4,116 + Actor2246: brik + Owner: Greece + Location: 6,116 + Actor2247: brik + Owner: Greece + Location: 3,116 + Actor2248: brik + Owner: Greece + Location: 2,116 + Actor2249: brik + Owner: Greece + Location: 1,116 + Actor2250: brik + Owner: Greece + Location: 1,115 + Actor2251: brik + Owner: Greece + Location: 1,114 + Actor2252: brik + Owner: Greece + Location: 1,113 + Actor2253: brik + Owner: Greece + Location: 1,112 + Actor2254: brik + Owner: Greece + Location: 1,111 + Actor2255: brik + Owner: Greece + Location: 2,111 + Actor2256: brik + Owner: Greece + Location: 2,112 + Actor2257: brik + Owner: Greece + Location: 1,104 + Actor2258: brik + Owner: Greece + Location: 1,103 + Actor2259: brik + Owner: Greece + Location: 2,103 + Actor2260: brik + Owner: Greece + Location: 2,104 + Actor2261: brik + Owner: Greece + Location: 1,101 + Actor2262: brik + Owner: Greece + Location: 1,102 + Actor2263: brik + Owner: Greece + Location: 1,100 + Actor2264: brik + Owner: Greece + Location: 1,99 + Actor2265: brik + Owner: Greece + Location: 2,99 + Actor2266: brik + Owner: Greece + Location: 2,100 + Actor2267: brik + Owner: USSR + Location: 122,89 + Actor2268: brik + Owner: USSR + Location: 122,88 + Actor2269: brik + Owner: USSR + Location: 123,88 + Actor2270: brik + Owner: USSR + Location: 123,89 + Actor2271: brik + Owner: USSR + Location: 122,90 + Actor2272: brik + Owner: USSR + Location: 122,91 + Actor2273: brik + Owner: USSR + Location: 122,92 + Actor2274: brik + Owner: USSR + Location: 122,93 + Actor2275: brik + Owner: USSR + Location: 123,93 + Actor2276: brik + Owner: USSR + Location: 123,92 + Actor2277: brik + Owner: USSR + Location: 126,84 + Actor2278: brik + Owner: USSR + Location: 126,85 + Actor2279: brik + Owner: USSR + Location: 127,84 + Actor2280: brik + Owner: USSR + Location: 127,85 + Actor2281: brik + Owner: USSR + Location: 128,84 + Actor2282: brik + Owner: USSR + Location: 128,83 + Actor2283: brik + Owner: USSR + Location: 129,83 + Actor2284: brik + Owner: USSR + Location: 130,83 + Actor2285: brik + Owner: USSR + Location: 131,83 + Actor2286: brik + Owner: USSR + Location: 131,82 + Actor2287: brik + Owner: USSR + Location: 132,82 + Actor2288: brik + Owner: USSR + Location: 132,83 + Actor2293: brik + Owner: USSR + Location: 142,82 + Actor2295: brik + Owner: USSR + Location: 143,82 + Actor2296: brik + Owner: USSR + Location: 144,82 + Actor2297: brik + Owner: USSR + Location: 144,83 + Actor2298: brik + Owner: USSR + Location: 143,83 + Actor2299: brik + Owner: USSR + Location: 144,84 + Actor2300: brik + Owner: USSR + Location: 144,85 + Actor2301: brik + Owner: USSR + Location: 144,86 + Actor2302: brik + Owner: USSR + Location: 138,105 + Actor2303: brik + Owner: USSR + Location: 138,106 + Actor2304: brik + Owner: USSR + Location: 139,106 + Actor2305: brik + Owner: USSR + Location: 139,105 + Actor2306: brik + Owner: USSR + Location: 140,106 + Actor2307: brik + Owner: USSR + Location: 141,106 + Actor2308: brik + Owner: USSR + Location: 142,106 + Actor2309: brik + Owner: USSR + Location: 144,87 + Actor2310: brik + Owner: USSR + Location: 144,88 + Actor2311: brik + Owner: USSR + Location: 144,89 + Actor2312: brik + Owner: USSR + Location: 144,90 + Actor2313: brik + Owner: USSR + Location: 144,91 + Actor2314: brik + Owner: USSR + Location: 144,92 + Actor2315: brik + Owner: USSR + Location: 144,93 + Actor2316: brik + Owner: USSR + Location: 144,95 + Actor2317: brik + Owner: USSR + Location: 144,94 + Actor2318: brik + Owner: USSR + Location: 144,97 + Actor2319: brik + Owner: USSR + Location: 144,96 + Actor2320: brik + Owner: USSR + Location: 144,99 + Actor2321: brik + Owner: USSR + Location: 144,100 + Actor2322: brik + Owner: USSR + Location: 144,98 + Actor2323: brik + Owner: USSR + Location: 144,102 + Actor2324: brik + Owner: USSR + Location: 144,101 + Actor2325: brik + Owner: USSR + Location: 144,103 + Actor2326: brik + Owner: USSR + Location: 144,104 + Actor2327: brik + Owner: USSR + Location: 144,105 + Actor2328: brik + Owner: USSR + Location: 144,106 + Actor2329: brik + Owner: USSR + Location: 143,106 + Actor2330: brik + Owner: USSR + Location: 134,105 + Actor2331: brik + Owner: USSR + Location: 133,106 + Actor2332: brik + Owner: USSR + Location: 134,106 + Actor2333: brik + Owner: USSR + Location: 133,105 + Actor2334: brik + Owner: USSR + Location: 132,106 + Actor2335: brik + Owner: USSR + Location: 131,106 + Actor2336: brik + Owner: USSR + Location: 130,106 + Actor2345: brik + Owner: USSR + Location: 124,103 + Actor2346: brik + Owner: USSR + Location: 124,102 + Actor2348: brik + Owner: USSR + Location: 124,100 + Actor2349: brik + Owner: USSR + Location: 123,99 + Actor2350: brik + Owner: USSR + Location: 124,99 + Actor2351: brik + Owner: USSR + Location: 123,100 + Actor2352: brik + Owner: USSR + Location: 123,101 + Actor2353: brik + Owner: USSR + Location: 123,102 + Actor2354: brik + Owner: USSR + Location: 123,103 + Actor2347: brik + Owner: USSR + Location: 130,105 + Actor2355: brik + Owner: USSR + Location: 131,105 + Actor2337: tsla + Owner: USSR + Location: 132,105 + Actor2338: tsla + Owner: USSR + Location: 124,101 + Actor2339: tsla + Owner: USSR + Location: 123,90 + Actor2341: tsla + Owner: USSR + Location: 129,84 + Actor2342: tsla + Owner: USSR + Location: 140,105 + Actor2343: brik + Owner: Nod + Location: 59,12 + Actor2344: brik + Owner: Nod + Location: 59,13 + Actor2356: brik + Owner: Nod + Location: 59,8 + Actor2357: brik + Owner: Nod + Location: 59,7 + Actor2358: obli + Owner: Nod + Location: 73,21 + Actor2359: obli + Owner: Nod + Location: 66,22 + Actor2360: obli + Owner: Nod + Location: 59,16 + Actor2361: obli + Owner: Nod + Location: 79,14 + Actor2362: obli + Owner: Nod + Location: 79,4 + Actor2363: obli + Owner: Nod + Location: 59,6 + Actor2364: pris + Owner: Greece + Location: 26,98 + Actor2366: pris + Owner: Greece + Location: 16,98 + Actor2367: pris + Owner: Greece + Location: 27,113 + Actor2368: pris + Owner: Greece + Location: 22,115 + Actor2369: pris + Owner: Greece + Location: 13,98 + Actor2372: s2 + Owner: Scrin + SubCell: 3 + Location: 59,72 + Facing: 512 + Actor2373: s2 + Owner: Scrin + Location: 59,72 + SubCell: 1 + Facing: 512 + Actor2378: s2 + Owner: Scrin + Location: 59,72 + SubCell: 2 + Facing: 512 + Actor2379: s2 + Owner: Scrin + SubCell: 3 + Facing: 512 + Location: 67,72 + Actor2380: s2 + Owner: Scrin + SubCell: 1 + Facing: 512 + Location: 67,72 + Actor2381: s2 + Owner: Scrin + SubCell: 2 + Facing: 512 + Location: 67,72 + Actor2388: s1 + Owner: Scrin + SubCell: 3 + Location: 67,74 + Facing: 512 + Actor2389: s1 + Owner: Scrin + Location: 67,74 + SubCell: 1 + Facing: 512 + Actor2390: s1 + Owner: Scrin + Location: 67,74 + SubCell: 2 + Facing: 512 + Actor2385: s1 + Owner: Scrin + SubCell: 3 + Facing: 512 + Location: 59,74 + Actor2386: s1 + Owner: Scrin + SubCell: 1 + Facing: 512 + Location: 59,74 + Actor2387: s1 + Owner: Scrin + SubCell: 2 + Facing: 512 + Location: 59,74 + Actor2391: split2 + Owner: Neutral + Location: 37,124 + Actor2395: split2 + Owner: Neutral + Location: 112,109 + Actor2396: split2 + Owner: Neutral + Location: 123,114 + Actor2397: split2 + Owner: Neutral + Location: 87,6 + Actor2400: hand + Owner: Nod + Location: 73,16 + Actor2401: proc.td + Owner: Nod + Location: 75,4 + Actor2402: nuk2 + Owner: Nod + Location: 59,2 + Actor2403: nuk2 + Owner: Nod + Location: 61,2 + Actor2404: nuk2 + Owner: Nod + Location: 63,2 + Actor2406: airs + Owner: Nod + Location: 64,13 + Actor2407: nuk2 + Owner: Nod + Location: 72,2 + Actor2408: nuk2 + Owner: Nod + Location: 70,2 + Actor2409: smcv + Owner: Scrin + Facing: 384 + Location: 63,73 + Prodigy: pdgy + Owner: Scrin + SubCell: 3 + Location: 63,69 + Facing: 523 + Actor2382: intl + Owner: Scrin + Facing: 512 + Location: 63,70 + Actor2374: s1 + Owner: Scrin + SubCell: 3 + Facing: 512 + Location: 63,76 + Actor2383: s1 + Owner: Scrin + SubCell: 1 + Facing: 512 + Location: 63,76 + Actor2384: s1 + Owner: Scrin + SubCell: 2 + Facing: 512 + Location: 63,76 + Actor2371: tpod + Owner: Scrin + Facing: 512 + Location: 61,71 + Actor2376: shrw + Owner: Scrin + Facing: 512 + Location: 61,74 + Actor2375: tpod + Owner: Scrin + Facing: 512 + Location: 65,71 + Actor2377: shrw + Owner: Scrin + Facing: 512 + Location: 65,74 + Actor2410: split2 + Owner: Neutral + Location: 75,65 + Actor2411: split2 + Owner: Neutral + Location: 72,61 + Actor2412: gun.nod + Owner: Nod + Location: 63,23 + TurretFacing: 372 + Actor2413: gun.nod + Owner: Nod + Location: 58,19 + TurretFacing: 499 + Actor2414: gun.nod + Owner: Nod + Location: 76,22 + TurretFacing: 610 + Actor2415: gun.nod + Owner: Nod + Location: 80,17 + TurretFacing: 634 + Actor2416: ftur + Owner: USSR + Location: 125,84 + Actor2417: ftur + Owner: USSR + Location: 122,87 + Actor2418: ftur + Owner: USSR + Location: 135,81 + Actor2419: ftur + Owner: USSR + Location: 127,105 + Actor2420: proc + Owner: USSR + Location: 127,98 + SovietConyard: fact + Owner: USSR + Location: 141,93 + Actor2422: weap + Owner: USSR + Location: 129,88 + Actor2423: apwr + Owner: USSR + Location: 141,98 + Actor2424: apwr + Owner: USSR + Location: 141,89 + Actor2425: apwr + Owner: USSR + Location: 138,89 + Actor2426: apwr + Owner: USSR + Location: 137,94 + NodConyard: afac + Owner: Nod + Location: 66,2 + Actor2428: apwr + Owner: Greece + Location: 2,113 + Actor2429: apwr + Owner: Greece + Location: 5,113 + Actor2430: apwr + Owner: Greece + Location: 8,113 + Actor2431: apwr + Owner: Greece + Location: 4,100 + Actor2432: proc + Owner: Greece + Location: 22,107 + Actor2433: tent + Owner: Greece + Location: 17,101 + Actor2434: weap + Owner: Greece + Location: 13,101 + Actor2437: agun + Owner: Greece + Location: 26,100 + Actor2438: pbox + Owner: Greece + Location: 23,96 + Actor2439: pbox + Owner: Greece + Location: 19,95 + Actor2440: brik + Owner: Greece + Location: 27,105 + Actor2441: brik + Owner: Greece + Location: 28,105 + Actor2442: pris + Owner: Greece + Location: 27,103 + Actor2365: pbox + Owner: Greece + Location: 29,105 + Actor2435: pbox + Owner: Greece + Location: 29,111 + Actor2436: sam + Owner: USSR + Location: 130,84 + Actor2443: sam + Owner: USSR + Location: 125,90 + Actor2294: brik + Owner: USSR + Location: 141,82 + Actor2289: brik + Owner: USSR + Location: 138,82 + Actor2290: brik + Owner: USSR + Location: 139,82 + Actor2291: brik + Owner: USSR + Location: 140,82 + Actor2292: brik + Owner: USSR + Location: 138,83 + Actor2445: brik + Owner: USSR + Location: 139,83 + Actor2446: tsla + Owner: USSR + Location: 140,83 + Actor2340: sam + Owner: USSR + Location: 141,83 + Actor2447: sam + Owner: USSR + Location: 141,105 + Actor2448: sam + Owner: USSR + Location: 123,96 + Actor2449: agun + Owner: Greece + Location: 11,99 + Actor2450: agun + Owner: Greece + Location: 20,103 + Actor2451: agun + Owner: Greece + Location: 5,98 + Actor2452: agun + Owner: Greece + Location: 24,115 + Actor2453: agun + Owner: Greece + Location: 11,115 + Actor2454: nsam + Owner: Nod + Location: 69,23 + Actor2455: nsam + Owner: Nod + Location: 59,14 + Actor2456: nsam + Owner: Nod + Location: 77,2 + Actor2457: nsam + Owner: Nod + Location: 77,12 + Actor2467: split2 + Owner: Neutral + Location: 74,116 + Actor2468: split2 + Owner: Neutral + Location: 79,112 + Actor2469: macs + Owner: Neutral + Location: 132,119 + Actor2470: hosp + Owner: Neutral + Location: 46,4 + Actor2471: oilb + Owner: Neutral + Location: 41,99 + Actor2472: oilb + Owner: Neutral + Location: 44,99 + Actor2473: chain + Owner: Neutral + Location: 46,3 + Actor2474: chain + Owner: Neutral + Location: 47,3 + Actor2475: chain + Owner: Neutral + Location: 48,3 + Actor2476: chain + Owner: Neutral + Location: 48,4 + Actor2477: chain + Owner: Neutral + Location: 48,5 + Actor2478: chain + Owner: Neutral + Location: 45,3 + Actor2479: chain + Owner: Neutral + Location: 45,4 + Actor2480: chain + Owner: Neutral + Location: 44,4 + Actor2481: chain + Owner: Neutral + Location: 43,4 + Actor2482: chain + Owner: Neutral + Location: 43,5 + Actor2483: chain + Owner: Neutral + Location: 48,6 + Actor2484: chain + Owner: Neutral + Location: 48,7 + Actor2485: chain + Owner: Neutral + Location: 47,7 + Actor2486: chain + Owner: Neutral + Location: 46,7 + Actor2487: barb + Owner: Neutral + Location: 131,120 + Actor2488: barb + Owner: Neutral + Location: 131,119 + Actor2489: barb + Owner: Neutral + Location: 131,118 + Actor2490: barb + Owner: Neutral + Location: 132,118 + Actor2491: barb + Owner: Neutral + Location: 133,118 + Actor2492: barb + Owner: Neutral + Location: 130,120 + Actor2493: barb + Owner: Neutral + Location: 134,118 + Actor2494: barb + Owner: Neutral + Location: 134,119 + Actor2495: barb + Owner: Neutral + Location: 135,119 + Actor2496: sbag + Owner: Neutral + Location: 41,98 + Actor2497: sbag + Owner: Neutral + Location: 40,98 + Actor2498: sbag + Owner: Neutral + Location: 40,99 + Actor2499: sbag + Owner: Neutral + Location: 42,98 + Actor2500: sbag + Owner: Neutral + Location: 40,100 + Actor2501: sbag + Owner: Neutral + Location: 44,98 + Actor2502: sbag + Owner: Neutral + Location: 43,98 + Actor2503: sbag + Owner: Neutral + Location: 45,98 + Actor2504: sbag + Owner: Neutral + Location: 46,98 + Actor2505: sbag + Owner: Neutral + Location: 46,99 + Actor2506: sbag + Owner: Neutral + Location: 46,100 + Actor2507: sbag + Owner: Neutral + Location: 40,101 + Actor2508: sbag + Owner: Neutral + Location: 46,101 + Actor2509: cryo + Owner: Greece + Location: 19,99 + Facing: 896 + Actor2510: cryo + Owner: Greece + Location: 25,104 + Facing: 896 + Actor2511: mrj + Owner: Greece + Location: 14,99 + Facing: 896 + Actor2512: 2tnk + Owner: Greece + Location: 20,97 + Facing: 896 + Actor2513: 2tnk + Owner: Greece + Location: 23,94 + Facing: 896 + Actor2514: 2tnk + Owner: Greece + Location: 30,103 + Facing: 896 + Actor2515: 2tnk + Owner: Greece + Location: 31,108 + Facing: 896 + Actor2516: 2tnk + Owner: Greece + Location: 31,111 + Facing: 896 + Actor2517: ifv + Owner: Greece + Location: 22,100 + Facing: 896 + Actor2518: ifv + Owner: Greece + Location: 23,102 + Facing: 896 + Actor2519: ptnk + Owner: Greece + Location: 27,109 + Facing: 896 + Actor2520: ptnk + Owner: Greece + Location: 19,102 + Facing: 896 + Actor2521: e1 + Owner: Greece + SubCell: 3 + Location: 30,111 + Facing: 896 + Actor2522: e1 + Owner: Greece + Location: 30,111 + SubCell: 1 + Facing: 896 + Actor2523: e1 + Owner: Greece + SubCell: 3 + Location: 32,109 + Facing: 896 + Actor2524: e1 + Owner: Greece + SubCell: 3 + Facing: 896 + Location: 31,103 + Actor2525: e1 + Owner: Greece + SubCell: 1 + Facing: 896 + Location: 31,103 + Actor2526: e1 + Owner: Greece + SubCell: 3 + Facing: 896 + Location: 20,98 + Actor2527: e1 + Owner: Greece + SubCell: 1 + Facing: 896 + Location: 20,98 + Actor2528: e1 + Owner: Greece + SubCell: 3 + Facing: 896 + Location: 24,101 + Actor2529: e1 + Owner: Greece + SubCell: 1 + Facing: 896 + Location: 24,101 + Actor2530: e1 + Owner: Greece + SubCell: 3 + Facing: 896 + Location: 23,100 + Actor2531: e1 + Owner: Greece + SubCell: 3 + Facing: 896 + Location: 21,97 + Actor2532: e1 + Owner: Greece + SubCell: 3 + Facing: 896 + Location: 22,94 + Actor2533: e3 + Owner: Greece + SubCell: 3 + Location: 29,108 + Facing: 896 + Actor2534: e3 + Owner: Greece + SubCell: 3 + Facing: 896 + Location: 25,103 + Actor2535: e3 + Owner: Greece + SubCell: 3 + Facing: 896 + Location: 19,98 + Actor2536: 3tnk + Owner: USSR + Location: 123,87 + Facing: 128 + Actor2537: 3tnk + Owner: USSR + Location: 125,85 + Facing: 128 + Actor2538: 3tnk + Owner: USSR + Location: 133,81 + Facing: 128 + Actor2539: 3tnk + Owner: USSR + Location: 137,81 + Facing: 128 + Actor2540: 4tnk + Owner: USSR + Location: 126,88 + Facing: 128 + Actor2541: 4tnk + Owner: USSR + Location: 135,85 + Facing: 128 + Actor2542: v2rl + Owner: USSR + Location: 124,92 + Facing: 128 + Actor2543: v2rl + Owner: USSR + Location: 124,98 + Facing: 128 + Actor2544: v2rl + Owner: USSR + Location: 132,84 + Facing: 128 + Actor2545: e1 + Owner: USSR + SubCell: 3 + Location: 124,89 + Facing: 128 + Actor2546: e1 + Owner: USSR + Location: 124,89 + SubCell: 1 + Facing: 128 + Actor2547: e1 + Owner: USSR + SubCell: 3 + Location: 127,86 + Facing: 128 + Actor2548: e1 + Owner: USSR + SubCell: 3 + Facing: 128 + Location: 132,81 + Actor2549: e1 + Owner: USSR + SubCell: 1 + Facing: 128 + Location: 132,81 + Actor2550: e1 + Owner: USSR + SubCell: 3 + Facing: 128 + Location: 138,80 + Actor2551: e1 + Owner: USSR + SubCell: 1 + Facing: 128 + Location: 138,80 + Actor2552: e1 + Owner: USSR + SubCell: 3 + Facing: 128 + Location: 122,84 + Actor2553: e1 + Owner: USSR + SubCell: 1 + Facing: 128 + Location: 122,84 + Actor2554: e1 + Owner: USSR + SubCell: 3 + Facing: 128 + Location: 120,85 + Actor2555: e1 + Owner: USSR + SubCell: 3 + Facing: 128 + Location: 134,80 + Actor2556: e3 + Owner: USSR + SubCell: 3 + Location: 133,83 + Facing: 128 + Actor2557: e3 + Owner: USSR + SubCell: 3 + Location: 129,85 + Facing: 128 + Actor2558: e3 + Owner: USSR + SubCell: 3 + Location: 126,94 + Facing: 128 + Actor2559: e3 + Owner: USSR + SubCell: 3 + Location: 124,95 + Facing: 128 + Actor2560: n1 + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 60,19 + Actor2561: n1 + Owner: Nod + Facing: 384 + Location: 60,19 + SubCell: 1 + Actor2562: n1 + Owner: Nod + SubCell: 3 + Location: 76,21 + Facing: 682 + Actor2563: n1 + Owner: Nod + Location: 76,21 + SubCell: 1 + Facing: 682 + Actor2564: n1 + Owner: Nod + SubCell: 3 + Location: 80,18 + Facing: 682 + Actor2565: n1 + Owner: Nod + SubCell: 3 + Location: 79,17 + Facing: 682 + Actor2566: n1 + Owner: Nod + Facing: 384 + Location: 63,22 + SubCell: 3 + Actor2567: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 69,20 + Actor2568: n1 + Owner: Nod + SubCell: 3 + Location: 74,19 + Facing: 682 + Actor2569: n1 + Owner: Nod + SubCell: 3 + Location: 76,17 + Facing: 682 + Actor2570: n1 + Owner: Nod + SubCell: 3 + Location: 60,17 + Facing: 384 + Actor2571: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 61,19 + Actor2572: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 68,20 + Actor2573: n1 + Owner: Nod + Facing: 384 + Location: 68,20 + SubCell: 1 + Actor2574: rmbc + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 63,20 + Actor2575: rmbc + Owner: Nod + SubCell: 3 + Location: 76,19 + Facing: 658 + Actor2576: n3 + Owner: Nod + SubCell: 3 + Location: 70,21 + Facing: 650 + Actor2577: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 61,18 + Actor2578: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 68,21 + Actor2579: ltnk + Owner: Nod + Facing: 384 + Location: 59,20 + Actor2580: ltnk + Owner: Nod + Facing: 384 + Location: 62,22 + Actor2581: ltnk + Owner: Nod + Location: 77,21 + Facing: 640 + Actor2582: ltnk + Owner: Nod + Location: 80,19 + Facing: 640 + Actor2583: ltnk + Owner: Nod + Location: 82,16 + Facing: 640 + Actor2584: bike + Owner: Nod + Facing: 384 + Location: 65,19 + Actor2585: bike + Owner: Nod + Facing: 384 + Location: 63,18 + Actor2586: bike + Owner: Nod + Facing: 384 + Location: 65,17 + Actor2587: bggy + Owner: Nod + Location: 77,16 + Facing: 640 + Actor2588: bggy + Owner: Nod + Location: 76,15 + Facing: 640 + Actor2589: ftnk + Owner: Nod + Location: 78,19 + Facing: 640 + Actor2590: mlrs + Owner: Nod + Location: 68,18 + Facing: 512 + Actor2591: mlrs + Owner: Nod + Facing: 512 + Location: 71,18 + Actor2594: hq + Owner: Nod + Location: 74,11 + Actor2595: tmpl + Owner: Nod + Location: 69,13 + Actor2596: tmpp + Owner: Nod + Location: 71,5 + Actor2597: hpad.td + Owner: Nod + Location: 68,6 + Actor2598: hpad.td + Owner: Nod + Location: 66,6 + NodExtraPower2: nuk2 + Owner: Nod + Location: 61,6 + NodExtraPower1: nuk2 + Owner: Nod + Location: 63,6 + Actor2599: rep + Owner: Nod + Location: 66,9 + Actor2600: mslo.nod + Owner: Nod + Location: 75,2 + Actor2601: sgen + Owner: Nod + Location: 66,17 + Actor2602: npwr + Owner: USSR + Location: 137,99 + Actor2603: afld + Owner: USSR + Location: 126,95 + Actor2604: fix + Owner: USSR + Location: 127,92 + Actor2605: afld + Owner: USSR + Location: 131,92 + Actor2606: iron + Owner: USSR + Location: 134,101 + Actor2607: stek + Owner: USSR + Location: 141,85 + Actor2608: dome + Owner: USSR + Location: 131,95 + Actor2609: mslo + Owner: USSR + Location: 142,102 + Actor2610: apwr + Owner: Greece + Location: 7,100 + AlliedExtraPower1: apwr + Owner: Greece + Location: 18,108 + Actor2614: fix + Owner: Greece + Location: 14,105 + Actor2612: hpad + Owner: Greece + Location: 13,109 + Actor2613: hpad + Owner: Greece + Location: 15,109 + Actor2615: dome + Owner: Greece + Location: 10,101 + Actor2616: atek + Owner: Greece + Location: 4,104 + Actor2618: alhq + Owner: Greece + Location: 4,109 + AlliedConyard: fact + Owner: Greece + Location: 7,107 + Actor2617: weat + Owner: Greece + Location: 7,104 + Actor2619: pdox + Owner: Greece + Location: 11,107 + AlliedExtraPower2: apwr + Owner: Greece + Location: 18,111 + PlayerStart: waypoint + Owner: Neutral + Location: 63,71 + AlliedBase: waypoint + Owner: Neutral + Location: 17,106 + SovietBase: waypoint + Owner: Neutral + Location: 134,95 + AlliesVsNodRally3: waypoint + Owner: Neutral + Location: 79,50 + AlliesVsNodRally2: waypoint + Owner: Neutral + Location: 48,41 + AlliesVsNodRally1: waypoint + Owner: Neutral + Location: 47,20 + SovietsVsNodRally1: waypoint + Owner: Neutral + Location: 104,10 + SovietsVsNodRally2: waypoint + Owner: Neutral + Location: 102,28 + SovietsVsNodRally3: waypoint + Owner: Neutral + Location: 83,48 + SovietsVsNodRally4: waypoint + Owner: Neutral + Location: 58,53 + SovietsVsAlliesRally1: waypoint + Owner: Neutral + Location: 62,122 + SovietsVsAlliesRally2: waypoint + Owner: Neutral + Location: 68,104 + SovietsVsAlliesRally4: waypoint + Owner: Neutral + Location: 29,80 + SovietsVsAlliesRally3: waypoint + Owner: Neutral + Location: 59,86 + NodVsAlliesRally1: waypoint + Owner: Neutral + Location: 13,75 + NodVsAlliesRally2: waypoint + Owner: Neutral + Location: 39,84 + NodVsAlliesRally3: waypoint + Owner: Neutral + Location: 49,110 + AlliesVsSovietsRally1: waypoint + Owner: Neutral + Location: 108,116 + AlliesVsSovietsRally2: waypoint + Owner: Neutral + Location: 107,96 + AlliesVsSovietsRally3: waypoint + Owner: Neutral + Location: 111,74 + NodVsSovietsRally1: waypoint + Owner: Neutral + Location: 134,60 + NodVsSovietsRally2: waypoint + Owner: Neutral + Location: 113,69 + NodVsSovietsRally3: waypoint + Owner: Neutral + Location: 89,94 + Actor2592: apwr + Owner: USSR + Location: 138,85 + NodBase: waypoint + Owner: Neutral + Location: 70,11 + Actor2593: t11 + Owner: Neutral + Location: 61,80 + Actor2611: t14 + Owner: Neutral + Location: 61,79 + Actor2620: tc01 + Owner: Neutral + Location: 62,81 + AlliedBaseCam1: waypoint + Owner: Neutral + Location: 20,91 + AlliedBaseCam2: waypoint + Owner: Neutral + Location: 33,105 + SovietBaseCam1: waypoint + Owner: Neutral + Location: 120,83 + SovietBaseCam2: waypoint + Owner: Neutral + Location: 134,77 + SovietBaseCam3: waypoint + Owner: Neutral + Location: 124,107 + NodBaseCam1: waypoint + Owner: Neutral + Location: 57,24 + NodBaseCam2: waypoint + Owner: Neutral + Location: 82,22 + Actor2621: split2 + Owner: Neutral + Location: 40,115 + Actor2622: split2 + Owner: Neutral + Location: 93,4 + Actor2458: split2 + Owner: Neutral + Location: 31,34 + Actor2459: split2 + Owner: Neutral + Location: 39,33 + Actor2460: split2 + Owner: Neutral + Location: 12,65 + Actor2461: split2 + Owner: Neutral + Location: 129,47 + Actor2462: split2 + Owner: Neutral + Location: 132,53 + Actor2463: split2 + Owner: Neutral + Location: 18,67 + Actor2464: 2tnk + Owner: Greece + Location: 27,72 + Facing: 896 + Actor2465: 2tnk + Owner: Greece + Location: 29,70 + Facing: 896 + Actor2466: 2tnk + Owner: Greece + Location: 27,68 + Facing: 896 + Actor2623: apc.ai + Owner: Greece + Location: 29,66 + Facing: 896 + Actor2624: apc.ai + Owner: Greece + Location: 25,63 + Facing: 896 + Actor2630: e1 + Owner: Greece + SubCell: 3 + Location: 29,68 + Facing: 896 + Actor2631: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 31,67 + Actor2632: e1 + Owner: Greece + Facing: 384 + Location: 31,67 + SubCell: 1 + Actor2635: e3 + Owner: Greece + SubCell: 3 + Location: 25,61 + Facing: 896 + Actor2637: 3tnk + Owner: USSR + Location: 94,92 + Facing: 256 + Actor2639: 3tnk + Owner: USSR + Location: 90,92 + Facing: 256 + Actor2640: v2rl + Owner: USSR + Location: 97,93 + Facing: 256 + Actor2641: v2rl + Owner: USSR + Location: 88,90 + Facing: 256 + Actor2642: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 89,92 + Actor2643: e1 + Owner: USSR + Facing: 384 + Location: 89,91 + SubCell: 3 + Actor2644: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 91,91 + Actor2645: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 92,93 + Actor2646: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 91,95 + Actor2647: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 94,94 + Actor2648: e1 + Owner: USSR + Facing: 384 + Location: 95,95 + SubCell: 3 + Actor2649: e1 + Owner: USSR + Facing: 384 + Location: 96,95 + SubCell: 3 + Actor2650: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 99,93 + Actor2651: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 96,92 + Actor2652: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 92,92 + Actor2653: e3 + Owner: USSR + Facing: 384 + Location: 91,95 + SubCell: 1 + Actor2654: arty + Owner: Greece + Location: 33,65 + Facing: 896 + Actor2628: e1 + Owner: Greece + SubCell: 3 + Facing: 896 + Location: 27,66 + Actor2629: e1 + Owner: Greece + SubCell: 3 + Facing: 896 + Location: 27,67 + Actor2626: e1 + Owner: Greece + SubCell: 3 + Facing: 896 + Location: 24,69 + Actor2625: e1 + Owner: Greece + SubCell: 3 + Facing: 896 + Location: 27,69 + Actor2633: e1 + Owner: Greece + SubCell: 3 + Facing: 896 + Location: 28,70 + Actor2627: e1 + Owner: Greece + SubCell: 3 + Facing: 896 + Location: 24,65 + Actor2655: e1 + Owner: Greece + SubCell: 3 + Facing: 896 + Location: 26,60 + Actor2634: e3 + Owner: Greece + SubCell: 3 + Facing: 896 + Location: 30,65 + Actor2636: e3 + Owner: Greece + SubCell: 3 + Facing: 896 + Location: 32,64 + Actor2656: ftnk + Owner: Nod + Location: 79,40 + Facing: 512 + Actor2657: ftnk + Owner: Nod + Location: 85,39 + Facing: 512 + Actor2658: ltnk + Owner: Nod + Location: 79,43 + Facing: 512 + Actor2659: ltnk + Owner: Nod + Location: 83,42 + Facing: 512 + Actor2660: ltnk + Owner: Nod + Location: 87,42 + Facing: 512 + Actor2661: stnk.nod + Owner: Nod + Facing: 384 + Location: 116,27 + Actor2662: stnk.nod + Owner: Nod + Location: 117,25 + Facing: 384 + Actor2663: mlrs + Owner: Nod + Location: 83,40 + Facing: 512 + Actor2664: mlrs + Owner: Nod + Location: 86,37 + Facing: 512 + Actor2665: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 86,41 + Actor2666: n1 + Owner: Nod + Facing: 384 + Location: 86,41 + SubCell: 1 + Actor2667: n1 + Owner: Nod + Facing: 384 + Location: 87,40 + SubCell: 3 + Actor2668: n1 + Owner: Nod + Facing: 384 + Location: 87,40 + SubCell: 1 + Actor2669: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 83,39 + Actor2670: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 78,38 + Actor2671: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 80,42 + Actor2672: n1 + Owner: Nod + Facing: 384 + Location: 78,43 + SubCell: 3 + Actor2673: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 86,43 + Actor2674: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 88,41 + Actor2675: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 81,40 + Actor2676: n3 + Owner: Nod + Facing: 384 + Location: 77,40 + SubCell: 3 + Actor2677: btr.ai + Owner: USSR + Location: 134,44 + Facing: 128 + Actor2678: btr.ai + Owner: USSR + Location: 137,48 + Facing: 128 + Actor2679: 3tnk + Owner: USSR + Location: 136,45 + Facing: 128 + Actor2680: 3tnk + Owner: USSR + Location: 140,49 + Facing: 128 + Actor2638: stnk.nod + Owner: Nod + Location: 32,36 + Facing: 768 + Actor2681: stnk.nod + Owner: Nod + Location: 36,36 + Facing: 777 + Actor2682: stnk.nod + Owner: Nod + Location: 40,38 + Facing: 768 + Actor2683: rtnk + Owner: Greece + Location: 71,114 + Facing: 128 + Actor2684: rtnk + Owner: Greece + Facing: 128 + Location: 73,112 + Actor2685: rtnk + Owner: Greece + Facing: 128 + Location: 76,111 + Actor2686: rtnk + Owner: Greece + Facing: 128 + Location: 78,109 + Actor2687: barr + Owner: USSR + Location: 134,87 + Actor2688: sam + Owner: USSR + Location: 135,91 + AlliesVsNodRally4: waypoint + Owner: Neutral + Location: 28,11 + AlliesVsSovietsRally4: waypoint + Owner: Neutral + Location: 137,122 + Actor2689: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 65,4 + Actor2690: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 70,5 + Actor2691: e3 + Owner: USSR + SubCell: 3 + Facing: 128 + Location: 140,102 + Actor2692: e3 + Owner: USSR + SubCell: 3 + Facing: 128 + Location: 140,93 + Actor2693: e3 + Owner: Greece + SubCell: 3 + Facing: 896 + Location: 10,110 + Actor2694: e3 + Owner: Greece + SubCell: 3 + Facing: 896 + Location: 6,106 + ProdigyExit: waypoint + Owner: Neutral + Location: 56,75 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-allegiances.yaml, culmination-rules.yaml + +Sequences: culmination-sequences.yaml + +Weapons: ca|weapons/custom/campaign.yaml, culmination-weapons.yaml diff --git a/mods/ca/missions/main-campaign/ca24-culmination/subjugationicon.shp b/mods/ca/missions/main-campaign/ca24-culmination/subjugationicon.shp new file mode 100644 index 0000000000..fe860895a3 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca24-culmination/subjugationicon.shp differ diff --git a/mods/ca/missions/main-campaign/ca25-enmity/c_recondrones.aud b/mods/ca/missions/main-campaign/ca25-enmity/c_recondrones.aud new file mode 100644 index 0000000000..5d7533563f Binary files /dev/null and b/mods/ca/missions/main-campaign/ca25-enmity/c_recondrones.aud differ diff --git a/mods/ca/missions/main-campaign/ca25-enmity/enmity-rules.yaml b/mods/ca/missions/main-campaign/ca25-enmity/enmity-rules.yaml new file mode 100644 index 0000000000..065c3bd33a --- /dev/null +++ b/mods/ca/missions/main-campaign/ca25-enmity/enmity-rules.yaml @@ -0,0 +1,79 @@ +^Palettes: + TintPostProcessEffect: + +World: + LuaScript: + Scripts: campaign.lua, enmity.lua + MissionData: + Briefing: ———[ Chapter V Introduction ]———\n\nThe Scrin have been rapidly growing their influence. Kane has disappeared and much of his cyborg army is now under their control, along with significant concentrations of Soviet forces.\n\nThe rest of the Brotherhood has fractured. Some have joined the Scrin willingly, seeing them as the true heralds of a new age, while others cling to their belief that Kane will return and continue to do battle with both us and the invaders.\n\nThe Soviet resurgence was short-lived and they are once again in disarray. Stalin has retreated to Siberia, and without Yuri their offensive capabilities are limited, however Stalin still refuses to negotiate a truce and cannot be relied upon to behave rationally.\n\nWe have lost much ground, but we believe there is hope. We do not think the Scrin had intended to rely so heavily on human forces to do their bidding, and are only doing so because they are unable to send for reinforcements. Their invasion force is insufficient, and their situation is more precarious than they would have us believe.\n\nThey have been consolidating territory and amassing stockpiles of Tiberium. They are preparing for something, and we need to find out what.\n\n———[ Mission Briefing ]———\n\nNod forces continue to strike at our supply lines. Even with the survival of humanity at stake they cannot put their hatred aside. We cannot advance on the Scrin until this Nod threat is neutralized.\n\nOne route to the front line has been particularly ravaged. A detachment that was sent to secure the area has reported that they have encountered Nod scouts and they suspect another ambush is imminent. Take command of these forces and ensure they are not overwhelmed.\n\nIt seems likely that the Nod stronghold for the entire region is nearby, but we have thus far been unable to find it. If this turns out to be the case, we will send reinforcements and you are instructed to purge whatever Nod forces are present. + MapOptions: + ShortGameCheckboxEnabled: False + MusicPlaylist: + StartingMusic: trouble + +Player: + PlayerResources: + DefaultCash: 0 + +recondronedetection: + AlwaysVisible: + Interactable: + ScriptTriggers: + ProvidesPrerequisite: + +^Cloakable: + Cloak@SGENCLOAK: + UncloakOn: Attack, Unload, Infiltrate, Demolish, Damage, Heal, SelfHeal + +MSG.Static: + Inherits: MSG + Mobile: + -RequireForceMoveCondition: + RenderSprites: + Image: msg + WithRangeCircle@MSG: + Range: 9c512 + ProximityExternalCondition@MSG: + Range: 9c512 + GrantCondition@NOTMOBILE: + Condition: notmobile + GrantCondition@DEPLOYED: + Condition: deployed + -GrantConditionOnDeploy: + WithSpriteBody@deployed: + -RequiresCondition: + -WithFacingSpriteBody: + -GrantCondition@PREVIEWWORKAROUND: + -WithMakeAnimation: + -Tooltip: + Tooltip@DEPLOYED: + -RequiresCondition: + +SGEN: + WithRangeCircle@SGEN: + Range: 14c512 + ProximityExternalCondition@SGEN: + Range: 14c512 + +UAV: + DetectCloaked: + RequiresCondition: has-detection + Range: 7c0 + GrantConditionOnPrerequisite@DETECTION: + Condition: has-detection + Prerequisites: recondronedetection + -Targetable@AIRBORNE: + +HQ: + AirstrikePowerCA@uav: + Description: \nA drone flies across the map, revealing the area as it passes. + +EYE: + Inherits@CAMPAIGNDISABLED: ^Disabled + +ORCA: + Buildable: + Prerequisites: ~aircraft.gdi + +HPAD.TD: + -InterceptorPower@AirDef: diff --git a/mods/ca/missions/main-campaign/ca25-enmity/enmity.lua b/mods/ca/missions/main-campaign/ca25-enmity/enmity.lua new file mode 100644 index 0000000000..47c4194ea3 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca25-enmity/enmity.lua @@ -0,0 +1,295 @@ +MissionDir = "ca|missions/main-campaign/ca25-enmity" + + +PowerGrids = { + { + Providers = { NPower1, NPower2, NPower3, NPower4 }, + Consumers = { NPowered1, NPowered2, NPowered3, NPowered4, NPowered5, NPowered6, NPowered7, NPowered8, NPowered9, NPowered10, NPowered11 }, + }, + { + Providers = { SPower1, SPower2, SPower3, SPower4 }, + Consumers = { SPowered1, SPowered2, SPowered3 }, + }, + { + Providers = { WPower1, WPower2 }, + Consumers = { WPowered1, WPowered2 }, + }, +} + +NorthAttackPaths = { + { AttackNode1.Location, AttackNode2.Location, AttackNode3.Location, AttackNode5.Location }, + { AttackNode1.Location, AttackNode2.Location, AttackNode4.Location, AttackNode5.Location }, + { AttackNode1.Location, AttackNode2.Location, AttackNode15.Location, AttackNode5.Location }, + { AttackNode1.Location, AttackNode2.Location, AttackNode4.Location, AttackNode6.Location, AttackNode5.Location }, + { AttackNode13.Location, AttackNode14.Location, AttackNode16.Location, AttackNode10.Location, AttackNode5.Location }, + { AttackNode13.Location, AttackNode14.Location, AttackNode6.Location, AttackNode5.Location }, + { AttackNode13.Location, AttackNode11.Location, AttackNode10.Location, AttackNode5.Location }, + { AttackNode13.Location, AttackNode12.Location, AttackNode10.Location, AttackNode5.Location }, +} + +SouthAttackPaths = { + { AttackNode10.Location, AttackNode5.Location }, + { AttackNode9.Location, AttackNode5.Location }, + { AttackNode8.Location, AttackNode7.Location, AttackNode5.Location }, +} + +HoldOutTime = { + easy = DateTime.Minutes(2) - DateTime.Seconds(30), + normal = DateTime.Minutes(2), + hard = DateTime.Minutes(2) + DateTime.Seconds(30), + vhard = DateTime.Minutes(2) + DateTime.Seconds(30), + brutal = DateTime.Minutes(2) + DateTime.Seconds(30) +} + +SuperweaponsEnabledTime = { + easy = DateTime.Seconds((60 * 40) + 41), + normal = DateTime.Seconds((60 * 25) + 41), + hard = DateTime.Seconds((60 * 18) + 41), + vhard = DateTime.Seconds((60 * 15) + 41), + brutal = DateTime.Seconds((60 * 13) + 41) +} + +StructuresToSellToAvoidCapture = { SouthHand1, SouthHand2, SouthAirstrip, SouthConyard, WestHand, CenterHand, Helipad1, Helipad2 } + +ShadowUnitCompositions = { + { Infantry = {}, Vehicles = { "bike", "bike", "bike", "bike" }, MaxTime = DateTime.Minutes(10) }, + { Infantry = { "n3", "n1", "n1", "n1", "n4" }, Vehicles = { "bggy", "bggy", "bike", "bike" }, MaxTime = DateTime.Minutes(10) }, + { Infantry = { "n3", "n1", "n1", "n4" }, Vehicles = { "ltnk", "bggy", "bike" }, MaxTime = DateTime.Minutes(10) }, + + { Infantry = {}, Vehicles = { "stnk.nod", "stnk.nod", "stnk.nod", "sapc.ai", "sapc.ai" }, MinTime = DateTime.Minutes(10) }, + { Infantry = { "n3", "n1", "n1", "n1", "n1", "n4", "n3", "shad" }, Vehicles = { "ltnk", "ltnk", "ftnk", "arty.nod", "ltnk" }, MinTime = DateTime.Minutes(10) }, + { Infantry = { "n3", "n1", "shad", "n1", "shad", "shad", "n4", "n1" }, Vehicles = { "stnk.nod", "ltnk", "bggy", "bike", "ltnk" }, MinTime = DateTime.Minutes(10) }, + + { Infantry = { "n3", "n1", "n1", "n1", "n4", "n1", "shad", "n1", "n1", "n1", "n1" }, Vehicles = { "ltnk", "spec", "arty.nod", "stnk.nod", "stnk.nod", "ltnk" }, MinTime = DateTime.Minutes(13) }, + { Infantry = { "n3", "n1", "shad", "n1", "shad", "shad", "n4", "n1", "n1", "n1", "n1", "n1" }, Vehicles = { "stnk.nod", "spec", "bike", "bggy", "ltnk" }, MinTime = DateTime.Minutes(13) }, +} + +if IsVeryHardOrAbove() then + ShadowUnitCompositions = Utils.Concat(ShadowUnitCompositions, { + { + Infantry = { "shad", "shad", "shad", "shad", "shad", "shad", "shad" }, + Vehicles = { "spec", "spec", "spec", "spec", "spec", "spec", "spec" }, + MinTime = DateTime.Minutes(16), + IsSpecial = true + }, + { + Infantry = { "n3", "n1", "n1", "n1", "n1", "n1", "n3", "rmbo", "n1", "n1", "n1", "n1", "n1", "n1", "n1", "n1", "n1", "n3", "n1", "n1", "n1", "n3" }, + Vehicles = { "ftnk", "ftnk", "howi", "howi", "howi", "howi", "howi" }, + MinTime = DateTime.Minutes(16), + RequiredTargetCharacteristics = { "MassInfantry" } + }, + { + Infantry = { "n3", "n1", "n1", "n1", "n1", "n3", "n3", "rmbo", "n1", "n1", "n3", "n1", "n1", "n3", "n1", "n1", "n1", "n3", "n1", "n3", "n1", "n3" }, + Vehicles = { "ltnk", "ltnk", "ltnk", "bike", "bike", "bike", "bike", "bike", "stnk.nod", "stnk.nod" }, + MinTime = DateTime.Minutes(16), + RequiredTargetCharacteristics = { "MassHeavy" } + }, + }) +end + +AdjustedShadowUnitCompositions = AdjustCompositionsForDifficulty(ShadowUnitCompositions) + +Squads = { + North = { + Delay = AdjustDelayForDifficulty(DateTime.Minutes(6)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 20, Max = 40 }), + DispatchDelay = DateTime.Seconds(15), + FollowLeader = true, + ProducerActors = { Infantry = { NorthHand1, NorthHand2 }, Vehicles = { NorthAirstrip } }, + Compositions = AdjustedShadowUnitCompositions, + AttackPaths = NorthAttackPaths, + }, + South = { + Delay = AdjustDelayForDifficulty(DateTime.Minutes(4)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 20, Max = 40 }), + DispatchDelay = DateTime.Seconds(15), + FollowLeader = true, + ProducerActors = { Infantry = { SouthHand1, SouthHand2 }, Vehicles = { SouthAirstrip } }, + Compositions = AdjustedShadowUnitCompositions, + AttackPaths = SouthAttackPaths, + }, + Air = { + Delay = AdjustAirDelayForDifficulty(DateTime.Minutes(13)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 12, Max = 12 }), + Compositions = AirCompositions.Nod, + }, + BrutalComanches = { + Delay = DateTime.Minutes(10), + ActiveCondition = function(squad) + return #GetMissionPlayersActorsByTypes({ "gtek", "upgc", "eye" }) > 0 + end, + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 24, Max = 24 }), + Compositions = { + brutal = { + Aircraft = { "rah", "rah", "rah", "rah", "rah" } + } + } + } +} + +SetupPlayers = function() + GDI = Player.GetPlayer("GDI") + Nod = Player.GetPlayer("Nod") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = { GDI } + MissionEnemies = { Nod } +end + +WorldLoaded = function() + SetupPlayers() + + EnforceAiBuildRadius = true + Camera.Position = PlayerStart.CenterPosition + + InitObjectives(GDI) + InitNod() + + if Difficulty == "easy" then + NormalHardOnlyArty.Destroy() + NormalHardOnlyStnk.Destroy() + NormalHardOnlyLtnk.Destroy() + end + + ObjectiveEliminateNod = GDI.AddObjective("Eliminate all Nod forces.") + + Trigger.AfterDelay(DateTime.Seconds(1), function() + local mainAmbushers = Map.ActorsInBox(MainAmbushTopLeft.CenterPosition, MainAmbushBottomRight.CenterPosition, function(a) + return a.Owner == Nod and not a.IsDead and a.HasProperty("Hunt") + end) + + local secondaryAmbushers = Map.ActorsInBox(SecondaryAmbushTopLeft.CenterPosition, SecondaryAmbushBottomRight.CenterPosition, function(a) + return a.Owner == Nod and not a.IsDead and a.HasProperty("Hunt") + end) + + Utils.Do(mainAmbushers, function(a) + a.Hunt() + end) + + Utils.Do(secondaryAmbushers, function(a) + a.Hunt() + end) + end) + + Trigger.AfterDelay(HoldOutTime[Difficulty] - DateTime.Seconds(20), function() + local mcvFlare = Actor.Create("flare", true, { Owner = GDI, Location = McvRally.Location }) + PlaySpeechNotificationToMissionPlayers("SignalFlare") + Notification("Signal flare detected. Reinforcements inbound.") + Beacon.New(GDI, McvRally.CenterPosition) + Trigger.AfterDelay(DateTime.Seconds(20), function() + mcvFlare.Destroy() + end) + end) + + Trigger.AfterDelay(HoldOutTime[Difficulty], function() + PlaySpeechNotificationToMissionPlayers("ReinforcementsArrived") + Notification("Reinforcements have arrived.") + Beacon.New(GDI, McvRally.CenterPosition) + DoReinforcements() + end) + + Trigger.OnKilled(Church1, function(self, killer) + Actor.Create("moneycrate", true, { Owner = GDI, Location = Church1.Location }) + end) + + Trigger.OnKilled(Church2, function(self, killer) + Actor.Create("moneycrate", true, { Owner = GDI, Location = Church2.Location }) + end) + + Utils.Do(PowerGrids, function(grid) + Trigger.OnAllKilledOrCaptured(grid.Providers, function() + Utils.Do(grid.Consumers, function(consumer) + if not consumer.IsDead then + consumer.GrantCondition("disabled") + end + end) + end) + end) + + Trigger.AfterDelay(DateTime.Minutes(22), function() + Utils.Do(MissionPlayers, function(p) + Actor.Create("recondronedetection", true, { Owner = p }) + end) + Notification("Recon Drones are now equipped with stealth detection. This should help you locate the Nod bases in the area.") + MediaCA.PlaySound("c_recondrones", 2) + end) + + AfterWorldLoaded() +end + +Tick = function() + OncePerSecondChecks() + OncePerFiveSecondChecks() + OncePerThirtySecondChecks() + AfterTick() +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + Nod.Resources = Nod.ResourceCapacity - 500 + + if not PlayerHasBuildings(Nod) then + GDI.MarkCompletedObjective(ObjectiveEliminateNod) + end + + if MissionPlayersHaveNoRequiredUnits() then + GDI.MarkFailedObjective(ObjectiveEliminateNod) + end + end +end + +OncePerFiveSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 125 == 0 then + UpdatePlayerBaseLocations() + end +end + +OncePerThirtySecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % DateTime.Seconds(30) == 0 then + CalculatePlayerCharacteristics() + end +end + +InitNod = function() + if Difficulty == "easy" then + RebuildExcludes.Nod = { Types = { "obli", "gun.nod", "nuke", "nuk2", "mslo.nod" } } + else + RebuildExcludes.Nod = { Types = { "nuke", "nuk2", "mslo.nod" } } + end + + AutoRepairAndRebuildBuildings(Nod, 15) + SetupRefAndSilosCaptureCredits(Nod) + AutoReplaceHarvesters(Nod) + AutoRebuildConyards(Nod) + InitAiUpgrades(Nod) + InitAttackSquad(Squads.North, Nod) + InitAttackSquad(Squads.South, Nod) + InitAirAttackSquad(Squads.Air, Nod) + + if IsHardOrAbove() then + BuildDefenseOnCaptureAttempt(StructuresToSellToAvoidCapture, "ltur", true) + + if Difficulty == "brutal" then + InitAirAttackSquad(Squads.BrutalComanches, Nod, nil, { "gtek", "rmbo", "medi", "upgc", "eye" }) + end + end + + local nodGroundAttackers = Nod.GetGroundAttackers() + + Utils.Do(nodGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsNodGroundHunterUnit) + end) + + Actor.Create("ai.unlimited.power", true, { Owner = Nod }) + + Trigger.AfterDelay(SuperweaponsEnabledTime[Difficulty], function() + Actor.Create("ai.minor.superweapons.enabled", true, { Owner = Nod }) + Actor.Create("ai.superweapons.enabled", true, { Owner = Nod }) + end) +end + +-- overridden in co-op version +DoReinforcements = function() + Reinforcements.Reinforce(GDI, { "hmmv", "mtnk", "amcv", "mtnk" }, { McvSpawn.Location, McvRally.Location }, 75) + GDI.Cash = 6000 + CashAdjustments[Difficulty] +end diff --git a/mods/ca/missions/main-campaign/ca25-enmity/map.bin b/mods/ca/missions/main-campaign/ca25-enmity/map.bin new file mode 100644 index 0000000000..6ff82f5b9b Binary files /dev/null and b/mods/ca/missions/main-campaign/ca25-enmity/map.bin differ diff --git a/mods/ca/missions/main-campaign/ca25-enmity/map.png b/mods/ca/missions/main-campaign/ca25-enmity/map.png new file mode 100644 index 0000000000..a2a7026b94 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca25-enmity/map.png differ diff --git a/mods/ca/missions/main-campaign/ca25-enmity/map.yaml b/mods/ca/missions/main-campaign/ca25-enmity/map.yaml new file mode 100644 index 0000000000..7e5259b6a6 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca25-enmity/map.yaml @@ -0,0 +1,2702 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 25: Enmity + +Author: Darkademic + +Tileset: TEMPERAT + +MapSize: 98,114 + +Bounds: 1,1,96,112 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: GDI, Nod, NodCiv + PlayerReference@GDI: + Name: GDI + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: gdi + LockColor: True + Color: F2CF74 + LockSpawn: True + LockTeam: True + Enemies: Nod, Creeps + PlayerReference@Nod: + Name: Nod + Bot: campaign + Faction: nod + Color: FE1100 + Allies: NodCiv + Enemies: GDI, Creeps + PlayerReference@NodCiv: + Name: NodCiv + Bot: campaign + NonCombatant: True + Faction: nod + Allies: Nod + Enemies: GDI, Creeps + +Actors: + Actor1: htnk + Owner: GDI + Location: 52,82 + Facing: 768 + Health: 72 + Actor2: mtnk + Owner: GDI + Location: 49,82 + Facing: 753 + Health: 69 + Actor3: mtnk + Owner: GDI + Location: 57,84 + Health: 79 + Facing: 737 + Actor7: hmmv + Owner: GDI + Location: 55,82 + Facing: 674 + Actor9: n1 + Owner: GDI + SubCell: 3 + Location: 54,83 + Facing: 594 + Actor10: n1 + Owner: GDI + SubCell: 3 + Location: 43,85 + Facing: 705 + Actor11: n1 + Owner: GDI + SubCell: 3 + Location: 38,86 + Facing: 0 + Actor12: n1 + Owner: GDI + SubCell: 3 + Location: 35,86 + Facing: 428 + Actor13: n1 + Owner: GDI + SubCell: 3 + Location: 51,83 + Facing: 555 + Actor14: n1 + Owner: GDI + SubCell: 3 + Location: 45,81 + Facing: 967 + Actor15: n1 + Owner: GDI + SubCell: 3 + Location: 53,81 + Facing: 872 + Actor16: n1 + Owner: GDI + SubCell: 3 + Location: 57,85 + Facing: 384 + Actor17: n2 + Owner: GDI + Location: 48,82 + SubCell: 3 + Facing: 856 + Actor18: n2 + Owner: GDI + SubCell: 3 + Location: 41,87 + Facing: 602 + Actor19: medi + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 54,82 + Actor20: n3 + Owner: GDI + SubCell: 3 + Location: 44,82 + Facing: 79 + Actor46: brik + Owner: GDI + Location: 1,79 + Actor48: brik + Owner: GDI + Location: 2,79 + Actor50: brik + Owner: GDI + Location: 1,84 + Actor51: brik + Owner: GDI + Location: 1,85 + Actor52: brik + Owner: GDI + Location: 2,84 + Actor53: brik + Owner: GDI + Location: 2,85 + Actor54: brik + Owner: GDI + Location: 2,85 + Actor55: brik + Owner: GDI + Location: 1,80 + Actor56: brik + Owner: GDI + Location: 2,80 + Actor57: brik + Owner: GDI + Location: 1,78 + Actor58: brik + Owner: GDI + Location: 1,77 + Actor59: brik + Owner: GDI + Location: 1,76 + Actor60: brik + Owner: GDI + Location: 1,86 + Actor61: brik + Owner: GDI + Location: 1,87 + Actor62: brik + Owner: GDI + Location: 1,88 + Actor63: brik + Owner: GDI + Location: 2,88 + Actor64: brik + Owner: GDI + Location: 4,88 + Actor65: brik + Owner: GDI + Location: 3,88 + Actor66: brik + Owner: GDI + Location: 5,88 + Actor67: brik + Owner: GDI + Location: 7,88 + Actor68: brik + Owner: GDI + Location: 6,88 + Actor69: brik + Owner: GDI + Location: 8,88 + Actor70: brik + Owner: GDI + Location: 9,88 + Actor71: brik + Owner: GDI + Location: 10,88 + Actor72: brik + Owner: GDI + Location: 11,88 + Actor73: brik + Owner: GDI + Location: 11,87 + Actor74: brik + Owner: GDI + Location: 11,86 + Actor75: brik + Owner: GDI + Location: 11,84 + Actor76: brik + Owner: GDI + Location: 11,85 + Actor77: brik + Owner: GDI + Location: 10,84 + Actor78: brik + Owner: GDI + Location: 10,85 + Actor79: brik + Owner: GDI + Location: 10,80 + Actor80: brik + Owner: GDI + Location: 10,79 + Actor81: brik + Owner: GDI + Location: 11,79 + Actor82: brik + Owner: GDI + Location: 11,80 + Actor83: brik + Owner: GDI + Location: 11,78 + Actor84: brik + Owner: GDI + Location: 11,77 + Actor85: brik + Owner: GDI + Location: 11,76 + Actor95: hpad.td + Owner: GDI + Location: 4,84 + Actor96: hpad.td + Owner: GDI + Location: 7,84 + Actor99: gtwr + Owner: GDI + Location: 12,85 + Actor100: gtwr + Owner: GDI + Location: 12,79 + Actor89: brik + Owner: GDI + Location: 3,74 + Actor90: brik + Owner: GDI + Location: 2,74 + Actor91: brik + Owner: GDI + Location: 1,74 + Actor92: brik + Owner: GDI + Location: 1,75 + Actor93: brik + Owner: GDI + Location: 4,74 + Actor94: brik + Owner: GDI + Location: 5,74 + Actor102: brik + Owner: GDI + Location: 6,74 + Actor103: brik + Owner: GDI + Location: 7,74 + Actor104: brik + Owner: GDI + Location: 8,74 + Actor105: brik + Owner: GDI + Location: 9,74 + Actor106: brik + Owner: GDI + Location: 10,74 + Actor107: brik + Owner: GDI + Location: 11,74 + Actor108: brik + Owner: GDI + Location: 11,75 + Actor101: nuke + Owner: GDI + Location: 2,75 + Actor109: nuke + Owner: GDI + Location: 9,75 + Actor110: rep + Owner: GDI + Location: 5,77 + Actor111: mtnk + Owner: GDI + Location: 16,83 + Health: 97 + Facing: 634 + TurretFacing: 317 + TurretFacing@SECONDARY: 7 + Actor125: n1 + Owner: GDI + SubCell: 3 + Location: 14,86 + Facing: 634 + Actor126: n1 + Owner: GDI + SubCell: 3 + Location: 13,88 + Facing: 808 + Actor128: n1 + Owner: GDI + SubCell: 3 + Location: 13,78 + Facing: 816 + SouthAirstrip: airs + Owner: Nod + Location: 79,99 + SouthHand1: hand + Owner: Nod + Location: 69,94 + Actor136: gun.nod + Owner: Nod + Location: 74,89 + Actor137: gun.nod + Owner: Nod + Location: 80,88 + TurretFacing: 142 + Actor140: gun.nod + Owner: Nod + Location: 66,104 + Actor139: gun.nod + Owner: Nod + Location: 66,99 + Actor138: proc.td + Owner: Nod + Location: 79,104 + Actor141: silo.td + Owner: Nod + Location: 75,105 + Actor142: silo.td + Owner: Nod + Location: 76,107 + Actor143: rep + Owner: Nod + Location: 77,94 + SPower4: nuk2 + Owner: Nod + Location: 85,96 + SPower3: nuk2 + Owner: Nod + Location: 82,94 + SPower2: nuk2 + Owner: Nod + Location: 71,104 + SPower1: nuke + Owner: Nod + Location: 72,100 + Actor150: proc.td + Owner: Nod + Location: 74,20 + Actor154: rep + Owner: Nod + Location: 84,22 + NorthConyard: afac + Owner: Nod + Location: 78,7 + NPowered2: obli + Owner: Nod + Location: 72,14 + NPowered3: obli + Owner: Nod + Location: 72,21 + NPowered4: obli + Owner: Nod + Location: 76,25 + NPowered5: obli + Owner: Nod + Location: 84,26 + NPowered1: obli + Owner: Nod + Location: 75,8 + NPower4: nuk2 + Owner: Nod + Location: 90,17 + NPower3: nuk2 + Owner: Nod + Location: 89,13 + NPower2: nuk2 + Owner: Nod + Location: 86,11 + NPower1: nuk2 + Owner: Nod + Location: 83,8 + Actor157: tmpl + Owner: Nod + Location: 81,12 + NorthAirstrip: airs + Owner: Nod + Location: 82,18 + ChemSilo: mslo.nod + Owner: Nod + Location: 85,16 + NPowered6: nsam + Owner: Nod + Location: 74,11 + NPowered8: nsam + Owner: Nod + Location: 87,25 + NPowered9: nsam + Owner: Nod + Location: 91,16 + NPowered7: nsam + Owner: Nod + Location: 73,24 + NPowered10: nsam + Owner: Nod + Location: 81,8 + Actor176: hq + Owner: Nod + Location: 78,11 + Actor180: silo.td + Owner: Nod + Location: 77,19 + NorthHand1: hand + Owner: Nod + Location: 79,21 + NorthHand2: hand + Owner: Nod + Location: 74,13 + Actor179: hpad.td + Owner: Nod + Location: 87,19 + Actor168: gun.nod + Owner: Nod + Location: 69,14 + TurretFacing: 192 + Actor182: gun.nod + Owner: Nod + Location: 69,20 + TurretFacing: 348 + Actor183: gun.nod + Owner: Nod + Location: 76,28 + TurretFacing: 380 + Actor184: gun.nod + Owner: Nod + Location: 84,29 + TurretFacing: 594 + NPowered11: sgen + Owner: Nod + Location: 78,16 + Actor181: silo.td + Owner: Nod + Location: 74,18 + Actor185: msg.static + Owner: Nod + Facing: 384 + Location: 72,96 + Actor190: msg.static + Owner: Nod + Facing: 384 + Location: 74,107 + Actor191: nsam + Owner: Nod + Location: 36,66 + Actor192: nsam + Owner: Nod + Location: 47,67 + CenterHand: hand + Owner: Nod + Location: 42,64 + Actor201: silo.td + Owner: Nod + Location: 37,60 + Actor202: silo.td + Owner: Nod + Location: 37,62 + Helipad2: hpad.td + Owner: Nod + Location: 94,54 + Helipad1: hpad.td + Owner: Nod + Location: 91,53 + Actor206: rep + Owner: Nod + Location: 93,50 + Actor207: obli + Owner: Nod + Location: 95,49 + Actor208: gun.nod + Owner: Nod + Location: 93,46 + Actor209: gun.nod + Owner: Nod + Location: 87,48 + Actor210: msg.static + Owner: Nod + Location: 90,52 + Facing: 384 + WestHand: hand + Owner: Nod + Location: 6,25 + Actor212: gun.nod + Owner: Nod + Location: 12,27 + TurretFacing: 705 + Actor213: gun.nod + Owner: Nod + Location: 9,22 + TurretFacing: 713 + WPower1: nuk2 + Owner: Nod + Location: 2,24 + WPower2: nuk2 + Owner: Nod + Location: 2,28 + WPowered1: nsam + Owner: Nod + Location: 4,32 + WPowered2: nsam + Owner: Nod + Location: 10,30 + Actor219: split2 + Owner: Neutral + Location: 51,96 + Actor220: split2 + Owner: Neutral + Location: 45,98 + Actor218: split2 + Owner: Neutral + Location: 87,85 + Actor221: split2 + Owner: Neutral + Location: 93,83 + Actor222: v03 + Location: 17,109 + Faction: Random + Owner: NodCiv + Church1: v01 + Location: 8,99 + Faction: Random + Owner: NodCiv + Actor224: v06 + Location: 3,93 + Faction: Random + Owner: NodCiv + Actor225: v05 + Location: 4,103 + Faction: Random + Owner: NodCiv + Actor226: v07 + Location: 2,100 + Faction: Random + Owner: NodCiv + Actor227: v04 + Location: 12,96 + Faction: Random + Owner: NodCiv + Actor228: v07 + Location: 9,106 + Faction: Random + Owner: NodCiv + Actor229: v08 + Location: 5,107 + Faction: Random + Owner: NodCiv + Actor230: v10 + Location: 7,97 + Faction: Random + Owner: NodCiv + Actor231: v11 + Location: 16,105 + Faction: Random + Owner: NodCiv + Actor232: v09 + Location: 11,103 + Faction: Random + Owner: NodCiv + Actor233: v18 + Owner: Neutral + Location: 2,95 + Actor234: v18 + Owner: Neutral + Location: 2,95 + Actor235: v18 + Owner: Neutral + Location: 3,95 + Actor236: v16 + Owner: Neutral + Location: 3,95 + Actor237: v17 + Owner: Neutral + Location: 4,95 + Actor238: v12 + Owner: Neutral + Location: 8,93 + Actor239: v13 + Owner: Neutral + Location: 9,94 + Actor240: t11 + Owner: Neutral + Location: 15,100 + Actor241: t17 + Owner: Neutral + Location: 16,95 + Actor242: tc04 + Owner: Neutral + Location: 21,95 + Actor243: t16 + Owner: Neutral + Location: 19,94 + Actor244: t12 + Owner: Neutral + Location: 22,93 + Actor245: t02 + Owner: Neutral + Location: 18,98 + Actor246: t15 + Owner: Neutral + Location: 12,110 + Actor247: t07 + Owner: Neutral + Location: 2,102 + Actor248: t05 + Owner: Neutral + Location: 13,103 + Actor249: t12 + Owner: Neutral + Location: 3,110 + Actor250: t07 + Owner: Neutral + Location: 8,107 + Actor251: t01 + Owner: Neutral + Location: 5,111 + Actor252: t01 + Owner: Neutral + Location: 2,97 + Actor253: t08 + Owner: Neutral + Location: 10,111 + Actor254: wood + Owner: Neutral + Location: 2,94 + Actor255: wood + Owner: Neutral + Location: 3,94 + Actor256: wood + Owner: Neutral + Location: 4,94 + Actor257: wood + Owner: Neutral + Location: 5,94 + Actor258: wood + Owner: Neutral + Location: 5,95 + Actor259: wood + Owner: Neutral + Location: 1,94 + Actor260: wood + Owner: Neutral + Location: 1,95 + Actor261: wood + Owner: Neutral + Location: 18,106 + Actor262: wood + Owner: Neutral + Location: 18,105 + Actor263: wood + Owner: Neutral + Location: 18,111 + Actor264: wood + Owner: Neutral + Location: 18,112 + Actor265: wood + Owner: Neutral + Location: 17,106 + Actor266: wood + Owner: Neutral + Location: 17,111 + Actor267: wood + Owner: Neutral + Location: 12,98 + Actor268: wood + Owner: Neutral + Location: 13,98 + Actor269: wood + Owner: Neutral + Location: 7,100 + Actor270: wood + Owner: Neutral + Location: 7,99 + Actor271: wood + Owner: Neutral + Location: 7,98 + Actor272: wood + Owner: Neutral + Location: 9,98 + Actor273: wood + Owner: Neutral + Location: 8,98 + Actor274: wood + Owner: Neutral + Location: 10,98 + Actor275: wood + Owner: Neutral + Location: 5,106 + Actor276: wood + Owner: Neutral + Location: 6,106 + Actor277: wood + Owner: Neutral + Location: 4,106 + Actor278: wood + Owner: Neutral + Location: 3,102 + Actor279: wood + Owner: Neutral + Location: 4,102 + Actor280: wood + Owner: Neutral + Location: 5,102 + Actor281: wood + Owner: Neutral + Location: 12,101 + Actor282: wood + Owner: Neutral + Location: 13,101 + Actor283: wood + Owner: Neutral + Location: 13,102 + Actor284: c2 + Owner: NodCiv + Facing: 384 + Location: 5,105 + SubCell: 3 + Actor285: c1 + Owner: NodCiv + SubCell: 3 + Facing: 384 + Location: 10,102 + Actor286: c3 + Owner: NodCiv + SubCell: 3 + Facing: 384 + Location: 3,97 + Actor287: c4 + Owner: NodCiv + Facing: 384 + SubCell: 3 + Location: 12,99 + Actor288: c5 + Owner: NodCiv + Facing: 384 + SubCell: 3 + Location: 7,102 + Actor289: c6 + Owner: NodCiv + Facing: 384 + Location: 5,93 + SubCell: 3 + Actor290: c8 + Owner: NodCiv + SubCell: 3 + Facing: 384 + Location: 11,108 + Actor291: c9 + Owner: NodCiv + Facing: 384 + SubCell: 3 + Location: 4,99 + Actor292: c10 + Owner: NodCiv + SubCell: 3 + Facing: 384 + Location: 10,99 + Actor293: c5 + Owner: NodCiv + Facing: 384 + SubCell: 3 + Location: 16,110 + Actor294: cram + Owner: GDI + Location: 6,75 + Church2: v01 + Owner: NodCiv + Location: 45,38 + Actor296: v06 + Owner: NodCiv + Location: 47,44 + Actor297: v10 + Owner: NodCiv + Location: 36,40 + Actor298: v02 + Owner: NodCiv + Location: 40,27 + Actor299: v07 + Owner: NodCiv + Location: 46,33 + Actor300: v05 + Owner: NodCiv + Location: 32,27 + Actor301: v03 + Owner: NodCiv + Location: 39,33 + Actor302: v09 + Owner: NodCiv + Location: 46,29 + Actor303: v08 + Owner: NodCiv + Location: 35,38 + Actor304: v11 + Owner: NodCiv + Location: 40,37 + Actor305: v16 + Faction: blackh + Location: 47,46 + Owner: Neutral + Actor306: v17 + Faction: blackh + Location: 45,47 + Owner: Neutral + Actor307: v18 + Faction: blackh + Location: 44,47 + Owner: Neutral + Actor308: v17 + Faction: blackh + Location: 43,47 + Owner: Neutral + Actor309: v16 + Faction: blackh + Location: 42,47 + Owner: Neutral + Actor310: v13 + Faction: blackh + Location: 50,44 + Owner: Neutral + Actor311: v18 + Faction: blackh + Location: 48,46 + Owner: Neutral + Actor312: v04 + Owner: NodCiv + Location: 40,40 + Actor313: v11 + Owner: NodCiv + Location: 35,30 + Actor314: wood + Owner: NodCiv + Location: 46,37 + Actor315: wood + Owner: NodCiv + Location: 47,37 + Actor316: wood + Owner: NodCiv + Location: 47,38 + Actor317: wood + Owner: NodCiv + Location: 45,37 + Actor318: wood + Owner: NodCiv + Location: 44,37 + Actor319: wood + Owner: NodCiv + Location: 43,37 + Actor320: wood + Owner: NodCiv + Location: 43,38 + Actor321: wood + Owner: NodCiv + Location: 43,39 + Actor322: wood + Owner: NodCiv + Location: 42,37 + Actor323: wood + Owner: NodCiv + Location: 39,40 + Actor324: wood + Owner: NodCiv + Location: 39,39 + Actor325: wood + Owner: NodCiv + Location: 40,39 + Actor326: wood + Owner: NodCiv + Location: 38,40 + Actor327: wood + Owner: NodCiv + Location: 38,40 + Actor328: wood + Owner: NodCiv + Location: 39,30 + Actor329: wood + Owner: NodCiv + Location: 40,30 + Actor330: wood + Owner: NodCiv + Location: 41,30 + Actor331: wood + Owner: NodCiv + Location: 41,31 + Actor332: wood + Owner: NodCiv + Location: 41,32 + Actor333: wood + Owner: NodCiv + Location: 40,32 + Actor334: wood + Owner: NodCiv + Location: 31,26 + Actor335: wood + Owner: NodCiv + Location: 31,27 + Actor336: wood + Owner: NodCiv + Location: 32,26 + Actor337: wood + Owner: NodCiv + Location: 33,26 + Actor338: wood + Owner: NodCiv + Location: 34,26 + Actor339: wood + Owner: NodCiv + Location: 39,28 + Actor340: wood + Owner: NodCiv + Location: 39,27 + Actor341: wood + Owner: NodCiv + Location: 39,25 + Actor342: wood + Owner: NodCiv + Location: 40,25 + Actor343: wood + Owner: NodCiv + Location: 43,25 + Actor344: wood + Owner: NodCiv + Location: 44,25 + Actor345: wood + Owner: NodCiv + Location: 45,25 + Actor346: wood + Owner: NodCiv + Location: 45,26 + Actor347: wood + Owner: NodCiv + Location: 46,26 + Actor348: wood + Owner: NodCiv + Location: 52,33 + Actor349: wood + Owner: NodCiv + Location: 52,34 + Actor350: wood + Owner: NodCiv + Location: 52,37 + Actor351: wood + Owner: NodCiv + Location: 52,38 + Actor352: wood + Owner: NodCiv + Location: 52,39 + Actor353: wood + Owner: NodCiv + Location: 53,39 + Actor354: wood + Owner: NodCiv + Location: 30,36 + Actor355: wood + Owner: NodCiv + Location: 30,35 + Actor356: wood + Owner: NodCiv + Location: 30,37 + Actor357: wood + Owner: NodCiv + Location: 30,32 + Actor358: wood + Owner: NodCiv + Location: 30,31 + Actor360: wood + Owner: NodCiv + Location: 31,30 + Actor359: wood + Owner: NodCiv + Location: 31,31 + Actor361: wood + Owner: NodCiv + Location: 31,29 + Actor362: wood + Owner: NodCiv + Location: 31,28 + Actor363: wood + Owner: NodCiv + Location: 30,38 + Actor364: wood + Owner: NodCiv + Location: 48,43 + Actor365: wood + Owner: NodCiv + Location: 49,43 + Actor366: wood + Owner: NodCiv + Location: 49,44 + Actor367: wood + Owner: NodCiv + Location: 49,45 + Actor368: wood + Owner: NodCiv + Location: 48,45 + Actor369: wood + Owner: NodCiv + Location: 47,45 + Actor370: wood + Owner: NodCiv + Location: 46,45 + Actor371: wood + Owner: NodCiv + Location: 46,46 + Actor372: wood + Owner: NodCiv + Location: 46,47 + Actor373: wood + Owner: NodCiv + Location: 49,46 + Actor374: wood + Owner: NodCiv + Location: 45,46 + Actor375: wood + Owner: NodCiv + Location: 44,46 + Actor376: wood + Owner: NodCiv + Location: 42,46 + Actor377: wood + Owner: NodCiv + Location: 41,46 + Actor378: wood + Owner: NodCiv + Location: 41,47 + Actor379: wood + Owner: NodCiv + Location: 43,46 + Actor380: wood + Owner: NodCiv + Location: 41,48 + Actor381: wood + Owner: NodCiv + Location: 42,48 + Actor382: wood + Owner: NodCiv + Location: 43,48 + Actor383: wood + Owner: NodCiv + Location: 44,48 + Actor384: wood + Owner: NodCiv + Location: 45,48 + Actor385: wood + Owner: NodCiv + Location: 46,48 + Actor386: wood + Owner: NodCiv + Location: 47,47 + Actor387: wood + Owner: NodCiv + Location: 48,47 + Actor388: wood + Owner: NodCiv + Location: 49,47 + Actor389: wood + Owner: NodCiv + Location: 50,45 + Actor390: c3 + Owner: NodCiv + Facing: 384 + SubCell: 3 + Location: 42,39 + Actor391: c3 + Owner: NodCiv + Facing: 384 + SubCell: 3 + Location: 35,28 + Actor392: c4 + Owner: NodCiv + SubCell: 3 + Facing: 384 + Location: 50,40 + Actor393: c9 + Owner: NodCiv + Facing: 384 + SubCell: 3 + Location: 44,42 + Actor394: c10 + Owner: NodCiv + SubCell: 3 + Facing: 384 + Location: 47,40 + Actor395: tecn + Owner: NodCiv + Facing: 384 + SubCell: 3 + Location: 44,34 + Actor396: c5 + Owner: NodCiv + SubCell: 3 + Facing: 384 + Location: 36,33 + Actor397: c6 + Owner: NodCiv + Facing: 384 + Location: 45,45 + SubCell: 3 + Actor398: c1 + Owner: NodCiv + SubCell: 3 + Location: 32,37 + Facing: 384 + Actor399: c7 + Owner: NodCiv + Facing: 384 + SubCell: 3 + Location: 45,30 + Actor400: c2 + Owner: NodCiv + Facing: 384 + SubCell: 3 + Location: 50,32 + Actor401: brl3 + Owner: NodCiv + Location: 31,42 + Actor402: barl + Owner: NodCiv + Location: 30,41 + Actor403: windmill + Owner: NodCiv + Location: 38,44 + Actor404: split2 + Owner: Neutral + Location: 14,58 + Actor405: split2 + Owner: Neutral + Location: 21,60 + Actor409: proc.td + Owner: Nod + Location: 47,59 + Actor408: msg.static + Owner: Nod + Location: 45,63 + Facing: 384 + Actor410: msg.static + Owner: Nod + Location: 38,64 + Facing: 384 + Actor406: split2 + Owner: Neutral + Location: 55,51 + Actor407: split2 + Owner: Neutral + Location: 50,53 + SPowered2: nsam + Owner: Nod + Location: 86,92 + SPowered1: nsam + Owner: Nod + Location: 71,93 + SPowered3: nsam + Owner: Nod + Location: 70,109 + Actor416: split2 + Owner: Neutral + Location: 66,25 + Actor417: split2 + Owner: Neutral + Location: 60,17 + Actor418: split2 + Owner: Neutral + Location: 71,31 + Actor419: split2 + Owner: Neutral + Location: 11,10 + Actor420: split2 + Owner: Neutral + Location: 14,16 + Actor421: tc04 + Owner: Neutral + Location: 16,40 + Actor422: t07 + Owner: Neutral + Location: 28,47 + Actor423: t02 + Owner: Neutral + Location: 25,43 + Actor424: t06 + Owner: Neutral + Location: 23,44 + Actor425: t05 + Owner: Neutral + Location: 16,49 + Actor426: t10 + Owner: Neutral + Location: 26,52 + Actor427: t13 + Owner: Neutral + Location: 36,54 + Actor428: t11 + Owner: Neutral + Location: 2,46 + Actor429: t02 + Owner: Neutral + Location: 6,39 + Actor430: t05 + Owner: Neutral + Location: 11,36 + Actor431: t02 + Owner: Neutral + Location: 7,51 + Actor432: t01 + Owner: Neutral + Location: 6,50 + Actor433: t01 + Owner: Neutral + Location: 7,62 + Actor434: t02 + Owner: Neutral + Location: 17,67 + Actor435: t10 + Owner: Neutral + Location: 37,77 + Actor436: t15 + Owner: Neutral + Location: 53,87 + Actor437: tc01 + Owner: Neutral + Location: 50,75 + Actor438: t14 + Owner: Neutral + Location: 62,93 + Actor440: t03 + Owner: Neutral + Location: 66,82 + Actor441: t01 + Owner: Neutral + Location: 67,79 + Actor442: t02 + Owner: Neutral + Location: 66,74 + Actor443: t03 + Owner: Neutral + Location: 53,65 + Actor444: t01 + Owner: Neutral + Location: 47,74 + Actor445: t05 + Owner: Neutral + Location: 48,85 + Actor446: t16 + Owner: Neutral + Location: 51,89 + Actor447: tc01 + Owner: Neutral + Location: 53,107 + Actor448: tc02 + Owner: Neutral + Location: 64,108 + Actor449: tc04 + Owner: Neutral + Location: 90,107 + Actor450: tc05 + Owner: Neutral + Location: 93,100 + Actor451: t16 + Owner: Neutral + Location: 94,107 + Actor452: t07 + Owner: Neutral + Location: 92,110 + Actor453: t02 + Owner: Neutral + Location: 93,105 + Actor454: t14 + Owner: Neutral + Location: 86,110 + Actor455: t13 + Owner: Neutral + Location: 6,20 + Actor456: t13 + Owner: Neutral + Location: 10,68 + Actor457: t03 + Owner: Neutral + Location: 25,71 + Actor458: t14 + Owner: Neutral + Location: 25,83 + Actor459: t07 + Owner: Neutral + Location: 27,82 + Actor460: t02 + Owner: Neutral + Location: 23,77 + Actor461: t06 + Owner: Neutral + Location: 40,84 + Actor462: t16 + Owner: Neutral + Location: 32,86 + Actor463: t07 + Owner: Neutral + Location: 30,65 + Actor464: t07 + Owner: Neutral + Location: 29,56 + Actor465: t02 + Owner: Neutral + Location: 25,36 + Actor466: tc05 + Owner: Neutral + Location: 26,12 + Actor467: t06 + Owner: Neutral + Location: 33,18 + Actor468: t12 + Owner: Neutral + Location: 32,19 + Actor469: t11 + Owner: Neutral + Location: 37,11 + Actor470: t02 + Owner: Neutral + Location: 38,7 + Actor471: t06 + Owner: Neutral + Location: 26,8 + Actor472: t01 + Owner: Neutral + Location: 42,4 + Actor473: t05 + Owner: Neutral + Location: 43,8 + Actor474: t12 + Owner: Neutral + Location: 61,3 + Actor475: t11 + Owner: Neutral + Location: 79,69 + Actor476: t15 + Owner: Neutral + Location: 86,65 + Actor477: t16 + Owner: Neutral + Location: 91,63 + Actor478: t08 + Owner: Neutral + Location: 92,68 + Actor479: t12 + Owner: Neutral + Location: 93,69 + Actor480: t05 + Owner: Neutral + Location: 74,65 + Actor481: t02 + Owner: Neutral + Location: 77,76 + Actor482: t16 + Owner: Neutral + Location: 77,66 + Actor483: t07 + Owner: Neutral + Location: 77,60 + Actor484: tc04 + Owner: Neutral + Location: 71,56 + Actor485: t17 + Owner: Neutral + Location: 67,64 + Actor486: t14 + Owner: Neutral + Location: 62,57 + Actor487: t06 + Owner: Neutral + Location: 67,53 + Actor488: t05 + Owner: Neutral + Location: 69,46 + Actor489: t13 + Owner: Neutral + Location: 79,52 + Actor490: t07 + Owner: Neutral + Location: 82,44 + Actor491: t06 + Owner: Neutral + Location: 78,39 + Actor492: t03 + Owner: Neutral + Location: 82,37 + Actor493: t01 + Owner: Neutral + Location: 69,39 + Actor494: t01 + Owner: Neutral + Location: 64,32 + Actor495: t16 + Owner: Neutral + Location: 65,33 + Actor496: tc02 + Owner: Neutral + Location: 55,27 + Actor497: t06 + Owner: Neutral + Location: 56,25 + Actor498: t03 + Owner: Neutral + Location: 53,19 + Actor499: t10 + Owner: Neutral + Location: 49,22 + Actor500: t05 + Owner: Neutral + Location: 47,16 + Actor501: t16 + Owner: Neutral + Location: 56,70 + Actor502: brl3 + Owner: Creeps + Location: 37,68 + Actor503: barl + Owner: Creeps + Location: 38,69 + Actor504: brl3 + Owner: Creeps + Location: 40,31 + Actor505: barl + Owner: Creeps + Location: 39,31 + Actor506: t01 + Owner: Neutral + Location: 55,104 + Actor507: tc03 + Owner: Neutral + Location: 58,110 + Actor508: tc05 + Owner: Neutral + Location: 17,47 + Actor509: t06 + Owner: Neutral + Location: 19,31 + Actor510: t11 + Owner: Neutral + Location: 2,17 + Actor511: t06 + Owner: Neutral + Location: 3,20 + Actor512: t01 + Owner: Neutral + Location: 3,11 + Actor513: t05 + Owner: Neutral + Location: 10,3 + Actor514: t07 + Owner: Neutral + Location: 17,3 + Actor515: t08 + Owner: Neutral + Location: 23,8 + Actor516: t15 + Owner: Neutral + Location: 53,5 + Actor517: tc05 + Owner: Neutral + Location: 49,7 + Actor518: tc04 + Owner: Neutral + Location: 51,16 + Actor519: t16 + Owner: Neutral + Location: 64,6 + Actor520: t02 + Owner: Neutral + Location: 67,1 + Actor521: t08 + Owner: Neutral + Location: 90,5 + Actor522: t06 + Owner: Neutral + Location: 88,6 + Actor523: t15 + Owner: Neutral + Location: 92,10 + Actor524: tc04 + Owner: Neutral + Location: 82,2 + Actor525: t02 + Owner: Neutral + Location: 92,1 + Actor526: t06 + Owner: Neutral + Location: 92,22 + Actor527: t16 + Owner: Neutral + Location: 94,23 + Actor528: tc02 + Owner: Neutral + Location: 92,33 + Actor529: t15 + Owner: Neutral + Location: 93,31 + Actor530: t02 + Owner: Neutral + Location: 88,33 + Actor531: t07 + Owner: Neutral + Location: 88,27 + Actor532: t02 + Owner: Neutral + Location: 71,10 + Actor533: t01 + Owner: Neutral + Location: 56,9 + Actor534: spec + Owner: Nod + Location: 79,14 + Facing: 384 + Stance: Defend + Actor535: spec + Owner: Nod + Location: 88,17 + Facing: 384 + Stance: Defend + Actor536: spec + Owner: Nod + Location: 88,23 + Facing: 384 + Stance: Defend + Actor537: spec + Owner: Nod + Facing: 384 + Stance: Defend + Location: 35,44 + Actor538: stnk.nod + Owner: Nod + Location: 15,14 + Stance: Defend + Facing: 594 + Actor539: stnk.nod + Owner: Nod + Facing: 384 + Stance: Defend + Location: 10,13 + Actor540: stnk.nod + Owner: Nod + Facing: 384 + Stance: Defend + Location: 58,18 + Actor541: stnk.nod + Owner: Nod + Stance: Defend + Location: 63,25 + Facing: 602 + Actor542: stnk.nod + Owner: Nod + Stance: Defend + Location: 69,30 + Facing: 650 + Actor543: stnk.nod + Owner: Nod + Facing: 384 + Stance: Defend + Location: 90,83 + Actor544: stnk.nod + Owner: Nod + Stance: Defend + Location: 49,99 + Facing: 142 + Actor545: stnk.nod + Owner: Nod + Stance: Defend + Location: 12,57 + Facing: 610 + Actor546: stnk.nod + Owner: Nod + Stance: Defend + Location: 19,57 + Facing: 499 + Actor547: stnk.nod + Owner: Nod + Stance: Defend + Location: 55,54 + Facing: 384 + Actor548: stnk.nod + Owner: Nod + Facing: 384 + Stance: Defend + Location: 52,52 + Actor549: bggy + Owner: Nod + Location: 6,99 + Facing: 491 + Actor550: bggy + Owner: Nod + Location: 7,109 + Facing: 888 + Actor551: ltnk + Owner: Nod + Location: 77,90 + Facing: 1023 + Actor552: ltnk + Owner: Nod + Location: 69,101 + Facing: 253 + Actor553: ftnk + Owner: Nod + Location: 91,49 + Facing: 126 + Actor554: stnk.nod + Owner: Nod + Location: 86,63 + Facing: 384 + Stance: Defend + Actor555: stnk.nod + Owner: Nod + Facing: 384 + Stance: Defend + Location: 82,61 + Actor556: stnk.nod + Owner: Nod + Facing: 384 + Stance: Defend + Location: 74,50 + Actor557: stnk.nod + Owner: Nod + Stance: Defend + Location: 57,30 + Facing: 555 + Actor558: stnk.nod + Owner: Nod + Stance: Defend + Location: 26,20 + Facing: 384 + Actor559: stnk.nod + Owner: Nod + Facing: 384 + Stance: Defend + Location: 44,33 + Actor560: stnk.nod + Owner: Nod + Stance: Defend + Location: 50,41 + Facing: 190 + Actor561: stnk.nod + Owner: Nod + Stance: Defend + Location: 36,27 + Facing: 523 + Actor562: ltnk + Owner: Nod + Location: 9,26 + Facing: 761 + Actor563: ftnk + Owner: Nod + Location: 78,26 + Facing: 507 + Actor564: ftnk + Owner: Nod + Location: 82,27 + Facing: 531 + Actor565: ftnk + Owner: Nod + Location: 70,19 + Facing: 253 + Actor566: ftnk + Owner: Nod + Location: 70,15 + Facing: 261 + Actor567: ltnk + Owner: Nod + Facing: 384 + Location: 87,28 + Actor568: ltnk + Owner: Nod + Location: 69,13 + Facing: 245 + Actor569: bggy + Owner: Nod + Facing: 384 + Location: 46,34 + Actor570: bggy + Owner: Nod + Location: 37,33 + Facing: 761 + Actor571: bggy + Owner: Nod + Facing: 384 + Location: 43,41 + Actor572: ltnk + Owner: Nod + Facing: 384 + Location: 44,61 + Actor573: ltnk + Owner: Nod + Location: 47,64 + Facing: 753 + Actor574: ftnk + Owner: Nod + Location: 41,62 + Facing: 1023 + Actor575: bggy + Owner: Nod + Location: 46,67 + Facing: 515 + Actor576: bggy + Owner: Nod + Location: 42,105 + Facing: 253 + Actor577: bggy + Owner: Nod + Location: 44,106 + Facing: 253 + Actor578: shad + Owner: Nod + SubCell: 3 + Location: 77,25 + Facing: 650 + Actor579: shad + Owner: Nod + Location: 77,25 + SubCell: 1 + Facing: 507 + Actor580: shad + Owner: Nod + SubCell: 3 + Location: 83,26 + Facing: 384 + Actor581: shad + Owner: Nod + SubCell: 3 + Location: 87,24 + Facing: 384 + Actor582: shad + Owner: Nod + SubCell: 3 + Location: 77,13 + Facing: 384 + Actor583: shad + Owner: Nod + Location: 77,13 + SubCell: 1 + Facing: 198 + Actor584: shad + Owner: Nod + SubCell: 3 + Location: 76,11 + Facing: 384 + Actor585: shad + Owner: Nod + SubCell: 3 + Location: 81,10 + Facing: 602 + Actor586: shad + Owner: Nod + Location: 85,14 + SubCell: 3 + Facing: 563 + Actor587: shad + Owner: Nod + Location: 69,12 + SubCell: 3 + Facing: 198 + Actor588: shad + Owner: Nod + Location: 69,12 + SubCell: 1 + Facing: 134 + Actor589: shad + Owner: Nod + SubCell: 3 + Location: 70,11 + Facing: 150 + Actor590: shad + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 39,66 + Actor591: shad + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 48,66 + Actor594: shad + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 80,92 + Actor595: shad + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 70,102 + Actor596: shad + Owner: Nod + SubCell: 3 + Location: 43,107 + Facing: 71 + Actor597: shad + Owner: Nod + SubCell: 3 + Location: 45,105 + Facing: 214 + Actor598: n1 + Owner: Nod + Facing: 384 + Location: 16,40 + SubCell: 3 + Actor599: n1 + Owner: Nod + Facing: 384 + Location: 18,47 + SubCell: 3 + Actor600: n1 + Owner: Nod + Facing: 384 + Location: 3,46 + SubCell: 3 + Actor601: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 68,47 + Actor602: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 92,45 + Actor603: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 90,50 + Actor604: n1 + Owner: Nod + SubCell: 3 + Location: 68,98 + Facing: 277 + Actor605: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 79,89 + Actor606: n1 + Owner: Nod + SubCell: 3 + Location: 65,99 + Facing: 206 + Actor608: n1 + Owner: Nod + SubCell: 3 + Location: 88,102 + Facing: 666 + Actor609: n1 + Owner: Nod + Location: 84,109 + Facing: 840 + Actor610: n1 + Owner: Nod + Location: 85,108 + SubCell: 3 + Facing: 682 + Actor611: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 81,57 + Actor612: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 84,58 + Actor613: n1 + Owner: Nod + SubCell: 3 + Location: 44,67 + Facing: 483 + Actor614: n1 + Owner: Nod + Location: 45,66 + SubCell: 3 + Facing: 634 + Actor615: n1 + Owner: Nod + SubCell: 3 + Location: 37,65 + Facing: 555 + Actor616: n1 + Owner: Nod + SubCell: 3 + Location: 50,60 + Facing: 610 + Actor617: n1 + Owner: Nod + SubCell: 3 + Location: 39,57 + Facing: 0 + Actor618: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 39,41 + Actor619: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 29,32 + Actor620: n1 + Owner: Nod + SubCell: 3 + Location: 29,36 + Facing: 277 + Actor621: n1 + Owner: Nod + SubCell: 3 + Location: 53,38 + Facing: 729 + Actor622: n1 + Owner: Nod + SubCell: 3 + Location: 54,34 + Facing: 785 + Actor623: n1 + Owner: Nod + SubCell: 3 + Location: 49,39 + Facing: 55 + Actor624: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 51,16 + Actor625: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 54,5 + Actor626: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 64,6 + Actor627: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 94,23 + Actor628: n3 + Owner: Nod + Facing: 384 + Location: 88,33 + SubCell: 3 + Actor629: n3 + Owner: Nod + Facing: 384 + Location: 53,19 + SubCell: 3 + Actor630: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 32,19 + Actor631: n3 + Owner: Nod + SubCell: 3 + Location: 27,52 + Facing: 384 + Actor632: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 36,54 + Actor633: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 25,71 + Actor634: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 10,68 + Actor635: n3 + Owner: Nod + Location: 51,89 + SubCell: 3 + Facing: 142 + Actor636: n3 + Owner: Nod + SubCell: 3 + Location: 63,93 + Facing: 602 + Actor637: n3 + Owner: Nod + Facing: 384 + Location: 64,108 + SubCell: 3 + Actor638: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 94,107 + Actor639: n3 + Owner: Nod + Location: 93,100 + SubCell: 3 + Facing: 150 + Actor640: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 93,69 + Actor641: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 95,53 + Actor642: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 94,46 + Actor643: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 44,38 + Actor644: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 32,30 + Actor645: n3 + Owner: Nod + Facing: 384 + Location: 45,66 + SubCell: 1 + Actor646: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 45,60 + Actor647: n3 + Owner: Nod + SubCell: 3 + Location: 86,94 + Facing: 0 + Actor648: n3 + Owner: Nod + SubCell: 3 + Location: 73,92 + Facing: 182 + Actor649: n3 + Owner: Nod + SubCell: 3 + Location: 77,103 + Facing: 174 + Actor650: n3 + Owner: Nod + Facing: 384 + Location: 72,109 + SubCell: 3 + Actor651: n1 + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 11,28 + Actor652: n1 + Owner: Nod + Facing: 384 + Location: 8,25 + SubCell: 3 + Actor653: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 9,30 + Actor654: n3 + Owner: Nod + Facing: 384 + Location: 11,28 + SubCell: 1 + Actor655: n3 + Owner: Nod + Facing: 384 + Location: 4,27 + SubCell: 3 + Actor656: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 41,65 + Actor657: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 82,97 + Actor658: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 69,100 + Actor659: n4 + Owner: Nod + Facing: 384 + Location: 85,108 + SubCell: 1 + Actor660: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 93,49 + Actor661: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 78,24 + Actor662: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 73,15 + Actor663: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 89,22 + Actor664: n4 + Owner: Nod + SubCell: 3 + Location: 92,22 + Facing: 384 + Actor665: n4 + Owner: Nod + Facing: 384 + Location: 93,10 + SubCell: 3 + Actor666: n3 + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 88,6 + Actor667: n3 + Owner: Nod + Facing: 384 + Location: 82,2 + SubCell: 3 + Actor668: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 49,36 + Actor669: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 59,27 + Actor670: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 77,51 + Actor671: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 89,66 + Actor672: n4 + Owner: Nod + Facing: 384 + Location: 77,66 + SubCell: 3 + Actor673: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 3,52 + Actor674: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 5,53 + Actor675: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 20,26 + Actor676: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 19,25 + Actor677: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 38,11 + Actor678: n3 + Owner: Nod + Facing: 384 + Location: 42,4 + SubCell: 3 + Actor679: n3 + Owner: Nod + Facing: 384 + Location: 26,8 + SubCell: 3 + Actor680: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 28,10 + Actor681: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 49,14 + Actor682: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 51,12 + Actor683: bggy + Owner: Nod + Facing: 384 + Location: 50,12 + Actor684: bggy + Owner: Nod + Location: 33,11 + Facing: 610 + Actor685: ltnk + Owner: Nod + Location: 14,40 + Facing: 515 + Actor686: bike + Owner: Nod + Facing: 384 + Location: 17,39 + Actor687: bike + Owner: Nod + Location: 12,37 + Facing: 563 + Actor688: bike + Owner: Nod + Location: 79,90 + Facing: 118 + Actor689: bike + Owner: Nod + Location: 83,108 + Facing: 658 + SouthConyard: afac + Owner: Nod + Location: 75,101 + AttackNode9: waypoint + Owner: Neutral + Location: 61,100 + AttackNode8: waypoint + Owner: Neutral + Location: 57,108 + AttackNode10: waypoint + Owner: Neutral + Location: 62,83 + AttackNode5: waypoint + Owner: Neutral + Location: 30,84 + AttackNode7: waypoint + Owner: Neutral + Location: 33,102 + AttackNode13: waypoint + Owner: Neutral + Location: 79,42 + AttackNode1: waypoint + Owner: Neutral + Location: 44,14 + AttackNode2: waypoint + Owner: Neutral + Location: 20,35 + AttackNode14: waypoint + Owner: Neutral + Location: 59,37 + AttackNode3: waypoint + Owner: Neutral + Location: 3,58 + Actor703: waypoint + Owner: Neutral + Location: 41,54 + AttackNode11: waypoint + Owner: Neutral + Location: 65,62 + AttackNode12: waypoint + Owner: Neutral + Location: 84,71 + AttackNode15: waypoint + Owner: Neutral + Location: 31,52 + AttackNode4: waypoint + Owner: Neutral + Location: 18,59 + AttackNode6: waypoint + Owner: Neutral + Location: 42,60 + AttackNode16: waypoint + Owner: Neutral + Location: 55,63 + Actor691: msg.static + Owner: Nod + Location: 85,94 + Facing: 384 + Actor692: msg.static + Owner: Nod + Location: 85,101 + Facing: 384 + SouthHand2: hand + Owner: Nod + Location: 74,95 + McvSpawn: waypoint + Owner: Neutral + Location: 35,112 + McvRally: waypoint + Owner: Neutral + Location: 35,104 + Actor696: n1 + Owner: GDI + SubCell: 3 + Location: 36,84 + Facing: 769 + Actor697: apc2 + Owner: GDI + Location: 13,84 + Facing: 674 + Actor698: hosp + Faction: blackh + Location: 12,107 + Owner: Neutral + Actor699: oilb + Owner: Nod + Location: 94,103 + Actor704: gun.nod + Owner: Nod + Location: 40,48 + TurretFacing: 531 + Actor705: gun.nod + Owner: Nod + Location: 51,47 + TurretFacing: 721 + Actor706: gun.nod + Owner: Nod + Location: 16,51 + TurretFacing: 547 + Actor707: gun.nod + Owner: Nod + Location: 50,28 + Actor708: gun.nod + Owner: Nod + Location: 30,26 + Actor709: gun.nod + Owner: Nod + Location: 29,42 + TurretFacing: 467 + Actor710: gun.nod + Owner: Nod + Location: 91,65 + TurretFacing: 404 + Actor711: silo.td + Owner: Nod + Location: 87,51 + Actor712: silo.td + Owner: Nod + Location: 87,53 + Actor713: camera + Owner: Nod + Location: 42,83 + Actor714: camera + Owner: Nod + Location: 59,82 + Actor715: camera + Owner: Nod + Location: 32,103 + Actor716: camera + Owner: Nod + Location: 30,87 + Actor717: camera + Owner: Nod + Location: 19,80 + Actor718: camera + Owner: Nod + Location: 41,63 + Actor719: camera + Owner: Nod + Location: 16,66 + Actor720: camera + Owner: Nod + Location: 23,48 + Actor721: camera + Owner: Nod + Location: 18,29 + Actor722: camera + Owner: Nod + Location: 80,48 + Actor723: camera + Owner: Nod + Location: 77,99 + Actor724: camera + Owner: Nod + Location: 60,100 + Actor725: camera + Owner: Nod + Location: 78,81 + Actor726: camera + Owner: Nod + Location: 64,62 + Actor727: camera + Owner: Nod + Location: 58,34 + Actor728: camera + Owner: Nod + Location: 38,16 + Actor729: silo.td + Owner: Nod + Location: 87,55 + Actor730: silo.td + Owner: Nod + Location: 5,29 + Actor731: silo.td + Owner: Nod + Location: 7,31 + Actor732: oilb + Owner: Nod + Location: 11,39 + Actor733: oilb + Owner: Nod + Location: 94,63 + NormalHardOnlyLtnk: ltnk + Owner: Nod + Location: 36,100 + Facing: 126 + Actor735: ltnk + Owner: Nod + Location: 35,97 + Facing: 103 + Actor738: ftnk + Owner: Nod + Location: 38,100 + Facing: 253 + Actor739: htnk + Owner: GDI + Location: 60,84 + Health: 72 + Facing: 768 + Actor740: apc2 + Owner: GDI + Location: 46,82 + Health: 80 + Facing: 983 + Actor741: hmmv + Owner: GDI + Location: 42,84 + Health: 83 + Facing: 0 + Actor742: mtnk + Owner: GDI + Location: 42,86 + Health: 80 + Facing: 951 + Actor743: msam + Owner: GDI + Location: 37,86 + Health: 79 + Facing: 634 + Actor744: medi + Owner: GDI + SubCell: 3 + Location: 13,82 + Facing: 856 + Actor745: n1 + Owner: GDI + SubCell: 3 + Facing: 777 + Location: 13,81 + Actor747: n1 + Owner: GDI + SubCell: 1 + Facing: 880 + Location: 13,81 + Actor748: n1 + Owner: GDI + SubCell: 3 + Facing: 674 + Location: 14,84 + Actor749: n1 + Owner: GDI + SubCell: 3 + Facing: 384 + Location: 62,85 + Actor734: msg.static + Owner: Nod + Location: 6,30 + Facing: 384 + PlayerStart: waypoint + Owner: Neutral + Location: 29,83 + Actor746: shad + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 46,75 + Actor750: ftnk + Owner: Nod + Facing: 491 + Location: 41,76 + Actor752: n1 + Owner: Nod + SubCell: 3 + Facing: 602 + Location: 45,76 + Actor753: n1 + Owner: Nod + SubCell: 3 + Location: 38,76 + Facing: 578 + Actor754: bike + Owner: Nod + Location: 39,75 + Facing: 515 + Actor755: n1 + Owner: Nod + SubCell: 3 + Facing: 467 + Location: 40,77 + Actor756: bike + Owner: Nod + Location: 49,74 + Facing: 384 + Actor757: bggy + Owner: Nod + Facing: 570 + Location: 59,76 + Actor758: n1 + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 59,77 + NormalHardOnlyStnk: stnk.nod + Owner: Nod + Stance: Defend + Location: 60,91 + Facing: 103 + Actor759: shad + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 58,91 + Actor760: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 62,90 + Actor761: sapc.ai + Owner: Nod + Facing: 245 + Location: 63,90 + Actor762: n1 + Owner: Nod + SubCell: 3 + Facing: 198 + Location: 64,89 + Actor439: t02 + Owner: Neutral + Location: 66,89 + Actor763: bike + Owner: Nod + Facing: 118 + Location: 47,91 + Actor764: n3 + Owner: Nod + SubCell: 3 + Facing: 134 + Location: 48,90 + Actor766: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 46,91 + Actor768: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 36,92 + NormalHardOnlyArty: arty.nod + Owner: Nod + Location: 24,82 + Facing: 245 + Actor769: arty.nod + Owner: Nod + Facing: 269 + Location: 22,76 + Actor770: arty.nod + Owner: Nod + Location: 23,89 + Facing: 206 + Actor771: bggy + Owner: Nod + Facing: 253 + Location: 22,86 + Actor737: n1 + Owner: Nod + SubCell: 3 + Facing: 182 + Location: 20,88 + Actor772: n1 + Owner: Nod + SubCell: 3 + Facing: 269 + Location: 21,82 + Actor774: n1 + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 19,77 + Actor775: n1 + Owner: Nod + SubCell: 3 + Facing: 293 + Location: 21,80 + MainAmbushTopLeft: waypoint + Owner: Neutral + Location: 36,74 + MainAmbushBottomRight: waypoint + Owner: Neutral + Location: 65,92 + SecondaryAmbushTopLeft: waypoint + Owner: Neutral + Location: 15,75 + SecondaryAmbushBottomRight: waypoint + Owner: Neutral + Location: 25,90 + Actor776: n1 + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 20,79 + Actor777: ltnk + Owner: Nod + Facing: 396 + TurretFacing: 911 + Location: 20,80 + Actor773: n3 + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 20,78 + Actor778: ltnk + Owner: Nod + Facing: 570 + Location: 43,76 + Actor751: ltnk + Owner: Nod + Facing: 459 + Location: 57,77 + Actor736: n3 + Owner: Nod + SubCell: 3 + Facing: 134 + Location: 53,89 + Actor765: n1 + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 37,92 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, enmity-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/main-campaign/ca26-capitulation/c_atomicshutdown.aud b/mods/ca/missions/main-campaign/ca26-capitulation/c_atomicshutdown.aud new file mode 100644 index 0000000000..a16069f756 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca26-capitulation/c_atomicshutdown.aud differ diff --git a/mods/ca/missions/main-campaign/ca26-capitulation/c_atomicup.aud b/mods/ca/missions/main-campaign/ca26-capitulation/c_atomicup.aud new file mode 100644 index 0000000000..290f3ed719 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca26-capitulation/c_atomicup.aud differ diff --git a/mods/ca/missions/main-campaign/ca26-capitulation/c_fuelshipment.aud b/mods/ca/missions/main-campaign/ca26-capitulation/c_fuelshipment.aud new file mode 100644 index 0000000000..6d6e2d2f73 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca26-capitulation/c_fuelshipment.aud differ diff --git a/mods/ca/missions/main-campaign/ca26-capitulation/c_sovietbasenopower.aud b/mods/ca/missions/main-campaign/ca26-capitulation/c_sovietbasenopower.aud new file mode 100644 index 0000000000..94ed875aba Binary files /dev/null and b/mods/ca/missions/main-campaign/ca26-capitulation/c_sovietbasenopower.aud differ diff --git a/mods/ca/missions/main-campaign/ca26-capitulation/c_sovietsecondarypoweroffline.aud b/mods/ca/missions/main-campaign/ca26-capitulation/c_sovietsecondarypoweroffline.aud new file mode 100644 index 0000000000..a4e82eeac2 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca26-capitulation/c_sovietsecondarypoweroffline.aud differ diff --git a/mods/ca/missions/main-campaign/ca26-capitulation/c_teslareactorsremain.aud b/mods/ca/missions/main-campaign/ca26-capitulation/c_teslareactorsremain.aud new file mode 100644 index 0000000000..80650bf889 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca26-capitulation/c_teslareactorsremain.aud differ diff --git a/mods/ca/missions/main-campaign/ca26-capitulation/capitulation-rules.yaml b/mods/ca/missions/main-campaign/ca26-capitulation/capitulation-rules.yaml new file mode 100644 index 0000000000..3ee9c2e847 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca26-capitulation/capitulation-rules.yaml @@ -0,0 +1,180 @@ +^Palettes: + TintPostProcessEffect: + Red: 0.85 + Green: 0.85 + Blue: 1 + Ambient: 0.85 + WeatherOverlay: + ParticleDensityFactor: 4 + Gravity: 16, 24 + WindTick: 150, 425 + ScatterDirection: -12, 12 + ParticleSize: 2, 3 + ParticleColors: ECECEC44, E4E4E444, D0D0D044, BCBCBC44 + LineTailAlphaValue: 0 + +World: + LuaScript: + Scripts: campaign.lua, capitulation.lua + MissionData: + Briefing: The path to the Scrin stronghold is now clear and preparations for our assault are underway. Stalin is a wildcard that we cannot ignore, and we have decided it would be best to remove him from the equation.\n\nHe has retreated to a heavily fortified compound in Siberia and surrounded himself with his most loyal and experienced troops. Soviet ground forces suffered huge losses as a result of recent Scrin incursions, however their air force is still largely intact, so expect Stalin to make heavy use of it.\n\nHis stronghold is very heavily defended and key structures are protected by an Iron Curtain device that must be hidden underground.\n\nAn Atomic Reactor is the primary source of power for the base. Allied spies have reported to us that the reactor requires a constant supply of fuel to keep up with the base's enormous power consumption, so if we can cut their supply lines and prevent additional fuel from reaching the reactor, it would only be a matter of time before it is forced to shut down.\n\nThe base also has a secondary source of power in the form of a bank of Tesla Reactors on a nearby island. These reactors enable the base's Tesla Coils to be supercharged and should be destroyed before an attack on the main stronghold is attempted.\n\nOur last attempt to besiege a Soviet base with an Iron Curtain device did not end well; let's hope that Allied intel is accurate. + MapOptions: + ShortGameCheckboxEnabled: False + MusicPlaylist: + StartingMusic: fac2226m + +Player: + PlayerResources: + DefaultCash: 6000 + +EYE: + Inherits@CAMPAIGNDISABLED: ^Disabled + +TSLA: + -Targetable@TeslaBoost: + ExternalCondition@BUFFREMOVED: + Condition: buff-removed + GrantCondition@CHARGED1: + Condition: charged + RequiresCondition: !buff-removed + GrantCondition@CHARGED2: + Condition: charged + RequiresCondition: !buff-removed + GrantCondition@CHARGED3: + Condition: charged + RequiresCondition: !buff-removed + DamageMultiplier@BUFFED: + Modifier: 50 + RequiresCondition: !buff-removed + RangeMultiplier@PERMABUFF: + Modifier: 110 + ExternalCondition@ICOFFLINE: + Condition: ic-offline + WithPalettedOverlay@IRONCURTAIN: + RequiresCondition: invulnerability && !ic-offline + DamageMultiplier@IRONCURTAIN: + RequiresCondition: invulnerability && !ic-offline + TimedConditionBar@IRONCURTAIN: + Condition: invulnerability && !ic-offline + WithColoredOverlay@IDISABLE: + RequiresCondition: disabled && !(empdisable || being-warped) + +SAM: + ExternalCondition@BUFFREMOVED: + Condition: buff-removed + DamageMultiplier@BUFFED: + Modifier: 50 + RequiresCondition: !buff-removed + +DOME: + ParatroopersPowerCA@paratroopers: + RequiresCondition: paratroopers-enabled + ExternalCondition@paratroopers: + Condition: paratroopers-enabled + +AFLD: + AirstrikePowerCA@Russianparabombs: + RequiresCondition: parabombs-enabled + ExternalCondition@parabombs: + Condition: parabombs-enabled + +NPWR: + ExternalCondition@DISABLED: + Condition: disabled + ExternalCondition@ICOFFLINE: + Condition: ic-offline + GrantCondition@HASPOWER: + Condition: invulnerability + RequiresCondition: !ic-offline + WithIdleOverlay@SMOKE1: + RequiresCondition: !(disabled || being-warped || build-incomplete) + WithIdleOverlay@SMOKE2: + RequiresCondition: !(disabled || being-warped || build-incomplete) + WithIdleOverlay@SMOKE3: + RequiresCondition: !(disabled || being-warped || build-incomplete) + Capturable: + RequiresCondition: !build-incomplete && !being-warped && !invulnerability + Health: + HP: 400000 + +FCOM: + Health: + HP: 250000 + Tooltip: + Name: Stalin's Bunker + -GenericVisibility: + -BaseProvider: + -SpawnActorOnDeath: + RepairableBuilding: + RepairStep: 500 + RepairPercent: 30 + RepairingNotification: Repairing + GrantCondition@HASPOWER: + Condition: invulnerability + RequiresCondition: !ic-offline + ExternalCondition@ICOFFLINE: + Condition: ic-offline + Capturable: + RequiresCondition: !invulnerability + FireWarheadsOnDeath: + Type: Footprint + Weapon: BuildingExplode + EmptyWeapon: BuildingExplode + +UTRK: + Inherits: DTRK + RenderSprites: + Image: dtrk + Health: + HP: 20000 + Mobile: + Speed: 54 + FireWarheadsOnDeath: + Weapon: CrateNuke + EmptyWeapon: CrateNuke + Buildable: + Prerequisites: ~disabled + Description: Truck carrying reactor fuel. + Tooltip: + Name: Reactor Fuel Truck + +UAV: + -Targetable@AIRBORNE: + +YAK: + -EjectOnDeath: + +HIND: + -EjectOnDeath: + +MIG: + -EjectOnDeath: + +SUK: + -EjectOnDeath: + +KIRO: + -EjectOnDeath: + +SPY: + RevealsShroud: + Range: 8c512 + +MSAM: + Inherits@CAMPAIGNDISABLED: ^Disabled + +HSAM: + Buildable: + Prerequisites: anyradar, ~vehicles.gdi + +AURO: + Buildable: + Prerequisites: afld.gdi, gtek + +hovermam.upgrade: + Buildable: + Prerequisites: upgc + +V3RL: + AutoTargetPriority@DEFAULT: + ValidTargets: Structure, Defense diff --git a/mods/ca/missions/main-campaign/ca26-capitulation/capitulation-weapons.yaml b/mods/ca/missions/main-campaign/ca26-capitulation/capitulation-weapons.yaml new file mode 100644 index 0000000000..653762b9f6 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca26-capitulation/capitulation-weapons.yaml @@ -0,0 +1,10 @@ +TeslaZapBoost3: + Range: 9c512 + Warhead@1Dam: SpreadDamage + Damage: 20000 + +Nike: + Inherits: ^AntiAirMissile + Range: 8c0 + Projectile: MissileCA + Speed: 448 diff --git a/mods/ca/missions/main-campaign/ca26-capitulation/capitulation.lua b/mods/ca/missions/main-campaign/ca26-capitulation/capitulation.lua new file mode 100644 index 0000000000..c5a609cf6d --- /dev/null +++ b/mods/ca/missions/main-campaign/ca26-capitulation/capitulation.lua @@ -0,0 +1,490 @@ +MissionDir = "ca|missions/main-campaign/ca26-capitulation" + +AttackPaths = { + { WestDelivery3.Location, AttackRally1.Location }, + { WestDelivery3.Location, AttackRally2.Location }, + { SouthDelivery3.Location, AttackRally2.Location }, + { SouthDelivery3.Location, AttackRally3.Location }, +} + +Deliveries = { + { + Spawn = SouthDeliverySpawn.Location, + Path = { SouthDelivery1.Location, SouthDelivery2.Location, SouthDelivery3.Location, SouthDelivery4.Location, ReactorDeliveryPoint2.Location }, + }, + { + Spawn = WestDeliverySpawn.Location, + Path = { WestDelivery1.Location, WestDelivery2.Location, WestDelivery3.Location, WestDelivery4.Location, ReactorDeliveryPoint2.Location }, + }, + { + Spawn = EastDeliverySpawn.Location, + Path = { EastDelivery1.Location, EastDelivery2.Location, EastDelivery3.Location, ReactorDeliveryPoint2.Location }, + }, +} + +OuterSAMs = { OuterSAM2, OuterSAM4, OuterSAM6, OuterSAM8, OuterSAM10, OuterSAM12, OuterSAM14, OuterSAM16, OuterSAM18, OuterSAM20, OuterSAM22, OuterSAM24, OuterSAM26, OuterSAM28, OuterSAM30, OuterSAM31, OuterSAM32, OuterSAM33, OuterSAM34, OuterSAM35, OuterSAM36, OuterSAM37 } + +TeslaReactors = { TPower1, TPower2, TPower3, TPower4, TPower5, TPower6, TPower7, TPower8, TPower9 } + +InnerTeslas = { InnerTesla1, InnerTesla2, InnerTesla3, InnerTesla4 } + +ParabombsEnabledDelay = { + easy = DateTime.Minutes(9), + normal = DateTime.Minutes(7), + hard = DateTime.Minutes(5), + vhard = DateTime.Minutes(4), + brutal = DateTime.Minutes(3) +} + +ParatroopersEnabledDelay = { + easy = DateTime.Minutes(8), + normal = DateTime.Minutes(6), + hard = DateTime.Minutes(4), + vhard = DateTime.Minutes(3), + brutal = DateTime.Minutes(2) +} + +MaxReactorFuelTime = DateTime.Minutes(10) + +if Difficulty == "brutal" then + table.insert(UnitCompositions.Soviet, { + Infantry = { "e3", "ttrp", "e1", "ttrp", "ttrp", "ttrp", "ttrp", "ttrp", "e1", "e1", "e1", "e1", "e1", "e1", "e1", "ttrp", "e1", "e1" }, + Vehicles = { "ttnk", "ttnk", "ttnk", "ttnk", "isu", "ttnk", "ttra", "ttra" }, + MinTime = DateTime.Minutes(14), + RequiredTargetCharacteristics = { "MassInfantry" } + }) +end + +Squads = { + Main = { + Delay = AdjustDelayForDifficulty(DateTime.Minutes(4)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 20, Max = 40 }), + FollowLeader = true, + ProducerActors = { Infantry = { MainBarracks1, MainBarracks2 }, Vehicles = { MainFactory } }, + Compositions = AdjustCompositionsForDifficulty(UnitCompositions.Soviet), + AttackPaths = AttackPaths, + }, + AirAntiLight = { + Delay = AdjustAirDelayForDifficulty(DateTime.Minutes(6)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 7, Max = 12 }), + Compositions = { + easy = { + { Aircraft = { HindOrYak } }, + }, + normal = { + { Aircraft = { HindOrYak, HindOrYak } }, + }, + hard = { + { Aircraft = { HindOrYak, HindOrYak, HindOrYak } }, + }, + vhard = { + { Aircraft = { HindOrYak, HindOrYak, HindOrYak, HindOrYak, HindOrYak } }, + }, + brutal = { + { Aircraft = { HindOrYak, HindOrYak, HindOrYak, HindOrYak, HindOrYak, HindOrYak, HindOrYak } }, + } + }, + }, + AirAntiHeavy = { + Delay = AdjustAirDelayForDifficulty(DateTime.Minutes(10)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 7, Max = 12 }), + Compositions = { + easy = { + { Aircraft = { MigOrSukhoi } }, + }, + normal = { + { Aircraft = { MigOrSukhoi, MigOrSukhoi } }, + }, + hard = { + { Aircraft = { MigOrSukhoi, MigOrSukhoi, MigOrSukhoi } }, + }, + vhard = { + { Aircraft = { MigOrSukhoi, MigOrSukhoi, MigOrSukhoi, MigOrSukhoi } }, + }, + brutal = { + { Aircraft = { MigOrSukhoi, MigOrSukhoi, MigOrSukhoi, MigOrSukhoi, MigOrSukhoi } }, + } + }, + }, + AirAntiAir = { + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 12, Max = 12 }), + ActiveCondition = function(squad) + return PlayerOrMissionPlayersHaveCharacteristic(squad.TargetPlayer, "MassAir") + end, + Compositions = { + easy = { + { Aircraft = { "mig" } }, + }, + normal = { + { Aircraft = { "mig", "yak" } }, + }, + hard = { + { Aircraft = { "mig", "mig", "yak" } }, + }, + vhard = { + { Aircraft = { "mig", "mig", "yak", "yak" } }, + }, + brutal = { + { Aircraft = { "mig", "mig", "yak", "yak", "mig" } }, + } + }, + }, + Kirovs = { + Delay = AdjustAirDelayForDifficulty(DateTime.Minutes(13)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 7, Max = 20 }), + Compositions = { + easy = { + { Aircraft = { "kiro" } }, + }, + normal = { + { Aircraft = { "kiro" }, MaxTime = DateTime.Minutes(20) }, + { Aircraft = { "kiro", "kiro" }, MinTime = DateTime.Minutes(20) }, + }, + hard = { + { Aircraft = { "kiro" }, MaxTime = DateTime.Minutes(10) }, + { Aircraft = { "kiro", "kiro" }, MinTime = DateTime.Minutes(10), MaxTime = DateTime.Minutes(20) }, + { Aircraft = { "kiro", "kiro", "kiro" }, MinTime = DateTime.Minutes(20), MaxTime = DateTime.Minutes(30) }, + { Aircraft = { "kiro", "kiro", "kiro", "kiro" }, MinTime = DateTime.Minutes(30) } + }, + vhard = { + { Aircraft = { "kiro" }, MaxTime = DateTime.Minutes(8) }, + { Aircraft = { "kiro", "kiro" }, MinTime = DateTime.Minutes(8), MaxTime = DateTime.Minutes(18) }, + { Aircraft = { "kiro", "kiro", "kiro" }, MinTime = DateTime.Minutes(18), MaxTime = DateTime.Minutes(28) }, + { Aircraft = { "kiro", "kiro", "kiro", "kiro" }, MinTime = DateTime.Minutes(28) } + }, + brutal = { + { Aircraft = { "kiro", "kiro" }, MaxTime = DateTime.Minutes(6) }, + { Aircraft = { "kiro", "kiro", "kiro" }, MinTime = DateTime.Minutes(6), MaxTime = DateTime.Minutes(16) }, + { Aircraft = { "kiro", "kiro", "kiro", "kiro" }, MinTime = DateTime.Minutes(16), MaxTime = DateTime.Minutes(26) }, + { Aircraft = { "kiro", "kiro", "kiro", "kiro", "kiro", "kiro" }, MinTime = DateTime.Minutes(26) } + }, + }, + AttackPaths = { + { KirovPath1_1.Location, KirovPath1_2.Location, KirovPath1_3.Location, KirovPath1_4.Location }, + { KirovPath2_1.Location, KirovPath2_2.Location, KirovPath2_3.Location }, + { AttackRally2.Location }, + }, + }, +} + +SetupPlayers = function() + GDI = Player.GetPlayer("GDI") + USSR = Player.GetPlayer("USSR") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = { GDI } + MissionEnemies = { USSR } +end + +WorldLoaded = function() + SetupPlayers() + + TimerTicks = MaxReactorFuelTime + CurrentDelivery = 1 + McvArrived = false + Camera.Position = Spy.CenterPosition + + InitObjectives(GDI) + AdjustPlayerStartingCashForDifficulty() + InitUSSR() + + if Difficulty == "brutal" then + Trigger.AfterDelay(DateTime.Minutes(8), function() + Actor.Create("ai.superweapons.enabled", true, { Owner = USSR }) + end) + end + + ObjectiveCaptureOrDestroyBunker = GDI.AddObjective("Capture or destroy Stalin's bunker.") + ObjectiveStarveAtomicReactor = GDI.AddSecondaryObjective("Cut supply lines to starve atomic reactor of fuel.") + ObjectiveDestroyTeslaReactors = GDI.AddSecondaryObjective("Destroy Tesla reactors on southeastern island.") + + Trigger.OnKilledOrCaptured(StalinHQ, function() + GDI.MarkCompletedObjective(ObjectiveCaptureOrDestroyBunker) + end) + + Trigger.OnKilledOrCaptured(AtomicReactor, function() + ReactorStarved() + end) + + Trigger.OnAllKilledOrCaptured(TeslaReactors, function() + TeslaReactorsOffline() + end) + + Trigger.AfterDelay(DateTime.Minutes(2), function() + DoDelivery() + end) + + Trigger.AfterDelay(DateTime.Seconds(13), function() + PlaySpeechNotificationToMissionPlayers("ReinforcementsArrived") + Notification("Reinforcements have arrived.") + DoMcvArrival() + McvArrived = true + end) + + local revealPoints = { SupplyReveal1, SupplyReveal2, SupplyReveal3 } + Utils.Do(revealPoints, function(p) + Trigger.OnEnteredProximityTrigger(p.CenterPosition, WDist.New(12 * 1024), function(a, id) + if IsMissionPlayer(a.Owner) and a.Type ~= "camera" then + Trigger.RemoveProximityTrigger(id) + local camera = Actor.Create("camera", true, { Owner = GDI, Location = p.Location }) + Notification("Fuel supply route identified.") + Beacon.New(GDI, p.CenterPosition) + Trigger.AfterDelay(DateTime.Seconds(4), function() + camera.Destroy() + end) + end + end) + end) + + Spy.DisguiseAs(SpyDisguiseTarget) + Trigger.AfterDelay(DateTime.Seconds(4), function() + Beacon.New(GDI, Spy.CenterPosition) + Media.DisplayMessage("It feels like they're getting suspicious, I'm getting out of here...", "Allied Spy", HSLColor.FromHex("1E90FF")) + MediaCA.PlaySound(MissionDir .. "/suspicious.aud", 2) + Spy.Move(SouthDelivery3.Location) + SpyKiller.Attack(Spy) + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(12)), function() + Media.DisplayMessage("Attention you capitalist dogs! My defenses are impenetrable. Leave at once, or prepare to be crushed!", "Stalin", HSLColor.FromHex("DD0000")) + MediaCA.PlaySound(MissionDir .. "/stalin_warning.aud", 2) + end) + end) + + AfterWorldLoaded() +end + +Tick = function() + OncePerSecondChecks() + OncePerFiveSecondChecks() + OncePerThirtySecondChecks() + PanToStart() + AfterTick() +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + USSR.Resources = USSR.ResourceCapacity - 500 + + if TimerTicks > 0 then + if TimerTicks > 25 then + TimerTicks = TimerTicks - 25 + else + TimerTicks = 0 + ReactorStarved() + end + end + + UpdateObjectiveText() + + if MissionPlayersHaveNoRequiredUnits() then + GDI.MarkFailedObjective(ObjectiveCaptureOrDestroyBunker) + end + end +end + +OncePerFiveSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 125 == 0 then + UpdatePlayerBaseLocations() + end +end + +OncePerThirtySecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % DateTime.Seconds(30) == 0 then + CalculatePlayerCharacteristics() + end +end + +InitUSSR = function() + RebuildExcludes.USSR = { Types = { "tpwr", "tsla", "sam", "npwr" } } + + AutoRepairAndRebuildBuildings(USSR, 15) + SetupRefAndSilosCaptureCredits(USSR) + AutoReplaceHarvesters(USSR) + AutoRebuildConyards(USSR) + InitAiUpgrades(USSR) + InitAttackSquad(Squads.Main, USSR) + InitAirAttackSquad(Squads.AirAntiLight, USSR, MissionPlayers, { "Light", "Infantry" }, "ArmorType") + InitAirAttackSquad(Squads.AirAntiHeavy, USSR, MissionPlayers, { "Heavy" }, "ArmorType") + InitAirAttackSquad(Squads.AirAntiAir, USSR, MissionPlayers, { "Aircraft" }, "ArmorType") + InitAttackSquad(Squads.Kirovs, USSR) + + Actor.Create("ai.unlimited.power", true, { Owner = USSR }) + + local ussrGroundAttackers = USSR.GetGroundAttackers() + + Utils.Do(ussrGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsUSSRGroundHunterUnit) + end) + + Utils.Do(InnerTeslas, function(a) + if not a.IsDead then + a.GrantCondition("invulnerability") + end + end) + + Trigger.AfterDelay(ParabombsEnabledDelay[Difficulty], function() + if not MainAirfield.IsDead then + MainAirfield.GrantCondition("parabombs-enabled") + end + end) + + Trigger.AfterDelay(ParatroopersEnabledDelay[Difficulty], function() + if not SovietRadar.IsDead then + SovietRadar.GrantCondition("paratroopers-enabled") + end + end) + + Trigger.OnEnteredFootprint({ReactorDeliveryPoint1.Location, ReactorDeliveryPoint2.Location, ReactorDeliveryPoint3.Location, ReactorDeliveryPoint4.Location }, function(a, id) + if a.Owner == USSR and a.Type == "utrk" then + a.Destroy() + if not GDI.IsObjectiveCompleted(ObjectiveStarveAtomicReactor) then + TimerTicks = TimerTicks + DateTime.Minutes(5) + if TimerTicks > MaxReactorFuelTime then + TimerTicks = MaxReactorFuelTime + end + Notification("A fuel shipment has reached the Soviet reactor.") + MediaCA.PlaySound(MissionDir .. "/c_fuelshipment.aud", 2) + end + end + end) +end + +DoDelivery = function() + local delivery = Deliveries[CurrentDelivery] + + local truck = Reinforcements.Reinforce(USSR, { "utrk" }, { delivery.Spawn }, 50, function(truck) + Utils.Do(delivery.Path, function(waypoint) + truck.Move(waypoint) + end) + + Trigger.OnIdle(truck, function(self) + truck.Move(delivery.Path[#delivery.Path - 1]) + truck.Move(delivery.Path[#delivery.Path]) + end) + end) + + if CurrentDelivery < #Deliveries then + CurrentDelivery = CurrentDelivery + 1 + else + CurrentDelivery = 1 + end + + Trigger.AfterDelay(DateTime.Minutes(2), function() + if not GDI.IsObjectiveCompleted(ObjectiveStarveAtomicReactor) then + DoDelivery() + end + end) +end + +ReactorStarved = function() + if not IsReactorStarved then + IsReactorStarved = true + GDI.MarkCompletedObjective(ObjectiveStarveAtomicReactor) + DisableMainPower() + + if not StalinHQ.IsDead then + StalinHQ.GrantCondition("ic-offline") + end + + if not AtomicReactor.IsDead then + AtomicReactor.GrantCondition("ic-offline") + AtomicReactor.GrantCondition("disabled") + end + + Utils.Do(InnerTeslas, function(a) + if not a.IsDead then + a.GrantCondition("ic-offline") + end + end) + + local notificationText = "Atomic Reactor shutting down." + if AreTeslaReactorsOffline then + notificationText = notificationText .. ". The Soviet base is now without power." + else + notificationText = notificationText .. ". The Telsa Reactors in the south-east continue to provide the base with power." + end + Notification(notificationText) + MediaCA.PlaySound(MissionDir .. "/c_atomicshutdown.aud", 2) + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(3)), function() + if AreTeslaReactorsOffline then + MediaCA.PlaySound(MissionDir .. "/c_sovietbasenopower.aud", 2) + else + MediaCA.PlaySound(MissionDir .. "/c_teslareactorsremain.aud", 2) + end + end) + end +end + +TeslaReactorsOffline = function() + if not AreTeslaReactorsOffline then + AreTeslaReactorsOffline = true + GDI.MarkCompletedObjective(ObjectiveDestroyTeslaReactors) + DisableMainPower() + + Utils.Do(OuterSAMs, function(a) + if not a.IsDead then + a.GrantCondition("disabled") + end + end) + + local defenses = USSR.GetActorsByTypes({ "sam", "tsla" }) + Utils.Do(defenses, function(a) + if not a.IsDead then + a.GrantCondition("buff-removed") + end + end) + + local notificationText = "Soviet secondary power is offline." + if IsReactorStarved then + notificationText = notificationText .. " The Soviet base is now without power." + else + notificationText = notificationText .. " Tesla Coils are no longer supercharged and some perimeter air defenses are down, however the Atomic Reactor continues to provide the base with power." + end + Notification(notificationText) + MediaCA.PlaySound(MissionDir .. "/c_sovietsecondarypoweroffline.aud", 2) + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(3)), function() + if IsReactorStarved then + MediaCA.PlaySound(MissionDir .. "/c_sovietbasenopower.aud", 2) + else + MediaCA.PlaySound(MissionDir .. "/c_atomicup.aud", 2) + end + end) + end +end + +UpdateObjectiveText = function() + if not GDI.IsObjectiveCompleted(ObjectiveStarveAtomicReactor) then + local percentage = math.floor(TimerTicks / MaxReactorFuelTime * 100) + UserInterface.SetMissionText("Atomic Reactor fuel level: " .. percentage .. "%", HSLColor.Yellow) + else + UserInterface.SetMissionText("Capture or destroy Stalin's bunker.", HSLColor.Yellow) + end +end + +DisableMainPower = function() + if IsReactorStarved and AreTeslaReactorsOffline then + local defenses = USSR.GetActorsByTypes({ "sam", "tsla" }) + Utils.Do(defenses, function(a) + if not a.IsDead then + a.GrantCondition("disabled") + end + end) + end +end + +PanToStart = function() + if PanToStartComplete or not McvArrived then + return + end + + local targetPos = PlayerStart.CenterPosition + PanToPos(targetPos, 1536) + + if Camera.Position.X == targetPos.X and Camera.Position.Y == targetPos.Y then + PanToStartComplete = true + end +end + +-- overridden in co-op version +DoMcvArrival = function() + Reinforcements.Reinforce(GDI, { "amcv" }, { McvSpawn.Location, PlayerStart.Location }, 75) +end \ No newline at end of file diff --git a/mods/ca/missions/main-campaign/ca26-capitulation/map.bin b/mods/ca/missions/main-campaign/ca26-capitulation/map.bin new file mode 100644 index 0000000000..6193b01e1a Binary files /dev/null and b/mods/ca/missions/main-campaign/ca26-capitulation/map.bin differ diff --git a/mods/ca/missions/main-campaign/ca26-capitulation/map.png b/mods/ca/missions/main-campaign/ca26-capitulation/map.png new file mode 100644 index 0000000000..bbc06c4606 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca26-capitulation/map.png differ diff --git a/mods/ca/missions/main-campaign/ca26-capitulation/map.yaml b/mods/ca/missions/main-campaign/ca26-capitulation/map.yaml new file mode 100644 index 0000000000..d543d07521 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca26-capitulation/map.yaml @@ -0,0 +1,3864 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 26: Capitulation + +Author: Darkademic + +Tileset: SNOW + +MapSize: 130,98 + +Bounds: 1,1,128,96 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: GDI, USSR + PlayerReference@GDI: + Name: GDI + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: gdi + LockColor: True + Color: F2CF74 + LockSpawn: True + LockTeam: True + Enemies: USSR, Creeps + PlayerReference@USSR: + Name: USSR + Bot: campaign + Faction: soviet + Color: FE1100 + Enemies: GDI, Creeps + PlayerReference@Greece: + Name: Greece + Bot: campaign + Faction: allies + Color: FE1100 + Allies: GDI + Enemies: Creeps + +Actors: + Actor10: fact + Owner: USSR + Location: 63,24 + Actor11: brik + Owner: USSR + Location: 58,26 + Actor12: brik + Owner: USSR + Location: 59,26 + Actor13: brik + Owner: USSR + Location: 60,26 + Actor14: brik + Owner: USSR + Location: 61,26 + Actor15: brik + Owner: USSR + Location: 66,26 + Actor16: brik + Owner: USSR + Location: 67,26 + Actor17: brik + Owner: USSR + Location: 68,26 + Actor18: brik + Owner: USSR + Location: 69,26 + Actor19: tsla + Owner: USSR + Location: 57,27 + Actor20: brik + Owner: USSR + Location: 58,27 + Actor21: sam + Owner: USSR + Location: 59,27 + Actor22: brik + Owner: USSR + Location: 61,27 + Actor23: brik + Owner: USSR + Location: 66,27 + Actor24: sam + Owner: USSR + Location: 67,27 + Actor25: brik + Owner: USSR + Location: 69,27 + Actor26: tsla + Owner: USSR + Location: 70,27 + MainFactory: weap + Owner: USSR + Location: 53,28 + Actor28: brik + Owner: USSR + Location: 57,28 + Actor29: brik + Owner: USSR + Location: 58,28 + Actor30: brik + Owner: USSR + Location: 59,28 + Actor31: brik + Owner: USSR + Location: 60,28 + Actor32: brik + Owner: USSR + Location: 61,28 + Actor33: brik + Owner: USSR + Location: 62,28 + Actor34: brik + Owner: USSR + Location: 63,28 + Actor35: brik + Owner: USSR + Location: 64,28 + Actor36: brik + Owner: USSR + Location: 65,28 + Actor37: brik + Owner: USSR + Location: 66,28 + Actor38: brik + Owner: USSR + Location: 67,28 + Actor39: brik + Owner: USSR + Location: 68,28 + Actor40: brik + Owner: USSR + Location: 69,28 + Actor41: brik + Owner: USSR + Location: 70,28 + Actor43: brik + Owner: USSR + Location: 57,29 + Actor44: brik + Owner: USSR + Location: 58,29 + Actor45: brik + Owner: USSR + Location: 59,29 + SovietRadar: dome + Owner: USSR + Location: 60,29 + Actor47: brik + Owner: USSR + Location: 62,29 + StalinHQ: fcom + Owner: USSR + Location: 63,29 + Actor49: brik + Owner: USSR + Location: 65,29 + Actor50: stek + Owner: USSR + Location: 66,29 + Actor51: brik + Owner: USSR + Location: 69,29 + Actor52: brik + Owner: USSR + Location: 70,29 + Actor53: brik + Owner: USSR + Location: 58,30 + Actor54: brik + Owner: USSR + Location: 59,30 + Actor55: brik + Owner: USSR + Location: 62,30 + Actor56: brik + Owner: USSR + Location: 65,30 + Actor57: brik + Owner: USSR + Location: 69,30 + Actor58: fix + Owner: USSR + Location: 71,30 + Actor59: afld + Owner: USSR + Location: 75,30 + Actor60: brik + Owner: USSR + Location: 58,31 + Actor61: brik + Owner: USSR + Location: 59,31 + Actor62: brik + Owner: USSR + Location: 62,31 + Actor63: brik + Owner: USSR + Location: 65,31 + Actor64: brik + Owner: USSR + Location: 69,31 + Actor66: brik + Owner: USSR + Location: 58,32 + Actor67: brik + Owner: USSR + Location: 59,32 + Actor68: brik + Owner: USSR + Location: 60,32 + Actor69: brik + Owner: USSR + Location: 61,32 + Actor70: brik + Owner: USSR + Location: 62,32 + Actor71: brik + Owner: USSR + Location: 65,32 + Actor72: brik + Owner: USSR + Location: 66,32 + Actor73: brik + Owner: USSR + Location: 67,32 + Actor74: brik + Owner: USSR + Location: 68,32 + Actor75: brik + Owner: USSR + Location: 69,32 + Actor80: brik + Owner: USSR + Location: 59,33 + InnerTesla1: tsla + Owner: USSR + Location: 60,33 + Actor87: brik + Owner: USSR + Location: 61,33 + Actor88: brik + Owner: USSR + Location: 62,33 + Actor89: brik + Owner: USSR + Location: 65,33 + Actor90: brik + Owner: USSR + Location: 66,33 + InnerTesla2: tsla + Owner: USSR + Location: 67,33 + Actor92: brik + Owner: USSR + Location: 68,33 + MainAirfield: afld + Owner: USSR + Location: 71,33 + Actor94: brik + Owner: USSR + Location: 58,34 + Actor95: brik + Owner: USSR + Location: 59,34 + Actor96: brik + Owner: USSR + Location: 60,34 + Actor97: brik + Owner: USSR + Location: 61,34 + Actor98: tsla + Owner: USSR + Location: 62,34 + Actor99: tsla + Owner: USSR + Location: 65,34 + Actor100: brik + Owner: USSR + Location: 66,34 + Actor101: brik + Owner: USSR + Location: 67,34 + Actor102: brik + Owner: USSR + Location: 68,34 + Actor105: brik + Owner: USSR + Location: 69,34 + Actor106: afld + Owner: USSR + Location: 75,34 + Actor107: brik + Owner: USSR + Location: 58,35 + Actor108: sam + Owner: USSR + Location: 59,35 + Actor109: brik + Owner: USSR + Location: 61,35 + Actor110: brik + Owner: USSR + Location: 66,35 + Actor111: sam + Owner: USSR + Location: 67,35 + Actor112: brik + Owner: USSR + Location: 69,35 + Actor113: brik + Owner: USSR + Location: 58,36 + Actor114: brik + Owner: USSR + Location: 59,36 + Actor115: brik + Owner: USSR + Location: 60,36 + Actor116: brik + Owner: USSR + Location: 61,36 + Actor117: brik + Owner: USSR + Location: 66,36 + Actor118: brik + Owner: USSR + Location: 67,36 + Actor119: brik + Owner: USSR + Location: 68,36 + Actor120: brik + Owner: USSR + Location: 69,36 + Actor121: ftur + Owner: USSR + Location: 61,37 + Actor122: ftur + Owner: USSR + Location: 66,37 + Actor129: brik + Owner: USSR + Location: 50,39 + Actor130: brik + Owner: USSR + Location: 49,39 + Actor131: brik + Owner: USSR + Location: 48,39 + Actor132: brik + Owner: USSR + Location: 48,40 + Actor133: brik + Owner: USSR + Location: 48,41 + Actor134: brik + Owner: USSR + Location: 49,41 + Actor150: brik + Owner: USSR + Location: 50,41 + Actor151: brik + Owner: USSR + Location: 50,40 + Actor152: brik + Owner: USSR + Location: 47,39 + Actor153: brik + Owner: USSR + Location: 46,38 + Actor154: brik + Owner: USSR + Location: 46,39 + Actor155: brik + Owner: USSR + Location: 45,38 + Actor156: brik + Owner: USSR + Location: 44,38 + Actor157: brik + Owner: USSR + Location: 46,40 + Actor158: brik + Owner: USSR + Location: 46,41 + Actor159: brik + Owner: USSR + Location: 47,41 + Actor160: brik + Owner: USSR + Location: 45,40 + Actor161: brik + Owner: USSR + Location: 44,40 + Actor162: brik + Owner: USSR + Location: 44,39 + Actor163: brik + Owner: USSR + Location: 43,38 + Actor164: brik + Owner: USSR + Location: 42,38 + Actor165: brik + Owner: USSR + Location: 42,39 + Actor166: brik + Owner: USSR + Location: 42,40 + Actor167: brik + Owner: USSR + Location: 43,40 + Actor168: brik + Owner: USSR + Location: 41,38 + Actor169: brik + Owner: USSR + Location: 40,38 + Actor170: brik + Owner: USSR + Location: 40,39 + Actor171: brik + Owner: USSR + Location: 40,40 + Actor172: brik + Owner: USSR + Location: 41,40 + Actor173: brik + Owner: USSR + Location: 39,39 + Actor174: brik + Owner: USSR + Location: 38,39 + Actor175: brik + Owner: USSR + Location: 38,40 + Actor176: brik + Owner: USSR + Location: 38,41 + Actor177: brik + Owner: USSR + Location: 39,41 + Actor178: brik + Owner: USSR + Location: 40,41 + Actor179: brik + Owner: USSR + Location: 56,44 + Actor180: brik + Owner: USSR + Location: 55,44 + Actor181: brik + Owner: USSR + Location: 54,44 + Actor182: brik + Owner: USSR + Location: 54,45 + Actor183: brik + Owner: USSR + Location: 54,46 + Actor184: brik + Owner: USSR + Location: 55,46 + Actor185: brik + Owner: USSR + Location: 56,46 + Actor186: brik + Owner: USSR + Location: 56,45 + Actor187: brik + Owner: USSR + Location: 57,46 + Actor188: brik + Owner: USSR + Location: 57,47 + Actor189: brik + Owner: USSR + Location: 55,47 + Actor190: brik + Owner: USSR + Location: 55,48 + Actor191: brik + Owner: USSR + Location: 56,48 + Actor192: brik + Owner: USSR + Location: 57,48 + Actor193: brik + Owner: USSR + Location: 58,48 + Actor194: brik + Owner: USSR + Location: 59,48 + Actor195: brik + Owner: USSR + Location: 59,49 + Actor196: brik + Owner: USSR + Location: 59,50 + Actor197: brik + Owner: USSR + Location: 57,49 + Actor198: brik + Owner: USSR + Location: 57,50 + Actor199: brik + Owner: USSR + Location: 58,50 + Actor200: brik + Owner: USSR + Location: 59,51 + Actor201: brik + Owner: USSR + Location: 59,52 + Actor202: brik + Owner: USSR + Location: 58,52 + Actor203: brik + Owner: USSR + Location: 57,52 + Actor204: brik + Owner: USSR + Location: 57,51 + Actor205: brik + Owner: USSR + Location: 70,44 + Actor206: brik + Owner: USSR + Location: 70,45 + Actor207: brik + Owner: USSR + Location: 70,46 + Actor208: brik + Owner: USSR + Location: 70,47 + Actor209: brik + Owner: USSR + Location: 70,48 + Actor210: brik + Owner: USSR + Location: 70,49 + Actor211: brik + Owner: USSR + Location: 70,50 + Actor212: brik + Owner: USSR + Location: 70,51 + Actor213: brik + Owner: USSR + Location: 71,44 + Actor214: brik + Owner: USSR + Location: 72,44 + Actor215: brik + Owner: USSR + Location: 71,46 + Actor216: brik + Owner: USSR + Location: 72,46 + Actor217: brik + Owner: USSR + Location: 72,45 + Actor218: brik + Owner: USSR + Location: 72,47 + Actor219: brik + Owner: USSR + Location: 72,48 + Actor220: brik + Owner: USSR + Location: 72,48 + Actor221: brik + Owner: USSR + Location: 71,48 + Actor222: brik + Owner: USSR + Location: 71,50 + Actor223: brik + Owner: USSR + Location: 72,50 + Actor224: brik + Owner: USSR + Location: 72,49 + Actor225: brik + Owner: USSR + Location: 72,51 + Actor226: brik + Owner: USSR + Location: 72,52 + Actor227: brik + Owner: USSR + Location: 70,52 + Actor228: brik + Owner: USSR + Location: 71,52 + Actor229: brik + Owner: USSR + Location: 85,39 + Actor230: brik + Owner: USSR + Location: 85,40 + Actor231: brik + Owner: USSR + Location: 85,41 + Actor232: brik + Owner: USSR + Location: 86,41 + Actor233: brik + Owner: USSR + Location: 87,41 + Actor234: brik + Owner: USSR + Location: 87,40 + Actor235: brik + Owner: USSR + Location: 86,39 + Actor236: brik + Owner: USSR + Location: 87,39 + Actor237: brik + Owner: USSR + Location: 88,39 + Actor238: brik + Owner: USSR + Location: 89,39 + Actor239: brik + Owner: USSR + Location: 89,40 + Actor240: brik + Owner: USSR + Location: 89,41 + Actor241: brik + Owner: USSR + Location: 88,41 + Actor242: brik + Owner: USSR + Location: 90,40 + Actor243: brik + Owner: USSR + Location: 90,40 + Actor244: brik + Owner: USSR + Location: 90,42 + Actor245: brik + Owner: USSR + Location: 89,42 + Actor246: brik + Owner: USSR + Location: 91,40 + Actor247: brik + Owner: USSR + Location: 91,41 + Actor248: brik + Owner: USSR + Location: 91,42 + Actor249: brik + Owner: USSR + Location: 92,42 + Actor250: brik + Owner: USSR + Location: 93,42 + Actor251: brik + Owner: USSR + Location: 93,41 + Actor252: brik + Owner: USSR + Location: 93,40 + Actor253: brik + Owner: USSR + Location: 92,40 + Actor254: brik + Owner: USSR + Location: 94,40 + Actor255: brik + Owner: USSR + Location: 95,40 + Actor256: brik + Owner: USSR + Location: 95,41 + Actor257: brik + Owner: USSR + Location: 95,41 + Actor258: brik + Owner: USSR + Location: 95,42 + Actor259: brik + Owner: USSR + Location: 94,42 + Actor260: brik + Owner: USSR + Location: 94,42 + Actor261: brik + Owner: USSR + Location: 83,29 + Actor262: brik + Owner: USSR + Location: 83,28 + Actor263: brik + Owner: USSR + Location: 83,27 + Actor264: brik + Owner: USSR + Location: 84,29 + Actor265: brik + Owner: USSR + Location: 85,29 + Actor266: brik + Owner: USSR + Location: 85,28 + Actor267: brik + Owner: USSR + Location: 85,27 + Actor268: brik + Owner: USSR + Location: 84,27 + Actor269: brik + Owner: USSR + Location: 85,30 + Actor270: brik + Owner: USSR + Location: 86,30 + Actor271: brik + Owner: USSR + Location: 87,30 + Actor272: brik + Owner: USSR + Location: 86,28 + Actor273: brik + Owner: USSR + Location: 87,28 + Actor274: brik + Owner: USSR + Location: 87,29 + Actor275: brik + Owner: USSR + Location: 88,30 + Actor276: brik + Owner: USSR + Location: 89,30 + Actor277: brik + Owner: USSR + Location: 89,29 + Actor278: brik + Owner: USSR + Location: 89,28 + Actor279: brik + Owner: USSR + Location: 88,28 + Actor280: brik + Owner: USSR + Location: 90,30 + Actor281: brik + Owner: USSR + Location: 91,30 + Actor282: brik + Owner: USSR + Location: 90,28 + Actor283: brik + Owner: USSR + Location: 91,28 + Actor284: brik + Owner: USSR + Location: 91,29 + Actor285: brik + Owner: USSR + Location: 91,31 + Actor286: brik + Owner: USSR + Location: 92,31 + Actor287: brik + Owner: USSR + Location: 93,31 + Actor288: brik + Owner: USSR + Location: 92,29 + Actor289: brik + Owner: USSR + Location: 93,29 + Actor290: brik + Owner: USSR + Location: 93,30 + Actor291: brik + Owner: USSR + Location: 94,31 + Actor292: brik + Owner: USSR + Location: 95,31 + Actor293: brik + Owner: USSR + Location: 95,30 + Actor294: brik + Owner: USSR + Location: 95,29 + Actor295: brik + Owner: USSR + Location: 94,29 + Actor296: tsla + Owner: USSR + Location: 94,30 + Actor297: tsla + Owner: USSR + Location: 92,30 + Actor298: tsla + Owner: USSR + Location: 90,29 + Actor299: tsla + Owner: USSR + Location: 88,29 + Actor300: tsla + Owner: USSR + Location: 86,29 + Actor301: tsla + Owner: USSR + Location: 84,28 + Actor302: tsla + Owner: USSR + Location: 86,40 + Actor303: tsla + Owner: USSR + Location: 88,40 + Actor304: tsla + Owner: USSR + Location: 90,41 + Actor305: tsla + Owner: USSR + Location: 92,41 + Actor306: tsla + Owner: USSR + Location: 94,41 + Actor307: tsla + Owner: USSR + Location: 55,45 + Actor308: tsla + Owner: USSR + Location: 56,47 + Actor309: tsla + Owner: USSR + Location: 58,49 + Actor310: tsla + Owner: USSR + Location: 58,51 + Actor311: tsla + Owner: USSR + Location: 71,51 + Actor312: tsla + Owner: USSR + Location: 71,49 + Actor313: tsla + Owner: USSR + Location: 71,45 + Actor314: tsla + Owner: USSR + Location: 71,47 + Actor315: tsla + Owner: USSR + Location: 39,40 + Actor316: tsla + Owner: USSR + Location: 41,39 + Actor317: tsla + Owner: USSR + Location: 43,39 + Actor318: tsla + Owner: USSR + Location: 45,39 + Actor319: tsla + Owner: USSR + Location: 47,40 + Actor320: tsla + Owner: USSR + Location: 49,40 + Actor321: brik + Owner: USSR + Location: 47,28 + Actor322: brik + Owner: USSR + Location: 46,28 + Actor323: brik + Owner: USSR + Location: 45,28 + Actor324: brik + Owner: USSR + Location: 45,27 + Actor325: brik + Owner: USSR + Location: 45,26 + Actor326: brik + Owner: USSR + Location: 46,26 + Actor327: brik + Owner: USSR + Location: 47,26 + Actor328: brik + Owner: USSR + Location: 47,27 + Actor329: brik + Owner: USSR + Location: 44,28 + Actor330: brik + Owner: USSR + Location: 43,28 + Actor331: brik + Owner: USSR + Location: 43,27 + Actor332: brik + Owner: USSR + Location: 43,26 + Actor333: brik + Owner: USSR + Location: 44,26 + Actor334: brik + Owner: USSR + Location: 43,29 + Actor335: brik + Owner: USSR + Location: 42,29 + Actor336: brik + Owner: USSR + Location: 41,29 + Actor337: brik + Owner: USSR + Location: 41,28 + Actor338: brik + Owner: USSR + Location: 41,27 + Actor339: brik + Owner: USSR + Location: 42,27 + Actor340: brik + Owner: USSR + Location: 40,29 + Actor341: brik + Owner: USSR + Location: 39,29 + Actor342: brik + Owner: USSR + Location: 39,28 + Actor343: brik + Owner: USSR + Location: 39,27 + Actor344: brik + Owner: USSR + Location: 40,27 + Actor345: brik + Owner: USSR + Location: 38,27 + Actor346: brik + Owner: USSR + Location: 37,27 + Actor347: brik + Owner: USSR + Location: 37,28 + Actor348: brik + Owner: USSR + Location: 37,29 + Actor349: brik + Owner: USSR + Location: 38,29 + Actor350: tsla + Owner: USSR + Location: 46,27 + Actor351: tsla + Owner: USSR + Location: 44,27 + Actor352: tsla + Owner: USSR + Location: 42,28 + Actor353: tsla + Owner: USSR + Location: 40,28 + Actor354: tsla + Owner: USSR + Location: 38,28 + Actor355: tsla + Owner: USSR + Location: 58,53 + Actor356: tsla + Owner: USSR + Location: 71,53 + Actor357: brik + Owner: USSR + Location: 57,53 + Actor358: brik + Owner: USSR + Location: 57,54 + Actor359: brik + Owner: USSR + Location: 59,54 + Actor360: brik + Owner: USSR + Location: 58,54 + Actor361: brik + Owner: USSR + Location: 59,53 + Actor362: brik + Owner: USSR + Location: 70,53 + Actor363: brik + Owner: USSR + Location: 70,54 + Actor364: brik + Owner: USSR + Location: 71,54 + Actor365: brik + Owner: USSR + Location: 72,54 + Actor366: brik + Owner: USSR + Location: 72,53 + OuterSAM14: sam + Owner: USSR + Location: 73,47 + OuterSAM11: sam + Owner: USSR + Location: 73,53 + OuterSAM12: sam + Owner: USSR + Location: 73,51 + OuterSAM13: sam + Owner: USSR + Location: 73,49 + OuterSAM15: sam + Owner: USSR + Location: 73,45 + OuterSAM16: sam + Owner: USSR + Location: 85,42 + OuterSAM17: sam + Owner: USSR + Location: 87,42 + OuterSAM18: sam + Owner: USSR + Location: 88,43 + OuterSAM19: sam + Owner: USSR + Location: 90,43 + OuterSAM20: sam + Owner: USSR + Location: 92,43 + OuterSAM30: sam + Owner: USSR + Location: 92,28 + OuterSAM29: sam + Owner: USSR + Location: 90,27 + OuterSAM28: sam + Owner: USSR + Location: 88,27 + OuterSAM27: sam + Owner: USSR + Location: 86,27 + OuterSAM26: sam + Owner: USSR + Location: 84,26 + OuterSAM25: sam + Owner: USSR + Location: 45,25 + OuterSAM24: sam + Owner: USSR + Location: 43,25 + OuterSAM23: sam + Owner: USSR + Location: 41,26 + OuterSAM22: sam + Owner: USSR + Location: 39,26 + OuterSAM21: sam + Owner: USSR + Location: 37,26 + OuterSAM1: sam + Owner: USSR + Location: 39,42 + OuterSAM2: sam + Owner: USSR + Location: 41,41 + OuterSAM3: sam + Owner: USSR + Location: 44,41 + OuterSAM4: sam + Owner: USSR + Location: 47,42 + OuterSAM5: sam + Owner: USSR + Location: 49,42 + OuterSAM6: sam + Owner: USSR + Location: 52,44 + OuterSAM7: sam + Owner: USSR + Location: 53,47 + OuterSAM8: sam + Owner: USSR + Location: 55,49 + OuterSAM9: sam + Owner: USSR + Location: 55,51 + OuterSAM10: sam + Owner: USSR + Location: 55,53 + Actor397: fenc + Owner: USSR + Location: 41,42 + Actor398: fenc + Owner: USSR + Location: 41,43 + Actor399: fenc + Owner: USSR + Location: 40,43 + Actor400: fenc + Owner: USSR + Location: 39,43 + Actor401: fenc + Owner: USSR + Location: 38,43 + Actor402: fenc + Owner: USSR + Location: 38,42 + Actor403: fenc + Owner: USSR + Location: 37,42 + Actor404: fenc + Owner: USSR + Location: 37,41 + Actor405: fenc + Owner: USSR + Location: 42,42 + Actor406: fenc + Owner: USSR + Location: 43,42 + Actor407: fenc + Owner: USSR + Location: 43,41 + Actor408: fenc + Owner: USSR + Location: 44,42 + Actor409: fenc + Owner: USSR + Location: 45,42 + Actor410: fenc + Owner: USSR + Location: 46,42 + Actor411: fenc + Owner: USSR + Location: 46,43 + Actor412: fenc + Owner: USSR + Location: 47,43 + Actor413: fenc + Owner: USSR + Location: 48,43 + Actor414: fenc + Owner: USSR + Location: 49,43 + Actor415: fenc + Owner: USSR + Location: 50,43 + Actor416: fenc + Owner: USSR + Location: 51,43 + Actor417: fenc + Owner: USSR + Location: 51,42 + Actor418: fenc + Owner: USSR + Location: 51,41 + Actor419: fenc + Owner: USSR + Location: 51,40 + Actor420: fenc + Owner: USSR + Location: 37,40 + Actor421: fenc + Owner: USSR + Location: 37,39 + Actor422: fenc + Owner: USSR + Location: 52,42 + Actor423: fenc + Owner: USSR + Location: 52,43 + Actor424: fenc + Owner: USSR + Location: 51,44 + Actor425: fenc + Owner: USSR + Location: 51,45 + Actor426: fenc + Owner: USSR + Location: 52,45 + Actor427: fenc + Owner: USSR + Location: 53,45 + Actor428: fenc + Owner: USSR + Location: 53,46 + Actor429: fenc + Owner: USSR + Location: 52,46 + Actor430: fenc + Owner: USSR + Location: 52,47 + Actor431: fenc + Owner: USSR + Location: 52,48 + Actor432: fenc + Owner: USSR + Location: 53,48 + Actor433: fenc + Owner: USSR + Location: 54,48 + Actor434: fenc + Owner: USSR + Location: 54,49 + Actor435: fenc + Owner: USSR + Location: 54,50 + Actor436: fenc + Owner: USSR + Location: 56,50 + Actor437: fenc + Owner: USSR + Location: 55,50 + Actor438: fenc + Owner: USSR + Location: 54,51 + Actor439: fenc + Owner: USSR + Location: 54,52 + Actor440: fenc + Owner: USSR + Location: 55,52 + Actor441: fenc + Owner: USSR + Location: 56,52 + Actor442: fenc + Owner: USSR + Location: 56,54 + Actor443: fenc + Owner: USSR + Location: 55,54 + Actor444: fenc + Owner: USSR + Location: 54,54 + Actor445: fenc + Owner: USSR + Location: 54,53 + Actor446: fenc + Owner: USSR + Location: 73,54 + Actor447: fenc + Owner: USSR + Location: 74,54 + Actor448: fenc + Owner: USSR + Location: 75,54 + Actor449: fenc + Owner: USSR + Location: 75,53 + Actor450: fenc + Owner: USSR + Location: 74,52 + Actor451: fenc + Owner: USSR + Location: 73,52 + Actor452: fenc + Owner: USSR + Location: 75,52 + Actor453: fenc + Owner: USSR + Location: 73,50 + Actor454: fenc + Owner: USSR + Location: 74,50 + Actor455: fenc + Owner: USSR + Location: 75,50 + Actor456: fenc + Owner: USSR + Location: 75,51 + Actor457: fenc + Owner: USSR + Location: 75,49 + Actor458: fenc + Owner: USSR + Location: 75,48 + Actor459: fenc + Owner: USSR + Location: 74,48 + Actor460: fenc + Owner: USSR + Location: 73,48 + Actor461: fenc + Owner: USSR + Location: 73,46 + Actor462: fenc + Owner: USSR + Location: 75,46 + Actor463: fenc + Owner: USSR + Location: 74,46 + Actor464: fenc + Owner: USSR + Location: 75,47 + Actor465: fenc + Owner: USSR + Location: 75,45 + Actor466: fenc + Owner: USSR + Location: 74,44 + Actor467: fenc + Owner: USSR + Location: 73,44 + Actor468: fenc + Owner: USSR + Location: 75,44 + Actor469: fenc + Owner: USSR + Location: 84,41 + Actor470: fenc + Owner: USSR + Location: 84,42 + Actor471: fenc + Owner: USSR + Location: 84,43 + Actor472: fenc + Owner: USSR + Location: 86,43 + Actor473: fenc + Owner: USSR + Location: 87,43 + Actor474: fenc + Owner: USSR + Location: 85,43 + Actor475: fenc + Owner: USSR + Location: 87,44 + Actor476: fenc + Owner: USSR + Location: 89,44 + Actor477: fenc + Owner: USSR + Location: 88,44 + Actor478: fenc + Owner: USSR + Location: 90,44 + Actor479: fenc + Owner: USSR + Location: 91,44 + Actor480: fenc + Owner: USSR + Location: 93,44 + Actor481: fenc + Owner: USSR + Location: 92,44 + Actor482: fenc + Owner: USSR + Location: 94,44 + Actor483: fenc + Owner: USSR + Location: 94,43 + Actor484: fenc + Owner: USSR + Location: 83,26 + Actor485: fenc + Owner: USSR + Location: 83,25 + Actor486: fenc + Owner: USSR + Location: 84,25 + Actor487: fenc + Owner: USSR + Location: 85,25 + Actor488: fenc + Owner: USSR + Location: 86,25 + Actor489: fenc + Owner: USSR + Location: 86,26 + Actor490: fenc + Owner: USSR + Location: 87,26 + Actor491: fenc + Owner: USSR + Location: 88,26 + Actor492: fenc + Owner: USSR + Location: 89,26 + Actor493: fenc + Owner: USSR + Location: 90,26 + Actor494: fenc + Owner: USSR + Location: 91,26 + Actor495: fenc + Owner: USSR + Location: 92,26 + Actor496: fenc + Owner: USSR + Location: 92,27 + Actor497: fenc + Owner: USSR + Location: 93,27 + Actor498: fenc + Owner: USSR + Location: 94,27 + Actor499: fenc + Owner: USSR + Location: 94,28 + Actor500: fenc + Owner: USSR + Location: 36,27 + Actor501: fenc + Owner: USSR + Location: 36,26 + Actor502: fenc + Owner: USSR + Location: 36,25 + Actor503: fenc + Owner: USSR + Location: 38,25 + Actor504: fenc + Owner: USSR + Location: 37,25 + Actor505: fenc + Owner: USSR + Location: 39,25 + Actor506: fenc + Owner: USSR + Location: 40,25 + Actor507: fenc + Owner: USSR + Location: 41,25 + Actor508: fenc + Owner: USSR + Location: 42,25 + Actor509: fenc + Owner: USSR + Location: 42,24 + Actor510: fenc + Owner: USSR + Location: 43,24 + Actor511: fenc + Owner: USSR + Location: 44,24 + Actor512: fenc + Owner: USSR + Location: 46,24 + Actor513: fenc + Owner: USSR + Location: 45,24 + Actor514: fenc + Owner: USSR + Location: 47,24 + Actor515: fenc + Owner: USSR + Location: 47,25 + InnerTesla3: tsla + Owner: USSR + Location: 61,25 + InnerTesla4: tsla + Owner: USSR + Location: 66,25 + Actor518: tsla + Owner: USSR + Location: 63,22 + Actor519: tsla + Owner: USSR + Location: 64,22 + Actor520: tsla + Owner: USSR + Location: 63,41 + Actor521: tsla + Owner: USSR + Location: 64,41 + Actor522: brik + Owner: USSR + Location: 63,42 + Actor523: brik + Owner: USSR + Location: 64,42 + Actor524: brik + Owner: USSR + Location: 65,42 + Actor525: brik + Owner: USSR + Location: 65,41 + Actor526: brik + Owner: USSR + Location: 65,40 + Actor527: brik + Owner: USSR + Location: 64,40 + Actor528: brik + Owner: USSR + Location: 62,40 + Actor529: brik + Owner: USSR + Location: 63,40 + Actor530: brik + Owner: USSR + Location: 62,41 + Actor531: brik + Owner: USSR + Location: 62,42 + Actor532: tsla + Owner: USSR + Location: 49,34 + Actor533: tsla + Owner: USSR + Location: 49,33 + Actor534: brik + Owner: USSR + Location: 79,33 + Actor535: brik + Owner: USSR + Location: 80,33 + Actor536: brik + Owner: USSR + Location: 81,33 + Actor537: brik + Owner: USSR + Location: 79,34 + Actor542: tsla + Owner: USSR + Location: 80,34 + Actor543: brik + Owner: USSR + Location: 81,34 + Actor544: brik + Owner: USSR + Location: 79,35 + Actor545: tsla + Owner: USSR + Location: 80,35 + Actor546: brik + Owner: USSR + Location: 81,35 + Actor547: brik + Owner: USSR + Location: 79,36 + Actor548: brik + Owner: USSR + Location: 80,36 + Actor549: brik + Owner: USSR + Location: 81,36 + Actor538: brik + Owner: USSR + Location: 49,35 + Actor539: brik + Owner: USSR + Location: 48,35 + Actor540: brik + Owner: USSR + Location: 48,34 + Actor541: brik + Owner: USSR + Location: 48,33 + Actor550: brik + Owner: USSR + Location: 48,32 + Actor551: brik + Owner: USSR + Location: 49,32 + Actor552: brik + Owner: USSR + Location: 50,32 + Actor553: brik + Owner: USSR + Location: 50,33 + Actor554: brik + Owner: USSR + Location: 50,34 + Actor555: brik + Owner: USSR + Location: 50,35 + Actor556: brik + Owner: USSR + Location: 63,23 + Actor557: brik + Owner: USSR + Location: 64,23 + Actor558: brik + Owner: USSR + Location: 65,23 + Actor559: brik + Owner: USSR + Location: 65,22 + Actor560: brik + Owner: USSR + Location: 65,21 + Actor561: brik + Owner: USSR + Location: 63,21 + Actor562: brik + Owner: USSR + Location: 64,21 + Actor563: brik + Owner: USSR + Location: 62,21 + Actor564: brik + Owner: USSR + Location: 62,22 + Actor565: brik + Owner: USSR + Location: 62,23 + Actor566: brik + Owner: USSR + Location: 60,25 + Actor567: brik + Owner: USSR + Location: 60,24 + Actor568: brik + Owner: USSR + Location: 61,24 + Actor569: brik + Owner: USSR + Location: 62,24 + Actor570: brik + Owner: USSR + Location: 66,23 + Actor571: brik + Owner: USSR + Location: 66,24 + Actor572: brik + Owner: USSR + Location: 67,24 + Actor573: brik + Owner: USSR + Location: 67,25 + Actor574: brik + Owner: USSR + Location: 61,23 + Actor575: brik + Owner: USSR + Location: 67,23 + Actor576: brik + Owner: USSR + Location: 60,23 + Actor577: ftur + Owner: USSR + Location: 47,33 + Actor578: ftur + Owner: USSR + Location: 47,34 + Actor579: ftur + Owner: USSR + Location: 82,35 + Actor580: ftur + Owner: USSR + Location: 82,34 + Actor581: ftur + Owner: USSR + Location: 63,43 + Actor582: ftur + Owner: USSR + Location: 64,43 + Actor584: afld + Owner: USSR + Location: 73,36 + MainBarracks2: barr + Owner: USSR + Location: 55,39 + Actor587: silo + Owner: USSR + Location: 55,20 + Actor588: silo + Owner: USSR + Location: 56,20 + Actor589: silo + Owner: USSR + Location: 55,21 + Actor590: silo + Owner: USSR + Location: 56,21 + Actor595: silo + Owner: USSR + Location: 79,24 + Actor596: silo + Owner: USSR + Location: 78,24 + Actor597: silo + Owner: USSR + Location: 78,25 + Actor598: silo + Owner: USSR + Location: 79,25 + Actor599: silo + Owner: USSR + Location: 67,20 + Actor600: silo + Owner: USSR + Location: 68,20 + Actor601: silo + Owner: USSR + Location: 67,21 + Actor602: silo + Owner: USSR + Location: 68,21 + Actor603: sam + Owner: USSR + Location: 71,19 + Actor604: sam + Owner: USSR + Location: 58,19 + Actor605: sam + Owner: USSR + Location: 52,24 + Actor606: sam + Owner: USSR + Location: 75,23 + Actor607: sam + Owner: USSR + Location: 79,28 + Actor608: sam + Owner: USSR + Location: 50,27 + Actor609: sam + Owner: USSR + Location: 58,41 + Actor610: sam + Owner: USSR + Location: 74,40 + Actor611: sam + Owner: USSR + Location: 78,39 + Actor612: sam + Owner: USSR + Location: 52,37 + TPower8: tpwr + Owner: USSR + Location: 116,85 + TPower5: tpwr + Owner: USSR + Location: 116,82 + TPower2: tpwr + Owner: USSR + Location: 116,79 + TPower3: tpwr + Owner: USSR + Location: 119,79 + TPower6: tpwr + Owner: USSR + Location: 119,82 + TPower9: tpwr + Owner: USSR + Location: 119,85 + TPower7: tpwr + Owner: USSR + Location: 113,85 + TPower4: tpwr + Owner: USSR + Location: 113,82 + TPower1: tpwr + Owner: USSR + Location: 113,79 + Actor622: brik + Owner: USSR + Location: 112,78 + Actor623: brik + Owner: USSR + Location: 112,79 + Actor624: brik + Owner: USSR + Location: 112,80 + Actor625: brik + Owner: USSR + Location: 112,81 + Actor626: brik + Owner: USSR + Location: 112,82 + Actor627: brik + Owner: USSR + Location: 112,83 + Actor628: brik + Owner: USSR + Location: 112,84 + Actor629: brik + Owner: USSR + Location: 112,85 + Actor630: brik + Owner: USSR + Location: 112,86 + Actor631: brik + Owner: USSR + Location: 112,87 + Actor632: brik + Owner: USSR + Location: 112,88 + Actor633: brik + Owner: USSR + Location: 113,88 + Actor634: brik + Owner: USSR + Location: 114,88 + Actor635: brik + Owner: USSR + Location: 115,88 + Actor636: brik + Owner: USSR + Location: 116,88 + Actor637: brik + Owner: USSR + Location: 117,88 + Actor638: brik + Owner: USSR + Location: 119,88 + Actor639: brik + Owner: USSR + Location: 118,88 + Actor640: brik + Owner: USSR + Location: 120,88 + Actor641: brik + Owner: USSR + Location: 121,88 + Actor642: brik + Owner: USSR + Location: 122,88 + Actor643: brik + Owner: USSR + Location: 122,87 + Actor644: brik + Owner: USSR + Location: 122,86 + Actor645: brik + Owner: USSR + Location: 122,84 + Actor646: brik + Owner: USSR + Location: 122,85 + Actor647: brik + Owner: USSR + Location: 122,83 + Actor648: brik + Owner: USSR + Location: 122,82 + Actor649: brik + Owner: USSR + Location: 122,81 + Actor650: brik + Owner: USSR + Location: 122,80 + Actor651: brik + Owner: USSR + Location: 122,79 + Actor652: brik + Owner: USSR + Location: 122,78 + Actor653: brik + Owner: USSR + Location: 121,78 + Actor654: brik + Owner: USSR + Location: 119,78 + Actor655: brik + Owner: USSR + Location: 120,78 + Actor656: brik + Owner: USSR + Location: 118,78 + Actor657: brik + Owner: USSR + Location: 117,78 + Actor658: brik + Owner: USSR + Location: 116,78 + Actor659: brik + Owner: USSR + Location: 115,78 + Actor660: brik + Owner: USSR + Location: 114,78 + Actor661: brik + Owner: USSR + Location: 113,78 + AtomicReactor: npwr + Owner: USSR + Location: 72,26 + Actor663: powr + Owner: USSR + Location: 68,23 + Actor664: powr + Owner: USSR + Location: 58,23 + OuterSAM36: sam + Owner: USSR + Location: 109,88 + OuterSAM37: sam + Owner: USSR + Location: 108,83 + OuterSAM31: sam + Owner: USSR + Location: 112,76 + OuterSAM35: sam + Owner: USSR + Location: 116,90 + OuterSAM33: sam + Owner: USSR + Location: 124,79 + OuterSAM34: sam + Owner: USSR + Location: 123,85 + OuterSAM32: sam + Owner: USSR + Location: 118,77 + Actor672: fenc + Owner: USSR + Location: 111,81 + Actor673: fenc + Owner: USSR + Location: 111,82 + Actor674: fenc + Owner: USSR + Location: 111,83 + Actor675: fenc + Owner: USSR + Location: 111,84 + Actor676: fenc + Owner: USSR + Location: 108,84 + Actor677: fenc + Owner: USSR + Location: 108,85 + Actor678: fenc + Owner: USSR + Location: 108,86 + Actor679: fenc + Owner: USSR + Location: 115,90 + Actor680: fenc + Owner: USSR + Location: 115,89 + Actor681: fenc + Owner: USSR + Location: 116,89 + Actor682: fenc + Owner: USSR + Location: 117,89 + Actor683: fenc + Owner: USSR + Location: 118,89 + Actor684: fenc + Owner: USSR + Location: 118,90 + Actor685: fenc + Owner: USSR + Location: 124,78 + Actor686: fenc + Owner: USSR + Location: 123,78 + Actor687: fenc + Owner: USSR + Location: 123,79 + Actor688: fenc + Owner: USSR + Location: 123,80 + Actor689: fenc + Owner: USSR + Location: 124,80 + Actor690: fenc + Owner: USSR + Location: 124,81 + Actor691: fenc + Owner: USSR + Location: 124,82 + Actor692: fenc + Owner: USSR + Location: 124,84 + Actor693: fenc + Owner: USSR + Location: 124,83 + Actor694: fenc + Owner: USSR + Location: 123,84 + Actor695: fenc + Owner: USSR + Location: 111,85 + Actor696: fenc + Owner: USSR + Location: 111,86 + Actor697: fenc + Owner: USSR + Location: 111,89 + Actor698: fenc + Owner: USSR + Location: 111,88 + Actor699: fenc + Owner: USSR + Location: 111,87 + Actor700: fenc + Owner: USSR + Location: 112,89 + Actor701: fenc + Owner: USSR + Location: 114,89 + Actor702: fenc + Owner: USSR + Location: 113,89 + Actor703: fenc + Owner: USSR + Location: 119,89 + Actor704: fenc + Owner: USSR + Location: 111,77 + Actor705: fenc + Owner: USSR + Location: 112,77 + Actor706: fenc + Owner: USSR + Location: 113,77 + Actor707: fenc + Owner: USSR + Location: 114,77 + Actor708: fenc + Owner: USSR + Location: 114,76 + Actor709: fenc + Owner: USSR + Location: 117,77 + Actor710: fenc + Owner: USSR + Location: 117,76 + Actor711: fenc + Owner: USSR + Location: 118,76 + Actor712: fenc + Owner: USSR + Location: 119,76 + Actor747: sbag + Owner: USSR + Location: 5,34 + Actor748: sbag + Owner: USSR + Location: 5,38 + Actor749: sbag + Owner: USSR + Location: 5,39 + Actor750: sbag + Owner: USSR + Location: 5,33 + Actor751: sbag + Owner: USSR + Location: 5,32 + Actor752: sbag + Owner: USSR + Location: 5,31 + Actor753: sbag + Owner: USSR + Location: 5,30 + Actor754: sbag + Owner: USSR + Location: 5,40 + Actor755: sbag + Owner: USSR + Location: 5,41 + Actor756: sbag + Owner: USSR + Location: 5,42 + Actor757: sbag + Owner: USSR + Location: 6,42 + Actor758: sbag + Owner: USSR + Location: 7,42 + Actor759: sbag + Owner: USSR + Location: 8,42 + Actor760: sbag + Owner: USSR + Location: 10,42 + Actor761: sbag + Owner: USSR + Location: 9,42 + Actor762: sbag + Owner: USSR + Location: 11,42 + Actor763: sbag + Owner: USSR + Location: 12,42 + Actor764: sbag + Owner: USSR + Location: 13,38 + Actor765: sbag + Owner: USSR + Location: 13,39 + Actor766: sbag + Owner: USSR + Location: 13,41 + Actor767: sbag + Owner: USSR + Location: 13,40 + Actor768: sbag + Owner: USSR + Location: 13,42 + Actor769: sbag + Owner: USSR + Location: 13,34 + Actor770: sbag + Owner: USSR + Location: 13,33 + Actor771: sbag + Owner: USSR + Location: 13,32 + Actor772: sbag + Owner: USSR + Location: 13,31 + Actor773: sbag + Owner: USSR + Location: 7,30 + Actor774: sbag + Owner: USSR + Location: 6,30 + Actor775: sbag + Owner: USSR + Location: 8,30 + Actor776: sbag + Owner: USSR + Location: 10,30 + Actor777: sbag + Owner: USSR + Location: 9,30 + Actor778: sbag + Owner: USSR + Location: 11,30 + Actor779: sbag + Owner: USSR + Location: 12,30 + Actor780: sbag + Owner: USSR + Location: 13,30 + Actor781: sbag + Owner: USSR + Location: 118,29 + Actor782: sbag + Owner: USSR + Location: 118,28 + Actor783: sbag + Owner: USSR + Location: 118,33 + Actor784: sbag + Owner: USSR + Location: 118,34 + Actor785: sbag + Owner: USSR + Location: 118,35 + Actor786: sbag + Owner: USSR + Location: 118,36 + Actor787: sbag + Owner: USSR + Location: 120,36 + Actor788: sbag + Owner: USSR + Location: 119,36 + Actor789: sbag + Owner: USSR + Location: 121,36 + Actor790: sbag + Owner: USSR + Location: 122,36 + Actor791: sbag + Owner: USSR + Location: 123,36 + Actor792: sbag + Owner: USSR + Location: 124,36 + Actor793: sbag + Owner: USSR + Location: 125,36 + Actor794: sbag + Owner: USSR + Location: 126,36 + Actor795: sbag + Owner: USSR + Location: 127,36 + Actor796: sbag + Owner: USSR + Location: 128,36 + Actor797: sbag + Owner: USSR + Location: 128,35 + Actor798: sbag + Owner: USSR + Location: 128,31 + Actor799: sbag + Owner: USSR + Location: 128,30 + Actor800: sbag + Owner: USSR + Location: 128,29 + Actor801: sbag + Owner: USSR + Location: 128,28 + Actor802: sbag + Owner: USSR + Location: 118,27 + Actor803: sbag + Owner: USSR + Location: 118,26 + Actor804: sbag + Owner: USSR + Location: 119,26 + Actor805: sbag + Owner: USSR + Location: 120,26 + Actor806: sbag + Owner: USSR + Location: 122,26 + Actor807: sbag + Owner: USSR + Location: 121,26 + Actor808: sbag + Owner: USSR + Location: 123,26 + Actor809: sbag + Owner: USSR + Location: 124,26 + Actor810: sbag + Owner: USSR + Location: 125,26 + Actor811: sbag + Owner: USSR + Location: 126,26 + Actor812: sbag + Owner: USSR + Location: 127,26 + Actor813: sbag + Owner: USSR + Location: 128,26 + Actor814: sbag + Owner: USSR + Location: 128,27 + Actor815: barr + Owner: USSR + Location: 120,32 + Actor816: barr + Owner: USSR + Location: 10,31 + Actor817: powr + Owner: USSR + Location: 6,39 + Actor818: powr + Owner: USSR + Location: 8,39 + Actor819: powr + Owner: USSR + Location: 126,27 + Actor820: powr + Owner: USSR + Location: 124,27 + Actor821: ftur + Owner: USSR + Location: 117,29 + Actor822: ftur + Owner: USSR + Location: 117,33 + Actor823: ftur + Owner: USSR + Location: 14,34 + Actor824: ftur + Owner: USSR + Location: 14,40 + Actor825: sbag + Owner: USSR + Location: 72,96 + Actor826: sbag + Owner: USSR + Location: 76,96 + Actor827: sbag + Owner: USSR + Location: 77,96 + Actor828: sbag + Owner: USSR + Location: 78,96 + Actor829: sbag + Owner: USSR + Location: 71,96 + Actor830: sbag + Owner: USSR + Location: 69,96 + Actor831: sbag + Owner: USSR + Location: 70,96 + Actor832: sbag + Owner: USSR + Location: 79,96 + Actor833: sbag + Owner: USSR + Location: 80,96 + Actor834: sbag + Owner: USSR + Location: 68,96 + Actor835: sbag + Owner: USSR + Location: 68,95 + Actor836: sbag + Owner: USSR + Location: 68,94 + Actor837: sbag + Owner: USSR + Location: 68,93 + Actor838: sbag + Owner: USSR + Location: 68,92 + Actor839: sbag + Owner: USSR + Location: 68,91 + Actor840: sbag + Owner: USSR + Location: 68,90 + Actor841: sbag + Owner: USSR + Location: 68,89 + Actor842: sbag + Owner: USSR + Location: 69,89 + Actor843: sbag + Owner: USSR + Location: 70,89 + Actor844: sbag + Owner: USSR + Location: 71,89 + Actor845: sbag + Owner: USSR + Location: 72,89 + Actor846: sbag + Owner: USSR + Location: 77,89 + Actor847: sbag + Owner: USSR + Location: 76,89 + Actor848: sbag + Owner: USSR + Location: 78,89 + Actor849: sbag + Owner: USSR + Location: 79,89 + Actor850: sbag + Owner: USSR + Location: 80,89 + Actor851: sbag + Owner: USSR + Location: 80,90 + Actor852: sbag + Owner: USSR + Location: 80,91 + Actor853: sbag + Owner: USSR + Location: 80,92 + Actor854: sbag + Owner: USSR + Location: 80,93 + Actor855: sbag + Owner: USSR + Location: 80,94 + Actor856: sbag + Owner: USSR + Location: 80,95 + Actor857: ftur + Owner: USSR + Location: 71,88 + Actor858: ftur + Owner: USSR + Location: 77,88 + Actor859: barr + Owner: USSR + Location: 78,90 + Actor860: powr + Owner: USSR + Location: 69,93 + Actor861: powr + Owner: USSR + Location: 69,90 + Actor862: silo + Owner: USSR + Location: 79,95 + Actor863: silo + Owner: USSR + Location: 78,95 + Actor864: silo + Owner: USSR + Location: 6,31 + Actor865: silo + Owner: USSR + Location: 7,31 + Actor866: silo + Owner: USSR + Location: 119,27 + Actor867: silo + Owner: USSR + Location: 120,27 + Actor871: ftur + Owner: USSR + Location: 97,33 + Actor872: ftur + Owner: USSR + Location: 97,37 + Actor870: ftur + Owner: USSR + Location: 35,36 + Actor873: ftur + Owner: USSR + Location: 35,32 + Actor874: ftur + Owner: USSR + Location: 61,57 + Actor875: ftur + Owner: USSR + Location: 66,57 + Actor868: fenc + Owner: USSR + Location: 67,57 + Actor869: fenc + Owner: USSR + Location: 68,57 + Actor876: fenc + Owner: USSR + Location: 69,57 + Actor877: fenc + Owner: USSR + Location: 69,56 + Actor878: fenc + Owner: USSR + Location: 69,55 + Actor879: fenc + Owner: USSR + Location: 59,57 + Actor880: fenc + Owner: USSR + Location: 60,57 + Actor881: fenc + Owner: USSR + Location: 59,56 + Actor882: fenc + Owner: USSR + Location: 59,55 + Actor883: fenc + Owner: USSR + Location: 69,54 + Actor884: fenc + Owner: USSR + Location: 97,38 + Actor885: fenc + Owner: USSR + Location: 97,39 + Actor886: fenc + Owner: USSR + Location: 96,39 + Actor887: fenc + Owner: USSR + Location: 97,32 + Actor888: fenc + Owner: USSR + Location: 97,31 + Actor889: fenc + Owner: USSR + Location: 96,31 + Actor890: fenc + Owner: USSR + Location: 35,31 + Actor891: fenc + Owner: USSR + Location: 35,30 + Actor892: fenc + Owner: USSR + Location: 35,29 + Actor893: fenc + Owner: USSR + Location: 36,29 + Actor894: fenc + Owner: USSR + Location: 36,28 + Actor895: fenc + Owner: USSR + Location: 35,37 + Actor896: fenc + Owner: USSR + Location: 35,38 + Actor897: fenc + Owner: USSR + Location: 35,39 + Actor898: fenc + Owner: USSR + Location: 36,39 + Actor899: fenc + Owner: USSR + Location: 95,43 + Actor900: fenc + Owner: USSR + Location: 96,42 + Actor901: fenc + Owner: USSR + Location: 96,43 + Actor902: fenc + Owner: USSR + Location: 96,41 + Actor903: fenc + Owner: USSR + Location: 96,40 + Actor904: fenc + Owner: USSR + Location: 95,28 + Actor905: fenc + Owner: USSR + Location: 96,28 + Actor906: fenc + Owner: USSR + Location: 96,29 + Actor907: fenc + Owner: USSR + Location: 96,30 + Actor908: fenc + Owner: USSR + Location: 56,55 + Actor909: fenc + Owner: USSR + Location: 57,55 + Actor910: fenc + Owner: USSR + Location: 58,55 + Actor911: fenc + Owner: USSR + Location: 70,55 + Actor912: fenc + Owner: USSR + Location: 71,55 + Actor913: fenc + Owner: USSR + Location: 72,55 + Actor914: fenc + Owner: USSR + Location: 73,55 + Actor915: v2rl + Owner: USSR + Facing: 384 + Location: 59,42 + Actor916: v2rl + Owner: USSR + Facing: 384 + Location: 54,38 + Actor917: v2rl + Owner: USSR + Location: 73,40 + Facing: 642 + Actor918: v2rl + Owner: USSR + Location: 80,39 + Facing: 642 + Actor919: v2rl + Owner: USSR + Location: 80,29 + Facing: 642 + Actor920: v2rl + Owner: USSR + Location: 50,28 + Facing: 384 + Actor921: spen + Owner: USSR + Location: 104,78 + Actor922: seas + Owner: USSR + Location: 104,82 + Facing: 237 + Actor924: seas + Owner: USSR + Facing: 384 + Location: 111,92 + Actor925: seas + Owner: USSR + Facing: 384 + Location: 120,93 + Actor926: seas + Owner: USSR + Location: 125,74 + Facing: 0 + Actor928: seas + Owner: USSR + Location: 113,72 + Facing: 103 + Actor930: ss + Owner: USSR + Location: 117,71 + Facing: 15 + Actor931: ss + Owner: USSR + Location: 123,71 + Facing: 7 + Actor932: shok + Owner: USSR + SubCell: 3 + Location: 60,37 + Facing: 578 + Actor933: shok + Owner: USSR + Facing: 384 + Location: 60,37 + SubCell: 1 + Actor934: shok + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 57,31 + Actor935: shok + Owner: USSR + SubCell: 3 + Location: 63,38 + Facing: 570 + Actor936: shok + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 68,37 + Actor937: shok + Owner: USSR + SubCell: 3 + Location: 70,36 + Facing: 563 + Actor938: shok + Owner: USSR + Location: 70,31 + SubCell: 3 + Facing: 666 + Actor939: shok + Owner: USSR + Facing: 384 + Location: 68,37 + SubCell: 1 + Actor940: shok + Owner: USSR + SubCell: 3 + Location: 66,39 + Facing: 658 + Actor941: e8 + Owner: USSR + SubCell: 3 + Location: 71,29 + Facing: 713 + Actor943: e8 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 58,40 + Actor944: 3tnk + Owner: USSR + Location: 84,35 + Facing: 768 + Actor945: 3tnk + Owner: USSR + Location: 65,46 + Facing: 512 + Actor946: 3tnk + Owner: USSR + Location: 44,34 + Facing: 256 + Actor947: 3tnk + Owner: USSR + Facing: 256 + Location: 42,34 + Actor948: 3tnk + Owner: USSR + Facing: 256 + Location: 40,34 + Actor949: 3tnk + Owner: USSR + Facing: 256 + Location: 38,34 + Actor950: 3tnk + Owner: USSR + Facing: 256 + Location: 36,34 + Actor951: 3tnk + Owner: USSR + Facing: 768 + Location: 86,35 + Actor952: 3tnk + Owner: USSR + Facing: 768 + Location: 88,35 + Actor953: 3tnk + Owner: USSR + Facing: 768 + Location: 90,35 + Actor954: 3tnk + Owner: USSR + Facing: 768 + Location: 92,35 + Actor955: 3tnk + Owner: USSR + Facing: 512 + Location: 65,48 + Actor956: 3tnk + Owner: USSR + Facing: 512 + Location: 65,50 + Actor957: 3tnk + Owner: USSR + Facing: 512 + Location: 65,52 + Actor958: 3tnk + Owner: USSR + Facing: 512 + Location: 65,54 + Actor960: ttra + Owner: USSR + Location: 51,34 + Facing: 256 + Actor961: ttra + Owner: USSR + Location: 77,33 + Facing: 630 + Actor963: ttra + Owner: USSR + Location: 63,39 + Facing: 512 + Actor959: ttra + Owner: USSR + Facing: 256 + Location: 51,33 + Actor962: ttra + Owner: USSR + Facing: 630 + Location: 78,32 + Actor964: ttra + Owner: USSR + Facing: 512 + Location: 64,39 + Actor965: boxes05 + Owner: Neutral + Faction: russia + Location: 11,41 + Actor966: boxes06 + Owner: Neutral + Faction: russia + Location: 12,40 + Actor967: boxes02 + Owner: Neutral + Faction: russia + Location: 11,40 + Actor968: boxes09 + Owner: Neutral + Faction: russia + Location: 12,41 + Actor969: boxes01 + Owner: Neutral + Faction: russia + Location: 12,39 + Actor971: boxes02 + Owner: Neutral + Faction: russia + Location: 71,94 + Actor973: boxes05 + Owner: Neutral + Faction: russia + Location: 71,95 + Actor974: boxes09 + Owner: Neutral + Faction: russia + Location: 72,95 + Actor970: boxes01 + Owner: Neutral + Faction: russia + Location: 123,27 + Actor972: boxes02 + Owner: Neutral + Faction: russia + Location: 122,28 + Actor975: boxes06 + Owner: Neutral + Faction: russia + Location: 123,28 + Actor977: boxes09 + Owner: Neutral + Faction: russia + Location: 123,29 + Actor978: boxes05 + Owner: Neutral + Faction: russia + Location: 122,27 + Actor980: boxes05 + Owner: Neutral + Faction: russia + Location: 62,18 + Actor981: tc05 + Owner: Neutral + Faction: russia + Location: 58,14 + Actor982: tc04 + Owner: Neutral + Faction: russia + Location: 49,20 + Actor983: tc03 + Owner: Neutral + Faction: russia + Location: 76,19 + Actor984: tc02 + Owner: Neutral + Faction: russia + Location: 80,20 + Actor985: tc01 + Owner: Neutral + Faction: russia + Location: 82,21 + Actor986: t17 + Owner: Neutral + Faction: russia + Location: 89,24 + Actor987: tc02 + Owner: Neutral + Faction: russia + Location: 95,26 + Actor988: tc03 + Owner: Neutral + Faction: russia + Location: 47,22 + Actor989: tc04 + Owner: Neutral + Faction: russia + Location: 47,45 + Actor990: tc02 + Owner: Neutral + Faction: russia + Location: 33,27 + Actor991: t17 + Owner: Neutral + Faction: russia + Location: 36,23 + Actor992: tc04 + Owner: Neutral + Faction: russia + Location: 97,42 + Actor993: tc03 + Owner: Neutral + Faction: russia + Location: 99,44 + Actor994: t17 + Owner: Neutral + Faction: russia + Location: 96,44 + Actor995: t12 + Owner: Neutral + Faction: russia + Location: 83,46 + Actor996: t11 + Owner: Neutral + Faction: russia + Location: 90,46 + Actor997: tc03 + Owner: Neutral + Faction: russia + Location: 78,42 + Actor998: tc01 + Owner: Neutral + Faction: russia + Location: 74,42 + Actor999: tc02 + Owner: Neutral + Faction: russia + Location: 43,44 + Actor1000: t16 + Owner: Neutral + Faction: russia + Location: 45,46 + Actor1001: t07 + Owner: Neutral + Faction: russia + Location: 42,47 + Actor1002: t16 + Owner: Neutral + Faction: russia + Location: 38,45 + Actor1010: apc2.reinforce + Owner: GDI + Facing: 896 + Location: 24,83 + Actor1012: hmmv.tow + Owner: GDI + Facing: 896 + Location: 19,84 + Actor1013: mtnk + Owner: GDI + Facing: 896 + Location: 21,84 + Actor1014: mtnk + Owner: GDI + Facing: 896 + Location: 24,85 + Actor1015: apc2.reinforce + Owner: GDI + Facing: 896 + Location: 27,85 + Actor1017: mtnk + Owner: GDI + Facing: 896 + Location: 26,87 + Actor1018: hmmv.tow + Owner: GDI + Facing: 896 + Location: 28,88 + Actor1003: split2 + Owner: Neutral + Location: 41,87 + Actor1004: split2 + Owner: Neutral + Location: 43,93 + Actor1005: tc05 + Owner: Neutral + Location: 112,0 + Actor1006: tc04 + Owner: Neutral + Location: 115,1 + Actor1007: tc01 + Owner: Neutral + Location: 118,1 + Actor1008: t17 + Owner: Neutral + Location: 117,2 + Actor1009: tc02 + Owner: Neutral + Location: 120,1 + Actor1011: tc04 + Owner: Neutral + Location: 122,1 + Actor1019: tc01 + Owner: Neutral + Location: 118,3 + Actor1020: t13 + Owner: Neutral + Location: 118,2 + Actor1021: t11 + Owner: Neutral + Location: 120,2 + Actor1022: t02 + Owner: Neutral + Location: 121,3 + Actor1023: tc05 + Owner: Neutral + Location: 126,1 + Actor1024: t13 + Owner: Neutral + Location: 124,1 + Actor1025: t05 + Owner: Neutral + Location: 125,2 + Actor1026: t06 + Owner: Neutral + Location: 126,4 + Actor1027: t08 + Owner: Neutral + Location: 124,4 + Actor1028: t11 + Owner: Neutral + Location: 127,3 + Actor1029: t10 + Owner: Neutral + Location: 127,6 + Actor1030: tc03 + Owner: Neutral + Location: 125,6 + Actor1031: tc02 + Owner: Neutral + Location: 123,5 + Actor1032: t10 + Owner: Neutral + Location: 121,6 + Actor1033: t05 + Owner: Neutral + Location: 120,5 + Actor1034: t06 + Owner: Neutral + Location: 116,4 + Actor1035: t01 + Owner: Neutral + Location: 111,2 + Actor1036: t03 + Owner: Neutral + Location: 113,3 + Actor1037: t12 + Owner: Neutral + Location: 108,3 + Actor1038: t17 + Owner: Neutral + Location: 125,9 + Actor1039: t06 + Owner: Neutral + Location: 123,8 + Actor1040: t01 + Owner: Neutral + Location: 127,12 + Actor1041: t13 + Owner: Neutral + Location: 127,9 + Actor1042: t08 + Owner: Neutral + Location: 126,9 + Actor1043: t05 + Owner: Neutral + Location: 128,15 + Actor1044: tc03 + Owner: Neutral + Location: 127,17 + Actor1045: tc04 + Owner: Neutral + Location: 125,14 + Actor1046: t13 + Owner: Neutral + Location: 127,20 + Actor1047: t15 + Owner: Neutral + Location: 124,18 + Actor1048: t07 + Owner: Neutral + Location: 124,11 + Actor1049: t03 + Owner: Neutral + Location: 120,10 + Actor1050: t17 + Owner: Neutral + Location: 128,24 + Actor1051: t06 + Owner: Neutral + Location: 126,22 + Actor1052: t14 + Owner: Neutral + Location: 47,53 + Actor1053: t10 + Owner: Neutral + Location: 100,54 + Actor1054: t06 + Owner: Neutral + Location: 125,42 + Actor1056: t11 + Owner: Neutral + Location: 124,56 + Actor1058: tc03 + Owner: Neutral + Location: 16,58 + Actor1059: t12 + Owner: Neutral + Location: 17,56 + Actor1060: t07 + Owner: Neutral + Location: 7,68 + Actor1061: t06 + Owner: Neutral + Location: 39,58 + Actor1062: t01 + Owner: Neutral + Location: 50,64 + Actor1063: t02 + Owner: Neutral + Location: 30,46 + Actor1064: t01 + Owner: Neutral + Location: 20,35 + Actor1065: ice01 + Owner: Neutral + Location: 95,91 + Actor1066: ice03 + Owner: Neutral + Location: 100,94 + Actor1067: ice05 + Owner: Neutral + Location: 102,68 + Actor1068: ice03 + Owner: Neutral + Location: 120,64 + Actor1069: ice01 + Owner: Neutral + Location: 127,94 + Actor1070: t17 + Owner: Neutral + Location: 88,94 + Actor1071: t06 + Owner: Neutral + Location: 83,92 + Actor1072: t01 + Owner: Neutral + Location: 80,83 + Actor1073: t07 + Owner: Neutral + Location: 65,93 + Actor1074: t03 + Owner: Neutral + Location: 57,91 + Actor1075: split2 + Owner: Neutral + Location: 8,52 + Actor1076: split2 + Owner: Neutral + Location: 14,48 + Actor1077: split2 + Owner: Neutral + Location: 94,6 + Actor1078: split2 + Owner: Neutral + Location: 99,7 + Actor1079: split2 + Owner: Neutral + Location: 113,57 + Actor1080: split2 + Owner: Neutral + Location: 119,55 + Actor1055: t13 + Owner: Neutral + Location: 110,50 + Actor1057: t06 + Owner: Neutral + Location: 111,48 + Actor1081: split2 + Owner: Neutral + Location: 91,68 + Actor1082: split2 + Owner: Neutral + Location: 9,8 + Actor1083: split2 + Owner: Neutral + Location: 14,7 + Actor1084: tc04 + Owner: Neutral + Location: 6,14 + Actor1085: tc05 + Owner: Neutral + Location: 5,21 + Actor1086: tc01 + Owner: Neutral + Location: 7,19 + Actor1087: t12 + Owner: Neutral + Location: 8,17 + Actor1088: t11 + Owner: Neutral + Location: 5,18 + Actor1089: tc02 + Owner: Neutral + Location: 3,11 + Actor1090: t10 + Owner: Neutral + Location: 4,13 + Actor1091: t06 + Owner: Neutral + Location: 4,16 + Actor1092: t05 + Owner: Neutral + Location: 3,23 + Actor1093: tc04 + Owner: Neutral + Location: 1,20 + Actor1094: t14 + Owner: Neutral + Location: 1,19 + Actor1095: t17 + Owner: Neutral + Location: 3,18 + Actor1096: t02 + Owner: Neutral + Location: 1,16 + Actor1097: t01 + Owner: Neutral + Location: 2,14 + Actor1098: t05 + Owner: Neutral + Location: 1,13 + Actor1099: t03 + Owner: Neutral + Location: 2,10 + Actor1100: t12 + Owner: Neutral + Location: 2,23 + Actor1101: brl3 + Owner: Creeps + Location: 7,33 + Actor1102: barl + Owner: Creeps + Location: 6,32 + Actor1103: barl + Owner: Creeps + Location: 6,34 + Actor1104: brl3 + Owner: Creeps + Location: 71,90 + Actor1105: barl + Owner: Creeps + Location: 71,91 + Actor1106: barl + Owner: Creeps + Location: 72,90 + Actor1107: barl + Owner: Creeps + Location: 124,35 + Actor1108: brl3 + Owner: Creeps + Location: 125,34 + Actor1109: brl3 + Owner: Creeps + Location: 126,35 + Actor1110: barl + Owner: Creeps + Location: 126,34 + Actor1111: barl + Owner: Creeps + Location: 127,35 + Actor1112: v12 + Owner: Neutral + Location: 41,3 + Actor1113: v13 + Owner: Neutral + Location: 37,3 + Actor1114: t16 + Owner: Neutral + Location: 104,17 + Actor1115: t06 + Owner: Neutral + Location: 116,20 + Actor1116: t03 + Owner: Neutral + Location: 106,33 + Actor1117: t08 + Owner: Neutral + Location: 115,21 + Actor1118: t15 + Owner: Neutral + Location: 31,8 + Actor1119: t13 + Owner: Neutral + Location: 41,10 + Actor1120: t05 + Owner: Neutral + Location: 42,13 + Actor1121: t16 + Owner: Neutral + Location: 27,16 + Actor1122: tc02 + Owner: Neutral + Location: 17,24 + Actor1123: t13 + Owner: Neutral + Location: 17,64 + Actor1124: t03 + Owner: Neutral + Location: 9,90 + Actor1125: t06 + Owner: Neutral + Location: 34,72 + Actor1126: t05 + Owner: Neutral + Location: 44,65 + Actor1127: t17 + Owner: Neutral + Location: 10,62 + Actor1128: t07 + Owner: Neutral + Location: 1,65 + Actor1129: t02 + Owner: Neutral + Location: 2,43 + Actor1130: t10 + Owner: Neutral + Location: 68,5 + Actor1131: t12 + Owner: Neutral + Location: 71,10 + Actor1132: t06 + Owner: Neutral + Location: 81,5 + Actor1133: t06 + Owner: Neutral + Location: 86,56 + ReactorDeliveryPoint2: waypoint + Owner: Neutral + Location: 73,28 + WestDeliverySpawn: waypoint + Owner: Neutral + Location: 1,40 + WestDelivery1: waypoint + Owner: Neutral + Location: 8,36 + WestDelivery2: waypoint + Owner: Neutral + Location: 25,38 + WestDelivery4: waypoint + Owner: Neutral + Location: 34,34 + WestDelivery3: waypoint + Owner: Neutral + Location: 27,32 + SouthDeliverySpawn: waypoint + Owner: Neutral + Location: 74,96 + SouthDelivery1: waypoint + Owner: Neutral + Location: 74,84 + SouthDelivery2: waypoint + Owner: Neutral + Location: 78,64 + SouthDelivery3: waypoint + Owner: Neutral + Location: 64,61 + SouthDelivery4: waypoint + Owner: Neutral + Location: 64,46 + EastDeliverySpawn: waypoint + Owner: Neutral + Location: 128,33 + EastDelivery1: waypoint + Owner: Neutral + Location: 116,31 + EastDelivery2: waypoint + Owner: Neutral + Location: 114,37 + EastDelivery3: waypoint + Owner: Neutral + Location: 98,35 + PlayerStart: waypoint + Owner: Neutral + Location: 23,86 + Actor1134: 3tnk + Owner: USSR + Facing: 768 + Location: 16,36 + Actor1135: 3tnk + Owner: USSR + Facing: 256 + Location: 115,30 + Actor1136: 3tnk + Owner: USSR + Location: 72,86 + Facing: 0 + Actor1137: e1 + Owner: USSR + SubCell: 3 + Location: 70,86 + Facing: 182 + Actor1138: e1 + Owner: USSR + SubCell: 3 + Location: 76,88 + Facing: 15 + Actor1139: e1 + Owner: USSR + SubCell: 3 + Location: 77,86 + Facing: 0 + Actor1140: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 117,34 + Actor1141: e1 + Owner: USSR + SubCell: 3 + Location: 116,29 + Facing: 79 + Actor1142: e1 + Owner: USSR + SubCell: 3 + Location: 115,29 + Facing: 237 + Actor1143: e1 + Owner: USSR + SubCell: 3 + Location: 15,40 + TurretFacing: 0 + Facing: 578 + Actor1144: e1 + Owner: USSR + SubCell: 3 + Location: 17,35 + Facing: 658 + Actor1145: e1 + Owner: USSR + SubCell: 3 + Location: 16,34 + Facing: 713 + Actor1146: e1 + Owner: USSR + SubCell: 3 + Location: 11,34 + Facing: 689 + Actor1147: e2 + Owner: USSR + SubCell: 3 + Location: 12,35 + Facing: 570 + Actor1148: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 120,30 + Actor1149: e2 + Owner: USSR + SubCell: 3 + Location: 76,90 + Facing: 31 + Actor1150: e3 + Owner: USSR + Facing: 384 + Location: 72,91 + SubCell: 3 + Actor1151: e3 + Owner: USSR + SubCell: 3 + Location: 8,34 + Facing: 384 + Actor1152: e3 + Owner: USSR + SubCell: 3 + Location: 123,34 + Facing: 555 + Actor1153: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 56,29 + Actor1154: e1 + Owner: USSR + SubCell: 3 + Location: 57,35 + Facing: 269 + Actor1155: e1 + Owner: USSR + Facing: 384 + Location: 59,37 + SubCell: 3 + SpyDisguiseTarget: e1 + Owner: USSR + Location: 70,36 + SubCell: 1 + Facing: 753 + Actor1158: e1 + Owner: USSR + SubCell: 3 + Location: 59,22 + Facing: 253 + Actor1159: e1 + Owner: USSR + Location: 59,22 + SubCell: 1 + Facing: 384 + Actor1160: e1 + Owner: USSR + SubCell: 3 + Location: 56,25 + Facing: 166 + Actor1161: e1 + Owner: USSR + SubCell: 3 + Location: 70,23 + Facing: 384 + Actor1165: e1 + Owner: USSR + SubCell: 3 + Location: 76,40 + Facing: 999 + Actor1166: e1 + Owner: USSR + SubCell: 3 + Location: 82,38 + Facing: 959 + Actor1167: e1 + Owner: USSR + SubCell: 3 + Location: 88,33 + Facing: 697 + Actor1168: e1 + Owner: USSR + SubCell: 3 + Location: 85,33 + Facing: 721 + Actor1169: e1 + Owner: USSR + SubCell: 3 + Location: 98,32 + Facing: 808 + Actor1170: e1 + Owner: USSR + Location: 98,31 + SubCell: 3 + Facing: 904 + Actor1171: e1 + Owner: USSR + SubCell: 3 + Location: 99,37 + Facing: 800 + Actor1172: e1 + Owner: USSR + SubCell: 3 + Location: 98,38 + Facing: 824 + Actor1173: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 67,54 + Actor1174: e1 + Owner: USSR + SubCell: 3 + Location: 62,51 + Facing: 682 + Actor1175: e1 + Owner: USSR + SubCell: 3 + Location: 60,45 + Facing: 666 + Actor1176: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 67,43 + Actor1177: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 58,56 + Actor1178: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 61,58 + Actor1179: e1 + Owner: USSR + SubCell: 3 + Location: 67,58 + Facing: 523 + Actor1180: e1 + Owner: USSR + Location: 68,58 + SubCell: 3 + Facing: 650 + Actor1181: e1 + Owner: USSR + SubCell: 3 + Location: 74,55 + Facing: 610 + Actor1182: e1 + Owner: USSR + SubCell: 3 + Location: 77,49 + Facing: 666 + Actor1183: e1 + Owner: USSR + SubCell: 3 + Location: 77,45 + Facing: 634 + Actor1184: e1 + Owner: USSR + SubCell: 3 + Location: 81,44 + Facing: 499 + Actor1185: e1 + Owner: USSR + Location: 86,44 + SubCell: 3 + Facing: 570 + Actor1186: e1 + Owner: USSR + SubCell: 3 + Location: 72,56 + Facing: 713 + Actor1187: e1 + Owner: USSR + SubCell: 3 + Location: 95,45 + Facing: 682 + Actor1188: e1 + Owner: USSR + SubCell: 3 + Location: 92,45 + Facing: 570 + Actor1189: e1 + Owner: USSR + SubCell: 3 + Location: 94,26 + Facing: 848 + Actor1190: e1 + Owner: USSR + SubCell: 3 + Location: 90,25 + Facing: 856 + Actor1191: e1 + Owner: USSR + SubCell: 3 + Location: 87,24 + Facing: 753 + Actor1192: e1 + Owner: USSR + SubCell: 3 + Location: 39,24 + Facing: 126 + Actor1193: e1 + Owner: USSR + SubCell: 3 + Location: 43,23 + Facing: 111 + Actor1194: e1 + Owner: USSR + SubCell: 3 + Location: 33,30 + Facing: 206 + Actor1195: e1 + Owner: USSR + SubCell: 3 + Location: 34,31 + Facing: 126 + Actor1196: e1 + Owner: USSR + SubCell: 3 + Location: 34,37 + Facing: 174 + Actor1197: e1 + Owner: USSR + Facing: 384 + Location: 34,38 + SubCell: 3 + Actor1198: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 46,31 + Actor1199: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 41,32 + Actor1200: e1 + Owner: USSR + SubCell: 3 + Location: 52,25 + Facing: 384 + Actor1201: e3 + Owner: USSR + SubCell: 3 + Location: 45,23 + Facing: 182 + Actor1203: e3 + Owner: USSR + Facing: 384 + Location: 88,33 + SubCell: 1 + Actor1204: e3 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 72,41 + Actor1205: e3 + Owner: USSR + Facing: 384 + Location: 72,41 + SubCell: 1 + Actor1206: e3 + Owner: USSR + Location: 69,33 + SubCell: 3 + Facing: 570 + Actor1207: e3 + Owner: USSR + Location: 61,22 + SubCell: 3 + Facing: 594 + Actor1208: e3 + Owner: USSR + SubCell: 3 + Location: 70,20 + Facing: 261 + Actor1202: afld + Owner: USSR + Location: 69,38 + MainBarracks1: barr + Owner: USSR + Location: 55,33 + Actor1210: apoc.atomic + Owner: USSR + Location: 62,36 + Facing: 512 + Actor1211: apoc.atomic + Owner: USSR + Location: 65,36 + Facing: 512 + Actor1212: tc01.husk + Owner: Neutral + Faction: russia + Location: 31,56 + Actor1213: t02.husk + Owner: Neutral + Faction: russia + Location: 58,70 + Actor1214: tc02.husk + Owner: Neutral + Faction: russia + Location: 43,11 + AttackRally1: waypoint + Owner: Neutral + Location: 22,55 + AttackRally2: waypoint + Owner: Neutral + Location: 41,56 + AttackRally3: waypoint + Owner: Neutral + Location: 55,66 + Actor1215: e1 + Owner: USSR + SubCell: 3 + Facing: 689 + Location: 65,39 + InnerSAM1: sam + Owner: USSR + Location: 63,19 + ReactorDeliveryPoint1: waypoint + Owner: Neutral + Location: 72,28 + ReactorDeliveryPoint3: waypoint + Owner: Neutral + Location: 74,28 + ReactorDeliveryPoint4: waypoint + Owner: Neutral + Location: 75,28 + Actor1157: camera + Owner: USSR + Location: 19,78 + Actor1163: camera + Owner: USSR + Location: 33,84 + Actor1164: camera + Owner: USSR + Location: 45,76 + Actor1216: camera + Owner: USSR + Location: 55,88 + Actor1217: camera + Owner: USSR + Location: 30,65 + Actor1218: camera + Owner: USSR + Location: 12,68 + Actor1219: camera + Owner: USSR + Location: 24,50 + Actor1220: camera + Owner: USSR + Location: 22,13 + Actor1221: camera + Owner: USSR + Location: 106,13 + Actor1222: camera + Owner: USSR + Location: 104,51 + Actor1223: camera + Owner: USSR + Location: 92,57 + Actor1224: camera + Owner: USSR + Location: 70,64 + Actor1225: camera + Owner: USSR + Location: 49,59 + Actor1226: camera + Owner: USSR + Location: 18,30 + Actor1227: camera + Owner: USSR + Location: 110,33 + Actor1228: camera + Owner: USSR + Location: 65,8 + SupplyReveal2: waypoint + Owner: Neutral + Location: 74,92 + SupplyReveal1: waypoint + Owner: Neutral + Location: 123,31 + SupplyReveal3: waypoint + Owner: Neutral + Location: 10,36 + Spy: spy + Owner: Greece + SubCell: 3 + Location: 73,29 + Facing: 384 + SpyKiller: dog + Owner: USSR + SubCell: 3 + Location: 54,56 + Facing: 674 + McvSpawn: waypoint + Owner: Neutral + Location: 13,96 + Actor1209: camera + Owner: USSR + Location: 46,49 + Actor1229: camera + Owner: USSR + Location: 77,58 + Actor1230: camera + Owner: USSR + Location: 88,46 + Actor1232: camera + Owner: USSR + Location: 34,46 + KirovPath1_1: waypoint + Owner: Neutral + Location: 82,50 + KirovPath1_2: waypoint + Owner: Neutral + Location: 88,63 + KirovPath1_3: waypoint + Owner: Neutral + Location: 61,87 + KirovPath1_4: waypoint + Owner: Neutral + Location: 44,80 + KirovPath2_1: waypoint + Owner: Neutral + Location: 33,21 + KirovPath2_2: waypoint + Owner: Neutral + Location: 10,44 + KirovPath2_3: waypoint + Owner: Neutral + Location: 17,68 + Actor942: e8 + Owner: USSR + Facing: 800 + Location: 79,29 + SubCell: 3 + Actor1231: afld + Owner: USSR + Location: 77,26 + Actor1162: e1 + Owner: USSR + Facing: 689 + Location: 77,25 + SubCell: 3 + Actor1233: afld + Owner: USSR + Location: 71,23 + Actor1234: afld + Owner: USSR + Location: 70,21 + MissileSilo: mslo + Owner: USSR + Location: 54,26 + ScriptTags: BrutalOnly + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, capitulation-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml, capitulation-weapons.yaml diff --git a/mods/ca/missions/main-campaign/ca26-capitulation/stalin_warning.aud b/mods/ca/missions/main-campaign/ca26-capitulation/stalin_warning.aud new file mode 100644 index 0000000000..1ccdc46efa Binary files /dev/null and b/mods/ca/missions/main-campaign/ca26-capitulation/stalin_warning.aud differ diff --git a/mods/ca/missions/main-campaign/ca26-capitulation/suspicious.aud b/mods/ca/missions/main-campaign/ca26-capitulation/suspicious.aud new file mode 100644 index 0000000000..8ed41a7d54 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca26-capitulation/suspicious.aud differ diff --git a/mods/ca/missions/main-campaign/ca27-emancipation/c_airbaselocated.aud b/mods/ca/missions/main-campaign/ca27-emancipation/c_airbaselocated.aud new file mode 100644 index 0000000000..c66cba93d5 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca27-emancipation/c_airbaselocated.aud differ diff --git a/mods/ca/missions/main-campaign/ca27-emancipation/c_airbasereleased.aud b/mods/ca/missions/main-campaign/ca27-emancipation/c_airbasereleased.aud new file mode 100644 index 0000000000..e03b04f608 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca27-emancipation/c_airbasereleased.aud differ diff --git a/mods/ca/missions/main-campaign/ca27-emancipation/c_destroyscrin.aud b/mods/ca/missions/main-campaign/ca27-emancipation/c_destroyscrin.aud new file mode 100644 index 0000000000..088723eefb Binary files /dev/null and b/mods/ca/missions/main-campaign/ca27-emancipation/c_destroyscrin.aud differ diff --git a/mods/ca/missions/main-campaign/ca27-emancipation/c_firstbasereleased.aud b/mods/ca/missions/main-campaign/ca27-emancipation/c_firstbasereleased.aud new file mode 100644 index 0000000000..8188c575a7 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca27-emancipation/c_firstbasereleased.aud differ diff --git a/mods/ca/missions/main-campaign/ca27-emancipation/c_island.aud b/mods/ca/missions/main-campaign/ca27-emancipation/c_island.aud new file mode 100644 index 0000000000..5b2eacc8ed Binary files /dev/null and b/mods/ca/missions/main-campaign/ca27-emancipation/c_island.aud differ diff --git a/mods/ca/missions/main-campaign/ca27-emancipation/c_primarybaselocated.aud b/mods/ca/missions/main-campaign/ca27-emancipation/c_primarybaselocated.aud new file mode 100644 index 0000000000..1faa017e6c Binary files /dev/null and b/mods/ca/missions/main-campaign/ca27-emancipation/c_primarybaselocated.aud differ diff --git a/mods/ca/missions/main-campaign/ca27-emancipation/c_primarybasereleased.aud b/mods/ca/missions/main-campaign/ca27-emancipation/c_primarybasereleased.aud new file mode 100644 index 0000000000..de9c487e26 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca27-emancipation/c_primarybasereleased.aud differ diff --git a/mods/ca/missions/main-campaign/ca27-emancipation/c_remainingmasterminds.aud b/mods/ca/missions/main-campaign/ca27-emancipation/c_remainingmasterminds.aud new file mode 100644 index 0000000000..78557feae6 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca27-emancipation/c_remainingmasterminds.aud differ diff --git a/mods/ca/missions/main-campaign/ca27-emancipation/c_secondbaselocated.aud b/mods/ca/missions/main-campaign/ca27-emancipation/c_secondbaselocated.aud new file mode 100644 index 0000000000..0050d3f3c9 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca27-emancipation/c_secondbaselocated.aud differ diff --git a/mods/ca/missions/main-campaign/ca27-emancipation/c_secondbasereleased.aud b/mods/ca/missions/main-campaign/ca27-emancipation/c_secondbasereleased.aud new file mode 100644 index 0000000000..87a77d8819 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca27-emancipation/c_secondbasereleased.aud differ diff --git a/mods/ca/missions/main-campaign/ca27-emancipation/emancipation-rules.yaml b/mods/ca/missions/main-campaign/ca27-emancipation/emancipation-rules.yaml new file mode 100644 index 0000000000..4c7bb0a08c --- /dev/null +++ b/mods/ca/missions/main-campaign/ca27-emancipation/emancipation-rules.yaml @@ -0,0 +1,91 @@ +^Palettes: + TintPostProcessEffect: + PaletteFromFile@terrain-temperat: + Filename: ca|missions/main-campaign/ca22-decimation/fall.pal + +World: + LuaScript: + Scripts: campaign.lua, emancipation.lua + MissionData: + Briefing: A disaster has occurred, commander. Several of our bases near the front line, which we have been using as staging areas for our final assault, have fallen to Scrin mind control.\n\nWe have encountered the Scrin Masterminds before, but we had no idea they were capable of anything on this scale.\n\nOur Advanced Robotics Command has begun mass mobilisation of drone units, as we cannot risk sending any forces that are vulnerable to mind control.\n\nYour mission is to take some of these drone units and use them to neutralise the Scrin Masterminds. Although we cannot be sure, we think that killing a Mastermind will release all of the minds it has enslaved.\n\nTake care not to kill GDI forces that are under Scrin control. Once you have regained control of all of our bases, destroy the Scrin presence in the area. + MapOptions: + ShortGameCheckboxEnabled: False + MusicPlaylist: + StartingMusic: march + +Player: + PlayerResources: + DefaultCash: 0 + +# Disable powers for AI + +^InterceptorsPower: + InterceptorPower@AirDef: + Prerequisites: ~aircraft.gdi, ~!botplayer + +amcv.enabled: + AlwaysVisible: + Interactable: + ScriptTriggers: + ProvidesPrerequisite: + +AMCV: + Buildable: + Prerequisites: vehicles.mcv, ~amcv.enabled, ~vehicles.td + +MAST: + MindController: + Capacity: 0 + GrantCondition@mindcontrolling: + Condition: mindcontrolling + -WithDecoration@COMMANDOSKULL: + -ChangesHealth@CommandoRegen: + +MSHP: + Inherits@CAMPAIGNDISABLED: ^Disabled + +MSAR: + MustBeDestroyed: + RequiredForShortGame: true + +EYE: + Inherits@CAMPAIGNDISABLED: ^Disabled + +GDRN: + RevealsShroud: + Range: 8c0 + Buildable: + Prerequisites: ~vehicles.gdi, ~!tow.upgrade + +GDRN.TOW: + Buildable: + Prerequisites: ~vehicles.gdi, ~tow.upgrade + +MDRN: + Buildable: + Prerequisites: anyradar, ~vehicles.gdi + +UAV: + -Targetable@AIRBORNE: + RevealsShroud: + Range: 12c0 + MinRange: 10c0 + RevealsShroud@GAPGEN: + Range: 10c0 + +bdrone.upgrade: + -Buildable: + -AnnounceOnCreation: + +mdrone.upgrade: + -Buildable: + -AnnounceOnCreation: + +# Hunt() requires only 1 AttackBase +DEVA: + -AttackFrontalCharged: + -Armament@PRIMARYUPG: + -AmbientSound@CHARGE: + -WithIdleOverlay@CHARGE1: + -WithIdleOverlay@CHARGE2: + -WithIdleOverlay@CHARGE3: diff --git a/mods/ca/missions/main-campaign/ca27-emancipation/emancipation-weapons.yaml b/mods/ca/missions/main-campaign/ca27-emancipation/emancipation-weapons.yaml new file mode 100644 index 0000000000..9da5449935 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca27-emancipation/emancipation-weapons.yaml @@ -0,0 +1,4 @@ + +EnslaveVehicle: + Range: 7c0 + ReloadDelay: 35 diff --git a/mods/ca/missions/main-campaign/ca27-emancipation/emancipation.lua b/mods/ca/missions/main-campaign/ca27-emancipation/emancipation.lua new file mode 100644 index 0000000000..b604c3956f --- /dev/null +++ b/mods/ca/missions/main-campaign/ca27-emancipation/emancipation.lua @@ -0,0 +1,377 @@ +MissionDir = "ca|missions/main-campaign/ca27-emancipation" + +ScrinWaterAttackPaths = { + { AttackNode1.Location, AttackNode2.Location }, + { AttackNode1.Location, AttackNode3.Location }, + { AttackNode1.Location, AttackNode4.Location }, +} + +ScrinGroundAttackPaths = { + { AttackNode5.Location, AttackNode6.Location }, + { AttackNode5.Location, AttackNode4.Location }, + { AttackNode5.Location, AttackNode7.Location }, +} + +Masterminds = { Mastermind1, Mastermind2, Mastermind3, Mastermind4, Mastermind5 } + +MastermindsLocated = {} + +MaxEnslavedUnitsKilled = { + normal = 20, + hard = 10, + vhard = 5, + brutal = 2 +} + +Squads = { + ScrinMain = { + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 54, Max = 54 }), + ActiveCondition = function() + return Mastermind3.IsDead or Mastermind4.IsDead or DateTime.GameTime > DateTime.Minutes(6) + end, + FollowLeader = true, + Compositions = AdjustCompositionsForDifficulty(UnitCompositions.Scrin), + AttackPaths = ScrinGroundAttackPaths, + }, + ScrinWater = { + Delay = AdjustDelayForDifficulty(DateTime.Seconds(120)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 12, Max = 25, RampDuration = DateTime.Minutes(12) }), + Compositions = ScrinWaterCompositions, + AttackPaths = ScrinWaterAttackPaths, + }, + ScrinAir = { + Delay = AdjustAirDelayForDifficulty(DateTime.Minutes(8)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 12, Max = 12 }), + Compositions = AirCompositions.Scrin + }, + ScrinBigAir = { + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 24, Max = 24 }), + ActiveCondition = function() + return Mastermind4.IsDead + end, + Compositions = { + normal = { + { Aircraft = { PacOrDevastator, PacOrDevastator } }, + }, + hard = { + { Aircraft = { PacOrDevastator, PacOrDevastator, PacOrDevastator } }, + }, + vhard = { + { Aircraft = { PacOrDevastator, PacOrDevastator, PacOrDevastator } }, + }, + brutal = { + { Aircraft = { PacOrDevastator, PacOrDevastator, PacOrDevastator, PacOrDevastator } }, + } + }, + AttackPaths = ScrinWaterAttackPaths, + }, +} + +SetupPlayers = function() + GDI = Player.GetPlayer("GDI") + Scrin = Player.GetPlayer("Scrin") + GDISlaves = Player.GetPlayer("GDISlaves") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = { GDI } + MissionEnemies = { Scrin } +end + +WorldLoaded = function() + SetupPlayers() + + EnslavedUnitsKilled = 0 + Camera.Position = PlayerStart.CenterPosition + + InitObjectives(GDI) + InitScrin() + + ObjectiveLiberateBases = GDI.AddObjective("Kill Masterminds to liberate GDI bases.") + + if Difficulty == "easy" then + NormalHardOnlyTripod.Destroy() + else + ObjectiveMinimiseCasualties = GDI.AddObjective("Avoid killing mind controlled GDI units.") + end + + if Difficulty == "brutal" then + AdvComms.Destroy() + end + + Utils.Do(MissionPlayers, function(p) + Actor.Create("bdrone.upgrade", true, { Owner = p }) + Actor.Create("mdrone.upgrade", true, { Owner = p }) + end) + + Trigger.AfterDelay(DateTime.Seconds(7), function() + Tip("Drones (e.g. Guardian Drones, Mini Drones, Battle Drones, Mammoth Drones and Mobile EMP) are immune to mind control.") + Trigger.AfterDelay(DateTime.Seconds(7), function() + Tip("Masterminds are also unable to mind control aircraft.") + Trigger.AfterDelay(DateTime.Seconds(7), function() + Tip("Larger drones (Battle Drones, Mammoth Drones and Mobile EMP) require an active radar to function.") + end) + end) + end) + + Trigger.OnAllKilled(Masterminds, function() + if ObjectiveEliminateScrin == nil then + ObjectiveEliminateScrin = GDI.AddObjective("Destroy the remaining Scrin presence in the area.") + end + GDI.MarkCompletedObjective(ObjectiveLiberateBases) + if ObjectiveMinimiseCasualties ~= nil and EnslavedUnitsKilled <= MaxEnslavedUnitsKilled[Difficulty] then + GDI.MarkCompletedObjective(ObjectiveMinimiseCasualties) + end + UpdateObjectiveText() + MediaCA.PlaySound(MissionDir .. "/c_destroyscrin.aud", 2) + end) + + Trigger.OnKilled(Mastermind1, function(self, killer) + Trigger.AfterDelay(DateTime.Seconds(1), function() + Notification("The first GDI base has been released from Scrin control.") + MediaCA.PlaySound(MissionDir .. "/c_firstbasereleased.aud", 2) + if not Mastermind2.IsDead then + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(4)), function() + Notification("The next GDI base is located to the north-east.") + MediaCA.PlaySound(MissionDir .. "/c_secondbaselocated.aud", 2) + end) + end + end) + end) + + Trigger.OnKilled(Mastermind2, function(self, killer) + Trigger.AfterDelay(DateTime.Seconds(1), function() + Notification("The second GDI base has been released from Scrin control.") + MediaCA.PlaySound(MissionDir .. "/c_secondbasereleased.aud", 2) + if not Mastermind3.IsDead then + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(4)), function() + Notification("GDI airbase located to the south-east.") + MediaCA.PlaySound(MissionDir .. "/c_airbaselocated.aud", 2) + end) + end + end) + end) + + Trigger.OnKilled(Mastermind3, function(self, killer) + Trigger.AfterDelay(DateTime.Seconds(1), function() + Notification("GDI airbase secured.") + MediaCA.PlaySound(MissionDir .. "/c_airbasereleased.aud", 2) + + if not Mastermind4.IsDead then + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(4)), function() + Notification("The primary GDI base is located to the south.") + MediaCA.PlaySound(MissionDir .. "/c_primarybaselocated.aud", 2) + if not Mastermind5.IsDead then + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(4)), function() + Notification("We have also lost contact with our outpost on the island to the north.") + MediaCA.PlaySound(MissionDir .. "/c_island.aud", 2) + end) + end + end) + elseif not Mastermind5.IsDead then + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(4)), function() + Notification("We have also lost contact with our outpost on the island to the north.") + MediaCA.PlaySound(MissionDir .. "/c_island.aud", 2) + end) + end + end) + end) + + Trigger.OnKilled(Mastermind4, function(self, killer) + Trigger.AfterDelay(DateTime.Seconds(1), function() + Notification("The primary GDI base has been released from Scrin control.") + MediaCA.PlaySound(MissionDir .. "/c_primarybasereleased.aud", 2) + if not Mastermind1.IsDead or not Mastermind2.IsDead or not Mastermind3.IsDead or not Mastermind5.IsDead then + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(4)), function() + Notification("Eliminate the remaining Masterminds before assaulting the Scrin base.") + MediaCA.PlaySound(MissionDir .. "/c_remainingmasterminds.aud", 2) + end) + end + end) + end) + + Trigger.OnKilled(Mastermind5, function(self, killer) + Notification("Good job getting our EMP Missile launcher back. This should come in very handy.") + end) + + Trigger.AfterDelay(1, function() + Utils.Do(Masterminds, function(m) + local slaves = Map.ActorsInCircle(m.CenterPosition, WDist.New(18 * 1024), function(s) + return not s.IsDead and s.Owner == GDISlaves + end) + + Trigger.OnKilled(m, function(self, killer) + UpdateObjectiveText() + FreeSlaves(slaves) + + if m == Mastermind4 then + Utils.Do(MissionPlayers, function(p) + Actor.Create("amcv.enabled", true, { Owner = p }) + end) + end + end) + + Trigger.OnEnteredProximityTrigger(m.CenterPosition, WDist.New(11 * 1024), function(a, id) + if IsMissionPlayer(a.Owner) and a.Type ~= "smallcamera" and not m.IsDead and not MastermindsLocated[tostring(m)] then + MastermindsLocated[tostring(m)] = true + Trigger.RemoveProximityTrigger(id) + local camera = Actor.Create("smallcamera", true, { Owner = GDI, Location = m.Location }) + Notification("A Mastermind has been located.") + Beacon.New(GDI, m.CenterPosition) + Trigger.AfterDelay(DateTime.Seconds(4), function() + camera.Destroy() + end) + end + end) + end) + end) + + local enslavedUnits = GDISlaves.GetActors() + + Utils.Do(enslavedUnits, function(a) + if a.HasProperty("Move") then + Trigger.OnKilled(a, function(self, killer) + if IsMissionPlayer(killer.Owner) and (self.Owner == GDISlaves or self.Owner == Scrin) then + EnslavedUnitKilled() + end + end) + end + end) + + Trigger.OnAnyProduction(function(producer, produced, productionType) + if produced.Owner == GDI and produced.HasProperty("Move") then + Trigger.OnKilled(produced, function(self, killer) + if IsMissionPlayer(killer.Owner) and self.Owner == Scrin then + EnslavedUnitKilled() + end + end) + end + end) + + Trigger.AfterDelay(1, function() + local enslavedHarvesters = GDISlaves.GetActorsByType("harv.td") + Utils.Do(enslavedHarvesters, function(a) + if not a.IsDead then + a.Stop() + end + end) + end) + + SetupReveals({ EntranceReveal1, EntranceReveal2, EntranceReveal3, EntranceReveal4, EntranceReveal5, EntranceReveal6 }) + UpdateObjectiveText() + AfterWorldLoaded() +end + +Tick = function() + OncePerSecondChecks() + OncePerFiveSecondChecks() + OncePerThirtySecondChecks() + AfterTick() +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + Scrin.Resources = Scrin.ResourceCapacity - 500 + + if not PlayerHasBuildings(Scrin) then + if ObjectiveEliminateScrin == nil then + ObjectiveEliminateScrin = GDI.AddObjective("Eliminate the Scrin presence.") + end + GDI.MarkCompletedObjective(ObjectiveEliminateScrin) + end + + if MissionPlayersHaveNoRequiredUnits() then + if ObjectiveLiberateBases ~= nil and not GDI.IsObjectiveCompleted(ObjectiveLiberateBases) then + GDI.MarkFailedObjective(ObjectiveLiberateBases) + end + if ObjectiveEliminateScrin ~= nil and not GDI.IsObjectiveCompleted(ObjectiveEliminateScrin) then + GDI.MarkFailedObjective(ObjectiveEliminateScrin) + end + end + end +end + +OncePerFiveSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 125 == 0 then + UpdatePlayerBaseLocations() + end +end + +OncePerThirtySecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % DateTime.Seconds(30) == 0 then + CalculatePlayerCharacteristics() + end +end + +InitScrin = function() + Actor.Create("ai.unlimited.power", true, { Owner = GDISlaves }) + + AutoRepairAndRebuildBuildings(Scrin, 15) + SetupRefAndSilosCaptureCredits(Scrin) + AutoReplaceHarvesters(Scrin) + AutoRebuildConyards(Scrin) + InitAiUpgrades(Scrin) + InitAttackSquad(Squads.ScrinMain, Scrin) + InitAttackSquad(Squads.ScrinWater, Scrin) + InitAirAttackSquad(Squads.ScrinAir, Scrin) + + if IsNormalOrAbove() then + InitAttackSquad(Squads.ScrinBigAir, Scrin) + end + + local scrinGroundAttackers = Scrin.GetGroundAttackers() + + Utils.Do(scrinGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsScrinGroundHunterUnit) + end) +end + +UpdateObjectiveText = function() + if not GDI.IsObjectiveCompleted(ObjectiveLiberateBases) then + local activeMasterminds = Scrin.GetActorsByType("mast") + local objectiveText = " Masterminds remaining: " .. #activeMasterminds + local objectiveTextColor = HSLColor.Yellow + + if IsNormalOrAbove() then + if MaxEnslavedUnitsKilled[Difficulty] - EnslavedUnitsKilled < 2 then + objectiveTextColor = HSLColor.Red + end + + objectiveText = objectiveText .. "\nEnslaved GDI units killed: " .. EnslavedUnitsKilled .. " (max " .. MaxEnslavedUnitsKilled[Difficulty] .. ")" + end + + UserInterface.SetMissionText(objectiveText, objectiveTextColor) + else + UserInterface.SetMissionText("Eliminate the Scrin presence.", HSLColor.Yellow) + end +end + +EnslavedUnitKilled = function() + EnslavedUnitsKilled = EnslavedUnitsKilled + 1 + UpdateObjectiveText() + if ObjectiveMinimiseCasualties ~= nil and EnslavedUnitsKilled > MaxEnslavedUnitsKilled[Difficulty] then + GDI.MarkFailedObjective(ObjectiveMinimiseCasualties) + end +end + +-- overridden in co-op version +FreeSlaves = function(slaves) + Utils.Do(slaves, function(s) + if not s.IsDead then + s.Owner = GDI + Trigger.AfterDelay(1, function() + if not s.IsDead then + if s.HasProperty("Move") then + s.Stop() + end + if s.HasProperty("FindResources") then + s.FindResources() + end + end + end) + end + end) + + Trigger.AfterDelay(1, function() + Actor.Create("QueueUpdaterDummy", true, { Owner = GDI }) + end) +end diff --git a/mods/ca/missions/main-campaign/ca27-emancipation/map.bin b/mods/ca/missions/main-campaign/ca27-emancipation/map.bin new file mode 100644 index 0000000000..d6f482115b Binary files /dev/null and b/mods/ca/missions/main-campaign/ca27-emancipation/map.bin differ diff --git a/mods/ca/missions/main-campaign/ca27-emancipation/map.png b/mods/ca/missions/main-campaign/ca27-emancipation/map.png new file mode 100644 index 0000000000..f1e3e8254d Binary files /dev/null and b/mods/ca/missions/main-campaign/ca27-emancipation/map.png differ diff --git a/mods/ca/missions/main-campaign/ca27-emancipation/map.yaml b/mods/ca/missions/main-campaign/ca27-emancipation/map.yaml new file mode 100644 index 0000000000..45cb319c1f --- /dev/null +++ b/mods/ca/missions/main-campaign/ca27-emancipation/map.yaml @@ -0,0 +1,3701 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 27: Emancipation + +Author: Darkademic + +Tileset: TEMPERAT + +MapSize: 114,114 + +Bounds: 1,1,112,112 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: GDI, Scrin, GDISlaves + PlayerReference@GDI: + Name: GDI + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: arc + LockColor: True + Color: F2CF74 + LockSpawn: True + LockTeam: True + Enemies: Scrin, GDISlaves, Creeps + PlayerReference@Scrin: + Name: Scrin + Bot: campaign + Faction: scrin + Color: 7700FF + Allies: GDISlaves + Enemies: GDI, Creeps + PlayerReference@GDISlaves: + Name: GDISlaves + Bot: campaign + Faction: arc + Color: D500E8 + Allies: Scrin + Enemies: GDI, Creeps + +Actors: + Actor7: mtnk.drone + Owner: GDI + Facing: 512 + Location: 18,5 + Actor8: mtnk.drone + Owner: GDI + Facing: 512 + Location: 20,5 + Actor9: gdrn.tow + Owner: GDI + Facing: 512 + Location: 16,7 + Actor10: gdrn.tow + Owner: GDI + Facing: 512 + Location: 18,7 + Actor11: gdrn.tow + Owner: GDI + Facing: 512 + Location: 20,7 + Actor12: gdrn.tow + Owner: GDI + Facing: 512 + Location: 22,7 + Actor14: mdrn + Owner: GDI + SubCell: 3 + Facing: 512 + Location: 16,9 + Actor17: mdrn + Owner: GDI + SubCell: 3 + Facing: 512 + Location: 17,9 + Actor18: mdrn + Owner: GDI + SubCell: 3 + Facing: 512 + Location: 21,9 + Actor19: mdrn + Owner: GDI + SubCell: 3 + Facing: 512 + Location: 22,9 + Actor20: mdrn + Owner: GDI + SubCell: 3 + Facing: 512 + Location: 15,11 + Actor21: mdrn + Owner: GDI + SubCell: 3 + Facing: 512 + Location: 16,11 + Actor22: mdrn + Owner: GDI + SubCell: 3 + Facing: 512 + Location: 22,11 + Actor23: mdrn + Owner: GDI + SubCell: 3 + Facing: 512 + Location: 23,11 + Actor67: nuke + Location: 11,37 + Faction: reaper + Owner: GDISlaves + Actor68: nuke + Location: 13,37 + Faction: reaper + Owner: GDISlaves + Actor69: proc.td + Owner: GDISlaves + Location: 21,40 + FreeActor: True + Actor70: silo.td + Owner: GDISlaves + Location: 24,37 + Actor71: silo.td + Owner: GDISlaves + Location: 21,37 + Actor72: gtwr + Owner: GDISlaves + Location: 27,38 + Actor73: gtwr + Owner: GDISlaves + Location: 27,44 + Actor74: n1 + Owner: GDISlaves + Location: 28,43 + SubCell: 3 + Facing: 785 + Actor75: n1 + Owner: GDISlaves + SubCell: 3 + Location: 28,37 + Facing: 697 + Actor76: n1 + Owner: GDISlaves + SubCell: 3 + Location: 29,39 + Facing: 578 + Actor77: pyle + Owner: GDISlaves + Location: 12,41 + Actor78: mtnk + Owner: GDISlaves + Location: 29,41 + Facing: 777 + Actor79: s1 + SubCell: 3 + Location: 16,33 + Faction: arc + Facing: 174 + Owner: Scrin + Actor80: s1 + SubCell: 3 + Location: 13,34 + Faction: arc + Facing: 63 + Owner: Scrin + Mastermind1: mast + SubCell: 3 + Location: 17,40 + Faction: arc + Owner: Scrin + Facing: 95 + Actor83: split2 + Owner: Neutral + Location: 12,50 + Actor82: split2 + Owner: Neutral + Location: 22,54 + Actor84: seek + Owner: Scrin + Location: 15,34 + Facing: 95 + Actor85: sbag + Owner: GDISlaves + Location: 26,39 + Actor86: sbag + Owner: GDISlaves + Location: 26,38 + Actor87: sbag + Owner: GDISlaves + Location: 26,37 + Actor88: sbag + Owner: GDISlaves + Location: 26,36 + Actor89: sbag + Owner: GDISlaves + Location: 25,36 + Actor90: sbag + Owner: GDISlaves + Location: 23,36 + Actor91: sbag + Owner: GDISlaves + Location: 24,36 + Actor92: sbag + Owner: GDISlaves + Location: 22,36 + Actor93: sbag + Owner: GDISlaves + Location: 21,36 + Actor94: sbag + Owner: GDISlaves + Location: 20,36 + Actor54: sbag + Owner: GDISlaves + Location: 16,36 + Actor55: sbag + Owner: GDISlaves + Location: 15,36 + Actor56: sbag + Owner: GDISlaves + Location: 14,36 + Actor57: sbag + Owner: GDISlaves + Location: 13,36 + Actor58: sbag + Owner: GDISlaves + Location: 12,36 + Actor59: sbag + Owner: GDISlaves + Location: 11,36 + Actor60: sbag + Owner: GDISlaves + Location: 10,36 + Actor61: sbag + Owner: GDISlaves + Location: 10,37 + Actor62: sbag + Owner: GDISlaves + Location: 10,38 + Actor63: sbag + Owner: GDISlaves + Location: 10,39 + Actor64: sbag + Owner: GDISlaves + Location: 10,40 + Actor65: sbag + Owner: GDISlaves + Location: 10,41 + Actor95: sbag + Owner: GDISlaves + Location: 10,42 + Actor96: sbag + Owner: GDISlaves + Location: 10,43 + Actor97: sbag + Owner: GDISlaves + Location: 10,44 + Actor98: sbag + Owner: GDISlaves + Location: 10,45 + Actor99: sbag + Owner: GDISlaves + Location: 11,45 + Actor100: sbag + Owner: GDISlaves + Location: 12,45 + Actor101: sbag + Owner: GDISlaves + Location: 13,45 + Actor102: sbag + Owner: GDISlaves + Location: 14,45 + Actor103: sbag + Owner: GDISlaves + Location: 15,45 + Actor104: sbag + Owner: GDISlaves + Location: 16,45 + Actor66: sbag + Owner: GDISlaves + Location: 20,45 + Actor105: sbag + Owner: GDISlaves + Location: 21,45 + Actor106: sbag + Owner: GDISlaves + Location: 22,45 + Actor107: sbag + Owner: GDISlaves + Location: 23,45 + Actor108: sbag + Owner: GDISlaves + Location: 24,45 + Actor109: sbag + Owner: GDISlaves + Location: 25,45 + Actor110: sbag + Owner: GDISlaves + Location: 26,45 + Actor111: sbag + Owner: GDISlaves + Location: 26,44 + Actor112: sbag + Owner: GDISlaves + Location: 26,43 + Actor113: n1 + Owner: GDISlaves + SubCell: 3 + Location: 19,34 + Facing: 150 + Actor114: brik + Owner: GDISlaves + Location: 48,12 + Actor115: brik + Owner: GDISlaves + Location: 48,16 + Actor116: brik + Owner: GDISlaves + Location: 48,17 + Actor117: brik + Owner: GDISlaves + Location: 49,16 + Actor118: brik + Owner: GDISlaves + Location: 49,17 + Actor119: brik + Owner: GDISlaves + Location: 48,18 + Actor120: brik + Owner: GDISlaves + Location: 48,19 + Actor121: brik + Owner: GDISlaves + Location: 49,19 + Actor122: brik + Owner: GDISlaves + Location: 49,20 + Actor123: brik + Owner: GDISlaves + Location: 48,20 + Actor124: brik + Owner: GDISlaves + Location: 49,12 + Actor125: brik + Owner: GDISlaves + Location: 49,11 + Actor126: brik + Owner: GDISlaves + Location: 48,11 + Actor127: brik + Owner: GDISlaves + Location: 48,10 + Actor128: brik + Owner: GDISlaves + Location: 48,9 + Actor129: brik + Owner: GDISlaves + Location: 48,8 + Actor130: brik + Owner: GDISlaves + Location: 49,8 + Actor131: brik + Owner: GDISlaves + Location: 49,9 + Actor132: brik + Owner: GDISlaves + Location: 50,20 + Actor133: brik + Owner: GDISlaves + Location: 51,20 + Actor134: brik + Owner: GDISlaves + Location: 53,20 + Actor135: brik + Owner: GDISlaves + Location: 52,20 + Actor136: brik + Owner: GDISlaves + Location: 54,20 + Actor137: brik + Owner: GDISlaves + Location: 55,20 + Actor138: brik + Owner: GDISlaves + Location: 56,20 + Actor139: brik + Owner: GDISlaves + Location: 57,19 + Actor140: brik + Owner: GDISlaves + Location: 56,19 + Actor141: brik + Owner: GDISlaves + Location: 57,20 + Actor142: brik + Owner: GDISlaves + Location: 61,19 + Actor143: brik + Owner: GDISlaves + Location: 61,20 + Actor145: brik + Owner: GDISlaves + Location: 62,20 + Actor146: brik + Owner: GDISlaves + Location: 62,19 + Actor147: brik + Owner: GDISlaves + Location: 63,20 + Actor144: brik + Owner: GDISlaves + Location: 64,20 + Actor148: brik + Owner: GDISlaves + Location: 65,20 + Actor149: brik + Owner: GDISlaves + Location: 66,20 + Actor150: brik + Owner: GDISlaves + Location: 67,20 + Actor151: brik + Owner: GDISlaves + Location: 67,19 + Actor152: brik + Owner: GDISlaves + Location: 67,18 + Actor153: brik + Owner: GDISlaves + Location: 66,16 + Actor154: brik + Owner: GDISlaves + Location: 67,16 + Actor155: brik + Owner: GDISlaves + Location: 67,17 + Actor156: brik + Owner: GDISlaves + Location: 66,17 + Actor157: brik + Owner: GDISlaves + Location: 66,12 + Actor158: brik + Owner: GDISlaves + Location: 66,11 + Actor159: brik + Owner: GDISlaves + Location: 67,11 + Actor160: brik + Owner: GDISlaves + Location: 67,12 + Actor161: brik + Owner: GDISlaves + Location: 67,10 + Actor162: brik + Owner: GDISlaves + Location: 67,9 + Actor163: brik + Owner: GDISlaves + Location: 67,8 + Actor164: brik + Owner: GDISlaves + Location: 66,8 + Actor165: brik + Owner: GDISlaves + Location: 66,9 + Actor166: brik + Owner: GDISlaves + Location: 50,8 + Actor167: brik + Owner: GDISlaves + Location: 51,8 + Actor168: brik + Owner: GDISlaves + Location: 52,8 + Actor169: brik + Owner: GDISlaves + Location: 53,8 + Actor170: brik + Owner: GDISlaves + Location: 54,8 + Actor171: brik + Owner: GDISlaves + Location: 55,8 + Actor172: brik + Owner: GDISlaves + Location: 57,8 + Actor173: brik + Owner: GDISlaves + Location: 56,8 + Actor174: brik + Owner: GDISlaves + Location: 58,8 + Actor175: brik + Owner: GDISlaves + Location: 59,8 + Actor176: brik + Owner: GDISlaves + Location: 60,8 + Actor177: brik + Owner: GDISlaves + Location: 62,8 + Actor178: brik + Owner: GDISlaves + Location: 61,8 + Actor179: brik + Owner: GDISlaves + Location: 63,8 + Actor180: brik + Owner: GDISlaves + Location: 64,8 + Actor181: brik + Owner: GDISlaves + Location: 65,8 + Actor182: atwr + Owner: GDISlaves + Location: 49,18 + Actor183: atwr + Owner: GDISlaves + Location: 55,19 + Actor184: atwr + Owner: GDISlaves + Location: 63,19 + Actor185: atwr + Owner: GDISlaves + Location: 66,18 + Actor188: rep + Owner: GDISlaves + Location: 62,14 + Actor189: nuk2 + Owner: GDISlaves + Location: 51,9 + Actor190: nuk2 + Owner: GDISlaves + Location: 53,9 + Actor191: nuk2 + Owner: GDISlaves + Location: 55,9 + Actor193: proc.td + Owner: GDISlaves + Location: 62,9 + FreeActor: True + Actor192: silo.td + Owner: GDISlaves + Location: 59,9 + Actor194: silo.td + Owner: GDISlaves + Location: 58,10 + InitialSensor: msar + Owner: GDI + Location: 15,2 + Facing: 384 + DeployState: Deployed + Actor197: gtwr + Owner: GDISlaves + Location: 47,16 + Actor198: gtwr + Owner: GDISlaves + Location: 47,12 + Actor199: gtwr + Owner: GDISlaves + Location: 57,21 + Actor200: gtwr + Owner: GDISlaves + Location: 61,21 + Actor201: gtwr + Owner: GDISlaves + Location: 68,16 + Actor202: gtwr + Owner: GDISlaves + Location: 68,12 + Actor204: patr + Owner: GDISlaves + Location: 103,4 + Actor205: chain + Owner: GDISlaves + Location: 101,5 + Actor206: chain + Owner: GDISlaves + Location: 101,4 + Actor207: chain + Owner: GDISlaves + Location: 101,3 + Actor208: chain + Owner: GDISlaves + Location: 103,3 + Actor209: chain + Owner: GDISlaves + Location: 102,3 + Actor210: chain + Owner: GDISlaves + Location: 104,3 + Actor211: chain + Owner: GDISlaves + Location: 105,3 + Actor212: chain + Owner: GDISlaves + Location: 106,3 + Actor213: chain + Owner: GDISlaves + Location: 106,4 + Actor214: chain + Owner: GDISlaves + Location: 106,5 + Actor215: chain + Owner: GDISlaves + Location: 106,6 + Actor216: chain + Owner: GDISlaves + Location: 101,6 + Actor217: chain + Owner: GDISlaves + Location: 101,7 + Actor218: chain + Owner: GDISlaves + Location: 102,7 + Actor219: chain + Owner: GDISlaves + Location: 105,7 + Actor220: chain + Owner: GDISlaves + Location: 106,7 + Actor221: gtwr + Owner: GDISlaves + Location: 103,11 + Actor222: gtwr + Owner: GDISlaves + Location: 92,6 + Actor223: afld.gdi + Owner: GDISlaves + Location: 97,4 + Actor224: nuk2 + Owner: GDISlaves + Location: 108,3 + Actor225: nuk2 + Owner: GDISlaves + Location: 110,4 + Actor226: chain + Owner: GDISlaves + Location: 108,1 + Actor227: chain + Owner: GDISlaves + Location: 109,1 + Actor228: chain + Owner: GDISlaves + Location: 110,1 + Actor229: chain + Owner: GDISlaves + Location: 111,1 + Actor230: chain + Owner: GDISlaves + Location: 112,1 + Actor231: chain + Owner: GDISlaves + Location: 112,2 + Actor232: chain + Owner: GDISlaves + Location: 107,1 + Actor233: chain + Owner: GDISlaves + Location: 112,3 + Actor234: chain + Owner: GDISlaves + Location: 112,4 + Actor235: chain + Owner: GDISlaves + Location: 112,5 + Actor236: chain + Owner: GDISlaves + Location: 112,6 + Actor237: chain + Owner: GDISlaves + Location: 112,7 + Actor238: chain + Owner: GDISlaves + Location: 111,7 + Actor239: chain + Owner: GDISlaves + Location: 106,1 + Actor240: chain + Owner: GDISlaves + Location: 105,1 + Actor241: chain + Owner: GDISlaves + Location: 104,1 + Actor242: chain + Owner: GDISlaves + Location: 103,1 + Actor243: chain + Owner: GDISlaves + Location: 102,1 + Actor244: chain + Owner: GDISlaves + Location: 101,1 + Actor245: chain + Owner: GDISlaves + Location: 100,1 + Actor246: chain + Owner: GDISlaves + Location: 95,5 + Actor247: chain + Owner: GDISlaves + Location: 95,4 + Actor248: chain + Owner: GDISlaves + Location: 95,3 + Actor249: chain + Owner: GDISlaves + Location: 95,2 + Actor250: chain + Owner: GDISlaves + Location: 95,1 + Actor251: chain + Owner: GDISlaves + Location: 96,1 + Actor252: chain + Owner: GDISlaves + Location: 97,1 + Actor253: chain + Owner: GDISlaves + Location: 98,1 + Actor254: chain + Owner: GDISlaves + Location: 99,1 + Actor255: chain + Owner: GDISlaves + Location: 110,7 + Actor256: chain + Owner: GDISlaves + Location: 95,6 + Actor257: chain + Owner: GDISlaves + Location: 95,7 + Actor258: chain + Owner: GDISlaves + Location: 96,7 + Actor259: oilb + Owner: GDISlaves + Location: 92,2 + Actor260: n2 + Owner: GDISlaves + SubCell: 3 + Location: 105,11 + Facing: 721 + Actor261: n2 + Owner: GDISlaves + SubCell: 3 + Location: 107,10 + Facing: 563 + Actor262: n2 + Owner: GDISlaves + SubCell: 3 + Location: 93,7 + Facing: 523 + Actor263: n1 + Owner: GDISlaves + Facing: 384 + Location: 105,11 + SubCell: 1 + Actor264: n1 + Owner: GDISlaves + Facing: 384 + SubCell: 3 + Location: 102,11 + Actor265: n1 + Owner: GDISlaves + Facing: 384 + Location: 91,6 + SubCell: 3 + Mastermind5: mast + Owner: Scrin + SubCell: 3 + Location: 105,5 + Facing: 384 + Actor267: seek + Owner: Scrin + Facing: 384 + Location: 105,15 + Actor268: seek + Owner: Scrin + Facing: 384 + Location: 97,12 + Actor269: seek + Owner: Scrin + Facing: 384 + Location: 90,9 + Actor270: intl + Owner: Scrin + Facing: 384 + Location: 98,14 + Actor271: afld.gdi + Owner: GDISlaves + Location: 90,33 + Actor272: afld.gdi + Owner: GDISlaves + Location: 90,36 + Actor273: afld.gdi + Owner: GDISlaves + Location: 90,30 + Actor274: rep + Owner: GDISlaves + Location: 94,32 + Actor275: chain + Owner: GDISlaves + Location: 88,29 + Actor276: chain + Owner: GDISlaves + Location: 88,31 + Actor277: chain + Owner: GDISlaves + Location: 88,30 + Actor278: chain + Owner: GDISlaves + Location: 88,28 + Actor279: chain + Owner: GDISlaves + Location: 90,28 + Actor280: chain + Owner: GDISlaves + Location: 89,28 + Actor281: chain + Owner: GDISlaves + Location: 92,28 + Actor282: chain + Owner: GDISlaves + Location: 91,28 + Actor283: chain + Owner: GDISlaves + Location: 93,28 + Actor284: chain + Owner: GDISlaves + Location: 88,32 + Actor285: chain + Owner: GDISlaves + Location: 88,34 + Actor286: chain + Owner: GDISlaves + Location: 88,33 + Actor287: chain + Owner: GDISlaves + Location: 88,35 + Actor288: chain + Owner: GDISlaves + Location: 88,36 + Actor289: chain + Owner: GDISlaves + Location: 88,37 + Actor290: chain + Owner: GDISlaves + Location: 88,38 + Actor291: chain + Owner: GDISlaves + Location: 89,39 + Actor292: chain + Owner: GDISlaves + Location: 88,39 + Actor293: chain + Owner: GDISlaves + Location: 91,39 + Actor294: chain + Owner: GDISlaves + Location: 90,39 + Actor295: chain + Owner: GDISlaves + Location: 92,39 + Actor296: chain + Owner: GDISlaves + Location: 93,39 + Actor297: chain + Owner: GDISlaves + Location: 97,28 + Actor298: chain + Owner: GDISlaves + Location: 98,28 + Actor299: chain + Owner: GDISlaves + Location: 98,29 + Actor300: chain + Owner: GDISlaves + Location: 98,31 + Actor301: chain + Owner: GDISlaves + Location: 98,30 + Actor302: chain + Owner: GDISlaves + Location: 98,32 + Actor303: chain + Owner: GDISlaves + Location: 98,33 + Actor304: chain + Owner: GDISlaves + Location: 98,34 + Actor305: chain + Owner: GDISlaves + Location: 98,35 + Actor306: chain + Owner: GDISlaves + Location: 98,36 + Actor307: chain + Owner: GDISlaves + Location: 98,37 + Actor308: chain + Owner: GDISlaves + Location: 98,38 + Actor309: chain + Owner: GDISlaves + Location: 98,39 + Actor310: chain + Owner: GDISlaves + Location: 97,39 + Actor311: brik + Owner: GDISlaves + Location: 93,41 + Actor312: brik + Owner: GDISlaves + Location: 93,42 + Actor313: brik + Owner: GDISlaves + Location: 92,41 + Actor314: brik + Owner: GDISlaves + Location: 92,42 + Actor315: brik + Owner: GDISlaves + Location: 91,42 + Actor316: brik + Owner: GDISlaves + Location: 90,42 + Actor317: brik + Owner: GDISlaves + Location: 89,42 + Actor318: brik + Owner: GDISlaves + Location: 88,42 + Actor319: brik + Owner: GDISlaves + Location: 87,42 + Actor320: brik + Owner: GDISlaves + Location: 86,42 + Actor321: brik + Owner: GDISlaves + Location: 86,40 + Actor322: brik + Owner: GDISlaves + Location: 86,41 + Actor323: brik + Owner: GDISlaves + Location: 86,39 + Actor324: brik + Owner: GDISlaves + Location: 86,38 + Actor325: brik + Owner: GDISlaves + Location: 86,37 + Actor326: brik + Owner: GDISlaves + Location: 85,37 + Actor333: brik + Owner: GDISlaves + Location: 85,35 + Actor334: brik + Owner: GDISlaves + Location: 86,35 + Actor330: atwr + Owner: GDISlaves + Location: 86,36 + Actor331: brik + Owner: GDISlaves + Location: 85,36 + Actor327: atwr + Owner: GDISlaves + Location: 91,41 + Actor328: brik + Owner: GDISlaves + Location: 86,34 + Actor329: brik + Owner: GDISlaves + Location: 86,33 + Actor335: brik + Owner: GDISlaves + Location: 86,31 + Actor336: brik + Owner: GDISlaves + Location: 86,30 + Actor337: brik + Owner: GDISlaves + Location: 86,29 + Actor338: brik + Owner: GDISlaves + Location: 86,28 + Actor339: brik + Owner: GDISlaves + Location: 86,27 + Actor340: brik + Owner: GDISlaves + Location: 86,26 + Actor341: brik + Owner: GDISlaves + Location: 87,26 + Actor342: brik + Owner: GDISlaves + Location: 88,26 + Actor343: brik + Owner: GDISlaves + Location: 89,26 + Actor344: brik + Owner: GDISlaves + Location: 90,26 + Actor345: brik + Owner: GDISlaves + Location: 91,26 + Actor346: brik + Owner: GDISlaves + Location: 93,26 + Actor347: brik + Owner: GDISlaves + Location: 92,26 + Actor348: brik + Owner: GDISlaves + Location: 94,26 + Actor349: brik + Owner: GDISlaves + Location: 96,26 + Actor350: brik + Owner: GDISlaves + Location: 97,26 + Actor351: brik + Owner: GDISlaves + Location: 95,26 + Actor352: brik + Owner: GDISlaves + Location: 97,25 + Actor353: brik + Owner: GDISlaves + Location: 96,25 + Actor354: brik + Owner: GDISlaves + Location: 97,41 + Actor355: brik + Owner: GDISlaves + Location: 97,42 + Actor356: brik + Owner: GDISlaves + Location: 98,41 + Actor357: brik + Owner: GDISlaves + Location: 98,42 + Actor358: brik + Owner: GDISlaves + Location: 99,42 + Actor359: brik + Owner: GDISlaves + Location: 100,42 + Actor360: brik + Owner: GDISlaves + Location: 100,41 + Actor361: brik + Owner: GDISlaves + Location: 101,41 + Actor362: brik + Owner: GDISlaves + Location: 101,42 + Actor363: brik + Owner: GDISlaves + Location: 101,40 + Actor364: brik + Owner: GDISlaves + Location: 101,39 + Actor365: brik + Owner: GDISlaves + Location: 102,39 + Actor366: brik + Owner: GDISlaves + Location: 103,39 + Actor367: brik + Owner: GDISlaves + Location: 103,38 + Actor368: brik + Owner: GDISlaves + Location: 102,38 + Actor369: brik + Owner: GDISlaves + Location: 107,38 + Actor370: brik + Owner: GDISlaves + Location: 107,39 + Actor371: brik + Owner: GDISlaves + Location: 108,38 + Actor372: brik + Owner: GDISlaves + Location: 108,39 + Actor373: brik + Owner: GDISlaves + Location: 109,39 + Actor374: brik + Owner: GDISlaves + Location: 110,39 + Actor375: brik + Owner: GDISlaves + Location: 111,39 + Actor376: brik + Owner: GDISlaves + Location: 111,38 + Actor377: brik + Owner: GDISlaves + Location: 110,38 + Actor378: brik + Owner: GDISlaves + Location: 85,33 + Actor379: brik + Owner: GDISlaves + Location: 85,32 + Actor380: brik + Owner: GDISlaves + Location: 85,31 + Actor381: atwr + Owner: GDISlaves + Location: 86,32 + Actor382: atwr + Owner: GDISlaves + Location: 99,41 + Actor383: atwr + Owner: GDISlaves + Location: 109,38 + Actor384: proc.td + Owner: GDISlaves + Location: 100,33 + Actor385: silo.td + Owner: GDISlaves + Location: 100,31 + Actor386: silo.td + Owner: GDISlaves + Location: 101,30 + Actor387: pyle + Owner: GDISlaves + Location: 105,32 + Actor388: cram + Owner: GDISlaves + Location: 87,41 + Actor389: cram + Owner: GDISlaves + Location: 101,38 + Actor390: brik + Owner: GDISlaves + Location: 112,39 + Actor391: brik + Owner: GDISlaves + Location: 112,38 + Actor392: brik + Owner: GDISlaves + Location: 112,37 + Actor393: brik + Owner: GDISlaves + Location: 112,35 + Actor394: brik + Owner: GDISlaves + Location: 112,36 + Actor395: brik + Owner: GDISlaves + Location: 112,34 + Actor396: brik + Owner: GDISlaves + Location: 112,33 + Actor397: brik + Owner: GDISlaves + Location: 112,32 + Actor398: brik + Owner: GDISlaves + Location: 112,31 + Actor399: brik + Owner: GDISlaves + Location: 112,29 + Actor400: brik + Owner: GDISlaves + Location: 112,27 + Actor401: brik + Owner: GDISlaves + Location: 112,26 + Actor402: brik + Owner: GDISlaves + Location: 112,25 + Actor403: brik + Owner: GDISlaves + Location: 112,28 + Actor404: brik + Owner: GDISlaves + Location: 111,25 + Actor405: brik + Owner: GDISlaves + Location: 111,26 + Actor406: brik + Owner: GDISlaves + Location: 112,30 + Actor407: nuk2 + Owner: GDISlaves + Location: 110,27 + Actor408: nuk2 + Owner: GDISlaves + Location: 110,30 + Actor409: nuk2 + Owner: GDISlaves + Location: 110,33 + Actor410: gtwr + Owner: GDISlaves + Location: 93,43 + Actor411: gtwr + Owner: GDISlaves + Location: 97,43 + Actor412: gtwr + Owner: GDISlaves + Location: 103,40 + Actor413: gtwr + Owner: GDISlaves + Location: 107,40 + Actor557: swal + Owner: Scrin + Location: 22,112 + Actor558: swal + Owner: Scrin + Location: 23,112 + Actor559: swal + Owner: Scrin + Location: 25,112 + Actor560: swal + Owner: Scrin + Location: 24,112 + Actor561: swal + Owner: Scrin + Location: 26,112 + Actor562: swal + Owner: Scrin + Location: 27,112 + Actor563: swal + Owner: Scrin + Location: 28,112 + Actor564: swal + Owner: Scrin + Location: 29,112 + Actor575: swal + Owner: Scrin + Location: 19,101 + Actor576: swal + Owner: Scrin + Location: 19,100 + Actor577: swal + Owner: Scrin + Location: 20,100 + Actor578: swal + Owner: Scrin + Location: 20,101 + Actor579: swal + Owner: Scrin + Location: 20,99 + Actor580: swal + Owner: Scrin + Location: 21,99 + Actor581: swal + Owner: Scrin + Location: 21,98 + Actor582: swal + Owner: Scrin + Location: 21,97 + Actor583: swal + Owner: Scrin + Location: 21,96 + Actor584: swal + Owner: Scrin + Location: 22,96 + Actor585: swal + Owner: Scrin + Location: 23,96 + Actor594: swal + Owner: Scrin + Location: 31,94 + Actor595: swal + Owner: Scrin + Location: 31,95 + Actor596: swal + Owner: Scrin + Location: 32,94 + Actor597: swal + Owner: Scrin + Location: 32,95 + Actor598: swal + Owner: Scrin + Location: 33,95 + Actor599: swal + Owner: Scrin + Location: 33,96 + Actor600: swal + Owner: Scrin + Location: 34,96 + Actor601: swal + Owner: Scrin + Location: 36,96 + Actor602: swal + Owner: Scrin + Location: 35,96 + Actor603: swal + Owner: Scrin + Location: 38,96 + Actor604: swal + Owner: Scrin + Location: 37,96 + Actor605: swal + Owner: Scrin + Location: 39,96 + Actor606: swal + Owner: Scrin + Location: 40,96 + Actor607: swal + Owner: Scrin + Location: 41,96 + Actor608: swal + Owner: Scrin + Location: 43,96 + Actor609: swal + Owner: Scrin + Location: 42,96 + Actor610: swal + Owner: Scrin + Location: 43,97 + Actor611: swal + Owner: Scrin + Location: 43,98 + Actor612: swal + Owner: Scrin + Location: 43,99 + Actor613: swal + Owner: Scrin + Location: 44,99 + Actor614: swal + Owner: Scrin + Location: 44,100 + Actor615: swal + Owner: Scrin + Location: 45,100 + Actor616: swal + Owner: Scrin + Location: 45,101 + Actor617: swal + Owner: Scrin + Location: 44,101 + Actor628: swal + Owner: Scrin + Location: 43,112 + Actor630: swal + Owner: Scrin + Location: 42,112 + Actor631: swal + Owner: Scrin + Location: 30,112 + Actor632: swal + Owner: Scrin + Location: 32,112 + Actor633: swal + Owner: Scrin + Location: 31,112 + Actor634: swal + Owner: Scrin + Location: 33,112 + Actor635: swal + Owner: Scrin + Location: 34,112 + Actor636: swal + Owner: Scrin + Location: 35,112 + Actor637: swal + Owner: Scrin + Location: 36,112 + Actor638: swal + Owner: Scrin + Location: 37,112 + Actor639: swal + Owner: Scrin + Location: 38,112 + Actor640: swal + Owner: Scrin + Location: 39,112 + Actor641: swal + Owner: Scrin + Location: 40,112 + Actor642: swal + Owner: Scrin + Location: 41,112 + Actor643: proc.scrin + Owner: Scrin + Location: 23,98 + Actor644: scrt + Owner: Scrin + Location: 40,109 + Actor645: wsph + Owner: Scrin + Location: 39,97 + Actor646: wsph + Owner: Scrin + Location: 35,97 + Actor647: nerv + Owner: Scrin + Location: 37,108 + Actor648: port + Owner: Scrin + Location: 30,100 + Actor650: mani + Owner: Scrin + Location: 31,110 + Actor652: rea2 + Owner: Scrin + Location: 25,109 + Actor653: rea2 + Owner: Scrin + Location: 28,109 + Actor654: rea2 + Owner: Scrin + Location: 25,105 + Actor655: rea2 + Owner: Scrin + Location: 28,105 + Actor656: rea2 + Owner: Scrin + Location: 34,108 + Actor658: scol + Owner: Scrin + Location: 43,100 + Actor659: scol + Owner: Scrin + Location: 32,96 + Actor661: scol + Owner: Scrin + Location: 21,100 + Actor664: ptur + Owner: Scrin + Location: 18,101 + Actor666: ptur + Owner: Scrin + Location: 31,93 + Actor667: ptur + Owner: Scrin + Location: 46,101 + Actor669: shar + Owner: Scrin + Location: 42,97 + Actor670: shar + Owner: Scrin + Location: 22,97 + Actor671: shar + Owner: Scrin + Location: 41,106 + Actor672: shar + Owner: Scrin + Location: 23,106 + Actor676: grav + Owner: Scrin + Location: 37,102 + Actor677: grav + Owner: Scrin + Location: 33,104 + Actor649: port + Owner: Scrin + Location: 27,98 + Actor673: silo.scrin + Owner: Scrin + Location: 26,103 + Actor674: silo.scrin + Owner: Scrin + Location: 27,102 + Actor675: silo.scrin + Owner: Scrin + Location: 28,103 + Actor679: srep + Owner: Scrin + Location: 37,105 + Actor501: gtwr + Owner: GDISlaves + Location: 81,65 + Actor502: gtwr + Owner: GDISlaves + Location: 85,65 + Actor503: brik + Owner: GDISlaves + Location: 77,66 + Actor504: brik + Owner: GDISlaves + Location: 78,66 + Actor505: brik + Owner: GDISlaves + Location: 79,66 + Actor506: brik + Owner: GDISlaves + Location: 80,66 + Actor507: brik + Owner: GDISlaves + Location: 81,66 + Actor508: brik + Owner: GDISlaves + Location: 85,66 + Actor509: brik + Owner: GDISlaves + Location: 86,66 + Actor510: brik + Owner: GDISlaves + Location: 87,66 + Actor511: brik + Owner: GDISlaves + Location: 88,66 + Actor512: brik + Owner: GDISlaves + Location: 89,66 + Actor513: brik + Owner: GDISlaves + Location: 77,67 + Actor514: brik + Owner: GDISlaves + Location: 78,67 + Actor515: atwr + Owner: GDISlaves + Location: 79,67 + Actor516: brik + Owner: GDISlaves + Location: 80,67 + Actor517: brik + Owner: GDISlaves + Location: 81,67 + Actor518: brik + Owner: GDISlaves + Location: 85,67 + Actor520: brik + Owner: GDISlaves + Location: 86,67 + Actor521: atwr + Owner: GDISlaves + Location: 87,67 + Actor522: brik + Owner: GDISlaves + Location: 88,67 + Actor523: brik + Owner: GDISlaves + Location: 89,67 + Actor524: brik + Owner: GDISlaves + Location: 77,69 + Actor525: brik + Owner: GDISlaves + Location: 78,69 + Actor526: atwr + Owner: GDISlaves + Location: 79,69 + Actor527: brik + Owner: GDISlaves + Location: 80,69 + Actor528: brik + Owner: GDISlaves + Location: 81,69 + Actor529: brik + Owner: GDISlaves + Location: 85,69 + Actor530: brik + Owner: GDISlaves + Location: 86,69 + Actor531: atwr + Owner: GDISlaves + Location: 87,69 + Actor532: brik + Owner: GDISlaves + Location: 88,69 + Actor533: brik + Owner: GDISlaves + Location: 89,69 + Actor534: brik + Owner: GDISlaves + Location: 70,70 + Actor535: brik + Owner: GDISlaves + Location: 71,70 + Actor536: brik + Owner: GDISlaves + Location: 72,70 + Actor537: brik + Owner: GDISlaves + Location: 73,70 + Actor538: brik + Owner: GDISlaves + Location: 74,70 + Actor539: brik + Owner: GDISlaves + Location: 75,70 + Actor540: brik + Owner: GDISlaves + Location: 76,70 + Actor541: brik + Owner: GDISlaves + Location: 77,70 + Actor542: brik + Owner: GDISlaves + Location: 78,70 + Actor543: brik + Owner: GDISlaves + Location: 79,70 + Actor544: brik + Owner: GDISlaves + Location: 80,70 + Actor545: brik + Owner: GDISlaves + Location: 81,70 + Actor546: brik + Owner: GDISlaves + Location: 85,70 + Actor547: brik + Owner: GDISlaves + Location: 86,70 + Actor548: brik + Owner: GDISlaves + Location: 87,70 + Actor549: brik + Owner: GDISlaves + Location: 88,70 + Actor550: brik + Owner: GDISlaves + Location: 89,70 + Actor551: brik + Owner: GDISlaves + Location: 90,70 + Actor552: brik + Owner: GDISlaves + Location: 91,70 + Actor553: brik + Owner: GDISlaves + Location: 92,70 + Actor554: brik + Owner: GDISlaves + Location: 93,70 + Actor555: brik + Owner: GDISlaves + Location: 70,71 + Actor678: weap.td + Owner: GDISlaves + Location: 73,71 + Actor680: brik + Owner: GDISlaves + Location: 93,71 + Actor681: brik + Owner: GDISlaves + Location: 70,72 + Actor682: pyle + Owner: GDISlaves + Location: 80,72 + Actor683: pyle + Owner: GDISlaves + Location: 88,72 + Actor684: brik + Owner: GDISlaves + Location: 93,72 + Actor685: brik + Owner: GDISlaves + Location: 70,73 + Actor686: atwr + Owner: GDISlaves + Location: 71,73 + Actor687: atwr + Owner: GDISlaves + Location: 92,73 + Actor688: brik + Owner: GDISlaves + Location: 93,73 + Actor689: brik + Owner: GDISlaves + Location: 70,74 + Actor690: brik + Owner: GDISlaves + Location: 71,74 + Actor691: rep + Owner: GDISlaves + Location: 76,74 + Actor692: brik + Owner: GDISlaves + Location: 92,74 + Actor693: brik + Owner: GDISlaves + Location: 93,74 + Actor694: gtwr + Owner: GDISlaves + Location: 69,75 + Actor695: brik + Owner: GDISlaves + Location: 70,75 + Actor696: brik + Owner: GDISlaves + Location: 71,75 + Actor697: brik + Owner: GDISlaves + Location: 92,75 + Actor698: brik + Owner: GDISlaves + Location: 93,75 + Actor699: gtwr + Owner: GDISlaves + Location: 94,75 + Actor700: gtek + Owner: GDISlaves + Location: 81,76 + Actor702: nuk2 + Owner: GDISlaves + Location: 88,77 + Actor703: proc.td + Owner: GDISlaves + Location: 73,78 + Actor704: nuk2 + Owner: GDISlaves + Location: 78,78 + Actor705: gtwr + Owner: GDISlaves + Location: 69,79 + Actor706: brik + Owner: GDISlaves + Location: 70,79 + Actor707: brik + Owner: GDISlaves + Location: 71,79 + Actor708: brik + Owner: GDISlaves + Location: 92,79 + Actor709: brik + Owner: GDISlaves + Location: 93,79 + Actor710: gtwr + Owner: GDISlaves + Location: 94,79 + Actor711: brik + Owner: GDISlaves + Location: 70,80 + Actor712: brik + Owner: GDISlaves + Location: 71,80 + Actor713: brik + Owner: GDISlaves + Location: 92,80 + Actor714: brik + Owner: GDISlaves + Location: 93,80 + Actor715: brik + Owner: GDISlaves + Location: 70,81 + Actor716: atwr + Owner: GDISlaves + Location: 71,81 + Actor721: atwr + Owner: GDISlaves + Location: 92,81 + Actor722: brik + Owner: GDISlaves + Location: 93,81 + Actor723: brik + Owner: GDISlaves + Location: 70,82 + Actor724: brik + Owner: GDISlaves + Location: 93,82 + Actor725: brik + Owner: GDISlaves + Location: 70,83 + Actor726: atwr + Owner: GDISlaves + Location: 74,83 + Actor727: brik + Owner: GDISlaves + Location: 75,83 + Actor728: brik + Owner: GDISlaves + Location: 76,83 + Actor729: brik + Owner: GDISlaves + Location: 80,83 + Actor730: brik + Owner: GDISlaves + Location: 81,83 + Actor731: atwr + Owner: GDISlaves + Location: 82,83 + Actor732: brik + Owner: GDISlaves + Location: 93,83 + Actor733: brik + Owner: GDISlaves + Location: 70,84 + Actor734: brik + Owner: GDISlaves + Location: 71,84 + Actor735: brik + Owner: GDISlaves + Location: 72,84 + Actor736: brik + Owner: GDISlaves + Location: 73,84 + Actor737: brik + Owner: GDISlaves + Location: 74,84 + Actor738: brik + Owner: GDISlaves + Location: 75,84 + Actor739: brik + Owner: GDISlaves + Location: 76,84 + Actor740: brik + Owner: GDISlaves + Location: 80,84 + Actor741: brik + Owner: GDISlaves + Location: 81,84 + Actor742: brik + Owner: GDISlaves + Location: 82,84 + Actor743: brik + Owner: GDISlaves + Location: 83,84 + Actor744: brik + Owner: GDISlaves + Location: 84,84 + Actor745: brik + Owner: GDISlaves + Location: 85,84 + Actor746: brik + Owner: GDISlaves + Location: 86,84 + Actor747: brik + Owner: GDISlaves + Location: 87,84 + Actor748: brik + Owner: GDISlaves + Location: 88,84 + Actor749: brik + Owner: GDISlaves + Location: 89,84 + Actor750: brik + Owner: GDISlaves + Location: 90,84 + Actor751: brik + Owner: GDISlaves + Location: 91,84 + Actor752: brik + Owner: GDISlaves + Location: 92,84 + Actor753: brik + Owner: GDISlaves + Location: 93,84 + Actor754: gtwr + Owner: GDISlaves + Location: 76,85 + Actor755: gtwr + Owner: GDISlaves + Location: 80,85 + Mastermind4: mast + Owner: Scrin + SubCell: 3 + Location: 84,79 + Facing: 618 + Actor757: cram + Owner: GDISlaves + Location: 87,27 + Actor758: cram + Owner: GDISlaves + Location: 110,25 + Actor759: cram + Owner: GDISlaves + Location: 49,10 + Actor760: cram + Owner: GDISlaves + Location: 66,10 + Actor761: cram + Owner: GDISlaves + Location: 25,44 + Actor762: scol + Owner: Scrin + Location: 44,63 + Actor763: scol + Owner: Scrin + Location: 51,52 + Actor764: scol + Owner: Scrin + Location: 54,44 + Actor765: shar + Owner: Scrin + Location: 53,48 + Actor660: ptur + Owner: Scrin + Location: 27,93 + Actor665: swal + Owner: Scrin + Location: 26,94 + Actor766: swal + Owner: Scrin + Location: 27,94 + Actor767: swal + Owner: Scrin + Location: 25,95 + Actor768: swal + Owner: Scrin + Location: 26,95 + Actor769: swal + Owner: Scrin + Location: 27,95 + Actor770: swal + Owner: Scrin + Location: 24,96 + Actor771: swal + Owner: Scrin + Location: 25,96 + Actor772: scol + Owner: Scrin + Location: 26,96 + Actor657: swal + Owner: Scrin + Location: 44,105 + Actor668: swal + Owner: Scrin + Location: 45,105 + Actor773: scol + Owner: Scrin + Location: 43,106 + Actor774: swal + Owner: Scrin + Location: 44,106 + Actor775: swal + Owner: Scrin + Location: 45,106 + Actor776: ptur + Owner: Scrin + Location: 46,106 + Actor778: swal + Owner: Scrin + Location: 44,107 + Actor662: ptur + Owner: Scrin + Location: 18,105 + Actor663: swal + Owner: Scrin + Location: 19,105 + Actor780: swal + Owner: Scrin + Location: 20,105 + Actor781: swal + Owner: Scrin + Location: 19,106 + Actor782: swal + Owner: Scrin + Location: 20,106 + Actor783: scol + Owner: Scrin + Location: 21,106 + Actor784: swal + Owner: Scrin + Location: 20,107 + Actor788: split2 + Owner: Neutral + Location: 66,4 + Actor789: split2 + Owner: Neutral + Location: 72,8 + Actor790: split2 + Owner: Neutral + Location: 73,16 + Actor791: split2 + Owner: Neutral + Location: 110,45 + Actor792: split2 + Owner: Neutral + Location: 104,50 + Actor793: split2 + Owner: Neutral + Location: 73,89 + Actor794: split2 + Owner: Neutral + Location: 71,95 + Actor795: split2 + Owner: Neutral + Location: 13,95 + Actor796: split2 + Owner: Neutral + Location: 20,92 + Actor797: split2 + Owner: Neutral + Location: 13,109 + Actor798: split2 + Owner: Neutral + Location: 109,81 + Actor799: split2 + Owner: Neutral + Location: 103,83 + Actor800: split2 + Owner: Neutral + Location: 47,45 + Actor801: n1 + Owner: GDISlaves + SubCell: 3 + Location: 19,40 + Facing: 0 + Actor802: n1 + Owner: GDISlaves + SubCell: 3 + Location: 16,41 + Facing: 384 + Actor803: msam + Owner: GDISlaves + Location: 77,71 + Facing: 0 + Actor805: msam + Owner: GDISlaves + Facing: 384 + Location: 72,83 + Actor804: htnk + Owner: GDISlaves + Location: 69,77 + Facing: 256 + Actor807: htnk + Owner: GDISlaves + Location: 94,77 + Facing: 768 + Actor808: htnk + Owner: GDISlaves + Location: 78,85 + Facing: 512 + Actor809: mtnk + Owner: GDISlaves + Location: 74,74 + Facing: 384 + Actor810: disr + Owner: GDISlaves + Location: 81,80 + Facing: 507 + Actor813: titn + Owner: GDISlaves + Facing: 384 + Location: 74,76 + Actor814: titn + Owner: GDISlaves + Facing: 507 + Location: 82,86 + Actor811: hmmv + Owner: GDISlaves + Facing: 384 + Location: 95,82 + Actor812: n1 + Owner: GDISlaves + Facing: 384 + SubCell: 3 + Location: 94,84 + Actor815: n1 + Owner: GDISlaves + SubCell: 3 + Location: 94,74 + Facing: 840 + Actor816: n1 + Owner: GDISlaves + SubCell: 3 + Location: 95,73 + Facing: 848 + Actor817: n1 + Owner: GDISlaves + SubCell: 3 + Location: 96,75 + Facing: 737 + Actor818: n1 + Owner: GDISlaves + Facing: 384 + Location: 80,65 + SubCell: 3 + Actor819: n1 + Owner: GDISlaves + Facing: 384 + Location: 76,68 + SubCell: 3 + Actor820: n1 + Owner: GDISlaves + Facing: 384 + Location: 76,68 + SubCell: 1 + Actor821: n1 + Owner: GDISlaves + Facing: 384 + SubCell: 3 + Location: 86,64 + Actor822: n1 + Owner: GDISlaves + Facing: 384 + Location: 86,64 + SubCell: 1 + Actor823: n1 + Owner: GDISlaves + Facing: 384 + SubCell: 3 + Location: 89,65 + Actor824: n1 + Owner: GDISlaves + Facing: 384 + SubCell: 3 + Location: 68,74 + Actor825: n1 + Owner: GDISlaves + Facing: 384 + Location: 69,74 + SubCell: 3 + Actor826: n1 + Owner: GDISlaves + Facing: 384 + SubCell: 3 + Location: 67,80 + Actor827: n1 + Owner: GDISlaves + SubCell: 3 + Location: 80,75 + Facing: 563 + Actor828: n1 + Owner: GDISlaves + Location: 79,74 + SubCell: 3 + Facing: 563 + Actor829: n1 + Owner: GDISlaves + Facing: 384 + Location: 79,74 + SubCell: 1 + Actor830: n1 + Owner: GDISlaves + SubCell: 3 + Location: 83,74 + Facing: 689 + Actor831: n1 + Owner: GDISlaves + SubCell: 3 + Location: 82,72 + Facing: 753 + Actor832: n1 + Owner: GDISlaves + SubCell: 3 + Location: 86,74 + Facing: 872 + Actor833: n1 + Owner: GDISlaves + SubCell: 3 + Location: 88,75 + Facing: 729 + Actor834: n2 + Owner: GDISlaves + Location: 89,75 + SubCell: 3 + Facing: 761 + Actor835: n2 + Owner: GDISlaves + Facing: 384 + Location: 69,74 + SubCell: 1 + Actor836: n2 + Owner: GDISlaves + Facing: 384 + SubCell: 3 + Location: 75,69 + Actor837: n2 + Owner: GDISlaves + Facing: 384 + SubCell: 3 + Location: 91,68 + Actor838: n2 + Owner: GDISlaves + Location: 96,74 + SubCell: 3 + Facing: 769 + Actor839: n2 + Owner: GDISlaves + Facing: 384 + SubCell: 3 + Location: 84,86 + Actor840: n2 + Owner: GDISlaves + Facing: 384 + Location: 84,86 + SubCell: 1 + Actor841: n2 + Owner: GDISlaves + Facing: 384 + SubCell: 3 + Location: 86,85 + Actor843: n2 + Owner: GDISlaves + Facing: 384 + Location: 104,41 + SubCell: 1 + Actor844: n2 + Owner: GDISlaves + Location: 103,42 + SubCell: 3 + Facing: 618 + Actor842: n2 + Owner: GDISlaves + Facing: 384 + SubCell: 3 + Location: 109,34 + Actor845: n2 + Owner: GDISlaves + SubCell: 3 + Location: 94,37 + Facing: 499 + Actor846: n2 + Owner: GDISlaves + Facing: 384 + SubCell: 3 + Location: 97,31 + Actor847: n2 + Owner: GDISlaves + SubCell: 3 + Location: 91,44 + Facing: 602 + Actor848: n2 + Owner: GDISlaves + SubCell: 3 + Location: 57,18 + Facing: 666 + Actor849: n2 + Owner: GDISlaves + SubCell: 3 + Location: 61,17 + Facing: 531 + Actor850: n1 + Owner: GDISlaves + SubCell: 3 + Location: 58,21 + Facing: 515 + Actor851: n1 + Owner: GDISlaves + SubCell: 3 + Location: 56,22 + Facing: 666 + Actor852: n1 + Owner: GDISlaves + SubCell: 3 + Location: 55,21 + Facing: 475 + Actor853: n1 + Owner: GDISlaves + SubCell: 3 + Location: 63,22 + Facing: 626 + Actor854: n1 + Owner: GDISlaves + SubCell: 3 + Location: 67,21 + Facing: 650 + Actor855: n1 + Owner: GDISlaves + Location: 47,18 + SubCell: 3 + Facing: 384 + Actor856: n1 + Owner: GDISlaves + Facing: 384 + Location: 47,18 + SubCell: 1 + Actor857: n1 + Owner: GDISlaves + Location: 47,15 + SubCell: 3 + Facing: 253 + Actor858: n1 + Owner: GDISlaves + SubCell: 3 + Location: 46,12 + Facing: 269 + Actor859: n3 + Owner: GDISlaves + Location: 52,19 + SubCell: 3 + Facing: 515 + Actor860: n3 + Owner: GDISlaves + Facing: 384 + SubCell: 3 + Location: 65,18 + Actor862: hq + Owner: GDISlaves + Location: 106,28 + Actor861: pyle + Owner: GDISlaves + Location: 52,14 + Actor863: weap.td + Owner: GDISlaves + Location: 57,13 + Mastermind2: mast + Owner: Scrin + SubCell: 3 + Location: 56,13 + Facing: 563 + Actor865: vulc + Owner: GDISlaves + Location: 60,17 + Facing: 384 + Actor866: mtnk + Owner: GDISlaves + Location: 59,22 + Facing: 512 + Actor867: mtnk + Owner: GDISlaves + Location: 46,14 + Facing: 256 + Actor868: msam + Owner: GDISlaves + Location: 89,41 + Facing: 384 + Actor869: msam + Owner: GDISlaves + Location: 100,40 + Facing: 523 + Actor870: msam + Owner: GDISlaves + Location: 111,37 + Facing: 523 + Actor871: mtnk + Owner: GDISlaves + Location: 95,44 + Facing: 512 + Actor872: mtnk + Owner: GDISlaves + Facing: 512 + Location: 105,42 + Actor717: nuk2 + Owner: GDISlaves + Location: 84,81 + Actor718: nuk2 + Owner: GDISlaves + Location: 86,81 + Actor719: afac + Owner: GDISlaves + Location: 88,81 + Actor873: v02 + Owner: Neutral + Location: 109,105 + Actor874: v04 + Owner: Neutral + Location: 110,102 + Actor875: v07 + Owner: Neutral + Location: 101,110 + Actor877: v11 + Owner: Neutral + Location: 107,109 + Actor878: v09 + Owner: Neutral + Location: 88,109 + Actor879: v03 + Owner: Neutral + Location: 84,110 + Actor880: v01 + Owner: Neutral + Location: 105,104 + Actor881: v05 + Owner: Neutral + Location: 97,107 + Actor876: t07 + Owner: Neutral + Location: 108,110 + Actor882: t03 + Owner: Neutral + Location: 112,104 + Actor883: t10 + Owner: Neutral + Location: 90,106 + Actor884: tc03 + Owner: Neutral + Location: 95,111 + Actor885: t16 + Owner: Neutral + Location: 97,111 + Actor886: t13 + Owner: Neutral + Location: 106,101 + Actor887: t16 + Owner: Neutral + Location: 101,103 + Actor888: t05 + Owner: Neutral + Location: 103,109 + Actor889: wood + Owner: Neutral + Location: 105,103 + Actor890: wood + Owner: Neutral + Location: 106,103 + Actor891: wood + Owner: Neutral + Location: 107,103 + Actor892: wood + Owner: Neutral + Location: 107,104 + Actor893: wood + Owner: Neutral + Location: 107,105 + Actor894: wood + Owner: Neutral + Location: 108,105 + Actor895: wood + Owner: Neutral + Location: 95,106 + Actor896: wood + Owner: Neutral + Location: 95,107 + Actor897: wood + Owner: Neutral + Location: 88,108 + Actor898: wood + Owner: Neutral + Location: 89,108 + Actor899: wood + Owner: Neutral + Location: 87,108 + Actor900: wood + Owner: Neutral + Location: 87,109 + Actor901: wood + Owner: Neutral + Location: 86,109 + Actor902: wood + Owner: Neutral + Location: 83,109 + Actor903: wood + Owner: Neutral + Location: 83,110 + Actor904: wood + Owner: Neutral + Location: 83,111 + Actor905: wood + Owner: Neutral + Location: 84,109 + Actor906: wood + Owner: Neutral + Location: 85,109 + Actor907: wood + Owner: Neutral + Location: 82,111 + Actor908: wood + Owner: Neutral + Location: 109,109 + Actor909: wood + Owner: Neutral + Location: 110,109 + Actor910: wood + Owner: Neutral + Location: 110,110 + Actor911: wood + Owner: Neutral + Location: 110,111 + Actor912: wood + Owner: Neutral + Location: 110,112 + Actor913: wood + Owner: Neutral + Location: 109,112 + Actor914: wood + Owner: Neutral + Location: 107,112 + Actor915: wood + Owner: Neutral + Location: 108,112 + Actor916: wood + Owner: Neutral + Location: 106,112 + Actor917: wood + Owner: Neutral + Location: 105,112 + Actor918: wood + Owner: Neutral + Location: 105,111 + Actor919: wood + Owner: Neutral + Location: 100,112 + Actor920: wood + Owner: Neutral + Location: 101,112 + Actor921: wood + Owner: Neutral + Location: 102,112 + Actor922: wood + Owner: Neutral + Location: 99,112 + Actor923: wood + Owner: Neutral + Location: 99,111 + Actor924: wood + Owner: Neutral + Location: 103,107 + Actor925: wood + Owner: Neutral + Location: 104,107 + Actor926: wood + Owner: Neutral + Location: 105,107 + Actor927: wood + Owner: Neutral + Location: 105,108 + Actor928: gun.nod + Owner: Neutral + Location: 12,68 + TurretFacing: 412 + Health: 18 + Actor929: gun.nod + Owner: Neutral + Location: 18,68 + TurretFacing: 666 + Health: 20 + Actor930: tc04 + Owner: Neutral + Location: 7,1 + Actor931: tc01 + Owner: Neutral + Location: 5,6 + Actor932: tc02 + Owner: Neutral + Location: 3,10 + Actor933: t16 + Owner: Neutral + Location: 4,8 + Actor934: t15 + Owner: Neutral + Location: 4,3 + Actor935: t13 + Owner: Neutral + Location: 4,1 + Actor936: t14 + Owner: Neutral + Location: 1,7 + Actor937: t12 + Owner: Neutral + Location: 5,9 + Actor938: tc05 + Owner: Neutral + Location: 1,3 + Actor939: t02 + Owner: Neutral + Location: 3,6 + Actor940: t01 + Owner: Neutral + Location: 1,11 + Actor941: t02 + Owner: Neutral + Location: 2,9 + Actor942: t02 + Owner: Neutral + Location: 2,19 + Actor943: t06 + Owner: Neutral + Location: 1,18 + Actor944: t08 + Owner: Neutral + Location: 1,21 + Actor945: t03 + Owner: Neutral + Location: 5,16 + Actor946: tc01 + Owner: Neutral + Location: 1,33 + Actor947: tc05 + Owner: Neutral + Location: 5,38 + Actor948: tc02 + Owner: Neutral + Location: 3,45 + Actor949: t16 + Owner: Neutral + Location: 5,41 + Actor950: t15 + Owner: Neutral + Location: 4,36 + Actor951: t08 + Owner: Neutral + Location: 4,36 + Actor952: t02 + Owner: Neutral + Location: 2,35 + Actor953: t02 + Owner: Neutral + Location: 4,43 + Actor954: t05 + Owner: Neutral + Location: 4,40 + Actor955: t13 + Owner: Neutral + Location: 2,37 + Actor956: t10 + Owner: Neutral + Location: 2,49 + Actor957: t13 + Owner: Neutral + Location: 1,40 + Actor958: tc04 + Owner: Neutral + Location: 1,47 + Actor959: tc01 + Owner: Neutral + Location: 2,41 + Actor960: t17 + Owner: Neutral + Location: 2,39 + Actor961: t07 + Owner: Neutral + Location: 1,44 + Actor962: t08 + Owner: Neutral + Location: 2,44 + Actor963: t02 + Owner: Neutral + Location: 1,38 + Actor964: t15 + Owner: Neutral + Location: 52,68 + Actor965: t15 + Owner: Neutral + Location: 52,68 + Actor966: t13 + Owner: Neutral + Location: 48,72 + Actor967: t12 + Owner: Neutral + Location: 63,60 + Actor968: t07 + Owner: Neutral + Location: 56,53 + Actor969: t06 + Owner: Neutral + Location: 48,62 + Actor970: tc03 + Owner: Neutral + Location: 58,44 + Actor971: t16 + Owner: Neutral + Location: 72,30 + Actor972: t07 + Owner: Neutral + Location: 68,27 + Actor973: t08 + Owner: Neutral + Location: 70,27 + Actor974: t13 + Owner: Neutral + Location: 79,33 + Actor975: t10 + Owner: Neutral + Location: 81,45 + Actor976: t15 + Owner: Neutral + Location: 92,48 + Actor977: t14 + Owner: Neutral + Location: 99,59 + Actor978: tc01 + Owner: Neutral + Location: 101,57 + Actor979: tc02 + Owner: Neutral + Location: 86,54 + Actor980: t11 + Owner: Neutral + Location: 88,53 + Actor981: t07 + Owner: Neutral + Location: 94,58 + Actor982: t02 + Owner: Neutral + Location: 101,68 + Actor983: t05 + Owner: Neutral + Location: 101,65 + Actor984: t08 + Owner: Neutral + Location: 107,69 + Actor985: t16 + Owner: Neutral + Location: 111,71 + Actor986: t03 + Owner: Neutral + Location: 98,58 + Actor987: t05 + Owner: Neutral + Location: 73,60 + Actor988: tc02 + Owner: Neutral + Location: 69,56 + Actor989: t16 + Owner: Neutral + Location: 67,53 + Actor990: t11 + Owner: Neutral + Location: 50,27 + Actor991: t14 + Owner: Neutral + Location: 35,16 + Actor992: t13 + Owner: Neutral + Location: 38,6 + Actor993: t06 + Owner: Neutral + Location: 40,7 + Actor994: tc01 + Owner: Neutral + Location: 44,2 + Actor995: t11 + Owner: Neutral + Location: 53,2 + Actor996: tc02 + Owner: Neutral + Location: 56,1 + Actor997: t16 + Owner: Neutral + Location: 57,3 + Actor998: t07 + Owner: Neutral + Location: 54,1 + Actor1000: t02 + Owner: Neutral + Location: 47,1 + Actor999: t03 + Owner: Neutral + Location: 32,7 + Actor1001: t01 + Owner: Neutral + Location: 34,2 + Actor1002: t05 + Owner: Neutral + Location: 29,5 + Actor1003: t05 + Owner: Neutral + Location: 36,27 + Actor1004: tc01 + Owner: Neutral + Location: 40,26 + Actor1005: tc01 + Owner: Neutral + Location: 36,54 + Actor1006: t16 + Owner: Neutral + Location: 37,53 + Actor1007: t11 + Owner: Neutral + Location: 37,51 + Actor1008: t13 + Owner: Neutral + Location: 36,52 + Actor1009: t12 + Owner: Neutral + Location: 36,50 + Actor1010: t07 + Owner: Neutral + Location: 38,49 + Actor1011: t05 + Owner: Neutral + Location: 33,50 + Actor1012: t02 + Owner: Neutral + Location: 36,46 + Actor1013: t05 + Owner: Neutral + Location: 45,54 + Actor1014: t14 + Owner: Neutral + Location: 40,54 + Actor1015: t01 + Owner: Neutral + Location: 42,55 + Actor1016: t05 + Owner: Neutral + Location: 33,58 + Actor1017: t01 + Owner: Neutral + Location: 31,57 + Actor1018: t07 + Owner: Neutral + Location: 36,64 + Actor1019: t01 + Owner: Neutral + Location: 41,68 + Actor1020: t06 + Owner: Neutral + Location: 61,57 + Actor1021: t01 + Owner: Neutral + Location: 77,57 + Actor1022: t06 + Owner: Neutral + Location: 62,71 + Actor1023: ice01 + Owner: Neutral + Location: 36,11 + Actor1024: t06 + Owner: Neutral + Location: 31,23 + Actor1025: t02 + Owner: Neutral + Location: 30,19 + Actor1026: t16 + Owner: Neutral + Location: 22,24 + Actor1027: tc01 + Owner: Neutral + Location: 24,27 + Actor1028: tc02 + Owner: Neutral + Location: 6,24 + Actor1029: t15 + Owner: Neutral + Location: 6,21 + Actor1030: t13 + Owner: Neutral + Location: 18,27 + Actor1031: t11 + Owner: Neutral + Location: 30,31 + Actor1032: t13 + Owner: Neutral + Location: 30,22 + Actor1033: t07 + Owner: Neutral + Location: 33,21 + Actor1034: t05 + Owner: Neutral + Location: 27,17 + Actor1035: t06 + Owner: Neutral + Location: 27,9 + Actor1036: windmill + Owner: Neutral + Location: 8,17 + Actor1037: t10 + Owner: Neutral + Location: 8,10 + Actor1038: t02 + Owner: Neutral + Location: 10,5 + Actor1039: t11 + Owner: Neutral + Location: 13,3 + Actor1040: t05 + Owner: Neutral + Location: 11,7 + Actor1041: tc01 + Owner: Neutral + Location: 17,15 + Actor1042: t05 + Owner: Neutral + Location: 26,26 + Actor1043: t03 + Owner: Neutral + Location: 24,23 + Actor1044: t17 + Owner: Neutral + Location: 38,40 + Actor1045: t11 + Owner: Neutral + Location: 43,36 + Actor1046: t01 + Owner: Neutral + Location: 34,31 + Actor1047: t06 + Owner: Neutral + Location: 52,30 + Actor1048: t02 + Owner: Neutral + Location: 52,24 + Actor1049: t01 + Owner: Neutral + Location: 38,12 + Actor1050: t05 + Owner: Neutral + Location: 97,91 + Actor1051: tc04 + Owner: Neutral + Location: 91,97 + Actor1052: tc05 + Owner: Neutral + Location: 63,103 + Actor1053: t10 + Owner: Neutral + Location: 56,107 + Actor1054: tc02 + Owner: Neutral + Location: 74,107 + Actor1055: tc01 + Owner: Neutral + Location: 96,100 + Actor1056: t07 + Owner: Neutral + Location: 98,98 + Actor1057: t06 + Owner: Neutral + Location: 96,97 + Actor1058: t02 + Owner: Neutral + Location: 106,93 + Actor1059: t03 + Owner: Neutral + Location: 108,92 + Actor1060: t11 + Owner: Neutral + Location: 102,94 + Actor1061: t10 + Owner: Neutral + Location: 90,94 + Actor1062: t15 + Owner: Neutral + Location: 85,102 + Actor1063: t14 + Owner: Neutral + Location: 100,93 + Actor1064: t12 + Owner: Neutral + Location: 80,92 + Actor1065: t05 + Owner: Neutral + Location: 79,98 + Actor1066: t02 + Owner: Neutral + Location: 81,96 + Actor1067: t01 + Owner: Neutral + Location: 56,93 + Actor1068: ice03 + Owner: Neutral + Location: 78,23 + Actor1069: tc04 + Owner: Neutral + Location: 2,64 + Actor1070: t15 + Owner: Neutral + Location: 2,54 + Actor1071: t16 + Owner: Neutral + Location: 26,65 + Actor1072: t11 + Owner: Neutral + Location: 33,81 + Actor1073: tc05 + Owner: Neutral + Location: 38,84 + Actor1074: t16 + Owner: Neutral + Location: 44,87 + Actor1075: tc02 + Owner: Neutral + Location: 5,85 + Actor1076: t10 + Owner: Neutral + Location: 12,87 + Actor1077: t11 + Owner: Neutral + Location: 36,87 + Actor1078: t14 + Owner: Neutral + Location: 3,103 + Actor1079: t16 + Owner: Neutral + Location: 2,93 + Actor1080: t14 + Owner: Neutral + Location: 3,91 + Actor1081: t17 + Owner: Neutral + Location: 64,109 + Actor1082: tc03 + Owner: Neutral + Location: 66,109 + Actor1083: t17 + Owner: Neutral + Location: 55,95 + Actor1084: t16 + Owner: Neutral + Location: 81,24 + Actor1085: t17 + Owner: Neutral + Location: 86,21 + Actor1086: t08 + Owner: Neutral + Location: 80,35 + Actor1087: t14 + Owner: Neutral + Location: 87,20 + Actor1088: t07 + Owner: Neutral + Location: 89,1 + Actor1089: t16 + Owner: Neutral + Location: 111,8 + Actor1091: tpod + Owner: Scrin + Location: 48,105 + Facing: 785 + Actor1092: tpod + Owner: Scrin + Location: 47,96 + Facing: 896 + Actor1093: tpod + Owner: Scrin + Location: 36,92 + Facing: 919 + Actor1090: devo + Owner: Scrin + Location: 46,97 + Facing: 769 + Actor1094: devo + Owner: Scrin + Location: 34,92 + Facing: 888 + Actor1095: devo + Owner: Scrin + Location: 48,108 + Facing: 848 + Actor1096: corr + Owner: Scrin + Location: 33,97 + Facing: 1023 + Actor1097: corr + Owner: Scrin + Location: 32,91 + Facing: 911 + Actor1098: corr + Owner: Scrin + Location: 51,99 + Facing: 689 + Actor1099: ruin + Owner: Scrin + Location: 35,102 + Facing: 682 + Actor1100: intl + Owner: Scrin + Location: 50,101 + Facing: 793 + Actor1101: intl + Owner: Scrin + Location: 29,89 + Facing: 983 + Actor1104: s4 + Owner: Scrin + SubCell: 3 + Location: 41,101 + Facing: 785 + Actor1105: s4 + Owner: Scrin + SubCell: 3 + Location: 39,93 + Facing: 745 + Actor1106: s4 + Owner: Scrin + SubCell: 3 + Location: 28,91 + Facing: 856 + Actor1107: s1 + Owner: Scrin + SubCell: 3 + Location: 50,98 + Facing: 737 + Actor1108: s1 + Owner: Scrin + Location: 51,97 + SubCell: 3 + Facing: 769 + Actor1109: s1 + Owner: Scrin + Location: 51,97 + SubCell: 1 + Facing: 872 + Actor1110: s1 + Owner: Scrin + SubCell: 3 + Location: 53,101 + Facing: 856 + Actor1111: s1 + Owner: Scrin + SubCell: 3 + Location: 52,105 + Facing: 682 + Actor1112: s1 + Owner: Scrin + SubCell: 3 + Location: 51,106 + Facing: 840 + Actor1113: s1 + Owner: Scrin + SubCell: 3 + Location: 53,110 + Facing: 808 + Actor1114: s1 + Owner: Scrin + SubCell: 3 + Location: 43,92 + Facing: 769 + Actor1115: s1 + Owner: Scrin + SubCell: 3 + Location: 32,90 + Facing: 896 + Actor1116: s3 + Owner: Scrin + SubCell: 3 + Location: 42,93 + Facing: 943 + Actor1117: s3 + Owner: Scrin + SubCell: 3 + Location: 31,90 + Facing: 721 + Actor1118: s3 + Owner: Scrin + SubCell: 3 + Location: 51,105 + Facing: 689 + Actor1119: gunw + Owner: Scrin + Location: 67,104 + Facing: 840 + Actor1120: gunw + Owner: Scrin + Location: 70,105 + Facing: 888 + Actor1121: gunw + Owner: Scrin + Location: 78,63 + Facing: 943 + Actor1123: lchr + Owner: Scrin + Location: 81,62 + Facing: 1023 + Actor1124: devo + Owner: Scrin + Location: 70,68 + Facing: 206 + Actor1125: gunw + Owner: Scrin + Location: 66,75 + Facing: 348 + Actor1126: gunw + Owner: Scrin + Facing: 384 + Location: 92,46 + Actor1127: gunw + Owner: Scrin + Location: 107,44 + Facing: 570 + Actor1128: corr + Owner: Scrin + Facing: 384 + Location: 61,23 + Actor1129: gunw + Owner: Scrin + Facing: 384 + Location: 46,19 + Actor1130: seek + Owner: Scrin + Facing: 384 + Location: 61,32 + Actor1131: seek + Owner: Scrin + Location: 55,41 + Facing: 198 + Actor1132: seek + Owner: Scrin + Location: 49,57 + Facing: 174 + Actor1133: devo + Owner: Scrin + Location: 77,99 + Facing: 1023 + Actor1134: shrw + Owner: Scrin + Facing: 384 + Location: 53,50 + Actor1135: shrw + Owner: Scrin + Location: 45,59 + Facing: 103 + Actor1136: gunw + Owner: Scrin + Location: 56,39 + Facing: 198 + Actor1137: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 54,39 + Actor1138: s1 + Owner: Scrin + Facing: 384 + Location: 55,40 + SubCell: 3 + Actor1139: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 61,34 + Actor1140: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 60,32 + Actor1141: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 62,31 + Actor1142: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 61,24 + Actor1143: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 58,24 + Actor1144: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 46,21 + Actor1145: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 45,19 + Actor1146: s1 + Owner: Scrin + SubCell: 3 + Location: 31,38 + Facing: 729 + Actor1147: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 63,79 + Actor1148: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 66,74 + Actor1149: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 76,64 + Actor1150: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 85,62 + Actor1151: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 97,72 + Actor1152: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 100,74 + Actor1153: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 90,46 + Actor1154: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 93,47 + Actor1155: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 104,44 + Actor1156: s1 + Owner: Scrin + SubCell: 3 + Location: 83,40 + Facing: 515 + Actor1157: s1 + Owner: Scrin + Facing: 384 + Location: 83,40 + SubCell: 1 + Actor1158: s1 + Owner: Scrin + SubCell: 3 + Location: 83,38 + Facing: 174 + Actor1159: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 84,49 + Actor1160: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 98,47 + Actor1161: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 85,50 + Actor1162: s3 + Owner: Scrin + Facing: 384 + Location: 62,32 + SubCell: 3 + Actor1163: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 62,23 + Actor1164: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 45,16 + Actor1165: s3 + Owner: Scrin + SubCell: 3 + Location: 31,44 + Facing: 689 + Actor1122: s2 + Owner: Scrin + SubCell: 3 + Location: 63,106 + Facing: 777 + Actor1166: s2 + Owner: Scrin + SubCell: 3 + Location: 72,105 + Facing: 0 + Actor1167: s3 + Owner: Scrin + SubCell: 3 + Location: 68,106 + Facing: 785 + Actor1168: s1 + Owner: Scrin + SubCell: 3 + Location: 78,100 + Facing: 31 + Actor1169: s1 + Owner: Scrin + SubCell: 3 + Location: 78,97 + Facing: 95 + Actor1170: s3 + Owner: Scrin + SubCell: 3 + Location: 81,99 + Facing: 214 + Actor1171: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 95,60 + Actor1172: s1 + Owner: Scrin + SubCell: 3 + Location: 8,30 + Facing: 880 + EntranceReveal1: waypoint + Owner: Neutral + Location: 46,14 + EntranceReveal5: waypoint + Owner: Neutral + Location: 68,77 + EntranceReveal6: waypoint + Owner: Neutral + Location: 95,77 + EntranceReveal4: waypoint + Owner: Neutral + Location: 83,64 + Actor806: htnk + Owner: GDISlaves + Location: 83,65 + Facing: 0 + EntranceReveal2: waypoint + Owner: Neutral + Location: 59,21 + EntranceReveal3: waypoint + Owner: Neutral + Location: 95,43 + PlayerStart: waypoint + Owner: Neutral + Location: 19,9 + Mastermind3: mast + Owner: Scrin + SubCell: 3 + Location: 99,33 + Facing: 618 + Actor1174: rea2 + Owner: Scrin + Location: 43,109 + Actor1175: s4 + Owner: Scrin + SubCell: 3 + Facing: 777 + Location: 50,110 + Actor1176: s4 + Owner: Scrin + SubCell: 3 + Facing: 777 + Location: 49,107 + Actor1102: swal + Owner: Scrin + Location: 45,107 + Actor1103: swal + Owner: Scrin + Location: 46,107 + Actor1177: swal + Owner: Scrin + Location: 46,108 + Actor1178: swal + Owner: Scrin + Location: 46,109 + Actor1179: swal + Owner: Scrin + Location: 46,110 + Actor1180: swal + Owner: Scrin + Location: 46,111 + Actor1181: swal + Owner: Scrin + Location: 46,112 + Actor1182: swal + Owner: Scrin + Location: 44,112 + Actor1183: swal + Owner: Scrin + Location: 45,112 + Actor1184: swal + Owner: Scrin + Location: 19,107 + Actor1185: swal + Owner: Scrin + Location: 18,107 + Actor1186: swal + Owner: Scrin + Location: 18,108 + Actor1187: swal + Owner: Scrin + Location: 18,109 + Actor1188: swal + Owner: Scrin + Location: 18,110 + Actor1189: swal + Owner: Scrin + Location: 18,111 + Actor1190: swal + Owner: Scrin + Location: 18,112 + Actor1191: swal + Owner: Scrin + Location: 19,112 + Actor1192: swal + Owner: Scrin + Location: 20,112 + Actor1193: swal + Owner: Scrin + Location: 21,112 + Actor1173: rea2 + Owner: Scrin + Location: 22,109 + Actor1194: sfac + Owner: Scrin + Location: 19,109 + Actor1195: reac + Owner: Scrin + Location: 31,107 + AttackNode1: waypoint + Owner: Neutral + Location: 32,86 + AttackNode2: waypoint + Owner: Neutral + Location: 17,55 + AttackNode3: waypoint + Owner: Neutral + Location: 44,46 + AttackNode4: waypoint + Owner: Neutral + Location: 73,49 + AttackNode5: waypoint + Owner: Neutral + Location: 77,102 + AttackNode6: waypoint + Owner: Neutral + Location: 57,64 + AttackNode7: waypoint + Owner: Neutral + Location: 95,55 + Actor1196: corr + Owner: Scrin + Location: 79,25 + Facing: 198 + Actor1197: intl + Owner: Scrin + Location: 80,22 + Facing: 245 + Actor1198: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 80,23 + Actor1199: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 81,27 + NormalHardOnlyTripod: tpod + Owner: Scrin + Location: 97,38 + Facing: 384 + Actor1201: seek + Owner: Scrin + Location: 108,32 + Facing: 190 + Actor1202: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 59,16 + Actor1203: s2 + Owner: Scrin + SubCell: 3 + Location: 52,13 + Facing: 483 + Actor1204: intl + Owner: Scrin + Location: 70,15 + Facing: 642 + Actor1205: intl + Owner: Scrin + Location: 71,12 + Facing: 634 + Actor1206: corr + Owner: Scrin + Location: 78,72 + Facing: 832 + Actor1207: intl + Owner: Scrin + Facing: 384 + Location: 89,86 + Actor1208: intl.ai2 + Owner: Scrin + Location: 99,72 + Facing: 697 + Actor1209: devo + Owner: Scrin + Location: 86,90 + Facing: 634 + Actor1210: devo + Owner: Scrin + Location: 83,91 + Facing: 594 + Actor1212: s4 + Owner: Scrin + SubCell: 3 + Location: 76,78 + Facing: 523 + Actor1213: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 79,81 + Actor1214: s4 + Owner: Scrin + SubCell: 3 + Location: 77,80 + Facing: 745 + Actor1215: lchr + Owner: Scrin + Location: 108,36 + Facing: 384 + Actor1200: camera + Owner: Scrin + Location: 95,41 + Actor1216: camera + Owner: Scrin + Location: 85,34 + Actor1217: camera + Owner: Scrin + Location: 59,20 + Actor1218: camera + Owner: Scrin + Location: 48,14 + Actor1219: camera + Owner: Scrin + Location: 18,45 + Actor1220: camera + Owner: Scrin + Location: 29,42 + Actor1221: camera + Owner: Scrin + Location: 78,84 + Actor1222: camera + Owner: Scrin + Location: 70,77 + Actor1223: camera + Owner: Scrin + Location: 83,68 + Actor1224: camera + Owner: Scrin + Location: 90,77 + Actor1225: ruin + Owner: Scrin + Facing: 634 + Location: 81,92 + Actor1211: rtpd + Owner: Scrin + Location: 72,87 + Facing: 499 + Actor1226: rtpd + Owner: Scrin + Location: 99,80 + Facing: 682 + Actor1227: rtpd + Owner: Scrin + Location: 67,71 + Facing: 142 + Actor1228: devo + Owner: Scrin + Location: 102,47 + Facing: 555 + Actor1229: pac + Owner: Scrin + Location: 37,94 + Facing: 848 + Actor1230: pac + Owner: Scrin + Location: 42,108 + Facing: 848 + Actor1231: s4 + Owner: Scrin + SubCell: 3 + Location: 89,56 + Facing: 927 + Actor1232: s1 + Owner: Scrin + SubCell: 3 + Location: 96,57 + Facing: 904 + Actor1233: s2 + Owner: Scrin + SubCell: 3 + Location: 64,51 + Facing: 150 + Actor1234: s2 + Owner: Scrin + SubCell: 3 + Location: 66,52 + Facing: 253 + Actor1235: s2 + Owner: Scrin + SubCell: 3 + Location: 67,50 + Facing: 71 + Actor1236: intl + Owner: Scrin + Location: 66,50 + Facing: 111 + Actor1237: corr + Owner: Scrin + Location: 91,55 + Facing: 0 + Actor1238: corr + Owner: Scrin + Location: 90,35 + Facing: 341 + Actor1239: ruin + Owner: Scrin + Facing: 634 + Location: 85,91 + Actor1240: ruin + Owner: Scrin + Facing: 634 + Location: 76,91 + AdvComms: eye + Owner: GDISlaves + Location: 85,76 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, emancipation-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml, emancipation-weapons.yaml diff --git a/mods/ca/missions/main-campaign/ca28-duality/c_exit.aud b/mods/ca/missions/main-campaign/ca28-duality/c_exit.aud new file mode 100644 index 0000000000..b43f903a44 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca28-duality/c_exit.aud differ diff --git a/mods/ca/missions/main-campaign/ca28-duality/c_powerfulscrin.aud b/mods/ca/missions/main-campaign/ca28-duality/c_powerfulscrin.aud new file mode 100644 index 0000000000..053c3d1b6b Binary files /dev/null and b/mods/ca/missions/main-campaign/ca28-duality/c_powerfulscrin.aud differ diff --git a/mods/ca/missions/main-campaign/ca28-duality/c_tanya.aud b/mods/ca/missions/main-campaign/ca28-duality/c_tanya.aud new file mode 100644 index 0000000000..25c28f11f4 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca28-duality/c_tanya.aud differ diff --git a/mods/ca/missions/main-campaign/ca28-duality/duality-rules.yaml b/mods/ca/missions/main-campaign/ca28-duality/duality-rules.yaml new file mode 100644 index 0000000000..72ee1ac2dc --- /dev/null +++ b/mods/ca/missions/main-campaign/ca28-duality/duality-rules.yaml @@ -0,0 +1,112 @@ +^Palettes: + TintPostProcessEffect: + +World: + LuaScript: + Scripts: campaign.lua, duality.lua + MissionData: + Briefing: There is no time to lose! The Allied mercenary Tanya was sent to infiltrate a facility that is being used by the Scrin for stockpiling Tiberium.\n\nHer mission was to use explosives to destroy the Scrin stockpiles, however the facility was more heavily guarded than expected. She was injured and is now hiding from the Scrin, unable to reach an exit.\n\nUse one of our own commandos to find Tanya. Working together they should have no problems completing the original mission.\n\nPrior to radio silence, her position was known to be somewhere on the east side of the facility. + MapOptions: + ShortGameCheckboxEnabled: False + ScriptLobbyDropdown@RESPAWN: + ID: respawn + Label: Respawns + Description: Enable/disable respawning on death + Values: + enabled: Enabled + disabled: Disabled + Default: disabled + DisplayOrder: 999 + MusicPlaylist: + StartingMusic: search + +Player: + PlayerResources: + DefaultCash: 0 + +SILO.SCRIN: + -SpawnActorOnDeath: + +SILO.SCRINBLUE: + Inherits: SILO.SCRIN + +^DifficultyModifiers: + Inherits@ActorDifficultyConditions: ^ActorDifficultyConditions + DamageMultiplier@EASY: + Modifier: 75 + RequiresCondition: difficulty-easy + DamageMultiplier@NORMAL: + Modifier: 100 + RequiresCondition: difficulty-normal + DamageMultiplier@HARD: + Modifier: 125 + RequiresCondition: difficulty-hard + RevealsShroudMultiplier@EASY: + Modifier: 115 + RequiresCondition: difficulty-easy + RangeMultiplier@EASY: + Modifier: 115 + RequiresCondition: difficulty-easy + GrantConditionOnDamageState@WOUNDED: + ValidDamageStates: Critical + Condition: wounded + SpeedMultiplier@WOUNDED: + RequiresCondition: wounded + Modifier: 75 + +RMBO: + Inherits@DIFFICULTY: ^DifficultyModifiers + RevealsShroud: + Range: 8c0 + +E7: + Inherits@DIFFICULTY: ^DifficultyModifiers + RevealsShroud: + Range: 8c0 + Health: + HP: 25000 + MustBeDestroyed: + RequiredForShortGame: true + Mobile: + Speed: 92 + TakeCover: + SpeedModifier: 85 + ExternalCondition@slowed: + Condition: slowed + SpeedMultiplier@slowed1: + Modifier: 70 + RequiresCondition: slowed == 1 + SpeedMultiplier@slowed2: + Modifier: 40 + RequiresCondition: slowed > 1 + WithDecoration@COMMANDOSKULL: + RequiresCondition: chilled + AutoTarget: + InitialStance: HoldFire + +PDGY: + AutoTargetPriority@DEFAULT: + RequiresCondition: stance-attackanything || assault-move + Mobile: + Speed: 36 + RevealsShroud: + Range: 12c0 + WithRangeCircle@ZAPRANGENORMAL: + Type: Psi + Visible: Always + ValidRelationships: Ally, Enemy + Color: 9b25ffaa + Range: 12c0 + RequiresCondition: activated + ExternalCondition@ACTIVATED: + Condition: activated + Armament@PRIMARY: + Weapon: ProdigyZap + -MindController: + -MindControllerCapacityModifier@RANK-1: + -MindControllerCapacityModifier@RANK-2: + -MindControllerCapacityModifier@RANK-ELITE: + -WithIdleOverlay@mindcontrolling: + +WORMHOLE: + -Targetable: diff --git a/mods/ca/missions/main-campaign/ca28-duality/duality-weapons.yaml b/mods/ca/missions/main-campaign/ca28-duality/duality-weapons.yaml new file mode 100644 index 0000000000..a0ac7bb322 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca28-duality/duality-weapons.yaml @@ -0,0 +1,29 @@ +SMG: + InvalidTargets: Structure + Warhead@1Dam: SpreadDamage + Versus: + Light: 8 + Heavy: 6 + +Colt45: + ReloadDelay: 8 + ValidTargets: Ground + InvalidTargets: Structure + Warhead@1Dam: SpreadDamage + ValidTargets: Ground + ValidRelationships: Enemy, Neutral + Versus: + Light: 8 + Heavy: 6 + +PlaceC4: + ValidTargets: Structure + +ProdigyZap: + Range: 12c0 + Projectile: InstantHit + Report: mastermind-fire.aud + Warhead@1Dam: SpreadDamage + Spread: 128 + Damage: 100000 + DamageTypes: BulletDeath diff --git a/mods/ca/missions/main-campaign/ca28-duality/duality.lua b/mods/ca/missions/main-campaign/ca28-duality/duality.lua new file mode 100644 index 0000000000..35a73d5545 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca28-duality/duality.lua @@ -0,0 +1,324 @@ +MissionDir = "ca|missions/main-campaign/ca28-duality" + +RespawnEnabled = Map.LobbyOption("respawn") == "enabled" + +ProdigyPatrolPath = { ProdigyPatrol1.Location, ProdigyPatrol2.Location, ProdigyPatrol3.Location, ProdigyPatrol4.Location, ProdigyPatrol5.Location, ProdigyPatrol6.Location, ProdigyPatrol7.Location, ProdigyPatrol8.Location, ProdigyPatrol9.Location, ProdigyPatrol10.Location, ProdigyPatrol11.Location, ProdigyPatrol12.Location, ProdigyPatrol13.Location, ProdigyPatrol14.Location, ProdigyPatrol15.Location, ProdigyPatrol16.Location, ProdigyPatrol17.Location, ProdigyPatrol18.Location, ProdigyPatrol19.Location, ProdigyPatrol9.Location, ProdigyPatrol8.Location, ProdigyPatrol20.Location } + +ScrinReinforcementInterval = { + easy = DateTime.Seconds(40), + normal = DateTime.Seconds(30), + hard = DateTime.Seconds(20), + vhard = DateTime.Seconds(15), + brutal = DateTime.Seconds(15) +} + +ScrinWaveInterval = { + vhard = DateTime.Seconds(120), + brutal = DateTime.Seconds(60) +} + +SetupPlayers = function() + GDI = Player.GetPlayer("GDI") + Scrin = Player.GetPlayer("Scrin") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = { GDI } + MissionEnemies = { Scrin } +end + +WorldLoaded = function() + SetupPlayers() + + Camera.Position = Commando.CenterPosition + + InitObjectives(GDI) + InitScrin() + + Utils.Do(MissionPlayers, function(p) + Actor.Create("radar.dummy", true, { Owner = p }) + end) + + Commando.GrantCondition("difficulty-" .. Difficulty) + Tanya.GrantCondition("difficulty-" .. Difficulty) + + SetupFindTanyaObjective() + ObjectiveDestroyTiberiumStores = GDI.AddObjective("Destroy all Scrin Tiberium stores.") + SetupKeepAliveObjectives() + + CommandoDeathTrigger(Commando) + TanyaDeathTrigger(Tanya) + + local silos = Scrin.GetActorsByTypes({ "silo.scrin", "silo.scrinblue"}) + NumSilosRemaining = #silos + + Utils.Do(silos, function(a) + Trigger.OnKilled(a, function(self, killer) + SiloKilled(killer) + end) + end) + + if IsHardOrAbove() then + HealCrate2.Destroy() + HealCrate3.Destroy() + + if IsVeryHardOrAbove() then + Trigger.AfterDelay(DateTime.Seconds(30), function() + InitWormholes() + end) + end + end + + if Difficulty == "easy" then + Prodigy.Destroy() + end + + Trigger.AfterDelay(DateTime.Minutes(1), function() + ActivateProdigy() + end) + + UpdateObjectiveText() + AfterWorldLoaded() +end + +Tick = function() + OncePerSecondChecks() + OncePerFiveSecondChecks() + AfterTick() +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + if NumSilosRemaining == 0 and not GDI.IsObjectiveCompleted(ObjectiveDestroyTiberiumStores) then + ObjectiveEscape = GDI.AddObjective("Exit the facility.") + SetEscapeText() + GDI.MarkCompletedObjective(ObjectiveDestroyTiberiumStores) + local exitFlare = Actor.Create("flare", true, { Owner = GDI, Location = Exit.Location }) + Beacon.New(GDI, Exit.CenterPosition) + PlaySpeechNotificationToMissionPlayers("SignalFlare") + Notification("Signal flare detected.") + Trigger.OnEnteredProximityTrigger(Exit.CenterPosition, WDist.New(3 * 1024), function(a, id) + if IsMissionPlayer(a.Owner) and a.Type ~= "flare" then + Trigger.AfterDelay(DateTime.Seconds(5), function() + if not exitFlare.IsDead then + exitFlare.Destroy() + end + end) + if a.Type == "rmbo" then + if not ObjectiveFindTanya or GDI.IsObjectiveCompleted(ObjectiveFindTanya) then + CommandoEscaped = true + if ObjectiveCommandoSurvive ~= nil then + GDI.MarkCompletedObjective(ObjectiveCommandoSurvive) + end + a.Destroy() + end + elseif a.Type == "e7" then + TanyaEscaped = true + if ObjectiveTanyaSurvive ~= nil then + GDI.MarkCompletedObjective(ObjectiveTanyaSurvive) + end + a.Destroy() + end + end + end) + + InitWormholes() + end + + if CommandoEscaped and TanyaEscaped then + GDI.MarkCompletedObjective(ObjectiveEscape) + end + end +end + +OncePerFiveSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 125 == 0 then + local silos = Scrin.GetActorsByTypes({ "silo.scrin", "silo.scrinblue"}) + if #silos == 0 and NumSilosRemaining > 0 then + NumSilosRemaining = 0 + end + end +end + +InitScrin = function() + Scrin.Resources = Scrin.ResourceCapacity + + local scrinGroundAttackers = Scrin.GetGroundAttackers() + + Utils.Do(scrinGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsScrinGroundHunterUnit) + end) +end + +-- overridden in co-op version +UpdateObjectiveText = function() + UserInterface.SetMissionText("Tiberium stores remaining: " .. NumSilosRemaining , HSLColor.Yellow) +end + +ActivateProdigy = function() + if not Prodigy.IsDead then + Notification("We're tracking a powerful Scrin unit. Do not engage!") + MediaCA.PlaySound(MissionDir .. "/c_powerfulscrin.aud", 2) + Prodigy.GrantCondition("activated") + Beacon.New(GDI, Prodigy.CenterPosition) + + if IsHardOrAbove() then + UpdateProdigyTarget() + else + Prodigy.Patrol(ProdigyPatrolPath) + end + end +end + +UpdateProdigyTarget = function() + if not Prodigy.IsDead then + local maintainCurrentTarget = false + + -- if current target has been set and is not dead, determine whether it's close enough to prevent looking for a new target + if ProdigyCurrentTarget ~= nil and not ProdigyCurrentTarget.IsDead then + local closeTargets = Map.ActorsInCircle(Prodigy.CenterPosition, WDist.New(30 * 1024), function(t) + return not t.IsDead and IsMissionPlayer(t.Owner) and (t.Type == "rmbo" or t.Type == "e7") + end) + Utils.Do(closeTargets, function(t) + if t == ProdigyCurrentTarget then + maintainCurrentTarget = true + end + end) + end + + -- if current target hasn't been set yet, or it's dead, or the current target isn't close, randomly select a new target + if not maintainCurrentTarget then + local possibleTargets = GetMissionPlayersActorsByTypes({ "rmbo", "e7" }) + if #possibleTargets > 0 then + ProdigyCurrentTarget = Utils.Random(possibleTargets) + Prodigy.Stop() + Prodigy.AttackMove(ProdigyCurrentTarget.Location) + end + end + end + + Trigger.AfterDelay(DateTime.Seconds(15), function() + UpdateProdigyTarget() + end) +end + +CommandoDeathTrigger = function(commando) + Trigger.OnKilled(commando, function(self, killer) + GDI.MarkFailedObjective(ObjectiveCommandoSurvive) + if RespawnEnabled then + Notification("Commando respawns in 20 seconds.") + Trigger.AfterDelay(DateTime.Seconds(20), function() + local respawnWaypoint = Exit + if NumSilosRemaining == 0 then + respawnWaypoint = EscapeRespawn + end + Commando = Actor.Create("rmbo", true, { Owner = self.Owner, Location = respawnWaypoint.Location }) + Beacon.New(self.Owner, respawnWaypoint.CenterPosition) + PlaySpeechNotificationToMissionPlayers("ReinforcementsArrived") + Commando.GrantCondition("difficulty-" .. Difficulty) + CommandoDeathTrigger(Commando) + end) + end + end) +end + +TanyaDeathTrigger = function(tanya) + Trigger.OnKilled(tanya, function(self, killer) + GDI.MarkFailedObjective(ObjectiveTanyaSurvive) + if RespawnEnabled then + Notification("Tanya respawns in 20 seconds.") + Trigger.AfterDelay(DateTime.Seconds(20), function() + local respawnWaypoint = Exit + if NumSilosRemaining == 0 then + respawnWaypoint = EscapeRespawn + end + Tanya = Actor.Create("e7", true, { Owner = self.Owner, Location = respawnWaypoint.Location }) + Beacon.New(self.Owner, respawnWaypoint.CenterPosition) + PlaySpeechNotificationToMissionPlayers("ReinforcementsArrived") + Tanya.GrantCondition("difficulty-" .. Difficulty) + TanyaDeathTrigger(Tanya) + end) + end + end) +end + +InitWormholes = function() + if WormholesActive then + return + end + WormholesActive = true + Actor.Create("wormhole", true, { Owner = Scrin, Location = WormholeSpawn1.Location }) + Actor.Create("wormhole", true, { Owner = Scrin, Location = WormholeSpawn2.Location }) + Actor.Create("wormhole", true, { Owner = Scrin, Location = WormholeSpawn3.Location }) + Trigger.AfterDelay(DateTime.Seconds(8), function() + ScrinReinforcements() + end) +end + +ScrinReinforcements = function() + local wormholes = Scrin.GetActorsByType("wormhole") + + Utils.Do(wormholes, function(wormhole) + local units = { } + local possibleUnits = { "s1", "s1", "s3", "gscr", "brst2", "s2", "s4" } + for i=1, 4 do + table.insert(units, Utils.Random(possibleUnits)) + end + + Reinforcements.Reinforce(Scrin, units, { wormhole.Location }, 5, function(a) + a.Scatter() + Trigger.AfterDelay(5, function() + if not a.IsDead then + a.AttackMove(Exit.Location) + IdleHunt(a) + end + end) + end) + end) + + local timeUntilNext = ScrinReinforcementInterval[Difficulty] + + if IsVeryHardOrAbove() and not GDI.IsObjectiveCompleted(ObjectiveDestroyTiberiumStores) then + timeUntilNext = ScrinWaveInterval[Difficulty] + end + + Trigger.AfterDelay(timeUntilNext, ScrinReinforcements) +end + +-- overridden in co-op version +SetupFindTanyaObjective = function() + ObjectiveFindTanya = GDI.AddObjective("Find Tanya.") + + Trigger.OnEnteredProximityTrigger(Tanya.CenterPosition, WDist.New(7 * 1024), function(a, id) + if IsMissionPlayer(a.Owner) then + Trigger.RemoveProximityTrigger(id) + Tanya.Owner = GDI + GDI.MarkCompletedObjective(ObjectiveFindTanya) + MediaCA.PlaySound(MissionDir .. "/c_tanya.aud", 2) + end + end) +end + +-- overridden in co-op version +SetupKeepAliveObjectives = function() + if not RespawnEnabled then + ObjectiveCommandoSurvive = GDI.AddObjective("Commando must survive.") + ObjectiveTanyaSurvive = GDI.AddObjective("Tanya must survive.") + else + ObjectiveCommandoSurvive = GDI.AddSecondaryObjective("Keep Commando alive.") + ObjectiveTanyaSurvive = GDI.AddSecondaryObjective("Keep Tanya alive.") + end +end + +-- overridden in co-op version +SiloKilled = function(killer) + NumSilosRemaining = NumSilosRemaining - 1 + UpdateObjectiveText() +end + +SetEscapeText = function() + if GDI.IsObjectiveCompleted(ObjectiveFindTanya) then + UserInterface.SetMissionText("Exit the facility." , HSLColor.Lime) + else + UserInterface.SetMissionText("Find Tanya and exit the facility." , HSLColor.Lime) + end +end \ No newline at end of file diff --git a/mods/ca/missions/main-campaign/ca28-duality/map.bin b/mods/ca/missions/main-campaign/ca28-duality/map.bin new file mode 100644 index 0000000000..f7b04c3a54 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca28-duality/map.bin differ diff --git a/mods/ca/missions/main-campaign/ca28-duality/map.png b/mods/ca/missions/main-campaign/ca28-duality/map.png new file mode 100644 index 0000000000..d651815c52 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca28-duality/map.png differ diff --git a/mods/ca/missions/main-campaign/ca28-duality/map.yaml b/mods/ca/missions/main-campaign/ca28-duality/map.yaml new file mode 100644 index 0000000000..dabed79f92 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca28-duality/map.yaml @@ -0,0 +1,4804 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 28: Duality + +Author: Darkademic + +Tileset: INTERIOR + +MapSize: 98,98 + +Bounds: 1,1,96,96 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: GDI, Scrin + PlayerReference@GDI: + Name: GDI + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: gdi + LockColor: True + Color: F2CF74 + LockSpawn: True + LockTeam: True + Enemies: Scrin, Creeps + PlayerReference@Scrin: + Name: Scrin + Bot: campaign + Faction: scrin + Color: 7700FF + Enemies: GDI, Creeps + +Actors: + Actor88: barb + Owner: Neutral + Location: 85,85 + Actor89: barb + Owner: Neutral + Location: 86,85 + Actor90: barb + Owner: Neutral + Location: 92,85 + Actor91: barb + Owner: Neutral + Location: 93,85 + Actor92: barb + Owner: Neutral + Location: 85,86 + Actor93: barl + Owner: Creeps + Location: 92,86 + Actor94: barb + Owner: Neutral + Location: 93,86 + Actor95: brl3 + Owner: Creeps + Location: 90,87 + Actor96: barl + Owner: Creeps + Location: 89,88 + Actor97: brl3 + Owner: Creeps + Location: 87,89 + Actor98: brl3 + Owner: Creeps + Location: 90,89 + Actor99: barl + Owner: Creeps + Location: 90,90 + Actor100: barl + Owner: Creeps + Location: 87,92 + Actor101: barb + Owner: Neutral + Location: 85,93 + Actor102: brl3 + Owner: Creeps + Location: 89,93 + Actor103: barb + Owner: Neutral + Location: 93,93 + Actor104: barb + Owner: Neutral + Location: 85,94 + Actor105: barb + Owner: Neutral + Location: 86,94 + Actor106: barb + Owner: Neutral + Location: 92,94 + Actor107: barb + Owner: Neutral + Location: 93,94 + Actor83: barb + Owner: Neutral + Location: 40,54 + Actor84: barb + Owner: Neutral + Location: 40,55 + Actor85: barb + Owner: Neutral + Location: 41,54 + Actor86: barb + Owner: Neutral + Location: 43,54 + Actor87: barb + Owner: Neutral + Location: 43,55 + Actor168: barb + Owner: Neutral + Location: 43,56 + Actor169: barb + Owner: Neutral + Location: 42,56 + Actor170: barb + Owner: Neutral + Location: 40,58 + Actor171: barb + Owner: Neutral + Location: 41,58 + Actor172: barb + Owner: Neutral + Location: 42,58 + Actor173: barb + Owner: Neutral + Location: 43,58 + Actor174: barb + Owner: Neutral + Location: 44,59 + Actor175: barb + Owner: Neutral + Location: 44,58 + Actor176: barb + Owner: Neutral + Location: 42,60 + Actor177: barb + Owner: Neutral + Location: 42,61 + Actor178: barb + Owner: Neutral + Location: 43,61 + Actor179: barb + Owner: Neutral + Location: 44,61 + Actor180: barb + Owner: Neutral + Location: 45,61 + Actor181: barb + Owner: Neutral + Location: 44,54 + Actor182: barb + Owner: Neutral + Location: 45,54 + Actor183: barb + Owner: Neutral + Location: 40,63 + Actor184: barb + Owner: Neutral + Location: 41,63 + Actor185: barb + Owner: Neutral + Location: 44,63 + Actor186: barb + Owner: Neutral + Location: 44,64 + Actor187: barl + Owner: Creeps + Location: 7,53 + Actor188: brl3 + Owner: Creeps + Location: 5,54 + Actor189: barl + Owner: Creeps + Location: 4,55 + Actor191: brl3 + Owner: Creeps + Location: 5,56 + Actor192: barl + Owner: Creeps + Location: 5,57 + Actor194: brl3 + Owner: Creeps + Location: 4,60 + Actor566: brik + Owner: Neutral + Location: 37,87 + Actor567: brik + Owner: Neutral + Location: 38,87 + Actor571: brik + Owner: Neutral + Location: 36,87 + Actor572: brik + Owner: Neutral + Location: 36,88 + Actor573: brik + Owner: Neutral + Location: 36,89 + Actor574: brik + Owner: Neutral + Location: 36,90 + Actor575: brik + Owner: Neutral + Location: 37,90 + Actor576: brik + Owner: Neutral + Location: 38,90 + Actor577: brik + Owner: Neutral + Location: 39,90 + Actor580: brik + Owner: Neutral + Location: 42,90 + Actor581: brik + Owner: Neutral + Location: 42,91 + Actor582: brik + Owner: Neutral + Location: 42,92 + Actor583: brik + Owner: Neutral + Location: 42,93 + Actor584: brik + Owner: Neutral + Location: 42,94 + Actor585: brik + Owner: Neutral + Location: 42,95 + Actor586: brik + Owner: Neutral + Location: 39,95 + Actor587: brik + Owner: Neutral + Location: 39,94 + Actor588: brik + Owner: Neutral + Location: 39,93 + Actor589: brik + Owner: Neutral + Location: 39,92 + Actor590: brik + Owner: Neutral + Location: 39,91 + Actor592: brl3 + Owner: Creeps + Location: 3,56 + Actor593: barl + Owner: Creeps + Location: 3,59 + Actor607: brik + Owner: Neutral + Location: 63,87 + Actor608: brik + Owner: Neutral + Location: 62,87 + Actor609: brik + Owner: Neutral + Location: 61,87 + Actor610: brik + Owner: Neutral + Location: 60,87 + Actor614: brik + Owner: Neutral + Location: 63,88 + Actor615: brik + Owner: Neutral + Location: 63,89 + Actor616: brik + Owner: Neutral + Location: 63,90 + Actor617: brik + Owner: Neutral + Location: 62,90 + Actor618: brik + Owner: Neutral + Location: 61,90 + Actor619: brik + Owner: Neutral + Location: 60,90 + Actor620: brik + Owner: Neutral + Location: 67,87 + Actor621: brik + Owner: Neutral + Location: 68,87 + Actor622: brik + Owner: Neutral + Location: 69,87 + Actor623: brik + Owner: Neutral + Location: 70,87 + Actor624: brik + Owner: Neutral + Location: 70,86 + Actor625: brik + Owner: Neutral + Location: 67,90 + Actor626: brik + Owner: Neutral + Location: 67,89 + Actor627: brik + Owner: Neutral + Location: 67,88 + Actor628: brik + Owner: Neutral + Location: 68,90 + Actor629: brik + Owner: Neutral + Location: 69,90 + Actor630: brik + Owner: Neutral + Location: 70,90 + Actor631: brik + Owner: Neutral + Location: 70,91 + Actor632: brik + Owner: Neutral + Location: 70,92 + Actor633: brik + Owner: Neutral + Location: 60,91 + Actor634: brik + Owner: Neutral + Location: 60,92 + Actor635: brik + Owner: Neutral + Location: 64,83 + Actor636: brik + Owner: Neutral + Location: 65,83 + Actor637: brik + Owner: Neutral + Location: 66,83 + Actor638: brik + Owner: Neutral + Location: 66,82 + Actor639: brik + Owner: Neutral + Location: 66,81 + Actor640: brik + Owner: Neutral + Location: 66,80 + Actor641: brik + Owner: Neutral + Location: 66,79 + Actor642: brik + Owner: Neutral + Location: 63,83 + Actor643: brik + Owner: Neutral + Location: 62,83 + Actor644: brik + Owner: Neutral + Location: 70,80 + Actor645: brik + Owner: Neutral + Location: 70,81 + Actor646: brik + Owner: Neutral + Location: 71,80 + Actor647: brik + Owner: Neutral + Location: 72,80 + Actor648: brik + Owner: Neutral + Location: 73,80 + Actor649: brik + Owner: Neutral + Location: 70,82 + Actor650: brik + Owner: Neutral + Location: 70,83 + Actor651: brik + Owner: Neutral + Location: 74,80 + Actor652: brik + Owner: Neutral + Location: 75,80 + Actor653: brik + Owner: Neutral + Location: 70,75 + Actor654: brik + Owner: Neutral + Location: 71,75 + Actor655: brik + Owner: Neutral + Location: 72,75 + Actor656: brik + Owner: Neutral + Location: 73,75 + Actor657: brik + Owner: Neutral + Location: 74,75 + Actor658: brik + Owner: Neutral + Location: 74,74 + Actor659: brik + Owner: Neutral + Location: 74,73 + Actor660: brik + Owner: Neutral + Location: 74,72 + Actor661: brik + Owner: Neutral + Location: 74,71 + Actor662: brik + Owner: Neutral + Location: 74,70 + Actor663: brik + Owner: Neutral + Location: 70,61 + Actor664: brik + Owner: Neutral + Location: 71,61 + Actor665: brik + Owner: Neutral + Location: 72,61 + Actor666: brik + Owner: Neutral + Location: 73,61 + Actor667: brik + Owner: Neutral + Location: 74,61 + Actor668: brik + Owner: Neutral + Location: 74,62 + Actor669: brik + Owner: Neutral + Location: 74,63 + Actor670: brik + Owner: Neutral + Location: 74,64 + Actor671: brik + Owner: Neutral + Location: 74,65 + Actor672: brik + Owner: Neutral + Location: 70,62 + Actor673: brik + Owner: Neutral + Location: 70,63 + Actor674: brik + Owner: Neutral + Location: 70,65 + Actor675: brik + Owner: Neutral + Location: 70,66 + Actor676: brik + Owner: Neutral + Location: 70,64 + Actor677: brik + Owner: Neutral + Location: 70,67 + Actor678: brik + Owner: Neutral + Location: 70,68 + Actor679: brik + Owner: Neutral + Location: 70,69 + Actor680: brik + Owner: Neutral + Location: 55,60 + Actor681: brik + Owner: Neutral + Location: 56,60 + Actor682: brik + Owner: Neutral + Location: 57,60 + Actor683: brik + Owner: Neutral + Location: 58,60 + Actor684: brik + Owner: Neutral + Location: 59,60 + Actor685: brik + Owner: Neutral + Location: 55,61 + Actor686: brik + Owner: Neutral + Location: 55,62 + Actor687: brik + Owner: Neutral + Location: 55,63 + Actor688: brik + Owner: Neutral + Location: 55,64 + Actor689: brik + Owner: Neutral + Location: 55,65 + Actor690: brik + Owner: Neutral + Location: 55,66 + Actor691: brik + Owner: Neutral + Location: 55,67 + Actor692: brik + Owner: Neutral + Location: 59,66 + Actor693: brik + Owner: Neutral + Location: 59,64 + Actor694: brik + Owner: Neutral + Location: 59,63 + Actor695: brik + Owner: Neutral + Location: 59,62 + Actor696: brik + Owner: Neutral + Location: 59,61 + Actor697: brik + Owner: Neutral + Location: 59,65 + Actor698: brik + Owner: Neutral + Location: 46,65 + Actor699: brik + Owner: Neutral + Location: 45,65 + Actor700: brik + Owner: Neutral + Location: 44,65 + Actor701: brik + Owner: Neutral + Location: 44,66 + Actor702: brik + Owner: Neutral + Location: 44,67 + Actor703: brik + Owner: Neutral + Location: 45,67 + Actor704: brik + Owner: Neutral + Location: 46,67 + Actor705: brik + Owner: Neutral + Location: 47,67 + Actor706: brik + Owner: Neutral + Location: 48,67 + Actor707: brik + Owner: Neutral + Location: 49,67 + Actor708: brik + Owner: Neutral + Location: 50,67 + Actor709: brik + Owner: Neutral + Location: 51,67 + Actor710: brik + Owner: Neutral + Location: 51,66 + Actor711: brik + Owner: Neutral + Location: 51,65 + Actor712: brik + Owner: Neutral + Location: 51,64 + Actor713: brik + Owner: Neutral + Location: 51,63 + Actor714: brik + Owner: Neutral + Location: 51,62 + Actor715: brik + Owner: Neutral + Location: 46,63 + Actor716: brik + Owner: Neutral + Location: 46,64 + Actor717: brik + Owner: Neutral + Location: 46,62 + Actor718: brik + Owner: Neutral + Location: 46,61 + Actor719: brik + Owner: Neutral + Location: 46,60 + Actor720: brik + Owner: Neutral + Location: 46,59 + Actor721: brik + Owner: Neutral + Location: 46,58 + Actor722: brik + Owner: Neutral + Location: 46,53 + Actor723: brik + Owner: Neutral + Location: 47,53 + Actor724: brik + Owner: Neutral + Location: 48,53 + Actor725: brik + Owner: Neutral + Location: 46,54 + Actor726: brik + Owner: Neutral + Location: 46,55 + Actor727: brik + Owner: Neutral + Location: 49,53 + Actor728: brik + Owner: Neutral + Location: 39,53 + Actor729: brik + Owner: Neutral + Location: 38,53 + Actor730: brik + Owner: Neutral + Location: 37,53 + Actor731: brik + Owner: Neutral + Location: 36,53 + Actor732: brik + Owner: Neutral + Location: 39,54 + Actor733: brik + Owner: Neutral + Location: 39,55 + Actor734: brik + Owner: Neutral + Location: 39,56 + Actor735: brik + Owner: Neutral + Location: 39,57 + Actor736: brik + Owner: Neutral + Location: 39,58 + Actor737: brik + Owner: Neutral + Location: 44,71 + Actor738: brik + Owner: Neutral + Location: 44,72 + Actor739: brik + Owner: Neutral + Location: 44,73 + Actor740: brik + Owner: Neutral + Location: 45,73 + Actor741: brik + Owner: Neutral + Location: 46,73 + Actor742: brik + Owner: Neutral + Location: 45,71 + Actor743: brik + Owner: Neutral + Location: 46,71 + Actor744: brik + Owner: Neutral + Location: 47,71 + Actor745: brik + Owner: Neutral + Location: 48,71 + Actor746: brik + Owner: Neutral + Location: 49,71 + Actor747: brik + Owner: Neutral + Location: 50,71 + Actor748: brik + Owner: Neutral + Location: 51,71 + Actor749: brik + Owner: Neutral + Location: 51,72 + Actor750: brik + Owner: Neutral + Location: 51,73 + Actor751: brik + Owner: Neutral + Location: 50,73 + Actor752: brik + Owner: Neutral + Location: 49,73 + Actor753: brik + Owner: Neutral + Location: 48,73 + Actor754: brik + Owner: Neutral + Location: 47,73 + Actor755: brik + Owner: Neutral + Location: 55,73 + Actor756: brik + Owner: Neutral + Location: 55,72 + Actor757: brik + Owner: Neutral + Location: 55,71 + Actor758: brik + Owner: Neutral + Location: 56,73 + Actor759: brik + Owner: Neutral + Location: 57,73 + Actor760: brik + Owner: Neutral + Location: 58,73 + Actor761: brik + Owner: Neutral + Location: 59,73 + Actor762: brik + Owner: Neutral + Location: 55,70 + Actor763: brik + Owner: Neutral + Location: 55,69 + Actor764: brik + Owner: Neutral + Location: 69,55 + Actor765: brik + Owner: Neutral + Location: 70,55 + Actor766: brik + Owner: Neutral + Location: 70,56 + Actor767: brik + Owner: Neutral + Location: 71,56 + Actor768: brik + Owner: Neutral + Location: 68,55 + Actor769: brik + Owner: Neutral + Location: 43,48 + Actor770: brik + Owner: Neutral + Location: 44,48 + Actor771: brik + Owner: Neutral + Location: 42,48 + Actor772: brik + Owner: Neutral + Location: 42,47 + Actor773: brik + Owner: Neutral + Location: 42,46 + Actor774: brik + Owner: Neutral + Location: 43,46 + Actor775: brik + Owner: Neutral + Location: 44,46 + Actor776: brik + Owner: Neutral + Location: 45,46 + Actor777: brik + Owner: Neutral + Location: 45,47 + Actor778: brik + Owner: Neutral + Location: 45,48 + Actor779: brik + Owner: Neutral + Location: 36,43 + Actor780: brik + Owner: Neutral + Location: 37,43 + Actor781: brik + Owner: Neutral + Location: 38,43 + Actor782: brik + Owner: Neutral + Location: 39,43 + Actor783: brik + Owner: Neutral + Location: 39,42 + Actor784: brik + Owner: Neutral + Location: 39,41 + Actor785: brik + Owner: Neutral + Location: 38,41 + Actor786: brik + Owner: Neutral + Location: 37,41 + Actor787: brik + Owner: Neutral + Location: 36,41 + Actor788: brik + Owner: Neutral + Location: 36,42 + Actor789: brik + Owner: Neutral + Location: 28,40 + Actor790: brik + Owner: Neutral + Location: 29,40 + Actor791: brik + Owner: Neutral + Location: 30,40 + Actor792: brik + Owner: Neutral + Location: 31,40 + Actor793: brik + Owner: Neutral + Location: 31,39 + Actor794: brik + Owner: Neutral + Location: 31,38 + Actor795: brik + Owner: Neutral + Location: 31,37 + Actor796: brik + Owner: Neutral + Location: 32,37 + Actor797: brik + Owner: Neutral + Location: 33,37 + Actor798: brik + Owner: Neutral + Location: 34,37 + Actor799: brik + Owner: Neutral + Location: 35,37 + Actor800: brik + Owner: Neutral + Location: 36,37 + Actor801: brik + Owner: Neutral + Location: 37,37 + Actor802: brik + Owner: Neutral + Location: 38,37 + Actor803: brik + Owner: Neutral + Location: 39,37 + Actor804: brik + Owner: Neutral + Location: 39,36 + Actor805: brik + Owner: Neutral + Location: 39,35 + Actor806: brik + Owner: Neutral + Location: 39,34 + Actor807: brik + Owner: Neutral + Location: 35,34 + Actor808: brik + Owner: Neutral + Location: 36,34 + Actor809: brik + Owner: Neutral + Location: 37,34 + Actor810: brik + Owner: Neutral + Location: 38,34 + Actor811: brik + Owner: Neutral + Location: 35,33 + Actor812: brik + Owner: Neutral + Location: 35,32 + Actor813: brik + Owner: Neutral + Location: 35,31 + Actor814: brik + Owner: Neutral + Location: 35,30 + Actor815: brik + Owner: Neutral + Location: 32,30 + Actor816: brik + Owner: Neutral + Location: 33,30 + Actor817: brik + Owner: Neutral + Location: 34,30 + Actor818: brik + Owner: Neutral + Location: 32,31 + Actor819: brik + Owner: Neutral + Location: 32,32 + Actor828: brik + Owner: Neutral + Location: 21,40 + Actor829: brik + Owner: Neutral + Location: 21,38 + Actor830: brik + Owner: Neutral + Location: 21,39 + Actor831: brik + Owner: Neutral + Location: 21,37 + Actor832: brik + Owner: Neutral + Location: 21,36 + Actor833: brik + Owner: Neutral + Location: 22,40 + Actor834: brik + Owner: Neutral + Location: 24,40 + Actor835: brik + Owner: Neutral + Location: 23,40 + Actor836: brik + Owner: Neutral + Location: 25,40 + Actor837: brik + Owner: Neutral + Location: 27,40 + Actor838: brik + Owner: Neutral + Location: 26,40 + Actor839: brik + Owner: Neutral + Location: 21,43 + Actor840: brik + Owner: Neutral + Location: 21,44 + Actor841: brik + Owner: Neutral + Location: 21,45 + Actor842: brik + Owner: Neutral + Location: 21,46 + Actor843: brik + Owner: Neutral + Location: 22,43 + Actor844: brik + Owner: Neutral + Location: 23,43 + Actor845: brik + Owner: Neutral + Location: 24,43 + Actor846: brik + Owner: Neutral + Location: 25,43 + Actor847: brik + Owner: Neutral + Location: 26,43 + Actor848: brik + Owner: Neutral + Location: 27,43 + Actor849: brik + Owner: Neutral + Location: 28,43 + Actor850: brik + Owner: Neutral + Location: 29,43 + Actor851: brik + Owner: Neutral + Location: 30,43 + Actor852: brik + Owner: Neutral + Location: 31,43 + Actor853: brik + Owner: Neutral + Location: 31,44 + Actor854: brik + Owner: Neutral + Location: 31,45 + Actor855: brik + Owner: Neutral + Location: 31,46 + Actor856: brik + Owner: Neutral + Location: 31,47 + Actor857: brik + Owner: Neutral + Location: 31,48 + Actor858: brik + Owner: Neutral + Location: 31,49 + Actor859: brik + Owner: Neutral + Location: 31,51 + Actor860: brik + Owner: Neutral + Location: 31,50 + Actor861: brik + Owner: Neutral + Location: 31,52 + Actor862: brik + Owner: Neutral + Location: 31,53 + Actor863: brik + Owner: Neutral + Location: 32,53 + Actor864: brik + Owner: Neutral + Location: 21,47 + Actor865: brik + Owner: Neutral + Location: 21,48 + Actor866: brik + Owner: Neutral + Location: 21,50 + Actor867: brik + Owner: Neutral + Location: 21,49 + Actor868: brik + Owner: Neutral + Location: 21,51 + Actor869: brik + Owner: Neutral + Location: 21,52 + Actor870: brik + Owner: Neutral + Location: 14,50 + Actor871: brik + Owner: Neutral + Location: 14,49 + Actor872: brik + Owner: Neutral + Location: 13,49 + Actor873: brik + Owner: Neutral + Location: 13,48 + Actor874: brik + Owner: Neutral + Location: 13,47 + Actor875: brik + Owner: Neutral + Location: 13,46 + Actor876: brik + Owner: Neutral + Location: 13,45 + Actor877: brik + Owner: Neutral + Location: 13,44 + Actor878: brik + Owner: Neutral + Location: 14,44 + Actor879: brik + Owner: Neutral + Location: 14,43 + Actor880: brik + Owner: Neutral + Location: 14,42 + Actor882: brik + Owner: Neutral + Location: 15,50 + Actor883: brik + Owner: Neutral + Location: 16,50 + Actor884: brik + Owner: Neutral + Location: 17,50 + Actor885: brik + Owner: Neutral + Location: 18,50 + Actor886: brik + Owner: Neutral + Location: 6,49 + Actor887: brik + Owner: Neutral + Location: 7,49 + Actor888: brik + Owner: Neutral + Location: 8,49 + Actor889: brik + Owner: Neutral + Location: 9,49 + Actor890: brik + Owner: Neutral + Location: 9,48 + Actor891: brik + Owner: Neutral + Location: 9,47 + Actor892: brik + Owner: Neutral + Location: 9,46 + Actor893: brik + Owner: Neutral + Location: 9,45 + Actor894: brik + Owner: Neutral + Location: 9,44 + Actor895: brik + Owner: Neutral + Location: 8,44 + Actor896: brik + Owner: Neutral + Location: 6,44 + Actor897: brik + Owner: Neutral + Location: 7,44 + Actor898: brik + Owner: Neutral + Location: 5,44 + Actor899: brik + Owner: Neutral + Location: 4,44 + Actor900: brik + Owner: Neutral + Location: 3,44 + Actor901: brik + Owner: Neutral + Location: 10,35 + Actor902: brik + Owner: Neutral + Location: 8,35 + Actor903: brik + Owner: Neutral + Location: 9,35 + Actor904: brik + Owner: Neutral + Location: 7,35 + Actor905: brik + Owner: Neutral + Location: 5,35 + Actor906: brik + Owner: Neutral + Location: 6,35 + Actor907: brik + Owner: Neutral + Location: 4,35 + Actor908: brik + Owner: Neutral + Location: 3,35 + Actor909: brik + Owner: Neutral + Location: 10,34 + Actor910: brik + Owner: Neutral + Location: 10,33 + Actor911: brik + Owner: Neutral + Location: 10,32 + Actor912: brik + Owner: Neutral + Location: 10,31 + Actor913: brik + Owner: Neutral + Location: 10,30 + Actor914: brik + Owner: Neutral + Location: 10,29 + Actor915: brik + Owner: Neutral + Location: 10,25 + Actor916: brik + Owner: Neutral + Location: 10,26 + Actor917: brik + Owner: Neutral + Location: 10,27 + Actor918: brik + Owner: Neutral + Location: 10,28 + Actor919: brik + Owner: Neutral + Location: 9,25 + Actor920: brik + Owner: Neutral + Location: 8,25 + Actor921: brik + Owner: Neutral + Location: 7,25 + Actor922: brik + Owner: Neutral + Location: 7,26 + Actor923: brik + Owner: Neutral + Location: 7,27 + Actor924: brik + Owner: Neutral + Location: 6,28 + Actor925: brik + Owner: Neutral + Location: 7,28 + Actor926: brik + Owner: Neutral + Location: 6,18 + Actor927: brik + Owner: Neutral + Location: 6,17 + Actor928: brik + Owner: Neutral + Location: 6,16 + Actor929: brik + Owner: Neutral + Location: 6,15 + Actor930: brik + Owner: Neutral + Location: 7,18 + Actor931: brik + Owner: Neutral + Location: 8,18 + Actor932: brik + Owner: Neutral + Location: 8,19 + Actor933: brik + Owner: Neutral + Location: 8,20 + Actor934: brik + Owner: Neutral + Location: 9,21 + Actor935: brik + Owner: Neutral + Location: 8,21 + Actor936: brik + Owner: Neutral + Location: 10,21 + Actor937: brik + Owner: Neutral + Location: 11,21 + Actor938: brik + Owner: Neutral + Location: 12,21 + Actor939: brik + Owner: Neutral + Location: 13,21 + Actor940: brik + Owner: Neutral + Location: 5,28 + Actor941: brik + Owner: Neutral + Location: 4,28 + Actor942: brik + Owner: Neutral + Location: 3,28 + Actor943: brik + Owner: Neutral + Location: 3,18 + Actor944: brik + Owner: Neutral + Location: 3,17 + Actor945: brik + Owner: Neutral + Location: 3,16 + Actor946: brik + Owner: Neutral + Location: 3,15 + Actor947: brik + Owner: Neutral + Location: 1,15 + Actor948: brik + Owner: Neutral + Location: 2,15 + Actor949: brik + Owner: Neutral + Location: 2,18 + Actor950: brik + Owner: Neutral + Location: 1,18 + Actor951: brik + Owner: Neutral + Location: 7,15 + Actor952: brik + Owner: Neutral + Location: 8,15 + Actor953: brik + Owner: Neutral + Location: 9,15 + Actor954: brik + Owner: Neutral + Location: 10,15 + Actor955: brik + Owner: Neutral + Location: 10,16 + Actor956: brik + Owner: Neutral + Location: 10,17 + Actor957: brik + Owner: Neutral + Location: 11,18 + Actor958: brik + Owner: Neutral + Location: 10,18 + Actor959: brik + Owner: Neutral + Location: 12,18 + Actor960: brik + Owner: Neutral + Location: 14,18 + Actor961: brik + Owner: Neutral + Location: 15,18 + Actor962: brik + Owner: Neutral + Location: 16,18 + Actor963: brik + Owner: Neutral + Location: 13,18 + Actor964: brik + Owner: Neutral + Location: 16,17 + Actor965: brik + Owner: Neutral + Location: 16,16 + Actor966: brik + Owner: Neutral + Location: 16,14 + Actor967: brik + Owner: Neutral + Location: 16,13 + Actor968: brik + Owner: Neutral + Location: 16,12 + Actor969: brik + Owner: Neutral + Location: 16,11 + Actor970: brik + Owner: Neutral + Location: 16,15 + Actor971: brik + Owner: Neutral + Location: 17,11 + Actor972: brik + Owner: Neutral + Location: 18,11 + Actor973: brik + Owner: Neutral + Location: 18,12 + Actor974: brik + Owner: Neutral + Location: 18,13 + Actor975: brik + Owner: Neutral + Location: 18,14 + Actor976: brik + Owner: Neutral + Location: 18,15 + Actor977: brik + Owner: Neutral + Location: 18,16 + Actor978: brik + Owner: Neutral + Location: 18,17 + Actor979: brik + Owner: Neutral + Location: 18,18 + Actor980: brik + Owner: Neutral + Location: 18,19 + Actor981: brik + Owner: Neutral + Location: 18,20 + Actor982: brik + Owner: Neutral + Location: 21,20 + Actor983: brik + Owner: Neutral + Location: 21,19 + Actor984: brik + Owner: Neutral + Location: 21,18 + Actor985: brik + Owner: Neutral + Location: 22,18 + Actor986: brik + Owner: Neutral + Location: 24,18 + Actor987: brik + Owner: Neutral + Location: 25,18 + Actor988: brik + Owner: Neutral + Location: 23,18 + Actor989: brik + Owner: Neutral + Location: 26,18 + Actor990: brik + Owner: Neutral + Location: 27,18 + Actor991: brik + Owner: Neutral + Location: 28,18 + Actor992: brik + Owner: Neutral + Location: 29,18 + Actor993: brik + Owner: Neutral + Location: 29,17 + Actor994: brik + Owner: Neutral + Location: 29,16 + Actor995: brik + Owner: Neutral + Location: 29,14 + Actor996: brik + Owner: Neutral + Location: 29,15 + Actor997: brik + Owner: Neutral + Location: 29,13 + Actor998: brik + Owner: Neutral + Location: 29,12 + Actor999: brik + Owner: Neutral + Location: 29,11 + Actor1000: brik + Owner: Neutral + Location: 31,11 + Actor1001: brik + Owner: Neutral + Location: 30,11 + Actor1002: brik + Owner: Neutral + Location: 32,11 + Actor1003: brik + Owner: Neutral + Location: 32,12 + Actor1004: brik + Owner: Neutral + Location: 32,13 + Actor1005: brik + Owner: Neutral + Location: 32,14 + Actor1006: brik + Owner: Neutral + Location: 32,15 + Actor1007: brik + Owner: Neutral + Location: 32,16 + Actor1008: brik + Owner: Neutral + Location: 32,17 + Actor1009: brik + Owner: Neutral + Location: 32,18 + Actor1010: brik + Owner: Neutral + Location: 33,18 + Actor1011: brik + Owner: Neutral + Location: 34,18 + Actor1012: brik + Owner: Neutral + Location: 35,18 + Actor1013: brik + Owner: Neutral + Location: 36,18 + Actor1014: brik + Owner: Neutral + Location: 36,17 + Actor1015: brik + Owner: Neutral + Location: 37,17 + Actor1016: brik + Owner: Neutral + Location: 38,17 + Actor1017: brik + Owner: Neutral + Location: 39,17 + Actor1018: brik + Owner: Neutral + Location: 39,18 + Actor1019: brik + Owner: Neutral + Location: 39,19 + Actor1020: brik + Owner: Neutral + Location: 39,20 + Actor1021: brik + Owner: Neutral + Location: 39,21 + Actor1022: brik + Owner: Neutral + Location: 39,22 + Actor1023: brik + Owner: Neutral + Location: 39,23 + Actor1024: brik + Owner: Neutral + Location: 39,24 + Actor1025: brik + Owner: Neutral + Location: 38,24 + Actor1026: brik + Owner: Neutral + Location: 37,24 + Actor1027: brik + Owner: Neutral + Location: 36,24 + Actor1028: brik + Owner: Neutral + Location: 35,24 + Actor1029: brik + Owner: Neutral + Location: 35,27 + Actor1030: brik + Owner: Neutral + Location: 33,27 + Actor1031: brik + Owner: Neutral + Location: 32,27 + Actor1032: brik + Owner: Neutral + Location: 32,26 + Actor1033: brik + Owner: Neutral + Location: 32,25 + Actor1034: brik + Owner: Neutral + Location: 32,24 + Actor1035: brik + Owner: Neutral + Location: 34,27 + Actor1036: brik + Owner: Neutral + Location: 35,26 + Actor1037: brik + Owner: Neutral + Location: 35,25 + Actor1038: brik + Owner: Neutral + Location: 36,12 + Actor1039: brik + Owner: Neutral + Location: 36,13 + Actor1040: brik + Owner: Neutral + Location: 36,11 + Actor1041: brik + Owner: Neutral + Location: 36,10 + Actor1042: brik + Owner: Neutral + Location: 36,9 + Actor1043: brik + Owner: Neutral + Location: 36,8 + Actor1044: brik + Owner: Neutral + Location: 36,7 + Actor1045: brik + Owner: Neutral + Location: 34,7 + Actor1046: brik + Owner: Neutral + Location: 35,7 + Actor1047: brik + Owner: Neutral + Location: 37,13 + Actor1048: brik + Owner: Neutral + Location: 38,13 + Actor1049: brik + Owner: Neutral + Location: 39,13 + Actor1050: brik + Owner: Neutral + Location: 40,13 + Actor1051: brik + Owner: Neutral + Location: 41,13 + Actor1052: brik + Owner: Neutral + Location: 42,13 + Actor1054: brik + Owner: Neutral + Location: 29,7 + Actor1055: brik + Owner: Neutral + Location: 29,5 + Actor1056: brik + Owner: Neutral + Location: 29,6 + Actor1057: brik + Owner: Neutral + Location: 29,4 + Actor1058: brik + Owner: Neutral + Location: 30,7 + Actor1059: brik + Owner: Neutral + Location: 31,7 + Actor1060: brik + Owner: Neutral + Location: 32,7 + Actor1061: brik + Owner: Neutral + Location: 33,7 + Actor1062: brik + Owner: Neutral + Location: 23,6 + Actor1063: brik + Owner: Neutral + Location: 24,6 + Actor1064: brik + Owner: Neutral + Location: 25,6 + Actor1065: brik + Owner: Neutral + Location: 25,7 + Actor1066: brik + Owner: Neutral + Location: 25,8 + Actor1067: brik + Owner: Neutral + Location: 25,9 + Actor1068: brik + Owner: Neutral + Location: 25,10 + Actor1069: brik + Owner: Neutral + Location: 25,11 + Actor1070: brik + Owner: Neutral + Location: 25,12 + Actor1071: brik + Owner: Neutral + Location: 25,13 + Actor1072: brik + Owner: Neutral + Location: 24,13 + Actor1073: brik + Owner: Neutral + Location: 23,13 + Actor1074: brik + Owner: Neutral + Location: 23,12 + Actor1075: brik + Owner: Neutral + Location: 23,11 + Actor1076: brik + Owner: Neutral + Location: 23,10 + Actor1077: brik + Owner: Neutral + Location: 23,9 + Actor1078: brik + Owner: Neutral + Location: 23,8 + Actor1079: brik + Owner: Neutral + Location: 23,7 + Actor1080: brik + Owner: Neutral + Location: 16,5 + Actor1081: brik + Owner: Neutral + Location: 17,5 + Actor1082: brik + Owner: Neutral + Location: 18,5 + Actor1083: brik + Owner: Neutral + Location: 18,4 + Actor1084: brik + Owner: Neutral + Location: 18,3 + Actor1085: brik + Owner: Neutral + Location: 18,2 + Actor1086: brik + Owner: Neutral + Location: 18,1 + Actor1087: brik + Owner: Neutral + Location: 16,4 + Actor1088: brik + Owner: Neutral + Location: 16,3 + Actor1089: brik + Owner: Neutral + Location: 16,2 + Actor1090: brik + Owner: Neutral + Location: 16,1 + Actor1091: brik + Owner: Neutral + Location: 9,8 + Actor1092: brik + Owner: Neutral + Location: 8,9 + Actor1093: brik + Owner: Neutral + Location: 9,9 + Actor1094: brik + Owner: Neutral + Location: 8,8 + Actor1095: brik + Owner: Neutral + Location: 8,7 + Actor1096: brik + Owner: Neutral + Location: 9,7 + Actor1097: brik + Owner: Neutral + Location: 8,6 + Actor1098: brik + Owner: Neutral + Location: 9,6 + Actor1099: brik + Owner: Neutral + Location: 1,14 + Actor1100: brik + Owner: Neutral + Location: 1,13 + Actor1101: brik + Owner: Neutral + Location: 14,21 + Actor1102: brik + Owner: Neutral + Location: 14,26 + Actor1103: brik + Owner: Neutral + Location: 14,24 + Actor1104: brik + Owner: Neutral + Location: 14,22 + Actor1105: brik + Owner: Neutral + Location: 14,23 + Actor1106: brik + Owner: Neutral + Location: 14,25 + Actor1107: brik + Owner: Neutral + Location: 26,92 + Actor1108: brik + Owner: Neutral + Location: 26,91 + Actor1109: brik + Owner: Neutral + Location: 26,90 + Actor1110: brik + Owner: Neutral + Location: 26,89 + Actor1111: brik + Owner: Neutral + Location: 26,88 + Actor1112: brik + Owner: Neutral + Location: 28,88 + Actor1113: brik + Owner: Neutral + Location: 27,88 + Actor1114: brik + Owner: Neutral + Location: 29,88 + Actor1115: brik + Owner: Neutral + Location: 29,87 + Actor1116: brik + Owner: Neutral + Location: 29,86 + Actor1117: brik + Owner: Neutral + Location: 29,85 + Actor1118: brik + Owner: Neutral + Location: 27,92 + Actor1119: brik + Owner: Neutral + Location: 28,92 + Actor1120: brik + Owner: Neutral + Location: 29,92 + Actor1121: brik + Owner: Neutral + Location: 29,91 + Actor1122: brik + Owner: Neutral + Location: 29,90 + Actor1123: brik + Owner: Neutral + Location: 30,90 + Actor1124: brik + Owner: Neutral + Location: 32,90 + Actor1125: brik + Owner: Neutral + Location: 32,89 + Actor1126: brik + Owner: Neutral + Location: 31,90 + Actor1127: brik + Owner: Neutral + Location: 32,88 + Actor1128: brik + Owner: Neutral + Location: 32,86 + Actor1129: brik + Owner: Neutral + Location: 32,87 + Actor1130: brik + Owner: Neutral + Location: 26,95 + Actor1131: brik + Owner: Neutral + Location: 28,95 + Actor1132: brik + Owner: Neutral + Location: 29,95 + Actor1133: brik + Owner: Neutral + Location: 27,95 + Actor1134: brik + Owner: Neutral + Location: 26,96 + Actor1135: brik + Owner: Neutral + Location: 29,96 + Actor1136: brik + Owner: Neutral + Location: 30,96 + Actor1137: brik + Owner: Neutral + Location: 25,96 + Actor1138: brik + Owner: Neutral + Location: 15,92 + Actor1139: brik + Owner: Neutral + Location: 16,92 + Actor1140: brik + Owner: Neutral + Location: 18,92 + Actor1141: brik + Owner: Neutral + Location: 17,92 + Actor1142: brik + Owner: Neutral + Location: 15,91 + Actor1143: brik + Owner: Neutral + Location: 15,90 + Actor1144: brik + Owner: Neutral + Location: 15,89 + Actor1145: brik + Owner: Neutral + Location: 15,88 + Actor1146: brik + Owner: Neutral + Location: 16,88 + Actor1147: brik + Owner: Neutral + Location: 18,88 + Actor1148: brik + Owner: Neutral + Location: 17,88 + Actor1149: brik + Owner: Neutral + Location: 18,87 + Actor1150: brik + Owner: Neutral + Location: 18,86 + Actor1151: brik + Owner: Neutral + Location: 18,85 + Actor1152: brik + Owner: Neutral + Location: 18,84 + Actor1153: brik + Owner: Neutral + Location: 18,83 + Actor1154: brik + Owner: Neutral + Location: 18,82 + Actor1155: brik + Owner: Neutral + Location: 18,91 + Actor1156: brik + Owner: Neutral + Location: 18,90 + Actor1157: brik + Owner: Neutral + Location: 20,90 + Actor1158: brik + Owner: Neutral + Location: 19,90 + Actor1159: brik + Owner: Neutral + Location: 21,90 + Actor1160: brik + Owner: Neutral + Location: 22,90 + Actor1161: brik + Owner: Neutral + Location: 22,89 + Actor1162: brik + Owner: Neutral + Location: 22,88 + Actor1163: brik + Owner: Neutral + Location: 22,87 + Actor1164: brik + Owner: Neutral + Location: 22,86 + Actor1165: brik + Owner: Neutral + Location: 15,95 + Actor1166: brik + Owner: Neutral + Location: 16,95 + Actor1167: brik + Owner: Neutral + Location: 17,95 + Actor1168: brik + Owner: Neutral + Location: 18,95 + Actor1169: brik + Owner: Neutral + Location: 18,96 + Actor1170: brik + Owner: Neutral + Location: 15,96 + Actor1171: brik + Owner: Neutral + Location: 19,96 + Actor1172: brik + Owner: Neutral + Location: 13,96 + Actor1173: brik + Owner: Neutral + Location: 14,96 + Actor1174: brik + Owner: Neutral + Location: 5,82 + Actor1175: brik + Owner: Neutral + Location: 5,81 + Actor1176: brik + Owner: Neutral + Location: 5,80 + Actor1177: brik + Owner: Neutral + Location: 5,79 + Actor1178: brik + Owner: Neutral + Location: 5,78 + Actor1179: brik + Owner: Neutral + Location: 5,77 + Actor1180: brik + Owner: Neutral + Location: 6,77 + Actor1181: brik + Owner: Neutral + Location: 7,77 + Actor1182: brik + Owner: Neutral + Location: 6,82 + Actor1183: brik + Owner: Neutral + Location: 7,82 + Actor1184: brik + Owner: Neutral + Location: 8,82 + Actor1185: brik + Owner: Neutral + Location: 9,82 + Actor1186: brik + Owner: Neutral + Location: 10,82 + Actor1187: brik + Owner: Neutral + Location: 12,82 + Actor1188: brik + Owner: Neutral + Location: 11,82 + Actor1189: brik + Owner: Neutral + Location: 7,76 + Actor1190: brik + Owner: Neutral + Location: 7,75 + Actor1191: brik + Owner: Neutral + Location: 7,74 + Actor1192: brik + Owner: Neutral + Location: 9,74 + Actor1193: brik + Owner: Neutral + Location: 10,74 + Actor1194: brik + Owner: Neutral + Location: 8,74 + Actor1195: brik + Owner: Neutral + Location: 10,75 + Actor1196: brik + Owner: Neutral + Location: 10,76 + Actor1197: brik + Owner: Neutral + Location: 10,77 + Actor1198: brik + Owner: Neutral + Location: 10,78 + Actor1199: brik + Owner: Neutral + Location: 12,78 + Actor1200: brik + Owner: Neutral + Location: 11,78 + Actor1201: brik + Owner: Neutral + Location: 13,78 + Actor1202: brik + Owner: Neutral + Location: 14,78 + Actor1203: brik + Owner: Neutral + Location: 15,78 + Actor1204: brik + Owner: Neutral + Location: 7,69 + Actor1205: brik + Owner: Neutral + Location: 7,68 + Actor1206: brik + Owner: Neutral + Location: 7,67 + Actor1207: brik + Owner: Neutral + Location: 6,67 + Actor1208: brik + Owner: Neutral + Location: 7,70 + Actor1209: brik + Owner: Neutral + Location: 9,70 + Actor1210: brik + Owner: Neutral + Location: 8,70 + Actor1211: brik + Owner: Neutral + Location: 10,70 + Actor1212: brik + Owner: Neutral + Location: 11,70 + Actor1213: brik + Owner: Neutral + Location: 12,70 + Actor1214: brik + Owner: Neutral + Location: 13,70 + Actor1215: brik + Owner: Neutral + Location: 14,70 + Actor1216: brik + Owner: Neutral + Location: 14,71 + Actor1217: brik + Owner: Neutral + Location: 14,72 + Actor1218: brik + Owner: Neutral + Location: 14,73 + Actor1219: brik + Owner: Neutral + Location: 15,73 + Actor1220: brik + Owner: Neutral + Location: 16,73 + Actor1221: brik + Owner: Neutral + Location: 17,73 + Actor1222: brik + Owner: Neutral + Location: 18,73 + Actor1223: brik + Owner: Neutral + Location: 18,72 + Actor1224: brik + Owner: Neutral + Location: 18,71 + Actor1225: brik + Owner: Neutral + Location: 18,70 + Actor1226: brik + Owner: Neutral + Location: 18,69 + Actor1227: brik + Owner: Neutral + Location: 18,68 + Actor1228: brik + Owner: Neutral + Location: 18,67 + Actor1229: brik + Owner: Neutral + Location: 18,66 + Actor1230: brik + Owner: Neutral + Location: 18,65 + Actor1231: brik + Owner: Neutral + Location: 18,64 + Actor1232: brik + Owner: Neutral + Location: 18,63 + Actor1233: brik + Owner: Neutral + Location: 18,62 + Actor1234: brik + Owner: Neutral + Location: 17,62 + Actor1235: brik + Owner: Neutral + Location: 15,62 + Actor1236: brik + Owner: Neutral + Location: 14,62 + Actor1237: brik + Owner: Neutral + Location: 16,62 + Actor1238: brik + Owner: Neutral + Location: 14,63 + Actor1239: brik + Owner: Neutral + Location: 14,64 + Actor1240: brik + Owner: Neutral + Location: 12,64 + Actor1241: brik + Owner: Neutral + Location: 13,64 + Actor1242: brik + Owner: Neutral + Location: 11,64 + Actor1243: brik + Owner: Neutral + Location: 14,58 + Actor1244: brik + Owner: Neutral + Location: 14,57 + Actor1245: brik + Owner: Neutral + Location: 14,56 + Actor1246: brik + Owner: Neutral + Location: 9,56 + Actor1247: brik + Owner: Neutral + Location: 10,56 + Actor1248: brik + Owner: Neutral + Location: 12,56 + Actor1249: brik + Owner: Neutral + Location: 11,56 + Actor1250: brik + Owner: Neutral + Location: 13,56 + Actor1251: brik + Owner: Neutral + Location: 9,55 + Actor1252: brik + Owner: Neutral + Location: 10,55 + Actor1253: brik + Owner: Neutral + Location: 11,55 + Actor1254: brik + Owner: Neutral + Location: 12,55 + Actor1255: brik + Owner: Neutral + Location: 13,55 + Actor1256: brik + Owner: Neutral + Location: 14,55 + Actor1257: brik + Owner: Neutral + Location: 14,54 + Actor1258: brik + Owner: Neutral + Location: 15,54 + Actor1259: brik + Owner: Neutral + Location: 16,54 + Actor1260: brik + Owner: Neutral + Location: 17,54 + Actor1261: brik + Owner: Neutral + Location: 18,54 + Actor1262: brik + Owner: Neutral + Location: 18,54 + Actor1263: brik + Owner: Neutral + Location: 20,54 + Actor1264: brik + Owner: Neutral + Location: 19,54 + Actor1265: brik + Owner: Neutral + Location: 15,58 + Actor1266: brik + Owner: Neutral + Location: 16,58 + Actor1267: brik + Owner: Neutral + Location: 17,58 + Actor1268: brik + Owner: Neutral + Location: 18,58 + Actor1269: brik + Owner: Neutral + Location: 19,58 + Actor1270: brik + Owner: Neutral + Location: 20,58 + Actor1271: brik + Owner: Neutral + Location: 21,58 + Actor1272: brik + Owner: Neutral + Location: 23,67 + Actor1273: brik + Owner: Neutral + Location: 23,68 + Actor1274: brik + Owner: Neutral + Location: 23,69 + Actor1275: brik + Owner: Neutral + Location: 24,69 + Actor1276: brik + Owner: Neutral + Location: 26,69 + Actor1277: brik + Owner: Neutral + Location: 25,69 + Actor1278: brik + Owner: Neutral + Location: 27,69 + Actor1279: brik + Owner: Neutral + Location: 27,68 + Actor1280: brik + Owner: Neutral + Location: 27,67 + Actor1281: brik + Owner: Neutral + Location: 24,67 + Actor1282: brik + Owner: Neutral + Location: 25,67 + Actor1283: brik + Owner: Neutral + Location: 26,67 + Actor1284: brik + Owner: Neutral + Location: 42,82 + Actor1285: brik + Owner: Neutral + Location: 42,83 + Actor1286: brik + Owner: Neutral + Location: 41,83 + Actor1287: brik + Owner: Neutral + Location: 40,83 + Actor1288: brik + Owner: Neutral + Location: 43,82 + Actor1289: brik + Owner: Neutral + Location: 55,82 + Actor1290: brik + Owner: Neutral + Location: 56,82 + Actor1291: brik + Owner: Neutral + Location: 54,82 + Actor1292: brik + Owner: Neutral + Location: 56,83 + Actor1293: brik + Owner: Neutral + Location: 57,83 + Actor1294: brik + Owner: Neutral + Location: 58,83 + Actor1296: brik + Owner: Neutral + Location: 84,82 + Actor1297: brik + Owner: Neutral + Location: 83,82 + Actor1298: brik + Owner: Neutral + Location: 82,82 + Actor1299: brik + Owner: Neutral + Location: 84,81 + Actor1300: brik + Owner: Neutral + Location: 84,80 + Actor1301: brik + Owner: Neutral + Location: 84,79 + Actor1302: brik + Owner: Neutral + Location: 84,78 + Actor1303: brik + Owner: Neutral + Location: 84,77 + Actor1304: brik + Owner: Neutral + Location: 84,76 + Actor1305: brik + Owner: Neutral + Location: 84,75 + Actor1306: brik + Owner: Neutral + Location: 84,74 + Actor1307: brik + Owner: Neutral + Location: 83,74 + Actor1308: brik + Owner: Neutral + Location: 82,74 + Actor1309: brik + Owner: Neutral + Location: 87,74 + Actor1310: brik + Owner: Neutral + Location: 88,74 + Actor1311: brik + Owner: Neutral + Location: 86,74 + Actor1312: brik + Owner: Neutral + Location: 86,75 + Actor1313: brik + Owner: Neutral + Location: 86,76 + Actor1314: brik + Owner: Neutral + Location: 86,77 + Actor1315: brik + Owner: Neutral + Location: 86,78 + Actor1316: brik + Owner: Neutral + Location: 86,79 + Actor1317: brik + Owner: Neutral + Location: 86,80 + Actor1318: brik + Owner: Neutral + Location: 86,81 + Actor1319: brik + Owner: Neutral + Location: 86,82 + Actor1320: brik + Owner: Neutral + Location: 87,82 + Actor1321: brik + Owner: Neutral + Location: 88,82 + Actor1322: brik + Owner: Neutral + Location: 89,82 + Actor1323: brik + Owner: Neutral + Location: 90,82 + Actor1324: brik + Owner: Neutral + Location: 90,81 + Actor1325: brik + Owner: Neutral + Location: 90,80 + Actor1326: brik + Owner: Neutral + Location: 90,79 + Actor1327: brik + Owner: Neutral + Location: 90,78 + Actor1328: brik + Owner: Neutral + Location: 90,77 + Actor1329: brik + Owner: Neutral + Location: 90,76 + Actor1330: brik + Owner: Neutral + Location: 90,75 + Actor1331: brik + Owner: Neutral + Location: 90,74 + Actor1332: brik + Owner: Neutral + Location: 94,79 + Actor1333: brik + Owner: Neutral + Location: 95,79 + Actor1334: brik + Owner: Neutral + Location: 96,79 + Actor1335: brik + Owner: Neutral + Location: 94,80 + Actor1336: brik + Owner: Neutral + Location: 94,81 + Actor1337: brik + Owner: Neutral + Location: 94,82 + Actor1338: brik + Owner: Neutral + Location: 95,82 + Actor1339: brik + Owner: Neutral + Location: 96,82 + Actor1340: brik + Owner: Neutral + Location: 96,78 + Actor1341: brik + Owner: Neutral + Location: 96,77 + Actor1342: brik + Owner: Neutral + Location: 96,75 + Actor1343: brik + Owner: Neutral + Location: 96,76 + Actor1344: brik + Owner: Neutral + Location: 96,74 + Actor1345: brik + Owner: Neutral + Location: 90,73 + Actor1346: brik + Owner: Neutral + Location: 90,72 + Actor1347: brik + Owner: Neutral + Location: 90,71 + Actor1348: brik + Owner: Neutral + Location: 88,71 + Actor1349: brik + Owner: Neutral + Location: 89,71 + Actor1350: brik + Owner: Neutral + Location: 88,72 + Actor1351: brik + Owner: Neutral + Location: 88,73 + Actor1352: brik + Owner: Neutral + Location: 82,73 + Actor1374: brik + Owner: Neutral + Location: 82,52 + Actor1375: brik + Owner: Neutral + Location: 83,52 + Actor1376: brik + Owner: Neutral + Location: 83,51 + Actor1377: brik + Owner: Neutral + Location: 83,50 + Actor1378: brik + Owner: Neutral + Location: 82,50 + Actor1379: brik + Owner: Neutral + Location: 87,50 + Actor1380: brik + Owner: Neutral + Location: 87,51 + Actor1381: brik + Owner: Neutral + Location: 87,52 + Actor1382: brik + Owner: Neutral + Location: 88,52 + Actor1383: brik + Owner: Neutral + Location: 89,52 + Actor1384: brik + Owner: Neutral + Location: 90,52 + Actor1385: brik + Owner: Neutral + Location: 91,52 + Actor1386: brik + Owner: Neutral + Location: 92,52 + Actor1387: brik + Owner: Neutral + Location: 93,52 + Actor1388: brik + Owner: Neutral + Location: 94,52 + Actor1389: brik + Owner: Neutral + Location: 95,52 + Actor1390: brik + Owner: Neutral + Location: 87,46 + Actor1391: brik + Owner: Neutral + Location: 89,46 + Actor1392: brik + Owner: Neutral + Location: 90,46 + Actor1393: brik + Owner: Neutral + Location: 88,46 + Actor1394: brik + Owner: Neutral + Location: 87,47 + Actor1395: brik + Owner: Neutral + Location: 87,48 + Actor1396: brik + Owner: Neutral + Location: 87,49 + Actor1397: brik + Owner: Neutral + Location: 90,47 + Actor1398: brik + Owner: Neutral + Location: 90,48 + Actor1399: brik + Owner: Neutral + Location: 90,49 + Actor1400: brik + Owner: Neutral + Location: 91,49 + Actor1401: brik + Owner: Neutral + Location: 92,49 + Actor1402: brik + Owner: Neutral + Location: 93,49 + Actor1403: brik + Owner: Neutral + Location: 90,42 + Actor1404: brik + Owner: Neutral + Location: 89,42 + Actor1405: brik + Owner: Neutral + Location: 88,42 + Actor1406: brik + Owner: Neutral + Location: 87,42 + Actor1407: brik + Owner: Neutral + Location: 87,37 + Actor1408: brik + Owner: Neutral + Location: 87,38 + Actor1409: brik + Owner: Neutral + Location: 87,39 + Actor1410: brik + Owner: Neutral + Location: 87,40 + Actor1411: brik + Owner: Neutral + Location: 87,41 + Actor1412: brik + Owner: Neutral + Location: 90,41 + Actor1413: brik + Owner: Neutral + Location: 90,40 + Actor1414: brik + Owner: Neutral + Location: 90,39 + Actor1415: brik + Owner: Neutral + Location: 90,39 + Actor1416: brik + Owner: Neutral + Location: 92,39 + Actor1417: brik + Owner: Neutral + Location: 91,39 + Actor1418: brik + Owner: Neutral + Location: 93,39 + Actor1419: brik + Owner: Neutral + Location: 76,46 + Actor1420: brik + Owner: Neutral + Location: 76,47 + Actor1421: brik + Owner: Neutral + Location: 77,47 + Actor1422: brik + Owner: Neutral + Location: 77,46 + Actor1423: brik + Owner: Neutral + Location: 78,46 + Actor1424: brik + Owner: Neutral + Location: 78,47 + Actor1425: brik + Owner: Neutral + Location: 79,47 + Actor1426: brik + Owner: Neutral + Location: 80,47 + Actor1427: brik + Owner: Neutral + Location: 81,47 + Actor1428: brik + Owner: Neutral + Location: 82,47 + Actor1429: brik + Owner: Neutral + Location: 83,47 + Actor1430: brik + Owner: Neutral + Location: 83,46 + Actor1431: brik + Owner: Neutral + Location: 83,45 + Actor1432: brik + Owner: Neutral + Location: 83,44 + Actor1433: brik + Owner: Neutral + Location: 83,43 + Actor1434: brik + Owner: Neutral + Location: 83,42 + Actor1435: brik + Owner: Neutral + Location: 83,41 + Actor1436: brik + Owner: Neutral + Location: 83,40 + Actor1437: brik + Owner: Neutral + Location: 78,40 + Actor1442: brik + Owner: Neutral + Location: 78,41 + Actor1443: brik + Owner: Neutral + Location: 78,42 + Actor1444: brik + Owner: Neutral + Location: 78,43 + Actor1445: brik + Owner: Neutral + Location: 78,44 + Actor1446: brik + Owner: Neutral + Location: 78,45 + Actor1438: brik + Owner: Neutral + Location: 79,40 + Actor1439: brik + Owner: Neutral + Location: 80,40 + Actor1440: brik + Owner: Neutral + Location: 81,40 + Actor1441: brik + Owner: Neutral + Location: 82,40 + Actor1447: brik + Owner: Neutral + Location: 71,46 + Actor1448: brik + Owner: Neutral + Location: 72,46 + Actor1449: brik + Owner: Neutral + Location: 73,46 + Actor1450: brik + Owner: Neutral + Location: 73,47 + Actor1451: brik + Owner: Neutral + Location: 73,48 + Actor1452: brik + Owner: Neutral + Location: 73,50 + Actor1453: brik + Owner: Neutral + Location: 73,49 + Actor1454: brik + Owner: Neutral + Location: 74,50 + Actor1455: brik + Owner: Neutral + Location: 70,46 + Actor1456: brik + Owner: Neutral + Location: 69,46 + Actor1458: brik + Owner: Neutral + Location: 71,30 + Actor1459: brik + Owner: Neutral + Location: 70,30 + Actor1460: brik + Owner: Neutral + Location: 69,30 + Actor1461: brik + Owner: Neutral + Location: 67,30 + Actor1462: brik + Owner: Neutral + Location: 67,29 + Actor1463: brik + Owner: Neutral + Location: 69,29 + Actor1464: brik + Owner: Neutral + Location: 70,29 + Actor1465: brik + Owner: Neutral + Location: 71,29 + Actor1466: brik + Owner: Neutral + Location: 68,29 + Actor1467: brik + Owner: Neutral + Location: 67,31 + Actor1468: brik + Owner: Neutral + Location: 67,32 + Actor1469: brik + Owner: Neutral + Location: 67,33 + Actor1470: brik + Owner: Neutral + Location: 67,34 + Actor1471: brik + Owner: Neutral + Location: 67,35 + Actor1472: brik + Owner: Neutral + Location: 69,34 + Actor1473: brik + Owner: Neutral + Location: 69,33 + Actor1474: brik + Owner: Neutral + Location: 69,32 + Actor1475: brik + Owner: Neutral + Location: 69,31 + Actor1476: brik + Owner: Neutral + Location: 75,28 + Actor1477: brik + Owner: Neutral + Location: 75,29 + Actor1478: brik + Owner: Neutral + Location: 75,30 + Actor1479: brik + Owner: Neutral + Location: 77,30 + Actor1480: brik + Owner: Neutral + Location: 78,30 + Actor1481: brik + Owner: Neutral + Location: 76,30 + Actor1482: brik + Owner: Neutral + Location: 78,29 + Actor1483: brik + Owner: Neutral + Location: 78,28 + Actor1484: brik + Owner: Neutral + Location: 78,27 + Actor1485: brik + Owner: Neutral + Location: 78,26 + Actor1486: brik + Owner: Neutral + Location: 78,25 + Actor1487: brik + Owner: Neutral + Location: 88,37 + Actor1488: brik + Owner: Neutral + Location: 89,37 + Actor1489: brik + Owner: Neutral + Location: 90,37 + Actor1490: brik + Owner: Neutral + Location: 91,37 + Actor1491: brik + Owner: Neutral + Location: 64,30 + Actor1492: brik + Owner: Neutral + Location: 63,30 + Actor1493: brik + Owner: Neutral + Location: 62,30 + Actor1494: brik + Owner: Neutral + Location: 62,29 + Actor1495: brik + Owner: Neutral + Location: 62,28 + Actor1496: brik + Owner: Neutral + Location: 62,27 + Actor1497: brik + Owner: Neutral + Location: 62,26 + Actor1498: brik + Owner: Neutral + Location: 64,25 + Actor1499: brik + Owner: Neutral + Location: 64,26 + Actor1500: brik + Owner: Neutral + Location: 64,28 + Actor1501: brik + Owner: Neutral + Location: 64,27 + Actor1502: brik + Owner: Neutral + Location: 64,29 + Actor1503: brik + Owner: Neutral + Location: 62,25 + Actor1504: brik + Owner: Neutral + Location: 62,24 + Actor1505: brik + Owner: Neutral + Location: 62,23 + Actor1506: brik + Owner: Neutral + Location: 62,22 + Actor1508: brik + Owner: Neutral + Location: 64,23 + Actor1509: brik + Owner: Neutral + Location: 64,24 + Actor1510: brik + Owner: Neutral + Location: 62,21 + Actor1511: brik + Owner: Neutral + Location: 62,20 + Actor1512: brik + Owner: Neutral + Location: 56,20 + Actor1513: brik + Owner: Neutral + Location: 57,20 + Actor1514: brik + Owner: Neutral + Location: 58,20 + Actor1515: brik + Owner: Neutral + Location: 58,21 + Actor1516: brik + Owner: Neutral + Location: 58,22 + Actor1517: brik + Owner: Neutral + Location: 58,24 + Actor1518: brik + Owner: Neutral + Location: 58,23 + Actor1519: brik + Owner: Neutral + Location: 58,25 + Actor1520: brik + Owner: Neutral + Location: 58,26 + Actor1521: brik + Owner: Neutral + Location: 58,27 + Actor1522: brik + Owner: Neutral + Location: 58,28 + Actor1523: brik + Owner: Neutral + Location: 58,29 + Actor1524: brik + Owner: Neutral + Location: 58,30 + Actor1525: brik + Owner: Neutral + Location: 57,30 + Actor1526: brik + Owner: Neutral + Location: 56,30 + Actor1527: brik + Owner: Neutral + Location: 55,30 + Actor1528: brik + Owner: Neutral + Location: 54,30 + Actor1529: brik + Owner: Neutral + Location: 53,30 + Actor1530: brik + Owner: Neutral + Location: 53,31 + Actor1531: brik + Owner: Neutral + Location: 53,16 + Actor1532: brik + Owner: Neutral + Location: 53,15 + Actor1533: brik + Owner: Neutral + Location: 53,14 + Actor1534: brik + Owner: Neutral + Location: 53,13 + Actor1535: brik + Owner: Neutral + Location: 53,12 + Actor1537: brik + Owner: Neutral + Location: 53,11 + Actor1538: brik + Owner: Neutral + Location: 54,16 + Actor1539: brik + Owner: Neutral + Location: 55,16 + Actor1540: brik + Owner: Neutral + Location: 56,16 + Actor1541: brik + Owner: Neutral + Location: 57,16 + Actor1542: brik + Owner: Neutral + Location: 58,16 + Actor1543: brik + Owner: Neutral + Location: 59,16 + Actor1544: brik + Owner: Neutral + Location: 53,10 + Actor1545: brik + Owner: Neutral + Location: 50,20 + Actor1546: brik + Owner: Neutral + Location: 51,20 + Actor1547: brik + Owner: Neutral + Location: 52,20 + Actor1548: brik + Owner: Neutral + Location: 53,20 + Actor1549: brik + Owner: Neutral + Location: 55,20 + Actor1550: brik + Owner: Neutral + Location: 54,20 + Actor1551: brik + Owner: Neutral + Location: 43,24 + Actor1552: brik + Owner: Neutral + Location: 43,23 + Actor1553: brik + Owner: Neutral + Location: 43,22 + Actor1558: brik + Owner: Neutral + Location: 44,24 + Actor1559: brik + Owner: Neutral + Location: 45,24 + Actor1560: brik + Owner: Neutral + Location: 46,24 + Actor1561: brik + Owner: Neutral + Location: 47,24 + Actor1562: brik + Owner: Neutral + Location: 48,24 + Actor1563: brik + Owner: Neutral + Location: 49,24 + Actor1564: brik + Owner: Neutral + Location: 49,37 + Actor1565: brik + Owner: Neutral + Location: 49,36 + Actor1566: brik + Owner: Neutral + Location: 49,35 + Actor1567: brik + Owner: Neutral + Location: 49,34 + Actor1568: brik + Owner: Neutral + Location: 49,33 + Actor1569: brik + Owner: Neutral + Location: 49,32 + Actor1570: brik + Owner: Neutral + Location: 49,31 + Actor1571: brik + Owner: Neutral + Location: 53,32 + Actor1572: brik + Owner: Neutral + Location: 53,33 + Actor1573: brik + Owner: Neutral + Location: 53,34 + Actor1574: brik + Owner: Neutral + Location: 53,35 + Actor1575: brik + Owner: Neutral + Location: 53,36 + Actor1576: brik + Owner: Neutral + Location: 53,37 + Actor1577: brik + Owner: Neutral + Location: 51,37 + Actor1578: brik + Owner: Neutral + Location: 50,37 + Actor1579: brik + Owner: Neutral + Location: 52,37 + Actor1580: brik + Owner: Neutral + Location: 49,43 + Actor1581: brik + Owner: Neutral + Location: 50,43 + Actor1582: brik + Owner: Neutral + Location: 51,43 + Actor1583: brik + Owner: Neutral + Location: 52,43 + Actor1584: brik + Owner: Neutral + Location: 53,43 + Actor1585: brik + Owner: Neutral + Location: 53,44 + Actor1586: brik + Owner: Neutral + Location: 53,45 + Actor1587: brik + Owner: Neutral + Location: 53,46 + Actor1588: brik + Owner: Neutral + Location: 53,47 + Actor1589: brik + Owner: Neutral + Location: 53,48 + Actor1590: brik + Owner: Neutral + Location: 49,44 + Actor1591: brik + Owner: Neutral + Location: 49,45 + Actor1592: brik + Owner: Neutral + Location: 49,46 + Actor1593: brik + Owner: Neutral + Location: 49,47 + Actor1594: brik + Owner: Neutral + Location: 49,48 + Actor1595: brik + Owner: Neutral + Location: 49,49 + Actor1596: brik + Owner: Neutral + Location: 53,49 + Actor1597: brik + Owner: Neutral + Location: 54,49 + Actor1598: brik + Owner: Neutral + Location: 56,49 + Actor1599: brik + Owner: Neutral + Location: 55,49 + Actor1600: brik + Owner: Neutral + Location: 49,52 + Actor1601: brik + Owner: Neutral + Location: 49,51 + Actor1602: brik + Owner: Neutral + Location: 49,50 + Actor1610: brik + Owner: Neutral + Location: 61,6 + Actor1611: brik + Owner: Neutral + Location: 63,6 + Actor1612: brik + Owner: Neutral + Location: 62,6 + Actor1613: brik + Owner: Neutral + Location: 64,6 + Actor1614: brik + Owner: Neutral + Location: 64,7 + Actor1615: brik + Owner: Neutral + Location: 61,7 + Actor1616: brik + Owner: Neutral + Location: 64,8 + Actor1617: brik + Owner: Neutral + Location: 64,9 + Actor1618: brik + Owner: Neutral + Location: 60,7 + Actor1619: brik + Owner: Neutral + Location: 47,5 + Actor1620: brik + Owner: Neutral + Location: 46,5 + Actor1621: brik + Owner: Neutral + Location: 44,5 + Actor1622: brik + Owner: Neutral + Location: 45,5 + Actor1623: brik + Owner: Neutral + Location: 43,5 + Actor1624: brik + Owner: Neutral + Location: 42,5 + Actor1625: brik + Owner: Neutral + Location: 47,6 + Actor1626: brik + Owner: Neutral + Location: 47,7 + Actor1627: brik + Owner: Neutral + Location: 47,8 + Actor1628: brik + Owner: Neutral + Location: 47,9 + Actor1629: brik + Owner: Neutral + Location: 53,7 + Actor1630: brik + Owner: Neutral + Location: 54,7 + Actor1631: brik + Owner: Neutral + Location: 56,7 + Actor1632: brik + Owner: Neutral + Location: 57,7 + Actor1633: brik + Owner: Neutral + Location: 55,7 + Actor1634: brik + Owner: Neutral + Location: 53,8 + Actor1635: brik + Owner: Neutral + Location: 53,9 + Actor1636: brik + Owner: Neutral + Location: 58,7 + Actor1637: brik + Owner: Neutral + Location: 59,7 + Actor1638: brik + Owner: Neutral + Location: 69,6 + Actor1639: brik + Owner: Neutral + Location: 69,7 + Actor1640: brik + Owner: Neutral + Location: 69,8 + Actor1641: brik + Owner: Neutral + Location: 69,9 + Actor1642: brik + Owner: Neutral + Location: 70,9 + Actor1643: brik + Owner: Neutral + Location: 70,8 + Actor1644: brik + Owner: Neutral + Location: 70,7 + Actor1645: brik + Owner: Neutral + Location: 70,6 + Actor1646: brik + Owner: Neutral + Location: 75,7 + Actor1647: brik + Owner: Neutral + Location: 76,7 + Actor1648: brik + Owner: Neutral + Location: 77,7 + Actor1649: brik + Owner: Neutral + Location: 78,7 + Actor1650: brik + Owner: Neutral + Location: 78,8 + Actor1651: brik + Owner: Neutral + Location: 78,9 + Actor1652: brik + Owner: Neutral + Location: 78,10 + Actor1653: brik + Owner: Neutral + Location: 75,8 + Actor1654: brik + Owner: Neutral + Location: 75,9 + Actor1655: brik + Owner: Neutral + Location: 75,10 + Actor1656: brik + Owner: Neutral + Location: 75,11 + Actor1657: brik + Owner: Neutral + Location: 75,11 + Actor1658: brik + Owner: Neutral + Location: 78,11 + Actor1659: brik + Owner: Neutral + Location: 78,12 + Actor1660: brik + Owner: Neutral + Location: 78,13 + Actor1661: brik + Owner: Neutral + Location: 75,12 + Actor1662: brik + Owner: Neutral + Location: 75,13 + Actor1663: brik + Owner: Neutral + Location: 78,14 + Actor1664: brik + Owner: Neutral + Location: 88,15 + Actor1665: brik + Owner: Neutral + Location: 89,15 + Actor1666: brik + Owner: Neutral + Location: 89,16 + Actor1667: brik + Owner: Neutral + Location: 89,17 + Actor1668: brik + Owner: Neutral + Location: 86,15 + Actor1669: brik + Owner: Neutral + Location: 87,15 + Actor1670: brik + Owner: Neutral + Location: 89,18 + Actor1671: brik + Owner: Neutral + Location: 85,8 + Actor1672: brik + Owner: Neutral + Location: 85,7 + Actor1673: brik + Owner: Neutral + Location: 85,6 + Actor1674: brik + Owner: Neutral + Location: 86,6 + Actor1675: brik + Owner: Neutral + Location: 86,7 + Actor1676: brik + Owner: Neutral + Location: 86,8 + Actor1677: brik + Owner: Neutral + Location: 85,9 + Actor1678: brik + Owner: Neutral + Location: 86,9 + Actor1679: brik + Owner: Neutral + Location: 75,2 + Actor1680: brik + Owner: Neutral + Location: 75,3 + Actor1681: brik + Owner: Neutral + Location: 75,1 + Actor1682: brik + Owner: Neutral + Location: 76,3 + Actor1683: brik + Owner: Neutral + Location: 77,3 + Actor1684: brik + Owner: Neutral + Location: 77,2 + Actor1685: brik + Owner: Neutral + Location: 77,1 + Actor1727: brik + Owner: Neutral + Location: 24,34 + Actor1728: brik + Owner: Neutral + Location: 28,34 + Actor1729: brik + Owner: Neutral + Location: 24,35 + Actor1732: brik + Owner: Neutral + Location: 28,35 + Actor1733: brik + Owner: Neutral + Location: 24,36 + Actor1734: brik + Owner: Neutral + Location: 25,36 + Actor1735: brik + Owner: Neutral + Location: 26,36 + Actor1736: brik + Owner: Neutral + Location: 27,36 + Actor1737: brik + Owner: Neutral + Location: 28,36 + Actor1607: brik + Owner: Neutral + Location: 28,33 + Actor1608: brik + Owner: Neutral + Location: 29,33 + Actor1609: brik + Owner: Neutral + Location: 30,33 + Actor1726: brik + Owner: Neutral + Location: 31,33 + Actor1738: brik + Owner: Neutral + Location: 32,33 + Commando: rmbo + Owner: GDI + SubCell: 3 + Location: 92,7 + Facing: 384 + Actor1507: brik + Owner: Neutral + Location: 67,19 + Actor1536: brik + Owner: Neutral + Location: 67,20 + Actor1603: brik + Owner: Neutral + Location: 67,21 + Actor1604: brik + Owner: Neutral + Location: 64,22 + Actor1605: brik + Owner: Neutral + Location: 65,22 + Actor1606: brik + Owner: Neutral + Location: 66,22 + Actor1686: brik + Owner: Neutral + Location: 67,22 + Actor1688: brik + Owner: Neutral + Location: 72,19 + Actor1689: brik + Owner: Neutral + Location: 72,20 + Actor1690: brik + Owner: Neutral + Location: 72,21 + Actor1691: brik + Owner: Neutral + Location: 72,22 + Actor1692: brik + Owner: Neutral + Location: 73,22 + Actor1693: brik + Owner: Neutral + Location: 74,22 + Actor1687: brik + Owner: Neutral + Location: 66,14 + Actor1694: brik + Owner: Neutral + Location: 67,14 + Actor1695: brik + Owner: Neutral + Location: 67,15 + Actor1696: brik + Owner: Neutral + Location: 67,16 + Actor1697: brik + Owner: Neutral + Location: 65,14 + Actor1698: brik + Owner: Neutral + Location: 72,14 + Actor1699: brik + Owner: Neutral + Location: 73,14 + Actor1700: brik + Owner: Neutral + Location: 72,15 + Actor1701: brik + Owner: Neutral + Location: 72,16 + Actor1702: brik + Owner: Neutral + Location: 74,14 + Actor1703: brik + Owner: Neutral + Location: 78,66 + Actor1704: brik + Owner: Neutral + Location: 78,67 + Actor1705: brik + Owner: Neutral + Location: 79,67 + Actor1706: brik + Owner: Neutral + Location: 78,71 + Actor1707: brik + Owner: Neutral + Location: 79,71 + Actor1708: brik + Owner: Neutral + Location: 78,72 + Actor1710: brik + Owner: Neutral + Location: 82,67 + Actor1711: brik + Owner: Neutral + Location: 82,71 + Actor1712: brik + Owner: Neutral + Location: 82,72 + Actor1713: brik + Owner: Neutral + Location: 80,67 + Actor1714: brik + Owner: Neutral + Location: 80,71 + Actor1715: brik + Owner: Neutral + Location: 81,67 + Actor1716: brik + Owner: Neutral + Location: 81,71 + Tanya: e7 + Owner: Neutral + SubCell: 3 + Location: 92,41 + Health: 23 + Facing: 384 + Actor1295: s1 + Owner: Scrin + SubCell: 3 + Location: 76,5 + Facing: 729 + Actor1717: s1 + Owner: Scrin + SubCell: 3 + Location: 75,6 + Facing: 737 + Actor1718: s1 + Owner: Scrin + SubCell: 3 + Location: 74,4 + Facing: 666 + Actor1719: s2 + Owner: Scrin + SubCell: 3 + Location: 73,6 + Facing: 721 + Actor1053: brik + Owner: Neutral + Location: 43,13 + Actor1557: brik + Owner: Neutral + Location: 43,21 + Actor1554: brik + Owner: Neutral + Location: 43,15 + Actor1555: brik + Owner: Neutral + Location: 47,15 + Actor1556: brik + Owner: Neutral + Location: 43,16 + Actor1720: brik + Owner: Neutral + Location: 44,16 + Actor1721: brik + Owner: Neutral + Location: 45,16 + Actor1722: brik + Owner: Neutral + Location: 46,16 + Actor1724: brik + Owner: Neutral + Location: 43,20 + Actor1725: brik + Owner: Neutral + Location: 44,20 + Actor1730: brik + Owner: Neutral + Location: 45,20 + Actor1731: brik + Owner: Neutral + Location: 46,20 + Actor1723: brik + Owner: Neutral + Location: 47,16 + Actor1739: brik + Owner: Neutral + Location: 43,14 + Actor1740: brik + Owner: Neutral + Location: 47,14 + Actor1741: brik + Owner: Neutral + Location: 47,13 + Actor1742: brik + Owner: Neutral + Location: 31,73 + Actor1743: brik + Owner: Neutral + Location: 32,73 + Actor1744: brik + Owner: Neutral + Location: 33,73 + Actor1745: brik + Owner: Neutral + Location: 34,73 + Actor1746: brik + Owner: Neutral + Location: 35,73 + Actor1747: brik + Owner: Neutral + Location: 36,73 + Actor1748: brik + Owner: Neutral + Location: 37,73 + Actor1749: brik + Owner: Neutral + Location: 38,73 + Actor1750: silo.scrin + Owner: Scrin + Location: 86,12 + Actor1751: silo.scrin + Owner: Scrin + Location: 88,13 + Actor1752: silo.scrin + Owner: Scrin + Location: 89,11 + SiloA5: silo.scrinblue + Owner: Scrin + Location: 89,89 + SiloA4: silo.scrinblue + Owner: Scrin + Location: 88,87 + Actor1755: silo.scrinblue + Owner: Scrin + Location: 87,90 + Actor1756: silo.scrinblue + Owner: Scrin + Location: 88,93 + Actor1757: silo.scrinblue + Owner: Scrin + Location: 89,91 + Actor1758: silo.scrinblue + Owner: Scrin + Location: 91,91 + SiloA6: silo.scrinblue + Owner: Scrin + Location: 92,88 + SiloA3: silo.scrinblue + Owner: Scrin + Location: 91,87 + Actor1761: silo.scrinblue + Owner: Scrin + Location: 92,90 + SiloA1: silo.scrinblue + Owner: Scrin + Location: 86,86 + Actor1763: silo.scrinblue + Owner: Scrin + Location: 86,93 + Actor1764: silo.scrinblue + Owner: Scrin + Location: 92,92 + SiloA2: silo.scrinblue + Owner: Scrin + Location: 91,85 + Actor1766: silo.scrinblue + Owner: Scrin + Location: 90,94 + Actor1767: silo.scrinblue + Owner: Scrin + Location: 47,88 + Actor1768: silo.scrinblue + Owner: Scrin + Location: 48,87 + Actor1769: silo.scrinblue + Owner: Scrin + Location: 50,88 + Actor1770: silo.scrinblue + Owner: Scrin + Location: 51,86 + Actor1771: silo.scrinblue + Owner: Scrin + Location: 49,86 + Actor1772: silo.scrinblue + Owner: Scrin + Location: 49,89 + Actor1773: silo.scrinblue + Owner: Scrin + Location: 46,87 + Actor1774: silo.scrinblue + Owner: Scrin + Location: 48,91 + Actor1775: silo.scrinblue + Owner: Scrin + Location: 51,93 + Actor1776: silo.scrinblue + Owner: Scrin + Location: 50,92 + Actor1777: silo.scrinblue + Owner: Scrin + Location: 52,91 + Actor1778: silo.scrinblue + Owner: Scrin + Location: 52,89 + Actor1779: silo.scrinblue + Owner: Scrin + Location: 47,92 + Actor1780: silo.scrinblue + Owner: Scrin + Location: 46,90 + Actor1781: silo.scrinblue + Owner: Scrin + Location: 51,90 + Actor1782: silo.scrinblue + Owner: Scrin + Location: 52,87 + Actor1783: silo.scrinblue + Owner: Scrin + Location: 46,94 + Actor1784: silo.scrinblue + Owner: Scrin + Location: 7,89 + Actor1785: silo.scrinblue + Owner: Scrin + Location: 5,90 + Actor1786: silo.scrinblue + Owner: Scrin + Location: 6,88 + Actor1787: silo.scrinblue + Owner: Scrin + Location: 7,87 + Actor1788: silo.scrinblue + Owner: Scrin + Location: 9,86 + Actor1789: silo.scrinblue + Owner: Scrin + Location: 9,88 + Actor1790: silo.scrinblue + Owner: Scrin + Location: 8,89 + Actor1791: silo.scrinblue + Owner: Scrin + Location: 8,91 + Actor1792: silo.scrinblue + Owner: Scrin + Location: 7,92 + Actor1793: silo.scrinblue + Owner: Scrin + Location: 7,90 + Actor1794: silo.scrinblue + Owner: Scrin + Location: 10,91 + Actor1795: silo.scrinblue + Owner: Scrin + Location: 9,90 + Actor1796: silo.scrinblue + Owner: Scrin + Location: 12,89 + Actor1797: silo.scrinblue + Owner: Scrin + Location: 11,87 + Actor1798: silo.scrinblue + Owner: Scrin + Location: 5,86 + Actor1799: silo.scrinblue + Owner: Scrin + Location: 9,93 + Actor1800: silo.scrinblue + Owner: Scrin + Location: 12,85 + Actor1801: silo.scrinblue + Owner: Scrin + Location: 7,85 + Actor1802: silo.scrinblue + Owner: Scrin + Location: 38,46 + Actor1803: silo.scrinblue + Owner: Scrin + Location: 37,47 + Actor1804: silo.scrinblue + Owner: Scrin + Location: 39,48 + Actor1805: silo.scrinblue + Owner: Scrin + Location: 37,49 + Actor1806: silo.scrinblue + Owner: Scrin + Location: 36,48 + Actor1807: silo.scrinblue + Owner: Scrin + Location: 36,46 + Actor1808: silo.scrinblue + Owner: Scrin + Location: 34,45 + Actor1809: silo.scrinblue + Owner: Scrin + Location: 34,50 + Actor1810: silo.scrinblue + Owner: Scrin + Location: 42,42 + Actor1811: silo.scrinblue + Owner: Scrin + Location: 43,43 + Actor1812: silo.scrinblue + Owner: Scrin + Location: 45,42 + Actor1813: silo.scrinblue + Owner: Scrin + Location: 43,40 + Actor1814: silo.scrinblue + Owner: Scrin + Location: 45,39 + Actor1815: silo.scrinblue + Owner: Scrin + Location: 41,44 + Actor1816: silo.scrinblue + Owner: Scrin + Location: 7,6 + Actor1817: silo.scrinblue + Owner: Scrin + Location: 5,7 + Actor1818: silo.scrinblue + Owner: Scrin + Location: 7,9 + Actor1819: silo.scrinblue + Owner: Scrin + Location: 6,11 + Actor1820: silo.scrinblue + Owner: Scrin + Location: 5,10 + Actor1821: silo.scrinblue + Owner: Scrin + Location: 6,8 + Actor1822: silo.scrinblue + Owner: Scrin + Location: 3,6 + Actor1823: silo.scrinblue + Owner: Scrin + Location: 5,4 + Actor1824: silo.scrinblue + Owner: Scrin + Location: 10,5 + Actor1825: silo.scrinblue + Owner: Scrin + Location: 12,4 + Actor1826: silo.scrinblue + Owner: Scrin + Location: 13,3 + Actor1827: silo.scrinblue + Owner: Scrin + Location: 12,7 + Actor1828: silo.scrinblue + Owner: Scrin + Location: 11,7 + Actor1829: silo.scrinblue + Owner: Scrin + Location: 13,9 + Actor1830: silo.scrinblue + Owner: Scrin + Location: 12,10 + Actor1831: silo.scrinblue + Owner: Scrin + Location: 10,11 + Actor1832: silo.scrinblue + Owner: Scrin + Location: 11,9 + Actor1833: silo.scrinblue + Owner: Scrin + Location: 13,14 + Actor1834: silo.scrinblue + Owner: Scrin + Location: 12,16 + Actor1835: silo.scrin + Owner: Scrin + Location: 83,29 + Actor1836: silo.scrin + Owner: Scrin + Location: 87,28 + Actor1837: silo.scrin + Owner: Scrin + Location: 86,30 + Actor1838: silo.scrin + Owner: Scrin + Location: 84,31 + Actor1839: silo.scrin + Owner: Scrin + Location: 83,32 + Actor1840: silo.scrin + Owner: Scrin + Location: 86,33 + Actor1841: silo.scrin + Owner: Scrin + Location: 89,33 + Actor1842: silo.scrin + Owner: Scrin + Location: 89,30 + Actor1843: silo.scrin + Owner: Scrin + Location: 85,35 + Actor1844: silo.scrin + Owner: Scrin + Location: 81,31 + Actor1845: silo.scrin + Owner: Scrin + Location: 87,32 + Actor1848: lchr + Owner: Scrin + Location: 9,3 + Facing: 507 + Actor1849: gunw + Owner: Scrin + Location: 59,39 + Facing: 951 + Actor1850: corr + Owner: Scrin + Location: 4,93 + Facing: 888 + Actor1851: ptur + Owner: Scrin + Location: 7,39 + TurretFacing: 697 + Actor1852: ptur + Owner: Scrin + Location: 81,35 + TurretFacing: 364 + Actor1853: ruin + Owner: Scrin + Location: 39,50 + Facing: 864 + Actor1854: gunw + Owner: Scrin + Location: 64,58 + Facing: 737 + Actor1855: lchr + Owner: Scrin + Location: 6,59 + Facing: 586 + Actor1856: brst2 + Owner: Scrin + SubCell: 3 + Location: 39,30 + Facing: 650 + Actor1857: brst2 + Owner: Scrin + SubCell: 3 + Location: 42,31 + Facing: 63 + Actor1858: brst2 + Owner: Scrin + SubCell: 3 + Location: 45,29 + Facing: 721 + Actor1859: s1 + Owner: Scrin + SubCell: 3 + Location: 61,4 + Facing: 586 + Actor1860: s1 + Owner: Scrin + SubCell: 3 + Location: 63,3 + Facing: 650 + Actor1861: s4 + Owner: Scrin + SubCell: 3 + Location: 62,5 + Facing: 721 + Actor1862: s3 + Owner: Scrin + SubCell: 3 + Location: 50,5 + Facing: 808 + Actor1863: s1 + Owner: Scrin + SubCell: 3 + Location: 50,4 + Facing: 880 + Actor1864: s1 + Owner: Scrin + SubCell: 3 + Location: 52,3 + Facing: 674 + Actor1865: s1 + Owner: Scrin + SubCell: 3 + Location: 52,7 + Facing: 951 + Actor1866: s1 + Owner: Scrin + SubCell: 3 + Location: 49,8 + Facing: 808 + Actor1867: gscr + Owner: Scrin + SubCell: 3 + Location: 69,22 + Facing: 31 + Actor1868: gscr + Owner: Scrin + SubCell: 3 + Location: 70,20 + Facing: 0 + Actor1869: s2 + Owner: Scrin + SubCell: 3 + Location: 57,36 + Facing: 919 + Actor1870: s4 + Owner: Scrin + SubCell: 3 + Location: 63,62 + Facing: 55 + Actor1871: s4 + Owner: Scrin + SubCell: 3 + Location: 66,64 + Facing: 182 + Actor1353: dark + Owner: Scrin + Facing: 126 + Location: 89,61 + Actor1355: gscr + Owner: Scrin + SubCell: 3 + Location: 93,65 + Facing: 190 + Actor1356: gscr + Owner: Scrin + SubCell: 3 + Location: 88,66 + Facing: 15 + Actor1358: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 94,76 + Actor1359: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 93,77 + Actor1360: corr + Owner: Scrin + Location: 85,90 + Facing: 959 + Actor1362: gscr + Owner: Scrin + SubCell: 3 + Location: 45,85 + Facing: 864 + Actor1363: s1 + Owner: Scrin + SubCell: 3 + Location: 49,84 + Facing: 816 + Actor1364: s1 + Owner: Scrin + SubCell: 3 + Location: 54,91 + Facing: 0 + Actor1365: s1 + Owner: Scrin + SubCell: 3 + Location: 47,89 + Facing: 785 + Actor1366: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 64,92 + Actor1367: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 67,92 + Actor1368: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 68,94 + Actor1369: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 41,85 + Actor1370: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 24,86 + Actor1371: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 26,87 + Actor1372: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 24,89 + Actor1373: s1 + Owner: Scrin + SubCell: 3 + Location: 4,85 + Facing: 158 + Actor1709: s1 + Owner: Scrin + SubCell: 3 + Location: 6,84 + Facing: 182 + Actor1847: s1 + Owner: Scrin + Location: 12,94 + SubCell: 3 + Facing: 761 + Actor1872: gscr + Owner: Scrin + SubCell: 3 + Location: 4,72 + Facing: 666 + Actor1873: gscr + Owner: Scrin + SubCell: 3 + Location: 5,73 + Facing: 705 + Actor1874: s2 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 23,74 + Actor1875: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 25,72 + Actor1876: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 4,41 + Actor1877: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 5,38 + Actor1878: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 3,26 + Actor1879: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 4,23 + Actor1880: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 4,24 + Actor1881: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 3,21 + Actor1882: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 16,9 + Actor1883: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 19,7 + Actor1884: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 19,8 + Actor1885: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 22,16 + Actor1886: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 33,9 + Actor1887: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 34,9 + Actor1888: s1 + Owner: Scrin + SubCell: 3 + Location: 43,19 + Facing: 769 + Actor1889: s3 + Owner: Scrin + SubCell: 3 + Location: 42,18 + Facing: 808 + Actor1890: s3 + Owner: Scrin + SubCell: 3 + Location: 40,19 + Facing: 800 + Actor1891: s2 + Owner: Scrin + SubCell: 3 + Location: 39,15 + Facing: 610 + Actor1892: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 81,29 + Actor1893: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 85,28 + Actor1894: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 88,31 + Actor1895: gscr + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 89,32 + Actor1896: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 84,37 + Actor1897: gscr + Owner: Scrin + SubCell: 3 + Location: 72,37 + Facing: 0 + Actor1898: s2 + Owner: Scrin + SubCell: 3 + Location: 63,45 + Facing: 39 + Actor1899: s1 + Owner: Scrin + SubCell: 3 + Location: 57,44 + Facing: 919 + Actor1900: s1 + Owner: Scrin + SubCell: 3 + Location: 56,41 + Facing: 832 + Actor1901: s1 + Owner: Scrin + SubCell: 3 + Location: 27,26 + Facing: 650 + Actor1902: s1 + Owner: Scrin + SubCell: 3 + Location: 27,23 + Facing: 515 + Actor1903: s3 + Owner: Scrin + SubCell: 3 + Location: 29,24 + Facing: 578 + HealCrate2: healcrate + Owner: Neutral + Location: 26,34 + HealCrate4: healcrate + Owner: Neutral + Location: 26,84 + HealCrate1: healcrate + Owner: Neutral + Location: 93,4 + Actor1909: gscr + Owner: Scrin + SubCell: 3 + Location: 60,57 + Facing: 729 + Actor1910: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 55,58 + Actor1912: gscr + Owner: Scrin + SubCell: 3 + Location: 41,57 + Facing: 0 + Actor1913: gscr + Owner: Scrin + Facing: 384 + Location: 43,60 + SubCell: 3 + HealCrate3: healcrate + Owner: Neutral + Location: 58,76 + Actor1915: brst2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 56,75 + Actor1916: brst2 + Owner: Scrin + SubCell: 3 + Location: 56,77 + Facing: 190 + Actor1917: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 35,76 + Actor1918: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 23,62 + Actor1919: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 27,63 + Actor1921: s4 + Owner: Scrin + SubCell: 3 + Location: 26,28 + Facing: 769 + Actor1754: ruin + Owner: Scrin + Location: 45,92 + Facing: 951 + Actor1759: gunw + Owner: Scrin + Location: 65,88 + Facing: 0 + Actor1760: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 11,89 + Actor1762: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 5,71 + Actor1753: brst2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 60,18 + Actor1765: brst2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 27,3 + Actor1846: brst2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 63,65 + Actor1907: s1 + Owner: Scrin + SubCell: 3 + Location: 68,79 + Facing: 713 + Actor1908: s1 + Owner: Scrin + Location: 68,78 + SubCell: 3 + Facing: 745 + Actor1911: s3 + Owner: Scrin + SubCell: 3 + Location: 68,81 + Facing: 824 + Actor1920: s3 + Owner: Scrin + SubCell: 3 + Location: 94,91 + Facing: 166 + Actor1922: s3 + Owner: Scrin + SubCell: 3 + Location: 90,92 + Facing: 1023 + Actor1923: s3 + Owner: Scrin + SubCell: 3 + Location: 85,88 + Facing: 959 + Actor1924: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 26,61 + Actor1925: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 29,63 + Actor1926: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 22,60 + Actor1927: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 5,52 + Actor1928: gscr + Owner: Scrin + SubCell: 3 + Location: 9,53 + Facing: 951 + Actor1929: gscr + Owner: Scrin + SubCell: 3 + Location: 19,27 + Facing: 935 + Actor1930: gscr + Owner: Scrin + SubCell: 3 + Location: 20,30 + Facing: 467 + Actor1931: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 14,6 + Actor1932: gscr + Owner: Scrin + SubCell: 3 + Location: 3,4 + Facing: 610 + Actor1933: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 21,4 + Actor1934: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 61,20 + Actor1935: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 58,17 + Actor1936: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 63,42 + Actor1937: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 59,42 + Actor1938: gscr + Owner: Scrin + SubCell: 3 + Facing: 79 + Location: 87,63 + Actor1939: gscr + Owner: Scrin + SubCell: 3 + Facing: 79 + Location: 92,61 + Actor1940: s4 + Owner: Scrin + SubCell: 3 + Location: 84,72 + Facing: 880 + Actor1941: s4 + Owner: Scrin + SubCell: 3 + Location: 86,72 + Facing: 1023 + Actor1942: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 42,62 + Actor1943: gscr + Owner: Scrin + Facing: 384 + Location: 44,55 + SubCell: 3 + Actor1944: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 40,40 + Actor1945: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 45,45 + Actor1946: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 34,40 + Actor1947: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 23,42 + Actor1948: s3 + Owner: Scrin + SubCell: 3 + Location: 25,41 + Facing: 658 + Actor1949: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 21,42 + Actor1950: brst2 + Owner: Scrin + SubCell: 3 + Location: 4,39 + Facing: 642 + Actor1951: brst2 + Owner: Scrin + SubCell: 3 + Location: 5,13 + Facing: 531 + Actor1952: brst2 + Owner: Scrin + SubCell: 3 + Location: 73,43 + Facing: 174 + Actor1953: brst2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 76,44 + Actor1954: gscr + Owner: Scrin + SubCell: 3 + Location: 75,47 + Facing: 87 + Actor1955: gscr + Owner: Scrin + SubCell: 3 + Location: 71,42 + Facing: 1007 + Actor1956: s1 + Owner: Scrin + SubCell: 3 + Location: 74,48 + Facing: 721 + Actor1957: s1 + Owner: Scrin + SubCell: 3 + Location: 86,50 + Facing: 15 + Actor1958: s1 + Owner: Scrin + SubCell: 3 + Location: 84,49 + Facing: 63 + Actor1959: s4 + Owner: Scrin + SubCell: 3 + Location: 85,51 + Facing: 1023 + ProdigyPatrol1: waypoint + Owner: Neutral + Location: 5,92 + ProdigyPatrol2: waypoint + Owner: Neutral + Location: 34,93 + ProdigyPatrol3: waypoint + Owner: Neutral + Location: 35,85 + ProdigyPatrol4: waypoint + Owner: Neutral + Location: 68,85 + ProdigyPatrol5: waypoint + Owner: Neutral + Location: 76,70 + ProdigyPatrol6: waypoint + Owner: Neutral + Location: 54,58 + ProdigyPatrol7: waypoint + Owner: Neutral + Location: 39,76 + ProdigyPatrol8: waypoint + Owner: Neutral + Location: 24,64 + ProdigyPatrol9: waypoint + Owner: Neutral + Location: 7,56 + ProdigyPatrol10: waypoint + Owner: Neutral + Location: 34,42 + ProdigyPatrol11: waypoint + Owner: Neutral + Location: 60,37 + ProdigyPatrol12: waypoint + Owner: Neutral + Location: 69,25 + ProdigyPatrol13: waypoint + Owner: Neutral + Location: 67,4 + ProdigyPatrol14: waypoint + Owner: Neutral + Location: 51,5 + ProdigyPatrol15: waypoint + Owner: Neutral + Location: 49,18 + ProdigyPatrol16: waypoint + Owner: Neutral + Location: 28,9 + ProdigyPatrol17: waypoint + Owner: Neutral + Location: 5,14 + ProdigyPatrol18: waypoint + Owner: Neutral + Location: 6,23 + ProdigyPatrol19: waypoint + Owner: Neutral + Location: 10,39 + ProdigyPatrol20: waypoint + Owner: Neutral + Location: 4,73 + Prodigy: pdgy + Owner: Scrin + SubCell: 3 + Location: 4,92 + Facing: 384 + Exit: waypoint + Owner: Neutral + Location: 94,6 + Actor1904: brik + Owner: Neutral + Location: 21,32 + Actor1905: brik + Owner: Neutral + Location: 21,33 + Actor1906: brik + Owner: Neutral + Location: 21,34 + Actor1914: brik + Owner: Neutral + Location: 21,35 + Actor1960: brik + Owner: Neutral + Location: 21,28 + Actor1961: brik + Owner: Neutral + Location: 21,29 + Actor1962: brik + Owner: Neutral + Location: 21,30 + Actor1963: brik + Owner: Neutral + Location: 21,31 + Actor1965: brik + Owner: Neutral + Location: 21,25 + Actor1966: brik + Owner: Neutral + Location: 21,26 + Actor1967: brik + Owner: Neutral + Location: 21,27 + Actor1964: brik + Owner: Neutral + Location: 21,21 + Actor1968: brik + Owner: Neutral + Location: 21,22 + Actor1969: brik + Owner: Neutral + Location: 21,23 + Actor1970: brik + Owner: Neutral + Location: 21,24 + Actor1971: brik + Owner: Neutral + Location: 14,27 + Actor1972: brik + Owner: Neutral + Location: 14,28 + Actor1973: brik + Owner: Neutral + Location: 14,29 + Actor1974: brik + Owner: Neutral + Location: 14,30 + Actor1975: brik + Owner: Neutral + Location: 14,31 + Actor1976: brik + Owner: Neutral + Location: 14,32 + Actor1977: brik + Owner: Neutral + Location: 14,33 + Actor1978: brik + Owner: Neutral + Location: 14,34 + Actor1979: brik + Owner: Neutral + Location: 14,35 + Actor1980: brik + Owner: Neutral + Location: 14,36 + Actor1981: brik + Owner: Neutral + Location: 14,37 + Actor1982: brik + Owner: Neutral + Location: 14,38 + Actor1983: brik + Owner: Neutral + Location: 14,39 + Actor1984: brik + Owner: Neutral + Location: 14,40 + Actor1985: brik + Owner: Neutral + Location: 14,41 + Actor1986: brik + Owner: Neutral + Location: 67,36 + Actor1987: brik + Owner: Neutral + Location: 67,37 + Actor1988: brik + Owner: Neutral + Location: 67,38 + Actor1989: brik + Owner: Neutral + Location: 67,39 + Actor1990: brik + Owner: Neutral + Location: 67,40 + Actor1991: brik + Owner: Neutral + Location: 67,41 + Actor1992: brik + Owner: Neutral + Location: 67,42 + Actor1993: brik + Owner: Neutral + Location: 67,43 + Actor1994: brik + Owner: Neutral + Location: 69,35 + Actor1995: brik + Owner: Neutral + Location: 69,36 + Actor1996: brik + Owner: Neutral + Location: 69,37 + Actor1997: brik + Owner: Neutral + Location: 69,38 + Actor1998: brik + Owner: Neutral + Location: 69,39 + Actor1999: brik + Owner: Neutral + Location: 69,40 + Actor2000: brik + Owner: Neutral + Location: 69,41 + Actor2001: brik + Owner: Neutral + Location: 69,42 + Actor2002: brik + Owner: Neutral + Location: 69,43 + Actor2003: brik + Owner: Neutral + Location: 69,44 + Actor2004: brik + Owner: Neutral + Location: 69,45 + WormholeSpawn3: waypoint + Owner: Neutral + Location: 94,88 + WormholeSpawn2: waypoint + Owner: Neutral + Location: 4,88 + WormholeSpawn1: waypoint + Owner: Neutral + Location: 7,4 + EscapeRespawn: waypoint + Owner: Neutral + Location: 93,41 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/scrinfestation-base.yaml, ca|rules/custom/commando-mission.yaml, duality-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml, ca|weapons/custom/scrinfestation.yaml, duality-weapons.yaml diff --git a/mods/ca/missions/main-campaign/ca29-mobilization/dark.pal b/mods/ca/missions/main-campaign/ca29-mobilization/dark.pal new file mode 100644 index 0000000000..e409814c80 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca29-mobilization/dark.pal differ diff --git a/mods/ca/missions/main-campaign/ca29-mobilization/map.bin b/mods/ca/missions/main-campaign/ca29-mobilization/map.bin new file mode 100644 index 0000000000..b2908246fb Binary files /dev/null and b/mods/ca/missions/main-campaign/ca29-mobilization/map.bin differ diff --git a/mods/ca/missions/main-campaign/ca29-mobilization/map.png b/mods/ca/missions/main-campaign/ca29-mobilization/map.png new file mode 100644 index 0000000000..e38611c3ad Binary files /dev/null and b/mods/ca/missions/main-campaign/ca29-mobilization/map.png differ diff --git a/mods/ca/missions/main-campaign/ca29-mobilization/map.yaml b/mods/ca/missions/main-campaign/ca29-mobilization/map.yaml new file mode 100644 index 0000000000..d24b40023a --- /dev/null +++ b/mods/ca/missions/main-campaign/ca29-mobilization/map.yaml @@ -0,0 +1,8616 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 29: Mobilization + +Author: Darkademic + +Tileset: TEMPERAT + +MapSize: 146,130 + +Bounds: 1,1,144,128 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: GDI, Scrin, Slaves, Greece, USSR, Nod + PlayerReference@GDI: + Name: GDI + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: gdi + LockColor: True + Color: F2CF74 + LockSpawn: True + LockTeam: True + Allies: Greece, Nod, USSR + Enemies: Scrin, Slaves, Creeps + PlayerReference@Scrin: + Name: Scrin + Bot: campaign + Faction: scrin + Color: 7700FF + Allies: Slaves + Enemies: GDI, Creeps, Nod, Greece, USSR + PlayerReference@Greece: + Name: Greece + Bot: campaign + Faction: allies + Color: 99ACF2 + Allies: GDI, Nod, USSR + Enemies: Scrin, Slaves, Creeps + PlayerReference@USSR: + Name: USSR + Bot: campaign + Faction: soviet + Color: FE1100 + Allies: GDI, Greece, Nod + Enemies: Scrin, Slaves, Creeps + PlayerReference@Nod: + Name: Nod + Bot: campaign + Faction: nod + Color: 6D738C + Allies: GDI, Greece, USSR + Enemies: Scrin, Slaves, Creeps + PlayerReference@Slaves: + Name: Slaves + Bot: campaign + Faction: allies + Color: D500E8 + Allies: Scrin + Enemies: GDI, Creeps, Nod, Greece, USSR + +Actors: + Actor0: tc05 + Owner: Neutral + Location: 98,95 + Actor1: tc05 + Owner: Neutral + Location: 123,64 + Actor3: tc05 + Owner: Neutral + Location: 87,16 + Actor4: tc05 + Owner: Neutral + Location: 0,9 + Actor5: tc05 + Owner: Neutral + Location: 53,80 + Actor6: tc05 + Owner: Neutral + Location: 2,121 + Actor8: tc05 + Owner: Neutral + Location: 12,54 + Actor10: tc03 + Owner: Neutral + Location: 49,112 + Actor13: tc03 + Owner: Neutral + Location: 48,12 + Actor15: tc04 + Owner: Neutral + Location: 104,120 + Actor16: tc04 + Owner: Neutral + Location: 27,68 + Actor17: tc04 + Owner: Neutral + Location: 141,79 + Actor18: tc03 + Owner: Neutral + Location: 103,98 + Actor19: tc04 + Owner: Neutral + Location: 103,124 + Actor20: tc04 + Owner: Neutral + Location: 56,83 + Actor21: tc04 + Owner: Neutral + Location: 30,76 + Actor22: tc04 + Owner: Neutral + Location: 68,4 + Actor23: tc03 + Owner: Neutral + Location: 141,84 + Actor25: tc03 + Owner: Neutral + Location: 126,64 + Actor26: tc03 + Owner: Neutral + Location: 118,109 + Actor27: tc04 + Owner: Neutral + Location: 59,84 + Actor28: tc04.husk + Owner: Neutral + Location: 29,61 + Actor29: tc04 + Owner: Neutral + Location: 81,46 + Actor30: tc03 + Owner: Neutral + Location: 98,89 + Actor31: tc03 + Owner: Neutral + Location: 107,90 + Actor32: tc04.husk + Owner: Neutral + Location: 114,65 + Actor34: tc03 + Owner: Neutral + Location: 81,16 + Actor35: tc03.husk + Owner: Neutral + Location: 104,34 + Actor37: tc03 + Owner: Neutral + Location: 28,72 + Actor38: tc03.husk + Owner: Neutral + Location: 90,99 + Actor39: tc04 + Owner: Neutral + Location: 17,50 + Actor40: tc03 + Owner: Neutral + Location: 63,87 + Actor41: tc03 + Owner: Neutral + Location: 74,1 + Actor42: tc04 + Owner: Neutral + Location: 92,92 + Actor44: tc04 + Owner: Neutral + Location: 87,50 + Actor45: tc04 + Owner: Neutral + Location: 105,54 + Actor46: tc04 + Owner: Neutral + Location: 110,64 + Actor47: tc02 + Owner: Neutral + Location: 99,120 + Actor48: tc02 + Owner: Neutral + Location: 48,28 + Actor49: tc02 + Owner: Neutral + Location: 55,0 + Actor50: tc02 + Owner: Neutral + Location: 105,97 + Actor51: tc02 + Owner: Neutral + Location: 90,103 + Actor52: tc02 + Owner: Neutral + Location: 112,66 + Actor53: tc02 + Owner: Neutral + Location: 65,86 + Actor54: tc02 + Owner: Neutral + Location: 77,32 + Actor55: tc02 + Owner: Neutral + Location: 37,59 + Actor56: tc02 + Owner: Neutral + Location: 53,79 + Actor57: tc02 + Owner: Neutral + Location: 56,78 + Actor58: tc02 + Owner: Neutral + Location: 100,19 + Actor59: tc02.husk + Owner: Neutral + Location: 107,122 + Actor60: tc02 + Owner: Neutral + Location: 2,6 + Actor61: tc02 + Owner: Neutral + Location: 15,70 + Actor62: tc02 + Owner: Neutral + Location: 17,111 + Actor63: tc02 + Owner: Neutral + Location: 104,19 + Actor64: tc02 + Owner: Neutral + Location: 3,119 + Actor65: tc02.husk + Owner: Neutral + Location: 100,90 + Actor66: tc02 + Owner: Neutral + Location: 75,128 + Actor67: tc02 + Owner: Neutral + Location: 117,69 + Actor68: tc02 + Owner: Neutral + Location: 143,59 + Actor69: tc02 + Owner: Neutral + Location: 72,5 + Actor70: t10 + Owner: Neutral + Location: 92,98 + Actor71: t10 + Owner: Neutral + Location: 43,33 + Actor72: t10 + Owner: Neutral + Location: 49,77 + Actor73: t14 + Owner: Neutral + Location: 73,32 + Actor75: tc01 + Owner: Neutral + Location: 106,18 + Actor76: tc01 + Owner: Neutral + Location: 43,34 + Actor77: tc01 + Owner: Neutral + Location: 2,1 + Actor79: tc01 + Owner: Neutral + Location: 75,125 + Actor80: t14 + Owner: Neutral + Location: 36,78 + Actor81: t10 + Owner: Neutral + Location: 45,34 + Actor82: t14 + Owner: Neutral + Location: 94,94 + Actor83: tc01 + Owner: Neutral + Location: 15,86 + Actor84: t14 + Owner: Neutral + Location: 43,35 + Actor85: t11 + Owner: Neutral + Location: 4,4 + Actor86: t14.husk + Owner: Neutral + Location: 45,35 + Actor87: tc01 + Owner: Neutral + Location: 91,96 + Actor88: t15 + Owner: Neutral + Location: 14,73 + Actor89: t14 + Owner: Neutral + Location: 114,67 + Actor90: t14 + Owner: Neutral + Location: 48,81 + Actor91: t11 + Owner: Neutral + Location: 75,31 + Actor92: t10 + Owner: Neutral + Location: 83,49 + Actor93: t15 + Owner: Neutral + Location: 76,0 + Actor95: t14.husk + Owner: Neutral + Location: 116,108 + Actor96: t10 + Owner: Neutral + Location: 71,2 + Actor97: tc01 + Owner: Neutral + Location: 15,57 + Actor98: t15 + Owner: Neutral + Location: 58,2 + Actor99: t14 + Owner: Neutral + Location: 111,67 + Actor100: t14.husk + Owner: Neutral + Location: 106,123 + Actor101: t14 + Owner: Neutral + Location: 114,24 + Actor102: t11 + Owner: Neutral + Location: 95,99 + Actor103: t11 + Owner: Neutral + Location: 126,65 + Actor104: tc01 + Owner: Neutral + Location: 109,30 + Actor105: t15 + Owner: Neutral + Location: 102,32 + Actor106: t14 + Owner: Neutral + Location: 82,13 + Actor107: t14 + Owner: Neutral + Location: 107,33 + Actor108: tc01 + Owner: Neutral + Location: 57,74 + Actor109: t15 + Owner: Neutral + Location: 29,65 + Actor110: tc01 + Owner: Neutral + Location: 141,86 + Actor111: t10 + Owner: Neutral + Location: 53,82 + Actor112: t10 + Owner: Neutral + Location: 101,124 + Actor113: t10 + Owner: Neutral + Location: 86,48 + Actor114: t15 + Owner: Neutral + Location: 138,78 + Actor115: t10 + Owner: Neutral + Location: 92,95 + Actor116: t15 + Owner: Neutral + Location: 132,109 + Actor119: t11 + Owner: Neutral + Location: 95,128 + Actor120: t11 + Owner: Neutral + Location: 43,36 + Actor121: t15 + Owner: Neutral + Location: 3,30 + Actor122: tc01 + Owner: Neutral + Location: 57,1 + Actor123: t10 + Owner: Neutral + Location: 109,90 + Actor124: tc01 + Owner: Neutral + Location: 46,15 + Actor125: tc01 + Owner: Neutral + Location: 127,67 + Actor126: t10 + Owner: Neutral + Location: 35,55 + Actor127: t14 + Owner: Neutral + Location: 49,120 + Actor128: t14 + Owner: Neutral + Location: 50,12 + Actor129: t10 + Owner: Neutral + Location: 144,19 + Actor130: t15 + Owner: Neutral + Location: 45,29 + Actor131: t14 + Owner: Neutral + Location: 3,17 + Actor132: t10 + Owner: Neutral + Location: 18,63 + Actor133: t15 + Owner: Neutral + Location: 12,29 + Actor134: t11 + Owner: Neutral + Location: 71,3 + Actor135: t14 + Owner: Neutral + Location: 46,0 + Actor136: t10 + Owner: Neutral + Location: 115,66 + Actor137: t11 + Owner: Neutral + Location: 100,87 + Actor139: t14 + Owner: Neutral + Location: 13,71 + Actor140: tc01 + Owner: Neutral + Location: 71,0 + Actor141: tc01 + Owner: Neutral + Location: 36,64 + Actor142: t10 + Owner: Neutral + Location: 120,100 + Actor143: tc01 + Owner: Neutral + Location: 14,56 + Actor144: t14 + Owner: Neutral + Location: 19,61 + Actor145: t14 + Owner: Neutral + Location: 94,62 + Actor146: t14.husk + Owner: Neutral + Location: 142,67 + Actor147: t11 + Owner: Neutral + Location: 52,75 + Actor148: t14 + Owner: Neutral + Location: 102,85 + Actor149: t11 + Owner: Neutral + Location: 88,100 + Actor150: t11 + Owner: Neutral + Location: 21,58 + Actor151: tc01 + Owner: Neutral + Location: 90,16 + Actor152: t14 + Owner: Neutral + Location: 35,77 + Actor153: t11 + Owner: Neutral + Location: 78,2 + Actor154: t11 + Owner: Neutral + Location: 103,96 + Actor155: t10 + Owner: Neutral + Location: 79,49 + Actor156: t11 + Owner: Neutral + Location: 139,80 + Actor157: t14 + Owner: Neutral + Location: 16,55 + Actor158: t15 + Owner: Neutral + Location: 86,18 + Actor159: t11 + Owner: Neutral + Location: 35,59 + Actor160: tc01 + Owner: Neutral + Location: 60,80 + Actor161: t15 + Owner: Neutral + Location: 2,13 + Actor162: t15 + Owner: Neutral + Location: 118,63 + Actor163: t14 + Owner: Neutral + Location: 18,83 + Actor164: t15 + Owner: Neutral + Location: 48,83 + Actor165: t14 + Owner: Neutral + Location: 45,32 + Actor166: tc01 + Owner: Neutral + Location: 3,11 + Actor167: t10 + Owner: Neutral + Location: 122,112 + Actor168: t11 + Owner: Neutral + Location: 128,25 + Actor170: t10.husk + Owner: Neutral + Location: 76,28 + Actor171: t11 + Owner: Neutral + Location: 46,28 + Actor172: t10 + Owner: Neutral + Location: 104,123 + Actor173: tc01 + Owner: Neutral + Location: 41,46 + Actor174: t10 + Owner: Neutral + Location: 16,48 + Actor175: t11 + Owner: Neutral + Location: 121,65 + Actor176: tc01.husk + Owner: Neutral + Location: 14,69 + Actor177: tc01 + Owner: Neutral + Location: 111,44 + Actor178: t10 + Owner: Neutral + Location: 58,0 + Actor179: t14 + Owner: Neutral + Location: 50,11 + Actor180: t10 + Owner: Neutral + Location: 3,8 + Actor181: tc01 + Owner: Neutral + Location: 63,89 + Actor182: t11 + Owner: Neutral + Location: 93,97 + Actor183: t11 + Owner: Neutral + Location: 116,101 + Actor184: t15 + Owner: Neutral + Location: 72,1 + Actor185: tc01 + Owner: Neutral + Location: 2,2 + Actor187: tc01 + Owner: Neutral + Location: 14,49 + Actor188: tc01 + Owner: Neutral + Location: 33,75 + Actor189: t11 + Owner: Neutral + Location: 107,94 + Actor190: t11 + Owner: Neutral + Location: 13,70 + Actor192: t15 + Owner: Neutral + Location: 68,6 + Actor193: t11 + Owner: Neutral + Location: 58,78 + Actor194: t10 + Owner: Neutral + Location: 119,65 + Actor195: t10 + Owner: Neutral + Location: 10,126 + Actor196: t10 + Owner: Neutral + Location: 82,47 + Actor197: t14.husk + Owner: Neutral + Location: 119,67 + Actor198: t10.husk + Owner: Neutral + Location: 141,77 + Actor199: t11 + Owner: Neutral + Location: 30,64 + Actor200: t11 + Owner: Neutral + Location: 19,60 + Actor201: t14 + Owner: Neutral + Location: 77,1 + Actor202: t10 + Owner: Neutral + Location: 29,70 + Actor203: tc01 + Owner: Neutral + Location: 98,128 + Actor204: t15 + Owner: Neutral + Location: 48,31 + Actor205: t15 + Owner: Neutral + Location: 4,126 + Actor206: tc01 + Owner: Neutral + Location: 49,78 + Actor207: t14 + Owner: Neutral + Location: 18,84 + Actor208: t15 + Owner: Neutral + Location: 118,102 + Actor209: tc01 + Owner: Neutral + Location: 101,123 + Actor210: t15 + Owner: Neutral + Location: 115,106 + Actor211: t11 + Owner: Neutral + Location: 130,26 + Actor212: tc01 + Owner: Neutral + Location: 136,82 + Actor213: t15 + Owner: Neutral + Location: 107,65 + Actor214: t11 + Owner: Neutral + Location: 97,101 + Actor215: t11.husk + Owner: Neutral + Location: 117,103 + Actor216: t14 + Owner: Neutral + Location: 59,79 + Actor217: t14 + Owner: Neutral + Location: 43,38 + Actor218: tc01.husk + Owner: Neutral + Location: 30,66 + Actor219: t10 + Owner: Neutral + Location: 128,64 + Actor220: t14 + Owner: Neutral + Location: 47,30 + Actor221: t14 + Owner: Neutral + Location: 93,99 + Actor222: t15 + Owner: Neutral + Location: 61,86 + Actor223: t10 + Owner: Neutral + Location: 113,109 + Actor224: t11 + Owner: Neutral + Location: 47,10 + Actor225: t14 + Owner: Neutral + Location: 86,47 + Actor226: tc01 + Owner: Neutral + Location: 95,101 + Actor227: t11.husk + Owner: Neutral + Location: 49,114 + Actor228: t15 + Owner: Neutral + Location: 105,91 + Actor229: t11 + Owner: Neutral + Location: 18,59 + Actor230: t14.husk + Owner: Neutral + Location: 96,102 + Actor231: tc01 + Owner: Neutral + Location: 94,90 + Actor232: t11 + Owner: Neutral + Location: 111,62 + Actor233: t10.husk + Owner: Neutral + Location: 16,85 + Actor234: tc01 + Owner: Neutral + Location: 15,54 + Actor235: tc01 + Owner: Neutral + Location: 47,80 + Actor236: t15 + Owner: Neutral + Location: 35,73 + Actor237: tc01 + Owner: Neutral + Location: 34,54 + Actor238: t11 + Owner: Neutral + Location: 60,89 + Actor239: t11 + Owner: Neutral + Location: 61,85 + Actor240: t11 + Owner: Neutral + Location: 104,90 + Actor241: t14 + Owner: Neutral + Location: 36,56 + Actor242: t14.husk + Owner: Neutral + Location: 56,80 + Actor244: t11.husk + Owner: Neutral + Location: 51,2 + Actor245: t10 + Owner: Neutral + Location: 116,60 + Actor246: t11 + Owner: Neutral + Location: 105,35 + Actor247: t15 + Owner: Neutral + Location: 15,53 + Actor248: tc01 + Owner: Neutral + Location: 99,91 + Actor249: tc01 + Owner: Neutral + Location: 73,14 + Actor250: t15 + Owner: Neutral + Location: 18,51 + Actor251: t10 + Owner: Neutral + Location: 104,125 + Actor253: t14 + Owner: Neutral + Location: 55,90 + Actor254: t10 + Owner: Neutral + Location: 69,16 + Actor255: tc01 + Owner: Neutral + Location: 6,126 + Actor256: t10 + Owner: Neutral + Location: 1,15 + Actor257: t14 + Owner: Neutral + Location: 71,15 + Actor258: t14 + Owner: Neutral + Location: 101,91 + Actor259: t11 + Owner: Neutral + Location: 30,57 + Actor260: tc01 + Owner: Neutral + Location: 118,58 + Actor261: tc01 + Owner: Neutral + Location: 13,25 + Actor262: t10 + Owner: Neutral + Location: 138,128 + Actor263: t15 + Owner: Neutral + Location: 102,95 + Actor264: t11 + Owner: Neutral + Location: 94,95 + Actor265: tc01 + Owner: Neutral + Location: 11,28 + Actor266: tc01 + Owner: Neutral + Location: 119,69 + Actor267: tc01 + Owner: Neutral + Location: 45,36 + Actor268: t11 + Owner: Neutral + Location: 16,60 + Actor269: t14 + Owner: Neutral + Location: 77,124 + Actor270: t12 + Owner: Neutral + Location: 5,15 + Actor271: t05 + Owner: Neutral + Location: 137,104 + Actor272: t17 + Owner: Neutral + Location: 144,68 + Actor273: t08.husk + Owner: Neutral + Location: 90,92 + Actor274: t16 + Owner: Neutral + Location: 59,77 + Actor275: t17 + Owner: Neutral + Location: 47,33 + Actor276: t13 + Owner: Neutral + Location: 109,11 + Actor277: t12 + Owner: Neutral + Location: 48,9 + Actor278: t07 + Owner: Neutral + Location: 17,71 + Actor279: t02 + Owner: Neutral + Location: 50,13 + Actor280: t02 + Owner: Neutral + Location: 32,51 + Actor282: t03 + Owner: Neutral + Location: 47,2 + Actor283: t08 + Owner: Neutral + Location: 94,62 + Actor284: t16 + Owner: Neutral + Location: 48,79 + Actor285: t17 + Owner: Neutral + Location: 116,103 + Actor287: t02 + Owner: Neutral + Location: 5,127 + Actor288: t12 + Owner: Neutral + Location: 56,79 + Actor289: t17 + Owner: Neutral + Location: 89,98 + Actor290: t03 + Owner: Neutral + Location: 100,17 + Actor291: t13 + Owner: Neutral + Location: 77,2 + Actor292: t07 + Owner: Neutral + Location: 78,123 + Actor293: t05 + Owner: Neutral + Location: 95,98 + Actor294: t05 + Owner: Neutral + Location: 142,15 + Actor295: t17 + Owner: Neutral + Location: 8,125 + Actor296: t05 + Owner: Neutral + Location: 29,78 + Actor297: t06 + Owner: Neutral + Location: 101,92 + Actor298: t01 + Owner: Neutral + Location: 19,113 + Actor299: t13 + Owner: Neutral + Location: 50,79 + Actor300: t17 + Owner: Neutral + Location: 30,67 + Actor301: t07 + Owner: Neutral + Location: 17,62 + Actor302: t06 + Owner: Neutral + Location: 17,109 + Actor303: t13.husk + Owner: Neutral + Location: 122,64 + Actor304: t06 + Owner: Neutral + Location: 107,121 + Actor305: t12 + Owner: Neutral + Location: 76,41 + Actor306: t08 + Owner: Neutral + Location: 76,44 + Actor307: t12 + Owner: Neutral + Location: 74,20 + Actor308: t08 + Owner: Neutral + Location: 20,63 + Actor309: t13 + Owner: Neutral + Location: 102,56 + Actor310: t02.husk + Owner: Neutral + Location: 2,96 + Actor311: t01 + Owner: Neutral + Location: 72,16 + Actor312: t02 + Owner: Neutral + Location: 50,1 + Actor313: t16 + Owner: Neutral + Location: 5,124 + Actor314: t12 + Owner: Neutral + Location: 14,72 + Actor316: t06.husk + Owner: Neutral + Location: 2,85 + Actor317: t17 + Owner: Neutral + Location: 1,87 + Actor318: t03 + Owner: Neutral + Location: 33,74 + Actor319: t05 + Owner: Neutral + Location: 59,75 + Actor320: t13 + Owner: Neutral + Location: 76,45 + Actor321: t03 + Owner: Neutral + Location: 84,14 + Actor322: t06 + Owner: Neutral + Location: 1,97 + Actor323: t07 + Owner: Neutral + Location: 120,63 + Actor325: t06 + Owner: Neutral + Location: 51,81 + Actor326: t17 + Owner: Neutral + Location: 107,96 + Actor327: t03 + Owner: Neutral + Location: 120,95 + Actor328: t07 + Owner: Neutral + Location: 14,118 + Actor329: t16 + Owner: Neutral + Location: 73,2 + Actor330: t13 + Owner: Neutral + Location: 48,1 + Actor332: t01 + Owner: Neutral + Location: 145,17 + Actor333: t05 + Owner: Neutral + Location: 144,15 + Actor335: t12 + Owner: Neutral + Location: 46,2 + Actor336: t05 + Owner: Neutral + Location: 109,92 + Actor338: t03 + Owner: Neutral + Location: 128,47 + Actor339: t08 + Owner: Neutral + Location: 31,59 + Actor340: t12 + Owner: Neutral + Location: 102,126 + Actor341: t03 + Owner: Neutral + Location: 99,17 + Actor342: t16 + Owner: Neutral + Location: 1,98 + Actor343: t13.husk + Owner: Neutral + Location: 90,100 + Actor344: t03 + Owner: Neutral + Location: 56,75 + Actor345: t13 + Owner: Neutral + Location: 117,66 + Actor346: t06 + Owner: Neutral + Location: 59,87 + Actor347: t05 + Owner: Neutral + Location: 8,68 + Actor349: t08 + Owner: Neutral + Location: 34,32 + Actor350: t06 + Owner: Neutral + Location: 47,35 + Actor351: t13 + Owner: Neutral + Location: 119,66 + Actor352: t07 + Owner: Neutral + Location: 60,81 + Actor353: t08 + Owner: Neutral + Location: 88,47 + Actor354: t02 + Owner: Neutral + Location: 76,126 + Actor355: t08 + Owner: Neutral + Location: 52,110 + Actor356: t02 + Owner: Neutral + Location: 99,86 + Actor357: t01 + Owner: Neutral + Location: 49,118 + Actor358: t16 + Owner: Neutral + Location: 12,60 + Actor359: t12 + Owner: Neutral + Location: 41,45 + Actor360: t08 + Owner: Neutral + Location: 52,91 + Actor361: t07 + Owner: Neutral + Location: 5,8 + Actor362: t07 + Owner: Neutral + Location: 3,16 + Actor363: t08 + Owner: Neutral + Location: 45,40 + Actor364: t13 + Owner: Neutral + Location: 13,59 + Actor366: t05 + Owner: Neutral + Location: 13,49 + Actor367: t03 + Owner: Neutral + Location: 51,0 + Actor368: t16 + Owner: Neutral + Location: 8,126 + Actor369: t13 + Owner: Neutral + Location: 57,79 + Actor370: t02 + Owner: Neutral + Location: 106,90 + Actor371: t08 + Owner: Neutral + Location: 130,25 + Actor373: t17 + Owner: Neutral + Location: 2,11 + Actor374: t01 + Owner: Neutral + Location: 55,77 + Actor375: t02.husk + Owner: Neutral + Location: 105,104 + Actor376: t12 + Owner: Neutral + Location: 51,76 + Actor377: t05 + Owner: Neutral + Location: 35,31 + Actor378: t12 + Owner: Neutral + Location: 101,84 + Actor379: t07 + Owner: Neutral + Location: 86,50 + Actor380: t07 + Owner: Neutral + Location: 43,40 + Actor381: t01 + Owner: Neutral + Location: 136,81 + Actor382: t06.husk + Owner: Neutral + Location: 48,112 + Actor383: t05 + Owner: Neutral + Location: 107,124 + Actor384: t05 + Owner: Neutral + Location: 69,2 + Actor385: t03 + Owner: Neutral + Location: 102,15 + Actor386: t07 + Owner: Neutral + Location: 52,81 + Actor387: t06 + Owner: Neutral + Location: 120,111 + Actor388: t07 + Owner: Neutral + Location: 110,32 + Actor389: t01 + Owner: Neutral + Location: 101,125 + Actor390: t13 + Owner: Neutral + Location: 31,59 + Actor391: t05 + Owner: Neutral + Location: 93,90 + Actor392: t17 + Owner: Neutral + Location: 14,50 + Actor393: t02 + Owner: Neutral + Location: 104,86 + Actor394: t16 + Owner: Neutral + Location: 144,67 + Actor395: t17 + Owner: Neutral + Location: 12,18 + Actor396: t13 + Owner: Neutral + Location: 64,84 + Actor397: t13 + Owner: Neutral + Location: 89,93 + Actor398: t01 + Owner: Neutral + Location: 55,1 + Actor400: t12 + Owner: Neutral + Location: 53,77 + Actor401: t13 + Owner: Neutral + Location: 103,99 + Actor402: t12 + Owner: Neutral + Location: 31,60 + Actor404: t03.husk + Owner: Neutral + Location: 129,67 + Actor405: t17 + Owner: Neutral + Location: 140,79 + Actor406: t06 + Owner: Neutral + Location: 101,98 + Actor407: t08.husk + Owner: Neutral + Location: 59,84 + Actor408: t17 + Owner: Neutral + Location: 33,51 + Actor409: t03 + Owner: Neutral + Location: 107,53 + Actor410: t01 + Owner: Neutral + Location: 40,44 + Actor411: t02 + Owner: Neutral + Location: 89,88 + Actor412: t05 + Owner: Neutral + Location: 6,124 + Actor413: t01 + Owner: Neutral + Location: 101,36 + Actor414: t08.husk + Owner: Neutral + Location: 18,54 + Actor415: t01 + Owner: Neutral + Location: 33,72 + Actor416: t02 + Owner: Neutral + Location: 78,44 + Actor417: t17 + Owner: Neutral + Location: 83,16 + Actor418: t16 + Owner: Neutral + Location: 122,58 + Actor419: t13 + Owner: Neutral + Location: 103,20 + Actor421: t08 + Owner: Neutral + Location: 14,30 + Actor422: t06 + Owner: Neutral + Location: 91,18 + Actor423: t02 + Owner: Neutral + Location: 86,51 + Actor425: t12.husk + Owner: Neutral + Location: 65,84 + Actor426: t06 + Owner: Neutral + Location: 48,33 + Actor427: t13 + Owner: Neutral + Location: 104,54 + Actor428: t12 + Owner: Neutral + Location: 57,86 + Actor429: t05 + Owner: Neutral + Location: 66,89 + Actor430: t07 + Owner: Neutral + Location: 78,125 + Actor431: t08 + Owner: Neutral + Location: 108,93 + Actor432: t06.husk + Owner: Neutral + Location: 4,123 + Actor433: t12 + Owner: Neutral + Location: 30,68 + Actor434: t05 + Owner: Neutral + Location: 115,103 + Actor435: t06 + Owner: Neutral + Location: 79,0 + Actor436: t16 + Owner: Neutral + Location: 34,72 + Actor437: t05 + Owner: Neutral + Location: 116,64 + Actor438: t12 + Owner: Neutral + Location: 34,62 + Actor439: t08 + Owner: Neutral + Location: 0,3 + Actor440: t12 + Owner: Neutral + Location: 2,3 + Actor441: t05.husk + Owner: Neutral + Location: 49,113 + Actor442: t08 + Owner: Neutral + Location: 94,104 + Actor443: t05 + Owner: Neutral + Location: 93,128 + Actor444: t06 + Owner: Neutral + Location: 128,46 + Actor445: t16.husk + Owner: Neutral + Location: 34,32 + Actor446: t03 + Owner: Neutral + Location: 128,65 + Actor447: t01 + Owner: Neutral + Location: 116,63 + Actor448: t01 + Owner: Neutral + Location: 30,63 + Actor449: t05 + Owner: Neutral + Location: 85,19 + Actor450: t17 + Owner: Neutral + Location: 32,79 + Actor451: t08 + Owner: Neutral + Location: 133,40 + Actor453: t03 + Owner: Neutral + Location: 48,118 + Actor454: t16 + Owner: Neutral + Location: 73,39 + Actor455: t17 + Owner: Neutral + Location: 49,116 + Actor456: t12 + Owner: Neutral + Location: 15,52 + Actor457: t13 + Owner: Neutral + Location: 30,60 + Actor458: t05 + Owner: Neutral + Location: 67,84 + Actor459: t13 + Owner: Neutral + Location: 122,108 + Actor460: t12 + Owner: Neutral + Location: 46,17 + Actor461: t12 + Owner: Neutral + Location: 53,90 + Actor462: t17 + Owner: Neutral + Location: 106,93 + Actor463: t16 + Owner: Neutral + Location: 45,45 + Actor464: t12 + Owner: Neutral + Location: 104,18 + Actor465: t02 + Owner: Neutral + Location: 91,107 + Actor466: t06 + Owner: Neutral + Location: 89,99 + Actor467: t13 + Owner: Neutral + Location: 114,63 + Actor468: t07 + Owner: Neutral + Location: 3,23 + Actor469: t02 + Owner: Neutral + Location: 12,59 + Actor470: t08 + Owner: Neutral + Location: 142,77 + Actor471: t03 + Owner: Neutral + Location: 113,106 + Actor472: t05 + Owner: Neutral + Location: 101,14 + Actor473: t13 + Owner: Neutral + Location: 68,87 + Actor474: t05 + Owner: Neutral + Location: 52,83 + Actor475: t12 + Owner: Neutral + Location: 126,72 + Actor477: t12 + Owner: Neutral + Location: 1,57 + Actor478: t06 + Owner: Neutral + Location: 33,34 + Actor479: t01 + Owner: Neutral + Location: 51,75 + Actor480: t01 + Owner: Neutral + Location: 88,88 + Actor481: t12 + Owner: Neutral + Location: 11,115 + Actor483: t07 + Owner: Neutral + Location: 67,6 + Actor485: t07 + Owner: Neutral + Location: 128,29 + Actor486: t08 + Owner: Neutral + Location: 107,100 + Actor487: t05 + Owner: Neutral + Location: 126,14 + Actor488: t16.husk + Owner: Neutral + Location: 138,127 + Actor489: t03 + Owner: Neutral + Location: 90,93 + Actor490: t12 + Owner: Neutral + Location: 53,0 + Actor491: t08 + Owner: Neutral + Location: 90,98 + Actor492: t17 + Owner: Neutral + Location: 104,93 + Actor493: t08 + Owner: Neutral + Location: 55,84 + Actor494: t03 + Owner: Neutral + Location: 92,109 + Actor495: t06 + Owner: Neutral + Location: 133,101 + Actor496: t08 + Owner: Neutral + Location: 11,72 + Actor498: t07 + Owner: Neutral + Location: 90,95 + Actor499: t01 + Owner: Neutral + Location: 105,94 + Actor500: t07 + Owner: Neutral + Location: 139,29 + Actor501: t06 + Owner: Neutral + Location: 91,100 + Actor502: t08 + Owner: Neutral + Location: 121,109 + Actor503: t02 + Owner: Neutral + Location: 16,84 + Actor504: t17 + Owner: Neutral + Location: 45,37 + Actor506: t01 + Owner: Neutral + Location: 4,12 + Actor507: t17 + Owner: Neutral + Location: 4,28 + Actor508: t08 + Owner: Neutral + Location: 42,37 + Actor510: t12 + Owner: Neutral + Location: 13,57 + Actor511: t08 + Owner: Neutral + Location: 13,18 + Actor512: t06 + Owner: Neutral + Location: 120,109 + Actor513: t02 + Owner: Neutral + Location: 139,81 + Actor514: t05 + Owner: Neutral + Location: 65,88 + Actor515: t01 + Owner: Neutral + Location: 75,42 + Actor516: t03 + Owner: Neutral + Location: 18,68 + Actor517: t13 + Owner: Neutral + Location: 118,66 + Actor518: t08 + Owner: Neutral + Location: 142,67 + Actor519: t13 + Owner: Neutral + Location: 90,92 + Actor521: t13 + Owner: Neutral + Location: 129,27 + Actor522: t17 + Owner: Neutral + Location: 93,103 + Actor523: t13 + Owner: Neutral + Location: 14,47 + Actor524: t02 + Owner: Neutral + Location: 85,47 + Actor526: t13 + Owner: Neutral + Location: 28,77 + Actor527: t12 + Owner: Neutral + Location: 66,88 + Actor528: t08 + Owner: Neutral + Location: 25,72 + Actor529: t17 + Owner: Neutral + Location: 0,15 + Actor530: t17 + Owner: Neutral + Location: 57,75 + Actor531: t16 + Owner: Neutral + Location: 89,97 + Actor532: t02 + Owner: Neutral + Location: 28,66 + Actor533: t03.husk + Owner: Neutral + Location: 17,74 + Actor534: t08 + Owner: Neutral + Location: 14,19 + Actor535: t13 + Owner: Neutral + Location: 45,33 + Actor536: t03 + Owner: Neutral + Location: 99,127 + Actor537: t17 + Owner: Neutral + Location: 5,16 + Actor538: t01 + Owner: Neutral + Location: 31,78 + Actor539: t17.husk + Owner: Neutral + Location: 58,87 + Actor541: t07 + Owner: Neutral + Location: 71,4 + Actor542: t13.husk + Owner: Neutral + Location: 114,61 + Actor543: t13 + Owner: Neutral + Location: 56,76 + Actor544: t13 + Owner: Neutral + Location: 48,13 + Actor545: t17 + Owner: Neutral + Location: 137,81 + Actor546: t13 + Owner: Neutral + Location: 36,75 + Actor547: t01 + Owner: Neutral + Location: 51,80 + Actor548: t13 + Owner: Neutral + Location: 13,74 + Actor549: t07 + Owner: Neutral + Location: 130,64 + Actor550: t12 + Owner: Neutral + Location: 108,30 + Actor553: t13 + Owner: Neutral + Location: 65,41 + Actor554: t05 + Owner: Neutral + Location: 54,89 + Actor555: t07 + Owner: Neutral + Location: 81,13 + Actor556: t02 + Owner: Neutral + Location: 16,49 + Actor557: t17 + Owner: Neutral + Location: 16,71 + Actor558: t03 + Owner: Neutral + Location: 88,48 + Actor559: t07 + Owner: Neutral + Location: 74,41 + Actor560: t13.husk + Owner: Neutral + Location: 104,55 + Actor561: t05 + Owner: Neutral + Location: 142,81 + Actor562: t17 + Owner: Neutral + Location: 134,47 + Actor563: t17 + Owner: Neutral + Location: 95,103 + Actor564: t12 + Owner: Neutral + Location: 108,10 + Actor565: t06 + Owner: Neutral + Location: 34,55 + Actor566: t02 + Owner: Neutral + Location: 108,66 + Actor567: t12 + Owner: Neutral + Location: 117,104 + Actor568: t05.husk + Owner: Neutral + Location: 105,122 + Actor569: t02 + Owner: Neutral + Location: 64,42 + Actor570: t13 + Owner: Neutral + Location: 132,44 + Actor571: t12 + Owner: Neutral + Location: 124,57 + Actor572: t13 + Owner: Neutral + Location: 103,35 + Actor573: t17 + Owner: Neutral + Location: 15,72 + Actor574: t16 + Owner: Neutral + Location: 113,67 + Actor575: t05 + Owner: Neutral + Location: 94,104 + Actor576: t08 + Owner: Neutral + Location: 16,88 + Actor577: t03 + Owner: Neutral + Location: 105,99 + Actor578: t16 + Owner: Neutral + Location: 144,85 + Actor579: t03 + Owner: Neutral + Location: 96,104 + Actor580: t01 + Owner: Neutral + Location: 75,23 + Actor581: t01 + Owner: Neutral + Location: 113,107 + Actor582: t06 + Owner: Neutral + Location: 3,4 + Actor583: t16.husk + Owner: Neutral + Location: 0,57 + Actor584: t02 + Owner: Neutral + Location: 66,38 + Actor585: t08 + Owner: Neutral + Location: 73,97 + Actor586: t03 + Owner: Neutral + Location: 33,71 + Actor587: t13 + Owner: Neutral + Location: 121,69 + Actor589: t08 + Owner: Neutral + Location: 112,66 + Actor590: t05.husk + Owner: Neutral + Location: 139,77 + Actor591: t13 + Owner: Neutral + Location: 34,70 + Actor592: t01 + Owner: Neutral + Location: 107,34 + Actor593: t03 + Owner: Neutral + Location: 31,73 + Actor594: t12 + Owner: Neutral + Location: 122,111 + Actor595: t07.husk + Owner: Neutral + Location: 2,14 + Actor596: t03 + Owner: Neutral + Location: 21,61 + Actor597: t02 + Owner: Neutral + Location: 72,17 + Actor598: t17 + Owner: Neutral + Location: 53,2 + Actor599: t07 + Owner: Neutral + Location: 33,78 + Actor600: t06 + Owner: Neutral + Location: 103,8 + Actor601: t13 + Owner: Neutral + Location: 58,88 + Actor602: t02.husk + Owner: Neutral + Location: 17,52 + Actor603: t06 + Owner: Neutral + Location: 122,68 + Actor604: t16 + Owner: Neutral + Location: 75,41 + Actor605: t06.husk + Owner: Neutral + Location: 56,3 + Actor606: t01 + Owner: Neutral + Location: 88,22 + Actor608: t01 + Owner: Neutral + Location: 123,110 + Actor609: t16 + Owner: Neutral + Location: 54,75 + Actor610: t08 + Owner: Neutral + Location: 117,62 + Actor611: t05 + Owner: Neutral + Location: 51,34 + Actor613: t02 + Owner: Neutral + Location: 118,67 + Actor614: t05 + Owner: Neutral + Location: 142,87 + Actor615: t01.husk + Owner: Neutral + Location: 93,105 + Actor617: t03 + Owner: Neutral + Location: 118,107 + Actor618: t05.husk + Owner: Neutral + Location: 102,18 + Actor619: t06 + Owner: Neutral + Location: 102,21 + Actor620: t16 + Owner: Neutral + Location: 100,89 + Actor621: t16 + Owner: Neutral + Location: 121,66 + Actor622: t01 + Owner: Neutral + Location: 133,107 + Actor623: t05 + Owner: Neutral + Location: 76,40 + Actor624: t07 + Owner: Neutral + Location: 44,45 + Actor625: t17 + Owner: Neutral + Location: 103,33 + Actor626: t16 + Owner: Neutral + Location: 74,15 + Actor627: t01 + Owner: Neutral + Location: 52,74 + Actor628: t06 + Owner: Neutral + Location: 12,26 + Actor630: t06 + Owner: Neutral + Location: 3,29 + Actor631: t17 + Owner: Neutral + Location: 105,17 + Actor632: t06 + Owner: Neutral + Location: 51,10 + Actor633: t02 + Owner: Neutral + Location: 124,66 + Actor634: t05 + Owner: Neutral + Location: 92,15 + Actor635: t17 + Owner: Neutral + Location: 6,104 + Actor636: t03 + Owner: Neutral + Location: 91,105 + Actor637: t12.husk + Owner: Neutral + Location: 12,55 + Actor638: t16 + Owner: Neutral + Location: 2,90 + Actor639: t13 + Owner: Neutral + Location: 11,72 + Actor641: t03 + Owner: Neutral + Location: 77,45 + Actor642: t07 + Owner: Neutral + Location: 59,86 + Actor643: t05 + Owner: Neutral + Location: 144,69 + Actor646: t13 + Owner: Neutral + Location: 133,108 + Actor647: t08 + Owner: Neutral + Location: 19,49 + Actor648: t13 + Owner: Neutral + Location: 4,0 + Actor649: t13 + Owner: Neutral + Location: 10,72 + Actor650: t01 + Owner: Neutral + Location: 107,92 + Actor651: t06 + Owner: Neutral + Location: 75,28 + Actor652: t16 + Owner: Neutral + Location: 88,94 + Actor655: t01 + Owner: Neutral + Location: 52,106 + Actor656: t06 + Owner: Neutral + Location: 75,44 + Actor657: t05 + Owner: Neutral + Location: 30,78 + Actor658: t16 + Owner: Neutral + Location: 17,84 + Actor659: t08 + Owner: Neutral + Location: 4,30 + Actor660: t16 + Owner: Neutral + Location: 113,64 + Actor661: t16 + Owner: Neutral + Location: 12,71 + Actor662: t08 + Owner: Neutral + Location: 31,64 + Actor663: t07 + Owner: Neutral + Location: 34,66 + Actor664: t06 + Owner: Neutral + Location: 89,103 + Actor665: t05 + Owner: Neutral + Location: 98,91 + Actor666: t03.husk + Owner: Neutral + Location: 139,82 + Actor667: t16 + Owner: Neutral + Location: 8,70 + Actor668: t02 + Owner: Neutral + Location: 106,121 + Actor669: t16 + Owner: Neutral + Location: 109,10 + Actor670: t01 + Owner: Neutral + Location: 120,108 + Actor671: t17 + Owner: Neutral + Location: 34,73 + Actor672: t02 + Owner: Neutral + Location: 64,35 + Actor673: t05 + Owner: Neutral + Location: 1,83 + Actor674: t06 + Owner: Neutral + Location: 53,11 + Actor675: t17 + Owner: Neutral + Location: 99,92 + Actor676: t12 + Owner: Neutral + Location: 80,127 + Actor677: t17 + Owner: Neutral + Location: 68,7 + Actor678: t07 + Owner: Neutral + Location: 103,93 + Actor680: t12 + Owner: Neutral + Location: 35,66 + Actor681: t08 + Owner: Neutral + Location: 54,78 + Actor682: t17 + Owner: Neutral + Location: 18,112 + Actor683: t07 + Owner: Neutral + Location: 74,44 + Actor684: t05 + Owner: Neutral + Location: 17,112 + Actor685: t01 + Owner: Neutral + Location: 114,106 + Actor687: t01 + Owner: Neutral + Location: 37,66 + Actor688: t17 + Owner: Neutral + Location: 119,59 + Actor689: t02 + Owner: Neutral + Location: 108,36 + Actor690: t16 + Owner: Neutral + Location: 47,112 + Actor691: t13 + Owner: Neutral + Location: 5,9 + Actor692: t17 + Owner: Neutral + Location: 37,76 + Actor693: t12 + Owner: Neutral + Location: 62,88 + Actor694: t05 + Owner: Neutral + Location: 108,95 + Actor695: t01 + Owner: Neutral + Location: 144,12 + Actor696: t06 + Owner: Neutral + Location: 72,18 + Actor697: t07 + Owner: Neutral + Location: 134,40 + Actor698: t02 + Owner: Neutral + Location: 119,104 + Actor700: t05 + Owner: Neutral + Location: 103,108 + Actor701: t06 + Owner: Neutral + Location: 123,108 + Actor702: t07 + Owner: Neutral + Location: 69,5 + Actor703: t08.husk + Owner: Neutral + Location: 61,82 + Actor704: t05 + Owner: Neutral + Location: 110,67 + Actor705: t16 + Owner: Neutral + Location: 3,123 + Actor706: t07 + Owner: Neutral + Location: 14,32 + Actor707: t08 + Owner: Neutral + Location: 19,65 + Actor708: t02 + Owner: Neutral + Location: 122,106 + Actor709: t07 + Owner: Neutral + Location: 75,3 + Actor710: t17 + Owner: Neutral + Location: 13,117 + Actor711: t13 + Owner: Neutral + Location: 63,4 + Actor712: t13 + Owner: Neutral + Location: 140,78 + Actor713: t16 + Owner: Neutral + Location: 109,95 + Actor714: t01 + Owner: Neutral + Location: 1,31 + Actor715: t13.husk + Owner: Neutral + Location: 143,80 + Actor717: t03 + Owner: Neutral + Location: 12,72 + Actor718: t03.husk + Owner: Neutral + Location: 58,75 + Actor719: t12 + Owner: Neutral + Location: 79,46 + Actor720: t13 + Owner: Neutral + Location: 77,43 + Actor721: t17 + Owner: Neutral + Location: 126,62 + Actor722: t03 + Owner: Neutral + Location: 76,3 + Actor725: t05 + Owner: Neutral + Location: 17,88 + Actor726: t13 + Owner: Neutral + Location: 56,43 + Actor727: t07 + Owner: Neutral + Location: 53,107 + Actor728: t06.husk + Owner: Neutral + Location: 112,63 + Actor729: t02 + Owner: Neutral + Location: 4,117 + Actor730: t06 + Owner: Neutral + Location: 133,106 + Actor731: t08 + Owner: Neutral + Location: 104,96 + Actor732: t17 + Owner: Neutral + Location: 52,11 + Actor733: t07 + Owner: Neutral + Location: 140,85 + Actor734: t06 + Owner: Neutral + Location: 80,47 + Actor735: t06 + Owner: Neutral + Location: 4,105 + Actor736: t08 + Owner: Neutral + Location: 2,17 + Actor737: t16 + Owner: Neutral + Location: 75,32 + Actor738: t17 + Owner: Neutral + Location: 108,12 + Actor739: t05 + Owner: Neutral + Location: 12,53 + Actor740: t17 + Owner: Neutral + Location: 92,100 + Actor742: t17 + Owner: Neutral + Location: 0,30 + Actor743: t08 + Owner: Neutral + Location: 91,18 + Actor744: t02.husk + Owner: Neutral + Location: 132,40 + Actor746: t01 + Owner: Neutral + Location: 84,30 + Actor748: t12 + Owner: Neutral + Location: 102,90 + Actor750: t13 + Owner: Neutral + Location: 103,120 + Actor751: t02 + Owner: Neutral + Location: 46,18 + Actor752: t06.husk + Owner: Neutral + Location: 29,66 + Actor753: t13 + Owner: Neutral + Location: 5,104 + Actor754: t03 + Owner: Neutral + Location: 2,117 + Actor755: t03 + Owner: Neutral + Location: 101,122 + Actor756: t01 + Owner: Neutral + Location: 130,25 + Actor757: t07 + Owner: Neutral + Location: 20,59 + Actor758: t03 + Owner: Neutral + Location: 22,100 + Actor759: t12 + Owner: Neutral + Location: 69,105 + Actor760: t07 + Owner: Neutral + Location: 1,3 + Actor761: t13 + Owner: Neutral + Location: 53,81 + Actor762: t13 + Owner: Neutral + Location: 94,91 + Actor763: t01 + Owner: Neutral + Location: 123,122 + Actor765: t12 + Owner: Neutral + Location: 105,98 + Actor766: t08 + Owner: Neutral + Location: 53,84 + Actor767: t03 + Owner: Neutral + Location: 95,106 + Actor768: t08 + Owner: Neutral + Location: 143,77 + Actor769: t13 + Owner: Neutral + Location: 121,107 + Actor770: t06 + Owner: Neutral + Location: 14,57 + Actor771: t08 + Owner: Neutral + Location: 108,89 + Actor772: t08 + Owner: Neutral + Location: 97,123 + Actor773: t08 + Owner: Neutral + Location: 3,16 + Actor774: t07 + Owner: Neutral + Location: 26,70 + Actor775: t13 + Owner: Neutral + Location: 102,120 + Actor776: t16.husk + Owner: Neutral + Location: 57,3 + Actor777: t05 + Owner: Neutral + Location: 144,18 + Actor779: t07 + Owner: Neutral + Location: 102,88 + Actor780: t16 + Owner: Neutral + Location: 142,85 + Actor781: t07 + Owner: Neutral + Location: 108,34 + Actor782: t16 + Owner: Neutral + Location: 12,70 + Actor783: t13 + Owner: Neutral + Location: 18,64 + Actor784: t08 + Owner: Neutral + Location: 54,89 + Actor786: t16 + Owner: Neutral + Location: 144,78 + Actor787: t12 + Owner: Neutral + Location: 99,124 + Actor788: t13 + Owner: Neutral + Location: 106,94 + Actor789: t06 + Owner: Neutral + Location: 30,73 + Actor790: t03 + Owner: Neutral + Location: 27,73 + Actor791: t17 + Owner: Neutral + Location: 87,98 + Actor792: t08 + Owner: Neutral + Location: 55,85 + Actor793: t02 + Owner: Neutral + Location: 4,9 + Actor794: t16.husk + Owner: Neutral + Location: 13,118 + Actor795: t17 + Owner: Neutral + Location: 135,29 + Actor796: t08 + Owner: Neutral + Location: 109,35 + Actor797: t12 + Owner: Neutral + Location: 1,118 + Actor799: t02 + Owner: Neutral + Location: 129,29 + Actor800: t13 + Owner: Neutral + Location: 29,43 + Actor801: t03 + Owner: Neutral + Location: 113,110 + Actor802: t13 + Owner: Neutral + Location: 1,86 + Actor803: t08 + Owner: Neutral + Location: 144,77 + Actor804: t12 + Owner: Neutral + Location: 113,62 + Actor805: t17 + Owner: Neutral + Location: 17,73 + Actor806: t06 + Owner: Neutral + Location: 66,40 + Actor808: t05 + Owner: Neutral + Location: 116,104 + Actor809: t08 + Owner: Neutral + Location: 5,19 + Actor810: t17 + Owner: Neutral + Location: 48,116 + Actor811: t17 + Owner: Neutral + Location: 113,44 + Actor813: t06 + Owner: Neutral + Location: 70,105 + Actor814: t16 + Owner: Neutral + Location: 132,30 + Actor815: t02 + Owner: Neutral + Location: 90,90 + Actor816: t01 + Owner: Neutral + Location: 33,52 + Actor817: t17 + Owner: Neutral + Location: 18,71 + Actor818: t01 + Owner: Neutral + Location: 73,31 + Actor819: t12 + Owner: Neutral + Location: 100,88 + Actor820: t01 + Owner: Neutral + Location: 100,36 + Actor821: t12 + Owner: Neutral + Location: 65,89 + Actor822: t05 + Owner: Neutral + Location: 57,0 + Actor823: t07 + Owner: Neutral + Location: 87,99 + Actor824: t08 + Owner: Neutral + Location: 101,56 + Actor825: t05 + Owner: Neutral + Location: 10,70 + Actor826: t02 + Owner: Neutral + Location: 29,54 + Actor827: t12 + Owner: Neutral + Location: 26,69 + Actor828: t03 + Owner: Neutral + Location: 46,42 + Actor829: t16 + Owner: Neutral + Location: 102,125 + Actor830: t06 + Owner: Neutral + Location: 94,96 + Actor831: t12 + Owner: Neutral + Location: 121,111 + Actor832: t03 + Owner: Neutral + Location: 35,57 + Actor833: t03 + Owner: Neutral + Location: 143,87 + Actor834: t02 + Owner: Neutral + Location: 46,37 + Actor835: t07.husk + Owner: Neutral + Location: 110,33 + Actor836: t03 + Owner: Neutral + Location: 15,85 + Actor837: t02 + Owner: Neutral + Location: 121,109 + Actor839: t13 + Owner: Neutral + Location: 54,76 + Actor840: t13.husk + Owner: Neutral + Location: 19,111 + Actor841: t07 + Owner: Neutral + Location: 16,56 + Actor843: t06 + Owner: Neutral + Location: 16,61 + Actor844: t03 + Owner: Neutral + Location: 62,87 + Actor845: t01 + Owner: Neutral + Location: 128,28 + Actor846: t02 + Owner: Neutral + Location: 102,98 + Actor847: t05 + Owner: Neutral + Location: 45,31 + Actor848: t12 + Owner: Neutral + Location: 85,30 + Actor849: t16.husk + Owner: Neutral + Location: 28,67 + Actor850: t16 + Owner: Neutral + Location: 91,90 + Actor852: t05 + Owner: Neutral + Location: 56,2 + Actor854: t02 + Owner: Neutral + Location: 127,44 + Actor855: t02 + Owner: Neutral + Location: 61,78 + Actor856: t13 + Owner: Neutral + Location: 105,88 + Actor857: t17 + Owner: Neutral + Location: 5,11 + Actor858: t03 + Owner: Neutral + Location: 15,71 + Actor859: t06.husk + Owner: Neutral + Location: 29,77 + Actor860: t05 + Owner: Neutral + Location: 5,19 + Actor861: t16 + Owner: Neutral + Location: 51,105 + Actor862: t17 + Owner: Neutral + Location: 46,14 + Actor863: t12 + Owner: Neutral + Location: 4,16 + Actor864: t08 + Owner: Neutral + Location: 100,129 + Actor865: t05 + Owner: Neutral + Location: 34,74 + Actor866: t01.husk + Owner: Neutral + Location: 16,17 + Actor867: t06 + Owner: Neutral + Location: 137,110 + Actor868: t13 + Owner: Neutral + Location: 52,31 + Actor869: t17 + Owner: Neutral + Location: 117,107 + Actor871: t01 + Owner: Neutral + Location: 90,18 + Actor872: t16.husk + Owner: Neutral + Location: 53,89 + Actor873: t17 + Owner: Neutral + Location: 93,93 + Actor874: t17 + Owner: Neutral + Location: 107,36 + Actor875: t17 + Owner: Neutral + Location: 74,2 + Actor876: t13 + Owner: Neutral + Location: 31,62 + Actor878: t12 + Owner: Neutral + Location: 126,73 + Actor879: t08 + Owner: Neutral + Location: 143,79 + Actor880: t12 + Owner: Neutral + Location: 112,68 + Actor881: t07 + Owner: Neutral + Location: 35,75 + Actor882: t03 + Owner: Neutral + Location: 29,60 + Actor883: t12 + Owner: Neutral + Location: 19,112 + Actor884: t08 + Owner: Neutral + Location: 47,15 + Actor885: t16 + Owner: Neutral + Location: 1,23 + Actor886: t17 + Owner: Neutral + Location: 67,86 + Actor887: t01 + Owner: Neutral + Location: 101,8 + Actor889: t17 + Owner: Neutral + Location: 55,3 + Actor890: t01 + Owner: Neutral + Location: 117,98 + Actor891: t02 + Owner: Neutral + Location: 143,82 + Actor892: t12 + Owner: Neutral + Location: 124,56 + Actor893: t08 + Owner: Neutral + Location: 101,16 + Actor894: t07 + Owner: Neutral + Location: 115,109 + Actor895: t12 + Owner: Neutral + Location: 53,108 + Actor896: t02 + Owner: Neutral + Location: 138,82 + Actor897: t16 + Owner: Neutral + Location: 49,29 + Actor898: t08 + Owner: Neutral + Location: 15,69 + Actor899: t08 + Owner: Neutral + Location: 52,34 + Actor900: t16.husk + Owner: Neutral + Location: 3,12 + Actor902: t02 + Owner: Neutral + Location: 33,76 + Actor903: t16 + Owner: Neutral + Location: 58,86 + Actor904: t16 + Owner: Neutral + Location: 118,106 + Actor905: t06 + Owner: Neutral + Location: 6,105 + Actor906: t01 + Owner: Neutral + Location: 7,103 + Actor907: t06 + Owner: Neutral + Location: 7,3 + Actor908: t12 + Owner: Neutral + Location: 121,104 + Actor909: t17 + Owner: Neutral + Location: 30,62 + Actor910: t03.husk + Owner: Neutral + Location: 1,2 + Actor911: t13.husk + Owner: Neutral + Location: 144,16 + Actor912: t05 + Owner: Neutral + Location: 47,117 + Actor913: t02 + Owner: Neutral + Location: 15,48 + Actor914: t05 + Owner: Neutral + Location: 47,11 + Actor915: t03 + Owner: Neutral + Location: 56,74 + Actor916: t13.husk + Owner: Neutral + Location: 48,113 + Actor917: t03 + Owner: Neutral + Location: 107,35 + Actor918: t03 + Owner: Neutral + Location: 47,1 + Actor919: t17 + Owner: Neutral + Location: 18,67 + Actor920: t07 + Owner: Neutral + Location: 88,97 + Actor921: t13 + Owner: Neutral + Location: 11,59 + Actor922: t05 + Owner: Neutral + Location: 88,18 + Actor923: t08 + Owner: Neutral + Location: 21,60 + Actor924: t12 + Owner: Neutral + Location: 109,64 + Actor925: t03 + Owner: Neutral + Location: 51,1 + Actor926: t01.husk + Owner: Neutral + Location: 19,62 + Actor927: t06 + Owner: Neutral + Location: 114,105 + Actor928: t08 + Owner: Neutral + Location: 48,111 + Actor929: t12 + Owner: Neutral + Location: 82,45 + Actor930: t06 + Owner: Neutral + Location: 102,9 + Actor931: t12 + Owner: Neutral + Location: 6,125 + Actor932: t17 + Owner: Neutral + Location: 43,37 + Actor933: t06 + Owner: Neutral + Location: 83,51 + Actor934: t08 + Owner: Neutral + Location: 58,82 + Actor935: t07 + Owner: Neutral + Location: 57,90 + Actor936: t17 + Owner: Neutral + Location: 107,93 + Actor937: t13 + Owner: Neutral + Location: 123,57 + Actor938: t17.husk + Owner: Neutral + Location: 35,65 + Actor939: t12 + Owner: Neutral + Location: 1,8 + Actor941: t05 + Owner: Neutral + Location: 128,24 + Actor942: t17 + Owner: Neutral + Location: 83,12 + Actor943: t17 + Owner: Neutral + Location: 51,79 + Actor944: t03 + Owner: Neutral + Location: 103,31 + Actor945: t08 + Owner: Neutral + Location: 103,92 + Actor946: t03.husk + Owner: Neutral + Location: 104,94 + Actor950: t05.husk + Owner: Neutral + Location: 73,18 + Actor951: t01 + Owner: Neutral + Location: 3,31 + Actor952: t16 + Owner: Neutral + Location: 44,44 + Actor953: t06 + Owner: Neutral + Location: 21,60 + Actor954: t06 + Owner: Neutral + Location: 75,124 + Actor955: t05 + Owner: Neutral + Location: 113,61 + Actor956: t13 + Owner: Neutral + Location: 46,16 + Actor957: t06 + Owner: Neutral + Location: 103,127 + Actor959: t02 + Owner: Neutral + Location: 54,74 + Actor961: t07 + Owner: Neutral + Location: 102,92 + Actor962: t03 + Owner: Neutral + Location: 27,71 + Actor963: t05 + Owner: Neutral + Location: 74,4 + Actor965: t05 + Owner: Neutral + Location: 47,114 + Actor966: t12 + Owner: Neutral + Location: 36,72 + Actor967: t02 + Owner: Neutral + Location: 2,18 + Actor968: t08 + Owner: Neutral + Location: 29,80 + Actor969: t07 + Owner: Neutral + Location: 77,126 + Actor970: t05 + Owner: Neutral + Location: 5,0 + Actor971: t07 + Owner: Neutral + Location: 0,58 + Actor972: t07 + Owner: Neutral + Location: 141,85 + Actor973: t02 + Owner: Neutral + Location: 41,72 + Actor974: t03 + Owner: Neutral + Location: 67,7 + Actor975: t02 + Owner: Neutral + Location: 32,52 + Actor976: t05 + Owner: Neutral + Location: 120,104 + Actor977: t17 + Owner: Neutral + Location: 1,91 + Actor978: t06 + Owner: Neutral + Location: 124,63 + Actor979: t12 + Owner: Neutral + Location: 103,123 + Actor980: t07 + Owner: Neutral + Location: 102,8 + Actor981: t13 + Owner: Neutral + Location: 143,86 + Actor982: t17 + Owner: Neutral + Location: 118,61 + Actor983: t03 + Owner: Neutral + Location: 79,50 + Actor984: t08 + Owner: Neutral + Location: 44,40 + Actor985: t08 + Owner: Neutral + Location: 81,50 + Actor986: t07 + Owner: Neutral + Location: 74,39 + Actor987: t08.husk + Owner: Neutral + Location: 104,88 + Actor988: t13 + Owner: Neutral + Location: 33,54 + Actor989: t07.husk + Owner: Neutral + Location: 119,103 + Actor990: t12 + Owner: Neutral + Location: 50,106 + Actor991: t06.husk + Owner: Neutral + Location: 47,13 + Actor992: t16 + Owner: Neutral + Location: 58,4 + Actor993: t13 + Owner: Neutral + Location: 4,104 + Actor994: t12 + Owner: Neutral + Location: 64,36 + Actor995: t08 + Owner: Neutral + Location: 85,52 + Actor996: t03 + Owner: Neutral + Location: 41,41 + Actor997: t08 + Owner: Neutral + Location: 126,75 + Actor998: t07 + Owner: Neutral + Location: 100,85 + Actor999: t08 + Owner: Neutral + Location: 91,96 + Actor1000: t01 + Owner: Neutral + Location: 1,96 + Actor1002: t05 + Owner: Neutral + Location: 37,57 + Actor1003: t01 + Owner: Neutral + Location: 115,62 + Actor1004: t13 + Owner: Neutral + Location: 99,37 + Actor1005: t06 + Owner: Neutral + Location: 57,76 + Actor1006: t17 + Owner: Neutral + Location: 75,127 + Actor1007: t06 + Owner: Neutral + Location: 102,93 + Actor1008: t12 + Owner: Neutral + Location: 51,77 + Actor1009: t13.husk + Owner: Neutral + Location: 94,93 + Actor1010: t05 + Owner: Neutral + Location: 16,68 + Actor1012: t03 + Owner: Neutral + Location: 119,107 + Actor1013: t07 + Owner: Neutral + Location: 54,2 + Actor1014: t12 + Owner: Neutral + Location: 122,110 + Actor1015: t06 + Owner: Neutral + Location: 63,83 + Actor1018: t03 + Owner: Neutral + Location: 100,93 + Actor1019: t17 + Owner: Neutral + Location: 51,108 + Actor1020: t06 + Owner: Neutral + Location: 2,7 + Actor1021: t06 + Owner: Neutral + Location: 138,83 + Actor1022: t07 + Owner: Neutral + Location: 95,100 + Actor1023: t01 + Owner: Neutral + Location: 122,14 + Actor1024: t13 + Owner: Neutral + Location: 7,2 + Actor1025: t01 + Owner: Neutral + Location: 101,96 + Actor1026: t03 + Owner: Neutral + Location: 15,25 + Actor1027: t03 + Owner: Neutral + Location: 132,100 + Actor1028: t08 + Owner: Neutral + Location: 57,0 + Actor1029: t16 + Owner: Neutral + Location: 57,84 + Actor1030: t07.husk + Owner: Neutral + Location: 4,124 + Actor1031: t08.husk + Owner: Neutral + Location: 101,11 + Actor1032: t02 + Owner: Neutral + Location: 77,125 + Actor1033: t13 + Owner: Neutral + Location: 89,96 + Actor1034: t05 + Owner: Neutral + Location: 105,92 + Actor1035: t13 + Owner: Neutral + Location: 95,93 + Actor1036: t05 + Owner: Neutral + Location: 90,15 + Actor1037: t06 + Owner: Neutral + Location: 60,87 + Actor1038: t06 + Owner: Neutral + Location: 16,62 + Actor1039: t01 + Owner: Neutral + Location: 89,92 + Actor1040: t07 + Owner: Neutral + Location: 49,110 + Actor1041: t07 + Owner: Neutral + Location: 109,29 + Actor1042: t17 + Owner: Neutral + Location: 137,105 + Actor1044: t12 + Owner: Neutral + Location: 117,64 + Actor1045: t12 + Owner: Neutral + Location: 0,13 + Actor1046: t12 + Owner: Neutral + Location: 84,12 + Actor1047: t01 + Owner: Neutral + Location: 27,77 + Actor1048: t01 + Owner: Neutral + Location: 2,58 + Actor1049: t01 + Owner: Neutral + Location: 89,18 + Actor1051: t02 + Owner: Neutral + Location: 73,17 + Actor1052: t13 + Owner: Neutral + Location: 17,86 + Actor1053: t16 + Owner: Neutral + Location: 95,96 + Actor1054: t02 + Owner: Neutral + Location: 58,79 + Actor1055: t16 + Owner: Neutral + Location: 80,50 + Actor1056: t01 + Owner: Neutral + Location: 14,68 + Actor1057: t01 + Owner: Neutral + Location: 47,18 + Actor1058: t08 + Owner: Neutral + Location: 111,113 + Actor1059: t08 + Owner: Neutral + Location: 34,65 + Actor1061: t08 + Owner: Neutral + Location: 57,86 + Actor1062: t01 + Owner: Neutral + Location: 16,52 + Actor1065: t12 + Owner: Neutral + Location: 31,68 + Actor1066: t16 + Owner: Neutral + Location: 59,76 + Actor1067: t07 + Owner: Neutral + Location: 128,26 + Actor1068: t13 + Owner: Neutral + Location: 34,53 + Actor1069: t06 + Owner: Neutral + Location: 0,12 + Actor1070: t08 + Owner: Neutral + Location: 41,40 + Actor1071: t12.husk + Owner: Neutral + Location: 14,74 + Actor1073: t01.husk + Owner: Neutral + Location: 46,1 + Actor1074: t05.husk + Owner: Neutral + Location: 124,13 + Actor1075: t05 + Owner: Neutral + Location: 121,14 + Actor1076: t01 + Owner: Neutral + Location: 3,116 + Actor1077: t08.husk + Owner: Neutral + Location: 43,42 + Actor1078: t02 + Owner: Neutral + Location: 102,89 + Actor1079: t12 + Owner: Neutral + Location: 139,79 + Actor1080: t06 + Owner: Neutral + Location: 48,119 + Actor1081: t16 + Owner: Neutral + Location: 41,44 + Actor1082: t06 + Owner: Neutral + Location: 121,103 + Actor1083: t01 + Owner: Neutral + Location: 133,40 + Actor1084: t17 + Owner: Neutral + Location: 74,30 + Actor1085: t02 + Owner: Neutral + Location: 108,91 + Actor1086: t12 + Owner: Neutral + Location: 18,62 + Actor1087: t13 + Owner: Neutral + Location: 132,49 + Actor1089: t05 + Owner: Neutral + Location: 14,67 + Actor1090: t02 + Owner: Neutral + Location: 18,54 + Actor1091: t05 + Owner: Neutral + Location: 93,94 + Actor1092: t16 + Owner: Neutral + Location: 73,30 + Actor1093: t02 + Owner: Neutral + Location: 102,96 + Actor1094: t05 + Owner: Neutral + Location: 2,91 + Actor1095: t02 + Owner: Neutral + Location: 118,98 + Actor1096: t03 + Owner: Neutral + Location: 20,26 + Actor1097: t17 + Owner: Neutral + Location: 130,66 + Actor1098: t13 + Owner: Neutral + Location: 95,102 + Actor1099: t03 + Owner: Neutral + Location: 93,102 + Actor1100: t17 + Owner: Neutral + Location: 129,28 + Actor1101: t06 + Owner: Neutral + Location: 41,43 + Actor1102: t01 + Owner: Neutral + Location: 48,42 + Actor1103: t17 + Owner: Neutral + Location: 49,109 + Actor1104: t01 + Owner: Neutral + Location: 33,53 + Actor1105: t17 + Owner: Neutral + Location: 30,59 + Actor1106: t02 + Owner: Neutral + Location: 143,14 + Actor1107: t12.husk + Owner: Neutral + Location: 13,73 + Actor1108: t08 + Owner: Neutral + Location: 5,15 + Actor1109: t07.husk + Owner: Neutral + Location: 56,81 + Actor1110: t01 + Owner: Neutral + Location: 121,15 + Actor1111: t06 + Owner: Neutral + Location: 17,113 + Actor1112: t03 + Owner: Neutral + Location: 102,86 + Actor1113: t08 + Owner: Neutral + Location: 16,89 + Actor1114: t05.husk + Owner: Neutral + Location: 138,30 + Actor1115: t02 + Owner: Neutral + Location: 16,83 + Actor1116: t08 + Owner: Neutral + Location: 121,115 + Actor1117: t02 + Owner: Neutral + Location: 6,102 + Actor1118: t06 + Owner: Neutral + Location: 119,122 + Actor1119: t08 + Owner: Neutral + Location: 38,58 + Actor1120: t12 + Owner: Neutral + Location: 107,32 + Actor1121: t07 + Owner: Neutral + Location: 51,106 + Actor1122: t07 + Owner: Neutral + Location: 142,80 + Actor1123: t13.husk + Owner: Neutral + Location: 62,84 + Actor1124: t02 + Owner: Neutral + Location: 120,97 + Actor1125: t08 + Owner: Neutral + Location: 83,49 + Actor1126: t17 + Owner: Neutral + Location: 143,84 + Actor1127: t17 + Owner: Neutral + Location: 102,17 + Actor1128: t08 + Owner: Neutral + Location: 28,70 + Actor1129: t03 + Owner: Neutral + Location: 1,18 + Actor1130: t17.husk + Owner: Neutral + Location: 27,78 + Actor1131: t02 + Owner: Neutral + Location: 92,99 + Actor1132: t13.husk + Owner: Neutral + Location: 132,29 + Actor1133: t07 + Owner: Neutral + Location: 41,38 + Actor1134: t07 + Owner: Neutral + Location: 34,61 + Actor1135: t02 + Owner: Neutral + Location: 94,100 + Actor1136: t17 + Owner: Neutral + Location: 50,108 + Actor1139: t08 + Owner: Neutral + Location: 31,78 + Actor1140: t08 + Owner: Neutral + Location: 3,125 + Actor1141: t13 + Owner: Neutral + Location: 58,84 + Actor1142: t17 + Owner: Neutral + Location: 103,92 + Actor1143: t16 + Owner: Neutral + Location: 112,45 + Actor1145: t03 + Owner: Neutral + Location: 29,67 + Actor1146: t17 + Owner: Neutral + Location: 35,76 + Actor1147: t02 + Owner: Neutral + Location: 75,45 + Actor1148: t01 + Owner: Neutral + Location: 124,62 + Actor1149: t01 + Owner: Neutral + Location: 13,18 + Actor1150: t16.husk + Owner: Neutral + Location: 121,64 + Actor1151: t17 + Owner: Neutral + Location: 17,87 + Actor1153: t16 + Owner: Neutral + Location: 121,106 + Actor1154: t16 + Owner: Neutral + Location: 61,79 + Actor1155: t12 + Owner: Neutral + Location: 15,117 + Actor1156: t03 + Owner: Neutral + Location: 140,76 + Actor1157: t12 + Owner: Neutral + Location: 7,4 + Actor1158: t08 + Owner: Neutral + Location: 85,49 + Actor1159: t05 + Owner: Neutral + Location: 52,0 + Actor1161: t03 + Owner: Neutral + Location: 56,91 + Actor1162: t06 + Owner: Neutral + Location: 140,83 + Actor1163: t06 + Owner: Neutral + Location: 74,43 + Actor1165: t01.husk + Owner: Neutral + Location: 43,31 + Actor1166: t03.husk + Owner: Neutral + Location: 107,91 + Actor1167: t13 + Owner: Neutral + Location: 118,65 + Actor1168: t02 + Owner: Neutral + Location: 136,48 + Actor1169: t07 + Owner: Neutral + Location: 15,17 + Actor1170: t08 + Owner: Neutral + Location: 76,47 + Actor1171: t08 + Owner: Neutral + Location: 17,84 + Actor1172: t16 + Owner: Neutral + Location: 50,76 + Actor1173: t16 + Owner: Neutral + Location: 9,126 + Actor1174: t07 + Owner: Neutral + Location: 13,69 + Actor1175: t17 + Owner: Neutral + Location: 101,85 + Actor1176: t17 + Owner: Neutral + Location: 107,31 + Actor1177: t01 + Owner: Neutral + Location: 90,101 + Actor1178: t02 + Owner: Neutral + Location: 103,9 + Actor1179: t05 + Owner: Neutral + Location: 47,118 + Actor1180: t17 + Owner: Neutral + Location: 60,88 + Actor1181: t01 + Owner: Neutral + Location: 5,17 + Actor1182: t12 + Owner: Neutral + Location: 18,113 + Actor1183: t08 + Owner: Neutral + Location: 109,95 + Actor1184: t13 + Owner: Neutral + Location: 72,30 + Actor1185: t01 + Owner: Neutral + Location: 111,66 + Actor1186: t07 + Owner: Neutral + Location: 76,30 + Actor1187: t06 + Owner: Neutral + Location: 75,22 + Actor1188: t01 + Owner: Neutral + Location: 58,80 + Actor1189: t13 + Owner: Neutral + Location: 35,121 + Actor1191: t17 + Owner: Neutral + Location: 133,31 + Actor1192: t17.husk + Owner: Neutral + Location: 134,30 + Actor1194: t02 + Owner: Neutral + Location: 2,0 + Actor1195: t08.husk + Owner: Neutral + Location: 12,74 + Actor1196: t16.husk + Owner: Neutral + Location: 132,101 + Actor1197: t17 + Owner: Neutral + Location: 116,107 + Actor1198: t07 + Owner: Neutral + Location: 109,31 + Actor1199: t13 + Owner: Neutral + Location: 40,43 + Actor1200: t13 + Owner: Neutral + Location: 49,119 + Actor1201: t16 + Owner: Neutral + Location: 134,46 + Actor1202: t08 + Owner: Neutral + Location: 10,72 + Actor1203: t02 + Owner: Neutral + Location: 103,90 + Actor1204: t13 + Owner: Neutral + Location: 91,94 + Actor1205: t06 + Owner: Neutral + Location: 36,66 + Actor1206: t05 + Owner: Neutral + Location: 104,89 + Actor1207: t08 + Owner: Neutral + Location: 143,58 + Actor1208: t12 + Owner: Neutral + Location: 52,12 + Actor1209: t03.husk + Owner: Neutral + Location: 101,35 + Actor1210: t12 + Owner: Neutral + Location: 116,109 + Actor1211: t01 + Owner: Neutral + Location: 1,85 + Actor1212: t12 + Owner: Neutral + Location: 110,31 + Actor1214: t05 + Owner: Neutral + Location: 54,106 + Actor1215: t08 + Owner: Neutral + Location: 123,114 + Actor1216: t12 + Owner: Neutral + Location: 36,74 + Actor1217: t16 + Owner: Neutral + Location: 47,116 + Actor1218: t06 + Owner: Neutral + Location: 36,76 + Actor1219: t05 + Owner: Neutral + Location: 16,63 + Actor1220: t12 + Owner: Neutral + Location: 4,15 + Actor1221: t17 + Owner: Neutral + Location: 144,77 + Actor1222: t06 + Owner: Neutral + Location: 62,78 + Actor1223: t01 + Owner: Neutral + Location: 120,14 + Actor1224: t12 + Owner: Neutral + Location: 78,43 + Actor1225: t12.husk + Owner: Neutral + Location: 88,49 + Actor1226: t02 + Owner: Neutral + Location: 1,16 + Actor1228: t02 + Owner: Neutral + Location: 47,34 + Actor1229: t08 + Owner: Neutral + Location: 17,91 + Actor1230: t13 + Owner: Neutral + Location: 134,39 + Actor1231: t17 + Owner: Neutral + Location: 75,46 + Actor1232: t06 + Owner: Neutral + Location: 11,29 + Actor1233: t05 + Owner: Neutral + Location: 100,86 + Actor1234: t02 + Owner: Neutral + Location: 128,44 + Actor1235: t02 + Owner: Neutral + Location: 55,76 + Actor1236: t12 + Owner: Neutral + Location: 48,29 + Actor1237: t03 + Owner: Neutral + Location: 46,30 + Actor1238: t13 + Owner: Neutral + Location: 30,42 + Actor1239: t16 + Owner: Neutral + Location: 98,96 + Actor1240: t06 + Owner: Neutral + Location: 17,49 + Actor1241: t08 + Owner: Neutral + Location: 70,2 + Actor1242: t13 + Owner: Neutral + Location: 46,12 + Actor1243: t13 + Owner: Neutral + Location: 91,91 + Actor1244: t13 + Owner: Neutral + Location: 90,104 + Actor1245: t02 + Owner: Neutral + Location: 2,4 + Actor1246: t13 + Owner: Neutral + Location: 29,55 + Actor1247: t07 + Owner: Neutral + Location: 35,61 + Actor1248: t03 + Owner: Neutral + Location: 15,55 + Actor1249: t12 + Owner: Neutral + Location: 72,4 + Actor1250: t05 + Owner: Neutral + Location: 58,89 + Actor1252: t17 + Owner: Neutral + Location: 41,47 + Actor1253: t06 + Owner: Neutral + Location: 143,73 + Actor1254: t17 + Owner: Neutral + Location: 35,71 + Actor1255: t02 + Owner: Neutral + Location: 91,97 + Actor1256: t06.husk + Owner: Neutral + Location: 102,14 + Actor1258: t16 + Owner: Neutral + Location: 87,49 + Actor1259: t13 + Owner: Neutral + Location: 76,42 + Actor1260: t08 + Owner: Neutral + Location: 88,100 + Actor1261: t17 + Owner: Neutral + Location: 50,80 + Actor1262: t08 + Owner: Neutral + Location: 2,117 + Actor1263: t12 + Owner: Neutral + Location: 69,3 + Actor1264: t13 + Owner: Neutral + Location: 45,28 + Actor1265: t13 + Owner: Neutral + Location: 18,88 + Actor1266: t05 + Owner: Neutral + Location: 106,95 + Actor1267: t06 + Owner: Neutral + Location: 53,1 + Actor1268: t08 + Owner: Neutral + Location: 20,118 + Actor1269: t03 + Owner: Neutral + Location: 66,41 + Actor1270: t01 + Owner: Neutral + Location: 88,23 + Actor1272: t16 + Owner: Neutral + Location: 132,108 + Actor1273: t01 + Owner: Neutral + Location: 117,68 + Actor1274: t12 + Owner: Neutral + Location: 136,111 + Actor1276: t05 + Owner: Neutral + Location: 13,32 + Actor1277: t01 + Owner: Neutral + Location: 48,40 + Actor1278: t08 + Owner: Neutral + Location: 2,57 + Actor1279: t02 + Owner: Neutral + Location: 102,94 + Actor1280: t01.husk + Owner: Neutral + Location: 65,85 + Actor1281: t02 + Owner: Neutral + Location: 75,123 + Actor1282: t07 + Owner: Neutral + Location: 143,58 + Actor1283: t02 + Owner: Neutral + Location: 100,127 + Actor1284: t03.husk + Owner: Neutral + Location: 76,1 + Actor1285: t17 + Owner: Neutral + Location: 107,98 + Actor1286: t13 + Owner: Neutral + Location: 89,95 + Actor1287: t06 + Owner: Neutral + Location: 41,42 + Actor1288: t01 + Owner: Neutral + Location: 106,53 + Actor1289: t05 + Owner: Neutral + Location: 114,107 + Actor1290: t03 + Owner: Neutral + Location: 122,62 + Actor1291: t17 + Owner: Neutral + Location: 26,71 + Actor1292: t01 + Owner: Neutral + Location: 103,22 + Actor1293: t03 + Owner: Neutral + Location: 122,107 + Actor1294: t03 + Owner: Neutral + Location: 4,3 + Actor1296: t12 + Owner: Neutral + Location: 28,78 + Actor1297: t12 + Owner: Neutral + Location: 39,59 + Actor1298: t06 + Owner: Neutral + Location: 101,9 + Actor1299: t02.husk + Owner: Neutral + Location: 5,3 + Actor1300: t01 + Owner: Neutral + Location: 102,36 + Actor1301: t06 + Owner: Neutral + Location: 1,4 + Actor1302: t05 + Owner: Neutral + Location: 94,98 + Actor1304: t07 + Owner: Neutral + Location: 1,95 + Actor1305: t13 + Owner: Neutral + Location: 103,109 + Actor1307: t07 + Owner: Neutral + Location: 14,12 + Actor1308: t05 + Owner: Neutral + Location: 94,127 + Actor1309: t16 + Owner: Neutral + Location: 115,60 + Actor1310: t08 + Owner: Neutral + Location: 93,105 + Actor1311: t03 + Owner: Neutral + Location: 120,70 + Actor1312: t07 + Owner: Neutral + Location: 99,119 + Actor1313: t02 + Owner: Neutral + Location: 37,61 + Actor1314: t07 + Owner: Neutral + Location: 117,110 + Actor1315: t17 + Owner: Neutral + Location: 19,52 + Actor1316: t08 + Owner: Neutral + Location: 128,46 + Actor1317: t03.husk + Owner: Neutral + Location: 58,85 + Actor1318: t06 + Owner: Neutral + Location: 0,16 + Actor1319: t17.husk + Owner: Neutral + Location: 129,24 + Actor1320: t06 + Owner: Neutral + Location: 122,67 + Actor1321: t02.husk + Owner: Neutral + Location: 96,100 + Actor1322: t05 + Owner: Neutral + Location: 6,127 + Actor1323: t01 + Owner: Neutral + Location: 64,81 + Actor1325: t03 + Owner: Neutral + Location: 84,48 + Actor1326: t06.husk + Owner: Neutral + Location: 3,14 + Actor1327: t07 + Owner: Neutral + Location: 78,0 + Actor1330: t03 + Owner: Neutral + Location: 120,102 + Actor1331: t12 + Owner: Neutral + Location: 118,59 + Actor1332: t05.husk + Owner: Neutral + Location: 77,3 + Actor1333: t07 + Owner: Neutral + Location: 53,78 + Actor1334: t03 + Owner: Neutral + Location: 12,17 + Actor1335: t08 + Owner: Neutral + Location: 3,11 + Actor1336: t02 + Owner: Neutral + Location: 115,107 + Actor1337: t06 + Owner: Neutral + Location: 43,45 + Actor1338: t13.husk + Owner: Neutral + Location: 137,84 + Actor1339: t13 + Owner: Neutral + Location: 13,50 + Actor1340: t07 + Owner: Neutral + Location: 2,12 + Actor1341: t07 + Owner: Neutral + Location: 97,127 + Actor1342: t07 + Owner: Neutral + Location: 82,17 + Actor1343: t06 + Owner: Neutral + Location: 114,64 + Actor1344: t17 + Owner: Neutral + Location: 43,39 + Actor1345: t02 + Owner: Neutral + Location: 125,66 + Actor1346: t17 + Owner: Neutral + Location: 77,123 + Actor1347: t07.husk + Owner: Neutral + Location: 130,65 + Actor1348: t17 + Owner: Neutral + Location: 50,110 + Actor1349: t17 + Owner: Neutral + Location: 119,106 + Actor1350: t12 + Owner: Neutral + Location: 120,66 + Actor1351: t17 + Owner: Neutral + Location: 76,49 + Actor1352: t01 + Owner: Neutral + Location: 97,124 + Actor1353: t17 + Owner: Neutral + Location: 42,39 + Actor1354: t17 + Owner: Neutral + Location: 119,110 + Actor1355: t07 + Owner: Neutral + Location: 52,32 + Actor1356: t02 + Owner: Neutral + Location: 59,88 + Actor1357: t16.husk + Owner: Neutral + Location: 133,29 + Actor1358: t05 + Owner: Neutral + Location: 136,30 + Actor1359: t16 + Owner: Neutral + Location: 114,108 + Actor1360: t06 + Owner: Neutral + Location: 66,39 + Actor1361: t08 + Owner: Neutral + Location: 34,59 + Actor1362: t06 + Owner: Neutral + Location: 55,2 + Actor1363: t05 + Owner: Neutral + Location: 3,0 + Actor1364: t16 + Owner: Neutral + Location: 35,58 + Actor1366: t13 + Owner: Neutral + Location: 77,44 + Actor1368: t06 + Owner: Neutral + Location: 58,3 + Actor1369: t17.husk + Owner: Neutral + Location: 75,43 + Actor1370: t05.husk + Owner: Neutral + Location: 17,69 + Actor1371: t12 + Owner: Neutral + Location: 43,30 + Actor1372: t01 + Owner: Neutral + Location: 70,5 + Actor1373: t08 + Owner: Neutral + Location: 138,105 + Actor1374: t06 + Owner: Neutral + Location: 39,58 + Actor1375: t16 + Owner: Neutral + Location: 123,63 + Actor1376: t16.husk + Owner: Neutral + Location: 67,85 + Actor1377: t06 + Owner: Neutral + Location: 104,122 + Actor1378: t08 + Owner: Neutral + Location: 120,106 + Actor1379: t07 + Owner: Neutral + Location: 119,111 + Actor1380: t17 + Owner: Neutral + Location: 131,99 + Actor1381: t12 + Owner: Neutral + Location: 95,89 + Actor1382: t07 + Owner: Neutral + Location: 103,88 + Actor1383: t13 + Owner: Neutral + Location: 103,56 + Actor1385: t03 + Owner: Neutral + Location: 103,18 + Actor1386: t12 + Owner: Neutral + Location: 55,82 + Actor1387: t05 + Owner: Neutral + Location: 3,24 + Actor1388: t03 + Owner: Neutral + Location: 116,59 + Actor1389: t01 + Owner: Neutral + Location: 62,89 + Actor1390: t03 + Owner: Neutral + Location: 89,94 + Actor1391: t03 + Owner: Neutral + Location: 108,97 + Actor1392: t02 + Owner: Neutral + Location: 70,0 + Actor1393: t16 + Owner: Neutral + Location: 13,37 + Actor1394: t02 + Owner: Neutral + Location: 104,107 + Actor1395: t12 + Owner: Neutral + Location: 118,64 + Actor1396: t16 + Owner: Neutral + Location: 111,63 + Actor1397: t05 + Owner: Neutral + Location: 12,117 + Actor1398: t08 + Owner: Neutral + Location: 48,33 + Actor1399: t16 + Owner: Neutral + Location: 29,76 + Actor1401: t07 + Owner: Neutral + Location: 52,107 + Actor1402: t12 + Owner: Neutral + Location: 144,65 + Actor1403: t03 + Owner: Neutral + Location: 51,109 + Actor1405: t08 + Owner: Neutral + Location: 52,78 + Actor1406: t13 + Owner: Neutral + Location: 29,59 + Actor1407: t06 + Owner: Neutral + Location: 77,46 + Actor1408: t08 + Owner: Neutral + Location: 84,14 + Actor1409: t05 + Owner: Neutral + Location: 11,58 + Actor1410: t12 + Owner: Neutral + Location: 90,102 + Actor1411: t12 + Owner: Neutral + Location: 115,108 + Actor1412: t08 + Owner: Neutral + Location: 103,129 + Actor1413: t05 + Owner: Neutral + Location: 75,29 + Actor1414: t13 + Owner: Neutral + Location: 116,110 + Actor1415: t02 + Owner: Neutral + Location: 13,58 + Actor1417: t08.husk + Owner: Neutral + Location: 83,15 + Actor1419: t12 + Owner: Neutral + Location: 121,97 + Actor1420: t12 + Owner: Neutral + Location: 28,65 + Actor1421: t02 + Owner: Neutral + Location: 20,58 + Actor1422: t13 + Owner: Neutral + Location: 106,122 + Actor1424: t01.husk + Owner: Neutral + Location: 93,101 + Actor1425: t07 + Owner: Neutral + Location: 142,75 + Actor1426: t03 + Owner: Neutral + Location: 74,96 + Actor1427: t03 + Owner: Neutral + Location: 34,71 + Actor1428: t03 + Owner: Neutral + Location: 51,83 + Actor1429: t05.husk + Owner: Neutral + Location: 34,34 + Actor1430: t08 + Owner: Neutral + Location: 0,32 + Actor1431: t12 + Owner: Neutral + Location: 106,89 + Actor1433: t05 + Owner: Neutral + Location: 29,53 + Actor1434: t17 + Owner: Neutral + Location: 52,76 + Actor1435: t05 + Owner: Neutral + Location: 126,45 + Actor1436: t02 + Owner: Neutral + Location: 11,56 + Actor1437: t13 + Owner: Neutral + Location: 86,17 + Actor1438: t17 + Owner: Neutral + Location: 4,24 + Actor1439: t06 + Owner: Neutral + Location: 139,103 + Actor1440: t01 + Owner: Neutral + Location: 36,57 + Actor1441: t05.husk + Owner: Neutral + Location: 117,59 + Actor1442: t12 + Owner: Neutral + Location: 75,27 + Actor1443: t08 + Owner: Neutral + Location: 101,121 + Actor1444: t05 + Owner: Neutral + Location: 80,16 + Actor1445: t03 + Owner: Neutral + Location: 30,71 + Actor1446: t05 + Owner: Neutral + Location: 49,108 + Actor1447: t07 + Owner: Neutral + Location: 12,25 + Actor1448: t12 + Owner: Neutral + Location: 1,1 + Actor1449: t06 + Owner: Neutral + Location: 92,102 + Actor1450: t03 + Owner: Neutral + Location: 28,79 + Actor1451: t13 + Owner: Neutral + Location: 45,16 + Actor1452: t17 + Owner: Neutral + Location: 140,82 + Actor1453: t16 + Owner: Neutral + Location: 115,64 + Actor1455: t13 + Owner: Neutral + Location: 75,96 + Actor1456: t16 + Owner: Neutral + Location: 74,31 + Actor1457: t05 + Owner: Neutral + Location: 33,35 + Actor1458: t06.husk + Owner: Neutral + Location: 95,92 + Actor1459: t03 + Owner: Neutral + Location: 29,58 + Actor1460: t13 + Owner: Neutral + Location: 133,46 + Actor1461: t12 + Owner: Neutral + Location: 65,37 + Actor1462: t06 + Owner: Neutral + Location: 120,96 + Actor1463: t07 + Owner: Neutral + Location: 103,89 + Actor1465: t02 + Owner: Neutral + Location: 139,104 + Actor1466: t07 + Owner: Neutral + Location: 29,42 + Actor1467: t05 + Owner: Neutral + Location: 14,52 + Actor1468: t02 + Owner: Neutral + Location: 0,3 + Actor1469: t12 + Owner: Neutral + Location: 109,93 + Actor1470: t12 + Owner: Neutral + Location: 37,77 + Actor1471: t06 + Owner: Neutral + Location: 87,19 + Actor1472: t01 + Owner: Neutral + Location: 9,72 + Actor1473: t06 + Owner: Neutral + Location: 17,53 + Actor1474: t12.husk + Owner: Neutral + Location: 74,27 + Actor1475: t05 + Owner: Neutral + Location: 35,62 + Actor1477: t01 + Owner: Neutral + Location: 133,30 + Actor1478: t03 + Owner: Neutral + Location: 123,107 + Actor1479: t03 + Owner: Neutral + Location: 112,112 + Actor1480: t16 + Owner: Neutral + Location: 76,39 + Actor1482: t17 + Owner: Neutral + Location: 105,93 + Actor1483: t05 + Owner: Neutral + Location: 20,57 + Actor1484: t16 + Owner: Neutral + Location: 56,1 + Actor1485: t05 + Owner: Neutral + Location: 32,39 + Actor1486: t05 + Owner: Neutral + Location: 56,88 + Actor1487: t05 + Owner: Neutral + Location: 105,103 + Actor1488: t06 + Owner: Neutral + Location: 11,55 + Actor1489: t03 + Owner: Neutral + Location: 100,98 + Actor1490: t05 + Owner: Neutral + Location: 52,78 + Actor1491: t17 + Owner: Neutral + Location: 115,63 + Actor1492: t03 + Owner: Neutral + Location: 2,89 + Actor1493: t16 + Owner: Neutral + Location: 29,63 + Actor1494: t12.husk + Owner: Neutral + Location: 53,76 + Actor1495: t05 + Owner: Neutral + Location: 121,68 + Actor1496: t03.husk + Owner: Neutral + Location: 40,45 + Actor1497: t07 + Owner: Neutral + Location: 131,25 + Actor1498: t03 + Owner: Neutral + Location: 102,84 + Actor1499: t07 + Owner: Neutral + Location: 13,51 + Actor1500: t12 + Owner: Neutral + Location: 51,110 + Actor1502: t05 + Owner: Neutral + Location: 86,20 + Actor1503: t12 + Owner: Neutral + Location: 109,66 + Actor1504: t05 + Owner: Neutral + Location: 9,70 + Actor1505: t05 + Owner: Neutral + Location: 32,77 + Actor1506: t05 + Owner: Neutral + Location: 15,63 + Actor1507: t02 + Owner: Neutral + Location: 34,33 + Actor1508: t05 + Owner: Neutral + Location: 63,84 + Actor1509: t17 + Owner: Neutral + Location: 102,10 + Actor1511: t07 + Owner: Neutral + Location: 76,25 + Actor1512: t13.husk + Owner: Neutral + Location: 127,47 + Actor1513: t07.husk + Owner: Neutral + Location: 51,78 + Actor1515: t01 + Owner: Neutral + Location: 76,27 + Actor1516: t16 + Owner: Neutral + Location: 75,30 + Actor1517: t06 + Owner: Neutral + Location: 61,88 + Actor1518: t17.husk + Owner: Neutral + Location: 115,105 + Actor1519: t06 + Owner: Neutral + Location: 18,61 + Actor1521: t16 + Owner: Neutral + Location: 90,105 + Actor1522: t01 + Owner: Neutral + Location: 102,16 + Actor1523: t12 + Owner: Neutral + Location: 12,13 + Actor1524: t08 + Owner: Neutral + Location: 143,76 + Actor1525: t02 + Owner: Neutral + Location: 107,97 + Actor1526: t01 + Owner: Neutral + Location: 59,3 + Actor1528: t13 + Owner: Neutral + Location: 13,53 + Actor1529: t13 + Owner: Neutral + Location: 50,119 + Actor1530: t13 + Owner: Neutral + Location: 3,9 + Actor1531: t03 + Owner: Neutral + Location: 105,95 + Actor1532: t07 + Owner: Neutral + Location: 42,40 + Actor1533: t07 + Owner: Neutral + Location: 35,56 + Actor1534: t07 + Owner: Neutral + Location: 99,98 + Actor1535: t13.husk + Owner: Neutral + Location: 36,60 + Actor1536: t16 + Owner: Neutral + Location: 46,31 + Actor1537: t05 + Owner: Neutral + Location: 39,75 + Actor1538: t16.husk + Owner: Neutral + Location: 119,64 + Actor1540: t17 + Owner: Neutral + Location: 91,101 + Actor1541: t03 + Owner: Neutral + Location: 136,83 + Actor1543: t08 + Owner: Neutral + Location: 95,92 + Actor1544: t01 + Owner: Neutral + Location: 92,101 + Actor1545: t07 + Owner: Neutral + Location: 119,68 + Actor1546: t01 + Owner: Neutral + Location: 44,37 + Actor1547: t02 + Owner: Neutral + Location: 76,32 + Actor1549: t07 + Owner: Neutral + Location: 122,63 + Actor1550: t07 + Owner: Neutral + Location: 75,2 + Actor1551: t02 + Owner: Neutral + Location: 138,84 + Actor1552: t08 + Owner: Neutral + Location: 140,82 + Actor1553: t05 + Owner: Neutral + Location: 103,17 + Actor1554: t05 + Owner: Neutral + Location: 117,105 + Actor1555: t03 + Owner: Neutral + Location: 132,50 + Actor1556: t07 + Owner: Neutral + Location: 129,26 + Actor1557: t16 + Owner: Neutral + Location: 88,15 + Actor1558: t06.husk + Owner: Neutral + Location: 34,60 + Actor1560: t05 + Owner: Neutral + Location: 34,57 + Actor1561: t16 + Owner: Neutral + Location: 18,60 + Actor1562: t13 + Owner: Neutral + Location: 117,62 + Actor1563: t05 + Owner: Neutral + Location: 101,121 + Actor1564: t12 + Owner: Neutral + Location: 102,122 + Actor1565: t01 + Owner: Neutral + Location: 5,12 + Actor1567: t05 + Owner: Neutral + Location: 102,87 + Actor1568: t12 + Owner: Neutral + Location: 49,10 + Actor1569: t01 + Owner: Neutral + Location: 11,117 + Actor1570: t13 + Owner: Neutral + Location: 102,128 + Actor1573: t12 + Owner: Neutral + Location: 42,38 + Actor1574: t02 + Owner: Neutral + Location: 106,98 + Actor1575: t02 + Owner: Neutral + Location: 42,41 + Actor1576: t05 + Owner: Neutral + Location: 88,51 + Actor1577: t05.husk + Owner: Neutral + Location: 81,50 + Actor1578: t05 + Owner: Neutral + Location: 59,80 + Actor1579: t01 + Owner: Neutral + Location: 116,23 + Actor1580: t12 + Owner: Neutral + Location: 3,3 + Actor1581: t01.husk + Owner: Neutral + Location: 29,69 + Actor1583: t01 + Owner: Neutral + Location: 135,48 + Actor1584: t01 + Owner: Neutral + Location: 33,73 + Actor1585: t17 + Owner: Neutral + Location: 45,30 + Actor1586: t01 + Owner: Neutral + Location: 5,125 + Actor1587: t13 + Owner: Neutral + Location: 17,54 + Actor1588: t12 + Owner: Neutral + Location: 115,68 + Actor1589: t02 + Owner: Neutral + Location: 32,78 + Actor1590: t07.husk + Owner: Neutral + Location: 50,29 + Actor1591: t02 + Owner: Neutral + Location: 18,52 + Actor1592: t16 + Owner: Neutral + Location: 91,104 + Actor1593: t01 + Owner: Neutral + Location: 121,63 + Actor1594: t12 + Owner: Neutral + Location: 120,101 + Actor1595: t16 + Owner: Neutral + Location: 4,116 + Actor1596: t03 + Owner: Neutral + Location: 109,33 + Actor1597: t01 + Owner: Neutral + Location: 112,61 + Actor1598: t01 + Owner: Neutral + Location: 56,85 + Actor1600: t17 + Owner: Neutral + Location: 59,82 + Actor1601: t01 + Owner: Neutral + Location: 16,51 + Actor1602: t16 + Owner: Neutral + Location: 58,77 + Actor1603: t08 + Owner: Neutral + Location: 141,83 + Actor1604: t06 + Owner: Neutral + Location: 4,7 + Actor1605: t17 + Owner: Neutral + Location: 104,91 + Actor1606: t01 + Owner: Neutral + Location: 34,59 + Actor1607: t12 + Owner: Neutral + Location: 93,91 + Actor1609: t08 + Owner: Neutral + Location: 25,76 + Actor1610: t02 + Owner: Neutral + Location: 4,125 + Actor1611: t13.husk + Owner: Neutral + Location: 75,40 + Actor1612: t03 + Owner: Neutral + Location: 73,40 + Actor1613: t08 + Owner: Neutral + Location: 0,35 + Actor1614: t03 + Owner: Neutral + Location: 84,47 + Actor1615: t07 + Owner: Neutral + Location: 48,2 + Actor1616: t01 + Owner: Neutral + Location: 5,2 + Actor1617: t16 + Owner: Neutral + Location: 44,46 + Actor1618: t03 + Owner: Neutral + Location: 110,66 + Actor1619: t17 + Owner: Neutral + Location: 30,69 + Actor1620: t03.husk + Owner: Neutral + Location: 34,78 + Actor1621: t06 + Owner: Neutral + Location: 1,84 + Actor1622: t13 + Owner: Neutral + Location: 143,85 + Actor1623: t13 + Owner: Neutral + Location: 22,101 + Actor1624: t05 + Owner: Neutral + Location: 92,106 + Actor1625: t01 + Owner: Neutral + Location: 70,3 + Actor1626: t13 + Owner: Neutral + Location: 115,110 + Actor1627: t06 + Owner: Neutral + Location: 120,68 + Actor1628: t13 + Owner: Neutral + Location: 28,73 + Actor1629: t07 + Owner: Neutral + Location: 104,88 + Actor1630: t06 + Owner: Neutral + Location: 16,112 + Actor1631: t16 + Owner: Neutral + Location: 65,36 + Actor1632: t02 + Owner: Neutral + Location: 29,41 + Actor1633: t08 + Owner: Neutral + Location: 82,49 + Actor1634: t17 + Owner: Neutral + Location: 4,14 + Actor1635: t07.husk + Owner: Neutral + Location: 15,51 + Actor1636: t03 + Owner: Neutral + Location: 102,19 + Actor1638: t12 + Owner: Neutral + Location: 104,85 + Actor1639: t08 + Owner: Neutral + Location: 75,0 + Actor1640: t12 + Owner: Neutral + Location: 132,110 + Actor1641: t17.husk + Owner: Neutral + Location: 91,92 + Actor1642: t06 + Owner: Neutral + Location: 1,13 + Actor1643: t02 + Owner: Neutral + Location: 31,67 + Actor1644: t12 + Owner: Neutral + Location: 44,31 + Actor1645: t06 + Owner: Neutral + Location: 48,115 + Actor1646: t17 + Owner: Neutral + Location: 107,95 + Actor1647: t03 + Owner: Neutral + Location: 121,96 + Actor1648: t05 + Owner: Neutral + Location: 73,125 + Actor1650: t08 + Owner: Neutral + Location: 89,15 + Actor1651: t03 + Owner: Neutral + Location: 39,44 + Actor1652: t16 + Owner: Neutral + Location: 140,84 + Actor1653: t08 + Owner: Neutral + Location: 1,15 + Actor1654: t12.husk + Owner: Neutral + Location: 94,101 + Actor1655: t07 + Owner: Neutral + Location: 129,45 + Actor1656: t17 + Owner: Neutral + Location: 98,94 + Actor1657: t07 + Owner: Neutral + Location: 131,65 + Actor1658: t03 + Owner: Neutral + Location: 99,93 + Actor1659: t05 + Owner: Neutral + Location: 38,77 + Actor1660: t07 + Owner: Neutral + Location: 120,64 + Actor1661: t05 + Owner: Neutral + Location: 119,101 + Actor1662: t02 + Owner: Neutral + Location: 80,48 + Actor1663: t08 + Owner: Neutral + Location: 119,113 + Actor1665: t02 + Owner: Neutral + Location: 142,68 + Actor1667: t06.husk + Owner: Neutral + Location: 57,87 + Actor1668: t02 + Owner: Neutral + Location: 114,104 + Actor1669: t07 + Owner: Neutral + Location: 72,31 + Actor1671: t17 + Owner: Neutral + Location: 54,31 + Actor1672: t07.husk + Owner: Neutral + Location: 4,10 + Actor1673: t12 + Owner: Neutral + Location: 89,51 + Actor1675: t13 + Owner: Neutral + Location: 75,4 + Actor1676: t08 + Owner: Neutral + Location: 27,71 + Actor1679: t03 + Owner: Neutral + Location: 82,14 + Actor1680: t05 + Owner: Neutral + Location: 50,28 + Actor1681: t08 + Owner: Neutral + Location: 55,90 + Actor1682: t02 + Owner: Neutral + Location: 76,26 + Actor1683: t13 + Owner: Neutral + Location: 18,48 + Actor1684: t08 + Owner: Neutral + Location: 104,22 + Actor1685: t05 + Owner: Neutral + Location: 48,0 + Actor1686: t07.husk + Owner: Neutral + Location: 20,27 + Actor1687: t02 + Owner: Neutral + Location: 2,17 + Actor1688: t08 + Owner: Neutral + Location: 97,129 + Actor1689: t12 + Owner: Neutral + Location: 117,58 + Actor1691: t13 + Owner: Neutral + Location: 77,31 + Actor1693: t16 + Owner: Neutral + Location: 43,46 + Actor1694: t02 + Owner: Neutral + Location: 42,37 + Actor1696: t12 + Owner: Neutral + Location: 105,89 + Actor1697: t16 + Owner: Neutral + Location: 132,31 + Actor1700: t08.husk + Owner: Neutral + Location: 68,87 + Actor1701: t08 + Owner: Neutral + Location: 99,91 + Actor1702: t02 + Owner: Neutral + Location: 116,61 + Actor1703: t12 + Owner: Neutral + Location: 17,61 + Actor1704: t17 + Owner: Neutral + Location: 74,42 + Actor1705: t07 + Owner: Neutral + Location: 88,98 + Actor1706: t16 + Owner: Neutral + Location: 127,45 + Actor1707: t12 + Owner: Neutral + Location: 76,124 + Actor1708: t01 + Owner: Neutral + Location: 43,32 + Actor1709: t08 + Owner: Neutral + Location: 52,109 + Actor1710: t02 + Owner: Neutral + Location: 38,78 + Actor1711: t05 + Owner: Neutral + Location: 105,20 + Actor1712: t05 + Owner: Neutral + Location: 112,111 + Actor1713: t06 + Owner: Neutral + Location: 3,117 + Actor1714: t13 + Owner: Neutral + Location: 16,50 + Actor1715: t05 + Owner: Neutral + Location: 108,96 + Actor1716: t12 + Owner: Neutral + Location: 34,65 + Actor1717: t17 + Owner: Neutral + Location: 144,14 + Actor1718: t02 + Owner: Neutral + Location: 53,32 + Actor1719: t16 + Owner: Neutral + Location: 59,4 + Actor1720: t13 + Owner: Neutral + Location: 136,29 + Actor1721: t01.husk + Owner: Neutral + Location: 114,62 + Actor1722: t07 + Owner: Neutral + Location: 57,2 + Actor1723: t12 + Owner: Neutral + Location: 35,63 + Actor1724: t07 + Owner: Neutral + Location: 36,58 + Actor1725: t17 + Owner: Neutral + Location: 86,12 + Actor1726: t03 + Owner: Neutral + Location: 91,106 + Actor1727: t08 + Owner: Neutral + Location: 13,73 + Actor1728: t07 + Owner: Neutral + Location: 81,48 + Actor1729: t17 + Owner: Neutral + Location: 133,45 + Actor1730: t06 + Owner: Neutral + Location: 103,57 + Actor1731: t02 + Owner: Neutral + Location: 47,32 + Actor1732: t17 + Owner: Neutral + Location: 141,75 + Actor1733: t01 + Owner: Neutral + Location: 101,86 + Actor1734: t05.husk + Owner: Neutral + Location: 70,2 + Actor1735: t02 + Owner: Neutral + Location: 142,65 + Actor1736: t03.husk + Owner: Neutral + Location: 71,16 + Actor1737: t03 + Owner: Neutral + Location: 63,85 + Actor1738: t12 + Owner: Neutral + Location: 118,105 + Actor1739: t08 + Owner: Neutral + Location: 114,61 + Actor1740: t08 + Owner: Neutral + Location: 76,45 + Actor1741: t12 + Owner: Neutral + Location: 65,1 + Actor1742: t13.husk + Owner: Neutral + Location: 120,106 + Actor1743: t03 + Owner: Neutral + Location: 49,115 + Actor1744: t01 + Owner: Neutral + Location: 104,92 + Actor1745: t06 + Owner: Neutral + Location: 3,115 + Actor1746: t12 + Owner: Neutral + Location: 125,56 + Actor1747: t02 + Owner: Neutral + Location: 26,75 + Actor1748: t16 + Owner: Neutral + Location: 132,106 + Actor1749: t16 + Owner: Neutral + Location: 116,111 + Actor1750: t07.husk + Owner: Neutral + Location: 86,49 + Actor1751: t08.husk + Owner: Neutral + Location: 139,84 + Actor1752: t07 + Owner: Neutral + Location: 92,103 + Actor1753: t07.husk + Owner: Neutral + Location: 14,13 + Actor1754: t01 + Owner: Neutral + Location: 113,112 + Actor1755: t12.husk + Owner: Neutral + Location: 4,13 + Actor1756: t07 + Owner: Neutral + Location: 103,119 + Actor1757: t08 + Owner: Neutral + Location: 53,107 + Actor1758: t13 + Owner: Neutral + Location: 50,121 + Actor1759: t17 + Owner: Neutral + Location: 27,75 + Actor1760: t12 + Owner: Neutral + Location: 0,0 + Actor1761: t12 + Owner: Neutral + Location: 121,105 + Actor1762: t02 + Owner: Neutral + Location: 113,68 + Actor1763: t12 + Owner: Neutral + Location: 49,30 + Actor1764: t16 + Owner: Neutral + Location: 4,5 + Actor1765: t01 + Owner: Neutral + Location: 140,75 + Actor1766: t07 + Owner: Neutral + Location: 1,12 + Actor1767: t02 + Owner: Neutral + Location: 117,106 + Actor1768: t07 + Owner: Neutral + Location: 92,94 + Actor1769: t02 + Owner: Neutral + Location: 110,28 + Actor1770: t02.husk + Owner: Neutral + Location: 47,29 + Actor1771: t06.husk + Owner: Neutral + Location: 17,91 + Actor1772: t06 + Owner: Neutral + Location: 138,81 + Actor1773: t06 + Owner: Neutral + Location: 37,58 + Actor1774: t03 + Owner: Neutral + Location: 113,63 + Actor1775: t02 + Owner: Neutral + Location: 75,39 + Actor1776: t05 + Owner: Neutral + Location: 39,43 + Actor1777: t08.husk + Owner: Neutral + Location: 53,13 + Actor1778: t13 + Owner: Neutral + Location: 31,65 + Actor1779: t01 + Owner: Neutral + Location: 30,79 + Actor1780: t07 + Owner: Neutral + Location: 95,104 + Actor1781: t01.husk + Owner: Neutral + Location: 30,40 + Actor1782: t08 + Owner: Neutral + Location: 122,16 + Actor1783: t07 + Owner: Neutral + Location: 105,121 + Actor1784: t13.husk + Owner: Neutral + Location: 44,32 + Actor1785: t08 + Owner: Neutral + Location: 17,57 + Actor1788: t16 + Owner: Neutral + Location: 142,82 + Actor1790: t06 + Owner: Neutral + Location: 45,17 + Actor1791: t02 + Owner: Neutral + Location: 34,63 + Actor1792: t12 + Owner: Neutral + Location: 139,30 + Actor1793: t12 + Owner: Neutral + Location: 106,19 + Actor1794: t16 + Owner: Neutral + Location: 99,85 + Actor1795: t06 + Owner: Neutral + Location: 36,65 + Actor1797: t05 + Owner: Neutral + Location: 48,41 + Actor1799: t06 + Owner: Neutral + Location: 110,63 + Actor1800: t17 + Owner: Neutral + Location: 111,65 + Actor1801: t08 + Owner: Neutral + Location: 115,103 + Actor1802: t08 + Owner: Neutral + Location: 138,78 + Actor1803: t07.husk + Owner: Neutral + Location: 122,16 + Actor1804: t08 + Owner: Neutral + Location: 17,69 + Actor1806: t02 + Owner: Neutral + Location: 76,47 + Actor1807: t03 + Owner: Neutral + Location: 56,89 + Actor1808: t16 + Owner: Neutral + Location: 4,115 + Actor1809: t17 + Owner: Neutral + Location: 60,86 + Actor1810: t08 + Owner: Neutral + Location: 119,101 + Actor1811: t12 + Owner: Neutral + Location: 1,11 + Actor1812: t01 + Owner: Neutral + Location: 93,96 + Actor1813: t03.husk + Owner: Neutral + Location: 100,92 + Actor1814: t07.husk + Owner: Neutral + Location: 140,77 + Actor1815: t13 + Owner: Neutral + Location: 117,67 + Actor1816: t17 + Owner: Neutral + Location: 32,40 + Actor1818: t08 + Owner: Neutral + Location: 74,17 + Actor1820: t12 + Owner: Neutral + Location: 117,102 + Actor1821: t06 + Owner: Neutral + Location: 17,89 + Actor1822: t03 + Owner: Neutral + Location: 14,48 + Actor1823: t16 + Owner: Neutral + Location: 101,88 + Actor1824: t07 + Owner: Neutral + Location: 1,0 + Actor1825: t06 + Owner: Neutral + Location: 87,15 + Actor1826: t02 + Owner: Neutral + Location: 59,74 + Actor1827: t01 + Owner: Neutral + Location: 109,91 + Actor1828: t17 + Owner: Neutral + Location: 79,1 + Actor1831: t05 + Owner: Neutral + Location: 2,5 + Actor1832: t06 + Owner: Neutral + Location: 4,2 + Actor1833: t13 + Owner: Neutral + Location: 137,111 + Actor1834: t07 + Owner: Neutral + Location: 44,30 + Actor1835: t03 + Owner: Neutral + Location: 144,66 + Actor1836: t12 + Owner: Neutral + Location: 66,87 + Actor1837: t12 + Owner: Neutral + Location: 89,102 + Actor1838: t12 + Owner: Neutral + Location: 5,105 + Actor1839: t02 + Owner: Neutral + Location: 106,99 + Actor1840: t08 + Owner: Neutral + Location: 113,112 + Actor1841: t01 + Owner: Neutral + Location: 28,74 + Actor1842: t08 + Owner: Neutral + Location: 54,2 + Actor1844: t06 + Owner: Neutral + Location: 14,117 + Actor1845: t01 + Owner: Neutral + Location: 15,118 + Actor1846: t16 + Owner: Neutral + Location: 129,46 + Actor1848: t12 + Owner: Neutral + Location: 103,21 + Actor1849: t02 + Owner: Neutral + Location: 118,62 + Actor1850: t05 + Owner: Neutral + Location: 100,121 + Actor1851: t03 + Owner: Neutral + Location: 52,1 + Actor1853: t05 + Owner: Neutral + Location: 2,122 + Actor1854: t17 + Owner: Neutral + Location: 88,47 + Actor1855: t08.husk + Owner: Neutral + Location: 118,105 + Actor1856: t07.husk + Owner: Neutral + Location: 8,67 + Actor1857: t12 + Owner: Neutral + Location: 104,31 + Actor1858: t05 + Owner: Neutral + Location: 71,108 + Actor1859: t01 + Owner: Neutral + Location: 13,68 + Actor1860: t02 + Owner: Neutral + Location: 50,109 + Actor1861: t16 + Owner: Neutral + Location: 77,128 + Actor1862: t07 + Owner: Neutral + Location: 78,45 + Actor1863: t07 + Owner: Neutral + Location: 17,70 + Actor1864: t17 + Owner: Neutral + Location: 85,50 + Actor1865: t16 + Owner: Neutral + Location: 139,75 + Actor1866: t01 + Owner: Neutral + Location: 1,30 + Actor1867: t08 + Owner: Neutral + Location: 73,1 + Actor1868: t12 + Owner: Neutral + Location: 0,14 + Actor1869: t05 + Owner: Neutral + Location: 134,41 + Actor1870: t06 + Owner: Neutral + Location: 83,15 + Actor1871: t12 + Owner: Neutral + Location: 74,45 + Actor1873: t05 + Owner: Neutral + Location: 128,27 + Actor1874: t01.husk + Owner: Neutral + Location: 54,90 + Actor1875: t02 + Owner: Neutral + Location: 50,10 + Actor1876: t03 + Owner: Neutral + Location: 9,71 + Actor1877: t08 + Owner: Neutral + Location: 108,33 + Actor1878: t17 + Owner: Neutral + Location: 48,114 + Actor1879: t05.husk + Owner: Neutral + Location: 103,121 + Actor1880: t01 + Owner: Neutral + Location: 141,76 + Actor1881: t16 + Owner: Neutral + Location: 65,87 + Actor1882: t12 + Owner: Neutral + Location: 103,19 + Actor1883: t05 + Owner: Neutral + Location: 76,2 + Actor1884: t13 + Owner: Neutral + Location: 60,85 + Actor1885: t08 + Owner: Neutral + Location: 102,34 + Actor1886: t05 + Owner: Neutral + Location: 40,42 + Actor1888: t01 + Owner: Neutral + Location: 113,108 + Actor1889: t06 + Owner: Neutral + Location: 125,62 + Actor1890: t16 + Owner: Neutral + Location: 42,35 + Actor1891: t07 + Owner: Neutral + Location: 59,81 + Actor1892: t13 + Owner: Neutral + Location: 104,99 + Actor1894: t05.husk + Owner: Neutral + Location: 1,90 + Actor1895: t06 + Owner: Neutral + Location: 2,29 + Actor1896: t05 + Owner: Neutral + Location: 109,65 + Actor1897: t08 + Owner: Neutral + Location: 102,98 + Actor1899: t07 + Owner: Neutral + Location: 115,111 + Actor1900: t01 + Owner: Neutral + Location: 115,23 + Actor1901: t06.husk + Owner: Neutral + Location: 104,106 + Actor1902: t12 + Owner: Neutral + Location: 94,89 + Actor1903: t13 + Owner: Neutral + Location: 126,47 + Actor1904: t12 + Owner: Neutral + Location: 63,90 + Actor1905: t05.husk + Owner: Neutral + Location: 141,78 + Actor1906: t07.husk + Owner: Neutral + Location: 73,15 + Actor1907: t01 + Owner: Neutral + Location: 121,110 + Actor1909: t03 + Owner: Neutral + Location: 144,57 + Actor1910: t03 + Owner: Neutral + Location: 99,94 + Actor1911: t13 + Owner: Neutral + Location: 5,13 + Actor1912: t17 + Owner: Neutral + Location: 132,45 + Actor1913: t16 + Owner: Neutral + Location: 103,126 + Actor1914: t13 + Owner: Neutral + Location: 105,31 + Actor1915: t08 + Owner: Neutral + Location: 49,81 + Actor1916: t01 + Owner: Neutral + Location: 48,111 + Actor1917: t07 + Owner: Neutral + Location: 98,127 + Actor1918: t02 + Owner: Neutral + Location: 55,78 + Actor1919: t16 + Owner: Neutral + Location: 19,49 + Actor1923: t17 + Owner: Neutral + Location: 102,127 + Actor1924: t16 + Owner: Neutral + Location: 68,3 + Actor1925: t16 + Owner: Neutral + Location: 116,62 + Actor1926: t08 + Owner: Neutral + Location: 106,93 + Actor1927: t05 + Owner: Neutral + Location: 105,105 + Actor1928: t05 + Owner: Neutral + Location: 64,88 + Actor1930: t17 + Owner: Neutral + Location: 102,55 + Actor1931: t16 + Owner: Neutral + Location: 63,42 + Actor1932: t01 + Owner: Neutral + Location: 89,101 + Actor1933: t17.husk + Owner: Neutral + Location: 30,58 + Actor1934: t06 + Owner: Neutral + Location: 123,109 + Actor1935: t02 + Owner: Neutral + Location: 101,17 + Actor1936: t05.husk + Owner: Neutral + Location: 52,110 + Actor1937: t01.husk + Owner: Neutral + Location: 4,1 + Actor1938: t16 + Owner: Neutral + Location: 132,26 + Actor1940: t05 + Owner: Neutral + Location: 58,76 + Actor1941: t06.husk + Owner: Neutral + Location: 39,76 + Actor1942: t02 + Owner: Neutral + Location: 30,39 + Actor1943: t12 + Owner: Neutral + Location: 18,86 + Actor1944: t08 + Owner: Neutral + Location: 116,103 + Actor1945: t07.husk + Owner: Neutral + Location: 131,43 + Actor1946: t03 + Owner: Neutral + Location: 90,17 + Actor1948: t01 + Owner: Neutral + Location: 6,103 + Actor1949: t13 + Owner: Neutral + Location: 55,74 + Actor1950: t02 + Owner: Neutral + Location: 103,94 + Actor1951: t07 + Owner: Neutral + Location: 135,30 + Actor1952: t12 + Owner: Neutral + Location: 21,57 + Actor1953: t06 + Owner: Neutral + Location: 116,105 + Actor1954: t02 + Owner: Neutral + Location: 91,15 + Actor1955: t05 + Owner: Neutral + Location: 81,22 + Actor1956: t17 + Owner: Neutral + Location: 78,30 + Actor1957: t17 + Owner: Neutral + Location: 103,122 + Actor1958: t13 + Owner: Neutral + Location: 119,105 + Actor1959: t12 + Owner: Neutral + Location: 123,62 + Actor1960: t17 + Owner: Neutral + Location: 133,44 + Actor1961: t01 + Owner: Neutral + Location: 104,128 + Actor1962: t03 + Owner: Neutral + Location: 109,12 + Actor1963: t01 + Owner: Neutral + Location: 90,14 + Actor1964: t08 + Owner: Neutral + Location: 98,91 + Actor1965: t16 + Owner: Neutral + Location: 51,82 + Actor1967: t12 + Owner: Neutral + Location: 122,109 + Actor1968: t03 + Owner: Neutral + Location: 137,83 + Actor1969: t01 + Owner: Neutral + Location: 64,82 + Actor1970: t08 + Owner: Neutral + Location: 117,64 + Actor1971: t08 + Owner: Neutral + Location: 17,26 + Actor1972: t03 + Owner: Neutral + Location: 9,125 + Actor1973: t01 + Owner: Neutral + Location: 18,69 + Actor1974: t17 + Owner: Neutral + Location: 52,105 + Actor1975: t02 + Owner: Neutral + Location: 11,70 + Actor1976: t07 + Owner: Neutral + Location: 59,1 + Actor1977: t01 + Owner: Neutral + Location: 51,111 + Actor1978: t07 + Owner: Neutral + Location: 55,75 + Actor1979: t08 + Owner: Neutral + Location: 28,71 + Actor1980: t01 + Owner: Neutral + Location: 5,10 + Actor1981: t16 + Owner: Neutral + Location: 99,18 + Actor1982: t03.husk + Owner: Neutral + Location: 63,78 + Actor1983: t03 + Owner: Neutral + Location: 101,94 + Actor1984: t17 + Owner: Neutral + Location: 77,30 + Actor1986: t17 + Owner: Neutral + Location: 102,121 + Actor1988: t13 + Owner: Neutral + Location: 102,34 + Actor1989: t03 + Owner: Neutral + Location: 118,60 + Actor1990: t06 + Owner: Neutral + Location: 130,67 + Actor1991: t02 + Owner: Neutral + Location: 18,87 + Actor1992: t01 + Owner: Neutral + Location: 114,110 + Actor1993: t08 + Owner: Neutral + Location: 112,110 + Actor1996: t06 + Owner: Neutral + Location: 104,20 + Actor1997: t02 + Owner: Neutral + Location: 3,7 + Actor1998: t16 + Owner: Neutral + Location: 60,5 + Actor1999: t08 + Owner: Neutral + Location: 76,124 + Actor2000: t13 + Owner: Neutral + Location: 64,85 + Actor2001: t06 + Owner: Neutral + Location: 102,112 + Actor2002: t16 + Owner: Neutral + Location: 127,66 + Actor2003: t03 + Owner: Neutral + Location: 108,123 + Actor2004: t08 + Owner: Neutral + Location: 93,101 + Actor2005: t17 + Owner: Neutral + Location: 121,67 + Actor2006: t05 + Owner: Neutral + Location: 115,59 + Actor2007: t08 + Owner: Neutral + Location: 115,105 + Actor2008: t05 + Owner: Neutral + Location: 47,31 + Actor2009: t08 + Owner: Neutral + Location: 91,94 + Actor2010: t08 + Owner: Neutral + Location: 51,108 + Actor2011: t03 + Owner: Neutral + Location: 99,97 + Actor2012: t17 + Owner: Neutral + Location: 121,102 + Actor2014: t16 + Owner: Neutral + Location: 41,40 + Actor2015: t12 + Owner: Neutral + Location: 122,57 + Actor2016: t17 + Owner: Neutral + Location: 52,82 + Actor2017: t06 + Owner: Neutral + Location: 15,50 + Actor2018: t12 + Owner: Neutral + Location: 62,77 + Actor2020: t05 + Owner: Neutral + Location: 71,1 + Actor2021: t07 + Owner: Neutral + Location: 103,86 + Actor2022: t16 + Owner: Neutral + Location: 87,17 + Actor2023: t06 + Owner: Neutral + Location: 16,111 + Actor2025: t02 + Owner: Neutral + Location: 117,109 + Actor2026: t13 + Owner: Neutral + Location: 101,20 + Actor2027: t02 + Owner: Neutral + Location: 101,127 + Actor2028: t16 + Owner: Neutral + Location: 92,107 + Actor2029: t05 + Owner: Neutral + Location: 52,79 + Actor2030: t17 + Owner: Neutral + Location: 140,30 + Actor2031: t01 + Owner: Neutral + Location: 123,65 + Actor2032: t03 + Owner: Neutral + Location: 126,44 + Actor2033: t03 + Owner: Neutral + Location: 112,110 + Actor2034: t17 + Owner: Neutral + Location: 92,110 + Actor2036: t05 + Owner: Neutral + Location: 71,5 + Actor2037: t05 + Owner: Neutral + Location: 108,11 + Actor2038: t08 + Owner: Neutral + Location: 3,29 + Actor2039: t01 + Owner: Neutral + Location: 109,32 + Actor2040: t08 + Owner: Neutral + Location: 1,18 + Actor2041: t03 + Owner: Neutral + Location: 109,13 + Actor2042: t05 + Owner: Neutral + Location: 29,64 + Actor2043: t17 + Owner: Neutral + Location: 17,72 + Actor2044: t01 + Owner: Neutral + Location: 53,105 + Actor2046: t12.husk + Owner: Neutral + Location: 139,105 + Actor2048: t07 + Owner: Neutral + Location: 122,98 + Actor2049: t03 + Owner: Neutral + Location: 117,65 + Actor2050: t03 + Owner: Neutral + Location: 46,13 + Actor2051: t02 + Owner: Neutral + Location: 90,94 + Actor2052: t12 + Owner: Neutral + Location: 35,60 + Actor2054: t16 + Owner: Neutral + Location: 100,97 + Actor2055: t05 + Owner: Neutral + Location: 2,30 + Actor2056: t06 + Owner: Neutral + Location: 14,51 + Actor2057: t03 + Owner: Neutral + Location: 143,81 + Actor2058: t03 + Owner: Neutral + Location: 104,119 + Actor2060: t12 + Owner: Neutral + Location: 102,20 + Actor2061: t16 + Owner: Neutral + Location: 77,127 + Actor2062: t13 + Owner: Neutral + Location: 42,72 + Actor2063: t03.husk + Owner: Neutral + Location: 129,66 + Actor2064: t16 + Owner: Neutral + Location: 70,6 + Actor2065: t08 + Owner: Neutral + Location: 35,75 + Actor2066: t01 + Owner: Neutral + Location: 60,78 + Actor2068: t17 + Owner: Neutral + Location: 49,79 + Actor2069: t01 + Owner: Neutral + Location: 85,49 + Actor2070: t05 + Owner: Neutral + Location: 139,84 + Actor2071: t01 + Owner: Neutral + Location: 50,81 + Actor2072: t01 + Owner: Neutral + Location: 27,74 + Actor2073: t06 + Owner: Neutral + Location: 56,77 + Actor2074: t08 + Owner: Neutral + Location: 104,57 + Actor2075: t08 + Owner: Neutral + Location: 7,126 + Actor2076: t12 + Owner: Neutral + Location: 50,113 + Actor2077: t12 + Owner: Neutral + Location: 129,65 + Actor2079: t07 + Owner: Neutral + Location: 100,18 + Actor2080: t05 + Owner: Neutral + Location: 105,96 + Actor2081: t12 + Owner: Neutral + Location: 101,97 + Actor2082: t08 + Owner: Neutral + Location: 133,48 + Actor2083: t13 + Owner: Neutral + Location: 144,17 + Actor2084: t07 + Owner: Neutral + Location: 105,86 + Actor2085: t17 + Owner: Neutral + Location: 119,70 + Actor2086: t17 + Owner: Neutral + Location: 101,34 + Actor2087: t12 + Owner: Neutral + Location: 35,64 + Actor2088: t03 + Owner: Neutral + Location: 73,16 + Actor2089: t01 + Owner: Neutral + Location: 67,87 + Actor2090: t06.husk + Owner: Neutral + Location: 127,73 + Actor2091: t06 + Owner: Neutral + Location: 5,1 + Actor2092: t13 + Owner: Neutral + Location: 15,62 + Actor2093: t01 + Owner: Neutral + Location: 2,57 + Actor2095: t01 + Owner: Neutral + Location: 101,95 + Actor2096: t07 + Owner: Neutral + Location: 108,31 + Actor2097: t01 + Owner: Neutral + Location: 94,128 + Actor2098: t13 + Owner: Neutral + Location: 103,87 + Actor2099: t13 + Owner: Neutral + Location: 115,61 + Actor2100: t13 + Owner: Neutral + Location: 143,77 + Actor2101: t16 + Owner: Neutral + Location: 95,97 + Actor2102: t08 + Owner: Neutral + Location: 104,128 + Actor2104: t05 + Owner: Neutral + Location: 61,87 + Actor2105: t17 + Owner: Neutral + Location: 122,66 + Actor2106: t03 + Owner: Neutral + Location: 52,80 + Actor2107: t02 + Owner: Neutral + Location: 140,29 + Actor2109: t08 + Owner: Neutral + Location: 46,34 + Actor2110: t16 + Owner: Neutral + Location: 74,40 + Actor2111: t07 + Owner: Neutral + Location: 123,111 + Actor2112: t16 + Owner: Neutral + Location: 127,46 + Actor2113: t07 + Owner: Neutral + Location: 123,66 + Actor2114: t07 + Owner: Neutral + Location: 12,58 + Actor2115: t01 + Owner: Neutral + Location: 91,14 + Actor2117: t12 + Owner: Neutral + Location: 41,70 + Actor2118: t17 + Owner: Neutral + Location: 47,115 + Actor2119: t02 + Owner: Neutral + Location: 19,117 + Actor2120: t13 + Owner: Neutral + Location: 132,102 + Actor2121: t12 + Owner: Neutral + Location: 74,3 + Actor2122: t13 + Owner: Neutral + Location: 12,61 + Actor2123: t08 + Owner: Neutral + Location: 120,111 + Actor2124: t05 + Owner: Neutral + Location: 3,118 + Actor2125: t05 + Owner: Neutral + Location: 102,35 + Actor2126: t06 + Owner: Neutral + Location: 92,14 + Actor2127: t05 + Owner: Neutral + Location: 98,93 + Actor2128: t17 + Owner: Neutral + Location: 47,42 + Actor2129: t12 + Owner: Neutral + Location: 47,12 + Actor2130: t02 + Owner: Neutral + Location: 18,49 + Actor2131: t06.husk + Owner: Neutral + Location: 78,51 + Actor2132: t12 + Owner: Neutral + Location: 50,107 + Actor2133: t17 + Owner: Neutral + Location: 66,84 + Actor2134: t03 + Owner: Neutral + Location: 62,90 + Actor2135: t16.husk + Owner: Neutral + Location: 101,126 + Actor2136: t07 + Owner: Neutral + Location: 40,41 + Actor2137: t02 + Owner: Neutral + Location: 99,126 + Actor2138: t08 + Owner: Neutral + Location: 45,39 + Actor2139: t13.husk + Owner: Neutral + Location: 87,86 + Actor2140: t08 + Owner: Neutral + Location: 118,98 + Actor2141: t06 + Owner: Neutral + Location: 103,34 + Actor2142: t07 + Owner: Neutral + Location: 101,16 + Actor2143: t01 + Owner: Neutral + Location: 119,71 + Actor2144: t01 + Owner: Neutral + Location: 128,66 + Actor2145: t01 + Owner: Neutral + Location: 92,97 + Actor2146: t16 + Owner: Neutral + Location: 44,28 + Actor2147: t08 + Owner: Neutral + Location: 140,69 + Actor2148: t16.husk + Owner: Neutral + Location: 3,120 + Actor2149: t06 + Owner: Neutral + Location: 21,55 + Actor2150: t01 + Owner: Neutral + Location: 34,52 + Actor2151: t12 + Owner: Neutral + Location: 69,0 + Actor2152: t07 + Owner: Neutral + Location: 21,56 + Actor2153: t13 + Owner: Neutral + Location: 94,102 + Actor2154: t01 + Owner: Neutral + Location: 35,78 + Actor2155: t07 + Owner: Neutral + Location: 45,18 + Actor2156: t08 + Owner: Neutral + Location: 35,73 + Actor2157: t17 + Owner: Neutral + Location: 101,93 + Actor2158: t05 + Owner: Neutral + Location: 98,92 + Actor2159: t13 + Owner: Neutral + Location: 108,93 + Actor2160: t03 + Owner: Neutral + Location: 73,3 + Actor2161: t07 + Owner: Neutral + Location: 142,78 + Actor2162: t12 + Owner: Neutral + Location: 120,15 + Actor2163: t02 + Owner: Neutral + Location: 27,72 + Actor2164: t05 + Owner: Neutral + Location: 4,6 + Actor2165: t05 + Owner: Neutral + Location: 101,119 + Actor2166: t16 + Owner: Neutral + Location: 141,81 + Actor2167: t08 + Owner: Neutral + Location: 104,127 + Actor2169: t07 + Owner: Neutral + Location: 105,87 + Actor2170: t03 + Owner: Neutral + Location: 34,56 + Actor2171: t17 + Owner: Neutral + Location: 1,93 + Actor2172: t03 + Owner: Neutral + Location: 102,119 + Actor2173: t13.husk + Owner: Neutral + Location: 69,1 + Actor2174: t08 + Owner: Neutral + Location: 37,66 + Actor2175: t05 + Owner: Neutral + Location: 121,99 + Actor2176: t01 + Owner: Neutral + Location: 13,56 + Actor2177: t13 + Owner: Neutral + Location: 18,70 + Actor2178: t17 + Owner: Neutral + Location: 63,88 + Actor2179: t16 + Owner: Neutral + Location: 53,31 + Actor2180: t16 + Owner: Neutral + Location: 33,33 + Actor2181: t06 + Owner: Neutral + Location: 132,39 + Actor2182: t06 + Owner: Neutral + Location: 133,41 + Actor2183: t13 + Owner: Neutral + Location: 32,53 + Actor2184: t17 + Owner: Neutral + Location: 2,123 + Actor2185: t08 + Owner: Neutral + Location: 2,120 + Actor2186: t03 + Owner: Neutral + Location: 51,32 + Actor2187: t03 + Owner: Neutral + Location: 33,77 + Actor2188: t07 + Owner: Neutral + Location: 29,40 + Actor2189: t13 + Owner: Neutral + Location: 15,60 + Actor2190: t16 + Owner: Neutral + Location: 20,55 + Actor2191: t07 + Owner: Neutral + Location: 96,98 + Actor2192: t01 + Owner: Neutral + Location: 15,61 + Actor2193: t06 + Owner: Neutral + Location: 33,55 + Actor2194: t16 + Owner: Neutral + Location: 86,15 + Actor2195: t08 + Owner: Neutral + Location: 98,98 + Actor2196: t05 + Owner: Neutral + Location: 17,59 + Actor2197: t03 + Owner: Neutral + Location: 43,44 + Actor2198: t08 + Owner: Neutral + Location: 51,34 + Actor2199: t03 + Owner: Neutral + Location: 86,16 + Actor2200: t12 + Owner: Neutral + Location: 33,70 + Actor2201: t03 + Owner: Neutral + Location: 20,56 + Actor1699: t06 + Owner: Neutral + Location: 144,80 + HQ: miss + Owner: GDI + Location: 76,66 + Actor2019: brik + Owner: GDI + Location: 67,75 + Actor2024: brik + Owner: GDI + Location: 67,74 + Actor2035: brik + Owner: GDI + Location: 68,74 + Actor2045: brik + Owner: GDI + Location: 68,75 + Actor2053: brik + Owner: GDI + Location: 67,73 + Actor2059: brik + Owner: GDI + Location: 67,72 + Actor2067: brik + Owner: GDI + Location: 67,71 + Actor2078: brik + Owner: GDI + Location: 67,70 + Actor2094: brik + Owner: GDI + Location: 68,71 + Actor2103: brik + Owner: GDI + Location: 68,70 + Actor2108: brik + Owner: GDI + Location: 69,75 + Actor2116: brik + Owner: GDI + Location: 70,76 + Actor2168: brik + Owner: GDI + Location: 70,75 + Actor2202: brik + Owner: GDI + Location: 70,77 + Actor2203: brik + Owner: GDI + Location: 70,78 + Actor2204: brik + Owner: GDI + Location: 71,78 + Actor2205: brik + Owner: GDI + Location: 72,78 + Actor2206: brik + Owner: GDI + Location: 73,78 + Actor2207: brik + Owner: GDI + Location: 74,78 + Actor2208: brik + Owner: GDI + Location: 74,77 + Actor2209: brik + Owner: GDI + Location: 73,77 + Actor2210: brik + Owner: GDI + Location: 80,77 + Actor2211: brik + Owner: GDI + Location: 80,78 + Actor2212: brik + Owner: GDI + Location: 82,78 + Actor2213: brik + Owner: GDI + Location: 81,77 + Actor2214: brik + Owner: GDI + Location: 81,78 + Actor2215: brik + Owner: GDI + Location: 83,78 + Actor2216: brik + Owner: GDI + Location: 84,78 + Actor2217: brik + Owner: GDI + Location: 83,77 + Actor2218: brik + Owner: GDI + Location: 84,77 + Actor2219: brik + Owner: GDI + Location: 84,76 + Actor2220: brik + Owner: GDI + Location: 86,76 + Actor2221: brik + Owner: GDI + Location: 85,76 + Actor2222: brik + Owner: GDI + Location: 88,76 + Actor2223: brik + Owner: GDI + Location: 87,76 + Actor2243: brik + Owner: GDI + Location: 89,57 + Actor2244: brik + Owner: GDI + Location: 87,57 + Actor2245: brik + Owner: GDI + Location: 88,57 + Actor2246: brik + Owner: GDI + Location: 86,57 + Actor2247: brik + Owner: GDI + Location: 85,57 + Actor2248: brik + Owner: GDI + Location: 83,57 + Actor2249: brik + Owner: GDI + Location: 81,57 + Actor2250: brik + Owner: GDI + Location: 84,57 + Actor2251: brik + Owner: GDI + Location: 82,57 + Actor2252: brik + Owner: GDI + Location: 80,57 + Actor2253: brik + Owner: GDI + Location: 80,58 + Actor2254: brik + Owner: GDI + Location: 81,58 + Actor2255: brik + Owner: GDI + Location: 74,57 + Actor2256: brik + Owner: GDI + Location: 74,58 + Actor2257: brik + Owner: GDI + Location: 73,57 + Actor2258: brik + Owner: GDI + Location: 73,58 + Actor2259: brik + Owner: GDI + Location: 72,57 + Actor2260: brik + Owner: GDI + Location: 70,57 + Actor2261: brik + Owner: GDI + Location: 71,57 + Actor2262: brik + Owner: GDI + Location: 69,57 + Actor2263: brik + Owner: GDI + Location: 68,57 + Actor2267: brik + Owner: GDI + Location: 67,62 + Actor2268: brik + Owner: GDI + Location: 67,61 + Actor2269: brik + Owner: GDI + Location: 67,60 + Actor2270: brik + Owner: GDI + Location: 67,59 + Actor2271: brik + Owner: GDI + Location: 67,58 + Actor2272: brik + Owner: GDI + Location: 67,63 + Actor2274: brik + Owner: GDI + Location: 67,65 + Actor2275: brik + Owner: GDI + Location: 68,65 + Actor2276: brik + Owner: GDI + Location: 67,64 + Actor2277: brik + Owner: GDI + Location: 68,64 + Actor2265: nuk2 + Owner: GDI + Location: 68,58 + Actor2266: nuk2 + Owner: GDI + Location: 70,58 + Actor2278: nuk2 + Owner: GDI + Location: 85,73 + Actor2279: nuk2 + Owner: GDI + Location: 87,73 + Actor2280: nuk2 + Owner: GDI + Location: 83,73 + Actor2285: atwr + Owner: GDI + Location: 72,77 + Actor2286: atwr + Owner: GDI + Location: 68,73 + Actor2287: atwr + Owner: GDI + Location: 82,77 + Actor2290: atwr + Owner: GDI + Location: 82,58 + Actor2291: atwr + Owner: GDI + Location: 72,58 + Actor2292: atwr + Owner: GDI + Location: 68,63 + Actor2293: gtwr + Owner: GDI + Location: 74,79 + Actor2294: gtwr + Owner: GDI + Location: 80,79 + Actor2297: gtwr + Owner: GDI + Location: 80,56 + Actor2298: gtwr + Owner: GDI + Location: 74,56 + Actor2299: gtwr + Owner: GDI + Location: 66,65 + Actor2300: gtwr + Owner: GDI + Location: 66,70 + Actor2304: cram + Owner: GDI + Location: 70,74 + Actor2305: cram + Owner: GDI + Location: 68,61 + Actor2308: nuk2 + Owner: GDI + Location: 72,59 + Actor2309: nuk2 + Owner: GDI + Location: 84,58 + Actor2302: afld.gdi + Owner: GDI + Location: 72,71 + Actor2283: rep + Owner: GDI + Location: 71,67 + Actor2284: pyle + Owner: GDI + Location: 84,69 + Actor2312: t01 + Owner: Neutral + Location: 42,104 + Actor2314: t13 + Owner: Neutral + Location: 40,105 + Actor2315: tc04 + Owner: Neutral + Location: 41,105 + Actor2316: t08 + Owner: Neutral + Location: 37,107 + Actor2317: t17 + Owner: Neutral + Location: 38,106 + Actor2318: t13.husk + Owner: Neutral + Location: 40,106 + Actor2319: t13 + Owner: Neutral + Location: 38,107 + Actor2320: t13 + Owner: Neutral + Location: 39,107 + Actor2321: t08 + Owner: Neutral + Location: 40,108 + Actor2322: t06 + Owner: Neutral + Location: 39,108 + Actor2323: split2 + Owner: Neutral + Location: 81,85 + Actor2324: split2 + Owner: Neutral + Location: 80,91 + Actor2325: split2 + Owner: Neutral + Location: 85,88 + Actor2326: split2 + Owner: Neutral + Location: 107,82 + Actor2327: split2 + Owner: Neutral + Location: 110,85 + Actor2328: wormhole + Owner: Scrin + Location: 136,9 + Actor2329: wormhole + Owner: Scrin + Location: 124,5 + Actor2330: wormhole + Owner: Scrin + Location: 138,36 + Actor2331: wormhole + Owner: Scrin + Location: 114,35 + Actor2332: wormhole + Owner: Scrin + Location: 84,24 + Actor2333: wormhole + Owner: Scrin + Location: 52,7 + Actor2334: wormhole + Owner: Scrin + Location: 31,7 + Actor2335: wormhole + Owner: Scrin + Location: 9,23 + Actor2336: wormhole + Owner: Scrin + Location: 12,43 + Actor2337: wormhole + Owner: Scrin + Location: 25,63 + Actor2338: wormhole + Owner: Scrin + Location: 9,89 + Actor2339: wormhole + Owner: Scrin + Location: 10,122 + Actor2340: wormhole + Owner: Scrin + Location: 38,124 + Actor2342: wormhole + Owner: Scrin + Location: 131,120 + Actor2343: wormhole + Owner: Scrin + Location: 100,107 + Actor2344: wormhole + Owner: Scrin + Location: 48,88 + Actor2345: wormhole + Owner: Scrin + Location: 54,37 + Actor2346: wormhole + Owner: Scrin + Location: 138,53 + Actor2347: wormhole + Owner: Scrin + Location: 131,74 + Actor2349: mtnk + Owner: GDI + Location: 72,80 + Facing: 384 + Actor2350: mtnk + Owner: GDI + Location: 82,80 + Facing: 618 + Actor2353: mtnk + Owner: GDI + Location: 64,70 + Facing: 256 + Actor2354: mtnk + Owner: GDI + Location: 64,66 + Facing: 256 + Actor2355: mtnk + Owner: GDI + Location: 72,55 + Facing: 0 + Actor2356: mtnk + Owner: GDI + Location: 82,55 + Facing: 0 + Actor2357: vulc + Owner: GDI + Location: 76,59 + Facing: 0 + Actor2359: vulc + Owner: GDI + Location: 74,75 + Facing: 512 + Actor2360: harv.td + Owner: GDI + Location: 78,81 + Facing: 512 + Actor2362: wolv + Owner: GDI + Location: 78,69 + Facing: 547 + Actor2363: wolv + Owner: GDI + Facing: 384 + Location: 75,67 + Actor2364: n1 + Owner: GDI + Location: 86,71 + SubCell: 3 + Facing: 206 + Actor2365: n1 + Owner: GDI + SubCell: 3 + Location: 86,70 + Facing: 753 + Actor2366: n1 + Owner: GDI + Facing: 384 + Location: 86,70 + SubCell: 1 + Actor2367: n1 + Owner: GDI + Location: 86,70 + SubCell: 2 + Facing: 0 + Actor2368: n1 + Owner: GDI + Location: 86,70 + SubCell: 4 + Facing: 594 + Actor2369: n1 + Owner: GDI + Facing: 384 + SubCell: 1 + Location: 84,71 + Actor2370: n1 + Owner: GDI + SubCell: 3 + Location: 83,70 + Facing: 650 + Actor2371: n1 + Owner: GDI + Location: 83,70 + SubCell: 1 + Facing: 134 + Actor2372: n1 + Owner: GDI + Location: 83,70 + SubCell: 2 + Facing: 0 + Actor2373: n1 + Owner: GDI + Location: 84,71 + SubCell: 2 + Facing: 578 + Actor2374: n1 + Owner: GDI + SubCell: 3 + Location: 85,68 + Facing: 832 + Actor2377: n1 + Owner: GDI + SubCell: 3 + Location: 83,55 + Facing: 0 + Actor2378: n1 + Owner: GDI + SubCell: 3 + Location: 72,56 + Facing: 0 + Actor2379: n1 + Owner: GDI + Location: 64,65 + SubCell: 3 + Facing: 118 + Actor2380: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 64,71 + Actor2381: n1 + Owner: GDI + Facing: 384 + Location: 71,80 + SubCell: 3 + Actor2382: n1 + Owner: GDI + SubCell: 3 + Location: 73,81 + Facing: 570 + Actor2383: n1 + Owner: GDI + Facing: 384 + Location: 83,80 + SubCell: 3 + Actor2384: n1 + Owner: GDI + SubCell: 3 + Location: 83,79 + Facing: 610 + Actor2385: medi + Owner: GDI + Facing: 384 + Location: 86,69 + SubCell: 3 + Actor2386: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 79,69 + Actor2388: n3 + Owner: GDI + Location: 74,63 + SubCell: 3 + Facing: 697 + Actor2389: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 70,61 + Actor2390: split2 + Owner: Neutral + Location: 43,65 + Actor2391: split2 + Owner: Neutral + Location: 45,60 + Actor2392: tpod + Owner: Scrin + Location: 93,7 + Facing: 531 + Actor2393: tpod + Owner: Scrin + Facing: 384 + Location: 100,11 + Actor2400: pac + Owner: Scrin + Location: 17,121 + Facing: 896 + Actor2401: pac + Owner: Scrin + Location: 10,113 + Facing: 896 + Actor2394: pac + Owner: Scrin + Facing: 384 + Location: 136,15 + Actor2395: pac + Owner: Scrin + Facing: 384 + Location: 128,7 + Actor2295: brik + Owner: GDI + Location: 90,57 + Actor2296: brik + Owner: GDI + Location: 91,57 + Actor2351: cram + Owner: GDI + Location: 90,58 + Actor2352: brik + Owner: GDI + Location: 91,58 + Actor2361: brik + Owner: GDI + Location: 91,59 + Actor2375: brik + Owner: GDI + Location: 91,60 + Actor2376: atwr + Owner: GDI + Location: 90,61 + Actor2398: brik + Owner: GDI + Location: 91,61 + Actor2403: brik + Owner: GDI + Location: 91,62 + Actor2407: brik + Owner: GDI + Location: 91,63 + Actor2408: gtwr + Owner: GDI + Location: 92,63 + Actor2409: brik + Owner: GDI + Location: 90,68 + Actor2410: brik + Owner: GDI + Location: 91,68 + Actor2411: gtwr + Owner: GDI + Location: 92,68 + Actor2412: brik + Owner: GDI + Location: 90,69 + Actor2413: brik + Owner: GDI + Location: 91,69 + Actor2414: atwr + Owner: GDI + Location: 90,70 + Actor2415: brik + Owner: GDI + Location: 91,70 + Actor2416: brik + Owner: GDI + Location: 91,71 + Actor2417: cram + Owner: GDI + Location: 90,72 + Actor2418: brik + Owner: GDI + Location: 91,72 + Actor2420: brik + Owner: GDI + Location: 91,73 + Actor2421: brik + Owner: GDI + Location: 91,74 + Actor2422: brik + Owner: GDI + Location: 91,75 + Actor2423: brik + Owner: GDI + Location: 90,76 + Actor2232: n3 + Owner: GDI + SubCell: 3 + Facing: 745 + Location: 88,66 + Actor2233: vulc + Owner: GDI + Facing: 768 + Location: 88,67 + Actor2234: brik + Owner: GDI + Location: 89,76 + Actor2235: brik + Owner: GDI + Location: 91,76 + Actor2236: hq + Owner: GDI + Location: 89,73 + Actor2237: nuk2 + Owner: GDI + Location: 86,58 + Actor2238: nuk2 + Owner: GDI + Location: 88,58 + Actor2239: weap.td + Owner: GDI + Location: 85,62 + Actor2240: brik + Owner: GDI + Location: 90,63 + Actor2241: brik + Owner: GDI + Location: 90,62 + Actor2242: mtnk + Owner: GDI + Location: 95,64 + Facing: 768 + Actor2288: mtnk + Owner: GDI + Location: 95,69 + Facing: 768 + Actor2289: n1 + Owner: GDI + SubCell: 3 + Facing: 610 + Location: 96,62 + Actor2301: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 96,63 + Actor2306: n1 + Owner: GDI + SubCell: 3 + Facing: 610 + Location: 95,70 + Actor2273: proc.td + Owner: GDI + Location: 78,71 + Actor2281: gtek + Owner: GDI + Location: 81,62 + Actor2282: upgc + Owner: GDI + Location: 71,63 + Actor2224: brik + Owner: GDI + Location: 67,57 + Actor2228: ptnk + Owner: Greece + Facing: 777 + Location: 92,61 + Actor2225: ifv + Owner: Greece + Location: 93,73 + Facing: 768 + Actor2226: ifv + Owner: Greece + Location: 93,75 + Facing: 768 + Actor2229: e1 + Owner: Greece + SubCell: 3 + Location: 94,60 + Facing: 999 + Actor2230: e1 + Owner: Greece + SubCell: 3 + Location: 93,58 + Facing: 777 + Actor2231: e1 + Owner: Greece + Location: 93,58 + SubCell: 1 + Facing: 777 + Actor2303: e1 + Owner: Greece + SubCell: 3 + Location: 91,47 + Facing: 904 + Actor2307: e1 + Owner: Greece + Location: 91,47 + SubCell: 1 + Facing: 856 + Actor2310: e1 + Owner: Greece + SubCell: 3 + Location: 94,50 + Facing: 816 + Actor2311: e1 + Owner: Greece + SubCell: 3 + Location: 92,50 + Facing: 848 + Actor2358: ptnk + Owner: Greece + Facing: 777 + Location: 93,71 + Actor2387: e3 + Owner: Greece + SubCell: 3 + Location: 92,48 + Facing: 1023 + Actor2399: 3tnk + Owner: USSR + Location: 78,98 + Facing: 512 + Actor2404: 3tnk + Owner: USSR + Location: 84,98 + Facing: 512 + Actor2405: 3tnk + Owner: USSR + Location: 81,99 + Facing: 512 + Actor2406: ttra + Owner: USSR + Location: 81,97 + Facing: 512 + Actor2419: ttrp + Owner: USSR + SubCell: 3 + Location: 78,97 + Facing: 563 + Actor2424: e1 + Owner: USSR + SubCell: 3 + Location: 83,98 + Facing: 674 + Actor2425: e1 + Owner: USSR + SubCell: 3 + Location: 79,99 + Facing: 547 + Actor2426: e1 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 77,99 + Actor2427: e1 + Owner: USSR + SubCell: 3 + Location: 84,99 + Facing: 507 + Actor2428: e1 + Owner: USSR + SubCell: 3 + Location: 86,98 + Facing: 578 + Actor2429: e3 + Owner: USSR + Facing: 384 + Location: 83,98 + SubCell: 1 + Actor2430: ltnk + Owner: Nod + Facing: 384 + Location: 43,76 + Actor2431: ltnk + Owner: Nod + Facing: 384 + Location: 47,77 + Actor2432: ftnk + Owner: Nod + Facing: 384 + Location: 45,77 + Actor2433: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 42,75 + Actor2434: n1 + Owner: Nod + Facing: 384 + Location: 42,75 + SubCell: 1 + Actor2435: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 45,76 + Actor2436: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 48,76 + Actor2437: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 47,79 + Actor2438: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 42,77 + Actor2439: n4 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 46,79 + Actor2440: stnk.nod + Owner: Nod + Location: 35,81 + Facing: 384 + Stance: AttackAnything + Actor2441: stnk.nod + Owner: Nod + Location: 36,82 + Facing: 384 + Stance: AttackAnything + Actor2442: mrj + Owner: Greece + Facing: 384 + Location: 83,60 + Actor2443: cryo + Owner: Greece + Facing: 384 + Location: 69,74 + Actor2444: cryo + Owner: Greece + Location: 90,59 + Facing: 888 + Actor2445: batf.ai + Owner: Greece + Facing: 384 + Location: 52,53 + Actor2446: jeep + Owner: Greece + Facing: 384 + Location: 49,51 + Actor2447: jeep + Owner: Greece + Facing: 384 + Location: 51,49 + Actor2448: 2tnk + Owner: Greece + Facing: 384 + Location: 51,51 + Actor2449: 2tnk + Owner: Greece + Location: 55,49 + Facing: 253 + Actor2450: pbox + Owner: Greece + Location: 53,49 + Actor2451: agun + Owner: Greece + Location: 56,52 + Actor2452: sbag + Owner: Greece + Location: 55,52 + Actor2453: sbag + Owner: Greece + Location: 55,51 + Actor2454: sbag + Owner: Greece + Location: 56,51 + Actor2455: sbag + Owner: Greece + Location: 57,51 + Actor2456: sbag + Owner: Greece + Location: 57,52 + Actor2457: sbag + Owner: Greece + Location: 57,53 + Actor2458: sbag + Owner: Greece + Location: 56,53 + Actor2459: sbag + Owner: Greece + Location: 55,53 + Actor2460: sbag + Owner: Greece + Location: 90,46 + Actor2461: sbag + Owner: Greece + Location: 90,47 + Actor2462: sbag + Owner: Greece + Location: 91,46 + Actor2463: sbag + Owner: Greece + Location: 92,46 + Actor2464: sbag + Owner: Greece + Location: 93,46 + Actor2465: sbag + Owner: Greece + Location: 98,46 + Actor2466: sbag + Owner: Greece + Location: 97,46 + Actor2467: sbag + Owner: Greece + Location: 99,46 + Actor2468: sbag + Owner: Greece + Location: 100,46 + Actor2469: sbag + Owner: Greece + Location: 100,47 + Actor2470: sbag + Owner: Greece + Location: 100,48 + Actor2471: ptnk + Owner: Greece + Location: 99,47 + Facing: 7 + Actor2472: ifv + Owner: Greece + Location: 94,48 + Facing: 0 + ReinforcementSpawn1: waypoint + Owner: Neutral + Location: 16,1 + ReinforcementSpawn2: waypoint + Owner: Neutral + Location: 85,1 + ReinforcementSpawn10: waypoint + Owner: Neutral + Location: 97,1 + ReinforcementSpawn3: waypoint + Owner: Neutral + Location: 112,1 + ReinforcementSpawn4: waypoint + Owner: Neutral + Location: 144,93 + ReinforcementSpawn5: waypoint + Owner: Neutral + Location: 114,128 + ReinforcementSpawn6: waypoint + Owner: Neutral + Location: 86,128 + ReinforcementSpawn7: waypoint + Owner: Neutral + Location: 64,128 + ReinforcementSpawn9: waypoint + Owner: Neutral + Location: 1,80 + ReinforcementRally2: waypoint + Owner: Neutral + Location: 82,9 + ReinforcementRally10: waypoint + Owner: Neutral + Location: 96,14 + ReinforcementRally4: waypoint + Owner: Neutral + Location: 127,92 + ReinforcementRally5: waypoint + Owner: Neutral + Location: 111,117 + ReinforcementRally7: waypoint + Owner: Neutral + Location: 67,118 + ReinforcementRally6: waypoint + Owner: Neutral + Location: 86,121 + Actor2313: t03 + Owner: Neutral + Location: 43,104 + ReinforcementSpawn8: waypoint + Owner: Neutral + Location: 43,128 + ReinforcementRally8: waypoint + Owner: Neutral + Location: 43,119 + ReinforcementRally9: waypoint + Owner: Neutral + Location: 14,80 + Actor2473: fenc + Owner: USSR + Location: 79,101 + Actor2474: fenc + Owner: USSR + Location: 78,101 + Actor2475: fenc + Owner: USSR + Location: 77,101 + Actor2476: fenc + Owner: USSR + Location: 76,101 + Actor2477: fenc + Owner: USSR + Location: 83,101 + Actor2478: fenc + Owner: USSR + Location: 84,101 + Actor2479: fenc + Owner: USSR + Location: 85,101 + Actor2480: fenc + Owner: USSR + Location: 87,101 + Actor2481: fenc + Owner: USSR + Location: 86,101 + Actor2482: fenc + Owner: USSR + Location: 75,101 + Actor2483: fenc + Owner: USSR + Location: 75,100 + Actor2484: ftur + Owner: USSR + Location: 84,102 + Actor2485: ftur + Owner: USSR + Location: 78,102 + ReinforcementFlare1: waypoint + Owner: Neutral + Location: 16,4 + ReinforcementFlare2: waypoint + Owner: Neutral + Location: 85,5 + ReinforcementFlare10: waypoint + Owner: Neutral + Location: 97,5 + ReinforcementFlare3: waypoint + Owner: Neutral + Location: 112,5 + ReinforcementFlare4: waypoint + Owner: Neutral + Location: 140,92 + ReinforcementFlare5: waypoint + Owner: Neutral + Location: 114,123 + ReinforcementFlare6: waypoint + Owner: Neutral + Location: 86,124 + ReinforcementFlare7: waypoint + Owner: Neutral + Location: 64,123 + ReinforcementFlare8: waypoint + Owner: Neutral + Location: 43,124 + ReinforcementFlare9: waypoint + Owner: Neutral + Location: 5,80 + Actor2488: devo + Owner: Scrin + Location: 11,114 + Facing: 896 + Actor2491: gunw + Owner: Scrin + Location: 13,113 + Facing: 896 + Actor2490: gunw + Owner: Scrin + Facing: 896 + Location: 14,115 + Actor2489: gunw + Owner: Scrin + Facing: 896 + Location: 17,116 + Actor2492: gunw + Owner: Scrin + Facing: 896 + Location: 7,117 + Actor2486: devo + Owner: Scrin + Facing: 896 + Location: 10,117 + Actor2487: devo + Owner: Scrin + Facing: 896 + Location: 16,119 + Actor2493: tpod + Owner: Scrin + Location: 19,120 + Facing: 896 + Actor2494: tpod + Owner: Scrin + Location: 9,115 + Facing: 896 + Actor2495: corr + Owner: Scrin + Location: 13,116 + Facing: 896 + Actor2496: tpod + Owner: Scrin + Facing: 384 + Location: 133,14 + Actor2497: rtpd + Owner: Scrin + Facing: 384 + Location: 128,13 + Actor2498: corr + Owner: Scrin + Facing: 384 + Location: 131,12 + Actor2499: evis + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 135,14 + Actor2500: evis + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 131,10 + Actor2501: evis + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 130,11 + Actor2502: evis + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 129,8 + Actor2503: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 125,7 + Actor2504: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 124,3 + Actor2505: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 126,4 + Actor2506: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 136,7 + Actor2507: s3 + Owner: Scrin + Facing: 384 + Location: 136,7 + SubCell: 1 + Actor2508: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 138,9 + Actor2509: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 139,14 + Actor2510: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 140,18 + Actor2511: devo + Owner: Scrin + Facing: 384 + Location: 133,11 + Actor2512: devo + Owner: Scrin + Facing: 384 + Location: 131,8 + Actor2513: gunw + Owner: Scrin + Facing: 384 + Location: 130,15 + Actor2514: gunw + Owner: Scrin + Facing: 384 + Location: 139,16 + Actor2515: gunw + Owner: Scrin + Facing: 384 + Location: 127,6 + Actor2516: gunw + Owner: Scrin + Facing: 384 + Location: 127,2 + Actor2517: intl.ai2 + Owner: Scrin + Facing: 384 + Location: 137,17 + Actor2518: intl.ai2 + Owner: Scrin + Facing: 384 + Location: 135,12 + Actor2519: intl.ai2 + Owner: Scrin + Location: 20,116 + Facing: 896 + Actor2520: intl.ai2 + Owner: Scrin + Facing: 896 + Location: 14,111 + Actor2524: evis + Owner: Scrin + Location: 7,113 + SubCell: 3 + Facing: 896 + Actor2523: evis + Owner: Scrin + SubCell: 3 + Facing: 896 + Location: 8,114 + Actor2522: evis + Owner: Scrin + SubCell: 3 + Facing: 896 + Location: 22,119 + Actor2521: evis + Owner: Scrin + SubCell: 3 + Facing: 896 + Location: 22,118 + Actor2530: s3 + Owner: Scrin + SubCell: 3 + Location: 4,112 + Facing: 896 + Actor2529: s3 + Owner: Scrin + SubCell: 3 + Facing: 896 + Location: 17,125 + Actor2526: s3 + Owner: Scrin + SubCell: 3 + Facing: 896 + Location: 17,123 + Actor2525: s3 + Owner: Scrin + SubCell: 3 + Facing: 896 + Location: 14,121 + Actor2527: s3 + Owner: Scrin + SubCell: 3 + Facing: 896 + Location: 21,122 + Actor2528: s3 + Owner: Scrin + SubCell: 3 + Facing: 896 + Location: 23,121 + Actor2402: tpod + Owner: Scrin + Location: 127,120 + Facing: 256 + Actor2531: tpod + Owner: Scrin + Location: 129,124 + Facing: 384 + Actor2532: tpod + Owner: Scrin + Location: 130,116 + Facing: 128 + ReinforcementRally3: waypoint + Owner: Neutral + Location: 112,10 + ReinforcementRally1: waypoint + Owner: Neutral + Location: 20,10 + Actor2533: wormhole + Owner: Scrin + Location: 135,104 + Actor2534: wormhole + Owner: Scrin + Location: 56,111 + Actor2535: wormhole + Owner: Scrin + Location: 80,120 + Actor2536: wormhole + Owner: Scrin + Location: 29,105 + Actor2537: split2 + Owner: Neutral + Location: 98,114 + HiddenSpawner1: hiddenspawner + Owner: Scrin + Location: 144,82 + HiddenSpawner2: hiddenspawner + Owner: Scrin + Location: 1,6 + HiddenSpawner3: hiddenspawner + Owner: Scrin + Location: 1,128 + HiddenSpawner4: hiddenspawner + Owner: Scrin + Location: 101,128 + HiddenSpawner5: hiddenspawner + Owner: Scrin + Location: 74,1 + Actor399: t16 + Owner: Neutral + Location: 143,83 + Actor2539: wormhole + Owner: Scrin + Location: 23,37 + Actor2538: wormhole + Owner: Scrin + Location: 118,95 + Actor2540: evis + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 47,8 + Actor2541: evis + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 46,7 + Actor2542: evis + Owner: Scrin + SubCell: 3 + Location: 55,10 + Facing: 642 + Actor2543: evis + Owner: Scrin + SubCell: 3 + Location: 56,8 + Facing: 642 + Actor2544: intl.ai2 + Owner: Scrin + Location: 57,9 + Facing: 642 + Actor2545: gunw + Owner: Scrin + Facing: 384 + Location: 32,10 + Actor2546: gunw + Owner: Scrin + Facing: 384 + Location: 27,5 + Actor2547: shrw + Owner: Scrin + Location: 130,34 + Facing: 256 + Actor2548: shrw + Owner: Scrin + Location: 130,37 + Facing: 256 + Actor2549: devo + Owner: Scrin + Location: 133,34 + Facing: 256 + Actor2550: lace + Owner: Scrin + Location: 130,70 + Facing: 269 + Actor2551: lace + Owner: Scrin + Facing: 384 + Location: 129,77 + Actor2552: lace + Owner: Scrin + Location: 131,77 + Facing: 384 + Actor2553: lace + Owner: Scrin + Location: 132,68 + Facing: 872 + Actor2554: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 131,69 + Actor2555: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 126,69 + Actor2556: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 135,77 + Actor2557: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 101,109 + Actor2558: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 100,105 + Actor2559: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 128,123 + Actor2560: s3 + Owner: Scrin + SubCell: 3 + Location: 128,121 + Facing: 333 + Actor2561: s3 + Owner: Scrin + SubCell: 3 + Location: 130,118 + Facing: 150 + Actor2562: s3 + Owner: Scrin + SubCell: 3 + Location: 131,117 + Facing: 142 + Actor2563: shrw + Owner: Scrin + Location: 128,118 + Facing: 166 + Actor2564: shrw + Owner: Scrin + Location: 132,115 + Facing: 118 + Actor2565: seek + Owner: Scrin + Location: 132,105 + Facing: 174 + Actor2566: seek + Owner: Scrin + Location: 130,103 + Facing: 237 + Actor2567: mast + Owner: Scrin + SubCell: 3 + Location: 8,120 + Facing: 880 + Actor2568: ruin + Owner: Scrin + Location: 7,28 + Facing: 808 + Actor2569: ruin + Owner: Scrin + Location: 7,30 + Facing: 848 + Actor2570: lchr + Owner: Scrin + Facing: 384 + Location: 11,39 + Actor2571: lchr + Owner: Scrin + Facing: 384 + Location: 16,44 + Actor2572: tpod + Owner: Scrin + Facing: 384 + Location: 14,41 + Actor2573: devo + Owner: Scrin + Location: 22,45 + Facing: 697 + Actor2574: devo + Owner: Scrin + Location: 24,44 + Facing: 689 + Actor2575: corr + Owner: Scrin + Location: 22,43 + Facing: 682 + Actor2576: gunw + Owner: Scrin + Location: 24,43 + Facing: 689 + Actor2577: gunw + Owner: Scrin + Location: 54,34 + Facing: 507 + Actor2578: gunw + Owner: Scrin + Location: 56,34 + Facing: 491 + Actor2579: stcr + Owner: Scrin + Location: 76,121 + Facing: 769 + Actor2580: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 78,119 + Actor2581: s1 + Owner: Scrin + Facing: 384 + Location: 79,118 + SubCell: 3 + Actor2582: s1 + Owner: Scrin + Facing: 384 + Location: 78,119 + SubCell: 1 + Actor2583: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 78,121 + Actor2584: s1 + Owner: Scrin + SubCell: 3 + Location: 60,111 + Facing: 626 + Actor2585: s1 + Owner: Scrin + Facing: 384 + Location: 60,111 + SubCell: 1 + Actor2586: s1 + Owner: Scrin + SubCell: 3 + Location: 58,108 + Facing: 800 + Actor2587: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 56,107 + Actor2588: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 59,114 + Actor2589: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 77,120 + Actor2590: intl + Owner: Scrin + Location: 60,113 + Facing: 713 + Actor2591: evis + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 45,91 + Actor2592: evis + Owner: Scrin + Facing: 384 + Location: 45,91 + SubCell: 1 + Actor2593: evis + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 48,92 + Actor2594: gunw + Owner: Scrin + Facing: 384 + Location: 47,91 + Actor2595: gunw + Owner: Scrin + Facing: 384 + Location: 52,88 + Actor2596: corr + Owner: Scrin + Facing: 384 + Location: 51,87 + Actor2597: seek + Owner: Scrin + Facing: 384 + Location: 29,102 + Actor2598: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 29,108 + Actor2599: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 30,109 + Actor2600: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 31,103 + Actor2601: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 28,101 + Actor2602: s1 + Owner: Scrin + Facing: 384 + Location: 28,101 + SubCell: 1 + Actor2603: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 26,99 + Actor2604: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 15,90 + Actor2605: s1 + Owner: Scrin + Facing: 384 + Location: 15,90 + SubCell: 1 + Actor2606: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 7,93 + Actor2607: s1 + Owner: Scrin + SubCell: 3 + Location: 7,94 + Facing: 697 + Actor2608: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 5,92 + Actor2609: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 12,95 + Actor2610: s1 + Owner: Scrin + SubCell: 3 + Location: 14,93 + Facing: 793 + Actor2611: tpod + Owner: Scrin + Facing: 384 + Location: 13,91 + Actor2612: tpod + Owner: Scrin + Location: 5,90 + Facing: 816 + Actor2613: gunw + Owner: Scrin + Location: 10,93 + Facing: 769 + Actor2614: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 8,93 + Actor2615: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 15,91 + Actor2616: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 50,90 + Actor2617: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 54,87 + Actor2618: s4 + Owner: Scrin + SubCell: 3 + Location: 60,108 + Facing: 721 + Actor2619: s4 + Owner: Scrin + SubCell: 3 + Location: 58,116 + Facing: 618 + Actor2620: seek + Owner: Scrin + Location: 102,106 + Facing: 531 + Actor2621: corr + Owner: Scrin + Location: 121,94 + Facing: 245 + Actor2622: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 122,95 + Actor2623: s1 + Owner: Scrin + Facing: 384 + Location: 122,95 + SubCell: 1 + Actor2624: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 119,92 + Actor2625: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 123,96 + Actor2626: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 116,97 + Actor2627: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 130,76 + Actor2628: s1 + Owner: Scrin + Facing: 384 + Location: 130,76 + SubCell: 1 + Actor2629: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 127,75 + Actor2630: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 128,70 + Actor2631: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 134,78 + Actor2632: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 136,76 + Actor2633: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 137,57 + Actor2634: s1 + Owner: Scrin + Facing: 384 + Location: 137,57 + SubCell: 1 + Actor2635: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 136,55 + Actor2636: s1 + Owner: Scrin + Facing: 384 + Location: 135,55 + SubCell: 3 + Actor2637: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 134,54 + Actor2638: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 136,52 + Actor2639: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 139,49 + Actor2640: gunw + Owner: Scrin + Facing: 384 + Location: 135,51 + Actor2641: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 141,54 + Actor2642: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 141,52 + Actor2643: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 138,51 + Actor2644: intl + Owner: Scrin + Facing: 384 + Location: 139,57 + Actor2645: ruin + Owner: Scrin + Facing: 384 + Location: 112,39 + Actor2646: ruin + Owner: Scrin + Facing: 384 + Location: 111,37 + Actor2647: gunw + Owner: Scrin + Facing: 384 + Location: 114,32 + Actor2648: gunw + Owner: Scrin + Facing: 384 + Location: 117,34 + Actor2649: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 115,38 + Actor2650: s4 + Owner: Scrin + Facing: 384 + Location: 115,38 + SubCell: 1 + Actor2651: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 111,35 + Actor2652: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 116,37 + Actor2653: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 112,32 + Actor2654: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 85,28 + Actor2655: s1 + Owner: Scrin + Facing: 384 + Location: 85,28 + SubCell: 1 + Actor2656: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 88,27 + Actor2657: s1 + Owner: Scrin + Facing: 384 + Location: 88,26 + SubCell: 3 + Actor2658: s1 + Owner: Scrin + Facing: 384 + Location: 87,26 + SubCell: 3 + Actor2659: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 89,21 + Actor2660: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 83,21 + Actor2661: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 89,25 + Actor2662: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 87,22 + Actor2663: s3 + Owner: Scrin + Facing: 384 + Location: 87,22 + SubCell: 1 + Actor2664: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 83,27 + Actor2665: gunw + Owner: Scrin + Facing: 384 + Location: 85,21 + Actor2666: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 24,61 + Actor2667: s1 + Owner: Scrin + Facing: 384 + Location: 24,61 + SubCell: 1 + Actor2668: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 25,60 + Actor2669: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 27,61 + Actor2670: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 22,66 + Actor2671: corr + Owner: Scrin + Location: 21,64 + Facing: 658 + Actor2672: gunw + Owner: Scrin + Facing: 384 + Location: 27,59 + Actor2673: intl.ai2 + Owner: Scrin + Location: 23,63 + Facing: 602 + Actor2674: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 5,22 + Actor2675: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 8,20 + Actor2676: s1 + Owner: Scrin + Facing: 384 + Location: 8,20 + SubCell: 1 + Actor2677: s1 + Owner: Scrin + Facing: 384 + Location: 9,20 + SubCell: 3 + Actor2678: s1 + Owner: Scrin + Facing: 384 + Location: 10,20 + SubCell: 3 + Actor2679: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 12,21 + Actor2680: s1 + Owner: Scrin + Facing: 384 + Location: 9,19 + SubCell: 3 + Actor2681: s3 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 9,20 + Actor2682: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 9,26 + Actor2683: s4 + Owner: Scrin + SubCell: 3 + Location: 36,126 + Facing: 935 + Actor2684: s4 + Owner: Scrin + Location: 36,126 + SubCell: 1 + Facing: 769 + Actor2685: s4 + Owner: Scrin + SubCell: 3 + Location: 37,122 + Facing: 697 + Actor2686: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 14,88 + Actor2687: s1 + Owner: Scrin + Facing: 384 + Location: 103,105 + SubCell: 3 + Actor2688: s1 + Owner: Scrin + Facing: 384 + Location: 103,105 + SubCell: 1 + Actor2689: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 98,105 + Actor2690: s1 + Owner: Scrin + Facing: 384 + Location: 98,106 + SubCell: 3 + Actor2691: s1 + Owner: Scrin + Facing: 384 + Location: 117,97 + SubCell: 3 + Actor2692: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 137,56 + Actor2693: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 131,36 + Actor2694: s1 + Owner: Scrin + Facing: 384 + Location: 131,36 + SubCell: 1 + Actor2695: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 132,33 + Actor2696: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 132,36 + Actor2697: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 133,37 + Actor2698: s1 + Owner: Scrin + Facing: 384 + Location: 134,38 + SubCell: 3 + Actor2699: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 135,34 + Actor2700: s1 + Owner: Scrin + Facing: 384 + Location: 135,33 + SubCell: 3 + Actor2701: s1 + Owner: Scrin + Facing: 384 + Location: 135,33 + SubCell: 1 + Actor2702: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 134,36 + Actor2703: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 131,35 + Actor2704: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 136,40 + Actor2705: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 132,38 + Actor2706: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 112,33 + Actor2707: s1 + Owner: Scrin + Facing: 384 + Location: 112,33 + SubCell: 1 + Actor2708: s1 + Owner: Scrin + Facing: 384 + Location: 110,37 + SubCell: 3 + Actor2709: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 109,39 + Actor2710: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 110,40 + Actor2711: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 116,33 + Actor2712: pac + Owner: Scrin + Location: 140,39 + Facing: 277 + Actor2713: gunw + Owner: Scrin + Facing: 384 + Location: 139,42 + Actor2714: gunw + Owner: Scrin + Facing: 384 + Location: 138,41 + Actor2715: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 134,16 + Actor2716: s1 + Owner: Scrin + Facing: 384 + Location: 134,16 + SubCell: 1 + Actor2717: s1 + Owner: Scrin + Facing: 384 + Location: 133,16 + SubCell: 3 + Actor2718: s1 + Owner: Scrin + Facing: 384 + Location: 133,16 + SubCell: 1 + Actor2719: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 132,15 + Actor2720: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 123,8 + Actor2721: s1 + Owner: Scrin + Facing: 384 + Location: 123,8 + SubCell: 1 + Actor2722: s1 + Owner: Scrin + Facing: 384 + Location: 122,7 + SubCell: 3 + Actor2723: s1 + Owner: Scrin + Facing: 384 + Location: 122,6 + SubCell: 3 + Actor2724: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 120,6 + Actor2725: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 121,9 + Actor2726: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 138,18 + Actor2727: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 138,19 + Actor2728: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 140,20 + Actor2729: s1 + Owner: Scrin + Facing: 384 + Location: 141,20 + SubCell: 3 + Actor2730: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 139,13 + Actor2731: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 133,4 + Actor2732: s1 + Owner: Scrin + Facing: 384 + Location: 133,4 + SubCell: 1 + Actor2733: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 134,2 + Actor2734: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 135,2 + Actor2735: s1 + Owner: Scrin + SubCell: 3 + Location: 10,109 + Facing: 753 + Actor2736: s1 + Owner: Scrin + Facing: 384 + Location: 10,109 + SubCell: 1 + Actor2737: s1 + Owner: Scrin + Location: 9,110 + SubCell: 3 + Facing: 864 + Actor2739: s1 + Owner: Scrin + SubCell: 3 + Location: 16,114 + Facing: 832 + Actor2740: s1 + Owner: Scrin + Location: 16,114 + SubCell: 1 + Facing: 777 + Actor2738: s1 + Owner: Scrin + SubCell: 3 + Facing: 864 + Location: 8,110 + Actor2741: s1 + Owner: Scrin + SubCell: 3 + Facing: 864 + Location: 12,109 + Actor2742: s1 + Owner: Scrin + SubCell: 3 + Facing: 864 + Location: 14,109 + Actor2743: stcr + Owner: Scrin + Facing: 384 + Location: 49,5 + Actor2744: gunw + Owner: Scrin + Location: 57,6 + Facing: 713 + Actor2745: gunw + Owner: Scrin + Facing: 384 + Location: 49,8 + Actor2746: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 48,7 + Actor2747: s1 + Owner: Scrin + Facing: 384 + Location: 48,7 + SubCell: 1 + Actor2748: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 46,5 + Actor2749: s1 + Owner: Scrin + Facing: 384 + Location: 46,5 + SubCell: 1 + Actor2750: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 51,5 + Actor2751: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 55,11 + Actor2752: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 32,12 + Actor2753: s1 + Owner: Scrin + Facing: 384 + Location: 32,12 + SubCell: 1 + Actor2754: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 31,10 + Actor2755: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 15,45 + Actor2756: s1 + Owner: Scrin + Facing: 384 + Location: 15,45 + SubCell: 1 + Actor2757: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 14,43 + Actor2758: s1 + Owner: Scrin + Facing: 384 + Location: 15,43 + SubCell: 3 + Actor2759: s1 + Owner: Scrin + Facing: 384 + Location: 15,43 + SubCell: 1 + Actor2760: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 12,40 + Actor2761: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 12,38 + Actor2762: s1 + Owner: Scrin + Facing: 384 + Location: 11,37 + SubCell: 3 + Actor2763: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 9,28 + Actor2764: shrw + Owner: Scrin + Location: 55,109 + Facing: 658 + Actor2765: camera + Owner: Scrin + Location: 63,68 + Actor2766: camera + Owner: Scrin + Location: 75,81 + Actor2767: camera + Owner: Scrin + Location: 93,77 + Actor2768: camera + Owner: Scrin + Location: 94,66 + Actor2769: camera + Owner: Scrin + Location: 87,55 + Actor2770: camera + Owner: Scrin + Location: 69,53 + Actor2771: camera + Owner: Scrin + Location: 123,19 + Actor2772: camera + Owner: Scrin + Location: 125,35 + Actor2773: camera + Owner: Scrin + Location: 124,74 + Actor2774: camera + Owner: Scrin + Location: 62,105 + Actor2775: camera + Owner: Scrin + Location: 25,106 + Actor2776: camera + Owner: Scrin + Location: 11,85 + Actor2777: camera + Owner: Scrin + Location: 25,53 + Actor2778: camera + Owner: Scrin + Location: 29,22 + Actor2779: camera + Owner: Scrin + Location: 69,26 + Actor2780: shar + Owner: Scrin + Location: 14,123 + Actor2781: shar + Owner: Scrin + Location: 9,119 + Actor2782: shar + Owner: Scrin + Location: 140,12 + Actor2783: shar + Owner: Scrin + Location: 121,4 + Actor2784: shar + Owner: Scrin + Location: 127,11 + Actor2785: shar + Owner: Scrin + Location: 17,46 + Actor2786: shar + Owner: Scrin + Location: 132,124 + Actor2787: shar + Owner: Scrin + Location: 134,118 + Actor2788: shar + Owner: Scrin + Location: 136,47 + Actor2789: shar + Owner: Scrin + Location: 137,33 + Actor2790: shrw + Owner: Scrin + Facing: 384 + Location: 87,24 + Actor2791: shrw + Owner: Scrin + Facing: 384 + Location: 32,5 + Actor2792: shrw + Owner: Scrin + Facing: 384 + Location: 11,41 + Actor2793: shrw + Owner: Scrin + Facing: 384 + Location: 27,103 + Actor2794: shrw + Owner: Scrin + Facing: 384 + Location: 134,101 + Actor2795: shrw + Owner: Scrin + Facing: 384 + Location: 102,104 + Actor2796: shrw + Owner: Scrin + Facing: 384 + Location: 141,56 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-coalitions.yaml, mobilization-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/main-campaign/ca29-mobilization/mobilization-rules.yaml b/mods/ca/missions/main-campaign/ca29-mobilization/mobilization-rules.yaml new file mode 100644 index 0000000000..7058dbd5d6 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca29-mobilization/mobilization-rules.yaml @@ -0,0 +1,136 @@ + +^Palettes: + PaletteFromFile@terrain-temperat: + Filename: ca|missions/main-campaign/ca29-mobilization/dark.pal + TintPostProcessEffect: + Red: 0.80 + Green: 0.90 + Blue: 1.05 + Ambient: 0.80 + FlashPostProcessEffect@LIGHTNINGSTRIKE: + Type: LightningStrike + WeatherOverlay@RAIN: + WindTick: 150, 550 + UseSquares: false + ScatterDirection: 0, 0 + Gravity: 20, 25 + SwingOffset: 0, 0 + SwingSpeed: 0, 0 + SwingAmplitude: 0, 0 + ParticleColors: 72aaae, 72aea6, 5caea3, 6da69f + LineTailAlphaValue: 30 + ParticleSize: 1, 1 + ParticleDensityFactor: 10 + +^BaseWorld: + TerrainLighting: + +World: + LuaScript: + Scripts: campaign.lua, mobilization.lua + MissionData: + Briefing: The assault on the Tiberium storage facility bought us valuable time, and preparations for our final assault are underway. The troops we freed from Scrin mind control have provided us with vital intel, and it seems that our suspicions were correct. The Scrin are cut off from their homeworld and they seek to open an interstellar gateway. They have been stockpiling Tiberium to provide the vast amount of energy this will require.\n\nThe main Scrin stronghold has been located and we are gathering whatever forces we can. Kane has apparently done one of his disappearing acts, and with Stalin dead the interim Nod and Soviet leaderships have agreed to a truce so that we can defeat the alien threat. Their commanders are attending a joint meeting at a command post near the front line.\n\n[ incoming transmission ]\n\nIt seems the Scrin have become aware of our plans.. Our command post has reported Scrin wormholes appearing throughout the area, and our reinforcements are being cut off.\n\nProtect the command post. Reinforcements will be arriving intermittently, but you'll need to take out these wormholes as quickly as possible or you'll be overwhelmed. Good luck. + MapOptions: + ShortGameCheckboxEnabled: False + MusicPlaylist: + StartingMusic: voic226m + +Player: + PlayerResources: + DefaultCash: 6000 + +SPLIT2: + TerrainLightSource: + Range: 6c0 + Intensity: 0.1 + GreenTint: 0.3 + +SPLIT3: + TerrainLightSource: + Range: 6c0 + Intensity: 0.1 + GreenTint: 0.3 + +AMCV: + Inherits@CAMPAIGNDISABLED: ^Disabled + +PBOX: + Power: + Amount: 0 + +AGUN: + Power: + Amount: 0 + +MISS: + Tooltip: + Name: Command Center + Health: + HP: 200000 + RepairableBuilding: + RepairStep: 500 + RepairPercent: 30 + RepairingNotification: Repairing + -SpawnActorOnDeath: + -OwnerLostAction: + FireWarheadsOnDeath: + Type: Footprint + Weapon: BuildingExplode + EmptyWeapon: BuildingExplode + WithBuildingRepairDecoration: + Image: allyrepair + Sequence: repair + Position: Center + Palette: player + IsPlayerPalette: True + +WORMHOLE: + Inherits@INF: ^ProducesInfantry + Inherits@VEH: ^ProducesVehicles + -TeleportNetwork: + Health: + HP: 300000 + ChangesHealth: + PercentageStep: 1 + Delay: 25 + StartIfBelow: 101 + DamageCooldown: 0 + RequiresCondition: !regen-disabled + ExternalCondition@NOREGEN: + Condition: regen-disabled + ExternalCondition@FIX1: + Condition: forceshield + ExternalCondition@FIX2: + Condition: being-warped + MustBeDestroyed: + RequiredForShortGame: true + TerrainLightSource: + Range: 2c512 + Intensity: 0.4 + BlueTint: 1 + RedTint: 0.2 + Targetable@Defense: + TargetTypes: Defense + +HIDDENSPAWNER: + Exit: + SpawnOffset: 0,0,2816 + -ExitCell: + +# Removing TeleportNetwork from Wormhole above causes exception as no actors with TeleportNetwork are defined +dummyteleport: + Inherits: ^InvisibleDummy + TeleportNetwork: + Type: Wormhole + +# Hunt() requires only 1 AttackBase +DEVA: + -AttackFrontalCharged: + -Armament@PRIMARYUPG: + -AmbientSound@CHARGE: + -WithIdleOverlay@CHARGE1: + -WithIdleOverlay@CHARGE2: + -WithIdleOverlay@CHARGE3: + +BATF.AI: + -AttackFrontal: diff --git a/mods/ca/missions/main-campaign/ca29-mobilization/mobilization.lua b/mods/ca/missions/main-campaign/ca29-mobilization/mobilization.lua new file mode 100644 index 0000000000..815956562c --- /dev/null +++ b/mods/ca/missions/main-campaign/ca29-mobilization/mobilization.lua @@ -0,0 +1,317 @@ +MissionDir = "ca|missions/main-campaign/ca29-mobilization" + +UnitBuildTimeMultipliers = { + easy = 0.05, + normal = 0.05, + hard = 0.05, + vhard = 0.05, + brutal = 0.05 +} + +ReinforcementInterval = DateTime.Minutes(4) + +ReinforcementLocations = { + { Path = { ReinforcementSpawn1.Location, ReinforcementRally1.Location }, Flare = ReinforcementFlare1.Location }, + { Path = { ReinforcementSpawn2.Location, ReinforcementRally2.Location }, Flare = ReinforcementFlare2.Location }, + { Path = { ReinforcementSpawn3.Location, ReinforcementRally3.Location }, Flare = ReinforcementFlare3.Location }, + { Path = { ReinforcementSpawn4.Location, ReinforcementRally4.Location }, Flare = ReinforcementFlare4.Location }, + { Path = { ReinforcementSpawn5.Location, ReinforcementRally5.Location }, Flare = ReinforcementFlare5.Location }, + { Path = { ReinforcementSpawn6.Location, ReinforcementRally6.Location }, Flare = ReinforcementFlare6.Location }, + { Path = { ReinforcementSpawn7.Location, ReinforcementRally7.Location }, Flare = ReinforcementFlare7.Location }, + { Path = { ReinforcementSpawn8.Location, ReinforcementRally8.Location }, Flare = ReinforcementFlare8.Location }, + { Path = { ReinforcementSpawn9.Location, ReinforcementRally9.Location }, Flare = ReinforcementFlare9.Location }, + { Path = { ReinforcementSpawn10.Location, ReinforcementRally10.Location }, Flare = ReinforcementFlare10.Location } +} + +ActiveReinforcementLocations = { + ReinforcementLocations[6], + ReinforcementLocations[5], + ReinforcementLocations[2] +} + +InitialReinforcementGroup = { "n1", "n1", "n1", "n3", "n1", "n1", "n3", "mtnk", "mtnk", "msam" } + +FinalReinforcementGroups = { + { "htnk", "n1", "n1", "n1", "n3", "n1", "n1", "n3", "xo", "xo" }, + { "wolv", "wolv", "ztrp", "ztrp", "ztrp", "ztrp", "ztrp" }, + { "titn", "n1", "n1", "n1", "n3", "n1", "n1", "n3", "vulc", "msam", "vulc" }, + { "htnk", "disr", "n1", "n1", "n1", "n3", "n1", "zrai", "zrai", "vulc" }, + { "htnk", "zdef", "zdef", "n1", "n1", "n1", "n3", "n1", "medi", "n1", "n1", "n1", "n3", "pbul" } +} + +Utils.Do(UnitCompositions.Scrin, function(c) + if c.Aircraft ~= nil then + c.Aircraft = {} + end +end) + +if Difficulty == "brutal" then + table.insert(UnitCompositions.Scrin, { + Infantry = { "s1", "mrdr", "s1", "mrdr", "mrdr", "s1", "mrdr", "mrdr", "s1", "mrdr", "mrdr", "s1", "mrdr" }, + Vehicles = { "oblt", "oblt", "oblt", "oblt", "oblt", "oblt" }, + MinTime = DateTime.Minutes(14), + IsSpecial = true + }) +end + +Squads = { + ScrinMain = { + Delay = AdjustDelayForDifficulty(DateTime.Minutes(1)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 40, Max = 80, RampDuration = DateTime.Minutes(13) }), + FollowLeader = true, + ProducerActors = nil, + ProducerTypes = { Infantry = { "wormhole" }, Vehicles = { "wormhole" }, Aircraft = { "wormhole" } }, + Compositions = AdjustCompositionsForDifficulty(UnitCompositions.Scrin), + AttackPaths = { + { HQ.Location }, + }, + }, + ScrinAir = { + Delay = AdjustAirDelayForDifficulty(DateTime.Minutes(9)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 28, Max = 28 }), + ProducerTypes = { Aircraft = { "hiddenspawner" } }, + Compositions = { + { Aircraft = { PacOrDevastator } } + }, + AttackPaths = { + { HQ.Location }, + }, + } +} + +SetupPlayers = function() + GDI = Player.GetPlayer("GDI") + Scrin = Player.GetPlayer("Scrin") + Nod = Player.GetPlayer("Nod") + USSR = Player.GetPlayer("USSR") + Greece = Player.GetPlayer("Greece") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = { GDI } + MissionEnemies = { Scrin } +end + +WorldLoaded = function() + SetupPlayers() + + LastScrinProduction = 0 + ReinforcementGroupIndex = 1 + ReinforcementLocationIndex = 1 + ReinforcementWave = 1 + TimerTicks = ReinforcementInterval + + NextReinforcementsFlare() + + Camera.Position = HQ.CenterPosition + + InitObjectives(GDI) + AdjustPlayerStartingCashForDifficulty() + InitScrin() + InitFriendlies() + SetupLightning() + + ObjectiveDestroyWormholes = GDI.AddObjective("Destroy all Scrin wormholes.") + ObjectiveDefendHQ = GDI.AddObjective("Protect the Command Center.") + + Utils.Do({ Nod, USSR, Greece }, function(p) + local groundAttackers = p.GetGroundAttackers() + + Utils.Do(groundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsGroundHunterUnit) + end) + end) + + Trigger.OnKilled(HQ, function() + GDI.MarkFailedObjective(ObjectiveDefendHQ) + end) + + local wormholes = Scrin.GetActorsByType("wormhole") + WormholeCount = #wormholes + Utils.Do(wormholes, function(w) + Trigger.OnProduction(w, function(producer, produced) + LastScrinProduction = DateTime.GameTime + end) + + Trigger.OnKilled(w, function(self, killer) + WormholeCount = #Scrin.GetActorsByType("wormhole") + UpdateMissionText() + if WormholeCount == 0 and not GDI.IsObjectiveCompleted(ObjectiveDestroyWormholes) then + GDI.MarkCompletedObjective(ObjectiveDestroyWormholes) + GDI.MarkCompletedObjective(ObjectiveDefendHQ) + end + end) + end) + + Trigger.AfterDelay(1, function() + SetActiveWormhole() + end) + + AfterWorldLoaded() +end + +Tick = function() + OncePerSecondChecks() + OncePerFiveSecondChecks() + OncePerThirtySecondChecks() + AfterTick() +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + if TimerTicks > 0 then + if TimerTicks > 25 then + TimerTicks = TimerTicks - 25 + else + SendReinforcements() + TimerTicks = ReinforcementInterval + end + UpdateMissionText() + end + end +end + +OncePerFiveSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 125 == 0 then + UpdatePlayerBaseLocations() + end +end + +OncePerThirtySecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % DateTime.Seconds(30) == 0 then + CalculatePlayerCharacteristics() + end +end + +UpdateMissionText = function() + if TimerTicks > 0 then + UserInterface.SetMissionText(WormholeCount .. " wormholes remaining. Reinforcements in " .. UtilsCA.FormatTimeForGameSpeed(TimerTicks), HSLColor.Yellow) + else + UserInterface.SetMissionText("") + end +end + +InitScrin = function() + InitAiUpgrades(Scrin) + InitAttackSquad(Squads.ScrinMain, Scrin) + InitAttackSquad(Squads.ScrinAir, Scrin) + + Actor.Create("ai.unlimited.power", true, { Owner = Scrin }) + + local scrinGroundAttackers = Scrin.GetGroundAttackers() + + Utils.Do(scrinGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(8192), IsScrinGroundHunterUnit) + end) +end + +InitFriendlies = function() + local nodGroundAttackers = Nod.GetGroundAttackers() + + Utils.Do(nodGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsNodGroundHunterUnit) + end) + + local ussrGroundAttackers = USSR.GetGroundAttackers() + + Utils.Do(ussrGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsUSSRGroundHunterUnit) + end) + + local greeceGroundAttackers = Greece.GetGroundAttackers() + + Utils.Do(greeceGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsGreeceGroundHunterUnit) + end) +end + +SetupLightning = function() + local nextStrikeDelay = Utils.RandomInteger(DateTime.Seconds(4), DateTime.Seconds(30)) + Trigger.AfterDelay(nextStrikeDelay, function() + LightningStrike() + SetupLightning() + end) +end + +LightningStrike = function() + local duration = Utils.RandomInteger(5, 8) + local thunderDelay = Utils.RandomInteger(5, 65) + local soundNumber + Lighting.Flash("LightningStrike", duration) + + repeat + soundNumber = Utils.RandomInteger(1, 7) + until(soundNumber ~= LastSoundNumber) + LastSoundNumber = soundNumber + + Trigger.AfterDelay(thunderDelay, function() + Media.PlaySound("thunder" .. soundNumber .. ".aud") + end) +end + +SetActiveWormhole = function() + -- If last unit produced was less than 5 seconds ago, wait 5 seconds to allow squad to finish producing + if LastScrinProduction < DateTime.GameTime - DateTime.Seconds(5) then + Trigger.AfterDelay(DateTime.Seconds(5), SetActiveWormhole) + return + end + + local wormholes = Scrin.GetActorsByType("wormhole") + if #wormholes > 0 then + local wormhole = Utils.Random(wormholes) + Squads.ScrinMain.ProducerActors = { Infantry = { wormhole }, Vehicles = { wormhole }, Aircraft = { wormhole } } + Trigger.AfterDelay(DateTime.Seconds(30), SetActiveWormhole) + end +end + +NextReinforcementsFlare = function() + Trigger.AfterDelay(DateTime.Seconds(15), function() + local flareLoc = ActiveReinforcementLocations[ReinforcementLocationIndex].Flare + ReinforcementFlare = Actor.Create("flare", true, { Location = flareLoc, Owner = GDI }) + Beacon.New(GDI, Map.CenterOfCell(flareLoc)) + end) +end + +SendReinforcements = function() + local locations = ActiveReinforcementLocations[ReinforcementLocationIndex] + local path = locations.Path + local flareLoc = locations.Flare + local units + + if ReinforcementWave > 4 then + units = Utils.Random(FinalReinforcementGroups) + else + units = InitialReinforcementGroup + end + + if IsVeryHardOrBelow() and ReinforcementWave == 3 then + DoMcvArrival(path) + end + + local reinforcements = Reinforcements.Reinforce(GDI, units, path, 50) + ReinforcementFlare.Destroy() + PlaySpeechNotificationToMissionPlayers("ReinforcementsArrived") + Notification("Reinforcements have arrived.") + Beacon.New(GDI, Map.CenterOfCell(flareLoc)) + + TimerTicks = ReinforcementInterval + ReinforcementWave = ReinforcementWave + 1 + ReinforcementLocationIndex = ReinforcementLocationIndex + 1 + + if ReinforcementLocationIndex > #ActiveReinforcementLocations then + ActiveReinforcementLocations = Utils.Shuffle(ReinforcementLocations) + ReinforcementLocationIndex = 1 + end + + NextReinforcementsFlare() +end + +-- overridden in co-op version +DoMcvArrival = function(path) + Trigger.AfterDelay(25, function() + Reinforcements.Reinforce(GDI, { "amcv" }, path) + end) +end diff --git a/mods/ca/missions/main-campaign/ca30-singularity/c_alliesreleased.aud b/mods/ca/missions/main-campaign/ca30-singularity/c_alliesreleased.aud new file mode 100644 index 0000000000..41b056c351 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca30-singularity/c_alliesreleased.aud differ diff --git a/mods/ca/missions/main-campaign/ca30-singularity/c_attackrunsuccess.aud b/mods/ca/missions/main-campaign/ca30-singularity/c_attackrunsuccess.aud new file mode 100644 index 0000000000..03d62a2cf3 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca30-singularity/c_attackrunsuccess.aud differ diff --git a/mods/ca/missions/main-campaign/ca30-singularity/c_chronotanks.aud b/mods/ca/missions/main-campaign/ca30-singularity/c_chronotanks.aud new file mode 100644 index 0000000000..28ba94c494 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca30-singularity/c_chronotanks.aud differ diff --git a/mods/ca/missions/main-campaign/ca30-singularity/c_hackers.aud b/mods/ca/missions/main-campaign/ca30-singularity/c_hackers.aud new file mode 100644 index 0000000000..e8f656c14b Binary files /dev/null and b/mods/ca/missions/main-campaign/ca30-singularity/c_hackers.aud differ diff --git a/mods/ca/missions/main-campaign/ca30-singularity/c_hibernation.aud b/mods/ca/missions/main-campaign/ca30-singularity/c_hibernation.aud new file mode 100644 index 0000000000..3d47e5d63f Binary files /dev/null and b/mods/ca/missions/main-campaign/ca30-singularity/c_hibernation.aud differ diff --git a/mods/ca/missions/main-campaign/ca30-singularity/c_leavesignaltransmitter.aud b/mods/ca/missions/main-campaign/ca30-singularity/c_leavesignaltransmitter.aud new file mode 100644 index 0000000000..0636e405e3 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca30-singularity/c_leavesignaltransmitter.aud differ diff --git a/mods/ca/missions/main-campaign/ca30-singularity/c_madtank.aud b/mods/ca/missions/main-campaign/ca30-singularity/c_madtank.aud new file mode 100644 index 0000000000..42324975fb Binary files /dev/null and b/mods/ca/missions/main-campaign/ca30-singularity/c_madtank.aud differ diff --git a/mods/ca/missions/main-campaign/ca30-singularity/c_madtankarrived.aud b/mods/ca/missions/main-campaign/ca30-singularity/c_madtankarrived.aud new file mode 100644 index 0000000000..62638eeb09 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca30-singularity/c_madtankarrived.aud differ diff --git a/mods/ca/missions/main-campaign/ca30-singularity/c_madtankenroute.aud b/mods/ca/missions/main-campaign/ca30-singularity/c_madtankenroute.aud new file mode 100644 index 0000000000..a7f0280976 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca30-singularity/c_madtankenroute.aud differ diff --git a/mods/ca/missions/main-campaign/ca30-singularity/c_mothershipdestroyed.aud b/mods/ca/missions/main-campaign/ca30-singularity/c_mothershipdestroyed.aud new file mode 100644 index 0000000000..b34a0c195f Binary files /dev/null and b/mods/ca/missions/main-campaign/ca30-singularity/c_mothershipdestroyed.aud differ diff --git a/mods/ca/missions/main-campaign/ca30-singularity/c_nereactorsdown.aud b/mods/ca/missions/main-campaign/ca30-singularity/c_nereactorsdown.aud new file mode 100644 index 0000000000..e7dc8d4ad1 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca30-singularity/c_nereactorsdown.aud differ diff --git a/mods/ca/missions/main-campaign/ca30-singularity/c_nodreleased.aud b/mods/ca/missions/main-campaign/ca30-singularity/c_nodreleased.aud new file mode 100644 index 0000000000..5ef70ac964 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca30-singularity/c_nodreleased.aud differ diff --git a/mods/ca/missions/main-campaign/ca30-singularity/c_nwreactorsdown.aud b/mods/ca/missions/main-campaign/ca30-singularity/c_nwreactorsdown.aud new file mode 100644 index 0000000000..fd440ad47d Binary files /dev/null and b/mods/ca/missions/main-campaign/ca30-singularity/c_nwreactorsdown.aud differ diff --git a/mods/ca/missions/main-campaign/ca30-singularity/c_onemorepass.aud b/mods/ca/missions/main-campaign/ca30-singularity/c_onemorepass.aud new file mode 100644 index 0000000000..035dc678a7 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca30-singularity/c_onemorepass.aud differ diff --git a/mods/ca/missions/main-campaign/ca30-singularity/c_resuming.aud b/mods/ca/missions/main-campaign/ca30-singularity/c_resuming.aud new file mode 100644 index 0000000000..4581234719 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca30-singularity/c_resuming.aud differ diff --git a/mods/ca/missions/main-campaign/ca30-singularity/c_sovietsreleased.aud b/mods/ca/missions/main-campaign/ca30-singularity/c_sovietsreleased.aud new file mode 100644 index 0000000000..cac19d8661 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca30-singularity/c_sovietsreleased.aud differ diff --git a/mods/ca/missions/main-campaign/ca30-singularity/map.bin b/mods/ca/missions/main-campaign/ca30-singularity/map.bin new file mode 100644 index 0000000000..60c789f14e Binary files /dev/null and b/mods/ca/missions/main-campaign/ca30-singularity/map.bin differ diff --git a/mods/ca/missions/main-campaign/ca30-singularity/map.png b/mods/ca/missions/main-campaign/ca30-singularity/map.png new file mode 100644 index 0000000000..6d5f48ef63 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca30-singularity/map.png differ diff --git a/mods/ca/missions/main-campaign/ca30-singularity/map.yaml b/mods/ca/missions/main-campaign/ca30-singularity/map.yaml new file mode 100644 index 0000000000..d8b059b58c --- /dev/null +++ b/mods/ca/missions/main-campaign/ca30-singularity/map.yaml @@ -0,0 +1,5379 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 30: Singularity + +Author: Darkademic + +Tileset: TEMPERAT + +MapSize: 134,134 + +Bounds: 1,1,132,132 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: GDI, Scrin, Greece + PlayerReference@GDI: + Name: GDI + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: gdi + LockColor: True + Color: F2CF74 + LockSpawn: True + LockTeam: True + Allies: Greece, Nod, USSR + Enemies: Scrin, NodSlaves, SovietSlaves, AlliedSlaves, CyborgSlaves, Creeps, Kane + PlayerReference@Greece: + Name: Greece + Bot: campaign + Faction: allies + Color: 99ACF2 + Allies: GDI, USSR, Nod + Enemies: Scrin, NodSlaves, SovietSlaves, AlliedSlaves, Creeps, Kane + PlayerReference@USSR: + Name: USSR + Bot: campaign + Faction: soviet + Color: FE1100 + Allies: GDI, Greece, Nod + Enemies: Scrin, NodSlaves, SovietSlaves, AlliedSlaves, Creeps, Kane + PlayerReference@Nod: + Name: Nod + Bot: campaign + Faction: nod + Color: FE1100 + Allies: GDI, Greece, USSR + Enemies: Scrin, NodSlaves, SovietSlaves, AlliedSlaves, Creeps + PlayerReference@Scrin: + Name: Scrin + Bot: campaign + Faction: scrin + Color: 7700FF + Allies: NodSlaves, SovietSlaves, AlliedSlaves, CyborgSlaves + Enemies: GDI, Greece, USSR, Nod, Creeps, Kane + PlayerReference@NodSlaves: + Name: NodSlaves + Bot: campaign + Faction: nod + Color: D500E8 + Allies: Scrin, SovietSlaves, AlliedSlaves, CyborgSlaves + Enemies: GDI, Greece, USSR, Nod, Creeps + PlayerReference@SovietSlaves: + Name: SovietSlaves + Bot: campaign + Faction: soviet + Color: D500E8 + Allies: Scrin, AlliedSlaves, NodSlaves, CyborgSlaves + Enemies: GDI, Greece, USSR, Nod, Creeps, Kane + PlayerReference@AlliedSlaves: + Name: AlliedSlaves + Bot: campaign + Faction: allies + Color: D500E8 + Allies: Scrin, NodSlaves, SovietSlaves, CyborgSlaves + Enemies: GDI, Greece, USSR, Nod, Creeps, Kane + PlayerReference@CyborgSlaves: + Name: CyborgSlaves + Bot: campaign + Faction: nod + Color: D500E8 + Allies: Scrin, SovietSlaves, AlliedSlaves, NodSlaves + Enemies: GDI, Greece, USSR, Creeps + PlayerReference@Kane: + Name: Kane + Bot: campaign + Faction: nod + Color: FE1100 + Enemies: Scrin, GDI, USSR, Greece, AlliedSlaves, SovietSlaves + PlayerReference@SignalTransmitterPlayer: + Name: SignalTransmitterPlayer + Bot: campaign + Faction: scrin + Color: 7700FF + Enemies: GDI + PlayerReference@NeutralGDI: + Name: NeutralGDI + Bot: campaign + NonCombatant: True + Faction: gdi + Color: F2CF74 + PlayerReference@NeutralScrin: + Name: NeutralScrin + Bot: campaign + NonCombatant: True + Faction: scrin + Color: 7700FF + +Actors: + Actor3: shar + Owner: Scrin + Location: 57,7 + Actor4: scol + Owner: Scrin + Location: 66,7 + Actor5: shar + Owner: Scrin + Location: 68,7 + Actor6: scol + Owner: Scrin + Location: 54,8 + Actor7: shar + Owner: Scrin + Location: 77,8 + Actor8: shar + Owner: Scrin + Location: 50,9 + Actor11: silo.scrinblue + Owner: Scrin + Location: 67,10 + Actor12: rea2 + Owner: Scrin + Location: 51,11 + Actor13: silo.scrin + Owner: Scrin + Location: 55,11 + Actor14: silo.scrin + Owner: Scrin + Location: 58,11 + Actor15: silo.scrin + Owner: Scrin + Location: 61,11 + Actor21: silo.scrinblue + Owner: Scrin + Location: 74,12 + Actor22: silo.scrinblue + Owner: Scrin + Location: 76,12 + Actor23: scol + Owner: Scrin + Location: 81,12 + Actor24: silo.scrin + Owner: Scrin + Location: 55,13 + Actor25: rea2 + Owner: Scrin + Location: 57,13 + Actor26: rea2 + Owner: Scrin + Location: 60,13 + Actor28: silo.scrinblue + Owner: Scrin + Location: 75,13 + Actor29: shar + Owner: Scrin + Location: 45,14 + Actor30: silo.scrin + Owner: Scrin + Location: 54,14 + Actor31: rea2 + Owner: Scrin + Location: 73,14 + Actor32: silo.scrinblue + Owner: Scrin + Location: 77,14 + Actor33: shar + Owner: Scrin + Location: 84,14 + Actor34: rea2 + Owner: Scrin + Location: 47,15 + Actor35: silo.scrin + Owner: Scrin + Location: 53,15 + Actor36: silo.scrin + Owner: Scrin + Location: 55,15 + Actor37: swal + Owner: Scrin + Location: 63,15 + Actor38: swal + Owner: Scrin + Location: 64,15 + Actor39: swal + Owner: Scrin + Location: 65,15 + Actor40: swal + Owner: Scrin + Location: 66,15 + Actor41: swal + Owner: Scrin + Location: 67,15 + Actor42: swal + Owner: Scrin + Location: 68,15 + Actor43: silo.scrinblue + Owner: Scrin + Location: 78,15 + Actor44: silo.scrinblue + Owner: Scrin + Location: 80,15 + Actor45: rea2 + Owner: Scrin + Location: 82,15 + Actor46: splitblue + Owner: Neutral + Location: 38,16 + Actor47: silo.scrin + Owner: Scrin + Location: 51,16 + Actor48: swal + Owner: Scrin + Location: 58,16 + Actor49: swal + Owner: Scrin + Location: 59,16 + Actor50: swal + Owner: Scrin + Location: 60,16 + Actor51: swal + Owner: Scrin + Location: 61,16 + Actor52: swal + Owner: Scrin + Location: 62,16 + Actor53: swal + Owner: Scrin + Location: 63,16 + Actor54: swal + Owner: Scrin + Location: 68,16 + Actor55: swal + Owner: Scrin + Location: 69,16 + Actor56: swal + Owner: Scrin + Location: 70,16 + Actor57: swal + Owner: Scrin + Location: 71,16 + Actor58: swal + Owner: Scrin + Location: 72,16 + Actor59: silo.scrinblue + Owner: Scrin + Location: 77,16 + Actor60: scol + Owner: Scrin + Location: 44,17 + Actor61: rea2 + Owner: Scrin + Location: 53,17 + Actor62: swal + Owner: Scrin + Location: 58,17 + Actor63: swal + Owner: Scrin + Location: 72,17 + Actor64: swal + Owner: Scrin + Location: 73,17 + Actor65: swal + Owner: Scrin + Location: 74,17 + Actor66: swal + Owner: Scrin + Location: 75,17 + Actor67: silo.scrinblue + Owner: Scrin + Location: 80,17 + Actor68: silo.scrin + Owner: Scrin + Location: 50,18 + Actor69: swal + Owner: Scrin + Location: 56,18 + Actor70: swal + Owner: Scrin + Location: 57,18 + Actor71: swal + Owner: Scrin + Location: 58,18 + Actor72: swal + Owner: Scrin + Location: 75,18 + Actor73: rea2 + Owner: Scrin + Location: 77,18 + Actor74: splitblue + Owner: Neutral + Location: 33,19 + Actor75: silo.scrin + Owner: Scrin + Location: 49,19 + Actor76: silo.scrin + Owner: Scrin + Location: 51,19 + Actor77: swal + Owner: Scrin + Location: 56,19 + Actor78: swal + Owner: Scrin + Location: 75,19 + Actor79: swal + Owner: Scrin + Location: 76,19 + Actor80: silo.scrinblue + Owner: Scrin + Location: 81,19 + Actor81: silo.scrinblue + Owner: Scrin + Location: 83,19 + Actor82: shar + Owner: Scrin + Location: 40,20 + Actor83: silo.scrin + Owner: Scrin + Location: 48,20 + Actor84: silo.scrin + Owner: Scrin + Location: 50,20 + Actor85: swal + Owner: Scrin + Location: 55,20 + Actor86: swal + Owner: Scrin + Location: 56,20 + Actor87: swal + Owner: Scrin + Location: 76,20 + Actor88: silo.scrinblue + Owner: Scrin + Location: 82,20 + Actor89: rea2 + Owner: Scrin + Location: 85,20 + Actor90: shar + Owner: Scrin + Location: 89,20 + Actor91: silo.scrin + Owner: Scrin + Location: 46,21 + Actor92: rea2 + Owner: Scrin + Location: 52,21 + Actor93: swal + Owner: Scrin + Location: 55,21 + Actor94: swal + Owner: Scrin + Location: 62,21 + Actor95: swal + Owner: Scrin + Location: 63,21 + Actor96: scol + Owner: Scrin + Location: 64,21 + Actor97: scol + Owner: Scrin + Location: 68,21 + Actor98: swal + Owner: Scrin + Location: 69,21 + Actor99: swal + Owner: Scrin + Location: 70,21 + Actor100: swal + Owner: Scrin + Location: 76,21 + Actor101: swal + Owner: Scrin + Location: 77,21 + Actor102: swal + Owner: Scrin + Location: 78,21 + Actor103: silo.scrinblue + Owner: Scrin + Location: 82,21 + Actor104: proc.scrin + Owner: Scrin + Location: 41,22 + Actor105: rea2 + Owner: Scrin + Location: 48,22 + Actor106: swal + Owner: Scrin + Location: 55,22 + Actor107: swal + Owner: Scrin + Location: 61,22 + Actor108: swal + Owner: Scrin + Location: 62,22 + Actor109: swal + Owner: Scrin + Location: 63,22 + Actor110: swal + Owner: Scrin + Location: 64,22 + Actor111: swal + Owner: Scrin + Location: 65,22 + Actor112: swal + Owner: Scrin + Location: 66,22 + Actor113: swal + Owner: Scrin + Location: 67,22 + Actor114: swal + Owner: Scrin + Location: 68,22 + Actor115: swal + Owner: Scrin + Location: 69,22 + Actor116: swal + Owner: Scrin + Location: 70,22 + Actor117: swal + Owner: Scrin + Location: 71,22 + Actor118: swal + Owner: Scrin + Location: 78,22 + Actor119: rea2 + Owner: Scrin + Location: 79,22 + Actor120: silo.scrinblue + Owner: Scrin + Location: 83,22 + Actor121: splitblue + Owner: Neutral + Location: 95,22 + Actor122: silo.scrin + Owner: Scrin + Location: 46,23 + Actor123: swal + Owner: Scrin + Location: 55,23 + Actor124: swal + Owner: Scrin + Location: 60,23 + Actor125: swal + Owner: Scrin + Location: 61,23 + Actor126: swal + Owner: Scrin + Location: 62,23 + Actor127: shar + Owner: Scrin + Location: 63,23 + Actor128: shar + Owner: Scrin + Location: 69,23 + Actor129: swal + Owner: Scrin + Location: 70,23 + Actor130: swal + Owner: Scrin + Location: 71,23 + Actor131: swal + Owner: Scrin + Location: 72,23 + Actor132: swal + Owner: Scrin + Location: 78,23 + Actor133: splitblue + Owner: Neutral + Location: 33,24 + Actor134: silo.scrin + Owner: Scrin + Location: 45,24 + Actor135: swal + Owner: Scrin + Location: 55,24 + Actor136: swal + Owner: Scrin + Location: 60,24 + Actor137: swal + Owner: Scrin + Location: 61,24 + Actor138: shar + Owner: Scrin + Location: 62,24 + TurretFacing: 317 + Actor139: shar + Owner: Scrin + Location: 70,24 + TurretFacing: 761 + Actor140: swal + Owner: Scrin + Location: 71,24 + Actor141: swal + Owner: Scrin + Location: 72,24 + Actor142: swal + Owner: Scrin + Location: 78,24 + Actor143: silo.scrinblue + Owner: Scrin + Location: 83,24 + Actor144: silo.scrinblue + Owner: Scrin + Location: 85,24 + Actor145: scol + Owner: Scrin + Location: 90,24 + Actor146: silo.scrin + Owner: Scrin + Location: 46,25 + Actor147: swal + Owner: Scrin + Location: 55,25 + Actor148: scol + Owner: Scrin + Location: 60,25 + Actor149: swal + Owner: Scrin + Location: 61,25 + Actor150: swal + Owner: Scrin + Location: 71,25 + Actor151: scol + Owner: Scrin + Location: 72,25 + Actor152: tplr + Owner: CyborgSlaves + SubCell: 1 + Facing: 512 + Location: 74,25 + Actor153: tplr + Owner: CyborgSlaves + SubCell: 2 + Facing: 512 + Location: 74,25 + Actor154: tplr + Owner: CyborgSlaves + SubCell: 4 + Facing: 512 + Location: 74,25 + Actor155: tplr + Owner: CyborgSlaves + SubCell: 5 + Facing: 512 + Location: 74,25 + Actor156: swal + Owner: Scrin + Location: 78,25 + Actor157: rea2 + Owner: Scrin + Location: 79,25 + Actor158: swal + Owner: Scrin + Location: 50,26 + Actor159: swal + Owner: Scrin + Location: 51,26 + Actor160: swal + Owner: Scrin + Location: 52,26 + Actor161: shar + Owner: Scrin + Location: 53,26 + Actor162: swal + Owner: Scrin + Location: 54,26 + Actor163: swal + Owner: Scrin + Location: 55,26 + Actor164: tplr + Owner: CyborgSlaves + SubCell: 1 + Facing: 512 + Location: 58,26 + Actor165: tplr + Owner: CyborgSlaves + SubCell: 2 + Facing: 512 + Location: 58,26 + Actor166: tplr + Owner: CyborgSlaves + SubCell: 4 + Facing: 512 + Location: 58,26 + Actor167: tplr + Owner: CyborgSlaves + SubCell: 5 + Facing: 512 + Location: 58,26 + Actor168: swal + Owner: Scrin + Location: 61,26 + Mothership: mshp + Owner: Scrin + Location: 66,26 + Facing: 384 + Actor170: swal + Owner: Scrin + Location: 71,26 + Actor171: swal + Owner: Scrin + Location: 77,26 + Actor172: swal + Owner: Scrin + Location: 78,26 + Actor173: silo.scrinblue + Owner: Scrin + Location: 84,26 + Actor175: swal + Owner: Scrin + Location: 50,27 + Actor176: swal + Owner: Scrin + Location: 51,27 + Actor177: swal + Owner: Scrin + Location: 52,27 + Actor178: swal + Owner: Scrin + Location: 53,27 + Actor179: swal + Owner: Scrin + Location: 54,27 + Actor180: swal + Owner: Scrin + Location: 55,27 + Actor181: swal + Owner: Scrin + Location: 61,27 + Wormhole: wormhole + Owner: Scrin + Location: 66,27 + Actor183: swal + Owner: Scrin + Location: 71,27 + Actor184: swal + Owner: Scrin + Location: 77,27 + Actor185: swal + Owner: Scrin + Location: 78,27 + Actor186: scol + Owner: Scrin + Location: 50,28 + Actor187: swal + Owner: Scrin + Location: 51,28 + RiftGenerator: rfgn + Owner: Scrin + Location: 52,28 + Actor189: swal + Owner: Scrin + Location: 54,28 + Actor190: swal + Owner: Scrin + Location: 55,28 + Actor191: swal + Owner: Scrin + Location: 61,28 + Actor192: swal + Owner: Scrin + Location: 71,28 + Actor193: enli + Owner: CyborgSlaves + SubCell: 1 + Facing: 512 + Location: 74,28 + Actor194: enli + Owner: CyborgSlaves + SubCell: 4 + Facing: 512 + Location: 74,28 + Actor195: enli + Owner: CyborgSlaves + SubCell: 2 + Facing: 512 + Location: 74,28 + Actor196: enli + Owner: CyborgSlaves + SubCell: 5 + Facing: 512 + Location: 74,28 + Actor197: swal + Owner: Scrin + Location: 78,28 + Actor198: shar + Owner: Scrin + Location: 89,28 + TurretFacing: 642 + Actor199: scol + Owner: Scrin + Location: 38,29 + Actor200: scol + Owner: Scrin + Location: 50,29 + Actor201: swal + Owner: Scrin + Location: 51,29 + Actor202: swal + Owner: Scrin + Location: 54,29 + Actor203: swal + Owner: Scrin + Location: 55,29 + Actor204: scol + Owner: Scrin + Location: 60,29 + Actor205: swal + Owner: Scrin + Location: 61,29 + Actor206: swal + Owner: Scrin + Location: 71,29 + Actor207: scol + Owner: Scrin + Location: 72,29 + Actor208: swal + Owner: Scrin + Location: 78,29 + Actor209: reac + Owner: Scrin + Location: 82,29 + Actor210: proc.scrin + Owner: Scrin + Location: 86,29 + Actor211: swal + Owner: Scrin + Location: 50,30 + Actor212: swal + Owner: Scrin + Location: 51,30 + Actor213: swal + Owner: Scrin + Location: 52,30 + Actor214: swal + Owner: Scrin + Location: 53,30 + Actor215: swal + Owner: Scrin + Location: 54,30 + Actor216: swal + Owner: Scrin + Location: 55,30 + Actor217: enli + Owner: CyborgSlaves + SubCell: 1 + Facing: 512 + Location: 58,30 + Actor218: enli + Owner: CyborgSlaves + SubCell: 4 + Facing: 512 + Location: 58,30 + Actor219: enli + Owner: CyborgSlaves + SubCell: 2 + Facing: 512 + Location: 58,30 + Actor220: enli + Owner: CyborgSlaves + SubCell: 5 + Facing: 512 + Location: 58,30 + Actor221: swal + Owner: Scrin + Location: 60,30 + Actor222: swal + Owner: Scrin + Location: 61,30 + Actor223: shar + Owner: Scrin + Location: 62,30 + Actor224: shar + Owner: Scrin + Location: 70,30 + TurretFacing: 713 + Actor225: swal + Owner: Scrin + Location: 71,30 + Actor226: swal + Owner: Scrin + Location: 72,30 + Actor227: swal + Owner: Scrin + Location: 78,30 + Actor228: mani + Owner: Scrin + Location: 79,30 + Actor229: splitblue + Owner: Neutral + Location: 96,30 + Actor230: ptur + Owner: Scrin + Location: 36,31 + TurretFacing: 277 + Actor231: scol + Owner: Scrin + Location: 38,31 + Actor232: swal + Owner: Scrin + Location: 50,31 + Actor233: swal + Owner: Scrin + Location: 51,31 + Actor234: swal + Owner: Scrin + Location: 52,31 + Actor235: shar + Owner: Scrin + Location: 53,31 + Actor236: swal + Owner: Scrin + Location: 54,31 + Actor237: swal + Owner: Scrin + Location: 55,31 + Actor238: swal + Owner: Scrin + Location: 60,31 + Actor239: swal + Owner: Scrin + Location: 61,31 + Actor240: swal + Owner: Scrin + Location: 62,31 + Actor241: shar + Owner: Scrin + Location: 63,31 + TurretFacing: 412 + Actor242: rmbc + Owner: CyborgSlaves + SubCell: 1 + Facing: 512 + Location: 65,31 + Actor243: rmbc + Owner: CyborgSlaves + SubCell: 4 + Facing: 512 + Location: 65,31 + Actor244: rmbc + Owner: CyborgSlaves + SubCell: 2 + Facing: 512 + Location: 65,31 + Actor245: rmbc + Owner: CyborgSlaves + SubCell: 5 + Facing: 512 + Location: 65,31 + Actor246: rmbc + Owner: CyborgSlaves + SubCell: 1 + Facing: 512 + Location: 67,31 + Actor247: rmbc + Owner: CyborgSlaves + SubCell: 4 + Facing: 512 + Location: 67,31 + Actor248: rmbc + Owner: CyborgSlaves + SubCell: 2 + Facing: 512 + Location: 67,31 + Actor249: rmbc + Owner: CyborgSlaves + SubCell: 5 + Facing: 512 + Location: 67,31 + Actor250: shar + Owner: Scrin + Location: 69,31 + TurretFacing: 547 + Actor251: swal + Owner: Scrin + Location: 70,31 + Actor252: swal + Owner: Scrin + Location: 71,31 + Actor253: swal + Owner: Scrin + Location: 72,31 + Actor254: swal + Owner: Scrin + Location: 78,31 + Actor255: swal + Owner: Scrin + Location: 42,32 + Actor256: swal + Owner: Scrin + Location: 43,32 + Actor257: swal + Owner: Scrin + Location: 44,32 + Actor258: swal + Owner: Scrin + Location: 55,32 + Actor259: swal + Owner: Scrin + Location: 61,32 + Actor260: swal + Owner: Scrin + Location: 62,32 + Actor261: swal + Owner: Scrin + Location: 63,32 + Actor262: swal + Owner: Scrin + Location: 64,32 + Actor263: swal + Owner: Scrin + Location: 65,32 + Actor264: swal + Owner: Scrin + Location: 67,32 + Actor265: swal + Owner: Scrin + Location: 68,32 + Actor266: swal + Owner: Scrin + Location: 69,32 + Actor267: swal + Owner: Scrin + Location: 70,32 + Actor268: swal + Owner: Scrin + Location: 71,32 + Actor269: swal + Owner: Scrin + Location: 77,32 + Actor270: swal + Owner: Scrin + Location: 78,32 + Actor271: scol + Owner: Scrin + Location: 90,32 + Actor272: swal + Owner: Scrin + Location: 42,33 + Actor273: scol + Owner: Scrin + Location: 43,33 + Actor274: swal + Owner: Scrin + Location: 44,33 + Actor276: swal + Owner: Scrin + Location: 55,33 + Actor277: swal + Owner: Scrin + Location: 62,33 + Actor278: swal + Owner: Scrin + Location: 63,33 + Actor279: scol + Owner: Scrin + Location: 64,33 + Actor280: swal + Owner: Scrin + Location: 65,33 + Actor281: swal + Owner: Scrin + Location: 67,33 + Actor282: scol + Owner: Scrin + Location: 68,33 + Actor283: swal + Owner: Scrin + Location: 69,33 + Actor284: swal + Owner: Scrin + Location: 70,33 + Actor285: rmbc + Owner: CyborgSlaves + SubCell: 1 + Facing: 512 + Location: 74,33 + Actor286: rmbc + Owner: CyborgSlaves + SubCell: 4 + Facing: 512 + Location: 74,33 + Actor287: rmbc + Owner: CyborgSlaves + SubCell: 2 + Facing: 512 + Location: 74,33 + Actor288: rmbc + Owner: CyborgSlaves + SubCell: 5 + Facing: 512 + Location: 74,33 + Actor289: swal + Owner: Scrin + Location: 77,33 + Actor290: swal + Owner: Scrin + Location: 42,34 + Actor291: swal + Owner: Scrin + Location: 43,34 + Actor292: swal + Owner: Scrin + Location: 44,34 + Actor294: swal + Owner: Scrin + Location: 55,34 + Actor295: rmbc + Owner: CyborgSlaves + SubCell: 1 + Facing: 512 + Location: 59,34 + Actor296: rmbc + Owner: CyborgSlaves + SubCell: 4 + Facing: 512 + Location: 59,34 + Actor297: rmbc + Owner: CyborgSlaves + SubCell: 2 + Facing: 512 + Location: 59,34 + Actor298: rmbc + Owner: CyborgSlaves + SubCell: 5 + Facing: 512 + Location: 59,34 + Actor299: swal + Owner: Scrin + Location: 65,34 + Actor300: swal + Owner: Scrin + Location: 67,34 + Actor301: swal + Owner: Scrin + Location: 77,34 + Actor302: scol + Owner: Scrin + Location: 90,34 + Actor303: swal + Owner: Scrin + Location: 42,35 + Actor304: scol + Owner: Scrin + Location: 43,35 + Actor305: swal + Owner: Scrin + Location: 44,35 + Actor306: swal + Owner: Scrin + Location: 55,35 + Actor307: swal + Owner: Scrin + Location: 56,35 + Actor308: swal + Owner: Scrin + Location: 64,35 + Actor309: swal + Owner: Scrin + Location: 65,35 + Actor310: swal + Owner: Scrin + Location: 67,35 + Actor311: swal + Owner: Scrin + Location: 68,35 + Actor312: enli + Owner: CyborgSlaves + SubCell: 1 + Facing: 512 + Location: 70,35 + Actor313: enli + Owner: CyborgSlaves + SubCell: 4 + Facing: 512 + Location: 70,35 + Actor314: enli + Owner: CyborgSlaves + SubCell: 2 + Facing: 512 + Location: 70,35 + Actor315: enli + Owner: CyborgSlaves + SubCell: 5 + Facing: 512 + Location: 70,35 + Actor316: swal + Owner: Scrin + Location: 76,35 + Actor317: swal + Owner: Scrin + Location: 77,35 + Actor319: swal + Owner: Scrin + Location: 42,36 + Actor320: swal + Owner: Scrin + Location: 43,36 + Actor321: swal + Owner: Scrin + Location: 44,36 + Actor322: swal + Owner: Scrin + Location: 56,36 + Actor323: enli + Owner: CyborgSlaves + SubCell: 1 + Facing: 512 + Location: 61,36 + Actor324: enli + Owner: CyborgSlaves + SubCell: 4 + Facing: 512 + Location: 61,36 + Actor325: enli + Owner: CyborgSlaves + SubCell: 2 + Facing: 512 + Location: 61,36 + Actor326: enli + Owner: CyborgSlaves + SubCell: 5 + Facing: 512 + Location: 61,36 + Actor327: swal + Owner: Scrin + Location: 64,36 + Actor328: swal + Owner: Scrin + Location: 65,36 + Actor329: swal + Owner: Scrin + Location: 67,36 + Actor330: swal + Owner: Scrin + Location: 68,36 + Actor331: swal + Owner: Scrin + Location: 74,36 + Actor332: swal + Owner: Scrin + Location: 75,36 + SignalTransmitter: sign + Owner: SignalTransmitterPlayer + Location: 75,36 + Actor334: swal + Owner: Scrin + Location: 76,36 + Actor335: swal + Owner: Scrin + Location: 86,36 + Actor336: swal + Owner: Scrin + Location: 87,36 + Actor337: swal + Owner: Scrin + Location: 88,36 + Actor338: ptur + Owner: Scrin + Location: 93,36 + TurretFacing: 658 + Actor339: ptur + Owner: Scrin + Location: 36,37 + TurretFacing: 388 + Actor340: scol + Owner: Scrin + Location: 38,37 + Actor341: swal + Owner: Scrin + Location: 56,37 + Actor342: swal + Owner: Scrin + Location: 57,37 + Actor343: swal + Owner: Scrin + Location: 58,37 + Actor344: ptur + Owner: Scrin + Location: 64,37 + TurretFacing: 428 + Actor345: ptur + Owner: Scrin + Location: 68,37 + TurretFacing: 594 + Actor346: swal + Owner: Scrin + Location: 74,37 + Actor347: swal + Owner: Scrin + Location: 86,37 + Actor348: scol + Owner: Scrin + Location: 87,37 + Actor349: swal + Owner: Scrin + Location: 88,37 + Actor350: scrt + Owner: Scrin + Location: 56,38 + Actor351: swal + Owner: Scrin + Location: 58,38 + Actor352: swal + Owner: Scrin + Location: 74,38 + Actor353: swal + Owner: Scrin + Location: 86,38 + Actor354: swal + Owner: Scrin + Location: 87,38 + Actor355: swal + Owner: Scrin + Location: 88,38 + Actor356: scol + Owner: Scrin + Location: 38,39 + Actor358: swal + Owner: Scrin + Location: 58,39 + Actor367: swal + Owner: Scrin + Location: 74,39 + Actor368: swal + Owner: Scrin + Location: 75,39 + Actor369: swal + Owner: Scrin + Location: 86,39 + Actor370: scol + Owner: Scrin + Location: 87,39 + Actor371: swal + Owner: Scrin + Location: 88,39 + Actor372: swal + Owner: Scrin + Location: 58,40 + Actor381: swal + Owner: Scrin + Location: 74,40 + Actor382: swal + Owner: Scrin + Location: 75,40 + Actor384: swal + Owner: Scrin + Location: 86,40 + Actor385: swal + Owner: Scrin + Location: 87,40 + Actor386: swal + Owner: Scrin + Location: 88,40 + Actor387: ptur + Owner: Scrin + Location: 93,40 + TurretFacing: 721 + Actor388: swal + Owner: Scrin + Location: 58,41 + Actor389: swal + Owner: Scrin + Location: 59,41 + Actor390: sfac + Owner: Scrin + Location: 66,41 + Actor391: scol + Owner: Scrin + Location: 90,41 + Actor392: shar + Owner: Scrin + Location: 41,42 + Actor393: swal + Owner: Scrin + Location: 58,42 + Actor394: swal + Owner: Scrin + Location: 59,42 + Actor395: grav + Owner: Scrin + Location: 73,42 + Actor397: scol + Owner: Scrin + Location: 45,43 + Actor399: scol + Owner: Scrin + Location: 90,43 + Actor402: shar + Owner: Scrin + Location: 46,46 + Actor403: nerv + Owner: Scrin + Location: 68,46 + Actor406: shar + Owner: Scrin + Location: 89,47 + TurretFacing: 404 + Actor407: scol + Owner: Scrin + Location: 81,50 + Actor408: swal + Owner: Scrin + Location: 65,51 + Actor409: swal + Owner: Scrin + Location: 66,51 + Actor410: swal + Owner: Scrin + Location: 67,51 + Actor411: swal + Owner: Scrin + Location: 68,51 + Actor412: swal + Owner: Scrin + Location: 69,51 + Actor413: shar + Owner: Scrin + Location: 85,51 + TurretFacing: 507 + Actor414: shar + Owner: Scrin + Location: 49,52 + Actor415: swal + Owner: Scrin + Location: 65,52 + Actor416: scol + Owner: Scrin + Location: 66,52 + Actor417: swal + Owner: Scrin + Location: 67,52 + Actor418: scol + Owner: Scrin + Location: 68,52 + Actor419: swal + Owner: Scrin + Location: 69,52 + Actor420: scol + Owner: Scrin + Location: 53,53 + Actor421: shar + Owner: Scrin + Location: 57,53 + TurretFacing: 333 + Actor422: swal + Owner: Scrin + Location: 65,53 + Actor423: swal + Owner: Scrin + Location: 66,53 + Actor424: swal + Owner: Scrin + Location: 67,53 + Actor425: swal + Owner: Scrin + Location: 68,53 + Actor426: swal + Owner: Scrin + Location: 69,53 + Actor427: shar + Owner: Scrin + Location: 76,53 + Actor428: scol + Owner: Scrin + Location: 62,56 + Actor429: scol + Owner: Scrin + Location: 64,56 + Actor430: scol + Owner: Scrin + Location: 70,56 + Actor431: scol + Owner: Scrin + Location: 72,56 + Actor432: ptur + Owner: Scrin + Location: 65,58 + TurretFacing: 555 + Actor433: ptur + Owner: Scrin + Location: 69,58 + TurretFacing: 602 + Actor436: brik + Owner: AlliedSlaves + Location: 81,93 + Actor437: brik + Owner: AlliedSlaves + Location: 79,93 + Actor439: brik + Owner: AlliedSlaves + Location: 80,93 + Actor440: brik + Owner: AlliedSlaves + Location: 79,94 + Actor441: brik + Owner: AlliedSlaves + Location: 78,94 + Actor443: brik + Owner: AlliedSlaves + Location: 82,93 + Actor444: brik + Owner: AlliedSlaves + Location: 82,92 + Actor445: brik + Owner: AlliedSlaves + Location: 83,92 + Actor446: brik + Owner: AlliedSlaves + Location: 83,91 + Actor447: brik + Owner: AlliedSlaves + Location: 83,90 + Actor448: brik + Owner: AlliedSlaves + Location: 83,89 + Actor449: brik + Owner: AlliedSlaves + Location: 83,88 + Actor450: brik + Owner: AlliedSlaves + Location: 84,88 + Actor451: brik + Owner: AlliedSlaves + Location: 84,87 + Actor452: brik + Owner: AlliedSlaves + Location: 84,86 + Actor453: brik + Owner: AlliedSlaves + Location: 84,85 + Actor454: brik + Owner: AlliedSlaves + Location: 84,84 + Actor455: brik + Owner: AlliedSlaves + Location: 84,83 + Actor456: brik + Owner: AlliedSlaves + Location: 84,82 + Actor457: brik + Owner: AlliedSlaves + Location: 84,80 + Actor458: brik + Owner: AlliedSlaves + Location: 84,81 + Actor459: brik + Owner: AlliedSlaves + Location: 84,79 + Actor460: brik + Owner: AlliedSlaves + Location: 83,79 + Actor461: brik + Owner: AlliedSlaves + Location: 82,79 + Actor462: brik + Owner: AlliedSlaves + Location: 80,79 + Actor463: brik + Owner: AlliedSlaves + Location: 81,79 + Actor464: brik + Owner: AlliedSlaves + Location: 79,79 + Actor465: brik + Owner: AlliedSlaves + Location: 78,79 + Actor466: brik + Owner: AlliedSlaves + Location: 77,79 + Actor467: brik + Owner: AlliedSlaves + Location: 76,79 + Actor468: brik + Owner: AlliedSlaves + Location: 76,80 + Actor469: brik + Owner: AlliedSlaves + Location: 77,80 + Actor470: brik + Owner: AlliedSlaves + Location: 72,79 + Actor471: brik + Owner: AlliedSlaves + Location: 72,80 + Actor472: brik + Owner: AlliedSlaves + Location: 71,79 + Actor473: brik + Owner: AlliedSlaves + Location: 71,80 + Actor474: brik + Owner: AlliedSlaves + Location: 70,79 + Actor475: brik + Owner: AlliedSlaves + Location: 69,79 + Actor476: brik + Owner: AlliedSlaves + Location: 68,79 + Actor477: brik + Owner: AlliedSlaves + Location: 66,79 + Actor478: brik + Owner: AlliedSlaves + Location: 67,79 + Actor479: brik + Owner: AlliedSlaves + Location: 65,79 + Actor480: brik + Owner: AlliedSlaves + Location: 64,79 + Actor481: brik + Owner: AlliedSlaves + Location: 64,80 + Actor482: brik + Owner: AlliedSlaves + Location: 64,81 + Actor483: brik + Owner: AlliedSlaves + Location: 64,82 + Actor484: brik + Owner: AlliedSlaves + Location: 64,83 + Actor485: brik + Owner: AlliedSlaves + Location: 64,84 + Actor486: brik + Owner: AlliedSlaves + Location: 64,85 + Actor490: brik + Owner: AlliedSlaves + Location: 64,89 + Actor491: brik + Owner: AlliedSlaves + Location: 64,90 + Actor492: brik + Owner: AlliedSlaves + Location: 64,91 + Actor493: brik + Owner: AlliedSlaves + Location: 64,92 + Actor494: brik + Owner: AlliedSlaves + Location: 64,94 + Actor495: brik + Owner: AlliedSlaves + Location: 64,93 + Actor496: brik + Owner: AlliedSlaves + Location: 65,94 + Actor497: brik + Owner: AlliedSlaves + Location: 67,94 + Actor498: brik + Owner: AlliedSlaves + Location: 66,94 + Actor499: brik + Owner: AlliedSlaves + Location: 68,94 + Actor500: brik + Owner: AlliedSlaves + Location: 69,94 + Actor501: brik + Owner: AlliedSlaves + Location: 70,94 + Actor502: brik + Owner: AlliedSlaves + Location: 71,94 + Actor503: brik + Owner: AlliedSlaves + Location: 72,93 + Actor504: brik + Owner: AlliedSlaves + Location: 72,94 + Actor505: brik + Owner: AlliedSlaves + Location: 71,93 + Actor506: brik + Owner: AlliedSlaves + Location: 76,93 + Actor507: brik + Owner: AlliedSlaves + Location: 76,94 + Actor508: brik + Owner: AlliedSlaves + Location: 77,93 + Actor509: brik + Owner: AlliedSlaves + Location: 77,94 + Actor510: brik + Owner: AlliedSlaves + Location: 65,93 + Actor511: brik + Owner: AlliedSlaves + Location: 65,80 + Actor512: brik + Owner: AlliedSlaves + Location: 83,80 + Actor513: fact + Owner: AlliedSlaves + Location: 80,80 + Actor514: apwr + Owner: AlliedSlaves + Location: 81,85 + Actor515: apwr + Owner: AlliedSlaves + Location: 80,88 + Actor516: apwr + Owner: AlliedSlaves + Location: 78,85 + Actor522: fix + Owner: AlliedSlaves + Location: 76,88 + Actor523: gap + Owner: AlliedSlaves + Location: 76,86 + Actor524: pris + Owner: AlliedSlaves + Location: 70,80 + Actor525: pris + Owner: AlliedSlaves + Location: 78,80 + Actor526: pris + Owner: AlliedSlaves + Location: 70,93 + Actor527: pris + Owner: AlliedSlaves + Location: 78,93 + Actor528: htur + Owner: AlliedSlaves + Location: 83,98 + TurretFacing: 396 + Actor529: agun + Owner: AlliedSlaves + Location: 65,92 + HardNormalAA1: agun + Owner: AlliedSlaves + Location: 65,81 + TurretFacing: 832 + Actor531: atek + Owner: AlliedSlaves + Location: 67,80 + Actor534: dome + Owner: AlliedSlaves + Location: 66,84 + Actor535: agun + Owner: AlliedSlaves + Location: 81,92 + Actor530: agun + Owner: AlliedSlaves + Location: 78,82 + Actor536: pbox + Owner: AlliedSlaves + Location: 72,95 + Actor537: pbox + Owner: AlliedSlaves + Location: 76,95 + Actor538: pbox + Owner: AlliedSlaves + Location: 72,78 + Actor539: pbox + Owner: AlliedSlaves + Location: 76,78 + Actor655: brik + Owner: NodSlaves + Location: 117,53 + Actor656: brik + Owner: NodSlaves + Location: 118,53 + Actor657: brik + Owner: NodSlaves + Location: 119,53 + Actor658: brik + Owner: NodSlaves + Location: 120,53 + Actor659: brik + Owner: NodSlaves + Location: 121,53 + Actor660: brik + Owner: NodSlaves + Location: 122,53 + Actor661: brik + Owner: NodSlaves + Location: 123,53 + Actor662: brik + Owner: NodSlaves + Location: 124,53 + Actor663: brik + Owner: NodSlaves + Location: 125,53 + Actor664: brik + Owner: NodSlaves + Location: 126,53 + Actor665: brik + Owner: NodSlaves + Location: 127,53 + Actor666: brik + Owner: NodSlaves + Location: 128,53 + Actor667: brik + Owner: NodSlaves + Location: 129,53 + Actor668: brik + Owner: NodSlaves + Location: 130,53 + Actor669: brik + Owner: NodSlaves + Location: 131,53 + Actor670: brik + Owner: NodSlaves + Location: 132,53 + Actor671: brik + Owner: NodSlaves + Location: 117,54 + Actor672: brik + Owner: NodSlaves + Location: 118,54 + Actor673: afac + Owner: NodSlaves + Location: 120,54 + Actor674: nuk2 + Owner: NodSlaves + Location: 124,54 + Actor675: nuk2 + Owner: NodSlaves + Location: 126,54 + Actor676: nuk2 + Owner: NodSlaves + Location: 128,54 + Actor677: nuk2 + Owner: NodSlaves + Location: 130,54 + Actor678: brik + Owner: NodSlaves + Location: 132,54 + Actor679: brik + Owner: NodSlaves + Location: 132,55 + Actor680: brik + Owner: NodSlaves + Location: 132,56 + Actor681: brik + Owner: NodSlaves + Location: 132,57 + Actor682: ltur + Owner: NodSlaves + Location: 110,58 + Actor683: brik + Owner: NodSlaves + Location: 111,58 + Actor684: brik + Owner: NodSlaves + Location: 112,58 + Actor685: proc.td + Owner: NodSlaves + Location: 114,58 + Actor686: tmpl + Owner: NodSlaves + Location: 119,58 + Actor687: hpad.td + Owner: NodSlaves + Location: 123,58 + Actor688: brik + Owner: NodSlaves + Location: 132,58 + Actor689: brik + Owner: NodSlaves + Location: 111,59 + Actor690: brik + Owner: NodSlaves + Location: 112,59 + Actor691: tmpp + Owner: NodSlaves + Location: 127,59 + Actor692: brik + Owner: NodSlaves + Location: 132,59 + Actor693: brik + Owner: NodSlaves + Location: 111,60 + Actor694: brik + Owner: NodSlaves + Location: 132,60 + Actor695: brik + Owner: NodSlaves + Location: 111,61 + Actor696: brik + Owner: NodSlaves + Location: 132,61 + Actor697: brik + Owner: NodSlaves + Location: 111,62 + Actor698: brik + Owner: NodSlaves + Location: 132,62 + Actor699: brik + Owner: NodSlaves + Location: 111,63 + Actor700: hand + Owner: NodSlaves + Location: 117,63 + Actor701: airs + Owner: NodSlaves + Location: 126,63 + Actor702: brik + Owner: NodSlaves + Location: 132,63 + Actor703: brik + Owner: NodSlaves + Location: 111,64 + Actor704: hq + Owner: NodSlaves + Location: 114,64 + Actor705: brik + Owner: NodSlaves + Location: 132,64 + Actor706: brik + Owner: NodSlaves + Location: 111,65 + Actor707: brik + Owner: NodSlaves + Location: 132,65 + Actor708: brik + Owner: NodSlaves + Location: 111,66 + Actor709: obli + Owner: NodSlaves + Location: 112,66 + Actor710: brik + Owner: NodSlaves + Location: 132,66 + Actor711: brik + Owner: NodSlaves + Location: 111,67 + Actor712: brik + Owner: NodSlaves + Location: 112,67 + Actor713: brik + Owner: NodSlaves + Location: 113,67 + Actor714: brik + Owner: NodSlaves + Location: 114,67 + Actor715: brik + Owner: NodSlaves + Location: 115,67 + Actor716: brik + Owner: NodSlaves + Location: 127,67 + Actor717: brik + Owner: NodSlaves + Location: 128,67 + Actor718: brik + Owner: NodSlaves + Location: 129,67 + Actor719: brik + Owner: NodSlaves + Location: 130,67 + Actor720: brik + Owner: NodSlaves + Location: 131,67 + Actor721: brik + Owner: NodSlaves + Location: 132,67 + Actor722: brik + Owner: NodSlaves + Location: 115,68 + Actor723: brik + Owner: NodSlaves + Location: 116,68 + Actor724: obli + Owner: NodSlaves + Location: 117,68 + Actor725: brik + Owner: NodSlaves + Location: 118,68 + Actor726: brik + Owner: NodSlaves + Location: 119,68 + Actor727: brik + Owner: NodSlaves + Location: 123,68 + Actor728: brik + Owner: NodSlaves + Location: 124,68 + Actor729: obli + Owner: NodSlaves + Location: 125,68 + Actor730: brik + Owner: NodSlaves + Location: 126,68 + Actor731: brik + Owner: NodSlaves + Location: 127,68 + Actor732: brik + Owner: NodSlaves + Location: 115,69 + Actor733: brik + Owner: NodSlaves + Location: 116,69 + Actor734: brik + Owner: NodSlaves + Location: 117,69 + Actor735: brik + Owner: NodSlaves + Location: 118,69 + Actor736: brik + Owner: NodSlaves + Location: 119,69 + Actor737: brik + Owner: NodSlaves + Location: 123,69 + Actor738: brik + Owner: NodSlaves + Location: 124,69 + Actor739: brik + Owner: NodSlaves + Location: 125,69 + Actor740: brik + Owner: NodSlaves + Location: 126,69 + Actor741: brik + Owner: NodSlaves + Location: 127,69 + Actor742: ltur + Owner: NodSlaves + TurretFacing: 483 + Location: 119,70 + Actor743: ltur + Owner: NodSlaves + TurretFacing: 467 + Location: 123,70 + Actor744: brik + Owner: SovietSlaves + Location: 4,60 + Actor745: brik + Owner: SovietSlaves + Location: 5,60 + Actor746: brik + Owner: SovietSlaves + Location: 6,60 + Actor747: brik + Owner: SovietSlaves + Location: 7,60 + Actor748: brik + Owner: SovietSlaves + Location: 8,60 + Actor749: brik + Owner: SovietSlaves + Location: 9,60 + Actor750: brik + Owner: SovietSlaves + Location: 10,60 + Actor751: brik + Owner: SovietSlaves + Location: 11,60 + Actor752: brik + Owner: SovietSlaves + Location: 12,60 + Actor753: brik + Owner: SovietSlaves + Location: 13,60 + Actor754: brik + Owner: SovietSlaves + Location: 14,60 + Actor755: brik + Owner: SovietSlaves + Location: 15,60 + Actor756: brik + Owner: SovietSlaves + Location: 16,60 + Actor757: brik + Owner: SovietSlaves + Location: 17,60 + Actor758: brik + Owner: SovietSlaves + Location: 4,61 + Actor759: apwr + Owner: SovietSlaves + Location: 5,61 + Actor760: apwr + Owner: SovietSlaves + Location: 8,61 + Actor761: apwr + Owner: SovietSlaves + Location: 11,61 + Actor762: sam + Owner: SovietSlaves + Location: 14,61 + Actor763: brik + Owner: SovietSlaves + Location: 16,61 + Actor764: brik + Owner: SovietSlaves + Location: 17,61 + Actor765: ftur + Owner: SovietSlaves + Location: 18,61 + Actor766: brik + Owner: SovietSlaves + Location: 1,62 + Actor767: brik + Owner: SovietSlaves + Location: 2,62 + Actor768: brik + Owner: SovietSlaves + Location: 3,62 + Actor769: brik + Owner: SovietSlaves + Location: 4,62 + Actor770: tsla + Owner: SovietSlaves + Location: 16,62 + Actor771: brik + Owner: SovietSlaves + Location: 1,63 + Actor772: fact + Owner: SovietSlaves + Location: 2,63 + Actor773: brik + Owner: SovietSlaves + Location: 1,64 + Actor774: apwr + Owner: SovietSlaves + Location: 5,64 + Actor775: apwr + Owner: SovietSlaves + Location: 8,64 + Actor777: brik + Owner: SovietSlaves + Location: 1,65 + Actor778: brik + Owner: SovietSlaves + Location: 1,66 + Actor779: brik + Owner: SovietSlaves + Location: 1,67 + Actor780: brik + Owner: SovietSlaves + Location: 19,67 + Actor781: brik + Owner: SovietSlaves + Location: 20,67 + Actor782: ftur + Owner: SovietSlaves + Location: 21,67 + Actor783: brik + Owner: SovietSlaves + Location: 1,68 + Actor784: stek + Owner: SovietSlaves + Location: 2,68 + Actor786: brik + Owner: SovietSlaves + Location: 19,68 + Actor787: brik + Owner: SovietSlaves + Location: 20,68 + Actor788: brik + Owner: SovietSlaves + Location: 1,69 + Actor789: tsla + Owner: SovietSlaves + Location: 19,69 + Actor790: brik + Owner: SovietSlaves + Location: 20,69 + Actor791: brik + Owner: SovietSlaves + Location: 1,70 + Actor794: brik + Owner: SovietSlaves + Location: 20,70 + Actor795: brik + Owner: SovietSlaves + Location: 1,71 + Actor796: barr + Owner: SovietSlaves + Location: 12,71 + Actor797: brik + Owner: SovietSlaves + Location: 20,71 + Actor798: brik + Owner: SovietSlaves + Location: 1,72 + Actor799: dome + Owner: SovietSlaves + Location: 2,72 + Actor801: brik + Owner: SovietSlaves + Location: 1,73 + Actor803: brik + Owner: SovietSlaves + Location: 1,74 + Actor804: afld + Owner: SovietSlaves + Location: 15,74 + Actor805: brik + Owner: SovietSlaves + Location: 20,74 + Actor806: brik + Owner: SovietSlaves + Location: 1,75 + Actor807: brik + Owner: SovietSlaves + Location: 20,75 + Actor808: brik + Owner: SovietSlaves + Location: 1,76 + Actor809: brik + Owner: SovietSlaves + Location: 2,76 + Actor810: tsla + Owner: SovietSlaves + Location: 4,76 + Actor811: brik + Owner: SovietSlaves + Location: 5,76 + Actor812: brik + Owner: SovietSlaves + Location: 6,76 + Actor813: brik + Owner: SovietSlaves + Location: 10,76 + Actor814: brik + Owner: SovietSlaves + Location: 11,76 + Actor815: tsla + Owner: SovietSlaves + Location: 12,76 + Actor816: tsla + Owner: SovietSlaves + Location: 19,76 + Actor817: brik + Owner: SovietSlaves + Location: 20,76 + Actor818: brik + Owner: SovietSlaves + Location: 1,77 + Actor819: brik + Owner: SovietSlaves + Location: 2,77 + Actor820: brik + Owner: SovietSlaves + Location: 3,77 + Actor821: brik + Owner: SovietSlaves + Location: 4,77 + Actor822: brik + Owner: SovietSlaves + Location: 5,77 + Actor823: brik + Owner: SovietSlaves + Location: 6,77 + Actor824: brik + Owner: SovietSlaves + Location: 10,77 + Actor825: brik + Owner: SovietSlaves + Location: 11,77 + Actor826: brik + Owner: SovietSlaves + Location: 12,77 + Actor827: brik + Owner: SovietSlaves + Location: 13,77 + Actor828: brik + Owner: SovietSlaves + Location: 14,77 + Actor829: brik + Owner: SovietSlaves + Location: 15,77 + Actor830: brik + Owner: SovietSlaves + Location: 16,77 + Actor831: brik + Owner: SovietSlaves + Location: 17,77 + Actor832: brik + Owner: SovietSlaves + Location: 18,77 + Actor833: brik + Owner: SovietSlaves + Location: 19,77 + Actor834: brik + Owner: SovietSlaves + Location: 20,77 + Actor835: ftur + Owner: SovietSlaves + Location: 6,78 + Actor836: ftur + Owner: SovietSlaves + Location: 10,78 + Actor840: rep + Owner: NodSlaves + Location: 121,62 + Actor841: htnk.ion + Owner: GDI + Facing: 0 + Location: 68,120 + Actor842: htnk.ion + Owner: GDI + Facing: 0 + Location: 74,120 + PlayerStart: waypoint + Owner: Neutral + Location: 71,122 + Actor837: sbag + Owner: GDI + Location: 65,116 + Actor838: sbag + Owner: GDI + Location: 65,115 + Actor839: sbag + Owner: GDI + Location: 66,115 + Actor844: sbag + Owner: GDI + Location: 67,115 + Actor845: sbag + Owner: GDI + Location: 68,115 + Actor846: sbag + Owner: GDI + Location: 68,116 + Actor847: sbag + Owner: GDI + Location: 77,115 + Actor848: sbag + Owner: GDI + Location: 77,114 + Actor849: sbag + Owner: GDI + Location: 78,114 + Actor850: sbag + Owner: GDI + Location: 79,114 + Actor851: sbag + Owner: GDI + Location: 80,114 + Actor852: sbag + Owner: GDI + Location: 80,115 + Actor853: sbag + Owner: GDI + Location: 88,118 + Actor854: sbag + Owner: GDI + Location: 88,117 + Actor855: sbag + Owner: GDI + Location: 89,117 + Actor856: sbag + Owner: GDI + Location: 90,117 + Actor857: sbag + Owner: GDI + Location: 91,117 + Actor858: sbag + Owner: GDI + Location: 91,118 + Actor859: sbag + Owner: GDI + Location: 57,118 + Actor860: sbag + Owner: GDI + Location: 57,117 + Actor861: sbag + Owner: GDI + Location: 58,117 + Actor862: sbag + Owner: GDI + Location: 59,117 + Actor863: sbag + Owner: GDI + Location: 60,117 + Actor864: sbag + Owner: GDI + Location: 60,118 + Actor865: afac + Owner: GDI + Location: 71,127 + Actor866: pyle + Owner: GDI + Location: 76,121 + Actor867: gtwr + Owner: GDI + Location: 70,114 + Actor868: gtwr + Owner: GDI + Location: 75,114 + Actor869: nuke + Owner: GDI + Location: 68,126 + Actor870: nuke + Owner: GDI + Location: 77,125 + Actor873: msam + Owner: GDI + Location: 78,115 + Facing: 0 + Actor874: msam + Owner: GDI + Location: 67,116 + Facing: 0 + Actor875: msam + Owner: GDI + Location: 89,118 + Facing: 0 + Actor876: msam + Owner: GDI + Location: 59,118 + Facing: 0 + Actor877: mtnk + Owner: GDI + Facing: 0 + Location: 66,114 + Actor871: mtnk + Owner: GDI + Facing: 0 + Location: 79,113 + Actor872: n3 + Owner: GDI + Location: 66,116 + SubCell: 3 + Facing: 0 + Actor878: n3 + Owner: GDI + SubCell: 3 + Location: 58,118 + Facing: 0 + Actor879: n3 + Owner: GDI + Location: 79,115 + SubCell: 3 + Facing: 0 + Actor880: n3 + Owner: GDI + Location: 90,118 + SubCell: 3 + Facing: 0 + Actor881: n1 + Owner: GDI + SubCell: 3 + Location: 59,116 + Facing: 0 + Actor882: n1 + Owner: GDI + Location: 61,117 + SubCell: 3 + Facing: 0 + Actor883: n1 + Owner: GDI + Location: 65,114 + SubCell: 3 + Facing: 0 + Actor884: n1 + Owner: GDI + SubCell: 3 + Location: 70,115 + Facing: 0 + Actor885: n1 + Owner: GDI + SubCell: 3 + Location: 77,113 + Facing: 0 + Actor886: n1 + Owner: GDI + SubCell: 3 + Location: 82,115 + Facing: 103 + Actor887: n1 + Owner: GDI + Location: 88,116 + SubCell: 3 + Facing: 0 + Actor888: n1 + Owner: GDI + Location: 92,117 + SubCell: 3 + Facing: 0 + Actor889: split2 + Owner: Neutral + Location: 49,130 + Actor890: split2 + Owner: Neutral + Location: 55,129 + Actor891: proc.td + Owner: GDI + Location: 60,125 + Actor892: split2 + Owner: Neutral + Location: 44,93 + Actor893: split2 + Owner: Neutral + Location: 49,95 + Actor895: htur + Owner: AlliedSlaves + Location: 55,102 + TurretFacing: 642 + Actor894: split2 + Owner: Neutral + Location: 93,95 + Actor896: split2 + Owner: Neutral + Location: 95,91 + NodMastermind: mast + Owner: Scrin + SubCell: 3 + Location: 130,58 + Facing: 384 + AlliedMastermind: mast + Owner: Scrin + SubCell: 3 + Location: 67,83 + Facing: 650 + SovietMastermind: mast + Owner: Scrin + SubCell: 3 + Location: 2,71 + Facing: 634 + Actor900: split2 + Owner: Neutral + Location: 119,49 + Actor901: split2 + Owner: Neutral + Location: 127,49 + Actor902: split2 + Owner: Neutral + Location: 8,57 + Actor903: split2 + Owner: Neutral + Location: 13,56 + Actor1006: t17.husk + Owner: Neutral + Faction: germany + Location: 78,101 + Actor1007: tc04.husk + Owner: Neutral + Faction: germany + Location: 84,105 + Actor1008: tc01.husk + Owner: Neutral + Faction: germany + Location: 70,106 + Actor1009: t17.husk + Owner: Neutral + Faction: germany + Location: 61,103 + Actor1010: t16.husk + Owner: Neutral + Faction: germany + Location: 59,91 + Actor1011: tc03.husk + Owner: Neutral + Faction: germany + Location: 59,99 + Actor1012: t14.husk + Owner: Neutral + Faction: germany + Location: 59,104 + Actor1013: t15.husk + Owner: Neutral + Faction: germany + Location: 84,108 + Actor1014: t13.husk + Owner: Neutral + Faction: germany + Location: 82,107 + Actor1015: t13.husk + Owner: Neutral + Faction: germany + Location: 95,106 + Actor1016: tc02.husk + Owner: Neutral + Faction: germany + Location: 89,108 + Actor1017: t17.husk + Owner: Neutral + Faction: germany + Location: 97,103 + Actor1018: t14.husk + Owner: Neutral + Faction: germany + Location: 104,101 + Actor1019: t16.husk + Owner: Neutral + Faction: germany + Location: 106,101 + Actor1020: t10.husk + Owner: Neutral + Faction: germany + Location: 102,90 + Actor1021: tc04.husk + Owner: Neutral + Faction: germany + Location: 50,109 + Actor1022: t15.husk + Owner: Neutral + Faction: germany + Location: 53,110 + Actor1023: t12.husk + Owner: Neutral + Faction: germany + Location: 46,106 + Actor1024: t03.husk + Owner: Neutral + Faction: germany + Location: 41,104 + Actor1025: t11.husk + Owner: Neutral + Faction: germany + Location: 43,54 + Actor1026: t13.husk + Owner: Neutral + Faction: germany + Location: 41,65 + Actor1027: tc01.husk + Owner: Neutral + Faction: germany + Location: 43,69 + Actor1028: t16.husk + Owner: Neutral + Faction: germany + Location: 47,57 + Actor1029: t08.husk + Owner: Neutral + Faction: germany + Location: 46,67 + Actor1030: t16.husk + Owner: Neutral + Faction: germany + Location: 47,66 + Actor1031: tc02.husk + Owner: Neutral + Faction: germany + Location: 39,75 + Actor1032: t14.husk + Owner: Neutral + Faction: germany + Location: 39,73 + Actor1033: t05.husk + Owner: Neutral + Faction: germany + Location: 46,69 + Actor1034: t03.husk + Owner: Neutral + Faction: germany + Location: 46,59 + Actor1035: t07.husk + Owner: Neutral + Faction: germany + Location: 91,53 + Actor1036: t10.husk + Owner: Neutral + Faction: germany + Location: 90,64 + Actor1037: t15.husk + Owner: Neutral + Faction: germany + Location: 90,61 + Actor1038: t16.husk + Owner: Neutral + Faction: germany + Location: 90,78 + Actor1039: t15.husk + Owner: Neutral + Faction: germany + Location: 94,84 + Actor1040: t14.husk + Owner: Neutral + Faction: germany + Location: 92,81 + Actor1041: t15.husk + Owner: Neutral + Faction: germany + Location: 86,93 + Actor1042: t03.husk + Owner: Neutral + Faction: germany + Location: 86,91 + Actor1043: t05.husk + Owner: Neutral + Faction: germany + Location: 88,85 + Actor1044: t11.husk + Owner: Neutral + Faction: germany + Location: 87,81 + Actor1045: tc01.husk + Owner: Neutral + Faction: germany + Location: 89,82 + Actor1046: t08.husk + Owner: Neutral + Faction: germany + Location: 92,76 + Actor1047: t14.husk + Owner: Neutral + Faction: germany + Location: 91,65 + Actor1048: t16.husk + Owner: Neutral + Faction: germany + Location: 93,68 + Actor1049: t17.husk + Owner: Neutral + Faction: germany + Location: 93,63 + Actor1050: tc03.husk + Owner: Neutral + Faction: germany + Location: 92,67 + Actor1051: tc04.husk + Owner: Neutral + Faction: germany + Location: 31,94 + Actor1052: tc04 + Owner: Neutral + Faction: germany + Location: 42,115 + Actor1053: t02 + Owner: Neutral + Faction: germany + Location: 45,114 + Actor1054: t13 + Owner: Neutral + Faction: germany + Location: 39,116 + Actor1055: tc01 + Owner: Neutral + Faction: germany + Location: 34,120 + Actor1056: tc05 + Owner: Neutral + Faction: germany + Location: 34,116 + Actor1057: t05 + Owner: Neutral + Faction: germany + Location: 37,113 + Actor1058: t02 + Owner: Neutral + Faction: germany + Location: 31,114 + Actor1059: t03 + Owner: Neutral + Faction: germany + Location: 36,127 + Actor1060: tc01 + Owner: Neutral + Faction: germany + Location: 96,112 + Actor1061: t14 + Owner: Neutral + Faction: germany + Location: 100,115 + Actor1062: t13 + Owner: Neutral + Faction: germany + Location: 99,117 + Actor1063: t01 + Owner: Neutral + Faction: germany + Location: 98,115 + Actor1064: t16 + Owner: Neutral + Faction: germany + Location: 106,118 + Actor1065: ice01 + Owner: Neutral + Faction: germany + Location: 27,108 + Actor1066: tc02.husk + Owner: Neutral + Faction: germany + Location: 120,92 + Actor1067: t10.husk + Owner: Neutral + Faction: germany + Location: 125,94 + Actor1068: t06.husk + Owner: Neutral + Faction: germany + Location: 110,77 + Actor1069: t07.husk + Owner: Neutral + Faction: germany + Location: 97,73 + Actor1070: tc05.husk + Owner: Neutral + Faction: germany + Location: 95,56 + Actor1071: tc01.husk + Owner: Neutral + Faction: germany + Location: 97,46 + Actor1072: t06.husk + Owner: Neutral + Faction: germany + Location: 90,50 + Actor1073: t07.husk + Owner: Neutral + Faction: germany + Location: 42,46 + Actor1074: t03.husk + Owner: Neutral + Faction: germany + Location: 26,43 + Actor1075: tc05.husk + Owner: Neutral + Faction: germany + Location: 22,30 + Actor1076: t01.husk + Owner: Neutral + Faction: germany + Location: 23,28 + Actor1077: t15.husk + Owner: Neutral + Faction: germany + Location: 19,33 + Actor1078: tc02.husk + Owner: Neutral + Faction: germany + Location: 24,28 + Actor1079: t05.husk + Owner: Neutral + Faction: germany + Location: 18,35 + Actor1080: t08.husk + Owner: Neutral + Faction: germany + Location: 27,30 + Actor1081: splitblue + Owner: Neutral + Location: 41,10 + Actor1082: splitblue + Owner: Neutral + Location: 49,4 + Actor1083: splitblue + Owner: Neutral + Location: 61,3 + Actor1084: splitblue + Owner: Neutral + Location: 77,3 + Actor1085: splitblue + Owner: Neutral + Location: 91,15 + Actor1086: splitblue + Owner: Neutral + Location: 87,8 + Actor1087: tc04.husk + Owner: Neutral + Location: 102,8 + Actor1088: t15.husk + Owner: Neutral + Location: 97,4 + Actor1089: t07.husk + Owner: Neutral + Location: 101,2 + Actor1090: t10.husk + Owner: Neutral + Location: 90,1 + Actor1091: t10.husk + Owner: Neutral + Location: 99,6 + Actor1092: tc05.husk + Owner: Neutral + Location: 96,6 + Actor1093: t17.husk + Owner: Neutral + Location: 108,6 + Actor1094: t13.husk + Owner: Neutral + Location: 111,9 + Actor1095: t11.husk + Owner: Neutral + Location: 110,17 + Actor1098: t11.husk + Owner: Neutral + Location: 127,33 + Actor1099: tc05.husk + Owner: Neutral + Location: 122,38 + Actor1100: t17.husk + Owner: Neutral + Location: 120,37 + Actor1101: t12.husk + Owner: Neutral + Location: 109,31 + Actor1102: tc01.husk + Owner: Neutral + Location: 107,30 + Actor1103: t16.husk + Owner: Neutral + Location: 106,38 + Actor1104: t16.husk + Owner: Neutral + Location: 106,38 + Actor1105: t07.husk + Owner: Neutral + Location: 109,28 + Actor1106: t10.husk + Owner: Neutral + Location: 106,24 + Actor1108: t14.husk + Owner: Neutral + Location: 124,85 + Actor1109: t11.husk + Owner: Neutral + Location: 129,74 + Actor1110: t07.husk + Owner: Neutral + Location: 130,77 + Actor1111: tc04 + Owner: Neutral + Location: 120,126 + Actor1112: t13 + Owner: Neutral + Location: 123,123 + Actor1113: tc03 + Owner: Neutral + Location: 107,129 + Actor1114: tc04.husk + Owner: Neutral + Location: 114,108 + Actor1115: tc01.husk + Owner: Neutral + Location: 120,102 + Actor1116: tc02.husk + Owner: Neutral + Location: 110,98 + Actor1117: t17.husk + Owner: Neutral + Location: 109,96 + Actor1118: t03.husk + Owner: Neutral + Location: 115,83 + Actor1119: t07.husk + Owner: Neutral + Location: 97,80 + Actor1120: t15.husk + Owner: Neutral + Location: 129,104 + Actor1121: t16.husk + Owner: Neutral + Location: 131,100 + Actor1122: t02.husk + Owner: Neutral + Location: 101,62 + Actor1123: split2 + Owner: Neutral + Location: 119,117 + Actor1124: split2 + Owner: Neutral + Location: 13,123 + Actor1125: split2 + Owner: Neutral + Location: 11,119 + Actor1126: split2 + Owner: Neutral + Location: 121,83 + Actor1127: split2 + Owner: Neutral + Location: 126,81 + Actor1128: split2 + Owner: Neutral + Location: 3,90 + Actor1129: tc04.husk + Owner: Neutral + Location: 79,65 + Actor1130: t15.husk + Owner: Neutral + Location: 84,71 + Actor1131: tc01.husk + Owner: Neutral + Location: 84,54 + Actor1132: t02.husk + Owner: Neutral + Location: 86,57 + Actor1133: t05.husk + Owner: Neutral + Location: 56,57 + Actor1134: t03.husk + Owner: Neutral + Location: 49,62 + Actor1135: tc03.husk + Owner: Neutral + Location: 54,68 + Actor1136: t15.husk + Owner: Neutral + Location: 59,64 + Actor1137: t12.husk + Owner: Neutral + Location: 51,77 + Actor1138: tc04.husk + Owner: Neutral + Location: 45,79 + Actor1139: tc05.husk + Owner: Neutral + Location: 51,73 + Actor1140: t07.husk + Owner: Neutral + Location: 50,83 + Actor1141: t11.husk + Owner: Neutral + Location: 57,83 + Actor1142: t01.husk + Owner: Neutral + Location: 62,74 + Actor1143: t14.husk + Owner: Neutral + Location: 80,77 + Actor1144: t15.husk + Owner: Neutral + Location: 94,126 + Actor1145: t13.husk + Owner: Neutral + Location: 16,18 + Actor1151: t07.husk + Owner: Neutral + Location: 35,4 + Actor1153: tc01.husk + Owner: Neutral + Location: 13,19 + Actor1154: t15.husk + Owner: Neutral + Location: 6,23 + Actor1155: t07.husk + Owner: Neutral + Location: 1,19 + Actor1156: pac + Owner: Scrin + Location: 60,51 + Facing: 467 + Actor1157: pac + Owner: Scrin + Location: 73,51 + Facing: 586 + Actor1158: pac + Owner: Scrin + Facing: 384 + Location: 45,39 + Actor1159: pac + Owner: Scrin + Location: 83,40 + Facing: 626 + Actor1160: pac + Owner: Scrin + Location: 46,20 + Facing: 301 + Actor1161: pac + Owner: Scrin + Location: 83,27 + Facing: 650 + Actor1162: deva + Owner: Scrin + Facing: 384 + Location: 53,48 + Actor1163: deva + Owner: Scrin + Location: 84,46 + Facing: 586 + Actor1164: devo + Owner: Scrin + Location: 60,54 + Facing: 467 + Actor1165: devo + Owner: Scrin + Location: 75,55 + Facing: 507 + Actor1166: devo + Owner: Scrin + Facing: 384 + Location: 39,40 + Actor1167: devo + Owner: Scrin + Facing: 384 + Location: 39,26 + Actor1168: devo + Owner: Scrin + Location: 90,45 + Facing: 705 + Actor1169: rtpd + Owner: Scrin + Location: 67,54 + Facing: 475 + Actor1170: rtpd + Owner: Scrin + Location: 41,34 + Facing: 253 + Actor1171: rtpd + Owner: Scrin + Location: 89,38 + Facing: 761 + Actor1172: tpod + Owner: Scrin + Facing: 384 + Location: 64,43 + Actor1173: tpod + Owner: Scrin + Location: 70,43 + Facing: 578 + Actor1174: corr + Owner: Scrin + Facing: 384 + Location: 53,38 + Actor1175: corr + Owner: Scrin + Location: 79,34 + Facing: 610 + Actor1176: devo + Owner: Scrin + Location: 66,45 + Facing: 507 + Actor1177: stcr + Owner: Scrin + Facing: 384 + Location: 49,45 + Actor1178: stcr + Owner: Scrin + Location: 87,46 + Facing: 642 + Actor1179: s1 + Owner: Scrin + SubCell: 3 + Location: 71,59 + Facing: 578 + Actor1180: s1 + Owner: Scrin + SubCell: 3 + Location: 62,59 + Facing: 467 + Actor1181: s1 + Owner: Scrin + SubCell: 3 + Location: 73,59 + Facing: 547 + Actor1182: s1 + Owner: Scrin + SubCell: 3 + Location: 76,58 + Facing: 384 + Actor1183: s1 + Owner: Scrin + SubCell: 3 + Location: 58,57 + Facing: 384 + Actor1184: harv.scrin + Owner: Scrin + Facing: 384 + Location: 96,34 + Actor1185: harv.scrin + Owner: Scrin + Facing: 384 + Location: 31,26 + Actor1186: shrw + Owner: Scrin + Facing: 384 + Location: 48,30 + Actor1187: shrw + Owner: Scrin + Location: 83,32 + Facing: 618 + Actor1188: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 49,46 + Actor1189: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 43,37 + Actor1190: s3 + Owner: Scrin + SubCell: 3 + Location: 70,52 + Facing: 515 + Actor1191: s3 + Owner: Scrin + SubCell: 3 + Location: 83,50 + Facing: 578 + Actor1192: ruin + Owner: Scrin + Location: 78,51 + Facing: 563 + Actor1193: intl + Owner: Scrin + Location: 100,38 + Facing: 578 + Actor1194: seek + Owner: Scrin + Facing: 384 + Location: 24,26 + Actor1195: seek + Owner: Scrin + Facing: 384 + Location: 29,31 + Actor1196: seek + Owner: Scrin + Location: 64,61 + Facing: 507 + Actor1197: seek + Owner: Scrin + Location: 72,61 + Facing: 594 + Actor1198: intl + Owner: Scrin + Location: 74,60 + Facing: 531 + Actor1199: intl + Owner: Scrin + Location: 60,59 + Facing: 444 + Actor1200: corr + Owner: Scrin + Location: 95,43 + Facing: 626 + Actor1201: lchr + Owner: Scrin + Facing: 384 + Location: 33,37 + Actor1202: intl + Owner: Scrin + Facing: 384 + Location: 34,39 + Actor1203: s4 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 45,33 + Actor1204: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 48,37 + Actor1205: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 55,36 + Actor1206: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 47,45 + Actor1207: s4 + Owner: Scrin + SubCell: 3 + Location: 77,51 + Facing: 586 + Actor1208: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 64,52 + Actor1209: s4 + Owner: Scrin + SubCell: 3 + Location: 67,50 + Facing: 570 + Actor1210: s1 + Owner: Scrin + SubCell: 3 + Location: 86,41 + Facing: 666 + Actor1211: s1 + Owner: Scrin + Facing: 384 + Location: 86,41 + SubCell: 1 + Actor1212: s1 + Owner: Scrin + Location: 87,41 + SubCell: 3 + Facing: 832 + Actor1213: s1 + Owner: Scrin + SubCell: 3 + Location: 87,34 + Facing: 586 + Actor1214: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 57,9 + Actor1216: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 75,9 + Actor1217: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 80,13 + Actor1218: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 79,12 + Actor1219: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 52,10 + Actor1220: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 49,13 + Actor1221: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 47,13 + Actor1222: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 74,9 + Actor1223: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 62,10 + Actor1224: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 51,14 + Actor1225: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 88,23 + Actor1226: s1 + Owner: Scrin + Facing: 384 + Location: 88,23 + SubCell: 1 + Actor1227: pac + Owner: Scrin + Location: 54,12 + Facing: 158 + Actor1228: pac + Owner: Scrin + Location: 76,13 + Facing: 880 + Actor1229: pac + Owner: Scrin + Location: 64,10 + Facing: 0 + Actor1235: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 115,30 + Actor1236: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 114,29 + Actor1237: s1 + Owner: Scrin + Facing: 384 + Location: 114,29 + SubCell: 1 + Actor1238: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 119,38 + Actor1239: s1 + Owner: Scrin + Facing: 384 + Location: 124,38 + SubCell: 1 + Actor1241: gunw + Owner: Scrin + Facing: 384 + Location: 98,37 + Actor1242: gunw + Owner: Scrin + Facing: 384 + Location: 25,32 + Actor1243: shrw + Owner: Scrin + Facing: 384 + Location: 45,18 + Actor1245: ptnk + Owner: AlliedSlaves + Facing: 384 + Location: 76,82 + Actor1246: cryo + Owner: AlliedSlaves + Location: 83,83 + Facing: 523 + Actor1247: 2tnk + Owner: AlliedSlaves + Location: 78,77 + Facing: 0 + Actor1248: 2tnk + Owner: AlliedSlaves + Location: 70,96 + Facing: 507 + Actor1249: 2tnk + Owner: AlliedSlaves + Location: 78,96 + Facing: 515 + Actor1251: v2rl + Location: 14,62 + Facing: 626 + Owner: SovietSlaves + Actor1252: 4tnk + Location: 19,64 + Facing: 919 + Owner: SovietSlaves + Actor1253: 4tnk + Location: 19,79 + Facing: 626 + Owner: SovietSlaves + Actor1254: 4tnk + Location: 22,76 + Facing: 626 + Owner: SovietSlaves + Actor1255: ltnk + Owner: NodSlaves + Location: 117,71 + Facing: 384 + Actor1256: ltnk + Owner: NodSlaves + Facing: 384 + Location: 125,71 + Actor1257: arty.nod + Owner: NodSlaves + Facing: 384 + Location: 112,63 + Actor1258: arty.nod + Owner: NodSlaves + Location: 119,54 + Facing: 1023 + Actor1259: bggy + Owner: NodSlaves + Facing: 384 + Location: 115,83 + Actor1260: bggy + Owner: NodSlaves + Location: 100,74 + Facing: 634 + Actor1261: bike + Owner: NodSlaves + Facing: 384 + Location: 120,111 + Actor1262: bike + Owner: NodSlaves + Location: 117,111 + Facing: 594 + Actor1263: bike + Owner: NodSlaves + Facing: 384 + Location: 99,96 + Actor1264: bike + Owner: NodSlaves + Facing: 384 + Location: 100,94 + Actor1265: obli + Owner: NodSlaves + Location: 112,60 + Actor1266: ftnk + Owner: NodSlaves + Location: 121,67 + Facing: 515 + Actor1267: ftnk + Owner: NodSlaves + Location: 114,56 + Facing: 134 + Actor1268: 3tnk + Owner: SovietSlaves + Location: 17,93 + Facing: 642 + Actor1269: e1 + Owner: SovietSlaves + SubCell: 3 + Location: 16,94 + Facing: 570 + Actor1270: e1 + Owner: SovietSlaves + SubCell: 3 + Location: 19,92 + Facing: 721 + Actor1271: e1 + Owner: SovietSlaves + SubCell: 3 + Location: 17,91 + Facing: 626 + Actor1272: e3 + Owner: SovietSlaves + SubCell: 3 + Location: 20,89 + Facing: 634 + Actor1273: e1 + Owner: SovietSlaves + SubCell: 3 + Location: 36,108 + Facing: 745 + Actor1274: e1 + Owner: SovietSlaves + SubCell: 3 + Location: 36,105 + Facing: 650 + Actor1275: e1 + Owner: SovietSlaves + Facing: 384 + SubCell: 3 + Location: 37,104 + Actor1276: e1 + Owner: SovietSlaves + Facing: 384 + Location: 36,108 + SubCell: 1 + Actor1277: e4 + Owner: SovietSlaves + SubCell: 3 + Location: 35,106 + Facing: 578 + Actor1278: e1 + Owner: AlliedSlaves + Facing: 384 + Location: 70,95 + SubCell: 3 + Actor1279: e1 + Owner: AlliedSlaves + Facing: 384 + SubCell: 3 + Location: 67,95 + Actor1280: e1 + Owner: AlliedSlaves + Facing: 384 + SubCell: 3 + Location: 77,96 + Actor1281: e1 + Owner: AlliedSlaves + Facing: 384 + Location: 78,95 + SubCell: 3 + Actor1282: e1 + Owner: AlliedSlaves + Facing: 384 + SubCell: 3 + Location: 75,92 + Actor1283: e3 + Owner: AlliedSlaves + Facing: 384 + SubCell: 3 + Location: 79,96 + Actor1284: e3 + Owner: AlliedSlaves + SubCell: 3 + Location: 71,81 + Facing: 642 + Actor1285: e1 + Owner: AlliedSlaves + Location: 79,78 + SubCell: 3 + Facing: 214 + Actor1286: e1 + Owner: AlliedSlaves + SubCell: 3 + Location: 77,77 + Facing: 237 + Actor1287: e1 + Owner: AlliedSlaves + SubCell: 3 + Location: 80,76 + Facing: 142 + Actor1288: e1 + Owner: SovietSlaves + SubCell: 3 + Location: 18,79 + Facing: 650 + Actor1289: e1 + Owner: SovietSlaves + SubCell: 3 + Location: 21,78 + Facing: 642 + Actor1290: e1 + Owner: SovietSlaves + SubCell: 3 + Location: 22,75 + Facing: 745 + Actor1291: e1 + Owner: SovietSlaves + SubCell: 3 + Location: 14,78 + Facing: 563 + Actor1292: e1 + Owner: SovietSlaves + SubCell: 3 + Location: 20,66 + Facing: 793 + Actor1293: e1 + Owner: SovietSlaves + SubCell: 3 + Location: 19,61 + Facing: 840 + Actor1294: e1 + Owner: SovietSlaves + Location: 19,61 + SubCell: 1 + Facing: 864 + Actor1295: shok + Owner: SovietSlaves + Facing: 384 + SubCell: 3 + Location: 21,74 + Actor1296: shok + Owner: SovietSlaves + Facing: 384 + SubCell: 3 + Location: 22,69 + Actor1297: e1 + Owner: SovietSlaves + SubCell: 3 + Location: 11,66 + Facing: 436 + Actor1298: nsam + Owner: NodSlaves + Location: 117,56 + Actor1299: nsam + Owner: NodSlaves + Location: 116,67 + Actor1300: s1 + Owner: Scrin + Facing: 384 + Location: 33,38 + SubCell: 3 + Actor1301: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 31,36 + Actor1302: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 28,32 + Actor1303: s1 + Owner: Scrin + Facing: 384 + Location: 28,32 + SubCell: 1 + Actor1304: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 28,29 + Actor1305: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 26,28 + Actor1306: s2 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 34,35 + Actor1307: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 31,32 + Actor1308: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 95,41 + Actor1309: s4 + Owner: Scrin + SubCell: 3 + Location: 100,36 + Facing: 721 + Actor1310: s1 + Owner: Scrin + SubCell: 3 + Location: 94,44 + Facing: 602 + Actor1311: s1 + Owner: Scrin + Location: 94,44 + SubCell: 1 + Facing: 634 + Actor1312: s1 + Owner: Scrin + SubCell: 3 + Location: 97,44 + Facing: 650 + Actor1313: s1 + Owner: Scrin + SubCell: 3 + Location: 97,41 + Facing: 610 + Actor1314: s1 + Owner: Scrin + SubCell: 3 + Location: 101,38 + Facing: 626 + Actor1315: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 63,61 + Actor1316: s3 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 63,60 + Actor1317: tc05.husk + Owner: Neutral + Location: 29,78 + Actor1318: t01.husk + Owner: Neutral + Location: 31,70 + Actor1319: t12.husk + Owner: Neutral + Location: 30,76 + Actor1320: t05.husk + Owner: Neutral + Location: 32,59 + Actor1321: t15.husk + Owner: Neutral + Location: 31,52 + Actor1323: swal + Owner: Scrin + Location: 127,15 + Actor1324: swal + Owner: Scrin + Location: 128,15 + Actor1325: swal + Owner: Scrin + Location: 129,15 + Actor1326: swal + Owner: Scrin + Location: 130,15 + Actor1327: swal + Owner: Scrin + Location: 131,15 + Actor1328: swal + Owner: Scrin + Location: 132,15 + Actor1329: swal + Owner: Scrin + Location: 132,14 + Actor1330: swal + Owner: Scrin + Location: 132,13 + Actor1331: swal + Owner: Scrin + Location: 132,1 + Actor1332: swal + Owner: Scrin + Location: 132,2 + Actor1333: swal + Owner: Scrin + Location: 132,3 + Actor1334: swal + Owner: Scrin + Location: 132,4 + Actor1335: swal + Owner: Scrin + Location: 132,5 + Actor1336: swal + Owner: Scrin + Location: 132,6 + Actor1337: swal + Owner: Scrin + Location: 132,7 + Actor1338: swal + Owner: Scrin + Location: 132,8 + Actor1339: swal + Owner: Scrin + Location: 132,9 + Actor1340: swal + Owner: Scrin + Location: 132,10 + Actor1341: swal + Owner: Scrin + Location: 132,11 + Actor1342: swal + Owner: Scrin + Location: 132,12 + NEPower2: rea2 + Owner: Scrin + Location: 129,2 + NEPower4: rea2 + Owner: Scrin + Location: 129,5 + NEPower6: rea2 + Owner: Scrin + Location: 129,8 + NEPower8: rea2 + Owner: Scrin + Location: 129,11 + NEPower7: rea2 + Owner: Scrin + Location: 126,11 + NEPower5: rea2 + Owner: Scrin + Location: 126,8 + NEPower3: rea2 + Owner: Scrin + Location: 126,5 + NEPower1: rea2 + Owner: Scrin + Location: 126,2 + Actor1351: swal + Owner: Scrin + Location: 131,14 + Actor1352: swal + Owner: Scrin + Location: 130,14 + Actor1353: swal + Owner: Scrin + Location: 128,14 + Actor1354: swal + Owner: Scrin + Location: 129,14 + Actor1355: swal + Owner: Scrin + Location: 127,14 + Actor1359: swal + Owner: Scrin + Location: 125,11 + Actor1360: swal + Owner: Scrin + Location: 125,12 + Actor1361: swal + Owner: Scrin + Location: 125,10 + Actor1362: swal + Owner: Scrin + Location: 125,9 + Actor1363: swal + Owner: Scrin + Location: 125,9 + Actor1367: swal + Owner: Scrin + Location: 125,6 + Actor1368: swal + Owner: Scrin + Location: 125,5 + Actor1369: swal + Owner: Scrin + Location: 125,4 + Actor1370: swal + Owner: Scrin + Location: 125,3 + Actor1371: swal + Owner: Scrin + Location: 125,2 + Actor1372: swal + Owner: Scrin + Location: 125,1 + Actor1373: swal + Owner: Scrin + Location: 126,1 + Actor1374: swal + Owner: Scrin + Location: 127,1 + Actor1375: swal + Owner: Scrin + Location: 128,1 + Actor1376: swal + Owner: Scrin + Location: 129,1 + Actor1377: swal + Owner: Scrin + Location: 130,1 + Actor1378: swal + Owner: Scrin + Location: 131,1 + Actor1379: shar + Owner: Scrin + Location: 123,16 + Actor1380: shar + Owner: Scrin + Location: 129,18 + Actor1381: shar + Owner: Scrin + Location: 126,17 + Actor1382: shar + Owner: Scrin + Location: 122,13 + Actor1383: shar + Owner: Scrin + Location: 121,5 + Actor1384: shar + Owner: Scrin + Location: 121,2 + Actor1385: shar + Owner: Scrin + Location: 132,21 + Actor1386: shar + Owner: Scrin + Location: 129,21 + Actor1387: shar + Owner: Scrin + Location: 124,20 + Actor1388: shar + Owner: Scrin + Location: 120,17 + Actor1389: shar + Owner: Scrin + Location: 119,13 + Actor1390: shar + Owner: Scrin + Location: 118,5 + Actor1391: shar + Owner: Scrin + Location: 117,2 + Actor1392: shar + Owner: Scrin + Location: 121,9 + Actor1393: swal + Owner: Scrin + Location: 124,1 + Actor1394: swal + Owner: Scrin + Location: 124,2 + Actor1395: swal + Owner: Scrin + Location: 124,3 + Actor1396: swal + Owner: Scrin + Location: 124,4 + Actor1397: swal + Owner: Scrin + Location: 124,5 + Actor1398: swal + Owner: Scrin + Location: 124,6 + Actor1401: swal + Owner: Scrin + Location: 124,9 + Actor1402: swal + Owner: Scrin + Location: 124,10 + Actor1403: swal + Owner: Scrin + Location: 124,11 + Actor1404: swal + Owner: Scrin + Location: 124,12 + Actor1240: swal + Owner: Scrin + Location: 125,13 + Actor1322: swal + Owner: Scrin + Location: 124,13 + Actor1356: swal + Owner: Scrin + Location: 124,14 + Actor1357: swal + Owner: Scrin + Location: 125,14 + Actor1358: swal + Owner: Scrin + Location: 126,14 + Actor1364: swal + Owner: Scrin + Location: 126,15 + Actor1365: swal + Owner: Scrin + Location: 125,15 + Actor1366: swal + Owner: Scrin + Location: 124,15 + WestAttackNode1: waypoint + Owner: Neutral + Location: 28,38 + WestAttackNode4: waypoint + Owner: Neutral + Location: 21,84 + CenterAttackNode3: waypoint + Owner: Neutral + Location: 72,102 + EastAttackNode1: waypoint + Owner: Neutral + Location: 102,45 + EastAttackNode4: waypoint + Owner: Neutral + Location: 116,76 + EastAttackNode5: waypoint + Owner: Neutral + Location: 107,93 + MADTankSpawn: waypoint + Owner: Neutral + Location: 1,87 + NorthEastPowerBeacon: waypoint + Owner: Neutral + Location: 125,8 + WormholeWP: waypoint + Owner: Neutral + Location: 66,27 + ChronoTankSpawn5: waypoint + Owner: Neutral + Location: 107,14 + ChronoTankSpawn4: waypoint + Owner: Neutral + Location: 106,13 + ChronoTankSpawn6: waypoint + Owner: Neutral + Location: 108,15 + ChronoTankSpawn3: waypoint + Owner: Neutral + Location: 108,11 + ChronoTankSpawn2: waypoint + Owner: Neutral + Location: 107,10 + ChronoTankSpawn1: waypoint + Owner: Neutral + Location: 106,9 + WestWarpSphere: wsph + Owner: Scrin + Location: 44,27 + WestPortal: port + Owner: Scrin + Location: 48,33 + CenterWarpSphere: wsph + Owner: Scrin + Location: 56,44 + CenterPortal: port + Owner: Scrin + Location: 61,46 + EastWarpSphere: wsph + Owner: Scrin + Location: 81,35 + Actor1487: grav + Owner: Scrin + Location: 78,40 + Actor1488: grav + Owner: Scrin + Location: 51,33 + Actor1489: grav + Owner: Scrin + Location: 52,39 + Actor1490: srep + Owner: Scrin + Location: 74,45 + Actor1491: srep + Owner: Scrin + Location: 48,38 + EastPortal: port + Owner: Scrin + Location: 83,43 + Actor1492: grav + Owner: Scrin + Location: 79,44 + Actor1343: reap + Owner: CyborgSlaves + SubCell: 1 + Facing: 512 + Location: 60,27 + Actor1348: reap + Owner: CyborgSlaves + SubCell: 2 + Facing: 512 + Location: 60,27 + Actor1349: reap + Owner: CyborgSlaves + SubCell: 4 + Facing: 512 + Location: 60,27 + Actor1350: reap + Owner: CyborgSlaves + SubCell: 5 + Facing: 512 + Location: 60,27 + Actor1483: reap + Owner: CyborgSlaves + SubCell: 1 + Facing: 512 + Location: 72,27 + Actor1484: reap + Owner: CyborgSlaves + SubCell: 2 + Facing: 512 + Location: 72,27 + Actor1485: reap + Owner: CyborgSlaves + SubCell: 4 + Facing: 512 + Location: 72,27 + Actor1486: reap + Owner: CyborgSlaves + SubCell: 5 + Facing: 512 + Location: 72,27 + InterceptorSpawn1: waypoint + Owner: Neutral + Location: 66,132 + InterceptorSpawn2: waypoint + Owner: Neutral + Location: 62,132 + InterceptorSpawn3: waypoint + Owner: Neutral + Location: 70,132 + InterceptorExit2: waypoint + Owner: Neutral + Location: 104,1 + InterceptorWP2: waypoint + Owner: Neutral + Location: 59,54 + InterceptorWP3: waypoint + Owner: Neutral + Location: 73,54 + InterceptorExit3: waypoint + Owner: Neutral + Location: 1,37 + InterceptorExit1: waypoint + Owner: Neutral + Location: 45,1 + MADTankPath2: waypoint + Owner: Neutral + Location: 8,77 + MADTankPath3: waypoint + Owner: Neutral + Location: 24,59 + MADTankPath1: waypoint + Owner: Neutral + Location: 7,86 + MADTankPath4: waypoint + Owner: Neutral + Location: 22,42 + MADTankPath5: waypoint + Owner: Neutral + Location: 17,36 + MADTankPath6: waypoint + Owner: Neutral + Location: 18,21 + Actor1423: t11.husk + Owner: Neutral + Location: 27,2 + Actor1429: swal + Owner: Scrin + Location: 1,5 + Actor1435: tc01.husk + Owner: Neutral + Location: 25,4 + Actor1436: swal + Owner: Scrin + Location: 1,6 + NWPower5: rea2 + Owner: Scrin + Location: 2,6 + NWPower7: rea2 + Owner: Scrin + Location: 8,6 + NWPower8: rea2 + Owner: Scrin + Location: 11,6 + Actor1443: swal + Owner: Scrin + Location: 1,7 + Actor1448: swal + Owner: Scrin + Location: 1,8 + Actor1452: swal + Owner: Scrin + Location: 1,9 + Actor1453: swal + Owner: Scrin + Location: 2,9 + Actor1454: swal + Owner: Scrin + Location: 3,9 + Actor1455: swal + Owner: Scrin + Location: 4,9 + Actor1456: swal + Owner: Scrin + Location: 5,9 + Actor1457: swal + Owner: Scrin + Location: 6,9 + Actor1458: swal + Owner: Scrin + Location: 7,9 + Actor1459: swal + Owner: Scrin + Location: 8,9 + Actor1460: swal + Owner: Scrin + Location: 9,9 + Actor1461: swal + Owner: Scrin + Location: 10,9 + Actor1462: swal + Owner: Scrin + Location: 11,9 + Actor1463: swal + Owner: Scrin + Location: 12,9 + Actor1464: swal + Owner: Scrin + Location: 13,9 + Actor1465: swal + Owner: Scrin + Location: 14,9 + Actor1468: scol + Owner: Scrin + Location: 17,9 + Actor1469: swal + Owner: Scrin + Location: 1,10 + Actor1470: shar + Owner: Scrin + Location: 2,10 + Actor1471: swal + Owner: Scrin + Location: 3,10 + Actor1472: shar + Owner: Scrin + Location: 4,10 + Actor1473: swal + Owner: Scrin + Location: 5,10 + Actor1474: shar + Owner: Scrin + Location: 6,10 + Actor1475: swal + Owner: Scrin + Location: 7,10 + Actor1476: shar + Owner: Scrin + Location: 8,10 + Actor1477: swal + Owner: Scrin + Location: 9,10 + Actor1478: shar + Owner: Scrin + Location: 10,10 + Actor1479: swal + Owner: Scrin + Location: 11,10 + Actor1480: shar + Owner: Scrin + Location: 12,10 + Actor1494: swal + Owner: Scrin + Location: 13,10 + Actor1495: swal + Owner: Scrin + Location: 14,10 + Actor1496: swal + Owner: Scrin + Location: 1,11 + Actor1497: swal + Owner: Scrin + Location: 2,11 + Actor1498: swal + Owner: Scrin + Location: 3,11 + Actor1499: swal + Owner: Scrin + Location: 4,11 + Actor1500: swal + Owner: Scrin + Location: 5,11 + Actor1501: swal + Owner: Scrin + Location: 6,11 + Actor1502: swal + Owner: Scrin + Location: 7,11 + Actor1503: swal + Owner: Scrin + Location: 8,11 + Actor1504: swal + Owner: Scrin + Location: 9,11 + Actor1505: swal + Owner: Scrin + Location: 10,11 + Actor1506: swal + Owner: Scrin + Location: 11,11 + Actor1507: swal + Owner: Scrin + Location: 12,11 + Actor1508: swal + Owner: Scrin + Location: 13,11 + Actor1509: scol + Owner: Scrin + Location: 15,11 + Actor1510: scol + Owner: Scrin + Location: 15,11 + Actor1511: t02.husk + Owner: Neutral + Location: 27,10 + Actor1512: scol + Owner: Scrin + Location: 2,12 + Actor1513: scol + Owner: Scrin + Location: 2,12 + Actor1514: scol + Owner: Scrin + Location: 4,12 + Actor1515: scol + Owner: Scrin + Location: 6,12 + Actor1516: scol + Owner: Scrin + Location: 8,12 + Actor1517: scol + Owner: Scrin + Location: 10,12 + Actor1518: scol + Owner: Scrin + Location: 12,12 + Actor1346: swal + Owner: Scrin + Location: 1,1 + Actor1347: swal + Owner: Scrin + Location: 2,1 + Actor1405: swal + Owner: Scrin + Location: 3,1 + Actor1406: swal + Owner: Scrin + Location: 4,1 + Actor1407: swal + Owner: Scrin + Location: 5,1 + Actor1408: swal + Owner: Scrin + Location: 6,1 + Actor1409: swal + Owner: Scrin + Location: 7,1 + Actor1410: swal + Owner: Scrin + Location: 8,1 + Actor1411: swal + Owner: Scrin + Location: 9,1 + Actor1412: swal + Owner: Scrin + Location: 10,1 + Actor1413: swal + Owner: Scrin + Location: 11,1 + Actor1414: swal + Owner: Scrin + Location: 12,1 + Actor1415: swal + Owner: Scrin + Location: 13,1 + Actor1416: swal + Owner: Scrin + Location: 14,1 + Actor1417: swal + Owner: Scrin + Location: 15,1 + Actor1418: swal + Owner: Scrin + Location: 16,1 + Actor1419: swal + Owner: Scrin + Location: 1,2 + NWPower1: rea2 + Owner: Scrin + Location: 2,2 + NWPower2: rea2 + Owner: Scrin + Location: 5,2 + NWPower3: rea2 + Owner: Scrin + Location: 8,2 + NWPower4: rea2 + Owner: Scrin + Location: 11,2 + Actor1425: swal + Owner: Scrin + Location: 14,2 + Actor1426: swal + Owner: Scrin + Location: 15,2 + Actor1427: swal + Owner: Scrin + Location: 16,2 + Actor1519: scol + Owner: Scrin + Location: 17,2 + Actor1520: swal + Owner: Scrin + Location: 1,3 + Actor1524: swal + Owner: Scrin + Location: 1,4 + MADTankPath7: waypoint + Owner: Neutral + Location: 21,6 + MADTankPath9: waypoint + Owner: Neutral + Location: 9,5 + NWPower6: rea2 + Owner: Scrin + Location: 5,6 + MADTankPath8: waypoint + Owner: Neutral + Location: 14,5 + Actor1420: scol + Owner: Scrin + Location: 16,3 + Actor1421: scol + Owner: Scrin + Location: 16,10 + Actor1422: shar + Owner: Scrin + Location: 14,8 + Actor1424: shar + Owner: Scrin + Location: 14,3 + HackerDropSpawn: waypoint + Owner: Neutral + Location: 132,98 + ChronoTankBeacon: waypoint + Owner: Neutral + Location: 107,12 + Actor1344: camera + Owner: Scrin + Location: 73,114 + Actor1345: camera + Owner: Scrin + Location: 58,115 + Actor1428: camera + Owner: Scrin + Location: 87,115 + Actor1430: camera + Owner: Scrin + Location: 83,125 + Actor1431: camera + Owner: Scrin + Location: 66,125 + Actor1432: camera + Owner: Scrin + Location: 46,120 + Actor1433: camera + Owner: Scrin + Location: 108,111 + Actor1434: camera + Owner: Scrin + Location: 120,79 + Actor1437: camera + Owner: Scrin + Location: 112,55 + Actor1438: camera + Owner: Scrin + Location: 21,61 + Actor1439: camera + Owner: Scrin + Location: 13,81 + Actor1440: camera + Owner: Scrin + Location: 74,77 + Actor1441: camera + Owner: Scrin + Location: 74,98 + Actor1442: camera + Owner: Scrin + Location: 24,40 + Actor1444: camera + Owner: Scrin + Location: 105,45 + Actor1445: camera + Owner: Scrin + Location: 35,100 + Actor1446: camera + Owner: Scrin + Location: 104,97 + EntranceReveal1: waypoint + Owner: Neutral + Location: 74,95 + EntranceReveal2: waypoint + Owner: Neutral + Location: 8,78 + EntranceReveal3: waypoint + Owner: Neutral + Location: 121,71 + GrandCannonReveal1: waypoint + Owner: Neutral + Location: 56,103 + GrandCannonReveal2: waypoint + Owner: Neutral + Location: 83,99 + Actor1447: n3 + Owner: NodSlaves + Facing: 384 + SubCell: 3 + Location: 130,74 + Actor1449: n3 + Owner: NodSlaves + Facing: 384 + SubCell: 3 + Location: 131,73 + Actor1450: n3 + Owner: NodSlaves + Facing: 384 + SubCell: 3 + Location: 126,70 + Actor1451: n3 + Owner: NodSlaves + SubCell: 3 + Location: 123,54 + Facing: 253 + Actor1466: n3 + Owner: NodSlaves + Facing: 384 + SubCell: 3 + Location: 126,57 + Actor1467: n3 + Owner: NodSlaves + SubCell: 3 + Location: 131,66 + Facing: 539 + Actor1521: n3 + Owner: NodSlaves + Facing: 384 + SubCell: 3 + Location: 118,67 + Actor1522: n3 + Owner: NodSlaves + SubCell: 3 + Location: 119,61 + Facing: 578 + Actor1523: n3 + Owner: NodSlaves + Facing: 384 + SubCell: 3 + Location: 116,84 + Actor1525: n3 + Owner: NodSlaves + SubCell: 3 + Location: 125,76 + Facing: 713 + Actor1526: n3 + Owner: NodSlaves + SubCell: 3 + Location: 130,77 + Facing: 483 + Actor1527: e3 + Owner: AlliedSlaves + Location: 57,83 + SubCell: 3 + Facing: 602 + Actor1528: e3 + Owner: AlliedSlaves + Facing: 384 + Location: 51,77 + SubCell: 3 + Actor1529: e3 + Owner: AlliedSlaves + Facing: 384 + SubCell: 3 + Location: 63,92 + Actor1532: btr + Owner: SovietSlaves + Location: 3,83 + TurretFacing: 0 + Facing: 634 + Actor1533: btr + Owner: SovietSlaves + Location: 4,74 + Facing: 618 + Actor1534: e3 + Owner: SovietSlaves + SubCell: 3 + Location: 3,82 + Facing: 523 + Actor1535: e3 + Owner: SovietSlaves + SubCell: 3 + Location: 5,97 + Facing: 666 + Actor1536: e3 + Owner: SovietSlaves + SubCell: 3 + Location: 16,93 + Facing: 745 + Actor1537: e3 + Owner: SovietSlaves + Facing: 384 + Location: 16,93 + SubCell: 1 + Actor1538: e3 + Owner: SovietSlaves + SubCell: 3 + Location: 6,84 + Facing: 745 + Actor1539: e3 + Owner: SovietSlaves + SubCell: 3 + Location: 5,68 + Facing: 578 + Actor1540: e3 + Owner: SovietSlaves + SubCell: 3 + Location: 2,67 + Facing: 761 + Actor1541: e3 + Owner: SovietSlaves + SubCell: 3 + Location: 9,67 + Facing: 642 + Actor1542: e3 + Owner: SovietSlaves + Location: 11,73 + SubCell: 3 + Facing: 658 + Actor1543: e3 + Owner: SovietSlaves + Facing: 384 + Location: 12,70 + SubCell: 3 + Actor1544: sam + Owner: SovietSlaves + Location: 8,103 + Actor1545: sam + Owner: SovietSlaves + Location: 12,90 + Actor1546: sam + Owner: SovietSlaves + Location: 25,92 + Actor1547: fenc + Owner: SovietSlaves + Location: 24,92 + Actor1548: fenc + Owner: SovietSlaves + Location: 28,91 + Actor1549: fenc + Owner: SovietSlaves + Location: 27,91 + Actor1550: fenc + Owner: SovietSlaves + Location: 27,92 + Actor1551: fenc + Owner: SovietSlaves + Location: 27,93 + Actor1552: fenc + Owner: SovietSlaves + Location: 26,93 + Actor1553: fenc + Owner: SovietSlaves + Location: 25,93 + Actor1554: fenc + Owner: SovietSlaves + Location: 24,93 + Actor1555: fenc + Owner: SovietSlaves + Location: 11,91 + Actor1556: fenc + Owner: SovietSlaves + Location: 11,90 + Actor1557: fenc + Owner: SovietSlaves + Location: 12,91 + Actor1558: fenc + Owner: SovietSlaves + Location: 13,91 + Actor1559: fenc + Owner: SovietSlaves + Location: 14,91 + Actor1560: fenc + Owner: SovietSlaves + Location: 14,90 + Actor1561: fenc + Owner: SovietSlaves + Location: 8,104 + Actor1562: fenc + Owner: SovietSlaves + Location: 9,104 + Actor1563: fenc + Owner: SovietSlaves + Location: 10,104 + Actor1564: fenc + Owner: SovietSlaves + Location: 10,103 + Actor1565: fenc + Owner: SovietSlaves + Location: 10,102 + Actor1566: fenc + Owner: SovietSlaves + Location: 10,102 + Actor1567: fenc + Owner: SovietSlaves + Location: 9,102 + Actor1568: fenc + Owner: SovietSlaves + Location: 34,84 + Actor1569: fenc + Owner: SovietSlaves + Location: 35,84 + Actor1570: fenc + Owner: SovietSlaves + Location: 36,84 + Actor1571: fenc + Owner: SovietSlaves + Location: 36,82 + Actor1572: fenc + Owner: SovietSlaves + Location: 36,83 + Actor1573: sam + Owner: SovietSlaves + Location: 34,83 + Actor1574: fenc + Owner: SovietSlaves + Location: 33,83 + Actor1575: fenc + Owner: SovietSlaves + Location: 33,84 + Actor1576: nsam + Owner: NodSlaves + Location: 127,92 + Actor1577: nsam + Owner: NodSlaves + Location: 115,89 + Actor1578: nsam + Owner: NodSlaves + Location: 97,78 + Actor1579: nsam + Owner: NodSlaves + Location: 106,71 + Actor1580: sbag + Owner: NodSlaves + Location: 105,71 + Actor1581: sbag + Owner: NodSlaves + Location: 105,72 + Actor1582: sbag + Owner: NodSlaves + Location: 106,72 + Actor1583: sbag + Owner: NodSlaves + Location: 107,72 + Actor1584: sbag + Owner: NodSlaves + Location: 108,72 + Actor1585: sbag + Owner: NodSlaves + Location: 108,71 + Actor1586: sbag + Owner: NodSlaves + Location: 97,79 + Actor1587: sbag + Owner: NodSlaves + Location: 99,79 + Actor1588: sbag + Owner: NodSlaves + Location: 98,79 + Actor1589: sbag + Owner: NodSlaves + Location: 99,78 + Actor1590: sbag + Owner: NodSlaves + Location: 114,89 + Actor1591: sbag + Owner: NodSlaves + Location: 114,90 + Actor1592: sbag + Owner: NodSlaves + Location: 115,90 + Actor1593: sbag + Owner: NodSlaves + Location: 116,90 + Actor1594: sbag + Owner: NodSlaves + Location: 127,93 + Actor1595: sbag + Owner: NodSlaves + Location: 128,93 + Actor1596: sbag + Owner: NodSlaves + Location: 126,93 + Actor1597: sbag + Owner: NodSlaves + Location: 129,93 + Actor1598: sbag + Owner: NodSlaves + Location: 129,92 + Actor1599: n1 + Owner: NodSlaves + SubCell: 3 + Facing: 384 + Location: 127,94 + Actor1600: n1 + Owner: NodSlaves + SubCell: 3 + Location: 128,94 + Facing: 578 + Actor1601: n1 + Owner: NodSlaves + SubCell: 3 + Location: 116,91 + Facing: 563 + Actor1602: n1 + Owner: NodSlaves + Facing: 384 + Location: 116,91 + SubCell: 1 + Actor1603: n1 + Owner: NodSlaves + SubCell: 3 + Location: 113,89 + Facing: 269 + Actor1604: n1 + Owner: NodSlaves + SubCell: 3 + Location: 98,80 + Facing: 586 + Actor1605: n1 + Owner: NodSlaves + Location: 100,79 + SubCell: 3 + Facing: 642 + Actor1606: n1 + Owner: NodSlaves + SubCell: 3 + Location: 106,73 + Facing: 539 + Actor1607: n1 + Owner: NodSlaves + Location: 104,71 + SubCell: 3 + Facing: 384 + Actor1608: n1 + Owner: NodSlaves + Location: 109,72 + SubCell: 3 + Facing: 745 + Actor1609: e1 + Owner: SovietSlaves + SubCell: 3 + Location: 8,105 + Facing: 737 + Actor1610: e1 + Owner: SovietSlaves + Facing: 384 + Location: 8,105 + SubCell: 1 + Actor1611: e1 + Owner: SovietSlaves + SubCell: 3 + Location: 10,106 + Facing: 610 + Actor1612: e1 + Owner: SovietSlaves + SubCell: 3 + Location: 12,103 + Facing: 737 + Actor1613: e1 + Owner: SovietSlaves + SubCell: 3 + Location: 27,94 + Facing: 761 + Actor1614: e1 + Owner: SovietSlaves + Location: 27,94 + SubCell: 1 + Facing: 594 + Actor1615: e1 + Owner: SovietSlaves + SubCell: 3 + Location: 25,94 + Facing: 602 + Actor1616: e1 + Owner: SovietSlaves + SubCell: 3 + Location: 28,92 + Facing: 547 + Actor1618: e1 + Owner: SovietSlaves + Facing: 384 + Location: 34,85 + SubCell: 1 + Actor1619: e1 + Owner: SovietSlaves + Facing: 384 + SubCell: 3 + Location: 32,83 + Actor1621: e1 + Owner: SovietSlaves + SubCell: 3 + Location: 41,116 + Facing: 586 + Actor1622: e1 + Owner: SovietSlaves + SubCell: 3 + Location: 36,120 + Facing: 658 + Actor1623: e1 + Owner: SovietSlaves + Location: 41,118 + SubCell: 3 + Facing: 745 + Actor1624: shar + Owner: Scrin + Location: 92,64 + Actor1625: shar + Owner: Scrin + Location: 46,63 + Actor1626: shar + Owner: Scrin + Location: 41,72 + Actor1627: shar + Owner: Scrin + Location: 90,54 + Actor1628: shar + Owner: Scrin + Location: 93,78 + Actor1629: shar + Owner: Scrin + Location: 122,88 + Actor1630: shar + Owner: Scrin + Location: 38,88 + Actor1634: scol + Owner: Scrin + Location: 35,51 + Actor1635: scol + Owner: Scrin + Location: 19,44 + Actor1636: scol + Owner: Scrin + Location: 101,48 + Actor1637: ptur + Owner: Scrin + Location: 32,109 + TurretFacing: 570 + Actor1639: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 31,57 + Actor1640: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 29,55 + Actor1641: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 24,54 + Actor1642: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 31,55 + Actor1643: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 25,52 + Actor1644: tpod + Owner: Scrin + Facing: 384 + Location: 123,5 + Actor1645: seek + Owner: Scrin + Location: 119,8 + Facing: 293 + Actor1646: tent + Owner: AlliedSlaves + Location: 66,88 + Actor1648: hpad + Owner: AlliedSlaves + Location: 69,89 + Actor1650: weap + Owner: SovietSlaves + Location: 6,68 + Actor1651: sam + Owner: SovietSlaves + Location: 5,73 + Actor1652: weap + Owner: AlliedSlaves + Location: 69,84 + Actor1531: e3 + Owner: AlliedSlaves + Facing: 384 + SubCell: 3 + Location: 66,82 + Actor1647: brik + Owner: AlliedSlaves + Location: 63,90 + Actor1653: brik + Owner: AlliedSlaves + Location: 63,89 + Actor1654: brik + Owner: AlliedSlaves + Location: 63,85 + Actor1655: brik + Owner: AlliedSlaves + Location: 63,84 + Actor1656: e3 + Owner: AlliedSlaves + Facing: 384 + SubCell: 3 + Location: 65,85 + Actor1530: brik + Owner: SovietSlaves + Location: 19,75 + Actor1657: brik + Owner: SovietSlaves + Location: 19,74 + Actor1658: brik + Owner: SovietSlaves + Location: 19,70 + Actor1659: brik + Owner: SovietSlaves + Location: 19,71 + Actor1660: fix + Owner: SovietSlaves + Location: 15,71 + Actor1661: v2rl + Facing: 634 + Owner: SovietSlaves + Location: 14,76 + CenterAttackNode2: waypoint + Owner: Neutral + Location: 74,72 + EastAttackNode2: waypoint + Owner: Neutral + Location: 110,52 + Actor1649: proc + Owner: SovietSlaves + Location: 12,64 + HardNormalAA3: shar + Owner: Scrin + Location: 5,85 + TurretFacing: 192 + HardNormalAA2: shar + Owner: Scrin + Location: 130,73 + TurretFacing: 192 + CenterAttackNode1: waypoint + Owner: Neutral + Location: 67,63 + EastAttackNode3: waypoint + Owner: Neutral + Location: 120,63 + HackerDropLanding: waypoint + Owner: Neutral + Location: 124,103 + WestAttackNode2: waypoint + Owner: Neutral + Location: 27,59 + WestAttackNode3: waypoint + Owner: Neutral + Location: 11,69 + WestAttackNode5: waypoint + Owner: Neutral + Location: 29,99 + Actor1617: e2 + Owner: SovietSlaves + SubCell: 3 + Location: 36,86 + Facing: 277 + Actor1620: e2 + Owner: SovietSlaves + Facing: 384 + SubCell: 3 + Location: 38,85 + Actor1633: e2 + Owner: SovietSlaves + SubCell: 3 + Location: 37,84 + Facing: 634 + Actor1662: tpod + Owner: Scrin + Location: 123,9 + Facing: 269 + Actor1663: e4 + Owner: SovietSlaves + SubCell: 3 + Location: 20,124 + Facing: 753 + Actor1664: e4 + Owner: SovietSlaves + SubCell: 3 + Location: 20,120 + Facing: 785 + Actor1665: e1 + Owner: SovietSlaves + SubCell: 3 + Location: 21,117 + Facing: 697 + Actor1666: e1 + Owner: SovietSlaves + Location: 20,125 + SubCell: 3 + Facing: 697 + Actor1667: rtpd + Owner: Scrin + Location: 71,33 + Facing: 610 + Actor1668: rtpd + Owner: Scrin + Facing: 384 + Location: 61,33 + Actor1669: corr + Owner: Scrin + Facing: 384 + Location: 115,92 + Actor1638: e3 + Owner: NodSlaves + Facing: 384 + SubCell: 1 + Location: 100,79 + Actor1670: e3 + Owner: NodSlaves + Facing: 384 + SubCell: 3 + Location: 110,77 + Actor1671: atmz + Owner: Scrin + Facing: 384 + Location: 56,41 + Actor1672: atmz + Owner: Scrin + Location: 76,39 + Facing: 610 + Actor1673: atmz + Owner: Scrin + Location: 79,28 + TurretFacing: 0 + Facing: 634 + Actor1674: atmz + Owner: Scrin + Facing: 384 + Location: 48,28 + Actor1675: ruin + Owner: Scrin + Facing: 384 + Location: 58,32 + Actor1676: ruin + Owner: Scrin + Location: 74,31 + Facing: 634 + Actor1677: shar + Owner: Scrin + Location: 59,48 + TurretFacing: 333 + Actor1678: shar + Owner: Scrin + Location: 72,48 + TurretFacing: 586 + Actor1679: scol + Owner: Scrin + Location: 57,17 + Actor1680: scol + Owner: Scrin + Location: 76,18 + Actor1493: lchr + Owner: Scrin + Location: 70,59 + Facing: 467 + Actor1681: rmbc + Owner: CyborgSlaves + SubCell: 1 + Facing: 512 + Location: 62,40 + Actor1682: rmbc + Owner: CyborgSlaves + SubCell: 4 + Facing: 512 + Location: 62,40 + Actor1683: rmbc + Owner: CyborgSlaves + SubCell: 2 + Facing: 512 + Location: 62,40 + Actor1684: rmbc + Owner: CyborgSlaves + SubCell: 5 + Facing: 512 + Location: 62,40 + Actor1685: rmbc + Owner: CyborgSlaves + SubCell: 1 + Facing: 512 + Location: 71,40 + Actor1686: rmbc + Owner: CyborgSlaves + SubCell: 4 + Facing: 512 + Location: 71,40 + Actor1687: rmbc + Owner: CyborgSlaves + SubCell: 2 + Facing: 512 + Location: 71,40 + Actor1688: rmbc + Owner: CyborgSlaves + SubCell: 5 + Facing: 512 + Location: 71,40 + Actor1689: tplr + Owner: CyborgSlaves + SubCell: 1 + Facing: 512 + Location: 63,38 + Actor1690: tplr + Owner: CyborgSlaves + SubCell: 2 + Facing: 512 + Location: 63,38 + Actor1691: tplr + Owner: CyborgSlaves + SubCell: 4 + Facing: 512 + Location: 63,38 + Actor1692: tplr + Owner: CyborgSlaves + SubCell: 5 + Facing: 512 + Location: 63,38 + Actor1693: tplr + Owner: CyborgSlaves + SubCell: 1 + Facing: 512 + Location: 69,38 + Actor1694: tplr + Owner: CyborgSlaves + SubCell: 2 + Facing: 512 + Location: 69,38 + Actor1695: tplr + Owner: CyborgSlaves + SubCell: 4 + Facing: 512 + Location: 69,38 + Actor1696: tplr + Owner: CyborgSlaves + SubCell: 5 + Facing: 512 + Location: 69,38 + Actor1697: enli + Owner: CyborgSlaves + SubCell: 1 + Facing: 512 + Location: 59,21 + Actor1698: enli + Owner: CyborgSlaves + SubCell: 4 + Facing: 512 + Location: 59,21 + Actor1699: enli + Owner: CyborgSlaves + SubCell: 2 + Facing: 512 + Location: 59,21 + Actor1700: enli + Owner: CyborgSlaves + SubCell: 5 + Facing: 512 + Location: 59,21 + Actor1701: enli + Owner: CyborgSlaves + SubCell: 1 + Facing: 512 + Location: 72,20 + Actor1702: enli + Owner: CyborgSlaves + SubCell: 4 + Facing: 512 + Location: 72,20 + Actor1703: enli + Owner: CyborgSlaves + SubCell: 2 + Facing: 512 + Location: 72,20 + Actor1704: enli + Owner: CyborgSlaves + SubCell: 5 + Facing: 512 + Location: 72,20 + Actor1705: sfac + Owner: Scrin + Location: 63,10 + Actor1706: rea2 + Owner: Scrin + Location: 69,13 + Actor1707: rea2 + Owner: Scrin + Location: 71,11 + Actor1708: silo.scrin + Owner: Scrin + Location: 64,13 + Actor1709: silo.scrinblue + Owner: Scrin + Location: 68,11 + Actor1710: silo.scrinblue + Owner: Scrin + Location: 66,12 + Actor1711: swal + Owner: Scrin + Location: 79,32 + Actor1712: swal + Owner: Scrin + Location: 80,32 + Actor1713: swal + Owner: Scrin + Location: 81,32 + Actor1714: swal + Owner: Scrin + Location: 81,31 + Actor1715: swal + Owner: Scrin + Location: 81,30 + Actor1716: swal + Owner: Scrin + Location: 81,29 + Actor1717: swal + Owner: Scrin + Location: 79,29 + Actor1718: swal + Owner: Scrin + Location: 80,29 + KaneSpawn: waypoint + Owner: Neutral + Location: 66,21 + Actor1631: rmbc + Owner: CyborgSlaves + SubCell: 1 + Facing: 512 + Location: 64,23 + Actor1730: rmbc + Owner: CyborgSlaves + SubCell: 4 + Facing: 512 + Location: 64,23 + Actor1731: rmbc + Owner: CyborgSlaves + SubCell: 2 + Facing: 512 + Location: 64,23 + Actor1732: rmbc + Owner: CyborgSlaves + SubCell: 5 + Facing: 512 + Location: 64,23 + Actor1722: rmbc + Owner: CyborgSlaves + SubCell: 1 + Facing: 512 + Location: 68,23 + Actor1723: rmbc + Owner: CyborgSlaves + SubCell: 4 + Facing: 512 + Location: 68,23 + Actor1724: rmbc + Owner: CyborgSlaves + SubCell: 2 + Facing: 512 + Location: 68,23 + Actor1725: rmbc + Owner: CyborgSlaves + SubCell: 5 + Facing: 512 + Location: 68,23 + Actor1726: reap + Owner: CyborgSlaves + SubCell: 1 + Facing: 512 + Location: 63,20 + Actor1727: reap + Owner: CyborgSlaves + SubCell: 2 + Facing: 512 + Location: 63,20 + Actor1728: reap + Owner: CyborgSlaves + SubCell: 4 + Facing: 512 + Location: 63,20 + Actor1729: reap + Owner: CyborgSlaves + SubCell: 5 + Facing: 512 + Location: 63,20 + Actor1733: reap + Owner: CyborgSlaves + SubCell: 1 + Facing: 512 + Location: 69,20 + Actor1734: reap + Owner: CyborgSlaves + SubCell: 2 + Facing: 512 + Location: 69,20 + Actor1735: reap + Owner: CyborgSlaves + SubCell: 4 + Facing: 512 + Location: 69,20 + Actor1736: reap + Owner: CyborgSlaves + SubCell: 5 + Facing: 512 + Location: 69,20 + CyborgWormhole1: waypoint + Owner: Neutral + Location: 62,22 + CyborgWormhole2: waypoint + Owner: Neutral + Location: 70,22 + Actor1632: rea2 + Owner: Scrin + Location: 59,8 + Actor1719: rea2 + Owner: Scrin + Location: 87,24 + Actor1720: reac + Owner: Scrin + Location: 43,20 + Actor1215: s1 + Owner: Scrin + Facing: 384 + Location: 69,11 + SubCell: 3 + Actor1244: shrw + Owner: Scrin + Facing: 626 + Location: 66,9 + Actor1721: rea2 + Owner: Scrin + Location: 69,8 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, singularity-rules.yaml + +Sequences: singularity-sequences.yaml + +Weapons: ca|weapons/custom/campaign.yaml, singularity-weapons.yaml diff --git a/mods/ca/missions/main-campaign/ca30-singularity/outro.aud b/mods/ca/missions/main-campaign/ca30-singularity/outro.aud new file mode 100644 index 0000000000..a4bb5b888f Binary files /dev/null and b/mods/ca/missions/main-campaign/ca30-singularity/outro.aud differ diff --git a/mods/ca/missions/main-campaign/ca30-singularity/pilot_approach.aud b/mods/ca/missions/main-campaign/ca30-singularity/pilot_approach.aud new file mode 100644 index 0000000000..975bfeccb9 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca30-singularity/pilot_approach.aud differ diff --git a/mods/ca/missions/main-campaign/ca30-singularity/pilot_barelyscratch.aud b/mods/ca/missions/main-campaign/ca30-singularity/pilot_barelyscratch.aud new file mode 100644 index 0000000000..607fb928c6 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca30-singularity/pilot_barelyscratch.aud differ diff --git a/mods/ca/missions/main-campaign/ca30-singularity/pilot_begin.aud b/mods/ca/missions/main-campaign/ca30-singularity/pilot_begin.aud new file mode 100644 index 0000000000..c9287f11f8 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca30-singularity/pilot_begin.aud differ diff --git a/mods/ca/missions/main-campaign/ca30-singularity/pilot_engaging.aud b/mods/ca/missions/main-campaign/ca30-singularity/pilot_engaging.aud new file mode 100644 index 0000000000..d603680531 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca30-singularity/pilot_engaging.aud differ diff --git a/mods/ca/missions/main-campaign/ca30-singularity/pilot_goingin.aud b/mods/ca/missions/main-campaign/ca30-singularity/pilot_goingin.aud new file mode 100644 index 0000000000..6a4f81fa2f Binary files /dev/null and b/mods/ca/missions/main-campaign/ca30-singularity/pilot_goingin.aud differ diff --git a/mods/ca/missions/main-campaign/ca30-singularity/seth_hackers.aud b/mods/ca/missions/main-campaign/ca30-singularity/seth_hackers.aud new file mode 100644 index 0000000000..15a5734afe Binary files /dev/null and b/mods/ca/missions/main-campaign/ca30-singularity/seth_hackers.aud differ diff --git a/mods/ca/missions/main-campaign/ca30-singularity/seth_morehackers.aud b/mods/ca/missions/main-campaign/ca30-singularity/seth_morehackers.aud new file mode 100644 index 0000000000..f4263ca748 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca30-singularity/seth_morehackers.aud differ diff --git a/mods/ca/missions/main-campaign/ca30-singularity/singularity-rules.yaml b/mods/ca/missions/main-campaign/ca30-singularity/singularity-rules.yaml new file mode 100644 index 0000000000..68205e44dc --- /dev/null +++ b/mods/ca/missions/main-campaign/ca30-singularity/singularity-rules.yaml @@ -0,0 +1,500 @@ +^Palettes: + PaletteFromFile@terrain-temperat: + Filename: ca|missions/main-campaign/ca19-proliferation/charred.pal + TintPostProcessEffect: + Red: 1 + Green: 1 + Blue: 1.1 + Ambient: 0.8 + FlashPostProcessEffect@CHRONO: + Type: Chronoshift + +^BaseWorld: + TerrainLighting: + +World: + LuaScript: + Scripts: campaign.lua, singularity.lua + MissionData: + Briefing: We have reached the main Scrin stronghold. A huge craft hovers in the sky above it and is channeling some kind of energy into the ground below. This must be how the gateway is being opened. We don't know how much time we have, but this mothership must be destroyed before its task is complete.\n\nYour first obstacle will be the human armies that have been enslaved. The Scrin are using Allied, Soviet and Nod forces as a first line of defense. Destroy them if necessary, but we may be able to release them from Scrin control the same way we did for our own forces.\n\nThe defenses surrounding the main stronghold are being empowered and are consuming enormous amounts of energy. It is unlikely we'll be able to break these defenses unless we can inflict significant damage to the Scrin power infrastructure.\n\nThe mothership itself is protected by an energy shield; we don't yet know how effective our weapons will be against it. Satellite images also show a large number of cyborgs guarding it, which will make a ground assault extremely difficult.\n\nTo that end, a squadron of our advanced interceptors is prepared to strike the mothership. We believe they will be able to evade the Scrin air defenses for long enough to launch a single volley of missiles. We can only hope this will be enough to break through the shields.\n\nIf all else fails, use whatever means necessary to bring the shields down and destroy the mothership. The entire GDI arsenal is at your disposal.\n\nGood luck commander. + MapOptions: + ShortGameCheckboxEnabled: False + MusicPlaylist: + StartingMusic: target + MapBuildRadius: + AllyBuildRadiusCheckboxEnabled: True + +Player: + PlayerResources: + DefaultCash: 6000 + +^AiExtraPower: + PowerMultiplier@EXTRAPOWER: + Modifier: 200 + +SILO.SCRIN: + Power: + Amount: 0 + +SILO.SCRINBLUE: + Inherits: SILO.SCRIN + +WORMHOLE: + -Selectable: + Interactable: + DamageMultiplier@INVULN: + Modifier: 0 + TerrainLightSource: + Range: 6c0 + Intensity: 0.5 + BlueTint: 1 + RedTint: 0.2 + +WORMHOLEXXL: + ExternalCondition@KaneRevealed: + Condition: kane-revealed + ProximityExternalCondition@KaneRevealed: + Condition: kane-revealed + Range: 20c0 + RequiresCondition: kane-revealed + ValidRelationships: Enemy, Ally, Neutral + TerrainLightSource: + Range: 6c0 + Intensity: 0.5 + BlueTint: 1 + RedTint: 0.2 + +MSHP: + Inherits@CAMPAIGNDISABLED: ^Disabled + Armament@PRIMARYNEW: + Weapon: GatewayOpener + Turret: none + LocalOffset: 0,0,-940 + -Armament@PRIMARY: + -Armament@SECONDARY: + -Armament@TERTIARY: + Aircraft: + -CruisingCondition: + AttackTurreted: + Armaments: primary + -GrantConditionOnAttack@CHARGING: + -AmbientSoundCA@CHARGING: + -AmmoPool: + -ReloadAmmoPoolCA@CHARGE: + -ReloadAmmoPoolCA@DRAIN: + -KillsSelf@Emp: + AmbientSoundCA: + -RequiresCondition: + AudibleThroughFog: false + Health: + HP: 525000 + Shielded: + MaxStrength: 1500000 + RegenAmount: 1000 + RegenDelay: 750 + RequiresCondition: mothership-shields + GrantConditionOnPrerequisite@MSHPSHIELDS: + Condition: mothership-shields + Prerequisites: mothership.shields + WithFacingSpriteBody@SHIELDS: + RequiresCondition: mothership-shields + -GrantConditionOnPrerequisite@SHIELDS: + +MSHP.Husk: + FallsToEarth: + Explosion: MothershipExplosion + +MSHP.Husk.Ground: + FireWarheadsOnDeath: + Weapon: MothershipExplosion + +MAST: + Inherits@CAMPAIGNDISABLED: ^Disabled + MindController: + Capacity: 5 + Health: + HP: 32000 + DamageTypeDamageMultiplier@FLAKARMOR: + -RequiresCondition: + DamageTypeDamageMultiplier@FLAKARMORMINOR: + -RequiresCondition: + -GrantConditionOnPrerequisite@CARAPACE: + -ChangesHealth@CommandoRegen: + +QTNK: + -FirepowerMultiplier@MADIC: + ExternalCondition@IC: + Condition: invulnerability + WithRestartableIdleOverlay@IC: + PlayOnce: true + Image: explosion + Sequence: ironcurtain_effect + Palette: effect-ignore-lighting-alpha85 + RequiresCondition: invulnerability + +^ScrinDefenseBuffs: + GrantConditionOnPrerequisite@BUFF1: + Condition: scol-buff + Prerequisites: scrindefensebuff1 + GrantConditionOnPrerequisite@BUFF2: + Condition: scol-buff + Prerequisites: scrindefensebuff2 + DamageMultiplier@BUFF1: + RequiresCondition: scol-buff == 1 + Modifier: 40 + DamageMultiplier@BUFF2: + RequiresCondition: scol-buff == 2 + Modifier: 25 + FirepowerMultiplier@BUFF1: + RequiresCondition: scol-buff == 1 + Modifier: 125 + FirepowerMultiplier@BUFF2: + RequiresCondition: scol-buff == 2 + Modifier: 150 + RangeMultiplier@BUFF1: + RequiresCondition: scol-buff == 1 + Modifier: 120 + RangeMultiplier@BUFF2: + RequiresCondition: scol-buff == 2 + Modifier: 130 + WithIdleOverlay@BUFF1: + Image: resconv + Sequence: green + Palette: scrin + RequiresCondition: scol-buff == 1 + Offset: 0,0,300 + WithIdleOverlay@BUFF2: + Image: resconv + Sequence: blue + Palette: scrin + RequiresCondition: scol-buff == 2 + Offset: 0,0,300 + +PTUR: + Inherits@SCRINDEFENSEBUFFS: ^ScrinDefenseBuffs + +SCOL: + Inherits@SCRINDEFENSEBUFFS: ^ScrinDefenseBuffs + +SSPK: + -GrantConditionOnPrerequisite@BUFF1: + -GrantConditionOnPrerequisite@BUFF2: + DummyConditionGranter@BUFF: + Condition: scol-buff + +SHAR: + Inherits@SCRINDEFENSEBUFFS: ^ScrinDefenseBuffs + +TSLA: + -Targetable@TeslaBoost: + +scrindefensebuff1: + AlwaysVisible: + Interactable: + ScriptTriggers: + ProvidesPrerequisite: + +scrindefensebuff2: + AlwaysVisible: + Interactable: + ScriptTriggers: + ProvidesPrerequisite: + +mothership.shields: + AlwaysVisible: + Interactable: + ScriptTriggers: + ProvidesPrerequisite: + +^BlueBuff: + WithIdleOverlay@BLUEBUFF: + Image: bluebuff + Sequence: idle + Offset: 0,0,300 + Palette: scrin + RequiresCondition: bluebuff + DamageMultiplier@BLUEBUFF: + Modifier: 15 + RequiresCondition: bluebuff + ChangesHealth@BLUEBUFF: + PercentageStep: 2 + Delay: 15 + StartIfBelow: 100 + Mobile: + PauseOnCondition: !kane-revealed && bluebuff + ExternalCondition@BLUEBUFF: + Condition: bluebuff + ExternalCondition@Warned: + Condition: warned + ExternalCondition@KANE: + Condition: kane-revealed + ExternalCondition@PROVOKED: + Condition: provoked + RangeMultiplier@PROVOKED: + Modifier: 125 + RequiresCondition: provoked + AttackFrontal: + PauseOnCondition: !kane-revealed && bluebuff && !provoked + FacingTolerance: 128 + Targetable@Warned: + TargetTypes: NoAutoTarget + RequiresCondition: warned && !provoked + +RMBC: + Inherits@BLUEBUFF: ^BlueBuff + +ENLI: + Inherits@BLUEBUFF: ^BlueBuff + +TPLR: + Inherits@BLUEBUFF: ^BlueBuff + Health: + HP: 30000 + -AttackFrontal: + AttackFrontalCharged: + PauseOnCondition: !kane-revealed && bluebuff && !provoked + FacingTolerance: 128 + +REAP: + Inherits@BLUEBUFF: ^BlueBuff + +SIGN: + Inherits@HACKABLE: ^Hackable + Health: + HP: 300000 + Tooltip: + GenericVisibility: None + TooltipExtras: + Attributes: • Maximum 1 can be built\n• Cannot be captured + RepairableBuilding: + RepairStep: 1500 + RepairPercent: 0 + Power: + Amount: 0 + -RecallPower@Recall: + GrantTimedCondition@HackedProtection: + Condition: hacked-protection + Duration: 250 + RequiresCondition: hacked + DamageMultiplier@HackedProtection: + Modifier: 0 + RequiresCondition: hacked-protection + +YF23.Interceptor: + Inherits: MIG + Inherits: ^TDPalette + -Buildable: + Rearmable: + RearmActors: wormhole + Repairable: + RepairActors: wormhole + RenderSprites: + Image: yf23 + Aircraft: + Speed: 400 + Health: + HP: 500000 + Armament@AA: + Weapon: WidowAA2 + LocalOffset: 0,-640,0, 0,640,0 + LocalYaw: -40, 40 + PauseOnCondition: !ammo + Name: secondary + AmmoPool: + Ammo: 12 + -Selectable: + RejectsOrders: + Interactable: + Contrail@1: + Offset: -325,483,0 + Contrail@2: + Offset: -325,-483,0 + Contrail@AB1: + Offset: -400,-80,-10 + Contrail@AB2: + Offset: -400,80,-10 + -Targetable@AIRBORNE: + Targetable@YF23: + TargetTypes: YF23 + RevealsShroud: + Range: 7c0 + MinRange: 5c0 + RevealsShroud@GAPGEN: + Range: 5c0 + Type: GroundPosition + SpawnActorOnDeath: + Actor: YF23.Husk + SpawnActorOnDeath@EMP: + Actor: YF23.Husk.EMP + SpawnActorOnDeath@Empty: + Actor: YF23.Husk + SpawnActorOnDeath@EmptyEMP: + Actor: YF23.Husk.EMP + +^AutoTargetAirICBM: + AutoTargetPriority@DEFAULT: + ValidTargets: Air, AirSmall, ICBM, YF23 + +CTNK.Reinforce: + Inherits: CTNK + RenderSprites: + Image: ctnk + WithRestartableIdleOverlay@WARPIN: + PlayOnce: true + Image: chronobubble + Sequence: warpin + Palette: ra2effect-ignore-lighting-alpha75 + +AFLD.GDI: + -InterceptorPower@AirDef: + +HPAD.TD: + -InterceptorPower@AirDef: + +KANE: + Inherits: ^Soldier + Tooltip: + Name: Kane + Health: + HP: 5000000 + Mobile: + Speed: 60 + RevealsShroud: + Range: 10c0 + -Crushable: + -TakeCover: + WithInfantryBody: + IdleSequences: stand + StandSequences: stand + -Targetable: + DamageMultiplier@invulv: + Modifier: 0 + +HACK: + -Valued: + Health: + HP: 10000 + +NERV: + DetonateWeaponPower@BUZZERSWARMAI: + Prerequisites: nerv + ChargeInterval: 6750 + DetonateWeaponPower@STORMSPIKE: + Prerequisites: nerv + +UAV: + -Targetable@AIRBORNE: + RevealsShroud: + Range: 10c0 + MinRange: 8c0 + RevealsShroud@GAPGEN: + Range: 8c0 + +# Enable subfaction specific tech + +STWR: + Buildable: + Prerequisites: vehicles.any, ~structures.gdi + +TITN: + Buildable: + Prerequisites: gtek, ~!railgun.upgrade + +TITN.RAIL: + Buildable: + Prerequisites: gtek, ~railgun.upgrade + +JUGG: + Buildable: + Prerequisites: gtek, ~vehicles.gdi + +HSAM: + Buildable: + Prerequisites: anyradar, ~vehicles.gdi + +MDRN: + Buildable: + Prerequisites: anyradar, ~vehicles.gdi + +GDRN: + Buildable: + Prerequisites: ~vehicles.gdi, ~!tow.upgrade + +GDRN.TOW: + Buildable: + Prerequisites: ~vehicles.gdi, ~tow.upgrade + +WOLV: + Buildable: + Prerequisites: gtek, ~vehicles.gdi + +XO: + Buildable: + Prerequisites: gtek, ~vehicles.gdi + +PBUL: + Buildable: + Prerequisites: gtek, ~vehicles.gdi + +AURO: + Buildable: + Prerequisites: afld.gdi, gtek + +gyro.upgrade: + Buildable: + Prerequisites: gtek + +abur.upgrade: + Buildable: + Prerequisites: gtek + +bdrone.upgrade: + Buildable: + Prerequisites: gtek + +railgun.upgrade: + Buildable: + Prerequisites: upgc + +ionmam.upgrade: + Buildable: + Prerequisites: upgc, !mdrone.upgrade, !hovermam.upgrade + TooltipExtras: + Attributes: \n(!) Only ONE Mammoth Tank upgrade can be chosen + +hovermam.upgrade: + Buildable: + Prerequisites: upgc, !ionmam.upgrade, !mdrone.upgrade + TooltipExtras: + Attributes: \n(!) Only ONE Mammoth Tank upgrade can be chosen + +mdrone.upgrade: + Buildable: + Prerequisites: upgc, !ionmam.upgrade, !hovermam.upgrade + TooltipExtras: + Attributes: \n(!) Only ONE Mammoth Tank upgrade can be chosen + +GTEK: + GrantExternalConditionPowerCA@NREPAIR: + Prerequisites: ~gtek + +HQ: + SpawnActorPower@GDIEagleDropzone: + Prerequisites: ~radar.gdi + BlockedCursor: move-blocked + ParatroopersPowerCA@xodrop: + Prerequisites: ~radar.gdi + DropPodsPowerCA@Zocom: + Prerequisites: ~radar.gdi + +# Hunt() requires only 1 AttackBase +DEVA: + -AttackFrontalCharged: + -Armament@PRIMARYUPG: + -AmbientSound@CHARGE: + -WithIdleOverlay@CHARGE1: + -WithIdleOverlay@CHARGE2: + -WithIdleOverlay@CHARGE3: + +BATF.AI: + -AttackFrontal: diff --git a/mods/ca/missions/main-campaign/ca30-singularity/singularity-sequences.yaml b/mods/ca/missions/main-campaign/ca30-singularity/singularity-sequences.yaml new file mode 100644 index 0000000000..19ea9d1cdd --- /dev/null +++ b/mods/ca/missions/main-campaign/ca30-singularity/singularity-sequences.yaml @@ -0,0 +1,101 @@ +wormholexxl: + idle: + Filename: wormholexxl.shp + Length: 13 + ZOffset: 1023 + BlendMode: Additive + die: + Filename: wormholexxl.shp + Length: 13 + ZOffset: 1023 + BlendMode: Additive + make: + Filename: wormholexxl.shp + Length: 13 + ZOffset: 1023 + BlendMode: Additive + +wormhole: + idle: + Filename: wormhole.shp + ZOffset: 9000 + die: + Filename: wormhole.shp + ZOffset: 9000 + make: + Filename: wormhole.shp + ZOffset: 9000 + +enrvbolthit: + idle2: + Filename: enrvbolthit.shp + BlendMode: Additive + Length: * + ZOffset: 2047 + FlipX: true + +bluebuff: + idle: + Filename: resconvsm.shp + Length: 10 + Start: 20 + ZOffset: 1023 + Tick: 80 + Alpha: 0.8 + +kane: + Inherits: ^CommonDeaths + stand: + Filename: kane.shp + Facings: 8 + run: + Filename: kane.shp + Start: 8 + Length: 6 + Facings: 8 + Tick: 100 + parachute: + Filename: kane.shp + Start: 3 + shoot: + Filename: yuria.shp + Length: 2 + Tick: 140 + Facings: 8 + die1: + Filename: kane.shp + Start: 139 + Length: 8 + die2: + Filename: kane.shp + Start: 147 + Length: 8 + die3: + Filename: kane.shp + Start: 155 + Length: 8 + die4: + Filename: kane.shp + Start: 163 + Length: 12 + die5: + Filename: kane.shp + Start: 175 + Length: 18 + die7: + Filename: kane.shp + Start: 139 + Length: 8 + chrono-overlay: + Filename: chronofade_small.shp + Length: * + BlendMode: Additive + Offset: 0, 0 + ZOffset: 512 + Tick: 80 + mind-overlay: + Filename: mindanim.shp + Length: * + Tick: 200 + BlendMode: Alpha + Offset: 0, 0 diff --git a/mods/ca/missions/main-campaign/ca30-singularity/singularity-weapons.yaml b/mods/ca/missions/main-campaign/ca30-singularity/singularity-weapons.yaml new file mode 100644 index 0000000000..2f022d5cce --- /dev/null +++ b/mods/ca/missions/main-campaign/ca30-singularity/singularity-weapons.yaml @@ -0,0 +1,124 @@ +GatewayOpener: + ReloadDelay: 25 + Range: 0c512 + TargetActorCenter: true + ValidTargets: Ground, Water + Projectile: PlasmaBeam + ForceVertical: true + Duration: 26 + Colors: 461fc609, 98177809 + InnerLightness: 240 + OuterLightness: 120 + Radius: 7 + Distortion: 128 + DistortionAnimation: 128 + SegmentLength: 250 + CenterBeamColor: ffffffcc + CenterBeam: true + CenterBeamWidth: 42 + SecondaryCenterBeam: true + SecondaryCenterBeamColor: ffffff44 + ZOffset: 2048 + RecalculateColors: true + RecalculateDistortionInterval: 3 + Warhead@1Dam: SpreadDamage + Damage: 0 + Warhead@5Shake: ShakeScreen + Duration: 5 + Intensity: 1 + Multiplier: 0.1,0.1 + Warhead@3Eff: CreateEffect + Explosions: idle + ExplosionPalette: scrin + Image: enrvbolthit + Warhead@4Eff: CreateEffect + Explosions: idle2 + ExplosionPalette: scrin + Image: enrvbolthit + Delay: 5 + Warhead@5Eff: CreateEffect + Explosions: idle + ExplosionPalette: scrin + Image: enrvbolthit + Delay: 10 + Warhead@6Eff: CreateEffect + Explosions: idle2 + ExplosionPalette: scrin + Image: enrvbolthit + Delay: 15 + Warhead@7Eff: CreateEffect + Explosions: idle + ExplosionPalette: scrin + Image: enrvbolthit + Delay: 20 + +WidowAA2: + Inherits: WidowAA + ReloadDelay: 8 + Range: 26c0 + Burst: 2 + BurstDelays: 0 + TargetActorCenter: true + Projectile: MissileCA + Speed: 600 + ContrailLength: 8 + LockOnInaccuracy: 1c512 + Inaccuracy: 1c512 + Acceleration: 600 + ContrailStartColor: FF660066 + PointDefenseType: None + RangeLimit: 26c0 + Warhead@1Dam: SpreadDamage + Damage: 5000 + Warhead@3Eff: CreateEffect + Explosions: large_artillery_explosion + +ShardLauncher: + ValidTargets: Air, AirSmall, ICBM, YF23 + Warhead@1Dam: SpreadDamage + ValidTargets: Air, ICBM, YF23 + +ShardWalkerShardsAA: + ValidTargets: Air, AirSmall, ICBM + Warhead@1Dam: SpreadDamage + ValidTargets: Air, ICBM + +ZSU-23: + ValidTargets: Air, AirSmall, ICBM, YF23 + Warhead@1Dam: SpreadDamage + ValidTargets: Air, ICBM, YF23 + +EnslaveVehicle: + Range: 7c0 + ReloadDelay: 35 + +MothershipExplosion: + Inherits: KirovExplode + ValidTargets: Ground, Water, Air, Wormhole + Projectile: InstantExplode + Warhead@defKiller: SpreadDamage + Damage: 300000 + Spread: 12c0 + Falloff: 100, 100, 0 + ValidTargets: Defense + Warhead@infKiller: SpreadDamage + Delay: 10 + Damage: 300000 + Spread: 12c0 + Falloff: 100, 100, 0 + ValidTargets: Infantry + InvalidTargets: Cyborg + DamageTypes: Prone50Percent, TriggerProne, FireDeath, Incendiary + Warhead@wallKiller: SpreadDamage + Spread: 12c0 + Damage: 80000 + ValidTargets: Wall + Warhead@emp: GrantExternalConditionCA + Range: 20c0 + Duration: 3000 + Condition: empdisable + ValidTargets: Vehicle, Defense, Air + InvalidTargets: Cyborg + Warhead@empEffect: CreateEffect + ExplosionPalette: tsunit-ignore-lighting-alpha75 + Explosions: pulse_explosion3 diff --git a/mods/ca/missions/main-campaign/ca30-singularity/singularity.lua b/mods/ca/missions/main-campaign/ca30-singularity/singularity.lua new file mode 100644 index 0000000000..9de72a5997 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca30-singularity/singularity.lua @@ -0,0 +1,933 @@ +MissionDir = "ca|missions/main-campaign/ca30-singularity" + +NWReactors = { NWPower1, NWPower2, NWPower3, NWPower4, NWPower5, NWPower6, NWPower7, NWPower8 } + +NEReactors = { NEPower1, NEPower2, NEPower3, NEPower4, NEPower5, NEPower6, NEPower7, NEPower8 } + +AdjustedScrinCompositions = AdjustCompositionsForDifficulty(UnitCompositions.Scrin) + +Squads = { + ScrinWest = { + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 40, Max = 40 }), + InitTime = DateTime.Minutes(2), + FollowLeader = true, + ProducerActors = { Infantry = { WestPortal }, Vehicles = { WestWarpSphere } }, + Compositions = AdjustedScrinCompositions, + AttackPaths = { + { WestAttackNode1.Location, WestAttackNode2.Location, WestAttackNode5.Location }, + { WestAttackNode1.Location, WestAttackNode2.Location, WestAttackNode3.Location, WestAttackNode4.Location, WestAttackNode5.Location }, + }, + }, + ScrinEast = { + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 40, Max = 40 }), + InitTime = DateTime.Minutes(4), + FollowLeader = true, + ProducerActors = { Infantry = { EastPortal }, Vehicles = { EastWarpSphere } }, + Compositions = AdjustedScrinCompositions, + AttackPaths = { + { EastAttackNode1.Location, EastAttackNode2.Location, EastAttackNode3.Location, EastAttackNode4.Location, EastAttackNode5.Location }, + { EastAttackNode1.Location, EastAttackNode5.Location }, + }, + }, + ScrinCenter = { + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 40, Max = 40 }), + InitTime = 0, + FollowLeader = true, + ProducerActors = { Infantry = { CenterPortal }, Vehicles = { CenterWarpSphere } }, + Compositions = AdjustedScrinCompositions, + AttackPaths = { { CenterAttackNode1.Location, CenterAttackNode2.Location, CenterAttackNode3.Location } }, + }, + SovietSlaves = { + Delay = AdjustDelayForDifficulty(DateTime.Seconds(150)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 16, Max = 26, RampDuration = DateTime.Minutes(14) }), + ActiveCondition = function() + return not SovietsFreed + end, + FollowLeader = true, + Compositions = AdjustCompositionsForDifficulty(UnitCompositions.Soviet), + AttackPaths = { { WestAttackNode4.Location, WestAttackNode5.Location } }, + }, + NodSlaves = { + Delay = AdjustDelayForDifficulty(DateTime.Seconds(150)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 16, Max = 26, RampDuration = DateTime.Minutes(14) }), + ActiveCondition = function() + return not NodFreed + end, + DispatchDelay = DateTime.Seconds(15), + FollowLeader = true, + Compositions = AdjustCompositionsForDifficulty(UnitCompositions.Nod), + AttackPaths = { { EastAttackNode4.Location, EastAttackNode5.Location } }, + }, + AlliedSlaves = { + Delay = AdjustDelayForDifficulty(DateTime.Seconds(150)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 16, Max = 26, RampDuration = DateTime.Minutes(14) }), + ActiveCondition = function() + return not AlliesFreed + end, + FollowLeader = true, + Compositions = AdjustCompositionsForDifficulty(UnitCompositions.Allied), + AttackPaths = { { CenterAttackNode3.Location } }, + }, + USSR = { + AttackValuePerSecond = { Min = 25, Max = 25 }, + FollowLeader = true, + Compositions = AdjustCompositionsForDifficulty(UnitCompositions.Soviet, "normal"), + AttackPaths = { { WestAttackNode2.Location, WestAttackNode1.Location, WormholeWP.Location } }, + }, + Nod = { + AttackValuePerSecond = { Min = 25, Max = 25 }, + DispatchDelay = DateTime.Seconds(15), + FollowLeader = true, + Compositions = AdjustCompositionsForDifficulty(UnitCompositions.Nod, "normal"), + AttackPaths = { { EastAttackNode2.Location, EastAttackNode1.Location, WormholeWP.Location } }, + }, + Greece = { + AttackValuePerSecond = { Min = 25, Max = 25 }, + FollowLeader = true, + Compositions = AdjustCompositionsForDifficulty(UnitCompositions.Allied, "normal"), + AttackPaths = { { CenterAttackNode2.Location, CenterAttackNode1.Location, WormholeWP.Location } }, + }, + ScrinAir = { + Delay = AdjustAirDelayForDifficulty(DateTime.Minutes(5)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 12, Max = 12 }), + Compositions = AirCompositions.Scrin + }, +} + +RiftEnabledTime = { + easy = DateTime.Seconds((60 * 45) + 17), + normal = DateTime.Seconds((60 * 30) + 17), + hard = DateTime.Seconds((60 * 15) + 17), + vhard = DateTime.Seconds((60 * 15) + 17), + brutal = DateTime.Seconds((60 * 10) + 17) +} + +MADTankAttackDelay = DateTime.Minutes(3) + +ChronoTanksDelay = { + easy = DateTime.Minutes(3), + normal = DateTime.Minutes(3), + hard = DateTime.Minutes(3), + vhard = DateTime.Minutes(3), + brutal = DateTime.Minutes(3) +} + +HackersDelay = { + easy = DateTime.Minutes(2), + normal = DateTime.Minutes(2), + hard = DateTime.Minutes(2), + vhard = DateTime.Minutes(2), + brutal = DateTime.Minutes(2) +} + +SetupPlayers = function() + GDI = Player.GetPlayer("GDI") + Greece = Player.GetPlayer("Greece") + USSR = Player.GetPlayer("USSR") + Nod = Player.GetPlayer("Nod") + Scrin = Player.GetPlayer("Scrin") + AlliedSlaves = Player.GetPlayer("AlliedSlaves") + SovietSlaves = Player.GetPlayer("SovietSlaves") + NodSlaves = Player.GetPlayer("NodSlaves") + CyborgSlaves = Player.GetPlayer("CyborgSlaves") + Kane = Player.GetPlayer("Kane") + NeutralGDI = Player.GetPlayer("NeutralGDI") + NeutralScrin = Player.GetPlayer("NeutralScrin") + SignalTransmitterPlayer = Player.GetPlayer("SignalTransmitterPlayer") -- separate player to prevent AI from attacking it + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = { GDI } + MissionEnemies = { Scrin, SovietSlaves, AlliedSlaves, NodSlaves } +end + +WorldLoaded = function() + SetupPlayers() + + TimerTicks = 0 + Camera.Position = PlayerStart.CenterPosition + + InitObjectives(GDI) + AdjustPlayerStartingCashForDifficulty() + InitScrin() + InitNodSlaves() + InitSovietSlaves() + InitAlliedSlaves() + + if Difficulty == "easy" then + HardNormalAA1.Destroy() + HardNormalAA2.Destroy() + HardNormalAA3.Destroy() + end + + ObjectiveDestroyMothership = GDI.AddObjective("Destroy the Scrin Mothership.") + + Trigger.OnAllKilledOrCaptured(NWReactors, function() + ScrinDefenseBuff1.Destroy() + Notification("The north-western reactors have been destroyed. Scrin defenses have been weakened.") + MediaCA.PlaySound(MissionDir .. "/c_nwreactorsdown.aud", 2) + + if ScrinDefenseBuff2.IsDead then + IonConduits.Destroy() + if NodFreed then + InitHackers(HackersDelay[Difficulty]) + end + end + + if MADTank ~= nil and not MADTank.IsDead and MADTankInvulnToken ~= nil then + MADTank.RevokeCondition(MADTankInvulnToken) + end + end) + + Trigger.OnAllKilledOrCaptured(NEReactors, function() + ScrinDefenseBuff2.Destroy() + Notification("The north-eastern reactors have been destroyed. Scrin defenses have been weakened.") + MediaCA.PlaySound(MissionDir .. "/c_nereactorsdown.aud", 2) + + if ScrinDefenseBuff1.IsDead then + IonConduits.Destroy() + if NodFreed then + InitHackers(HackersDelay[Difficulty]) + end + end + end) + + Trigger.OnKilled(AlliedMastermind, function(self, killer) + FlipSlaveFaction(AlliedSlaves, killer) + end) + Trigger.OnKilled(SovietMastermind, function(self, killer) + FlipSlaveFaction(SovietSlaves, killer) + end) + Trigger.OnKilled(NodMastermind, function(self, killer) + FlipSlaveFaction(NodSlaves, killer) + end) + + Trigger.AfterDelay(DateTime.Seconds(5), function() + Media.DisplayMessage("Beginning our attack run. Let's see what we're up against. Over.", "GDI Pilot", HSLColor.FromHex("F2CF74")) + MediaCA.PlaySound(MissionDir .. "/pilot_begin.aud", 1.5) + end) + + Trigger.AfterDelay(DateTime.Seconds(10), function() + DoInterceptors() + Trigger.AfterDelay(DateTime.Seconds(15), function() + Media.DisplayMessage("We barely made a scratch! We'll need you to bring those shields down before we can do any damage. Over and out.", "GDI Pilot", HSLColor.FromHex("F2CF74")) + MediaCA.PlaySound(MissionDir .. "/pilot_barelyscratch.aud", 1.5) + end) + end) + + Trigger.OnKilled(Mothership, function(self, killer) + DoFinale() + end) + + Trigger.OnDamaged(SignalTransmitter, function(self, attacker, damage) + if IsMissionPlayer(attacker.Owner) and self.Health < (self.MaxHealth - self.MaxHealth / 3) then + InitHackers(0) + end + end) + + Trigger.OnEnteredProximityTrigger(SignalTransmitter.CenterPosition, WDist.New(9 * 1024), function(a, id) + if IsMissionPlayer(a.Owner) and a.HasProperty("Health") and not a.HasProperty("Land") then + Trigger.RemoveProximityTrigger(id) + InitHackers(0) + end + end) + + Trigger.OnEnteredProximityTrigger(WormholeWP.CenterPosition, WDist.New(6 * 1024), function(a, id) + if a.Owner == Nod and not a.IsDead and a.HasProperty("Hunt") then + a.Stop() + Trigger.ClearAll(a) + a.Hunt() + end + end) + + Trigger.OnKilled(SignalTransmitter, function(self, killer) + CreatePermanentMothershipCamera() + if ObjectiveHackSignalTransmitter ~= nil and not GDI.IsObjectiveCompleted(ObjectiveHackSignalTransmitter) then + GDI.MarkFailedObjective(ObjectiveHackSignalTransmitter) + Trigger.AfterDelay(DateTime.Seconds(2), function() + Media.DisplayMessage("The Signal Transmitter has been destroyed! Your only option now is to use brute force to bring those shields down. I only hope you can do it in time.", "Nod Commander", HSLColor.FromHex("FF0000")) + end) + end + end) + + local cyborgs = CyborgSlaves.GetActorsByTypes({ "rmbc", "enli", "tplr", "reap" }) + Utils.Do(cyborgs, function(c) + c.GrantCondition("bluebuff") + + Trigger.OnDamaged(c, function(self, attacker, damage) + if not SleepingCyborgsMessageShown and not Mothership.IsDead and not self.IsDead and self.Health < self.MaxHealth * 0.8 then + SleepingCyborgsMessageShown = true + Notification("Nod cyborgs appear to be in a hibernation state. The enriched Tiberium is providing powerful regeneration. Recommendation is to not engage.") + MediaCA.PlaySound(MissionDir .. "/c_hibernation.aud", 2) + Utils.Do(cyborgs, function(c) + if not c.IsDead then + c.GrantCondition("warned") + end + end) + end + end) + end) + + Trigger.OnAnyKilled(cyborgs, function() + if not CyborgsProvoked then + CyborgsProvoked = true + Utils.Do(cyborgs, function(c) + if not c.IsDead then + c.Stop() + c.GrantCondition("provoked") + ClearCyborgTarget(c) + end + end) + end + end) + + SetupReveals({ EntranceReveal1, EntranceReveal2, EntranceReveal3, GrandCannonReveal1, GrandCannonReveal2 }) + AfterWorldLoaded() +end + +MoveToWormhole = function(a) + if not a.IsDead then + a.Stop() + a.Scatter() + a.Move(WormholeWP.Location) + local randomDelay = Utils.RandomInteger(DateTime.Seconds(7), DateTime.Seconds(12)) + Trigger.AfterDelay(randomDelay, function() + MoveToWormhole(a) + end) + end +end + +Tick = function() + OncePerSecondChecks() + OncePerFiveSecondChecks() + OncePerFifteenSecondChecks() + OncePerThirtySecondChecks() + PanToFinale() + AfterTick() +end + +ClearCyborgTarget = function(cyborg) + if not IsFinaleStarted then + Trigger.AfterDelay(DateTime.Seconds(5), function() + if not cyborg.IsDead then + cyborg.Stop() + ClearCyborgTarget(cyborg) + end + end) + end +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + Scrin.Resources = Scrin.ResourceCapacity - 500 + SignalTransmitterPlayer.Resources = SignalTransmitterPlayer.ResourceCapacity - 500 + NodSlaves.Resources = NodSlaves.ResourceCapacity - 500 + AlliedSlaves.Resources = AlliedSlaves.ResourceCapacity - 500 + SovietSlaves.Resources = SovietSlaves.ResourceCapacity - 500 + Nod.Resources = Nod.ResourceCapacity - 500 + USSR.Resources = USSR.ResourceCapacity - 500 + Greece.Resources = Greece.ResourceCapacity - 500 + + if TimerTicks > 0 then + if TimerTicks > 25 then + TimerTicks = TimerTicks - 25 + else + TimerTicks = 0 + end + end + + if MissionPlayersHaveNoRequiredUnits() and not GDI.IsObjectiveCompleted(ObjectiveDestroyMothership) then + GDI.MarkFailedObjective(ObjectiveDestroyMothership) + end + + RemoveCyborgsAtWormhole() + end +end + +OncePerFiveSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 125 == 0 then + UpdatePlayerBaseLocations() + + if not ShieldsOffline and not SignalTransmitter.IsDead and IsMissionPlayer(SignalTransmitter.Owner) then + ShieldsOffline = true + MothershipShields.Destroy() + CreatePermanentMothershipCamera() + + if ObjectiveHackSignalTransmitter ~= nil then + GDI.MarkCompletedObjective(ObjectiveHackSignalTransmitter) + end + + Notification("The Mothership's shields are down. Air attacks resuming.") + MediaCA.PlaySound(MissionDir .. "/c_resuming.aud", 2) + + Trigger.AfterDelay(DateTime.Seconds(10), function() + DoInterceptors() + MediaCA.PlaySound(MissionDir .. "/pilot_engaging.aud", 1.5) + + Trigger.AfterDelay(DateTime.Seconds(15), function() + if not Mothership.IsDead then + Notification("Attack run successful. The Mothership's hull has sustained significant damage. Next attack run ETA 2 minutes.") + MediaCA.PlaySound(MissionDir .. "/c_attackrunsuccess.aud", 2) + + Trigger.AfterDelay(DateTime.Minutes(2), function() + DoInterceptors() + MediaCA.PlaySound(MissionDir .. "/pilot_goingin.aud", 1.5) + + Trigger.AfterDelay(DateTime.Seconds(15), function() + if not Mothership.IsDead then + Notification("Estimate one more pass to destroy the Mothership, ETA 2 minutes.") + MediaCA.PlaySound(MissionDir .. "/c_onemorepass.aud", 2) + + Trigger.AfterDelay(DateTime.Minutes(2), function() + DoInterceptors() + MediaCA.PlaySound(MissionDir .. "/pilot_approach.aud", 1.5) + end) + end + end) + end) + end + end) + end) + end + end +end + +OncePerFifteenSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % DateTime.Seconds(15) == 0 then + if NodFreed and FirstHackersArrived and not MoreHackersRequested and not ShieldsOffline and not SignalTransmitter.IsDead then + local numHackers = #GetMissionPlayersActorsByType("hack") + local transports = GetMissionPlayersActorsByTypes({ "tran", "halo", "apc", "btr", "apc2", "vulc", "sapc", "intl", "ifv" }) + Utils.Do(transports, function(t) + Utils.Do(t.Passengers, function(p) + if p.Type == "hack" then + numHackers = numHackers + 1 + end + end) + end) + + if numHackers == 0 then + MoreHackersRequested = true + + Trigger.AfterDelay(HackersDelay[Difficulty], function() + if SignalTransmitter.IsDead then + return + end + + DropHackers() + end) + end + end + end +end + +OncePerThirtySecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % DateTime.Seconds(30) == 0 then + CalculatePlayerCharacteristics() + end +end + +InitScrin = function() + RebuildExcludes.Scrin = { Types = { "sign", "rfgn", "silo.scrinblue" }, Actors = Utils.Concat(NWReactors, NEReactors) } + + AutoRepairBuildings(SignalTransmitterPlayer) + + AutoRepairAndRebuildBuildings(Scrin, 15) + SetupRefAndSilosCaptureCredits(Scrin) + AutoReplaceHarvesters(Scrin) + AutoRebuildConyards(Scrin) + InitAiUpgrades(Scrin) + InitAirAttackSquad(Squads.ScrinAir, Scrin) + + local scrinGroundAttackers = Scrin.GetGroundAttackers() + + Utils.Do(scrinGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsScrinGroundHunterUnit) + end) + + Mothership.Attack(Wormhole, true, true) + IonConduits = Actor.Create("ioncon.upgrade", true, { Owner = Scrin }) + ScrinDefenseBuff1 = Actor.Create("scrindefensebuff1", true, { Owner = Scrin }) + ScrinDefenseBuff2 = Actor.Create("scrindefensebuff2", true, { Owner = Scrin }) + MothershipShields = Actor.Create("mothership.shields", true, { Owner = Scrin }) + + Actor.Create("ai.minor.superweapons.enabled", true, { Owner = Scrin }) + + Trigger.AfterDelay(RiftEnabledTime[Difficulty], function() + Actor.Create("ai.superweapons.enabled", true, { Owner = Scrin }) + end) +end + +InitNodSlaves = function() + AutoRepairAndRebuildBuildings(NodSlaves, 15) + SetupRefAndSilosCaptureCredits(NodSlaves) + AutoReplaceHarvesters(NodSlaves) + InitAttackSquad(Squads.NodSlaves, NodSlaves) + + local nodGroundAttackers = NodSlaves.GetGroundAttackers() + + Utils.Do(nodGroundAttackers, function(a) + TargetSwapChance(a, 10) + end) +end + +InitSovietSlaves = function() + AutoRepairAndRebuildBuildings(SovietSlaves, 15) + SetupRefAndSilosCaptureCredits(SovietSlaves) + AutoReplaceHarvesters(SovietSlaves) + InitAttackSquad(Squads.SovietSlaves, SovietSlaves) + + local sovietGroundAttackers = SovietSlaves.GetGroundAttackers() + + Utils.Do(sovietGroundAttackers, function(a) + TargetSwapChance(a, 10) + end) +end + +InitAlliedSlaves = function() + AutoRepairAndRebuildBuildings(AlliedSlaves, 15) + SetupRefAndSilosCaptureCredits(AlliedSlaves) + AutoReplaceHarvesters(AlliedSlaves) + InitAttackSquad(Squads.AlliedSlaves, AlliedSlaves) + + local alliedGroundAttackers = AlliedSlaves.GetGroundAttackers() + + Utils.Do(alliedGroundAttackers, function(a) + TargetSwapChance(a, 10) + end) +end + +InitNod = function() + Trigger.AfterDelay(1, function() + AutoRepairAndRebuildBuildings(Nod, 15) + AutoReplaceHarvesters(Nod) + InitAttackSquad(Squads.Nod, Nod, Scrin) + end) +end + +InitUSSR = function() + Trigger.AfterDelay(1, function() + AutoRepairAndRebuildBuildings(USSR, 15) + AutoReplaceHarvesters(USSR) + InitAttackSquad(Squads.USSR, USSR, Scrin) + end) +end + +InitGreece = function() + Trigger.AfterDelay(1, function() + AutoRepairAndRebuildBuildings(Greece, 15) + AutoReplaceHarvesters(Greece) + InitAttackSquad(Squads.Greece, Greece, Scrin) + end) +end + +InitHackers = function(delay) + if FirstHackersRequested then + return + end + + FirstHackersRequested = true + + Trigger.AfterDelay(delay, function() + if SignalTransmitter.IsDead then + return + end + + DropHackers() + Beacon.New(GDI, SignalTransmitter.CenterPosition) + end) +end + +DropHackers = function() + Beacon.New(GDI, HackerDropLanding.CenterPosition) + + if not FirstHackersArrived then + MediaCA.PlaySound(MissionDir .. "/seth_hackers.aud", 2) + Media.DisplayMessage("Attention GDI commander. We are sending you some of our hackers. Use them to hack into the Scrin Signal Transmitter. They will be able to bring the Mothership's shields down for you.", "Nod Commander", HSLColor.FromHex("FF0000")) + else + MediaCA.PlaySound(MissionDir .. "/seth_morehackers.aud", 2) + Media.DisplayMessage("We are sending you another squad of hackers. Perhaps you'll be more careful with them this time.", "Nod Commander", HSLColor.FromHex("FF0000")) + end + + local hackerFlare = Actor.Create("flare", true, { Owner = GDI, Location = HackerDropLanding.Location }) + Trigger.AfterDelay(DateTime.Seconds(10), function() + hackerFlare.Destroy() + end) + + local entryPath = { HackerDropSpawn.Location, HackerDropLanding.Location } + DoHelicopterDrop(Nod, entryPath, "tran.evac", { "hack", "hack", "hack" }, nil, function(t) + Trigger.AfterDelay(DateTime.Seconds(5), function() + if not t.IsDead then + t.Move(entryPath[1]) + t.Destroy() + end + + local hackers = Nod.GetActorsByType("hack") + Utils.Do(hackers, function(a) + a.Owner = GDI + end) + + if not FirstHackersArrived then + if not SignalTransmitter.IsDead then + ObjectiveHackSignalTransmitter = GDI.AddSecondaryObjective("Hack Signal Transmitter to bring shields down.") + end + FirstHackersArrived = true + end + MoreHackersRequested = false + end) + end) +end + +InitChronoTanks = function() + Trigger.AfterDelay(ChronoTanksDelay[Difficulty], function() + if ScrinDefenseBuff2.IsDead then + return + end + + Notification("The Allies have provided a squadron of Chrono Tanks. Use them to destroy Scrin Reactors in the north-east.") + MediaCA.PlaySound(MissionDir .. "/c_chronotanks.aud", 2) + local northEastPowerFlare = Actor.Create("flare", true, { Owner = GDI, Location = NorthEastPowerBeacon.Location }) + Trigger.AfterDelay(DateTime.Seconds(10), function() + northEastPowerFlare.Destroy() + end) + + Beacon.New(GDI, NorthEastPowerBeacon.CenterPosition) + Beacon.New(GDI, ChronoTankBeacon.CenterPosition) + + Lighting.Flash("Chronoshift", 10) + Media.PlaySound("chrono2.aud") + Actor.Create("ctnk.reinforce", true, { Owner = GDI, Location = ChronoTankSpawn1.Location, Facing = Angle.NorthEast }) + Actor.Create("ctnk.reinforce", true, { Owner = GDI, Location = ChronoTankSpawn2.Location, Facing = Angle.NorthEast }) + Actor.Create("ctnk.reinforce", true, { Owner = GDI, Location = ChronoTankSpawn3.Location, Facing = Angle.NorthEast }) + Actor.Create("ctnk.reinforce", true, { Owner = GDI, Location = ChronoTankSpawn4.Location, Facing = Angle.NorthEast }) + Actor.Create("ctnk.reinforce", true, { Owner = GDI, Location = ChronoTankSpawn5.Location, Facing = Angle.NorthEast }) + Actor.Create("ctnk.reinforce", true, { Owner = GDI, Location = ChronoTankSpawn6.Location, Facing = Angle.NorthEast }) + end) +end + +InitMADTankAttack = function() + Trigger.AfterDelay(MADTankAttackDelay - DateTime.Seconds(20), function() + if ScrinDefenseBuff1.IsDead then + return + end + Notification("Signal flare detected. The Soviets are sending a MAD Tank to destroy Scrin Reactors in the north-west. They have requested a rendezvous to provide escort.") + MediaCA.PlaySound(MissionDir .. "/c_madtank.aud", 2) + + local northWestPowerFlare = Actor.Create("flare", true, { Owner = GDI, Location = MADTankPath9.Location }) + local madTankFlare = Actor.Create("flare", true, { Owner = GDI, Location = MADTankPath1.Location }) + Trigger.AfterDelay(DateTime.Seconds(20), function() + northWestPowerFlare.Destroy() + madTankFlare.Destroy() + end) + + Beacon.New(GDI, MADTankPath9.CenterPosition) + Beacon.New(GDI, MADTankPath1.CenterPosition) + end) + + Trigger.AfterDelay(MADTankAttackDelay, function() + if ScrinDefenseBuff1.IsDead then + return + end + + MADTank = Actor.Create("qtnk", true, { Owner = USSR, Location = MADTankSpawn.Location, Facing = Angle.East }) + MADTank.Move(MADTankPath1.Location) + Notification("MAD Tank has arrived. Rendezvous to provide escort.") + MediaCA.PlaySound(MissionDir .. "/c_madtankarrived.aud", 2) + + Trigger.OnDamaged(MADTank, function(self, attacker, damage) + if self.Health < self.MaxHealth / 3 and not IsMADTankIronCurtained and not MADTank.IsDead then + IsMADTankIronCurtained = true + MADTankInvulnToken = MADTank.GrantCondition("invulnerability") + Media.PlaySound("ironcur9.aud") + Trigger.AfterDelay(DateTime.Minutes(3), function() + if not MADTank.IsDead and MADTankInvulnToken ~= nil then + MADTank.RevokeCondition(MADTankInvulnToken) + end + end) + end + end) + + Trigger.AfterDelay(DateTime.Seconds(10), function() + Trigger.OnEnteredProximityTrigger(MADTankPath1.CenterPosition, WDist.New(7 * 1024), function(a, id) + if IsMissionPlayer(a.Owner) and a.HasProperty("Attack") then + Trigger.RemoveProximityTrigger(id) + SendMADTank() + end + end) + end) + + Trigger.AfterDelay(DateTime.Minutes(2), function() + SendMADTank() + end) + end) +end + +SendMADTank = function() + if not MADTankEnRoute and not MADTank.IsDead then + MADTankEnRoute = true + Notification("MAD Tank en route to target.") + MediaCA.PlaySound(MissionDir .. "/c_madtankenroute.aud", 2) + MADTank.Move(MADTankPath2.Location) + MADTank.Move(MADTankPath3.Location) + MADTank.Move(MADTankPath4.Location) + MADTank.Move(MADTankPath5.Location) + MADTank.Move(MADTankPath6.Location) + MADTank.Move(MADTankPath7.Location) + MADTank.Move(MADTankPath8.Location) + MADTank.Move(MADTankPath9.Location) + MADTank.Wait(25) + MADTank.MadTankDetonate() + end +end + +DoInterceptors = function() + if Mothership.IsDead then + return + end + + local mothershipCamera = Actor.Create("camera", true, { Owner = GDI, Location = Mothership.Location }) + + Trigger.AfterDelay(1, function() + Media.PlaySound("interceptors.aud") + local interceptor1 = Actor.Create("yf23.interceptor", true, { Owner = GDI, Location = InterceptorSpawn1.Location, CenterPosition = InterceptorSpawn1.CenterPosition + WVec.New(0, 0, Actor.CruiseAltitude("yf23.interceptor")), Facing = Angle.North }) + + if not Mothership.IsDead then + interceptor1.Attack(Mothership) + interceptor1.Move(InterceptorExit1.Location) + interceptor1.Destroy() + end + + Trigger.OnIdle(interceptor1, function(a) + a.Stop() + a.Move(InterceptorExit1.Location) + a.Destroy() + end) + + Trigger.AfterDelay(8, function() + local interceptor2 = Actor.Create("yf23.interceptor", true, { Owner = GDI, Location = InterceptorSpawn2.Location, CenterPosition = InterceptorSpawn2.CenterPosition + WVec.New(0, 0, Actor.CruiseAltitude("yf23.interceptor")), Facing = Angle.North }) + local interceptor3 = Actor.Create("yf23.interceptor", true, { Owner = GDI, Location = InterceptorSpawn3.Location, CenterPosition = InterceptorSpawn3.CenterPosition + WVec.New(0, 0, Actor.CruiseAltitude("yf23.interceptor")), Facing = Angle.North }) + interceptor2.Move(InterceptorWP2.Location) + interceptor3.Move(InterceptorWP3.Location) + + if not Mothership.IsDead then + interceptor2.Attack(Mothership) + interceptor2.Move(InterceptorExit2.Location) + interceptor2.Destroy() + + interceptor3.Attack(Mothership) + interceptor3.Move(InterceptorExit3.Location) + interceptor3.Destroy() + end + + Trigger.OnIdle(interceptor2, function(a) + a.Stop() + a.Move(InterceptorExit2.Location) + a.Destroy() + end) + + Trigger.OnIdle(interceptor3, function(a) + a.Stop() + a.Move(InterceptorExit3.Location) + a.Destroy() + end) + end) + end) + + Trigger.AfterDelay(DateTime.Seconds(20), function() + mothershipCamera.Destroy() + end) +end + +-- overridden in co-op version +FlipSlaveFaction = function(player, killer) + local attackPath + local targetPlayer + + if player == NodSlaves then + targetPlayer = Nod + NodFreed = true + Squads.NodSlaves.IdleUnits = { } + attackPath = { EastAttackNode1.Location, WormholeWP.Location } + InitNod() + InitAttackSquad(Squads.ScrinEast, Scrin) + if ScrinDefenseBuff1.IsDead and ScrinDefenseBuff2.IsDead then + InitHackers(HackersDelay[Difficulty]) + end + Notification("Nod forces have been released from Scrin control.") + MediaCA.PlaySound(MissionDir .. "/c_nodreleased.aud", 2) + elseif player == SovietSlaves then + targetPlayer = USSR + SovietsFreed = true + Squads.SovietSlaves.IdleUnits = { } + attackPath = { WestAttackNode1.Location, WormholeWP.Location } + InitUSSR() + InitAttackSquad(Squads.ScrinWest, Scrin) + InitMADTankAttack() + Notification("Soviet forces have been released from Scrin control.") + MediaCA.PlaySound(MissionDir .. "/c_sovietsreleased.aud", 2) + elseif player == AlliedSlaves then + targetPlayer = Greece + AlliesFreed = true + Squads.AlliedSlaves.IdleUnits = { } + attackPath = { CenterAttackNode1.Location, WormholeWP.Location } + InitGreece() + InitAttackSquad(Squads.ScrinCenter, Scrin) + InitChronoTanks() + Notification("Allied forces have been released from Scrin control.") + MediaCA.PlaySound(MissionDir .. "/c_alliesreleased.aud", 2) + end + + local actors = Utils.Where(player.GetActors(), function(a) return not a.IsDead and a.IsInWorld and a.Type ~= "player" end) + Utils.Do(actors, function(a) + a.Owner = targetPlayer + Trigger.ClearAll(a) + + local delay = Utils.RandomInteger(DateTime.Seconds(1), DateTime.Seconds(25)) + if a.HasProperty("FindResources") then + delay = 1 + end + + Trigger.AfterDelay(delay, function() + if not a.IsDead then + if a.HasProperty("AttackMove") then + a.Stop() + a.AttackMove(attackPath[1], 2) + a.AttackMove(attackPath[2], 2) + elseif a.HasProperty("Attack") then + a.Stop() + elseif a.HasProperty("Move") then + a.Stop() + elseif a.HasProperty("FindResources") then + a.Stop() + a.FindResources() + end + end + end) + end) +end + +DoFinale = function() + if IsFinaleStarted then + return + end + IsFinaleStarted = true + local pacs = Scrin.GetActorsByTypes({ "pac", "deva", "stmr" }) + Utils.Do(pacs, function(a) + if not a.IsDead then + a.Kill() + end + end) + + Notification("Scrin mothership destroyed.") + MediaCA.PlaySound(MissionDir .. "/c_mothershipdestroyed.aud", 2) + + Lighting.Flash("Chronoshift", 10) + + Lighting.Ambient = 0.8 + Lighting.Red = 1 + Lighting.Blue = 1.2 + Lighting.Green = 0.8 + + Wormhole.Destroy() + Actor.Create("camera", true, { Owner = GDI, Location = WormholeWP.Location }) + + Trigger.AfterDelay(1, function() + Gateway = Actor.Create("wormholexxl", true, { Owner = Scrin, Location = WormholeWP.Location }) + end) + + Actor.Create("wormhole", true, { Owner = Kane, Location = KaneSpawn.Location }) + Actor.Create("wormhole", true, { Owner = Kane, Location = CyborgWormhole1.Location }) + Actor.Create("wormhole", true, { Owner = Kane, Location = CyborgWormhole2.Location }) + + local kane = Actor.Create("kane", true, { Owner = Kane, Location = KaneSpawn.Location, Facing = Angle.South }) + + Trigger.AfterDelay(DateTime.Seconds(5), function() + kane.Stop() + kane.Move(KaneSpawn.Location + CVec.New(0, 3)) + end) + + local cyborgs = CyborgSlaves.GetActorsByTypes({ "rmbc", "enli", "tplr", "reap" }) + + Utils.Do(cyborgs, function(a) + a.Owner = Kane + end) + + Trigger.AfterDelay(DateTime.Seconds(6), function() + Beacon.New(GDI, kane.CenterPosition, 50) + Media.DisplayMessage("Well commander, we meet at last! Your contribution has been invaluable, unwitting as it may be.", "Kane", HSLColor.FromHex("FF0000")) + MediaCA.PlaySound(MissionDir .. "/outro.aud", 2.5) + + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(25)), function() + if not Gateway.IsDead then + Gateway.GrantCondition("kane-revealed") + end + + Utils.Do(cyborgs, function(a) + MoveToWormhole(a) + end) + + Reinforcements.Reinforce(Kane, { "n1c", "rmbc", "rmbc", "enli", "reap", "rmbc", "enli", "reap", "rmbc", "enli", "enli", "n3c", "rmbc", "reap", "n3c" }, { CyborgWormhole1.Location, WormholeWP.Location }, 25) + Reinforcements.Reinforce(Kane, { "rmbc", "rmbc", "enli", "reap", "rmbc", "enli", "reap", "rmbc", "enli", "n1c", "reap", "n1c", "n3c", "enli", "rmbc" }, { CyborgWormhole2.Location, WormholeWP.Location }, 25) + end) + + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(6)), function() + Media.DisplayMessage("Ironic isn't it? That GDI should lay the foundation for the Brotherhood's ultimate victory.", "Kane", HSLColor.FromHex("FF0000")) + end) + + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(12)), function() + Media.DisplayMessage("Of course the Allies and Soviets played their part as well.", "Kane", HSLColor.FromHex("FF0000")) + end) + + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(16)), function() + Media.DisplayMessage("My painstaking manipulation of time and space finally bears fruit, and now we stand at the threshold.", "Kane", HSLColor.FromHex("FF0000")) + end) + + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(21)), function() + Media.DisplayMessage("There is much yet to be done. I have no doubt our paths will cross again.", "Kane", HSLColor.FromHex("FF0000")) + end) + + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(27)), function() + if not kane.IsDead then + kane.Stop() + kane.Move(WormholeWP.Location) + end + UserInterface.SetMissionText("To be continued...", HSLColor.Red) + end) + + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(37)), function() + GDI.MarkCompletedObjective(ObjectiveDestroyMothership) + end) + end) +end + +CreatePermanentMothershipCamera = function() + if not Mothership.IsDead and not IsPermanentMothershipCameraCreated then + IsPermanentMothershipCameraCreated = true + Actor.Create("camera", true, { Owner = GDI, Location = Mothership.Location }) + end +end + +PanToFinale = function() + if PanToFinaleComplete or not Mothership.IsDead then + return + end + + local targetPos = WormholeWP.CenterPosition + PanToPos(targetPos, 2048) + + if Camera.Position.X == targetPos.X and Camera.Position.Y == targetPos.Y then + PanToFinaleComplete = true + end +end + +RemoveCyborgsAtWormhole = function() + if not Mothership.IsDead then + return + end + + local kaneTroops = Map.ActorsInCircle(WormholeWP.CenterPosition, WDist.New(2 * 1024)) + Utils.Do(kaneTroops, function(a) + if a.Owner == Kane and not a.IsDead then + a.Stop() + a.Destroy() + end + end) +end diff --git a/mods/ca/missions/main-campaign/ca31-foothold/c_gatewaystabilized.aud b/mods/ca/missions/main-campaign/ca31-foothold/c_gatewaystabilized.aud new file mode 100644 index 0000000000..981ab03c1e Binary files /dev/null and b/mods/ca/missions/main-campaign/ca31-foothold/c_gatewaystabilized.aud differ diff --git a/mods/ca/missions/main-campaign/ca31-foothold/c_nervecenterlocated.aud b/mods/ca/missions/main-campaign/ca31-foothold/c_nervecenterlocated.aud new file mode 100644 index 0000000000..b4fcc7f6e9 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca31-foothold/c_nervecenterlocated.aud differ diff --git a/mods/ca/missions/main-campaign/ca31-foothold/c_nervecenterprotected.aud b/mods/ca/missions/main-campaign/ca31-foothold/c_nervecenterprotected.aud new file mode 100644 index 0000000000..7dc08b8ea3 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca31-foothold/c_nervecenterprotected.aud differ diff --git a/mods/ca/missions/main-campaign/ca31-foothold/c_protectnervecenter.aud b/mods/ca/missions/main-campaign/ca31-foothold/c_protectnervecenter.aud new file mode 100644 index 0000000000..83bc42af91 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca31-foothold/c_protectnervecenter.aud differ diff --git a/mods/ca/missions/main-campaign/ca31-foothold/c_tiblifeforms.aud b/mods/ca/missions/main-campaign/ca31-foothold/c_tiblifeforms.aud new file mode 100644 index 0000000000..a5668a62ab Binary files /dev/null and b/mods/ca/missions/main-campaign/ca31-foothold/c_tiblifeforms.aud differ diff --git a/mods/ca/missions/main-campaign/ca31-foothold/foothold-rules.yaml b/mods/ca/missions/main-campaign/ca31-foothold/foothold-rules.yaml new file mode 100644 index 0000000000..6c44a922c4 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca31-foothold/foothold-rules.yaml @@ -0,0 +1,145 @@ +^Palettes: + PaletteFromFile@terrain-temperat: + Filename: alien.pal + TintPostProcessEffect: + Red: 1.3 + Green: 1 + Blue: 1.5 + Ambient: 0.5 + +^BaseWorld: + TerrainLighting: + +World: + LuaScript: + Scripts: campaign.lua, foothold.lua + MissionData: + Briefing: ———[ Chapter VI Introduction ]———\n\nAs the Scrin mothership fell from the sky in flames, the cyborgs surrounding it revealed their true allegiance. The Scrin, stranded in both space and time, were manipulated into opening a gateway to their homeworld with Kane's army at the threshold. \n\nWhile his ultimate objective is unclear, GDI are unwilling to let him pursue it uncontested. The gateway has remained open, but is rapidly destabilizing and it appears likely that it will collapse soon. Time is running out for GDI to give chase.\n\n———[ Mission Briefing (GDI) ]———\n\nOur forces are almost ready and our recon drones have confirmed that the atmosphere and climatic conditions on the other side of the gateway will support human life.\n\nClearly, this is uncharted territory. We must establish a foothold from which we can base our operations. We have detected minimal Scrin presence in the immediate vicinity of our destination, and no sign of Kane or his army.\n\nShortly after Kane departed we detected an energy surge emanating from the Scrin signal transmitter. We believe this was caused by the gateway's exit point being shifted. Kane clearly didn't want us following closely behind, but it does beg the question; why did he leave the door open at all?\n\nThe gateway has become too unstable for heavier equipment to make it through, but research into Scrin wormhole technology gathered since their arrival has provided us with some understanding of how the portals work.\n\nA gateway requires a bi-directional flow of energy to be sustained. Our side is taken care of, but without a corresponding transmission from the other side the gateway will eventually lose cohesion.\n\nScrin Nerve Centers are capable of providing such an energy flow, so if we can locate and capture one close enough to the exit point, the gateway should be stabilized.\n\nYour first objective is to deploy sensor arrays in the area around the exit. We should then be able to detect a suitable Nerve Center to capture, allowing us to bring heavier forces and establish a base. Then the area must be cleared of any remaining hostile forces. + MapOptions: + ShortGameCheckboxEnabled: False + MusicPlaylist: + StartingMusic: whatlurk + +Player: + PlayerResources: + DefaultCash: 6000 + +FLARE.sensor: + Inherits: FLARE + Tooltip: + Name: Sensor Deployment Zone + WithRangeCircle: + Type: SensorZone + Visible: Always + Color: ead37740 + Range: 10c0 + RevealsShroud: + Range: 1c512 + +deployedsensortoken: + Inherits: ^InvisibleDummy + Mobile: + Locomotor: cloud + Speed: 1 + KillsSelf: + Delay: 26 + +MSAR: + LaysMinefield@token: + Mines: deployedsensortoken + MineSelectionMode: Shuffled + Locations: 0,0 + RecreationInterval: 25 + RequiresCondition: deployed + +NERV: + -Sellable: + -SpawnActorsOnSellCA: + -SpawnActorOnDeath: + CaptureManager: + -BeingCapturedCondition: + Power: + Amount: 0 + -DetonateWeaponPower@STORMSPIKE: + +SILO.SCRIN: + Power: + Amount: 0 + +WORMHOLE: + -Targetable: + -RallyPoint: + -Selectable: + Interactable: + Tooltip: + Name: Unstable Wormhole + +WORMHOLEXL: + Tooltip: + Name: Stabilized Wormhole + TerrainLightSource: + Range: 3c0 + Intensity: 0.5 + BlueTint: 1 + RedTint: 0.2 + +# Enable subfaction specific tech + +XO: + Buildable: + Prerequisites: gtek, ~vehicles.gdi + +WOLV: + Buildable: + Prerequisites: gtek, ~vehicles.gdi + +PBUL: + Buildable: + Prerequisites: gtek, ~vehicles.gdi + +STWR: + Buildable: + Prerequisites: vehicles.any, ~structures.gdi + +ionmam.upgrade: + Buildable: + Prerequisites: upgc, !mdrone.upgrade, !hovermam.upgrade + TooltipExtras: + Attributes: \n(!) Only ONE Mammoth Tank upgrade can be chosen + +hovermam.upgrade: + Buildable: + Prerequisites: upgc, !ionmam.upgrade, !mdrone.upgrade + TooltipExtras: + Attributes: \n(!) Only ONE Mammoth Tank upgrade can be chosen + +mdrone.upgrade: + Buildable: + Prerequisites: upgc, !ionmam.upgrade, !hovermam.upgrade + TooltipExtras: + Attributes: \n(!) Only ONE Mammoth Tank upgrade can be chosen + +# Disable tech + +HQ: + -DropPodsPowerCA@Zocom: + -AirstrikePowerCA@uav: + -AirstrikePowerCA@uavST: + +AFLD.GDI: + -InterceptorPower@AirDef: + +EYE: + Inherits@CAMPAIGNDISABLED: ^Disabled + +upgc.drop: + Inherits@CAMPAIGNDISABLED: ^Disabled + +# Hunt() requires only 1 AttackBase +DEVA: + -AttackFrontalCharged: + -Armament@PRIMARYUPG: + -AmbientSound@CHARGE: + -WithIdleOverlay@CHARGE1: + -WithIdleOverlay@CHARGE2: + -WithIdleOverlay@CHARGE3: diff --git a/mods/ca/missions/main-campaign/ca31-foothold/foothold-sequences.yaml b/mods/ca/missions/main-campaign/ca31-foothold/foothold-sequences.yaml new file mode 100644 index 0000000000..964b45a4b8 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca31-foothold/foothold-sequences.yaml @@ -0,0 +1,7 @@ +wormhole: + idle: + Filename: wormholeunstable.shp + die: + Filename: wormholeunstable.shp + make: + Filename: wormholeunstable.shp diff --git a/mods/ca/missions/main-campaign/ca31-foothold/foothold.lua b/mods/ca/missions/main-campaign/ca31-foothold/foothold.lua new file mode 100644 index 0000000000..153d51f14a --- /dev/null +++ b/mods/ca/missions/main-campaign/ca31-foothold/foothold.lua @@ -0,0 +1,411 @@ +MissionDir = "ca|missions/main-campaign/ca31-foothold" + +SensorZones = { SensorZone1, SensorZone2, SensorZone3, SensorZone4 } + +PowerGrids = { + { + Providers = { SPower1, SPower2, SPower3 }, + Consumers = { SPowered1, SPowered2, SPowered3, SPowered4, SPowered5 }, + }, +} + +SpawnedBlobPatrolPaths = { + { + BlobPatrol8.Location, BlobPatrol7.Location, BlobPatrol6.Location, BlobPatrol5.Location, BlobPatrol4.Location, BlobPatrol3.Location, BlobPatrol2.Location, BlobPatrol1.Location, + BlobExtraPatrol1.Location, BlobExtraPatrol2.Location, BlobExtraPatrol3.Location, BlobExtraPatrol4.Location, BlobExtraPatrol5.Location, BlobExtraPatrol1.Location, + BlobPatrol11.Location, BlobPatrol10.Location, BlobPatrol9.Location + }, + { + BlobPatrol9.Location, BlobPatrol10.Location, BlobPatrol11.Location, BlobPatrol1.Location, + BlobExtraPatrol1.Location, BlobExtraPatrol5.Location, BlobExtraPatrol4.Location, BlobExtraPatrol3.Location, BlobExtraPatrol2.Location, BlobExtraPatrol1.Location, + BlobPatrol2.Location, BlobPatrol3.Location, BlobPatrol4.Location, BlobPatrol5.Location, BlobPatrol6.Location, BlobPatrol7.Location, BlobPatrol8.Location + }, +} + +SpawnLifeformsDelay = { + vhard = DateTime.Minutes(10), + brutal = DateTime.Minutes(8) +} + +SpawnLifeformsInterval = { + vhard = DateTime.Minutes(2), + brutal = DateTime.Minutes(1) +} + +ReinforcementsInterval = { + easy = DateTime.Minutes(3), + normal = DateTime.Minutes(4), + hard = DateTime.Minutes(5), + vhard = DateTime.Minutes(5), + brutal = DateTime.Minutes(5) +} + +HarvesterDeathDelayTime = { + easy = DateTime.Seconds(30), + normal = DateTime.Seconds(25), + hard = DateTime.Seconds(20), + vhard = DateTime.Seconds(20), + brutal = DateTime.Seconds(20) +} + +Squads = { + ScrinMain = { + Delay = AdjustDelayForDifficulty(DateTime.Minutes(5)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 40, Max = 80, RampDuration = DateTime.Minutes(12) }), + FollowLeader = true, + Compositions = AdjustCompositionsForDifficulty(UnitCompositions.Scrin), + AttackPaths = { + { ScrinAttack1.Location, ScrinAttack2.Location, ScrinAttack3.Location, ScrinAttack4.Location } + }, + }, + ScrinWater = { + Delay = AdjustDelayForDifficulty(DateTime.Minutes(7)), + AttackValuePerSecond = { + normal = { Min = 20, Max = 20 }, + hard = { Min = 28, Max = 55, RampDuration = DateTime.Minutes(11) }, + vhard = { Min = 28, Max = 60, RampDuration = DateTime.Minutes(10) }, + brutal = { Min = 28, Max = 65, RampDuration = DateTime.Minutes(9) } + }, + FollowLeader = true, + Compositions = ScrinWaterCompositions, + AttackPaths = { + { ScrinAttack1.Location, ScrinAttack2b.Location, ScrinAttack4.Location } + }, + }, + ScrinAir = { + Delay = AdjustAirDelayForDifficulty(DateTime.Minutes(8)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 12, Max = 12 }), + Compositions = AirCompositions.Scrin + }, +} + +SetupPlayers = function() + GDI = Player.GetPlayer("GDI") + Scrin = Player.GetPlayer("Scrin") + TibLifeforms = Player.GetPlayer("TibLifeforms") + GatewayOwner = Player.GetPlayer("GatewayOwner") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = { GDI } + MissionEnemies = { Scrin } +end + +WorldLoaded = function() + SetupPlayers() + + TimerTicks = 0 + Camera.Position = PlayerStart.CenterPosition + + InitObjectives(GDI) + AdjustPlayerStartingCashForDifficulty() + InitScrin() + InitTibLifeforms() + + ObjectiveDeploySensorArrays = GDI.AddObjective("Deploy Sensor Arrays at target locations.") + ObjectiveCaptureNerveCenter = GDI.AddObjective("Capture Scrin Nerve Center.") + SetupReveals({ Reveal1, Reveal2 }) + CheckSensors() + + if Difficulty ~= "easy" then + Trigger.AfterDelay(DateTime.Seconds(10), function() + MediaCA.PlaySound(MissionDir .. "/c_tiblifeforms.aud", 2) + Notification("Dangerous Tiberium-based lifeforms detected. Recommend keeping your units at a safe distance.") + end) + end + + if IsNormalOrBelow() then + HardOnlyUnit1.Destroy() + HardOnlyUnit2.Destroy() + HardOnlyUnit3.Destroy() + HardOnlyUnit4.Destroy() + HardOnlyUnit5.Destroy() + end + + if IsHardOrAbove() then + NormalEasyOnlyUnit1.Destroy() + NormalEasyOnlyUnit2.Destroy() + NormalEasyOnlyUnit3.Destroy() + end + + Trigger.OnKilled(NerveCenter1, function(self, killer) + NerveCenterLost() + end) + + Trigger.OnSold(NerveCenter1, function(self) + NerveCenterLost() + end) + + Trigger.OnCapture(NerveCenter1, function(self, captor, oldOwner, newOwner) + if GDI.IsObjectiveCompleted(ObjectiveCaptureNerveCenter) then + return + end + + Trigger.AfterDelay(DateTime.Minutes(1), function() + Utils.Do({ ScrinRef1, ScrinRef2 }, function(a) + if not a.IsDead and a.Owner == Scrin then + a.Sell() + end + end) + end) + + ObjectiveProtectNerveCenter = GDI.AddObjective("Protect the captured Nerve Center.") + ObjectiveDestroyScrinBase = GDI.AddObjective("Destroy the Scrin base.") + GDI.MarkCompletedObjective(ObjectiveCaptureNerveCenter) + BeginScrinAttacks() + PeriodicReinforcements() + + Trigger.AfterDelay(DateTime.Seconds(3), function() + MediaCA.PlaySound(MissionDir .. "/c_gatewaystabilized.aud", 2) + Notification("Interstellar gateway stabilized.") + GatewayStable = Actor.Create("wormholexl", true, { Owner = GatewayOwner, Location = Gateway.Location }) + Gateway.Destroy() + + Trigger.AfterDelay(DateTime.Seconds(5), function() + PlaySpeechNotificationToMissionPlayers("ReinforcementsArrived") + Notification("Reinforcements have arrived.") + Beacon.New(GDI, GatewayStable.CenterPosition) + DoMcvArrival() + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(4)), function() + MediaCA.PlaySound(MissionDir .. "/c_protectnervecenter.aud", 2) + Notification("Do not allow the Nerve Center to be destroyed, the gateway must remain stable.") + end) + end) + end) + end) + + Trigger.OnAnyKilled({ Sensor1, Sensor2, Sensor3, Sensor4 }, function(killed) + if not GDI.IsObjectiveCompleted(ObjectiveDeploySensorArrays) then + GDI.MarkFailedObjective(ObjectiveDeploySensorArrays) + end + end) + + Utils.Do(PowerGrids, function(grid) + Trigger.OnAllKilledOrCaptured(grid.Providers, function() + Utils.Do(grid.Consumers, function(consumer) + if not consumer.IsDead then + consumer.GrantCondition("disabled") + end + end) + end) + end) + + AfterWorldLoaded() +end + +Tick = function() + OncePerSecondChecks() + OncePerFiveSecondChecks() + OncePerThirtySecondChecks() + AfterTick() +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + Scrin.Resources = Scrin.ResourceCapacity - 500 + + if TimerTicks > 0 then + if TimerTicks > 25 then + TimerTicks = TimerTicks - 25 + else + TimerTicks = 0 + end + end + + if not PlayerHasBuildings(Scrin) and ObjectiveDestroyScrinBase ~= nil and not GDI.IsObjectiveCompleted(ObjectiveDestroyScrinBase) then + GDI.MarkCompletedObjective(ObjectiveProtectNerveCenter) + GDI.MarkCompletedObjective(ObjectiveDestroyScrinBase) + end + + CheckSensors() + end +end + +OncePerFiveSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 125 == 0 then + UpdatePlayerBaseLocations() + end +end + +OncePerThirtySecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % DateTime.Seconds(30) == 0 then + CalculatePlayerCharacteristics() + end +end + +CheckSensors = function() + if GDI.IsObjectiveCompleted(ObjectiveDeploySensorArrays) then + return + end + + NumSensorsDeployed = 0 + + Utils.Do(SensorZones, function(z) + local deployedSensors = Map.ActorsInCircle(z.CenterPosition, WDist.New(10 * 1024), function(a) + return a.Type == "deployedsensortoken" + end) + + if #deployedSensors > 0 then + NumSensorsDeployed = NumSensorsDeployed + 1 + end + end) + + if NumSensorsDeployed == 4 then + UserInterface.SetMissionText("") + GDI.MarkCompletedObjective(ObjectiveDeploySensorArrays) + SensorZone1.Destroy() + SensorZone2.Destroy() + SensorZone3.Destroy() + SensorZone4.Destroy() + + Trigger.AfterDelay(DateTime.Seconds(2), function() + + local nerveCenterCamera = Actor.Create("camera", true, { Owner = GDI, Location = NerveCenter1.Location }) + Trigger.AfterDelay(DateTime.Seconds(10), function() + nerveCenterCamera.Destroy() + end) + + Beacon.New(GDI, NerveCenter1.CenterPosition) + MediaCA.PlaySound(MissionDir .. "/c_nervecenterlocated.aud", 2) + Notification("Nerve Center located.") + + Trigger.AfterDelay(DateTime.Seconds(4), function() + PlaySpeechNotificationToMissionPlayers("ReinforcementsArrived") + Notification("Reinforcements have arrived.") + Beacon.New(GDI, Gateway.CenterPosition) + local reinforcements = Reinforcements.Reinforce(GDI, { "n1", "n1", "medi", "n6", "n6", "n2", "n2", "n2" }, { Gateway.Location, PlayerStart.Location }, 6) + + Utils.Do(reinforcements, function(a) + if a.Type == "n6" then + Trigger.OnKilled(a, function(self, killer) + local engis = GetMissionPlayersActorsByType("n6") + if #engis == 0 and not GDI.IsObjectiveCompleted(ObjectiveCaptureNerveCenter) then + GDI.MarkFailedObjective(ObjectiveCaptureNerveCenter) + end + end) + end + end) + end) + + Trigger.AfterDelay(DateTime.Seconds(9), function() + if not SPower2.IsDead then + local powerCamera = Actor.Create("smallcamera", true, { Owner = GDI, Location = SPower2.Location }) + Notification("The Nerve Center is well protected by Storm Columns. Sensors have detected Scrin reactors to the south-east which are powering these defenses.") + MediaCA.PlaySound(MissionDir .. "/c_nervecenterprotected.aud", 2) + Beacon.New(GDI, SPower2.CenterPosition) + + Trigger.AfterDelay(DateTime.Seconds(10), function() + powerCamera.Destroy() + end) + end + end) + end) + else + UserInterface.SetMissionText("Sensor arrays deployed: " .. NumSensorsDeployed .. "/4", HSLColor.Yellow) + end +end + +InitScrin = function() + RebuildExcludes.Scrin = { Actors = { SPower1, SPower2, SPower3, SPowered1, SPowered2, SPowered3, SPowered4, SPowered5, ScrinSilo1, ScrinSilo2, ScrinSilo3, ScrinRef1, ScrinRef2, StormColumn1, StormColumn2, ShardLauncher1, ShardLauncher2 } } + + AutoRepairAndRebuildBuildings(Scrin, 15) + SetupRefAndSilosCaptureCredits(Scrin) + AutoReplaceHarvesters(Scrin) + AutoRebuildConyards(Scrin) + InitAiUpgrades(Scrin) + + local scrinGroundAttackers = Scrin.GetGroundAttackers() + + Utils.Do(scrinGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsScrinGroundHunterUnit) + end) +end + +BeginScrinAttacks = function() + InitAttackSquad(Squads.ScrinMain, Scrin) + InitAirAttackSquad(Squads.ScrinAir, Scrin) + + if IsNormalOrAbove() then + InitAttackSquad(Squads.ScrinWater, Scrin) + end +end + +InitTibLifeforms = function() + if IsNormalOrBelow() then + Blob1.Destroy() + end + + if Difficulty == "easy" then + Blob2.Destroy() + Blob3.Destroy() + return + end + + local blobs = TibLifeforms.GetActorsByType("tbcl") + + local patrolPath2 = { BlobPatrol4.Location, BlobPatrol5.Location, BlobPatrol6.Location, BlobPatrol7.Location, BlobPatrol8.Location, BlobPatrol9.Location, BlobPatrol10.Location, BlobPatrol11.Location, BlobPatrol1.Location, BlobPatrol2.Location, BlobPatrol3.Location } + local patrolPath3 = { BlobPatrolB1.Location, BlobPatrolB2.Location, BlobPatrolB3.Location, BlobPatrolB4.Location, BlobPatrolB5.Location, BlobPatrolB6.Location } + + Blob2.Patrol(patrolPath2, true) + Blob3.Patrol(patrolPath3, true) + + if IsHardOrAbove() then + local patrolPath1 = { BlobPatrol1.Location, BlobPatrol2.Location, BlobPatrol3.Location, BlobPatrol4.Location, BlobPatrol5.Location, BlobPatrol6.Location, BlobPatrol7.Location, BlobPatrol8.Location, BlobPatrol9.Location, BlobPatrol10.Location, BlobPatrol11.Location } + Blob1.Patrol(patrolPath1, true) + + if IsVeryHardOrAbove() then + Trigger.AfterDelay(SpawnLifeformsDelay[Difficulty], function() + SpawnTibLifeform() + end) + end + end +end + +PeriodicReinforcements = function() + local groups = { + { "vulc", "mtnk", "n1", "n1", "n1", "n3" }, + { "n1", "n1", "n1", "n3", "htnk", "msam" }, + { "xo", "xo", "titn" }, + { "titn", "jugg", "n1", "n1", "n1", "n2", "n2" }, + { "mtnk", "n1", "n3", "xo", "msam" }, + } + + local groupDelay = ReinforcementsInterval[Difficulty] + + Utils.Do(groups, function(g) + Trigger.AfterDelay(groupDelay, function() + PlaySpeechNotificationToMissionPlayers("ReinforcementsArrived") + Notification("Reinforcements have arrived.") + Beacon.New(GDI, GatewayStable.CenterPosition) + Reinforcements.Reinforce(GDI, g, { GatewayStable.Location, PlayerStart.Location }, 30) + end) + + groupDelay = groupDelay + ReinforcementsInterval[Difficulty] + end) + + Trigger.AfterDelay(groupDelay, function() + PeriodicReinforcements() + end) +end + +NerveCenterLost = function() + if not GDI.IsObjectiveCompleted(ObjectiveCaptureNerveCenter) then + GDI.MarkFailedObjective(ObjectiveCaptureNerveCenter) + end + if ObjectiveProtectNerveCenter ~= nil and not GDI.IsObjectiveCompleted(ObjectiveProtectNerveCenter) then + GDI.MarkFailedObjective(ObjectiveProtectNerveCenter) + end +end + +SpawnTibLifeform = function() + local lifeform = Actor.Create("tbcl", true, { Owner = TibLifeforms, Location = Utils.Random({ TibSpawn1.Location, TibSpawn2.Location }) }) + lifeform.Patrol(Utils.Random(SpawnedBlobPatrolPaths), true) + + Trigger.AfterDelay(SpawnLifeformsInterval[Difficulty], function() + SpawnTibLifeform() + end) +end + +-- overridden in co-op version +DoMcvArrival = function() + Reinforcements.Reinforce(GDI, { "hmmv", "mtnk", "mtnk", "n1", "n1", "n1", "n1", "n3", "amcv" }, { GatewayStable.Location, PlayerStart.Location }, 30) +end \ No newline at end of file diff --git a/mods/ca/missions/main-campaign/ca31-foothold/map.bin b/mods/ca/missions/main-campaign/ca31-foothold/map.bin new file mode 100644 index 0000000000..0028032c81 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca31-foothold/map.bin differ diff --git a/mods/ca/missions/main-campaign/ca31-foothold/map.png b/mods/ca/missions/main-campaign/ca31-foothold/map.png new file mode 100644 index 0000000000..1a73713512 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca31-foothold/map.png differ diff --git a/mods/ca/missions/main-campaign/ca31-foothold/map.yaml b/mods/ca/missions/main-campaign/ca31-foothold/map.yaml new file mode 100644 index 0000000000..4b3c3f6679 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca31-foothold/map.yaml @@ -0,0 +1,1906 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 31: Foothold + +Author: Darkademic + +Tileset: TEMPERAT + +MapSize: 114,98 + +Bounds: 1,1,112,96 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: GDI, Scrin, ScrinRebels + PlayerReference@GDI: + Name: GDI + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: gdi + LockColor: True + Color: F2CF74 + LockSpawn: True + LockTeam: True + Allies: GatewayOwner + Enemies: Scrin, Creeps, TibLifeforms + PlayerReference@Scrin: + Name: Scrin + Bot: campaign + Faction: scrin + Color: 7700FF + Allies: TibLifeforms + Enemies: GDI, ScrinRebels, Creeps + PlayerReference@TibLifeforms: + Name: TibLifeforms + NonCombatant: True + Faction: scrin + Color: 00FF00 + Allies: Scrin + Enemies: GDI, Creeps + PlayerReference@ScrinRebels: + Name: ScrinRebels + NonCombatant: True + Faction: scrin + Color: 55E1AE + Enemies: Scrin, Creeps + PlayerReference@GatewayOwner: + Name: GatewayOwner + NonCombatant: True + Faction: gdi + Color: 7700FF + Allies: GDI + +Actors: + Actor12: scrinflora1 + Owner: Neutral + Location: 23,15 + Actor13: scrinflora2 + Owner: Neutral + Location: 10,13 + Actor14: scrinflora4 + Owner: Neutral + Location: 13,20 + Actor15: scrinflora5 + Owner: Neutral + Location: 16,6 + Actor17: scrinflora7 + Owner: Neutral + Location: 25,21 + Actor22: scrinflora11 + Owner: Neutral + Location: 14,21 + Actor24: scrinflora13 + Owner: Neutral + Location: 11,13 + Actor25: scrinflora12 + Owner: Neutral + Location: 9,11 + Actor27: scrinflora11 + Owner: Neutral + Location: 9,12 + Actor28: scrinflora9 + Owner: Neutral + Location: 9,13 + Actor29: scrinflora10 + Owner: Neutral + Location: 10,15 + Actor31: scrinflora10 + Owner: Neutral + Location: 22,15 + Actor32: scrinflora11 + Owner: Neutral + Location: 25,22 + Actor33: scrinflora12 + Owner: Neutral + Location: 23,16 + Sensor1: msar + Owner: GDI + Location: 12,10 + DeployState: Deployed + Facing: 660 + SensorZone1: flare.sensor + Location: 11,9 + Faction: Random + Owner: GDI + SensorZone2: flare.sensor + Location: 51,20 + Faction: Random + Owner: GDI + SensorZone3: flare.sensor + Location: 41,55 + Faction: Random + Owner: GDI + SensorZone4: flare.sensor + Location: 11,72 + Faction: Random + Owner: GDI + Gateway: wormhole + Owner: GatewayOwner + Location: 17,8 + Sensor2: msar + Owner: GDI + DeployState: Undeployed + Facing: 512 + Location: 15,10 + Sensor3: msar + Owner: GDI + Facing: 512 + Location: 17,10 + Sensor4: msar + Owner: GDI + Facing: 512 + Location: 19,10 + Actor73: s1 + Owner: Scrin + SubCell: 3 + Location: 42,20 + Facing: 384 + Actor74: s1 + Owner: Scrin + SubCell: 3 + Location: 44,23 + Facing: 229 + Actor92: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 44,21 + Actor93: s1 + Owner: Scrin + SubCell: 3 + Location: 8,29 + Facing: 848 + Actor95: s1 + Owner: Scrin + SubCell: 3 + Location: 13,32 + Facing: 1023 + Actor103: s1 + Owner: Scrin + SubCell: 3 + Location: 9,31 + Facing: 0 + Actor104: gunw + Owner: Scrin + Location: 50,25 + Facing: 166 + Actor105: gunw + Owner: Scrin + Location: 11,38 + Facing: 983 + Actor243: split2 + Owner: Scrin + Location: 6,87 + Actor244: split2 + Owner: Scrin + Location: 12,92 + Actor245: split2 + Owner: Scrin + Location: 16,86 + Actor246: split2 + Owner: Scrin + Location: 22,91 + Actor247: scrinflora1 + Owner: Neutral + Location: 47,19 + Actor248: scrinflora3 + Owner: Neutral + Location: 36,20 + Actor249: scrinflora5 + Owner: Neutral + Location: 54,26 + Actor250: scrinflora8 + Owner: Neutral + Location: 6,35 + Actor251: scrinflora2 + Owner: Neutral + Location: 15,42 + Actor252: scrinflora7 + Owner: Neutral + Location: 27,41 + Actor253: scrinflora7 + Owner: Neutral + Location: 56,31 + Actor254: scrinflora14 + Owner: Neutral + Location: 55,32 + Actor255: scrinflora1 + Owner: Neutral + Location: 26,42 + Actor256: scrinflora1 + Owner: Neutral + Location: 37,40 + Actor257: scrinflora8 + Owner: Neutral + Location: 47,45 + Actor258: scrinflora6 + Owner: Neutral + Location: 41,38 + Actor259: scrinflora13 + Owner: Neutral + Location: 43,37 + Actor260: scrinflora11 + Owner: Neutral + Location: 40,38 + Actor261: scrinflora2 + Owner: Neutral + Location: 41,37 + Actor262: s3 + Owner: Scrin + SubCell: 3 + Location: 8,32 + Facing: 896 + Blob1: tbcl + Owner: TibLifeforms + Location: 11,62 + Facing: 384 + Blob2: tbcl + Owner: TibLifeforms + Location: 48,39 + Facing: 384 + Actor271: swal + Owner: Scrin + Location: 82,22 + Actor272: swal + Owner: Scrin + Location: 81,22 + Actor275: swal + Owner: Scrin + Location: 80,22 + Actor276: swal + Owner: Scrin + Location: 80,23 + Actor277: swal + Owner: Scrin + Location: 80,24 + Actor278: swal + Owner: Scrin + Location: 81,24 + Actor279: swal + Owner: Scrin + Location: 82,24 + Actor280: swal + Owner: Scrin + Location: 82,23 + Actor273: swal + Owner: Scrin + Location: 90,21 + Actor274: swal + Owner: Scrin + Location: 90,22 + Actor281: swal + Owner: Scrin + Location: 90,23 + Actor282: swal + Owner: Scrin + Location: 91,23 + Actor283: swal + Owner: Scrin + Location: 92,23 + Actor284: swal + Owner: Scrin + Location: 92,22 + Actor285: swal + Owner: Scrin + Location: 92,21 + Actor286: swal + Owner: Scrin + Location: 91,21 + Actor287: swal + Owner: Scrin + Location: 75,33 + Actor288: swal + Owner: Scrin + Location: 75,34 + Actor289: swal + Owner: Scrin + Location: 75,35 + Actor290: swal + Owner: Scrin + Location: 76,35 + Actor291: swal + Owner: Scrin + Location: 77,35 + Actor292: swal + Owner: Scrin + Location: 77,34 + Actor293: swal + Owner: Scrin + Location: 77,33 + Actor294: swal + Owner: Scrin + Location: 76,33 + Actor295: swal + Owner: Scrin + Location: 78,34 + Actor296: swal + Owner: Scrin + Location: 79,34 + Actor297: swal + Owner: Scrin + Location: 80,34 + Actor298: swal + Owner: Scrin + Location: 82,34 + Actor299: swal + Owner: Scrin + Location: 81,34 + Actor300: swal + Owner: Scrin + Location: 83,34 + Actor301: swal + Owner: Scrin + Location: 83,35 + Actor302: swal + Owner: Scrin + Location: 83,36 + Actor303: swal + Owner: Scrin + Location: 84,36 + Actor304: swal + Owner: Scrin + Location: 85,36 + Actor305: swal + Owner: Scrin + Location: 86,36 + Actor306: swal + Owner: Scrin + Location: 86,35 + Actor307: swal + Owner: Scrin + Location: 86,37 + Actor308: swal + Owner: Scrin + Location: 87,37 + Actor309: swal + Owner: Scrin + Location: 88,37 + Actor310: swal + Owner: Scrin + Location: 87,35 + Actor311: swal + Owner: Scrin + Location: 88,35 + Actor312: swal + Owner: Scrin + Location: 88,36 + Actor313: swal + Owner: Scrin + Location: 95,35 + Actor314: swal + Owner: Scrin + Location: 95,36 + Actor315: swal + Owner: Scrin + Location: 95,37 + Actor316: swal + Owner: Scrin + Location: 97,37 + Actor317: swal + Owner: Scrin + Location: 96,37 + Actor318: swal + Owner: Scrin + Location: 96,35 + Actor319: swal + Owner: Scrin + Location: 97,35 + Actor320: swal + Owner: Scrin + Location: 97,36 + Actor321: swal + Owner: Scrin + Location: 98,36 + Actor322: swal + Owner: Scrin + Location: 99,36 + Actor323: swal + Owner: Scrin + Location: 100,36 + Actor324: swal + Owner: Scrin + Location: 102,36 + Actor325: swal + Owner: Scrin + Location: 101,36 + Actor326: swal + Owner: Scrin + Location: 103,36 + Actor327: swal + Owner: Scrin + Location: 105,36 + Actor328: swal + Owner: Scrin + Location: 104,36 + Actor329: swal + Owner: Scrin + Location: 105,35 + Actor330: swal + Owner: Scrin + Location: 105,37 + Actor331: swal + Owner: Scrin + Location: 106,37 + Actor332: swal + Owner: Scrin + Location: 107,37 + Actor333: swal + Owner: Scrin + Location: 106,35 + Actor334: swal + Owner: Scrin + Location: 107,35 + Actor335: swal + Owner: Scrin + Location: 107,36 + Actor336: swal + Owner: Scrin + Location: 103,22 + Actor337: swal + Owner: Scrin + Location: 104,22 + Actor338: swal + Owner: Scrin + Location: 105,22 + Actor339: swal + Owner: Scrin + Location: 105,23 + Actor340: swal + Owner: Scrin + Location: 104,24 + Actor341: swal + Owner: Scrin + Location: 103,24 + Actor342: swal + Owner: Scrin + Location: 103,23 + Actor343: swal + Owner: Scrin + Location: 105,24 + Actor344: swal + Owner: Scrin + Location: 111,21 + Actor345: swal + Owner: Scrin + Location: 112,21 + Actor346: swal + Owner: Scrin + Location: 112,22 + Actor347: swal + Owner: Scrin + Location: 112,23 + Actor348: swal + Owner: Scrin + Location: 110,23 + Actor349: swal + Owner: Scrin + Location: 110,21 + Actor350: swal + Owner: Scrin + Location: 110,22 + Actor351: swal + Owner: Scrin + Location: 111,23 + NPowered12: scol + Owner: Scrin + Location: 111,22 + NPowered11: scol + Owner: Scrin + Location: 104,23 + NPowered9: scol + Owner: Scrin + Location: 91,22 + NPowered8: scol + Owner: Scrin + Location: 81,23 + NPowered1: scol + Owner: Scrin + Location: 76,34 + NPowered4: scol + Owner: Scrin + Location: 87,36 + NPowered5: scol + Owner: Scrin + Location: 96,36 + NPowered6: scol + Owner: Scrin + Location: 106,36 + NerveCenter2: nerv + Owner: Scrin + Location: 98,27 + Actor362: scrt + Owner: Scrin + Location: 108,29 + Actor363: sfac + Owner: Scrin + Location: 78,28 + NPower5: rea2 + Owner: Scrin + Location: 98,33 + NPower4: rea2 + Owner: Scrin + Location: 82,30 + NPower3: rea2 + Owner: Scrin + Location: 82,26 + NPower6: rea2 + Owner: Scrin + Location: 102,33 + NPower7: rea2 + Owner: Scrin + Location: 104,30 + Actor372: grav + Owner: Scrin + Location: 99,21 + NPower8: rea2 + Owner: Scrin + Location: 110,29 + NPower9: rea2 + Owner: Scrin + Location: 110,25 + NPower1: rea2 + Owner: Scrin + Location: 76,23 + NPower2: rea2 + Owner: Scrin + Location: 74,30 + Actor405: sign + Owner: Scrin + Location: 103,26 + Actor406: ptur + Owner: Scrin + Location: 88,38 + TurretFacing: 372 + Actor407: ptur + Owner: Scrin + Location: 95,38 + TurretFacing: 412 + NPowered2: shar + Owner: Scrin + Location: 79,33 + TurretFacing: 192 + NPowered3: shar + Owner: Scrin + Location: 84,35 + TurretFacing: 192 + NPowered7: shar + Owner: Scrin + Location: 107,34 + TurretFacing: 192 + NPowered10: shar + Owner: Scrin + Location: 98,17 + TurretFacing: 192 + Actor412: split2 + Owner: Neutral + Location: 82,15 + Actor413: split2 + Owner: Neutral + Location: 90,13 + Actor414: split2 + Owner: Neutral + Location: 85,8 + Actor415: split2 + Owner: Neutral + Location: 97,9 + Actor416: split2 + Owner: Neutral + Location: 106,15 + Actor417: split2 + Owner: Neutral + Location: 110,10 + Actor418: split2 + Owner: Neutral + Location: 79,4 + Actor419: swal + Owner: Scrin + Location: 64,57 + Actor420: swal + Owner: Scrin + Location: 64,58 + Actor421: swal + Owner: Scrin + Location: 65,57 + Actor424: swal + Owner: Scrin + Location: 64,59 + Actor425: swal + Owner: Scrin + Location: 65,59 + Actor426: swal + Owner: Scrin + Location: 66,59 + Actor432: swal + Owner: Scrin + Location: 73,63 + Actor433: swal + Owner: Scrin + Location: 73,62 + Actor434: swal + Owner: Scrin + Location: 73,61 + Actor435: swal + Owner: Scrin + Location: 72,61 + Actor436: swal + Owner: Scrin + Location: 71,61 + Actor437: swal + Owner: Scrin + Location: 71,62 + Actor438: swal + Owner: Scrin + Location: 71,63 + Actor439: swal + Owner: Scrin + Location: 72,63 + Actor422: swal + Owner: Scrin + Location: 66,57 + Actor423: swal + Owner: Scrin + Location: 66,58 + Actor427: swal + Owner: Scrin + Location: 65,56 + Actor428: swal + Owner: Scrin + Location: 65,55 + Actor429: swal + Owner: Scrin + Location: 65,54 + Actor430: swal + Owner: Scrin + Location: 65,53 + Actor431: swal + Owner: Scrin + Location: 65,52 + Actor440: swal + Owner: Scrin + Location: 66,52 + Actor441: swal + Owner: Scrin + Location: 66,53 + Actor442: swal + Owner: Scrin + Location: 73,60 + Actor443: swal + Owner: Scrin + Location: 74,60 + Actor444: swal + Owner: Scrin + Location: 75,60 + Actor445: swal + Owner: Scrin + Location: 76,60 + Actor446: swal + Owner: Scrin + Location: 77,60 + Actor447: swal + Owner: Scrin + Location: 77,59 + Actor448: swal + Owner: Scrin + Location: 76,59 + ShardLauncher1: shar + Owner: Scrin + Location: 66,54 + TurretFacing: 192 + ShardLauncher2: shar + Owner: Scrin + Location: 75,59 + TurretFacing: 192 + StormColumn2: scol + Owner: Scrin + Location: 72,62 + StormColumn1: scol + Owner: Scrin + Location: 65,58 + Actor451: ptur + Owner: Scrin + Location: 68,61 + TurretFacing: 428 + Actor454: swal + Owner: Scrin + Location: 63,57 + Actor455: swal + Owner: Scrin + Location: 62,57 + Actor456: swal + Owner: Scrin + Location: 61,57 + Actor457: swal + Owner: Scrin + Location: 61,58 + Actor458: swal + Owner: Scrin + Location: 62,58 + Actor459: swal + Owner: Scrin + Location: 73,64 + Actor460: swal + Owner: Scrin + Location: 73,65 + Actor461: swal + Owner: Scrin + Location: 73,66 + Actor462: swal + Owner: Scrin + Location: 72,66 + Actor463: swal + Owner: Scrin + Location: 72,65 + Actor464: scrinflora5 + Owner: Neutral + Location: 40,49 + Actor465: scrinflora1 + Owner: Neutral + Location: 5,51 + Actor466: scrinflora4 + Owner: Neutral + Location: 15,52 + Actor467: scrinflora3 + Owner: Neutral + Location: 23,62 + Actor468: scrinflora2 + Owner: Neutral + Location: 22,63 + Actor469: scrinflora4 + Owner: Neutral + Location: 11,78 + Actor470: scrinflora13 + Owner: Neutral + Location: 25,67 + Actor471: scrinflora10 + Owner: Neutral + Location: 23,63 + Actor472: scrinflora11 + Owner: Neutral + Location: 18,56 + Actor473: scrinflora10 + Owner: Neutral + Location: 29,65 + Actor474: scrinflora14 + Owner: Neutral + Location: 10,78 + Actor475: scrinflora12 + Owner: Neutral + Location: 4,73 + Actor476: scrinflora1 + Owner: Neutral + Location: 25,82 + Actor477: scrinflora2 + Owner: Neutral + Location: 42,59 + Actor478: scrinflora6 + Owner: Neutral + Location: 85,82 + Actor481: scrinflora7 + Owner: Neutral + Location: 54,62 + Actor483: scrinflora1 + Owner: Neutral + Location: 34,94 + Actor486: scrinflora1 + Owner: Neutral + Location: 85,81 + Actor487: scrinflora4 + Owner: Neutral + Location: 105,87 + Actor488: scrinflora1 + Owner: Neutral + Location: 102,87 + Actor489: scrinflora2 + Owner: Neutral + Location: 100,71 + Actor490: scrinflora3 + Owner: Neutral + Location: 108,66 + Actor491: scrinflora12 + Owner: Neutral + Location: 108,63 + Actor492: scrinflora10 + Owner: Neutral + Location: 111,64 + Actor493: scrinflora11 + Owner: Neutral + Location: 103,59 + Actor494: scrinflora10 + Owner: Neutral + Location: 108,56 + Actor495: scrinflora10 + Owner: Neutral + Location: 78,53 + Actor496: scrinflora1 + Owner: Neutral + Location: 79,52 + Actor497: scrinflora5 + Owner: Neutral + Location: 90,49 + Actor498: scrinflora7 + Owner: Neutral + Location: 91,47 + Actor499: scrinflora1 + Owner: Neutral + Location: 101,47 + Actor500: scrinflora2 + Owner: Neutral + Location: 94,57 + Actor501: scrinflora3 + Owner: Neutral + Location: 66,45 + Actor502: scrinflora4 + Owner: Neutral + Location: 71,28 + Actor503: scrinflora1 + Owner: Neutral + Location: 65,37 + Actor504: scrinflora2 + Owner: Neutral + Location: 64,32 + Actor505: scrinflora1 + Owner: Neutral + Location: 56,58 + Actor506: scrinflora14 + Owner: Neutral + Location: 43,59 + Actor507: scrinflora10 + Owner: Neutral + Location: 41,59 + Actor508: scrinflora13 + Owner: Neutral + Location: 46,60 + Actor509: scrinflora9 + Owner: Neutral + Location: 45,60 + Actor512: scrinflora12 + Owner: Neutral + Location: 84,83 + Actor513: scrinflora12 + Owner: Neutral + Location: 99,91 + Actor514: scrinflora9 + Owner: Neutral + Location: 100,92 + Actor515: scrinflora11 + Owner: Neutral + Location: 93,88 + Actor516: scrinflora9 + Owner: Neutral + Location: 92,88 + Actor517: scrinflora9 + Owner: Neutral + Location: 82,92 + Actor518: scrinflora13 + Owner: Neutral + Location: 66,71 + Actor519: scrinflora11 + Owner: Neutral + Location: 65,71 + Actor520: scrinflora11 + Owner: Neutral + Location: 71,76 + Actor521: scrinflora9 + Owner: Neutral + Location: 72,76 + Actor522: scrinflora5 + Owner: Neutral + Location: 81,62 + Actor524: scrinflora8 + Owner: Neutral + Location: 111,85 + Actor525: scrinflora8 + Owner: Neutral + Location: 80,53 + Actor526: scrinflora8 + Owner: Neutral + Location: 71,19 + Actor527: scrinflora1 + Owner: Neutral + Location: 72,18 + Actor528: scrinflora5 + Owner: Neutral + Location: 67,22 + Actor529: scrinflora1 + Owner: Neutral + Location: 62,14 + Actor530: scrinflora2 + Owner: Neutral + Location: 61,13 + Actor531: scrinflora13 + Owner: Neutral + Location: 61,16 + Actor532: scrinflora12 + Owner: Neutral + Location: 57,10 + Actor533: scrinflora7 + Owner: Neutral + Location: 63,6 + Actor534: scrinflora4 + Owner: Neutral + Location: 48,5 + Actor535: scrinflora13 + Owner: Neutral + Location: 50,5 + Actor537: scrinflora11 + Owner: Neutral + Location: 47,5 + Actor536: scrinflora14 + Owner: Neutral + Location: 56,17 + Actor539: scrinflora14 + Owner: Neutral + Location: 55,58 + Actor540: scrinflora12 + Owner: Neutral + Location: 46,59 + Actor541: scrinflora2 + Owner: Neutral + Location: 84,82 + Actor542: scrinflora11 + Owner: Neutral + Location: 83,82 + Actor543: scrinflora5 + Owner: Neutral + Location: 89,93 + Actor544: scrinflora1 + Owner: Neutral + Location: 90,92 + Actor545: scrinflora7 + Owner: Neutral + Location: 108,94 + Actor546: scrinflora13 + Owner: Neutral + Location: 110,93 + Actor547: scrinflora12 + Owner: Neutral + Location: 80,42 + Blob3: tbcl + Owner: TibLifeforms + Location: 96,84 + Facing: 384 + Actor551: split2 + Owner: Neutral + Location: 82,88 + Actor552: split2 + Owner: Neutral + Location: 89,86 + HardOnlyUnit3: ruin + Owner: Scrin + Location: 67,55 + Facing: 384 + HardOnlyUnit4: ruin + Owner: Scrin + Location: 73,59 + Facing: 384 + Actor554: tpod + Owner: Scrin + Facing: 384 + Location: 99,39 + Actor555: gunw + Owner: Scrin + Facing: 384 + Location: 101,38 + Actor556: gunw + Owner: Scrin + Facing: 384 + Location: 103,41 + Actor557: gunw + Owner: Scrin + Location: 87,22 + Facing: 158 + Actor561: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 65,60 + Actor562: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 63,59 + Actor563: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 69,64 + Actor564: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 70,67 + Actor565: s1 + Owner: Scrin + Facing: 384 + Location: 69,64 + SubCell: 1 + Actor566: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 75,56 + Actor567: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 91,51 + Actor568: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 95,50 + Actor569: s2 + Owner: Scrin + Facing: 384 + Location: 77,55 + SubCell: 3 + Actor570: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 101,54 + Actor571: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 106,52 + Actor572: s3 + Owner: Scrin + SubCell: 3 + Location: 103,54 + Facing: 507 + Actor573: s3 + Owner: Scrin + SubCell: 3 + Location: 99,51 + Facing: 618 + Actor574: lace + Owner: Scrin + Location: 68,42 + Facing: 634 + Actor575: lace + Owner: Scrin + Location: 70,42 + Facing: 602 + Actor576: gunw + Owner: Scrin + Facing: 384 + Location: 70,32 + Actor577: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 69,31 + Actor578: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 71,34 + Actor579: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 69,33 + Actor580: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 97,40 + Actor581: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 99,41 + Actor582: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 92,39 + Actor583: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 86,38 + Actor584: devo + Owner: Scrin + Facing: 384 + Location: 101,52 + Actor612: swal + Owner: Scrin + Location: 50,68 + Actor613: swal + Owner: Scrin + Location: 50,69 + Actor614: swal + Owner: Scrin + Location: 49,68 + Actor615: swal + Owner: Scrin + Location: 49,69 + Actor616: swal + Owner: Scrin + Location: 56,73 + Actor617: swal + Owner: Scrin + Location: 55,73 + Actor618: swal + Owner: Scrin + Location: 55,74 + Actor619: swal + Owner: Scrin + Location: 56,74 + Actor620: swal + Owner: Scrin + Location: 57,73 + Actor621: swal + Owner: Scrin + Location: 58,73 + Actor622: swal + Owner: Scrin + Location: 59,74 + Actor623: swal + Owner: Scrin + Location: 58,74 + Actor624: swal + Owner: Scrin + Location: 59,73 + Actor625: swal + Owner: Scrin + Location: 56,72 + Actor626: swal + Owner: Scrin + Location: 55,72 + Actor627: swal + Owner: Scrin + Location: 58,72 + Actor628: swal + Owner: Scrin + Location: 59,72 + Actor629: swal + Owner: Scrin + Location: 48,66 + Actor630: swal + Owner: Scrin + Location: 48,67 + Actor631: swal + Owner: Scrin + Location: 49,67 + Actor632: swal + Owner: Scrin + Location: 49,66 + Actor643: swal + Owner: Scrin + Location: 59,78 + Actor644: swal + Owner: Scrin + Location: 59,77 + Actor645: swal + Owner: Scrin + Location: 59,75 + Actor646: swal + Owner: Scrin + Location: 59,76 + NerveCenter1: nerv + Owner: Scrin + Location: 54,68 + Actor591: swal + Owner: Scrin + Location: 41,66 + Actor592: swal + Owner: Scrin + Location: 42,66 + Actor594: swal + Owner: Scrin + Location: 41,67 + Actor595: swal + Owner: Scrin + Location: 42,67 + Actor597: swal + Owner: Scrin + Location: 41,68 + Actor598: swal + Owner: Scrin + Location: 41,69 + Actor599: swal + Owner: Scrin + Location: 41,70 + Actor602: swal + Owner: Scrin + Location: 41,71 + Actor479: swal + Owner: Scrin + Location: 42,70 + Actor480: swal + Owner: Scrin + Location: 42,71 + Actor482: swal + Owner: Scrin + Location: 41,75 + Actor484: swal + Owner: Scrin + Location: 42,75 + Actor485: swal + Owner: Scrin + Location: 41,76 + Actor510: swal + Owner: Scrin + Location: 42,76 + Actor511: swal + Owner: Scrin + Location: 41,77 + Actor523: swal + Owner: Scrin + Location: 41,78 + Actor538: swal + Owner: Scrin + Location: 41,79 + Actor558: swal + Owner: Scrin + Location: 43,79 + Actor559: swal + Owner: Scrin + Location: 42,79 + Actor560: swal + Owner: Scrin + Location: 45,79 + Actor585: swal + Owner: Scrin + Location: 44,79 + Actor586: swal + Owner: Scrin + Location: 46,79 + Actor587: swal + Owner: Scrin + Location: 47,79 + Actor588: swal + Owner: Scrin + Location: 47,78 + Actor589: swal + Owner: Scrin + Location: 46,78 + Actor590: swal + Owner: Scrin + Location: 51,78 + Actor593: swal + Owner: Scrin + Location: 51,79 + Actor596: swal + Owner: Scrin + Location: 52,78 + Actor600: swal + Owner: Scrin + Location: 52,79 + Actor601: swal + Owner: Scrin + Location: 53,79 + Actor603: swal + Owner: Scrin + Location: 55,79 + Actor604: swal + Owner: Scrin + Location: 56,79 + Actor605: swal + Owner: Scrin + Location: 58,79 + Actor606: swal + Owner: Scrin + Location: 59,79 + Actor607: swal + Owner: Scrin + Location: 57,79 + Actor608: swal + Owner: Scrin + Location: 54,79 + Actor609: swal + Owner: Scrin + Location: 58,78 + ScrinSilo1: silo.scrin + Owner: Scrin + Location: 55,76 + ScrinSilo3: silo.scrin + Owner: Scrin + Location: 56,77 + ScrinSilo2: silo.scrin + Owner: Scrin + Location: 57,76 + ScrinRef2: proc.scrin + Owner: Scrin + Location: 49,72 + Actor648: wsph + Owner: Scrin + Location: 88,27 + Actor651: port + Owner: Scrin + Location: 94,29 + Actor649: srep + Owner: Scrin + Location: 93,25 + Actor650: proc.scrin + Owner: Scrin + Location: 94,20 + SPowered1: scol + Owner: Scrin + Location: 42,69 + SPowered4: scol + Owner: Scrin + Location: 53,78 + SPowered2: scol + Owner: Scrin + Location: 42,78 + SPower3: rea2 + Owner: Scrin + Location: 68,89 + SPower2: rea2 + Owner: Scrin + Location: 65,89 + SPower1: reac + Owner: Scrin + Location: 63,89 + Actor647: swal + Owner: Scrin + Location: 63,88 + Actor654: swal + Owner: Scrin + Location: 62,88 + Actor655: swal + Owner: Scrin + Location: 62,89 + Actor656: swal + Owner: Scrin + Location: 62,90 + Actor657: swal + Owner: Scrin + Location: 62,91 + Actor658: swal + Owner: Scrin + Location: 62,92 + Actor659: swal + Owner: Scrin + Location: 64,92 + Actor660: swal + Owner: Scrin + Location: 63,92 + Actor661: swal + Owner: Scrin + Location: 65,92 + Actor662: swal + Owner: Scrin + Location: 67,92 + Actor663: swal + Owner: Scrin + Location: 66,92 + Actor664: swal + Owner: Scrin + Location: 68,92 + Actor665: swal + Owner: Scrin + Location: 69,92 + Actor666: swal + Owner: Scrin + Location: 70,92 + Actor667: swal + Owner: Scrin + Location: 71,92 + Actor668: swal + Owner: Scrin + Location: 71,91 + Actor669: swal + Owner: Scrin + Location: 71,90 + Actor670: swal + Owner: Scrin + Location: 71,89 + Actor671: swal + Owner: Scrin + Location: 71,88 + Actor672: swal + Owner: Scrin + Location: 69,88 + Actor673: swal + Owner: Scrin + Location: 70,88 + Actor674: swal + Owner: Scrin + Location: 65,88 + Actor675: swal + Owner: Scrin + Location: 64,88 + Actor676: swal + Owner: Scrin + Location: 66,88 + Actor677: swal + Owner: Scrin + Location: 67,88 + Actor678: swal + Owner: Scrin + Location: 68,88 + Actor679: ptur + Owner: Scrin + Location: 68,87 + TurretFacing: 176 + Actor681: split2 + Owner: Neutral + Location: 36,69 + Actor680: scrinflora5 + Owner: Neutral + Location: 40,85 + Actor682: scrinflora2 + Owner: Neutral + Location: 45,84 + Actor683: scrinflora3 + Owner: Neutral + Location: 46,91 + Actor684: scrinflora7 + Owner: Neutral + Location: 53,95 + Actor685: scrinflora1 + Owner: Neutral + Location: 59,87 + Actor686: scrinflora2 + Owner: Neutral + Location: 65,85 + Actor687: scrinflora14 + Owner: Neutral + Location: 55,94 + Actor688: scrinflora12 + Owner: Neutral + Location: 39,85 + Actor689: scrinflora9 + Owner: Neutral + Location: 35,94 + Actor690: scrinflora10 + Owner: Neutral + Location: 46,84 + Actor691: scrinflora11 + Owner: Neutral + Location: 56,95 + Actor692: scrinflora14 + Owner: Neutral + Location: 58,87 + Actor693: scrinflora13 + Owner: Neutral + Location: 60,78 + SPowered3: scol + Owner: Scrin + Location: 52,71 + Actor695: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 38,75 + Actor696: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 38,87 + Actor697: s1 + Owner: Scrin + SubCell: 3 + Location: 38,90 + Facing: 118 + Actor698: s3 + Owner: Scrin + SubCell: 3 + Location: 40,89 + Facing: 245 + Actor699: seek + Owner: Scrin + Location: 46,81 + Facing: 602 + Actor700: seek + Owner: Scrin + Location: 39,73 + Facing: 384 + Actor701: seek + Owner: Scrin + Location: 39,78 + Facing: 341 + Actor702: s1 + Owner: Scrin + SubCell: 3 + Location: 51,80 + Facing: 507 + Actor703: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 43,81 + Actor704: s1 + Owner: Scrin + SubCell: 3 + Location: 52,81 + Facing: 594 + Actor705: s3 + Owner: Scrin + SubCell: 3 + Location: 47,83 + Facing: 618 + PlayerStart: waypoint + Owner: Neutral + Location: 17,13 + Actor707: n1 + Owner: GDI + SubCell: 1 + Facing: 512 + Location: 14,14 + Actor708: n1 + Owner: GDI + SubCell: 4 + Facing: 512 + Location: 14,14 + Actor709: n1 + Owner: GDI + SubCell: 5 + Facing: 512 + Location: 14,14 + Actor710: n1 + Owner: GDI + SubCell: 2 + Facing: 512 + Location: 14,14 + Actor711: n1 + Owner: GDI + SubCell: 1 + Facing: 512 + Location: 20,14 + Actor712: n1 + Owner: GDI + SubCell: 4 + Facing: 512 + Location: 20,14 + Actor713: n1 + Owner: GDI + SubCell: 5 + Facing: 512 + Location: 20,14 + Actor714: n1 + Owner: GDI + SubCell: 2 + Facing: 512 + Location: 20,14 + Actor717: xo + Owner: GDI + Location: 14,16 + Facing: 512 + Actor718: xo + Owner: GDI + Location: 20,16 + Facing: 512 + NormalEasyOnlyUnit1: xo + Owner: GDI + Location: 17,16 + Facing: 512 + Actor715: n3 + Owner: GDI + SubCell: 1 + Facing: 512 + Location: 16,13 + Actor716: n3 + Owner: GDI + SubCell: 2 + Facing: 512 + Location: 16,13 + NormalEasyOnlyUnit2: medi + Owner: GDI + SubCell: 2 + Location: 16,14 + Facing: 512 + Actor721: medi + Owner: GDI + SubCell: 1 + Facing: 512 + Location: 16,14 + Actor722: n3 + Owner: GDI + SubCell: 1 + Facing: 512 + Location: 18,13 + Actor723: n3 + Owner: GDI + SubCell: 2 + Facing: 512 + Location: 18,13 + Actor724: medi + Owner: GDI + SubCell: 2 + Location: 18,14 + Facing: 512 + NormalEasyOnlyUnit3: medi + Owner: GDI + SubCell: 1 + Location: 18,14 + Facing: 512 + Actor652: gscr + Owner: Scrin + SubCell: 3 + Location: 47,22 + Facing: 214 + HardOnlyUnit2: gscr + Owner: Scrin + SubCell: 3 + Location: 49,21 + Facing: 253 + HardOnlyUnit1: gscr + Owner: Scrin + SubCell: 3 + Location: 10,34 + Facing: 880 + Actor726: gscr + Owner: Scrin + SubCell: 3 + Location: 14,38 + Facing: 0 + Actor727: s1 + Owner: Scrin + SubCell: 3 + Location: 50,33 + Facing: 1023 + Actor728: s1 + Owner: Scrin + SubCell: 3 + Location: 52,37 + Facing: 1023 + Actor729: intl + Owner: Scrin + Location: 10,51 + Facing: 0 + Actor730: s1 + Owner: Scrin + SubCell: 3 + Location: 8,52 + Facing: 1023 + Actor731: s1 + Owner: Scrin + SubCell: 3 + Location: 12,52 + Facing: 1023 + Actor732: corr + Owner: Scrin + Location: 35,54 + Facing: 927 + ScrinAttack1: waypoint + Owner: Neutral + Location: 90,43 + ScrinAttack2: waypoint + Owner: Neutral + Location: 74,52 + ScrinAttack3: waypoint + Owner: Neutral + Location: 65,77 + ScrinAttack4: waypoint + Owner: Neutral + Location: 20,71 + ScrinRef1: proc.scrin + Owner: Scrin + Location: 44,70 + SPowered5: shar + Owner: Scrin + Location: 47,69 + TurretFacing: 192 + Reveal1: waypoint + Owner: Neutral + Location: 41,73 + Reveal2: waypoint + Owner: Neutral + Location: 49,79 + BlobPatrol1: waypoint + Owner: Neutral + Location: 12,63 + BlobPatrol4: waypoint + Owner: Neutral + Location: 48,38 + BlobPatrol6: waypoint + Owner: Neutral + Location: 52,22 + BlobPatrol8: waypoint + Owner: Neutral + Location: 31,25 + BlobPatrol10: waypoint + Owner: Neutral + Location: 10,27 + BlobPatrol2: waypoint + Owner: Neutral + Location: 28,58 + BlobPatrol3: waypoint + Owner: Neutral + Location: 42,50 + BlobPatrol5: waypoint + Owner: Neutral + Location: 53,26 + BlobPatrol7: waypoint + Owner: Neutral + Location: 45,21 + BlobPatrol9: waypoint + Owner: Neutral + Location: 20,24 + BlobPatrol11: waypoint + Owner: Neutral + Location: 9,44 + BlobPatrolB1: waypoint + Owner: Neutral + Location: 105,81 + BlobPatrolB6: waypoint + Owner: Neutral + Location: 75,90 + BlobPatrolB2: waypoint + Owner: Neutral + Location: 104,64 + BlobPatrolB3: waypoint + Owner: Neutral + Location: 86,50 + BlobPatrolB5: waypoint + Owner: Neutral + Location: 63,66 + BlobPatrolB4: waypoint + Owner: Neutral + Location: 73,53 + Actor548: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 59,91 + Actor549: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 66,94 + Actor610: gscr + Owner: Scrin + SubCell: 3 + Location: 71,95 + Facing: 190 + Actor611: s1 + Owner: Scrin + SubCell: 3 + Location: 63,77 + Facing: 555 + Actor633: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 64,73 + Actor634: s3 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 65,74 + Actor636: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 49,91 + Actor637: s1 + Owner: Scrin + SubCell: 3 + Location: 15,73 + Facing: 896 + Actor642: s1 + Owner: Scrin + SubCell: 3 + Location: 9,69 + Facing: 785 + Actor694: s1 + Owner: Scrin + SubCell: 3 + Location: 36,43 + Facing: 800 + Actor733: s1 + Owner: Scrin + SubCell: 3 + Location: 46,52 + Facing: 150 + Actor734: s1 + Owner: Scrin + SubCell: 3 + Location: 45,52 + Facing: 0 + Actor736: s1 + Owner: Scrin + SubCell: 3 + Facing: 816 + Location: 33,53 + Actor735: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 41,90 + Actor737: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 58,90 + Actor738: s4 + Owner: Scrin + SubCell: 3 + Location: 38,56 + Facing: 95 + Actor739: gdrn + Owner: GDI + Location: 15,15 + Facing: 512 + Actor740: gdrn + Owner: GDI + Facing: 512 + Location: 19,15 + ScrinAttack2b: waypoint + Owner: Neutral + Location: 41,45 + Actor550: gscr + Owner: Scrin + SubCell: 3 + Location: 11,70 + Facing: 919 + HardOnlyUnit5: gscr + Owner: Scrin + SubCell: 3 + Location: 13,73 + Facing: 0 + Actor553: camera + Owner: Scrin + Location: 60,68 + Actor635: camera + Owner: Scrin + Location: 65,79 + Actor638: camera + Owner: Scrin + Location: 35,82 + Actor639: camera + Owner: Scrin + Location: 36,52 + Actor640: camera + Owner: Scrin + Location: 26,61 + Actor641: camera + Owner: Scrin + Location: 75,53 + Actor653: mast + Owner: Scrin + SubCell: 3 + Location: 81,29 + Facing: 539 + TibSpawn1: waypoint + Owner: Neutral + Location: 1,1 + TibSpawn2: waypoint + Owner: Neutral + Location: 37,1 + BlobExtraPatrol1: waypoint + Owner: Neutral + Location: 26,75 + BlobExtraPatrol2: waypoint + Owner: Neutral + Location: 54,83 + BlobExtraPatrol3: waypoint + Owner: Neutral + Location: 69,80 + BlobExtraPatrol4: waypoint + Owner: Neutral + Location: 76,94 + BlobExtraPatrol5: waypoint + Owner: Neutral + Location: 39,94 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, foothold-rules.yaml + +Sequences: foothold-sequences.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/main-campaign/ca32-convergence/beepslct.aud b/mods/ca/missions/main-campaign/ca32-convergence/beepslct.aud new file mode 100644 index 0000000000..c6bb2f8a45 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca32-convergence/beepslct.aud differ diff --git a/mods/ca/missions/main-campaign/ca32-convergence/c_acrossriver.aud b/mods/ca/missions/main-campaign/ca32-convergence/c_acrossriver.aud new file mode 100644 index 0000000000..c91f31ccc8 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca32-convergence/c_acrossriver.aud differ diff --git a/mods/ca/missions/main-campaign/ca32-convergence/c_scrinfleetvessels.aud b/mods/ca/missions/main-campaign/ca32-convergence/c_scrinfleetvessels.aud new file mode 100644 index 0000000000..624eb38ae2 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca32-convergence/c_scrinfleetvessels.aud differ diff --git a/mods/ca/missions/main-campaign/ca32-convergence/convergence-rules.yaml b/mods/ca/missions/main-campaign/ca32-convergence/convergence-rules.yaml new file mode 100644 index 0000000000..37ad57842f --- /dev/null +++ b/mods/ca/missions/main-campaign/ca32-convergence/convergence-rules.yaml @@ -0,0 +1,145 @@ +^Palettes: + PaletteFromFile@terrain-temperat: + Filename: alien.pal + FlashPostProcessEffect@LIGHTNINGSTRIKE: + Type: LightningStrike + FlashPostProcessEffect@IONSTRIKE: + Type: IonStrike + Color: D48FFF + TintPostProcessEffect: + Red: 1 + Green: 1 + Blue: 1.2 + Ambient: 0.4 + +^BaseWorld: + TerrainLighting: + +World: + LuaScript: + Scripts: campaign.lua, convergence.lua + MissionData: + Briefing: We have built up a sizeable force on the other side of the gateway and continue to reinforce our positions. It was beginning to seem like the Scrin were uninterested in our presence, however our sensor network has detected a large Scrin fleet accompanied by ground forces heading towards us at great speed.\n\nThe odds are stacked against us, but we have little choice but to fight. If we lose our foothold, it's only a matter of time before the Scrin mount a full-scale invasion of Earth, in addition to losing our ability to put a stop to whatever Kane is up to (assuming the Scrin have not done so already).\n\nOne of our remote outposts was seemingly ignored by the advancing Scrin forces, which seem to be making a beeline for our main base.\n\nOur main defensive line to the north is still being prepared. Your mission is to bolster the defenses as much as possible, and prevent the Scrin fleet ships from breaking through. + MapOptions: + ShortGameCheckboxEnabled: False + MusicPlaylist: + StartingMusic: heroism + +Player: + PlayerResources: + DefaultCash: 6000 + +# Enable subfaction specific tech + +XO: + Buildable: + Prerequisites: gtek, ~vehicles.gdi + +WOLV: + Buildable: + Prerequisites: gtek, ~vehicles.gdi + +PBUL: + Buildable: + Prerequisites: gtek, ~vehicles.gdi + +STWR: + Buildable: + Prerequisites: vehicles.any, ~structures.gdi + +ionmam.upgrade: + Buildable: + Prerequisites: upgc, !mdrone.upgrade, !hovermam.upgrade + TooltipExtras: + Attributes: \n(!) Only ONE Mammoth Tank upgrade can be chosen + +hovermam.upgrade: + Buildable: + Prerequisites: upgc, !ionmam.upgrade, !mdrone.upgrade + TooltipExtras: + Attributes: \n(!) Only ONE Mammoth Tank upgrade can be chosen + +mdrone.upgrade: + Buildable: + Prerequisites: upgc, !ionmam.upgrade, !hovermam.upgrade + TooltipExtras: + Attributes: \n(!) Only ONE Mammoth Tank upgrade can be chosen + +# Disable tech + +AFLD.GDI: + -InterceptorPower@AirDef: + +HQ: + -DropPodsPowerCA@Zocom: + -AirstrikePowerCA@uav: + -AirstrikePowerCA@uavST: + +EYE: + Inherits@CAMPAIGNDISABLED: ^Disabled + +upgc.drop: + Inherits@CAMPAIGNDISABLED: ^Disabled + +# Misc + +DEVA: + Aircraft: + Speed: 49 + +PAC: + Aircraft: + Speed: 49 + +TBCL: + Inherits@A2GPROTECTION: ^AirToGroundProtection + Wanders: + MinMoveDelay: 0 + MaxMoveDelay: 50 + AvoidTerrainTypes: Beach, Water, Rock + Health: + HP: 350000 + +SCOL: + Power: + Amount: 0 + DamageMultiplier@BUFF: + Modifier: 50 + FirepowerMultiplier@BUFF: + Modifier: 120 + +SHAR: + Power: + Amount: 0 + DamageMultiplier@BUFF: + Modifier: 50 + FirepowerMultiplier@BUFF: + Modifier: 120 + +pathrenderer: + Inherits: ^InvisibleDummy + HitShape: + BodyOrientation: + QuantizedFacings: 1 + Immobile: + OccupiesSpace: false + RenderLine: + Angle: 512 + Length: 95c0 + Color: ff000033 + Width: 2 + DashLength: 0c256 + FadeTicks: 50 + RequiresCondition: radarenabled + GrantConditionOnPrerequisite@RADAR: + Condition: radarenabled + Prerequisites: radar-active + +# Hunt() requires only 1 AttackBase +DEVA: + -AttackFrontalCharged: + -Armament@PRIMARYUPG: + -AmbientSound@CHARGE: + -WithIdleOverlay@CHARGE1: + -WithIdleOverlay@CHARGE2: + -WithIdleOverlay@CHARGE3: diff --git a/mods/ca/missions/main-campaign/ca32-convergence/convergence.lua b/mods/ca/missions/main-campaign/ca32-convergence/convergence.lua new file mode 100644 index 0000000000..1477ca3162 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca32-convergence/convergence.lua @@ -0,0 +1,369 @@ +MissionDir = "ca|missions/main-campaign/ca32-convergence" + +MaxBreakthroughs = { + easy = 6, + normal = 3, + hard = 0, + vhard = 0, + brutal = 0 +} + +FleetWaveCompositions = { + easy = { + { "pac", "pac", "deva" }, + { "pac", "deva", "deva" } + }, + normal = { + { "pac", "pac", "deva", "pac" }, + { "pac", "deva", "deva", "pac" }, + }, + hard = { + { "pac", "pac", "deva", "pac", "deva" }, + { "pac", "deva", "pac", "deva", "pac" }, + }, + vhard = { + { "pac", "pac", "deva", "pac", "deva" }, + { "pac", "deva", "pac", "deva", "pac" }, + }, + brutal = { + { "pac", "pac", "deva", "pac", "deva", "pac" }, + { "pac", "deva", "pac", "deva", "pac", "deva" }, + } +} + +TimeBetweenWaves = { + easy = DateTime.Minutes(3), + normal = DateTime.Minutes(3), + hard = DateTime.Minutes(3), + vhard = DateTime.Minutes(3), + brutal = DateTime.Minutes(3) +} + +FleetSpawns = { + Left = { LSpawn1, LSpawn2, LSpawn3 }, + Middle = { MSpawn1, MSpawn2 }, + Right = { RSpawn1, RSpawn2 }, + LeftAndRight = { LSpawn1, LSpawn2, LSpawn3, RSpawn1, RSpawn2 }, + MiddleAndRight = { MSpawn1, MSpawn2, RSpawn1, RSpawn2 }, + MiddleAndLeft = { MSpawn1, MSpawn2, LSpawn1, LSpawn2, LSpawn3 }, + Any = { LSpawn1, LSpawn2, LSpawn3, MSpawn1, MSpawn2, RSpawn1, RSpawn2 }, +} + +WaveSpawns = { + FleetSpawns.Left, FleetSpawns.Left, FleetSpawns.Left, FleetSpawns.Middle, FleetSpawns.Right, FleetSpawns.MiddleAndLeft, FleetSpawns.MiddleAndRight, FleetSpawns.LeftAndRight, FleetSpawns.Any, FleetSpawns.Any +} + +UnitBuildTimeMultipliers = { + easy = 0.3, + normal = 0.2, + hard = 0.1, + vhard = 0.1, + brutal = 0.1 +} + +LeftScrinSpawners = { ScrinSpawnerL1, ScrinSpawnerL2, ScrinSpawnerL3, ScrinSpawnerL4 } +MiddleScrinSpawners = { ScrinSpawnerM1, ScrinSpawnerM2 } + +Squads = { + ScrinMain = { + Delay = AdjustDelayForDifficulty(DateTime.Seconds(150)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 27, Max = 64 }), + FollowLeader = true, + RandomProducerActor = true, + ProducerActors = { Infantry = LeftScrinSpawners, Vehicles = LeftScrinSpawners, Aircraft = LeftScrinSpawners }, + Compositions = AdjustCompositionsForDifficulty(UnitCompositions.Scrin), + AttackPaths = { + { LAttackRally1a.Location, LAttackRally1b.Location }, + { LAttackRally2a.Location, LAttackRally2b.Location }, + { LAttackRally3a.Location, LAttackRally3b.Location } + }, + }, + ScrinWater = { + Delay = AdjustDelayForDifficulty(DateTime.Minutes(4)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 12, Max = 36 }), + FollowLeader = true, + RandomProducerActor = true, + ProducerActors = { Infantry = MiddleScrinSpawners, Vehicles = MiddleScrinSpawners, Aircraft = MiddleScrinSpawners }, + Compositions = ScrinWaterCompositions, + AttackPaths = { + { MAttackRally1.Location }, + { MAttackRally1.Location }, + { MAttackRally2a.Location, MAttackRally2b.Location }, + { MAttackRally2a.Location, MAttackRally2b.Location }, + { RAttackRally1.Location, RAttackRally2.Location, RAttackRally3.Location, MAttackRally2b.Location } + }, + }, +} + +SetupPlayers = function() + Scrin = Player.GetPlayer("Scrin") + GDI = Player.GetPlayer("GDI") + TibLifeforms = Player.GetPlayer("TibLifeforms") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = { GDI } + MissionEnemies = { Scrin } +end + +WorldLoaded = function() + SetupPlayers() + + TimerTicks = 0 + WavesRemaining = #WaveSpawns + NumBreakthroughs = 0 + NextWave = 1 + FinalWaveArrived = false + Camera.Position = PlayerStart.CenterPosition + + InitObjectives(GDI) + AdjustPlayerStartingCashForDifficulty() + InitScrin() + InitAiUpgrades(Scrin, 0) + SetupLightning() + SetupIonStorm() + UpdateMissionText() + + if IsNormalOrAbove() then + Sensor1.Destroy() + Sensor2.Destroy() + + if IsHardOrAbove() then + Sensor3.Destroy() + end + end + + Trigger.AfterDelay(DateTime.Seconds(10), function() + if IsHardOrAbove() then + Tip("Scrin fleet vessels will be pinged on the minimap when entering the area.") + else + Tip("Scrin fleet vessels will be pinged on the minimap when entering the area and their paths will be visible as long as you have an active radar.") + end + end) + + Trigger.AfterDelay(TimeBetweenWaves[Difficulty] + DateTime.Minutes(1), function() + SendFleetWave() + + Trigger.AfterDelay(DateTime.Seconds(120), function() + Notification("The area across the river is infested with Tiberium lifeforms. You will need to use aicraft to intercept Scrin fleet vessels attempting to break through there.") + MediaCA.PlaySound(MissionDir .. "/c_acrossriver.aud", 2) + Beacon.New(GDI, AcrossRiver.CenterPosition) + local acrossRiverCamera = Actor.Create("camera", true, { Owner = GDI, Location = AcrossRiver.Location }) + Trigger.AfterDelay(DateTime.Seconds(10), function() + acrossRiverCamera.Destroy() + end) + end) + end) + + if IsHardOrAbove() then + ObjectiveStopFleet = GDI.AddObjective("Prevent any Scrin fleet vessels breaking through.") + else + ObjectiveStopFleet = GDI.AddObjective("Allow no more than " .. MaxBreakthroughs[Difficulty] .. " fleet vessels through.") + end + + BottomOfMap = { } + for i=1, 128 do + table.insert(BottomOfMap, CPos.New(i,96)) + end + + AfterWorldLoaded() +end + +Tick = function() + OncePerSecondChecks() + OncePerFiveSecondChecks() + OncePerThirtySecondChecks() + AfterTick() +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + Scrin.Resources = Scrin.ResourceCapacity - 500 + + if NumBreakthroughs > MaxBreakthroughs[Difficulty] then + GDI.MarkFailedObjective(ObjectiveStopFleet) + end + + if FinalWaveArrived and #Scrin.GetActorsByTypes({ "pac", "deva" }) == 0 then + GDI.MarkCompletedObjective(ObjectiveStopFleet) + end + + if MissionPlayersHaveNoRequiredUnits() and not GDI.IsObjectiveCompleted(ObjectiveStopFleet) then + GDI.MarkFailedObjective(ObjectiveStopFleet) + end + + UpdateMissionText() + end +end + +OncePerFiveSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 125 == 0 then + UpdatePlayerBaseLocations() + end +end + +OncePerThirtySecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % DateTime.Seconds(30) == 0 then + CalculatePlayerCharacteristics() + end +end + +InitScrin = function() + AutoRepairBuildings(Scrin) + InitAttackSquad(Squads.ScrinMain, Scrin) + InitAttackSquad(Squads.ScrinWater, Scrin) + + Actor.Create("ioncon.upgrade", true, { Owner = Scrin }) + + local scrinGroundAttackers = Scrin.GetGroundAttackers() + + Utils.Do(scrinGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsScrinGroundHunterUnit) + end) +end + +SetupLightning = function() + local nextStrikeDelay = Utils.RandomInteger(DateTime.Seconds(8), DateTime.Seconds(25)) + Trigger.AfterDelay(nextStrikeDelay, function() + LightningStrike() + SetupLightning() + end) +end + +SetupIonStorm = function() + local nextStrikeDelay = Utils.RandomInteger(DateTime.Seconds(8), DateTime.Seconds(25)) + Trigger.AfterDelay(nextStrikeDelay, function() + IonStorm() + SetupIonStorm() + end) +end + +LightningStrike = function() + local duration = Utils.RandomInteger(5, 8) + local thunderDelay = Utils.RandomInteger(5, 65) + local soundNumber + Lighting.Flash("LightningStrike", duration) + + repeat + soundNumber = Utils.RandomInteger(1, 7) + until(soundNumber ~= LastSoundNumber) + LastSoundNumber = soundNumber + + Trigger.AfterDelay(thunderDelay, function() + Media.PlaySound("thunder" .. soundNumber .. ".aud") + end) +end + +IonStorm = function() + local duration = Utils.RandomInteger(5, 8) + local soundNumber + Lighting.Flash("IonStrike", duration) + repeat + soundNumber = Utils.RandomInteger(1, 4) + until(soundNumber ~= LastIonSoundNumber) + LastIonSoundNumber = soundNumber + Media.PlaySound("ionstorm" .. soundNumber .. ".aud") +end + +SendFleetWave = function() + Notification("Scrin fleet vessels approaching.") + MediaCA.PlaySound(MissionDir .. "/c_scrinfleetvessels.aud", 2) + local currentWave = NextWave + local interval = 1 + + if currentWave == 5 then + Utils.Do(FleetWaveCompositions[Difficulty], function(c) + table.insert(c, "pac") + if IsHardOrAbove() then + table.insert(c, "deva") + end + end) + end + if currentWave == 8 then + Utils.Do(FleetWaveCompositions[Difficulty], function(c) + table.insert(c, "deva") + if IsHardOrAbove() then + table.insert(c, "pac") + end + end) + end + if currentWave == 10 and Difficulty ~= "easy" then + Utils.Do(FleetWaveCompositions[Difficulty], function(c) + table.insert(c, "deva") + if IsHardOrAbove() then + table.insert(c, "pac") + end + end) + end + + local composition = Utils.Random(FleetWaveCompositions[Difficulty]) + + local xUsed = { } + + -- for each unit in the wave, get the possible base spawn points, pick one and generate offsetted entry/exit + Utils.Do(composition, function(shipType) + Trigger.AfterDelay(interval, function() + local spawn = nil + local xOffset = nil + local entry = nil + while entry == nil or xUsed[entry.X] ~= nil do + spawn = Utils.Random(WaveSpawns[currentWave]) + xOffset = Utils.RandomInteger(-7, 7) + entry = spawn.Location + CVec.New(xOffset, 0) + end + xUsed[entry.X] = true + local exit = CPos.New(entry.X, 96) + Beacon.New(GDI, spawn.CenterPosition + WVec.New(xOffset * 1024, 0, 0)) + local ships = Reinforcements.Reinforce(Scrin, { shipType }, { entry, exit }, 25, function(self) + self.Destroy() + NumBreakthroughs = NumBreakthroughs + 1 + Media.PlaySoundNotification(nil, "AlertBuzzer") + Notification("A Scrin fleet vessel has broken through.") + end) + if IsNormalOrBelow() then + local pathRenderer = Actor.Create("pathRenderer", true, { Owner = GDI, Location = entry }) + Trigger.OnRemovedFromWorld(ships[1], function(self) + pathRenderer.Destroy() + end) + end + Media.PlaySound(MissionDir .. "/beepslct.aud") + end) + + if currentWave >= 8 and IsHardOrAbove() then + interval = interval + DateTime.Seconds(3) + elseif currentWave >= 5 then + interval = interval + DateTime.Seconds(4) + else + interval = interval + DateTime.Seconds(5) + end + end) + + if currentWave == #WaveSpawns then + Trigger.AfterDelay(#composition * DateTime.Seconds(5), function() + FinalWaveArrived = true + end) + end + + NextWave = NextWave + 1 + WavesRemaining = WavesRemaining - 1 + + if NextWave <= #WaveSpawns then + Trigger.AfterDelay(TimeBetweenWaves[Difficulty], function() + SendFleetWave() + end) + end +end + +UpdateMissionText = function() + local missionText = "Waves remaining: " .. WavesRemaining + + if IsNormalOrBelow() then + missionText = missionText .. " -- Fleet vessels escaped: " .. NumBreakthroughs .. "/" .. MaxBreakthroughs[Difficulty] + end + + local color = HSLColor.Yellow + if IsNormalOrBelow() and NumBreakthroughs >= MaxBreakthroughs[Difficulty] then + color = HSLColor.Red + end + + UserInterface.SetMissionText(missionText, color) +end diff --git a/mods/ca/missions/main-campaign/ca32-convergence/map.bin b/mods/ca/missions/main-campaign/ca32-convergence/map.bin new file mode 100644 index 0000000000..14424c5759 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca32-convergence/map.bin differ diff --git a/mods/ca/missions/main-campaign/ca32-convergence/map.png b/mods/ca/missions/main-campaign/ca32-convergence/map.png new file mode 100644 index 0000000000..9ae4795b13 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca32-convergence/map.png differ diff --git a/mods/ca/missions/main-campaign/ca32-convergence/map.yaml b/mods/ca/missions/main-campaign/ca32-convergence/map.yaml new file mode 100644 index 0000000000..4138bbbcd6 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca32-convergence/map.yaml @@ -0,0 +1,1726 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 32: Convergence + +Author: Darkademic + +Tileset: TEMPERAT + +MapSize: 130,98 + +Bounds: 1,1,128,96 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: GDI, Scrin + PlayerReference@GDI: + Name: GDI + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: gdi + LockColor: True + Color: F2CF74 + LockSpawn: True + LockTeam: True + Enemies: Scrin, Creeps, TibLifeforms + PlayerReference@Scrin: + Name: Scrin + Bot: campaign + Faction: scrin + Color: 7700FF + Allies: TibLifeforms + Enemies: GDI, Creeps + PlayerReference@TibLifeforms: + Name: TibLifeforms + NonCombatant: True + Faction: scrin + Color: 00FF00 + Allies: Scrin + Enemies: GDI, Creeps + +Actors: + Actor0: sbag + Owner: GDI + Location: 42,89 + Actor1: sbag + Owner: GDI + Location: 43,89 + Actor2: sbag + Owner: GDI + Location: 44,89 + Actor3: sbag + Owner: GDI + Location: 41,89 + Actor4: sbag + Owner: GDI + Location: 41,88 + Actor5: sbag + Owner: GDI + Location: 41,87 + Actor6: sbag + Owner: GDI + Location: 41,85 + Actor7: sbag + Owner: GDI + Location: 41,86 + Actor8: sbag + Owner: GDI + Location: 41,84 + Actor9: sbag + Owner: GDI + Location: 41,80 + Actor10: sbag + Owner: GDI + Location: 41,79 + Actor11: sbag + Owner: GDI + Location: 41,78 + Actor12: sbag + Owner: GDI + Location: 41,77 + Actor13: sbag + Owner: GDI + Location: 41,76 + Actor14: sbag + Owner: GDI + Location: 41,75 + Actor15: sbag + Owner: GDI + Location: 41,74 + Actor16: sbag + Owner: GDI + Location: 41,73 + Actor17: sbag + Owner: GDI + Location: 42,73 + Actor18: sbag + Owner: GDI + Location: 43,73 + Actor19: sbag + Owner: GDI + Location: 44,73 + Actor20: sbag + Owner: GDI + Location: 49,73 + Actor21: sbag + Owner: GDI + Location: 50,73 + Actor22: sbag + Owner: GDI + Location: 52,73 + Actor23: sbag + Owner: GDI + Location: 51,73 + Actor24: sbag + Owner: GDI + Location: 53,73 + Actor25: sbag + Owner: GDI + Location: 54,73 + Actor27: sbag + Owner: GDI + Location: 55,73 + Actor28: sbag + Owner: GDI + Location: 56,73 + Actor29: sbag + Owner: GDI + Location: 57,73 + Actor31: sbag + Owner: GDI + Location: 58,73 + Actor32: sbag + Owner: GDI + Location: 59,73 + Actor33: sbag + Owner: GDI + Location: 60,73 + Actor34: sbag + Owner: GDI + Location: 60,74 + Actor35: sbag + Owner: GDI + Location: 38,73 + Actor36: sbag + Owner: GDI + Location: 38,74 + Actor37: sbag + Owner: GDI + Location: 37,73 + Actor38: sbag + Owner: GDI + Location: 36,73 + Actor41: atwr + Owner: GDI + Location: 50,74 + Actor42: atwr + Owner: GDI + Location: 43,74 + Actor43: gtwr + Owner: GDI + Location: 44,72 + Actor44: gtwr + Owner: GDI + Location: 49,72 + Actor45: afac + Owner: GDI + Location: 49,81 + Actor46: barb + Owner: GDI + Location: 49,70 + Actor47: barb + Owner: GDI + Location: 50,70 + Actor48: barb + Owner: GDI + Location: 51,70 + Actor49: barb + Owner: GDI + Location: 44,70 + Actor50: barb + Owner: GDI + Location: 43,70 + Actor51: barb + Owner: GDI + Location: 36,70 + Actor52: barb + Owner: GDI + Location: 37,70 + Actor53: barb + Owner: GDI + Location: 38,70 + Actor54: barb + Owner: GDI + Location: 55,68 + Actor55: barb + Owner: GDI + Location: 56,68 + Actor56: barb + Owner: GDI + Location: 55,69 + Actor57: barb + Owner: GDI + Location: 57,68 + Actor58: barb + Owner: GDI + Location: 58,68 + Actor59: barb + Owner: GDI + Location: 58,69 + Actor60: barb + Owner: GDI + Location: 36,69 + Actor61: barb + Owner: GDI + Location: 34,69 + Actor62: barb + Owner: GDI + Location: 35,69 + Actor63: barb + Owner: GDI + Location: 34,70 + Actor64: barb + Owner: GDI + Location: 33,70 + Actor65: barb + Owner: GDI + Location: 59,69 + Actor66: barb + Owner: GDI + Location: 42,70 + Actor67: gtwr + Owner: GDI + Location: 35,70 + Actor68: gtwr + Owner: GDI + Location: 56,69 + Actor69: proc.td + Owner: GDI + Location: 43,84 + Actor70: weap.td + Owner: GDI + Location: 43,78 + Actor72: cram + Owner: GDI + Location: 59,74 + Actor73: cram + Owner: GDI + Location: 37,74 + Actor74: sbag + Owner: GDI + Location: 36,74 + Actor75: sbag + Owner: GDI + Location: 58,74 + Actor78: nuk2 + Owner: GDI + Location: 48,85 + Actor79: nuk2 + Owner: GDI + Location: 50,85 + Actor80: nuk2 + Owner: GDI + Location: 52,85 + Actor81: silo.td + Owner: GDI + Location: 42,88 + Actor84: split2 + Owner: Neutral + Location: 34,86 + Actor85: split2 + Owner: Neutral + Location: 31,80 + Actor86: split3 + Owner: Neutral + Location: 29,89 + PlayerStart: waypoint + Owner: Neutral + Location: 47,75 + Actor87: gtwr + Owner: GDI + Location: 30,57 + Actor88: gtwr + Owner: GDI + Location: 42,56 + Actor89: barb + Owner: GDI + Location: 42,55 + Actor90: barb + Owner: GDI + Location: 43,55 + Actor91: barb + Owner: GDI + Location: 43,56 + Actor93: barb + Owner: GDI + Location: 41,55 + Actor94: barb + Owner: GDI + Location: 41,56 + Actor96: barb + Owner: GDI + Location: 29,56 + Actor97: barb + Owner: GDI + Location: 29,57 + Actor98: barb + Owner: GDI + Location: 30,56 + Actor99: barb + Owner: GDI + Location: 31,56 + Actor100: barb + Owner: GDI + Location: 31,57 + Actor101: barb + Owner: GDI + Location: 31,58 + Actor95: barb + Owner: GDI + Location: 41,57 + Actor102: barb + Owner: GDI + Location: 33,52 + Actor103: barb + Owner: GDI + Location: 34,52 + Actor104: barb + Owner: GDI + Location: 36,56 + Actor105: barb + Owner: GDI + Location: 37,56 + Actor106: sbag + Owner: GDI + Location: 51,61 + Actor107: sbag + Owner: GDI + Location: 52,61 + Actor108: sbag + Owner: GDI + Location: 52,62 + Actor109: sbag + Owner: GDI + Location: 50,61 + Actor110: sbag + Owner: GDI + Location: 58,60 + Actor111: sbag + Owner: GDI + Location: 59,60 + Actor112: sbag + Owner: GDI + Location: 60,60 + Actor113: sbag + Owner: GDI + Location: 24,61 + Actor114: sbag + Owner: GDI + Location: 25,61 + Actor115: sbag + Owner: GDI + Location: 26,61 + Actor116: sbag + Owner: GDI + Location: 27,61 + Actor117: sbag + Owner: GDI + Location: 27,62 + Actor118: n1 + Owner: GDI + Location: 26,62 + SubCell: 3 + Facing: 856 + Actor119: n1 + Owner: GDI + SubCell: 3 + Location: 36,57 + Facing: 0 + Actor120: n1 + Owner: GDI + SubCell: 3 + Location: 28,58 + Facing: 919 + Actor121: n1 + Owner: GDI + SubCell: 3 + Location: 43,57 + Facing: 214 + Actor122: n1 + Owner: GDI + SubCell: 3 + Location: 37,57 + Facing: 0 + Actor123: n1 + Owner: GDI + SubCell: 3 + Location: 59,61 + Facing: 0 + Actor124: n1 + Owner: GDI + Location: 58,61 + SubCell: 3 + Facing: 0 + Actor125: n1 + Owner: GDI + Location: 59,61 + SubCell: 1 + Facing: 0 + Actor127: n1 + Owner: GDI + Location: 51,62 + SubCell: 1 + Facing: 0 + Actor126: n3 + Owner: GDI + SubCell: 3 + Location: 59,62 + Facing: 777 + Actor128: n3 + Owner: GDI + SubCell: 3 + Location: 42,58 + Facing: 0 + Actor129: n3 + Owner: GDI + SubCell: 3 + Location: 29,59 + Facing: 872 + Actor130: n3 + Owner: GDI + SubCell: 3 + Location: 25,63 + Facing: 0 + Actor131: syrd.gdi + Owner: GDI + Location: 62,77 + Actor132: pt2 + Owner: GDI + Location: 71,82 + Facing: 0 + Actor134: pt2 + Owner: GDI + Location: 84,82 + Facing: 0 + Actor133: dd2 + Owner: GDI + Facing: 0 + Location: 78,84 + Actor135: tbcl + Owner: TibLifeforms + Facing: 384 + Location: 120,84 + Actor136: tbcl + Owner: TibLifeforms + Facing: 384 + Location: 114,78 + Actor137: tbcl + Owner: TibLifeforms + Facing: 384 + Location: 122,70 + Actor138: tbcl + Owner: TibLifeforms + Facing: 384 + Location: 113,65 + Actor139: tbcl + Owner: TibLifeforms + Facing: 384 + Location: 117,67 + Actor140: tbcl + Owner: TibLifeforms + Facing: 384 + Location: 122,56 + Actor141: tbcl + Owner: TibLifeforms + Facing: 384 + Location: 115,50 + Actor142: tbcl + Owner: TibLifeforms + Facing: 384 + Location: 120,44 + Actor143: tbcl + Owner: TibLifeforms + Facing: 384 + Location: 119,40 + Actor144: tbcl + Owner: TibLifeforms + Facing: 384 + Location: 110,35 + Actor145: tbcl + Owner: TibLifeforms + Facing: 384 + Location: 115,90 + Actor146: tbcl + Owner: TibLifeforms + Facing: 384 + Location: 123,30 + Actor147: tbcl + Owner: TibLifeforms + Facing: 384 + Location: 116,24 + Actor148: tbcl + Owner: TibLifeforms + Facing: 384 + Location: 110,17 + Actor149: tbcl + Owner: TibLifeforms + Facing: 384 + Location: 115,9 + Actor150: tbcl + Owner: TibLifeforms + Facing: 384 + Location: 121,14 + Actor152: tbcl + Owner: TibLifeforms + Facing: 384 + Location: 103,6 + Actor153: tbcl + Owner: TibLifeforms + Facing: 384 + Location: 108,47 + Actor154: split2 + Owner: Neutral + Location: 112,10 + Actor155: split2 + Owner: Neutral + Location: 121,23 + Actor156: split2 + Owner: Neutral + Location: 121,50 + Actor157: split2 + Owner: Neutral + Location: 111,58 + Actor158: split2 + Owner: Neutral + Location: 115,61 + Actor159: split2 + Owner: Neutral + Location: 111,86 + Actor160: split2 + Owner: Neutral + Location: 122,77 + Actor161: scrinflora4 + Owner: Neutral + Location: 45,63 + Actor162: scrinflora8 + Owner: Neutral + Location: 50,55 + Actor163: scrinflora6 + Owner: Neutral + Location: 59,49 + Actor164: scrinflora2 + Owner: Neutral + Location: 65,45 + Actor165: scrinflora12 + Owner: Neutral + Location: 40,42 + Actor166: scrinflora14 + Owner: Neutral + Location: 49,35 + Actor167: scrinflora2 + Owner: Neutral + Location: 33,40 + Actor168: scrinflora8 + Owner: Neutral + Location: 27,38 + Actor169: scrinflora1 + Owner: Neutral + Location: 22,31 + Actor170: scrinflora7 + Owner: Neutral + Location: 9,41 + Actor171: scrinflora4 + Owner: Neutral + Location: 12,63 + Actor172: scrinflora3 + Owner: Neutral + Location: 26,94 + Actor173: scrinflora3 + Owner: Neutral + Location: 47,23 + Actor174: scrinflora5 + Owner: Neutral + Location: 39,26 + Actor175: scrinflora5 + Owner: Neutral + Location: 25,10 + Actor176: scrinflora5 + Owner: Neutral + Location: 11,40 + Actor177: scrinflora5 + Owner: Neutral + Location: 6,59 + Actor178: scrinflora13 + Owner: Neutral + Location: 7,58 + Actor179: scrinflora13 + Owner: Neutral + Location: 28,95 + Actor180: scrinflora13 + Owner: Neutral + Location: 61,71 + Actor181: scrinflora14 + Owner: Neutral + Location: 61,48 + Actor182: scrinflora10 + Owner: Neutral + Location: 62,49 + Actor183: scrinflora11 + Owner: Neutral + Location: 50,56 + Actor184: scrinflora7 + Owner: Neutral + Location: 58,37 + Actor185: scrinflora14 + Owner: Neutral + Location: 60,36 + Actor186: scrinflora13 + Owner: Neutral + Location: 61,38 + Actor187: scrinflora10 + Owner: Neutral + Location: 61,37 + Actor188: scrinflora11 + Owner: Neutral + Location: 56,38 + Actor189: scrinflora1 + Owner: Neutral + Location: 63,50 + Actor190: scrinflora14 + Owner: Neutral + Location: 38,37 + Actor191: scrinflora11 + Owner: Neutral + Location: 37,37 + Actor192: scrinflora10 + Owner: Neutral + Location: 34,40 + Actor193: scrinflora9 + Owner: Neutral + Location: 28,39 + Actor194: scrinflora9 + Owner: Neutral + Location: 12,41 + Actor195: scrinflora12 + Owner: Neutral + Location: 4,40 + Actor196: scrinflora12 + Owner: Neutral + Location: 22,32 + Actor197: scrinflora12 + Owner: Neutral + Location: 27,8 + Actor198: scrinflora11 + Owner: Neutral + Location: 27,9 + Actor199: scrinflora13 + Owner: Neutral + Location: 21,13 + Actor200: scrinflora1 + Owner: Neutral + Location: 13,15 + Actor201: scrinflora6 + Owner: Neutral + Location: 12,8 + Actor202: scrinflora4 + Owner: Neutral + Location: 48,31 + Actor203: scrinflora7 + Owner: Neutral + Location: 11,9 + Actor204: scrinflora10 + Owner: Neutral + Location: 13,9 + Actor205: scrinflora11 + Owner: Neutral + Location: 10,10 + Actor206: scrinflora2 + Owner: Neutral + Location: 7,13 + Actor207: scrinflora13 + Owner: Neutral + Location: 4,8 + Actor208: scrinflora13 + Owner: Neutral + Location: 13,30 + Actor209: scrinflora1 + Owner: Neutral + Location: 7,53 + Actor210: scrinflora12 + Owner: Neutral + Location: 3,72 + Actor211: scrinflora14 + Owner: Neutral + Location: 4,67 + Actor212: scrinflora11 + Owner: Neutral + Location: 4,68 + Actor213: scrinflora11 + Owner: Neutral + Location: 5,85 + Actor214: scrinflora12 + Owner: Neutral + Location: 6,84 + Actor215: scrinflora13 + Owner: Neutral + Location: 15,78 + Actor216: scrinflora8 + Owner: Neutral + Location: 56,94 + Actor219: scrinflora2 + Owner: Neutral + Location: 51,9 + Actor220: scrinflora7 + Owner: Neutral + Location: 51,7 + Actor221: scrinflora13 + Owner: Neutral + Location: 52,8 + Actor222: scrinflora11 + Owner: Neutral + Location: 50,9 + Actor223: scrinflora12 + Owner: Neutral + Location: 57,10 + Actor224: scrinflora13 + Owner: Neutral + Location: 53,13 + Actor225: scrinflora10 + Owner: Neutral + Location: 52,13 + Actor226: scrinflora11 + Owner: Neutral + Location: 56,15 + Actor227: scrinflora1 + Owner: Neutral + Location: 37,21 + Actor228: scrinflora14 + Owner: Neutral + Location: 38,21 + Actor229: scrinflora2 + Owner: Neutral + Location: 102,29 + Actor230: scrinflora3 + Owner: Neutral + Location: 103,28 + Actor231: scrinflora5 + Owner: Neutral + Location: 124,36 + Actor232: scrinflora12 + Owner: Neutral + Location: 123,36 + Actor233: scrinflora11 + Owner: Neutral + Location: 122,35 + Actor234: scrinflora5 + Owner: Neutral + Location: 104,62 + Actor235: scrinflora3 + Owner: Neutral + Location: 125,64 + Actor236: scrinflora1 + Owner: Neutral + Location: 105,67 + Actor237: scrinflora14 + Owner: Neutral + Location: 103,67 + Actor238: scrinflora7 + Owner: Neutral + Location: 100,55 + Actor239: scrinflora2 + Owner: Neutral + Location: 105,70 + Actor240: scrinflora8 + Owner: Neutral + Location: 105,66 + Actor241: scrinflora8 + Owner: Neutral + Location: 103,77 + Actor242: scrinflora7 + Owner: Neutral + Location: 101,89 + Actor243: scrinflora4 + Owner: Neutral + Location: 97,83 + Actor244: scrinflora8 + Owner: Neutral + Location: 124,90 + Actor245: scrinflora5 + Owner: Neutral + Location: 120,94 + Actor246: scrinflora1 + Owner: Neutral + Location: 127,89 + Actor247: scrinflora11 + Owner: Neutral + Location: 126,90 + Actor248: scrinflora13 + Owner: Neutral + Location: 122,95 + Actor249: scrinflora11 + Owner: Neutral + Location: 110,74 + Actor250: scrinflora13 + Owner: Neutral + Location: 114,72 + Actor251: scrinflora8 + Owner: Neutral + Location: 110,42 + Actor252: scrinflora1 + Owner: Neutral + Location: 109,41 + Actor253: scrinflora4 + Owner: Neutral + Location: 99,42 + Actor254: scrinflora8 + Owner: Neutral + Location: 97,37 + Actor255: scrinflora2 + Owner: Neutral + Location: 95,34 + Actor256: scrinflora7 + Owner: Neutral + Location: 94,11 + Actor257: scrinflora2 + Owner: Neutral + Location: 93,8 + Actor258: scrinflora1 + Owner: Neutral + Location: 99,3 + Actor259: scrinflora1 + Owner: Neutral + Location: 105,22 + Actor260: scrinflora1 + Owner: Neutral + Location: 126,19 + Actor261: scrinflora8 + Owner: Neutral + Location: 124,14 + Actor262: scrinflora12 + Owner: Neutral + Location: 125,15 + Actor263: scrinflora14 + Owner: Neutral + Location: 120,8 + Actor264: scrinflora14 + Owner: Neutral + Location: 121,7 + Actor265: scrinflora9 + Owner: Neutral + Location: 121,8 + Actor266: scrinflora11 + Owner: Neutral + Location: 122,6 + Actor267: scrinflora6 + Owner: Neutral + Location: 116,6 + Actor268: scrinflora5 + Owner: Neutral + Location: 104,18 + Actor269: scrinflora11 + Owner: Neutral + Location: 103,18 + Actor270: scrinflora12 + Owner: Neutral + Location: 100,19 + Actor271: scrinflora12 + Owner: Neutral + Location: 91,28 + Actor272: scrinflora14 + Owner: Neutral + Location: 103,29 + Actor273: scrinflora12 + Owner: Neutral + Location: 96,37 + Actor274: scrinflora13 + Owner: Neutral + Location: 96,33 + Actor275: scrinflora1 + Owner: Neutral + Location: 99,43 + Actor276: scrinflora10 + Owner: Neutral + Location: 100,43 + Actor277: scrinflora11 + Owner: Neutral + Location: 100,46 + Actor278: scrinflora13 + Owner: Neutral + Location: 100,45 + Actor279: scrinflora14 + Owner: Neutral + Location: 105,61 + Actor280: scrinflora10 + Owner: Neutral + Location: 104,67 + Actor281: scrinflora12 + Owner: Neutral + Location: 33,51 + Actor282: scrinflora1 + Owner: Neutral + Location: 26,50 + Actor283: scrinflora10 + Owner: Neutral + Location: 42,52 + Actor284: scrinflora11 + Owner: Neutral + Location: 37,62 + Actor285: scrinflora13 + Owner: Neutral + Location: 60,66 + Actor286: scrinflora14 + Owner: Neutral + Location: 29,64 + Actor287: scrinflora12 + Owner: Neutral + Location: 19,64 + Actor288: scrinflora10 + Owner: Neutral + Location: 25,73 + Actor289: scrinflora8 + Owner: Neutral + Location: 14,76 + Actor290: scrinflora1 + Owner: Neutral + Location: 43,96 + Actor291: scrinflora2 + Owner: Neutral + Location: 19,85 + Actor292: scrinflora11 + Owner: Neutral + Location: 19,86 + Actor293: scrinflora13 + Owner: Neutral + Location: 17,87 + Actor294: scrinflora14 + Owner: Neutral + Location: 18,18 + Actor295: scrinflora14 + Owner: Neutral + Location: 4,25 + Actor296: scrinflora10 + Owner: Neutral + Location: 5,25 + Actor297: disr + Owner: GDI + Location: 43,68 + Facing: 0 + Actor298: disr + Owner: GDI + Location: 52,68 + Facing: 0 + Actor299: mtnk + Owner: GDI + Location: 37,58 + Facing: 0 + Actor300: mtnk + Owner: GDI + Location: 56,61 + Facing: 0 + Actor301: mtnk + Owner: GDI + Facing: 384 + Location: 43,81 + Actor302: mtnk + Owner: GDI + Location: 45,81 + Facing: 618 + Actor303: tbcl + Owner: TibLifeforms + Facing: 384 + Location: 102,70 + Actor304: tbcl + Owner: TibLifeforms + Facing: 384 + Location: 105,58 + Actor305: tbcl + Owner: TibLifeforms + Facing: 384 + Location: 101,24 + Actor306: tbcl + Owner: TibLifeforms + Facing: 384 + Location: 117,32 + LSpawn1: waypoint + Owner: Neutral + Location: 9,1 + LSpawn2: waypoint + Owner: Neutral + Location: 29,1 + LSpawn3: waypoint + Owner: Neutral + Location: 45,1 + MSpawn2: waypoint + Owner: Neutral + Location: 78,1 + MSpawn1: waypoint + Owner: Neutral + Location: 63,1 + RSpawn1: waypoint + Owner: Neutral + Location: 102,1 + RSpawn2: waypoint + Owner: Neutral + Location: 119,1 + Actor309: n1 + Owner: GDI + SubCell: 3 + Location: 42,69 + Facing: 30 + Actor310: n1 + Owner: GDI + SubCell: 3 + Location: 37,71 + Facing: 0 + Actor311: n1 + Owner: GDI + SubCell: 3 + Location: 32,70 + Facing: 0 + Actor312: n1 + Owner: GDI + SubCell: 3 + Location: 48,69 + Facing: 0 + Actor313: n1 + Owner: GDI + SubCell: 3 + Location: 53,71 + Facing: 0 + Actor314: n1 + Owner: GDI + SubCell: 3 + Location: 50,72 + Facing: 0 + Actor315: n1 + Owner: GDI + Location: 59,68 + SubCell: 3 + Facing: 0 + Actor316: n1 + Owner: GDI + SubCell: 3 + Location: 59,70 + Facing: 0 + Actor317: n3 + Owner: GDI + Location: 43,72 + SubCell: 3 + Facing: 0 + Actor318: n3 + Owner: GDI + SubCell: 3 + Location: 57,69 + Facing: 0 + Actor319: n3 + Owner: GDI + SubCell: 3 + Location: 34,71 + Facing: 4 + MapBottomLeft: waypoint + Owner: Neutral + Location: 1,96 + MapBottomRight: waypoint + Owner: Neutral + Location: 128,96 + MAttackRally1: waypoint + Owner: Neutral + Location: 73,58 + LAttackRally3b: waypoint + Owner: Neutral + Location: 55,58 + LAttackRally2b: waypoint + Owner: Neutral + Location: 35,54 + LAttackRally1b: waypoint + Owner: Neutral + Location: 18,71 + Actor327: split2 + Owner: Neutral + Location: 12,47 + Actor328: split2 + Owner: Neutral + Location: 15,53 + Actor329: split2 + Owner: Neutral + Location: 57,27 + Actor330: split2 + Owner: Neutral + Location: 55,23 + LAttackRally1a: waypoint + Owner: Neutral + Location: 9,24 + LAttackRally2a: waypoint + Owner: Neutral + Location: 29,30 + LAttackRally3a: waypoint + Owner: Neutral + Location: 53,26 + ScrinSpawnerL1: hiddenspawner + Owner: Scrin + Location: 15,1 + ScrinSpawnerL2: hiddenspawner + Owner: Scrin + Location: 23,1 + ScrinSpawnerL3: hiddenspawner + Owner: Scrin + Location: 35,1 + ScrinSpawnerL4: hiddenspawner + Owner: Scrin + Location: 41,1 + ScrinSpawnerM1: hiddenspawner + Owner: Scrin + Location: 66,1 + ScrinSpawnerM2: hiddenspawner + Owner: Scrin + Location: 76,1 + MAttackRally2b: waypoint + Owner: Neutral + Location: 87,67 + MAttackRally2a: waypoint + Owner: Neutral + Location: 86,37 + AcrossRiver: waypoint + Owner: Neutral + Location: 114,81 + Actor343: vulc + Owner: GDI + Location: 25,62 + Facing: 126 + Actor344: vulc + Owner: GDI + Location: 58,62 + Facing: 919 + Actor340: pyle + Owner: GDI + Location: 52,74 + Actor341: hq + Owner: GDI + Location: 55,74 + Actor342: rep + Owner: GDI + Location: 53,81 + Actor345: tbcl + Owner: TibLifeforms + Facing: 384 + Location: 116,57 + Actor346: tbcl + Owner: TibLifeforms + Facing: 384 + Location: 107,81 + Actor349: scol + Owner: Scrin + Location: 40,14 + Actor354: swal + Owner: Scrin + Location: 4,14 + Actor355: swal + Owner: Scrin + Location: 5,14 + Actor356: swal + Owner: Scrin + Location: 6,14 + Actor357: swal + Owner: Scrin + Location: 6,15 + Actor358: swal + Owner: Scrin + Location: 6,16 + Actor360: swal + Owner: Scrin + Location: 4,16 + Actor361: swal + Owner: Scrin + Location: 5,16 + Actor362: swal + Owner: Scrin + Location: 14,11 + Actor363: swal + Owner: Scrin + Location: 14,13 + Actor364: swal + Owner: Scrin + Location: 15,13 + Actor365: swal + Owner: Scrin + Location: 16,13 + Actor366: swal + Owner: Scrin + Location: 16,12 + Actor367: swal + Owner: Scrin + Location: 16,11 + Actor368: swal + Owner: Scrin + Location: 15,11 + Actor369: swal + Owner: Scrin + Location: 14,12 + Actor394: swal + Owner: Scrin + Location: 39,13 + Actor395: swal + Owner: Scrin + Location: 39,14 + Actor396: swal + Owner: Scrin + Location: 39,15 + Actor397: swal + Owner: Scrin + Location: 40,15 + Actor398: swal + Owner: Scrin + Location: 41,15 + Actor399: swal + Owner: Scrin + Location: 41,14 + Actor400: swal + Owner: Scrin + Location: 41,13 + Actor401: swal + Owner: Scrin + Location: 40,13 + Actor410: scol + Owner: Scrin + Location: 15,12 + Actor411: swal + Owner: Scrin + Location: 19,6 + Actor412: swal + Owner: Scrin + Location: 20,6 + Actor413: swal + Owner: Scrin + Location: 21,6 + Actor414: swal + Owner: Scrin + Location: 19,7 + Actor415: scol + Owner: Scrin + Location: 20,7 + Actor416: swal + Owner: Scrin + Location: 21,7 + Actor417: swal + Owner: Scrin + Location: 19,8 + Actor418: swal + Owner: Scrin + Location: 20,8 + Actor419: swal + Owner: Scrin + Location: 21,8 + Actor420: swal + Owner: Scrin + Location: 32,6 + Actor421: swal + Owner: Scrin + Location: 33,6 + Actor422: swal + Owner: Scrin + Location: 34,6 + Actor423: swal + Owner: Scrin + Location: 32,7 + Actor424: scol + Owner: Scrin + Location: 33,7 + Actor425: swal + Owner: Scrin + Location: 34,7 + Actor426: swal + Owner: Scrin + Location: 32,8 + Actor427: swal + Owner: Scrin + Location: 33,8 + Actor428: swal + Owner: Scrin + Location: 34,8 + Actor402: swal + Owner: Scrin + Location: 45,6 + Actor403: swal + Owner: Scrin + Location: 46,6 + Actor404: swal + Owner: Scrin + Location: 47,6 + Actor405: swal + Owner: Scrin + Location: 45,7 + Actor406: scol + Owner: Scrin + Location: 46,7 + Actor407: swal + Owner: Scrin + Location: 47,7 + Actor408: swal + Owner: Scrin + Location: 45,8 + Actor409: swal + Owner: Scrin + Location: 46,8 + Actor429: swal + Owner: Scrin + Location: 47,8 + Actor430: swal + Owner: Scrin + Location: 26,13 + Actor431: swal + Owner: Scrin + Location: 27,13 + Actor432: swal + Owner: Scrin + Location: 28,13 + Actor433: swal + Owner: Scrin + Location: 26,14 + Actor434: scol + Owner: Scrin + Location: 27,14 + Actor435: swal + Owner: Scrin + Location: 28,14 + Actor436: swal + Owner: Scrin + Location: 26,15 + Actor437: swal + Owner: Scrin + Location: 27,15 + Actor438: swal + Owner: Scrin + Location: 28,15 + Actor439: scrinflora1 + Owner: Neutral + Location: 38,11 + Actor440: scrinflora8 + Owner: Neutral + Location: 37,12 + Actor441: shar + Owner: Scrin + Location: 15,10 + Actor442: shar + Owner: Scrin + Location: 20,5 + Actor443: shar + Owner: Scrin + Location: 33,5 + Actor444: shar + Owner: Scrin + Location: 46,5 + Actor445: shar + Owner: Scrin + Location: 40,12 + Actor446: shar + Owner: Scrin + Location: 27,12 + Actor447: shar + Owner: Scrin + Location: 5,15 + Actor448: swal + Owner: Scrin + Location: 45,5 + Actor449: swal + Owner: Scrin + Location: 45,4 + Actor450: swal + Owner: Scrin + Location: 46,4 + Actor451: swal + Owner: Scrin + Location: 47,4 + Actor452: swal + Owner: Scrin + Location: 47,5 + Actor453: swal + Owner: Scrin + Location: 34,4 + Actor454: swal + Owner: Scrin + Location: 33,4 + Actor455: swal + Owner: Scrin + Location: 32,4 + Actor456: swal + Owner: Scrin + Location: 32,5 + Actor457: swal + Owner: Scrin + Location: 34,5 + Actor458: swal + Owner: Scrin + Location: 39,12 + Actor459: swal + Owner: Scrin + Location: 39,11 + Actor460: swal + Owner: Scrin + Location: 40,11 + Actor461: swal + Owner: Scrin + Location: 41,11 + Actor462: swal + Owner: Scrin + Location: 41,12 + Actor463: swal + Owner: Scrin + Location: 28,12 + Actor464: swal + Owner: Scrin + Location: 28,11 + Actor465: swal + Owner: Scrin + Location: 27,11 + Actor466: swal + Owner: Scrin + Location: 26,11 + Actor467: swal + Owner: Scrin + Location: 26,12 + Actor468: swal + Owner: Scrin + Location: 19,5 + Actor469: swal + Owner: Scrin + Location: 19,4 + Actor470: swal + Owner: Scrin + Location: 20,4 + Actor471: swal + Owner: Scrin + Location: 21,4 + Actor472: swal + Owner: Scrin + Location: 21,5 + Actor473: swal + Owner: Scrin + Location: 4,15 + Actor474: swal + Owner: Scrin + Location: 14,10 + Actor475: swal + Owner: Scrin + Location: 14,9 + Actor476: swal + Owner: Scrin + Location: 15,9 + Actor477: swal + Owner: Scrin + Location: 16,10 + Actor478: swal + Owner: Scrin + Location: 16,9 + Actor479: swal + Owner: Scrin + Location: 6,17 + Actor480: swal + Owner: Scrin + Location: 6,18 + Actor481: swal + Owner: Scrin + Location: 5,18 + Actor482: swal + Owner: Scrin + Location: 4,18 + Actor483: swal + Owner: Scrin + Location: 4,17 + Actor484: scol + Owner: Scrin + Location: 5,17 + Actor485: swal + Owner: Scrin + Location: 3,16 + Actor486: swal + Owner: Scrin + Location: 3,15 + Actor487: swal + Owner: Scrin + Location: 3,17 + Actor488: swal + Owner: Scrin + Location: 48,7 + Actor489: swal + Owner: Scrin + Location: 48,6 + Actor490: swal + Owner: Scrin + Location: 48,5 + Actor491: swal + Owner: Scrin + Location: 42,12 + Actor492: swal + Owner: Scrin + Location: 42,13 + Actor493: swal + Owner: Scrin + Location: 42,14 + Actor494: swal + Owner: Scrin + Location: 29,13 + Actor495: swal + Owner: Scrin + Location: 29,12 + Actor496: swal + Owner: Scrin + Location: 29,14 + Actor497: swal + Owner: Scrin + Location: 25,14 + Actor498: swal + Owner: Scrin + Location: 25,13 + Actor499: swal + Owner: Scrin + Location: 25,12 + Actor500: swal + Owner: Scrin + Location: 17,11 + Actor501: swal + Owner: Scrin + Location: 17,12 + Actor502: swal + Owner: Scrin + Location: 17,10 + Actor503: swal + Owner: Scrin + Location: 18,6 + Actor504: swal + Owner: Scrin + Location: 18,7 + Actor505: swal + Owner: Scrin + Location: 18,5 + Actor506: swal + Owner: Scrin + Location: 22,5 + Actor507: swal + Owner: Scrin + Location: 22,6 + Actor508: swal + Owner: Scrin + Location: 22,7 + Actor509: swal + Owner: Scrin + Location: 31,7 + Actor510: swal + Owner: Scrin + Location: 31,6 + Actor511: swal + Owner: Scrin + Location: 31,5 + Actor512: swal + Owner: Scrin + Location: 35,5 + Actor513: swal + Owner: Scrin + Location: 35,6 + Actor514: swal + Owner: Scrin + Location: 35,7 + Actor515: swal + Owner: Scrin + Location: 44,7 + Actor516: swal + Owner: Scrin + Location: 44,6 + Actor517: swal + Owner: Scrin + Location: 44,5 + RAttackRally1: waypoint + Owner: Neutral + Location: 121,33 + RAttackRally3: waypoint + Owner: Neutral + Location: 118,76 + RAttackRally2: waypoint + Owner: Neutral + Location: 107,61 + Actor519: scol + Owner: Scrin + Location: 74,12 + Actor521: scol + Owner: Scrin + Location: 72,11 + Actor522: scol + Owner: Scrin + Location: 75,11 + Actor518: seek + Owner: Scrin + Location: 80,10 + Facing: 467 + Actor520: seek + Owner: Scrin + Facing: 384 + Location: 85,9 + Actor523: seek + Owner: Scrin + Location: 62,10 + Facing: 626 + Actor524: seek + Owner: Scrin + Location: 66,11 + Facing: 515 + Actor525: ruin + Owner: Scrin + Location: 83,8 + Facing: 459 + Actor527: ruin + Owner: Scrin + Facing: 602 + Location: 64,8 + Actor526: devo + Owner: Scrin + Location: 84,5 + Facing: 428 + Actor528: devo + Owner: Scrin + Location: 62,6 + Facing: 618 + Actor529: lace + Owner: Scrin + Facing: 384 + Location: 101,10 + Actor530: lace + Owner: Scrin + Location: 120,11 + Facing: 436 + Actor531: lace + Owner: Scrin + Facing: 384 + Location: 124,17 + Actor532: lace + Owner: Scrin + Location: 114,21 + Facing: 674 + Actor533: seek + Owner: Scrin + Facing: 384 + Location: 97,8 + Actor534: camera + Owner: Scrin + Location: 65,64 + Actor535: camera + Owner: Scrin + Location: 76,69 + Actor536: camera + Owner: Scrin + Location: 88,63 + Actor537: camera + Owner: Scrin + Location: 52,59 + Actor538: camera + Owner: Scrin + Location: 39,58 + Actor539: camera + Owner: Scrin + Location: 28,61 + Actor540: camera + Owner: Scrin + Location: 17,62 + Actor541: camera + Owner: Scrin + Location: 4,63 + Actor542: camera + Owner: Scrin + Location: 28,44 + Actor543: camera + Owner: Scrin + Location: 56,44 + Actor544: camera + Owner: Scrin + Location: 41,35 + Actor545: camera + Owner: Scrin + Location: 46,67 + Actor546: camera + Owner: Scrin + Location: 54,79 + Sensor3: msar + Owner: GDI + Location: 82,87 + DeployState: Deployed + Facing: 384 + Sensor1: msar + Owner: GDI + Location: 21,72 + DeployState: Deployed + Facing: 384 + Sensor2: msar + Owner: GDI + Location: 47,64 + DeployState: Deployed + Facing: 384 + Actor547: n1 + Owner: GDI + SubCell: 3 + Facing: 919 + Location: 22,70 + Actor548: n3 + Owner: GDI + SubCell: 3 + Location: 19,74 + Facing: 174 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, convergence-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/main-campaign/ca33-spearhead/map.bin b/mods/ca/missions/main-campaign/ca33-spearhead/map.bin new file mode 100644 index 0000000000..e87a980e9b Binary files /dev/null and b/mods/ca/missions/main-campaign/ca33-spearhead/map.bin differ diff --git a/mods/ca/missions/main-campaign/ca33-spearhead/map.png b/mods/ca/missions/main-campaign/ca33-spearhead/map.png new file mode 100644 index 0000000000..12a3d54203 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca33-spearhead/map.png differ diff --git a/mods/ca/missions/main-campaign/ca33-spearhead/map.yaml b/mods/ca/missions/main-campaign/ca33-spearhead/map.yaml new file mode 100644 index 0000000000..47bfd165ac --- /dev/null +++ b/mods/ca/missions/main-campaign/ca33-spearhead/map.yaml @@ -0,0 +1,1642 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 33: Spearhead + +Author: Darkademic + +Tileset: TEMPERAT + +MapSize: 82,114 + +Bounds: 1,1,80,112 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: GDI, Scrin, Nod + PlayerReference@GDI: + Name: GDI + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: gdi + LockColor: True + Color: F2CF74 + LockSpawn: True + LockTeam: True + Enemies: Scrin, Nod, Creeps + PlayerReference@Scrin: + Name: Scrin + Bot: campaign + Faction: scrin + Color: 7700FF + Enemies: GDI, Nod, Creeps + PlayerReference@Nod: + Name: Nod + Bot: campaign + Faction: nod + Color: FE1100 + Enemies: GDI, Scrin, Creeps + +Actors: + Shard3: shar + Owner: Scrin + Location: 5,17 + TurretFacing: 872 + Shard4: shar + Owner: Scrin + Location: 19,12 + TurretFacing: 192 + Shard6: shar + Owner: Scrin + Location: 28,13 + TurretFacing: 192 + Shard5: shar + Owner: Scrin + Location: 23,19 + TurretFacing: 192 + Shard1: shar + Owner: Scrin + Location: 65,9 + TurretFacing: 192 + Shard2: shar + Owner: Scrin + Location: 64,18 + TurretFacing: 192 + Actor22: shar + Owner: Scrin + Location: 7,42 + TurretFacing: 832 + Actor23: shar + Owner: Scrin + Location: 2,41 + TurretFacing: 856 + Actor24: shar + Owner: Scrin + Location: 76,48 + Actor25: shar + Owner: Scrin + Location: 75,44 + Actor26: shar + Owner: Scrin + Location: 76,40 + Actor27: shar + Owner: Scrin + Location: 60,42 + Actor29: shar + Owner: Scrin + Location: 55,47 + Actor30: shar + Owner: Scrin + Location: 62,50 + Actor31: shar + Owner: Scrin + Location: 59,57 + Actor32: shar + Owner: Scrin + Location: 46,51 + Actor33: shar + Owner: Scrin + Location: 51,50 + Actor36: rea2 + Owner: Scrin + Location: 56,43 + Actor37: rea2 + Owner: Scrin + Location: 59,44 + Actor38: rea2 + Owner: Scrin + Location: 58,47 + Actor39: rea2 + Owner: Scrin + Location: 53,49 + Actor40: rea2 + Owner: Scrin + Location: 56,50 + Actor41: rea2 + Owner: Scrin + Location: 59,51 + Actor42: ptur + Owner: Scrin + Location: 47,56 + TurretFacing: 364 + Actor43: ptur + Owner: Scrin + Location: 54,59 + TurretFacing: 586 + Actor28: shar + Owner: Scrin + Location: 57,42 + Actor69: brik + Owner: Nod + Location: 53,78 + Actor70: brik + Owner: Nod + Location: 54,78 + Actor71: brik + Owner: Nod + Location: 55,78 + Actor72: brik + Owner: Nod + Location: 56,78 + Actor73: brik + Owner: Nod + Location: 57,78 + Actor88: brik + Owner: Nod + Location: 58,78 + Actor89: brik + Owner: Nod + Location: 53,79 + Actor90: brik + Owner: Nod + Location: 54,79 + Actor91: obli + Owner: Nod + Location: 56,79 + Actor92: brik + Owner: Nod + Location: 57,79 + Actor93: brik + Owner: Nod + Location: 58,79 + Actor94: brik + Owner: Nod + Location: 53,80 + Actor95: brik + Owner: Nod + Location: 54,80 + Actor103: brik + Owner: Nod + Location: 60,81 + Actor104: brik + Owner: Nod + Location: 61,81 + Actor105: nsam + Owner: Nod + Location: 47,82 + Actor106: brik + Owner: Nod + Location: 60,82 + Actor107: brik + Owner: Nod + Location: 61,82 + Actor110: brik + Owner: Nod + Location: 45,83 + Actor111: brik + Owner: Nod + Location: 46,83 + Actor112: obli + Owner: Nod + Location: 60,83 + Actor113: brik + Owner: Nod + Location: 61,83 + Actor114: brik + Owner: Nod + Location: 45,84 + Actor115: brik + Owner: Nod + Location: 46,84 + Actor116: brik + Owner: Nod + Location: 60,84 + Actor117: brik + Owner: Nod + Location: 61,84 + Actor118: brik + Owner: Nod + Location: 44,85 + Actor119: brik + Owner: Nod + Location: 45,85 + Actor120: brik + Owner: Nod + Location: 60,85 + Actor121: brik + Owner: Nod + Location: 61,85 + Actor122: brik + Owner: Nod + Location: 44,86 + Actor123: chain + Owner: Nod + Location: 52,86 + Actor124: chain + Owner: Nod + Location: 53,86 + Actor125: chain + Owner: Nod + Location: 54,86 + Actor126: chain + Owner: Nod + Location: 55,86 + Actor127: chain + Owner: Nod + Location: 56,86 + Actor128: chain + Owner: Nod + Location: 57,86 + Actor129: brik + Owner: Nod + Location: 60,86 + Actor130: brik + Owner: Nod + Location: 44,87 + Actor131: chain + Owner: Nod + Location: 52,87 + Actor132: nsam + Owner: Nod + Location: 53,87 + NodCommsCenter: hq + Owner: Nod + Location: 55,87 + Actor134: chain + Owner: Nod + Location: 57,87 + Actor135: brik + Owner: Nod + Location: 60,87 + Actor136: brik + Owner: Nod + Location: 44,88 + Actor137: brik + Owner: Nod + Location: 45,88 + Actor138: chain + Owner: Nod + Location: 51,88 + Actor139: chain + Owner: Nod + Location: 52,88 + Actor140: chain + Owner: Nod + Location: 57,88 + Actor141: brik + Owner: Nod + Location: 60,88 + Actor142: brik + Owner: Nod + Location: 44,89 + Actor143: brik + Owner: Nod + Location: 45,89 + Actor144: chain + Owner: Nod + Location: 51,89 + Actor145: chain + Owner: Nod + Location: 57,89 + Actor146: brik + Owner: Nod + Location: 60,89 + Actor147: chain + Owner: Nod + Location: 51,90 + Actor148: chain + Owner: Nod + Location: 56,90 + Actor149: chain + Owner: Nod + Location: 57,90 + Actor150: brik + Owner: Nod + Location: 60,90 + Actor151: chain + Owner: Nod + Location: 51,91 + Actor152: chain + Owner: Nod + Location: 52,91 + Actor153: chain + Owner: Nod + Location: 55,91 + Actor154: chain + Owner: Nod + Location: 56,91 + Actor155: brik + Owner: Nod + Location: 60,91 + Actor156: brik + Owner: Nod + Location: 60,92 + Actor157: brik + Owner: Nod + Location: 59,93 + Actor158: brik + Owner: Nod + Location: 60,93 + Actor159: brik + Owner: Nod + Location: 59,94 + Actor160: brik + Owner: Nod + Location: 60,94 + Actor161: nsam + Owner: Nod + Location: 47,96 + Actor162: brik + Owner: Nod + Location: 43,92 + Actor163: brik + Owner: Nod + Location: 42,92 + Actor164: brik + Owner: Nod + Location: 41,92 + Actor165: brik + Owner: Nod + Location: 43,93 + Actor166: brik + Owner: Nod + Location: 42,93 + Actor167: brik + Owner: Nod + Location: 40,92 + Actor168: brik + Owner: Nod + Location: 40,93 + Actor169: brik + Owner: Nod + Location: 39,93 + Actor170: brik + Owner: Nod + Location: 39,92 + Actor171: brik + Owner: Nod + Location: 34,92 + Actor172: brik + Owner: Nod + Location: 34,93 + Actor173: brik + Owner: Nod + Location: 35,93 + Actor174: brik + Owner: Nod + Location: 35,92 + Actor175: brik + Owner: Nod + Location: 34,94 + Actor176: brik + Owner: Nod + Location: 34,95 + Actor177: brik + Owner: Nod + Location: 34,96 + Actor178: brik + Owner: Nod + Location: 33,97 + Actor179: brik + Owner: Nod + Location: 34,97 + Actor180: brik + Owner: Nod + Location: 33,98 + Actor181: brik + Owner: Nod + Location: 33,99 + Actor182: brik + Owner: Nod + Location: 33,100 + Actor183: brik + Owner: Nod + Location: 34,100 + Actor184: brik + Owner: Nod + Location: 34,101 + Actor185: brik + Owner: Nod + Location: 34,102 + Actor186: brik + Owner: Nod + Location: 34,103 + Actor187: brik + Owner: Nod + Location: 34,104 + Actor190: brik + Owner: Nod + Location: 32,112 + Actor191: brik + Owner: Nod + Location: 32,111 + Actor192: brik + Owner: Nod + Location: 33,112 + Actor193: brik + Owner: Nod + Location: 33,111 + Actor195: brik + Owner: Nod + Location: 34,112 + Actor196: brik + Owner: Nod + Location: 33,110 + Actor197: brik + Owner: Nod + Location: 33,109 + Actor198: brik + Owner: Nod + Location: 33,108 + Actor194: brik + Owner: Nod + Location: 33,107 + Actor199: brik + Owner: Nod + Location: 34,107 + Actor200: brik + Owner: Nod + Location: 34,106 + Actor201: brik + Owner: Nod + Location: 34,105 + Actor188: brik + Owner: Nod + Location: 35,112 + Actor189: brik + Owner: Nod + Location: 36,112 + Actor202: brik + Owner: Nod + Location: 37,112 + Actor203: brik + Owner: Nod + Location: 39,112 + Actor204: brik + Owner: Nod + Location: 38,112 + Actor205: brik + Owner: Nod + Location: 39,111 + Actor206: brik + Owner: Nod + Location: 38,111 + Actor207: brik + Owner: Nod + Location: 45,100 + Actor208: brik + Owner: Nod + Location: 45,101 + Actor209: brik + Owner: Nod + Location: 45,102 + Actor210: brik + Owner: Nod + Location: 46,102 + Actor211: brik + Owner: Nod + Location: 46,103 + Actor212: brik + Owner: Nod + Location: 45,103 + Actor213: brik + Owner: Nod + Location: 44,100 + Actor214: brik + Owner: Nod + Location: 44,99 + Actor215: brik + Owner: Nod + Location: 44,98 + Actor218: brik + Owner: Nod + Location: 43,94 + Actor219: brik + Owner: Nod + Location: 44,94 + Actor220: brik + Owner: Nod + Location: 44,95 + Actor221: brik + Owner: Nod + Location: 44,96 + Actor222: brik + Owner: Nod + Location: 44,97 + Actor216: nuk2 + Owner: Nod + Location: 34,109 + Actor217: nuk2 + Owner: Nod + Location: 36,109 + Actor223: nuk2 + Owner: Nod + Location: 35,105 + Actor224: nuk2 + Owner: Nod + Location: 37,105 + Actor225: nuk2 + Owner: Nod + Location: 35,102 + Actor226: nuk2 + Owner: Nod + Location: 37,102 + Actor227: nuk2 + Owner: Nod + Location: 35,99 + Actor228: nuk2 + Owner: Nod + Location: 37,99 + Actor229: weap.td + Owner: Nod + Location: 42,101 + Actor230: proc.td + Owner: Nod + Location: 68,94 + Actor231: proc.td + Owner: Nod + Location: 65,100 + Actor232: hand + Owner: Nod + Location: 42,96 + Actor233: hpad.td + Owner: Nod + Location: 51,99 + Actor234: hpad.td + Owner: Nod + Location: 55,102 + Actor236: rep + Owner: Nod + Location: 56,98 + Actor237: nsam + Owner: Nod + Location: 71,94 + Actor238: nsam + Owner: Nod + Location: 46,104 + Actor239: obli + Owner: Nod + Location: 41,93 + Actor240: ltur + Owner: Nod + Location: 40,91 + Actor241: ltur + Owner: Nod + Location: 59,78 + Actor242: ltur + Owner: Nod + Location: 72,99 + Actor243: ltur + Owner: Nod + Location: 64,106 + Actor244: ltur + Owner: Nod + Location: 64,92 + Actor245: rmbc + Owner: Nod + Location: 41,91 + SubCell: 3 + Facing: 0 + Actor246: rmbc + Owner: Nod + SubCell: 3 + Location: 36,92 + Facing: 983 + Actor247: rmbc + Owner: Nod + SubCell: 3 + Location: 38,93 + Facing: 174 + Actor248: rmbc + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 53,89 + Actor249: rmbc + Owner: Nod + SubCell: 3 + Location: 59,79 + Facing: 935 + Actor250: rmbc + Owner: Nod + Location: 62,81 + SubCell: 3 + Facing: 697 + Actor251: rmbc + Owner: Nod + Location: 61,80 + SubCell: 3 + Facing: 824 + Actor252: split2 + Owner: Neutral + Location: 68,84 + Actor253: split2 + Owner: Neutral + Location: 72,108 + Actor254: split2 + Owner: Neutral + Location: 76,104 + Actor255: split2 + Owner: Neutral + Location: 74,85 + Actor257: hpad.td + Owner: Nod + Location: 54,95 + Actor258: silo.td + Owner: Nod + Location: 41,109 + Actor259: silo.td + Owner: Nod + Location: 42,107 + Actor260: silo.td + Owner: Nod + Location: 71,92 + Actor261: silo.td + Owner: Nod + Location: 66,93 + Actor262: obli + Owner: Nod + Location: 35,94 + Actor264: obli + Owner: Nod + Location: 45,86 + Actor263: n3c + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 56,92 + Actor265: n3c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 57,95 + Actor266: n3c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 48,93 + Actor267: n3c + Owner: Nod + SubCell: 3 + Location: 48,89 + Facing: 610 + Actor268: n3c + Owner: Nod + Facing: 384 + Location: 48,89 + SubCell: 1 + Actor269: n3c + Owner: Nod + SubCell: 3 + Location: 47,88 + Facing: 47 + Actor270: n3c + Owner: Nod + SubCell: 3 + Location: 51,83 + Facing: 729 + Actor271: n3c + Owner: Nod + SubCell: 3 + Location: 58,83 + Facing: 0 + Actor272: n3c + Owner: Nod + SubCell: 3 + Location: 54,81 + Facing: 793 + Actor273: n3c + Owner: Nod + SubCell: 3 + Location: 49,81 + Facing: 777 + Actor274: n3c + Owner: Nod + Facing: 384 + Location: 43,95 + SubCell: 3 + Actor275: n3c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 42,94 + Actor276: n3c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 42,99 + Actor277: n3c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 35,97 + Actor278: n3c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 36,95 + Actor279: n3c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 48,98 + Actor280: n3c + Owner: Nod + SubCell: 3 + Location: 51,95 + Facing: 547 + Actor281: reap + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 48,87 + Actor282: reap + Owner: Nod + SubCell: 3 + Location: 66,95 + Facing: 384 + Actor283: reap + Owner: Nod + Location: 65,106 + SubCell: 3 + Facing: 384 + Actor284: reap + Owner: Nod + SubCell: 3 + Location: 62,111 + Facing: 182 + Actor285: gun.nod + Owner: Nod + Location: 13,95 + TurretFacing: 967 + Actor286: gun.nod + Owner: Nod + Location: 25,93 + Actor287: gun.nod + Owner: Nod + Location: 13,107 + TurretFacing: 0 + Actor290: nsam + Owner: Nod + Location: 61,86 + Actor291: n1 + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 14,96 + Actor292: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 22,96 + Actor293: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 26,94 + Actor294: n1 + Owner: Nod + Facing: 384 + Location: 26,94 + SubCell: 1 + Actor295: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 27,93 + Actor296: n1 + Owner: Nod + Facing: 384 + Location: 35,96 + SubCell: 3 + Actor297: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 36,97 + Actor298: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 52,93 + Actor299: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 56,95 + Actor300: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 65,93 + Actor301: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 56,80 + Actor302: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 57,80 + Actor303: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 58,76 + Actor304: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 61,77 + Actor305: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 68,77 + Actor306: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 65,105 + Actor307: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 61,105 + Actor308: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 54,110 + Actor309: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 49,106 + Actor310: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 40,108 + Actor311: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 27,103 + Actor312: ftnk + Owner: Nod + Location: 18,97 + Facing: 0 + Actor313: mlrs + Owner: Nod + Location: 51,81 + Facing: 1023 + Actor314: bike + Owner: Nod + Facing: 384 + Location: 39,83 + Actor315: bike + Owner: Nod + Location: 40,85 + Facing: 277 + Actor316: bggy + Owner: Nod + Facing: 384 + Location: 15,98 + Actor317: ltnk + Owner: Nod + Location: 40,103 + Facing: 261 + Actor318: ltnk + Owner: Nod + Location: 43,104 + Facing: 515 + Actor319: ltnk + Owner: Nod + Location: 41,102 + Facing: 126 + Actor320: scrinflora1 + Owner: Neutral + Location: 9,12 + Actor321: scrinflora1 + Owner: Neutral + Location: 38,12 + Actor322: scrinflora1 + Owner: Neutral + Location: 51,14 + Actor323: scrinflora1 + Owner: Neutral + Location: 61,10 + Actor324: scrinflora1 + Owner: Neutral + Location: 68,44 + Actor325: scrinflora1 + Owner: Neutral + Location: 47,48 + Actor326: scrinflora1 + Owner: Neutral + Location: 17,50 + Actor327: scrinflora1 + Owner: Neutral + Location: 2,38 + Actor328: scrinflora1 + Owner: Neutral + Location: 8,78 + Actor329: scrinflora1 + Owner: Neutral + Location: 35,73 + Actor330: scrinflora1 + Owner: Neutral + Location: 28,98 + Actor331: scrinflora1 + Owner: Neutral + Location: 4,96 + Actor332: scrinflora1 + Owner: Neutral + Location: 46,111 + Actor333: scrinflora1 + Owner: Neutral + Location: 75,94 + Actor334: scrinflora1 + Owner: Neutral + Location: 78,74 + Actor335: scrinflora2 + Owner: Neutral + Location: 80,73 + Actor336: scrinflora2 + Owner: Neutral + Location: 17,111 + Actor337: scrinflora2 + Owner: Neutral + Location: 2,92 + Actor338: scrinflora2 + Owner: Neutral + Location: 5,63 + Actor339: scrinflora2 + Owner: Neutral + Location: 50,70 + Actor340: scrinflora2 + Owner: Neutral + Location: 67,65 + Actor341: scrinflora2 + Owner: Neutral + Location: 68,52 + Actor342: scrinflora2 + Owner: Neutral + Location: 50,36 + Actor343: scrinflora2 + Owner: Neutral + Location: 24,15 + Actor344: scrinflora2 + Owner: Neutral + Location: 4,5 + Actor345: scrinflora2 + Owner: Neutral + Location: 15,35 + Actor346: scrinflora5 + Owner: Neutral + Location: 13,35 + Actor347: scrinflora5 + Owner: Neutral + Location: 17,3 + Actor348: scrinflora5 + Owner: Neutral + Location: 33,13 + Actor349: scrinflora5 + Owner: Neutral + Location: 21,24 + Actor350: scrinflora5 + Owner: Neutral + Location: 26,47 + Actor351: scrinflora5 + Owner: Neutral + Location: 50,47 + Actor352: scrinflora5 + Owner: Neutral + Location: 76,37 + Actor353: scrinflora5 + Owner: Neutral + Location: 79,65 + Actor354: scrinflora5 + Owner: Neutral + Location: 54,77 + Actor355: scrinflora5 + Owner: Neutral + Location: 28,83 + Actor356: scrinflora5 + Owner: Neutral + Location: 23,102 + Actor357: scrinflora5 + Owner: Neutral + Location: 6,111 + Actor358: scrinflora5 + Owner: Neutral + Location: 2,80 + Actor359: scrinflora5 + Owner: Neutral + Location: 11,63 + Actor360: scrinflora6 + Owner: Neutral + Location: 22,57 + Actor361: scrinflora3 + Owner: Neutral + Location: 42,44 + Actor362: scrinflora3 + Owner: Neutral + Location: 27,3 + Actor363: scrinflora3 + Owner: Neutral + Location: 3,25 + Actor364: scrinflora3 + Owner: Neutral + Location: 8,39 + Actor365: scrinflora3 + Owner: Neutral + Location: 3,106 + Actor366: scrinflora3 + Owner: Neutral + Location: 78,112 + Actor367: scrinflora3 + Owner: Neutral + Location: 67,69 + Actor368: scrinflora4 + Owner: Neutral + Location: 43,42 + Actor369: scrinflora4 + Owner: Neutral + Location: 63,37 + Actor371: scrinflora4 + Owner: Neutral + Location: 40,4 + Actor372: scrinflora4 + Owner: Neutral + Location: 29,106 + Actor373: scrinflora7 + Owner: Neutral + Location: 32,82 + Actor374: scrinflora7 + Owner: Neutral + Location: 17,81 + Actor375: scrinflora7 + Owner: Neutral + Location: 5,79 + Actor376: scrinflora7 + Owner: Neutral + Location: 39,53 + Actor377: scrinflora7 + Owner: Neutral + Location: 78,63 + Actor378: scrinflora7 + Owner: Neutral + Location: 78,36 + Actor379: scrinflora7 + Owner: Neutral + Location: 50,34 + Actor380: scrinflora7 + Owner: Neutral + Location: 32,38 + Actor381: scrinflora7 + Owner: Neutral + Location: 2,2 + Actor382: scrinflora7 + Owner: Neutral + Location: 39,71 + Actor383: scrinflora8 + Owner: Neutral + Location: 17,48 + Actor384: scrinflora8 + Owner: Neutral + Location: 6,62 + Actor385: scrinflora8 + Owner: Neutral + Location: 11,26 + Actor386: scrinflora8 + Owner: Neutral + Location: 31,14 + Actor387: scrinflora8 + Owner: Neutral + Location: 32,2 + Actor388: scrinflora8 + Owner: Neutral + Location: 20,91 + Actor389: scrinflora8 + Owner: Neutral + Location: 2,74 + Actor390: scrinflora12 + Owner: Neutral + Location: 2,63 + Actor391: scrinflora12 + Owner: Neutral + Location: 41,75 + Actor392: scrinflora12 + Owner: Neutral + Location: 7,109 + Actor393: scrinflora12 + Owner: Neutral + Location: 50,103 + Actor394: scrinflora12 + Owner: Neutral + Location: 75,96 + Actor395: scrinflora12 + Owner: Neutral + Location: 75,72 + Actor396: scrinflora12 + Owner: Neutral + Location: 77,64 + Actor397: scrinflora12 + Owner: Neutral + Location: 78,47 + Actor398: scrinflora12 + Owner: Neutral + Location: 66,31 + Actor399: scrinflora12 + Owner: Neutral + Location: 64,43 + Actor400: scrinflora12 + Owner: Neutral + Location: 54,31 + Actor401: scrinflora13 + Owner: Neutral + Location: 72,29 + Actor402: scrinflora13 + Owner: Neutral + Location: 76,42 + Actor403: scrinflora13 + Owner: Neutral + Location: 66,66 + Actor404: scrinflora13 + Owner: Neutral + Location: 78,72 + Actor405: scrinflora13 + Owner: Neutral + Location: 31,104 + Actor406: scrinflora13 + Owner: Neutral + Location: 3,108 + Actor407: scrinflora13 + Owner: Neutral + Location: 6,94 + Actor408: scrinflora13 + Owner: Neutral + Location: 5,75 + Actor409: scrinflora13 + Owner: Neutral + Location: 16,82 + Actor410: scrinflora13 + Owner: Neutral + Location: 7,60 + Actor411: scrinflora13 + Owner: Neutral + Location: 25,47 + Actor412: scrinflora13 + Owner: Neutral + Location: 10,26 + Actor413: scrinflora13 + Owner: Neutral + Location: 19,4 + Actor414: scrinflora13 + Owner: Neutral + Location: 23,23 + Actor415: scrinflora12 + Owner: Neutral + Location: 18,9 + Actor416: scrinflora14 + Owner: Neutral + Location: 26,23 + Actor417: scrinflora14 + Owner: Neutral + Location: 4,37 + Actor418: scrinflora14 + Owner: Neutral + Location: 4,63 + Actor419: scrinflora14 + Owner: Neutral + Location: 1,73 + Actor420: scrinflora14 + Owner: Neutral + Location: 10,82 + Actor421: scrinflora14 + Owner: Neutral + Location: 6,93 + Actor422: scrinflora14 + Owner: Neutral + Location: 8,111 + Actor423: scrinflora14 + Owner: Neutral + Location: 18,112 + Actor424: scrinflora14 + Owner: Neutral + Location: 2,105 + Actor425: scrinflora14 + Owner: Neutral + Location: 45,111 + Actor426: scrinflora14 + Owner: Neutral + Location: 76,94 + Actor427: scrinflora14 + Owner: Neutral + Location: 79,73 + Actor428: scrinflora14 + Owner: Neutral + Location: 80,62 + Actor429: scrinflora14 + Owner: Neutral + Location: 66,69 + Actor430: scrinflora14 + Owner: Neutral + Location: 68,50 + Actor431: scrinflora14 + Owner: Neutral + Location: 61,33 + Actor432: scrinflora14 + Owner: Neutral + Location: 62,9 + Actor433: scrinflora14 + Owner: Neutral + Location: 49,36 + Actor434: scrinflora14 + Owner: Neutral + Location: 50,32 + Actor435: scrinflora14 + Owner: Neutral + Location: 32,36 + Actor436: scrinflora10 + Owner: Neutral + Location: 71,29 + Actor437: scrinflora10 + Owner: Neutral + Location: 67,35 + Actor438: scrinflora10 + Owner: Neutral + Location: 78,55 + Actor439: scrinflora10 + Owner: Neutral + Location: 76,77 + Actor440: scrinflora10 + Owner: Neutral + Location: 44,111 + Actor441: scrinflora10 + Owner: Neutral + Location: 12,111 + Actor442: scrinflora11 + Owner: Neutral + Location: 14,93 + Actor443: scrinflora11 + Owner: Neutral + Location: 22,85 + Actor444: scrinflora11 + Owner: Neutral + Location: 21,92 + Actor445: scrinflora11 + Owner: Neutral + Location: 3,92 + Actor446: scrinflora11 + Owner: Neutral + Location: 4,74 + Actor447: scrinflora11 + Owner: Neutral + Location: 6,80 + Actor448: scrinflora10 + Owner: Neutral + Location: 7,81 + Actor449: scrinflora10 + Owner: Neutral + Location: 20,79 + Actor450: scrinflora10 + Owner: Neutral + Location: 6,63 + Actor451: scrinflora10 + Owner: Neutral + Location: 24,56 + Actor453: scrinflora10 + Owner: Neutral + Location: 7,2 + Actor454: scrinflora10 + Owner: Neutral + Location: 4,14 + Actor455: scrinflora10 + Owner: Neutral + Location: 65,18 + Actor456: scrinflora10 + Owner: Neutral + Location: 65,44 + Actor457: gunw + Owner: Scrin + Facing: 384 + Location: 48,52 + Actor458: gunw + Owner: Scrin + Facing: 384 + Location: 58,57 + Actor459: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 47,51 + Actor460: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 46,53 + Actor461: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 60,54 + Actor462: s4 + Owner: Scrin + Facing: 384 + Location: 58,58 + SubCell: 3 + Actor463: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 57,55 + Actor464: s3 + Owner: Scrin + SubCell: 3 + Location: 57,46 + Facing: 229 + Actor465: s3 + Owner: Scrin + SubCell: 3 + Location: 62,48 + Facing: 824 + Actor466: s3 + Owner: Scrin + SubCell: 3 + Location: 58,54 + Facing: 634 + Actor467: afac + Owner: Nod + Location: 60,95 + Actor468: hpad.td + Owner: Nod + Location: 62,98 + Actor469: hpad.td + Owner: Nod + Location: 59,102 + PlayerStart: waypoint + Owner: Neutral + Location: 13,7 + Actor470: shar + Owner: Scrin + Location: 34,45 + Actor471: shar + Owner: Scrin + Location: 48,43 + Actor472: shar + Owner: Scrin + Location: 20,48 + CarryallDest: waypoint + Owner: Neutral + Location: 61,14 + CarryallSpawn: waypoint + Owner: Neutral + Location: 12,1 + Actor473: scrinflora4 + Owner: Neutral + Location: 6,24 + Actor474: scrinflora10 + Owner: Neutral + Location: 5,23 + Actor452: xo + Owner: GDI + Facing: 512 + Location: 11,4 + Actor475: xo + Owner: GDI + Facing: 512 + Location: 12,4 + Actor476: xo + Owner: GDI + Facing: 512 + Location: 13,4 + Actor477: xo + Owner: GDI + Facing: 512 + Location: 14,4 + Actor478: zrai + Owner: GDI + SubCell: 1 + Facing: 512 + Location: 11,6 + Actor479: zrai + Owner: GDI + SubCell: 2 + Facing: 512 + Location: 11,6 + Actor480: zrai + Owner: GDI + SubCell: 4 + Facing: 512 + Location: 11,6 + Actor481: zrai + Owner: GDI + SubCell: 5 + Facing: 512 + Location: 11,6 + Actor482: zrai + Owner: GDI + SubCell: 1 + Facing: 512 + Location: 14,6 + Actor483: zrai + Owner: GDI + SubCell: 2 + Facing: 512 + Location: 14,6 + Actor484: zrai + Owner: GDI + SubCell: 4 + Facing: 512 + Location: 14,6 + Actor485: zrai + Owner: GDI + SubCell: 5 + Facing: 512 + Location: 14,6 + Actor486: nsam + Owner: Nod + Location: 56,106 + Actor487: rmbc + Owner: Nod + SubCell: 3 + Location: 74,110 + Facing: 134 + Actor488: rmbc + Owner: Nod + SubCell: 3 + Location: 76,108 + Facing: 253 + Actor489: bh + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 65,94 + Actor490: bh + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 74,99 + Actor491: bh + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 52,92 + Actor492: bh + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 50,97 + Actor493: seek + Owner: Scrin + Facing: 384 + Location: 50,61 + Actor494: seek + Owner: Scrin + Facing: 384 + Location: 51,63 + Actor495: seek + Owner: Scrin + Location: 12,73 + Facing: 800 + Actor496: seek + Owner: Scrin + Location: 15,75 + Facing: 856 + Actor497: seek + Owner: Scrin + Location: 76,60 + Facing: 206 + Actor498: seek + Owner: Scrin + Location: 77,58 + Facing: 150 + Actor499: seek + Owner: Scrin + Location: 2,52 + Facing: 1023 + Actor500: seek + Owner: Scrin + Location: 3,50 + Facing: 1023 + Actor501: corr + Owner: Scrin + Location: 26,74 + Facing: 103 + Actor502: s4 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 29,65 + Actor503: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 28,64 + Actor504: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 30,65 + Actor505: bggy + Owner: Nod + Location: 60,100 + Facing: 642 + Actor506: bggy + Owner: Nod + Facing: 384 + Location: 54,101 + Actor507: ltnk + Owner: Nod + Location: 62,101 + Facing: 650 + Actor508: arty.nod + Owner: Nod + Location: 72,95 + Facing: 856 + Actor509: nsam + Owner: Nod + Location: 76,73 + Actor510: n3c + Owner: Nod + SubCell: 3 + Facing: 0 + Location: 71,75 + Actor511: rmbc + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 78,85 + Actor512: nsam + Owner: Nod + Location: 7,97 + Actor513: nsam + Owner: Nod + Location: 23,99 + HardOnlyCyborg1: rmbc + Owner: Nod + SubCell: 3 + Location: 48,110 + Facing: 256 + HardOnlyCyborg2: rmbc + Owner: Nod + SubCell: 3 + Location: 48,109 + Facing: 256 + HardOnlyCyborg3: rmbc + Owner: Nod + SubCell: 3 + Location: 48,108 + Facing: 256 + HardOnlyCyborg4: rmbc + Owner: Nod + SubCell: 3 + Location: 48,107 + Facing: 256 + HardOnlyCyborg5: rmbc + Owner: Nod + SubCell: 3 + Location: 48,106 + Facing: 256 + HardOnlyCyborg6: rmbc + Owner: Nod + SubCell: 3 + Location: 53,93 + Facing: 384 + HardOnlyCyborg7: rmbc + Owner: Nod + Location: 54,93 + SubCell: 3 + Facing: 547 + HardOnlyCyborg8: rmbc + Owner: Nod + SubCell: 3 + Location: 55,93 + Facing: 618 + HardOnlyTripod: tpod + Owner: Scrin + Location: 52,54 + Facing: 384 + HardOnlyAvatar1: avtr + Owner: Nod + Location: 62,93 + Facing: 0 + HardOnlyAvatar2: avtr + Owner: Nod + Location: 70,99 + Facing: 666 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-coalitions.yaml, spearhead-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/main-campaign/ca33-spearhead/spearhead-rules.yaml b/mods/ca/missions/main-campaign/ca33-spearhead/spearhead-rules.yaml new file mode 100644 index 0000000000..5b523693c1 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca33-spearhead/spearhead-rules.yaml @@ -0,0 +1,111 @@ +^Palettes: + PaletteFromFile@terrain-temperat: + Filename: alien.pal + TintPostProcessEffect: + Red: 1.3 + Green: 1 + Blue: 1.5 + Ambient: 0.5 + +^BaseWorld: + TerrainLighting: + +World: + LuaScript: + Scripts: campaign.lua, spearhead.lua + MissionData: + Briefing: It seems we were not the Scrin fleet's target. Scouts sent in the direction they were heading have located a Nod outpost in a mountainous and relatively sparsely inhabited region. We have thus far been unable to locate the bulk of the Nod forces, but Kane can't be too far away, and the Scrin were clearly trying to get to him. The terrain means it will be some time before we are able to move heavy forces to intercept.\n\nWe need more intel on Kane's whereabouts and intentions to properly plan our movements, and we believe this Nod outpost will be vulnerable to a small rapidly deployed strike team. Resources in the area are limited and there are few suitable locations for a staging area, but the lack of significant Scrin presence and the difficult terrain should mean you'll only face limited resistance.\n\nYour mission is to capture the Nod Communications Center. Anything else is at your discretion. + MapOptions: + ShortGameCheckboxEnabled: False + MusicPlaylist: + StartingMusic: heroism + +Player: + PlayerResources: + DefaultCash: 6000 + +# Disable tech + +AFLD.GDI: + -InterceptorPower@AirDef: + +HQ: + -DropPodsPowerCA@Zocom: + -AirstrikePowerCA@uav: + -AirstrikePowerCA@uavST: + +EYE: + Inherits@CAMPAIGNDISABLED: ^Disabled + +upgc.drop: + Inherits@CAMPAIGNDISABLED: ^Disabled + +# Enable subfaction specific tech + +XO: + Buildable: + Prerequisites: gtek, ~vehicles.gdi + +WOLV: + Buildable: + Prerequisites: gtek, ~vehicles.gdi + +PBUL: + Buildable: + Prerequisites: gtek, ~vehicles.gdi + +STWR: + Buildable: + Prerequisites: vehicles.any, ~structures.gdi + +ionmam.upgrade: + Buildable: + Prerequisites: upgc, !mdrone.upgrade, !hovermam.upgrade + TooltipExtras: + Attributes: \n(!) Only ONE Mammoth Tank upgrade can be chosen + +hovermam.upgrade: + Buildable: + Prerequisites: upgc, !ionmam.upgrade, !mdrone.upgrade + TooltipExtras: + Attributes: \n(!) Only ONE Mammoth Tank upgrade can be chosen + +mdrone.upgrade: + Buildable: + Prerequisites: upgc, !ionmam.upgrade, !hovermam.upgrade + TooltipExtras: + Attributes: \n(!) Only ONE Mammoth Tank upgrade can be chosen + +# Misc + +XO: + TargetedLeapAbility: + ChargeDelay: 175 + +ZRAI: + RevealsShroud: + Range: 7c0 + TargetedLeapAbility: + ChargeDelay: 175 + +OCAR.AMCV: + Inherits: OCAR + RejectsOrders: + -Buildable: + -Selectable: + Interactable: + Aircraft: + InitialFacing: 512 + Carryall: + InitialActor: amcv + Health: + HP: 100000 + +# Hunt() requires only 1 AttackBase +DEVA: + -AttackFrontalCharged: + -Armament@PRIMARYUPG: + -AmbientSound@CHARGE: + -WithIdleOverlay@CHARGE1: + -WithIdleOverlay@CHARGE2: + -WithIdleOverlay@CHARGE3: diff --git a/mods/ca/missions/main-campaign/ca33-spearhead/spearhead.lua b/mods/ca/missions/main-campaign/ca33-spearhead/spearhead.lua new file mode 100644 index 0000000000..825d361390 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca33-spearhead/spearhead.lua @@ -0,0 +1,173 @@ +MissionDir = "ca|missions/main-campaign/ca33-spearhead" + +ShardLaunchers = { Shard1, Shard2, Shard3, Shard4, Shard5, Shard6 } + +AdjustedNodCompositions = AdjustCompositionsForDifficulty(UnitCompositions.Nod) + +Squads = { + Main = { + AttackValuePerSecond = { + normal = { Min = 14, Max = 14 }, + hard = { Min = 20, Max = 20 }, + vhard = { Min = 26, Max = 26 }, + brutal = { Min = 32, Max = 32 } + }, + ActiveCondition = function() + return HasConyardAcrossRiver() or (Difficulty == "brutal" and HasUnitsAcrossRiver()) + end, + DispatchDelay = DateTime.Seconds(15), + FollowLeader = true, + Compositions = AdjustedNodCompositions, + }, + NodAir = { + Delay = AdjustAirDelayForDifficulty(DateTime.Minutes(9)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 12, Max = 12 }), + Compositions = AirCompositions.Nod, + } +} + +SetupPlayers = function() + GDI = Player.GetPlayer("GDI") + Scrin = Player.GetPlayer("Scrin") + Nod = Player.GetPlayer("Nod") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = { GDI } + MissionEnemies = { Nod, Scrin } +end + +WorldLoaded = function() + SetupPlayers() + + Camera.Position = PlayerStart.CenterPosition + + InitObjectives(GDI) + AdjustPlayerStartingCashForDifficulty() + InitNod() + UpdateMissionText() + + ObjectiveDestroyShardLaunchers = GDI.AddObjective("Destroy Scrin Shard Launchers.") + ObjectiveCaptureComms = GDI.AddObjective("Locate and capture Nod Communications Center.") + + if IsHardOrBelow() then + HardOnlyTripod.Destroy() + HardOnlyAvatar1.Destroy() + HardOnlyAvatar2.Destroy() + HardOnlyCyborg1.Destroy() + HardOnlyCyborg5.Destroy() + + if IsNormalOrBelow() then + HardOnlyCyborg2.Destroy() + HardOnlyCyborg3.Destroy() + HardOnlyCyborg4.Destroy() + HardOnlyCyborg6.Destroy() + HardOnlyCyborg7.Destroy() + HardOnlyCyborg8.Destroy() + end + end + + Trigger.OnAllKilled(ShardLaunchers, function() + InitMcv() + GDI.MarkCompletedObjective(ObjectiveDestroyShardLaunchers) + end) + + Utils.Do(ShardLaunchers, function(s) + Trigger.OnKilled(s, function(self, killer) + UpdateMissionText() + end) + end) + + Trigger.OnCapture(NodCommsCenter, function(self, captor, oldOwner, newOwner) + if IsMissionPlayer(newOwner) then + GDI.MarkCompletedObjective(ObjectiveCaptureComms) + end + end) + + Trigger.OnKilled(NodCommsCenter, function(self, killer) + if not GDI.IsObjectiveCompleted(ObjectiveCaptureComms) then + GDI.MarkFailedObjective(ObjectiveCaptureComms) + end + end) + + AfterWorldLoaded() +end + +Tick = function() + OncePerSecondChecks() + OncePerFiveSecondChecks() + AfterTick() +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + Nod.Resources = Nod.ResourceCapacity - 500 + + if MissionPlayersHaveNoRequiredUnits() then + if not GDI.IsObjectiveCompleted(ObjectiveCaptureComms) then + GDI.MarkFailedObjective(ObjectiveCaptureComms) + end + end + end +end + +OncePerFiveSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 125 == 0 then + UpdatePlayerBaseLocations() + + if Difficulty ~= "easy" and not NodGroundAttacksStarted and HasConyardAcrossRiver() then + NodGroundAttacksStarted = true + InitAttackSquad(Squads.Main, Nod) + end + end +end + +UpdateMissionText = function() + ShardLaunchersRemaining = #Utils.Where(ShardLaunchers, function(s) return not s.IsDead end) + + if ShardLaunchersRemaining > 0 then + UserInterface.SetMissionText("Shard Launchers remaining: " .. ShardLaunchersRemaining, HSLColor.Yellow) + else + UserInterface.SetMissionText("") + end +end + +InitNod = function() + AutoRepairBuildings(Nod) + AutoRepairAndRebuildBuildings(Nod) + SetupRefAndSilosCaptureCredits(Nod) + AutoReplaceHarvesters(Nod) + InitAiUpgrades(Nod) + InitAirAttackSquad(Squads.NodAir, Nod) + + local nodGroundAttackers = Nod.GetGroundAttackers() + + Utils.Do(nodGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsNodGroundHunterUnit) + end) +end + +InitMcv = function() + PlaySpeechNotificationToMissionPlayers("ReinforcementsArrived") + Notification("Reinforcements have arrived.") + local entryPath = { CarryallSpawn.Location, CarryallDest.Location } + local exitPath = { CarryallSpawn.Location } + ReinforcementsCA.ReinforceWithTransport(GDI, "ocar.amcv", nil, entryPath, exitPath) +end + +HasConyardAcrossRiver = function() + local conyards = GetMissionPlayersActorsByType("afac") + + local conyardsAcrossRiver = Utils.Where(conyards, function(c) + return c.Location.X > 34 and c.Location.Y > 72 + end) + + return #conyardsAcrossRiver > 0 +end + +HasUnitsAcrossRiver = function() + local unitsAcrossRiver = Utils.Where(GDI.GetActors(), function(a) + return a.HasProperty("Attack") + end) + + return #unitsAcrossRiver > 0 +end diff --git a/mods/ca/missions/main-campaign/ca34-illumination/fragment.aud b/mods/ca/missions/main-campaign/ca34-illumination/fragment.aud new file mode 100644 index 0000000000..ff317042d6 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca34-illumination/fragment.aud differ diff --git a/mods/ca/missions/main-campaign/ca34-illumination/fragment.shp b/mods/ca/missions/main-campaign/ca34-illumination/fragment.shp new file mode 100644 index 0000000000..159fcfabf3 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca34-illumination/fragment.shp differ diff --git a/mods/ca/missions/main-campaign/ca34-illumination/illumination-rules.yaml b/mods/ca/missions/main-campaign/ca34-illumination/illumination-rules.yaml new file mode 100644 index 0000000000..ba6a8b1c96 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca34-illumination/illumination-rules.yaml @@ -0,0 +1,266 @@ +^Palettes: + PaletteFromFile@terrain-temperat: + Filename: alien.pal + TintPostProcessEffect: + Red: 1.3 + Green: 1 + Blue: 1.5 + Ambient: 0.4 + FixedColorPalette@BlueTiberium: + Color: ffffff + +^BaseWorld: + TerrainLighting: + ResourceRenderer: + ResourceTypes: + BlueTiberium: + Name: Purified Tiberium + +World: + LuaScript: + Scripts: campaign.lua, illumination.lua + MissionData: + Briefing: ———[ Nod Introduction ]———\n\nKane's cyborgs poured from the gateway on the Scrin homeworld. Kane's manipulation of the timeline meant that the Scrin were completely unprepared, however it would not take long for them to mobilize.\n\nThe gateway's exit was shifted to present the Scrin with an additional front to contend with, then using cloaked transports Kane accompanied a contingent of his most elite cyborgs, leaving the bulk of his army to prepare for the inevitable arrival of Scrin forces.\n\nHis destination had been revealed to him by the Tacitus—an artifact containing ancient knowledge—which after painstaking efforts had finally revealed its true purpose.\n\n———[ Mission Briefing (Nod) ]———\n\nWe have arrived. Soon our great purpose here will become clear, but we must proceed quickly.\n\nThe Scrin will no doubt have been alerted to our presence, and simply by being here we threaten them in a way they have not been for millennia.\n\nSomewhere within the caves before us are remnants of a great project that was violently ended and buried long ago by those who still rule the Scrin to this day.\n\nA great conflict ended here, and its embers lie beneath our feet. I intend to reignite those embers.\n\nIf we are successful, it will herald the dawn of a new age for both the Scrin and mankind.\n\nTake command. Lead us through the caves. I have brought with me a means of navigating them, and a means of recovering the knowledge that the Scrin rulers thought they had wiped from existence. + MapOptions: + ShortGameCheckboxEnabled: False + MusicPlaylist: + StartingMusic: nodcrush + +Player: + PlayerResources: + DefaultCash: 0 + +^Cyborg: + ChangesHealth@THEAL: + PercentageStep: 5 + DamageCooldown: 50 + +KANE: + Inherits: ^Soldier + Inherits@CYBORGUPG: ^NodCyborgUpgrade + Inherits@COMMANDOSKULL: ^CommandoSkull + Inherits@SELECTION: ^SelectableSupportUnit + Tooltip: + Name: Kane + TooltipExtras: + Description: Leader of the Brotherhood of Nod. + Weaknesses: • Unarmed + Attributes: • Can create point-to-point wormholes\n• Detects artifact fragments + Health: + HP: 35000 + Mobile: + Speed: 70 + Voice: Move + RevealsShroud: + Range: 7c512 + RevealGeneratedShroud: False + -Crushable: + -TakeCover: + WithInfantryBody: + IdleSequences: stand + StandSequences: stand + Voiced: + VoiceSet: KaneVoice + SpawnActorAbility: + Actors: nodwormhole + SkipMakeAnimations: false + Range: 6c512 + CircleColor: aa0000 + SpawnSounds: wormhole-open.aud + AmmoPool: wormholespawner + CanTargetShroud: false + AllowedTerrainTypes: Clear, Rough, Road, Tiberium, BlueTiberium, Beach, Ore, Gems + AvoidActors: true + ConcurrentLimit: 2 + AmmoPool@WORMHOLESPAWNER: + Name: wormholespawner + Armaments: none + Ammo: 2 + ReloadAmmoPoolCA@WORMHOLESPAWNER: + AmmoPool: wormholespawner + Delay: 250 + ShowSelectionBar: true + SelectionBarColor: aaaaaa + WithAmmoPipsDecoration@WORMHOLESPAWNER: + AmmoPools: wormholespawner + RequiresSelection: true + Position: BottomLeft + Margin: 4, 3 + DetectCloaked: + DetectionTypes: ArtifactFragment + Range: 5c512 + RenderDetectionCircle: + Color: ffffff20 + BorderColor: 00000020 + KeepsDistance: + CaptureManager: + Captures: + CaptureTypes: building + CaptureDelay: 150 + ConsumedByCapture: false + WithDecoration@COMMANDOSKULL: + Image: pips + Sequence: pip-nod + ChangesHealth: + PercentageStep: 1 + Delay: 25 + StartIfBelow: 100 + DamageCooldown: 150 + ProvidesRadar: + +SCRINWORMHOLE: + Inherits: WORMHOLE + RenderSprites: + Image: wormhole + Health: + HP: 150000 + +NODWORMHOLE: + Inherits: WORMHOLE + RenderSprites: + Image: wormhole + -RevealsShroud: + Targetable: + TargetTypes: Wormhole + +caveshroud: + Inherits: ^InvisibleDummy + Immobile: + CreatesShroud: + Range: 7c512 + EditorOnlyTooltip: + Name: (caveshroud) + WithSpriteBody: + RenderSpritesEditorOnly: + Image: waypoint + BodyOrientation: + QuantizedFacings: 1 + MapEditorData: + Categories: System + +fragment: + Interactable: + ScriptTriggers: + Immobile: + OccupiesSpace: false + RenderSprites: + Image: fragment + Palette: scrin + WithSpriteBody: + BodyOrientation: + QuantizedFacings: 1 + HiddenUnderFog: + Type: CenterPosition + Tooltip: + Name: Artifact Fragment + ShowOwnerRow: false + MapEditorData: + Categories: Decoration + Cloak: + CloakedAlpha: 1 + DetectionTypes: ArtifactFragment + WithDeathAnimation: + DeathSequencePalette: scrin + UseDeathTypeSuffix: false + FallbackSequence: die + DeathPaletteIsPlayerPalette: false + Health: + HP: 1 + HitShape: + +RMBC: + RevealsShroud: + RevealGeneratedShroud: False + Mobile: + Speed: 70 + +ENLI: + RevealsShroud: + RevealGeneratedShroud: False + Mobile: + Speed: 70 + +SHAD: + RevealsShroud: + RevealGeneratedShroud: False + ReloadAmmoPoolCA: + Delay: 1500 + Count: 1 + ShowSelectionBar: true + SelectionBarColor: aaaaaa + Health: + HP: 15000 + Mobile: + Speed: 70 + +SHAB: + RevealsShroud: + RevealGeneratedShroud: False + -GrantTimedCondition@active: + -KillsSelf: + +ACOL: + RevealsShroud: + RevealGeneratedShroud: False + Mobile: + Speed: 70 + +TPLR: + RevealsShroud: + RevealGeneratedShroud: False + Health: + HP: 40000 + Mobile: + Speed: 70 + +S2: + Mobile: + Speed: 46 + +S3: + Mobile: + Speed: 46 + +S4: + Mobile: + Speed: 46 + +SCRINPURIFIER: + Tooltip: + Name: Ancient Device + SeedsResource: + ResourceType: BlueTiberium + Interval: 2 + RequiresCondition: !is-neutral + WithIdleOverlay@ACTIVE: + RequiresCondition: !is-neutral + GrantConditionIfOwnerIsNeutral@NEUTRAL: + Condition: is-neutral + +PURIFIERLIGHT: + Inherits: ^InvisibleDummy + Immobile: + TerrainLightSource: + Range: 11c0 + Intensity: 0.4 + BlueTint: 1 + RedTint: 1 + GreenTint: 1 + EditorOnlyTooltip: + Name: (purifierlight) + WithSpriteBody: + RenderSpritesEditorOnly: + Image: waypoint + BodyOrientation: + QuantizedFacings: 1 + MapEditorData: + Categories: System + +# Hunt() requires only 1 AttackBase +DEVA: + -AttackFrontalCharged: + -Armament@PRIMARYUPG: + -AmbientSound@CHARGE: + -WithIdleOverlay@CHARGE1: + -WithIdleOverlay@CHARGE2: + -WithIdleOverlay@CHARGE3: diff --git a/mods/ca/missions/main-campaign/ca34-illumination/illumination-sequences.yaml b/mods/ca/missions/main-campaign/ca34-illumination/illumination-sequences.yaml new file mode 100644 index 0000000000..276abc13a7 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca34-illumination/illumination-sequences.yaml @@ -0,0 +1,72 @@ +kane: + Inherits: ^CommonDeaths + stand: + Filename: kane.shp + Facings: 8 + run: + Filename: kane.shp + Start: 8 + Length: 6 + Facings: 8 + Tick: 100 + parachute: + Filename: kane.shp + Start: 3 + shoot: + Filename: yuria.shp + Length: 2 + Tick: 140 + Facings: 8 + die1: + Filename: kane.shp + Start: 139 + Length: 8 + die2: + Filename: kane.shp + Start: 147 + Length: 8 + die3: + Filename: kane.shp + Start: 155 + Length: 8 + die4: + Filename: kane.shp + Start: 163 + Length: 12 + die5: + Filename: kane.shp + Start: 175 + Length: 18 + die7: + Filename: kane.shp + Start: 139 + Length: 8 + chrono-overlay: + Filename: chronofade_small.shp + Length: * + BlendMode: Additive + Offset: 0, 0 + ZOffset: 512 + Tick: 80 + mind-overlay: + Filename: mindanim.shp + Length: * + Tick: 200 + BlendMode: Alpha + Offset: 0, 0 + +fragment: + idle: + Filename: ca|missions/main-campaign/ca34-illumination/fragment.shp + Length: * + BlendMode: Additive + die: + Filename: enrvbolthit.shp + BlendMode: Additive + Length: * + ZOffset: 2047 + +pips: + pip-nod: + Filename: ca|missions/main-campaign/ca34-illumination/pip-nod.shp + Offset: -4, -6 diff --git a/mods/ca/missions/main-campaign/ca34-illumination/illumination-voices.yaml b/mods/ca/missions/main-campaign/ca34-illumination/illumination-voices.yaml new file mode 100644 index 0000000000..efb114cdbf --- /dev/null +++ b/mods/ca/missions/main-campaign/ca34-illumination/illumination-voices.yaml @@ -0,0 +1,10 @@ +KaneVoice: + Voices: + Select: ca|missions/main-campaign/ca34-illumination/kane_cantkill, ca|missions/main-campaign/ca34-illumination/kane_yesmychild, ca|missions/main-campaign/ca34-illumination/kane_yescommander, ca|missions/main-campaign/ca34-illumination/kane_whatisthepath + Move: ca|missions/main-campaign/ca34-illumination/kane_wemove, ca|missions/main-campaign/ca34-illumination/kane_peacethroughpower, ca|missions/main-campaign/ca34-illumination/kane_ontheway, ca|missions/main-campaign/ca34-illumination/kane_onevisiononepurpose, ca|missions/main-campaign/ca34-illumination/kane_ofcourse, ca|missions/main-campaign/ca34-illumination/kane_movingout + Action: ca|missions/main-campaign/ca34-illumination/kane_peacethroughpower, ca|missions/main-campaign/ca34-illumination/kane_onevisiononepurpose, ca|missions/main-campaign/ca34-illumination/kane_ofcourse + Attack: ca|missions/main-campaign/ca34-illumination/kane_peacethroughpower, ca|missions/main-campaign/ca34-illumination/kane_onevisiononepurpose, ca|missions/main-campaign/ca34-illumination/kane_ofcourse + Die: dedman1,dedman2,dedman3,dedman4,dedman5,dedman7,dedman8,nuyell1,nuyell12,nuyell3,nuyell4,nuyell5 + Burned: dedman10,yell1 + Zapped: dedman6,nuyell3 + Poisoned: vtoxb,vtoxc,vtoxd,vtoxe,vtoxf,vtoxh \ No newline at end of file diff --git a/mods/ca/missions/main-campaign/ca34-illumination/illumination-weapons.yaml b/mods/ca/missions/main-campaign/ca34-illumination/illumination-weapons.yaml new file mode 100644 index 0000000000..b00902fcd6 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca34-illumination/illumination-weapons.yaml @@ -0,0 +1,4 @@ +EnlightenedBeam: + Warhead@1Dam: HealthPercentageSpreadDamage + Versus: + Concrete: 1 diff --git a/mods/ca/missions/main-campaign/ca34-illumination/illumination.lua b/mods/ca/missions/main-campaign/ca34-illumination/illumination.lua new file mode 100644 index 0000000000..a7d9bb603a --- /dev/null +++ b/mods/ca/missions/main-campaign/ca34-illumination/illumination.lua @@ -0,0 +1,494 @@ +MissionDir = "ca|missions/main-campaign/ca34-illumination" + +Caves = { + { WormholeLocation = Cave1Wormhole.Location, PatrolPath = { Cave1Patrol1.Location, Cave1Patrol2.Location, Cave1Patrol1.Location, Cave1Patrol3.Location, Cave1Patrol4.Location, Cave1Patrol5.Location, Cave1Patrol6.Location, Cave1Patrol5.Location, Cave1Patrol4.Location, Cave1Patrol3.Location }, Composition = {} }, + { WormholeLocation = Cave2Wormhole.Location, PatrolPath = { Cave2Patrol1.Location, Cave2Patrol2.Location, Cave2Patrol3.Location, Cave2Patrol4.Location, Cave2Patrol3.Location } }, + { WormholeLocation = Cave3Wormhole.Location, PatrolPath = { Cave3Patrol1.Location, Cave3Patrol2.Location, Cave3Patrol3.Location, Cave3Patrol4.Location, Cave3Patrol3.Location, Cave3Patrol2.Location } }, + { WormholeLocation = Cave5Wormhole.Location, PatrolPath = { Cave5Patrol1.Location, Cave5Patrol2.Location } }, + { WormholeLocation = Cave7Wormhole.Location, PatrolPath = { Cave7Patrol1.Location, Cave7Patrol2.Location, Cave7Patrol1.Location, Cave7Patrol3.Location } }, + { WormholeLocation = Cave8Wormhole.Location, PatrolPath = { Cave8Patrol1.Location, Cave8Patrol2.Location } }, + { WormholeLocation = Cave9Wormhole.Location, PatrolPath = { Cave9Patrol1.Location, Cave9Patrol2.Location, Cave9Patrol1.Location, Cave9Patrol3.Location, Cave9Patrol4.Location, Cave9Patrol3.Location } }, +} + +MaxContinuousSpawns = { + easy = 1, + normal = 1, + hard = 2, + vhard = 2, + brutal = 2 +} + +ScrinCompositions = { + easy = { + { "s1", "s1", "s1", "s3", "s2", "s1", "gscr", "s1", "s1", "intl" , "s1", { "gunw", "shrw" }, "s1", "s1" } + }, + normal = { + { "s1", "s1", "s1", "s3", "s2", "s1", "s1", "s3", "gscr", { "gunw", "intl", "shrw" }, "s1", { "devo", "devo", "lchr", "corr" }, "s1", { "tpod", "stcr", "intl" } } + }, + hard = { + { "s1", "s1", "s1", "s3", "s2", "s1", "s1", "s3", "gscr", "s4", { "gunw", "intl", "shrw" }, "s1", { "devo", "devo", "lchr", "corr" }, "s1", { "tpod", "stcr", "intl" }, "gscr" } + }, + vhard = { + { "s1", "s1", "s1", "s3", "evis", "s1", "s1", "s3", "s2", "gscr", "s4", { "gunw", "shrw" }, "s1", { "devo", "devo", "lchr", "corr" }, "gscr", { "tpod", "rtpd" }, "s1", "gscr", { "intl", "stcr" }, "gscr" } + }, + brutal = { + { "s1", "s1", "s1", "s3", "evis", "s1", "s1", "s3", "evis", "gscr", "mrdr", { "gunw", "shrw" }, "s1", { "devo", "devo", "lchr", "corr" }, "gscr", { "tpod", "rtpd" }, "s1", "gscr", { "intl", "stcr" }, "gscr" } + } +} + +FinalBattleInfantryList = { + easy = { "s1", "s1", "s1", "s3", "gscr", "s1" }, + normal = { "s1", "gscr", "s3", "s4", "s1", "s1", "s2", "s1" }, + hard = { "gscr", "s1", "s3", "s4", "s1", "gscr", "s3", "s1" }, + vhard = { "gscr", "s1", "s3", "s4", "s1", "gscr", "s3", "s1" }, + brutal = { "gscr", "s1", "s3", "mrdr", "s1", "gscr", "s3", "s1" } +} + +FinalBattleVehiclesList = { + easy = { "gunw", "intl", "corr" }, + normal = { "intl", "devo", "corr", "devo", "tpod" }, + hard = { "intl", "tpod", "corr", "devo", "rtpd" }, + vhard = { "intl", "tpod", "corr", "devo", "rtpd" }, + brutal = { "intl", "tpod", "corr", "devo", "rtpd" } +} + +FinalBattleInfantryInterval = { + easy = { Min = DateTime.Seconds(8), Max = DateTime.Seconds(9) }, + normal = { Min = DateTime.Seconds(7), Max = DateTime.Seconds(8) }, + hard = { Min = DateTime.Seconds(6), Max = DateTime.Seconds(7) }, + vhard = { Min = DateTime.Seconds(6), Max = DateTime.Seconds(7) }, + brutal = { Min = DateTime.Seconds(5), Max = DateTime.Seconds(6) } +} + +FinalBattleVehicleInterval = { + easy = DateTime.Seconds(28), + normal = DateTime.Seconds(24), + hard = DateTime.Seconds(20), + vhard = DateTime.Seconds(20), + brutal = DateTime.Seconds(20) +} + +WormholeRespawnTime = { + easy = DateTime.Minutes(4), -- not used + normal = DateTime.Minutes(3), + hard = DateTime.Minutes(2), + vhard = DateTime.Minutes(2), + brutal = DateTime.Minutes(2) +} + +ContinuousSpawnFrequency = { + easy = DateTime.Seconds(100), -- not used + normal = DateTime.Seconds(70), + hard = DateTime.Seconds(45), + vhard = DateTime.Seconds(40), + brutal = DateTime.Seconds(35) +} + +SetupPlayers = function() + Scrin = Player.GetPlayer("Scrin") + Nod = Player.GetPlayer("Nod") + TibLifeforms = Player.GetPlayer("TibLifeforms") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = { Nod } + MissionEnemies = { Scrin } +end + +WorldLoaded = function() + SetupPlayers() + + TimerTicks = 0 + FragmentsAcquired = {} + FragmentsAcquiredCount = 0 + FragmentsDetected = {} + Camera.Position = PlayerStart.CenterPosition + + InitObjectives(Nod) + InitScrin() + + ObjectiveFindFragments = Nod.AddObjective("Find the six hidden artifact fragments.") + ObjectiveKaneSurvives = Nod.AddObjective("Kane must survive.") + + local fragments = TibLifeforms.GetActorsByType("fragment") + + UpdateMissionText() + + Utils.Do(MissionPlayers, function(p) + Actor.Create("hazmat.upgrade", true, { Owner = p }) + Actor.Create("quantum.upgrade", true, { Owner = p }) + Actor.Create("cyborgarmor.upgrade", true, { Owner = p }) + Actor.Create("cyborgspeed.upgrade", true, { Owner = p }) + end) + + if Difficulty == "brutal" then + NonBrutalCyborg1.Destroy() + NonBrutalCyborg2.Destroy() + NonBrutalCyborg3.Destroy() + NonBrutalCyborg4.Destroy() + end + + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(2)), function() + Media.DisplayMessage("There are six fragments of an artifact hidden within these caverns. Only I have the ability to detect them. Once we have them all, the assembled artifact will lead us to our goal.", "Kane", HSLColor.FromHex("FF0000")) + MediaCA.PlaySound(MissionDir .. "/kane_findfragments.aud", 2) + Trigger.AfterDelay(DateTime.Seconds(4), function() + Tip("Kane is able to create wormholes which can be used to travel between neighboring chambers. Only Kane can detect the hidden artifact fragments.") + end) + end) + + Utils.Do(fragments, function(fragment) + local loc = fragment.Location + local pos = fragment.CenterPosition + local fragmentId = tostring(fragment) + + Trigger.OnEnteredProximityTrigger(pos, WDist.New((5 * 1024) + 512), function(a, id) + if IsMissionPlayer(a.Owner) and a.Type == "kane" then + if not FirstFragmentFound then + FirstFragmentFound = true + Beacon.New(Nod, pos) + Media.DisplayMessage("There! We have already found the first fragment.", "Kane", HSLColor.FromHex("FF0000")) + MediaCA.PlaySound(MissionDir .. "/kane_firstfragment.aud", 2) + elseif FragmentsDetected[fragmentId] == nil then + Beacon.New(Nod, pos) + Notification("Artifact fragment detected.") + Media.PlaySound("beacon.aud") + end + + FragmentsDetected[fragmentId] = true + end + end) + + Trigger.OnEnteredFootprint({ loc }, function(a, id) + if not fragment.IsDead and IsMissionPlayer(a.Owner) and FragmentsDetected[fragmentId] ~= nil and FragmentsAcquired[fragmentId] == nil then + Trigger.RemoveFootprintTrigger(id) + fragment.Kill() + FragmentsAcquired[tostring(fragment)] = true + FragmentsAcquiredCount = FragmentsAcquiredCount + 1 + Media.PlaySound("fragment.aud") + Notification("Artifact fragment acquired.") + UpdateMissionText() + + if FragmentsAcquiredCount == 6 then + Nod.MarkCompletedObjective(ObjectiveFindFragments) + + Trigger.AfterDelay(DateTime.Seconds(2), function() + CaveShroud1.Destroy() + CaveShroud2.Destroy() + CaveShroud3.Destroy() + CaveShroud4.Destroy() + CaveShroud5.Destroy() + CaveShroud6.Destroy() + CaveShroud7.Destroy() + Beacon.New(Nod, HiddenChamberEntrance.CenterPosition) + Notification("A hidden chamber has been revealed.") + ObjectiveExploreHiddenChamber = Nod.AddObjective("Explore the hidden chamber.") + + local chamberCamera = Actor.Create("camera", true, { Owner = Nod, Location = HiddenChamberEntrance.Location }) + Trigger.AfterDelay(DateTime.Seconds(10), function() + chamberCamera.Destroy() + end) + + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(1)), function() + Media.DisplayMessage("With the fragments combined the path to our goal is revealed. Now we must get to the chamber before the Scrin.", "Kane", HSLColor.FromHex("FF0000")) + MediaCA.PlaySound(MissionDir .. "/kane_fragmentscombined.aud", 2) + end) + end) + end + end + end) + end) + + Utils.Do(Caves, function(c) + SpawnWormhole(c) + SpawnScrinSquad(c, false) + end) + + Trigger.OnKilled(Kane, function(self, killer) + Nod.MarkFailedObjective(ObjectiveKaneSurvives) + end) + + Trigger.OnCapture(Purifier, function(self, captor, oldOwner, newOwner) + Actor.Create("purifierlight", true, { Owner = Neutral, Location = Purifier.Location, CenterPosition = Purifier.CenterPosition }) + Media.PlaySound("purification.aud") + Nod.MarkCompletedObjective(ObjectiveActivatePurifier) + Trigger.AfterDelay(DateTime.Seconds(1), function() + Media.DisplayMessage("The Scrin have no doubt located us by now. Protect the device!", "Kane", HSLColor.FromHex("FF0000")) + MediaCA.PlaySound(MissionDir .. "/kane_protect.aud", 2) + Trigger.AfterDelay(DateTime.Seconds(2), function() + ObjectiveDefendPurifier = Nod.AddObjective("Protect the ancient device.") + ObjectiveDestroyWormholes = Nod.AddObjective("Destroy Scrin wormholes.") + InitFinalBattle() + end) + end) + end) + + Trigger.OnKilled(Purifier, function(self, killer) + Nod.MarkFailedObjective(ObjectiveDefendPurifier) + end) + + Trigger.OnEnteredProximityTrigger(Purifier.CenterPosition, WDist.New(7 * 1024), function(a, id) + if IsMissionPlayer(a.Owner) and not PurifierFound and Nod.IsObjectiveCompleted(ObjectiveFindFragments) then + PurifierFound = true + Trigger.RemoveProximityTrigger(id) + Beacon.New(Nod, Purifier.CenterPosition) + ObjectiveActivatePurifier = Nod.AddObjective("Activate the ancient device.") + Nod.MarkCompletedObjective(ObjectiveExploreHiddenChamber) + Media.DisplayMessage("We found it! The Scrin rulers believed it to be destroyed long ago, but its creators hid it well. Quickly, let us activate it, we must make sure it still functions.", "Kane", HSLColor.FromHex("FF0000")) + MediaCA.PlaySound(MissionDir .. "/kane_foundit.aud", 2) + end + end) + + AfterWorldLoaded() +end + +Tick = function() + OncePerSecondChecks() + OncePerFiveSecondChecks() + AfterTick() +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + + end +end + +OncePerFiveSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 125 == 0 then + if DoFinalBattleChecks then + local finalScrinUnits = Map.ActorsInCircle(HiddenChamberCenter.CenterPosition, WDist.New(12 * 1024), function(a) return a.Owner == Scrin and (a.HasProperty("Move") or a.Type == "scrinwormhole") end) + if #finalScrinUnits == 0 then + DoFinalBattleChecks = false + Media.DisplayMessage("Our forces on the surface have triumphed. The device is ours, and soon it will be ready to do what had been intended for it millennia ago. Excellent work commander, our ultimate victory draws ever closer.", "Kane", HSLColor.FromHex("FF0000")) + MediaCA.PlaySound(MissionDir .. "/kane_victory.aud", 2) + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(12)), function() + Nod.MarkCompletedObjective(ObjectiveDefendPurifier) + Nod.MarkCompletedObjective(ObjectiveDestroyWormholes) + Nod.MarkCompletedObjective(ObjectiveKaneSurvives) + end) + end + end + end +end + +UpdateMissionText = function() + if FragmentsAcquiredCount == 6 then + UserInterface.SetMissionText("") + else + UserInterface.SetMissionText("Artifact fragments collected: " .. FragmentsAcquiredCount .. "/6", HSLColor.Yellow) + end +end + +SpawnWormhole = function(cave) + cave.Wormhole = Actor.Create("scrinwormhole", true, { Owner = Scrin, Location = cave.WormholeLocation }) + cave.ContinuousSpawn = false + cave.NumSpawns = 0 + + -- if wormhole is destroyed, respawn after a delay (unless on easy) + Trigger.OnKilled(cave.Wormhole, function(self, killer) + if Difficulty ~= "easy" then + Trigger.AfterDelay(WormholeRespawnTime[Difficulty], function() + SpawnWormhole(cave) + local currentWormhole = cave.Wormhole + Trigger.AfterDelay(DateTime.Seconds(10), function() + if not currentWormhole.IsDead then + SpawnScrinSquad(cave, false) + end + end) + end) + end + end) + + SpawnScrinSquad(cave, true) +end + +SpawnScrinSquad = function(cave, continuous) + + -- only spawn when wormhole is active + if cave.Wormhole.IsDead then + return + end + + if continuous then + Trigger.AfterDelay(ContinuousSpawnFrequency[Difficulty], function() + SpawnScrinSquad(cave, continuous) + end) + + -- if continuous spawn isn't active yet (no units killed), defer to next attempt + if not cave.ContinuousSpawn then + return + end + + if cave.NumSpawns < MaxContinuousSpawns[Difficulty] then + cave.NumSpawns = cave.NumSpawns + 1 + else + return + end + end + + local units = Reinforcements.Reinforce(Scrin, GetSquadComposition(), { cave.WormholeLocation }, 1) + + Utils.Do(units, function(a) + a.Scatter() + a.Wait(Utils.RandomInteger(1, 75)) + a.Scatter() + TargetSwapChance(a, 10) + ca34_CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsScrinGroundHunterUnit) + Trigger.OnIdle(a, function(self) + a.Patrol(cave.PatrolPath) + local selfId = tostring(self); + AlertedUnits[selfId] = nil + end) + end) + + -- if all units in squad are killed, activate continuous spawn and reduce the count if it was a continuous squad + Trigger.OnAllKilled(units, function() + if continuous then + cave.NumSpawns = cave.NumSpawns - 1 + if cave.NumSpawns < 0 then + cave.NumSpawns = 0 + end + end + Trigger.AfterDelay(DateTime.Seconds(15), function() + if not cave.Wormhole.IsDead then + cave.ContinuousSpawn = true + end + end) + end) +end + +ca34_CallForHelpOnDamagedOrKilled = function(actor, range, filter, validAttackingPlayerFunc) + if validAttackingPlayerFunc == nil then + validAttackingPlayerFunc = function(p) return IsMissionPlayer(p) end + end + Trigger.OnDamaged(actor, function(self, attacker, damage) + if validAttackingPlayerFunc(attacker.Owner) then + ca34_CallForHelp(self, range, attacker, filter) + end + end) + Trigger.OnKilled(actor, function(self, killer) + if validAttackingPlayerFunc(killer.Owner) then + ca34_CallForHelp(self, range, killer, filter) + end + end) +end + +ca34_CallForHelp = function(self, range, attacker, filter) + if IsMissionPlayer(self.Owner) then + return + end + + if attacker.IsDead then + return + end + + local selfId = tostring(self) + if AlertedUnits[selfId] == nil then + if not self.IsDead then + AlertedUnits[selfId] = true + if filter(self) then + self.Stop() + self.AttackMove(attacker.Location) + end + end + + local nearbyUnits = Map.ActorsInCircle(self.CenterPosition, range, function(a) + return a.Owner.IsAlliedWith(self.Owner) and not IsMissionPlayer(a.Owner) and filter(a) + end) + + Utils.Do(nearbyUnits, function(nearbyUnit) + local nearbyUnitId = tostring(nearbyUnit) + if not nearbyUnit.IsDead and AlertedUnits[nearbyUnitId] == nil then + AlertedUnits[nearbyUnitId] = true + nearbyUnit.Stop() + nearbyUnit.AttackMove(attacker.Location) + end + end) + end +end + +InitFinalBattle = function() + if not FinalBattleStarted then + FinalBattleStarted = true + FinalBattleWormholes = { } + + Trigger.AfterDelay(DateTime.Seconds(8), function() + local finalWormholeLocations = { FinalWormhole1.Location, FinalWormhole2.Location, FinalWormhole3.Location, FinalWormhole4.Location, FinalWormhole5.Location } + Utils.Do(finalWormholeLocations, function(loc) + Trigger.AfterDelay(Utils.RandomInteger(25, 150), function() + local wormhole = Actor.Create("scrinwormhole", true, { Owner = Scrin, Location = loc }) + table.insert(FinalBattleWormholes, wormhole) + SpawnFinalBattleInfantry(wormhole, 1) + end) + end) + Trigger.AfterDelay(151, function() + DoFinalBattleChecks = true + SpawnFinalBattleVehicle(1) + end) + end) + end +end + +SpawnFinalBattleInfantry = function(wormhole, nextUnitIndex) + if not wormhole.IsDead then + if nextUnitIndex > #FinalBattleInfantryList[Difficulty] then + nextUnitIndex = 1 + end + + local nextUnit = FinalBattleInfantryList[Difficulty][nextUnitIndex] + if type(nextUnit) == "table" then + nextUnit = Utils.Random(nextUnit) + end + + local units = Reinforcements.Reinforce(Scrin, { nextUnit }, { wormhole.Location }, 1) + Utils.Do(units, function(u) + u.AttackMove(HiddenChamberCenter.Location) + end) + + Trigger.AfterDelay(Utils.RandomInteger(FinalBattleInfantryInterval[Difficulty].Min, FinalBattleInfantryInterval[Difficulty].Max), function() + SpawnFinalBattleInfantry(wormhole, nextUnitIndex + 1) + end) + end +end + +SpawnFinalBattleVehicle = function(nextUnitIndex) + local activeWormholes = Utils.Where(FinalBattleWormholes, function(w) return not w.IsDead end) + if #activeWormholes > 0 then + local wormhole = Utils.Random(activeWormholes) + + if nextUnitIndex > #FinalBattleVehiclesList[Difficulty] then + nextUnitIndex = 1 + end + + local nextUnit = FinalBattleVehiclesList[Difficulty][nextUnitIndex] + + local units = Reinforcements.Reinforce(Scrin, { nextUnit }, { wormhole.Location }, 1) + Utils.Do(units, function(u) + u.AttackMove(HiddenChamberCenter.Location) + end) + + Trigger.AfterDelay(FinalBattleVehicleInterval[Difficulty], function() + SpawnFinalBattleVehicle(nextUnitIndex + 1) + end) + end +end + +GetSquadComposition = function() + local rawComposition = Utils.Random(ScrinCompositions[Difficulty]) + local composition = {} + Utils.Do(rawComposition, function(c) + if type(c) == "table" then + table.insert(composition, Utils.Random(c)) + else + table.insert(composition, c) + end + end) + return composition +end + +InitScrin = function() + local scrinGroundAttackers = Scrin.GetGroundAttackers() + + Utils.Do(scrinGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsScrinGroundHunterUnit) + end) +end diff --git a/mods/ca/missions/main-campaign/ca34-illumination/kane_cantkill.aud b/mods/ca/missions/main-campaign/ca34-illumination/kane_cantkill.aud new file mode 100644 index 0000000000..544b764de4 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca34-illumination/kane_cantkill.aud differ diff --git a/mods/ca/missions/main-campaign/ca34-illumination/kane_findfragments.aud b/mods/ca/missions/main-campaign/ca34-illumination/kane_findfragments.aud new file mode 100644 index 0000000000..76f0d250fd Binary files /dev/null and b/mods/ca/missions/main-campaign/ca34-illumination/kane_findfragments.aud differ diff --git a/mods/ca/missions/main-campaign/ca34-illumination/kane_firstfragment.aud b/mods/ca/missions/main-campaign/ca34-illumination/kane_firstfragment.aud new file mode 100644 index 0000000000..ab6977cd46 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca34-illumination/kane_firstfragment.aud differ diff --git a/mods/ca/missions/main-campaign/ca34-illumination/kane_foundit.aud b/mods/ca/missions/main-campaign/ca34-illumination/kane_foundit.aud new file mode 100644 index 0000000000..c4330ef2c9 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca34-illumination/kane_foundit.aud differ diff --git a/mods/ca/missions/main-campaign/ca34-illumination/kane_fragmentscombined.aud b/mods/ca/missions/main-campaign/ca34-illumination/kane_fragmentscombined.aud new file mode 100644 index 0000000000..712e4ee29c Binary files /dev/null and b/mods/ca/missions/main-campaign/ca34-illumination/kane_fragmentscombined.aud differ diff --git a/mods/ca/missions/main-campaign/ca34-illumination/kane_movingout.aud b/mods/ca/missions/main-campaign/ca34-illumination/kane_movingout.aud new file mode 100644 index 0000000000..c00ef63abb Binary files /dev/null and b/mods/ca/missions/main-campaign/ca34-illumination/kane_movingout.aud differ diff --git a/mods/ca/missions/main-campaign/ca34-illumination/kane_ofcourse.aud b/mods/ca/missions/main-campaign/ca34-illumination/kane_ofcourse.aud new file mode 100644 index 0000000000..771f3f8b57 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca34-illumination/kane_ofcourse.aud differ diff --git a/mods/ca/missions/main-campaign/ca34-illumination/kane_onevisiononepurpose.aud b/mods/ca/missions/main-campaign/ca34-illumination/kane_onevisiononepurpose.aud new file mode 100644 index 0000000000..c1118f2b68 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca34-illumination/kane_onevisiononepurpose.aud differ diff --git a/mods/ca/missions/main-campaign/ca34-illumination/kane_ontheway.aud b/mods/ca/missions/main-campaign/ca34-illumination/kane_ontheway.aud new file mode 100644 index 0000000000..d0e12776f1 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca34-illumination/kane_ontheway.aud differ diff --git a/mods/ca/missions/main-campaign/ca34-illumination/kane_peacethroughpower.aud b/mods/ca/missions/main-campaign/ca34-illumination/kane_peacethroughpower.aud new file mode 100644 index 0000000000..bec3344e6e Binary files /dev/null and b/mods/ca/missions/main-campaign/ca34-illumination/kane_peacethroughpower.aud differ diff --git a/mods/ca/missions/main-campaign/ca34-illumination/kane_protect.aud b/mods/ca/missions/main-campaign/ca34-illumination/kane_protect.aud new file mode 100644 index 0000000000..d700e65824 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca34-illumination/kane_protect.aud differ diff --git a/mods/ca/missions/main-campaign/ca34-illumination/kane_victory.aud b/mods/ca/missions/main-campaign/ca34-illumination/kane_victory.aud new file mode 100644 index 0000000000..c38bcf0f3b Binary files /dev/null and b/mods/ca/missions/main-campaign/ca34-illumination/kane_victory.aud differ diff --git a/mods/ca/missions/main-campaign/ca34-illumination/kane_wemove.aud b/mods/ca/missions/main-campaign/ca34-illumination/kane_wemove.aud new file mode 100644 index 0000000000..21416f99c8 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca34-illumination/kane_wemove.aud differ diff --git a/mods/ca/missions/main-campaign/ca34-illumination/kane_whatisthepath.aud b/mods/ca/missions/main-campaign/ca34-illumination/kane_whatisthepath.aud new file mode 100644 index 0000000000..f027bc9fe2 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca34-illumination/kane_whatisthepath.aud differ diff --git a/mods/ca/missions/main-campaign/ca34-illumination/kane_yescommander.aud b/mods/ca/missions/main-campaign/ca34-illumination/kane_yescommander.aud new file mode 100644 index 0000000000..167b6157ae Binary files /dev/null and b/mods/ca/missions/main-campaign/ca34-illumination/kane_yescommander.aud differ diff --git a/mods/ca/missions/main-campaign/ca34-illumination/kane_yesmychild.aud b/mods/ca/missions/main-campaign/ca34-illumination/kane_yesmychild.aud new file mode 100644 index 0000000000..9b76ae9b72 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca34-illumination/kane_yesmychild.aud differ diff --git a/mods/ca/missions/main-campaign/ca34-illumination/map.bin b/mods/ca/missions/main-campaign/ca34-illumination/map.bin new file mode 100644 index 0000000000..f76e307d35 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca34-illumination/map.bin differ diff --git a/mods/ca/missions/main-campaign/ca34-illumination/map.png b/mods/ca/missions/main-campaign/ca34-illumination/map.png new file mode 100644 index 0000000000..7bdc112f3c Binary files /dev/null and b/mods/ca/missions/main-campaign/ca34-illumination/map.png differ diff --git a/mods/ca/missions/main-campaign/ca34-illumination/map.yaml b/mods/ca/missions/main-campaign/ca34-illumination/map.yaml new file mode 100644 index 0000000000..9f0f84dc02 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca34-illumination/map.yaml @@ -0,0 +1,684 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 34: Illumination + +Author: Darkademic + +Tileset: TEMPERAT + +MapSize: 114,114 + +Bounds: 1,1,112,112 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: Nod, Scrin + PlayerReference@Nod: + Name: Nod + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: nod + LockColor: True + Color: FE1100 + LockSpawn: True + LockTeam: True + Enemies: Scrin, Creeps, TibLifeforms + PlayerReference@Scrin: + Name: Scrin + Bot: campaign + Faction: scrin + Color: 7700FF + Allies: TibLifeforms + Enemies: Nod, Creeps + PlayerReference@TibLifeforms: + Name: TibLifeforms + NonCombatant: True + Faction: scrin + Color: 00FF00 + Allies: Scrin + Enemies: Nod, Creeps + +Actors: + Kane: kane + Owner: Nod + SubCell: 3 + Location: 17,46 + Facing: 768 + Actor66: scrinflora12 + Owner: Neutral + Location: 23,11 + Cave2Patrol4: waypoint + Owner: Neutral + Location: 31,13 + Cave2Patrol1: waypoint + Owner: Neutral + Location: 59,13 + Cave3Wormhole: waypoint + Owner: Neutral + Location: 80,13 + Cave2Patrol3: waypoint + Owner: Neutral + Location: 43,14 + Cave2Wormhole: waypoint + Owner: Neutral + Location: 53,14 + Actor52: scrinflora2 + Owner: Neutral + Location: 36,15 + Cave3Patrol2: waypoint + Owner: Neutral + Location: 90,16 + Actor61: scrinflora14 + Owner: Neutral + Location: 53,17 + Actor59: scrinflora13 + Owner: Neutral + Location: 101,17 + Actor51: scrinflora1 + Owner: Neutral + Location: 51,22 + Cave2Patrol2: waypoint + Owner: Neutral + Location: 52,24 + Cave1Patrol2: waypoint + Owner: Neutral + Location: 34,29 + Actor75: scrinflora13 + Owner: Neutral + Location: 28,30 + Actor50: scrinflora4 + Owner: Neutral + Location: 30,30 + Actor60: scrinflora14 + Owner: Neutral + Location: 73,30 + Actor74: scrinflora10 + Owner: Neutral + Location: 31,31 + Cave1Patrol1: waypoint + Owner: Neutral + Location: 38,37 + Actor68: scrinflora5 + Owner: Neutral + Location: 15,39 + Actor69: scrinflora10 + Owner: Neutral + Location: 23,40 + Actor37: enli + Owner: Nod + SubCell: 5 + Facing: 768 + Location: 16,41 + Actor100: tplr + Owner: Nod + SubCell: 5 + Facing: 768 + Location: 18,42 + Actor58: scrinflora13 + Owner: Neutral + Location: 54,42 + Actor67: scrinflora12 + Owner: Neutral + Location: 97,42 + Actor41: rmbc + Owner: Nod + SubCell: 2 + Facing: 768 + Location: 16,43 + Actor43: rmbc + Owner: Nod + SubCell: 5 + Facing: 768 + Location: 16,43 + Actor88: fragment + Location: 52,43 + Owner: TibLifeforms + Actor12: tplr + Owner: Nod + SubCell: 2 + Facing: 768 + Location: 18,44 + Actor14: tplr + Owner: Nod + SubCell: 5 + Facing: 768 + Location: 18,44 + Actor16: shad + Owner: Nod + SubCell: 3 + Facing: 768 + Location: 21,44 + Actor71: scrinflora12 + Owner: Neutral + Location: 40,45 + Cave5Patrol1: waypoint + Owner: Neutral + Location: 94,45 + PlayerStart: waypoint + Owner: Neutral + Location: 17,46 + Cave5Wormhole: waypoint + Owner: Neutral + Location: 96,46 + Actor22: tplr + Owner: Nod + SubCell: 2 + Facing: 768 + Location: 18,48 + Actor24: tplr + Owner: Nod + SubCell: 5 + Facing: 768 + Location: 18,48 + Actor26: shad + Owner: Nod + SubCell: 3 + Facing: 768 + Location: 21,48 + Actor70: scrinflora11 + Owner: Neutral + Location: 31,48 + Actor73: scrinflora13 + Owner: Neutral + Location: 13,49 + Actor28: rmbc + Owner: Nod + SubCell: 2 + Facing: 768 + Location: 16,49 + Actor30: rmbc + Owner: Nod + SubCell: 5 + Facing: 768 + Location: 16,49 + Actor101: tplr + Owner: Nod + SubCell: 2 + Facing: 768 + Location: 18,50 + Actor46: enli + Owner: Nod + SubCell: 2 + Facing: 768 + Location: 16,51 + Actor72: scrinflora9 + Owner: Neutral + Location: 19,52 + Cave1Wormhole: waypoint + Owner: Neutral + Location: 38,55 + Actor65: scrinflora12 + Owner: Neutral + Location: 40,59 + Cave1Patrol3: waypoint + Owner: Neutral + Location: 35,62 + Cave1Patrol4: waypoint + Owner: Neutral + Location: 25,65 + Actor49: scrinflora7 + Owner: Neutral + Location: 34,66 + Actor62: scrinflora14 + Owner: Neutral + Location: 14,72 + Cave1Patrol5: waypoint + Owner: Neutral + Location: 18,72 + Actor53: scrinflora8 + Owner: Neutral + Location: 94,77 + Actor48: scrinflora5 + Owner: Neutral + Location: 41,80 + Cave1Patrol6: waypoint + Owner: Neutral + Location: 22,81 + Cave5Patrol2: waypoint + Owner: Neutral + Location: 98,83 + Cave7Patrol2: waypoint + Owner: Neutral + Location: 67,85 + Actor55: scrinflora6 + Owner: Neutral + Location: 69,91 + Actor63: scrinflora14 + Owner: Neutral + Location: 52,92 + Actor64: scrinflora12 + Owner: Neutral + Location: 68,92 + Cave8Patrol2: waypoint + Owner: Neutral + Location: 17,95 + Cave8Patrol1: waypoint + Owner: Neutral + Location: 54,95 + Cave8Wormhole: waypoint + Owner: Neutral + Location: 52,96 + Cave7Patrol1: waypoint + Owner: Neutral + Location: 77,97 + Actor54: scrinflora2 + Owner: Neutral + Location: 99,97 + Cave7Patrol3: waypoint + Owner: Neutral + Location: 95,98 + Actor57: scrinflora13 + Owner: Neutral + Location: 42,100 + Cave7Wormhole: waypoint + Owner: Neutral + Location: 83,100 + Actor109: scrinflora3 + Owner: Neutral + Location: 35,106 + Actor110: scrinflora12 + Owner: Neutral + Location: 41,109 + Actor111: fragment + Owner: TibLifeforms + Location: 43,108 + Actor112: fragment + Owner: TibLifeforms + Location: 72,107 + Actor113: scrinflora8 + Owner: Neutral + Location: 78,105 + Actor114: scrinflora10 + Owner: Neutral + Location: 69,107 + Actor115: scrinflora11 + Owner: Neutral + Location: 78,106 + Actor116: fragment + Owner: TibLifeforms + Location: 50,3 + Actor117: scrinflora7 + Owner: Neutral + Location: 90,30 + Actor118: scrinflora12 + Owner: Neutral + Location: 85,23 + Actor119: scrinflora5 + Owner: Neutral + Location: 88,34 + Actor120: fragment + Owner: TibLifeforms + Location: 100,25 + Cave3Patrol3: waypoint + Owner: Neutral + Location: 86,30 + Cave3Patrol4: waypoint + Owner: Neutral + Location: 67,25 + Cave9Wormhole: waypoint + Owner: Neutral + Location: 54,57 + Cave9Patrol1: waypoint + Owner: Neutral + Location: 48,70 + Cave9Patrol2: waypoint + Owner: Neutral + Location: 36,80 + Cave9Patrol3: waypoint + Owner: Neutral + Location: 56,45 + Cave9Patrol4: waypoint + Owner: Neutral + Location: 68,44 + Actor94: scrinflora9 + Owner: Neutral + Location: 78,54 + Actor97: scrinflora2 + Owner: Neutral + Location: 67,60 + Purifier: scrinpurifier + Owner: Neutral + Location: 76,60 + FinalWormhole5: waypoint + Owner: Neutral + Location: 85,61 + HiddenChamberCenter: waypoint + Owner: Neutral + Location: 76,62 + FinalWormhole1: waypoint + Owner: Neutral + Location: 66,63 + Actor108: scrinflora13 + Owner: Neutral + Location: 87,66 + FinalWormhole4: waypoint + Owner: Neutral + Location: 85,67 + Actor122: scrinflora7 + Owner: Neutral + Location: 75,69 + Actor123: scrinflora14 + Owner: Neutral + Location: 78,70 + FinalWormhole2: waypoint + Owner: Neutral + Location: 71,71 + FinalWormhole3: waypoint + Owner: Neutral + Location: 77,73 + Actor126: scrinflora10 + Owner: Neutral + Location: 65,66 + CaveShroud1: caveshroud + Owner: TibLifeforms + Location: 77,64 + Actor96: scrinflora10 + Owner: Neutral + Location: 83,57 + CaveShroud3: caveshroud + Owner: TibLifeforms + Location: 83,58 + CaveShroud4: caveshroud + Owner: TibLifeforms + Location: 80,70 + CaveShroud5: caveshroud + Owner: TibLifeforms + Location: 68,66 + CaveShroud6: caveshroud + Owner: TibLifeforms + Location: 68,61 + CaveShroud2: caveshroud + Owner: TibLifeforms + Location: 74,58 + CaveShroud7: caveshroud + Owner: TibLifeforms + Location: 74,69 + Cave3Patrol1: waypoint + Owner: Neutral + Location: 73,13 + Actor121: camera + Owner: Scrin + Location: 81,60 + Actor124: camera + Owner: Scrin + Location: 71,65 + Actor127: fragment + Owner: TibLifeforms + Location: 38,47 + HiddenChamberEntrance: waypoint + Owner: Neutral + Location: 63,64 + Actor125: gscr + Owner: Scrin + SubCell: 3 + Location: 22,85 + Facing: 0 + Actor128: gscr + Owner: Scrin + SubCell: 3 + Location: 24,79 + Facing: 103 + Actor129: seek + Owner: Scrin + Location: 20,83 + Facing: 856 + Actor130: seek + Owner: Scrin + Facing: 384 + Location: 57,99 + Actor131: brst + Owner: Scrin + SubCell: 3 + Location: 84,33 + Facing: 47 + Actor132: brst + Owner: Scrin + SubCell: 3 + Location: 86,32 + Facing: 182 + Actor133: brst + Owner: Scrin + SubCell: 3 + Location: 80,33 + Facing: 111 + Actor134: brst + Owner: Scrin + SubCell: 3 + Location: 82,32 + Facing: 103 + Actor135: brst + Owner: Scrin + SubCell: 3 + Location: 78,34 + Facing: 0 + Actor136: lace + Owner: Scrin + Location: 108,36 + Facing: 79 + Actor137: lace + Owner: Scrin + Location: 104,33 + Facing: 174 + Actor138: seek + Owner: Scrin + Location: 91,79 + Facing: 602 + Actor139: s1 + Owner: Scrin + SubCell: 3 + Location: 92,77 + Facing: 682 + Actor140: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 54,73 + Actor141: s2 + Owner: Scrin + SubCell: 3 + Location: 51,77 + Facing: 174 + Actor142: s2 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 55,70 + Actor143: seek + Owner: Scrin + Location: 56,75 + Facing: 118 + Actor144: gscr + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 62,41 + Actor145: gscr + Owner: Scrin + SubCell: 3 + Location: 58,51 + Facing: 214 + Actor146: gscr + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 54,7 + Actor147: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 54,9 + Actor148: s1 + Owner: Scrin + SubCell: 3 + Location: 36,103 + Facing: 745 + Actor149: s1 + Owner: Scrin + SubCell: 3 + Location: 38,106 + Facing: 23 + Actor150: gunw + Owner: Scrin + Location: 72,103 + Facing: 840 + Actor151: gscr + Owner: Scrin + SubCell: 3 + Location: 75,105 + Facing: 15 + Actor152: gscr + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 90,100 + Actor153: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 102,66 + Actor154: s1 + Owner: Scrin + SubCell: 3 + Location: 17,68 + Facing: 658 + Actor155: s1 + Owner: Scrin + SubCell: 3 + Location: 16,70 + Facing: 824 + Actor156: stcr + Owner: Scrin + Facing: 384 + Location: 45,8 + Actor157: stcr + Owner: Scrin + Location: 46,68 + Facing: 642 + Actor158: stcr + Owner: Scrin + Location: 78,31 + Facing: 134 + Actor159: corr + Owner: Scrin + Location: 15,71 + Facing: 745 + Actor160: gscr + Owner: Scrin + SubCell: 3 + Location: 106,36 + Facing: 237 + Actor161: gscr + Owner: Scrin + SubCell: 3 + Location: 110,39 + Facing: 618 + Actor162: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 109,35 + Actor163: gscr + Owner: Scrin + SubCell: 3 + Location: 92,81 + Facing: 610 + Actor164: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 60,42 + Actor165: gscr + Owner: Scrin + SubCell: 3 + Location: 61,48 + Facing: 832 + Actor166: gunw + Owner: Scrin + Location: 104,67 + Facing: 118 + Actor167: stcr + Owner: Scrin + Location: 92,48 + Facing: 745 + Actor168: seek + Owner: Scrin + Location: 52,49 + Facing: 729 + Actor169: seek + Owner: Scrin + Location: 52,51 + Facing: 626 + Actor170: gscr + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 58,98 + Actor171: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 79,93 + Actor172: brst + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 92,97 + Actor173: brst + Owner: Scrin + SubCell: 3 + Location: 92,100 + Facing: 214 + Actor174: gunw + Owner: Scrin + Facing: 384 + Location: 72,85 + Actor175: stcr + Owner: Scrin + Location: 91,26 + Facing: 269 + NonBrutalCyborg1: tplr + Owner: Nod + SubCell: 2 + Location: 18,42 + Facing: 768 + NonBrutalCyborg2: enli + Owner: Nod + SubCell: 2 + Location: 16,41 + Facing: 768 + NonBrutalCyborg3: enli + Owner: Nod + SubCell: 5 + Location: 16,51 + Facing: 768 + NonBrutalCyborg4: tplr + Owner: Nod + SubCell: 5 + Location: 18,50 + Facing: 768 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-covenants.yaml, illumination-rules.yaml + +Sequences: illumination-sequences.yaml + +Weapons: ca|weapons/custom/campaign.yaml, illumination-weapons.yaml + +Voices: illumination-voices.yaml diff --git a/mods/ca/missions/main-campaign/ca34-illumination/pip-nod.shp b/mods/ca/missions/main-campaign/ca34-illumination/pip-nod.shp new file mode 100644 index 0000000000..226a2fe4d5 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca34-illumination/pip-nod.shp differ diff --git a/mods/ca/missions/main-campaign/ca35-purification/kane_liquidt.aud b/mods/ca/missions/main-campaign/ca35-purification/kane_liquidt.aud new file mode 100644 index 0000000000..a6e8dd4c3c Binary files /dev/null and b/mods/ca/missions/main-campaign/ca35-purification/kane_liquidt.aud differ diff --git a/mods/ca/missions/main-campaign/ca35-purification/kane_purification.aud b/mods/ca/missions/main-campaign/ca35-purification/kane_purification.aud new file mode 100644 index 0000000000..e94f2ff2bd Binary files /dev/null and b/mods/ca/missions/main-campaign/ca35-purification/kane_purification.aud differ diff --git a/mods/ca/missions/main-campaign/ca35-purification/liquidtibicon.shp b/mods/ca/missions/main-campaign/ca35-purification/liquidtibicon.shp new file mode 100644 index 0000000000..781c0277aa Binary files /dev/null and b/mods/ca/missions/main-campaign/ca35-purification/liquidtibicon.shp differ diff --git a/mods/ca/missions/main-campaign/ca35-purification/map.bin b/mods/ca/missions/main-campaign/ca35-purification/map.bin new file mode 100644 index 0000000000..8b1bf18f69 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca35-purification/map.bin differ diff --git a/mods/ca/missions/main-campaign/ca35-purification/map.png b/mods/ca/missions/main-campaign/ca35-purification/map.png new file mode 100644 index 0000000000..262e6d84e5 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca35-purification/map.png differ diff --git a/mods/ca/missions/main-campaign/ca35-purification/map.yaml b/mods/ca/missions/main-campaign/ca35-purification/map.yaml new file mode 100644 index 0000000000..fc008300f8 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca35-purification/map.yaml @@ -0,0 +1,2024 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 35: Purification + +Author: Darkademic + +Tileset: TEMPERAT + +MapSize: 130,98 + +Bounds: 1,1,128,96 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: Nod, Scrin, ScrinRebels + PlayerReference@Nod: + Name: Nod + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: nod + LockColor: True + Color: FE1100 + LockSpawn: True + LockTeam: True + Allies: ScrinRebels + Enemies: Scrin, Creeps, TibLifeforms + PlayerReference@Scrin: + Name: Scrin + Bot: campaign + Faction: scrin + Color: 7700FF + Allies: TibLifeforms + Enemies: Nod, ScrinRebels, Creeps + PlayerReference@TibLifeforms: + Name: TibLifeforms + NonCombatant: True + Faction: scrin + Color: 00FF00 + Allies: Scrin + Enemies: Nod, Creeps + PlayerReference@ScrinRebels: + Name: ScrinRebels + NonCombatant: True + Faction: scrin + Color: 55E1AE + Allies: Nod + Enemies: Scrin, Creeps + +Actors: + Actor96: gun.nod + Owner: Nod + Location: 109,28 + TurretFacing: 333 + Actor97: gun.nod + Owner: Nod + Location: 100,18 + TurretFacing: 697 + Actor98: gun.nod + Owner: Nod + Location: 112,16 + TurretFacing: 333 + Actor3: brik + Owner: Nod + Location: 49,6 + Actor4: brik + Owner: Nod + Location: 50,6 + Actor5: brik + Owner: Nod + Location: 51,6 + Actor6: brik + Owner: Nod + Location: 52,6 + Actor7: brik + Owner: Nod + Location: 53,6 + Actor8: brik + Owner: Nod + Location: 54,6 + Actor9: brik + Owner: Nod + Location: 55,6 + Actor10: brik + Owner: Nod + Location: 56,6 + Actor11: brik + Owner: Nod + Location: 49,7 + Actor12: brik + Owner: Nod + Location: 55,7 + Actor13: brik + Owner: Nod + Location: 56,7 + Actor14: brik + Owner: Nod + Location: 49,8 + Actor15: brik + Owner: Nod + Location: 50,8 + Actor16: brik + Owner: Nod + Location: 49,9 + Actor17: brik + Owner: Nod + Location: 50,9 + Actor18: proc.td + Owner: Nod + Location: 53,9 + Actor19: brik + Owner: Nod + Location: 70,10 + Actor20: brik + Owner: Nod + Location: 71,10 + Actor21: brik + Owner: Nod + Location: 70,11 + Actor22: brik + Owner: Nod + Location: 71,11 + Actor23: nuk2 + Owner: Nod + Location: 66,12 + Actor24: nuk2 + Owner: Nod + Location: 68,12 + Actor25: brik + Owner: Nod + Location: 70,12 + Actor26: brik + Owner: Nod + Location: 70,13 + Actor27: brik + Owner: Nod + Location: 70,14 + Actor29: nuk2 + Owner: Nod + Location: 66,15 + Actor30: nuk2 + Owner: Nod + Location: 68,15 + Actor31: brik + Owner: Nod + Location: 70,15 + Actor32: brik + Owner: Nod + Location: 49,16 + Actor33: brik + Owner: Nod + Location: 50,16 + Actor34: brik + Owner: Nod + Location: 70,16 + Actor35: brik + Owner: Nod + Location: 49,17 + Actor36: brik + Owner: Nod + Location: 50,17 + Actor38: brik + Owner: Nod + Location: 70,17 + Actor39: brik + Owner: Nod + Location: 49,18 + Actor41: brik + Owner: Nod + Location: 70,18 + Actor42: brik + Owner: Nod + Location: 71,18 + Actor43: n1c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 46,19 + Actor44: brik + Owner: Nod + Location: 49,19 + Actor45: n3c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 51,19 + Actor46: brik + Owner: Nod + Location: 71,19 + Actor47: brik + Owner: Nod + Location: 49,20 + Actor48: obli + Owner: Nod + Location: 70,20 + Actor49: brik + Owner: Nod + Location: 71,20 + Actor50: ltnk + Owner: Nod + Facing: 384 + Location: 44,21 + Actor51: rmbc + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 46,21 + Actor52: n1c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 47,21 + Actor53: brik + Owner: Nod + Location: 49,21 + Actor54: brik + Owner: Nod + Location: 71,21 + Actor55: brik + Owner: Nod + Location: 72,21 + Actor56: rmbc + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 47,22 + Actor57: brik + Owner: Nod + Location: 49,22 + Actor58: rmbc + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 56,22 + Actor59: enli + Owner: Nod + SubCell: 3 + Facing: 515 + Location: 60,22 + Actor60: n3c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 68,22 + Actor61: brik + Owner: Nod + Location: 71,22 + Actor62: brik + Owner: Nod + Location: 72,22 + Actor63: brik + Owner: Nod + Location: 49,23 + Actor64: brik + Owner: Nod + Location: 49,24 + Actor65: obli + Owner: Nod + Location: 52,24 + Actor66: brik + Owner: Nod + Location: 53,24 + Actor67: brik + Owner: Nod + Location: 54,24 + Actor68: brik + Owner: Nod + Location: 60,24 + Actor69: brik + Owner: Nod + Location: 61,24 + Actor70: obli + Owner: Nod + Location: 62,24 + Actor71: brik + Owner: Nod + Location: 66,24 + Actor72: brik + Owner: Nod + Location: 67,24 + Actor73: ltur + Owner: Nod + TurretFacing: 666 + Location: 68,24 + Actor74: brik + Owner: Nod + Location: 49,25 + Actor75: brik + Owner: Nod + Location: 50,25 + Actor76: brik + Owner: Nod + Location: 51,25 + Actor77: brik + Owner: Nod + Location: 52,25 + Actor78: brik + Owner: Nod + Location: 53,25 + Actor79: brik + Owner: Nod + Location: 54,25 + Actor80: brik + Owner: Nod + Location: 60,25 + Actor81: brik + Owner: Nod + Location: 61,25 + Actor82: brik + Owner: Nod + Location: 62,25 + Actor83: brik + Owner: Nod + Location: 63,25 + Actor84: brik + Owner: Nod + Location: 64,25 + Actor85: brik + Owner: Nod + Location: 65,25 + Actor86: brik + Owner: Nod + Location: 66,25 + Actor87: brik + Owner: Nod + Location: 67,25 + Actor88: n1c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 52,26 + Actor89: ltur + Owner: Nod + TurretFacing: 364 + Location: 54,26 + Actor90: rmbc + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 55,26 + Actor91: rmbc + Owner: Nod + SubCell: 3 + Facing: 467 + Location: 59,26 + Actor92: ltur + Owner: Nod + TurretFacing: 555 + Location: 60,26 + Actor93: n1c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 64,26 + Actor94: n1c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 53,27 + Actor95: ltnk + Owner: Nod + Facing: 384 + Location: 64,27 + Actor99: n1c + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 66,27 + Actor100: rmbc + Owner: Nod + SubCell: 3 + Facing: 384 + Location: 104,17 + Actor102: rmbc + Owner: Nod + SubCell: 3 + Location: 106,17 + Facing: 547 + Actor101: rmbc + Owner: Nod + SubCell: 3 + Location: 108,17 + Facing: 467 + Actor103: scrinflora2 + Owner: Neutral + Location: 99,17 + Actor104: scrinflora5 + Owner: Neutral + Location: 122,12 + Actor105: scrinflora3 + Owner: Neutral + Location: 101,3 + Actor106: scrinflora4 + Owner: Neutral + Location: 125,7 + Actor107: scrinflora2 + Owner: Neutral + Location: 125,3 + Actor109: scrinflora7 + Owner: Neutral + Location: 117,18 + Actor110: scrinflora8 + Owner: Neutral + Location: 96,11 + Actor111: scrinflora1 + Owner: Neutral + Location: 98,7 + Actor112: scrinflora12 + Owner: Neutral + Location: 97,8 + Actor113: scrinflora13 + Owner: Neutral + Location: 98,3 + Actor114: scrinflora11 + Owner: Neutral + Location: 99,4 + Actor115: scrinflora11 + Owner: Neutral + Location: 100,19 + Actor116: scrinflora14 + Owner: Neutral + Location: 111,22 + Actor117: scrinflora9 + Owner: Neutral + Location: 111,23 + Actor118: scrinflora11 + Owner: Neutral + Location: 113,20 + Actor119: scrinflora12 + Owner: Neutral + Location: 110,30 + Actor120: nuk2 + Owner: Nod + Location: 68,9 + Actor121: nuk2 + Owner: Nod + Location: 66,9 + LiquidTibFacility: lqtf + Owner: Nod + Location: 60,9 + Actor125: chain + Owner: Nod + Location: 60,8 + Actor127: chain + Owner: Nod + Location: 59,8 + Actor128: chain + Owner: Nod + Location: 59,9 + Actor129: chain + Owner: Nod + Location: 59,10 + Actor130: chain + Owner: Nod + Location: 62,10 + Actor131: chain + Owner: Nod + Location: 62,9 + Actor132: chain + Owner: Nod + Location: 62,8 + Actor133: chain + Owner: Nod + Location: 61,8 + Actor134: chain + Owner: Nod + Location: 59,11 + Actor135: chain + Owner: Nod + Location: 62,11 + Actor136: ttrk + Owner: Nod + Location: 61,12 + Facing: 642 + Actor137: split2 + Owner: Neutral + Location: 41,14 + Actor138: split2 + Owner: Neutral + Location: 42,7 + Actor140: hand + Owner: Nod + Location: 65,19 + Actor141: weap.td + Owner: Nod + Location: 53,17 + Actor143: silo.td + Owner: Nod + Location: 50,7 + Actor144: silo.td + Owner: Nod + Location: 53,7 + Actor145: split2 + Owner: Neutral + Location: 6,35 + Actor146: split2 + Owner: Neutral + Location: 5,30 + Actor147: swal + Owner: Scrin + Location: 63,76 + Actor148: swal + Owner: Scrin + Location: 64,76 + Actor149: swal + Owner: Scrin + Location: 63,77 + Actor150: swal + Owner: Scrin + Location: 64,77 + Actor151: swal + Owner: Scrin + Location: 62,76 + Actor152: swal + Owner: Scrin + Location: 62,75 + Actor153: swal + Owner: Scrin + Location: 62,74 + Actor154: swal + Owner: Scrin + Location: 61,74 + Actor155: swal + Owner: Scrin + Location: 60,74 + Actor156: swal + Owner: Scrin + Location: 61,76 + Actor157: swal + Owner: Scrin + Location: 60,76 + Actor158: swal + Owner: Scrin + Location: 60,75 + Actor159: swal + Owner: Scrin + Location: 80,73 + Actor160: swal + Owner: Scrin + Location: 80,74 + Actor161: swal + Owner: Scrin + Location: 80,75 + Actor162: swal + Owner: Scrin + Location: 81,75 + Actor163: swal + Owner: Scrin + Location: 81,73 + Actor164: swal + Owner: Scrin + Location: 82,73 + Actor165: swal + Owner: Scrin + Location: 82,74 + Actor166: swal + Owner: Scrin + Location: 82,75 + Actor167: swal + Owner: Scrin + Location: 79,75 + Actor168: swal + Owner: Scrin + Location: 78,75 + Actor169: swal + Owner: Scrin + Location: 78,76 + Actor170: swal + Owner: Scrin + Location: 79,76 + Actor171: swal + Owner: Scrin + Location: 52,78 + Actor172: swal + Owner: Scrin + Location: 53,78 + Actor173: swal + Owner: Scrin + Location: 54,78 + Actor174: swal + Owner: Scrin + Location: 52,79 + Actor175: swal + Owner: Scrin + Location: 52,80 + Actor179: swal + Owner: Scrin + Location: 53,80 + Actor180: swal + Owner: Scrin + Location: 54,80 + Actor181: swal + Owner: Scrin + Location: 54,79 + Actor177: swal + Owner: Scrin + Location: 86,79 + Actor178: swal + Owner: Scrin + Location: 87,79 + Actor182: swal + Owner: Scrin + Location: 86,80 + Actor183: swal + Owner: Scrin + Location: 86,81 + Actor184: swal + Owner: Scrin + Location: 87,81 + Actor185: swal + Owner: Scrin + Location: 88,81 + Actor186: swal + Owner: Scrin + Location: 88,79 + Actor187: swal + Owner: Scrin + Location: 88,80 + Actor188: swal + Owner: Scrin + Location: 87,82 + Actor189: swal + Owner: Scrin + Location: 87,83 + Actor190: swal + Owner: Scrin + Location: 53,81 + Actor191: swal + Owner: Scrin + Location: 53,82 + Actor192: swal + Owner: Scrin + Location: 53,83 + Actor193: swal + Owner: Scrin + Location: 52,84 + Actor194: swal + Owner: Scrin + Location: 53,84 + Actor195: swal + Owner: Scrin + Location: 54,84 + Actor197: swal + Owner: Scrin + Location: 52,85 + Actor198: swal + Owner: Scrin + Location: 52,86 + Actor205: swal + Owner: Scrin + Location: 53,86 + Actor206: swal + Owner: Scrin + Location: 54,86 + Actor207: swal + Owner: Scrin + Location: 54,85 + Actor196: swal + Owner: Scrin + Location: 86,84 + Actor199: swal + Owner: Scrin + Location: 87,84 + Actor200: swal + Owner: Scrin + Location: 88,84 + Actor201: swal + Owner: Scrin + Location: 86,85 + Actor202: swal + Owner: Scrin + Location: 86,86 + Actor203: swal + Owner: Scrin + Location: 87,86 + Actor204: swal + Owner: Scrin + Location: 88,86 + Actor208: swal + Owner: Scrin + Location: 88,85 + Actor209: swal + Owner: Scrin + Location: 14,52 + Actor210: swal + Owner: Scrin + Location: 14,53 + Actor211: swal + Owner: Scrin + Location: 14,54 + Actor212: swal + Owner: Scrin + Location: 15,54 + Actor213: swal + Owner: Scrin + Location: 15,52 + Actor214: swal + Owner: Scrin + Location: 16,52 + Actor215: swal + Owner: Scrin + Location: 16,53 + Actor216: swal + Owner: Scrin + Location: 16,54 + Actor217: swal + Owner: Scrin + Location: 13,54 + Actor218: swal + Owner: Scrin + Location: 12,54 + Actor219: swal + Owner: Scrin + Location: 11,54 + Actor220: swal + Owner: Scrin + Location: 11,53 + Actor221: swal + Owner: Scrin + Location: 10,53 + Actor222: swal + Owner: Scrin + Location: 10,54 + Actor223: swal + Owner: Scrin + Location: 10,55 + Actor224: swal + Owner: Scrin + Location: 10,56 + Actor225: swal + Owner: Scrin + Location: 10,57 + Actor226: swal + Owner: Scrin + Location: 11,56 + Actor227: swal + Owner: Scrin + Location: 11,57 + Actor228: swal + Owner: Scrin + Location: 22,51 + Actor229: swal + Owner: Scrin + Location: 22,52 + Actor230: swal + Owner: Scrin + Location: 22,53 + Actor231: swal + Owner: Scrin + Location: 23,53 + Actor232: swal + Owner: Scrin + Location: 23,51 + Actor233: swal + Owner: Scrin + Location: 24,51 + Actor234: swal + Owner: Scrin + Location: 24,52 + Actor235: swal + Owner: Scrin + Location: 24,53 + Actor238: swal + Owner: Scrin + Location: 23,54 + Actor239: swal + Owner: Scrin + Location: 23,55 + Actor240: swal + Owner: Scrin + Location: 23,56 + Actor236: swal + Owner: Scrin + Location: 10,63 + Actor237: swal + Owner: Scrin + Location: 11,63 + Actor241: swal + Owner: Scrin + Location: 10,64 + Actor242: swal + Owner: Scrin + Location: 11,64 + Actor243: swal + Owner: Scrin + Location: 12,64 + Actor244: swal + Owner: Scrin + Location: 13,64 + Actor245: swal + Owner: Scrin + Location: 14,64 + Actor246: swal + Owner: Scrin + Location: 16,64 + Actor247: swal + Owner: Scrin + Location: 15,64 + Actor248: swal + Owner: Scrin + Location: 17,64 + Actor249: swal + Owner: Scrin + Location: 19,64 + Actor250: swal + Owner: Scrin + Location: 21,64 + Actor251: swal + Owner: Scrin + Location: 22,64 + Actor252: swal + Owner: Scrin + Location: 23,64 + Actor253: swal + Owner: Scrin + Location: 18,64 + Actor254: swal + Owner: Scrin + Location: 20,64 + Actor255: swal + Owner: Scrin + Location: 23,63 + Actor256: swal + Owner: Scrin + Location: 23,62 + Actor257: swal + Owner: Scrin + Location: 22,62 + Actor258: swal + Owner: Scrin + Location: 22,61 + Actor259: swal + Owner: Scrin + Location: 22,60 + Actor260: swal + Owner: Scrin + Location: 23,60 + Actor261: swal + Owner: Scrin + Location: 24,60 + Actor262: swal + Owner: Scrin + Location: 24,61 + Actor263: swal + Owner: Scrin + Location: 24,62 + Actor264: swal + Owner: Scrin + Location: 22,55 + Actor265: swal + Owner: Scrin + Location: 22,56 + Actor266: scol + Owner: Scrin + Location: 23,52 + Actor267: scol + Owner: Scrin + Location: 15,53 + Actor268: scol + Owner: Scrin + Location: 23,61 + Actor269: scol + Owner: Scrin + Location: 53,79 + Actor270: scol + Owner: Scrin + Location: 61,75 + Actor271: scol + Owner: Scrin + Location: 81,74 + Actor272: scol + Owner: Scrin + Location: 87,80 + Actor273: scol + Owner: Scrin + Location: 87,85 + Actor274: scol + Owner: Scrin + Location: 53,85 + Actor275: ptur + Owner: Scrin + Location: 82,72 + Actor276: ptur + Owner: Scrin + Location: 87,78 + Actor277: ptur + Owner: Scrin + Location: 60,73 + Actor278: ptur + Owner: Scrin + Location: 53,77 + Actor279: ptur + Owner: Scrin + Location: 15,51 + TurretFacing: 176 + Actor280: ptur + Owner: Scrin + Location: 23,50 + TurretFacing: 959 + Actor281: ptur + Owner: Scrin + Location: 25,61 + TurretFacing: 904 + Actor282: sfac + Owner: Scrin + Location: 84,91 + Actor283: rea2 + Owner: Scrin + Location: 53,89 + Actor284: rea2 + Owner: Scrin + Location: 52,92 + Actor285: rea2 + Owner: Scrin + Location: 55,92 + Actor286: rea2 + Owner: Scrin + Location: 56,89 + Actor287: rea2 + Owner: Scrin + Location: 58,92 + Actor288: shar + Owner: Scrin + Location: 54,82 + Actor289: shar + Owner: Scrin + Location: 65,76 + Actor290: shar + Owner: Scrin + Location: 75,74 + Actor291: shar + Owner: Scrin + Location: 86,83 + Actor292: scrt + Owner: Scrin + Location: 80,89 + GravityStabilizer1: grav + Owner: Scrin + Location: 68,89 + GravityStabilizer2: grav + Owner: Scrin + Location: 72,89 + Portal1: port + Owner: Scrin + Location: 72,77 + Portal2: port + Owner: Scrin + Location: 67,78 + Actor297: nerv + Owner: Scrin + Location: 58,85 + Actor298: sign + Owner: Scrin + Location: 70,93 + Actor299: mani + Owner: Scrin + Location: 64,91 + WarpSphere1: wsph + Owner: Scrin + Location: 76,82 + WarpSphere2: wsph + Owner: Scrin + Location: 71,81 + Actor303: proc.scrin + Owner: Scrin + Location: 61,80 + Actor304: srep + Owner: Scrin + Location: 66,83 + Actor305: silo.scrin + Owner: Scrin + Location: 62,86 + Actor306: silo.scrin + Owner: Scrin + Location: 63,87 + Actor308: rea2 + Owner: Scrin + Location: 66,94 + Actor309: rea2 + Owner: Scrin + Location: 74,94 + Actor310: reac + Owner: Scrin + Location: 83,82 + Actor311: reac + Owner: Scrin + Location: 81,93 + Actor312: port + Owner: Scrin + Location: 18,57 + Actor316: silo.scrin + Owner: Scrin + Location: 18,62 + Actor317: silo.scrin + Owner: Scrin + Location: 20,62 + Actor318: silo.scrin + Owner: Scrin + Location: 19,63 + Actor319: silo.scrin + Owner: Scrin + Location: 17,63 + Actor314: proc.scrin + Owner: Scrin + Location: 13,57 + Actor313: split2 + Owner: Neutral + Location: 124,60 + Actor315: split2 + Owner: Neutral + Location: 115,50 + Actor320: split2 + Owner: Neutral + Location: 111,58 + Actor321: swal + Owner: Scrin + Location: 105,53 + Actor322: swal + Owner: Scrin + Location: 105,54 + Actor323: swal + Owner: Scrin + Location: 104,54 + Actor324: swal + Owner: Scrin + Location: 103,54 + Actor325: swal + Owner: Scrin + Location: 103,53 + Actor326: swal + Owner: Scrin + Location: 103,52 + Actor327: swal + Owner: Scrin + Location: 104,52 + Actor328: swal + Owner: Scrin + Location: 105,52 + Actor329: swal + Owner: Scrin + Location: 103,55 + Actor330: swal + Owner: Scrin + Location: 102,55 + Actor331: swal + Owner: Scrin + Location: 102,56 + Actor332: swal + Owner: Scrin + Location: 102,58 + Actor333: swal + Owner: Scrin + Location: 102,57 + Actor334: swal + Owner: Scrin + Location: 102,59 + Actor335: swal + Owner: Scrin + Location: 102,60 + Actor336: swal + Owner: Scrin + Location: 102,61 + Actor337: swal + Owner: Scrin + Location: 102,62 + Actor338: swal + Owner: Scrin + Location: 103,62 + Actor339: swal + Owner: Scrin + Location: 103,63 + Actor340: swal + Owner: Scrin + Location: 102,63 + Actor341: swal + Owner: Scrin + Location: 103,64 + Actor342: swal + Owner: Scrin + Location: 104,64 + Actor343: swal + Owner: Scrin + Location: 105,64 + Actor344: swal + Owner: Scrin + Location: 106,64 + Actor345: swal + Owner: Scrin + Location: 106,65 + Actor346: swal + Owner: Scrin + Location: 105,65 + Actor347: swal + Owner: Scrin + Location: 107,65 + Actor348: swal + Owner: Scrin + Location: 108,65 + Actor349: swal + Owner: Scrin + Location: 108,66 + Actor350: swal + Owner: Scrin + Location: 108,68 + Actor351: swal + Owner: Scrin + Location: 108,67 + Actor352: swal + Owner: Scrin + Location: 107,68 + Actor353: swal + Owner: Scrin + Location: 107,69 + Actor354: swal + Owner: Scrin + Location: 107,70 + Actor355: swal + Owner: Scrin + Location: 108,70 + Actor356: swal + Owner: Scrin + Location: 109,70 + Actor357: swal + Owner: Scrin + Location: 109,69 + Actor358: swal + Owner: Scrin + Location: 109,68 + Actor359: swal + Owner: Scrin + Location: 121,66 + Actor360: swal + Owner: Scrin + Location: 121,67 + Actor361: swal + Owner: Scrin + Location: 122,67 + Actor362: swal + Owner: Scrin + Location: 122,66 + Actor363: swal + Owner: Scrin + Location: 123,66 + Actor364: swal + Owner: Scrin + Location: 123,67 + Actor365: swal + Owner: Scrin + Location: 124,67 + Actor366: swal + Owner: Scrin + Location: 125,67 + Actor368: swal + Owner: Scrin + Location: 125,69 + Actor369: swal + Owner: Scrin + Location: 124,69 + Actor371: swal + Owner: Scrin + Location: 123,69 + Actor375: swal + Owner: Scrin + Location: 121,71 + Actor376: swal + Owner: Scrin + Location: 120,71 + Actor377: swal + Owner: Scrin + Location: 120,72 + Actor378: swal + Owner: Scrin + Location: 120,73 + Actor379: swal + Owner: Scrin + Location: 121,73 + Actor380: swal + Owner: Scrin + Location: 122,73 + Actor381: swal + Owner: Scrin + Location: 122,72 + Actor382: swal + Owner: Scrin + Location: 122,71 + Actor383: scol + Owner: Scrin + Location: 104,53 + Actor384: scol + Owner: Scrin + Location: 108,69 + Actor385: scol + Owner: Scrin + Location: 121,72 + Actor386: ptur + Owner: Scrin + Location: 119,45 + Actor390: proc.scrin + Owner: Scrin + Location: 117,66 + Actor391: reac + Owner: Scrin + Location: 109,65 + Actor392: reac + Owner: Scrin + Location: 111,65 + Actor393: swal + Owner: Scrin + Location: 128,67 + Actor394: swal + Owner: Scrin + Location: 128,68 + Actor395: swal + Owner: Scrin + Location: 128,69 + Actor396: swal + Owner: Scrin + Location: 126,69 + Actor397: swal + Owner: Scrin + Location: 127,69 + Actor398: swal + Owner: Scrin + Location: 127,67 + Actor399: swal + Owner: Scrin + Location: 126,67 + Actor387: swal + Owner: Scrin + Location: 123,68 + Actor388: silo.scrin + Owner: Scrin + Location: 127,68 + Actor389: silo.scrin + Owner: Scrin + Location: 126,68 + Actor400: silo.scrin + Owner: Scrin + Location: 125,68 + Actor401: silo.scrin + Owner: Scrin + Location: 124,68 + Actor402: swal + Owner: Scrin + Location: 124,70 + Actor403: swal + Owner: Scrin + Location: 123,70 + Actor404: swal + Owner: Scrin + Location: 122,70 + Actor405: scrinflora3 + Owner: Neutral + Location: 31,41 + Actor406: scrinflora1 + Owner: Neutral + Location: 30,40 + Actor407: scrinflora7 + Owner: Neutral + Location: 40,46 + Actor408: scrinflora5 + Owner: Neutral + Location: 33,32 + Actor409: scrinflora1 + Owner: Neutral + Location: 54,45 + Actor410: scrinflora8 + Owner: Neutral + Location: 58,37 + Actor411: scrinflora2 + Owner: Neutral + Location: 73,37 + Actor412: scrinflora5 + Owner: Neutral + Location: 78,46 + Actor413: scrinflora12 + Owner: Neutral + Location: 80,45 + Actor414: scrinflora14 + Owner: Neutral + Location: 57,36 + Actor415: scrinflora10 + Owner: Neutral + Location: 60,37 + Actor416: scrinflora11 + Owner: Neutral + Location: 33,41 + Actor417: scrinflora13 + Owner: Neutral + Location: 42,45 + Actor418: scrinflora11 + Owner: Neutral + Location: 39,46 + Actor419: scrinflora12 + Owner: Neutral + Location: 45,48 + Actor420: scrinflora4 + Owner: Neutral + Location: 28,24 + Actor421: scrinflora1 + Owner: Neutral + Location: 29,22 + Actor422: scrinflora2 + Owner: Neutral + Location: 28,8 + Actor423: scrinflora13 + Owner: Neutral + Location: 29,7 + Actor424: scrinflora11 + Owner: Neutral + Location: 27,22 + Actor425: scrinflora14 + Owner: Neutral + Location: 27,24 + Actor426: scrinflora12 + Owner: Neutral + Location: 32,32 + Actor427: scrinflora12 + Owner: Neutral + Location: 22,8 + Actor428: scrinflora11 + Owner: Neutral + Location: 21,9 + Actor429: scrinflora9 + Owner: Neutral + Location: 23,7 + Actor430: scrinflora14 + Owner: Neutral + Location: 74,38 + Actor431: scrinflora7 + Owner: Neutral + Location: 94,34 + Actor437: scrinflora14 + Owner: Neutral + Location: 92,35 + Actor432: scrinflora2 + Owner: Neutral + Location: 96,33 + Actor433: scrinflora13 + Owner: Neutral + Location: 97,32 + Actor434: scrinflora10 + Owner: Neutral + Location: 93,34 + Actor435: scrinflora11 + Owner: Neutral + Location: 93,35 + Actor436: scrinflora9 + Owner: Neutral + Location: 91,35 + Actor438: scrinflora9 + Owner: Neutral + Location: 97,33 + Actor439: scrinflora4 + Owner: Neutral + Location: 109,45 + Actor440: scrinflora1 + Owner: Neutral + Location: 112,44 + Actor441: scrinflora3 + Owner: Neutral + Location: 125,42 + Actor442: scrinflora8 + Owner: Neutral + Location: 18,43 + Actor443: scrinflora7 + Owner: Neutral + Location: 3,20 + Actor444: scrinflora1 + Owner: Neutral + Location: 11,24 + Actor445: scrinflora10 + Owner: Neutral + Location: 4,21 + Actor446: scrinflora13 + Owner: Neutral + Location: 2,21 + Actor447: split2 + Owner: Neutral + Location: 34,92 + Actor448: split2 + Owner: Neutral + Location: 38,87 + Actor449: split2 + Owner: Neutral + Location: 38,81 + Actor450: split2 + Owner: Neutral + Location: 45,85 + Actor451: split2 + Owner: Neutral + Location: 43,92 + Actor452: afac + Owner: Nod + Location: 60,15 + Actor453: hq + Owner: Nod + Location: 57,15 + Actor454: split2 + Owner: Neutral + Location: 5,55 + Actor455: split2 + Owner: Neutral + Location: 3,61 + Actor456: split2 + Owner: Neutral + Location: 4,68 + Actor457: scrinflora3 + Owner: Neutral + Location: 69,64 + Actor458: scrinflora4 + Owner: Neutral + Location: 79,59 + Actor459: scrinflora1 + Owner: Neutral + Location: 61,55 + Actor460: scrinflora2 + Owner: Neutral + Location: 68,63 + Actor461: scrinflora14 + Owner: Neutral + Location: 71,63 + Actor462: scrinflora11 + Owner: Neutral + Location: 71,64 + Actor463: scrinflora10 + Owner: Neutral + Location: 67,63 + Actor464: scrinflora13 + Owner: Neutral + Location: 78,59 + Actor465: scrinflora11 + Owner: Neutral + Location: 80,58 + Actor466: scrinflora9 + Owner: Neutral + Location: 81,60 + Actor467: scrinflora11 + Owner: Neutral + Location: 86,61 + Actor468: scrinflora1 + Owner: Neutral + Location: 100,62 + Actor469: scrinflora7 + Owner: Neutral + Location: 101,79 + Actor470: scrinflora8 + Owner: Neutral + Location: 51,67 + Actor471: scrinflora14 + Owner: Neutral + Location: 50,66 + Actor472: scrinflora12 + Owner: Neutral + Location: 67,72 + Actor473: scrinflora13 + Owner: Neutral + Location: 88,62 + Actor474: scrinflora13 + Owner: Neutral + Location: 100,80 + Actor475: scrinflora10 + Owner: Neutral + Location: 101,81 + Actor476: scrinflora9 + Owner: Neutral + Location: 101,80 + Actor477: scrinflora11 + Owner: Neutral + Location: 103,78 + Actor478: scrinflora2 + Owner: Neutral + Location: 99,82 + Actor479: scrinflora6 + Owner: Neutral + Location: 106,84 + Actor480: scrinflora14 + Owner: Neutral + Location: 12,88 + Actor481: scrinflora2 + Owner: Neutral + Location: 7,79 + Actor482: scrinflora4 + Owner: Neutral + Location: 8,82 + Actor483: scrinflora8 + Owner: Neutral + Location: 16,91 + Actor484: scrinflora3 + Owner: Neutral + Location: 25,90 + Actor485: scrinflora1 + Owner: Neutral + Location: 17,89 + Actor486: scrinflora12 + Owner: Neutral + Location: 17,87 + Actor487: scrinflora13 + Owner: Neutral + Location: 18,88 + Actor488: scrinflora8 + Owner: Neutral + Location: 11,70 + Actor489: scrinflora4 + Owner: Neutral + Location: 35,65 + Actor490: scrinflora14 + Owner: Neutral + Location: 34,65 + Actor491: scrinflora13 + Owner: Neutral + Location: 32,72 + Actor492: split2 + Owner: Neutral + Location: 51,51 + ScrinAttack1a: waypoint + Owner: Neutral + Location: 57,66 + ScrinAttack3a: waypoint + Owner: Neutral + Location: 84,67 + ScrinAttack1b: waypoint + Owner: Neutral + Location: 32,46 + ScrinAttack1c: waypoint + Owner: Neutral + Location: 19,16 + ScrinAttack1d: waypoint + Owner: Neutral + Location: 43,18 + ScrinAttack2: waypoint + Owner: Neutral + Location: 50,32 + ScrinAttack3b: waypoint + Owner: Neutral + Location: 77,50 + ScrinAttack3c: waypoint + Owner: Neutral + Location: 65,32 + ScrinAttack4a: waypoint + Owner: Neutral + Location: 102,42 + ScrinAttack4b: waypoint + Owner: Neutral + Location: 97,28 + Actor493: swal + Owner: Scrin + Location: 69,65 + Actor494: swal + Owner: Scrin + Location: 69,66 + Actor495: swal + Owner: Scrin + Location: 69,67 + Actor496: swal + Owner: Scrin + Location: 71,67 + Actor497: swal + Owner: Scrin + Location: 70,65 + Actor498: swal + Owner: Scrin + Location: 71,65 + Actor499: swal + Owner: Scrin + Location: 70,67 + Actor500: swal + Owner: Scrin + Location: 71,66 + Actor501: swal + Owner: Scrin + Location: 72,66 + Actor502: swal + Owner: Scrin + Location: 73,66 + Actor503: swal + Owner: Scrin + Location: 73,65 + Actor504: swal + Owner: Scrin + Location: 73,67 + Actor505: swal + Owner: Scrin + Location: 75,67 + Actor506: swal + Owner: Scrin + Location: 74,67 + Actor507: swal + Owner: Scrin + Location: 74,65 + Actor508: swal + Owner: Scrin + Location: 75,65 + Actor509: swal + Owner: Scrin + Location: 75,66 + Actor510: scol + Owner: Scrin + Location: 70,66 + Actor511: scol + Owner: Scrin + Location: 74,66 + Actor512: rtpd + Owner: Scrin + Location: 41,90 + Facing: 198 + Actor513: tpod + Owner: Scrin + Location: 57,77 + Facing: 126 + Actor514: tpod + Owner: Scrin + Location: 86,75 + Facing: 880 + Actor515: ruin + Owner: Scrin + Location: 76,75 + Facing: 911 + Actor516: ruin + Owner: Scrin + Location: 62,77 + Facing: 95 + Actor517: pac + Owner: Scrin + Location: 81,81 + Facing: 904 + HardOnlyCarrier1: pac + Owner: Scrin + Location: 58,82 + Facing: 103 + Actor519: devo + Owner: Scrin + Location: 113,70 + Facing: 0 + Actor520: devo + Owner: Scrin + Facing: 0 + Location: 114,71 + Actor521: devo + Owner: Scrin + Facing: 0 + Location: 115,70 + Actor522: atmz + Owner: Scrin + Location: 16,56 + Facing: 904 + Actor523: corr + Owner: Scrin + Location: 26,58 + Facing: 904 + Actor524: corr + Owner: Scrin + Location: 27,61 + Facing: 935 + Actor525: gunw + Owner: Scrin + Facing: 384 + Location: 118,71 + Actor526: gunw + Owner: Scrin + Location: 77,78 + Facing: 904 + Actor527: gunw + Owner: Scrin + Location: 71,76 + Facing: 0 + Actor528: gunw + Owner: Scrin + Location: 56,83 + Facing: 118 + Actor529: intl.ai + Owner: Scrin + Location: 81,84 + Facing: 864 + Actor530: intl.ai + Owner: Scrin + Location: 91,79 + Facing: 983 + Actor531: intl.ai + Owner: Scrin + Location: 53,75 + Facing: 126 + InitAttacker1: seek + Owner: Scrin + Location: 42,37 + Facing: 927 + InitAttacker2: seek + Owner: Scrin + Location: 45,37 + Facing: 800 + InitAttacker4: seek + Owner: Scrin + Location: 41,40 + Facing: 919 + InitAttacker3: seek + Owner: Scrin + Location: 38,40 + Facing: 927 + InitAttacker5: lace + Owner: Scrin + Location: 68,42 + Facing: 23 + InitAttacker6: lace + Owner: Scrin + Location: 70,40 + Facing: 79 + InitAttacker7: lace + Owner: Scrin + Location: 71,44 + Facing: 79 + Actor539: intl + Owner: Scrin + Location: 101,35 + Facing: 1007 + Actor540: shrw + Owner: Scrin + Location: 93,30 + Facing: 198 + Actor541: seek + Owner: Scrin + Facing: 384 + Location: 92,26 + Actor542: s1 + Owner: Scrin + SubCell: 3 + Facing: 384 + Location: 93,27 + Actor543: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 91,26 + Actor544: s1 + Owner: Scrin + SubCell: 3 + Location: 93,31 + Facing: 277 + Actor545: s3 + Owner: Scrin + SubCell: 3 + Location: 78,71 + Facing: 0 + Actor546: s3 + Owner: Scrin + SubCell: 3 + Facing: 0 + Location: 65,77 + Actor547: s3 + Owner: Scrin + SubCell: 3 + Facing: 0 + Location: 65,73 + Actor548: s3 + Owner: Scrin + SubCell: 3 + Facing: 0 + Location: 83,86 + Actor549: s3 + Owner: Scrin + SubCell: 3 + Facing: 0 + Location: 65,87 + Actor550: s3 + Owner: Scrin + SubCell: 3 + Facing: 0 + Location: 78,87 + Actor551: s3 + Owner: Scrin + SubCell: 3 + Facing: 0 + Location: 93,86 + Actor552: s1 + Owner: Scrin + SubCell: 3 + Location: 58,73 + Facing: 214 + Actor553: s1 + Owner: Scrin + SubCell: 3 + Location: 63,71 + Facing: 39 + Actor554: s1 + Owner: Scrin + SubCell: 3 + Location: 69,72 + Facing: 55 + Actor555: s1 + Owner: Scrin + SubCell: 3 + Location: 93,81 + Facing: 872 + Actor556: tpod + Owner: Scrin + Location: 72,70 + Facing: 0 + Actor557: devo + Owner: Scrin + Location: 90,81 + Facing: 943 + Actor558: devo + Owner: Scrin + Location: 63,73 + Facing: 39 + Actor559: ptur + Owner: Scrin + Location: 62,44 + TurretFacing: 904 + Actor560: shar + Owner: Scrin + Location: 61,47 + Actor561: shar + Owner: Scrin + Location: 121,70 + Actor562: shar + Owner: Scrin + Location: 13,55 + Actor563: shar + Owner: Scrin + Location: 15,63 + Actor564: shar + Owner: Scrin + Location: 113,65 + Actor565: shar + Owner: Scrin + Location: 126,54 + PlayerStart: waypoint + Owner: Neutral + Location: 61,17 + CaveEntrance: waypoint + Owner: Neutral + Location: 119,6 + Actor566: flare + Owner: Nod + Location: 122,6 + Actor567: flare + Owner: Nod + Location: 115,5 + Actor568: smallcamera + Owner: Nod + Location: 118,6 + LiquidTibPickup1: waypoint + Owner: Neutral + Location: 60,11 + LiquidTibPickup2: waypoint + Owner: Neutral + Location: 61,11 + LiquidTibDropOff2: waypoint + Owner: Neutral + Location: 119,7 + LiquidTibDropOff1: waypoint + Owner: Neutral + Location: 120,6 + LiquidTibDropOff3: waypoint + Owner: Neutral + Location: 120,7 + Actor569: rea2 + Owner: Scrin + Location: 84,94 + Actor570: rea2 + Owner: Scrin + Location: 63,94 + Actor571: rea2 + Owner: Scrin + Location: 77,94 + Actor572: rea2 + Owner: Scrin + Location: 59,89 + Actor574: silo.scrin + Owner: Scrin + Location: 61,87 + RiftGenerator: rfgn + Owner: Scrin + Location: 77,91 + Actor573: pac + Owner: Scrin + Location: 63,79 + Facing: 166 + Actor575: pac + Owner: Scrin + Location: 76,78 + Facing: 864 + NormalHardOnlyCarrier1: pac + Owner: Scrin + Location: 47,88 + Facing: 174 + Actor577: pac + Owner: Scrin + Location: 90,88 + Facing: 888 + NormalHardOnlyCarrier2: pac + Owner: Scrin + Location: 49,91 + Facing: 174 + Actor579: shrw + Owner: Scrin + Location: 53,95 + Facing: 111 + Actor580: shrw + Owner: Scrin + Location: 63,89 + Facing: 182 + Actor581: split2 + Owner: Neutral + Location: 124,23 + Actor582: split2 + Owner: Neutral + Location: 118,25 + Actor583: split2 + Owner: Neutral + Location: 15,3 + Actor584: split2 + Owner: Neutral + Location: 8,7 + ScrinReinforcementsSpawn2: waypoint + Owner: Neutral + Location: 21,92 + ScrinReinforcementsSpawn4: waypoint + Owner: Neutral + Location: 100,93 + ScrinReinforcementsSpawn1: waypoint + Owner: Neutral + Location: 11,79 + ScrinReinforcementsSpawn6: waypoint + Owner: Neutral + Location: 120,78 + ScrinReinforcementsSpawn7: waypoint + Owner: Neutral + Location: 125,34 + ScrinReinforcementsSpawn3: waypoint + Owner: Neutral + Location: 23,79 + ScrinReinforcementsSpawn5: waypoint + Owner: Neutral + Location: 105,76 + ScrinReinforcementsSpawn8: waypoint + Owner: Neutral + Location: 9,48 + IslandGrav1: grav + Owner: Scrin + Location: 122,94 + IslandGrav2: grav + Owner: Scrin + Location: 126,93 + Actor595: reac + Owner: Scrin + Location: 61,94 + RebelSpawnPoint1: waypoint + Owner: Neutral + Location: 46,30 + RebelSpawnPoint2: waypoint + Owner: Neutral + Location: 102,29 + ScrinBaseCenter: waypoint + Owner: Neutral + Location: 70,85 + ScrinHiddenSpawn3: waypoint + Owner: Neutral + Location: 118,96 + ScrinHiddenSpawn5: waypoint + Owner: Neutral + Location: 128,89 + ScrinHiddenSpawn4: waypoint + Owner: Neutral + Location: 125,96 + ScrinHiddenSpawn2: waypoint + Owner: Neutral + Location: 2,96 + ScrinHiddenSpawn1: waypoint + Owner: Neutral + Location: 1,92 + ScrinHiddenSpawn6: waypoint + Owner: Neutral + Location: 128,86 + Actor603: camera + Owner: Scrin + Location: 98,30 + Actor604: camera + Owner: Scrin + Location: 65,24 + Actor605: camera + Owner: Scrin + Location: 50,24 + Actor606: camera + Owner: Scrin + Location: 68,34 + Actor607: camera + Owner: Scrin + Location: 41,27 + Actor608: camera + Owner: Scrin + Location: 50,12 + Actor609: camera + Owner: Scrin + Location: 26,13 + Actor610: camera + Owner: Scrin + Location: 22,28 + Actor611: camera + Owner: Scrin + Location: 116,39 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, purification-rules.yaml + +Sequences: purification-sequences.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/main-campaign/ca35-purification/n_liquidtibdelivered.aud b/mods/ca/missions/main-campaign/ca35-purification/n_liquidtibdelivered.aud new file mode 100644 index 0000000000..626d05ddf6 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca35-purification/n_liquidtibdelivered.aud differ diff --git a/mods/ca/missions/main-campaign/ca35-purification/n_liquidtibready.aud b/mods/ca/missions/main-campaign/ca35-purification/n_liquidtibready.aud new file mode 100644 index 0000000000..08c3e60d75 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca35-purification/n_liquidtibready.aud differ diff --git a/mods/ca/missions/main-campaign/ca35-purification/purification-rules.yaml b/mods/ca/missions/main-campaign/ca35-purification/purification-rules.yaml new file mode 100644 index 0000000000..97bfeddf0c --- /dev/null +++ b/mods/ca/missions/main-campaign/ca35-purification/purification-rules.yaml @@ -0,0 +1,229 @@ +^Palettes: + PaletteFromFile@terrain-temperat: + Filename: alien.pal + TintPostProcessEffect: + Red: 1.3 + Green: 1 + Blue: 1.5 + Ambient: 0.5 + FlashPostProcessEffect@PURIFICATION: + Type: Purification + +^BaseWorld: + TerrainLighting: + +World: + LuaScript: + Scripts: campaign.lua, purification.lua + MissionData: + Briefing: The final phase of our mission here begins. I have always known that Tiberium was the key to unlocking humanity's potential, however my understanding was incomplete. The green crystal now so familiar to us is in fact a corrupted abomination.\n\nMillennia ago, the Scrin discovered Tiberium on this world. It heralded a glorious age of progress and peace, as wars over resources and territory faded away. However this earlier form of the crystal did not have the same propensity to grow and spread, and scarcity threatened to undo the progress that had been made.\n\nExperiments to increase the rate at which Tiberium propagates were conducted, and were ultimately successful, but the result was not without its drawbacks. The crystal grew much more rapidly, but emitted a type of radiation that led to changes in Scrin physiology. Exposure led to dependence and addiction.\n\nThere were those who felt the risks were too great, however their voices were silenced. The green crystal allowed Scrin civilization to progress, but there were those who saw its potential as a tool of control. To be deprived of Tiberium would now often mean death to the majority of the Scrin, so those who controlled its production had great power. Eventually, a supreme leader rose to power - the Overlord - who has ruled the Scrin ever since.\n\nPockets of resistance emerged and secret experiments were undertaken to find ways to eliminate the negative effects of the green crystal, however they were mercilessly hunted down. Seeing the futility of their efforts, they decided to hide their research in the hope that one day it would be rediscovered and the Scrin could be liberated.\n\nData storage devices were hastily sent to planets that would be potential future targets for Scrin harvesting operations, along with small samples of Tiberium. A device had been created which could purify Tiberium, but it was completed too late and the rebels did not have sufficient crystal to power it.\n\nAs the Overlord's forces closed in, the rebels hid the device and accepted their fate.\n\nSo we do not come here as conquerors commander, but as saviours. The Overlord and his sycophants have ruled the Scrin for thousands of years, using the population's dependence on Tiberium, and the threat of its supply being interrupted, as an excuse for unlimited control. We now have the means of ending this tyranny.\n\nWe must bring the device to full power. Once enough Scrin have their dependence on Tiberium broken, and the truth has been revealed to them, the choice between freedom and servitude will finally be theirs to make. + MapOptions: + ShortGameCheckboxEnabled: False + MusicPlaylist: + StartingMusic: elusive + +Player: + PlayerResources: + DefaultCash: 6000 + +ACOL: + Buildable: + Prerequisites: obliortmpl, anyradar, ~infantry.nod, ~!tmpp + +TPLR: + Buildable: + Prerequisites: obliortmpl, anyradar, ~infantry.nod, ~tmpp + +BH: + Buildable: + Prerequisites: anyradar, ~infantry.nod, ~techlevel.medium + +LTNK: + Buildable: + Prerequisites: ~vehicles.nod, ~!lastnk.upgrade + +LTNK.Laser: + Buildable: + Prerequisites: ~vehicles.nod, ~lastnk.upgrade + +MTNK: + Buildable: + Prerequisites: ~!bdrone.upgrade, ~vehicles.gdi, ~techlevel.low + +MTNK.Laser: + Inherits@CAMPAIGNDISABLED: ^Disabled + +FTNK: + Buildable: + Prerequisites: anyradar, ~vehicles.nod + +HFTK: + Buildable: + Prerequisites: anyradar, ~vehicles.nod + +WTNK: + Buildable: + Prerequisites: anyradar, ~vehicles.nod + +MLRS: + Buildable: + Prerequisites: tmpl, ~vehicles.nod + +SPEC: + Buildable: + Prerequisites: tmpl, ~vehicles.nod + +VENM: + Buildable: + Prerequisites: ~aircraft.nod + +APC2: + Inherits@CAMPAIGNDISABLED: ^Disabled + +AIRS: + Inherits@CAMPAIGNDISABLED: ^Disabled + +WEAP.TD: + Buildable: + Prerequisites: anyrefinery, ~structures.td + +blacknapalm.upgrade: + Buildable: + Prerequisites: tmpl + +quantum.upgrade: + Buildable: + Prerequisites: tmpl + +hstk.upgrade: + Buildable: + Prerequisites: tmpl + +LQTF: + Inherits: ^Building + Inherits@SHAPE: ^2x2Shape + RenderSprites: + Image: bio + Selectable: + Bounds: 2048, 2048 + Building: + Footprint: xx xx + Dimensions: 2,2 + Tooltip: + Name: Liquid Tiberium Processing Plant + Health: + HP: 150000 + Armor: + Type: Wood + RevealsShroud: + MinRange: 4c0 + Range: 5c0 + RevealGeneratedShroud: False + RevealsShroud@GAPGEN: + Range: 4c0 + -Sellable: + -SpawnActorsOnSellCA: + -SpawnActorOnDeath: + CaptureManager: + -BeingCapturedCondition: + AmmoPool@LIQUIDTIB: + Ammo: 10 + InitialAmmo: 0 + WithAmmoPipsDecoration@LIQUIDTIB: + PipCount: 10 + RequiresSelection: false + Position: BottomLeft + Margin: 4, 3 + FireWarheadsOnDeath: + Weapon: UnitExplodeToxinTruck + EmptyWeapon: UnitExplodeToxinTruck + +TTRK: + Inherits@SELECTION: ^SelectableSupportUnit + Buildable: + Prerequisites: vehicles.nod + Description: Tanker for carrying liquid Tiberium + Valued: + Cost: 1000 + TooltipExtras: + Weaknesses: • Very weak armor\n• Extremely volatile when full + -Attributes: + Tooltip: + Name: Liquid Tiberium Tanker + -KillsSelf: + -AttackFrontal: + -Armament@PRIMARY: + -GrantConditionOnAttack: + -GrantConditionOnDeploy: + -VoiceAnnouncement: + -ExternalCondition@PRODUCED: + Voiced: + VoiceSet: VehicleVoice + Mobile: + Speed: 49 + Voice: Action + Passenger: + Voice: Action + AmmoPool@LIQUIDTIB: + Ammo: 1 + InitialAmmo: 0 + AmmoCondition: ammo + WithAmmoPipsDecoration@LIQUIDTIB: + PipCount: 1 + RequiresSelection: false + Position: BottomLeft + Margin: 4, 3 + FireWarheadsOnDeath: + RequiresCondition: ammo + FireWarheadsOnDeath@EMPTY: + Weapon: UnitExplodeSmall + EmptyWeapon: UnitExplodeSmall + RequiresCondition: !ammo + MustBeDestroyed: + RequiredForShortGame: true + Targetable@TTRK: + TargetTypes: TibTruck + +NERV: + DetonateWeaponPower@BUZZERSWARMAI: + Prerequisites: nerv + ChargeInterval: 7500 + DetonateWeaponPower@STORMSPIKE: + Prerequisites: nerv + ChargeInterval: 8250 + +# Hunt() requires only 1 AttackBase +DEVA: + -AttackFrontalCharged: + -Armament@PRIMARYUPG: + -AmbientSound@CHARGE: + -WithIdleOverlay@CHARGE1: + -WithIdleOverlay@CHARGE2: + -WithIdleOverlay@CHARGE3: + +WORMHOLE: + Inherits@INF: ^ProducesInfantry + Inherits@VEH: ^ProducesVehicles + -TeleportNetwork: + Health: + HP: 400000 + ChangesHealth: + PercentageStep: 1 + Delay: 25 + StartIfBelow: 101 + DamageCooldown: 0 + RequiresCondition: !regen-disabled + ExternalCondition@NOREGEN: + Condition: regen-disabled + ExternalCondition@FIX1: + Condition: forceshield + ExternalCondition@FIX2: + Condition: being-warped + MustBeDestroyed: + RequiredForShortGame: true + +# Removing TeleportNetwork from Wormhole above causes exception as no actors with TeleportNetwork are defined +dummyteleport: + Inherits: ^InvisibleDummy + TeleportNetwork: + Type: Wormhole diff --git a/mods/ca/missions/main-campaign/ca35-purification/purification-sequences.yaml b/mods/ca/missions/main-campaign/ca35-purification/purification-sequences.yaml new file mode 100644 index 0000000000..60d3b07bba --- /dev/null +++ b/mods/ca/missions/main-campaign/ca35-purification/purification-sequences.yaml @@ -0,0 +1,3 @@ +liquidtib: + icon: + Filename: ca|missions/main-campaign/ca35-purification/liquidtibicon.shp diff --git a/mods/ca/missions/main-campaign/ca35-purification/purification.lua b/mods/ca/missions/main-campaign/ca35-purification/purification.lua new file mode 100644 index 0000000000..016aa5f683 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca35-purification/purification.lua @@ -0,0 +1,433 @@ +MissionDir = "ca|missions/main-campaign/ca35-purification" + +UnitBuildTimeMultipliers = { + easy = 0.8, + normal = 0.5, + hard = 0.33, + vhard = 0.25, + brutal = 0.2 +} + +LiquidTibCooldown = DateTime.Minutes(5) + +RiftEnabledTime = { + easy = DateTime.Seconds((60 * 45) + 17), + normal = DateTime.Seconds((60 * 30) + 17), + hard = DateTime.Seconds((60 * 15) + 17), + vhard = DateTime.Seconds((60 * 15) + 17), + brutal = DateTime.Seconds((60 * 15) + 17) +} + +ScrinReinforcementSpawns = { + ScrinReinforcementsSpawn1, ScrinReinforcementsSpawn2, ScrinReinforcementsSpawn3, ScrinReinforcementsSpawn4, ScrinReinforcementsSpawn5, ScrinReinforcementsSpawn6, ScrinReinforcementsSpawn7, ScrinReinforcementsSpawn8 +} + +AdjustedScrinCompositions = AdjustCompositionsForDifficulty(UnitCompositions.Scrin) + +Squads = { + ScrinMain = { + InitTimeAdjustment = -DateTime.Minutes(10), + Delay = AdjustDelayForDifficulty(DateTime.Minutes(1)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 25, Max = 55 }), + FollowLeader = true, + ProducerActors = { Infantry = { Portal1, Portal2 }, Vehicles = { WarpSphere1, WarpSphere2 }, Aircraft = { GravityStabilizer1, GravityStabilizer2 } }, + ProducerTypes = { Infantry = { "port", "wormhole" }, Vehicles = { "wsph", "wormhole" }, Aircraft = { "grav", "hiddenspawner" } }, + Compositions = AdjustedScrinCompositions, + AttackPaths = { + { ScrinAttack1a.Location, ScrinAttack1b.Location, ScrinAttack1c.Location, ScrinAttack1d.Location }, + { ScrinAttack1a.Location, ScrinAttack2.Location }, + { ScrinAttack3a.Location, ScrinAttack3b.Location, ScrinAttack3c.Location }, + { ScrinAttack3a.Location, ScrinAttack4a.Location, ScrinAttack4b.Location, ScrinAttack3c.Location }, + }, + }, + ScrinSecondary = { + InitTimeAdjustment = -DateTime.Minutes(10), + Delay = AdjustDelayForDifficulty(DateTime.Seconds(170)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 15, Max = 25 }), + FollowLeader = true, + ProducerActors = { Infantry = { Portal1, Portal2 }, Vehicles = { WarpSphere1, WarpSphere2 }, Aircraft = { GravityStabilizer1, GravityStabilizer2 } }, + ProducerTypes = { Infantry = { "port", "wormhole" }, Vehicles = { "wsph", "wormhole" }, Aircraft = { "grav", "hiddenspawner" } }, + Compositions = AdjustedScrinCompositions, + AttackPaths = { + { ScrinAttack1a.Location, ScrinAttack1b.Location, ScrinAttack1c.Location, ScrinAttack1d.Location }, + { ScrinAttack1a.Location, ScrinAttack2.Location }, + { ScrinAttack3a.Location, ScrinAttack3b.Location, ScrinAttack3c.Location }, + { ScrinAttack3a.Location, ScrinAttack4a.Location, ScrinAttack4b.Location, ScrinAttack3c.Location }, + }, + }, + ScrinAir = { + Delay = AdjustAirDelayForDifficulty(DateTime.Minutes(5)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 12, Max = 12 }), + Compositions = AirCompositions.Scrin + }, + ScrinRebelsMain = { + AttackValuePerSecond = { Min = 70, Max = 70 }, + FollowLeader = true, + ProducerTypes = { Infantry = { "wormhole" }, Vehicles = { "wormhole" }, Aircraft = { "grav" } }, + Compositions = AdjustedScrinCompositions, + AttackPaths = { + { ScrinBaseCenter.Location }, + }, + }, + TibTruckKillers = { + Delay = AdjustAirDelayForDifficulty(DateTime.Minutes(5)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 12, Max = 12 }), + Compositions = { + { Aircraft = { "stmr", "stmr", "stmr" } }, + { Aircraft = { "torm", "torm", "torm" } }, + { Aircraft = { "enrv", "enrv" } }, + } + } +} + +SetupPlayers = function() + Nod = Player.GetPlayer("Nod") + Scrin = Player.GetPlayer("Scrin") + ScrinRebels = Player.GetPlayer("ScrinRebels") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = { Nod } + MissionEnemies = { Scrin } +end + +WorldLoaded = function() + SetupPlayers() + + ShipmentsComplete = 0 + TimerTicks = DateTime.Seconds(60) + Camera.Position = PlayerStart.CenterPosition + + InitObjectives(Nod) + AdjustPlayerStartingCashForDifficulty() + InitScrin() + + ObjectiveChargeDevice = Nod.AddObjective("Bring the device to full power.") + ObjectiveProtectLiquidTib = Nod.AddObjective("Protect liquid Tiberium processing plant.") + + UpdateMissionText() + + if Difficulty == "easy" then + NormalHardOnlyCarrier1.Destroy() + NormalHardOnlyCarrier2.Destroy() + end + + if IsNormalOrBelow() then + HardOnlyCarrier1.Destroy() + end + + Trigger.OnKilled(LiquidTibFacility, function(self, killer) + if not Nod.IsObjectiveCompleted(ObjectiveProtectLiquidTib) then + Nod.MarkFailedObjective(ObjectiveProtectLiquidTib) + end + end) + + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(2)), function() + Media.DisplayMessage("Commander, we must bring the device to full power as quickly as possible. Transporting crystals will take too long, so liquid Tiberium is our only option. We have set up a liquid T production facility. Do not let it be destroyed, and as each shipment becomes available load it into a tanker and bring it to the entrance of the cave system.", "Kane", HSLColor.FromHex("FF0000")) + MediaCA.PlaySound(MissionDir .. "/kane_liquidt.aud", 2) + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(18)), function() + Tip("Move a tanker next to the processing plant to pick up a prepared shipment, then take it to the cave entrance in the north-east.") + Utils.Do({ InitAttacker1, InitAttacker2, InitAttacker3, InitAttacker4 }, function(a) + if not a.IsDead then + a.AttackMove(PlayerStart.Location) + end + end) + Trigger.AfterDelay(DateTime.Seconds(10), function() + Utils.Do({ InitAttacker5, InitAttacker6, InitAttacker7 }, function(a) + if not a.IsDead then + a.AttackMove(PlayerStart.Location) + end + end) + end) + end) + end) + + Trigger.OnEnteredFootprint({ LiquidTibPickup1.Location, LiquidTibPickup2.Location }, function(a) + if IsMissionPlayer(a.Owner) and not a.IsDead and a.Type == "ttrk" then + if not LiquidTibFacility.IsDead and LiquidTibFacility.AmmoCount("primary") == 0 then + Notification("No liquid Tiberium currently available for pickup.") + end + end + end) + + Trigger.OnEnteredFootprint({ CaveEntrance.Location, LiquidTibDropOff1.Location, LiquidTibDropOff2.Location, LiquidTibDropOff3.Location }, function(a) + if IsMissionPlayer(a.Owner) and not a.IsDead and a.Type == "ttrk" then + if a.AmmoCount("primary") == 1 then + a.Reload("primary", -1) + ShipmentsComplete = ShipmentsComplete + 1 + Notification("Liquid Tiberium shipment delivered.") + MediaCA.PlaySound(MissionDir .. "/n_liquidtibdelivered.aud", 2) + UpdateMissionText() + if ShipmentsComplete == 5 then + PurificationWave() + Nod.MarkCompletedObjective(ObjectiveChargeDevice) + Nod.MarkCompletedObjective(ObjectiveProtectLiquidTib) + end + else + Notification("No liquid Tiberium to drop off.") + end + end + end) + + AfterWorldLoaded() +end + +Tick = function() + OncePerSecondChecks() + OncePerFiveSecondChecks() + OncePerThirtySecondChecks() + AfterTick() +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + Scrin.Resources = Scrin.ResourceCapacity - 500 + + if TimerTicks > 0 then + if TimerTicks > 25 then + TimerTicks = TimerTicks - 25 + else + TimerTicks = 0 + LiquidTibProduced() + end + UpdateMissionText() + end + + if not LiquidTibFacility.IsDead and LiquidTibFacility.AmmoCount("primary") > 0 then + local nearbyTrucks = Map.ActorsInBox(LiquidTibPickup1.CenterPosition, LiquidTibPickup2.CenterPosition, function(a) + return IsMissionPlayer(a.Owner) and not a.IsDead and a.Type == "ttrk" + end) + + Utils.Do(nearbyTrucks, function(t) + if t.AmmoCount("primary") == 0 and not TibLoaded then + TibLoaded = true + t.Reload("primary", 1) + LiquidTibFacility.Reload("primary", -1) + Notification("Liquid Tiberium transfer complete.") + Beacon.New(Nod, t.CenterPosition) + end + end) + + TibLoaded = false + end + + if ObjectiveDestroyRemainingLoyalists ~= nil then + if not PlayerHasBuildings(Scrin) and #Scrin.GetActorsByType("wormhole") == 0 then + Nod.MarkCompletedObjective(ObjectiveDestroyRemainingLoyalists) + end + end + end +end + +OncePerFiveSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 125 == 0 then + UpdatePlayerBaseLocations() + + if not ScrinReinforcementsEnabled then + local scrinProducerActors = Scrin.GetActorsByTypes({ "sfac", "wsph", "port" }) + + if #scrinProducerActors == 0 then + InitScrinReinforcements() + end + end + + if MissionPlayersHaveNoRequiredUnits() then + if not Nod.IsObjectiveCompleted(ObjectiveChargeDevice) then + Nod.MarkFailedObjective(ObjectiveChargeDevice) + end + if ObjectiveDestroyRemainingLoyalists ~= nil and not Nod.IsObjectiveCompleted(ObjectiveDestroyRemainingLoyalists) then + Nod.MarkFailedObjective(ObjectiveDestroyRemainingLoyalists) + end + end + end +end + +OncePerThirtySecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % DateTime.Seconds(30) == 0 then + CalculatePlayerCharacteristics() + end +end + +InitScrin = function() + RebuildExcludes.Scrin = { Types = { "rfgn" } } + + AutoRepairAndRebuildBuildings(Scrin, 15) + SetupRefAndSilosCaptureCredits(Scrin) + AutoReplaceHarvesters(Scrin) + AutoRebuildConyards(Scrin) + InitAiUpgrades(Scrin) + + local scrinGroundAttackers = Scrin.GetGroundAttackers() + + Utils.Do(scrinGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsScrinGroundHunterUnit) + end) + + BeginScrinAttacks() + + Actor.Create("ai.minor.superweapons.enabled", true, { Owner = Scrin }) + + Trigger.AfterDelay(RiftEnabledTime[Difficulty], function() + Actor.Create("ai.superweapons.enabled", true, { Owner = Scrin }) + end) +end + +BeginScrinAttacks = function() + InitAttackSquad(Squads.ScrinMain, Scrin) + InitAttackSquad(Squads.ScrinSecondary, Scrin) + InitAirAttackSquad(Squads.ScrinAir, Scrin) + if Difficulty == "brutal" then + InitAirAttackSquad(Squads.TibTruckKillers, Scrin, MissionPlayers, { "ttrk" }) + end +end + +UpdateMissionText = function() + if Nod.IsObjectiveCompleted(ObjectiveChargeDevice) then + UserInterface.SetMissionText("") + return + end + + local shipmentsText = "Shipments complete: " .. ShipmentsComplete .. "/5" + local cooldownText = " -- Next shipment ready in " .. UtilsCA.FormatTimeForGameSpeed(TimerTicks) + UserInterface.SetMissionText(shipmentsText .. cooldownText, HSLColor.Yellow) +end + +LiquidTibProduced = function() + if Nod.IsObjectiveCompleted(ObjectiveChargeDevice) then + return + end + + TimerTicks = LiquidTibCooldown + Notification("Liquid Tiberium shipment ready.") + MediaCA.PlaySound(MissionDir .. "/n_liquidtibready.aud", 2) + + if not LiquidTibFacility.IsDead then + LiquidTibFacility.Reload("primary", 1) + Beacon.New(Nod, LiquidTibFacility.CenterPosition) + end +end + +PurificationWave = function() + ObjectivePurify = Nod.AddObjective("Await the purification wave.") + + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(2)), function() + Media.DisplayMessage("Well done commander! The device is at full power, and will soon release its purifying energy. The question is, will the Scrin fight for their freedom against the Overlord, or cower in servitude even after such heinous treachery is revealed?", "Kane", HSLColor.FromHex("FF0000")) + MediaCA.PlaySound(MissionDir .. "/kane_purification.aud", 2) + + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(14)), function() + MediaCA.PlaySound("purification.aud", 2) + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(9)), function() + PurificationComplete = true + Lighting.Flash("Purification", AdjustTimeForGameSpeed(10)) + ObjectiveDestroyRemainingLoyalists = Nod.AddObjective("Eliminate any hostile Scrin remaining.") + Nod.MarkCompletedObjective(ObjectivePurify) + PurifyScrin() + InitScrinReinforcements() + InitRebelReinforcements() + if not IslandGrav1.IsDead then + IslandGrav1.Kill() + end + if not IslandGrav2.IsDead then + IslandGrav2.Kill() + end + Trigger.AfterDelay(1, function() + local wormholes = Scrin.GetActorsByType("wormhole") + Utils.Do(wormholes, function(w) + if not w.IsDead then + w.GrantCondition("regen-disabled") + end + end) + end) + Trigger.AfterDelay(AdjustTimeForGameSpeed(4), function() + Lighting.Flash("Purification", AdjustTimeForGameSpeed(10)) + Trigger.AfterDelay(AdjustTimeForGameSpeed(4), function() + Lighting.Flash("Purification", AdjustTimeForGameSpeed(10)) + Trigger.AfterDelay(AdjustTimeForGameSpeed(4), function() + Lighting.Flash("Purification", AdjustTimeForGameSpeed(10)) + end) + end) + end) + end) + end) + end) +end + +PurifyScrin = function() + local scrinGroundUnits = Utils.Shuffle(Utils.Where(Scrin.GetGroundAttackers(), IsScrinGroundHunterUnit)) + local count = 1 + + Utils.Do(scrinGroundUnits, function(a) + Purify(a, count) + count = count + 1 + if count > 10 then + count = 1 + end + end) + + local scrinAirUnits = Scrin.GetActorsByTypes({ "pac", "deva" }) + count = 1 + + Utils.Do(scrinAirUnits, function(a) + Purify(a, count) + count = count + 1 + if count > 10 then + count = 1 + end + end) +end + +Purify = function(a, count) + Trigger.ClearAll(a) + local shouldConvert = false + + if Difficulty == "easy" and count % 3 > 0 then + shouldConvert = true + elseif count % 2 == 0 then + shouldConvert = true + end + + if shouldConvert then + a.Owner = ScrinRebels + end + Trigger.AfterDelay(1, function() + IdleHunt(a) + end) +end + +InitScrinReinforcements = function() + if not ScrinReinforcementsEnabled then + ScrinReinforcementsEnabled = true + Utils.Do(ScrinReinforcementSpawns, function(s) + SpawnWormhole(s.Location) + end) + Utils.Do({ ScrinHiddenSpawn1.Location, ScrinHiddenSpawn2.Location, ScrinHiddenSpawn3.Location, ScrinHiddenSpawn4.Location, ScrinHiddenSpawn5.Location, ScrinHiddenSpawn6.Location }, function(loc) + Actor.Create("hiddenspawner", true, { Owner = Scrin, Location = loc }) + end) + end +end + +SpawnWormhole = function(loc) + local wormhole = Actor.Create("wormhole", true, { Owner = Scrin, Location = loc }) + Trigger.OnKilled(wormhole, function(self, killer) + Trigger.AfterDelay(DateTime.Minutes(1), function() + if not Nod.IsObjectiveCompleted(ObjectiveChargeDevice) then + SpawnWormhole(loc) + end + end) + end) +end + +InitRebelReinforcements = function() + local rebelSpawns = { RebelSpawnPoint1, RebelSpawnPoint2 } + + Utils.Do(rebelSpawns, function(s) + local wormhole = Actor.Create("wormhole", true, { Owner = ScrinRebels, Location = s.Location }) + local units = Reinforcements.Reinforce(ScrinRebels, { "s1", "s3", "intl.ai2", "devo", "s4", "s1", "tpod", "gscr", "intl", "s1", "s1" }, { wormhole.Location }, 10) + + Utils.Do(units, function(a) + a.AttackMove(ScrinBaseCenter.Location) + IdleHunt(a) + end) + end) + + InitAttackSquad(Squads.ScrinRebelsMain, ScrinRebels, Scrin) +end diff --git a/mods/ca/missions/main-campaign/ca35-purification/ttrkicon.shp b/mods/ca/missions/main-campaign/ca35-purification/ttrkicon.shp new file mode 100644 index 0000000000..ea6ac3bc5b Binary files /dev/null and b/mods/ca/missions/main-campaign/ca35-purification/ttrkicon.shp differ diff --git a/mods/ca/missions/main-campaign/ca36-reckoning/kane_exterminators.aud b/mods/ca/missions/main-campaign/ca36-reckoning/kane_exterminators.aud new file mode 100644 index 0000000000..263a8e8970 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca36-reckoning/kane_exterminators.aud differ diff --git a/mods/ca/missions/main-campaign/ca36-reckoning/kane_gdibase.aud b/mods/ca/missions/main-campaign/ca36-reckoning/kane_gdibase.aud new file mode 100644 index 0000000000..308071fe2e Binary files /dev/null and b/mods/ca/missions/main-campaign/ca36-reckoning/kane_gdibase.aud differ diff --git a/mods/ca/missions/main-campaign/ca36-reckoning/kane_newbeginning.aud b/mods/ca/missions/main-campaign/ca36-reckoning/kane_newbeginning.aud new file mode 100644 index 0000000000..69c5da1eb2 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca36-reckoning/kane_newbeginning.aud differ diff --git a/mods/ca/missions/main-campaign/ca36-reckoning/kane_nomercy.aud b/mods/ca/missions/main-campaign/ca36-reckoning/kane_nomercy.aud new file mode 100644 index 0000000000..9eca0c38ec Binary files /dev/null and b/mods/ca/missions/main-campaign/ca36-reckoning/kane_nomercy.aud differ diff --git a/mods/ca/missions/main-campaign/ca36-reckoning/map.bin b/mods/ca/missions/main-campaign/ca36-reckoning/map.bin new file mode 100644 index 0000000000..3db766133a Binary files /dev/null and b/mods/ca/missions/main-campaign/ca36-reckoning/map.bin differ diff --git a/mods/ca/missions/main-campaign/ca36-reckoning/map.png b/mods/ca/missions/main-campaign/ca36-reckoning/map.png new file mode 100644 index 0000000000..c1929c54db Binary files /dev/null and b/mods/ca/missions/main-campaign/ca36-reckoning/map.png differ diff --git a/mods/ca/missions/main-campaign/ca36-reckoning/map.yaml b/mods/ca/missions/main-campaign/ca36-reckoning/map.yaml new file mode 100644 index 0000000000..f6672257f9 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca36-reckoning/map.yaml @@ -0,0 +1,4836 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 36: Reckoning + +Author: Darkademic + +Tileset: TEMPERAT + +MapSize: 146,146 + +Bounds: 1,1,144,144 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: Nod, Scrin, ScrinRebels, GDI, GDIHostile + PlayerReference@Nod: + Name: Nod + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: nod + LockColor: True + Color: FE1100 + LockSpawn: True + LockTeam: True + Allies: ScrinRebels, GDI + Enemies: Scrin, GDIHostile, Creeps + PlayerReference@Scrin: + Name: Scrin + Bot: campaign + Faction: scrin + Color: 7700FF + Enemies: Nod, ScrinRebels, GDI, GDIHostile, Creeps + PlayerReference@ScrinRebels: + Name: ScrinRebels + Faction: scrin + Color: 55E1AE + Allies: Nod, GDI + Enemies: Scrin, Creeps + PlayerReference@GDI: + Name: GDI + Bot: campaign + Faction: gdi + Color: F2CF74 + Allies: Nod, ScrinRebels + Enemies: Scrin, Creeps + PlayerReference@GDIHostile: + Name: GDIHostile + Bot: campaign + Faction: gdi + Color: F2CF74 + Enemies: Scrin, Nod, Creeps + +Actors: + Actor0: amcv + Owner: Nod + Location: 23,7 + Facing: 491 + PlayerStart: waypoint + Owner: Neutral + Location: 23,7 + Actor2: ltnk + Owner: Nod + Location: 20,7 + Facing: 512 + Actor5: n1c + Owner: Nod + Location: 22,11 + SubCell: 2 + Facing: 512 + Actor6: n1c + Owner: Nod + Location: 22,11 + SubCell: 4 + Facing: 512 + Actor7: n1c + Owner: Nod + Location: 22,11 + SubCell: 5 + Facing: 512 + Actor11: n3c + Owner: Nod + Location: 22,10 + SubCell: 4 + Facing: 512 + Actor12: n3c + Owner: Nod + Location: 22,10 + SubCell: 5 + Facing: 512 + Actor1: ftnk + Owner: Nod + Location: 21,9 + Facing: 512 + Actor4: n1c + Owner: Nod + Location: 22,11 + SubCell: 1 + Facing: 512 + Actor9: ltnk + Owner: Nod + Facing: 512 + Location: 26,7 + Actor10: ftnk + Owner: Nod + Facing: 512 + Location: 25,9 + Actor13: n3c + Owner: Nod + SubCell: 4 + Facing: 512 + Location: 24,10 + Actor14: n3c + Owner: Nod + SubCell: 5 + Facing: 512 + Location: 24,10 + Actor15: n1c + Owner: Nod + SubCell: 2 + Facing: 512 + Location: 24,11 + Actor16: n1c + Owner: Nod + SubCell: 4 + Facing: 512 + Location: 24,11 + Actor17: n1c + Owner: Nod + SubCell: 5 + Facing: 512 + Location: 24,11 + Actor18: n1c + Owner: Nod + SubCell: 1 + Facing: 512 + Location: 24,11 + Actor19: rmbc + Owner: Nod + SubCell: 3 + Location: 19,9 + Facing: 512 + Actor20: rmbc + Owner: Nod + SubCell: 3 + Location: 27,9 + Facing: 512 + Actor21: splitblue + Owner: Neutral + Location: 11,14 + Actor22: splitblue + Owner: Neutral + Location: 13,22 + Actor23: swal + Owner: ScrinRebels + Location: 75,23 + Actor24: swal + Owner: ScrinRebels + Location: 75,24 + Actor25: swal + Owner: ScrinRebels + Location: 74,23 + Actor26: swal + Owner: ScrinRebels + Location: 74,24 + Actor27: swal + Owner: ScrinRebels + Location: 73,23 + Actor28: swal + Owner: ScrinRebels + Location: 73,22 + Actor29: swal + Owner: ScrinRebels + Location: 74,22 + Actor30: swal + Owner: ScrinRebels + Location: 82,23 + Actor31: swal + Owner: ScrinRebels + Location: 82,24 + Actor32: swal + Owner: ScrinRebels + Location: 83,23 + Actor33: swal + Owner: ScrinRebels + Location: 83,24 + Actor34: swal + Owner: ScrinRebels + Location: 83,22 + Actor35: swal + Owner: ScrinRebels + Location: 84,23 + Actor36: swal + Owner: ScrinRebels + Location: 84,22 + Actor37: swal + Owner: ScrinRebels + Location: 72,22 + Actor38: swal + Owner: ScrinRebels + Location: 71,22 + Actor39: swal + Owner: ScrinRebels + Location: 70,22 + Actor40: swal + Owner: ScrinRebels + Location: 85,22 + Actor41: swal + Owner: ScrinRebels + Location: 86,22 + Actor42: swal + Owner: ScrinRebels + Location: 87,22 + Actor43: swal + Owner: ScrinRebels + Location: 70,21 + Actor44: swal + Owner: ScrinRebels + Location: 70,20 + Actor45: swal + Owner: ScrinRebels + Location: 70,19 + Actor46: swal + Owner: ScrinRebels + Location: 70,18 + Actor51: swal + Owner: ScrinRebels + Location: 69,18 + Actor52: swal + Owner: ScrinRebels + Location: 69,17 + Actor53: swal + Owner: ScrinRebels + Location: 70,17 + Actor57: swal + Owner: ScrinRebels + Location: 69,11 + Actor58: swal + Owner: ScrinRebels + Location: 69,10 + Actor59: swal + Owner: ScrinRebels + Location: 70,10 + Actor60: swal + Owner: ScrinRebels + Location: 70,11 + Actor61: swal + Owner: ScrinRebels + Location: 69,9 + Actor62: swal + Owner: ScrinRebels + Location: 69,8 + Actor63: swal + Owner: ScrinRebels + Location: 69,7 + Actor64: swal + Owner: ScrinRebels + Location: 69,6 + Actor65: swal + Owner: ScrinRebels + Location: 69,5 + Actor90: swal + Owner: ScrinRebels + Location: 87,1 + Actor93: swal + Owner: ScrinRebels + Location: 73,1 + Actor94: swal + Owner: ScrinRebels + Location: 74,1 + Actor96: swal + Owner: ScrinRebels + Location: 69,4 + Actor97: swal + Owner: ScrinRebels + Location: 69,3 + Actor98: swal + Owner: ScrinRebels + Location: 69,2 + Actor99: swal + Owner: ScrinRebels + Location: 69,1 + Actor100: swal + Owner: ScrinRebels + Location: 70,1 + Actor101: swal + Owner: ScrinRebels + Location: 71,1 + Actor102: swal + Owner: ScrinRebels + Location: 72,1 + Actor103: swal + Owner: ScrinRebels + Location: 70,2 + Actor91: swal + Owner: ScrinRebels + Location: 75,1 + Actor92: swal + Owner: ScrinRebels + Location: 77,1 + Actor95: swal + Owner: ScrinRebels + Location: 76,1 + Actor104: swal + Owner: ScrinRebels + Location: 78,1 + Actor105: swal + Owner: ScrinRebels + Location: 79,1 + Actor106: swal + Owner: ScrinRebels + Location: 80,1 + Actor107: swal + Owner: ScrinRebels + Location: 81,1 + Actor108: swal + Owner: ScrinRebels + Location: 82,1 + Actor109: swal + Owner: ScrinRebels + Location: 83,1 + Actor110: swal + Owner: ScrinRebels + Location: 84,1 + Actor111: swal + Owner: ScrinRebels + Location: 85,1 + Actor112: swal + Owner: ScrinRebels + Location: 86,1 + RebelPortal1: port + Owner: ScrinRebels + Location: 80,16 + Actor116: rea2 + Owner: ScrinRebels + Location: 71,2 + Actor117: rea2 + Owner: ScrinRebels + Location: 74,2 + Actor118: rea2 + Owner: ScrinRebels + Location: 77,2 + Actor119: rea2 + Owner: ScrinRebels + Location: 80,2 + Actor120: rea2 + Owner: ScrinRebels + Location: 83,2 + Actor121: swal + Owner: ScrinRebels + Location: 88,1 + Actor122: swal + Owner: ScrinRebels + Location: 89,1 + Actor123: swal + Owner: ScrinRebels + Location: 90,1 + Actor124: swal + Owner: ScrinRebels + Location: 89,2 + Actor125: swal + Owner: ScrinRebels + Location: 90,2 + Actor126: swal + Owner: ScrinRebels + Location: 90,3 + Actor127: swal + Owner: ScrinRebels + Location: 90,4 + Actor128: swal + Owner: ScrinRebels + Location: 90,5 + Actor129: swal + Owner: ScrinRebels + Location: 90,6 + Actor130: swal + Owner: ScrinRebels + Location: 90,7 + Actor131: swal + Owner: ScrinRebels + Location: 90,8 + Actor132: swal + Owner: ScrinRebels + Location: 90,9 + Actor133: swal + Owner: ScrinRebels + Location: 89,10 + Actor134: swal + Owner: ScrinRebels + Location: 90,10 + Actor135: swal + Owner: ScrinRebels + Location: 89,11 + Actor136: swal + Owner: ScrinRebels + Location: 90,11 + Actor137: swal + Owner: ScrinRebels + Location: 89,17 + Actor138: swal + Owner: ScrinRebels + Location: 90,17 + Actor139: swal + Owner: ScrinRebels + Location: 89,18 + Actor140: swal + Owner: ScrinRebels + Location: 90,18 + Actor141: swal + Owner: ScrinRebels + Location: 89,19 + Actor142: swal + Owner: ScrinRebels + Location: 89,20 + Actor143: swal + Owner: ScrinRebels + Location: 89,21 + Actor144: swal + Owner: ScrinRebels + Location: 88,22 + Actor145: swal + Owner: ScrinRebels + Location: 89,22 + Actor146: rea2 + Owner: ScrinRebels + Location: 86,2 + Actor152: shar + Owner: ScrinRebels + Location: 71,21 + TurretFacing: 341 + Actor153: shar + Owner: ScrinRebels + Location: 88,21 + TurretFacing: 658 + Actor154: scol + Owner: ScrinRebels + Location: 75,22 + Actor155: scol + Owner: ScrinRebels + Location: 82,22 + Actor156: scol + Owner: ScrinRebels + Location: 71,18 + Actor157: scol + Owner: ScrinRebels + Location: 88,18 + Actor160: srep + Owner: ScrinRebels + Location: 78,12 + RebelMainNerveCenter: nerv + Owner: ScrinRebels + Location: 72,7 + Actor161: proc.scrin + Owner: ScrinRebels + Location: 73,11 + RebelWarpSphere1: wsph + Owner: ScrinRebels + Location: 75,16 + RebelGravityStabilizer1: grav + Owner: ScrinRebels + Location: 83,12 + Actor149: sign + Owner: ScrinRebels + Location: 86,6 + Actor151: splitblue + Owner: Neutral + Location: 66,6 + Actor164: splitblue + Owner: Neutral + Location: 65,10 + Actor165: splitblue + Owner: Neutral + Location: 93,14 + Actor166: splitblue + Owner: Neutral + Location: 94,7 + Actor167: ptur + Owner: ScrinRebels + TurretFacing: 512 + Location: 75,25 + Actor168: ptur + Owner: ScrinRebels + TurretFacing: 512 + Location: 82,25 + Actor158: swal + Owner: ScrinRebels + Location: 76,24 + Actor159: swal + Owner: ScrinRebels + Location: 76,23 + Actor169: swal + Owner: ScrinRebels + Location: 81,23 + Actor170: swal + Owner: ScrinRebels + Location: 81,24 + Actor171: tpod + Owner: ScrinRebels + Facing: 384 + Location: 73,20 + Actor172: tpod + Owner: ScrinRebels + Location: 86,20 + Facing: 512 + Actor173: devo + Owner: ScrinRebels + Facing: 384 + Location: 86,24 + Actor174: intl + Owner: ScrinRebels + Facing: 384 + Location: 68,20 + Actor175: gunw + Owner: ScrinRebels + Location: 86,10 + Facing: 570 + Actor176: gunw + Owner: ScrinRebels + Location: 75,8 + Facing: 384 + Actor177: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 69,21 + Actor178: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 67,20 + Actor179: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 68,23 + Actor180: s1 + Owner: ScrinRebels + SubCell: 3 + Location: 88,23 + Facing: 491 + Actor181: s1 + Owner: ScrinRebels + Location: 88,24 + SubCell: 3 + Facing: 539 + Actor182: s3 + Owner: ScrinRebels + Facing: 384 + Location: 88,24 + SubCell: 1 + Actor183: s2 + Owner: ScrinRebels + SubCell: 3 + Facing: 384 + Location: 90,22 + Actor184: s4 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 70,23 + Actor185: s4 + Owner: ScrinRebels + SubCell: 3 + Location: 84,20 + Facing: 483 + Actor186: s4 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 74,21 + Actor187: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 74,25 + Actor188: s1 + Owner: ScrinRebels + SubCell: 3 + Location: 81,26 + Facing: 578 + Actor189: s1 + Owner: ScrinRebels + SubCell: 3 + Location: 80,24 + Facing: 499 + Actor190: tpod + Owner: ScrinRebels + Location: 37,19 + Facing: 384 + Health: 86 + Actor192: s1 + Owner: Scrin + SubCell: 3 + Location: 37,23 + Facing: 959 + Actor193: s1 + Owner: Scrin + SubCell: 3 + Location: 33,23 + Facing: 1015 + Actor194: s1 + Owner: Scrin + SubCell: 3 + Location: 37,24 + Facing: 856 + Actor195: s1 + Owner: ScrinRebels + SubCell: 3 + Facing: 384 + Location: 38,20 + Actor197: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 40,22 + Actor198: s1 + Owner: ScrinRebels + SubCell: 3 + Location: 35,19 + Facing: 499 + Actor196: swal + Owner: Scrin + Location: 8,129 + Actor199: swal + Owner: Scrin + Location: 8,130 + Actor200: swal + Owner: Scrin + Location: 8,128 + Actor201: swal + Owner: Scrin + Location: 9,128 + Actor202: swal + Owner: Scrin + Location: 10,128 + Actor203: swal + Owner: Scrin + Location: 10,129 + Actor204: swal + Owner: Scrin + Location: 10,130 + Actor205: swal + Owner: Scrin + Location: 9,130 + Actor206: swal + Owner: Scrin + Location: 10,120 + Actor207: swal + Owner: Scrin + Location: 10,121 + Actor208: swal + Owner: Scrin + Location: 9,121 + Actor209: swal + Owner: Scrin + Location: 9,122 + Actor210: swal + Owner: Scrin + Location: 10,122 + Actor211: swal + Owner: Scrin + Location: 11,120 + Actor212: swal + Owner: Scrin + Location: 12,120 + Actor213: swal + Owner: Scrin + Location: 12,121 + Actor214: swal + Owner: Scrin + Location: 12,122 + Actor215: swal + Owner: Scrin + Location: 11,122 + Actor216: swal + Owner: Scrin + Location: 10,138 + Actor217: swal + Owner: Scrin + Location: 11,138 + Actor218: swal + Owner: Scrin + Location: 10,137 + Actor219: swal + Owner: Scrin + Location: 11,137 + Actor220: swal + Owner: Scrin + Location: 10,136 + Actor221: swal + Owner: Scrin + Location: 10,135 + Actor222: swal + Owner: Scrin + Location: 11,135 + Actor223: swal + Owner: Scrin + Location: 12,135 + Actor224: swal + Owner: Scrin + Location: 12,137 + Actor225: swal + Owner: Scrin + Location: 12,136 + Actor226: swal + Owner: Scrin + Location: 20,140 + Actor227: swal + Owner: Scrin + Location: 20,139 + Actor228: swal + Owner: Scrin + Location: 21,139 + Actor229: swal + Owner: Scrin + Location: 21,140 + Actor230: swal + Owner: Scrin + Location: 21,138 + Actor231: swal + Owner: Scrin + Location: 22,139 + Actor232: swal + Owner: Scrin + Location: 23,139 + Actor233: swal + Owner: Scrin + Location: 23,138 + Actor234: swal + Owner: Scrin + Location: 21,137 + Actor235: swal + Owner: Scrin + Location: 23,137 + Actor236: swal + Owner: Scrin + Location: 22,137 + Actor237: swal + Owner: Scrin + Location: 18,116 + Actor238: swal + Owner: Scrin + Location: 18,117 + Actor239: swal + Owner: Scrin + Location: 18,118 + Actor240: swal + Owner: Scrin + Location: 19,118 + Actor241: swal + Owner: Scrin + Location: 20,118 + Actor242: swal + Owner: Scrin + Location: 20,117 + Actor243: swal + Owner: Scrin + Location: 20,116 + Actor244: swal + Owner: Scrin + Location: 19,116 + Actor245: swal + Owner: Scrin + Location: 26,116 + Actor246: swal + Owner: Scrin + Location: 27,116 + Actor247: swal + Owner: Scrin + Location: 27,117 + Actor248: swal + Owner: Scrin + Location: 27,118 + Actor249: swal + Owner: Scrin + Location: 26,118 + Actor250: swal + Owner: Scrin + Location: 25,118 + Actor251: swal + Owner: Scrin + Location: 25,117 + Actor252: swal + Owner: Scrin + Location: 25,116 + Actor253: swal + Owner: Scrin + Location: 34,118 + Actor254: swal + Owner: Scrin + Location: 35,118 + Actor255: swal + Owner: Scrin + Location: 34,119 + Actor256: swal + Owner: Scrin + Location: 35,119 + Actor257: swal + Owner: Scrin + Location: 35,120 + Actor258: swal + Owner: Scrin + Location: 36,119 + Actor259: swal + Owner: Scrin + Location: 36,120 + Actor260: swal + Owner: Scrin + Location: 35,121 + Actor261: swal + Owner: Scrin + Location: 36,121 + Actor262: swal + Owner: Scrin + Location: 34,121 + Actor263: swal + Owner: Scrin + Location: 34,122 + Actor264: swal + Owner: Scrin + Location: 34,123 + Actor265: swal + Owner: Scrin + Location: 35,123 + Actor266: swal + Owner: Scrin + Location: 36,123 + Actor267: swal + Owner: Scrin + Location: 36,122 + Actor268: scol + Owner: Scrin + Location: 11,121 + Actor269: scol + Owner: Scrin + Location: 9,129 + Actor270: scol + Owner: Scrin + Location: 11,136 + Actor271: scol + Owner: Scrin + Location: 22,138 + Actor272: scol + Owner: Scrin + Location: 19,117 + Actor273: scol + Owner: Scrin + Location: 26,117 + Actor274: scol + Owner: Scrin + Location: 35,122 + Actor275: shar + Owner: Scrin + Location: 10,132 + Actor276: shar + Owner: Scrin + Location: 10,125 + Actor277: shar + Owner: Scrin + Location: 15,119 + Actor278: shar + Owner: Scrin + Location: 31,119 + Actor279: shar + Owner: Scrin + Location: 16,138 + Actor280: sfac + Owner: Scrin + Location: 19,130 + Actor281: rea2 + Owner: Scrin + Location: 13,135 + Actor282: rea2 + Owner: Scrin + Location: 16,135 + Actor283: rea2 + Owner: Scrin + Location: 14,132 + Actor284: rea2 + Owner: Scrin + Location: 12,129 + Actor285: rea2 + Owner: Scrin + Location: 25,133 + Portal1: port + Owner: Scrin + Location: 17,119 + Actor291: sign + Owner: Scrin + Location: 20,133 + Actor294: scrt + Owner: Scrin + Location: 12,125 + Actor295: nerv + Owner: Scrin + Location: 30,120 + Actor298: swal + Owner: Scrin + Location: 36,124 + Actor299: swal + Owner: Scrin + Location: 38,124 + Actor300: swal + Owner: Scrin + Location: 37,124 + Actor301: swal + Owner: Scrin + Location: 39,124 + Actor302: swal + Owner: Scrin + Location: 39,125 + Actor303: swal + Owner: Scrin + Location: 37,133 + Actor304: swal + Owner: Scrin + Location: 37,132 + Actor305: swal + Owner: Scrin + Location: 37,131 + Actor306: swal + Owner: Scrin + Location: 39,131 + Actor307: swal + Owner: Scrin + Location: 38,131 + Actor308: swal + Owner: Scrin + Location: 39,130 + Actor309: swal + Owner: Scrin + Location: 38,130 + Actor310: swal + Owner: Scrin + Location: 38,125 + Actor311: swal + Owner: Scrin + Location: 40,131 + Actor312: swal + Owner: Scrin + Location: 41,131 + Actor313: swal + Owner: Scrin + Location: 42,131 + Actor314: swal + Owner: Scrin + Location: 43,131 + Actor315: swal + Owner: Scrin + Location: 43,132 + Actor316: swal + Owner: Scrin + Location: 43,133 + Actor317: swal + Owner: Scrin + Location: 44,133 + Actor318: swal + Owner: Scrin + Location: 45,133 + Actor319: swal + Owner: Scrin + Location: 45,132 + Actor320: swal + Owner: Scrin + Location: 45,131 + Actor321: swal + Owner: Scrin + Location: 44,131 + Actor322: swal + Owner: Scrin + Location: 37,134 + Actor323: swal + Owner: Scrin + Location: 37,135 + Actor324: swal + Owner: Scrin + Location: 36,135 + Actor325: swal + Owner: Scrin + Location: 36,134 + Actor326: swal + Owner: Scrin + Location: 43,123 + Actor327: swal + Owner: Scrin + Location: 43,124 + Actor328: swal + Owner: Scrin + Location: 43,125 + Actor329: swal + Owner: Scrin + Location: 44,125 + Actor330: swal + Owner: Scrin + Location: 45,125 + Actor331: swal + Owner: Scrin + Location: 45,124 + Actor332: swal + Owner: Scrin + Location: 45,123 + Actor333: swal + Owner: Scrin + Location: 44,123 + Actor334: swal + Owner: Scrin + Location: 40,124 + Actor335: swal + Owner: Scrin + Location: 41,124 + Actor336: swal + Owner: Scrin + Location: 42,124 + Actor337: shar + Owner: Scrin + Location: 29,136 + Actor338: shar + Owner: Scrin + Location: 35,137 + Actor339: scol + Owner: Scrin + Location: 44,124 + Actor340: scol + Owner: Scrin + Location: 44,132 + Exterminator3: etpd + Owner: Scrin + Location: 47,124 + Facing: 768 + Exterminator4: etpd + Owner: Scrin + Location: 47,132 + Facing: 768 + Actor343: rea2 + Owner: Scrin + Location: 31,134 + Actor345: rea2 + Owner: Scrin + Location: 34,131 + Actor346: rea2 + Owner: Scrin + Location: 32,128 + Actor348: rea2 + Owner: Scrin + Location: 28,130 + Actor344: rea2 + Owner: Scrin + Location: 31,131 + Actor347: shar + Owner: Scrin + Location: 37,125 + Actor349: swal + Owner: ScrinRebels + Location: 74,123 + Health: 26 + Actor350: swal + Owner: ScrinRebels + Location: 74,122 + Health: 16 + Actor351: swal + Owner: ScrinRebels + Location: 75,122 + Health: 9 + Actor352: swal + Owner: ScrinRebels + Location: 75,123 + Actor353: swal + Owner: ScrinRebels + Location: 74,121 + Health: 33 + Actor354: swal + Owner: ScrinRebels + Location: 74,120 + Actor355: swal + Owner: ScrinRebels + Location: 74,119 + Actor356: swal + Owner: ScrinRebels + Location: 75,120 + Actor357: swal + Owner: ScrinRebels + Location: 75,119 + Actor358: swal + Owner: ScrinRebels + Location: 74,128 + Actor359: swal + Owner: ScrinRebels + Location: 74,129 + Actor360: swal + Owner: ScrinRebels + Location: 75,129 + Actor361: swal + Owner: ScrinRebels + Location: 75,128 + Actor362: swal + Owner: ScrinRebels + Location: 74,130 + Health: 39 + Actor363: swal + Owner: ScrinRebels + Location: 74,131 + Health: 58 + Actor364: swal + Owner: ScrinRebels + Location: 74,132 + Health: 27 + Actor365: swal + Owner: ScrinRebels + Location: 74,133 + Actor366: swal + Owner: ScrinRebels + Location: 75,133 + Actor367: swal + Owner: ScrinRebels + Location: 75,132 + Actor368: swal + Owner: ScrinRebels + Location: 76,119 + Actor369: swal + Owner: ScrinRebels + Location: 77,119 + Health: 19 + Actor370: swal + Owner: ScrinRebels + Location: 79,119 + Health: 16 + Actor371: swal + Owner: ScrinRebels + Location: 78,119 + Actor375: swal + Owner: ScrinRebels + Location: 76,133 + Health: 22 + Actor376: swal + Owner: ScrinRebels + Location: 78,133 + Actor377: swal + Owner: ScrinRebels + Location: 77,133 + Actor378: swal + Owner: ScrinRebels + Location: 80,133 + Actor379: swal + Owner: ScrinRebels + Location: 79,133 + Actor380: swal + Owner: ScrinRebels + Location: 81,133 + Actor381: swal + Owner: ScrinRebels + Location: 82,133 + Actor388: swal + Owner: ScrinRebels + Location: 87,119 + Actor390: swal + Owner: ScrinRebels + Location: 88,119 + Health: 8 + Actor391: swal + Owner: ScrinRebels + Location: 90,119 + Actor392: swal + Owner: ScrinRebels + Location: 89,119 + Health: 46 + Actor393: swal + Owner: ScrinRebels + Location: 91,119 + Actor394: swal + Owner: ScrinRebels + Location: 91,120 + Actor395: swal + Owner: ScrinRebels + Location: 91,121 + Health: 62 + Actor396: swal + Owner: ScrinRebels + Location: 91,123 + Actor397: swal + Owner: ScrinRebels + Location: 91,122 + Actor398: swal + Owner: ScrinRebels + Location: 91,124 + Actor399: swal + Owner: ScrinRebels + Location: 91,126 + Health: 28 + Actor400: swal + Owner: ScrinRebels + Location: 91,125 + Actor401: swal + Owner: ScrinRebels + Location: 91,127 + Actor402: swal + Owner: ScrinRebels + Location: 91,128 + Actor403: swal + Owner: ScrinRebels + Location: 91,129 + Actor404: swal + Owner: ScrinRebels + Location: 91,131 + Actor405: swal + Owner: ScrinRebels + Location: 91,130 + Actor406: swal + Owner: ScrinRebels + Location: 91,132 + Actor407: swal + Owner: ScrinRebels + Location: 91,133 + Actor408: swal + Owner: ScrinRebels + Location: 89,133 + Actor409: swal + Owner: ScrinRebels + Location: 90,133 + Actor410: swal + Owner: ScrinRebels + Location: 88,133 + Actor411: swal + Owner: ScrinRebels + Location: 87,133 + Actor412: swal + Owner: ScrinRebels + Location: 87,132 + Actor413: swal + Owner: ScrinRebels + Location: 86,132 + Actor414: swal + Owner: ScrinRebels + Location: 86,133 + Health: 26 + FallenRebel6: nerv + Owner: ScrinRebels + Location: 77,121 + Health: 28 + FallenRebel3: rea2 + Owner: ScrinRebels + Location: 88,130 + Health: 25 + FallenRebel2: rea2 + Owner: ScrinRebels + Location: 88,127 + Health: 40 + FallenRebel1: rea2 + Owner: ScrinRebels + Location: 88,124 + Health: 50 + FallenRebel8: scol + Owner: ScrinRebels + Location: 75,130 + Health: 44 + FallenRebel7: scol + Owner: ScrinRebels + Location: 75,121 + Health: 69 + FallenRebel10: ptur + Owner: ScrinRebels + Location: 73,123 + Health: 78 + TurretFacing: 176 + FallenRebel9: ptur + Owner: ScrinRebels + Location: 73,128 + Health: 21 + TurretFacing: 176 + Actor425: shar + Owner: ScrinRebels + Location: 78,126 + TurretFacing: 192 + Health: 45 + Actor426: intl + Owner: ScrinRebels + Location: 71,125 + Facing: 277 + Health: 58 + InitialDefender1: gunw + Owner: ScrinRebels + Location: 72,121 + Health: 66 + Facing: 261 + InitialDefender2: gunw + Owner: ScrinRebels + Location: 75,126 + Health: 62 + Facing: 285 + Actor429: devo + Owner: ScrinRebels + Location: 72,131 + Health: 58 + Facing: 166 + Actor431: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 71,119 + Actor432: s1 + Owner: ScrinRebels + SubCell: 3 + Location: 70,132 + Facing: 103 + Actor433: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 71,131 + Actor434: s1 + Owner: ScrinRebels + SubCell: 3 + Location: 70,128 + Facing: 222 + Actor435: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 71,123 + Actor436: s1 + Owner: ScrinRebels + Facing: 384 + Location: 71,119 + SubCell: 1 + Actor437: s1 + Owner: ScrinRebels + SubCell: 3 + Location: 71,134 + Facing: 111 + Actor438: s3 + Owner: ScrinRebels + SubCell: 3 + Facing: 384 + Location: 71,127 + Actor439: s3 + Owner: ScrinRebels + Facing: 384 + Location: 72,120 + SubCell: 3 + Actor442: swal + Owner: Neutral + Location: 8,94 + Health: 31 + Actor444: swal + Owner: Neutral + Location: 8,93 + Health: 17 + Actor445: swal + Owner: Neutral + Location: 7,93 + Health: 55 + Actor448: swal + Owner: Neutral + Location: 7,94 + Health: 13 + Actor449: swal + Owner: Neutral + Location: 6,94 + Health: 18 + Actor450: swal + Owner: Neutral + Location: 4,95 + Health: 26 + Actor451: swal + Owner: Neutral + Location: 3,95 + Health: 21 + Actor453: swal + Owner: Neutral + Location: 2,95 + Actor466: swal + Owner: Neutral + Location: 1,95 + Actor467: swal + Owner: Neutral + Location: 1,94 + Actor468: swal + Owner: Neutral + Location: 1,92 + Health: 6 + Actor469: swal + Owner: Neutral + Location: 1,93 + Health: 51 + Actor452: swal + Owner: Neutral + Location: 17,90 + Health: 59 + Actor454: swal + Owner: Neutral + Location: 17,91 + Health: 27 + Actor455: swal + Owner: Neutral + Location: 18,91 + Health: 73 + Actor465: swal + Owner: Neutral + Location: 18,90 + Health: 16 + Actor470: swal + Owner: Neutral + Location: 16,90 + Health: 10 + Actor471: swal + Owner: Neutral + Location: 19,91 + Health: 23 + Actor472: swal + Owner: Neutral + Location: 11,83 + Health: 13 + Actor473: swal + Owner: Neutral + Location: 11,84 + Health: 28 + Actor474: swal + Owner: Neutral + Location: 11,85 + Health: 25 + Actor475: swal + Owner: Neutral + Location: 12,85 + Health: 45 + Actor477: swal + Owner: Neutral + Location: 13,85 + Actor478: swal + Owner: Neutral + Location: 13,84 + Health: 68 + Actor479: swal + Owner: Neutral + Location: 13,83 + Actor476: swal + Owner: Neutral + Location: 12,83 + Health: 62 + Actor480: swal + Owner: Neutral + Location: 10,83 + Health: 40 + Actor481: swal + Owner: Neutral + Location: 9,83 + Health: 50 + Actor482: swal + Owner: Neutral + Location: 7,83 + Health: 3 + Actor483: swal + Owner: ScrinRebels + Location: 61,76 + Actor484: swal + Owner: ScrinRebels + Location: 61,74 + Actor485: swal + Owner: ScrinRebels + Location: 61,75 + Actor486: swal + Owner: ScrinRebels + Location: 62,76 + Actor487: swal + Owner: ScrinRebels + Location: 62,74 + Actor488: swal + Owner: ScrinRebels + Location: 63,74 + Actor489: swal + Owner: ScrinRebels + Location: 63,75 + Actor490: swal + Owner: ScrinRebels + Location: 63,76 + Actor491: swal + Owner: ScrinRebels + Location: 64,75 + Actor492: swal + Owner: ScrinRebels + Location: 65,75 + Actor493: swal + Owner: ScrinRebels + Location: 66,75 + Actor494: swal + Owner: ScrinRebels + Location: 66,76 + Actor495: swal + Owner: ScrinRebels + Location: 67,76 + Actor496: swal + Owner: ScrinRebels + Location: 67,75 + Actor497: swal + Owner: ScrinRebels + Location: 56,72 + Actor498: swal + Owner: ScrinRebels + Location: 56,73 + Actor499: swal + Owner: ScrinRebels + Location: 55,73 + Actor500: swal + Owner: ScrinRebels + Location: 53,73 + Actor501: swal + Owner: ScrinRebels + Location: 53,72 + Actor502: swal + Owner: ScrinRebels + Location: 54,73 + Actor503: swal + Owner: ScrinRebels + Location: 54,72 + Actor504: swal + Owner: ScrinRebels + Location: 54,71 + Actor505: swal + Owner: ScrinRebels + Location: 55,71 + Actor506: swal + Owner: ScrinRebels + Location: 56,71 + Actor507: swal + Owner: ScrinRebels + Location: 52,73 + Actor508: swal + Owner: ScrinRebels + Location: 51,73 + Actor509: swal + Owner: ScrinRebels + Location: 51,72 + Actor510: swal + Owner: ScrinRebels + Location: 51,70 + Actor511: swal + Owner: ScrinRebels + Location: 51,71 + Actor512: swal + Owner: ScrinRebels + Location: 51,69 + Actor513: swal + Owner: ScrinRebels + Location: 68,76 + Actor514: swal + Owner: ScrinRebels + Location: 69,76 + Actor515: swal + Owner: ScrinRebels + Location: 70,76 + Actor516: swal + Owner: ScrinRebels + Location: 71,76 + Actor517: swal + Owner: ScrinRebels + Location: 71,75 + Actor518: swal + Owner: ScrinRebels + Location: 71,74 + Actor519: swal + Owner: ScrinRebels + Location: 72,74 + Actor520: swal + Owner: ScrinRebels + Location: 73,74 + Actor521: swal + Owner: ScrinRebels + Location: 73,73 + Actor522: swal + Owner: ScrinRebels + Location: 74,74 + Actor523: swal + Owner: ScrinRebels + Location: 74,73 + Actor524: swal + Owner: ScrinRebels + Location: 50,69 + Actor525: swal + Owner: ScrinRebels + Location: 50,70 + Actor526: swal + Owner: ScrinRebels + Location: 50,68 + Actor527: swal + Owner: ScrinRebels + Location: 50,67 + Actor528: swal + Owner: ScrinRebels + Location: 50,66 + Actor529: swal + Owner: ScrinRebels + Location: 51,66 + Actor530: swal + Owner: ScrinRebels + Location: 51,67 + Actor531: swal + Owner: ScrinRebels + Location: 58,57 + Actor532: swal + Owner: ScrinRebels + Location: 58,56 + Actor533: swal + Owner: ScrinRebels + Location: 59,56 + Actor534: swal + Owner: ScrinRebels + Location: 59,57 + Actor535: swal + Owner: ScrinRebels + Location: 60,56 + Actor536: swal + Owner: ScrinRebels + Location: 61,56 + Actor537: swal + Owner: ScrinRebels + Location: 62,56 + Actor538: swal + Owner: ScrinRebels + Location: 63,56 + Actor539: swal + Owner: ScrinRebels + Location: 64,56 + Actor540: swal + Owner: ScrinRebels + Location: 64,57 + Actor541: swal + Owner: ScrinRebels + Location: 63,57 + Actor542: swal + Owner: ScrinRebels + Location: 71,58 + Actor543: swal + Owner: ScrinRebels + Location: 70,58 + Actor544: swal + Owner: ScrinRebels + Location: 70,59 + Actor545: swal + Owner: ScrinRebels + Location: 71,59 + Actor546: swal + Owner: ScrinRebels + Location: 72,58 + Actor547: swal + Owner: ScrinRebels + Location: 73,58 + Actor548: swal + Owner: ScrinRebels + Location: 73,59 + Actor549: swal + Owner: ScrinRebels + Location: 73,60 + Actor550: swal + Owner: ScrinRebels + Location: 74,60 + Actor551: swal + Owner: ScrinRebels + Location: 74,61 + Actor552: swal + Owner: ScrinRebels + Location: 74,62 + Actor553: swal + Owner: ScrinRebels + Location: 74,63 + Actor554: swal + Owner: ScrinRebels + Location: 74,66 + Actor555: swal + Owner: ScrinRebels + Location: 74,65 + Actor556: swal + Owner: ScrinRebels + Location: 74,64 + Actor557: swal + Owner: ScrinRebels + Location: 73,66 + Actor558: swal + Owner: ScrinRebels + Location: 73,65 + Actor566: swal + Owner: ScrinRebels + Location: 53,60 + Actor559: swal + Owner: ScrinRebels + Location: 52,61 + Actor560: swal + Owner: ScrinRebels + Location: 53,61 + Actor561: swal + Owner: ScrinRebels + Location: 52,59 + Actor562: swal + Owner: ScrinRebels + Location: 51,59 + Actor563: swal + Owner: ScrinRebels + Location: 51,61 + Actor564: swal + Owner: ScrinRebels + Location: 53,59 + Actor567: swal + Owner: ScrinRebels + Location: 51,60 + Actor565: reac + Owner: ScrinRebels + Location: 65,71 + Actor568: reac + Owner: ScrinRebels + Location: 67,71 + Actor569: reac + Owner: ScrinRebels + Location: 65,67 + Actor570: reac + Owner: ScrinRebels + Location: 67,67 + Actor571: port + Owner: ScrinRebels + Location: 62,68 + Actor572: wsph + Owner: ScrinRebels + Location: 55,65 + Actor573: nerv + Owner: ScrinRebels + Location: 70,61 + Actor574: proc.scrin + Owner: ScrinRebels + Location: 57,60 + Actor575: scol + Owner: ScrinRebels + Location: 62,75 + Actor576: scol + Owner: ScrinRebels + Location: 55,72 + Actor577: scol + Owner: ScrinRebels + Location: 52,60 + Actor578: shar + Owner: ScrinRebels + Location: 72,73 + Actor579: shar + Owner: ScrinRebels + Location: 53,69 + Actor580: shar + Owner: ScrinRebels + Location: 61,58 + Actor582: ptur + Owner: ScrinRebels + Location: 55,74 + TurretFacing: 364 + Actor581: ptur + Owner: ScrinRebels + Location: 62,77 + TurretFacing: 452 + Actor583: grav + Owner: ScrinRebels + Location: 64,62 + Actor584: silo.scrin + Owner: ScrinRebels + Location: 61,63 + Actor585: silo.scrin + Owner: ScrinRebels + Location: 61,65 + Actor586: swal + Owner: Scrin + Location: 31,96 + Actor587: swal + Owner: Scrin + Location: 31,97 + Actor588: swal + Owner: Scrin + Location: 32,96 + Actor589: swal + Owner: Scrin + Location: 32,97 + Actor590: swal + Owner: Scrin + Location: 31,95 + Actor591: swal + Owner: Scrin + Location: 32,95 + Actor592: swal + Owner: Scrin + Location: 32,94 + Actor593: swal + Owner: Scrin + Location: 32,93 + Actor594: swal + Owner: Scrin + Location: 32,92 + Actor595: swal + Owner: Scrin + Location: 32,91 + Actor596: swal + Owner: Scrin + Location: 31,91 + Actor597: swal + Owner: Scrin + Location: 31,90 + Actor598: swal + Owner: Scrin + Location: 31,89 + Actor599: swal + Owner: Scrin + Location: 31,88 + Actor600: swal + Owner: Scrin + Location: 32,88 + Actor601: swal + Owner: Scrin + Location: 33,88 + Actor602: swal + Owner: Scrin + Location: 34,88 + Actor603: swal + Owner: Scrin + Location: 35,88 + Actor604: swal + Owner: Scrin + Location: 36,88 + Actor605: swal + Owner: Scrin + Location: 37,87 + Actor606: swal + Owner: Scrin + Location: 37,88 + Actor607: swal + Owner: Scrin + Location: 37,89 + Actor608: swal + Owner: Scrin + Location: 38,89 + Actor609: swal + Owner: Scrin + Location: 39,89 + Actor610: swal + Owner: Scrin + Location: 38,87 + Actor611: swal + Owner: Scrin + Location: 39,87 + Actor612: swal + Owner: Scrin + Location: 39,88 + Actor613: swal + Owner: Scrin + Location: 44,91 + Actor614: swal + Owner: Scrin + Location: 44,92 + Actor615: swal + Owner: Scrin + Location: 44,93 + Actor616: swal + Owner: Scrin + Location: 45,93 + Actor617: swal + Owner: Scrin + Location: 45,91 + Actor618: swal + Owner: Scrin + Location: 46,91 + Actor619: swal + Owner: Scrin + Location: 46,92 + Actor620: swal + Owner: Scrin + Location: 46,93 + Actor624: swal + Owner: Scrin + Location: 47,96 + Actor626: swal + Owner: Scrin + Location: 47,93 + Actor627: swal + Owner: Scrin + Location: 47,94 + Actor628: swal + Owner: Scrin + Location: 47,95 + Actor629: swal + Owner: Scrin + Location: 48,96 + Actor630: swal + Owner: Scrin + Location: 48,97 + Actor631: swal + Owner: Scrin + Location: 48,98 + Actor632: swal + Owner: Scrin + Location: 48,99 + Actor633: swal + Owner: Scrin + Location: 49,99 + Actor634: swal + Owner: Scrin + Location: 49,100 + Actor635: swal + Owner: Scrin + Location: 48,100 + Actor636: swal + Owner: Scrin + Location: 48,105 + Actor637: swal + Owner: Scrin + Location: 48,106 + Actor638: swal + Owner: Scrin + Location: 49,106 + Actor639: swal + Owner: Scrin + Location: 49,105 + Actor640: scol + Owner: Scrin + Location: 38,88 + Actor641: scol + Owner: Scrin + Location: 45,92 + Actor621: shar + Owner: Scrin + Location: 45,95 + Actor622: shar + Owner: Scrin + Location: 32,90 + WarpSphere2: wsph + Owner: Scrin + Location: 33,92 + Portal2: port + Owner: Scrin + Location: 46,97 + Actor642: reac + Owner: Scrin + Location: 41,95 + Actor643: reac + Owner: Scrin + Location: 39,95 + Actor644: reac + Owner: Scrin + Location: 37,95 + Actor645: srep + Owner: Scrin + Location: 39,99 + Actor646: ptur + Owner: Scrin + Location: 50,100 + TurretFacing: 816 + Actor647: ptur + Owner: Scrin + Location: 46,90 + TurretFacing: 840 + Actor648: ptur + Owner: Scrin + Location: 39,86 + TurretFacing: 911 + Actor649: proc.scrin + Owner: Scrin + Location: 33,96 + Actor650: proc.scrin + Owner: Scrin + Location: 44,102 + Actor651: split2 + Owner: Neutral + Location: 45,111 + Actor652: split2 + Owner: Neutral + Location: 29,102 + Actor653: split2 + Owner: Neutral + Location: 34,108 + Actor654: split2 + Owner: Neutral + Location: 40,107 + Actor655: splitblue + Owner: Neutral + Location: 57,52 + Actor656: splitblue + Owner: Neutral + Location: 54,54 + Actor657: split2 + Owner: Neutral + Location: 66,141 + Actor658: split2 + Owner: Neutral + Location: 72,142 + Actor662: swal + Owner: Neutral + Location: 73,95 + Health: 37 + Actor664: swal + Owner: Neutral + Location: 74,95 + Actor665: swal + Owner: Neutral + Location: 75,95 + Health: 46 + Actor666: swal + Owner: Neutral + Location: 76,94 + Health: 34 + Actor667: swal + Owner: Neutral + Location: 75,94 + Health: 25 + Actor668: swal + Owner: Neutral + Location: 77,93 + Health: 13 + Actor669: swal + Owner: Neutral + Location: 77,94 + Actor670: swal + Owner: Neutral + Location: 77,95 + Actor671: swal + Owner: Neutral + Location: 78,95 + Health: 17 + Actor672: swal + Owner: Neutral + Location: 79,95 + Actor673: swal + Owner: Neutral + Location: 79,94 + Health: 13 + Actor674: swal + Owner: Neutral + Location: 72,95 + Health: 39 + Actor675: swal + Owner: Neutral + Location: 72,96 + Actor676: swal + Owner: Neutral + Location: 73,96 + Health: 58 + Actor677: swal + Owner: Neutral + Location: 84,94 + Health: 8 + Actor678: swal + Owner: Neutral + Location: 85,94 + Health: 62 + Actor679: swal + Owner: Neutral + Location: 85,93 + Health: 22 + Actor680: swal + Owner: Neutral + Location: 86,94 + Health: 17 + Actor681: swal + Owner: Neutral + Location: 86,93 + Health: 86 + Actor683: scrinflora1 + Owner: Neutral + Location: 23,31 + Actor684: scrinflora1 + Owner: Neutral + Location: 47,25 + Actor685: scrinflora1 + Owner: Neutral + Location: 82,42 + Actor686: scrinflora1 + Owner: Neutral + Location: 80,67 + Actor687: scrinflora1 + Owner: Neutral + Location: 35,64 + Actor688: scrinflora1 + Owner: Neutral + Location: 3,73 + Actor689: scrinflora1 + Owner: Neutral + Location: 61,101 + Actor690: scrinflora1 + Owner: Neutral + Location: 93,113 + Actor691: scrinflora2 + Owner: Neutral + Location: 94,106 + Actor692: scrinflora2 + Owner: Neutral + Location: 84,88 + Actor693: scrinflora2 + Owner: Neutral + Location: 60,102 + Actor694: scrinflora2 + Owner: Neutral + Location: 21,62 + Actor695: scrinflora2 + Owner: Neutral + Location: 9,40 + Actor696: scrinflora2 + Owner: Neutral + Location: 58,9 + Actor697: scrinflora2 + Owner: Neutral + Location: 2,13 + Actor698: scrinflora2 + Owner: Neutral + Location: 71,35 + Actor699: scrinflora2 + Owner: Neutral + Location: 48,35 + Actor700: scrinflora2 + Owner: Neutral + Location: 28,95 + Actor701: scrinflora2 + Owner: Neutral + Location: 4,110 + Actor702: scrinflora2 + Owner: Neutral + Location: 52,141 + Actor703: scrinflora3 + Owner: Neutral + Location: 57,90 + Actor704: scrinflora3 + Owner: Neutral + Location: 3,57 + Actor705: scrinflora3 + Owner: Neutral + Location: 54,22 + Actor706: scrinflora4 + Owner: Neutral + Location: 71,43 + Actor707: scrinflora4 + Owner: Neutral + Location: 94,71 + Actor708: scrinflora4 + Owner: Neutral + Location: 93,92 + Actor709: scrinflora4 + Owner: Neutral + Location: 7,105 + Actor710: scrinflora4 + Owner: Neutral + Location: 57,109 + Actor711: scrinflora5 + Owner: Neutral + Location: 83,142 + Actor712: scrinflora5 + Owner: Neutral + Location: 95,104 + Actor713: scrinflora5 + Owner: Neutral + Location: 2,16 + Actor714: scrinflora5 + Owner: Neutral + Location: 53,32 + Actor715: scrinflora5 + Owner: Neutral + Location: 5,59 + Actor716: scrinflora5 + Owner: Neutral + Location: 19,73 + Actor717: scrinflora5 + Owner: Neutral + Location: 54,130 + Actor718: scrinflora6 + Owner: Neutral + Location: 25,69 + Actor719: scrinflora7 + Owner: Neutral + Location: 94,102 + Actor720: scrinflora7 + Owner: Neutral + Location: 5,8 + Actor721: scrinflora7 + Owner: Neutral + Location: 28,34 + Actor722: scrinflora7 + Owner: Neutral + Location: 74,38 + Actor723: scrinflora7 + Owner: Neutral + Location: 79,111 + Actor725: scrinflora7 + Owner: Neutral + Location: 2,109 + Actor726: scrinflora14 + Owner: Neutral + Location: 3,110 + Actor727: scrinflora8 + Owner: Neutral + Location: 18,72 + Actor728: scrinflora8 + Owner: Neutral + Location: 3,11 + Actor729: scrinflora8 + Owner: Neutral + Location: 91,105 + Actor730: scrinflora8 + Owner: Neutral + Location: 74,59 + Actor731: scrinflora8 + Owner: Neutral + Location: 91,33 + Actor732: scrinflora8 + Owner: Neutral + Location: 52,20 + Actor733: scrinflora14 + Owner: Neutral + Location: 55,23 + Actor734: scrinflora14 + Owner: Neutral + Location: 48,33 + Actor735: scrinflora10 + Owner: Neutral + Location: 48,31 + Actor736: scrinflora13 + Owner: Neutral + Location: 55,32 + Actor737: scrinflora13 + Owner: Neutral + Location: 30,33 + Actor738: scrinflora13 + Owner: Neutral + Location: 5,34 + Actor739: scrinflora13 + Owner: Neutral + Location: 2,94 + Actor740: scrinflora13 + Owner: Neutral + Location: 7,106 + Actor741: scrinflora14 + Owner: Neutral + Location: 53,141 + Actor742: scrinflora10 + Owner: Neutral + Location: 27,68 + Actor743: scrinflora10 + Owner: Neutral + Location: 37,66 + Actor744: scrinflora9 + Owner: Neutral + Location: 2,73 + Actor745: scrinflora10 + Owner: Neutral + Location: 7,29 + Actor746: scrinflora10 + Owner: Neutral + Location: 44,36 + Actor747: scrinflora11 + Owner: Neutral + Location: 43,30 + Actor748: scrinflora11 + Owner: Neutral + Location: 55,33 + Actor749: scrinflora11 + Owner: Neutral + Location: 59,10 + Actor750: scrinflora12 + Owner: Neutral + Location: 93,32 + Actor751: scrinflora11 + Owner: Neutral + Location: 90,33 + Actor752: scrinflora9 + Owner: Neutral + Location: 93,33 + Actor753: scrinflora12 + Owner: Neutral + Location: 72,41 + Actor754: scrinflora10 + Owner: Neutral + Location: 70,43 + Actor755: scrinflora11 + Owner: Neutral + Location: 70,35 + Actor756: scrinflora13 + Owner: Neutral + Location: 72,36 + Actor757: scrinflora14 + Owner: Neutral + Location: 81,43 + Actor758: scrinflora12 + Owner: Neutral + Location: 94,104 + Actor759: scrinflora14 + Owner: Neutral + Location: 92,103 + Actor760: scrinflora11 + Owner: Neutral + Location: 93,104 + Actor761: scrinflora9 + Owner: Neutral + Location: 93,103 + Actor762: scrinflora9 + Owner: Neutral + Location: 95,106 + Actor763: scrinflora11 + Owner: Neutral + Location: 93,106 + Actor764: swal + Owner: ScrinRebels + Location: 78,118 + Health: 37 + Actor765: swal + Owner: ScrinRebels + Location: 79,118 + Actor766: swal + Owner: ScrinRebels + Location: 80,134 + Actor767: swal + Owner: ScrinRebels + Location: 81,134 + Actor768: swal + Owner: ScrinRebels + Location: 82,134 + Actor770: swal + Owner: ScrinRebels + Location: 87,118 + Actor771: swal + Owner: ScrinRebels + Location: 85,118 + Health: 34 + Actor777: swal + Owner: ScrinRebels + Location: 85,117 + Health: 13 + Actor778: swal + Owner: ScrinRebels + Location: 86,117 + Actor779: swal + Owner: ScrinRebels + Location: 87,117 + Actor780: swal + Owner: ScrinRebels + Location: 85,119 + Actor781: swal + Owner: ScrinRebels + Location: 86,119 + Health: 52 + L1: waypoint + Owner: Neutral + Location: 16,104 + M1: waypoint + Owner: Neutral + Location: 39,102 + R1: waypoint + Owner: Neutral + Location: 53,118 + L2: waypoint + Owner: Neutral + Location: 19,82 + L3: waypoint + Owner: Neutral + Location: 8,63 + M2: waypoint + Owner: Neutral + Location: 50,83 + M3: waypoint + Owner: Neutral + Location: 29,47 + R4: waypoint + Owner: Neutral + Location: 63,65 + R5: waypoint + Owner: Neutral + Location: 88,47 + M5: waypoint + Owner: Neutral + Location: 61,37 + L4: waypoint + Owner: Neutral + Location: 12,29 + M4: waypoint + Owner: Neutral + Location: 39,32 + R2: waypoint + Owner: Neutral + Location: 73,104 + R3: waypoint + Owner: Neutral + Location: 74,85 + Actor772: gunw + Owner: Scrin + Location: 8,86 + Facing: 174 + Actor773: gunw + Owner: Scrin + Location: 17,87 + Facing: 904 + Actor774: gunw + Owner: Scrin + Location: 29,70 + Facing: 15 + Actor775: gunw + Owner: Scrin + Location: 30,67 + Facing: 79 + Actor776: gunw + Owner: Scrin + Location: 32,68 + Facing: 79 + Actor782: intl + Owner: Scrin + Location: 41,86 + Facing: 872 + Actor783: intl + Owner: Scrin + Location: 44,89 + Facing: 935 + Actor784: corr + Owner: Scrin + Location: 37,91 + Facing: 864 + Actor785: s2 + Owner: Scrin + SubCell: 3 + Location: 18,88 + Facing: 904 + Actor786: s2 + Owner: Scrin + SubCell: 3 + Location: 7,90 + Facing: 71 + Actor787: s1 + Owner: Scrin + SubCell: 3 + Location: 32,70 + Facing: 95 + Actor788: s1 + Owner: Scrin + SubCell: 3 + Location: 30,69 + Facing: 111 + Actor789: s1 + Owner: Scrin + SubCell: 3 + Location: 32,65 + Facing: 95 + Actor790: s1 + Owner: Scrin + Facing: 384 + Location: 76,98 + Actor791: s1 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 83,97 + Actor792: s1 + Owner: Scrin + SubCell: 3 + Location: 83,95 + Facing: 713 + Actor793: s1 + Owner: Scrin + SubCell: 3 + Location: 74,91 + Facing: 0 + Actor794: s1 + Owner: Scrin + SubCell: 3 + Location: 79,92 + Facing: 888 + Actor795: seek + Owner: Scrin + Location: 79,98 + Facing: 737 + Actor796: seek + Owner: Scrin + Location: 77,91 + Facing: 79 + Actor797: seek + Owner: Scrin + Location: 83,91 + Facing: 95 + Actor798: gunw + Owner: Scrin + Location: 68,102 + Facing: 824 + Actor799: s3 + Owner: Scrin + SubCell: 3 + Location: 68,103 + Facing: 705 + Actor800: s3 + Owner: Scrin + Location: 67,102 + SubCell: 3 + Facing: 71 + Actor801: s3 + Owner: Scrin + Location: 48,94 + SubCell: 3 + Facing: 0 + Actor802: s3 + Owner: Scrin + SubCell: 3 + Location: 34,87 + Facing: 7 + Actor803: seek + Owner: Scrin + Location: 57,95 + Facing: 896 + Actor804: lace + Owner: Scrin + Location: 5,70 + Facing: 911 + Actor805: lace + Owner: Scrin + Location: 6,71 + Facing: 927 + Actor806: devo + Owner: Scrin + Location: 8,101 + Facing: 880 + Actor807: devo + Owner: Scrin + Location: 10,103 + Facing: 880 + Actor808: s1 + Owner: Scrin + SubCell: 3 + Location: 10,102 + Facing: 872 + Actor809: s1 + Owner: Scrin + SubCell: 3 + Location: 7,102 + Facing: 761 + Actor810: s1 + Owner: Scrin + SubCell: 3 + Location: 7,100 + Facing: 729 + Actor811: s1 + Owner: Scrin + SubCell: 3 + Location: 11,104 + Facing: 0 + Actor812: corr + Owner: Scrin + Location: 44,126 + Facing: 745 + Actor814: lchr + Owner: Scrin + Location: 32,123 + Facing: 697 + Actor815: lchr + Owner: Scrin + Location: 49,134 + Facing: 896 + Actor816: lchr + Owner: Scrin + Location: 52,102 + Facing: 919 + Actor817: s4 + Owner: Scrin + SubCell: 3 + Location: 52,104 + Facing: 935 + Actor818: s4 + Owner: Scrin + SubCell: 3 + Location: 49,103 + Facing: 824 + Actor819: s1 + Owner: Scrin + SubCell: 3 + Location: 39,85 + Facing: 0 + Actor820: s1 + Owner: Scrin + Location: 39,85 + SubCell: 1 + Facing: 0 + Actor821: s1 + Owner: Scrin + SubCell: 3 + Location: 42,85 + Facing: 0 + Actor822: s1 + Owner: Scrin + SubCell: 3 + Location: 43,86 + Facing: 0 + Actor823: s1 + Owner: Scrin + SubCell: 3 + Location: 48,91 + Facing: 713 + Actor824: s4 + Owner: Scrin + SubCell: 3 + Location: 35,90 + Facing: 0 + Actor825: ruin + Owner: Scrin + Location: 34,120 + Facing: 682 + Actor826: gunw + Owner: Scrin + Location: 14,121 + Facing: 103 + Actor827: gunw + Owner: Scrin + Location: 26,109 + Facing: 71 + Actor828: gunw + Owner: Scrin + Location: 11,108 + Facing: 967 + Actor829: gunw + Owner: ScrinRebels + Facing: 384 + Location: 53,74 + Actor830: gunw + Owner: ScrinRebels + Location: 64,77 + Facing: 531 + Actor831: devo + Owner: ScrinRebels + Facing: 384 + Location: 59,71 + Actor832: corr + Owner: ScrinRebels + Location: 67,78 + Facing: 531 + Actor833: intl + Owner: ScrinRebels + Facing: 384 + Location: 60,77 + Actor834: intl + Owner: ScrinRebels + Facing: 384 + Location: 48,67 + Actor835: intl + Owner: ScrinRebels + Facing: 384 + Location: 71,69 + Actor836: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 52,63 + Actor837: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 49,62 + Actor838: s1 + Owner: ScrinRebels + Location: 50,63 + SubCell: 3 + Facing: 384 + Actor839: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 56,58 + Actor840: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 70,70 + Actor841: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 60,72 + Actor842: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 59,70 + Actor843: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 65,78 + Actor844: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 57,74 + Actor845: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 47,66 + Actor847: rtpd + Owner: Scrin + Facing: 721 + Location: 49,119 + Actor848: corr + Owner: Scrin + Facing: 856 + Location: 57,132 + Actor849: s1 + Owner: Scrin + SubCell: 3 + Facing: 816 + Location: 50,129 + Actor850: s1 + Owner: Scrin + SubCell: 3 + Facing: 753 + Location: 51,132 + Actor851: s1 + Owner: Scrin + SubCell: 3 + Facing: 824 + Location: 51,135 + Actor852: rea2 + Owner: ScrinRebels + Location: 76,5 + Actor853: rea2 + Owner: ScrinRebels + Location: 79,5 + Actor854: sfac + Owner: ScrinRebels + Location: 77,9 + Actor855: scrt + Owner: ScrinRebels + Location: 83,6 + Actor846: rtpd + Owner: Scrin + Location: 11,89 + Facing: 840 + Actor870: camera + Owner: Scrin + Location: 80,126 + Actor871: camera + Owner: Scrin + Location: 60,70 + Actor872: camera + Owner: Scrin + Location: 79,19 + Actor873: camera + Owner: Scrin + Location: 22,22 + Actor874: camera + Owner: Scrin + Location: 36,15 + Actor875: camera + Owner: Scrin + Location: 26,43 + Exterminator1Patrol1: waypoint + Owner: Neutral + Location: 77,125 + Exterminator1Patrol2: waypoint + Owner: Neutral + Location: 82,121 + Exterminator1Patrol3: waypoint + Owner: Neutral + Location: 86,125 + Exterminator1Patrol4: waypoint + Owner: Neutral + Location: 82,130 + Exterminator2Patrol1: waypoint + Owner: Neutral + Location: 61,71 + Exterminator2Patrol2: waypoint + Owner: Neutral + Location: 54,65 + Exterminator2Patrol3: waypoint + Owner: Neutral + Location: 63,59 + Exterminator2Patrol4: waypoint + Owner: Neutral + Location: 70,66 + Exterminator3Patrol1: waypoint + Owner: Neutral + Location: 79,21 + Exterminator3Patrol2: waypoint + Owner: Neutral + Location: 72,13 + Exterminator3Patrol3: waypoint + Owner: Neutral + Location: 80,8 + Exterminator3Patrol4: waypoint + Owner: Neutral + Location: 87,14 + Actor878: seek + Owner: Scrin + Location: 34,50 + Facing: 1023 + Actor879: seek + Owner: Scrin + Location: 32,49 + Facing: 1023 + Actor880: gunw + Owner: ScrinRebels + Location: 69,77 + Facing: 467 + Actor882: s3 + Owner: ScrinRebels + Facing: 384 + Location: 71,77 + SubCell: 3 + Actor191: tpod + Owner: Scrin + Location: 35,22 + Facing: 935 + Health: 65 + Actor876: lace + Owner: ScrinRebels + Facing: 384 + Location: 87,121 + Actor877: lace + Owner: ScrinRebels + Location: 89,122 + Facing: 333 + ExterminatorSpawnWest: waypoint + Owner: Neutral + Location: 20,127 + Actor881: lace + Owner: ScrinRebels + Location: 86,129 + Facing: 222 + Actor884: gunw + Owner: ScrinRebels + Facing: 384 + Location: 74,77 + Actor856: gunw + Owner: ScrinRebels + Facing: 384 + Location: 89,120 + Actor857: gunw + Owner: ScrinRebels + Facing: 384 + Location: 81,79 + Actor858: gunw + Owner: ScrinRebels + Facing: 384 + Location: 80,77 + Actor886: devo + Owner: ScrinRebels + Facing: 384 + Location: 60,67 + Exterminator2: etpd + Owner: Scrin + Facing: 0 + Location: 26,114 + Exterminator1: etpd + Owner: Scrin + Facing: 0 + Location: 19,114 + GravityStabilizer1: grav + Owner: Scrin + Location: 24,129 + Actor883: gscr + Owner: Scrin + SubCell: 3 + Location: 22,129 + Facing: 832 + Actor888: gscr + Owner: Scrin + SubCell: 3 + Location: 18,129 + Facing: 0 + Actor889: gscr + Owner: Scrin + SubCell: 3 + Location: 17,131 + Facing: 959 + Actor890: gscr + Owner: Scrin + SubCell: 3 + Location: 18,133 + Facing: 1023 + Actor891: gscr + Owner: Scrin + SubCell: 3 + Location: 23,132 + Facing: 0 + Actor893: s4 + Owner: Scrin + SubCell: 3 + Location: 11,123 + Facing: 166 + Actor894: s4 + Owner: Scrin + SubCell: 3 + Location: 11,134 + Facing: 570 + Actor895: s4 + Owner: Scrin + SubCell: 3 + Location: 35,134 + Facing: 1023 + Actor896: s4 + Owner: Scrin + SubCell: 3 + Location: 29,133 + Facing: 0 + Actor897: s4 + Owner: Scrin + SubCell: 3 + Location: 22,136 + Facing: 563 + Actor898: s4 + Owner: Scrin + Facing: 384 + SubCell: 1 + Location: 11,134 + Actor899: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 10,127 + Actor900: s4 + Owner: Scrin + Location: 37,130 + SubCell: 3 + Facing: 761 + Actor887: splitblue + Owner: Neutral + Location: 51,7 + Actor885: splitblue + Owner: Neutral + Location: 45,4 + Actor901: splitblue + Owner: Neutral + Location: 15,45 + Actor902: splitblue + Owner: Neutral + Location: 12,48 + Actor903: splitblue + Owner: Neutral + Location: 16,51 + Actor904: splitblue + Owner: Neutral + Location: 53,43 + Actor905: camera + Owner: Scrin + Location: 54,47 + Actor908: camera + Owner: Scrin + Location: 41,43 + A2APatrol1: waypoint + Owner: Neutral + Location: 43,138 + A2APatrol2: waypoint + Owner: Neutral + Location: 55,123 + A2APatrol3: waypoint + Owner: Neutral + Location: 51,107 + A2APatrol4: waypoint + Owner: Neutral + Location: 35,100 + A2APatrol5: waypoint + Owner: Neutral + Location: 19,101 + A2APatrol6: waypoint + Owner: Neutral + Location: 7,113 + A2APatrol7: waypoint + Owner: Neutral + Location: 4,126 + A2APatrol8: waypoint + Owner: Neutral + Location: 10,134 + Actor909: sfac + Owner: Scrin + Location: 128,125 + Actor910: sign + Owner: Scrin + Location: 133,123 + Actor911: swal + Owner: Scrin + Location: 118,137 + Actor912: swal + Owner: Scrin + Location: 119,137 + Actor913: swal + Owner: Scrin + Location: 120,137 + Actor914: swal + Owner: Scrin + Location: 118,136 + Actor915: swal + Owner: Scrin + Location: 118,135 + Actor916: swal + Owner: Scrin + Location: 119,135 + Actor917: swal + Owner: Scrin + Location: 120,135 + Actor918: swal + Owner: Scrin + Location: 120,136 + Actor919: swal + Owner: Scrin + Location: 105,128 + Actor920: swal + Owner: Scrin + Location: 105,127 + Actor921: swal + Owner: Scrin + Location: 105,126 + Actor922: swal + Owner: Scrin + Location: 105,125 + Actor923: swal + Owner: Scrin + Location: 106,128 + Actor924: swal + Owner: Scrin + Location: 107,128 + Actor925: swal + Owner: Scrin + Location: 107,127 + Actor926: swal + Owner: Scrin + Location: 107,126 + Actor927: swal + Owner: Scrin + Location: 106,126 + Actor928: swal + Owner: Scrin + Location: 106,136 + Actor929: swal + Owner: Scrin + Location: 107,136 + Actor930: swal + Owner: Scrin + Location: 108,136 + Actor931: swal + Owner: Scrin + Location: 106,135 + Actor932: swal + Owner: Scrin + Location: 106,134 + Actor933: swal + Owner: Scrin + Location: 107,134 + Actor934: swal + Owner: Scrin + Location: 108,134 + Actor935: swal + Owner: Scrin + Location: 108,135 + Actor936: swal + Owner: Scrin + Location: 132,134 + Actor937: swal + Owner: Scrin + Location: 133,134 + Actor938: swal + Owner: Scrin + Location: 134,134 + Actor939: swal + Owner: Scrin + Location: 134,133 + Actor940: swal + Owner: Scrin + Location: 134,132 + Actor941: swal + Owner: Scrin + Location: 132,133 + Actor942: swal + Owner: Scrin + Location: 132,132 + Actor943: swal + Owner: Scrin + Location: 133,132 + Actor944: swal + Owner: Scrin + Location: 134,131 + Actor945: swal + Owner: Scrin + Location: 134,130 + Actor946: swal + Owner: Scrin + Location: 135,130 + Actor947: swal + Owner: Scrin + Location: 135,129 + Actor948: swal + Owner: Scrin + Location: 135,128 + Actor949: swal + Owner: Scrin + Location: 135,127 + Actor950: swal + Owner: Scrin + Location: 134,127 + Actor951: swal + Owner: Scrin + Location: 133,127 + Actor952: swal + Owner: Scrin + Location: 133,128 + Actor953: swal + Owner: Scrin + Location: 133,129 + Actor954: swal + Owner: Scrin + Location: 134,129 + Actor955: swal + Owner: Scrin + Location: 135,126 + Actor956: swal + Owner: Scrin + Location: 136,126 + Actor957: swal + Owner: Scrin + Location: 136,125 + Actor958: swal + Owner: Scrin + Location: 136,124 + Actor959: swal + Owner: Scrin + Location: 136,123 + Actor960: swal + Owner: Scrin + Location: 136,122 + Actor961: swal + Owner: Scrin + Location: 135,122 + Actor963: swal + Owner: Scrin + Location: 135,119 + Actor962: swal + Owner: Scrin + Location: 135,121 + Actor964: swal + Owner: Scrin + Location: 135,120 + Actor965: swal + Owner: Scrin + Location: 135,118 + Actor966: swal + Owner: Scrin + Location: 135,117 + Actor967: swal + Owner: Scrin + Location: 135,116 + Actor968: swal + Owner: Scrin + Location: 136,116 + Actor969: swal + Owner: Scrin + Location: 136,115 + Actor970: swal + Owner: Scrin + Location: 136,114 + Actor971: swal + Owner: Scrin + Location: 137,114 + Actor972: swal + Owner: Scrin + Location: 138,114 + Actor973: swal + Owner: Scrin + Location: 139,114 + Actor974: swal + Owner: Scrin + Location: 140,114 + Actor975: swal + Owner: Scrin + Location: 140,113 + Actor976: swal + Owner: Scrin + Location: 141,113 + Actor977: swal + Owner: Scrin + Location: 142,113 + Actor978: swal + Owner: Scrin + Location: 142,112 + Actor981: swal + Owner: Scrin + Location: 142,109 + Actor982: swal + Owner: Scrin + Location: 142,108 + Actor983: swal + Owner: Scrin + Location: 141,108 + Actor984: swal + Owner: Scrin + Location: 140,108 + Actor985: swal + Owner: Scrin + Location: 139,108 + Actor986: swal + Owner: Scrin + Location: 138,108 + Actor987: swal + Owner: Scrin + Location: 137,108 + Actor988: swal + Owner: Scrin + Location: 136,108 + Actor989: swal + Owner: Scrin + Location: 134,108 + Actor990: swal + Owner: Scrin + Location: 135,108 + Actor991: swal + Owner: Scrin + Location: 134,107 + Actor992: swal + Owner: Scrin + Location: 133,107 + Actor993: swal + Owner: Scrin + Location: 132,107 + Actor994: swal + Owner: Scrin + Location: 132,108 + Actor995: swal + Owner: Scrin + Location: 132,109 + Actor996: swal + Owner: Scrin + Location: 133,109 + Actor997: swal + Owner: Scrin + Location: 134,109 + Actor998: swal + Owner: Scrin + Location: 124,107 + Actor999: swal + Owner: Scrin + Location: 124,108 + Actor1000: swal + Owner: Scrin + Location: 124,109 + Actor1001: swal + Owner: Scrin + Location: 123,109 + Actor1002: swal + Owner: Scrin + Location: 122,109 + Actor1003: swal + Owner: Scrin + Location: 122,108 + Actor1004: swal + Owner: Scrin + Location: 122,107 + Actor1005: swal + Owner: Scrin + Location: 123,107 + Actor1006: swal + Owner: Scrin + Location: 121,108 + Actor1007: swal + Owner: Scrin + Location: 120,108 + Actor1008: swal + Owner: Scrin + Location: 119,108 + Actor1009: swal + Owner: Scrin + Location: 119,107 + Actor1010: swal + Owner: Scrin + Location: 118,107 + Actor1011: swal + Owner: Scrin + Location: 117,107 + Actor1015: swal + Owner: Scrin + Location: 117,109 + Actor1016: swal + Owner: Scrin + Location: 118,109 + Actor1017: swal + Owner: Scrin + Location: 119,109 + Actor1018: swal + Owner: Scrin + Location: 117,108 + Actor1012: swal + Owner: Scrin + Location: 116,108 + Actor1013: swal + Owner: Scrin + Location: 115,108 + Actor1014: swal + Owner: Scrin + Location: 114,108 + Actor1019: swal + Owner: Scrin + Location: 113,107 + Actor1020: swal + Owner: Scrin + Location: 114,107 + Actor1021: swal + Owner: Scrin + Location: 114,109 + Actor1022: swal + Owner: Scrin + Location: 113,109 + Actor1023: swal + Owner: Scrin + Location: 112,109 + Actor1024: swal + Owner: Scrin + Location: 112,107 + Actor1025: swal + Owner: Scrin + Location: 112,108 + Actor1026: swal + Owner: Scrin + Location: 111,108 + Actor1027: swal + Owner: Scrin + Location: 110,108 + Actor1028: swal + Owner: Scrin + Location: 109,108 + Actor1029: swal + Owner: Scrin + Location: 108,108 + Actor1030: swal + Owner: Scrin + Location: 108,109 + Actor1031: swal + Owner: Scrin + Location: 108,110 + Actor1032: swal + Owner: Scrin + Location: 108,111 + Actor1033: swal + Owner: Scrin + Location: 107,111 + Actor1034: swal + Owner: Scrin + Location: 107,112 + Actor1035: swal + Owner: Scrin + Location: 107,113 + Actor1036: swal + Owner: Scrin + Location: 106,113 + Actor1037: swal + Owner: Scrin + Location: 106,114 + Actor1038: swal + Owner: Scrin + Location: 106,115 + Actor1039: swal + Owner: Scrin + Location: 105,115 + Actor1040: swal + Owner: Scrin + Location: 107,115 + Actor1041: swal + Owner: Scrin + Location: 105,116 + Actor1042: swal + Owner: Scrin + Location: 105,117 + Actor1043: swal + Owner: Scrin + Location: 106,117 + Actor1044: swal + Owner: Scrin + Location: 107,117 + Actor1045: swal + Owner: Scrin + Location: 107,116 + Actor1046: swal + Owner: Scrin + Location: 105,122 + Actor1047: swal + Owner: Scrin + Location: 106,122 + Actor1048: swal + Owner: Scrin + Location: 107,122 + Actor1049: swal + Owner: Scrin + Location: 107,123 + Actor1050: swal + Owner: Scrin + Location: 107,124 + Actor1051: swal + Owner: Scrin + Location: 106,124 + Actor1052: swal + Owner: Scrin + Location: 105,124 + Actor1053: swal + Owner: Scrin + Location: 105,123 + Actor1054: swal + Owner: Scrin + Location: 106,125 + Actor1055: scol + Owner: Scrin + Location: 107,135 + Actor1056: scol + Owner: Scrin + Location: 106,127 + Actor1057: scol + Owner: Scrin + Location: 106,123 + Actor1058: scol + Owner: Scrin + Location: 119,136 + Actor1059: scol + Owner: Scrin + Location: 133,133 + Actor1060: scol + Owner: Scrin + Location: 134,128 + Actor1061: scol + Owner: Scrin + Location: 133,108 + Actor1062: scol + Owner: Scrin + Location: 123,108 + Actor1063: scol + Owner: Scrin + Location: 118,108 + Actor1064: scol + Owner: Scrin + Location: 113,108 + Actor1065: scol + Owner: Scrin + Location: 106,116 + Actor1066: shar + Owner: Scrin + Location: 109,109 + Actor1067: shar + Owner: Scrin + Location: 107,114 + Actor1068: shar + Owner: Scrin + Location: 135,109 + Actor1069: shar + Owner: Scrin + Location: 135,115 + Actor1070: shar + Owner: Scrin + Location: 134,121 + Actor1071: shar + Owner: Scrin + Location: 123,136 + Actor1072: shar + Owner: Scrin + Location: 129,133 + Actor1073: shar + Owner: Scrin + Location: 114,136 + Actor1074: shar + Owner: Scrin + Location: 103,132 + Actor1075: shar + Owner: Scrin + Location: 100,103 + Actor1076: scol + Owner: Scrin + Location: 97,101 + Actor1077: scol + Owner: Scrin + Location: 102,99 + Actor1078: ptur + Owner: Scrin + Location: 124,106 + Actor1079: ptur + Owner: Scrin + Location: 132,106 + Actor1080: ptur + Owner: Scrin + Location: 104,117 + Actor1081: ptur + Owner: Scrin + Location: 104,122 + Actor1082: shar + Owner: Scrin + Location: 116,109 + Actor1083: shar + Owner: Scrin + Location: 121,109 + Exterminator7: etpd + Owner: Scrin + Location: 126,106 + Facing: 0 + Exterminator8: etpd + Owner: Scrin + Location: 130,106 + Facing: 0 + Exterminator6: etpd + Owner: Scrin + Location: 104,113 + Facing: 384 + Exterminator5: etpd + Owner: Scrin + Location: 102,123 + Facing: 134 + WarpSphere3: wsph + Owner: Scrin + Location: 112,122 + Actor1098: rea2 + Owner: Scrin + Location: 118,130 + Actor1099: rea2 + Owner: Scrin + Location: 118,127 + Actor1100: rea2 + Owner: Scrin + Location: 118,124 + RiftGenerator: rfgn + Owner: Scrin + Location: 112,130 + Actor1094: nerv + Owner: Scrin + Location: 140,110 + Actor1107: silo.scrin + Owner: Scrin + Location: 137,113 + Actor1108: silo.scrin + Owner: Scrin + Location: 138,113 + Actor1109: silo.scrin + Owner: Scrin + Location: 137,109 + Actor1110: silo.scrin + Owner: Scrin + Location: 138,109 + Actor1111: swal + Owner: Scrin + Location: 111,130 + Actor1112: swal + Owner: Scrin + Location: 111,129 + Actor1113: swal + Owner: Scrin + Location: 111,131 + Actor1114: swal + Owner: Scrin + Location: 111,132 + Actor1115: swal + Owner: Scrin + Location: 112,132 + Actor1116: swal + Owner: Scrin + Location: 113,132 + Actor1117: swal + Owner: Scrin + Location: 114,132 + Actor1118: swal + Owner: Scrin + Location: 114,131 + Actor1119: swal + Owner: Scrin + Location: 114,130 + Actor1120: swal + Owner: Scrin + Location: 114,129 + Actor1121: swal + Owner: Scrin + Location: 113,129 + Actor1122: swal + Owner: Scrin + Location: 112,129 + Actor1123: swal + Owner: Scrin + Location: 110,128 + Actor1124: swal + Owner: Scrin + Location: 110,129 + Actor1125: swal + Owner: Scrin + Location: 111,128 + Actor1126: swal + Owner: Scrin + Location: 114,128 + Actor1127: swal + Owner: Scrin + Location: 115,128 + Actor1128: swal + Owner: Scrin + Location: 115,129 + Actor1129: swal + Owner: Scrin + Location: 115,132 + Actor1130: swal + Owner: Scrin + Location: 114,133 + Actor1131: swal + Owner: Scrin + Location: 115,133 + Actor1132: swal + Owner: Scrin + Location: 110,132 + Actor1133: swal + Owner: Scrin + Location: 110,133 + Actor1134: swal + Owner: Scrin + Location: 111,133 + Actor1138: rea2 + Owner: Scrin + Location: 122,123 + Actor1135: rea2 + Owner: Scrin + Location: 122,126 + Actor1136: rea2 + Owner: Scrin + Location: 122,129 + Actor1137: rea2 + Owner: Scrin + Location: 122,132 + Actor1139: scrt + Owner: Scrin + Location: 126,133 + Actor1140: rea2 + Owner: Scrin + Location: 15,125 + WarpSphere4: wsph + Owner: Scrin + Location: 130,112 + Actor1145: mani + Owner: Scrin + Location: 124,119 + Actor1146: srep + Owner: Scrin + Location: 114,111 + Actor1147: srep + Owner: Scrin + Location: 110,114 + Portal3: port + Owner: Scrin + Location: 119,118 + Actor1152: rea2 + Owner: Scrin + Location: 127,120 + Actor1153: rea2 + Owner: Scrin + Location: 126,129 + Actor1154: evis + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 107,118 + Actor1155: evis + Owner: Scrin + SubCell: 3 + Location: 107,121 + Facing: 166 + Actor1156: evis + Owner: Scrin + SubCell: 3 + Location: 126,124 + Facing: 134 + Actor1157: evis + Owner: Scrin + SubCell: 3 + Location: 125,125 + Facing: 642 + Actor1159: evis + Owner: Scrin + SubCell: 3 + Location: 132,123 + Facing: 261 + Actor1160: evis + Owner: Scrin + SubCell: 3 + Location: 130,131 + Facing: 1023 + Actor1161: evis + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 119,123 + Actor1162: evis + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 122,120 + Actor1163: evis + Owner: Scrin + SubCell: 3 + Location: 110,125 + Facing: 237 + Actor1164: evis + Owner: Scrin + SubCell: 3 + Location: 124,116 + Facing: 594 + Actor1165: evis + Owner: Scrin + SubCell: 3 + Location: 120,112 + Facing: 919 + Actor1166: s4 + Owner: Scrin + SubCell: 3 + Location: 122,118 + Facing: 190 + Actor1167: s4 + Owner: Scrin + SubCell: 3 + Location: 134,111 + Facing: 269 + Actor1168: s4 + Owner: Scrin + Location: 119,113 + SubCell: 3 + Facing: 578 + Actor1169: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 109,129 + Actor1170: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 117,136 + Actor1171: s4 + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 106,132 + Actor1172: deva + Owner: Scrin + Location: 111,111 + Facing: 150 + Actor1173: deva + Owner: Scrin + Location: 122,112 + Facing: 142 + Actor1174: split2 + Owner: Neutral + Location: 128,92 + Actor1175: split2 + Owner: Neutral + Location: 125,96 + Actor1176: split2 + Owner: Neutral + Location: 129,99 + Actor1177: split2 + Owner: Neutral + Location: 136,98 + Actor1179: swal + Owner: Scrin + Location: 144,108 + Actor1180: swal + Owner: Scrin + Location: 143,109 + Actor1181: swal + Owner: Scrin + Location: 144,109 + Actor1182: swal + Owner: Scrin + Location: 144,110 + Actor1183: swal + Owner: Scrin + Location: 144,111 + Actor1184: swal + Owner: Scrin + Location: 144,112 + Actor1185: swal + Owner: Scrin + Location: 143,113 + Actor1186: swal + Owner: Scrin + Location: 143,112 + Actor1187: silo.scrin + Owner: Scrin + Location: 143,110 + Actor1188: silo.scrin + Owner: Scrin + Location: 143,111 + Actor1178: scol + Owner: Scrin + Location: 143,108 + Actor1189: swal + Owner: Scrin + Location: 144,107 + Actor1190: swal + Owner: Scrin + Location: 142,107 + Actor1191: swal + Owner: Scrin + Location: 143,107 + Actor1192: scrinflora7 + Owner: Neutral + Location: 124,65 + Actor1193: scrinflora4 + Owner: Neutral + Location: 125,62 + Actor1194: scrinflora8 + Owner: Neutral + Location: 123,63 + Actor1195: scrinflora13 + Owner: Neutral + Location: 126,64 + Actor1196: scrinflora12 + Owner: Neutral + Location: 125,63 + Actor1197: scrinflora11 + Owner: Neutral + Location: 124,61 + Actor1198: scrinflora14 + Owner: Neutral + Location: 126,63 + Actor1199: scrinflora9 + Owner: Neutral + Location: 122,59 + Actor1200: scrinflora5 + Owner: Neutral + Location: 128,65 + Actor1201: scrinflora6 + Owner: Neutral + Location: 133,56 + Actor1202: scrinflora2 + Owner: Neutral + Location: 116,56 + Actor1203: scrinflora1 + Owner: Neutral + Location: 133,55 + Actor1204: scrinflora7 + Owner: Neutral + Location: 108,72 + Actor1205: scrinflora11 + Owner: Neutral + Location: 108,67 + Actor1206: scrinflora12 + Owner: Neutral + Location: 117,62 + Actor1207: scrinflora13 + Owner: Neutral + Location: 131,53 + Actor1208: scrinflora14 + Owner: Neutral + Location: 132,69 + Actor1209: scrinflora2 + Owner: Neutral + Location: 131,85 + Actor1210: scrinflora1 + Owner: Neutral + Location: 121,88 + Actor1211: scrinflora3 + Owner: Neutral + Location: 132,84 + Actor1212: scrinflora11 + Owner: Neutral + Location: 130,85 + Actor1213: scrinflora10 + Owner: Neutral + Location: 134,84 + Actor1214: scrinflora13 + Owner: Neutral + Location: 122,88 + Actor1215: scrinflora10 + Owner: Neutral + Location: 120,88 + Actor1216: swal + Owner: Neutral + Location: 118,78 + Health: 13 + Actor1217: swal + Owner: Neutral + Location: 118,77 + Health: 19 + Actor1218: swal + Owner: Neutral + Location: 119,78 + Health: 14 + Actor1219: swal + Owner: Neutral + Location: 119,77 + Health: 63 + Actor1220: swal + Owner: Neutral + Location: 119,76 + Actor1221: swal + Owner: Neutral + Location: 119,75 + Health: 31 + Actor1223: swal + Owner: Neutral + Location: 129,77 + Health: 25 + Actor1224: swal + Owner: Neutral + Location: 129,78 + Health: 14 + Actor1225: swal + Owner: Neutral + Location: 130,78 + Health: 26 + Actor1226: swal + Owner: Neutral + Location: 130,76 + Health: 19 + Actor1227: swal + Owner: Neutral + Location: 131,77 + Health: 28 + Actor1228: swal + Owner: Neutral + Location: 131,76 + Actor1229: swal + Owner: Neutral + Location: 131,78 + Actor1230: swal + Owner: Neutral + Location: 132,77 + Health: 37 + Actor1231: swal + Owner: Neutral + Location: 134,77 + Health: 29 + Actor1232: swal + Owner: Neutral + Location: 133,77 + Health: 67 + Actor1233: swal + Owner: Neutral + Location: 135,77 + Health: 72 + Actor1234: swal + Owner: Neutral + Location: 136,77 + Health: 25 + Actor1235: swal + Owner: Neutral + Location: 136,78 + Actor1236: swal + Owner: Neutral + Location: 137,78 + Health: 58 + Actor1237: swal + Owner: Neutral + Location: 137,79 + Health: 24 + Actor1222: splitblue + Owner: Neutral + Location: 106,46 + Actor1238: splitblue + Owner: Neutral + Location: 106,42 + Actor1239: splitblue + Owner: Neutral + Location: 113,40 + Actor1240: swal + Owner: Neutral + Health: 10 + Location: 134,45 + Actor1241: swal + Owner: Neutral + Health: 59 + Location: 135,45 + Actor1242: swal + Owner: Neutral + Health: 16 + Location: 136,45 + Actor1243: swal + Owner: Neutral + Health: 27 + Location: 135,46 + Actor1244: swal + Owner: Neutral + Health: 73 + Location: 136,46 + Actor1245: swal + Owner: Neutral + Health: 23 + Location: 137,46 + Actor1246: swal + Owner: Neutral + Health: 22 + Location: 142,45 + Actor1247: swal + Owner: Neutral + Health: 86 + Location: 143,45 + Actor1248: swal + Owner: Neutral + Health: 8 + Location: 141,46 + Actor1249: swal + Owner: Neutral + Health: 62 + Location: 142,46 + Actor1250: swal + Owner: Neutral + Health: 17 + Location: 143,46 + Actor1251: splitblue + Owner: Neutral + Location: 137,11 + Actor1252: splitblue + Owner: Neutral + Location: 136,18 + Actor1253: splitblue + Owner: Neutral + Location: 109,12 + Actor1254: splitblue + Owner: Neutral + Location: 106,16 + Actor1255: scrinflora1 + Owner: Neutral + Location: 139,33 + Actor1256: scrinflora7 + Owner: Neutral + Location: 133,29 + Actor1257: scrinflora8 + Owner: Neutral + Location: 110,31 + Actor1258: scrinflora13 + Owner: Neutral + Location: 119,36 + Actor1259: scrinflora12 + Owner: Neutral + Location: 136,31 + Actor1260: scrinflora10 + Owner: Neutral + Location: 136,36 + Actor1261: scrinflora9 + Owner: Neutral + Location: 138,41 + Actor1262: scrinflora6 + Owner: Neutral + Location: 107,24 + Actor1263: scrinflora2 + Owner: Neutral + Location: 109,2 + Actor1264: scrinflora5 + Owner: Neutral + Location: 136,2 + Actor1265: scrinflora4 + Owner: Neutral + Location: 140,6 + Actor1266: scrinflora13 + Owner: Neutral + Location: 141,25 + Actor1267: scrinflora11 + Owner: Neutral + Location: 140,33 + Actor1268: pdgy + Owner: Scrin + SubCell: 3 + Location: 125,122 + Facing: 142 + Actor1269: pdgy + Owner: Scrin + SubCell: 3 + Location: 24,134 + Facing: 23 + Actor1270: oblt + Owner: Scrin + Location: 115,126 + Facing: 206 + Actor1271: oblt + Owner: Scrin + Location: 136,111 + Facing: 31 + Actor1272: tpod + Owner: ScrinRebels + Location: 113,67 + Facing: 594 + Health: 81 + Actor1273: impl + Owner: ScrinRebels + SubCell: 3 + Location: 114,65 + Facing: 610 + Actor1274: impl + Owner: ScrinRebels + SubCell: 3 + Location: 110,68 + Facing: 674 + Actor1275: rtpd + Owner: Scrin + Location: 116,69 + Facing: 190 + Health: 90 + Actor1276: evis + Owner: Scrin + SubCell: 3 + Location: 118,69 + Facing: 166 + Actor1277: s1 + Owner: Scrin + SubCell: 3 + Location: 114,70 + Facing: 95 + Actor1278: s1 + Owner: Scrin + SubCell: 3 + Location: 116,67 + Facing: 142 + R10: waypoint + Owner: Neutral + Location: 110,56 + Actor1279: ltnk + Owner: Nod + Facing: 512 + Location: 18,7 + Actor1280: ltnk + Owner: Nod + Facing: 512 + Location: 28,7 + Actor1281: devo + Owner: Scrin + Location: 125,74 + Facing: 71 + Actor1282: devo + Owner: Scrin + Location: 128,73 + Facing: 87 + Actor1283: s4 + Owner: Scrin + SubCell: 3 + Location: 127,74 + Facing: 79 + Actor1284: s3 + Owner: Scrin + SubCell: 3 + Location: 130,71 + Facing: 384 + Actor1285: s3 + Owner: Scrin + SubCell: 3 + Location: 126,71 + Facing: 911 + Actor1286: s3 + Owner: Scrin + SubCell: 3 + Location: 123,76 + Facing: 15 + Actor1287: s1 + Owner: Scrin + SubCell: 3 + Location: 125,70 + Facing: 384 + Actor1288: s1 + Owner: Scrin + SubCell: 3 + Location: 123,73 + Facing: 103 + Actor1289: split2 + Owner: Neutral + Location: 94,85 + Actor1290: split2 + Owner: Neutral + Location: 93,81 + Actor1291: proc.scrin + Owner: Scrin + Location: 101,73 + Actor1292: proc.scrin + Owner: Scrin + Location: 97,70 + Actor1293: shar + Owner: Scrin + Location: 100,71 + Actor1294: ptur + Owner: Scrin + Location: 101,78 + TurretFacing: 380 + Actor1295: intl.ai + Owner: Scrin + Location: 109,122 + Facing: 126 + Actor1296: intl.ai + Owner: Scrin + Location: 119,105 + Facing: 0 + Actor1297: sbag + Owner: GDIHostile + Location: 122,20 + Actor1298: sbag + Owner: GDIHostile + Location: 121,20 + Actor1299: sbag + Owner: GDIHostile + Location: 120,20 + Actor1300: sbag + Owner: GDIHostile + Location: 119,20 + Actor1301: sbag + Owner: GDIHostile + Location: 118,20 + Actor1306: sbag + Owner: GDIHostile + Location: 128,20 + Actor1307: sbag + Owner: GDIHostile + Location: 129,20 + Actor1308: sbag + Owner: GDIHostile + Location: 130,20 + Actor1309: sbag + Owner: GDIHostile + Location: 131,20 + Actor1310: sbag + Owner: GDIHostile + Location: 132,20 + Actor1311: sbag + Owner: GDIHostile + Location: 132,19 + Actor1312: sbag + Owner: GDIHostile + Location: 132,18 + Actor1313: sbag + Owner: GDIHostile + Location: 132,17 + Actor1326: sbag + Owner: GDIHostile + Location: 132,5 + Actor1327: sbag + Owner: GDIHostile + Location: 132,7 + Actor1328: sbag + Owner: GDIHostile + Location: 132,6 + Actor1329: sbag + Owner: GDIHostile + Location: 120,24 + Actor1330: sbag + Owner: GDIHostile + Location: 121,24 + Actor1331: sbag + Owner: GDIHostile + Location: 122,24 + Actor1332: sbag + Owner: GDIHostile + Location: 120,23 + Actor1333: sbag + Owner: GDIHostile + Location: 122,23 + Actor1334: sbag + Owner: GDIHostile + Location: 129,23 + Actor1335: sbag + Owner: GDIHostile + Location: 129,24 + Actor1336: sbag + Owner: GDIHostile + Location: 130,24 + Actor1337: sbag + Owner: GDIHostile + Location: 131,24 + Actor1338: sbag + Owner: GDIHostile + Location: 131,23 + Actor1339: gtwr + Owner: GDIHostile + Location: 121,23 + Actor1340: gtwr + Owner: GDIHostile + Location: 130,23 + Actor1341: gtwr + Owner: GDIHostile + Location: 123,20 + Actor1342: gtwr + Owner: GDIHostile + Location: 127,20 + Actor1345: atwr + Owner: GDIHostile + Location: 131,19 + Actor1354: proc.td + Owner: GDIHostile + Location: 129,6 + Actor1321: sbag + Owner: GDIHostile + Location: 118,1 + Actor1322: sbag + Owner: GDIHostile + Location: 119,1 + Actor1323: sbag + Owner: GDIHostile + Location: 120,1 + Actor1324: sbag + Owner: GDIHostile + Location: 131,1 + Actor1325: sbag + Owner: GDIHostile + Location: 132,1 + Actor1348: sbag + Owner: GDIHostile + Location: 132,2 + Actor1356: sbag + Owner: GDIHostile + Location: 132,3 + Actor1357: sbag + Owner: GDIHostile + Location: 132,4 + Actor1358: sbag + Owner: GDIHostile + Location: 129,1 + Actor1359: sbag + Owner: GDIHostile + Location: 130,1 + Actor1360: sbag + Owner: GDIHostile + Location: 128,1 + Actor1361: sbag + Owner: GDIHostile + Location: 127,1 + Actor1362: sbag + Owner: GDIHostile + Location: 122,1 + Actor1363: sbag + Owner: GDIHostile + Location: 121,1 + Actor1364: afac + Owner: GDIHostile + Location: 119,2 + Actor1350: gtek + Owner: GDIHostile + Location: 129,2 + Actor1351: nuk2 + Owner: GDIHostile + Location: 127,2 + Actor1367: nuk2 + Owner: GDIHostile + Location: 122,2 + Actor1368: nuk2 + Owner: GDIHostile + Location: 124,2 + Actor1369: sbag + Owner: GDIHostile + Location: 123,1 + Actor1370: sbag + Owner: GDIHostile + Location: 124,1 + Actor1371: sbag + Owner: GDIHostile + Location: 125,1 + Actor1372: sbag + Owner: GDIHostile + Location: 126,1 + Actor1355: cram + Owner: GDIHostile + Location: 121,9 + Actor1375: cram + Owner: GDIHostile + Location: 130,11 + Actor1377: n1 + Owner: GDIHostile + SubCell: 3 + Location: 128,21 + Facing: 610 + Actor1378: n1 + Owner: GDIHostile + SubCell: 3 + Location: 128,23 + Facing: 467 + Actor1381: n1 + Owner: GDIHostile + SubCell: 3 + Location: 132,24 + Facing: 384 + Actor1382: n1 + Owner: GDIHostile + Location: 119,24 + SubCell: 3 + Facing: 384 + Actor1383: n2 + Owner: GDIHostile + SubCell: 3 + Location: 131,17 + Facing: 384 + Actor1385: ztrp + Owner: GDIHostile + SubCell: 3 + Location: 133,25 + Facing: 384 + Actor1387: htnk.drone + Owner: GDIHostile + Location: 130,26 + Facing: 515 + Actor1388: htnk.ion + Owner: GDIHostile + Location: 117,22 + Facing: 499 + Actor1389: hsam + Owner: GDIHostile + Location: 134,22 + Facing: 384 + Actor1390: hsam + Owner: GDIHostile + Location: 114,18 + Facing: 515 + R7: waypoint + Owner: Neutral + Location: 140,86 + R6: waypoint + Owner: Neutral + Location: 129,39 + R8: waypoint + Owner: Neutral + Location: 100,26 + ScrinBase2: waypoint + Owner: Neutral + Location: 123,122 + ScrinBase1: waypoint + Owner: Neutral + Location: 22,130 + GDIBase: waypoint + Owner: Neutral + Location: 124,13 + Actor1391: scol + Owner: Scrin + Location: 117,88 + Actor1392: scol + Owner: Scrin + Location: 136,87 + Actor1393: swal + Owner: Scrin + Location: 135,88 + Actor1394: swal + Owner: Scrin + Location: 135,87 + Actor1395: swal + Owner: Scrin + Location: 135,86 + Actor1396: swal + Owner: Scrin + Location: 136,86 + Actor1397: swal + Owner: Scrin + Location: 137,86 + Actor1398: swal + Owner: Scrin + Location: 137,87 + Actor1399: swal + Owner: Scrin + Location: 137,88 + Actor1400: swal + Owner: Scrin + Location: 136,88 + Actor1401: swal + Owner: Scrin + Location: 117,89 + Actor1402: swal + Owner: Scrin + Location: 116,89 + Actor1403: swal + Owner: Scrin + Location: 116,88 + Actor1404: swal + Owner: Scrin + Location: 116,87 + Actor1405: swal + Owner: Scrin + Location: 117,87 + Actor1406: swal + Owner: Scrin + Location: 118,87 + Actor1407: swal + Owner: Scrin + Location: 118,88 + Actor1408: swal + Owner: Scrin + Location: 118,89 + Actor1409: tpod + Owner: Scrin + Location: 114,88 + Facing: 15 + Actor1410: tpod + Owner: Scrin + Location: 139,88 + Facing: 0 + Actor1411: evis + Owner: Scrin + SubCell: 3 + Location: 115,90 + Facing: 111 + Actor1412: evis + Owner: Scrin + SubCell: 3 + Location: 119,86 + Facing: 856 + Actor1413: evis + Owner: Scrin + SubCell: 3 + Location: 133,88 + Facing: 0 + Actor1414: evis + Owner: Scrin + Location: 138,86 + SubCell: 3 + Facing: 111 + Actor1415: n3 + SubCell: 3 + Location: 118,15 + Facing: 384 + Owner: GDIHostile + Actor1416: n3 + Location: 133,6 + SubCell: 3 + Facing: 384 + Owner: GDIHostile + Actor1418: n3 + SubCell: 3 + Location: 133,26 + Facing: 384 + Owner: GDIHostile + Actor1420: titn + Location: 129,19 + Facing: 384 + Owner: GDIHostile + Actor1422: titn + Owner: GDIHostile + Location: 128,25 + Facing: 531 + Actor1423: medi + Owner: GDIHostile + SubCell: 3 + Location: 130,21 + Facing: 563 + Actor1424: medi + Owner: GDIHostile + Facing: 384 + Location: 120,21 + SubCell: 3 + Actor1425: medi + Owner: GDIHostile + Facing: 384 + Location: 119,24 + SubCell: 1 + Actor1426: n1 + Owner: GDIHostile + Location: 119,24 + SubCell: 2 + Facing: 578 + Actor1427: n1 + Owner: GDIHostile + SubCell: 3 + Location: 121,25 + Facing: 705 + Actor1428: n1 + Owner: GDIHostile + Facing: 384 + Location: 121,25 + SubCell: 1 + Actor1430: n1 + Owner: GDIHostile + Location: 119,25 + SubCell: 1 + Facing: 475 + Actor1432: n1 + Owner: GDIHostile + Facing: 384 + Location: 117,23 + SubCell: 3 + Actor1433: n1 + Owner: GDIHostile + Facing: 384 + Location: 117,23 + SubCell: 1 + Actor1435: n1 + Owner: GDIHostile + Facing: 384 + Location: 115,22 + SubCell: 3 + Actor1436: n1 + Owner: GDIHostile + Facing: 384 + Location: 115,21 + SubCell: 3 + Actor1437: n1 + Owner: GDIHostile + SubCell: 3 + Location: 125,25 + Facing: 547 + Actor1438: n1 + Owner: GDIHostile + Facing: 384 + Location: 125,25 + SubCell: 1 + Actor1439: n1 + Owner: GDIHostile + Facing: 384 + SubCell: 3 + Location: 132,25 + Actor1429: n3 + Owner: GDIHostile + Facing: 384 + Location: 125,25 + SubCell: 2 + Actor1441: n3 + Owner: GDIHostile + Location: 117,24 + SubCell: 2 + Facing: 563 + Actor1431: n1 + Owner: GDIHostile + Facing: 384 + Location: 130,25 + SubCell: 3 + Actor1434: n1 + Owner: GDIHostile + Facing: 384 + Location: 128,23 + SubCell: 1 + Actor1440: n1 + Owner: GDIHostile + SubCell: 3 + Location: 123,23 + Facing: 491 + Actor1444: n1 + Owner: GDIHostile + Facing: 384 + Location: 123,23 + SubCell: 4 + Actor1445: n1 + Owner: GDIHostile + Location: 123,23 + SubCell: 5 + Facing: 602 + Actor1384: ztrp + Owner: GDIHostile + SubCell: 3 + Location: 121,21 + Facing: 384 + Actor1376: n1 + Owner: GDIHostile + SubCell: 3 + Location: 123,21 + Facing: 384 + Actor1443: camera + Owner: Scrin + Location: 126,23 + ExterminatorSpawnEast: waypoint + Owner: Neutral + Location: 132,117 + R9: waypoint + Owner: Neutral + Location: 112,81 + Exterminator4Patrol1: waypoint + Owner: Neutral + Location: 125,11 + Exterminator4Patrol2: waypoint + Owner: Neutral + Location: 71,52 + Exterminator4Patrol3: waypoint + Owner: Neutral + Location: 11,36 + Exterminator4Patrol4: waypoint + Owner: Neutral + Location: 40,16 + GravityStabilizer2: grav + Owner: Scrin + Location: 27,126 + WarpSphere1: wsph + Owner: Scrin + Location: 26,119 + Actor1447: srep + Owner: Scrin + Location: 21,125 + Actor1419: rea2 + Owner: Scrin + Location: 130,128 + Actor1448: rea2 + Owner: Scrin + Location: 131,119 + Actor1449: evis + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 132,125 + Actor1450: proc.scrin + Owner: Scrin + Location: 122,111 + GravityStabilizer3: grav + Owner: Scrin + Location: 114,114 + Actor1421: sbag + Owner: GDIHostile + Location: 117,20 + Actor1451: sbag + Owner: GDIHostile + Location: 116,20 + Actor1452: sbag + Owner: GDIHostile + Location: 115,20 + Actor1453: sbag + Owner: GDIHostile + Location: 115,19 + Actor1454: sbag + Owner: GDIHostile + Location: 115,18 + Actor1455: sbag + Owner: GDIHostile + Location: 115,8 + Actor1456: sbag + Owner: GDIHostile + Location: 115,7 + Actor1457: sbag + Owner: GDIHostile + Location: 115,6 + Actor1458: sbag + Owner: GDIHostile + Location: 115,5 + Actor1459: sbag + Owner: GDIHostile + Location: 115,4 + Actor1460: sbag + Owner: GDIHostile + Location: 115,3 + Actor1461: sbag + Owner: GDIHostile + Location: 115,2 + Actor1462: sbag + Owner: GDIHostile + Location: 115,1 + Actor1463: sbag + Owner: GDIHostile + Location: 117,1 + Actor1464: sbag + Owner: GDIHostile + Location: 116,1 + Actor1465: n3 + SubCell: 3 + Facing: 384 + Owner: GDIHostile + Location: 114,6 + Actor1417: nuk2 + Owner: GDIHostile + Location: 116,2 + Actor1466: nuk2 + Owner: GDIHostile + Location: 116,5 + Actor1467: nuk2 + Owner: GDIHostile + Location: 121,5 + Actor1468: nuk2 + Owner: GDIHostile + Location: 119,5 + GDIFactory: weap.td + Owner: GDIHostile + Location: 120,14 + GDIBarracks: pyle + Owner: GDIHostile + Location: 128,15 + GDIAirfield: afld.gdi + Owner: GDIHostile + Location: 124,7 + Actor1469: rep + Owner: GDIHostile + Location: 123,9 + Actor1470: hq + Owner: GDIHostile + Location: 127,11 + Actor1471: sbag + Owner: GDIHostile + Location: 115,17 + Actor1472: sbag + Owner: GDIHostile + Location: 115,16 + Actor1473: sbag + Owner: GDIHostile + Location: 115,15 + Actor1474: sbag + Owner: GDIHostile + Location: 115,9 + Actor1475: gtwr + Owner: GDIHostile + Location: 114,16 + Actor1476: gtwr + Owner: GDIHostile + Location: 114,8 + Actor1477: atwr + Owner: GDIHostile + Location: 120,19 + Actor1478: atwr + Owner: GDIHostile + Location: 116,19 + Actor1479: silo.td + Owner: GDIHostile + Location: 117,9 + Actor1480: n3 + Owner: GDIHostile + Location: 117,19 + SubCell: 3 + Facing: 523 + Actor1481: n1 + Owner: GDIHostile + Facing: 384 + Location: 114,17 + SubCell: 3 + Actor1482: n1 + Owner: GDIHostile + SubCell: 3 + Location: 113,9 + Facing: 384 + Actor1483: n1 + Owner: GDIHostile + SubCell: 3 + Location: 113,19 + Facing: 269 + Actor1442: titn + Owner: GDIHostile + Facing: 515 + Location: 123,25 + Actor1484: cram + Owner: GDIHostile + TurretFacing: 832 + Location: 125,15 + GravityStabilizer4: grav + Owner: Scrin + Location: 110,111 + FallenRebel4: srep + Owner: ScrinRebels + Location: 82,123 + Health: 44 + FallenRebel5: reac + Owner: ScrinRebels + Location: 78,128 + Health: 33 + FirstExterminatorDetector: waypoint + Owner: Neutral + Location: 69,122 + ExterminatorFirstSpawn: waypoint + Owner: Neutral + Location: 51,115 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, reckoning-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/main-campaign/ca36-reckoning/overlordwarning.aud b/mods/ca/missions/main-campaign/ca36-reckoning/overlordwarning.aud new file mode 100644 index 0000000000..4f4a0fe7f6 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca36-reckoning/overlordwarning.aud differ diff --git a/mods/ca/missions/main-campaign/ca36-reckoning/reckoning-rules.yaml b/mods/ca/missions/main-campaign/ca36-reckoning/reckoning-rules.yaml new file mode 100644 index 0000000000..6255e7dc60 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca36-reckoning/reckoning-rules.yaml @@ -0,0 +1,278 @@ +^Palettes: + PaletteFromFile@terrain-temperat: + Filename: alien.pal + TintPostProcessEffect: + Red: 1.3 + Green: 1 + Blue: 1.5 + Ambient: 0.5 + FixedColorPalette@BlueTiberium: + Color: ffffff + +^BaseWorld: + TerrainLighting: + ResourceRenderer: + ResourceTypes: + BlueTiberium: + Name: Purified Tiberium + +^BasePlayer: + PlayerResources: + ResourceValues: + BlueTiberium: 25 + +World: + LuaScript: + Scripts: campaign.lua, reckoning.lua + MissionData: + Briefing: The device worked perfectly. Scrin for many miles around are no longer dependent on Tiberium to survive, or have had their dependence significantly reduced. With additional uses of the device, all Scrin can be free of their affliction.\n\nFor us, it means that the Earth can be similarly cleansed, and the tremendous power of Tiberium can be leveraged without side-effects.\n\nNews spread quickly amongst the Scrin of the Overlord's deception. Of course, those willing to trust the word of a human remain a minority, and the effects of the device have not yet spread widely enough to aid in persuading the wider Scrin population.\n\nMany Scrin have risen up against the Overlord's armies however, and we are in the midst of a civil war.\n\nThe Overlord's forces are mobilizing across the planet, so we have precious little time to strike a decisive blow. I have been contacted by a leader amongst the rebels who has indicated where the Overlord's most elite forces are amassing, and it has been suggested that defeating him there will weaken his authority enough to tip the scales in the rebels' favor. At least until the device has made the enormity of what is transpiring evident to all Scrin.\n\nThe rebels have engaged these forces already. Our assistance will be unexpected thanks to our brothers fighting on multiple other fronts, so I want you to take a small force, aid the rebels while our forces accumulate, then destroy the Overlord's primary base in the area before his armies from across the planet arrive. + MapOptions: + ShortGameCheckboxEnabled: False + MusicPlaylist: + StartingMusic: gateway + +Player: + PlayerResources: + DefaultCash: 6000 + +# Purified Tib doesn't damage infantry + +^Infantry: + DamagedByTerrain@TIBDAMAGE: + Terrain: Tiberium + +TMPL: + GrantExternalConditionPowerCA@Frenzy: + -Prerequisites: + +ACOL: + Buildable: + Prerequisites: obliortmpl, anyradar, ~infantry.nod, ~!tmpp + +TPLR: + Buildable: + Prerequisites: obliortmpl, anyradar, ~infantry.nod, ~tmpp + +BH: + Buildable: + Prerequisites: anyradar, ~infantry.nod + +LTNK: + Buildable: + Prerequisites: ~vehicles.nod, ~!lastnk.upgrade + +LTNK.Laser: + Buildable: + Prerequisites: ~vehicles.nod, ~lastnk.upgrade + +MTNK: + Buildable: + Prerequisites: ~!bdrone.upgrade, ~vehicles.gdi + +MTNK.Laser: + Inherits@CAMPAIGNDISABLED: ^Disabled + +FTNK: + Buildable: + Prerequisites: anyradar, ~vehicles.nod + +HFTK: + Buildable: + Prerequisites: anyradar, ~vehicles.nod + +WTNK: + Buildable: + Prerequisites: anyradar, ~vehicles.nod + +MLRS: + Buildable: + Prerequisites: tmpl, ~vehicles.nod + +SPEC: + Buildable: + Prerequisites: tmpl, ~vehicles.nod + +VENM: + Buildable: + Prerequisites: ~aircraft.nod + +APC2: + Buildable: + Prerequisites: ~vehicles.gdi, ~!vulcan.upgrade + +AIRS: + Inherits@CAMPAIGNDISABLED: ^Disabled + +WEAP.TD: + Buildable: + Prerequisites: anyrefinery, ~structures.td + +blacknapalm.upgrade: + Buildable: + Prerequisites: ~player.nod, tmpl + +quantum.upgrade: + Buildable: + Prerequisites: ~player.nod, tmpl + +hstk.upgrade: + Buildable: + Prerequisites: ~player.nod, tmpl + +# Enable GDI subfaction specific tech + +STWR: + Buildable: + Prerequisites: vehicles.any, ~structures.gdi + +TITN: + Buildable: + Prerequisites: gtek, ~!railgun.upgrade, ~vehicles.gdi + +TITN.RAIL: + Buildable: + Prerequisites: gtek, ~railgun.upgrade, ~vehicles.gdi + +JUGG: + Buildable: + Prerequisites: gtek, ~vehicles.gdi + +HSAM: + Buildable: + Prerequisites: anyradar, ~vehicles.gdi + +MDRN: + Buildable: + Prerequisites: anyradar, ~vehicles.gdi + +GDRN: + Buildable: + Prerequisites: ~vehicles.gdi, ~!tow.upgrade + +GDRN.TOW: + Buildable: + Prerequisites: ~vehicles.gdi, ~tow.upgrade + +WOLV: + Buildable: + Prerequisites: gtek, ~vehicles.gdi + +XO: + Buildable: + Prerequisites: gtek, ~vehicles.gdi + +PBUL: + Buildable: + Prerequisites: gtek, ~vehicles.gdi + +AURO: + Buildable: + Prerequisites: afld.gdi, gtek, ~aircraft.gdi + +gyro.upgrade: + Buildable: + Prerequisites: gtek, ~player.gdi + +abur.upgrade: + Buildable: + Prerequisites: gtek, ~player.gdi + +bdrone.upgrade: + Buildable: + Prerequisites: gtek, ~player.gdi + +railgun.upgrade: + Buildable: + Prerequisites: upgc, ~player.gdi + +ionmam.upgrade: + Buildable: + Prerequisites: upgc, !mdrone.upgrade, !hovermam.upgrade, ~player.gdi + TooltipExtras: + Attributes: \n(!) Only ONE Mammoth Tank upgrade can be chosen + +hovermam.upgrade: + Buildable: + Prerequisites: upgc, !ionmam.upgrade, !mdrone.upgrade, ~player.gdi + TooltipExtras: + Attributes: \n(!) Only ONE Mammoth Tank upgrade can be chosen + +mdrone.upgrade: + Buildable: + Prerequisites: upgc, !ionmam.upgrade, !hovermam.upgrade, ~player.gdi + TooltipExtras: + Attributes: \n(!) Only ONE Mammoth Tank upgrade can be chosen + +# Enable Scrin subfaction specific tech + +STCR: + Buildable: + Prerequisites: anyradar, ~vehicles.scrin + +LCHR: + Buildable: + Prerequisites: anyradar, ~vehicles.scrin + +RUIN: + Buildable: + Prerequisites: scrt, ~vehicles.scrin + +ATMZ: + Buildable: + Prerequisites: scrt, ~vehicles.scrin + +stellar.upgrade: + Buildable: + Prerequisites: scrt, ~player.scrin + +coalescence.upgrade: + Buildable: + Prerequisites: scrt, ~player.scrin + +RTPD: + Buildable: + Prerequisites: scrt, ~vehicles.scrin + +ENRV: + Buildable: + Prerequisites: scrt, ~aircraft.scrin + +# Misc + +NERV: + DetonateWeaponPower@BUZZERSWARMAI: + Prerequisites: nerv + ChargeInterval: 7500 + DetonateWeaponPower@STORMSPIKE: + Prerequisites: nerv + ChargeInterval: 8250 + +SPLITBLUE: + Tooltip: + Name: Blossom Tree + +ETPD: + FirepowerMultiplier@NORMAL: + Modifier: 75 + RequiresCondition: difficulty-normal + FirepowerMultiplier@EASY: + Modifier: 50 + RequiresCondition: difficulty-easy + DamageMultiplier@NORMAL: + Modifier: 125 + RequiresCondition: difficulty-normal + DamageMultiplier@EASY: + Modifier: 150 + RequiresCondition: difficulty-easy + DamageTypeDamageMultiplier@A2GPROTECTION: + Modifier: 75 + RequiresCondition: !difficulty-easy + +# Hunt() requires only 1 AttackBase +DEVA: + -AttackFrontalCharged: + -Armament@PRIMARYUPG: + -AmbientSound@CHARGE: + -WithIdleOverlay@CHARGE1: + -WithIdleOverlay@CHARGE2: + -WithIdleOverlay@CHARGE3: diff --git a/mods/ca/missions/main-campaign/ca36-reckoning/reckoning.lua b/mods/ca/missions/main-campaign/ca36-reckoning/reckoning.lua new file mode 100644 index 0000000000..9fca7cb2e6 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca36-reckoning/reckoning.lua @@ -0,0 +1,491 @@ +MissionDir = "ca|missions/main-campaign/ca36-reckoning" + +ExterminatorsStartTime = { + easy = DateTime.Minutes(10), + normal = DateTime.Minutes(8), + hard = DateTime.Minutes(6), + vhard = DateTime.Minutes(6), + brutal = DateTime.Minutes(6) +} + +ExterminatorsInterval = { + easy = DateTime.Minutes(7), + normal = DateTime.Minutes(6), + hard = DateTime.Minutes(5), + vhard = DateTime.Minutes(4), + brutal = DateTime.Minutes(3) + DateTime.Seconds(20) +} + +ExterminatorAttackCount = { + easy = 4, + normal = 4, + hard = 50, + vhard = 50, + brutal = 50 +} + +Exterminators = { + { SpawnLocation = ExterminatorFirstSpawn.Location, Path = { Exterminator1Patrol1.Location, Exterminator1Patrol2.Location, Exterminator1Patrol3.Location, Exterminator1Patrol4.Location } }, + { SpawnLocation = ExterminatorSpawnWest.Location, Path = { Exterminator2Patrol1.Location, Exterminator2Patrol2.Location, Exterminator2Patrol3.Location, Exterminator2Patrol4.Location } }, + { SpawnLocation = ExterminatorSpawnWest.Location, Path = { Exterminator3Patrol1.Location, Exterminator3Patrol2.Location, Exterminator3Patrol3.Location, Exterminator3Patrol4.Location } }, + { SpawnLocation = ExterminatorSpawnEast.Location, Path = { Exterminator4Patrol1.Location, Exterminator4Patrol2.Location, Exterminator4Patrol3.Location, Exterminator4Patrol4.Location } }, +} + +SuperweaponsEnabledTime = { + easy = DateTime.Seconds((60 * 50) + 17), + normal = DateTime.Seconds((60 * 35) + 17), + hard = DateTime.Seconds((60 * 25) + 17), + vhard = DateTime.Seconds((60 * 20) + 17), + brutal = DateTime.Seconds((60 * 15) + 17) +} + +if IsHardOrAbove() then + table.insert(UnitCompositions.Scrin, { + Infantry = { "s3", "s4", "evis", "evis", "evis", "evis", "s1", "s1", "s4", "s1", "s4", "s1", "s4", "s1", "mast" }, + Vehicles = { "shrw", TripodVariant, TripodVariant, "shrw", CorrupterOrDevourer, "oblt", "shrw" }, + Aircraft = { PacOrDevastator, "pac" }, + MinTime = DateTime.Minutes(22) + }) +end + +AdjustedScrinCompositions = AdjustCompositionsForDifficulty(UnitCompositions.Scrin) + +local friendlyDifficulty = Difficulty +if Difficulty == "brutal" then + friendlyDifficulty = "vhard" +end + +Squads = { + ScrinMain = { + ActiveCondition = function() + return DateTime.GameTime < DateTime.Minutes(35) or DateTime.GameTime > DateTime.Minutes(40) + end, + Delay = AdjustDelayForDifficulty(DateTime.Minutes(4)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 40, Max = 80 }), + FollowLeader = true, + ProducerActors = { Infantry = { Portal1 }, Vehicles = { WarpSphere1 }, Aircraft = { GravityStabilizer1, GravityStabilizer2 } }, + Compositions = AdjustedScrinCompositions, + AttackPaths = { + { L1.Location, L2.Location, L3.Location, L4.Location }, + { L1.Location, L2.Location, M3.Location, M4.Location }, + { M1.Location, M2.Location, M3.Location, M4.Location }, + { M1.Location, M2.Location, M5.Location, M4.Location }, + }, + }, + ScrinRebelKiller = { + Delay = DateTime.Minutes(1), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 32, Max = 32 }), + FollowLeader = true, + ProducerActors = { Infantry = { Portal2 }, Vehicles = { WarpSphere2 }, Aircraft = { GravityStabilizer1, GravityStabilizer2, GravityStabilizer3 } }, + Compositions = AdjustedScrinCompositions, + AttackPaths = { + { M1.Location, M2.Location, R4.Location, M5.Location }, + { R1.Location, R2.Location, R3.Location, R4.Location, R5.Location } + }, + }, + ScrinGDIKiller = { + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 60, Max = 60 }), + FollowLeader = true, + ProducerActors = { Infantry = { Portal3 }, Vehicles = { WarpSphere4 }, Aircraft = { GravityStabilizer3 } }, + Compositions = AdjustedScrinCompositions, + AttackPaths = { + { R7.Location, R6.Location, GDIBase.Location }, + { R10.Location, R6.Location, GDIBase.Location }, + }, + }, + ScrinRebelsMain = { + Delay = DateTime.Minutes(1), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 28, Max = 28 }, friendlyDifficulty), + FollowLeader = true, + ProducerActors = { Infantry = { RebelPortal1 }, Vehicles = { RebelWarpSphere1 }, Aircraft = { RebelGravityStabilizer1 } }, + Compositions = AdjustCompositionsForDifficulty(UnitCompositions.Scrin, friendlyDifficulty), + AttackPaths = { + { M5.Location, M2.Location, M1.Location }, + { M5.Location, R4.Location, M2.Location }, + { R5.Location, R3.Location, R2.Location, R1.Location } + }, + }, + GDIMain = { + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 64, Max = 64 }, friendlyDifficulty), + FollowLeader = true, + Compositions = AdjustCompositionsForDifficulty(UnitCompositions.GDI, friendlyDifficulty), + AttackPaths = { + { R6.Location, R7.Location, ScrinBase2.Location }, + { R6.Location, R10.Location, R9.Location, ScrinBase2.Location }, + }, + }, + ScrinAir = { + Delay = AdjustAirDelayForDifficulty(DateTime.Minutes(5)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 12, Max = 12 }), + ProducerActors = nil, + Compositions = AirCompositions.Scrin, + }, + ScrinAirToAir = AirToAirSquad( + { "stmr", "enrv", "torm" }, + AdjustAirDelayForDifficulty(DateTime.Minutes(8)), + function(a) + a.Patrol({ A2APatrol1.Location, A2APatrol2.Location, A2APatrol3.Location, A2APatrol4.Location, A2APatrol5.Location, A2APatrol6.Location, A2APatrol7.Location, A2APatrol8.Location }) + end + ), + ScrinRebelsAir = { + Delay = DateTime.Minutes(5), + AttackValuePerSecond = { Min = 14, Max = 14 }, + Compositions = { + { Aircraft = { "stmr", "stmr" } }, + { Aircraft = { "enrv" } }, + } + }, + GDIAir = { + Delay = DateTime.Minutes(10), + AttackValuePerSecond = { + easy = { Min = 20, Max = 20 }, + normal = { Min = 14, Max = 14 }, + hard = { Min = 8, Max = 8 }, + vhard = { Min = 8, Max = 8 }, + brutal = { Min = 8, Max = 8 } + }, + Compositions = { + { Aircraft = { "orca", "orca" } }, + { Aircraft = { "a10" } }, + { Aircraft = { "auro" } }, + { Aircraft = { "orcb" } } + }, + } +} + +SetupPlayers = function() + Nod = Player.GetPlayer("Nod") + Scrin = Player.GetPlayer("Scrin") + ScrinRebels = Player.GetPlayer("ScrinRebels") + GDIHostile = Player.GetPlayer("GDIHostile") + GDI = Player.GetPlayer("GDI") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = { Nod } + MissionEnemies = { Scrin } +end + +WorldLoaded = function() + SetupPlayers() + + NextExterminatorIndex = 1 + Camera.Position = PlayerStart.CenterPosition + + InitObjectives(Nod) + AdjustPlayerStartingCashForDifficulty() + InitScrin() + InitScrinRebels() + + ObjectiveDestroyOverlordForces = Nod.AddObjective("Destroy Scrin forces loyal to the Overlord.") + + if not IsCoop then + ObjectiveDefendRebels = Nod.AddObjective("Protect Scrin rebel forces.") + end + + Trigger.AfterDelay(DateTime.Seconds(3), function() + Media.DisplayMessage("The Overlord's tyranny will die today commander, and a new era will begin. Elsewhere, battles are still raging, but the decisive blow must be dealt here where his most elite forces are gathered. Show no mercy commander. Peace through power.", "Kane", HSLColor.FromHex("FF0000")) + MediaCA.PlaySound(MissionDir .. "/kane_nomercy.aud", 2) + + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(14)), function() + Media.DisplayMessage("Foolish humans! Your armies will be crushed, the rebellion will fall, and you will die here!", "Scrin Overlord", HSLColor.FromHex("7700FF")) + MediaCA.PlaySound(MissionDir .. "/overlordwarning.aud", 2) + + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(60)), function() + InitGDI() + end) + end) + end) + + Trigger.OnEnteredProximityTrigger(GDIBase.CenterPosition, WDist.New(18 * 1024), function(a, id) + if IsMissionPlayer(a.Owner) then + Trigger.RemoveProximityTrigger(id) + InitGDI() + end + end) + + RadarProviders = {} + + Utils.Do(MissionPlayers, function(p) + table.insert(RadarProviders, Actor.Create("radar.dummy", true, { Owner = p })) + end) + + Trigger.OnKilled(RebelMainNerveCenter, function(self, killer) + Utils.Do(RadarProviders, function(p) + p.Destroy() + end) + end) + + AfterWorldLoaded() +end + +Tick = function() + OncePerSecondChecks() + OncePerFiveSecondChecks() + OncePerThirtySecondChecks() + AfterTick() +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + Scrin.Resources = Scrin.ResourceCapacity - 500 + ScrinRebels.Resources = ScrinRebels.ResourceCapacity - 500 + end +end + +OncePerFiveSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 125 == 0 then + UpdatePlayerBaseLocations() + + if not PlayerHasBuildings(Scrin) and #Scrin.GetActorsByType("etpd") == 0 and not Victory then + Victory = true + Media.DisplayMessage("The Overlord's fate is sealed, and the Scrin are liberated. Now we must return to Earth and forge a new beginning for mankind. With purified Tiberium the possibilites are truly limitless, and those who embrace its light will share in its blessings. Those who do not, will be left in the darkness.", "Kane", HSLColor.FromHex("FF0000")) + MediaCA.PlaySound(MissionDir .. "/kane_newbeginning.aud", 2) + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(19)), function() + Nod.MarkCompletedObjective(ObjectiveDestroyOverlordForces) + if ObjectiveDefendRebels ~= nil then + Nod.MarkCompletedObjective(ObjectiveDefendRebels) + end + end) + end + + if ObjectiveDefendRebels ~= nil and not PlayerHasBuildings(ScrinRebels) and not Victory then + Nod.MarkFailedObjective(ObjectiveDefendRebels) + end + + if MissionPlayersHaveNoRequiredUnits() and not Victory then + Nod.MarkFailedObjective(ObjectiveDestroyOverlordForces) + end + end +end + +OncePerThirtySecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % DateTime.Seconds(30) == 0 then + CalculatePlayerCharacteristics() + end +end + +InitScrin = function() + RebuildExcludes.Scrin = { Types = { "rfgn" } } + + AutoRepairAndRebuildBuildings(Scrin, 15) + SetupRefAndSilosCaptureCredits(Scrin) + AutoReplaceHarvesters(Scrin) + AutoRebuildConyards(Scrin) + InitAiUpgrades(Scrin) + InitAttackSquad(Squads.ScrinMain, Scrin) + InitAirAttackSquad(Squads.ScrinAir, Scrin) + InitAttackSquad(Squads.ScrinRebelKiller, Scrin, ScrinRebels) + + if IsHardOrAbove() then + InitAirAttackSquad(Squads.ScrinAirToAir, Scrin, MissionPlayers, { "Aircraft" }, "ArmorType") + end + + local scrinGroundAttackers = Scrin.GetGroundAttackers() + + Utils.Do(scrinGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsScrinGroundHunterUnitExcludingExterminators, function(p) return IsMissionPlayer(p) or p == Nod or p == ScrinRebels or p == GDI end) + end) + + Trigger.AfterDelay(ExterminatorsStartTime[Difficulty], function() + SendNextExterminator() + end) + + Trigger.OnEnteredProximityTrigger(FirstExterminatorDetector.CenterPosition, WDist.New(5 * 1024), function(a, id) + if a.Owner == Scrin and a.Type == "etpd" then + Trigger.RemoveProximityTrigger(id) + local camera = Actor.Create("camera", true, { Owner = Nod, Location = a.Location }) + Beacon.New(Nod, a.CenterPosition) + Media.PlaySound("beacon.aud") + Trigger.AfterDelay(DateTime.Seconds(6), function() + camera.Destroy() + end) + local rebelDefenders = Utils.Where(Map.ActorsInCircle(Exterminator1Patrol1.CenterPosition, WDist.New(13 * 1024)), function(a) + return a.Owner == ScrinRebels and not a.IsDead and a.HasProperty("Hunt") + end) + Utils.Do(rebelDefenders, function(a) + a.AttackMove(Exterminator1Patrol1.Location) + a.Hunt() + end) + end + end) + + Actor.Create("loyalist.allegiance", true, { Owner = Scrin }) + + Trigger.AfterDelay(SuperweaponsEnabledTime[Difficulty], function() + Actor.Create("ai.minor.superweapons.enabled", true, { Owner = Scrin }) + Actor.Create("ai.superweapons.enabled", true, { Owner = Scrin }) + end) + + Utils.Do({ Exterminator1, Exterminator2, Exterminator3, Exterminator4, Exterminator5, Exterminator6, Exterminator7, Exterminator8 }, function(a) + a.GrantCondition("difficulty-" .. Difficulty) + Trigger.OnDamaged(a, function(self, attacker, damage) + if IsMissionPlayer(attacker.Owner) and damage > 500 then + AggroExterminator(self) + end + end) + end) + + if Difficulty == "easy" then + Exterminator2.Destroy() + Exterminator4.Destroy() + end +end + +InitScrinRebels = function() + if not ScrinRebelsActive then + ScrinRebelsActive = true + + RebuildExcludes.ScrinRebels = { Actors = { FallenRebel1, FallenRebel2, FallenRebel3, FallenRebel4, FallenRebel5, FallenRebel6, FallenRebel7, FallenRebel8, FallenRebel9, FallenRebel10 } } + + AutoRepairAndRebuildBuildings(ScrinRebels, 15) + AutoReplaceHarvesters(ScrinRebels) + AutoRebuildConyards(Scrin, true) + InitAiUpgrades(ScrinRebels) + InitAirAttackSquad(Squads.ScrinRebelsAir, ScrinRebels, Scrin) + InitAttackSquad(Squads.ScrinRebelsMain, ScrinRebels, Scrin) + + local scrinRebelGroundAttackers = ScrinRebels.GetGroundAttackers() + + Utils.Do(scrinRebelGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsScrinRebelGroundHunterUnit, function(p) return p == Scrin end) + end) + end +end + +InitGDI = function() + if not GDIActive then + GDIActive = true + + Beacon.New(Nod, GDIBase.CenterPosition) + Media.PlaySound("beacon.aud") + + Trigger.AfterDelay(DateTime.Seconds(1), function() + Media.DisplayMessage("Our forces were successful in luring GDI here and they have established a base. The situation has been explained to them and they have agreed to a cease fire, but remain vigilant commander, our old enemy cannot be trusted.", "Kane", HSLColor.FromHex("FF0000")) + MediaCA.PlaySound(MissionDir .. "/kane_gdibase.aud", 2) + end) + + AutoRepairAndRebuildBuildings(GDI, 15) + AutoReplaceHarvesters(GDI) + AutoRebuildConyards(GDI, true) + InitAiUpgrades(GDI) + InitAttackSquad(Squads.ScrinGDIKiller, Scrin, GDI) + InitAttackSquad(Squads.GDIMain, GDI, Scrin) + InitAirAttackSquad(Squads.GDIAir, GDI, Scrin) + + local gdiUnits = GDIHostile.GetActors() + Utils.Do(gdiUnits, function(a) + if not a.IsDead and a.IsInWorld and a.Type ~= "player" then + a.Owner = GDI + end + end) + end +end + +SendNextExterminator = function() + if NextExterminatorIndex <= ExterminatorAttackCount[Difficulty] and not Victory then + local exterminatorLocations + + if Exterminators[NextExterminatorIndex] ~= nil then + exterminatorLocations = Exterminators[NextExterminatorIndex] + else + exterminatorLocations = { SpawnLocation = Utils.Random({ ExterminatorSpawnWest.Location, ExterminatorSpawnEast.Location }) } + end + + local wormhole = Actor.Create("wormholelg", true, { Owner = Scrin, Location = exterminatorLocations.SpawnLocation }) + + Trigger.AfterDelay(DateTime.Seconds(2), function() + MediaCA.PlaySound("etpd-aggro.aud", 2) + + if NextExterminatorIndex == 1 then + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(2)), function() + Media.DisplayMessage("Commander, the Overlord's most powerful weapons are being deployed. Use everything at your disposal to destroy them.", "Kane", HSLColor.FromHex("FF0000")) + MediaCA.PlaySound(MissionDir .. "/kane_exterminators.aud", 2) + end) + else + Notification("Exterminator Tripod detected.") + end + + local exterminator = Reinforcements.Reinforce(Scrin, { "etpd" }, { exterminatorLocations.SpawnLocation }, 10, function(a) + if exterminatorLocations.Path ~= nil then + local path = exterminatorLocations.Path + a.Patrol(path) + + Trigger.OnIdle(a, function(self) + self.Patrol(path) + end) + else + AssaultPlayerBaseOrHunt(a) + end + + a.GrantCondition("difficulty-" .. Difficulty) + + Trigger.AfterDelay(ExterminatorsInterval[Difficulty] * 5, function() + AggroExterminator(a) + end) + + Trigger.OnDamaged(a, function(self, attacker, damage) + if IsMissionPlayer(attacker.Owner) and damage > 500 then + AggroExterminator(self) + end + end) + + Trigger.AfterDelay(DateTime.Seconds(10), function() + wormhole.Kill() + end) + end)[1] + + if IsVeryHardOrAbove() then + local startGuardCount + local maxGuardCount + + if Difficulty == "brutal" then + startGuardCount = 4 + maxGuardCount = 10 + else + startGuardCount = 2 + maxGuardCount = 8 + end + + local guardsList = {} + + -- starting with startGuardCount, add a guard every 10 minutes + local numGuards = math.max(startGuardCount, math.min(maxGuardCount, startGuardCount + math.floor((DateTime.GameTime - DateTime.Minutes(10)) / DateTime.Minutes(10)))) + for i = 1, numGuards do + table.insert(guardsList, "gunw") + end + + local guards = Reinforcements.Reinforce(Scrin, guardsList, { exterminatorLocations.SpawnLocation }, 15, function(g) + FollowActor(g, exterminator) + IdleHunt(g) + end) + end + + NextExterminatorIndex = NextExterminatorIndex + 1 + + Trigger.AfterDelay(ExterminatorsInterval[Difficulty], function() + SendNextExterminator() + end) + end) + end +end + +AggroExterminator = function(a) + if not a.IsDead then + Trigger.ClearAll(a) + a.Stop() + Trigger.AfterDelay(1, function() + if not a.IsDead then + AssaultPlayerBaseOrHunt(a) + end + end) + end +end + +IsScrinRebelGroundHunterUnit = function(actor) + return actor.Owner == ScrinRebels and IsGroundHunterUnit(actor) and actor.Type ~= "mast" +end + +IsScrinGroundHunterUnitExcludingExterminators = function(actor) + return IsScrinGroundHunterUnit(actor) and actor.Type ~= "etpd" +end diff --git a/mods/ca/missions/main-campaign/ca37-statecraft/cdko_crushtraitors.aud b/mods/ca/missions/main-campaign/ca37-statecraft/cdko_crushtraitors.aud new file mode 100644 index 0000000000..69141c64ce Binary files /dev/null and b/mods/ca/missions/main-campaign/ca37-statecraft/cdko_crushtraitors.aud differ diff --git a/mods/ca/missions/main-campaign/ca37-statecraft/map.bin b/mods/ca/missions/main-campaign/ca37-statecraft/map.bin new file mode 100644 index 0000000000..528d5c211b Binary files /dev/null and b/mods/ca/missions/main-campaign/ca37-statecraft/map.bin differ diff --git a/mods/ca/missions/main-campaign/ca37-statecraft/map.png b/mods/ca/missions/main-campaign/ca37-statecraft/map.png new file mode 100644 index 0000000000..b9d623e68f Binary files /dev/null and b/mods/ca/missions/main-campaign/ca37-statecraft/map.png differ diff --git a/mods/ca/missions/main-campaign/ca37-statecraft/map.yaml b/mods/ca/missions/main-campaign/ca37-statecraft/map.yaml new file mode 100644 index 0000000000..0bb90cfbd1 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca37-statecraft/map.yaml @@ -0,0 +1,4446 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 37: Statecraft + +Author: Darkademic + +Tileset: WINTER + +MapSize: 130,130 + +Bounds: 1,1,128,128 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: USSR, Marinesko, Romanov, Krukov, MarineskoUnited, RomanovUnited, KrukovUnited + PlayerReference@USSR: + Name: USSR + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: soviet + LockColor: True + Color: FE1100 + LockSpawn: True + LockTeam: True + Enemies: Marinesko, Romanov, Krukov, MarineskoUnited, RomanovUnited, KrukovUnited, Creeps + PlayerReference@Marinesko: + Name: Marinesko + Bot: campaign + Faction: soviet + Color: 994050 + Enemies: USSR, Romanov, Krukov, Creeps + PlayerReference@Romanov: + Name: Romanov + Bot: campaign + Faction: soviet + Color: FF9922 + Enemies: USSR, Marinesko, Krukov, Creeps + PlayerReference@Krukov: + Name: Krukov + Bot: campaign + Faction: soviet + Color: 485183 + Enemies: USSR, Marinesko, Romanov, Creeps + PlayerReference@MarineskoUnited: + Name: MarineskoUnited + Bot: campaign + Faction: soviet + Color: 994050 + Allies: RomanovUnited, KrukovUnited + Enemies: USSR, Creeps + PlayerReference@RomanovUnited: + Name: RomanovUnited + Bot: campaign + Faction: soviet + Color: FF9922 + Allies: MarineskoUnited, KrukovUnited + Enemies: USSR, Creeps + PlayerReference@KrukovUnited: + Name: KrukovUnited + Bot: campaign + Faction: soviet + Color: 485183 + Allies: MarineskoUnited, RomanovUnited + Enemies: USSR, Creeps + +Actors: + Actor0: mcv + Owner: USSR + Location: 67,118 + Facing: 0 + Actor4: 3tnk + Owner: USSR + Location: 67,115 + Facing: 0 + Actor2: 3tnk + Owner: USSR + Facing: 0 + Location: 67,113 + Actor3: 3tnk + Owner: USSR + Facing: 0 + Location: 67,111 + Actor6: btr + Owner: USSR + Facing: 0 + Location: 67,109 + Actor7: btr + Owner: USSR + Facing: 0 + Location: 67,107 + Actor8: katy + Owner: USSR + Location: 67,121 + Facing: 0 + Actor9: katy + Owner: USSR + Facing: 0 + Location: 67,123 + Actor10: e1 + Owner: USSR + SubCell: 3 + Location: 65,116 + Facing: 0 + Actor11: e1 + Owner: USSR + SubCell: 3 + Facing: 0 + Location: 66,114 + Actor12: e1 + Owner: USSR + SubCell: 3 + Facing: 0 + Location: 65,113 + Actor13: e1 + Owner: USSR + SubCell: 3 + Facing: 0 + Location: 69,111 + Actor14: e1 + Owner: USSR + SubCell: 3 + Facing: 0 + Location: 68,110 + Actor15: e1 + Owner: USSR + SubCell: 3 + Facing: 0 + Location: 69,108 + Actor16: e2 + Owner: USSR + SubCell: 3 + Location: 69,116 + Facing: 0 + Actor17: e3 + Owner: USSR + SubCell: 3 + Location: 69,121 + Facing: 0 + Actor18: e3 + Owner: USSR + SubCell: 3 + Facing: 0 + Location: 65,120 + Actor19: e2 + Owner: USSR + SubCell: 3 + Facing: 0 + Location: 65,110 + Actor20: e2 + Owner: USSR + SubCell: 3 + Facing: 0 + Location: 66,108 + Actor21: fact + Owner: Romanov + Location: 125,64 + Actor34: brik + Owner: Romanov + Location: 128,72 + Actor35: brik + Owner: Romanov + Location: 128,71 + Actor36: brik + Owner: Romanov + Location: 128,70 + Actor37: brik + Owner: Romanov + Location: 128,69 + Actor38: brik + Owner: Romanov + Location: 128,68 + Actor39: brik + Owner: Romanov + Location: 128,67 + Actor40: brik + Owner: Romanov + Location: 128,66 + Actor41: brik + Owner: Romanov + Location: 128,65 + Actor42: brik + Owner: Romanov + Location: 128,64 + Actor43: brik + Owner: Romanov + Location: 128,63 + Actor44: brik + Owner: Romanov + Location: 128,62 + Actor45: brik + Owner: Romanov + Location: 128,61 + Actor46: brik + Owner: Romanov + Location: 128,60 + Actor62: brik + Owner: Romanov + Location: 111,71 + Actor63: brik + Owner: Romanov + Location: 110,72 + Actor64: brik + Owner: Romanov + Location: 111,72 + Actor65: brik + Owner: Romanov + Location: 110,71 + Actor66: brik + Owner: Romanov + Location: 109,72 + Actor67: brik + Owner: Romanov + Location: 108,72 + Actor68: brik + Owner: Romanov + Location: 107,72 + Actor69: brik + Owner: Romanov + Location: 107,71 + Actor70: tsla + Owner: Romanov + Location: 109,71 + Actor71: brik + Owner: Romanov + Location: 107,66 + Actor72: brik + Owner: Romanov + Location: 107,67 + Actor73: brik + Owner: Romanov + Location: 107,68 + Actor74: brik + Owner: Romanov + Location: 107,69 + Actor75: brik + Owner: Romanov + Location: 107,70 + Actor76: brik + Owner: Romanov + Location: 107,65 + Actor77: brik + Owner: Romanov + Location: 107,64 + Actor78: brik + Owner: Romanov + Location: 108,64 + Actor79: brik + Owner: Romanov + Location: 108,65 + Actor105: tsla + Owner: Romanov + Location: 108,66 + Actor109: barr + Owner: Romanov + Location: 111,65 + Actor112: sam + Owner: Romanov + Location: 108,69 + Actor226: brik + Owner: Romanov + Location: 107,53 + Actor227: brik + Owner: Romanov + Location: 108,53 + Actor228: brik + Owner: Romanov + Location: 109,53 + Actor229: brik + Owner: Romanov + Location: 110,53 + Actor230: brik + Owner: Romanov + Location: 111,53 + Actor231: brik + Owner: Romanov + Location: 112,53 + Actor232: brik + Owner: Romanov + Location: 113,53 + Actor233: brik + Owner: Romanov + Location: 114,53 + Actor234: brik + Owner: Romanov + Location: 115,53 + Actor235: brik + Owner: Romanov + Location: 116,53 + Actor236: brik + Owner: Romanov + Location: 121,53 + Actor237: brik + Owner: Romanov + Location: 122,53 + Actor238: brik + Owner: Romanov + Location: 123,53 + Actor239: brik + Owner: Romanov + Location: 124,53 + Actor240: brik + Owner: Romanov + Location: 125,53 + Actor241: brik + Owner: Romanov + Location: 126,53 + Actor242: brik + Owner: Romanov + Location: 127,53 + Actor243: brik + Owner: Romanov + Location: 128,53 + Actor244: brik + Owner: Romanov + Location: 107,54 + Actor246: weap + Owner: Romanov + Location: 110,54 + Actor247: tsla + Owner: Romanov + Location: 114,54 + Actor248: brik + Owner: Romanov + Location: 115,54 + Actor249: brik + Owner: Romanov + Location: 116,54 + Actor250: brik + Owner: Romanov + Location: 121,54 + Actor251: brik + Owner: Romanov + Location: 122,54 + Actor252: brik + Owner: Romanov + Location: 128,54 + Actor253: brik + Owner: Romanov + Location: 107,55 + Actor255: brik + Owner: Romanov + Location: 128,55 + Actor256: brik + Owner: Romanov + Location: 107,56 + Actor258: brik + Owner: Romanov + Location: 128,56 + Actor259: brik + Owner: Romanov + Location: 128,57 + Actor260: brik + Owner: Romanov + Location: 128,58 + Actor261: brik + Owner: Romanov + Location: 128,59 + Actor262: brik + Owner: Romanov + Location: 107,57 + Actor263: tsla + Owner: Romanov + Location: 108,57 + Actor264: brik + Owner: Romanov + Location: 107,58 + Actor265: brik + Owner: Romanov + Location: 108,58 + Actor266: brik + Owner: Romanov + Location: 107,59 + Actor267: brik + Owner: Romanov + Location: 108,59 + Actor254: weap + Owner: Romanov + Location: 112,58 + RomanovIndustrialPlant: indp + Owner: Romanov + Location: 122,58 + Actor245: fix + Owner: Romanov + Location: 114,62 + Actor269: stek + Owner: Romanov + Location: 125,54 + Actor270: dome + Owner: Romanov + Location: 126,60 + Actor271: sam + Owner: Romanov + Location: 126,58 + Actor272: sam + Owner: Romanov + Location: 108,54 + Actor273: ftur + Owner: Romanov + Location: 111,73 + Actor275: ftur + Owner: Romanov + Location: 106,59 + Actor276: ftur + Owner: Romanov + Location: 106,64 + Actor277: ftur + Owner: Romanov + Location: 116,52 + Actor278: ftur + Owner: Romanov + Location: 121,52 + Actor279: tsla + Owner: Romanov + Location: 123,54 + Actor280: npwr + Owner: Romanov + Location: 120,65 + Actor287: brik + Owner: Krukov + Location: 64,20 + Actor288: brik + Owner: Krukov + Location: 64,19 + Actor289: brik + Owner: Krukov + Location: 64,18 + Actor290: brik + Owner: Krukov + Location: 64,17 + Actor291: brik + Owner: Krukov + Location: 64,16 + Actor292: brik + Owner: Krukov + Location: 65,16 + Actor293: brik + Owner: Krukov + Location: 65,17 + Actor294: brik + Owner: Krukov + Location: 64,21 + Actor295: brik + Owner: Krukov + Location: 65,21 + Actor296: brik + Owner: Krukov + Location: 67,21 + Actor297: brik + Owner: Krukov + Location: 66,21 + Actor298: brik + Owner: Krukov + Location: 68,21 + Actor299: brik + Owner: Krukov + Location: 69,21 + Actor300: brik + Owner: Krukov + Location: 70,21 + Actor301: brik + Owner: Krukov + Location: 72,21 + Actor302: brik + Owner: Krukov + Location: 71,21 + Actor303: brik + Owner: Krukov + Location: 72,20 + Actor304: brik + Owner: Krukov + Location: 71,20 + Actor305: brik + Owner: Krukov + Location: 78,20 + Actor306: brik + Owner: Krukov + Location: 78,21 + Actor307: brik + Owner: Krukov + Location: 79,21 + Actor308: brik + Owner: Krukov + Location: 79,20 + Actor309: brik + Owner: Krukov + Location: 80,21 + Actor310: brik + Owner: Krukov + Location: 82,21 + Actor311: brik + Owner: Krukov + Location: 81,21 + Actor312: brik + Owner: Krukov + Location: 84,21 + Actor313: brik + Owner: Krukov + Location: 83,21 + Actor314: brik + Owner: Krukov + Location: 85,21 + Actor315: brik + Owner: Krukov + Location: 86,21 + Actor316: brik + Owner: Krukov + Location: 87,21 + Actor317: brik + Owner: Krukov + Location: 88,21 + Actor318: brik + Owner: Krukov + Location: 89,21 + Actor319: brik + Owner: Krukov + Location: 89,20 + Actor320: brik + Owner: Krukov + Location: 89,19 + Actor321: brik + Owner: Krukov + Location: 89,18 + Actor322: brik + Owner: Krukov + Location: 89,17 + Actor323: brik + Owner: Krukov + Location: 89,16 + Actor324: brik + Owner: Krukov + Location: 89,15 + Actor325: brik + Owner: Krukov + Location: 89,14 + Actor326: brik + Owner: Krukov + Location: 88,14 + Actor327: brik + Owner: Krukov + Location: 88,15 + Actor328: brik + Owner: Krukov + Location: 88,8 + Actor329: brik + Owner: Krukov + Location: 88,9 + Actor330: brik + Owner: Krukov + Location: 89,9 + Actor331: brik + Owner: Krukov + Location: 89,8 + Actor332: brik + Owner: Krukov + Location: 89,7 + Actor333: brik + Owner: Krukov + Location: 89,6 + Actor334: brik + Owner: Krukov + Location: 89,5 + Actor335: brik + Owner: Krukov + Location: 89,4 + Actor336: brik + Owner: Krukov + Location: 89,3 + Actor337: brik + Owner: Krukov + Location: 89,2 + Actor338: brik + Owner: Krukov + Location: 89,1 + Actor339: brik + Owner: Krukov + Location: 88,1 + Actor340: brik + Owner: Krukov + Location: 87,1 + Actor341: brik + Owner: Krukov + Location: 86,1 + Actor342: brik + Owner: Krukov + Location: 64,11 + Actor343: brik + Owner: Krukov + Location: 65,11 + Actor344: brik + Owner: Krukov + Location: 65,10 + Actor345: brik + Owner: Krukov + Location: 64,10 + Actor346: brik + Owner: Krukov + Location: 64,9 + Actor347: brik + Owner: Krukov + Location: 64,8 + Actor348: brik + Owner: Krukov + Location: 64,7 + Actor349: brik + Owner: Krukov + Location: 64,6 + Actor350: brik + Owner: Krukov + Location: 64,5 + Actor351: brik + Owner: Krukov + Location: 64,4 + Actor352: brik + Owner: Krukov + Location: 64,3 + Actor353: brik + Owner: Krukov + Location: 64,2 + Actor354: brik + Owner: Krukov + Location: 64,1 + Actor355: brik + Owner: Krukov + Location: 66,1 + Actor356: brik + Owner: Krukov + Location: 65,1 + Actor357: brik + Owner: Krukov + Location: 83,1 + Actor358: brik + Owner: Krukov + Location: 84,1 + Actor359: brik + Owner: Krukov + Location: 85,1 + Actor360: brik + Owner: Krukov + Location: 80,1 + Actor361: brik + Owner: Krukov + Location: 81,1 + Actor362: brik + Owner: Krukov + Location: 82,1 + Actor363: brik + Owner: Krukov + Location: 77,1 + Actor364: brik + Owner: Krukov + Location: 78,1 + Actor365: brik + Owner: Krukov + Location: 79,1 + Actor366: brik + Owner: Krukov + Location: 74,1 + Actor367: brik + Owner: Krukov + Location: 75,1 + Actor368: brik + Owner: Krukov + Location: 76,1 + Actor369: brik + Owner: Krukov + Location: 67,1 + Actor370: brik + Owner: Krukov + Location: 68,1 + Actor371: brik + Owner: Krukov + Location: 69,1 + Actor372: brik + Owner: Krukov + Location: 70,1 + Actor373: brik + Owner: Krukov + Location: 71,1 + Actor374: brik + Owner: Krukov + Location: 72,1 + Actor375: brik + Owner: Krukov + Location: 73,1 + Actor376: fact + Owner: Krukov + Location: 86,2 + Actor379: tpwr + Owner: Krukov + Location: 65,2 + Actor380: tpwr + Owner: Krukov + Location: 65,5 + Actor381: tpwr + Owner: Krukov + Location: 68,2 + Actor382: tpwr + Owner: Krukov + Location: 68,5 + Actor383: proc + Owner: Krukov + Location: 83,10 + Actor386: dome + Owner: Krukov + Location: 79,2 + Actor387: apwr + Owner: Krukov + Location: 82,2 + Actor388: apwr + Owner: Krukov + Location: 82,5 + Actor389: barr + Owner: Krukov + Location: 81,16 + Actor390: afld + Owner: Krukov + Location: 74,7 + Actor391: fix + Owner: Krukov + Location: 78,8 + Actor392: afld + Owner: Krukov + Location: 74,10 + Actor385: munp + Owner: Krukov + Location: 73,2 + Actor377: weap + Owner: Krukov + Location: 68,15 + Actor384: stek + Owner: Krukov + Location: 69,10 + Actor378: weap + Owner: Krukov + Location: 73,14 + Actor393: sam + Owner: Krukov + Location: 86,19 + Actor394: sam + Owner: Krukov + Location: 66,19 + Actor395: sam + Owner: Krukov + Location: 67,9 + Actor396: sam + Owner: Krukov + Location: 79,6 + Actor398: tsla + Owner: Krukov + Location: 65,20 + Actor399: tsla + Owner: Krukov + Location: 65,9 + Actor400: tsla + Owner: Krukov + Location: 80,20 + Actor401: tsla + Owner: Krukov + Location: 70,20 + Actor402: tsla + Owner: Krukov + Location: 88,16 + Actor397: tsla + Owner: Krukov + Location: 88,7 + Actor403: sam + Owner: Krukov + Location: 85,7 + Actor404: silo + Owner: Krukov + Location: 85,10 + Actor405: silo + Owner: Krukov + Location: 83,10 + Actor406: ftur + Owner: Marinesko + Location: 19,56 + Actor407: ftur + Owner: Marinesko + Location: 24,56 + Actor408: brik + Owner: Marinesko + Location: 10,57 + Actor409: brik + Owner: Marinesko + Location: 11,57 + Actor410: brik + Owner: Marinesko + Location: 12,57 + Actor411: brik + Owner: Marinesko + Location: 13,57 + Actor412: brik + Owner: Marinesko + Location: 14,57 + Actor413: brik + Owner: Marinesko + Location: 15,57 + Actor414: brik + Owner: Marinesko + Location: 16,57 + Actor415: brik + Owner: Marinesko + Location: 17,57 + Actor416: brik + Owner: Marinesko + Location: 18,57 + Actor417: brik + Owner: Marinesko + Location: 19,57 + Actor418: brik + Owner: Marinesko + Location: 24,57 + Actor419: brik + Owner: Marinesko + Location: 25,57 + Actor420: brik + Owner: Marinesko + Location: 26,57 + Actor421: brik + Owner: Marinesko + Location: 27,57 + Actor422: brik + Owner: Marinesko + Location: 28,57 + Actor423: brik + Owner: Marinesko + Location: 29,57 + Actor424: brik + Owner: Marinesko + Location: 30,57 + Actor425: brik + Owner: Marinesko + Location: 31,57 + Actor426: brik + Owner: Marinesko + Location: 32,57 + Actor427: brik + Owner: Marinesko + Location: 33,57 + Actor428: brik + Owner: Marinesko + Location: 10,58 + Actor429: fact + Owner: Marinesko + Location: 13,58 + Actor430: tsla + Owner: Marinesko + Location: 17,58 + Actor431: brik + Owner: Marinesko + Location: 18,58 + Actor432: brik + Owner: Marinesko + Location: 19,58 + Actor433: brik + Owner: Marinesko + Location: 24,58 + Actor434: brik + Owner: Marinesko + Location: 25,58 + Actor435: tsla + Owner: Marinesko + Location: 26,58 + Actor436: dome + Owner: Marinesko + Location: 27,58 + Actor439: brik + Owner: Marinesko + Location: 10,59 + Actor441: brik + Owner: Marinesko + Location: 10,60 + Actor442: brik + Owner: Marinesko + Location: 11,60 + Actor444: brik + Owner: Marinesko + Location: 10,61 + Actor445: brik + Owner: Marinesko + Location: 11,61 + Actor447: sam + Owner: Marinesko + Location: 15,62 + Actor448: sam + Owner: Marinesko + Location: 27,62 + Actor451: proc + Owner: Marinesko + Location: 14,64 + Actor452: stek + Owner: Marinesko + Location: 21,64 + Actor455: brik + Owner: Marinesko + Location: 10,65 + Actor456: brik + Owner: Marinesko + Location: 11,65 + Actor457: cvat + Owner: Marinesko + Location: 26,65 + Actor459: brik + Owner: Marinesko + Location: 10,66 + Actor460: brik + Owner: Marinesko + Location: 11,66 + Actor462: brik + Owner: Marinesko + Location: 10,67 + Actor463: apwr + Owner: Marinesko + Location: 30,67 + Actor465: brik + Owner: Marinesko + Location: 10,68 + Actor467: brik + Owner: Marinesko + Location: 10,69 + Actor468: barr + Owner: Marinesko + Location: 16,69 + Actor469: barr + Owner: Marinesko + Location: 19,69 + Actor470: barr + Owner: Marinesko + Location: 24,69 + Actor471: barr + Owner: Marinesko + Location: 27,69 + Actor473: brik + Owner: Marinesko + Location: 10,70 + Actor474: apwr + Owner: Marinesko + Location: 11,70 + Actor475: apwr + Owner: Marinesko + Location: 30,70 + Actor476: brik + Owner: Marinesko + Location: 33,70 + Actor477: brik + Owner: Marinesko + Location: 10,71 + Actor478: brik + Owner: Marinesko + Location: 33,71 + Actor479: brik + Owner: Marinesko + Location: 10,72 + Actor480: brik + Owner: Marinesko + Location: 33,72 + Actor481: brik + Owner: Marinesko + Location: 10,73 + Actor482: apwr + Owner: Marinesko + Location: 11,73 + Actor483: sam + Owner: Marinesko + Location: 15,73 + Actor484: sam + Owner: Marinesko + Location: 27,73 + Actor485: apwr + Owner: Marinesko + Location: 30,73 + Actor486: brik + Owner: Marinesko + Location: 33,73 + Actor487: brik + Owner: Marinesko + Location: 10,74 + Actor488: brik + Owner: Marinesko + Location: 33,74 + Actor489: brik + Owner: Marinesko + Location: 10,75 + Actor490: tsla + Owner: Marinesko + Location: 17,75 + Actor491: brik + Owner: Marinesko + Location: 18,75 + Actor492: brik + Owner: Marinesko + Location: 19,75 + Actor493: brik + Owner: Marinesko + Location: 24,75 + Actor494: brik + Owner: Marinesko + Location: 25,75 + Actor495: tsla + Owner: Marinesko + Location: 26,75 + Actor496: brik + Owner: Marinesko + Location: 33,75 + Actor497: brik + Owner: Marinesko + Location: 10,76 + Actor498: brik + Owner: Marinesko + Location: 11,76 + Actor499: brik + Owner: Marinesko + Location: 12,76 + Actor500: brik + Owner: Marinesko + Location: 13,76 + Actor501: brik + Owner: Marinesko + Location: 14,76 + Actor502: brik + Owner: Marinesko + Location: 15,76 + Actor503: brik + Owner: Marinesko + Location: 16,76 + Actor504: brik + Owner: Marinesko + Location: 17,76 + Actor505: brik + Owner: Marinesko + Location: 18,76 + Actor506: brik + Owner: Marinesko + Location: 19,76 + Actor507: brik + Owner: Marinesko + Location: 24,76 + Actor508: brik + Owner: Marinesko + Location: 25,76 + Actor509: brik + Owner: Marinesko + Location: 26,76 + Actor510: brik + Owner: Marinesko + Location: 27,76 + Actor511: brik + Owner: Marinesko + Location: 28,76 + Actor512: brik + Owner: Marinesko + Location: 29,76 + Actor513: brik + Owner: Marinesko + Location: 30,76 + Actor514: brik + Owner: Marinesko + Location: 31,76 + Actor515: brik + Owner: Marinesko + Location: 32,76 + Actor516: brik + Owner: Marinesko + Location: 33,76 + Actor517: ftur + Owner: Marinesko + Location: 19,77 + Actor518: ftur + Owner: Marinesko + Location: 24,77 + Actor520: oilb + Owner: Krukov + Location: 107,18 + Actor519: oilb + Owner: Krukov + Location: 111,18 + Actor521: brl3 + Owner: Neutral + Location: 108,17 + Actor522: brl3 + Owner: Neutral + Location: 107,16 + Actor523: brl3 + Owner: Neutral + Location: 111,17 + Actor524: barl + Owner: Neutral + Location: 108,16 + Actor525: barl + Owner: Neutral + Location: 107,17 + Actor526: barl + Owner: Neutral + Location: 112,17 + Actor527: barl + Owner: Neutral + Location: 111,16 + Actor528: chain + Owner: Neutral + Location: 107,21 + Actor529: chain + Owner: Neutral + Location: 106,21 + Actor530: chain + Owner: Neutral + Location: 105,21 + Actor531: chain + Owner: Neutral + Location: 105,20 + Actor532: chain + Owner: Neutral + Location: 105,19 + Actor533: chain + Owner: Neutral + Location: 105,18 + Actor534: chain + Owner: Neutral + Location: 105,17 + Actor535: chain + Owner: Neutral + Location: 105,16 + Actor536: chain + Owner: Neutral + Location: 105,15 + Actor537: chain + Owner: Neutral + Location: 106,15 + Actor538: chain + Owner: Neutral + Location: 108,15 + Actor539: chain + Owner: Neutral + Location: 107,15 + Actor540: chain + Owner: Neutral + Location: 109,15 + Actor541: chain + Owner: Neutral + Location: 111,15 + Actor542: chain + Owner: Neutral + Location: 110,15 + Actor543: chain + Owner: Neutral + Location: 112,15 + Actor544: chain + Owner: Neutral + Location: 113,15 + Actor550: chain + Owner: Neutral + Location: 113,21 + Actor551: chain + Owner: Neutral + Location: 112,21 + Actor552: chain + Owner: Neutral + Location: 111,21 + Actor553: chain + Owner: Neutral + Location: 114,15 + Actor554: chain + Owner: Neutral + Location: 114,16 + Actor555: chain + Owner: Neutral + Location: 114,17 + Actor556: chain + Owner: Neutral + Location: 114,19 + Actor557: chain + Owner: Neutral + Location: 114,18 + Actor558: chain + Owner: Neutral + Location: 114,20 + Actor559: chain + Owner: Neutral + Location: 114,21 + Actor545: fenc + Owner: Neutral + Location: 104,20 + Actor546: fenc + Owner: Neutral + Location: 104,21 + Actor547: fenc + Owner: Neutral + Location: 104,22 + Actor548: fenc + Owner: Neutral + Location: 105,22 + Actor549: fenc + Owner: Neutral + Location: 106,22 + Actor560: fenc + Owner: Neutral + Location: 107,22 + Actor561: fenc + Owner: Neutral + Location: 112,14 + Actor562: fenc + Owner: Neutral + Location: 113,14 + Actor563: fenc + Owner: Neutral + Location: 114,14 + Actor564: fenc + Owner: Neutral + Location: 115,14 + Actor565: fenc + Owner: Neutral + Location: 115,15 + Actor566: fenc + Owner: Neutral + Location: 115,16 + Actor567: fenc + Owner: Neutral + Location: 115,17 + Actor568: fenc + Owner: Neutral + Location: 115,18 + Actor569: fenc + Owner: Neutral + Location: 115,19 + Actor570: fenc + Owner: Neutral + Location: 111,14 + Actor571: fenc + Owner: Neutral + Location: 110,14 + Actor572: fenc + Owner: Neutral + Location: 108,14 + Actor573: fenc + Owner: Neutral + Location: 109,14 + Actor574: fenc + Owner: Neutral + Location: 113,22 + Actor575: fenc + Owner: Neutral + Location: 115,22 + Actor576: fenc + Owner: Neutral + Location: 115,21 + Actor577: fenc + Owner: Neutral + Location: 115,20 + Actor578: fenc + Owner: Neutral + Location: 114,22 + Actor579: tc02 + Owner: Neutral + Location: 36,81 + Actor580: t16 + Owner: Neutral + Location: 38,82 + Actor581: t07 + Owner: Neutral + Location: 37,82 + Actor582: tc01 + Owner: Neutral + Location: 30,78 + Actor583: tc04 + Owner: Neutral + Location: 29,79 + Actor584: t11 + Owner: Neutral + Location: 29,81 + Actor585: t05 + Owner: Neutral + Location: 29,78 + Actor586: t01 + Owner: Neutral + Location: 32,80 + Actor587: t02 + Owner: Neutral + Location: 31,83 + Actor588: tc05 + Owner: Neutral + Location: 32,85 + Actor589: t10 + Owner: Neutral + Location: 32,82 + Actor590: t11 + Owner: Neutral + Location: 42,86 + Actor591: t13 + Owner: Neutral + Location: 39,88 + Actor592: t14 + Owner: Neutral + Location: 44,97 + Actor593: t15 + Owner: Neutral + Location: 62,99 + Actor594: tc01 + Owner: Neutral + Location: 30,97 + Actor595: t17 + Owner: Neutral + Location: 25,97 + Actor596: t01 + Owner: Neutral + Location: 27,94 + Actor597: tc05 + Owner: Neutral + Location: 12,94 + Actor598: t13 + Owner: Neutral + Location: 69,94 + Actor599: t16 + Owner: Neutral + Location: 89,104 + Actor600: t10 + Owner: Neutral + Location: 84,104 + Actor601: tc04 + Owner: Neutral + Location: 83,101 + Actor602: t16 + Owner: Neutral + Location: 86,100 + Actor603: t01 + Owner: Neutral + Location: 82,103 + Actor604: t06 + Owner: Neutral + Location: 89,100 + Actor605: t02 + Owner: Neutral + Location: 88,97 + Actor606: t11 + Owner: Neutral + Location: 89,98 + Actor607: t13 + Owner: Neutral + Location: 96,101 + Actor608: t05 + Owner: Neutral + Location: 105,98 + Actor609: t01 + Owner: Neutral + Location: 39,111 + Actor610: fenc + Owner: Marinesko + Location: 24,84 + Actor611: fenc + Owner: Marinesko + Location: 25,84 + Actor612: fenc + Owner: Marinesko + Location: 26,84 + Actor613: fenc + Owner: Marinesko + Location: 26,85 + Actor614: fenc + Owner: Marinesko + Location: 27,85 + Actor615: fenc + Owner: Marinesko + Location: 17,86 + Actor616: fenc + Owner: Marinesko + Location: 16,86 + Actor617: fenc + Owner: Marinesko + Location: 15,86 + Actor618: fenc + Owner: Marinesko + Location: 14,86 + Actor619: fenc + Owner: Marinesko + Location: 14,85 + Actor620: fenc + Owner: Marinesko + Location: 12,85 + Actor621: fenc + Owner: Marinesko + Location: 13,85 + Actor622: fenc + Owner: Marinesko + Location: 22,92 + Actor623: fenc + Owner: Marinesko + Location: 24,92 + Actor624: fenc + Owner: Marinesko + Location: 23,92 + Actor625: fenc + Owner: Marinesko + Location: 25,92 + Actor626: fenc + Owner: Marinesko + Location: 25,91 + Actor627: fenc + Owner: Marinesko + Location: 26,91 + Actor628: fenc + Owner: Marinesko + Location: 27,91 + Actor629: fenc + Owner: Marinesko + Location: 22,96 + Actor630: fenc + Owner: Marinesko + Location: 23,96 + Actor631: fenc + Owner: Marinesko + Location: 23,95 + Actor632: fenc + Owner: Marinesko + Location: 23,94 + Actor633: fenc + Owner: Marinesko + Location: 18,92 + Actor634: fenc + Owner: Marinesko + Location: 18,91 + Actor635: fenc + Owner: Marinesko + Location: 18,93 + Actor636: fenc + Owner: Marinesko + Location: 17,91 + Actor649: fenc + Owner: Marinesko + Location: 34,72 + Actor651: fenc + Owner: Marinesko + Location: 27,77 + Actor652: fenc + Owner: Marinesko + Location: 26,77 + Actor653: fenc + Owner: Marinesko + Location: 25,77 + Actor654: fenc + Owner: Marinesko + Location: 18,77 + Actor655: fenc + Owner: Marinesko + Location: 17,77 + Actor656: fenc + Owner: Marinesko + Location: 16,77 + Actor657: fenc + Owner: Marinesko + Location: 15,77 + Actor658: fenc + Owner: Marinesko + Location: 10,77 + Actor659: fenc + Owner: Marinesko + Location: 11,77 + Actor660: fenc + Owner: Marinesko + Location: 12,77 + Actor661: fenc + Owner: Marinesko + Location: 13,77 + Actor662: fenc + Owner: Marinesko + Location: 14,77 + Actor665: 3tnk.rhino + Owner: Romanov + Location: 110,74 + Facing: 396 + Actor664: 3tnk.rhino + Owner: Romanov + Location: 105,58 + Facing: 256 + Actor663: 3tnk.rhino + Owner: Romanov + Facing: 256 + Location: 105,65 + Actor666: 4tnk + Owner: Romanov + Location: 103,64 + Facing: 256 + Actor669: 3tnk.rhino + Owner: Romanov + Location: 115,51 + Facing: 0 + Actor670: 3tnk.rhino + Owner: Romanov + Location: 122,51 + Facing: 0 + Actor671: v2rl + Owner: Krukov + Location: 68,20 + Facing: 624 + Actor672: v2rl + Owner: Krukov + Facing: 384 + Location: 82,20 + Actor673: v2rl + Owner: Krukov + Facing: 384 + Location: 84,20 + Actor674: v2rl + Owner: Krukov + Location: 85,16 + Facing: 642 + Actor675: v2rl + Owner: Krukov + Facing: 384 + Location: 67,11 + Actor676: grad + Owner: Krukov + Location: 79,18 + Facing: 499 + Actor677: grad + Owner: Krukov + Location: 71,19 + Facing: 626 + Actor678: grad + Owner: Krukov + Facing: 384 + Location: 70,13 + Actor679: grad + Owner: Krukov + Location: 86,15 + Facing: 634 + Actor682: btr.ai + Owner: Marinesko + Facing: 384 + Location: 28,74 + Actor683: btr.ai + Owner: Marinesko + Location: 16,78 + Facing: 523 + Actor684: btr.ai + Owner: Marinesko + Location: 18,78 + Facing: 499 + Actor685: btr.ai + Owner: Marinesko + Location: 26,78 + Facing: 388 + Actor687: 3tnk + Owner: Marinesko + Location: 24,79 + Facing: 384 + Actor688: e1 + Owner: Marinesko + SubCell: 3 + Location: 23,69 + Facing: 563 + Actor689: e1 + Owner: Marinesko + Facing: 384 + Location: 23,69 + SubCell: 1 + Actor690: e1 + Owner: Marinesko + SubCell: 3 + Location: 26,68 + Facing: 570 + Actor691: e1 + Owner: Marinesko + SubCell: 3 + Location: 23,67 + Facing: 384 + Actor692: e1 + Owner: Marinesko + Facing: 384 + SubCell: 3 + Location: 20,66 + Actor693: e1 + Owner: Marinesko + Facing: 384 + SubCell: 3 + Location: 17,61 + Actor694: e1 + Owner: Marinesko + SubCell: 3 + Location: 25,60 + Facing: 578 + Actor695: e1 + Owner: Marinesko + Facing: 384 + Location: 25,60 + SubCell: 1 + Actor696: e1 + Owner: Marinesko + Location: 24,61 + SubCell: 3 + Facing: 467 + Actor697: e1 + Owner: Marinesko + Facing: 384 + SubCell: 3 + Location: 26,62 + Actor698: e1 + Owner: Marinesko + SubCell: 3 + Location: 26,80 + Facing: 586 + Actor699: e1 + Owner: Marinesko + Facing: 384 + Location: 26,80 + SubCell: 1 + Actor700: e1 + Owner: Marinesko + Facing: 384 + Location: 26,83 + SubCell: 3 + Actor701: e1 + Owner: Marinesko + Facing: 384 + Location: 26,83 + SubCell: 1 + Actor702: e1 + Owner: Marinesko + Facing: 384 + Location: 24,83 + SubCell: 3 + Actor703: e1 + Owner: Marinesko + Facing: 384 + Location: 25,83 + SubCell: 3 + Actor706: e1 + Owner: Marinesko + Facing: 384 + Location: 25,83 + SubCell: 4 + Actor707: e1 + Owner: Marinesko + Location: 15,85 + SubCell: 3 + Facing: 475 + Actor708: e1 + Owner: Marinesko + Facing: 384 + Location: 15,85 + SubCell: 1 + Actor713: e1 + Owner: Marinesko + Location: 16,85 + SubCell: 4 + Facing: 586 + Actor714: e1 + Owner: Marinesko + Location: 16,85 + SubCell: 5 + Facing: 729 + Actor704: e3 + Owner: Marinesko + SubCell: 3 + Location: 26,81 + Facing: 507 + Actor705: e3 + Owner: Marinesko + Facing: 384 + Location: 26,68 + SubCell: 1 + Actor709: e3 + Owner: Marinesko + Facing: 384 + SubCell: 3 + Location: 29,68 + Actor710: e3 + Owner: Marinesko + Facing: 384 + SubCell: 3 + Location: 14,72 + Actor711: e3 + Owner: Marinesko + SubCell: 3 + Location: 15,75 + Facing: 927 + Actor712: e3 + Owner: Marinesko + SubCell: 3 + Location: 29,75 + Facing: 666 + Actor715: e3 + Owner: Marinesko + Location: 17,78 + SubCell: 3 + Facing: 475 + Actor716: e3 + Owner: Marinesko + SubCell: 3 + Location: 16,84 + Facing: 523 + Actor717: e3 + Owner: Marinesko + Facing: 384 + Location: 25,82 + SubCell: 3 + Actor718: ttrp + Owner: Marinesko + Facing: 384 + SubCell: 3 + Location: 14,84 + Actor719: ttrp + Owner: Marinesko + Facing: 384 + Location: 16,75 + SubCell: 3 + Actor720: ttrp + Owner: Marinesko + Location: 27,75 + SubCell: 3 + Facing: 384 + Actor721: ttrp + Owner: Marinesko + Location: 26,73 + SubCell: 3 + Facing: 384 + Actor722: ttrp + Owner: Marinesko + Location: 23,67 + SubCell: 1 + Facing: 682 + Actor723: ttrp + Owner: Marinesko + Facing: 384 + SubCell: 3 + Location: 20,67 + Actor724: ttrp + Owner: Marinesko + Facing: 384 + Location: 26,62 + SubCell: 1 + Actor725: ttrp + Owner: Marinesko + SubCell: 3 + Location: 18,61 + Facing: 864 + Actor726: shok + Owner: Marinesko + Facing: 384 + Location: 18,62 + SubCell: 3 + Actor727: shok + Owner: Marinesko + Facing: 384 + SubCell: 3 + Location: 28,60 + Actor728: deso + Owner: Marinesko + SubCell: 3 + Location: 19,73 + Facing: 634 + Actor729: cmsr + Owner: Marinesko + SubCell: 3 + Location: 21,67 + Facing: 578 + Actor730: apoc + Owner: Romanov + Facing: 384 + Location: 118,64 + Actor731: apoc + Owner: Romanov + Location: 105,62 + Facing: 261 + Actor732: iron + Owner: Romanov + Location: 121,62 + Actor648: fenc + Owner: Marinesko + Location: 34,71 + Actor637: brik + Owner: Marinesko + Location: 34,70 + Actor638: brik + Owner: Marinesko + Location: 35,70 + Actor639: brik + Owner: Marinesko + Location: 37,70 + Actor640: brik + Owner: Marinesko + Location: 36,70 + Actor641: brik + Owner: Marinesko + Location: 38,70 + Actor642: brik + Owner: Marinesko + Location: 39,70 + Actor643: brik + Owner: Marinesko + Location: 39,69 + Actor644: brik + Owner: Marinesko + Location: 40,69 + Actor645: brik + Owner: Marinesko + Location: 40,68 + Actor646: brik + Owner: Marinesko + Location: 40,67 + Actor647: brik + Owner: Marinesko + Location: 40,66 + Actor650: brik + Owner: Marinesko + Location: 39,66 + Actor680: brik + Owner: Marinesko + Location: 39,67 + Actor681: brik + Owner: Marinesko + Location: 34,57 + Actor734: brik + Owner: Marinesko + Location: 35,57 + Actor735: brik + Owner: Marinesko + Location: 36,57 + Actor736: brik + Owner: Marinesko + Location: 37,57 + Actor737: brik + Owner: Marinesko + Location: 38,57 + Actor738: brik + Owner: Marinesko + Location: 39,57 + Actor739: brik + Owner: Marinesko + Location: 40,57 + Actor740: brik + Owner: Marinesko + Location: 40,58 + Actor741: brik + Owner: Marinesko + Location: 40,59 + Actor742: brik + Owner: Marinesko + Location: 40,60 + Actor743: brik + Owner: Marinesko + Location: 39,60 + Actor744: brik + Owner: Marinesko + Location: 39,59 + Actor745: fenc + Owner: Marinesko + Location: 41,69 + Actor746: fenc + Owner: Marinesko + Location: 41,68 + Actor747: fenc + Owner: Marinesko + Location: 41,67 + Actor748: fenc + Owner: Marinesko + Location: 41,59 + Actor749: fenc + Owner: Marinesko + Location: 41,58 + Actor750: fenc + Owner: Marinesko + Location: 41,57 + Actor751: fenc + Owner: Marinesko + Location: 41,56 + Actor752: fenc + Owner: Marinesko + Location: 40,56 + Actor753: fenc + Owner: Marinesko + Location: 39,56 + Actor754: fenc + Owner: Marinesko + Location: 38,56 + Actor755: fenc + Owner: Marinesko + Location: 37,56 + Actor756: fenc + Owner: Marinesko + Location: 36,56 + Actor757: fenc + Owner: Marinesko + Location: 35,56 + Actor758: apwr + Owner: Marinesko + Location: 33,67 + Actor759: apwr + Owner: Marinesko + Location: 30,63 + Actor760: apwr + Owner: Marinesko + Location: 33,63 + Actor761: weap + Owner: Marinesko + Location: 32,58 + Actor762: ftur + Owner: Marinesko + Location: 41,66 + Actor763: ftur + Owner: Marinesko + Location: 41,60 + Actor764: tsla + Owner: Marinesko + Location: 39,68 + Actor765: tsla + Owner: Marinesko + Location: 39,58 + Actor766: sam + Owner: Marinesko + Location: 36,69 + Actor767: sam + Owner: Marinesko + Location: 36,58 + Actor768: oilr + Owner: Neutral + Location: 67,69 + Actor769: oilb + Owner: Neutral + Location: 76,64 + Actor770: oilb + Owner: Neutral + Location: 77,73 + Actor771: brl3 + Owner: Neutral + Location: 76,72 + Actor772: brl3 + Owner: Neutral + Location: 78,71 + Actor773: brl3 + Owner: Neutral + Location: 77,66 + Actor774: brl3 + Owner: Neutral + Location: 70,68 + Actor775: brl3 + Owner: Neutral + Location: 72,71 + Actor776: barl + Owner: Neutral + Location: 70,70 + Actor777: barl + Owner: Neutral + Location: 76,66 + Actor778: barl + Owner: Neutral + Location: 75,65 + Actor779: barl + Owner: Neutral + Location: 78,72 + Actor780: barl + Owner: Neutral + Location: 78,75 + Actor781: barl + Owner: Neutral + Location: 66,71 + Actor782: brl3 + Owner: Neutral + Location: 67,72 + Actor783: chain + Owner: Neutral + Location: 66,66 + Actor784: chain + Owner: Neutral + Location: 68,66 + Actor785: chain + Owner: Neutral + Location: 69,66 + Actor786: chain + Owner: Neutral + Location: 67,66 + Actor787: chain + Owner: Neutral + Location: 65,66 + Actor788: chain + Owner: Neutral + Location: 65,68 + Actor789: chain + Owner: Neutral + Location: 65,67 + Actor790: chain + Owner: Neutral + Location: 65,69 + Actor791: chain + Owner: Neutral + Location: 65,70 + Actor792: chain + Owner: Neutral + Location: 65,71 + Actor793: chain + Owner: Neutral + Location: 65,72 + Actor794: chain + Owner: Neutral + Location: 65,73 + Actor795: chain + Owner: Neutral + Location: 65,74 + Actor796: chain + Owner: Neutral + Location: 65,75 + Actor797: chain + Owner: Neutral + Location: 66,75 + Actor798: chain + Owner: Neutral + Location: 67,75 + Actor799: chain + Owner: Neutral + Location: 68,75 + Actor800: chain + Owner: Neutral + Location: 74,76 + Actor801: chain + Owner: Neutral + Location: 75,76 + Actor802: chain + Owner: Neutral + Location: 73,76 + Actor803: chain + Owner: Neutral + Location: 76,76 + Actor804: chain + Owner: Neutral + Location: 77,76 + Actor805: chain + Owner: Neutral + Location: 78,76 + Actor806: chain + Owner: Neutral + Location: 79,76 + Actor807: chain + Owner: Neutral + Location: 80,76 + Actor808: chain + Owner: Neutral + Location: 80,75 + Actor809: chain + Owner: Neutral + Location: 80,74 + Actor810: chain + Owner: Neutral + Location: 80,72 + Actor811: chain + Owner: Neutral + Location: 80,73 + Actor812: chain + Owner: Neutral + Location: 80,71 + Actor813: chain + Owner: Neutral + Location: 80,70 + Actor814: chain + Owner: Neutral + Location: 80,69 + Actor815: chain + Owner: Neutral + Location: 80,68 + Actor816: chain + Owner: Neutral + Location: 74,63 + Actor817: chain + Owner: Neutral + Location: 76,63 + Actor818: chain + Owner: Neutral + Location: 75,63 + Actor819: chain + Owner: Neutral + Location: 77,63 + Actor820: chain + Owner: Neutral + Location: 79,63 + Actor821: chain + Owner: Neutral + Location: 78,63 + Actor822: chain + Owner: Neutral + Location: 80,63 + Actor823: chain + Owner: Neutral + Location: 80,64 + Actor824: chain + Owner: Neutral + Location: 80,65 + Actor825: chain + Owner: Neutral + Location: 80,66 + Actor826: chain + Owner: Neutral + Location: 80,67 + Actor827: chain + Owner: Neutral + Location: 73,63 + Actor828: tc01 + Owner: Neutral + Location: 81,69 + Actor829: tc04 + Owner: Neutral + Location: 81,71 + Actor830: t16 + Owner: Neutral + Location: 64,68 + Actor831: t10 + Owner: Neutral + Location: 81,65 + Actor832: t13 + Owner: Neutral + Location: 63,73 + Actor833: tc02 + Owner: Neutral + Location: 68,62 + Actor834: t14 + Owner: Neutral + Location: 79,61 + Actor835: tc05 + Owner: Neutral + Location: 69,80 + Actor836: tc05 + Owner: Neutral + Location: 89,124 + Actor837: t07 + Owner: Neutral + Location: 87,125 + Actor838: tc01 + Owner: Neutral + Location: 88,126 + Actor839: tc04 + Owner: Neutral + Location: 93,125 + Actor840: tc03 + Owner: Neutral + Location: 96,125 + Actor841: t10 + Owner: Neutral + Location: 98,123 + Actor842: t12 + Owner: Neutral + Location: 102,121 + Actor843: t15 + Owner: Neutral + Location: 95,127 + Actor844: t15 + Owner: Neutral + Location: 90,126 + Actor845: t07 + Owner: Neutral + Location: 99,126 + Actor846: t08 + Owner: Neutral + Location: 99,125 + Actor847: t05 + Owner: Neutral + Location: 101,124 + Actor848: t01 + Owner: Neutral + Location: 102,123 + Actor849: t06 + Owner: Neutral + Location: 100,123 + Actor850: t14 + Owner: Neutral + Location: 99,125 + Actor851: tc05 + Owner: Neutral + Location: 106,126 + Actor852: t16 + Owner: Neutral + Location: 106,124 + Actor853: t17 + Owner: Neutral + Location: 109,127 + Actor854: t01 + Owner: Neutral + Location: 104,127 + Actor855: t02 + Owner: Neutral + Location: 105,119 + Actor857: t12 + Owner: Neutral + Location: 83,123 + Actor856: t16 + Owner: Neutral + Location: 83,126 + Actor858: t13 + Owner: Neutral + Location: 86,121 + Actor860: split2 + Owner: Neutral + Location: 92,115 + Actor861: split2 + Owner: Neutral + Location: 86,116 + Actor862: split2 + Owner: Neutral + Location: 84,111 + Actor859: split2 + Owner: Neutral + Location: 33,107 + Actor863: split2 + Owner: Neutral + Location: 35,102 + Actor864: split2 + Owner: Neutral + Location: 79,82 + Actor865: split2 + Owner: Neutral + Location: 84,79 + Actor866: split2 + Owner: Neutral + Location: 4,76 + Actor867: split2 + Owner: Neutral + Location: 6,70 + Actor868: t10 + Owner: Neutral + Location: 60,84 + Actor869: t11 + Owner: Neutral + Location: 52,82 + Actor870: t16 + Owner: Neutral + Location: 60,83 + Actor871: t05 + Owner: Neutral + Location: 62,86 + Actor872: t01 + Owner: Neutral + Location: 53,87 + Actor875: t06 + Owner: Neutral + Location: 69,85 + Actor876: t14 + Owner: Neutral + Location: 46,121 + Actor877: t16 + Owner: Neutral + Location: 55,119 + Actor878: ice01 + Owner: Neutral + Location: 73,45 + Actor879: ice02 + Owner: Neutral + Location: 77,42 + Actor880: ice04 + Owner: Neutral + Location: 77,45 + Actor881: ice05 + Owner: Neutral + Location: 75,44 + Actor882: t15 + Owner: Neutral + Location: 69,41 + Actor883: t01 + Owner: Neutral + Location: 84,43 + Actor884: tc04 + Owner: Neutral + Location: 79,48 + Actor885: t15 + Owner: Neutral + Location: 79,47 + Actor886: tc02 + Owner: Neutral + Location: 82,46 + Actor887: t12 + Owner: Neutral + Location: 82,48 + Actor888: t05 + Owner: Neutral + Location: 84,45 + Actor889: tc05 + Owner: Neutral + Location: 83,40 + Actor890: t12 + Owner: Neutral + Location: 85,42 + Actor891: tc03 + Owner: Neutral + Location: 86,40 + Actor892: t17 + Owner: Neutral + Location: 86,38 + Actor893: t13 + Owner: Neutral + Location: 88,42 + Actor894: t11 + Owner: Neutral + Location: 94,40 + Actor895: tc05 + Owner: Neutral + Location: 125,95 + Actor896: t16 + Owner: Neutral + Location: 123,94 + Actor897: t02 + Owner: Neutral + Location: 121,91 + Actor898: t01 + Owner: Neutral + Location: 118,93 + Actor899: t14 + Owner: Neutral + Location: 115,92 + Actor900: oilb + Owner: Romanov + Location: 116,112 + Actor901: oilb + Owner: Romanov + Location: 120,114 + Actor902: brl3 + Owner: Romanov + Location: 117,115 + Actor903: barl + Owner: Romanov + Location: 116,114 + Actor904: barl + Owner: Romanov + Location: 121,113 + Actor905: brl3 + Owner: Romanov + Location: 121,112 + Actor906: macs + Owner: Romanov + Location: 120,108 + Actor907: chain + Owner: Romanov + Location: 121,107 + Actor908: chain + Owner: Romanov + Location: 120,107 + Actor909: chain + Owner: Romanov + Location: 119,107 + Actor910: chain + Owner: Romanov + Location: 118,107 + Actor911: chain + Owner: Romanov + Location: 122,107 + Actor912: chain + Owner: Romanov + Location: 123,107 + Actor913: chain + Owner: Romanov + Location: 123,108 + Actor914: chain + Owner: Romanov + Location: 123,109 + Actor915: chain + Owner: Romanov + Location: 123,110 + Actor916: chain + Owner: Romanov + Location: 123,111 + Actor917: chain + Owner: Romanov + Location: 123,112 + Actor918: chain + Owner: Romanov + Location: 123,113 + Actor919: chain + Owner: Romanov + Location: 123,114 + Actor920: chain + Owner: Romanov + Location: 123,115 + Actor921: chain + Owner: Romanov + Location: 123,116 + Actor922: chain + Owner: Romanov + Location: 123,117 + Actor923: chain + Owner: Romanov + Location: 122,117 + Actor924: chain + Owner: Romanov + Location: 120,117 + Actor925: chain + Owner: Romanov + Location: 121,117 + Actor926: chain + Owner: Romanov + Location: 119,117 + Actor927: chain + Owner: Romanov + Location: 118,117 + Actor928: chain + Owner: Romanov + Location: 117,117 + Actor929: chain + Owner: Romanov + Location: 116,117 + Actor930: chain + Owner: Romanov + Location: 115,117 + Actor931: chain + Owner: Romanov + Location: 114,117 + Actor932: chain + Owner: Romanov + Location: 114,116 + Actor933: chain + Owner: Romanov + Location: 114,115 + Actor934: chain + Owner: Romanov + Location: 114,114 + Actor935: chain + Owner: Romanov + Location: 114,108 + Actor936: chain + Owner: Romanov + Location: 114,107 + Actor937: chain + Owner: Romanov + Location: 116,107 + Actor938: chain + Owner: Romanov + Location: 117,107 + Actor939: chain + Owner: Romanov + Location: 115,107 + Actor940: chain + Owner: Romanov + Location: 114,109 + Actor941: e1 + Owner: Romanov + Facing: 384 + Location: 113,108 + SubCell: 3 + Actor942: e1 + Owner: Romanov + SubCell: 3 + Location: 113,114 + Facing: 134 + Actor943: e1 + Owner: Romanov + Facing: 384 + SubCell: 3 + Location: 117,109 + Actor944: 3tnk.rhino + Owner: Romanov + Location: 113,111 + Facing: 253 + Actor946: e3 + Owner: Romanov + Facing: 384 + Location: 115,108 + SubCell: 3 + Actor945: e4 + Owner: Romanov + SubCell: 3 + Location: 114,112 + Facing: 237 + Actor948: e1 + Owner: Romanov + Location: 113,110 + SubCell: 1 + Facing: 126 + Actor947: fenc + Owner: Marinesko + Location: 25,118 + Actor949: fenc + Owner: Marinesko + Location: 25,117 + Actor950: fenc + Owner: Marinesko + Location: 25,116 + Actor951: fenc + Owner: Marinesko + Location: 25,115 + Actor952: fenc + Owner: Marinesko + Location: 26,115 + Actor953: fenc + Owner: Marinesko + Location: 26,114 + Actor954: fenc + Owner: Marinesko + Location: 27,118 + Actor955: fenc + Owner: Marinesko + Location: 27,120 + Actor956: fenc + Owner: Marinesko + Location: 27,119 + Actor957: fenc + Owner: Marinesko + Location: 27,121 + Actor958: fenc + Owner: Marinesko + Location: 28,114 + Actor959: fenc + Owner: Marinesko + Location: 28,113 + Actor960: fenc + Owner: Marinesko + Location: 28,112 + Actor961: fenc + Owner: Marinesko + Location: 28,111 + Actor962: fenc + Owner: Marinesko + Location: 27,111 + Actor963: fenc + Owner: Marinesko + Location: 27,110 + Actor964: fenc + Owner: Marinesko + Location: 27,109 + Actor965: hosp + Owner: Marinesko + Location: 17,113 + Actor966: v02 + Faction: soviet + Location: 68,53 + Owner: Neutral + Actor967: v03 + Faction: soviet + Location: 67,59 + Owner: Neutral + Actor968: v05 + Faction: soviet + Location: 61,54 + Owner: Neutral + Actor969: v08 + Faction: soviet + Location: 77,54 + Owner: Neutral + Actor970: v07 + Faction: soviet + Location: 68,49 + Owner: Neutral + Actor971: v11 + Faction: soviet + Location: 64,51 + Owner: Neutral + Actor972: v09 + Faction: soviet + Location: 61,59 + Owner: Neutral + Actor973: v04 + Faction: soviet + Location: 59,46 + Owner: Neutral + Actor974: oilb + Owner: Marinesko + Location: 22,116 + Actor975: oilb + Owner: Marinesko + Location: 21,110 + Actor976: e1 + Owner: Marinesko + SubCell: 3 + Location: 26,111 + Facing: 768 + Actor979: e1 + Owner: Marinesko + Location: 26,111 + SubCell: 4 + Facing: 768 + Actor984: e1 + Owner: Marinesko + SubCell: 4 + Facing: 768 + Location: 25,114 + Actor988: e1 + Owner: Marinesko + SubCell: 2 + Facing: 768 + Location: 25,120 + Actor989: e1 + Owner: Marinesko + SubCell: 4 + Location: 25,120 + Facing: 768 + Actor991: e1 + Owner: Marinesko + SubCell: 3 + Facing: 768 + Location: 26,118 + Actor992: e1 + Owner: Marinesko + SubCell: 1 + Facing: 768 + Location: 26,118 + Actor994: e1 + Owner: Marinesko + SubCell: 4 + Facing: 768 + Location: 26,118 + Actor977: e1 + Owner: Marinesko + SubCell: 3 + Location: 18,116 + Facing: 768 + Actor978: e1 + Owner: Marinesko + SubCell: 4 + Location: 18,116 + Facing: 555 + Actor980: e3 + Owner: Marinesko + Facing: 384 + SubCell: 3 + Location: 24,113 + Actor981: e3 + Owner: Marinesko + SubCell: 3 + Location: 20,115 + Facing: 594 + Actor982: e3 + Owner: Marinesko + SubCell: 3 + Location: 24,120 + Facing: 832 + Actor983: ttrp + Owner: Marinesko + SubCell: 3 + Location: 22,119 + Facing: 697 + Actor985: ttrp + Owner: Marinesko + SubCell: 3 + Location: 25,112 + Facing: 578 + Actor986: btr.ai + Owner: Marinesko + Location: 24,110 + Facing: 658 + Actor987: btr.ai + Owner: Marinesko + Location: 19,119 + Facing: 761 + Actor990: fenc + Owner: Marinesko + Location: 13,118 + Actor993: fenc + Owner: Marinesko + Location: 13,117 + Actor995: fenc + Owner: Marinesko + Location: 13,116 + Actor996: fenc + Owner: Marinesko + Location: 13,115 + Actor997: fenc + Owner: Marinesko + Location: 13,114 + Actor998: fenc + Owner: Marinesko + Location: 13,113 + Actor999: fenc + Owner: Marinesko + Location: 13,112 + Actor1000: fenc + Owner: Marinesko + Location: 14,118 + Actor1001: fenc + Owner: Marinesko + Location: 14,119 + Actor1002: fenc + Owner: Marinesko + Location: 17,112 + Actor1003: fenc + Owner: Marinesko + Location: 16,112 + Actor1004: fenc + Owner: Marinesko + Location: 16,113 + Actor1005: fenc + Owner: Marinesko + Location: 16,114 + Actor1006: fenc + Owner: Marinesko + Location: 16,111 + Actor1007: fenc + Owner: Marinesko + Location: 13,111 + Actor1008: fenc + Owner: Marinesko + Location: 18,123 + Actor1009: fenc + Owner: Marinesko + Location: 19,123 + Actor1010: fenc + Owner: Marinesko + Location: 20,123 + Actor1011: fenc + Owner: Marinesko + Location: 20,122 + Actor1012: fenc + Owner: Marinesko + Location: 17,123 + Actor1013: fenc + Owner: Marinesko + Location: 17,122 + Actor1014: fenc + Owner: Marinesko + Location: 21,122 + Actor1015: fenc + Owner: Marinesko + Location: 22,106 + Actor1016: fenc + Owner: Marinesko + Location: 23,106 + Actor1017: fenc + Owner: Marinesko + Location: 24,106 + Actor1018: fenc + Owner: Marinesko + Location: 24,107 + Actor1019: fenc + Owner: Marinesko + Location: 24,108 + Actor1020: minv + Owner: Marinesko + Location: 29,121 + Actor1021: minv + Owner: Marinesko + Location: 30,118 + Actor1025: minv + Owner: Marinesko + Location: 30,124 + Actor1026: 3tnk.rhino + Owner: Romanov + Facing: 253 + Location: 112,114 + Actor1027: split2 + Owner: Neutral + Location: 94,6 + Actor1028: split2 + Owner: Neutral + Location: 98,12 + Actor1029: split2 + Owner: Neutral + Location: 100,4 + Actor1030: split2 + Owner: Neutral + Location: 114,41 + Actor1031: split2 + Owner: Neutral + Location: 119,42 + Actor1032: split2 + Owner: Neutral + Location: 125,45 + Actor1033: silo + Owner: Romanov + Location: 117,57 + Actor1034: proc + Owner: Romanov + Location: 117,57 + Actor1035: silo + Owner: Romanov + Location: 119,57 + Actor1036: weap + Owner: Romanov + Location: 115,66 + Actor1037: split2 + Owner: Neutral + Location: 35,39 + Actor1038: split2 + Owner: Neutral + Location: 42,37 + Actor1039: split2 + Owner: Neutral + Location: 45,42 + Actor1040: wood + Owner: Neutral + Location: 56,49 + Actor1041: wood + Owner: Neutral + Location: 56,50 + Actor1042: wood + Owner: Neutral + Location: 56,51 + Actor1043: wood + Owner: Neutral + Location: 56,53 + Actor1044: wood + Owner: Neutral + Location: 56,52 + Actor1045: wood + Owner: Neutral + Location: 56,54 + Actor1046: wood + Owner: Neutral + Location: 56,48 + Actor1047: wood + Owner: Neutral + Location: 58,46 + Actor1048: wood + Owner: Neutral + Location: 56,46 + Actor1049: wood + Owner: Neutral + Location: 57,46 + Actor1050: wood + Owner: Neutral + Location: 56,47 + Actor1051: wood + Owner: Neutral + Location: 57,54 + Actor1052: wood + Owner: Neutral + Location: 72,53 + Actor1053: wood + Owner: Neutral + Location: 72,54 + Actor1054: wood + Owner: Neutral + Location: 73,54 + Actor1055: wood + Owner: Neutral + Location: 74,54 + Actor1056: wood + Owner: Neutral + Location: 75,54 + Actor1057: wood + Owner: Neutral + Location: 80,54 + Actor1058: wood + Owner: Neutral + Location: 82,54 + Actor1059: wood + Owner: Neutral + Location: 81,54 + Actor1060: wood + Owner: Neutral + Location: 82,55 + Actor1061: wood + Owner: Neutral + Location: 82,56 + Actor1062: wood + Owner: Neutral + Location: 82,57 + Actor1063: wood + Owner: Neutral + Location: 81,57 + Actor1064: wood + Owner: Neutral + Location: 59,58 + Actor1065: wood + Owner: Neutral + Location: 59,59 + Actor1066: wood + Owner: Neutral + Location: 59,60 + Actor1067: wood + Owner: Neutral + Location: 60,60 + Actor1068: wood + Owner: Neutral + Location: 61,60 + Actor1069: wood + Owner: Neutral + Location: 62,60 + Actor1070: wood + Owner: Neutral + Location: 58,58 + Actor1071: v10 + Owner: Neutral + Location: 57,51 + Actor1072: v06 + Owner: Neutral + Location: 64,43 + Actor1073: v18 + Owner: Neutral + Location: 67,43 + Actor1074: v17 + Owner: Neutral + Location: 66,43 + Actor1075: v15 + Owner: Neutral + Location: 59,50 + Actor1076: v16 + Owner: Neutral + Location: 60,50 + Actor1077: t07 + Owner: Neutral + Location: 57,48 + Actor1078: t12 + Owner: Neutral + Location: 71,56 + Actor1079: t05 + Owner: Neutral + Location: 60,42 + Actor1080: t01 + Owner: Neutral + Location: 54,50 + Actor1081: tc04 + Owner: Neutral + Location: 50,59 + Actor1082: t08 + Owner: Neutral + Location: 52,58 + Actor1083: t01 + Owner: Neutral + Location: 87,54 + Actor1084: t02 + Owner: Neutral + Location: 90,66 + Actor1085: t07 + Owner: Neutral + Location: 95,86 + Actor1086: t01 + Owner: Neutral + Location: 99,82 + Actor1087: t03 + Owner: Neutral + Location: 110,89 + Actor1088: t13 + Owner: Neutral + Location: 123,80 + Actor1089: t10 + Owner: Neutral + Location: 97,71 + Actor1091: t10 + Owner: Neutral + Location: 99,48 + Actor1090: t05 + Owner: Neutral + Location: 102,47 + Actor1092: t02 + Owner: Neutral + Location: 116,31 + Actor1093: t08 + Owner: Neutral + Location: 118,34 + Actor1094: t10 + Owner: Neutral + Location: 76,35 + Actor1095: t12 + Owner: Neutral + Location: 59,31 + Actor1096: t01 + Owner: Neutral + Location: 69,31 + Actor1097: tc04 + Owner: Neutral + Location: 92,29 + Actor1098: t13 + Owner: Neutral + Location: 95,28 + Actor1099: t08 + Owner: Neutral + Location: 96,30 + Actor1100: t01 + Owner: Neutral + Location: 97,27 + Actor1101: t03 + Owner: Neutral + Location: 93,27 + Actor1102: tc01 + Owner: Neutral + Location: 95,24 + Actor1103: t14 + Owner: Neutral + Location: 97,21 + Actor1104: tc02 + Owner: Neutral + Location: 117,9 + Actor1105: t06 + Owner: Neutral + Location: 118,13 + Actor1106: t13 + Owner: Neutral + Location: 121,12 + Actor1107: t05 + Owner: Neutral + Location: 123,15 + Actor1108: t01 + Owner: Neutral + Location: 122,14 + Actor1109: t14 + Owner: Neutral + Location: 120,20 + Actor1110: tc05 + Owner: Neutral + Location: 121,26 + Actor1111: t17 + Owner: Neutral + Location: 124,28 + Actor1113: oilb + Owner: Krukov + Location: 44,22 + Actor1114: fcom + Owner: Krukov + Location: 39,26 + Actor1115: chain + Owner: Krukov + Location: 36,22 + Actor1116: chain + Owner: Krukov + Location: 36,23 + Actor1117: chain + Owner: Krukov + Location: 36,21 + Actor1118: chain + Owner: Krukov + Location: 36,20 + Actor1119: chain + Owner: Krukov + Location: 37,20 + Actor1120: chain + Owner: Krukov + Location: 38,20 + Actor1121: chain + Owner: Krukov + Location: 39,20 + Actor1122: chain + Owner: Krukov + Location: 40,20 + Actor1123: chain + Owner: Krukov + Location: 42,20 + Actor1124: chain + Owner: Krukov + Location: 41,20 + Actor1125: chain + Owner: Krukov + Location: 43,20 + Actor1126: chain + Owner: Krukov + Location: 44,20 + Actor1127: chain + Owner: Krukov + Location: 46,20 + Actor1128: chain + Owner: Krukov + Location: 45,20 + Actor1129: chain + Owner: Krukov + Location: 47,20 + Actor1130: chain + Owner: Krukov + Location: 47,21 + Actor1131: chain + Owner: Krukov + Location: 47,22 + Actor1132: chain + Owner: Krukov + Location: 47,23 + Actor1133: chain + Owner: Krukov + Location: 47,24 + Actor1134: chain + Owner: Krukov + Location: 47,25 + Actor1135: chain + Owner: Krukov + Location: 47,26 + Actor1136: chain + Owner: Krukov + Location: 46,26 + Actor1137: chain + Owner: Krukov + Location: 45,26 + Actor1138: chain + Owner: Krukov + Location: 36,26 + Actor1139: chain + Owner: Krukov + Location: 36,25 + Actor1140: chain + Owner: Krukov + Location: 36,24 + Actor1141: chain + Owner: Krukov + Location: 37,26 + Actor1142: chain + Owner: Krukov + Location: 37,27 + Actor1143: chain + Owner: Krukov + Location: 37,28 + Actor1144: chain + Owner: Krukov + Location: 37,29 + Actor1145: chain + Owner: Krukov + Location: 37,30 + Actor1146: chain + Owner: Krukov + Location: 38,30 + Actor1147: barb + Owner: Krukov + Location: 37,19 + Actor1148: barb + Owner: Krukov + Location: 36,19 + Actor1149: barb + Owner: Krukov + Location: 35,19 + Actor1150: barb + Owner: Krukov + Location: 35,20 + Actor1151: barb + Owner: Krukov + Location: 35,21 + Actor1152: barb + Owner: Krukov + Location: 35,22 + Actor1153: barb + Owner: Krukov + Location: 47,27 + Actor1154: barb + Owner: Krukov + Location: 48,27 + Actor1155: barb + Owner: Krukov + Location: 48,26 + Actor1156: barb + Owner: Krukov + Location: 46,27 + Actor1157: barb + Owner: Krukov + Location: 48,25 + Actor1158: brl3 + Owner: Krukov + Location: 46,25 + Actor1159: brl3 + Owner: Krukov + Location: 46,21 + Actor1160: brl3 + Owner: Krukov + Location: 41,23 + Actor1161: brl3 + Owner: Krukov + Location: 43,23 + Actor1162: brl3 + Owner: Krukov + Location: 40,24 + Actor1163: barl + Owner: Krukov + Location: 40,23 + Actor1164: barl + Owner: Krukov + Location: 43,22 + Actor1165: barl + Owner: Krukov + Location: 45,21 + Actor1166: barl + Owner: Krukov + Location: 46,24 + Actor1167: barl + Owner: Krukov + Location: 45,25 + Actor1169: barl + Owner: Krukov + Location: 37,22 + Actor1170: barl + Owner: Krukov + Location: 37,25 + Actor1171: brl3 + Owner: Krukov + Location: 37,23 + Actor1172: barl + Owner: Krukov + Location: 37,24 + Actor1112: oilb + Owner: Krukov + Location: 38,22 + Actor1168: brl3 + Owner: Krukov + Location: 41,21 + Actor1173: t03 + Owner: Neutral + Faction: soviet + Location: 47,31 + Actor1174: tc01 + Owner: Neutral + Faction: soviet + Location: 38,18 + Actor1175: tc05 + Owner: Neutral + Faction: soviet + Location: 33,23 + Actor1176: t05 + Owner: Neutral + Faction: soviet + Location: 48,23 + Actor1177: t01 + Owner: Neutral + Faction: soviet + Location: 32,28 + Actor1178: t14 + Owner: Neutral + Faction: soviet + Location: 22,42 + Actor1179: tc02 + Owner: Neutral + Faction: soviet + Location: 31,46 + Actor1180: t07 + Owner: Neutral + Faction: soviet + Location: 8,50 + Actor1181: v2rl + Owner: Krukov + Facing: 384 + Location: 113,20 + Actor1182: v2rl + Owner: Krukov + Facing: 384 + Location: 116,24 + Actor1183: grad + Owner: Krukov + Facing: 384 + Location: 117,22 + Actor1184: grad + Owner: Krukov + Facing: 384 + Location: 119,24 + Actor1185: grad + Owner: Krukov + Location: 34,26 + Facing: 602 + Actor1186: grad + Owner: Krukov + Location: 32,23 + Facing: 626 + Actor1187: grad + Owner: Krukov + Location: 43,19 + Facing: 507 + Actor1188: v2rl + Owner: Krukov + Location: 43,25 + Facing: 499 + Actor1189: v3rl + Owner: Krukov + Facing: 384 + Location: 71,8 + Actor1190: v3rl + Owner: Krukov + Facing: 384 + Location: 113,12 + Actor1191: v3rl + Owner: Krukov + Facing: 384 + Location: 120,17 + Actor1192: v3rl + Owner: Krukov + Location: 41,16 + Facing: 531 + Actor1198: e1 + Owner: Romanov + Location: 109,74 + SubCell: 3 + Facing: 618 + Actor1203: e1 + Owner: Romanov + SubCell: 3 + Location: 106,56 + Facing: 285 + Actor1205: e1 + Owner: Romanov + SubCell: 3 + Location: 116,51 + Facing: 0 + Actor1206: e1 + Owner: Romanov + SubCell: 3 + Location: 114,52 + Facing: 0 + Actor1204: e1 + Owner: Romanov + SubCell: 3 + Facing: 285 + Location: 104,57 + Actor1202: e1 + Owner: Romanov + SubCell: 3 + Facing: 285 + Location: 105,64 + Actor1201: e1 + Owner: Romanov + SubCell: 3 + Facing: 285 + Location: 105,66 + Actor1200: e1 + Owner: Romanov + SubCell: 3 + Facing: 618 + Location: 108,74 + Actor1197: e1 + Owner: Romanov + SubCell: 3 + Facing: 618 + Location: 109,73 + Actor1199: e1 + Owner: Romanov + SubCell: 3 + Facing: 618 + Location: 111,75 + Actor1207: e3 + Owner: Romanov + Facing: 384 + SubCell: 1 + Location: 109,74 + Actor1208: e3 + Owner: Romanov + Facing: 384 + Location: 106,58 + SubCell: 3 + Actor1209: e3 + Owner: Romanov + Facing: 384 + SubCell: 3 + Location: 124,56 + Actor1210: e3 + Owner: Romanov + Facing: 384 + SubCell: 3 + Location: 125,62 + Actor1211: e1 + Owner: Romanov + Facing: 384 + SubCell: 3 + Location: 124,67 + Actor1212: e1 + Owner: Romanov + Facing: 384 + SubCell: 3 + Location: 127,63 + Actor1213: e1 + Owner: Romanov + Facing: 384 + SubCell: 3 + Location: 108,68 + Actor1214: e1 + Owner: Krukov + SubCell: 3 + Location: 72,19 + Facing: 650 + Actor1215: e1 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 69,19 + Actor1216: e1 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 66,15 + Actor1217: e1 + Owner: Krukov + Facing: 384 + Location: 66,15 + SubCell: 1 + Actor1218: e1 + Owner: Krukov + Location: 67,14 + SubCell: 3 + Facing: 570 + Actor1219: e1 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 68,12 + Actor1220: e1 + Owner: Krukov + Facing: 384 + Location: 66,9 + SubCell: 3 + Actor1221: e1 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 87,15 + Actor1222: e1 + Owner: Krukov + SubCell: 3 + Location: 86,17 + Facing: 578 + Actor1223: e1 + Owner: Krukov + Facing: 384 + Location: 86,17 + SubCell: 1 + Actor1224: e1 + Owner: Krukov + SubCell: 3 + Location: 83,19 + Facing: 483 + Actor1225: e1 + Owner: Krukov + Facing: 384 + Location: 88,19 + SubCell: 3 + Actor1226: e3 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 79,17 + Actor1227: e3 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 76,13 + Actor1228: e3 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 71,13 + Actor1229: e3 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 87,7 + Actor1230: e3 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 80,8 + Actor1231: e3 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 72,7 + Actor1232: e3 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 69,9 + Actor1233: e3 + Owner: Krukov + Facing: 384 + Location: 82,19 + SubCell: 3 + Actor1234: e3 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 44,24 + Actor1235: e3 + Owner: Krukov + SubCell: 3 + Location: 48,22 + Facing: 697 + Actor1236: e3 + Owner: Krukov + SubCell: 3 + Location: 46,28 + Facing: 515 + Actor1237: e3 + Owner: Krukov + SubCell: 3 + Location: 36,28 + Facing: 586 + Actor1238: e1 + Owner: Krukov + SubCell: 3 + Facing: 384 + Location: 40,30 + Actor1239: e1 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 45,29 + Actor1240: e1 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 34,28 + Actor1241: e1 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 115,23 + Actor1242: e1 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 118,26 + Actor1243: e1 + Owner: Krukov + Facing: 384 + Location: 118,26 + SubCell: 1 + Actor1244: e1 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 119,22 + Actor1245: e1 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 122,23 + Actor1246: e1 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 118,18 + Actor1247: e1 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 111,13 + Actor1249: btr.ai + Owner: Marinesko + Location: 42,68 + Facing: 777 + Actor1250: btr.ai + Owner: Marinesko + Location: 42,58 + Facing: 777 + Actor1251: t10 + Owner: Neutral + Location: 3,38 + Actor1252: t16 + Owner: Neutral + Location: 4,28 + Actor1253: t12 + Owner: Neutral + Location: 6,31 + Actor1254: tc04 + Owner: Neutral + Location: 2,5 + Actor1255: t06 + Owner: Neutral + Location: 3,2 + Actor1256: t05 + Owner: Neutral + Location: 7,2 + Actor1257: t03 + Owner: Neutral + Location: 10,1 + Actor1258: t03 + Owner: Neutral + Location: 11,10 + Actor1259: tc02 + Owner: Neutral + Location: 14,4 + Actor1260: t14 + Owner: Neutral + Location: 12,6 + Actor1261: t13 + Owner: Neutral + Location: 21,3 + Actor1262: t15 + Owner: Neutral + Location: 15,9 + Actor1263: t17 + Owner: Neutral + Location: 30,8 + Actor1264: tc05 + Owner: Neutral + Location: 22,11 + Actor1265: tc01 + Owner: Neutral + Location: 20,20 + Actor1266: t10 + Owner: Neutral + Location: 9,19 + Actor1267: t05 + Owner: Neutral + Location: 23,9 + Actor1268: t01 + Owner: Neutral + Location: 27,13 + Actor1269: t02 + Owner: Neutral + Location: 12,15 + Actor1270: t06 + Owner: Neutral + Location: 3,10 + Actor1271: t06 + Owner: Neutral + Location: 18,1 + Actor1272: t02 + Owner: Neutral + Location: 31,3 + Actor1273: t02 + Owner: Neutral + Location: 18,22 + Actor1274: t11 + Owner: Neutral + Location: 4,18 + Actor1275: tc03 + Owner: Neutral + Location: 20,5 + Actor1276: t02 + Owner: Neutral + Location: 22,29 + Actor1277: t13 + Owner: Neutral + Location: 59,25 + Actor1278: t05 + Owner: Neutral + Location: 40,8 + Actor1279: t01 + Owner: Neutral + Location: 49,13 + Actor1280: t02 + Owner: Neutral + Location: 113,4 + Actor1281: t10 + Owner: Neutral + Location: 108,7 + Actor1282: tc03 + Owner: Neutral + Location: 126,18 + Actor1283: t16 + Owner: Neutral + Location: 55,14 + Actor1284: ftur + Owner: Krukov + Location: 72,22 + Actor1285: ftur + Owner: Krukov + Location: 78,22 + Actor1286: ftur + Owner: Krukov + Location: 90,14 + Actor1288: ftur + Owner: Krukov + Location: 63,11 + Actor1289: ftur + Owner: Krukov + Location: 63,16 + Actor1287: ftur + Owner: Krukov + Location: 90,9 + Actor1290: fenc + Owner: Krukov + Location: 70,26 + Actor1291: fenc + Owner: Krukov + Location: 71,26 + Actor1292: fenc + Owner: Krukov + Location: 72,26 + Actor1293: fenc + Owner: Krukov + Location: 81,26 + Actor1294: fenc + Owner: Krukov + Location: 80,26 + Actor1295: fenc + Owner: Krukov + Location: 79,26 + Actor1296: fenc + Owner: Krukov + Location: 81,29 + Actor1297: fenc + Owner: Krukov + Location: 80,29 + Actor1298: fenc + Owner: Krukov + Location: 65,28 + Actor1299: fenc + Owner: Krukov + Location: 65,29 + Actor1300: fenc + Owner: Krukov + Location: 66,29 + Actor1301: fenc + Owner: Krukov + Location: 68,29 + Actor1302: fenc + Owner: Krukov + Location: 67,29 + Actor1303: fenc + Owner: Krukov + Location: 69,29 + Actor1304: fenc + Owner: Krukov + Location: 69,30 + Actor1305: fenc + Owner: Krukov + Location: 71,30 + Actor1306: fenc + Owner: Krukov + Location: 70,30 + Actor1307: fenc + Owner: Krukov + Location: 64,34 + Actor1308: fenc + Owner: Krukov + Location: 62,34 + Actor1309: fenc + Owner: Krukov + Location: 63,34 + Actor1310: fenc + Owner: Krukov + Location: 61,34 + Actor1311: fenc + Owner: Krukov + Location: 61,33 + Actor1312: fenc + Owner: Krukov + Location: 61,32 + Actor1313: fenc + Owner: Krukov + Location: 91,30 + Actor1314: fenc + Owner: Krukov + Location: 91,31 + Actor1315: fenc + Owner: Krukov + Location: 89,31 + Actor1316: fenc + Owner: Krukov + Location: 90,31 + Actor1317: fenc + Owner: Krukov + Location: 91,29 + Actor1318: fenc + Owner: Krukov + Location: 91,28 + Actor1319: fenc + Owner: Krukov + Location: 92,28 + Actor1320: ttrp + Owner: Marinesko + Facing: 384 + SubCell: 3 + Location: 38,68 + Actor1321: ttrp + Owner: Marinesko + Facing: 384 + SubCell: 3 + Location: 38,59 + PlayerStart: waypoint + Owner: Neutral + Location: 67,114 + RomanovRally1: waypoint + Owner: Neutral + Location: 91,87 + RomanovRally2: waypoint + Owner: Neutral + Location: 105,109 + RomanovRally3: waypoint + Owner: Neutral + Location: 93,54 + RomanovRally4: waypoint + Owner: Neutral + Location: 103,42 + MarineskoRally3: waypoint + Owner: Neutral + Location: 45,92 + MarineskoRally1: waypoint + Owner: Neutral + Location: 59,72 + MarineskoRally2: waypoint + Owner: Neutral + Location: 18,103 + KrukovRally1: waypoint + Owner: Neutral + Location: 72,78 + MarineskoRally4: waypoint + Owner: Neutral + Location: 47,48 + KrukovRally3: waypoint + Owner: Neutral + Location: 90,35 + KrukovRally2: waypoint + Owner: Neutral + Location: 51,32 + Middle: waypoint + Owner: Neutral + Location: 73,60 + KrukovBase: waypoint + Owner: Neutral + Location: 76,5 + RomanovBase: waypoint + Owner: Neutral + Location: 124,61 + MarineskoBase: waypoint + Owner: Neutral + Location: 19,64 + Actor1322: camera + Owner: Romanov + Location: 72,108 + Actor1323: camera + Owner: Romanov + Location: 36,63 + Actor1324: camera + Owner: Romanov + Location: 78,13 + Actor1325: camera + Owner: Romanov + Location: 89,90 + Actor1326: camera + Owner: Romanov + Location: 49,91 + Actor1327: camera + Owner: Marinesko + Location: 62,109 + Actor1328: camera + Owner: Marinesko + Location: 112,62 + Actor1329: camera + Owner: Marinesko + Location: 77,15 + Actor1330: camera + Owner: Marinesko + Location: 86,90 + Actor1331: camera + Owner: Krukov + Location: 92,90 + Actor1332: camera + Owner: Krukov + Location: 70,113 + Actor1333: camera + Owner: Krukov + Location: 68,90 + Actor1334: camera + Owner: Krukov + Location: 36,65 + Actor1335: camera + Owner: Krukov + Location: 111,60 + Actor1336: camera + Owner: Krukov + Location: 22,56 + Actor1337: camera + Owner: Krukov + Location: 119,51 + Actor1338: katy + Owner: Krukov + Facing: 384 + Location: 62,33 + Actor1339: katy + Owner: Krukov + Location: 90,29 + Facing: 602 + Actor1340: grad + Owner: Krukov + Facing: 384 + Location: 66,28 + Actor1341: grad + Owner: Krukov + Facing: 384 + Location: 70,29 + Actor1342: 3tnk.rhino + Owner: Romanov + Location: 103,40 + Facing: 150 + Actor1343: 3tnk.rhino + Owner: Romanov + Facing: 150 + Location: 105,39 + Actor1344: 3tnk.rhino + Owner: Romanov + Facing: 150 + Location: 108,39 + Actor1345: 3tnk.rhino + Owner: Romanov + Facing: 150 + Location: 103,44 + Actor1346: e3 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 89,30 + Actor1347: e1 + Owner: Krukov + SubCell: 3 + Facing: 483 + Location: 90,30 + Actor1348: e3 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 67,28 + Actor1349: e1 + Owner: Krukov + SubCell: 3 + Facing: 483 + Location: 68,28 + Actor1350: e3 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 63,33 + Actor1351: e1 + Owner: Krukov + SubCell: 3 + Facing: 483 + Location: 64,33 + Actor1352: e3 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 80,28 + Actor1353: e1 + Owner: Krukov + SubCell: 3 + Facing: 578 + Location: 81,28 + Actor1354: e1 + Owner: Krukov + Facing: 384 + SubCell: 1 + Location: 81,28 + Actor1355: e1 + Owner: Krukov + SubCell: 3 + Facing: 578 + Location: 92,27 + Actor1356: e1 + Owner: Krukov + Facing: 384 + SubCell: 1 + Location: 92,27 + Actor1357: e1 + Owner: Krukov + SubCell: 3 + Facing: 578 + Location: 101,23 + Actor1358: e1 + Owner: Krukov + Facing: 384 + SubCell: 1 + Location: 101,23 + Actor1359: e1 + Owner: Krukov + SubCell: 3 + Facing: 578 + Location: 88,23 + Actor1360: e1 + Owner: Krukov + Facing: 384 + SubCell: 1 + Location: 88,23 + Actor1361: e1 + Owner: Marinesko + SubCell: 3 + Location: 27,50 + Facing: 697 + Actor1362: e1 + Owner: Marinesko + SubCell: 1 + Location: 27,50 + Facing: 927 + Actor1363: e1 + Owner: Marinesko + SubCell: 3 + Location: 26,51 + Facing: 896 + Actor1364: e1 + Owner: Marinesko + SubCell: 3 + Location: 28,52 + Facing: 919 + Actor1365: ttrp + Owner: Marinesko + SubCell: 1 + Location: 28,52 + Facing: 904 + Actor1366: e1 + Owner: Marinesko + SubCell: 3 + Facing: 697 + Location: 13,47 + Actor1367: e1 + Owner: Marinesko + SubCell: 1 + Facing: 927 + Location: 13,47 + Actor1368: e1 + Owner: Marinesko + SubCell: 3 + Facing: 896 + Location: 12,48 + Actor1369: e1 + Owner: Marinesko + SubCell: 3 + Facing: 919 + Location: 14,49 + Actor1370: ttrp + Owner: Marinesko + SubCell: 1 + Facing: 904 + Location: 14,49 + Actor1371: n3 + Owner: Marinesko + Facing: 384 + Location: 27,51 + SubCell: 3 + Actor1372: n3 + Owner: Marinesko + Facing: 384 + Location: 14,47 + SubCell: 3 + Actor1373: shok + Owner: Marinesko + SubCell: 3 + Location: 46,59 + Facing: 848 + Actor1374: shok + Owner: Marinesko + SubCell: 3 + Location: 34,54 + Facing: 808 + Actor1375: e1 + Owner: Marinesko + SubCell: 3 + Location: 44,68 + Facing: 594 + Actor1379: e1 + Owner: Marinesko + SubCell: 3 + Location: 46,71 + Facing: 674 + Actor1380: e1 + Owner: Marinesko + SubCell: 3 + Location: 41,73 + Facing: 610 + Actor1381: e1 + Owner: Marinesko + SubCell: 3 + Location: 46,68 + Facing: 816 + Actor1376: e1 + Owner: Marinesko + SubCell: 3 + Facing: 610 + Location: 44,66 + Actor1377: e1 + Owner: Marinesko + SubCell: 3 + Facing: 610 + Location: 44,60 + Actor1378: e1 + Owner: Marinesko + SubCell: 3 + Facing: 610 + Location: 51,63 + Actor1382: e1 + Owner: Marinesko + SubCell: 3 + Facing: 594 + Location: 43,69 + Actor1383: n4 + Owner: Marinesko + Facing: 384 + SubCell: 3 + Location: 43,61 + Actor1384: 3tnk.rhino + Owner: Romanov + Location: 103,83 + Facing: 396 + Actor1385: 3tnk.rhino + Owner: Romanov + Facing: 396 + Location: 100,81 + Actor1386: 3tnk.rhino + Owner: Romanov + Location: 108,86 + Facing: 396 + Actor1388: e1 + Owner: Romanov + SubCell: 3 + Facing: 618 + Location: 106,85 + Actor1389: e3 + Owner: Romanov + SubCell: 1 + Location: 106,85 + Facing: 384 + Actor1390: e1 + Owner: Romanov + SubCell: 3 + Location: 101,82 + Facing: 214 + Actor1391: e1 + Owner: Romanov + SubCell: 3 + Location: 102,82 + Facing: 436 + Actor1392: e3 + Owner: Romanov + Facing: 384 + SubCell: 1 + Location: 102,82 + Actor1387: tsla + Owner: Krukov + Location: 88,20 + Actor1393: btr.ai + Owner: Marinesko + Location: 28,50 + Facing: 911 + Actor1394: 3tnk.rhino + Owner: Romanov + Facing: 256 + Location: 105,54 + Actor1395: e1 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 71,4 + Actor1396: e1 + Owner: Krukov + Facing: 384 + SubCell: 1 + Location: 71,4 + Actor1397: e1 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 81,4 + Actor1398: e1 + Owner: Krukov + Facing: 384 + SubCell: 1 + Location: 81,4 + Actor1399: e3 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 77,3 + Actor1400: e3 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 85,6 + Actor1401: e3 + Owner: Krukov + SubCell: 3 + Location: 90,19 + Facing: 674 + Actor1402: e3 + Owner: Krukov + Facing: 384 + SubCell: 3 + Location: 85,22 + Actor1403: e3 + Owner: Krukov + SubCell: 3 + Location: 91,21 + Facing: 666 + Actor1405: 4tnk + Owner: Romanov + Location: 105,73 + Facing: 396 + Actor1404: 4tnk + Owner: Romanov + Facing: 396 + Location: 103,71 + Actor1406: e1 + Owner: Marinesko + SubCell: 3 + Facing: 697 + Location: 37,54 + Actor1407: e1 + Owner: Marinesko + SubCell: 1 + Facing: 927 + Location: 37,54 + Actor1408: e1 + Owner: Marinesko + SubCell: 3 + Facing: 697 + Location: 40,55 + Actor1409: e1 + Owner: Marinesko + SubCell: 1 + Facing: 927 + Location: 40,55 + Actor1410: e1 + Owner: Marinesko + SubCell: 3 + Facing: 697 + Location: 31,55 + Actor1411: e1 + Owner: Marinesko + SubCell: 1 + Facing: 927 + Location: 31,55 + Actor1412: e1 + Owner: Marinesko + SubCell: 3 + Facing: 697 + Location: 44,54 + Actor1413: e1 + Owner: Marinesko + SubCell: 1 + Facing: 927 + Location: 44,54 + Actor1414: e1 + Owner: Marinesko + SubCell: 3 + Facing: 697 + Location: 20,48 + Actor1415: e1 + Owner: Marinesko + SubCell: 1 + Facing: 927 + Location: 20,48 + Actor1416: miss + Owner: Neutral + Location: 93,95 + Actor1418: barb + Owner: Neutral + Location: 93,94 + Actor1419: barb + Owner: Neutral + Location: 94,94 + Actor1420: barb + Owner: Neutral + Location: 95,94 + Actor1421: barb + Owner: Neutral + Location: 96,94 + Actor1422: barb + Owner: Neutral + Location: 96,95 + Actor1423: barb + Owner: Neutral + Location: 96,96 + Actor1424: barb + Owner: Neutral + Location: 96,97 + Actor1425: barb + Owner: Neutral + Location: 92,94 + Actor1426: barb + Owner: Neutral + Location: 92,95 + Actor1427: barb + Owner: Neutral + Location: 92,96 + Actor1428: barb + Owner: Neutral + Location: 92,97 + Actor1429: t16 + Owner: Neutral + Location: 60,78 + Actor1430: t17 + Owner: Neutral + Location: 61,78 + Actor1417: miss + Owner: Neutral + Location: 55,76 + Actor1431: barb + Owner: Neutral + Location: 54,78 + Actor1432: barb + Owner: Neutral + Location: 54,77 + Actor1433: barb + Owner: Neutral + Location: 54,76 + Actor1434: barb + Owner: Neutral + Location: 54,75 + Actor1435: barb + Owner: Neutral + Location: 55,75 + Actor1436: barb + Owner: Neutral + Location: 56,75 + Actor1437: barb + Owner: Neutral + Location: 57,75 + Actor1438: barb + Owner: Neutral + Location: 58,75 + Actor1439: barb + Owner: Neutral + Location: 58,76 + Actor1440: barb + Owner: Neutral + Location: 58,77 + Actor1441: barb + Owner: Neutral + Location: 58,78 + Actor1442: e1 + Owner: Romanov + SubCell: 3 + Facing: 364 + Location: 117,79 + Actor1443: 3tnk.rhino + Owner: Romanov + Location: 115,80 + Facing: 396 + Actor1445: e1 + Owner: Romanov + SubCell: 3 + Facing: 459 + Location: 116,81 + Actor1446: apoc + Owner: Romanov + Location: 117,81 + Facing: 396 + Actor1447: e1 + Owner: Romanov + SubCell: 3 + Facing: 364 + Location: 119,82 + Actor1448: brik + Owner: Romanov + Location: 128,74 + Actor1449: brik + Owner: Romanov + Location: 128,73 + Actor1450: brik + Owner: Romanov + Location: 128,75 + Actor1451: brik + Owner: Romanov + Location: 128,80 + Actor1452: brik + Owner: Romanov + Location: 128,79 + Actor1453: brik + Owner: Romanov + Location: 128,77 + Actor1454: brik + Owner: Romanov + Location: 128,76 + Actor1455: brik + Owner: Romanov + Location: 128,78 + Actor1456: brik + Owner: Romanov + Location: 127,80 + Actor1457: brik + Owner: Romanov + Location: 126,80 + Actor1458: brik + Owner: Romanov + Location: 125,80 + Actor1459: brik + Owner: Romanov + Location: 124,80 + Actor1460: brik + Owner: Romanov + Location: 122,80 + Actor1461: brik + Owner: Romanov + Location: 123,80 + Actor1462: brik + Owner: Romanov + Location: 121,80 + Actor1463: brik + Owner: Romanov + Location: 120,80 + Actor1464: brik + Owner: Romanov + Location: 119,80 + Actor1467: brik + Owner: Romanov + Location: 118,78 + Actor1468: brik + Owner: Romanov + Location: 118,77 + Actor1469: brik + Owner: Romanov + Location: 117,77 + Actor1470: brik + Owner: Romanov + Location: 116,77 + Actor1471: brik + Owner: Romanov + Location: 116,76 + Actor1472: brik + Owner: Romanov + Location: 117,76 + Actor1473: ftur + Owner: Romanov + Location: 115,77 + Actor1474: 4tnk + Owner: Romanov + Location: 111,77 + Facing: 396 + Actor1475: tsla + Owner: Romanov + Location: 118,76 + Actor1477: apwr + Owner: Romanov + Location: 125,77 + Actor1476: apwr + Owner: Romanov + Location: 125,74 + Actor1478: apwr + Owner: Romanov + Location: 125,71 + Actor1479: apwr + Owner: Romanov + Location: 121,71 + Actor1480: apwr + Owner: Romanov + Location: 121,74 + Actor1481: apwr + Owner: Romanov + Location: 121,77 + Actor1482: sam + Owner: Romanov + Location: 119,79 + Actor1465: sam + Owner: Romanov + Location: 126,69 + Actor1466: brik + Owner: Romanov + Location: 118,79 + Actor1444: brik + Owner: Romanov + Location: 118,80 + Actor1483: 3tnk.rhino + Owner: Romanov + Facing: 396 + Location: 113,72 + Actor1484: 3tnk.rhino + Owner: Romanov + Facing: 396 + Location: 116,74 + Actor1485: sam + Owner: Romanov + Location: 121,69 + Actor1486: btr.ai + Owner: Marinesko + Facing: 499 + Location: 22,70 + Actor1487: btr.ai + Owner: Marinesko + Facing: 777 + Location: 38,63 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/disable-doctrines.yaml, statecraft-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/main-campaign/ca37-statecraft/statecraft-rules.yaml b/mods/ca/missions/main-campaign/ca37-statecraft/statecraft-rules.yaml new file mode 100644 index 0000000000..909c1ff4ca --- /dev/null +++ b/mods/ca/missions/main-campaign/ca37-statecraft/statecraft-rules.yaml @@ -0,0 +1,84 @@ + +^Palettes: + TintPostProcessEffect: + Red: 0.95 + Green: 0.95 + Blue: 1 + Ambient: 0.9 + WeatherOverlay: + ParticleDensityFactor: 4 + Gravity: 16, 24 + WindTick: 150, 425 + ScatterDirection: -12, 12 + ParticleSize: 2, 3 + ParticleColors: ECECEC44, E4E4E444, D0D0D044, BCBCBC44 + LineTailAlphaValue: 0 + +World: + LuaScript: + Scripts: campaign.lua, statecraft.lua + MissionData: + Briefing: Stalin is gone and the union is in disarray. A number of ambitious generals and high ranking officials are vying for power. We must act quickly to secure our position and restore order. Together we can bring the Soviet Empire back from the brink of total collapse.\n\nTake what few troops we can spare and establish a base, then beat the three most prominent factions into submission.\n\nThe factions are led by General Marinesko, General Krukov and Deputy Chairman Romanov, each of whom favor a particular combat doctrine. Use your best judgement to decide who to deal with first, and be careful not to tip the balance of power too quickly or they may all unite against you. + MapOptions: + ShortGameCheckboxEnabled: False + MusicPlaylist: + StartingMusic: twin + +Player: + PlayerResources: + DefaultCash: 6000 + -GrantExternalConditionPowerCA@HEROESOFUNION: + -ParatroopersPowerCA@TankDrop: + -AirstrikePowerCA@KillZone: + +INDP: + Inherits@TankDrop: ^TankDropPower + ParatroopersPowerCA@TankDrop: + Prerequisites: ~captured.indp + CaptureManager: + Capturable: + RequiresCondition: !build-incomplete && !being-warped + Types: building + CapturableProgressBar: + CapturableProgressBlink: + TooltipExtras: + Attributes: • Maximum 1 can be built + +MUNP: + Inherits@KillZone: ^KillZonePower + AirstrikePowerCA@KillZone: + -Prerequisites: + CaptureManager: + Capturable: + RequiresCondition: !build-incomplete && !being-warped + Types: building + CapturableProgressBar: + CapturableProgressBlink: + TooltipExtras: + Attributes: • Maximum 1 can be built + +CVAT: + Inherits@HeroesOfTheUnion: ^HeroesOfTheUnionPower + GrantExternalConditionPowerCA@HEROESOFUNION: + -Prerequisites: + CaptureManager: + Capturable: + RequiresCondition: !build-incomplete && !being-warped + Types: building + CapturableProgressBar: + CapturableProgressBlink: + TooltipExtras: + Attributes: • Maximum 1 can be built + +captured.indp: + Inherits@DUMMY: ^InvisibleDummy + ProvidesPrerequisite: + +MISS: + Tooltip: + Name: Outpost + TooltipDescription: + Description: Provides vision of the surrounding area. + ValidRelationships: Ally, Enemy, Neutral + Health: + HP: 100000 diff --git a/mods/ca/missions/main-campaign/ca37-statecraft/statecraft.lua b/mods/ca/missions/main-campaign/ca37-statecraft/statecraft.lua new file mode 100644 index 0000000000..b6324743a8 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca37-statecraft/statecraft.lua @@ -0,0 +1,451 @@ +MissionDir = "ca|missions/main-campaign/ca37-statecraft" + +MarineskoHardAndAboveCompositions = { + -- 0 to 10 minutes + { Infantry = { "e3", "e1", "e1", "e1", "e1", "e1", "e2", "e3", "e4", "e1", "e1", "e1", "e3", "e1", "e1", "e1", "e1" }, Vehicles = { "btr.ai", "btr.ai" }, MaxTime = DateTime.Minutes(10), }, + + -- 10 to 16 minutes + { Infantry = { "e3", "e1", "e1", "e1", "e1", "e1", "e2", "e3", "e4", "e1", "e1", "e1", "e3", "e1", "e1", "e1", "e1", "cmsr", "shok", "shok", "e1", "e1", "e1" }, Vehicles = { "3tnk", "btr.ai", "btr.ai", "btr.ai" }, MinTime = DateTime.Minutes(10), MaxTime = DateTime.Minutes(16), }, + + -- 16 minutes onwards + { Infantry = { "e3", "e1", "e1", "e1", "e1", "e1", "e2", "e3", "e4", "e1", "e1", "e1", "e3", "e1", "e1", "e1", "e1", "cmsr", "shok", "shok", "ttrp", "ttrp", "e1", "e1", "e1", "e1", "e1" }, Vehicles = { SovietMammothVariant, "btr.ai", "btr.ai", "btr.ai", "btr.ai" }, MinTime = DateTime.Minutes(16), }, +} + +MarineskoCompositions = { + easy = { + -- 0 to 14 minutes + { Infantry = { "e3", "e1", "e1", "e1", "e2", "e4", "e1", "e1", }, Vehicles = { "btr" }, MaxTime = DateTime.Minutes(14), }, + + -- 14 minutes onwards + { Infantry = { "e3", "e1", "e1", "shok", "shok", "e1", "e2", "e3", "e4" }, Vehicles = { "3tnk", "btr.ai", "btr.ai" }, MinTime = DateTime.Minutes(14), } + }, + normal = { + -- 0 to 12 minutes + { Infantry = { "e3", "e1", "e1", "e1", "e1", "e1", "e2", "e3", "e4", "e1", "e1", "e1" }, Vehicles = { "btr.ai", "btr" }, MaxTime = DateTime.Minutes(12), }, + + -- 12 to 16 minutes + { Infantry = { "e3", "e1", "e1", "e1", "e1", "e1", "e2", "e3", "e4", "e1", "e1", "e1", "e3", "cmsr", "shok", "shok", "e1", "e1" }, Vehicles = { "btr.ai", "btr.ai" }, MinTime = DateTime.Minutes(12), MaxTime = DateTime.Minutes(16), }, + + -- 16 minutes onwards + { Infantry = { "e3", "e1", "e1", "e1", "e1", "e1", "e2", "e3", "e4", "e1", "e1", "e1", "e3", "e1", "e1", "e1", "e1", "cmsr", "shok", "ttrp", "e1", "e1", "e1" }, Vehicles = { "3tnk", "btr.ai", "btr.ai", "btr.ai" }, MinTime = DateTime.Minutes(16), }, + }, + hard = MarineskoHardAndAboveCompositions, + vhard = MarineskoHardAndAboveCompositions, + brutal = MarineskoHardAndAboveCompositions +} + +RomanovHardAndAboveCompositions = { + -- 0 to 10 minutes + { Infantry = { }, Vehicles = { "3tnk.rhino", "btr.ai", "3tnk.rhino", "btr.ai" }, MaxTime = DateTime.Minutes(10), }, + + -- 10 to 16 minutes + { Infantry = { }, Vehicles = { SovietMammothVariant, "btr.ai", SovietMammothVariant, "3tnk.rhino", "btr.ai", "3tnk.rhino" }, MinTime = DateTime.Minutes(10), MaxTime = DateTime.Minutes(16) }, + + -- 16 minutes onwards + { Infantry = { }, Vehicles = { "apoc", SovietMammothVariant, SovietMammothVariant, SovietMammothVariant, "3tnk.rhino", "btr.ai", "btr.ai" }, MinTime = DateTime.Minutes(16) }, +} + +RomanovCompositions = { + easy = { + -- 0 to 14 minutes + { Infantry = { }, Vehicles = { "3tnk.rhino", "3tnk.rhino" }, MaxTime = DateTime.Minutes(14), }, + + -- 14 minutes onwards + { Infantry = { }, Vehicles = { SovietMammothVariant, "3tnk.rhino", "3tnk.rhino" }, MinTime = DateTime.Minutes(14), } + }, + normal = { + -- 0 to 12 minutes + { Infantry = { }, Vehicles = { "3tnk.rhino", "3tnk.rhino" }, MaxTime = DateTime.Minutes(12), }, + + -- 12 to 16 minutes + { Infantry = { }, Vehicles = { SovietMammothVariant, "3tnk.rhino", "3tnk.rhino" }, MinTime = DateTime.Minutes(12), MaxTime = DateTime.Minutes(16) }, + + -- 15 minutes onwards + { Infantry = { }, Vehicles = { SovietMammothVariant, SovietMammothVariant, "3tnk.rhino", "3tnk.rhino" }, MinTime = DateTime.Minutes(16) }, + }, + hard = RomanovHardAndAboveCompositions, + vhard = RomanovHardAndAboveCompositions, + brutal = RomanovHardAndAboveCompositions +} + +KrukovHardAndAboveCompositions = { + -- 0 to 10 minutes + { Infantry = { "e3", "e1", "e1", "e1", "e1", "e2", "e4" }, Vehicles = { "grad", "grad" }, MaxTime = DateTime.Minutes(10), }, + + -- 10 to 16 minutes + { Infantry = { "e3", "e1", "e1", "shok", "shok", "e1", "e2", "e3", "e4", "e1", "e1" }, Vehicles = { SovietMammothVariant, "grad", "grad", SovietAdvancedArty }, MinTime = DateTime.Minutes(10), MaxTime = DateTime.Minutes(16), }, + + -- 16 minutes onwards + { Infantry = { "e3", "e1", "e1", "shok", "shok", "e1", "e2", "e3", "e4", "e1", "e1" }, Vehicles = { SovietMammothVariant, "grad", "grad", SovietAdvancedArty, SovietAdvancedArty, SovietAdvancedArty }, MinTime = DateTime.Minutes(16), }, +} + +KrukovCompositions = { + easy = { + -- 0 to 14 minutes + { Infantry = { "e3", "e1", "e1", "e1", "e2", "e4" }, Vehicles = { "katy", "katy" }, MaxTime = DateTime.Minutes(14), }, + + -- 14 minutes onwards + { Infantry = { "e3", "e1", "e1", "shok", "shok", "e1", "e2", "e3", "e4" }, Vehicles = { "grad", "grad", "v2rl" }, MinTime = DateTime.Minutes(14), } + }, + normal = { + -- 0 to 12 minutes + { Infantry = { "e3", "e1", "e1", "e1", "e1", "e2", "e4" }, Vehicles = { "katy", "katy" }, MaxTime = DateTime.Minutes(12), }, + + -- 12 to 16 minutes + { Infantry = { "e3", "e1", "e1", "shok", "shok", "e1", "e2", "e3", "e4" }, Vehicles = { "grad", "grad", "v2rl" }, MinTime = DateTime.Minutes(12), MaxTime = DateTime.Minutes(16), }, + + -- 15 minutes onwards + { Infantry = { "e3", "e1", "e1", "shok", "shok", "e1", "e2", "e3", "e4", "e1", "e1" }, Vehicles = { "grad", "grad", "v2rl", SovietAdvancedArty }, MinTime = DateTime.Minutes(16), }, + }, + hard = KrukovHardAndAboveCompositions, + vhard = KrukovHardAndAboveCompositions, + brutal = KrukovHardAndAboveCompositions +} + +MainAttackValues = { + easy = { Min = 5, Max = 15 }, + normal = { Min = 15, Max = 33 }, + hard = { Min = 25, Max = 55 }, + vhard = { Min = 25, Max = 55 }, + brutal = { Min = 25, Max = 55 } +} + +SecondaryAttackValues = { + easy = { Min = 2, Max = 7 }, + normal = { Min = 8, Max = 16 }, + hard = { Min = 12, Max = 28 }, + vhard = { Min = 12, Max = 28 }, + brutal = { Min = 12, Max = 28 } +} + +Squads = { + MarineskoMain = { + Delay = AdjustDelayForDifficulty(DateTime.Minutes(5)), + AttackValuePerSecond = MainAttackValues, + FollowLeader = true, + Compositions = MarineskoCompositions, + AttackPaths = { + { MarineskoRally1.Location }, + { MarineskoRally2.Location }, + }, + }, + MarineskoVsRomanov = { + Delay = AdjustDelayForDifficulty(DateTime.Minutes(6)), + AttackValuePerSecond = SecondaryAttackValues, + FollowLeader = true, + Compositions = MarineskoCompositions, + AttackPaths = { + { Middle.Location, RomanovBase.Location }, + }, + }, + MarineskoVsKrukov = { + Delay = AdjustDelayForDifficulty(DateTime.Minutes(6)), + AttackValuePerSecond = SecondaryAttackValues, + FollowLeader = true, + Compositions = MarineskoCompositions, + AttackPaths = { + { MarineskoRally4.Location, KrukovBase.Location }, + }, + }, + RomanovMain = { + Delay = AdjustDelayForDifficulty(DateTime.Minutes(5)), + AttackValuePerSecond = MainAttackValues, + FollowLeader = true, + Compositions = RomanovCompositions, + AttackPaths = { + { RomanovRally1.Location }, + { RomanovRally2.Location }, + }, + }, + RomanovVsMarinesko = { + Delay = AdjustDelayForDifficulty(DateTime.Minutes(6)), + AttackValuePerSecond = SecondaryAttackValues, + FollowLeader = true, + Compositions = RomanovCompositions, + AttackPaths = { + { Middle.Location, MarineskoBase.Location }, + }, + }, + RomanovVsKrukov = { + Delay = AdjustDelayForDifficulty(DateTime.Minutes(6)), + AttackValuePerSecond = SecondaryAttackValues, + FollowLeader = true, + Compositions = RomanovCompositions, + AttackPaths = { + { RomanovRally4.Location, KrukovBase.Location }, + }, + }, + KrukovMain = { + Delay = AdjustDelayForDifficulty(DateTime.Minutes(6)), + AttackValuePerSecond = MainAttackValues, + FollowLeader = true, + Compositions = KrukovCompositions, + AttackPaths = { + { KrukovRally1.Location }, + }, + }, + KrukovVsMarinesko = { + Delay = AdjustDelayForDifficulty(DateTime.Minutes(6)), + AttackValuePerSecond = SecondaryAttackValues, + FollowLeader = true, + Compositions = KrukovCompositions, + AttackPaths = { + { KrukovRally2.Location, MarineskoBase.Location }, + }, + }, + KrukovVsRomanov = { + Delay = AdjustDelayForDifficulty(DateTime.Minutes(6)), + AttackValuePerSecond = SecondaryAttackValues, + FollowLeader = true, + Compositions = KrukovCompositions, + AttackPaths = { + { KrukovRally3.Location, RomanovBase.Location }, + }, + }, + KrukovAir = { + Delay = AdjustAirDelayForDifficulty(DateTime.Minutes(13)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 12, Max = 12 }), + Compositions = AirCompositions.Soviet, + }, + KrukovAntiTankAir = AntiHeavyAirSquad({ "suk" }, AdjustAirDelayForDifficulty(DateTime.Minutes(10))), + KrukovAirToAir = AntiHeavyAirSquad({ "mig", "yak" }, AdjustAirDelayForDifficulty(DateTime.Minutes(10))), +} + +SetupPlayers = function() + USSR = Player.GetPlayer("USSR") + Marinesko = Player.GetPlayer("Marinesko") + Romanov = Player.GetPlayer("Romanov") + Krukov = Player.GetPlayer("Krukov") + MarineskoUnited = Player.GetPlayer("MarineskoUnited") + RomanovUnited = Player.GetPlayer("RomanovUnited") + KrukovUnited = Player.GetPlayer("KrukovUnited") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = { USSR } + MissionEnemies = { Marinesko, Romanov, Krukov, MarineskoUnited, RomanovUnited, KrukovUnited } +end + +WorldLoaded = function() + SetupPlayers() + + TimerTicks = 0 + Camera.Position = PlayerStart.CenterPosition + + InitObjectives(USSR) + AdjustPlayerStartingCashForDifficulty() + InitGenerals() + + ObjectiveEliminateMarinesko = USSR.AddObjective("Defeat General Marinesko's forces.") + ObjectiveEliminateRomanov = USSR.AddObjective("Defeat Deputy Chairman Romanov's forces.") + ObjectiveEliminateKrukov = USSR.AddObjective("Defeat General Krukov's forces.") + + Trigger.OnCapture(RomanovIndustrialPlant, function(self, captor, oldOwner, newOwner) + Actor.Create("captured.indp", true, { Owner = USSR }) + end) + + Trigger.AfterDelay(DateTime.Seconds(3), function() + Media.DisplayMessage("Romanov. Marinesko. Krukov. Comrade General, you must crush these pretenders. The Union must prevail!", "Premier Cherdenko", HSLColor.FromHex("FF0000")) + MediaCA.PlaySound(MissionDir .. "/cdko_crushtraitors.aud", 2) + end) + + AfterWorldLoaded() +end + +Tick = function() + OncePerSecondChecks() + OncePerFiveSecondChecks() + OncePerThirtySecondChecks() + AfterTick() +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + Marinesko.Resources = Marinesko.ResourceCapacity - 500 + Romanov.Resources = Romanov.ResourceCapacity - 500 + Krukov.Resources = Krukov.ResourceCapacity - 500 + MarineskoUnited.Resources = MarineskoUnited.ResourceCapacity - 500 + RomanovUnited.Resources = RomanovUnited.ResourceCapacity - 500 + KrukovUnited.Resources = KrukovUnited.ResourceCapacity - 500 + + if MissionPlayersHaveNoRequiredUnits() then + if not USSR.IsObjectiveCompleted(ObjectiveEliminateMarinesko) then + USSR.MarkFailedObjective(ObjectiveEliminateMarinesko) + end + if not USSR.IsObjectiveCompleted(ObjectiveEliminateRomanov) then + USSR.MarkFailedObjective(ObjectiveEliminateRomanov) + end + if not USSR.IsObjectiveCompleted(ObjectiveEliminateKrukov) then + USSR.MarkFailedObjective(ObjectiveEliminateKrukov) + end + end + end +end + +OncePerFiveSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 125 == 0 then + UpdatePlayerBaseLocations() + + if not USSR.IsObjectiveCompleted(ObjectiveEliminateMarinesko) and not PlayerHasBuildings(Marinesko) and not PlayerHasBuildings(MarineskoUnited) then + USSR.MarkCompletedObjective(ObjectiveEliminateMarinesko) + end + + if not USSR.IsObjectiveCompleted(ObjectiveEliminateRomanov) and not PlayerHasBuildings(Romanov) and not PlayerHasBuildings(RomanovUnited) then + USSR.MarkCompletedObjective(ObjectiveEliminateRomanov) + end + + if not USSR.IsObjectiveCompleted(ObjectiveEliminateKrukov) and not PlayerHasBuildings(Krukov) and not PlayerHasBuildings(KrukovUnited) then + USSR.MarkCompletedObjective(ObjectiveEliminateKrukov) + end + end +end + +OncePerThirtySecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % DateTime.Seconds(30) == 0 then + CalculatePlayerCharacteristics() + Unification() + end +end + +InitGenerals = function() + Generals = { Marinesko, Romanov, Krukov } + + Utils.Do(Generals, function(g) + AutoRepairAndRebuildBuildings(g) + SetupRefAndSilosCaptureCredits(g) + AutoReplaceHarvesters(g) + AutoRebuildConyards(g) + InitAiUpgrades(g) + + local groundAttackers = g.GetGroundAttackers() + + Utils.Do(groundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsUSSRGroundHunterUnit) + end) + end) + + InitAttackSquad(Squads.MarineskoMain, Marinesko) + InitAttackSquad(Squads.MarineskoVsRomanov, Marinesko, Romanov) + InitAttackSquad(Squads.MarineskoVsKrukov, Marinesko, Krukov) + + InitAttackSquad(Squads.RomanovMain, Romanov) + InitAttackSquad(Squads.RomanovVsMarinesko, Romanov, Marinesko) + InitAttackSquad(Squads.RomanovVsKrukov, Romanov, Krukov) + + InitAttackSquad(Squads.KrukovMain, Krukov) + InitAttackSquad(Squads.KrukovVsMarinesko, Krukov, Marinesko) + InitAttackSquad(Squads.KrukovVsRomanov, Krukov, Romanov) + InitAirAttackSquad(Squads.KrukovAir, Krukov) + + if IsHardOrAbove() then + Trigger.AfterDelay(DateTime.Minutes(15), function() + Actor.Create("imppara.upgrade", true, { Owner = Marinesko }) + Actor.Create("rocketpods.upgrade", true, { Owner = Krukov }) + Actor.Create("reactive.upgrade", true, { Owner = Romanov }) + end) + + InitAirAttackSquad(Squads.KrukovAirToAir, Krukov, MissionPlayers, { "Aircraft" }, "ArmorType") + InitAirAttackSquad(Squads.KrukovAntiTankAir, Krukov, MissionPlayers, { "4tnk", "4tnk.atomic", "apoc", "apoc.atomic" }) + end +end + +Unification = function() + if UnificationComplete then + return + end + + for _, g in pairs(Generals) do + local units = Utils.Where(g.GetActors(), function(a) + return a.HasProperty("Attack") + end) + + local unitValue = 0 + for _, u in pairs(units) do + if UnitCosts[u.Type] == nil then + UnitCosts[u.Type] = ActorCA.CostOrDefault(u.Type) + end + unitValue = unitValue + UnitCosts[u.Type] + end + + if unitValue < 20000 then + SubduedGeneral = g + break + end + end + + if not SubduedGeneral then + return + end + + UnificationComplete = true + + local unifiedGeneralMap = { + { From = Marinesko, To = MarineskoUnited }, + { From = Romanov, To = RomanovUnited }, + { From = Krukov, To = KrukovUnited } + } + + -- unify + for _, m in pairs(unifiedGeneralMap) do + for _, a in pairs(m.From.GetActors()) do + if a.Type ~= "player" then + a.Owner = m.To + end + end + + BuildingQueues[m.To.InternalName]= { } + + if BuildingQueues[m.From.InternalName] ~= nil then + for _, queueItem in pairs (BuildingQueues[m.From.InternalName]) do + local copiedQueueItem = { + Actor = queueItem.Actor, + Player = m.To, + Location = queueItem.Location, + CenterPosition = queueItem.CenterPosition, + AttemptsRemaining = queueItem.AttemptsRemaining, + MaxAttempts = queueItem.MaxAttemps + } + + table.insert(BuildingQueues[m.To.InternalName], copiedQueueItem) + end + + BuildingQueues[m.From.InternalName] = { } + end + + -- copy squads + for _, squad in pairs(Squads) do + if squad.Player == m.From then + local copiedSquad = { + Name = squad.Name .. "United", + Player = m.To, + TargetPlayer = USSR, + InitTime = squad.InitTime, + AttackValuePerSecond = squad.AttackValuePerSecond, + FollowLeader = squad.FollowLeader, + Compositions = squad.Compositions, + AttackPaths = squad.AttackPaths, + } + + if squad.IsAirSquad then + copiedSquad.IsAirSquad = true + copiedSquad.AirTargetList = squad.AirTargetList + copiedSquad.AirTargetType = squad.AirTargetType + end + + Squads[copiedSquad.Name] = copiedSquad + InitAttackSquad(Squads[copiedSquad.Name], m.To) + + -- disble old squad + squad.ActiveCondition = function() + return false + end + end + end + + Trigger.AfterDelay(1, function() + AutoRepairAndRebuildBuildings(m.To) + AutoReplaceHarvesters(m.To) + AutoRebuildConyards(m.To) + RebuildNextBuilding(m.To) + end) + end +end diff --git a/mods/ca/missions/main-campaign/ca38-procurement/lush.pal b/mods/ca/missions/main-campaign/ca38-procurement/lush.pal new file mode 100644 index 0000000000..2d567cc661 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca38-procurement/lush.pal differ diff --git a/mods/ca/missions/main-campaign/ca38-procurement/map.bin b/mods/ca/missions/main-campaign/ca38-procurement/map.bin new file mode 100644 index 0000000000..35911e8147 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca38-procurement/map.bin differ diff --git a/mods/ca/missions/main-campaign/ca38-procurement/map.png b/mods/ca/missions/main-campaign/ca38-procurement/map.png new file mode 100644 index 0000000000..65fdcbbbc9 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca38-procurement/map.png differ diff --git a/mods/ca/missions/main-campaign/ca38-procurement/map.yaml b/mods/ca/missions/main-campaign/ca38-procurement/map.yaml new file mode 100644 index 0000000000..5b0484568d --- /dev/null +++ b/mods/ca/missions/main-campaign/ca38-procurement/map.yaml @@ -0,0 +1,3670 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 38: Procurement + +Author: Darkademic + +Tileset: TEMPERAT + +MapSize: 130,98 + +Bounds: 1,1,128,96 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: USSR, GDI, China, ChinaWalls, ChinaHostile + PlayerReference@USSR: + Name: USSR + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: soviet + LockColor: True + Color: FE1100 + LockSpawn: True + LockTeam: True + Allies: ChinaWalls + Enemies: GDI, Creeps, ChinaHostile + PlayerReference@GDI: + Name: GDI + Bot: campaign + Faction: gdi + Color: F2CF74 + Enemies: USSR, Creeps + PlayerReference@China: + Name: China + Bot: dormant + Faction: soviet + Color: FFEE00 + Allies: ChinaWalls, ChinaHostile + Enemies: Creeps + PlayerReference@ChinaWalls: + Name: ChinaWalls + Bot: dormant + Faction: soviet + Color: FFEE00 + Allies: USSR, China, ChinaHostile + Enemies: Creeps + PlayerReference@ChinaHostile: + Name: ChinaHostile + Bot: campaign + Faction: soviet + Color: FFEE00 + Allies: China, ChinaWalls + Enemies: USSR, Creeps + +Actors: + Actor87: chain + Location: 21,19 + Owner: ChinaWalls + Actor117: chain + Owner: China + Location: 26,27 + Actor125: trpc.empty + Owner: China + Location: 19,21 + Facing: 768 + Actor126: trpc.empty + Owner: China + Facing: 768 + Location: 19,23 + Actor127: trpc.empty + Owner: China + Location: 19,22 + Facing: 768 + Actor123: ovld + Owner: China + Facing: 256 + Location: 29,21 + Actor129: ovld + Owner: China + Location: 29,22 + Facing: 256 + Actor130: ovld + Owner: China + Facing: 256 + Location: 29,23 + NonHardOverlord: ovld + Owner: China + Location: 29,24 + Facing: 256 + Actor98: nukc + Owner: China + Facing: 0 + Location: 23,26 + NonHardNukeCannon: nukc + Owner: China + Facing: 0 + Location: 25,26 + NonHardTroopCrawler: trpc.empty + Owner: China + Location: 19,24 + Facing: 768 + Actor128: 3tnk.rhino + Owner: USSR + Location: 5,9 + Facing: 768 + Actor133: 3tnk.rhino + Owner: USSR + Location: 7,9 + Facing: 768 + Actor51: btr + Owner: USSR + Location: 10,10 + Facing: 642 + Actor52: btr + Owner: USSR + Location: 12,11 + Facing: 769 + Actor55: e1 + Owner: USSR + SubCell: 3 + Location: 6,8 + Facing: 768 + Actor59: ttrp + Owner: USSR + SubCell: 3 + Location: 6,11 + Facing: 768 + Actor60: ttrp + Owner: USSR + SubCell: 3 + Facing: 768 + Location: 13,9 + Actor61: e1 + Owner: USSR + SubCell: 3 + Location: 10,8 + Facing: 768 + Actor62: e1 + Owner: USSR + SubCell: 3 + Facing: 768 + Location: 12,10 + Actor63: e1 + Owner: USSR + SubCell: 3 + Facing: 768 + Location: 8,11 + Actor64: e1 + Owner: USSR + SubCell: 3 + Facing: 768 + Location: 13,12 + Actor65: tc04 + Owner: Neutral + Location: 15,17 + Actor66: tc01 + Owner: Neutral + Location: 13,18 + Actor67: tc02 + Owner: Neutral + Location: 11,19 + Actor68: tc05 + Owner: Neutral + Location: 9,16 + Actor69: t16 + Owner: Neutral + Location: 9,18 + Actor70: t11 + Owner: Neutral + Location: 12,17 + Actor71: tc04 + Owner: Neutral + Location: 6,17 + Actor72: t16 + Owner: Neutral + Location: 7,16 + Actor73: t01 + Owner: Neutral + Location: 8,15 + Actor74: t05 + Owner: Neutral + Location: 5,18 + Actor75: t16 + Owner: Neutral + Location: 16,20 + Actor76: tc03 + Owner: Neutral + Location: 4,16 + Actor78: tc05 + Owner: Neutral + Location: 2,18 + Actor79: t15 + Owner: Neutral + Location: 1,16 + Actor81: t05 + Owner: Neutral + Location: 1,19 + Actor82: t01 + Owner: Neutral + Location: 2,20 + Actor83: tc04 + Owner: Neutral + Location: 8,19 + Actor86: tc01 + Owner: Neutral + Location: 5,20 + Actor134: tc02 + Owner: Neutral + Location: 15,24 + Actor135: tc01 + Owner: Neutral + Location: 14,21 + Actor136: tc04 + Owner: Neutral + Location: 14,26 + Actor137: t13 + Owner: Neutral + Location: 14,20 + Actor138: t13 + Owner: Neutral + Location: 12,21 + Actor139: t14 + Owner: Neutral + Location: 12,24 + Actor140: t07 + Owner: Neutral + Location: 14,23 + Actor141: t05 + Owner: Neutral + Location: 10,21 + Actor142: tc03 + Owner: Neutral + Location: 12,23 + Actor143: tc01 + Owner: Neutral + Location: 32,20 + Actor144: tc05 + Owner: Neutral + Location: 31,17 + Actor145: tc02 + Owner: Neutral + Location: 34,18 + Actor146: tc04 + Owner: Neutral + Location: 35,16 + Actor147: tc01 + Owner: Neutral + Location: 38,16 + Actor148: t12 + Owner: Neutral + Location: 37,18 + Actor149: t01 + Owner: Neutral + Location: 32,22 + Actor150: t05 + Owner: Neutral + Location: 32,25 + Actor151: tc04 + Owner: Neutral + Location: 33,23 + Actor152: tc05 + Owner: Neutral + Location: 29,28 + Actor153: tc03 + Owner: Neutral + Location: 33,26 + Actor154: t16 + Owner: Neutral + Location: 34,21 + Actor155: t07 + Owner: Neutral + Location: 36,21 + Actor156: t05 + Owner: Neutral + Location: 35,20 + Actor157: t01 + Owner: Neutral + Location: 39,18 + Actor158: t01 + Owner: Neutral + Location: 27,28 + Actor159: tc02 + Owner: Neutral + Location: 18,28 + Actor160: tc01 + Owner: Neutral + Location: 21,28 + Actor161: t07 + Owner: Neutral + Location: 16,28 + Actor162: t01 + Owner: Neutral + Location: 24,28 + Actor163: t03 + Owner: Neutral + Location: 25,29 + Actor164: t05 + Owner: Neutral + Location: 28,30 + Actor165: tc04 + Owner: Neutral + Location: 18,30 + Actor166: tc05 + Owner: Neutral + Location: 14,30 + Actor167: t17 + Owner: Neutral + Location: 12,28 + Actor168: t01 + Owner: Neutral + Location: 25,27 + Actor169: t05 + Owner: Neutral + Location: 28,27 + Actor170: t07 + Owner: Neutral + Location: 21,30 + Actor171: t14 + Owner: Neutral + Location: 22,27 + Actor172: t10 + Owner: Neutral + Location: 20,27 + Actor173: t11 + Owner: Neutral + Location: 23,29 + Actor174: t10 + Owner: Neutral + Location: 22,30 + Actor175: t11 + Owner: Neutral + Location: 32,28 + Actor176: t10 + Owner: Neutral + Location: 36,24 + Actor177: t12 + Owner: Neutral + Location: 7,21 + Actor178: tc02 + Owner: Neutral + Location: 38,20 + Actor179: t11 + Owner: Neutral + Location: 25,31 + Actor180: t13 + Owner: Neutral + Location: 27,29 + Actor181: t02 + Owner: Neutral + Location: 27,31 + Actor182: t05 + Owner: Neutral + Location: 21,31 + Actor184: t01 + Owner: Neutral + Location: 39,22 + Actor185: t05 + Owner: Neutral + Location: 40,17 + Actor186: t01 + Owner: Neutral + Location: 35,13 + Actor187: t05 + Owner: Neutral + Location: 31,14 + Actor188: t02 + Owner: Neutral + Location: 27,2 + Actor189: t05 + Owner: Neutral + Location: 32,4 + Actor190: tc01 + Owner: Neutral + Location: 28,12 + Actor191: tc04 + Owner: Neutral + Location: 20,8 + Actor192: tc02 + Owner: Neutral + Location: 10,1 + Actor193: t01 + Owner: Neutral + Location: 6,2 + Actor194: t05 + Owner: Neutral + Location: 15,2 + Actor195: t12 + Owner: Neutral + Location: 17,1 + Actor196: t15 + Owner: Neutral + Location: 13,6 + Actor197: t10 + Owner: Neutral + Location: 2,1 + Actor198: t11 + Owner: Neutral + Location: 3,12 + Actor199: t11 + Owner: Neutral + Location: 18,15 + Actor200: t17 + Owner: Neutral + Location: 26,10 + Actor201: t10 + Owner: Neutral + Location: 25,4 + Actor202: t11 + Owner: Neutral + Location: 32,1 + Actor203: t14 + Owner: Neutral + Location: 28,15 + Actor204: t13 + Owner: Neutral + Location: 14,13 + Actor243: barr + Owner: China + Location: 54,19 + Actor246: pbox + Owner: China + Location: 46,29 + Actor247: pbox + Owner: China + Location: 52,29 + Actor248: e1 + Owner: China + Facing: 384 + Location: 45,29 + SubCell: 3 + Actor249: e1 + Owner: China + SubCell: 3 + Location: 53,29 + Facing: 491 + Actor251: e1 + Owner: China + SubCell: 3 + Location: 45,24 + Facing: 618 + Actor252: e1 + Owner: China + Facing: 384 + Location: 54,22 + SubCell: 3 + Actor253: e1 + Owner: China + Facing: 384 + Location: 54,22 + SubCell: 1 + Actor254: e1 + Owner: China + Facing: 384 + Location: 53,21 + SubCell: 3 + Actor255: e1 + Owner: China + Facing: 384 + SubCell: 3 + Location: 54,24 + Actor256: e3 + Owner: China + Facing: 384 + Location: 53,20 + SubCell: 3 + Actor234: tanktrap2 + Owner: Neutral + Location: 46,31 + Actor257: tanktrap2 + Owner: Neutral + Location: 51,31 + Actor258: brl3 + Owner: Neutral + Location: 46,19 + Actor259: barl + Owner: Neutral + Location: 46,20 + Actor260: sbag + Owner: GDI + Location: 22,46 + Actor261: sbag + Owner: GDI + Location: 29,46 + Actor262: sbag + Owner: GDI + Location: 21,46 + Actor263: sbag + Owner: GDI + Location: 20,46 + Actor264: sbag + Owner: GDI + Location: 19,46 + Actor265: sbag + Owner: GDI + Location: 18,46 + Actor266: sbag + Owner: GDI + Location: 18,47 + Actor267: sbag + Owner: GDI + Location: 30,46 + Actor268: sbag + Owner: GDI + Location: 31,46 + Actor269: sbag + Owner: GDI + Location: 32,46 + Actor270: sbag + Owner: GDI + Location: 33,46 + Actor271: sbag + Owner: GDI + Location: 33,47 + Actor272: sbag + Owner: GDI + Location: 18,48 + Actor273: sbag + Owner: GDI + Location: 18,49 + Actor276: sbag + Owner: GDI + Location: 18,56 + Actor277: sbag + Owner: GDI + Location: 18,57 + Actor278: sbag + Owner: GDI + Location: 18,58 + Actor279: sbag + Owner: GDI + Location: 18,59 + Actor280: sbag + Owner: GDI + Location: 18,60 + Actor281: sbag + Owner: GDI + Location: 19,60 + Actor282: sbag + Owner: GDI + Location: 20,60 + Actor283: sbag + Owner: GDI + Location: 21,60 + Actor284: sbag + Owner: GDI + Location: 22,60 + Actor285: sbag + Owner: GDI + Location: 33,48 + Actor287: sbag + Owner: GDI + Location: 33,49 + Actor288: sbag + Owner: GDI + Location: 33,50 + Actor289: sbag + Owner: GDI + Location: 33,51 + Actor290: sbag + Owner: GDI + Location: 33,52 + Actor291: sbag + Owner: GDI + Location: 33,53 + Actor292: sbag + Owner: GDI + Location: 33,54 + Actor293: sbag + Owner: GDI + Location: 33,55 + Actor294: sbag + Owner: GDI + Location: 33,56 + Actor295: sbag + Owner: GDI + Location: 33,57 + Actor296: sbag + Owner: GDI + Location: 33,58 + Actor297: sbag + Owner: GDI + Location: 33,59 + Actor298: sbag + Owner: GDI + Location: 33,60 + Actor300: sbag + Owner: GDI + Location: 29,60 + Actor302: sbag + Owner: GDI + Location: 30,60 + Actor303: sbag + Owner: GDI + Location: 32,60 + Actor304: sbag + Owner: GDI + Location: 31,60 + OutpostConyard: afac + Owner: GDI + Location: 30,57 + OutpostRefinery: proc.td + Owner: GDI + Location: 20,51 + OutpostGuardTower1: gtwr + Owner: GDI + Location: 23,46 + OutpostGuardTower2: gtwr + Owner: GDI + Location: 28,46 + OutpostGuardTower4: gtwr + Owner: GDI + Location: 28,60 + OutpostGuardTower3: gtwr + Owner: GDI + Location: 23,60 + OutpostBarracks: pyle + Owner: GDI + Location: 19,47 + OutpostPower1: nuk2 + Owner: GDI + Location: 31,53 + OutpostPower2: nuk2 + Owner: GDI + Location: 31,50 + OutpostPower3: nuk2 + Owner: GDI + Location: 31,47 + OutpostFactory: weap.td + Owner: GDI + Location: 27,52 + OutpostSilo2: silo.td + Owner: GDI + Location: 19,59 + OutpostSilo1: silo.td + Owner: GDI + Location: 19,57 + Actor274: sbag + Owner: GDI + Location: 18,50 + Actor275: split2 + Owner: Neutral + Location: 13,51 + Actor317: split2 + Owner: Neutral + Location: 11,58 + Actor318: split2 + Owner: Neutral + Location: 6,53 + Actor321: brik + Owner: GDI + Location: 95,64 + Actor322: brik + Owner: GDI + Location: 95,63 + Actor323: brik + Owner: GDI + Location: 96,63 + Actor324: brik + Owner: GDI + Location: 96,64 + Actor325: brik + Owner: GDI + Location: 95,65 + Actor326: brik + Owner: GDI + Location: 95,66 + Actor327: brik + Owner: GDI + Location: 95,67 + Actor328: brik + Owner: GDI + Location: 96,67 + Actor329: brik + Owner: GDI + Location: 96,66 + Actor330: brik + Owner: GDI + Location: 97,63 + Actor331: brik + Owner: GDI + Location: 98,63 + Actor332: brik + Owner: GDI + Location: 99,63 + Actor333: brik + Owner: GDI + Location: 100,63 + Actor334: brik + Owner: GDI + Location: 102,63 + Actor335: brik + Owner: GDI + Location: 101,63 + Actor336: brik + Owner: GDI + Location: 103,63 + Actor337: brik + Owner: GDI + Location: 104,63 + Actor338: brik + Owner: GDI + Location: 95,72 + Actor339: brik + Owner: GDI + Location: 96,72 + Actor340: brik + Owner: GDI + Location: 95,73 + Actor341: brik + Owner: GDI + Location: 96,73 + Actor342: brik + Owner: GDI + Location: 95,74 + Actor343: brik + Owner: GDI + Location: 95,75 + Actor344: brik + Owner: GDI + Location: 95,76 + Actor345: brik + Owner: GDI + Location: 96,76 + Actor346: brik + Owner: GDI + Location: 96,75 + Actor347: brik + Owner: GDI + Location: 95,77 + Actor348: brik + Owner: GDI + Location: 95,78 + Actor349: brik + Owner: GDI + Location: 95,79 + Actor350: brik + Owner: GDI + Location: 96,79 + Actor351: brik + Owner: GDI + Location: 96,78 + Actor352: brik + Owner: GDI + Location: 97,79 + Actor353: brik + Owner: GDI + Location: 98,79 + Actor354: brik + Owner: GDI + Location: 99,79 + Actor355: brik + Owner: GDI + Location: 100,79 + Actor356: brik + Owner: GDI + Location: 101,79 + Actor357: brik + Owner: GDI + Location: 102,79 + Actor358: brik + Owner: GDI + Location: 102,78 + Actor359: brik + Owner: GDI + Location: 101,78 + Actor360: brik + Owner: GDI + Location: 99,62 + Actor361: brik + Owner: GDI + Location: 99,61 + Actor362: brik + Owner: GDI + Location: 99,60 + Actor363: brik + Owner: GDI + Location: 99,59 + Actor364: brik + Owner: GDI + Location: 99,58 + Actor365: brik + Owner: GDI + Location: 99,57 + Actor366: brik + Owner: GDI + Location: 99,56 + Actor367: brik + Owner: GDI + Location: 100,56 + Actor368: brik + Owner: GDI + Location: 100,57 + Actor369: brik + Owner: GDI + Location: 102,56 + Actor370: brik + Owner: GDI + Location: 101,56 + Actor371: brik + Owner: GDI + Location: 103,56 + Actor372: brik + Owner: GDI + Location: 104,56 + Actor373: brik + Owner: GDI + Location: 106,56 + Actor374: brik + Owner: GDI + Location: 105,56 + Actor375: brik + Owner: GDI + Location: 107,56 + Actor376: brik + Owner: GDI + Location: 107,57 + Actor377: brik + Owner: GDI + Location: 106,57 + Actor378: brik + Owner: GDI + Location: 105,63 + Actor379: brik + Owner: GDI + Location: 106,63 + Actor380: brik + Owner: GDI + Location: 107,63 + Actor381: brik + Owner: GDI + Location: 107,64 + Actor382: brik + Owner: GDI + Location: 106,64 + Actor383: brik + Owner: GDI + Location: 108,56 + Actor384: brik + Owner: GDI + Location: 109,56 + Actor385: brik + Owner: GDI + Location: 110,56 + Actor388: brik + Owner: GDI + Location: 110,57 + Actor389: brik + Owner: GDI + Location: 109,57 + Actor386: brik + Owner: GDI + Location: 115,56 + Actor387: brik + Owner: GDI + Location: 115,57 + Actor390: brik + Owner: GDI + Location: 116,57 + Actor391: brik + Owner: GDI + Location: 116,56 + Actor392: brik + Owner: GDI + Location: 117,56 + Actor393: brik + Owner: GDI + Location: 118,56 + Actor394: brik + Owner: GDI + Location: 119,56 + Actor395: brik + Owner: GDI + Location: 119,57 + Actor396: brik + Owner: GDI + Location: 118,57 + Actor397: brik + Owner: GDI + Location: 120,56 + Actor398: brik + Owner: GDI + Location: 121,56 + Actor399: brik + Owner: GDI + Location: 123,56 + Actor400: brik + Owner: GDI + Location: 122,56 + Actor401: brik + Owner: GDI + Location: 124,56 + Actor402: brik + Owner: GDI + Location: 125,56 + Actor403: brik + Owner: GDI + Location: 127,56 + Actor404: brik + Owner: GDI + Location: 126,56 + Actor405: brik + Owner: GDI + Location: 128,56 + Actor406: brik + Owner: GDI + Location: 128,57 + Actor407: brik + Owner: GDI + Location: 128,58 + Actor408: brik + Owner: GDI + Location: 128,59 + Actor409: brik + Owner: GDI + Location: 128,65 + Actor410: brik + Owner: GDI + Location: 128,64 + Actor411: brik + Owner: GDI + Location: 128,62 + Actor412: brik + Owner: GDI + Location: 128,61 + Actor413: brik + Owner: GDI + Location: 128,60 + Actor414: brik + Owner: GDI + Location: 128,63 + Actor415: brik + Owner: GDI + Location: 128,66 + Actor416: brik + Owner: GDI + Location: 128,67 + Actor417: brik + Owner: GDI + Location: 128,68 + Actor418: brik + Owner: GDI + Location: 128,69 + Actor419: brik + Owner: GDI + Location: 128,70 + Actor420: brik + Owner: GDI + Location: 107,78 + Actor421: brik + Owner: GDI + Location: 107,79 + Actor422: brik + Owner: GDI + Location: 108,79 + Actor423: brik + Owner: GDI + Location: 108,78 + Actor424: brik + Owner: GDI + Location: 109,79 + Actor425: brik + Owner: GDI + Location: 110,79 + Actor426: brik + Owner: GDI + Location: 111,79 + Actor427: brik + Owner: GDI + Location: 112,79 + Actor428: brik + Owner: GDI + Location: 113,79 + Actor429: brik + Owner: GDI + Location: 114,79 + Actor430: brik + Owner: GDI + Location: 115,79 + Actor431: brik + Owner: GDI + Location: 115,78 + Actor432: brik + Owner: GDI + Location: 115,77 + Actor433: brik + Owner: GDI + Location: 115,76 + Actor434: brik + Owner: GDI + Location: 116,79 + Actor435: brik + Owner: GDI + Location: 116,78 + Actor436: brik + Owner: GDI + Location: 115,75 + Actor437: brik + Owner: GDI + Location: 116,75 + Actor438: brik + Owner: GDI + Location: 116,76 + Actor439: brik + Owner: GDI + Location: 117,79 + Actor440: brik + Owner: GDI + Location: 118,79 + Actor441: brik + Owner: GDI + Location: 119,79 + Actor442: brik + Owner: GDI + Location: 120,79 + Actor443: brik + Owner: GDI + Location: 121,79 + Actor444: brik + Owner: GDI + Location: 122,79 + Actor445: brik + Owner: GDI + Location: 123,79 + Actor446: brik + Owner: GDI + Location: 125,79 + Actor447: brik + Owner: GDI + Location: 124,79 + Actor448: brik + Owner: GDI + Location: 126,79 + Actor449: brik + Owner: GDI + Location: 127,79 + Actor450: brik + Owner: GDI + Location: 128,79 + Actor451: brik + Owner: GDI + Location: 128,78 + Actor452: brik + Owner: GDI + Location: 128,77 + Actor453: brik + Owner: GDI + Location: 128,76 + Actor454: brik + Owner: GDI + Location: 128,75 + Actor455: brik + Owner: GDI + Location: 128,74 + Actor456: brik + Owner: GDI + Location: 128,73 + Actor457: brik + Owner: GDI + Location: 128,72 + Actor458: brik + Owner: GDI + Location: 128,71 + Actor459: afac + Owner: GDI + Location: 125,76 + Actor461: pyle + Owner: GDI + Location: 102,65 + Actor462: weap.td + Owner: GDI + Location: 99,73 + Actor464: nuk2 + Owner: GDI + Location: 126,72 + Actor465: nuk2 + Owner: GDI + Location: 126,69 + Actor466: nuk2 + Owner: GDI + Location: 126,66 + Actor467: nuk2 + Owner: GDI + Location: 126,63 + Actor468: nuk2 + Owner: GDI + Location: 126,60 + Actor470: nuk2 + Owner: GDI + Location: 118,76 + Actor471: nuk2 + Owner: GDI + Location: 120,76 + Actor472: nuk2 + Owner: GDI + Location: 122,76 + Actor469: gtwr + Owner: GDI + Location: 94,67 + Actor473: gtwr + Owner: GDI + Location: 94,72 + Actor474: gtwr + Owner: GDI + Location: 110,55 + Actor475: gtwr + Owner: GDI + Location: 115,55 + Actor476: gtwr + Owner: GDI + Location: 102,80 + Actor477: gtwr + Owner: GDI + Location: 107,80 + Actor478: atwr + Owner: GDI + Location: 96,77 + Actor479: atwr + Owner: GDI + Location: 96,74 + Actor480: atwr + Owner: GDI + Location: 96,65 + Actor481: atwr + Owner: GDI + Location: 101,57 + Actor482: atwr + Owner: GDI + Location: 108,57 + Actor483: atwr + Owner: GDI + Location: 117,57 + Actor484: atwr + Owner: GDI + Location: 109,78 + Actor485: atwr + Owner: GDI + Location: 100,78 + Actor486: atwr + Owner: GDI + Location: 100,62 + Actor487: cram + Owner: GDI + Location: 105,64 + Actor488: cram + Owner: GDI + Location: 104,57 + Actor489: cram + Owner: GDI + Location: 121,57 + Actor490: cram + Owner: GDI + Location: 116,77 + Actor491: cram + Owner: GDI + Location: 112,78 + Actor492: cram + Owner: GDI + Location: 98,78 + Actor493: cram + Owner: GDI + Location: 98,64 + Actor460: pyle + Owner: GDI + Location: 100,65 + Actor494: proc.td + Owner: GDI + Location: 105,72 + Actor495: proc.td + Owner: GDI + Location: 109,72 + Actor498: afld.gdi + Owner: GDI + Location: 115,60 + Actor499: afld.gdi + Owner: GDI + Location: 115,63 + Actor500: rep + Owner: GDI + Location: 110,60 + Actor463: weap.td + Owner: GDI + Location: 109,65 + Actor502: patr + Owner: GDI + Location: 103,59 + Actor503: silo.td + Owner: GDI + Location: 107,70 + Actor504: silo.td + Owner: GDI + Location: 110,70 + Actor505: nuk2 + Owner: GDI + Location: 123,60 + Actor506: nuk2 + Owner: GDI + Location: 120,60 + Actor507: nuk2 + Owner: GDI + Location: 123,63 + Actor508: nuk2 + Owner: GDI + Location: 120,63 + CommsCenter1: hq + Owner: GDI + Location: 115,68 + AdvancedComms: eye + Owner: GDI + Location: 118,68 + Actor501: gtek + Owner: GDI + Location: 121,68 + Actor509: nuk2 + Owner: GDI + Location: 120,73 + Actor510: nuk2 + Owner: GDI + Location: 122,73 + Actor511: nuk2 + Owner: GDI + Location: 118,73 + Actor512: chain + Owner: GDI + Location: 114,71 + Actor513: chain + Owner: GDI + Location: 114,70 + Actor514: chain + Owner: GDI + Location: 114,69 + Actor515: chain + Owner: GDI + Location: 114,68 + Actor516: chain + Owner: GDI + Location: 114,67 + Actor517: chain + Owner: GDI + Location: 116,67 + Actor518: chain + Owner: GDI + Location: 115,67 + Actor519: chain + Owner: GDI + Location: 117,67 + Actor520: chain + Owner: GDI + Location: 118,67 + Actor521: chain + Owner: GDI + Location: 119,67 + Actor522: chain + Owner: GDI + Location: 121,67 + Actor523: chain + Owner: GDI + Location: 120,67 + Actor524: chain + Owner: GDI + Location: 122,67 + Actor525: chain + Owner: GDI + Location: 123,67 + Actor526: chain + Owner: GDI + Location: 124,67 + Actor527: chain + Owner: GDI + Location: 124,68 + Actor528: chain + Owner: GDI + Location: 124,69 + Actor529: chain + Owner: GDI + Location: 124,70 + Actor530: chain + Owner: GDI + Location: 124,71 + Actor531: chain + Owner: GDI + Location: 115,71 + Actor532: chain + Owner: GDI + Location: 116,71 + Actor533: chain + Owner: GDI + Location: 121,71 + Actor534: chain + Owner: GDI + Location: 122,71 + Actor535: chain + Owner: GDI + Location: 123,71 + Actor536: cram + Owner: GDI + Location: 117,66 + Actor537: cram + Owner: GDI + Location: 105,70 + Actor538: split2 + Owner: Neutral + Location: 107,87 + Actor539: split2 + Owner: Neutral + Location: 112,84 + Actor540: split2 + Owner: Neutral + Location: 119,85 + Actor541: split2 + Owner: Neutral + Location: 100,86 + Actor542: split2 + Owner: Neutral + Location: 116,90 + Actor543: split2 + Owner: Neutral + Location: 96,90 + Actor544: mtnk + Owner: GDI + Location: 20,44 + Facing: 896 + Actor545: mtnk + Owner: GDI + Location: 27,44 + Facing: 896 + Actor546: mtnk + Owner: GDI + Location: 30,45 + Facing: 896 + Actor547: vulc.ai + Owner: GDI + Location: 26,47 + Facing: 0 + Actor548: vulc.ai + Owner: GDI + Location: 21,45 + Facing: 896 + Actor549: htnk.ion + Owner: GDI + Location: 25,51 + Facing: 0 + Actor550: wolv + Owner: GDI + Location: 23,50 + Facing: 0 + Actor551: n1r1 + Owner: GDI + SubCell: 3 + Location: 27,48 + Facing: 753 + Actor552: n1r1 + Owner: GDI + Location: 27,48 + SubCell: 1 + Facing: 951 + Actor553: n1r1 + Owner: GDI + Location: 23,45 + SubCell: 3 + Facing: 840 + Actor554: n1r1 + Owner: GDI + SubCell: 3 + Location: 23,42 + Facing: 682 + Actor555: n1r1 + Owner: GDI + Location: 23,42 + SubCell: 1 + Facing: 919 + Actor556: n1r1 + Owner: GDI + SubCell: 3 + Location: 21,40 + Facing: 713 + Actor557: n1r1 + Owner: GDI + SubCell: 3 + Location: 26,39 + Facing: 816 + Actor558: n1r1 + Owner: GDI + SubCell: 3 + Location: 31,45 + Facing: 856 + Actor559: n1r1 + Owner: GDI + Location: 31,45 + SubCell: 1 + Facing: 864 + Actor560: n1r1 + Owner: GDI + SubCell: 3 + Location: 28,44 + Facing: 0 + Actor561: n1r1 + Owner: GDI + SubCell: 3 + Location: 28,55 + Facing: 578 + Actor562: n1r1 + Owner: GDI + Facing: 384 + Location: 28,55 + SubCell: 1 + Actor563: n1r1 + Owner: GDI + Location: 32,45 + SubCell: 3 + Facing: 0 + Actor564: n3 + Owner: GDI + Location: 19,45 + SubCell: 3 + Facing: 864 + Actor565: n3 + Owner: GDI + SubCell: 3 + Location: 18,43 + Facing: 721 + Actor566: n3 + Owner: GDI + Location: 18,43 + SubCell: 1 + Facing: 832 + Actor567: n3 + Owner: GDI + SubCell: 3 + Location: 30,47 + Facing: 0 + Actor568: medi + Owner: GDI + SubCell: 3 + Facing: 384 + Location: 28,47 + Actor569: syrd + Owner: China + Location: 67,6 + Actor570: brik + Location: 46,0 + Owner: ChinaWalls + Actor612: sam + Owner: China + Location: 54,27 + Actor613: sam + Owner: China + Location: 44,27 + Actor614: dd + Owner: China + Location: 70,4 + Facing: 634 + Actor615: dd + Owner: China + Location: 73,5 + Facing: 642 + Actor616: asianhut + Owner: Neutral + Location: 22,5 + Actor617: v16 + Owner: Neutral + Location: 32,7 + Actor618: v16 + Owner: Neutral + Location: 33,7 + Actor619: tc01 + Owner: Neutral + Location: 49,9 + Actor620: t15 + Owner: Neutral + Location: 54,11 + Actor622: t05 + Owner: Neutral + Location: 62,14 + Actor623: t17 + Owner: Neutral + Location: 60,20 + Actor624: t12 + Owner: Neutral + Location: 40,11 + Actor625: t05 + Owner: Neutral + Location: 37,32 + Actor626: tc03 + Owner: Neutral + Location: 25,35 + Actor627: t11 + Owner: Neutral + Location: 12,37 + Actor628: t06 + Owner: Neutral + Location: 13,34 + NavalYard: syrd.gdi + Owner: GDI + Location: 77,92 + Carrier1: cv + Owner: GDI + Location: 51,94 + Facing: 256 + Actor632: dd2 + Owner: GDI + Location: 49,92 + Facing: 256 + Actor635: pt2 + Owner: GDI + Location: 69,93 + Facing: 256 + Actor633: dd2 + Owner: GDI + Facing: 256 + Location: 56,92 + Actor634: dd2 + Owner: GDI + Facing: 256 + Location: 62,93 + Actor636: atwr + Owner: GDI + Location: 69,46 + Actor637: atwr + Owner: GDI + Location: 65,52 + Actor638: atwr + Owner: GDI + Location: 53,68 + Actor639: atwr + Owner: GDI + Location: 61,72 + Actor640: cram + Owner: GDI + Location: 57,67 + Actor641: cram + Owner: GDI + Location: 63,69 + Actor642: cram + Owner: GDI + Location: 69,51 + Actor643: barb + Owner: GDI + Location: 69,50 + Actor644: barb + Owner: GDI + Location: 68,50 + Actor645: barb + Owner: GDI + Location: 68,51 + Actor646: barb + Owner: GDI + Location: 68,52 + Actor647: barb + Owner: GDI + Location: 69,52 + Actor648: barb + Owner: GDI + Location: 70,52 + Actor649: barb + Owner: GDI + Location: 70,51 + Actor650: barb + Owner: GDI + Location: 70,50 + Actor651: barb + Owner: GDI + Location: 62,68 + Actor652: barb + Owner: GDI + Location: 62,69 + Actor653: barb + Owner: GDI + Location: 62,70 + Actor654: barb + Owner: GDI + Location: 64,70 + Actor655: barb + Owner: GDI + Location: 63,70 + Actor656: barb + Owner: GDI + Location: 64,69 + Actor657: barb + Owner: GDI + Location: 64,68 + Actor658: barb + Owner: GDI + Location: 63,68 + Actor659: barb + Owner: GDI + Location: 56,66 + Actor660: barb + Owner: GDI + Location: 57,66 + Actor661: barb + Owner: GDI + Location: 58,66 + Actor662: barb + Owner: GDI + Location: 58,67 + Actor663: barb + Owner: GDI + Location: 56,67 + Actor664: barb + Owner: GDI + Location: 57,68 + Actor665: barb + Owner: GDI + Location: 56,68 + Actor666: barb + Owner: GDI + Location: 58,68 + Actor667: split2 + Owner: Neutral + Location: 20,84 + Actor668: split2 + Owner: Neutral + Location: 24,79 + Actor670: split2 + Owner: Neutral + Location: 84,38 + Actor671: split2 + Owner: Neutral + Location: 80,34 + Actor672: split2 + Owner: Neutral + Location: 109,14 + Actor673: split2 + Owner: Neutral + Location: 112,10 + Actor674: proc.td + Owner: GDI + Location: 121,10 + Actor675: sbag + Owner: GDI + Location: 120,16 + Actor676: sbag + Owner: GDI + Location: 121,16 + Actor677: sbag + Owner: GDI + Location: 122,16 + Actor678: sbag + Owner: GDI + Location: 123,16 + Actor679: sbag + Owner: GDI + Location: 124,16 + Actor680: sbag + Owner: GDI + Location: 124,15 + Actor681: sbag + Owner: GDI + Location: 124,14 + Actor682: sbag + Owner: GDI + Location: 124,13 + Actor683: sbag + Owner: GDI + Location: 124,12 + Actor684: sbag + Owner: GDI + Location: 124,11 + Actor685: sbag + Owner: GDI + Location: 124,10 + Actor686: sbag + Owner: GDI + Location: 124,9 + Actor687: sbag + Owner: GDI + Location: 123,9 + Actor688: sbag + Owner: GDI + Location: 122,9 + Actor689: sbag + Owner: GDI + Location: 121,9 + Actor690: sbag + Owner: GDI + Location: 120,9 + Actor691: sbag + Owner: GDI + Location: 119,16 + Actor692: sbag + Owner: GDI + Location: 119,15 + Actor693: gtwr + Owner: GDI + Location: 118,15 + CommsCenter2: hq + Owner: GDI + Location: 121,32 + Actor695: chain + Owner: GDI + Location: 120,32 + Actor696: chain + Owner: GDI + Location: 120,33 + Actor697: chain + Owner: GDI + Location: 120,34 + Actor698: chain + Owner: GDI + Location: 120,35 + Actor699: chain + Owner: GDI + Location: 120,36 + Actor700: chain + Owner: GDI + Location: 121,36 + Actor701: chain + Owner: GDI + Location: 122,36 + Actor702: chain + Owner: GDI + Location: 120,31 + Actor703: chain + Owner: GDI + Location: 121,31 + Actor704: chain + Owner: GDI + Location: 122,31 + Actor705: chain + Owner: GDI + Location: 123,31 + Actor706: chain + Owner: GDI + Location: 124,31 + Actor707: chain + Owner: GDI + Location: 123,36 + Actor708: chain + Owner: GDI + Location: 124,36 + Actor709: chain + Owner: GDI + Location: 127,31 + Actor710: chain + Owner: GDI + Location: 128,31 + Actor711: chain + Owner: GDI + Location: 128,32 + Actor712: chain + Owner: GDI + Location: 128,33 + Actor713: chain + Owner: GDI + Location: 128,34 + Actor714: chain + Owner: GDI + Location: 128,35 + Actor715: chain + Owner: GDI + Location: 128,36 + Actor716: chain + Owner: GDI + Location: 127,36 + Actor717: gtwr + Owner: GDI + Location: 123,30 + Actor718: gtwr + Owner: GDI + Location: 125,39 + Actor719: hpad.td + Owner: GDI + Location: 58,50 + Actor720: hpad.td + Owner: GDI + Location: 60,50 + Actor721: brik + Owner: GDI + Location: 57,49 + Actor722: brik + Owner: GDI + Location: 58,49 + Actor723: brik + Owner: GDI + Location: 59,49 + Actor724: brik + Owner: GDI + Location: 60,49 + Actor725: brik + Owner: GDI + Location: 61,49 + Actor726: brik + Owner: GDI + Location: 62,49 + Actor727: brik + Owner: GDI + Location: 62,50 + Actor728: brik + Owner: GDI + Location: 62,51 + Actor729: brik + Owner: GDI + Location: 62,52 + Actor730: brik + Owner: GDI + Location: 62,53 + Actor731: brik + Owner: GDI + Location: 62,54 + Actor732: brik + Owner: GDI + Location: 61,54 + Actor733: brik + Owner: GDI + Location: 61,53 + Actor734: brik + Owner: GDI + Location: 57,50 + Actor735: brik + Owner: GDI + Location: 57,51 + Actor736: brik + Owner: GDI + Location: 57,52 + Actor737: brik + Owner: GDI + Location: 57,53 + Actor738: brik + Owner: GDI + Location: 57,54 + Actor739: brik + Owner: GDI + Location: 58,54 + Actor740: brik + Owner: GDI + Location: 58,53 + Actor743: sbag + Owner: GDI + Location: 15,81 + Actor744: sbag + Owner: GDI + Location: 14,81 + Actor745: sbag + Owner: GDI + Location: 13,81 + Actor746: sbag + Owner: GDI + Location: 12,81 + Actor747: sbag + Owner: GDI + Location: 11,81 + Actor748: sbag + Owner: GDI + Location: 10,81 + Actor749: sbag + Owner: GDI + Location: 10,82 + Actor750: sbag + Owner: GDI + Location: 10,83 + Actor751: sbag + Owner: GDI + Location: 10,84 + Actor752: sbag + Owner: GDI + Location: 10,85 + Actor753: sbag + Owner: GDI + Location: 10,86 + Actor754: sbag + Owner: GDI + Location: 10,87 + Actor755: sbag + Owner: GDI + Location: 11,87 + Actor756: sbag + Owner: GDI + Location: 12,87 + Actor757: sbag + Owner: GDI + Location: 13,87 + Actor758: sbag + Owner: GDI + Location: 14,87 + Actor759: sbag + Owner: GDI + Location: 15,87 + Actor760: sbag + Owner: GDI + Location: 16,87 + Actor741: proc.td + Owner: GDI + Location: 11,83 + Actor742: silo.td + Owner: GDI + Location: 11,82 + Actor761: silo.td + Owner: GDI + Location: 13,82 + Actor762: sbag + Owner: GDI + Location: 16,81 + Actor763: sbag + Owner: GDI + Location: 16,82 + Actor764: sbag + Owner: GDI + Location: 16,86 + Actor765: gtwr + Owner: GDI + Location: 16,80 + Actor766: gtwr + Owner: GDI + Location: 17,87 + Actor767: atwr + Owner: GDI + Location: 118,32 + Actor768: atwr + Owner: GDI + Location: 93,41 + Actor769: atwr + Owner: GDI + Location: 93,35 + Actor770: brik + Owner: GDI + Location: 93,34 + Actor771: brik + Owner: GDI + Location: 92,34 + Actor772: brik + Owner: GDI + Location: 92,35 + Actor773: brik + Owner: GDI + Location: 92,36 + Actor774: brik + Owner: GDI + Location: 93,36 + Actor775: brik + Owner: GDI + Location: 94,36 + Actor776: brik + Owner: GDI + Location: 94,35 + Actor777: brik + Owner: GDI + Location: 94,34 + Actor778: brik + Owner: GDI + Location: 92,40 + Actor779: brik + Owner: GDI + Location: 92,41 + Actor780: brik + Owner: GDI + Location: 92,42 + Actor781: brik + Owner: GDI + Location: 93,42 + Actor782: brik + Owner: GDI + Location: 94,42 + Actor783: brik + Owner: GDI + Location: 93,40 + Actor784: brik + Owner: GDI + Location: 94,40 + Actor785: brik + Owner: GDI + Location: 94,41 + Actor786: gtwr + Owner: GDI + Location: 89,47 + Actor787: gtwr + Owner: GDI + Location: 68,77 + Actor788: gtwr + Owner: GDI + Location: 70,81 + Actor789: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 93,67 + Actor790: n1 + Owner: GDI + Location: 94,66 + SubCell: 3 + Facing: 166 + Actor791: n1 + Owner: GDI + SubCell: 3 + Location: 93,72 + Facing: 174 + Actor792: n1 + Owner: GDI + Facing: 384 + Location: 93,73 + SubCell: 3 + Actor793: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 99,67 + Actor794: n1 + Owner: GDI + SubCell: 3 + Location: 98,66 + Facing: 261 + Actor795: n1 + Owner: GDI + SubCell: 3 + Location: 106,65 + Facing: 523 + Actor796: n1 + Owner: GDI + Facing: 384 + Location: 106,59 + SubCell: 3 + Actor797: n1 + Owner: GDI + SubCell: 3 + Location: 107,61 + Facing: 539 + Actor798: n1 + Owner: GDI + SubCell: 3 + Location: 118,58 + Facing: 245 + Actor799: n1 + Owner: GDI + SubCell: 3 + Location: 116,72 + Facing: 602 + Actor800: n1 + Owner: GDI + Facing: 384 + Location: 122,72 + SubCell: 3 + Actor801: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 117,71 + Actor802: n1 + Owner: GDI + SubCell: 3 + Location: 102,77 + Facing: 658 + Actor803: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 108,73 + Actor804: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 109,69 + Actor805: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 59,68 + Actor806: n1 + Owner: GDI + SubCell: 3 + Location: 64,67 + Facing: 626 + Actor807: n1 + Owner: GDI + SubCell: 3 + Location: 64,71 + Facing: 674 + Actor808: n1 + Owner: GDI + Facing: 384 + Location: 69,78 + SubCell: 3 + Actor809: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 67,76 + Actor810: n1 + Owner: GDI + Facing: 384 + Location: 71,81 + SubCell: 3 + Actor811: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 70,80 + Actor812: n1 + Owner: GDI + SubCell: 3 + Location: 15,82 + Facing: 245 + Actor814: n1 + Owner: GDI + SubCell: 3 + Location: 12,80 + Facing: 1023 + Actor815: n1 + Owner: GDI + SubCell: 3 + Location: 18,89 + Facing: 658 + Actor816: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 65,35 + Actor817: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 64,36 + Actor818: n1 + Owner: GDI + SubCell: 3 + Location: 65,40 + Facing: 142 + Actor819: n1 + Owner: GDI + SubCell: 3 + Location: 58,56 + Facing: 253 + Actor820: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 59,57 + Actor821: n1 + Owner: GDI + SubCell: 3 + Location: 69,53 + Facing: 634 + Actor822: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 67,50 + Actor823: n1 + Owner: GDI + SubCell: 3 + Location: 124,37 + Facing: 384 + Actor824: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 127,37 + Actor825: n1 + Owner: GDI + SubCell: 3 + Location: 124,30 + Facing: 0 + Actor826: n1 + Owner: GDI + SubCell: 3 + Location: 127,30 + Facing: 126 + Actor827: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 118,17 + Actor828: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 119,18 + Actor829: n1 + Owner: GDI + Facing: 384 + Location: 118,17 + SubCell: 1 + Actor830: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 78,89 + Actor831: n3 + Owner: GDI + Location: 100,64 + SubCell: 3 + Facing: 674 + Actor832: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 97,72 + Actor833: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 114,75 + Actor834: n3 + Owner: GDI + SubCell: 3 + Location: 60,69 + Facing: 586 + Actor835: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 69,77 + Actor836: n3 + Owner: GDI + SubCell: 3 + Location: 14,83 + Facing: 793 + Actor837: n3 + Owner: GDI + SubCell: 3 + Location: 66,37 + Facing: 285 + Actor838: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 62,56 + Actor839: n3 + Owner: GDI + SubCell: 3 + Location: 72,50 + Facing: 384 + Actor840: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 97,34 + Actor841: n3 + Owner: GDI + SubCell: 3 + Location: 126,34 + Facing: 911 + Actor842: ztrp + Owner: GDI + SubCell: 3 + Location: 91,36 + Facing: 285 + Actor843: ztrp + Owner: GDI + SubCell: 3 + Location: 91,40 + Facing: 229 + Actor844: ztrp + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 123,32 + Actor845: ztrp + Owner: GDI + Location: 120,70 + SubCell: 3 + Facing: 483 + Actor846: ztrp + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 113,68 + Actor847: ztrp + Owner: GDI + SubCell: 3 + Location: 116,58 + Facing: 15 + Actor848: ztrp + Owner: GDI + SubCell: 3 + Location: 104,67 + Facing: 674 + Actor849: htnk + Owner: GDI + Location: 94,69 + Facing: 253 + Actor850: htnk + Owner: GDI + Location: 102,75 + Facing: 761 + Actor851: htnk + Owner: GDI + Location: 91,38 + Facing: 245 + Actor852: htnk + Owner: GDI + Location: 48,60 + Facing: 911 + Actor853: htnk + Owner: GDI + Location: 89,50 + Facing: 128 + Actor854: msam + Owner: GDI + Facing: 384 + Location: 97,75 + Actor855: msam + Owner: GDI + Facing: 384 + Location: 66,54 + Actor856: msam + Owner: GDI + Facing: 384 + Location: 95,42 + Actor857: msam + Owner: GDI + Location: 107,58 + Facing: 95 + Actor858: vulc.ai + Owner: GDI + Facing: 384 + Location: 104,62 + Actor859: vulc.ai + Owner: GDI + Location: 108,66 + Facing: 103 + Actor860: vulc.ai + Owner: GDI + Facing: 384 + Location: 124,72 + Actor861: vulc.ai + Owner: GDI + Location: 124,58 + Facing: 134 + Actor862: apc2.gdiai + Owner: GDI + Facing: 384 + Location: 70,77 + Actor863: mtnk + Owner: GDI + Location: 56,78 + Facing: 253 + Actor864: mtnk + Owner: GDI + Location: 58,78 + Facing: 253 + Actor865: hmmv + Owner: GDI + Facing: 384 + Location: 65,36 + Actor866: hmmv + Owner: GDI + Location: 15,83 + Facing: 761 + Actor867: hmmv + Owner: GDI + Location: 57,80 + Facing: 261 + Actor868: mtnk + Owner: GDI + Facing: 384 + Location: 117,18 + Actor869: mtnk + Owner: GDI + Facing: 384 + Location: 114,17 + Actor870: mtnk + Owner: GDI + Location: 121,28 + Facing: 111 + Actor871: t13 + Owner: Neutral + Location: 52,41 + Actor872: t13 + Owner: Neutral + Location: 54,84 + Actor873: t13 + Owner: Neutral + Location: 77,64 + Actor874: t13 + Owner: Neutral + Location: 73,45 + Actor875: t13 + Owner: Neutral + Location: 100,40 + Actor876: t13 + Owner: Neutral + Location: 124,18 + Actor877: t13 + Owner: Neutral + Location: 85,85 + Actor878: t10 + Owner: Neutral + Location: 93,60 + Actor879: t10 + Owner: Neutral + Location: 102,36 + Actor880: t10 + Owner: Neutral + Location: 67,33 + Actor881: t10 + Owner: Neutral + Location: 42,34 + Actor882: t10 + Owner: Neutral + Location: 43,50 + Actor883: t10 + Owner: Neutral + Location: 45,75 + Actor884: t10 + Owner: Neutral + Location: 17,64 + Actor885: t10 + Owner: Neutral + Location: 6,66 + Actor887: t16 + Owner: Neutral + Location: 100,29 + Actor888: t16 + Owner: Neutral + Location: 123,45 + Actor889: t16 + Owner: Neutral + Location: 64,30 + Actor890: t16 + Owner: Neutral + Location: 71,54 + Actor892: t16 + Owner: Neutral + Location: 75,78 + Actor893: t16 + Owner: Neutral + Location: 47,82 + Actor894: t16 + Owner: Neutral + Location: 35,65 + Actor895: t16 + Owner: Neutral + Location: 24,70 + Actor896: t16 + Owner: Neutral + Location: 5,40 + Actor897: t16 + Owner: Neutral + Location: 51,44 + Actor898: t16 + Owner: Neutral + Location: 86,94 + Actor899: t16 + Owner: Neutral + Location: 95,59 + Actor900: t01 + Owner: Neutral + Location: 116,40 + Actor901: t01 + Owner: Neutral + Location: 104,38 + Actor902: t01 + Owner: Neutral + Location: 102,24 + Actor903: t01 + Owner: Neutral + Location: 56,31 + Actor904: t01 + Owner: Neutral + Location: 49,39 + Actor905: t01 + Owner: Neutral + Location: 49,65 + Actor906: t01 + Owner: Neutral + Location: 79,74 + Actor907: t01 + Owner: Neutral + Location: 84,90 + Actor908: t01 + Owner: Neutral + Location: 37,75 + Actor910: t01 + Owner: Neutral + Location: 14,65 + Actor911: t01 + Owner: Neutral + Location: 11,38 + Actor912: t01 + Owner: Neutral + Location: 4,27 + Actor913: t01 + Owner: Neutral + Location: 46,57 + Actor916: t02 + Owner: Neutral + Location: 36,52 + Actor917: t02 + Owner: Neutral + Location: 10,31 + Actor918: t02 + Owner: Neutral + Location: 56,35 + Actor919: t02 + Owner: Neutral + Location: 80,44 + Actor920: t02 + Owner: Neutral + Location: 76,59 + Actor921: t02 + Owner: Neutral + Location: 86,71 + Actor922: t02 + Owner: Neutral + Location: 85,89 + Actor923: t02 + Owner: Neutral + Location: 74,83 + Actor924: t02 + Owner: Neutral + Location: 44,77 + Actor925: t02 + Owner: Neutral + Location: 40,59 + Actor928: t02 + Owner: Neutral + Location: 104,26 + Actor929: t02 + Owner: Neutral + Location: 125,7 + Actor930: t02 + Owner: Neutral + Location: 85,27 + Actor931: t03 + Owner: Neutral + Location: 91,29 + Actor932: t03 + Owner: Neutral + Location: 116,27 + Actor933: t03 + Owner: Neutral + Location: 115,48 + Actor934: t03 + Owner: Neutral + Location: 88,56 + Actor935: t03 + Owner: Neutral + Location: 87,91 + Actor936: t03 + Owner: Neutral + Location: 52,82 + Actor937: t03 + Owner: Neutral + Location: 22,71 + Actor938: t03 + Owner: Neutral + Location: 17,35 + Actor939: t03 + Owner: Neutral + Location: 37,39 + Actor940: t05 + Owner: Neutral + Location: 38,48 + Actor941: t05 + Owner: Neutral + Location: 63,45 + Actor942: t05 + Owner: Neutral + Location: 79,52 + Actor943: t05 + Owner: Neutral + Location: 108,47 + Actor944: t05 + Owner: Neutral + Location: 127,18 + Actor945: t05 + Owner: Neutral + Location: 87,70 + Actor946: t05 + Owner: Neutral + Location: 73,76 + Actor947: t05 + Owner: Neutral + Location: 72,64 + Actor948: t05 + Owner: Neutral + Location: 54,61 + Actor949: t05 + Owner: Neutral + Location: 43,76 + Actor950: t06 + Owner: Neutral + Location: 63,81 + Actor951: t06 + Owner: Neutral + Location: 51,71 + Actor952: t06 + Owner: Neutral + Location: 49,80 + Actor953: t06 + Owner: Neutral + Location: 49,47 + Actor954: t06 + Owner: Neutral + Location: 59,42 + Actor955: t06 + Owner: Neutral + Location: 74,43 + Actor956: t06 + Owner: Neutral + Location: 110,28 + Actor957: t06 + Owner: Neutral + Location: 101,39 + Actor958: t06 + Owner: Neutral + Location: 124,48 + Actor959: t06 + Owner: Neutral + Location: 106,53 + Actor960: t06 + Owner: Neutral + Location: 94,51 + Actor961: t06 + Owner: Neutral + Location: 91,91 + Actor962: t06 + Owner: Neutral + Location: 97,95 + Actor965: tc01 + Owner: Neutral + Location: 36,64 + Actor966: tc01 + Owner: Neutral + Location: 45,43 + Actor967: tc01 + Owner: Neutral + Location: 78,60 + Actor968: tc01 + Owner: Neutral + Location: 83,79 + Actor969: tc01 + Owner: Neutral + Location: 104,20 + Actor970: tc01 + Owner: Neutral + Location: 88,25 + Actor971: tc02 + Owner: Neutral + Location: 101,17 + Actor972: tc02 + Owner: Neutral + Location: 125,10 + Actor973: tc02 + Owner: Neutral + Location: 125,53 + Actor974: tc02 + Owner: Neutral + Location: 94,45 + Actor975: tc02 + Owner: Neutral + Location: 86,53 + Actor976: tc02 + Owner: Neutral + Location: 54,63 + Actor977: tc02 + Owner: Neutral + Location: 31,73 + Actor978: tc02 + Owner: Neutral + Location: 7,29 + Actor979: tc04 + Owner: Neutral + Location: 6,39 + Actor980: tc04 + Owner: Neutral + Location: 123,22 + Actor982: tc04 + Owner: Neutral + Location: 4,61 + Actor983: tc05 + Owner: Neutral + Location: 93,25 + Actor984: tc05 + Owner: Neutral + Location: 65,16 + Actor985: tc05 + Owner: Neutral + Location: 43,80 + Actor987: tc05 + Owner: Neutral + Location: 2,32 + Actor988: v06 + Owner: Neutral + Location: 4,37 + Actor989: asianhut + Owner: Neutral + Location: 71,38 + Actor990: v18 + Owner: Neutral + Location: 7,36 + Actor991: v18 + Owner: Neutral + Location: 9,36 + Actor992: v18 + Owner: Neutral + Location: 8,35 + Actor993: v18 + Owner: Neutral + Location: 9,35 + Actor994: wood + Owner: Neutral + Location: 7,34 + Actor995: wood + Owner: Neutral + Location: 8,34 + Actor996: wood + Owner: Neutral + Location: 9,34 + Actor997: wood + Owner: Neutral + Location: 10,34 + Actor998: wood + Owner: Neutral + Location: 11,34 + Actor999: wood + Owner: Neutral + Location: 10,35 + Actor1000: wood + Owner: Neutral + Location: 10,36 + Actor1001: wood + Owner: Neutral + Location: 12,34 + Actor1002: wood + Owner: Neutral + Location: 3,37 + Actor1003: wood + Owner: Neutral + Location: 3,36 + Actor1004: wood + Owner: Neutral + Location: 4,38 + Actor1005: wood + Owner: Neutral + Location: 3,38 + Actor1006: rice + Owner: Neutral + Location: 4,36 + Actor1007: rice + Owner: Neutral + Location: 11,35 + Actor1008: brl3 + Owner: Neutral + Location: 10,33 + Actor1009: ice01 + Owner: Neutral + Location: 72,60 + Actor1011: e1 + Owner: USSR + SubCell: 3 + Location: 9,8 + Facing: 768 + Actor1012: e1 + Owner: USSR + SubCell: 3 + Facing: 768 + Location: 12,8 + Actor1013: e1 + Owner: USSR + Location: 9,8 + SubCell: 1 + Facing: 768 + Actor1014: e1 + Owner: USSR + SubCell: 3 + Location: 9,12 + Facing: 768 + Actor1015: e1 + Owner: USSR + SubCell: 3 + Location: 4,7 + Facing: 768 + Actor1017: n3 + Owner: USSR + Location: 7,7 + SubCell: 2 + Facing: 768 + Actor1010: e1 + Owner: USSR + SubCell: 3 + Facing: 768 + Location: 7,7 + Actor1016: e3 + Owner: USSR + SubCell: 3 + Location: 4,10 + Facing: 768 + Actor1018: medi + Owner: GDI + Facing: 384 + Location: 99,67 + SubCell: 1 + Actor1019: medi + Owner: GDI + Facing: 384 + SubCell: 1 + Location: 71,81 + Actor1020: medi + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 61,68 + Actor1021: n1 + Owner: GDI + SubCell: 3 + Location: 95,61 + Facing: 261 + Actor1022: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 88,55 + Actor1023: n1 + Owner: GDI + SubCell: 3 + Location: 98,50 + Facing: 384 + Actor1024: n1 + Owner: GDI + SubCell: 3 + Location: 89,54 + Facing: 785 + Actor1025: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 90,47 + Actor1026: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 85,49 + Actor1027: n1 + Owner: GDI + SubCell: 3 + Location: 50,62 + Facing: 166 + Actor1028: n1 + Owner: GDI + SubCell: 3 + Location: 47,62 + Facing: 0 + Actor1032: e1 + Owner: USSR + SubCell: 3 + Facing: 768 + Location: 3,10 + Actor1033: e1 + Owner: USSR + SubCell: 1 + Facing: 768 + Location: 3,10 + Actor1034: e1 + Owner: USSR + SubCell: 3 + Facing: 768 + Location: 14,9 + Actor1035: e1 + Owner: USSR + SubCell: 1 + Facing: 768 + Location: 14,9 + Actor1036: e1 + Owner: USSR + SubCell: 3 + Facing: 768 + Location: 15,9 + McvSpawn: waypoint + Owner: Neutral + Location: 1,9 + McvRally: waypoint + Owner: Neutral + Location: 8,9 + GDIOutpostFlare: waypoint + Owner: Neutral + Location: 25,43 + Actor1037: e1 + Owner: China + SubCell: 3 + Facing: 0 + Location: 21,15 + Actor1038: e1 + Owner: China + SubCell: 3 + Facing: 0 + Location: 27,15 + Actor1047: barb + Location: 46,5 + Owner: ChinaWalls + Actor1048: sam + Owner: China + Location: 47,5 + Actor1049: pbox + Owner: China + Location: 50,5 + Actor1055: e1 + Owner: China + Facing: 384 + SubCell: 3 + Location: 51,6 + Actor1066: pbox + Owner: China + Location: 54,5 + Actor1067: sam + Owner: China + Location: 57,5 + Actor1069: e1 + Owner: China + Facing: 384 + SubCell: 3 + Location: 53,6 + Actor1076: e4 + Owner: China + Facing: 384 + SubCell: 3 + Location: 56,7 + Actor1080: apwr + Owner: China + Location: 56,1 + Actor1081: apwr + Owner: China + Location: 59,1 + Actor1082: apwr + Owner: China + Location: 62,1 + Actor1083: powr + Owner: China + Location: 47,1 + Actor1084: n1 + Owner: GDI + SubCell: 3 + Facing: 0 + Location: 47,57 + Actor1085: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 56,50 + Actor1086: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 59,48 + Actor1087: t02 + Owner: Neutral + Location: 65,63 + Actor1088: t01 + Owner: Neutral + Location: 69,61 + Actor1089: t16 + Owner: Neutral + Location: 62,62 + Path3_1: waypoint + Owner: Neutral + Location: 112,37 + Path1_1: waypoint + Owner: Neutral + Location: 87,77 + Path2_1: waypoint + Owner: Neutral + Location: 94,54 + Path1_2: waypoint + Owner: Neutral + Location: 45,72 + Path2_2: waypoint + Owner: Neutral + Location: 77,40 + Path3_2: waypoint + Owner: Neutral + Location: 58,39 + Actor1090: camera + Owner: GDI + Location: 25,62 + Actor1091: camera + Owner: GDI + Location: 65,38 + Actor1092: camera + Owner: GDI + Location: 39,42 + Actor1093: camera + Owner: GDI + Location: 54,57 + Actor1094: camera + Owner: GDI + Location: 42,72 + Actor1095: chain + Owner: ChinaWalls + Location: 20,19 + Actor1096: chain + Owner: ChinaWalls + Location: 19,19 + Actor1097: chain + Owner: ChinaWalls + Location: 18,19 + Actor1098: chain + Owner: ChinaWalls + Location: 17,19 + Actor1099: chain + Owner: ChinaWalls + Location: 17,20 + Actor1100: chain + Owner: ChinaWalls + Location: 17,21 + Actor1101: chain + Owner: ChinaWalls + Location: 17,22 + Actor1102: chain + Owner: ChinaWalls + Location: 17,23 + Actor1103: chain + Owner: ChinaWalls + Location: 17,24 + Actor1104: chain + Owner: ChinaWalls + Location: 17,25 + Actor1105: chain + Owner: ChinaWalls + Location: 17,26 + Actor1106: chain + Owner: ChinaWalls + Location: 17,27 + Actor1107: chain + Owner: ChinaWalls + Location: 18,27 + Actor1108: chain + Owner: ChinaWalls + Location: 19,27 + Actor1109: chain + Owner: ChinaWalls + Location: 20,27 + Actor1110: chain + Owner: ChinaWalls + Location: 21,27 + Actor1111: chain + Owner: ChinaWalls + Location: 22,27 + Actor1112: chain + Owner: ChinaWalls + Location: 23,27 + Actor1113: chain + Owner: ChinaWalls + Location: 24,27 + Actor1114: chain + Owner: ChinaWalls + Location: 25,27 + Actor1115: chain + Owner: ChinaWalls + Location: 27,27 + Actor1116: chain + Owner: ChinaWalls + Location: 28,27 + Actor1117: chain + Owner: ChinaWalls + Location: 29,27 + Actor1118: chain + Owner: ChinaWalls + Location: 30,27 + Actor1122: chain + Owner: ChinaWalls + Location: 28,19 + Actor1123: chain + Owner: ChinaWalls + Location: 27,19 + Actor1124: chain + Owner: ChinaWalls + Location: 29,19 + Actor1125: chain + Owner: ChinaWalls + Location: 30,19 + Actor1126: chain + Owner: ChinaWalls + Location: 31,19 + Actor1127: chain + Owner: ChinaWalls + Location: 31,20 + Actor1128: chain + Owner: ChinaWalls + Location: 31,21 + Actor1129: chain + Owner: ChinaWalls + Location: 31,22 + Actor1130: chain + Owner: ChinaWalls + Location: 31,23 + Actor1131: chain + Owner: ChinaWalls + Location: 31,24 + Actor1121: chain + Owner: ChinaWalls + Location: 31,25 + Actor1120: chain + Owner: ChinaWalls + Location: 31,26 + Actor1119: chain + Owner: ChinaWalls + Location: 31,27 + Actor1132: chain + Owner: ChinaWalls + Location: 46,18 + Actor1133: chain + Owner: ChinaWalls + Location: 45,18 + Actor1134: chain + Owner: ChinaWalls + Location: 45,19 + Actor1135: chain + Owner: ChinaWalls + Location: 45,20 + Actor1136: chain + Owner: ChinaWalls + Location: 45,21 + Actor1137: chain + Owner: ChinaWalls + Location: 45,22 + Actor1138: chain + Owner: ChinaWalls + Location: 45,23 + Actor1139: chain + Owner: ChinaWalls + Location: 44,23 + Actor1140: chain + Owner: ChinaWalls + Location: 44,24 + Actor1141: chain + Owner: ChinaWalls + Location: 44,25 + Actor1142: chain + Owner: ChinaWalls + Location: 44,26 + Actor1143: chain + Owner: ChinaWalls + Location: 43,26 + Actor1144: chain + Owner: ChinaWalls + Location: 43,27 + Actor1145: chain + Owner: ChinaWalls + Location: 43,28 + Actor1146: chain + Owner: ChinaWalls + Location: 44,28 + Actor1147: chain + Owner: ChinaWalls + Location: 45,28 + Actor1148: chain + Owner: ChinaWalls + Location: 46,28 + Actor1149: chain + Owner: ChinaWalls + Location: 52,28 + Actor1150: chain + Owner: ChinaWalls + Location: 53,28 + Actor1151: chain + Owner: ChinaWalls + Location: 54,28 + Actor1152: chain + Owner: ChinaWalls + Location: 55,28 + Actor1153: chain + Owner: ChinaWalls + Location: 56,28 + Actor1154: chain + Owner: ChinaWalls + Location: 56,27 + Actor1155: chain + Owner: ChinaWalls + Location: 56,26 + Actor1156: chain + Owner: ChinaWalls + Location: 55,26 + Actor1157: chain + Owner: ChinaWalls + Location: 55,25 + Actor1158: chain + Owner: ChinaWalls + Location: 55,24 + Actor1159: chain + Owner: ChinaWalls + Location: 55,23 + Actor1160: chain + Owner: ChinaWalls + Location: 55,22 + Actor1161: chain + Owner: ChinaWalls + Location: 56,22 + Actor1162: chain + Owner: ChinaWalls + Location: 56,21 + Actor1163: chain + Owner: ChinaWalls + Location: 56,20 + Actor1164: chain + Owner: ChinaWalls + Location: 56,19 + Actor1165: chain + Owner: ChinaWalls + Location: 56,18 + Actor1166: chain + Owner: ChinaWalls + Location: 55,18 + Actor1167: chain + Owner: ChinaWalls + Location: 54,18 + Actor1168: chain + Owner: ChinaWalls + Location: 53,18 + Actor1169: chain + Owner: ChinaWalls + Location: 52,18 + Actor1170: brik + Owner: ChinaWalls + Location: 46,1 + Actor1029: brik + Owner: ChinaWalls + Location: 46,2 + Actor1039: brik + Owner: ChinaWalls + Location: 46,3 + Actor1042: brik + Owner: ChinaWalls + Location: 46,4 + Actor1043: brik + Owner: ChinaWalls + Location: 47,4 + Actor1044: brik + Owner: ChinaWalls + Location: 48,4 + Actor1045: brik + Owner: ChinaWalls + Location: 49,4 + Actor1046: brik + Owner: ChinaWalls + Location: 50,4 + Actor1041: brik + Owner: ChinaWalls + Location: 50,3 + Actor1040: brik + Owner: ChinaWalls + Location: 49,3 + Actor1030: brik + Owner: ChinaWalls + Location: 54,3 + Actor1031: brik + Owner: ChinaWalls + Location: 55,3 + Actor1057: brik + Owner: ChinaWalls + Location: 55,4 + Actor1056: brik + Owner: ChinaWalls + Location: 54,4 + Actor1058: brik + Owner: ChinaWalls + Location: 56,4 + Actor1059: brik + Owner: ChinaWalls + Location: 57,4 + Actor1060: brik + Owner: ChinaWalls + Location: 58,4 + Actor1061: brik + Owner: ChinaWalls + Location: 59,4 + Actor1062: brik + Owner: ChinaWalls + Location: 60,4 + Actor1063: brik + Owner: ChinaWalls + Location: 61,4 + Actor1064: brik + Owner: ChinaWalls + Location: 62,4 + Actor1065: brik + Owner: ChinaWalls + Location: 63,4 + Actor1077: brik + Owner: ChinaWalls + Location: 64,4 + Actor1078: brik + Owner: ChinaWalls + Location: 65,4 + Actor1079: brik + Owner: ChinaWalls + Location: 65,3 + Actor1171: brik + Owner: ChinaWalls + Location: 65,2 + Actor1172: brik + Owner: ChinaWalls + Location: 65,1 + Actor1173: brik + Owner: ChinaWalls + Location: 65,0 + Actor1051: barb + Owner: ChinaWalls + Location: 47,6 + Actor1050: barb + Owner: ChinaWalls + Location: 46,6 + Actor1052: barb + Owner: ChinaWalls + Location: 48,6 + Actor1053: barb + Owner: ChinaWalls + Location: 49,6 + Actor1054: barb + Owner: ChinaWalls + Location: 50,6 + Actor1070: barb + Owner: ChinaWalls + Location: 54,6 + Actor1071: barb + Owner: ChinaWalls + Location: 55,6 + Actor1072: barb + Owner: ChinaWalls + Location: 56,6 + Actor1073: barb + Owner: ChinaWalls + Location: 57,6 + Actor1074: barb + Owner: ChinaWalls + Location: 58,6 + Actor1075: barb + Owner: ChinaWalls + Location: 59,6 + Actor1068: barb + Owner: ChinaWalls + Location: 59,5 + Actor1174: e1 + Owner: China + SubCell: 3 + Facing: 555 + Location: 45,25 + Actor1177: 3tnk + Owner: China + Facing: 512 + Location: 46,24 + Actor1178: 3tnk + Owner: China + Location: 52,24 + Facing: 512 + Actor1175: thwk + Owner: GDI + Location: 114,66 + Facing: 0 + Actor1176: thwk + Owner: GDI + Location: 113,70 + Facing: 256 + Actor1179: camera + Owner: GDI + Location: 105,48 + Actor1180: camera + Owner: GDI + Location: 91,57 + Actor1181: camera + Owner: GDI + Location: 88,77 + Actor1182: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 58,80 + Actor1183: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 58,81 + Actor1184: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 56,79 + WeaponsCache: waypoint + Owner: Neutral + Location: 24,22 + Actor1185: htnk.ion + Owner: GDI + Location: 82,75 + Facing: 261 + Actor1186: htnk.ion + Owner: GDI + Location: 83,77 + Facing: 245 + Actor1187: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 83,73 + Actor1188: n1 + Owner: GDI + Facing: 384 + Location: 82,73 + SubCell: 3 + Actor1189: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 80,73 + Actor1190: n1 + Owner: GDI + Location: 81,74 + SubCell: 3 + Facing: 384 + Actor1191: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 81,76 + Actor1192: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 83,78 + Actor1193: n1 + Owner: GDI + Location: 82,79 + SubCell: 3 + Facing: 190 + Actor1194: n1 + Owner: GDI + SubCell: 3 + Location: 84,78 + Facing: 277 + Actor1195: n1 + Owner: GDI + Location: 83,79 + SubCell: 3 + Facing: 277 + Actor1196: n1 + Owner: GDI + Location: 83,79 + SubCell: 1 + Facing: 384 + Actor1197: n1 + Owner: GDI + Facing: 384 + Location: 84,78 + SubCell: 1 + Actor1198: n1 + Owner: GDI + SubCell: 3 + Location: 83,76 + Facing: 384 + Actor1199: n1 + Owner: GDI + Facing: 384 + Location: 81,74 + SubCell: 1 + Actor1200: n3 + Owner: GDI + SubCell: 3 + Location: 82,74 + Facing: 384 + Actor1201: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 85,76 + Actor1202: n3 + Owner: GDI + Facing: 384 + Location: 85,78 + SubCell: 3 + Actor1203: n3 + Owner: GDI + Location: 84,81 + SubCell: 3 + Facing: 261 + Actor1204: n3 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 127,57 + Actor1205: n3 + Owner: GDI + Facing: 384 + Location: 96,34 + SubCell: 3 + Actor1206: n1 + Owner: GDI + Facing: 384 + Location: 95,35 + SubCell: 3 + Actor1207: n1 + Owner: GDI + Facing: 384 + Location: 95,35 + SubCell: 1 + Actor1208: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 97,37 + Actor1209: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 97,39 + Actor1210: n1 + Owner: GDI + Facing: 384 + Location: 97,39 + SubCell: 1 + Actor1211: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 97,41 + Actor1212: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 95,41 + Actor1213: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 97,42 + Actor1214: wolv + Owner: GDI + Facing: 384 + Location: 102,51 + Actor1215: wolv + Owner: GDI + Location: 101,50 + Facing: 256 + Actor1216: wolv + Owner: GDI + Location: 102,48 + Facing: 256 + Actor1217: vulc.ai + Owner: GDI + Location: 102,49 + TurretFacing: 0 + Facing: 256 + Actor1218: vulc.ai + Owner: GDI + Location: 104,50 + Facing: 256 + Actor1219: mtnk + Owner: GDI + Location: 113,46 + Facing: 0 + Actor1220: mtnk + Owner: GDI + Location: 113,44 + Facing: 0 + Actor1221: mtnk + Owner: GDI + Location: 113,42 + Facing: 0 + Actor1222: n1r1 + Owner: GDI + SubCell: 3 + Facing: 0 + Location: 115,44 + Actor1223: n1r1 + Owner: GDI + SubCell: 3 + Facing: 0 + Location: 111,42 + Actor1224: n1r1 + Owner: GDI + SubCell: 3 + Facing: 0 + Location: 111,44 + Actor1225: n1r1 + Owner: GDI + SubCell: 3 + Facing: 0 + Location: 112,43 + Actor1226: n1r1 + Owner: GDI + SubCell: 3 + Facing: 0 + Location: 116,43 + Actor1227: n1r1 + Owner: GDI + SubCell: 3 + Facing: 0 + Location: 115,41 + Actor1228: n1r1 + Owner: GDI + SubCell: 3 + Facing: 0 + Location: 114,42 + Actor1229: mdrn + Owner: GDI + SubCell: 3 + Location: 110,43 + Facing: 31 + Actor1230: mdrn + Owner: GDI + SubCell: 3 + Location: 115,39 + Facing: 0 + Actor1231: hmmv.tow + Owner: GDI + Facing: 384 + Location: 69,35 + Actor1232: hmmv.tow + Owner: GDI + Facing: 384 + Location: 66,33 + ChinaHostileSpawn: waypoint + Owner: Neutral + Location: 52,1 + ChinaHostileRally1: waypoint + Owner: Neutral + Location: 52,12 + ChinaHostileRally2: waypoint + Owner: Neutral + Location: 49,12 + ChinaHostileRally3: waypoint + Owner: Neutral + Location: 49,23 + DisruptorDropSpawn: waypoint + Owner: Neutral + Location: 128,89 + DisruptorDropRally: waypoint + Owner: Neutral + Location: 35,89 + DisruptorDropDest1: waypoint + Owner: Neutral + Location: 8,63 + DisruptorDropDest2: waypoint + Owner: Neutral + Location: 6,65 + DisruptorDropDest3: waypoint + Owner: Neutral + Location: 9,66 + DisruptorDropDest4: waypoint + Owner: Neutral + Location: 11,64 + DisruptorDropExit: waypoint + Owner: Neutral + Location: 41,96 + CarrierPatrol1: waypoint + Owner: Neutral + Location: 41,94 + CarrierPatrol2: waypoint + Owner: Neutral + Location: 3,94 + Actor813: n1 + Owner: GDI + SubCell: 3 + Location: 14,79 + Facing: 896 + CarrierPatrol3: waypoint + Owner: Neutral + Location: 3,73 + Carrier2: cv + Owner: GDI + Location: 58,94 + Facing: 256 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, procurement-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/main-campaign/ca38-procurement/procurement-rules.yaml b/mods/ca/missions/main-campaign/ca38-procurement/procurement-rules.yaml new file mode 100644 index 0000000000..6fedcbbb62 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca38-procurement/procurement-rules.yaml @@ -0,0 +1,46 @@ + +^Palettes: + PaletteFromFile@terrain-temperat: + Filename: ca|missions/main-campaign/ca38-procurement/lush.pal + TintPostProcessEffect: + Red: 1 + Green: 1 + Blue: 0.95 + Ambient: 1 + +World: + LuaScript: + Scripts: campaign.lua, procurement.lua + MissionData: + Briefing: With our rivals defeated, we must now begin rebuilding our forces. Our production capacity was crippled by the Scrin so we must look elsewhere for equipment to meet our immediate needs.\n\nThe Chinese have long persisted in their selfish prioritization of their own economic interests, refusing to aid us militarily, however their quiet yet rapid military buildup has caught the eye of GDI who, under the guise of "safeguarding regional stability", have established a large military presence a short distance from the Chinese border.\n\nThis has predictably outraged the Chinese leadership, so we have made an arrangement with them in secret.\n\nYou must take a small force to a depot containing Chinese vehicles near the border. Take these vehicles across the border and destroy the nearest GDI outpost. We can then send in additional forces to establish our own base and eliminate the remaining GDI presence.\n\nThus, GDI will be removed without the Chinese having to involve themselves directly, and the Chinese will get a live test of their new weapons against a peer adversary. In return they have agreed to sell their weapons to us, which will allow us to return to full strength at a greatly accelerated rate. + MapOptions: + ShortGameCheckboxEnabled: False + MusicPlaylist: + StartingMusic: blowitup + +Player: + PlayerResources: + DefaultCash: 6000 + +TRPC.Empty: + Inherits: TRPC + -Buildable: + RenderSprites: + Image: trpc + Selectable: + Class: trpc + Cargo: + -InitialUnits: + +OCAR.DISR: + Inherits: OCAR + -Buildable: + Aircraft: + InitialFacing: 768 + Carryall: + InitialActor: disr + +eye.zocom.dummy: + Inherits@DUMMY: ^InvisibleDummy + ProvidesPrerequisite: + Prerequisite: eye.zocom diff --git a/mods/ca/missions/main-campaign/ca38-procurement/procurement.lua b/mods/ca/missions/main-campaign/ca38-procurement/procurement.lua new file mode 100644 index 0000000000..a14c70f5e6 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca38-procurement/procurement.lua @@ -0,0 +1,393 @@ +MissionDir = "ca|missions/main-campaign/ca38-procurement" + +OutpostStructures = { OutpostConyard, OutpostFactory, OutpostBarracks, OutpostRefinery, OutpostPower1, OutpostPower2, OutpostPower3, OutpostSilo1, OutpostSilo2, OutpostGuardTower1, OutpostGuardTower2, OutpostGuardTower3, OutpostGuardTower4 } + +CommsCenters = { CommsCenter1, CommsCenter2, AdvancedComms } + +SuperweaponsEnabledTime = { + easy = DateTime.Seconds((60 * 45) + 17), + normal = DateTime.Seconds((60 * 30) + 17), + hard = DateTime.Seconds((60 * 16) + 17), + vhard = DateTime.Seconds((60 * 15) + 17), + brutal = DateTime.Seconds((60 * 14) + 17) +} + +AdjustedGDICompositions = AdjustCompositionsForDifficulty(UnitCompositions.GDI) + +Squads = { + GDIMain1 = { + InitTimeAdjustment = -DateTime.Minutes(1), + Delay = AdjustDelayForDifficulty(DateTime.Minutes(3)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 20, Max = 40 }), + FollowLeader = true, + Compositions = AdjustedGDICompositions, + AttackPaths = { + { Path1_1.Location, Path1_2.Location }, + { Path2_1.Location, Path2_2.Location }, + { Path3_1.Location, Path3_2.Location }, + }, + }, + GDIMain2 = { + Delay = AdjustDelayForDifficulty(DateTime.Minutes(4)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 20, Max = 40 }), + FollowLeader = true, + Compositions = AdjustedGDICompositions, + AttackPaths = { + { Path1_1.Location, Path1_2.Location }, + { Path2_1.Location, Path2_2.Location }, + { Path3_1.Location, Path3_2.Location }, + }, + }, + GDIAir = { + Delay = AdjustAirDelayForDifficulty(DateTime.Minutes(13)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 12, Max = 12 }), + Compositions = AirCompositions.GDI, + }, + AntiHeavyAir = AntiHeavyAirSquad({ "orcb" }, AdjustAirDelayForDifficulty(DateTime.Minutes(10))), + AirToAir = AirToAirSquad({ "orca" }, AdjustAirDelayForDifficulty(DateTime.Minutes(10))), +} + +SetupPlayers = function() + USSR = Player.GetPlayer("USSR") + GDI = Player.GetPlayer("GDI") + China = Player.GetPlayer("China") + ChinaHostile = Player.GetPlayer("ChinaHostile") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = { USSR } + MissionEnemies = { GDI } +end + +WorldLoaded = function() + SetupPlayers() + + TimerTicks = 0 + Camera.Position = McvRally.CenterPosition + + InitObjectives(USSR) + AdjustPlayerStartingCashForDifficulty() + InitGDI() + InitChina() + + ObjectiveAcquireWeapons = USSR.AddObjective("Acquire Chinese weapons.") + ObjectiveExpelGDI = USSR.AddObjective("Remove the GDI presence.") + ObjectiveDestroyOutpost = USSR.AddSecondaryObjective("Destroy GDI outpost to receive reinforcements.") + + if IsHardOrAbove() then + NonHardTroopCrawler.Destroy() + NonHardOverlord.Destroy() + NonHardNukeCannon.Destroy() + end + + Trigger.OnEnteredProximityTrigger(WeaponsCache.CenterPosition, WDist.New(4 * 1024), function(a, id) + if IsMissionPlayer(a.Owner) then + Trigger.RemoveProximityTrigger(id) + InitWeaponsCache(true) + end + end) + + Trigger.AfterDelay(DateTime.Minutes(10), function() + InitWeaponsCache(false) + end) + + Trigger.OnAllKilledOrCaptured(OutpostStructures, function() + if not McvRequested then + McvRequested = true + Trigger.AfterDelay(DateTime.Seconds(5), function() + PlaySpeechNotificationToMissionPlayers("ReinforcementsArrived") + Notification("Reinforcements have arrived.") + DoMcvArrival() + Beacon.New(USSR, McvRally.CenterPosition) + McvArrived = true + USSR.MarkCompletedObjective(ObjectiveDestroyOutpost) + end) + + InitGDIAttacks() + end + end) + + Trigger.AfterDelay(DateTime.Minutes(15), function() + InitCommsCenterObjective() + end) + + Utils.Do(CommsCenters, function(c) + Trigger.OnEnteredProximityTrigger(c.CenterPosition, WDist.New(20 * 1024), function(a, id) + if IsMissionPlayer(a.Owner) then + Trigger.RemoveProximityTrigger(id) + InitCommsCenterObjective() + end + end) + end) + + AfterWorldLoaded() +end + +Tick = function() + OncePerSecondChecks() + OncePerFiveSecondChecks() + OncePerThirtySecondChecks() + AfterTick() +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + GDI.Resources = GDI.ResourceCapacity - 500 + + if TimerTicks > 0 then + if TimerTicks > 25 then + TimerTicks = TimerTicks - 25 + else + TimerTicks = 0 + end + end + + if not PlayerHasBuildings(GDI) then + USSR.MarkCompletedObjective(ObjectiveExpelGDI) + end + + if MissionPlayersHaveNoRequiredUnits() then + USSR.MarkFailedObjective(ObjectiveExpelGDI) + + if not USSR.IsObjectiveCompleted(ObjectiveAcquireWeapons) then + USSR.MarkFailedObjective(ObjectiveAcquireWeapons) + end + end + end +end + +OncePerFiveSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 125 == 0 then + UpdatePlayerBaseLocations() + end +end + +OncePerThirtySecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % DateTime.Seconds(30) == 0 then + CalculatePlayerCharacteristics() + end +end + +InitGDI = function() + RebuildExcludes.GDI = { Actors = OutpostStructures, Types = { "hq", "eye" } } + + AutoRepairAndRebuildBuildings(GDI, 15) + SetupRefAndSilosCaptureCredits(GDI) + AutoReplaceHarvesters(GDI) + AutoRebuildConyards(GDI) + InitAiUpgrades(GDI) + + local gdiGroundAttackers = GDI.GetGroundAttackers() + + Utils.Do(gdiGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsGDIGroundHunterUnit) + end) + + Trigger.AfterDelay(SuperweaponsEnabledTime[Difficulty], function() + Actor.Create("ai.superweapons.enabled", true, { Owner = GDI }) + Actor.Create("ai.minor.superweapons.enabled", true, { Owner = GDI }) + end) + + if IsNormalOrAbove() then + Trigger.AfterDelay(DateTime.Minutes(16), function() + DoDisruptorDrop() + end) + + if IsHardOrAbove() then + Trigger.AfterDelay(DateTime.Minutes(13), function() + if not Carrier1.IsDead then + Carrier1.Patrol({ CarrierPatrol1.Location, CarrierPatrol2.Location, CarrierPatrol3.Location, CarrierPatrol2.Location }) + end + if not Carrier2.IsDead then + Carrier2.Patrol({ CarrierPatrol1.Location, CarrierPatrol2.Location, CarrierPatrol3.Location, CarrierPatrol2.Location }) + end + end) + + Utils.Do({ Carrier1, Carrier2 }, function(c) + Trigger.OnKilled(c, function(self, killer) + Trigger.AfterDelay(DateTime.Minutes(3), function() + if not NavalYard.IsDead and NavalYard.Owner == GDI then + NavalYard.Produce("cv") + end + end) + end) + end) + + Trigger.OnProduction(NavalYard, function(producer, produced) + if produced.Type == "cv" and not produced.IsDead then + produced.Patrol({ CarrierPatrol1.Location, CarrierPatrol2.Location, CarrierPatrol3.Location, CarrierPatrol2.Location }) + end + end) + + if Difficulty == "brutal" then + Actor.Create("eye.zocom.dummy", true, { Owner = GDI }) + end + end + end +end + +InitGDIAttacks = function() + if not GDIAttacksStarted then + GDIAttacksStarted = true + InitAttackSquad(Squads.GDIMain1, GDI) + InitAttackSquad(Squads.GDIMain2, GDI) + InitAirAttackSquad(Squads.GDIAir, GDI) + if IsHardOrAbove() then + InitAirAttackSquad(Squads.AntiHeavyAir, GDI, MissionPlayers, { "4tnk", "4tnk.atomic", "apoc", "apoc.atomic", "ovld", "ovld.atomic" }) + InitAirAttackSquad(Squads.AirToAir, GDI, MissionPlayers, { "Aircraft" }, "ArmorType") + end + end +end + +InitWeaponsCache = function(withOutpostFlare) + if not CacheFound then + CacheFound = true + local cacheUnits = China.GetActorsByTypes({"ovld", "trpc.empty", "nukc"}) + Utils.Do(cacheUnits, function(u) + u.Owner = USSR + end) + + USSR.MarkCompletedObjective(ObjectiveAcquireWeapons) + + if withOutpostFlare then + Trigger.AfterDelay(DateTime.Seconds(5), function() + local outpostFlare = Actor.Create("flare", true, { Owner = USSR, Location = GDIOutpostFlare.Location }) + PlaySpeechNotificationToMissionPlayers("SignalFlare") + Notification("Signal flare detected. Press [" .. UtilsCA.Hotkey("ToLastEvent") .. "] to view location.") + Beacon.New(USSR, GDIOutpostFlare.CenterPosition) + + Trigger.OnEnteredProximityTrigger(GDIOutpostFlare.CenterPosition, WDist.New(6 * 1024), function(a, id) + if IsMissionPlayer(a.Owner) and a.Type ~= "flare" then + Trigger.RemoveProximityTrigger(id) + outpostFlare.Destroy() + end + end) + end) + end + end +end + +InitCommsCenterObjective = function() + if ObjectiveCaptureComms ~= nil then + return + end + + Media.DisplayMessage("Comrade General, we have reason to believe vital information can be found within the GDI comms network. Capture one of their Communications Centers at all costs!", "Premier Cherdenko", HSLColor.FromHex("FF0000")) + + ObjectiveCaptureComms = USSR.AddObjective("Capture a GDI Communications Center.") + Media.PlaySound("beacon.aud") + + Utils.Do(CommsCenters, function(c) + local camera = Actor.Create("smallcamera", true, { Owner = USSR, Location = c.Location }) + Beacon.New(USSR, c.CenterPosition) + Trigger.AfterDelay(DateTime.Seconds(10), function() + camera.Destroy() + end) + + Trigger.OnCapture(c, function(self, captor, oldOwner, newOwner) + if ObjectiveCaptureComms ~= nil and not USSR.IsObjectiveCompleted(ObjectiveCaptureComms) then + USSR.MarkCompletedObjective(ObjectiveCaptureComms) + end + end) + end) + + Trigger.OnAllKilled(CommsCenters, function() + if not USSR.IsObjectiveCompleted(ObjectiveCaptureComms) then + USSR.MarkFailedObjective(ObjectiveCaptureComms) + end + end) +end + +InitChina = function() + local chinaUnits = Utils.Where(China.GetActors(), function(a) + return a.HasProperty("Attack") or a.HasProperty("StartBuildingRepairs") + end) + + ChineseUnitsKilled = 0 + + Utils.Do(chinaUnits, function(a) + + Trigger.OnKilled(a, function(self, killer) + if self.Owner == China and IsMissionPlayer(killer.Owner) then + ChineseUnitsKilled = ChineseUnitsKilled + 1 + end + + if ChineseUnitsKilled >= 3 then + InitChinaRevenge() + end + end) + end) +end + +InitChinaRevenge = function() + if ChinaRevengeStarted then + return + end + + ChinaRevengeStarted = true + + Notification("The Chinese are retaliating!") + + local chinaUnits = Utils.Where(China.GetActors(), function(a) + return a.HasProperty("Attack") or a.HasProperty("StartBuildingRepairs") + end) + + Utils.Do(chinaUnits, function(a) + a.Owner = ChinaHostile + + if a.HasProperty("Hunt") then + a.Hunt() + end + end) + + DeployChinese() +end + +DeployChinese = function() + local units = Reinforcements.Reinforce(ChinaHostile, { "ovld", "ovld", "ovld", "ovld", "e1", "e1", "e1", "e1", "e1", "e1", "e1", "e1", "e3", "e3" }, { ChinaHostileSpawn.Location, ChinaHostileRally1.Location, ChinaHostileRally2.Location, ChinaHostileRally3.Location }, 25) + Utils.Do(units, function(unit) + Trigger.AfterDelay(5, function() + AssaultPlayerBaseOrHunt(unit) + end) + end) + Trigger.AfterDelay(DateTime.Seconds(20), DeployChinese) +end + +DoDisruptorDrop = function() + local gdiFactories = GDI.GetActorsByType("weap.td") + if #gdiFactories == 0 then + return + end + + local dropPoints = { DisruptorDropDest1.Location, DisruptorDropDest2.Location } + + if IsVeryHardOrAbove() then + table.insert(dropPoints, DisruptorDropDest3.Location) + table.insert(dropPoints, DisruptorDropDest4.Location) + end + + local delay = 1 + + Utils.Do(dropPoints, function(p) + Trigger.AfterDelay(delay, function() + local entryPath = { DisruptorDropSpawn.Location, DisruptorDropRally.Location, p } + local exitPath = { DisruptorDropExit.Location } + ReinforcementsCA.ReinforceWithTransport(GDI, "ocar.disr", nil, entryPath, exitPath) + end) + delay = delay + DateTime.Seconds(1) + Trigger.OnEnteredFootprint({p}, function(a, id) + if a.Owner == GDI and a.Type == "disr" and not a.IsDead then + Trigger.RemoveFootprintTrigger(id) + AssaultPlayerBaseOrHunt(a) + end + end) + end) + + if Difficulty == "brutal" then + Trigger.AfterDelay(DateTime.Minutes(5), DoDisruptorDrop) + end +end + +-- overridden in co-op version +DoMcvArrival = function() + Reinforcements.Reinforce(USSR, { "mcv" }, { McvSpawn.Location, McvRally.Location }) +end diff --git a/mods/ca/missions/main-campaign/ca39-jailbreak/jailbreak-rules.yaml b/mods/ca/missions/main-campaign/ca39-jailbreak/jailbreak-rules.yaml new file mode 100644 index 0000000000..57e433d845 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca39-jailbreak/jailbreak-rules.yaml @@ -0,0 +1,44 @@ + +^Palettes: + TintPostProcessEffect: + +World: + LuaScript: + Scripts: campaign.lua, jailbreak.lua + MissionData: + Briefing: We can now expect regular shipments of Chinese equipment and ammunition to bolster our forces, but there is much work still to do.\n\nThe fortuitous interception of GDI transmissions and your subsequent capture of their communications center now leads us to a mission of extreme urgency. The data we retrieved included the whereabouts of our lost comrade Yuri. He is being held by the Allies in a high security prison, and we are now gathering what forces we can muster in the area which you must use to rescue him.\n\nIt goes without saying that Yuri's powers will be invaluable to us. Failure is not an option. + MapOptions: + ShortGameCheckboxEnabled: False + MusicPlaylist: + StartingMusic: jank + +Player: + PlayerResources: + DefaultCash: 6000 + +MISS: + Tooltip: + Name: Prison + TooltipDescription: + Description: Prisoners of war are kept here. + ValidRelationships: Ally + Health: + HP: 200000 + Targetable@NoAutoTarget: + TargetTypes: NoAutoTarget + +HTNK.Drone: + GrantCondition@Radar: + Condition: radarenabled + +DOG: + DetectCloaked: + Range: 11c0 + RangedGpsRadarProvider: + Range: 11c0 + WithRangeCircle: + Range: 11c0 + +# Hunt() requires only 1 AttackBase +BATF.AI: + -AttackFrontal: diff --git a/mods/ca/missions/main-campaign/ca39-jailbreak/jailbreak.lua b/mods/ca/missions/main-campaign/ca39-jailbreak/jailbreak.lua new file mode 100644 index 0000000000..7358bb7f31 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca39-jailbreak/jailbreak.lua @@ -0,0 +1,413 @@ +MissionDir = "ca|missions/main-campaign/ca39-jailbreak" + +CruisersEnabledTime = { + easy = DateTime.Minutes(25), + normal = DateTime.Minutes(20), + hard = DateTime.Minutes(15), + vhard = DateTime.Minutes(15), + brutal = DateTime.Minutes(15) +} + +CruiserInterval = { + easy = DateTime.Minutes(11), + normal = DateTime.Minutes(8), + hard = DateTime.Minutes(6), + vhard = DateTime.Minutes(5), + brutal = DateTime.Minutes(4) +} + +ChronoTankInterval = { + easy = DateTime.Minutes(6), + normal = DateTime.Minutes(5), + hard = DateTime.Minutes(4), + vhard = DateTime.Minutes(3), + brutal = DateTime.Minutes(2) + DateTime.Seconds(30) +} + +SuperweaponsEnabledTime = { + easy = DateTime.Seconds((60 * 45) + 17), + normal = DateTime.Seconds((60 * 30) + 17), + hard = DateTime.Seconds((60 * 18) + 17), + vhard = DateTime.Seconds((60 * 15) + 17), + brutal = DateTime.Seconds((60 * 12) + 17) +} + +Squads = { + Main = { + Delay = AdjustDelayForDifficulty(DateTime.Minutes(4)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 40, Max = 80, RampDuration = DateTime.Minutes(9) }), + ActiveCondition = function() + return HasConyardAcrossRiver() + end, + FollowLeader = true, + Compositions = AdjustCompositionsForDifficulty(UnitCompositions.Allied), + AttackPaths = { + { Path1_1.Location, Path1_2.Location }, + { Path2_1.Location, Path2_2.Location }, + }, + }, + Air = { + Delay = AdjustDelayForDifficulty(DateTime.Minutes(8)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 12, Max = 12 }), + Compositions = AirCompositions.Allied, + }, + Air2 = { + Delay = AdjustDelayForDifficulty(DateTime.Minutes(10)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 12, Max = 12 }), + ActiveCondition = function() + return not HasConyardAcrossRiver() + end, + Compositions = AirCompositions.Allied, + }, + AntiHeavyAir = AntiHeavyAirSquad({ "heli" }, AdjustAirDelayForDifficulty(DateTime.Minutes(10))), + AntiInfAir = AntiInfAirSquad({ "harr" }, AdjustAirDelayForDifficulty(DateTime.Minutes(10))), + AirToAir = AirToAirSquad({ "harr" }, AdjustAirDelayForDifficulty(DateTime.Minutes(10))), +} + +-- Setup and Tick + +SetupPlayers = function() + USSR = Player.GetPlayer("USSR") + Greece = Player.GetPlayer("Greece") + GreeceNorth = Player.GetPlayer("GreeceNorth") + Scrin = Player.GetPlayer("Scrin") + GDI = Player.GetPlayer("GDI") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = { USSR } + MissionEnemies = { Greece, GreeceNorth } +end + +WorldLoaded = function() + SetupPlayers() + + TimerTicks = 0 + Camera.Position = PlayerStart.CenterPosition + + InitObjectives(USSR) + AdjustPlayerStartingCashForDifficulty() + InitGreece() + + ObjectiveClearPath = USSR.AddObjective("Clear one of the two paths for reinforcements.") + ObjectiveCapturePrison = USSR.AddObjective("Capture Allied prison to free Yuri.") + + Trigger.AfterDelay(1, function() + local topPathUnits = Map.ActorsInBox(TopPathTopLeft.CenterPosition, TopPathBottomRight.CenterPosition, function(a) + return a.Owner == Greece and not a.IsDead and a.HasProperty("Health") and a.Type ~= "minv" + end) + + Trigger.OnAllKilled(topPathUnits, function() + PathCleared() + end) + + local bottomPathUnits = Map.ActorsInBox(BottomPathTopLeft.CenterPosition, BottomPathBottomRight.CenterPosition, function(a) + return a.Owner == Greece and not a.IsDead and a.HasProperty("Health") and a.Type ~= "minv" + end) + + Trigger.OnAllKilled(bottomPathUnits, function() + PathCleared() + end) + + local northShoreTurrets = { NorthShoreTurret1, NorthShoreTurret2, NorthShoreTurret3, NorthShoreTurret4 } + + Trigger.OnAllKilled(northShoreTurrets, function() + SendLandingCraft() + end) + end) + + Trigger.OnCapture(Prison, function(self, captor, oldOwner, newOwner) + if IsMissionPlayer(newOwner) then + local yuri = Reinforcements.Reinforce(newOwner, { "yuri" }, { PrisonerSpawn.Location, YuriRally.Location })[1] + local prodigy = Reinforcements.Reinforce(Scrin, { "pdgy" }, { PrisonerSpawn.Location, ProdigyRally.Location })[1] + + Trigger.AfterDelay(DateTime.Seconds(2), function() + + if AlliedBuildingsEliminated() then + Media.DisplayMessage("Ah, Comrade General, thank you for releasing us. I have a proposal that you may find interesting...", "Yuri", HSLColor.FromHex("FF00BB")) + MediaCA.PlaySound(MissionDir .. "/yuri_releasedwin.aud", 2) + + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(10)), function() + if ObjectiveCapturePrison ~= nil and not USSR.IsObjectiveCompleted(ObjectiveCapturePrison) then + USSR.MarkCompletedObjective(ObjectiveCapturePrison) + end + end) + else + ObjectiveEliminateAllies = USSR.AddObjective("Eliminate remaining Allied presence.") + ObjectiveKeepYuriAndProdigyAlive = USSR.AddObjective("Yuri and the Prodigy must survive.") + + Trigger.OnAnyKilled({ yuri, prodigy }, function(self, killer) + if not USSR.IsObjectiveCompleted(ObjectiveKeepYuriAndProdigyAlive) then + USSR.MarkFailedObjective(ObjectiveKeepYuriAndProdigyAlive) + end + end) + + if ObjectiveCapturePrison ~= nil and not USSR.IsObjectiveCompleted(ObjectiveCapturePrison) then + USSR.MarkCompletedObjective(ObjectiveCapturePrison) + end + + Media.DisplayMessage("Ah, Comrade General, thank you for releasing us. I have a proposal that you may find interesting. But first, we must deal with these pests.", "Yuri", HSLColor.FromHex("FF00BB")) + MediaCA.PlaySound(MissionDir .. "/yuri_released.aud", 2) + + Trigger.AfterDelay(DateTime.Seconds(5), function() + prodigy.Owner = newOwner + end) + end + end) + end + end) + + Trigger.OnKilled(Prison, function(self, killer) + if not USSR.IsObjectiveCompleted(ObjectiveCapturePrison) then + USSR.MarkFailedObjective(ObjectiveCapturePrison) + end + end) + + SellOnCaptureAttempt({NorthConyard, NorthFactory, NorthBarracks}, true) + + Trigger.AfterDelay(SuperweaponsEnabledTime[Difficulty], function() + Actor.Create("ai.minor.superweapons.enabled", true, { Owner = Greece }) + Actor.Create("ai.superweapons.enabled", true, { Owner = Greece }) + end) + + AfterWorldLoaded() +end + +Tick = function() + OncePerSecondChecks() + OncePerFiveSecondChecks() + OncePerThirtySecondChecks() + AfterTick() +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + Greece.Resources = Greece.ResourceCapacity - 500 + + if MissionPlayersHaveNoRequiredUnits() then + if not USSR.IsObjectiveCompleted(ObjectiveCapturePrison) then + USSR.MarkFailedObjective(ObjectiveCapturePrison) + end + if ObjectiveEliminateAllies ~= nil and not USSR.IsObjectiveCompleted(ObjectiveEliminateAllies) then + USSR.MarkFailedObjective(ObjectiveEliminateAllies) + end + end + + if ObjectiveEliminateAllies ~= nil and AlliedBuildingsEliminated() then + if not USSR.IsObjectiveCompleted(ObjectiveEliminateAllies) then + USSR.MarkCompletedObjective(ObjectiveEliminateAllies) + end + if not USSR.IsObjectiveCompleted(ObjectiveKeepYuriAndProdigyAlive) then + USSR.MarkCompletedObjective(ObjectiveKeepYuriAndProdigyAlive) + end + end + end +end + +OncePerFiveSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 125 == 0 then + UpdatePlayerBaseLocations() + + if not AlliedGroundAttacksStarted and HasConyardAcrossRiver() then + AlliedGroundAttacksStarted = true + + if IsHardOrAbove() then + Squads.Main.InitTimeAdjustment = -DateTime.Minutes(7) + elseif Difficulty == "normal" then + Squads.Main.InitTimeAdjustment =-DateTime.Minutes(4) + else + Squads.Main.InitTimeAdjustment = -DateTime.Minutes(1) + end + + InitAttackSquad(Squads.Main, Greece) + end + end +end + +OncePerThirtySecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % DateTime.Seconds(30) == 0 then + CalculatePlayerCharacteristics() + end +end + +-- Functions + +InitGreece = function() + AutoRepairBuildings(GreeceNorth) + SetupRefAndSilosCaptureCredits(GreeceNorth) + + AutoRepairAndRebuildBuildings(Greece, 15) + SetupRefAndSilosCaptureCredits(Greece) + AutoReplaceHarvesters(Greece) + AutoRebuildConyards(Greece) + InitAiUpgrades(Greece) + InitAirAttackSquad(Squads.Air, Greece) + InitAirAttackSquad(Squads.Air2, Greece) + + if IsHardOrAbove() then + InitAirAttackSquad(Squads.AirToAir, Greece, MissionPlayers, { "Aircraft" }, "ArmorType") + InitAirAttackSquad(Squads.AntiInfAir, Greece, MissionPlayers, { "None" }, "ArmorType") + InitAirAttackSquad(Squads.AntiHeavyAir, Greece, MissionPlayers, { "Heavy" }, "ArmorType") + end + + Utils.Do({ Greece, GreeceNorth }, function(p) + local greeceGroundAttackers = p.GetGroundAttackers() + + Utils.Do(greeceGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsGreeceGroundHunterUnit) + end) + end) + + local gdiGroundAttackers = GDI.GetGroundAttackers() + Utils.Do(gdiGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsGDIGroundHunterUnit) + end) + + Trigger.OnProduction(AlliedNavalYard, function(producer, produced) + if produced.Type == "ca" and not produced.IsDead then + produced.Patrol({ CruiserPatrol1.Location, CruiserPatrol2.Location }) + end + end) + + Trigger.AfterDelay(CruisersEnabledTime[Difficulty], function() + InitCruisers() + end) +end + +HasConyardAcrossRiver = function() + local conyards = GetMissionPlayersActorsByType("fact") + + local conyardsAcrossRiver = Utils.Where(conyards, function(c) + return c.Location.Y > 40 + end) + + return #conyardsAcrossRiver > 0 +end + +PathCleared = function() + if not USSR.IsObjectiveCompleted(ObjectiveClearPath) then + USSR.MarkCompletedObjective(ObjectiveClearPath) + end + + if not McvRequested then + McvRequested = true + + Trigger.AfterDelay(DateTime.Seconds(5), function() + PlaySpeechNotificationToMissionPlayers("ReinforcementsArrived") + Notification("Reinforcements have arrived.") + Beacon.New(USSR, McvRally.CenterPosition) + DoMcvArrival() + McvArrived = true + + Trigger.AfterDelay(ChronoTankInterval[Difficulty], function() + InitChronoTankAttack() + end) + end) + end +end + +SendLandingCraft = function() + Trigger.AfterDelay(DateTime.Seconds(4), function() + PlaySpeechNotificationToMissionPlayers("ReinforcementsArrived") + Notification("Reinforcements have arrived.") + Beacon.New(USSR, LandingCraftSpawn.CenterPosition) + Reinforcements.Reinforce(USSR, { "ss" }, { SubSpawn1.Location, SubRally1.Location }) + Reinforcements.Reinforce(USSR, { "ss" }, { SubSpawn2.Location, SubRally2.Location }) + + Trigger.AfterDelay(DateTime.Seconds(5), function() + Reinforcements.Reinforce(USSR, { "lst" }, { LandingCraftSpawn.Location, LandingCraftRally.Location }) + end) + end) +end + +InitCruisers = function() + if AlliedNavalYard.IsDead and Difficulty ~= "brutal" then + return + end + + local currentCruisers = Greece.GetActorsByType("ca") + + if #currentCruisers == 0 then + local cruiserCount + + if Difficulty == "brutal" then + cruiserCount = 5 + elseif Difficult == "vhard" then + cruiserCount = 4 + elseif Difficulty == "hard" then + cruiserCount = 3 + elseif Difficulty == "normal" then + cruiserCount = 2 + else + cruiserCount = 1 + end + + for i = 1, cruiserCount do + Trigger.AfterDelay(DateTime.Seconds(10 * (i - 1)) + 1, function() + if not AlliedNavalYard.IsDead and AlliedNavalYard.Owner == Greece then + AlliedNavalYard.Produce("ca") + end + end) + end + end + + Trigger.AfterDelay(CruiserInterval[Difficulty], function() + InitCruisers() + end) +end + +InitChronoTankAttack = function() + local alliedFactories = Greece.GetActorsByType("weap") + if #alliedFactories == 0 and Difficulty ~= "brutal" then + return + end + + local chronoTanksSquad = { "ctnk", "ctnk", "ctnk" } + + if Difficulty == "normal" then + table.insert(chronoTanksSquad, "ctnk") + end + + if IsHardOrAbove() then + table.insert(chronoTanksSquad, "ctnk") + + if IsVeryHardOrAbove() then + table.insert(chronoTanksSquad, "ctnk") + + if Difficulty == "brutal" then + table.insert(chronoTanksSquad, "ctnk") + end + end + end + + local chronoTanks = Reinforcements.Reinforce(Greece, chronoTanksSquad, { ChronoTankSpawn.Location, ChronoTankRally.Location }) + local dest = Utils.Random({ ChronoDest1.Location, ChronoDest2.Location, ChronoDest3.Location, ChronoDest4.Location, + ChronoDest5.Location, ChronoDest6.Location, ChronoDest7.Location, ChronoDest8.Location, ChronoDest9.Location + }) + + if HasConyardAcrossRiver() then + dest = Utils.Random({ ChronoDest10.Location, ChronoDest11.Location, ChronoDest12.Location }) + end + + Utils.Do(chronoTanks, function(t) + t.Move(ChronoTankRally.Location) + t.PortableChronoTeleport(dest, true) + t.Hunt() + end) + + Trigger.AfterDelay(ChronoTankInterval[Difficulty], function() + InitChronoTankAttack() + end) +end + +AlliedBuildingsEliminated = function() + local alliedBuildings = Utils.Where(Greece.GetActors(), function(a) + return a.HasProperty("StartBuildingRepairs") and not a.HasProperty("Attack") and a.Type ~= "silo" + end) + return #alliedBuildings == 0 +end + +-- overridden in co-op version +DoMcvArrival = function() + Reinforcements.Reinforce(USSR, { "mcv" }, { McvSpawn.Location, McvRally.Location }) +end diff --git a/mods/ca/missions/main-campaign/ca39-jailbreak/map.bin b/mods/ca/missions/main-campaign/ca39-jailbreak/map.bin new file mode 100644 index 0000000000..ca3b477702 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca39-jailbreak/map.bin differ diff --git a/mods/ca/missions/main-campaign/ca39-jailbreak/map.png b/mods/ca/missions/main-campaign/ca39-jailbreak/map.png new file mode 100644 index 0000000000..880c6efb4f Binary files /dev/null and b/mods/ca/missions/main-campaign/ca39-jailbreak/map.png differ diff --git a/mods/ca/missions/main-campaign/ca39-jailbreak/map.yaml b/mods/ca/missions/main-campaign/ca39-jailbreak/map.yaml new file mode 100644 index 0000000000..6f6eff717e --- /dev/null +++ b/mods/ca/missions/main-campaign/ca39-jailbreak/map.yaml @@ -0,0 +1,3042 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 39: Jailbreak + +Author: Darkademic + +Tileset: TEMPERAT + +MapSize: 98,98 + +Bounds: 1,1,96,96 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: USSR, Greece, GreeceNorth, GDI + PlayerReference@USSR: + Name: USSR + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: soviet + LockColor: True + Color: FE1100 + LockSpawn: True + LockTeam: True + Enemies: Greece, GreeceNorth, GDI, Creeps + PlayerReference@Greece: + Name: Greece + Bot: campaign + Faction: allies + Color: 99ACF2 + Allies: GreeceNorth, GDI + Enemies: USSR, Scrin, Creeps + PlayerReference@GreeceNorth: + Name: GreeceNorth + Bot: dormant + Faction: allies + Color: 99ACF2 + Allies: Greece, GDI + Enemies: USSR, Scrin, Creeps + PlayerReference@Scrin: + Name: Scrin + Bot: dormant + Faction: scrin + Color: 7700FF + Allies: USSR + Enemies: Greece, GreeceNorth, GDI, Creeps + PlayerReference@GDI: + Name: GDI + Bot: dormant + Faction: gdi + Color: F2CF74 + Allies: Greece, GreeceNorth + Enemies: USSR, Scrin, Creeps + +Actors: + Actor28: brik + Owner: Greece + Location: 23,67 + Actor29: brik + Owner: Greece + Location: 24,67 + Actor30: brik + Owner: Greece + Location: 25,67 + Actor31: brik + Owner: Greece + Location: 26,67 + Actor32: brik + Owner: Greece + Location: 27,67 + Actor33: brik + Owner: Greece + Location: 28,67 + Actor34: brik + Owner: Greece + Location: 29,67 + Actor35: brik + Owner: Greece + Location: 23,68 + Actor36: brik + Owner: Greece + Location: 29,68 + Actor37: brik + Owner: Greece + Location: 23,69 + Prison: miss + Owner: Greece + Location: 25,69 + Actor39: brik + Owner: Greece + Location: 29,69 + Actor40: brik + Owner: Greece + Location: 23,70 + Actor41: brik + Owner: Greece + Location: 29,70 + Actor42: brik + Owner: Greece + Location: 23,71 + Actor43: brik + Owner: Greece + Location: 29,71 + Actor44: brik + Owner: Greece + Location: 23,72 + Actor45: brik + Owner: Greece + Location: 29,72 + Actor46: brik + Owner: Greece + Location: 23,73 + Actor47: brik + Owner: Greece + Location: 24,73 + Actor48: brik + Owner: Greece + Location: 28,73 + Actor49: brik + Owner: Greece + Location: 29,73 + Actor50: brik + Owner: Greece + Location: 23,74 + Actor51: brik + Owner: Greece + Location: 24,74 + Actor52: brik + Owner: Greece + Location: 28,74 + Actor53: brik + Owner: Greece + Location: 29,74 + NorthShoreTurret1: gun + Owner: Greece + Location: 85,34 + TurretFacing: 586 + NorthShoreTurret2: gun + Owner: Greece + Location: 76,35 + TurretFacing: 650 + NorthShoreTurret3: gun + Owner: Greece + Location: 64,34 + TurretFacing: 531 + NorthShoreTurret4: gun + Owner: Greece + Location: 52,34 + TurretFacing: 602 + Actor60: gun + Owner: Greece + Location: 61,46 + TurretFacing: 95 + Actor61: gun + Owner: Greece + Location: 47,46 + TurretFacing: 935 + Actor62: gun + Owner: Greece + Location: 35,44 + TurretFacing: 0 + Actor63: gun + Owner: Greece + Location: 27,46 + TurretFacing: 71 + Actor64: gun + Owner: Greece + Location: 17,46 + TurretFacing: 983 + Actor69: e1 + Owner: USSR + Facing: 384 + Location: 89,6 + SubCell: 1 + Actor71: e1 + Owner: USSR + Facing: 384 + Location: 89,6 + SubCell: 4 + Actor73: e1 + Owner: USSR + Facing: 384 + Location: 91,8 + SubCell: 1 + Actor74: e1 + Owner: USSR + Facing: 384 + Location: 91,8 + SubCell: 2 + Actor75: e1 + Owner: USSR + Facing: 384 + Location: 91,8 + SubCell: 4 + Actor76: e1 + Owner: USSR + Facing: 384 + Location: 91,8 + SubCell: 5 + Actor70: e1 + Owner: USSR + Facing: 384 + Location: 89,6 + SubCell: 2 + Actor72: e1 + Owner: USSR + Facing: 384 + Location: 89,6 + SubCell: 5 + Actor67: 3tnk + Owner: USSR + Facing: 384 + Location: 91,4 + Actor68: 3tnk + Owner: USSR + Facing: 384 + Location: 93,6 + Actor77: 3tnk + Owner: USSR + Facing: 384 + Location: 91,6 + Actor78: btr + Owner: USSR + Facing: 384 + Location: 93,8 + Actor79: btr + Owner: USSR + Facing: 384 + Location: 89,4 + Actor81: e3 + Owner: USSR + Facing: 384 + Location: 92,5 + SubCell: 1 + Actor82: e3 + Owner: USSR + Facing: 384 + Location: 92,5 + SubCell: 2 + Actor83: e3 + Owner: USSR + Facing: 384 + Location: 92,5 + SubCell: 4 + Actor84: e3 + Owner: USSR + Facing: 384 + Location: 92,5 + SubCell: 5 + Actor86: e2 + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 92,9 + Actor87: e2 + Owner: USSR + Facing: 384 + Location: 92,9 + SubCell: 1 + Actor90: e2 + Owner: USSR + Facing: 384 + Location: 88,5 + SubCell: 5 + Actor80: e2 + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 88,5 + Actor85: ttrp + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 90,5 + Actor88: ttrp + Owner: USSR + Facing: 384 + Location: 92,7 + SubCell: 3 + Actor92: dog + Owner: USSR + SubCell: 3 + Facing: 384 + Location: 87,7 + Actor93: dog + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 91,10 + Actor94: sbag + Owner: Greece + Location: 16,48 + Actor95: sbag + Owner: Greece + Location: 16,47 + Actor96: sbag + Owner: Greece + Location: 16,49 + Actor97: sbag + Owner: Greece + Location: 17,47 + Actor98: sbag + Owner: Greece + Location: 18,47 + Actor99: sbag + Owner: Greece + Location: 18,48 + Actor100: sbag + Owner: Greece + Location: 18,49 + Actor101: sbag + Owner: Greece + Location: 26,47 + Actor102: sbag + Owner: Greece + Location: 27,47 + Actor103: sbag + Owner: Greece + Location: 28,47 + Actor104: sbag + Owner: Greece + Location: 26,48 + Actor105: sbag + Owner: Greece + Location: 26,49 + Actor106: sbag + Owner: Greece + Location: 28,48 + Actor107: sbag + Owner: Greece + Location: 28,49 + Actor115: sbag + Owner: Greece + Location: 35,45 + Actor116: sbag + Owner: Greece + Location: 34,45 + Actor117: sbag + Owner: Greece + Location: 36,45 + Actor118: sbag + Owner: Greece + Location: 34,46 + Actor119: sbag + Owner: Greece + Location: 34,47 + Actor120: sbag + Owner: Greece + Location: 36,46 + Actor121: sbag + Owner: Greece + Location: 36,47 + Actor122: sbag + Owner: Greece + Location: 35,47 + Actor123: sbag + Owner: Greece + Location: 27,49 + Actor124: sbag + Owner: Greece + Location: 17,49 + Actor126: sbag + Owner: Greece + Location: 47,47 + Actor127: sbag + Owner: Greece + Location: 46,47 + Actor128: sbag + Owner: Greece + Location: 46,48 + Actor129: sbag + Owner: Greece + Location: 46,49 + Actor130: sbag + Owner: Greece + Location: 47,49 + Actor131: sbag + Owner: Greece + Location: 48,49 + Actor132: sbag + Owner: Greece + Location: 48,48 + Actor133: sbag + Owner: Greece + Location: 48,47 + Actor134: agun + Owner: Greece + Location: 47,48 + TurretFacing: 1023 + Actor140: mgg + Owner: Greece + Facing: 384 + Location: 17,50 + Actor141: mgg + Owner: Greece + Facing: 384 + Location: 29,48 + Actor142: mgg + Owner: Greece + Facing: 384 + Location: 37,46 + Actor143: mgg + Owner: Greece + Facing: 384 + Location: 45,49 + Actor144: gap + Owner: Greece + Location: 22,66 + Actor145: gap + Owner: Greece + Location: 32,73 + Actor146: gap + Owner: Greece + Location: 21,76 + Actor147: sbag + Owner: Greece + Location: 10,1 + Actor148: sbag + Owner: Greece + Location: 10,2 + Actor149: sbag + Owner: Greece + Location: 11,1 + Actor150: sbag + Owner: Greece + Location: 12,1 + Actor151: sbag + Owner: Greece + Location: 13,1 + Actor152: sbag + Owner: Greece + Location: 14,1 + Actor153: sbag + Owner: Greece + Location: 15,1 + Actor154: sbag + Owner: Greece + Location: 16,1 + Actor155: sbag + Owner: Greece + Location: 17,1 + Actor156: sbag + Owner: Greece + Location: 18,1 + Actor157: sbag + Owner: Greece + Location: 19,1 + Actor158: sbag + Owner: Greece + Location: 20,1 + Actor159: sbag + Owner: Greece + Location: 21,1 + Actor172: sbag + Owner: Greece + Location: 10,11 + Actor173: sbag + Owner: Greece + Location: 10,9 + Actor174: sbag + Owner: Greece + Location: 10,10 + Actor175: gap + Owner: Greece + Location: 86,56 + Actor176: brik + Owner: Greece + Location: 15,66 + Actor177: brik + Owner: Greece + Location: 16,66 + Actor178: brik + Owner: Greece + Location: 17,66 + Actor179: brik + Owner: Greece + Location: 18,66 + Actor180: brik + Owner: Greece + Location: 18,67 + Actor181: brik + Owner: Greece + Location: 17,67 + Actor182: brik + Owner: Greece + Location: 15,67 + Actor183: brik + Owner: Greece + Location: 14,67 + Actor184: brik + Owner: Greece + Location: 14,66 + Actor185: brik + Owner: Greece + Location: 11,66 + Actor186: brik + Owner: Greece + Location: 11,67 + Actor187: brik + Owner: Greece + Location: 10,67 + Actor188: brik + Owner: Greece + Location: 10,66 + Actor189: brik + Owner: Greece + Location: 9,66 + Actor190: brik + Owner: Greece + Location: 8,66 + Actor191: brik + Owner: Greece + Location: 7,66 + Actor192: brik + Owner: Greece + Location: 6,66 + Actor193: brik + Owner: Greece + Location: 5,66 + Actor194: brik + Owner: Greece + Location: 4,66 + Actor195: brik + Owner: Greece + Location: 3,66 + Actor196: brik + Owner: Greece + Location: 2,66 + Actor197: brik + Owner: Greece + Location: 1,66 + Actor198: brik + Owner: Greece + Location: 1,67 + Actor199: brik + Owner: Greece + Location: 2,67 + Actor200: brik + Owner: Greece + Location: 1,68 + Actor201: brik + Owner: Greece + Location: 1,69 + Actor202: brik + Owner: Greece + Location: 1,70 + Actor203: brik + Owner: Greece + Location: 1,71 + Actor204: brik + Owner: Greece + Location: 2,71 + Actor205: brik + Owner: Greece + Location: 2,70 + Actor206: brik + Owner: Greece + Location: 35,77 + Actor207: brik + Owner: Greece + Location: 35,76 + Actor208: brik + Owner: Greece + Location: 36,76 + Actor209: brik + Owner: Greece + Location: 36,77 + Actor210: brik + Owner: Greece + Location: 35,74 + Actor211: brik + Owner: Greece + Location: 35,75 + Actor212: brik + Owner: Greece + Location: 34,74 + Actor213: brik + Owner: Greece + Location: 33,74 + Actor214: brik + Owner: Greece + Location: 32,74 + Actor215: brik + Owner: Greece + Location: 31,74 + Actor216: brik + Owner: Greece + Location: 31,73 + Actor217: brik + Owner: Greece + Location: 30,73 + Actor218: brik + Owner: Greece + Location: 30,74 + Actor219: brik + Owner: Greece + Location: 22,67 + Actor220: brik + Owner: Greece + Location: 22,68 + Actor221: brik + Owner: Greece + Location: 35,81 + Actor222: brik + Owner: Greece + Location: 35,82 + Actor223: brik + Owner: Greece + Location: 36,82 + Actor224: brik + Owner: Greece + Location: 36,81 + Actor225: brik + Owner: Greece + Location: 36,83 + Actor226: brik + Owner: Greece + Location: 36,84 + Actor227: brik + Owner: Greece + Location: 36,85 + Actor228: brik + Owner: Greece + Location: 36,86 + Actor229: brik + Owner: Greece + Location: 36,87 + Actor230: brik + Owner: Greece + Location: 35,87 + Actor231: brik + Owner: Greece + Location: 35,86 + Actor232: brik + Owner: Greece + Location: 34,87 + Actor233: brik + Owner: Greece + Location: 33,87 + Actor234: brik + Owner: Greece + Location: 32,87 + Actor235: brik + Owner: Greece + Location: 31,87 + Actor236: brik + Owner: Greece + Location: 30,86 + Actor237: brik + Owner: Greece + Location: 30,87 + Actor238: brik + Owner: Greece + Location: 29,87 + Actor239: brik + Owner: Greece + Location: 29,86 + Actor240: brik + Owner: Greece + Location: 25,90 + Actor241: brik + Owner: Greece + Location: 25,89 + Actor242: brik + Owner: Greece + Location: 25,88 + Actor243: brik + Owner: Greece + Location: 26,88 + Actor244: brik + Owner: Greece + Location: 26,87 + Actor245: brik + Owner: Greece + Location: 25,87 + Actor246: brik + Owner: Greece + Location: 24,90 + Actor247: brik + Owner: Greece + Location: 23,90 + Actor248: brik + Owner: Greece + Location: 22,90 + Actor249: brik + Owner: Greece + Location: 21,90 + Actor250: brik + Owner: Greece + Location: 20,90 + Actor251: brik + Owner: Greece + Location: 20,89 + Actor252: brik + Owner: Greece + Location: 19,89 + Actor253: brik + Owner: Greece + Location: 18,89 + Actor254: brik + Owner: Greece + Location: 17,89 + Actor255: brik + Owner: Greece + Location: 16,89 + Actor256: brik + Owner: Greece + Location: 15,89 + Actor257: brik + Owner: Greece + Location: 14,89 + Actor258: brik + Owner: Greece + Location: 14,90 + Actor259: brik + Owner: Greece + Location: 13,90 + Actor260: brik + Owner: Greece + Location: 13,89 + Actor261: pbox + Owner: Greece + Location: 37,77 + Actor262: pbox + Owner: Greece + Location: 37,81 + Actor264: pbox + Owner: Greece + Location: 15,65 + Actor265: pbox + Owner: Greece + Location: 10,65 + Actor263: alhq + Owner: Greece + Location: 15,75 + Actor269: tent + Owner: Greece + Location: 30,82 + Actor270: apwr + Owner: Greece + Location: 21,87 + Actor271: apwr + Owner: Greece + Location: 15,86 + Actor273: apwr + Owner: Greece + Location: 21,83 + Actor274: apwr + Owner: Greece + Location: 11,84 + Actor276: hpad + Owner: Greece + Location: 88,75 + Actor277: hpad + Owner: Greece + Location: 91,75 + Actor279: hpad + Owner: Greece + Location: 91,83 + Actor280: hpad + Owner: Greece + Location: 88,83 + Actor281: brik + Owner: Greece + Location: 88,74 + Actor282: brik + Owner: Greece + Location: 89,74 + Actor283: brik + Owner: Greece + Location: 91,74 + Actor284: brik + Owner: Greece + Location: 90,74 + Actor285: brik + Owner: Greece + Location: 92,74 + Actor286: brik + Owner: Greece + Location: 93,74 + Actor287: brik + Owner: Greece + Location: 94,74 + Actor288: brik + Owner: Greece + Location: 95,74 + Actor289: brik + Owner: Greece + Location: 95,75 + Actor290: brik + Owner: Greece + Location: 96,74 + Actor291: brik + Owner: Greece + Location: 96,75 + Actor292: brik + Owner: Greece + Location: 96,76 + Actor293: brik + Owner: Greece + Location: 96,77 + Actor294: brik + Owner: Greece + Location: 96,78 + Actor295: brik + Owner: Greece + Location: 96,79 + Actor296: brik + Owner: Greece + Location: 96,80 + Actor297: brik + Owner: Greece + Location: 96,81 + Actor298: brik + Owner: Greece + Location: 96,82 + Actor299: brik + Owner: Greece + Location: 96,83 + Actor300: brik + Owner: Greece + Location: 96,84 + Actor301: brik + Owner: Greece + Location: 95,85 + Actor302: brik + Owner: Greece + Location: 95,86 + Actor303: brik + Owner: Greece + Location: 96,85 + Actor304: brik + Owner: Greece + Location: 96,86 + Actor305: brik + Owner: Greece + Location: 88,86 + Actor306: brik + Owner: Greece + Location: 89,86 + Actor307: brik + Owner: Greece + Location: 90,86 + Actor308: brik + Owner: Greece + Location: 91,86 + Actor309: brik + Owner: Greece + Location: 92,86 + Actor310: brik + Owner: Greece + Location: 93,86 + Actor311: brik + Owner: Greece + Location: 94,86 + Actor312: brik + Owner: Greece + Location: 87,86 + Actor313: brik + Owner: Greece + Location: 86,86 + Actor314: hpad + Owner: Greece + Location: 94,82 + Actor315: hpad + Owner: Greece + Location: 94,76 + Actor316: brik + Owner: Greece + Location: 86,85 + Actor317: brik + Owner: Greece + Location: 86,84 + Actor318: brik + Owner: Greece + Location: 86,83 + Actor319: brik + Owner: Greece + Location: 86,82 + Actor320: brik + Owner: Greece + Location: 86,81 + Actor321: brik + Owner: Greece + Location: 87,81 + Actor322: brik + Owner: Greece + Location: 87,82 + Actor323: brik + Owner: Greece + Location: 87,74 + Actor324: brik + Owner: Greece + Location: 86,74 + Actor325: brik + Owner: Greece + Location: 86,75 + Actor326: brik + Owner: Greece + Location: 86,76 + Actor327: brik + Owner: Greece + Location: 86,77 + Actor328: brik + Owner: Greece + Location: 86,78 + Actor329: brik + Owner: Greece + Location: 86,79 + Actor330: brik + Owner: Greece + Location: 87,79 + Actor331: brik + Owner: Greece + Location: 87,78 + Actor332: chain + Owner: Greece + Location: 86,73 + Actor333: chain + Owner: Greece + Location: 85,73 + Actor334: chain + Owner: Greece + Location: 85,74 + Actor335: chain + Owner: Greece + Location: 85,75 + Actor336: chain + Owner: Greece + Location: 85,76 + Actor337: chain + Owner: Greece + Location: 85,77 + Actor338: chain + Owner: Greece + Location: 85,78 + Actor339: chain + Owner: Greece + Location: 87,73 + Actor340: chain + Owner: Greece + Location: 88,73 + Actor341: chain + Owner: Greece + Location: 90,73 + Actor342: chain + Owner: Greece + Location: 89,73 + Actor343: chain + Owner: Greece + Location: 91,73 + Actor344: chain + Owner: Greece + Location: 92,73 + Actor345: chain + Owner: Greece + Location: 93,73 + Actor346: chain + Owner: Greece + Location: 95,73 + Actor347: chain + Owner: Greece + Location: 96,73 + Actor348: chain + Owner: Greece + Location: 94,73 + Actor349: chain + Owner: Greece + Location: 85,81 + Actor350: chain + Owner: Greece + Location: 85,82 + Actor351: chain + Owner: Greece + Location: 85,83 + Actor352: chain + Owner: Greece + Location: 85,84 + Actor353: chain + Owner: Greece + Location: 85,85 + Actor354: chain + Owner: Greece + Location: 85,86 + Actor355: chain + Owner: Greece + Location: 85,87 + Actor356: chain + Owner: Greece + Location: 86,87 + Actor357: chain + Owner: Greece + Location: 88,87 + Actor358: chain + Owner: Greece + Location: 87,87 + Actor359: chain + Owner: Greece + Location: 89,87 + Actor360: chain + Owner: Greece + Location: 90,87 + Actor361: chain + Owner: Greece + Location: 91,87 + Actor362: chain + Owner: Greece + Location: 92,87 + Actor363: chain + Owner: Greece + Location: 93,87 + Actor364: chain + Owner: Greece + Location: 94,87 + Actor365: chain + Owner: Greece + Location: 95,87 + Actor366: chain + Owner: Greece + Location: 96,87 + Actor367: pbox + Owner: Greece + Location: 84,78 + Actor368: pbox + Owner: Greece + Location: 84,81 + Actor370: sbag + Owner: Greece + Location: 10,13 + Actor371: sbag + Owner: Greece + Location: 10,12 + Actor372: sbag + Owner: Greece + Location: 11,13 + Actor373: sbag + Owner: Greece + Location: 12,13 + Actor374: sbag + Owner: Greece + Location: 18,13 + Actor375: sbag + Owner: Greece + Location: 19,13 + Actor376: sbag + Owner: Greece + Location: 20,13 + Actor377: sbag + Owner: Greece + Location: 21,13 + Actor378: sbag + Owner: Greece + Location: 22,13 + Actor379: sbag + Owner: Greece + Location: 23,13 + Actor380: sbag + Owner: Greece + Location: 23,12 + Actor381: sbag + Owner: Greece + Location: 23,11 + Actor382: sbag + Owner: Greece + Location: 23,10 + Actor383: sbag + Owner: Greece + Location: 23,9 + Actor384: sbag + Owner: Greece + Location: 23,8 + Actor385: sbag + Owner: Greece + Location: 23,4 + Actor386: sbag + Owner: Greece + Location: 23,3 + Actor387: sbag + Owner: Greece + Location: 23,2 + Actor388: sbag + Owner: Greece + Location: 23,1 + Actor389: sbag + Owner: Greece + Location: 22,1 + Actor390: gap + Owner: Greece + Location: 89,80 + Actor391: fix + Owner: Greece + Location: 91,79 + Actor369: agun + Owner: Greece + Location: 95,80 + TurretFacing: 111 + Actor393: proc + Location: 19,8 + Owner: GreeceNorth + Actor398: powr + Location: 13,2 + Owner: GreeceNorth + Actor399: powr + Location: 11,2 + Owner: GreeceNorth + Actor402: silo + Location: 19,8 + Owner: GreeceNorth + Actor403: silo + Location: 21,8 + Owner: GreeceNorth + Actor401: sbag + Owner: Greece + Location: 10,8 + Actor408: sbag + Owner: Greece + Location: 10,7 + Actor409: sbag + Owner: Greece + Location: 10,6 + Actor410: sbag + Owner: Greece + Location: 10,5 + Actor411: sbag + Owner: Greece + Location: 10,4 + Actor413: sbag + Owner: Greece + Location: 10,3 + Actor414: sbag + Owner: Greece + Location: 13,13 + Actor404: pbox + Location: 24,8 + Owner: GreeceNorth + Actor405: pbox + Location: 24,4 + Owner: GreeceNorth + Actor406: pbox + Location: 18,14 + Owner: GreeceNorth + Actor407: pbox + Location: 13,14 + Owner: GreeceNorth + NorthFactory: weap + Location: 11,9 + Owner: GreeceNorth + Actor400: powr + Location: 11,5 + Owner: GreeceNorth + Actor396: powr + Location: 13,5 + Owner: GreeceNorth + NorthBarracks: tent + Location: 21,2 + Owner: GreeceNorth + NorthConyard: fact + Location: 16,2 + Owner: GreeceNorth + Actor397: ttrp + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 88,3 + Actor412: ttrp + Owner: USSR + Facing: 384 + SubCell: 3 + Location: 94,9 + Actor416: e1 + Owner: USSR + Facing: 384 + SubCell: 1 + Location: 87,4 + Actor417: e1 + Owner: USSR + Facing: 384 + SubCell: 4 + Location: 87,4 + Actor418: e1 + Owner: USSR + Facing: 384 + SubCell: 2 + Location: 87,4 + Actor419: e1 + Owner: USSR + Facing: 384 + SubCell: 5 + Location: 87,4 + Actor420: e1 + Owner: USSR + Facing: 384 + SubCell: 1 + Location: 93,10 + Actor421: e1 + Owner: USSR + Facing: 384 + SubCell: 4 + Location: 93,10 + Actor422: e1 + Owner: USSR + Facing: 384 + SubCell: 2 + Location: 93,10 + Actor423: e1 + Owner: USSR + Facing: 384 + SubCell: 5 + Location: 93,10 + Actor424: 3tnk + Owner: USSR + Facing: 384 + Location: 93,4 + Actor425: v2rl + Owner: USSR + Facing: 384 + Location: 95,5 + Actor426: v2rl + Owner: USSR + Facing: 384 + Location: 92,2 + Actor427: tc04 + Owner: Neutral + Faction: soviet + Location: 73,14 + Actor428: tc05 + Owner: Neutral + Faction: soviet + Location: 80,14 + Actor429: tc01 + Owner: Neutral + Faction: soviet + Location: 77,13 + Actor430: t16 + Owner: Neutral + Faction: soviet + Location: 81,18 + Actor431: tc04 + Owner: Neutral + Faction: soviet + Location: 72,19 + Actor432: tc03 + Owner: Neutral + Faction: soviet + Location: 73,18 + Actor433: tc01 + Owner: Neutral + Faction: soviet + Location: 74,16 + Actor434: tc02 + Owner: Neutral + Faction: soviet + Location: 75,19 + Actor435: tc05 + Owner: Neutral + Faction: soviet + Location: 66,18 + Actor436: tc04 + Owner: Neutral + Faction: soviet + Location: 50,12 + Actor437: tc01 + Owner: Neutral + Faction: soviet + Location: 59,16 + Actor438: tc02 + Owner: Neutral + Faction: soviet + Location: 52,14 + Actor439: t16 + Owner: Neutral + Faction: soviet + Location: 51,15 + Actor440: t16 + Owner: Neutral + Faction: soviet + Location: 62,19 + Actor442: t06 + Owner: Neutral + Faction: soviet + Location: 83,17 + Actor443: t06 + Owner: Neutral + Faction: soviet + Location: 69,19 + Actor444: t06 + Owner: Neutral + Faction: soviet + Location: 61,17 + Actor445: t06 + Owner: Neutral + Faction: soviet + Location: 55,12 + Actor446: t06 + Owner: Neutral + Faction: soviet + Location: 58,20 + Actor447: t05 + Owner: Neutral + Faction: soviet + Location: 59,19 + Actor448: t05 + Owner: Neutral + Faction: soviet + Location: 54,15 + Actor449: t05 + Owner: Neutral + Faction: soviet + Location: 71,17 + Actor450: t05 + Owner: Neutral + Faction: soviet + Location: 79,17 + Actor451: t05 + Owner: Neutral + Faction: soviet + Location: 55,17 + Actor452: t06 + Owner: Neutral + Faction: soviet + Location: 78,16 + Actor453: t06 + Owner: Neutral + Faction: soviet + Location: 63,18 + Actor454: t06 + Owner: Neutral + Faction: soviet + Location: 55,14 + Actor455: t06 + Owner: Neutral + Faction: soviet + Location: 69,16 + Actor456: t06 + Owner: Neutral + Faction: soviet + Location: 57,18 + Actor457: t10 + Owner: Neutral + Faction: soviet + Location: 60,18 + Actor458: t10 + Owner: Neutral + Faction: soviet + Location: 76,16 + Actor459: t15 + Owner: Neutral + Faction: soviet + Location: 77,18 + Actor460: t15 + Owner: Neutral + Faction: soviet + Location: 71,16 + Actor461: t15 + Owner: Neutral + Faction: soviet + Location: 55,15 + Actor462: t12 + Owner: Neutral + Faction: soviet + Location: 54,13 + Actor463: t12 + Owner: Neutral + Faction: soviet + Location: 56,18 + Actor464: t12 + Owner: Neutral + Faction: soviet + Location: 65,17 + Actor465: t12 + Owner: Neutral + Faction: soviet + Location: 70,18 + Actor466: t12 + Owner: Neutral + Faction: soviet + Location: 80,16 + Actor467: t11 + Owner: Neutral + Faction: soviet + Location: 81,11 + Actor468: tc04 + Owner: Neutral + Faction: soviet + Location: 71,10 + Actor469: t16 + Owner: Neutral + Faction: soviet + Location: 77,4 + Actor470: tc02 + Owner: Neutral + Faction: soviet + Location: 71,2 + Actor471: t15 + Owner: Neutral + Faction: soviet + Location: 65,8 + Actor472: tc01 + Owner: Neutral + Faction: soviet + Location: 59,4 + Actor474: t01 + Owner: Neutral + Faction: soviet + Location: 65,2 + Actor475: t01 + Owner: Neutral + Faction: soviet + Location: 54,2 + Actor476: t13 + Owner: Neutral + Faction: soviet + Location: 64,13 + Actor477: t10 + Owner: Neutral + Faction: soviet + Location: 58,9 + Actor478: t05 + Owner: Neutral + Faction: soviet + Location: 56,8 + Actor479: t06 + Owner: Neutral + Faction: soviet + Location: 66,3 + Actor480: t02 + Owner: Neutral + Faction: soviet + Location: 80,10 + Actor481: t01 + Owner: Neutral + Faction: soviet + Location: 75,1 + Actor484: 2tnk + Owner: Greece + Location: 67,28 + Facing: 904 + Actor482: 2tnk + Owner: Greece + Facing: 904 + Location: 68,29 + Actor483: 2tnk + Owner: Greece + Facing: 904 + Location: 69,30 + Actor485: 1tnk + Owner: Greece + Location: 89,23 + Facing: 0 + Actor486: 1tnk + Owner: Greece + Location: 88,25 + Facing: 0 + Actor487: e3 + Owner: Greece + SubCell: 3 + Location: 90,24 + Facing: 0 + Actor490: e3 + Owner: Greece + SubCell: 3 + Location: 67,29 + Facing: 888 + Actor488: e3 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 87,24 + Actor491: e3 + Owner: Greece + SubCell: 3 + Facing: 888 + Location: 66,27 + Actor489: e3 + Owner: Greece + SubCell: 3 + Facing: 888 + Location: 68,31 + Actor493: snip + Owner: Greece + SubCell: 3 + Facing: 800 + Location: 66,3 + Actor494: snip + Owner: Greece + SubCell: 3 + Facing: 800 + Location: 71,2 + Actor495: snip + Owner: Greece + SubCell: 3 + Facing: 800 + Location: 71,10 + Actor496: snip + Owner: Greece + SubCell: 3 + Facing: 800 + Location: 64,13 + Actor497: snip + Owner: Greece + SubCell: 3 + Facing: 800 + Location: 59,9 + Actor498: snip + Owner: Greece + SubCell: 3 + Facing: 800 + Location: 54,2 + Actor499: snip + Owner: Greece + SubCell: 3 + Facing: 800 + Location: 63,7 + Actor473: t02 + Owner: Neutral + Faction: soviet + Location: 63,7 + Actor492: snip + Owner: Greece + SubCell: 3 + Facing: 800 + Location: 66,8 + Actor500: rtnk + Owner: Greece + Location: 70,11 + Facing: 919 + Actor501: rtnk + Owner: Greece + Location: 70,3 + Facing: 658 + Actor502: rtnk + Owner: Greece + Location: 63,13 + Facing: 911 + Actor503: rtnk + Owner: Greece + Location: 65,4 + Facing: 658 + Actor504: rtnk + Owner: Greece + Facing: 658 + Location: 58,5 + Actor505: hbox + Owner: Greece + Location: 66,7 + Actor506: hbox + Owner: Greece + Location: 69,13 + Actor507: ptnk + Owner: Greece + Location: 64,29 + Facing: 769 + Actor508: ifv + Owner: Greece + Location: 67,32 + Facing: 777 + Actor509: split2 + Owner: Neutral + Location: 16,21 + Actor510: split2 + Owner: Neutral + Location: 14,25 + Actor511: split2 + Owner: Neutral + Location: 9,21 + Actor512: tc01 + Owner: Neutral + Location: 44,15 + Actor513: tc05 + Owner: Neutral + Location: 34,15 + Actor514: tc04 + Owner: Neutral + Location: 37,6 + Actor515: t16 + Owner: Neutral + Location: 41,7 + Actor516: t13 + Owner: Neutral + Location: 40,5 + Actor517: t12 + Owner: Neutral + Location: 45,12 + Actor518: t13 + Owner: Neutral + Location: 38,14 + Actor519: t15 + Owner: Neutral + Location: 28,2 + Actor520: tc02 + Owner: Neutral + Location: 42,1 + Actor521: t06 + Owner: Neutral + Location: 33,4 + Actor522: t02 + Owner: Neutral + Location: 31,13 + Actor523: t13 + Owner: Neutral + Location: 50,8 + Actor524: t11 + Owner: Neutral + Location: 27,10 + Actor525: t17 + Owner: Neutral + Location: 36,1 + Actor526: tc05 + Owner: Neutral + Location: 25,30 + Actor527: t17 + Owner: Neutral + Location: 24,32 + Actor528: t16 + Owner: Neutral + Location: 30,25 + Actor529: t07 + Owner: Neutral + Location: 44,24 + Actor530: t02 + Owner: Neutral + Location: 50,22 + Actor531: t01 + Owner: Neutral + Location: 25,22 + Actor532: t10 + Owner: Neutral + Location: 33,31 + Actor533: t12 + Owner: Neutral + Location: 47,30 + Actor534: t07 + Owner: Neutral + Location: 51,31 + Actor535: tc02 + Owner: Neutral + Location: 58,24 + Actor536: tc01 + Owner: Neutral + Location: 74,32 + Actor537: tc03 + Owner: Neutral + Location: 86,31 + Actor538: t17 + Owner: Neutral + Location: 92,29 + Actor539: t16 + Owner: Neutral + Location: 84,28 + Actor540: t16 + Owner: Neutral + Location: 79,26 + Actor541: t02 + Owner: Neutral + Location: 70,24 + Actor542: agun + Owner: Greece + Location: 22,69 + Actor543: agun + Owner: Greece + Location: 34,75 + Actor544: agun + Owner: Greece + Location: 11,71 + Actor545: agun + Owner: Greece + Location: 2,68 + Actor546: agun + Owner: Greece + Location: 20,72 + Actor547: agun + Owner: Greece + Location: 34,86 + Actor548: agun + Owner: Greece + Location: 25,86 + Actor549: agun + Owner: Greece + Location: 13,88 + Actor550: pris + Owner: Greece + Location: 35,83 + Actor551: pris + Owner: Greece + Location: 16,67 + Actor552: pris + Owner: Greece + Location: 9,67 + Actor553: split2 + Owner: Neutral + Location: 89,50 + Actor554: split2 + Owner: Neutral + Location: 91,55 + Actor555: split2 + Owner: Neutral + Location: 93,51 + Actor556: brik + Owner: Greece + Location: 56,88 + Actor557: brik + Owner: Greece + Location: 62,88 + Actor558: brik + Owner: Greece + Location: 62,89 + Actor559: brik + Owner: Greece + Location: 63,88 + Actor560: brik + Owner: Greece + Location: 63,89 + Actor561: brik + Owner: Greece + Location: 56,89 + Actor562: brik + Owner: Greece + Location: 55,88 + Actor563: brik + Owner: Greece + Location: 55,89 + Actor564: brik + Owner: Greece + Location: 54,88 + Actor565: brik + Owner: Greece + Location: 53,88 + Actor566: brik + Owner: Greece + Location: 53,89 + Actor567: brik + Owner: Greece + Location: 52,89 + Actor568: brik + Owner: Greece + Location: 52,88 + Actor569: brik + Owner: Greece + Location: 64,88 + Actor570: brik + Owner: Greece + Location: 65,88 + Actor571: brik + Owner: Greece + Location: 65,89 + Actor572: brik + Owner: Greece + Location: 66,89 + Actor573: brik + Owner: Greece + Location: 66,88 + Actor574: brik + Owner: Greece + Location: 66,90 + Actor575: brik + Owner: Greece + Location: 66,91 + Actor576: brik + Owner: Greece + Location: 66,92 + Actor577: brik + Owner: Greece + Location: 66,93 + Actor578: brik + Owner: Greece + Location: 66,94 + Actor579: brik + Owner: Greece + Location: 66,95 + Actor580: brik + Owner: Greece + Location: 66,96 + Actor581: apwr + Owner: Greece + Location: 63,93 + Actor582: apwr + Owner: Greece + Location: 60,93 + Actor584: apwr + Owner: Greece + Location: 53,93 + Actor585: apwr + Owner: Greece + Location: 56,93 + Actor583: apwr + Owner: Greece + Location: 63,90 + Actor586: apwr + Owner: Greece + Location: 53,90 + Actor587: brik + Owner: Greece + Location: 52,90 + Actor588: brik + Owner: Greece + Location: 52,91 + Actor589: brik + Owner: Greece + Location: 52,92 + Actor590: brik + Owner: Greece + Location: 52,93 + Actor591: brik + Owner: Greece + Location: 52,95 + Actor592: brik + Owner: Greece + Location: 52,94 + Actor593: brik + Owner: Greece + Location: 52,96 + Actor594: brik + Owner: Greece + Location: 53,96 + Actor595: brik + Owner: Greece + Location: 54,96 + Actor596: brik + Owner: Greece + Location: 55,96 + Actor597: brik + Owner: Greece + Location: 56,96 + Actor598: brik + Owner: Greece + Location: 57,96 + Actor599: brik + Owner: Greece + Location: 58,96 + Actor600: brik + Owner: Greece + Location: 59,96 + Actor601: brik + Owner: Greece + Location: 60,96 + Actor602: brik + Owner: Greece + Location: 61,96 + Actor603: brik + Owner: Greece + Location: 62,96 + Actor604: brik + Owner: Greece + Location: 63,96 + Actor605: brik + Owner: Greece + Location: 64,96 + Actor606: brik + Owner: Greece + Location: 65,96 + Actor607: pris + Owner: Greece + Location: 54,89 + Actor608: pris + Owner: Greece + Location: 64,89 + Actor609: gun + Owner: Greece + Location: 55,87 + Actor610: gun + Owner: Greece + Location: 63,87 + Actor611: agun + Owner: Greece + Location: 57,91 + TurretFacing: 158 + Actor612: agun + Owner: Greece + Location: 61,91 + Actor613: proc + Owner: Greece + Location: 5,67 + Actor614: silo + Owner: Greece + Location: 7,67 + Actor615: silo + Owner: Greece + Location: 5,67 + Actor616: proc + Owner: Greece + Location: 60,72 + Actor617: silo + Owner: Greece + Location: 60,72 + Actor619: silo + Owner: Greece + Location: 62,72 + Actor620: sbag + Owner: Greece + Location: 59,75 + Actor621: sbag + Owner: Greece + Location: 59,74 + Actor622: sbag + Owner: Greece + Location: 59,77 + Actor623: sbag + Owner: Greece + Location: 59,76 + Actor624: sbag + Owner: Greece + Location: 59,73 + Actor625: sbag + Owner: Greece + Location: 59,72 + Actor626: sbag + Owner: Greece + Location: 59,71 + Actor627: sbag + Owner: Greece + Location: 60,71 + Actor628: sbag + Owner: Greece + Location: 62,71 + Actor629: sbag + Owner: Greece + Location: 61,71 + Actor630: sbag + Owner: Greece + Location: 63,71 + Actor631: sbag + Owner: Greece + Location: 64,71 + Actor632: sbag + Owner: Greece + Location: 60,77 + Actor633: sbag + Owner: Greece + Location: 61,77 + Actor634: sbag + Owner: Greece + Location: 62,77 + Actor635: sbag + Owner: Greece + Location: 63,77 + Actor636: sbag + Owner: Greece + Location: 64,77 + Actor637: sbag + Owner: Greece + Location: 68,71 + Actor638: sbag + Owner: Greece + Location: 69,71 + Actor639: sbag + Owner: Greece + Location: 70,71 + Actor640: sbag + Owner: Greece + Location: 70,72 + Actor641: sbag + Owner: Greece + Location: 70,73 + Actor642: sbag + Owner: Greece + Location: 70,74 + Actor643: sbag + Owner: Greece + Location: 70,75 + Actor644: sbag + Owner: Greece + Location: 70,76 + Actor645: sbag + Owner: Greece + Location: 70,77 + Actor646: sbag + Owner: Greece + Location: 69,77 + Actor647: sbag + Owner: Greece + Location: 68,77 + Actor648: tent + Owner: Greece + Location: 68,72 + Actor649: gun + Owner: Greece + Location: 63,70 + Actor650: gun + Owner: Greece + Location: 69,70 + Actor651: pbox + Owner: Greece + Location: 66,68 + Actor657: pbox + Owner: Greece + Location: 67,81 + Actor652: split2 + Owner: Neutral + Location: 55,73 + Actor653: split2 + Owner: Neutral + Location: 58,69 + Actor654: split2 + Owner: Neutral + Location: 55,67 + Actor655: split2 + Owner: Neutral + Location: 6,62 + Actor656: split2 + Owner: Neutral + Location: 4,58 + Actor659: split2 + Owner: Neutral + Location: 74,90 + Actor660: split2 + Owner: Neutral + Location: 78,89 + Actor661: gap + Owner: Greece + Location: 9,70 + Actor662: gap + Owner: Greece + Location: 27,84 + Actor663: gap + Owner: Greece + Location: 12,81 + Actor664: gap + Owner: Greece + Location: 45,61 + Actor665: gap + Owner: Greece + Location: 59,90 + Actor666: gap + Owner: Greece + Location: 65,74 + Actor667: gap + Owner: Greece + Location: 48,71 + Actor668: htur + Owner: Greece + Location: 45,64 + TurretFacing: 864 + Actor669: gun + Owner: Greece + Location: 32,55 + TurretFacing: 808 + Actor670: e1 + Owner: Greece + SubCell: 3 + Location: 68,78 + Facing: 674 + Actor671: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 68,75 + Actor672: e1 + Owner: Greece + SubCell: 3 + Location: 64,70 + Facing: 174 + Actor673: e1 + Owner: Greece + SubCell: 3 + Location: 67,68 + Facing: 0 + Actor674: e1 + Owner: Greece + SubCell: 3 + Location: 71,74 + Facing: 0 + Actor675: e1 + Owner: Greece + SubCell: 3 + Location: 84,77 + Facing: 126 + Actor676: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 84,82 + Actor677: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 37,82 + Actor678: e1 + Owner: Greece + SubCell: 3 + Location: 39,77 + Facing: 384 + Actor679: e1 + Owner: Greece + SubCell: 3 + Location: 32,84 + Facing: 594 + Actor680: e1 + Owner: Greece + SubCell: 3 + Location: 28,82 + Facing: 578 + Actor681: e1 + Owner: Greece + Location: 28,82 + SubCell: 1 + Facing: 134 + Actor682: e1 + Owner: Greece + SubCell: 3 + Location: 26,82 + Facing: 158 + Actor683: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 27,80 + Actor684: e1 + Owner: Greece + SubCell: 3 + Location: 29,76 + Facing: 384 + Actor685: e1 + Owner: Greece + SubCell: 3 + Location: 22,73 + Facing: 515 + Actor686: e1 + Owner: Greece + SubCell: 3 + Location: 16,72 + Facing: 634 + Actor687: e1 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 11,73 + Actor688: e1 + Owner: Greece + SubCell: 3 + Location: 9,80 + Facing: 682 + Actor691: weap + Owner: Greece + Location: 30,75 + Actor692: t10 + Owner: Neutral + Location: 76,65 + Actor693: tc05 + Owner: Neutral + Location: 59,50 + Actor694: tc02 + Owner: Neutral + Location: 50,57 + Actor695: t16 + Owner: Neutral + Location: 89,62 + Actor696: t12 + Owner: Neutral + Location: 71,62 + Actor697: t05 + Owner: Neutral + Location: 76,73 + Actor698: t11 + Owner: Neutral + Location: 94,70 + Actor699: t07 + Owner: Neutral + Location: 52,78 + Actor700: tc01 + Owner: Neutral + Location: 70,80 + Actor701: t16 + Owner: Neutral + Location: 47,78 + Actor702: t11 + Owner: Neutral + Location: 45,76 + Actor703: t12 + Owner: Neutral + Location: 47,85 + Actor704: tc04 + Owner: Neutral + Location: 33,68 + Actor705: t13 + Owner: Neutral + Location: 23,54 + Actor706: t15 + Owner: Neutral + Location: 40,46 + Actor707: tc01 + Owner: Neutral + Location: 45,45 + Actor708: t11 + Owner: Neutral + Location: 31,46 + Actor709: tc02 + Owner: Neutral + Location: 19,47 + Actor710: t02 + Owner: Neutral + Location: 24,46 + Actor713: t07 + Owner: Neutral + Location: 55,46 + Actor714: tc01 + Owner: Neutral + Location: 62,46 + Actor715: tc04 + Owner: Neutral + Location: 92,68 + Actor716: t07 + Owner: Neutral + Location: 91,70 + Actor717: t01 + Owner: Neutral + Location: 63,52 + Actor718: t05 + Owner: Neutral + Location: 58,51 + Actor719: t13 + Owner: Neutral + Location: 59,53 + Actor720: t12 + Owner: Neutral + Location: 50,59 + Actor721: t10 + Owner: Neutral + Location: 48,61 + Actor722: t05 + Owner: Neutral + Location: 43,60 + Actor723: t07 + Owner: Neutral + Location: 47,68 + Actor724: t02 + Owner: Neutral + Location: 48,66 + Actor725: tc01 + Owner: Neutral + Location: 34,91 + Actor726: t05 + Owner: Neutral + Location: 36,90 + Actor727: t07 + Owner: Neutral + Location: 43,94 + Actor728: t06 + Owner: Neutral + Location: 42,89 + Actor729: t02 + Owner: Neutral + Location: 17,94 + Actor730: t13 + Owner: Neutral + Location: 16,92 + Actor731: t15 + Owner: Neutral + Location: 20,94 + Actor732: t05 + Owner: Neutral + Location: 10,94 + Actor733: t07 + Owner: Neutral + Location: 3,79 + Actor734: t01 + Owner: Neutral + Location: 18,55 + Actor735: t15 + Owner: Neutral + Location: 15,57 + Actor736: t07 + Owner: Neutral + Location: 36,54 + Church: v01 + Owner: Neutral + Location: 4,30 + Actor737: v04 + Owner: Neutral + Location: 3,26 + Actor738: v11 + Owner: Neutral + Location: 2,33 + Actor739: v07 + Owner: Neutral + Location: 23,29 + Actor740: medi + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 27,81 + Actor741: enfo + Owner: Greece + SubCell: 3 + Location: 25,74 + Facing: 512 + Actor742: enfo + Owner: Greece + SubCell: 3 + Location: 27,74 + Facing: 512 + Actor743: enfo + Owner: Greece + SubCell: 3 + Location: 57,88 + Facing: 0 + Actor744: enfo + Owner: Greece + SubCell: 3 + Location: 61,88 + Facing: 0 + Actor745: e3 + Owner: Greece + Facing: 384 + Location: 87,77 + SubCell: 3 + Actor746: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 89,82 + Actor747: e3 + Owner: Greece + SubCell: 3 + Location: 69,76 + Facing: 610 + Actor748: e3 + Owner: Greece + SubCell: 3 + Location: 68,69 + Facing: 0 + Actor749: e3 + Owner: Greece + Facing: 384 + Location: 60,47 + Actor750: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 48,50 + Actor751: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 44,63 + Actor752: e3 + Owner: Greece + Location: 39,77 + SubCell: 1 + Facing: 911 + Actor753: e3 + Owner: Greece + SubCell: 3 + Location: 38,82 + Facing: 650 + Actor754: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 10,72 + Actor755: e3 + Owner: Greece + SubCell: 3 + Location: 8,81 + Facing: 594 + Actor756: ptnk + Owner: Greece + Location: 38,85 + Facing: 753 + Actor757: arty + Owner: Greece + Location: 45,63 + Facing: 880 + Actor758: arty + Owner: Greece + Location: 48,68 + Facing: 888 + Actor759: 2tnk + Owner: Greece + Location: 16,63 + Facing: 904 + Actor760: 2tnk + Owner: Greece + Location: 40,81 + Facing: 769 + Actor761: 1tnk + Owner: Greece + Location: 82,79 + Facing: 118 + Actor762: minv + Owner: Greece + Location: 79,7 + Actor763: minv + Owner: Greece + Location: 79,6 + Actor764: minv + Owner: Greece + Location: 79,8 + Actor765: minv + Owner: Greece + Location: 89,16 + Actor766: minv + Owner: Greece + Location: 88,16 + Actor767: minv + Owner: Greece + Location: 90,16 + Actor768: 2tnk + Owner: Greece + Location: 20,15 + Facing: 618 + Actor769: 2tnk + Owner: Greece + Location: 25,10 + Facing: 650 + Actor770: arty + Owner: Greece + Location: 22,12 + Facing: 650 + Actor771: jeep + Owner: Greece + Facing: 384 + Location: 77,26 + Actor772: jeep + Owner: Greece + Facing: 384 + Location: 26,14 + Actor773: e1 + Owner: Greece + Location: 17,12 + Facing: 515 + Actor774: e1 + Owner: Greece + SubCell: 3 + Location: 21,5 + Facing: 650 + Actor775: e1 + Owner: Greece + SubCell: 3 + Location: 19,5 + Facing: 793 + Actor776: e1 + Owner: Greece + SubCell: 3 + Location: 25,4 + Facing: 753 + Actor777: e1 + Owner: Greece + SubCell: 3 + Location: 24,11 + Facing: 666 + Actor778: e1 + Owner: Greece + SubCell: 3 + Location: 26,12 + Facing: 666 + Actor779: e1 + Owner: Greece + SubCell: 3 + Location: 23,15 + Facing: 570 + Actor780: e3 + Owner: Greece + SubCell: 3 + Location: 21,14 + Facing: 539 + Actor781: e3 + Owner: Greece + Location: 25,11 + SubCell: 3 + Facing: 816 + Actor782: medi + Owner: Greece + SubCell: 3 + Location: 22,14 + Facing: 384 + Actor783: jeep + Owner: Greece + Location: 75,58 + Facing: 904 + Actor784: jeep + Owner: Greece + Location: 77,59 + Facing: 904 + Actor785: ptnk + Owner: Greece + Location: 11,62 + Facing: 927 + Actor786: e1 + Owner: Greece + SubCell: 3 + Location: 17,64 + Facing: 959 + Actor787: e1 + Owner: Greece + SubCell: 3 + Facing: 959 + Location: 12,61 + Actor788: e1 + Owner: Greece + SubCell: 3 + Facing: 959 + Location: 11,60 + Actor789: e1 + Owner: Greece + SubCell: 3 + Facing: 959 + Location: 22,55 + Actor790: e1 + Owner: Greece + SubCell: 3 + Location: 18,50 + Facing: 650 + Actor791: agun + Owner: Greece + TurretFacing: 1023 + Location: 35,46 + Actor792: agun + Owner: Greece + TurretFacing: 1023 + Location: 27,48 + Actor793: agun + Owner: Greece + TurretFacing: 1023 + Location: 17,48 + Actor796: atek + Owner: Greece + Location: 9,76 + Actor797: pdox + Owner: Greece + Location: 5,77 + Actor795: chain + Owner: Greece + Location: 4,76 + Actor798: chain + Owner: Greece + Location: 4,77 + Actor799: chain + Owner: Greece + Location: 4,78 + Actor800: chain + Owner: Greece + Location: 5,76 + Actor801: chain + Owner: Greece + Location: 6,76 + Actor802: chain + Owner: Greece + Location: 7,76 + Actor803: chain + Owner: Greece + Location: 7,78 + Actor804: chain + Owner: Greece + Location: 7,77 + Actor805: chain + Owner: Greece + Location: 4,79 + Actor806: chain + Owner: Greece + Location: 6,79 + Actor807: chain + Owner: Greece + Location: 5,79 + Actor808: chain + Owner: Greece + Location: 7,79 + Actor820: camera + Owner: Greece + Location: 79,28 + Actor821: camera + Owner: Greece + Location: 61,28 + Actor822: camera + Owner: Greece + Location: 45,21 + Actor823: camera + Owner: Greece + Location: 32,27 + Actor824: camera + Owner: Greece + Location: 12,27 + Actor825: camera + Owner: Greece + Location: 16,9 + Actor826: camera + Owner: Greece + Location: 43,9 + Actor827: camera + Owner: Greece + Location: 65,6 + Actor828: camera + Owner: Greece + Location: 82,4 + Actor829: camera + Owner: Greece + Location: 68,54 + Actor830: camera + Owner: Greece + Location: 83,65 + Path1_1: waypoint + Owner: Neutral + Location: 42,79 + Path2_1: waypoint + Owner: Neutral + Location: 17,60 + Path1_2: waypoint + Owner: Neutral + Location: 65,79 + Path2_2: waypoint + Owner: Neutral + Location: 41,54 + LandingCraftSpawn: waypoint + Owner: Neutral + Location: 96,39 + LandingCraftRally: waypoint + Owner: Neutral + Location: 43,36 + CruiserSpawn: waypoint + Owner: Neutral + Location: 1,40 + CruiserPatrol1: waypoint + Owner: Neutral + Location: 6,40 + ChronoDest1: waypoint + Owner: Neutral + Location: 5,32 + ChronoDest2: waypoint + Owner: Neutral + Location: 30,31 + ChronoDest3: waypoint + Owner: Neutral + Location: 53,32 + ChronoDest4: waypoint + Owner: Neutral + Location: 72,31 + ChronoDest5: waypoint + Owner: Neutral + Location: 92,28 + ChronoDest6: waypoint + Owner: Neutral + Location: 79,3 + ChronoDest7: waypoint + Owner: Neutral + Location: 60,12 + ChronoDest8: waypoint + Owner: Neutral + Location: 46,7 + ChronoDest9: waypoint + Owner: Neutral + Location: 2,16 + Actor831: 3tnk + Owner: USSR + Facing: 384 + Location: 86,5 + Actor832: 3tnk + Owner: USSR + Facing: 384 + Location: 92,11 + McvSpawn: waypoint + Owner: Neutral + Location: 96,1 + McvRally: waypoint + Owner: Neutral + Location: 89,8 + SubSpawn1: waypoint + Owner: Neutral + Location: 96,38 + SubSpawn2: waypoint + Owner: Neutral + Location: 96,40 + SubRally1: waypoint + Owner: Neutral + Location: 47,38 + SubRally2: waypoint + Owner: Neutral + Location: 47,40 + Actor833: dd + Owner: Greece + Location: 84,41 + Facing: 785 + AlliedOutpost: waypoint + Owner: Neutral + Location: 19,7 + TopPathTopLeft: waypoint + Owner: Neutral + Location: 49,1 + BottomPathTopLeft: waypoint + Owner: Neutral + Location: 51,20 + BottomPathBottomRight: waypoint + Owner: Neutral + Location: 92,36 + PlayerStart: waypoint + Owner: Neutral + Location: 88,9 + TopPathBottomRight: waypoint + Owner: Neutral + Location: 76,14 + PrisonerSpawn: waypoint + Owner: Neutral + Location: 26,70 + ProdigyRally: waypoint + Owner: Neutral + Location: 25,71 + YuriRally: waypoint + Owner: Neutral + Location: 27,71 + Actor835: apwr + Owner: Greece + Location: 7,82 + Actor836: apwr + Owner: Greece + Location: 14,82 + Actor837: apwr + Owner: Greece + Location: 17,81 + Actor838: powr + Owner: Greece + Location: 10,88 + CruiserPatrol2: waypoint + Owner: Neutral + Location: 91,40 + ChronoTankSpawn: waypoint + Owner: Neutral + Location: 1,73 + ChronoTankRally: waypoint + Owner: Neutral + Location: 13,75 + ChronoDest10: waypoint + Owner: Neutral + Location: 93,48 + ChronoDest12: waypoint + Owner: Neutral + Location: 89,89 + ChronoDest11: waypoint + Owner: Neutral + Location: 82,71 + Actor811: mdrn + Owner: GDI + SubCell: 3 + Location: 28,69 + Facing: 317 + Actor812: mdrn + Owner: GDI + Location: 24,69 + SubCell: 3 + Facing: 682 + Actor813: mdrn + Owner: GDI + SubCell: 3 + Location: 26,68 + Facing: 555 + Actor814: mdrn + Owner: GDI + SubCell: 3 + Facing: 848 + Location: 24,71 + Actor815: mdrn + Owner: GDI + SubCell: 3 + Facing: 237 + Location: 28,71 + Actor816: mdrn + Owner: GDI + SubCell: 3 + Location: 26,72 + Facing: 0 + Actor818: htnk.drone + Owner: GDI + Location: 28,76 + Facing: 512 + Actor817: htnk.drone + Owner: GDI + Facing: 512 + Location: 24,76 + Actor819: split2 + Owner: Neutral + Location: 7,56 + Actor849: gun + Owner: Greece + TurretFacing: 0 + Location: 4,50 + Actor850: sbag + Owner: Greece + Location: 3,51 + Actor851: sbag + Owner: Greece + Location: 4,51 + Actor852: sbag + Owner: Greece + Location: 5,51 + Actor853: sbag + Owner: Greece + Location: 3,52 + Actor854: agun + Owner: Greece + TurretFacing: 1023 + Location: 4,52 + Actor855: sbag + Owner: Greece + Location: 5,52 + Actor856: mgg + Owner: Greece + Facing: 384 + Location: 2,53 + Actor857: sbag + Owner: Greece + Location: 3,53 + Actor858: sbag + Owner: Greece + Location: 4,53 + Actor859: sbag + Owner: Greece + Location: 5,53 + AlliedNavalYard: syrd + Owner: Greece + Location: 10,45 + Actor834: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 4,67 + Actor839: e3 + Owner: Greece + SubCell: 3 + Location: 21,68 + Facing: 0 + Actor840: e3 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 8,67 + Actor841: e3 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 24,60 + Actor842: e3 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 22,58 + Actor843: e3 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 15,57 + Actor844: e3 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 17,55 + Actor845: e3 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 9,51 + Actor846: e3 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 12,50 + Actor847: e3 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 20,49 + Actor848: e3 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 22,47 + Actor860: e3 + Owner: Greece + SubCell: 3 + Location: 16,50 + Facing: 293 + Actor861: ifv + Owner: Greece + Location: 17,56 + Facing: 0 + Actor862: ifv + Owner: Greece + Location: 10,54 + Facing: 0 + Actor863: ifv + Owner: Greece + Location: 18,69 + Facing: 0 + Actor864: ifv + Owner: Greece + Location: 6,72 + Facing: 768 + Actor866: e3 + Owner: Greece + Facing: 384 + SubCell: 3 + Location: 19,65 + Actor867: ifv + Owner: Greece + Facing: 768 + Location: 32,89 + Actor868: ifv + Owner: Greece + Facing: 768 + Location: 33,83 + Actor869: ifv + Owner: Greece + Location: 10,86 + Facing: 512 + Actor870: ifv + Owner: Greece + Location: 17,84 + Facing: 768 + Actor871: ifv + Owner: Greece + Facing: 768 + Location: 11,82 + Actor872: dd + Owner: Greece + Location: 13,44 + Facing: 896 + Actor873: dd + Owner: Greece + Location: 10,43 + TurretFacing@PRIMARY: 0 + Facing: 896 + Actor874: camera + Owner: Greece + Location: 23,17 + Actor875: minv + Owner: Greece + Location: 73,6 + Actor876: minv + Owner: Greece + Location: 70,8 + Actor877: minv + Owner: Greece + Location: 62,7 + Actor878: minv + Owner: Greece + Location: 62,4 + Actor879: minv + Owner: Greece + Location: 55,7 + Actor880: minv + Owner: Greece + Location: 52,6 + Actor881: minv + Owner: Greece + Location: 61,6 + Actor882: minv + Owner: Greece + Location: 91,20 + Actor884: minv + Owner: Greece + Location: 84,23 + Actor885: minv + Owner: Greece + Location: 85,27 + Actor886: minv + Owner: Greece + Location: 79,25 + Actor887: minv + Owner: Greece + Location: 74,25 + Actor888: minv + Owner: Greece + Location: 71,29 + Actor890: minv + Owner: Greece + Location: 58,30 + Actor891: minv + Owner: Greece + Location: 57,27 + Actor892: minv + Owner: Greece + Location: 64,28 + Actor889: minv + Owner: Greece + Location: 82,24 + WeatherControl: weat + Owner: Greece + Location: 2,77 + Actor893: chain + Owner: Greece + Location: 2,76 + Actor894: chain + Owner: Greece + Location: 1,76 + Actor895: chain + Owner: Greece + Location: 1,77 + Actor896: chain + Owner: Greece + Location: 1,78 + Actor897: chain + Owner: Greece + Location: 1,79 + Actor898: chain + Owner: Greece + Location: 2,79 + Actor899: chain + Owner: Greece + Location: 3,79 + Actor900: chain + Owner: Greece + Location: 3,76 + Actor901: agun + Owner: Greece + Location: 6,82 + Actor902: agun + Owner: Greece + Location: 2,74 + Actor267: fact + Owner: Greece + Location: 18,84 + Actor903: agun + Owner: Greece + Location: 19,88 + Actor865: ifv + Owner: Greece + Facing: 768 + Location: 25,84 + Actor904: apwr + Owner: Greece + Location: 21,80 + Actor905: powr + Owner: Greece + Location: 24,81 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, jailbreak-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/main-campaign/ca39-jailbreak/yuri_released.aud b/mods/ca/missions/main-campaign/ca39-jailbreak/yuri_released.aud new file mode 100644 index 0000000000..d00abd66e1 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca39-jailbreak/yuri_released.aud differ diff --git a/mods/ca/missions/main-campaign/ca39-jailbreak/yuri_releasedwin.aud b/mods/ca/missions/main-campaign/ca39-jailbreak/yuri_releasedwin.aud new file mode 100644 index 0000000000..65a6cfbb95 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca39-jailbreak/yuri_releasedwin.aud differ diff --git a/mods/ca/missions/main-campaign/ca40-conduit/conduit-rules.yaml b/mods/ca/missions/main-campaign/ca40-conduit/conduit-rules.yaml new file mode 100644 index 0000000000..9be7b59412 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca40-conduit/conduit-rules.yaml @@ -0,0 +1,33 @@ + +^Palettes: + TintPostProcessEffect: + +^BaseWorld: + TerrainLighting: + +World: + LuaScript: + Scripts: campaign.lua, conduit.lua + MissionData: + Briefing: Much to our surprise, a Scrin creature of immense psionic power—the so-called Prodigy who usurped our control of Kane's cyborgs—had been imprisoned alongside Yuri.\n\nWhile incarcerated, Yuri was able to communicate with this creature and he believes that joining forces with its master, the Scrin Overlord, could be of great mutual benefit.\n\nIf GDI sources are to be believed, the terrorist Kane has caused the Overlord much grief; inciting a civil war and threatening the Overlord's millennia long grip on power. Our assistance at this pivotal moment would make the Overlord indebted to us, and we would surely be greatly rewarded.\n\nKane's delusional crusade must be stopped. We must seize this opportunity, and bring peace and stability back to not one, but two civilizations. With the Overlord's support, we will have the power to destroy our enemies once and for all, and an era of Soviet supremacy will finally be upon us.\n\nAs multiple gateways to their homeworld remain open, the Scrin Prodigy has been able to communicate with his master. The loyalists have suffered a major defeat, and it seems Kane is preparing to return to Earth with his vast cyborg army, while the Scrin rebels continue to eat away at the Overlord's remaining forces.\n\nOur goal is simple; assault the Nod base where the gateway has been prepared for Kane's return, and cut off his escape route. In the meantime, preparations are underway for our own forces to travel through the gateway, so that we may turn the tide of the war in the Overlord's favour. + MapOptions: + ShortGameCheckboxEnabled: False + MusicPlaylist: + StartingMusic: indeep + +Player: + PlayerResources: + DefaultCash: 6000 + +WORMHOLEXL: + TerrainLightSource: + Range: 3c0 + Intensity: 0.5 + RedTint: 1 + +substrike.spawner: + Inherits: ^WeaponDetonaterDummy + PeriodicExplosion: + Weapon: SubterraneanStrikeSpawner + EditorOnlyTooltip: + Name: Subterranean Strike Spawner diff --git a/mods/ca/missions/main-campaign/ca40-conduit/conduit.lua b/mods/ca/missions/main-campaign/ca40-conduit/conduit.lua new file mode 100644 index 0000000000..47982246c1 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca40-conduit/conduit.lua @@ -0,0 +1,373 @@ +MissionDir = "ca|missions/main-campaign/ca40-conduit" + +TimeLimit = { + normal = DateTime.Minutes(75), + hard = DateTime.Minutes(45), + vhard = DateTime.Minutes(45), + brutal = DateTime.Minutes(45) +} + +CyborgSquad = { "rmbc", "rmbc", "enli", "tplr", "tplr", "tplr", "reap", "n1c", "n1c", "n1c", "n1c", "n1c", "n3c", "n3c" } + +CyborgSquadInterval = { + normal = DateTime.Minutes(2), + hard = DateTime.Minutes(1), + vhard = DateTime.Minutes(1), + brutal = DateTime.Minutes(1) +} + +ClusterMissileEnabledTime = { + easy = DateTime.Seconds((60 * 16) + 37), + normal = DateTime.Seconds((60 * 12) + 37), + hard = DateTime.Seconds((60 * 10) + 37), + vhard = DateTime.Seconds((60 * 8) + 37), + brutal = DateTime.Seconds((60 * 8) + 37) +} + +AdjustedNodCompositions = AdjustCompositionsForDifficulty(UnitCompositions.Nod) + +Squads = { + Main1 = { + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 20, Max = 40 }), + ActiveCondition = function() + return NodEastOrWestNeutralized() + end, + FollowLeader = true, + DispatchDelay = DateTime.Seconds(15), + Compositions = AdjustedNodCompositions, + AttackPaths = { + { NodRally1.Location }, + { NodRally2.Location }, + { NodRally3.Location }, + { NodRally4.Location }, + { NodRally5.Location }, + { NodRally6.Location }, + }, + }, + Main2 = { + Delay = AdjustDelayForDifficulty(DateTime.Minutes(4)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 20, Max = 40 }), + FollowLeader = true, + DispatchDelay = DateTime.Seconds(15), + Compositions = AdjustedNodCompositions, + AttackPaths = { + { NodRally4.Location }, + { NodRally5.Location }, + { NodRally6.Location }, + }, + }, + Main3 = { + Delay = AdjustDelayForDifficulty(DateTime.Minutes(6)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 20, Max = 40 }), + FollowLeader = true, + DispatchDelay = DateTime.Seconds(15), + Compositions = AdjustedNodCompositions, + AttackPaths = { + { NodRally1.Location }, + { NodRally2.Location }, + { NodRally3.Location }, + { NodRally4.Location }, + }, + }, + Air = { + Delay = AdjustAirDelayForDifficulty(DateTime.Minutes(13)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 12, Max = 12 }), + Compositions = AirCompositions.Nod, + }, + AntiHeavyAir = AntiHeavyAirSquad({ "scrn" }, AdjustAirDelayForDifficulty(DateTime.Minutes(10))), + AirToAir = AirToAirSquad({ "scrn", "apch", "venm" }, AdjustAirDelayForDifficulty(DateTime.Minutes(10))), +} + +-- Setup and Tick + +SetupPlayers = function() + USSR = Player.GetPlayer("USSR") + Nod1 = Player.GetPlayer("Nod1") + Nod2 = Player.GetPlayer("Nod2") + Nod3 = Player.GetPlayer("Nod3") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = { USSR } + MissionEnemies = { Nod1, Nod2, Nod3 } +end + +WorldLoaded = function() + SetupPlayers() + + if Difficulty ~= "easy" then + TimerTicks = TimeLimit[Difficulty] + end + + if IsNormalOrBelow() then + ICBMSub1.Destroy() + + if Difficulty == "easy" then + ICBMSub2.Destroy() + end + end + + Camera.Position = PlayerStart.CenterPosition + + InitObjectives(USSR) + AdjustPlayerStartingCashForDifficulty() + InitNod() + + ObjectiveSecureGateway = USSR.AddObjective("Eliminate Nod forces near gateway.") + + Trigger.OnAllKilledOrCaptured({ NodEastAirstrip, NodEastHand }, function() + InitNodSouth() + end) + + Trigger.OnAllKilledOrCaptured({ NodWestAirstrip, NodWestHand }, function() + InitNodSouth() + end) + + Trigger.OnKilledOrCaptured(MainTemple, function() + MainTempleKilledOrCaptured = true + end) + + SetupSubterraneanStrikes() + AfterWorldLoaded() +end + +Tick = function() + OncePerSecondChecks() + OncePerFiveSecondChecks() + OncePerThirtySecondChecks() + AfterTick() +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + Nod1.Resources = Nod1.ResourceCapacity - 500 + + if Difficulty ~= "easy" and TimerTicks > 0 then + if TimerTicks > 25 then + TimerTicks = TimerTicks - 25 + UserInterface.SetMissionText("Kane's forces will begin returning in " .. UtilsCA.FormatTimeForGameSpeed(TimerTicks), HSLColor.Yellow) + else + TimerTicks = 0 + UserInterface.SetMissionText("") + InitKaneReturn() + end + end + + if MissionPlayersHaveNoRequiredUnits() then + if not USSR.IsObjectiveCompleted(ObjectiveSecureGateway) then + USSR.MarkFailedObjective(ObjectiveSecureGateway) + end + end + end +end + +OncePerFiveSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 125 == 0 then + UpdatePlayerBaseLocations() + + if MainTempleKilledOrCaptured then + local nodForces = Map.ActorsInBox(NodMainTopLeft.CenterPosition, NodMainBottomRight.CenterPosition, function(a) + return a.Owner == Nod1 and not a.IsDead and a.HasProperty("Health") and a.Type ~= "brik" + end) + + if #nodForces == 0 and not USSR.IsObjectiveCompleted(ObjectiveSecureGateway) then + USSR.MarkCompletedObjective(ObjectiveSecureGateway) + end + end + end +end + +OncePerThirtySecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % DateTime.Seconds(30) == 0 then + CalculatePlayerCharacteristics() + end +end + +-- Functions + +InitNod = function() + NodPlayers = { Nod1, Nod2, Nod3 } + + Utils.Do(NodPlayers, function(p) + AutoRepairAndRebuildBuildings(p) + SetupRefAndSilosCaptureCredits(p) + AutoReplaceHarvesters(p) + AutoRebuildConyards(p) + InitAiUpgrades(p) + + local nodGroundAttackers = p.GetGroundAttackers() + + Utils.Do(nodGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsNodGroundHunterUnit) + end) + end) + + InitAttackSquad(Squads.Main2, Nod2) + InitAttackSquad(Squads.Main3, Nod3) + InitAirAttackSquad(Squads.Air, Nod1) + + if IsHardOrAbove() then + InitAirAttackSquad(Squads.AntiHeavyAir, Nod1, MissionPlayers, { "4tnk", "4tnk.atomic", "apoc", "apoc.atomic", "ovld", "ovld.atomic" }) + InitAirAttackSquad(Squads.AirToAir, Nod1, MissionPlayers, { "Aircraft" }, "ArmorType") + end + + Trigger.AfterDelay(ClusterMissileEnabledTime[Difficulty], function() + Actor.Create("ai.minor.superweapons.enabled", true, { Owner = Nod1 }) + end) +end + +InitNodSouth = function() + InitAttackSquad(Squads.Main1, Nod1) +end + +NodEastOrWestNeutralized = function() + local westCount = Nod2.GetActorsByTypes({ "airs", "hand" }) + local eastCount = Nod3.GetActorsByTypes({ "airs", "hand" }) + return #westCount == 0 or #eastCount == 0 +end + +InitKaneReturn = function() + if not KaneReturnInitiated then + KaneReturnInitiated = true + Media.DisplayMessage("The Overlord will not be your salvation. Your empire is dead. Surrender, or be destroyed. My return will not be stopped.", "Kane", HSLColor.FromHex("FF0000")) + MediaCA.PlaySound(MissionDir .. "/kane_return.aud", 2.5) + DeployCyborgs() + end +end + +DeployCyborgs = function() + local units = Reinforcements.Reinforce(Nod1, Utils.Shuffle(CyborgSquad), { Gateway.Location }, 5) + Utils.Do(units, function(unit) + unit.Scatter() + Trigger.AfterDelay(5, function() + AssaultPlayerBaseOrHunt(unit) + end) + end) + Trigger.AfterDelay(CyborgSquadInterval[Difficulty], DeployCyborgs) +end + +SetupSubterraneanStrikes = function() + + -- Subterranean Strikes + local subStrike1Spawns = { SubStrike1_1.Location } + + if Difficulty ~= "easy" then + table.insert(subStrike1Spawns, SubStrike1_3.Location) + + if IsHardOrAbove() then + subStrike1Spawns = Utils.Concat(subStrike1Spawns, { SubStrike1_2.Location, SubStrike1_4.Location }) + end + end + + local subStrike2Spawns = { SubStrike2_1.Location } + + if Difficulty ~= "easy" then + table.insert(subStrike2Spawns, SubStrike2_3.Location) + + if IsHardOrAbove() then + subStrike2Spawns = Utils.Concat(subStrike2Spawns, { SubStrike2_2.Location, SubStrike2_4.Location }) + end + end + + local subStrike3Spawns = { SubStrike3_2.Location } + + if Difficulty ~= "easy" then + subStrike3Spawns = Utils.Concat(subStrike3Spawns, { SubStrike3_5.Location, SubStrike3_8.Location }) + + if IsHardOrAbove() then + subStrike3Spawns = Utils.Concat(subStrike3Spawns, { SubStrike3_1.Location, SubStrike3_3.Location, SubStrike3_4.Location, SubStrike3_6.Location, SubStrike3_7.Location, SubStrike3_9.Location }) + end + end + + local subStrike4Spawns = { SubStrike4_1.Location, SubStrike4_2.Location } + + local allSubStrikeSpawns = Utils.Concat(subStrike1Spawns, subStrike2Spawns) + allSubStrikeSpawns = Utils.Concat(allSubStrikeSpawns, subStrike3Spawns) + allSubStrikeSpawns = Utils.Concat(allSubStrikeSpawns, subStrike4Spawns) + + local leftBaseEntrance = {} + for x = 13, 19 do + table.insert(leftBaseEntrance, CPos.New(x, 54)) + end + + local rightBaseEntrance = {} + for x = 85, 91 do + table.insert(rightBaseEntrance, CPos.New(x, 11)) + end + for x = 84, 91 do + table.insert(rightBaseEntrance, CPos.New(x, 34)) + end + + Trigger.OnEnteredFootprint(leftBaseEntrance, function(a, id) + if IsMissionPlayer(a.Owner) then + Trigger.RemoveFootprintTrigger(id) + if not LeftBaseSubStrikeTriggered then + LeftBaseSubStrikeTriggered = true + Media.PlaySound("subrumble.aud") + Trigger.AfterDelay(DateTime.Seconds(3), function() + Utils.Do(subStrike1Spawns, function(s) + Trigger.AfterDelay(Utils.RandomInteger(1, 35), function() + Actor.Create("substrike.spawner", true, { Owner = Nod1, Location = s }) + end) + end) + end) + end + end + end) + + Trigger.OnEnteredFootprint(rightBaseEntrance, function(a, id) + if IsMissionPlayer(a.Owner) then + Trigger.RemoveFootprintTrigger(id) + if not RightBaseSubStrikeTriggered then + RightBaseSubStrikeTriggered = true + Media.PlaySound("subrumble.aud") + Trigger.AfterDelay(DateTime.Seconds(3), function() + Utils.Do(subStrike2Spawns, function(s) + Trigger.AfterDelay(Utils.RandomInteger(1, 35), function() + Actor.Create("substrike.spawner", true, { Owner = Nod1, Location = s }) + end) + end) + end) + end + end + end) + + Trigger.OnEnteredProximityTrigger(NodMainBaseCenter.CenterPosition, WDist.FromCells(15), function(a, id) + if IsMissionPlayer(a.Owner) and not a.HasProperty("Land") then + Trigger.RemoveProximityTrigger(id) + if not MainBaseSubStrikeTriggered then + MainBaseSubStrikeTriggered = true + Media.PlaySound("subrumble.aud") + Trigger.AfterDelay(DateTime.Seconds(3), function() + Utils.Do(subStrike3Spawns, function(s) + Trigger.AfterDelay(Utils.RandomInteger(1, 35), function() + Actor.Create("substrike.spawner", true, { Owner = Nod1, Location = s }) + end) + end) + end) + end + end + end) + + if Difficulty ~= "easy" then + Trigger.AfterDelay(DateTime.Minutes(15), function() + Utils.Do(subStrike4Spawns, function(s) + Trigger.AfterDelay(Utils.RandomInteger(1, 35), function() + Actor.Create("substrike.spawner", true, { Owner = Nod1, Location = s }) + end) + end) + end) + end + + Utils.Do(allSubStrikeSpawns, function(s) + Trigger.OnEnteredProximityTrigger(Map.CenterOfCell(s), WDist.FromCells(2), function(a, id) + if a.Owner == Nod1 and a.Type == "mole.upg" then + Trigger.RemoveProximityTrigger(id) + if not a.IsDead then + Trigger.OnPassengerExited(a, function(transport, passenger) + AssaultPlayerBaseOrHunt(passenger) + end) + end + end + end) + end) +end diff --git a/mods/ca/missions/main-campaign/ca40-conduit/kane_return.aud b/mods/ca/missions/main-campaign/ca40-conduit/kane_return.aud new file mode 100644 index 0000000000..fde731dd74 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca40-conduit/kane_return.aud differ diff --git a/mods/ca/missions/main-campaign/ca40-conduit/map.bin b/mods/ca/missions/main-campaign/ca40-conduit/map.bin new file mode 100644 index 0000000000..3248115067 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca40-conduit/map.bin differ diff --git a/mods/ca/missions/main-campaign/ca40-conduit/map.png b/mods/ca/missions/main-campaign/ca40-conduit/map.png new file mode 100644 index 0000000000..a66b38cb69 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca40-conduit/map.png differ diff --git a/mods/ca/missions/main-campaign/ca40-conduit/map.yaml b/mods/ca/missions/main-campaign/ca40-conduit/map.yaml new file mode 100644 index 0000000000..e0d1be7931 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca40-conduit/map.yaml @@ -0,0 +1,1556 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 40: Conduit + +Author: Darkademic + +Tileset: DESERT + +MapSize: 98,130 + +Bounds: 1,1,96,128 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: USSR, Nod1, Nod2, Nod3 + PlayerReference@USSR: + Name: USSR + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: soviet + LockColor: True + Color: FE1100 + LockSpawn: True + LockTeam: True + Enemies: Nod1, Nod2, Nod3, Creeps + PlayerReference@Nod1: + Name: Nod1 + Bot: campaign + Faction: nod + Color: 6D738C + Allies: Nod2, Nod3 + Enemies: USSR, Creeps + PlayerReference@Nod2: + Name: Nod2 + Bot: dormant + Faction: nod + Color: 6D738C + Allies: Nod1, Nod3 + Enemies: USSR, Creeps + PlayerReference@Nod3: + Name: Nod3 + Bot: dormant + Faction: nod + Color: 6D738C + Allies: Nod1, Nod2 + Enemies: USSR, Creeps + PlayerReference@NodGateway: + Name: NodGateway + Bot: dormant + NonCombatant: True + Faction: nod + Color: FE1100 + +Actors: + Actor0: fact + Owner: USSR + Location: 22,7 + Actor2: powr + Owner: USSR + Location: 22,3 + Actor3: fenc + Owner: USSR + Location: 23,19 + Actor4: fenc + Owner: USSR + Location: 25,19 + Actor5: fenc + Owner: USSR + Location: 22,19 + Actor6: fenc + Owner: USSR + Location: 24,19 + Actor7: fenc + Owner: USSR + Location: 25,18 + Actor8: fenc + Owner: USSR + Location: 26,18 + Actor9: fenc + Owner: USSR + Location: 29,15 + Actor10: fenc + Owner: USSR + Location: 30,15 + Actor11: fenc + Owner: USSR + Location: 31,14 + Actor12: fenc + Owner: USSR + Location: 30,14 + Actor13: fenc + Owner: USSR + Location: 32,14 + Actor14: fenc + Owner: USSR + Location: 21,19 + Actor15: ftur + Owner: USSR + Location: 24,18 + Actor16: ftur + Owner: USSR + Location: 29,14 + Actor17: btr + Owner: USSR + Location: 25,17 + Facing: 634 + Actor18: btr + Owner: USSR + Location: 27,14 + Facing: 618 + Actor19: 3tnk + Owner: USSR + Location: 26,19 + Facing: 626 + Actor20: 3tnk + Owner: USSR + Location: 30,16 + Facing: 626 + Actor24: e1 + Owner: USSR + SubCell: 3 + Location: 29,13 + Facing: 610 + Actor26: e1 + Owner: USSR + SubCell: 3 + Location: 29,11 + Facing: 713 + Actor27: e1 + Owner: USSR + SubCell: 3 + Facing: 610 + Location: 27,16 + Actor28: e1 + Owner: USSR + SubCell: 3 + Facing: 610 + Location: 24,16 + Actor29: e1 + Owner: USSR + SubCell: 3 + Facing: 610 + Location: 22,17 + Actor30: e1 + Owner: USSR + SubCell: 3 + Facing: 610 + Location: 19,15 + Actor31: e3 + Owner: USSR + SubCell: 3 + Location: 22,16 + Facing: 610 + Actor32: e3 + Owner: USSR + SubCell: 3 + Location: 26,13 + Facing: 642 + Actor33: split2 + Owner: Neutral + Location: 39,5 + Actor35: powr + Owner: USSR + Location: 24,3 + Actor34: obli + Owner: Nod1 + Location: 55,108 + Actor36: obli + Owner: Nod1 + Location: 62,108 + Actor37: brik + Owner: Nod1 + Location: 53,98 + Actor38: brik + Owner: Nod1 + Location: 53,99 + Actor39: brik + Owner: Nod1 + Location: 54,99 + Actor40: brik + Owner: Nod1 + Location: 54,98 + Actor41: brik + Owner: Nod1 + Location: 52,98 + Actor42: brik + Owner: Nod1 + Location: 51,98 + Actor43: brik + Owner: Nod1 + Location: 50,98 + Actor44: brik + Owner: Nod1 + Location: 49,98 + Actor45: brik + Owner: Nod1 + Location: 48,98 + Actor46: brik + Owner: Nod1 + Location: 47,98 + Actor47: brik + Owner: Nod1 + Location: 46,98 + Actor48: brik + Owner: Nod1 + Location: 46,99 + Actor49: brik + Owner: Nod1 + Location: 46,101 + Actor50: brik + Owner: Nod1 + Location: 46,100 + Actor51: brik + Owner: Nod1 + Location: 46,102 + Actor52: brik + Owner: Nod1 + Location: 46,104 + Actor53: brik + Owner: Nod1 + Location: 46,103 + Actor54: brik + Owner: Nod1 + Location: 45,104 + Actor55: brik + Owner: Nod1 + Location: 44,104 + Actor56: brik + Owner: Nod1 + Location: 43,104 + Actor57: brik + Owner: Nod1 + Location: 43,105 + Actor58: brik + Owner: Nod1 + Location: 43,106 + Actor59: brik + Owner: Nod1 + Location: 43,107 + Actor60: brik + Owner: Nod1 + Location: 44,107 + Actor61: brik + Owner: Nod1 + Location: 44,106 + Actor62: brik + Owner: Nod1 + Location: 43,111 + Actor63: brik + Owner: Nod1 + Location: 44,111 + Actor64: brik + Owner: Nod1 + Location: 43,112 + Actor65: brik + Owner: Nod1 + Location: 44,112 + Actor66: brik + Owner: Nod1 + Location: 58,98 + Actor67: brik + Owner: Nod1 + Location: 58,99 + Actor68: brik + Owner: Nod1 + Location: 59,99 + Actor69: brik + Owner: Nod1 + Location: 59,98 + Actor70: brik + Owner: Nod1 + Location: 60,98 + Actor71: brik + Owner: Nod1 + Location: 61,98 + Actor72: brik + Owner: Nod1 + Location: 62,98 + Actor73: brik + Owner: Nod1 + Location: 63,98 + Actor74: brik + Owner: Nod1 + Location: 64,98 + Actor75: brik + Owner: Nod1 + Location: 64,98 + Actor76: brik + Owner: Nod1 + Location: 65,98 + Actor77: brik + Owner: Nod1 + Location: 66,98 + Actor78: brik + Owner: Nod1 + Location: 66,99 + Actor79: brik + Owner: Nod1 + Location: 66,100 + Actor80: brik + Owner: Nod1 + Location: 67,100 + Actor81: brik + Owner: Nod1 + Location: 68,100 + Actor82: brik + Owner: Nod1 + Location: 69,100 + Actor83: brik + Owner: Nod1 + Location: 69,101 + Actor84: brik + Owner: Nod1 + Location: 69,102 + Actor85: brik + Owner: Nod1 + Location: 69,103 + Actor86: brik + Owner: Nod1 + Location: 70,103 + Actor87: brik + Owner: Nod1 + Location: 71,103 + Actor88: brik + Owner: Nod1 + Location: 72,103 + Actor89: brik + Owner: Nod1 + Location: 73,103 + Actor90: brik + Owner: Nod1 + Location: 73,104 + Actor91: brik + Owner: Nod1 + Location: 73,105 + Actor92: brik + Owner: Nod1 + Location: 73,106 + Actor93: brik + Owner: Nod1 + Location: 72,106 + Actor94: brik + Owner: Nod1 + Location: 72,105 + Actor95: brik + Owner: Nod1 + Location: 73,110 + Actor96: brik + Owner: Nod1 + Location: 72,110 + Actor97: brik + Owner: Nod1 + Location: 72,111 + Actor98: brik + Owner: Nod1 + Location: 73,111 + Actor99: brik + Owner: Nod1 + Location: 73,112 + Actor100: brik + Owner: Nod1 + Location: 73,113 + Actor101: brik + Owner: Nod1 + Location: 73,115 + Actor102: brik + Owner: Nod1 + Location: 73,114 + Actor103: brik + Owner: Nod1 + Location: 73,116 + Actor104: brik + Owner: Nod1 + Location: 43,113 + Actor105: brik + Owner: Nod1 + Location: 43,114 + Actor106: brik + Owner: Nod1 + Location: 43,115 + Actor107: brik + Owner: Nod1 + Location: 43,116 + Actor108: brik + Owner: Nod1 + Location: 43,117 + Actor109: brik + Owner: Nod1 + Location: 43,118 + Actor110: brik + Owner: Nod1 + Location: 43,119 + Actor111: brik + Owner: Nod1 + Location: 44,119 + Actor112: brik + Owner: Nod1 + Location: 46,119 + Actor113: brik + Owner: Nod1 + Location: 45,119 + Actor114: brik + Owner: Nod1 + Location: 47,119 + Actor115: brik + Owner: Nod1 + Location: 48,119 + Actor116: brik + Owner: Nod1 + Location: 49,119 + Actor117: brik + Owner: Nod1 + Location: 49,120 + Actor118: brik + Owner: Nod1 + Location: 49,121 + Actor119: brik + Owner: Nod1 + Location: 49,122 + Actor120: brik + Owner: Nod1 + Location: 51,122 + Actor121: brik + Owner: Nod1 + Location: 50,122 + Actor122: brik + Owner: Nod1 + Location: 52,122 + Actor123: brik + Owner: Nod1 + Location: 52,121 + Actor124: brik + Owner: Nod1 + Location: 51,121 + Actor125: brik + Owner: Nod1 + Location: 60,121 + Actor126: brik + Owner: Nod1 + Location: 60,122 + Actor127: brik + Owner: Nod1 + Location: 61,122 + Actor128: brik + Owner: Nod1 + Location: 61,121 + Actor129: brik + Owner: Nod1 + Location: 62,122 + Actor130: brik + Owner: Nod1 + Location: 63,122 + Actor131: brik + Owner: Nod1 + Location: 65,122 + Actor132: brik + Owner: Nod1 + Location: 64,122 + Actor133: brik + Owner: Nod1 + Location: 66,122 + Actor134: brik + Owner: Nod1 + Location: 67,122 + Actor135: brik + Owner: Nod1 + Location: 68,122 + Actor136: brik + Owner: Nod1 + Location: 69,122 + Actor137: brik + Owner: Nod1 + Location: 70,122 + Actor138: brik + Owner: Nod1 + Location: 71,122 + Actor139: brik + Owner: Nod1 + Location: 72,122 + Actor140: brik + Owner: Nod1 + Location: 72,121 + Actor141: brik + Owner: Nod1 + Location: 73,118 + Actor142: brik + Owner: Nod1 + Location: 73,117 + Actor143: brik + Owner: Nod1 + Location: 73,119 + Actor144: brik + Owner: Nod1 + Location: 73,121 + Actor145: brik + Owner: Nod1 + Location: 73,122 + Actor146: brik + Owner: Nod1 + Location: 73,120 + Actor147: afac + Owner: Nod1 + Location: 68,119 + Actor148: hq + Owner: Nod1 + Location: 65,107 + Actor149: airs + Owner: Nod1 + Location: 45,115 + Actor150: nuk2 + Owner: Nod1 + Location: 71,115 + Actor151: nuk2 + Owner: Nod1 + Location: 69,115 + Actor152: nuk2 + Owner: Nod1 + Location: 71,112 + Actor153: nuk2 + Owner: Nod1 + Location: 69,112 + Actor154: nuk2 + Owner: Nod1 + Location: 65,119 + Actor155: nuk2 + Owner: Nod1 + Location: 63,119 + Actor156: hand + Owner: Nod1 + Location: 48,103 + Actor157: nsam + Owner: Nod1 + Location: 58,107 + Actor158: nsam + Owner: Nod1 + Location: 66,117 + Actor159: nsam + Owner: Nod1 + Location: 51,115 + Actor160: nsam + Owner: Nod1 + Location: 67,101 + Actor161: nsam + Owner: Nod1 + Location: 47,99 + Actor162: obli + Owner: Nod1 + Location: 52,99 + Actor163: obli + Owner: Nod1 + Location: 60,99 + Actor164: obli + Owner: Nod1 + Location: 44,105 + Actor165: obli + Owner: Nod1 + Location: 72,104 + Actor166: obli + Owner: Nod1 + Location: 50,121 + Actor167: gun.nod + Owner: Nod1 + Location: 53,97 + TurretFacing: 1023 + Actor168: gun.nod + Owner: Nod1 + Location: 59,97 + TurretFacing: 0 + Actor169: gun.nod + Owner: Nod1 + Location: 42,106 + Actor170: gun.nod + Owner: Nod1 + Location: 42,112 + Actor171: gun.nod + Owner: Nod1 + Location: 74,105 + TurretFacing: 896 + Actor172: gun.nod + Owner: Nod1 + Location: 74,111 + TurretFacing: 832 + Actor173: rep + Owner: Nod1 + Location: 62,101 + Actor174: nuk2 + Owner: Nod1 + Location: 49,109 + Actor175: tmpp + Owner: Nod1 + Location: 59,116 + MainTemple: tmpl + Owner: Nod1 + Location: 59,109 + Actor177: nuk2 + Owner: Nod1 + Location: 47,109 + Actor178: nuk2 + Owner: Nod1 + Location: 51,102 + Actor179: nuk2 + Owner: Nod1 + Location: 53,102 + Actor180: proc.td + Owner: Nod1 + Location: 54,118 + Actor181: silo.td + Owner: Nod1 + Location: 66,115 + Actor182: silo.td + Owner: Nod1 + Location: 51,119 + Actor183: split2 + Owner: Neutral + Location: 50,126 + Actor184: split2 + Owner: Neutral + Location: 57,125 + Actor185: split2 + Owner: Neutral + Location: 65,126 + Actor186: split2 + Owner: Neutral + Location: 70,125 + Actor187: obli + Location: 31,66 + Owner: Nod2 + Actor193: proc.td + Location: 14,67 + Owner: Nod2 + NodWestHand: hand + Location: 24,57 + Owner: Nod2 + Actor200: nsam + Location: 4,55 + Owner: Nod2 + NodWestAirstrip: airs + Location: 5,57 + Owner: Nod2 + Actor201: afac + Location: 7,66 + Owner: Nod2 + Actor202: rep + Location: 15,60 + Owner: Nod1 + Actor203: hq + Location: 3,62 + Owner: Nod2 + Actor204: silo.td + Location: 11,69 + Owner: Nod2 + Actor205: silo.td + Location: 11,67 + Owner: Nod2 + Actor212: nuk2 + Location: 7,62 + Owner: Nod2 + Actor217: gun.nod + Location: 19,53 + TurretFacing: 103 + Owner: Nod2 + Actor218: gun.nod + Location: 13,53 + Owner: Nod2 + TurretFacing: 87 + Actor219: gun.nod + Location: 17,72 + TurretFacing: 499 + Owner: Nod2 + Actor220: gun.nod + Location: 24,71 + TurretFacing: 578 + Owner: Nod2 + Actor221: hpad.td + Location: 19,61 + Owner: Nod1 + Actor222: hpad.td + Location: 12,59 + Owner: Nod1 + Actor223: hpad.td + Location: 13,63 + Owner: Nod1 + Actor224: split2 + Owner: Neutral + Location: 16,78 + Actor225: split2 + Owner: Neutral + Location: 10,79 + Actor226: split2 + Owner: Neutral + Location: 5,76 + Actor227: nsam + Location: 73,18 + Owner: Nod3 + Actor230: obli + Location: 72,17 + Owner: Nod3 + Actor228: gun.nod + Owner: Nod1 + Location: 84,10 + Actor231: gun.nod + Owner: Nod1 + Location: 90,9 + Actor232: gun.nod + Location: 84,34 + TurretFacing: 309 + Owner: Nod3 + Actor233: gun.nod + Location: 90,35 + TurretFacing: 341 + Owner: Nod3 + NodEastAirstrip: airs + Location: 82,24 + Owner: Nod3 + NodEastHand: hand + Location: 83,16 + Owner: Nod3 + Actor238: nuk2 + Location: 91,24 + Owner: Nod3 + Actor240: proc.td + Location: 91,13 + Owner: Nod3 + Actor241: silo.td + Location: 87,21 + Owner: Nod3 + Actor242: silo.td + Location: 87,19 + Owner: Nod3 + Actor243: silo.td + Location: 95,16 + Owner: Nod3 + Actor244: silo.td + Location: 95,14 + Owner: Nod3 + Actor245: rep + Location: 89,28 + Owner: Nod1 + Actor247: hpad.td + Location: 88,24 + Owner: Nod1 + Actor248: nsam + Location: 79,22 + Owner: Nod3 + Actor249: nsam + Location: 79,29 + Owner: Nod3 + Actor250: nsam + Location: 92,11 + Owner: Nod3 + Actor251: hosp + Location: 83,20 + Owner: Nod3 + Actor252: macs + Location: 20,65 + Owner: Nod2 + Actor253: v26 + Owner: Neutral + Location: 72,42 + Actor254: v24 + Owner: Neutral + Location: 79,47 + Actor255: v20 + Owner: Neutral + Location: 72,50 + Actor256: v27 + Owner: Neutral + Location: 73,48 + Actor257: tc01 + Owner: Neutral + Location: 73,44 + Actor258: rock3 + Owner: Neutral + Location: 66,29 + Actor259: t08 + Owner: Neutral + Location: 61,37 + Actor260: rock1 + Owner: Neutral + Location: 57,45 + Actor261: split2 + Owner: Neutral + Location: 43,39 + Actor263: split2 + Owner: Neutral + Location: 40,30 + Actor262: split2 + Owner: Neutral + Location: 43,34 + Actor264: split2 + Owner: Neutral + Location: 89,4 + Actor265: split2 + Owner: Neutral + Location: 82,6 + Actor266: gun.nod + Owner: Nod1 + Location: 54,25 + Actor267: gun.nod + Owner: Nod1 + Location: 55,36 + Actor268: gun.nod + Owner: Nod1 + Location: 70,89 + TurretFacing: 118 + Actor269: tc01 + Owner: Neutral + Location: 51,9 + Actor270: tc01 + Owner: Neutral + Location: 33,46 + Actor271: t18 + Owner: Neutral + Location: 68,71 + Actor272: t18 + Owner: Neutral + Location: 12,89 + Actor273: t18 + Owner: Neutral + Location: 84,83 + Actor274: rock7 + Owner: Neutral + Location: 87,76 + Actor275: rock6 + Owner: Neutral + Location: 49,81 + Actor276: rock3 + Owner: Neutral + Location: 32,97 + Actor277: t08 + Owner: Neutral + Location: 47,79 + Actor278: t08 + Owner: Neutral + Location: 10,43 + Actor279: t08 + Owner: Neutral + Location: 28,94 + Actor280: rock4 + Owner: Neutral + Location: 80,92 + Actor281: rock2 + Owner: Neutral + Location: 13,97 + Actor282: split2 + Owner: Neutral + Location: 11,115 + Actor283: split2 + Owner: Neutral + Location: 9,122 + Actor284: split2 + Owner: Neutral + Location: 17,122 + Actor285: split2 + Owner: Neutral + Location: 92,62 + Actor286: split2 + Owner: Neutral + Location: 90,72 + Actor287: obli + Owner: Nod2 + Location: 31,65 + Actor288: obli + Owner: Nod2 + Location: 32,62 + Actor289: obli + Owner: Nod2 + Location: 32,61 + Actor290: obli + Owner: Nod2 + Location: 31,58 + Actor291: obli + Owner: Nod2 + Location: 31,57 + Actor292: obli + Owner: Nod2 + Location: 26,70 + Actor293: obli + Owner: Nod2 + Location: 21,55 + Actor294: obli + Owner: Nod2 + Location: 11,55 + Actor295: nuk2 + Owner: Nod2 + Location: 9,61 + Actor296: nuk2 + Owner: Nod2 + Location: 23,61 + Actor297: nuk2 + Owner: Nod2 + Location: 25,61 + Actor298: nuk2 + Owner: Nod2 + Location: 25,64 + Actor299: nuk2 + Owner: Nod2 + Location: 23,64 + Actor300: nsam + Owner: Nod2 + Location: 28,57 + Actor301: nsam + Owner: Nod2 + Location: 28,61 + Actor302: nsam + Owner: Nod2 + Location: 28,65 + Actor303: nsam + Owner: Nod2 + Location: 8,70 + Actor304: nuk2 + Owner: Nod3 + Location: 91,20 + Actor305: nuk2 + Owner: Nod3 + Location: 93,20 + Actor306: nuk2 + Owner: Nod3 + Location: 93,24 + Actor307: obli + Owner: Nod3 + Location: 75,19 + Actor308: hpad.td + Location: 93,29 + Owner: Nod1 + Actor309: tc01 + Owner: Neutral + Location: 87,120 + Actor310: t04 + Owner: Neutral + Location: 92,95 + Actor311: rock2 + Owner: Neutral + Location: 92,110 + Actor312: t04 + Owner: Neutral + Location: 81,123 + Actor313: n3 + Owner: Nod1 + SubCell: 3 + Location: 61,105 + Facing: 0 + Actor314: ltnk + Owner: Nod1 + Location: 53,95 + Facing: 0 + Actor315: ltnk + Owner: Nod1 + Location: 59,95 + Facing: 0 + Actor316: ltnk + Owner: Nod1 + Location: 40,106 + Facing: 256 + Actor317: ltnk + Owner: Nod1 + Location: 40,112 + Facing: 256 + Actor318: ltnk + Owner: Nod1 + Location: 76,105 + Facing: 768 + Actor319: ltnk + Owner: Nod1 + Location: 76,111 + Facing: 768 + Actor320: mlrs + Owner: Nod1 + Location: 50,99 + Facing: 0 + Actor321: mlrs + Owner: Nod1 + Location: 62,99 + Facing: 0 + Actor322: mlrs + Owner: Nod1 + Location: 65,99 + Facing: 0 + Actor323: mlrs + Owner: Nod1 + Location: 45,106 + Facing: 384 + Actor324: mlrs + Owner: Nod1 + Location: 71,105 + Facing: 927 + Actor325: mlrs + Owner: Nod1 + Location: 62,111 + Facing: 0 + Actor326: mlrs + Owner: Nod1 + Location: 57,107 + Facing: 15 + Actor327: stnk.nod + Owner: Nod1 + Location: 87,2 + Facing: 384 + Stance: AttackAnything + Actor328: stnk.nod + Owner: Nod1 + Location: 91,6 + Facing: 384 + Stance: AttackAnything + Actor329: stnk.nod + Owner: Nod1 + Location: 89,66 + Facing: 198 + Stance: AttackAnything + Actor330: stnk.nod + Owner: Nod1 + Location: 91,66 + Facing: 222 + Stance: AttackAnything + Actor331: hftk + Owner: Nod1 + Location: 16,56 + Facing: 0 + Actor332: ltnk + Owner: Nod1 + Location: 33,24 + Facing: 126 + Actor333: ltnk + Owner: Nod1 + Location: 36,22 + Facing: 126 + Actor334: camera + Owner: Nod1 + Location: 12,24 + Actor335: camera + Owner: Nod1 + Location: 31,21 + Actor336: camera + Owner: Nod1 + Location: 44,12 + Actor337: camera + Owner: Nod1 + Location: 48,38 + Actor338: camera + Owner: Nod1 + Location: 87,23 + Actor339: camera + Owner: Nod1 + Location: 15,63 + Actor340: camera + Owner: Nod1 + Location: 37,51 + Actor341: bggy + Owner: Nod1 + Location: 9,35 + Facing: 832 + Actor342: bggy + Owner: Nod1 + Location: 11,36 + Facing: 856 + Actor343: bggy + Owner: Nod1 + Facing: 384 + Location: 62,9 + Actor344: bike + Owner: Nod1 + Location: 8,38 + Facing: 888 + Actor345: bike + Owner: Nod1 + Location: 11,39 + Facing: 880 + Actor346: mlrs + Owner: Nod1 + Location: 29,59 + Facing: 927 + Actor347: mlrs + Owner: Nod1 + Location: 29,63 + Facing: 911 + Actor348: mlrs + Owner: Nod1 + Facing: 384 + Location: 79,27 + Actor349: arty.nod + Owner: Nod1 + Location: 82,14 + Facing: 142 + Actor350: arty.nod + Owner: Nod1 + Facing: 384 + Location: 79,24 + Actor351: ltnk + Owner: Nod1 + Location: 79,11 + Facing: 261 + Actor352: ltnk + Owner: Nod1 + Facing: 384 + Location: 83,35 + Actor353: ltnk + Owner: Nod1 + Facing: 384 + Location: 89,37 + Actor354: ltnk + Owner: Nod1 + Location: 11,52 + Facing: 896 + Actor355: wtnk + Owner: Nod1 + Location: 21,58 + Facing: 126 + Actor356: wtnk + Owner: Nod1 + Facing: 384 + Location: 89,27 + Actor357: enli + Owner: Nod1 + SubCell: 3 + Location: 52,96 + Facing: 0 + Actor358: enli + Owner: Nod1 + SubCell: 3 + Location: 60,96 + Facing: 0 + Actor359: reap + Owner: Nod1 + SubCell: 3 + Location: 56,104 + Facing: 158 + Actor360: n1 + Owner: Nod1 + SubCell: 3 + Location: 41,105 + Facing: 214 + Actor361: n1 + Owner: Nod1 + SubCell: 3 + Location: 42,113 + Facing: 384 + Actor362: n1 + Owner: Nod1 + Location: 42,113 + SubCell: 1 + Facing: 198 + Actor363: n1 + Owner: Nod1 + Location: 42,105 + SubCell: 3 + Facing: 150 + Actor364: n1 + Owner: Nod1 + SubCell: 3 + Location: 51,97 + Facing: 0 + Actor365: n1 + Owner: Nod1 + Location: 51,97 + SubCell: 1 + Facing: 0 + Actor366: n1 + Owner: Nod1 + SubCell: 3 + Location: 61,97 + Facing: 0 + Actor367: n1 + Owner: Nod1 + SubCell: 3 + Location: 62,95 + Facing: 0 + Actor368: n1 + Owner: Nod1 + Facing: 384 + SubCell: 3 + Location: 84,32 + Actor369: n1 + Owner: Nod1 + Facing: 384 + Location: 84,32 + SubCell: 1 + Actor370: n1 + Owner: Nod1 + Facing: 384 + SubCell: 3 + Location: 85,33 + Actor371: n1 + Owner: Nod1 + Facing: 384 + SubCell: 3 + Location: 83,32 + Actor372: n1 + Owner: Nod1 + Facing: 384 + SubCell: 3 + Location: 91,34 + Actor373: n1 + Owner: Nod1 + SubCell: 3 + Location: 82,18 + Facing: 586 + Actor374: n1 + Owner: Nod1 + Facing: 384 + Location: 81,18 + SubCell: 3 + Actor375: n1 + Owner: Nod1 + SubCell: 3 + Location: 86,11 + Facing: 174 + Actor376: n1 + Owner: Nod1 + SubCell: 3 + Location: 91,11 + Facing: 190 + Actor377: n1 + Owner: Nod1 + Location: 91,11 + SubCell: 1 + Facing: 95 + Actor378: n1 + Owner: Nod1 + SubCell: 3 + Location: 90,12 + Facing: 118 + Actor379: n1 + Owner: Nod1 + SubCell: 3 + Location: 19,54 + Facing: 15 + Actor380: n1 + Owner: Nod1 + Location: 19,54 + SubCell: 1 + Facing: 0 + Actor381: n1 + Owner: Nod1 + SubCell: 3 + Location: 21,50 + Facing: 927 + Actor382: n1 + Owner: Nod1 + SubCell: 3 + Location: 10,51 + Facing: 753 + Actor383: n1 + Owner: Nod1 + Location: 10,51 + SubCell: 1 + Facing: 761 + Actor384: n1 + Owner: Nod1 + Location: 9,52 + SubCell: 3 + Facing: 927 + Actor385: n1 + Owner: Nod1 + SubCell: 3 + Location: 12,56 + Facing: 848 + Actor386: n1 + Owner: Nod1 + SubCell: 3 + Location: 25,73 + Facing: 650 + Actor387: n1 + Owner: Nod1 + Facing: 384 + Location: 25,73 + SubCell: 1 + Actor388: n1 + Owner: Nod1 + SubCell: 3 + Location: 24,74 + Facing: 594 + Actor389: n1 + Owner: Nod1 + SubCell: 3 + Location: 29,74 + Facing: 697 + Actor390: n1 + Owner: Nod1 + SubCell: 3 + Location: 38,70 + Facing: 0 + Actor391: n1 + Owner: Nod1 + SubCell: 3 + Location: 40,69 + Facing: 0 + Actor392: n3 + Owner: Nod1 + Location: 52,97 + SubCell: 3 + Facing: 769 + Actor393: n3 + Owner: Nod1 + SubCell: 3 + Location: 26,56 + Facing: 563 + Actor394: n3 + Owner: Nod1 + SubCell: 3 + Location: 9,55 + Facing: 384 + Actor395: n3 + Owner: Nod1 + Facing: 384 + Location: 9,51 + SubCell: 3 + Actor396: n3 + Owner: Nod1 + Facing: 384 + SubCell: 3 + Location: 83,31 + Actor397: n3 + Owner: Nod1 + SubCell: 3 + Location: 89,12 + Facing: 245 + Actor398: rmbc + Owner: Nod1 + SubCell: 3 + Location: 56,116 + Facing: 547 + Actor399: rmbc + Owner: Nod1 + SubCell: 3 + Location: 61,115 + Facing: 618 + Actor400: rmbc + Owner: Nod1 + Facing: 384 + SubCell: 3 + Location: 64,117 + Actor401: rmbc + Owner: Nod1 + SubCell: 3 + Location: 51,113 + Facing: 384 + Actor402: tplr + Owner: Nod1 + SubCell: 3 + Location: 66,110 + Facing: 570 + Actor403: tplr + Owner: Nod1 + SubCell: 3 + Location: 69,105 + Facing: 555 + Actor404: tplr + Owner: Nod1 + SubCell: 3 + Location: 51,107 + Facing: 384 + Actor405: tplr + Owner: Nod1 + Facing: 384 + SubCell: 3 + Location: 58,104 + Actor406: reap + Owner: Nod1 + SubCell: 3 + Facing: 384 + Location: 64,105 + Gateway: wormholexl + Location: 56,111 + Owner: NodGateway + NodRally1: waypoint + Owner: Neutral + Location: 56,7 + NodRally2: waypoint + Owner: Neutral + Location: 64,21 + NodRally3: waypoint + Owner: Neutral + Location: 63,45 + NodRally4: waypoint + Owner: Neutral + Location: 45,47 + NodRally5: waypoint + Owner: Neutral + Location: 14,46 + NodRally6: waypoint + Owner: Neutral + Location: 4,3 + Actor407: camera + Owner: Nod1 + Location: 87,37 + Actor408: camera + Owner: Nod1 + Location: 20,71 + Actor409: camera + Owner: Nod1 + Location: 56,91 + Actor410: camera + Owner: Nod1 + Location: 36,109 + Actor411: camera + Owner: Nod1 + Location: 79,108 + Actor412: hpad.td + Owner: Nod1 + Location: 67,102 + Actor413: hpad.td + Owner: Nod1 + Location: 68,106 + Actor414: avtr + Owner: Nod1 + Location: 56,101 + Facing: 0 + Actor415: avtr + Owner: Nod1 + Location: 46,109 + Facing: 261 + Actor416: avtr + Owner: Nod1 + Location: 70,108 + Facing: 761 + NodMainTopLeft: waypoint + Owner: Neutral + Location: 40,94 + NodMainBottomRight: waypoint + Owner: Neutral + Location: 76,124 + Actor417: rock6 + Owner: Neutral + Location: 32,34 + Actor418: rock2 + Owner: Neutral + Location: 20,33 + Actor419: rock5 + Owner: Neutral + Location: 27,35 + Actor420: rock4 + Owner: Neutral + Location: 18,35 + Actor421: rock7 + Owner: Neutral + Location: 24,34 + Actor423: spen.nod + Owner: Nod1 + Location: 55,62 + Actor422: ss2 + Owner: Nod1 + Location: 51,65 + Facing: 63 + Actor424: ss2 + Owner: Nod1 + Location: 50,62 + Facing: 79 + Actor425: ss2 + Owner: Nod1 + Location: 54,59 + Facing: 55 + Actor426: ss2 + Owner: Nod1 + Location: 59,59 + Facing: 63 + ICBMSub1: isub + Owner: Nod1 + Location: 57,60 + Facing: 55 + ICBMSub2: isub + Owner: Nod1 + Location: 53,62 + Facing: 79 + PlayerStart: waypoint + Owner: Neutral + Location: 26,14 + Actor429: avtr + Owner: Nod1 + Location: 52,106 + Facing: 126 + Actor430: avtr + Owner: Nod1 + Location: 65,106 + Facing: 904 + SubStrike1_1: waypoint + Owner: Neutral + Location: 8,44 + SubStrike1_2: waypoint + Owner: Neutral + Location: 15,42 + SubStrike1_3: waypoint + Owner: Neutral + Location: 22,43 + SubStrike1_4: waypoint + Owner: Neutral + Location: 28,47 + SubStrike2_1: waypoint + Owner: Neutral + Location: 74,5 + SubStrike2_2: waypoint + Owner: Neutral + Location: 81,3 + SubStrike2_4: waypoint + Owner: Neutral + Location: 85,45 + SubStrike2_3: waypoint + Location: 77,43 + Owner: Neutral + SubStrike3_6: waypoint + Owner: Neutral + Location: 30,118 + SubStrike3_5: waypoint + Owner: Neutral + Location: 28,109 + SubStrike3_4: waypoint + Owner: Neutral + Location: 30,100 + SubStrike3_1: waypoint + Owner: Neutral + Location: 48,86 + SubStrike3_2: waypoint + Owner: Neutral + Location: 57,84 + SubStrike3_3: waypoint + Owner: Neutral + Location: 65,86 + SubStrike3_7: waypoint + Owner: Neutral + Location: 86,103 + SubStrike3_8: waypoint + Owner: Neutral + Location: 87,111 + SubStrike3_9: waypoint + Owner: Neutral + Location: 84,119 + SubStrike4_1: waypoint + Owner: Neutral + Location: 6,7 + SubStrike4_2: waypoint + Owner: Neutral + Location: 8,3 + NodMainBaseCenter: waypoint + Owner: Neutral + Location: 58,113 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, conduit-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/main-campaign/ca41-annexation/annexation-rules.yaml b/mods/ca/missions/main-campaign/ca41-annexation/annexation-rules.yaml new file mode 100644 index 0000000000..8d602bf827 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca41-annexation/annexation-rules.yaml @@ -0,0 +1,139 @@ +^Palettes: + PaletteFromFile@terrain-temperat: + Filename: alien.pal + WeatherOverlay: + ParticleDensityFactor: 4 + Gravity: 8, 16 + WindTick: 150, 425 + ScatterDirection: -12, 12 + ParticleSize: 2, 3 + ParticleColors: 00000066, 11111166, 22222266 + LineTailAlphaValue: 0 + TintPostProcessEffect: + Red: 0.9 + Green: 0.9 + Blue: 1.1 + Ambient: 0.65 + FixedColorPalette@BlueTiberium: + Color: ffffff + +^BaseWorld: + TerrainLighting: + ResourceRenderer: + ResourceTypes: + BlueTiberium: + Name: Purified Tiberium + + +^BasePlayer: + PlayerResources: + ResourceValues: + BlueTiberium: 25 + +World: + LuaScript: + Scripts: campaign.lua, annexation.lua + MissionData: + Briefing: With the gateway under our control, Kane has been prevented from returning to Earth, and our forces are now prepared to journey to the Scrin homeworld where we will assist the Overlord to defeat the rebels and eliminate Kane.\n\nA Nod base exists on the other side. Kane may attempt to make a stand there, but it is more likely he has fled into the shadows as he has done before. Regardless, our first task will be to establish a base of operations and secure the immediate vicinity. The nearby Nerve Center will need to be captured to ensure the gateway remains open.\n\nWe will be venturing deep into rebel territory, so do not expect the Overlord to be able to assist you. Opening up a new front here should relieve some of the pressure his forces are experiencing elsewhere on the planet.\n\nWipe out any Nod or rebel forces you encounter. Show the Overlord what a powerful ally we can be. + MapOptions: + ShortGameCheckboxEnabled: False + MusicPlaylist: + StartingMusic: phatatta + +Player: + PlayerResources: + DefaultCash: 6000 + +# Purified Tib doesn't damage infantry + +^Infantry: + DamagedByTerrain@TIBDAMAGE: + Terrain: Tiberium + +# Disable tech + +MSHP: + Inherits@CAMPAIGNDISABLED: ^Disabled + +imppara.upgrade: + Inherits@CAMPAIGNDISABLED: ^Disabled + +# Disable powers + +^SpyPlanePower: + AirstrikePowerCA@spyplane: + Prerequisites: ~disabled + +^ParabombsPower: + AirstrikePowerCA@Russianparabombs: + Prerequisites: ~disabled + +^ParatroopersPower: + ParatroopersPowerCA@paratroopers: + Prerequisites: ~disabled + +^TankDropPower: + ParatroopersPowerCA@TankDrop: + Prerequisites: ~disabled + +# Misc + +NERV: + ExternalCondition@DmgReduction: + Condition: nerv-damage-reduction + DamageMultiplier@DmgReduction: + Modifier: 50 + RequiresCondition: nerv-damage-reduction + ExternalCondition@NoAutoTarget: + Condition: no-auto-target + Targetable@NoAutoTarget: + TargetTypes: NoAutoTarget + RequiresCondition: no-auto-target + +recall.effect: + Inherits: CAMERA + PeriodicExplosion: + Weapon: FleetRecallEffect + +WORMHOLEXL: + TerrainLightSource: + Range: 4c0 + Intensity: 0.5 + RedTint: 1 + +SPLITBLUE: + Tooltip: + Name: Blossom Tree + +WORMHOLE: + -TeleportNetwork: + Health: + HP: 300000 + +SIGN: + Inherits@CAMPAIGNDISABLED: ^Disabled + CaptureManager: + Capturable: + RequiresCondition: !build-incomplete && !being-warped + Types: building + CapturableProgressBar: + CapturableProgressBlink: + Tooltip: + GenericVisibility: None + TooltipExtras: + -Attributes: + +# Removing TeleportNetwork from Wormhole above causes exception as no actors with TeleportNetwork are defined +dummyteleport: + Inherits: ^InvisibleDummy + TeleportNetwork: + Type: Wormhole + +# Hunt() requires only 1 AttackBase +DEVA: + -AttackFrontalCharged: + -Armament@PRIMARYUPG: + -AmbientSound@CHARGE: + -WithIdleOverlay@CHARGE1: + -WithIdleOverlay@CHARGE2: + -WithIdleOverlay@CHARGE3: diff --git a/mods/ca/missions/main-campaign/ca41-annexation/annexation-weapons.yaml b/mods/ca/missions/main-campaign/ca41-annexation/annexation-weapons.yaml new file mode 100644 index 0000000000..ff5a48b5f4 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca41-annexation/annexation-weapons.yaml @@ -0,0 +1,10 @@ + +FleetRecallEffect: + ReloadDelay: 10000 + Projectile: InstantExplode + Warhead@1Eff: CreateEffect + Image: fleetrecall + Explosions: idle + ExplosionPalette: scrineffect + ImpactSounds: fleetrecall.aud + ValidTargets: Ground, Water, Air diff --git a/mods/ca/missions/main-campaign/ca41-annexation/annexation.lua b/mods/ca/missions/main-campaign/ca41-annexation/annexation.lua new file mode 100644 index 0000000000..9545c577e6 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca41-annexation/annexation.lua @@ -0,0 +1,397 @@ +MissionDir = "ca|missions/main-campaign/ca41-annexation" + +ScrinAttackValues = AdjustAttackValuesForDifficulty({ Min = 13, Max = 26 }) + +NodBuildingsToSell = { NodConyard, NodHand, NodFactory, NodComms } + +ScrinReinforcementInitialSquad = { "s3", "s1", "s1", "s1", "s1", "s1", "s2", "s2", "s3", "intl", "rtpd", GunWalkerSeekerOrLacerator, CorrupterOrDevourer, CorrupterOrDevourer, GunWalkerSeekerOrLacerator, GunWalkerSeekerOrLacerator } +ScrinReinforcementSquad = { "s3", "s1", "s1", "s1", "s1", "s2", "s3", "intl", "rtpd", GunWalkerSeekerOrLacerator, CorrupterOrDevourer } + +MaxAirToAirUnits = { + hard = 6, + vhard = 12, + brutal = 16 +} + +if IsHardOrAbove() then + table.insert(UnitCompositions.Scrin, { + Infantry = { "impl", "impl", "impl", "impl", "impl", "impl", "impl", "impl", "impl" }, + Vehicles = { "null", "null", "null", "null", "null", "null" }, + MinTime = DateTime.Minutes(5), + IsSpecial = true + }) +end + +AdjustedScrinCompositions = AdjustCompositionsForDifficulty(UnitCompositions.Scrin) + +Squads = { + ScrinRebels1 = { + Delay = AdjustDelayForDifficulty(DateTime.Minutes(4)), + AttackValuePerSecond = ScrinAttackValues, + FollowLeader = true, + Compositions = AdjustedScrinCompositions, + AttackPaths = { + { RebelRally5.Location }, + { RebelRally6.Location }, + }, + }, + ScrinRebels2 = { + Delay = AdjustDelayForDifficulty(DateTime.Minutes(7)), + AttackValuePerSecond = ScrinAttackValues, + FollowLeader = true, + Compositions = AdjustedScrinCompositions, + AttackPaths = { + { RebelRally1.Location }, + { RebelRally2.Location }, + }, + }, + ScrinRebels3 = { + Delay = AdjustDelayForDifficulty(DateTime.Minutes(8)), + AttackValuePerSecond = ScrinAttackValues, + FollowLeader = true, + Compositions = AdjustedScrinCompositions, + AttackPaths = { + { RebelRally2.Location }, + { RebelRally3.Location }, + { RebelRally4.Location }, + }, + }, + ScrinRebelsAir = { + Delay = AdjustAirDelayForDifficulty(DateTime.Minutes(6)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 12, Max = 12 }), + Compositions = AirCompositions.Scrin, + }, + ScrinRebelsAirToAir = AirToAirSquad({ "stmr", "enrv", "torm" }, AdjustAirDelayForDifficulty(DateTime.Minutes(10))), +} + +-- Setup and Tick + +SetupPlayers = function() + USSR = Player.GetPlayer("USSR") + Nod = Player.GetPlayer("Nod") + Scrin = Player.GetPlayer("Scrin") + ScrinRebels1 = Player.GetPlayer("ScrinRebels1") + ScrinRebels2 = Player.GetPlayer("ScrinRebels2") + ScrinRebels3 = Player.GetPlayer("ScrinRebels3") + SignalTransmittersPlayer = Player.GetPlayer("SignalTransmittersPlayer") -- separate player to prevent AI from attacking it + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = { USSR } + MissionEnemies = { ScrinRebels1, ScrinRebels2, ScrinRebels3 } +end + +WorldLoaded = function() + SetupPlayers() + + TimerTicks = DateTime.Minutes(3) + NumTransmittersCaptured = 0 + Camera.Position = PlayerStart.CenterPosition + + InitObjectives(USSR) + AdjustPlayerStartingCashForDifficulty() + InitScrinRebels() + InitNod() + + Utils.Do(MissionPlayers, function(p) + Actor.Create("hazmatsoviet.upgrade", true, { Owner = p }) + end) + + ObjectiveCaptureNerveCenter = USSR.AddObjective("Capture rebel Nerve Center.") + ObjectiveEliminateRebels = USSR.AddObjective("Eliminate all rebel forces.") + + Trigger.AfterDelay(DateTime.Seconds(3), function() + Media.DisplayMessage("Assist us to annihilate Kane and the rebels, and you will be rewarded.", "Scrin Overlord", HSLColor.FromHex("7700FF")) + MediaCA.PlaySound(MissionDir .. "/ovld_assist.aud", 2) + + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(11)), function() + Media.DisplayMessage("The vastness of space, uncorrupted by capitalism, is ours for the taking!", "Premier Cherdenko", HSLColor.FromHex("FF0000")) + MediaCA.PlaySound(MissionDir .. "/cdko_space.aud", 2) + end) + end) + + local transmitters = { SignalTransmitter1, SignalTransmitter2, SignalTransmitter3 } + Utils.Do(transmitters, function(t) + Trigger.OnEnteredProximityTrigger(t.CenterPosition, WDist.New(12 * 1024), function(a, id) + if IsMissionPlayer(a.Owner) then + Trigger.RemoveProximityTrigger(id) + InitSignalTransmittersObjective() + end + end) + end) + + GatewayNerveCenter.GrantCondition("nerv-damage-reduction") + GatewayNerveCenter.GrantCondition("no-auto-target") + + Trigger.OnCapture(GatewayNerveCenter, function(self, captor, oldOwner, newOwner) + if IsMissionPlayer(newOwner) and not USSR.IsObjectiveCompleted(ObjectiveCaptureNerveCenter) then + USSR.MarkCompletedObjective(ObjectiveCaptureNerveCenter) + ObjectiveHoldNerveCenter = USSR.AddObjective("Protect the captured Nerve Center.") + TimerTicks = 0 + UpdateMissionText() + + Trigger.OnRemovedFromWorld(GatewayNerveCenter, function(a) + if not USSR.IsObjectiveCompleted(ObjectiveHoldNerveCenter) then + USSR.MarkFailedObjective(ObjectiveHoldNerveCenter) + Gateway.Destroy() + end + end) + end + end) + + Trigger.OnKilled(GatewayNerveCenter, function(self, killer) + if not USSR.IsObjectiveCompleted(ObjectiveCaptureNerveCenter) then + USSR.MarkFailedObjective(ObjectiveCaptureNerveCenter) + Gateway.Destroy() + end + end) + + AfterWorldLoaded() +end + +Tick = function() + OncePerSecondChecks() + OncePerFiveSecondChecks() + OncePerThirtySecondChecks() + AfterTick() +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + ScrinRebels1.Resources = ScrinRebels1.ResourceCapacity - 500 + ScrinRebels2.Resources = ScrinRebels2.ResourceCapacity - 500 + ScrinRebels3.Resources = ScrinRebels3.ResourceCapacity - 500 + SignalTransmittersPlayer.Resources = SignalTransmittersPlayer.ResourceCapacity - 500 + + if not PlayerHasBuildings(ScrinRebels1) and not PlayerHasBuildings(ScrinRebels2) and not PlayerHasBuildings(ScrinRebels3) then + if ObjectiveHoldNerveCenter ~= nil and not USSR.IsObjectiveCompleted(ObjectiveHoldNerveCenter) then + USSR.MarkCompletedObjective(ObjectiveHoldNerveCenter) + end + + if not USSR.IsObjectiveCompleted(ObjectiveEliminateRebels) then + USSR.MarkCompletedObjective(ObjectiveEliminateRebels) + end + end + + if MissionPlayersHaveNoRequiredUnits() then + if not USSR.IsObjectiveCompleted(ObjectiveEliminateRebels) then + USSR.MarkFailedObjective(ObjectiveEliminateRebels) + end + end + + if TimerTicks > 0 then + if TimerTicks > 25 then + TimerTicks = TimerTicks - 25 + else + TimerTicks = 0 + + if not Gateway.IsDead then + Gateway.Destroy() + if not USSR.IsObjectiveCompleted(ObjectiveCaptureNerveCenter) then + USSR.MarkFailedObjective(ObjectiveCaptureNerveCenter) + end + end + end + + UpdateMissionText() + end + end +end + +OncePerFiveSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 125 == 0 then + UpdatePlayerBaseLocations() + end +end + +OncePerThirtySecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % DateTime.Seconds(30) == 0 then + CalculatePlayerCharacteristics() + end +end + +UpdateMissionText = function() + if TimerTicks > 0 then + UserInterface.SetMissionText("Capture Nerve Center. Gateway collapses in " .. UtilsCA.FormatTimeForGameSpeed(TimerTicks), HSLColor.Yellow) + else + UserInterface.SetMissionText("") + end +end + +-- Functions + +InitScrinRebels = function() + AutoRepairAndRebuildBuildings(SignalTransmittersPlayer) + Actor.Create("ai.unlimited.power", true, { Owner = SignalTransmittersPlayer }) + + if Difficulty ~= "easy" then + Actor.Create("ai.minor.superweapons.enabled", true, { Owner = ScrinRebels1 }) + end + + local scrinRebelPlayers = { ScrinRebels1, ScrinRebels2, ScrinRebels3 } + + Utils.Do(scrinRebelPlayers, function(p) + AutoRepairAndRebuildBuildings(p) + SetupRefAndSilosCaptureCredits(p) + AutoReplaceHarvesters(p) + AutoRebuildConyards(p) + InitAiUpgrades(p) + + local scrinRebelsGroundAttackers = p.GetGroundAttackers() + + Utils.Do(scrinRebelsGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsScrinGroundHunterUnit) + end) + end) + + InitAttackSquad(Squads.ScrinRebels1, ScrinRebels1) + InitAttackSquad(Squads.ScrinRebels2, ScrinRebels2) + InitAttackSquad(Squads.ScrinRebels3, ScrinRebels3) + InitAirAttackSquad(Squads.ScrinRebelsAir, ScrinRebels1) + + if IsHardOrAbove() then + InitAirAttackSquad(Squads.ScrinRebelsAirToAir, ScrinRebels1, MissionPlayers, { "Aircraft" }, "ArmorType") + end +end + +InitNod = function() + AutoRepairBuildings(Nod) + SetupRefAndSilosCaptureCredits(Nod) + SellOnCaptureAttempt(NodBuildingsToSell) + + local nodGroundAttackers = Nod.GetGroundAttackers() + + Utils.Do(nodGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsNodGroundHunterUnit) + end) + + Trigger.AfterDelay(DateTime.Minutes(2), function() + Utils.Do(nodGroundAttackers, function(a) + AssaultPlayerBaseOrHunt(a) + end) + end) +end + +InitSignalTransmittersObjective = function() + if ObjectiveSignalTransmitters == nil then + ObjectiveSignalTransmitters = USSR.AddObjective("Capture the three signal transmitters.") + Media.DisplayMessage("Capture the rebel Signal Transmiters, and I will unleash my forces to assist you.", "Scrin Overlord", HSLColor.FromHex("7700FF")) + MediaCA.PlaySound(MissionDir .. "/ovld_capture.aud", 2) + + local transmitters = Utils.Where({ SignalTransmitter1, SignalTransmitter2, SignalTransmitter3 }, function(a) + return not a.IsDead and a.Owner == SignalTransmittersPlayer + end) + + Utils.Do(transmitters, function(t) + local transmitterLocation = t.Location + local transmitterFlare = Actor.Create("flare", true, { Owner = USSR, Location = transmitterLocation }) + + Beacon.New(USSR, t.CenterPosition) + Trigger.AfterDelay(DateTime.Seconds(20), function() + transmitterFlare.Destroy() + end) + + Trigger.OnCapture(t, function(self, captor, oldOwner, newOwner) + NumTransmittersCaptured = NumTransmittersCaptured + 1 + + if NumTransmittersCaptured == #transmitters and not USSR.IsObjectiveCompleted(ObjectiveSignalTransmitters) then + USSR.MarkCompletedObjective(ObjectiveSignalTransmitters) + end + + local wormholeLoc + if self == SignalTransmitter1 then + wormholeLoc = ScrinWormholeWp1.Location + elseif self == SignalTransmitter2 then + wormholeLoc = ScrinWormholeWp2.Location + elseif self == SignalTransmitter3 then + wormholeLoc = ScrinWormholeWp3.Location + end + + Trigger.AfterDelay(DateTime.Seconds(3), function() + local wormhole = SpawnWormhole(wormholeLoc) + Trigger.AfterDelay(DateTime.Seconds(3), function() + PlaySpeechNotificationToMissionPlayers("ReinforcementsArrived") + Notification("Reinforcements have arrived.") + InitScrinReinforcements(wormhole) + FleetRecall(transmitterLocation) + end) + end) + end) + + Trigger.OnKilled(t, function(self, killer) + if self.Owner == SignalTransmittersPlayer then + USSR.MarkFailedObjective(ObjectiveSignalTransmitters) + end + end) + end) + end +end + +NodSellOff = function() + if NodSold then + return + end + NodSold = true + Utils.Do(NodBuildingsToSell, function(b) + if not b.IsDead and b.Owner == Nod then + b.Sell() + end + end) +end + +SpawnWormhole = function(loc) + return Actor.Create("wormhole", true, { Owner = Scrin, Location = loc }) +end + +InitScrinReinforcements = function(wormhole, initial) + DeployScrinReinforcements(wormhole, true) +end + +DeployScrinReinforcements = function(wormhole, initial) + if not wormhole.IsDead then + local unitsList = {} + + local compositionUnits + if initial then + compositionUnits = ScrinReinforcementInitialSquad + else + compositionUnits = ScrinReinforcementSquad + end + + Utils.Do(compositionUnits, function(u) + if type(u) == "table" then + table.insert(unitsList, Utils.Random(u)) + else + table.insert(unitsList, u) + end + end) + + local units = Reinforcements.Reinforce(Scrin, unitsList, { wormhole.Location }, 5) + Utils.Do(units, function(unit) + unit.Scatter() + Trigger.AfterDelay(5, function() + AssaultPlayerBaseOrHunt(unit, ScrinRebels1) + end) + end) + + Trigger.AfterDelay(DateTime.Minutes(3), function() + DeployScrinReinforcements(wormhole, false) + end) + end +end + +FleetRecall = function(loc) + local effect = Actor.Create("recall.effect", true, { Owner = Scrin, Location = loc }) + Trigger.AfterDelay(DateTime.Seconds(5), effect.Destroy) + + local spawnLocations = { + CPos.New(loc.X + 2, loc.Y + 1), + CPos.New(loc.X - 2, loc.Y - 1), + CPos.New(loc.X - 1, loc.Y + 2), + CPos.New(loc.X + 1, loc.Y - 2) + } + + Utils.Do(spawnLocations, function(loc) + Actor.Create("pac", true, { Owner = Scrin, Location = loc, Facing = Angle.SouthWest, CenterPosition = Map.CenterOfCell(loc) + WVec.New(0, 0, Actor.CruiseAltitude("pac"))}) + end) +end diff --git a/mods/ca/missions/main-campaign/ca41-annexation/cdko_space.aud b/mods/ca/missions/main-campaign/ca41-annexation/cdko_space.aud new file mode 100644 index 0000000000..e18efb856e Binary files /dev/null and b/mods/ca/missions/main-campaign/ca41-annexation/cdko_space.aud differ diff --git a/mods/ca/missions/main-campaign/ca41-annexation/map.bin b/mods/ca/missions/main-campaign/ca41-annexation/map.bin new file mode 100644 index 0000000000..a5cd2e283d Binary files /dev/null and b/mods/ca/missions/main-campaign/ca41-annexation/map.bin differ diff --git a/mods/ca/missions/main-campaign/ca41-annexation/map.png b/mods/ca/missions/main-campaign/ca41-annexation/map.png new file mode 100644 index 0000000000..31d12a4dda Binary files /dev/null and b/mods/ca/missions/main-campaign/ca41-annexation/map.png differ diff --git a/mods/ca/missions/main-campaign/ca41-annexation/map.yaml b/mods/ca/missions/main-campaign/ca41-annexation/map.yaml new file mode 100644 index 0000000000..844aa7bc76 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca41-annexation/map.yaml @@ -0,0 +1,3198 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 41: Annexation + +Author: Darkademic + +Tileset: TEMPERAT + +MapSize: 130,114 + +Bounds: 1,1,128,112 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: USSR, ScrinRebels1, ScrinRebels2, ScrinRebels3, Nod, Scrin + PlayerReference@USSR: + Name: USSR + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: soviet + LockColor: True + Color: FE1100 + LockSpawn: True + LockTeam: True + Allies: Scrin + Enemies: ScrinRebels1, ScrinRebels2, ScrinRebels3, Nod, Creeps + PlayerReference@Scrin: + Name: Scrin + Bot: campaign + Faction: scrin + Color: 7700FF + Allies: USSR + Enemies: ScrinRebels1, ScrinRebels2, ScrinRebels3, Nod, Creeps + PlayerReference@ScrinRebels1: + Name: ScrinRebels1 + Bot: campaign + Faction: scrin + Color: 2FB4A6 + Allies: Nod, ScrinRebels2, ScrinRebels3, SignalTransmittersPlayer + Enemies: USSR, Scrin, Creeps + PlayerReference@ScrinRebels2: + Name: ScrinRebels2 + Bot: campaign + Faction: scrin + Color: 2FB4A6 + Allies: Nod, ScrinRebels1, ScrinRebels3, SignalTransmittersPlayer + Enemies: USSR, Scrin, Creeps + PlayerReference@ScrinRebels3: + Name: ScrinRebels3 + Bot: campaign + Faction: scrin + Color: 2FB4A6 + Allies: Nod, ScrinRebels1, ScrinRebels2, SignalTransmittersPlayer + Enemies: USSR, Scrin, Creeps + PlayerReference@Nod: + Name: Nod + Bot: campaign + Faction: nod + Color: 6D738C + Allies: ScrinRebels1, ScrinRebels2, ScrinRebels3, SignalTransmittersPlayer + Enemies: USSR, Scrin, Creeps + PlayerReference@NodGatewayPlayer: + Name: NodGatewayPlayer + Bot: campaign + NonCombatant: True + Faction: nod + Color: FE1100 + PlayerReference@SignalTransmittersPlayer: + Name: SignalTransmittersPlayer + Bot: campaign + NonCombatant: True + Faction: scrin + Color: 2FB4A6 + Allies: Nod, ScrinRebels1, ScrinRebels2, ScrinRebels3 + Enemies: USSR + +Actors: + Actor5: brik + Owner: Nod + Location: 57,41 + Actor23: brik + Owner: Nod + Location: 66,42 + Actor26: brik + Owner: Nod + Location: 75,42 + Actor47: brik + Owner: Nod + Location: 74,46 + Actor48: brik + Owner: Nod + Location: 75,46 + Actor59: ltnk + Owner: Nod + Facing: 911 + Health: 68 + Location: 76,48 + Actor62: n1 + Owner: Nod + SubCell: 3 + Facing: 896 + Location: 76,49 + Actor64: brik + Owner: Nod + Location: 74,50 + Actor66: gun.nod + Owner: Nod + Location: 76,50 + TurretFacing: 872 + Actor67: n1 + Owner: Nod + SubCell: 3 + Facing: 769 + Location: 78,50 + Actor71: brik + Owner: Nod + Location: 74,51 + Actor86: brik + Owner: Nod + Location: 74,54 + Actor93: brik + Owner: Nod + Location: 74,55 + Actor102: brik + Owner: Nod + Location: 50,57 + Actor104: brik + Owner: Nod + Location: 54,57 + Actor107: brik + Owner: Nod + Location: 49,58 + Actor110: brik + Owner: Nod + Location: 52,58 + Actor112: brik + Owner: Nod + Location: 54,58 + Actor122: swal + Location: 1,88 + Faction: Random + Owner: ScrinRebels1 + Actor209: swal + Faction: Random + Owner: ScrinRebels1 + Location: 2,88 + Actor210: swal + Faction: Random + Owner: ScrinRebels1 + Location: 2,89 + Actor211: swal + Faction: Random + Owner: ScrinRebels1 + Location: 1,89 + Actor207: swal + Faction: Random + Owner: ScrinRebels1 + Location: 1,90 + Actor206: swal + Faction: Random + Owner: ScrinRebels1 + Location: 1,91 + Actor205: swal + Faction: Random + Owner: ScrinRebels1 + Location: 1,92 + Actor212: swal + Faction: Random + Owner: ScrinRebels1 + Location: 1,93 + Actor213: swal + Faction: Random + Owner: ScrinRebels1 + Location: 1,94 + Actor214: swal + Faction: Random + Owner: ScrinRebels1 + Location: 1,95 + Actor215: swal + Faction: Random + Owner: ScrinRebels1 + Location: 1,96 + Actor216: swal + Faction: Random + Owner: ScrinRebels1 + Location: 1,97 + Actor217: swal + Faction: Random + Owner: ScrinRebels1 + Location: 1,98 + Actor218: swal + Faction: Random + Owner: ScrinRebels1 + Location: 1,99 + Actor219: swal + Faction: Random + Owner: ScrinRebels1 + Location: 1,100 + Actor220: swal + Faction: Random + Owner: ScrinRebels1 + Location: 1,101 + Actor221: swal + Faction: Random + Owner: ScrinRebels1 + Location: 1,102 + Actor224: swal + Faction: Random + Owner: ScrinRebels1 + Location: 3,88 + Actor226: swal + Faction: Random + Owner: ScrinRebels1 + Location: 6,88 + Actor229: swal + Faction: Random + Owner: ScrinRebels1 + Location: 5,88 + Actor225: swal + Faction: Random + Owner: ScrinRebels1 + Location: 4,88 + Actor228: swal + Faction: Random + Owner: ScrinRebels1 + Location: 5,89 + Actor227: swal + Faction: Random + Owner: ScrinRebels1 + Location: 6,89 + Actor230: swal + Faction: Random + Owner: ScrinRebels1 + Location: 7,89 + Actor231: swal + Faction: Random + Owner: ScrinRebels1 + Location: 8,89 + Actor232: swal + Faction: Random + Owner: ScrinRebels1 + Location: 9,89 + Actor233: swal + Faction: Random + Owner: ScrinRebels1 + Location: 10,89 + Actor234: swal + Faction: Random + Owner: ScrinRebels1 + Location: 11,89 + Actor236: swal + Faction: Random + Owner: ScrinRebels1 + Location: 10,90 + Actor237: swal + Faction: Random + Owner: ScrinRebels1 + Location: 6,90 + Actor238: swal + Faction: Random + Owner: ScrinRebels1 + Location: 7,90 + Actor235: swal + Faction: Random + Owner: ScrinRebels1 + Location: 11,90 + Actor239: swal + Faction: Random + Owner: ScrinRebels1 + Location: 11,91 + Actor240: swal + Faction: Random + Owner: ScrinRebels1 + Location: 11,92 + Actor241: swal + Faction: Random + Owner: ScrinRebels1 + Location: 12,92 + Actor242: swal + Faction: Random + Owner: ScrinRebels1 + Location: 13,92 + Actor243: swal + Faction: Random + Owner: ScrinRebels1 + Location: 14,92 + Actor244: swal + Faction: Random + Owner: ScrinRebels1 + Location: 15,92 + Actor245: swal + Faction: Random + Owner: ScrinRebels1 + Location: 15,93 + Actor246: swal + Faction: Random + Owner: ScrinRebels1 + Location: 14,93 + Actor248: swal + Faction: Random + Owner: ScrinRebels1 + Location: 16,112 + Actor249: swal + Faction: Random + Owner: ScrinRebels1 + Location: 17,112 + Actor251: swal + Faction: Random + Owner: ScrinRebels1 + Location: 18,112 + Actor252: swal + Faction: Random + Owner: ScrinRebels1 + Location: 19,112 + Actor253: swal + Faction: Random + Owner: ScrinRebels1 + Location: 20,112 + Actor254: swal + Faction: Random + Owner: ScrinRebels1 + Location: 21,112 + Actor255: swal + Faction: Random + Owner: ScrinRebels1 + Location: 22,112 + Actor256: swal + Faction: Random + Owner: ScrinRebels1 + Location: 23,112 + Actor257: swal + Faction: Random + Owner: ScrinRebels1 + Location: 24,112 + Actor258: swal + Faction: Random + Owner: ScrinRebels1 + Location: 25,112 + Actor259: swal + Faction: Random + Owner: ScrinRebels1 + Location: 26,112 + Actor260: swal + Faction: Random + Owner: ScrinRebels1 + Location: 27,112 + Actor261: swal + Faction: Random + Owner: ScrinRebels1 + Location: 28,112 + Actor262: swal + Faction: Random + Owner: ScrinRebels1 + Location: 28,111 + Actor263: swal + Faction: Random + Owner: ScrinRebels1 + Location: 28,110 + Actor264: swal + Faction: Random + Owner: ScrinRebels1 + Location: 28,109 + Actor265: swal + Faction: Random + Owner: ScrinRebels1 + Location: 28,108 + Actor266: swal + Faction: Random + Owner: ScrinRebels1 + Location: 27,108 + Actor267: swal + Faction: Random + Owner: ScrinRebels1 + Location: 27,107 + Actor268: swal + Faction: Random + Owner: ScrinRebels1 + Location: 28,107 + Actor269: swal + Faction: Random + Owner: ScrinRebels1 + Location: 27,103 + Actor270: swal + Faction: Random + Owner: ScrinRebels1 + Location: 28,103 + Actor272: swal + Faction: Random + Owner: ScrinRebels1 + Location: 27,102 + Actor271: swal + Faction: Random + Owner: ScrinRebels1 + Location: 28,102 + Actor273: swal + Faction: Random + Owner: ScrinRebels1 + Location: 28,101 + Actor274: swal + Faction: Random + Owner: ScrinRebels1 + Location: 28,100 + Actor275: swal + Faction: Random + Owner: ScrinRebels1 + Location: 28,99 + Actor276: swal + Faction: Random + Owner: ScrinRebels1 + Location: 28,98 + Actor277: swal + Faction: Random + Owner: ScrinRebels1 + Location: 28,97 + Actor278: swal + Faction: Random + Owner: ScrinRebels1 + Location: 28,96 + Actor279: swal + Faction: Random + Owner: ScrinRebels1 + Location: 27,96 + Actor280: swal + Faction: Random + Owner: ScrinRebels1 + Location: 26,96 + Actor281: swal + Faction: Random + Owner: ScrinRebels1 + Location: 25,96 + Actor282: swal + Faction: Random + Owner: ScrinRebels1 + Location: 25,95 + Actor283: swal + Faction: Random + Owner: ScrinRebels1 + Location: 24,95 + Actor284: swal + Faction: Random + Owner: ScrinRebels1 + Location: 23,95 + Actor285: swal + Faction: Random + Owner: ScrinRebels1 + Location: 23,96 + Actor287: swal + Faction: Random + Owner: ScrinRebels1 + Location: 21,96 + Actor288: swal + Faction: Random + Owner: ScrinRebels1 + Location: 21,95 + Actor289: swal + Faction: Random + Owner: ScrinRebels1 + Location: 22,95 + Actor286: swal + Faction: Random + Owner: ScrinRebels1 + Location: 22,96 + Actor290: swal + Owner: ScrinRebels2 + Location: 1,1 + Actor291: swal + Owner: ScrinRebels2 + Location: 2,1 + Actor292: swal + Owner: ScrinRebels2 + Location: 1,2 + Actor293: swal + Owner: ScrinRebels2 + Location: 1,3 + Actor295: swal + Owner: ScrinRebels2 + Location: 1,4 + Actor318: swal + Owner: ScrinRebels2 + Location: 13,90 + Actor319: swal + Owner: ScrinRebels2 + Location: 14,90 + Actor320: swal + Owner: ScrinRebels2 + Location: 15,90 + Actor321: swal + Owner: ScrinRebels2 + Location: 13,89 + Actor322: swal + Owner: ScrinRebels2 + Location: 13,88 + Actor323: swal + Owner: ScrinRebels2 + Location: 14,88 + Actor324: swal + Owner: ScrinRebels2 + Location: 15,88 + Actor325: swal + Owner: ScrinRebels2 + Location: 15,89 + Actor326: swal + Owner: ScrinRebels2 + Location: 24,93 + Actor327: swal + Owner: ScrinRebels2 + Location: 23,93 + Actor328: swal + Owner: ScrinRebels2 + Location: 22,93 + Actor329: swal + Owner: ScrinRebels2 + Location: 22,92 + Actor330: swal + Owner: ScrinRebels2 + Location: 22,91 + Actor331: swal + Owner: ScrinRebels2 + Location: 23,91 + Actor332: swal + Owner: ScrinRebels2 + Location: 24,91 + Actor333: swal + Owner: ScrinRebels2 + Location: 24,92 + Actor334: swal + Owner: ScrinRebels2 + Location: 23,94 + Actor335: swal + Owner: ScrinRebels2 + Location: 12,89 + Actor336: swal + Owner: ScrinRebels2 + Location: 29,101 + Actor337: swal + Owner: ScrinRebels2 + Location: 30,100 + Actor338: swal + Owner: ScrinRebels2 + Location: 30,101 + Actor339: swal + Owner: ScrinRebels2 + Location: 30,102 + Actor340: swal + Owner: ScrinRebels2 + Location: 31,102 + Actor341: swal + Owner: ScrinRebels2 + Location: 32,102 + Actor342: swal + Owner: ScrinRebels2 + Location: 32,101 + Actor343: swal + Owner: ScrinRebels2 + Location: 32,100 + Actor344: swal + Owner: ScrinRebels2 + Location: 31,100 + Actor356: swal + Owner: ScrinRebels2 + Location: 4,1 + Actor357: swal + Owner: ScrinRebels2 + Location: 3,1 + Actor358: swal + Owner: ScrinRebels2 + Location: 5,1 + Actor359: swal + Owner: ScrinRebels2 + Location: 6,1 + Actor360: swal + Owner: ScrinRebels2 + Location: 7,1 + Actor361: swal + Owner: ScrinRebels2 + Location: 8,1 + Actor362: swal + Owner: ScrinRebels2 + Location: 9,1 + Actor363: swal + Owner: ScrinRebels2 + Location: 10,1 + Actor364: swal + Owner: ScrinRebels2 + Location: 11,1 + Actor365: swal + Owner: ScrinRebels2 + Location: 12,1 + Actor366: swal + Owner: ScrinRebels2 + Location: 13,1 + Actor367: swal + Owner: ScrinRebels2 + Location: 14,1 + Actor368: swal + Owner: ScrinRebels2 + Location: 15,1 + Actor369: swal + Owner: ScrinRebels2 + Location: 16,1 + Actor370: swal + Owner: ScrinRebels2 + Location: 17,1 + Actor371: swal + Owner: ScrinRebels2 + Location: 18,1 + Actor372: swal + Owner: ScrinRebels2 + Location: 19,1 + Actor373: swal + Owner: ScrinRebels2 + Location: 20,1 + Actor374: swal + Owner: ScrinRebels2 + Location: 21,1 + Actor390: swal + Owner: ScrinRebels2 + Location: 23,1 + Actor391: swal + Owner: ScrinRebels2 + Location: 22,1 + Actor392: swal + Owner: ScrinRebels2 + Location: 24,1 + Actor393: swal + Owner: ScrinRebels2 + Location: 25,1 + Actor394: swal + Owner: ScrinRebels2 + Location: 26,1 + Actor395: swal + Owner: ScrinRebels2 + Location: 27,1 + Actor396: swal + Owner: ScrinRebels2 + Location: 28,1 + Actor397: swal + Owner: ScrinRebels2 + Location: 28,2 + Actor398: swal + Owner: ScrinRebels2 + Location: 28,3 + Actor294: swal + Owner: ScrinRebels2 + Location: 1,5 + Actor296: swal + Owner: ScrinRebels2 + Location: 28,5 + Actor297: swal + Owner: ScrinRebels2 + Location: 1,6 + Actor298: swal + Owner: ScrinRebels2 + Location: 27,6 + Actor299: swal + Owner: ScrinRebels2 + Location: 28,6 + Actor300: swal + Owner: ScrinRebels2 + Location: 29,6 + Actor301: swal + Owner: ScrinRebels2 + Location: 1,7 + Actor302: swal + Owner: ScrinRebels2 + Location: 27,7 + Actor303: swal + Owner: ScrinRebels2 + Location: 29,7 + Actor304: swal + Owner: ScrinRebels2 + Location: 1,8 + Actor305: swal + Owner: ScrinRebels2 + Location: 27,8 + Actor306: swal + Owner: ScrinRebels2 + Location: 28,8 + Actor307: swal + Owner: ScrinRebels2 + Location: 29,8 + Actor308: swal + Owner: ScrinRebels2 + Location: 1,9 + Actor309: swal + Owner: ScrinRebels2 + Location: 1,10 + Actor310: swal + Owner: ScrinRebels2 + Location: 1,11 + Actor311: swal + Owner: ScrinRebels2 + Location: 1,12 + Actor312: swal + Owner: ScrinRebels2 + Location: 27,12 + Actor313: swal + Owner: ScrinRebels2 + Location: 28,12 + Actor314: swal + Owner: ScrinRebels2 + Location: 29,12 + Actor315: swal + Owner: ScrinRebels2 + Location: 1,13 + Actor316: swal + Owner: ScrinRebels2 + Location: 25,13 + Actor317: swal + Owner: ScrinRebels2 + Location: 26,13 + Actor345: swal + Owner: ScrinRebels2 + Location: 27,13 + Actor346: swal + Owner: ScrinRebels2 + Location: 29,13 + Actor347: swal + Owner: ScrinRebels2 + Location: 1,14 + Actor348: swal + Owner: ScrinRebels2 + Location: 9,14 + Actor349: swal + Owner: ScrinRebels2 + Location: 10,14 + Actor350: swal + Owner: ScrinRebels2 + Location: 11,14 + Actor351: swal + Owner: ScrinRebels2 + Location: 16,14 + Actor352: swal + Owner: ScrinRebels2 + Location: 17,14 + Actor353: swal + Owner: ScrinRebels2 + Location: 18,14 + Actor354: swal + Owner: ScrinRebels2 + Location: 25,14 + Actor355: swal + Owner: ScrinRebels2 + Location: 27,14 + Actor375: swal + Owner: ScrinRebels2 + Location: 28,14 + Actor376: swal + Owner: ScrinRebels2 + Location: 29,14 + Actor377: swal + Owner: ScrinRebels2 + Location: 1,15 + Actor378: swal + Owner: ScrinRebels2 + Location: 2,15 + Actor379: swal + Owner: ScrinRebels2 + Location: 3,15 + Actor380: swal + Owner: ScrinRebels2 + Location: 4,15 + Actor381: swal + Owner: ScrinRebels2 + Location: 5,15 + Actor382: swal + Owner: ScrinRebels2 + Location: 6,15 + Actor383: swal + Owner: ScrinRebels2 + Location: 7,15 + Actor384: swal + Owner: ScrinRebels2 + Location: 8,15 + Actor385: swal + Owner: ScrinRebels2 + Location: 9,15 + Actor386: swal + Owner: ScrinRebels2 + Location: 11,15 + Actor387: swal + Owner: ScrinRebels2 + Location: 16,15 + Actor388: swal + Owner: ScrinRebels2 + Location: 18,15 + Actor389: swal + Owner: ScrinRebels2 + Location: 19,15 + Actor401: swal + Owner: ScrinRebels2 + Location: 20,15 + Actor402: swal + Owner: ScrinRebels2 + Location: 21,15 + Actor403: swal + Owner: ScrinRebels2 + Location: 22,15 + Actor406: swal + Owner: ScrinRebels2 + Location: 23,15 + Actor407: swal + Owner: ScrinRebels2 + Location: 24,15 + Actor408: swal + Owner: ScrinRebels2 + Location: 25,15 + Actor409: swal + Owner: ScrinRebels2 + Location: 9,16 + Actor410: swal + Owner: ScrinRebels2 + Location: 10,16 + Actor411: swal + Owner: ScrinRebels2 + Location: 11,16 + Actor412: swal + Owner: ScrinRebels2 + Location: 16,16 + Actor413: swal + Owner: ScrinRebels2 + Location: 17,16 + Actor414: swal + Owner: ScrinRebels2 + Location: 18,16 + Actor399: swal + Owner: ScrinRebels2 + Location: 28,4 + Actor400: swal + Owner: ScrinRebels3 + Location: 128,49 + Actor404: swal + Owner: ScrinRebels3 + Location: 128,50 + Actor405: swal + Owner: ScrinRebels3 + Location: 128,51 + Actor415: swal + Owner: ScrinRebels3 + Location: 128,52 + Actor416: swal + Owner: ScrinRebels3 + Location: 128,54 + Actor417: swal + Owner: ScrinRebels3 + Location: 128,53 + Actor418: swal + Owner: ScrinRebels3 + Location: 128,55 + Actor419: swal + Owner: ScrinRebels3 + Location: 128,56 + Actor420: swal + Owner: ScrinRebels3 + Location: 128,57 + Actor421: swal + Owner: ScrinRebels3 + Location: 128,58 + Actor422: swal + Owner: ScrinRebels3 + Location: 128,60 + Actor423: swal + Owner: ScrinRebels3 + Location: 128,59 + Actor424: swal + Owner: ScrinRebels3 + Location: 128,48 + Actor425: swal + Owner: ScrinRebels3 + Location: 128,46 + Actor426: swal + Owner: ScrinRebels3 + Location: 128,44 + Actor427: swal + Owner: ScrinRebels3 + Location: 128,45 + Actor428: swal + Owner: ScrinRebels3 + Location: 128,47 + Actor429: swal + Owner: ScrinRebels3 + Location: 127,44 + Actor430: swal + Owner: ScrinRebels3 + Location: 125,44 + Actor431: swal + Owner: ScrinRebels3 + Location: 126,44 + Actor432: swal + Owner: ScrinRebels3 + Location: 123,44 + Actor433: swal + Owner: ScrinRebels3 + Location: 124,44 + Actor434: swal + Owner: ScrinRebels3 + Location: 123,45 + Actor435: swal + Owner: ScrinRebels3 + Location: 122,44 + Actor436: swal + Owner: ScrinRebels3 + Location: 122,45 + Actor437: swal + Owner: ScrinRebels3 + Location: 121,45 + Actor438: swal + Owner: ScrinRebels3 + Location: 120,45 + Actor439: swal + Owner: ScrinRebels3 + Location: 119,45 + Actor440: swal + Owner: ScrinRebels3 + Location: 118,45 + Actor441: swal + Owner: ScrinRebels3 + Location: 117,45 + Actor442: swal + Owner: ScrinRebels3 + Location: 117,44 + Actor443: swal + Owner: ScrinRebels3 + Location: 116,44 + Actor444: swal + Owner: ScrinRebels3 + Location: 115,44 + Actor445: swal + Owner: ScrinRebels3 + Location: 115,45 + Actor446: swal + Owner: ScrinRebels3 + Location: 115,46 + Actor447: swal + Owner: ScrinRebels3 + Location: 116,46 + Actor448: swal + Owner: ScrinRebels3 + Location: 117,46 + Actor449: swal + Owner: ScrinRebels3 + Location: 110,46 + Actor450: swal + Owner: ScrinRebels3 + Location: 109,46 + Actor451: swal + Owner: ScrinRebels3 + Location: 109,47 + Actor452: swal + Owner: ScrinRebels3 + Location: 109,48 + Actor453: swal + Owner: ScrinRebels3 + Location: 110,48 + Actor454: swal + Owner: ScrinRebels3 + Location: 111,47 + Actor455: swal + Owner: ScrinRebels3 + Location: 111,46 + Actor456: swal + Owner: ScrinRebels3 + Location: 111,48 + Actor457: swal + Owner: ScrinRebels3 + Location: 109,49 + Actor458: swal + Owner: ScrinRebels3 + Location: 109,50 + Actor459: swal + Owner: ScrinRebels3 + Location: 109,51 + Actor460: swal + Owner: ScrinRebels3 + Location: 109,52 + Actor461: swal + Owner: ScrinRebels3 + Location: 109,53 + Actor462: swal + Owner: ScrinRebels3 + Location: 110,53 + Actor463: swal + Owner: ScrinRebels3 + Location: 110,52 + Actor464: swal + Owner: ScrinRebels3 + Location: 109,57 + Actor465: swal + Owner: ScrinRebels3 + Location: 109,58 + Actor466: swal + Owner: ScrinRebels3 + Location: 110,57 + Actor467: swal + Owner: ScrinRebels3 + Location: 110,58 + Actor468: swal + Owner: ScrinRebels3 + Location: 109,59 + Actor469: swal + Owner: ScrinRebels3 + Location: 109,60 + Actor470: swal + Owner: ScrinRebels3 + Location: 109,61 + Actor471: swal + Owner: ScrinRebels3 + Location: 109,62 + Actor472: swal + Owner: ScrinRebels3 + Location: 110,62 + Actor473: swal + Owner: ScrinRebels3 + Location: 109,63 + Actor474: swal + Owner: ScrinRebels3 + Location: 109,64 + Actor475: swal + Owner: ScrinRebels3 + Location: 110,64 + Actor476: swal + Owner: ScrinRebels3 + Location: 111,64 + Actor477: swal + Owner: ScrinRebels3 + Location: 111,63 + Actor478: swal + Owner: ScrinRebels3 + Location: 111,62 + Actor479: swal + Owner: ScrinRebels3 + Location: 112,64 + Actor480: swal + Owner: ScrinRebels3 + Location: 113,64 + Actor481: swal + Owner: ScrinRebels3 + Location: 113,65 + Actor482: swal + Owner: ScrinRebels3 + Location: 113,66 + Actor483: swal + Owner: ScrinRebels3 + Location: 114,66 + Actor484: swal + Owner: ScrinRebels3 + Location: 115,66 + Actor485: swal + Owner: ScrinRebels3 + Location: 116,66 + Actor486: swal + Owner: ScrinRebels3 + Location: 116,65 + Actor487: swal + Owner: ScrinRebels3 + Location: 117,65 + Actor488: swal + Owner: ScrinRebels3 + Location: 117,66 + Actor489: swal + Owner: ScrinRebels3 + Location: 123,65 + Actor490: swal + Owner: ScrinRebels3 + Location: 123,66 + Actor491: swal + Owner: ScrinRebels3 + Location: 124,66 + Actor492: swal + Owner: ScrinRebels3 + Location: 124,65 + Actor493: swal + Owner: ScrinRebels3 + Location: 125,66 + Actor494: swal + Owner: ScrinRebels3 + Location: 127,66 + Actor495: swal + Owner: ScrinRebels3 + Location: 126,66 + Actor496: swal + Owner: ScrinRebels3 + Location: 128,66 + Actor497: swal + Owner: ScrinRebels3 + Location: 128,65 + Actor498: swal + Owner: ScrinRebels3 + Location: 128,64 + Actor499: swal + Owner: ScrinRebels3 + Location: 128,63 + Actor500: swal + Owner: ScrinRebels3 + Location: 128,62 + Actor501: swal + Owner: ScrinRebels3 + Location: 128,61 + Actor502: scol + Owner: ScrinRebels1 + Location: 31,101 + Actor503: scol + Owner: ScrinRebels1 + Location: 23,92 + Actor504: scol + Owner: ScrinRebels1 + Location: 14,89 + Actor505: scol + Location: 10,15 + Owner: ScrinRebels2 + Actor506: scol + Location: 17,15 + Owner: ScrinRebels2 + Actor507: scol + Location: 28,13 + Owner: ScrinRebels2 + Actor508: scol + Location: 28,7 + Owner: ScrinRebels2 + Actor510: scol + Location: 110,47 + Owner: ScrinRebels3 + Actor513: ptur + Location: 108,52 + TurretFacing: 176 + Owner: ScrinRebels3 + Actor517: ptur + Owner: ScrinRebels1 + Location: 16,88 + TurretFacing: 904 + Actor518: ptur + Owner: ScrinRebels1 + Location: 22,90 + TurretFacing: 793 + Actor519: ptur + Owner: ScrinRebels1 + Location: 33,102 + TurretFacing: 729 + Actor512: ptur + Owner: ScrinRebels3 + Location: 108,58 + TurretFacing: 348 + Actor515: ptur + Owner: ScrinRebels3 + Location: 117,67 + TurretFacing: 539 + Actor516: ptur + Owner: ScrinRebels3 + Location: 123,67 + TurretFacing: 467 + Actor514: ptur + TurretFacing: 176 + Owner: ScrinRebels3 + Location: 111,45 + Actor509: scol + Owner: ScrinRebels3 + Location: 116,45 + Actor511: scol + Owner: ScrinRebels3 + Location: 110,63 + Actor520: ptur + Owner: ScrinRebels2 + Location: 11,17 + TurretFacing: 459 + Actor521: ptur + Owner: ScrinRebels2 + Location: 16,17 + TurretFacing: 705 + Actor522: ptur + Owner: ScrinRebels2 + Location: 30,12 + TurretFacing: 682 + Actor523: ptur + Owner: ScrinRebels2 + Location: 30,8 + TurretFacing: 737 + Actor525: wsph + Owner: ScrinRebels1 + Location: 10,93 + Actor524: sfac + Owner: ScrinRebels1 + Location: 18,109 + Actor526: rea2 + Owner: ScrinRebels1 + Location: 21,109 + Actor527: rea2 + Owner: ScrinRebels1 + Location: 24,109 + Actor528: rea2 + Owner: ScrinRebels1 + Location: 2,98 + Actor529: rea2 + Owner: ScrinRebels1 + Location: 2,95 + Actor530: rea2 + Owner: ScrinRebels1 + Location: 2,92 + Actor531: rea2 + Owner: ScrinRebels1 + Location: 5,97 + Actor532: rea2 + Owner: ScrinRebels1 + Location: 5,94 + Actor533: proc.scrin + Owner: ScrinRebels1 + Location: 23,99 + Actor534: nerv + Owner: ScrinRebels1 + Location: 10,99 + Actor535: port + Owner: ScrinRebels1 + Location: 18,99 + Actor537: srep + Owner: ScrinRebels1 + Location: 16,104 + Actor538: mani + Owner: ScrinRebels1 + Location: 3,104 + Actor539: silo.scrin + Owner: ScrinRebels1 + Location: 27,97 + Actor540: silo.scrin + Owner: ScrinRebels1 + Location: 27,98 + Actor541: silo.scrin + Owner: ScrinRebels1 + Location: 27,99 + Actor542: shar + Owner: ScrinRebels1 + Location: 24,96 + Actor543: shar + Owner: ScrinRebels1 + Location: 9,90 + Actor544: shar + Owner: ScrinRebels1 + Location: 4,89 + Actor545: shar + Owner: ScrinRebels1 + Location: 27,101 + Actor546: shar + Owner: ScrinRebels1 + Location: 27,111 + Actor547: ptur + Owner: ScrinRebels1 + Location: 29,108 + TurretFacing: 745 + Actor548: sign + Owner: ScrinRebels1 + Location: 3,107 + Actor549: scrt + Owner: ScrinRebels1 + Location: 8,104 + Actor550: swal + Owner: ScrinRebels1 + Location: 1,103 + Actor551: swal + Owner: ScrinRebels1 + Location: 1,104 + Actor552: swal + Owner: ScrinRebels1 + Location: 1,105 + Actor553: swal + Owner: ScrinRebels1 + Location: 1,106 + Actor554: swal + Owner: ScrinRebels1 + Location: 1,107 + Actor555: swal + Owner: ScrinRebels1 + Location: 1,108 + Actor556: swal + Owner: ScrinRebels1 + Location: 1,109 + Actor557: swal + Owner: ScrinRebels1 + Location: 1,110 + Actor558: swal + Owner: ScrinRebels1 + Location: 1,111 + Actor559: swal + Owner: ScrinRebels1 + Location: 1,112 + Actor560: swal + Owner: ScrinRebels1 + Location: 2,112 + Actor561: swal + Owner: ScrinRebels1 + Location: 4,112 + Actor562: swal + Owner: ScrinRebels1 + Location: 3,112 + Actor563: swal + Owner: ScrinRebels1 + Location: 5,112 + Actor564: swal + Owner: ScrinRebels1 + Location: 6,112 + Actor565: swal + Owner: ScrinRebels1 + Location: 7,112 + Actor566: swal + Owner: ScrinRebels1 + Location: 8,112 + Actor567: swal + Owner: ScrinRebels1 + Location: 10,112 + Actor568: swal + Owner: ScrinRebels1 + Location: 9,112 + Actor569: swal + Owner: ScrinRebels1 + Location: 11,112 + Actor570: swal + Owner: ScrinRebels1 + Location: 12,112 + Actor571: swal + Owner: ScrinRebels1 + Location: 14,112 + Actor572: swal + Owner: ScrinRebels1 + Location: 15,112 + Actor573: swal + Owner: ScrinRebels1 + Location: 13,112 + Actor574: swal + Owner: ScrinRebels1 + Location: 2,101 + Actor575: swal + Owner: ScrinRebels1 + Location: 2,102 + Actor576: swal + Owner: ScrinRebels1 + Location: 17,111 + Actor577: swal + Owner: ScrinRebels1 + Location: 16,111 + Actor578: rea2 + Owner: ScrinRebels1 + Location: 7,109 + Actor579: rea2 + Owner: ScrinRebels1 + Location: 10,109 + Actor536: rea2 + Owner: ScrinRebels1 + Location: 13,109 + Actor580: grav + Owner: ScrinRebels1 + Location: 12,104 + Actor581: sfac + Owner: ScrinRebels3 + Location: 125,46 + Actor582: proc.scrin + Owner: ScrinRebels3 + Location: 119,59 + Actor583: port + Owner: ScrinRebels3 + Location: 113,59 + Actor584: wsph + Owner: ScrinRebels3 + Location: 114,50 + Actor586: nerv + Owner: ScrinRebels3 + Location: 126,63 + Actor587: rea2 + Owner: ScrinRebels3 + Location: 125,49 + Actor585: rea2 + Owner: ScrinRebels3 + Location: 125,52 + Actor588: rea2 + Owner: ScrinRebels3 + Location: 125,55 + Actor589: rea2 + Owner: ScrinRebels3 + Location: 125,58 + Actor590: rea2 + Owner: ScrinRebels3 + Location: 122,53 + Actor591: rea2 + Owner: ScrinRebels3 + Location: 122,50 + Actor592: rea2 + Owner: ScrinRebels3 + Location: 122,56 + Actor593: scrt + Owner: ScrinRebels3 + Location: 119,52 + Actor594: grav + Location: 119,46 + Owner: ScrinRebels3 + Actor595: sfac + Owner: ScrinRebels2 + Location: 2,3 + Actor596: rea2 + Owner: ScrinRebels2 + Location: 5,2 + Actor597: rea2 + Owner: ScrinRebels2 + Location: 8,2 + Actor598: rea2 + Owner: ScrinRebels2 + Location: 11,2 + Actor599: rea2 + Owner: ScrinRebels2 + Location: 14,2 + Actor600: rea2 + Owner: ScrinRebels2 + Location: 17,2 + Actor602: wsph + Owner: ScrinRebels2 + Location: 18,9 + Actor603: proc.scrin + Owner: ScrinRebels2 + Location: 8,9 + Actor604: grav + Owner: ScrinRebels2 + Location: 13,7 + Actor605: nerv + Owner: ScrinRebels2 + Location: 2,12 + Actor606: scrt + Owner: ScrinRebels2 + Location: 2,7 + Actor608: tpod + Owner: ScrinRebels1 + Location: 17,90 + Facing: 951 + Actor609: tpod + Owner: ScrinRebels1 + Location: 20,92 + Facing: 927 + Actor610: tpod + Owner: ScrinRebels1 + Location: 30,104 + Facing: 745 + Actor611: tpod + Owner: ScrinRebels1 + Location: 32,108 + Facing: 729 + Actor612: null + Owner: ScrinRebels1 + Location: 25,98 + Facing: 904 + Actor613: null + Owner: ScrinRebels1 + Location: 8,92 + Facing: 927 + Actor614: tpod + Owner: ScrinRebels1 + Facing: 384 + Location: 121,66 + Actor615: tpod + Owner: ScrinRebels1 + Facing: 384 + Location: 125,68 + Actor616: tpod + Owner: ScrinRebels1 + Location: 107,50 + Facing: 269 + Actor617: tpod + Owner: ScrinRebels1 + Location: 107,60 + Facing: 245 + Actor618: tpod + Owner: ScrinRebels1 + Location: 117,43 + Facing: 142 + Actor619: ruin + Owner: ScrinRebels1 + Facing: 384 + Location: 110,60 + Actor620: ruin + Owner: ScrinRebels1 + Facing: 384 + Location: 115,65 + Actor621: ruin + Owner: ScrinRebels1 + Location: 110,50 + Facing: 214 + Actor622: gunw + Owner: ScrinRebels1 + Location: 118,46 + Facing: 142 + Actor623: gunw + Owner: ScrinRebels1 + Facing: 384 + Location: 112,63 + Actor624: gunw + Owner: ScrinRebels1 + Facing: 384 + Location: 124,64 + Actor625: gunw + Owner: ScrinRebels1 + Location: 26,103 + Facing: 618 + Actor626: gunw + Owner: ScrinRebels1 + Location: 10,91 + Facing: 864 + Actor627: gunw + Owner: ScrinRebels1 + Location: 20,94 + Facing: 0 + Actor628: gunw + Owner: ScrinRebels1 + Location: 31,110 + Facing: 729 + Actor629: null + Owner: ScrinRebels1 + Location: 119,56 + Facing: 317 + Actor630: tpod + Owner: ScrinRebels1 + Location: 10,18 + Facing: 570 + Actor631: tpod + Owner: ScrinRebels1 + Facing: 384 + Location: 15,15 + Actor632: tpod + Owner: ScrinRebels1 + Location: 31,13 + Facing: 666 + Actor634: corr + Owner: ScrinRebels1 + Location: 19,17 + Facing: 602 + Actor635: corr + Owner: ScrinRebels1 + Facing: 384 + Location: 122,69 + Actor636: corr + Owner: ScrinRebels1 + Location: 12,87 + Facing: 808 + Actor637: impl + Owner: ScrinRebels1 + SubCell: 3 + Location: 16,102 + Facing: 800 + Actor639: impl + Owner: ScrinRebels1 + SubCell: 3 + Location: 10,97 + Facing: 384 + Actor640: impl + Owner: ScrinRebels1 + SubCell: 3 + Location: 8,101 + Facing: 547 + Actor641: impl + Owner: ScrinRebels1 + SubCell: 3 + Location: 5,102 + Facing: 594 + Actor642: impl + Owner: ScrinRebels1 + SubCell: 3 + Location: 22,107 + Facing: 697 + Actor643: mast + Owner: ScrinRebels1 + SubCell: 3 + Location: 7,107 + Facing: 840 + Actor638: impl + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 124,69 + Actor644: impl + Owner: ScrinRebels1 + SubCell: 3 + Location: 106,55 + Facing: 325 + Actor645: impl + Owner: ScrinRebels1 + Facing: 384 + Location: 108,51 + SubCell: 3 + Actor646: impl + Owner: ScrinRebels1 + SubCell: 3 + Location: 108,59 + Facing: 190 + Actor647: s2 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 118,54 + Actor648: s2 + Owner: ScrinRebels1 + Facing: 384 + Location: 108,50 + SubCell: 3 + Actor649: s2 + Owner: ScrinRebels1 + SubCell: 3 + Location: 106,59 + Facing: 118 + Actor650: gunw + Owner: ScrinRebels1 + Location: 8,17 + Facing: 634 + Actor651: s2 + Owner: ScrinRebels1 + SubCell: 3 + Location: 20,16 + Facing: 666 + Actor652: s2 + Owner: ScrinRebels1 + SubCell: 3 + Location: 30,14 + Facing: 578 + Actor653: atmz + Owner: ScrinRebels1 + Location: 5,13 + Facing: 594 + Actor654: devo + Owner: ScrinRebels1 + Location: 27,15 + Facing: 650 + Actor655: gunw + Owner: ScrinRebels1 + Location: 23,14 + Facing: 721 + Actor656: impl + Owner: ScrinRebels1 + SubCell: 3 + Location: 31,7 + Facing: 650 + Actor657: impl + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 17,18 + Actor658: s4 + Owner: ScrinRebels1 + SubCell: 3 + Location: 26,7 + Facing: 384 + Actor659: s4 + Owner: ScrinRebels1 + SubCell: 3 + Location: 20,14 + Facing: 618 + Actor660: s4 + Owner: ScrinRebels1 + SubCell: 3 + Location: 9,5 + Facing: 618 + Actor661: s4 + Owner: ScrinRebels1 + SubCell: 3 + Location: 7,6 + Facing: 594 + Actor662: s4 + Owner: ScrinRebels1 + SubCell: 3 + Location: 11,5 + Facing: 658 + Actor663: s4 + Owner: ScrinRebels1 + SubCell: 3 + Location: 30,98 + Facing: 721 + Actor664: s4 + Owner: ScrinRebels1 + SubCell: 3 + Location: 27,94 + Facing: 721 + Actor665: s4 + Owner: ScrinRebels1 + SubCell: 3 + Location: 33,104 + Facing: 911 + Actor666: s4 + Owner: ScrinRebels1 + SubCell: 3 + Location: 15,86 + Facing: 777 + Actor667: s4 + Owner: ScrinRebels1 + Location: 16,86 + SubCell: 3 + Facing: 896 + Actor668: devo + Owner: ScrinRebels1 + Location: 109,66 + Facing: 317 + Actor669: devo + Owner: ScrinRebels1 + Location: 31,96 + Facing: 816 + Actor670: devo + Owner: ScrinRebels1 + Location: 27,92 + Facing: 848 + Actor671: s1 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 11,85 + Actor672: s1 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 32,98 + Actor673: s1 + Owner: ScrinRebels1 + SubCell: 3 + Location: 28,95 + Facing: 737 + Actor674: s1 + Owner: ScrinRebels1 + SubCell: 3 + Location: 33,109 + Facing: 856 + Actor675: s1 + Owner: ScrinRebels1 + Location: 34,109 + SubCell: 3 + Facing: 737 + Actor676: s1 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 111,66 + Actor677: s1 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 109,65 + Actor678: s1 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 107,62 + Actor679: s1 + Owner: ScrinRebels1 + Facing: 384 + Location: 107,62 + SubCell: 1 + Actor680: s1 + Owner: ScrinRebels1 + SubCell: 3 + Location: 107,47 + Facing: 182 + Actor681: s1 + Owner: ScrinRebels1 + Location: 108,46 + SubCell: 3 + Facing: 142 + Actor682: s1 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 115,43 + Actor683: s1 + Owner: ScrinRebels1 + Facing: 384 + Location: 115,43 + SubCell: 1 + Actor684: s1 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 22,16 + Actor685: s1 + Owner: ScrinRebels1 + SubCell: 3 + Location: 32,8 + Facing: 674 + Actor686: splitblue + Owner: Neutral + Location: 41,108 + Actor687: splitblue + Owner: Neutral + Location: 42,101 + Actor688: splitblue + Owner: Neutral + Location: 38,94 + Actor689: splitblue + Owner: Neutral + Location: 7,79 + Actor690: splitblue + Owner: Neutral + Location: 12,77 + Actor691: splitblue + Owner: Neutral + Location: 16,82 + Actor692: splitblue + Owner: Neutral + Location: 118,75 + Actor693: splitblue + Owner: Neutral + Location: 123,75 + Actor694: splitblue + Owner: Neutral + Location: 122,79 + Actor695: splitblue + Owner: Neutral + Location: 4,25 + Actor696: splitblue + Owner: Neutral + Location: 7,21 + Actor697: splitblue + Owner: Neutral + Location: 11,23 + Actor698: splitblue + Owner: Neutral + Location: 46,40 + Actor699: splitblue + Owner: Neutral + Location: 44,47 + Actor700: splitblue + Owner: Neutral + Location: 46,54 + Actor701: splitblue + Owner: Neutral + Location: 70,72 + Actor702: splitblue + Owner: Neutral + Location: 68,77 + Actor703: splitblue + Owner: Neutral + Location: 63,72 + Actor704: splitblue + Owner: Neutral + Location: 97,17 + Actor705: splitblue + Owner: Neutral + Location: 99,23 + Actor706: splitblue + Owner: Neutral + Location: 95,31 + Actor707: splitblue + Owner: Neutral + Location: 103,30 + SignalTransmitter1: sign + Owner: SignalTransmittersPlayer + Location: 80,17 + Actor711: shar + Owner: ScrinRebels2 + Location: 7,14 + Actor712: shar + Owner: ScrinRebels2 + Location: 21,14 + Actor713: shar + Owner: ScrinRebels2 + Location: 27,4 + Actor714: port + Owner: ScrinRebels2 + Location: 24,2 + Actor715: srep + Owner: ScrinRebels2 + Location: 19,5 + Actor716: brik + Owner: Nod + Location: 75,55 + Actor717: brik + Owner: Nod + Location: 75,54 + Actor718: brik + Owner: Nod + Location: 75,53 + Actor719: brik + Owner: Nod + Location: 75,52 + Actor720: brik + Owner: Nod + Location: 75,51 + Actor721: brik + Owner: Nod + Location: 75,50 + Actor722: brik + Owner: Nod + Location: 75,45 + Actor723: brik + Owner: Nod + Location: 74,45 + Actor724: brik + Owner: Nod + Location: 75,44 + Actor725: brik + Owner: Nod + Location: 75,43 + Actor726: brik + Owner: Nod + Location: 75,41 + Actor727: brik + Owner: Nod + Location: 74,41 + Actor728: brik + Owner: Nod + Location: 73,41 + Actor729: brik + Owner: Nod + Location: 70,41 + Actor730: brik + Owner: Nod + Location: 69,41 + Actor731: brik + Owner: Nod + Location: 68,41 + Actor732: brik + Owner: Nod + Location: 67,41 + Actor733: brik + Owner: Nod + Location: 66,41 + Actor734: brik + Owner: Nod + Location: 67,42 + Actor735: brik + Owner: Nod + Location: 72,41 + Actor736: brik + Owner: Nod + Location: 71,41 + Actor737: brik + Owner: Nod + Location: 58,41 + Actor738: brik + Owner: Nod + Location: 58,42 + Actor739: brik + Owner: Nod + Location: 59,42 + Actor740: brik + Owner: Nod + Location: 59,41 + Actor741: brik + Owner: Nod + Location: 56,41 + Actor742: brik + Owner: Nod + Location: 55,41 + Actor743: brik + Owner: Nod + Location: 54,41 + Actor744: brik + Owner: Nod + Location: 53,41 + Actor745: brik + Owner: Nod + Location: 52,41 + Actor746: brik + Owner: Nod + Location: 51,41 + Actor747: brik + Owner: Nod + Location: 50,41 + Actor748: brik + Owner: Nod + Location: 49,41 + Actor749: brik + Owner: Nod + Location: 49,42 + Actor750: brik + Owner: Nod + Location: 49,43 + Actor751: brik + Owner: Nod + Location: 49,44 + Actor752: brik + Owner: Nod + Location: 49,45 + Actor753: brik + Owner: Nod + Location: 49,46 + Actor754: brik + Owner: Nod + Location: 49,47 + Actor755: brik + Owner: Nod + Location: 50,47 + Actor756: brik + Owner: Nod + Location: 50,46 + Actor757: brik + Owner: Nod + Location: 49,51 + Actor758: brik + Owner: Nod + Location: 49,52 + Actor759: brik + Owner: Nod + Location: 50,52 + Actor760: brik + Owner: Nod + Location: 50,51 + Actor761: brik + Owner: Nod + Location: 49,53 + Actor762: brik + Owner: Nod + Location: 49,54 + Actor763: brik + Owner: Nod + Location: 49,55 + Actor764: brik + Owner: Nod + Location: 49,56 + Actor765: brik + Owner: Nod + Location: 49,57 + Actor766: brik + Owner: Nod + Location: 53,58 + Actor767: brik + Owner: Nod + Location: 53,57 + Actor768: brik + Owner: Nod + Location: 51,58 + Actor769: brik + Owner: Nod + Location: 50,58 + NodFactory: weap.td + Owner: Nod + Location: 58,46 + NodConyard: afac + Owner: Nod + Location: 58,55 + Actor773: nuk2 + Owner: Nod + Location: 59,51 + Actor774: nuk2 + Owner: Nod + Location: 57,51 + Actor775: nuk2 + Owner: Nod + Location: 71,58 + Actor776: nuk2 + Owner: Nod + Location: 55,54 + Actor777: nuk2 + Owner: Nod + Location: 55,51 + NodHand: hand + Owner: Nod + Location: 70,43 + Actor779: obli + Owner: Nod + Location: 57,42 + Actor780: obli + Owner: Nod + Location: 68,42 + Actor781: nsam + Owner: Nod + Location: 73,42 + Actor782: nsam + Owner: Nod + Location: 50,42 + Actor783: nsam + Owner: Nod + Location: 51,57 + NodComms: hq + Owner: Nod + Location: 52,52 + Actor785: proc.td + Owner: Nod + Location: 53,45 + Actor786: obli + Owner: Nod + Location: 74,44 + Actor787: obli + Owner: Nod + Location: 50,45 + Actor788: rep + Owner: Nod + Location: 65,47 + Actor789: gun.nod + Owner: Nod + TurretFacing: 872 + Location: 76,46 + Actor790: gun.nod + Owner: Nod + Location: 59,40 + TurretFacing: 166 + Actor791: gun.nod + Owner: Nod + TurretFacing: 872 + Location: 66,40 + Actor792: gun.nod + Owner: Nod + Location: 48,47 + Actor793: gun.nod + Owner: Nod + Location: 48,51 + HardOnlyElite: rmbc + Owner: Nod + SubCell: 3 + Location: 69,44 + ScriptTags: HardAndAbove + Facing: 384 + Actor795: bh + Owner: Nod + SubCell: 3 + Location: 61,43 + Facing: 384 + Actor796: bh + Owner: Nod + SubCell: 3 + Location: 64,43 + Facing: 384 + HardOnlyReaper: reap + Owner: Nod + SubCell: 3 + Location: 53,51 + ScriptTags: HardAndAbove + Facing: 384 + Actor798: ftnk + Owner: Nod + Location: 63,41 + Facing: 0 + Actor799: arty.nod + Owner: Nod + Location: 53,42 + Facing: 0 + Actor800: ltnk + Owner: Nod + Location: 61,38 + Facing: 0 + Actor801: ltnk + Owner: Nod + Location: 64,37 + Facing: 0 + Actor802: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 59,43 + Actor803: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 51,44 + Actor804: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 50,49 + Actor805: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 51,47 + Actor806: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 56,43 + Actor807: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 67,38 + Actor808: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 60,37 + Actor809: scrinflora1 + Owner: Neutral + Location: 67,19 + Actor810: scrinflora3 + Owner: Neutral + Location: 81,11 + Actor811: scrinflora1 + Owner: Neutral + Location: 111,7 + Actor812: scrinflora1 + Owner: Neutral + Location: 94,44 + Actor813: scrinflora1 + Owner: Neutral + Location: 104,73 + Actor814: scrinflora1 + Owner: Neutral + Location: 97,94 + Actor815: scrinflora1 + Owner: Neutral + Location: 70,92 + Actor816: scrinflora1 + Owner: Neutral + Location: 48,84 + Actor817: scrinflora1 + Owner: Neutral + Location: 66,108 + Actor818: scrinflora1 + Owner: Neutral + Location: 21,72 + Actor819: scrinflora1 + Owner: Neutral + Location: 16,45 + Actor820: scrinflora1 + Owner: Neutral + Location: 39,23 + Actor821: scrinflora1 + Owner: Neutral + Location: 46,66 + Actor822: scrinflora2 + Owner: Neutral + Location: 95,46 + Actor823: scrinflora2 + Owner: Neutral + Location: 83,6 + Actor824: scrinflora2 + Owner: Neutral + Location: 41,3 + Actor825: scrinflora2 + Owner: Neutral + Location: 126,8 + Actor826: scrinflora2 + Owner: Neutral + Location: 113,33 + Actor827: scrinflora2 + Owner: Neutral + Location: 125,95 + Actor828: scrinflora2 + Owner: Neutral + Location: 68,109 + Actor829: scrinflora2 + Owner: Neutral + Location: 45,89 + Actor830: scrinflora2 + Owner: Neutral + Location: 3,69 + Actor831: scrinflora2 + Owner: Neutral + Location: 79,70 + Actor832: scrinflora3 + Owner: Neutral + Location: 122,5 + Actor833: scrinflora3 + Owner: Neutral + Location: 114,98 + Actor834: scrinflora3 + Owner: Neutral + Location: 80,109 + Actor835: scrinflora4 + Owner: Neutral + Location: 57,88 + Actor836: scrinflora4 + Owner: Neutral + Location: 118,96 + Actor837: scrinflora4 + Owner: Neutral + Location: 56,6 + Actor838: scrinflora4 + Owner: Neutral + Location: 20,37 + Actor839: scrinflora4 + Owner: Neutral + Location: 53,33 + Actor840: scrinflora4 + Owner: Neutral + Location: 5,70 + Actor841: scrinflora4 + Owner: Neutral + Location: 41,63 + Actor842: scrinflora5 + Owner: Neutral + Location: 42,61 + Actor843: scrinflora5 + Owner: Neutral + Location: 46,90 + Actor844: scrinflora5 + Owner: Neutral + Location: 62,106 + Actor845: scrinflora5 + Owner: Neutral + Location: 97,92 + Actor846: scrinflora5 + Owner: Neutral + Location: 126,94 + Actor847: scrinflora5 + Owner: Neutral + Location: 96,56 + Actor848: scrinflora5 + Owner: Neutral + Location: 108,23 + Actor849: scrinflora5 + Owner: Neutral + Location: 126,6 + Actor850: scrinflora5 + Owner: Neutral + Location: 98,4 + Actor851: scrinflora5 + Owner: Neutral + Location: 59,3 + Actor852: scrinflora5 + Owner: Neutral + Location: 50,3 + Actor853: scrinflora5 + Owner: Neutral + Location: 42,27 + Actor854: scrinflora5 + Owner: Neutral + Location: 2,44 + Actor855: scrinflora5 + Owner: Neutral + Location: 1,67 + Actor856: scrinflora5 + Owner: Neutral + Location: 25,76 + Actor857: scrinflora6 + Owner: Neutral + Location: 54,18 + Actor858: scrinflora6 + Owner: Neutral + Location: 114,24 + Actor859: scrinflora6 + Owner: Neutral + Location: 91,81 + Actor860: scrinflora6 + Owner: Neutral + Location: 99,103 + Actor861: scrinflora7 + Owner: Neutral + Location: 81,107 + Actor862: scrinflora7 + Owner: Neutral + Location: 105,76 + Actor863: scrinflora7 + Owner: Neutral + Location: 52,72 + Actor864: scrinflora7 + Owner: Neutral + Location: 60,32 + Actor865: scrinflora7 + Owner: Neutral + Location: 84,55 + Actor866: scrinflora7 + Owner: Neutral + Location: 80,10 + Actor867: scrinflora7 + Owner: Neutral + Location: 56,19 + Actor868: scrinflora7 + Owner: Neutral + Location: 42,2 + Actor869: scrinflora7 + Owner: Neutral + Location: 8,41 + Actor870: scrinflora7 + Owner: Neutral + Location: 4,68 + Actor871: scrinflora7 + Owner: Neutral + Location: 38,86 + Actor872: scrinflora7 + Owner: Neutral + Location: 83,80 + Actor873: scrinflora7 + Owner: Neutral + Location: 113,23 + Actor874: scrinflora7 + Owner: Neutral + Location: 127,9 + Actor875: scrinflora8 + Owner: Neutral + Location: 90,24 + Actor876: scrinflora8 + Owner: Neutral + Location: 55,33 + Actor877: scrinflora8 + Owner: Neutral + Location: 43,25 + Actor878: scrinflora8 + Owner: Neutral + Location: 2,42 + Actor879: scrinflora8 + Owner: Neutral + Location: 21,71 + Actor880: scrinflora8 + Owner: Neutral + Location: 39,85 + Actor881: scrinflora8 + Owner: Neutral + Location: 67,110 + Actor882: scrinflora8 + Owner: Neutral + Location: 115,96 + Actor883: scrinflora8 + Owner: Neutral + Location: 96,54 + Actor884: scrinflora8 + Owner: Neutral + Location: 120,3 + Actor885: scrinflora8 + Owner: Neutral + Location: 58,5 + Actor886: scrinflora12 + Owner: Neutral + Location: 114,96 + Actor887: scrinflora12 + Owner: Neutral + Location: 23,37 + Actor888: scrinflora12 + Owner: Neutral + Location: 4,43 + Actor889: scrinflora12 + Owner: Neutral + Location: 46,10 + Actor890: scrinflora12 + Owner: Neutral + Location: 49,2 + Actor891: scrinflora12 + Owner: Neutral + Location: 110,7 + Actor892: scrinflora12 + Owner: Neutral + Location: 105,74 + Actor893: scrinflora12 + Owner: Neutral + Location: 100,106 + Actor894: scrinflora12 + Owner: Neutral + Location: 82,110 + Actor895: scrinflora12 + Owner: Neutral + Location: 66,111 + Actor896: scrinflora13 + Owner: Neutral + Location: 71,92 + Actor897: scrinflora13 + Owner: Neutral + Location: 93,80 + Actor898: scrinflora13 + Owner: Neutral + Location: 97,52 + Actor899: scrinflora13 + Owner: Neutral + Location: 84,57 + Actor900: scrinflora13 + Owner: Neutral + Location: 62,30 + Actor901: scrinflora13 + Owner: Neutral + Location: 67,17 + Actor902: scrinflora13 + Owner: Neutral + Location: 19,37 + Actor903: scrinflora13 + Owner: Neutral + Location: 7,40 + Actor904: scrinflora13 + Owner: Neutral + Location: 23,73 + Actor905: scrinflora13 + Owner: Neutral + Location: 83,47 + Actor906: scrinflora14 + Owner: Neutral + Location: 91,66 + Actor907: scrinflora14 + Owner: Neutral + Location: 85,81 + Actor908: scrinflora14 + Owner: Neutral + Location: 107,75 + Actor909: scrinflora14 + Owner: Neutral + Location: 101,102 + Actor910: scrinflora14 + Owner: Neutral + Location: 64,106 + Actor911: scrinflora14 + Owner: Neutral + Location: 56,88 + Actor912: scrinflora14 + Owner: Neutral + Location: 47,84 + Actor913: scrinflora14 + Owner: Neutral + Location: 47,89 + Actor914: scrinflora14 + Owner: Neutral + Location: 22,73 + Actor915: scrinflora14 + Owner: Neutral + Location: 27,76 + Actor916: scrinflora14 + Owner: Neutral + Location: 18,39 + Actor917: scrinflora14 + Owner: Neutral + Location: 6,46 + Actor918: scrinflora14 + Owner: Neutral + Location: 40,3 + Actor919: scrinflora14 + Owner: Neutral + Location: 47,2 + Actor920: scrinflora14 + Owner: Neutral + Location: 58,2 + Actor921: scrinflora14 + Owner: Neutral + Location: 56,17 + Actor922: scrinflora14 + Owner: Neutral + Location: 79,10 + Actor923: scrinflora14 + Owner: Neutral + Location: 84,6 + Actor924: scrinflora14 + Owner: Neutral + Location: 108,3 + Actor925: scrinflora14 + Owner: Neutral + Location: 112,8 + Actor926: scrinflora14 + Owner: Neutral + Location: 125,5 + Actor927: scrinflora14 + Owner: Neutral + Location: 116,23 + Actor928: scrinflora14 + Owner: Neutral + Location: 112,33 + Actor929: scrinflora14 + Owner: Neutral + Location: 91,80 + Actor930: scrinflora14 + Owner: Neutral + Location: 98,93 + Actor931: swal + Owner: ScrinRebels1 + Location: 79,20 + Actor932: swal + Owner: ScrinRebels1 + Location: 79,19 + Actor933: swal + Owner: ScrinRebels1 + Location: 79,18 + Actor934: swal + Owner: ScrinRebels1 + Location: 79,17 + Actor935: swal + Owner: ScrinRebels1 + Location: 80,20 + Actor936: swal + Owner: ScrinRebels1 + Location: 81,20 + Actor937: swal + Owner: ScrinRebels1 + Location: 82,20 + Actor938: swal + Owner: ScrinRebels1 + Location: 83,20 + Actor939: swal + Owner: ScrinRebels1 + Location: 83,19 + Actor940: swal + Owner: ScrinRebels1 + Location: 82,16 + Actor941: swal + Owner: ScrinRebels1 + Location: 81,16 + Actor942: swal + Owner: ScrinRebels1 + Location: 80,16 + Actor943: swal + Owner: ScrinRebels1 + Location: 79,16 + Actor944: swal + Owner: ScrinRebels1 + Location: 83,16 + Actor945: swal + Owner: ScrinRebels1 + Location: 83,17 + Actor946: swal + Owner: ScrinRebels1 + Location: 83,18 + Actor947: swal + Owner: ScrinRebels1 + Location: 18,46 + Actor948: swal + Owner: ScrinRebels1 + Location: 19,46 + Actor949: swal + Owner: ScrinRebels1 + Location: 20,46 + Actor950: swal + Owner: ScrinRebels1 + Location: 21,46 + Actor951: swal + Owner: ScrinRebels1 + Location: 22,46 + Actor952: swal + Owner: ScrinRebels1 + Location: 18,47 + SignalTransmitter2: sign + Owner: SignalTransmittersPlayer + Location: 19,47 + Actor954: swal + Owner: ScrinRebels1 + Location: 22,47 + Actor955: swal + Owner: ScrinRebels1 + Location: 18,48 + Actor956: swal + Owner: ScrinRebels1 + Location: 22,48 + Actor957: swal + Owner: ScrinRebels1 + Location: 18,49 + Actor958: swal + Owner: ScrinRebels1 + Location: 22,49 + Actor959: swal + Owner: ScrinRebels1 + Location: 18,50 + Actor960: swal + Owner: ScrinRebels1 + Location: 19,50 + Actor961: swal + Owner: ScrinRebels1 + Location: 20,50 + Actor962: swal + Owner: ScrinRebels1 + Location: 21,50 + Actor963: swal + Owner: ScrinRebels1 + Location: 22,50 + Actor964: swal + Owner: ScrinRebels1 + Location: 79,87 + Actor965: swal + Owner: ScrinRebels1 + Location: 80,87 + Actor966: swal + Owner: ScrinRebels1 + Location: 81,87 + Actor967: swal + Owner: ScrinRebels1 + Location: 82,87 + Actor968: swal + Owner: ScrinRebels1 + Location: 83,87 + Actor969: swal + Owner: ScrinRebels1 + Location: 79,88 + SignalTransmitter3: sign + Owner: SignalTransmittersPlayer + Location: 80,88 + Actor971: swal + Owner: ScrinRebels1 + Location: 83,88 + Actor972: swal + Owner: ScrinRebels1 + Location: 79,89 + Actor973: swal + Owner: ScrinRebels1 + Location: 83,89 + Actor974: swal + Owner: ScrinRebels1 + Location: 79,90 + Actor975: swal + Owner: ScrinRebels1 + Location: 83,90 + Actor976: swal + Owner: ScrinRebels1 + Location: 79,91 + Actor977: swal + Owner: ScrinRebels1 + Location: 80,91 + Actor978: swal + Owner: ScrinRebels1 + Location: 81,91 + Actor979: swal + Owner: ScrinRebels1 + Location: 82,91 + Actor980: swal + Owner: ScrinRebels1 + Location: 83,91 + Actor981: shar + Owner: ScrinRebels1 + Location: 78,89 + Actor982: shar + Owner: ScrinRebels1 + Location: 84,89 + Actor983: shar + Owner: ScrinRebels1 + Location: 20,45 + TurretFacing: 192 + Actor984: shar + Owner: ScrinRebels1 + Location: 20,51 + TurretFacing: 682 + Actor985: shar + Owner: ScrinRebels1 + Location: 78,18 + Actor986: shar + Owner: ScrinRebels1 + Location: 84,18 + Actor987: ptur + Owner: ScrinRebels1 + Location: 73,23 + TurretFacing: 388 + Actor988: ptur + Owner: ScrinRebels1 + Location: 71,19 + TurretFacing: 380 + Actor989: ptur + Owner: ScrinRebels1 + Location: 26,39 + TurretFacing: 896 + Actor990: ptur + Owner: ScrinRebels1 + Location: 29,44 + TurretFacing: 848 + Actor992: ptur + Owner: ScrinRebels1 + Location: 76,76 + Actor993: ptur + Owner: ScrinRebels1 + Location: 72,83 + Actor991: scol + Owner: ScrinRebels1 + Location: 81,86 + ScriptTags: HardAndAbove + Actor994: scol + Owner: ScrinRebels1 + Location: 23,48 + ScriptTags: HardAndAbove + Actor995: scol + Owner: ScrinRebels1 + Location: 81,21 + ScriptTags: HardAndAbove + Actor996: null + Owner: ScrinRebels1 + Location: 76,19 + Facing: 384 + Actor997: seek + Owner: ScrinRebels1 + Facing: 384 + Location: 72,17 + Actor998: seek + Owner: ScrinRebels1 + Facing: 384 + Location: 76,23 + Actor999: gunw + Owner: ScrinRebels1 + Location: 24,43 + Facing: 808 + Actor1000: gunw + Owner: ScrinRebels1 + Location: 24,52 + Facing: 666 + Actor1001: devo + Owner: ScrinRebels1 + Location: 25,49 + Facing: 729 + Actor1004: intl.ai2 + Owner: ScrinRebels1 + Location: 77,85 + Facing: 142 + Actor1005: intl.ai2 + Owner: ScrinRebels1 + Location: 80,82 + Facing: 111 + Actor1002: devo + Owner: ScrinRebels1 + Location: 80,84 + Facing: 158 + Actor1003: tpod + Owner: ScrinRebels1 + Location: 75,90 + Facing: 55 + ScriptTags: HardAndAbove + Actor1006: gunw + Owner: ScrinRebels1 + Location: 86,83 + Facing: 229 + Actor1007: gunw + Owner: ScrinRebels1 + Location: 73,89 + Facing: 174 + Actor1008: pac + Owner: ScrinRebels1 + Location: 24,10 + Facing: 634 + Actor1009: pac + Owner: ScrinRebels1 + Location: 5,10 + Facing: 626 + Actor1010: pac + Owner: ScrinRebels1 + Location: 14,100 + Facing: 911 + Actor1011: pac + Owner: ScrinRebels1 + Location: 21,104 + Facing: 919 + Actor1012: pac + Owner: ScrinRebels1 + Location: 119,50 + Facing: 261 + Actor1013: pac + Owner: ScrinRebels1 + Location: 119,58 + Facing: 253 + Actor1014: impl + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 77,21 + Actor1015: impl + Owner: ScrinRebels1 + SubCell: 3 + Location: 22,51 + Facing: 658 + Actor1016: impl + Owner: ScrinRebels1 + SubCell: 3 + Location: 84,86 + Facing: 150 + Actor1017: s4 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 24,50 + Actor1018: s4 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 24,47 + Actor1019: s4 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 22,45 + Actor1020: s4 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 77,18 + Actor1021: s4 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 83,21 + Actor1022: s4 + Owner: ScrinRebels1 + Facing: 384 + Location: 76,17 + SubCell: 3 + Actor1025: s4 + Owner: ScrinRebels1 + SubCell: 3 + Location: 77,93 + Facing: 190 + Actor1029: s1 + Owner: ScrinRebels1 + SubCell: 3 + Location: 88,86 + Facing: 118 + Actor1030: s1 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 23,52 + Actor1031: s1 + Owner: ScrinRebels1 + Facing: 384 + Location: 26,51 + SubCell: 3 + Actor1032: s1 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 26,46 + Actor1033: s1 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 20,42 + Actor1034: s1 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 25,41 + Actor1035: s1 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 21,55 + Actor1036: s1 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 78,23 + Actor1037: s1 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 77,19 + Actor1038: s1 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 73,17 + Actor1039: s1 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 79,14 + Actor1026: s1 + Owner: ScrinRebels1 + SubCell: 3 + Facing: 118 + Location: 75,93 + Actor1027: s1 + Owner: ScrinRebels1 + SubCell: 3 + Facing: 118 + Location: 76,90 + Actor1028: s1 + Owner: ScrinRebels1 + SubCell: 3 + Facing: 118 + Location: 85,85 + Actor1023: s4 + Owner: ScrinRebels1 + SubCell: 3 + Facing: 190 + Location: 77,92 + Actor1024: s4 + Owner: ScrinRebels1 + SubCell: 3 + Facing: 190 + Location: 87,85 + Actor1040: s1 + Owner: ScrinRebels1 + SubCell: 3 + Location: 7,101 + Facing: 634 + Actor1041: s1 + Owner: ScrinRebels1 + SubCell: 3 + Location: 8,107 + Facing: 848 + Actor1042: s1 + Owner: ScrinRebels1 + Location: 4,102 + SubCell: 3 + Facing: 95 + Actor1043: s1 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 21,107 + Actor1044: s1 + Owner: ScrinRebels1 + SubCell: 3 + Location: 23,108 + Facing: 840 + Actor1045: s1 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 121,55 + Actor1046: s1 + Owner: ScrinRebels1 + SubCell: 3 + Location: 125,61 + Facing: 384 + Actor1047: s1 + Owner: ScrinRebels1 + Location: 124,60 + SubCell: 3 + Facing: 888 + Actor1048: s1 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 124,48 + Actor1049: s1 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 124,46 + Actor1050: s1 + Owner: ScrinRebels1 + Facing: 384 + SubCell: 3 + Location: 123,47 + Actor1051: s1 + Owner: ScrinRebels1 + Facing: 384 + Location: 9,5 + SubCell: 1 + Actor1052: s1 + Owner: ScrinRebels1 + SubCell: 3 + Location: 5,6 + Facing: 682 + Actor1053: s1 + Owner: ScrinRebels1 + SubCell: 3 + Location: 13,6 + Facing: 626 + Gateway: wormholexl + Owner: NodGatewayPlayer + Location: 66,62 + Actor1055: e1 + Owner: USSR + SubCell: 3 + Facing: 904 + Location: 68,51 + Actor1056: e1 + Owner: USSR + SubCell: 3 + Facing: 1023 + Location: 64,52 + Actor1057: e1 + Owner: USSR + SubCell: 3 + Facing: 0 + Location: 65,53 + Actor1058: 4tnk + Owner: USSR + Facing: 0 + Location: 66,53 + Actor1059: e1 + Owner: USSR + SubCell: 3 + Facing: 872 + Location: 67,53 + Actor1060: e2 + Owner: USSR + SubCell: 3 + Facing: 198 + Location: 65,54 + PlayerStart: waypoint + Faction: soviet + Owner: Neutral + Location: 66,54 + Actor1062: e1 + Owner: USSR + SubCell: 3 + Facing: 0 + Location: 64,55 + Actor1063: e1 + Owner: USSR + SubCell: 1 + Facing: 118 + Location: 64,55 + Actor1064: 4tnk + Owner: USSR + Facing: 0 + Location: 66,55 + Actor1065: e1 + Owner: USSR + SubCell: 3 + Facing: 864 + Location: 67,55 + Actor1066: e3 + Owner: USSR + SubCell: 3 + Facing: 1023 + Location: 69,55 + Actor1067: btr + Owner: USSR + Facing: 904 + Location: 69,56 + Actor1068: e2 + Owner: USSR + SubCell: 3 + Facing: 166 + Location: 64,57 + Actor1069: 4tnk + Owner: USSR + Facing: 0 + Location: 66,57 + Actor1070: v2rl + Owner: USSR + Facing: 0 + Location: 64,58 + Actor1071: v2rl + Owner: USSR + Facing: 0 + Location: 68,58 + Actor1072: e1 + Owner: USSR + SubCell: 3 + Facing: 919 + Location: 69,58 + Actor1073: e1 + Owner: USSR + SubCell: 3 + Facing: 951 + Location: 70,58 + Actor1074: mcv + Owner: USSR + Facing: 0 + Location: 66,59 + Actor1076: e2 + Owner: USSR + SubCell: 3 + Facing: 111 + Location: 62,58 + Actor1077: e3 + Owner: USSR + SubCell: 3 + Facing: 237 + Location: 63,58 + RebelRally1: waypoint + Owner: Neutral + Location: 32,38 + RebelRally2: waypoint + Owner: Neutral + Location: 76,29 + RebelRally5: waypoint + Owner: Neutral + Location: 58,80 + RebelRally4: waypoint + Owner: Neutral + Location: 86,74 + RebelRally3: waypoint + Owner: Neutral + Location: 90,60 + RebelRally6: waypoint + Owner: Neutral + Location: 36,58 + ScrinWormholeWp2: waypoint + Owner: Neutral + Location: 28,49 + ScrinWormholeWp1: waypoint + Owner: Neutral + Location: 87,22 + ScrinWormholeWp3: waypoint + Owner: Neutral + Location: 91,89 + Actor953: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 65,42 + Actor970: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 61,41 + Actor1054: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 77,47 + Actor1061: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 73,44 + Actor1078: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 72,42 + Actor1079: n1 + Owner: Nod + SubCell: 3 + Location: 63,44 + Facing: 384 + GatewayNerveCenter: nerv + Owner: ScrinRebels1 + Location: 62,54 + Actor1080: btr + Owner: USSR + Facing: 118 + Location: 63,53 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, annexation-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml, annexation-weapons.yaml diff --git a/mods/ca/missions/main-campaign/ca41-annexation/ovld_assist.aud b/mods/ca/missions/main-campaign/ca41-annexation/ovld_assist.aud new file mode 100644 index 0000000000..6db0cc6a21 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca41-annexation/ovld_assist.aud differ diff --git a/mods/ca/missions/main-campaign/ca41-annexation/ovld_capture.aud b/mods/ca/missions/main-campaign/ca41-annexation/ovld_capture.aud new file mode 100644 index 0000000000..0fd74299bc Binary files /dev/null and b/mods/ca/missions/main-campaign/ca41-annexation/ovld_capture.aud differ diff --git a/mods/ca/missions/main-campaign/ca42-schism/cdko_quest.aud b/mods/ca/missions/main-campaign/ca42-schism/cdko_quest.aud new file mode 100644 index 0000000000..2e65cb7460 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca42-schism/cdko_quest.aud differ diff --git a/mods/ca/missions/main-campaign/ca42-schism/kane_stopmadness.aud b/mods/ca/missions/main-campaign/ca42-schism/kane_stopmadness.aud new file mode 100644 index 0000000000..46069f5fa4 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca42-schism/kane_stopmadness.aud differ diff --git a/mods/ca/missions/main-campaign/ca42-schism/map.bin b/mods/ca/missions/main-campaign/ca42-schism/map.bin new file mode 100644 index 0000000000..00d22418cf Binary files /dev/null and b/mods/ca/missions/main-campaign/ca42-schism/map.bin differ diff --git a/mods/ca/missions/main-campaign/ca42-schism/map.png b/mods/ca/missions/main-campaign/ca42-schism/map.png new file mode 100644 index 0000000000..c311705e2b Binary files /dev/null and b/mods/ca/missions/main-campaign/ca42-schism/map.png differ diff --git a/mods/ca/missions/main-campaign/ca42-schism/map.yaml b/mods/ca/missions/main-campaign/ca42-schism/map.yaml new file mode 100644 index 0000000000..0fcf009472 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca42-schism/map.yaml @@ -0,0 +1,5860 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 42: Schism + +Author: Darkademic + +Tileset: TEMPERAT + +MapSize: 130,114 + +Bounds: 1,1,128,112 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: USSR, Nod, Scrin, ScrinRebels, ScrinRebelsOuter, MaleficScrin + PlayerReference@USSR: + Name: USSR + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: soviet + LockColor: True + Color: FE1100 + LockSpawn: True + LockTeam: True + Allies: Scrin, SpyPlaneProvider + Enemies: Nod, ScrinRebels, ScrinRebelsOuter, MaleficScrin, Creeps + PlayerReference@Scrin: + Name: Scrin + Bot: campaign + Faction: scrin + Color: 7700FF + Allies: USSR, SpyPlaneProvider + Enemies: Nod, ScrinRebels, ScrinRebelsOuter, MaleficScrin, Creeps + PlayerReference@Nod: + Name: Nod + Bot: campaign + Faction: nod + Color: 6D738C + Allies: ScrinRebels, ScrinRebelsOuter + Enemies: USSR, Scrin, MaleficScrin, Creeps + PlayerReference@ScrinRebels: + Name: ScrinRebels + Bot: campaign + Faction: scrin + Color: 2FB4A6 + Allies: Nod, ScrinRebelsOuter + Enemies: USSR, Scrin, MaleficScrin, Creeps + PlayerReference@ScrinRebelsOuter: + Name: ScrinRebelsOuter + Bot: campaign + Faction: scrin + Color: 2FB4A6 + Allies: Nod, ScrinRebels + Enemies: USSR, Scrin, MaleficScrin, Creeps + PlayerReference@MaleficScrin: + Name: MaleficScrin + Bot: campaign + Faction: scrin + Color: 3E4549 + Enemies: USSR, Nod, Scrin, ScrinRebels, ScrinRebelsOuter, Creeps + PlayerReference@SpyPlaneProvider: + Name: SpyPlaneProvider + NonCombatant: True + Faction: soviet + Color: FE1100 + Allies: USSR, Scrin + +Actors: + Actor0: swal + Owner: ScrinRebels + Location: 81,31 + Actor1: swal + Owner: ScrinRebels + Location: 82,31 + Actor2: swal + Owner: ScrinRebels + Location: 83,31 + Actor3: swal + Owner: ScrinRebels + Location: 84,31 + Actor4: swal + Owner: ScrinRebels + Location: 72,32 + Actor5: swal + Owner: ScrinRebels + Location: 73,32 + Actor6: swal + Owner: ScrinRebels + Location: 74,32 + Actor7: swal + Owner: ScrinRebels + Location: 75,32 + Actor8: swal + Owner: ScrinRebels + Location: 76,32 + Actor9: swal + Owner: ScrinRebels + Location: 77,32 + Actor10: swal + Owner: ScrinRebels + Location: 78,32 + Actor11: swal + Owner: ScrinRebels + Location: 79,32 + Actor12: swal + Owner: ScrinRebels + Location: 80,32 + Actor13: swal + Owner: ScrinRebels + Location: 81,32 + Actor14: swal + Owner: ScrinRebels + Location: 82,32 + Actor15: swal + Owner: ScrinRebels + Location: 83,32 + Actor16: swal + Owner: ScrinRebels + Location: 84,32 + Actor17: swal + Owner: ScrinRebels + Location: 85,32 + Actor18: swal + Owner: ScrinRebels + Location: 70,33 + Actor19: swal + Owner: ScrinRebels + Location: 71,33 + Actor20: swal + Owner: ScrinRebels + Location: 72,33 + Actor21: shar + Owner: ScrinRebels + Location: 73,33 + Actor22: shar + Owner: ScrinRebels + Location: 83,33 + Actor23: swal + Owner: ScrinRebels + Location: 84,33 + Actor24: swal + Owner: ScrinRebels + Location: 85,33 + Actor25: swal + Owner: ScrinRebels + Location: 86,33 + Actor26: swal + Owner: ScrinRebels + Location: 87,33 + Actor27: swal + Owner: ScrinRebels + Location: 70,34 + Actor28: swal + Owner: ScrinRebels + Location: 85,34 + Actor29: swal + Owner: ScrinRebels + Location: 86,34 + Actor30: swal + Owner: ScrinRebels + Location: 87,34 + Actor31: ptur + Owner: ScrinRebels + Location: 88,34 + Actor32: swal + Owner: ScrinRebels + Location: 69,35 + Actor33: swal + Owner: ScrinRebels + Location: 70,35 + Actor34: swal + Owner: ScrinRebels + Location: 85,35 + Actor35: scol + Owner: ScrinRebels + Location: 86,35 + Actor36: swal + Owner: ScrinRebels + Location: 87,35 + Actor37: swal + Owner: ScrinRebels + Location: 68,36 + Actor38: swal + Owner: ScrinRebels + Location: 69,36 + Actor39: swal + Owner: ScrinRebels + Location: 70,36 + Actor40: swal + Owner: ScrinRebels + Location: 85,36 + Actor41: swal + Owner: ScrinRebels + Location: 86,36 + Actor42: swal + Owner: ScrinRebels + Location: 87,36 + Actor43: swal + Owner: ScrinRebels + Location: 67,37 + Actor44: swal + Owner: ScrinRebels + Location: 68,37 + Actor45: swal + Owner: ScrinRebels + Location: 69,37 + Actor46: ptur + Owner: ScrinRebels + Location: 92,37 + Actor47: swal + Owner: ScrinRebels + Location: 66,38 + Actor48: swal + Owner: ScrinRebels + Location: 67,38 + Actor49: swal + Owner: ScrinRebels + Location: 68,38 + Actor50: swal + Owner: ScrinRebels + Location: 91,38 + Actor51: swal + Owner: ScrinRebels + Location: 92,38 + Actor52: swal + Owner: ScrinRebels + Location: 93,38 + Actor53: swal + Owner: ScrinRebels + Location: 94,38 + Actor54: swal + Owner: ScrinRebels + Location: 66,39 + Actor55: swal + Owner: ScrinRebels + Location: 67,39 + Actor56: swal + Owner: ScrinRebels + Location: 91,39 + Actor57: scol + Owner: ScrinRebels + Location: 92,39 + Actor58: swal + Owner: ScrinRebels + Location: 93,39 + Actor59: swal + Owner: ScrinRebels + Location: 94,39 + Actor60: swal + Owner: ScrinRebels + Location: 66,40 + Actor61: swal + Owner: ScrinRebels + Location: 67,40 + Actor62: shar + Owner: ScrinRebels + Location: 68,40 + Actor63: swal + Owner: ScrinRebels + Location: 91,40 + Actor64: swal + Owner: ScrinRebels + Location: 92,40 + Actor65: swal + Owner: ScrinRebels + Location: 93,40 + Actor66: swal + Owner: ScrinRebels + Location: 94,40 + Actor67: swal + Owner: ScrinRebels + Location: 66,41 + Actor68: swal + Owner: ScrinRebels + Location: 67,41 + Actor69: swal + Owner: ScrinRebels + Location: 68,41 + Actor70: shar + Owner: ScrinRebels + Location: 92,41 + Actor71: swal + Owner: ScrinRebels + Location: 93,41 + Actor72: swal + Owner: ScrinRebels + Location: 94,41 + Actor73: swal + Owner: ScrinRebels + Location: 95,41 + Actor74: swal + Owner: ScrinRebels + Location: 66,42 + Actor75: scol + Owner: ScrinRebels + Location: 67,42 + Actor76: swal + Owner: ScrinRebels + Location: 68,42 + Actor77: swal + Owner: ScrinRebels + Location: 94,42 + Actor78: swal + Owner: ScrinRebels + Location: 95,42 + Actor79: swal + Owner: ScrinRebels + Location: 96,42 + Actor80: ptur + Owner: ScrinRebels + Location: 65,43 + TurretFacing: 245 + Actor81: swal + Owner: ScrinRebels + Location: 66,43 + Actor82: swal + Owner: ScrinRebels + Location: 67,43 + Actor83: swal + Owner: ScrinRebels + Location: 68,43 + Actor84: swal + Owner: ScrinRebels + Location: 95,43 + Actor85: swal + Owner: ScrinRebels + Location: 96,43 + Actor86: swal + Owner: ScrinRebels + Location: 95,44 + Actor87: swal + Owner: ScrinRebels + Location: 96,44 + Actor88: swal + Owner: ScrinRebels + Location: 95,45 + Actor89: swal + Owner: ScrinRebels + Location: 95,46 + Actor90: swal + Owner: ScrinRebels + Location: 95,47 + Actor91: swal + Owner: ScrinRebels + Location: 95,48 + Actor92: ptur + Owner: ScrinRebels + Location: 66,49 + TurretFacing: 325 + Actor93: swal + Owner: ScrinRebels + Location: 67,49 + Actor94: swal + Owner: ScrinRebels + Location: 68,49 + Actor95: swal + Owner: ScrinRebels + Location: 69,49 + Actor96: swal + Owner: ScrinRebels + Location: 94,49 + Actor97: swal + Owner: ScrinRebels + Location: 95,49 + Actor98: swal + Owner: ScrinRebels + Location: 67,50 + Actor99: scol + Owner: ScrinRebels + Location: 68,50 + Actor100: swal + Owner: ScrinRebels + Location: 69,50 + Actor101: swal + Owner: ScrinRebels + Location: 94,50 + Actor102: swal + Owner: ScrinRebels + Location: 67,51 + Actor103: swal + Owner: ScrinRebels + Location: 68,51 + Actor104: swal + Owner: ScrinRebels + Location: 69,51 + Actor105: shar + Owner: ScrinRebels + Location: 70,51 + TurretFacing: 348 + Actor106: shar + Owner: ScrinRebels + Location: 93,51 + Actor107: swal + Owner: ScrinRebels + Location: 94,51 + Actor108: swal + Owner: ScrinRebels + Location: 68,52 + Actor109: swal + Owner: ScrinRebels + Location: 69,52 + Actor110: swal + Owner: ScrinRebels + Location: 70,52 + Actor111: swal + Owner: ScrinRebels + Location: 93,52 + Actor112: swal + Owner: ScrinRebels + Location: 94,52 + Actor113: swal + Owner: ScrinRebels + Location: 69,53 + Actor114: swal + Owner: ScrinRebels + Location: 70,53 + Actor115: swal + Owner: ScrinRebels + Location: 71,53 + Actor116: swal + Owner: ScrinRebels + Location: 72,53 + Actor117: swal + Owner: ScrinRebels + Location: 91,53 + Actor118: swal + Owner: ScrinRebels + Location: 92,53 + Actor119: swal + Owner: ScrinRebels + Location: 93,53 + Actor120: swal + Owner: ScrinRebels + Location: 94,53 + Actor121: swal + Owner: ScrinRebels + Location: 70,54 + Actor122: swal + Owner: ScrinRebels + Location: 71,54 + Actor123: swal + Owner: ScrinRebels + Location: 72,54 + Actor124: swal + Owner: ScrinRebels + Location: 73,54 + Actor125: shar + Owner: ScrinRebels + Location: 74,54 + TurretFacing: 412 + Actor126: shar + Owner: ScrinRebels + Location: 89,54 + Actor127: swal + Owner: ScrinRebels + Location: 90,54 + Actor128: swal + Owner: ScrinRebels + Location: 91,54 + Actor129: swal + Owner: ScrinRebels + Location: 92,54 + Actor130: swal + Owner: ScrinRebels + Location: 93,54 + Actor131: swal + Owner: ScrinRebels + Location: 72,55 + Actor132: swal + Owner: ScrinRebels + Location: 73,55 + Actor133: swal + Owner: ScrinRebels + Location: 74,55 + Actor134: swal + Owner: ScrinRebels + Location: 75,55 + Actor135: swal + Owner: ScrinRebels + Location: 76,55 + Actor136: swal + Owner: ScrinRebels + Location: 78,55 + Actor137: swal + Owner: ScrinRebels + Location: 79,55 + Actor138: swal + Owner: ScrinRebels + Location: 80,55 + Actor139: swal + Owner: ScrinRebels + Location: 87,55 + Actor140: swal + Owner: ScrinRebels + Location: 88,55 + Actor141: swal + Owner: ScrinRebels + Location: 89,55 + Actor142: swal + Owner: ScrinRebels + Location: 90,55 + Actor143: swal + Owner: ScrinRebels + Location: 91,55 + Actor144: swal + Owner: ScrinRebels + Location: 73,56 + Actor145: swal + Owner: ScrinRebels + Location: 74,56 + Actor146: swal + Owner: ScrinRebels + Location: 75,56 + Actor147: swal + Owner: ScrinRebels + Location: 76,56 + Actor148: swal + Owner: ScrinRebels + Location: 77,56 + Actor149: swal + Owner: ScrinRebels + Location: 78,56 + Actor150: scol + Owner: ScrinRebels + Location: 79,56 + Actor151: swal + Owner: ScrinRebels + Location: 80,56 + Actor152: swal + Owner: ScrinRebels + Location: 87,56 + Actor153: scol + Owner: ScrinRebels + Location: 88,56 + Actor154: swal + Owner: ScrinRebels + Location: 89,56 + Actor155: swal + Owner: ScrinRebels + Location: 90,56 + Actor156: swal + Owner: ScrinRebels + Location: 76,57 + Actor157: swal + Owner: ScrinRebels + Location: 77,57 + Actor158: swal + Owner: ScrinRebels + Location: 78,57 + Actor159: swal + Owner: ScrinRebels + Location: 79,57 + Actor160: swal + Owner: ScrinRebels + Location: 80,57 + Actor161: swal + Owner: ScrinRebels + Location: 87,57 + Actor162: swal + Owner: ScrinRebels + Location: 88,57 + Actor163: swal + Owner: ScrinRebels + Location: 89,57 + Actor164: ptur + Owner: ScrinRebels + Location: 80,58 + TurretFacing: 547 + Actor165: ptur + Owner: ScrinRebels + Location: 87,58 + TurretFacing: 452 + Actor167: rea2 + Owner: ScrinRebels + Location: 74,33 + Actor168: rea2 + Owner: ScrinRebels + Location: 77,33 + Actor169: rea2 + Owner: ScrinRebels + Location: 80,33 + Actor171: scrt + Owner: ScrinRebels + Location: 93,43 + Actor172: rea2 + Owner: ScrinRebels + Location: 92,46 + Actor174: rea2 + Owner: ScrinRebels + Location: 90,50 + Actor176: wsph + Owner: ScrinRebels + Location: 85,49 + Actor178: proc.scrin + Owner: ScrinRebels + Location: 88,41 + Actor179: port + Owner: ScrinRebels + Location: 74,49 + Actor180: port + Owner: ScrinRebels + Location: 77,51 + Actor188: swal + Owner: ScrinRebels + Location: 79,45 + Actor189: swal + Owner: ScrinRebels + Location: 78,45 + Actor190: swal + Owner: ScrinRebels + Location: 80,45 + Actor191: swal + Owner: ScrinRebels + Location: 81,45 + Actor192: swal + Owner: ScrinRebels + Location: 78,42 + Purifier: scrinpurifier + Owner: ScrinRebels + Location: 79,42 + Actor194: swal + Owner: ScrinRebels + Location: 79,42 + Actor195: swal + Owner: ScrinRebels + Location: 80,42 + Actor196: swal + Owner: ScrinRebels + Location: 81,42 + Actor197: swal + Owner: ScrinRebels + Location: 78,43 + Actor198: swal + Owner: ScrinRebels + Location: 81,43 + Actor199: swal + Owner: ScrinRebels + Location: 78,44 + Actor200: swal + Owner: ScrinRebels + Location: 79,44 + Actor201: swal + Owner: ScrinRebels + Location: 80,44 + Actor202: swal + Owner: ScrinRebels + Location: 81,44 + Actor203: swal + Owner: ScrinRebels + Location: 77,44 + Actor204: swal + Owner: ScrinRebels + Location: 77,43 + Actor205: swal + Owner: ScrinRebels + Location: 77,42 + Actor206: swal + Owner: ScrinRebels + Location: 82,44 + Actor207: swal + Owner: ScrinRebels + Location: 82,43 + Actor208: swal + Owner: ScrinRebels + Location: 82,42 + Actor209: swal + Owner: ScrinRebels + Location: 78,41 + Actor210: swal + Owner: ScrinRebels + Location: 79,41 + Actor211: swal + Owner: ScrinRebels + Location: 80,41 + Actor212: swal + Owner: ScrinRebels + Location: 81,41 + Actor213: sign + Owner: ScrinRebels + Location: 79,37 + Actor214: nerv + Owner: ScrinRebels + Location: 76,37 + Actor215: srep + Owner: ScrinRebels + Location: 71,41 + Actor217: grav + Owner: ScrinRebels + Location: 71,38 + Actor218: silo.scrin + Owner: ScrinRebels + Location: 71,34 + Actor219: silo.scrin + Owner: ScrinRebels + Location: 71,35 + Actor220: silo.scrin + Owner: ScrinRebels + Location: 71,36 + Actor221: rea2 + Owner: ScrinRebels + Location: 89,47 + Actor222: mani + Owner: ScrinRebels + Location: 83,35 + Actor223: reac + Owner: ScrinRebels + Location: 74,45 + Actor224: reac + Owner: ScrinRebels + Location: 72,45 + Actor225: reac + Owner: ScrinRebels + Location: 77,47 + Actor226: wsph + Owner: ScrinRebels + Location: 80,48 + Actor227: obli + Owner: Nod + Location: 77,55 + Actor228: obli + Owner: Nod + Location: 69,38 + Actor229: obli + Owner: Nod + Location: 71,52 + Actor230: nuk2 + Owner: Nod + Location: 65,23 + Actor231: nuk2 + Owner: Nod + Location: 67,23 + Actor232: nuk2 + Owner: Nod + Location: 69,23 + Actor233: afac + Owner: Nod + Location: 72,23 + Actor234: brik + Owner: Nod + Location: 74,26 + Actor235: brik + Owner: Nod + Location: 73,26 + Actor236: brik + Owner: Nod + Location: 71,26 + Actor237: brik + Owner: Nod + Location: 72,26 + Actor238: brik + Owner: Nod + Location: 69,26 + Actor239: brik + Owner: Nod + Location: 70,26 + Actor240: brik + Owner: Nod + Location: 67,26 + Actor241: brik + Owner: Nod + Location: 68,26 + Actor242: brik + Owner: Nod + Location: 66,26 + Actor243: brik + Owner: Nod + Location: 64,26 + Actor244: brik + Owner: Nod + Location: 65,26 + Actor245: brik + Owner: Nod + Location: 63,26 + Actor246: brik + Owner: Nod + Location: 62,26 + Actor247: brik + Owner: Nod + Location: 61,26 + Actor248: brik + Owner: Nod + Location: 75,26 + Actor249: brik + Owner: Nod + Location: 76,26 + Actor250: brik + Owner: Nod + Location: 76,25 + Actor251: brik + Owner: Nod + Location: 77,25 + Actor252: brik + Owner: Nod + Location: 78,25 + Actor253: brik + Owner: Nod + Location: 79,25 + Actor254: brik + Owner: Nod + Location: 80,25 + Actor255: brik + Owner: Nod + Location: 80,24 + Actor256: brik + Owner: Nod + Location: 79,24 + Actor257: brik + Owner: Nod + Location: 80,23 + Actor258: brik + Owner: Nod + Location: 80,22 + Actor259: brik + Owner: Nod + Location: 80,21 + Actor260: brik + Owner: Nod + Location: 80,20 + Actor261: brik + Owner: Nod + Location: 79,20 + Actor262: brik + Owner: Nod + Location: 79,21 + Actor263: brik + Owner: Nod + Location: 60,26 + Actor264: brik + Owner: Nod + Location: 60,25 + Actor265: brik + Owner: Nod + Location: 60,24 + Actor266: brik + Owner: Nod + Location: 60,23 + Actor267: brik + Owner: Nod + Location: 60,22 + Actor268: brik + Owner: Nod + Location: 60,21 + Actor269: brik + Owner: Nod + Location: 60,20 + Actor270: brik + Owner: Nod + Location: 60,19 + Actor271: brik + Owner: Nod + Location: 61,19 + Actor272: brik + Owner: Nod + Location: 61,20 + Actor273: brik + Owner: Nod + Location: 60,14 + Actor274: brik + Owner: Nod + Location: 60,13 + Actor275: brik + Owner: Nod + Location: 61,13 + Actor276: brik + Owner: Nod + Location: 61,14 + Actor277: brik + Owner: Nod + Location: 60,12 + Actor278: brik + Owner: Nod + Location: 60,11 + Actor279: brik + Owner: Nod + Location: 60,10 + Actor280: brik + Owner: Nod + Location: 60,9 + Actor281: brik + Owner: Nod + Location: 60,8 + Actor282: brik + Owner: Nod + Location: 60,7 + Actor283: brik + Owner: Nod + Location: 60,6 + Actor284: brik + Owner: Nod + Location: 62,6 + Actor285: brik + Owner: Nod + Location: 61,6 + Actor286: brik + Owner: Nod + Location: 63,6 + Actor287: brik + Owner: Nod + Location: 64,6 + Actor288: brik + Owner: Nod + Location: 66,6 + Actor289: brik + Owner: Nod + Location: 65,6 + Actor290: brik + Owner: Nod + Location: 67,6 + Actor291: brik + Owner: Nod + Location: 68,6 + Actor292: brik + Owner: Nod + Location: 69,6 + Actor293: brik + Owner: Nod + Location: 70,6 + Actor294: brik + Owner: Nod + Location: 71,6 + Actor295: brik + Owner: Nod + Location: 72,6 + Actor296: brik + Owner: Nod + Location: 74,6 + Actor297: brik + Owner: Nod + Location: 73,6 + Actor298: brik + Owner: Nod + Location: 80,15 + Actor299: brik + Owner: Nod + Location: 79,15 + Actor300: brik + Owner: Nod + Location: 79,14 + Actor301: brik + Owner: Nod + Location: 80,14 + Actor302: brik + Owner: Nod + Location: 80,13 + Actor303: brik + Owner: Nod + Location: 80,12 + Actor304: brik + Owner: Nod + Location: 80,10 + Actor305: brik + Owner: Nod + Location: 80,11 + Actor306: brik + Owner: Nod + Location: 80,9 + Actor307: brik + Owner: Nod + Location: 80,8 + Actor308: brik + Owner: Nod + Location: 80,7 + Actor309: brik + Owner: Nod + Location: 80,6 + Actor310: brik + Owner: Nod + Location: 79,6 + Actor311: brik + Owner: Nod + Location: 78,6 + Actor312: brik + Owner: Nod + Location: 77,6 + Actor313: brik + Owner: Nod + Location: 76,6 + Actor314: brik + Owner: Nod + Location: 75,6 + Actor315: obli + Owner: Nod + Location: 61,21 + Actor316: obli + Owner: Nod + Location: 61,12 + Actor317: ltur + Owner: Nod + Location: 59,19 + Actor318: ltur + Owner: Nod + Location: 59,14 + Actor319: ltur + Owner: Nod + Location: 81,15 + Actor320: ltur + Owner: Nod + Location: 81,20 + Actor321: obli + Owner: Nod + Location: 79,22 + Actor322: obli + Owner: Nod + Location: 79,13 + Actor323: nsam + Owner: Nod + Location: 61,25 + Actor324: nsam + Owner: Nod + Location: 76,24 + Actor325: nsam + Owner: Nod + Location: 61,7 + Actor326: nsam + Owner: Nod + Location: 78,7 + Actor327: proc.td + Owner: Nod + Location: 74,17 + Actor330: hand + Owner: Nod + Location: 65,19 + Actor331: tmpp + Owner: Nod + Location: 77,8 + Actor332: tmpl + Owner: Nod + Location: 69,7 + Actor333: hq + Owner: Nod + Location: 73,7 + Actor334: nuk2 + Owner: Nod + Location: 71,19 + Actor335: nuk2 + Owner: Nod + Location: 69,19 + Actor336: hpad.td + Owner: Nod + Location: 70,11 + Actor337: hpad.td + Owner: Nod + Location: 72,11 + Actor339: weap.td + Owner: Nod + Location: 64,9 + Actor328: rep + Owner: Nod + Location: 66,14 + Actor329: nuk2 + Owner: Nod + Location: 71,15 + Actor340: nuk2 + Owner: Nod + Location: 63,23 + Actor341: shar + Owner: ScrinRebels + Location: 77,45 + TurretFacing: 372 + Actor342: shar + Owner: ScrinRebels + Location: 77,41 + TurretFacing: 192 + Actor343: shar + Owner: ScrinRebels + Location: 82,41 + TurretFacing: 840 + Actor344: shar + Owner: ScrinRebels + Location: 82,45 + TurretFacing: 642 + Actor345: splitblue + Owner: Neutral + Location: 98,34 + Actor346: splitblue + Owner: Neutral + Location: 92,28 + Actor347: splitblue + Owner: Neutral + Location: 100,29 + Actor348: splitblue + Owner: Neutral + Location: 87,20 + Actor349: splitblue + Owner: Neutral + Location: 90,16 + Actor350: splitblue + Owner: Neutral + Location: 87,8 + Actor351: splitblue + Owner: Neutral + Location: 95,22 + Actor352: splitblue + Owner: Neutral + Location: 105,39 + Actor353: swal + Owner: ScrinRebels + Location: 54,60 + Actor355: swal + Owner: ScrinRebels + Location: 55,59 + Actor356: swal + Owner: ScrinRebels + Location: 55,60 + Actor354: swal + Owner: ScrinRebels + Location: 54,61 + Actor357: swal + Owner: ScrinRebels + Location: 55,61 + Actor358: swal + Owner: ScrinRebels + Location: 56,59 + Actor359: swal + Owner: ScrinRebels + Location: 56,58 + Actor360: swal + Owner: ScrinRebels + Location: 57,58 + Actor361: swal + Owner: ScrinRebels + Location: 57,59 + Actor362: swal + Owner: ScrinRebels + Location: 56,60 + Actor363: swal + Owner: ScrinRebels + Location: 56,57 + Actor364: swal + Owner: ScrinRebels + Location: 57,57 + Actor365: swal + Owner: ScrinRebels + Location: 56,56 + Actor366: swal + Owner: ScrinRebels + Location: 56,55 + Actor367: swal + Owner: ScrinRebels + Location: 56,54 + Actor368: swal + Owner: ScrinRebels + Location: 56,53 + Actor369: swal + Owner: ScrinRebels + Location: 56,52 + Actor370: swal + Owner: ScrinRebels + Location: 55,52 + Actor371: swal + Owner: ScrinRebels + Location: 55,51 + Actor372: swal + Owner: ScrinRebels + Location: 56,51 + Actor373: swal + Owner: ScrinRebels + Location: 64,69 + Actor374: swal + Owner: ScrinRebels + Location: 64,70 + Actor375: swal + Owner: ScrinRebels + Location: 63,69 + Actor376: swal + Owner: ScrinRebels + Location: 63,70 + Actor377: swal + Owner: ScrinRebels + Location: 64,68 + Actor378: swal + Owner: ScrinRebels + Location: 65,68 + Actor379: swal + Owner: ScrinRebels + Location: 65,67 + Actor380: swal + Owner: ScrinRebels + Location: 64,67 + Actor381: swal + Owner: ScrinRebels + Location: 63,68 + Actor382: swal + Owner: ScrinRebels + Location: 66,68 + Actor383: swal + Owner: ScrinRebels + Location: 66,67 + Actor384: swal + Owner: ScrinRebels + Location: 67,68 + Actor385: swal + Owner: ScrinRebels + Location: 68,68 + Actor386: swal + Owner: ScrinRebels + Location: 69,68 + Actor387: swal + Owner: ScrinRebels + Location: 69,69 + Actor388: swal + Owner: ScrinRebels + Location: 70,69 + Actor389: swal + Owner: ScrinRebels + Location: 71,69 + Actor390: swal + Owner: ScrinRebels + Location: 72,69 + Actor391: swal + Owner: ScrinRebels + Location: 72,68 + Actor392: swal + Owner: ScrinRebels + Location: 71,68 + Actor393: swal + Owner: ScrinRebels + Location: 62,67 + Actor394: swal + Owner: ScrinRebels + Location: 62,68 + Actor395: swal + Owner: ScrinRebels + Location: 62,66 + Actor396: swal + Owner: ScrinRebels + Location: 63,66 + Actor397: swal + Owner: ScrinRebels + Location: 64,66 + Actor398: swal + Owner: ScrinRebels + Location: 55,62 + Actor399: swal + Owner: ScrinRebels + Location: 56,62 + Actor400: swal + Owner: ScrinRebels + Location: 57,61 + Actor401: swal + Owner: ScrinRebels + Location: 57,60 + Actor402: swal + Owner: ScrinRebels + Location: 57,62 + Actor409: swal + Owner: ScrinRebels + Location: 95,72 + Actor410: swal + Owner: ScrinRebels + Location: 96,72 + Actor411: swal + Owner: ScrinRebels + Location: 95,71 + Actor412: swal + Owner: ScrinRebels + Location: 96,71 + Actor413: swal + Owner: ScrinRebels + Location: 94,71 + Actor414: swal + Owner: ScrinRebels + Location: 93,71 + Actor415: swal + Owner: ScrinRebels + Location: 97,73 + Actor416: swal + Owner: ScrinRebels + Location: 97,72 + Actor417: swal + Owner: ScrinRebels + Location: 98,72 + Actor418: swal + Owner: ScrinRebels + Location: 98,73 + Actor419: swal + Owner: ScrinRebels + Location: 97,71 + Actor420: swal + Owner: ScrinRebels + Location: 94,70 + Actor421: swal + Owner: ScrinRebels + Location: 93,70 + Actor422: swal + Owner: ScrinRebels + Location: 92,71 + Actor423: swal + Owner: ScrinRebels + Location: 91,71 + Actor424: swal + Owner: ScrinRebels + Location: 91,70 + Actor425: swal + Owner: ScrinRebels + Location: 91,69 + Actor426: swal + Owner: ScrinRebels + Location: 90,69 + Actor427: swal + Owner: ScrinRebels + Location: 90,68 + Actor428: swal + Owner: ScrinRebels + Location: 91,68 + Actor429: swal + Owner: ScrinRebels + Location: 106,68 + Actor430: swal + Owner: ScrinRebels + Location: 105,68 + Actor432: swal + Owner: ScrinRebels + Location: 106,67 + Actor433: swal + Owner: ScrinRebels + Location: 106,66 + Actor434: swal + Owner: ScrinRebels + Location: 107,66 + Actor435: swal + Owner: ScrinRebels + Location: 108,66 + Actor436: swal + Owner: ScrinRebels + Location: 108,65 + Actor437: swal + Owner: ScrinRebels + Location: 107,65 + Actor438: swal + Owner: ScrinRebels + Location: 106,65 + Actor439: swal + Owner: ScrinRebels + Location: 105,66 + Actor440: swal + Owner: ScrinRebels + Location: 104,68 + Actor444: swal + Owner: ScrinRebels + Location: 104,66 + Actor445: swal + Owner: ScrinRebels + Location: 97,70 + Actor446: swal + Owner: ScrinRebels + Location: 99,70 + Actor447: swal + Owner: ScrinRebels + Location: 98,70 + Actor448: swal + Owner: ScrinRebels + Location: 99,71 + Actor449: swal + Owner: ScrinRebels + Location: 99,72 + Actor441: swal + Owner: ScrinRebels + Location: 104,67 + Actor442: swal + Owner: ScrinRebels + Location: 109,65 + Actor443: swal + Owner: ScrinRebels + Location: 110,65 + Actor450: swal + Owner: ScrinRebels + Location: 111,65 + Actor451: swal + Owner: ScrinRebels + Location: 112,65 + Actor452: swal + Owner: ScrinRebels + Location: 113,65 + Actor453: swal + Owner: ScrinRebels + Location: 114,65 + Actor454: swal + Owner: ScrinRebels + Location: 114,64 + Actor455: swal + Owner: ScrinRebels + Location: 113,64 + Actor456: swal + Owner: ScrinRebels + Location: 112,64 + Actor457: swal + Owner: ScrinRebels + Location: 115,65 + Actor458: swal + Owner: ScrinRebels + Location: 116,65 + Actor459: swal + Owner: ScrinRebels + Location: 114,63 + Actor460: swal + Owner: ScrinRebels + Location: 115,63 + Actor461: swal + Owner: ScrinRebels + Location: 116,63 + Actor462: swal + Owner: ScrinRebels + Location: 116,64 + Actor463: swal + Owner: ScrinRebels + Location: 45,29 + Actor464: swal + Owner: ScrinRebels + Location: 45,28 + Actor465: swal + Owner: ScrinRebels + Location: 44,29 + Actor466: swal + Owner: ScrinRebels + Location: 43,29 + Actor467: swal + Owner: ScrinRebels + Location: 43,28 + Actor468: swal + Owner: ScrinRebels + Location: 43,27 + Actor469: swal + Owner: ScrinRebels + Location: 44,27 + Actor470: swal + Owner: ScrinRebels + Location: 45,27 + Actor471: swal + Owner: ScrinRebels + Location: 49,36 + Actor472: swal + Owner: ScrinRebels + Location: 49,34 + Actor473: swal + Owner: ScrinRebels + Location: 49,35 + Actor474: swal + Owner: ScrinRebels + Location: 50,36 + Actor475: swal + Owner: ScrinRebels + Location: 50,34 + Actor476: swal + Owner: ScrinRebels + Location: 51,34 + Actor477: swal + Owner: ScrinRebels + Location: 51,35 + Actor478: swal + Owner: ScrinRebels + Location: 51,36 + Actor479: swal + Owner: ScrinRebels + Location: 53,36 + Actor480: swal + Owner: ScrinRebels + Location: 52,36 + Actor481: swal + Owner: ScrinRebels + Location: 52,35 + Actor482: swal + Owner: ScrinRebels + Location: 53,35 + Actor483: swal + Owner: ScrinRebels + Location: 54,35 + Actor484: swal + Owner: ScrinRebels + Location: 54,36 + Actor485: swal + Owner: ScrinRebels + Location: 54,37 + Actor486: swal + Owner: ScrinRebels + Location: 54,38 + Actor487: swal + Owner: ScrinRebels + Location: 55,38 + Actor488: swal + Owner: ScrinRebels + Location: 55,37 + Actor489: swal + Owner: ScrinRebels + Location: 43,26 + Actor490: swal + Owner: ScrinRebels + Location: 43,25 + Actor491: swal + Owner: ScrinRebels + Location: 44,25 + Actor492: swal + Owner: ScrinRebels + Location: 44,24 + Actor493: swal + Owner: ScrinRebels + Location: 44,23 + Actor494: swal + Owner: ScrinRebels + Location: 45,23 + Actor495: swal + Owner: ScrinRebels + Location: 45,24 + Actor496: swal + Owner: ScrinRebels + Location: 32,7 + Actor497: swal + Owner: ScrinRebels + Location: 32,6 + Actor498: swal + Owner: ScrinRebels + Location: 32,5 + Actor499: swal + Owner: ScrinRebels + Location: 32,4 + Actor500: swal + Owner: ScrinRebels + Location: 32,3 + Actor501: swal + Owner: ScrinRebels + Location: 32,2 + Actor502: swal + Owner: ScrinRebels + Location: 32,1 + Actor503: swal + Owner: ScrinRebels + Location: 33,1 + Actor504: swal + Owner: ScrinRebels + Location: 33,2 + Actor505: swal + Owner: ScrinRebels + Location: 33,3 + Actor506: swal + Owner: ScrinRebels + Location: 33,4 + Actor507: swal + Owner: ScrinRebels + Location: 33,5 + Actor508: swal + Owner: ScrinRebels + Location: 33,6 + Actor509: swal + Owner: ScrinRebels + Location: 33,7 + Actor510: swal + Owner: ScrinRebels + Location: 34,7 + Actor511: swal + Owner: ScrinRebels + Location: 34,6 + Actor512: swal + Owner: ScrinRebels + Location: 34,5 + Actor513: swal + Owner: ScrinRebels + Location: 34,4 + Actor514: swal + Owner: ScrinRebels + Location: 34,3 + Actor515: swal + Owner: ScrinRebels + Location: 34,2 + Actor516: swal + Owner: ScrinRebels + Location: 34,1 + Actor517: swal + Owner: ScrinRebels + Location: 35,5 + Actor518: swal + Owner: ScrinRebels + Location: 36,6 + Actor519: swal + Owner: ScrinRebels + Location: 36,5 + Actor520: swal + Owner: ScrinRebels + Location: 35,7 + Actor521: swal + Owner: ScrinRebels + Location: 36,7 + Actor528: swal + Owner: ScrinRebels + Location: 123,62 + Actor529: swal + Owner: ScrinRebels + Location: 123,63 + Actor530: swal + Owner: ScrinRebels + Location: 123,64 + Actor531: swal + Owner: ScrinRebels + Location: 124,64 + Actor532: swal + Owner: ScrinRebels + Location: 124,62 + Actor533: swal + Owner: ScrinRebels + Location: 125,62 + Actor534: swal + Owner: ScrinRebels + Location: 125,63 + Actor535: swal + Owner: ScrinRebels + Location: 125,64 + Actor536: swal + Owner: ScrinRebels + Location: 126,63 + Actor537: swal + Owner: ScrinRebels + Location: 126,64 + Actor538: swal + Owner: ScrinRebels + Location: 127,63 + Actor539: swal + Owner: ScrinRebels + Location: 127,64 + Actor540: swal + Owner: ScrinRebels + Location: 128,63 + Actor541: swal + Owner: ScrinRebels + Location: 128,64 + Actor542: shar + Location: 126,62 + Owner: ScrinRebelsOuter + TurretFacing: 618 + Actor552: ptur + Location: 122,64 + Owner: ScrinRebelsOuter + TurretFacing: 547 + Actor553: scol + Location: 124,63 + Owner: ScrinRebelsOuter + Actor551: ptur + Owner: ScrinRebelsOuter + Location: 117,65 + TurretFacing: 634 + Actor554: ptur + Owner: ScrinRebelsOuter + Location: 104,69 + TurretFacing: 467 + Actor555: ptur + Owner: ScrinRebelsOuter + Location: 100,71 + TurretFacing: 563 + Actor556: ptur + Owner: ScrinRebelsOuter + Location: 61,67 + TurretFacing: 452 + Actor559: ptur + Owner: ScrinRebelsOuter + Location: 56,63 + TurretFacing: 420 + Actor558: ptur + Owner: ScrinRebelsOuter + Location: 48,35 + TurretFacing: 380 + Actor557: ptur + Owner: ScrinRebelsOuter + Location: 44,30 + TurretFacing: 364 + Actor560: scol + Owner: ScrinRebelsOuter + Location: 115,64 + Actor561: scol + Owner: ScrinRebelsOuter + Location: 105,67 + Actor562: scol + Owner: ScrinRebelsOuter + Location: 98,71 + Actor563: scol + Owner: ScrinRebelsOuter + Location: 63,67 + Actor564: scol + Owner: ScrinRebelsOuter + Location: 56,61 + Actor565: scol + Owner: ScrinRebelsOuter + Location: 50,35 + Actor566: scol + Owner: ScrinRebelsOuter + Location: 44,28 + Actor567: scol + Owner: ScrinRebelsOuter + Location: 35,6 + Actor568: shar + Owner: ScrinRebelsOuter + Location: 113,63 + TurretFacing: 626 + Actor544: shar + Owner: ScrinRebelsOuter + Location: 105,65 + TurretFacing: 650 + Actor545: shar + Owner: ScrinRebelsOuter + Location: 92,70 + TurretFacing: 396 + Actor570: shar + Owner: ScrinRebelsOuter + Location: 57,56 + TurretFacing: 388 + Actor546: shar + TurretFacing: 192 + Owner: ScrinRebelsOuter + Location: 54,45 + Actor547: shar + Owner: ScrinRebelsOuter + Location: 55,36 + TurretFacing: 428 + Actor548: shar + Owner: ScrinRebelsOuter + Location: 44,26 + TurretFacing: 372 + Actor549: shar + Owner: ScrinRebelsOuter + Location: 38,16 + TurretFacing: 364 + Actor550: shar + Owner: ScrinRebelsOuter + Location: 35,4 + TurretFacing: 364 + Actor571: rea2 + Owner: ScrinRebelsOuter + Location: 123,56 + Actor572: rea2 + Owner: ScrinRebelsOuter + Location: 120,56 + Actor573: rea2 + Owner: ScrinRebelsOuter + Location: 120,53 + Actor574: rea2 + Owner: ScrinRebelsOuter + Location: 123,53 + Actor575: rea2 + Owner: ScrinRebelsOuter + Location: 120,50 + Actor576: rea2 + Owner: ScrinRebelsOuter + Location: 123,50 + Actor583: swal + Owner: ScrinRebelsOuter + Location: 126,49 + Actor584: swal + Owner: ScrinRebelsOuter + Location: 126,50 + Actor585: swal + Owner: ScrinRebelsOuter + Location: 126,51 + Actor586: swal + Owner: ScrinRebelsOuter + Location: 126,52 + Actor587: swal + Owner: ScrinRebelsOuter + Location: 126,53 + Actor588: swal + Owner: ScrinRebelsOuter + Location: 126,55 + Actor589: swal + Owner: ScrinRebelsOuter + Location: 126,54 + Actor590: swal + Owner: ScrinRebelsOuter + Location: 126,56 + Actor591: swal + Owner: ScrinRebelsOuter + Location: 126,57 + Actor592: swal + Owner: ScrinRebelsOuter + Location: 126,58 + Actor593: swal + Owner: ScrinRebelsOuter + Location: 120,59 + Actor594: swal + Owner: ScrinRebelsOuter + Location: 121,59 + Actor595: swal + Owner: ScrinRebelsOuter + Location: 122,59 + Actor596: swal + Owner: ScrinRebelsOuter + Location: 124,59 + Actor597: swal + Owner: ScrinRebelsOuter + Location: 123,59 + Actor598: swal + Owner: ScrinRebelsOuter + Location: 125,59 + Actor599: swal + Owner: ScrinRebelsOuter + Location: 126,59 + Actor600: swal + Owner: ScrinRebelsOuter + Location: 119,58 + Actor601: swal + Owner: ScrinRebelsOuter + Location: 119,59 + Actor602: swal + Owner: ScrinRebelsOuter + Location: 119,57 + Actor603: swal + Owner: ScrinRebelsOuter + Location: 119,56 + Actor604: swal + Owner: ScrinRebelsOuter + Location: 119,55 + Actor605: swal + Owner: ScrinRebelsOuter + Location: 119,54 + Actor606: swal + Owner: ScrinRebelsOuter + Location: 119,53 + Actor607: swal + Owner: ScrinRebelsOuter + Location: 119,52 + Actor608: swal + Owner: ScrinRebelsOuter + Location: 119,51 + Actor609: swal + Owner: ScrinRebelsOuter + Location: 119,50 + Actor610: swal + Owner: ScrinRebelsOuter + Location: 119,49 + PlayerStart: waypoint + Owner: Neutral + Location: 17,98 + Actor615: null + Owner: ScrinRebels + Facing: 384 + Location: 65,56 + Actor616: null + Owner: ScrinRebels + Facing: 384 + Location: 68,58 + Actor617: tpod + Owner: ScrinRebels + Facing: 384 + Location: 58,62 + Actor618: tpod + Owner: ScrinRebels + Facing: 384 + Location: 62,65 + Actor619: tpod + Owner: ScrinRebels + Facing: 384 + Location: 63,61 + Actor620: gunw + Owner: ScrinRebels + Facing: 384 + Location: 58,58 + Actor621: gunw + Owner: ScrinRebels + Facing: 384 + Location: 67,64 + Actor622: devo + Owner: ScrinRebels + Facing: 384 + Location: 61,59 + Actor623: devo + Owner: ScrinRebels + Facing: 384 + Location: 66,62 + Actor624: intl + Owner: ScrinRebels + Location: 54,62 + Facing: 384 + Actor625: intl + Owner: ScrinRebels + Location: 62,69 + Facing: 384 + Actor626: impl + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 53,61 + Actor627: impl + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 65,71 + Actor642: swal + Owner: Scrin + Location: 6,82 + Actor643: swal + Owner: Scrin + Location: 6,83 + Actor644: swal + Owner: Scrin + Location: 5,83 + Actor645: swal + Owner: Scrin + Location: 5,82 + Actor646: swal + Owner: Scrin + Location: 4,83 + Actor647: swal + Owner: Scrin + Location: 4,84 + Actor648: swal + Owner: Scrin + Location: 5,84 + Actor649: swal + Owner: Scrin + Location: 2,84 + Actor650: swal + Owner: Scrin + Location: 3,84 + Actor651: swal + Owner: Scrin + Location: 1,84 + Actor652: swal + Owner: Scrin + Location: 1,85 + Actor653: swal + Owner: Scrin + Location: 2,85 + Actor669: swal + Owner: Scrin + Location: 34,95 + Actor670: swal + Owner: Scrin + Location: 35,94 + Actor671: swal + Owner: Scrin + Location: 35,95 + Actor672: swal + Owner: Scrin + Location: 36,95 + Actor673: swal + Owner: Scrin + Location: 36,96 + Actor674: swal + Owner: Scrin + Location: 37,96 + Actor675: swal + Owner: Scrin + Location: 37,95 + Actor676: swal + Owner: Scrin + Location: 37,97 + Actor677: swal + Owner: Scrin + Location: 37,98 + Actor678: swal + Owner: Scrin + Location: 38,98 + Actor679: swal + Owner: Scrin + Location: 39,99 + Actor680: swal + Owner: Scrin + Location: 37,99 + Actor681: swal + Owner: Scrin + Location: 38,99 + Actor682: swal + Owner: Scrin + Location: 39,98 + Actor683: swal + Owner: Scrin + Location: 39,100 + Actor684: swal + Owner: Scrin + Location: 39,101 + Actor685: swal + Owner: Scrin + Location: 38,101 + Actor686: swal + Owner: Scrin + Location: 37,101 + Actor687: swal + Owner: Scrin + Location: 37,102 + Actor688: swal + Owner: Scrin + Location: 39,102 + Actor689: swal + Owner: Scrin + Location: 38,102 + Actor716: shar + Owner: Scrin + Location: 33,95 + Actor717: ptur + Owner: Scrin + Location: 40,101 + TurretFacing: 896 + Actor720: scol + Owner: Scrin + Location: 38,100 + Actor721: scol + Owner: ScrinRebelsOuter + Location: 65,66 + Actor722: scol + Owner: ScrinRebelsOuter + Location: 58,60 + Actor723: swal + Owner: ScrinRebelsOuter + Location: 64,65 + Actor724: swal + Owner: ScrinRebelsOuter + Location: 66,65 + Actor725: swal + Owner: ScrinRebelsOuter + Location: 65,65 + Actor726: swal + Owner: ScrinRebelsOuter + Location: 66,66 + Actor727: swal + Owner: ScrinRebelsOuter + Location: 58,61 + Actor728: swal + Owner: ScrinRebelsOuter + Location: 59,61 + Actor729: swal + Owner: ScrinRebelsOuter + Location: 58,59 + Actor730: swal + Owner: ScrinRebelsOuter + Location: 59,59 + Actor731: swal + Owner: ScrinRebelsOuter + Location: 59,60 + Actor732: rea2 + Owner: ScrinRebelsOuter + Location: 120,47 + Actor733: rea2 + Owner: ScrinRebelsOuter + Location: 123,47 + Actor734: swal + Owner: ScrinRebelsOuter + Location: 126,48 + Actor735: swal + Owner: ScrinRebelsOuter + Location: 126,47 + Actor736: swal + Owner: ScrinRebelsOuter + Location: 126,46 + Actor737: swal + Owner: ScrinRebelsOuter + Location: 124,46 + Actor738: swal + Owner: ScrinRebelsOuter + Location: 125,46 + Actor739: swal + Owner: ScrinRebelsOuter + Location: 123,46 + Actor740: swal + Owner: ScrinRebelsOuter + Location: 121,46 + Actor741: swal + Owner: ScrinRebelsOuter + Location: 122,46 + Actor742: swal + Owner: ScrinRebelsOuter + Location: 120,46 + Actor743: swal + Owner: ScrinRebelsOuter + Location: 119,46 + Actor744: swal + Owner: ScrinRebelsOuter + Location: 119,47 + Actor745: swal + Owner: ScrinRebelsOuter + Location: 119,48 + Actor746: tpod + Location: 52,62 + Facing: 384 + Owner: ScrinRebels + Actor747: tpod + Location: 60,69 + Facing: 384 + Owner: ScrinRebels + Actor750: ruin + Location: 86,69 + Facing: 384 + Owner: ScrinRebels + Actor749: ruin + Facing: 384 + Owner: ScrinRebels + Location: 81,66 + Actor748: ruin + Facing: 384 + Owner: ScrinRebels + Location: 77,67 + Actor751: ruin + Facing: 384 + Owner: ScrinRebels + Location: 54,49 + Actor752: ruin + Facing: 384 + Owner: ScrinRebels + Location: 55,42 + IronCurtain: iron + Owner: USSR + Location: 5,96 + Actor766: brik + Owner: USSR + Location: 4,95 + Actor767: brik + Owner: USSR + Location: 4,96 + Actor768: brik + Owner: USSR + Location: 4,97 + Actor769: brik + Owner: USSR + Location: 5,97 + Actor770: brik + Owner: USSR + Location: 6,97 + Actor771: brik + Owner: USSR + Location: 7,97 + Actor772: brik + Owner: USSR + Location: 7,96 + Actor773: brik + Owner: USSR + Location: 7,95 + Actor774: brik + Owner: USSR + Location: 5,95 + Actor775: brik + Owner: USSR + Location: 6,95 + Actor778: brik + Owner: USSR + Location: 2,100 + Actor779: brik + Owner: USSR + Location: 2,109 + Actor780: brik + Owner: USSR + Location: 2,110 + Actor781: brik + Owner: USSR + Location: 2,108 + Actor782: brik + Owner: USSR + Location: 2,107 + Actor783: brik + Owner: USSR + Location: 2,106 + Actor784: brik + Owner: USSR + Location: 3,100 + Actor785: brik + Owner: USSR + Location: 4,100 + Actor786: brik + Owner: USSR + Location: 5,100 + Actor787: brik + Owner: USSR + Location: 6,100 + Actor788: brik + Owner: USSR + Location: 7,100 + Actor789: brik + Owner: USSR + Location: 8,100 + Actor792: brik + Owner: USSR + Location: 9,100 + Actor793: brik + Owner: USSR + Location: 9,101 + Actor794: brik + Owner: USSR + Location: 2,101 + Actor795: brik + Owner: USSR + Location: 2,102 + Actor796: brik + Owner: USSR + Location: 2,103 + Actor797: brik + Owner: USSR + Location: 2,104 + Actor798: brik + Owner: USSR + Location: 2,105 + Actor799: brik + Owner: USSR + Location: 3,110 + Actor800: brik + Owner: USSR + Location: 5,110 + Actor801: brik + Owner: USSR + Location: 4,110 + Actor802: brik + Owner: USSR + Location: 6,110 + Actor803: brik + Owner: USSR + Location: 7,110 + Actor804: brik + Owner: USSR + Location: 8,110 + Actor805: brik + Owner: USSR + Location: 9,110 + Actor806: brik + Owner: USSR + Location: 9,109 + Actor807: brik + Owner: USSR + Location: 9,108 + Actor808: brik + Owner: USSR + Location: 9,107 + Actor809: brik + Owner: USSR + Location: 9,106 + Actor810: brik + Owner: USSR + Location: 9,105 + Actor811: brik + Owner: USSR + Location: 9,104 + Actor812: brik + Owner: USSR + Location: 9,103 + Actor813: brik + Owner: USSR + Location: 9,102 + Actor777: brik + Owner: USSR + Location: 9,96 + Actor790: brik + Owner: USSR + Location: 9,95 + Actor791: brik + Owner: USSR + Location: 9,94 + Actor815: brik + Owner: USSR + Location: 8,93 + Actor816: brik + Owner: USSR + Location: 7,93 + Actor817: brik + Owner: USSR + Location: 6,93 + Actor818: brik + Owner: USSR + Location: 6,94 + Actor819: brik + Owner: USSR + Location: 8,96 + Actor820: tsla + Owner: USSR + Location: 7,94 + Actor821: tsla + Owner: USSR + Location: 8,95 + Actor814: brik + Owner: USSR + Location: 8,94 + Actor822: sam + Owner: USSR + Location: 8,97 + Actor823: sam + Owner: USSR + Location: 4,94 + Actor827: e1 + Owner: USSR + Location: 21,92 + SubCell: 4 + Facing: 896 + Actor828: e1 + Owner: USSR + Location: 21,92 + SubCell: 5 + Facing: 896 + Actor825: e1 + Owner: USSR + Location: 21,92 + SubCell: 1 + Facing: 896 + Actor826: e1 + Owner: USSR + Location: 21,92 + SubCell: 2 + Facing: 896 + Actor830: e1 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 24,94 + Actor831: e1 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 24,94 + Actor834: e1 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 22,93 + Actor835: e1 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 22,93 + Actor836: e1 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 23,93 + Actor837: e1 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 23,93 + Actor838: e1 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 23,93 + Actor839: e1 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 23,93 + Actor841: e1 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 20,92 + Actor842: e1 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 20,92 + Actor843: e1 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 20,92 + Actor844: e1 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 25,94 + Actor845: e1 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 25,94 + Actor846: e1 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 25,94 + Actor847: e1 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 25,94 + Actor848: e1 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 27,97 + Actor849: e1 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 27,97 + Actor850: e1 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 27,97 + Actor851: e1 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 27,97 + Actor852: e1 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 28,97 + Actor853: e1 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 28,97 + Actor854: e1 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 28,97 + Actor855: e1 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 28,97 + Actor856: e1 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 28,98 + Actor857: e1 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 28,98 + Actor858: e1 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 28,98 + Actor859: e1 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 28,98 + Actor860: e1 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 29,98 + Actor861: e1 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 29,98 + Actor862: e1 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 29,98 + Actor863: e1 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 29,98 + Actor864: e1 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 16,91 + Actor865: e1 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 16,91 + Actor866: e1 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 16,91 + Actor867: e1 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 16,91 + Actor868: e1 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 17,91 + Actor869: e1 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 17,91 + Actor870: e1 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 17,91 + Actor871: e1 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 17,91 + Actor872: e1 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 15,90 + Actor873: e1 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 15,90 + Actor874: e1 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 15,90 + Actor875: e1 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 15,90 + Actor876: e1 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 16,90 + Actor877: e1 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 16,90 + Actor878: e1 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 16,90 + Actor879: e1 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 16,90 + Actor880: e1 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 14,93 + Actor881: e1 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 14,93 + Actor882: e1 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 14,93 + Actor883: e1 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 14,93 + Actor884: e1 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 15,93 + Actor885: e1 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 15,93 + Actor886: e1 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 15,93 + Actor887: e1 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 15,93 + Actor888: e1 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 25,99 + Actor889: e1 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 25,99 + Actor890: e1 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 25,99 + Actor891: e1 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 25,99 + Actor892: e1 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 26,99 + Actor893: e1 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 26,99 + Actor894: e1 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 26,99 + Actor895: e1 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 26,99 + Actor896: e1 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 15,94 + Actor897: e1 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 15,94 + Actor898: e1 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 15,94 + Actor899: e1 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 15,94 + Actor900: e1 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 16,94 + Actor901: e1 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 16,94 + Actor902: e1 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 16,94 + Actor903: e1 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 16,94 + Actor904: e1 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 26,100 + Actor905: e1 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 26,100 + Actor906: e1 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 26,100 + Actor907: e1 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 26,100 + Actor908: e1 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 27,100 + Actor909: e1 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 27,100 + Actor910: e1 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 27,100 + Actor911: e1 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 27,100 + Actor833: e1 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 22,93 + Actor829: e1 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 24,94 + Actor832: e1 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 22,93 + Actor824: e1 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 24,94 + Actor840: e1 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 20,92 + Actor912: e1 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 22,92 + Actor913: e1 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 22,92 + Actor914: e1 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 22,92 + Actor915: e1 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 22,92 + Actor916: e1 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 24,93 + Actor917: e1 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 24,93 + Actor918: e1 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 24,93 + Actor919: e1 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 24,93 + Actor920: e1 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 26,94 + Actor921: e1 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 26,94 + Actor922: e1 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 26,94 + Actor923: e1 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 26,94 + Actor925: tpwr + Owner: USSR + Location: 3,101 + Actor926: tpwr + Owner: USSR + Location: 6,101 + Actor927: tpwr + Owner: USSR + Location: 3,104 + Actor928: tpwr + Owner: USSR + Location: 6,104 + Actor929: tpwr + Owner: USSR + Location: 3,107 + Actor930: tpwr + Owner: USSR + Location: 6,107 + Actor933: cmsr + Owner: USSR + SubCell: 3 + Location: 19,90 + Facing: 896 + Actor934: cmsr + Owner: USSR + SubCell: 3 + Facing: 896 + Location: 24,91 + Actor935: cmsr + Owner: USSR + SubCell: 3 + Facing: 896 + Location: 28,95 + Actor955: e3 + Owner: USSR + Location: 19,94 + SubCell: 4 + Facing: 896 + Actor956: e3 + Owner: USSR + Location: 19,94 + SubCell: 5 + Facing: 896 + Actor954: e3 + Owner: USSR + Location: 19,94 + SubCell: 2 + Facing: 896 + Actor953: e3 + Owner: USSR + Location: 19,94 + SubCell: 1 + Facing: 896 + Actor952: e3 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 20,94 + Actor957: e3 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 20,94 + Actor958: e3 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 20,94 + Actor959: e3 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 20,94 + Actor960: e3 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 21,95 + Actor961: e3 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 21,95 + Actor962: e3 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 21,95 + Actor963: e3 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 21,95 + Actor964: e3 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 22,95 + Actor965: e3 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 22,95 + Actor966: e3 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 22,95 + Actor967: e3 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 22,95 + Actor968: e3 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 23,96 + Actor969: e3 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 23,96 + Actor970: e3 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 23,96 + Actor971: e3 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 23,96 + Actor972: e3 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 24,96 + Actor975: e3 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 24,96 + Actor976: e3 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 22,96 + Actor977: e3 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 22,96 + Actor978: e3 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 22,96 + Actor979: e3 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 22,96 + Actor980: e3 + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 20,95 + Actor981: e3 + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 20,95 + Actor982: e3 + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 20,95 + Actor983: e3 + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 20,95 + Actor992: trpc + Owner: USSR + Location: 17,96 + Facing: 896 + Actor993: trpc + Owner: USSR + Location: 23,99 + Facing: 896 + Actor1021: null + Owner: ScrinRebels + Location: 114,59 + Facing: 626 + Actor1022: swal + Owner: ScrinRebels + Location: 21,40 + Actor1023: swal + Owner: ScrinRebels + Location: 21,41 + Actor1024: swal + Owner: ScrinRebels + Location: 21,42 + Actor1025: swal + Owner: ScrinRebels + Location: 21,43 + Actor1026: swal + Owner: ScrinRebels + Location: 21,45 + Actor1027: swal + Owner: ScrinRebels + Location: 21,44 + Actor1028: swal + Owner: ScrinRebels + Location: 21,46 + Actor1029: swal + Owner: ScrinRebels + Location: 21,48 + Actor1030: swal + Owner: ScrinRebels + Location: 21,47 + Actor1031: swal + Owner: ScrinRebels + Location: 22,48 + Actor1032: swal + Owner: ScrinRebels + Location: 22,47 + Actor1033: swal + Owner: ScrinRebels + Location: 22,46 + Actor1034: swal + Owner: ScrinRebels + Location: 22,45 + Actor1035: swal + Owner: ScrinRebels + Location: 22,44 + Actor1036: swal + Owner: ScrinRebels + Location: 22,43 + Actor1037: swal + Owner: ScrinRebels + Location: 22,41 + Actor1038: swal + Owner: ScrinRebels + Location: 22,40 + Actor1039: swal + Owner: ScrinRebels + Location: 22,42 + Actor1040: swal + Owner: ScrinRebels + Location: 22,39 + Actor1041: swal + Owner: ScrinRebels + Location: 22,38 + Actor1042: swal + Owner: ScrinRebels + Location: 23,38 + Actor1043: swal + Owner: ScrinRebels + Location: 23,39 + Actor1044: swal + Owner: ScrinRebels + Location: 23,40 + Actor1045: swal + Owner: ScrinRebels + Location: 23,41 + Actor1046: swal + Owner: ScrinRebels + Location: 23,42 + Actor1047: swal + Owner: ScrinRebels + Location: 23,43 + Actor1048: swal + Owner: ScrinRebels + Location: 23,44 + Actor1049: swal + Owner: ScrinRebels + Location: 23,45 + Actor1050: swal + Owner: ScrinRebels + Location: 23,46 + Actor1051: swal + Owner: ScrinRebels + Location: 23,47 + Actor1052: swal + Owner: ScrinRebels + Location: 23,48 + Actor1053: swal + Owner: ScrinRebels + Location: 24,48 + Actor1054: swal + Owner: ScrinRebels + Location: 24,47 + Actor1055: swal + Owner: ScrinRebels + Location: 24,46 + Actor1056: swal + Owner: ScrinRebels + Location: 24,45 + Actor1057: swal + Owner: ScrinRebels + Location: 24,44 + Actor1058: swal + Owner: ScrinRebels + Location: 24,43 + Actor1059: swal + Owner: ScrinRebels + Location: 24,42 + Actor1060: swal + Owner: ScrinRebels + Location: 24,41 + Actor1061: swal + Owner: ScrinRebels + Location: 24,40 + Actor1062: swal + Owner: ScrinRebels + Location: 24,39 + Actor1063: swal + Owner: ScrinRebels + Location: 24,38 + Actor1064: swal + Owner: ScrinRebels + Location: 22,37 + Actor1065: swal + Owner: ScrinRebels + Location: 23,37 + Actor1066: swal + Owner: ScrinRebels + Location: 24,49 + Actor1067: swal + Owner: ScrinRebels + Location: 25,49 + Actor1068: swal + Owner: ScrinRebels + Location: 25,48 + Actor1069: swal + Owner: ScrinRebels + Location: 25,47 + Actor1070: swal + Owner: ScrinRebels + Location: 25,46 + Actor1071: swal + Owner: ScrinRebels + Location: 25,45 + Actor1072: swal + Owner: ScrinRebels + Location: 25,44 + Actor1073: swal + Owner: ScrinRebels + Location: 25,43 + Actor1074: swal + Owner: ScrinRebels + Location: 25,42 + Actor1075: swal + Owner: ScrinRebels + Location: 25,41 + Actor1076: swal + Owner: ScrinRebels + Location: 26,49 + Actor1077: swal + Owner: ScrinRebels + Location: 26,48 + Actor1078: swal + Owner: ScrinRebels + Location: 26,47 + Actor1079: swal + Owner: ScrinRebels + Location: 26,46 + Actor1080: swal + Owner: ScrinRebels + Location: 26,45 + Actor1081: swal + Owner: ScrinRebels + Location: 26,44 + Actor1082: swal + Owner: ScrinRebels + Location: 27,49 + Actor1083: swal + Owner: ScrinRebels + Location: 27,48 + Actor1084: swal + Owner: ScrinRebels + Location: 27,47 + Actor1086: swal + Owner: ScrinRebels + Location: 28,49 + Actor1087: swal + Owner: ScrinRebels + Location: 28,48 + Actor1088: swal + Owner: ScrinRebels + Location: 28,50 + Actor1089: swal + Owner: ScrinRebels + Location: 29,50 + Actor1090: swal + Owner: ScrinRebels + Location: 29,49 + Actor1091: swal + Owner: ScrinRebels + Location: 29,48 + Actor1092: swal + Owner: ScrinRebels + Location: 28,47 + Actor1165: tpod + Owner: ScrinRebels + Facing: 384 + Location: 45,30 + Actor1166: tpod + Owner: ScrinRebels + Facing: 384 + Location: 48,31 + Actor1167: tpod + Owner: ScrinRebels + Facing: 384 + Location: 48,34 + Actor1168: tpod + Owner: ScrinRebels + Facing: 384 + Location: 66,44 + Actor1169: tpod + Owner: ScrinRebels + Facing: 384 + Location: 67,48 + Actor1170: tpod + Owner: ScrinRebels + Location: 81,56 + Facing: 512 + Actor1171: tpod + Owner: ScrinRebels + Facing: 512 + Location: 86,56 + Actor1173: proc + Owner: USSR + Location: 4,87 + Actor1174: splitblue + Owner: Neutral + Location: 7,74 + Actor1175: splitblue + Owner: Neutral + Location: 5,78 + Actor1176: splitblue + Owner: Neutral + Location: 14,76 + Actor1179: scrinflora1 + Owner: Neutral + Location: 117,77 + Actor1180: scrinflora1 + Owner: Neutral + Location: 125,96 + Actor1181: scrinflora1 + Owner: Neutral + Location: 95,111 + Actor1182: scrinflora1 + Owner: Neutral + Location: 67,100 + Actor1183: scrinflora1 + Owner: Neutral + Location: 11,68 + Actor1184: scrinflora1 + Owner: Neutral + Location: 36,62 + Actor1185: scrinflora1 + Owner: Neutral + Location: 50,42 + Actor1186: scrinflora1 + Owner: Neutral + Location: 7,19 + Actor1187: scrinflora1 + Owner: Neutral + Location: 52,6 + Actor1188: scrinflora1 + Owner: Neutral + Location: 99,57 + Actor1189: scrinflora8 + Owner: Neutral + Location: 100,112 + Actor1190: scrinflora8 + Owner: Neutral + Location: 70,110 + Actor1191: scrinflora8 + Owner: Neutral + Location: 69,87 + Actor1192: scrinflora8 + Owner: Neutral + Location: 34,58 + Actor1193: scrinflora8 + Owner: Neutral + Location: 19,64 + Actor1194: scrinflora8 + Owner: Neutral + Location: 22,36 + Actor1195: scrinflora8 + Owner: Neutral + Location: 13,11 + Actor1196: scrinflora8 + Owner: Neutral + Location: 55,3 + Actor1197: scrinflora8 + Owner: Neutral + Location: 80,3 + Actor1198: scrinflora8 + Owner: Neutral + Location: 106,18 + Actor1199: scrinflora8 + Owner: Neutral + Location: 126,42 + Actor1200: scrinflora8 + Owner: Neutral + Location: 101,47 + Actor1201: scrinflora5 + Owner: Neutral + Location: 124,43 + Actor1202: scrinflora5 + Owner: Neutral + Location: 117,111 + Actor1203: scrinflora5 + Owner: Neutral + Location: 98,112 + Actor1204: scrinflora5 + Owner: Neutral + Location: 75,111 + Actor1205: scrinflora5 + Owner: Neutral + Location: 62,83 + Actor1206: scrinflora5 + Owner: Neutral + Location: 42,81 + Actor1207: scrinflora5 + Owner: Neutral + Location: 22,63 + Actor1208: scrinflora5 + Owner: Neutral + Location: 8,57 + Actor1209: scrinflora5 + Owner: Neutral + Location: 3,25 + Actor1210: scrinflora5 + Owner: Neutral + Location: 36,25 + Actor1211: scrinflora5 + Owner: Neutral + Location: 24,6 + Actor1212: scrinflora5 + Owner: Neutral + Location: 64,33 + Actor1213: scrinflora5 + Owner: Neutral + Location: 58,51 + Actor1214: scrinflora6 + Owner: Neutral + Location: 121,35 + Actor1215: scrinflora6 + Owner: Neutral + Location: 111,87 + Actor1216: scrinflora6 + Owner: Neutral + Location: 119,111 + Actor1217: scrinflora6 + Owner: Neutral + Location: 2,60 + Actor1218: scrinflora7 + Owner: Neutral + Location: 64,99 + Actor1219: scrinflora7 + Owner: Neutral + Location: 102,110 + Actor1220: scrinflora7 + Owner: Neutral + Location: 119,78 + Actor1221: scrinflora7 + Owner: Neutral + Location: 85,77 + Actor1223: scrinflora7 + Owner: Neutral + Location: 36,60 + Actor1222: scrinflora7 + Owner: Neutral + Location: 46,71 + Actor1224: scrinflora7 + Owner: Neutral + Location: 26,3 + Actor1225: scrinflora7 + Owner: Neutral + Location: 3,11 + Actor1226: scrinflora7 + Owner: Neutral + Location: 6,36 + Actor1227: scrinflora7 + Owner: Neutral + Location: 33,111 + Actor1228: scrinflora7 + Owner: Neutral + Location: 122,43 + Actor1229: scrinflora4 + Owner: Neutral + Location: 84,95 + Actor1230: scrinflora4 + Owner: Neutral + Location: 68,110 + Actor1231: scrinflora4 + Owner: Neutral + Location: 51,112 + Actor1232: scrinflora4 + Owner: Neutral + Location: 46,84 + Actor1233: scrinflora4 + Owner: Neutral + Location: 15,67 + Actor1234: scrinflora4 + Owner: Neutral + Location: 3,41 + Actor1235: scrinflora4 + Owner: Neutral + Location: 26,20 + Actor1236: scrinflora4 + Owner: Neutral + Location: 43,3 + Actor1237: scrinflora4 + Owner: Neutral + Location: 5,3 + Actor1238: scrinflora4 + Owner: Neutral + Location: 96,4 + Actor1239: scrinflora4 + Owner: Neutral + Location: 123,34 + Actor1240: scrinflora4 + Owner: Neutral + Location: 100,51 + Actor1241: scrinflora3 + Owner: Neutral + Location: 119,33 + Actor1242: scrinflora3 + Owner: Neutral + Location: 113,110 + Actor1243: scrinflora3 + Owner: Neutral + Location: 37,72 + Actor1244: scrinflora3 + Owner: Neutral + Location: 61,110 + Actor1246: scrinflora2 + Owner: Neutral + Location: 127,40 + Actor1247: scrinflora2 + Owner: Neutral + Location: 122,111 + Actor1248: scrinflora2 + Owner: Neutral + Location: 69,109 + Actor1249: scrinflora2 + Owner: Neutral + Location: 58,91 + Actor1250: scrinflora2 + Owner: Neutral + Location: 47,82 + Actor1251: scrinflora2 + Owner: Neutral + Location: 2,66 + Actor1252: scrinflora2 + Owner: Neutral + Location: 2,58 + Actor1253: scrinflora2 + Owner: Neutral + Location: 4,39 + Actor1254: scrinflora2 + Owner: Neutral + Location: 54,3 + Actor1255: scrinflora2 + Owner: Neutral + Location: 97,2 + Actor1256: scrinflora10 + Owner: Neutral + Location: 5,39 + Actor1257: scrinflora10 + Owner: Neutral + Location: 46,79 + Actor1258: scrinflora10 + Owner: Neutral + Location: 53,112 + Actor1259: scrinflora10 + Owner: Neutral + Location: 65,109 + Actor1260: scrinflora10 + Owner: Neutral + Location: 80,95 + Actor1261: scrinflora10 + Owner: Neutral + Location: 101,110 + Actor1262: scrinflora10 + Owner: Neutral + Location: 116,108 + Actor1263: scrinflora12 + Owner: Neutral + Location: 117,108 + Actor1264: scrinflora12 + Owner: Neutral + Location: 125,102 + Actor1265: scrinflora12 + Owner: Neutral + Location: 113,86 + Actor1266: scrinflora12 + Owner: Neutral + Location: 113,68 + Actor1267: scrinflora12 + Owner: Neutral + Location: 120,35 + Actor1268: scrinflora12 + Owner: Neutral + Location: 109,19 + Actor1269: scrinflora12 + Owner: Neutral + Location: 99,4 + Actor1270: scrinflora12 + Owner: Neutral + Location: 53,7 + Actor1271: scrinflora12 + Owner: Neutral + Location: 15,12 + Actor1272: scrinflora12 + Owner: Neutral + Location: 8,2 + Actor1273: scrinflora12 + Owner: Neutral + Location: 2,25 + Actor1274: scrinflora12 + Owner: Neutral + Location: 18,68 + Actor1275: scrinflora13 + Owner: Neutral + Location: 48,85 + Actor1276: scrinflora13 + Owner: Neutral + Location: 34,60 + Actor1277: scrinflora13 + Owner: Neutral + Location: 20,67 + Actor1278: scrinflora13 + Owner: Neutral + Location: 27,18 + Actor1279: scrinflora13 + Owner: Neutral + Location: 28,2 + Actor1280: scrinflora13 + Owner: Neutral + Location: 87,76 + Actor1281: scrinflora13 + Owner: Neutral + Location: 96,111 + Actor1282: scrinflora13 + Owner: Neutral + Location: 121,80 + Actor1283: scrinflora13 + Owner: Neutral + Location: 124,32 + Actor1284: scrinflora13 + Owner: Neutral + Location: 62,85 + Actor1285: scrinflora14 + Owner: Neutral + Location: 66,100 + Actor1286: scrinflora14 + Owner: Neutral + Location: 46,82 + Actor1287: scrinflora14 + Owner: Neutral + Location: 18,64 + Actor1288: scrinflora14 + Owner: Neutral + Location: 2,62 + Actor1289: scrinflora14 + Owner: Neutral + Location: 8,35 + Actor1290: scrinflora14 + Owner: Neutral + Location: 21,34 + Actor1291: scrinflora14 + Owner: Neutral + Location: 6,19 + Actor1292: scrinflora14 + Owner: Neutral + Location: 3,9 + Actor1293: scrinflora14 + Owner: Neutral + Location: 45,4 + Actor1294: scrinflora14 + Owner: Neutral + Location: 76,2 + Actor1295: scrinflora14 + Owner: Neutral + Location: 125,34 + Actor1296: scrinflora14 + Owner: Neutral + Location: 98,53 + Actor1297: scrinflora14 + Owner: Neutral + Location: 73,72 + Actor1298: scrinflora11 + Owner: Neutral + Location: 74,71 + Actor1299: scrinflora11 + Owner: Neutral + Location: 63,84 + Actor1300: scrinflora11 + Owner: Neutral + Location: 95,107 + Actor1301: scrinflora11 + Owner: Neutral + Location: 118,78 + Actor1302: scrinflora11 + Owner: Neutral + Location: 121,34 + Actor1303: scrinflora11 + Owner: Neutral + Location: 99,5 + Actor1304: scrinflora11 + Owner: Neutral + Location: 53,6 + Actor1305: scrinflora11 + Owner: Neutral + Location: 56,2 + Actor1306: scrinflora11 + Owner: Neutral + Location: 23,6 + Actor1307: scrinflora9 + Owner: Neutral + Location: 12,11 + Actor1308: scrinflora9 + Owner: Neutral + Location: 5,13 + Actor1309: scrinflora9 + Owner: Neutral + Location: 7,37 + Actor1310: scrinflora9 + Owner: Neutral + Location: 7,46 + Actor1311: scrinflora9 + Owner: Neutral + Location: 10,57 + Actor1312: scrinflora10 + Owner: Neutral + Location: 21,65 + Actor1313: scrinflora11 + Owner: Neutral + Location: 34,59 + Actor1314: scrinflora9 + Owner: Neutral + Location: 33,58 + Actor1315: scrinflora9 + Owner: Neutral + Location: 65,102 + Actor1316: scrinflora11 + Owner: Neutral + Location: 68,101 + Actor1317: scrinflora11 + Owner: Neutral + Location: 57,91 + Actor1245: scrinflora3 + Owner: Neutral + Location: 127,92 + Actor1318: avtr + Owner: Nod + Location: 92,61 + Facing: 626 + Actor1319: avtr + Owner: Nod + Location: 94,60 + Facing: 634 + Actor1320: hstk + Owner: Nod + Location: 70,100 + Stance: AttackAnything + Facing: 384 + Actor1321: hstk + Owner: Nod + Location: 69,99 + Facing: 384 + Stance: AttackAnything + Actor1324: bggy + Owner: Nod + Location: 62,104 + Facing: 253 + Actor1323: bggy + Owner: Nod + Facing: 253 + Location: 62,106 + Actor1322: bggy + Owner: Nod + Facing: 253 + Location: 60,96 + Actor1325: bggy + Owner: Nod + Facing: 253 + Location: 64,105 + Actor1326: ltnk + Owner: Nod + Location: 30,67 + Facing: 512 + Actor1327: ltnk + Owner: Nod + Location: 32,67 + Facing: 512 + Actor1332: corr + Owner: ScrinRebels + Facing: 384 + Location: 91,100 + Actor1333: corr + Owner: ScrinRebels + Facing: 384 + Location: 92,101 + Actor1334: gunw + Owner: ScrinRebels + Facing: 384 + Location: 86,99 + Actor1335: gunw + Owner: ScrinRebels + Facing: 384 + Location: 91,105 + Actor1336: gunw + Owner: ScrinRebels + Facing: 384 + Location: 89,101 + Actor1337: s2 + Owner: ScrinRebels + SubCell: 3 + Facing: 384 + Location: 92,103 + Actor1338: s2 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 90,99 + Actor1339: s2 + Owner: ScrinRebels + Facing: 384 + Location: 92,103 + SubCell: 1 + Actor1340: s2 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 89,98 + Actor1341: s1 + Owner: ScrinRebels + SubCell: 3 + Facing: 384 + Location: 90,98 + Actor1342: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 91,99 + Actor1343: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 93,100 + Actor1344: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 95,99 + Actor1360: impl + Owner: ScrinRebels + SubCell: 3 + Facing: 384 + Location: 114,97 + Actor1361: impl + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 117,98 + Actor1362: impl + Owner: ScrinRebels + Facing: 384 + Location: 116,98 + SubCell: 3 + Actor1363: impl + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 114,96 + Actor1364: null + Owner: ScrinRebels + Facing: 384 + Location: 117,96 + Actor1365: null + Owner: ScrinRebels + Facing: 384 + Location: 116,95 + Actor1366: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 113,95 + Actor1367: s1 + Owner: ScrinRebels + Facing: 384 + Location: 113,96 + SubCell: 3 + Actor1368: s1 + Owner: ScrinRebels + Facing: 384 + Location: 113,97 + SubCell: 3 + Actor1369: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 113,99 + Actor1370: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 115,100 + Actor1371: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 114,99 + Actor1372: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 119,98 + Actor1373: gunw + Owner: ScrinRebels + Facing: 384 + Location: 111,94 + Actor1374: gunw + Owner: ScrinRebels + Facing: 384 + Location: 121,99 + Actor1375: s3 + Owner: ScrinRebels + Facing: 384 + Location: 67,67 + SubCell: 3 + Actor1376: s3 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 52,66 + Actor1377: s3 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 55,66 + Actor1378: s3 + Owner: ScrinRebels + Facing: 384 + Location: 55,66 + SubCell: 1 + Actor1379: s3 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 56,69 + Actor1380: s3 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 60,72 + Actor1381: s3 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 67,72 + Actor1382: s3 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 50,62 + Actor1383: s3 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 71,62 + Actor1384: s3 + Owner: ScrinRebels + Facing: 384 + Location: 71,62 + SubCell: 1 + Actor1385: s3 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 71,60 + Actor1386: s1 + Owner: ScrinRebels + Facing: 384 + Location: 66,73 + SubCell: 3 + Actor1387: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 63,72 + Actor1388: s1 + Owner: ScrinRebels + Facing: 384 + Location: 63,72 + SubCell: 1 + Actor1389: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 62,73 + Actor1390: s1 + Owner: ScrinRebels + Facing: 384 + Location: 61,73 + SubCell: 3 + Actor1391: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 57,72 + Actor1392: s1 + Owner: ScrinRebels + Facing: 384 + Location: 57,71 + SubCell: 3 + Actor1393: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 57,67 + Actor1394: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 51,64 + Actor1395: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 49,60 + Actor1396: s1 + Owner: ScrinRebels + Facing: 384 + Location: 49,60 + SubCell: 1 + Actor1397: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 50,56 + Actor1398: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 70,63 + Actor1399: s1 + Owner: ScrinRebels + Facing: 384 + Location: 70,63 + SubCell: 1 + Actor1400: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 66,60 + Actor1401: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 64,58 + Actor1402: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 61,57 + Actor1403: s1 + Owner: ScrinRebels + Facing: 384 + Location: 61,56 + SubCell: 3 + Actor1404: s1 + Owner: ScrinRebels + Facing: 384 + Location: 61,56 + SubCell: 1 + Actor1405: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 63,55 + Actor1406: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 65,59 + Actor1407: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 69,67 + Actor1408: s1 + Owner: ScrinRebels + SubCell: 3 + Facing: 384 + Location: 99,74 + Actor1409: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 106,69 + Actor1410: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 107,70 + Actor1411: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 108,69 + Actor1412: s1 + Owner: ScrinRebels + Facing: 384 + Location: 109,69 + SubCell: 3 + Actor1413: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 106,72 + Actor1414: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 105,74 + Actor1415: s1 + Owner: ScrinRebels + Facing: 384 + Location: 104,75 + SubCell: 3 + Actor1416: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 102,75 + Actor1417: s1 + Owner: ScrinRebels + Facing: 384 + Location: 105,74 + SubCell: 1 + Actor1418: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 109,71 + Actor1419: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 107,72 + Actor1420: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 1 + Location: 106,72 + Actor1421: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 116,67 + Actor1422: s1 + Owner: ScrinRebels + Facing: 384 + Location: 116,67 + SubCell: 1 + Actor1423: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 119,68 + Actor1424: s1 + Owner: ScrinRebels + Facing: 384 + Location: 120,67 + SubCell: 3 + Actor1425: s1 + Owner: ScrinRebels + Facing: 384 + Location: 120,67 + SubCell: 1 + Actor1426: s1 + Owner: ScrinRebels + Facing: 384 + Location: 121,67 + SubCell: 3 + Actor1427: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 123,67 + Actor1428: s1 + Owner: ScrinRebels + Facing: 384 + Location: 124,66 + SubCell: 3 + Actor1429: s1 + Owner: ScrinRebels + Facing: 384 + Location: 125,66 + SubCell: 3 + Actor1430: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 125,68 + Actor1431: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 113,60 + Actor1432: s1 + Owner: ScrinRebels + Facing: 384 + Location: 113,60 + SubCell: 1 + Actor1433: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 110,61 + Actor1434: s1 + Owner: ScrinRebels + Facing: 384 + Location: 110,61 + SubCell: 1 + Actor1435: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 115,56 + Actor1436: s1 + Owner: ScrinRebels + Facing: 384 + Location: 115,56 + SubCell: 1 + Actor1437: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 91,62 + Actor1438: s1 + Owner: ScrinRebels + Facing: 384 + Location: 91,62 + SubCell: 1 + Actor1439: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 88,65 + Actor1440: s1 + Owner: ScrinRebels + SubCell: 3 + Location: 95,62 + Facing: 384 + Actor1441: s1 + Owner: ScrinRebels + Facing: 384 + Location: 96,61 + SubCell: 3 + Actor1442: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 97,60 + Actor1443: s1 + Owner: ScrinRebels + Facing: 384 + Location: 98,59 + SubCell: 3 + Actor1444: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 77,59 + Actor1445: s1 + Owner: ScrinRebels + Facing: 384 + Location: 79,59 + SubCell: 3 + Actor1446: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 81,61 + Actor1447: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 90,58 + Actor1448: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 65,40 + Actor1449: s1 + Owner: ScrinRebels + Facing: 384 + Location: 65,41 + SubCell: 3 + Actor1450: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 64,43 + Actor1451: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 65,51 + Actor1452: s1 + Owner: ScrinRebels + Facing: 384 + Location: 65,51 + SubCell: 1 + Actor1453: s1 + Owner: ScrinRebels + Facing: 384 + Location: 65,50 + SubCell: 3 + Actor1454: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 54,47 + Actor1455: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 46,27 + Actor1456: s1 + Owner: ScrinRebels + Facing: 384 + Location: 47,27 + SubCell: 3 + Actor1457: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 50,29 + Actor1458: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 41,28 + Actor1459: s1 + Owner: ScrinRebels + Facing: 384 + Location: 42,29 + SubCell: 3 + Actor1460: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 43,31 + Actor1461: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 46,35 + Actor1462: s1 + Owner: ScrinRebels + Facing: 384 + Location: 46,35 + SubCell: 1 + Actor1463: s1 + Owner: ScrinRebels + Facing: 384 + Location: 47,36 + SubCell: 3 + Actor1464: s1 + Owner: ScrinRebels + Facing: 384 + Location: 47,36 + SubCell: 1 + Actor1465: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 41,33 + Actor1466: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 29,4 + Actor1467: s1 + Owner: ScrinRebels + Facing: 384 + Location: 29,5 + SubCell: 3 + Actor1468: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 31,10 + Actor1469: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 29,8 + Actor1470: s1 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 29,10 + Actor1471: s1 + Owner: ScrinRebels + Facing: 384 + Location: 29,10 + SubCell: 1 + Actor1472: gunw + Owner: ScrinRebels + Location: 108,70 + Facing: 515 + Actor1473: seek + Owner: ScrinRebels + Location: 104,106 + Facing: 214 + Actor1474: seek + Owner: ScrinRebels + Location: 105,104 + Facing: 166 + Actor1475: seek + Owner: ScrinRebels + Location: 105,102 + Facing: 198 + Actor1476: devo + Owner: ScrinRebels + Facing: 384 + Location: 111,80 + Actor1477: atmz + Owner: ScrinRebels + Facing: 384 + Location: 113,81 + Actor1478: devo + Owner: ScrinRebels + Facing: 384 + Location: 113,79 + Actor1479: s3 + Owner: ScrinRebels + SubCell: 3 + Facing: 384 + Location: 115,80 + Actor1480: s3 + Owner: ScrinRebels + Facing: 384 + Location: 115,80 + SubCell: 1 + Actor1481: s3 + Owner: ScrinRebels + Facing: 384 + Location: 114,80 + SubCell: 3 + Actor1482: s3 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 111,78 + Actor1483: s3 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 110,80 + Actor1484: s4 + Owner: ScrinRebels + SubCell: 3 + Facing: 384 + Location: 116,81 + Actor1485: s4 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 110,79 + Actor1486: intl + Owner: ScrinRebels + Facing: 384 + Location: 110,82 + Actor1487: intl + Owner: ScrinRebels + Location: 103,105 + Facing: 158 + Actor1488: intl + Owner: ScrinRebels + Location: 103,103 + Facing: 174 + Actor569: shar + Owner: ScrinRebelsOuter + Location: 70,68 + TurretFacing: 396 + Actor1489: tpod + Owner: ScrinRebels + Facing: 384 + Location: 118,67 + Actor1490: tpod + Owner: ScrinRebels + Facing: 384 + Location: 122,66 + Actor1491: tpod + Owner: ScrinRebels + Location: 100,73 + Facing: 586 + Actor1492: tpod + Owner: ScrinRebels + Location: 105,70 + Facing: 586 + Actor1493: devo + Owner: ScrinRebels + Location: 107,49 + Facing: 594 + Actor1494: devo + Owner: ScrinRebels + Location: 109,50 + Facing: 570 + Actor1495: devo + Owner: ScrinRebels + Location: 110,48 + Facing: 570 + Actor1496: devo + Owner: ScrinRebels + Location: 112,49 + Facing: 563 + Actor1497: devo + Owner: ScrinRebels + Facing: 384 + Location: 50,26 + Actor1498: devo + Owner: ScrinRebels + Facing: 384 + Location: 51,27 + Actor1499: devo + Owner: ScrinRebels + Facing: 384 + Location: 53,29 + Actor1500: devo + Owner: ScrinRebels + Location: 93,59 + Facing: 618 + Actor1501: intl + Owner: ScrinRebels + Facing: 384 + Location: 124,68 + Actor1502: intl + Owner: ScrinRebels + Location: 101,75 + Facing: 570 + Actor1503: s4 + Owner: ScrinRebels + SubCell: 3 + Location: 103,74 + Facing: 555 + Actor1504: s4 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 124,67 + Actor1505: s3 + Owner: ScrinRebels + SubCell: 3 + Location: 116,62 + Facing: 384 + Actor1506: s3 + Owner: ScrinRebels + Facing: 384 + SubCell: 3 + Location: 123,61 + Actor1507: s3 + Owner: ScrinRebels + SubCell: 3 + Location: 111,61 + Facing: 563 + Actor1508: s3 + Owner: ScrinRebels + SubCell: 3 + Location: 113,55 + Facing: 626 + Actor1509: s3 + Owner: ScrinRebels + SubCell: 3 + Location: 96,60 + Facing: 602 + Actor1510: s3 + Owner: ScrinRebels + SubCell: 3 + Location: 85,67 + Facing: 384 + Actor1511: s3 + Owner: ScrinRebels + SubCell: 3 + Location: 102,71 + Facing: 610 + Actor1512: s3 + Owner: ScrinRebels + SubCell: 3 + Location: 96,68 + Facing: 586 + Actor1513: rmbc + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 58,14 + Actor1514: rmbc + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 58,20 + Actor1515: rmbc + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 57,16 + Actor1516: rmbc + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 58,12 + Actor1517: rmbc + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 59,17 + Actor1518: rmbc + Owner: Nod + SubCell: 3 + Location: 82,22 + Facing: 626 + Actor1519: rmbc + Owner: Nod + SubCell: 3 + Location: 83,17 + Facing: 602 + Actor1520: rmbc + Owner: Nod + SubCell: 3 + Location: 83,15 + Facing: 682 + Actor1521: rmbc + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 63,57 + Actor1522: rmbc + Owner: Nod + Facing: 384 + Location: 67,60 + SubCell: 3 + Actor1523: rmbc + Owner: Nod + SubCell: 3 + Location: 112,47 + Facing: 610 + Actor1524: rmbc + Owner: Nod + SubCell: 3 + Location: 108,48 + Facing: 515 + Actor1525: tplr + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 30,9 + Actor1526: tplr + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 28,6 + Actor1527: tplr + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 27,8 + Actor1528: tplr + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 32,11 + Actor1529: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 76,14 + Actor1530: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 68,22 + Actor1531: n3 + Owner: Nod + Facing: 384 + Location: 64,21 + SubCell: 3 + Actor1532: n3 + Owner: Nod + SubCell: 3 + Location: 68,17 + Facing: 713 + Actor1533: n3 + Owner: Nod + Facing: 384 + Location: 61,9 + SubCell: 3 + Actor1534: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 65,8 + Actor1535: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 77,23 + Actor1536: n3 + Owner: Nod + SubCell: 3 + Location: 82,25 + TurretFacing: 0 + Facing: 634 + Actor1537: wtnk + Owner: Nod + Facing: 384 + Location: 56,9 + Actor1538: wtnk + Owner: Nod + Facing: 384 + Location: 55,7 + Actor1539: wtnk + Owner: Nod + Facing: 384 + Location: 54,27 + Actor1540: wtnk + Owner: Nod + Location: 30,64 + Facing: 499 + Actor1541: ftnk + Owner: Nod + Location: 16,43 + Facing: 515 + Actor1542: ftnk + Owner: Nod + Location: 14,43 + Facing: 515 + Actor1543: ftnk + Owner: Nod + Location: 11,44 + Facing: 586 + Actor1544: arty.nod + Owner: Nod + Location: 12,41 + Facing: 555 + Actor1545: arty.nod + Owner: Nod + Location: 15,40 + Facing: 499 + Actor1546: howi + Owner: Nod + Facing: 384 + Location: 18,17 + Actor1547: howi + Owner: Nod + Facing: 384 + Location: 19,18 + Actor1548: howi + Owner: Nod + Facing: 384 + Location: 20,20 + Actor1549: mlrs + Owner: Nod + Facing: 384 + Location: 61,23 + Actor1550: mlrs + Owner: Nod + Facing: 384 + Location: 61,10 + Actor1551: ltnk + Owner: Nod + Facing: 384 + Location: 15,18 + Actor1552: ltnk + Owner: Nod + Facing: 384 + Location: 16,19 + Actor1553: ltnk + Owner: Nod + Facing: 384 + Location: 18,21 + Actor1554: ltnk + Owner: Nod + Facing: 384 + Location: 19,22 + Actor1555: ltnk + Owner: Nod + Facing: 384 + Location: 54,9 + Actor1556: ltnk + Owner: Nod + Facing: 384 + Location: 55,16 + Actor1557: ltnk + Owner: Nod + Facing: 384 + Location: 41,4 + Actor1558: ltnk + Owner: Nod + Facing: 384 + Location: 42,5 + Actor1559: bike + Owner: Nod + Facing: 384 + Location: 67,104 + Actor1560: bike + Owner: Nod + Facing: 384 + Location: 65,103 + Actor1561: bike + Owner: Nod + Location: 28,66 + Facing: 634 + Actor1562: bike + Owner: Nod + Location: 35,66 + Facing: 384 + Actor1563: stnk.nod + Owner: Nod + Location: 14,56 + Facing: 666 + Stance: AttackAnything + Actor1564: stnk.nod + Owner: Nod + Location: 16,57 + Facing: 610 + Stance: AttackAnything + Actor1565: n1 + Owner: Nod + SubCell: 3 + Location: 12,43 + TurretFacing: 0 + Facing: 602 + Actor1566: n1 + Owner: Nod + Facing: 384 + Location: 12,43 + SubCell: 1 + Actor1567: n1 + Owner: Nod + SubCell: 3 + Location: 10,43 + Facing: 547 + Actor1568: n1 + Owner: Nod + Location: 10,42 + SubCell: 3 + Facing: 555 + Actor1569: n1 + Owner: Nod + SubCell: 3 + Location: 9,45 + Facing: 658 + Actor1570: n1 + Owner: Nod + SubCell: 3 + Location: 15,44 + Facing: 507 + Actor1571: n1 + Owner: Nod + Facing: 384 + Location: 15,44 + SubCell: 1 + Actor1572: n1 + Owner: Nod + SubCell: 3 + Location: 18,45 + Facing: 384 + Actor1573: n1 + Owner: Nod + SubCell: 3 + Location: 17,43 + Facing: 459 + Actor1574: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 16,42 + Actor1575: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 18,42 + Actor1576: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 13,42 + Actor1577: n3 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 16,40 + Actor1578: n1 + Owner: Nod + Facing: 384 + Location: 19,20 + SubCell: 3 + Actor1579: n1 + Owner: Nod + Facing: 384 + Location: 19,20 + SubCell: 1 + Actor1580: n1 + Owner: Nod + Facing: 384 + Location: 18,19 + SubCell: 3 + Actor1581: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 17,17 + Actor1582: n1 + Owner: Nod + Facing: 384 + Location: 16,16 + SubCell: 3 + Actor1583: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 21,22 + Actor1584: n1 + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 20,21 + Actor1585: n1 + Owner: Nod + Facing: 384 + Location: 18,19 + SubCell: 1 + Actor1586: bh + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 18,20 + Actor1587: bh + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 16,18 + Actor1588: bh + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 29,7 + Actor1589: bh + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 43,6 + Actor1590: bh + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 42,4 + Actor1591: bh + Owner: Nod + Facing: 384 + Location: 55,15 + SubCell: 3 + Actor1592: bh + Owner: Nod + SubCell: 3 + Location: 93,62 + Facing: 610 + Actor1593: bh + Owner: Nod + Location: 93,62 + SubCell: 1 + Facing: 570 + Actor1594: bh + Owner: Nod + SubCell: 3 + Location: 95,61 + Facing: 539 + Actor1595: bh + Owner: Nod + SubCell: 3 + Location: 96,59 + Facing: 570 + Actor1596: enli + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 53,64 + Actor1597: enli + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 61,71 + Actor1598: enli + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 62,56 + Actor1599: enli + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 70,58 + Actor1600: enli + Owner: Nod + Facing: 384 + Location: 78,50 + SubCell: 3 + Actor1601: enli + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 75,48 + Actor1602: enli + Owner: Nod + SubCell: 3 + Location: 86,48 + Facing: 563 + Actor1603: rmbc + Owner: Nod + SubCell: 3 + Location: 87,46 + Facing: 586 + Actor1604: rmbc + Owner: Nod + Location: 82,47 + SubCell: 3 + Facing: 515 + Actor1605: reap + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 58,16 + Actor1606: reap + Owner: Nod + Facing: 384 + SubCell: 3 + Location: 56,11 + Actor1607: reap + Owner: Nod + SubCell: 3 + Location: 63,16 + Facing: 364 + Actor1608: reap + Owner: Nod + SubCell: 3 + Location: 75,22 + Facing: 769 + Actor1609: reap + Owner: Nod + SubCell: 3 + Location: 69,13 + Facing: 531 + NodRally1: waypoint + Owner: Neutral + Location: 36,36 + NodRally2: waypoint + Owner: Neutral + Location: 13,46 + StagingAreaEntrance: waypoint + Owner: Neutral + Location: 32,79 + RebelRally1: waypoint + Owner: Neutral + Location: 79,77 + RebelRally2: waypoint + Owner: Neutral + Location: 78,102 + MaleficSpawn2: waypoint + Owner: Neutral + Location: 114,22 + MaleficSpawn1: waypoint + Owner: Neutral + Location: 97,9 + MaleficSpawn3: waypoint + Owner: Neutral + Location: 116,39 + MaleficSpawn4: waypoint + Owner: Neutral + Location: 109,57 + MaleficSpawn5: waypoint + Owner: Neutral + Location: 84,64 + MaleficSpawn6: waypoint + Owner: Neutral + Location: 60,40 + MaleficSpawn7: waypoint + Owner: Neutral + Location: 53,23 + Actor1612: sfac + Owner: ScrinRebels + Location: 84,40 + Exterminator: etpd + Owner: Scrin + Location: 29,85 + Facing: 384 + Actor1613: swal + Owner: ScrinRebels + Location: 86,90 + Actor1614: swal + Owner: ScrinRebels + Location: 86,89 + Actor1615: swal + Owner: ScrinRebels + Location: 87,90 + Actor1616: swal + Owner: ScrinRebels + Location: 87,89 + Actor1617: swal + Owner: ScrinRebels + Location: 88,89 + Actor1618: swal + Owner: ScrinRebels + Location: 88,88 + Actor1619: swal + Owner: ScrinRebels + Location: 87,88 + Actor1620: swal + Owner: ScrinRebels + Location: 89,88 + Actor1621: swal + Owner: ScrinRebels + Location: 89,87 + Actor1622: swal + Owner: ScrinRebels + Location: 88,87 + Actor1623: swal + Owner: ScrinRebels + Location: 90,88 + Actor1624: swal + Owner: ScrinRebels + Location: 90,87 + Actor1625: swal + Owner: ScrinRebels + Location: 91,87 + Actor1626: swal + Owner: ScrinRebels + Location: 91,88 + Actor1627: swal + Owner: ScrinRebels + Location: 92,87 + Actor1628: swal + Owner: ScrinRebels + Location: 92,88 + Actor1629: swal + Owner: ScrinRebels + Location: 93,87 + Actor1630: swal + Owner: ScrinRebels + Location: 93,88 + Actor1631: swal + Owner: ScrinRebels + Location: 94,87 + Actor1632: swal + Owner: ScrinRebels + Location: 94,88 + Actor1633: swal + Owner: ScrinRebels + Location: 92,86 + Actor1634: swal + Owner: ScrinRebels + Location: 92,85 + Actor1635: swal + Owner: ScrinRebels + Location: 91,85 + Actor1636: swal + Owner: ScrinRebels + Location: 91,86 + Actor1637: devo + Owner: ScrinRebels + Facing: 628 + Location: 74,79 + Actor1638: s4 + Owner: ScrinRebels + SubCell: 3 + Facing: 658 + Location: 76,79 + Actor1639: s3 + Owner: ScrinRebels + SubCell: 3 + Facing: 570 + Location: 79,79 + Actor1640: devo + Owner: ScrinRebels + Facing: 628 + Location: 81,79 + Actor1641: s4 + Owner: ScrinRebels + SubCell: 3 + Facing: 650 + Location: 83,79 + Actor1642: devo + Owner: ScrinRebels + Facing: 628 + Location: 78,80 + Actor1643: s4 + Owner: ScrinRebels + SubCell: 3 + Facing: 682 + Location: 80,80 + Actor1644: s3 + Owner: ScrinRebels + SubCell: 3 + Facing: 674 + Location: 74,81 + Actor1645: tpod + Owner: ScrinRebels + TurretFacing: 8 + Facing: 628 + Location: 76,81 + Actor1646: s4 + Owner: ScrinRebels + SubCell: 3 + Facing: 634 + Location: 78,81 + Actor1647: seek + Owner: ScrinRebels + Facing: 628 + Location: 80,81 + Actor1648: seek + Owner: ScrinRebels + Facing: 628 + Location: 83,81 + Actor1649: seek + Owner: ScrinRebels + Facing: 628 + Location: 77,83 + Actor1650: s3 + Owner: ScrinRebels + SubCell: 3 + Facing: 547 + Location: 82,77 + Actor1651: seek + Owner: ScrinRebels + Facing: 628 + Location: 85,79 + Actor1652: swal + Owner: ScrinRebels + Location: 85,92 + Actor1653: swal + Owner: ScrinRebels + Location: 85,91 + Actor1654: swal + Owner: ScrinRebels + Location: 85,90 + Actor1655: swal + Owner: ScrinRebels + Location: 84,90 + Actor1656: swal + Owner: ScrinRebels + Location: 84,91 + Actor1657: swal + Owner: ScrinRebels + Location: 84,92 + Actor1658: swal + Owner: ScrinRebels + Location: 82,92 + Actor1659: swal + Owner: ScrinRebels + Location: 83,92 + Actor1660: swal + Owner: ScrinRebels + Location: 83,91 + Actor1661: swal + Owner: ScrinRebels + Location: 82,91 + Actor1662: swal + Owner: ScrinRebels + Location: 83,90 + Actor1663: swal + Owner: ScrinRebels + Location: 84,89 + Actor1664: swal + Owner: ScrinRebels + Location: 85,89 + Actor1665: swal + Owner: ScrinRebels + Location: 84,88 + Actor1666: swal + Owner: ScrinRebels + Location: 85,88 + Actor1667: swal + Owner: ScrinRebels + Location: 86,88 + Actor1668: swal + Owner: ScrinRebels + Location: 85,87 + Actor1669: swal + Owner: ScrinRebels + Location: 86,87 + Actor1670: swal + Owner: ScrinRebels + Location: 87,87 + Actor1671: swal + Owner: ScrinRebels + Location: 87,86 + Actor1672: swal + Owner: ScrinRebels + Location: 88,86 + Actor1673: swal + Owner: ScrinRebels + Location: 89,86 + Actor1674: swal + Owner: ScrinRebels + Location: 90,86 + Actor1675: swal + Owner: ScrinRebels + Location: 89,85 + Actor1676: swal + Owner: ScrinRebels + Location: 90,85 + Actor1677: swal + Owner: ScrinRebels + Location: 91,84 + Actor1678: swal + Owner: ScrinRebels + Location: 92,84 + Actor1679: swal + Owner: ScrinRebels + Location: 93,84 + Actor1680: swal + Owner: ScrinRebels + Location: 94,84 + Actor1681: swal + Owner: ScrinRebels + Location: 94,83 + Actor1682: swal + Owner: ScrinRebels + Location: 93,83 + Actor1683: swal + Owner: ScrinRebels + Location: 92,83 + Actor1684: swal + Owner: ScrinRebels + Location: 91,83 + Actor1685: swal + Owner: ScrinRebels + Location: 90,84 + Actor1687: swal + Owner: ScrinRebels + Location: 88,85 + Actor1688: swal + Owner: ScrinRebels + Location: 87,85 + Actor1689: swal + Owner: ScrinRebels + Location: 86,86 + Actor1690: swal + Owner: ScrinRebels + Location: 85,86 + Actor1691: swal + Owner: ScrinRebels + Location: 84,87 + Actor1692: swal + Owner: ScrinRebels + Location: 83,88 + Actor1693: swal + Owner: ScrinRebels + Location: 83,89 + Actor1694: swal + Owner: ScrinRebels + Location: 82,90 + Actor1695: swal + Owner: ScrinRebels + Location: 82,89 + Actor1696: swal + Owner: ScrinRebels + Location: 82,88 + Actor1697: swal + Owner: ScrinRebels + Location: 81,89 + Actor1698: swal + Owner: ScrinRebels + Location: 81,90 + Actor1699: swal + Owner: ScrinRebels + Location: 81,91 + Actor1700: swal + Owner: ScrinRebels + Location: 81,92 + Actor1701: swal + Owner: Scrin + Location: 21,108 + Actor1702: swal + Owner: Scrin + Location: 22,108 + Actor1703: swal + Owner: Scrin + Location: 23,108 + Actor1705: swal + Owner: Scrin + Location: 24,108 + Actor1706: swal + Owner: Scrin + Location: 25,108 + Actor1707: swal + Owner: Scrin + Location: 26,108 + Actor1708: swal + Owner: Scrin + Location: 27,108 + Actor1709: swal + Owner: Scrin + Location: 28,108 + Actor1710: swal + Owner: Scrin + Location: 29,108 + Actor1711: swal + Owner: Scrin + Location: 30,108 + Actor1713: swal + Owner: Scrin + Location: 21,109 + Actor1714: rea2 + Owner: Scrin + Location: 22,109 + Actor1715: rea2 + Owner: Scrin + Location: 25,109 + Actor1716: rea2 + Owner: Scrin + Location: 28,109 + Actor1717: swal + Owner: Scrin + Location: 31,109 + Actor1718: swal + Owner: Scrin + Location: 21,110 + Actor1719: swal + Owner: Scrin + Location: 31,110 + Actor1720: swal + Owner: Scrin + Location: 21,111 + Actor1721: swal + Owner: Scrin + Location: 31,111 + Actor1734: swal + Owner: Scrin + Location: 21,112 + Actor1735: swal + Owner: Scrin + Location: 22,112 + Actor1736: swal + Owner: Scrin + Location: 23,112 + Actor1737: swal + Owner: Scrin + Location: 24,112 + Actor1738: swal + Owner: Scrin + Location: 25,112 + Actor1739: swal + Owner: Scrin + Location: 26,112 + Actor1740: swal + Owner: Scrin + Location: 27,112 + Actor1741: swal + Owner: Scrin + Location: 28,112 + Actor1742: swal + Owner: Scrin + Location: 29,112 + Actor1743: swal + Owner: Scrin + Location: 30,112 + Actor1744: swal + Owner: Scrin + Location: 31,112 + Actor1712: swal + Owner: Scrin + Location: 31,108 + Actor1725: 4tnk + Owner: USSR + Facing: 896 + Location: 27,88 + Actor1726: 4tnk + Owner: USSR + Facing: 896 + Location: 24,88 + Actor1727: 4tnk + Owner: USSR + Facing: 896 + Location: 28,90 + Actor1730: 3tnk + Owner: USSR + Facing: 896 + Location: 22,87 + Actor1731: 3tnk + Owner: USSR + Facing: 896 + Location: 25,86 + Actor1732: 3tnk + Owner: USSR + Facing: 896 + Location: 29,88 + Actor1745: 3tnk + Owner: USSR + Facing: 896 + Location: 30,91 + Actor1756: ttrp + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 12,98 + Actor1757: ttrp + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 12,98 + Actor1758: ttrp + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 12,98 + Actor1759: ttrp + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 12,98 + Actor1760: ttrp + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 14,99 + Actor1761: ttrp + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 14,99 + Actor1762: ttrp + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 14,99 + Actor1763: ttrp + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 14,99 + Actor1764: ttrp + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 22,103 + Actor1765: ttrp + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 22,103 + Actor1766: ttrp + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 22,103 + Actor1767: ttrp + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 22,103 + Actor1768: ttrp + Owner: USSR + SubCell: 2 + Facing: 896 + Location: 24,104 + Actor1769: ttrp + Owner: USSR + SubCell: 4 + Facing: 896 + Location: 24,104 + Actor1770: ttrp + Owner: USSR + SubCell: 5 + Facing: 896 + Location: 24,104 + Actor1771: ttrp + Owner: USSR + SubCell: 1 + Facing: 896 + Location: 24,104 + Actor1733: btr + Owner: USSR + Facing: 896 + Location: 16,100 + Actor1775: btr + Owner: USSR + Facing: 896 + Location: 18,100 + Actor1776: btr + Owner: USSR + Facing: 896 + Location: 20,101 + Actor1777: btr + Owner: USSR + Facing: 896 + Location: 18,102 + Actor1782: swal + Owner: Scrin + Location: 12,82 + Actor1784: swal + Owner: Scrin + Location: 13,82 + Actor1785: ptur + Owner: Scrin + TurretFacing: 840 + Location: 22,82 + Actor1786: swal + Owner: Scrin + Location: 12,83 + Actor1787: swal + Owner: Scrin + Location: 13,83 + Actor1788: swal + Owner: Scrin + Location: 14,83 + Actor1789: swal + Owner: Scrin + Location: 21,83 + Actor1790: swal + Owner: Scrin + Location: 22,83 + Actor1791: swal + Owner: Scrin + Location: 23,83 + Actor1792: swal + Owner: Scrin + Location: 13,84 + Actor1793: swal + Owner: Scrin + Location: 14,84 + Actor1794: swal + Owner: Scrin + Location: 15,84 + Actor1795: swal + Owner: Scrin + Location: 16,84 + Actor1796: swal + Owner: Scrin + Location: 17,84 + Actor1797: swal + Owner: Scrin + Location: 18,84 + Actor1798: swal + Owner: Scrin + Location: 19,84 + Actor1799: swal + Owner: Scrin + Location: 20,84 + Actor1800: swal + Owner: Scrin + Location: 21,84 + Actor1801: scol + Owner: Scrin + Location: 22,84 + Actor1802: swal + Owner: Scrin + Location: 23,84 + Actor1804: swal + Owner: Scrin + Location: 17,85 + Actor1805: swal + Owner: Scrin + Location: 18,85 + Actor1806: shar + Owner: Scrin + Location: 19,85 + Actor1807: swal + Owner: Scrin + Location: 20,85 + Actor1808: swal + Owner: Scrin + Location: 21,85 + Actor1809: swal + Owner: Scrin + Location: 22,85 + Actor1810: swal + Owner: Scrin + Location: 23,85 + Actor1724: barr + Owner: USSR + Location: 14,85 + Actor1803: barr + Owner: USSR + Location: 34,100 + Actor1812: ptur + Owner: Scrin + TurretFacing: 840 + Location: 33,87 + Actor1813: swal + Owner: Scrin + Location: 32,88 + Actor1814: swal + Owner: Scrin + Location: 33,88 + Actor1815: swal + Owner: Scrin + Location: 34,88 + Actor1816: swal + Owner: Scrin + Location: 32,89 + Actor1817: scol + Owner: Scrin + Location: 33,89 + Actor1818: swal + Owner: Scrin + Location: 34,89 + Actor1819: swal + Owner: Scrin + Location: 32,90 + Actor1820: swal + Owner: Scrin + Location: 33,90 + Actor1821: swal + Owner: Scrin + Location: 34,90 + Actor1822: swal + Owner: Scrin + Location: 33,91 + Actor1823: swal + Owner: Scrin + Location: 34,91 + Actor1824: swal + Owner: Scrin + Location: 33,92 + Actor1825: swal + Owner: Scrin + Location: 34,92 + Actor1826: swal + Owner: Scrin + Location: 33,93 + Actor1827: swal + Owner: Scrin + Location: 34,93 + Actor1828: swal + Owner: Scrin + Location: 33,94 + Actor1829: swal + Owner: Scrin + Location: 34,94 + Actor1830: scol + Owner: ScrinRebelsOuter + Location: 83,87 + Actor1831: scol + Owner: ScrinRebelsOuter + Location: 86,85 + Actor1686: scol + Owner: ScrinRebelsOuter + Location: 89,84 + Actor1832: scol + Owner: ScrinRebelsOuter + Location: 25,40 + Actor1833: scol + Owner: ScrinRebelsOuter + Location: 26,43 + Actor1834: scol + Owner: ScrinRebelsOuter + Location: 27,46 + Actor1835: camera + Owner: ScrinRebels + Location: 90,91 + Actor1836: camera + Owner: ScrinRebels + Location: 56,75 + Actor1837: camera + Owner: ScrinRebels + Location: 45,56 + Actor1838: camera + Owner: ScrinRebels + Location: 61,44 + Actor1839: camera + Owner: ScrinRebels + Location: 79,63 + Actor1840: camera + Owner: ScrinRebels + Location: 105,55 + Actor1841: camera + Owner: ScrinRebels + Location: 55,19 + Actor1842: camera + Owner: ScrinRebels + Location: 30,31 + Actor1843: camera + Owner: ScrinRebels + Location: 16,50 + Actor1844: camera + Owner: ScrinRebels + Location: 23,77 + Actor1845: camera + Owner: ScrinRebels + Location: 44,95 + Actor1846: dome + Owner: USSR + Location: 11,109 + Actor1847: avtr + Owner: Nod + Location: 76,77 + Facing: 642 + Actor1848: avtr + Owner: Nod + Facing: 642 + Location: 78,76 + Actor1849: splitblue + Owner: Neutral + Location: 51,109 + Actor1850: splitblue + Owner: Neutral + Location: 56,107 + Actor1851: splitblue + Owner: Neutral + Location: 7,30 + Actor1852: splitblue + Owner: Neutral + Location: 6,27 + Actor1610: weap + Owner: USSR + Location: 30,101 + Actor1611: stek + Owner: USSR + Location: 17,109 + Actor1751: deva + Owner: ScrinRebels + Facing: 384 + Location: 69,42 + Actor1752: deva + Owner: ScrinRebels + Facing: 384 + Location: 89,52 + Actor1753: deva + Owner: ScrinRebels + Facing: 384 + Location: 76,53 + Actor1754: deva + Owner: ScrinRebels + Facing: 384 + Location: 72,50 + Actor1755: pac + Owner: ScrinRebels + Facing: 384 + Location: 85,46 + Actor1772: pac + Owner: ScrinRebels + Facing: 384 + Location: 82,39 + Actor1773: pac + Owner: ScrinRebels + Facing: 384 + Location: 91,45 + Actor1774: pac + Owner: ScrinRebels + Location: 110,66 + Facing: 555 + Actor1778: pac + Owner: ScrinRebels + Location: 89,67 + Facing: 384 + Actor1779: pac + Owner: ScrinRebels + Facing: 384 + Location: 75,66 + Actor1780: pac + Owner: ScrinRebels + Facing: 384 + Location: 31,42 + Actor1781: pac + Owner: ScrinRebels + Facing: 384 + Location: 29,39 + KirovSpawn1: waypoint + Owner: Neutral + Location: 1,98 + KirovRally1: waypoint + Owner: Neutral + Location: 9,91 + KirovRally2: waypoint + Owner: Neutral + Location: 27,102 + KirovSpawn2: waypoint + Owner: Neutral + Location: 17,112 + SSMEast1: mlrs + Owner: Nod + Location: 48,87 + Facing: 384 + SSMEast2: mlrs + Owner: Nod + Location: 51,89 + Facing: 384 + SSMNorth: mlrs + Owner: Nod + Location: 25,68 + Facing: 384 + Actor1704: camera + Owner: ScrinRebels + Location: 35,85 + Actor1722: camera + Owner: ScrinRebels + Location: 63,96 + Actor1728: camera + Owner: ScrinRebels + Location: 27,61 + EnervatorPatrol1: waypoint + Owner: Neutral + Location: 84,43 + EnervatorPatrol2: waypoint + Owner: Neutral + Location: 112,42 + EnervatorPatrol3: waypoint + Owner: Neutral + Location: 103,61 + EnervatorPatrol4: waypoint + Owner: Neutral + Location: 84,61 + BansheePatrol1: waypoint + Owner: Neutral + Location: 67,7 + BansheePatrol2: waypoint + Owner: Neutral + Location: 91,3 + BansheePatrol3: waypoint + Owner: Neutral + Location: 83,29 + OverlordSpawn2: waypoint + Owner: Neutral + Location: 73,35 + OverlordSpawn3: waypoint + Owner: Neutral + Location: 92,49 + OverlordSpawn1: waypoint + Owner: Neutral + Location: 73,52 + Actor1729: camera + Owner: ScrinRebels + Location: 12,35 + Actor1746: camera + Owner: ScrinRebels + Location: 20,14 + Actor1747: camera + Owner: ScrinRebels + Location: 98,101 + Actor1748: camera + Owner: ScrinRebels + Location: 119,91 + Actor1749: camera + Owner: ScrinRebels + Location: 111,75 + Actor1783: camera + Owner: ScrinRebels + Location: 120,71 + Actor1811: camera + Owner: ScrinRebels + Location: 89,80 + McvSpawn: waypoint + Owner: Neutral + Location: 14,112 + McvDest: waypoint + Owner: Neutral + Location: 14,104 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, schism-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml, schism-weapons.yaml diff --git a/mods/ca/missions/main-campaign/ca42-schism/ovld_impossible.aud b/mods/ca/missions/main-campaign/ca42-schism/ovld_impossible.aud new file mode 100644 index 0000000000..a191a9cfcc Binary files /dev/null and b/mods/ca/missions/main-campaign/ca42-schism/ovld_impossible.aud differ diff --git a/mods/ca/missions/main-campaign/ca42-schism/purificationsm.aud b/mods/ca/missions/main-campaign/ca42-schism/purificationsm.aud new file mode 100644 index 0000000000..da3a661f0e Binary files /dev/null and b/mods/ca/missions/main-campaign/ca42-schism/purificationsm.aud differ diff --git a/mods/ca/missions/main-campaign/ca42-schism/schism-rules.yaml b/mods/ca/missions/main-campaign/ca42-schism/schism-rules.yaml new file mode 100644 index 0000000000..cefea2e86a --- /dev/null +++ b/mods/ca/missions/main-campaign/ca42-schism/schism-rules.yaml @@ -0,0 +1,139 @@ +^Palettes: + PaletteFromFile@terrain-temperat: + Filename: alien.pal + TintPostProcessEffect: + Red: 1.3 + Green: 1 + Blue: 1.5 + Ambient: 0.5 + FlashPostProcessEffect@PURIFICATION: + Type: Purification + FixedColorPalette@BlueTiberium: + Color: ffffff + +^BaseWorld: + TerrainLighting: + ResourceRenderer: + ResourceTypes: + BlueTiberium: + Name: Purified Tiberium + +^BasePlayer: + PlayerResources: + ResourceValues: + BlueTiberium: 25 + +World: + LuaScript: + Scripts: campaign.lua, schism.lua + MissionData: + Briefing: The Overlord sends his gratitude and is consolidating his forces for a new offensive.\n\nThe device that Kane has been using to deform Tiberium for his own nefarious ends has been located in a rebel stronghold. Its purification waves have been growing more powerful with each use, affecting a progressively larger area of the planet and resulting in countless Scrin joining the deceiver Kane. The rebels will soon be unstoppable.\n\nThe Overlord cannot risk bringing his armies too close to the device, but we have a plan. We have discovered that our Iron Curtain protects against the purification energy in a way that the Scrin shields do not. With this in mind, the Overlord will provide us with one of his few remaining Exterminator Tripods with which to assault the rebel fortress. Our Iron Curtain will be synchronized with the purification waves, which should allow the Exterminator to breach the rebel defenses, reach the device, and extract it using a Scrin wormhole.\n\nThis was the prize that Kane came to this world to claim, and we believe its power goes far beyond what we have seen. Such power cannot be left in his hands. The Overlord must have the device so that its power can be used to restore order. Kane will surely have to draw a line in the sand here, or all of his efforts will be for naught, so expect heavy resistance.\n\nWe have assembled what forces we can, but our initial attempts to establish a base stalled due to constant attacks. There is no time for additional preparations. Launch the attack, escort the Exterminator to the device and secure it for the Overlord. + MapOptions: + ShortGameCheckboxEnabled: False + MusicPlaylist: + StartingMusic: hm2 + +Player: + PlayerResources: + DefaultCash: 6000 + +# Purified Tib doesn't damage infantry + +^Infantry: + DamagedByTerrain@TIBDAMAGE: + Terrain: Tiberium + +ETPD: + Targetable@Vulnerable: + TargetTypes: VulnerableExterminator + RequiresCondition: !invulnerability + -ChangesHealth@THEAL: + -WithDecoration@TibRepair: + -ExternalCondition@RESCONVTIB: + -ExternalCondition@RESCONVORE: + -ExternalCondition@RESCONVBLUETIB: + -ExternalCondition@RESCONVGEMS: + -GrantCondition@RESCONV: + -GrantConditionOnTerrain@RESCONVTIB: + -GrantConditionOnTerrain@RESCONVORE: + -GrantConditionOnTerrain@RESCONVBLUETIB: + -GrantConditionOnTerrain@RESCONVGEMS: + Shielded: + RegenDelay: 500 + Armament@TERTIARY: + Name: primary + Weapon: GatewayOpener + LocalOffset: 0,0,500 + Cursor: mc-capture + TooltipExtras: + Attributes: • Can crush concrete walls.\n• Target Purification device to begin extraction. + DamageMultiplier@NORMAL: + Modifier: 110 + RequiresCondition: difficulty-normal + DamageMultiplier@HARD: + Modifier: 120 + RequiresCondition: difficulty-hard + FirepowerMultiplier@NORMAL: + Modifier: 90 + RequiresCondition: difficulty-normal + FirepowerMultiplier@HARD: + Modifier: 75 + RequiresCondition: difficulty-hard + -RevealsShroudMultiplier@Blinded: + ExternalCondition@IC: + Condition: invulnerability + WithRestartableIdleOverlay@WARPIN: + PlayOnce: true + Image: explosion + Sequence: ironcurtain_effect + Palette: effect-ignore-lighting-alpha85 + RequiresCondition: invulnerability + +IRON: + GrantExternalConditionPowerCA@IRONCURTAIN: + Prerequisites: ~disabled + Health: + HP: 200000 + -ToggleConditionOnOrder: + ExternalCondition@PowerDown: + Condition: powerdown + ExternalCondition@ForceDisabled: + Condition: forcedisabled + +purification.dummy: + Inherits: CAMERA + PeriodicExplosion: + Weapon: PurificationWave + +SCRINPURIFIER: + Armor: + Type: Concrete + RevealsShroud: + Range: 20c0 + Targetable@Purifier: + TargetTypes: Purifier + WithRestartableIdleOverlay@Gateway: + Image: wormholelg + Sequence: idle + RequiresCondition: teleporting + ExternalCondition@Gateway: + Condition: teleporting + Health: + HP: 400000 + -CaptureManager: + -CapturableProgressBlink: + -Capturable: + -CapturableProgressBar: + WithIdleOverlay@ACTIVE: + +WORMHOLE: + -Targetable: + +# Hunt() requires only 1 AttackBase +DEVA: + -AttackFrontalCharged: + -Armament@PRIMARYUPG: + -AmbientSound@CHARGE: + -WithIdleOverlay@CHARGE1: + -WithIdleOverlay@CHARGE2: + -WithIdleOverlay@CHARGE3: diff --git a/mods/ca/missions/main-campaign/ca42-schism/schism-weapons.yaml b/mods/ca/missions/main-campaign/ca42-schism/schism-weapons.yaml new file mode 100644 index 0000000000..97342bd0d3 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca42-schism/schism-weapons.yaml @@ -0,0 +1,34 @@ +PurificationWave: + ReloadDelay: 1500 + Range: 5c0 + ValidTargets: VulnerableExterminator + Projectile: InstantHit + Warhead@1Change: ChangeOwner + Range: 5c0 + ValidRelationships: Enemy + ValidTargets: VulnerableExterminator + Warhead@5Shake: ShakeScreen + Duration: 5 + Intensity: 1 + Multiplier: 0.1,0.1 + +ExterminatorLaser: + InvalidTargets: Purifier + Warhead@1Dam: SpreadDamage + InvalidTargets: Purifier + +GatewayOpener: + ReloadDelay: 30000 + Range: 6c0 + ValidTargets: Purifier + Projectile: LaserZap + Report: wormhole-open.aud + Warhead@1Change: ChangeOwner + Range: 2c0 + ValidRelationships: Enemy, Neutral, Ally + ValidTargets: Purifier + Warhead@Gateway: GrantExternalConditionCA + Range: 0c511 + Duration: 0 + Condition: teleporting + ValidTargets: Purifier diff --git a/mods/ca/missions/main-campaign/ca42-schism/schism.lua b/mods/ca/missions/main-campaign/ca42-schism/schism.lua new file mode 100644 index 0000000000..41ed11a02f --- /dev/null +++ b/mods/ca/missions/main-campaign/ca42-schism/schism.lua @@ -0,0 +1,515 @@ +MissionDir = "ca|missions/main-campaign/ca42-schism" + +PurificationInterval = DateTime.Minutes(3) +PurifierPosition = Purifier.CenterPosition + +DefendDuration = { + easy = DateTime.Minutes(3), + normal = DateTime.Minutes(3) + DateTime.Seconds(30), + hard = DateTime.Minutes(4), + vhard = DateTime.Minutes(4), + brutal = DateTime.Minutes(4), +} + +MaleficSpawns = { MaleficSpawn1.Location, MaleficSpawn2.Location, MaleficSpawn3.Location, MaleficSpawn4.Location, MaleficSpawn5.Location, MaleficSpawn6.Location, MaleficSpawn7.Location } +OverlordSpawns = { OverlordSpawn1.Location, OverlordSpawn2.Location, OverlordSpawn3.Location } + +if IsHardOrAbove() then + table.insert(UnitCompositions.Nod, { + Infantry = {}, + Vehicles = { "avtr", "avtr", "avtr", "avtr", "avtr", "avtr", "avtr" }, + MinTime = DateTime.Minutes(6), + IsSpecial = true + }) + + table.insert(UnitCompositions.Scrin, { + Infantry = { "s3", "s1", "mast", "s1", "s1", "s1", "s1", "s1", "s1", "s3", "s4", "s1", "s1", "s1", "s1", "s3", "s1", "s1", "s1", "s1", "s1", "s1", "s3", "s1", "s1", "s1", "s4", "s1", "s1", "s3", "s1", "s1", "s1", "s3", "s1", "s1", "s1", "s1", "s1", "s1" }, + Vehicles = { "intl.ai2", "gunw", "intl.ai2", "gunw", "intl.ai2", "gunw", "intl.ai2", "gunw", "intl.ai2", "gunw" }, + MinTime = DateTime.Minutes(14), + IsSpecial = true + }) +end + +AttackDelayMultipliers.hard = 0.5 +AttackDelayMultipliers.vhard = 0.02 +AttackDelayMultipliers.brutal = 0.02 + +Squads = { + Nod = { + InitTimeAdjustment = -DateTime.Minutes(7), + Delay = AdjustDelayForDifficulty(DateTime.Minutes(1) + DateTime.Seconds(30)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 30, Max = 40 }), + ActiveCondition = function() + return not MaleficArrived + end, + DispatchDelay = DateTime.Seconds(15), + FollowLeader = true, + Compositions = AdjustCompositionsForDifficulty(UnitCompositions.Nod), + AttackPaths = { { NodRally1.Location, NodRally2.Location } }, + }, + ScrinRebels = { + InitTimeAdjustment = -DateTime.Minutes(7), + Delay = AdjustDelayForDifficulty(DateTime.Minutes(2)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 30, Max = 40 }), + ActiveCondition = function() + return not MaleficArrived + end, + FollowLeader = true, + Compositions = AdjustCompositionsForDifficulty(UnitCompositions.Scrin), + AttackPaths = { { RebelRally1.Location, RebelRally2.Location } }, + }, + ScrinRebelsAir = { + Delay = AdjustAirDelayForDifficulty(DateTime.Minutes(7)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 5, Max = 5 }), + Compositions = AirCompositions.Scrin, + }, + NodAir = { + Delay = AdjustAirDelayForDifficulty(DateTime.Minutes(11)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 5, Max = 5 }), + Compositions = AirCompositions.Nod, + }, + Banshees = { + ActiveCondition = function() + return not Exterminator.IsDead + end, + OnProducedAction = function(unit) + unit.Patrol({ BansheePatrol1.Location, BansheePatrol2.Location, BansheePatrol3.Location }, true) + end, + Delay = AdjustAirDelayForDifficulty(DateTime.Minutes(5)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 16, Max = 16 }), + Compositions = { + normal = { + { Aircraft = { "scrn", "scrn", "scrn" } }, + }, + hard = { + { Aircraft = { "scrn", "scrn", "scrn", "scrn", "scrn", "scrn" } }, + }, + vhard = { + { Aircraft = { "scrn", "scrn", "scrn", "scrn", "scrn", "scrn", "scrn" } }, + }, + brutal = { + { Aircraft = { "scrn", "scrn", "scrn", "scrn", "scrn", "scrn", "scrn", "scrn" } }, + } + }, + }, + Enervators = { + ActiveCondition = function() + return not Exterminator.IsDead + end, + OnProducedAction = function(unit) + unit.Patrol({ EnervatorPatrol1.Location, EnervatorPatrol2.Location, EnervatorPatrol3.Location, EnervatorPatrol4.Location }, true) + end, + Delay = AdjustAirDelayForDifficulty(DateTime.Minutes(5)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 16, Max = 16 }), + Compositions = { + hard = { + { Aircraft = { "enrv", "enrv", "enrv", "enrv", "enrv" } }, + }, + vhard = { + { Aircraft = { "enrv", "enrv", "enrv", "enrv", "enrv", "enrv" } }, + }, + brutal = { + { Aircraft = { "enrv", "enrv", "enrv", "enrv", "enrv", "enrv", "enrv" } }, + } + }, + }, + ScrinRebelsAirToAir = AirToAirSquad({ "stmr", "enrv", "torm" }, AdjustAirDelayForDifficulty(DateTime.Minutes(10))), +} + +-- Setup and Tick + +SetupPlayers = function() + USSR = Player.GetPlayer("USSR") + Scrin = Player.GetPlayer("Scrin") + Nod = Player.GetPlayer("Nod") + ScrinRebels = Player.GetPlayer("ScrinRebels") + ScrinRebelsOuter = Player.GetPlayer("ScrinRebelsOuter") + MaleficScrin = Player.GetPlayer("MaleficScrin") + SpyPlaneProvider = Player.GetPlayer("SpyPlaneProvider") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = { USSR } + MissionEnemies = { Nod, ScrinRebels, MaleficScrin } +end + +WorldLoaded = function() + SetupPlayers() + + TimerTicks = PurificationInterval + IronCurtainIntegrityTicksRemaining = DateTime.Minutes(30) + Camera.Position = PlayerStart.CenterPosition + + InitObjectives(USSR) + AdjustPlayerStartingCashForDifficulty() + InitScrinRebels() + InitNod() + + Utils.Do(MissionPlayers, function(p) + Actor.Create("hazmatsoviet.upgrade", true, { Owner = p }) + end) + + ObjectiveSecurePurifier = USSR.AddObjective("Use the Exterminator Tripod to secure\nthe purification device.") + UpdateMissionText() + + local spyPlaneDummy1 = Actor.Create("spy.plane.dummy", true, { Owner = SpyPlaneProvider }) + + Trigger.OnKilled(Purifier, function(self, killer) + if not USSR.IsObjectiveCompleted(ObjectiveSecurePurifier) then + USSR.MarkFailedObjective(ObjectiveSecurePurifier) + end + if ObjectiveDefendPurifier ~= nil and not USSR.IsObjectiveCompleted(ObjectiveDefendPurifier) then + USSR.MarkFailedObjective(ObjectiveDefendPurifier) + end + end) + + Trigger.OnKilled(Exterminator, function(self, killer) + if not USSR.IsObjectiveCompleted(ObjectiveSecurePurifier) then + USSR.MarkFailedObjective(ObjectiveSecurePurifier) + end + end) + + Trigger.AfterDelay(DateTime.Seconds(10), function() + TransferExterminator() + Exterminator.GrantCondition("difficulty-" .. Difficulty) + end) + + Trigger.AfterDelay(DateTime.Seconds(4), function() + Media.DisplayMessage("Stop this madness. You have no idea what you are dealing with. You will be the end of us all!", "Kane", HSLColor.FromHex("FF0000")) + MediaCA.PlaySound(MissionDir .. "/kane_stopmadness.aud", 2) + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(7)), function() + Media.DisplayMessage("Your foolish quest ends here Kane. The Overlord will have your head.", "Premier Cherdenko", HSLColor.FromHex("FF0000")) + MediaCA.PlaySound(MissionDir .. "/cdko_quest.aud", 2) + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(7)), function() + spyPlaneDummy1.TargetAirstrike(Purifier.CenterPosition, Angle.NorthEast) + spyPlaneDummy1.Destroy() + + PlaySpeechNotificationToMissionPlayers("ReinforcementsArrived") + Notification("Reinforcements have arrived.") + Reinforcements.Reinforce(USSR, { "kiro" }, { KirovSpawn1.Location, KirovRally1.Location }) + Reinforcements.Reinforce(USSR, { "kiro" }, { KirovSpawn2.Location, KirovRally2.Location }) + DoMcvArrival() + + Utils.Do({ SSMNorth, SSMEast1, SSMEast2 }, function(s) + if not s.IsDead then + s.Hunt() + end + end) + + Trigger.AfterDelay(DateTime.Seconds(5), function() + Tip("The Iron Curtain must be intact and powered to shield the Exterminator Tripod from purification waves.") + end) + end) + end) + end) + + AfterWorldLoaded() +end + +Tick = function() + OncePerSecondChecks() + OncePerFiveSecondChecks() + OncePerThirtySecondChecks() + AfterTick() +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + ScrinRebels.Resources = ScrinRebels.ResourceCapacity - 500 + ScrinRebelsOuter.Resources = ScrinRebelsOuter.ResourceCapacity - 500 + + if not USSR.IsObjectiveCompleted(ObjectiveSecurePurifier) then + if TimerTicks > 0 then + if TimerTicks > 25 then + TimerTicks = TimerTicks - 25 + if TimerTicks == 125 then + Media.PlaySound("buzzy1.aud") + end + if TimerTicks == 75 then + ApplyIronCurtain() + end + else + TimerTicks = 0 + PurificationWave() + end + else + TimerTicks = PurificationInterval + end + + if Difficulty == "brutal" then + if IronCurtainIntegrityTicksRemaining > 0 then + IronCurtainIntegrityTicksRemaining = IronCurtainIntegrityTicksRemaining - 25 + elseif not IronCurtain.IsDead then + IronCurtainIntegrityTicksRemaining = 0 + IronCurtain.Kill() + end + end + + if IsMissionPlayer(Purifier.Owner) then + TimerTicks = DefendDuration[Difficulty] + + if ObjectiveDefendPurifier == nil then + ObjectiveDefendPurifier = USSR.AddObjective("Defend the purification device.") + end + + USSR.MarkCompletedObjective(ObjectiveSecurePurifier) + + Trigger.AfterDelay(DateTime.Seconds(20), function() + MaleficInit() + end) + end + else + if TimerTicks > 0 then + if TimerTicks > 25 then + TimerTicks = TimerTicks - 25 + else + TimerTicks = 0 + if not USSR.IsObjectiveCompleted(ObjectiveDefendPurifier) then + USSR.MarkCompletedObjective(ObjectiveDefendPurifier) + end + end + end + end + + UpdateMissionText() + end +end + +OncePerFiveSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 125 == 0 then + UpdatePlayerBaseLocations() + end +end + +OncePerThirtySecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % DateTime.Seconds(30) == 0 then + CalculatePlayerCharacteristics() + end +end + +-- Functions + +UpdateMissionText = function() + + if USSR.IsObjectiveCompleted(ObjectiveSecurePurifier) then + UserInterface.SetMissionText("Purifier teleportation in " .. UtilsCA.FormatTimeForGameSpeed(TimerTicks), HSLColor.Yellow) + else + if not Purifier.IsDead and Purifier.Owner == ScrinRebels then + local color = HSLColor.Yellow + if TimerTicks <= 125 then + color = HSLColor.Red + end + local text = "Purification wave in " .. UtilsCA.FormatTimeForGameSpeed(TimerTicks) + + if Difficulty == "brutal" then + if IronCurtainIntegrityTicksRemaining > 0 then + text = text .. " -- Iron Curtain integrity failure in " .. UtilsCA.FormatTimeForGameSpeed(IronCurtainIntegrityTicksRemaining) + else + color = HSLColor.Red + text = text .. " -- Iron Curtain destroyed" + end + end + + UserInterface.SetMissionText(text, color) + else + UserInterface.SetMissionText("") + end + end +end + +InitScrinRebels = function() + AutoRepairAndRebuildBuildings(ScrinRebels) + AutoRepairBuildings(ScrinRebelsOuter) + SetupRefAndSilosCaptureCredits(ScrinRebels) + AutoReplaceHarvesters(ScrinRebels) + AutoRebuildConyards(ScrinRebels) + InitAiUpgrades(ScrinRebels) + InitAttackSquad(Squads.ScrinRebels, ScrinRebels) + InitAirAttackSquad(Squads.ScrinRebelsAir, ScrinRebels) + + if IsHardOrAbove() then + InitAirAttackSquad(Squads.Enervators, ScrinRebels, MissionPlayers, { "etpd" }) + InitAirAttackSquad(Squads.ScrinRebelsAirToAir, Scrin, MissionPlayers, { "Aircraft" }, "ArmorType") + end + + local scrinRebelsGroundAttackers = ScrinRebels.GetGroundAttackers() + + Utils.Do(scrinRebelsGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsScrinGroundHunterUnit) + end) +end + +InitNod = function() + AutoRepairAndRebuildBuildings(Nod) + SetupRefAndSilosCaptureCredits(Nod) + AutoReplaceHarvesters(Nod) + AutoRebuildConyards(Nod) + InitAiUpgrades(Nod) + InitAttackSquad(Squads.Nod, Nod) + InitAirAttackSquad(Squads.NodAir, Nod) + + if IsNormalOrAbove() then + InitAirAttackSquad(Squads.Banshees, Nod, MissionPlayers, { "etpd" }) + end + + local nodGroundAttackers = Nod.GetGroundAttackers() + + Utils.Do(nodGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsNodGroundHunterUnit) + end) +end + +PurificationWave = function() + Lighting.Flash("Purification", AdjustTimeForGameSpeed(10)) + MediaCA.PlaySound(MissionDir .. "/purificationsm.aud", 2) + + local exterminators = GetMissionPlayersActorsByType("etpd") + if #exterminators > 0 then + local exterminator = exterminators[1] + local dummy = Actor.Create("purification.dummy", true, { Owner = ScrinRebels, Location = exterminator.Location }) + + Trigger.AfterDelay(1, function() + if exterminator.Owner == ScrinRebels and not USSR.IsObjectiveCompleted(ObjectiveSecurePurifier) then + USSR.MarkFailedObjective(ObjectiveSecurePurifier) + end + end) + + Trigger.AfterDelay(DateTime.Seconds(5), function() + dummy.Destroy() + end) + end +end + +MaleficInit = function() + if not MaleficArrived then + MaleficArrived = true + Lighting.Flash("Purification", AdjustTimeForGameSpeed(10)) + Lighting.Ambient = 0.4 + Lighting.Red = 0.9 + Lighting.Blue = 1.1 + Lighting.Green = 0.8 + + Utils.Do(MaleficSpawns, function(loc) + Actor.Create("wormhole", true, { Owner = MaleficScrin, Location = loc}) + end) + + MediaCA.PlaySound("malefic.aud", 2) + Trigger.AfterDelay(DateTime.Seconds(8), function() + Media.DisplayMessage("Impossible! These Scrin are not.. Do not allow the device to be destroyed!", "Scrin Overlord", HSLColor.FromHex("7700FF")) + MediaCA.PlaySound(MissionDir .. "/ovld_impossible.aud", 2) + + Trigger.AfterDelay(DateTime.Seconds(8), function() + Utils.Do(OverlordSpawns, function(loc) + Actor.Create("wormhole", true, { Owner = Scrin, Location = loc}) + end) + OverlordSpawn(true) + end) + end) + + MaleficSpawn(true) + end +end + +MaleficSpawn = function(isInitial) + local invasionCompositions = { + { "intl", "s1", "s1", "s1", "s1", "s3", "s3", "s4", "s4", "stlk", "stlk", "stlk" }, + { "dark", "s1", "s1", "s1", "s1", "s3", "s4", "stlk", "stlk", "stlk" }, + { "tpod", "s1", "s1", "s1", "s3", "s3", "s4", "stlk", "stlk" }, + { "dark", "s1", "s1", "s1", "s3", "s3", "s4", "stlk", "stlk", "stlk" }, + } + + Utils.Do(MaleficSpawns, function(s) + local units = Reinforcements.Reinforce(MaleficScrin, Utils.Shuffle(Utils.Random(invasionCompositions)), { s }, 1) + Utils.Do(units, function(unit) + unit.Scatter() + Trigger.AfterDelay(5, function() + if not unit.IsDead then + if not Purifier.IsDead then + unit.AttackMove(Purifier.Location) + end + unit.Hunt() + end + end) + end) + end) + + local prepTime = 0 + if isInitial then + prepTime = DateTime.Seconds(20) + end + + Trigger.AfterDelay(GetInvasionInterval() + prepTime, MaleficSpawn) +end + +OverlordSpawn = function(isInitial) + local overlordCompositions = { + { "devo", "s1", "s1", "s1", "s3", "s4", "evis", "evis", "evis" }, + { "tpod", "s1", "s1", "s1", "s3", "evis", "evis" }, + { "ruin","s1", "s1", "s1", "s1", "s3", "s4", "evis", "evis" }, + } + + Utils.Do(OverlordSpawns, function(s) + local units = Reinforcements.Reinforce(Scrin, Utils.Shuffle(Utils.Random(overlordCompositions)), { s }, 1) + Utils.Do(units, function(unit) + unit.Scatter() + Trigger.AfterDelay(5, function() + if not unit.IsDead then + unit.Hunt() + end + end) + end) + end) + + local prepTime = 0 + if isInitial then + prepTime = DateTime.Seconds(20) + end + + Trigger.AfterDelay(DateTime.Seconds(30) + prepTime, OverlordSpawn) +end + +GetInvasionInterval = function() + local defenders = Utils.Where(Map.ActorsInCircle(PurifierPosition, WDist.New(20 * 1024)), function(a) + return IsMissionPlayer(a.Owner) and not a.IsDead and a.HasProperty("Attack") and a.Type ~= "etpd" + end) + + local armyValue = GetTotalCostOfUnits(defenders) + local baseInterval = DateTime.Seconds(30) + local secondsToSubtract = math.floor(armyValue / 3500) + local minimumInterval = DateTime.Seconds(12) + + if not Purifier.IsDead and Purifier.Health < Purifier.MaxHealth / 3 then + baseInterval = baseInterval + DateTime.Seconds(15) + end + + if Difficulty == "easy" then + minimumInterval = DateTime.Seconds(30) + elseif Difficulty == "normal" then + minimumInterval = DateTime.Seconds(24) + elseif Difficulty == "hard" then + minimumInterval = DateTime.Seconds(18) + end + + return math.max(baseInterval - DateTime.Seconds(secondsToSubtract), minimumInterval) +end + +ApplyIronCurtain = function() + if USSR.PowerState ~= "Normal" then + return + end + local ics = GetMissionPlayersActorsByType("iron") + if #ics > 0 then + local ic = ics[1] + Media.PlaySound("ironcur9.aud") + Exterminator.GrantCondition("invulnerability", DateTime.Seconds(8)) + end +end + +TransferExterminator = function() + Exterminator.Owner = USSR +end + +-- overridden in co-op version +DoMcvArrival = function() + Reinforcements.Reinforce(USSR, { "mcv" }, { McvSpawn.Location, McvDest.Location }, 75) +end diff --git a/mods/ca/missions/main-campaign/ca43-dissection/1x1rocks.shp b/mods/ca/missions/main-campaign/ca43-dissection/1x1rocks.shp new file mode 100644 index 0000000000..9256070cfe Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/1x1rocks.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/1x1ruins.shp b/mods/ca/missions/main-campaign/ca43-dissection/1x1ruins.shp new file mode 100644 index 0000000000..701ce90e1f Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/1x1ruins.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/1x1searocks.shp b/mods/ca/missions/main-campaign/ca43-dissection/1x1searocks.shp new file mode 100644 index 0000000000..5747f2f85e Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/1x1searocks.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/1x2grebld.shp b/mods/ca/missions/main-campaign/ca43-dissection/1x2grebld.shp new file mode 100644 index 0000000000..38d0717fd5 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/1x2grebld.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/1x2stones.shp b/mods/ca/missions/main-campaign/ca43-dissection/1x2stones.shp new file mode 100644 index 0000000000..37960d68ab Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/1x2stones.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/2x1ruins.shp b/mods/ca/missions/main-campaign/ca43-dissection/2x1ruins.shp new file mode 100644 index 0000000000..3651c5d631 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/2x1ruins.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/2x1stones.shp b/mods/ca/missions/main-campaign/ca43-dissection/2x1stones.shp new file mode 100644 index 0000000000..a8789a918b Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/2x1stones.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/2x2rocks.shp b/mods/ca/missions/main-campaign/ca43-dissection/2x2rocks.shp new file mode 100644 index 0000000000..4ecc8931c9 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/2x2rocks.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/2x2searocks.shp b/mods/ca/missions/main-campaign/ca43-dissection/2x2searocks.shp new file mode 100644 index 0000000000..8e83d4e9e5 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/2x2searocks.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/basejungle.pal b/mods/ca/missions/main-campaign/ca43-dissection/basejungle.pal new file mode 100644 index 0000000000..9a94c85f46 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/basejungle.pal differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/bush.shp b/mods/ca/missions/main-campaign/ca43-dissection/bush.shp new file mode 100644 index 0000000000..43107e1e87 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/bush.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/cypr.shp b/mods/ca/missions/main-campaign/ca43-dissection/cypr.shp new file mode 100644 index 0000000000..3e7375aae8 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/cypr.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/desert.pal b/mods/ca/missions/main-campaign/ca43-dissection/desert.pal new file mode 100644 index 0000000000..e57075e5f3 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/desert.pal differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/dissection-rules.yaml b/mods/ca/missions/main-campaign/ca43-dissection/dissection-rules.yaml new file mode 100644 index 0000000000..bd740e1e7b --- /dev/null +++ b/mods/ca/missions/main-campaign/ca43-dissection/dissection-rules.yaml @@ -0,0 +1,139 @@ +^Palettes: + TintPostProcessEffect: + Red: 1 + Green: 1 + Blue: 1 + Ambient: 1 + PaletteFromFile@terrain-temperat: + Name: terrain + Tileset: TEMPERAT + Filename: ca|missions/main-campaign/ca43-dissection/basejungle.pal + ShadowIndex: 3, 4 + +World: + LuaScript: + Scripts: campaign.lua, dissection.lua + MissionData: + Briefing: Hope for peace with the Soviets is all but lost. The potential successors to Stalin that were somewhat open to diplomacy have been eliminated by their new premier Antoly Cherdenko, who — in his mad pursuit of more power — has done the unthinkable and aligned himself with the Scrin Overlord, apparently preventing the Overlord's defeat at the hands of rebel forces.\n\nWhile GDI, Nod and the Scrin were busy fighting on the Scrin homeworld, the Soviets engaged in a massive rearmament program, and now with the Overlord's assistance they have begun open hostilities once again.\n\nOur relationship with GDI has soured. The official line is that they no longer trust us with matters of security and defense, largely due to the escape of Yuri and the Scrin Prodigy. This reeks of hypocrisy, and we suspect they are hiding something and are using this an excuse, however we cannot afford our alliance with them to disintegrate, so for now we are putting our suspicions aside.\n\nThere are also troubling reports of a new threat; a third Scrin faction that is waging war indiscriminately. It seems they have already established a gateway to Earth, but we are awaiting confirmation of this.\n\nOur resources are stretched to the limit as we contend with enemies on many fronts. Allied High Command is due to meet to discuss options and formulate a strategy moving forward, but a situation has been unfolding that requires our immediate attention.\n\nThe Soviets have pushed south through Greece, all the way to the Mediterranean coast. Their goal appears to be Turkey, which is the only realistic staging ground for any strike against their gateway to the Scrin homeworld.\n\nOur forces in Turkey are now completely cut off and are being encircled. We cannot let the Soviets establish a buffer zone which places their gateway out of reach, as this will allow the Overlord's forces to continue flooding in.\n\nOur positions either side of the Soviet salient are crumbling under Soviet bombing runs and rocket bombardment and need urgent reinforcement. Take control of what forces remain and push the Soviets back.\n\nFrequent bombing runs are being coordinated by numerous Soviet Radar Domes in the area. Neutralizing these should be a top priority.\n\nAlso, while they are a minor Allied power, the Greeks have been developing some impressive new weaponry that may prove useful in this mission. + MapOptions: + ShortGameCheckboxEnabled: False + MusicPlaylist: + StartingMusic: shut_it + +Player: + PlayerResources: + DefaultCash: 6000 + +# Enable subfaction specific tech + +SNIP: + Buildable: + Prerequisites: ~tent, anyradar + +RTNK: + Buildable: + Prerequisites: ~vehicles.allies + +TNKD: + Buildable: + Prerequisites: anyradar, ~vehicles.allies + +CHPR: + Buildable: + Prerequisites: atek, ~vehicles.allies + +BATF: + Buildable: + Prerequisites: atek, ~vehicles.allies + +NHAW: + Buildable: + Prerequisites: ~aircraft.allies + +HTUR: + Buildable: + Prerequisites: ~structures.allies, anyradar + +entrench.upgrade: + Buildable: + Prerequisites: anyradar, ~radar.allies + +apb.upgrade: + Buildable: + Prerequisites: atek + +tflx.upgrade: + Buildable: + Prerequisites: pdox + +# Disable powers for AI + +^ParabombsPower: + AirstrikePowerCA@Russianparabombs: + Prerequisites: ~support.parabombs, ~!botplayer + +^ParatroopersPower: + ParatroopersPowerCA@paratroopers: + Prerequisites: ~support.paratroopers, ~!botplayer + +# Misc + +DOME: + ExternalCondition@PowerDown: + Condition: powerdown + +LST.MCV: + Inherits: LST + -Buildable: + RenderSprites: + Image: lst + Cargo: + InitialUnits: mcv, 2tnk, 2tnk, jeep, arty + +ALHQ: + FreeActor@Greece: + Actor: greece.coalition + +greece.coalition: + Inherits@CAMPAIGNDISABLED: ^Disabled + +sweden.coalition: + Inherits@CAMPAIGNDISABLED: ^Disabled + +korea.coalition: + Inherits@CAMPAIGNDISABLED: ^Disabled + +FLARE: + RevealsShroud: + Range: 8c0 + +GRAD.Defender: + Inherits: GRAD + -Buildable: + RenderSprites: + Image: grad + AutoTarget: + InitialStanceAI: Defend + +BADR.Carpet: + Inherits: BADR.CBomber + Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove + -AmmoPool: + -AttackBomber: + AttackAircraft: + FacingTolerance: 512 + OpportunityFire: true + Health: + HP: 40000 + RevealsShroud: + Range: 12c0 + Type: GroundPosition + AutoTarget: + InitialStanceAI: AttackAnything + MinimumScanTimeInterval: 1 + MaximumScanTimeInterval: 2 + AmmoPool: + Ammo: 10 + AmmoCondition: ammo + Armament: + PauseOnCondition: !ammo diff --git a/mods/ca/missions/main-campaign/ca43-dissection/dissection.lua b/mods/ca/missions/main-campaign/ca43-dissection/dissection.lua new file mode 100644 index 0000000000..7b6d3b10de --- /dev/null +++ b/mods/ca/missions/main-campaign/ca43-dissection/dissection.lua @@ -0,0 +1,433 @@ +MissionDir = "ca|missions/main-campaign/ca43-dissection" + +SuperweaponsEnabledTime = { + easy = DateTime.Minutes(60), + normal = DateTime.Minutes(40), + hard = DateTime.Minutes(30), + vhard = DateTime.Minutes(20), + brutal = DateTime.Minutes(15) +} + +GradReplacementDelay = { + easy = DateTime.Seconds(360), + normal = DateTime.Seconds(240), + hard = DateTime.Seconds(120), + vhard = DateTime.Seconds(80), + brutal = DateTime.Seconds(60) +} + +MaxBomberTargets = { + easy = 2, + normal = 3, + hard = 4, + vhard = 5, + brutal = 6 +} + +BombingRunInterval = { + easy = DateTime.Minutes(6), + normal = DateTime.Minutes(5), + hard = DateTime.Minutes(4), + vhard = DateTime.Minutes(3), + brutal = DateTime.Minutes(2) +} + +AllDomesDisabled = false +DomesDisabled = {} + +SovietRallyPoints = { EastRally1, EastRally2, EastRally3, EastRally4, EastRally5, WestRally1, WestRally2, WestRally3 } + +NextGradReplacementTime = 0 + +SovietAttackPaths = function(squad) + local paths = {} + local conyards = GetMissionPlayersActorsByTypes({ "fact", "mcv" }) + for _, conyard in ipairs(conyards) do + local rallyPoints = Map.ActorsInCircle(conyard.CenterPosition, WDist.New(36 * 1024), function(a) return a.Type == "waypoint" end) + for _, rp in ipairs(rallyPoints) do + for _, srp in ipairs(SovietRallyPoints) do + if rp == srp then + table.insert(paths, { srp.Location }) + break + end + end + end + end + return paths +end + +Squads = { + Main = { + Compositions = AdjustCompositionsForDifficulty(UnitCompositions.Soviet), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 40, Max = 80 }), + FollowLeader = true, + AttackPaths = SovietAttackPaths, + Delay = AdjustDelayForDifficulty(DateTime.Minutes(1)), + ProducerActors = { Infantry = { SouthBarracks, NorthBarracks }, Vehicle = { SouthFactory, NorthFactory } }, + }, + Air = { + Delay = AdjustAirDelayForDifficulty(DateTime.Minutes(12)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 12, Max = 12 }), + Compositions = AirCompositions.Soviet, + } +} + +SetupPlayers = function() + Greece = Player.GetPlayer("Greece") + USSR = Player.GetPlayer("USSR") + Scrin = Player.GetPlayer("Scrin") + England = Player.GetPlayer("England") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = { Greece } + MissionEnemies = { USSR } +end + +WorldLoaded = function() + SetupPlayers() + + TicksUntilBombingRun = BombingRunInterval[Difficulty] + + Camera.Position = PlayerStart.CenterPosition + + InitObjectives(Greece) + AdjustPlayerStartingCashForDifficulty() + RemoveActorsBasedOnDifficultyTags() + InitUSSR() + SetupChurchMoneyCrates(Neutral) + + ObjectiveEliminateSoviets = Greece.AddObjective("Eliminate the Soviet presence.") + ObjectiveNeutralizeDomes = Greece.AddSecondaryObjective("Neutralize Soviet Radar Domes.") + + Trigger.AfterDelay(DateTime.Seconds(1), function() + PlaySpeechNotificationToMissionPlayers("ReinforcementsArrived") + Notification("Reinforcements have arrived.") + DoMcvArrival() + end) + + InitialRadars = {} + Utils.Do(MissionPlayers, function(p) + local radar = Actor.Create("radar.dummy", true, { Owner = p }) + table.insert(InitialRadars, radar) + end) + + Trigger.OnKilled(EnglandDome, function(self, killer) + Trigger.AfterDelay(DateTime.Seconds(5), function() + Utils.Do(InitialRadars, function(radar) + radar.Destroy() + end) + end) + end) + + Trigger.OnEnteredProximityTrigger(WestBaseCenter.CenterPosition, WDist.New(24 * 1024), function(a, id) + if IsMissionPlayer(a.Owner) then + Trigger.RemoveProximityTrigger(id) + AssumeControl(a.Owner, "west") + end + end) + + Trigger.OnEnteredProximityTrigger(EastBaseCenter.CenterPosition, WDist.New(24 * 1024), function(a, id) + if IsMissionPlayer(a.Owner) then + Trigger.RemoveProximityTrigger(id) + AssumeControl(a.Owner, "east") + end + end) + + SovietDomes = USSR.GetActorsByType("dome") + + Utils.Do(SovietDomes, function(d) + Trigger.OnKilled(d, function(self, killer) + DomeDisabled(d) + end) + Trigger.OnInfiltrated(d, function(self, infiltrator) + if IsMissionPlayer(infiltrator.Owner) then + DomeDisabled(d) + end + end) + end) + + local power = USSR.GetActorsByTypes({"powr", "apwr", "tpwr"}) + Utils.Do(power, function(p) + Trigger.OnInfiltrated(p, function(self, infiltrator) + if not p.IsDead and IsMissionPlayer(infiltrator.Owner) then + p.Sell() + end + end) + end) + + AfterWorldLoaded() +end + +Tick = function() + OncePerSecondChecks() + OncePerFiveSecondChecks() + OncePerThirtySecondChecks() + AfterTick() +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + USSR.Resources = USSR.ResourceCapacity - 500 + + if not PlayerHasBuildings(USSR) then + Greece.MarkCompletedObjective(ObjectiveEliminateSoviets) + end + + if MissionPlayersHaveNoRequiredUnits() then + Greece.MarkFailedObjective(ObjectiveEliminateSoviets) + end + + if AssumedControl and not AllDomesDisabled then + if TicksUntilBombingRun > 0 then + if USSR.PowerState == "Normal" then + TicksUntilBombingRun = TicksUntilBombingRun - 25 + end + else + TicksUntilBombingRun = BombingRunInterval[Difficulty] + InitBombingRun() + end + + UpdateMissionText() + end + end +end + +OncePerFiveSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 125 == 0 then + UpdatePlayerBaseLocations() + end +end + +OncePerThirtySecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 750 == 0 then + CalculatePlayerCharacteristics() + end +end + +InitUSSR = function() + RebuildExcludes.USSR = { Types = { "dome", "apwr", "powr" } } + + AutoRepairAndRebuildBuildings(USSR, 10) + SetupRefAndSilosCaptureCredits(USSR) + AutoReplaceHarvesters(USSR) + AutoRebuildConyards(USSR) + InitAiUpgrades(USSR) + InitAttackSquad(Squads.Main, USSR) + InitAirAttackSquad(Squads.Air, USSR) + + Trigger.AfterDelay(SuperweaponsEnabledTime[Difficulty], function() + Actor.Create("ai.superweapons.enabled", true, { Owner = USSR }) + Actor.Create("ai.minor.superweapons.enabled", true, { Owner = USSR }) + end) + + local ussrGroundAttackers = USSR.GetGroundAttackers() + Utils.Do(ussrGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsUSSRGroundHunterUnit) + end) + + local grads = USSR.GetActorsByType("grad.defender") + Utils.Do(grads, function(a) + GradReplacementTrigger(a, a.Location) + end) +end + +UpdateMissionText = function() + local color = HSLColor.Yellow + if TimerPushedBack then + color = HSLColor.Red + TimerPushedBack = false + end + + if not AllDomesDisabled then + UserInterface.SetMissionText("Soviet bombing run ETA " .. UtilsCA.FormatTimeForGameSpeed(TicksUntilBombingRun), color) + else + UserInterface.SetMissionText("") + end +end + +GradReplacementTrigger = function(grad, loc) + Trigger.OnKilled(grad, function(self, killer) + if not SouthFactory.IsDead and SouthFactory.Owner == USSR then + local nextReplacementDelay = GradReplacementDelay[Difficulty] + + if NextGradReplacementTime > DateTime.GameTime then + nextReplacementDelay = nextReplacementDelay + NextGradReplacementTime - DateTime.GameTime + end + + NextGradReplacementTime = DateTime.GameTime + nextReplacementDelay + + Trigger.AfterDelay(nextReplacementDelay, function() + local newGrad = Reinforcements.Reinforce(USSR, { "grad.defender" }, { GradSpawn.Location, loc })[1] + GradReplacementTrigger(newGrad, loc) + end) + end + end) +end + +DestroyFlares = function() + if not WestFlare.IsDead then + WestFlare.Destroy() + end + if not EastFlare.IsDead then + EastFlare.Destroy() + end +end + +-- overridden in co-op version +AssumeControl = function(player, side) + if AssumedControl then + return + end + + AssumedControl = true + + Notification("Command transfer complete.") + MediaCA.PlaySound(MissionDir .. "/r_transfer.aud", 2) + + Trigger.AfterDelay(DateTime.Seconds(2), function() + DestroyFlares() + local actorsToFlip = Utils.Where(England.GetActors(), function(a) return a.Type ~= "player" end) + + Utils.Do(actorsToFlip, function(a) a.Owner = Greece end) + + Trigger.AfterDelay(1, function() + Actor.Create("QueueUpdaterDummy", true, { Owner = Greece }) + end) + end) +end + +InitBombingRun = function() + local delay = 1 + local primaryTargets = GetMissionPlayersActorsByTypes({ "proc", "fact", "pdox", "weat" }) + local rightPrimaryTargets = {} + local leftPrimaryTargets = {} + local targets = {} + local usedXCoords = {} + local leftMinX = 2 + local leftMaxX = 50 + local rightMinX = 94 + local rightMaxX = 138 + local targetSide + + Utils.Do(primaryTargets, function(b) + if b.Location.X > rightMinX then + table.insert(rightPrimaryTargets, b) + elseif b.Location.X < leftMaxX then + table.insert(leftPrimaryTargets, b) + end + end) + + if math.abs(#leftPrimaryTargets - #rightPrimaryTargets) < 4 then + targets = Utils.Concat(leftPrimaryTargets, rightPrimaryTargets) + targetSide = "both" + elseif #leftPrimaryTargets > #rightPrimaryTargets then + targets = leftPrimaryTargets + targetSide = "left" + elseif #rightPrimaryTargets > #leftPrimaryTargets then + targets = rightPrimaryTargets + targetSide = "right" + end + + local maxTargets = MaxBomberTargets[Difficulty] + + if IsVeryHardOrAbove() and DateTime.GameTime > DateTime.Minutes(20) then + maxTargets = maxTargets + 1 + end + + if IsVeryHardOrAbove() and DateTime.GameTime > DateTime.Minutes(30) then + maxTargets = maxTargets + 1 + end + + if IsVeryHardOrAbove() and DateTime.GameTime > DateTime.Minutes(40) then + maxTargets = maxTargets + 1 + end + + targets = Utils.Take(math.min(maxTargets, #primaryTargets), Utils.Shuffle(primaryTargets)) + + if #targets < maxTargets and DateTime.GameTime > DateTime.Minutes(20) then + local secondaryTargets = GetMissionPlayersActorsByTypes({ "apwr", "weap", "atek", "dome", "hpad" }) + secondaryTargets = Utils.Shuffle(secondaryTargets) + + for _, t in ipairs(secondaryTargets) do + table.insert(targets, t) + if #targets >= maxTargets then + break + end + end + end + + if #targets > 0 then + Notification("Warning, bombing run incoming.") + MediaCA.PlaySound(MissionDir .. "/r_bombingrun.aud", 2) + + Utils.Do(targets, function(t) + Trigger.AfterDelay(delay, function() + if not t.IsDead then + local x = t.Location.X + 1 + + if usedXCoords[x] then + if targetSide == "both" then + targetSide = Utils.Random({ "left", "right" }) + end + if targetSide == "left" then + x = Utils.RandomInteger(leftMinX, leftMaxX) + else + x = Utils.RandomInteger(rightMinX, rightMaxX) + end + end + + usedXCoords[x] = true + usedXCoords[x - 1] = true + usedXCoords[x + 1] = true + + local entry = CPos.New(x, 0) + local exit = CPos.New(x, 160) + + Reinforcements.Reinforce(USSR, { "badr.carpet" }, { entry, exit }, 25, function(self) + self.Destroy() + end) + end + end) + delay = delay + DateTime.Seconds(2) + end) + end +end + +DomeDisabled = function(d) + local actorId = tostring(d) + + if DomesDisabled[actorId] then + return + end + + DomesDisabled[actorId] = true + + if not d.IsDead then + d.GrantCondition("powerdown") + end + + local numDomesDisabled = 0 + for _ in pairs(DomesDisabled) do + numDomesDisabled = numDomesDisabled + 1 + end + + Notification("Radar Dome neutralized, Soviet bombing runs have been delayed.") + + if numDomesDisabled >= #SovietDomes then + AllDomesDisabled = true + Greece.MarkCompletedObjective(ObjectiveNeutralizeDomes) + end + + TicksUntilBombingRun = TicksUntilBombingRun + DateTime.Minutes(1) + BombingRunInterval[Difficulty] = BombingRunInterval[Difficulty] + DateTime.Seconds(20) + + if AssumedControl then + TimerPushedBack = true + UpdateMissionText() + end +end + +DoMcvArrival = function() + Beacon.New(Greece, ReinforcementDest.CenterPosition) + Reinforcements.Reinforce(Greece, { "lst.mcv" }, { ReinforcementSpawn.Location, ReinforcementDest.Location }, 75) +end diff --git a/mods/ca/missions/main-campaign/ca43-dissection/ford.shp b/mods/ca/missions/main-campaign/ca43-dissection/ford.shp new file mode 100644 index 0000000000..62d340e408 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/ford.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/ford1.shp b/mods/ca/missions/main-campaign/ca43-dissection/ford1.shp new file mode 100644 index 0000000000..303c53064a Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/ford1.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/grtilled.shp b/mods/ca/missions/main-campaign/ca43-dissection/grtilled.shp new file mode 100644 index 0000000000..6263e48022 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/grtilled.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/grtilledlong.shp b/mods/ca/missions/main-campaign/ca43-dissection/grtilledlong.shp new file mode 100644 index 0000000000..a0e721e1c4 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/grtilledlong.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/grtilledsm.shp b/mods/ca/missions/main-campaign/ca43-dissection/grtilledsm.shp new file mode 100644 index 0000000000..905ee11152 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/grtilledsm.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/jt01.shp b/mods/ca/missions/main-campaign/ca43-dissection/jt01.shp new file mode 100644 index 0000000000..20e6954db8 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/jt01.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/jt02.shp b/mods/ca/missions/main-campaign/ca43-dissection/jt02.shp new file mode 100644 index 0000000000..6a53893c1d Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/jt02.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/jt03.shp b/mods/ca/missions/main-campaign/ca43-dissection/jt03.shp new file mode 100644 index 0000000000..fb36a4244a Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/jt03.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/jt05.shp b/mods/ca/missions/main-campaign/ca43-dissection/jt05.shp new file mode 100644 index 0000000000..e3059e29c4 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/jt05.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/jt06.shp b/mods/ca/missions/main-campaign/ca43-dissection/jt06.shp new file mode 100644 index 0000000000..981ebf1cf3 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/jt06.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/jt07.shp b/mods/ca/missions/main-campaign/ca43-dissection/jt07.shp new file mode 100644 index 0000000000..e4daeb6700 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/jt07.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/jt08.shp b/mods/ca/missions/main-campaign/ca43-dissection/jt08.shp new file mode 100644 index 0000000000..bc163aa7a6 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/jt08.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/jt10.shp b/mods/ca/missions/main-campaign/ca43-dissection/jt10.shp new file mode 100644 index 0000000000..a0568fec54 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/jt10.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/jt11.shp b/mods/ca/missions/main-campaign/ca43-dissection/jt11.shp new file mode 100644 index 0000000000..b09713ddf1 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/jt11.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/jt13.shp b/mods/ca/missions/main-campaign/ca43-dissection/jt13.shp new file mode 100644 index 0000000000..cf19192c90 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/jt13.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/jt14.shp b/mods/ca/missions/main-campaign/ca43-dissection/jt14.shp new file mode 100644 index 0000000000..2f2cfd79d9 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/jt14.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/jt15.shp b/mods/ca/missions/main-campaign/ca43-dissection/jt15.shp new file mode 100644 index 0000000000..b4be3cd2cf Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/jt15.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/jt16.shp b/mods/ca/missions/main-campaign/ca43-dissection/jt16.shp new file mode 100644 index 0000000000..bd4a73d677 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/jt16.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/jt17.shp b/mods/ca/missions/main-campaign/ca43-dissection/jt17.shp new file mode 100644 index 0000000000..8396868811 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/jt17.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/jtc01.shp b/mods/ca/missions/main-campaign/ca43-dissection/jtc01.shp new file mode 100644 index 0000000000..0a60ae8c31 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/jtc01.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/jtc02.shp b/mods/ca/missions/main-campaign/ca43-dissection/jtc02.shp new file mode 100644 index 0000000000..c7ca88ab9e Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/jtc02.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/jtc03.shp b/mods/ca/missions/main-campaign/ca43-dissection/jtc03.shp new file mode 100644 index 0000000000..6cc569d0ab Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/jtc03.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/jtc04.shp b/mods/ca/missions/main-campaign/ca43-dissection/jtc04.shp new file mode 100644 index 0000000000..f4d4e538dd Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/jtc04.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/jtc05.shp b/mods/ca/missions/main-campaign/ca43-dissection/jtc05.shp new file mode 100644 index 0000000000..4456afc93c Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/jtc05.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/jungle.pal b/mods/ca/missions/main-campaign/ca43-dissection/jungle.pal new file mode 100644 index 0000000000..58e4cb98b5 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/jungle.pal differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/jungle1.aud b/mods/ca/missions/main-campaign/ca43-dissection/jungle1.aud new file mode 100644 index 0000000000..794fe2a3b0 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/jungle1.aud differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/jungle2.aud b/mods/ca/missions/main-campaign/ca43-dissection/jungle2.aud new file mode 100644 index 0000000000..be254c6941 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/jungle2.aud differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/jungle3.aud b/mods/ca/missions/main-campaign/ca43-dissection/jungle3.aud new file mode 100644 index 0000000000..8648e37591 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/jungle3.aud differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/junglebush.pal b/mods/ca/missions/main-campaign/ca43-dissection/junglebush.pal new file mode 100644 index 0000000000..18dc7a4a26 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/junglebush.pal differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/lbush.shp b/mods/ca/missions/main-campaign/ca43-dissection/lbush.shp new file mode 100644 index 0000000000..38c6c9696b Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/lbush.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/map.bin b/mods/ca/missions/main-campaign/ca43-dissection/map.bin new file mode 100644 index 0000000000..82be27e988 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/map.bin differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/map.png b/mods/ca/missions/main-campaign/ca43-dissection/map.png new file mode 100644 index 0000000000..0643059602 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/map.png differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/map.yaml b/mods/ca/missions/main-campaign/ca43-dissection/map.yaml new file mode 100644 index 0000000000..1db0c36016 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca43-dissection/map.yaml @@ -0,0 +1,4156 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 43: Dissection + +Author: Darkademic + +Tileset: DESERT + +MapSize: 142,162 + +Bounds: 1,1,140,160 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: Greece, England, USSR, Scrin + PlayerReference@Greece: + Name: Greece + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: allies + LockColor: True + Color: 99ACF2 + LockSpawn: True + LockTeam: True + Allies: England + Enemies: USSR, Scrin, Creeps + PlayerReference@USSR: + Name: USSR + Bot: campaign + Faction: soviet + Color: FE1100 + Allies: Scrin + Enemies: Greece, England, Creeps + PlayerReference@Scrin: + Name: Scrin + Bot: campaign + Faction: scrin + Color: 7700FF + Allies: USSR + Enemies: Greece, England, Creeps + PlayerReference@England: + Name: England + Faction: allies + Color: A1EF8C + Allies: Greece + Enemies: USSR, Scrin, Creeps + +Actors: + Actor1: 2x2searocks2 + Owner: Neutral + Location: 91,143 + Actor2: 2x2searocks4 + Owner: Neutral + Location: 30,146 + Actor3: 2x2searocks1 + Owner: Neutral + Location: 61,149 + Actor4: mt2 + Owner: Neutral + Location: 32,94 + Actor5: mt1 + Owner: Neutral + Location: 127,107 + Actor6: 1x1searocks2 + Owner: Neutral + Location: 110,147 + Actor7: 1x1searocks3 + Owner: Neutral + Location: 132,145 + Actor8: temple + Owner: Neutral + Location: 16,93 + Actor9: 2x2rocks4 + Owner: Neutral + Location: 103,89 + Actor10: 2x1ruins2 + Owner: Neutral + Location: 24,90 + Actor11: 1x1ruins7 + Owner: Neutral + Location: 34,93 + Actor12: 1x1ruins1 + Owner: Neutral + Location: 5,88 + Actor13: 2x1stones2 + Owner: Neutral + Location: 18,96 + Actor14: tgd2 + Owner: Neutral + Location: 16,112 + Actor15: tgb + Owner: Neutral + Location: 47,108 + Actor16: tgc1 + Owner: Neutral + Location: 45,105 + Actor17: tree3 + Owner: Neutral + Location: 61,131 + Actor19: tree4 + Owner: Neutral + Location: 26,126 + Actor20: tgc2 + Owner: Neutral + Location: 35,122 + Actor21: tg2 + Owner: Neutral + Location: 37,124 + Actor23: tgb + Owner: Neutral + Location: 102,124 + Actor24: tgc1 + Owner: Neutral + Location: 130,124 + Actor25: tgd2 + Owner: Neutral + Location: 100,99 + Actor26: tgc2 + Owner: Neutral + Location: 102,96 + Actor27: terroristhouse + Owner: Neutral + Location: 129,133 + Actor28: mebld3b + Owner: Neutral + Location: 9,125 + Actor29: mebld6 + Owner: Neutral + Location: 21,122 + Actor30: mebld5a + Owner: Neutral + Location: 5,125 + Actor31: mebld5d + Owner: Neutral + Location: 22,127 + Actor32: mebld3c + Owner: Neutral + Location: 34,99 + Actor33: mebld1a + Owner: Neutral + Location: 27,93 + Actor34: mebld1b + Owner: Neutral + Location: 9,86 + Actor35: mebld4c + Owner: Neutral + Location: 37,131 + Actor36: tree3 + Owner: Neutral + Location: 38,130 + Actor38: tree5 + Owner: Neutral + Location: 17,124 + Actor37: tree3 + Owner: Neutral + Location: 8,124 + Actor39: tree3 + Owner: Neutral + Location: 23,121 + Actor40: cypr1 + Owner: Neutral + Location: 4,123 + Actor41: cypr2 + Owner: Neutral + Location: 29,119 + Actor42: rock5 + Owner: Neutral + Location: 52,130 + Actor43: mebld5c + Owner: Neutral + Location: 55,133 + Actor44: mebld4b + Owner: Neutral + Location: 45,129 + Actor45: mebld4b + Owner: Neutral + Location: 18,88 + Actor46: mebld1a + Owner: Neutral + Location: 29,60 + Actor47: mebld3c + Owner: Neutral + Location: 119,100 + Actor48: mebld2 + Owner: Neutral + Location: 122,98 + Actor49: mebld3a + Owner: Neutral + Location: 113,94 + Actor50: mebld5b + Owner: Neutral + Location: 124,134 + Actor51: mebld5c + Owner: Neutral + Location: 139,131 + Actor52: mebld1a + Owner: Neutral + Location: 106,130 + Actor55: mebld4c + Owner: Neutral + Location: 92,130 + Actor56: mebld1a + Owner: Neutral + Location: 88,130 + Actor57: mebld5b + Owner: Neutral + Location: 98,127 + Actor58: tree3 + Owner: Neutral + Location: 98,129 + Actor59: tree4 + Owner: Neutral + Location: 90,128 + Actor60: tree2 + Owner: Neutral + Location: 112,129 + Actor61: tree5 + Owner: Neutral + Location: 125,132 + Actor62: tg1 + Owner: Neutral + Location: 105,129 + Actor64: tree1 + Owner: Neutral + Location: 127,133 + Actor65: cypr2 + Owner: Neutral + Location: 137,129 + Actor66: tg2 + Owner: Neutral + Location: 133,136 + Actor22: tree2 + Owner: Neutral + Location: 18,134 + Actor67: v17 + Owner: Neutral + Location: 85,142 + Actor54: mebld4b + Owner: Neutral + Location: 119,136 + Actor53: mebld2 + Owner: Neutral + Location: 102,133 + Actor63: tree5 + Owner: Neutral + Location: 101,132 + Actor68: v23 + Owner: Neutral + Location: 107,130 + Actor69: v10 + Owner: Neutral + Location: 6,67 + Actor70: v22 + Owner: Neutral + Location: 9,63 + Actor71: grtilled0 + Owner: Neutral + Location: 9,64 + Actor72: grtilled2 + Owner: Neutral + Location: 6,68 + Actor73: grtilled1 + Owner: Neutral + Location: 8,60 + Actor74: grtilled0 + Owner: Neutral + Location: 9,53 + Actor75: 1x1ruins1 + Owner: Neutral + Location: 35,62 + Actor76: 2x1ruins2 + Owner: Neutral + Location: 53,66 + Actor77: 2x1ruins1 + Owner: Neutral + Location: 67,49 + Actor78: 1x1ruins3 + Owner: Neutral + Location: 69,40 + Actor79: 1x1ruins5 + Owner: Neutral + Location: 68,60 + Actor80: 1x1ruins7 + Owner: Neutral + Location: 72,69 + Actor81: 1x1ruins8 + Owner: Neutral + Location: 71,73 + Actor82: 1x1ruins9 + Owner: Neutral + Location: 71,81 + Actor83: 2x1ruins2 + Owner: Neutral + Location: 77,86 + Actor84: 2x1stones3 + Owner: Neutral + Location: 76,95 + Actor85: 2x2rocks1 + Owner: Neutral + Location: 76,92 + Actor86: 2x2rocks2 + Owner: Neutral + Location: 7,46 + Actor87: 2x2rocks1 + Owner: Neutral + Location: 131,34 + Actor88: tgd + Owner: Neutral + Location: 12,58 + Actor89: tgb + Owner: Neutral + Location: 113,73 + Actor90: tgc2 + Owner: Neutral + Location: 112,65 + Actor91: cypr2 + Owner: Neutral + Location: 103,67 + Actor93: tg1 + Owner: Neutral + Location: 113,67 + Actor92: tgc1 + Owner: Neutral + Location: 136,64 + Actor94: tree5 + Owner: Neutral + Location: 115,53 + Actor95: tree4 + Owner: Neutral + Location: 122,41 + Actor96: tree6 + Owner: Neutral + Location: 33,43 + Actor97: tree2 + Owner: Neutral + Location: 29,51 + Actor98: tgc2 + Owner: Neutral + Location: 26,47 + Actor99: tree2 + Owner: Neutral + Location: 8,58 + Actor100: tree2 + Owner: Neutral + Location: 9,68 + Actor102: 1x2stones2 + Owner: Neutral + Location: 34,61 + Actor103: grtilled1 + Owner: Neutral + Location: 131,58 + Actor104: grtilled2 + Owner: Neutral + Location: 135,68 + Actor105: grtilled0 + Owner: Neutral + Location: 130,64 + Actor106: mebld1a + Owner: Neutral + Location: 132,63 + Actor107: mebld5b + Owner: Neutral + Location: 132,57 + Actor108: v23 + Owner: Neutral + Location: 131,63 + Actor109: wood + Owner: Neutral + Location: 133,63 + Actor110: wood + Owner: Neutral + Location: 133,64 + Actor111: wood + Owner: Neutral + Location: 133,65 + Actor112: wood + Owner: Neutral + Location: 133,66 + Actor113: wood + Owner: Neutral + Location: 132,66 + Actor114: wood + Owner: Neutral + Location: 133,62 + Actor115: wood + Owner: Neutral + Location: 132,62 + Actor116: wood + Owner: Neutral + Location: 136,67 + Actor117: wood + Owner: Neutral + Location: 137,67 + Actor118: wood + Owner: Neutral + Location: 137,69 + Actor119: wood + Owner: Neutral + Location: 137,68 + Actor120: wood + Owner: Neutral + Location: 137,70 + Actor121: wood + Owner: Neutral + Location: 135,67 + Actor122: wood + Owner: Neutral + Location: 135,66 + Actor123: wood + Owner: Neutral + Location: 134,66 + Actor124: wood + Owner: Neutral + Location: 137,71 + Actor125: wood + Owner: Neutral + Location: 136,71 + Actor126: wood + Owner: Neutral + Location: 135,71 + Actor127: wood + Owner: Neutral + Location: 133,56 + Actor128: wood + Owner: Neutral + Location: 133,57 + Actor129: wood + Owner: Neutral + Location: 133,58 + Actor130: wood + Owner: Neutral + Location: 133,59 + Actor131: wood + Owner: Neutral + Location: 133,60 + Actor132: wood + Owner: Neutral + Location: 132,60 + Actor133: wood + Owner: Neutral + Location: 131,60 + Actor134: wood + Owner: Neutral + Location: 132,56 + Actor135: wood + Owner: Neutral + Location: 131,56 + Actor136: wood + Owner: Neutral + Location: 8,62 + Actor137: wood + Owner: Neutral + Location: 9,62 + Actor138: wood + Owner: Neutral + Location: 7,62 + Actor139: wood + Owner: Neutral + Location: 7,61 + Actor140: wood + Owner: Neutral + Location: 8,63 + Actor141: wood + Owner: Neutral + Location: 8,64 + Actor142: wood + Owner: Neutral + Location: 8,65 + Actor143: wood + Owner: Neutral + Location: 6,66 + Actor144: wood + Owner: Neutral + Location: 6,65 + Actor145: wood + Owner: Neutral + Location: 7,65 + Actor146: wood + Owner: Neutral + Location: 5,66 + Actor147: wood + Owner: Neutral + Location: 5,67 + Actor148: wood + Owner: Neutral + Location: 5,68 + Actor149: wood + Owner: Neutral + Location: 5,69 + Actor150: wood + Owner: Neutral + Location: 5,70 + Actor151: wood + Owner: Neutral + Location: 8,66 + Actor152: wood + Owner: Neutral + Location: 9,66 + Actor153: wood + Owner: Neutral + Location: 11,66 + Actor154: wood + Owner: Neutral + Location: 10,66 + Actor155: wood + Owner: Neutral + Location: 9,52 + Actor156: wood + Owner: Neutral + Location: 10,52 + Actor157: wood + Owner: Neutral + Location: 11,52 + Actor158: wood + Owner: Neutral + Location: 12,52 + Actor159: wood + Owner: Neutral + Location: 13,52 + Actor160: wood + Owner: Neutral + Location: 14,52 + Actor161: wood + Owner: Neutral + Location: 14,53 + Actor162: wood + Owner: Neutral + Location: 6,71 + Actor163: wood + Owner: Neutral + Location: 5,71 + Actor164: wood + Owner: Neutral + Location: 7,71 + Actor165: mebld5a + Owner: Neutral + Location: 12,53 + Actor166: mebld6 + Owner: Neutral + Location: 23,54 + Actor167: tgc1 + Owner: Neutral + Location: 15,51 + Actor168: tgd2 + Owner: Neutral + Location: 4,39 + Actor169: tgc2 + Owner: Neutral + Location: 16,23 + Actor170: tc04 + Owner: Neutral + Location: 31,29 + Actor171: t06 + Owner: Neutral + Location: 32,28 + Actor172: t06 + Owner: Neutral + Location: 33,25 + Actor173: t07 + Owner: Neutral + Location: 34,33 + Actor174: tc05 + Owner: Neutral + Location: 34,21 + Actor175: t16 + Owner: Neutral + Location: 30,25 + Actor176: t06 + Owner: Neutral + Location: 77,17 + Actor177: t02 + Owner: Neutral + Location: 115,18 + Actor178: t16 + Owner: Neutral + Location: 110,12 + Actor179: tc04 + Owner: Neutral + Location: 113,20 + Actor180: t15 + Owner: Neutral + Location: 116,52 + Actor181: t14 + Owner: Neutral + Location: 126,22 + Actor183: t06 + Owner: Neutral + Location: 133,33 + Actor184: tc04 + Owner: Neutral + Location: 132,53 + Actor185: tgb + Owner: Neutral + Location: 134,50 + Actor186: tree4 + Owner: Neutral + Location: 135,47 + Actor187: tree5 + Owner: Neutral + Location: 106,32 + Actor188: tgc1 + Owner: Neutral + Location: 136,92 + Actor189: tgd + Owner: Neutral + Location: 127,102 + Actor190: tree3 + Owner: Neutral + Location: 122,96 + Actor191: tree2 + Owner: Neutral + Location: 113,92 + Actor192: tree5 + Owner: Neutral + Location: 116,99 + Actor193: tree5 + Owner: Neutral + Location: 20,87 + Actor194: tree1 + Owner: Neutral + Location: 28,94 + Actor195: tree3 + Owner: Neutral + Location: 7,86 + Actor196: tree2 + Owner: Neutral + Location: 36,97 + Actor197: tree6 + Owner: Neutral + Location: 19,97 + Actor198: tgc1 + Owner: Neutral + Location: 11,98 + Actor199: tgb + Owner: Neutral + Location: 13,110 + Actor200: tgc2 + Owner: Neutral + Location: 16,110 + Actor201: cypr2 + Owner: Neutral + Location: 12,110 + Actor202: cypr1 + Owner: Neutral + Location: 17,110 + Actor203: cypr2 + Owner: Neutral + Location: 18,109 + Actor204: tree5 + Owner: Neutral + Location: 14,109 + Actor205: tree4 + Owner: Neutral + Location: 12,113 + Actor206: tg1 + Owner: Neutral + Location: 19,113 + Actor207: tree3 + Owner: Neutral + Location: 10,112 + Actor208: t12 + Owner: Neutral + Location: 50,104 + Actor209: t13 + Owner: Neutral + Location: 84,117 + Actor210: tc05 + Owner: Neutral + Location: 116,121 + Actor211: rock3 + Owner: Neutral + Location: 95,116 + Actor212: rock6 + Owner: Neutral + Location: 133,81 + Actor213: t14 + Owner: Neutral + Location: 132,68 + Actor214: t06 + Owner: Neutral + Location: 107,41 + Actor215: tc03 + Owner: Neutral + Location: 15,57 + Actor216: t03 + Owner: Neutral + Location: 14,57 + Actor217: t06 + Owner: Neutral + Location: 30,60 + Actor218: t02 + Owner: Neutral + Location: 40,56 + Actor219: t02 + Owner: Neutral + Location: 68,67 + Actor220: t11 + Owner: Neutral + Location: 86,50 + Actor221: t16 + Owner: Neutral + Location: 55,39 + Actor222: v25 + Owner: Neutral + Location: 133,45 + Actor223: v25 + Owner: Neutral + Location: 18,20 + Actor225: v22 + Owner: Neutral + Location: 15,33 + Actor224: t13 + Owner: Neutral + Location: 5,19 + Actor226: tgb + Owner: Neutral + Location: 88,23 + Actor227: tgc2 + Owner: Neutral + Location: 69,35 + Actor228: 2x1ruins2 + Owner: Neutral + Location: 71,30 + Actor229: 1x1ruins6 + Owner: Neutral + Location: 68,22 + Actor230: 1x1ruins7 + Owner: Neutral + Location: 64,32 + Actor231: mebld5b + Owner: Neutral + Location: 134,31 + Actor232: mebld5c + Owner: Neutral + Location: 128,54 + Actor233: brik + Owner: USSR + Location: 51,91 + Actor234: brik + Owner: USSR + Location: 49,90 + Actor235: brik + Owner: USSR + Location: 49,91 + Actor236: brik + Owner: USSR + Location: 48,90 + Actor237: brik + Owner: USSR + Location: 48,91 + Actor238: brik + Owner: USSR + Location: 50,91 + Actor239: brik + Owner: USSR + Location: 52,91 + Actor240: brik + Owner: USSR + Location: 52,92 + Actor241: brik + Owner: USSR + Location: 52,93 + Actor242: brik + Owner: USSR + Location: 53,93 + Actor243: brik + Owner: USSR + Location: 53,92 + Actor244: brik + Owner: USSR + Location: 52,97 + Actor245: brik + Owner: USSR + Location: 53,97 + Actor246: brik + Owner: USSR + Location: 52,98 + Actor247: brik + Owner: USSR + Location: 53,98 + Actor248: brik + Owner: USSR + Location: 52,99 + Actor249: brik + Owner: USSR + Location: 52,100 + Actor250: brik + Owner: USSR + Location: 52,101 + Actor251: brik + Owner: USSR + Location: 53,101 + Actor252: brik + Owner: USSR + Location: 53,100 + Actor253: brik + Owner: USSR + Location: 84,104 + Actor254: brik + Owner: USSR + Location: 84,105 + Actor255: brik + Owner: USSR + Location: 85,105 + Actor256: brik + Owner: USSR + Location: 85,104 + Actor257: brik + Owner: USSR + Location: 90,104 + Actor258: brik + Owner: USSR + Location: 89,104 + Actor259: brik + Owner: USSR + Location: 89,105 + Actor260: brik + Owner: USSR + Location: 90,105 + Actor261: brik + Owner: USSR + Location: 90,103 + Actor262: brik + Owner: USSR + Location: 90,102 + Actor263: brik + Owner: USSR + Location: 92,102 + Actor264: brik + Owner: USSR + Location: 91,102 + Actor265: brik + Owner: USSR + Location: 93,102 + Actor268: brik + Owner: USSR + Location: 91,93 + Actor269: brik + Owner: USSR + Location: 91,94 + Actor270: brik + Owner: USSR + Location: 90,94 + Actor271: brik + Owner: USSR + Location: 90,93 + Actor272: brik + Owner: USSR + Location: 90,92 + Actor273: brik + Owner: USSR + Location: 89,92 + Actor274: brik + Owner: USSR + Location: 88,92 + Actor275: brik + Owner: USSR + Location: 87,92 + Actor276: brik + Owner: USSR + Location: 87,91 + Actor277: brik + Owner: USSR + Location: 87,90 + Actor278: brik + Owner: USSR + Location: 86,90 + Actor279: brik + Owner: USSR + Location: 86,91 + Actor281: brik + Owner: USSR + Location: 93,99 + Actor283: brik + Owner: USSR + Location: 93,100 + Actor284: brik + Owner: USSR + Location: 94,102 + Actor285: brik + Owner: USSR + Location: 94,101 + Actor286: brik + Owner: USSR + Location: 94,100 + Actor287: brik + Owner: USSR + Location: 94,99 + Actor325: fact + Owner: USSR + Location: 69,75 + Actor372: brik + Owner: USSR + Location: 65,103 + Actor373: brik + Owner: USSR + Location: 65,104 + Actor374: brik + Owner: USSR + Location: 64,104 + Actor375: brik + Owner: USSR + Location: 64,103 + Actor376: brik + Owner: USSR + Location: 62,104 + Actor377: brik + Owner: USSR + Location: 63,104 + Actor378: brik + Owner: USSR + Location: 61,104 + Actor379: brik + Owner: USSR + Location: 60,104 + Actor380: brik + Owner: USSR + Location: 59,104 + Actor381: brik + Owner: USSR + Location: 58,104 + Actor382: brik + Owner: USSR + Location: 57,104 + Actor383: brik + Owner: USSR + Location: 56,104 + Actor384: brik + Owner: USSR + Location: 56,103 + Actor385: brik + Owner: USSR + Location: 56,102 + Actor386: brik + Owner: USSR + Location: 56,101 + Actor387: brik + Owner: USSR + Location: 57,103 + Actor388: brik + Owner: USSR + Location: 57,101 + Actor389: brik + Owner: USSR + Location: 56,100 + Actor390: brik + Owner: USSR + Location: 57,100 + Actor391: brik + Owner: USSR + Location: 70,103 + Actor392: brik + Owner: USSR + Location: 70,104 + Actor393: brik + Owner: USSR + Location: 69,103 + Actor394: brik + Owner: USSR + Location: 69,104 + Actor395: brik + Owner: USSR + Location: 71,104 + Actor396: brik + Owner: USSR + Location: 72,104 + Actor397: brik + Owner: USSR + Location: 73,104 + Actor398: brik + Owner: USSR + Location: 74,104 + Actor399: brik + Owner: USSR + Location: 75,104 + Actor400: brik + Owner: USSR + Location: 76,104 + Actor401: brik + Owner: USSR + Location: 77,104 + Actor402: brik + Owner: USSR + Location: 78,104 + Actor403: brik + Owner: USSR + Location: 79,104 + Actor404: brik + Owner: USSR + Location: 80,104 + Actor405: brik + Owner: USSR + Location: 81,104 + Actor406: brik + Owner: USSR + Location: 81,103 + Actor407: brik + Owner: USSR + Location: 80,103 + Actor408: brik + Owner: USSR + Location: 81,102 + Actor409: brik + Owner: USSR + Location: 81,101 + Actor410: brik + Owner: USSR + Location: 81,100 + Actor411: brik + Owner: USSR + Location: 82,100 + Actor412: brik + Owner: USSR + Location: 82,99 + Actor413: brik + Owner: USSR + Location: 81,99 + Actor414: ftur + Owner: USSR + Location: 51,97 + Actor415: ftur + Owner: USSR + Location: 51,93 + Actor416: ftur + Owner: USSR + Location: 92,94 + Actor417: ftur + Owner: USSR + Location: 94,98 + Actor418: ftur + Owner: USSR + Location: 69,105 + Actor419: ftur + Owner: USSR + Location: 65,105 + Actor420: ftur + Owner: USSR + Location: 85,106 + Actor421: ftur + Owner: USSR + Location: 89,106 + Actor422: ftur + Owner: USSR + Location: 58,125 + Actor423: ftur + Owner: USSR + Location: 62,129 + Actor424: ftur + Owner: USSR + Location: 74,130 + Actor425: ftur + Owner: USSR + Location: 77,125 + Actor426: fenc + Owner: USSR + Location: 59,124 + Actor427: fenc + Owner: USSR + Location: 59,123 + Actor428: fenc + Owner: USSR + Location: 58,123 + Actor429: fenc + Owner: USSR + Location: 58,124 + Actor430: fenc + Owner: USSR + Location: 58,122 + Actor431: fenc + Owner: USSR + Location: 58,121 + Actor432: fenc + Owner: USSR + Location: 57,121 + Actor433: fenc + Owner: USSR + Location: 57,122 + Actor434: fenc + Owner: USSR + Location: 63,128 + Actor435: fenc + Owner: USSR + Location: 63,129 + Actor436: fenc + Owner: USSR + Location: 64,129 + Actor437: fenc + Owner: USSR + Location: 64,128 + Actor438: fenc + Owner: USSR + Location: 65,129 + Actor439: fenc + Owner: USSR + Location: 66,129 + Actor440: fenc + Owner: USSR + Location: 66,130 + Actor441: fenc + Owner: USSR + Location: 67,130 + Actor442: fenc + Owner: USSR + Location: 68,130 + Actor443: fenc + Owner: USSR + Location: 69,130 + Actor444: fenc + Owner: USSR + Location: 69,131 + Actor445: fenc + Owner: USSR + Location: 70,130 + Actor446: fenc + Owner: USSR + Location: 70,131 + Actor448: fenc + Owner: USSR + Location: 71,130 + Actor447: fenc + Owner: USSR + Location: 72,130 + Actor449: fenc + Owner: USSR + Location: 72,129 + Actor450: fenc + Owner: USSR + Location: 73,129 + Actor451: fenc + Owner: USSR + Location: 73,130 + Actor452: fenc + Owner: USSR + Location: 76,121 + Actor453: fenc + Owner: USSR + Location: 75,121 + Actor454: fenc + Owner: USSR + Location: 75,120 + Actor455: fenc + Owner: USSR + Location: 76,120 + Actor456: fenc + Owner: USSR + Location: 74,121 + Actor457: fenc + Owner: USSR + Location: 74,122 + Actor458: fenc + Owner: USSR + Location: 74,123 + Actor459: fenc + Owner: USSR + Location: 74,124 + Actor460: fenc + Owner: USSR + Location: 75,124 + Actor461: fenc + Owner: USSR + Location: 76,124 + Actor462: fenc + Owner: USSR + Location: 76,125 + Actor463: fenc + Owner: USSR + Location: 75,125 + Actor464: fenc + Owner: USSR + Location: 80,122 + Actor465: fenc + Owner: USSR + Location: 81,122 + Actor466: fenc + Owner: USSR + Location: 81,121 + Actor467: fenc + Owner: USSR + Location: 82,121 + Actor468: fenc + Owner: USSR + Location: 83,121 + Actor469: fenc + Owner: USSR + Location: 79,122 + Actor470: fenc + Owner: USSR + Location: 68,117 + Actor471: fenc + Owner: USSR + Location: 69,117 + Actor472: fenc + Owner: USSR + Location: 68,116 + Actor473: fenc + Owner: USSR + Location: 68,115 + Actor474: fenc + Owner: USSR + Location: 67,115 + Actor475: fenc + Owner: USSR + Location: 71,117 + Actor476: fenc + Owner: USSR + Location: 70,117 + Actor477: fenc + Owner: USSR + Location: 63,116 + Actor478: fenc + Owner: USSR + Location: 62,116 + Actor479: fenc + Owner: USSR + Location: 60,116 + Actor480: fenc + Owner: USSR + Location: 61,116 + Actor481: fenc + Owner: USSR + Location: 60,115 + Actor482: fenc + Owner: USSR + Location: 60,114 + Actor483: fenc + Owner: USSR + Location: 59,114 + Actor484: fenc + Owner: USSR + Location: 74,116 + Actor485: fenc + Owner: USSR + Location: 72,117 + Actor486: fenc + Owner: USSR + Location: 74,117 + Actor487: fenc + Owner: USSR + Location: 73,117 + Actor488: fenc + Owner: USSR + Location: 74,115 + Actor489: fenc + Owner: USSR + Location: 75,115 + Actor490: fenc + Owner: USSR + Location: 77,115 + Actor491: fenc + Owner: USSR + Location: 76,114 + Actor492: fenc + Owner: USSR + Location: 76,115 + Actor493: fenc + Owner: USSR + Location: 76,113 + Actor494: fenc + Owner: USSR + Location: 77,113 + Actor495: fenc + Owner: USSR + Location: 78,113 + Actor496: tsla + Owner: USSR + Location: 63,103 + Actor497: tsla + Owner: USSR + Location: 71,103 + Actor499: tsla + Owner: USSR + Location: 89,103 + Actor500: tsla + Owner: USSR + Location: 84,103 + ScriptTags: HardAndAbove + Actor498: tsla + Owner: USSR + Location: 93,101 + ScriptTags: HardAndAbove + Actor501: tsla + Owner: USSR + Location: 89,93 + Actor502: tsla + Owner: USSR + Location: 53,91 + Actor503: tsla + Owner: USSR + Location: 53,99 + Actor504: sam + Owner: USSR + Location: 58,102 + Actor505: sam + Owner: USSR + Location: 78,102 + Actor506: sam + Owner: USSR + Location: 86,93 + Actor507: sam + Owner: USSR + Location: 90,101 + Actor508: sam + Owner: USSR + Location: 54,90 + Actor510: barr + Owner: USSR + Location: 81,93 + Actor511: proc + Owner: USSR + Location: 82,59 + Actor512: brik + Owner: USSR + Location: 89,61 + Actor513: brik + Owner: USSR + Location: 89,62 + Actor514: brik + Owner: USSR + Location: 89,63 + Actor515: brik + Owner: USSR + Location: 88,63 + Actor516: brik + Owner: USSR + Location: 88,62 + Actor517: brik + Owner: USSR + Location: 90,61 + Actor518: brik + Owner: USSR + Location: 91,61 + Actor519: brik + Owner: USSR + Location: 90,60 + Actor520: brik + Owner: USSR + Location: 91,60 + Actor521: brik + Owner: USSR + Location: 81,70 + Actor522: brik + Owner: USSR + Location: 83,70 + Actor523: brik + Owner: USSR + Location: 82,70 + Actor524: brik + Owner: USSR + Location: 85,70 + Actor525: brik + Owner: USSR + Location: 84,70 + Actor526: brik + Owner: USSR + Location: 86,70 + Actor527: brik + Owner: USSR + Location: 86,68 + Actor528: brik + Owner: USSR + Location: 86,69 + Actor529: brik + Owner: USSR + Location: 81,69 + Actor530: brik + Owner: USSR + Location: 82,69 + Actor531: brik + Owner: USSR + Location: 86,67 + Actor532: brik + Owner: USSR + Location: 85,67 + Actor533: brik + Owner: USSR + Location: 85,68 + Actor534: brik + Owner: USSR + Location: 57,64 + Actor535: brik + Owner: USSR + Location: 57,63 + Actor536: brik + Owner: USSR + Location: 57,62 + Actor537: brik + Owner: USSR + Location: 58,64 + Actor538: brik + Owner: USSR + Location: 58,63 + Actor539: brik + Owner: USSR + Location: 59,68 + Actor540: brik + Owner: USSR + Location: 59,69 + Actor541: brik + Owner: USSR + Location: 60,68 + Actor542: brik + Owner: USSR + Location: 60,69 + Actor543: brik + Owner: USSR + Location: 59,70 + Actor544: brik + Owner: USSR + Location: 59,71 + Actor545: brik + Owner: USSR + Location: 61,71 + Actor546: brik + Owner: USSR + Location: 60,71 + Actor547: brik + Owner: USSR + Location: 62,71 + Actor548: brik + Owner: USSR + Location: 62,72 + Actor549: brik + Owner: USSR + Location: 62,73 + Actor550: brik + Owner: USSR + Location: 63,73 + Actor551: brik + Owner: USSR + Location: 63,74 + Actor552: brik + Owner: USSR + Location: 63,75 + Actor553: brik + Owner: USSR + Location: 64,75 + Actor554: brik + Owner: USSR + Location: 64,74 + Actor555: brik + Owner: USSR + Location: 58,62 + Actor556: brik + Owner: USSR + Location: 58,61 + Actor557: brik + Owner: USSR + Location: 59,61 + Actor558: brik + Owner: USSR + Location: 59,60 + Actor559: brik + Owner: USSR + Location: 59,59 + Actor560: brik + Owner: USSR + Location: 59,58 + Actor561: brik + Owner: USSR + Location: 59,57 + Actor562: brik + Owner: USSR + Location: 60,57 + Actor563: brik + Owner: USSR + Location: 60,58 + Actor564: brik + Owner: USSR + Location: 55,27 + Actor565: brik + Owner: USSR + Location: 55,28 + Actor566: brik + Owner: USSR + Location: 56,28 + Actor567: brik + Owner: USSR + Location: 56,27 + Actor568: brik + Owner: USSR + Location: 57,34 + Actor569: brik + Owner: USSR + Location: 56,34 + Actor570: brik + Owner: USSR + Location: 56,33 + Actor571: brik + Owner: USSR + Location: 57,33 + Actor572: brik + Owner: USSR + Location: 58,34 + Actor573: brik + Owner: USSR + Location: 58,35 + Actor574: brik + Owner: USSR + Location: 58,36 + Actor575: brik + Owner: USSR + Location: 59,36 + Actor576: brik + Owner: USSR + Location: 59,37 + Actor577: brik + Owner: USSR + Location: 59,38 + Actor578: brik + Owner: USSR + Location: 60,38 + Actor579: brik + Owner: USSR + Location: 60,37 + Actor580: brik + Owner: USSR + Location: 56,26 + Actor581: brik + Owner: USSR + Location: 57,26 + Actor582: brik + Owner: USSR + Location: 57,25 + Actor583: brik + Owner: USSR + Location: 57,24 + Actor584: brik + Owner: USSR + Location: 58,24 + Actor585: brik + Owner: USSR + Location: 58,23 + Actor586: brik + Owner: USSR + Location: 58,22 + Actor587: brik + Owner: USSR + Location: 58,21 + Actor588: brik + Owner: USSR + Location: 59,21 + Actor589: brik + Owner: USSR + Location: 59,22 + Actor590: brik + Owner: USSR + Location: 80,36 + Actor591: brik + Owner: USSR + Location: 80,35 + Actor592: brik + Owner: USSR + Location: 81,36 + Actor593: brik + Owner: USSR + Location: 81,35 + Actor594: brik + Owner: USSR + Location: 90,34 + Actor595: brik + Owner: USSR + Location: 90,35 + Actor596: brik + Owner: USSR + Location: 89,35 + Actor597: brik + Owner: USSR + Location: 89,34 + Actor598: brik + Owner: USSR + Location: 88,35 + Actor599: brik + Owner: USSR + Location: 87,35 + Actor600: brik + Owner: USSR + Location: 86,35 + Actor601: brik + Owner: USSR + Location: 86,34 + Actor602: brik + Owner: USSR + Location: 87,34 + Actor603: brik + Owner: USSR + Location: 82,36 + Actor604: brik + Owner: USSR + Location: 83,36 + Actor605: brik + Owner: USSR + Location: 83,35 + Actor606: brik + Owner: USSR + Location: 84,35 + Actor607: brik + Owner: USSR + Location: 85,35 + Actor608: brik + Owner: USSR + Location: 86,42 + Actor609: brik + Owner: USSR + Location: 86,43 + Actor610: brik + Owner: USSR + Location: 85,42 + Actor611: brik + Owner: USSR + Location: 84,42 + Actor612: brik + Owner: USSR + Location: 84,43 + Actor614: brik + Owner: USSR + Location: 83,43 + Actor615: brik + Owner: USSR + Location: 83,42 + Actor613: brik + Owner: USSR + Location: 86,44 + Actor616: brik + Owner: USSR + Location: 86,45 + Actor617: brik + Owner: USSR + Location: 86,46 + Actor618: brik + Owner: USSR + Location: 86,47 + Actor619: brik + Owner: USSR + Location: 86,48 + Actor620: brik + Owner: USSR + Location: 86,49 + Actor621: brik + Owner: USSR + Location: 85,49 + Actor622: brik + Owner: USSR + Location: 85,48 + Actor623: brik + Owner: USSR + Location: 78,41 + Actor624: brik + Owner: USSR + Location: 78,42 + Actor625: brik + Owner: USSR + Location: 79,42 + Actor626: brik + Owner: USSR + Location: 79,41 + Actor627: brik + Owner: USSR + Location: 93,20 + Actor628: brik + Owner: USSR + Location: 94,20 + Actor629: brik + Owner: USSR + Location: 93,19 + Actor630: brik + Owner: USSR + Location: 94,19 + Actor631: brik + Owner: USSR + Location: 94,18 + Actor632: brik + Owner: USSR + Location: 94,17 + Actor633: brik + Owner: USSR + Location: 94,16 + Actor634: brik + Owner: USSR + Location: 94,15 + Actor635: brik + Owner: USSR + Location: 93,15 + Actor636: brik + Owner: USSR + Location: 93,16 + Actor637: brik + Owner: USSR + Location: 90,12 + Actor638: brik + Owner: USSR + Location: 90,9 + Actor639: brik + Owner: USSR + Location: 90,8 + Actor640: brik + Owner: USSR + Location: 90,11 + Actor641: brik + Owner: USSR + Location: 90,10 + Actor642: brik + Owner: USSR + Location: 89,12 + Actor643: brik + Owner: USSR + Location: 89,11 + Actor644: brik + Owner: USSR + Location: 89,8 + Actor645: brik + Owner: USSR + Location: 89,9 + Actor646: brik + Owner: USSR + Location: 89,7 + Actor647: brik + Owner: USSR + Location: 89,6 + Actor648: brik + Owner: USSR + Location: 89,5 + Actor654: proc + Owner: USSR + Location: 59,24 + Actor655: tsla + Owner: USSR + Location: 73,103 + ScriptTags: HardAndAbove + Actor656: tsla + Owner: USSR + Location: 61,103 + ScriptTags: HardAndAbove + Actor657: tsla + Owner: USSR + Location: 57,27 + Actor658: tsla + Owner: USSR + Location: 58,33 + Actor659: tsla + Owner: USSR + Location: 82,35 + Actor660: tsla + Owner: USSR + Location: 88,34 + Actor661: tsla + Owner: USSR + Location: 93,17 + Actor662: tsla + Owner: USSR + Location: 89,10 + Actor663: tsla + Owner: USSR + Location: 85,43 + Actor664: tsla + Owner: USSR + Location: 59,62 + Actor665: tsla + Owner: USSR + Location: 60,70 + Actor666: tsla + Owner: USSR + Location: 85,69 + Actor667: tsla + Owner: USSR + Location: 88,61 + Actor669: npwr + Owner: USSR + Location: 52,5 + Actor670: npwr + Owner: USSR + Location: 57,5 + Actor671: tpwr + Owner: USSR + Location: 66,56 + Actor672: tpwr + Owner: USSR + Location: 66,53 + Actor673: tpwr + Owner: USSR + Location: 66,50 + Actor674: tpwr + Owner: USSR + Location: 68,17 + Actor675: tpwr + Owner: USSR + Location: 68,14 + Actor676: tpwr + Owner: USSR + Location: 68,11 + Actor677: tpwr + Owner: USSR + Location: 72,64 + Actor678: tpwr + Owner: USSR + Location: 72,61 + Actor679: tpwr + Owner: USSR + Location: 72,58 + Actor681: indp + Owner: USSR + Location: 66,28 + Actor682: mslo + Owner: USSR + Location: 79,54 + Actor683: sam + Owner: USSR + Location: 81,67 + Actor686: sam + Owner: USSR + Location: 47,53 + Actor693: sam + Owner: USSR + Location: 63,72 + Actor694: sam + Owner: USSR + Location: 76,75 + Actor695: sam + Owner: USSR + Location: 59,56 + Actor696: sam + Owner: USSR + Location: 59,45 + Actor697: sam + Owner: USSR + Location: 75,35 + Actor698: sam + Owner: USSR + Location: 60,36 + Actor699: sam + Owner: USSR + Location: 59,23 + Actor700: sam + Owner: USSR + Location: 72,18 + Actor701: sam + Owner: USSR + Location: 52,9 + Actor702: sam + Owner: USSR + Location: 59,9 + Actor703: ftur + Owner: USSR + Location: 76,54 + Actor704: silo + Owner: USSR + Location: 82,59 + Actor705: silo + Owner: USSR + Location: 84,59 + Actor706: silo + Owner: USSR + Location: 61,24 + Actor707: silo + Owner: USSR + Location: 59,24 + Actor711: afld + Owner: USSR + Location: 77,28 + Actor712: afld + Owner: USSR + Location: 77,25 + Actor713: fix + Owner: USSR + Location: 82,26 + Actor714: afld + Owner: USSR + Location: 83,30 + Actor715: afld + Owner: USSR + Location: 81,23 + Actor716: iron + Owner: USSR + Location: 77,12 + Actor719: barr + Owner: USSR + Location: 72,45 + Actor721: fenc + Owner: USSR + Location: 78,53 + Actor722: fenc + Owner: USSR + Location: 80,53 + Actor723: fenc + Owner: USSR + Location: 79,53 + Actor724: fenc + Owner: USSR + Location: 81,53 + Actor725: fenc + Owner: USSR + Location: 81,54 + Actor726: fenc + Owner: USSR + Location: 78,54 + Actor727: fenc + Owner: USSR + Location: 78,55 + Actor728: fenc + Owner: USSR + Location: 81,55 + Actor729: fenc + Owner: USSR + Location: 80,55 + Actor730: fenc + Owner: USSR + Location: 79,55 + Actor731: fenc + Owner: USSR + Location: 92,55 + Actor732: fenc + Owner: USSR + Location: 91,55 + Actor733: fenc + Owner: USSR + Location: 90,55 + Actor734: fenc + Owner: USSR + Location: 89,55 + Actor735: fenc + Owner: USSR + Location: 88,55 + Actor736: fenc + Owner: USSR + Location: 87,55 + Actor737: fenc + Owner: USSR + Location: 87,54 + Actor738: fenc + Owner: USSR + Location: 43,51 + Actor739: fenc + Owner: USSR + Location: 43,52 + Actor740: fenc + Owner: USSR + Location: 44,52 + Actor741: fenc + Owner: USSR + Location: 44,53 + Actor742: fenc + Owner: USSR + Location: 44,54 + Actor743: fenc + Owner: USSR + Location: 45,54 + Actor744: fenc + Owner: USSR + Location: 45,55 + Actor745: fenc + Owner: USSR + Location: 47,56 + Actor746: fenc + Owner: USSR + Location: 47,55 + Actor747: fenc + Owner: USSR + Location: 48,56 + Actor748: ftur + Owner: USSR + Location: 42,38 + Actor749: ftur + Owner: USSR + Location: 43,43 + Actor750: ftur + Owner: USSR + Location: 40,12 + Actor751: ftur + Owner: USSR + Location: 44,9 + Actor752: fenc + Owner: USSR + Location: 39,11 + Actor753: fenc + Owner: USSR + Location: 39,12 + Actor754: fenc + Owner: USSR + Location: 39,13 + Actor755: fenc + Owner: USSR + Location: 40,11 + Actor756: fenc + Owner: USSR + Location: 41,11 + Actor757: fenc + Owner: USSR + Location: 41,12 + Actor758: fenc + Owner: USSR + Location: 43,9 + Actor759: fenc + Owner: USSR + Location: 43,8 + Actor760: fenc + Owner: USSR + Location: 44,8 + Actor761: fenc + Owner: USSR + Location: 41,37 + Actor762: fenc + Owner: USSR + Location: 41,38 + Actor763: fenc + Owner: USSR + Location: 41,39 + Actor764: fenc + Owner: USSR + Location: 42,39 + Actor765: fenc + Owner: USSR + Location: 43,42 + Actor766: fenc + Owner: USSR + Location: 42,42 + Actor767: fenc + Owner: USSR + Location: 42,43 + Actor768: fenc + Owner: USSR + Location: 42,44 + Actor769: fenc + Owner: USSR + Location: 43,44 + Actor770: fenc + Owner: USSR + Location: 43,45 + Actor771: fenc + Owner: USSR + Location: 44,45 + Actor772: fenc + Owner: USSR + Location: 41,36 + Actor773: ftur + Owner: USSR + Location: 87,68 + Actor774: ftur + Owner: USSR + Location: 89,64 + Actor775: ftur + Owner: USSR + Location: 56,64 + Actor776: ftur + Owner: USSR + Location: 58,69 + Actor777: ftur + Owner: USSR + Location: 83,41 + Actor778: ftur + Owner: USSR + Location: 94,14 + Actor779: ftur + Owner: USSR + Location: 91,11 + Actor780: ftur + Owner: USSR + Location: 54,28 + Actor781: ftur + Owner: USSR + Location: 55,33 + Actor782: powr + Owner: USSR + Location: 67,95 + Actor783: powr + Owner: USSR + Location: 65,95 + Actor784: fix + Owner: USSR + Location: 67,91 + Actor785: apwr + Owner: USSR + Location: 72,91 + Actor786: afld + Owner: USSR + Location: 66,88 + Actor787: afld + Owner: USSR + Location: 71,87 + Actor788: kenn + Owner: USSR + Location: 71,96 + Actor789: sam + Owner: USSR + Location: 64,86 + Actor790: sam + Owner: USSR + Location: 66,60 + Actor791: sam + Owner: USSR + Location: 73,50 + Actor792: brik + Owner: USSR + Location: 50,3 + Actor793: brik + Owner: USSR + Location: 51,3 + Actor794: brik + Owner: USSR + Location: 54,3 + Actor795: brik + Owner: USSR + Location: 52,3 + Actor796: brik + Owner: USSR + Location: 53,3 + Actor797: brik + Owner: USSR + Location: 55,3 + Actor798: brik + Owner: USSR + Location: 56,3 + Actor799: brik + Owner: USSR + Location: 57,3 + Actor800: brik + Owner: USSR + Location: 58,3 + Actor801: brik + Owner: USSR + Location: 59,3 + Actor802: brik + Owner: USSR + Location: 60,3 + Actor803: brik + Owner: USSR + Location: 61,3 + Actor804: brik + Owner: USSR + Location: 62,3 + Actor805: brik + Owner: USSR + Location: 50,4 + Actor806: brik + Owner: USSR + Location: 50,5 + Actor807: brik + Owner: USSR + Location: 50,6 + Actor808: brik + Owner: USSR + Location: 50,7 + Actor809: brik + Owner: USSR + Location: 50,8 + Actor810: brik + Owner: USSR + Location: 62,8 + Actor811: brik + Owner: USSR + Location: 62,7 + Actor812: brik + Owner: USSR + Location: 62,6 + Actor813: brik + Owner: USSR + Location: 62,4 + Actor814: brik + Owner: USSR + Location: 62,5 + Actor816: brik + Owner: USSR + Location: 51,9 + Actor817: brik + Owner: USSR + Location: 50,9 + Actor818: brik + Owner: USSR + Location: 61,9 + Actor820: brik + Owner: USSR + Location: 62,9 + Actor821: chain + Owner: USSR + Location: 52,8 + Actor822: chain + Owner: USSR + Location: 53,8 + Actor823: chain + Owner: USSR + Location: 54,8 + Actor824: chain + Owner: USSR + Location: 58,8 + Actor825: chain + Owner: USSR + Location: 59,8 + Actor826: chain + Owner: USSR + Location: 60,8 + Actor827: chain + Owner: USSR + Location: 57,8 + Actor828: chain + Owner: USSR + Location: 55,8 + Actor829: chain + Owner: USSR + Location: 56,4 + Actor830: chain + Owner: USSR + Location: 56,5 + Actor831: chain + Owner: USSR + Location: 56,6 + Actor832: chain + Owner: USSR + Location: 56,7 + Actor833: chain + Owner: USSR + Location: 56,8 + Actor834: chain + Owner: USSR + Location: 51,7 + Actor835: chain + Owner: USSR + Location: 51,6 + Actor836: chain + Owner: USSR + Location: 51,5 + Actor837: chain + Owner: USSR + Location: 51,4 + Actor838: chain + Owner: USSR + Location: 61,4 + Actor839: chain + Owner: USSR + Location: 61,5 + Actor840: chain + Owner: USSR + Location: 61,6 + Actor841: chain + Owner: USSR + Location: 61,7 + Actor815: chain + Owner: USSR + Location: 61,8 + Actor819: chain + Owner: USSR + Location: 51,8 + Actor842: brik + Owner: USSR + Location: 51,10 + Actor843: brik + Owner: USSR + Location: 50,10 + Actor844: brik + Owner: USSR + Location: 61,10 + Actor845: brik + Owner: USSR + Location: 62,10 + Actor326: fact + Owner: USSR + Location: 62,16 + Actor846: split2 + Owner: Neutral + Location: 96,9 + Actor847: split2 + Owner: Neutral + Location: 99,4 + Actor848: split2 + Owner: Neutral + Location: 49,17 + Actor849: split2 + Owner: Neutral + Location: 53,18 + Actor850: split2 + Owner: Neutral + Location: 50,24 + Actor851: split3 + Owner: Neutral + Location: 50,61 + Actor852: split3 + Owner: Neutral + Location: 46,60 + Actor863: split2 + Owner: Neutral + Location: 97,66 + Actor864: split2 + Owner: Neutral + Location: 103,62 + Actor865: sbag + Owner: England + Location: 104,113 + Actor866: sbag + Owner: England + Location: 104,112 + Actor867: sbag + Owner: England + Location: 104,111 + Actor868: sbag + Owner: England + Location: 104,110 + Actor869: sbag + Owner: England + Location: 105,110 + Actor870: sbag + Owner: England + Location: 106,110 + Actor871: sbag + Owner: England + Location: 109,107 + Actor872: sbag + Owner: England + Location: 109,106 + Actor873: sbag + Owner: England + Location: 109,105 + Actor874: sbag + Owner: England + Location: 109,104 + Actor875: sbag + Owner: England + Location: 109,103 + Actor876: sbag + Owner: England + Location: 110,103 + Actor877: sbag + Owner: England + Location: 111,103 + Actor878: sbag + Owner: England + Location: 110,107 + Actor879: sbag + Owner: England + Location: 103,113 + Actor880: sbag + Owner: England + Location: 103,114 + Actor881: sbag + Owner: England + Location: 103,115 + Actor882: sbag + Owner: England + Location: 102,115 + Actor883: sbag + Owner: England + Location: 102,116 + Actor884: agun + Owner: England + Location: 104,114 + TurretFacing: 88 + Actor885: agun + Owner: England + Location: 110,105 + TurretFacing: 156 + Actor886: powr + Owner: England + Location: 117,107 + Actor887: powr + Owner: England + Location: 119,107 + Actor888: tent + Owner: England + Location: 115,111 + Actor889: gun.nod + Owner: England + Location: 103,112 + TurretFacing: 192 + Health: 73 + Actor890: gun.nod + Owner: England + Location: 108,106 + TurretFacing: 192 + Health: 62 + Actor891: pbox + Owner: England + Location: 104,109 + Health: 64 + Actor892: sbag + Owner: England + Location: 41,117 + Actor893: sbag + Owner: England + Location: 41,115 + Actor894: sbag + Owner: England + Location: 41,116 + Actor895: sbag + Owner: England + Location: 41,114 + Actor896: sbag + Owner: England + Location: 41,113 + Actor897: sbag + Owner: England + Location: 41,112 + Actor898: sbag + Owner: England + Location: 40,112 + Actor899: sbag + Owner: England + Location: 39,112 + Actor900: sbag + Owner: England + Location: 39,111 + Actor901: sbag + Owner: England + Location: 39,105 + Actor902: sbag + Owner: England + Location: 39,104 + Actor903: sbag + Owner: England + Location: 39,103 + Actor904: sbag + Owner: England + Location: 35,102 + Actor905: sbag + Owner: England + Location: 36,102 + Actor906: sbag + Owner: England + Location: 38,102 + Actor907: sbag + Owner: England + Location: 39,102 + Actor908: sbag + Owner: England + Location: 37,102 + Actor910: agun + Owner: England + Location: 37,104 + TurretFacing: 832 + Actor911: agun + Owner: England + Location: 40,114 + Actor909: gun + Owner: England + Location: 41,111 + TurretFacing: 791 + Health: 76 + Actor912: gun + Owner: England + Location: 40,104 + TurretFacing: 777 + Health: 79 + Actor913: pbox + Owner: England + Location: 40,103 + Health: 64 + Actor914: powr + Owner: England + Location: 28,107 + Actor915: powr + Owner: England + Location: 30,107 + Actor916: tent + Owner: England + Location: 35,113 + Actor918: gun + Owner: England + Location: 31,54 + TurretFacing: 736 + Actor919: sbag + Owner: England + Location: 32,53 + Actor920: sbag + Owner: England + Location: 32,54 + Actor921: sbag + Owner: England + Location: 32,55 + Actor922: sbag + Owner: England + Location: 108,39 + Actor923: sbag + Owner: England + Location: 108,37 + Actor924: sbag + Owner: England + Location: 108,38 + Actor925: sbag + Owner: England + Location: 108,36 + Actor926: sbag + Owner: England + Location: 109,36 + Actor927: gun + Owner: England + Location: 107,37 + TurretFacing: 192 + Health: 62 + Actor928: apwr + Owner: England + Location: 111,41 + Health: 32 + Actor929: apwr + Owner: England + Location: 111,44 + Health: 33 + Actor931: powr + Owner: England + Location: 22,48 + Health: 36 + Actor932: powr + Owner: England + Location: 20,47 + Health: 54 + Actor933: proc + Owner: England + Location: 11,71 + Health: 41 + Actor934: proc + Owner: England + Location: 128,76 + Health: 38 + Actor936: 3tnk + Owner: USSR + Location: 108,47 + Facing: 913 + Actor937: 3tnk + Owner: USSR + Location: 110,35 + Facing: 384 + Actor938: 3tnk + Owner: USSR + Facing: 384 + Location: 24,45 + Actor939: 3tnk + Owner: USSR + Location: 16,75 + Facing: 245 + Actor940: e1 + Owner: USSR + Location: 125,74 + SubCell: 3 + Facing: 566 + Actor941: e1 + Owner: USSR + Facing: 384 + Location: 131,74 + SubCell: 3 + Actor942: e1 + Owner: USSR + Facing: 384 + Location: 124,79 + SubCell: 3 + Actor943: e1 + Owner: USSR + Facing: 384 + Location: 112,47 + SubCell: 3 + Actor944: e1 + Owner: USSR + Facing: 384 + Location: 112,35 + SubCell: 3 + Actor945: e1 + Owner: USSR + Facing: 384 + Location: 108,33 + SubCell: 3 + Actor946: e1 + Owner: USSR + Facing: 384 + Location: 34,53 + SubCell: 3 + Actor947: e1 + Owner: USSR + Facing: 384 + Location: 36,50 + SubCell: 3 + Actor948: e1 + Owner: USSR + Facing: 384 + Location: 26,46 + SubCell: 3 + Actor949: e4 + Owner: USSR + Facing: 384 + Location: 25,47 + SubCell: 3 + Actor950: e4 + Owner: USSR + Facing: 384 + Location: 115,39 + SubCell: 3 + Actor951: e4 + Owner: USSR + Facing: 384 + Location: 129,73 + SubCell: 3 + Actor952: e4 + Owner: USSR + Facing: 384 + Location: 16,71 + SubCell: 3 + Actor953: e2 + Owner: USSR + Facing: 384 + Location: 15,70 + SubCell: 3 + Actor954: e2 + Owner: USSR + Facing: 384 + Location: 12,70 + SubCell: 3 + Actor955: e2 + Owner: USSR + Facing: 384 + Location: 104,39 + SubCell: 3 + Actor956: e2 + Owner: USSR + Facing: 384 + Location: 102,36 + SubCell: 3 + Actor957: e2 + Owner: USSR + Facing: 384 + Location: 105,35 + SubCell: 3 + Actor958: e2 + Owner: USSR + Facing: 384 + Location: 45,100 + SubCell: 3 + Actor959: e2 + Owner: USSR + Location: 43,100 + SubCell: 3 + Facing: 384 + Actor960: e2 + Owner: USSR + Location: 97,107 + SubCell: 3 + Facing: 538 + Actor961: e2 + Owner: USSR + Location: 104,100 + SubCell: 3 + Facing: 606 + Actor962: 3tnk + Owner: USSR + Location: 102,104 + Facing: 613 + Actor963: 3tnk + Owner: USSR + Location: 44,101 + Facing: 384 + Actor964: e1 + Owner: USSR + Facing: 384 + Location: 59,125 + SubCell: 3 + Actor965: e1 + Owner: USSR + Facing: 384 + Location: 62,128 + SubCell: 3 + Actor966: e1 + Owner: USSR + Location: 67,128 + SubCell: 3 + Facing: 518 + Actor967: e1 + Owner: USSR + Location: 74,125 + SubCell: 3 + Facing: 634 + Actor968: e1 + Owner: USSR + Location: 76,126 + SubCell: 3 + Facing: 566 + Actor969: e1 + Owner: USSR + Facing: 384 + Location: 51,98 + SubCell: 3 + Actor970: e1 + Owner: USSR + Facing: 384 + Location: 50,93 + SubCell: 3 + Actor971: e1 + Owner: USSR + Facing: 384 + Location: 58,70 + SubCell: 3 + Actor972: e1 + Owner: USSR + Facing: 384 + Location: 57,65 + SubCell: 3 + Actor974: e1 + Owner: USSR + Facing: 384 + Location: 44,42 + SubCell: 3 + Actor975: e1 + Owner: USSR + Facing: 384 + Location: 40,39 + SubCell: 3 + Actor976: e1 + Owner: USSR + Facing: 384 + Location: 38,37 + SubCell: 3 + Actor977: e1 + Owner: USSR + Facing: 384 + Location: 41,44 + SubCell: 3 + Actor978: e1 + Owner: USSR + Facing: 384 + Location: 42,45 + SubCell: 3 + Actor979: e1 + Owner: USSR + Facing: 384 + Location: 55,34 + SubCell: 3 + Actor980: e1 + Owner: USSR + Facing: 384 + Location: 53,28 + SubCell: 3 + Actor981: e1 + Owner: USSR + Facing: 384 + Location: 64,30 + SubCell: 3 + Actor982: e1 + Owner: USSR + Facing: 384 + Location: 60,35 + SubCell: 3 + Actor983: e1 + Owner: USSR + Facing: 384 + Location: 62,39 + SubCell: 3 + Actor984: e1 + Owner: USSR + Facing: 384 + Location: 58,46 + SubCell: 3 + Actor985: e1 + Owner: USSR + Facing: 384 + Location: 68,48 + SubCell: 3 + Actor986: e1 + Owner: USSR + Facing: 384 + Location: 61,17 + SubCell: 3 + Actor987: e1 + Owner: USSR + Facing: 384 + Location: 60,18 + SubCell: 3 + Actor988: e1 + Owner: USSR + Facing: 384 + Location: 55,11 + SubCell: 3 + Actor989: e1 + Owner: USSR + Facing: 384 + Location: 53,11 + SubCell: 3 + Actor990: e1 + Owner: USSR + Facing: 384 + Location: 60,12 + SubCell: 3 + Actor991: e1 + Owner: USSR + Facing: 384 + Location: 61,13 + SubCell: 3 + Actor992: e1 + Owner: USSR + Facing: 384 + Location: 55,10 + SubCell: 3 + Actor993: e1 + Owner: USSR + Facing: 384 + Location: 55,11 + SubCell: 1 + Actor994: e1 + Owner: USSR + Facing: 384 + Location: 43,7 + SubCell: 3 + Actor995: e1 + Owner: USSR + Facing: 384 + Location: 40,10 + SubCell: 3 + Actor997: e1 + Owner: USSR + Facing: 384 + Location: 39,30 + SubCell: 3 + Actor998: e1 + Owner: USSR + Facing: 384 + Location: 54,41 + SubCell: 3 + Actor999: e1 + Owner: USSR + Facing: 384 + Location: 68,78 + SubCell: 3 + Actor1000: e1 + Owner: USSR + Facing: 384 + Location: 67,76 + SubCell: 3 + Actor1001: e1 + Owner: USSR + Facing: 384 + Location: 61,63 + SubCell: 3 + Actor1002: e1 + Owner: USSR + Facing: 384 + Location: 69,98 + SubCell: 3 + Actor1003: e1 + Owner: USSR + Facing: 384 + Location: 64,105 + SubCell: 3 + Actor1004: e1 + Owner: USSR + Facing: 384 + Location: 65,107 + SubCell: 3 + Actor1005: e1 + Owner: USSR + Facing: 384 + Location: 69,107 + SubCell: 3 + Actor1006: e1 + Owner: USSR + Facing: 384 + Location: 62,106 + SubCell: 3 + Actor1007: e1 + Owner: USSR + Location: 85,107 + SubCell: 3 + Facing: 661 + Actor1008: e1 + Owner: USSR + SubCell: 3 + Facing: 661 + Location: 90,106 + Actor1009: e1 + Owner: USSR + SubCell: 3 + Facing: 661 + Location: 87,69 + Actor1010: e1 + Owner: USSR + SubCell: 3 + Facing: 661 + Location: 90,65 + Actor1011: e1 + Owner: USSR + SubCell: 3 + Facing: 661 + Location: 84,65 + Actor1012: e1 + Owner: USSR + SubCell: 3 + Facing: 661 + Location: 91,58 + Actor1013: e1 + Owner: USSR + SubCell: 3 + Facing: 661 + Location: 90,44 + Actor1014: e1 + Owner: USSR + SubCell: 3 + Facing: 661 + Location: 95,15 + Actor1015: e1 + Owner: USSR + SubCell: 3 + Facing: 661 + Location: 72,21 + Actor1016: e1 + Owner: USSR + SubCell: 3 + Facing: 661 + Location: 70,9 + Actor1017: e1 + Owner: USSR + SubCell: 3 + Facing: 661 + Location: 79,23 + Actor1018: e1 + Owner: USSR + SubCell: 3 + Facing: 661 + Location: 83,20 + Actor1019: e1 + Owner: USSR + SubCell: 3 + Facing: 661 + Location: 76,46 + Actor1020: e1 + Owner: USSR + SubCell: 3 + Facing: 661 + Location: 75,43 + Actor1021: e1 + Owner: USSR + SubCell: 3 + Facing: 661 + Location: 78,33 + Actor1022: e1 + Owner: USSR + SubCell: 3 + Facing: 661 + Location: 71,35 + Actor1023: e1 + Owner: USSR + SubCell: 3 + Facing: 661 + Location: 84,51 + Actor1024: e1 + Owner: USSR + SubCell: 3 + Facing: 661 + Location: 86,60 + Actor1025: e1 + Owner: USSR + SubCell: 3 + Facing: 661 + Location: 76,63 + Actor1026: e1 + Owner: USSR + SubCell: 3 + Facing: 661 + Location: 75,65 + Actor1027: e1 + Owner: USSR + SubCell: 3 + Facing: 661 + Location: 73,67 + Actor1028: e1 + Owner: USSR + SubCell: 3 + Facing: 661 + Location: 70,79 + Actor1029: e1 + Owner: USSR + SubCell: 3 + Facing: 661 + Location: 75,78 + Actor1030: e1 + Owner: USSR + SubCell: 3 + Facing: 661 + Location: 84,90 + Actor1031: e1 + Owner: USSR + SubCell: 3 + Facing: 661 + Location: 86,95 + Actor1032: e1 + Owner: USSR + SubCell: 3 + Location: 93,93 + Facing: 913 + Actor1033: e1 + Owner: USSR + SubCell: 3 + Facing: 913 + Location: 94,97 + Actor1034: e1 + Owner: USSR + SubCell: 3 + Facing: 913 + Location: 85,41 + Actor1035: e1 + Owner: USSR + SubCell: 3 + Facing: 913 + Location: 93,31 + Actor1036: e1 + Owner: USSR + SubCell: 3 + Facing: 913 + Location: 89,13 + Actor1037: e1 + Owner: USSR + SubCell: 3 + Facing: 913 + Location: 86,28 + Actor1038: e1 + Owner: USSR + SubCell: 3 + Facing: 913 + Location: 69,74 + Actor1039: e1 + Owner: USSR + SubCell: 3 + Facing: 913 + Location: 86,80 + Actor1040: e3 + Owner: USSR + Facing: 384 + Location: 64,102 + SubCell: 3 + Actor1041: e3 + Owner: USSR + Facing: 384 + Location: 75,103 + SubCell: 3 + Actor1042: e3 + Owner: USSR + Facing: 384 + Location: 54,84 + SubCell: 3 + Actor1043: e3 + Owner: USSR + Facing: 384 + Location: 54,92 + SubCell: 3 + Actor1044: e3 + Owner: USSR + Facing: 384 + Location: 51,92 + SubCell: 3 + Actor1045: e3 + Owner: USSR + Facing: 384 + Location: 60,67 + SubCell: 3 + Actor1046: e3 + Owner: USSR + Facing: 384 + Location: 61,37 + SubCell: 3 + Actor1047: e3 + Owner: USSR + Facing: 384 + Location: 54,35 + SubCell: 3 + Actor1048: e3 + Owner: USSR + Facing: 384 + Location: 44,44 + SubCell: 3 + Actor1049: e3 + Owner: USSR + Facing: 384 + Location: 38,31 + SubCell: 3 + Actor1051: e3 + Owner: USSR + Facing: 384 + Location: 45,10 + SubCell: 3 + Actor1053: e3 + Owner: USSR + Facing: 384 + Location: 56,11 + SubCell: 3 + Actor1054: e3 + Owner: USSR + Facing: 384 + Location: 76,45 + SubCell: 3 + Actor1055: e3 + Owner: USSR + Facing: 384 + Location: 65,49 + SubCell: 3 + Actor1056: e3 + Owner: USSR + Facing: 384 + Location: 60,51 + SubCell: 3 + Actor1057: e3 + Owner: USSR + Facing: 384 + Location: 75,68 + SubCell: 3 + Actor1058: e3 + Owner: USSR + Facing: 384 + Location: 88,58 + SubCell: 3 + Actor1059: e3 + Owner: USSR + Facing: 384 + Location: 79,78 + SubCell: 3 + Actor1060: e3 + Owner: USSR + Facing: 384 + Location: 91,77 + SubCell: 3 + Actor1061: e3 + Owner: USSR + Facing: 384 + Location: 85,88 + SubCell: 3 + Actor1062: e3 + Owner: USSR + Facing: 384 + Location: 88,103 + SubCell: 3 + Actor1063: e3 + Owner: USSR + Facing: 384 + Location: 80,98 + SubCell: 3 + Actor1064: e3 + Owner: USSR + Facing: 384 + Location: 73,94 + SubCell: 3 + Actor1065: e3 + Owner: USSR + Facing: 384 + Location: 66,85 + SubCell: 3 + Actor1066: e3 + Owner: USSR + Facing: 384 + Location: 57,83 + SubCell: 3 + Actor1067: ttrp + Owner: USSR + Facing: 384 + Location: 69,62 + SubCell: 3 + Actor1068: ttrp + Owner: USSR + Location: 72,55 + SubCell: 3 + Facing: 518 + Actor1069: ttrp + Owner: USSR + Location: 73,53 + SubCell: 3 + Facing: 729 + Actor1070: cmsr + Owner: USSR + Facing: 384 + Location: 71,49 + SubCell: 3 + Actor1071: cmsr + Owner: USSR + Facing: 384 + Location: 73,34 + SubCell: 3 + Actor1074: oilb + Owner: USSR + Location: 4,44 + Actor1075: hosp + Owner: Neutral + Location: 15,27 + Actor1076: macs + Owner: Neutral + Location: 134,41 + ReinforcementSpawn: waypoint + Owner: Neutral + Location: 71,160 + ReinforcementDest: waypoint + Owner: Neutral + Location: 71,155 + PlayerStart: waypoint + Owner: Neutral + Location: 71,151 + WestLanding1: waypoint + Owner: Neutral + Location: 24,137 + WestLanding2: waypoint + Owner: Neutral + Location: 29,136 + WestLanding3: waypoint + Owner: Neutral + Location: 35,135 + EastLanding1: waypoint + Owner: Neutral + Location: 109,137 + EastLanding2: waypoint + Owner: Neutral + Location: 113,138 + EastLanding3: waypoint + Owner: Neutral + Location: 116,141 + Actor509: barr + Owner: USSR + Location: 58,92 + Actor718: stek + Owner: USSR + Location: 72,25 + NorthFactory: weap + Owner: USSR + Location: 71,38 + Actor1079: pt + Owner: Greece + Location: 68,152 + Facing: 0 + Actor1080: pt + Owner: Greece + Location: 74,152 + Facing: 0 + Actor1081: camera + Owner: USSR + Location: 40,110 + Actor1082: camera + Owner: USSR + Location: 107,109 + Actor1083: camera + Owner: USSR + Location: 14,72 + Actor1084: camera + Owner: USSR + Location: 126,76 + Actor1085: camera + Owner: USSR + Location: 111,39 + Actor1086: camera + Owner: USSR + Location: 24,47 + Actor1087: camera + Owner: USSR + Location: 29,98 + Actor1088: camera + Owner: USSR + Location: 118,96 + Actor935: 3tnk + Owner: USSR + Facing: 770 + Location: 126,79 + Actor1090: ifv + Owner: England + Location: 117,116 + Facing: 128 + Actor1091: ifv + Owner: England + Facing: 128 + Location: 120,115 + Actor1089: ifv + Owner: England + Facing: 128 + Location: 120,112 + Actor1092: jeep + Owner: England + Location: 28,112 + Facing: 896 + Actor1093: hopl + Owner: England + Location: 30,113 + SubCell: 3 + Facing: 896 + Actor1094: hopl + Owner: England + Location: 27,111 + SubCell: 3 + Facing: 896 + Actor1095: hopl + Owner: England + Location: 28,114 + SubCell: 3 + Facing: 896 + Actor1096: enfo + Owner: England + Location: 30,111 + SubCell: 3 + Facing: 896 + Actor1097: e3 + Owner: England + Location: 31,114 + SubCell: 3 + Facing: 896 + Actor1098: e3 + Owner: England + Location: 26,110 + SubCell: 3 + Facing: 896 + Actor1101: e1 + Owner: England + Location: 118,117 + SubCell: 3 + Facing: 128 + Actor1103: medi + Owner: England + Location: 119,116 + SubCell: 3 + Facing: 128 + Actor1104: medi + Owner: England + Location: 121,114 + SubCell: 3 + Facing: 128 + Actor1102: e1 + Owner: England + SubCell: 3 + Facing: 128 + Location: 117,119 + Actor1100: e1 + Owner: England + SubCell: 3 + Facing: 128 + Location: 119,114 + Actor1099: e1 + Owner: England + SubCell: 3 + Facing: 128 + Location: 122,112 + Actor1106: 3tnk + Owner: USSR + Location: 45,109 + Facing: 259 + Actor1105: 3tnk + Owner: USSR + Facing: 613 + Location: 99,109 + WestFlare: flare + Owner: England + Location: 29,133 + EastFlare: flare + Owner: England + Location: 115,135 + EnglandDome: dome + Owner: England + Location: 112,36 + Health: 88 + Actor1077: 3tnk + Owner: USSR + Facing: 384 + Location: 61,124 + Actor1078: 3tnk + Owner: USSR + Facing: 384 + Location: 63,126 + Actor1107: 3tnk + Owner: USSR + Location: 72,125 + Facing: 642 + Actor1108: 3tnk + Owner: USSR + Location: 66,109 + Facing: 512 + Actor1109: 3tnk + Owner: USSR + Location: 72,107 + Facing: 512 + Actor1110: 3tnk + Owner: USSR + Location: 64,107 + Facing: 512 + Actor1111: 3tnk + Owner: USSR + Facing: 384 + Location: 49,92 + Actor1112: 3tnk + Owner: USSR + Location: 88,107 + Facing: 642 + Actor1113: 3tnk + Owner: USSR + Facing: 642 + Location: 89,67 + Actor1114: 3tnk + Owner: USSR + Facing: 642 + Location: 97,16 + Actor1115: 3tnk + Owner: USSR + Facing: 642 + Location: 85,37 + Actor1116: 3tnk + Owner: USSR + Facing: 384 + Location: 56,66 + Actor1117: 3tnk + Owner: USSR + Facing: 384 + Location: 53,30 + Actor1118: 3tnk + Owner: USSR + Facing: 384 + Location: 46,39 + Actor1119: ttra + Owner: USSR + Facing: 384 + Location: 69,86 + Actor1120: ttra + Owner: USSR + Facing: 384 + Location: 74,95 + Actor1121: ttra + Owner: USSR + Location: 82,87 + Facing: 763 + Actor1122: ovld + Owner: USSR + Location: 70,50 + Facing: 512 + Actor1126: apoc + Owner: USSR + Location: 78,51 + Facing: 384 + ScriptTags: HardAndAbove + Actor1127: apoc + Owner: USSR + Location: 83,55 + Facing: 384 + ScriptTags: HardAndAbove + Actor1123: ovld + Owner: USSR + Location: 70,54 + Facing: 512 + ScriptTags: HardAndAbove + Actor1124: ovld + Owner: USSR + Facing: 512 + Location: 70,57 + Actor1125: ovld + Owner: USSR + Facing: 512 + Location: 70,61 + Actor1128: 4tnk + Owner: USSR + Facing: 384 + Location: 60,49 + Actor1129: 4tnk + Owner: USSR + Facing: 384 + Location: 61,29 + Actor1130: 4tnk + Owner: USSR + Location: 84,18 + Facing: 896 + Actor1131: 4tnk + Owner: USSR + Location: 86,22 + Facing: 896 + Actor1133: btr.ai + Owner: USSR + Facing: 384 + Location: 64,23 + Actor1134: btr.ai + Owner: USSR + Facing: 384 + Location: 80,51 + Actor1142: btr.ai + Owner: USSR + Location: 70,27 + Facing: 512 + Actor1132: btr.ai + Owner: USSR + Facing: 512 + Location: 67,32 + Actor1141: btr.ai + Owner: USSR + Facing: 512 + Location: 67,36 + Actor1140: btr.ai + Owner: USSR + Facing: 512 + Location: 67,39 + Actor1135: btr.ai + Owner: USSR + Facing: 512 + Location: 70,65 + Actor1136: btr.ai + Owner: USSR + Facing: 512 + Location: 70,68 + Actor1138: btr.ai + Owner: USSR + Facing: 512 + Location: 73,80 + Actor1137: btr.ai + Owner: USSR + Facing: 512 + Location: 73,76 + Actor1139: btr.ai + Owner: USSR + Facing: 512 + Location: 79,91 + Actor1143: btr.ai + Owner: USSR + Facing: 512 + Location: 66,16 + Actor1144: btr.ai + Owner: USSR + Facing: 512 + Location: 66,11 + Actor1145: ttra + Owner: USSR + Facing: 763 + Location: 80,31 + GradSpawn: waypoint + Owner: Neutral + Location: 66,1 + EastRally5: waypoint + Owner: Neutral + Location: 93,114 + EastRally4: waypoint + Owner: Neutral + Location: 104,93 + EastRally3: waypoint + Owner: Neutral + Location: 102,74 + EastRally2: waypoint + Owner: Neutral + Location: 100,43 + EastRally1: waypoint + Owner: Neutral + Location: 104,20 + WestRally1: waypoint + Owner: Neutral + Location: 49,36 + WestRally2: waypoint + Owner: Neutral + Location: 47,66 + WestRally3: waypoint + Owner: Neutral + Location: 45,95 + Actor1152: grad.defender + Owner: USSR + Facing: 642 + Location: 94,60 + Actor1153: grad.defender + Owner: USSR + Facing: 642 + Location: 96,59 + Actor1154: grad.defender + Owner: USSR + Facing: 642 + Location: 95,57 + Actor1155: grad.defender + Owner: USSR + Facing: 642 + Location: 95,30 + Actor1156: grad.defender + Owner: USSR + Facing: 642 + Location: 97,29 + Actor1161: grad.defender + Owner: USSR + Location: 69,129 + Facing: 512 + Actor1163: grad.defender + Owner: USSR + Facing: 384 + Location: 45,53 + Actor1164: grad.defender + Owner: USSR + Facing: 384 + Location: 48,55 + Actor1165: grad.defender + Owner: USSR + Facing: 384 + Location: 44,51 + Actor1167: split2 + Owner: Neutral + Location: 110,119 + Actor1168: split2 + Owner: Neutral + Location: 16,103 + Actor1169: split2 + Owner: Neutral + Location: 131,85 + Actor1170: oilb + Owner: USSR + Location: 5,36 + Actor1171: split2 + Owner: Neutral + Location: 17,64 + Actor1072: oilb + Owner: USSR + Location: 121,19 + Actor1073: oilb + Owner: USSR + Location: 117,20 + Actor354: v3rl + Owner: USSR + Location: 50,112 + Facing: 259 + ScriptTags: HardAndAbove + Actor369: v3rl + Owner: USSR + Location: 41,93 + Facing: 470 + Actor352: v3rl + Owner: USSR + Facing: 642 + Location: 104,96 + Actor351: v3rl + Owner: USSR + Location: 91,112 + Facing: 757 + ScriptTags: HardAndAbove + Actor1176: ftur + Owner: USSR + Location: 67,79 + Actor1178: ftur + Owner: USSR + Location: 63,20 + Actor1179: oilb + Owner: USSR + Location: 29,82 + WestBaseCenter: waypoint + Owner: Neutral + Location: 36,109 + EastBaseCenter: waypoint + Owner: Neutral + Location: 120,113 + Actor1180: dome + Owner: USSR + Location: 75,109 + Actor1182: fenc + Owner: USSR + Location: 77,111 + Actor1183: fenc + Owner: USSR + Location: 77,109 + Actor1184: fenc + Owner: USSR + Location: 77,110 + Actor1185: fenc + Owner: USSR + Location: 77,112 + Actor1186: fenc + Owner: USSR + Location: 54,112 + Actor1187: fenc + Owner: USSR + Location: 55,112 + Actor1188: fenc + Owner: USSR + Location: 56,112 + Actor1189: fenc + Owner: USSR + Location: 53,110 + Actor1190: fenc + Owner: USSR + Location: 54,111 + Actor1191: fenc + Owner: USSR + Location: 54,110 + Actor1192: fenc + Owner: USSR + Location: 53,109 + Actor1181: dome + Owner: USSR + Location: 55,109 + Actor680: dome + Owner: USSR + Location: 64,37 + NorthBarracks: barr + Owner: USSR + Location: 64,43 + Actor1199: dog + Owner: USSR + Location: 86,78 + SubCell: 3 + Facing: 572 + Actor1200: dog + Owner: USSR + Facing: 384 + Location: 72,36 + SubCell: 3 + Actor1201: dog + Owner: USSR + Facing: 384 + Location: 91,17 + SubCell: 3 + Actor1202: dog + Owner: USSR + Facing: 384 + Location: 60,32 + SubCell: 3 + Actor1203: dog + Owner: USSR + Facing: 384 + Location: 43,38 + SubCell: 3 + Actor1204: dog + Owner: USSR + Facing: 384 + Location: 56,92 + SubCell: 3 + Actor1205: dog + Owner: USSR + Location: 71,97 + SubCell: 3 + Facing: 606 + Actor1206: dog + Owner: USSR + Facing: 384 + Location: 70,95 + SubCell: 3 + Actor1207: dog + Owner: USSR + Facing: 384 + Location: 64,97 + SubCell: 3 + Actor1208: dog + Owner: USSR + Facing: 384 + Location: 81,92 + SubCell: 3 + Actor1209: dog + Owner: USSR + Location: 59,10 + SubCell: 3 + Facing: 654 + Actor1210: dog + Owner: USSR + Facing: 384 + Location: 52,11 + SubCell: 3 + Actor1211: dog + Owner: USSR + Facing: 384 + Location: 63,11 + SubCell: 3 + Actor1212: dog + Owner: USSR + Facing: 384 + Location: 65,54 + SubCell: 3 + Actor1213: dog + Owner: USSR + Location: 75,61 + SubCell: 3 + Facing: 613 + Actor1214: dog + Owner: USSR + Location: 67,59 + SubCell: 3 + Facing: 743 + Actor1215: dog + Owner: USSR + Facing: 384 + Location: 74,48 + SubCell: 3 + Actor1216: dog + Owner: USSR + Facing: 384 + Location: 74,67 + SubCell: 3 + Actor1217: dog + Owner: USSR + Facing: 384 + Location: 70,20 + SubCell: 3 + Actor1218: dog + Owner: USSR + Facing: 384 + Location: 67,14 + SubCell: 3 + Actor1219: dog + Owner: USSR + Facing: 384 + Location: 71,13 + SubCell: 3 + Actor1220: dog + Owner: USSR + Location: 76,90 + SubCell: 3 + Facing: 675 + Actor1223: dog + Owner: USSR + Location: 91,28 + SubCell: 3 + Facing: 606 + Actor1224: dog + Owner: USSR + Facing: 384 + Location: 93,25 + SubCell: 3 + Actor1227: dog + Owner: USSR + Location: 88,57 + SubCell: 3 + Facing: 384 + Actor1228: dog + Owner: USSR + Location: 89,80 + SubCell: 3 + Facing: 384 + Actor1229: dog + Owner: USSR + Location: 59,86 + SubCell: 3 + Facing: 688 + Actor1230: dog + Owner: USSR + Facing: 384 + Location: 60,84 + SubCell: 3 + Actor1231: dog + Owner: USSR + Facing: 384 + Location: 57,109 + SubCell: 3 + Actor1232: dog + Owner: USSR + Location: 74,111 + SubCell: 3 + Facing: 627 + Actor1233: dog + Owner: USSR + Location: 89,59 + SubCell: 3 + Facing: 559 + Actor1177: ftur + Owner: USSR + Location: 65,40 + Actor1234: dog + Owner: USSR + Facing: 384 + Location: 63,39 + SubCell: 3 + Actor1235: dog + Owner: USSR + Location: 65,36 + SubCell: 3 + Facing: 661 + Actor973: e1 + Owner: USSR + Facing: 384 + Location: 44,49 + SubCell: 3 + Actor1195: dome + Owner: USSR + Location: 46,50 + Actor1226: dog + Owner: USSR + Facing: 647 + Location: 48,49 + SubCell: 3 + Actor1225: dog + Owner: USSR + Facing: 384 + Location: 50,53 + SubCell: 3 + Actor1196: dome + Owner: USSR + Location: 92,57 + Actor684: sam + Owner: USSR + Location: 93,56 + Actor1147: grad.defender + Owner: USSR + Facing: 384 + Location: 49,83 + Actor1148: grad.defender + Owner: USSR + Facing: 384 + Location: 53,86 + Actor1146: grad.defender + Owner: USSR + Facing: 384 + Location: 50,86 + Actor1194: dome + Owner: USSR + Location: 51,83 + Actor1193: dome + Owner: USSR + Location: 95,79 + Actor1149: grad.defender + Owner: USSR + Facing: 642 + Location: 98,81 + Actor1151: grad.defender + Owner: USSR + Facing: 642 + Location: 94,82 + Actor1150: grad.defender + Owner: USSR + Facing: 642 + Location: 97,79 + Actor692: sam + Owner: USSR + Location: 94,78 + Actor690: sam + Owner: USSR + Location: 52,82 + Actor1162: grad.defender + Owner: USSR + Facing: 384 + Location: 37,31 + Actor1166: grad.defender + Owner: USSR + Facing: 384 + Location: 36,27 + Actor1050: e3 + Owner: USSR + Facing: 384 + Location: 36,30 + SubCell: 3 + Actor996: e1 + Owner: USSR + Facing: 384 + Location: 36,26 + SubCell: 3 + Actor1222: dog + Owner: USSR + Facing: 384 + Location: 39,26 + SubCell: 3 + Actor1198: dome + Owner: USSR + Location: 38,27 + Actor1221: dog + Owner: USSR + Facing: 647 + Location: 40,31 + SubCell: 3 + Actor689: sam + Owner: USSR + Location: 40,28 + Actor1197: dome + Owner: USSR + Location: 94,26 + Actor1052: e3 + Owner: USSR + Facing: 384 + Location: 96,26 + SubCell: 3 + Actor688: sam + Owner: USSR + Location: 92,29 + Actor1159: grad.defender + Owner: USSR + Facing: 384 + Location: 59,122 + Actor1157: grad.defender + Owner: USSR + Facing: 642 + Location: 79,121 + Actor1158: split2 + Owner: Neutral + Location: 136,15 + Actor1160: split2 + Owner: Neutral + Location: 135,9 + Actor1172: split2 + Owner: Neutral + Location: 10,18 + Actor1173: split2 + Owner: Neutral + Location: 9,10 + Actor1175: ftur + Owner: USSR + Location: 77,84 + SouthFactory: weap + Owner: USSR + Location: 80,79 + SouthBarracks: barr + Owner: USSR + Location: 76,78 + Actor1174: fix + Owner: England + Location: 123,108 + Actor1236: fix + Owner: England + Location: 31,111 + Actor1237: oilb + Owner: USSR + Location: 117,49 + Actor708: proc + Owner: USSR + Location: 83,11 + Actor709: silo + Owner: USSR + Location: 85,11 + Actor710: silo + Owner: USSR + Location: 83,11 + Actor1259: sam + Owner: USSR + Location: 88,3 + Actor1260: brik + Owner: USSR + Location: 89,4 + Actor1261: brik + Owner: USSR + Location: 90,4 + Actor1262: brik + Owner: USSR + Location: 91,4 + Actor1263: brik + Owner: USSR + Location: 91,3 + Actor1264: brik + Owner: USSR + Location: 90,3 + Actor1238: npwr + Owner: USSR + Location: 81,3 + Actor1239: brik + Owner: USSR + Location: 79,1 + Actor1240: brik + Owner: USSR + Location: 79,3 + Actor1241: brik + Owner: USSR + Location: 79,2 + Actor1242: brik + Owner: USSR + Location: 79,4 + Actor1243: brik + Owner: USSR + Location: 85,1 + Actor1244: brik + Owner: USSR + Location: 84,1 + Actor1245: brik + Owner: USSR + Location: 83,1 + Actor1246: brik + Owner: USSR + Location: 81,1 + Actor1247: brik + Owner: USSR + Location: 82,1 + Actor1248: brik + Owner: USSR + Location: 80,1 + Actor1249: brik + Owner: USSR + Location: 79,5 + Actor1250: brik + Owner: USSR + Location: 79,6 + Actor1252: brik + Owner: USSR + Location: 86,5 + Actor1253: brik + Owner: USSR + Location: 86,4 + Actor1254: brik + Owner: USSR + Location: 86,3 + Actor1255: brik + Owner: USSR + Location: 86,2 + Actor1256: brik + Owner: USSR + Location: 86,1 + Actor1251: brik + Owner: USSR + Location: 86,6 + Actor1257: brik + Owner: USSR + Location: 79,7 + Actor1258: brik + Owner: USSR + Location: 80,7 + Actor1265: brik + Owner: USSR + Location: 79,8 + Actor1266: brik + Owner: USSR + Location: 80,8 + Actor1267: brik + Owner: USSR + Location: 85,8 + Actor1268: brik + Owner: USSR + Location: 85,7 + Actor1269: brik + Owner: USSR + Location: 86,7 + Actor1270: brik + Owner: USSR + Location: 86,8 + Actor1271: chain + Owner: USSR + Location: 80,2 + Actor1272: chain + Owner: USSR + Location: 80,3 + Actor1273: chain + Owner: USSR + Location: 80,4 + Actor1274: chain + Owner: USSR + Location: 80,5 + Actor1275: chain + Owner: USSR + Location: 80,6 + Actor1276: chain + Owner: USSR + Location: 81,6 + Actor1277: chain + Owner: USSR + Location: 83,6 + Actor1278: chain + Owner: USSR + Location: 82,6 + Actor1279: chain + Owner: USSR + Location: 84,6 + Actor1280: chain + Owner: USSR + Location: 85,6 + Actor1281: chain + Owner: USSR + Location: 85,5 + Actor1282: chain + Owner: USSR + Location: 85,4 + Actor1283: chain + Owner: USSR + Location: 85,3 + Actor1284: chain + Owner: USSR + Location: 85,2 + Actor717: sam + Owner: USSR + Location: 82,7 + Actor1285: sam + Owner: USSR + Location: 74,7 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, pinkjunglecliffs_rul.yaml, mebld_rul.yaml, pinkdefaults_rul.yaml, pinktrees_rul.yaml, dissection-rules.yaml + +Sequences: mebld_seq.yaml, pinktrees_seq.yaml, pinkjunglecliffs_seq.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/main-campaign/ca43-dissection/mebld6.shp b/mods/ca/missions/main-campaign/ca43-dissection/mebld6.shp new file mode 100644 index 0000000000..4ba8848482 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/mebld6.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/mebld_rul.yaml b/mods/ca/missions/main-campaign/ca43-dissection/mebld_rul.yaml new file mode 100644 index 0000000000..ac19062994 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca43-dissection/mebld_rul.yaml @@ -0,0 +1,196 @@ +mebld1a: + Inherits: ^CivBuilding + Building: + Footprint: x + Dimensions: 1,1 + Tooltip: + Name: Civilian Building + RevealsShroud: + Range: 10c0 + HitShape: + +mebld1b: + Inherits: ^CivBuilding + Building: + Footprint: x + Dimensions: 1,1 + Tooltip: + Name: Civilian Building + RevealsShroud: + Range: 10c0 + HitShape: + +mebld2: + Inherits: ^CivBuilding + Building: + Footprint: xx + Dimensions: 2,1 + Tooltip: + Name: Civilian Building + RevealsShroud: + Range: 10c0 + HitShape: + +mebld3a: + Inherits: ^CivBuilding + Building: + Footprint: x + Dimensions: 1,1 + Tooltip: + Name: Civilian Building + RevealsShroud: + Range: 10c0 + HitShape: + +mebld3b: + Inherits: ^CivBuilding + Building: + Footprint: xx + Dimensions: 2,1 + Tooltip: + Name: Civilian Building + RevealsShroud: + Range: 10c0 + HitShape: + +mebld3c: + Inherits: ^CivBuilding + Building: + Footprint: xx + Dimensions: 2,1 + Tooltip: + Name: Civilian Building + RevealsShroud: + Range: 10c0 + HitShape: + +mosque: + Inherits: ^CivBuilding + Building: + Footprint: xxx xxx + Dimensions: 3,2 + Tooltip: + Name: Mosque + RevealsShroud: + Range: 10c0 + HitShape: + +mebld4a: + Inherits: ^CivBuilding + Building: + Footprint: xx + Dimensions: 2,1 + Tooltip: + Name: Civilian Building + RevealsShroud: + Range: 10c0 + HitShape: + +mebld4b: + Inherits: ^CivBuilding + Building: + Footprint: xx + Dimensions: 2,1 + Tooltip: + Name: Civilian Building + RevealsShroud: + Range: 10c0 + HitShape: + +mebld4c: + Inherits: ^CivBuilding + Building: + Footprint: x x + Dimensions: 1,2 + Tooltip: + Name: Civilian Building + RevealsShroud: + Range: 10c0 + HitShape: + +mebld5a: + Inherits: ^CivBuilding + Building: + Footprint: x + Dimensions: 1,1 + Tooltip: + Name: Civilian Building + RevealsShroud: + Range: 10c0 + HitShape: + +mebld5b: + Inherits: ^CivBuilding + Building: + Footprint: x + Dimensions: 1,1 + Tooltip: + Name: Civilian Building + RevealsShroud: + Range: 10c0 + HitShape: + +mebld5c: + Inherits: ^CivBuilding + Building: + Footprint: x + Dimensions: 1,1 + Tooltip: + Name: Civilian Building + RevealsShroud: + Range: 10c0 + HitShape: + +mebld5d: + Inherits: ^CivBuilding + Building: + Footprint: x + Dimensions: 1,1 + Tooltip: + Name: Civilian Building + RevealsShroud: + Range: 10c0 + HitShape: + +mebld5e: + Inherits: ^CivBuilding + Building: + Footprint: x + Dimensions: 1,1 + Tooltip: + Name: Civilian Building + RevealsShroud: + Range: 10c0 + HitShape: + +mebld6: + Inherits: ^CivBuilding + Building: + Footprint: xx xx + Dimensions: 2,2 + Tooltip: + Name: Civilian Building + RevealsShroud: + Range: 10c0 + HitShape: + +terroristhouse: + Inherits: ^TechBuilding + Building: + Footprint: xx xx + Dimensions: 2,2 + Tooltip: + Name: Civilian Building + RevealsShroud: + Range: 10c0 + RenderSprites: + Image: mebld6 + ProvidesPrerequisite: + Prerequisite: terrorists + HitShape: + CaptureManager: + Capturable: + Types: building + CapturableProgressBar: + CapturableProgressBlink: + InstantlyRepairable: diff --git a/mods/ca/missions/main-campaign/ca43-dissection/mebld_seq.yaml b/mods/ca/missions/main-campaign/ca43-dissection/mebld_seq.yaml new file mode 100644 index 0000000000..72b55fc983 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca43-dissection/mebld_seq.yaml @@ -0,0 +1,145 @@ +mebld1a: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/meblds.shp + Start: 2 + Offset: 2,-1 + damaged-idle: + Filename: ca|missions/main-campaign/ca43-dissection/meblds.shp + Start: 3 + Offset: 2,-1 + +mebld1b: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/meblds.shp + Start: 4 + Offset: 2,-1 + damaged-idle: + Filename: ca|missions/main-campaign/ca43-dissection/meblds.shp + Start: 5 + Offset: 2,-1 + +mebld2: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/meblds.shp + Start: 0 + Offset: 0,2 + damaged-idle: + Filename: ca|missions/main-campaign/ca43-dissection/meblds.shp + Start: 1 + Offset: 0,2 + +mebld3a: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/meblds.shp + Start: 6 + Offset: 2,-1 + damaged-idle: + Filename: ca|missions/main-campaign/ca43-dissection/meblds.shp + Start: 7 + Offset: 2,-1 + +mebld3b: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/meblds.shp + Start: 8 + damaged-idle: + Filename: ca|missions/main-campaign/ca43-dissection/meblds.shp + Start: 9 + +mebld3c: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/meblds.shp + Start: 10 + damaged-idle: + Filename: ca|missions/main-campaign/ca43-dissection/meblds.shp + Start: 11 + +mosque: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/meblds.shp + Start: 12 + damaged-idle: + Filename: ca|missions/main-campaign/ca43-dissection/meblds.shp + Start: 13 + +mebld4a: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/meblds.shp + Start: 14 + damaged-idle: + Filename: ca|missions/main-campaign/ca43-dissection/meblds.shp + Start: 15 + +mebld4b: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/meblds.shp + Start: 16 + damaged-idle: + Filename: ca|missions/main-campaign/ca43-dissection/meblds.shp + Start: 17 + +mebld4c: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/meblds.shp + Start: 18 + Offset: 2,-1 + damaged-idle: + Filename: ca|missions/main-campaign/ca43-dissection/meblds.shp + Start: 19 + Offset: 2,-1 + +mebld5a: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/meblds.shp + Start: 20 + Offset: 2,-1 + damaged-idle: + Filename: ca|missions/main-campaign/ca43-dissection/meblds.shp + Start: 21 + Offset: 2,-1 + +mebld5b: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/meblds.shp + Start: 22 + damaged-idle: + Filename: ca|missions/main-campaign/ca43-dissection/meblds.shp + Start: 23 + +mebld5c: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/meblds.shp + Start: 24 + Offset: 2,-1 + damaged-idle: + Filename: ca|missions/main-campaign/ca43-dissection/meblds.shp + Start: 25 + Offset: 2,-1 + +mebld5d: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/meblds.shp + Start: 26 + Offset: 2,-1 + damaged-idle: + Filename: ca|missions/main-campaign/ca43-dissection/meblds.shp + Start: 27 + Offset: 2,-1 + +mebld5e: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/meblds.shp + Start: 28 + Offset: 2,-1 + damaged-idle: + Filename: ca|missions/main-campaign/ca43-dissection/meblds.shp + Start: 29 + Offset: 2,-1 + +mebld6: + Defaults: + Filename: ca|missions/main-campaign/ca43-dissection/mebld6.shp + idle: + Start: 0 + damaged-idle: + Start: 1 diff --git a/mods/ca/missions/main-campaign/ca43-dissection/meblds.shp b/mods/ca/missions/main-campaign/ca43-dissection/meblds.shp new file mode 100644 index 0000000000..0cf6426163 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/meblds.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/medtree.pal b/mods/ca/missions/main-campaign/ca43-dissection/medtree.pal new file mode 100644 index 0000000000..2d567cc661 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/medtree.pal differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/mphlpr.shp b/mods/ca/missions/main-campaign/ca43-dissection/mphlpr.shp new file mode 100644 index 0000000000..fc23de6ba5 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/mphlpr.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/mt.shp b/mods/ca/missions/main-campaign/ca43-dissection/mt.shp new file mode 100644 index 0000000000..678114d22b Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/mt.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/oli.shp b/mods/ca/missions/main-campaign/ca43-dissection/oli.shp new file mode 100644 index 0000000000..0cf2303f7b Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/oli.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/pinkdefaults_rul.yaml b/mods/ca/missions/main-campaign/ca43-dissection/pinkdefaults_rul.yaml new file mode 100644 index 0000000000..3b4f364cdc --- /dev/null +++ b/mods/ca/missions/main-campaign/ca43-dissection/pinkdefaults_rul.yaml @@ -0,0 +1,96 @@ +^Palettes: + PaletteFromFile@terrain-jungle: + Name: jungle + Tileset: DESERT + Filename: ca|missions/main-campaign/ca43-dissection/jungle.pal + ShadowIndex: 3, 4 + PaletteFromFile@terrain-trees: + Name: medtree + Tileset: DESERT + Filename: ca|missions/main-campaign/ca43-dissection/medtree.pal + ShadowIndex: 3, 4 + +^JungleTree: + RenderSprites: + Palette: jungle + +^Bush: + RenderSprites: + Palette: terrain + +^1x1: + Building: + Footprint: x + Dimensions: 1, 1 + RequiresBuildableArea: + AreaTypes: building + RadarColorFromTerrain: + Terrain: Rock + +^1x2: + Building: + Footprint: x x + Dimensions: 1, 2 + RequiresBuildableArea: + AreaTypes: building + RadarColorFromTerrain: + Terrain: Rock + +^2x1: + Building: + Footprint: xx + Dimensions: 2, 1 + RequiresBuildableArea: + AreaTypes: building + RadarColorFromTerrain: + Terrain: Rock + +^2x2: + Building: + Footprint: xx xx + Dimensions: 2, 2 + RequiresBuildableArea: + AreaTypes: building + RadarColorFromTerrain: + Terrain: Rock + +^2x3: + Building: + Footprint: xx xx xx + Dimensions: 2, 3 + RequiresBuildableArea: + AreaTypes: building + RadarColorFromTerrain: + Terrain: Rock + +^3x2: + Building: + Footprint: xxx xxx + Dimensions: 3, 2 + RequiresBuildableArea: + AreaTypes: building + RadarColorFromTerrain: + Terrain: Rock + +^3x3: + Building: + Footprint: xxx xxx xxx + Dimensions: 3, 3 + RequiresBuildableArea: + AreaTypes: building + RadarColorFromTerrain: + Terrain: Rock + +^CustomMapDebris: + Inherits@1: ^SpriteActor + RenderSprites: + Palette: terrain + WithSpriteBody: + AppearsOnRadar: + RadarColorFromTerrain: + Terrain: Tree + AlwaysVisible: + ScriptTriggers: + MapEditorData: + Categories: Decoration + Interactable: diff --git a/mods/ca/missions/main-campaign/ca43-dissection/pinkjunglecliffs_rul.yaml b/mods/ca/missions/main-campaign/ca43-dissection/pinkjunglecliffs_rul.yaml new file mode 100644 index 0000000000..5eeebdf979 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca43-dissection/pinkjunglecliffs_rul.yaml @@ -0,0 +1,502 @@ +JT01: + Inherits: ^Tree + Inherits@JUNGLEPALETTE: ^JungleTree + MapEditorData: + ExcludeTilesets: INTERIOR + SpawnActorOnDeath: + Actor: JT01.Husk + Building: + Footprint: __ x_ + Dimensions: 2,2 + +JT01.Husk: + Inherits: ^TreeHusk + Inherits@JUNGLEPALETTE: ^JungleTree + MapEditorData: + ExcludeTilesets: INTERIOR + Building: + Footprint: __ x_ + Dimensions: 2,2 + +JT01B: + Inherits: ^Tree + Inherits@JUNGLEPALETTE: ^JungleTree + MapEditorData: + ExcludeTilesets: INTERIOR + SpawnActorOnDeath: + Actor: JT01B.Husk + Building: + Footprint: __ x_ + Dimensions: 2,2 + +JT01B.Husk: + Inherits: ^TreeHusk + Inherits@JUNGLEPALETTE: ^JungleTree + MapEditorData: + ExcludeTilesets: INTERIOR + Building: + Footprint: __ x_ + Dimensions: 2,2 + +JT02: + Inherits: ^Tree + Inherits@JUNGLEPALETTE: ^JungleTree + MapEditorData: + ExcludeTilesets: INTERIOR + SpawnActorOnDeath: + Actor: JT02.Husk + Building: + Footprint: __ x_ + Dimensions: 2,2 + +JT02.Husk: + Inherits: ^TreeHusk + Inherits@JUNGLEPALETTE: ^JungleTree + MapEditorData: + ExcludeTilesets: INTERIOR + Building: + Footprint: __ x_ + Dimensions: 2,2 + +JT03: + Inherits: ^Tree + Inherits@JUNGLEPALETTE: ^JungleTree + MapEditorData: + ExcludeTilesets: INTERIOR + SpawnActorOnDeath: + Actor: JT03.Husk + Building: + Footprint: __ x_ + Dimensions: 2,2 + +JT03.Husk: + Inherits: ^TreeHusk + Inherits@JUNGLEPALETTE: ^JungleTree + MapEditorData: + ExcludeTilesets: INTERIOR + Building: + Footprint: __ x_ + Dimensions: 2,2 + +JT05: + Inherits: ^Tree + Inherits@JUNGLEPALETTE: ^JungleTree + MapEditorData: + ExcludeTilesets: INTERIOR + SpawnActorOnDeath: + Actor: JT05.Husk + Building: + Footprint: __ x_ + Dimensions: 2,2 + +JT05.Husk: + Inherits: ^TreeHusk + Inherits@JUNGLEPALETTE: ^JungleTree + MapEditorData: + ExcludeTilesets: INTERIOR + Building: + Footprint: __ x_ + Dimensions: 2,2 + +JT05B: + Inherits: ^Tree + Inherits@JUNGLEPALETTE: ^JungleTree + MapEditorData: + ExcludeTilesets: INTERIOR + SpawnActorOnDeath: + Actor: JT05B.Husk + Building: + Footprint: __ x_ + Dimensions: 2,2 + +JT05B.Husk: + Inherits: ^TreeHusk + Inherits@JUNGLEPALETTE: ^JungleTree + MapEditorData: + ExcludeTilesets: INTERIOR + Building: + Footprint: __ x_ + Dimensions: 2,2 + +JT06: + Inherits: ^Tree + Inherits@JUNGLEPALETTE: ^JungleTree + MapEditorData: + ExcludeTilesets: INTERIOR + SpawnActorOnDeath: + Actor: JT06.Husk + Building: + Footprint: __ x_ + Dimensions: 2,2 + +JT06.Husk: + Inherits: ^TreeHusk + Inherits@JUNGLEPALETTE: ^JungleTree + MapEditorData: + ExcludeTilesets: INTERIOR + Building: + Footprint: __ x_ + Dimensions: 2,2 + +JT07: + Inherits: ^Tree + Inherits@JUNGLEPALETTE: ^JungleTree + MapEditorData: + ExcludeTilesets: INTERIOR + SpawnActorOnDeath: + Actor: JT07.Husk + Building: + Footprint: __ x_ + Dimensions: 2,2 + +JT07.Husk: + Inherits: ^TreeHusk + Inherits@JUNGLEPALETTE: ^JungleTree + MapEditorData: + ExcludeTilesets: INTERIOR + Building: + Footprint: __ x_ + Dimensions: 2,2 + +JT08: + Inherits: ^Tree + Inherits@JUNGLEPALETTE: ^JungleTree + Building: + Footprint: x_ + Dimensions: 2,1 + SpawnActorOnDeath: + Actor: JT08.Husk + +JT08.Husk: + Inherits: ^TreeHusk + Inherits@JUNGLEPALETTE: ^JungleTree + Building: + Footprint: x_ + Dimensions: 2,1 + +JT10: + Inherits: ^Tree + Inherits@JUNGLEPALETTE: ^JungleTree + Building: + Footprint: __ xx + Dimensions: 2,2 + MapEditorData: + ExcludeTilesets: INTERIOR + SpawnActorOnDeath: + Actor: JT10.Husk + +JT10.Husk: + Inherits: ^TreeHusk + Inherits@JUNGLEPALETTE: ^JungleTree + Building: + Footprint: __ xx + Dimensions: 2,2 + MapEditorData: + ExcludeTilesets: INTERIOR + +JT11: + Inherits: ^Tree + Inherits@JUNGLEPALETTE: ^JungleTree + Building: + Footprint: __ xx + Dimensions: 2,2 + MapEditorData: + ExcludeTilesets: INTERIOR + SpawnActorOnDeath: + Actor: JT11.Husk + +JT11.Husk: + Inherits: ^TreeHusk + Inherits@JUNGLEPALETTE: ^JungleTree + Building: + Footprint: __ xx + Dimensions: 2,2 + MapEditorData: + ExcludeTilesets: INTERIOR + +JT13: + Inherits: ^Tree + Inherits@JUNGLEPALETTE: ^JungleTree + MapEditorData: + ExcludeTilesets: INTERIOR + SpawnActorOnDeath: + Actor: JT13.Husk + Building: + Footprint: __ xx + Dimensions: 2,2 + +JT13.Husk: + Inherits: ^TreeHusk + Inherits@JUNGLEPALETTE: ^JungleTree + Building: + MapEditorData: + ExcludeTilesets: INTERIOR + Building: + Footprint: __ xx + Dimensions: 2,2 + +jt14: + Inherits: ^Tree + Inherits@JUNGLEPALETTE: ^JungleTree + MapEditorData: + ExcludeTilesets: INTERIOR + SpawnActorOnDeath: + Actor: jt14.Husk + Building: + Footprint: __ xx + Dimensions: 2,2 + +jt14.Husk: + Inherits: ^TreeHusk + Inherits@JUNGLEPALETTE: ^JungleTree + MapEditorData: + ExcludeTilesets: INTERIOR + Building: + Footprint: __ xx + Dimensions: 2,2 + +jt15: + Inherits: ^Tree + Inherits@JUNGLEPALETTE: ^JungleTree + Building: + Footprint: ___ xx_ + Dimensions: 3,2 + MapEditorData: + ExcludeTilesets: INTERIOR + SpawnActorOnDeath: + Actor: jt15.Husk + Building: + Footprint: __ xx + Dimensions: 2,2 + +jt15.Husk: + Inherits: ^TreeHusk + Inherits@JUNGLEPALETTE: ^JungleTree + Building: + Footprint: ___ xx_ + Dimensions: 3,2 + MapEditorData: + ExcludeTilesets: INTERIOR + Building: + Footprint: __ xx + Dimensions: 2,2 + +jt16: + Inherits: ^Tree + Inherits@JUNGLEPALETTE: ^JungleTree + MapEditorData: + ExcludeTilesets: INTERIOR + SpawnActorOnDeath: + Actor: jt16.Husk + Building: + Footprint: __ x_ + Dimensions: 2,2 + +jt16.Husk: + Inherits: ^TreeHusk + Inherits@JUNGLEPALETTE: ^JungleTree + MapEditorData: + ExcludeTilesets: INTERIOR + Building: + Footprint: __ x_ + Dimensions: 2,2 + +jt17: + Inherits: ^Tree + Inherits@JUNGLEPALETTE: ^JungleTree + MapEditorData: + ExcludeTilesets: INTERIOR + SpawnActorOnDeath: + Actor: jt17.Husk + Building: + Footprint: __ x_ + Dimensions: 2,2 + +jt17.Husk: + Inherits: ^TreeHusk + Inherits@JUNGLEPALETTE: ^JungleTree + MapEditorData: + ExcludeTilesets: INTERIOR + Building: + Footprint: __ x_ + Dimensions: 2,2 + +JTC01: + Inherits: ^Tree + Inherits@JUNGLEPALETTE: ^JungleTree + Building: + Footprint: ___ xx_ + Dimensions: 3,2 + MapEditorData: + ExcludeTilesets: INTERIOR + SpawnActorOnDeath: + Actor: JTC01.Husk + +JTC01.Husk: + Inherits: ^TreeHusk + Inherits@JUNGLEPALETTE: ^JungleTree + Building: + Footprint: ___ xx_ + Dimensions: 3,2 + MapEditorData: + ExcludeTilesets: INTERIOR + +JTC02: + Inherits: ^Tree + Inherits@JUNGLEPALETTE: ^JungleTree + Building: + Footprint: _x_ xx_ + Dimensions: 3,2 + MapEditorData: + ExcludeTilesets: INTERIOR + SpawnActorOnDeath: + Actor: JTC02.Husk + +JTC02.Husk: + Inherits: ^TreeHusk + Inherits@JUNGLEPALETTE: ^JungleTree + Building: + Footprint: _x_ xx_ + Dimensions: 3,2 + MapEditorData: + ExcludeTilesets: INTERIOR + +JTC03: + Inherits: ^Tree + Inherits@JUNGLEPALETTE: ^JungleTree + Building: + Footprint: _x_ xx_ + Dimensions: 3,2 + MapEditorData: + ExcludeTilesets: INTERIOR + SpawnActorOnDeath: + Actor: JTC03.Husk + +JTC03.Husk: + Inherits: ^TreeHusk + Inherits@JUNGLEPALETTE: ^JungleTree + Building: + Footprint: _x_ xx_ + Dimensions: 3,2 + MapEditorData: + ExcludeTilesets: INTERIOR + +JTC04: + Inherits: ^Tree + Inherits@JUNGLEPALETTE: ^JungleTree + Building: + Footprint: ____ xxx_ x___ + Dimensions: 4,3 + MapEditorData: + ExcludeTilesets: INTERIOR + SpawnActorOnDeath: + Actor: JTC04.Husk + +JTC04.Husk: + Inherits: ^TreeHusk + Inherits@JUNGLEPALETTE: ^JungleTree + Building: + Footprint: ____ xxx_ x___ + Dimensions: 4,3 + MapEditorData: + ExcludeTilesets: INTERIOR + +JTC05: + Inherits: ^Tree + Inherits@JUNGLEPALETTE: ^JungleTree + Building: + Footprint: __x_ xxx_ _xx_ + Dimensions: 4,3 + MapEditorData: + ExcludeTilesets: INTERIOR + SpawnActorOnDeath: + Actor: JTC05.Husk + +JTC05.Husk: + Inherits: ^TreeHusk + Inherits@JUNGLEPALETTE: ^JungleTree + Building: + Footprint: __x_ xxx_ _xx_ + Dimensions: 4,3 + MapEditorData: + ExcludeTilesets: INTERIOR + +sbush1: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^1x1 + Inherits@Palette: ^Bush + Building: + Footprint: x + Dimensions: 1, 1 + +sbush2: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^1x1 + Inherits@Palette: ^Bush + Building: + Footprint: x + Dimensions: 1, 1 + +sbush3: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^1x1 + Inherits@Palette: ^Bush + Building: + Footprint: x + Dimensions: 1, 1 + +bush1: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^2x2 + Inherits@Palette: ^Bush + Building: + Footprint: xx xx + Dimensions: 2, 2 + +bush2: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^2x2 + Inherits@Palette: ^Bush + Building: + Footprint: x_ x_ + Dimensions: 2, 2 + +bush3: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^2x2 + Inherits@Palette: ^Bush + Building: + Footprint: xx xx + Dimensions: 2, 2 + +bush4: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^2x2 + Inherits@Palette: ^Bush + Building: + Footprint: x_ x_ + Dimensions: 2, 2 + +bush5: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^2x2 + Inherits@Palette: ^Bush + Building: + Footprint: xx xx + Dimensions: 2, 2 + +lbush1: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^3x2 + Inherits@Palette: ^Bush + Building: + Footprint: xxx xxx + Dimensions: 3, 2 + +lbush2: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^3x2 + Inherits@Palette: ^Bush + Building: + Footprint: xxx xxx + Dimensions: 3, 2 diff --git a/mods/ca/missions/main-campaign/ca43-dissection/pinkjunglecliffs_seq.yaml b/mods/ca/missions/main-campaign/ca43-dissection/pinkjunglecliffs_seq.yaml new file mode 100644 index 0000000000..01f8232e8b --- /dev/null +++ b/mods/ca/missions/main-campaign/ca43-dissection/pinkjunglecliffs_seq.yaml @@ -0,0 +1,389 @@ +jtc04: + Defaults: + Filename: ca|missions/main-campaign/ca43-dissection/jtc04.shp + idle: + damaged-idle: + Start: 1 + +jtc04.husk: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/jtc04.shp + Start: 2 + dead: + Filename: ca|missions/main-campaign/ca43-dissection/jtc04.shp + Start: 2 + Length: 8 + Tick: 80 + +jtc05: + Defaults: + Filename: ca|missions/main-campaign/ca43-dissection/jtc05.shp + idle: + damaged-idle: + Start: 1 + +jtc05.husk: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/jtc05.shp + Start: 2 + dead: + Filename: ca|missions/main-campaign/ca43-dissection/jtc05.shp + Start: 2 + Length: 8 + Tick: 80 + +jtc03: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/jtc03.shp + +jtc03.husk: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/jtc03.shp + Start: 1 + dead: + Filename: ca|missions/main-campaign/ca43-dissection/jtc03.shp + Start: 2 + Length: 8 + Tick: 80 + +jtc02: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/jtc02.shp + +jtc02.husk: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/jtc02.shp + Start: 1 + dead: + Filename: ca|missions/main-campaign/ca43-dissection/jtc02.shp + Start: 2 + Length: 8 + Tick: 80 + +jtc01: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/jtc01.shp + +jtc01.husk: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/jtc01.shp + Start: 1 + dead: + Filename: ca|missions/main-campaign/ca43-dissection/jtc01.shp + Start: 2 + Length: 8 + Tick: 80 + +jt17: + Defaults: + Filename: ca|missions/main-campaign/ca43-dissection/jt17.shp + Offset: 0,-5 + idle: + +jt17.husk: + Defaults: + Filename: ca|missions/main-campaign/ca43-dissection/jt17.shp + Offset: 0,-5 + idle: + Start: 1 + dead: + Start: 2 + Length: 8 + Tick: 80 + +jt16: + Defaults: + Filename: ca|missions/main-campaign/ca43-dissection/jt16.shp + Offset: 0,-4 + idle: + +jt16.husk: + Defaults: + Filename: ca|missions/main-campaign/ca43-dissection/jt16.shp + Offset: 0,-4 + idle: + Start: 1 + dead: + Start: 2 + Length: 8 + Tick: 80 + +jt15: + Defaults: + Filename: ca|missions/main-campaign/ca43-dissection/jt15.shp + idle: + +jt15.husk: + Defaults: + Filename: ca|missions/main-campaign/ca43-dissection/jt15.shp + idle: + Start: 1 + dead: + Start: 2 + Length: 8 + Tick: 80 + +jt14: + Defaults: + Filename: ca|missions/main-campaign/ca43-dissection/jt14.shp + idle: + +jt14.husk: + Defaults: + Filename: ca|missions/main-campaign/ca43-dissection/jt14.shp + idle: + Start: 1 + dead: + Start: 2 + Length: 8 + Tick: 80 + +jt13: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/jt13.shp + +jt13.husk: + Defaults: + Filename: ca|missions/main-campaign/ca43-dissection/jt13.shp + idle: + Start: 1 + dead: + Start: 2 + Length: 8 + Tick: 80 + +jt11: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/jt11.shp + +jt11.husk: + Defaults: + Filename: ca|missions/main-campaign/ca43-dissection/jt11.shp + idle: + Start: 1 + dead: + Start: 2 + Length: 8 + Tick: 80 + +jt10: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/jt10.shp + +jt10.husk: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/jt10.shp + Start: 1 + dead: + Filename: ca|missions/main-campaign/ca43-dissection/jt10.shp + Start: 2 + Length: 8 + Tick: 80 + +jt08: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/jt08.shp + +jt08.husk: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/jt08.shp + Start: 1 + dead: + Filename: ca|missions/main-campaign/ca43-dissection/jt08.shp + Start: 2 + Length: 8 + Tick: 80 + +jt07: + Defaults: + Filename: ca|missions/main-campaign/ca43-dissection/jt07.shp + Offset: -5,-2 + idle: + +jt07.husk: + Defaults: + Offset: -5,-2 + idle: + Filename: ca|missions/main-campaign/ca43-dissection/jt07.shp + Start: 1 + dead: + Filename: ca|missions/main-campaign/ca43-dissection/jt07.shp + Start: 2 + Length: 8 + Tick: 80 + +jt06: + Defaults: + Filename: ca|missions/main-campaign/ca43-dissection/jt06.shp + Offset: -5,-2 + idle: + +jt06.husk: + Defaults: + Offset: -5,-2 + idle: + Filename: ca|missions/main-campaign/ca43-dissection/jt06.shp + Start: 1 + dead: + Filename: ca|missions/main-campaign/ca43-dissection/jt06.shp + Start: 2 + Length: 8 + Tick: 80 + +jt05: + Defaults: + Filename: ca|missions/main-campaign/ca43-dissection/jt05.shp + Offset: 0,-5 + idle: + +jt05.husk: + Defaults: + Offset: 0,-5 + idle: + Filename: ca|missions/main-campaign/ca43-dissection/jt05.shp + Start: 1 + dead: + Filename: ca|missions/main-campaign/ca43-dissection/jt05.shp + Start: 2 + Length: 8 + Tick: 80 + +jt05b: + Defaults: + Offset: -5,-15 + idle: + Filename: ca|missions/main-campaign/ca43-dissection/jt05.shp + +jt05b.husk: + Defaults: + Offset: -5,-15 + idle: + Filename: ca|missions/main-campaign/ca43-dissection/jt05.shp + Start: 1 + dead: + Filename: ca|missions/main-campaign/ca43-dissection/jt05.shp + Start: 2 + Length: 8 + Tick: 80 + +jt03: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/jt03.shp + +jt03.husk: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/jt03.shp + Start: 1 + dead: + Filename: ca|missions/main-campaign/ca43-dissection/jt03.shp + Start: 2 + Length: 8 + Tick: 80 + +jt02: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/jt02.shp + +jt02.husk: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/jt02.shp + Start: 1 + dead: + Filename: ca|missions/main-campaign/ca43-dissection/jt02.shp + Start: 2 + Length: 8 + Tick: 80 + +jt01: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/jt01.shp + +jt01.husk: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/jt01.shp + Start: 1 + dead: + Filename: ca|missions/main-campaign/ca43-dissection/jt01.shp + Start: 2 + Length: 8 + Tick: 80 + +jt01b: + Defaults: + Offset: -4,-10 + idle: + Filename: ca|missions/main-campaign/ca43-dissection/jt01.shp + +jt01b.husk: + Defaults: + Offset: -4,-10 + idle: + Filename: ca|missions/main-campaign/ca43-dissection/jt01.shp + Start: 1 + dead: + Filename: ca|missions/main-campaign/ca43-dissection/jt01.shp + Start: 2 + Length: 8 + Tick: 80 + +sbush1: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/sbush.shp + Start: 0 + ZOffset: -5000 + +sbush2: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/sbush.shp + Start: 1 + ZOffset: -5000 + +sbush3: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/sbush.shp + Start: 2 + ZOffset: -5000 + +bush1: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/bush.shp + Start: 0 + ZOffset: -5000 + +bush2: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/bush.shp + Start: 1 + ZOffset: -5000 + +bush3: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/bush.shp + Start: 2 + ZOffset: -5000 + +bush4: + Defaults: + Offset: 0,-4 + idle: + Filename: ca|missions/main-campaign/ca43-dissection/bush.shp + Start: 3 + ZOffset: -5000 + +bush5: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/bush.shp + Start: 4 + ZOffset: -5000 + +lbush1: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/lbush.shp + Start: 0 + ZOffset: -5000 + +lbush2: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/lbush.shp + Start: 1 + ZOffset: -5000 diff --git a/mods/ca/missions/main-campaign/ca43-dissection/pinktrees_rul.yaml b/mods/ca/missions/main-campaign/ca43-dissection/pinktrees_rul.yaml new file mode 100644 index 0000000000..8af985fe8d --- /dev/null +++ b/mods/ca/missions/main-campaign/ca43-dissection/pinktrees_rul.yaml @@ -0,0 +1,887 @@ +TREE1: + Inherits: ^Tree + Building: + Footprint: __ x_ + Dimensions: 2,2 + MapEditorData: + ExcludeTilesets: INTERIOR + SpawnActorOnDeath: + Actor: tree1.Husk + RenderSprites: + Palette: medtree + +TREE1.Husk: + Inherits: ^TreeHusk + Building: + Building: + Footprint: __ x_ + Dimensions: 2,2 + MapEditorData: + ExcludeTilesets: INTERIOR + RenderSprites: + Palette: medtree + +TREE2: + Inherits: ^Tree + Building: + Footprint: __ x_ + Dimensions: 2,2 + MapEditorData: + ExcludeTilesets: INTERIOR + SpawnActorOnDeath: + Actor: tree2.Husk + RenderSprites: + Palette: medtree + +TREE2.Husk: + Inherits: ^TreeHusk + Building: + Building: + Footprint: __ x_ + Dimensions: 2,2 + MapEditorData: + ExcludeTilesets: INTERIOR + RenderSprites: + Palette: medtree + +TREE3: + Inherits: ^Tree + Building: + Footprint: __ x_ + Dimensions: 2,2 + MapEditorData: + ExcludeTilesets: INTERIOR + SpawnActorOnDeath: + Actor: tree3.Husk + RenderSprites: + Palette: medtree + +TREE3.Husk: + Inherits: ^TreeHusk + Building: + Building: + Footprint: __ x_ + Dimensions: 2,2 + MapEditorData: + ExcludeTilesets: INTERIOR + RenderSprites: + Palette: medtree + +TREE4: + Inherits: ^Tree + Building: + Footprint: __ x_ + Dimensions: 2,2 + MapEditorData: + ExcludeTilesets: INTERIOR + SpawnActorOnDeath: + Actor: tree4.Husk + RenderSprites: + Palette: medtree + +TREE4.Husk: + Inherits: ^TreeHusk + Building: + Building: + Footprint: __ x_ + Dimensions: 2,2 + MapEditorData: + ExcludeTilesets: INTERIOR + RenderSprites: + Palette: medtree + +TREE5: + Inherits: ^Tree + Building: + Footprint: __ x_ + Dimensions: 2,2 + MapEditorData: + ExcludeTilesets: INTERIOR + SpawnActorOnDeath: + Actor: tree5.Husk + RenderSprites: + Palette: medtree + +TREE5.Husk: + Inherits: ^TreeHusk + Building: + Building: + Footprint: __ x_ + Dimensions: 2,2 + MapEditorData: + ExcludeTilesets: INTERIOR + RenderSprites: + Palette: medtree + +TREE6: + Inherits: ^Tree + Building: + Footprint: __ x_ + Dimensions: 2,2 + MapEditorData: + ExcludeTilesets: INTERIOR + SpawnActorOnDeath: + Actor: tree6.Husk + RenderSprites: + Palette: medtree + +TREE6.Husk: + Inherits: ^TreeHusk + Building: + Building: + Footprint: __ x_ + Dimensions: 2,2 + MapEditorData: + ExcludeTilesets: INTERIOR + RenderSprites: + Palette: medtree + +cypr1: + Inherits: ^Tree + Building: + Footprint: __ x_ + Dimensions: 2,2 + SpawnActorOnDeath: + Actor: cypr1.Husk + RenderSprites: + Palette: medtree + +cypr2: + Inherits: ^Tree + Building: + Footprint: __ x_ + Dimensions: 2,2 + SpawnActorOnDeath: + Actor: cypr2.Husk + RenderSprites: + Palette: medtree + +cypr1.Husk: + Inherits: ^TreeHusk + Building: + Footprint: __ x_ + Dimensions: 2,2 + MapEditorData: + ExcludeTilesets: INTERIOR + RenderSprites: + Palette: medtree + +cypr2.Husk: + Inherits: ^TreeHusk + Building: + Footprint: __ x_ + Dimensions: 2,2 + MapEditorData: + ExcludeTilesets: INTERIOR + RenderSprites: + Palette: medtree + +tg1: + Inherits: ^Tree + Building: + Footprint: x_ + Dimensions: 1,2 + SpawnActorOnDeath: + Actor: tg1.Husk + RenderSprites: + Palette: medtree + +tg2: + Inherits: ^Tree + Building: + Building: + Footprint: x_ + Dimensions: 1,2 + SpawnActorOnDeath: + Actor: tg2.Husk + RenderSprites: + Palette: medtree + +tg1.Husk: + Inherits: ^TreeHusk + Building: + Building: + Footprint: x_ + Dimensions: 1,2 + MapEditorData: + ExcludeTilesets: INTERIOR + RenderSprites: + Palette: medtree + +tg2.Husk: + Inherits: ^TreeHusk + Building: + Building: + Footprint: x_ + Dimensions: 1,2 + MapEditorData: + ExcludeTilesets: INTERIOR + RenderSprites: + Palette: medtree + +tgc1: + Inherits: ^Tree + Building: + Footprint: __ x_ x_ + Dimensions: 2,3 + SpawnActorOnDeath: + Actor: tgc1.Husk + RenderSprites: + Palette: medtree + +tgc1.Husk: + Inherits: ^TreeHusk + Building: + Building: + Footprint: __ x_ x_ + Dimensions: 2,3 + MapEditorData: + ExcludeTilesets: INTERIOR + RenderSprites: + Palette: medtree + +tgc2: + Inherits: ^Tree + Building: + Footprint: __ x_ x_ + Dimensions: 2,3 + SpawnActorOnDeath: + Actor: tgc2.Husk + RenderSprites: + Palette: medtree + +tgc2.Husk: + Inherits: ^TreeHusk + Building: + Building: + Footprint: __ x_ x_ + Dimensions: 2,3 + MapEditorData: + ExcludeTilesets: INTERIOR + RenderSprites: + Palette: medtree + +tgb: + Inherits: ^Tree + Building: + Footprint: ____ __x_ xxx_ + Dimensions: 4,3 + MapEditorData: + ExcludeTilesets: INTERIOR + SpawnActorOnDeath: + Actor: tgb.Husk + RenderSprites: + Palette: medtree + +tgb.Husk: + Inherits: ^TreeHusk + Building: + Building: + Footprint: ____ __x_ xxx_ + Dimensions: 4,3 + MapEditorData: + ExcludeTilesets: INTERIOR + RenderSprites: + Palette: medtree + +tgd: + Inherits: ^Tree + Building: + Footprint: ___ xx_ xx_ + Dimensions: 3,3 + MapEditorData: + ExcludeTilesets: INTERIOR + SpawnActorOnDeath: + Actor: tgd.Husk + RenderSprites: + Palette: medtree + +tgd.Husk: + Inherits: ^TreeHusk + Building: + Building: + Footprint: ___ xx_ xx_ + Dimensions: 3,3 + MapEditorData: + ExcludeTilesets: INTERIOR + RenderSprites: + Palette: medtree + +tgd2: + Inherits: ^Tree + Building: + Footprint: ___ xx_ xx_ + Dimensions: 3,3 + MapEditorData: + ExcludeTilesets: INTERIOR + SpawnActorOnDeath: + Actor: tgd2.Husk + RenderSprites: + Palette: medtree + +tgd2.Husk: + Inherits: ^TreeHusk + Building: + Building: + Footprint: ___ xx_ xx_ + Dimensions: 3,3 + MapEditorData: + ExcludeTilesets: INTERIOR + RenderSprites: + Palette: medtree + +T01: + Inherits: ^Tree + Building: + Footprint: __ x_ + Dimensions: 2,2 + MapEditorData: + ExcludeTilesets: INTERIOR + RenderSprites: + Palette: medtree + SpawnActorOnDeath: + Actor: T01.Husk + +T02: + Inherits: ^Tree + Building: + Footprint: __ x_ + Dimensions: 2,2 + MapEditorData: + ExcludeTilesets: INTERIOR + RenderSprites: + Palette: medtree + SpawnActorOnDeath: + Actor: T02.Husk + +T03: + Inherits: ^Tree + Building: + Footprint: __ x_ + Dimensions: 2,2 + MapEditorData: + ExcludeTilesets: INTERIOR + RenderSprites: + Palette: medtree + SpawnActorOnDeath: + Actor: T03.Husk + +T04: + Inherits: ^Tree + Building: + Footprint: __ x_ + Dimensions: 2,2 + MapEditorData: + ExcludeTilesets: TEMPERAT, SNOW, INTERIOR + SpawnActorOnDeath: + Actor: T04.Husk + +T05: + Inherits: ^Tree + Building: + Footprint: __ x_ + Dimensions: 2,2 + MapEditorData: + ExcludeTilesets: INTERIOR + RenderSprites: + Palette: medtree + SpawnActorOnDeath: + Actor: T05.Husk + +T06: + Inherits: ^Tree + Building: + Footprint: __ x_ + Dimensions: 2,2 + MapEditorData: + ExcludeTilesets: INTERIOR + RenderSprites: + Palette: medtree + SpawnActorOnDeath: + Actor: T06.Husk + +T07: + Inherits: ^Tree + Building: + Footprint: __ x_ + Dimensions: 2,2 + MapEditorData: + ExcludeTilesets: INTERIOR + RenderSprites: + Palette: medtree + SpawnActorOnDeath: + Actor: T07.Husk + +T09: + Inherits: ^Tree + MapEditorData: + ExcludeTilesets: TEMPERAT, SNOW, INTERIOR + SpawnActorOnDeath: + Actor: T09.Husk + +T10: + Inherits: ^Tree + Building: + Footprint: __ xx + Dimensions: 2,2 + MapEditorData: + ExcludeTilesets: INTERIOR + RenderSprites: + Palette: medtree + SpawnActorOnDeath: + Actor: T10.Husk + +T11: + Inherits: ^Tree + Building: + Footprint: __ xx + Dimensions: 2,2 + MapEditorData: + ExcludeTilesets: INTERIOR + RenderSprites: + Palette: medtree + SpawnActorOnDeath: + Actor: T11.Husk + +T12: + Inherits: ^Tree + Building: + Footprint: __ x_ + Dimensions: 2,2 + MapEditorData: + ExcludeTilesets: INTERIOR + RenderSprites: + Palette: medtree + SpawnActorOnDeath: + Actor: T12.Husk + +T13: + Inherits: ^Tree + Building: + Footprint: __ x_ + Dimensions: 2,2 + MapEditorData: + ExcludeTilesets: INTERIOR + RenderSprites: + Palette: medtree + SpawnActorOnDeath: + Actor: T13.Husk + +T14: + Inherits: ^Tree + Building: + Footprint: ___ xx_ + Dimensions: 3,2 + MapEditorData: + ExcludeTilesets: INTERIOR + RenderSprites: + Palette: medtree + SpawnActorOnDeath: + Actor: T14.Husk + +T15: + Inherits: ^Tree + Building: + Footprint: ___ xx_ + Dimensions: 3,2 + MapEditorData: + ExcludeTilesets: INTERIOR + RenderSprites: + Palette: medtree + SpawnActorOnDeath: + Actor: T15.Husk + +T16: + Inherits: ^Tree + Building: + Footprint: __ x_ + Dimensions: 2,2 + MapEditorData: + ExcludeTilesets: INTERIOR + RenderSprites: + Palette: medtree + SpawnActorOnDeath: + Actor: T16.Husk + +T17: + Inherits: ^Tree + Building: + Footprint: __ x_ + Dimensions: 2,2 + MapEditorData: + ExcludeTilesets: INTERIOR + RenderSprites: + Palette: medtree + SpawnActorOnDeath: + Actor: T17.Husk + +TC02: + Inherits: ^Tree + Building: + Footprint: _x_ xx_ + Dimensions: 3,2 + MapEditorData: + ExcludeTilesets: INTERIOR + RenderSprites: + Palette: medtree + SpawnActorOnDeath: + Actor: TC02.Husk + +TC03: + Inherits: ^Tree + Building: + Footprint: xx_ xx_ + Dimensions: 3,2 + MapEditorData: + ExcludeTilesets: INTERIOR + RenderSprites: + Palette: medtree + SpawnActorOnDeath: + Actor: TC03.Husk + +TC04: + Inherits: ^Tree + Building: + Footprint: ____ xxx_ x___ + Dimensions: 4,3 + MapEditorData: + ExcludeTilesets: INTERIOR + RenderSprites: + Palette: medtree + SpawnActorOnDeath: + Actor: TC04.Husk + +TC05: + Inherits: ^Tree + Building: + Footprint: __x_ xxx_ _xx_ + Dimensions: 4,3 + MapEditorData: + ExcludeTilesets: INTERIOR + RenderSprites: + Palette: medtree + SpawnActorOnDeath: + Actor: TC05.Husk + +1x1ruins1: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^1x1 + Building: + Footprint: x + Dimensions: 1, 1 + +1x1ruins2: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^1x1 + Building: + Footprint: x + Dimensions: 1, 1 + +1x1ruins3: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^1x1 + Building: + Footprint: x + Dimensions: 1, 1 + +1x1ruins4: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^1x1 + Building: + Footprint: x + Dimensions: 1, 1 + +1x1ruins5: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^1x1 + Building: + Footprint: x + Dimensions: 1, 1 + +1x1ruins6: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^1x1 + Building: + Footprint: x + Dimensions: 1, 1 + +1x1ruins7: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^1x1 + Building: + Footprint: x + Dimensions: 1, 1 + +1x1ruins8: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^1x1 + Building: + Footprint: x + Dimensions: 1, 1 + +1x1ruins9: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^1x1 + Building: + Footprint: x + Dimensions: 1, 1 + +2x1ruins1: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^1x1 + Building: + Footprint: xx + Dimensions: 2, 1 + +2x1ruins2: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^1x1 + Building: + Footprint: xx + Dimensions: 2, 1 + +2x1stones1: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^2x1 + Building: + Footprint: __ + Dimensions: 2, 1 + +2x1stones2: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^2x1 + Building: + Footprint: __ + Dimensions: 2, 1 + +2x1stones3: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^2x1 + Building: + Footprint: __ + Dimensions: 2, 1 + +1x2stones1: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^1x2 + Building: + Footprint: __ + Dimensions: 1, 2 + +1x2stones2: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^1x2 + Building: + Footprint: __ + Dimensions: 1, 2 + +1x2stones3: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^1x2 + Building: + Footprint: __ + Dimensions: 1, 2 + +1x1rocks1: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^1x1 + Building: + Footprint: x + Dimensions: 1, 1 + +1x1rocks2: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^1x1 + Building: + Footprint: x + Dimensions: 1, 1 + +1x1rocks3: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^1x1 + Building: + Footprint: x + Dimensions: 1, 1 + +2x2rocks1: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^2x2 + Building: + Footprint: xx xx + Dimensions: 2, 2 + +2x2rocks2: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^2x2 + Building: + Footprint: xx xx + Dimensions: 2, 2 + +2x2rocks3: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^2x2 + Building: + Footprint: xx xx + Dimensions: 2, 2 + +2x2rocks4: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^2x2 + Building: + Footprint: xx xx + Dimensions: 2, 2 + +mt1: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^1x2 + Building: + Footprint: xxxx xxxx xxxx xxx_ + Dimensions: 4, 4 + +mt2: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^1x1 + Building: + Footprint: xxxx xxxx xxxx xxx_ + Dimensions: 4, 4 + +1x1searocks1: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^1x1 + Building: + Footprint: x + Dimensions: 1, 1 + +1x1searocks2: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^1x1 + Building: + Footprint: x + Dimensions: 1, 1 + +1x1searocks3: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^1x1 + Building: + Footprint: x + Dimensions: 1, 1 + +2x2searocks1: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^2x2 + Building: + Footprint: xx xx + Dimensions: 2, 2 + +2x2searocks2: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^2x2 + Building: + Footprint: xx xx + Dimensions: 2, 2 + +2x2searocks3: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^2x2 + Building: + Footprint: xx xx + Dimensions: 2, 2 + +2x2searocks4: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^2x2 + Building: + Footprint: xx xx + Dimensions: 2, 2 + +fordhorz: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^2x2 + Building: + Footprint: ____ + Dimensions: 4, 1 + +fordvert: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^2x2 + Building: + Footprint: _ _ _ _ + Dimensions: 1, 4 + +river1: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^2x2 + Building: + Footprint: x x x x x x + Dimensions: 1, 6 + +river2: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^2x2 + Building: + Footprint: xxx xxx xxx + Dimensions: 3, 3 + +river3: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^2x2 + Building: + Footprint: xxx xxx xxx + Dimensions: 3, 3 + +river4: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^2x2 + Building: + Footprint: xx xx xx + Dimensions: 2, 3 + +river5: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^2x2 + Building: + Footprint: xx xx + Dimensions: 2, 2 + +river6: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^2x2 + Building: + Footprint: x x + Dimensions: 1, 2 + +river7: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^1x1 + Building: + Footprint: x + Dimensions: 1, 1 + +temple: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^3x3 + Building: + Footprint: xxx xxx xxx + Dimensions: 3, 3 + Tooltip: + Name: Ruined temple + +grtilled0: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^3x2 + Building: + Footprint: ___ ___ + Dimensions: 3, 2 + +grtilled1: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^2x2 + Building: + Footprint: __ __ + Dimensions: 2, 2 +grtilled2: + Inherits@CMT: ^CustomMapDebris + Inherits@Size: ^2x3 + Building: + Footprint: __ __ __ + Dimensions: 2, 3 diff --git a/mods/ca/missions/main-campaign/ca43-dissection/pinktrees_seq.yaml b/mods/ca/missions/main-campaign/ca43-dissection/pinktrees_seq.yaml new file mode 100644 index 0000000000..994390b21c --- /dev/null +++ b/mods/ca/missions/main-campaign/ca43-dissection/pinktrees_seq.yaml @@ -0,0 +1,445 @@ +tree1: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/trees.shp + Start: 0 + +tree1.husk: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/trees.shp + Start: 1 + +tree2: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/trees.shp + Start: 2 + +tree2.husk: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/trees.shp + Start: 3 + +tree3: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/trees.shp + Start: 4 + +tree3.husk: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/trees.shp + Start: 5 + +tree4: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/trees.shp + Start: 6 + +tree4.husk: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/trees.shp + Start: 7 + +tree5: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/trees.shp + Start: 8 + +tree5.husk: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/trees.shp + Start: 9 + +tree6: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/trees.shp + Start: 10 + +tree6.husk: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/trees.shp + Start: 11 + +cypr1: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/cypr.shp + Start: 0 + +cypr1.husk: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/cypr.shp + Start: 1 + +cypr2: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/cypr.shp + Start: 2 + +cypr2.husk: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/cypr.shp + Start: 3 + +tg1: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/tg.shp + Start: 0 + Offset: 13, -13 + +tg1.husk: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/tg.shp + Start: 1 + Offset: 13, -13 + +tg2: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/tg.shp + Start: 2 + Offset: 13, -13 + +tg2.husk: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/tg.shp + Start: 3 + Offset: 13, -13 + +tgc1: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/tgc.shp + Start: 0 + +tgc1.husk: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/tgc.shp + Start: 1 + +tgc2: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/tgc.shp + Start: 2 + +tgc2.husk: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/tgc.shp + Start: 3 + +tgb: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/tgb.shp + Start: 0 + +tgb.husk: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/tgb.shp + Start: 1 + +tgd: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/tgd.shp + Start: 0 + +tgd.husk: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/tgd.shp + Start: 1 + +tgd2: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/tgd.shp + Start: 2 + +tgd2.husk: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/tgd.shp + Start: 3 + +#Tools +wtrblk: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/wtrblk.shp + Start: 0 + ZOffset: -10000 + +#Debris +1x1ruins1: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/1x1ruins.shp + Start: 0 + ZOffset: -10000 + +1x1ruins2: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/1x1ruins.shp + Start: 1 + ZOffset: -10000 + +1x1ruins3: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/1x1ruins.shp + Start: 2 + ZOffset: -10000 + +1x1ruins4: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/1x1ruins.shp + Start: 3 + ZOffset: -10000 + +1x1ruins5: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/1x1ruins.shp + Start: 4 + ZOffset: -10000 + +1x1ruins6: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/1x1ruins.shp + Start: 5 + ZOffset: -10000 + +1x1ruins7: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/1x1ruins.shp + Start: 6 + ZOffset: -10000 + +1x1ruins8: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/1x1ruins.shp + Start: 7 + ZOffset: -10000 + +1x1ruins9: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/1x1ruins.shp + Start: 8 + ZOffset: -10000 + +2x1ruins1: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/2x1ruins.shp + Start: 0 + ZOffset: -10000 + +2x1ruins2: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/2x1ruins.shp + Start: 1 + ZOffset: -10000 + +2x1stones1: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/2x1stones.shp + Start: 0 + ZOffset: -10000 + +2x1stones2: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/2x1stones.shp + Start: 1 + ZOffset: -10000 + +2x1stones3: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/2x1stones.shp + Start: 2 + ZOffset: -10000 + +1x2stones1: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/1x2stones.shp + Start: 0 + ZOffset: -10000 + +1x2stones2: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/1x2stones.shp + Start: 1 + ZOffset: -10000 + +1x2stones3: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/1x2stones.shp + Start: 2 + ZOffset: -10000 + +1x1rocks1: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/1x1rocks.shp + Start: 0 + ZOffset: -10000 + +1x1rocks2: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/1x1rocks.shp + Start: 1 + ZOffset: -10000 + +1x1rocks3: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/1x1rocks.shp + Start: 2 + ZOffset: -10000 + +2x2rocks1: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/2x2rocks.shp + Start: 0 + ZOffset: -10000 + +2x2rocks2: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/2x2rocks.shp + Start: 1 + ZOffset: -10000 + +2x2rocks3: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/2x2rocks.shp + Start: 2 + ZOffset: -10000 + +2x2rocks4: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/2x2rocks.shp + Start: 3 + ZOffset: -10000 + +mt1: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/mt.shp + Start: 0 + ZOffset: -10000 + +mt2: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/mt.shp + Start: 1 + ZOffset: -10000 + +1x1searocks1: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/1x1searocks.shp + Start: 0 + ZOffset: -10000 + +1x1searocks2: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/1x1searocks.shp + Start: 1 + ZOffset: -10000 + +1x1searocks3: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/1x1searocks.shp + Start: 2 + ZOffset: -10000 + +2x2searocks1: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/2x2searocks.shp + Start: 0 + ZOffset: -10000 + +2x2searocks2: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/2x2searocks.shp + Start: 1 + ZOffset: -10000 + +2x2searocks3: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/2x2searocks.shp + Start: 2 + ZOffset: -10000 + +2x2searocks4: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/2x2searocks.shp + Start: 3 + ZOffset: -10000 + +fordhorz: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/ford.shp + Start: 0 + ZOffset: -10000 + +fordvert: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/ford1.shp + Start: 0 + ZOffset: -10000 + +river1: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/river1.shp + Start: 0 + ZOffset: -10000 + +river2: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/river2.shp + Start: 0 + ZOffset: -10000 + +river3: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/river3.shp + Start: 0 + ZOffset: -10000 + +river4: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/river4.shp + Start: 0 + ZOffset: -10000 + +river5: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/river5.shp + Start: 0 + ZOffset: -10000 + +river6: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/river6.shp + Start: 0 + ZOffset: -10000 + +river7: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/river7.shp + Start: 0 + ZOffset: -10000 + +temple: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/temple.shp + Start: 0 + +#Fields +grtilled0: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/grtilled.shp + Start: 0 + ZOffset: -10000 + +grtilled1: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/grtilledsm.shp + Start: 0 + ZOffset: -10000 + +grtilled2: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/grtilledlong.shp + Start: 0 + ZOffset: -10000 + +1x2grebld: + idle: + Filename: ca|missions/main-campaign/ca43-dissection/1x2grebld.shp + Start: 0 + damaged-idle: + Filename: ca|missions/main-campaign/ca43-dissection/1x2grebld.shp + Start: 1 diff --git a/mods/ca/missions/main-campaign/ca43-dissection/r_bombingrun.aud b/mods/ca/missions/main-campaign/ca43-dissection/r_bombingrun.aud new file mode 100644 index 0000000000..460458ecc5 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/r_bombingrun.aud differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/r_transfer.aud b/mods/ca/missions/main-campaign/ca43-dissection/r_transfer.aud new file mode 100644 index 0000000000..b6cb6a7c02 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/r_transfer.aud differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/river1.shp b/mods/ca/missions/main-campaign/ca43-dissection/river1.shp new file mode 100644 index 0000000000..8b3f718546 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/river1.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/river2.shp b/mods/ca/missions/main-campaign/ca43-dissection/river2.shp new file mode 100644 index 0000000000..93f315ed1f Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/river2.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/river3.shp b/mods/ca/missions/main-campaign/ca43-dissection/river3.shp new file mode 100644 index 0000000000..2d87e949a4 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/river3.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/river4.shp b/mods/ca/missions/main-campaign/ca43-dissection/river4.shp new file mode 100644 index 0000000000..f51981c94b Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/river4.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/river5.shp b/mods/ca/missions/main-campaign/ca43-dissection/river5.shp new file mode 100644 index 0000000000..ad4f51ef46 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/river5.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/river6.shp b/mods/ca/missions/main-campaign/ca43-dissection/river6.shp new file mode 100644 index 0000000000..1347cea094 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/river6.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/river7.shp b/mods/ca/missions/main-campaign/ca43-dissection/river7.shp new file mode 100644 index 0000000000..b06ce0f0d7 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/river7.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/sbush.shp b/mods/ca/missions/main-campaign/ca43-dissection/sbush.shp new file mode 100644 index 0000000000..612d179bee Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/sbush.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/sbush2.shp b/mods/ca/missions/main-campaign/ca43-dissection/sbush2.shp new file mode 100644 index 0000000000..c285647792 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/sbush2.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/temple.shp b/mods/ca/missions/main-campaign/ca43-dissection/temple.shp new file mode 100644 index 0000000000..24ef5dfdb3 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/temple.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/tg.shp b/mods/ca/missions/main-campaign/ca43-dissection/tg.shp new file mode 100644 index 0000000000..8d2ff7dc4f Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/tg.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/tgb.shp b/mods/ca/missions/main-campaign/ca43-dissection/tgb.shp new file mode 100644 index 0000000000..6bb73821b4 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/tgb.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/tgc.shp b/mods/ca/missions/main-campaign/ca43-dissection/tgc.shp new file mode 100644 index 0000000000..6e5c44471c Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/tgc.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/tgd.shp b/mods/ca/missions/main-campaign/ca43-dissection/tgd.shp new file mode 100644 index 0000000000..6650bff308 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/tgd.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/trees.shp b/mods/ca/missions/main-campaign/ca43-dissection/trees.shp new file mode 100644 index 0000000000..a88d0040ef Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/trees.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/tuareg.shp b/mods/ca/missions/main-campaign/ca43-dissection/tuareg.shp new file mode 100644 index 0000000000..e124f1abda Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/tuareg.shp differ diff --git a/mods/ca/missions/main-campaign/ca43-dissection/wtrblk.shp b/mods/ca/missions/main-campaign/ca43-dissection/wtrblk.shp new file mode 100644 index 0000000000..5cbe0a1a00 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca43-dissection/wtrblk.shp differ diff --git a/mods/ca/missions/main-campaign/ca44-trepidation/map.bin b/mods/ca/missions/main-campaign/ca44-trepidation/map.bin new file mode 100644 index 0000000000..b6d4a8e48f Binary files /dev/null and b/mods/ca/missions/main-campaign/ca44-trepidation/map.bin differ diff --git a/mods/ca/missions/main-campaign/ca44-trepidation/map.png b/mods/ca/missions/main-campaign/ca44-trepidation/map.png new file mode 100644 index 0000000000..0abf7e1dc7 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca44-trepidation/map.png differ diff --git a/mods/ca/missions/main-campaign/ca44-trepidation/map.yaml b/mods/ca/missions/main-campaign/ca44-trepidation/map.yaml new file mode 100644 index 0000000000..4a398df8db --- /dev/null +++ b/mods/ca/missions/main-campaign/ca44-trepidation/map.yaml @@ -0,0 +1,2003 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 44: Trepidation + +Author: Darkademic + +Tileset: DESERT + +MapSize: 98,100 + +Bounds: 1,1,96,98 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: Greece, USSR, Scrin + PlayerReference@Greece: + Name: Greece + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: allies + LockColor: True + Color: 99ACF2 + LockSpawn: True + LockTeam: True + Allies: England + Enemies: USSR, Scrin, Creeps + PlayerReference@USSR: + Name: USSR + Bot: campaign + Faction: soviet + Color: FE1100 + Allies: Scrin + Enemies: Greece, Creeps + PlayerReference@Scrin: + Name: Scrin + Bot: campaign + Faction: scrin + Color: 7700FF + Allies: USSR + Enemies: Greece, Creeps + PlayerReference@England: + Name: England + Faction: allies + Color: A1EF8C + Allies: Greece + Enemies: USSR, Scrin, Creeps + +Actors: + Tanya: e7 + Owner: Greece + Location: 87,91 + SubCell: 3 + Facing: 384 + Actor225: rock2 + Owner: Neutral + Location: 13,1 + Actor227: rock3 + Owner: Neutral + Location: 32,1 + Actor228: brik + Owner: USSR + Location: 53,2 + Actor229: brik + Owner: USSR + Location: 54,2 + Actor230: brik + Owner: USSR + Location: 52,2 + Actor231: brik + Owner: USSR + Location: 51,2 + Actor232: brik + Owner: USSR + Location: 50,2 + Actor233: brik + Owner: USSR + Location: 49,2 + Actor234: brik + Owner: USSR + Location: 48,2 + Actor235: brik + Owner: USSR + Location: 47,2 + Actor236: brik + Owner: USSR + Location: 46,2 + Actor241: brik + Owner: USSR + Location: 53,3 + Actor242: brik + Owner: USSR + Location: 54,3 + Actor243: brik + Owner: USSR + Location: 46,3 + Actor244: brik + Owner: USSR + Location: 46,4 + Actor248: brik + Owner: USSR + Location: 58,2 + Actor249: brik + Owner: USSR + Location: 59,2 + Actor250: brik + Owner: USSR + Location: 60,2 + Actor251: brik + Owner: USSR + Location: 61,2 + Actor252: brik + Owner: USSR + Location: 62,2 + Actor253: brik + Owner: USSR + Location: 63,2 + Actor254: brik + Owner: USSR + Location: 64,2 + Actor255: brik + Owner: USSR + Location: 64,2 + Actor256: brik + Owner: USSR + Location: 65,2 + Actor259: brik + Owner: USSR + Location: 58,3 + Actor260: brik + Owner: USSR + Location: 59,3 + Actor264: brik + Owner: USSR + Location: 66,4 + Actor265: brik + Owner: USSR + Location: 66,2 + Actor266: brik + Owner: USSR + Location: 66,3 + Actor267: brik + Owner: USSR + Location: 67,4 + Actor269: brik + Owner: USSR + Location: 68,4 + Actor270: brik + Owner: USSR + Location: 69,4 + Actor273: brik + Owner: USSR + Location: 43,10 + Actor274: brik + Owner: USSR + Location: 43,8 + Actor278: brik + Owner: USSR + Location: 43,9 + Actor285: brik + Owner: USSR + Location: 43,11 + Actor291: brik + Owner: USSR + Location: 43,15 + Actor292: brik + Owner: USSR + Location: 46,5 + Actor293: brik + Owner: USSR + Location: 46,6 + Actor294: brik + Owner: USSR + Location: 46,8 + Actor295: brik + Owner: USSR + Location: 46,7 + Actor296: brik + Owner: USSR + Location: 45,8 + Actor297: brik + Owner: USSR + Location: 44,8 + Actor298: brik + Owner: USSR + Location: 44,11 + Actor299: brik + Owner: USSR + Location: 44,10 + Actor328: brik + Owner: USSR + Location: 44,15 + Actor344: brik + Owner: USSR + Location: 69,5 + Actor345: brik + Owner: USSR + Location: 69,6 + Actor346: brik + Owner: USSR + Location: 69,7 + Actor347: brik + Owner: USSR + Location: 70,7 + Actor348: brik + Owner: USSR + Location: 71,7 + Actor349: brik + Owner: USSR + Location: 72,7 + Actor350: brik + Owner: USSR + Location: 73,7 + Actor351: brik + Owner: USSR + Location: 73,8 + Actor352: brik + Owner: USSR + Location: 73,9 + Actor353: brik + Owner: USSR + Location: 73,10 + Actor354: brik + Owner: USSR + Location: 72,10 + Actor355: brik + Owner: USSR + Location: 72,9 + Actor376: brik + Owner: USSR + Location: 73,14 + Actor377: brik + Owner: USSR + Location: 72,14 + Actor378: brik + Owner: USSR + Location: 72,15 + Actor379: brik + Owner: USSR + Location: 73,15 + Actor386: rock2 + Owner: Neutral + Location: 92,14 + Actor391: brik + Owner: USSR + Location: 43,16 + Actor393: brik + Owner: USSR + Location: 43,18 + Actor394: brik + Owner: USSR + Location: 43,17 + Actor395: brik + Owner: USSR + Location: 43,19 + Actor396: brik + Owner: USSR + Location: 43,20 + Actor397: brik + Owner: USSR + Location: 43,21 + Actor407: brik + Owner: USSR + Location: 43,22 + Actor408: brik + Owner: USSR + Location: 43,23 + Actor421: brik + Owner: USSR + Location: 44,16 + Actor422: brik + Owner: USSR + Location: 44,23 + Actor423: brik + Owner: USSR + Location: 46,23 + Actor424: brik + Owner: USSR + Location: 45,23 + Actor425: brik + Owner: USSR + Location: 47,23 + Actor426: brik + Owner: USSR + Location: 48,23 + Actor427: brik + Owner: USSR + Location: 49,23 + Actor428: brik + Owner: USSR + Location: 49,24 + Actor436: brik + Owner: USSR + Location: 49,25 + Actor437: brik + Owner: USSR + Location: 49,26 + Actor438: brik + Owner: USSR + Location: 51,26 + Actor439: brik + Owner: USSR + Location: 50,26 + Actor440: brik + Owner: USSR + Location: 52,26 + Actor441: brik + Owner: USSR + Location: 52,25 + Actor442: brik + Owner: USSR + Location: 51,25 + Actor451: brik + Owner: USSR + Location: 60,25 + Actor452: brik + Owner: USSR + Location: 60,26 + Actor453: brik + Owner: USSR + Location: 61,26 + Actor454: brik + Owner: USSR + Location: 61,25 + Actor455: brik + Owner: USSR + Location: 62,26 + Actor456: brik + Owner: USSR + Location: 63,26 + Actor457: brik + Owner: USSR + Location: 65,26 + Actor458: brik + Owner: USSR + Location: 64,26 + Actor459: brik + Owner: USSR + Location: 73,16 + Actor460: brik + Owner: USSR + Location: 73,17 + Actor461: brik + Owner: USSR + Location: 73,19 + Actor462: brik + Owner: USSR + Location: 73,18 + Actor463: brik + Owner: USSR + Location: 73,20 + Actor464: brik + Owner: USSR + Location: 73,22 + Actor465: brik + Owner: USSR + Location: 73,21 + Actor466: brik + Owner: USSR + Location: 73,23 + Actor467: brik + Owner: USSR + Location: 73,24 + Actor475: brik + Owner: USSR + Location: 66,26 + Actor476: brik + Owner: USSR + Location: 67,26 + Actor477: brik + Owner: USSR + Location: 68,26 + Actor478: brik + Owner: USSR + Location: 69,26 + Actor479: brik + Owner: USSR + Location: 70,26 + Actor480: brik + Owner: USSR + Location: 71,26 + Actor481: brik + Owner: USSR + Location: 72,26 + Actor482: brik + Owner: USSR + Location: 72,25 + Actor483: brik + Owner: USSR + Location: 73,25 + Actor484: brik + Owner: USSR + Location: 73,26 + Actor485: tc01 + Owner: Neutral + Location: 87,24 + Actor492: t04 + Owner: Neutral + Location: 81,27 + Actor123: ptur + Owner: Scrin + Location: 48,59 + TurretFacing: 668 + Actor124: ptur + Owner: Scrin + Location: 50,67 + TurretFacing: 668 + Actor125: scol + Owner: Scrin + Location: 52,49 + Actor126: scol + Owner: Scrin + Location: 51,53 + Actor128: split2 + Owner: Neutral + Location: 50,30 + Actor130: split2 + Owner: Neutral + Location: 65,30 + Actor131: split2 + Owner: Neutral + Location: 70,29 + Actor132: split2 + Owner: Neutral + Location: 17,26 + Actor133: split2 + Owner: Neutral + Location: 9,26 + Actor134: split2 + Owner: Neutral + Location: 11,19 + Actor135: ftur + Owner: USSR + Location: 52,27 + Actor136: ftur + Owner: USSR + Location: 60,27 + Actor137: ftur + Owner: USSR + Location: 74,14 + Actor138: ftur + Owner: USSR + Location: 74,10 + Actor139: ftur + Owner: USSR + Location: 42,15 + Actor140: ftur + Owner: USSR + Location: 42,11 + Actor141: sam + Owner: USSR + Location: 69,25 + Actor143: sam + Owner: USSR + Location: 44,22 + Actor144: sam + Owner: USSR + Location: 51,11 + Actor145: sam + Owner: USSR + Location: 69,8 + Actor146: sam + Owner: USSR + Location: 47,3 + Actor147: tsla + Owner: USSR + Location: 62,25 + Actor148: tsla + Owner: USSR + Location: 50,25 + Actor149: tsla + Owner: USSR + Location: 44,17 + Actor150: tsla + Owner: USSR + Location: 44,9 + Actor151: tsla + Owner: USSR + Location: 72,16 + Actor152: tsla + Owner: USSR + Location: 72,8 + Actor154: iron + Owner: USSR + Location: 57,11 + Actor156: dog + Owner: USSR + Location: 45,15 + SubCell: 3 + Facing: 245 + Actor157: dog + Owner: USSR + Location: 45,11 + SubCell: 3 + Facing: 613 + Actor158: dog + Owner: USSR + Location: 53,25 + SubCell: 3 + Facing: 709 + Actor159: dog + Owner: USSR + Facing: 384 + Location: 56,24 + SubCell: 3 + Actor160: dog + Owner: USSR + Location: 59,25 + SubCell: 3 + Facing: 259 + Actor161: dog + Owner: USSR + Location: 73,13 + SubCell: 3 + Facing: 716 + Actor162: dog + Owner: USSR + Location: 73,11 + SubCell: 3 + Facing: 757 + Actor163: dog + Owner: USSR + Location: 55,2 + SubCell: 3 + Facing: 661 + Actor164: e1 + Owner: USSR + Location: 74,15 + SubCell: 3 + Facing: 552 + Actor165: e1 + Owner: USSR + Location: 75,10 + SubCell: 3 + Facing: 736 + Actor166: e1 + Owner: USSR + Location: 76,13 + SubCell: 3 + Facing: 620 + Actor167: e1 + Owner: USSR + Location: 53,25 + SubCell: 1 + Facing: 593 + Actor169: e1 + Owner: USSR + Location: 59,26 + SubCell: 3 + Facing: 143 + Actor170: e1 + Owner: USSR + Location: 45,16 + SubCell: 3 + Facing: 109 + Actor171: e1 + Owner: USSR + Facing: 384 + Location: 45,11 + SubCell: 1 + Actor173: tpwr + Owner: USSR + Location: 63,23 + Actor174: tpwr + Owner: USSR + Location: 66,23 + Actor175: tpwr + Owner: USSR + Location: 66,20 + Actor176: tpwr + Owner: USSR + Location: 70,18 + Actor177: tpwr + Owner: USSR + Location: 70,21 + Actor178: fix + Owner: USSR + Location: 53,20 + Actor180: stek + Owner: USSR + Location: 60,12 + Actor181: dome + Owner: USSR + Location: 45,18 + Actor172: fact + Owner: USSR + Location: 47,5 + Actor182: weap + Owner: USSR + Location: 66,5 + Actor183: proc + Owner: USSR + Location: 50,17 + Actor185: afld + Owner: USSR + Location: 49,12 + Actor179: afld + Owner: USSR + Location: 49,14 + Actor184: mslo + Owner: USSR + Location: 60,16 + Actor188: tpwr + Owner: USSR + Location: 53,7 + Actor189: tpwr + Owner: USSR + Location: 57,6 + Actor190: tpwr + Owner: USSR + Location: 63,3 + Actor186: tpwr + Owner: USSR + Location: 61,7 + Actor191: barr + Owner: USSR + Location: 66,10 + Actor193: swal + Owner: Scrin + Location: 11,32 + Actor194: swal + Owner: Scrin + Location: 11,33 + Actor195: swal + Owner: Scrin + Location: 10,32 + Actor196: swal + Owner: Scrin + Location: 10,33 + Actor197: swal + Owner: Scrin + Location: 9,32 + Actor198: swal + Owner: Scrin + Location: 7,32 + Actor199: swal + Owner: Scrin + Location: 8,32 + Actor200: swal + Owner: Scrin + Location: 6,32 + Actor201: swal + Owner: Scrin + Location: 5,32 + Actor202: swal + Owner: Scrin + Location: 4,32 + Actor203: swal + Owner: Scrin + Location: 3,33 + Actor204: swal + Owner: Scrin + Location: 4,33 + Actor205: swal + Owner: Scrin + Location: 3,34 + Actor206: swal + Owner: Scrin + Location: 3,35 + Actor207: swal + Owner: Scrin + Location: 3,36 + Actor208: swal + Owner: Scrin + Location: 3,37 + Actor209: swal + Owner: Scrin + Location: 3,38 + Actor210: swal + Owner: Scrin + Location: 3,39 + Actor211: swal + Owner: Scrin + Location: 3,40 + Actor212: swal + Owner: Scrin + Location: 4,40 + Actor213: swal + Owner: Scrin + Location: 4,41 + Actor214: swal + Owner: Scrin + Location: 4,42 + Actor215: swal + Owner: Scrin + Location: 4,43 + Actor216: swal + Owner: Scrin + Location: 4,44 + Actor217: swal + Owner: Scrin + Location: 4,45 + Actor218: swal + Owner: Scrin + Location: 4,46 + Actor219: swal + Owner: Scrin + Location: 4,47 + Actor220: swal + Owner: Scrin + Location: 5,47 + Actor221: swal + Owner: Scrin + Location: 7,47 + Actor222: swal + Owner: Scrin + Location: 9,47 + Actor223: swal + Owner: Scrin + Location: 11,47 + Actor224: swal + Owner: Scrin + Location: 10,47 + Actor226: swal + Owner: Scrin + Location: 8,47 + Actor237: swal + Owner: Scrin + Location: 6,47 + Actor238: swal + Owner: Scrin + Location: 12,47 + Actor239: swal + Owner: Scrin + Location: 12,46 + Actor240: swal + Owner: Scrin + Location: 11,46 + Actor245: swal + Owner: Scrin + Location: 17,46 + Actor246: swal + Owner: Scrin + Location: 17,47 + Actor247: swal + Owner: Scrin + Location: 19,47 + Actor257: swal + Owner: Scrin + Location: 18,47 + Actor258: swal + Owner: Scrin + Location: 18,46 + Actor261: swal + Owner: Scrin + Location: 20,46 + Actor262: swal + Owner: Scrin + Location: 20,47 + Actor263: swal + Owner: Scrin + Location: 21,46 + Actor268: swal + Owner: Scrin + Location: 22,46 + Actor271: swal + Owner: Scrin + Location: 22,45 + Actor272: swal + Owner: Scrin + Location: 21,45 + Actor275: swal + Owner: Scrin + Location: 22,44 + Actor276: swal + Owner: Scrin + Location: 23,45 + Actor277: swal + Owner: Scrin + Location: 23,44 + Actor279: swal + Owner: Scrin + Location: 24,44 + Actor280: swal + Owner: Scrin + Location: 24,43 + Actor281: swal + Owner: Scrin + Location: 23,43 + Actor282: swal + Owner: Scrin + Location: 25,43 + Actor283: swal + Owner: Scrin + Location: 25,42 + Actor284: swal + Owner: Scrin + Location: 24,42 + Actor286: swal + Owner: Scrin + Location: 26,42 + Actor287: swal + Owner: Scrin + Location: 26,41 + Actor288: swal + Owner: Scrin + Location: 25,41 + Actor289: swal + Owner: Scrin + Location: 26,40 + Actor290: swal + Owner: Scrin + Location: 26,39 + Actor300: swal + Owner: Scrin + Location: 26,38 + Actor301: swal + Owner: Scrin + Location: 26,37 + Actor302: swal + Owner: Scrin + Location: 27,37 + Actor303: swal + Owner: Scrin + Location: 27,36 + Actor304: swal + Owner: Scrin + Location: 26,36 + Actor305: swal + Owner: Scrin + Location: 27,35 + Actor306: swal + Owner: Scrin + Location: 27,34 + Actor307: swal + Owner: Scrin + Location: 27,33 + Actor308: swal + Owner: Scrin + Location: 27,32 + Actor309: swal + Owner: Scrin + Location: 26,32 + Actor310: swal + Owner: Scrin + Location: 26,33 + Actor311: swal + Owner: Scrin + Location: 20,31 + Actor312: swal + Owner: Scrin + Location: 21,31 + Actor313: swal + Owner: Scrin + Location: 20,32 + Actor314: swal + Owner: Scrin + Location: 21,32 + Actor315: swal + Owner: Scrin + Location: 19,31 + Actor316: swal + Owner: Scrin + Location: 18,31 + Actor317: swal + Owner: Scrin + Location: 17,32 + Actor318: swal + Owner: Scrin + Location: 17,31 + Actor319: swal + Owner: Scrin + Location: 18,32 + Actor320: proc.scrin + Owner: Scrin + Location: 18,32 + Actor321: ptur + Owner: Scrin + Location: 11,48 + Actor322: ptur + Owner: Scrin + Location: 18,48 + Actor323: ptur + Owner: Scrin + Location: 26,31 + Actor324: scol + Owner: Scrin + Location: 10,46 + Actor325: scol + Owner: Scrin + Location: 19,46 + Actor327: wsph + Owner: Scrin + Location: 18,38 + Actor329: nerv + Owner: Scrin + Location: 4,37 + Actor330: grav + Owner: Scrin + Location: 5,44 + Actor331: shar + Owner: Scrin + Location: 21,44 + Actor332: shar + Owner: Scrin + Location: 23,42 + Actor333: rea2 + Owner: Scrin + Location: 7,40 + Actor334: rea2 + Owner: Scrin + Location: 7,37 + Actor336: reac + Owner: Scrin + Location: 24,38 + Actor337: reac + Owner: Scrin + Location: 4,34 + Actor335: rea2 + Owner: Scrin + Location: 7,34 + Actor326: port + Owner: Scrin + Location: 15,41 + Actor338: srep + Owner: Scrin + Location: 11,39 + Actor339: rock6 + Owner: Neutral + Faction: scrin + Location: 10,65 + Actor340: rock3 + Owner: Neutral + Faction: scrin + Location: 36,33 + Actor341: v20 + Owner: Neutral + Location: 89,57 + Actor342: v10 + Owner: Neutral + Location: 90,66 + Actor343: v24 + Owner: Neutral + Location: 85,60 + Actor356: v25 + Owner: Neutral + Location: 88,61 + Actor357: t18 + Owner: Neutral + Location: 90,56 + Actor358: v28 + Owner: Neutral + Location: 87,54 + Actor359: v21 + Owner: Neutral + Location: 81,64 + Actor360: v22 + Owner: Neutral + Location: 94,52 + Actor361: rock2 + Owner: Neutral + Location: 80,73 + Actor364: split2 + Owner: Neutral + Location: 9,92 + Actor365: split2 + Owner: Neutral + Location: 20,76 + Actor363: split3 + Owner: Neutral + Location: 41,51 + Actor366: split3 + Owner: Neutral + Location: 46,50 + Actor367: apoc + Owner: USSR + Location: 78,15 + Facing: 641 + Actor368: apoc + Owner: USSR + Location: 54,34 + Facing: 518 + Actor369: btr.ai + Owner: USSR + Facing: 384 + Location: 59,23 + Actor370: btr.ai + Owner: USSR + Facing: 384 + Location: 47,20 + Actor372: btr.ai + Owner: USSR + Facing: 384 + Location: 50,7 + Actor373: btr.ai + Owner: USSR + Location: 64,9 + Facing: 620 + Actor374: 4tnk + Owner: USSR + Facing: 384 + Location: 40,19 + Actor375: 4tnk + Owner: USSR + Facing: 384 + Location: 41,26 + Actor380: 4tnk + Owner: USSR + Location: 61,33 + Facing: 518 + Actor381: isu + Owner: USSR + Location: 79,10 + Facing: 620 + Actor382: 3tnk + Owner: USSR + Location: 78,18 + Facing: 641 + Actor383: 3tnk + Owner: USSR + Location: 81,16 + Facing: 641 + Actor384: 3tnk + Owner: USSR + Location: 58,34 + Facing: 512 + Actor385: 3tnk + Owner: USSR + Facing: 384 + Location: 38,23 + Actor387: v2rl + Owner: USSR + Facing: 384 + Location: 62,15 + Actor388: v2rl + Owner: USSR + Facing: 384 + Location: 56,11 + Actor389: v2rl + Owner: USSR + Facing: 384 + Location: 45,9 + Actor390: v2rl + Owner: USSR + Facing: 384 + Location: 48,22 + Actor392: 4tnk + Owner: USSR + Location: 59,49 + Facing: 511 + Actor398: 3tnk + Owner: USSR + Location: 56,52 + Facing: 512 + Actor399: 3tnk + Owner: USSR + Location: 62,51 + Facing: 512 + Actor400: btr.ai + Owner: USSR + Location: 59,52 + Facing: 512 + Actor401: ttra + Owner: USSR + Facing: 384 + Location: 51,16 + Actor187: sam + Owner: USSR + Location: 58,13 + Actor402: ctnk + Owner: Greece + Location: 86,93 + Facing: 128 + Actor403: ctnk + Owner: Greece + Location: 89,90 + Facing: 128 + Actor404: ttnk + Owner: USSR + Location: 37,84 + Facing: 920 + Actor406: ruin + Owner: Scrin + Location: 37,47 + Facing: 736 + Actor409: ruin + Owner: Scrin + Location: 9,46 + Facing: 552 + Actor410: ruin + Owner: Scrin + Location: 25,37 + Facing: 695 + Actor411: ruin + Owner: Scrin + Location: 20,45 + Facing: 600 + TurretFacing: 1023 + Actor412: corr + Owner: Scrin + Facing: 384 + Location: 43,49 + Actor413: corr + Owner: Scrin + Location: 21,79 + Facing: 600 + Actor414: seek + Owner: Scrin + Location: 47,62 + Facing: 811 + Actor415: seek + Owner: Scrin + Location: 47,64 + Facing: 791 + Actor416: s1 + Owner: Scrin + Location: 58,52 + SubCell: 3 + Facing: 668 + Actor417: s1 + Owner: Scrin + Facing: 384 + Location: 56,51 + SubCell: 3 + Actor418: s1 + Owner: Scrin + Location: 47,61 + SubCell: 3 + Facing: 784 + Actor419: s1 + Owner: Scrin + Location: 43,64 + SubCell: 3 + Facing: 729 + Actor420: s1 + Owner: Scrin + Facing: 384 + Location: 44,53 + SubCell: 3 + Actor429: s1 + Owner: Scrin + Facing: 384 + Location: 32,49 + SubCell: 3 + Actor430: s1 + Owner: Scrin + Location: 9,49 + SubCell: 3 + Facing: 804 + Actor431: s1 + Owner: Scrin + Location: 10,49 + SubCell: 3 + Facing: 668 + Actor432: s1 + Owner: Scrin + Location: 22,49 + SubCell: 3 + Facing: 702 + Actor433: s1 + Owner: Scrin + Location: 23,47 + SubCell: 3 + Facing: 688 + Actor434: s1 + Owner: Scrin + Facing: 384 + Location: 28,44 + SubCell: 3 + Actor435: s1 + Owner: Scrin + Facing: 384 + Location: 22,37 + SubCell: 3 + Actor443: s1 + Owner: Scrin + Facing: 384 + Location: 11,37 + SubCell: 3 + Actor444: s1 + Owner: Scrin + Facing: 384 + Location: 6,40 + SubCell: 3 + Actor445: s1 + Owner: Scrin + Facing: 384 + Location: 6,37 + SubCell: 3 + Actor446: s1 + Owner: Scrin + Facing: 384 + Location: 9,33 + SubCell: 3 + Actor447: s1 + Owner: Scrin + Facing: 384 + Location: 24,77 + SubCell: 3 + Actor448: s1 + Owner: Scrin + Facing: 384 + Location: 24,73 + SubCell: 3 + Actor449: s1 + Owner: Scrin + Facing: 384 + Location: 14,59 + SubCell: 3 + Actor450: s1 + Owner: Scrin + Location: 10,58 + SubCell: 3 + Facing: 634 + Actor468: s1 + Owner: Scrin + Facing: 384 + Location: 8,64 + SubCell: 3 + Actor469: s4 + Owner: Scrin + Location: 10,64 + SubCell: 3 + Facing: 620 + Actor470: s4 + Owner: Scrin + Facing: 384 + Location: 9,58 + SubCell: 3 + Actor471: evis + Owner: Scrin + Facing: 384 + Location: 43,47 + SubCell: 3 + Actor472: evis + Owner: Scrin + Location: 25,73 + SubCell: 3 + Facing: 647 + Actor473: s3 + Owner: Scrin + Facing: 384 + Location: 8,43 + SubCell: 3 + Actor474: s3 + Owner: Scrin + Facing: 384 + Location: 10,36 + SubCell: 3 + Actor486: s3 + Owner: Scrin + Facing: 384 + Location: 26,35 + SubCell: 3 + Actor487: s3 + Owner: Scrin + Facing: 384 + Location: 20,41 + SubCell: 3 + Actor488: s3 + Owner: Scrin + Location: 17,60 + SubCell: 3 + Facing: 634 + Actor489: s3 + Owner: Scrin + Facing: 384 + Location: 11,51 + SubCell: 3 + Actor490: s3 + Owner: Scrin + Location: 30,47 + SubCell: 3 + Facing: 736 + Actor491: tpod + Owner: Scrin + Location: 12,44 + Facing: 600 + Actor493: tpod + Owner: Scrin + Facing: 384 + Location: 24,35 + Actor495: rtpd + Owner: Scrin + Location: 63,28 + Facing: 606 + Actor496: shrw + Owner: Scrin + Location: 30,45 + Facing: 552 + Actor497: shrw + Owner: Scrin + Location: 22,48 + Facing: 606 + Actor498: shrw + Owner: Scrin + Location: 11,50 + Facing: 586 + Actor500: devo + Owner: Scrin + Location: 12,82 + Facing: 384 + Actor501: s1 + Owner: Scrin + Facing: 384 + Location: 13,82 + SubCell: 3 + Actor502: s1 + Owner: Scrin + Facing: 384 + Location: 12,81 + SubCell: 3 + Actor503: s1 + Owner: Scrin + Facing: 384 + Location: 10,83 + SubCell: 3 + Actor504: s1 + Owner: Scrin + Facing: 384 + Location: 17,84 + SubCell: 3 + Actor505: s1 + Owner: Scrin + Facing: 384 + Location: 35,76 + SubCell: 3 + Actor506: e1 + Owner: USSR + Location: 68,87 + SubCell: 3 + Facing: 620 + Actor507: e1 + Owner: USSR + Location: 70,85 + SubCell: 3 + Facing: 668 + Actor508: e1 + Owner: USSR + Facing: 384 + Location: 73,83 + SubCell: 3 + Actor510: e1 + Owner: USSR + Location: 65,87 + SubCell: 3 + Facing: 811 + Actor511: e3 + Owner: USSR + Location: 68,84 + SubCell: 3 + Facing: 538 + Actor509: e2 + Owner: USSR + Location: 69,83 + SubCell: 3 + Facing: 491 + Actor512: 3tnk + Owner: USSR + Location: 55,82 + Facing: 384 + Actor514: v2rl + Owner: USSR + Location: 83,73 + Facing: 384 + Actor516: 3tnk + Owner: USSR + Location: 72,70 + Facing: 128 + Actor519: dog + Owner: USSR + Location: 72,73 + SubCell: 3 + Facing: 150 + Actor520: dog + Owner: USSR + Location: 73,69 + SubCell: 3 + Facing: 177 + Actor521: dog + Owner: USSR + Facing: 384 + Location: 93,61 + SubCell: 3 + Actor522: dog + Owner: USSR + Facing: 384 + Location: 86,43 + SubCell: 3 + Actor523: dog + Owner: USSR + Facing: 384 + Location: 80,24 + SubCell: 3 + Actor524: dog + Owner: USSR + Facing: 384 + Location: 59,37 + SubCell: 3 + Actor525: e1 + Owner: USSR + Facing: 384 + Location: 59,36 + SubCell: 3 + Actor526: e1 + Owner: USSR + Facing: 384 + Location: 81,24 + SubCell: 3 + Actor528: e1 + Owner: USSR + Facing: 384 + Location: 93,60 + SubCell: 3 + Actor529: e1 + Owner: USSR + Location: 85,62 + SubCell: 3 + Facing: 511 + Actor530: e1 + Owner: USSR + Location: 86,66 + SubCell: 3 + Facing: 600 + Actor531: e1 + Owner: USSR + Location: 86,55 + SubCell: 3 + Facing: 531 + Actor532: e1 + Owner: USSR + Facing: 384 + Location: 93,53 + SubCell: 3 + Actor533: e1 + Owner: USSR + Facing: 384 + Location: 93,48 + SubCell: 3 + Actor534: e1 + Owner: USSR + Location: 86,49 + SubCell: 3 + Facing: 600 + Actor535: e1 + Owner: USSR + Location: 74,69 + SubCell: 3 + Facing: 170 + Actor536: e1 + Owner: USSR + Location: 72,72 + SubCell: 3 + Facing: 197 + Actor537: e1 + Owner: USSR + Location: 75,72 + SubCell: 3 + Facing: 231 + Actor538: e1 + Owner: USSR + Location: 70,66 + SubCell: 3 + Facing: 109 + Actor539: e1 + Owner: USSR + Location: 72,65 + SubCell: 3 + Facing: 163 + Actor540: e1 + Owner: USSR + Location: 70,63 + SubCell: 3 + Facing: 163 + Actor541: e1 + Owner: USSR + Location: 59,69 + SubCell: 3 + Facing: 512 + Actor542: e2 + Owner: USSR + Location: 60,70 + SubCell: 3 + Facing: 384 + Actor543: e2 + Owner: USSR + Facing: 384 + Location: 57,73 + SubCell: 3 + Actor544: e2 + Owner: USSR + Facing: 384 + Location: 56,82 + SubCell: 3 + Actor545: e2 + Owner: USSR + Location: 58,94 + SubCell: 3 + Facing: 743 + Actor546: e2 + Owner: USSR + Location: 60,97 + SubCell: 3 + Facing: 845 + Actor547: e1 + Owner: USSR + Location: 57,93 + SubCell: 3 + Facing: 627 + Actor548: e1 + Owner: USSR + Facing: 384 + Location: 57,83 + SubCell: 3 + Actor549: e1 + Owner: USSR + Location: 60,72 + SubCell: 3 + Facing: 512 + Actor550: e1 + Owner: USSR + Facing: 384 + Location: 63,69 + SubCell: 3 + Actor551: e1 + Owner: USSR + Location: 36,83 + SubCell: 3 + Facing: 777 + Actor552: e1 + Owner: USSR + Location: 38,85 + SubCell: 3 + Facing: 627 + Actor553: e1 + Owner: USSR + Location: 42,86 + SubCell: 3 + Facing: 0 + Actor554: e1 + Owner: USSR + Location: 40,84 + SubCell: 3 + Facing: 763 + Actor555: e4 + Owner: USSR + Facing: 384 + Location: 89,60 + SubCell: 3 + Actor556: e4 + Owner: USSR + Facing: 384 + Location: 62,49 + SubCell: 3 + Actor557: e4 + Owner: USSR + Facing: 384 + Location: 57,50 + SubCell: 3 + Actor558: ovld + Owner: USSR + Location: 20,49 + Facing: 627 + ScriptTags: VeryHardAndAbove + Actor559: ovld + Owner: USSR + Facing: 384 + Location: 41,38 + Actor560: tc01 + Owner: Neutral + Faction: soviet + Location: 93,92 + Actor561: t18 + Owner: Neutral + Faction: soviet + Location: 73,96 + Actor562: t18 + Owner: Neutral + Faction: soviet + Location: 67,77 + Actor563: t18 + Owner: Neutral + Faction: soviet + Location: 49,94 + Actor564: t18 + Owner: Neutral + Faction: soviet + Location: 12,64 + Actor565: t18 + Owner: Neutral + Faction: soviet + Location: 71,52 + Actor566: t18 + Owner: Neutral + Faction: soviet + Location: 64,39 + Actor527: e1 + Owner: USSR + Location: 86,42 + SubCell: 3 + Facing: 559 + Actor567: oilb + Owner: USSR + Location: 80,45 + Actor568: e1 + Owner: USSR + Facing: 384 + Location: 8,64 + SubCell: 1 + Actor569: e1 + Owner: USSR + Facing: 384 + Location: 16,59 + SubCell: 3 + Actor570: e1 + Owner: USSR + Facing: 384 + Location: 23,50 + SubCell: 3 + Actor571: e1 + Owner: USSR + Facing: 384 + Location: 39,38 + SubCell: 3 + Actor572: e1 + Owner: USSR + Facing: 384 + Location: 42,38 + SubCell: 3 + Actor573: e1 + Owner: USSR + Facing: 384 + Location: 43,39 + SubCell: 3 + Actor574: e3 + Owner: USSR + Facing: 384 + Location: 41,37 + SubCell: 3 + Actor575: e3 + Owner: USSR + Facing: 384 + Location: 60,35 + SubCell: 3 + Actor576: e3 + Owner: USSR + Location: 34,40 + SubCell: 3 + Facing: 647 + Actor579: jeep + Owner: Greece + Location: 85,90 + Facing: 128 + Gateway: wormholexl + Owner: USSR + Location: 56,15 + Reveal1: waypoint + Owner: Neutral + Location: 79,17 + Reveal2: waypoint + Owner: Neutral + Location: 62,30 + Reveal3: waypoint + Owner: Neutral + Location: 59,53 + Reveal4: waypoint + Owner: Neutral + Location: 50,63 + McvSpawn: waypoint + Owner: Neutral + Location: 90,98 + McvDest: waypoint + Owner: Neutral + Location: 90,92 + SpyTarget: e1 + Owner: USSR + Location: 57,24 + SubCell: 3 + Facing: 384 + Actor578: camera + Owner: USSR + Location: 74,70 + Actor580: camera + Owner: USSR + Location: 59,67 + Actor581: camera + Owner: USSR + Location: 57,86 + SpyDest: waypoint + Owner: Neutral + Location: 59,15 + PlayerStart: waypoint + Owner: Neutral + Location: 84,89 + SpySafety1: waypoint + Owner: Neutral + Location: 73,90 + SpySafety2: waypoint + Owner: Neutral + Location: 74,90 + SpySafety3: waypoint + Owner: Neutral + Location: 75,90 + SpySafety4: waypoint + Owner: Neutral + Location: 76,90 + SpySafety5: waypoint + Owner: Neutral + Location: 76,89 + Kennel: kenn + Owner: USSR + Location: 47,10 + Actor582: e1 + Owner: USSR + Facing: 384 + Location: 83,72 + SubCell: 3 + Actor583: e1 + Owner: USSR + Facing: 384 + Location: 85,75 + SubCell: 3 + Actor584: e1 + Owner: USSR + Facing: 384 + Location: 88,74 + SubCell: 3 + Actor585: e1 + Owner: USSR + Facing: 384 + Location: 89,74 + SubCell: 3 + Actor586: e1 + Owner: USSR + Facing: 384 + Location: 81,71 + SubCell: 3 + Actor587: e1 + Owner: USSR + Facing: 384 + Location: 92,65 + SubCell: 3 + Actor588: e1 + Owner: USSR + Facing: 384 + Location: 94,66 + SubCell: 3 + Actor589: e1 + Owner: USSR + Facing: 384 + Location: 92,52 + SubCell: 3 + Actor590: e1 + Owner: USSR + Facing: 384 + Location: 63,69 + SubCell: 1 + Actor591: e1 + Owner: USSR + Facing: 384 + Location: 58,71 + SubCell: 3 + Actor592: e1 + Owner: USSR + Facing: 384 + Location: 59,81 + SubCell: 3 + Actor593: e2 + Owner: USSR + Facing: 384 + Location: 87,53 + SubCell: 3 + Actor594: e2 + Owner: USSR + Facing: 384 + Location: 86,54 + SubCell: 3 + Actor595: e2 + Owner: USSR + Facing: 384 + Location: 89,33 + SubCell: 3 + Actor596: e2 + Owner: USSR + Facing: 384 + Location: 87,31 + SubCell: 3 + Actor597: e2 + Owner: USSR + Location: 81,35 + SubCell: 3 + Facing: 688 + Actor598: e4 + Owner: USSR + Location: 79,31 + SubCell: 3 + Facing: 661 + Actor599: e4 + Owner: USSR + Location: 80,29 + SubCell: 3 + Facing: 586 + Actor600: e3 + Owner: USSR + Facing: 384 + Location: 92,64 + SubCell: 3 + SovietPath1a: waypoint + Owner: Neutral + Location: 53,39 + SovietPath1b: waypoint + Owner: Neutral + Location: 56,63 + SovietPath2a: waypoint + Owner: Neutral + Location: 41,33 + SovietPath2b: waypoint + Owner: Neutral + Location: 38,61 + ScrinRally1: waypoint + Owner: Neutral + Location: 9,59 + ScrinRally2: waypoint + Owner: Neutral + Location: 27,56 + VeryHardSiegeTank: isu + Owner: USSR + Location: 92,59 + ScriptTags: VeryHardAndAbove + Facing: 384 + HardTank1: 3tnk + Owner: USSR + Location: 74,72 + ScriptTags: HardAndAbove + Facing: 128 + HardTank2: 3tnk + Owner: USSR + Location: 58,83 + ScriptTags: HardAndAbove + Facing: 384 + HardNukeCannon: nukc.defender + Owner: USSR + DeployState: Deployed + ScriptTags: HardAndAbove + Facing: 0 + Location: 75,59 + BrutalNukeCannon1: nukc.defender + Owner: USSR + DeployState: Deployed + ScriptTags: BrutalOnly + Facing: 0 + Location: 48,77 + BrutalNukeCannon2: nukc.defender + Owner: USSR + DeployState: Deployed + ScriptTags: BrutalOnly + Facing: 0 + Location: 51,96 + VeryHardTeslaTank: ttnk + Owner: USSR + Location: 39,85 + ScriptTags: VeryHardAndAbove + Facing: 913 + VeryHardCorrupter2: corr + Owner: Scrin + Location: 80,33 + ScriptTags: VeryHardAndAbove + Facing: 620 + VeryHardCorrupter1: corr + Owner: Scrin + Location: 91,36 + ScriptTags: VeryHardAndAbove + Facing: 384 + HardDevourer: devo + Owner: Scrin + Location: 14,83 + ScriptTags: HardAndAbove + Facing: 384 + Actor494: rtpd + Owner: Scrin + Facing: 384 + Location: 54,30 + Actor513: split2 + Owner: Neutral + Location: 57,31 + Actor499: oilb + Owner: USSR + Location: 86,81 + Actor515: oilb + Owner: USSR + Location: 93,82 + Actor517: brl3 + Owner: USSR + Location: 88,82 + Actor518: brl3 + Owner: USSR + Location: 92,82 + Actor601: barl + Owner: USSR + Location: 92,83 + Actor602: barl + Owner: USSR + Location: 89,81 + Actor603: barl + Owner: USSR + Location: 95,82 + Actor604: brl3 + Owner: USSR + Location: 84,82 + Actor605: barl + Owner: USSR + Location: 83,81 + Actor606: barl + Owner: USSR + Location: 85,82 + Actor608: fenc + Owner: USSR + Location: 28,13 + Actor609: fenc + Owner: USSR + Location: 27,13 + Actor610: fenc + Owner: USSR + Location: 27,14 + Actor611: fenc + Owner: USSR + Location: 27,15 + Actor612: fenc + Owner: USSR + Location: 27,16 + Actor613: fenc + Owner: USSR + Location: 27,17 + Actor614: fenc + Owner: USSR + Location: 27,18 + Actor615: fenc + Owner: USSR + Location: 26,18 + Actor616: fenc + Owner: USSR + Location: 29,13 + Actor617: fenc + Owner: USSR + Location: 30,13 + Actor618: fenc + Owner: USSR + Location: 31,13 + Actor619: fenc + Owner: USSR + Location: 31,12 + SecondaryBarracks: barr + Owner: USSR + Location: 28,14 + Actor607: ftur + Owner: USSR + Location: 31,16 + Actor620: e1 + Owner: USSR + Facing: 384 + Location: 28,19 + SubCell: 3 + Actor621: e1 + Owner: USSR + Location: 28,18 + SubCell: 3 + Facing: 552 + Actor622: e1 + Owner: USSR + Location: 32,17 + SubCell: 3 + Facing: 552 + Actor623: e1 + Owner: USSR + Location: 31,15 + SubCell: 3 + Facing: 688 + Actor624: e1 + Owner: USSR + Location: 33,14 + SubCell: 3 + Facing: 722 + Actor625: e1 + Owner: USSR + Facing: 384 + Location: 28,18 + SubCell: 1 + Actor626: e3 + Owner: USSR + Facing: 384 + Location: 32,16 + SubCell: 3 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, trepidation-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/main-campaign/ca44-trepidation/r_spydetected.aud b/mods/ca/missions/main-campaign/ca44-trepidation/r_spydetected.aud new file mode 100644 index 0000000000..76807d2354 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca44-trepidation/r_spydetected.aud differ diff --git a/mods/ca/missions/main-campaign/ca44-trepidation/trepidation-rules.yaml b/mods/ca/missions/main-campaign/ca44-trepidation/trepidation-rules.yaml new file mode 100644 index 0000000000..23129077c2 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca44-trepidation/trepidation-rules.yaml @@ -0,0 +1,117 @@ +^Palettes: + TintPostProcessEffect: + Red: 1 + Green: 1 + Blue: 1 + Ambient: 1 + +^BaseWorld: + TerrainLighting: + +World: + LuaScript: + Scripts: campaign.lua, trepidation.lua + MissionData: + Briefing: With the Soviet breakthrough pushed back we have a window of opportunity to strike at the Soviet gateway. However, before we proceed we require intel from our espionage team which has been embedded within Soviet forces on the Scrin homeworld for some time.\n\nThe team was awaiting information regarding the state of GDI and Nod following the arrival of the third Scrin faction, however we have not received any transmissions for several days now, which either means they have been discovered or that they have lost the ability to transmit undetected.\n\nIn accordance with contingency procedures, we expect one of our operatives through the Soviet gateway at any moment. We must extract him safely, obtain whatever new information he has, and then Allied High Command can make an informed decision regarding our next steps.\n\nTake a small specialist team and move into position to extract our spy. Hopefully he will be able to safely make contact so that you can coordinate his escape. Once he is safe we will decide whether the situation warrants further action. + MapOptions: + ShortGameCheckboxEnabled: False + MusicPlaylist: + StartingMusic: backstab + +Player: + PlayerResources: + DefaultCash: 6000 + ProvidesPrerequisitesOnTimeline: + PauseOnCondition: !spy-extracted + ExternalCondition@SpyExtracted: + Condition: spy-extracted + +# Enable subfaction specific tech + +SNIP: + Buildable: + Prerequisites: ~tent, anyradar + +RTNK: + Buildable: + Prerequisites: ~vehicles.allies + +TNKD: + Buildable: + Prerequisites: anyradar, ~vehicles.allies + +CHPR: + Buildable: + Prerequisites: atek, ~vehicles.allies + +BATF: + Buildable: + Prerequisites: atek, ~vehicles.allies + +NHAW: + Buildable: + Prerequisites: ~aircraft.allies + +HTUR: + Buildable: + Prerequisites: ~structures.allies, anyradar + +entrench.upgrade: + Buildable: + Prerequisites: anyradar, ~radar.allies + +apb.upgrade: + Buildable: + Prerequisites: atek + +tflx.upgrade: + Buildable: + Prerequisites: pdox + +# Misc + +WORMHOLEXL: + TerrainLightSource: + Range: 3c0 + Intensity: 0.5 + RedTint: 1 + +SPY.NoInfil: + Inherits: SPY + RenderSprites: + Image: spy + -Buildable: + -Infiltrates: + -WithColoredSelectionBox@Disguised: + -DisguiseTooltip: + Tooltip: + Name: Spy + +JEEP: + GrantTimedConditionOnDeploy@Optics: + DeployedTicks: 375 + CooldownTicks: 250 + +ALHQ: + FreeActor@Greece: + Actor: greece.coalition + +greece.coalition: + Inherits@CAMPAIGNDISABLED: ^Disabled + +sweden.coalition: + Inherits@CAMPAIGNDISABLED: ^Disabled + +korea.coalition: + Inherits@CAMPAIGNDISABLED: ^Disabled + +E7: + -Demolition: + +NUKC.Defender: + Inherits: NUKC + -Buildable: + RenderSprites: + Image: nukc + AutoTarget: + InitialStanceAI: Defend diff --git a/mods/ca/missions/main-campaign/ca44-trepidation/trepidation.lua b/mods/ca/missions/main-campaign/ca44-trepidation/trepidation.lua new file mode 100644 index 0000000000..be7c093a4b --- /dev/null +++ b/mods/ca/missions/main-campaign/ca44-trepidation/trepidation.lua @@ -0,0 +1,288 @@ +MissionDir = "ca|missions/main-campaign/ca44-trepidation" + +SuperweaponsEnabledTime = { + easy = DateTime.Minutes(40), + normal = DateTime.Minutes(25), + hard = DateTime.Minutes(15), + vhard = DateTime.Minutes(10), + brutal = DateTime.Minutes(10) +} + +DogInterval = { + easy = DateTime.Seconds(60), + normal = DateTime.Seconds(30), + hard = DateTime.Seconds(15), + vhard = DateTime.Seconds(12), + brutal = DateTime.Seconds(8) +} + +SovetAttackPaths = { + { SovietPath1a.Location, SovietPath1b.Location }, + { SovietPath2a.Location, SovietPath2b.Location }, +} + +ScrinAttackPaths = { + { ScrinRally1.Location }, + { ScrinRally2.Location }, +} + +Squads = { + SovietMain = { + Compositions = AdjustCompositionsForDifficulty(UnitCompositions.Soviet), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 30, Max = 60 }), + FollowLeader = true, + AttackPaths = SovietAttackPaths, + Delay = AdjustDelayForDifficulty(DateTime.Minutes(7)), + }, + ScrinMain = { + Compositions = AdjustCompositionsForDifficulty(UnitCompositions.Scrin), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 10, Max = 20 }), + FollowLeader = true, + AttackPaths = ScrinAttackPaths, + Delay = AdjustDelayForDifficulty(DateTime.Minutes(8)), + }, + Hunters = { + ActiveCondition = function() + return not Greece.IsObjectiveCompleted(ObjectiveExtractSpy) + end, + Compositions = { + { Infantry = { "e1", "e1" } }, + { Infantry = { "e1", "e1", "e1" } }, + { Infantry = { "e1", "e1", "e1", "e1" } }, + }, + FollowLeader = false, + ProducerActors = { Infantry = { SecondaryBarracks } }, + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 5, Max = 18 }), + }, + Air = { + Delay = AdjustAirDelayForDifficulty(DateTime.Minutes(18)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 12, Max = 12 }), + Compositions = AirCompositions.Soviet, + } +} + +SetupPlayers = function() + Greece = Player.GetPlayer("Greece") + USSR = Player.GetPlayer("USSR") + Scrin = Player.GetPlayer("Scrin") + England = Player.GetPlayer("England") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = { Greece } + MissionEnemies = { USSR, Scrin } +end + +WorldLoaded = function() + SetupPlayers() + + Camera.Position = PlayerStart.CenterPosition + + InitObjectives(Greece) + AdjustPlayerStartingCashForDifficulty() + RemoveActorsBasedOnDifficultyTags() + InitUSSR() + InitScrin() + + SetupReveals({ Reveal1, Reveal2, Reveal3, Reveal4 }) + SetupChurchMoneyCrates() + + Utils.Do(MissionPlayers, function(p) + Actor.Create("optics.upgrade", true, { Owner = p }) + end) + + ObjectiveExtractSpy = Greece.AddObjective("Get spy to safety.") + + Trigger.AfterDelay(DateTime.Seconds(20), function() + CreateSpy() + Spy.DisguiseAs(SpyTarget) + Spy.Move(SpyDest.Location) + MediaCA.PlaySound(MissionDir .. "/r_spydetected.aud", 2) + Notification("Allied spy detected. Press [" .. UtilsCA.Hotkey("ToLastEvent") .. "] to view location.") + Beacon.New(Greece, SpyDest.CenterPosition) + + Trigger.OnKilled(Spy, function() + if not Greece.IsObjectiveCompleted(ObjectiveExtractSpy) then + Greece.MarkFailedObjective(ObjectiveExtractSpy) + end + end) + + Trigger.OnExitedProximityTrigger(Gateway.CenterPosition, WDist.New(22 * 1024), function(a, id) + if a == Spy then + Trigger.RemoveProximityTrigger(id) + InitHuntSpy() + end + end) + + Trigger.OnEnteredFootprint({ SpySafety1.Location, SpySafety2.Location, SpySafety3.Location, SpySafety4.Location, SpySafety5.Location }, function(a, id) + if a == Spy then + Trigger.RemoveFootprintTrigger(id) + Spy.Owner = England + SpyDeparture() + end + end) + end) + + Trigger.OnProduction(Kennel, function(producer, produced) + if produced.Type == "dog" and not produced.IsDead and not Spy.IsDead then + produced.Attack(Spy) + end + end) + + AfterWorldLoaded() +end + +Tick = function() + OncePerSecondChecks() + OncePerFiveSecondChecks() + OncePerThirtySecondChecks() + AfterTick() +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + USSR.Resources = USSR.ResourceCapacity - 500 + + if not PlayerHasBuildings(USSR) and not PlayerHasBuildings(Scrin) then + if ObjectiveEliminateEnemy == nil then + ObjectiveEliminateEnemy = Greece.AddObjective("Eliminate Soviet & Scrin presence.") + end + Greece.MarkCompletedObjective(ObjectiveEliminateEnemy) + end + + if MissionPlayersHaveNoRequiredUnits() then + if ObjectiveEliminateEnemy ~= nil and not Greece.IsObjectiveCompleted(ObjectiveEliminateEnemy) then + Greece.MarkFailedObjective(ObjectiveEliminateEnemy) + end + end + end +end + +OncePerFiveSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 125 == 0 then + UpdatePlayerBaseLocations() + end +end + +OncePerThirtySecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 750 == 0 then + CalculatePlayerCharacteristics() + end +end + +InitUSSR = function() + AutoRepairAndRebuildBuildings(USSR) + SetupRefAndSilosCaptureCredits(USSR) + AutoReplaceHarvesters(USSR) + AutoRebuildConyards(USSR) + + Actor.Create("hazmatsoviet.upgrade", true, { Owner = USSR }) + + local ussrGroundAttackers = USSR.GetGroundAttackers() + Utils.Do(ussrGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsUSSRGroundHunterUnit) + end) + + if IsHardOrAbove() then + local ussrStructures = USSR.GetActorsByTypes({ "tpwr", "mslo", "stek", "weap", "barr", "iron", "afld", "proc", "dome" }) + Trigger.OnAnyKilled(ussrStructures, function() + InitAttackSquad(Squads.Hunters, USSR) + end) + end +end + +InitUSSRAttacks = function() + InitAiUpgrades(USSR) + InitAttackSquad(Squads.SovietMain, USSR) + InitAirAttackSquad(Squads.Air, USSR) + + Trigger.AfterDelay(SuperweaponsEnabledTime[Difficulty], function() + Actor.Create("ai.superweapons.enabled", true, { Owner = USSR }) + Actor.Create("ai.minor.superweapons.enabled", true, { Owner = USSR }) + end) +end + +InitScrin = function() + AutoRepairAndRebuildBuildings(Scrin) + SetupRefAndSilosCaptureCredits(Scrin) + AutoReplaceHarvesters(Scrin) + AutoRebuildConyards(Scrin) + + local scrinGroundAttackers = Scrin.GetGroundAttackers() + Utils.Do(scrinGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsScrinGroundHunterUnit) + end) +end + +InitScrinAttacks = function() + InitAiUpgrades(Scrin) + InitAttackSquad(Squads.ScrinMain, Scrin) +end + +InitHuntSpy = function() + local dogs = USSR.GetActorsByType("dog") + Utils.Do(dogs, function(d) d.Attack(Spy) end) + ReleaseDog() +end + +ReleaseDog = function() + if Kennel.IsDead or Spy.IsDead then + return + end + Kennel.Produce("dog") + Trigger.AfterDelay(DogInterval[Difficulty], ReleaseDog) +end + +SpyDeparture = function() + Trigger.AfterDelay(1, function() + Spy.Stop() + Spy.Move(McvDest.Location) + Spy.Move(McvSpawn.Location) + Spy.DisguiseAsType("spy", England) + + local spyExitCells = { CPos.New(87,98), CPos.New(88,98), CPos.New(89,98), CPos.New(90,98), CPos.New(91,98), CPos.New(92,98), CPos.New(93,98) } + + Trigger.OnIdle(Spy, function() + if SpyDeparted then + return + end + Spy.Move(Utils.Random(spyExitCells)) + end) + + Trigger.OnEnteredFootprint(spyExitCells, function(a, id) + if a == Spy and not SpyDeparted then + Trigger.RemoveFootprintTrigger(id) + SpyDeparted = true + if ObjectiveEliminateEnemy == nil then + ObjectiveEliminateEnemy = Greece.AddObjective("Eliminate Soviet & Scrin presence.") + end + Greece.MarkCompletedObjective(ObjectiveExtractSpy) + Spy.Stop() + Spy.Destroy() + + for _, p in ipairs(MissionPlayers) do + p.GrantCondition("spy-extracted") + end + + Trigger.AfterDelay(DateTime.Seconds(2), function() + Beacon.New(Greece, McvDest.CenterPosition) + PlaySpeechNotificationToMissionPlayers("ReinforcementsArrived") + Notification("Reinforcements have arrived.") + DoMcvArrival() + InitUSSRAttacks() + InitScrinAttacks() + end) + end + end) + end) +end + +-- overridden in co-op version +CreateSpy = function() + Spy = Actor.Create("spy.noinfil", true, { Owner = Greece, Location = Gateway.Location }) +end + +-- overridden in co-op version +DoMcvArrival = function() + Reinforcements.Reinforce(Greece, { "mcv", "2tnk", "2tnk", "arty", "arty", "e1", "e1", "e1", "e1", "e3", "medi" }, { McvSpawn.Location, McvDest.Location }, 75) +end diff --git a/mods/ca/missions/main-campaign/ca45-multipolarity/hth_farfromover.aud b/mods/ca/missions/main-campaign/ca45-multipolarity/hth_farfromover.aud new file mode 100644 index 0000000000..b3ea5a6a9f Binary files /dev/null and b/mods/ca/missions/main-campaign/ca45-multipolarity/hth_farfromover.aud differ diff --git a/mods/ca/missions/main-campaign/ca45-multipolarity/hth_jurisdiction.aud b/mods/ca/missions/main-campaign/ca45-multipolarity/hth_jurisdiction.aud new file mode 100644 index 0000000000..4080fb31bb Binary files /dev/null and b/mods/ca/missions/main-campaign/ca45-multipolarity/hth_jurisdiction.aud differ diff --git a/mods/ca/missions/main-campaign/ca45-multipolarity/hth_nodequip.aud b/mods/ca/missions/main-campaign/ca45-multipolarity/hth_nodequip.aud new file mode 100644 index 0000000000..50b588eedf Binary files /dev/null and b/mods/ca/missions/main-campaign/ca45-multipolarity/hth_nodequip.aud differ diff --git a/mods/ca/missions/main-campaign/ca45-multipolarity/hth_nodequipauto.aud b/mods/ca/missions/main-campaign/ca45-multipolarity/hth_nodequipauto.aud new file mode 100644 index 0000000000..71b6502f30 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca45-multipolarity/hth_nodequipauto.aud differ diff --git a/mods/ca/missions/main-campaign/ca45-multipolarity/hth_notstop.aud b/mods/ca/missions/main-campaign/ca45-multipolarity/hth_notstop.aud new file mode 100644 index 0000000000..2c5992c663 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca45-multipolarity/hth_notstop.aud differ diff --git a/mods/ca/missions/main-campaign/ca45-multipolarity/hth_paydearly.aud b/mods/ca/missions/main-campaign/ca45-multipolarity/hth_paydearly.aud new file mode 100644 index 0000000000..cc8f0bc564 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca45-multipolarity/hth_paydearly.aud differ diff --git a/mods/ca/missions/main-campaign/ca45-multipolarity/hth_sovequip.aud b/mods/ca/missions/main-campaign/ca45-multipolarity/hth_sovequip.aud new file mode 100644 index 0000000000..e1dfb5917e Binary files /dev/null and b/mods/ca/missions/main-campaign/ca45-multipolarity/hth_sovequip.aud differ diff --git a/mods/ca/missions/main-campaign/ca45-multipolarity/hth_sovequipauto.aud b/mods/ca/missions/main-campaign/ca45-multipolarity/hth_sovequipauto.aud new file mode 100644 index 0000000000..e4f4f9dbb7 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca45-multipolarity/hth_sovequipauto.aud differ diff --git a/mods/ca/missions/main-campaign/ca45-multipolarity/map.bin b/mods/ca/missions/main-campaign/ca45-multipolarity/map.bin new file mode 100644 index 0000000000..c3ed46d36e Binary files /dev/null and b/mods/ca/missions/main-campaign/ca45-multipolarity/map.bin differ diff --git a/mods/ca/missions/main-campaign/ca45-multipolarity/map.png b/mods/ca/missions/main-campaign/ca45-multipolarity/map.png new file mode 100644 index 0000000000..a28d42319f Binary files /dev/null and b/mods/ca/missions/main-campaign/ca45-multipolarity/map.png differ diff --git a/mods/ca/missions/main-campaign/ca45-multipolarity/map.yaml b/mods/ca/missions/main-campaign/ca45-multipolarity/map.yaml new file mode 100644 index 0000000000..778170d9d8 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca45-multipolarity/map.yaml @@ -0,0 +1,3779 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 45: Multipolarity + +Author: Darkademic + +Tileset: TEMPERAT + +MapSize: 134,134 + +Bounds: 1,1,132,132 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: Greece, GDI + PlayerReference@Greece: + Name: Greece + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: allies + LockColor: True + Color: 99ACF2 + LockSpawn: True + LockTeam: True + Enemies: GDI, Creeps + PlayerReference@GDI: + Name: GDI + Bot: campaign + Faction: gdi + Color: F2CF74 + Enemies: Greece, Creeps + PlayerReference@England: + Name: England + NonCombatant: True + Faction: allies + Color: 9AAD95 + PlayerReference@USSR: + Name: USSR + NonCombatant: True + Faction: soviet + Color: 5C4F45 + PlayerReference@Nod: + Name: Nod + NonCombatant: True + Faction: nod + Color: 4F545A + PlayerReference@Scrin: + Name: Scrin + NonCombatant: True + Faction: scrin + Color: 7700FF + +Actors: + Actor514: apwr + Location: 81,85 + Health: 39 + Owner: England + Actor515: apwr + Location: 80,88 + Health: 44 + Owner: England + Actor516: apwr + Location: 78,85 + Health: 42 + Owner: England + Actor522: fix + Location: 76,88 + Owner: England + Health: 42 + Actor531: atek + Location: 67,80 + Health: 24 + Owner: England + ScriptTags: NormalAndBelow + Actor534: dome + Location: 66,84 + Health: 43 + Owner: England + ScriptTags: HardAndBelow + Actor889: split2 + Owner: Neutral + Location: 49,130 + Actor890: split2 + Owner: Neutral + Location: 55,129 + Actor892: split2 + Owner: Neutral + Location: 44,93 + Actor893: split2 + Owner: Neutral + Location: 49,95 + Actor894: split2 + Owner: Neutral + Location: 93,95 + Actor896: split2 + Owner: Neutral + Location: 95,91 + Actor900: split2 + Owner: Neutral + Location: 119,49 + Actor901: split2 + Owner: Neutral + Location: 127,49 + Actor902: split2 + Owner: Neutral + Location: 8,57 + Actor903: split2 + Owner: Neutral + Location: 13,56 + Actor1006: t17.husk + Owner: Neutral + Faction: germany + Location: 78,101 + Actor1007: tc04.husk + Owner: Neutral + Faction: germany + Location: 84,105 + Actor1008: tc01.husk + Owner: Neutral + Faction: germany + Location: 70,106 + Actor1009: t17.husk + Owner: Neutral + Faction: germany + Location: 61,103 + Actor1010: t16.husk + Owner: Neutral + Faction: germany + Location: 59,91 + Actor1011: tc03.husk + Owner: Neutral + Faction: germany + Location: 59,99 + Actor1012: t14.husk + Owner: Neutral + Faction: germany + Location: 59,104 + Actor1013: t15.husk + Owner: Neutral + Faction: germany + Location: 84,108 + Actor1014: t13.husk + Owner: Neutral + Faction: germany + Location: 82,107 + Actor1015: t13.husk + Owner: Neutral + Faction: germany + Location: 95,106 + Actor1016: tc02.husk + Owner: Neutral + Faction: germany + Location: 89,108 + Actor1017: t17.husk + Owner: Neutral + Faction: germany + Location: 97,103 + Actor1018: t14.husk + Owner: Neutral + Faction: germany + Location: 104,101 + Actor1019: t16.husk + Owner: Neutral + Faction: germany + Location: 106,101 + Actor1020: t10.husk + Owner: Neutral + Faction: germany + Location: 102,90 + Actor1021: tc04.husk + Owner: Neutral + Faction: germany + Location: 50,109 + Actor1022: t15.husk + Owner: Neutral + Faction: germany + Location: 53,110 + Actor1023: t12.husk + Owner: Neutral + Faction: germany + Location: 46,106 + Actor1024: t03.husk + Owner: Neutral + Faction: germany + Location: 41,104 + Actor1025: t11.husk + Owner: Neutral + Faction: germany + Location: 43,54 + Actor1026: t13.husk + Owner: Neutral + Faction: germany + Location: 41,65 + Actor1027: tc01.husk + Owner: Neutral + Faction: germany + Location: 43,69 + Actor1028: t16.husk + Owner: Neutral + Faction: germany + Location: 47,57 + Actor1029: t08.husk + Owner: Neutral + Faction: germany + Location: 46,67 + Actor1030: t16.husk + Owner: Neutral + Faction: germany + Location: 47,66 + Actor1031: tc02.husk + Owner: Neutral + Faction: germany + Location: 39,75 + Actor1032: t14.husk + Owner: Neutral + Faction: germany + Location: 39,73 + Actor1033: t05.husk + Owner: Neutral + Faction: germany + Location: 46,69 + Actor1034: t03.husk + Owner: Neutral + Faction: germany + Location: 46,59 + Actor1036: t10.husk + Owner: Neutral + Faction: germany + Location: 90,64 + Actor1037: t15.husk + Owner: Neutral + Faction: germany + Location: 90,61 + Actor1038: t16.husk + Owner: Neutral + Faction: germany + Location: 90,78 + Actor1039: t15.husk + Owner: Neutral + Faction: germany + Location: 94,84 + Actor1040: t14.husk + Owner: Neutral + Faction: germany + Location: 92,81 + Actor1041: t15.husk + Owner: Neutral + Faction: germany + Location: 86,93 + Actor1042: t03.husk + Owner: Neutral + Faction: germany + Location: 86,91 + Actor1044: t11.husk + Owner: Neutral + Faction: germany + Location: 87,81 + Actor1045: tc01.husk + Owner: Neutral + Faction: germany + Location: 89,82 + Actor1046: t08.husk + Owner: Neutral + Faction: germany + Location: 92,76 + Actor1047: t14.husk + Owner: Neutral + Faction: germany + Location: 91,65 + Actor1048: t16.husk + Owner: Neutral + Faction: germany + Location: 93,68 + Actor1049: t17.husk + Owner: Neutral + Faction: germany + Location: 93,63 + Actor1050: tc03.husk + Owner: Neutral + Faction: germany + Location: 92,67 + Actor1051: tc04.husk + Owner: Neutral + Faction: germany + Location: 31,94 + Actor1052: tc04 + Owner: Neutral + Faction: germany + Location: 42,115 + Actor1053: t02 + Owner: Neutral + Faction: germany + Location: 45,114 + Actor1054: t13 + Owner: Neutral + Faction: germany + Location: 39,116 + Actor1056: tc05 + Owner: Neutral + Faction: germany + Location: 34,116 + Actor1057: t05 + Owner: Neutral + Faction: germany + Location: 37,113 + Actor1058: t02 + Owner: Neutral + Faction: germany + Location: 31,114 + Actor1059: t03 + Owner: Neutral + Faction: germany + Location: 36,127 + Actor1060: tc01 + Owner: Neutral + Faction: germany + Location: 96,112 + Actor1061: t14 + Owner: Neutral + Faction: germany + Location: 100,115 + Actor1062: t13 + Owner: Neutral + Faction: germany + Location: 99,117 + Actor1063: t01 + Owner: Neutral + Faction: germany + Location: 98,115 + Actor1064: t16 + Owner: Neutral + Faction: germany + Location: 106,118 + Actor1065: ice01 + Owner: Neutral + Faction: germany + Location: 27,108 + Actor1066: tc02.husk + Owner: Neutral + Faction: germany + Location: 120,92 + Actor1067: t10.husk + Owner: Neutral + Faction: germany + Location: 125,94 + Actor1068: t06.husk + Owner: Neutral + Faction: germany + Location: 110,77 + Actor1069: t07.husk + Owner: Neutral + Faction: germany + Location: 97,73 + Actor1070: tc05.husk + Owner: Neutral + Faction: germany + Location: 95,56 + Actor1071: tc01.husk + Owner: Neutral + Faction: germany + Location: 97,46 + Actor1073: t07.husk + Owner: Neutral + Faction: germany + Location: 42,46 + Actor1074: t03.husk + Owner: Neutral + Faction: germany + Location: 26,43 + Actor1075: tc05.husk + Owner: Neutral + Faction: germany + Location: 22,30 + Actor1076: t01.husk + Owner: Neutral + Faction: germany + Location: 23,28 + Actor1077: t15.husk + Owner: Neutral + Faction: germany + Location: 19,33 + Actor1078: tc02.husk + Owner: Neutral + Faction: germany + Location: 24,28 + Actor1079: t05.husk + Owner: Neutral + Faction: germany + Location: 18,35 + Actor1080: t08.husk + Owner: Neutral + Faction: germany + Location: 27,30 + Actor1087: tc04.husk + Owner: Neutral + Location: 102,8 + Actor1088: t15.husk + Owner: Neutral + Location: 97,4 + Actor1089: t07.husk + Owner: Neutral + Location: 101,2 + Actor1090: t10.husk + Owner: Neutral + Location: 90,1 + Actor1091: t10.husk + Owner: Neutral + Location: 99,6 + Actor1092: tc05.husk + Owner: Neutral + Location: 96,6 + Actor1093: t17.husk + Owner: Neutral + Location: 108,6 + Actor1094: t13.husk + Owner: Neutral + Location: 111,9 + Actor1095: t11.husk + Owner: Neutral + Location: 110,17 + Actor1098: t11.husk + Owner: Neutral + Location: 127,33 + Actor1099: tc05.husk + Owner: Neutral + Location: 122,38 + Actor1100: t17.husk + Owner: Neutral + Location: 120,37 + Actor1101: t12.husk + Owner: Neutral + Location: 109,31 + Actor1102: tc01.husk + Owner: Neutral + Location: 107,30 + Actor1105: t07.husk + Owner: Neutral + Location: 109,28 + Actor1106: t10.husk + Owner: Neutral + Location: 106,24 + Actor1108: t14.husk + Owner: Neutral + Location: 124,85 + Actor1109: t11.husk + Owner: Neutral + Location: 129,74 + Actor1111: tc04 + Owner: Neutral + Location: 120,126 + Actor1112: t13 + Owner: Neutral + Location: 123,123 + Actor1113: tc03 + Owner: Neutral + Location: 107,129 + Actor1114: tc04.husk + Owner: Neutral + Location: 114,108 + Actor1115: tc01.husk + Owner: Neutral + Location: 120,102 + Actor1116: tc02.husk + Owner: Neutral + Location: 110,98 + Actor1117: t17.husk + Owner: Neutral + Location: 109,96 + Actor1118: t03.husk + Owner: Neutral + Location: 115,83 + Actor1120: t15.husk + Owner: Neutral + Location: 129,104 + Actor1121: t16.husk + Owner: Neutral + Location: 131,100 + Actor1122: t02.husk + Owner: Neutral + Location: 101,62 + Actor1123: split2 + Owner: Neutral + Location: 119,117 + Actor1124: split2 + Owner: Neutral + Location: 13,123 + Actor1125: split2 + Owner: Neutral + Location: 11,119 + Actor1126: split2 + Owner: Neutral + Location: 121,83 + Actor1127: split2 + Owner: Neutral + Location: 126,81 + Actor1128: split2 + Owner: Neutral + Location: 3,90 + Actor1129: tc04.husk + Owner: Neutral + Location: 79,65 + Actor1130: t15.husk + Owner: Neutral + Location: 84,71 + Actor1132: t02.husk + Owner: Neutral + Location: 86,57 + Actor1133: t05.husk + Owner: Neutral + Location: 56,57 + Actor1134: t03.husk + Owner: Neutral + Location: 49,62 + Actor1135: tc03.husk + Owner: Neutral + Location: 54,68 + Actor1136: t15.husk + Owner: Neutral + Location: 59,64 + Actor1137: t12.husk + Owner: Neutral + Location: 51,77 + Actor1138: tc04.husk + Owner: Neutral + Location: 45,79 + Actor1139: tc05.husk + Owner: Neutral + Location: 51,73 + Actor1140: t07.husk + Owner: Neutral + Location: 50,83 + Actor1141: t11.husk + Owner: Neutral + Location: 57,83 + Actor1142: t01.husk + Owner: Neutral + Location: 62,74 + Actor1143: t14.husk + Owner: Neutral + Location: 80,77 + Actor1144: t15.husk + Owner: Neutral + Location: 94,126 + Actor1145: t13.husk + Owner: Neutral + Location: 16,18 + Actor1151: t07.husk + Owner: Neutral + Location: 35,4 + Actor1153: tc01.husk + Owner: Neutral + Location: 13,19 + Actor1154: t15.husk + Owner: Neutral + Location: 6,23 + Actor1155: t07.husk + Owner: Neutral + Location: 1,19 + Actor1317: tc05.husk + Owner: Neutral + Location: 29,78 + Actor1318: t01.husk + Owner: Neutral + Location: 31,70 + Actor1319: t12.husk + Owner: Neutral + Location: 30,76 + Actor1320: t05.husk + Owner: Neutral + Location: 32,59 + Actor1321: t15.husk + Owner: Neutral + Location: 31,52 + Actor1423: t11.husk + Owner: Neutral + Location: 27,2 + Actor1435: tc01.husk + Owner: Neutral + Location: 25,4 + Actor1511: t02.husk + Owner: Neutral + Location: 27,10 + Actor1646: tent + Location: 66,88 + Health: 47 + Owner: England + Actor1648: hpad + Location: 69,89 + Owner: England + Health: 43 + ScriptTags: VeryHardAndBelow + Actor1652: weap + Location: 69,84 + Owner: England + Health: 44 + Actor1110: t07.husk + Owner: Neutral + Location: 130,77 + Actor399: brik + Owner: GDI + Location: 59,34 + Actor400: brik + Owner: GDI + Location: 59,33 + Actor402: brik + Owner: GDI + Location: 60,34 + Actor403: brik + Owner: GDI + Location: 59,32 + Actor404: brik + Owner: GDI + Location: 58,32 + Actor405: brik + Owner: GDI + Location: 58,30 + Actor410: brik + Owner: GDI + Location: 58,31 + Actor411: brik + Owner: GDI + Location: 58,29 + Actor412: brik + Owner: GDI + Location: 58,27 + Actor413: brik + Owner: GDI + Location: 58,28 + Actor415: brik + Owner: GDI + Location: 58,23 + Actor416: brik + Owner: GDI + Location: 59,23 + Actor417: brik + Owner: GDI + Location: 59,22 + Actor418: brik + Owner: GDI + Location: 59,21 + Actor419: brik + Owner: GDI + Location: 58,24 + Actor420: brik + Owner: GDI + Location: 58,25 + Actor421: brik + Owner: GDI + Location: 58,26 + Actor422: brik + Owner: GDI + Location: 60,21 + Actor423: brik + Owner: GDI + Location: 61,21 + Actor424: brik + Owner: GDI + Location: 61,20 + Actor425: brik + Owner: GDI + Location: 61,19 + Actor426: brik + Owner: GDI + Location: 63,19 + Actor427: brik + Owner: GDI + Location: 62,19 + Actor428: brik + Owner: GDI + Location: 64,19 + Actor429: brik + Owner: GDI + Location: 65,19 + Actor430: brik + Owner: GDI + Location: 65,18 + Actor431: brik + Owner: GDI + Location: 66,18 + Actor432: brik + Owner: GDI + Location: 67,18 + Actor433: brik + Owner: GDI + Location: 67,19 + Actor434: brik + Owner: GDI + Location: 68,19 + Actor435: brik + Owner: GDI + Location: 69,19 + Actor438: brik + Owner: GDI + Location: 70,19 + Actor442: brik + Owner: GDI + Location: 71,19 + Actor487: brik + Owner: GDI + Location: 71,20 + Actor488: brik + Owner: GDI + Location: 72,20 + Actor489: brik + Owner: GDI + Location: 72,21 + Actor517: brik + Owner: GDI + Location: 72,22 + Actor518: brik + Owner: GDI + Location: 73,22 + Actor519: brik + Owner: GDI + Location: 73,23 + Actor520: brik + Owner: GDI + Location: 73,24 + Actor521: brik + Owner: GDI + Location: 74,24 + Actor524: brik + Owner: GDI + Location: 74,25 + Actor525: brik + Owner: GDI + Location: 74,26 + Actor526: brik + Owner: GDI + Location: 74,28 + Actor527: brik + Owner: GDI + Location: 74,27 + Actor528: brik + Owner: GDI + Location: 74,29 + Actor532: brik + Owner: GDI + Location: 74,30 + Actor533: brik + Owner: GDI + Location: 74,31 + Actor540: brik + Owner: GDI + Location: 74,32 + Actor541: brik + Owner: GDI + Location: 74,33 + Actor542: brik + Owner: GDI + Location: 73,33 + Actor543: brik + Owner: GDI + Location: 72,33 + Actor544: brik + Owner: GDI + Location: 72,34 + Actor545: brik + Owner: GDI + Location: 71,34 + Actor546: brik + Owner: GDI + Location: 70,34 + Actor547: brik + Owner: GDI + Location: 70,35 + Actor548: brik + Owner: GDI + Location: 61,34 + Actor549: brik + Owner: GDI + Location: 61,35 + Actor550: brik + Owner: GDI + Location: 61,36 + Actor551: brik + Owner: GDI + Location: 61,37 + Actor552: brik + Owner: GDI + Location: 61,38 + Actor553: brik + Owner: GDI + Location: 62,38 + Actor554: brik + Owner: GDI + Location: 63,38 + Actor555: brik + Owner: GDI + Location: 64,38 + Actor556: brik + Owner: GDI + Location: 64,37 + Actor557: brik + Owner: GDI + Location: 63,37 + Actor558: brik + Owner: GDI + Location: 70,36 + Actor559: brik + Owner: GDI + Location: 70,37 + Actor560: brik + Owner: GDI + Location: 70,38 + Actor561: brik + Owner: GDI + Location: 68,38 + Actor562: brik + Owner: GDI + Location: 69,38 + Actor563: brik + Owner: GDI + Location: 67,38 + Actor564: brik + Owner: GDI + Location: 67,37 + Actor565: brik + Owner: GDI + Location: 68,37 + Actor566: afac + Owner: GDI + Location: 52,30 + Actor567: brik + Owner: GDI + Location: 38,38 + Actor568: brik + Owner: GDI + Location: 38,39 + Actor569: brik + Owner: GDI + Location: 39,39 + Actor570: brik + Owner: GDI + Location: 38,37 + Actor571: brik + Owner: GDI + Location: 38,36 + Actor572: brik + Owner: GDI + Location: 39,36 + Actor573: brik + Owner: GDI + Location: 39,37 + Actor574: brik + Owner: GDI + Location: 39,40 + Actor575: brik + Owner: GDI + Location: 39,41 + Actor576: brik + Owner: GDI + Location: 38,31 + Actor577: brik + Owner: GDI + Location: 38,30 + Actor579: brik + Owner: GDI + Location: 38,32 + Actor580: brik + Owner: GDI + Location: 39,32 + Actor581: brik + Owner: GDI + Location: 39,31 + Actor582: brik + Owner: GDI + Location: 38,29 + Actor578: brik + Owner: GDI + Location: 39,29 + Actor583: brik + Owner: GDI + Location: 39,28 + Actor584: brik + Owner: GDI + Location: 39,26 + Actor585: brik + Owner: GDI + Location: 39,25 + Actor586: brik + Owner: GDI + Location: 39,27 + Actor587: brik + Owner: GDI + Location: 40,25 + Actor588: brik + Owner: GDI + Location: 40,24 + Actor589: brik + Owner: GDI + Location: 40,23 + Actor590: brik + Owner: GDI + Location: 40,22 + Actor591: brik + Owner: GDI + Location: 40,21 + Actor592: brik + Owner: GDI + Location: 40,20 + Actor593: brik + Owner: GDI + Location: 41,20 + Actor594: brik + Owner: GDI + Location: 42,20 + Actor595: brik + Owner: GDI + Location: 43,20 + Actor631: brik + Owner: GDI + Location: 40,41 + Actor630: nuk2 + Owner: GDI + Location: 53,26 + Actor652: nuk2 + Owner: GDI + Location: 51,26 + Actor687: nuk2 + Owner: GDI + Location: 48,26 + Actor691: nuk2 + Owner: GDI + Location: 46,26 + Actor700: nuk2 + Owner: GDI + Location: 46,30 + Actor701: nuk2 + Owner: GDI + Location: 48,30 + Actor729: proc.td + Owner: GDI + Location: 41,21 + Actor599: barb + Owner: GDI + Location: 62,39 + Actor601: barb + Owner: GDI + Location: 63,39 + Actor761: barb + Owner: GDI + Location: 68,39 + Actor762: barb + Owner: GDI + Location: 69,39 + Actor765: barb + Owner: GDI + Location: 70,39 + Actor770: atwr + Owner: GDI + Location: 62,37 + Actor772: atwr + Owner: GDI + Location: 69,37 + Actor774: atwr + Owner: GDI + Location: 60,33 + Actor775: atwr + Owner: GDI + Location: 71,33 + Actor776: cram + Owner: GDI + Location: 59,31 + Actor782: cram + Owner: GDI + Location: 73,32 + Actor784: cram + Owner: GDI + Location: 72,23 + Actor785: cram + Owner: GDI + Location: 66,19 + Actor789: cram + Owner: GDI + Location: 60,22 + Actor604: gtwr + Owner: GDI + Location: 64,39 + Actor742: gtwr + Owner: GDI + Location: 67,39 + Actor596: brik + Owner: GDI + Location: 44,21 + Actor597: brik + Owner: GDI + Location: 44,20 + Actor598: brik + Owner: GDI + Location: 45,20 + Actor600: brik + Owner: GDI + Location: 45,21 + Actor605: brik + Owner: GDI + Location: 40,40 + Actor602: eye + Owner: GDI + Location: 52,20 + Actor603: nuk2 + Owner: GDI + Location: 78,26 + Actor606: nuk2 + Owner: GDI + Location: 80,26 + Actor607: nuk2 + Owner: GDI + Location: 83,26 + Actor608: nuk2 + Owner: GDI + Location: 85,26 + Actor609: nuk2 + Owner: GDI + Location: 83,30 + Actor610: nuk2 + Owner: GDI + Location: 85,30 + Actor611: afac + Owner: GDI + Location: 78,30 + Actor612: hq + Owner: GDI + Location: 75,36 + UpgradeCenter: upgc + Owner: GDI + Location: 79,22 + Actor614: patr + Owner: GDI + Location: 54,36 + Actor615: silo.td + Owner: GDI + Location: 79,36 + Actor616: silo.td + Owner: GDI + Location: 80,34 + Actor617: silo.td + Owner: GDI + Location: 82,36 + Actor618: silo.td + Owner: GDI + Location: 83,34 + Actor619: silo.td + Owner: GDI + Location: 85,36 + Actor624: afld.gdi + Owner: GDI + Location: 51,43 + Actor625: afld.gdi + Owner: GDI + Location: 50,46 + Actor626: afld.gdi + Owner: GDI + Location: 52,49 + Actor627: rep + Owner: GDI + Location: 54,45 + Actor628: afld.gdi + Owner: GDI + Location: 56,43 + Actor629: afld.gdi + Owner: GDI + Location: 58,46 + Actor632: afld.gdi + Owner: GDI + Location: 56,49 + Actor633: stwr + Owner: GDI + Location: 62,59 + TurretFacing: 512 + Actor637: stwr + Owner: GDI + Location: 37,37 + TurretFacing: 354 + ScriptTags: HardAndAbove + Actor638: stwr + Owner: GDI + Location: 37,31 + TurretFacing: 192 + ScriptTags: HardAndAbove + Actor639: brik + Owner: GDI + Location: 61,56 + Actor640: brik + Owner: GDI + Location: 61,55 + Actor641: brik + Owner: GDI + Location: 62,56 + Actor642: brik + Owner: GDI + Location: 62,55 + Actor643: brik + Owner: GDI + Location: 63,56 + Actor644: brik + Owner: GDI + Location: 64,56 + Actor645: brik + Owner: GDI + Location: 64,55 + Actor646: brik + Owner: GDI + Location: 65,55 + Actor647: brik + Owner: GDI + Location: 65,56 + Actor648: brik + Owner: GDI + Location: 69,56 + Actor649: brik + Owner: GDI + Location: 69,55 + Actor650: brik + Owner: GDI + Location: 70,55 + Actor651: brik + Owner: GDI + Location: 70,56 + Actor653: brik + Owner: GDI + Location: 71,56 + Actor654: brik + Owner: GDI + Location: 72,56 + Actor673: brik + Owner: GDI + Location: 73,56 + Actor674: brik + Owner: GDI + Location: 72,55 + Actor675: brik + Owner: GDI + Location: 73,55 + Actor676: atwr + Owner: GDI + Location: 63,55 + Actor677: atwr + Owner: GDI + Location: 71,55 + Actor634: stwr + Owner: GDI + Location: 64,59 + ScriptTags: HardAndAbove + TurretFacing: 512 + Actor635: stwr + Owner: GDI + Location: 70,59 + TurretFacing: 512 + ScriptTags: HardAndAbove + Actor636: stwr + Owner: GDI + TurretFacing: 512 + Location: 72,59 + Actor682: gtwr + Owner: GDI + Location: 65,57 + Actor685: gtwr + Owner: GDI + Location: 69,57 + Actor743: nuk2 + Owner: GDI + Location: 83,22 + Actor759: nuk2 + Owner: GDI + Location: 85,22 + Actor760: gtek + Owner: GDI + Location: 48,21 + Actor792: cram + Owner: GDI + Location: 76,53 + TurretFacing: 586 + Actor793: cram + Owner: GDI + Location: 56,53 + TurretFacing: 354 + Actor796: cram + Owner: GDI + Location: 86,51 + Actor799: cram + Owner: GDI + Location: 49,52 + Actor802: cram + Owner: GDI + Location: 45,44 + Actor810: cram + Owner: GDI + Location: 90,25 + Actor815: cram + Owner: GDI + Location: 40,39 + Actor816: cram + Owner: GDI + Location: 40,27 + Actor835: cram + Owner: GDI + Location: 53,24 + Actor836: cram + Owner: GDI + Location: 52,36 + Actor837: cram + Owner: GDI + Location: 78,42 + Actor838: brik + Owner: GDI + Location: 90,43 + Actor839: brik + Owner: GDI + Location: 90,42 + Actor840: brik + Owner: GDI + Location: 90,41 + Actor841: brik + Owner: GDI + Location: 91,41 + Actor842: brik + Owner: GDI + Location: 91,40 + Actor843: brik + Owner: GDI + Location: 90,40 + Actor844: brik + Owner: GDI + Location: 90,36 + Actor845: brik + Owner: GDI + Location: 91,36 + Actor846: brik + Owner: GDI + Location: 91,35 + Actor847: brik + Owner: GDI + Location: 90,35 + Actor848: brik + Owner: GDI + Location: 91,34 + Actor849: brik + Owner: GDI + Location: 90,34 + Actor800: brik + Owner: GDI + Location: 90,45 + Actor804: brik + Owner: GDI + Location: 90,44 + Actor850: brik + Owner: GDI + Location: 89,45 + Actor851: brik + Owner: GDI + Location: 89,44 + Actor852: brik + Owner: GDI + Location: 90,33 + Actor853: brik + Owner: GDI + Location: 90,32 + Actor854: brik + Owner: GDI + Location: 89,32 + Actor855: brik + Owner: GDI + Location: 89,33 + Actor856: gtwr + Owner: GDI + Location: 92,40 + Actor857: gtwr + Owner: GDI + Location: 92,36 + Actor858: stwr + Owner: GDI + Location: 94,35 + TurretFacing: 852 + ScriptTags: HardAndAbove + Actor859: stwr + Owner: GDI + Location: 94,41 + TurretFacing: 702 + ScriptTags: HardAndAbove + Actor860: atwr + Owner: GDI + Location: 89,43 + Actor861: atwr + Owner: GDI + Location: 89,34 + Actor862: atwr + Owner: GDI + Location: 39,30 + Actor863: atwr + Owner: GDI + Location: 39,38 + Actor864: cram + Owner: GDI + Location: 89,47 + Actor865: cram + Owner: GDI + Location: 90,30 + Actor866: split2 + Owner: Neutral + Location: 52,15 + Actor867: split2 + Owner: Neutral + Location: 57,14 + Actor868: split2 + Owner: Neutral + Location: 56,10 + Actor869: split2 + Owner: Neutral + Location: 63,11 + Actor870: split2 + Owner: Neutral + Location: 68,13 + Actor871: split2 + Owner: Neutral + Location: 69,9 + Actor872: split2 + Owner: Neutral + Location: 73,12 + Actor873: split2 + Owner: Neutral + Location: 75,15 + Actor686: proc.td + Owner: GDI + Location: 79,16 + Actor704: proc.td + Owner: GDI + Location: 83,14 + Actor874: nuk2 + Owner: GDI + Location: 75,46 + Actor875: nuk2 + Owner: GDI + Location: 77,45 + Actor876: nuk2 + Owner: GDI + Location: 79,46 + Actor877: nuk2 + Owner: GDI + Location: 81,45 + Actor879: apwr + Owner: USSR + Location: 5,61 + Health: 25 + Actor880: apwr + Owner: USSR + Location: 8,61 + Health: 40 + Actor882: apwr + Owner: USSR + Location: 5,64 + Health: 38 + Actor883: apwr + Owner: USSR + Location: 8,64 + Health: 24 + Actor887: dome + Owner: USSR + Location: 2,72 + Health: 43 + Actor884: stek + Owner: USSR + Location: 2,68 + Health: 30 + Actor886: proc + Owner: USSR + Location: 12,65 + FreeActor@CHARV: False + FreeActor: False + Health: 42 + Actor895: afld + Owner: USSR + Location: 15,74 + Health: 47 + Actor897: nuk2 + Owner: Nod + Location: 130,54 + Health: 30 + Actor898: nuk2 + Owner: Nod + Location: 128,54 + Health: 36 + Actor899: nuk2 + Owner: Nod + Location: 126,54 + Health: 25 + Actor904: nuk2 + Owner: Nod + Location: 124,54 + Health: 24 + Actor907: tmpl + Owner: Nod + Location: 119,58 + Health: 42 + Actor910: proc.td + Owner: Nod + Location: 114,59 + FreeActor@SHARV: False + FreeActor: False + Health: 47 + Actor912: hq + Owner: Nod + Location: 114,64 + Health: 41 + Actor881: apwr + Owner: USSR + Location: 11,61 + Health: 43 + Actor744: brik + Owner: USSR + Location: 16,60 + Actor745: brik + Owner: USSR + Location: 16,61 + Actor746: brik + Owner: USSR + Location: 17,60 + Actor747: brik + Owner: USSR + Location: 17,61 + Actor748: brik + Owner: USSR + Location: 4,60 + Actor749: brik + Owner: USSR + Location: 5,60 + Actor750: brik + Owner: USSR + Location: 7,60 + Actor751: brik + Owner: USSR + Location: 8,60 + Actor752: brik + Owner: USSR + Location: 6,60 + Actor753: brik + Owner: USSR + Location: 9,60 + Actor754: brik + Owner: USSR + Location: 10,60 + Actor755: brik + Owner: USSR + Location: 11,60 + Actor756: brik + Owner: USSR + Location: 13,60 + Actor757: brik + Owner: USSR + Location: 12,60 + Actor758: brik + Owner: USSR + Location: 15,60 + Actor763: brik + Owner: USSR + Location: 14,60 + Actor764: brik + Owner: USSR + Location: 4,61 + Actor766: brik + Owner: USSR + Location: 4,62 + Actor767: brik + Owner: USSR + Location: 3,62 + Actor768: brik + Owner: USSR + Location: 2,62 + Health: 53 + Actor769: brik + Owner: USSR + Location: 1,62 + Actor771: brik + Owner: USSR + Location: 1,63 + Actor773: brik + Owner: USSR + Location: 1,64 + Actor777: brik + Owner: USSR + Location: 1,65 + Actor778: brik + Owner: USSR + Location: 1,76 + Actor779: brik + Owner: USSR + Location: 2,76 + Actor780: brik + Owner: USSR + Location: 1,77 + Actor781: brik + Owner: USSR + Location: 2,77 + Actor783: brik + Owner: USSR + Location: 1,75 + Actor786: brik + Owner: USSR + Location: 1,74 + Actor787: brik + Owner: USSR + Location: 1,73 + Actor788: brik + Owner: USSR + Location: 1,72 + Actor790: brik + Owner: USSR + Location: 1,71 + Actor791: brik + Owner: USSR + Location: 1,70 + Actor794: brik + Owner: USSR + Location: 1,69 + Actor795: brik + Owner: USSR + Location: 1,68 + Actor797: brik + Owner: USSR + Location: 1,67 + Actor798: brik + Owner: USSR + Location: 1,66 + Actor801: brik + Owner: USSR + Location: 5,76 + Actor803: brik + Owner: USSR + Location: 5,77 + Actor805: brik + Owner: USSR + Location: 6,76 + Health: 49 + Actor806: brik + Owner: USSR + Location: 6,77 + Actor807: brik + Owner: USSR + Location: 4,77 + Health: 37 + Actor808: brik + Owner: USSR + Location: 3,77 + Actor809: brik + Owner: USSR + Location: 11,77 + Actor811: brik + Owner: USSR + Location: 10,76 + Actor812: brik + Owner: USSR + Location: 11,76 + Actor813: brik + Owner: USSR + Location: 10,77 + Actor814: brik + Owner: USSR + Location: 13,77 + Actor817: brik + Owner: USSR + Location: 12,77 + Health: 60 + Actor818: brik + Owner: USSR + Location: 14,77 + Actor819: brik + Owner: USSR + Location: 15,77 + Health: 51 + Actor820: brik + Owner: USSR + Location: 16,77 + Actor821: brik + Owner: USSR + Location: 17,77 + Actor822: brik + Owner: USSR + Location: 18,77 + Actor823: brik + Owner: USSR + Location: 19,77 + Actor824: brik + Owner: USSR + Location: 20,77 + Actor825: brik + Owner: USSR + Location: 20,76 + Actor826: brik + Owner: USSR + Location: 20,75 + Actor827: brik + Owner: USSR + Location: 20,74 + Health: 40 + Actor828: brik + Owner: USSR + Location: 19,74 + Actor829: brik + Owner: USSR + Location: 19,75 + Actor830: brik + Owner: USSR + Location: 19,70 + Actor831: brik + Owner: USSR + Location: 19,71 + Actor832: brik + Owner: USSR + Location: 20,71 + Actor833: brik + Owner: USSR + Location: 20,70 + Actor834: brik + Owner: USSR + Location: 20,68 + Actor913: brik + Owner: USSR + Location: 20,67 + Actor914: brik + Owner: USSR + Location: 19,67 + Actor915: brik + Owner: USSR + Location: 19,68 + Actor916: brik + Owner: USSR + Location: 20,69 + Health: 43 + Actor500: brik + Owner: Nod + Location: 117,54 + Actor501: brik + Owner: Nod + Location: 117,53 + Actor502: brik + Owner: Nod + Location: 118,53 + Health: 47 + Actor503: brik + Owner: Nod + Location: 118,54 + Health: 24 + Actor504: brik + Owner: Nod + Location: 119,53 + Health: 71 + Actor505: brik + Owner: Nod + Location: 132,53 + Actor506: brik + Owner: Nod + Location: 131,53 + Actor507: brik + Owner: Nod + Location: 130,53 + Actor508: brik + Owner: Nod + Location: 128,53 + Actor509: brik + Owner: Nod + Location: 120,53 + Actor510: brik + Owner: Nod + Location: 122,53 + Actor511: brik + Owner: Nod + Location: 123,53 + Actor512: brik + Owner: Nod + Location: 121,53 + Actor523: brik + Owner: Nod + Location: 124,53 + Health: 42 + Actor529: brik + Owner: Nod + Location: 125,53 + Actor530: brik + Owner: Nod + Location: 126,53 + Actor535: brik + Owner: Nod + Location: 127,53 + Actor536: brik + Owner: Nod + Location: 129,53 + Actor537: brik + Owner: Nod + Location: 132,54 + Actor538: brik + Owner: Nod + Location: 132,55 + Actor539: brik + Owner: Nod + Location: 132,56 + Actor655: brik + Owner: Nod + Location: 132,57 + Actor656: brik + Owner: Nod + Location: 132,58 + Actor657: brik + Owner: Nod + Location: 132,59 + Actor658: brik + Owner: Nod + Location: 132,60 + Health: 46 + Actor659: brik + Owner: Nod + Location: 132,61 + Health: 45 + Actor660: brik + Owner: Nod + Location: 132,62 + Actor661: brik + Owner: Nod + Location: 132,63 + Actor662: brik + Owner: Nod + Location: 132,64 + Actor663: brik + Owner: Nod + Location: 132,65 + Actor664: brik + Owner: Nod + Location: 132,66 + Actor665: brik + Owner: Nod + Location: 132,67 + Actor666: brik + Owner: Nod + Location: 131,67 + Actor667: brik + Owner: Nod + Location: 130,67 + Actor668: brik + Owner: Nod + Location: 129,67 + Health: 38 + Actor669: brik + Owner: Nod + Location: 128,67 + Actor670: brik + Owner: Nod + Location: 127,67 + Actor671: brik + Owner: Nod + Location: 127,68 + Actor672: brik + Owner: Nod + Location: 126,68 + Actor678: brik + Owner: Nod + Location: 126,69 + Actor679: brik + Owner: Nod + Location: 127,69 + Actor680: brik + Owner: Nod + Location: 125,69 + Health: 72 + Actor681: brik + Owner: Nod + Location: 124,69 + Actor683: brik + Owner: Nod + Location: 123,69 + Actor684: brik + Owner: Nod + Location: 123,68 + Actor688: brik + Owner: Nod + Location: 124,68 + Health: 15 + Actor689: brik + Owner: Nod + Location: 118,68 + Actor690: brik + Owner: Nod + Location: 118,69 + Health: 45 + Actor692: brik + Owner: Nod + Location: 119,68 + Health: 37 + Actor693: brik + Owner: Nod + Location: 119,69 + Actor694: brik + Owner: Nod + Location: 117,69 + Actor695: brik + Owner: Nod + Location: 116,69 + Actor696: brik + Owner: Nod + Location: 115,68 + Actor697: brik + Owner: Nod + Location: 116,68 + Actor698: brik + Owner: Nod + Location: 115,69 + Actor699: brik + Owner: Nod + Location: 115,67 + Actor702: brik + Owner: Nod + Location: 114,67 + Actor703: brik + Owner: Nod + Location: 113,67 + Actor705: brik + Owner: Nod + Location: 112,67 + Health: 46 + Actor706: brik + Owner: Nod + Location: 111,67 + Actor707: brik + Owner: Nod + Location: 111,66 + Actor708: brik + Owner: Nod + Location: 111,65 + Actor710: brik + Owner: Nod + Location: 111,64 + Actor711: brik + Owner: Nod + Location: 111,63 + Actor712: brik + Owner: Nod + Location: 111,62 + Actor713: brik + Owner: Nod + Location: 111,61 + Actor714: brik + Owner: Nod + Location: 111,60 + Actor716: brik + Owner: Nod + Location: 111,58 + Actor717: brik + Owner: Nod + Location: 112,58 + Health: 17 + Actor718: brik + Owner: Nod + Location: 112,59 + Actor715: brik + Owner: Nod + Location: 111,59 + Health: 32 + Actor719: brik + Owner: England + Location: 76,93 + Health: 32 + Actor720: brik + Owner: England + Location: 77,93 + Actor721: brik + Owner: England + Location: 76,94 + Actor722: brik + Owner: England + Location: 77,94 + Actor723: brik + Owner: England + Location: 78,94 + Health: 52 + Actor725: brik + Owner: England + Location: 79,94 + Actor726: brik + Owner: England + Location: 79,93 + Actor727: brik + Owner: England + Location: 80,93 + Actor728: brik + Owner: England + Location: 81,93 + Actor730: brik + Owner: England + Location: 82,93 + Actor731: brik + Owner: England + Location: 82,92 + Actor732: brik + Owner: England + Location: 83,92 + Actor733: brik + Owner: England + Location: 83,88 + Actor734: brik + Owner: England + Location: 83,89 + Actor735: brik + Owner: England + Location: 83,90 + Actor736: brik + Owner: England + Location: 83,91 + Actor737: brik + Owner: England + Location: 84,88 + Actor738: brik + Owner: England + Location: 84,87 + Actor739: brik + Owner: England + Location: 84,85 + Actor740: brik + Owner: England + Location: 84,86 + Actor741: brik + Owner: England + Location: 84,84 + Actor917: brik + Owner: England + Location: 84,83 + Actor918: brik + Owner: England + Location: 84,82 + Actor919: brik + Owner: England + Location: 84,81 + Actor920: brik + Owner: England + Location: 84,80 + Actor921: brik + Owner: England + Location: 84,79 + Actor922: brik + Owner: England + Location: 83,79 + Actor923: brik + Owner: England + Location: 83,80 + Actor924: brik + Owner: England + Location: 82,79 + Actor925: brik + Owner: England + Location: 80,79 + Actor926: brik + Owner: England + Location: 79,79 + Health: 26 + Actor927: brik + Owner: England + Location: 77,79 + Actor928: brik + Owner: England + Location: 76,79 + Actor929: brik + Owner: England + Location: 76,80 + Actor930: brik + Owner: England + Location: 77,80 + Actor931: brik + Owner: England + Location: 78,79 + Actor932: brik + Owner: England + Location: 81,79 + Actor933: brik + Owner: England + Location: 71,80 + Actor934: brik + Owner: England + Location: 71,79 + Actor935: brik + Owner: England + Location: 72,79 + Actor936: brik + Owner: England + Location: 72,80 + Actor937: brik + Owner: England + Location: 69,79 + Actor938: brik + Owner: England + Location: 70,79 + Health: 60 + Actor939: brik + Owner: England + Location: 68,79 + Actor940: brik + Owner: England + Location: 66,79 + Actor941: brik + Owner: England + Location: 65,79 + Actor942: brik + Owner: England + Location: 64,79 + Actor943: brik + Owner: England + Location: 64,80 + Actor944: brik + Owner: England + Location: 65,80 + Actor945: brik + Owner: England + Location: 67,79 + Actor946: brik + Owner: England + Location: 64,81 + Actor947: brik + Owner: England + Location: 64,82 + Actor948: brik + Owner: England + Location: 64,83 + Actor949: brik + Owner: England + Location: 64,84 + Health: 26 + Actor950: brik + Owner: England + Location: 64,85 + Actor951: brik + Owner: England + Location: 63,85 + Actor952: brik + Owner: England + Location: 63,84 + Actor953: brik + Owner: England + Location: 63,90 + Actor954: brik + Owner: England + Location: 63,89 + Actor955: brik + Owner: England + Location: 64,89 + Actor956: brik + Owner: England + Location: 64,90 + Actor957: brik + Owner: England + Location: 64,91 + Actor958: brik + Owner: England + Location: 64,92 + Actor959: brik + Owner: England + Location: 64,93 + Actor960: brik + Owner: England + Location: 64,94 + Actor961: brik + Owner: England + Location: 65,93 + Actor962: brik + Owner: England + Location: 65,94 + Actor963: brik + Owner: England + Location: 67,94 + Actor964: brik + Owner: England + Location: 66,94 + Actor965: brik + Owner: England + Location: 69,94 + Actor966: brik + Owner: England + Location: 68,94 + Actor967: brik + Owner: England + Location: 71,94 + Actor968: brik + Owner: England + Location: 70,94 + Actor969: brik + Owner: England + Location: 72,94 + Actor970: brik + Owner: England + Location: 72,93 + Actor971: brik + Owner: England + Location: 71,93 + Actor905: zdef + Owner: GDI + Facing: 384 + Location: 72,95 + SubCell: 3 + Actor908: zdef + Owner: GDI + Facing: 384 + Location: 76,95 + SubCell: 3 + Actor972: zdef + Owner: GDI + Location: 75,86 + SubCell: 3 + Facing: 511 + Actor973: zdef + Owner: GDI + Facing: 384 + Location: 72,83 + SubCell: 3 + Actor878: n1 + Owner: GDI + Facing: 384 + Location: 77,85 + SubCell: 3 + Actor974: n1 + Owner: GDI + Facing: 384 + Location: 71,87 + SubCell: 3 + Actor975: n1 + Owner: GDI + Facing: 384 + Location: 77,87 + SubCell: 3 + Actor976: n1 + Owner: GDI + Location: 68,88 + SubCell: 3 + Facing: 709 + Actor977: mtnk + Owner: GDI + Location: 74,85 + Facing: 504 + ScriptTags: HardAndAbove + Actor978: apc2 + Owner: GDI + Facing: 384 + Location: 76,84 + Actor979: htnk + Owner: GDI + Location: 122,63 + Facing: 384 + ScriptTags: HardAndAbove + Actor980: vulc + Owner: GDI + Facing: 384 + Location: 124,65 + Actor981: vulc + Owner: GDI + Facing: 384 + Location: 120,62 + Actor983: hmmv + Owner: GDI + Location: 9,72 + Facing: 384 + Actor984: htnk + Owner: GDI + Location: 10,70 + Facing: 627 + ScriptTags: HardAndAbove + Actor985: vulc + Owner: GDI + Location: 16,68 + Facing: 606 + Actor986: vulc + Owner: GDI + Location: 10,68 + Facing: 641 + Actor987: jjet + Owner: GDI + Facing: 384 + Location: 118,61 + Actor988: jjet + Owner: GDI + Facing: 384 + Location: 125,63 + Actor989: jjet + Owner: GDI + Location: 12,70 + Facing: 675 + Actor990: jjet + Owner: GDI + Location: 16,65 + Facing: 722 + Actor991: zdef + Owner: GDI + Location: 8,71 + SubCell: 3 + Facing: 593 + Actor992: zdef + Owner: GDI + Location: 10,78 + SubCell: 3 + Facing: 600 + Actor993: zdef + Owner: GDI + Location: 6,79 + SubCell: 3 + Facing: 688 + Actor994: zdef + Owner: GDI + Location: 21,74 + SubCell: 3 + Facing: 647 + Actor995: zdef + Owner: GDI + Facing: 384 + Location: 118,70 + SubCell: 3 + Actor996: zdef + Owner: GDI + Facing: 384 + Location: 123,70 + SubCell: 3 + Actor997: zdef + Owner: GDI + Facing: 384 + Location: 122,62 + SubCell: 3 + Actor998: zdef + Owner: GDI + Facing: 384 + Location: 125,62 + SubCell: 3 + Actor999: n3 + Owner: GDI + Facing: 384 + Location: 123,63 + SubCell: 3 + Actor1000: n3 + Owner: GDI + Facing: 384 + Location: 120,61 + SubCell: 3 + Actor1001: n3 + Owner: GDI + Location: 14,70 + SubCell: 3 + Facing: 641 + Actor1002: n3 + Owner: GDI + Location: 8,67 + SubCell: 3 + Facing: 702 + Actor1003: n1 + Owner: GDI + Location: 15,67 + SubCell: 3 + Facing: 647 + Actor1004: n1 + Owner: GDI + Location: 10,72 + SubCell: 3 + Facing: 627 + TurretFacing: 886 + Actor1005: n1 + Owner: GDI + Facing: 384 + Location: 9,71 + SubCell: 3 + Actor1035: n1 + Owner: GDI + Location: 21,70 + SubCell: 3 + Facing: 579 + Actor1055: n1 + Owner: GDI + Facing: 384 + Location: 126,61 + SubCell: 3 + Actor1072: n1 + Owner: GDI + Facing: 384 + Location: 127,57 + SubCell: 3 + Actor1081: n1 + Owner: GDI + Facing: 384 + Location: 120,56 + SubCell: 3 + Actor1083: ztrp + Owner: GDI + Facing: 384 + Location: 73,51 + SubCell: 3 + Actor1084: ztrp + Owner: GDI + Facing: 384 + Location: 71,60 + SubCell: 3 + Actor1085: ztrp + Owner: GDI + Facing: 384 + Location: 63,60 + SubCell: 3 + Actor1086: zdef + Owner: GDI + Facing: 384 + Location: 72,61 + SubCell: 3 + Actor1096: zdef + Owner: GDI + Facing: 384 + Location: 63,41 + SubCell: 3 + Actor1097: zdef + Owner: GDI + Facing: 384 + Location: 68,41 + SubCell: 3 + Actor1103: zdef + Owner: GDI + Facing: 384 + Location: 43,40 + SubCell: 3 + Actor1104: zdef + Owner: GDI + Facing: 384 + Location: 43,37 + SubCell: 3 + Actor1107: zdef + Owner: GDI + Facing: 384 + Location: 36,32 + SubCell: 3 + Actor1119: zdef + Owner: GDI + Facing: 384 + Location: 36,37 + SubCell: 3 + Actor1131: zdef + Owner: GDI + Facing: 384 + Location: 94,42 + SubCell: 3 + Actor1146: zdef + Owner: GDI + Facing: 384 + Location: 95,36 + SubCell: 3 + Actor1147: ztrp + Owner: GDI + Facing: 384 + Location: 85,42 + SubCell: 3 + Actor1148: ztrp + Owner: GDI + Facing: 384 + Location: 81,39 + SubCell: 3 + Actor1149: n1 + Owner: GDI + Facing: 384 + Location: 84,40 + SubCell: 3 + Actor1150: n1 + Owner: GDI + Facing: 384 + Location: 86,35 + SubCell: 3 + Actor1152: n1 + Owner: GDI + Facing: 384 + Location: 82,35 + SubCell: 3 + Actor1156: n1 + Owner: GDI + Facing: 384 + Location: 82,33 + SubCell: 3 + Actor1157: n1 + Owner: GDI + Facing: 384 + Location: 51,32 + SubCell: 3 + Actor1158: n1 + Owner: GDI + Facing: 384 + Location: 50,29 + SubCell: 3 + Actor1159: n1 + Owner: GDI + Facing: 384 + Location: 43,29 + SubCell: 3 + Actor1160: n1 + Owner: GDI + Facing: 384 + Location: 43,32 + SubCell: 3 + Actor1161: n1 + Owner: GDI + Facing: 384 + Location: 46,37 + SubCell: 3 + Actor1162: n1 + Owner: GDI + Facing: 384 + Location: 41,30 + SubCell: 3 + Actor1163: n1 + Owner: GDI + Facing: 384 + Location: 50,24 + SubCell: 3 + Actor1164: n1 + Owner: GDI + Facing: 384 + Location: 47,23 + SubCell: 3 + Actor1165: n1 + Owner: GDI + Facing: 384 + Location: 70,20 + SubCell: 3 + Actor1166: n1 + Owner: GDI + Facing: 384 + Location: 71,21 + SubCell: 3 + Actor1167: n1 + Owner: GDI + Facing: 384 + Location: 79,20 + SubCell: 3 + Actor1168: n1 + Owner: GDI + Facing: 384 + Location: 86,20 + SubCell: 3 + Actor1169: n1 + Owner: GDI + Facing: 384 + Location: 88,24 + SubCell: 3 + Actor1170: n1 + Owner: GDI + Facing: 384 + Location: 88,28 + SubCell: 3 + Actor1171: n1 + Owner: GDI + Facing: 384 + Location: 82,48 + SubCell: 3 + Actor1172: n1 + Owner: GDI + Facing: 384 + Location: 77,43 + SubCell: 3 + Actor1173: n1 + Owner: GDI + Facing: 384 + Location: 73,60 + SubCell: 3 + Actor1174: n1 + Owner: GDI + Facing: 384 + Location: 64,60 + SubCell: 3 + Actor1176: n1 + Owner: GDI + Facing: 384 + Location: 68,50 + SubCell: 3 + Actor1177: n1 + Owner: GDI + Facing: 384 + Location: 62,49 + SubCell: 3 + Actor1178: n1 + Owner: GDI + Facing: 384 + Location: 53,45 + SubCell: 3 + Actor1179: n1 + Owner: GDI + Facing: 384 + Location: 46,44 + SubCell: 3 + Actor1180: n3 + Owner: GDI + Facing: 384 + Location: 77,42 + SubCell: 3 + Actor1181: n3 + Owner: GDI + Facing: 384 + Location: 44,40 + SubCell: 3 + Actor1182: n3 + Owner: GDI + Facing: 384 + Location: 49,35 + SubCell: 3 + Actor1183: n3 + Owner: GDI + Facing: 384 + Location: 55,34 + SubCell: 3 + Actor1184: n3 + Owner: GDI + Facing: 384 + Location: 44,28 + SubCell: 3 + Actor1185: n3 + Owner: GDI + Facing: 384 + Location: 87,29 + SubCell: 3 + Actor1186: n3 + Owner: GDI + Facing: 384 + Location: 79,39 + SubCell: 3 + Actor1187: n3 + Owner: GDI + Facing: 384 + Location: 77,35 + SubCell: 3 + Actor1188: n3 + Owner: GDI + Facing: 384 + Location: 71,40 + SubCell: 3 + Actor1189: cram + Owner: GDI + Location: 91,80 + TurretFacing: 832 + ScriptTags: HardAndAbove + Actor1190: cram + Owner: GDI + Location: 41,74 + TurretFacing: 341 + ScriptTags: HardAndAbove + Actor1191: cram + Owner: GDI + Location: 43,87 + TurretFacing: 395 + ScriptTags: HardAndAbove + Actor1192: cram + Owner: GDI + Location: 90,63 + TurretFacing: 832 + ScriptTags: HardAndAbove + Actor1193: cram + Owner: GDI + Location: 46,64 + TurretFacing: 286 + ScriptTags: HardAndAbove + Actor1194: cram + Owner: GDI + Location: 56,96 + ScriptTags: HardAndAbove + TurretFacing: 320 + Actor1195: cram + Owner: GDI + Location: 83,96 + TurretFacing: 716 + ScriptTags: HardAndAbove + Actor1198: disr + Owner: GDI + Location: 86,33 + Facing: 634 + Actor1199: titn + Owner: GDI + Location: 97,36 + Facing: 654 + Actor1200: titn + Owner: GDI + Location: 97,40 + Facing: 627 + Actor1201: titn + Owner: GDI + Location: 65,61 + Facing: 512 + Actor1202: titn + Owner: GDI + Location: 70,61 + Facing: 512 + Actor1203: titn + Owner: GDI + Facing: 384 + Location: 35,36 + Actor1204: titn + Owner: GDI + Facing: 384 + Location: 35,30 + Actor1205: titn + Owner: GDI + Location: 71,42 + Facing: 463 + ScriptTags: VeryHardAndAbove + Actor1206: titn + Owner: GDI + Location: 62,42 + Facing: 600 + ScriptTags: HardAndAbove + Actor1207: xo + Owner: GDI + Facing: 384 + Location: 39,96 + Actor1208: xo + Owner: GDI + Facing: 384 + Location: 43,100 + Actor1209: xo + Owner: GDI + Location: 19,120 + Facing: 647 + Actor1210: xo + Owner: GDI + Location: 17,114 + Facing: 716 + Actor1211: xo + Owner: GDI + Location: 118,113 + Facing: 384 + Actor1212: xo + Owner: GDI + Facing: 384 + Location: 123,117 + Actor1213: xo + Owner: GDI + Facing: 384 + Location: 117,84 + Actor1214: xo + Owner: GDI + Location: 113,47 + Facing: 593 + Actor1215: xo + Owner: GDI + Facing: 384 + Location: 123,45 + Actor1217: htnk.ion + Owner: GDI + Location: 78,40 + Facing: 620 + Actor1218: htnk.ion + Owner: GDI + Facing: 384 + Location: 47,34 + Actor1219: htnk.ion + Owner: GDI + Facing: 384 + Location: 50,36 + Actor1220: jugg + Owner: GDI + Facing: 384 + Location: 77,51 + Actor1221: jugg + Owner: GDI + Facing: 384 + Location: 54,52 + Actor1222: jugg + Owner: GDI + Facing: 384 + Location: 88,46 + Actor1223: jugg + Owner: GDI + Facing: 384 + Location: 41,41 + Actor1224: jugg + Owner: GDI + Facing: 384 + Location: 47,45 + Actor1225: vulc + Owner: GDI + Location: 80,45 + Facing: 518 + Actor1226: vulc + Owner: GDI + Facing: 384 + Location: 52,39 + Actor1227: vulc + Owner: GDI + Facing: 384 + Location: 52,33 + Actor1228: vulc + Owner: GDI + Location: 82,31 + Facing: 647 + Actor1229: vulc + Owner: GDI + Location: 75,45 + Facing: 518 + Actor1230: msam + Owner: GDI + Facing: 384 + Location: 77,48 + Actor1233: wolv + Owner: GDI + Location: 8,77 + Facing: 491 + Actor1234: wolv + Owner: GDI + Facing: 384 + Location: 30,55 + Actor1235: wolv + Owner: GDI + Facing: 384 + Location: 25,53 + Gateway: wormholexxl + Owner: Scrin + Location: 66,27 + Actor1237: chain + Owner: GDI + Location: 66,24 + Actor1238: chain + Owner: GDI + Location: 65,24 + Actor1239: chain + Owner: GDI + Location: 64,24 + Actor1240: chain + Owner: GDI + Location: 63,24 + Actor1241: chain + Owner: GDI + Location: 67,24 + Actor1242: chain + Owner: GDI + Location: 68,24 + Actor1243: chain + Owner: GDI + Location: 69,24 + Actor1244: chain + Owner: GDI + Location: 63,25 + Actor1245: chain + Owner: GDI + Location: 63,26 + Actor1246: chain + Owner: GDI + Location: 63,27 + Actor1247: chain + Owner: GDI + Location: 63,28 + Actor1248: chain + Owner: GDI + Location: 63,29 + Actor1249: chain + Owner: GDI + Location: 63,30 + Actor1252: chain + Owner: GDI + Location: 69,25 + Actor1253: chain + Owner: GDI + Location: 69,26 + Actor1254: chain + Owner: GDI + Location: 69,27 + Actor1255: chain + Owner: GDI + Location: 69,28 + Actor1256: chain + Owner: GDI + Location: 69,29 + Actor1257: chain + Owner: GDI + Location: 69,30 + Actor1258: chain + Owner: GDI + Location: 68,30 + Actor1259: chain + Owner: GDI + Location: 64,30 + Actor1250: barb + Owner: GDI + Location: 63,23 + Actor1251: barb + Owner: GDI + Location: 62,23 + Actor1260: barb + Owner: GDI + Location: 62,24 + Actor1261: barb + Owner: GDI + Location: 62,26 + Actor1262: barb + Owner: GDI + Location: 62,25 + Actor1263: barb + Owner: GDI + Location: 62,27 + Actor1264: barb + Owner: GDI + Location: 62,28 + Actor1265: barb + Owner: GDI + Location: 62,29 + Actor1266: barb + Owner: GDI + Location: 62,30 + Actor1267: barb + Owner: GDI + Location: 62,31 + Actor1268: barb + Owner: GDI + Location: 63,31 + Actor1269: barb + Owner: GDI + Location: 64,31 + Actor1270: barb + Owner: GDI + Location: 68,31 + Actor1271: barb + Owner: GDI + Location: 69,31 + Actor1272: barb + Owner: GDI + Location: 70,31 + Actor1273: barb + Owner: GDI + Location: 70,30 + Actor1274: barb + Owner: GDI + Location: 70,28 + Actor1275: barb + Owner: GDI + Location: 70,29 + Actor1276: barb + Owner: GDI + Location: 70,27 + Actor1277: barb + Owner: GDI + Location: 70,26 + Actor1278: barb + Owner: GDI + Location: 70,25 + Actor1279: barb + Owner: GDI + Location: 70,24 + Actor1280: barb + Owner: GDI + Location: 69,23 + Actor1281: barb + Owner: GDI + Location: 70,23 + Actor1282: barb + Owner: GDI + Location: 67,23 + Actor1283: barb + Owner: GDI + Location: 68,23 + Actor1284: barb + Owner: GDI + Location: 66,23 + Actor1285: barb + Owner: GDI + Location: 65,23 + Actor1286: barb + Owner: GDI + Location: 64,23 + Actor1287: barb + Owner: GDI + Location: 64,32 + Actor1288: barb + Owner: GDI + Location: 68,32 + Actor1289: barb + Owner: GDI + Location: 63,32 + Actor1290: barb + Owner: GDI + Location: 69,32 + Actor1297: jeep + Owner: Greece + Facing: 0 + Location: 72,121 + Actor1298: jeep + Owner: Greece + Facing: 0 + Location: 76,121 + Actor1299: 2tnk + Owner: Greece + Facing: 0 + Location: 71,123 + Actor1300: 2tnk + Owner: Greece + Facing: 0 + Location: 73,123 + Actor1301: 2tnk + Owner: Greece + Facing: 0 + Location: 75,123 + Actor1302: 2tnk + Owner: Greece + Facing: 0 + Location: 77,123 + Actor1312: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 72,125 + Actor1313: e1 + Owner: Greece + SubCell: 2 + Facing: 0 + Location: 70,125 + Actor1314: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 70,125 + Actor1315: e1 + Owner: Greece + SubCell: 2 + Facing: 0 + Location: 72,125 + Actor1322: e1 + Owner: Greece + SubCell: 1 + Facing: 0 + Location: 72,125 + Actor1323: e1 + Owner: Greece + SubCell: 2 + Facing: 0 + Location: 74,125 + Actor1324: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 74,125 + Actor1325: e1 + Owner: Greece + SubCell: 1 + Facing: 0 + Location: 74,125 + Actor1326: e1 + Owner: Greece + SubCell: 2 + Facing: 0 + Location: 76,125 + Actor1327: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 76,125 + Actor1328: e1 + Owner: Greece + SubCell: 1 + Facing: 0 + Location: 76,125 + Actor1329: e1 + Owner: Greece + SubCell: 1 + Facing: 0 + Location: 78,125 + Actor1330: e1 + Owner: Greece + SubCell: 3 + Facing: 0 + Location: 78,125 + Actor1293: e3 + Owner: Greece + Location: 71,126 + SubCell: 2 + Facing: 0 + Actor1291: e3 + Owner: Greece + SubCell: 2 + Facing: 0 + Location: 73,126 + Actor1294: e3 + Owner: Greece + SubCell: 1 + Facing: 0 + Location: 73,126 + Actor1295: e3 + Owner: Greece + SubCell: 2 + Facing: 0 + Location: 75,126 + Actor1296: e3 + Owner: Greece + SubCell: 1 + Facing: 0 + Location: 75,126 + Actor1304: e3 + Owner: Greece + SubCell: 1 + Facing: 0 + Location: 77,126 + NodBaseCenter: waypoint + Owner: Neutral + Location: 122,61 + AlliedBaseCenter: waypoint + Owner: Neutral + Location: 74,87 + SovietBaseCenter: waypoint + Owner: Neutral + Location: 10,69 + AlliedBaseFlare: flare + Owner: Greece + Location: 74,88 + Actor1309: n1 + Owner: GDI + Facing: 384 + SubCell: 3 + Location: 71,96 + Actor1310: n1 + Owner: GDI + SubCell: 3 + Location: 77,96 + Facing: 559 + WestPath1: waypoint + Owner: Neutral + Location: 34,34 + WestPath2: waypoint + Owner: Neutral + Location: 22,62 + WestPath3: waypoint + Owner: Neutral + Location: 26,87 + WestPath4a: waypoint + Owner: Neutral + Location: 32,120 + WestPath4b: waypoint + Owner: Neutral + Location: 42,107 + MiddlePath1: waypoint + Owner: Neutral + Location: 67,62 + MiddlePath2: waypoint + Owner: Neutral + Location: 74,77 + MiddlePath3: waypoint + Owner: Neutral + Location: 74,101 + EastPath1: waypoint + Owner: Neutral + Location: 99,38 + EastPath2: waypoint + Owner: Neutral + Location: 108,54 + EastPath3: waypoint + Owner: Neutral + Location: 107,70 + EastPath4: waypoint + Owner: Neutral + Location: 104,94 + EastPath5a: waypoint + Owner: Neutral + Location: 93,104 + EastPath5b: waypoint + Owner: Neutral + Location: 103,112 + MiddlePath4a: waypoint + Owner: Neutral + Location: 64,107 + MiddlePath4b: waypoint + Owner: Neutral + Location: 80,106 + McvSpawn: waypoint + Owner: Neutral + Location: 74,132 + McvDest: waypoint + Owner: Neutral + Location: 74,122 + SovietFactory: weap + Owner: USSR + Location: 6,68 + Health: 40 + SovietBarracks: barr + Owner: USSR + Location: 12,71 + Health: 38 + SovietAirfield: fix + Owner: USSR + Location: 15,71 + Health: 45 + NodHand: hand + Owner: Nod + Location: 117,63 + Health: 40 + NodAirstrip: airs + Owner: Nod + Location: 126,63 + Health: 42 + NodHelipad: hpad.td + Owner: Nod + Location: 123,58 + Health: 44 + Coil1: waypoint + Owner: Neutral + Location: 4,76 + Coil2: waypoint + Owner: Neutral + Location: 12,76 + Coil3: waypoint + Owner: Neutral + Location: 19,76 + Coil4: waypoint + Owner: Neutral + Location: 19,69 + FlameTower1: waypoint + Owner: Neutral + Location: 5,78 + FlameTower2: waypoint + Owner: Neutral + Location: 11,78 + FlameTower3: waypoint + Owner: Neutral + Location: 21,75 + FlameTower4: waypoint + Owner: Neutral + Location: 21,69 + Coil5: waypoint + Owner: Neutral + Location: 15,61 + SovietSAM1: waypoint + Owner: Neutral + Location: 6,73 + NodSAM1: waypoint + Owner: Neutral + Location: 120,65 + Obelisk1: waypoint + Owner: Neutral + Location: 125,68 + Obelisk2: waypoint + Owner: Neutral + Location: 117,68 + Obelisk3: waypoint + Owner: Neutral + Location: 112,66 + Obelisk4: waypoint + Owner: Neutral + Location: 112,60 + Obelisk5: waypoint + Owner: Neutral + Location: 119,54 + LasTur1: waypoint + Owner: Neutral + Location: 117,70 + LasTur2: waypoint + Owner: Neutral + Location: 125,70 + LasTur3: waypoint + Owner: Neutral + Location: 110,58 + Actor982: hmmv + Owner: GDI + Facing: 384 + Location: 72,87 + NodRally: waypoint + Owner: Neutral + Location: 89,111 + DisruptorDropSpawn: waypoint + Owner: Neutral + Location: 67,1 + Actor1311: n1 + Owner: GDI + Facing: 384 + Location: 30,54 + SubCell: 3 + Actor1332: n1 + Owner: GDI + Facing: 384 + Location: 29,54 + SubCell: 3 + Actor1333: n1 + Owner: GDI + Facing: 384 + Location: 26,52 + SubCell: 3 + Actor1334: n1 + Owner: GDI + Facing: 384 + Location: 24,52 + SubCell: 3 + Actor1335: n1 + Owner: GDI + Facing: 384 + Location: 24,53 + SubCell: 3 + Actor1336: n1 + Owner: GDI + Facing: 384 + Location: 31,56 + SubCell: 3 + Actor1337: n1 + Owner: GDI + Facing: 384 + Location: 32,55 + SubCell: 3 + Actor1338: n1 + Owner: GDI + Location: 97,54 + SubCell: 3 + Facing: 627 + Actor1339: n1 + Owner: GDI + SubCell: 3 + Facing: 627 + Location: 96,55 + Actor1340: n1 + Owner: GDI + SubCell: 3 + Facing: 627 + Location: 98,54 + Actor1342: n1 + Owner: GDI + SubCell: 3 + Facing: 627 + Location: 102,53 + Actor1341: n1 + Owner: GDI + SubCell: 3 + Facing: 627 + Location: 102,51 + Actor1343: n1 + Owner: GDI + SubCell: 3 + Facing: 627 + Location: 104,51 + Actor1344: n1 + Owner: GDI + SubCell: 3 + Facing: 627 + Location: 97,53 + Actor1345: vulc.ai + Owner: GDI + Location: 96,54 + Facing: 606 + Actor1346: msam + Owner: GDI + Location: 103,49 + Facing: 627 + Actor1347: msam + Owner: GDI + Location: 89,41 + Facing: 647 + Actor1348: mtnk + Owner: GDI + Location: 100,51 + Facing: 606 + SovietRally: waypoint + Owner: Neutral + Location: 25,102 + Actor1349: sbag + Owner: GDI + Location: 61,62 + Actor1350: sbag + Owner: GDI + Location: 61,63 + Actor1351: sbag + Owner: GDI + Location: 62,63 + Actor1352: sbag + Owner: GDI + Location: 63,63 + Actor1353: sbag + Owner: GDI + Location: 64,63 + Actor1355: sbag + Owner: GDI + Location: 70,63 + Actor1356: sbag + Owner: GDI + Location: 71,63 + Actor1357: sbag + Owner: GDI + Location: 72,63 + Actor1358: sbag + Owner: GDI + Location: 73,63 + Actor1359: sbag + Owner: GDI + Location: 74,63 + Actor1360: sbag + Owner: GDI + Location: 74,62 + Actor1361: sbag + Owner: GDI + Location: 60,62 + Actor1362: sbag + Owner: GDI + Location: 60,61 + Actor1363: sbag + Owner: GDI + Location: 75,62 + Actor1364: sbag + Owner: GDI + Location: 75,61 + Actor1354: sbag + Owner: GDI + Location: 32,57 + Actor1365: sbag + Owner: GDI + Location: 31,57 + Actor1366: sbag + Owner: GDI + Location: 30,57 + Actor1367: sbag + Owner: GDI + Location: 29,57 + Actor1368: sbag + Owner: GDI + Location: 29,56 + Actor1369: sbag + Owner: GDI + Location: 24,54 + Actor1370: sbag + Owner: GDI + Location: 23,54 + Actor1371: sbag + Owner: GDI + Location: 23,53 + Actor1372: sbag + Owner: GDI + Location: 23,52 + Actor1373: sbag + Owner: GDI + Location: 23,51 + Actor1374: sbag + Owner: GDI + Location: 22,51 + Actor1375: gtwr + Owner: GDI + Location: 83,19 + Actor1376: gtwr + Owner: GDI + Location: 46,18 + Actor1377: vulc.ai + Owner: GDI + Facing: 384 + Location: 85,20 + Actor1379: vulc.ai + Owner: GDI + Facing: 384 + Location: 87,19 + Actor1380: vulc.ai + Owner: GDI + Facing: 384 + Location: 55,22 + Actor1381: vulc.ai + Owner: GDI + Facing: 384 + Location: 46,20 + Actor1378: vulc.ai + Owner: GDI + Facing: 384 + Location: 51,23 + Actor1082: ztrp + Owner: GDI + Facing: 384 + Location: 72,51 + SubCell: 3 + HawthorneHQ: miss + Owner: GDI + Location: 65,43 + Actor1382: chain + Owner: GDI + Location: 64,42 + Actor1383: chain + Owner: GDI + Location: 66,42 + Actor1384: chain + Owner: GDI + Location: 65,42 + Actor1385: chain + Owner: GDI + Location: 67,42 + Actor1386: chain + Owner: GDI + Location: 68,42 + Actor1387: chain + Owner: GDI + Location: 68,43 + Actor1388: chain + Owner: GDI + Location: 68,44 + Actor1389: chain + Owner: GDI + Location: 68,45 + Actor1390: chain + Owner: GDI + Location: 64,43 + Actor1391: chain + Owner: GDI + Location: 64,44 + Actor1392: chain + Owner: GDI + Location: 64,45 + Actor1393: chain + Owner: GDI + Location: 64,46 + Actor1394: chain + Owner: GDI + Location: 65,46 + Actor1395: chain + Owner: GDI + Location: 68,46 + Actor1396: chain + Owner: GDI + Location: 67,46 + Actor1397: cram + Owner: GDI + Location: 69,45 + Actor1398: cram + Owner: GDI + Location: 69,44 + Actor1399: cram + Owner: GDI + Location: 63,45 + Actor1400: cram + Owner: GDI + Location: 63,44 + Actor1401: gtwr + Owner: GDI + Location: 63,46 + Actor1402: gtwr + Owner: GDI + Location: 69,46 + Actor1403: rmbo + Owner: GDI + Location: 67,47 + SubCell: 3 + Facing: 384 + ScriptTags: HardAndAbove + Actor1232: msam + Owner: GDI + Facing: 491 + Location: 74,54 + Actor1231: msam + Owner: GDI + Facing: 518 + Location: 60,54 + Actor1216: htnk.ion + Owner: GDI + Facing: 511 + Location: 61,50 + Actor1196: disr + Owner: GDI + Facing: 504 + Location: 69,50 + Actor1175: n1 + Owner: GDI + Facing: 384 + Location: 69,49 + SubCell: 3 + PlayerStart: waypoint + Owner: Neutral + Location: 74,119 + Actor1308: split2 + Owner: Neutral + Location: 57,119 + Actor1404: camera + Owner: GDI + Location: 74,82 + Actor1405: camera + Owner: GDI + Location: 15,66 + Actor1406: camera + Owner: GDI + Location: 118,58 + Actor1407: camera + Owner: GDI + Location: 59,109 + Actor1408: camera + Owner: GDI + Location: 67,123 + Actor1409: camera + Owner: GDI + Location: 82,106 + Actor1410: camera + Owner: GDI + Location: 88,119 + Actor1411: camera + Owner: GDI + Location: 35,99 + Actor1412: camera + Owner: GDI + Location: 105,83 + Actor1292: cryt + Owner: Greece + Location: 70,122 + SubCell: 3 + Facing: 0 + Actor1303: cryt + Owner: Greece + Location: 78,122 + SubCell: 3 + Facing: 0 + NormalAndBelowCryo1: cryo + Owner: Greece + Location: 71,127 + Facing: 0 + ScriptTags: NormalAndBelow + NormalAndBelowCryo2: cryo + Owner: Greece + Location: 77,127 + Facing: 0 + ScriptTags: NormalAndBelow + CommandoDropDest: waypoint + Owner: Neutral + Location: 107,126 + CommandoDropWp1: waypoint + Owner: Neutral + Location: 128,120 + EngiDropWp1: waypoint + Owner: Neutral + Location: 10,102 + DisruptorDropDest4: waypoint + Owner: Neutral + Location: 52,82 + DisruptorDropRally: waypoint + Owner: Neutral + Location: 46,68 + DisruptorDropDest3: waypoint + Owner: Neutral + Location: 57,88 + DisruptorDropDest1: waypoint + Owner: Neutral + Location: 62,97 + DisruptorDropDest2: waypoint + Owner: Neutral + Location: 57,107 + LeftDropSpawn: waypoint + Owner: Neutral + Location: 17,1 + RightDropSpawn: waypoint + Owner: Neutral + Location: 124,1 + LeftEngiDropDest: waypoint + Owner: Neutral + Location: 5,67 + RightEngiDropDest: waypoint + Owner: Neutral + Location: 131,61 + RightDropExit: waypoint + Owner: Neutral + Location: 132,124 + LeftDropExit: waypoint + Owner: Neutral + Location: 1,129 + Actor1306: htnk.ion + Owner: GDI + Location: 121,114 + ScriptTags: VeryHardAndAbove + Facing: 384 + Actor1307: htnk.ion + Owner: GDI + Location: 123,115 + ScriptTags: VeryHardAndAbove + Facing: 384 + Actor1316: htnk.ion + Owner: GDI + Location: 17,122 + Facing: 768 + ScriptTags: VeryHardAndAbove + Actor1331: htnk.ion + Owner: GDI + Location: 15,116 + Facing: 768 + ScriptTags: VeryHardAndAbove + Actor1413: htnk.ion + Owner: GDI + Location: 17,118 + Facing: 768 + ScriptTags: VeryHardAndAbove + Actor1414: htnk.ion + Owner: GDI + Facing: 384 + Location: 124,83 + ScriptTags: VeryHardAndAbove + Actor1415: htnk.ion + Owner: GDI + Facing: 384 + Location: 123,81 + ScriptTags: VeryHardAndAbove + Actor1417: htnk.ion + Owner: GDI + Location: 5,87 + Facing: 642 + ScriptTags: VeryHardAndAbove + Actor1416: htnk.ion + Owner: GDI + Location: 5,90 + Facing: 642 + ScriptTags: VeryHardAndAbove + ZR1: zrai + Owner: GDI + Location: 78,37 + SubCell: 3 + Facing: 384 + ZR2: zrai + Owner: GDI + Location: 79,37 + SubCell: 3 + Facing: 586 + ZR3: zrai + Owner: GDI + Location: 80,37 + SubCell: 3 + Facing: 384 + ZR4: zrai + Owner: GDI + Location: 81,37 + SubCell: 3 + Facing: 384 + ScriptTags: HardAndAbove + ZR5: zrai + Owner: GDI + Location: 82,37 + SubCell: 3 + Facing: 511 + ScriptTags: HardAndAbove + ZR6: zrai + Owner: GDI + Location: 83,37 + SubCell: 3 + Facing: 384 + ScriptTags: HardAndAbove + ZR7: zrai + Owner: GDI + Location: 84,37 + SubCell: 3 + Facing: 384 + ScriptTags: VeryHardAndAbove + ZR8: zrai + Owner: GDI + Location: 85,37 + SubCell: 3 + Facing: 654 + ScriptTags: BrutalOnly + ZRWP1: waypoint + Owner: Neutral + Location: 86,50 + ZRWP2: waypoint + Owner: Neutral + Location: 90,54 + ZRWP3: waypoint + Owner: Neutral + Location: 91,81 + ZRWP4: waypoint + Owner: Neutral + Location: 86,90 + ZRWP5b: waypoint + Owner: Neutral + Location: 83,87 + HawthorneSpawn: waypoint + Owner: Neutral + Location: 66,45 + HawthorneJumpDest: waypoint + Owner: Neutral + Location: 66,40 + HardAndBelowMechanic: mech + Owner: Greece + Location: 69,125 + SubCell: 3 + Facing: 0 + ScriptTags: HardAndBelow + HardAndBelowMedic: medi + Owner: Greece + Facing: 0 + Location: 79,125 + SubCell: 3 + ScriptTags: HardAndBelow + NormalAndBelowIFV1: ifv + Owner: Greece + Location: 69,123 + Facing: 0 + ScriptTags: NormalAndBelow + NormalAndBelowIFV2: ifv + Owner: Greece + Location: 79,123 + Facing: 0 + ScriptTags: NormalAndBelow + ZRWP5a: waypoint + Owner: Neutral + Location: 81,92 + ZRWP5c: waypoint + Owner: Neutral + Location: 82,90 + Actor1236: hmmv.tow + Owner: GDI + Location: 47,28 + Facing: 252 + Actor1305: hmmv.tow + Owner: GDI + Location: 49,32 + Facing: 259 + Actor1418: hmmv.tow + Owner: GDI + Location: 80,28 + Facing: 763 + Actor1419: hmmv.tow + Owner: GDI + Location: 85,32 + Facing: 252 + Actor1420: hmmv.tow + Owner: GDI + Facing: 384 + Location: 81,48 + Actor1425: hmmv.tow + Owner: GDI + Facing: 384 + Location: 76,45 + CenterFactory: weap.td + Owner: GDI + Location: 64,48 + CenterBarracks: pyle + Owner: GDI + Location: 71,47 + WestFactory: weap.td + Owner: GDI + Location: 48,38 + WestBarracks: pyle + Owner: GDI + Location: 44,36 + EastFactory: weap.td + Owner: GDI + Location: 81,40 + EastBarracks: pyle + Owner: GDI + Location: 85,38 + Actor1421: atwr + Owner: GDI + Location: 78,8 + Actor1422: atwr + Owner: GDI + Location: 67,7 + Actor1424: atwr + Owner: GDI + Location: 50,10 + Actor1426: atwr + Owner: GDI + Location: 58,7 + Actor1427: nuk2 + Owner: GDI + Location: 87,21 + Actor1428: nuk2 + Owner: GDI + Location: 57,37 + Actor1197: disr + Owner: GDI + Facing: 384 + Location: 56,40 + Actor1429: xo + Owner: GDI + Location: 59,11 + Facing: 384 + Actor1430: xo + Owner: GDI + Facing: 384 + Location: 75,10 + Actor1431: xo + Owner: GDI + Location: 71,16 + Facing: 0 + Actor1432: xo + Owner: GDI + Location: 51,12 + Facing: 641 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, multipolarity-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/main-campaign/ca45-multipolarity/multipolarity-rules.yaml b/mods/ca/missions/main-campaign/ca45-multipolarity/multipolarity-rules.yaml new file mode 100644 index 0000000000..3eef9297f4 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca45-multipolarity/multipolarity-rules.yaml @@ -0,0 +1,176 @@ +^Palettes: + PaletteFromFile@terrain-temperat: + Filename: ca|missions/main-campaign/ca19-proliferation/charred.pal + TintPostProcessEffect: + Red: 1 + Green: 1 + Blue: 1.1 + Ambient: 0.8 + +^BaseWorld: + TerrainLighting: + +World: + LuaScript: + Scripts: campaign.lua, multipolarity.lua + MissionData: + Briefing: Our spy has been debriefed and an emergency meeting of the Allied High Command has just concluded.\n\nThe third Scrin faction has revealed itself to be an ancient cult that was exiled by the Overlord — known to other Scrin as "the Malefic". Seeing the Overlord's dominance waning, they have re-emerged and have already made significant gains on the Scrin homeworld. Their exact nature and motives are unclear, but they have been brutal and merciless in their advance.\n\nWe have also learned of an apparent coup within GDI. Their highest ranking commanders remain on the Scrin homeworld, along with a significant portion of their forces, and a General Hawthorne has seized the opportunity to take control of the GDI forces on Earth, declaring martial law across their territories.\n\nHe claims the GDI forces that departed for the Scrin homeworld are now in league with their arch enemy Kane, and that this represents an unforgivable betrayal. Apparently some of GDI's leadership are more willing to put their differences with Kane aside than others. Hawthorne has downplayed the threat from the Overlord and does not see a rebel victory as necessarily beneficial. He also believes purified Tiberium is not the blessing Kane purports it to be, but is part of some elaborate plan.\n\nOur knowledge of the Brotherhood is understandably still quite limited, but there are those within the Allied High Command that are sympathetic to Hawthorne's view. Such voices are not a majority, at least not yet.\n\nIt has been agreed that the safety of Earth must be our priority. The Malefic Scrin and the Soviet-Overlord alliance pose existential threats to humanity. On that basis, our primary goals are to secure — and ultimately shut down — any remaining gateways connecting to the Scrin homeworld, and then prevent further gateways being opened.\n\nWith the Soviet gateway now closed, the only other that we are aware of is the one that was created by the Scrin Mothership. Hawthorne's forces are in full control of it, preventing any off-world forces from returning.\n\nNegotiations with the General have gone nowhere, so an operation to take control of the gateway by force has been given the green light. Our old base in the area, and those that were established by Nod and the Soviets, have been decommissioned and are under GDI guard. If we can take control of these bases it should make our assault on the main GDI base easier.\n\nYour mission is to secure the gateway and capture General Hawthorne's command center. GDI's true leadership will then be able to return home, after which we can seal the gateway for good.\n\nOur Swedish coalition partners have offered their assistance for this mission. Their cryo based weaponry should prove very effective at weakening GDI heavy armor. + MapOptions: + ShortGameCheckboxEnabled: False + MusicPlaylist: + StartingMusic: prp + +Player: + PlayerResources: + DefaultCash: 6000 + +# Enable subfaction specific tech + +SNIP: + Buildable: + Prerequisites: ~tent, anyradar + +RTNK: + Buildable: + Prerequisites: ~vehicles.allies + +TNKD: + Buildable: + Prerequisites: anyradar, ~vehicles.allies + +CHPR: + Buildable: + Prerequisites: atek, ~vehicles.allies + +BATF: + Buildable: + Prerequisites: atek, ~vehicles.allies + +NHAW: + Buildable: + Prerequisites: ~aircraft.allies + +HTUR: + Buildable: + Prerequisites: ~structures.allies, anyradar + +entrench.upgrade: + Buildable: + Prerequisites: anyradar, ~radar.allies + +apb.upgrade: + Buildable: + Prerequisites: atek + +tflx.upgrade: + Buildable: + Prerequisites: pdox + +^VeilOfWarPower: + SpawnActorPowerCA@VeilOfWar: + Prerequisites: ~radar.allies + +# AI powers + +UPGC: + ExternalCondition@Bombardment: + Condition: tower-rocket + +^FirestormPower: + AttackOrderPowerCA@ROCKET: + Prerequisites: ~ai.minor.superweapons.enabled + +^XODropPower: + ParatroopersPowerCA@xodrop: + Prerequisites: ~ai.supportpowers.enabled + +# Misc + +WORMHOLEXXL: + TerrainLightSource: + Range: 6c0 + Intensity: 0.5 + BlueTint: 1 + RedTint: 0.2 + +FLARE: + RevealsShroud: + Range: 10c0 + +ALHQ: + FreeActor@Sweden: + Actor: sweden.coalition + +greece.coalition: + Inherits@CAMPAIGNDISABLED: ^Disabled + +sweden.coalition: + Inherits@CAMPAIGNDISABLED: ^Disabled + +korea.coalition: + Inherits@CAMPAIGNDISABLED: ^Disabled + +MISS: + Tooltip: + Name: Hawthorne's Command Center + TooltipDescription: + Description: Command center of GDI forces in the area. + ValidRelationships: Ally + Health: + HP: 200000 + Targetable@NoAutoTarget: + TargetTypes: NoAutoTarget + +OCAR.DISR: + Inherits: OCAR + -Buildable: + Aircraft: + InitialFacing: 768 + Carryall: + InitialActor: disr + +XO.Hawthorne: + Inherits: XO + Inherits@CommandoSkull: ^CommandoSkull + RenderSprites: + Image: xo + Tooltip: + Name: Gen. Hawthorne + -Targetable: + -Targetable@TEMPORAL: + -Targetable@Jump: + Mobile: + Locomotor: sheavytracked + RevealsShroud@Reveal: + Range: 6c0 + ValidRelationships: Enemy + Targetable@CampaignBoss: + TargetTypes: CampaignBoss + Targetable@MindControlImmune: + TargetTypes: MindControlImmune + Targetable@ChaosImmune: + TargetTypes: ChaosImmune + Targetable@DriverKillImmune: + TargetTypes: DriverKillImmune + Targetable@BlindImmune: + TargetTypes: BlindImmune + Targetable@EmpImmune: + TargetTypes: EmpImmune + DamageMultiplier@Invuln: + Modifier: 0 + ExternalCondition@IC: + Condition: invulnerability + WithRestartableIdleOverlay@IC: + PlayOnce: true + Image: explosion + Sequence: ironcurtain_effect + Palette: effect-ignore-lighting-alpha85 + RequiresCondition: invulnerability + +MCV: + Buildable: + Prerequisites: vehicles.mcv, ~vehicles.ra, ~mcv.allowed + +mcv.allowed: + Inherits@DUMMY: ^InvisibleDummy + ProvidesPrerequisite: diff --git a/mods/ca/missions/main-campaign/ca45-multipolarity/multipolarity.lua b/mods/ca/missions/main-campaign/ca45-multipolarity/multipolarity.lua new file mode 100644 index 0000000000..c7a1bae49c --- /dev/null +++ b/mods/ca/missions/main-campaign/ca45-multipolarity/multipolarity.lua @@ -0,0 +1,776 @@ +MissionDir = "ca|missions/main-campaign/ca45-multipolarity" + +Utils.Do({ "vhard", "brutal" }, function(k) + CompositionValueMultipliers[k] = CompositionValueMultipliers[k] * 1.2 +end) + +SuperweaponsEnabledTime = { + easy = DateTime.Minutes(40), + normal = DateTime.Minutes(25), + hard = DateTime.Minutes(15), + vhard = DateTime.Minutes(10), + brutal = DateTime.Minutes(10) +} + +McvDelayTime = { + easy = DateTime.Seconds(10), + normal = DateTime.Seconds(10), + hard = DateTime.Seconds(10), + vhard = DateTime.Seconds(10), + brutal = DateTime.Seconds(10) +} + +GDIWestAttackPaths = { + { WestPath1.Location, WestPath2.Location, WestPath3.Location, WestPath4a.Location }, + { WestPath1.Location, WestPath2.Location, WestPath3.Location, WestPath4b.Location }, +} + +GDIMiddleAttackPaths = { + { MiddlePath1.Location, MiddlePath2.Location, MiddlePath3.Location, MiddlePath4a.Location }, + { MiddlePath1.Location, MiddlePath2.Location, MiddlePath3.Location, MiddlePath4b.Location }, +} + +GDIEastAttackPaths = { + { EastPath1.Location, EastPath2.Location, EastPath3.Location, EastPath4.Location, EastPath5a.Location }, + { EastPath1.Location, EastPath2.Location, EastPath3.Location, EastPath4.Location, EastPath5b.Location }, +} + +CommandoDropTime = { + easy = DateTime.Minutes(16), -- not used + normal = DateTime.Minutes(14), -- not used + hard = DateTime.Minutes(12), + vhard = DateTime.Minutes(10), + brutal = DateTime.Minutes(8) +} + +ZoneRaidTime = { + easy = DateTime.Minutes(9), + normal = DateTime.Minutes(8), + hard = DateTime.Minutes(7), + vhard = DateTime.Minutes(6), + brutal = DateTime.Minutes(5) +} + +EngiDropTime = { + easy = DateTime.Minutes(12), -- not used + normal = DateTime.Minutes(10), -- not used + hard = DateTime.Minutes(8), + vhard = DateTime.Minutes(6), + brutal = DateTime.Minutes(4) +} + +FirstAutoBaseClaimTime = { + easy = DateTime.Minutes(30), -- not used + normal = DateTime.Minutes(26), -- not used + hard = DateTime.Minutes(22), + vhard = DateTime.Minutes(18), + brutal = DateTime.Minutes(14) +} + +SecondAutoBaseClaimTime = { + easy = DateTime.Minutes(40), -- not used + normal = DateTime.Minutes(36), -- not used + hard = DateTime.Minutes(32), + vhard = DateTime.Minutes(28), + brutal = DateTime.Minutes(24) +} + +CaptureTargets = {} + +if IsVeryHardOrAbove() then + table.insert(UnitCompositions.GDI, { + Infantry = { "zrai", "zrai", "zrai", "zrai", "zrai", "zrai", "zrai", "zrai", "zrai" }, + Vehicles = { "vulc", "vulc", "xo", "xo", "xo", "xo", "vulc", "vulc" }, + MinTime = DateTime.Minutes(14), + IsSpecial = true + }) +end + +Squads = { + Main = { + Delay = AdjustDelayForDifficulty(DateTime.Minutes(2)), + InitTimeAdjustment = -DateTime.Minutes(3), + Compositions = AdjustCompositionsForDifficulty(UnitCompositions.GDI), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 20, Max = 40 }), + FollowLeader = true, + AttackPaths = Utils.Concat(GDIWestAttackPaths, GDIMiddleAttackPaths), + ProducerActors = { Infantry = { WestBarracks }, Vehicles = { WestFactory } }, + ProducerTypes = { Infantry = { "pyle" }, Vehicles = { "weap.td" } }, + }, + Secondary = { + Delay = AdjustDelayForDifficulty(DateTime.Minutes(3)), + InitTimeAdjustment = -DateTime.Minutes(3), + Compositions = AdjustCompositionsForDifficulty(UnitCompositions.GDI), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 20, Max = 40 }), + FollowLeader = true, + AttackPaths = Utils.Concat(GDIMiddleAttackPaths, GDIEastAttackPaths), + ProducerActors = { Infantry = { EastBarracks }, Vehicles = { EastFactory } }, + ProducerTypes = { Infantry = { "pyle" }, Vehicles = { "weap.td" } }, + }, + Soviet = { + Delay = AdjustDelayForDifficulty(DateTime.Minutes(2)), + InitTimeAdjustment = -DateTime.Minutes(3), + Compositions = AdjustCompositionsForDifficulty(UnitCompositions.Soviet), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 10, Max = 20 }), + FollowLeader = true, + AttackPaths = { { SovietRally.Location } }, + ProducerTypes = { Infantry = { "barr" }, Vehicles = { "weap" } }, + }, + Nod = { + Delay = AdjustDelayForDifficulty(DateTime.Minutes(2)), + InitTimeAdjustment = -DateTime.Minutes(3), + Compositions = AdjustCompositionsForDifficulty(UnitCompositions.Nod), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 10, Max = 20 }), + FollowLeader = true, + AttackPaths = { { NodRally.Location } }, + DispatchDelay = DateTime.Seconds(15), + ProducerTypes = { Infantry = { "hand" }, Vehicles = { "airs" } }, + }, + Air = { + Delay = AdjustAirDelayForDifficulty(DateTime.Minutes(10)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 12, Max = 20 }), + Compositions = AirCompositions.GDI, + }, + AirToAir = AirToAirSquad({ "orca" }, AdjustAirDelayForDifficulty(DateTime.Minutes(10))), + BrutalAirAntiDefense = { + Delay = DateTime.Minutes(12), + ActiveCondition = function(squad) + return MissionPlayersDefenseValue > 3000 + end, + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 20, Max = 30 }), + Compositions = function(squad) + local unitTypes = { "orca", "orcb", "auro" } + local units = { unitTypes } + local desiredCount = MissionPlayersDefenseValue / 2000 + for i = 1, math.min(desiredCount, MaxSpecialistAir[Difficulty]) do + table.insert(units, unitTypes) + end + return { { Aircraft = units } } + end + } +} + +SetupPlayers = function() + Greece = Player.GetPlayer("Greece") + GDI = Player.GetPlayer("GDI") + Scrin = Player.GetPlayer("Scrin") + England = Player.GetPlayer("England") + USSR = Player.GetPlayer("USSR") + Nod = Player.GetPlayer("Nod") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = { Greece } + MissionEnemies = { GDI } +end + +WorldLoaded = function() + SetupPlayers() + + Camera.Position = PlayerStart.CenterPosition + + InitObjectives(Greece) + AdjustPlayerStartingCashForDifficulty() + RemoveActorsBasedOnDifficultyTags() + InitGDI() + + MissionPlayersDefenseValue = 0 + + ObjectiveSecureBase = Greece.AddObjective("Secure the decommissioned Allied base.") + + Trigger.AfterDelay(DateTime.Seconds(6), function() + Media.DisplayMessage("This area is under GDI jurisdiction. Remove your forces immediately commander. If you advance, we will open fire.", "Gen. Hawthorne", HSLColor.FromHex("F2CF74")) + MediaCA.PlaySound(MissionDir .. "/hth_jurisdiction.aud", 2) + end) + + Trigger.OnEnteredProximityTrigger(AlliedBaseCenter.CenterPosition, WDist.New(15 * 1024), function(a, id) + if IsMissionPlayer(a.Owner) and a.Type ~= "flare" then + Trigger.RemoveProximityTrigger(id) + if not AlliedBaseFlare.IsDead then + AlliedBaseFlare.Destroy() + end + end + end) + + Trigger.AfterDelay(1, function() + local alliedBaseDefenders = Map.ActorsInCircle(AlliedBaseCenter.CenterPosition, WDist.New(10 * 1024), function(a) + return not a.IsDead and a.Owner == GDI and a.Type ~= "camera" + end) + + Trigger.OnAllKilled(alliedBaseDefenders, function() + if not Greece.IsObjectiveCompleted(ObjectiveSecureBase) then + InitCaptureHQObjective() + Greece.MarkCompletedObjective(ObjectiveSecureBase) + + Trigger.AfterDelay(DateTime.Seconds(3), function() + Media.DisplayMessage("You will pay dearly for this transgression! Prepare to witness the full force of the GDI war machine!", "Gen. Hawthorne", HSLColor.FromHex("F2CF74")) + MediaCA.PlaySound(MissionDir .. "/hth_paydearly.aud", 2) + end) + + FlipAlliedBase() + end + end) + + local sovietBaseDefenders = Map.ActorsInCircle(SovietBaseCenter.CenterPosition, WDist.New(15 * 1024), function(a) + return not a.IsDead and a.Owner == GDI and a.Type ~= "camera" + end) + + Trigger.OnAllKilled(sovietBaseDefenders, function() + FlipSovietBase() + end) + + local nodBaseDefenders = Map.ActorsInCircle(NodBaseCenter.CenterPosition, WDist.New(15 * 1024), function(a) + return not a.IsDead and a.Owner == GDI and a.Type ~= "camera" + end) + + Trigger.OnAllKilled(nodBaseDefenders, function() + FlipNodBase() + end) + end) + + Trigger.OnKilled(HawthorneHQ, function(self, killer) + if ObjectiveCaptureHQ ~= nil and not Greece.IsObjectiveCompleted(ObjectiveCaptureHQ) then + Greece.MarkFailedObjective(ObjectiveCaptureHQ) + end + end) + + Trigger.OnCapture(HawthorneHQ, function(self, captor, oldOwner, newOwner) + if IsMissionPlayer(newOwner) and ObjectiveCaptureHQ ~= nil and not Greece.IsObjectiveCompleted(ObjectiveCaptureHQ) then + DoFinale() + end + end) + + Trigger.OnEnteredProximityTrigger(HawthorneHQ.CenterPosition, WDist.New(15 * 1024), function(a, id) + if IsMissionPlayer(a.Owner) then + Trigger.RemoveProximityTrigger(id) + InitGDIAttacks() + InitCaptureHQObjective() + if not FinalTaunt then + FinalTaunt = true + Media.DisplayMessage("You will not stop me from bringing Kane and his minions to justice!", "Gen. Hawthorne", HSLColor.FromHex("F2CF74")) + MediaCA.PlaySound(MissionDir .. "/hth_notstop.aud", 2) + end + end + end) + + Trigger.AfterDelay(ZoneRaidTime[Difficulty], DoZoneRaid) + + if IsHardOrAbove() then + Trigger.AfterDelay(CommandoDropTime[Difficulty], DoCommandoDrop) + + Trigger.AfterDelay(FirstAutoBaseClaimTime[Difficulty], function() + HawthorneClaimRandomBase() + end) + + Trigger.AfterDelay(SecondAutoBaseClaimTime[Difficulty], function() + HawthorneClaimRandomBase() + + if IsVeryHardOrAbove() then + Squads.Main.AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 20, Max = 40 }) + Squads.Secondary.AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 20, Max = 40 }) + end + end) + end + + if Difficulty == "brutal" then + DoCommandoDrop() + end + + Trigger.OnAllKilledOrCaptured({ SovietFactory, SovietBarracks }, function() + SovietProductionDestroyed = true + if HawthorneClaimedSovietBase then + Squads.Main.AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 20, Max = 40 }) + Squads.Secondary.AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 20, Max = 40 }) + end + end) + + Trigger.OnAllKilledOrCaptured({ NodAirstrip, NodHand }, function() + NodProductionDestroyed = true + if HawthorneClaimedNodBase then + Squads.Main.AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 20, Max = 40 }) + Squads.Secondary.AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 20, Max = 40 }) + end + end) + + AfterWorldLoaded() +end + +Tick = function() + OncePerSecondChecks() + OncePerFiveSecondChecks() + OncePerThirtySecondChecks() + AfterTick() +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + GDI.Resources = GDI.ResourceCapacity - 500 + + if MissionPlayersHaveNoRequiredUnits() then + if not Greece.IsObjectiveCompleted(ObjectiveSecureBase) then + Greece.MarkFailedObjective(ObjectiveSecureBase) + end + if ObjectiveCaptureHQ ~= nil and not Greece.IsObjectiveCompleted(ObjectiveCaptureHQ) then + Greece.MarkFailedObjective(ObjectiveCaptureHQ) + end + end + end +end + +OncePerFiveSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 125 == 0 then + UpdatePlayerBaseLocations() + end +end + +OncePerThirtySecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 750 == 0 then + CalculatePlayerCharacteristics() + + if Difficulty == "brutal" then + CalculateDefensesValue() + end + end +end + +CalculateDefensesValue = function() + local defenseValue = 0 + Utils.Do(MissionPlayers, function(p) + local defenses = p.GetActorsByArmorTypes({ "Concrete" }) + + Utils.Do(defenses, function(d) + if UnitCosts[d.Type] == nil then + UnitCosts[d.Type] = ActorCA.CostOrDefault(d.Type) + end + defenseValue = defenseValue + UnitCosts[d.Type] + end) + end) + MissionPlayersDefenseValue = defenseValue +end + +InitGDI = function() + AutoRepairAndRebuildBuildings(GDI, 10) + SetupRefAndSilosCaptureCredits(GDI) + AutoReplaceHarvesters(GDI) + AutoRebuildConyards(GDI) + + local GDIGroundAttackers = GDI.GetGroundAttackers() + Utils.Do(GDIGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), function(a) + return IsGDIGroundHunterUnit(a) and a.Type ~= "zrai" -- exclude zone raiders so they aren't interrupted before the jump + end) + end) + + if IsHardOrAbove() then + local productionBuildings = GDI.GetActorsByTypes({ "pyle", "afac", "weap.td", "afld.gdi" }) + for _, b in pairs(productionBuildings) do + BuildDefenseOnCaptureAttempt(b, "gtwr", true) + end + end + + UpgradeCenter.GrantCondition("tower-rocket") +end + +InitGDIAttacks = function() + if not GDIAttacksInitialized then + GDIAttacksInitialized = true + InitAiUpgrades(GDI) + InitAttackSquad(Squads.Main, GDI) + InitAttackSquad(Squads.Secondary, GDI) + InitAirAttackSquad(Squads.Air, GDI) + + if IsHardOrAbove() then + InitAirAttackSquad(Squads.AirToAir, GDI, MissionPlayers, { "Aircraft" }, "ArmorType") + + Trigger.AfterDelay(DateTime.Minutes(16), function() + DoDisruptorDrop() + end) + + if IsVeryHardOrAbove() then + Actor.Create("ai.supportpowers.enabled", true, { Owner = GDI }) + + if Difficulty == "brutal" then + InitAirAttackSquad(Squads.BrutalAirAntiDefense, GDI, MissionPlayers, { "Concrete" }, "ArmorType") + end + end + end + + Trigger.AfterDelay(SuperweaponsEnabledTime[Difficulty], function() + Actor.Create("ai.superweapons.enabled", true, { Owner = GDI }) + Actor.Create("ai.minor.superweapons.enabled", true, { Owner = GDI }) + end) + end +end + +FlipAlliedBase = function() + TransferAlliedAssets() + + Trigger.AfterDelay(1, function() + Utils.Do(MissionPlayers, function(p) + Actor.Create("QueueUpdaterDummy", true, { Owner = p }) + end) + end) + + Trigger.AfterDelay(McvDelayTime[Difficulty], function() + Beacon.New(Greece, McvDest.CenterPosition) + PlaySpeechNotificationToMissionPlayers("ReinforcementsArrived") + Notification("Reinforcements have arrived.") + DoMcvArrival() + + Utils.Do(MissionPlayers, function(p) + Actor.Create("mcv.allowed", true, { Owner = p }) + end) + end) + + InitGDIAttacks() +end + +FlipNodBase = function() + if NodBaseFlipped or SovietBaseFlipped or HawthorneClaimedNodBase then + return + end + + NodBaseFlipped = true + + TransferNodAssets() + + Trigger.AfterDelay(1, function() + Utils.Do(MissionPlayers, function(p) + Actor.Create("QueueUpdaterDummy", true, { Owner = p }) + end) + end) + + Trigger.AfterDelay(DateTime.Seconds(6), function() + HawthorneClaimSovietBase() + end) + + InitGDIAttacks() + + if IsHardOrAbove() then + Trigger.AfterDelay(EngiDropTime[Difficulty], DoEngiDrop) + end +end + +FlipSovietBase = function() + if SovietBaseFlipped or NodBaseFlipped or HawthorneClaimedSovietBase then + return + end + + SovietBaseFlipped = true + + TransferSovietAssets() + + Trigger.AfterDelay(1, function() + Utils.Do(MissionPlayers, function(p) + Actor.Create("QueueUpdaterDummy", true, { Owner = p }) + end) + end) + + Trigger.AfterDelay(DateTime.Seconds(6), function() + HawthorneClaimNodBase() + end) + + InitGDIAttacks() + + if IsHardOrAbove() then + Trigger.AfterDelay(EngiDropTime[Difficulty], DoEngiDrop) + end +end + +HawthorneClaimRandomBase = function() + -- no bases left to claim + if (HawthorneClaimedSovietBase or SovietBaseFlipped) and (HawthorneClaimedNodBase or NodBaseFlipped) then + return + -- soviet base claimed, claim nod base + elseif HawthorneClaimedSovietBase or SovietBaseFlipped then + HawthorneClaimNodBase() + -- nod base claimed, claim soviet base + elseif HawthorneClaimedNodBase or NodBaseFlipped then + HawthorneClaimSovietBase() + -- both available, randomly choose one + else + local choice = Utils.Random({ "Soviet", "Nod" }) + if choice == "Soviet" then + HawthorneClaimSovietBase() + else + HawthorneClaimNodBase() + end + end +end + +HawthorneClaimSovietBase = function() + if HawthorneClaimedSovietBase or SovietBaseFlipped then + return + end + + HawthorneClaimedSovietBase = true + + if NodBaseFlipped then + Media.DisplayMessage("Two can play that game commander. I think we can put that Soviet equipment to good use!", "Gen. Hawthorne", HSLColor.FromHex("F2CF74")) + MediaCA.PlaySound(MissionDir .. "/hth_sovequip.aud", 2) + else + Media.DisplayMessage("I think it's high time I got some use out of that old Soviet base!", "Gen. Hawthorne", HSLColor.FromHex("F2CF74")) + MediaCA.PlaySound(MissionDir .. "/hth_sovequipauto.aud", 2) + end + + local sovietBaseActors = Utils.Where(USSR.GetActors(), function(a) + return not a.IsDead and a.Type ~= "player" + end) + + Utils.Do(sovietBaseActors, function(a) + a.Owner = GDI + + Trigger.AfterDelay(1, function() + if not a.IsDead and a.HasProperty("StartBuildingRepairs") then + AutoRepairBuilding(a, GDI) + AutoRebuildBuilding(a, GDI, 10) + a.StartBuildingRepairs() + end + end) + end) + + InitAttackSquad(Squads.Soviet, GDI) + + Utils.Do({ Coil1.Location, Coil2.Location, Coil3.Location, Coil4.Location, Coil5.Location }, function(wp) + local tsla = Actor.Create("tsla", true, { Owner = GDI, Location = wp }) + AutoRepairBuilding(tsla, GDI) + AutoRebuildBuilding(tsla, GDI, 10) + end) + + Utils.Do({ FlameTower1.Location, FlameTower2.Location, FlameTower3.Location, FlameTower4.Location }, function(wp) + local ftur = Actor.Create("ftur", true, { Owner = GDI, Location = wp }) + AutoRepairBuilding(ftur, GDI) + AutoRebuildBuilding(ftur, GDI, 10) + end) + + local sam = Actor.Create("sam", true, { Owner = GDI, Location = SovietSAM1.Location }) + AutoRepairBuilding(sam, GDI) + AutoRebuildBuilding(sam, GDI, 10) + + if not SovietProductionDestroyed then + Squads.Main.AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 15, Max = 30 }) + Squads.Secondary.AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 15, Max = 30 }) + end +end + +HawthorneClaimNodBase = function() + if HawthorneClaimedNodBase or NodBaseFlipped then + return + end + + HawthorneClaimedNodBase = true + + if SovietBaseFlipped then + Media.DisplayMessage("Two can play that game commander. I think we can put that Nod equipment to good use!", "Gen. Hawthorne", HSLColor.FromHex("F2CF74")) + MediaCA.PlaySound(MissionDir .. "/hth_nodequip.aud", 2) + else + Media.DisplayMessage("That Nod base has been sitting idle for too long. It's time I got some use out of it!", "Gen. Hawthorne", HSLColor.FromHex("F2CF74")) + MediaCA.PlaySound(MissionDir .. "/hth_nodequipauto.aud", 2) + end + + local nodBaseActors = Utils.Where(Nod.GetActors(), function(a) + return not a.IsDead and a.Type ~= "player" + end) + + Utils.Do(nodBaseActors, function(a) + a.Owner = GDI + + Trigger.AfterDelay(1, function() + if not a.IsDead and a.HasProperty("StartBuildingRepairs") then + AutoRepairBuilding(a, GDI) + AutoRebuildBuilding(a, GDI, 10) + a.StartBuildingRepairs() + end + end) + end) + + InitAttackSquad(Squads.Nod, GDI) + + Utils.Do({ Obelisk1.Location, Obelisk2.Location, Obelisk3.Location, Obelisk4.Location, Obelisk5.Location }, function(wp) + local obli = Actor.Create("obli", true, { Owner = GDI, Location = wp }) + AutoRepairBuilding(obli, GDI) + AutoRebuildBuilding(obli, GDI, 10) + end) + + Utils.Do({ LasTur1.Location, LasTur2.Location, LasTur3.Location }, function(wp) + local ltur = Actor.Create("ltur", true, { Owner = GDI, Location = wp }) + AutoRepairBuilding(ltur, GDI) + AutoRebuildBuilding(ltur, GDI, 10) + end) + + local nsam = Actor.Create("nsam", true, { Owner = GDI, Location = NodSAM1.Location }) + AutoRepairBuilding(nsam, GDI) + AutoRebuildBuilding(nsam, GDI, 10) + + if not NodProductionDestroyed then + Squads.Main.AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 15, Max = 30 }) + Squads.Secondary.AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 15, Max = 30 }) + end +end + +DoDisruptorDrop = function() + local dropPoints = { DisruptorDropDest1.Location, DisruptorDropDest2.Location } + + if IsVeryHardOrAbove() then + table.insert(dropPoints, DisruptorDropDest3.Location) + table.insert(dropPoints, DisruptorDropDest4.Location) + end + + local delay = 1 + + Utils.Do(dropPoints, function(p) + Trigger.AfterDelay(delay, function() + local entryPath = { DisruptorDropSpawn.Location, DisruptorDropRally.Location, p } + local exitPath = { LeftDropExit.Location } + ReinforcementsCA.ReinforceWithTransport(GDI, "ocar.disr", nil, entryPath, exitPath) + end) + delay = delay + DateTime.Seconds(1) + Trigger.OnEnteredFootprint({p}, function(a, id) + if a.Owner == GDI and a.Type == "disr" and not a.IsDead then + Trigger.RemoveFootprintTrigger(id) + AssaultPlayerBaseOrHunt(a) + end + end) + end) + + if Difficulty == "brutal" then + Trigger.AfterDelay(DateTime.Minutes(7), DoDisruptorDrop) + end +end + +DoCommandoDrop = function() + local entryPath + entryPath = { RightDropSpawn.Location, CommandoDropWp1.Location, CommandoDropDest.Location } + local chinookDropUnits = { "rmbo" } + + DoHelicopterDrop(GDI, entryPath, "tran.paradrop", chinookDropUnits, AssaultPlayerBaseOrHunt, function(t) + Trigger.AfterDelay(DateTime.Seconds(5), function() + if not t.IsDead then + t.Move(RightDropExit.Location) + t.Destroy() + end + end) + end) +end + +DoEngiDrop = function() + local entryPath + local exitLoc + + if SovietBaseFlipped then + entryPath = { LeftDropSpawn.Location, LeftEngiDropDest.Location } + exitLoc = LeftDropExit.Location + else + entryPath = { RightDropSpawn.Location, RightEngiDropDest.Location } + exitLoc = RightDropExit.Location + end + + local chinookDropUnits = { "n6", "n6", "n6", "n6", "n6" } + + DoHelicopterDrop(GDI, entryPath, "tran.paradrop", chinookDropUnits, function(a) + if not a.IsDead then + CaptureRandomBuilding(a) + end + end, function(t) + Trigger.AfterDelay(DateTime.Seconds(5), function() + if not t.IsDead then + t.Move(exitLoc) + t.Destroy() + end + end) + end) +end + +DoZoneRaid = function() + local zoneRaiders = { ZR1, ZR2, ZR3, ZR4, ZR5, ZR6, ZR7, ZR8 } + Utils.Do(zoneRaiders, function(a) + if not a.IsDead then + a.Move(ZRWP1.Location) + a.TargetedLeap(ZRWP2.Location) + local finalDest = Utils.Random({ ZRWP5a.Location, ZRWP5b.Location, ZRWP5c.Location }) + a.TargetedLeap(finalDest) + AssaultPlayerBaseOrHunt(a) + end + end) +end + +CaptureRandomBuilding = function(engi) + local buildings = Map.ActorsInCircle(engi.CenterPosition, WDist.New(15 * 1024), function(a) + return not a.IsDead and IsMissionPlayer(a.Owner) and a.HasProperty("StartBuildingRepairs") and engi.CanCapture(a) and not CaptureTargets[tostring(a)] + end) + + if #buildings == 0 then + buildings = GetMissionPlayersActorsByTypes({ "fact", "proc" }) + end + + if #buildings == 0 then + return + end + + local target = Utils.Random(buildings) + CaptureTargets[tostring(target)] = true + engi.Capture(target) +end + +InitCaptureHQObjective = function() + if not ObjectiveCaptureHQ then + ObjectiveCaptureHQ = Greece.AddObjective("Capture Gen. Hawthorne's Command Center.") + end +end + +DoFinale = function() + Media.DisplayMessage("This is far from over! You will regret making an enemy of me!", "Gen. Hawthorne", HSLColor.FromHex("F2CF74")) + MediaCA.PlaySound(MissionDir .. "/hth_farfromover.aud", 2) + + Hawthorne = Actor.Create("xo.hawthorne", true, { Owner = GDI, Location = HawthorneSpawn.Location }) + Hawthorne.GrantCondition("invulnerability") + Media.PlaySound("ironcur9.aud") + Hawthorne.TargetedLeap(HawthorneJumpDest.Location) + Hawthorne.Move(Gateway.Location) + Hawthorne.Destroy() + + Trigger.OnRemovedFromWorld(Hawthorne, function(a) + Greece.MarkCompletedObjective(ObjectiveCaptureHQ) + end) + + Trigger.AfterDelay(DateTime.Seconds(30), function() + Greece.MarkCompletedObjective(ObjectiveCaptureHQ) + end) +end + +-- overridden in co-op version +DoMcvArrival = function() + Reinforcements.Reinforce(Greece, { "mcv" }, { McvSpawn.Location, McvDest.Location }, 75) +end + +-- overridden in co-op version +TransferAlliedAssets = function() + local alliedBaseActors = Utils.Where(England.GetActors(), function(a) + return not a.IsDead and a.Type ~= "player" + end) + + Utils.Do(alliedBaseActors, function(a) + a.Owner = Greece + end) +end + +-- overridden in co-op version +TransferSovietAssets = function() + local sovietBaseActors = Utils.Where(USSR.GetActors(), function(a) + return not a.IsDead and a.Type ~= "player" + end) + + Utils.Do(sovietBaseActors, function(a) + a.Owner = Greece + end) +end + +-- overridden in co-op version +TransferNodAssets = function() + local nodBaseActors = Utils.Where(Nod.GetActors(), function(a) + return not a.IsDead and a.Type ~= "player" + end) + + Utils.Do(nodBaseActors, function(a) + a.Owner = Greece + end) +end diff --git a/mods/ca/missions/main-campaign/ca46-intervention/intervention-rules.yaml b/mods/ca/missions/main-campaign/ca46-intervention/intervention-rules.yaml new file mode 100644 index 0000000000..a39f099a53 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca46-intervention/intervention-rules.yaml @@ -0,0 +1,98 @@ +^Palettes: + PaletteFromFile@terrain-temperat: + Filename: ca|missions/main-campaign/ca46-intervention/summer.pal + FlashPostProcessEffect@LIGHTNINGSTRIKE: + Type: LightningStrike + WeatherOverlay@RAIN: + WindTick: 150, 550 + UseSquares: false + ScatterDirection: 0, 0 + Gravity: 30, 35 + SwingOffset: 0, 0 + SwingSpeed: 0, 0 + SwingAmplitude: 0, 0 + ParticleColors: 72aaae, 72aea6, 5caea3, 6da69f + LineTailAlphaValue: 30 + ParticleSize: 1, 1 + ParticleDensityFactor: 15 + TerrainLighting: + TintPostProcessEffect: + Red: 1.22 + Green: 1.27 + Blue: 1.15 + Ambient: 0.7 + +World: + LuaScript: + Scripts: campaign.lua, intervention.lua + MissionData: + Briefing: General Hawthorne was able to make an escape through the gateway and his whereabouts are unknown. Interrogation of one of his lieutenants has revealed that he has been secretly colluding with the Soviets, which helps to explain GDI's recent reluctance to cooperate.\n\nPerhaps his hatred for Kane and the Brotherhood was stronger than anyone knew, enough to undermine his loyalty and his judgement, or perhaps he is another unfortunate victim of mind control. We do not expect this is the last we've seen of him.\n\nThe gateway's connection to the GDI forces on the Scrin homeworld has been re-established and their leadership has reasserted itself. Much needed supplies have made their way to their off-world forces. Communication with more of our agents has also been restored, and our attention must now turn to the Brotherhood.\n\nThe Tiberium purification device being lost to the Overlord has halted Kane's efforts to free the Scrin population from Tiberium dependency, leaving many subservient to the Overlord that would otherwise have risen up against him. Nod and Rebel forces are gradually losing ground now that they also have the Malefic Scrin to contend with.\n\nNod forces on Earth are currently completely cut off from Kane, and we believe they are now putting all of their efforts into preparing a new gateway. An unusual concentration of Nod forces has been detected near the Philippines, and we have visual confirmation of large stockpiles of Tiberium. The only other time we have seen such extensive stockpiling was when the Scrin were preparing their own gateway.\n\nWe do not have a large presence in the region, we need you to establish a forward base which can be reinforced and used to launch attacks on Nod forces. Tiberium is being stored in silos on numerous small islands. You must either destroy or capture all of these silos, thus removing any immediate possibility of Nod opening a gateway.\n\nResources in the area are scarce, so it's recommended that you capture rather than destroy any silos you come across, making use of the additional funds.\n\nOur Korean coalition partners are providing support for this mission. Their Black Eagle fighter jets should prove invaluable for controlling the skies above the islands. + MapOptions: + ShortGameCheckboxEnabled: False + MusicPlaylist: + StartingMusic: creep + +Player: + PlayerResources: + DefaultCash: 6000 + +# Enable subfaction specific tech + +SNIP: + Buildable: + Prerequisites: ~tent, anyradar + +SEAL: + Buildable: + Prerequisites: tent, atek + +RTNK: + Buildable: + Prerequisites: ~vehicles.allies + +TNKD: + Buildable: + Prerequisites: anyradar, ~vehicles.allies + +CHPR: + Buildable: + Prerequisites: atek, ~vehicles.allies + +BATF: + Buildable: + Prerequisites: atek, ~vehicles.allies + +NHAW: + Buildable: + Prerequisites: ~aircraft.allies + +HTUR: + Buildable: + Prerequisites: ~structures.allies, anyradar + +entrench.upgrade: + Buildable: + Prerequisites: anyradar, ~radar.allies + +apb.upgrade: + Buildable: + Prerequisites: atek + +tflx.upgrade: + Buildable: + Prerequisites: pdox + +# Misc + +ALHQ: + FreeActor@Korea: + Actor: korea.coalition + +greece.coalition: + Inherits@CAMPAIGNDISABLED: ^Disabled + +sweden.coalition: + Inherits@CAMPAIGNDISABLED: ^Disabled + +korea.coalition: + Inherits@CAMPAIGNDISABLED: ^Disabled diff --git a/mods/ca/missions/main-campaign/ca46-intervention/intervention.lua b/mods/ca/missions/main-campaign/ca46-intervention/intervention.lua new file mode 100644 index 0000000000..cf750a6393 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca46-intervention/intervention.lua @@ -0,0 +1,230 @@ +MissionDir = "ca|missions/main-campaign/ca46-intervention" + +SuperweaponsEnabledTime = { + easy = DateTime.Minutes(60), + normal = DateTime.Minutes(40), + hard = DateTime.Minutes(25), + vhard = DateTime.Minutes(18), + brutal = DateTime.Minutes(15) +} + +NodNavalAttackPaths = { + { NavalWaypoint1.Location, NavalWaypoint2.Location, NavalWaypoint3.Location, NavalWaypoint4.Location }, + { NavalWaypoint4.Location, NavalWaypoint3.Location, NavalWaypoint2.Location, NavalWaypoint1.Location }, + { NavalWaypoint1.Location, NavalWaypoint5.Location, NavalWaypoint4.Location }, + { NavalWaypoint4.Location, NavalWaypoint5.Location, NavalWaypoint1.Location }, + { NavalWaypoint5.Location, NavalWaypoint2.Location, NavalWaypoint3.Location }, + { NavalWaypoint5.Location, NavalWaypoint3.Location, NavalWaypoint2.Location } +} + +Squads = { + Naval = { + ActiveCondition = function() + return MissionPlayersHaveNavalPresence() + end, + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 8, Max = 12 }), + Compositions = { + easy = { + { Ships = { "sb" } } + }, + normal = { + { Ships = { "sb" } } + }, + hard = { + { Ships = { "sb", "ss2" } } + }, + vhard = { + { Ships = { "sb", "sb", "ss2" } } + }, + brutal = { + { Ships = { "sb", "sb", "sb", "ss2" } } + } + }, + AttackPaths = NodNavalAttackPaths + }, + ICBMSubs = { + Delay = DateTime.Minutes(15), + AttackValuePerSecond = { Min = 8, Max = 16 }, + Compositions = { + brutal = { + { Ships = { "isub" } } + }, + }, + AttackPaths = NodNavalAttackPaths + }, + Air = { + Delay = AdjustAirDelayForDifficulty(DateTime.Minutes(12)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 12, Max = 20 }), + Compositions = AirCompositions.Nod, + }, + AntiCruiserAir = { + ActiveCondition = function(squad) + return #GetMissionPlayersActorsByType("ca") > 0 + end, + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 12, Max = 20 }), + Compositions = { { Aircraft = { "scrn", "scrn" } } } + }, + AirToAir = AirToAirSquad({ "scrn", "apch", "venm" }, AdjustAirDelayForDifficulty(DateTime.Minutes(12))) +} + +SetupPlayers = function() + Greece = Player.GetPlayer("Greece") + Nod = Player.GetPlayer("Nod") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = { Greece } + MissionEnemies = { Nod } +end + +WorldLoaded = function() + SetupPlayers() + + Camera.Position = PlayerStart.CenterPosition + + InitObjectives(Greece) + AdjustPlayerStartingCashForDifficulty() + RemoveActorsBasedOnDifficultyTags() + InitNod() + SetupLightning() + + ObjectiveDestroySilos = Greece.AddObjective("Capture or destroy all Nod Tiberium Silos.") + + if IsHardOrAbove() then + InitialTree.Destroy() + end + + if Difficulty == "brutal" then + SecondTree.Destroy() + end + + Trigger.AfterDelay(1, function() + local silos = Nod.GetActorsByType("silo.td") + + Trigger.OnAllKilledOrCaptured(silos, function() + Greece.MarkCompletedObjective(ObjectiveDestroySilos) + end) + + Utils.Do(silos, function(s) + Trigger.OnKilledOrCaptured(s, function() + UpdateMissionText() + end) + end) + end) + + Trigger.OnKilledOrCaptured(StealthGen, function() + local mobileStealthGens = Nod.GetActorsByType("msg") + Utils.Do(mobileStealthGens, function(m) + m.Kill() + end) + end) + + UpdateMissionText() + AfterWorldLoaded() +end + +Tick = function() + OncePerSecondChecks() + OncePerFiveSecondChecks() + OncePerThirtySecondChecks() + AfterTick() +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + Nod.Resources = Nod.ResourceCapacity - 500 + + if MissionPlayersHaveNoRequiredUnits() then + Greece.MarkFailedObjective(ObjectiveDestroySilos) + end + end +end + +OncePerFiveSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 125 == 0 then + UpdatePlayerBaseLocations() + end +end + +OncePerThirtySecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 750 == 0 then + CalculatePlayerCharacteristics() + end +end + +UpdateMissionText = function() + local siloCount = #Nod.GetActorsByType("silo.td") + + if siloCount > 0 then + UserInterface.SetMissionText(siloCount .. " silos remaining.", HSLColor.Yellow) + else + UserInterface.SetMissionText("") + end +end + +InitNod = function() + AutoRepairAndRebuildBuildings(Nod, 10) + SetupRefAndSilosCaptureCredits(Nod) + AutoReplaceHarvesters(Nod) + AutoRebuildConyards(Nod) + InitAiUpgrades(Nod) + InitNavalAttackSquad(Squads.Naval, Nod) + InitAirAttackSquad(Squads.Air, Nod) + + if IsHardOrAbove() then + InitAirAttackSquad(Squads.AntiCruiserAir, Nod, MissionPlayers, { "ca" }) + InitAirAttackSquad(Squads.AirToAir, Nod, MissionPlayers, { "Aircraft" }, "ArmorType") + + local productionBuildings = Nod.GetActorsByTypes({ "hand", "hpad.td", "airs", "afac" }) + for _, b in pairs(productionBuildings) do + BuildDefenseOnCaptureAttempt(b, "ltur", true) + end + + if Difficulty == "brutal" then + InitNavalAttackSquad(Squads.ICBMSubs, Nod) + end + end + + Trigger.AfterDelay(SuperweaponsEnabledTime[Difficulty], function() + Actor.Create("ai.superweapons.enabled", true, { Owner = Nod }) + Actor.Create("ai.minor.superweapons.enabled", true, { Owner = Nod }) + end) + + local NodGroundAttackers = Nod.GetGroundAttackers() + Utils.Do(NodGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsNodGroundHunterUnit) + end) +end + +SetupLightning = function() + local nextStrikeDelay = Utils.RandomInteger(DateTime.Seconds(4), DateTime.Seconds(30)) + Trigger.AfterDelay(nextStrikeDelay, function() + LightningStrike() + SetupLightning() + end) +end + +LightningStrike = function() + local duration = Utils.RandomInteger(5, 8) + local thunderDelay = Utils.RandomInteger(5, 65) + local soundNumber + Lighting.Flash("LightningStrike", duration) + + repeat + soundNumber = Utils.RandomInteger(1, 7) + until(soundNumber ~= LastSoundNumber) + LastSoundNumber = soundNumber + + Trigger.AfterDelay(thunderDelay, function() + Media.PlaySound("thunder" .. soundNumber .. ".aud") + end) +end + +IdleHunt = function(actor) + if actor.HasProperty("HuntCA") and not actor.IsDead then + Trigger.OnIdle(actor, function(a) + if not a.IsDead and a.IsInWorld and not IsMissionPlayer(a.Owner) then + a.HuntCA() + end + end) + end +end diff --git a/mods/ca/missions/main-campaign/ca46-intervention/map.bin b/mods/ca/missions/main-campaign/ca46-intervention/map.bin new file mode 100644 index 0000000000..f5799a4890 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca46-intervention/map.bin differ diff --git a/mods/ca/missions/main-campaign/ca46-intervention/map.png b/mods/ca/missions/main-campaign/ca46-intervention/map.png new file mode 100644 index 0000000000..cfd33c8ea3 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca46-intervention/map.png differ diff --git a/mods/ca/missions/main-campaign/ca46-intervention/map.yaml b/mods/ca/missions/main-campaign/ca46-intervention/map.yaml new file mode 100644 index 0000000000..ea60d80c10 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca46-intervention/map.yaml @@ -0,0 +1,4077 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 46: Intervention + +Author: Darkademic + +Tileset: TEMPERAT + +MapSize: 162,194 + +Bounds: 1,1,160,192 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: Greece, Nod + PlayerReference@Greece: + Name: Greece + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: allies + LockColor: True + Color: 99ACF2 + LockSpawn: True + LockTeam: True + Enemies: Nod, Creeps + PlayerReference@Nod: + Name: Nod + Bot: campaign + Faction: nod + Color: FE1100 + Enemies: Greece, Creeps + +Actors: + Actor0: spen.nod + Owner: Nod + Location: 83,43 + Actor1: spen.nod + Owner: Nod + Location: 126,17 + Actor2: spen.nod + Owner: Nod + Location: 135,17 + Actor3: spen.nod + Owner: Nod + Location: 37,22 + Actor4: tmpl + Owner: Nod + Location: 126,31 + Actor5: tmpp + Owner: Nod + Location: 122,30 + Actor6: brik + Owner: Nod + Location: 126,23 + Actor7: brik + Owner: Nod + Location: 127,23 + Actor8: brik + Owner: Nod + Location: 126,24 + Actor9: brik + Owner: Nod + Location: 127,24 + Actor10: brik + Owner: Nod + Location: 137,23 + Actor11: brik + Owner: Nod + Location: 137,24 + Actor12: brik + Owner: Nod + Location: 138,23 + Actor14: brik + Owner: Nod + Location: 139,23 + Actor15: brik + Owner: Nod + Location: 139,24 + Actor16: brik + Owner: Nod + Location: 136,23 + Actor17: brik + Owner: Nod + Location: 136,24 + Actor18: brik + Owner: Nod + Location: 139,25 + Actor19: brik + Owner: Nod + Location: 140,25 + Actor20: brik + Owner: Nod + Location: 140,26 + Actor21: brik + Owner: Nod + Location: 140,27 + Actor22: brik + Owner: Nod + Location: 140,28 + Actor23: brik + Owner: Nod + Location: 141,28 + Actor24: brik + Owner: Nod + Location: 143,28 + Actor25: brik + Owner: Nod + Location: 144,28 + Actor26: brik + Owner: Nod + Location: 142,28 + Actor27: brik + Owner: Nod + Location: 144,29 + Actor28: brik + Owner: Nod + Location: 145,29 + Actor29: brik + Owner: Nod + Location: 146,29 + Actor30: brik + Owner: Nod + Location: 147,29 + Actor31: brik + Owner: Nod + Location: 147,30 + Actor32: brik + Owner: Nod + Location: 147,31 + Actor33: brik + Owner: Nod + Location: 147,32 + Actor34: brik + Owner: Nod + Location: 147,33 + Actor35: brik + Owner: Nod + Location: 146,33 + Actor36: brik + Owner: Nod + Location: 146,40 + Actor37: brik + Owner: Nod + Location: 146,39 + Actor38: brik + Owner: Nod + Location: 146,38 + Actor39: brik + Owner: Nod + Location: 146,37 + Actor40: brik + Owner: Nod + Location: 146,36 + Actor41: brik + Owner: Nod + Location: 146,35 + Actor42: brik + Owner: Nod + Location: 146,34 + Actor43: brik + Owner: Nod + Location: 125,23 + Actor44: brik + Owner: Nod + Location: 124,23 + Actor45: brik + Owner: Nod + Location: 124,22 + Actor46: brik + Owner: Nod + Location: 123,22 + Actor47: brik + Owner: Nod + Location: 122,22 + Actor48: brik + Owner: Nod + Location: 121,22 + Actor49: brik + Owner: Nod + Location: 121,21 + Actor50: brik + Owner: Nod + Location: 120,21 + Actor51: brik + Owner: Nod + Location: 119,21 + Actor52: brik + Owner: Nod + Location: 118,21 + Actor53: brik + Owner: Nod + Location: 117,21 + Actor54: brik + Owner: Nod + Location: 115,21 + Actor55: brik + Owner: Nod + Location: 116,21 + Actor56: brik + Owner: Nod + Location: 115,22 + Actor57: brik + Owner: Nod + Location: 115,23 + Actor58: brik + Owner: Nod + Location: 115,24 + Actor59: brik + Owner: Nod + Location: 115,25 + Actor60: brik + Owner: Nod + Location: 115,26 + Actor61: brik + Owner: Nod + Location: 116,26 + Actor62: brik + Owner: Nod + Location: 116,25 + Actor63: brik + Owner: Nod + Location: 115,33 + Actor64: brik + Owner: Nod + Location: 116,33 + Actor65: brik + Owner: Nod + Location: 115,34 + Actor66: brik + Owner: Nod + Location: 116,34 + Actor67: brik + Owner: Nod + Location: 115,35 + Actor68: brik + Owner: Nod + Location: 115,36 + Actor69: brik + Owner: Nod + Location: 115,37 + Actor70: brik + Owner: Nod + Location: 115,38 + Actor71: brik + Owner: Nod + Location: 115,39 + Actor72: brik + Owner: Nod + Location: 115,40 + Actor73: brik + Owner: Nod + Location: 116,40 + Actor74: brik + Owner: Nod + Location: 117,40 + Actor75: brik + Owner: Nod + Location: 118,40 + Actor76: brik + Owner: Nod + Location: 119,40 + Actor77: brik + Owner: Nod + Location: 120,40 + Actor78: brik + Owner: Nod + Location: 121,40 + Actor79: brik + Owner: Nod + Location: 121,41 + Actor80: brik + Owner: Nod + Location: 121,42 + Actor81: brik + Owner: Nod + Location: 121,43 + Actor82: brik + Owner: Nod + Location: 121,44 + Actor83: brik + Owner: Nod + Location: 122,44 + Actor84: brik + Owner: Nod + Location: 123,44 + Actor85: brik + Owner: Nod + Location: 124,44 + Actor86: brik + Owner: Nod + Location: 126,44 + Actor87: brik + Owner: Nod + Location: 125,44 + Actor88: brik + Owner: Nod + Location: 127,44 + Actor89: brik + Owner: Nod + Location: 129,44 + Actor90: brik + Owner: Nod + Location: 130,44 + Actor91: brik + Owner: Nod + Location: 128,44 + Actor92: brik + Owner: Nod + Location: 131,44 + Actor93: brik + Owner: Nod + Location: 131,43 + Actor94: brik + Owner: Nod + Location: 132,43 + Actor95: brik + Owner: Nod + Location: 133,43 + Actor96: brik + Owner: Nod + Location: 134,43 + Actor97: brik + Owner: Nod + Location: 134,42 + Actor98: brik + Owner: Nod + Location: 134,41 + Actor99: brik + Owner: Nod + Location: 135,41 + Actor100: brik + Owner: Nod + Location: 135,40 + Actor101: brik + Owner: Nod + Location: 135,39 + Actor102: brik + Owner: Nod + Location: 137,39 + Actor103: brik + Owner: Nod + Location: 138,39 + Actor104: brik + Owner: Nod + Location: 136,39 + Actor105: brik + Owner: Nod + Location: 139,39 + Actor106: brik + Owner: Nod + Location: 140,39 + Actor107: brik + Owner: Nod + Location: 140,40 + Actor108: brik + Owner: Nod + Location: 141,40 + Actor109: brik + Owner: Nod + Location: 142,40 + Actor110: brik + Owner: Nod + Location: 144,40 + Actor111: brik + Owner: Nod + Location: 145,40 + Actor112: brik + Owner: Nod + Location: 143,40 + Actor113: proc.td + Owner: Nod + Location: 118,28 + Actor114: afac + Owner: Nod + Location: 143,37 + Actor116: hpad.td + Owner: Nod + Location: 122,41 + Actor118: hpad.td + Owner: Nod + Location: 125,41 + Actor119: hpad.td + Owner: Nod + Location: 128,41 + Actor115: rep + Owner: Nod + Location: 124,37 + Actor120: hpad.td + Owner: Nod + Location: 128,37 + Actor121: hpad.td + Owner: Nod + Location: 131,39 + Actor122: hq + Owner: Nod + Location: 138,36 + Actor123: nuk2 + Owner: Nod + Location: 116,37 + Actor124: nuk2 + Owner: Nod + Location: 118,37 + Actor125: nuk2 + Owner: Nod + Location: 120,37 + Actor126: nuk2 + Owner: Nod + Location: 145,30 + Actor127: nuk2 + Owner: Nod + Location: 144,33 + Actor128: nuk2 + Owner: Nod + Location: 142,29 + Actor129: nuk2 + Owner: Nod + Location: 140,29 + Actor130: nuk2 + Owner: Nod + Location: 142,33 + Actor131: nuk2 + Owner: Nod + Location: 140,33 + Actor134: hand + Owner: Nod + Location: 123,26 + Actor135: obli + Owner: Nod + Location: 125,24 + Actor136: obli + Owner: Nod + Location: 138,24 + Actor137: obli + Owner: Nod + Location: 141,39 + Actor138: obli + Owner: Nod + Location: 107,36 + Actor139: obli + Owner: Nod + Location: 106,23 + Actor140: nsam + Owner: Nod + Location: 111,20 + Actor141: nsam + Owner: Nod + Location: 110,38 + Actor142: nsam + Owner: Nod + Location: 116,35 + Actor143: nsam + Owner: Nod + Location: 116,23 + Actor144: nsam + Owner: Nod + Location: 141,37 + Actor145: nsam + Owner: Nod + Location: 137,26 + Actor146: nsam + Owner: Nod + Location: 131,37 + Actor147: ltur + Owner: Nod + Location: 128,23 + TurretFacing: 0 + Actor148: ltur + Owner: Nod + Location: 135,23 + TurretFacing: 0 + Actor149: gun.nod + Owner: Nod + Location: 133,23 + TurretFacing: 0 + Actor150: gun.nod + Owner: Nod + Location: 130,23 + TurretFacing: 0 + Actor153: silo.td + Owner: Nod + Location: 137,34 + Actor154: silo.td + Owner: Nod + Location: 137,32 + Actor155: silo.td + Owner: Nod + Location: 137,30 + Actor156: split2 + Owner: Neutral + Location: 110,34 + Actor157: split2 + Owner: Neutral + Location: 109,28 + Actor158: split2 + Owner: Neutral + Location: 112,23 + Actor175: silo.td + Owner: Nod + Location: 99,84 + Actor176: silo.td + Owner: Nod + Location: 99,86 + Actor177: silo.td + Owner: Nod + Location: 99,88 + Actor179: chain + Owner: Nod + Location: 99,82 + Actor180: chain + Owner: Nod + Location: 98,82 + Actor181: chain + Owner: Nod + Location: 98,83 + Actor182: chain + Owner: Nod + Location: 98,84 + Actor183: chain + Owner: Nod + Location: 98,85 + Actor184: chain + Owner: Nod + Location: 98,88 + Actor185: chain + Owner: Nod + Location: 98,87 + Actor191: chain + Owner: Nod + Location: 98,86 + Actor192: silo.td + Owner: Nod + Location: 102,83 + Actor193: silo.td + Owner: Nod + Location: 102,85 + Actor194: silo.td + Owner: Nod + Location: 102,87 + Actor195: chain + Owner: Nod + Location: 103,82 + Actor196: chain + Owner: Nod + Location: 102,82 + Actor197: chain + Owner: Nod + Location: 100,82 + Actor198: chain + Owner: Nod + Location: 101,82 + Actor199: chain + Owner: Nod + Location: 104,82 + Actor200: chain + Owner: Nod + Location: 104,83 + Actor201: chain + Owner: Nod + Location: 104,84 + Actor202: chain + Owner: Nod + Location: 104,85 + Actor203: chain + Owner: Nod + Location: 104,86 + Actor204: chain + Owner: Nod + Location: 104,87 + Actor205: chain + Owner: Nod + Location: 104,88 + Actor206: chain + Owner: Nod + Location: 99,90 + Actor207: chain + Owner: Nod + Location: 98,90 + Actor208: chain + Owner: Nod + Location: 98,89 + Actor209: silo.td + Owner: Nod + Location: 102,89 + Actor210: chain + Owner: Nod + Location: 104,89 + Actor211: chain + Owner: Nod + Location: 104,90 + Actor212: chain + Owner: Nod + Location: 103,90 + Actor189: gun.nod + Owner: Nod + Location: 96,92 + TurretFacing: 409 + Actor190: gun.nod + Owner: Nod + Location: 106,94 + TurretFacing: 579 + Actor213: gun.nod + Owner: Nod + Location: 95,82 + Actor214: nsam + Owner: Nod + Location: 106,88 + Actor215: nsam + Owner: Nod + Location: 95,88 + Actor216: nsam + Owner: Nod + Location: 100,80 + Actor217: silo.td + Owner: Nod + Location: 96,46 + Actor218: silo.td + Owner: Nod + Location: 93,45 + Actor219: silo.td + Owner: Nod + Location: 90,44 + Actor220: silo.td + Owner: Nod + Location: 91,46 + Actor221: silo.td + Owner: Nod + Location: 94,47 + Actor222: silo.td + Owner: Nod + Location: 95,49 + Actor223: silo.td + Owner: Nod + Location: 92,48 + Actor224: silo.td + Owner: Nod + Location: 90,49 + Actor225: gun.nod + Owner: Nod + Location: 97,44 + TurretFacing: 0 + Actor133: airs + Owner: Nod + Location: 131,30 + Actor226: silo.td + Owner: Nod + Location: 136,177 + Actor227: silo.td + Owner: Nod + Location: 135,179 + Actor228: silo.td + Owner: Nod + Location: 134,181 + Actor229: silo.td + Owner: Nod + Location: 137,181 + Actor230: silo.td + Owner: Nod + Location: 136,183 + Actor231: silo.td + Owner: Nod + Location: 139,183 + Actor232: silo.td + Owner: Nod + Location: 138,185 + Actor233: silo.td + Owner: Nod + Location: 134,185 + Actor234: silo.td + Owner: Nod + Location: 132,177 + Actor235: nsam + Owner: Nod + Location: 128,182 + Actor236: nsam + Owner: Nod + Location: 142,180 + Actor237: nsam + Owner: Nod + Location: 141,187 + Actor239: gun.nod + Owner: Nod + Location: 144,178 + TurretFacing: 0 + Actor241: gun.nod + Owner: Nod + Location: 122,186 + Actor242: gun.nod + Owner: Nod + Location: 124,182 + Actor243: gun.nod + Owner: Nod + Location: 149,184 + TurretFacing: 675 + Actor238: oilb + Owner: Nod + Location: 23,87 + Actor240: oilb + Owner: Nod + Location: 24,84 + Actor244: mslo.nod + Owner: Nod + Location: 124,35 + Actor245: brik + Owner: Nod + Location: 155,126 + Actor246: brik + Owner: Nod + Location: 155,127 + Actor247: brik + Owner: Nod + Location: 155,128 + Actor248: brik + Owner: Nod + Location: 155,129 + Actor249: brik + Owner: Nod + Location: 155,130 + Actor250: brik + Owner: Nod + Location: 154,130 + Actor251: brik + Owner: Nod + Location: 153,130 + Actor252: brik + Owner: Nod + Location: 151,130 + Actor253: brik + Owner: Nod + Location: 152,130 + Actor254: brik + Owner: Nod + Location: 156,126 + Actor255: brik + Owner: Nod + Location: 157,125 + Actor256: brik + Owner: Nod + Location: 157,126 + Actor257: brik + Owner: Nod + Location: 158,125 + Actor258: brik + Owner: Nod + Location: 159,125 + Actor259: brik + Owner: Nod + Location: 160,125 + Actor260: brik + Owner: Nod + Location: 160,126 + Actor261: brik + Owner: Nod + Location: 160,127 + Actor262: brik + Owner: Nod + Location: 160,128 + Actor263: brik + Owner: Nod + Location: 160,129 + Actor264: brik + Owner: Nod + Location: 160,130 + Actor265: brik + Owner: Nod + Location: 160,131 + Actor266: brik + Owner: Nod + Location: 160,132 + Actor267: brik + Owner: Nod + Location: 160,133 + Actor268: brik + Owner: Nod + Location: 160,134 + Actor269: brik + Owner: Nod + Location: 150,130 + Actor270: brik + Owner: Nod + Location: 149,130 + Actor271: brik + Owner: Nod + Location: 149,129 + Actor272: brik + Owner: Nod + Location: 148,129 + Actor273: brik + Owner: Nod + Location: 147,129 + Actor274: brik + Owner: Nod + Location: 147,130 + Actor275: brik + Owner: Nod + Location: 146,130 + Actor276: brik + Owner: Nod + Location: 145,130 + Actor277: brik + Owner: Nod + Location: 144,130 + Actor278: brik + Owner: Nod + Location: 144,132 + Actor279: brik + Owner: Nod + Location: 144,131 + Actor280: brik + Owner: Nod + Location: 144,133 + Actor281: brik + Owner: Nod + Location: 144,134 + Actor282: brik + Owner: Nod + Location: 144,135 + Actor283: brik + Owner: Nod + Location: 144,136 + Actor284: brik + Owner: Nod + Location: 145,136 + Actor285: brik + Owner: Nod + Location: 145,135 + Actor286: brik + Owner: Nod + Location: 144,142 + Actor287: brik + Owner: Nod + Location: 144,143 + Actor288: brik + Owner: Nod + Location: 145,142 + Actor289: brik + Owner: Nod + Location: 145,143 + Actor290: brik + Owner: Nod + Location: 144,144 + Actor291: brik + Owner: Nod + Location: 144,145 + Actor292: brik + Owner: Nod + Location: 144,146 + Actor293: brik + Owner: Nod + Location: 146,146 + Actor294: brik + Owner: Nod + Location: 145,146 + Actor295: brik + Owner: Nod + Location: 147,146 + Actor296: brik + Owner: Nod + Location: 148,146 + Actor297: brik + Owner: Nod + Location: 150,146 + Actor298: brik + Owner: Nod + Location: 149,146 + Actor299: brik + Owner: Nod + Location: 152,146 + Actor300: brik + Owner: Nod + Location: 151,146 + Actor301: brik + Owner: Nod + Location: 151,145 + Actor302: brik + Owner: Nod + Location: 152,145 + Actor303: brik + Owner: Nod + Location: 157,145 + Actor304: brik + Owner: Nod + Location: 157,146 + Actor305: brik + Owner: Nod + Location: 158,145 + Actor306: brik + Owner: Nod + Location: 158,146 + Actor307: brik + Owner: Nod + Location: 160,146 + Actor308: brik + Owner: Nod + Location: 159,146 + Actor309: brik + Owner: Nod + Location: 160,145 + Actor310: brik + Owner: Nod + Location: 160,144 + Actor311: brik + Owner: Nod + Location: 160,143 + Actor312: brik + Owner: Nod + Location: 160,142 + Actor313: brik + Owner: Nod + Location: 160,141 + Actor315: brik + Owner: Nod + Location: 160,140 + Actor316: brik + Owner: Nod + Location: 160,139 + Actor317: brik + Owner: Nod + Location: 160,138 + Actor318: brik + Owner: Nod + Location: 160,137 + Actor319: brik + Owner: Nod + Location: 160,136 + Actor320: brik + Owner: Nod + Location: 160,135 + Actor314: hand + Owner: Nod + Location: 149,140 + Actor329: gun.nod + Owner: Nod + Location: 147,157 + TurretFacing: 477 + Actor331: gun.nod + Owner: Nod + Location: 131,155 + TurretFacing: 300 + Actor334: gun.nod + Owner: Nod + Location: 141,128 + TurretFacing: 192 + Actor335: gun.nod + Owner: Nod + Location: 133,137 + Actor336: gun.nod + Owner: Nod + Location: 122,45 + TurretFacing: 470 + Actor337: gun.nod + Owner: Nod + Location: 148,30 + TurretFacing: 627 + Actor338: gun.nod + Owner: Nod + Location: 106,84 + TurretFacing: 811 + Actor339: gun.nod + Owner: Nod + Location: 101,50 + TurretFacing: 811 + Actor340: gun.nod + Owner: Nod + Location: 103,69 + TurretFacing: 572 + Actor341: gun.nod + Owner: Nod + Location: 86,70 + TurretFacing: 606 + Actor342: gun.nod + Owner: Nod + Location: 95,70 + TurretFacing: 443 + Actor344: gun.nod + Owner: Nod + Location: 76,69 + TurretFacing: 634 + Actor343: proc.td + Owner: Nod + Location: 147,133 + Actor345: silo.td + Owner: Nod + Location: 151,136 + Actor346: silo.td + Owner: Nod + Location: 151,134 + Actor347: silo.td + Owner: Nod + Location: 151,132 + Actor348: silo.td + Owner: Nod + Location: 154,135 + Actor349: silo.td + Owner: Nod + Location: 154,133 + Actor350: silo.td + Owner: Nod + Location: 158,126 + Actor351: silo.td + Owner: Nod + Location: 158,128 + Actor352: silo.td + Owner: Nod + Location: 156,127 + Actor353: silo.td + Owner: Nod + Location: 156,129 + Actor354: silo.td + Owner: Nod + Location: 158,130 + Actor355: nuk2 + Owner: Nod + Location: 158,141 + Actor356: nuk2 + Owner: Nod + Location: 158,138 + Actor357: nuk2 + Owner: Nod + Location: 158,135 + Actor358: nuk2 + Owner: Nod + Location: 158,132 + Actor359: hq + Owner: Nod + Location: 154,138 + Actor360: sbag + Owner: Nod + Location: 92,124 + Actor361: sbag + Owner: Nod + Location: 91,124 + Actor362: sbag + Owner: Nod + Location: 90,124 + Actor363: sbag + Owner: Nod + Location: 89,124 + Actor364: sbag + Owner: Nod + Location: 88,124 + Actor365: sbag + Owner: Nod + Location: 87,124 + Actor366: sbag + Owner: Nod + Location: 97,124 + Actor367: sbag + Owner: Nod + Location: 98,124 + Actor368: sbag + Owner: Nod + Location: 99,124 + Actor369: sbag + Owner: Nod + Location: 100,124 + Actor370: sbag + Owner: Nod + Location: 101,124 + Actor371: sbag + Owner: Nod + Location: 101,125 + Actor372: sbag + Owner: Nod + Location: 101,126 + Actor373: sbag + Owner: Nod + Location: 86,124 + Actor374: sbag + Owner: Nod + Location: 86,125 + Actor375: sbag + Owner: Nod + Location: 86,126 + Actor376: sbag + Owner: Nod + Location: 86,127 + Actor377: sbag + Owner: Nod + Location: 86,128 + Actor378: sbag + Owner: Nod + Location: 86,132 + Actor379: sbag + Owner: Nod + Location: 86,133 + Actor380: sbag + Owner: Nod + Location: 86,134 + Actor381: sbag + Owner: Nod + Location: 86,135 + Actor382: sbag + Owner: Nod + Location: 87,136 + Actor383: sbag + Owner: Nod + Location: 86,136 + Actor384: sbag + Owner: Nod + Location: 89,136 + Actor385: sbag + Owner: Nod + Location: 88,136 + Actor386: sbag + Owner: Nod + Location: 91,136 + Actor387: sbag + Owner: Nod + Location: 90,136 + Actor389: sbag + Owner: Nod + Location: 92,136 + Actor393: sbag + Owner: Nod + Location: 98,136 + Actor394: sbag + Owner: Nod + Location: 97,136 + Actor395: sbag + Owner: Nod + Location: 101,127 + Actor396: sbag + Owner: Nod + Location: 101,128 + Actor397: sbag + Owner: Nod + Location: 101,129 + Actor398: sbag + Owner: Nod + Location: 101,130 + Actor399: sbag + Owner: Nod + Location: 101,131 + Actor400: sbag + Owner: Nod + Location: 101,132 + Actor401: sbag + Owner: Nod + Location: 101,133 + Actor402: sbag + Owner: Nod + Location: 101,134 + Actor403: sbag + Owner: Nod + Location: 101,135 + Actor404: sbag + Owner: Nod + Location: 101,136 + Actor405: sbag + Owner: Nod + Location: 100,136 + Actor406: sbag + Owner: Nod + Location: 99,136 + Actor390: hand + Owner: Nod + Location: 90,132 + Actor391: nuke + Owner: Nod + Location: 99,125 + Actor392: nuke + Owner: Nod + Location: 99,128 + Actor407: nuke + Owner: Nod + Location: 99,131 + Actor409: silo.td + Owner: Nod + Location: 91,126 + Actor411: gun.nod + Owner: Nod + Location: 85,127 + Actor412: gun.nod + Owner: Nod + Location: 85,133 + TurretFacing: 279 + Actor413: gun.nod + Owner: Nod + Location: 91,137 + TurretFacing: 450 + Actor414: gun.nod + Owner: Nod + Location: 98,137 + TurretFacing: 620 + Actor415: gun.nod + Owner: Nod + Location: 91,123 + TurretFacing: 0 + Actor416: gun.nod + Owner: Nod + Location: 98,123 + TurretFacing: 0 + Actor333: gun.nod + Owner: Nod + Location: 126,145 + TurretFacing: 286 + Actor330: gun.nod + Owner: Nod + Location: 159,160 + TurretFacing: 375 + Actor417: silo.td + Owner: Nod + Location: 116,118 + Actor418: silo.td + Owner: Nod + Location: 119,118 + Actor419: chain + Owner: Nod + Location: 116,117 + Actor420: chain + Owner: Nod + Location: 115,118 + Actor421: chain + Owner: Nod + Location: 115,117 + Actor422: chain + Owner: Nod + Location: 117,117 + Actor423: chain + Owner: Nod + Location: 118,117 + Actor424: chain + Owner: Nod + Location: 119,117 + Actor425: chain + Owner: Nod + Location: 115,119 + Actor426: chain + Owner: Nod + Location: 120,117 + Actor427: chain + Owner: Nod + Location: 121,117 + Actor428: chain + Owner: Nod + Location: 121,118 + Actor429: chain + Owner: Nod + Location: 121,119 + Actor434: silo.td + Owner: Nod + Location: 116,120 + Actor435: silo.td + Owner: Nod + Location: 119,120 + Actor436: silo.td + Owner: Nod + Location: 116,122 + Actor437: silo.td + Owner: Nod + Location: 119,122 + Actor447: chain + Owner: Nod + Location: 115,120 + Actor448: chain + Owner: Nod + Location: 115,121 + Actor449: chain + Owner: Nod + Location: 115,122 + Actor450: chain + Owner: Nod + Location: 117,123 + Actor451: chain + Owner: Nod + Location: 116,123 + Actor452: chain + Owner: Nod + Location: 115,123 + Actor453: chain + Owner: Nod + Location: 119,123 + Actor454: chain + Owner: Nod + Location: 118,123 + Actor455: chain + Owner: Nod + Location: 121,120 + Actor456: chain + Owner: Nod + Location: 121,123 + Actor457: chain + Owner: Nod + Location: 120,123 + Actor458: chain + Owner: Nod + Location: 121,122 + Actor459: chain + Owner: Nod + Location: 121,121 + Actor430: sbag + Owner: Nod + Location: 45,24 + Actor431: sbag + Owner: Nod + Location: 46,24 + Actor432: sbag + Owner: Nod + Location: 47,24 + Actor433: sbag + Owner: Nod + Location: 48,24 + Actor438: sbag + Owner: Nod + Location: 45,25 + Actor439: sbag + Owner: Nod + Location: 44,25 + Actor440: sbag + Owner: Nod + Location: 44,26 + Actor441: sbag + Owner: Nod + Location: 43,27 + Actor442: sbag + Owner: Nod + Location: 43,26 + Actor443: sbag + Owner: Nod + Location: 55,24 + Actor444: sbag + Owner: Nod + Location: 56,24 + Actor445: sbag + Owner: Nod + Location: 54,24 + Actor446: sbag + Owner: Nod + Location: 57,24 + Actor460: sbag + Owner: Nod + Location: 58,24 + Actor461: sbag + Owner: Nod + Location: 58,25 + Actor462: sbag + Owner: Nod + Location: 58,26 + Actor463: sbag + Owner: Nod + Location: 58,27 + Actor464: sbag + Owner: Nod + Location: 58,28 + Actor465: sbag + Owner: Nod + Location: 59,28 + Actor466: sbag + Owner: Nod + Location: 59,29 + Actor467: sbag + Owner: Nod + Location: 59,30 + Actor468: sbag + Owner: Nod + Location: 59,31 + Actor469: sbag + Owner: Nod + Location: 59,36 + Actor470: sbag + Owner: Nod + Location: 59,37 + Actor471: sbag + Owner: Nod + Location: 59,38 + Actor472: sbag + Owner: Nod + Location: 59,39 + Actor473: sbag + Owner: Nod + Location: 58,39 + Actor474: sbag + Owner: Nod + Location: 53,39 + Actor475: sbag + Owner: Nod + Location: 54,39 + Actor476: sbag + Owner: Nod + Location: 55,39 + Actor477: sbag + Owner: Nod + Location: 57,39 + Actor478: sbag + Owner: Nod + Location: 56,39 + Actor479: sbag + Owner: Nod + Location: 46,39 + Actor480: sbag + Owner: Nod + Location: 45,39 + Actor481: sbag + Owner: Nod + Location: 44,39 + Actor482: sbag + Owner: Nod + Location: 43,39 + Actor483: sbag + Owner: Nod + Location: 43,30 + Actor485: sbag + Owner: Nod + Location: 43,31 + Actor486: sbag + Owner: Nod + Location: 43,37 + Actor487: sbag + Owner: Nod + Location: 43,38 + Actor488: sbag + Owner: Nod + Location: 43,36 + Actor492: sbag + Owner: Nod + Location: 43,29 + Actor493: sbag + Owner: Nod + Location: 43,28 + Actor489: nuk2 + Owner: Nod + Location: 57,36 + Actor490: nuk2 + Owner: Nod + Location: 55,36 + Actor491: nuk2 + Owner: Nod + Location: 53,36 + Actor494: airs + Owner: Nod + Location: 52,31 + Actor495: hand + Owner: Nod + Location: 47,34 + Actor499: sbag + Owner: Nod + Location: 83,52 + Actor500: sbag + Owner: Nod + Location: 83,50 + Actor501: sbag + Owner: Nod + Location: 83,49 + Actor502: sbag + Owner: Nod + Location: 83,51 + Actor503: sbag + Owner: Nod + Location: 84,49 + Actor504: sbag + Owner: Nod + Location: 85,49 + Actor505: sbag + Owner: Nod + Location: 86,48 + Actor506: sbag + Owner: Nod + Location: 86,49 + Actor507: sbag + Owner: Nod + Location: 87,48 + Actor508: sbag + Owner: Nod + Location: 88,48 + Actor509: sbag + Owner: Nod + Location: 98,60 + Actor510: sbag + Owner: Nod + Location: 99,60 + Actor511: sbag + Owner: Nod + Location: 99,59 + Actor512: sbag + Owner: Nod + Location: 100,59 + Actor513: sbag + Owner: Nod + Location: 101,59 + Actor514: sbag + Owner: Nod + Location: 101,58 + Actor515: sbag + Owner: Nod + Location: 101,57 + Actor516: sbag + Owner: Nod + Location: 102,57 + Actor517: sbag + Owner: Nod + Location: 102,56 + Actor518: sbag + Owner: Nod + Location: 102,55 + Actor519: sbag + Owner: Nod + Location: 102,54 + Actor520: sbag + Owner: Nod + Location: 97,60 + Actor521: sbag + Owner: Nod + Location: 97,61 + Actor522: sbag + Owner: Nod + Location: 96,61 + Actor523: sbag + Owner: Nod + Location: 95,61 + Actor524: sbag + Owner: Nod + Location: 94,61 + Actor525: sbag + Owner: Nod + Location: 87,61 + Actor526: sbag + Owner: Nod + Location: 85,61 + Actor527: sbag + Owner: Nod + Location: 84,61 + Actor528: sbag + Owner: Nod + Location: 83,61 + Actor529: sbag + Owner: Nod + Location: 83,60 + Actor530: sbag + Owner: Nod + Location: 83,59 + Actor531: sbag + Owner: Nod + Location: 86,61 + Actor532: sbag + Owner: Nod + Location: 89,61 + Actor533: sbag + Owner: Nod + Location: 88,61 + Actor534: sbag + Owner: Nod + Location: 83,57 + Actor535: sbag + Owner: Nod + Location: 83,58 + Actor536: obli + Owner: Nod + Location: 84,60 + Actor537: obli + Owner: Nod + Location: 96,60 + Actor541: afac + Owner: Nod + Location: 98,53 + Actor543: nsam + Owner: Nod + Location: 103,67 + Actor544: nsam + Owner: Nod + Location: 72,64 + Actor545: nsam + Owner: Nod + Location: 70,52 + Actor546: nsam + Owner: Nod + Location: 77,46 + Actor547: nsam + Owner: Nod + Location: 80,70 + Actor548: nsam + Owner: Nod + Location: 98,135 + Actor549: nsam + Owner: Nod + Location: 87,135 + Actor550: nsam + Owner: Nod + Location: 118,115 + Actor551: nsam + Owner: Nod + Location: 118,125 + Actor552: nsam + Owner: Nod + Location: 145,131 + Actor553: nsam + Owner: Nod + Location: 145,144 + Actor554: nsam + Owner: Nod + Location: 155,131 + Actor555: nsam + Owner: Nod + Location: 92,160 + Actor556: nsam + Owner: Nod + Location: 19,129 + Actor557: nsam + Owner: Nod + Location: 35,113 + Actor558: nsam + Owner: Nod + Location: 36,103 + Actor559: nsam + Owner: Nod + Location: 137,82 + Actor560: nsam + Owner: Nod + Location: 47,175 + Actor561: nsam + Owner: Nod + Location: 47,122 + Actor562: nsam + Owner: Nod + Location: 134,68 + Actor563: nsam + Owner: Nod + Location: 44,38 + Actor564: nsam + Owner: Nod + Location: 56,25 + Actor565: nsam + Owner: Nod + Location: 25,43 + Actor567: split2 + Owner: Neutral + Location: 137,138 + Actor538: nuk2 + Owner: Nod + Location: 91,55 + Actor539: nuk2 + Owner: Nod + Location: 91,51 + Actor540: nuk2 + Owner: Nod + Location: 94,51 + Actor568: nuk2 + Owner: Nod + Location: 94,55 + Actor569: hq + Owner: Nod + Location: 45,27 + Actor570: proc.td + Owner: Nod + Location: 51,26 + Actor571: silo.td + Owner: Nod + Location: 55,27 + Actor572: silo.td + Owner: Nod + Location: 55,29 + Actor579: gun.nod + Owner: Nod + Location: 54,60 + TurretFacing: 627 + Actor580: gun.nod + Owner: Nod + Location: 27,59 + TurretFacing: 334 + Actor581: gun.nod + Owner: Nod + Location: 38,52 + TurretFacing: 436 + Actor582: gun.nod + Owner: Nod + Location: 53,50 + TurretFacing: 641 + Actor583: gun.nod + Owner: Nod + Location: 33,41 + Actor566: nsam + Owner: Nod + Location: 50,49 + Actor584: split2 + Owner: Neutral + Location: 50,19 + Actor585: nsam + Owner: Nod + Location: 40,74 + Actor586: nsam + Owner: Nod + Location: 127,167 + Actor587: gun.nod + Owner: Nod + Location: 125,170 + Actor588: gun.nod + Owner: Nod + Location: 134,168 + TurretFacing: 0 + Actor589: gun.nod + Owner: Nod + Location: 43,158 + TurretFacing: 456 + Actor590: gun.nod + Owner: Nod + Location: 32,151 + TurretFacing: 538 + Actor591: gun.nod + Owner: Nod + Location: 63,165 + Actor592: gun.nod + Owner: Nod + Location: 81,155 + Actor593: hpad.td + Owner: Nod + Location: 124,99 + Actor594: hpad.td + Owner: Nod + Location: 127,99 + Actor595: rep + Owner: Nod + Location: 125,95 + Actor596: chain + Owner: Nod + Location: 126,94 + Actor597: chain + Owner: Nod + Location: 124,94 + Actor598: chain + Owner: Nod + Location: 125,94 + Actor599: chain + Owner: Nod + Location: 127,94 + Actor600: chain + Owner: Nod + Location: 128,94 + Actor601: chain + Owner: Nod + Location: 123,94 + Actor602: chain + Owner: Nod + Location: 123,95 + Actor603: chain + Owner: Nod + Location: 123,96 + Actor604: chain + Owner: Nod + Location: 123,97 + Actor605: chain + Owner: Nod + Location: 123,98 + Actor606: chain + Owner: Nod + Location: 123,99 + Actor607: chain + Owner: Nod + Location: 123,100 + Actor608: chain + Owner: Nod + Location: 123,101 + Actor609: chain + Owner: Nod + Location: 123,102 + Actor610: chain + Owner: Nod + Location: 124,102 + Actor611: chain + Owner: Nod + Location: 125,102 + Actor612: chain + Owner: Nod + Location: 128,102 + Actor613: chain + Owner: Nod + Location: 127,102 + Actor614: chain + Owner: Nod + Location: 129,102 + Actor615: chain + Owner: Nod + Location: 129,101 + Actor616: chain + Owner: Nod + Location: 129,100 + Actor617: chain + Owner: Nod + Location: 129,99 + Actor618: chain + Owner: Nod + Location: 129,98 + Actor619: chain + Owner: Nod + Location: 129,97 + Actor620: chain + Owner: Nod + Location: 129,96 + Actor621: chain + Owner: Nod + Location: 129,95 + Actor622: chain + Owner: Nod + Location: 129,94 + Actor623: nsam + Owner: Nod + Location: 115,96 + Actor624: nsam + Owner: Nod + Location: 136,103 + Actor625: nsam + Owner: Nod + Location: 124,107 + Actor627: nsam + Owner: Nod + Location: 26,93 + Actor628: nsam + Owner: Nod + Location: 20,81 + Actor629: gun.nod + Owner: Nod + Location: 25,96 + TurretFacing: 606 + Actor630: gun.nod + Owner: Nod + Location: 18,89 + TurretFacing: 477 + Actor631: gun.nod + Owner: Nod + Location: 33,85 + TurretFacing: 845 + Actor632: gun.nod + Owner: Nod + Location: 26,78 + TurretFacing: 192 + Actor633: msg + Owner: Nod + Location: 133,179 + Facing: 384 + DeployState: Deployed + Actor634: msg + Owner: Nod + Location: 141,185 + Facing: 384 + DeployState: Deployed + Actor635: msg + Owner: Nod + Location: 118,121 + Facing: 384 + DeployState: Deployed + Actor637: msg + Owner: Nod + Location: 97,86 + DeployState: Deployed + Facing: 384 + StealthGen: sgen + Owner: Nod + Location: 130,34 + Actor639: mcv + Owner: Greece + Location: 7,174 + Facing: 768 + Actor640: ctnk + Owner: Greece + Location: 7,171 + Facing: 768 + Actor641: ctnk + Owner: Greece + Location: 7,177 + Facing: 768 + Actor642: jeep + Owner: Greece + Location: 11,172 + Facing: 768 + Actor643: jeep + Owner: Greece + Location: 11,176 + Facing: 768 + Actor626: nsam + Owner: Nod + Location: 76,104 + Actor644: gun.nod + Owner: Nod + Location: 76,107 + TurretFacing: 443 + Actor645: t10 + Owner: Neutral + Location: 42,154 + Actor646: t03 + Owner: Neutral + Location: 48,150 + Actor647: t13 + Owner: Neutral + Location: 30,147 + Actor648: t13 + Owner: Neutral + Location: 49,173 + Actor649: t15 + Owner: Neutral + Location: 73,157 + Actor650: t14 + Owner: Neutral + Location: 93,161 + Actor651: t12 + Owner: Neutral + Location: 89,157 + Actor652: t12 + Owner: Neutral + Location: 102,134 + Actor653: t03 + Owner: Neutral + Location: 76,125 + Actor654: t17 + Owner: Neutral + Location: 87,142 + Actor655: t14 + Owner: Neutral + Location: 95,141 + Actor656: t15 + Owner: Neutral + Location: 137,156 + Actor657: t13 + Owner: Neutral + Location: 146,153 + Actor658: t13 + Owner: Neutral + Location: 130,148 + Actor659: t03 + Owner: Neutral + Location: 133,155 + Actor660: t12 + Owner: Neutral + Location: 158,154 + Actor661: t12 + Owner: Neutral + Location: 128,143 + Actor662: t11 + Owner: Neutral + Location: 118,131 + Actor663: t13 + Owner: Neutral + Location: 124,121 + Actor664: t12 + Owner: Neutral + Location: 120,124 + Actor665: t03 + Owner: Neutral + Location: 123,118 + Actor666: t03 + Owner: Neutral + Location: 100,122 + Actor667: t11 + Owner: Neutral + Location: 78,122 + Actor668: t14 + Owner: Neutral + Location: 100,109 + Actor669: t15 + Owner: Neutral + Location: 79,110 + Actor670: t13 + Owner: Neutral + Location: 95,85 + Actor671: t10 + Owner: Neutral + Location: 97,80 + Actor672: t12 + Owner: Neutral + Location: 105,90 + Actor673: t03 + Owner: Neutral + Location: 97,92 + Actor674: t03 + Owner: Neutral + Location: 98,66 + Actor675: t17 + Owner: Neutral + Location: 77,66 + Actor676: t11 + Owner: Neutral + Location: 79,65 + Actor677: t14 + Owner: Neutral + Location: 87,64 + Actor678: t13 + Owner: Neutral + Location: 74,61 + Actor679: t13 + Owner: Neutral + Location: 71,62 + Actor680: t13 + Owner: Neutral + Location: 73,55 + Actor681: t15 + Owner: Neutral + Location: 79,49 + Actor682: t17 + Owner: Neutral + Location: 75,53 + Actor683: t03 + Owner: Neutral + Location: 74,47 + Actor684: t12 + Owner: Neutral + Location: 73,58 + Actor685: t12 + Owner: Neutral + Location: 43,49 + Actor686: t15 + Owner: Neutral + Location: 39,47 + Actor687: t12 + Owner: Neutral + Location: 53,44 + Actor688: t03 + Owner: Neutral + Location: 57,42 + Actor689: t13 + Owner: Neutral + Location: 37,40 + Actor690: t14 + Owner: Neutral + Location: 23,39 + Actor691: t15 + Owner: Neutral + Location: 28,44 + Actor692: t11 + Owner: Neutral + Location: 30,56 + Actor693: t10 + Owner: Neutral + Location: 32,51 + Actor694: t11 + Owner: Neutral + Location: 51,56 + Actor695: t11 + Owner: Neutral + Location: 38,56 + Actor696: t17 + Owner: Neutral + Location: 37,55 + Actor697: t12 + Owner: Neutral + Location: 38,61 + Actor698: t12 + Owner: Neutral + Location: 35,35 + Actor699: t03 + Owner: Neutral + Location: 66,34 + Actor700: t13 + Owner: Neutral + Location: 38,28 + Actor701: t15 + Owner: Neutral + Location: 14,15 + Actor702: t11 + Owner: Neutral + Location: 19,10 + Actor703: t13 + Owner: Neutral + Location: 134,74 + Actor704: t13 + Owner: Neutral + Location: 144,70 + Actor705: t11 + Owner: Neutral + Location: 139,79 + Actor706: t03 + Owner: Neutral + Location: 143,76 + Actor707: t12 + Owner: Neutral + Location: 136,72 + Actor708: t12 + Owner: Neutral + Location: 138,148 + Actor709: t12 + Owner: Neutral + Location: 114,121 + Actor710: t12 + Owner: Neutral + Location: 84,122 + Actor711: t11 + Owner: Neutral + Location: 101,138 + Actor712: t03 + Owner: Neutral + Location: 116,100 + Actor713: t12 + Owner: Neutral + Location: 120,93 + Actor714: t14 + Owner: Neutral + Location: 133,99 + Actor715: t15 + Owner: Neutral + Location: 136,98 + Actor716: t11 + Owner: Neutral + Location: 131,107 + Actor717: t13 + Owner: Neutral + Location: 129,105 + Actor718: t11 + Owner: Neutral + Location: 120,100 + Actor719: t10 + Owner: Neutral + Location: 119,98 + Actor720: t15 + Owner: Neutral + Location: 119,106 + Actor721: t15 + Owner: Neutral + Location: 130,96 + Actor722: t15 + Owner: Neutral + Location: 96,64 + Actor723: t17 + Owner: Neutral + Location: 76,59 + Actor724: t13 + Owner: Neutral + Location: 78,64 + Actor725: t11 + Owner: Neutral + Location: 145,182 + Actor726: t03 + Owner: Neutral + Location: 138,174 + Actor727: t03 + Owner: Neutral + Location: 130,184 + Actor728: t13 + Owner: Neutral + Location: 132,182 + Actor729: t15 + Owner: Neutral + Location: 143,186 + Actor730: t11 + Owner: Neutral + Location: 127,170 + Actor731: t14 + Owner: Neutral + Location: 129,166 + Actor732: t03 + Owner: Neutral + Location: 131,168 + Actor733: t12 + Owner: Neutral + Location: 126,166 + Actor734: t12 + Owner: Neutral + Location: 131,181 + Actor735: t15 + Owner: Neutral + Location: 138,179 + Actor736: t12 + Owner: Neutral + Location: 146,181 + Actor737: t17 + Owner: Neutral + Location: 141,182 + Actor738: t10 + Owner: Neutral + Location: 141,178 + Actor739: t10 + Owner: Neutral + Location: 136,155 + Actor740: t13 + Owner: Neutral + Location: 136,158 + Actor741: t13 + Owner: Neutral + Location: 160,156 + Actor742: t13 + Owner: Neutral + Location: 139,65 + Actor743: t11 + Owner: Neutral + Location: 124,44 + Actor744: t10 + Owner: Neutral + Location: 141,40 + Actor745: t10 + Owner: Neutral + Location: 44,72 + Actor746: t12 + Owner: Neutral + Location: 40,76 + Actor747: ice03 + Owner: Neutral + Location: 30,82 + Actor748: t15 + Owner: Neutral + Location: 27,79 + Actor749: t15 + Owner: Neutral + Location: 30,88 + Actor750: t11 + Owner: Neutral + Location: 22,92 + Actor751: t15 + Owner: Neutral + Location: 27,88 + Actor752: t13 + Owner: Neutral + Location: 28,87 + Actor753: t11 + Owner: Neutral + Location: 19,85 + Actor754: t12 + Owner: Neutral + Location: 20,83 + Actor755: t13 + Owner: Neutral + Location: 18,84 + Actor756: t17 + Owner: Neutral + Location: 23,78 + Actor757: t03 + Owner: Neutral + Location: 27,77 + Actor758: t03 + Owner: Neutral + Location: 36,110 + Actor759: t13 + Owner: Neutral + Location: 37,105 + Actor760: t15 + Owner: Neutral + Location: 33,108 + Actor761: t12 + Owner: Neutral + Location: 49,121 + Actor762: t15 + Owner: Neutral + Location: 51,122 + Actor763: t13 + Owner: Neutral + Location: 45,127 + Actor764: t11 + Owner: Neutral + Location: 53,131 + Actor765: t12 + Owner: Neutral + Location: 55,129 + Actor766: t12 + Owner: Neutral + Location: 18,126 + Actor767: t13 + Owner: Neutral + Location: 78,106 + Actor768: t03 + Owner: Neutral + Location: 80,102 + Actor769: t14 + Owner: Neutral + Location: 82,105 + Actor770: t11 + Owner: Neutral + Location: 71,102 + Actor771: tc05 + Owner: Neutral + Location: 2,184 + Actor772: t11 + Owner: Neutral + Location: 5,183 + Actor773: t13 + Owner: Neutral + Location: 5,185 + Actor774: t10 + Owner: Neutral + Location: 1,180 + Actor775: t10 + Owner: Neutral + Location: 2,182 + Actor776: t14 + Owner: Neutral + Location: 0,183 + Actor777: t03 + Owner: Neutral + Location: 4,181 + Actor778: t12 + Owner: Neutral + Location: 1,187 + Actor779: t14 + Owner: Neutral + Location: 2,189 + Actor780: t13 + Owner: Neutral + Location: 21,176 + Actor781: t11 + Owner: Neutral + Location: 18,173 + Actor782: t13 + Owner: Neutral + Location: 18,181 + Actor783: t17 + Owner: Neutral + Location: 19,179 + Actor784: t03 + Owner: Neutral + Location: 30,183 + Actor785: t13 + Owner: Neutral + Location: 31,182 + Actor786: t11 + Owner: Neutral + Location: 32,191 + Actor787: t14 + Owner: Neutral + Location: 30,189 + Actor788: t13 + Owner: Neutral + Location: 30,191 + Actor789: t12 + Owner: Neutral + Location: 29,190 + Actor790: t14 + Owner: Neutral + Location: 24,190 + Actor791: t17 + Owner: Neutral + Location: 38,189 + Actor792: lhus + Owner: Neutral + Location: 82,110 + Actor793: ltur + Owner: Nod + Location: 82,52 + TurretFacing: 163 + Actor794: ltur + Owner: Nod + Location: 82,57 + TurretFacing: 416 + Actor795: ltur + Owner: Nod + Location: 89,62 + TurretFacing: 361 + Actor796: ltur + Owner: Nod + Location: 94,62 + TurretFacing: 627 + Actor542: hand + Owner: Nod + Location: 87,52 + Actor797: howi + Owner: Nod + Facing: 384 + Location: 43,152 + Actor798: howi + Owner: Nod + Facing: 384 + Location: 45,155 + Actor799: bggy + Owner: Nod + Location: 46,158 + Facing: 512 + Actor800: bggy + Owner: Nod + Location: 96,134 + Facing: 512 + Actor801: bggy + Owner: Nod + Facing: 384 + Location: 95,131 + Actor802: bggy + Owner: Nod + Location: 94,142 + Facing: 384 + Actor803: bggy + Owner: Nod + Location: 103,137 + Facing: 512 + Actor804: howi + Owner: Nod + Location: 97,132 + Facing: 512 + Actor805: howi + Owner: Nod + Facing: 384 + Location: 148,144 + Actor806: howi + Owner: Nod + Facing: 384 + Location: 140,151 + Actor807: howi + Owner: Nod + Facing: 384 + Location: 136,148 + Actor808: howi + Owner: Nod + Location: 138,28 + Facing: 0 + Actor809: howi + Owner: Nod + Location: 120,35 + Facing: 384 + Actor810: howi + Owner: Nod + Location: 44,44 + Facing: 512 + Actor811: howi + Owner: Nod + Location: 40,42 + Facing: 512 + Actor812: howi + Owner: Nod + Location: 58,30 + Facing: 770 + Actor813: ftnk + Owner: Nod + Location: 49,39 + Facing: 512 + Actor814: ftnk + Owner: Nod + Location: 45,30 + Facing: 384 + Actor815: ftnk + Owner: Nod + Location: 101,92 + Facing: 512 + Actor816: ftnk + Owner: Nod + Location: 124,104 + Facing: 512 + Actor817: ftnk + Owner: Nod + Location: 155,147 + Facing: 512 + Actor818: ftnk + Owner: Nod + Location: 132,185 + Facing: 256 + Actor819: ftnk + Owner: Nod + Location: 77,158 + Facing: 384 + Actor820: ftnk + Owner: Nod + Facing: 384 + Location: 94,133 + Actor821: ftnk + Owner: Nod + Location: 27,84 + Facing: 512 + Actor822: ftnk + Owner: Nod + Location: 92,60 + Facing: 512 + Actor823: avtr + Owner: Nod + Location: 122,26 + Facing: 784 + Actor824: avtr + Owner: Nod + Location: 134,35 + Facing: 0 + Actor825: ltnk + Owner: Nod + Facing: 384 + Location: 85,130 + Actor826: ltnk + Owner: Nod + Location: 21,86 + Facing: 512 + Actor827: ltnk + Owner: Nod + Location: 51,38 + Facing: 512 + Actor828: ltnk + Owner: Nod + Location: 45,36 + Facing: 256 + Actor829: ltnk + Owner: Nod + Facing: 384 + Location: 85,56 + Actor830: ltnk + Owner: Nod + Location: 94,59 + Facing: 512 + Actor831: ltnk + Owner: Nod + Facing: 384 + Location: 93,68 + Actor832: ltnk + Owner: Nod + Location: 135,29 + Facing: 0 + Actor833: ltnk + Owner: Nod + Location: 133,25 + Facing: 0 + Actor834: ltnk + Owner: Nod + Location: 151,149 + Facing: 512 + Actor835: ltnk + Owner: Nod + Location: 155,144 + Facing: 512 + Actor836: ltnk + Owner: Nod + Location: 127,104 + Facing: 512 + Actor837: ltnk + Owner: Nod + Location: 125,29 + Facing: 896 + Actor838: ltnk + Owner: Nod + Location: 39,32 + Facing: 256 + Actor839: stnk.nod + Owner: Nod + Facing: 384 + Location: 72,171 + Actor840: stnk.nod + Owner: Nod + Facing: 384 + Location: 72,168 + Actor841: stnk.nod + Owner: Nod + Facing: 384 + Location: 54,16 + Actor842: stnk.nod + Owner: Nod + Facing: 384 + Location: 50,16 + Actor843: stnk.nod + Owner: Nod + Facing: 384 + Location: 139,141 + Actor844: stnk.nod + Owner: Nod + Facing: 384 + Location: 139,132 + Actor845: stnk.nod + Owner: Nod + Facing: 384 + Location: 73,130 + Actor846: stnk.nod + Owner: Nod + Facing: 384 + Location: 78,139 + Actor847: stnk.nod + Owner: Nod + Facing: 384 + Location: 97,113 + Actor848: stnk.nod + Owner: Nod + Facing: 384 + Location: 23,12 + Actor849: stnk.nod + Owner: Nod + Facing: 384 + Location: 26,8 + Actor850: hstk + Owner: Nod + Facing: 384 + Location: 23,9 + Actor851: mant + Owner: Nod + Facing: 384 + Location: 99,58 + Actor852: mant + Owner: Nod + Location: 128,35 + Facing: 512 + Actor853: bike + Owner: Nod + Location: 93,57 + Facing: 512 + Actor854: bike + Owner: Nod + Location: 89,55 + Facing: 384 + Actor855: bike + Owner: Nod + Facing: 384 + Location: 95,67 + Actor856: bike + Owner: Nod + Facing: 384 + Location: 83,66 + Actor857: bike + Owner: Nod + Facing: 384 + Location: 77,56 + Actor858: bike + Owner: Nod + Facing: 384 + Location: 84,126 + Actor859: bike + Owner: Nod + Location: 96,129 + Facing: 384 + Actor860: bike + Owner: Nod + Location: 55,43 + Facing: 512 + Actor861: bike + Owner: Nod + Location: 38,50 + Facing: 512 + Actor862: ss2 + Owner: Nod + Facing: 384 + Location: 90,150 + Actor863: ss2 + Owner: Nod + Facing: 384 + Location: 92,151 + Actor864: ss2 + Owner: Nod + Facing: 384 + Location: 89,104 + Actor865: ss2 + Owner: Nod + Facing: 384 + Location: 70,95 + Actor866: ss2 + Owner: Nod + Facing: 384 + Location: 70,89 + Actor867: ss2 + Owner: Nod + Facing: 384 + Location: 61,89 + Actor868: ss2 + Owner: Nod + Facing: 384 + Location: 60,80 + Actor869: ss2 + Owner: Nod + Facing: 384 + Location: 48,82 + Actor870: ss2 + Owner: Nod + Facing: 384 + Location: 109,110 + Actor871: ss2 + Owner: Nod + Facing: 384 + Location: 132,124 + Actor872: ss2 + Owner: Nod + Facing: 384 + Location: 132,162 + Actor873: ss2 + Owner: Nod + Facing: 384 + Location: 36,143 + Actor874: ss2 + Owner: Nod + Facing: 384 + Location: 62,158 + Actor875: ss2 + Owner: Nod + Facing: 384 + Location: 63,128 + Actor876: ss2 + Owner: Nod + Facing: 384 + Location: 43,115 + Actor877: ss2 + Owner: Nod + Facing: 384 + Location: 33,97 + Actor878: ss2 + Owner: Nod + Facing: 384 + Location: 9,133 + Actor879: ss2 + Owner: Nod + Facing: 384 + Location: 12,130 + Actor880: ss2 + Owner: Nod + Facing: 384 + Location: 14,67 + Actor881: ss2 + Owner: Nod + Facing: 384 + Location: 20,61 + Actor882: ss2 + Owner: Nod + Facing: 384 + Location: 10,64 + Actor883: ss2 + Owner: Nod + Location: 127,13 + Facing: 238 + Actor884: ss2 + Owner: Nod + Location: 132,10 + Facing: 252 + Actor885: ss2 + Owner: Nod + Location: 136,14 + Facing: 791 + Actor886: ss2 + Owner: Nod + Location: 143,14 + Facing: 743 + Actor887: ss2 + Owner: Nod + Location: 148,15 + Facing: 750 + Actor888: ss2 + Owner: Nod + Location: 123,16 + Facing: 252 + Actor889: ss2 + Owner: Nod + Facing: 384 + Location: 157,35 + Actor890: ss2 + Owner: Nod + Facing: 384 + Location: 153,36 + Actor891: ss2 + Owner: Nod + Facing: 384 + Location: 101,16 + Actor892: ss2 + Owner: Nod + Facing: 384 + Location: 95,8 + Actor893: ss2 + Owner: Nod + Facing: 384 + Location: 98,11 + Actor894: sb + Owner: Nod + Facing: 384 + Location: 63,105 + Actor895: sb + Owner: Nod + Facing: 384 + Location: 65,109 + Actor896: sb + Owner: Nod + Facing: 384 + Location: 106,148 + Actor897: sb + Owner: Nod + Facing: 384 + Location: 107,151 + Actor898: sb + Owner: Nod + Facing: 384 + Location: 65,135 + Actor899: sb + Owner: Nod + Facing: 384 + Location: 66,132 + Actor900: sb + Owner: Nod + Facing: 384 + Location: 119,168 + Actor901: sb + Owner: Nod + Facing: 384 + Location: 119,164 + Actor902: sb + Owner: Nod + Facing: 384 + Location: 144,104 + Actor903: sb + Owner: Nod + Facing: 384 + Location: 135,90 + Actor904: sb + Owner: Nod + Facing: 384 + Location: 137,92 + Actor905: sb + Owner: Nod + Facing: 384 + Location: 106,76 + Actor906: sb + Owner: Nod + Facing: 384 + Location: 93,75 + Actor907: sb + Owner: Nod + Facing: 384 + Location: 49,76 + Actor908: sb + Owner: Nod + Facing: 384 + Location: 38,83 + Actor909: sb + Owner: Nod + Facing: 384 + Location: 42,103 + Actor910: sb + Owner: Nod + Facing: 384 + Location: 42,107 + Actor911: ss2 + Owner: Nod + Facing: 384 + Location: 81,41 + Actor912: ss2 + Owner: Nod + Facing: 384 + Location: 86,39 + Actor913: ss2 + Owner: Nod + Facing: 384 + Location: 37,19 + Actor914: ss2 + Owner: Nod + Facing: 384 + Location: 33,23 + Actor915: sb + Owner: Nod + Facing: 384 + Location: 32,21 + Actor916: sb + Owner: Nod + Facing: 384 + Location: 82,37 + Actor917: n1 + Owner: Nod + Facing: 384 + Location: 46,124 + SubCell: 3 + Actor918: n1 + Owner: Nod + Facing: 384 + Location: 53,127 + SubCell: 3 + Actor919: n1 + Owner: Nod + Facing: 384 + Location: 54,126 + SubCell: 3 + Actor920: n1 + Owner: Nod + Facing: 384 + Location: 26,87 + SubCell: 3 + Actor921: n1 + Owner: Nod + Facing: 384 + Location: 22,83 + SubCell: 3 + Actor922: n1 + Owner: Nod + Facing: 384 + Location: 29,82 + SubCell: 3 + Actor923: n1 + Owner: Nod + Facing: 384 + Location: 28,83 + SubCell: 3 + Actor924: n1 + Owner: Nod + Facing: 384 + Location: 19,90 + SubCell: 3 + Actor925: n1 + Owner: Nod + Facing: 384 + Location: 25,94 + SubCell: 3 + Actor926: n1 + Owner: Nod + Location: 32,86 + SubCell: 3 + Facing: 586 + Actor927: n1 + Owner: Nod + Facing: 384 + Location: 32,83 + SubCell: 3 + Actor928: n1 + Owner: Nod + Location: 39,51 + SubCell: 3 + Facing: 688 + Actor929: n1 + Owner: Nod + Location: 40,52 + SubCell: 3 + Facing: 675 + Actor930: n1 + Owner: Nod + Facing: 384 + Location: 48,50 + SubCell: 3 + Actor931: n1 + Owner: Nod + Facing: 384 + Location: 53,47 + SubCell: 3 + Actor932: n1 + Owner: Nod + Facing: 384 + Location: 55,45 + SubCell: 3 + Actor933: n1 + Owner: Nod + Facing: 384 + Location: 55,40 + SubCell: 3 + Actor934: n1 + Owner: Nod + Facing: 384 + Location: 52,38 + SubCell: 3 + Actor935: n1 + Owner: Nod + Facing: 384 + Location: 48,39 + SubCell: 3 + Actor936: n1 + Owner: Nod + Facing: 384 + Location: 44,35 + SubCell: 3 + Actor937: n1 + Owner: Nod + Facing: 384 + Location: 39,31 + SubCell: 3 + Actor938: n1 + Owner: Nod + Facing: 384 + Location: 56,28 + SubCell: 3 + Actor939: n1 + Owner: Nod + Facing: 384 + Location: 57,29 + SubCell: 3 + Actor940: n1 + Owner: Nod + Facing: 384 + Location: 47,30 + SubCell: 3 + Actor941: n1 + Owner: Nod + Facing: 384 + Location: 47,28 + SubCell: 3 + Actor942: n1 + Owner: Nod + Facing: 384 + Location: 26,42 + SubCell: 3 + Actor943: n1 + Owner: Nod + Facing: 384 + Location: 27,43 + SubCell: 3 + Actor944: n1 + Owner: Nod + Location: 62,38 + SubCell: 3 + Facing: 716 + Actor945: n1 + Owner: Nod + Location: 64,35 + SubCell: 3 + Facing: 586 + Actor946: n1 + Owner: Nod + Facing: 384 + Location: 43,55 + SubCell: 3 + Actor947: n1 + Owner: Nod + Facing: 384 + Location: 50,59 + SubCell: 3 + Actor948: n1 + Owner: Nod + Location: 40,61 + SubCell: 3 + Facing: 384 + Actor949: n1 + Owner: Nod + Facing: 384 + Location: 32,55 + SubCell: 3 + Actor950: n1 + Owner: Nod + Facing: 384 + Location: 37,61 + SubCell: 3 + Actor951: n1 + Owner: Nod + Location: 90,60 + SubCell: 3 + Facing: 518 + Actor952: n1 + Owner: Nod + Facing: 384 + Location: 86,54 + SubCell: 3 + Actor953: n1 + Owner: Nod + Facing: 384 + Location: 85,51 + SubCell: 3 + Actor954: n1 + Owner: Nod + Facing: 384 + Location: 78,53 + SubCell: 3 + Actor955: n1 + Owner: Nod + Facing: 384 + Location: 80,57 + SubCell: 3 + Actor956: n1 + Owner: Nod + Facing: 384 + Location: 76,64 + SubCell: 3 + Actor957: n1 + Owner: Nod + Facing: 384 + Location: 84,64 + SubCell: 3 + Actor958: n1 + Owner: Nod + Facing: 384 + Location: 87,69 + SubCell: 3 + Actor959: n1 + Owner: Nod + Location: 91,69 + SubCell: 3 + Facing: 484 + Actor960: n1 + Owner: Nod + Facing: 384 + Location: 96,64 + SubCell: 3 + Actor961: n1 + Owner: Nod + Facing: 384 + Location: 101,67 + SubCell: 3 + Actor962: n1 + Owner: Nod + Facing: 384 + Location: 100,66 + SubCell: 3 + Actor963: n1 + Owner: Nod + Facing: 384 + Location: 97,59 + SubCell: 3 + Actor964: n1 + Owner: Nod + Facing: 384 + Location: 102,52 + SubCell: 3 + Actor965: n1 + Owner: Nod + Facing: 384 + Location: 98,49 + SubCell: 3 + Actor966: n1 + Owner: Nod + Facing: 384 + Location: 93,46 + SubCell: 3 + Actor967: n1 + Owner: Nod + Facing: 384 + Location: 87,49 + SubCell: 3 + Actor969: n1 + Owner: Nod + Facing: 384 + Location: 130,40 + SubCell: 3 + Actor970: n1 + Owner: Nod + Facing: 384 + Location: 141,36 + SubCell: 3 + Actor971: n1 + Owner: Nod + Facing: 384 + Location: 142,32 + SubCell: 3 + Actor972: n1 + Owner: Nod + Facing: 384 + Location: 118,36 + SubCell: 3 + Actor973: n1 + Owner: Nod + Facing: 384 + Location: 123,40 + SubCell: 3 + Actor974: n1 + Owner: Nod + Facing: 384 + Location: 133,39 + SubCell: 3 + Actor975: n1 + Owner: Nod + Location: 136,26 + SubCell: 3 + Facing: 279 + Actor978: n1 + Owner: Nod + Facing: 384 + Location: 154,148 + SubCell: 3 + Actor979: n1 + Owner: Nod + Facing: 384 + Location: 149,149 + SubCell: 3 + Actor980: n1 + Owner: Nod + Facing: 384 + Location: 150,143 + SubCell: 3 + Actor981: n1 + Owner: Nod + Facing: 384 + Location: 147,140 + SubCell: 3 + Actor982: n1 + Owner: Nod + Facing: 384 + Location: 156,142 + SubCell: 3 + Actor983: n1 + Owner: Nod + Facing: 384 + Location: 152,138 + SubCell: 3 + Actor984: n1 + Owner: Nod + Facing: 384 + Location: 159,149 + SubCell: 3 + Actor985: n1 + Owner: Nod + Facing: 384 + Location: 137,182 + SubCell: 3 + Actor986: n1 + Owner: Nod + Facing: 384 + Location: 135,178 + SubCell: 3 + Actor987: n1 + Owner: Nod + Facing: 384 + Location: 146,186 + SubCell: 3 + Actor988: n1 + Owner: Nod + Facing: 384 + Location: 135,187 + SubCell: 3 + Actor989: n1 + Owner: Nod + Facing: 384 + Location: 130,183 + SubCell: 3 + Actor990: n1 + Owner: Nod + Facing: 384 + Location: 130,179 + SubCell: 3 + Actor991: n1 + Owner: Nod + Facing: 384 + Location: 79,159 + SubCell: 3 + Actor992: n1 + Owner: Nod + Facing: 384 + Location: 77,155 + SubCell: 3 + Actor993: n1 + Owner: Nod + Facing: 384 + Location: 45,152 + SubCell: 3 + Actor994: n1 + Owner: Nod + Facing: 384 + Location: 44,151 + SubCell: 3 + Actor995: n1 + Owner: Nod + Facing: 384 + Location: 48,159 + SubCell: 3 + Actor996: n1 + Owner: Nod + Facing: 384 + Location: 105,93 + SubCell: 3 + Actor997: n1 + Owner: Nod + Facing: 384 + Location: 97,91 + SubCell: 3 + Actor998: n1 + Owner: Nod + Facing: 384 + Location: 103,86 + SubCell: 3 + Actor999: n1 + Owner: Nod + Facing: 384 + Location: 104,82 + SubCell: 1 + Actor1000: n1 + Owner: Nod + Facing: 384 + Location: 97,88 + SubCell: 3 + Actor1001: n1 + Owner: Nod + Facing: 384 + Location: 128,103 + SubCell: 3 + Actor1002: n1 + Owner: Nod + Location: 122,103 + SubCell: 3 + Facing: 647 + Actor1003: n1 + Owner: Nod + Facing: 384 + Location: 121,97 + SubCell: 3 + Actor1004: n1 + Owner: Nod + Location: 131,101 + SubCell: 3 + Facing: 600 + Actor1005: n1 + Owner: Nod + Location: 131,100 + SubCell: 3 + Facing: 627 + Actor1006: n1 + Owner: Nod + Facing: 384 + Location: 131,100 + SubCell: 1 + Actor1007: n1 + Owner: Nod + Facing: 384 + Location: 134,98 + SubCell: 3 + Actor1008: n1 + Owner: Nod + Facing: 384 + Location: 117,104 + SubCell: 3 + Actor1009: n1 + Owner: Nod + Facing: 384 + Location: 119,124 + SubCell: 3 + Actor1010: n1 + Owner: Nod + Facing: 384 + Location: 122,121 + SubCell: 3 + Actor1011: n1 + Owner: Nod + Facing: 384 + Location: 117,125 + SubCell: 3 + Actor1012: n1 + Owner: Nod + Facing: 384 + Location: 98,138 + SubCell: 3 + Actor1013: n1 + Owner: Nod + Facing: 384 + Location: 97,144 + SubCell: 3 + Actor1014: n1 + Owner: Nod + Facing: 384 + Location: 103,141 + SubCell: 3 + Actor1015: n1 + Owner: Nod + Facing: 384 + Location: 104,140 + SubCell: 3 + Actor1016: n1 + Owner: Nod + Facing: 384 + Location: 104,135 + SubCell: 3 + Actor1017: n1 + Owner: Nod + Facing: 384 + Location: 104,129 + SubCell: 3 + Actor1018: n1 + Owner: Nod + Facing: 384 + Location: 88,137 + SubCell: 3 + Actor1019: n1 + Owner: Nod + Facing: 384 + Location: 92,137 + SubCell: 3 + Actor1020: n1 + Owner: Nod + Facing: 384 + Location: 85,132 + SubCell: 3 + Actor1021: n1 + Owner: Nod + Facing: 384 + Location: 85,125 + SubCell: 3 + Actor1022: n1 + Owner: Nod + Facing: 384 + Location: 83,124 + SubCell: 3 + Actor1023: n1 + Owner: Nod + Facing: 384 + Location: 150,157 + SubCell: 3 + Actor1024: n1 + Owner: Nod + Facing: 384 + Location: 158,159 + SubCell: 3 + Actor1025: n1 + Owner: Nod + Facing: 384 + Location: 157,158 + SubCell: 3 + Actor1026: n1 + Owner: Nod + Facing: 384 + Location: 97,84 + SubCell: 3 + Actor1027: n3 + Owner: Nod + Location: 26,86 + SubCell: 3 + Facing: 552 + Actor1028: n3 + Owner: Nod + Facing: 384 + Location: 43,75 + SubCell: 3 + Actor1029: n3 + Owner: Nod + Facing: 384 + Location: 39,60 + SubCell: 3 + Actor1030: n3 + Owner: Nod + Facing: 384 + Location: 57,46 + SubCell: 3 + Actor1031: n3 + Owner: Nod + Facing: 384 + Location: 35,43 + SubCell: 3 + Actor1032: n3 + Owner: Nod + Facing: 384 + Location: 27,41 + SubCell: 3 + Actor1033: n3 + Owner: Nod + Location: 63,33 + SubCell: 3 + Facing: 688 + Actor1034: n3 + Owner: Nod + Facing: 384 + Location: 42,28 + SubCell: 3 + Actor1035: n3 + Owner: Nod + Facing: 384 + Location: 46,26 + SubCell: 3 + Actor1036: n3 + Owner: Nod + Facing: 384 + Location: 96,48 + SubCell: 3 + Actor1037: n3 + Owner: Nod + Facing: 384 + Location: 95,45 + SubCell: 3 + Actor1038: n3 + Owner: Nod + Facing: 384 + Location: 89,46 + SubCell: 3 + Actor1039: n3 + Owner: Nod + Facing: 384 + Location: 88,49 + SubCell: 3 + Actor1040: n3 + Owner: Nod + Facing: 384 + Location: 97,59 + SubCell: 1 + Actor1041: n3 + Owner: Nod + Facing: 384 + Location: 100,65 + SubCell: 3 + Actor1042: n3 + Owner: Nod + Facing: 384 + Location: 71,49 + SubCell: 3 + Actor1043: n3 + Owner: Nod + Facing: 384 + Location: 122,39 + SubCell: 3 + Actor1044: n3 + Owner: Nod + Facing: 384 + Location: 142,38 + SubCell: 3 + Actor1045: n3 + Owner: Nod + Facing: 384 + Location: 144,32 + SubCell: 3 + Actor1046: n3 + Owner: Nod + Facing: 384 + Location: 139,30 + SubCell: 3 + Actor1047: n3 + Owner: Nod + Facing: 384 + Location: 117,34 + SubCell: 3 + Actor1049: n3 + Owner: Nod + Facing: 384 + Location: 138,66 + SubCell: 3 + Actor1050: n3 + Owner: Nod + Facing: 384 + Location: 137,74 + SubCell: 3 + Actor1051: n3 + Owner: Nod + Facing: 384 + Location: 138,101 + SubCell: 3 + Actor1052: n3 + Owner: Nod + Facing: 384 + Location: 124,93 + SubCell: 3 + Actor1053: n3 + Owner: Nod + Facing: 384 + Location: 117,98 + SubCell: 3 + Actor1054: n3 + Owner: Nod + Facing: 384 + Location: 130,108 + SubCell: 3 + Actor1055: n3 + Owner: Nod + Location: 122,102 + SubCell: 3 + Facing: 384 + Actor1056: n3 + Owner: Nod + Facing: 384 + Location: 122,120 + SubCell: 3 + Actor1057: n3 + Owner: Nod + Facing: 384 + Location: 116,125 + SubCell: 3 + Actor1058: n3 + Owner: Nod + Facing: 384 + Location: 102,141 + SubCell: 3 + Actor1059: n3 + Owner: Nod + Facing: 384 + Location: 92,135 + SubCell: 3 + Actor1060: n3 + Owner: Nod + Facing: 384 + Location: 93,131 + SubCell: 3 + Actor1061: n3 + Owner: Nod + Facing: 384 + Location: 90,129 + SubCell: 3 + Actor1062: n3 + Owner: Nod + Facing: 384 + Location: 95,125 + SubCell: 3 + Actor1063: n3 + Owner: Nod + Facing: 384 + Location: 88,122 + SubCell: 3 + Actor1064: n3 + Owner: Nod + Facing: 384 + Location: 150,157 + SubCell: 1 + Actor1065: n3 + Owner: Nod + Facing: 384 + Location: 141,157 + SubCell: 3 + Actor1066: n3 + Owner: Nod + Facing: 384 + Location: 152,138 + SubCell: 1 + Actor1067: n3 + Owner: Nod + Facing: 384 + Location: 149,138 + SubCell: 3 + Actor1068: n3 + Owner: Nod + Facing: 384 + Location: 157,131 + SubCell: 3 + Actor1069: n3 + Owner: Nod + Facing: 384 + Location: 153,131 + SubCell: 3 + Actor1070: n3 + Owner: Nod + Facing: 384 + Location: 140,181 + SubCell: 3 + Actor1071: n3 + Owner: Nod + Facing: 384 + Location: 138,177 + SubCell: 3 + Actor1072: n3 + Owner: Nod + Facing: 384 + Location: 131,176 + SubCell: 3 + Actor1073: n3 + Owner: Nod + Facing: 384 + Location: 44,149 + SubCell: 3 + Actor1074: n3 + Owner: Nod + Facing: 384 + Location: 81,158 + SubCell: 3 + Actor1075: n3 + Owner: Nod + Facing: 384 + Location: 52,125 + SubCell: 3 + Actor1076: n3 + Owner: Nod + Facing: 384 + Location: 101,88 + SubCell: 3 + Actor1077: n3 + Owner: Nod + Facing: 384 + Location: 99,85 + SubCell: 3 + Actor1078: n3 + Owner: Nod + Facing: 384 + Location: 90,56 + SubCell: 3 + Actor1079: n3 + Owner: Nod + Facing: 384 + Location: 32,51 + SubCell: 3 + Actor1080: n3 + Owner: Nod + Location: 52,56 + SubCell: 3 + Facing: 384 + Actor1081: n3 + Owner: Nod + Facing: 384 + Location: 130,39 + SubCell: 3 + Actor1082: rmbc + Owner: Nod + Location: 123,34 + SubCell: 3 + Facing: 675 + Actor1083: rmbc + Owner: Nod + Location: 121,29 + SubCell: 3 + Facing: 702 + Actor1084: rmbc + Owner: Nod + Location: 137,29 + SubCell: 3 + Facing: 245 + Actor1085: rmbc + Owner: Nod + Location: 125,104 + SubCell: 3 + Facing: 525 + Actor1086: rmbc + Owner: Nod + Facing: 384 + Location: 152,140 + SubCell: 3 + Actor1087: rmbc + Owner: Nod + Facing: 384 + Location: 157,141 + SubCell: 3 + Actor1088: rmbc + Owner: Nod + Facing: 384 + Location: 88,58 + SubCell: 3 + Actor1089: rmbc + Owner: Nod + Facing: 384 + Location: 50,36 + SubCell: 3 + Actor1090: rmbc + Owner: Nod + Facing: 384 + Location: 46,33 + SubCell: 3 + Actor1091: reap + Owner: Nod + Facing: 384 + Location: 129,33 + SubCell: 3 + Actor1092: reap + Owner: Nod + Facing: 384 + Location: 125,32 + SubCell: 3 + Actor1093: reap + Owner: Nod + Location: 136,32 + SubCell: 3 + Facing: 163 + Actor1094: reap + Owner: Nod + Facing: 384 + Location: 98,51 + SubCell: 3 + Actor1095: enli + Owner: Nod + Location: 45,54 + SubCell: 3 + Facing: 504 + Actor1096: bh + Owner: Nod + Facing: 384 + Location: 127,25 + SubCell: 3 + Actor1097: bh + Owner: Nod + Facing: 384 + Location: 136,25 + SubCell: 3 + Actor1098: bh + Owner: Nod + Location: 121,33 + SubCell: 3 + Facing: 572 + Actor1099: conf + Owner: Nod + Facing: 384 + Location: 47,154 + SubCell: 3 + Actor1100: conf + Owner: Nod + Facing: 384 + Location: 30,84 + SubCell: 3 + Actor1101: conf + Owner: Nod + Facing: 384 + Location: 92,130 + SubCell: 3 + Actor1102: conf + Owner: Nod + Facing: 384 + Location: 156,138 + SubCell: 3 + Actor1103: conf + Owner: Nod + Facing: 384 + Location: 90,55 + SubCell: 3 + Actor1104: iok + Owner: Nod + Location: 92,132 + Actor1105: iok + Owner: Nod + Location: 133,28 + Actor1106: conf + Owner: Nod + Location: 132,29 + SubCell: 3 + Facing: 384 + Actor1107: acol + Owner: Nod + Facing: 384 + Location: 23,85 + SubCell: 3 + Actor1108: acol + Owner: Nod + Facing: 384 + Location: 20,88 + SubCell: 3 + Actor1109: acol + Owner: Nod + Facing: 384 + Location: 95,129 + SubCell: 3 + Actor1110: acol + Owner: Nod + Facing: 384 + Location: 139,75 + SubCell: 3 + Actor1111: acol + Owner: Nod + Facing: 384 + Location: 142,72 + SubCell: 3 + Actor1112: silo.td + Owner: Nod + Location: 35,106 + Actor1113: silo.td + Owner: Nod + Location: 35,108 + Actor1114: n1 + Owner: Nod + Facing: 384 + Location: 37,107 + SubCell: 3 + Actor1115: n1 + Owner: Nod + Facing: 384 + Location: 34,107 + SubCell: 3 + Actor1116: n1 + Owner: Nod + Facing: 384 + Location: 35,110 + SubCell: 3 + Actor1117: tplr + Owner: Nod + Facing: 384 + Location: 36,105 + SubCell: 3 + Actor1118: silo.td + Owner: Nod + Location: 139,98 + Actor1119: silo.td + Owner: Nod + Location: 139,100 + Actor1120: silo.td + Owner: Nod + Location: 134,70 + Actor1121: silo.td + Owner: Nod + Location: 138,69 + Actor1122: reap + Owner: Nod + Location: 137,72 + SubCell: 3 + Facing: 545 + InitialTree: split2 + Owner: Neutral + Location: 9,160 + Actor1123: ctnk + Owner: Greece + Facing: 768 + Location: 5,170 + Actor1124: ctnk + Owner: Greece + Facing: 768 + Location: 5,178 + NavalWaypoint1: waypoint + Owner: Neutral + Location: 10,72 + NavalWaypoint2: waypoint + Owner: Neutral + Location: 34,131 + NavalWaypoint3: waypoint + Owner: Neutral + Location: 115,155 + NavalWaypoint4: waypoint + Owner: Neutral + Location: 152,95 + NavalWaypoint5: waypoint + Owner: Neutral + Location: 82,84 + Actor1125: camera + Owner: Nod + Location: 12,163 + Actor1126: camera + Owner: Nod + Location: 29,188 + Actor1127: camera + Owner: Nod + Location: 49,153 + Actor1128: camera + Owner: Nod + Location: 70,171 + Actor1129: camera + Owner: Nod + Location: 136,181 + Actor1130: camera + Owner: Nod + Location: 94,130 + Actor1131: camera + Owner: Nod + Location: 151,138 + Actor1132: camera + Owner: Nod + Location: 49,31 + Actor1133: camera + Owner: Nod + Location: 89,57 + Actor1134: camera + Owner: Nod + Location: 101,86 + Actor1135: camera + Owner: Nod + Location: 76,106 + Actor1136: camera + Owner: Nod + Location: 22,68 + Actor1137: camera + Owner: Nod + Location: 46,89 + Actor1138: camera + Owner: Nod + Location: 61,108 + Actor1139: camera + Owner: Nod + Location: 86,93 + Actor1140: camera + Owner: Nod + Location: 108,118 + Actor1141: camera + Owner: Nod + Location: 139,117 + Actor1142: camera + Owner: Nod + Location: 115,53 + Actor1143: camera + Owner: Nod + Location: 134,54 + Actor1144: camera + Owner: Nod + Location: 152,44 + Actor1145: camera + Owner: Nod + Location: 94,23 + Actor1146: camera + Owner: Nod + Location: 118,10 + Actor1147: camera + Owner: Nod + Location: 36,14 + Actor1148: camera + Owner: Nod + Location: 24,24 + Actor1149: camera + Owner: Nod + Location: 64,51 + Actor1150: camera + Owner: Nod + Location: 80,33 + Actor1151: camera + Owner: Nod + Location: 116,145 + Actor1152: camera + Owner: Nod + Location: 150,166 + Actor1153: camera + Owner: Nod + Location: 109,180 + Actor1154: camera + Owner: Nod + Location: 80,170 + Actor1155: camera + Owner: Nod + Location: 62,139 + Actor1156: camera + Owner: Nod + Location: 5,141 + Actor1157: camera + Owner: Nod + Location: 35,161 + PlayerStart: waypoint + Owner: Neutral + Location: 10,174 + Actor1158: nuk2 + Owner: Nod + Location: 119,22 + Actor1159: nuk2 + Owner: Nod + Location: 121,23 + Actor968: n1 + Owner: Nod + Facing: 384 + Location: 133,37 + SubCell: 3 + Actor1160: nuk2 + Owner: Nod + Location: 136,36 + Actor1161: nuk2 + Owner: Nod + Location: 134,36 + Actor1162: nuk2 + Owner: Nod + Location: 86,57 + Actor1163: nuk2 + Owner: Nod + Location: 143,182 + Actor1164: nuk2 + Owner: Nod + Location: 132,99 + Actor1165: nuk2 + Owner: Nod + Location: 118,96 + Actor1166: n3 + Owner: Nod + Facing: 384 + Location: 119,25 + SubCell: 3 + Actor1167: n3 + Owner: Nod + Facing: 384 + Location: 118,22 + SubCell: 3 + Actor1168: msg + Owner: Nod + Facing: 384 + DeployState: Deployed + Location: 141,32 + Actor1169: msg + Owner: Nod + Facing: 384 + DeployState: Deployed + Location: 119,33 + Actor1170: hpad.td + Owner: Nod + Location: 143,72 + Actor1171: hpad.td + Owner: Nod + Location: 140,75 + SecondTree: split2 + Owner: Neutral + Location: 78,133 + Actor408: silo.td + Owner: Nod + Location: 88,126 + Actor636: msg + Owner: Nod + DeployState: Deployed + Facing: 384 + Location: 105,85 + Actor1172: bggy + Owner: Nod + Facing: 384 + Location: 104,91 + Actor1173: bggy + Owner: Nod + Facing: 384 + Location: 97,126 + Actor1174: bggy + Owner: Nod + Facing: 384 + Location: 144,180 + Actor1175: ltur + Owner: Nod + Location: 152,147 + TurretFacing: 334 + Actor1176: ltur + Owner: Nod + Location: 157,147 + TurretFacing: 463 + Actor1177: ltur + Owner: Nod + Location: 143,142 + TurretFacing: 306 + Actor1178: ltur + Owner: Nod + Location: 143,136 + Actor1179: ltur + Owner: Nod + Location: 42,31 + TurretFacing: 128 + Actor1180: ltur + Owner: Nod + Location: 42,36 + TurretFacing: 463 + Actor1181: ltur + Owner: Nod + Location: 46,40 + TurretFacing: 375 + Actor1182: ltur + Owner: Nod + Location: 53,40 + TurretFacing: 504 + Actor1183: ltur + Owner: Nod + Location: 60,36 + TurretFacing: 709 + Actor1184: ltur + Owner: Nod + Location: 60,31 + TurretFacing: 620 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, intervention-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/main-campaign/ca46-intervention/summer.pal b/mods/ca/missions/main-campaign/ca46-intervention/summer.pal new file mode 100644 index 0000000000..94fd0f1418 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca46-intervention/summer.pal differ diff --git a/mods/ca/missions/main-campaign/ca47-ad-nihilum/ad-nihilum-rules.yaml b/mods/ca/missions/main-campaign/ca47-ad-nihilum/ad-nihilum-rules.yaml new file mode 100644 index 0000000000..946cd9ad3d --- /dev/null +++ b/mods/ca/missions/main-campaign/ca47-ad-nihilum/ad-nihilum-rules.yaml @@ -0,0 +1,101 @@ +^Palettes: + PaletteFromFile@terrain-temperat: + Filename: ca|missions/main-campaign/ca47-ad-nihilum/dartmoor.pal + TintPostProcessEffect: + Red: 1 + Green: 1 + Blue: 1 + Ambient: 0.85 + +^BaseWorld: + TerrainLighting: + +World: + LuaScript: + Scripts: campaign.lua, ad-nihilum.lua + MissionData: + Briefing: We have received an urgent and highly troubling communication from GDI HQ on the Scrin homeworld. One of their bases, which had been holding its ground against Malefic Scrin assaults, detected a massive radar signature slowly heading towards them. Before they could even get a visual, the entire base was annihilated.\n\nThe Malefic Scrin have thus far prevented GDI from getting a closer look, but these are undoubtedly war machines of enormous power; perhaps even surpassing the Exterminator Tripods deployed by the Overlord.\n\nWe have reason to believe that an unknown number of these machines, which we have designated "Void Engines", have travelled to Earth. GDI have detected them moving through an interstellar gateway that scans have indicated is directed towards Earth.\n\nGDI reports that the Scrin Rebels have suffered devastating losses in an attempt to engage one of the machines. It is not known whether the Overlord or the Soviets have encountered one yet. Their exact purpose, beyond their sheer destructive power, is also not yet known.\n\nNone have thus far been detected on Earth, and we haven't been able to locate the interstellar gateway being used, however a significant Malefic Scrin presence has been identified along with three unusually large gateways that are not powerful enough to be of the interstellar variety. Their size may be to allow these massive machines through.\n\nThe gateways are located south of Berlin, Germany — the heart of Allied territory. An evacuation of the city is underway, however several of our bases further south have gone dark which suggests we have precious little time. Assuming Berlin is their target, we must stop them from reaching the city at all costs.\n\nDestroy any Void Engines before they can break through your lines. Once your forces are sufficient, destroy the Scrin bases to secure their gateways. + MapOptions: + ShortGameCheckboxEnabled: False + MusicPlaylist: + StartingMusic: malev + +Player: + PlayerResources: + DefaultCash: 6000 + +# Enable subfaction specific tech + +SNIP: + Buildable: + Prerequisites: ~tent, anyradar + +RTNK: + Buildable: + Prerequisites: ~vehicles.allies + +TNKD: + Buildable: + Prerequisites: anyradar, ~vehicles.allies + +CHPR: + Buildable: + Prerequisites: atek, ~vehicles.allies + +BATF: + Buildable: + Prerequisites: atek, ~vehicles.allies + +NHAW: + Buildable: + Prerequisites: ~aircraft.allies + +HTUR: + Buildable: + Prerequisites: ~structures.allies, anyradar + +entrench.upgrade: + Buildable: + Prerequisites: anyradar, ~radar.allies + +apb.upgrade: + Buildable: + Prerequisites: atek + +tflx.upgrade: + Buildable: + Prerequisites: pdox + +^VeilOfWarPower: + SpawnActorPowerCA@VeilOfWar: + Prerequisites: ~radar.allies + +# Misc + +STLK: + Cloak@NORMAL: + CloakDelay: 750 + RequiresCondition: !cloak-force-disabled && !being-warped && !parachute + GrantTimedCondition@Uncloaked: + RequiresCondition: !hidden + DummyConditionConsumer@cloak-active: + Condition: cloak-active + DummyConditionConsumer@cloak-charging: + Condition: cloak-charging + +VENG: + ExternalCondition@VengReveal: + Condition: veng-reveal + RevealsShroud@Reveal: + Range: 5c0 + ValidRelationships: Enemy + RequiresCondition: veng-reveal + +# Hunt() requires only 1 AttackBase +DEVA: + -AttackFrontalCharged: + -Armament@PRIMARYUPG: + -AmbientSound@CHARGE: + -WithIdleOverlay@CHARGE1: + -WithIdleOverlay@CHARGE2: + -WithIdleOverlay@CHARGE3: diff --git a/mods/ca/missions/main-campaign/ca47-ad-nihilum/ad-nihilum.lua b/mods/ca/missions/main-campaign/ca47-ad-nihilum/ad-nihilum.lua new file mode 100644 index 0000000000..0d2e02def3 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca47-ad-nihilum/ad-nihilum.lua @@ -0,0 +1,389 @@ +MissionDir = "ca|missions/main-campaign/ca47-ad-nihilum" + +SuperweaponsEnabledTime = { + easy = DateTime.Minutes(60), + normal = DateTime.Minutes(40), + hard = DateTime.Minutes(25), + vhard = DateTime.Minutes(18), + brutal = DateTime.Minutes(15) +} + +GatewayLocations = { + Left = LeftGateway.Location, + Right = RightGateway.Location, + Middle = MiddleGateway.Location +} + +VoidEnginePaths = { + Left = { LeftPath1.Location, LeftPath2.Location, LeftPath3.Location, LeftPath4.Location, LeftPath5.Location, LeftPath6.Location, LeftPath7.Location, }, + Right = { RightPath1.Location, RightPath2.Location, RightPath3.Location, RightPath4.Location, RightPath5.Location, RightPath6a.Location, RightPath7.Location }, + Middle = { MiddlePath1.Location, HighwayPath1.Location, HighwayExit.Location } +} + +VoidEngineStartTime = { + easy = DateTime.Minutes(10), + normal = DateTime.Minutes(8), + hard = DateTime.Minutes(6), + vhard = DateTime.Minutes(6), + brutal = DateTime.Minutes(6) +} + +VoidEngineInterval = { + easy = DateTime.Minutes(7), + normal = DateTime.Minutes(6), + hard = DateTime.Minutes(5), + vhard = DateTime.Minutes(4), + brutal = DateTime.Minutes(3) + DateTime.Seconds(20) +} + +VoidEngineAttackCount = { + easy = 2, + normal = 4, + hard = 8, + vhard = 50, + brutal = 50 +} + +VoidEngineRevealDelay = { + easy = DateTime.Seconds(5), + normal = DateTime.Minutes(1), + hard = DateTime.Minutes(2), + vhard = DateTime.Minutes(3), + brutal = DateTime.Minutes(3) + DateTime.Seconds(30) +} + +LeftAttackPaths = { + { LeftPath2.Location, LeftPath3.Location, LeftPath4.Location, LeftPath5.Location }, + { LeftPath2.Location, LeftPath3.Location, LeftMiddlePath1.Location }, + { LeftPath2.Location, LeftPath3.Location, LeftMiddlePath1.Location }, +} + +LeftFlankPaths = { + { LeftPath2.Location, LeftFlankPath1.Location, LeftFlankPath2a.Location, LeftFlankPath3.Location }, + { LeftPath2.Location, LeftFlankPath1.Location, LeftFlankPath2b.Location, LeftFlankPath3.Location }, +} + +RightAttackPaths = { + { MiddlePath1.Location, MiddlePath2.Location, LeftMiddlePath1.Location }, + { MiddlePath1.Location, MiddlePath2.Location, MiddlePath3.Location }, + { RightPath4.Location, RightPath5.Location, RightPath6a.Location }, + { RightPath4.Location, RightPath5.Location, RightPath6b.Location }, +} + +RightFlankPaths = { + { RightFlankPath1.Location, RightFlankPath2.Location, RightFlankPath3.Location }, +} + +AggrodVoidEngines = {} +BaseAttackVoidEngines = {} +AnathemaVoidEngines = {} + +table.insert(UnitCompositions.Scrin, { + Infantry = { "s1", "stlk", "s1", "s1", "s1", "stlk", "stlk", "s1", "s1", "stlk", "s1", "s1", "s1", "stlk", "stlk", "stlk", "s1", "s1", "s1" }, + Vehicles = { "dark", "gunw", "dark", "dark", "gunw", "dark" }, + Aircraft = { PacOrDevastator, "pac" }, + MinTime = DateTime.Minutes(17) +}) + +if IsVeryHardOrAbove() then + table.insert(UnitCompositions.Scrin, { + Vehicles = { "lace", "lace", "lace", "lace", "lace", "lace", "lace", "lace", "lace", "lace", "lace", "lace", "lace", "lace", "lace" }, + MinTime = DateTime.Minutes(14), + IsSpecial = true + }) +end + +Squads = { + Left = { + Compositions = AdjustCompositionsForDifficulty(UnitCompositions.Scrin), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 20, Max = 40 }), + FollowLeader = true, + AttackPaths = function(squad) + if DateTime.GameTime > DateTime.Minutes(12) then + return Utils.Concat(LeftAttackPaths, LeftFlankPaths) + else + return LeftAttackPaths + end + end, + Delay = AdjustDelayForDifficulty(DateTime.Minutes(2)), + ProducerActors = { Infantry = { LeftPortal }, Vehicles = { LeftWarpSphere }, Aircraft = { LeftGrav } } + }, + Right = { + Compositions = AdjustCompositionsForDifficulty(UnitCompositions.Scrin), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 20, Max = 40 }), + FollowLeader = true, + AttackPaths = function(squad) + if DateTime.GameTime > DateTime.Minutes(14) then + return Utils.Concat(RightAttackPaths, RightFlankPaths) + else + return RightAttackPaths + end + end, + Delay = AdjustDelayForDifficulty(DateTime.Minutes(4)), + ProducerActors = { Infantry = { MiddlePortal, RightPortal }, Vehicles = { MiddleWarpSphere, RightWarpSphere }, Aircraft = { MiddleGrav1, MiddleGrav2, MiddleGrav3, RightGrav } } + }, + Air = { + Delay = AdjustAirDelayForDifficulty(DateTime.Minutes(12)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 12, Max = 12 }), + Compositions = AirCompositions.Scrin, + }, + AirToAir = AirToAirSquad( + { "stmr", "enrv", "torm" }, + AdjustAirDelayForDifficulty(DateTime.Minutes(10)), + function(a) + a.Patrol({ GatewayLocations.Left, GatewayLocations.Middle, GatewayLocations.Right, GatewayLocations.Middle }) + end + ), +} + +SetupPlayers = function() + Greece = Player.GetPlayer("Greece") + MaleficScrin = Player.GetPlayer("MaleficScrin") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = { Greece } + MissionEnemies = { MaleficScrin } +end + +WorldLoaded = function() + SetupPlayers() + + Camera.Position = PlayerStart.CenterPosition + + InitObjectives(Greece) + AdjustPlayerStartingCashForDifficulty() + RemoveActorsBasedOnDifficultyTags() + InitMaleficScrin() + + ObjectiveDestroyScrinBases = Greece.AddObjective("Destroy all Scrin bases.") + ObjectiveStopVoidEngines = Greece.AddObjective("Prevent Void Engines from breaking through.") + + Trigger.AfterDelay(DateTime.Seconds(4), function() + PlaySpeechNotificationToMissionPlayers("ReinforcementsArrived") + Notification("Reinforcements have arrived.") + DoMcvArrival() + end) + + Trigger.AfterDelay(VoidEngineStartTime[Difficulty], function() + NextVoidEngineIndex = 1 + VoidEngineInitialPaths = Utils.Random({ + { "Left", "Right", "Left", "Middle" }, + { "Right", "Left", "Right", "Middle" } + }) + + SendNextVoidEngine() + end) + + local voidEngineExit = {} + for x = 84, 132 do + table.insert(voidEngineExit, CPos.New(x, 1)) + end + + Trigger.OnEnteredFootprint(voidEngineExit, function(a, id) + if a.Type == "veng" then + a.Destroy() + Notification("A Void Engine has broken through.") + Media.PlaySoundNotification(nil, "AlertBuzzer") + Greece.MarkFailedObjective(ObjectiveStopVoidEngines) + end + end) + + AfterWorldLoaded() +end + +Tick = function() + OncePerSecondChecks() + OncePerFiveSecondChecks() + OncePerThirtySecondChecks() + AfterTick() +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + MaleficScrin.Resources = MaleficScrin.ResourceCapacity - 500 + + if not PlayerHasBuildings(MaleficScrin) then + Greece.MarkCompletedObjective(ObjectiveDestroyScrinBases) + Utils.Do({ LeftGateway, RightGateway, MiddleGateway }, function(g) + if not g.IsDead then + g.Kill() + end + end) + end + + if Greece.IsObjectiveCompleted(ObjectiveDestroyScrinBases) and #MaleficScrin.GetActorsByTypes({ "veng" }) == 0 then + Greece.MarkCompletedObjective(ObjectiveStopVoidEngines) + end + + if MissionPlayersHaveNoRequiredUnits() then + Greece.MarkFailedObjective(ObjectiveDestroyScrinBases) + Greece.MarkFailedObjective(ObjectiveStopVoidEngines) + end + end +end + +OncePerFiveSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 125 == 0 then + UpdatePlayerBaseLocations() + end +end + +OncePerThirtySecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 750 == 0 then + CalculatePlayerCharacteristics() + end +end + +InitMaleficScrin = function() + AutoRepairAndRebuildBuildings(MaleficScrin, 10) + SetupRefAndSilosCaptureCredits(MaleficScrin) + AutoReplaceHarvesters(MaleficScrin) + AutoRebuildConyards(MaleficScrin) + InitAiUpgrades(MaleficScrin) + InitAttackSquad(Squads.Left, MaleficScrin) + InitAttackSquad(Squads.Right, MaleficScrin) + InitAirAttackSquad(Squads.Air, MaleficScrin) + + if IsHardOrAbove() then + InitAirAttackSquad(Squads.AirToAir, MaleficScrin, MissionPlayers, { "Aircraft" }, "ArmorType") + + local productionBuildings = MaleficScrin.GetActorsByTypes({ "port", "wsph", "sfac", "grav" }) + for _, b in pairs(productionBuildings) do + BuildDefenseOnCaptureAttempt(b, "ptur", true) + end + end + + Trigger.AfterDelay(SuperweaponsEnabledTime[Difficulty], function() + Actor.Create("ai.superweapons.enabled", true, { Owner = MaleficScrin }) + Actor.Create("ai.minor.superweapons.enabled", true, { Owner = MaleficScrin }) + end) + + local maleficScrinGroundAttackers = MaleficScrin.GetGroundAttackers() + Utils.Do(maleficScrinGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsScrinGroundHunterUnit) + end) +end + +SendNextVoidEngine = function() + if NextVoidEngineIndex <= VoidEngineAttackCount[Difficulty] and not Greece.IsObjectiveCompleted(ObjectiveDestroyScrinBases) then + MediaCA.PlaySound("veng-spawn.aud", 2) + + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(2)), function() + Notification("Alert. Void Engine detected.") + MediaCA.PlaySound(MissionDir .. "/r_vengdet.aud", 2) + end) + + local path + local spawnLoc + + if NextVoidEngineIndex <= #VoidEngineInitialPaths then + path = VoidEnginePaths[VoidEngineInitialPaths[NextVoidEngineIndex]] + spawnLoc = GatewayLocations[VoidEngineInitialPaths[NextVoidEngineIndex]] + else + pathName = Utils.Random({ "Left", "Right", "Middle" }) + path = VoidEnginePaths[pathName] + spawnLoc = GatewayLocations[pathName] + end + + local voidEngine = Reinforcements.Reinforce(MaleficScrin, { "veng" }, { spawnLoc }, 10, function(a) + local actorId = tostring(a) + + Utils.Do(path, function(loc) + a.Move(loc) + end) + + a.GrantCondition("difficulty-" .. Difficulty) + + Trigger.OnIdle(a, function(self) + if not self.IsDead then + self.AttackMove(path[#path]) + end + end) + + Trigger.OnDamaged(a, function(self, attacker, damage) + if IsMissionPlayer(attacker.Owner) and not self.IsDead then + -- below 66% health, start attacking units on path to exit + if not AggrodVoidEngines[actorId] and self.Health < self.MaxHealth / 3 * 2 then + AggrodVoidEngines[actorId] = true + self.Stop() + self.AttackMove(path[#path]) + else + -- below 33% health, attack player base + if self.Health < self.MaxHealth / 3 then + if not BaseAttackVoidEngines[actorId] then + BaseAttackVoidEngines[actorId] = true + self.Stop() + AssaultPlayerBaseOrHunt(self) + -- 5% chance every time damaged to clear any current target and continue attacking player base + else + local rand = Utils.RandomInteger(1,100) + if rand > 100 - 5 then + self.Stop() + AssaultPlayerBaseOrHunt(self) + end + end + -- between 66% and 33% health, 10% chance every time damaged to clear target and attack move to exit + elseif AggrodVoidEngines[actorId] then + local rand = Utils.RandomInteger(1,100) + if rand > 100 - 10 then + self.Stop() + self.AttackMove(path[#path]) + end + end + end + + if IsVeryHardOrAbove() and not AnathemaVoidEngines[actorId] and self.Health < 200000 then + AnathemaVoidEngines[actorId] = true + self.GrantCondition("anathema") + Media.PlaySound("anathema.aud") + end + end + end) + + Trigger.AfterDelay(VoidEngineRevealDelay[Difficulty], function() + if not a.IsDead then + Beacon.New(Greece, a.CenterPosition) + Media.PlaySound("beacon.aud") + a.GrantCondition("veng-reveal") + end + end) + end)[1] + + if IsVeryHardOrAbove() then + local startGuardCount + local maxGuardCount + + if Difficulty == "brutal" then + startGuardCount = 4 + maxGuardCount = 10 + else + startGuardCount = 2 + maxGuardCount = 8 + end + + local guardsList = {} + + -- starting with startGuardCount, add a guard every 10 minutes + local numGuards = math.max(startGuardCount, math.min(maxGuardCount, startGuardCount + math.floor((DateTime.GameTime - DateTime.Minutes(10)) / DateTime.Minutes(10)))) + for i = 1, numGuards do + table.insert(guardsList, "gunw") + end + + local guards = Reinforcements.Reinforce(MaleficScrin, guardsList, { spawnLoc }, 250, function(g) + FollowActor(g, voidEngine) + IdleHunt(g) + end) + end + + NextVoidEngineIndex = NextVoidEngineIndex + 1 + + Trigger.AfterDelay(VoidEngineInterval[Difficulty], function() + SendNextVoidEngine() + end) + end +end + +DoMcvArrival = function() + Reinforcements.Reinforce(Greece, { "mcv" }, { McvSpawn1.Location, McvDest1.Location }, 75) + Reinforcements.Reinforce(Greece, { "mcv" }, { McvSpawn2.Location, McvDest2.Location }, 75) +end diff --git a/mods/ca/missions/main-campaign/ca47-ad-nihilum/dartmoor.pal b/mods/ca/missions/main-campaign/ca47-ad-nihilum/dartmoor.pal new file mode 100644 index 0000000000..b0f5b74c48 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca47-ad-nihilum/dartmoor.pal differ diff --git a/mods/ca/missions/main-campaign/ca47-ad-nihilum/map.bin b/mods/ca/missions/main-campaign/ca47-ad-nihilum/map.bin new file mode 100644 index 0000000000..6f9ceb269b Binary files /dev/null and b/mods/ca/missions/main-campaign/ca47-ad-nihilum/map.bin differ diff --git a/mods/ca/missions/main-campaign/ca47-ad-nihilum/map.png b/mods/ca/missions/main-campaign/ca47-ad-nihilum/map.png new file mode 100644 index 0000000000..2f51305107 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca47-ad-nihilum/map.png differ diff --git a/mods/ca/missions/main-campaign/ca47-ad-nihilum/map.yaml b/mods/ca/missions/main-campaign/ca47-ad-nihilum/map.yaml new file mode 100644 index 0000000000..9328f9527b --- /dev/null +++ b/mods/ca/missions/main-campaign/ca47-ad-nihilum/map.yaml @@ -0,0 +1,8958 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 47: Ad Nihilum + +Author: Darkademic + +Tileset: TEMPERAT + +MapSize: 194,146 + +Bounds: 1,1,192,144 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: Greece, MaleficScrin + PlayerReference@Greece: + Name: Greece + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: allies + LockColor: True + Color: 99ACF2 + LockSpawn: True + LockTeam: True + Enemies: MaleficScrin, Creeps + PlayerReference@MaleficScrin: + Name: MaleficScrin + Bot: campaign + Faction: scrin + Color: 3E4549 + Enemies: Greece, Creeps + +Actors: + Actor1: tc05 + Owner: Neutral + Location: 165,75 + Actor2: tc05 + Owner: Neutral + Location: 103,139 + Actor3: tc05 + Owner: Neutral + Location: 47,130 + Actor4: tc05 + Owner: Neutral + Location: 85,102 + Actor17: tc03 + Owner: Neutral + Location: 18,120 + Actor19: tc03 + Owner: Neutral + Location: 189,29 + Actor20: tc03.husk + Owner: Neutral + Location: 107,140 + Actor22: tc04 + Owner: Neutral + Location: 190,113 + Actor23: tc03 + Owner: Neutral + Location: 171,68 + Actor26: tc04 + Owner: Neutral + Location: 78,96 + Actor27: tc03 + Owner: Neutral + Location: 124,93 + Actor28: tc03 + Owner: Neutral + Location: 0,138 + Actor31: tc04.husk + Owner: Neutral + Location: 16,116 + Actor32: tc04 + Owner: Neutral + Location: 18,128 + Actor34: tc03 + Owner: Neutral + Location: 68,100 + Actor37: tc03 + Owner: Neutral + Location: 51,142 + Actor38: tc04 + Owner: Neutral + Location: 140,31 + Actor43: tc04.husk + Owner: Neutral + Location: 17,118 + Actor45: tc03 + Owner: Neutral + Location: 190,76 + Actor46: tc04 + Owner: Neutral + Location: 101,140 + Actor49: tc04 + Owner: Neutral + Location: 121,86 + Actor53: tc03.husk + Owner: Neutral + Location: 143,31 + Actor54: tc03.husk + Owner: Neutral + Location: 57,107 + Actor55: tc02 + Owner: Neutral + Location: 2,34 + Actor56: tc02 + Owner: Neutral + Location: 170,6 + Actor57: tc02 + Owner: Neutral + Location: 169,72 + Actor58: tc02 + Owner: Neutral + Location: 57,110 + Actor60: tc02 + Owner: Neutral + Location: 12,71 + Actor61: tc02 + Owner: Neutral + Location: 45,128 + Actor63: tc02 + Owner: Neutral + Location: 25,58 + Actor65: tc02 + Owner: Neutral + Location: 22,133 + Actor69: tc02 + Owner: Neutral + Location: 87,131 + Actor70: tc02.husk + Owner: Neutral + Location: 172,78 + Actor72: tc02.husk + Owner: Neutral + Location: 124,91 + Actor75: tc02.husk + Owner: Neutral + Location: 15,119 + Actor76: tc02 + Owner: Neutral + Location: 152,33 + Actor79: tc02 + Owner: Neutral + Location: 187,77 + Actor83: tc02 + Owner: Neutral + Location: 190,119 + Actor84: tc02 + Owner: Neutral + Location: 125,89 + Actor87: tc02 + Owner: Neutral + Location: 69,103 + Actor88: tc02 + Owner: Neutral + Location: 190,0 + Actor91: tc02 + Owner: Neutral + Location: 165,72 + Actor96: t15 + Owner: Neutral + Location: 169,74 + Actor99: t10 + Owner: Neutral + Location: 114,87 + Actor103: t15 + Owner: Neutral + Location: 157,42 + Actor105: tc01 + Owner: Neutral + Location: 15,121 + Actor106: t14 + Owner: Neutral + Location: 174,68 + Actor108: t11.husk + Owner: Neutral + Location: 6,140 + Actor110: tc01 + Owner: Neutral + Location: 191,74 + Actor112: t11 + Owner: Neutral + Location: 15,45 + Actor116: tc01 + Owner: Neutral + Location: 168,71 + Actor122: t11 + Owner: Neutral + Location: 74,100 + Actor124: t11 + Owner: Neutral + Location: 178,44 + Actor126: t15.husk + Owner: Neutral + Location: 187,72 + Actor129: t15 + Owner: Neutral + Location: 99,141 + Actor131: t11 + Owner: Neutral + Location: 1,136 + Actor133: t11 + Owner: Neutral + Location: 18,126 + Actor134: tc01 + Owner: Neutral + Location: 49,139 + Actor135: tc01 + Owner: Neutral + Location: 75,98 + Actor141: t11 + Owner: Neutral + Location: 155,4 + Actor142: t15 + Owner: Neutral + Location: 168,75 + Actor146: t10 + Owner: Neutral + Location: 192,27 + Actor150: t11 + Owner: Neutral + Location: 15,127 + Actor152: t10.husk + Owner: Neutral + Location: 192,28 + Actor153: tc01 + Owner: Neutral + Location: 166,73 + Actor154: tc01 + Owner: Neutral + Location: 25,108 + Actor157: tc01.husk + Owner: Neutral + Location: 171,70 + Actor159: t14 + Owner: Neutral + Location: 189,65 + Actor160: t14 + Owner: Neutral + Location: 27,51 + Actor165: t11 + Owner: Neutral + Location: 189,88 + Actor167: t11 + Owner: Neutral + Location: 59,107 + Actor168: t11 + Owner: Neutral + Location: 169,69 + Actor170: t15 + Owner: Neutral + Location: 173,79 + Actor171: t15 + Owner: Neutral + Location: 100,139 + Actor174: t15 + Owner: Neutral + Location: 88,108 + Actor183: t11 + Owner: Neutral + Location: 24,125 + Actor187: tc01 + Owner: Neutral + Location: 168,77 + Actor192: t14 + Owner: Neutral + Location: 85,106 + Actor194: t15 + Owner: Neutral + Location: 53,120 + Actor200: t11 + Owner: Neutral + Location: 47,128 + Actor203: tc01.husk + Owner: Neutral + Location: 101,142 + Actor204: t10 + Owner: Neutral + Location: 149,113 + Actor207: t11 + Owner: Neutral + Location: 119,90 + Actor208: t11 + Owner: Neutral + Location: 74,113 + Actor210: t14 + Owner: Neutral + Location: 188,70 + Actor215: t11 + Owner: Neutral + Location: 50,123 + Actor216: t14.husk + Owner: Neutral + Location: 188,74 + Actor217: t15 + Owner: Neutral + Location: 159,1 + Actor219: tc01 + Owner: Neutral + Location: 68,98 + Actor221: tc01 + Owner: Neutral + Location: 108,141 + Actor223: t14 + Owner: Neutral + Location: 30,24 + Actor232: t15 + Owner: Neutral + Location: 169,7 + Actor233: t15 + Owner: Neutral + Location: 172,71 + Actor235: t15 + Owner: Neutral + Location: 3,144 + Actor236: tc01 + Owner: Neutral + Location: 55,95 + Actor239: t11 + Owner: Neutral + Location: 77,95 + Actor242: t10 + Owner: Neutral + Location: 102,143 + Actor243: t11 + Owner: Neutral + Location: 145,33 + Actor244: tc01 + Owner: Neutral + Location: 173,69 + Actor245: t11.husk + Owner: Neutral + Location: 107,136 + Actor247: t11 + Owner: Neutral + Location: 56,108 + Actor249: tc01 + Owner: Neutral + Location: 173,75 + Actor251: t15.husk + Owner: Neutral + Location: 189,27 + Actor252: t14 + Owner: Neutral + Location: 151,31 + Actor253: t15 + Owner: Neutral + Location: 86,130 + Actor258: t14 + Owner: Neutral + Location: 87,127 + Actor262: t11 + Owner: Neutral + Location: 176,74 + Actor265: t15 + Owner: Neutral + Location: 23,124 + Actor267: t14 + Owner: Neutral + Location: 88,132 + Actor269: t14 + Owner: Neutral + Location: 187,87 + Actor270: t10 + Owner: Neutral + Location: 81,96 + Actor272: t10 + Owner: Neutral + Location: 25,65 + Actor273: t15 + Owner: Neutral + Location: 15,39 + Actor274: t15.husk + Owner: Neutral + Location: 15,123 + Actor277: t11 + Owner: Neutral + Location: 68,101 + Actor278: t10 + Owner: Neutral + Location: 49,143 + Actor279: t15 + Owner: Neutral + Location: 189,23 + Actor283: t15 + Owner: Neutral + Location: 189,112 + Actor286: t11 + Owner: Neutral + Location: 191,73 + Actor289: t11 + Owner: Neutral + Location: 16,71 + Actor294: t14 + Owner: Neutral + Location: 46,125 + Actor295: t14 + Owner: Neutral + Location: 69,104 + Actor301: t15 + Owner: Neutral + Location: 28,62 + Actor303: t10.husk + Owner: Neutral + Location: 172,66 + Actor305: t14 + Owner: Neutral + Location: 148,112 + Actor307: t14 + Owner: Neutral + Location: 158,2 + Actor312: tc01 + Owner: Neutral + Location: 0,143 + Actor313: t11 + Owner: Neutral + Location: 53,123 + Actor317: t10 + Owner: Neutral + Location: 74,97 + Actor319: t11 + Owner: Neutral + Location: 155,2 + Actor321: tc01 + Owner: Neutral + Location: 23,123 + Actor324: t10 + Owner: Neutral + Location: 69,97 + Actor326: tc01 + Owner: Neutral + Location: 12,42 + Actor327: t14.husk + Owner: Neutral + Location: 0,92 + Actor328: t11 + Owner: Neutral + Location: 190,37 + Actor334: t15.husk + Owner: Neutral + Location: 175,72 + Actor337: t11 + Owner: Neutral + Location: 192,123 + Actor340: t14 + Owner: Neutral + Location: 2,138 + Actor342: t10 + Owner: Neutral + Location: 103,137 + Actor347: t11 + Owner: Neutral + Location: 16,44 + Actor348: t11 + Owner: Neutral + Location: 157,3 + Actor350: t10 + Owner: Neutral + Location: 13,116 + Actor354: t15 + Owner: Neutral + Location: 26,50 + Actor357: t14 + Owner: Neutral + Location: 99,143 + Actor362: t10 + Owner: Neutral + Location: 53,97 + Actor364: t10 + Owner: Neutral + Location: 47,126 + Actor365: t15 + Owner: Neutral + Location: 81,99 + Actor373: t11 + Owner: Neutral + Location: 29,31 + Actor374: t14 + Owner: Neutral + Location: 179,42 + Actor375: t14 + Owner: Neutral + Location: 77,94 + Actor376: tc01.husk + Owner: Neutral + Location: 46,129 + Actor378: t15 + Owner: Neutral + Location: 1,61 + Actor379: t14 + Owner: Neutral + Location: 191,39 + Actor383: t10.husk + Owner: Neutral + Location: 191,85 + Actor384: t11 + Owner: Neutral + Location: 192,20 + Actor385: t15 + Owner: Neutral + Location: 176,43 + Actor386: t14 + Owner: Neutral + Location: 75,96 + Actor387: tc01 + Owner: Neutral + Location: 12,45 + Actor388: tc01 + Owner: Neutral + Location: 190,3 + Actor389: tc01 + Owner: Neutral + Location: 107,138 + Actor390: t10 + Owner: Neutral + Location: 14,141 + Actor396: t10 + Owner: Neutral + Location: 139,33 + Actor399: t15.husk + Owner: Neutral + Location: 165,77 + Actor403: tc01 + Owner: Neutral + Location: 86,129 + Actor404: t10 + Owner: Neutral + Location: 191,117 + Actor405: t14 + Owner: Neutral + Location: 191,78 + Actor406: tc01.husk + Owner: Neutral + Location: 189,77 + Actor407: tc01 + Owner: Neutral + Location: 174,74 + Actor410: tc01 + Owner: Neutral + Location: 171,69 + Actor412: t14 + Owner: Neutral + Location: 46,95 + Actor413: t11 + Owner: Neutral + Location: 169,5 + Actor414: t15 + Owner: Neutral + Location: 26,47 + Actor415: t10 + Owner: Neutral + Location: 119,85 + Actor417: t12 + Owner: Neutral + Location: 83,98 + Actor419: t07 + Owner: Neutral + Location: 87,110 + Actor420: t17 + Owner: Neutral + Location: 103,142 + Actor421: t07 + Owner: Neutral + Location: 190,38 + Actor422: t07 + Owner: Neutral + Location: 155,41 + Actor425: t06 + Owner: Neutral + Location: 112,138 + Actor426: t13 + Owner: Neutral + Location: 126,91 + Actor427: t06 + Owner: Neutral + Location: 80,139 + Actor428: t02.husk + Owner: Neutral + Location: 60,106 + Actor430: t01 + Owner: Neutral + Location: 178,42 + Actor431: t12 + Owner: Neutral + Location: 179,40 + Actor433: t05 + Owner: Neutral + Location: 31,61 + Actor434: t13 + Owner: Neutral + Location: 191,71 + Actor436: t17 + Owner: Neutral + Location: 191,1 + Actor437: t13 + Owner: Neutral + Location: 0,56 + Actor438: t01 + Owner: Neutral + Location: 190,71 + Actor439: t12 + Owner: Neutral + Location: 192,66 + Actor440: t05 + Owner: Neutral + Location: 26,59 + Actor443: t01 + Owner: Neutral + Location: 70,106 + Actor445: t13.husk + Owner: Neutral + Location: 187,74 + Actor446: t17 + Owner: Neutral + Location: 163,70 + Actor448: t07 + Owner: Neutral + Location: 186,83 + Actor449: t13 + Owner: Neutral + Location: 26,67 + Actor460: t03 + Owner: Neutral + Location: 1,141 + Actor463: t05 + Owner: Neutral + Location: 120,93 + Actor464: t16 + Owner: Neutral + Location: 27,53 + Actor469: t01 + Owner: Neutral + Location: 192,37 + Actor472: t05 + Owner: Neutral + Location: 29,25 + Actor473: t07 + Owner: Neutral + Location: 190,35 + Actor474: t03.husk + Owner: Neutral + Location: 147,31 + Actor475: t17 + Owner: Neutral + Location: 8,26 + Actor479: t01.husk + Owner: Neutral + Location: 104,142 + Actor480: t13 + Owner: Neutral + Location: 59,116 + Actor481: t02 + Owner: Neutral + Location: 2,141 + Actor482: t07 + Owner: Neutral + Location: 48,125 + Actor488: t07.husk + Owner: Neutral + Location: 74,103 + Actor489: t05 + Owner: Neutral + Location: 1,55 + Actor493: t16 + Owner: Neutral + Location: 117,83 + Actor494: t02 + Owner: Neutral + Location: 188,69 + Actor496: t06 + Owner: Neutral + Location: 191,29 + Actor499: t07 + Owner: Neutral + Location: 103,138 + Actor500: t05 + Owner: Neutral + Location: 148,30 + Actor502: t02 + Owner: Neutral + Location: 53,99 + Actor503: t07 + Owner: Neutral + Location: 54,118 + Actor507: t02.husk + Owner: Neutral + Location: 27,61 + Actor508: t05 + Owner: Neutral + Location: 0,144 + Actor509: t13 + Owner: Neutral + Location: 16,36 + Actor510: t13 + Owner: Neutral + Location: 15,117 + Actor515: t01 + Owner: Neutral + Location: 72,99 + Actor519: t12 + Owner: Neutral + Location: 29,26 + Actor521: t01 + Owner: Neutral + Location: 26,135 + Actor522: t02 + Owner: Neutral + Location: 188,24 + Actor531: t05 + Owner: Neutral + Location: 152,2 + Actor536: t03 + Owner: Neutral + Location: 50,126 + Actor537: t12 + Owner: Neutral + Location: 1,32 + Actor538: t13 + Owner: Neutral + Location: 54,119 + Actor539: t05 + Owner: Neutral + Location: 156,6 + Actor540: t05 + Owner: Neutral + Location: 186,87 + Actor541: t13 + Owner: Neutral + Location: 172,72 + Actor544: t16 + Owner: Neutral + Location: 147,111 + Actor547: t05 + Owner: Neutral + Location: 109,144 + Actor550: t13 + Owner: Neutral + Location: 189,80 + Actor551: t08 + Owner: Neutral + Location: 167,81 + Actor552: t17 + Owner: Neutral + Location: 31,116 + Actor554: t07 + Owner: Neutral + Location: 79,93 + Actor555: t06 + Owner: Neutral + Location: 149,32 + Actor556: t05 + Owner: Neutral + Location: 168,73 + Actor557: t17.husk + Owner: Neutral + Location: 49,141 + Actor558: t16 + Owner: Neutral + Location: 15,40 + Actor559: t12 + Owner: Neutral + Location: 82,93 + Actor562: t06 + Owner: Neutral + Location: 156,31 + Actor570: t07 + Owner: Neutral + Location: 54,96 + Actor572: t05 + Owner: Neutral + Location: 191,122 + Actor574: t08 + Owner: Neutral + Location: 18,115 + Actor575: t06 + Owner: Neutral + Location: 2,140 + Actor577: t05 + Owner: Neutral + Location: 56,117 + Actor586: t13 + Owner: Neutral + Location: 122,87 + Actor589: t06 + Owner: Neutral + Location: 2,143 + Actor590: t02 + Owner: Neutral + Location: 0,89 + Actor591: t01 + Owner: Neutral + Location: 191,115 + Actor592: t08 + Owner: Neutral + Location: 51,144 + Actor593: t12 + Owner: Neutral + Location: 88,104 + Actor598: t13 + Owner: Neutral + Location: 87,104 + Actor607: t08 + Owner: Neutral + Location: 53,122 + Actor609: t01 + Owner: Neutral + Location: 71,97 + Actor610: t13 + Owner: Neutral + Location: 165,74 + Actor614: t01 + Owner: Neutral + Location: 189,13 + Actor618: t03 + Owner: Neutral + Location: 43,115 + Actor621: t02 + Owner: Neutral + Location: 190,64 + Actor623: t16.husk + Owner: Neutral + Location: 24,54 + Actor624: t07.husk + Owner: Neutral + Location: 156,1 + Actor625: t07 + Owner: Neutral + Location: 67,98 + Actor627: t13 + Owner: Neutral + Location: 157,4 + Actor629: t07 + Owner: Neutral + Location: 190,121 + Actor630: t05 + Owner: Neutral + Location: 105,141 + Actor631: t08 + Owner: Neutral + Location: 52,100 + Actor632: t16 + Owner: Neutral + Location: 174,43 + Actor633: t01 + Owner: Neutral + Location: 33,51 + Actor636: t17 + Owner: Neutral + Location: 192,0 + Actor637: t03 + Owner: Neutral + Location: 27,60 + Actor638: t05 + Owner: Neutral + Location: 31,27 + Actor642: t12 + Owner: Neutral + Location: 7,25 + Actor644: t12 + Owner: Neutral + Location: 2,38 + Actor649: t17 + Owner: Neutral + Location: 55,118 + Actor650: t01 + Owner: Neutral + Location: 72,96 + Actor651: t13 + Owner: Neutral + Location: 150,2 + Actor652: t13 + Owner: Neutral + Location: 89,109 + Actor654: t13.husk + Owner: Neutral + Location: 118,84 + Actor660: t17 + Owner: Neutral + Location: 20,132 + Actor666: t05 + Owner: Neutral + Location: 76,99 + Actor667: t16 + Owner: Neutral + Location: 59,99 + Actor670: t02 + Owner: Neutral + Location: 15,36 + Actor675: t03 + Owner: Neutral + Location: 105,142 + Actor677: t07 + Owner: Neutral + Location: 29,30 + Actor678: t12.husk + Owner: Neutral + Location: 17,144 + Actor679: t08 + Owner: Neutral + Location: 1,143 + Actor681: t17 + Owner: Neutral + Location: 124,89 + Actor683: t17 + Owner: Neutral + Location: 192,72 + Actor685: t13 + Owner: Neutral + Location: 168,8 + Actor686: t13 + Owner: Neutral + Location: 139,32 + Actor687: t13 + Owner: Neutral + Location: 141,27 + Actor688: t02 + Owner: Neutral + Location: 54,99 + Actor692: t06 + Owner: Neutral + Location: 24,55 + Actor704: t16 + Owner: Neutral + Location: 69,106 + Actor706: t08 + Owner: Neutral + Location: 0,94 + Actor711: t02 + Owner: Neutral + Location: 81,93 + Actor713: t07 + Owner: Neutral + Location: 17,142 + Actor714: t06 + Owner: Neutral + Location: 0,96 + Actor716: t02 + Owner: Neutral + Location: 189,19 + Actor717: t01 + Owner: Neutral + Location: 179,79 + Actor721: t08 + Owner: Neutral + Location: 56,98 + Actor722: t16 + Owner: Neutral + Location: 120,88 + Actor723: t17 + Owner: Neutral + Location: 155,7 + Actor724: t03 + Owner: Neutral + Location: 73,101 + Actor725: t08 + Owner: Neutral + Location: 190,23 + Actor728: t17 + Owner: Neutral + Location: 22,129 + Actor729: t06 + Owner: Neutral + Location: 80,140 + Actor731: t13.husk + Owner: Neutral + Location: 30,25 + Actor732: t16.husk + Owner: Neutral + Location: 15,63 + Actor734: t01 + Owner: Neutral + Location: 164,74 + Actor735: t02 + Owner: Neutral + Location: 149,31 + Actor737: t03 + Owner: Neutral + Location: 17,117 + Actor739: t07 + Owner: Neutral + Location: 54,98 + Actor742: t05 + Owner: Neutral + Location: 74,102 + Actor743: t07.husk + Owner: Neutral + Location: 34,52 + Actor744: t06 + Owner: Neutral + Location: 14,88 + Actor745: t05 + Owner: Neutral + Location: 49,95 + Actor747: t17 + Owner: Neutral + Location: 190,74 + Actor748: t17 + Owner: Neutral + Location: 22,131 + Actor750: t12 + Owner: Neutral + Location: 19,127 + Actor756: t03 + Owner: Neutral + Location: 50,94 + Actor757: t03 + Owner: Neutral + Location: 189,72 + Actor758: t08 + Owner: Neutral + Location: 180,42 + Actor759: t02 + Owner: Neutral + Location: 59,112 + Actor763: t08 + Owner: Neutral + Location: 170,79 + Actor765: t07 + Owner: Neutral + Location: 190,84 + Actor767: t05 + Owner: Neutral + Location: 57,109 + Actor768: t07 + Owner: Neutral + Location: 173,72 + Actor772: t05 + Owner: Neutral + Location: 171,44 + Actor773: t05 + Owner: Neutral + Location: 25,63 + Actor778: t05 + Owner: Neutral + Location: 21,129 + Actor780: t06 + Owner: Neutral + Location: 77,97 + Actor781: t12 + Owner: Neutral + Location: 100,144 + Actor782: t07 + Owner: Neutral + Location: 186,71 + Actor787: t03 + Owner: Neutral + Location: 84,129 + Actor792: t05 + Owner: Neutral + Location: 152,112 + Actor794: t16 + Owner: Neutral + Location: 172,8 + Actor796: t16 + Owner: Neutral + Location: 188,32 + Actor800: t12 + Owner: Neutral + Location: 144,29 + Actor801: t01 + Owner: Neutral + Location: 156,41 + Actor804: t08 + Owner: Neutral + Location: 190,118 + Actor805: t06 + Owner: Neutral + Location: 53,98 + Actor807: t16.husk + Owner: Neutral + Location: 89,111 + Actor810: t13 + Owner: Neutral + Location: 189,30 + Actor813: t07 + Owner: Neutral + Location: 57,115 + Actor816: t05.husk + Owner: Neutral + Location: 169,8 + Actor817: t16.husk + Owner: Neutral + Location: 6,141 + Actor819: t13 + Owner: Neutral + Location: 167,71 + Actor820: t03 + Owner: Neutral + Location: 138,30 + Actor821: t07 + Owner: Neutral + Location: 120,86 + Actor823: t13.husk + Owner: Neutral + Location: 82,95 + Actor824: t16 + Owner: Neutral + Location: 2,64 + Actor825: t16 + Owner: Neutral + Location: 25,50 + Actor826: t05.husk + Owner: Neutral + Location: 65,129 + Actor829: t08 + Owner: Neutral + Location: 15,45 + Actor831: t03 + Owner: Neutral + Location: 80,127 + Actor832: t16 + Owner: Neutral + Location: 166,81 + Actor834: t12 + Owner: Neutral + Location: 122,90 + Actor835: t03 + Owner: Neutral + Location: 51,128 + Actor839: t16 + Owner: Neutral + Location: 187,86 + Actor842: t08.husk + Owner: Neutral + Location: 85,106 + Actor845: t03 + Owner: Neutral + Location: 174,71 + Actor847: t02 + Owner: Neutral + Location: 60,110 + Actor849: t01 + Owner: Neutral + Location: 168,10 + Actor851: t16 + Owner: Neutral + Location: 56,114 + Actor852: t13 + Owner: Neutral + Location: 25,55 + Actor853: t16 + Owner: Neutral + Location: 178,43 + Actor857: t12 + Owner: Neutral + Location: 4,141 + Actor858: t12 + Owner: Neutral + Location: 1,34 + Actor859: t06.husk + Owner: Neutral + Location: 1,33 + Actor861: t13 + Owner: Neutral + Location: 3,140 + Actor863: t17 + Owner: Neutral + Location: 80,94 + Actor872: t03 + Owner: Neutral + Location: 59,106 + Actor873: t17 + Owner: Neutral + Location: 161,73 + Actor877: t05 + Owner: Neutral + Location: 190,6 + Actor878: t06.husk + Owner: Neutral + Location: 20,124 + Actor886: t13 + Owner: Neutral + Location: 19,124 + Actor887: t08 + Owner: Neutral + Location: 157,44 + Actor889: t02 + Owner: Neutral + Location: 11,44 + Actor890: t17.husk + Owner: Neutral + Location: 16,37 + Actor892: t13 + Owner: Neutral + Location: 34,51 + Actor893: t05 + Owner: Neutral + Location: 15,124 + Actor897: t07.husk + Owner: Neutral + Location: 31,26 + Actor898: t01.husk + Owner: Neutral + Location: 152,30 + Actor900: t01 + Owner: Neutral + Location: 81,92 + Actor903: t13 + Owner: Neutral + Location: 84,97 + Actor904: t02.husk + Owner: Neutral + Location: 176,41 + Actor906: t06 + Owner: Neutral + Location: 15,47 + Actor907: t05 + Owner: Neutral + Location: 89,107 + Actor908: t05.husk + Owner: Neutral + Location: 108,143 + Actor909: t02 + Owner: Neutral + Location: 14,143 + Actor910: t05 + Owner: Neutral + Location: 102,139 + Actor911: t08 + Owner: Neutral + Location: 160,43 + Actor912: t16 + Owner: Neutral + Location: 15,143 + Actor913: t01 + Owner: Neutral + Location: 7,141 + Actor914: t12 + Owner: Neutral + Location: 190,118 + Actor916: t01 + Owner: Neutral + Location: 154,49 + Actor917: t12 + Owner: Neutral + Location: 170,45 + Actor918: t07 + Owner: Neutral + Location: 168,72 + Actor919: t05 + Owner: Neutral + Location: 74,98 + Actor920: t16 + Owner: Neutral + Location: 169,9 + Actor921: t05 + Owner: Neutral + Location: 85,130 + Actor924: t06 + Owner: Neutral + Location: 15,41 + Actor926: t16 + Owner: Neutral + Location: 18,115 + Actor927: t05 + Owner: Neutral + Location: 81,127 + Actor933: t03 + Owner: Neutral + Location: 30,116 + Actor934: t01 + Owner: Neutral + Location: 85,101 + Actor936: t08 + Owner: Neutral + Location: 172,75 + Actor937: t03.husk + Owner: Neutral + Location: 25,128 + Actor938: t02 + Owner: Neutral + Location: 56,116 + Actor941: t05 + Owner: Neutral + Location: 190,124 + Actor942: t07 + Owner: Neutral + Location: 107,137 + Actor943: t01 + Owner: Neutral + Location: 73,103 + Actor944: t12 + Owner: Neutral + Location: 17,125 + Actor946: t06 + Owner: Neutral + Location: 177,78 + Actor947: t03 + Owner: Neutral + Location: 75,94 + Actor949: t05 + Owner: Neutral + Location: 71,96 + Actor953: t16 + Owner: Neutral + Location: 78,111 + Actor955: t12 + Owner: Neutral + Location: 18,43 + Actor956: t03 + Owner: Neutral + Location: 170,4 + Actor963: t13 + Owner: Neutral + Location: 165,76 + Actor964: t17 + Owner: Neutral + Location: 15,72 + Actor965: t03 + Owner: Neutral + Location: 186,79 + Actor967: t17 + Owner: Neutral + Location: 15,66 + Actor969: t13 + Owner: Neutral + Location: 177,77 + Actor970: t16 + Owner: Neutral + Location: 114,85 + Actor971: t07 + Owner: Neutral + Location: 19,115 + Actor972: t03.husk + Owner: Neutral + Location: 151,4 + Actor973: t01 + Owner: Neutral + Location: 71,99 + Actor974: t03 + Owner: Neutral + Location: 59,111 + Actor975: t13 + Owner: Neutral + Location: 43,120 + Actor980: t05 + Owner: Neutral + Location: 175,77 + Actor985: t07 + Owner: Neutral + Location: 46,126 + Actor987: t03 + Owner: Neutral + Location: 2,88 + Actor988: t12 + Owner: Neutral + Location: 29,111 + Actor989: t17 + Owner: Neutral + Location: 155,6 + Actor992: t17 + Owner: Neutral + Location: 161,45 + Actor993: t01 + Owner: Neutral + Location: 5,143 + Actor995: t05 + Owner: Neutral + Location: 85,108 + Actor998: t06 + Owner: Neutral + Location: 0,87 + Actor1001: t12 + Owner: Neutral + Location: 79,115 + Actor1007: t05 + Owner: Neutral + Location: 155,42 + Actor1009: t13 + Owner: Neutral + Location: 178,39 + Actor1012: t06 + Owner: Neutral + Location: 83,94 + Actor1013: t12.husk + Owner: Neutral + Location: 12,70 + Actor1019: t17 + Owner: Neutral + Location: 152,3 + Actor1020: t06 + Owner: Neutral + Location: 172,77 + Actor1021: t06 + Owner: Neutral + Location: 21,128 + Actor1024: t07 + Owner: Neutral + Location: 154,52 + Actor1030: t13 + Owner: Neutral + Location: 101,138 + Actor1033: t17 + Owner: Neutral + Location: 15,116 + Actor1034: t12 + Owner: Neutral + Location: 13,87 + Actor1038: t05 + Owner: Neutral + Location: 85,107 + Actor1041: t05 + Owner: Neutral + Location: 176,81 + Actor1044: t01 + Owner: Neutral + Location: 1,87 + Actor1045: t13.husk + Owner: Neutral + Location: 152,48 + Actor1047: t06 + Owner: Neutral + Location: 20,126 + Actor1053: t03 + Owner: Neutral + Location: 101,144 + Actor1054: t17 + Owner: Neutral + Location: 76,112 + Actor1055: t02 + Owner: Neutral + Location: 80,98 + Actor1057: t16 + Owner: Neutral + Location: 26,55 + Actor1059: t17 + Owner: Neutral + Location: 49,126 + Actor1061: t13 + Owner: Neutral + Location: 191,114 + Actor1065: t05 + Owner: Neutral + Location: 55,117 + Actor1066: t13.husk + Owner: Neutral + Location: 22,120 + Actor1067: t12 + Owner: Neutral + Location: 90,108 + Actor1068: t01 + Owner: Neutral + Location: 173,68 + Actor1069: t05 + Owner: Neutral + Location: 78,99 + Actor1073: t01 + Owner: Neutral + Location: 14,46 + Actor1075: t03 + Owner: Neutral + Location: 117,84 + Actor1078: t13 + Owner: Neutral + Location: 83,139 + Actor1080: t03 + Owner: Neutral + Location: 161,0 + Actor1083: t13 + Owner: Neutral + Location: 87,105 + Actor1087: t16 + Owner: Neutral + Location: 125,94 + Actor1090: t16 + Owner: Neutral + Location: 72,98 + Actor1093: t06 + Owner: Neutral + Location: 12,44 + Actor1094: t02 + Owner: Neutral + Location: 164,77 + Actor1096: t13 + Owner: Neutral + Location: 106,137 + Actor1099: t06 + Owner: Neutral + Location: 118,87 + Actor1101: t06 + Owner: Neutral + Location: 172,73 + Actor1109: t06 + Owner: Neutral + Location: 1,139 + Actor1110: t02 + Owner: Neutral + Location: 1,56 + Actor1111: t05 + Owner: Neutral + Location: 192,36 + Actor1112: t08 + Owner: Neutral + Location: 49,128 + Actor1116: t13 + Owner: Neutral + Location: 18,121 + Actor1117: t01 + Owner: Neutral + Location: 0,142 + Actor1118: t01.husk + Owner: Neutral + Location: 86,110 + Actor1122: t13 + Owner: Neutral + Location: 2,84 + Actor1125: t01 + Owner: Neutral + Location: 15,126 + Actor1127: t01.husk + Owner: Neutral + Location: 74,99 + Actor1129: t03 + Owner: Neutral + Location: 116,89 + Actor1132: t08 + Owner: Neutral + Location: 192,123 + Actor1133: t06 + Owner: Neutral + Location: 26,109 + Actor1136: t01 + Owner: Neutral + Location: 70,98 + Actor1137: t06 + Owner: Neutral + Location: 52,123 + Actor1140: t08 + Owner: Neutral + Location: 3,135 + Actor1143: t03 + Owner: Neutral + Location: 23,122 + Actor1144: t12 + Owner: Neutral + Location: 55,121 + Actor1147: t12 + Owner: Neutral + Location: 15,42 + Actor1148: t01 + Owner: Neutral + Location: 175,78 + Actor1149: t06.husk + Owner: Neutral + Location: 171,78 + Actor1151: t02 + Owner: Neutral + Location: 30,22 + Actor1154: t17 + Owner: Neutral + Location: 191,120 + Actor1156: t03 + Owner: Neutral + Location: 192,24 + Actor1163: t02 + Owner: Neutral + Location: 53,122 + Actor1165: t06.husk + Owner: Neutral + Location: 29,60 + Actor1168: t17 + Owner: Neutral + Location: 176,83 + Actor1170: t07 + Owner: Neutral + Location: 123,92 + Actor1171: t03 + Owner: Neutral + Location: 25,61 + Actor1173: t16.husk + Owner: Neutral + Location: 148,113 + Actor1174: t16 + Owner: Neutral + Location: 84,139 + Actor1175: t13 + Owner: Neutral + Location: 192,125 + Actor1177: t06 + Owner: Neutral + Location: 110,142 + Actor1179: t02 + Owner: Neutral + Location: 2,63 + Actor1182: t07 + Owner: Neutral + Location: 155,5 + Actor1183: t08 + Owner: Neutral + Location: 189,22 + Actor1186: t03 + Owner: Neutral + Location: 25,124 + Actor1187: t13 + Owner: Neutral + Location: 16,124 + Actor1188: t05 + Owner: Neutral + Location: 75,112 + Actor1189: t16.husk + Owner: Neutral + Location: 58,114 + Actor1198: t01 + Owner: Neutral + Location: 15,37 + Actor1199: t16 + Owner: Neutral + Location: 80,128 + Actor1202: t12 + Owner: Neutral + Location: 52,124 + Actor1204: t17 + Owner: Neutral + Location: 178,38 + Actor1205: t05 + Owner: Neutral + Location: 25,56 + Actor1206: t01 + Owner: Neutral + Location: 52,140 + Actor1207: t02 + Owner: Neutral + Location: 78,113 + Actor1208: t17 + Owner: Neutral + Location: 0,139 + Actor1209: t05 + Owner: Neutral + Location: 16,68 + Actor1214: t08 + Owner: Neutral + Location: 190,22 + Actor1216: t06 + Owner: Neutral + Location: 17,143 + Actor1217: t12 + Owner: Neutral + Location: 124,94 + Actor1221: t02 + Owner: Neutral + Location: 14,123 + Actor1222: t16 + Owner: Neutral + Location: 88,128 + Actor1223: t06 + Owner: Neutral + Location: 107,141 + Actor1225: t12 + Owner: Neutral + Location: 26,53 + Actor1226: t05 + Owner: Neutral + Location: 26,60 + Actor1227: t07 + Owner: Neutral + Location: 161,74 + Actor1228: t01 + Owner: Neutral + Location: 59,114 + Actor1231: t08 + Owner: Neutral + Location: 191,39 + Actor1236: t07 + Owner: Neutral + Location: 189,31 + Actor1238: t12 + Owner: Neutral + Location: 26,48 + Actor1239: t17 + Owner: Neutral + Location: 189,18 + Actor1240: t13 + Owner: Neutral + Location: 73,98 + Actor1243: t01 + Owner: Neutral + Location: 26,56 + Actor1245: t07 + Owner: Neutral + Location: 145,29 + Actor1246: t05 + Owner: Neutral + Location: 57,113 + Actor1247: t06 + Owner: Neutral + Location: 31,117 + Actor1248: t03 + Owner: Neutral + Location: 178,72 + Actor1249: t08 + Owner: Neutral + Location: 20,134 + Actor1250: t05 + Owner: Neutral + Location: 83,96 + Actor1252: t05 + Owner: Neutral + Location: 17,114 + Actor1256: t16 + Owner: Neutral + Location: 24,53 + Actor1257: t16 + Owner: Neutral + Location: 172,45 + Actor1258: t12 + Owner: Neutral + Location: 115,82 + Actor1259: t12 + Owner: Neutral + Location: 59,104 + Actor1264: t05 + Owner: Neutral + Location: 50,127 + Actor1266: t03 + Owner: Neutral + Location: 99,139 + Actor1268: t05 + Owner: Neutral + Location: 1,84 + Actor1270: t06 + Owner: Neutral + Location: 186,84 + Actor1271: t07 + Owner: Neutral + Location: 86,126 + Actor1272: t12 + Owner: Neutral + Location: 56,113 + Actor1275: t01 + Owner: Neutral + Location: 190,73 + Actor1276: t12 + Owner: Neutral + Location: 59,110 + Actor1279: t16 + Owner: Neutral + Location: 150,34 + Actor1280: t01 + Owner: Neutral + Location: 147,32 + Actor1281: t13 + Owner: Neutral + Location: 55,99 + Actor1283: t17 + Owner: Neutral + Location: 20,125 + Actor1285: t05 + Owner: Neutral + Location: 8,140 + Actor1288: t17 + Owner: Neutral + Location: 78,112 + Actor1290: t06 + Owner: Neutral + Location: 189,32 + Actor1292: t03 + Owner: Neutral + Location: 150,112 + Actor1293: t16 + Owner: Neutral + Location: 155,9 + Actor1294: t12 + Owner: Neutral + Location: 154,31 + Actor1295: t01 + Owner: Neutral + Location: 191,26 + Actor1296: t13 + Owner: Neutral + Location: 49,125 + Actor1300: t01 + Owner: Neutral + Location: 8,25 + Actor1303: t08 + Owner: Neutral + Location: 25,50 + Actor1306: t08 + Owner: Neutral + Location: 150,116 + Actor1310: t02.husk + Owner: Neutral + Location: 83,95 + Actor1313: t03 + Owner: Neutral + Location: 57,114 + Actor1314: t17 + Owner: Neutral + Location: 81,140 + Actor1315: t08 + Owner: Neutral + Location: 32,117 + Actor1318: t03 + Owner: Neutral + Location: 155,31 + Actor1319: t07 + Owner: Neutral + Location: 86,128 + Actor1320: t03 + Owner: Neutral + Location: 84,103 + Actor1327: t01 + Owner: Neutral + Location: 122,88 + Actor1328: t17 + Owner: Neutral + Location: 0,88 + Actor1329: t05 + Owner: Neutral + Location: 48,129 + Actor1330: t06 + Owner: Neutral + Location: 89,105 + Actor1332: t05 + Owner: Neutral + Location: 20,131 + Actor1333: t08 + Owner: Neutral + Location: 104,137 + Actor1335: t12 + Owner: Neutral + Location: 25,135 + Actor1336: t12 + Owner: Neutral + Location: 51,121 + Actor1338: t01 + Owner: Neutral + Location: 50,130 + Actor1339: t07 + Owner: Neutral + Location: 100,138 + Actor1342: t06 + Owner: Neutral + Location: 144,32 + Actor1345: t08 + Owner: Neutral + Location: 25,134 + Actor1347: t01 + Owner: Neutral + Location: 1,60 + Actor1351: t07 + Owner: Neutral + Location: 48,95 + Actor1353: t13 + Owner: Neutral + Location: 55,107 + Actor1355: t16 + Owner: Neutral + Location: 141,28 + Actor1356: t17 + Owner: Neutral + Location: 191,23 + Actor1357: t16 + Owner: Neutral + Location: 18,127 + Actor1358: t13 + Owner: Neutral + Location: 192,32 + Actor1360: t13 + Owner: Neutral + Location: 13,36 + Actor1362: t03 + Owner: Neutral + Location: 109,140 + Actor1365: t07 + Owner: Neutral + Location: 12,46 + Actor1366: t01 + Owner: Neutral + Location: 178,41 + Actor1367: t02 + Owner: Neutral + Location: 43,116 + Actor1370: t17 + Owner: Neutral + Location: 1,35 + Actor1371: t03 + Owner: Neutral + Location: 192,2 + Actor1373: t01 + Owner: Neutral + Location: 190,115 + Actor1375: t13 + Owner: Neutral + Location: 56,119 + Actor1376: t13 + Owner: Neutral + Location: 170,77 + Actor1377: t16 + Owner: Neutral + Location: 58,116 + Actor1379: t16 + Owner: Neutral + Location: 77,93 + Actor1380: t03 + Owner: Neutral + Location: 191,65 + Actor1381: t08 + Owner: Neutral + Location: 192,30 + Actor1382: t12 + Owner: Neutral + Location: 68,106 + Actor1383: t16 + Owner: Neutral + Location: 110,144 + Actor1384: t07 + Owner: Neutral + Location: 190,66 + Actor1386: t08 + Owner: Neutral + Location: 137,30 + Actor1389: t16 + Owner: Neutral + Location: 13,46 + Actor1391: t12 + Owner: Neutral + Location: 25,126 + Actor1392: t03.husk + Owner: Neutral + Location: 152,113 + Actor1393: t07 + Owner: Neutral + Location: 170,75 + Actor1394: t01 + Owner: Neutral + Location: 16,144 + Actor1397: t16 + Owner: Neutral + Location: 82,94 + Actor1398: t02 + Owner: Neutral + Location: 11,70 + Actor1399: t02 + Owner: Neutral + Location: 73,100 + Actor1400: t03 + Owner: Neutral + Location: 29,24 + Actor1402: t13 + Owner: Neutral + Location: 72,101 + Actor1404: t01 + Owner: Neutral + Location: 16,112 + Actor1407: t16 + Owner: Neutral + Location: 3,35 + Actor1416: t17 + Owner: Neutral + Location: 52,126 + Actor1418: t06 + Owner: Neutral + Location: 88,129 + Actor1423: t03 + Owner: Neutral + Location: 143,29 + Actor1427: t05 + Owner: Neutral + Location: 176,78 + Actor1428: t16 + Owner: Neutral + Location: 74,96 + Actor1430: t13 + Owner: Neutral + Location: 190,24 + Actor1432: t05 + Owner: Neutral + Location: 15,115 + Actor1439: t07 + Owner: Neutral + Location: 109,139 + Actor1440: t12 + Owner: Neutral + Location: 57,111 + Actor1442: t03 + Owner: Neutral + Location: 158,41 + Actor1443: t01 + Owner: Neutral + Location: 1,88 + Actor1444: t06 + Owner: Neutral + Location: 191,35 + Actor1445: t06 + Owner: Neutral + Location: 162,76 + Actor1446: t01 + Owner: Neutral + Location: 147,33 + Actor1451: t03.husk + Owner: Neutral + Location: 170,43 + Actor1454: t03 + Owner: Neutral + Location: 53,124 + Actor1458: t17.husk + Owner: Neutral + Location: 16,113 + Actor1459: t05 + Owner: Neutral + Location: 80,125 + Actor1461: t12 + Owner: Neutral + Location: 45,125 + Actor1462: t05 + Owner: Neutral + Location: 189,73 + Actor1464: t16 + Owner: Neutral + Location: 106,135 + Actor1465: t16 + Owner: Neutral + Location: 191,2 + Actor1467: t06 + Owner: Neutral + Location: 139,29 + Actor1468: t06 + Owner: Neutral + Location: 24,133 + Actor1469: t16 + Owner: Neutral + Location: 32,22 + Actor1471: t02 + Owner: Neutral + Location: 190,10 + Actor1473: t13 + Owner: Neutral + Location: 20,130 + Actor1474: t02 + Owner: Neutral + Location: 175,70 + Actor1475: t01 + Owner: Neutral + Location: 141,32 + Actor1479: t05 + Owner: Neutral + Location: 28,24 + Actor1480: t06.husk + Owner: Neutral + Location: 178,76 + Actor1481: t12 + Owner: Neutral + Location: 189,71 + Actor1485: t08 + Owner: Neutral + Location: 191,25 + Actor1486: t12 + Owner: Neutral + Location: 177,81 + Actor1488: t08 + Owner: Neutral + Location: 192,112 + Actor1491: t06 + Owner: Neutral + Location: 13,144 + Actor1494: t05 + Owner: Neutral + Location: 16,65 + Actor1495: t08 + Owner: Neutral + Location: 177,38 + Actor1496: t05 + Owner: Neutral + Location: 50,138 + Actor1508: t13 + Owner: Neutral + Location: 59,115 + Actor1510: t07.husk + Owner: Neutral + Location: 106,139 + Actor1511: t05 + Owner: Neutral + Location: 77,99 + Actor1512: t02 + Owner: Neutral + Location: 52,98 + Actor1513: t13 + Owner: Neutral + Location: 49,96 + Actor1515: t17 + Owner: Neutral + Location: 14,115 + Actor1517: t17 + Owner: Neutral + Location: 149,116 + Actor1520: t17 + Owner: Neutral + Location: 113,137 + Actor1521: t07 + Owner: Neutral + Location: 163,79 + Actor1522: t16 + Owner: Neutral + Location: 57,119 + Actor1523: t01 + Owner: Neutral + Location: 1,86 + Actor1526: t06 + Owner: Neutral + Location: 174,81 + Actor1530: t03 + Owner: Neutral + Location: 140,30 + Actor1531: t13 + Owner: Neutral + Location: 85,104 + Actor1533: t12 + Owner: Neutral + Location: 162,75 + Actor1540: t12 + Owner: Neutral + Location: 142,33 + Actor1544: t17 + Owner: Neutral + Location: 59,105 + Actor1547: t05 + Owner: Neutral + Location: 191,31 + Actor1549: t13 + Owner: Neutral + Location: 107,144 + Actor1551: t02 + Owner: Neutral + Location: 121,85 + Actor1552: t06 + Owner: Neutral + Location: 149,117 + Actor1553: t17 + Owner: Neutral + Location: 18,142 + Actor1556: t13 + Owner: Neutral + Location: 138,28 + Actor1557: t01 + Owner: Neutral + Location: 170,70 + Actor1558: t16 + Owner: Neutral + Location: 3,36 + Actor1560: t01.husk + Owner: Neutral + Location: 189,79 + Actor1562: t16 + Owner: Neutral + Location: 175,40 + Actor1566: t07 + Owner: Neutral + Location: 16,125 + Actor1567: t03 + Owner: Neutral + Location: 10,26 + Actor1570: t02 + Owner: Neutral + Location: 171,10 + Actor1573: t13.husk + Owner: Neutral + Location: 106,141 + Actor1574: t01 + Owner: Neutral + Location: 23,131 + Actor1575: t16 + Owner: Neutral + Location: 179,80 + Actor1576: t16 + Owner: Neutral + Location: 124,87 + Actor1577: t05 + Owner: Neutral + Location: 189,69 + Actor1578: t08 + Owner: Neutral + Location: 78,94 + Actor1580: t02.husk + Owner: Neutral + Location: 168,6 + Actor1581: t03 + Owner: Neutral + Location: 62,53 + Actor1583: t03 + Owner: Neutral + Location: 190,1 + Actor1591: t05 + Owner: Neutral + Location: 156,64 + Actor1594: t01 + Owner: Neutral + Location: 51,125 + Actor1598: t17 + Owner: Neutral + Location: 18,69 + Actor1599: t16 + Owner: Neutral + Location: 28,29 + Actor1600: t07 + Owner: Neutral + Location: 111,137 + Actor1603: t12 + Owner: Neutral + Location: 10,27 + Actor1604: t07.husk + Owner: Neutral + Location: 192,38 + Actor1606: t17 + Owner: Neutral + Location: 8,141 + Actor1609: t02 + Owner: Neutral + Location: 188,25 + Actor1610: t07 + Owner: Neutral + Location: 66,52 + Actor1611: t01 + Owner: Neutral + Location: 15,68 + Actor1613: t02 + Owner: Neutral + Location: 81,94 + Actor1614: t07 + Owner: Neutral + Location: 140,28 + Actor1615: t03 + Owner: Neutral + Location: 172,44 + Actor1620: t13 + Owner: Neutral + Location: 151,117 + Actor1623: t16 + Owner: Neutral + Location: 189,26 + Actor1624: t02 + Owner: Neutral + Location: 56,107 + Actor1625: t01 + Owner: Neutral + Location: 23,134 + Actor1626: t01 + Owner: Neutral + Location: 151,33 + Actor1627: t16.husk + Owner: Neutral + Location: 16,66 + Actor1628: t05 + Owner: Neutral + Location: 74,105 + Actor1631: t03 + Owner: Neutral + Location: 82,141 + Actor1635: t03 + Owner: Neutral + Location: 109,134 + Actor1638: t03 + Owner: Neutral + Location: 192,23 + Actor1641: t06 + Owner: Neutral + Location: 81,97 + Actor1644: t06 + Owner: Neutral + Location: 2,59 + Actor1646: t03 + Owner: Neutral + Location: 28,61 + Actor1648: t01 + Owner: Neutral + Location: 3,143 + Actor1649: t05 + Owner: Neutral + Location: 191,79 + Actor1650: t17 + Owner: Neutral + Location: 81,141 + Actor1651: t13 + Owner: Neutral + Location: 23,121 + Actor1654: t08 + Owner: Neutral + Location: 192,127 + Actor1655: t12 + Owner: Neutral + Location: 55,116 + Actor1659: t02 + Owner: Neutral + Location: 18,124 + Actor1660: t12 + Owner: Neutral + Location: 84,141 + Actor1663: t05 + Owner: Neutral + Location: 51,98 + Actor1664: t12 + Owner: Neutral + Location: 52,143 + Actor1666: t06 + Owner: Neutral + Location: 1,89 + Actor1668: t02 + Owner: Neutral + Location: 192,19 + Actor1670: t17.husk + Owner: Neutral + Location: 159,40 + Actor1674: t03 + Owner: Neutral + Location: 190,82 + Actor1675: t16 + Owner: Neutral + Location: 15,144 + Actor1677: t06 + Owner: Neutral + Location: 81,91 + Actor1678: t13 + Owner: Neutral + Location: 154,47 + Actor1679: t06 + Owner: Neutral + Location: 117,86 + Actor1680: t13 + Owner: Neutral + Location: 152,114 + Actor1681: t17 + Owner: Neutral + Location: 15,125 + Actor1684: t02 + Owner: Neutral + Location: 65,44 + Actor1685: t01 + Owner: Neutral + Location: 191,21 + Actor1686: t13 + Owner: Neutral + Location: 22,130 + Actor1687: t17 + Owner: Neutral + Location: 1,70 + Actor1688: t01 + Owner: Neutral + Location: 44,144 + Actor1689: t03 + Owner: Neutral + Location: 190,79 + Actor1690: t03 + Owner: Neutral + Location: 192,31 + Actor1693: t08 + Owner: Neutral + Location: 17,124 + Actor1694: t06 + Owner: Neutral + Location: 58,111 + Actor1695: t12 + Owner: Neutral + Location: 151,112 + Actor1696: t17.husk + Owner: Neutral + Location: 191,30 + Actor1697: t12.husk + Owner: Neutral + Location: 154,3 + Actor1698: t16.husk + Owner: Neutral + Location: 71,103 + Actor1700: t03.husk + Owner: Neutral + Location: 79,99 + Actor1701: t06 + Owner: Neutral + Location: 150,32 + Actor1703: t07.husk + Owner: Neutral + Location: 53,140 + Actor1704: t07 + Owner: Neutral + Location: 51,122 + Actor1706: t17 + Owner: Neutral + Location: 157,5 + Actor1711: t06 + Owner: Neutral + Location: 141,33 + Actor1712: t08 + Owner: Neutral + Location: 58,118 + Actor1713: t08 + Owner: Neutral + Location: 14,143 + Actor1714: t13 + Owner: Neutral + Location: 49,140 + Actor1715: t08 + Owner: Neutral + Location: 168,10 + Actor1720: t16 + Owner: Neutral + Location: 27,109 + Actor1722: t02 + Owner: Neutral + Location: 89,106 + Actor1723: t16 + Owner: Neutral + Location: 83,142 + Actor1726: t16 + Owner: Neutral + Location: 106,136 + Actor1730: t16 + Owner: Neutral + Location: 65,45 + Actor1732: t17 + Owner: Neutral + Location: 192,115 + Actor1733: t13 + Owner: Neutral + Location: 106,142 + Actor1734: t12 + Owner: Neutral + Location: 16,67 + Actor1735: t07.husk + Owner: Neutral + Location: 50,128 + Actor1737: t08 + Owner: Neutral + Location: 13,45 + Actor1743: t17 + Owner: Neutral + Location: 106,138 + Actor1744: t12 + Owner: Neutral + Location: 49,138 + Actor1745: t13 + Owner: Neutral + Location: 171,75 + Actor1747: t05.husk + Owner: Neutral + Location: 55,98 + Actor1749: t16 + Owner: Neutral + Location: 189,36 + Actor1751: t06 + Owner: Neutral + Location: 173,70 + Actor1755: t05 + Owner: Neutral + Location: 14,71 + Actor1757: t01 + Owner: Neutral + Location: 28,109 + Actor1759: t08 + Owner: Neutral + Location: 148,115 + Actor1760: t03 + Owner: Neutral + Location: 143,32 + Actor1761: t01 + Owner: Neutral + Location: 1,63 + Actor1762: t03 + Owner: Neutral + Location: 15,65 + Actor1763: t03 + Owner: Neutral + Location: 177,41 + Actor1765: t06 + Owner: Neutral + Location: 28,63 + Actor1766: t07 + Owner: Neutral + Location: 107,143 + Actor1768: t01 + Owner: Neutral + Location: 31,62 + Actor1771: t13 + Owner: Neutral + Location: 26,51 + Actor1774: t13 + Owner: Neutral + Location: 142,29 + Actor1777: t02 + Owner: Neutral + Location: 18,117 + Actor1782: t17 + Owner: Neutral + Location: 57,112 + Actor1783: t06 + Owner: Neutral + Location: 111,136 + Actor1784: t06 + Owner: Neutral + Location: 88,110 + Actor1786: t01 + Owner: Neutral + Location: 63,52 + Actor1796: t12 + Owner: Neutral + Location: 107,135 + Actor1797: t05 + Owner: Neutral + Location: 88,103 + Actor1800: t06 + Owner: Neutral + Location: 110,143 + Actor1802: t13 + Owner: Neutral + Location: 174,78 + Actor1806: t05 + Owner: Neutral + Location: 51,127 + Actor1807: t13.husk + Owner: Neutral + Location: 124,88 + Actor1813: t05 + Owner: Neutral + Location: 62,144 + Actor1814: t01 + Owner: Neutral + Location: 50,129 + Actor1815: t13 + Owner: Neutral + Location: 171,8 + Actor1816: t05 + Owner: Neutral + Location: 73,114 + Actor1817: t16 + Owner: Neutral + Location: 16,141 + Actor1819: t03 + Owner: Neutral + Location: 114,137 + Actor1820: t07 + Owner: Neutral + Location: 177,39 + Actor1824: t03 + Owner: Neutral + Location: 79,98 + Actor1828: t05 + Owner: Neutral + Location: 190,67 + Actor1831: t17 + Owner: Neutral + Location: 5,141 + Actor1835: t17 + Owner: Neutral + Location: 167,77 + Actor1836: t17 + Owner: Neutral + Location: 0,141 + Actor1837: t06 + Owner: Neutral + Location: 60,99 + Actor1838: t12 + Owner: Neutral + Location: 189,22 + Actor1842: t08 + Owner: Neutral + Location: 73,103 + Actor1843: t05 + Owner: Neutral + Location: 87,111 + Actor1844: t02.husk + Owner: Neutral + Location: 171,4 + Actor1849: t02 + Owner: Neutral + Location: 177,80 + Actor1850: t01 + Owner: Neutral + Location: 165,69 + Actor1851: t05 + Owner: Neutral + Location: 142,28 + Actor1854: t12 + Owner: Neutral + Location: 14,47 + Actor1856: t01.husk + Owner: Neutral + Location: 151,111 + Actor1857: t13.husk + Owner: Neutral + Location: 123,87 + Actor1858: t13 + Owner: Neutral + Location: 84,130 + Actor1861: t06 + Owner: Neutral + Location: 108,135 + Actor1863: t08 + Owner: Neutral + Location: 80,139 + Actor1867: t03 + Owner: Neutral + Location: 119,87 + Actor1869: t02 + Owner: Neutral + Location: 86,131 + Actor1870: t17 + Owner: Neutral + Location: 157,2 + Actor1872: t08 + Owner: Neutral + Location: 189,79 + Actor1875: t03 + Owner: Neutral + Location: 153,4 + Actor1876: t03 + Owner: Neutral + Location: 87,128 + Actor1878: t02 + Owner: Neutral + Location: 176,69 + Actor1880: t17 + Owner: Neutral + Location: 5,140 + Actor1888: t02 + Owner: Neutral + Location: 12,36 + Actor1893: t01 + Owner: Neutral + Location: 55,97 + Actor1896: t05 + Owner: Neutral + Location: 165,71 + Actor1897: t08 + Owner: Neutral + Location: 2,138 + Actor1898: t02 + Owner: Neutral + Location: 1,135 + Actor1900: t13 + Owner: Neutral + Location: 171,7 + Actor1902: t17 + Owner: Neutral + Location: 2,60 + Actor1903: t05 + Owner: Neutral + Location: 19,123 + Actor1905: t06 + Owner: Neutral + Location: 71,104 + Actor1906: t08 + Owner: Neutral + Location: 29,115 + Actor1908: t06 + Owner: Neutral + Location: 81,138 + Actor1911: t17 + Owner: Neutral + Location: 167,79 + Actor1917: t12 + Owner: Neutral + Location: 3,141 + Actor1918: t12 + Owner: Neutral + Location: 81,128 + Actor1920: t07 + Owner: Neutral + Location: 13,117 + Actor1921: t12 + Owner: Neutral + Location: 83,97 + Actor1923: t08 + Owner: Neutral + Location: 110,136 + Actor1925: t13 + Owner: Neutral + Location: 30,26 + Actor1927: t05 + Owner: Neutral + Location: 1,91 + Actor1932: t13 + Owner: Neutral + Location: 191,87 + Actor1933: t12 + Owner: Neutral + Location: 20,127 + Actor1937: t07 + Owner: Neutral + Location: 190,86 + Actor1943: t17 + Owner: Neutral + Location: 51,94 + Actor1945: t02 + Owner: Neutral + Location: 150,116 + Actor1947: t01.husk + Owner: Neutral + Location: 175,73 + Actor1948: t17 + Owner: Neutral + Location: 73,113 + Actor1949: t13.husk + Owner: Neutral + Location: 13,43 + Actor1950: t16 + Owner: Neutral + Location: 190,130 + Actor1955: t13 + Owner: Neutral + Location: 29,110 + Actor1960: t16 + Owner: Neutral + Location: 86,107 + Actor1962: t16 + Owner: Neutral + Location: 169,78 + Actor1963: t13 + Owner: Neutral + Location: 4,138 + Actor1964: t01 + Owner: Neutral + Location: 103,141 + Actor1965: t13 + Owner: Neutral + Location: 148,33 + Actor1970: t02.husk + Owner: Neutral + Location: 165,70 + Actor1973: t05 + Owner: Neutral + Location: 118,86 + Actor1976: t06 + Owner: Neutral + Location: 50,96 + Actor1977: t01 + Owner: Neutral + Location: 27,46 + Actor1978: t16.husk + Owner: Neutral + Location: 20,129 + Actor1980: t13 + Owner: Neutral + Location: 164,72 + Actor1984: t03 + Owner: Neutral + Location: 21,132 + Actor1986: t05 + Owner: Neutral + Location: 16,120 + Actor1987: t05 + Owner: Neutral + Location: 2,139 + Actor1990: t17 + Owner: Neutral + Location: 123,93 + Actor1992: t05 + Owner: Neutral + Location: 86,109 + Actor1994: t07 + Owner: Neutral + Location: 83,128 + Actor1995: t01 + Owner: Neutral + Location: 139,31 + Actor1997: t06 + Owner: Neutral + Location: 105,136 + Actor1999: t16 + Owner: Neutral + Location: 170,76 + Actor2003: t05 + Owner: Neutral + Location: 18,123 + Actor2005: t16 + Owner: Neutral + Location: 1,144 + Actor2006: t02 + Owner: Neutral + Location: 32,23 + Actor2008: t16 + Owner: Neutral + Location: 104,138 + Actor2014: t06 + Owner: Neutral + Location: 178,82 + Actor2015: t08 + Owner: Neutral + Location: 4,143 + Actor2019: t16 + Owner: Neutral + Location: 29,64 + Actor2023: t05 + Owner: Neutral + Location: 116,137 + Actor2024: t16.husk + Owner: Neutral + Location: 153,5 + Actor2029: t16 + Owner: Neutral + Location: 55,96 + Actor2030: t06 + Owner: Neutral + Location: 21,127 + Actor2031: t02 + Owner: Neutral + Location: 166,78 + Actor2032: t02 + Owner: Neutral + Location: 190,72 + Actor2036: t05 + Owner: Neutral + Location: 1,90 + Actor2040: t17.husk + Owner: Neutral + Location: 49,142 + Actor2042: t01 + Owner: Neutral + Location: 191,4 + Actor2044: t06 + Owner: Neutral + Location: 84,101 + Actor2045: t17 + Owner: Neutral + Location: 177,82 + Actor2049: t12 + Owner: Neutral + Location: 73,99 + Actor2051: t06 + Owner: Neutral + Location: 17,122 + Actor2054: t03 + Owner: Neutral + Location: 56,121 + Actor2055: t07 + Owner: Neutral + Location: 160,45 + Actor2058: t12 + Owner: Neutral + Location: 108,134 + Actor2059: t03 + Owner: Neutral + Location: 169,73 + Actor2061: t13 + Owner: Neutral + Location: 178,40 + Actor2062: t13 + Owner: Neutral + Location: 73,95 + Actor2063: t01 + Owner: Neutral + Location: 52,125 + Actor2065: t08 + Owner: Neutral + Location: 169,7 + Actor2066: t05 + Owner: Neutral + Location: 71,102 + Actor2067: t08 + Owner: Neutral + Location: 166,75 + Actor2068: t05 + Owner: Neutral + Location: 175,43 + Actor2071: t16 + Owner: Neutral + Location: 25,53 + Actor2073: t01.husk + Owner: Neutral + Location: 27,64 + Actor2077: t05 + Owner: Neutral + Location: 191,36 + Actor2078: t07 + Owner: Neutral + Location: 191,80 + Actor2080: t13 + Owner: Neutral + Location: 164,71 + Actor2081: t13 + Owner: Neutral + Location: 189,87 + Actor2083: t01 + Owner: Neutral + Location: 125,88 + Actor2085: t13 + Owner: Neutral + Location: 26,66 + Actor2086: t03 + Owner: Neutral + Location: 72,100 + Actor2090: t07 + Owner: Neutral + Location: 190,87 + Actor2091: t02 + Owner: Neutral + Location: 178,83 + Actor2095: t12 + Owner: Neutral + Location: 152,1 + Actor2097: t01 + Owner: Neutral + Location: 192,127 + Actor2098: t01 + Owner: Neutral + Location: 4,34 + Actor2099: t06 + Owner: Neutral + Location: 85,99 + Actor2102: t02 + Owner: Neutral + Location: 190,33 + Actor2103: t03 + Owner: Neutral + Location: 192,22 + Actor2106: t05 + Owner: Neutral + Location: 67,99 + Actor2107: t01 + Owner: Neutral + Location: 1,71 + Actor2108: t06 + Owner: Neutral + Location: 176,39 + Actor2109: t02 + Owner: Neutral + Location: 1,93 + Actor2117: t06 + Owner: Neutral + Location: 111,144 + Actor2119: t02 + Owner: Neutral + Location: 14,45 + Actor2121: t03 + Owner: Neutral + Location: 73,104 + Actor2123: t06 + Owner: Neutral + Location: 192,1 + Actor2125: t12 + Owner: Neutral + Location: 170,44 + Actor2126: t12 + Owner: Neutral + Location: 118,85 + Actor2128: t03 + Owner: Neutral + Location: 148,111 + Actor2132: t16 + Owner: Neutral + Location: 116,83 + Actor2134: t07 + Owner: Neutral + Location: 166,80 + Actor2136: t02 + Owner: Neutral + Location: 109,142 + Actor2138: t16 + Owner: Neutral + Location: 76,100 + Actor2140: t08 + Owner: Neutral + Location: 154,33 + Actor2143: t17 + Owner: Neutral + Location: 67,52 + Actor2146: t16 + Owner: Neutral + Location: 190,80 + Actor2150: t03 + Owner: Neutral + Location: 116,84 + Actor2151: t13 + Owner: Neutral + Location: 21,130 + Actor2152: t13 + Owner: Neutral + Location: 24,134 + Actor2155: t06 + Owner: Neutral + Location: 79,92 + Actor2157: t01.husk + Owner: Neutral + Location: 191,77 + Actor2159: t03 + Owner: Neutral + Location: 188,26 + Actor2161: t07 + Owner: Neutral + Location: 151,3 + Actor2163: t16 + Owner: Neutral + Location: 191,84 + Actor2165: t13 + Owner: Neutral + Location: 53,142 + Actor2166: t03 + Owner: Neutral + Location: 166,69 + Actor2170: t03 + Owner: Neutral + Location: 154,51 + Actor2174: t06.husk + Owner: Neutral + Location: 15,43 + Actor2176: t01 + Owner: Neutral + Location: 177,85 + Actor2179: t08 + Owner: Neutral + Location: 164,79 + Actor2181: t12 + Owner: Neutral + Location: 190,31 + Actor2184: t05 + Owner: Neutral + Location: 137,27 + Actor2185: t17 + Owner: Neutral + Location: 154,1 + Actor2186: t12 + Owner: Neutral + Location: 17,113 + Actor2189: t07 + Owner: Neutral + Location: 27,62 + Actor2190: t17 + Owner: Neutral + Location: 83,140 + Actor2194: t13 + Owner: Neutral + Location: 150,3 + Actor2195: t05 + Owner: Neutral + Location: 25,51 + Actor2196: t07 + Owner: Neutral + Location: 85,131 + Actor2201: t16 + Owner: Neutral + Location: 189,86 + Actor2205: t12.husk + Owner: Neutral + Location: 29,63 + Actor2206: t08 + Owner: Neutral + Location: 99,139 + Actor2208: t05.husk + Owner: Neutral + Location: 14,72 + Actor2209: t07 + Owner: Neutral + Location: 84,96 + Actor2214: t07 + Owner: Neutral + Location: 80,97 + Actor2217: t07 + Owner: Neutral + Location: 31,23 + Actor2218: t12 + Owner: Neutral + Location: 47,131 + Actor2223: t02 + Owner: Neutral + Location: 54,117 + Actor2229: t03 + Owner: Neutral + Location: 172,76 + Actor2231: t06 + Owner: Neutral + Location: 83,100 + Actor2232: t13 + Owner: Neutral + Location: 2,36 + Actor2233: t16 + Owner: Neutral + Location: 21,131 + Actor2235: t02 + Owner: Neutral + Location: 58,108 + Actor2239: t13 + Owner: Neutral + Location: 1,58 + Actor2240: t17 + Owner: Neutral + Location: 90,130 + Actor2241: t08 + Owner: Neutral + Location: 56,95 + Actor2244: t02.husk + Owner: Neutral + Location: 191,88 + Actor2245: t05 + Owner: Neutral + Location: 191,28 + Actor2246: t07 + Owner: Neutral + Location: 160,46 + Actor2250: t16 + Owner: Neutral + Location: 15,140 + Actor2251: t06 + Owner: Neutral + Location: 191,116 + Actor2252: t06 + Owner: Neutral + Location: 154,103 + Actor2255: t12 + Owner: Neutral + Location: 119,86 + Actor2258: t13 + Owner: Neutral + Location: 161,72 + Actor2259: t08 + Owner: Neutral + Location: 64,129 + Actor2261: t05 + Owner: Neutral + Location: 141,29 + Actor2262: t02.husk + Owner: Neutral + Location: 53,118 + Actor2264: t02 + Owner: Neutral + Location: 143,33 + Actor2268: t08.husk + Owner: Neutral + Location: 168,79 + Actor2270: t17 + Owner: Neutral + Location: 170,42 + Actor2272: t05 + Owner: Neutral + Location: 45,127 + Actor2273: t16 + Owner: Neutral + Location: 52,97 + Actor2274: t07 + Owner: Neutral + Location: 145,30 + Actor2280: t03 + Owner: Neutral + Location: 79,97 + Actor2283: t13 + Owner: Neutral + Location: 189,76 + Actor2284: t06 + Owner: Neutral + Location: 87,107 + Actor2285: t12 + Owner: Neutral + Location: 155,30 + Actor2286: t13 + Owner: Neutral + Location: 26,52 + Actor2287: t03 + Owner: Neutral + Location: 169,10 + Actor2288: t01 + Owner: Neutral + Location: 1,140 + Actor2289: t13 + Owner: Neutral + Location: 16,128 + Actor2293: t07 + Owner: Neutral + Location: 168,7 + Actor2294: t06 + Owner: Neutral + Location: 155,3 + Actor2295: t07 + Owner: Neutral + Location: 81,142 + Actor2299: t13 + Owner: Neutral + Location: 86,108 + Actor2302: t13 + Owner: Neutral + Location: 102,138 + Actor2303: t03 + Owner: Neutral + Location: 15,62 + Actor2312: t02 + Owner: Neutral + Location: 83,141 + Actor2313: t16.husk + Owner: Neutral + Location: 154,48 + Actor2318: t03 + Owner: Neutral + Location: 54,121 + Actor2320: t02 + Owner: Neutral + Location: 168,74 + Actor2328: t17 + Owner: Neutral + Location: 15,120 + Actor2330: t08.husk + Owner: Neutral + Location: 82,98 + Actor2332: t12 + Owner: Neutral + Location: 9,26 + Actor2334: t05 + Owner: Neutral + Location: 190,26 + Actor2337: t08.husk + Owner: Neutral + Location: 82,129 + Actor2339: t07.husk + Owner: Neutral + Location: 50,142 + Actor2340: t07 + Owner: Neutral + Location: 147,34 + Actor2342: t17 + Owner: Neutral + Location: 137,28 + Actor2343: t08 + Owner: Neutral + Location: 191,68 + Actor2344: t05 + Owner: Neutral + Location: 19,125 + Actor2345: t05.husk + Owner: Neutral + Location: 57,118 + Actor2348: t02 + Owner: Neutral + Location: 74,104 + Actor2350: t07 + Owner: Neutral + Location: 63,143 + Actor2351: t13.husk + Owner: Neutral + Location: 148,31 + Actor2352: t13 + Owner: Neutral + Location: 164,75 + Actor2357: t02 + Owner: Neutral + Location: 163,78 + Actor2360: t02 + Owner: Neutral + Location: 187,70 + Actor2361: t03 + Owner: Neutral + Location: 81,139 + Actor2366: t17 + Owner: Neutral + Location: 70,105 + Actor2373: t07 + Owner: Neutral + Location: 175,42 + Actor2375: t08 + Owner: Neutral + Location: 87,110 + Actor2376: t06 + Owner: Neutral + Location: 51,140 + Actor2382: t12 + Owner: Neutral + Location: 79,94 + Actor2384: t05 + Owner: Neutral + Location: 192,124 + Actor2387: t01 + Owner: Neutral + Location: 190,120 + Actor2390: t08 + Owner: Neutral + Location: 16,116 + Actor2394: t12 + Owner: Neutral + Location: 76,94 + Actor2396: t17 + Owner: Neutral + Location: 156,30 + Actor2397: t08 + Owner: Neutral + Location: 86,105 + Actor2398: t16 + Owner: Neutral + Location: 188,71 + Actor2399: t05 + Owner: Neutral + Location: 15,71 + Actor2400: t01 + Owner: Neutral + Location: 45,144 + Actor2402: t13 + Owner: Neutral + Location: 192,79 + Actor2404: t07 + Owner: Neutral + Location: 107,134 + Actor2406: t07 + Owner: Neutral + Location: 126,92 + Actor2409: t02 + Owner: Neutral + Location: 49,128 + Actor2416: t02 + Owner: Neutral + Location: 14,144 + Actor2424: t13 + Owner: Neutral + Location: 176,82 + Actor2426: t03 + Owner: Neutral + Location: 154,50 + Actor2428: t08 + Owner: Neutral + Location: 16,44 + Actor2429: t03 + Owner: Neutral + Location: 80,95 + Actor2434: t06 + Owner: Neutral + Location: 191,129 + Actor2435: t07 + Owner: Neutral + Location: 25,60 + Actor2436: t02 + Owner: Neutral + Location: 116,85 + Actor2438: t07 + Owner: Neutral + Location: 152,32 + Actor2439: t16.husk + Owner: Neutral + Location: 189,24 + Actor2441: t12 + Owner: Neutral + Location: 188,78 + Actor2442: t01 + Owner: Neutral + Location: 26,64 + Actor2444: t03 + Owner: Neutral + Location: 63,144 + Actor2447: t17.husk + Owner: Neutral + Location: 154,5 + Actor2450: t01 + Owner: Neutral + Location: 85,100 + Actor2451: t07 + Owner: Neutral + Location: 30,63 + Actor2457: t01.husk + Owner: Neutral + Location: 50,125 + Actor2458: t12 + Owner: Neutral + Location: 90,144 + Actor2462: t08 + Owner: Neutral + Location: 2,71 + Actor2463: t12 + Owner: Neutral + Location: 142,32 + Actor2464: t02 + Owner: Neutral + Location: 55,120 + Actor2468: t16.husk + Owner: Neutral + Location: 187,69 + Actor2472: t13 + Owner: Neutral + Location: 159,41 + Actor2473: t12 + Owner: Neutral + Location: 140,27 + Actor2474: t16.husk + Owner: Neutral + Location: 87,108 + Actor2476: t13 + Owner: Neutral + Location: 115,137 + Actor2478: t08.husk + Owner: Neutral + Location: 154,11 + Actor2480: t17 + Owner: Neutral + Location: 191,72 + Actor2481: t12 + Owner: Neutral + Location: 141,30 + Actor2482: t02 + Owner: Neutral + Location: 176,40 + Actor2483: t16.husk + Owner: Neutral + Location: 160,41 + Actor2484: t03 + Owner: Neutral + Location: 14,43 + Actor2488: t12 + Owner: Neutral + Location: 13,88 + Actor2496: t05 + Owner: Neutral + Location: 84,99 + Actor2497: t06 + Owner: Neutral + Location: 192,3 + Actor2498: t01 + Owner: Neutral + Location: 16,143 + Actor2499: t02 + Owner: Neutral + Location: 107,142 + Actor2500: t12 + Owner: Neutral + Location: 16,38 + Actor2501: t17 + Owner: Neutral + Location: 26,61 + Actor2504: t13 + Owner: Neutral + Location: 1,57 + Actor2505: t13 + Owner: Neutral + Location: 90,109 + Actor2508: t01 + Owner: Neutral + Location: 17,126 + Actor2510: t12 + Owner: Neutral + Location: 18,42 + Actor2511: t07.husk + Owner: Neutral + Location: 152,5 + Actor2513: t01 + Owner: Neutral + Location: 170,8 + Actor2514: t02 + Owner: Neutral + Location: 179,74 + Actor2515: t03 + Owner: Neutral + Location: 12,69 + Actor2516: t17 + Owner: Neutral + Location: 48,127 + Actor2517: t07.husk + Owner: Neutral + Location: 167,70 + Actor2518: t01 + Owner: Neutral + Location: 4,143 + Actor2519: t01 + Owner: Neutral + Location: 139,30 + Actor2520: t13 + Owner: Neutral + Location: 26,54 + Actor2521: t12 + Owner: Neutral + Location: 2,86 + Actor2522: t08 + Owner: Neutral + Location: 181,43 + Actor2523: t01 + Owner: Neutral + Location: 186,78 + Actor2524: t17 + Owner: Neutral + Location: 56,115 + Actor2529: t17 + Owner: Neutral + Location: 154,30 + Actor2530: t06.husk + Owner: Neutral + Location: 0,86 + Actor2535: t03 + Owner: Neutral + Location: 155,32 + Actor2536: t07 + Owner: Neutral + Location: 55,115 + Actor2537: t17 + Owner: Neutral + Location: 14,41 + Actor2538: t06 + Owner: Neutral + Location: 76,113 + Actor2540: t02 + Owner: Neutral + Location: 156,29 + Actor2543: t17 + Owner: Neutral + Location: 25,54 + Actor2545: t03 + Owner: Neutral + Location: 173,67 + Actor2546: t12 + Owner: Neutral + Location: 153,113 + Actor2549: t08 + Owner: Neutral + Location: 82,140 + Actor2550: t17 + Owner: Neutral + Location: 14,87 + Actor2551: t07 + Owner: Neutral + Location: 0,136 + Actor2553: t17 + Owner: Neutral + Location: 83,129 + Actor2555: t05.husk + Owner: Neutral + Location: 161,46 + Actor2556: t02 + Owner: Neutral + Location: 175,41 + Actor2557: t01 + Owner: Neutral + Location: 72,104 + Actor2558: t02.husk + Owner: Neutral + Location: 191,33 + Actor2563: t06 + Owner: Neutral + Location: 60,109 + Actor2564: t06 + Owner: Neutral + Location: 71,100 + Actor2565: t12 + Owner: Neutral + Location: 121,93 + Actor2566: t02 + Owner: Neutral + Location: 20,142 + Actor2567: t07 + Owner: Neutral + Location: 18,122 + Actor2570: t05 + Owner: Neutral + Location: 24,61 + Actor2571: t07 + Owner: Neutral + Location: 43,117 + Actor2572: t12 + Owner: Neutral + Location: 65,52 + Actor2574: t02 + Owner: Neutral + Location: 76,95 + Actor2577: t17 + Owner: Neutral + Location: 190,122 + Actor2578: t02 + Owner: Neutral + Location: 25,64 + Actor2580: t12.husk + Owner: Neutral + Location: 80,92 + Actor2582: t05 + Owner: Neutral + Location: 154,4 + Actor2586: t12.husk + Owner: Neutral + Location: 191,68 + Actor2588: t02 + Owner: Neutral + Location: 88,109 + Actor2589: t08 + Owner: Neutral + Location: 85,129 + Actor2590: t08 + Owner: Neutral + Location: 192,65 + Actor2591: t08.husk + Owner: Neutral + Location: 82,93 + Actor2593: t06 + Owner: Neutral + Location: 146,32 + Actor2594: t13 + Owner: Neutral + Location: 16,64 + Actor2595: t02 + Owner: Neutral + Location: 57,116 + Actor2596: t07 + Owner: Neutral + Location: 77,98 + Actor2597: t12 + Owner: Neutral + Location: 58,105 + Actor2600: t03 + Owner: Neutral + Location: 147,35 + Actor2601: t07 + Owner: Neutral + Location: 27,52 + Actor2603: t08 + Owner: Neutral + Location: 73,97 + Actor2604: t06 + Owner: Neutral + Location: 123,90 + Actor2605: t01 + Owner: Neutral + Location: 72,102 + Actor2607: t12 + Owner: Neutral + Location: 174,72 + Actor2609: t17.husk + Owner: Neutral + Location: 75,99 + Actor2612: t17.husk + Owner: Neutral + Location: 25,127 + Actor2613: t16 + Owner: Neutral + Location: 77,115 + Actor2615: t01 + Owner: Neutral + Location: 56,109 + Actor2617: t02 + Owner: Neutral + Location: 193,113 + Actor2621: t02 + Owner: Neutral + Location: 29,23 + Actor2623: t05 + Owner: Neutral + Location: 82,129 + Actor2625: t06 + Owner: Neutral + Location: 165,78 + Actor2627: t13 + Owner: Neutral + Location: 75,95 + Actor2631: t13 + Owner: Neutral + Location: 156,42 + Actor2632: t02 + Owner: Neutral + Location: 56,96 + Actor2636: t01 + Owner: Neutral + Location: 54,122 + Actor2640: t01.husk + Owner: Neutral + Location: 27,49 + Actor2642: t12 + Owner: Neutral + Location: 155,50 + Actor2645: t03 + Owner: Neutral + Location: 189,14 + Actor2647: t06 + Owner: Neutral + Location: 191,70 + Actor2648: t05 + Owner: Neutral + Location: 62,52 + Actor2649: t03 + Owner: Neutral + Location: 81,98 + Actor2651: t01 + Owner: Neutral + Location: 72,105 + Actor2658: t16.husk + Owner: Neutral + Location: 172,10 + Actor2659: t07.husk + Owner: Neutral + Location: 1,64 + Actor2660: t05 + Owner: Neutral + Location: 186,77 + Actor2661: t07.husk + Owner: Neutral + Location: 50,98 + Actor2663: t02 + Owner: Neutral + Location: 70,99 + Actor2664: t07 + Owner: Neutral + Location: 106,140 + Actor2665: t13 + Owner: Neutral + Location: 2,35 + Actor2670: t16 + Owner: Neutral + Location: 83,130 + Actor2671: t07 + Owner: Neutral + Location: 143,34 + Actor2672: t08 + Owner: Neutral + Location: 99,141 + Actor2673: t13 + Owner: Neutral + Location: 150,117 + Actor2676: t06 + Owner: Neutral + Location: 153,2 + Actor2677: t01 + Owner: Neutral + Location: 51,97 + Actor2678: t16 + Owner: Neutral + Location: 192,86 + Actor2680: t17 + Owner: Neutral + Location: 190,7 + Actor2683: t01.husk + Owner: Neutral + Location: 26,133 + Actor2684: t12 + Owner: Neutral + Location: 188,86 + Actor2690: t12 + Owner: Neutral + Location: 164,80 + Actor2691: t17 + Owner: Neutral + Location: 146,31 + Actor2692: t05 + Owner: Neutral + Location: 115,85 + Actor2693: t05 + Owner: Neutral + Location: 124,90 + Actor2694: t06 + Owner: Neutral + Location: 152,4 + Actor2701: t17 + Owner: Neutral + Location: 32,24 + Actor2702: t03 + Owner: Neutral + Location: 192,30 + Actor2705: t07 + Owner: Neutral + Location: 15,118 + Actor2706: t13 + Owner: Neutral + Location: 74,101 + Actor2707: t08 + Owner: Neutral + Location: 146,30 + Actor2712: t05 + Owner: Neutral + Location: 19,129 + Actor2714: t01.husk + Owner: Neutral + Location: 158,43 + Actor2718: t01 + Owner: Neutral + Location: 179,41 + Actor2722: t03 + Owner: Neutral + Location: 77,113 + Actor2724: t08 + Owner: Neutral + Location: 55,120 + Actor2725: t07 + Owner: Neutral + Location: 171,77 + Actor2727: t16 + Owner: Neutral + Location: 14,40 + Actor2728: t13 + Owner: Neutral + Location: 155,8 + Actor2731: t06.husk + Owner: Neutral + Location: 153,114 + Actor2732: t13 + Owner: Neutral + Location: 50,124 + Actor2736: t12.husk + Owner: Neutral + Location: 17,115 + Actor2738: t05 + Owner: Neutral + Location: 191,124 + Actor2739: t03 + Owner: Neutral + Location: 15,46 + Actor2740: t13 + Owner: Neutral + Location: 59,109 + Actor2742: t02 + Owner: Neutral + Location: 52,144 + Actor2746: t16.husk + Owner: Neutral + Location: 191,121 + Actor2753: t02 + Owner: Neutral + Location: 157,40 + Actor2754: t12.husk + Owner: Neutral + Location: 147,30 + Actor2755: t02 + Owner: Neutral + Location: 179,39 + Actor2756: t07.husk + Owner: Neutral + Location: 144,33 + Actor2759: t07 + Owner: Neutral + Location: 17,43 + Actor2762: t06 + Owner: Neutral + Location: 153,50 + Actor2763: t03 + Owner: Neutral + Location: 27,48 + Actor2766: t02 + Owner: Neutral + Location: 192,77 + Actor2767: t03 + Owner: Neutral + Location: 176,42 + Actor2768: t13 + Owner: Neutral + Location: 14,70 + Actor2770: t07 + Owner: Neutral + Location: 28,28 + Actor2771: t16 + Owner: Neutral + Location: 192,4 + Actor2773: t07 + Owner: Neutral + Location: 9,25 + Actor2776: t16 + Owner: Neutral + Location: 105,137 + Actor2777: t06 + Owner: Neutral + Location: 19,122 + Actor2779: t02 + Owner: Neutral + Location: 51,144 + Actor2780: t08.husk + Owner: Neutral + Location: 170,74 + Actor2781: t17 + Owner: Neutral + Location: 20,123 + Actor2784: t02 + Owner: Neutral + Location: 70,101 + Actor2786: t01 + Owner: Neutral + Location: 99,144 + Actor2789: t12.husk + Owner: Neutral + Location: 85,98 + Actor2794: t17 + Owner: Neutral + Location: 153,31 + Actor2795: t13 + Owner: Neutral + Location: 167,78 + Actor2796: t01 + Owner: Neutral + Location: 87,106 + Actor2798: t06 + Owner: Neutral + Location: 52,122 + Actor2801: t03 + Owner: Neutral + Location: 126,90 + Actor2802: t02 + Owner: Neutral + Location: 18,125 + Actor2809: t03 + Owner: Neutral + Location: 86,105 + Actor2812: t07 + Owner: Neutral + Location: 2,135 + Actor2814: t01.husk + Owner: Neutral + Location: 80,141 + Actor2815: t06 + Owner: Neutral + Location: 45,126 + Actor2816: t16 + Owner: Neutral + Location: 78,114 + Actor2819: t17 + Owner: Neutral + Location: 191,125 + Actor2820: t12.husk + Owner: Neutral + Location: 43,118 + Actor2821: t08 + Owner: Neutral + Location: 84,106 + Actor2822: t16.husk + Owner: Neutral + Location: 71,101 + Actor2823: t01 + Owner: Neutral + Location: 84,98 + Actor2824: t06 + Owner: Neutral + Location: 15,34 + Actor2829: t03.husk + Owner: Neutral + Location: 101,143 + Actor2830: t03 + Owner: Neutral + Location: 3,137 + Actor2831: t17 + Owner: Neutral + Location: 190,30 + Actor2834: t08 + Owner: Neutral + Location: 56,99 + Actor2836: t08.husk + Owner: Neutral + Location: 16,47 + Actor2838: t02 + Owner: Neutral + Location: 190,123 + Actor2839: t01 + Owner: Neutral + Location: 108,142 + Actor2840: t12 + Owner: Neutral + Location: 3,142 + Actor2841: t07 + Owner: Neutral + Location: 171,74 + Actor2843: t12 + Owner: Neutral + Location: 80,99 + Actor2847: t03 + Owner: Neutral + Location: 82,98 + Actor2848: t03 + Owner: Neutral + Location: 53,141 + Actor2853: t13 + Owner: Neutral + Location: 15,142 + Actor2854: t05 + Owner: Neutral + Location: 149,33 + Actor2859: t16 + Owner: Neutral + Location: 58,112 + Actor2860: t07 + Owner: Neutral + Location: 73,105 + Actor2866: t03 + Owner: Neutral + Location: 58,113 + Actor2871: t13 + Owner: Neutral + Location: 12,43 + Actor2877: t16.husk + Owner: Neutral + Location: 32,117 + Actor2882: t07 + Owner: Neutral + Location: 19,130 + Actor2884: t16 + Owner: Neutral + Location: 158,1 + Actor2887: t06 + Owner: Neutral + Location: 47,127 + Actor2888: t08 + Owner: Neutral + Location: 65,47 + Actor2893: t08 + Owner: Neutral + Location: 84,101 + Actor2894: t17 + Owner: Neutral + Location: 174,73 + Actor2900: t17 + Owner: Neutral + Location: 11,43 + Actor2901: t16 + Owner: Neutral + Location: 26,49 + Actor2904: t16 + Owner: Neutral + Location: 30,23 + Actor2906: t16 + Owner: Neutral + Location: 105,135 + Actor2911: t07 + Owner: Neutral + Location: 85,103 + Actor2913: t17 + Owner: Neutral + Location: 15,64 + Actor2914: t02 + Owner: Neutral + Location: 16,122 + Actor2916: t03 + Owner: Neutral + Location: 30,62 + Actor2917: t02 + Owner: Neutral + Location: 0,135 + Actor2921: t12 + Owner: Neutral + Location: 4,139 + Actor2923: t16 + Owner: Neutral + Location: 69,102 + Actor2924: t13 + Owner: Neutral + Location: 72,106 + Actor2927: t07.husk + Owner: Neutral + Location: 140,29 + Actor2928: t01 + Owner: Neutral + Location: 190,116 + Actor2932: t13 + Owner: Neutral + Location: 28,65 + Actor2933: t02 + Owner: Neutral + Location: 17,120 + Actor2935: t08 + Owner: Neutral + Location: 100,143 + Actor2936: t16 + Owner: Neutral + Location: 108,144 + Actor2941: t03 + Owner: Neutral + Location: 190,83 + Actor2942: t07 + Owner: Neutral + Location: 115,83 + Actor2951: t02 + Owner: Neutral + Location: 24,132 + Actor2952: t03 + Owner: Neutral + Location: 77,96 + Actor2953: t01 + Owner: Neutral + Location: 54,116 + Actor2956: t17 + Owner: Neutral + Location: 84,128 + Actor2957: t17 + Owner: Neutral + Location: 85,129 + Actor2959: t02.husk + Owner: Neutral + Location: 173,73 + Actor2961: t02 + Owner: Neutral + Location: 25,59 + Actor2965: t13 + Owner: Neutral + Location: 163,77 + Actor2968: t12 + Owner: Neutral + Location: 28,50 + Actor2969: t16 + Owner: Neutral + Location: 142,30 + Actor2974: t16 + Owner: Neutral + Location: 81,95 + Actor2976: t06 + Owner: Neutral + Location: 191,22 + Actor2978: t06 + Owner: Neutral + Location: 0,85 + Actor2983: t02 + Owner: Neutral + Location: 191,64 + Actor2984: t13 + Owner: Neutral + Location: 174,42 + Actor2985: t06 + Owner: Neutral + Location: 15,122 + Actor2990: t13 + Owner: Neutral + Location: 84,104 + Actor2991: t01 + Owner: Neutral + Location: 156,7 + Actor2992: t07 + Owner: Neutral + Location: 17,127 + Actor2993: t01 + Owner: Neutral + Location: 19,121 + Actor2994: t03 + Owner: Neutral + Location: 168,11 + Actor2996: t02 + Owner: Neutral + Location: 102,141 + Actor2997: t03 + Owner: Neutral + Location: 189,25 + Actor2999: t02 + Owner: Neutral + Location: 71,105 + Actor3000: t16 + Owner: Neutral + Location: 116,86 + Actor3003: t13 + Owner: Neutral + Location: 52,121 + Actor3004: t12 + Owner: Neutral + Location: 190,36 + Actor3006: t12 + Owner: Neutral + Location: 17,128 + Actor3008: t16 + Owner: Neutral + Location: 63,53 + Actor3010: t02 + Owner: Neutral + Location: 30,61 + Actor3011: t16 + Owner: Neutral + Location: 139,28 + Actor3013: t05 + Owner: Neutral + Location: 64,45 + Actor3016: t16 + Owner: Neutral + Location: 22,134 + Actor3017: t02 + Owner: Neutral + Location: 175,69 + Actor3018: t01 + Owner: Neutral + Location: 72,97 + Actor3020: t17 + Owner: Neutral + Location: 17,124 + Actor3022: t05 + Owner: Neutral + Location: 62,143 + Actor3023: t16 + Owner: Neutral + Location: 86,101 + Actor3024: t06 + Owner: Neutral + Location: 83,99 + Actor3026: t01 + Owner: Neutral + Location: 171,71 + Actor3027: t06 + Owner: Neutral + Location: 27,65 + Actor3029: t16 + Owner: Neutral + Location: 69,105 + Actor3032: t16 + Owner: Neutral + Location: 111,135 + Actor3033: t03 + Owner: Neutral + Location: 173,74 + Actor3035: t12 + Owner: Neutral + Location: 70,100 + Actor3036: t12.husk + Owner: Neutral + Location: 190,11 + Actor3037: t05 + Owner: Neutral + Location: 59,117 + Actor3039: t08.husk + Owner: Neutral + Location: 89,131 + Actor3044: t13 + Owner: Neutral + Location: 16,142 + Actor3046: t03 + Owner: Neutral + Location: 80,93 + Actor3052: t05.husk + Owner: Neutral + Location: 177,69 + Actor3055: t17 + Owner: Neutral + Location: 177,38 + Actor3057: t06 + Owner: Neutral + Location: 171,3 + Actor3058: t17 + Owner: Neutral + Location: 193,73 + Actor3059: t05 + Owner: Neutral + Location: 188,82 + Actor3060: t02 + Owner: Neutral + Location: 60,98 + Actor3063: t03 + Owner: Neutral + Location: 154,6 + Actor3064: t03 + Owner: Neutral + Location: 122,92 + Actor3067: t01 + Owner: Neutral + Location: 148,32 + Actor3068: t17 + Owner: Neutral + Location: 189,75 + Actor3069: t07 + Owner: Neutral + Location: 177,40 + Actor3070: t06.husk + Owner: Neutral + Location: 43,114 + Actor3073: t07 + Owner: Neutral + Location: 191,40 + Actor3074: t08 + Owner: Neutral + Location: 24,127 + Actor3075: t03 + Owner: Neutral + Location: 158,40 + Actor3078: t07 + Owner: Neutral + Location: 169,45 + Actor3080: t12 + Owner: Neutral + Location: 53,143 + Actor3084: t16 + Owner: Neutral + Location: 162,73 + Actor3085: t13 + Owner: Neutral + Location: 17,70 + Actor3090: t13 + Owner: Neutral + Location: 13,41 + Actor3093: t08 + Owner: Neutral + Location: 157,2 + Actor3095: t06 + Owner: Neutral + Location: 109,135 + Actor3098: t02 + Owner: Neutral + Location: 71,98 + Actor3099: t17 + Owner: Neutral + Location: 123,91 + Actor3101: t06 + Owner: Neutral + Location: 26,128 + Actor3104: t03 + Owner: Neutral + Location: 14,44 + Actor3108: t12 + Owner: Neutral + Location: 122,93 + Actor3110: t05 + Owner: Neutral + Location: 25,134 + Actor3114: t05 + Owner: Neutral + Location: 2,87 + Actor3117: t17 + Owner: Neutral + Location: 119,84 + Actor3119: t17.husk + Owner: Neutral + Location: 122,89 + Actor3121: t03 + Owner: Neutral + Location: 18,144 + Actor3123: t17 + Owner: Neutral + Location: 190,131 + Actor3124: t05 + Owner: Neutral + Location: 138,29 + Actor3129: t17 + Owner: Neutral + Location: 190,5 + Actor3131: t12 + Owner: Neutral + Location: 14,42 + Actor3133: t01 + Owner: Neutral + Location: 145,31 + Actor3135: t16 + Owner: Neutral + Location: 186,82 + Actor3136: t08 + Owner: Neutral + Location: 189,69 + Actor3137: t08 + Owner: Neutral + Location: 55,123 + Actor3139: t03 + Owner: Neutral + Location: 4,140 + Actor3140: t06 + Owner: Neutral + Location: 63,54 + Actor3142: t12 + Owner: Neutral + Location: 0,140 + Actor3147: t05 + Owner: Neutral + Location: 159,43 + Actor3148: t03 + Owner: Neutral + Location: 34,53 + Actor3149: t13 + Owner: Neutral + Location: 29,61 + Actor3152: t01 + Owner: Neutral + Location: 114,86 + Actor3154: t05 + Owner: Neutral + Location: 120,87 + Actor3155: t16 + Owner: Neutral + Location: 56,118 + Actor3156: t03 + Owner: Neutral + Location: 191,32 + Actor3158: t12 + Owner: Neutral + Location: 51,139 + Actor3159: t02 + Owner: Neutral + Location: 27,66 + Actor3160: t13 + Owner: Neutral + Location: 50,97 + Actor3162: t07.husk + Owner: Neutral + Location: 153,42 + Actor3163: t16 + Owner: Neutral + Location: 167,11 + Actor3165: t07 + Owner: Neutral + Location: 78,98 + Actor3167: t17 + Owner: Neutral + Location: 180,40 + Actor3168: t05 + Owner: Neutral + Location: 123,89 + Actor3172: t01 + Owner: Neutral + Location: 51,126 + Actor3178: t07 + Owner: Neutral + Location: 192,116 + Actor3180: t05 + Owner: Neutral + Location: 24,131 + Actor3181: t01 + Owner: Neutral + Location: 22,132 + Actor3184: t17 + Owner: Neutral + Location: 117,87 + Actor3186: t08 + Owner: Neutral + Location: 66,54 + Actor3187: t16 + Owner: Neutral + Location: 3,139 + Actor3190: t07 + Owner: Neutral + Location: 73,97 + Actor3191: t07 + Owner: Neutral + Location: 82,142 + Actor3192: t08 + Owner: Neutral + Location: 117,86 + Actor3193: t13.husk + Owner: Neutral + Location: 155,48 + Actor3194: t07 + Owner: Neutral + Location: 190,39 + Actor3195: t06 + Owner: Neutral + Location: 14,122 + Actor3199: t07 + Owner: Neutral + Location: 146,30 + Actor3200: t02 + Owner: Neutral + Location: 191,112 + Actor3202: t16 + Owner: Neutral + Location: 138,31 + Actor3205: t08 + Owner: Neutral + Location: 176,74 + Actor3208: t17 + Owner: Neutral + Location: 0,97 + Actor3210: t17 + Owner: Neutral + Location: 16,114 + Actor3213: t02 + Owner: Neutral + Location: 84,102 + Actor3214: t16 + Owner: Neutral + Location: 13,40 + Actor3215: t16 + Owner: Neutral + Location: 190,2 + Actor3217: t13 + Owner: Neutral + Location: 80,126 + Actor3219: t12 + Owner: Neutral + Location: 188,75 + Actor3220: t06 + Owner: Neutral + Location: 163,76 + Actor3222: t17 + Owner: Neutral + Location: 164,79 + Actor3223: t07 + Owner: Neutral + Location: 171,76 + Actor3225: t16 + Owner: Neutral + Location: 89,129 + Actor3226: t03 + Owner: Neutral + Location: 156,3 + Actor3228: t05 + Owner: Neutral + Location: 100,140 + Actor3229: t03 + Owner: Neutral + Location: 163,72 + Actor3230: t06 + Owner: Neutral + Location: 164,70 + Actor3231: t02 + Owner: Neutral + Location: 15,38 + Actor3232: t02 + Owner: Neutral + Location: 176,77 + Actor3233: t02 + Owner: Neutral + Location: 187,78 + Actor3234: t08 + Owner: Neutral + Location: 156,6 + Actor3235: t02 + Owner: Neutral + Location: 191,123 + Actor3236: t17 + Owner: Neutral + Location: 123,88 + Actor3239: t06 + Owner: Neutral + Location: 80,115 + Actor3243: t08.husk + Owner: Neutral + Location: 110,137 + Actor3248: t03 + Owner: Neutral + Location: 159,42 + Actor3250: t01 + Owner: Neutral + Location: 89,131 + Actor3251: t01 + Owner: Neutral + Location: 2,142 + Actor3252: t12 + Owner: Neutral + Location: 74,106 + Actor3253: t17 + Owner: Neutral + Location: 97,130 + Actor3254: t13 + Owner: Neutral + Location: 169,44 + Actor3257: t05.husk + Owner: Neutral + Location: 162,72 + Actor3258: t01 + Owner: Neutral + Location: 191,66 + Actor3261: t12 + Owner: Neutral + Location: 28,64 + Actor3262: t05 + Owner: Neutral + Location: 46,130 + Actor3264: t07 + Owner: Neutral + Location: 165,80 + Actor3265: t05 + Owner: Neutral + Location: 51,93 + Actor3268: t13 + Owner: Neutral + Location: 16,40 + Actor3269: t17.husk + Owner: Neutral + Location: 82,140 + Actor3272: t17 + Owner: Neutral + Location: 177,42 + Actor3273: t13 + Owner: Neutral + Location: 189,38 + Actor3274: t02 + Owner: Neutral + Location: 5,142 + Actor3275: t01 + Owner: Neutral + Location: 116,87 + Actor3276: t17 + Owner: Neutral + Location: 21,133 + Actor3278: t03.husk + Owner: Neutral + Location: 151,2 + Actor3279: t02 + Owner: Neutral + Location: 175,75 + Actor3281: t05 + Owner: Neutral + Location: 82,127 + Actor3283: t03 + Owner: Neutral + Location: 190,129 + Actor3287: t16 + Owner: Neutral + Location: 88,105 + Actor3288: t03 + Owner: Neutral + Location: 191,111 + Actor3290: t03 + Owner: Neutral + Location: 190,78 + Actor3292: t12 + Owner: Neutral + Location: 50,141 + Actor3293: t07 + Owner: Neutral + Location: 189,0 + Actor3294: t06 + Owner: Neutral + Location: 2,33 + Actor3295: t03 + Owner: Neutral + Location: 171,73 + Actor3298: t05 + Owner: Neutral + Location: 190,68 + Actor3300: t05 + Owner: Neutral + Location: 2,144 + Actor3302: t02 + Owner: Neutral + Location: 51,124 + Actor3303: t16 + Owner: Neutral + Location: 172,75 + Actor3306: t17.husk + Owner: Neutral + Location: 59,131 + Actor3307: t08 + Owner: Neutral + Location: 16,127 + Actor3309: t13 + Owner: Neutral + Location: 151,113 + Actor3312: t13 + Owner: Neutral + Location: 191,27 + Actor3314: t08 + Owner: Neutral + Location: 190,26 + Actor3316: t13 + Owner: Neutral + Location: 55,114 + Actor3317: t13 + Owner: Neutral + Location: 145,32 + Actor3319: t02 + Owner: Neutral + Location: 174,70 + Actor3320: t01.husk + Owner: Neutral + Location: 193,79 + Actor3322: t08 + Owner: Neutral + Location: 160,74 + Actor3325: t12 + Owner: Neutral + Location: 109,143 + Actor3327: t13 + Owner: Neutral + Location: 59,113 + Actor3328: t07 + Owner: Neutral + Location: 50,140 + Actor3329: t17 + Owner: Neutral + Location: 153,3 + Actor3330: t01 + Owner: Neutral + Location: 16,70 + Actor3332: t03 + Owner: Neutral + Location: 190,69 + Actor3334: t03 + Owner: Neutral + Location: 78,115 + Actor3336: t01 + Owner: Neutral + Location: 190,70 + Actor3337: t17 + Owner: Neutral + Location: 72,103 + Actor3338: t03 + Owner: Neutral + Location: 190,4 + Actor3344: t05 + Owner: Neutral + Location: 24,62 + Actor3347: t01 + Owner: Neutral + Location: 86,100 + Actor3348: t16 + Owner: Neutral + Location: 155,27 + Actor3349: t07 + Owner: Neutral + Location: 171,72 + Actor3352: t12 + Owner: Neutral + Location: 154,2 + Actor3355: t12 + Owner: Neutral + Location: 19,116 + Actor3357: t05 + Owner: Neutral + Location: 191,25 + Actor3358: t08 + Owner: Neutral + Location: 192,0 + Actor3359: t01 + Owner: Neutral + Location: 28,60 + Actor3363: t16.husk + Owner: Neutral + Location: 191,82 + Actor3364: t16 + Owner: Neutral + Location: 17,121 + Actor3365: t05 + Owner: Neutral + Location: 74,95 + Actor3366: t17 + Owner: Neutral + Location: 79,95 + Actor3369: t06 + Owner: Neutral + Location: 46,94 + Actor3371: t17 + Owner: Neutral + Location: 76,97 + Actor3372: t01 + Owner: Neutral + Location: 102,137 + Actor3373: t08 + Owner: Neutral + Location: 79,141 + Actor3375: t01 + Owner: Neutral + Location: 187,82 + Actor3394: t06 + Owner: Neutral + Location: 115,86 + Actor3400: t07 + Owner: Neutral + Location: 104,141 + Actor5: t01 + Owner: Neutral + Location: 110,59 + Actor6: t03 + Owner: Neutral + Location: 111,59 + Actor8: t01 + Owner: Neutral + Location: 119,58 + Actor9: t12 + Owner: Neutral + Location: 120,58 + Actor10: t02 + Owner: Neutral + Location: 119,57 + Actor12: t05 + Owner: Neutral + Location: 118,57 + Actor18: t08 + Owner: Neutral + Location: 114,58 + Actor21: t02 + Owner: Neutral + Location: 121,58 + Actor25: t17 + Owner: Neutral + Location: 121,54 + Actor29: t16 + Owner: Neutral + Location: 118,59 + Actor33: t16 + Owner: Neutral + Location: 113,59 + Actor35: t02 + Owner: Neutral + Location: 120,56 + Actor36: t02 + Owner: Neutral + Location: 119,56 + Actor39: t07.husk + Owner: Neutral + Location: 120,55 + Actor40: t02 + Owner: Neutral + Location: 115,58 + Actor41: t13 + Owner: Neutral + Location: 119,55 + Actor42: t07 + Owner: Neutral + Location: 118,56 + Actor47: t02 + Owner: Neutral + Location: 118,55 + Actor51: t03 + Owner: Neutral + Location: 113,58 + Actor52: t08 + Owner: Neutral + Location: 115,60 + Actor62: t13 + Owner: Neutral + Location: 121,55 + Actor64: t03 + Owner: Neutral + Location: 119,54 + Actor66: t12 + Owner: Neutral + Location: 121,56 + Actor73: t06 + Owner: Neutral + Location: 120,57 + Actor74: t01 + Owner: Neutral + Location: 121,53 + Actor78: t06 + Owner: Neutral + Location: 112,59 + Actor81: t13 + Owner: Neutral + Location: 120,59 + Actor82: t07 + Owner: Neutral + Location: 113,57 + Actor86: t07 + Owner: Neutral + Location: 120,54 + Actor89: t17.husk + Owner: Neutral + Location: 118,58 + Actor92: t03 + Owner: Neutral + Location: 116,59 + Actor93: t17 + Owner: Neutral + Location: 114,59 + Actor98: t06 + Owner: Neutral + Location: 114,58 + Actor100: tc02 + Owner: Neutral + Location: 121,59 + Actor101: t13 + Owner: Neutral + Location: 115,57 + Actor104: tc05.husk + Owner: Neutral + Location: 117,60 + Actor107: t13 + Owner: Neutral + Location: 121,57 + Actor114: t06 + Owner: Neutral + Location: 117,59 + Actor117: t13 + Owner: Neutral + Location: 122,56 + Actor118: t17 + Owner: Neutral + Location: 122,53 + Actor119: t01 + Owner: Neutral + Location: 127,59 + Actor120: t17 + Owner: Neutral + Location: 123,55 + Actor121: t06 + Owner: Neutral + Location: 122,57 + Actor123: t16 + Owner: Neutral + Location: 123,52 + Actor125: t01 + Owner: Neutral + Location: 125,53 + Actor128: t07 + Owner: Neutral + Location: 124,52 + Actor130: t03 + Owner: Neutral + Location: 125,58 + Actor132: t02 + Owner: Neutral + Location: 125,54 + Actor136: t01 + Owner: Neutral + Location: 122,54 + Actor137: t03 + Owner: Neutral + Location: 127,58 + Actor138: t16 + Owner: Neutral + Location: 126,59 + Actor143: t12 + Owner: Neutral + Location: 124,53 + Actor144: t05.husk + Owner: Neutral + Location: 123,59 + Actor145: t02 + Owner: Neutral + Location: 122,55 + Actor147: t02 + Owner: Neutral + Location: 125,55 + Actor148: t05 + Owner: Neutral + Location: 128,59 + Actor149: t02 + Owner: Neutral + Location: 126,55 + Actor151: t13 + Owner: Neutral + Location: 126,58 + Actor155: t12.husk + Owner: Neutral + Location: 123,53 + Actor156: t08 + Owner: Neutral + Location: 123,55 + Actor161: t03 + Owner: Neutral + Location: 127,56 + Actor162: t03 + Owner: Neutral + Location: 126,54 + Actor164: t07 + Owner: Neutral + Location: 127,57 + Actor166: t01.husk + Owner: Neutral + Location: 124,55 + Actor169: t15.husk + Owner: Neutral + Location: 123,56 + Actor172: t14 + Owner: Neutral + Location: 123,57 + Actor175: t11 + Owner: Neutral + Location: 123,58 + Actor176: t01 + Owner: Neutral + Location: 124,54 + Actor177: tc03 + Owner: Neutral + Location: 125,57 + Actor179: t08 + Owner: Neutral + Location: 110,65 + Actor180: t12 + Owner: Neutral + Location: 110,62 + Actor184: t02 + Owner: Neutral + Location: 110,61 + Actor189: t06.husk + Owner: Neutral + Location: 110,60 + Actor190: tc02 + Owner: Neutral + Location: 110,63 + Actor191: t03 + Owner: Neutral + Location: 111,64 + Actor196: t01 + Owner: Neutral + Location: 115,63 + Actor197: t03 + Owner: Neutral + Location: 113,62 + Actor198: t02 + Owner: Neutral + Location: 115,61 + Actor199: t05 + Owner: Neutral + Location: 118,62 + Actor201: t08 + Owner: Neutral + Location: 112,64 + Actor206: t01 + Owner: Neutral + Location: 118,63 + Actor209: t12.husk + Owner: Neutral + Location: 117,62 + Actor213: t17 + Owner: Neutral + Location: 113,60 + Actor218: t16 + Owner: Neutral + Location: 117,63 + Actor220: t08 + Owner: Neutral + Location: 121,61 + Actor222: t05 + Owner: Neutral + Location: 120,61 + Actor224: t17 + Owner: Neutral + Location: 111,60 + Actor225: t16 + Owner: Neutral + Location: 114,61 + Actor226: t03 + Owner: Neutral + Location: 120,60 + Actor227: t13.husk + Owner: Neutral + Location: 117,61 + Actor228: t11 + Owner: Neutral + Location: 114,60 + Actor229: t01 + Owner: Neutral + Location: 123,60 + Actor231: t05.husk + Owner: Neutral + Location: 122,60 + Actor234: t03 + Owner: Neutral + Location: 128,60 + Actor237: t05 + Owner: Neutral + Location: 127,60 + Actor240: t12 + Owner: Neutral + Location: 129,63 + Actor241: t03 + Owner: Neutral + Location: 129,62 + Actor246: t01.husk + Owner: Neutral + Location: 130,63 + Actor260: t13 + Owner: Neutral + Location: 129,61 + Actor261: t16 + Owner: Neutral + Location: 127,61 + Actor263: t05 + Owner: Neutral + Location: 117,73 + Actor271: t16 + Owner: Neutral + Location: 119,73 + Actor275: t16 + Owner: Neutral + Location: 117,74 + Actor276: t14.husk + Owner: Neutral + Location: 116,72 + Actor280: t14 + Owner: Neutral + Location: 115,73 + Actor284: t13 + Owner: Neutral + Location: 132,74 + Actor285: t16 + Owner: Neutral + Location: 132,78 + Actor287: t06 + Owner: Neutral + Location: 128,78 + Actor290: t07 + Owner: Neutral + Location: 129,77 + Actor292: t12 + Owner: Neutral + Location: 129,78 + Actor293: t02 + Owner: Neutral + Location: 132,77 + Actor297: t15 + Owner: Neutral + Location: 130,76 + Actor298: t10 + Owner: Neutral + Location: 130,77 + Actor7: t06 + Owner: Neutral + Location: 58,25 + Actor30: t06 + Owner: Neutral + Location: 61,29 + Actor68: t05 + Owner: Neutral + Location: 55,28 + Actor80: t06 + Owner: Neutral + Location: 59,28 + Actor102: t08 + Owner: Neutral + Location: 57,28 + Actor140: t13.husk + Owner: Neutral + Location: 60,27 + Actor158: t01.husk + Owner: Neutral + Location: 62,27 + Actor173: t16 + Owner: Neutral + Location: 56,28 + Actor178: t07 + Owner: Neutral + Location: 60,28 + Actor300: t06 + Owner: Neutral + Location: 61,28 + Actor304: t08 + Owner: Neutral + Location: 55,30 + Actor309: t05.husk + Owner: Neutral + Location: 54,28 + Actor310: t03.husk + Owner: Neutral + Location: 56,27 + Actor311: t03 + Owner: Neutral + Location: 58,28 + Actor314: t16 + Owner: Neutral + Location: 63,27 + Actor315: t12 + Owner: Neutral + Location: 60,26 + Actor318: t05 + Owner: Neutral + Location: 59,26 + Actor320: t02 + Owner: Neutral + Location: 57,29 + Actor325: t13 + Owner: Neutral + Location: 58,26 + Actor330: t07 + Owner: Neutral + Location: 63,28 + Actor331: t13 + Owner: Neutral + Location: 57,28 + Actor335: t13 + Owner: Neutral + Location: 61,27 + Actor336: t01 + Owner: Neutral + Location: 56,29 + Actor338: t17 + Owner: Neutral + Location: 61,26 + Actor339: t02 + Owner: Neutral + Location: 54,29 + Actor341: t01 + Owner: Neutral + Location: 55,27 + Actor344: tc01 + Owner: Neutral + Location: 62,29 + Actor345: t10.husk + Owner: Neutral + Location: 59,25 + Actor346: t15 + Owner: Neutral + Location: 58,27 + Actor349: t15 + Owner: Neutral + Location: 56,26 + Actor351: t11.husk + Owner: Neutral + Location: 58,29 + Actor355: tc02 + Owner: Neutral + Location: 59,30 + Actor356: t02 + Owner: Neutral + Location: 64,28 + Actor359: t03 + Owner: Neutral + Location: 54,36 + Actor360: t03 + Owner: Neutral + Location: 62,35 + Actor363: t03 + Owner: Neutral + Location: 59,32 + Actor366: t12 + Owner: Neutral + Location: 61,32 + Actor367: t03 + Owner: Neutral + Location: 62,33 + Actor368: t02 + Owner: Neutral + Location: 55,35 + Actor369: t08 + Owner: Neutral + Location: 53,34 + Actor370: t13 + Owner: Neutral + Location: 54,34 + Actor371: t02 + Owner: Neutral + Location: 57,31 + Actor372: t03 + Owner: Neutral + Location: 62,34 + Actor377: t17 + Owner: Neutral + Location: 61,35 + Actor380: t12 + Owner: Neutral + Location: 55,33 + Actor381: t01 + Owner: Neutral + Location: 55,34 + Actor391: t02 + Owner: Neutral + Location: 54,35 + Actor392: t02 + Owner: Neutral + Location: 58,32 + Actor393: t02.husk + Owner: Neutral + Location: 55,36 + Actor400: t03 + Owner: Neutral + Location: 58,37 + Actor401: t16 + Owner: Neutral + Location: 55,32 + Actor402: t16 + Owner: Neutral + Location: 60,36 + Actor408: t02 + Owner: Neutral + Location: 54,37 + Actor409: t13 + Owner: Neutral + Location: 59,36 + Actor423: t03 + Owner: Neutral + Location: 53,34 + Actor429: t07 + Owner: Neutral + Location: 58,36 + Actor432: t07 + Owner: Neutral + Location: 60,32 + Actor435: t13 + Owner: Neutral + Location: 62,30 + Actor441: t01 + Owner: Neutral + Location: 53,32 + Actor442: t13 + Owner: Neutral + Location: 54,31 + Actor447: t03 + Owner: Neutral + Location: 58,34 + Actor451: t12 + Owner: Neutral + Location: 60,35 + Actor454: t06 + Owner: Neutral + Location: 59,33 + Actor455: t13 + Owner: Neutral + Location: 58,35 + Actor456: t02 + Owner: Neutral + Location: 53,36 + Actor458: t07 + Owner: Neutral + Location: 55,37 + Actor459: t01 + Owner: Neutral + Location: 59,37 + Actor461: t08.husk + Owner: Neutral + Location: 59,32 + Actor462: t01 + Owner: Neutral + Location: 53,35 + Actor466: t08 + Owner: Neutral + Location: 54,33 + Actor467: t12.husk + Owner: Neutral + Location: 58,33 + Actor468: t12 + Owner: Neutral + Location: 54,33 + Actor470: t16 + Owner: Neutral + Location: 61,30 + Actor476: t16 + Owner: Neutral + Location: 55,31 + Actor477: t12 + Owner: Neutral + Location: 58,31 + Actor478: t11.husk + Owner: Neutral + Location: 56,33 + Actor483: tc01 + Owner: Neutral + Location: 56,32 + Actor484: tc01 + Owner: Neutral + Location: 60,31 + Actor485: tc03 + Owner: Neutral + Location: 56,35 + Actor486: tc04 + Owner: Neutral + Location: 56,30 + Actor487: t12.husk + Owner: Neutral + Location: 59,34 + Actor490: tc04 + Owner: Neutral + Location: 53,30 + Actor491: tc03.husk + Owner: Neutral + Location: 60,34 + Actor2053: t16 + Owner: Neutral + Location: 155,1 + Actor11: t07 + Owner: Neutral + Location: 168,64 + Actor13: t10 + Owner: Neutral + Location: 169,65 + Actor15: t13 + Owner: Neutral + Location: 165,67 + Actor24: t13 + Owner: Neutral + Location: 167,66 + Actor48: t01 + Owner: Neutral + Location: 166,66 + Actor50: tc02 + Owner: Neutral + Location: 167,68 + Actor59: t14 + Owner: Neutral + Location: 169,67 + Actor77: t02 + Owner: Neutral + Location: 171,65 + Actor85: t13 + Owner: Neutral + Location: 174,66 + Actor90: t15 + Owner: Neutral + Location: 162,68 + Actor14: t05 + Owner: Neutral + Location: 132,15 + Actor71: t13 + Owner: Neutral + Location: 130,14 + Actor94: t17 + Owner: Neutral + Location: 135,17 + Actor95: t17 + Owner: Neutral + Location: 134,16 + Actor97: t16 + Owner: Neutral + Location: 133,18 + Actor111: t05 + Owner: Neutral + Location: 132,17 + Actor113: t08 + Owner: Neutral + Location: 135,17 + Actor127: t17 + Owner: Neutral + Location: 133,17 + Actor139: t08.husk + Owner: Neutral + Location: 132,17 + Actor163: t07 + Owner: Neutral + Location: 133,16 + Actor181: t12 + Owner: Neutral + Location: 131,16 + Actor182: t03 + Owner: Neutral + Location: 137,16 + Actor193: t13 + Owner: Neutral + Location: 134,18 + Actor212: t05 + Owner: Neutral + Location: 130,13 + Actor214: t07 + Owner: Neutral + Location: 136,16 + Actor230: t07 + Owner: Neutral + Location: 136,14 + Actor238: t16 + Owner: Neutral + Location: 130,16 + Actor248: t05 + Owner: Neutral + Location: 131,15 + Actor250: t05 + Owner: Neutral + Location: 135,18 + Actor254: t03 + Owner: Neutral + Location: 130,15 + Actor255: t03 + Owner: Neutral + Location: 134,17 + Actor256: tc01 + Owner: Neutral + Location: 136,17 + Actor257: t14 + Owner: Neutral + Location: 137,15 + Actor259: t15 + Owner: Neutral + Location: 136,18 + Actor264: tc02 + Owner: Neutral + Location: 137,19 + Actor266: t16 + Owner: Neutral + Location: 139,17 + Actor268: t08.husk + Owner: Neutral + Location: 139,19 + Actor281: t02 + Owner: Neutral + Location: 143,17 + Actor282: t17 + Owner: Neutral + Location: 140,18 + Actor288: t06 + Owner: Neutral + Location: 138,17 + Actor291: t13 + Owner: Neutral + Location: 141,18 + Actor296: t08 + Owner: Neutral + Location: 142,18 + Actor302: t15 + Owner: Neutral + Location: 142,18 + Actor308: t16 + Owner: Neutral + Location: 138,16 + Actor316: t02 + Owner: Neutral + Location: 136,19 + Actor322: t07 + Owner: Neutral + Location: 135,19 + Actor323: t01 + Owner: Neutral + Location: 139,19 + Actor332: t13 + Owner: Neutral + Location: 140,20 + Actor343: t08 + Owner: Neutral + Location: 141,21 + Actor352: t16 + Owner: Neutral + Location: 140,19 + Actor353: t13 + Owner: Neutral + Location: 141,19 + Actor358: t14 + Owner: Neutral + Location: 138,20 + Actor0: t05 + Owner: Neutral + Location: 67,64 + Actor16: t06 + Owner: Neutral + Location: 66,65 + Actor44: t07 + Owner: Neutral + Location: 68,65 + Actor109: t07 + Owner: Neutral + Location: 69,63 + Actor205: t08 + Owner: Neutral + Location: 68,63 + Actor211: t12 + Owner: Neutral + Location: 69,62 + Actor306: t06 + Owner: Neutral + Location: 69,65 + Actor329: t03 + Owner: Neutral + Location: 70,60 + Actor333: t12 + Owner: Neutral + Location: 70,64 + Actor361: t02 + Owner: Neutral + Location: 69,64 + Actor382: t13.husk + Owner: Neutral + Location: 68,63 + Actor395: t08 + Owner: Neutral + Location: 68,65 + Actor397: t07 + Owner: Neutral + Location: 67,65 + Actor398: t12 + Owner: Neutral + Location: 71,61 + Actor411: t17 + Owner: Neutral + Location: 70,65 + Actor416: t11 + Owner: Neutral + Location: 69,61 + Actor418: tc03 + Owner: Neutral + Location: 70,63 + Actor424: t13 + Owner: Neutral + Location: 70,67 + Actor444: t06 + Owner: Neutral + Location: 67,66 + Actor450: t05 + Owner: Neutral + Location: 70,68 + Actor452: t12 + Owner: Neutral + Location: 68,66 + Actor453: t13 + Owner: Neutral + Location: 70,66 + Actor457: t08 + Owner: Neutral + Location: 66,67 + Actor471: t08 + Owner: Neutral + Location: 68,68 + Actor492: t01 + Owner: Neutral + Location: 69,67 + Actor495: t03 + Owner: Neutral + Location: 69,66 + Actor497: t05 + Owner: Neutral + Location: 80,75 + Actor498: t01.husk + Owner: Neutral + Location: 84,75 + Actor501: t07 + Owner: Neutral + Location: 82,69 + Actor504: t08 + Owner: Neutral + Location: 81,75 + Actor505: t08 + Owner: Neutral + Location: 80,71 + Actor506: t17 + Owner: Neutral + Location: 82,71 + Actor511: t06 + Owner: Neutral + Location: 80,76 + Actor513: t06 + Owner: Neutral + Location: 82,73 + Actor516: t16 + Owner: Neutral + Location: 81,70 + Actor517: t06 + Owner: Neutral + Location: 82,68 + Actor518: t06 + Owner: Neutral + Location: 81,69 + Actor520: t12 + Owner: Neutral + Location: 80,74 + Actor523: t03 + Owner: Neutral + Location: 81,71 + Actor524: t03 + Owner: Neutral + Location: 82,70 + Actor525: t06 + Owner: Neutral + Location: 81,68 + Actor526: t07 + Owner: Neutral + Location: 81,75 + Actor527: t17 + Owner: Neutral + Location: 82,74 + Actor528: t05 + Owner: Neutral + Location: 80,71 + Actor529: t12 + Owner: Neutral + Location: 83,73 + Actor530: t16 + Owner: Neutral + Location: 79,76 + Actor532: t05 + Owner: Neutral + Location: 82,72 + Actor533: tc01 + Owner: Neutral + Location: 83,74 + Actor534: t11.husk + Owner: Neutral + Location: 81,76 + Actor535: tc03 + Owner: Neutral + Location: 80,73 + Actor542: t06 + Owner: Neutral + Location: 84,76 + Actor543: t01 + Owner: Neutral + Location: 86,69 + Actor545: t08 + Owner: Neutral + Location: 87,74 + Actor546: t03 + Owner: Neutral + Location: 85,73 + Actor548: t12 + Owner: Neutral + Location: 85,69 + Actor549: t03 + Owner: Neutral + Location: 86,73 + Actor553: t13 + Owner: Neutral + Location: 86,68 + Actor560: t17 + Owner: Neutral + Location: 85,67 + Actor561: t16 + Owner: Neutral + Location: 88,73 + Actor564: t07 + Owner: Neutral + Location: 85,76 + Actor565: t12 + Owner: Neutral + Location: 88,71 + Actor566: t07 + Owner: Neutral + Location: 86,71 + Actor567: t08 + Owner: Neutral + Location: 89,73 + Actor568: t01 + Owner: Neutral + Location: 87,72 + Actor569: t03 + Owner: Neutral + Location: 86,70 + Actor571: t02 + Owner: Neutral + Location: 85,66 + Actor576: t12 + Owner: Neutral + Location: 88,72 + Actor578: t01 + Owner: Neutral + Location: 85,70 + Actor579: t06 + Owner: Neutral + Location: 85,68 + Actor580: t08 + Owner: Neutral + Location: 86,73 + Actor581: t17 + Owner: Neutral + Location: 89,74 + Actor582: t01 + Owner: Neutral + Location: 85,71 + Actor583: t12 + Owner: Neutral + Location: 86,76 + Actor584: t16 + Owner: Neutral + Location: 87,69 + Actor585: t17 + Owner: Neutral + Location: 87,68 + Actor587: t05 + Owner: Neutral + Location: 87,71 + Actor588: t02.husk + Owner: Neutral + Location: 87,74 + Actor594: t12 + Owner: Neutral + Location: 85,75 + Actor595: t03 + Owner: Neutral + Location: 85,72 + Actor596: t14 + Owner: Neutral + Location: 85,74 + Actor597: tc01 + Owner: Neutral + Location: 87,70 + Actor600: tc05 + Owner: Neutral + Location: 86,75 + Actor601: t01 + Owner: Neutral + Location: 89,75 + Actor603: t08 + Owner: Neutral + Location: 83,79 + Actor604: t03 + Owner: Neutral + Location: 80,77 + Actor605: t02 + Owner: Neutral + Location: 83,77 + Actor606: t17 + Owner: Neutral + Location: 82,77 + Actor611: t15 + Owner: Neutral + Location: 79,78 + Actor612: t12 + Owner: Neutral + Location: 88,77 + Actor615: t13 + Owner: Neutral + Location: 89,77 + Actor616: t06 + Owner: Neutral + Location: 89,78 + Actor619: t02 + Owner: Neutral + Location: 88,78 + Actor620: t06 + Owner: Neutral + Location: 87,77 + Actor115: t10 + Owner: Neutral + Location: 64,89 + Actor202: t07 + Owner: Neutral + Location: 61,87 + Actor465: t13 + Owner: Neutral + Location: 59,85 + Actor602: tc02 + Owner: Neutral + Location: 57,87 + Actor608: tc05 + Owner: Neutral + Location: 56,84 + Actor622: t17 + Owner: Neutral + Location: 63,87 + Actor626: t12 + Owner: Neutral + Location: 54,85 + Actor628: t02 + Owner: Neutral + Location: 62,86 + Actor634: t05 + Owner: Neutral + Location: 53,84 + Actor635: tc04 + Owner: Neutral + Location: 118,36 + Actor639: tc02 + Owner: Neutral + Location: 116,37 + Actor640: tc05 + Owner: Neutral + Location: 118,38 + Actor641: t03 + Owner: Neutral + Location: 121,36 + Actor643: t10 + Owner: Neutral + Location: 115,40 + Actor645: t16 + Owner: Neutral + Location: 116,39 + Actor646: tc01 + Owner: Neutral + Location: 121,37 + Actor647: t06 + Owner: Neutral + Location: 122,34 + Actor1968: split2 + Owner: Neutral + Location: 147,25 + Actor1972: split2 + Owner: Neutral + Location: 66,21 + Actor1974: split2 + Owner: Neutral + Location: 34,32 + Actor1975: split2 + Owner: Neutral + Location: 33,67 + Actor1979: split2 + Owner: Neutral + Location: 38,64 + Actor1981: split2 + Owner: Neutral + Location: 130,98 + Actor1982: split2 + Owner: Neutral + Location: 133,94 + Actor1983: split2 + Owner: Neutral + Location: 135,123 + Actor1985: split2 + Owner: Neutral + Location: 130,122 + Actor1991: split2 + Owner: Neutral + Location: 59,139 + Actor1993: split2 + Owner: Neutral + Location: 182,110 + Actor1996: split2 + Owner: Neutral + Location: 185,103 + Actor1998: split2 + Owner: Neutral + Location: 170,27 + Actor2000: split2 + Owner: Neutral + Location: 134,62 + Actor2001: split2 + Owner: Neutral + Location: 139,61 + Actor2002: swal + Owner: MaleficScrin + Location: 138,91 + Actor2004: swal + Owner: MaleficScrin + Location: 138,92 + Actor2007: swal + Owner: MaleficScrin + Location: 139,91 + Actor2009: swal + Owner: MaleficScrin + Location: 139,92 + Actor2010: swal + Owner: MaleficScrin + Location: 140,91 + Actor2011: swal + Owner: MaleficScrin + Location: 140,92 + Actor2012: swal + Owner: MaleficScrin + Location: 141,91 + Actor2013: swal + Owner: MaleficScrin + Location: 141,92 + Actor2016: swal + Owner: MaleficScrin + Location: 146,91 + Actor2017: swal + Owner: MaleficScrin + Location: 146,92 + Actor2018: swal + Owner: MaleficScrin + Location: 147,91 + Actor2020: swal + Owner: MaleficScrin + Location: 147,92 + Actor2021: swal + Owner: MaleficScrin + Location: 148,91 + Actor2022: swal + Owner: MaleficScrin + Location: 148,92 + Actor2025: swal + Owner: MaleficScrin + Location: 149,91 + Actor2026: swal + Owner: MaleficScrin + Location: 149,92 + Actor2027: swal + Owner: MaleficScrin + Location: 149,93 + Actor2028: swal + Owner: MaleficScrin + Location: 150,92 + Actor2034: swal + Owner: MaleficScrin + Location: 150,93 + Actor2035: swal + Owner: MaleficScrin + Location: 151,93 + Actor2037: swal + Owner: MaleficScrin + Location: 150,94 + Actor2038: swal + Owner: MaleficScrin + Location: 151,94 + Actor2039: swal + Owner: MaleficScrin + Location: 152,93 + Actor2041: swal + Owner: MaleficScrin + Location: 154,93 + Actor2043: swal + Owner: MaleficScrin + Location: 153,93 + Actor2046: swal + Owner: MaleficScrin + Location: 155,93 + Actor2047: swal + Owner: MaleficScrin + Location: 155,94 + Actor2048: swal + Owner: MaleficScrin + Location: 155,95 + Actor2050: swal + Owner: MaleficScrin + Location: 156,96 + Actor2052: swal + Owner: MaleficScrin + Location: 156,95 + Actor2056: swal + Owner: MaleficScrin + Location: 155,96 + Actor2057: swal + Owner: MaleficScrin + Location: 156,97 + Actor2060: swal + Owner: MaleficScrin + Location: 157,97 + Actor2064: swal + Owner: MaleficScrin + Location: 157,99 + Actor2069: swal + Owner: MaleficScrin + Location: 157,98 + Actor2070: swal + Owner: MaleficScrin + Location: 158,99 + Actor2072: swal + Owner: MaleficScrin + Location: 159,99 + Actor2074: swal + Owner: MaleficScrin + Location: 159,100 + Actor2075: swal + Owner: MaleficScrin + Location: 160,100 + Actor2076: swal + Owner: MaleficScrin + Location: 160,99 + Actor2079: swal + Owner: MaleficScrin + Location: 122,102 + Actor2082: swal + Owner: MaleficScrin + Location: 122,103 + Actor2084: swal + Owner: MaleficScrin + Location: 123,103 + Actor2087: swal + Owner: MaleficScrin + Location: 123,102 + Actor2088: swal + Owner: MaleficScrin + Location: 122,107 + Actor2089: swal + Owner: MaleficScrin + Location: 122,108 + Actor2092: swal + Owner: MaleficScrin + Location: 123,108 + Actor2093: swal + Owner: MaleficScrin + Location: 123,107 + Actor2094: swal + Owner: MaleficScrin + Location: 124,108 + Actor2096: swal + Owner: MaleficScrin + Location: 123,109 + Actor2100: swal + Owner: MaleficScrin + Location: 124,109 + Actor2101: swal + Owner: MaleficScrin + Location: 125,109 + Actor2104: swal + Owner: MaleficScrin + Location: 125,110 + Actor2105: swal + Owner: MaleficScrin + Location: 126,110 + Actor2110: swal + Owner: MaleficScrin + Location: 126,109 + Actor2111: swal + Owner: MaleficScrin + Location: 105,109 + Actor2112: swal + Owner: MaleficScrin + Location: 105,110 + Actor2113: swal + Owner: MaleficScrin + Location: 106,110 + Actor2114: swal + Owner: MaleficScrin + Location: 105,111 + Actor2115: swal + Owner: MaleficScrin + Location: 106,111 + Actor2116: swal + Owner: MaleficScrin + Location: 106,109 + Actor2118: swal + Owner: MaleficScrin + Location: 107,110 + Actor2120: swal + Owner: MaleficScrin + Location: 107,109 + Actor2122: swal + Owner: MaleficScrin + Location: 108,109 + Actor2124: swal + Owner: MaleficScrin + Location: 110,109 + Actor2127: swal + Owner: MaleficScrin + Location: 109,109 + Actor2129: swal + Owner: MaleficScrin + Location: 111,109 + Actor2130: swal + Owner: MaleficScrin + Location: 111,110 + Actor2131: swal + Owner: MaleficScrin + Location: 110,110 + Actor2133: swal + Owner: MaleficScrin + Location: 121,108 + Actor2135: swal + Owner: MaleficScrin + Location: 120,108 + Actor2137: swal + Owner: MaleficScrin + Location: 119,108 + Actor2139: swal + Owner: MaleficScrin + Location: 117,108 + Actor2141: swal + Owner: MaleficScrin + Location: 118,108 + Actor2142: swal + Owner: MaleficScrin + Location: 117,109 + Actor2144: swal + Owner: MaleficScrin + Location: 118,109 + Actor2145: swal + Owner: MaleficScrin + Location: 142,123 + Actor2147: swal + Owner: MaleficScrin + Location: 142,124 + Actor2148: swal + Owner: MaleficScrin + Location: 143,124 + Actor2149: swal + Owner: MaleficScrin + Location: 143,123 + Actor2153: swal + Owner: MaleficScrin + Location: 144,124 + Actor2154: swal + Owner: MaleficScrin + Location: 145,124 + Actor2156: swal + Owner: MaleficScrin + Location: 145,123 + Actor2158: swal + Owner: MaleficScrin + Location: 144,123 + Actor2160: swal + Owner: MaleficScrin + Location: 151,121 + Actor2162: swal + Owner: MaleficScrin + Location: 151,120 + Actor2164: swal + Owner: MaleficScrin + Location: 152,121 + Actor2167: swal + Owner: MaleficScrin + Location: 152,120 + Actor2168: swal + Owner: MaleficScrin + Location: 153,120 + Actor2169: swal + Owner: MaleficScrin + Location: 153,119 + Actor2171: swal + Owner: MaleficScrin + Location: 154,119 + Actor2172: swal + Owner: MaleficScrin + Location: 154,120 + Actor2173: swal + Owner: MaleficScrin + Location: 154,118 + Actor2175: swal + Owner: MaleficScrin + Location: 155,119 + Actor2177: swal + Owner: MaleficScrin + Location: 155,118 + Actor2178: swal + Owner: MaleficScrin + Location: 155,117 + Actor2180: swal + Owner: MaleficScrin + Location: 156,117 + Actor2182: swal + Owner: MaleficScrin + Location: 156,118 + Actor2183: swal + Owner: MaleficScrin + Location: 156,116 + Actor2187: swal + Owner: MaleficScrin + Location: 156,115 + Actor2188: swal + Owner: MaleficScrin + Location: 157,115 + Actor2191: swal + Owner: MaleficScrin + Location: 157,116 + Actor2192: swal + Owner: MaleficScrin + Location: 156,114 + Actor2193: swal + Owner: MaleficScrin + Location: 157,114 + Actor2198: swal + Owner: MaleficScrin + Location: 159,101 + Actor2199: swal + Owner: MaleficScrin + Location: 159,102 + Actor2200: swal + Owner: MaleficScrin + Location: 158,102 + Actor2202: swal + Owner: MaleficScrin + Location: 158,103 + Actor2203: swal + Owner: MaleficScrin + Location: 157,103 + Actor2204: swal + Owner: MaleficScrin + Location: 157,104 + Actor2207: swal + Owner: MaleficScrin + Location: 156,104 + Actor2210: swal + Owner: MaleficScrin + Location: 156,105 + Actor2211: swal + Owner: MaleficScrin + Location: 156,106 + Actor2212: swal + Owner: MaleficScrin + Location: 156,107 + Actor2213: swal + Owner: MaleficScrin + Location: 156,109 + Actor2215: swal + Owner: MaleficScrin + Location: 156,108 + Actor2216: swal + Owner: MaleficScrin + Location: 156,110 + Actor2219: swal + Owner: MaleficScrin + Location: 156,111 + Actor2220: swal + Owner: MaleficScrin + Location: 156,112 + Actor2221: swal + Owner: MaleficScrin + Location: 156,113 + Actor2222: swal + Owner: MaleficScrin + Location: 114,120 + Actor2224: swal + Owner: MaleficScrin + Location: 114,119 + Actor2225: swal + Owner: MaleficScrin + Location: 115,120 + Actor2226: swal + Owner: MaleficScrin + Location: 115,119 + Actor2227: swal + Owner: MaleficScrin + Location: 120,119 + Actor2228: swal + Owner: MaleficScrin + Location: 120,120 + Actor2230: swal + Owner: MaleficScrin + Location: 121,120 + Actor2234: swal + Owner: MaleficScrin + Location: 121,119 + Actor2236: swal + Owner: MaleficScrin + Location: 123,119 + Actor2237: swal + Owner: MaleficScrin + Location: 122,119 + Actor2238: swal + Owner: MaleficScrin + Location: 122,118 + Actor2242: swal + Owner: MaleficScrin + Location: 123,118 + Actor2243: swal + Owner: MaleficScrin + Location: 113,118 + Actor2247: swal + Owner: MaleficScrin + Location: 114,118 + Actor2248: swal + Owner: MaleficScrin + Location: 113,117 + Actor2249: swal + Owner: MaleficScrin + Location: 114,117 + Actor2253: swal + Owner: MaleficScrin + Location: 112,118 + Actor2254: swal + Owner: MaleficScrin + Location: 111,119 + Actor2256: swal + Owner: MaleficScrin + Location: 111,118 + Actor2257: swal + Owner: MaleficScrin + Location: 110,119 + Actor2260: swal + Owner: MaleficScrin + Location: 110,118 + Actor2263: swal + Owner: MaleficScrin + Location: 177,117 + Actor2265: swal + Owner: MaleficScrin + Location: 176,117 + Actor2266: swal + Owner: MaleficScrin + Location: 174,117 + Actor2267: swal + Owner: MaleficScrin + Location: 172,117 + Actor2269: swal + Owner: MaleficScrin + Location: 171,117 + Actor2271: swal + Owner: MaleficScrin + Location: 171,122 + Actor2275: swal + Owner: MaleficScrin + Location: 171,120 + Actor2276: swal + Owner: MaleficScrin + Location: 171,118 + Actor2277: swal + Owner: MaleficScrin + Location: 171,121 + Actor2278: swal + Owner: MaleficScrin + Location: 171,119 + Actor2279: swal + Owner: MaleficScrin + Location: 173,117 + Actor2281: swal + Owner: MaleficScrin + Location: 175,117 + Actor2290: swal + Owner: MaleficScrin + Location: 178,117 + Actor2291: swal + Owner: MaleficScrin + Location: 178,118 + Actor2292: swal + Owner: MaleficScrin + Location: 177,118 + Actor2296: swal + Owner: MaleficScrin + Location: 178,116 + Actor2298: swal + Owner: MaleficScrin + Location: 179,117 + Actor2300: swal + Owner: MaleficScrin + Location: 179,116 + Actor2297: swal + Owner: MaleficScrin + Location: 184,116 + Actor2301: swal + Owner: MaleficScrin + Location: 185,117 + Actor2304: swal + Owner: MaleficScrin + Location: 184,117 + Actor2305: swal + Owner: MaleficScrin + Location: 185,116 + Actor2306: swal + Owner: MaleficScrin + Location: 186,117 + Actor2307: swal + Owner: MaleficScrin + Location: 186,118 + Actor2308: swal + Owner: MaleficScrin + Location: 185,118 + Actor2309: swal + Owner: MaleficScrin + Location: 187,117 + Actor2310: swal + Owner: MaleficScrin + Location: 188,117 + Actor2311: swal + Owner: MaleficScrin + Location: 189,117 + Actor2314: swal + Owner: MaleficScrin + Location: 189,118 + Actor2315: swal + Owner: MaleficScrin + Location: 189,119 + Actor2316: swal + Owner: MaleficScrin + Location: 189,120 + Actor2317: swal + Owner: MaleficScrin + Location: 189,121 + Actor2319: swal + Owner: MaleficScrin + Location: 189,122 + Actor2321: swal + Owner: MaleficScrin + Location: 189,123 + Actor2322: swal + Owner: MaleficScrin + Location: 189,125 + Actor2323: swal + Owner: MaleficScrin + Location: 189,124 + Actor2197: swal + Owner: MaleficScrin + Location: 171,123 + Actor2324: swal + Owner: MaleficScrin + Location: 171,124 + Actor2325: swal + Owner: MaleficScrin + Location: 170,123 + Actor2326: swal + Owner: MaleficScrin + Location: 170,124 + Actor2327: swal + Owner: MaleficScrin + Location: 170,130 + Actor2329: swal + Owner: MaleficScrin + Location: 170,131 + Actor2331: swal + Owner: MaleficScrin + Location: 171,130 + Actor2333: swal + Owner: MaleficScrin + Location: 171,131 + Actor2335: swal + Owner: MaleficScrin + Location: 171,132 + Actor2336: swal + Owner: MaleficScrin + Location: 172,131 + Actor2338: swal + Owner: MaleficScrin + Location: 172,132 + Actor2370: swal + Owner: MaleficScrin + Location: 189,126 + Actor2371: swal + Owner: MaleficScrin + Location: 189,127 + Actor2372: swal + Owner: MaleficScrin + Location: 189,128 + Actor2374: swal + Owner: MaleficScrin + Location: 189,129 + Actor2378: swal + Owner: MaleficScrin + Location: 189,130 + Actor2379: swal + Owner: MaleficScrin + Location: 189,131 + Actor2380: swal + Owner: MaleficScrin + Location: 189,132 + Actor2381: swal + Owner: MaleficScrin + Location: 189,134 + Actor2383: swal + Owner: MaleficScrin + Location: 189,135 + Actor2385: swal + Owner: MaleficScrin + Location: 189,136 + Actor2386: swal + Owner: MaleficScrin + Location: 189,133 + Actor2365: swal + Owner: MaleficScrin + Location: 37,103 + Actor2368: swal + Owner: MaleficScrin + Location: 37,102 + Actor2393: swal + Owner: MaleficScrin + Location: 38,103 + Actor2395: swal + Owner: MaleficScrin + Location: 38,102 + Actor2401: swal + Owner: MaleficScrin + Location: 35,102 + Actor2403: swal + Owner: MaleficScrin + Location: 35,101 + Actor2405: swal + Owner: MaleficScrin + Location: 36,102 + Actor2407: swal + Owner: MaleficScrin + Location: 36,101 + Actor2408: swal + Owner: MaleficScrin + Location: 34,101 + Actor2411: swal + Owner: MaleficScrin + Location: 33,101 + Actor2413: swal + Owner: MaleficScrin + Location: 33,100 + Actor2414: swal + Owner: MaleficScrin + Location: 34,100 + Actor2410: swal + Owner: MaleficScrin + Location: 32,100 + Actor2412: swal + Owner: MaleficScrin + Location: 31,100 + Actor2415: swal + Owner: MaleficScrin + Location: 31,99 + Actor2417: swal + Owner: MaleficScrin + Location: 32,99 + Actor2418: swal + Owner: MaleficScrin + Location: 30,99 + Actor2419: swal + Owner: MaleficScrin + Location: 29,99 + Actor2420: swal + Owner: MaleficScrin + Location: 29,98 + Actor2421: swal + Owner: MaleficScrin + Location: 30,98 + Actor2422: swal + Owner: MaleficScrin + Location: 25,96 + Actor2423: swal + Owner: MaleficScrin + Location: 25,95 + Actor2425: swal + Owner: MaleficScrin + Location: 26,95 + Actor2427: swal + Owner: MaleficScrin + Location: 26,96 + Actor2430: swal + Owner: MaleficScrin + Location: 24,95 + Actor2431: swal + Owner: MaleficScrin + Location: 23,95 + Actor2432: swal + Owner: MaleficScrin + Location: 23,94 + Actor2433: swal + Owner: MaleficScrin + Location: 24,94 + Actor2437: swal + Owner: MaleficScrin + Location: 22,94 + Actor2440: swal + Owner: MaleficScrin + Location: 21,94 + Actor2443: swal + Owner: MaleficScrin + Location: 21,93 + Actor2445: swal + Owner: MaleficScrin + Location: 22,93 + Actor2446: swal + Owner: MaleficScrin + Location: 20,93 + Actor2448: swal + Owner: MaleficScrin + Location: 19,93 + Actor2449: swal + Owner: MaleficScrin + Location: 19,92 + Actor2452: swal + Owner: MaleficScrin + Location: 20,92 + Actor2453: swal + Owner: MaleficScrin + Location: 18,92 + Actor2454: swal + Owner: MaleficScrin + Location: 17,92 + Actor2455: swal + Owner: MaleficScrin + Location: 16,92 + Actor2456: swal + Owner: MaleficScrin + Location: 16,93 + Actor2459: swal + Owner: MaleficScrin + Location: 15,93 + Actor2460: swal + Owner: MaleficScrin + Location: 15,92 + Actor2461: swal + Owner: MaleficScrin + Location: 15,94 + Actor2465: swal + Owner: MaleficScrin + Location: 15,95 + Actor2466: swal + Owner: MaleficScrin + Location: 15,96 + Actor2467: swal + Owner: MaleficScrin + Location: 14,96 + Actor2469: swal + Owner: MaleficScrin + Location: 12,96 + Actor2470: swal + Owner: MaleficScrin + Location: 13,96 + Actor2471: swal + Owner: MaleficScrin + Location: 12,97 + Actor2475: swal + Owner: MaleficScrin + Location: 11,97 + Actor2477: swal + Owner: MaleficScrin + Location: 11,96 + Actor2479: swal + Owner: MaleficScrin + Location: 7,100 + Actor2485: swal + Owner: MaleficScrin + Location: 7,99 + Actor2486: swal + Owner: MaleficScrin + Location: 6,99 + Actor2489: swal + Owner: MaleficScrin + Location: 6,100 + Actor2490: swal + Owner: MaleficScrin + Location: 5,99 + Actor2491: swal + Owner: MaleficScrin + Location: 5,100 + Actor2492: swal + Owner: MaleficScrin + Location: 5,101 + Actor2493: swal + Owner: MaleficScrin + Location: 5,102 + Actor2494: swal + Owner: MaleficScrin + Location: 5,103 + Actor2502: swal + Owner: MaleficScrin + Location: 6,102 + Actor2503: swal + Owner: MaleficScrin + Location: 6,103 + Actor2495: swal + Owner: MaleficScrin + Location: 7,109 + Actor2506: swal + Owner: MaleficScrin + Location: 7,110 + Actor2507: swal + Owner: MaleficScrin + Location: 8,110 + Actor2509: swal + Owner: MaleficScrin + Location: 8,109 + Actor2512: swal + Owner: MaleficScrin + Location: 9,110 + Actor2525: swal + Owner: MaleficScrin + Location: 9,111 + Actor2526: swal + Owner: MaleficScrin + Location: 9,112 + Actor2528: swal + Owner: MaleficScrin + Location: 9,113 + Actor2531: swal + Owner: MaleficScrin + Location: 10,113 + Actor2533: swal + Owner: MaleficScrin + Location: 10,114 + Actor2534: swal + Owner: MaleficScrin + Location: 9,114 + Actor2541: swal + Owner: MaleficScrin + Location: 13,114 + Actor2544: swal + Owner: MaleficScrin + Location: 13,115 + Actor2547: swal + Owner: MaleficScrin + Location: 15,114 + Actor2548: swal + Owner: MaleficScrin + Location: 14,114 + Actor2552: swal + Owner: MaleficScrin + Location: 15,115 + Actor2554: swal + Owner: MaleficScrin + Location: 14,115 + Actor2559: swal + Owner: MaleficScrin + Location: 27,134 + Actor2560: swal + Owner: MaleficScrin + Location: 27,135 + Actor2561: swal + Owner: MaleficScrin + Location: 27,136 + Actor2562: swal + Owner: MaleficScrin + Location: 28,136 + Actor2568: swal + Owner: MaleficScrin + Location: 28,135 + Actor2569: swal + Owner: MaleficScrin + Location: 28,134 + Actor2573: swal + Owner: MaleficScrin + Location: 33,133 + Actor2575: swal + Owner: MaleficScrin + Location: 34,133 + Actor2579: swal + Owner: MaleficScrin + Location: 36,133 + Actor2581: swal + Owner: MaleficScrin + Location: 35,133 + Actor2583: swal + Owner: MaleficScrin + Location: 36,132 + Actor2584: swal + Owner: MaleficScrin + Location: 35,132 + Actor2585: swal + Owner: MaleficScrin + Location: 33,134 + Actor2587: swal + Owner: MaleficScrin + Location: 34,134 + Actor2592: swal + Owner: MaleficScrin + Location: 27,137 + Actor2598: swal + Owner: MaleficScrin + Location: 27,138 + Actor2599: swal + Owner: MaleficScrin + Location: 28,138 + Actor2602: swal + Owner: MaleficScrin + Location: 27,139 + Actor2606: swal + Owner: MaleficScrin + Location: 28,139 + Actor2608: swal + Owner: MaleficScrin + Location: 29,139 + Actor2610: swal + Owner: MaleficScrin + Location: 29,140 + Actor2611: swal + Owner: MaleficScrin + Location: 28,140 + Actor2614: swal + Owner: MaleficScrin + Location: 36,139 + Actor2616: swal + Owner: MaleficScrin + Location: 36,140 + Actor2618: swal + Owner: MaleficScrin + Location: 37,139 + Actor2619: swal + Owner: MaleficScrin + Location: 37,140 + Actor2620: swal + Owner: MaleficScrin + Location: 37,138 + Actor2622: swal + Owner: MaleficScrin + Location: 38,139 + Actor2624: swal + Owner: MaleficScrin + Location: 38,138 + Actor2626: swal + Owner: MaleficScrin + Location: 37,132 + Actor2628: swal + Owner: MaleficScrin + Location: 38,132 + Actor2629: swal + Owner: MaleficScrin + Location: 39,132 + Actor2630: swal + Owner: MaleficScrin + Location: 39,133 + Actor2633: swal + Owner: MaleficScrin + Location: 40,134 + Actor2634: swal + Owner: MaleficScrin + Location: 40,133 + Actor2635: swal + Owner: MaleficScrin + Location: 41,134 + Actor2637: swal + Owner: MaleficScrin + Location: 41,135 + Actor2638: swal + Owner: MaleficScrin + Location: 41,136 + Actor2639: swal + Owner: MaleficScrin + Location: 41,137 + Actor2641: swal + Owner: MaleficScrin + Location: 39,138 + Actor2643: swal + Owner: MaleficScrin + Location: 40,138 + Actor2644: swal + Owner: MaleficScrin + Location: 41,138 + Actor2646: swal + Owner: MaleficScrin + Location: 39,130 + Actor2650: swal + Owner: MaleficScrin + Location: 39,131 + Actor2652: swal + Owner: MaleficScrin + Location: 40,131 + Actor2653: swal + Owner: MaleficScrin + Location: 40,130 + Actor2654: swal + Owner: MaleficScrin + Location: 41,129 + Actor2655: swal + Owner: MaleficScrin + Location: 40,129 + Actor2656: swal + Owner: MaleficScrin + Location: 41,130 + Actor2662: swal + Owner: MaleficScrin + Location: 41,128 + Actor2666: swal + Owner: MaleficScrin + Location: 42,129 + Actor2667: swal + Owner: MaleficScrin + Location: 42,128 + Actor2668: swal + Owner: MaleficScrin + Location: 42,126 + Actor2669: swal + Owner: MaleficScrin + Location: 42,127 + Actor2674: swal + Owner: MaleficScrin + Location: 43,128 + Actor2675: swal + Owner: MaleficScrin + Location: 43,127 + Actor2679: swal + Owner: MaleficScrin + Location: 43,126 + Actor2681: swal + Owner: MaleficScrin + Location: 44,127 + Actor2682: swal + Owner: MaleficScrin + Location: 44,126 + Actor2685: swal + Owner: MaleficScrin + Location: 43,125 + Actor2686: swal + Owner: MaleficScrin + Location: 44,125 + Actor2687: swal + Owner: MaleficScrin + Location: 40,132 + Actor2689: proc.scrin + Owner: MaleficScrin + Location: 132,115 + Actor2695: proc.scrin + Owner: MaleficScrin + Location: 135,98 + Actor2696: proc.scrin + Owner: MaleficScrin + Location: 185,119 + Actor2532: proc.scrin + Owner: MaleficScrin + Location: 12,109 + Actor2542: sfac + Owner: MaleficScrin + Location: 139,109 + Actor2697: sfac + Owner: MaleficScrin + Location: 172,119 + Actor2698: nerv + Owner: MaleficScrin + Location: 126,112 + Actor2699: nerv + Owner: MaleficScrin + Location: 30,110 + Actor2704: shar + Owner: MaleficScrin + Location: 188,118 + Actor2708: shar + Owner: MaleficScrin + Location: 175,118 + Actor2703: shar + Owner: MaleficScrin + Location: 173,131 + Actor2709: shar + Owner: MaleficScrin + Location: 188,133 + Actor2710: shar + Owner: MaleficScrin + Location: 34,123 + Actor2711: shar + Owner: MaleficScrin + Location: 26,113 + Actor2713: shar + Owner: MaleficScrin + Location: 34,102 + Actor2715: shar + Owner: MaleficScrin + Location: 22,95 + Actor2716: shar + Owner: MaleficScrin + Location: 14,97 + Actor2717: shar + Owner: MaleficScrin + Location: 9,109 + Actor2719: shar + Owner: MaleficScrin + Location: 39,114 + Actor2720: shar + Owner: MaleficScrin + Location: 153,95 + Actor2721: shar + Owner: MaleficScrin + Location: 156,101 + Actor2723: shar + Owner: MaleficScrin + Location: 138,95 + Actor2726: shar + Owner: MaleficScrin + Location: 126,103 + Actor2729: shar + Owner: MaleficScrin + Location: 153,111 + Actor2730: shar + Owner: MaleficScrin + Location: 141,119 + Actor2734: shar + Owner: MaleficScrin + Location: 122,114 + Actor2735: shar + Owner: MaleficScrin + Location: 103,113 + Actor2737: rea2 + Owner: MaleficScrin + Location: 186,128 + Actor2741: rea2 + Owner: MaleficScrin + Location: 186,125 + Actor2743: rea2 + Owner: MaleficScrin + Location: 183,125 + Actor2744: rea2 + Owner: MaleficScrin + Location: 183,128 + Actor2745: rea2 + Owner: MaleficScrin + Location: 150,106 + Actor2747: rea2 + Owner: MaleficScrin + Location: 150,103 + Actor2748: rea2 + Owner: MaleficScrin + Location: 150,100 + Actor2751: rea2 + Owner: MaleficScrin + Location: 133,111 + Actor2752: rea2 + Owner: MaleficScrin + Location: 32,105 + Actor2539: sfac + Owner: MaleficScrin + Location: 19,108 + Actor2778: srep + Owner: MaleficScrin + Location: 139,99 + Actor2791: sign + Owner: MaleficScrin + Location: 138,113 + Actor2792: rfgn + Owner: MaleficScrin + Location: 34,113 + Actor2793: mani + Owner: MaleficScrin + Location: 143,116 + Actor2797: ptur + Owner: MaleficScrin + Location: 178,115 + Actor2799: ptur + Owner: MaleficScrin + Location: 185,115 + Actor2800: ptur + Owner: MaleficScrin + Location: 169,124 + Actor2803: ptur + Owner: MaleficScrin + Location: 169,130 + Actor2804: ptur + Owner: MaleficScrin + Location: 146,125 + TurretFacing: 661 + Actor2805: ptur + Owner: MaleficScrin + Location: 152,122 + TurretFacing: 641 + Actor2806: ptur + Owner: MaleficScrin + Location: 141,90 + TurretFacing: 900 + Actor2807: ptur + Owner: MaleficScrin + Location: 147,90 + TurretFacing: 879 + Actor2808: ptur + Owner: MaleficScrin + Location: 110,108 + Actor2810: ptur + Owner: MaleficScrin + Location: 118,107 + Actor2811: ptur + Owner: MaleficScrin + Location: 121,102 + Actor2813: ptur + Owner: MaleficScrin + Location: 26,94 + TurretFacing: 934 + Actor2817: ptur + Owner: MaleficScrin + Location: 30,97 + TurretFacing: 920 + Actor2818: ptur + Owner: MaleficScrin + Location: 11,95 + Actor2825: ptur + Owner: MaleficScrin + Location: 7,98 + Actor2826: scol + Owner: MaleficScrin + Location: 6,101 + Actor2827: scol + Owner: MaleficScrin + Location: 13,97 + Actor2828: scol + Owner: MaleficScrin + Location: 17,93 + Actor2833: scol + Owner: MaleficScrin + Location: 24,96 + Actor2835: scol + Owner: MaleficScrin + Location: 30,100 + Actor2837: scol + Owner: MaleficScrin + Location: 36,103 + Actor2842: scol + Owner: MaleficScrin + Location: 40,112 + Actor2845: scol + Owner: MaleficScrin + Location: 36,138 + Actor2846: scol + Owner: MaleficScrin + Location: 29,138 + Actor2849: scol + Owner: MaleficScrin + Location: 109,110 + Actor2850: scol + Owner: MaleficScrin + Location: 119,109 + Actor2851: scol + Owner: MaleficScrin + Location: 140,93 + Actor2855: scol + Owner: MaleficScrin + Location: 148,93 + Actor2852: scol + Owner: MaleficScrin + Location: 176,118 + Actor2856: scol + Owner: MaleficScrin + Location: 187,118 + Actor2857: scol + Owner: MaleficScrin + Location: 152,119 + Actor2858: scol + Owner: MaleficScrin + Location: 144,122 + Actor2861: rea2 + Owner: MaleficScrin + Location: 172,122 + Actor2862: rea2 + Owner: MaleficScrin + Location: 150,97 + Actor2863: rea2 + Owner: MaleficScrin + Location: 118,115 + Actor2864: rea2 + Owner: MaleficScrin + Location: 118,112 + Actor2865: rea2 + Owner: MaleficScrin + Location: 114,112 + Actor2867: rea2 + Owner: MaleficScrin + Location: 37,124 + Actor2868: rea2 + Owner: MaleficScrin + Location: 38,121 + Actor2869: rea2 + Owner: MaleficScrin + Location: 15,107 + Actor2870: ptur + Owner: MaleficScrin + Location: 115,121 + Actor2872: ptur + Owner: MaleficScrin + Location: 120,121 + Actor2873: ptur + Owner: MaleficScrin + Location: 30,141 + TurretFacing: 559 + Actor2874: ptur + Owner: MaleficScrin + Location: 35,141 + TurretFacing: 675 + Actor2844: shar + Owner: MaleficScrin + Location: 38,131 + Actor2875: shar + Owner: MaleficScrin + Location: 40,137 + Actor2876: shar + Owner: MaleficScrin + Location: 42,125 + Actor2878: reac + Owner: MaleficScrin + Location: 37,133 + Actor2881: stlk + Owner: MaleficScrin + Location: 24,92 + SubCell: 3 + Facing: 886 + Actor2883: stlk + Owner: MaleficScrin + Location: 26,92 + SubCell: 3 + Facing: 838 + Actor2885: stlk + Owner: MaleficScrin + Location: 32,95 + SubCell: 3 + Facing: 872 + Actor2886: stlk + Owner: MaleficScrin + Location: 33,97 + SubCell: 3 + Facing: 852 + Actor2889: stlk + Owner: MaleficScrin + Location: 36,99 + SubCell: 3 + Facing: 852 + Actor2890: dark + Owner: MaleficScrin + Location: 23,91 + Facing: 896 + Actor2891: dark + Owner: MaleficScrin + Facing: 896 + Location: 35,98 + Actor2892: dark + Owner: MaleficScrin + Facing: 896 + Location: 31,93 + Actor2895: dark + Owner: MaleficScrin + Location: 110,106 + Facing: 128 + Actor2896: dark + Owner: MaleficScrin + Facing: 128 + Location: 117,103 + Actor2897: dark + Owner: MaleficScrin + Location: 142,88 + Facing: 896 + Actor2898: dark + Owner: MaleficScrin + Facing: 896 + Location: 150,89 + Actor2899: dark + Owner: MaleficScrin + Facing: 128 + Location: 175,114 + Actor2902: dark + Owner: MaleficScrin + Facing: 128 + Location: 188,110 + Actor2903: dark + Owner: MaleficScrin + Facing: 128 + Location: 8,94 + Actor2905: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 852 + Location: 144,88 + Actor2907: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 852 + Location: 139,89 + Actor2908: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 852 + Location: 151,90 + Actor2909: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 852 + Location: 154,91 + Actor2910: stlk + Owner: MaleficScrin + SubCell: 3 + Location: 11,93 + Facing: 128 + Actor2915: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 128 + Location: 6,96 + Actor2918: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 128 + Location: 13,93 + Actor2920: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 128 + Location: 112,106 + Actor2922: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 128 + Location: 116,102 + Actor2925: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 128 + Location: 118,102 + Actor2926: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 128 + Location: 176,113 + Actor2929: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 128 + Location: 187,112 + Actor2930: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 128 + Location: 189,107 + Actor2931: split2 + Owner: Neutral + Location: 10,119 + Actor2934: split2 + Owner: Neutral + Location: 11,126 + Actor2939: 2tnk + Owner: Greece + Facing: 512 + Location: 101,10 + Actor2940: 2tnk + Owner: Greece + Facing: 512 + Location: 103,8 + Actor2943: 2tnk + Owner: Greece + Facing: 512 + Location: 124,10 + Actor2944: 2tnk + Owner: Greece + Facing: 512 + Location: 126,8 + Actor2945: 2tnk + Owner: Greece + Facing: 512 + Location: 128,6 + Actor2947: jeep + Owner: Greece + Location: 129,10 + Facing: 512 + Actor2946: jeep + Owner: Greece + Facing: 512 + Location: 98,14 + Actor2949: ptnk + Owner: Greece + Facing: 512 + Location: 101,8 + Actor2950: ptnk + Owner: Greece + Facing: 512 + Location: 124,7 + Actor2955: e1 + Owner: Greece + Location: 101,12 + SubCell: 1 + Facing: 512 + Actor2958: e1 + Owner: Greece + Location: 101,12 + SubCell: 2 + Facing: 512 + Actor2960: e1 + Owner: Greece + Location: 101,12 + SubCell: 4 + Facing: 512 + Actor2962: e1 + Owner: Greece + Location: 101,12 + SubCell: 5 + Facing: 512 + Actor2954: e1 + Owner: Greece + SubCell: 1 + Facing: 512 + Location: 103,10 + Actor2963: e1 + Owner: Greece + SubCell: 2 + Facing: 512 + Location: 103,10 + Actor2964: e1 + Owner: Greece + SubCell: 4 + Facing: 512 + Location: 103,10 + Actor2966: e1 + Owner: Greece + SubCell: 5 + Facing: 512 + Location: 103,10 + Actor2973: e1 + Owner: Greece + SubCell: 1 + Facing: 512 + Location: 127,10 + Actor2975: e1 + Owner: Greece + SubCell: 2 + Facing: 512 + Location: 127,10 + Actor2977: e1 + Owner: Greece + SubCell: 4 + Facing: 512 + Location: 127,10 + Actor2979: e1 + Owner: Greece + SubCell: 5 + Facing: 512 + Location: 127,10 + Actor2980: e1 + Owner: Greece + SubCell: 1 + Facing: 512 + Location: 129,8 + Actor2981: e1 + Owner: Greece + SubCell: 2 + Facing: 512 + Location: 129,8 + Actor2982: e1 + Owner: Greece + SubCell: 4 + Facing: 512 + Location: 129,8 + Actor2986: e1 + Owner: Greece + SubCell: 5 + Facing: 512 + Location: 129,8 + Actor2987: medi + Owner: Greece + Location: 102,6 + SubCell: 3 + Facing: 512 + Actor2998: e3 + Owner: Greece + Location: 99,9 + SubCell: 1 + Facing: 512 + Actor3001: e3 + Owner: Greece + Location: 99,9 + SubCell: 2 + Facing: 512 + Actor3002: e3 + Owner: Greece + Location: 99,9 + SubCell: 4 + Facing: 512 + Actor3005: e3 + Owner: Greece + Location: 99,9 + SubCell: 5 + Facing: 512 + Actor2995: e3 + Owner: Greece + SubCell: 1 + Facing: 512 + Location: 122,9 + Actor3007: e3 + Owner: Greece + SubCell: 2 + Facing: 512 + Location: 122,9 + Actor3009: e3 + Owner: Greece + SubCell: 4 + Facing: 512 + Location: 122,9 + Actor3012: e3 + Owner: Greece + SubCell: 5 + Facing: 512 + Location: 122,9 + Actor2989: medi + Owner: Greece + SubCell: 3 + Facing: 512 + Location: 127,7 + PlayerStart: waypoint + Owner: Neutral + Location: 112,9 + McvSpawn1: waypoint + Owner: Neutral + Location: 98,1 + McvSpawn2: waypoint + Owner: Neutral + Location: 125,1 + McvDest1: waypoint + Owner: Neutral + Location: 98,9 + McvDest2: waypoint + Owner: Neutral + Location: 125,6 + Actor2769: scrt + Owner: MaleficScrin + Location: 154,106 + Actor2880: swal + Owner: MaleficScrin + Location: 171,133 + Actor3019: swal + Owner: MaleficScrin + Location: 172,133 + Actor3021: swal + Owner: MaleficScrin + Location: 172,134 + Actor3025: swal + Owner: MaleficScrin + Location: 172,135 + Actor3028: swal + Owner: MaleficScrin + Location: 172,136 + Actor3030: swal + Owner: MaleficScrin + Location: 172,137 + Actor3031: swal + Owner: MaleficScrin + Location: 172,138 + Actor3034: swal + Owner: MaleficScrin + Location: 172,139 + Actor3038: swal + Owner: MaleficScrin + Location: 171,140 + Actor3040: swal + Owner: MaleficScrin + Location: 171,141 + Actor3042: swal + Owner: MaleficScrin + Location: 172,141 + Actor3043: swal + Owner: MaleficScrin + Location: 172,140 + Actor3045: swal + Owner: MaleficScrin + Location: 173,141 + Actor3047: swal + Owner: MaleficScrin + Location: 173,142 + Actor3048: swal + Owner: MaleficScrin + Location: 174,142 + Actor3049: swal + Owner: MaleficScrin + Location: 174,141 + Actor3050: swal + Owner: MaleficScrin + Location: 188,141 + Actor3051: swal + Owner: MaleficScrin + Location: 187,140 + Actor3053: swal + Owner: MaleficScrin + Location: 188,140 + Actor3054: swal + Owner: MaleficScrin + Location: 187,141 + Actor3056: swal + Owner: MaleficScrin + Location: 188,139 + Actor3061: swal + Owner: MaleficScrin + Location: 189,139 + Actor3062: swal + Owner: MaleficScrin + Location: 189,138 + Actor3065: swal + Owner: MaleficScrin + Location: 188,138 + Actor3066: swal + Owner: MaleficScrin + Location: 189,137 + Actor3071: swal + Owner: MaleficScrin + Location: 175,142 + Actor3072: swal + Owner: MaleficScrin + Location: 176,142 + Actor3076: swal + Owner: MaleficScrin + Location: 177,142 + Actor3077: swal + Owner: MaleficScrin + Location: 178,142 + Actor3079: swal + Owner: MaleficScrin + Location: 179,142 + Actor3081: swal + Owner: MaleficScrin + Location: 180,142 + Actor3082: swal + Owner: MaleficScrin + Location: 181,143 + Actor3083: swal + Owner: MaleficScrin + Location: 181,142 + Actor3086: swal + Owner: MaleficScrin + Location: 180,143 + Actor3087: swal + Owner: MaleficScrin + Location: 182,143 + Actor3088: swal + Owner: MaleficScrin + Location: 182,142 + Actor3089: swal + Owner: MaleficScrin + Location: 183,142 + Actor3091: swal + Owner: MaleficScrin + Location: 184,142 + Actor3092: swal + Owner: MaleficScrin + Location: 185,142 + Actor3094: swal + Owner: MaleficScrin + Location: 186,142 + Actor3096: swal + Owner: MaleficScrin + Location: 186,141 + Actor3097: shar + Owner: MaleficScrin + Location: 173,140 + Actor3100: scol + Owner: MaleficScrin + Location: 172,130 + Actor3102: rea2 + Owner: MaleficScrin + Location: 184,131 + Actor3103: rea2 + Owner: MaleficScrin + Location: 173,133 + Actor2700: nerv + Owner: MaleficScrin + Location: 181,128 + Actor3105: t12 + Owner: Neutral + Location: 111,55 + Actor3106: t07 + Owner: Neutral + Location: 112,50 + Actor3107: t16 + Owner: Neutral + Location: 116,47 + Actor3109: t17 + Owner: Neutral + Location: 116,51 + Actor3111: t07 + Owner: Neutral + Location: 114,54 + Actor3112: t02 + Owner: Neutral + Location: 111,44 + Actor3115: tc02 + Owner: Neutral + Location: 118,48 + Actor3116: t14 + Owner: Neutral + Location: 122,49 + Actor3118: t13 + Owner: Neutral + Location: 123,45 + Actor3120: t15 + Owner: Neutral + Location: 38,46 + Actor3122: t11 + Owner: Neutral + Location: 45,14 + Actor3125: t08 + Owner: Neutral + Location: 49,9 + Actor3126: t10 + Owner: Neutral + Location: 21,16 + Actor3128: t14 + Owner: Neutral + Location: 15,26 + Actor3130: t13 + Owner: Neutral + Location: 141,42 + Actor3132: t16 + Owner: Neutral + Location: 146,42 + Actor3134: t14 + Owner: Neutral + Location: 142,48 + Actor3138: t16 + Owner: Neutral + Location: 156,77 + Actor3141: t13 + Owner: Neutral + Location: 107,88 + Actor3143: t06 + Owner: Neutral + Location: 106,73 + Actor3145: t06 + Owner: Neutral + Location: 45,67 + Actor3146: t06 + Owner: Neutral + Location: 53,63 + Actor3150: t15 + Owner: Neutral + Location: 51,64 + Actor3151: t10 + Owner: Neutral + Location: 54,55 + Actor3153: t13 + Owner: Neutral + Location: 36,82 + Actor3157: t10 + Owner: Neutral + Location: 24,74 + Actor3161: t13 + Owner: Neutral + Location: 6,80 + Actor3164: t12 + Owner: Neutral + Location: 26,76 + Actor3166: t06 + Owner: Neutral + Location: 23,81 + Actor3169: t07 + Owner: Neutral + Location: 150,71 + Actor3170: t07 + Owner: Neutral + Location: 178,17 + Actor3171: t10 + Owner: Neutral + Location: 178,13 + Actor3173: t12 + Owner: Neutral + Location: 189,49 + Actor3174: t13 + Owner: Neutral + Location: 75,5 + Actor3175: tc03 + Owner: Neutral + Location: 72,3 + Actor3176: t12 + Owner: Neutral + Location: 70,2 + Actor3177: t13 + Owner: Neutral + Location: 58,7 + Actor3179: t16 + Owner: Neutral + Location: 60,5 + Actor3182: tc01 + Owner: Neutral + Location: 41,25 + Actor3183: t12 + Owner: Neutral + Location: 43,28 + Actor3185: t10 + Owner: Neutral + Location: 57,19 + Actor3188: tc05 + Owner: Neutral + Location: 41,44 + Actor3189: t17 + Owner: Neutral + Location: 44,43 + Actor3196: t12 + Owner: Neutral + Location: 43,58 + Actor3197: t15 + Owner: Neutral + Location: 43,52 + Actor3198: t13 + Owner: Neutral + Location: 25,38 + Actor3201: t15 + Owner: Neutral + Location: 7,63 + Actor3203: tc02 + Owner: Neutral + Location: 101,96 + Actor3204: t10 + Owner: Neutral + Location: 102,94 + Actor3206: intl.ai + Owner: MaleficScrin + Facing: 384 + Location: 150,109 + Actor3207: intl.ai + Owner: MaleficScrin + Location: 112,102 + Facing: 136 + Actor3209: intl.ai + Owner: MaleficScrin + Location: 146,85 + Facing: 900 + Actor3211: intl.ai + Owner: MaleficScrin + Location: 145,112 + Facing: 0 + Actor3212: intl.ai + Owner: MaleficScrin + Location: 109,114 + Facing: 845 + Actor3216: intl.ai + Owner: MaleficScrin + Location: 108,113 + Facing: 825 + Actor3218: intl.ai + Owner: MaleficScrin + Facing: 384 + Location: 27,91 + Actor3221: intl.ai + Owner: MaleficScrin + Location: 35,96 + Facing: 384 + TurretFacing@SHIELDS: 6 + TurretFacing: 497 + Actor3224: intl.ai + Owner: MaleficScrin + Location: 12,90 + Facing: 115 + Actor3227: intl.ai + Owner: MaleficScrin + Facing: 384 + Location: 34,137 + Actor3237: intl.ai + Owner: MaleficScrin + Facing: 384 + Location: 33,136 + Actor3238: gunw + Owner: MaleficScrin + Location: 36,106 + Facing: 818 + Actor3240: gunw + Owner: MaleficScrin + Location: 109,121 + Facing: 600 + Actor3241: gunw + Owner: MaleficScrin + Facing: 384 + Location: 101,121 + Actor3242: gunw + Owner: MaleficScrin + Location: 100,116 + Facing: 245 + Actor3244: gunw + Owner: MaleficScrin + Location: 32,128 + Facing: 384 + Actor3245: gunw + Owner: MaleficScrin + Location: 26,116 + Facing: 934 + Actor3246: gunw + Owner: MaleficScrin + Location: 22,114 + Facing: 0 + Actor3247: gunw + Owner: MaleficScrin + Location: 37,110 + Facing: 934 + Actor3249: gunw + Owner: MaleficScrin + Location: 10,101 + Facing: 886 + Actor3255: gunw + Owner: MaleficScrin + Location: 136,116 + Facing: 384 + Actor3256: gunw + Owner: MaleficScrin + Location: 141,103 + Facing: 0 + Actor3259: gunw + Owner: MaleficScrin + Location: 132,103 + Facing: 170 + Actor3260: gunw + Owner: MaleficScrin + Facing: 384 + Location: 185,123 + Actor3263: gunw + Owner: MaleficScrin + Location: 182,119 + Facing: 211 + Actor3266: gunw + Owner: MaleficScrin + Location: 185,140 + Facing: 109 + Actor3267: gunw + Owner: MaleficScrin + Location: 174,137 + Facing: 750 + Actor3270: gunw + Owner: MaleficScrin + Facing: 384 + Location: 154,122 + Actor3271: gunw + Owner: MaleficScrin + Facing: 384 + Location: 147,127 + Actor3277: devo + Owner: MaleficScrin + Location: 154,125 + Facing: 531 + Actor3280: devo + Owner: MaleficScrin + Location: 178,95 + Facing: 163 + Actor3282: devo + Owner: MaleficScrin + Location: 181,92 + Facing: 150 + Actor3284: corr + Owner: MaleficScrin + Location: 177,94 + Facing: 143 + Actor3285: gunw + Owner: MaleficScrin + Location: 182,95 + Facing: 75 + Actor3286: gunw + Owner: MaleficScrin + Location: 179,92 + Facing: 68 + Actor3289: dark + Owner: MaleficScrin + Location: 149,62 + Facing: 0 + Actor3301: stlk + Owner: MaleficScrin + Location: 157,60 + SubCell: 3 + Facing: 384 + Actor3299: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 0 + Location: 155,61 + Actor3297: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 0 + Location: 151,61 + Actor3296: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 0 + Location: 151,64 + Actor3291: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 0 + Location: 147,60 + Actor3305: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 0 + Location: 105,67 + Actor3308: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 0 + Location: 108,69 + Actor3310: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 0 + Location: 87,49 + Actor3311: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 0 + Location: 87,53 + Actor3313: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 0 + Location: 89,54 + Actor3321: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 0 + Location: 73,41 + Actor3323: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 0 + Location: 70,34 + Actor3324: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 0 + Location: 72,38 + Actor3326: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 0 + Location: 98,24 + Actor3331: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 0 + Location: 101,24 + Actor3333: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 0 + Location: 103,23 + Actor3335: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 0 + Location: 100,24 + Actor3339: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 0 + Location: 125,20 + Actor3340: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 0 + Location: 126,19 + Actor3341: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 0 + Location: 127,20 + Actor3342: s4 + Owner: MaleficScrin + Facing: 384 + Location: 37,107 + SubCell: 3 + Actor3343: s4 + Owner: MaleficScrin + Facing: 384 + Location: 29,103 + SubCell: 3 + Actor3345: s4 + Owner: MaleficScrin + Facing: 384 + Location: 14,99 + SubCell: 3 + Actor3346: s4 + Owner: MaleficScrin + Facing: 384 + Location: 23,115 + SubCell: 3 + Actor3350: s4 + Owner: MaleficScrin + Facing: 384 + Location: 28,115 + SubCell: 3 + Actor3351: s4 + Owner: MaleficScrin + Facing: 384 + Location: 19,112 + SubCell: 3 + Actor3353: s4 + Owner: MaleficScrin + Location: 33,127 + SubCell: 3 + Facing: 531 + Actor3354: s4 + Owner: MaleficScrin + Facing: 384 + Location: 31,126 + SubCell: 3 + Actor3356: s4 + Owner: MaleficScrin + Facing: 384 + Location: 35,136 + SubCell: 3 + Actor3360: s4 + Owner: MaleficScrin + Facing: 384 + Location: 149,104 + SubCell: 3 + Actor3361: s4 + Owner: MaleficScrin + Location: 149,102 + SubCell: 3 + Facing: 716 + Actor3362: s4 + Owner: MaleficScrin + Facing: 384 + Location: 154,100 + SubCell: 3 + Actor3367: s4 + Owner: MaleficScrin + Facing: 384 + Location: 131,105 + SubCell: 3 + Actor3368: s4 + Owner: MaleficScrin + Facing: 384 + Location: 118,103 + SubCell: 3 + Actor3370: s4 + Owner: MaleficScrin + Facing: 384 + Location: 107,114 + SubCell: 3 + Actor3374: s4 + Owner: MaleficScrin + Facing: 384 + Location: 106,112 + SubCell: 3 + Actor3376: s4 + Owner: MaleficScrin + Facing: 384 + Location: 110,112 + SubCell: 3 + Actor3377: s4 + Owner: MaleficScrin + Facing: 384 + Location: 117,115 + SubCell: 3 + Actor3378: s4 + Owner: MaleficScrin + Facing: 384 + Location: 182,131 + SubCell: 3 + Actor3379: s4 + Owner: MaleficScrin + Facing: 384 + Location: 181,125 + SubCell: 3 + Actor3380: s4 + Owner: MaleficScrin + Facing: 384 + Location: 176,120 + SubCell: 3 + Actor3381: s4 + Owner: MaleficScrin + Facing: 384 + Location: 186,136 + SubCell: 3 + Actor3382: tpod + Owner: MaleficScrin + Facing: 384 + Location: 145,99 + Actor3383: tpod + Owner: MaleficScrin + Location: 115,109 + Facing: 197 + Actor3384: tpod + Owner: MaleficScrin + Facing: 384 + Location: 17,96 + Actor3385: tpod + Owner: MaleficScrin + Facing: 384 + Location: 29,129 + Actor3386: tpod + Owner: MaleficScrin + Location: 187,114 + Facing: 163 + Actor3387: stlk + Owner: MaleficScrin + Location: 62,11 + SubCell: 3 + Facing: 654 + Actor3388: stlk + Owner: MaleficScrin + Location: 64,11 + SubCell: 3 + Facing: 600 + Actor3389: stlk + Owner: MaleficScrin + Location: 64,9 + SubCell: 3 + Facing: 791 + Actor3390: dark + Owner: MaleficScrin + Location: 67,10 + Facing: 647 + ScriptTags: HardAndAbove + Actor3391: tpod + Owner: MaleficScrin + Facing: 384 + Location: 120,126 + Actor3392: s1 + Owner: MaleficScrin + Facing: 384 + Location: 122,126 + SubCell: 3 + Actor3393: s1 + Owner: MaleficScrin + Facing: 384 + Location: 119,124 + SubCell: 3 + Actor3395: s1 + Owner: MaleficScrin + Facing: 384 + Location: 117,124 + SubCell: 3 + Actor3396: s1 + Owner: MaleficScrin + Facing: 384 + Location: 117,125 + SubCell: 3 + Actor3397: s1 + Owner: MaleficScrin + Facing: 384 + Location: 124,129 + SubCell: 3 + Actor3398: s1 + Owner: MaleficScrin + Facing: 384 + Location: 124,129 + SubCell: 1 + Actor3399: s1 + Owner: MaleficScrin + Facing: 384 + Location: 149,102 + SubCell: 1 + Actor3404: s1 + Owner: MaleficScrin + Facing: 384 + Location: 112,104 + SubCell: 3 + Actor3405: s1 + Owner: MaleficScrin + Facing: 384 + Location: 112,104 + SubCell: 1 + Actor3406: s1 + Owner: MaleficScrin + Facing: 384 + Location: 101,119 + SubCell: 3 + Actor3413: s1 + Owner: MaleficScrin + Facing: 384 + Location: 41,120 + SubCell: 3 + Actor3414: s1 + Owner: MaleficScrin + Facing: 384 + Location: 41,120 + SubCell: 1 + Actor3415: s1 + Owner: MaleficScrin + Facing: 384 + Location: 41,118 + SubCell: 3 + Actor3416: s1 + Owner: MaleficScrin + Facing: 384 + Location: 33,119 + SubCell: 3 + Actor3420: s1 + Owner: MaleficScrin + Facing: 384 + Location: 34,138 + SubCell: 3 + Actor3421: s1 + Owner: MaleficScrin + Facing: 384 + Location: 34,138 + SubCell: 1 + Actor3422: s1 + Owner: MaleficScrin + Facing: 384 + Location: 30,130 + SubCell: 3 + Actor3424: s1 + Owner: MaleficScrin + Facing: 384 + Location: 180,93 + SubCell: 3 + Actor3425: s1 + Owner: MaleficScrin + Facing: 384 + Location: 180,93 + SubCell: 1 + Actor3426: s1 + Owner: MaleficScrin + Facing: 384 + Location: 184,92 + SubCell: 3 + Actor3427: s1 + Owner: MaleficScrin + Facing: 384 + Location: 183,91 + SubCell: 3 + Actor3428: s1 + Owner: MaleficScrin + Facing: 384 + Location: 174,97 + SubCell: 3 + Actor3429: s1 + Owner: MaleficScrin + Facing: 384 + Location: 179,96 + SubCell: 3 + Actor3430: s1 + Owner: MaleficScrin + Facing: 384 + Location: 177,96 + SubCell: 3 + Actor3431: s1 + Owner: MaleficScrin + Facing: 384 + Location: 153,61 + SubCell: 3 + Actor3432: s1 + Owner: MaleficScrin + Facing: 384 + Location: 155,63 + SubCell: 3 + Actor3436: s1 + Owner: MaleficScrin + Location: 89,65 + SubCell: 3 + Facing: 1023 + Actor3437: s1 + Owner: MaleficScrin + SubCell: 3 + Location: 96,67 + Facing: 934 + TurretFacing: 497 + Actor3401: s1 + Owner: MaleficScrin + SubCell: 3 + Facing: 934 + Location: 142,105 + Actor3403: s1 + Owner: MaleficScrin + SubCell: 3 + Facing: 934 + Location: 155,101 + Actor3402: s1 + Owner: MaleficScrin + SubCell: 3 + Facing: 934 + Location: 149,107 + Actor3423: s1 + Owner: MaleficScrin + SubCell: 3 + Facing: 934 + Location: 106,122 + Actor3417: s1 + Owner: MaleficScrin + SubCell: 3 + Facing: 934 + Location: 23,117 + Actor3410: s1 + Owner: MaleficScrin + SubCell: 3 + Facing: 934 + Location: 34,109 + Actor3411: s1 + Owner: MaleficScrin + SubCell: 3 + Facing: 934 + Location: 32,103 + Actor3412: s1 + Owner: MaleficScrin + SubCell: 3 + Facing: 934 + Location: 37,112 + Actor3407: s1 + Owner: MaleficScrin + SubCell: 3 + Facing: 934 + Location: 15,99 + Actor3408: s1 + Owner: MaleficScrin + SubCell: 3 + Facing: 934 + Location: 15,98 + Actor3409: s1 + Owner: MaleficScrin + SubCell: 3 + Facing: 934 + Location: 19,96 + Actor3419: s1 + Owner: MaleficScrin + SubCell: 3 + Facing: 934 + Location: 13,108 + Actor3418: s1 + Owner: MaleficScrin + SubCell: 3 + Facing: 934 + Location: 16,110 + Actor3438: s1 + Owner: MaleficScrin + SubCell: 3 + Facing: 934 + Location: 40,98 + Actor3439: s1 + Owner: MaleficScrin + SubCell: 3 + Facing: 934 + Location: 4,92 + Actor3440: stlk + Owner: MaleficScrin + Facing: 384 + Location: 177,33 + SubCell: 3 + Actor3441: stlk + Owner: MaleficScrin + Facing: 384 + Location: 178,34 + SubCell: 3 + Actor3442: stlk + Owner: MaleficScrin + Facing: 384 + Location: 181,37 + SubCell: 3 + Actor3443: stlk + Owner: MaleficScrin + Facing: 384 + Location: 178,22 + SubCell: 3 + Actor3445: stlk + Owner: MaleficScrin + Facing: 384 + Location: 178,21 + SubCell: 3 + Actor3446: stlk + Owner: MaleficScrin + Facing: 384 + Location: 176,23 + SubCell: 3 + Actor3448: stlk + Owner: MaleficScrin + Location: 23,67 + SubCell: 3 + Facing: 913 + Actor3447: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 913 + Location: 21,66 + Actor3444: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 913 + Location: 20,68 + Actor3451: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 913 + Location: 36,52 + Actor3449: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 913 + Location: 38,54 + Actor3450: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 913 + Location: 39,56 + Actor3454: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 913 + Location: 36,19 + Actor3453: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 913 + Location: 34,17 + Actor3452: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 913 + Location: 33,15 + Actor3459: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 913 + Location: 67,77 + Actor3456: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 913 + Location: 69,75 + Actor3457: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 913 + Location: 70,77 + Actor3458: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 913 + Location: 71,78 + Actor3455: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 913 + Location: 63,75 + Actor3461: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 913 + Location: 90,85 + Actor3460: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 913 + Location: 83,89 + Actor3462: lace + Owner: MaleficScrin + Location: 65,73 + Facing: 709 + Actor3463: lace + Owner: MaleficScrin + Location: 69,78 + Facing: 0 + Actor3464: lace + Owner: MaleficScrin + Location: 71,79 + Facing: 934 + Actor3465: lace + Owner: MaleficScrin + Facing: 384 + Location: 155,37 + Actor3466: lace + Owner: MaleficScrin + Facing: 384 + Location: 156,38 + Actor3467: lace + Owner: MaleficScrin + Facing: 384 + Location: 113,127 + Actor3468: lace + Owner: MaleficScrin + Facing: 384 + Location: 120,133 + Actor3469: lace + Owner: MaleficScrin + Facing: 384 + Location: 126,82 + Actor3470: lace + Owner: MaleficScrin + Facing: 384 + Location: 126,79 + Actor3471: lace + Owner: MaleficScrin + Facing: 384 + Location: 123,80 + LeftGateway: wormholexxl + Owner: MaleficScrin + Location: 28,121 + MiddleGateway: wormholexxl + Owner: MaleficScrin + Location: 105,118 + RightGateway: wormholexxl + Owner: MaleficScrin + Location: 180,137 + LeftPath1: waypoint + Owner: Neutral + Location: 20,103 + LeftPath2: waypoint + Owner: Neutral + Location: 34,89 + LeftPath3: waypoint + Owner: Neutral + Location: 53,78 + LeftPath4: waypoint + Owner: Neutral + Location: 52,51 + LeftPath5: waypoint + Owner: Neutral + Location: 71,36 + LeftPath6: waypoint + Owner: Neutral + Location: 88,32 + LeftPath7: waypoint + Owner: Neutral + Location: 96,1 + MiddlePath1: waypoint + Owner: Neutral + Location: 114,100 + MiddlePath3: waypoint + Owner: Neutral + Location: 106,47 + MiddlePath4: waypoint + Owner: Neutral + Location: 100,1 + RightPath1: waypoint + Owner: Neutral + Location: 168,127 + RightPath2: waypoint + Owner: Neutral + Location: 146,121 + RightPath3: waypoint + Owner: Neutral + Location: 144,90 + RightPath4: waypoint + Owner: Neutral + Location: 153,81 + RightPath5: waypoint + Owner: Neutral + Location: 153,56 + RightPath7: waypoint + Owner: Neutral + Location: 124,1 + LeftWarpSphere: wsph + Owner: MaleficScrin + Location: 14,101 + LeftGrav: grav + Owner: MaleficScrin + Location: 36,117 + RightGrav: grav + Owner: MaleficScrin + Location: 176,127 + RightWarpSphere: wsph + Owner: MaleficScrin + Location: 176,121 + RightPortal: port + Owner: MaleficScrin + Location: 181,121 + MiddleGrav1: grav + Owner: MaleficScrin + Location: 138,103 + MiddleGrav3: grav + Owner: MaleficScrin + Location: 145,107 + LeftFlankPath1: waypoint + Owner: Neutral + Location: 20,56 + LeftFlankPath2a: waypoint + Owner: Neutral + Location: 23,26 + LeftFlankPath2b: waypoint + Owner: Neutral + Location: 45,37 + LeftFlankPath3: waypoint + Owner: Neutral + Location: 52,15 + LeftMiddlePath1: waypoint + Owner: Neutral + Location: 87,56 + RightFlankPath1: waypoint + Owner: Neutral + Location: 181,87 + RightFlankPath2: waypoint + Owner: Neutral + Location: 186,45 + MiddleWarpSphere: wsph + Owner: MaleficScrin + Location: 134,103 + MiddleGrav2: grav + Owner: MaleficScrin + Location: 145,102 + Actor2750: rea2 + Owner: MaleficScrin + Location: 147,95 + Actor2749: rea2 + Owner: MaleficScrin + Location: 135,108 + Actor2733: shar + Owner: MaleficScrin + TurretFacing: 192 + Location: 129,114 + MiddlePortal: port + Owner: MaleficScrin + Location: 129,108 + Actor2757: rea2 + Owner: MaleficScrin + Location: 18,98 + LeftPortal: port + Owner: MaleficScrin + Location: 30,102 + Actor2758: rea2 + Owner: MaleficScrin + Location: 27,106 + Actor2760: rea2 + Owner: MaleficScrin + Location: 23,104 + RightFlankPath3: waypoint + Owner: Neutral + Location: 173,15 + RightPath6a: waypoint + Owner: Neutral + Location: 132,36 + RightPath6b: waypoint + Owner: Neutral + Location: 160,25 + Actor2790: split2 + Owner: Neutral + Location: 74,89 + Actor3435: s1 + Owner: MaleficScrin + Facing: 40 + Location: 89,68 + SubCell: 3 + Actor3434: s1 + Owner: MaleficScrin + TurretFacing: 0 + Facing: 947 + Location: 98,71 + SubCell: 3 + Actor3433: s1 + Owner: MaleficScrin + Facing: 934 + Location: 98,73 + SubCell: 3 + Actor3315: stlk + Owner: MaleficScrin + Facing: 0 + Location: 89,56 + SubCell: 3 + Actor3318: stlk + Owner: MaleficScrin + Facing: 0 + Location: 89,52 + SubCell: 3 + Actor3304: stlk + Owner: MaleficScrin + Facing: 0 + Location: 104,69 + SubCell: 3 + Actor2937: 2tnk + Owner: Greece + Location: 93,8 + Facing: 512 + Actor2938: 2tnk + Owner: Greece + Facing: 512 + Location: 95,10 + Actor2948: ptnk + Owner: Greece + Location: 95,8 + Facing: 512 + Actor2967: e1 + Owner: Greece + SubCell: 1 + Facing: 512 + Location: 93,10 + Actor2970: e1 + Owner: Greece + SubCell: 2 + Facing: 512 + Location: 93,10 + Actor2971: e1 + Owner: Greece + SubCell: 4 + Facing: 512 + Location: 93,10 + Actor2972: e1 + Owner: Greece + SubCell: 5 + Facing: 512 + Location: 93,10 + Actor2988: medi + Owner: Greece + SubCell: 3 + Facing: 512 + Location: 94,6 + Actor2761: t16 + Owner: Neutral + Location: 90,131 + Actor2764: t15 + Owner: Neutral + Location: 100,56 + Actor2765: tc02 + Owner: Neutral + Location: 99,59 + Actor2772: t10 + Owner: Neutral + Location: 99,53 + Actor2774: t07 + Owner: Neutral + Location: 102,55 + Actor2775: t13 + Owner: Neutral + Location: 99,57 + Actor2782: t13 + Owner: Neutral + Location: 99,50 + Actor2783: t17 + Owner: Neutral + Location: 103,63 + Actor2785: utilpol2 + Owner: Neutral + Location: 91,93 + Actor2787: utilpol1 + Owner: Neutral + Location: 96,102 + Actor2788: utilpol1 + Owner: Neutral + Location: 91,19 + HighwayExit: waypoint + Owner: Neutral + Location: 94,1 + HighwayPath1: waypoint + Owner: Neutral + Location: 94,100 + MiddlePath2: waypoint + Owner: Neutral + Location: 109,84 + Actor2832: split2 + Owner: Neutral + Location: 77,68 + Actor2879: shrw + Owner: MaleficScrin + Location: 65,137 + Facing: 907 + Actor2912: shrw + Owner: MaleficScrin + Location: 56,134 + Facing: 941 + Actor2919: stlk + Owner: MaleficScrin + Location: 65,135 + SubCell: 3 + Facing: 825 + Actor3014: stlk + Owner: MaleficScrin + Location: 61,132 + SubCell: 3 + Facing: 0 + Actor3015: intl.ai + Owner: MaleficScrin + Facing: 384 + Location: 15,131 + Actor3041: s3 + Owner: MaleficScrin + Facing: 384 + Location: 17,131 + SubCell: 3 + Actor3113: gunw + Owner: MaleficScrin + Facing: 384 + Location: 17,134 + Actor3127: gunw + Owner: MaleficScrin + Facing: 384 + Location: 12,117 + Actor3144: stlk + Owner: MaleficScrin + Facing: 384 + Location: 7,118 + SubCell: 3 + Actor3472: stlk + Owner: MaleficScrin + Facing: 384 + Location: 186,134 + SubCell: 3 + Actor3473: stlk + Owner: MaleficScrin + Facing: 384 + Location: 188,124 + SubCell: 3 + Actor3474: stlk + Owner: MaleficScrin + Facing: 384 + Location: 173,136 + SubCell: 3 + Actor3475: stlk + Owner: MaleficScrin + Facing: 384 + Location: 184,141 + SubCell: 3 + Actor3476: stlk + Owner: MaleficScrin + Facing: 384 + Location: 137,111 + SubCell: 3 + Actor3477: stlk + Owner: MaleficScrin + Facing: 384 + Location: 153,105 + SubCell: 3 + Actor3478: stlk + Owner: MaleficScrin + Facing: 384 + Location: 117,113 + SubCell: 3 + Actor3479: stlk + Owner: MaleficScrin + Facing: 384 + Location: 122,116 + SubCell: 3 + Actor3480: stlk + Owner: MaleficScrin + Facing: 384 + Location: 132,114 + SubCell: 3 + Actor3481: stlk + Owner: MaleficScrin + Facing: 384 + Location: 24,107 + SubCell: 3 + Actor3482: stlk + Owner: MaleficScrin + Facing: 384 + Location: 37,114 + SubCell: 3 + Actor3483: s3 + Owner: MaleficScrin + Location: 16,106 + SubCell: 3 + Facing: 538 + Actor3484: s3 + Owner: MaleficScrin + Facing: 384 + Location: 22,104 + SubCell: 3 + Actor3485: s3 + Owner: MaleficScrin + Facing: 384 + Location: 23,112 + SubCell: 3 + Actor3486: s3 + Owner: MaleficScrin + Location: 18,103 + SubCell: 3 + Facing: 0 + Actor3487: s3 + Owner: MaleficScrin + Facing: 384 + Location: 18,114 + SubCell: 3 + Actor3488: s3 + Owner: MaleficScrin + Location: 16,94 + SubCell: 3 + Facing: 170 + Actor3489: s3 + Owner: MaleficScrin + Location: 42,116 + SubCell: 3 + Facing: 804 + Actor3490: s3 + Owner: MaleficScrin + Facing: 384 + Location: 40,120 + SubCell: 3 + Actor3491: s3 + Owner: MaleficScrin + Location: 38,111 + SubCell: 3 + Facing: 757 + Actor3492: s3 + Owner: MaleficScrin + Location: 22,119 + SubCell: 3 + Facing: 477 + Actor3493: s3 + Owner: MaleficScrin + Facing: 384 + Location: 137,105 + SubCell: 3 + Actor3494: s3 + Owner: MaleficScrin + Location: 142,103 + SubCell: 3 + Facing: 384 + Actor3495: s3 + Owner: MaleficScrin + Facing: 384 + Location: 147,106 + SubCell: 3 + Actor3496: s3 + Owner: MaleficScrin + Facing: 384 + Location: 148,110 + SubCell: 3 + Actor3497: s3 + Owner: MaleficScrin + Location: 141,112 + SubCell: 3 + Facing: 620 + Actor3498: s3 + Owner: MaleficScrin + Facing: 384 + Location: 134,110 + SubCell: 3 + Actor3499: s3 + Owner: MaleficScrin + Facing: 384 + Location: 148,98 + SubCell: 3 + Actor3500: s3 + Owner: MaleficScrin + Location: 136,102 + SubCell: 3 + Facing: 770 + Actor3501: s3 + Owner: MaleficScrin + Location: 135,115 + SubCell: 3 + Facing: 552 + Actor3502: s3 + Owner: MaleficScrin + Location: 147,113 + SubCell: 3 + Facing: 661 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ad-nihilum-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/missions/main-campaign/ca47-ad-nihilum/r_vengdet.aud b/mods/ca/missions/main-campaign/ca47-ad-nihilum/r_vengdet.aud new file mode 100644 index 0000000000..af606ffbeb Binary files /dev/null and b/mods/ca/missions/main-campaign/ca47-ad-nihilum/r_vengdet.aud differ diff --git a/mods/ca/missions/main-campaign/ca48-banishment/banishment-rules.yaml b/mods/ca/missions/main-campaign/ca48-banishment/banishment-rules.yaml new file mode 100644 index 0000000000..3984a7a58f --- /dev/null +++ b/mods/ca/missions/main-campaign/ca48-banishment/banishment-rules.yaml @@ -0,0 +1,180 @@ +^Palettes: + PaletteFromFile@terrain-temperat: + Filename: ca|missions/main-campaign/ca47-ad-nihilum/dartmoor.pal + FlashPostProcessEffect@LIGHTNINGSTRIKE: + Type: LightningStrike + WeatherOverlay@RAIN: + WindTick: 150, 550 + UseSquares: false + ScatterDirection: 0, 0 + Gravity: 20, 25 + SwingOffset: 0, 0 + SwingSpeed: 0, 0 + SwingAmplitude: 0, 0 + ParticleColors: 72aaae, 72aea6, 5caea3, 6da69f + LineTailAlphaValue: 30 + ParticleSize: 1, 1 + ParticleDensityFactor: 10 + TintPostProcessEffect: + Red: 1 + Green: 1 + Blue: 1.1 + Ambient: 0.8 + +^BaseWorld: + TerrainLighting: + +World: + LuaScript: + Scripts: campaign.lua, banishment.lua + MissionData: + Briefing: The Malefic Scrin interstellar gateway has been located. Four of our bases along the Dahme river were overrun and our forces were pushed out of the area.\n\nOur assumption is that if we can drive the Malefic forces back and close this gateway, then the Malefic will no longer have a presence on Earth. We must do this before more of their Void Engines can be sent through.\n\nAn unusually high number of Nerve Centers have been established in the area. All of them must be destroyed for the gateway to be closed.\n\nReclaim our fallen bases by clearing out any Malefic forces and bring them back into operation, then locate and destroy all Scrin Nerve Centers. + MapOptions: + ShortGameCheckboxEnabled: False + MusicPlaylist: + StartingMusic: drill + +Player: + PlayerResources: + DefaultCash: 6000 + ProvidesPrerequisitesOnTimeline: + PauseOnCondition: !first-base-secured + ExternalCondition@FirstBaseSecured: + Condition: first-base-secured + ProvidesPrerequisite@FirstBaseSecured: + Prerequisite: first.base.secured + RequiresCondition: first-base-secured + +# Enable subfaction specific tech + +SNIP: + Buildable: + Prerequisites: ~tent, anyradar + +SEAL: + Buildable: + Prerequisites: ~tent, atek + +RTNK: + Buildable: + Prerequisites: ~vehicles.allies + +TNKD: + Buildable: + Prerequisites: anyradar, ~vehicles.allies + +CHPR: + Buildable: + Prerequisites: atek, ~vehicles.allies + +BATF: + Buildable: + Prerequisites: atek, ~vehicles.allies + +NHAW: + Buildable: + Prerequisites: ~aircraft.allies + +HTUR: + Buildable: + Prerequisites: ~structures.allies, anyradar + +entrench.upgrade: + Buildable: + Prerequisites: anyradar, ~radar.allies + +apb.upgrade: + Buildable: + Prerequisites: atek + +tflx.upgrade: + Buildable: + Prerequisites: pdox + +^VeilOfWarPower: + SpawnActorPowerCA@VeilOfWar: + Prerequisites: ~radar.allies + +# Misc + +STLK: + Cloak@NORMAL: + CloakDelay: 750 + RequiresCondition: !cloak-force-disabled && !being-warped && !parachute + GrantTimedCondition@Uncloaked: + RequiresCondition: !hidden + DummyConditionConsumer@cloak-active: + Condition: cloak-active + DummyConditionConsumer@cloak-charging: + Condition: cloak-charging + +FLARE: + RevealsShroud: + Range: 12c0 + +LST.MCV: + Inherits: LST + -Buildable: + RenderSprites: + Image: lst + Cargo: + InitialUnits: mcv + +WCHR: + AutoTarget: + InitialStanceAI: AttackAnything + +MCV: + Buildable: + Prerequisites: vehicles.mcv, ~vehicles.ra, ~mcv.allowed + +mcv.allowed: + Inherits@DUMMY: ^InvisibleDummy + ProvidesPrerequisite: + +HOSP: + PeriodicProducerCA@Initial: + Type: Hospital + ChargeDuration: 9999999 + InitialChargeDuration: 5 + Actors: medi, medi + RequiresCondition: !is-neutral && !first-base-secured + ResetTraitOnOwnerChange: true + PeriodicProducerCA@MEDIC: + RequiresCondition: !is-neutral && !scrinplayer && !owned-by-ai && first-base-secured + PeriodicProducerCA@REJUVENATOR: + RequiresCondition: !is-neutral && scrinplayer && !owned-by-ai && first-base-secured + GrantConditionOnPrerequisite@FirstBaseSecured: + Prerequisites: first.base.secured + Condition: first-base-secured + +HOSP.Rebuilt: + -PeriodicProducerCA@Initial: + +MACS: + PeriodicProducerCA@Initial: + Type: Macs + ChargeDuration: 9999999 + InitialChargeDuration: 5 + Actors: mech, mech + RequiresCondition: !is-neutral && !first-base-secured + ResetTraitOnOwnerChange: true + PeriodicProducerCA@MECHANIC: + RequiresCondition: !is-neutral && !scrinplayer && !owned-by-ai && first-base-secured + PeriodicProducerCA@ARTIFICER: + RequiresCondition: !is-neutral && scrinplayer && !owned-by-ai && first-base-secured + GrantConditionOnPrerequisite@FirstBaseSecured: + Prerequisites: first.base.secured + Condition: first-base-secured + +MACS.Rebuilt: + -PeriodicProducerCA@Initial: + +# Hunt() requires only 1 AttackBase +DEVA: + -AttackFrontalCharged: + -Armament@PRIMARYUPG: + -AmbientSound@CHARGE: + -WithIdleOverlay@CHARGE1: + -WithIdleOverlay@CHARGE2: + -WithIdleOverlay@CHARGE3: diff --git a/mods/ca/missions/main-campaign/ca48-banishment/banishment.lua b/mods/ca/missions/main-campaign/ca48-banishment/banishment.lua new file mode 100644 index 0000000000..91c6dd5054 --- /dev/null +++ b/mods/ca/missions/main-campaign/ca48-banishment/banishment.lua @@ -0,0 +1,500 @@ +MissionDir = "ca|missions/main-campaign/ca48-banishment" + +SuperweaponsEnabledTime = { + easy = DateTime.Minutes(300), + normal = DateTime.Minutes(120), + hard = DateTime.Minutes(60), + vhard = DateTime.Minutes(40), + brutal = DateTime.Minutes(30) +} + +Bases = { + { Name = "SouthEast", Center = SEBaseCenter, TopLeft = SEBaseTopLeft, BottomRight = SEBaseBottomRight, Secured = false, IsPrimary = true }, + { Name = "SouthWest", Center = SWBaseCenter, TopLeft = SWBaseTopLeft, BottomRight = SWBaseBottomRight, Secured = false, IsPrimary = true }, + { Name = "NorthEast", Center = NEBaseCenter, TopLeft = NEBaseTopLeft, BottomRight = NEBaseBottomRight, Secured = false, IsPrimary = true }, + { Name = "NorthWest", Center = NWBaseCenter, TopLeft = NWBaseTopLeft, BottomRight = NWBaseBottomRight, Secured = false, IsPrimary = true }, + { Name = "MiniBase1", Center = MiniBase1, TopLeft = MiniBase1TopLeft, BottomRight = MiniBase1BottomRight, Secured = false, IsPrimary = false }, + { Name = "MiniBase2", Center = MiniBase2, TopLeft = MiniBase2TopLeft, BottomRight = MiniBase2BottomRight, Secured = false, IsPrimary = false }, + { Name = "MiniBase3", Center = MiniBase3, TopLeft = MiniBase3TopLeft, BottomRight = MiniBase3BottomRight, Secured = false, IsPrimary = false }, + { Name = "McvBase", Center = McvReveal, TopLeft = McvBaseTopLeft, BottomRight = McvBaseBottomRight, Secured = false, IsPrimary = false }, +} + +table.insert(UnitCompositions.Scrin, { + Infantry = { "s1", "stlk", "s1", "s1", "s1", "stlk", "stlk", "s1", "s1", "stlk", "s1", "s1", "s1", "stlk", "stlk", "stlk", "s1", "s1", "s1" }, + Vehicles = { "dark", "gunw", "dark", "dark", "gunw", "dark" }, + Aircraft = { PacOrDevastator, "pac" }, + MinTime = DateTime.Minutes(17) +}) + +NorthAttackPaths = {} +EastAttackPaths = {} +WestAttackPaths = {} + +MainSquadAttackValues = function(squad) + local minValue + local maxValue + + if NumBasesSecured == 1 then + minValue = 10 + maxValue = 20 + else + minValue = 45 / NumScrinBasesActive + maxValue = 85 / NumScrinBasesActive + end + + return AdjustAttackValuesForDifficulty({ Min = minValue, Max = maxValue }) +end + +Squads = { + North = { + Compositions = AdjustCompositionsForDifficulty(UnitCompositions.Scrin), + AttackValuePerSecond = MainSquadAttackValues, + FollowLeader = true, + AttackPaths = NorthAttackPaths, + Delay = AdjustDelayForDifficulty(DateTime.Minutes(1)), + ProducerActors = { Infantry = { NorthPortal1, NorthPortal2 }, Vehicles = { NorthSphere1, NorthSphere2 }, Aircraft = { NorthGrav1, NorthGrav2 } } + }, + West = { + Compositions = AdjustCompositionsForDifficulty(UnitCompositions.Scrin), + AttackValuePerSecond = MainSquadAttackValues, + FollowLeader = true, + AttackPaths = WestAttackPaths, + Delay = AdjustDelayForDifficulty(DateTime.Minutes(1)), + ProducerActors = { Infantry = { WestPortal }, Vehicles = { WestSphere1, WestSphere2 }, Aircraft = { WestGrav } } + }, + East = { + Compositions = AdjustCompositionsForDifficulty(UnitCompositions.Scrin), + AttackValuePerSecond = MainSquadAttackValues, + FollowLeader = true, + AttackPaths = EastAttackPaths, + Delay = AdjustDelayForDifficulty(DateTime.Minutes(1)), + ProducerActors = { Infantry = { EastPortal }, Vehicles = { EastSphere }, Aircraft = { EastGrav } } + }, + Roamers = { + Compositions = AdjustCompositionsForDifficulty({ + { Infantry = { "s1", "s1", "s1", "s1", "s3", { "mrdr", "s4" }, "stlk" }, Vehicles = { { "lace", "seek" }, { "lace", "seek" } } }, + }), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 10, Max = 20 }), + FollowLeader = false, + Delay = AdjustDelayForDifficulty(DateTime.Minutes(4)), + }, + Devastators = { + Delay = AdjustDelayForDifficulty(DateTime.Minutes(16)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 6, Max = 14 }), + Compositions = { + easy = { { Aircraft = { "deva" } } }, + normal = { { Aircraft = { "deva" } } }, + hard = { { Aircraft = { "deva", "deva" } } }, + vhard = { { Aircraft = { "deva", "deva", "deva" } } }, + brutal = { { Aircraft = { "deva", "deva", "deva", "deva" } } }, + }, + FollowLeader = false, + }, + Air = { + Delay = AdjustAirDelayForDifficulty(DateTime.Minutes(12)), + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 12, Max = 12 }), + Compositions = AirCompositions.Scrin, + }, + AirToAir = AirToAirSquad({ "stmr", "enrv", "torm" }, AdjustAirDelayForDifficulty(DateTime.Minutes(10))), +} + +SetupPlayers = function() + Greece = Player.GetPlayer("Greece") + MaleficScrin = Player.GetPlayer("MaleficScrin") + England = Player.GetPlayer("England") + Neutral = Player.GetPlayer("Neutral") + MissionPlayers = { Greece } + MissionEnemies = { MaleficScrin } +end + +WorldLoaded = function() + SetupPlayers() + + Camera.Position = PlayerStart.CenterPosition + NumBasesSecured = 0 + NumScrinBasesActive = 1 + + InitObjectives(Greece) + AdjustPlayerStartingCashForDifficulty() + RemoveActorsBasedOnDifficultyTags() + InitMaleficScrin() + SetupLightning() + SetupChurchMoneyCrates() + + ObjectiveSecureAllBases = Greece.AddObjective("Secure the four abandoned Allied bases.") + ObjectiveDestroyScrinBases = Greece.AddObjective("Destroy all Scrin Nerve Centers.") + + Utils.Do(MissionPlayers, function(p) + Actor.Create("radar.dummy", true, { Owner = p }) + end) + + local nerveCenters = MaleficScrin.GetActorsByType("nerv") + Trigger.OnAllKilledOrCaptured(nerveCenters, function() + Greece.MarkCompletedObjective(ObjectiveDestroyScrinBases) + end) + + Utils.Do(nerveCenters, function(n) + Trigger.OnKilled(n, function() + UpdateMissionText() + end) + end) + + Trigger.AfterDelay(1, function() + local englandHarvs = England.GetActorsByType("harv") + Utils.Do(englandHarvs, function(h) + h.Stop() + end) + end) + + if IsHardOrAbove() then + local productionBuildings = MaleficScrin.GetActorsByTypes({ "port", "wsph", "sfac", "grav" }) + for _, b in pairs(productionBuildings) do + BuildDefenseOnCaptureAttempt(b, "ptur", true) + end + + Trigger.OnAnyKilled(productionBuildings, function() + Trigger.AfterDelay(DateTime.Minutes(5), function() + if not RoamersInitialized then + RoamersInitialized = true + InitAttackSquad(Squads.Roamers, MaleficScrin) + end + end) + end) + end + + AfterWorldLoaded() +end + +Tick = function() + OncePerSecondChecks() + OncePerFiveSecondChecks() + OncePerThirtySecondChecks() + AfterTick() +end + +OncePerSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then + MaleficScrin.Resources = MaleficScrin.ResourceCapacity - 500 + + if MissionPlayersHaveNoRequiredUnits() then + if not Greece.IsObjectiveCompleted(ObjectiveSecureAllBases) then + Greece.MarkFailedObjective(ObjectiveSecureAllBases) + end + if not Greece.IsObjectiveCompleted(ObjectiveDestroyScrinBases) then + Greece.MarkFailedObjective(ObjectiveDestroyScrinBases) + end + end + + CheckBasesSecured() + end +end + +OncePerFiveSecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 125 == 0 then + UpdatePlayerBaseLocations() + + if #MaleficScrin.GetActorsByType("sfac") == 0 then + InitVoidEngines() + end + end +end + +OncePerThirtySecondChecks = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 750 == 0 then + CalculatePlayerCharacteristics() + end +end + +UpdateMissionText = function(text) + local nerveCenterCount = #MaleficScrin.GetActorsByType("nerv") + + if nerveCenterCount > 0 then + UserInterface.SetMissionText(nerveCenterCount .. " Nerve Centers remaining.", HSLColor.Yellow) + else + UserInterface.SetMissionText("") + end +end + +InitMaleficScrin = function() + RebuildExcludes.MaleficScrin = { Types = { "nerv" } } + + AutoRepairAndRebuildBuildings(MaleficScrin, 10) + SetupRefAndSilosCaptureCredits(MaleficScrin) + AutoReplaceHarvesters(MaleficScrin) + AutoRebuildConyards(MaleficScrin) + + local maleficScrinGroundAttackers = Utils.Where(MaleficScrin.GetGroundAttackers(), function (a) return a.Type ~= "veng" end) + Utils.Do(maleficScrinGroundAttackers, function(a) + TargetSwapChance(a, 10) + CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsScrinGroundHunterUnit) + end) + + Utils.Do({ VoidEngine1, VoidEngine2 }, function(v) + if not v.IsDead then + Trigger.OnDamaged(v, function(self, attacker, damage) + InitVoidEngines() + end) + end + end) +end + +InitVoidEngines = function() + if not VoidEnginesHunting then + VoidEnginesHunting = true + MediaCA.PlaySound("veng-spawn.aud", 2) + Utils.Do({ VoidEngine1, VoidEngine2 }, function(ve) + if not ve.IsDead then + AssaultPlayerBaseOrHunt(ve) + end + end) + end +end + +SetupLightning = function() + local nextStrikeDelay = Utils.RandomInteger(DateTime.Seconds(4), DateTime.Seconds(30)) + Trigger.AfterDelay(nextStrikeDelay, function() + LightningStrike() + SetupLightning() + end) +end + +LightningStrike = function() + local duration = Utils.RandomInteger(5, 8) + local thunderDelay = Utils.RandomInteger(5, 65) + local soundNumber + Lighting.Flash("LightningStrike", duration) + + repeat + soundNumber = Utils.RandomInteger(1, 7) + until(soundNumber ~= LastSoundNumber) + LastSoundNumber = soundNumber + + Trigger.AfterDelay(thunderDelay, function() + Media.PlaySound("thunder" .. soundNumber .. ".aud") + end) +end + +SecureBase = function(base) + base.Secured = true + + if base.Name == "SouthEast" then + SecureSouthEastBase() + elseif base.Name == "SouthWest" then + SecureSouthWestBase() + elseif base.Name == "NorthEast" then + SecureNorthEastBase() + elseif base.Name == "NorthWest" then + SecureNorthWestBase() + elseif base.Name == "McvBase" then + SecureMcv() + end + + TransferBaseActors(base) + + if not base.IsPrimary then + return + end + + NumBasesSecured = NumBasesSecured + 1 + + if NumBasesSecured == 1 then + for _, p in ipairs(MissionPlayers) do + p.GrantCondition("first-base-secured") + end + end + + if NumBasesSecured == 2 then + Trigger.AfterDelay(DateTime.Seconds(20), function() + if IsVeryHardOrAbove() then + InitMcvObjective(true) + else + PlaySpeechNotificationToMissionPlayers("ReinforcementsArrived") + Notification("Reinforcements have arrived. Press [" .. UtilsCA.Hotkey("ToLastEvent") .. "] to view location.") + DoMcvArrival() + Beacon.New(Greece, McvDest.CenterPosition) + Utils.Do(MissionPlayers, function(p) + Actor.Create("mcv.allowed", true, { Owner = p }) + end) + end + end) + end + + if NumBasesSecured >= 4 then + Greece.MarkCompletedObjective(ObjectiveSecureAllBases) + end +end + +SecureNorthEastBase = function() + if not NorthEastBaseSecured then + NorthEastBaseSecured = true + NEFlare.Destroy() + + table.insert(NorthAttackPaths, { N1a.Location, N2a.Location }) + table.insert(NorthAttackPaths, { N1b.Location, N2b.Location }) + table.insert(NorthAttackPaths, { N2d.Location }) + + table.insert(EastAttackPaths, { E1.Location, E2b.Location, E3a.Location }) + table.insert(EastAttackPaths, { E1.Location, E2c.Location, E3b.Location }) + + InitNorthScrinBase() + InitEastScrinBase() + end +end + +SecureNorthWestBase = function() + if not NorthWestBaseSecured then + NorthWestBaseSecured = true + NWFlare.Destroy() + + table.insert(NorthAttackPaths, { N1c.Location, N2c.Location, N3c.Location }) + + table.insert(WestAttackPaths, { W1.Location, W2a.Location }) + table.insert(WestAttackPaths, { W1.Location, W2d.Location }) + + InitNorthScrinBase() + InitWestScrinBase() + end +end + +SecureSouthEastBase = function() + if not SouthEastBaseSecured then + SouthEastBaseSecured = true + SEFlare.Destroy() + + table.insert(NorthAttackPaths, { N2d.Location, N3a.Location }) + table.insert(NorthAttackPaths, { N2d.Location, N3b.Location }) + table.insert(NorthAttackPaths, { N1a.Location, N2a.Location, N3d.Location }) + + table.insert(EastAttackPaths, { E1.Location, E2a.Location }) + table.insert(EastAttackPaths, { E1.Location, E2b.Location }) + + InitEastScrinBase() + InitNorthScrinBase() + end +end + +SecureSouthWestBase = function() + if not SouthWestBaseSecured then + SouthWestBaseSecured = true + SWFlare.Destroy() + + table.insert(WestAttackPaths, { W1.Location, W2b.Location }) + table.insert(WestAttackPaths, { W1.Location, W2c.Location }) + + InitWestScrinBase() + InitEastScrinBase() + end +end + +InitFirstScrinBase = function() + if not FirstScrinBaseInitialized then + FirstScrinBaseInitialized = true + InitAiUpgrades(MaleficScrin) + InitAirAttackSquad(Squads.Air, MaleficScrin) + if IsHardOrAbove() then + InitAirAttackSquad(Squads.AirToAir, MaleficScrin, MissionPlayers, { "Aircraft" }, "ArmorType") + InitAttackSquad(Squads.Devastators, MaleficScrin) + if not RoamersInitialized then + RoamersInitialized = true + InitAttackSquad(Squads.Roamers, MaleficScrin) + end + end + Trigger.AfterDelay(SuperweaponsEnabledTime[Difficulty], function() + Actor.Create("ai.superweapons.enabled", true, { Owner = MaleficScrin }) + Actor.Create("ai.minor.superweapons.enabled", true, { Owner = MaleficScrin }) + end) + end +end + +InitNorthScrinBase = function() + if not NorthScrinBaseInitialized then + InitFirstScrinBase() + NorthScrinBaseInitialized = true + NumScrinBasesActive = NumScrinBasesActive + 1 + InitAttackSquad(Squads.North, MaleficScrin) + end +end + +InitWestScrinBase = function() + if not WestScrinBaseInitialized then + InitFirstScrinBase() + WestScrinBaseInitialized = true + NumScrinBasesActive = NumScrinBasesActive + 1 + InitAttackSquad(Squads.West, MaleficScrin) + end +end + +InitEastScrinBase = function() + if not EastScrinBaseInitialized then + InitFirstScrinBase() + EastScrinBaseInitialized = true + NumScrinBasesActive = NumScrinBasesActive + 1 + InitAttackSquad(Squads.East, MaleficScrin) + end +end + +InitMcvObjective = function(notify) + if ObjectiveRecoverMcv == nil then + ObjectiveRecoverMcv = Greece.AddSecondaryObjective("Recover Allied MCV.") + + if notify then + McvFlare = Actor.Create("flare", true, { Owner = Greece, Location = McvReveal.Location }) + Beacon.New(Greece, McvReveal.CenterPosition) + Notification("Abandoned MCV located. Press [" .. UtilsCA.Hotkey("ToLastEvent") .. "] to view.") + end + end +end + +CheckBasesSecured = function() + for _, base in ipairs(Bases) do + if not base.Secured then + local defenders = Map.ActorsInBox(base.TopLeft.CenterPosition, base.BottomRight.CenterPosition, function(a) + return not a.IsDead and a.Owner == MaleficScrin and a.Type ~= "camera" + end) + + if #defenders == 0 then + SecureBase(base) + end + end + end +end + +SecureMcv = function() + if IsVeryHardOrAbove() then + InitNorthScrinBase() + InitWestScrinBase() + InitMcvObjective(false) + Trigger.AfterDelay(1, function() + Greece.MarkCompletedObjective(ObjectiveRecoverMcv) + end) + Trigger.AfterDelay(DateTime.Seconds(120), function() + Utils.Do(MissionPlayers, function(p) + Actor.Create("mcv.allowed", true, { Owner = p }) + end) + Notification("MCV production now available.") + end) + if McvFlare ~= nil and not McvFlare.IsDead then + McvFlare.Destroy() + end + end +end + +-- overridden in co-op version +TransferBaseActors = function(base) + local baseActors = Map.ActorsInBox(base.TopLeft.CenterPosition, base.BottomRight.CenterPosition, function(a) + return not a.IsDead and (a.Owner == England or a.Type == "macs" or a.Type == "hosp") + end) + + Utils.Do(baseActors, function(a) + a.Owner = Greece + end) + + Trigger.AfterDelay(1, function() + Actor.Create("QueueUpdaterDummy", true, { Owner = Greece }) + end) +end + +-- overridden in co-op version +DoMcvArrival = function() + Reinforcements.Reinforce(Greece, { "lst.mcv" }, { McvSpawn.Location, McvDest.Location }, 75) +end diff --git a/mods/ca/missions/main-campaign/ca48-banishment/map.bin b/mods/ca/missions/main-campaign/ca48-banishment/map.bin new file mode 100644 index 0000000000..58833d0e21 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca48-banishment/map.bin differ diff --git a/mods/ca/missions/main-campaign/ca48-banishment/map.png b/mods/ca/missions/main-campaign/ca48-banishment/map.png new file mode 100644 index 0000000000..faaf0fcd82 Binary files /dev/null and b/mods/ca/missions/main-campaign/ca48-banishment/map.png differ diff --git a/mods/ca/missions/main-campaign/ca48-banishment/map.yaml b/mods/ca/missions/main-campaign/ca48-banishment/map.yaml new file mode 100644 index 0000000000..877569a28b --- /dev/null +++ b/mods/ca/missions/main-campaign/ca48-banishment/map.yaml @@ -0,0 +1,8440 @@ +MapFormat: 12 + +RequiresMod: ca + +Title: 48: Banishment + +Author: Darkademic + +Tileset: TEMPERAT + +MapSize: 194,194 + +Bounds: 1,1,192,192 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: Greece, MaleficScrin + PlayerReference@Greece: + Name: Greece + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: allies + LockColor: True + Color: 99ACF2 + LockSpawn: True + LockTeam: True + Enemies: MaleficScrin, Creeps + PlayerReference@MaleficScrin: + Name: MaleficScrin + Bot: campaign + Faction: scrin + Color: 3E4549 + Enemies: Greece, Creeps + PlayerReference@England: + Name: England + NonCombatant: True + Faction: allies + Color: A1EF8C + +Actors: + Actor0: split2 + Owner: Neutral + Location: 81,140 + Actor1: split2 + Owner: Neutral + Location: 87,142 + Actor2: split2 + Owner: Neutral + Location: 83,149 + Actor3: sbag + Owner: England + Location: 75,150 + Actor4: sbag + Owner: England + Location: 76,150 + Actor5: sbag + Owner: England + Location: 76,149 + Health: 36 + Actor6: sbag + Owner: England + Location: 76,148 + Actor7: sbag + Owner: England + Location: 74,150 + Health: 10 + Actor8: sbag + Owner: England + Location: 73,150 + Health: 28 + Actor9: sbag + Owner: England + Location: 72,150 + Health: 30 + Actor10: sbag + Owner: England + Location: 72,149 + Actor11: sbag + Owner: England + Location: 72,148 + Actor12: sbag + Owner: England + Location: 71,148 + Actor13: sbag + Owner: England + Location: 71,147 + Health: 18 + Actor24: brik + Owner: England + Location: 74,140 + Actor25: brik + Owner: England + Location: 74,139 + Actor26: brik + Owner: England + Location: 73,140 + Actor27: brik + Owner: England + Location: 73,139 + Actor40: brik + Owner: England + Location: 82,121 + Actor41: brik + Owner: England + Location: 83,121 + Actor42: brik + Owner: England + Location: 83,122 + Actor43: brik + Owner: England + Location: 82,122 + Actor44: brik + Owner: England + Location: 81,121 + Actor45: brik + Owner: England + Location: 81,120 + Actor46: brik + Owner: England + Location: 81,119 + Actor47: brik + Owner: England + Location: 81,118 + Actor48: brik + Owner: England + Location: 79,118 + Health: 33 + Actor49: brik + Owner: England + Location: 80,118 + Actor51: brik + Owner: England + Location: 77,118 + Health: 26 + Actor52: brik + Owner: England + Location: 76,118 + Actor53: brik + Owner: England + Location: 75,118 + Actor54: brik + Owner: England + Location: 75,119 + Actor55: brik + Owner: England + Location: 76,119 + Actor56: brik + Owner: England + Location: 69,118 + Actor57: brik + Owner: England + Location: 69,119 + Actor58: brik + Owner: England + Location: 68,118 + Actor59: brik + Owner: England + Location: 68,119 + Actor60: brik + Owner: England + Location: 67,118 + Actor61: brik + Owner: England + Location: 65,118 + Actor62: brik + Owner: England + Location: 66,118 + Actor63: brik + Owner: England + Location: 64,118 + Actor64: brik + Owner: England + Location: 64,119 + Actor65: brik + Owner: England + Location: 64,120 + Health: 67 + Actor66: brik + Owner: England + Location: 64,125 + Actor67: brik + Owner: England + Location: 64,124 + Actor68: brik + Owner: England + Location: 64,123 + Actor69: brik + Owner: England + Location: 64,122 + Actor70: brik + Owner: England + Location: 64,121 + Actor71: brik + Owner: England + Location: 65,125 + Actor72: brik + Owner: England + Location: 65,124 + Actor73: brik + Owner: England + Location: 64,130 + Actor74: brik + Owner: England + Location: 65,130 + Actor75: brik + Owner: England + Location: 64,131 + Actor76: brik + Owner: England + Location: 65,131 + Actor77: brik + Owner: England + Location: 64,132 + Actor78: brik + Owner: England + Location: 64,133 + Actor79: brik + Owner: England + Location: 64,134 + Actor80: brik + Owner: England + Location: 64,135 + Health: 46 + Actor81: brik + Owner: England + Location: 64,136 + Health: 28 + Actor82: brik + Owner: England + Location: 64,137 + Health: 16 + Actor83: brik + Owner: England + Location: 64,138 + Actor84: brik + Owner: England + Location: 64,139 + Actor85: brik + Owner: England + Location: 64,140 + Health: 34 + Actor86: brik + Owner: England + Location: 65,140 + Actor87: brik + Owner: England + Location: 68,140 + Health: 59 + Actor88: brik + Owner: England + Location: 72,140 + Health: 20 + Actor89: brik + Owner: England + Location: 70,140 + Health: 1 + Actor91: brik + Owner: England + Location: 69,140 + Actor92: brik + Owner: England + Location: 67,140 + Actor93: brik + Owner: England + Location: 66,140 + Health: 48 + Actor98: sbag + Owner: England + Location: 62,145 + Health: 35 + Actor99: sbag + Owner: England + Location: 62,144 + Actor100: sbag + Owner: England + Location: 61,144 + Actor101: sbag + Owner: England + Location: 61,143 + Actor102: sbag + Owner: England + Location: 60,143 + Actor103: sbag + Owner: England + Location: 60,142 + Health: 15 + Actor104: sbag + Owner: England + Location: 60,141 + Health: 31 + Actor105: sbag + Owner: England + Location: 70,147 + Actor106: sbag + Owner: England + Location: 64,147 + Actor107: sbag + Owner: England + Location: 65,147 + Actor108: sbag + Owner: England + Location: 63,147 + Actor109: sbag + Owner: England + Location: 62,147 + Health: 27 + Actor97: sbag + Owner: England + Location: 59,141 + Actor111: sbag + Owner: England + Location: 59,140 + Actor112: sbag + Owner: England + Location: 59,139 + Actor113: sbag + Owner: England + Location: 59,137 + Actor114: sbag + Owner: England + Location: 59,138 + Health: 25 + Actor115: sbag + Owner: England + Location: 59,136 + Actor119: apwr + Owner: England + Location: 65,137 + Health: 34 + Actor120: apwr + Owner: England + Location: 68,137 + Health: 46 + Actor121: apwr + Owner: England + Location: 65,134 + Health: 44 + Actor122: apwr + Owner: England + Location: 68,134 + Health: 24 + Actor123: gun + Owner: England + Location: 58,137 + TurretFacing: 192 + Health: 42 + Actor124: gun + Owner: England + Location: 70,148 + Health: 26 + TurretFacing: 531 + Actor125: gun + Owner: England + Location: 60,144 + TurretFacing: 192 + Health: 42 + Actor126: pbox + Owner: England + Location: 63,130 + Health: 22 + Actor127: pbox + Owner: England + Location: 63,125 + Health: 48 + Actor128: pbox + Owner: England + Location: 69,117 + Health: 37 + Actor129: pbox + Owner: England + Location: 75,117 + Health: 30 + Actor130: pbox + Owner: England + Location: 74,141 + Health: 43 + Actor131: silo + Owner: England + Location: 74,132 + Health: 24 + Actor132: silo + Owner: England + Location: 76,132 + Health: 34 + Actor134: agun + Owner: England + Location: 79,120 + Health: 28 + TurretFacing: 920 + Actor135: syrd + Owner: England + Location: 84,117 + Health: 24 + Actor136: pris + Owner: England + Location: 65,123 + Health: 37 + Actor137: pris + Owner: England + Location: 65,132 + Health: 36 + Actor138: pris + Owner: England + Location: 67,119 + Health: 33 + Actor139: pbox + Owner: England + Location: 64,148 + Health: 29 + Actor140: pbox + Owner: England + Location: 58,139 + Health: 33 + Actor141: brik + Owner: England + Location: 125,127 + Health: 56 + Actor143: brik + Owner: England + Location: 125,130 + Actor144: brik + Owner: England + Location: 125,129 + Health: 24 + Actor145: brik + Owner: England + Location: 125,131 + Actor146: brik + Owner: England + Location: 127,131 + Health: 39 + Actor147: brik + Owner: England + Location: 126,131 + Actor148: brik + Owner: England + Location: 128,131 + Actor149: brik + Owner: England + Location: 130,131 + Actor150: brik + Owner: England + Location: 129,131 + Actor151: brik + Owner: England + Location: 131,131 + Actor152: brik + Owner: England + Location: 132,130 + Health: 28 + Actor153: brik + Owner: England + Location: 131,130 + Actor154: brik + Owner: England + Location: 132,131 + Actor156: brik + Owner: England + Location: 137,130 + Actor158: brik + Owner: England + Location: 138,130 + Actor159: brik + Owner: England + Location: 138,131 + Actor160: brik + Owner: England + Location: 139,131 + Actor161: brik + Owner: England + Location: 140,131 + Actor155: brik + Owner: England + Location: 141,131 + Actor162: brik + Owner: England + Location: 142,131 + Actor163: brik + Owner: England + Location: 143,131 + Actor164: brik + Owner: England + Location: 143,130 + Actor165: brik + Owner: England + Location: 143,128 + Actor166: brik + Owner: England + Location: 143,129 + Health: 59 + Actor167: brik + Owner: England + Location: 143,127 + Actor168: brik + Owner: England + Location: 143,126 + Actor170: brik + Owner: England + Location: 143,125 + Actor173: brik + Owner: England + Location: 142,126 + Actor174: brik + Owner: England + Location: 142,125 + Health: 56 + Actor169: brik + Owner: England + Location: 125,125 + Actor171: brik + Owner: England + Location: 125,126 + Actor172: brik + Owner: England + Location: 126,126 + Actor175: brik + Owner: England + Location: 126,125 + Actor176: brik + Owner: England + Location: 142,120 + Actor177: brik + Owner: England + Location: 142,119 + Actor178: brik + Owner: England + Location: 143,120 + Actor179: brik + Owner: England + Location: 143,119 + Actor180: brik + Owner: England + Location: 143,118 + Actor181: brik + Owner: England + Location: 143,117 + Actor201: brik + Owner: England + Location: 125,117 + Actor202: brik + Owner: England + Location: 125,118 + Health: 46 + Actor203: brik + Owner: England + Location: 125,120 + Actor204: brik + Owner: England + Location: 126,120 + Health: 27 + Actor205: brik + Owner: England + Location: 125,119 + Actor206: brik + Owner: England + Location: 126,119 + Actor210: powr + Owner: England + Location: 126,128 + Health: 34 + Actor211: powr + Owner: England + Location: 141,128 + Health: 36 + Actor184: brik + Owner: England + Location: 131,116 + Actor185: brik + Owner: England + Location: 131,115 + Actor186: brik + Owner: England + Location: 130,115 + Actor187: brik + Owner: England + Location: 129,115 + Actor188: brik + Owner: England + Location: 128,115 + Actor192: brik + Owner: England + Location: 127,115 + Actor194: brik + Owner: England + Location: 126,115 + Actor195: brik + Owner: England + Location: 125,115 + Actor196: brik + Owner: England + Location: 125,116 + Actor197: brik + Owner: England + Location: 142,115 + Health: 24 + Actor198: brik + Owner: England + Location: 140,115 + Actor199: brik + Owner: England + Location: 141,115 + Actor200: brik + Owner: England + Location: 139,115 + Actor212: brik + Owner: England + Location: 138,115 + Actor213: brik + Owner: England + Location: 137,115 + Actor214: brik + Owner: England + Location: 137,116 + Health: 40 + Actor215: brik + Owner: England + Location: 138,116 + Actor216: brik + Owner: England + Location: 132,116 + Health: 21 + Actor217: brik + Owner: England + Location: 132,115 + Actor218: brik + Owner: England + Location: 143,116 + Actor219: brik + Owner: England + Location: 143,115 + Actor220: powr + Owner: England + Location: 141,116 + Health: 37 + Actor221: powr + Owner: England + Location: 126,116 + Health: 40 + Actor222: pbox + Owner: England + Location: 144,125 + Health: 44 + Actor223: pbox + Owner: England + Location: 144,120 + Health: 40 + Actor224: pbox + Owner: England + Location: 132,132 + Health: 36 + Actor225: pbox + Owner: England + Location: 137,132 + Health: 40 + Actor226: pbox + Owner: England + Location: 137,114 + Health: 39 + Actor227: pbox + Owner: England + Location: 132,114 + Health: 48 + Actor228: pris + Owner: England + Location: 139,130 + Health: 30 + Actor229: pris + Owner: England + Location: 130,130 + Health: 21 + Actor230: pris + Owner: England + Location: 139,116 + Health: 39 + Actor231: pris + Owner: England + Location: 130,116 + Health: 24 + Actor232: brik + Owner: England + Location: 79,58 + Actor233: brik + Owner: England + Location: 79,57 + Actor234: brik + Owner: England + Location: 78,57 + Actor235: brik + Owner: England + Location: 78,58 + Actor236: brik + Owner: England + Location: 76,57 + Actor237: brik + Owner: England + Location: 77,57 + Actor238: brik + Owner: England + Location: 75,57 + Actor239: brik + Owner: England + Location: 74,57 + Actor240: brik + Owner: England + Location: 74,58 + Actor241: brik + Owner: England + Location: 75,58 + Actor242: brik + Owner: England + Location: 69,57 + Actor243: brik + Owner: England + Location: 69,58 + Actor244: brik + Owner: England + Location: 68,58 + Actor245: brik + Owner: England + Location: 68,57 + Actor246: brik + Owner: England + Location: 67,57 + Actor247: brik + Owner: England + Location: 66,57 + Actor248: brik + Owner: England + Location: 65,57 + Actor249: brik + Owner: England + Location: 64,57 + Actor250: brik + Owner: England + Location: 64,58 + Actor252: brik + Owner: England + Location: 64,59 + Health: 32 + Actor254: brik + Owner: England + Location: 64,62 + Health: 15 + Actor255: brik + Owner: England + Location: 64,63 + Actor256: brik + Owner: England + Location: 64,64 + Actor257: brik + Owner: England + Location: 64,65 + Health: 20 + Actor259: brik + Owner: England + Location: 65,65 + Actor260: brik + Owner: England + Location: 65,64 + Health: 46 + Actor258: brik + Owner: England + Location: 64,70 + Actor261: brik + Owner: England + Location: 65,70 + Health: 60 + Actor262: brik + Owner: England + Location: 64,71 + Health: 33 + Actor263: brik + Owner: England + Location: 65,71 + Actor264: brik + Owner: England + Location: 64,72 + Health: 24 + Actor265: brik + Owner: England + Location: 64,73 + Actor266: brik + Owner: England + Location: 64,74 + Actor267: brik + Owner: England + Location: 65,75 + Actor268: brik + Owner: England + Location: 64,75 + Actor269: brik + Owner: England + Location: 67,75 + Actor270: brik + Owner: England + Location: 66,75 + Actor271: brik + Owner: England + Location: 69,75 + Actor272: brik + Owner: England + Location: 68,75 + Actor273: brik + Owner: England + Location: 69,74 + Actor274: brik + Owner: England + Location: 68,74 + Health: 30 + Actor275: brik + Owner: England + Location: 74,74 + Actor276: brik + Owner: England + Location: 74,75 + Actor277: brik + Owner: England + Location: 75,75 + Actor278: brik + Owner: England + Location: 75,74 + Actor279: brik + Owner: England + Location: 76,75 + Actor280: brik + Owner: England + Location: 77,75 + Actor281: brik + Owner: England + Location: 79,75 + Actor282: brik + Owner: England + Location: 80,75 + Actor283: brik + Owner: England + Location: 78,75 + Actor284: brik + Owner: England + Location: 80,74 + Actor285: brik + Owner: England + Location: 79,74 + Actor286: brik + Owner: England + Location: 131,67 + Actor287: brik + Owner: England + Location: 131,66 + Actor288: brik + Owner: England + Location: 132,66 + Actor289: brik + Owner: England + Location: 132,67 + Actor290: brik + Owner: England + Location: 131,65 + Actor291: brik + Owner: England + Location: 131,64 + Actor292: brik + Owner: England + Location: 131,63 + Actor293: brik + Owner: England + Location: 132,63 + Actor294: brik + Owner: England + Location: 131,62 + Actor295: brik + Owner: England + Location: 132,62 + Actor297: tent + Owner: England + Location: 130,119 + Health: 32 + Actor300: hpad + Owner: England + Location: 75,63 + Health: 42 + Actor301: hpad + Owner: England + Location: 78,63 + Health: 48 + Actor302: hpad + Owner: England + Location: 78,67 + Health: 40 + Actor305: chain + Owner: England + Location: 75,62 + Actor307: chain + Owner: England + Location: 74,63 + Health: 36 + Actor308: chain + Owner: England + Location: 74,64 + Actor310: chain + Owner: England + Location: 76,62 + Actor312: chain + Owner: England + Location: 78,62 + Actor313: chain + Owner: England + Location: 79,62 + Actor314: chain + Owner: England + Location: 80,62 + Actor315: chain + Owner: England + Location: 80,63 + Actor316: chain + Owner: England + Location: 80,64 + Actor317: chain + Owner: England + Location: 80,65 + Health: 34 + Actor110: sbag + Owner: England + Location: 62,146 + Health: 37 + Actor116: proc + Owner: England + Location: 74,132 + FreeActor@CHARV: False + FreeActor: False + Health: 46 + Actor157: brik + Owner: England + Location: 137,131 + Health: 31 + NWBaseCenter: waypoint + Owner: Neutral + Location: 73,66 + SEBaseCenter: waypoint + Owner: Neutral + Location: 134,122 + Actor324: brik + Owner: England + Location: 133,72 + Actor331: brik + Owner: England + Location: 134,72 + Actor332: brik + Owner: England + Location: 133,73 + Actor333: brik + Owner: England + Location: 134,73 + Actor334: brik + Owner: England + Location: 133,74 + Actor335: brik + Owner: England + Location: 134,75 + Actor336: brik + Owner: England + Location: 133,75 + Actor337: brik + Owner: England + Location: 135,75 + Actor338: brik + Owner: England + Location: 137,75 + Actor339: brik + Owner: England + Location: 136,75 + Actor340: brik + Owner: England + Location: 138,75 + Actor341: brik + Owner: England + Location: 139,75 + Actor342: brik + Owner: England + Location: 140,75 + Actor343: brik + Owner: England + Location: 141,75 + Actor344: brik + Owner: England + Location: 143,75 + Actor345: brik + Owner: England + Location: 142,75 + Actor346: brik + Owner: England + Location: 143,74 + Actor347: brik + Owner: England + Location: 144,74 + Actor348: brik + Owner: England + Location: 144,73 + Actor349: brik + Owner: England + Location: 143,73 + Actor350: brik + Owner: England + Location: 149,73 + Actor351: brik + Owner: England + Location: 149,74 + Actor352: brik + Owner: England + Location: 150,74 + Actor353: brik + Owner: England + Location: 150,73 + Actor354: brik + Owner: England + Location: 150,72 + Actor355: brik + Owner: England + Location: 150,71 + Actor356: brik + Owner: England + Location: 150,70 + Actor357: brik + Owner: England + Location: 150,69 + Actor358: brik + Owner: England + Location: 150,68 + Actor359: brik + Owner: England + Location: 149,68 + Actor360: brik + Owner: England + Location: 149,69 + Actor361: brik + Owner: England + Location: 149,63 + Actor362: brik + Owner: England + Location: 150,63 + Actor363: brik + Owner: England + Location: 149,62 + Actor364: brik + Owner: England + Location: 150,62 + Actor365: brik + Owner: England + Location: 150,61 + Actor366: brik + Owner: England + Location: 150,60 + Actor367: brik + Owner: England + Location: 150,59 + Actor368: brik + Owner: England + Location: 149,59 + Actor369: brik + Owner: England + Location: 148,59 + Actor370: brik + Owner: England + Location: 147,59 + Actor371: brik + Owner: England + Location: 146,59 + Actor372: brik + Owner: England + Location: 145,59 + Actor373: brik + Owner: England + Location: 144,59 + Actor374: brik + Owner: England + Location: 144,58 + Actor375: brik + Owner: England + Location: 144,57 + Actor376: brik + Owner: England + Location: 143,57 + Actor377: brik + Owner: England + Location: 142,56 + Actor378: brik + Owner: England + Location: 143,56 + Actor379: brik + Owner: England + Location: 141,56 + Actor380: brik + Owner: England + Location: 140,56 + Actor381: brik + Owner: England + Location: 139,56 + Actor382: brik + Owner: England + Location: 138,56 + Actor383: brik + Owner: England + Location: 136,56 + Actor384: brik + Owner: England + Location: 137,56 + Actor385: brik + Owner: England + Location: 135,56 + Actor386: brik + Owner: England + Location: 135,57 + Actor387: brik + Owner: England + Location: 134,57 + Actor388: brik + Owner: England + Location: 134,58 + Actor389: brik + Owner: England + Location: 133,58 + Actor390: brik + Owner: England + Location: 132,58 + Actor391: brik + Owner: England + Location: 132,59 + Actor392: brik + Owner: England + Location: 132,60 + Actor393: brik + Owner: England + Location: 132,61 + Actor394: apwr + Owner: England + Location: 136,57 + Health: 38 + Actor395: apwr + Owner: England + Location: 139,57 + Health: 40 + Actor396: apwr + Owner: England + Location: 139,72 + Health: 44 + Actor397: apwr + Owner: England + Location: 136,72 + Health: 44 + Actor399: proc + Owner: England + Location: 67,60 + Health: 39 + FreeActor@CHARV: False + FreeActor: False + Actor400: pbox + Owner: England + Location: 144,75 + Health: 42 + Actor401: pbox + Owner: England + Location: 149,75 + Health: 43 + Actor402: pbox + Owner: England + Location: 151,68 + Health: 37 + Actor403: pbox + Owner: England + Location: 151,63 + Health: 36 + Actor404: pbox + Owner: England + Location: 130,67 + Health: 34 + Actor405: pbox + Owner: England + Location: 132,72 + Health: 34 + Actor406: agun + Owner: England + Location: 140,69 + Health: 34 + TurretFacing: 422 + Actor407: agun + Owner: England + Location: 134,62 + Health: 38 + TurretFacing: 20 + Actor408: agun + Owner: England + Location: 147,61 + Health: 39 + TurretFacing: 832 + Actor409: gap + Owner: England + Location: 141,66 + Health: 37 + Actor411: pris + Owner: England + Location: 149,61 + Health: 44 + Actor412: pris + Owner: England + Location: 149,72 + Health: 43 + Actor413: pris + Owner: England + Location: 142,74 + Health: 44 + Actor414: pris + Owner: England + Location: 132,65 + Health: 25 + Actor415: pris + Owner: England + Location: 134,74 + Health: 42 + NEBaseCenter: waypoint + Owner: Neutral + Location: 142,66 + Actor416: powr + Owner: England + Location: 79,59 + Health: 34 + Actor417: powr + Owner: England + Location: 77,59 + Health: 38 + Actor418: powr + Owner: England + Location: 75,59 + Health: 30 + Actor419: pbox + Owner: England + Location: 69,76 + Health: 32 + Actor420: pbox + Owner: England + Location: 74,76 + Health: 37 + Actor421: pbox + Owner: England + Location: 63,65 + Health: 28 + Actor422: pbox + Owner: England + Location: 63,70 + Health: 34 + Actor423: pbox + Owner: England + Location: 69,56 + Health: 45 + Actor424: pbox + Owner: England + Location: 74,56 + Health: 46 + Actor429: split2 + Owner: Neutral + Location: 67,54 + Actor430: split2 + Owner: Neutral + Location: 66,49 + Actor432: split2 + Owner: Neutral + Location: 154,59 + Actor433: split2 + Owner: Neutral + Location: 159,57 + Actor434: split2 + Owner: Neutral + Location: 147,117 + Actor435: split2 + Owner: Neutral + Location: 153,119 + Actor428: split2 + Owner: Neutral + Location: 76,52 + Actor431: split2 + Owner: Neutral + Location: 79,49 + Actor436: powr + Owner: England + Location: 65,72 + Health: 36 + Actor437: chain + Owner: England + Location: 80,69 + Health: 13 + Actor438: chain + Owner: England + Location: 80,68 + Actor440: apwr + Owner: England + Location: 128,124 + Health: 46 + Actor442: harv + Owner: England + Location: 72,135 + Facing: 497 + Health: 48 + Actor443: harv + Owner: England + Location: 142,121 + Facing: 252 + Health: 36 + Actor445: harv + Owner: England + Location: 73,61 + Facing: 504 + Health: 41 + Actor446: e3 + Owner: Greece + SubCell: 5 + Facing: 768 + Location: 11,183 + Actor447: e3 + Owner: Greece + SubCell: 4 + Facing: 768 + Location: 11,183 + Actor448: e3 + Owner: Greece + SubCell: 2 + Facing: 768 + Location: 11,183 + Actor449: e3 + Owner: Greece + SubCell: 1 + Facing: 768 + Location: 11,183 + Actor450: medi + Owner: Greece + SubCell: 3 + Facing: 768 + Location: 9,183 + Actor451: e1 + Owner: Greece + SubCell: 2 + Facing: 768 + Location: 17,183 + Actor452: e1 + Owner: Greece + SubCell: 4 + Facing: 768 + Location: 17,183 + Actor453: e1 + Owner: Greece + SubCell: 1 + Facing: 768 + Location: 17,183 + Actor454: e1 + Owner: Greece + SubCell: 5 + Facing: 768 + Location: 17,183 + Actor455: e1 + Owner: Greece + SubCell: 1 + Facing: 768 + Location: 15,183 + Actor456: e1 + Owner: Greece + SubCell: 1 + Facing: 768 + Location: 13,183 + Actor457: e1 + Owner: Greece + SubCell: 2 + Facing: 768 + Location: 13,183 + Actor458: e1 + Owner: Greece + SubCell: 4 + Facing: 768 + Location: 13,183 + Actor459: e1 + Owner: Greece + SubCell: 5 + Facing: 768 + Location: 13,183 + Actor460: e1 + Owner: Greece + SubCell: 2 + Facing: 768 + Location: 15,183 + Actor461: e1 + Owner: Greece + SubCell: 4 + Facing: 768 + Location: 15,183 + Actor462: e1 + Owner: Greece + SubCell: 5 + Facing: 768 + Location: 15,183 + Actor464: ptnk + Owner: Greece + Facing: 768 + Location: 8,185 + Actor465: arty + Owner: Greece + Facing: 768 + Location: 6,185 + Actor467: ptnk + Owner: Greece + Facing: 768 + Location: 8,187 + Actor468: arty + Owner: Greece + Facing: 768 + Location: 6,187 + Actor469: e3 + Owner: Greece + SubCell: 5 + Facing: 768 + Location: 11,189 + Actor470: e3 + Owner: Greece + SubCell: 4 + Facing: 768 + Location: 11,189 + Actor471: e3 + Owner: Greece + SubCell: 2 + Facing: 768 + Location: 11,189 + Actor472: e3 + Owner: Greece + SubCell: 1 + Facing: 768 + Location: 11,189 + Actor474: medi + Owner: Greece + SubCell: 3 + Facing: 768 + Location: 9,189 + Actor475: e1 + Owner: Greece + SubCell: 5 + Facing: 768 + Location: 17,189 + Actor476: e1 + Owner: Greece + SubCell: 4 + Facing: 768 + Location: 17,189 + Actor489: e1 + Owner: Greece + SubCell: 2 + Facing: 768 + Location: 17,189 + Actor494: jeep + Owner: Greece + Facing: 768 + Location: 18,187 + Actor495: e1 + Owner: Greece + SubCell: 1 + Facing: 768 + Location: 15,189 + Actor496: e1 + Owner: Greece + SubCell: 1 + Facing: 768 + Location: 13,189 + Actor497: e1 + Owner: Greece + SubCell: 2 + Facing: 768 + Location: 13,189 + Actor498: e1 + Owner: Greece + SubCell: 4 + Facing: 768 + Location: 13,189 + Actor499: e1 + Owner: Greece + SubCell: 5 + Facing: 768 + Location: 13,189 + Actor500: e1 + Owner: Greece + SubCell: 2 + Facing: 768 + Location: 15,189 + Actor501: e1 + Owner: Greece + SubCell: 4 + Facing: 768 + Location: 15,189 + Actor503: 2tnk + Owner: Greece + Facing: 768 + Location: 14,187 + Actor504: 2tnk + Owner: Greece + Facing: 768 + Location: 16,187 + Actor505: e1 + Owner: Greece + SubCell: 5 + Facing: 768 + Location: 15,189 + Actor506: jeep + Owner: Greece + Location: 18,185 + Facing: 768 + Actor507: 2tnk + Owner: Greece + Facing: 768 + Location: 14,185 + Actor508: 2tnk + Owner: Greece + Facing: 768 + Location: 16,185 + Actor510: e1 + Owner: Greece + SubCell: 1 + Facing: 768 + Location: 17,189 + Actor481: chain + Owner: England + Location: 104,162 + Actor482: chain + Owner: England + Location: 105,162 + Actor483: chain + Owner: England + Location: 106,162 + Actor484: chain + Owner: England + Location: 111,162 + Actor485: chain + Owner: England + Location: 110,162 + Actor486: chain + Owner: England + Location: 112,162 + Actor487: chain + Owner: England + Location: 113,162 + Actor491: chain + Owner: England + Location: 113,161 + Actor492: chain + Owner: England + Location: 113,159 + Actor493: chain + Owner: England + Location: 113,160 + Actor511: chain + Owner: England + Location: 113,158 + Actor512: chain + Owner: England + Location: 113,156 + Actor513: chain + Owner: England + Location: 113,157 + Actor514: chain + Owner: England + Location: 113,155 + Actor515: chain + Owner: England + Location: 113,154 + Actor516: chain + Owner: England + Location: 113,153 + Actor517: chain + Owner: England + Location: 113,152 + Actor518: chain + Owner: England + Location: 111,152 + Actor519: chain + Owner: England + Location: 110,152 + Actor520: chain + Owner: England + Location: 112,152 + Actor521: chain + Owner: England + Location: 104,161 + Actor488: brl3 + Owner: Neutral + Location: 110,161 + Actor490: barl + Owner: Neutral + Location: 111,160 + Actor522: brl3 + Owner: Neutral + Location: 112,157 + Actor523: barl + Owner: Neutral + Location: 112,158 + Actor524: medi + Owner: Greece + SubCell: 3 + Facing: 768 + Location: 8,183 + Actor525: medi + Owner: Greece + SubCell: 3 + Facing: 768 + Location: 8,189 + Actor527: chain + Owner: England + Location: 134,166 + Actor528: chain + Owner: England + Location: 134,165 + Actor529: chain + Owner: England + Location: 134,164 + Actor531: chain + Owner: England + Location: 134,170 + Actor532: chain + Owner: England + Location: 134,171 + Actor530: chain + Owner: England + Location: 134,172 + Actor533: chain + Owner: England + Location: 138,172 + Actor534: chain + Owner: England + Location: 137,172 + Actor535: chain + Owner: England + Location: 136,172 + Actor536: chain + Owner: England + Location: 135,172 + Actor537: chain + Owner: England + Location: 135,164 + Actor538: chain + Owner: England + Location: 136,164 + Actor539: chain + Owner: England + Location: 137,164 + Actor540: chain + Owner: England + Location: 138,164 + Actor541: chain + Owner: England + Location: 140,164 + Actor542: chain + Owner: England + Location: 139,164 + Actor543: chain + Owner: England + Location: 141,164 + Actor544: chain + Owner: England + Location: 142,164 + Actor545: chain + Owner: England + Location: 143,164 + Actor546: chain + Owner: England + Location: 143,165 + Actor547: chain + Owner: England + Location: 143,166 + Actor549: chain + Owner: England + Location: 143,168 + Actor550: chain + Owner: England + Location: 143,169 + Actor551: chain + Owner: England + Location: 143,170 + Actor552: chain + Owner: England + Location: 143,171 + Actor553: chain + Owner: England + Location: 143,172 + Actor554: chain + Owner: England + Location: 142,172 + Actor555: chain + Owner: England + Location: 141,172 + Actor556: chain + Owner: England + Location: 140,172 + Actor557: chain + Owner: England + Location: 139,172 + Actor558: hbox + Owner: England + Location: 133,166 + Health: 30 + Actor559: hbox + Owner: England + Location: 133,170 + Health: 20 + Hospital: hosp + Location: 71,98 + Owner: Neutral + Health: 41 + Actor569: stlk + Owner: MaleficScrin + Location: 30,190 + SubCell: 3 + Facing: 256 + Actor577: swal + Owner: MaleficScrin + Location: 145,1 + Actor578: swal + Owner: MaleficScrin + Location: 146,1 + Actor579: swal + Owner: MaleficScrin + Location: 147,1 + Actor580: swal + Owner: MaleficScrin + Location: 149,1 + Actor581: swal + Owner: MaleficScrin + Location: 148,1 + Actor582: swal + Owner: MaleficScrin + Location: 150,1 + Actor583: swal + Owner: MaleficScrin + Location: 151,1 + Actor584: swal + Owner: MaleficScrin + Location: 152,1 + Actor585: swal + Owner: MaleficScrin + Location: 153,1 + Actor586: swal + Owner: MaleficScrin + Location: 155,1 + Actor587: swal + Owner: MaleficScrin + Location: 154,1 + Actor588: swal + Owner: MaleficScrin + Location: 156,1 + Actor589: swal + Owner: MaleficScrin + Location: 157,1 + Actor590: swal + Owner: MaleficScrin + Location: 159,1 + Actor591: swal + Owner: MaleficScrin + Location: 158,1 + Actor592: swal + Owner: MaleficScrin + Location: 144,1 + Actor593: swal + Owner: MaleficScrin + Location: 143,1 + Actor594: swal + Owner: MaleficScrin + Location: 160,1 + Actor595: swal + Owner: MaleficScrin + Location: 161,1 + Actor597: rea2 + Owner: MaleficScrin + Location: 147,2 + Actor598: rea2 + Owner: MaleficScrin + Location: 155,2 + Actor599: rea2 + Owner: MaleficScrin + Location: 158,2 + Actor600: rea2 + Owner: MaleficScrin + Location: 144,2 + Actor604: nerv + Owner: MaleficScrin + Location: 150,6 + Actor605: scrt + Owner: MaleficScrin + Location: 153,6 + Actor608: sign + Owner: MaleficScrin + Location: 161,2 + Actor611: mani + Owner: MaleficScrin + Location: 160,6 + Actor612: rfgn + Owner: MaleficScrin + Location: 141,3 + Actor613: swal + Owner: MaleficScrin + Location: 142,1 + Actor614: swal + Owner: MaleficScrin + Location: 140,1 + Actor615: swal + Owner: MaleficScrin + Location: 141,1 + Actor616: swal + Owner: MaleficScrin + Location: 139,1 + Actor617: swal + Owner: MaleficScrin + Location: 138,1 + Actor618: swal + Owner: MaleficScrin + Location: 137,1 + Actor619: swal + Owner: MaleficScrin + Location: 137,2 + Actor620: swal + Owner: MaleficScrin + Location: 137,3 + Actor621: swal + Owner: MaleficScrin + Location: 137,4 + Actor622: swal + Owner: MaleficScrin + Location: 137,5 + Actor623: swal + Owner: MaleficScrin + Location: 137,6 + Actor624: swal + Owner: MaleficScrin + Location: 137,7 + Actor625: swal + Owner: MaleficScrin + Location: 137,8 + Actor626: swal + Owner: MaleficScrin + Location: 137,9 + Actor627: swal + Owner: MaleficScrin + Location: 138,9 + Actor628: swal + Owner: MaleficScrin + Location: 138,8 + Actor629: swal + Owner: MaleficScrin + Location: 136,8 + Actor630: swal + Owner: MaleficScrin + Location: 136,7 + Actor631: swal + Owner: MaleficScrin + Location: 164,1 + Actor632: swal + Owner: MaleficScrin + Location: 162,1 + Actor633: swal + Owner: MaleficScrin + Location: 163,1 + Actor634: swal + Owner: MaleficScrin + Location: 165,1 + Actor635: swal + Owner: MaleficScrin + Location: 166,1 + Actor636: swal + Owner: MaleficScrin + Location: 167,1 + Actor637: swal + Owner: MaleficScrin + Location: 167,3 + Actor638: swal + Owner: MaleficScrin + Location: 167,2 + Actor639: swal + Owner: MaleficScrin + Location: 167,4 + Actor640: swal + Owner: MaleficScrin + Location: 167,5 + Actor641: swal + Owner: MaleficScrin + Location: 167,6 + Actor642: swal + Owner: MaleficScrin + Location: 167,7 + Actor644: swal + Owner: MaleficScrin + Location: 168,7 + Actor645: swal + Owner: MaleficScrin + Location: 168,8 + Actor646: swal + Owner: MaleficScrin + Location: 167,8 + Actor647: swal + Owner: MaleficScrin + Location: 166,8 + Actor648: swal + Owner: MaleficScrin + Location: 166,9 + Actor649: swal + Owner: MaleficScrin + Location: 167,9 + Actor643: swal + Owner: MaleficScrin + Location: 146,19 + Actor650: swal + Owner: MaleficScrin + Location: 146,18 + Actor651: swal + Owner: MaleficScrin + Location: 147,19 + Actor652: swal + Owner: MaleficScrin + Location: 147,18 + Actor653: swal + Owner: MaleficScrin + Location: 148,19 + Actor654: swal + Owner: MaleficScrin + Location: 148,20 + Actor655: swal + Owner: MaleficScrin + Location: 147,20 + Actor656: swal + Owner: MaleficScrin + Location: 149,20 + Actor657: swal + Owner: MaleficScrin + Location: 148,21 + Actor658: swal + Owner: MaleficScrin + Location: 149,21 + Actor659: swal + Owner: MaleficScrin + Location: 150,21 + Actor660: swal + Owner: MaleficScrin + Location: 151,21 + Actor661: swal + Owner: MaleficScrin + Location: 153,21 + Actor662: swal + Owner: MaleficScrin + Location: 152,21 + Actor663: swal + Owner: MaleficScrin + Location: 154,21 + Actor664: swal + Owner: MaleficScrin + Location: 156,21 + Actor665: swal + Owner: MaleficScrin + Location: 155,21 + Actor666: swal + Owner: MaleficScrin + Location: 157,21 + Actor667: swal + Owner: MaleficScrin + Location: 157,20 + Actor668: swal + Owner: MaleficScrin + Location: 158,20 + Actor669: swal + Owner: MaleficScrin + Location: 158,21 + Actor670: swal + Owner: MaleficScrin + Location: 158,19 + Actor671: swal + Owner: MaleficScrin + Location: 159,20 + Actor672: swal + Owner: MaleficScrin + Location: 159,19 + Actor673: swal + Owner: MaleficScrin + Location: 159,18 + Actor674: swal + Owner: MaleficScrin + Location: 160,18 + Actor675: swal + Owner: MaleficScrin + Location: 160,19 + Actor676: swal + Owner: MaleficScrin + Location: 163,15 + Actor677: swal + Owner: MaleficScrin + Location: 163,14 + Actor678: swal + Owner: MaleficScrin + Location: 164,14 + Actor679: swal + Owner: MaleficScrin + Location: 164,15 + Actor680: swal + Owner: MaleficScrin + Location: 164,13 + Actor681: swal + Owner: MaleficScrin + Location: 165,14 + Actor682: swal + Owner: MaleficScrin + Location: 165,13 + Actor683: swal + Owner: MaleficScrin + Location: 140,14 + Actor684: swal + Owner: MaleficScrin + Location: 140,15 + Actor685: swal + Owner: MaleficScrin + Location: 141,14 + Actor686: swal + Owner: MaleficScrin + Location: 141,15 + Actor690: swal + Owner: MaleficScrin + Location: 139,14 + Actor691: swal + Owner: MaleficScrin + Location: 139,13 + Actor692: swal + Owner: MaleficScrin + Location: 140,13 + Actor687: shar + Owner: MaleficScrin + Location: 151,19 + Actor688: shar + Owner: MaleficScrin + Location: 155,19 + Actor689: shar + Owner: MaleficScrin + Location: 141,9 + Actor694: shar + Owner: MaleficScrin + Location: 166,3 + Actor695: shar + Owner: MaleficScrin + Location: 138,3 + Actor696: scol + Owner: MaleficScrin + Location: 149,19 + Actor697: scol + Owner: MaleficScrin + Location: 148,18 + ScriptTags: HardAndAbove + Actor698: scol + Owner: MaleficScrin + Location: 157,19 + Actor699: scol + Owner: MaleficScrin + Location: 158,18 + ScriptTags: HardAndAbove + Actor700: scol + Owner: MaleficScrin + Location: 141,13 + Actor701: scol + Owner: MaleficScrin + Location: 163,13 + Actor702: scol + Owner: MaleficScrin + Location: 166,7 + Actor703: scol + Owner: MaleficScrin + Location: 138,7 + Actor704: ptur + Owner: MaleficScrin + Location: 147,21 + TurretFacing: 552 + Actor705: ptur + Owner: MaleficScrin + Location: 139,15 + TurretFacing: 395 + Actor706: ptur + Owner: MaleficScrin + Location: 165,15 + TurretFacing: 606 + Actor707: ptur + Owner: MaleficScrin + Location: 160,20 + TurretFacing: 545 + Actor708: ptur + Owner: MaleficScrin + Location: 146,20 + TurretFacing: 511 + Actor709: ptur + Owner: MaleficScrin + Location: 159,21 + TurretFacing: 470 + Actor710: ptur + Owner: MaleficScrin + Location: 168,9 + TurretFacing: 538 + Actor711: ptur + Owner: MaleficScrin + Location: 136,9 + TurretFacing: 497 + Actor712: reac + Owner: MaleficScrin + Location: 143,7 + Actor603: srep + Owner: MaleficScrin + Location: 151,10 + Actor713: swal + Owner: MaleficScrin + Location: 168,1 + Actor714: swal + Owner: MaleficScrin + Location: 170,1 + Actor715: swal + Owner: MaleficScrin + Location: 169,1 + Actor716: swal + Owner: MaleficScrin + Location: 171,1 + Actor717: swal + Owner: MaleficScrin + Location: 172,1 + Actor718: swal + Owner: MaleficScrin + Location: 174,1 + Actor719: swal + Owner: MaleficScrin + Location: 173,1 + Actor720: swal + Owner: MaleficScrin + Location: 175,1 + Actor721: swal + Owner: MaleficScrin + Location: 177,1 + Actor722: swal + Owner: MaleficScrin + Location: 176,1 + Actor723: swal + Owner: MaleficScrin + Location: 178,1 + Actor724: swal + Owner: MaleficScrin + Location: 178,2 + Actor725: swal + Owner: MaleficScrin + Location: 178,3 + Actor726: swal + Owner: MaleficScrin + Location: 178,4 + Actor727: swal + Owner: MaleficScrin + Location: 178,5 + Actor728: swal + Owner: MaleficScrin + Location: 178,7 + Actor729: swal + Owner: MaleficScrin + Location: 178,6 + Actor730: swal + Owner: MaleficScrin + Location: 178,8 + Actor731: swal + Owner: MaleficScrin + Location: 177,8 + Actor733: swal + Owner: MaleficScrin + Location: 175,8 + Actor734: swal + Owner: MaleficScrin + Location: 176,9 + Actor735: swal + Owner: MaleficScrin + Location: 176,8 + Actor736: swal + Owner: MaleficScrin + Location: 175,9 + Actor737: swal + Owner: MaleficScrin + Location: 177,9 + Actor738: swal + Owner: MaleficScrin + Location: 174,9 + Actor739: swal + Owner: MaleficScrin + Location: 174,10 + Actor740: swal + Owner: MaleficScrin + Location: 175,10 + Actor741: swal + Owner: MaleficScrin + Location: 173,10 + Actor742: swal + Owner: MaleficScrin + Location: 173,11 + Actor743: swal + Owner: MaleficScrin + Location: 172,11 + Actor744: swal + Owner: MaleficScrin + Location: 172,10 + Actor746: rea2 + Owner: MaleficScrin + Location: 175,2 + Actor747: rea2 + Owner: MaleficScrin + Location: 172,2 + Actor748: rea2 + Owner: MaleficScrin + Location: 169,2 + Actor749: rea2 + Owner: MaleficScrin + Location: 172,5 + Actor750: rea2 + Owner: MaleficScrin + Location: 169,5 + Actor751: rea2 + Owner: MaleficScrin + Location: 175,5 + Actor732: swal + Owner: MaleficScrin + Location: 168,5 + Actor745: swal + Owner: MaleficScrin + Location: 168,6 + Actor752: swal + Owner: MaleficScrin + Location: 168,4 + Actor753: swal + Owner: MaleficScrin + Location: 168,3 + Actor754: swal + Owner: MaleficScrin + Location: 168,2 + Actor755: ptur + Owner: MaleficScrin + Location: 173,12 + TurretFacing: 566 + Actor756: proc.scrin + Owner: MaleficScrin + Location: 162,8 + Actor757: shar + Owner: MaleficScrin + Location: 162,14 + Actor758: shar + Owner: MaleficScrin + Location: 173,9 + Actor759: split2 + Owner: Neutral + Location: 171,16 + Actor760: split2 + Owner: Neutral + Location: 166,20 + Actor761: split2 + Owner: Neutral + Location: 177,15 + Actor762: swal + Owner: MaleficScrin + Location: 179,161 + Actor763: swal + Owner: MaleficScrin + Location: 179,162 + Actor764: swal + Owner: MaleficScrin + Location: 180,162 + Actor765: swal + Owner: MaleficScrin + Location: 180,161 + Actor766: swal + Owner: MaleficScrin + Location: 179,160 + Actor767: swal + Owner: MaleficScrin + Location: 178,160 + Actor768: swal + Owner: MaleficScrin + Location: 178,161 + Actor769: swal + Owner: MaleficScrin + Location: 178,159 + Actor770: swal + Owner: MaleficScrin + Location: 178,157 + Actor771: swal + Owner: MaleficScrin + Location: 178,158 + Actor772: swal + Owner: MaleficScrin + Location: 178,156 + Actor773: swal + Owner: MaleficScrin + Location: 178,154 + Actor774: swal + Owner: MaleficScrin + Location: 178,155 + Actor775: swal + Owner: MaleficScrin + Location: 179,154 + Actor776: swal + Owner: MaleficScrin + Location: 179,155 + Actor777: swal + Owner: MaleficScrin + Location: 179,153 + Actor778: swal + Owner: MaleficScrin + Location: 180,154 + Actor779: swal + Owner: MaleficScrin + Location: 180,153 + Actor780: swal + Owner: MaleficScrin + Location: 179,148 + Actor781: swal + Owner: MaleficScrin + Location: 179,147 + Actor782: swal + Owner: MaleficScrin + Location: 180,148 + Actor783: swal + Owner: MaleficScrin + Location: 180,147 + Actor784: swal + Owner: MaleficScrin + Location: 180,146 + Actor785: swal + Owner: MaleficScrin + Location: 180,145 + Actor786: swal + Owner: MaleficScrin + Location: 180,144 + Actor787: swal + Owner: MaleficScrin + Location: 180,143 + Actor788: swal + Owner: MaleficScrin + Location: 181,143 + Actor789: swal + Owner: MaleficScrin + Location: 181,142 + Actor790: swal + Owner: MaleficScrin + Location: 182,142 + Actor791: swal + Owner: MaleficScrin + Location: 182,143 + Actor792: swal + Owner: MaleficScrin + Location: 183,142 + Actor793: swal + Owner: MaleficScrin + Location: 183,143 + Actor794: swal + Owner: MaleficScrin + Location: 184,143 + Actor795: swal + Owner: MaleficScrin + Location: 185,143 + Actor796: swal + Owner: MaleficScrin + Location: 186,142 + Actor797: swal + Owner: MaleficScrin + Location: 186,143 + Actor798: swal + Owner: MaleficScrin + Location: 188,142 + Actor799: swal + Owner: MaleficScrin + Location: 187,142 + Actor800: swal + Owner: MaleficScrin + Location: 189,142 + Actor801: swal + Owner: MaleficScrin + Location: 190,142 + Actor802: swal + Owner: MaleficScrin + Location: 190,141 + Actor806: swal + Owner: MaleficScrin + Location: 192,141 + Actor807: swal + Owner: MaleficScrin + Location: 191,141 + Actor808: swal + Owner: MaleficScrin + Location: 191,142 + Actor809: swal + Owner: MaleficScrin + Location: 192,142 + Actor810: swal + Owner: MaleficScrin + Location: 192,143 + Actor803: swal + Owner: MaleficScrin + Location: 192,144 + Actor804: swal + Owner: MaleficScrin + Location: 192,146 + Actor805: swal + Owner: MaleficScrin + Location: 192,145 + Actor811: swal + Owner: MaleficScrin + Location: 192,147 + Actor812: swal + Owner: MaleficScrin + Location: 192,148 + Actor815: swal + Owner: MaleficScrin + Location: 192,162 + Actor816: swal + Owner: MaleficScrin + Location: 191,162 + Actor817: swal + Owner: MaleficScrin + Location: 191,161 + Actor818: swal + Owner: MaleficScrin + Location: 192,161 + Actor819: swal + Owner: MaleficScrin + Location: 190,162 + Actor820: swal + Owner: MaleficScrin + Location: 189,162 + Actor821: swal + Owner: MaleficScrin + Location: 181,162 + Actor822: swal + Owner: MaleficScrin + Location: 182,162 + Actor823: swal + Owner: MaleficScrin + Location: 182,161 + Actor824: swal + Owner: MaleficScrin + Location: 183,161 + Actor825: swal + Owner: MaleficScrin + Location: 183,162 + Actor826: swal + Owner: MaleficScrin + Location: 189,161 + Actor827: swal + Owner: MaleficScrin + Location: 188,161 + Actor828: swal + Owner: MaleficScrin + Location: 188,162 + Actor813: swal + Owner: MaleficScrin + Location: 192,160 + Actor814: swal + Owner: MaleficScrin + Location: 192,158 + Actor829: swal + Owner: MaleficScrin + Location: 192,159 + Actor830: swal + Owner: MaleficScrin + Location: 192,157 + Actor831: swal + Owner: MaleficScrin + Location: 192,156 + Actor832: swal + Owner: MaleficScrin + Location: 192,155 + Actor833: swal + Owner: MaleficScrin + Location: 192,154 + Actor834: swal + Owner: MaleficScrin + Location: 192,152 + Actor835: swal + Owner: MaleficScrin + Location: 192,153 + Actor836: swal + Owner: MaleficScrin + Location: 192,151 + Actor837: swal + Owner: MaleficScrin + Location: 192,150 + Actor838: swal + Owner: MaleficScrin + Location: 192,149 + Actor842: rea2 + Owner: MaleficScrin + Location: 181,144 + Actor843: rea2 + Owner: MaleficScrin + Location: 184,144 + Actor847: ptur + Owner: MaleficScrin + Location: 182,163 + Actor848: ptur + Owner: MaleficScrin + Location: 189,163 + Actor849: ptur + Owner: MaleficScrin + Location: 178,153 + Actor850: ptur + Owner: MaleficScrin + Location: 178,148 + Actor851: scol + Owner: MaleficScrin + Location: 181,161 + ScriptTags: HardAndAbove + Actor852: scol + Owner: MaleficScrin + Location: 179,159 + ScriptTags: HardAndAbove + Actor853: scol + Owner: MaleficScrin + Location: 190,161 + Actor854: scol + Owner: MaleficScrin + Location: 181,148 + Actor844: rea2 + Owner: MaleficScrin + Location: 189,152 + Actor855: rea2 + Owner: MaleficScrin + Location: 189,149 + Actor856: srep + Owner: MaleficScrin + Location: 187,146 + Actor846: silo.scrin + Owner: MaleficScrin + Location: 191,148 + Actor857: silo.scrin + Owner: MaleficScrin + Location: 191,147 + Actor858: swal + Owner: MaleficScrin + Location: 3,89 + Actor859: swal + Owner: MaleficScrin + Location: 2,89 + Actor860: swal + Owner: MaleficScrin + Location: 1,89 + Actor861: swal + Owner: MaleficScrin + Location: 1,88 + Actor862: swal + Owner: MaleficScrin + Location: 1,86 + Actor863: swal + Owner: MaleficScrin + Location: 1,87 + Actor864: swal + Owner: MaleficScrin + Location: 1,85 + Actor865: swal + Owner: MaleficScrin + Location: 1,83 + Actor866: swal + Owner: MaleficScrin + Location: 1,84 + Actor867: swal + Owner: MaleficScrin + Location: 1,82 + Actor868: swal + Owner: MaleficScrin + Location: 1,81 + Actor869: swal + Owner: MaleficScrin + Location: 1,80 + Actor870: swal + Owner: MaleficScrin + Location: 1,78 + Actor871: swal + Owner: MaleficScrin + Location: 1,79 + Actor872: swal + Owner: MaleficScrin + Location: 1,77 + Actor873: swal + Owner: MaleficScrin + Location: 1,76 + Actor874: swal + Owner: MaleficScrin + Location: 1,75 + Actor875: swal + Owner: MaleficScrin + Location: 1,73 + Actor876: swal + Owner: MaleficScrin + Location: 1,74 + Actor877: swal + Owner: MaleficScrin + Location: 1,72 + Actor878: swal + Owner: MaleficScrin + Location: 1,71 + Actor879: swal + Owner: MaleficScrin + Location: 1,70 + Actor880: swal + Owner: MaleficScrin + Location: 1,69 + Actor882: rea2 + Owner: MaleficScrin + Location: 2,77 + Actor883: rea2 + Owner: MaleficScrin + Location: 2,80 + Actor884: rea2 + Owner: MaleficScrin + Location: 2,83 + Actor885: rea2 + Owner: MaleficScrin + Location: 6,83 + Actor886: rea2 + Owner: MaleficScrin + Location: 6,80 + Actor887: rea2 + Owner: MaleficScrin + Location: 6,77 + Actor888: swal + Owner: MaleficScrin + Location: 2,88 + Actor889: swal + Owner: MaleficScrin + Location: 4,89 + Actor890: swal + Owner: MaleficScrin + Location: 6,89 + Actor891: swal + Owner: MaleficScrin + Location: 5,89 + Actor892: swal + Owner: MaleficScrin + Location: 8,89 + Actor893: swal + Owner: MaleficScrin + Location: 7,89 + Actor894: swal + Owner: MaleficScrin + Location: 9,89 + Actor895: swal + Owner: MaleficScrin + Location: 11,89 + Actor896: swal + Owner: MaleficScrin + Location: 10,89 + Actor897: swal + Owner: MaleficScrin + Location: 11,88 + Actor898: swal + Owner: MaleficScrin + Location: 9,88 + Actor899: swal + Owner: MaleficScrin + Location: 10,88 + Actor900: swal + Owner: MaleficScrin + Location: 16,88 + Actor901: swal + Owner: MaleficScrin + Location: 16,89 + Actor902: swal + Owner: MaleficScrin + Location: 17,89 + Actor903: swal + Owner: MaleficScrin + Location: 17,88 + Actor904: swal + Owner: MaleficScrin + Location: 18,88 + Actor905: swal + Owner: MaleficScrin + Location: 18,89 + Actor906: swal + Owner: MaleficScrin + Location: 19,89 + Actor907: swal + Owner: MaleficScrin + Location: 21,89 + Actor908: swal + Owner: MaleficScrin + Location: 20,89 + Actor909: swal + Owner: MaleficScrin + Location: 21,88 + Actor910: swal + Owner: MaleficScrin + Location: 22,88 + Actor911: swal + Owner: MaleficScrin + Location: 22,89 + Actor912: swal + Owner: MaleficScrin + Location: 22,87 + Actor913: swal + Owner: MaleficScrin + Location: 23,88 + Actor914: swal + Owner: MaleficScrin + Location: 23,87 + Actor915: swal + Owner: MaleficScrin + Location: 23,86 + Actor916: swal + Owner: MaleficScrin + Location: 24,86 + Actor917: swal + Owner: MaleficScrin + Location: 24,87 + Actor918: swal + Owner: MaleficScrin + Location: 24,85 + Actor919: swal + Owner: MaleficScrin + Location: 24,83 + Actor920: swal + Owner: MaleficScrin + Location: 24,84 + Actor921: swal + Owner: MaleficScrin + Location: 24,82 + Actor922: swal + Owner: MaleficScrin + Location: 23,82 + Actor923: swal + Owner: MaleficScrin + Location: 23,83 + Actor924: swal + Owner: MaleficScrin + Location: 23,77 + Actor925: swal + Owner: MaleficScrin + Location: 23,76 + Actor926: swal + Owner: MaleficScrin + Location: 24,76 + Actor927: swal + Owner: MaleficScrin + Location: 24,77 + Actor928: swal + Owner: MaleficScrin + Location: 24,75 + Actor929: swal + Owner: MaleficScrin + Location: 24,74 + Actor930: swal + Owner: MaleficScrin + Location: 24,73 + Actor931: swal + Owner: MaleficScrin + Location: 24,71 + Actor932: swal + Owner: MaleficScrin + Location: 24,72 + Actor933: swal + Owner: MaleficScrin + Location: 23,71 + Actor934: swal + Owner: MaleficScrin + Location: 23,72 + Actor935: swal + Owner: MaleficScrin + Location: 22,70 + Actor936: swal + Owner: MaleficScrin + Location: 22,71 + Actor937: swal + Owner: MaleficScrin + Location: 23,70 + Actor938: swal + Owner: MaleficScrin + Location: 22,69 + Actor939: swal + Owner: MaleficScrin + Location: 21,69 + Actor940: swal + Owner: MaleficScrin + Location: 21,70 + Actor941: swal + Owner: MaleficScrin + Location: 20,69 + Actor942: swal + Owner: MaleficScrin + Location: 20,68 + Actor943: swal + Owner: MaleficScrin + Location: 21,68 + Actor944: swal + Owner: MaleficScrin + Location: 19,68 + Actor945: swal + Owner: MaleficScrin + Location: 18,68 + Actor946: swal + Owner: MaleficScrin + Location: 17,68 + Actor947: swal + Owner: MaleficScrin + Location: 16,68 + Actor948: swal + Owner: MaleficScrin + Location: 15,68 + Actor949: swal + Owner: MaleficScrin + Location: 14,69 + Actor950: swal + Owner: MaleficScrin + Location: 15,69 + Actor951: swal + Owner: MaleficScrin + Location: 14,68 + Actor952: swal + Owner: MaleficScrin + Location: 7,68 + Actor953: swal + Owner: MaleficScrin + Location: 7,69 + Actor954: swal + Owner: MaleficScrin + Location: 6,69 + Actor955: swal + Owner: MaleficScrin + Location: 6,68 + Actor956: swal + Owner: MaleficScrin + Location: 5,68 + Actor957: swal + Owner: MaleficScrin + Location: 4,68 + Actor958: swal + Owner: MaleficScrin + Location: 2,68 + Actor959: swal + Owner: MaleficScrin + Location: 1,68 + Actor960: swal + Owner: MaleficScrin + Location: 3,68 + Actor961: proc.scrin + Owner: MaleficScrin + Location: 15,82 + Actor965: nerv + Owner: MaleficScrin + Location: 10,79 + Actor966: scrt + Owner: MaleficScrin + Location: 2,69 + Actor967: scol + Owner: MaleficScrin + Location: 23,75 + Actor968: scol + Owner: MaleficScrin + Location: 23,84 + Actor969: scol + Owner: MaleficScrin + Location: 16,69 + Actor970: scol + Owner: MaleficScrin + Location: 19,88 + Actor971: scol + Owner: MaleficScrin + Location: 8,88 + Actor972: ptur + Owner: MaleficScrin + Location: 16,90 + TurretFacing: 484 + Actor973: ptur + Owner: MaleficScrin + Location: 11,90 + TurretFacing: 606 + Actor974: ptur + Owner: MaleficScrin + Location: 25,82 + TurretFacing: 702 + Actor975: ptur + Owner: MaleficScrin + Location: 25,77 + TurretFacing: 702 + Actor976: shar + Owner: MaleficScrin + Location: 21,87 + Actor977: shar + Owner: MaleficScrin + Location: 21,71 + Actor980: shar + Owner: MaleficScrin + Location: 3,88 + Actor981: shar + Owner: MaleficScrin + Location: 6,75 + Actor982: shar + Owner: MaleficScrin + Location: 13,80 + Actor984: srep + Owner: MaleficScrin + Location: 5,70 + Actor987: s1 + Owner: MaleficScrin + Facing: 384 + Location: 74,130 + SubCell: 3 + Actor988: s1 + Owner: MaleficScrin + Facing: 384 + Location: 77,130 + SubCell: 3 + Actor991: s1 + Owner: MaleficScrin + Location: 78,129 + SubCell: 3 + Facing: 211 + Actor992: s1 + Owner: MaleficScrin + Location: 67,131 + SubCell: 3 + Facing: 654 + Actor993: s1 + Owner: MaleficScrin + Facing: 384 + Location: 134,129 + SubCell: 3 + Actor994: s1 + Owner: MaleficScrin + Facing: 384 + Location: 132,128 + SubCell: 3 + Actor995: s1 + Owner: MaleficScrin + Facing: 384 + Location: 136,125 + SubCell: 3 + Actor996: s1 + Owner: MaleficScrin + Location: 135,127 + SubCell: 3 + Facing: 654 + Actor997: s1 + Owner: MaleficScrin + Facing: 384 + Location: 140,128 + SubCell: 3 + Actor998: s1 + Owner: MaleficScrin + Location: 141,123 + SubCell: 3 + Facing: 702 + Actor1000: gunw + Owner: MaleficScrin + Facing: 384 + Location: 134,126 + Actor1002: tpod + Owner: MaleficScrin + Location: 133,121 + Facing: 384 + ScriptTags: HardAndAbove + Actor1003: devo + Owner: MaleficScrin + Location: 107,159 + Facing: 525 + Actor1004: devo + Owner: MaleficScrin + Location: 109,158 + Facing: 504 + Actor1005: s4 + Owner: MaleficScrin + Facing: 384 + Location: 133,167 + SubCell: 3 + Actor1006: s4 + Owner: MaleficScrin + Facing: 384 + Location: 135,169 + SubCell: 3 + Actor1007: s1 + Owner: MaleficScrin + Facing: 384 + Location: 132,166 + SubCell: 3 + Actor1008: s1 + Owner: MaleficScrin + Facing: 384 + Location: 132,167 + SubCell: 3 + Actor1009: s1 + Owner: MaleficScrin + Facing: 384 + Location: 137,169 + SubCell: 3 + Actor1010: s3 + Owner: MaleficScrin + Facing: 384 + Location: 135,167 + SubCell: 3 + Actor1011: s3 + Owner: MaleficScrin + Facing: 384 + Location: 137,171 + SubCell: 3 + Actor1012: s3 + Owner: MaleficScrin + Facing: 384 + Location: 133,164 + SubCell: 3 + Actor1013: s3 + Owner: MaleficScrin + Location: 109,159 + SubCell: 3 + Facing: 518 + Actor1014: s3 + Owner: MaleficScrin + Location: 110,156 + SubCell: 3 + Facing: 716 + Actor1015: s3 + Owner: MaleficScrin + Location: 105,159 + SubCell: 3 + Facing: 668 + Actor1016: intl + Owner: MaleficScrin + Facing: 384 + Location: 179,164 + Actor1017: intl + Owner: MaleficScrin + Facing: 384 + Location: 176,161 + Actor1018: intl + Owner: MaleficScrin + Facing: 384 + Location: 174,150 + Actor1019: s1 + Owner: MaleficScrin + Facing: 384 + Location: 188,150 + SubCell: 3 + Actor1020: s1 + Owner: MaleficScrin + Facing: 384 + Location: 185,148 + SubCell: 3 + Actor1021: s1 + Owner: MaleficScrin + Facing: 384 + Location: 185,148 + SubCell: 1 + Actor1022: s1 + Owner: MaleficScrin + Facing: 384 + Location: 183,147 + SubCell: 3 + Actor1023: s1 + Owner: MaleficScrin + Facing: 384 + Location: 190,146 + SubCell: 3 + Actor1024: s1 + Owner: MaleficScrin + Facing: 384 + Location: 191,157 + SubCell: 3 + Actor1025: s3 + Owner: MaleficScrin + Facing: 384 + Location: 191,156 + SubCell: 3 + Actor1026: s3 + Owner: MaleficScrin + Facing: 384 + Location: 185,147 + SubCell: 3 + Actor1027: s3 + Owner: MaleficScrin + Facing: 384 + Location: 191,146 + SubCell: 3 + Actor1028: s3 + Owner: MaleficScrin + Facing: 384 + Location: 164,3 + SubCell: 3 + Actor1029: s3 + Owner: MaleficScrin + Location: 144,5 + SubCell: 3 + Facing: 654 + Actor1030: s3 + Owner: MaleficScrin + Location: 150,3 + SubCell: 3 + Facing: 668 + Actor1031: s3 + Owner: MaleficScrin + Facing: 384 + Location: 156,9 + SubCell: 3 + Actor1032: s3 + Owner: MaleficScrin + Facing: 384 + Location: 163,6 + SubCell: 3 + Actor1033: s3 + Owner: MaleficScrin + Location: 171,8 + SubCell: 3 + Facing: 384 + Actor1034: s3 + Owner: MaleficScrin + Facing: 384 + Location: 139,5 + SubCell: 3 + Actor1035: s1 + Owner: MaleficScrin + Facing: 384 + Location: 145,6 + SubCell: 3 + Actor1036: s1 + Owner: MaleficScrin + Facing: 384 + Location: 142,6 + SubCell: 3 + Actor1037: s1 + Owner: MaleficScrin + Facing: 384 + Location: 152,6 + SubCell: 3 + Actor1038: s1 + Owner: MaleficScrin + Location: 156,5 + SubCell: 3 + Facing: 586 + Actor1039: s1 + Owner: MaleficScrin + Facing: 384 + Location: 154,4 + SubCell: 3 + Actor1040: s1 + Owner: MaleficScrin + Location: 147,5 + SubCell: 3 + Facing: 709 + Actor1041: s1 + Owner: MaleficScrin + Location: 149,10 + SubCell: 3 + Facing: 668 + Actor1042: s1 + Owner: MaleficScrin + Location: 160,9 + SubCell: 3 + Facing: 566 + Actor1043: s1 + Owner: MaleficScrin + Facing: 384 + Location: 164,4 + SubCell: 3 + Actor1045: chain + Owner: England + Location: 74,102 + Actor1046: chain + Owner: England + Location: 69,102 + Health: 34 + Actor1047: chain + Owner: England + Location: 68,102 + Actor1048: chain + Owner: England + Location: 68,101 + Actor1049: chain + Owner: England + Location: 68,99 + Actor1050: chain + Owner: England + Location: 68,100 + Health: 38 + Actor1051: chain + Owner: England + Location: 68,98 + Actor1052: chain + Owner: England + Location: 68,97 + Actor1053: chain + Owner: England + Location: 68,96 + Actor1054: chain + Owner: England + Location: 69,96 + Actor1055: chain + Owner: England + Location: 70,96 + Actor1057: chain + Owner: England + Location: 74,96 + Actor1058: chain + Owner: England + Location: 75,96 + Actor1059: chain + Owner: England + Location: 75,97 + Actor1060: chain + Owner: England + Location: 75,98 + Health: 21 + Actor1061: chain + Owner: England + Location: 75,99 + Actor1062: chain + Owner: England + Location: 75,100 + Actor1063: chain + Owner: England + Location: 75,101 + Actor1064: chain + Owner: England + Location: 75,102 + Actor1065: split2 + Owner: Neutral + Location: 126,77 + Actor1066: split2 + Owner: Neutral + Location: 130,83 + Actor1067: chain + Owner: England + Location: 70,102 + Actor1091: split2 + Owner: Neutral + Location: 183,171 + Actor1097: split2 + Owner: Neutral + Location: 188,170 + Actor1098: split2 + Owner: Neutral + Location: 10,95 + Actor1099: split2 + Owner: Neutral + Location: 19,93 + Actor1100: split2 + Owner: Neutral + Location: 5,92 + Actor839: proc.scrin + Owner: MaleficScrin + Location: 187,156 + Actor1069: dark + Owner: MaleficScrin + Location: 136,65 + Facing: 384 + ScriptTags: HardAndAbove + Actor1071: dark + Owner: MaleficScrin + Location: 141,62 + Facing: 497 + Actor1073: dark + Owner: MaleficScrin + Location: 67,66 + Facing: 531 + Actor1074: shrw + Owner: MaleficScrin + Location: 142,68 + Facing: 518 + Actor1076: stlk + Owner: MaleficScrin + Facing: 384 + Location: 73,70 + SubCell: 3 + Actor1077: stlk + Owner: MaleficScrin + Facing: 384 + Location: 68,64 + SubCell: 3 + Actor1079: stlk + Owner: MaleficScrin + Facing: 384 + Location: 140,67 + SubCell: 3 + Actor1080: stlk + Owner: MaleficScrin + Facing: 384 + Location: 147,64 + SubCell: 3 + Actor1081: stlk + Owner: MaleficScrin + Facing: 384 + Location: 147,71 + SubCell: 3 + Actor1082: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 256 + Location: 32,189 + Actor1083: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 256 + Location: 33,187 + Actor1084: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 256 + Location: 33,184 + Actor1085: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 256 + Location: 31,182 + Actor1086: stlk + Owner: MaleficScrin + SubCell: 3 + Facing: 256 + Location: 30,181 + Actor576: dark + Owner: MaleficScrin + Facing: 256 + Location: 35,189 + Actor575: dark + Owner: MaleficScrin + Facing: 256 + Location: 33,181 + Actor562: oilb + Owner: Neutral + Location: 64,173 + Health: 59 + Actor563: oilb + Owner: Neutral + Location: 67,173 + Health: 69 + Actor1092: chain + Owner: Neutral + Location: 48,165 + Actor1093: chain + Owner: Neutral + Location: 47,165 + Actor1095: chain + Owner: Neutral + Location: 46,165 + Actor1096: chain + Owner: Neutral + Location: 52,165 + Actor1132: chain + Owner: Neutral + Location: 53,165 + Actor1131: cycl + Owner: Neutral + Location: 53,164 + Actor1133: cycl + Owner: Neutral + Location: 53,163 + Actor1134: cycl + Owner: Neutral + Location: 53,162 + Actor1135: cycl + Owner: Neutral + Location: 53,161 + Actor1136: cycl + Owner: Neutral + Location: 53,159 + Actor1137: cycl + Owner: Neutral + Location: 53,160 + Actor1138: cycl + Owner: Neutral + Location: 52,159 + Actor1139: cycl + Owner: Neutral + Location: 51,159 + Actor1140: cycl + Owner: Neutral + Location: 50,159 + Actor1141: cycl + Owner: Neutral + Location: 48,159 + Actor1142: cycl + Owner: Neutral + Location: 49,159 + Actor1143: cycl + Owner: Neutral + Location: 47,159 + Actor1144: cycl + Owner: Neutral + Location: 46,159 + Actor1145: cycl + Owner: Neutral + Location: 46,160 + Actor1146: cycl + Owner: Neutral + Location: 46,161 + Actor1147: cycl + Owner: Neutral + Location: 46,163 + Actor1148: cycl + Owner: Neutral + Location: 46,162 + Actor1149: cycl + Owner: Neutral + Location: 46,164 + Actor1087: oilr + Owner: Neutral + Location: 48,161 + Health: 59 + Actor1088: tc04 + Owner: Neutral + Location: 133,173 + Actor1089: t16 + Owner: Neutral + Location: 136,172 + Actor1090: t15 + Owner: Neutral + Location: 137,172 + Actor1094: t11 + Owner: Neutral + Location: 135,175 + Actor1101: tc01 + Owner: Neutral + Location: 134,176 + Actor1102: tc05 + Owner: Neutral + Location: 132,178 + Actor1103: t14 + Owner: Neutral + Location: 134,177 + Actor1104: t12 + Owner: Neutral + Location: 133,176 + Actor1105: t17 + Owner: Neutral + Location: 136,173 + Actor1106: t07 + Owner: Neutral + Location: 137,174 + Actor1107: t02 + Owner: Neutral + Location: 137,176 + Actor1109: tc03 + Owner: Neutral + Location: 136,178 + Actor1108: t13 + Owner: Neutral + Location: 138,177 + Actor1110: t15 + Owner: Neutral + Location: 137,179 + Actor1111: t15 + Owner: Neutral + Location: 131,180 + Actor1112: t06 + Owner: Neutral + Location: 130,182 + Actor1113: tc01 + Owner: Neutral + Location: 131,182 + Actor1114: tc02 + Owner: Neutral + Location: 131,184 + Actor1115: t10 + Owner: Neutral + Location: 132,183 + Actor1116: t14 + Owner: Neutral + Location: 132,181 + Actor1117: t11 + Owner: Neutral + Location: 135,180 + Actor1118: tc01 + Owner: Neutral + Location: 139,175 + Actor1119: t02 + Owner: Neutral + Location: 135,183 + Actor1120: t01 + Owner: Neutral + Location: 137,181 + Actor1121: t05 + Owner: Neutral + Location: 140,172 + Actor1122: t06 + Owner: Neutral + Location: 138,174 + Actor1123: t16 + Owner: Neutral + Location: 136,187 + Actor1124: tc01 + Owner: Neutral + Location: 132,191 + Actor1125: tc03 + Owner: Neutral + Location: 131,186 + Actor1126: t16 + Owner: Neutral + Location: 126,190 + Actor1127: t05 + Owner: Neutral + Location: 124,189 + Actor1128: t02 + Owner: Neutral + Location: 129,188 + Actor1129: t03 + Owner: Neutral + Location: 130,190 + Actor1130: t03 + Owner: Neutral + Location: 138,186 + Actor1150: t12 + Owner: Neutral + Location: 137,190 + Actor1151: t05 + Owner: Neutral + Location: 139,186 + Actor1152: t01 + Owner: Neutral + Location: 119,190 + Actor1153: tc04 + Owner: Neutral + Location: 117,187 + Actor1154: t13 + Owner: Neutral + Location: 120,186 + Actor1155: t11 + Owner: Neutral + Location: 114,191 + Actor1156: t11 + Owner: Neutral + Location: 126,188 + Actor1157: t14 + Owner: Neutral + Location: 110,190 + Actor1158: t11 + Owner: Neutral + Location: 125,184 + Actor1159: t15 + Owner: Neutral + Location: 132,189 + Actor1160: t13 + Owner: Neutral + Location: 142,184 + Actor1161: tc01 + Owner: Neutral + Location: 143,185 + Actor1163: tc01 + Owner: Neutral + Location: 135,162 + Actor1164: tc04 + Owner: Neutral + Location: 133,159 + Actor1165: t03 + Owner: Neutral + Location: 135,160 + Actor1166: t11 + Owner: Neutral + Location: 134,158 + Actor1167: t11 + Owner: Neutral + Location: 130,158 + Actor1168: t10 + Owner: Neutral + Location: 132,157 + Actor1169: t11 + Owner: Neutral + Location: 136,161 + Actor1170: t02 + Owner: Neutral + Location: 132,159 + Actor1171: t01 + Owner: Neutral + Location: 131,157 + Actor1172: t05 + Owner: Neutral + Location: 129,156 + Actor1173: t02 + Owner: Neutral + Location: 126,158 + Actor1174: t01 + Owner: Neutral + Location: 138,159 + Actor1176: tc01 + Owner: Neutral + Location: 138,161 + Actor1177: tc02 + Owner: Neutral + Location: 140,162 + Actor1175: t14 + Owner: Neutral + Location: 138,162 + Actor1178: t13 + Owner: Neutral + Location: 140,160 + Actor1179: t10 + Owner: Neutral + Location: 137,156 + Actor1180: t03 + Owner: Neutral + Location: 142,157 + Actor1181: t01 + Owner: Neutral + Location: 142,161 + Actor1184: t15 + Owner: Neutral + Location: 143,162 + Actor1185: t12 + Owner: Neutral + Location: 143,173 + Actor1188: t13 + Owner: Neutral + Location: 147,161 + Actor1189: t06 + Owner: Neutral + Location: 144,158 + Actor1190: t02 + Owner: Neutral + Location: 150,163 + Actor1191: t01 + Owner: Neutral + Location: 144,152 + Actor1192: t06 + Owner: Neutral + Location: 148,175 + Actor1193: tc01 + Owner: Neutral + Location: 124,168 + Actor1194: tc05 + Owner: Neutral + Location: 119,167 + Actor1195: t13 + Owner: Neutral + Location: 123,171 + Actor1196: t07 + Owner: Neutral + Location: 124,170 + Actor1197: t13 + Owner: Neutral + Location: 122,168 + Actor1198: t11 + Owner: Neutral + Location: 121,170 + Actor1199: t05 + Owner: Neutral + Location: 120,170 + Actor1200: tc04 + Owner: Neutral + Location: 120,173 + Actor1201: t11 + Owner: Neutral + Location: 118,174 + Actor1202: t13 + Owner: Neutral + Location: 120,171 + Actor1203: t03 + Owner: Neutral + Location: 121,172 + Actor1204: t12 + Owner: Neutral + Location: 123,169 + Actor1205: t02 + Owner: Neutral + Location: 122,171 + Actor1206: t05 + Owner: Neutral + Location: 119,169 + Actor1207: t01 + Owner: Neutral + Location: 119,172 + Actor1208: t05 + Owner: Neutral + Location: 118,166 + Actor1209: t02 + Owner: Neutral + Location: 122,166 + Actor1210: tc02 + Owner: Neutral + Location: 114,160 + Actor1212: t02 + Owner: Neutral + Location: 112,162 + Actor1213: t10 + Owner: Neutral + Location: 114,162 + Actor1214: t06 + Owner: Neutral + Location: 116,161 + Actor1215: t01 + Owner: Neutral + Location: 114,158 + Actor1216: tc01 + Owner: Neutral + Location: 117,163 + Actor1217: tc03 + Owner: Neutral + Location: 117,161 + Actor1218: t07 + Owner: Neutral + Location: 119,163 + Actor1219: t12 + Owner: Neutral + Location: 116,162 + Actor1220: t12 + Owner: Neutral + Location: 117,159 + Actor1221: t02 + Owner: Neutral + Location: 115,156 + Actor1222: t14 + Owner: Neutral + Location: 122,163 + Actor1223: t11 + Owner: Neutral + Location: 120,162 + Actor1224: t13 + Owner: Neutral + Location: 115,153 + Actor1225: t10 + Owner: Neutral + Location: 108,173 + Actor1226: t06 + Owner: Neutral + Location: 109,170 + Actor1227: t02 + Owner: Neutral + Location: 115,174 + Actor1228: t01 + Owner: Neutral + Location: 111,178 + Actor1229: t10 + Owner: Neutral + Location: 112,180 + Actor1230: t06 + Owner: Neutral + Location: 113,186 + Actor1231: tc01 + Owner: Neutral + Location: 176,190 + Actor1232: t13 + Owner: Neutral + Location: 183,184 + Actor1233: t10 + Owner: Neutral + Location: 181,186 + Actor1234: tc04 + Owner: Neutral + Location: 187,188 + Actor1235: t15 + Owner: Neutral + Location: 190,188 + Actor1236: t11 + Owner: Neutral + Location: 184,191 + Actor1237: t12 + Owner: Neutral + Location: 185,190 + Actor1238: t11 + Owner: Neutral + Location: 190,182 + Actor1239: t03 + Owner: Neutral + Location: 178,181 + Actor1240: t03 + Owner: Neutral + Location: 171,190 + Actor1241: t06 + Owner: Neutral + Location: 169,187 + Actor1242: t02 + Owner: Neutral + Location: 176,181 + Actor1243: t11 + Owner: Neutral + Location: 187,179 + Actor1244: t11 + Owner: Neutral + Location: 174,185 + Actor1245: tc04 + Owner: Neutral + Location: 185,183 + Actor1246: tc02 + Owner: Neutral + Location: 177,186 + Actor1247: t16 + Owner: Neutral + Location: 179,185 + Actor1248: t02 + Owner: Neutral + Location: 172,189 + Actor1249: t01 + Owner: Neutral + Location: 172,186 + Actor1250: t06 + Owner: Neutral + Location: 173,188 + Actor1251: t05 + Owner: Neutral + Location: 179,180 + Actor1252: t05 + Owner: Neutral + Location: 178,191 + Actor1253: t08 + Owner: Neutral + Location: 175,187 + Actor1254: t17 + Owner: Neutral + Location: 182,190 + Actor1255: t12 + Owner: Neutral + Location: 176,185 + Actor1256: t02 + Owner: Neutral + Location: 180,187 + Actor1257: t15 + Owner: Neutral + Location: 190,178 + Actor1258: t13 + Owner: Neutral + Location: 181,180 + Actor1259: t16 + Owner: Neutral + Location: 169,183 + Actor1260: t16 + Owner: Neutral + Location: 182,184 + Actor1261: t16 + Owner: Neutral + Location: 188,183 + Actor1262: t16 + Owner: Neutral + Location: 192,184 + Actor1263: t16 + Owner: Neutral + Location: 184,179 + Actor1264: t16 + Owner: Neutral + Location: 190,191 + Actor1265: t11 + Owner: Neutral + Location: 187,191 + Actor1266: t13 + Owner: Neutral + Location: 189,186 + Actor1267: t15 + Owner: Neutral + Location: 188,190 + Actor1268: tc01 + Owner: Neutral + Location: 191,190 + Actor1269: split2 + Owner: Neutral + Location: 152,152 + Actor1270: split2 + Owner: Neutral + Location: 157,147 + Actor1271: t16 + Owner: Neutral + Location: 148,171 + Actor1272: t11 + Owner: Neutral + Location: 152,168 + Actor1273: t13 + Owner: Neutral + Location: 153,177 + Actor1274: tc01 + Owner: Neutral + Location: 167,177 + Actor1275: t02 + Owner: Neutral + Location: 170,175 + Actor1276: t01 + Owner: Neutral + Location: 165,165 + Actor1277: t01 + Owner: Neutral + Location: 160,189 + Actor1278: t10 + Owner: Neutral + Location: 161,183 + Actor1279: t10 + Owner: Neutral + Location: 165,160 + Actor1280: t13 + Owner: Neutral + Location: 176,174 + Actor1281: t06 + Owner: Neutral + Location: 159,176 + Actor1282: t12 + Owner: Neutral + Location: 164,156 + Actor1283: t05 + Owner: Neutral + Location: 171,146 + Actor1284: t01 + Owner: Neutral + Location: 168,145 + Actor1285: t08 + Owner: Neutral + Location: 174,146 + Actor1287: t02 + Owner: Neutral + Location: 165,150 + Actor1286: t11 + Owner: Neutral + Location: 167,139 + Actor1288: t03 + Owner: Neutral + Location: 170,134 + Actor1289: t10 + Owner: Neutral + Location: 171,140 + Actor1290: t05 + Owner: Neutral + Location: 164,140 + Actor1291: t01 + Owner: Neutral + Location: 160,138 + Actor1292: t16 + Owner: Neutral + Location: 139,150 + Actor1293: t13 + Owner: Neutral + Location: 133,146 + Actor1294: t17 + Owner: Neutral + Location: 141,142 + Actor1295: tc02 + Owner: Neutral + Location: 123,146 + Actor1296: t10 + Owner: Neutral + Location: 111,144 + Actor1297: t11 + Owner: Neutral + Location: 118,144 + Actor1298: t01 + Owner: Neutral + Location: 116,145 + Actor1299: t05 + Owner: Neutral + Location: 119,152 + Actor1300: v01 + Owner: Neutral + Location: 21,125 + Actor1301: v07 + Owner: Neutral + Location: 22,132 + Actor1302: v07 + Owner: Neutral + Location: 13,125 + Actor1303: v06 + Owner: Neutral + Location: 19,137 + Actor1304: v04 + Owner: Neutral + Location: 17,122 + Actor1305: v03 + Owner: Neutral + Location: 13,114 + Actor1306: v17 + Owner: Neutral + Location: 19,135 + Actor1307: v17 + Owner: Neutral + Location: 18,135 + Actor1308: v16 + Owner: Neutral + Location: 17,135 + Actor1309: v18 + Owner: Neutral + Location: 15,136 + Actor1310: v16 + Owner: Neutral + Location: 14,136 + Actor1311: brl3 + Owner: Neutral + Location: 52,160 + Actor1312: brl3 + Owner: Neutral + Location: 52,164 + Actor1313: barl + Owner: Neutral + Location: 52,163 + Actor1314: barl + Owner: Neutral + Location: 47,163 + Actor1315: brl3 + Owner: Neutral + Location: 47,160 + Actor1316: barl + Owner: Neutral + Location: 69,174 + Actor1317: barl + Owner: Neutral + Location: 63,173 + Actor1318: brl3 + Owner: Neutral + Location: 63,174 + Actor1319: v11 + Owner: Neutral + Location: 28,137 + Actor1321: v10 + Owner: Neutral + Location: 18,129 + Actor1320: v09 + Owner: Neutral + Location: 13,128 + Actor1322: v05 + Owner: Neutral + Location: 17,118 + Actor1323: wood + Owner: Neutral + Location: 14,135 + Actor1324: wood + Owner: Neutral + Location: 15,135 + Actor1325: wood + Owner: Neutral + Location: 16,135 + Actor1326: wood + Owner: Neutral + Location: 17,134 + Actor1327: wood + Owner: Neutral + Location: 18,134 + Actor1328: wood + Owner: Neutral + Location: 19,134 + Actor1329: wood + Owner: Neutral + Location: 20,134 + Actor1330: wood + Owner: Neutral + Location: 16,134 + Actor1331: wood + Owner: Neutral + Location: 28,138 + Actor1332: wood + Owner: Neutral + Location: 29,138 + Actor1333: wood + Owner: Neutral + Location: 29,137 + Actor1334: wood + Owner: Neutral + Location: 14,123 + Actor1335: wood + Owner: Neutral + Location: 13,123 + Actor1336: wood + Owner: Neutral + Location: 12,123 + Actor1337: wood + Owner: Neutral + Location: 11,123 + Actor1338: wood + Owner: Neutral + Location: 11,124 + Actor1339: wood + Owner: Neutral + Location: 13,127 + Actor1340: wood + Owner: Neutral + Location: 14,127 + Actor1341: wood + Owner: Neutral + Location: 18,119 + Actor1342: wood + Owner: Neutral + Location: 19,119 + Actor1343: wood + Owner: Neutral + Location: 20,119 + Actor1344: wood + Owner: Neutral + Location: 20,118 + Actor1345: wood + Owner: Neutral + Location: 23,126 + Actor1346: wood + Owner: Neutral + Location: 23,125 + Actor1347: wood + Owner: Neutral + Location: 23,124 + Actor1348: wood + Owner: Neutral + Location: 20,124 + Actor1349: wood + Owner: Neutral + Location: 22,124 + Actor1350: wood + Owner: Neutral + Location: 21,124 + Actor1351: wood + Owner: Neutral + Location: 24,121 + Actor1352: wood + Owner: Neutral + Location: 25,121 + Actor1353: wood + Owner: Neutral + Location: 10,114 + Actor1354: wood + Owner: Neutral + Location: 10,113 + Actor1355: wood + Owner: Neutral + Location: 11,113 + Actor1356: wood + Owner: Neutral + Location: 12,113 + Actor1357: v15 + Owner: Neutral + Location: 12,124 + Actor1358: v16 + Owner: Neutral + Location: 13,124 + Actor1359: v18 + Owner: Neutral + Location: 11,114 + Actor1360: ice01 + Owner: Neutral + Location: 30,128 + Actor1361: t15 + Owner: Neutral + Location: 33,126 + Actor1362: t17 + Owner: Neutral + Location: 27,125 + Actor1363: t03 + Owner: Neutral + Location: 21,141 + Actor1364: ice03 + Owner: Neutral + Location: 45,119 + Actor1365: tc05 + Owner: Neutral + Location: 48,106 + Actor1366: tc01 + Owner: Neutral + Location: 60,108 + Actor1367: t16 + Owner: Neutral + Location: 56,107 + Actor1368: t11 + Owner: Neutral + Location: 65,107 + Actor1369: t13 + Owner: Neutral + Location: 66,105 + Actor1370: t12 + Owner: Neutral + Location: 67,100 + Actor1371: tc03 + Owner: Neutral + Location: 80,107 + Actor1372: tc04 + Owner: Neutral + Location: 78,109 + Actor1373: t15 + Owner: Neutral + Location: 79,113 + Actor1374: t13 + Owner: Neutral + Location: 76,105 + Actor1375: t03 + Owner: Neutral + Location: 77,103 + Actor1376: t07 + Owner: Neutral + Location: 62,113 + Actor1378: t10 + Owner: Neutral + Location: 50,124 + Actor1379: t07 + Owner: Neutral + Location: 48,119 + Actor1380: t07 + Owner: Neutral + Location: 48,112 + Actor1381: t05 + Owner: Neutral + Location: 55,121 + Actor1382: t11 + Owner: Neutral + Location: 55,119 + Actor1383: tc02 + Owner: Neutral + Location: 56,118 + Actor1384: t07 + Owner: Neutral + Location: 55,117 + Actor1377: t02 + Owner: Neutral + Location: 51,92 + Actor1387: nerv + Owner: MaleficScrin + Location: 18,24 + Actor1388: nerv + Owner: MaleficScrin + Location: 5,30 + Actor1389: nerv + Owner: MaleficScrin + Location: 22,5 + Actor1390: nerv + Owner: MaleficScrin + Location: 27,157 + Actor1391: swal + Owner: MaleficScrin + Location: 32,155 + Actor1392: swal + Owner: MaleficScrin + Location: 32,157 + Actor1393: swal + Owner: MaleficScrin + Location: 32,156 + Actor1394: swal + Owner: MaleficScrin + Location: 32,158 + Actor1395: swal + Owner: MaleficScrin + Location: 32,159 + Actor1396: swal + Owner: MaleficScrin + Location: 33,160 + Actor1397: swal + Owner: MaleficScrin + Location: 32,160 + Actor1398: swal + Owner: MaleficScrin + Location: 32,161 + Actor1399: swal + Owner: MaleficScrin + Location: 33,161 + Actor1400: swal + Owner: MaleficScrin + Location: 33,162 + Actor1401: swal + Owner: MaleficScrin + Location: 33,163 + Actor1402: swal + Owner: MaleficScrin + Location: 33,164 + Actor1403: swal + Owner: MaleficScrin + Location: 32,164 + Actor1404: swal + Owner: MaleficScrin + Location: 32,165 + Actor1405: swal + Owner: MaleficScrin + Location: 33,165 + Actor1406: swal + Owner: MaleficScrin + Location: 31,164 + Actor1407: swal + Owner: MaleficScrin + Location: 30,164 + Actor1408: swal + Owner: MaleficScrin + Location: 29,164 + Actor1409: swal + Owner: MaleficScrin + Location: 29,163 + Actor1410: swal + Owner: MaleficScrin + Location: 28,163 + Actor1411: swal + Owner: MaleficScrin + Location: 28,164 + Actor1412: swal + Owner: MaleficScrin + Location: 25,163 + Actor1413: swal + Owner: MaleficScrin + Location: 25,164 + Actor1414: swal + Owner: MaleficScrin + Location: 26,163 + Actor1415: swal + Owner: MaleficScrin + Location: 26,164 + Actor1416: swal + Owner: MaleficScrin + Location: 27,164 + Actor1417: swal + Owner: MaleficScrin + Location: 20,163 + Actor1418: swal + Owner: MaleficScrin + Location: 20,164 + Actor1419: swal + Owner: MaleficScrin + Location: 19,164 + Actor1420: swal + Owner: MaleficScrin + Location: 19,163 + Actor1421: swal + Owner: MaleficScrin + Location: 18,164 + Actor1422: swal + Owner: MaleficScrin + Location: 17,164 + Actor1423: swal + Owner: MaleficScrin + Location: 16,164 + Actor1424: swal + Owner: MaleficScrin + Location: 15,164 + Actor1425: swal + Owner: MaleficScrin + Location: 15,163 + Actor1426: swal + Owner: MaleficScrin + Location: 16,163 + Actor1427: swal + Owner: MaleficScrin + Location: 14,162 + Actor1428: swal + Owner: MaleficScrin + Location: 15,162 + Actor1429: swal + Owner: MaleficScrin + Location: 14,161 + Actor1430: swal + Owner: MaleficScrin + Location: 14,160 + Actor1431: swal + Owner: MaleficScrin + Location: 15,160 + Actor1432: swal + Owner: MaleficScrin + Location: 15,161 + Actor1433: swal + Owner: MaleficScrin + Location: 32,154 + Actor1434: swal + Owner: MaleficScrin + Location: 33,154 + Actor1435: swal + Owner: MaleficScrin + Location: 34,154 + Actor1436: swal + Owner: MaleficScrin + Location: 34,153 + Actor1437: swal + Owner: MaleficScrin + Location: 32,153 + Actor1438: swal + Owner: MaleficScrin + Location: 33,153 + Actor1439: swal + Owner: MaleficScrin + Location: 32,148 + Actor1440: swal + Owner: MaleficScrin + Location: 33,148 + Actor1441: swal + Owner: MaleficScrin + Location: 32,149 + Actor1442: swal + Owner: MaleficScrin + Location: 33,149 + Actor1443: swal + Owner: MaleficScrin + Location: 34,149 + Actor1444: swal + Owner: MaleficScrin + Location: 34,150 + Actor1445: swal + Owner: MaleficScrin + Location: 33,150 + Actor1446: swal + Owner: MaleficScrin + Location: 34,151 + Actor1447: swal + Owner: MaleficScrin + Location: 35,150 + Actor1448: swal + Owner: MaleficScrin + Location: 35,151 + Actor1449: swal + Owner: MaleficScrin + Location: 36,150 + Actor1450: swal + Owner: MaleficScrin + Location: 36,151 + Actor1451: swal + Owner: MaleficScrin + Location: 34,152 + Actor1452: scol + Owner: MaleficScrin + Location: 27,163 + Actor1453: scol + Owner: MaleficScrin + Location: 18,163 + Actor1454: rea2 + Owner: MaleficScrin + Location: 17,158 + Actor1455: rea2 + Owner: MaleficScrin + Location: 17,155 + Actor1456: rea2 + Owner: MaleficScrin + Location: 17,152 + Actor1457: reac + Owner: MaleficScrin + Location: 14,156 + Actor1458: reac + Owner: MaleficScrin + Location: 14,152 + Actor1459: port + Owner: MaleficScrin + Location: 28,152 + Actor1460: ptur + Owner: MaleficScrin + Location: 34,165 + TurretFacing: 606 + Actor1461: ptur + Owner: MaleficScrin + Location: 27,147 + TurretFacing: 825 + Actor1462: scol + Owner: MaleficScrin + Location: 32,150 + Actor1463: shar + Owner: MaleficScrin + Location: 33,152 + Actor1464: shar + Owner: MaleficScrin + Location: 32,163 + Actor1465: shar + Owner: MaleficScrin + Location: 16,162 + Actor1466: srep + Owner: MaleficScrin + Location: 20,149 + Actor1467: nerv + Owner: MaleficScrin + Location: 186,150 + Actor1468: tc05 + Owner: Neutral + Location: 9,161 + Actor1469: tc02 + Owner: Neutral + Location: 3,159 + Actor1470: tc04 + Owner: Neutral + Location: 7,175 + Actor1471: t16 + Owner: Neutral + Location: 4,176 + Actor1472: t15 + Owner: Neutral + Location: 5,176 + Actor1473: tc04 + Owner: Neutral + Location: 7,163 + Actor1474: tc02 + Owner: Neutral + Location: 15,176 + Actor1475: tc03 + Owner: Neutral + Location: 16,174 + Actor1476: t17 + Owner: Neutral + Location: 12,175 + Actor1477: t11 + Owner: Neutral + Location: 14,172 + Actor1478: tc01 + Owner: Neutral + Location: 10,172 + Actor1479: t16 + Owner: Neutral + Location: 12,171 + Actor1480: t11 + Owner: Neutral + Location: 5,170 + Actor1481: t13 + Owner: Neutral + Location: 17,171 + Actor1482: t12 + Owner: Neutral + Location: 15,168 + Actor1483: t17 + Owner: Neutral + Location: 10,168 + Actor1484: t13 + Owner: Neutral + Location: 10,165 + Actor1485: t14 + Owner: Neutral + Location: 2,170 + Actor1486: tc05 + Owner: Neutral + Location: 2,167 + Actor1487: t16 + Owner: Neutral + Location: 3,166 + Actor1488: t14 + Owner: Neutral + Location: 3,164 + Actor1489: t14 + Owner: Neutral + Location: 1,163 + Actor1490: t12 + Owner: Neutral + Location: 3,162 + Actor1491: t03 + Owner: Neutral + Location: 1,160 + Actor1492: t14 + Owner: Neutral + Location: 0,172 + Actor1493: t15 + Owner: Neutral + Location: 7,167 + Actor1494: t16 + Owner: Neutral + Location: 5,166 + Actor1495: t13 + Owner: Neutral + Location: 6,160 + Actor1496: t14 + Owner: Neutral + Location: 4,162 + Actor1497: t06 + Owner: Neutral + Location: 5,164 + Actor1498: t02 + Owner: Neutral + Location: 4,161 + Actor1499: t06 + Owner: Neutral + Location: 8,159 + Actor1500: t05 + Owner: Neutral + Location: 7,170 + Actor1501: t06 + Owner: Neutral + Location: 3,172 + Actor1502: t02 + Owner: Neutral + Location: 1,170 + Actor1503: t14 + Owner: Neutral + Location: 0,166 + Actor1504: t12 + Owner: Neutral + Location: 7,166 + Actor1505: t02 + Owner: Neutral + Location: 5,168 + Actor1506: t03 + Owner: Neutral + Location: 6,168 + Actor1507: t08 + Owner: Neutral + Location: 8,166 + Actor1508: t12 + Owner: Neutral + Location: 12,164 + Actor1509: t02 + Owner: Neutral + Location: 11,167 + Actor1510: nerv + Owner: MaleficScrin + Location: 105,3 + Actor1511: swal + Owner: MaleficScrin + Location: 104,5 + Actor1512: swal + Owner: MaleficScrin + Location: 104,3 + Actor1513: swal + Owner: MaleficScrin + Location: 104,2 + Actor1514: swal + Owner: MaleficScrin + Location: 104,4 + Actor1515: swal + Owner: MaleficScrin + Location: 104,6 + Actor1516: swal + Owner: MaleficScrin + Location: 106,6 + Actor1517: swal + Owner: MaleficScrin + Location: 105,6 + Actor1518: swal + Owner: MaleficScrin + Location: 107,6 + Actor1519: swal + Owner: MaleficScrin + Location: 107,5 + Actor1520: swal + Owner: MaleficScrin + Location: 107,4 + Actor1521: swal + Owner: MaleficScrin + Location: 107,3 + Actor1522: swal + Owner: MaleficScrin + Location: 107,2 + Actor1523: swal + Owner: MaleficScrin + Location: 106,2 + Actor1524: swal + Owner: MaleficScrin + Location: 105,2 + Actor1525: swal + Owner: MaleficScrin + Location: 104,1 + Actor1526: swal + Owner: MaleficScrin + Location: 105,1 + Actor1527: swal + Owner: MaleficScrin + Location: 103,6 + Actor1528: swal + Owner: MaleficScrin + Location: 104,7 + Actor1529: swal + Owner: MaleficScrin + Location: 103,7 + Actor1530: swal + Owner: MaleficScrin + Location: 107,7 + Actor1531: swal + Owner: MaleficScrin + Location: 108,6 + Actor1532: swal + Owner: MaleficScrin + Location: 108,7 + Actor1533: swal + Owner: MaleficScrin + Location: 106,1 + Actor1534: swal + Owner: MaleficScrin + Location: 107,1 + Actor1535: scol + Owner: MaleficScrin + Location: 102,11 + Actor1536: scol + Owner: MaleficScrin + Location: 105,11 + Actor1537: shar + Owner: MaleficScrin + Location: 105,8 + Actor1538: ptur + Owner: MaleficScrin + Location: 111,5 + TurretFacing: 675 + Actor1539: split2 + Owner: Neutral + Location: 32,118 + Actor1540: split2 + Owner: Neutral + Location: 34,111 + Actor1541: split2 + Owner: Neutral + Location: 104,50 + Actor1542: split2 + Owner: Neutral + Location: 112,45 + Actor1543: tc04 + Owner: Neutral + Location: 182,46 + Actor1544: tc02 + Owner: Neutral + Location: 189,40 + Actor1545: t16 + Owner: Neutral + Location: 186,38 + Actor1546: t13 + Owner: Neutral + Location: 187,48 + Actor1547: t12 + Owner: Neutral + Location: 175,50 + Actor1548: t16 + Owner: Neutral + Location: 169,46 + Actor1549: t16 + Owner: Neutral + Location: 156,49 + Actor1550: tc05 + Owner: Neutral + Location: 152,47 + Actor1551: t15 + Owner: Neutral + Location: 153,45 + Actor1552: t12 + Owner: Neutral + Location: 156,47 + Actor1553: t07 + Owner: Neutral + Location: 148,48 + Actor1554: t05 + Owner: Neutral + Location: 135,40 + Actor1555: t03 + Owner: Neutral + Location: 119,42 + Actor1556: t01 + Owner: Neutral + Location: 129,50 + Actor1557: tc01 + Owner: Neutral + Location: 110,58 + Actor1558: t15 + Owner: Neutral + Location: 116,52 + Actor1559: tc02 + Owner: Neutral + Location: 117,54 + Actor1560: t16 + Owner: Neutral + Location: 114,54 + Actor1561: t14 + Owner: Neutral + Location: 121,50 + Actor1562: t11 + Owner: Neutral + Location: 116,69 + Actor1563: t14 + Owner: Neutral + Location: 117,61 + Actor1564: t10 + Owner: Neutral + Location: 104,71 + Actor1565: tc05 + Owner: Neutral + Location: 105,74 + Actor1566: tc01 + Owner: Neutral + Location: 106,72 + Actor1567: t17 + Owner: Neutral + Location: 103,66 + Actor1568: t11 + Owner: Neutral + Location: 105,65 + Actor1569: t11 + Owner: Neutral + Location: 128,55 + Actor1570: t02 + Owner: Neutral + Location: 127,54 + Actor1571: t05 + Owner: Neutral + Location: 125,56 + Actor1572: t01 + Owner: Neutral + Location: 135,52 + Actor1573: t03 + Owner: Neutral + Location: 160,71 + Actor1574: t10 + Owner: Neutral + Location: 169,68 + Actor1575: tc04 + Owner: Neutral + Location: 170,73 + Actor1576: t15 + Owner: Neutral + Location: 164,74 + Actor1577: t17 + Owner: Neutral + Location: 167,77 + Actor1578: t10 + Owner: Neutral + Location: 168,73 + Actor1579: t11 + Owner: Neutral + Location: 171,71 + Actor1580: t16 + Owner: Neutral + Location: 158,81 + Actor1581: t13 + Owner: Neutral + Location: 177,88 + Actor1582: t15 + Owner: Neutral + Location: 177,77 + Actor1583: t06 + Owner: Neutral + Location: 179,74 + Actor1584: t02 + Owner: Neutral + Location: 187,83 + Actor1585: t05 + Owner: Neutral + Location: 191,80 + Actor1586: t03 + Owner: Neutral + Location: 188,86 + Actor1587: t02 + Owner: Neutral + Location: 184,104 + Actor1588: tc04 + Owner: Neutral + Location: 189,96 + Actor1589: tc02 + Owner: Neutral + Location: 170,100 + Actor1590: t14 + Owner: Neutral + Location: 164,98 + Actor1591: t11 + Owner: Neutral + Location: 170,108 + Actor1592: t16 + Owner: Neutral + Location: 173,100 + Actor1593: t06 + Owner: Neutral + Location: 172,98 + Actor1594: t03 + Owner: Neutral + Location: 171,98 + Actor1595: t10 + Owner: Neutral + Location: 177,102 + Actor1596: t11 + Owner: Neutral + Location: 144,107 + Actor1597: t01 + Owner: Neutral + Location: 160,101 + Actor1598: t05 + Owner: Neutral + Location: 150,138 + Actor1599: t03 + Owner: Neutral + Location: 158,131 + Actor1600: t02 + Owner: Neutral + Location: 159,129 + Actor1601: t10 + Owner: Neutral + Location: 154,133 + Actor1602: t13 + Owner: Neutral + Location: 164,130 + Actor1603: t10 + Owner: Neutral + Location: 163,123 + Actor1604: t14 + Owner: Neutral + Location: 177,131 + Actor1605: t11 + Owner: Neutral + Location: 189,134 + Actor1606: t06 + Owner: Neutral + Location: 175,128 + Actor1607: t02 + Owner: Neutral + Location: 165,122 + Actor1608: t05 + Owner: Neutral + Location: 171,123 + Actor1609: t02 + Owner: Neutral + Location: 170,119 + Actor1610: t14 + Owner: Neutral + Location: 156,126 + Actor1611: t01 + Owner: Neutral + Location: 161,113 + Actor1612: t03 + Owner: Neutral + Location: 160,111 + Actor1613: t01 + Owner: Neutral + Location: 152,105 + Actor1614: t02 + Owner: Neutral + Location: 151,104 + Actor1615: t10 + Owner: Neutral + Location: 183,129 + Actor1616: t07 + Owner: Neutral + Location: 181,128 + Actor1617: t16 + Owner: Neutral + Location: 107,116 + Actor1618: t10 + Owner: Neutral + Location: 107,113 + Actor1619: tc04 + Owner: Neutral + Location: 115,125 + Actor1620: t13 + Owner: Neutral + Location: 112,130 + Actor1621: t14 + Owner: Neutral + Location: 113,121 + Actor1622: t06 + Owner: Neutral + Location: 115,123 + Actor1623: t03 + Owner: Neutral + Location: 117,116 + Actor1624: t01 + Owner: Neutral + Location: 116,109 + Actor1625: t13 + Owner: Neutral + Location: 103,110 + Actor1626: t14 + Owner: Neutral + Location: 125,102 + Actor1627: t02 + Owner: Neutral + Location: 132,99 + Actor1628: t03 + Owner: Neutral + Location: 116,99 + Actor1629: t05 + Owner: Neutral + Location: 118,105 + Actor1630: t11 + Owner: Neutral + Location: 101,100 + Actor1631: t03 + Owner: Neutral + Location: 103,104 + Actor1632: t14 + Owner: Neutral + Location: 112,138 + Actor1633: tc01 + Owner: Neutral + Location: 122,140 + Actor1634: tc04 + Owner: Neutral + Location: 114,137 + Actor1635: t13 + Owner: Neutral + Location: 115,135 + Actor1636: t10 + Owner: Neutral + Location: 121,136 + Actor1637: t02 + Owner: Neutral + Location: 119,135 + Actor1638: t02 + Owner: Neutral + Location: 127,139 + Actor1639: t03 + Owner: Neutral + Location: 121,132 + Actor1641: t11 + Owner: Neutral + Location: 106,127 + Actor1642: t13 + Owner: Neutral + Location: 143,132 + Actor1643: t11 + Owner: Neutral + Location: 143,137 + Actor1644: t12 + Owner: Neutral + Location: 145,136 + Actor1645: t13 + Owner: Neutral + Location: 139,136 + Actor1646: t06 + Owner: Neutral + Location: 140,137 + Actor1647: t06 + Owner: Neutral + Location: 146,141 + Actor1648: t07 + Owner: Neutral + Location: 146,138 + Actor1649: t08 + Owner: Neutral + Location: 145,138 + Actor1650: t15 + Owner: Neutral + Location: 122,109 + Actor1652: t12 + Owner: Neutral + Location: 125,109 + Actor1651: t16 + Owner: Neutral + Location: 124,108 + Actor1653: tc03 + Owner: Neutral + Location: 122,84 + Actor1654: tc04 + Owner: Neutral + Location: 120,86 + Actor1655: t17 + Owner: Neutral + Location: 122,87 + Actor1656: t13 + Owner: Neutral + Location: 122,85 + Actor1657: t12 + Owner: Neutral + Location: 121,85 + Actor1658: t01 + Owner: Neutral + Location: 121,83 + Actor1659: t08 + Owner: Neutral + Location: 121,89 + Actor1660: t14 + Owner: Neutral + Location: 119,82 + Actor1661: tc01 + Owner: Neutral + Location: 143,85 + Actor1662: t11 + Owner: Neutral + Location: 139,84 + Actor1663: t12 + Owner: Neutral + Location: 152,81 + Actor1664: tc01 + Owner: Neutral + Location: 145,94 + Actor1665: tc02 + Owner: Neutral + Location: 135,94 + Actor1666: t13 + Owner: Neutral + Location: 79,91 + Actor1667: t16 + Owner: Neutral + Location: 79,88 + Actor1668: tc02 + Owner: Neutral + Location: 80,86 + Actor1669: tc03 + Owner: Neutral + Location: 80,88 + Actor1670: t15 + Owner: Neutral + Location: 76,82 + Actor1671: t13 + Owner: Neutral + Location: 66,82 + Actor1672: t06 + Owner: Neutral + Location: 70,89 + Actor1673: t16 + Owner: Neutral + Location: 65,86 + Actor1674: tc02 + Owner: Neutral + Location: 63,87 + Actor1675: tc03 + Owner: Neutral + Location: 61,88 + Actor1676: t14 + Owner: Neutral + Location: 61,86 + Actor1677: t11 + Owner: Neutral + Location: 63,85 + Actor1678: t16 + Owner: Neutral + Location: 43,83 + Actor1679: t06 + Owner: Neutral + Location: 42,77 + Actor1680: t13 + Owner: Neutral + Location: 46,72 + Actor1681: t10 + Owner: Neutral + Location: 51,79 + Actor1682: t14 + Owner: Neutral + Location: 49,73 + Actor1683: tc04 + Owner: Neutral + Location: 51,71 + Actor1684: t16 + Owner: Neutral + Location: 53,69 + Actor1685: tc02 + Owner: Neutral + Location: 48,66 + Actor1686: tc01 + Owner: Neutral + Location: 47,64 + Actor1687: t14 + Owner: Neutral + Location: 49,64 + Actor1688: t11 + Owner: Neutral + Location: 47,67 + Actor1689: t16 + Owner: Neutral + Location: 48,60 + Actor1690: t08 + Owner: Neutral + Location: 49,62 + Actor1691: t14 + Owner: Neutral + Location: 42,56 + Actor1692: t13 + Owner: Neutral + Location: 54,55 + Actor1693: t16 + Owner: Neutral + Location: 51,46 + Actor1694: t05 + Owner: Neutral + Location: 60,44 + Actor1695: t02 + Owner: Neutral + Location: 55,40 + Actor1696: t02 + Owner: Neutral + Location: 56,42 + Actor1697: t03 + Owner: Neutral + Location: 52,47 + Actor1698: tc03 + Owner: Neutral + Location: 64,34 + Actor1699: t11 + Owner: Neutral + Location: 63,32 + Actor1700: t12 + Owner: Neutral + Location: 71,40 + Actor1701: t16 + Owner: Neutral + Location: 76,45 + Actor1702: tc01 + Owner: Neutral + Location: 79,40 + Actor1703: tc04 + Owner: Neutral + Location: 77,33 + Actor1704: t15 + Owner: Neutral + Location: 75,28 + Actor1705: t15 + Owner: Neutral + Location: 74,31 + Actor1707: t13 + Owner: Neutral + Location: 59,25 + Actor1708: t14 + Owner: Neutral + Location: 49,27 + Actor1710: t01 + Owner: Neutral + Location: 107,91 + Actor1711: t11 + Owner: Neutral + Location: 105,95 + Actor1712: t01 + Owner: Neutral + Location: 102,90 + Actor1713: t12 + Owner: Neutral + Location: 104,97 + Actor1714: t16 + Owner: Neutral + Location: 107,96 + Actor1715: tc05 + Owner: Neutral + Location: 111,56 + Actor1716: t03 + Owner: Neutral + Location: 138,43 + Actor1717: t14 + Owner: Neutral + Location: 179,56 + Actor1718: t16 + Owner: Neutral + Location: 168,66 + Actor1719: tc01 + Owner: Neutral + Location: 172,58 + Actor1720: tc04 + Owner: Neutral + Location: 173,60 + Actor1721: t16 + Owner: Neutral + Location: 175,62 + Actor1722: t10 + Owner: Neutral + Location: 175,63 + Actor1723: t12 + Owner: Neutral + Location: 172,62 + Actor1724: t13 + Owner: Neutral + Location: 171,56 + Actor1725: t03 + Owner: Neutral + Location: 179,69 + Actor1726: t01 + Owner: Neutral + Location: 181,96 + Actor1727: t15 + Owner: Neutral + Location: 158,93 + Actor1728: t17 + Owner: Neutral + Location: 153,104 + Actor1729: t17 + Owner: Neutral + Location: 180,112 + Actor1730: tc04 + Owner: Neutral + Location: 78,95 + Actor1731: t06 + Owner: Neutral + Location: 58,96 + Actor1732: t02 + Owner: Neutral + Location: 60,92 + Actor1733: t03 + Owner: Neutral + Location: 58,94 + Actor1734: tc01 + Owner: Neutral + Location: 59,94 + Actor1735: tc05 + Owner: Neutral + Location: 60,96 + Actor1736: t06 + Owner: Neutral + Location: 61,100 + Actor1737: t11 + Owner: Neutral + Location: 58,99 + Actor1738: t07 + Owner: Neutral + Location: 55,103 + Actor1739: t14 + Owner: Neutral + Location: 41,110 + Actor1740: tc01 + Owner: Neutral + Location: 39,128 + Actor1742: t13 + Owner: Neutral + Location: 40,127 + Actor1741: t15 + Owner: Neutral + Location: 35,135 + Actor1743: t11 + Owner: Neutral + Location: 51,142 + Actor1744: t02 + Owner: Neutral + Location: 50,139 + Actor1745: t01 + Owner: Neutral + Location: 41,144 + Actor1746: t02 + Owner: Neutral + Location: 44,155 + Actor1747: t06 + Owner: Neutral + Location: 40,151 + Actor1748: t13 + Owner: Neutral + Location: 41,148 + Actor1749: t13 + Owner: Neutral + Location: 58,164 + Actor1750: t17 + Owner: Neutral + Location: 62,154 + Actor1751: tc02 + Owner: Neutral + Location: 58,154 + Actor1752: t12 + Owner: Neutral + Location: 60,153 + Actor1753: t13 + Owner: Neutral + Location: 56,152 + Actor1754: t02 + Owner: Neutral + Location: 55,148 + Actor1755: t03 + Owner: Neutral + Location: 78,157 + Actor1756: t01 + Owner: Neutral + Location: 77,159 + Actor1757: t07 + Owner: Neutral + Location: 70,160 + Actor1758: tc04 + Owner: Neutral + Location: 75,169 + Actor1759: tc01 + Owner: Neutral + Location: 77,167 + Actor1760: t13 + Owner: Neutral + Location: 79,169 + Actor1761: t11 + Owner: Neutral + Location: 81,167 + Actor1762: t06 + Owner: Neutral + Location: 81,173 + Actor1763: t03 + Owner: Neutral + Location: 58,178 + Actor1764: tc01 + Owner: Neutral + Location: 61,179 + Actor1765: tc02 + Owner: Neutral + Location: 72,179 + Actor1766: tc04 + Owner: Neutral + Location: 40,161 + Actor1768: t03 + Owner: Neutral + Location: 43,163 + Actor1769: t12 + Owner: Neutral + Location: 41,165 + Actor1767: t15 + Owner: Neutral + Location: 37,163 + Actor1770: t13 + Owner: Neutral + Location: 53,167 + Actor1771: t15 + Owner: Neutral + Location: 52,169 + Actor1772: tc01 + Owner: Neutral + Location: 46,169 + Actor1773: tc03 + Owner: Neutral + Location: 44,168 + Actor1774: t13 + Owner: Neutral + Location: 38,174 + Actor1775: t15 + Owner: Neutral + Location: 26,174 + Actor1776: t15 + Owner: Neutral + Location: 39,186 + Actor1777: t11 + Owner: Neutral + Location: 50,179 + Actor1778: tc02 + Owner: Neutral + Location: 51,181 + Actor1779: t13 + Owner: Neutral + Location: 47,190 + Actor1780: tc01 + Owner: Neutral + Location: 53,190 + Actor1781: tc04 + Owner: Neutral + Location: 50,189 + Actor1782: t17 + Owner: Neutral + Location: 52,191 + Actor1783: t13 + Owner: Neutral + Location: 41,191 + Actor1784: t15 + Owner: Neutral + Location: 26,190 + Actor1785: t11 + Owner: Neutral + Location: 39,181 + Actor1786: t12 + Owner: Neutral + Location: 39,188 + Actor1787: t12 + Owner: Neutral + Location: 20,191 + Actor1788: t13 + Owner: Neutral + Location: 20,181 + Actor1789: t14 + Owner: Neutral + Location: 2,181 + Actor1790: tc01 + Owner: Neutral + Location: 2,190 + Actor1791: t15 + Owner: Neutral + Location: 3,188 + Actor1792: t10 + Owner: Neutral + Location: 27,188 + Actor1793: t10 + Owner: Neutral + Location: 66,183 + Actor1794: t15 + Owner: Neutral + Location: 71,191 + Actor1795: t11 + Owner: Neutral + Location: 80,186 + Actor1796: t03 + Owner: Neutral + Location: 79,185 + Actor1797: t02 + Owner: Neutral + Location: 82,181 + Actor1798: t06 + Owner: Neutral + Location: 85,177 + Actor1799: t03 + Owner: Neutral + Location: 86,174 + Actor1800: t16 + Owner: Neutral + Location: 82,170 + Actor1801: t16 + Owner: Neutral + Location: 62,166 + Actor1802: t16 + Owner: Neutral + Location: 33,92 + Actor1803: t03 + Owner: Neutral + Location: 36,86 + Actor1804: tc04 + Owner: Neutral + Location: 27,61 + Actor1805: t02 + Owner: Neutral + Location: 29,65 + Actor1806: t07 + Owner: Neutral + Location: 37,65 + Actor1807: t01 + Owner: Neutral + Location: 25,56 + Actor1812: tc01 + Owner: Neutral + Location: 37,41 + Actor1813: t07 + Owner: Neutral + Location: 39,39 + Actor1814: t10 + Owner: Neutral + Location: 35,44 + Actor1815: t13 + Owner: Neutral + Location: 42,53 + Actor1816: t12 + Owner: Neutral + Location: 24,46 + Actor1817: tc01 + Owner: Neutral + Location: 26,45 + Actor1818: t14 + Owner: Neutral + Location: 32,38 + Actor1819: t11 + Owner: Neutral + Location: 42,29 + Actor1820: tc02 + Owner: Neutral + Location: 44,30 + Actor1821: t10 + Owner: Neutral + Location: 56,32 + Actor1822: t08 + Owner: Neutral + Location: 55,33 + Actor1823: t06 + Owner: Neutral + Location: 55,31 + Actor1824: t02 + Owner: Neutral + Location: 54,32 + Actor1825: t01 + Owner: Neutral + Location: 55,22 + Actor1826: t05 + Owner: Neutral + Location: 56,21 + Actor1827: t07 + Owner: Neutral + Location: 69,21 + Actor1828: t03 + Owner: Neutral + Location: 62,15 + Actor1829: t05 + Owner: Neutral + Location: 70,15 + Actor1830: tc04 + Owner: Neutral + Location: 69,9 + Actor1831: tc04 + Owner: Neutral + Location: 77,7 + Actor1832: t15 + Owner: Neutral + Location: 75,8 + Actor1834: t11 + Owner: Neutral + Location: 72,9 + Actor1835: t10 + Owner: Neutral + Location: 79,12 + Actor1838: t10 + Owner: Neutral + Location: 80,1 + Actor1839: tc01 + Owner: Neutral + Location: 79,3 + Actor1841: t17 + Owner: Neutral + Location: 63,4 + Actor1842: t01 + Owner: Neutral + Location: 64,1 + Actor1843: t14 + Owner: Neutral + Location: 61,9 + Actor1844: t15 + Owner: Neutral + Location: 75,13 + Actor1845: t15 + Owner: Neutral + Location: 76,22 + Actor1846: tc02 + Owner: Neutral + Location: 75,23 + Actor1847: t14 + Owner: Neutral + Location: 105,26 + Actor1848: nerv + Owner: MaleficScrin + Location: 33,49 + Actor1808: swal + Owner: MaleficScrin + Location: 33,48 + Actor1809: swal + Owner: MaleficScrin + Location: 32,48 + Actor1810: swal + Owner: MaleficScrin + Location: 32,49 + Actor1811: swal + Owner: MaleficScrin + Location: 32,50 + Actor1849: swal + Owner: MaleficScrin + Location: 32,51 + Actor1850: swal + Owner: MaleficScrin + Location: 32,52 + Actor1851: swal + Owner: MaleficScrin + Location: 33,52 + Actor1852: swal + Owner: MaleficScrin + Location: 34,52 + Actor1853: swal + Owner: MaleficScrin + Location: 35,52 + Actor1854: swal + Owner: MaleficScrin + Location: 35,51 + Actor1855: swal + Owner: MaleficScrin + Location: 35,50 + Actor1856: swal + Owner: MaleficScrin + Location: 35,49 + Actor1857: swal + Owner: MaleficScrin + Location: 35,48 + Actor1858: swal + Owner: MaleficScrin + Location: 34,48 + Actor1859: swal + Owner: MaleficScrin + Location: 31,48 + Actor1860: swal + Owner: MaleficScrin + Location: 30,48 + Actor1861: swal + Owner: MaleficScrin + Location: 30,47 + Actor1862: swal + Owner: MaleficScrin + Location: 30,46 + Actor1863: swal + Owner: MaleficScrin + Location: 31,46 + Actor1864: swal + Owner: MaleficScrin + Location: 32,47 + Actor1865: swal + Owner: MaleficScrin + Location: 32,46 + Actor1866: swal + Owner: MaleficScrin + Location: 35,47 + Actor1867: swal + Owner: MaleficScrin + Location: 35,46 + Actor1868: swal + Owner: MaleficScrin + Location: 36,46 + Actor1869: swal + Owner: MaleficScrin + Location: 37,46 + Actor1870: swal + Owner: MaleficScrin + Location: 37,47 + Actor1871: swal + Owner: MaleficScrin + Location: 36,48 + Actor1872: swal + Owner: MaleficScrin + Location: 37,48 + Actor1873: swal + Owner: MaleficScrin + Location: 36,52 + Actor1874: swal + Owner: MaleficScrin + Location: 35,53 + Actor1875: swal + Owner: MaleficScrin + Location: 35,54 + Actor1876: swal + Owner: MaleficScrin + Location: 37,54 + Actor1877: swal + Owner: MaleficScrin + Location: 36,54 + Actor1878: swal + Owner: MaleficScrin + Location: 37,52 + Actor1879: swal + Owner: MaleficScrin + Location: 37,53 + Actor1880: swal + Owner: MaleficScrin + Location: 31,52 + Actor1881: swal + Owner: MaleficScrin + Location: 30,52 + Actor1882: swal + Owner: MaleficScrin + Location: 30,53 + Actor1883: swal + Owner: MaleficScrin + Location: 30,54 + Actor1884: swal + Owner: MaleficScrin + Location: 31,54 + Actor1885: swal + Owner: MaleficScrin + Location: 32,54 + Actor1886: swal + Owner: MaleficScrin + Location: 32,53 + Actor1887: scol + Owner: MaleficScrin + Location: 31,53 + Actor1888: scol + Owner: MaleficScrin + Location: 31,47 + Actor1889: scol + Owner: MaleficScrin + Location: 36,47 + Actor1890: scol + Owner: MaleficScrin + Location: 36,53 + Actor1891: shar + Owner: MaleficScrin + Location: 31,50 + Actor1892: shar + Owner: MaleficScrin + Location: 36,50 + Actor1893: swal + Owner: MaleficScrin + Location: 31,49 + Actor1894: swal + Owner: MaleficScrin + Location: 31,51 + Actor1895: swal + Owner: MaleficScrin + Location: 36,51 + Actor1896: swal + Owner: MaleficScrin + Location: 36,49 + Actor1897: swal + Owner: MaleficScrin + Location: 34,47 + Actor1898: swal + Owner: MaleficScrin + Location: 33,47 + Actor1899: swal + Owner: MaleficScrin + Location: 33,53 + Actor1900: swal + Owner: MaleficScrin + Location: 34,53 + Actor1901: t02 + Owner: Neutral + Faction: scrin + Location: 8,106 + Actor1902: t12 + Owner: Neutral + Faction: scrin + Location: 11,103 + Actor1903: t12 + Owner: Neutral + Faction: scrin + Location: 31,102 + Actor1904: t13 + Owner: Neutral + Faction: scrin + Location: 33,100 + Actor1905: t15 + Owner: Neutral + Faction: scrin + Location: 2,100 + Actor1906: t05 + Owner: Neutral + Faction: scrin + Location: 34,78 + Actor1907: t13 + Owner: Neutral + Faction: scrin + Location: 19,51 + Actor1908: t15 + Owner: Neutral + Faction: scrin + Location: 19,63 + Actor1909: t02 + Owner: Neutral + Faction: scrin + Location: 23,63 + Actor1910: t11 + Owner: Neutral + Faction: scrin + Location: 9,53 + Actor1911: t14 + Owner: Neutral + Faction: scrin + Location: 10,56 + Actor1912: t03 + Owner: Neutral + Faction: scrin + Location: 8,45 + Actor1913: t06 + Owner: Neutral + Faction: scrin + Location: 20,39 + Actor1914: t15 + Owner: Neutral + Faction: scrin + Location: 15,44 + Actor1915: tc02 + Owner: Neutral + Faction: scrin + Location: 10,38 + Actor1916: t06 + Owner: Neutral + Faction: scrin + Location: 11,36 + Actor1917: t10 + Owner: Neutral + Faction: scrin + Location: 3,39 + Actor1918: t13 + Owner: Neutral + Faction: scrin + Location: 17,31 + Actor1919: t06 + Owner: Neutral + Faction: scrin + Location: 26,26 + Actor1920: t03 + Owner: Neutral + Faction: scrin + Location: 35,33 + Actor1921: t02 + Owner: Neutral + Faction: scrin + Location: 33,26 + Actor1922: tc02 + Owner: Neutral + Faction: scrin + Location: 37,26 + Actor1923: tc01 + Owner: Neutral + Faction: scrin + Location: 27,40 + Actor1924: t11 + Owner: Neutral + Faction: scrin + Location: 28,35 + Actor1925: t13 + Owner: Neutral + Faction: scrin + Location: 31,28 + Actor1926: t02 + Owner: Neutral + Faction: scrin + Location: 21,38 + Actor1927: t01 + Owner: Neutral + Faction: scrin + Location: 20,30 + Actor1928: t03 + Owner: Neutral + Faction: scrin + Location: 30,17 + Actor1929: t02 + Owner: Neutral + Faction: scrin + Location: 37,16 + Actor1930: tc01 + Owner: Neutral + Faction: scrin + Location: 19,11 + Actor1931: tc05.husk + Owner: Neutral + Faction: scrin + Location: 14,14 + Actor1932: tc04.husk + Owner: Neutral + Faction: scrin + Location: 2,18 + Actor1933: t17.husk + Owner: Neutral + Faction: scrin + Location: 13,10 + Actor1935: tc02.husk + Owner: Neutral + Faction: scrin + Location: 16,4 + Actor1936: t17.husk + Owner: Neutral + Faction: scrin + Location: 14,3 + Actor1939: t14.husk + Owner: Neutral + Faction: scrin + Location: 0,14 + Actor1940: t13.husk + Owner: Neutral + Faction: scrin + Location: 6,23 + Actor1941: t01.husk + Owner: Neutral + Faction: scrin + Location: 15,23 + Actor1942: t17.husk + Owner: Neutral + Faction: scrin + Location: 17,18 + Actor1943: tc04 + Owner: Neutral + Faction: scrin + Location: 31,0 + Actor1944: tc01 + Owner: Neutral + Faction: scrin + Location: 28,0 + Actor1945: tc02 + Owner: Neutral + Faction: scrin + Location: 31,3 + Actor1946: t15 + Owner: Neutral + Faction: scrin + Location: 28,6 + Actor1947: t11 + Owner: Neutral + Faction: scrin + Location: 35,5 + Actor1948: t13 + Owner: Neutral + Faction: scrin + Location: 31,10 + Actor1949: swal + Owner: MaleficScrin + Location: 17,23 + Actor1950: swal + Owner: MaleficScrin + Location: 17,24 + Actor1951: swal + Owner: MaleficScrin + Location: 17,25 + Actor1952: swal + Owner: MaleficScrin + Location: 17,26 + Actor1953: swal + Owner: MaleficScrin + Location: 17,27 + Actor1954: swal + Owner: MaleficScrin + Location: 19,27 + Actor1955: swal + Owner: MaleficScrin + Location: 18,27 + Actor1956: swal + Owner: MaleficScrin + Location: 20,27 + Actor1957: swal + Owner: MaleficScrin + Location: 20,26 + Actor1958: swal + Owner: MaleficScrin + Location: 20,25 + Actor1959: swal + Owner: MaleficScrin + Location: 20,24 + Actor1960: swal + Owner: MaleficScrin + Location: 20,23 + Actor1961: swal + Owner: MaleficScrin + Location: 19,23 + Actor1962: swal + Owner: MaleficScrin + Location: 18,23 + Actor1963: swal + Owner: MaleficScrin + Location: 4,29 + Actor1964: swal + Owner: MaleficScrin + Location: 4,31 + Actor1965: swal + Owner: MaleficScrin + Location: 4,32 + Actor1966: swal + Owner: MaleficScrin + Location: 4,30 + Actor1967: swal + Owner: MaleficScrin + Location: 5,29 + Actor1968: swal + Owner: MaleficScrin + Location: 6,29 + Actor1969: swal + Owner: MaleficScrin + Location: 7,29 + Actor1970: swal + Owner: MaleficScrin + Location: 7,30 + Actor1971: swal + Owner: MaleficScrin + Location: 7,32 + Actor1972: swal + Owner: MaleficScrin + Location: 7,31 + Actor1973: swal + Owner: MaleficScrin + Location: 7,33 + Actor1974: swal + Owner: MaleficScrin + Location: 6,33 + Actor1975: swal + Owner: MaleficScrin + Location: 5,33 + Actor1976: swal + Owner: MaleficScrin + Location: 4,33 + Actor1977: swal + Owner: MaleficScrin + Location: 3,33 + Actor1978: swal + Owner: MaleficScrin + Location: 3,34 + Actor1979: swal + Owner: MaleficScrin + Location: 4,34 + Actor1980: swal + Owner: MaleficScrin + Location: 7,34 + Actor1981: swal + Owner: MaleficScrin + Location: 8,33 + Actor1982: swal + Owner: MaleficScrin + Location: 8,34 + Actor1983: swal + Owner: MaleficScrin + Location: 8,29 + Actor1984: swal + Owner: MaleficScrin + Location: 7,28 + Actor1985: swal + Owner: MaleficScrin + Location: 8,28 + Actor1986: swal + Owner: MaleficScrin + Location: 4,28 + Actor1987: swal + Owner: MaleficScrin + Location: 3,28 + Actor1988: swal + Owner: MaleficScrin + Location: 3,29 + Actor1989: swal + Owner: MaleficScrin + Location: 16,27 + Actor1990: swal + Owner: MaleficScrin + Location: 16,26 + Actor1991: swal + Owner: MaleficScrin + Location: 16,23 + Actor1992: swal + Owner: MaleficScrin + Location: 16,22 + Actor1993: swal + Owner: MaleficScrin + Location: 17,22 + Actor1994: swal + Owner: MaleficScrin + Location: 21,27 + Actor1995: swal + Owner: MaleficScrin + Location: 21,26 + Actor1996: swal + Owner: MaleficScrin + Location: 20,22 + Actor1997: swal + Owner: MaleficScrin + Location: 21,22 + Actor1998: swal + Owner: MaleficScrin + Location: 21,23 + Actor1999: swal + Owner: MaleficScrin + Location: 21,7 + Actor2000: swal + Owner: MaleficScrin + Location: 21,6 + Actor2001: swal + Owner: MaleficScrin + Location: 21,4 + Actor2002: swal + Owner: MaleficScrin + Location: 21,5 + Actor2003: swal + Owner: MaleficScrin + Location: 21,8 + Actor2004: swal + Owner: MaleficScrin + Location: 22,8 + Actor2005: swal + Owner: MaleficScrin + Location: 23,8 + Actor2006: swal + Owner: MaleficScrin + Location: 24,8 + Actor2007: swal + Owner: MaleficScrin + Location: 24,7 + Actor2008: swal + Owner: MaleficScrin + Location: 24,5 + Actor2009: swal + Owner: MaleficScrin + Location: 24,4 + Actor2010: swal + Owner: MaleficScrin + Location: 22,4 + Actor2011: swal + Owner: MaleficScrin + Location: 23,4 + Actor2012: swal + Owner: MaleficScrin + Location: 24,6 + Actor2013: swal + Owner: MaleficScrin + Location: 20,8 + Actor2014: swal + Owner: MaleficScrin + Location: 20,9 + Actor2015: swal + Owner: MaleficScrin + Location: 21,9 + Actor2016: swal + Owner: MaleficScrin + Location: 24,9 + Actor2017: swal + Owner: MaleficScrin + Location: 25,8 + Actor2018: swal + Owner: MaleficScrin + Location: 25,9 + Actor2019: swal + Owner: MaleficScrin + Location: 24,3 + Actor2020: swal + Owner: MaleficScrin + Location: 25,4 + Actor2021: swal + Owner: MaleficScrin + Location: 25,3 + Actor2022: swal + Owner: MaleficScrin + Location: 21,3 + Actor2023: swal + Owner: MaleficScrin + Location: 20,3 + Actor2024: swal + Owner: MaleficScrin + Location: 20,4 + Actor2025: scol + Owner: MaleficScrin + Location: 3,32 + Actor2026: scol + Owner: MaleficScrin + Location: 8,32 + Actor2027: scol + Owner: MaleficScrin + Location: 16,25 + Actor2028: scol + Owner: MaleficScrin + Location: 21,25 + Actor2029: scol + Owner: MaleficScrin + Location: 20,7 + Actor2030: scol + Owner: MaleficScrin + Location: 25,7 + Actor2032: shar + Owner: MaleficScrin + Location: 18,22 + Actor2033: shar + Owner: MaleficScrin + Location: 5,28 + Actor2034: shar + Owner: MaleficScrin + Location: 22,3 + Actor2031: shar + Owner: MaleficScrin + Location: 18,28 + Actor2035: shar + Owner: MaleficScrin + Location: 5,34 + Actor2036: shar + Owner: MaleficScrin + Location: 22,9 + Actor2037: swal + Owner: MaleficScrin + Location: 6,34 + Actor2038: swal + Owner: MaleficScrin + Location: 23,9 + Actor2039: swal + Owner: MaleficScrin + Location: 19,22 + Actor2040: swal + Owner: MaleficScrin + Location: 6,28 + Actor2041: swal + Owner: MaleficScrin + Location: 23,3 + Actor2042: swal + Owner: MaleficScrin + Location: 6,20 + Actor2043: swal + Owner: MaleficScrin + Location: 6,19 + Actor2044: swal + Owner: MaleficScrin + Location: 7,19 + Actor2045: swal + Owner: MaleficScrin + Location: 7,20 + Actor2046: swal + Owner: MaleficScrin + Location: 13,17 + Actor2047: swal + Owner: MaleficScrin + Location: 13,16 + Actor2048: swal + Owner: MaleficScrin + Location: 14,16 + Actor2049: swal + Owner: MaleficScrin + Location: 14,17 + Actor2050: swal + Owner: MaleficScrin + Location: 10,49 + Actor2051: swal + Owner: MaleficScrin + Location: 10,48 + Actor2052: swal + Owner: MaleficScrin + Location: 11,48 + Actor2053: swal + Owner: MaleficScrin + Location: 11,49 + Actor2054: swal + Owner: MaleficScrin + Location: 17,49 + Actor2055: swal + Owner: MaleficScrin + Location: 16,48 + Actor2056: swal + Owner: MaleficScrin + Location: 17,48 + Actor2057: swal + Owner: MaleficScrin + Location: 16,49 + Actor2058: ptur + Owner: MaleficScrin + Location: 11,50 + TurretFacing: 518 + Actor2059: ptur + Owner: MaleficScrin + Location: 16,50 + TurretFacing: 566 + Actor2060: rea2 + Owner: MaleficScrin + Location: 10,83 + Actor2061: shar + Owner: MaleficScrin + Location: 26,22 + Actor2062: shar + Owner: MaleficScrin + Location: 12,27 + Actor2063: shar + Owner: MaleficScrin + Location: 34,34 + Actor2064: shar + Owner: MaleficScrin + Location: 37,23 + Actor2065: shar + Owner: MaleficScrin + Location: 35,11 + Actor2066: shar + Owner: MaleficScrin + Location: 25,42 + Actor2067: reac + Owner: MaleficScrin + Location: 24,155 + Actor2068: reac + Owner: MaleficScrin + Location: 13,148 + Actor2069: reac + Owner: MaleficScrin + Location: 16,148 + Actor2071: t06 + Owner: Neutral + Location: 108,24 + Actor2072: t02 + Owner: Neutral + Location: 112,15 + Actor2073: t07 + Owner: Neutral + Location: 117,11 + Actor2074: t02 + Owner: Neutral + Location: 120,22 + Actor2075: t15 + Owner: Neutral + Location: 118,21 + Actor2076: t11 + Owner: Neutral + Location: 125,29 + Actor2077: t15 + Owner: Neutral + Location: 125,19 + Actor2078: t11 + Owner: Neutral + Location: 116,9 + Actor2079: t11 + Owner: Neutral + Location: 118,2 + Actor2080: t13 + Owner: Neutral + Location: 115,27 + Actor2081: tc03 + Owner: Neutral + Location: 109,23 + Actor2082: t16 + Owner: Neutral + Location: 121,28 + Actor2084: t11 + Owner: Neutral + Location: 138,28 + Actor2085: t11 + Owner: Neutral + Location: 129,7 + Actor2086: tc02 + Owner: Neutral + Location: 126,3 + Actor2087: t15 + Owner: Neutral + Location: 128,1 + Actor2088: t17 + Owner: Neutral + Location: 126,1 + Actor2089: t02 + Owner: Neutral + Location: 128,7 + Actor2090: t16 + Owner: Neutral + Location: 131,21 + Actor2091: tc02 + Owner: Neutral + Location: 158,30 + Actor2092: tc01 + Owner: Neutral + Location: 185,24 + Actor2093: t13 + Owner: Neutral + Location: 183,22 + Actor2094: t11 + Owner: Neutral + Location: 134,1 + Actor2095: t13 + Owner: Neutral + Location: 97,12 + Actor2096: t15 + Owner: Neutral + Location: 98,5 + Actor2097: t16 + Owner: Neutral + Location: 127,18 + Actor2098: t06 + Owner: Neutral + Location: 118,23 + Actor2099: t05 + Owner: Neutral + Location: 116,26 + Actor2100: t14 + Owner: Neutral + Location: 181,90 + Actor2101: t08 + Owner: Neutral + Location: 182,89 + Actor2102: t06 + Owner: Neutral + Location: 30,173 + Actor2103: t02 + Owner: Neutral + Location: 24,172 + Actor2104: t16 + Owner: Neutral + Location: 25,173 + Actor2105: t01 + Owner: Neutral + Location: 23,174 + Actor2106: t08 + Owner: Neutral + Location: 24,174 + Actor2107: t08 + Owner: Neutral + Location: 31,173 + Actor2108: t08 + Owner: Neutral + Location: 39,176 + Actor2109: t17 + Owner: Neutral + Location: 21,168 + Actor2110: t08 + Owner: Neutral + Location: 57,159 + Actor2111: t08 + Owner: Neutral + Location: 38,127 + Actor2112: t08 + Owner: Neutral + Location: 2,114 + Actor2114: s3 + Owner: MaleficScrin + Facing: 384 + Location: 10,37 + SubCell: 3 + Actor2115: s3 + Owner: MaleficScrin + Location: 19,42 + SubCell: 3 + Facing: 743 + Actor2116: s3 + Owner: MaleficScrin + Location: 22,41 + SubCell: 3 + Facing: 641 + Actor2117: s3 + Owner: MaleficScrin + Facing: 384 + Location: 22,39 + SubCell: 3 + Actor2118: s3 + Owner: MaleficScrin + Location: 26,35 + SubCell: 3 + Facing: 620 + Actor2119: s3 + Owner: MaleficScrin + Location: 22,32 + SubCell: 3 + Facing: 702 + Actor2120: s3 + Owner: MaleficScrin + Facing: 384 + Location: 23,29 + SubCell: 3 + Actor2121: s3 + Owner: MaleficScrin + Facing: 384 + Location: 14,31 + SubCell: 3 + Actor2122: s3 + Owner: MaleficScrin + Facing: 384 + Location: 27,32 + SubCell: 3 + Actor2123: s3 + Owner: MaleficScrin + Location: 31,33 + SubCell: 3 + Facing: 709 + Actor2124: s3 + Owner: MaleficScrin + Facing: 384 + Location: 16,46 + SubCell: 3 + Actor2125: s3 + Owner: MaleficScrin + Facing: 384 + Location: 9,41 + SubCell: 3 + Actor2126: s3 + Owner: MaleficScrin + Location: 6,41 + SubCell: 3 + Facing: 593 + Actor2127: s3 + Owner: MaleficScrin + Location: 4,44 + SubCell: 3 + Facing: 627 + Actor2128: s3 + Owner: MaleficScrin + Location: 7,39 + SubCell: 3 + Facing: 491 + Actor2129: gunw + Owner: MaleficScrin + Location: 24,35 + Facing: 695 + Actor2130: gunw + Owner: MaleficScrin + Location: 19,32 + Facing: 511 + Actor2131: gunw + Owner: MaleficScrin + Location: 14,33 + Facing: 613 + Actor2132: gunw + Owner: MaleficScrin + Location: 13,38 + Facing: 436 + Actor2133: gunw + Owner: MaleficScrin + Location: 15,42 + Facing: 504 + Actor2134: gunw + Owner: MaleficScrin + Location: 25,38 + Facing: 525 + Actor2135: gunw + Owner: MaleficScrin + Facing: 384 + Location: 28,30 + Actor2136: mast + Owner: MaleficScrin + Facing: 384 + Location: 21,73 + SubCell: 3 + Actor2137: mast + Owner: MaleficScrin + Facing: 384 + Location: 152,8 + SubCell: 3 + Actor2138: tpod + Owner: MaleficScrin + Facing: 384 + Location: 145,20 + Actor2139: tpod + Owner: MaleficScrin + Facing: 384 + Location: 140,17 + Actor2140: tpod + Owner: MaleficScrin + Facing: 384 + Location: 137,12 + Actor2141: tpod + Owner: MaleficScrin + Location: 161,18 + Facing: 606 + Actor2142: tpod + Owner: MaleficScrin + Location: 168,12 + Facing: 654 + Actor2143: dark + Owner: MaleficScrin + Facing: 384 + Location: 149,23 + Actor2144: dark + Owner: MaleficScrin + Location: 158,23 + Facing: 531 + Actor2145: dark + Owner: MaleficScrin + Facing: 384 + Location: 139,19 + Actor2146: dark + Owner: MaleficScrin + Facing: 384 + Location: 134,11 + Actor2147: dark + Owner: MaleficScrin + Location: 167,16 + Facing: 600 + Actor2148: stlk + Owner: MaleficScrin + Facing: 384 + Location: 135,14 + SubCell: 3 + Actor2149: stlk + Owner: MaleficScrin + Facing: 384 + Location: 134,9 + SubCell: 3 + Actor2150: stlk + Owner: MaleficScrin + Facing: 384 + Location: 137,19 + SubCell: 3 + Actor2151: stlk + Owner: MaleficScrin + Facing: 384 + Location: 140,20 + SubCell: 3 + Actor2152: stlk + Owner: MaleficScrin + Facing: 384 + Location: 146,25 + SubCell: 3 + Actor2153: stlk + Owner: MaleficScrin + Facing: 384 + Location: 151,25 + SubCell: 3 + Actor2154: stlk + Owner: MaleficScrin + Location: 152,23 + SubCell: 3 + Facing: 525 + Actor2155: stlk + Owner: MaleficScrin + Location: 156,23 + SubCell: 3 + Facing: 518 + Actor2156: stlk + Owner: MaleficScrin + Location: 158,24 + SubCell: 3 + Facing: 579 + Actor2157: stlk + Owner: MaleficScrin + Location: 160,24 + SubCell: 3 + TurretFacing: 0 + Facing: 682 + Actor2158: stlk + Owner: MaleficScrin + Location: 171,12 + SubCell: 3 + Facing: 654 + Actor2159: s1 + Owner: MaleficScrin + Facing: 384 + Location: 177,150 + SubCell: 3 + Actor2160: s1 + Owner: MaleficScrin + Facing: 384 + Location: 174,148 + SubCell: 3 + Actor2161: s1 + Owner: MaleficScrin + Facing: 384 + Location: 175,152 + SubCell: 3 + Actor2162: s1 + Owner: MaleficScrin + Facing: 384 + Location: 175,154 + SubCell: 3 + Actor2163: s1 + Owner: MaleficScrin + Facing: 384 + Location: 175,157 + SubCell: 3 + Actor2164: s1 + Owner: MaleficScrin + Facing: 384 + Location: 176,160 + SubCell: 3 + Actor2165: s1 + Owner: MaleficScrin + Facing: 384 + Location: 177,162 + SubCell: 3 + Actor2166: s1 + Owner: MaleficScrin + Facing: 384 + Location: 177,159 + SubCell: 3 + Actor2167: s1 + Owner: MaleficScrin + Facing: 384 + Location: 181,164 + SubCell: 3 + Actor2168: s1 + Owner: MaleficScrin + Facing: 384 + Location: 190,164 + SubCell: 3 + Actor2169: corr + Owner: MaleficScrin + Facing: 384 + Location: 174,155 + Actor2170: tpod + Owner: MaleficScrin + Location: 180,157 + Facing: 384 + Actor2171: gunw + Owner: MaleficScrin + Facing: 384 + Location: 180,155 + Actor2172: gunw + Owner: MaleficScrin + Facing: 384 + Location: 183,160 + Actor2173: gunw + Owner: MaleficScrin + Location: 17,165 + Facing: 702 + Actor2174: gunw + Owner: MaleficScrin + Facing: 384 + Location: 30,161 + Actor2175: gunw + Owner: MaleficScrin + Location: 30,158 + Facing: 384 + Actor2176: gunw + Owner: MaleficScrin + Location: 21,154 + Facing: 559 + Actor2177: gunw + Owner: MaleficScrin + Location: 25,149 + Facing: 866 + Actor2178: devo + Owner: MaleficScrin + Facing: 384 + Location: 24,159 + Actor2179: devo + Owner: MaleficScrin + Facing: 384 + Location: 35,162 + Actor2180: stlk + Owner: MaleficScrin + Location: 25,169 + SubCell: 3 + Facing: 627 + Actor2181: stlk + Owner: MaleficScrin + Location: 26,167 + SubCell: 3 + Facing: 777 + Actor2182: stlk + Owner: MaleficScrin + Location: 28,166 + SubCell: 3 + Facing: 484 + Actor2183: stlk + Owner: MaleficScrin + Facing: 384 + Location: 30,166 + SubCell: 3 + Actor2184: stlk + Owner: MaleficScrin + Facing: 384 + Location: 36,164 + SubCell: 3 + Actor2185: stlk + Owner: MaleficScrin + Location: 29,143 + SubCell: 3 + Facing: 872 + Actor2186: stlk + Owner: MaleficScrin + Location: 35,145 + SubCell: 3 + Facing: 770 + Actor2187: stlk + Owner: MaleficScrin + Location: 36,146 + SubCell: 3 + Facing: 654 + Actor2188: stlk + Owner: MaleficScrin + Location: 26,88 + SubCell: 3 + Facing: 702 + Actor2189: stlk + Owner: MaleficScrin + Location: 26,87 + SubCell: 3 + Facing: 627 + Actor2190: stlk + Owner: MaleficScrin + Location: 27,86 + SubCell: 3 + Facing: 688 + Actor2191: stlk + Owner: MaleficScrin + Location: 28,82 + SubCell: 3 + Facing: 777 + Actor2192: stlk + Owner: MaleficScrin + Location: 30,81 + SubCell: 3 + Facing: 729 + Actor2193: stlk + Owner: MaleficScrin + Location: 29,79 + SubCell: 3 + Facing: 763 + Actor2194: stlk + Owner: MaleficScrin + Location: 29,79 + SubCell: 1 + Facing: 763 + Actor2195: stlk + Owner: MaleficScrin + Location: 29,76 + SubCell: 3 + Facing: 770 + Actor2196: stlk + Owner: MaleficScrin + Location: 28,75 + SubCell: 3 + Facing: 886 + Actor2197: stlk + Owner: MaleficScrin + Facing: 384 + Location: 9,62 + SubCell: 3 + Actor2198: stlk + Owner: MaleficScrin + Location: 12,61 + SubCell: 3 + Facing: 531 + Actor2199: stlk + Owner: MaleficScrin + Facing: 384 + Location: 14,64 + SubCell: 3 + Actor2200: stlk + Owner: MaleficScrin + Location: 16,64 + SubCell: 3 + Facing: 491 + Actor2201: stlk + Owner: MaleficScrin + Location: 17,64 + SubCell: 3 + Facing: 641 + Actor2202: stlk + Owner: MaleficScrin + Facing: 384 + Location: 13,82 + SubCell: 3 + Actor2203: stlk + Owner: MaleficScrin + Location: 11,77 + SubCell: 3 + Facing: 675 + Actor2204: stlk + Owner: MaleficScrin + Facing: 384 + Location: 7,76 + SubCell: 3 + Actor2205: stlk + Owner: MaleficScrin + Facing: 384 + Location: 16,71 + SubCell: 3 + Actor2206: stlk + Owner: MaleficScrin + Location: 18,71 + SubCell: 3 + Facing: 668 + Actor2207: stlk + Owner: MaleficScrin + Location: 24,92 + SubCell: 3 + Facing: 613 + Actor2208: dark + Owner: MaleficScrin + Location: 27,89 + Facing: 593 + Actor2209: dark + Owner: MaleficScrin + Location: 28,77 + Facing: 716 + Actor2210: dark + Owner: MaleficScrin + Location: 32,83 + Facing: 682 + Actor2211: stlk + Owner: MaleficScrin + Location: 38,51 + SubCell: 3 + Facing: 606 + Actor2212: stlk + Owner: MaleficScrin + Location: 35,55 + SubCell: 3 + Facing: 702 + Actor2213: stlk + Owner: MaleficScrin + Location: 31,56 + SubCell: 3 + Facing: 504 + Actor2214: stlk + Owner: MaleficScrin + Location: 39,47 + SubCell: 3 + Facing: 825 + Actor2215: stlk + Owner: MaleficScrin + Location: 9,26 + SubCell: 3 + Facing: 204 + Actor2216: stlk + Owner: MaleficScrin + Location: 9,27 + SubCell: 3 + Facing: 777 + Actor2217: stlk + Owner: MaleficScrin + Facing: 384 + Location: 23,22 + SubCell: 3 + Actor2218: stlk + Owner: MaleficScrin + Location: 21,21 + SubCell: 3 + Facing: 0 + Actor2219: stlk + Owner: MaleficScrin + Location: 25,16 + SubCell: 3 + Facing: 934 + Actor2220: stlk + Owner: MaleficScrin + Location: 24,11 + SubCell: 3 + Facing: 545 + Actor2221: stlk + Owner: MaleficScrin + Facing: 384 + Location: 26,5 + SubCell: 3 + Actor2222: stlk + Owner: MaleficScrin + Facing: 384 + Location: 27,4 + SubCell: 3 + Actor2223: stlk + Owner: MaleficScrin + Facing: 384 + Location: 22,13 + SubCell: 3 + Actor2224: gunw + Owner: MaleficScrin + Facing: 384 + Location: 73,101 + Actor2225: wchr + Owner: MaleficScrin + Facing: 384 + Location: 58,113 + SubCell: 3 + Actor2226: wchr + Owner: MaleficScrin + Facing: 384 + Location: 51,133 + SubCell: 3 + Actor2227: wchr + Owner: MaleficScrin + Facing: 384 + Location: 44,128 + SubCell: 3 + Actor2228: wchr + Owner: MaleficScrin + Facing: 384 + Location: 113,116 + SubCell: 3 + Actor2229: wchr + Owner: MaleficScrin + Facing: 384 + Location: 160,124 + SubCell: 3 + Actor2230: wchr + Owner: MaleficScrin + Facing: 384 + Location: 152,93 + SubCell: 3 + Actor2231: stlk + Owner: MaleficScrin + Facing: 384 + Location: 140,93 + SubCell: 3 + Actor2232: stlk + Owner: MaleficScrin + Facing: 384 + Location: 143,91 + SubCell: 3 + Actor2233: stlk + Owner: MaleficScrin + Facing: 384 + Location: 148,90 + SubCell: 3 + Actor2234: stlk + Owner: MaleficScrin + Facing: 384 + Location: 149,95 + SubCell: 3 + Actor2235: stlk + Owner: MaleficScrin + Location: 146,91 + SubCell: 3 + Facing: 384 + Actor2236: gunw + Owner: MaleficScrin + Facing: 384 + Location: 142,93 + Actor2237: gunw + Owner: MaleficScrin + Facing: 384 + Location: 126,97 + Actor2238: mrdr + Owner: MaleficScrin + Facing: 384 + Location: 126,96 + SubCell: 3 + Actor2239: mrdr + Owner: MaleficScrin + Facing: 384 + Location: 128,98 + SubCell: 3 + Actor2240: s4 + Owner: MaleficScrin + Facing: 384 + Location: 73,100 + SubCell: 3 + Actor2241: s4 + Owner: MaleficScrin + Facing: 384 + Location: 69,100 + SubCell: 3 + Actor2242: s4 + Owner: MaleficScrin + Facing: 384 + Location: 64,171 + SubCell: 3 + Actor2243: s4 + Owner: MaleficScrin + Facing: 384 + Location: 70,176 + SubCell: 3 + Actor2244: s4 + Owner: MaleficScrin + Facing: 384 + Location: 61,173 + SubCell: 3 + Actor2245: s4 + Owner: MaleficScrin + Facing: 384 + Location: 49,165 + SubCell: 3 + Actor2246: s1 + Owner: MaleficScrin + Facing: 384 + Location: 70,175 + SubCell: 3 + Actor2247: s1 + Owner: MaleficScrin + Facing: 384 + Location: 66,176 + SubCell: 3 + Actor2248: s1 + Owner: MaleficScrin + Facing: 384 + Location: 65,171 + SubCell: 3 + Actor2249: s1 + Owner: MaleficScrin + Facing: 384 + Location: 63,172 + SubCell: 3 + Actor2250: s1 + Owner: MaleficScrin + Facing: 384 + Location: 50,165 + SubCell: 3 + Actor2251: s1 + Owner: MaleficScrin + Facing: 384 + Location: 50,164 + SubCell: 3 + Actor2252: s1 + Owner: MaleficScrin + Facing: 384 + Location: 48,167 + SubCell: 3 + Actor2253: s1 + Owner: MaleficScrin + Facing: 384 + Location: 51,167 + SubCell: 3 + Actor2254: stlk + Owner: MaleficScrin + Facing: 384 + Location: 25,130 + SubCell: 3 + Actor2255: stlk + Owner: MaleficScrin + Facing: 384 + Location: 17,125 + SubCell: 3 + Actor2256: stlk + Owner: MaleficScrin + Facing: 384 + Location: 15,130 + SubCell: 3 + Actor2257: v01 + Owner: Neutral + Location: 165,170 + Actor2258: v01 + Owner: Neutral + Location: 65,38 + Actor2259: v04 + Owner: Neutral + Location: 66,31 + Actor2260: v07 + Owner: Neutral + Location: 73,42 + Actor2261: v09 + Owner: Neutral + Location: 70,30 + Actor2262: v11 + Owner: Neutral + Location: 70,36 + Actor2263: v17 + Owner: Neutral + Location: 71,32 + Actor2264: v16 + Owner: Neutral + Location: 70,32 + Actor2265: v08 + Owner: Neutral + Location: 61,36 + Actor2266: v03 + Owner: Neutral + Location: 156,173 + Actor2267: v05 + Owner: Neutral + Location: 158,181 + Actor2268: v17 + Owner: Neutral + Location: 161,177 + Actor2269: v16 + Owner: Neutral + Location: 162,177 + Actor2270: v07 + Owner: Neutral + Location: 162,175 + Actor2271: v12 + Owner: Neutral + Location: 155,173 + Actor2272: wood + Owner: Neutral + Location: 167,173 + Actor2273: wood + Owner: Neutral + Location: 168,173 + Actor2274: wood + Owner: Neutral + Location: 169,173 + Actor2275: wood + Owner: Neutral + Location: 169,172 + Actor2276: wood + Owner: Neutral + Location: 169,170 + Actor2277: wood + Owner: Neutral + Location: 169,171 + Actor2278: wood + Owner: Neutral + Location: 168,170 + Actor2279: wood + Owner: Neutral + Location: 165,173 + Actor2280: wood + Owner: Neutral + Location: 155,171 + Actor2281: wood + Owner: Neutral + Location: 156,171 + Actor2282: wood + Owner: Neutral + Location: 158,171 + Actor2283: wood + Owner: Neutral + Location: 66,41 + Actor2284: wood + Owner: Neutral + Location: 65,41 + Actor2285: wood + Owner: Neutral + Location: 63,39 + Actor2286: wood + Owner: Neutral + Location: 62,39 + Actor2287: wood + Owner: Neutral + Location: 70,33 + Actor2288: wood + Owner: Neutral + Location: 72,33 + Actor2289: wood + Owner: Neutral + Location: 71,33 + Actor2290: wood + Owner: Neutral + Location: 69,33 + Actor2291: wood + Owner: Neutral + Location: 72,32 + Actor2292: wood + Owner: Neutral + Location: 70,29 + Actor2293: wood + Owner: Neutral + Location: 71,29 + Actor2294: wood + Owner: Neutral + Location: 60,34 + Actor2295: wood + Owner: Neutral + Location: 70,35 + Actor2296: gunw + Owner: MaleficScrin + Facing: 384 + Location: 148,9 + Actor2297: gunw + Owner: MaleficScrin + Location: 159,8 + Facing: 641 + Actor2298: gunw + Owner: MaleficScrin + Facing: 384 + Location: 141,6 + Actor2299: gunw + Owner: MaleficScrin + Facing: 384 + Location: 16,128 + Actor2300: gunw + Owner: MaleficScrin + Facing: 384 + Location: 27,132 + Actor2301: gunw + Owner: MaleficScrin + Facing: 384 + Location: 9,76 + Actor2302: gunw + Owner: MaleficScrin + Facing: 384 + Location: 9,84 + Actor2303: gunw + Owner: MaleficScrin + Facing: 384 + Location: 5,82 + Actor2304: gunw + Owner: MaleficScrin + Location: 17,76 + Facing: 600 + Actor2305: s1 + Owner: MaleficScrin + Facing: 384 + Location: 110,8 + SubCell: 3 + Actor2306: s1 + Owner: MaleficScrin + Location: 112,6 + SubCell: 3 + Facing: 675 + Actor2307: s1 + Owner: MaleficScrin + Facing: 384 + Location: 112,4 + SubCell: 3 + Actor2308: s1 + Owner: MaleficScrin + Facing: 384 + Location: 106,9 + SubCell: 3 + Actor2309: stlk + Owner: MaleficScrin + Location: 110,6 + SubCell: 3 + Facing: 579 + Actor2310: gunw + Owner: MaleficScrin + Location: 111,7 + Facing: 613 + Actor2311: dark + Owner: MaleficScrin + Facing: 384 + Location: 165,44 + Actor2312: dark + Owner: MaleficScrin + Facing: 384 + Location: 171,43 + Actor2313: dark + Owner: MaleficScrin + Location: 148,42 + Facing: 384 + Actor2314: dark + Owner: MaleficScrin + Facing: 384 + Location: 140,42 + Actor2315: gunw + Owner: MaleficScrin + Facing: 384 + Location: 147,44 + Actor2316: gunw + Owner: MaleficScrin + Facing: 384 + Location: 141,43 + Actor2317: gunw + Owner: MaleficScrin + Location: 167,45 + Facing: 384 + Actor2318: stlk + Owner: MaleficScrin + Facing: 384 + Location: 170,45 + SubCell: 3 + Actor2319: stlk + Owner: MaleficScrin + Facing: 384 + Location: 164,44 + SubCell: 3 + Actor2320: stlk + Owner: MaleficScrin + Facing: 384 + Location: 149,44 + SubCell: 3 + Actor2321: stlk + Owner: MaleficScrin + Facing: 384 + Location: 145,43 + SubCell: 3 + Actor2322: stlk + Owner: MaleficScrin + Facing: 384 + Location: 138,42 + SubCell: 3 + Actor2323: s1 + Owner: MaleficScrin + Facing: 384 + Location: 167,47 + SubCell: 3 + Actor2324: s1 + Owner: MaleficScrin + Facing: 384 + Location: 164,46 + SubCell: 3 + Actor2325: s1 + Owner: MaleficScrin + Facing: 384 + Location: 162,45 + SubCell: 3 + Actor2326: s1 + Owner: MaleficScrin + Facing: 384 + Location: 161,45 + SubCell: 3 + Actor2327: s1 + Owner: MaleficScrin + Facing: 384 + Location: 151,44 + SubCell: 3 + Actor2328: s1 + Owner: MaleficScrin + Facing: 384 + Location: 151,44 + SubCell: 1 + Actor2329: s1 + Owner: MaleficScrin + Facing: 384 + Location: 147,46 + SubCell: 3 + Actor2330: s1 + Owner: MaleficScrin + Facing: 384 + Location: 144,46 + SubCell: 3 + Actor2331: s1 + Owner: MaleficScrin + Facing: 384 + Location: 143,44 + SubCell: 3 + Actor2332: s1 + Owner: MaleficScrin + Facing: 384 + Location: 104,77 + SubCell: 3 + Actor2333: s1 + Owner: MaleficScrin + Facing: 384 + Location: 103,74 + SubCell: 3 + Actor2334: s1 + Owner: MaleficScrin + Facing: 384 + Location: 108,77 + SubCell: 3 + Actor2335: s1 + Owner: MaleficScrin + Facing: 384 + Location: 108,77 + SubCell: 1 + Actor2336: s1 + Owner: MaleficScrin + Facing: 384 + Location: 108,78 + SubCell: 3 + Actor2337: s1 + Owner: MaleficScrin + Facing: 384 + Location: 77,86 + SubCell: 3 + Actor2338: s1 + Owner: MaleficScrin + Facing: 384 + Location: 73,83 + SubCell: 3 + Actor2339: s1 + Owner: MaleficScrin + Facing: 384 + Location: 75,83 + SubCell: 3 + Actor2340: s1 + Owner: MaleficScrin + Facing: 384 + Location: 75,89 + SubCell: 3 + Actor2341: s1 + Owner: MaleficScrin + Facing: 384 + Location: 75,90 + SubCell: 3 + Actor2342: s1 + Owner: MaleficScrin + Facing: 384 + Location: 81,84 + SubCell: 3 + Actor2343: corr + Owner: MaleficScrin + Facing: 384 + Location: 75,86 + Actor2344: s3 + Owner: MaleficScrin + Location: 49,86 + SubCell: 3 + Facing: 668 + Actor2345: s3 + Owner: MaleficScrin + Location: 54,83 + SubCell: 3 + Facing: 682 + Actor2346: lace + Owner: MaleficScrin + Location: 40,51 + Facing: 743 + E1: waypoint + Owner: Neutral + Location: 169,154 + E2a: waypoint + Owner: Neutral + Location: 135,136 + E2b: waypoint + Owner: Neutral + Location: 156,124 + N1a: waypoint + Owner: Neutral + Location: 146,28 + N1b: waypoint + Owner: Neutral + Location: 184,29 + N1c: waypoint + Owner: Neutral + Location: 105,17 + N2c: waypoint + Owner: Neutral + Location: 73,20 + N2a: waypoint + Owner: Neutral + Location: 118,58 + N2b: waypoint + Owner: Neutral + Location: 161,53 + N3a: waypoint + Owner: Neutral + Location: 145,104 + N3b: waypoint + Owner: Neutral + Location: 168,100 + EastSphere: wsph + Owner: MaleficScrin + Location: 183,154 + WestSphere1: wsph + Owner: MaleficScrin + Location: 14,73 + WestSphere2: wsph + Owner: MaleficScrin + Location: 18,74 + WestGrav: grav + Owner: MaleficScrin + Location: 8,73 + WestPortal: port + Owner: MaleficScrin + Location: 16,78 + NorthPortal2: port + Owner: MaleficScrin + Location: 153,13 + NorthPortal1: port + Owner: MaleficScrin + Location: 150,13 + NorthGrav1: grav + Owner: MaleficScrin + Location: 156,6 + NorthGrav2: grav + Owner: MaleficScrin + Location: 146,6 + EastPortal: port + Owner: MaleficScrin + Location: 183,149 + EastGrav: grav + Owner: MaleficScrin + Location: 188,143 + NWFlare: flare + Owner: Greece + Location: 73,65 + NEFlare: flare + Owner: Greece + Location: 142,65 + SEFlare: flare + Owner: Greece + Location: 135,122 + SWFlare: flare + Owner: Greece + Location: 73,129 + Actor2352: tpod + Owner: MaleficScrin + Location: 61,186 + Facing: 384 + ScriptTags: HardAndAbove + Actor2353: s4 + Owner: MaleficScrin + Facing: 384 + Location: 59,185 + SubCell: 3 + Actor2354: s4 + Owner: MaleficScrin + Facing: 384 + Location: 63,190 + SubCell: 3 + Actor2355: s1 + Owner: MaleficScrin + Facing: 384 + Location: 58,186 + SubCell: 3 + Actor2356: s1 + Owner: MaleficScrin + Facing: 384 + Location: 72,187 + SubCell: 3 + Actor2357: s1 + Owner: MaleficScrin + Facing: 384 + Location: 72,186 + SubCell: 3 + Actor2358: s1 + Owner: MaleficScrin + Facing: 384 + Location: 73,184 + SubCell: 3 + Actor2359: s1 + Owner: MaleficScrin + Facing: 384 + Location: 79,190 + SubCell: 3 + Actor2360: s1 + Owner: MaleficScrin + Facing: 384 + Location: 74,187 + SubCell: 3 + Actor2361: stlk + Owner: MaleficScrin + Facing: 384 + Location: 110,174 + SubCell: 3 + Actor2362: stlk + Owner: MaleficScrin + Facing: 384 + Location: 113,175 + SubCell: 3 + Actor2363: stlk + Owner: MaleficScrin + Facing: 384 + Location: 125,183 + SubCell: 3 + Actor2364: stlk + Owner: MaleficScrin + Facing: 384 + Location: 136,146 + SubCell: 3 + Actor2365: stlk + Owner: MaleficScrin + Facing: 384 + Location: 139,148 + SubCell: 3 + Actor2366: gunw + Owner: MaleficScrin + Facing: 384 + Location: 137,148 + Actor2367: stlk + Owner: MaleficScrin + Facing: 384 + Location: 171,129 + SubCell: 3 + Actor2368: stlk + Owner: MaleficScrin + Facing: 384 + Location: 168,128 + SubCell: 3 + Actor2369: s1 + Owner: MaleficScrin + Facing: 384 + Location: 171,130 + SubCell: 3 + Actor2370: s1 + Owner: MaleficScrin + Facing: 384 + Location: 166,127 + SubCell: 3 + Actor2371: s1 + Owner: MaleficScrin + Facing: 384 + Location: 173,124 + SubCell: 3 + Actor2372: s1 + Owner: MaleficScrin + Facing: 384 + Location: 172,129 + SubCell: 3 + Actor2373: s1 + Owner: MaleficScrin + Facing: 384 + Location: 144,179 + SubCell: 3 + Actor2374: s1 + Owner: MaleficScrin + Facing: 384 + Location: 143,177 + SubCell: 3 + Actor2375: s1 + Owner: MaleficScrin + Facing: 384 + Location: 145,179 + SubCell: 3 + Actor2376: stlk + Owner: MaleficScrin + Facing: 384 + Location: 144,178 + SubCell: 3 + Actor2377: s4 + Owner: MaleficScrin + Facing: 384 + Location: 145,181 + SubCell: 3 + SWBaseCenter: waypoint + Owner: Neutral + Location: 74,129 + N3c: waypoint + Owner: Neutral + Location: 71,48 + N3d: waypoint + Owner: Neutral + Location: 117,114 + W1: waypoint + Owner: Neutral + Location: 36,95 + W2a: waypoint + Owner: Neutral + Location: 55,74 + W2b: waypoint + Owner: Neutral + Location: 72,109 + W2c: waypoint + Owner: Neutral + Location: 53,127 + W2d: waypoint + Owner: Neutral + Location: 72,85 + N2d: waypoint + Owner: Neutral + Location: 164,66 + InitNavalYard: syrd + Owner: England + Location: 104,155 + Health: 39 + Tran1: lst + Owner: England + Location: 103,157 + Health: 20 + Facing: 384 + Tran2: lst + Owner: England + Location: 103,155 + Health: 61 + Facing: 384 + Tran3: lst + Owner: England + Location: 106,154 + Health: 38 + Facing: 384 + MiniBase3: waypoint + Owner: Neutral + Location: 138,168 + MiniBase2: waypoint + Owner: Neutral + Location: 108,157 + MiniBase1: waypoint + Owner: Neutral + Location: 73,99 + McvDest: waypoint + Owner: Neutral + Location: 96,176 + McvSpawn: waypoint + Owner: Neutral + Location: 96,192 + Actor2349: camera + Owner: MaleficScrin + Location: 64,128 + Actor2350: camera + Owner: MaleficScrin + Location: 73,119 + Actor2351: camera + Owner: MaleficScrin + Location: 143,123 + Actor2378: camera + Owner: MaleficScrin + Location: 134,133 + Actor2379: camera + Owner: MaleficScrin + Location: 152,66 + Actor2380: camera + Owner: MaleficScrin + Location: 139,61 + Actor2381: camera + Owner: MaleficScrin + Location: 72,60 + Actor2382: camera + Owner: MaleficScrin + Location: 63,68 + Actor2383: camera + Owner: MaleficScrin + Location: 167,156 + Actor2384: camera + Owner: MaleficScrin + Location: 143,150 + Actor2385: camera + Owner: MaleficScrin + Location: 173,171 + Actor2386: camera + Owner: MaleficScrin + Location: 38,116 + Actor2387: camera + Owner: MaleficScrin + Location: 17,100 + Actor2388: camera + Owner: MaleficScrin + Location: 59,53 + Actor2389: camera + Owner: MaleficScrin + Location: 112,49 + NorthSphere2: wsph + Owner: MaleficScrin + Location: 157,11 + NorthSphere1: wsph + Owner: MaleficScrin + Location: 145,11 + PlayerStart: waypoint + Owner: Neutral + Location: 13,186 + E3b: waypoint + Owner: Neutral + Location: 157,69 + E3a: waypoint + Owner: Neutral + Location: 143,82 + E2c: waypoint + Owner: Neutral + Location: 174,115 + Actor2392: s1 + Owner: MaleficScrin + Facing: 384 + Location: 145,70 + SubCell: 3 + RoamRally1: waypoint + Owner: Neutral + Location: 71,163 + RoamRally2: waypoint + Owner: Neutral + Location: 133,153 + RoamRally3: waypoint + Owner: Neutral + Location: 59,30 + RoamRally4: waypoint + Owner: Neutral + Location: 128,94 + Actor2393: cycl + Owner: Neutral + Location: 70,1 + Actor2394: cycl + Owner: Neutral + Location: 71,1 + Actor2395: cycl + Owner: Neutral + Location: 72,1 + Actor2396: cycl + Owner: Neutral + Location: 73,1 + Actor2397: cycl + Owner: Neutral + Location: 74,1 + Actor2398: cycl + Owner: Neutral + Location: 76,1 + Actor2399: cycl + Owner: Neutral + Location: 75,1 + Actor2400: cycl + Owner: Neutral + Location: 77,1 + Actor2401: cycl + Owner: Neutral + Location: 78,1 + Actor2402: cycl + Owner: Neutral + Location: 70,2 + Actor2403: cycl + Owner: Neutral + Location: 70,3 + Health: 32 + Actor2404: cycl + Owner: Neutral + Location: 70,4 + Actor2405: cycl + Owner: Neutral + Location: 70,5 + Actor2406: cycl + Owner: Neutral + Location: 70,6 + Actor2407: cycl + Owner: Neutral + Location: 72,6 + Actor2408: cycl + Owner: Neutral + Location: 71,6 + Health: 44 + Actor2409: cycl + Owner: Neutral + Location: 76,6 + Health: 16 + Actor2410: cycl + Owner: Neutral + Location: 77,6 + Actor2411: cycl + Owner: Neutral + Location: 78,6 + Actor2412: cycl + Owner: Neutral + Location: 78,5 + Actor2413: cycl + Owner: Neutral + Location: 78,4 + Health: 46 + Actor2414: cycl + Owner: Neutral + Location: 78,3 + Actor2415: cycl + Owner: Neutral + Location: 78,2 + Actor2417: dark + Owner: MaleficScrin + Facing: 384 + Location: 77,12 + Actor2418: corr + Owner: MaleficScrin + Facing: 384 + Location: 70,8 + Actor2419: stlk + Owner: MaleficScrin + Facing: 384 + Location: 77,10 + SubCell: 3 + Actor2420: stlk + Owner: MaleficScrin + Facing: 384 + Location: 79,11 + SubCell: 3 + Actor2421: stlk + Owner: MaleficScrin + Facing: 384 + Location: 72,8 + SubCell: 3 + Actor2422: s1 + Owner: MaleficScrin + Facing: 384 + Location: 74,11 + SubCell: 3 + Actor2423: s1 + Owner: MaleficScrin + Facing: 384 + Location: 71,7 + SubCell: 3 + Actor2424: s1 + Owner: MaleficScrin + Facing: 384 + Location: 73,14 + SubCell: 3 + Actor2427: s3 + Owner: MaleficScrin + Facing: 384 + Location: 76,11 + SubCell: 3 + Actor2428: seek + Owner: MaleficScrin + Facing: 384 + Location: 186,147 + Actor2429: seek + Owner: MaleficScrin + Facing: 384 + Location: 159,5 + Actor2430: seek + Owner: MaleficScrin + Facing: 384 + Location: 146,9 + Actor2431: seek + Owner: MaleficScrin + Location: 11,73 + Facing: 613 + Actor2432: seek + Owner: MaleficScrin + Location: 7,73 + Facing: 491 + AlliedMcv: mcv + Owner: England + Location: 76,3 + ScriptTags: VeryHardAndAbove + Health: 58 + Facing: 384 + Actor2425: s1 + Owner: MaleficScrin + Facing: 384 + Location: 75,10 + SubCell: 3 + Actor2426: s3 + Owner: MaleficScrin + Facing: 384 + Location: 78,10 + SubCell: 3 + Actor2416: camera + Owner: MaleficScrin + Location: 120,119 + Actor2433: camera + Owner: MaleficScrin + Location: 73,38 + Actor2434: camera + Owner: MaleficScrin + Location: 74,146 + NorthPlatform: sfac + Owner: MaleficScrin + Location: 151,2 + WestPlatform: sfac + Owner: MaleficScrin + Location: 2,74 + Actor2435: brik + Owner: England + Location: 86,134 + Actor2436: brik + Owner: England + Location: 85,134 + Actor2437: brik + Owner: England + Location: 85,135 + Actor2438: brik + Owner: England + Location: 86,135 + Actor2439: brik + Owner: England + Location: 84,135 + Actor2440: brik + Owner: England + Location: 83,135 + Actor2441: brik + Owner: England + Location: 81,135 + Actor2442: brik + Owner: England + Location: 81,134 + Actor2443: brik + Owner: England + Location: 82,135 + Actor2444: brik + Owner: England + Location: 82,134 + Actor2445: brik + Owner: England + Location: 83,129 + Actor2446: brik + Owner: England + Location: 83,128 + Actor2447: brik + Owner: England + Location: 83,127 + Actor2448: brik + Owner: England + Location: 82,127 + Actor2449: brik + Owner: England + Location: 82,128 + Actor2450: brik + Owner: England + Location: 84,129 + Actor2451: brik + Owner: England + Location: 84,128 + Actor2452: agun + Owner: England + Location: 82,129 + Health: 37 + TurretFacing: 661 + Actor1640: t05 + Owner: Neutral + Location: 107,134 + Actor568: gunw + Owner: MaleficScrin + Facing: 770 + Location: 79,124 + Actor566: tpod + Owner: MaleficScrin + Location: 76,130 + Facing: 384 + ScriptTags: HardAndAbove + Actor441: harv + Owner: England + Health: 66 + Facing: 384 + Location: 78,133 + Actor2453: gun + Owner: England + Location: 63,132 + Actor2454: gun + Owner: England + Location: 63,123 + Actor2456: s1 + Owner: MaleficScrin + Facing: 384 + Location: 147,70 + SubCell: 3 + Actor2457: s1 + Owner: MaleficScrin + Facing: 384 + Location: 146,71 + SubCell: 3 + Actor2458: s1 + Owner: MaleficScrin + Facing: 384 + Location: 136,64 + SubCell: 3 + Actor2459: s1 + Owner: MaleficScrin + Facing: 384 + Location: 139,66 + SubCell: 3 + Actor1709: tc01 + Owner: Neutral + Location: 80,26 + Actor2070: t11 + Owner: Neutral + Location: 104,21 + Actor2083: t12 + Owner: Neutral + Location: 100,22 + Actor2462: ifv + Owner: Greece + Location: 10,185 + Facing: 768 + Actor2463: ifv + Owner: Greece + Location: 10,187 + Facing: 768 + Actor2461: delp + Owner: Greece + Facing: 768 + Location: 12,185 + Actor2460: delp + Owner: Greece + Facing: 768 + Location: 12,187 + Actor2464: seal + Owner: Greece + Location: 19,183 + SubCell: 3 + Facing: 768 + Actor2465: seal + Owner: Greece + Location: 19,189 + SubCell: 3 + Facing: 768 + Actor2466: apwr + Owner: England + Location: 140,165 + Health: 46 + Actor2467: apwr + Owner: England + Location: 140,169 + Health: 35 + Actor548: chain + Owner: England + Location: 143,167 + Actor2468: shar + Owner: MaleficScrin + Location: 51,11 + Actor2469: nerv + Owner: MaleficScrin + Location: 52,12 + Actor2471: silo + Owner: England + Location: 71,129 + Health: 46 + Actor2472: silo + Owner: England + Location: 69,129 + Health: 39 + Actor2470: proc + Owner: England + Location: 69,129 + Health: 38 + FreeActor@CHARV: False + FreeActor: False + Actor298: atek + Owner: England + Health: 42 + Location: 138,62 + Actor2474: powr + Owner: England + Location: 65,58 + Health: 40 + Actor398: proc + Owner: England + FreeActor@CHARV: False + FreeActor: False + Health: 38 + Location: 135,66 + Actor444: harv + Owner: England + Location: 134,70 + Health: 37 + Facing: 256 + Actor2473: dome + Owner: England + Health: 46 + Location: 144,60 + Actor2391: s1 + Owner: MaleficScrin + Facing: 384 + Location: 146,64 + SubCell: 3 + MachineShop: macs + Owner: Neutral + Health: 46 + Location: 137,166 + Actor296: tent + Owner: England + Location: 68,70 + Health: 44 + Actor2390: s1 + Owner: MaleficScrin + Facing: 384 + Location: 66,67 + SubCell: 3 + Actor1078: stlk + Owner: MaleficScrin + Facing: 384 + Location: 66,65 + SubCell: 3 + Actor1072: dark + Owner: MaleficScrin + Location: 72,71 + Facing: 384 + ScriptTags: HardAndAbove + Actor1075: mrdr + Owner: MaleficScrin + Facing: 384 + Location: 71,70 + SubCell: 3 + Actor425: agun + Owner: England + Health: 46 + TurretFacing: 177 + Location: 65,63 + Actor990: s1 + Owner: MaleficScrin + Facing: 627 + Location: 80,123 + SubCell: 3 + Actor2455: gunw + Owner: MaleficScrin + Facing: 384 + Location: 72,122 + Actor985: s1 + Owner: MaleficScrin + Facing: 384 + Location: 72,123 + SubCell: 3 + Actor986: s1 + Owner: MaleficScrin + Facing: 600 + Location: 71,122 + SubCell: 3 + Actor989: s1 + Owner: MaleficScrin + Facing: 384 + Location: 73,122 + SubCell: 3 + Actor299: dome + Owner: England + Health: 27 + Location: 77,121 + Actor426: orep + Owner: England + Health: 42 + Location: 73,125 + Actor118: tent + Owner: England + Health: 38 + Location: 69,124 + Actor439: apwr + Owner: England + Health: 40 + Location: 76,72 + Actor410: tent + Owner: England + Health: 40 + Location: 145,66 + Actor427: proc + Owner: England + FreeActor@CHARV: False + FreeActor: False + Health: 40 + Location: 137,118 + Actor1001: gunw + Owner: MaleficScrin + Facing: 682 + Location: 135,120 + WarFactory: weap + Owner: England + Health: 36 + Location: 137,124 + Actor480: apwr + Owner: England + Health: 40 + Location: 131,124 + Actor2476: rea2 + Owner: MaleficScrin + Location: 3,2 + Actor2477: rea2 + Owner: MaleficScrin + Location: 6,2 + Actor2478: rea2 + Owner: MaleficScrin + Location: 9,2 + Actor2479: rea2 + Owner: MaleficScrin + Location: 3,5 + Actor2480: rea2 + Owner: MaleficScrin + Location: 6,5 + Actor2481: rea2 + Owner: MaleficScrin + Location: 9,5 + Gateway: wormholexxl + Owner: MaleficScrin + Location: 7,12 + Actor2482: swal + Owner: MaleficScrin + Location: 2,1 + Actor2483: swal + Owner: MaleficScrin + Location: 2,2 + Actor2484: swal + Owner: MaleficScrin + Location: 2,3 + Actor2485: swal + Owner: MaleficScrin + Location: 2,4 + Actor2486: swal + Owner: MaleficScrin + Location: 2,5 + Actor2487: swal + Owner: MaleficScrin + Location: 2,6 + Actor2488: swal + Owner: MaleficScrin + Location: 2,7 + Actor2489: swal + Owner: MaleficScrin + Location: 2,8 + Actor2490: swal + Owner: MaleficScrin + Location: 4,8 + Actor2491: swal + Owner: MaleficScrin + Location: 3,8 + Actor2492: swal + Owner: MaleficScrin + Location: 5,8 + Actor2493: swal + Owner: MaleficScrin + Location: 7,8 + Actor2494: swal + Owner: MaleficScrin + Location: 6,8 + Actor2495: swal + Owner: MaleficScrin + Location: 8,8 + Actor2496: swal + Owner: MaleficScrin + Location: 10,8 + Actor2497: swal + Owner: MaleficScrin + Location: 9,8 + Actor2498: swal + Owner: MaleficScrin + Location: 11,8 + Actor2499: swal + Owner: MaleficScrin + Location: 12,8 + Actor2500: swal + Owner: MaleficScrin + Location: 12,7 + Actor2501: swal + Owner: MaleficScrin + Location: 12,6 + Actor2502: swal + Owner: MaleficScrin + Location: 12,5 + Actor2503: swal + Owner: MaleficScrin + Location: 12,4 + Actor2504: swal + Owner: MaleficScrin + Location: 12,3 + Actor2505: swal + Owner: MaleficScrin + Location: 12,2 + Actor2506: swal + Owner: MaleficScrin + Location: 12,1 + Actor2507: swal + Owner: MaleficScrin + Location: 11,1 + Actor2508: swal + Owner: MaleficScrin + Location: 9,1 + Actor2509: swal + Owner: MaleficScrin + Location: 10,1 + Actor2510: swal + Owner: MaleficScrin + Location: 8,1 + Actor2511: swal + Owner: MaleficScrin + Location: 7,1 + Actor2512: swal + Owner: MaleficScrin + Location: 4,1 + Actor2513: swal + Owner: MaleficScrin + Location: 3,1 + Actor2514: swal + Owner: MaleficScrin + Location: 6,1 + Actor2515: swal + Owner: MaleficScrin + Location: 5,1 + Actor2516: shar + Owner: MaleficScrin + Location: 15,6 + Actor2517: shar + Owner: MaleficScrin + Location: 15,13 + Actor2518: shar + Owner: MaleficScrin + Location: 4,20 + Actor2475: weap + Owner: England + Health: 38 + Location: 69,66 + Actor304: fix + Owner: England + Health: 30 + Location: 74,66 + VoidEngine1: veng + Owner: MaleficScrin + Location: 18,36 + Facing: 384 + VoidEngine2: veng + Owner: MaleficScrin + Location: 33,23 + Facing: 384 + ScriptTags: VeryHardAndAbove + SWBaseTopLeft: waypoint + Owner: Neutral + Location: 58,116 + SWBaseBottomRight: waypoint + Owner: Neutral + Location: 87,150 + NWBaseTopLeft: waypoint + Owner: Neutral + Location: 62,55 + NWBaseBottomRight: waypoint + Owner: Neutral + Location: 81,77 + NEBaseTopLeft: waypoint + Owner: Neutral + Location: 130,55 + NEBaseBottomRight: waypoint + Owner: Neutral + Location: 151,76 + SEBaseBottomRight: waypoint + Owner: Neutral + Location: 145,133 + SEBaseTopLeft: waypoint + Owner: Neutral + Location: 123,113 + MiniBase1TopLeft: waypoint + Owner: Neutral + Location: 67,95 + MiniBase1BottomRight: waypoint + Owner: Neutral + Location: 76,103 + MiniBase2TopLeft: waypoint + Owner: Neutral + Location: 101,151 + MiniBase2BottomRight: waypoint + Owner: Neutral + Location: 114,163 + Actor1211: tc05 + Owner: Neutral + Location: 114,163 + MiniBase3TopLeft: waypoint + Owner: Neutral + Location: 131,162 + MiniBase3BottomRight: waypoint + Owner: Neutral + Location: 144,173 + McvReveal: waypoint + Owner: Neutral + Location: 74,5 + McvBaseTopLeft: waypoint + Owner: Neutral + Location: 69,0 + McvBaseBottomRight: waypoint + Owner: Neutral + Location: 80,15 + +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, banishment-rules.yaml + +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/mod.chrome.yaml b/mods/ca/mod.chrome.yaml new file mode 100644 index 0000000000..6d7cad424a --- /dev/null +++ b/mods/ca/mod.chrome.yaml @@ -0,0 +1,112 @@ +Chrome: + ca|chrome.yaml + +ChromeLayout: + common|chrome/ingame.yaml + common|chrome/ingame-chat.yaml + ca|chrome/ingame-transients.yaml + common|chrome/ingame-fmvplayer.yaml + common|chrome/ingame-info.yaml + common|chrome/ingame-infoscripterror.yaml + common|chrome/ingame-infobriefing.yaml + common|chrome/ingame-infoobjectives.yaml + ca|chrome/ingame-infostats.yaml + common|chrome/ingame-info-lobby-options.yaml + ca|chrome/ingame-menu.yaml + ca|chrome/ingame-observer.yaml + ca|chrome/ingame-player.yaml + common|chrome/ingame-perf.yaml + common|chrome/ingame-debug.yaml + common|chrome/ingame-debuginfo.yaml + common|chrome/ingame-infochat.yaml + ca|chrome/mainmenu.yaml + common|chrome/settings.yaml + ca|chrome/settings-display.yaml + common|chrome/settings-audio.yaml + common|chrome/settings-input.yaml + common|chrome/settings-hotkeys.yaml + common|chrome/settings-advanced.yaml + common|chrome/credits.yaml + common|chrome/lobby.yaml + common|chrome/lobby-mappreview.yaml + common|chrome/lobby-players.yaml + ca|chrome/lobby-options.yaml + common|chrome/lobby-music.yaml + common|chrome/lobby-servers.yaml + common|chrome/lobby-kickdialogs.yaml + ca|chrome/color-picker.yaml + common|chrome/mainmenu-prompts.yaml + common|chrome/map-chooser.yaml + common|chrome/multiplayer-browser.yaml + common|chrome/multiplayer-browserpanels.yaml + common|chrome/multiplayer-createserver.yaml + common|chrome/multiplayer-directconnect.yaml + common|chrome/connection.yaml + common|chrome/replaybrowser.yaml + common|chrome/gamesave-browser.yaml + ca|chrome/gamesave-loading.yaml + common|chrome/dropdowns.yaml + common|chrome/musicplayer.yaml + ca|chrome/tooltips.yaml + common|chrome/assetbrowser.yaml + ca|chrome/missionbrowser.yaml + common|chrome/confirmation-dialogs.yaml + common|chrome/editor.yaml + common|chrome/playerprofile.yaml + common|chrome/text-notifications.yaml + ca|chrome/encyclopedia.yaml + +ChromeMetrics: + common|metrics.yaml + ca|metrics.yaml + +Fonts: + Tiny: + Font: ca|bombardreg.ttf + Size: 12 + Ascender: 8 + TinyBold: + Font: ca|bombardreg.ttf + Size: 12 + Ascender: 8 + Small: + Font: ca|bombardreg.ttf + Size: 14 + Ascender: 9 + Regular: + Font: ca|bombardreg.ttf + Size: 16 + Ascender: 11 + Bold: + Font: ca|bombard.ttf + Size: 18 + Ascender: 11 + Medium: + Font: ca|bombardreg.ttf + Size: 20 + Ascender: 14 + MediumBold: + Font: ca|bombard.ttf + Size: 20 + Ascender: 14 + BigBold: + Font: ca|bombard.ttf + Size: 26 + Ascender: 18 + Title: + Font: ca|bombard.ttf + Size: 32 + Ascender: 26 + +Hotkeys: + common|hotkeys/game.yaml + common|hotkeys/observer.yaml + common|hotkeys/production-common.yaml + common|hotkeys/supportpowers.yaml + common|hotkeys/viewport.yaml + common|hotkeys/chat.yaml + common|hotkeys/editor.yaml + common|hotkeys/control-groups.yaml + ca|hotkeys/ca.yaml + +AllowUnusedFluentMessagesInExternalPackages: true diff --git a/mods/ca/mod.content.yaml b/mods/ca/mod.content.yaml new file mode 100644 index 0000000000..398a463a53 --- /dev/null +++ b/mods/ca/mod.content.yaml @@ -0,0 +1,66 @@ +Cursors: + ca|cursors.yaml + +Missions: + ca|missions.yaml + +Music: + ca|audio/music.yaml + +Notifications: + ca|audio/notifications.yaml + +Rules: + ca|rules/misc.yaml + ca|rules/ai.yaml + ca|rules/player.yaml + ca|rules/palettes.yaml + ca|rules/world.yaml + ca|rules/defaults.yaml + ca|rules/powers.yaml + ca|rules/vehicles.yaml + ca|rules/husks.yaml + ca|rules/structures.yaml + ca|rules/infantry.yaml + ca|rules/civilian.yaml + ca|rules/decoration.yaml + ca|rules/aircraft.yaml + ca|rules/ships.yaml + ca|rules/fakes.yaml + ca|rules/bridges.yaml + ca|rules/scrin.yaml + ca|rules/upgrades.yaml + ca|rules/encyclopedia.yaml + +Sequences: + ca|sequences/misc.yaml + ca|sequences/ships.yaml + ca|sequences/vehicles.yaml + ca|sequences/structures.yaml + ca|sequences/infantry.yaml + ca|sequences/aircraft.yaml + ca|sequences/decorations.yaml + ca|sequences/scrin.yaml + ca|sequences/upgrades.yaml + +TileSets: + ca|tilesets/snow.yaml + ca|tilesets/interior.yaml + ca|tilesets/temperat.yaml + ca|tilesets/desert.yaml + ca|tilesets/jungle.yaml + ca|tilesets/winter.yaml + ca|tilesets/barren.yaml + +Voices: + ca|audio/voices.yaml + +Weapons: + ca|weapons/explosions.yaml + ca|weapons/ballistics.yaml + ca|weapons/missiles.yaml + ca|weapons/other.yaml + ca|weapons/smallcaliber.yaml + ca|weapons/superweapons.yaml + ca|weapons/scrin.yaml + diff --git a/mods/ca/mod.yaml b/mods/ca/mod.yaml index 9bb9fec045..a2011489f2 100644 --- a/mods/ca/mod.yaml +++ b/mods/ca/mod.yaml @@ -1,192 +1,88 @@ Metadata: - Title: Combined Arms + Title: mod-title Version: prep-CA Website: https://www.moddb.com/mods/command-conquer-combined-arms - WebIcon32: https://www.openra.net/images/icons/ra_32x32.png + WebIcon32: https://ca.oraladder.net/img/icon_32x32.png + WindowTitle: mod-windowtitle PackageFormats: Mix -Packages: - ~^SupportDir|Content/ca - ~^SupportDir|Content/ca/expand - ~^SupportDir|Content/ca/ra - ~^SupportDir|Content/ca/cnc - ~^SupportDir|Content/ca/ts - ~^SupportDir|Content/ca/firestorm - ~^SupportDir|Content/ca/ra2 - ~^SupportDir|Content/ca/movies - ^EngineDir - ^EngineDir|mods/common: common - $ca: ca - ~main.mix - ~conquer.mix - ~lores.mix: lores - ~hires.mix - ~local.mix - ~sounds.mix - ~speech.mix - ~allies.mix - ~russian.mix - ~temperat.mix - ~snow.mix - ~interior.mix - ~./ra/scores.mix - ~./cnc/scores.mix - ~./ts/scores.mix - ~./ts/scores01.mix - ~./ra2/theme.mix - ~./ra2/thememd.mix - ~expand2.mix - ~hires1.mix - ~desert.mix - ca|bits - ca|bits/desert - ca|bits/jungle - ca|bits/winter - ca|bits/barren - ca|bits/temp - ca|bits/int - ca|bits/snow - ca|bits/audio - ca|uibits - ca|bits/scrin - ca|bits/scrin/audio +FileSystem: ContentInstallerFileSystem + SystemPackages: + ^EngineDir + $ca: ca + ^EngineDir|mods/common: common + ~^SupportDir|Content/ca: content + ca|scripts + ca|uibits + ContentPackages: + content|allies.mix + content|conquer.mix + content|lores.mix: lores + content|hires.mix + content|interior.mix + content|local.mix + content|russian.mix + content|snow.mix + content|sounds.mix + content|speech.mix + content|temperat.mix + content|cnc/desert.mix + content|expand/expand2.mix + content|expand/lores1.mix + content|expand/hires1.mix + ~content|cnc/scores.mix + ~content|ra/scores.mix + ~content|ts/scores.mix + ~content|ts/scores01.mix + ~content|ra2/theme.mix + ~content|ra2/thememd.mix + ca|bits + ca|bits/desert + ca|bits/jungle + ca|bits/winter + ca|bits/barren + ca|bits/temp + ca|bits/int + ca|bits/snow + ca|bits/audio + ca|bits/music + ca|bits/scrin + ca|bits/scrin/audio + ca|bits/scrin/terrain + RequiredContentFiles: + content|expand/chrotnk1.aud + content|expand/fixit1.aud + content|expand/jburn1.aud + content|expand/jchrge1.aud + content|expand/jcrisp1.aud + content|expand/jdance1.aud + content|expand/jjuice1.aud + content|expand/jjump1.aud + content|expand/jlight1.aud + content|expand/jpower1.aud + content|expand/jshock1.aud + content|expand/jyes1.aud + content|expand/madchrg2.aud + content|expand/madexplo.aud + content|expand/mboss1.aud + content|expand/mhear1.aud + content|expand/mhotdig1.aud + content|expand/mhowdy1.aud + content|expand/mhuh1.aud + content|expand/mlaff1.aud + content|expand/mrise1.aud + content|expand/mwrench1.aud + content|expand/myeehaw1.aud + content|expand/myes1.aud + ContentInstallerMod: ca-content MapFolders: + ca|missions/main-campaign: System + ca|missions/coop-campaign: System ca|maps: System ~^SupportDir|maps/ca/prep-CA: User -Rules: - ca|rules/misc.yaml - ca|rules/ai.yaml - ca|rules/player.yaml - ca|rules/palettes.yaml - ca|rules/world.yaml - ca|rules/defaults.yaml - ca|rules/vehicles.yaml - ca|rules/husks.yaml - ca|rules/structures.yaml - ca|rules/infantry.yaml - ca|rules/civilian.yaml - ca|rules/decoration.yaml - ca|rules/aircraft.yaml - ca|rules/ships.yaml - ca|rules/fakes.yaml - ca|rules/bridges.yaml - ca|rules/scrin.yaml - ca|rules/upgrades.yaml - -Sequences: - ca|sequences/misc.yaml - ca|sequences/ships.yaml - ca|sequences/vehicles.yaml - ca|sequences/structures.yaml - ca|sequences/infantry.yaml - ca|sequences/aircraft.yaml - ca|sequences/decorations.yaml - ca|sequences/scrin.yaml - ca|sequences/upgrades.yaml - -TileSets: - ca|tilesets/snow.yaml - ca|tilesets/interior.yaml - ca|tilesets/temperat.yaml - ca|tilesets/desert.yaml - ca|tilesets/jungle.yaml - ca|tilesets/winter.yaml - ca|tilesets/barren.yaml - -Cursors: - ca|cursors.yaml - -Chrome: - ca|chrome.yaml - -Assemblies: - ^BinDir|OpenRA.Mods.Common.dll - ^BinDir|OpenRA.Mods.Cnc.dll - ^BinDir|OpenRA.Mods.CA.dll - -ChromeLayout: - common|chrome/ingame.yaml - common|chrome/ingame-chat.yaml - common|chrome/ingame-fmvplayer.yaml - common|chrome/ingame-info.yaml - common|chrome/ingame-infoscripterror.yaml - common|chrome/ingame-infobriefing.yaml - common|chrome/ingame-infoobjectives.yaml - common|chrome/ingame-infostats.yaml - ca|chrome/ingame-menu.yaml - ca|chrome/ingame-observer.yaml - ca|chrome/ingame-player.yaml - common|chrome/ingame-perf.yaml - common|chrome/ingame-debug.yaml - common|chrome/ingame-debuginfo.yaml - common|chrome/ingame-infochat.yaml - ca|chrome/mainmenu.yaml - common|chrome/settings.yaml - common|chrome/settings-display.yaml - common|chrome/settings-audio.yaml - common|chrome/settings-input.yaml - common|chrome/settings-hotkeys.yaml - common|chrome/settings-advanced.yaml - common|chrome/credits.yaml - common|chrome/lobby.yaml - common|chrome/lobby-mappreview.yaml - common|chrome/lobby-players.yaml - common|chrome/lobby-options.yaml - common|chrome/lobby-music.yaml - common|chrome/lobby-servers.yaml - common|chrome/lobby-kickdialogs.yaml - common|chrome/color-picker.yaml - common|chrome/mainmenu-prompts.yaml - common|chrome/map-chooser.yaml - common|chrome/multiplayer-browser.yaml - common|chrome/multiplayer-browserpanels.yaml - common|chrome/multiplayer-createserver.yaml - common|chrome/multiplayer-directconnect.yaml - common|chrome/connection.yaml - common|chrome/replaybrowser.yaml - common|chrome/gamesave-browser.yaml - ca|chrome/gamesave-loading.yaml - common|chrome/dropdowns.yaml - common|chrome/musicplayer.yaml - common|chrome/tooltips.yaml - common|chrome/assetbrowser.yaml - common|chrome/missionbrowser.yaml - common|chrome/confirmation-dialogs.yaml - common|chrome/editor.yaml - common|chrome/playerprofile.yaml - -Weapons: - ca|weapons/explosions.yaml - ca|weapons/ballistics.yaml - ca|weapons/missiles.yaml - ca|weapons/other.yaml - ca|weapons/smallcaliber.yaml - ca|weapons/superweapons.yaml - ca|weapons/scrin.yaml - -Voices: - ca|audio/voices.yaml - -Notifications: - ca|audio/notifications.yaml - -Music: - ca|audio/music.yaml - -Translations: - ca|languages/english.yaml - -Hotkeys: - common|hotkeys/game.yaml - common|hotkeys/observer.yaml - common|hotkeys/production-common.yaml - common|hotkeys/supportpowers.yaml - common|hotkeys/viewport.yaml - ca|hotkeys.yaml - LoadScreen: ImageLoadScreen Image: ca|uibits/ca-loading-artwork.png Image2x: ca|uibits/ca-loading-artwork-2x.png @@ -195,64 +91,50 @@ LoadScreen: ImageLoadScreen Height: 256 Text: Loading... +Assemblies: OpenRA.Mods.Common.dll, OpenRA.Mods.Cnc.dll, OpenRA.Mods.CA.dll + +FluentMessages: + common|fluent/common.ftl + common|fluent/chrome.ftl + common|fluent/hotkeys.ftl + common|fluent/rules.ftl + ca|fluent/ca.ftl + ca|fluent/chrome.ftl + ca|fluent/encyclopedia.ftl + ca|fluent/factions.ftl + ca|fluent/hotkeys.ftl + ca|fluent/options.ftl + ca|fluent/powers.ftl + ca|fluent/rules.ftl + ServerTraits: LobbyCommands + SkirmishLogic PlayerPinger MasterServerPinger LobbySettingsNotification -ChromeMetrics: - common|metrics.yaml - ca|metrics.yaml - -Fonts: - Tiny: - Font: common|FreeSans.ttf - Size: 10 - Ascender: 8 - TinyBold: - Font: common|FreeSansBold.ttf - Size: 10 - Ascender: 8 - Small: - Font: common|FreeSans.ttf - Size: 12 - Ascender: 9 - Regular: - Font: common|FreeSans.ttf - Size: 14 - Ascender: 11 - Bold: - Font: common|FreeSansBold.ttf - Size: 14 - Ascender: 11 - MediumBold: - Font: common|FreeSansBold.ttf - Size: 18 - Ascender: 14 - BigBold: - Font: common|FreeSansBold.ttf - Size: 24 - Ascender: 18 - Title: - Font: ca|ZoodRangmah.ttf - Size: 48 - Ascender: 26 - -Missions: - ca|missions.yaml - MapGrid: TileSize: 24,24 Type: Rectangular +DefaultOrderGenerator: UnitOrderGenerator + SupportsMapsFrom: ca, ra -SoundFormats: Aud, Wav +SoundFormats: Aud, Wav, Mp3, Ogg SpriteFormats: ShpD2, R8, ShpTD, TmpRA, TmpTD, ShpTS SpriteSequenceFormat: ClassicTilesetSpecificSpriteSequence + TilesetCodes: + TEMPERAT: .tem + SNOW: .sno + INTERIOR: .int + DESERT: .des + JUNGLE: .jun + WINTER: .win + BARREN: .bar TilesetExtensions: TEMPERAT: .tem SNOW: .sno @@ -262,95 +144,49 @@ SpriteSequenceFormat: ClassicTilesetSpecificSpriteSequence WINTER: .win BARREN: .bar -ModelSequenceFormat: PlaceholderModelSequence +VideoFormats: Vqa, Wsa + +TerrainFormat: DefaultTerrain AssetBrowser: - SupportedExtensions: .r8, .shp, .tmp, .tem, .des, .sno, .int, .vqa + SpriteExtensions: .shp, .tmp, .tem, .win, .sno, .des, .int, .jun, .r8 + AudioExtensions: .aud, .wav, .v00, .v01, .v02, .v03, .var + VideoExtensions: .vqa, .wsa GameSpeeds: - slowest: - Name: Slowest - Timestep: 80 - OrderLatency: 2 - slower: - Name: Slower - Timestep: 50 - OrderLatency: 3 - default: - Name: Normal - Timestep: 40 - OrderLatency: 3 - fast: - Name: Fast - Timestep: 35 - OrderLatency: 4 - faster: - Name: Faster - Timestep: 30 - OrderLatency: 4 - fastest: - Name: Fastest - Timestep: 20 - OrderLatency: 6 - -ColorValidator: - TeamColorPresets: FE1100, 981f1f, f57606, F5D378, f8e947, f861a4, da06f3, 502048, 06f739, 35bb35, 94b319, 12b572, 0e48f6, 2f86f2, 77d8f8, abb7e4 - -ModContent: - InstallPromptMessage: Combined Arms requires artwork and audio from the original games.\n\nQuick Install will automatically download this content (without music\nor videos) from a mirror of the 2008 Command & Conquer/Red Alert freeware release.\n\nAdvanced Install includes options for downloading the music and for\ncopying the videos and other content from an original game disc. - QuickDownload: quickinstall - HeaderMessage: Game content may be extracted from the original game discs or an\nexisting digital install. OpenRA can also download the base game\nfiles from an online mirror of the 2008 freeware release of RA. - Packages: - base: Base Game Files - TestFiles: ^SupportDir|Content/ca/allies.mix, ^SupportDir|Content/ca/conquer.mix, ^SupportDir|Content/ca/interior.mix, ^SupportDir|Content/ca/hires.mix, ^SupportDir|Content/ca/lores.mix, ^SupportDir|Content/ca/local.mix, ^SupportDir|Content/ca/speech.mix, ^SupportDir|Content/ca/russian.mix, ^SupportDir|Content/ca/snow.mix, ^SupportDir|Content/ca/sounds.mix, ^SupportDir|Content/ca/temperat.mix - Sources: allied, allied-linux, soviet, soviet-linux, tfd, origin-ra - Required: true - Download: basefiles - aftermathbase: Aftermath Expansion Files - TestFiles: ^SupportDir|Content/ca/expand/expand2.mix - Sources: aftermath, aftermath-linux, tfd, origin-ra - Required: true - Download: aftermath - cncdesert: C&C Desert Tileset - TestFiles: ^SupportDir|Content/ca/cnc/desert.mix - Sources: tfd, origin-cnc, cnc95, cnc95-linux - Required: true - Download: cncdesert - music: Red Alert Music - TestFiles: ^SupportDir|Content/ca/ra/scores.mix - Sources: allied, allied-linux, soviet, soviet-linux, tfd, origin-ra - Download: music - cncmusic: C&C Music - TestFiles: ^SupportDir|Content/ca/cnc/scores.mix - Download: cncmusic - Sources: origin-cnc, tfd, cnc95 - tsmusic: TibSun Music - TestFiles: ^SupportDir|Content/ca/ts/scores.mix - Download: tsmusic - Sources: origin-ts, tfd - fsmusic: Firestorm Music - TestFiles: ^SupportDir|Content/ca/firestorm/linkup.aud, ^SupportDir|Content/ca/firestorm/hacker.aud - Download: fsmusic - Sources: tfd, origin-ts, fstorm - ra2music: RA2 Music - TestFiles: ^SupportDir|Content/ca/ra2/theme.mix - Sources: ra2, origin-ra2, tfd - yrmusic: YR Music - TestFiles: ^SupportDir|Content/ca/ra2/thememd.mix - Sources: ra2yr, origin-yr, tfd - Downloads: - ca|installer/downloads.yaml - Sources: - ca|installer/aftermath.yaml - ca|installer/allies95.yaml - ca|installer/cnc95.yaml - ca|installer/counterstrike.yaml - ca|installer/firstdecade.yaml - ca|installer/origin.yaml - ca|installer/ra2.yaml - ca|installer/ra2yr.yaml - ca|installer/firestorm.yaml - ca|installer/soviet95.yaml + DefaultSpeed: default + Speeds: + slowest: + Name: options-game-speed.slowest + Timestep: 80 + OrderLatency: 2 + slower: + Name: options-game-speed.slower + Timestep: 50 + OrderLatency: 3 + default: + Name: options-game-speed.normal + Timestep: 40 + OrderLatency: 3 + fast: + Name: options-game-speed.fast + Timestep: 35 + OrderLatency: 4 + faster: + Name: options-game-speed.faster + Timestep: 30 + OrderLatency: 4 + fastest: + Name: options-game-speed.fastest + Timestep: 20 + OrderLatency: 6 + +ModCredits: + ModCreditsFile: ca|CREDITS + ModTabTitle: Combined Arms DiscordService: ApplicationId: 787647352399200277 + +Include: mod.content.yaml +Include: mod.chrome.yaml diff --git a/mods/ca/rules/ai.yaml b/mods/ca/rules/ai.yaml index e6118f2fcd..8ce3d147a5 100644 --- a/mods/ca/rules/ai.yaml +++ b/mods/ca/rules/ai.yaml @@ -1,21 +1,21 @@ Player: ModularBot@BrutalAI: - Name: Brutal AI + Name: bot-brutal-ai.name Type: brutal ModularBot@VeryHardAI: - Name: Very Hard AI + Name: bot-vhard-ai.name Type: vhard ModularBot@HardAI: - Name: Hard AI + Name: bot-hard-ai.name Type: hard ModularBot@NormalAI: - Name: Normal AI + Name: bot-normal-ai.name Type: normal ModularBot@EasyAI: - Name: Easy AI + Name: bot-easy-ai.name Type: easy ModularBot@NavalAI: - Name: Naval AI + Name: bot-naval-ai.name Type: naval GrantConditionOnBotOwner@BrutalAI: Condition: enable-brutal-ai @@ -74,6 +74,15 @@ Player: Attractiveness: 1 TargetMetric: None CheckRadius: 5c0 + sathacklegion: + OrderName: sathacklegion + MinimumAttractiveness: 1 + Consideration@1: + Against: Enemy + Types: Structure + Attractiveness: 1 + TargetMetric: None + CheckRadius: 5c0 gdiuav: OrderName: gdiuav MinimumAttractiveness: 1 @@ -94,6 +103,15 @@ Player: CheckRadius: 5c0 cashhack: OrderName: cashhack + MinimumAttractiveness: 1 + Consideration@1: + Against: Enemy + Types: ResourceDrainable + Attractiveness: 1 + TargetMetric: None + CheckRadius: 8c0 + substrike: + OrderName: substrike MinimumAttractiveness: 5 Consideration@1: Against: Enemy @@ -101,8 +119,14 @@ Player: Attractiveness: 1 TargetMetric: None CheckRadius: 8c0 - markedairdrop: - OrderName: markedairdrop + Consideration@2: + Against: Enemy + Types: Water + Attractiveness: -5 + TargetMetric: None + CheckRadius: 8c0 + nodairdrop: + OrderName: nodairdrop MinimumAttractiveness: 5 Consideration@1: Against: Enemy @@ -191,8 +215,46 @@ Player: Attractiveness: -5 TargetMetric: None CheckRadius: 8c0 - hackercell: - OrderName: hackercell + airborne: + OrderName: airborne + MinimumAttractiveness: 3 + Consideration@1: + Against: Enemy + Types: Structure + Attractiveness: 1 + TargetMetric: None + CheckRadius: 8c0 + Consideration@2: + Against: Enemy + Types: Water + Attractiveness: -3 + TargetMetric: None + CheckRadius: 5c0 + airbornetank: + OrderName: airbornetank + MinimumAttractiveness: 3 + Consideration@1: + Against: Enemy + Types: Structure + Attractiveness: 1 + TargetMetric: None + CheckRadius: 8c0 + Consideration@2: + Against: Enemy + Types: Water + Attractiveness: -3 + TargetMetric: None + CheckRadius: 5c0 + assassinsquadai: + OrderName: assassinsquadai + Consideration@1: + Against: Ally + hackercellai: + OrderName: hackercellai + Consideration@1: + Against: Ally + confessorcabalai: + OrderName: confessorcabalai Consideration@1: Against: Ally droppods: @@ -225,6 +287,21 @@ Player: Attractiveness: -5 TargetMetric: None CheckRadius: 8c0 + tempinc: + OrderName: tempinc + MinimumAttractiveness: 5 + Consideration@1: + Against: Enemy + Types: Structure + Attractiveness: 1 + TargetMetric: None + CheckRadius: 8c0 + Consideration@2: + Against: Enemy + Types: Water + Attractiveness: -5 + TargetMetric: None + CheckRadius: 8c0 chronoshiftai: OrderName: Chronoshiftai MinimumAttractiveness: 5 @@ -240,6 +317,15 @@ Player: Attractiveness: -5 TargetMetric: None CheckRadius: 8c0 + strafe: + OrderName: strafe + MinimumAttractiveness: 1 + Consideration@1: + Against: Enemy + Types: Structure + Attractiveness: 1 + TargetMetric: Value + CheckRadius: 4c0 carpetbomb: OrderName: carpetbomb MinimumAttractiveness: 1 @@ -249,6 +335,14 @@ Player: Attractiveness: 1 TargetMetric: None CheckRadius: 5c0 + gmutation: + OrderName: mutabomb + MinimumAttractiveness: 6 + Consideration@1: + Against: Enemy + Types: Infantry + Attractiveness: 1 + CheckRadius: 4c0 parabombs: OrderName: parabombs MinimumAttractiveness: 1 @@ -267,6 +361,14 @@ Player: Attractiveness: 1 TargetMetric: None CheckRadius: 5c0 + chaosbombs: + OrderName: chaosbombs + MinimumAttractiveness: 6 + Consideration@1: + Against: Enemy + Types: Infantry, Vehicle + Attractiveness: 1 + CheckRadius: 4c0 infernobombs: OrderName: infernobomb MinimumAttractiveness: 1 @@ -281,7 +383,7 @@ Player: MinimumAttractiveness: 3000 Consideration@1: Against: Enemy - Types: Structure + Types: Structure, AirHighValue Attractiveness: 1 TargetMetric: Value CheckRadius: 5c0 @@ -296,7 +398,7 @@ Player: MinimumAttractiveness: 3000 Consideration@1: Against: Enemy - Types: Structure + Types: Structure, AirHighValue Attractiveness: 1 TargetMetric: Value CheckRadius: 5c0 @@ -311,22 +413,22 @@ Player: MinimumAttractiveness: 3000 Consideration@1: Against: Enemy - Types: Structure + Types: Defense Attractiveness: 1 TargetMetric: Value - CheckRadius: 5c0 + CheckRadius: 3c0 Consideration@2: Against: Ally Types: Air, Ground, Water Attractiveness: -10 TargetMetric: Value - CheckRadius: 7c0 + CheckRadius: 5c0 ioncannonpower: OrderName: ioncannon MinimumAttractiveness: 3000 Consideration@1: Against: Enemy - Types: Structure + Types: Structure, AirHighValue Attractiveness: 1 TargetMetric: Value CheckRadius: 5c0 @@ -360,18 +462,12 @@ Player: Attractiveness: 5 TargetMetric: Value CheckRadius: 7c0 - Consideration@2: - Against: Enemy - Types: Structure - Attractiveness: 2 - TargetMetric: Value - CheckRadius: 3c0 stormpower: OrderName: storm MinimumAttractiveness: 3000 Consideration@1: Against: Enemy - Types: Structure + Types: Structure, AirHighValue Attractiveness: 1 TargetMetric: Value CheckRadius: 5c0 @@ -433,43 +529,71 @@ Player: Attractiveness: -10 TargetMetric: Value CheckRadius: 7c0 - rocketbarragepower: - OrderName: rocketbarrage - MinimumAttractiveness: 3000 + heroesoftheunionpower: + OrderName: heroesofunion + MinimumAttractiveness: 5 + Consideration@1: + Against: Ally + Types: HeroOfUnionTargetable + Attractiveness: 1 + TargetMetric: None + CheckRadius: 3c512 + tankdroppower: + OrderName: tankdrop + MinimumAttractiveness: 5 Consideration@1: Against: Enemy - Types: Structure, Vehicle, Infantry + Types: Structure Attractiveness: 1 - TargetMetric: Value - CheckRadius: 5c0 + TargetMetric: None + CheckRadius: 8c0 Consideration@2: - Against: Ally - Types: Air, Ground, Water - Attractiveness: -10 + Against: Enemy + Types: Water + Attractiveness: -5 + TargetMetric: None + CheckRadius: 8c0 + killzonepower: + OrderName: killzone + MinimumAttractiveness: 3000 + Consideration@1: + Against: Enemy + Types: Infantry, Vehicle + Attractiveness: 1 TargetMetric: Value - CheckRadius: 7c0 + CheckRadius: 8c0 ironcurtainpower: OrderName: ironcurtain MinimumAttractiveness: 1000 FineScanRadius: 2 - Consideration@2: - Against: Enemy - Types: Infantry - Attractiveness: 2 - TargetMetric: Value - CheckRadius: 2c0 - Consideration@3: + Consideration@1: Against: Ally - Types: Vehicle, Tank + Types: Vehicle Attractiveness: 5 TargetMetric: Value CheckRadius: 3c0 - Consideration@4: + Consideration@2: Against: Ally Types: Infantry Attractiveness: -2 TargetMetric: Value CheckRadius: 2c0 + atomicammopower: + OrderName: atomicammo + MinimumAttractiveness: 2 + Consideration@1: + Against: Ally + Types: AtomicAmmoTargetable + Attractiveness: 1 + CheckRadius: 1c512 + atomicammoiraqpower: + OrderName: atomicammoiraq + MinimumAttractiveness: 2 + Consideration@1: + Against: Ally + Types: AtomicAmmoTargetable + Attractiveness: 1 + CheckRadius: 2c0 nshieldpower: OrderName: nshieldorder MinimumAttractiveness: 1000 @@ -481,7 +605,7 @@ Player: CheckRadius: 4c0 stealthgenpower: OrderName: stealthgen - MinimumAttractiveness: 1000 + MinimumAttractiveness: 2500 FineScanRadius: 2 Consideration@1: Against: Enemy @@ -509,26 +633,25 @@ Player: CheckRadius: 2c0 frenzypower: OrderName: frenzy - MinimumAttractiveness: 1000 - FineScanRadius: 2 + MinimumAttractiveness: 2500 Consideration@3: Against: Ally Types: Vehicle, Infantry - Attractiveness: 2 + Attractiveness: 1 TargetMetric: Value CheckRadius: 3c0 naniterepairpower: OrderName: nrepair - MinimumAttractiveness: 1000 + MinimumAttractiveness: 2000 Consideration@1: Against: Ally Types: Vehicle Attractiveness: 2 TargetMetric: Value CheckRadius: 4c0 - gpsscramblerpower: - OrderName: gpsscramble - MinimumAttractiveness: 1000 + veilofwarpower: + OrderName: veilofwar + MinimumAttractiveness: 3000 Consideration@2: Against: Enemy Types: Infantry, Vehicle @@ -541,6 +664,34 @@ Player: Attractiveness: 1 TargetMetric: Value CheckRadius: 8c0 + cryostormpower: + OrderName: cryostorm + MinimumAttractiveness: 3000 + Consideration@1: + Against: Enemy + Types: Infantry, Vehicle + Attractiveness: 1 + TargetMetric: Value + CheckRadius: 4c512 + heliosbombpower: + OrderName: heliosbomb + MinimumAttractiveness: 3000 + Consideration@1: + Against: Enemy + Types: Infantry, Vehicle + Attractiveness: 1 + TargetMetric: Value + CheckRadius: 7c0 + blackskystrikepower: + OrderName: blackskystrike + MinimumAttractiveness: 4000 + FineScanRadius: 2 + Consideration@1: + Against: Enemy + Types: Vehicle + Attractiveness: 1 + TargetMetric: Value + CheckRadius: 6c0 stormspikepower: OrderName: stormspike MinimumAttractiveness: 5 @@ -557,22 +708,47 @@ Player: Consideration@3: Against: Enemy Types: Infantry - Attractiveness: 2 + Attractiveness: 1 TargetMetric: Value CheckRadius: 2c0 ionsurgepower: OrderName: ionsurge - MinimumAttractiveness: 2000 + MinimumAttractiveness: 2500 Consideration@1: Against: Ally Types: Vehicle, Infantry, Air Attractiveness: 1 TargetMetric: Value CheckRadius: 6c0 + owrath: + OrderName: overlordswrath + MinimumAttractiveness: 3000 + Consideration@1: + Against: Enemy + Types: Defense + Attractiveness: 1 + TargetMetric: Value + CheckRadius: 3c0 + Consideration@2: + Against: Ally + Types: Air, Ground, Water + Attractiveness: -10 + TargetMetric: Value + CheckRadius: 5c0 suppressionpower: OrderName: suppression - MinimumAttractiveness: 1000 + MinimumAttractiveness: 3000 FineScanRadius: 2 + Consideration@3: + Against: Enemy + Types: Vehicle, Infantry + Attractiveness: 1 + TargetMetric: Value + CheckRadius: 3c0 + suppressionsiphonpower: + OrderName: suppressionsiphon + MinimumAttractiveness: 3000 + FineScanRadius: 1 Consideration@3: Against: Enemy Types: Vehicle, Infantry @@ -584,7 +760,7 @@ Player: MinimumAttractiveness: 3000 Consideration@1: Against: Enemy - Types: Structure + Types: Structure, AirHighValue Attractiveness: 1 TargetMetric: Value CheckRadius: 5c0 @@ -596,24 +772,32 @@ Player: CheckRadius: 7c0 HarvesterBotModuleCA: RequiresCondition: enable-brutal-ai || enable-vhard-ai || enable-hard-ai || enable-normal-ai || enable-easy-ai || enable-naval-ai - HarvesterTypes: harv,harv.td,harv.scrin,harv.chrono + HarvesterTypes: harv,harv.td,harv.td.upg,harv.scrin,harv.chrono RefineryTypes: proc,proc.td,proc.scrin - CaptureManagerBotModuleCA: + CaptureManagerBotModule: RequiresCondition: enable-brutal-ai || enable-vhard-ai || enable-hard-ai || enable-normal-ai || enable-easy-ai - CapturingActorTypes: e6, n6, s6 + CapturingActorTypes: e6,n6,s6 + CapturableActorTypes: fact,afac,sfac,barr,tent,hand,pyle,port,weap,airs,weap.td,wsph,atek,stek,gtek,tmpl,scrt,dome,hq,hq.upg,nerv,mslo,mslo.nod,weat,eye,rfgn,iron,pdox,sgen,mani,oilb,oilb.husk,bio,bio.husk,miss,miss.husk,hosp,hosp.husk,fcom,fcom.husk,oilr,oilr.husk,macs,macs.husk CheckCaptureTargetsForVisibility: false MaximumCaptureTargetOptions: 15 - EnemyAvoidanceRadius: 4c0 BridgeRepairBotModule: RequiresCondition: enable-brutal-ai || enable-vhard-ai || enable-hard-ai || enable-normal-ai || enable-easy-ai RepairActorTypes: e6, n6, s6 EnemyAvoidanceRadius: 4c0 - BuildingRepairBotModule: + BuildingRepairBotModuleCA: RequiresCondition: enable-brutal-ai || enable-vhard-ai || enable-hard-ai || enable-normal-ai || enable-easy-ai || enable-naval-ai PowerDownBotModuleCA: RequiresCondition: enable-brutal-ai || enable-vhard-ai || enable-hard-ai || enable-normal-ai || enable-easy-ai || enable-naval-ai + McvManagerBotModuleCA@brutal: + RequiresCondition: enable-brutal-ai + McvTypes: mcv, amcv, smcv + ConstructionYardTypes: fact, afac, sfac + McvFactoryTypes: weap, weap.td, airs, wsph + ScanForNewMcvInterval: 80 + MaxBaseRadius: 25 + MinimumConstructionYardCount: 3 McvManagerBotModuleCA@upper: - RequiresCondition: enable-brutal-ai || enable-vhard-ai || enable-hard-ai + RequiresCondition: enable-vhard-ai || enable-hard-ai McvTypes: mcv, amcv, smcv ConstructionYardTypes: fact, afac, sfac McvFactoryTypes: weap, weap.td, airs, wsph @@ -627,7 +811,8 @@ Player: McvFactoryTypes: weap, weap.td, airs, wsph BaseBuilderBotModuleCA@brutal-vhard: RequiresCondition: enable-brutal-ai || enable-vhard-ai - BuildingQueues: Building, Upgrade + BuildingQueues: BuildingSQ, BuildingMQ, Upgrade + DefenseQueues: DefenseSQ, DefenseMQ MinimumExcessPower: 50 MaximumExcessPower: 350 ExcessPowerIncrement: 10 @@ -642,11 +827,21 @@ Player: NavalProductionTypes: spen,syrd,spen.nod,syrd.gdi SiloTypes: silo,silo.td,silo.scrin AntiAirTypes: sam, nsam, agun, cram, shar + DefenseTypes: pbox, hbox, htur, gun, gun.td, gtwr, atwr, ptur, scol, obli, ltur, stwr, tsla, ftur, ttur, pris, sam, nsam, agun, cram, shar MaxBaseRadius: 26 + BuildingIntervals: + proc: 2250 + proc.td: 2250 + proc.scrin: 2250 + weap: 2250 + weap.td: 2250 + airs: 2250 + wsph: 2250 BuildingDelays: kenn: 2800 dome: 4500 hq: 4500 + hq.upg: 4500 nerv: 4500 syrd: 6000 spen: 6000 @@ -658,20 +853,23 @@ Player: hpad: 6375 hpad.td: 6375 atek: 6375 + alhq: 6375 gtek: 6375 stek: 6375 tmpl: 6375 scrt: 6375 tmpp: 8000 upgc: 8000 + cvat: 8000 indp: 8000 + munp: 8000 orep: 8000 sign: 8000 mslo: 8000 mslo.nod: 8000 weat: 8000 eye: 8000 - rift: 8000 + rfgn: 8000 BuildingLimits: barr: 5 tent: 5 @@ -681,6 +879,7 @@ Player: kenn: 1 dome: 1 hq: 1 + hq.upg: 1 nerv: 1 weap: 4 weap.td: 4 @@ -688,10 +887,11 @@ Player: wsph: 4 hpad: 5 hpad.td: 5 - afld: 2 - afld.gdi: 2 + afld: 5 + afld.gdi: 5 grav: 5 atek: 1 + alhq: 1 stek: 1 gtek: 1 tmpl: 1 @@ -699,6 +899,7 @@ Player: fix: 1 rep: 1 srep: 1 + npwr: 1 spen: 2 syrd: 2 spen.nod: 2 @@ -707,16 +908,16 @@ Player: proc: 30 proc.td: 30 proc.scrin: 30 - hand: 5 - pyle: 5 - barr: 5 - tent: 5 - port: 5 + hand: 15 + pyle: 15 + barr: 15 + tent: 15 + port: 15 kenn: 1 - weap: 5 - weap.td: 5 - airs: 5 - wsph: 5 + weap: 10 + weap.td: 10 + airs: 10 + wsph: 10 pbox: 7 hbox: 7 gtwr: 7 @@ -740,6 +941,7 @@ Player: shar: 9 gap: 1 atek: 1 + alhq: 1 stek: 1 silo: 1 silo.td: 1 @@ -752,44 +954,54 @@ Player: rep: 1 srep: 1 hq: 10 + hq.upg: 10 nerv: 10 - afld: 3 - afld.gdi: 3 + afld: 10 + afld.gdi: 10 grav: 4 mslo: 1 iron: 1 pdox: 1 sgen: 1 + sgen.shadow: 1 mani: 1 eye: 1 weat: 1 mslo.nod: 1 - rift: 1 + rfgn: 1 + npwr: 1 + cvat: 1 indp: 1 + munp: 1 tmpp: 1 upgc: 1 - upgc.bomb: 1 - upgc.seek: 1 - upgc.hold: 1 upgc.drop: 1 orep: 1 sign: 1 patr: 1 - hpad: 4 - hpad.td: 4 + hpad: 10 + hpad.td: 10 spen: 1 syrd: 1 spen.nod: 1 syrd.gdi: 1 bombard.strat: 1 bombard2.strat: 1 + bombard3.strat: 1 seek.strat: 1 seek2.strat: 1 + seek3.strat: 1 hold.strat: 1 hold2.strat: 1 + hold3.strat: 1 sonic.upgrade: 1 - drone.upgrade: 1 - pointlaser.upgrade: 1 + mdrone.upgrade: 1 + bdrone.upgrade: 1 + abur.upgrade: 1 + bjet.upgrade: 1 + thwk.upgrade: 1 + tow.upgrade: 1 + pointdef.upgrade: 1 hypersonic.upgrade: 1 hailstorm.upgrade: 1 hammerhead.upgrade: 1 @@ -797,32 +1009,81 @@ Player: hovermam.upgrade: 1 ionmam.upgrade: 1 vulcan.upgrade: 1 + delp.upgrade: 1 empgren.upgrade: 1 + avenger.upgrade: 1 + sidewinders.upgrade: 1 + ceramic.upgrade: 1 hazmat.upgrade: 1 + hazmatsoviet.upgrade: 1 howi.upgrade: 1 microwave.upgrade: 1 + blacknapalm.upgrade: 1 + quantum.upgrade: 1 tibcore.upgrade: 1 - cyborg.upgrade: 1 + lastnk.upgrade: 1 + rahstealth.upgrade: 1 + sharv.upgrade: 1 + hstk.upgrade: 1 + cust.upgrade: 1 + rbug.upgrade: 1 + cyborgdmg.upgrade: 1 + cyborgprod.upgrade: 1 cyborgspeed.upgrade: 1 cyborgarmor.upgrade: 1 seismic.upgrade: 1 tarc.upgrade: 1 - indp.upgrade: 1 - iraqtank.upgrade: 1 - v2.upgrade: 1 - orep.upgrade: 1 + ttrp.upgrade: 1 + deso.upgrade: 1 + atomicengines.upgrade: 1 + erad.upgrade: 1 + lasher.upgrade: 1 + gattling.upgrade: 1 charv.upgrade: 1 pcan.upgrade: 1 - cryr.upgrade: 1 + airborne.upgrade: 1 + cryw.upgrade: 1 apb.upgrade: 1 + sweden.coalition: 1 + korea.coalition: 1 + greece.coalition: 1 + economy.policy: 1 + defense.policy: 1 + development.policy: 1 + flakarmor.upgrade: 1 + carapace.upgrade: 1 advart.upgrade: 1 + shrw.upgrade: 1 + loyalist.allegiance: 1 + rebel.allegiance: 1 + malefic.allegiance: 1 + evis.upgrade: 1 + impl.upgrade: 1 + stlk.upgrade: 1 + stellar.upgrade: 1 + coalescence.upgrade: 1 resconv.upgrade: 1 ioncon.upgrade: 1 regen.upgrade: 1 shields.upgrade: 1 + infantry.doctrine: 1 + armor.doctrine: 1 + arty.doctrine: 1 + imppara.upgrade: 1 + impstorm.upgrade: 1 + impmuta.upgrade: 1 + reactive.upgrade: 1 + rocketpods.upgrade: 1 + ovld.upgrade: 1 + apoc.upgrade: 1 + nukc.upgrade: 1 + wrath.covenant: 1 + unity.covenant: 1 + zeal.covenant: 1 BaseBuilderBotModuleCA@hard: RequiresCondition: enable-hard-ai - BuildingQueues: Building, Upgrade + BuildingQueues: BuildingSQ, BuildingMQ, Upgrade + DefenseQueues: DefenseSQ, DefenseMQ MinimumExcessPower: 50 MaximumExcessPower: 290 ExcessPowerIncrement: 30 @@ -837,11 +1098,21 @@ Player: NavalProductionTypes: spen,syrd,spen.nod,syrd.gdi SiloTypes: silo,silo.td,silo.scrin AntiAirTypes: sam, nsam, agun, cram, shar + DefenseTypes: pbox, hbox, htur, gun, gun.td, gtwr, atwr, ptur, scol, obli, ltur, stwr, tsla, ftur, ttur, pris, sam, nsam, agun, cram, shar MaxBaseRadius: 23 + BuildingIntervals: + proc: 2250 + proc.td: 2250 + proc.scrin: 2250 + weap: 2250 + weap.td: 2250 + airs: 2250 + wsph: 2250 BuildingDelays: kenn: 2800 dome: 4500 hq: 4500 + hq.upg: 4500 nerv: 4500 syrd: 6000 spen: 6000 @@ -853,20 +1124,23 @@ Player: hpad: 6375 hpad.td: 6375 atek: 6375 + alhq: 6375 gtek: 6375 stek: 6375 tmpl: 6375 scrt: 6375 tmpp: 8000 upgc: 8000 + cvat: 8000 indp: 8000 + munp: 8000 orep: 8000 sign: 8000 mslo: 8000 mslo.nod: 8000 weat: 8000 eye: 8000 - rift: 8000 + rfgn: 8000 BuildingLimits: barr: 5 tent: 5 @@ -876,6 +1150,7 @@ Player: kenn: 1 dome: 1 hq: 1 + hq.upg: 1 nerv: 1 weap: 4 weap.td: 4 @@ -883,10 +1158,11 @@ Player: wsph: 4 hpad: 5 hpad.td: 5 - afld: 2 - afld.gdi: 2 + afld: 5 + afld.gdi: 5 grav: 5 atek: 1 + alhq: 1 stek: 1 gtek: 1 tmpl: 1 @@ -894,6 +1170,7 @@ Player: fix: 1 rep: 1 srep: 1 + npwr: 1 spen: 2 syrd: 2 spen.nod: 2 @@ -902,16 +1179,16 @@ Player: proc: 30 proc.td: 30 proc.scrin: 30 - hand: 5 - pyle: 5 - barr: 5 - tent: 5 - port: 5 + hand: 15 + pyle: 15 + barr: 15 + tent: 15 + port: 15 kenn: 1 - weap: 5 - weap.td: 5 - airs: 5 - wsph: 5 + weap: 10 + weap.td: 10 + airs: 10 + wsph: 10 pbox: 7 hbox: 7 gtwr: 7 @@ -935,6 +1212,7 @@ Player: shar: 7 gap: 1 atek: 1 + alhq: 1 stek: 1 silo: 1 silo.td: 1 @@ -947,44 +1225,54 @@ Player: rep: 1 srep: 1 hq: 10 + hq.upg: 10 nerv: 10 - afld: 3 - afld.gdi: 3 + afld: 10 + afld.gdi: 10 grav: 4 mslo: 1 iron: 1 pdox: 1 sgen: 1 + sgen.shadow: 1 mani: 1 eye: 1 weat: 1 mslo.nod: 1 - rift: 1 + rfgn: 1 + npwr: 1 + cvat: 1 indp: 1 + munp: 1 tmpp: 1 upgc: 1 - upgc.bomb: 1 - upgc.seek: 1 - upgc.hold: 1 upgc.drop: 1 orep: 1 sign: 1 patr: 1 - hpad: 4 - hpad.td: 4 + hpad: 10 + hpad.td: 10 spen: 1 syrd: 1 spen.nod: 1 syrd.gdi: 1 bombard.strat: 1 bombard2.strat: 1 + bombard3.strat: 1 seek.strat: 1 seek2.strat: 1 + seek3.strat: 1 hold.strat: 1 hold2.strat: 1 + hold3.strat: 1 sonic.upgrade: 1 - drone.upgrade: 1 - pointlaser.upgrade: 1 + mdrone.upgrade: 1 + bdrone.upgrade: 1 + abur.upgrade: 1 + bjet.upgrade: 1 + thwk.upgrade: 1 + tow.upgrade: 1 + pointdef.upgrade: 1 hypersonic.upgrade: 1 hailstorm.upgrade: 1 hammerhead.upgrade: 1 @@ -992,32 +1280,81 @@ Player: hovermam.upgrade: 1 ionmam.upgrade: 1 vulcan.upgrade: 1 + delp.upgrade: 1 empgren.upgrade: 1 + avenger.upgrade: 1 + sidewinders.upgrade: 1 + ceramic.upgrade: 1 hazmat.upgrade: 1 + hazmatsoviet.upgrade: 1 howi.upgrade: 1 microwave.upgrade: 1 + blacknapalm.upgrade: 1 + quantum.upgrade: 1 tibcore.upgrade: 1 - cyborg.upgrade: 1 + lastnk.upgrade: 1 + rahstealth.upgrade: 1 + sharv.upgrade: 1 + hstk.upgrade: 1 + cust.upgrade: 1 + rbug.upgrade: 1 + cyborgdmg.upgrade: 1 + cyborgprod.upgrade: 1 cyborgspeed.upgrade: 1 cyborgarmor.upgrade: 1 seismic.upgrade: 1 tarc.upgrade: 1 - indp.upgrade: 1 - iraqtank.upgrade: 1 - v2.upgrade: 1 - orep.upgrade: 1 + ttrp.upgrade: 1 + deso.upgrade: 1 + atomicengines.upgrade: 1 + erad.upgrade: 1 + lasher.upgrade: 1 + gattling.upgrade: 1 charv.upgrade: 1 pcan.upgrade: 1 - cryr.upgrade: 1 + airborne.upgrade: 1 + cryw.upgrade: 1 apb.upgrade: 1 + sweden.coalition: 1 + korea.coalition: 1 + greece.coalition: 1 + economy.policy: 1 + defense.policy: 1 + development.policy: 1 + flakarmor.upgrade: 1 + carapace.upgrade: 1 advart.upgrade: 1 + shrw.upgrade: 1 + loyalist.allegiance: 1 + rebel.allegiance: 1 + malefic.allegiance: 1 + evis.upgrade: 1 + impl.upgrade: 1 + stlk.upgrade: 1 + stellar.upgrade: 1 + coalescence.upgrade: 1 resconv.upgrade: 1 ioncon.upgrade: 1 regen.upgrade: 1 shields.upgrade: 1 + infantry.doctrine: 1 + armor.doctrine: 1 + arty.doctrine: 1 + imppara.upgrade: 1 + impstorm.upgrade: 1 + impmuta.upgrade: 1 + reactive.upgrade: 1 + rocketpods.upgrade: 1 + ovld.upgrade: 1 + apoc.upgrade: 1 + nukc.upgrade: 1 + wrath.covenant: 1 + unity.covenant: 1 + zeal.covenant: 1 BaseBuilderBotModuleCA@normal: RequiresCondition: enable-normal-ai - BuildingQueues: Building, Upgrade + BuildingQueues: BuildingSQ, BuildingMQ, Upgrade + DefenseQueues: DefenseSQ, DefenseMQ MinimumExcessPower: 50 MaximumExcessPower: 200 ExcessPowerIncrement: 40 @@ -1032,10 +1369,20 @@ Player: NavalProductionTypes: spen,syrd,spen.nod,syrd.gdi SiloTypes: silo,silo.td,silo.scrin AntiAirTypes: sam, nsam, agun, cram, shar + DefenseTypes: pbox, hbox, htur, gun, gun.td, gtwr, atwr, ptur, scol, obli, ltur, stwr, tsla, ftur, ttur, pris, sam, nsam, agun, cram, shar + BuildingIntervals: + proc: 2250 + proc.td: 2250 + proc.scrin: 2250 + weap: 2250 + weap.td: 2250 + airs: 2250 + wsph: 2250 BuildingDelays: kenn: 2800 dome: 4500 hq: 4500 + hq.upg: 4500 nerv: 4500 syrd: 6000 spen: 6000 @@ -1047,20 +1394,23 @@ Player: hpad: 6375 hpad.td: 6375 atek: 6375 + alhq: 6375 gtek: 6375 stek: 6375 tmpl: 6375 scrt: 6375 tmpp: 8000 upgc: 8000 + cvat: 8000 indp: 8000 + munp: 8000 orep: 8000 sign: 8000 mslo: 8000 mslo.nod: 8000 weat: 8000 eye: 8000 - rift: 8000 + rfgn: 8000 BuildingLimits: barr: 5 tent: 5 @@ -1070,6 +1420,7 @@ Player: kenn: 1 dome: 1 hq: 1 + hq.upg: 1 nerv: 1 weap: 4 weap.td: 4 @@ -1077,10 +1428,11 @@ Player: wsph: 4 hpad: 5 hpad.td: 5 - afld: 2 - afld.gdi: 2 + afld: 5 + afld.gdi: 5 grav: 5 atek: 1 + alhq: 1 stek: 1 gtek: 1 tmpl: 1 @@ -1088,6 +1440,7 @@ Player: fix: 1 rep: 1 srep: 1 + npwr: 1 spen: 2 syrd: 2 spen.nod: 2 @@ -1096,16 +1449,16 @@ Player: proc: 30 proc.td: 30 proc.scrin: 30 - hand: 5 - pyle: 5 - barr: 5 - tent: 5 - port: 5 + hand: 15 + pyle: 15 + barr: 15 + tent: 15 + port: 15 kenn: 1 - weap: 5 - weap.td: 5 - airs: 5 - wsph: 5 + weap: 10 + weap.td: 10 + airs: 10 + wsph: 10 pbox: 7 hbox: 7 gtwr: 7 @@ -1129,6 +1482,7 @@ Player: shar: 5 gap: 1 atek: 1 + alhq: 1 stek: 1 silo: 1 silo.td: 1 @@ -1141,44 +1495,54 @@ Player: rep: 1 srep: 1 hq: 10 + hq.upg: 10 nerv: 10 - afld: 3 - afld.gdi: 3 + afld: 10 + afld.gdi: 10 grav: 4 mslo: 1 iron: 1 pdox: 1 sgen: 1 + sgen.shadow: 1 mani: 1 eye: 1 weat: 1 mslo.nod: 1 - rift: 1 + rfgn: 1 + npwr: 1 + cvat: 1 indp: 1 + munp: 1 tmpp: 1 upgc: 1 - upgc.bomb: 1 - upgc.seek: 1 - upgc.hold: 1 upgc.drop: 1 orep: 1 sign: 1 patr: 1 - hpad: 4 - hpad.td: 4 + hpad: 10 + hpad.td: 10 spen: 1 syrd: 1 spen.nod: 1 syrd.gdi: 1 bombard.strat: 1 bombard2.strat: 1 + bombard3.strat: 1 seek.strat: 1 seek2.strat: 1 + seek3.strat: 1 hold.strat: 1 hold2.strat: 1 + hold3.strat: 1 sonic.upgrade: 1 - drone.upgrade: 1 - pointlaser.upgrade: 1 + mdrone.upgrade: 1 + bdrone.upgrade: 1 + abur.upgrade: 1 + bjet.upgrade: 1 + thwk.upgrade: 1 + tow.upgrade: 1 + pointdef.upgrade: 1 hypersonic.upgrade: 1 hailstorm.upgrade: 1 hammerhead.upgrade: 1 @@ -1186,32 +1550,81 @@ Player: hovermam.upgrade: 1 ionmam.upgrade: 1 vulcan.upgrade: 1 + delp.upgrade: 1 empgren.upgrade: 1 + avenger.upgrade: 1 + sidewinders.upgrade: 1 + ceramic.upgrade: 1 hazmat.upgrade: 1 + hazmatsoviet.upgrade: 1 howi.upgrade: 1 microwave.upgrade: 1 + blacknapalm.upgrade: 1 + quantum.upgrade: 1 tibcore.upgrade: 1 - cyborg.upgrade: 1 + lastnk.upgrade: 1 + rahstealth.upgrade: 1 + sharv.upgrade: 1 + hstk.upgrade: 1 + cust.upgrade: 1 + rbug.upgrade: 1 + cyborgdmg.upgrade: 1 + cyborgprod.upgrade: 1 cyborgspeed.upgrade: 1 cyborgarmor.upgrade: 1 seismic.upgrade: 1 tarc.upgrade: 1 - indp.upgrade: 1 - iraqtank.upgrade: 1 - v2.upgrade: 1 - orep.upgrade: 1 + ttrp.upgrade: 1 + deso.upgrade: 1 + atomicengines.upgrade: 1 + erad.upgrade: 1 + lasher.upgrade: 1 + gattling.upgrade: 1 charv.upgrade: 1 pcan.upgrade: 1 - cryr.upgrade: 1 + airborne.upgrade: 1 + cryw.upgrade: 1 apb.upgrade: 1 + sweden.coalition: 1 + korea.coalition: 1 + greece.coalition: 1 + economy.policy: 1 + defense.policy: 1 + development.policy: 1 + flakarmor.upgrade: 1 + carapace.upgrade: 1 advart.upgrade: 1 + shrw.upgrade: 1 + loyalist.allegiance: 1 + rebel.allegiance: 1 + malefic.allegiance: 1 + evis.upgrade: 1 + impl.upgrade: 1 + stlk.upgrade: 1 + stellar.upgrade: 1 + coalescence.upgrade: 1 resconv.upgrade: 1 ioncon.upgrade: 1 regen.upgrade: 1 shields.upgrade: 1 + infantry.doctrine: 1 + armor.doctrine: 1 + arty.doctrine: 1 + imppara.upgrade: 1 + impstorm.upgrade: 1 + impmuta.upgrade: 1 + reactive.upgrade: 1 + rocketpods.upgrade: 1 + ovld.upgrade: 1 + apoc.upgrade: 1 + nukc.upgrade: 1 + wrath.covenant: 1 + unity.covenant: 1 + zeal.covenant: 1 BaseBuilderBotModuleCA@easy: RequiresCondition: enable-easy-ai - BuildingQueues: Building, Upgrade + BuildingQueues: BuildingSQ, BuildingMQ, Upgrade + DefenseQueues: DefenseSQ, DefenseMQ MinimumExcessPower: 50 MaximumExcessPower: 200 ExcessPowerIncrement: 50 @@ -1226,10 +1639,20 @@ Player: NavalProductionTypes: spen,syrd,spen.nod,syrd.gdi SiloTypes: silo,silo.td,silo.scrin AntiAirTypes: sam, nsam, agun, cram, shar + DefenseTypes: pbox, hbox, htur, gun, gun.td, gtwr, atwr, ptur, scol, obli, ltur, stwr, tsla, ftur, ttur, pris, sam, nsam, agun, cram, shar + BuildingIntervals: + proc: 2250 + proc.td: 2250 + proc.scrin: 2250 + weap: 2250 + weap.td: 2250 + airs: 2250 + wsph: 2250 BuildingDelays: kenn: 2800 dome: 4500 hq: 4500 + hq.upg: 4500 nerv: 4500 syrd: 6000 spen: 6000 @@ -1241,20 +1664,23 @@ Player: hpad: 6375 hpad.td: 6375 atek: 6375 + alhq: 6375 gtek: 6375 stek: 6375 tmpl: 6375 scrt: 6375 tmpp: 8000 upgc: 8000 + cvat: 8000 indp: 8000 + munp: 8000 orep: 8000 sign: 8000 mslo: 8000 mslo.nod: 8000 weat: 8000 eye: 8000 - rift: 8000 + rfgn: 8000 BuildingLimits: barr: 5 tent: 5 @@ -1264,6 +1690,7 @@ Player: kenn: 1 dome: 1 hq: 1 + hq.upg: 10 nerv: 1 weap: 4 weap.td: 4 @@ -1271,10 +1698,11 @@ Player: wsph: 4 hpad: 5 hpad.td: 5 - afld: 2 - afld.gdi: 2 + afld: 5 + afld.gdi: 5 grav: 5 atek: 1 + alhq: 1 stek: 1 gtek: 1 tmpl: 1 @@ -1282,6 +1710,7 @@ Player: fix: 1 rep: 1 srep: 1 + npwr: 1 spen: 2 syrd: 2 spen.nod: 2 @@ -1323,6 +1752,7 @@ Player: shar: 3 gap: 1 atek: 1 + alhq: 1 stek: 1 silo: 1 silo.td: 1 @@ -1335,44 +1765,54 @@ Player: rep: 1 srep: 1 hq: 10 + hq.upg: 10 nerv: 1 - afld: 2 - afld.gdi: 2 + afld: 10 + afld.gdi: 10 grav: 3 mslo: 1 iron: 1 pdox: 1 sgen: 1 + sgen.shadow: 1 mani: 1 eye: 1 weat: 1 mslo.nod: 1 - rift: 1 + rfgn: 1 + npwr: 1 + cvat: 1 indp: 1 + munp: 1 tmpp: 1 upgc: 1 - upgc.bomb: 1 - upgc.seek: 1 - upgc.hold: 1 upgc.drop: 1 orep: 1 sign: 1 patr: 1 - hpad: 3 - hpad.td: 3 + hpad: 10 + hpad.td: 10 spen: 1 syrd: 1 spen.nod: 1 syrd.gdi: 1 bombard.strat: 1 bombard2.strat: 1 + bombard3.strat: 1 seek.strat: 1 seek2.strat: 1 + seek3.strat: 1 hold.strat: 1 hold2.strat: 1 + hold3.strat: 1 sonic.upgrade: 1 - drone.upgrade: 1 - pointlaser.upgrade: 1 + mdrone.upgrade: 1 + bdrone.upgrade: 1 + abur.upgrade: 1 + bjet.upgrade: 1 + thwk.upgrade: 1 + tow.upgrade: 1 + pointdef.upgrade: 1 hypersonic.upgrade: 1 hailstorm.upgrade: 1 hammerhead.upgrade: 1 @@ -1380,32 +1820,81 @@ Player: hovermam.upgrade: 1 ionmam.upgrade: 1 vulcan.upgrade: 1 + delp.upgrade: 1 empgren.upgrade: 1 + avenger.upgrade: 1 + sidewinders.upgrade: 1 + ceramic.upgrade: 1 hazmat.upgrade: 1 + hazmatsoviet.upgrade: 1 howi.upgrade: 1 microwave.upgrade: 1 + blacknapalm.upgrade: 1 + quantum.upgrade: 1 tibcore.upgrade: 1 - cyborg.upgrade: 1 + lastnk.upgrade: 1 + rahstealth.upgrade: 1 + sharv.upgrade: 1 + hstk.upgrade: 1 + cust.upgrade: 1 + rbug.upgrade: 1 + cyborgdmg.upgrade: 1 + cyborgprod.upgrade: 1 cyborgspeed.upgrade: 1 cyborgarmor.upgrade: 1 seismic.upgrade: 1 tarc.upgrade: 1 - indp.upgrade: 1 - iraqtank.upgrade: 1 - v2.upgrade: 1 - orep.upgrade: 1 + ttrp.upgrade: 1 + deso.upgrade: 1 + atomicengines.upgrade: 1 + erad.upgrade: 1 + lasher.upgrade: 1 + gattling.upgrade: 1 charv.upgrade: 1 pcan.upgrade: 1 - cryr.upgrade: 1 + airborne.upgrade: 1 + cryw.upgrade: 1 apb.upgrade: 1 + sweden.coalition: 1 + korea.coalition: 1 + greece.coalition: 1 + economy.policy: 1 + defense.policy: 1 + development.policy: 1 + flakarmor.upgrade: 1 + carapace.upgrade: 1 advart.upgrade: 1 + shrw.upgrade: 1 + loyalist.allegiance: 1 + rebel.allegiance: 1 + malefic.allegiance: 1 + evis.upgrade: 1 + impl.upgrade: 1 + stlk.upgrade: 1 + stellar.upgrade: 1 + coalescence.upgrade: 1 resconv.upgrade: 1 ioncon.upgrade: 1 regen.upgrade: 1 shields.upgrade: 1 + infantry.doctrine: 1 + armor.doctrine: 1 + arty.doctrine: 1 + imppara.upgrade: 1 + impstorm.upgrade: 1 + impmuta.upgrade: 1 + reactive.upgrade: 1 + rocketpods.upgrade: 1 + ovld.upgrade: 1 + apoc.upgrade: 1 + nukc.upgrade: 1 + wrath.covenant: 1 + unity.covenant: 1 + zeal.covenant: 1 BaseBuilderBotModuleCA@naval: RequiresCondition: enable-naval-ai - BuildingQueues: Building, Upgrade + BuildingQueues: BuildingSQ, BuildingMQ, Upgrade + DefenseQueues: DefenseSQ, DefenseMQ MinimumExcessPower: 50 MaximumExcessPower: 300 ExcessPowerIncrement: 20 @@ -1420,6 +1909,15 @@ Player: NavalProductionTypes: spen,syrd,spen.nod,syrd.gdi SiloTypes: silo,silo.td,silo.scrin AntiAirTypes: sam, nsam, agun, cram, shar + DefenseTypes: pbox, hbox, htur, gun, gun.td, gtwr, atwr, ptur, scol, obli, ltur, stwr, tsla, ftur, ttur, pris, sam, nsam, agun, cram, shar + BuildingIntervals: + proc: 2250 + proc.td: 2250 + proc.scrin: 2250 + weap: 2250 + weap.td: 2250 + airs: 2250 + wsph: 2250 BuildingLimits: barr: 5 tent: 5 @@ -1429,6 +1927,7 @@ Player: kenn: 1 dome: 1 hq: 1 + hq.upg: 1 nerv: 1 weap: 3 weap.td: 3 @@ -1436,10 +1935,11 @@ Player: wsph: 3 hpad: 5 hpad.td: 5 - afld: 3 - afld.gdi: 3 + afld: 5 + afld.gdi: 5 grav: 3 atek: 1 + alhq: 1 stek: 1 gtek: 1 tmpl: 1 @@ -1447,6 +1947,7 @@ Player: fix: 1 rep: 1 srep: 1 + npwr: 1 spen: 2 syrd: 2 spen.nod: 2 @@ -1455,16 +1956,16 @@ Player: proc: 30 proc.td: 30 proc.scrin: 30 - hand: 2 - pyle: 2 - barr: 2 - tent: 2 - port: 2 + hand: 5 + pyle: 5 + barr: 5 + tent: 5 + port: 5 kenn: 1 - weap: 3 - weap.td: 3 - airs: 3 - wsph: 3 + weap: 5 + weap.td: 5 + airs: 5 + wsph: 5 pbox: 7 hbox: 7 gtwr: 7 @@ -1488,6 +1989,7 @@ Player: shar: 3 gap: 1 atek: 1 + alhq: 1 stek: 1 fix: 1 dome: 10 @@ -1497,44 +1999,54 @@ Player: rep: 1 srep: 1 hq: 10 + hq.upg: 10 nerv: 10 - afld: 3 - afld.gdi: 3 + afld: 10 + afld.gdi: 10 grav: 3 mslo: 1 iron: 1 pdox: 1 sgen: 1 + sgen.shadow: 1 mani: 1 + npwr: 1 + cvat: 1 indp: 1 + munp: 1 tmpp: 1 upgc: 1 - upgc.bomb: 1 - upgc.seek: 1 - upgc.hold: 1 upgc.drop: 1 orep: 1 sign: 1 patr: 1 weat: 1 mslo.nod: 1 - rift: 1 + rfgn: 1 eye: 1 - hpad: 3 - hpad.td: 3 + hpad: 10 + hpad.td: 10 spen: 1 syrd: 1 spen.nod: 1 syrd.gdi: 1 bombard.strat: 1 bombard2.strat: 1 + bombard3.strat: 1 seek.strat: 1 seek2.strat: 1 + seek3.strat: 1 hold.strat: 1 hold2.strat: 1 + hold3.strat: 1 sonic.upgrade: 1 - drone.upgrade: 1 - pointlaser.upgrade: 1 + mdrone.upgrade: 1 + bdrone.upgrade: 1 + abur.upgrade: 1 + bjet.upgrade: 1 + thwk.upgrade: 1 + tow.upgrade: 1 + pointdef.upgrade: 1 hypersonic.upgrade: 1 hailstorm.upgrade: 1 hammerhead.upgrade: 1 @@ -1542,398 +2054,330 @@ Player: hovermam.upgrade: 1 ionmam.upgrade: 1 vulcan.upgrade: 1 + delp.upgrade: 1 empgren.upgrade: 1 + avenger.upgrade: 1 + sidewinders.upgrade: 1 + ceramic.upgrade: 1 hazmat.upgrade: 1 + hazmatsoviet.upgrade: 1 howi.upgrade: 1 microwave.upgrade: 1 + blacknapalm.upgrade: 1 + quantum.upgrade: 1 tibcore.upgrade: 1 - cyborg.upgrade: 1 + lastnk.upgrade: 1 + rahstealth.upgrade: 1 + sharv.upgrade: 1 + hstk.upgrade: 1 + cust.upgrade: 1 + rbug.upgrade: 1 + cyborgdmg.upgrade: 1 + cyborgprod.upgrade: 1 cyborgspeed.upgrade: 1 cyborgarmor.upgrade: 1 seismic.upgrade: 1 tarc.upgrade: 1 - indp.upgrade: 1 - iraqtank.upgrade: 1 - v2.upgrade: 1 - orep.upgrade: 1 + ttrp.upgrade: 1 + deso.upgrade: 1 + atomicengines.upgrade: 1 + erad.upgrade: 1 + lasher.upgrade: 1 + gattling.upgrade: 1 charv.upgrade: 1 pcan.upgrade: 1 - cryr.upgrade: 1 + airborne.upgrade: 1 + cryw.upgrade: 1 apb.upgrade: 1 + sweden.coalition: 1 + korea.coalition: 1 + greece.coalition: 1 + economy.policy: 1 + defense.policy: 1 + development.policy: 1 + flakarmor.upgrade: 1 + carapace.upgrade: 1 advart.upgrade: 1 + shrw.upgrade: 1 + loyalist.allegiance: 1 + rebel.allegiance: 1 + malefic.allegiance: 1 + evis.upgrade: 1 + impl.upgrade: 1 + stlk.upgrade: 1 + stellar.upgrade: 1 + coalescence.upgrade: 1 resconv.upgrade: 1 ioncon.upgrade: 1 regen.upgrade: 1 shields.upgrade: 1 + infantry.doctrine: 1 + armor.doctrine: 1 + arty.doctrine: 1 + imppara.upgrade: 1 + impstorm.upgrade: 1 + impmuta.upgrade: 1 + reactive.upgrade: 1 + rocketpods.upgrade: 1 + ovld.upgrade: 1 + apoc.upgrade: 1 + nukc.upgrade: 1 + wrath.covenant: 1 + unity.covenant: 1 + zeal.covenant: 1 SquadManagerBotModuleCA@brutal-vhard: RequiresCondition: enable-brutal-ai || enable-vhard-ai - SquadSize: 30 - ExcludeFromSquadsTypes: harv, harv.td, harv.scrin, harv.chrono, mcv, amcv, smcv, dog, e6, n6, s6 - ExcludeFromAirSquadsTypes: deva, pac, jjet + MinimumAttackForceDelay: 25 + SquadValue: 7000 + SquadValueMaxEarlyBonus: 3000 + SquadValueMinLateBonus: 5000 + SquadValueMaxLateBonus: 13000 + AirUnitsTypes: heli, harr, pmak, beag, hind, yak, mig, suk, suk.upg, kiro, orca, a10, a10.sw, a10.gau, orcb, auro, jack, apch, venm, rah, scrn, stmr, torm, enrv, mshp, phan, kamv, shde, vert, mcor + ExcludeFromSquadsTypes: harv, harv.td, harv.td.upg, harv.scrin, harv.chrono, mcv, amcv, smcv, dog, e6, n6, s6, badr, badr.bomber, badr.cbomber, badr.nbomber, badr.mbomber, b2b, p51, tran.paradrop, halo.paradrop, nhaw.paradrop, u2, smig, a10.bomber, c17, c17.cargo, c17.clustermines, c17.xo, galx, uav, ocar.reinforce, ocar.xo, ocar.pod, horn, yf23.bomber, pod, pod2, pod3, buzz, buzz.ai, mspk NavalUnitsTypes: ss,msub,dd,ca,lst,pt,dd2,pt2,ss2,isub,sb,seas NavalProductionTypes: syrd, spen, syrd.gdi, spen.nod + HarasserTypes: 1tnk, rtnk, bike, gdrn, gdrn.tow, hmmv.tow, stnk.nod, hstk, spec, lace, seek, pbul, n2, e2, ivan, n4, n5, e4 ConstructionYardTypes: fact,afac,sfac + StaticAntiAirTypes: agun, sam, nsam, cram, shar IdleScanRadius: 18 AttackScanRadius: 9 MaxBaseRadius: 16 - RushAttackScanRadius: 25 ProtectUnitScanRadius: 28 ProtectionScanRadius: 16 - DangerScanRadius: 8 - AirSquadTargetTypes: - mshp: Structure + HighValueTargetTypes: fact, afac, sfac, proc, proc.td, proc.scrin, atek, stek, gtek, tmpl, scrt, harv, harv.td, harv.td.upg, harv.scrin, harv.chrono + HighValueTargetPriority: 30 + IgnoredEnemyTargetTypes: Wall + IndirectRouteChance: 50 + AirToAirPriority: 60 + BigAirThreats: pac, deva, kiro, mshp + AirSquadTargetArmorTypes: + heli: Aircraft, Heavy + nhaw: None + hind: None, Heavy, Light + yak: Wood, None, Aircraft, Light + mig: Aircraft, Heavy, Light, Concrete + pmak: Heavy, Concrete + beag: Aircraft, Heavy, Light, Concrete + suk: Heavy, Concrete + suk.upg: Heavy, Wood + kiro: Wood + orca: Aircraft, Heavy + orcb: Heavy, Light, Concrete + a10: None, Wood + a10.sw: None, Wood, Aircraft + a10.gau: None, Wood, Light + auro: Heavy, Concrete, Wood + jack: Heavy, Light, Concrete + apch: None, Wood, Aircraft, Light + venm: None, Aircraft, Light + rah: None, Wood, Light + harr: None, Wood, Aircraft, Light + scrn: Aircraft, Heavy, Concrete + stmr: Aircraft, None, Wood, Light + torm: Aircraft, Heavy + enrv: Aircraft, Heavy, Concrete + mshp: Wood UnitBuilderBotModuleCA@brutal-vhard: RequiresCondition: enable-brutal-ai || enable-vhard-ai - IdleBaseUnitsMaximum: 50 - UnitBuilderMinCredits: 1800 - MaxAircraft: 8 - UnitDelays: - mcv: 6750 - amcv: 6750 - smcv: 6750 - UnitsToBuild: - e1: 65 - e2: 25 - e3: 40 - e4: 15 - e6: 5 - n1: 65 - n2: 25 - n3: 40 - n4: 15 - n5: 15 - n6: 5 - n1c: 65 - n3c: 40 - s1: 65 - s2: 40 - s3: 40 - s4: 15 - s6: 5 - rmbc: 15 - mort: 15 - medi: 3 - mech: 3 - dog: 2 - sab: 2 - shok: 15 - e8: 15 - snip: 15 - jjet: 15 - acol: 15 - acol.upg: 15 - bh: 15 - ivan: 15 - rmbo: 15 - e7: 15 - bori: 15 - mast: 15 - apc.ai: 20 - intl.ai: 10 - jeep: 30 - apc2.nodai: 20 - apc2.gdiai: 20 - vulc.ai: 10 - hmmv: 30 - btr.ai: 20 - gunw: 20 - bggy: 30 - arty: 20 - howi: 20 - ptnk: 20 - pcan: 20 - v2rl: 20 - katy: 20 - msam: 25 - mlrs: 20 - spec: 20 - hsam: 25 - ruin: 20 - atmz: 20 - 1tnk: 70 - ifv.ai: 70 - 2tnk: 45 - tnkd: 45 - rtnk: 45 - 3tnk: 70 - 3tnk.iraq: 70 - 4tnk: 40 - 4tnk.iraq: 40 - apoc: 30 - apoc.iraq: 30 - tpod: 40 - rptp: 40 - ltnk: 40 - mtnk: 70 - mtnk.drone: 70 - seek: 40 - lace: 40 - devo: 45 - dark: 45 - bike: 30 - htnk: 40 - htnk.ion: 40 - htnk.hover: 40 - v3rl: 3 - titn: 40 - titn.rail: 40 - jugg: 10 - cryo: 10 - cdrn: 3 - ctnk: 3 - chpr: 3 - batf.ai: 10 - wtnk: 3 - ttnk: 25 - ttra: 25 - isu: 20 - stnk.nod: 15 - ftnk: 15 - hftk: 15 - corr: 15 - lchr: 15 - stcr: 25 - hind: 5 - heli: 5 - apch: 5 - venm: 5 - orca: 5 - orcb: 3 - scrn: 5 - rah: 3 - mig: 3 - suk: 3 - harr: 3 - yak: 2 - disr: 10 - kiro: 2 - a10: 5 - auro: 5 - ss: 1 - msub: 1 - dd: 1 - ca: 1 - carr: 1 - pt: 1 - pt2: 1 - dd2: 1 - ss2: 2 - isub: 1 - sb: 1 - seas: 1 - stmr: 5 - enrv: 3 - deva: 3 - pac: 3 - mshp: 1 + IdleBaseUnitsMaximum: 150 + MaxAircraft: 3 + MaintainAirSuperiority: true + AirToAirUnits: heli, yak, mig, orca, apch, scrn, venm, stmr, torm, enrv, a10.sw, a10.gau, harr, beag + AirThreatUnits: heli, harr, pmak, beag, hind, yak, mig, suk, suk.upg, kiro, orca, a10, a10.sw, a10.gau, orcb, auro, apch, venm, rah, scrn, stmr, enrv, mshp, phan, kamv, shde, vert, mcor + ProductionMinCashRequirement: 1800 + UnitIntervals: + mshp: 7500 + mcv: 3000 + amcv: 3000 + smcv: 3000 + harv: 2250 + harv.td: 2250 + harv.td.upg: 2250 + harv.scrin: 2250 + harv.chrono: 2250 + rmbo: 2250 + e7: 2250 + mast: 2250 + yuri: 2250 + bori: 2250 + u3.squad: 3750 + gtnk.squad: 3750 UnitLimits: + e2: 5 + n2: 8 + e4: 5 + n4: 5 dog: 2 - sab: 2 + cmsr: 1 + mgg: 1 + mrj: 1 cdrn: 1 - apc: 2 - apc2: 2 - intl: 3 - vulc: 2 + nhaw: 1 + apc.ai: 2 + apc2.nodai: 2 + apc2.gdiai: 2 + delp.ai: 2 + vulc.ai: 5 + btr.ai: 5 + btr.yuri.ai: 5 hmmv: 2 bggy: 2 + rbug: 2 jeep: 2 + sapc.ai: 1 + sapc.ai2: 1 e6: 1 n6: 1 s6: 1 - mech: 1 - medi: 1 + u3.squad: 2 + seal: 5 + mech: 3 + medi: 3 msub: 4 ca: 4 isub: 4 - carr: 4 + cv: 4 jjet: 8 - kiro: 3 - deva: 3 - pac: 3 + bjet: 8 + v3rl: 4 + nukc: 4 + thwk: 4 + zeus: 4 + oblt: 4 + kiro: 4 + disc: 4 + deva: 4 + pac: 4 ss: 10 ss2: 10 sb: 10 seas: 10 harv: 8 harv.td: 8 + harv.td.upg: 8 harv.scrin: 8 harv.chrono: 8 SquadManagerBotModuleCA@hard: RequiresCondition: enable-hard-ai - SquadSize: 25 - ExcludeFromSquadsTypes: harv, harv.td, harv.scrin, harv.chrono, mcv, amcv, smcv, dog, e6, n6, s6 - ExcludeFromAirSquadsTypes: deva, pac, jjet + MinimumAttackForceDelay: 25 + SquadValue: 6000 + SquadValueMaxEarlyBonus: 2500 + SquadValueMinLateBonus: 4000 + SquadValueMaxLateBonus: 10000 + AirUnitsTypes: heli, harr, pmak, beag, hind, yak, mig, suk, suk.upg, kiro, orca, a10, a10.sw, a10.gau, orcb, auro, jack, apch, venm, rah, scrn, stmr, torm, enrv, mshp, phan, kamv, shde, vert, mcor + ExcludeFromSquadsTypes: harv, harv.td, harv.td.upg, harv.scrin, harv.chrono, mcv, amcv, smcv, dog, e6, n6, s6, badr, badr.bomber, badr.cbomber, badr.nbomber, badr.mbomber, b2b, p51, tran.paradrop, halo.paradrop, nhaw.paradrop, u2, smig, a10.bomber, c17, c17.cargo, c17.clustermines, c17.xo, galx, uav, ocar.reinforce, ocar.xo, ocar.pod, horn, yf23.bomber, pod, pod2, pod3, buzz, buzz.ai, mspk NavalUnitsTypes: ss,msub,dd,ca,lst,pt,dd2,pt2,ss2,isub,sb,seas NavalProductionTypes: syrd, spen, syrd.gdi, spen.nod + HarasserTypes: 1tnk, rtnk, bike, gdrn, gdrn.tow, hmmv.tow, stnk.nod, hstk, spec, lace, seek, pbul, n2, e2, ivan, n4, n5, e4 ConstructionYardTypes: fact,afac,sfac + StaticAntiAirTypes: agun, sam, nsam, cram, shar ProtectionScanRadius: 12 - AirSquadTargetTypes: - mshp: Structure + HighValueTargetTypes: fact, afac, sfac, proc, proc.td, proc.scrin, atek, stek, gtek, tmpl, scrt, harv, harv.td, harv.td.upg, harv.scrin, harv.chrono + HighValueTargetPriority: 15 + IgnoredEnemyTargetTypes: Wall + IndirectRouteChance: 40 + AirToAirPriority: 50 + BigAirThreats: pac, deva, kiro, mshp + AirSquadTargetArmorTypes: + heli: Aircraft, Heavy + nhaw: None + hind: None, Heavy, Light + yak: Wood, None, Aircraft, Light + mig: Aircraft, Heavy, Light, Concrete + pmak: Heavy, Concrete + beag: Aircraft, Heavy, Light, Concrete + suk: Heavy, Concrete + suk.upg: Heavy, Wood + kiro: Wood + orca: Aircraft, Heavy + orcb: Heavy, Light, Concrete + a10: None, Wood + a10.sw: None, Wood, Aircraft + a10.gau: None, Wood, Light + auro: Heavy, Concrete, Wood + jack: Heavy, Light, Concrete + apch: None, Wood, Aircraft, Light + venm: None, Aircraft, Light + rah: None, Wood, Light + harr: None, Wood, Aircraft, Light + scrn: Aircraft, Heavy, Concrete + stmr: Aircraft, None, Wood, Light + torm: Aircraft, Heavy + enrv: Aircraft, Heavy, Concrete + mshp: Wood UnitBuilderBotModuleCA@hard: RequiresCondition: enable-hard-ai - IdleBaseUnitsMaximum: 50 - MaxAircraft: 6 + IdleBaseUnitsMaximum: 150 + MaxAircraft: 2 + MaintainAirSuperiority: true + MaxAirSuperiority: 8 + AirToAirUnits: heli, yak, mig, orca, apch, scrn, venm, stmr, torm, enrv, a10.sw, a10.gau, harr, beag + AirThreatUnits: heli, harr, pmak, beag, hind, yak, mig, suk, suk.upg, kiro, orca, a10, a10.sw, a10.gau, orcb, auro, apch, venm, rah, scrn, stmr, enrv, mshp, phan, kamv, shde, vert, mcor UnitDelays: - mcv: 6750 - amcv: 6750 - smcv: 6750 - UnitsToBuild: - e1: 65 - e2: 25 - e3: 40 - e4: 15 - e6: 5 - n1: 65 - n2: 25 - n3: 40 - n4: 15 - n5: 15 - n6: 5 - n1c: 65 - n3c: 40 - s1: 65 - s2: 40 - s3: 40 - s4: 15 - s6: 5 - rmbc: 15 - mort: 15 - medi: 3 - mech: 3 - dog: 2 - sab: 2 - shok: 15 - e8: 15 - snip: 15 - jjet: 15 - acol: 15 - acol.upg: 15 - bh: 15 - ivan: 15 - rmbo: 15 - e7: 15 - bori: 15 - mast: 15 - apc.ai: 20 - intl.ai: 10 - jeep: 30 - apc2.nodai: 20 - apc2.gdiai: 20 - vulc.ai: 10 - hmmv: 30 - btr.ai: 20 - gunw: 20 - bggy: 30 - arty: 20 - howi: 20 - ptnk: 20 - pcan: 20 - v2rl: 20 - katy: 20 - msam: 25 - mlrs: 20 - spec: 20 - hsam: 25 - ruin: 20 - atmz: 20 - 1tnk: 70 - ifv.ai: 70 - 2tnk: 45 - tnkd: 45 - rtnk: 45 - 3tnk: 70 - 3tnk.iraq: 70 - 4tnk: 40 - 4tnk.iraq: 40 - apoc: 30 - apoc.iraq: 30 - tpod: 40 - rptp: 40 - ltnk: 40 - mtnk: 70 - mtnk.drone: 70 - seek: 40 - lace: 40 - devo: 45 - dark: 45 - bike: 30 - htnk: 40 - htnk.ion: 40 - htnk.hover: 40 - v3rl: 3 - titn: 40 - titn.rail: 40 - jugg: 10 - cryo: 10 - cdrn: 3 - ctnk: 3 - chpr: 3 - batf.ai: 10 - wtnk: 3 - ttnk: 25 - ttra: 25 - isu: 20 - stnk.nod: 15 - ftnk: 15 - hftk: 15 - corr: 15 - lchr: 15 - stcr: 25 - hind: 5 - heli: 5 - apch: 5 - venm: 5 - orca: 5 - orcb: 3 - scrn: 5 - rah: 3 - mig: 3 - suk: 3 - harr: 3 - yak: 2 - disr: 10 - kiro: 2 - a10: 5 - auro: 5 - ss: 1 - msub: 1 - dd: 1 - ca: 1 - carr: 1 - pt: 1 - pt2: 1 - dd2: 1 - ss2: 2 - isub: 1 - sb: 1 - seas: 1 - stmr: 5 - enrv: 3 - deva: 3 - pac: 3 - mshp: 1 + arty: 4500 + arty.nod: 4500 + katy: 4500 + UnitIntervals: + mshp: 7500 + mcv: 3750 + amcv: 3750 + smcv: 3750 + harv: 2250 + harv.td: 2250 + harv.td.upg: 2250 + harv.scrin: 2250 + harv.chrono: 2250 + rmbo: 3000 + e7: 3000 + mast: 3000 + yuri: 3000 + bori: 3000 + u3.squad: 4500 + gtnk.squad: 4500 UnitLimits: + e2: 5 + n2: 8 + e4: 5 + n4: 5 dog: 2 - sab: 2 + cmsr: 1 + mgg: 1 + mrj: 1 cdrn: 1 - apc: 2 - apc2: 2 - intl: 3 - vulc: 2 + nhaw: 1 + apc.ai: 2 + apc2.nodai: 2 + apc2.gdiai: 2 + delp.ai: 2 + vulc.ai: 5 + btr.ai: 5 + btr.yuri.ai: 5 hmmv: 2 bggy: 2 + rbug: 2 jeep: 2 + sapc.ai: 1 + sapc.ai2: 1 e6: 1 n6: 1 s6: 1 - mech: 1 - medi: 1 + u3.squad: 2 + seal: 5 + mech: 3 + medi: 3 msub: 4 ca: 4 isub: 4 - carr: 4 + cv: 4 jjet: 8 + bjet: 8 + v3rl: 3 + nukc: 3 + thwk: 3 + zeus: 3 + oblt: 3 kiro: 3 + disc: 3 deva: 3 pac: 3 ss: 10 @@ -1942,182 +2386,91 @@ Player: seas: 10 harv: 8 harv.td: 8 + harv.td.upg: 8 harv.scrin: 8 harv.chrono: 8 SquadManagerBotModuleCA@normal: RequiresCondition: enable-normal-ai - SquadSize: 20 - ExcludeFromSquadsTypes: harv, harv.td, harv.scrin, harv.chrono, mcv, amcv, smcv, dog, e6, n6, s6 - ExcludeFromAirSquadsTypes: deva, pac, jjet + MinimumAttackForceDelay: 25 + SquadValue: 5000 + SquadValueMaxEarlyBonus: 2000 + SquadValueMinLateBonus: 2000 + SquadValueMaxLateBonus: 7000 + AirUnitsTypes: heli, harr, pmak, beag, hind, yak, mig, suk, suk.upg, kiro, orca, a10, a10.sw, a10.gau, orcb, auro, jack, apch, venm, rah, scrn, stmr, torm, enrv, mshp, phan, kamv, shde, vert, mcor + ExcludeFromSquadsTypes: harv, harv.td, harv.td.upg, harv.scrin, harv.chrono, mcv, amcv, smcv, dog, e6, n6, s6, badr, badr.bomber, badr.cbomber, badr.nbomber, badr.mbomber, b2b, p51, tran.paradrop, halo.paradrop, nhaw.paradrop, u2, smig, a10.bomber, c17, c17.cargo, c17.clustermines, c17.xo, galx, uav, ocar.reinforce, ocar.xo, ocar.pod, horn, yf23.bomber, pod, pod2, pod3, buzz, buzz.ai, mspk NavalUnitsTypes: ss,msub,dd,ca,lst,pt,pt2,ss2,dd2,isub,sb,seas + HarasserTypes: 1tnk, rtnk, bike, gdrn, gdrn.tow, hmmv.tow, stnk.nod, hstk, spec, lace, seek, pbul, n2, e2, ivan, n4, n5, e4 ConstructionYardTypes: fact,afac,sfac + StaticAntiAirTypes: agun, sam, nsam, cram, shar NavalProductionTypes: spen,syrd,spen.nod,syrd.gdi - AirSquadTargetTypes: - mshp: Structure + IgnoredEnemyTargetTypes: Wall + IndirectRouteChance: 30 + AirToAirPriority: 40 + AirSquadTargetArmorTypes: + mshp: Wood UnitBuilderBotModuleCA@normal: RequiresCondition: enable-normal-ai - IdleBaseUnitsMaximum: 50 + IdleBaseUnitsMaximum: 150 MaxAircraft: 4 UnitDelays: - mcv: 6750 - amcv: 6750 - smcv: 6750 - UnitsToBuild: - e1: 65 - e2: 25 - e3: 40 - e4: 15 - e6: 5 - n1: 65 - n2: 25 - n3: 40 - n4: 15 - n5: 15 - n6: 5 - n1c: 65 - n3c: 40 - s1: 65 - s2: 40 - s3: 40 - s4: 15 - s6: 5 - rmbc: 15 - mort: 15 - medi: 3 - mech: 3 - dog: 2 - sab: 2 - shok: 15 - e8: 15 - snip: 15 - jjet: 15 - acol: 15 - acol.upg: 15 - bh: 15 - ivan: 15 - rmbo: 15 - e7: 15 - bori: 15 - mast: 15 - apc: 20 - intl: 10 - jeep: 30 - apc2: 20 - vulc: 10 - hmmv: 30 - btr: 20 - gunw: 20 - bggy: 30 - arty: 20 - howi: 20 - ptnk: 20 - pcan: 20 - v2rl: 20 - katy: 20 - msam: 25 - mlrs: 20 - spec: 20 - hsam: 25 - ruin: 20 - atmz: 20 - 1tnk: 70 - ifv.ai: 70 - 2tnk: 45 - tnkd: 45 - rtnk: 45 - 3tnk: 70 - 3tnk.iraq: 70 - 4tnk: 40 - 4tnk.iraq: 40 - apoc: 30 - apoc.iraq: 30 - tpod: 40 - rptp: 40 - ltnk: 40 - mtnk: 70 - mtnk.drone: 70 - seek: 40 - lace: 40 - devo: 45 - dark: 45 - bike: 30 - htnk: 40 - htnk.ion: 40 - htnk.hover: 40 - v3rl: 3 - titn: 40 - titn.rail: 40 - jugg: 10 - cryo: 10 - cdrn: 3 - ctnk: 3 - chpr: 3 - batf.ai: 10 - wtnk: 3 - ttnk: 25 - ttra: 25 - isu: 20 - stnk.nod: 15 - ftnk: 15 - hftk: 15 - corr: 15 - lchr: 15 - stcr: 25 - hind: 5 - heli: 5 - apch: 5 - venm: 5 - orca: 5 - orcb: 3 - scrn: 5 - rah: 3 - mig: 3 - suk: 3 - harr: 3 - yak: 2 - disr: 10 - kiro: 2 - a10: 5 - auro: 5 - ss: 1 - msub: 1 - dd: 1 - ca: 1 - carr: 1 - pt: 1 - pt2: 1 - dd2: 1 - ss2: 2 - isub: 1 - sb: 1 - seas: 1 - stmr: 5 - enrv: 3 - deva: 3 - pac: 3 - mshp: 1 + arty: 5250 + arty.nod: 5250 + katy: 5250 + UnitIntervals: + mshp: 7500 + harv: 2250 + harv.td: 2250 + harv.td.upg: 2250 + harv.scrin: 2250 + harv.chrono: 2250 + rmbo: 3750 + e7: 3750 + mast: 3750 + yuri: 3750 + bori: 3750 + u3.squad: 4500 + gtnk.squad: 4500 UnitLimits: + e2: 5 + n2: 8 + e4: 5 + n4: 5 dog: 2 - sab: 2 + cmsr: 1 + mgg: 1 + mrj: 1 cdrn: 1 + nhaw: 1 apc: 2 apc2: 2 - intl: 3 - vulc: 2 + delp: 2 + vulc: 5 hmmv: 2 bggy: 2 + rbug: 2 jeep: 2 + sapc: 1 + cust: 1 e6: 1 n6: 1 s6: 1 - mech: 1 - medi: 1 + u3.squad: 2 + seal: 5 + mech: 3 + medi: 3 msub: 4 ca: 4 isub: 4 - carr: 4 + cv: 4 jjet: 8 + bjet: 8 + v3rl: 2 + nukc: 2 + thwk: 2 + zeus: 2 + oblt: 2 kiro: 2 + disc: 2 deva: 2 pac: 2 ss: 10 @@ -2126,181 +2479,91 @@ Player: seas: 10 harv: 8 harv.td: 8 + harv.td.upg: 8 harv.scrin: 8 harv.chrono: 8 SquadManagerBotModuleCA@easy: RequiresCondition: enable-easy-ai - SquadSize: 15 - ExcludeFromSquadsTypes: harv, harv.td, harv.scrin, harv.chrono, mcv, amcv, smcv, dog, e6, n6, s6 - ExcludeFromAirSquadsTypes: deva, pac, jjet + SquadValue: 4000 + SquadValueMaxEarlyBonus: 1500 + SquadValueMinLateBonus: 2000 + SquadValueMaxLateBonus: 4000 + MinimumAttackForceDelay: 25 + AirUnitsTypes: heli, harr, pmak, beag, hind, yak, mig, suk, suk.upg, kiro, orca, a10, a10.sw, a10.gau, orcb, auro, jack, apch, venm, rah, scrn, stmr, torm, enrv, mshp, phan, kamv, shde, vert, mcor + ExcludeFromSquadsTypes: harv, harv.td, harv.td.upg, harv.scrin, harv.chrono, mcv, amcv, smcv, dog, e6, n6, s6, badr, badr.bomber, badr.cbomber, badr.nbomber, badr.mbomber, b2b, p51, tran.paradrop, halo.paradrop, nhaw.paradrop, u2, smig, a10.bomber, c17, c17.cargo, c17.clustermines, c17.xo, galx, uav, ocar.reinforce, ocar.xo, ocar.pod, horn, yf23.bomber, pod, pod2, pod3, buzz, buzz.ai, mspk NavalUnitsTypes: ss,msub,dd,ca,lst,pt,pt2,ss2,dd2,isub,sb,seas ConstructionYardTypes: fact,afac,sfac + StaticAntiAirTypes: agun, sam, nsam, cram, shar NavalProductionTypes: spen,syrd,spen.nod,syrd.gdi - AirSquadTargetTypes: - mshp: Structure + IgnoredEnemyTargetTypes: Wall + IndirectRouteChance: 20 + AirToAirPriority: 30 + AirSquadTargetArmorTypes: + mshp: Wood UnitBuilderBotModuleCA@easy: RequiresCondition: enable-easy-ai + IdleBaseUnitsMaximum: 150 MaxAircraft: 2 UnitDelays: - mcv: 6750 - amcv: 6750 - smcv: 6750 - UnitsToBuild: - e1: 65 - e2: 25 - e3: 40 - e4: 15 - e6: 5 - n1: 65 - n2: 25 - n3: 40 - n4: 15 - n5: 15 - n6: 5 - n1c: 65 - n3c: 40 - s1: 65 - s2: 40 - s3: 40 - s4: 15 - s6: 5 - rmbc: 15 - mort: 15 - medi: 3 - mech: 3 - dog: 2 - sab: 2 - shok: 15 - e8: 15 - snip: 15 - jjet: 15 - acol: 15 - acol.upg: 15 - bh: 15 - ivan: 15 - rmbo: 15 - e7: 15 - bori: 15 - mast: 15 - apc: 20 - intl: 10 - jeep: 30 - apc2: 20 - vulc: 10 - hmmv: 30 - btr: 20 - gunw: 20 - bggy: 30 - arty: 20 - howi: 20 - ptnk: 20 - pcan: 20 - v2rl: 20 - katy: 20 - msam: 25 - mlrs: 20 - spec: 20 - hsam: 25 - ruin: 20 - atmz: 20 - 1tnk: 70 - ifv.ai: 70 - 2tnk: 45 - tnkd: 45 - rtnk: 45 - 3tnk: 70 - 3tnk.iraq: 70 - 4tnk: 40 - 4tnk.iraq: 40 - apoc: 30 - apoc.iraq: 30 - tpod: 40 - rptp: 40 - ltnk: 40 - mtnk: 70 - mtnk.drone: 70 - seek: 40 - lace: 40 - devo: 45 - dark: 45 - bike: 30 - htnk: 40 - htnk.ion: 40 - htnk.hover: 40 - v3rl: 3 - titn: 40 - titn.rail: 40 - jugg: 10 - cryo: 10 - cdrn: 3 - ctnk: 3 - chpr: 3 - batf.ai: 10 - wtnk: 3 - ttnk: 25 - ttra: 25 - isu: 20 - stnk.nod: 15 - ftnk: 15 - hftk: 15 - corr: 15 - lchr: 15 - stcr: 25 - hind: 5 - heli: 5 - apch: 5 - venm: 5 - orca: 5 - orcb: 3 - scrn: 5 - rah: 3 - mig: 3 - suk: 3 - harr: 3 - yak: 2 - disr: 10 - kiro: 2 - a10: 5 - auro: 5 - ss: 1 - msub: 1 - dd: 1 - ca: 1 - carr: 1 - pt: 1 - pt2: 1 - dd2: 1 - ss2: 2 - isub: 1 - sb: 1 - seas: 1 - stmr: 5 - enrv: 3 - deva: 3 - pac: 3 - mshp: 1 + arty: 6750 + arty.nod: 6750 + katy: 6750 + msam: 6750 + UnitIntervals: + mshp: 7500 + harv: 2250 + harv.td: 2250 + harv.td.upg: 2250 + harv.scrin: 2250 + harv.chrono: 2250 + rmbo: 4500 + e7: 4500 + mast: 4500 + yuri: 4500 + bori: 4500 + u3.squad: 4500 + gtnk.squad: 4500 UnitLimits: + e2: 5 + n2: 8 + e4: 5 + n4: 5 dog: 2 - sab: 2 + cmsr: 1 + mgg: 1 + mrj: 1 cdrn: 1 + nhaw: 1 apc: 2 apc2: 2 - intl: 3 - vulc: 2 + delp: 2 + vulc: 5 hmmv: 2 bggy: 2 + rbug: 2 jeep: 2 + sapc: 1 + cust: 1 e6: 1 n6: 1 s6: 1 - mech: 1 - medi: 1 + u3.squad: 2 + seal: 5 + mech: 3 + medi: 3 msub: 4 ca: 4 isub: 4 - carr: 4 + cv: 4 jjet: 8 + bjet: 8 + v3rl: 1 + nukc: 1 + thwk: 1 + zeus: 1 + oblt: 1 kiro: 1 + disc: 1 deva: 1 pac: 1 ss: 10 @@ -2309,25 +2572,39 @@ Player: seas: 10 harv: 8 harv.td: 8 + harv.td.upg: 8 harv.scrin: 8 harv.chrono: 8 SquadManagerBotModuleCA@naval: RequiresCondition: enable-naval-ai - SquadSize: 1 - ExcludeFromSquadsTypes: harv, harv.td, harv.scrin, harv.chrono, mcv, amcv, smcv, dog, e6, n6, s6 - ExcludeFromAirSquadsTypes: deva, pac, jjet + MinimumAttackForceDelay: 25 + SquadValue: 500 + SquadValueMaxEarlyBonus: 0 + SquadValueMinLateBonus: 0 + SquadValueMaxLateBonus: 0 + AirUnitsTypes: heli, harr, pmak, beag, hind, yak, mig, suk, suk.upg, kiro, orca, a10, a10.sw, a10.gau, orcb, auro, jack, apch, venm, rah, scrn, stmr, torm, enrv, mshp, phan, kamv, shde, vert, mcor + ExcludeFromSquadsTypes: harv, harv.td, harv.td.upg, harv.scrin, harv.chrono, mcv, amcv, smcv, dog, e6, n6, s6, badr, badr.bomber, badr.cbomber, badr.nbomber, badr.mbomber, b2b, p51, tran.paradrop, halo.paradrop, nhaw.paradrop, u2, smig, a10.bomber, c17, c17.cargo, c17.clustermines, c17.xo, galx, uav, ocar.reinforce, ocar.xo, ocar.pod, horn, yf23.bomber, pod, pod2, pod3, buzz, buzz.ai, mspk NavalUnitsTypes: ss,msub,dd,ca,lst,pt,pt2,dd2,ss2,isub,sb,seas ConstructionYardTypes: fact,afac,sfac + StaticAntiAirTypes: agun, sam, nsam, cram, shar NavalProductionTypes: spen,syrd,spen.nod,syrd.gdi - AirSquadTargetTypes: - mshp: Structure + IgnoredEnemyTargetTypes: Wall + AirSquadTargetArmorTypes: + mshp: Wood UnitBuilderBotModuleCA@naval: + IdleBaseUnitsMaximum: 150 RequiresCondition: enable-naval-ai MaxAircraft: 4 - UnitDelays: - mcv: 6750 - amcv: 6750 - smcv: 6750 + UseCompositions: false + UnitIntervals: + mshp: 7500 + harv: 2250 + harv.td: 2250 + harv.td.upg: 2250 + harv.scrin: 2250 + harv.chrono: 2250 + u3.squad: 4500 + gtnk.squad: 4500 UnitsToBuild: e1: 65 e2: 25 @@ -2337,7 +2614,6 @@ Player: n2: 25 n3: 40 n4: 15 - n5: 15 n1c: 65 n3c: 40 s1: 65 @@ -2345,11 +2621,18 @@ Player: s3: 40 s4: 15 s6: 5 + u3.squad: 40 rmbc: 15 + enli: 10 + reap: 10 dog: 2 + jjet: 15 + bjet: 15 + seek: 40 + lace: 40 + devo: 45 + dark: 45 hsam: 40 - 1tnk: 70 - ltnk: 40 hind: 5 heli: 5 apch: 5 @@ -2360,17 +2643,23 @@ Player: rah: 3 mig: 3 suk: 3 + suk.upg: 3 harr: 3 + pmak: 3 + beag: 3 yak: 2 disr: 10 kiro: 2 + disc: 2 a10: 5 + a10.sw: 5 + a10.gau: 5 auro: 5 ss: 20 msub: 10 dd: 10 ca: 10 - carr: 10 + cv: 10 pt: 20 pt2: 20 dd2: 10 @@ -2379,7 +2668,264 @@ Player: sb: 10 seas: 10 stmr: 5 + torm: 5 enrv: 3 deva: 3 pac: 3 mshp: 1 + +World: + UnitCompositionsBotModule: + Composition@Baseline: + IsBaseline: true + UnitsToBuild: + e1: 65 + n1: 65 + s1: 65 + n1c: 65 + s2: 15 + e3: 30 + n3: 30 + s3: 30 + n3c: 30 + n5: 15 + e6: 5 + n6: 5 + s6: 5 + s4: 15 + mrdr: 15 + medi: 3 + mech: 3 + u3.squad: 30 + seal: 15 + dog: 2 + shok: 15 + ttrp: 15 + e8: 15 + deso: 15 + brut: 15 + snip: 15 + jjet: 15 + bjet: 15 + acol: 15 + tplr: 15 + bh: 15 + ztrp: 15 + zrai: 15 + zdef: 15 + enfo: 15 + hopl: 15 + tigr: 15 + cryt: 15 + evis: 15 + impl: 15 + stlk: 15 + cmsr: 10 + rmbc: 15 + enli: 10 + reap: 10 + e7: 15 + bori: 15 + yuri: 15 + rmbo: 15 + mast: 15 + apc.ai: 20 + sapc.ai: 10 + sapc.ai2: 10 + cust: 10 + intl.ai: 70 + intl.ai2: 20 + jeep: 30 + apc2.nodai: 20 + apc2.gdiai: 20 + delp.ai: 20 + vulc.ai: 10 + hmmv: 30 + mdrn: 20 + xo: 20 + wolv: 20 + pbul: 20 + jack: 10 + btr: 20 + btr.ai: 10 + btr.yuri: 20 + btr.yuri.ai: 10 + trpc: 10 + gunw: 20 + shrw: 20 + bggy: 30 + rbug: 30 + arty: 20 + howi: 20 + ptnk: 20 + pcan: 20 + v2rl: 20 + katy: 20 + grad: 20 + nukc: 20 + msam: 25 + mlrs: 20 + spec: 20 + hsam: 25 + ruin: 20 + atmz: 20 + ifv.ai: 70 + 2tnk: 45 + gtnk.squad: 20 + tnkd: 45 + 3tnk: 70 + 3tnk.atomic: 70 + 3tnk.yuri: 70 + 3tnk.atomicyuri: 70 + 3tnk.rhino: 70 + 3tnk.rhino.atomic: 70 + 3tnk.rhino.yuri: 70 + 3tnk.rhino.atomicyuri: 70 + 4tnk: 40 + 4tnk.atomic: 40 + 4tnk.erad: 40 + 4tnk.erad.atomic: 40 + apoc: 30 + apoc.atomic: 30 + apoc.erad: 30 + apoc.erad.atomic: 30 + ovld: 30 + ovld.atomic: 30 + ovld.erad: 30 + ovld.erad.atomic: 30 + avtr: 20 + tpod: 40 + rtpd: 40 + ltnk: 40 + ltnk.laser: 40 + mtnk: 70 + mtnk.drone: 70 + mtnk.laser: 70 + devo: 45 + dark: 45 + bike: 15 + htnk: 40 + htnk.ion: 40 + htnk.hover: 40 + htnk.drone: 40 + v3rl: 3 + thwk: 3 + zeus: 3 + titn: 40 + titn.rail: 40 + jugg: 10 + cryo: 10 + mgg: 3 + mrj: 3 + cdrn: 3 + ctnk: 3 + chpr: 3 + batf.ai: 10 + wtnk: 3 + ttnk: 25 + ttra: 25 + isu: 20 + stnk.nod: 15 + hstk: 15 + ftnk: 15 + hftk: 15 + corr: 15 + lchr: 15 + stcr: 25 + oblt: 3 + null: 3 + nhaw: 3 + hind: 5 + heli: 5 + apch: 5 + venm: 5 + orca: 5 + orcb: 3 + scrn: 5 + rah: 3 + mig: 3 + suk: 3 + suk.upg: 3 + harr: 3 + pmak: 3 + beag: 3 + yak: 2 + disr: 10 + kiro: 2 + disc: 2 + a10: 5 + a10.sw: 5 + a10.gau: 5 + auro: 5 + stmr: 5 + enrv: 3 + deva: 3 + pac: 3 + mshp: 1 + ss: 1 + msub: 1 + dd: 1 + ca: 1 + cv: 1 + pt: 1 + pt2: 1 + dd2: 1 + ss2: 2 + isub: 1 + sb: 1 + seas: 1 + Composition@InfantryRaid: + MaxProducedValue: 1000 + UnitQueues: InfantrySQ, InfantryMQ + UnitsToBuild: + e2: 100 + n2: 100 + e4: 100 + n4: 100 + n5: 100 + ivan: 100 + Composition@VehicleRaid: + MaxProducedValue: 4000 + UnitQueues: VehicleSQ, VehicleMQ + UnitsToBuild: + bike: 100 + hmmv.tow: 100 + gdrn: 100 + gdrn.tow: 100 + seek: 100 + lace: 100 + 1tnk: 100 + rtnk: 100 + Composition@StealthTankAssault: + MaxProducedValue: 12000 + UnitQueues: VehicleSQ, VehicleMQ + UnitsToBuild: + stnk.nod: 100 + hstk: 100 + spec: 100 + Composition@BlackHandAssault: + Prerequisites: player.blackh + MaxProducedValue: 12000 + UnitQueues: InfantrySQ, InfantryMQ, VehicleSQ, VehicleMQ + UnitsToBuild: + bh: 100 + hftk: 100 + Composition@ZocomAssault: + Prerequisites: player.zocom + MaxProducedValue: 15000 + UnitQueues: InfantrySQ, InfantryMQ, VehicleSQ, VehicleMQ + UnitsToBuild: + disr: 50 + ztrp: 100 + zrai: 100 + zdef: 100 + xo: 50 + Composition@TeslaAssault: + Prerequisites: player.russia + MaxProducedValue: 14000 + UnitQueues: InfantrySQ, InfantryMQ, VehicleSQ, VehicleMQ + UnitsToBuild: + shok: 100 + ttrp: 100 + ttnk: 70 + ttra: 50 diff --git a/mods/ca/rules/aircraft.yaml b/mods/ca/rules/aircraft.yaml index b7ff8d05fa..58dd5a659e 100644 --- a/mods/ca/rules/aircraft.yaml +++ b/mods/ca/rules/aircraft.yaml @@ -25,22 +25,36 @@ BADR: SpawnActorOnDeath: Actor: BADR.Husk RequiresCondition: !empdisable - SmokeTrailWhenDamaged@0: - Offset: -432,560,0 - Interval: 2 - SmokeTrailWhenDamaged@1: - Offset: -432,-560,0 - Interval: 2 - -EjectOnDeath: + LeavesTrails@0: + Offsets: -432,560,0 + MovingInterval: 2 + Image: smokey + StationaryInterval: 2 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RequiresCondition: enable-smoke + LeavesTrails@1: + Offsets: -432,-560,0 + MovingInterval: 2 + Image: smokey + StationaryInterval: 2 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RequiresCondition: enable-smoke RejectsOrders: - GivesExperience: + GivesExperienceCA: Experience: 1000 Interactable: + GrantConditionOnDamageState@SmokeTrail: + Condition: enable-smoke BADR.Bomber: Inherits: ^NeutralPlane Inherits@EMP: ^EmpDisable AttackBomber: + FacingTolerance: 8 Armament: Weapon: ParaBomb Health: @@ -67,20 +81,33 @@ BADR.Bomber: SpawnActorOnDeath@EMP: Actor: BADR.Husk.EMP RequiresCondition: empdisable - SmokeTrailWhenDamaged@0: - Offset: -432,560,0 - Interval: 2 - SmokeTrailWhenDamaged@1: - Offset: -432,-560,0 - Interval: 2 - -EjectOnDeath: + LeavesTrails@0: + Offsets: -432,560,0 + MovingInterval: 2 + Image: smokey + StationaryInterval: 2 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RequiresCondition: enable-smoke + LeavesTrails@1: + Offsets: -432,-560,0 + MovingInterval: 2 + Image: smokey + StationaryInterval: 2 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RequiresCondition: enable-smoke -MapEditorData: RejectsOrders: RenderSprites: Image: badr - GivesExperience: + GivesExperienceCA: Experience: 1000 Interactable: + GrantConditionOnDamageState@SmokeTrail: + Condition: enable-smoke BADR.CBomber: Inherits: BADR.Bomber @@ -100,13 +127,30 @@ BADR.MBomber: Ammo: 1 Armament: Weapon: GeneticMutationBomb + RequiresCondition: !impmuta-upgrade + Armament@UPG: + Weapon: GeneticMutationBomb.UPG + RequiresCondition: impmuta-upgrade + GrantConditionOnPrerequisite@UPG: + Condition: impmuta-upgrade + Prerequisites: impmuta.upgrade + +BADR.ChaosBomber: + Inherits: BADR.Bomber + Armament: + Weapon: ChaosBomb B2B: Inherits: ^NeutralPlane Inherits@EMP: ^EmpDisable AttackBomber: + Armaments: primary, decloak + FacingTolerance: 8 Armament: Weapon: InfernoBomb + Armament@DECLOAK: + Name: decloak + Weapon: InfernoBombTargeter Health: HP: 36000 Aircraft: @@ -131,39 +175,54 @@ B2B: SpawnActorOnDeath@EMP: Actor: B2B.Husk.EMP RequiresCondition: empdisable - SmokeTrailWhenDamaged@0: - Offset: -432,560,0 - Interval: 2 - SmokeTrailWhenDamaged@1: - Offset: -432,-560,0 - Interval: 2 - -EjectOnDeath: + LeavesTrails@0: + Offsets: -432,560,0 + MovingInterval: 2 + Image: smokey + StationaryInterval: 2 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RequiresCondition: enable-smoke + LeavesTrails@1: + Offsets: -432,-560,0 + MovingInterval: 2 + Image: smokey + StationaryInterval: 2 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RequiresCondition: enable-smoke -MapEditorData: RejectsOrders: - GivesExperience: + GivesExperienceCA: Experience: 1000 Interactable: Cloak@NORMAL: + DetectionTypes: AirCloak InitialDelay: 0 CloakDelay: 200 UncloakSound: appear1.aud UncloakOn: Attack, Unload, Infiltrate, Demolish, Dock, Damage, Heal - IsPlayerPalette: true - Palette: cloakra RequiresCondition: !cloak-force-disabled && airborne GrantConditionOnDamageState@UNCLOAK: Condition: cloak-force-disabled ValidDamageStates: Critical + GrantConditionOnDamageState@SmokeTrail: + Condition: enable-smoke MIG: Inherits: ^Plane - Inherits@AUTOTARGET: ^AutoTargetAllAssaultMove + Inherits@AUTOTARGET: ^AutoTargetAllAssaultMovePrioritizeAir Buildable: - Queue: Aircraft + Queue: AircraftSQ, AircraftMQ BuildAtProductionType: Plane - BuildPaletteOrder: 70 - Prerequisites: ~afld, ~techlevel.high - Description: Multi purpose strike aircraft.\n Strong vs Vehicles, Aircraft, Defenses\n Weak vs Infantry + BuildPaletteOrder: 31 + Prerequisites: afld, ~aircraft.soviet, ~techlevel.medium + Description: Multi purpose strike aircraft. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Defenses, Aircraft + Weaknesses: • Weak vs Infantry Valued: Cost: 1500 Tooltip: @@ -171,7 +230,7 @@ MIG: UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 18000 + HP: 20000 RevealsShroud: Range: 11c0 MinRange: 9c0 @@ -184,12 +243,12 @@ MIG: Weapon: Maverick LocalOffset: 0,-640,0, 0,640,0 LocalYaw: -40, 40 - PauseOnCondition: !ammo + PauseOnCondition: !ammo || blinded Armament@AA: Weapon: MaverickAA LocalOffset: 0,-640,0, 0,640,0 LocalYaw: -40, 40 - PauseOnCondition: !ammo + PauseOnCondition: !ammo || blinded Name: secondary AttackAircraft: FacingTolerance: 80 @@ -203,36 +262,38 @@ MIG: Speed: 201 RepulsionSpeed: 40 MaximumPitch: 56 - TakeoffSounds: migtoff1.aud + TakeoffSounds: migtoff1.aud, cjetbanb.aud, cjetbanc.aud AutoTarget: InitialStance: HoldFire InitialStanceAI: AttackAnything AmmoPool: Ammo: 4 - ReloadDelay: 60 AmmoCondition: ammo + ReloadDelay: 35 WithAmmoPipsDecoration: Position: BottomLeft Margin: 4, 3 RequiresSelection: true Selectable: - Bounds: 36,28,0,2 - DecorationBounds: 40,29,0,1 + Bounds: 1536, 1194, 0, 85 + DecorationBounds: 1706, 1237, 0, 42 Contrail@1: - Offset: -598,-683,0 + Offset: -598,-683,-20 Contrail@2: - Offset: -598,683,0 + Offset: -598,683,-20 Contrail@AB1: Offset: -400,-50,-20 - UsePlayerColor: false + StartColorUsePlayerColor: false ZOffset: -512 - Color: cc550080 + StartColor: cc550080 + StartColorAlpha: 128 TrailLength: 10 Contrail@AB2: Offset: -400,50,-20 - UsePlayerColor: false + StartColorUsePlayerColor: false ZOffset: -512 - Color: cc550080 + StartColor: cc550080 + StartColorAlpha: 128 TrailLength: 10 SpawnActorOnDeath: Actor: MIG.Husk @@ -246,29 +307,55 @@ MIG: SpawnActorOnDeath@EmptyEMP: Actor: MIG.Husk.empty.EMP RequiresCondition: airborne && !ammo && empdisable && !being-warped - SmokeTrailWhenDamaged: - Offset: -853,0,171 - Interval: 2 + LeavesTrails: + Offsets: -853,0,171 + MovingInterval: 2 + Image: smokey + StationaryInterval: 2 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RequiresCondition: enable-smoke ProducibleWithLevel: Prerequisites: aircraft.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: aircraft.upgraded Rearmable: RearmActors: afld, afld.gdi + GrantConditionOnDamageState@SmokeTrail: + Condition: enable-smoke + EjectOnDeath: + ChuteSound: gejecta.aud + Encyclopedia: + Category: Soviets/Aircraft SUK: Inherits: ^Plane Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove Buildable: - Queue: Aircraft + Queue: AircraftSQ, AircraftMQ BuildAtProductionType: Plane - BuildPaletteOrder: 120 - Prerequisites: ~afld, stek, ~techlevel.high - Description: Fast ground attack aircraft armed\nwith powerful explosive munitions.\n Strong vs Vehicles, Defenses\n Weak vs Aircraft + BuildPaletteOrder: 80 + Prerequisites: afld, stek, ~aircraft.soviet, ~!seismic.upgrade, ~techlevel.high + Description: Fast ground attack aircraft armed with powerful armor-piercing munitions. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Defenses, Light Armor + Weaknesses: • Weak vs Infantry, Buildings\n• Cannot attack Aircraft + RequiresCondition: !seismic-upgrade + TooltipExtras@SEISMIC: + Description: Fast ground attack aircraft armed with powerful explosive munitions. + Strengths: • Strong vs Buildings, Heavy Armor, Defenses, Light Armor + Weaknesses: • Weak vs Infantry\n• Cannot attack Aircraft\n• Has difficulty hitting moving targets + RequiresCondition: seismic-upgrade Valued: Cost: 2000 + UpdatesPlayerStatistics: + AddToArmyValue: true Tooltip: Name: Sukhoi Attack Plane Health: - HP: 22500 + HP: 18000 RevealsShroud: Range: 12c0 MinRange: 10c0 @@ -280,20 +367,17 @@ SUK: Armament: Weapon: MaverickSU LocalOffset: 0,-640,0, 0,640,0 - PauseOnCondition: !ammo + PauseOnCondition: !ammo || blinded RequiresCondition: !seismic-upgrade Armament@UPGRADE: Weapon: SeismicMissile LocalOffset: 0,-640,0, 0,640,0 - PauseOnCondition: !ammo - RequiresCondition: seismic-upgrade - Armament@UPGRADEDUMMY: - Weapon: SeismicMissileDummy - LocalOffset: 0,-640,0, 0,640,0 - PauseOnCondition: !ammo + PauseOnCondition: !ammo || blinded RequiresCondition: seismic-upgrade + AmmoUsage: 2 AttackAircraft: FacingTolerance: 80 + Voice: Attack PersistentTargeting: false OpportunityFire: true PauseOnCondition: empdisable || being-warped @@ -301,16 +385,17 @@ SUK: CruiseAltitude: 2560 InitialFacing: 192 TurnSpeed: 16 - Speed: 225 + Speed: 216 RepulsionSpeed: 40 MaximumPitch: 56 - TakeoffSounds: migtoff1.aud + TakeoffSounds: migtoff1.aud, cjetbanb.aud, cjetbanc.aud + Voice: Move AutoTarget: InitialStance: HoldFire InitialStanceAI: AttackAnything AmmoPool: Ammo: 8 - ReloadDelay: 30 + ReloadDelay: 22 AmmoCondition: ammo WithAmmoPipsDecoration: PipCount: 4 @@ -318,20 +403,22 @@ SUK: Margin: 4, 3 RequiresSelection: true Contrail@1: - Offset: -598,-683,-40 + Offset: -600,-550,-80 Contrail@2: - Offset: -598,683,-40 + Offset: -600,550,-80 Contrail@AB1: Offset: -400,-70,-20 - UsePlayerColor: false + StartColorUsePlayerColor: false ZOffset: -512 - Color: cc550080 + StartColor: cc550080 + StartColorAlpha: 128 TrailLength: 10 Contrail@AB2: Offset: -400,70,-20 - UsePlayerColor: false + StartColorUsePlayerColor: false ZOffset: -512 - Color: cc550080 + StartColor: cc550080 + StartColorAlpha: 128 TrailLength: 10 SpawnActorOnDeath: Actor: SUK.Husk @@ -345,36 +432,80 @@ SUK: SpawnActorOnDeath@EmptyEMP: Actor: SUK.Husk.empty.EMP RequiresCondition: airborne && !ammo && empdisable && !being-warped - SmokeTrailWhenDamaged: - Offset: -853,0,0 - Interval: 2 + LeavesTrails: + Offsets: -853,0,0 + MovingInterval: 2 + Image: smokey + StationaryInterval: 2 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RequiresCondition: enable-smoke Selectable: - DecorationBounds: 30,28,0,2 + DecorationBounds: 1280, 1194, 0, 85 ProducibleWithLevel: Prerequisites: aircraft.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: aircraft.upgraded Rearmable: RearmActors: afld, afld.gdi GrantConditionOnPrerequisite@SEISMIC: Condition: seismic-upgrade Prerequisites: seismic.upgrade + ReplacedInQueue: + Actors: suk.upg + GrantConditionOnDamageState@SmokeTrail: + Condition: enable-smoke + Voiced: + VoiceSet: SukVoice + EjectOnDeath: + ChuteSound: gejecta.aud + Encyclopedia: + Category: Soviets/Aircraft + +SUK.UPG: + Inherits: SUK + RenderSprites: + Image: suk + Buildable: + Prerequisites: afld, stek, ~aircraft.soviet, ~seismic.upgrade, ~techlevel.high + Description: Fast ground attack aircraft armed with powerful explosive munitions. + BuildPaletteOrder: 81 + -TooltipExtras: + TooltipExtras@SEISMIC: + -RequiresCondition: + -GrantConditionOnPrerequisite@SEISMIC: + -Armament: + Armament@UPGRADE: + -RequiresCondition: + Selectable: + Class: suk + -ReplacedInQueue: + EncyclopediaExtras: + Name: Seismic Sukhoi + VariantOf: SUK YAK: Inherits: ^Plane - Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove + Inherits@AUTOTARGET: ^AutoTargetAllAssaultMovePrioritizeAir Buildable: - Queue: Aircraft + Queue: AircraftSQ, AircraftMQ BuildAtProductionType: Plane - BuildPaletteOrder: 25 - Prerequisites: ~afld, ~aircraft.soviet, ~techlevel.low - Description: Ground attack plane armed with\ndual machine guns.\n Strong vs Infantry, Buildings, Light Armor\n Weak vs Tanks + BuildPaletteOrder: 30 + Prerequisites: afld, ~aircraft.soviet, ~techlevel.medium + Description: Fighter plane armed with dual machine guns + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor, Buildings, Aircraft + Weaknesses: • Weak vs Heavy Armor, Defenses Valued: - Cost: 1350 + Cost: 1200 Tooltip: Name: Yak Attack Plane UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 15000 + HP: 13500 RevealsShroud: Range: 11c0 MinRange: 9c0 @@ -384,16 +515,27 @@ YAK: Range: 9c0 Type: GroundPosition Armament@PRIMARY: - Weapon: ChainGun.Yak.R + Weapon: ChainGun.Yak.L LocalOffset: 256,-213,0 MuzzleSequence: muzzle - PauseOnCondition: !ammo + PauseOnCondition: !ammo || blinded Armament@SECONDARY: Name: secondary - Weapon: ChainGun.Yak.L + Weapon: ChainGun.Yak.R LocalOffset: 256,213,0 MuzzleSequence: muzzle - PauseOnCondition: !ammo + PauseOnCondition: !ammo || blinded + Armament@PRIMARYAA: + Weapon: ChainGun.Yak.AA + LocalOffset: 256,-213,0 + MuzzleSequence: muzzle + PauseOnCondition: !ammo || blinded + Armament@SECONDARYAA: + Name: secondary + Weapon: ChainGun.Yak.AA + LocalOffset: 256,213,0 + MuzzleSequence: muzzle + PauseOnCondition: !ammo || blinded AttackAircraft: FacingTolerance: 80 PersistentTargeting: false @@ -410,8 +552,8 @@ YAK: InitialStance: HoldFire InitialStanceAI: AttackAnything AmmoPool: - Ammo: 40 - ReloadDelay: 5 + Ammo: 16 + ReloadDelay: 8 AmmoCondition: ammo WithAmmoPipsDecoration: Position: BottomLeft @@ -425,31 +567,117 @@ YAK: SpawnActorOnDeath@EMP: Actor: YAK.Husk.EMP RequiresCondition: empdisable && !being-warped - SmokeTrailWhenDamaged: - Offset: -853,0,0 - Interval: 2 + LeavesTrails: + Offsets: -853,0,0 + MovingInterval: 2 + Image: smokey + StationaryInterval: 2 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RequiresCondition: enable-smoke ProducibleWithLevel: Prerequisites: aircraft.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: aircraft.upgraded Selectable: - DecorationBounds: 30,28,0,2 + DecorationBounds: 1280, 1194, 0, 85 Rearmable: RearmActors: afld, afld.gdi Contrail@1: - Offset: -98,-683,-10 + Offset: 0,-683,-30 + Contrail@2: + Offset: 0,683,-30 + GrantConditionOnDamageState@SmokeTrail: + Condition: enable-smoke + Encyclopedia: + Category: Soviets/Aircraft + +P51: + Inherits: ^NeutralPlane + Inherits@EMP: ^EmpDisable + Tooltip: + Name: P51 Attack Plane + UpdatesPlayerStatistics: + AddToArmyValue: true + Health: + HP: 34000 + RevealsShroud@GAPGEN: + Range: 9c0 + Type: GroundPosition + Armament@PRIMARY: + Name: gunr + Weapon: ChainGun.P51.R + LocalOffset: 256,-213,0 + MuzzleSequence: muzzle + Armament@SECONDARY: + Name: gunl + Weapon: ChainGun.P51.L + LocalOffset: 256,213,0 + MuzzleSequence: muzzle + Armament@TERTIARY: + Name: rocketr + Weapon: Rocket.P51.R + LocalOffset: 0,-413,0 + Armament@QUATERNARY: + Name: rocketl + FireDelay: 2 + Weapon: Rocket.P51.L + LocalOffset: 0,413,0 + AttackBomberCA: + Armaments: gunr, gunl, rocketr, rocketl, missile + FacingTolerance: 80 + Aircraft: + CruiseAltitude: 2560 + InitialFacing: 192 + TurnSpeed: 16 + Speed: 216 + RepulsionSpeed: 40 + MaximumPitch: 56 + WithMuzzleOverlay: + SpawnActorOnDeath: + Actor: P51.Husk + RequiresCondition: !empdisable + SpawnActorOnDeath@EMP: + Actor: P51.Husk.EMP + RequiresCondition: empdisable + LeavesTrails: + Offsets: -853,0,0 + MovingInterval: 2 + Image: smokey + StationaryInterval: 2 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RequiresCondition: enable-smoke + RejectsOrders: + Contrail@1: + Offset: -98,-623,30 Contrail@2: - Offset: -98,683,-10 + Offset: -98,623,30 + -Selectable: + Interactable: + GivesExperienceCA: + Experience: 1000 + GrantConditionOnDamageState@SmokeTrail: + Condition: enable-smoke TRAN: Inherits: ^Helicopter Inherits@TRANSPORT: ^Transport + Inherits@SELECTION: ^SelectableSupportUnit RenderSprites: Image: tran3 Buildable: - Queue: Aircraft + Queue: AircraftSQ, AircraftMQ BuildAtProductionType: Helicopter BuildPaletteOrder: 10 - Prerequisites: ~aircraft.chinook, ~techlevel.infonly - Description: Fast infantry transport helicopter.\n Unarmed + Prerequisites: aircraft.chinook, ~aircraft.chinookvisible, ~techlevel.medium + Description: Fast infantry transport helicopter. + TooltipExtras: + Weaknesses: • Unarmed + Attributes: • Can carry infantry\n• Can Paradrop infantry (Force Fire) Valued: Cost: 900 Tooltip: @@ -470,27 +698,58 @@ TRAN: TurnSpeed: 20 Speed: 135 AltitudeVelocity: 0c58 - TakeoffSounds: htoff1.aud - LandingSounds: hland1.aud + TakeoffSounds: vospstaa.aud + LandingSounds: vosplana.aud + ParaDrop: + ChuteSound: chute1.aud + AmmoPool: + Ammo: 1 + ReloadAmmoPool: + Delay: 60 + Count: 1 + RequiresCondition: cargo + AttackAircraft: + FacingTolerance: 20 + AttackType: Strafe + StrafeRunLength: 5c0 + OpportunityFire: False + PersistentTargeting: False + ForceFireIgnoresActors: True + RequiresCondition: cargo + Armament: + Weapon: DropDummy + Cursor: ability + OutsideRangeCursor: ability + TargetRelationships: None + ForceTargetRelationships: None WithIdleOverlay@ROTOR1AIR: Offset: 597,0,213 Sequence: rotor + PauseOnCondition: being-warped RequiresCondition: airborne WithIdleOverlay@ROTOR1GROUND: Offset: 597,0,213 Sequence: slow-rotor + PauseOnCondition: being-warped RequiresCondition: !airborne WithIdleOverlay@ROTOR2AIR: Offset: -597,0,341 Sequence: rotor2 + PauseOnCondition: being-warped RequiresCondition: airborne WithIdleOverlay@ROTOR2GROUND: Offset: -597,0,341 Sequence: slow-rotor2 + PauseOnCondition: being-warped RequiresCondition: !airborne Cargo: - Types: Infantry + Types: Infantry, Hacker MaxWeight: 8 + LoadedCondition: cargo + WithCargoSounds: + EnterSounds: genter1a.aud + ExitSounds: gexit1a.aud + RequiresCondition: !airborne SpawnActorOnDeath: Actor: TRAN.Husk RequiresCondition: !empdisable && !being-warped @@ -498,65 +757,335 @@ TRAN: Actor: TRAN.Husk.EMP RequiresCondition: empdisable && !being-warped Selectable: - DecorationBounds: 40,36 + DecorationBounds: 1706, 1536 WithCargoHatchAnimation: + ParachuteCargoOnCondition: + RequiresCondition: dropcargo + GrantConditionOnAttack: + Condition: dropcargo + RevokeDelay: 15 + Encyclopedia: + Category: Allies/Aircraft; GDI/Aircraft; Nod/Aircraft TRAN.paradrop: + Inherits: TRAN + RenderSprites: + Image: tran3 + Health: + HP: 40000 + Aircraft: + CruiseAltitude: 2560 + TurnSpeed: 20 + Speed: 180 + AltitudeVelocity: 0c100 + Repulsable: False + Hovers@CRUISING: + RequiresCondition: cruising + RejectsOrders: + Interactable: + GivesExperienceCA: + Experience: 1000 + WithCargoSounds: + -EnterSounds: + -Huntable: + -Buildable: + -Selectable: + -Voiced: + -Targetable@TEMPORAL: + -RevealsShroud: + -RevealsShroud@GAPGEN: + -AttackAircraft: + -Armament: + -ParachuteCargoOnCondition: + -GrantConditionOnAttack: + -Encyclopedia: + +HALO: + Inherits: TRAN + RenderSprites: + Image: halo + Tooltip: + Name: Halo + Valued: + Cost: 1000 + Cargo: + MaxWeight: 10 + Aircraft: + Speed: 155 + Voice: Move + TakeoffSounds: vhalostaa.aud + LandingSounds: vhalolana.aud + Health: + HP: 44000 + Buildable: + Prerequisites: afld, ~aircraft.soviet, ~techlevel.medium + -WithCargoHatchAnimation: + -WithIdleOverlay@ROTOR2AIR: + -WithIdleOverlay@ROTOR2GROUND: + WithIdleOverlay@ROTOR1AIR: + Offset: 260,0,343 + WithIdleOverlay@ROTOR1GROUND: + Offset: 260,0,343 + SpawnActorOnDeath: + Actor: HALO.Husk + RequiresCondition: !empdisable && !being-warped + SpawnActorOnDeath@EMP: + Actor: HALO.Husk.EMP + RequiresCondition: empdisable && !being-warped + ParachuteCargoOnCondition: + RequiresCondition: dropcargo + GrantConditionOnAttack: + Condition: dropcargo + Voiced: + VoiceSet: HaloVoice + SoundOnDamageTransitionCA: + DestroyedSounds: vhalodiea.aud + RequiresCondition: airborne + Encyclopedia: + Category: Soviets/Aircraft + +HALO.paradrop: + Inherits: HALO + Aircraft: + CruiseAltitude: 2560 + Speed: 180 + Repulsable: False + Hovers@CRUISING: + RequiresCondition: cruising + GivesExperienceCA: + Experience: 1000 + RejectsOrders: + Interactable: + WithCargoSounds: + -EnterSounds: + -Huntable: + -Buildable: + -Targetable@TEMPORAL: + -Selectable: + -Voiced: + -RevealsShroud: + -RevealsShroud@GAPGEN: + -AttackAircraft: + -Armament: + -ParachuteCargoOnCondition: + -GrantConditionOnAttack: + -Encyclopedia: + +NHAW: Inherits: ^Helicopter + Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove + Inherits@TRANSPORT: ^Transport + RenderSprites: + Image: nhaw + Buildable: + Queue: AircraftSQ, AircraftMQ + BuildAtProductionType: Helicopter + BuildPaletteOrder: 10 + Prerequisites: ~aircraft.nhaw, ~techlevel.medium + Description: Fast infantry transport helicopter armed with a light machine gun. + TooltipExtras: + Strengths: • Strong vs Infantry + Weaknesses: • Weak vs Heavy Armor, Defenses, Buildings\n• Cannot attack Aircraft + Attributes: • Can carry infantry\n• Can Paradrop Infantry (HoldFire Stance + Force Fire) + Valued: + Cost: 1150 Tooltip: - Name: Chinook - ParaDrop: - DropRange: 4c0 + Name: Nighthawk + UpdatesPlayerStatistics: + AddToArmyValue: true Health: - HP: 36000 + HP: 38000 + RevealsShroud: + Range: 8c0 + MinRange: 6c0 + Type: GroundPosition + RevealGeneratedShroud: False + RevealsShroud@GAPGEN: + Range: 6c0 + Type: GroundPosition Aircraft: TurnSpeed: 20 - Speed: 135 - AltitudeVelocity: 0c100 + Speed: 155 + AltitudeVelocity: 0c58 + TakeoffSounds: vospstaa.aud + LandingSounds: vosplana.aud + Voice: Move WithIdleOverlay@ROTOR1AIR: - Offset: 597,0,85 + Offset: 237,0,263 Sequence: rotor + PauseOnCondition: being-warped RequiresCondition: airborne WithIdleOverlay@ROTOR1GROUND: - Offset: 597,0,85 + Offset: 237,0,263 Sequence: slow-rotor + PauseOnCondition: being-warped RequiresCondition: !airborne WithIdleOverlay@ROTOR2AIR: - Offset: -597,0,171 + Offset: -997,0,341 Sequence: rotor2 + PauseOnCondition: being-warped RequiresCondition: airborne WithIdleOverlay@ROTOR2GROUND: - Offset: -597,0,171 + Offset: -997,0,341 Sequence: slow-rotor2 + PauseOnCondition: being-warped RequiresCondition: !airborne Cargo: - Types: Infantry + Types: Infantry, Hacker MaxWeight: 8 - -Selectable: - -Voiced: - RejectsOrders: - RenderSprites: - Image: tran3 + LoadedCondition: cargo + WithCargoSounds: + EnterSounds: genter1a.aud + ExitSounds: gexit1a.aud + RequiresCondition: !airborne SpawnActorOnDeath: - Actor: TRAN.Husk - RequiresCondition: !empdisable && !being-warped + Actor: NHAW.Husk + RequiresCondition: !upg-cryw && !empdisable && !being-warped SpawnActorOnDeath@EMP: - Actor: TRAN.Husk.EMP - RequiresCondition: empdisable && !being-warped + Actor: NHAW.Husk.EMP + RequiresCondition: !upg-cryw && empdisable && !being-warped + SpawnActorOnDeath@UPG: + Actor: NHAW.UPG.Husk + RequiresCondition: upg-cryw && !empdisable && !being-warped + SpawnActorOnDeath@UPGEMP: + Actor: NHAW.UPG.Husk.EMP + RequiresCondition: upg-cryw && empdisable && !being-warped + Selectable: + DecorationBounds: 1706, 1536 + Voiced: + VoiceSet: NighthawkVoice + AppearsOnRadar: + ValidRelationships: Ally + WithFacingSpriteBody: + RequiresCondition: !upg-cryw + WithFacingSpriteBody@UPG: + Name: body-upg + RequiresCondition: upg-cryw && ammo > 1 + Sequence: idle-upg + WithFacingSpriteBody@oneshot: + Name: body-oneshot + RequiresCondition: upg-cryw && ammo == 1 + Sequence: oneshot + WithFacingSpriteBody@empty: + Name: body-empty + RequiresCondition: upg-cryw && !ammo + Sequence: empty + Armament@PRIMARY: + Weapon: M60mgNHAW + LocalOffset: 1000,0,-100 + MuzzleSequence: muzzle + RequiresCondition: !(cargo && stance-holdfire) + Armament@CRYOMISSILE: + Name: cryo + Weapon: cryomissilenhaw + LocalOffset: 200,300,0, 200,-300,0 + RequiresCondition: upg-cryw && !(cargo && stance-holdfire) && ammo + AmmoPool@CRYOMISSILE: + Name: cryo + Armaments: cryo + Ammo: 2 + AmmoCondition: ammo + ReloadAmmoPool@CRYOMISSILE: + AmmoPool: cryo + Delay: 375 + Count: 2 + RequiresCondition: upg-cryw + AutoTarget: + InitialStance: Defend + InitialStanceAI: AttackAnything + HoldFireCondition: stance-holdfire + AttackAircraft: + Armaments: primary, cryo, drop + FacingTolerance: 20 + AttackType: Hover + PersistentTargeting: false + OpportunityFire: false + PauseOnCondition: empdisable || being-warped || blinded + ForceFireIgnoresActors: True + Voice: Attack + WithMuzzleOverlay: + GrantConditionOnPrerequisite@CRYW: + Condition: upg-cryw + Prerequisites: cryw.upgrade + ParaDrop: + ChuteSound: chute1.aud + Armament@DROP: + Name: drop + Weapon: DropDummy + Cursor: ability + OutsideRangeCursor: ability + RequiresCondition: cargo && stance-holdfire + ParachuteCargoOnCondition: + RequiresCondition: dropcargo + ReturnToBase: false + GrantConditionOnAttack: + Condition: dropcargo + ArmamentNames: drop + Encyclopedia: + Category: Allies/Aircraft + EncyclopediaExtras: + Subfaction: usa + +NHAW.paradrop: + Inherits: NHAW + RenderSprites: + Image: NHAW + Health: + HP: 46000 + Aircraft: + CruiseAltitude: 2560 + TurnSpeed: 20 + Speed: 180 + AltitudeVelocity: 0c100 + Repulsable: False + Hovers@CRUISING: + RequiresCondition: cruising + RejectsOrders: Interactable: - GivesExperience: + GivesExperienceCA: Experience: 1000 + Cargo: + -LoadedCondition: + WithCargoSounds: + -EnterSounds: + -Huntable: + -Buildable: + -Selectable: + -Voiced: -Targetable@TEMPORAL: + -RevealsShroud: + -RevealsShroud@GAPGEN: + -WithFacingSpriteBody@UPG: + -WithFacingSpriteBody@oneshot: + -WithFacingSpriteBody@empty: + -AttackAircraft: + -Armament@PRIMARY: + -Armament@CRYOMISSILE: + -Armament@DROP: + -AmmoPool@CRYOMISSILE: + -ReloadAmmoPool@CRYOMISSILE: + -AutoTarget: + -AutoTargetPriority@DEFAULT: + -AutoTargetPriority@ATTACKANYTHING: + -AttackMove: + -WithMuzzleOverlay: + -ParachuteCargoOnCondition: + -GrantConditionOnAttack: + -Encyclopedia: + -EncyclopediaExtras: HELI: Inherits: ^Helicopter - Inherits@AUTOTARGET: ^AutoTargetAllAssaultMove + Inherits@AUTOTARGET: ^AutoTargetAllAssaultMovePrioritizeAir Buildable: - Queue: Aircraft + Queue: AircraftSQ, AircraftMQ BuildAtProductionType: Helicopter - BuildPaletteOrder: 50 - Prerequisites: ~hpad, ~aircraft.allies, ~techlevel.medium - Description: Helicopter gunship armed\nwith multi-purpose missiles.\n Strong vs Vehicles, Aircraft\n Weak vs Infantry + BuildPaletteOrder: 20 + Prerequisites: ~aircraft.allies, ~techlevel.medium + Description: Helicopter gunship armed with multi-purpose missiles. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Defenses, Aircraft + Weaknesses: • Weak vs Infantry Valued: Cost: 1500 Tooltip: @@ -564,49 +1093,69 @@ HELI: UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 20000 + HP: 22000 RevealsShroud: - Range: 10c0 - MinRange: 8c0 + Range: 11c0 + MinRange: 9c0 Type: GroundPosition RevealGeneratedShroud: False RevealsShroud@GAPGEN: - Range: 8c0 + Range: 9c0 Type: GroundPosition Armament@PRIMARY: Weapon: HellfireAA - LocalOffset: 0,-213,-85, 0,213,-85 + LocalOffset: 0,213,-85, 0,-213,-85 PauseOnCondition: !ammo - Armament@SECONDARY: + RequiresCondition: !cryw-upgrade + Armament@PRIMARYUPG: + Weapon: HellfireAA.Cryo + LocalOffset: 0,213,-85, 0,-213,-85 + PauseOnCondition: !ammo + RequiresCondition: cryw-upgrade + Armament@SECONDARY: + Name: secondary Weapon: HellfireAG LocalOffset: 0,213,-85, 0,-213,-85 PauseOnCondition: !ammo + RequiresCondition: !cryw-upgrade + Armament@SECONDARYUPG: + Name: secondary + Weapon: HellfireAG.Cryo + LocalOffset: 0,213,-85, 0,-213,-85 + PauseOnCondition: !ammo + RequiresCondition: cryw-upgrade + GrantConditionOnPrerequisite@CRYO: + Condition: cryw-upgrade + Prerequisites: cryw.upgrade AttackAircraft: FacingTolerance: 80 AttackType: Hover PersistentTargeting: false OpportunityFire: false - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded Aircraft: - TurnSpeed: 16 + TurnSpeed: 18 Speed: 157 - TakeoffSounds: htoff1.aud - LandingSounds: hland1.aud + TakeoffSounds: vhelistaa.aud + LandingSounds: vhelilana.aud AutoTarget: InitialStance: HoldFire InitialStanceAI: AttackAnything WithIdleOverlay@ROTORAIR: Offset: 0,0,85 Sequence: rotor + PauseOnCondition: being-warped RequiresCondition: airborne WithIdleOverlay@ROTORGROUND: Offset: 0,0,85 Sequence: slow-rotor + PauseOnCondition: being-warped RequiresCondition: !airborne AmmoPool: Ammo: 8 ReloadCount: 2 AmmoCondition: ammo + ReloadDelay: 35 WithAmmoPipsDecoration: Position: BottomLeft Margin: 4, 3 @@ -624,73 +1173,129 @@ HELI: SpawnActorOnDeath@EmptyEMP: Actor: HELI.Husk.empty.EMP RequiresCondition: !ammo && empdisable && !being-warped - SmokeTrailWhenDamaged: - Offset: -427,0,0 + LeavesTrails: + Offsets: -427,0,0 + Image: smokey + MovingInterval: 3 + StationaryInterval: 3 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RequiresCondition: enable-smoke ProducibleWithLevel: Prerequisites: aircraft.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: aircraft.upgraded Selectable: - DecorationBounds: 36,28 + DecorationBounds: 1536, 1194 Rearmable: - RearmActors: hpad, hpad.td + RearmActors: hpad, hpad.td, afld, afld.gdi, grav + GrantConditionOnDamageState@SmokeTrail: + Condition: enable-smoke + Encyclopedia: + Category: Allies/Aircraft HIND: Inherits: ^Helicopter Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove Buildable: - Queue: Aircraft + Queue: AircraftSQ, AircraftMQ BuildAtProductionType: Helicopter - BuildPaletteOrder: 20 - Prerequisites: ~hpad, ~aircraft.soviet, ~techlevel.medium - Description: Helicopter gunship armed\nwith dual chainguns.\n Strong vs Infantry, Light Armor, Buildings\n Weak vs Tanks, Defenses, Aircraft + BuildPaletteOrder: 32 + Prerequisites: afld, ~aircraft.soviet, ~techlevel.medium + Description: Durable helicopter gunship armed with a chaingun and rockets. + TooltipExtras: + Strengths: • Strong vs Infantry, Heavy Armor, Light Armor + Weaknesses: • Weak vs Defenses\n• Cannot attack Aircraft Valued: - Cost: 1400 + Cost: 1600 Tooltip: Name: Hind UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 25000 + HP: 34000 RevealsShroud: - Range: 10c0 - MinRange: 8c0 + Range: 11c0 + MinRange: 9c0 Type: GroundPosition RevealGeneratedShroud: False RevealsShroud@GAPGEN: - Range: 8c0 + Range: 9c0 Type: GroundPosition Armament@PRIMARY: Weapon: ChainGun - LocalOffset: 85,-213,-185, 85,213,-185 + LocalOffset: 500,0,-250 MuzzleSequence: muzzle PauseOnCondition: !ammo + Armament@SECONDARY: + Name: secondary + Weapon: HindRockets + LocalOffset: 85,-213,-185, 85,213,-185 + PauseOnCondition: !ammo2 + RequiresCondition: !rocketpods-upgrade + ReloadingCondition: rockets-reloading + AmmoUsage: 3 + Armament@SECONDARYUPG: + Name: secondary-upg + Weapon: HindRockets.UPG + LocalOffset: 85,-213,-185, 85,213,-185 + PauseOnCondition: !ammo2 || rockets-reloading + RequiresCondition: rocketpods-upgrade + AmmoUsage: 2 + WithEjectedCasings: + CasingWeapon: BrassDebrisAir + CasingSpawnLocalOffset: 400,-225,0 + CasingTargetOffset: 400, -300, 0 + ArmamentNames: primary AttackAircraft: FacingTolerance: 80 AttackType: Hover PersistentTargeting: false OpportunityFire: false - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded + Armaments: primary, secondary, secondary-upg Aircraft: TurnSpeed: 16 - Speed: 135 - TakeoffSounds: htoff1.aud - LandingSounds: hland1.aud + Speed: 112 + TakeoffSounds: vhelistaa.aud + LandingSounds: vhelilana.aud AutoTarget: InitialStance: HoldFire InitialStanceAI: AttackAnything WithIdleOverlay@ROTORAIR: Sequence: rotor + PauseOnCondition: being-warped RequiresCondition: airborne WithIdleOverlay@ROTORGROUND: Sequence: slow-rotor + PauseOnCondition: being-warped RequiresCondition: !airborne - AmmoPool: - Ammo: 24 - ReloadDelay: 8 + AmmoPool@PRIMARY: + Name: primary + Ammo: 10 + ReloadDelay: 14 AmmoCondition: ammo - WithAmmoPipsDecoration: + Armaments: primary + AmmoPool@SECONDARY: + Name: secondary + Ammo: 36 + ReloadDelay: 4 + AmmoCondition: ammo2 + Armaments: secondary, secondary-upg + WithAmmoPipsDecoration@PRIMARY: Position: BottomLeft Margin: 4, 3 RequiresSelection: true + AmmoPools: primary + PipCount: 5 + WithAmmoPipsDecoration@SECONDARY: + Position: BottomLeft + Margin: 4, 7 + RequiresSelection: true + AmmoPools: secondary + FullSequence: pip-red PipCount: 6 WithMuzzleOverlay: SpawnActorOnDeath: @@ -705,18 +1310,35 @@ HIND: SpawnActorOnDeath@EmptyEMP: Actor: HIND.Husk.empty.EMP RequiresCondition: !ammo && empdisable && !being-warped - SmokeTrailWhenDamaged: - Offset: -427,0,0 + LeavesTrails: + Offsets: -427,0,0 + Image: smokey + MovingInterval: 3 + StationaryInterval: 3 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RequiresCondition: enable-smoke ProducibleWithLevel: Prerequisites: aircraft.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: aircraft.upgraded Selectable: - DecorationBounds: 38,32 + DecorationBounds: 1621, 1365 Rearmable: - RearmActors: hpad, hpad.td + AmmoPools: primary, secondary + RearmActors: hpad, hpad.td, afld, afld.gdi, grav + GrantConditionOnDamageState@SmokeTrail: + Condition: enable-smoke + GrantConditionOnPrerequisite@RocketPods: + Prerequisites: rocketpods.upgrade + Condition: rocketpods-upgrade + Encyclopedia: + Category: Soviets/Aircraft U2: Inherits: ^NeutralPlane - Inherits@EMP: ^EmpDisable Health: HP: 200000 Tooltip: @@ -728,6 +1350,7 @@ U2: Repulsable: False MaximumPitch: 56 AttackBomber: + FacingTolerance: 8 Armament: Weapon: U2Camera -Selectable: @@ -739,100 +1362,144 @@ U2: Offset: -725,-683,0 Contrail@AB1: Offset: -400,-70,-20 - UsePlayerColor: false + StartColorUsePlayerColor: false ZOffset: -512 - Color: cc550080 + StartColor: cc550080 + StartColorAlpha: 128 TrailLength: 10 Contrail@AB2: Offset: -400,70,-20 - UsePlayerColor: false + StartColorUsePlayerColor: false ZOffset: -512 - Color: cc550080 + StartColor: cc550080 + StartColorAlpha: 128 TrailLength: 10 - SpawnActorOnDeath: - Actor: U2.Husk - RequiresCondition: !empdisable - SpawnActorOnDeath@EMP: - Actor: U2.Husk.EMP - RequiresCondition: empdisable - SmokeTrailWhenDamaged: - Offset: -1c43,0,0 - Interval: 2 + LeavesTrails: + Offsets: -1c43,0,0 + MovingInterval: 2 + Image: smokey + StationaryInterval: 2 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RequiresCondition: enable-smoke RejectsOrders: Interactable: + -SpawnActorOnDeath: -MapEditorData: + GrantConditionOnDamageState@SmokeTrail: + Condition: enable-smoke + EjectOnDeath: + ChuteSound: gejecta.aud + +U2.KillZone: + Inherits: U2 + RenderSprites: + Image: u2 + Armament: + Weapon: KillZoneSpawner + Armament@Flare1: + Weapon: KillZoneFlare + Armament@Flare2: + Weapon: KillZoneFlare2 + Armament@Flare3: + Weapon: KillZoneFlare3 + AttackBomber: + FacingTolerance: 512 -U2.Bomber: +SMIG: Inherits: ^NeutralPlane Inherits@EMP: ^EmpDisable RenderSprites: - Image: U2 + Image: SMIG Health: - HP: 30000 + HP: 40000 Tooltip: Name: Supersonic Bomber Armor: - Type: Heavy + Type: Aircraft Aircraft: CruiseAltitude: 2260 - TurnSpeed: 20 - Speed: 343 + TurnSpeed: 12 + Speed: 473 Repulsable: False MaximumPitch: 56 -Selectable: -SelectionDecorations: -Voiced: Contrail@1: - Offset: -725,683,0 + Offset: -700,683,-100 Contrail@2: - Offset: -725,-683,0 + Offset: -700,-683,-100 Contrail@AB1: Offset: -400,-70,-20 - UsePlayerColor: false + StartColorUsePlayerColor: false ZOffset: -512 - Color: cc550080 + StartColor: cc550080 + StartColorAlpha: 128 TrailLength: 10 Contrail@AB2: Offset: -400,70,-20 - UsePlayerColor: false + StartColorUsePlayerColor: false ZOffset: -512 - Color: cc550080 + StartColor: cc550080 + StartColorAlpha: 128 TrailLength: 10 AttackAircraft: FacingTolerance: 80 PersistentTargeting: false OpportunityFire: false Armament: - Weapon: U2Bomb + Weapon: SMIGBomb AmmoPool: Ammo: 1 AirstrikeSlave: - LandingDistance: 1c0 SpawnActorOnDeath: - Actor: U2.Husk + Actor: SMIG.Husk RequiresCondition: !empdisable SpawnActorOnDeath@EMP: - Actor: U2.Husk.EMP + Actor: SMIG.Husk.EMP RequiresCondition: empdisable - SmokeTrailWhenDamaged: - Offset: -1c43,0,0 - Interval: 2 + LeavesTrails: + Offsets: -1c43,0,0 + MovingInterval: 2 + Image: smokey + StationaryInterval: 2 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RequiresCondition: enable-smoke RejectsOrders: Interactable: Rearmable: RearmActors: bori -ActorLostNotification: + -MapEditorData: + GrantConditionOnDamageState@SmokeTrail: + Condition: enable-smoke + GivesExperienceToMaster: + EjectOnDeath: + ChuteSound: gejecta.aud + WithEnterExitWorldOverlay: + Image: smigboom + EnterSequence: enter + ExitSequence: exit + Palette: effect A10: Inherits: ^PlaneTD Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove + Inherits@UpgradeOverlay: ^UpgradeOverlay Buildable: - Queue: Aircraft + Queue: AircraftSQ, AircraftMQ BuildAtProductionType: Plane - BuildPaletteOrder: 80 - Prerequisites: ~afld.gdi, ~aircraft.gdi, ~techlevel.high + BuildPaletteOrder: 41 + Prerequisites: afld.gdi, ~aircraft.gdi, ~!sidewinders.upgrade, ~!avenger.upgrade, ~techlevel.medium IconPalette: chrometd - Description: Ground attack aircraft with incendiary bombs.\n Strong vs Buildings, Light Armor, Infantry\n Weak vs Aircraft + Description: Attack aircraft armed with incendiary bombs. + TooltipExtras: + Strengths: • Strong vs Buildings, Infantry, Light Armor + Weaknesses: • Weak vs Heavy Armor, Defenses\n• Cannot attack Aircraft Valued: Cost: 2000 Tooltip: @@ -840,24 +1507,32 @@ A10: UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 25000 + HP: 30000 RevealsShroud: - Range: 10c0 - MinRange: 8c0 + Range: 11c0 + MinRange: 9c0 Type: GroundPosition RevealGeneratedShroud: False RevealsShroud@GAPGEN: - Range: 8c0 + Range: 9c0 Type: GroundPosition - Armament: + Armament@PRIMARYBLD: + Weapon: NapalmTDBuilding + LocalOffset: 2,-256,-43, 2,256,-43 + PauseOnCondition: !ammo || blinded + Name: primarybld + Armament@PRIMARY: Weapon: NapalmTD LocalOffset: 2,-256,-43, 2,256,-43 - PauseOnCondition: !ammo - AttackAircraft: + PauseOnCondition: !ammo || blinded + AttackAircraftCA: FacingTolerance: 512 PersistentTargeting: false OpportunityFire: true PauseOnCondition: empdisable || being-warped + Armaments: primary, primarybld + AttackType: Strafe + StrafeRunLength: 7c0 Aircraft: CruiseAltitude: 2560 InitialFacing: 192 @@ -865,25 +1540,28 @@ A10: Speed: 180 RepulsionSpeed: 40 MaximumPitch: 56 - TakeoffSounds: migtoff1.aud + TakeoffSounds: migtoff1.aud, cjetbanb.aud, cjetbanc.aud AutoTarget: InitialStance: HoldFire InitialStanceAI: AttackAnything - AmmoPool: + AmmoPool@PRIMARY: + Name: primary Ammo: 7 - ReloadDelay: 35 + ReloadDelay: 25 AmmoCondition: ammo - WithAmmoPipsDecoration: + Armaments: primary + WithAmmoPipsDecoration@PRIMARY: Position: BottomLeft Margin: 4, 3 RequiresSelection: true + AmmoPools: primary Selectable: - Bounds: 36,28,0,2 - DecorationBounds: 40,29,0,1 + Bounds: 1536, 1194, 0, 85 + DecorationBounds: 1706, 1237, 0, 42 Contrail@1: - Offset: -258,-823,0 + Offset: -228,-850,-50 Contrail@2: - Offset: -258,823,0 + Offset: -228,850,-50 SpawnActorOnDeath: Actor: A10.Husk RequiresCondition: airborne && ammo && !empdisable && !being-warped @@ -896,35 +1574,237 @@ A10: SpawnActorOnDeath@EmptyEMP: Actor: A10.Husk.empty.EMP RequiresCondition: airborne && !ammo && empdisable && !being-warped - SmokeTrailWhenDamaged: - Offset: -853,0,171 - Interval: 2 + LeavesTrails: + Offsets: -853,0,171 + MovingInterval: 2 + Image: smokey + StationaryInterval: 2 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RequiresCondition: enable-smoke ProducibleWithLevel: Prerequisites: aircraft.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: aircraft.upgraded Rearmable: RearmActors: afld, afld.gdi + AmmoPools: primary, upgrade -RangeMultiplier@SEEK: -RangeMultiplier@SEEK2: -RangeMultiplier@SEEK3: + -ReloadDelayMultiplier@BOMBARD: + -ReloadDelayMultiplier@BOMBARD2: + -ReloadDelayMultiplier@BOMBARD3: RangeMultiplier@BOMBING: Modifier: 600 RequiresCondition: bombing-run GrantConditionOnAttack@BOMBING: Condition: bombing-run RevokeDelay: 7 + GrantConditionOnDamageState@SmokeTrail: + Condition: enable-smoke + EjectOnDeath: + ChuteSound: gejecta.aud + GrantConditionOnPrerequisite@Sidewinders: + Condition: sidewinders-upgrade + Prerequisites: sidewinders.upgrade + GrantConditionOnPrerequisite@Avenger: + Condition: avenger-upgrade + Prerequisites: avenger.upgrade + GrantConditionOnPrerequisite@Ceramic: + Condition: ceramic-upgrade + Prerequisites: ceramic.upgrade + TransformOnCondition@Sidewinders: + IntoActor: a10.sw + RequiresCondition: sidewinders-upgrade && upgrade-complete + TransformOnCondition@Avenger: + IntoActor: a10.gau + RequiresCondition: avenger-upgrade && upgrade-complete + AmmoPool@Upgrade: + Name: upgrade + Ammo: 1 + ReloadDelay: 200 + AmmoCondition: resupplied-for-upgrade + ReloadAmmoPoolCA@Upgrade: + AmmoPool: upgrade + Delay: 5 + Count: -1 + RequiresCondition: airborne && (sidewinders-upgrade || avenger-upgrade) + ShowSelectionBar: false + GrantCondition@Upgrade: + Condition: upgrade-complete + RequiresCondition: !airborne && resupplied-for-upgrade && (sidewinders-upgrade || avenger-upgrade) + ReturnsToBaseOnAmmoDepleted: + ReplacedInQueue: + Actors: a10.sw, a10.gau + WithDecoration@UpgradeOverlay: + RequiresCondition: !airborne && !resupplied-for-upgrade && (sidewinders-upgrade || avenger-upgrade) + DamageMultiplier@Ceramic: + Modifier: 85 + RequiresCondition: ceramic-upgrade + Encyclopedia: + Category: GDI/Aircraft + +A10.SW: + Inherits: A10 + Inherits@AUTOTARGET: ^AutoTargetAllAssaultMovePrioritizeAir + -GrantConditionOnPrerequisite@Sidewinders: + -GrantConditionOnPrerequisite@Avenger: + -TransformOnCondition@Sidewinders: + -TransformOnCondition@Avenger: + -AmmoPool@Upgrade: + -ReloadAmmoPoolCA@Upgrade: + -GrantCondition@Upgrade: + -WithDecoration@UpgradeOverlay: + -ReplacedInQueue: + RenderSprites: + Image: a10 + Buildable: + Prerequisites: afld.gdi, ~aircraft.gdi, ~sidewinders.upgrade, ~techlevel.medium + Description: Attack aircraft armed with incendiary bombs and air-to-air missiles. + BuildPaletteOrder: 42 + TooltipExtras: + Strengths: • Strong vs Buildings, Infantry, Light Armor, Aircraft + Weaknesses: • Weak vs Heavy Armor, Defenses + Armament@SECONDARY: + Name: secondary + Weapon: Sidewinder + LocalOffset: 0,500,-85, 0,-500,-85 + PauseOnCondition: !ammo2 || bombing-run || blinded + AttackAircraftCA: + Armaments: primary, primarybld, secondary + AirFacingTolerance: 80 + -AttackType: + -StrafeRunLength: + Rearmable: + AmmoPools: primary, secondary + AmmoPool@SECONDARY: + Name: secondary + Ammo: 4 + ReloadDelay: 40 + AmmoCondition: ammo2 + Armaments: secondary + WithAmmoPipsDecoration@SECONDARY: + Position: BottomLeft + Margin: 4, 7 + RequiresSelection: true + AmmoPools: secondary + FullSequence: pip-red + AutoTargetPriority@DEFAULT: + RequiresCondition: ammo && ammo2 + AutoTargetPriority@ATTACKANYTHING: + RequiresCondition: (stance-attackanything || assault-move) && ammo && ammo2 + AutoTargetPriority@DEFAULTGROUND: + RequiresCondition: ammo && !ammo2 + ValidTargets: Infantry, Vehicle, Water, Underwater, Defense + InvalidTargets: NoAutoTarget, AntiAirDefense + AutoTargetPriority@ATTACKANYTHINGGROUND: + RequiresCondition: (stance-attackanything || assault-move) && ammo && !ammo2 + ValidTargets: Structure, AntiAirDefense + InvalidTargets: NoAutoTarget + AutoTargetPriority@DEFAULTAIR: + RequiresCondition: !ammo && ammo2 + ValidTargets: Air, AirSmall + InvalidTargets: NoAutoTarget + EncyclopediaExtras: + Name: Sidewinder Warthog + VariantOf: A10 + +A10.GAU: + Inherits: A10 + -Armament@PRIMARY: + -Armament@PRIMARYBLD: + -AmmoPool@PRIMARY: + -RangeMultiplier@BOMBING: + -GrantConditionOnAttack@BOMBING: + -GrantConditionOnPrerequisite@Sidewinders: + -GrantConditionOnPrerequisite@Avenger: + -TransformOnCondition@Sidewinders: + -TransformOnCondition@Avenger: + -AmmoPool@Upgrade: + -ReloadAmmoPoolCA@Upgrade: + -GrantCondition@Upgrade: + -WithDecoration@UpgradeOverlay: + -ReplacedInQueue: + Buildable: + Prerequisites: afld.gdi, ~aircraft.gdi, ~avenger.upgrade, ~techlevel.medium + Description: Attack aircraft armed with a rotary cannon and rockets. + BuildPaletteOrder: 42 + TooltipExtras: + Strengths: • Strong vs Buildings, Infantry, Light Armor + Weaknesses: • Cannot attack Aircraft + Rearmable: + AmmoPools: primary, secondary + RenderSprites: + Image: a10 + Armament@PRIMARY: + Weapon: GAU8 + MuzzleSequence: muzzle + LocalOffset: 760,0,-120 + PauseOnCondition: !ammo || blinded + Armament@PRIMARYBLD: + Name: primarybld + Weapon: GAU8.Building + MuzzleSequence: muzzle + LocalOffset: 760,0,-120 + PauseOnCondition: !ammo || blinded + Armament@SECONDARYR: + Name: secondary + Weapon: Hydra.R + LocalOffset: 0,-613,0 + PauseOnCondition: !ammo2 || blinded + Armament@SECONDARYL: + Name: secondary + FireDelay: 4 + Weapon: Hydra.L + LocalOffset: 0,613,0 + PauseOnCondition: !ammo2 || blinded + AttackAircraftCA: + FacingTolerance: 80 + Armaments: primary, primarybld, secondary + AttackType: Strafe + AmmoPool@PRIMARY: + Name: primary + Ammo: 30 + ReloadDelay: 10 + AmmoCondition: ammo + Armaments: primary + AmmoPool@SECONDARY: + Name: secondary + Ammo: 24 + ReloadDelay: 12 + AmmoCondition: ammo2 + Armaments: secondary + WithAmmoPipsDecoration@PRIMARY: + PipCount: 3 + WithAmmoPipsDecoration@SECONDARY: + PipCount: 7 + Position: BottomLeft + Margin: 4, 7 + RequiresSelection: true + AmmoPools: secondary + FullSequence: pip-red + WithMuzzleOverlay: + EncyclopediaExtras: + Name: Avenger Warthog + VariantOf: A10 A10.bomber: Inherits: ^NeutralPlane Inherits@EMP: ^EmpDisable + Inherits@TDPAL: ^TDPalette Tooltip: Name: Warthog Health: HP: 36000 Armament: - Weapon: NapalmTD - LocalOffset: 0,-256,-43, 0,256,-43 + Weapon: NapalmTDBomber + LocalOffset: 2,-256,-43, 2,256,-43 PauseOnCondition: !ammo - AttackBomber: + AttackBomberCA: + FacingTolerance: 512 Aircraft: CruiseAltitude: 2560 InitialFacing: 192 @@ -940,9 +1820,9 @@ A10.bomber: -Voiced: RenderSprites: Image: a10 - PlayerPalette: overlayplayertd EjectOnDeath: PilotActor: N1 + ChuteSound: gejecta.aud RejectsOrders: Contrail@1: Offset: -258,-823,0 @@ -960,26 +1840,32 @@ A10.bomber: SpawnActorOnDeath@EmptyEMP: Actor: A10.Husk.empty.EMP RequiresCondition: airborne && !ammo && empdisable - SmokeTrailWhenDamaged: - Offset: -853,0,171 - Interval: 2 + LeavesTrails: + Offsets: -853,0,171 + MovingInterval: 2 + Image: smokey + StationaryInterval: 2 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RequiresCondition: enable-smoke Interactable: - GivesExperience: + GivesExperienceCA: Experience: 1000 + GrantConditionOnDamageState@SmokeTrail: + Condition: enable-smoke C17: Inherits: ^NeutralPlane + Inherits@TDPAL: ^TDPalette Inherits@EMP: ^EmpDisable - RenderSprites: - PlayerPalette: overlayplayertd - -EjectOnDeath: ParaDrop: DropRange: 4c0 ChuteSound: chute1.aud Health: HP: 40000 Armor: - Type: Heavy + Type: Aircraft Aircraft: CruiseAltitude: 2560 TurnSpeed: 20 @@ -997,40 +1883,58 @@ C17: Contrail@1: Offset: -261,-650,0 TrailLength: 15 - UsePlayerColor: false - Color: FFFFFF80 + StartColorUsePlayerColor: false + StartColor: FFFFFF80 + StartColorAlpha: 96 Contrail@2: Offset: -85,-384,0 TrailLength: 16 - UsePlayerColor: false - Color: FFFFFF80 + StartColorUsePlayerColor: false + StartColor: FFFFFF80 + StartColorAlpha: 96 Contrail@3: Offset: -85,384,0 TrailLength: 16 - UsePlayerColor: false - Color: FFFFFF80 + StartColorUsePlayerColor: false + StartColor: FFFFFF80 + StartColorAlpha: 96 Contrail@4: Offset: -261,650,0 TrailLength: 15 - UsePlayerColor: false - Color: FFFFFF80 + StartColorUsePlayerColor: false + StartColor: FFFFFF80 + StartColorAlpha: 96 SpawnActorOnDeath: Actor: C17.Husk RequiresCondition: !empdisable SpawnActorOnDeath@EMP: Actor: C17.Husk.EMP RequiresCondition: empdisable - SmokeTrailWhenDamaged@0: - Offset: -432,560,0 - Interval: 2 - SmokeTrailWhenDamaged@1: - Offset: -432,-560,0 - Interval: 2 + LeavesTrails@0: + Offsets: -432,560,0 + MovingInterval: 2 + Image: smokey + StationaryInterval: 2 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RequiresCondition: enable-smoke + LeavesTrails@1: + Offsets: -432,-560,0 + MovingInterval: 2 + Image: smokey + StationaryInterval: 2 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RequiresCondition: enable-smoke RejectsOrders: Interactable: - GivesExperience: + GivesExperienceCA: Experience: 1000 -MapEditorData: + GrantConditionOnDamageState@SmokeTrail: + Condition: enable-smoke C17.Cargo: Inherits: C17 @@ -1039,12 +1943,19 @@ C17.Cargo: Aircraft: Speed: 266 TurnSpeed: 26 + IdleTurnSpeed: 6 + Crushes: wall -Targetable@AIRBORNE: DynamicSpeedMultiplier: + Targetable@CARGOPLANE: + TargetTypes: CargoPlane + DoesNotBlock: + TargetTypes: CargoPlane C17.Clustermines: Inherits: C17 AttackBomber: + FacingTolerance: 8 Armament: Weapon: ClusterMineSpawner AmmoPool: @@ -1062,9 +1973,95 @@ C17.XO: ParaDrop: ChuteSound: xo-descent.aud +GALX: + Inherits: C17 + RenderSprites: + Image: galx + Tooltip: + Name: Heavy Transport Aircraft + Health: + HP: 90000 + Aircraft: + Speed: 266 + TurnSpeed: 26 + DynamicSpeedMultiplier: + SpawnActorOnDeath: + Actor: GALX.Husk + RequiresCondition: !empdisable + SpawnActorOnDeath@EMP: + Actor: GALX.Husk.EMP + RequiresCondition: empdisable + +GALX.Helios: + Inherits: GALX + AttackBomber: + FacingTolerance: 8 + Armament: + Weapon: HeliosBomb + AmmoPool: + Ammo: 1 + RenderSprites: + Image: galx + +ANTO: + Inherits: C17 + RenderSprites: + Image: anto + PlayerPalette: player + Tooltip: + Name: Heavy Transport Aircraft + Health: + HP: 90000 + Aircraft: + Speed: 266 + TurnSpeed: 26 + DynamicSpeedMultiplier: + SpawnActorOnDeath: + Actor: ANTO.Husk + RequiresCondition: !empdisable + SpawnActorOnDeath@EMP: + Actor: ANTO.Husk.EMP + RequiresCondition: empdisable + Contrail@1: + Offset: -261,-650,0 + TrailLength: 15 + StartColorUsePlayerColor: false + StartColor: FFFFFF80 + StartColorAlpha: 96 + Contrail@2: + Offset: -85,-384,0 + TrailLength: 16 + StartColorUsePlayerColor: false + StartColor: FFFFFF80 + StartColorAlpha: 96 + Contrail@3: + Offset: -85,384,0 + TrailLength: 16 + StartColorUsePlayerColor: false + StartColor: FFFFFF80 + StartColorAlpha: 96 + Contrail@4: + Offset: -261,650,0 + TrailLength: 15 + StartColorUsePlayerColor: false + StartColor: FFFFFF80 + StartColorAlpha: 96 + Contrail@5: + Offset: -400,-925,0 + TrailLength: 16 + StartColorUsePlayerColor: false + StartColor: FFFFFF80 + StartColorAlpha: 96 + Contrail@6: + Offset: -400,925,0 + TrailLength: 15 + StartColorUsePlayerColor: false + StartColor: FFFFFF80 + StartColorAlpha: 96 + APCH: Inherits: ^HelicopterTD - Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove + Inherits@AUTOTARGET: ^AutoTargetAllAssaultMovePrioritizeAir Valued: Cost: 1400 Tooltip: @@ -1072,42 +2069,55 @@ APCH: UpdatesPlayerStatistics: AddToArmyValue: true Buildable: - Queue: Aircraft + Queue: AircraftSQ, AircraftMQ BuildAtProductionType: Helicopter - BuildPaletteOrder: 30 - Prerequisites: ~hpad.td, ~aircraft.apch, ~techlevel.medium + BuildPaletteOrder: 50 + Prerequisites: ~aircraft.apch, ~techlevel.medium IconPalette: chrometd - Description: Helicopter gunship with a chaingun.\n Strong vs Infantry, Light Armor, Buildings\n Weak vs Tanks, Defenses, Aircraft + Description: Helicopter gunship armed with a chaingun. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor, Aircraft + Weaknesses: • Weak vs Heavy Armor, Defenses Aircraft: AltitudeVelocity: 0c100 - TurnSpeed: 16 - Speed: 157 - TakeoffSounds: htoff1.aud - LandingSounds: hland1.aud + TurnSpeed: 22 + Speed: 168 + TakeoffSounds: vhelistaa.aud + LandingSounds: vhelilana.aud Health: - HP: 20000 + HP: 15000 RevealsShroud: - Range: 10c0 - MinRange: 8c0 + Range: 11c0 + MinRange: 9c0 Type: GroundPosition RevealGeneratedShroud: False RevealsShroud@GAPGEN: - Range: 8c0 + Range: 9c0 Type: GroundPosition Armament@PRIMARY: Weapon: HeliGunAG - LocalOffset: 228,0,-85 + LocalOffset: 350,0,-150 + MuzzleSequence: muzzle + PauseOnCondition: !ammo + Armament@SECONDARY: + Weapon: HeliGunAA + LocalOffset: 350,0,-150 MuzzleSequence: muzzle PauseOnCondition: !ammo + WithEjectedCasings: + CasingWeapon: BrassDebrisAir + CasingSpawnLocalOffset: 400,-225,0 + CasingTargetOffset: 400, -300, 0 + ArmamentNames: primary AttackAircraft: FacingTolerance: 80 AttackType: Hover PersistentTargeting: false OpportunityFire: false - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded AmmoPool: Ammo: 12 - ReloadDelay: 16 + ReloadDelay: 10 AmmoCondition: ammo WithAmmoPipsDecoration: Position: BottomLeft @@ -1117,10 +2127,12 @@ APCH: WithIdleOverlay@ROTORAIR: Offset: 0,0,85 Sequence: rotor + PauseOnCondition: being-warped RequiresCondition: airborne WithIdleOverlay@ROTORGROUND: Offset: 0,0,85 Sequence: slow-rotor + PauseOnCondition: being-warped RequiresCondition: !airborne WithMuzzleOverlay: AutoTarget: @@ -1138,18 +2150,32 @@ APCH: SpawnActorOnDeath@EmptyEMP: Actor: APCH.Husk.empty.EMP RequiresCondition: !ammo && empdisable && !being-warped - SmokeTrailWhenDamaged: - Offset: -427,0,0 + LeavesTrails: + Offsets: -427,0,0 + Image: smokey + MovingInterval: 3 + StationaryInterval: 3 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RequiresCondition: enable-smoke Selectable: - DecorationBounds: 30,24 + DecorationBounds: 1280, 1024 Rearmable: - RearmActors: hpad, hpad.td + RearmActors: hpad, hpad.td, afld, afld.gdi, grav ProducibleWithLevel: Prerequisites: aircraft.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: aircraft.upgraded + GrantConditionOnDamageState@SmokeTrail: + Condition: enable-smoke + Encyclopedia: + Category: Nod/Aircraft ORCA: Inherits: ^HelicopterTD - Inherits@AUTOTARGET: ^AutoTargetAllAssaultMove + Inherits@AUTOTARGET: ^AutoTargetAllAssaultMovePrioritizeAir Valued: Cost: 1500 Tooltip: @@ -1157,27 +2183,30 @@ ORCA: UpdatesPlayerStatistics: AddToArmyValue: true Buildable: - Queue: Aircraft + Queue: AircraftSQ, AircraftMQ BuildAtProductionType: Helicopter - BuildPaletteOrder: 50 - Prerequisites: ~hpad.td, ~aircraft.gdi, ~techlevel.high + BuildPaletteOrder: 40 + Prerequisites: afld.gdi, ~aircraft.gdi, ~techlevel.medium IconPalette: chrometd - Description: VTOL gunship armed\nwith multi-purpose missiles.\n Strong vs Vehicles, Aircraft\n Weak vs Infantry + Description: VTOL gunship armed with multi-purpose missiles. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Defenses, Aircraft + Weaknesses: • Weak vs Infantry Aircraft: AltitudeVelocity: 0c100 - TurnSpeed: 20 + TurnSpeed: 22 TakeoffSounds: orcaup1.aud LandingSounds: orcadwn1.aud Speed: 180 Health: HP: 19000 RevealsShroud: - Range: 10c0 - MinRange: 8c0 + Range: 11c0 + MinRange: 9c0 Type: GroundPosition RevealGeneratedShroud: False RevealsShroud@GAPGEN: - Range: 8c0 + Range: 9c0 Type: GroundPosition Armament@PRIMARY: Weapon: HellfireAG.Orca @@ -1192,11 +2221,12 @@ ORCA: AttackType: Hover PersistentTargeting: false OpportunityFire: false - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded AmmoPool: Ammo: 8 ReloadCount: 2 AmmoCondition: ammo + ReloadDelay: 35 WithAmmoPipsDecoration: Position: BottomLeft Margin: 4, 3 @@ -1217,17 +2247,80 @@ ORCA: AutoTarget: InitialStance: HoldFire InitialStanceAI: AttackAnything - SmokeTrailWhenDamaged: - Offset: -427,0,0 - Interval: 2 + LeavesTrails: + Offsets: -427,0,0 + MovingInterval: 2 + Image: smokey + StationaryInterval: 2 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RequiresCondition: enable-smoke WithMoveAnimation: MoveSequence: move + RequiresCondition: (!abur-upgrade || !afterburner || !attacking) && moving + WithMoveAnimation@AFTERBURNER: + MoveSequence: move-afterburner + RequiresCondition: abur-upgrade && afterburner && attacking && moving Selectable: - DecorationBounds: 30,24 + DecorationBounds: 1280, 1024 Rearmable: - RearmActors: hpad, hpad.td + RearmActors: hpad, hpad.td, afld, afld.gdi, grav ProducibleWithLevel: Prerequisites: aircraft.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: aircraft.upgraded + GrantConditionOnOrders@ATTACKING: + Condition: attacking + OrderNames: Attack, ForceAttack, AttackMove + GrantConditionOnMovement@MOVING: + ValidMovementTypes: Vertical, Horizontal + Condition: moving + SpeedMultiplier@AFTERBURNER: + Modifier: 133 + RequiresCondition: abur-upgrade && afterburner && attacking && moving + Contrail@AB1: + Offset: -300,-150,-70 + StartColorUsePlayerColor: false + ZOffset: -512 + StartColor: cc550080 + StartColorAlpha: 128 + TrailLength: 10 + RequiresCondition: abur-upgrade && afterburner && attacking && moving + Contrail@AB2: + Offset: -300,150,-70 + StartColorUsePlayerColor: false + ZOffset: -512 + StartColor: cc550080 + StartColorAlpha: 128 + TrailLength: 10 + RequiresCondition: abur-upgrade && afterburner && attacking && moving + GrantThermalCondition@AFTERBURNER: + Condition: afterburner + PauseOnCondition: (!attacking || !moving) + RequiresCondition: abur-upgrade + MaxTemp: 360 + MaxReactivationTemp: 360 + HeatingRate: 2 + CoolingRate: 1 + ShowSelectionBarWhenEmpty: false + GrantConditionOnPrerequisite@AFTERBURNER: + Condition: abur-upgrade + Prerequisites: abur.upgrade + AmbientSoundCA: + SoundFiles: vb3blo2a.aud, vb3blo2b.aud, vb3blo2c.aud + Interval: 2 + VolumeMultiplier: 0.1 + RequiresCondition: abur-upgrade && afterburner && attacking && moving + GrantConditionOnDamageState@SmokeTrail: + Condition: enable-smoke + SoundOnDamageTransitionCA: + DestroyedSounds: vcomdi1a.aud, vcomdi2a.aud + EjectOnDeath: + ChuteSound: gejecta.aud + Encyclopedia: + Category: GDI/Aircraft ORCB: Inherits: ^HelicopterTD @@ -1235,40 +2328,52 @@ ORCB: RenderSprites: Image: orcab Buildable: - Queue: Aircraft + Queue: AircraftSQ, AircraftMQ BuildAtProductionType: Helicopter - BuildPaletteOrder: 130 - Prerequisites: ~hpad.td, ~aircraft.gdi, gtek, ~techlevel.high + BuildPaletteOrder: 90 + Prerequisites: afld.gdi, ~aircraft.gdi, gtek, ~techlevel.high IconPalette: chrometd - Description: VTOL bomber armed with EMP bombs.\n Strong vs Buildings, Vehicles\n Weak vs Aircraft + Description: Heavy VTOL bomber armed with EMP bombs. + TooltipExtras: + Strengths: • Strong vs Defenses, Heavy Armor, Light Armor + Weaknesses: • Weak vs Infantry\n• Cannot attack Aircraft + Attributes: • Disables vehicles, defenses and buildings Valued: - Cost: 1700 + Cost: 2000 Tooltip: Name: Orca Bomber + GenericName: Aircraft UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 22500 + HP: 32000 RevealsShroud: - Range: 10c0 - MinRange: 8c0 + Range: 11c0 + MinRange: 9c0 Type: GroundPosition RevealGeneratedShroud: False RevealsShroud@GAPGEN: - Range: 8c0 + Range: 9c0 Type: GroundPosition - Armament: + Armament@PRIMARYBLD: + Weapon: OrcaBombBuilding + LocalOffset: 2,-256,-43, 2,256,-43 + PauseOnCondition: !ammo || blinded + Name: primarybld + Armament@PRIMARY: Weapon: OrcaBomb LocalOffset: 2,-256,-43, 2,256,-43 - PauseOnCondition: !ammo + PauseOnCondition: !ammo || blinded AttackAircraft: - FacingTolerance: 80 + FacingTolerance: 512 Voice: Attack AttackType: Strafe StrafeRunLength: 3c0 PersistentTargeting: false OpportunityFire: true PauseOnCondition: empdisable || being-warped + Armaments: primary, primarybld + ReturnsToBaseOnAmmoDepleted: Aircraft: CruiseAltitude: 2560 AltitudeVelocity: 0c120 @@ -1285,15 +2390,16 @@ ORCB: InitialStance: HoldFire InitialStanceAI: AttackAnything AmmoPool: - Ammo: 4 + Ammo: 6 AmmoCondition: ammo + ReloadDelay: 45 WithAmmoPipsDecoration: Position: BottomLeft Margin: 4, 3 RequiresSelection: true Selectable: - Bounds: 36,28,0,2 - DecorationBounds: 40,29,0,1 + Bounds: 1536, 1194, 0, 85 + DecorationBounds: 1706, 1237, 0, 42 SpawnActorOnDeath: Actor: ORCB.Husk RequiresCondition: ammo && !empdisable && !being-warped @@ -1306,30 +2412,93 @@ ORCB: SpawnActorOnDeath@EmptyEMP: Actor: ORCB.Husk.empty.EMP RequiresCondition: !ammo && empdisable && !being-warped - SmokeTrailWhenDamaged: - Offset: -853,0,171 - Interval: 2 + LeavesTrails: + Offsets: -853,0,171 + MovingInterval: 2 + Image: smokey + StationaryInterval: 2 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RequiresCondition: enable-smoke WithMoveAnimation: MoveSequence: move ProducibleWithLevel: Prerequisites: aircraft.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: aircraft.upgraded Rearmable: - RearmActors: hpad.td, hpad + RearmActors: hpad, hpad.td, afld, afld.gdi, grav Voiced: VoiceSet: OrcaVoice -RangeMultiplier@SEEK: -RangeMultiplier@SEEK2: -RangeMultiplier@SEEK3: + -ReloadDelayMultiplier@BOMBARD: + -ReloadDelayMultiplier@BOMBARD2: + -ReloadDelayMultiplier@BOMBARD3: + GrantConditionOnOrders@ATTACKING: + Condition: attacking + OrderNames: Attack, ForceAttack, AttackMove + GrantConditionOnMovement@MOVING: + ValidMovementTypes: Vertical, Horizontal + Condition: moving + SpeedMultiplier@AFTERBURNER: + Modifier: 133 + RequiresCondition: abur-upgrade && afterburner && attacking && moving + Contrail@AB1: + Offset: -300,-350,-70 + StartColorUsePlayerColor: false + ZOffset: -512 + StartColor: cc550080 + StartColorAlpha: 128 + TrailLength: 10 + RequiresCondition: abur-upgrade && afterburner && attacking && moving + Contrail@AB2: + Offset: -300,350,-70 + StartColorUsePlayerColor: false + ZOffset: -512 + StartColor: cc550080 + StartColorAlpha: 128 + TrailLength: 10 + RequiresCondition: abur-upgrade && afterburner && attacking && moving + GrantThermalCondition@AFTERBURNER: + Condition: afterburner + PauseOnCondition: (!attacking || !moving) + RequiresCondition: abur-upgrade + MaxTemp: 360 + MaxReactivationTemp: 360 + HeatingRate: 2 + CoolingRate: 1 + ShowSelectionBarWhenEmpty: false + GrantConditionOnPrerequisite@AFTERBURNER: + Condition: abur-upgrade + Prerequisites: abur.upgrade + AmbientSoundCA: + SoundFiles: vb3blo2a.aud, vb3blo2b.aud, vb3blo2c.aud + Interval: 2 + VolumeMultiplier: 0.1 + RequiresCondition: abur-upgrade && afterburner && attacking && moving + GrantConditionOnDamageState@SmokeTrail: + Condition: enable-smoke + SoundOnDamageTransitionCA: + DestroyedSounds: vcomdi1a.aud, vcomdi2a.aud + EjectOnDeath: + ChuteSound: gejecta.aud + Encyclopedia: + Category: GDI/Aircraft UAV: Inherits: ^NeutralPlane Inherits@EMP: ^EmpDisable + Inherits@TDPAL: ^TDPalette Health: - HP: 30000 + HP: 40000 Tooltip: Name: Recon Drone Armor: - Type: Heavy + Type: Aircraft Aircraft: CruiseAltitude: 2560 TurnSpeed: 28 @@ -1337,8 +2506,8 @@ UAV: Repulsable: False MaximumPitch: 56 AttackBomber: + FacingTolerance: 8 -Voiced: - -Targetable@AIRBORNE: -Selectable: SpawnActorOnDeath: Actor: UAV.Husk @@ -1346,26 +2515,32 @@ UAV: SpawnActorOnDeath@EMP: Actor: UAV.Husk.EMP RequiresCondition: empdisable - SmokeTrailWhenDamaged: - Offset: -1c43,0,0 - Interval: 2 + LeavesTrails: + Offsets: -1c43,0,0 + MovingInterval: 2 + Image: smokey + StationaryInterval: 2 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RequiresCondition: enable-smoke RejectsOrders: DetectCloaked: - CloakTypes: Cloak, Thief + Range: 5c0 + DetectionTypes: Cloak RevealsShroud: - Range: 14c0 - MinRange: 12c0 + Range: 12c0 + MinRange: 10c0 Type: GroundPosition RevealGeneratedShroud: False RevealsShroud@GAPGEN: - Range: 12c0 + Range: 10c0 Type: GroundPosition Interactable: - GivesExperience: + GivesExperienceCA: Experience: 1000 - RenderSprites: - PlayerPalette: overlayplayertd - -EjectOnDeath: + GrantConditionOnDamageState@SmokeTrail: + Condition: enable-smoke RAH: Inherits: ^HelicopterTD @@ -1373,27 +2548,30 @@ RAH: RenderSprites: Image: rah66 Buildable: - Queue: Aircraft + Queue: AircraftSQ, AircraftMQ BuildAtProductionType: Helicopter - BuildPaletteOrder: 60 + BuildPaletteOrder: 52 IconPalette: chrometd - Prerequisites: tmpl, ~hpad.td, ~aircraft.nod, ~techlevel.high - Description: Stealth attack helicopter.\n Strong vs Buildings, Light Armor, Infantry.\n Weak vs Aircraft + Prerequisites: tmpl, ~aircraft.nod, ~techlevel.high + Description: Stealth attack helicopter with powerful anti-personnel rockets. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor, Buildings + Weaknesses: • Weak vs Heavy Armor, Defenses\n• Cannot attack Aircraft Valued: - Cost: 1900 + Cost: 2000 Tooltip: Name: Comanche UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 18000 + HP: 16000 RevealsShroud: Range: 10c0 MinRange: 8c0 Type: GroundPosition RevealGeneratedShroud: False RevealsShroud@GAPGEN: - Range: 8c0 + Range: 10c0 Type: GroundPosition Armament@PRIMARY: Weapon: Rah66AG @@ -1411,22 +2589,29 @@ RAH: Voice: Attack PersistentTargeting: false OpportunityFire: false - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded Aircraft: AltitudeVelocity: 0c100 - TurnSpeed: 16 + TurnSpeed: 18 Speed: 157 - TakeoffSounds: htoff1.aud - LandingSounds: hland1.aud + TakeoffSounds: vhelistaa.aud + LandingSounds: vhelilana.aud Voice: Move Cloak@NORMAL: + DetectionTypes: AirCloak InitialDelay: 100 CloakDelay: 200 CloakSound: trans1.aud - UncloakSound: appear1.aud - Palette: cloak + UncloakSound: appear1md.aud + CloakStyle: Palette + CloakedPalette: cloak IsPlayerPalette: false - RequiresCondition: !cloak-force-disabled && airborne && !invisibility + UncloakOn: Attack, Damage, Heal + CloakedCondition: hidden + RequiresCondition: !cloak-force-disabled && airborne && !being-warped + PauseOnCondition: invisibility + GrantConditionOnResupply@DecloakOnResupply: + Condition: cloak-force-disabled GrantConditionOnDamageState@UNCLOAK: Condition: cloak-force-disabled ValidDamageStates: Critical @@ -1436,17 +2621,20 @@ RAH: WithIdleOverlay@ROTORAIR: Offset: 10,0,80 Sequence: rotor + PauseOnCondition: being-warped RequiresCondition: airborne Palette: player WithIdleOverlay@ROTORGROUND: Offset: 10,0,80 Sequence: slow-rotor + PauseOnCondition: being-warped RequiresCondition: !airborne Palette: player AmmoPool: Ammo: 8 AmmoCondition: ammo ReloadCount: 2 + ReloadDelay: 40 WithAmmoPipsDecoration: Position: BottomLeft Margin: 4, 3 @@ -1464,19 +2652,46 @@ RAH: SpawnActorOnDeath@EmptyEMP: Actor: RAH.Husk.empty.EMP RequiresCondition: !ammo && empdisable && !being-warped - SmokeTrailWhenDamaged: - Offset: -427,0,0 + LeavesTrails: + Offsets: -427,0,0 + Image: smokey + MovingInterval: 3 + StationaryInterval: 3 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RequiresCondition: enable-smoke && !hidden Selectable: - DecorationBounds: 36,28 + DecorationBounds: 1536, 1194 Rearmable: - RearmActors: hpad, hpad.td + RearmActors: hpad, hpad.td, afld, afld.gdi, grav Voiced: - VoiceSet: OxannaVoice + VoiceSet: RahVoice ProducibleWithLevel: Prerequisites: aircraft.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: aircraft.upgraded GrantConditionOnFaction@blackh: Factions: blackh Condition: napalm-missiles + AppearsOnRadar: + ValidRelationships: Ally + GrantConditionOnDamageState@SmokeTrail: + Condition: enable-smoke + WithColoredSelectionBox@INVIS: + RequiresCondition: invisibility || hidden + ColorSource: Player + WithShadow: + RequiresCondition: !invisibility && !hidden + WithShadow@CLOAKED: + ShadowColor: 00000033 + RequiresCondition: invisibility || hidden + ProductionCostMultiplier@ShadowBonus: + Multiplier: 90 + Prerequisites: player.shadow + Encyclopedia: + Category: Nod/Aircraft KIRO: Inherits: ^Helicopter @@ -1484,21 +2699,26 @@ KIRO: RenderSprites: Image: kirov Buildable: - Queue: Aircraft - BuildAtProductionType: Plane - BuildPaletteOrder: 160 - Prerequisites: ~afld, stek, ~aircraft.soviet, ~techlevel.high - Description: Heavily armoured airship equipped with specialised bombs.\n Vulnerable when dropping bombs.\n Strong vs Buildings, Infantry, Slow Vehicles\n Weak vs Aircraft + Queue: AircraftSQ, AircraftMQ + BuildAtProductionType: Helicopter + BuildPaletteOrder: 82 + Prerequisites: afld, stek, ~aircraft.kiro, ~techlevel.high + Description: Heavily armored airship armed with specialised bombs. + TooltipExtras: + Strengths: • Strong vs Buildings, Defenses, Infantry, Light Armor + Weaknesses: • Cannot attack Aircraft\n• Has difficulty hitting moving targets\n• Takes +33% damage when dropping bombs + Attributes: • Self repairs to 75% out of combat Valued: Cost: 2000 Tooltip: Name: Kirov Airship + GenericName: Airship UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 100000 + HP: 110000 Armor: - Type: Heavy + Type: Aircraft RevealsShroud: Range: 10c0 MinRange: 8c0 @@ -1533,37 +2753,38 @@ KIRO: PauseOnCondition: !ammo RequiresCondition: yuribombs AmmoPool: - Ammo: 8 + Ammo: 10 AmmoCondition: ammo WithAmmoPipsDecoration: Position: BottomLeft Margin: 4, 3 RequiresSelection: true - PipCount: 4 + PipCount: 5 ReloadAmmoPoolCA: - Delay: 125 - Count: 8 - DelayOnFire: 50 - DelayAfterReset: 50 + Delay: 75 + Count: 10 + DelayOnFire: 35 + DelayAfterReset: 35 ShowSelectionBar: true SelectionBarColor: ff00ff AttackAircraft: FacingTolerance: 512 AttackType: Hover - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded Voice: Attack Aircraft: CruiseAltitude: 2c0 InitialFacing: 192 TurnSpeed: 12 - Speed: 56 + Speed: 49 Voice: Move AltitudeVelocity: 0c50 CanForceLand: False + IdealSeparation: 0c768 AutoTarget: InitialStance: HoldFire InitialStanceAI: AttackAnything - ScanRadius: 10 + ScanRadius: 2 SpawnActorOnDeath: Actor: KIRO.Husk RequiresCondition: !empdisable && !being-warped @@ -1573,26 +2794,44 @@ KIRO: WithIdleOverlay@ROTOR1AIR: Offset: -180,597,250 Sequence: rotor + PauseOnCondition: being-warped RequiresCondition: airborne WithIdleOverlay@ROTOR1GROUND: Offset: -180,597,250 Sequence: slow-rotor + PauseOnCondition: being-warped RequiresCondition: !airborne WithIdleOverlay@ROTOR2AIR: Offset: -180,-597,250 Sequence: rotor + PauseOnCondition: being-warped RequiresCondition: airborne WithIdleOverlay@ROTOR2GROUND: Offset: -180,-597,250 Sequence: slow-rotor + PauseOnCondition: being-warped RequiresCondition: !airborne - SmokeTrailWhenDamaged@1: - Offset: -100,500,100 - SmokeTrailWhenDamaged@2: - Offset: -100,-500,100 + LeavesTrails@1: + Offsets: -100,500,100 + Image: smokey + MovingInterval: 3 + StationaryInterval: 3 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RequiresCondition: enable-smoke + LeavesTrails@2: + Offsets: -100,-500,100 + Image: smokey + MovingInterval: 3 + StationaryInterval: 3 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RequiresCondition: enable-smoke Selectable: - Bounds: 36,28,0,2 - DecorationBounds: 40,40,0,1 + Bounds: 1536, 1194, 0, 85 + DecorationBounds: 1706, 1706, 0, 42 ChangesHealth: PercentageStep: 1 Delay: 25 @@ -1600,12 +2839,18 @@ KIRO: DamageCooldown: 150 Voiced: VoiceSet: KirovVoice - Explodes: + ExternalCondition@PRODUCED: + Condition: produced + VoiceAnnouncement: + RequiresCondition: produced + Voice: Build + ValidRelationships: Neutral, Ally + FireWarheadsOnDeath: Weapon: KirovExplode RequiresCondition: !airborne DamageMultiplier@doorsopen: RequiresCondition: doorsopen - Modifier: 150 + Modifier: 133 GrantConditionOnAttack@doorsopen: Condition: doorsopen RevokeDelay: 50 @@ -1625,30 +2870,54 @@ KIRO: AmbientSoundCA: SoundFiles: vkirlo2a.aud, vkirlo2b.aud, vkirlo2c.aud Interval: 2 - VolumeMultiplier: 0.05 + VolumeMultiplier: 0.08 -RangeMultiplier@SEEK: -RangeMultiplier@SEEK2: -RangeMultiplier@SEEK3: ProducibleWithLevel: Prerequisites: aircraft.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: aircraft.upgraded + GrantConditionOnDamageState@SmokeTrail: + Condition: enable-smoke + ProductionCostMultiplier@YURIBONUS: + Multiplier: 90 + Prerequisites: player.yuri + GpsRadarDot: + Sequence: Plane + -KillsSelf@Emp: + -SoundOnDamageTransitionCA: + Targetable@AirHighValue: + TargetTypes: AirHighValue + SpeedMultiplier@EMPDISABLE: + Modifier: 0 + RequiresCondition: empdisable + Encyclopedia: + Category: Soviets/Aircraft + Scale: 1.8 OCAR: Inherits: ^HelicopterTD + Inherits@SELECTION: ^SelectableSupportUnit RenderSprites: Image: orcaca Valued: - Cost: 1500 + Cost: 900 Tooltip: Name: Orca Carryall + GenericName: Aircraft UpdatesPlayerStatistics: AddToArmyValue: true Buildable: - Queue: Aircraft + Queue: AircraftSQ, AircraftMQ BuildAtProductionType: Helicopter - BuildPaletteOrder: 100 - Prerequisites: ~hpad.td, rep, ~aircraft.gdi, ~techlevel.high + BuildPaletteOrder: 43 + Prerequisites: afld.gdi, rep, ~aircraft.gdi, ~techlevel.medium IconPalette: chrometd - Description: Fast VTOL Vehicle Transporter.\n Unarmed\n Special Ability: Auto Pilot + Description: Fast VTOL Vehicle Transporter. + TooltipExtras: + Weaknesses: • Unarmed Aircraft: CruiseAltitude: 2048 AltitudeVelocity: 0c100 @@ -1673,14 +2942,14 @@ OCAR: Health: HP: 30000 Armor: - Type: Heavy + Type: Aircraft RevealsShroud: - Range: 10c0 - MinRange: 8c0 + Range: 9c0 + MinRange: 7c0 Type: GroundPosition RevealGeneratedShroud: False RevealsShroud@GAPGEN: - Range: 8c0 + Range: 7c0 Type: GroundPosition SpawnActorOnDeath: Actor: OCAR.Husk @@ -1688,11 +2957,17 @@ OCAR: SpawnActorOnDeath@EMP: Actor: OCAR.Husk.EMP RequiresCondition: empdisable && !being-warped - SmokeTrailWhenDamaged: - Offset: -427,0,0 - Interval: 2 + LeavesTrails: + Offsets: -427,0,0 + MovingInterval: 2 + Image: smokey + StationaryInterval: 2 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RequiresCondition: enable-smoke Selectable: - DecorationBounds: 44,48,0,0 + DecorationBounds: 1877, 2048, 0, 0 Voiced: VoiceSet: CarryAllVoice WithMoveAnimation: @@ -1700,39 +2975,55 @@ OCAR: Contrail@1: Offset: 30,-600,-20 TrailLength: 15 - UsePlayerColor: false - Color: FFFFFF80 + StartColorUsePlayerColor: false + StartColor: FFFFFF80 + StartColorAlpha: 96 Contrail@2: Offset: -885,-184,0 TrailLength: 16 - UsePlayerColor: false + StartColorUsePlayerColor: false ZOffset: -512 - Color: cc550080 + StartColor: cc550080 + StartColorAlpha: 128 Contrail@3: Offset: -885,184,0 TrailLength: 16 - UsePlayerColor: false + StartColorUsePlayerColor: false ZOffset: -512 - Color: cc550080 + StartColor: cc550080 + StartColorAlpha: 128 Contrail@4: Offset: 30,600,-20 TrailLength: 15 - UsePlayerColor: false - Color: FFFFFF80 + StartColorUsePlayerColor: false + StartColor: FFFFFF80 + StartColorAlpha: 96 + GrantConditionOnDamageState@SmokeTrail: + Condition: enable-smoke + SoundOnDamageTransitionCA: + DestroyedSounds: vcomdi1a.aud, vcomdi2a.aud + EjectOnDeath: + ChuteSound: gejecta.aud + Encyclopedia: + Category: GDI/Aircraft OCAR.Reinforce: Inherits: OCAR -Buildable: Carryall: DropRange: 30c0 + Hovers@CRUISING: + RequiresCondition: cruising Aircraft: IdleBehavior: LeaveMap Repulsable: False + -Huntable: -Selectable: -Voiced: RejectsOrders: Interactable: -Targetable@TEMPORAL: + -Encyclopedia: OCAR.XO: Inherits: C17 @@ -1749,11 +3040,11 @@ OCAR.XO: Contrail@2: Offset: -885,-184,0 ZOffset: -512 - Color: cc550080 + StartColor: cc550080 Contrail@3: Offset: -885,184,0 ZOffset: -512 - Color: cc550080 + StartColor: cc550080 Contrail@4: Offset: 30,600,-20 Aircraft: @@ -1772,11 +3063,17 @@ OCAR.XO: SpawnActorOnDeath@EMP: Actor: OCAR.Husk.EMP RequiresCondition: empdisable - -SmokeTrailWhenDamaged@0: - -SmokeTrailWhenDamaged@1: - SmokeTrailWhenDamaged: - Offset: -427,0,0 - Interval: 2 + -LeavesTrails@0: + -LeavesTrails@1: + LeavesTrails: + Offsets: -427,0,0 + MovingInterval: 2 + Image: smokey + StationaryInterval: 2 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RequiresCondition: enable-smoke WithMoveAnimation: MoveSequence: move WithSpriteTurret@XO1: @@ -1811,6 +3108,8 @@ OCAR.XO: AttackTurreted: FacingTolerance: 512 PauseOnCondition: airborne + GrantConditionOnDamageState@SmokeTrail: + Condition: enable-smoke OCAR.Pod: Inherits: OCAR.Reinforce @@ -1825,21 +3124,25 @@ OCAR.Pod: HARR: Inherits: ^Helicopter - Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove + Inherits@AUTOTARGET: ^AutoTargetAllAssaultMovePrioritizeAir Buildable: - Queue: Aircraft + Queue: AircraftSQ, AircraftMQ BuildAtProductionType: Helicopter - BuildPaletteOrder: 110 - Prerequisites: atek, ~hpad, ~aircraft.allies, ~techlevel.high - Description: Fast VTOL ground attack aircraft armed\nwith powerful explosive missiles.\n Strong vs Buildings, Infantry\n Weak vs Aircraft + BuildPaletteOrder: 70 + Prerequisites: atek, ~aircraft.allies, ~techlevel.high + Description: Fast VTOL ground attack aircraft armed with powerful explosive missiles. + TooltipExtras: + Strengths: • Strong vs Aircraft, Buildings, Infantry, Light Armor + Weaknesses: • Weak vs Heavy Armor, Defenses Valued: Cost: 2000 Tooltip: Name: Harrier + GenericName: Aircraft UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 26500 + HP: 22500 RevealsShroud: Range: 12c0 MinRange: 10c0 @@ -1848,10 +3151,14 @@ HARR: RevealsShroud@GAPGEN: Range: 10c0 Type: GroundPosition - Armament: + Armament@PRIMARY: + Weapon: HellfireAA.Harrier + LocalOffset: 0,500,-85, 0,-500,-85 + PauseOnCondition: !ammo || blinded + Armament@SECONDARY: Weapon: HellfireAG.Harrier - LocalOffset: 0,213,-85, 0,-213,-85 - PauseOnCondition: !ammo + LocalOffset: 0,500,-85, 0,-500,-85 + PauseOnCondition: !ammo || blinded AttackAircraft: FacingTolerance: 80 Voice: Attack @@ -1860,38 +3167,42 @@ HARR: PauseOnCondition: empdisable || being-warped Aircraft: CruiseAltitude: 2560 - TurnSpeed: 16 + TurnSpeed: 18 Speed: 201 RepulsionSpeed: 40 MaximumPitch: 56 CanHover: False - TakeoffSounds: mtoff1.aud, mtoff2.aud - LandingSounds: mland1.aud, mland2.aud - IdealSeparation: 1c682 + TakeoffSounds: vintupa.aud + LandingSounds: vintdna.aud Voice: Move CanSlide: False AltitudeVelocity: 0c200 + SoundOnDamageTransitionCA: + DestroyedSounds: vintdiea.aud, vintdieb.aud + RequiresCondition: airborne AutoTarget: InitialStance: HoldFire InitialStanceAI: AttackAnything AmmoPool: Ammo: 4 - ReloadDelay: 60 + ReloadDelay: 45 AmmoCondition: ammo WithAmmoPipsDecoration: Position: BottomLeft Margin: 4, 3 RequiresSelection: true Contrail@1: - Offset: -400,-443,0 - UsePlayerColor: false + Offset: -320,-500,0 + StartColorUsePlayerColor: false ZOffset: -512 - Color: FFFFFF80 + StartColor: FFFFFF + StartColorAlpha: 140 Contrail@2: - Offset: -400,443,0 - UsePlayerColor: false + Offset: -320,500,0 + StartColorUsePlayerColor: false ZOffset: -512 - Color: FFFFFF80 + StartColor: FFFFFF + StartColorAlpha: 140 SpawnActorOnDeath: Actor: HARR.Husk RequiresCondition: airborne && ammo && !empdisable && !being-warped @@ -1904,33 +3215,55 @@ HARR: SpawnActorOnDeath@EmptyEMP: Actor: HARR.Husk.empty.EMP RequiresCondition: airborne && !ammo && empdisable && !being-warped - SmokeTrailWhenDamaged: - Offset: -427,0,0 + LeavesTrails: + Offsets: -427,0,0 + Image: smokey + MovingInterval: 3 + StationaryInterval: 3 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RequiresCondition: enable-smoke Selectable: - DecorationBounds: 36,28 + DecorationBounds: 1536, 1194 Voiced: VoiceSet: HarrierVoice ProducibleWithLevel: Prerequisites: aircraft.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: aircraft.upgraded Rearmable: - RearmActors: hpad, hpad.td + RearmActors: hpad, hpad.td, afld, afld.gdi, grav + GrantConditionOnDamageState@SmokeTrail: + Condition: enable-smoke + GpsRadarDot: + Sequence: Plane + EjectOnDeath: + ChuteSound: gejecta.aud + Encyclopedia: + Category: Allies/Aircraft SCRN: Inherits: ^HelicopterTD - Inherits@AUTOTARGET: ^AutoTargetAllAssaultMove + Inherits@AUTOTARGET: ^AutoTargetAllAssaultMovePrioritizeAir RenderSprites: Image: scrin Buildable: - Queue: Aircraft + Queue: AircraftSQ, AircraftMQ BuildAtProductionType: Helicopter - BuildPaletteOrder: 150 + BuildPaletteOrder: 100 IconPalette: chrometd - Prerequisites: tmpl, ~hpad.td, ~aircraft.nod, ~techlevel.high - Description: Fast VTOL attack craft armed\nwith powerful plasma cannons.\n Strong vs Heavy Armor, Defenses, Aircraft\n Weak vs Infantry + Prerequisites: tmpl, ~aircraft.nod, ~techlevel.high + Description: Fast VTOL attack craft armed with powerful plasma cannons. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Defenses, Aircraft + Weaknesses: • Weak vs Infantry Valued: Cost: 2000 Tooltip: Name: Banshee + GenericName: Aircraft UpdatesPlayerStatistics: AddToArmyValue: true Health: @@ -1946,11 +3279,27 @@ SCRN: Armament@PRIMARY: Weapon: ScrinTorp LocalOffset: 0,213,-85, 0,-213,-85 - PauseOnCondition: !ammo + PauseOnCondition: !ammo || blinded + RequiresCondition: !wrath-covenant + AmmoUsage: 4 Armament@SECONDARY: Weapon: ScrinTorpAA LocalOffset: 0,213,-85, 0,-213,-85 - PauseOnCondition: !ammo + PauseOnCondition: !ammo || blinded + RequiresCondition: !wrath-covenant + AmmoUsage: 4 + Armament@PRIMARYUPG: + Weapon: ScrinTorp + LocalOffset: 0,213,-85, 0,-213,-85 + PauseOnCondition: !ammo || blinded + RequiresCondition: wrath-covenant + AmmoUsage: 3 + Armament@SECONDARYUPG: + Weapon: ScrinTorpAA + LocalOffset: 0,213,-85, 0,-213,-85 + PauseOnCondition: !ammo || blinded + RequiresCondition: wrath-covenant + AmmoUsage: 3 AttackAircraft: FacingTolerance: 80 Voice: Attack @@ -1960,7 +3309,7 @@ SCRN: Aircraft: CruiseAltitude: 2560 TurnSpeed: 20 - Speed: 225 + Speed: 216 IdleSpeed: 135 IdleTurnSpeed: 15 RepulsionSpeed: 40 @@ -1968,7 +3317,6 @@ SCRN: CanHover: False TakeoffSounds: dropup1.aud LandingSounds: dropdwn1.aud - IdealSeparation: 1c682 Voice: Move CanSlide: False AltitudeVelocity: 0c200 @@ -1976,23 +3324,32 @@ SCRN: InitialStance: HoldFire InitialStanceAI: AttackAnything AmmoPool: - Ammo: 9 - ReloadDelay: 25 + Ammo: 36 + ReloadDelay: 5 AmmoCondition: ammo WithAmmoPipsDecoration: Position: BottomLeft Margin: 4, 3 RequiresSelection: true PipCount: 3 + RequiresCondition: !wrath-covenant + WithAmmoPipsDecoration@UPG: + Position: BottomLeft + Margin: 4, 3 + RequiresSelection: true + PipCount: 4 + RequiresCondition: wrath-covenant Contrail@1: Offset: -300,-143,0 - Color: 00FF0080 - UsePlayerColor: false + StartColorUsePlayerColor: false + StartColor: 00FF00 + StartColorAlpha: 64 ZOffset: -512 Contrail@2: Offset: -300,143,0 - Color: 00FF0080 - UsePlayerColor: false + StartColorUsePlayerColor: false + StartColor: 00FF00 + StartColorAlpha: 64 ZOffset: -512 SpawnActorOnDeath: Actor: SCRN.Husk @@ -2006,35 +3363,64 @@ SCRN: SpawnActorOnDeath@EmptyEMP: Actor: SCRN.Husk.empty.EMP RequiresCondition: airborne && !ammo && empdisable && !being-warped - SmokeTrailWhenDamaged: - Offset: -427,0,0 + LeavesTrails: + Offsets: -427,0,0 + Image: smokey + MovingInterval: 3 + StationaryInterval: 3 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RequiresCondition: enable-smoke Selectable: - DecorationBounds: 36,28 + DecorationBounds: 1536, 1194 Voiced: VoiceSet: ScrinVoice ProducibleWithLevel: Prerequisites: aircraft.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: aircraft.upgraded Rearmable: - RearmActors: hpad, hpad.td + RearmActors: hpad, hpad.td, afld, afld.gdi, grav ProductionCostMultiplier@markedBonus: Multiplier: 90 - Prerequisites: structures.marked + Prerequisites: player.marked + GrantConditionOnDamageState@SmokeTrail: + Condition: enable-smoke + GpsRadarDot: + Sequence: Plane + SoundOnDamageTransitionCA: + DestroyedSounds: vcomdi1a.aud, vcomdi2a.aud + EjectOnDeath: + ChuteSound: gejecta.aud + GrantConditionOnPrerequisite@Wrath: + Condition: wrath-covenant + Prerequisites: wrath.covenant + Encyclopedia: + Category: Nod/Aircraft HORN: - Inherits: ^PlaneTD + Inherits: ^NeutralPlane + Inherits@3: ^Cloakable + Inherits@4: ^EmpDisable + Inherits@5: ^GDIStrategyBuffsAircraft + Inherits@ionsurge: ^IonSurgable + RenderSprites: + PlayerPalette: playertd Valued: Cost: 50 Tooltip: Name: Hornet Health: - HP: 7200 + HP: 22000 RevealsShroud: - Range: 2c0 - MinRange: 1c0 + Range: 4c0 + MinRange: 3c0 Type: GroundPosition RevealGeneratedShroud: False RevealsShroud@GAPGEN: - Range: 1c0 + Range: 3c0 Type: GroundPosition Armament: Weapon: HellfireAG.Horn @@ -2043,56 +3429,57 @@ HORN: FacingTolerance: 80 PersistentTargeting: false OpportunityFire: false - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable Aircraft: CruiseAltitude: 1c513 InitialFacing: 192 TurnSpeed: 32 - Speed: 195 + Speed: 201 + AltitudeVelocity: 120 MaximumPitch: 56 CanHover: False CanSlide: False - RepulsionSpeed: 40 Repulsable: False - IdealSeparation: 0c256 VTOL: true TakeoffSounds: mtoff1.aud, mtoff2.aud LandingSounds: mland1.aud, mland2.aud Rearmable: - RearmActors: carr + RearmActors: cv AmmoPool: - Ammo: 6 + Ammo: 8 AmmoCondition: ammo RejectsOrders: - SpawnActorOnDeath: - Actor: HORN.Husk - RequiresCondition: ammo && !empdisable && !being-warped - SpawnActorOnDeath@Empty: - Actor: HORN.Husk.empty - RequiresCondition: !ammo && !empdisable && !being-warped - SpawnActorOnDeath@EMP: - Actor: HORN.Husk.EMP - RequiresCondition: ammo && empdisable && !being-warped - SpawnActorOnDeath@EmptyEMP: - Actor: HORN.Husk.empty.EMP - RequiresCondition: !ammo && empdisable && !being-warped - -EjectOnDeath: + -SpawnActorOnDeath: + FireWarheadsOnDeath: + Weapon: VisualExplodeAirborne + -RequiresCondition: -Selectable: -ActorLostNotification: - SmokeTrailWhenDamaged: - Offset: -253,0,171 - Interval: 2 + LeavesTrails: + Offsets: -253,0,171 + MovingInterval: 2 + Image: smokey + StationaryInterval: 2 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RequiresCondition: enable-smoke CarrierSlave: - LandingDistance: 8c0 Contrail@1: Offset: -432,0,0 - Color: cc550080 + StartColor: cc550080 TrailLength: 10 -Contrail@2: Interactable: DetectCloaked: - CloakTypes: Underwater + DetectionTypes: Underwater Range: 6c0 + Targetable@AIRBORNE: + RequiresCondition: airborne + TargetTypes: ICBM + GrantConditionOnDamageState@SmokeTrail: + Condition: enable-smoke + GivesExperienceToMaster: YF23.Bomber: Inherits: ^PlaneTD @@ -2106,12 +3493,12 @@ YF23.Bomber: Armament: Weapon: WidowAA LocalOffset: 0,-256,-43, 0,256,-43 - PauseOnCondition: !ammo - AttackBomberCA: + Interceptor: AttackAircraft: PersistentTargeting: false OpportunityFire: True PauseOnCondition: empdisable || being-warped + FacingTolerance: 128 Aircraft: CruiseAltitude: 2560 InitialFacing: 192 @@ -2121,13 +3508,7 @@ YF23.Bomber: RepulsionSpeed: 40 MaximumPitch: 56 MoveIntoShroud: False - AmmoPool: - Ammo: 10 - AmmoCondition: ammo - ReloadAmmoPool: - Delay: 250 - Count: 2 - ResetOnFire: true + -Huntable: -Selectable: -Voiced: RenderSprites: @@ -2139,15 +3520,17 @@ YF23.Bomber: Offset: -325,-483,0 Contrail@AB1: Offset: -400,-80,-10 - UsePlayerColor: false + StartColorUsePlayerColor: false ZOffset: -512 - Color: cc550080 + StartColor: cc550080 + StartColorAlpha: 128 TrailLength: 10 Contrail@AB2: Offset: -400,80,-10 - UsePlayerColor: false + StartColorUsePlayerColor: false ZOffset: -512 - Color: cc550080 + StartColor: cc550080 + StartColorAlpha: 128 TrailLength: 10 SpawnActorOnDeath: Actor: YF23.Husk @@ -2155,21 +3538,33 @@ YF23.Bomber: SpawnActorOnDeath@EMP: Actor: YF23.Husk.EMP RequiresCondition: empdisable && !being-warped - SmokeTrailWhenDamaged: - Offset: -853,0,171 - Interval: 2 + LeavesTrails: + Offsets: -853,0,171 + MovingInterval: 2 + Image: smokey + StationaryInterval: 2 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RequiresCondition: enable-smoke Interactable: - GivesExperience: + GivesExperienceCA: Experience: 1000 AutoTarget: InitialStance: HoldFire InitialStanceAI: AttackAnything + GrantConditionOnDamageState@SmokeTrail: + Condition: enable-smoke + EjectOnDeath: + ChuteSound: gejecta.aud + Rearmable: + RearmActors: yf23.bomber # workaround - prevents freezing above landed targets POD: Inherits@2: ^ExistsInWorld RenderSprites: Image: pod2 - PlayerPalette: overlayplayertd + PlayerPalette: playertd Valued: Cost: 10 Tooltip: @@ -2177,7 +3572,7 @@ POD: Health: HP: 7200 Armor: - Type: Light + Type: Aircraft Aircraft: TurnSpeed: 20 Speed: 300 @@ -2185,7 +3580,7 @@ POD: MaximumPitch: 110 VTOL: true Repulsable: False - LandableTerrainTypes: Clear,Road,Rough,Ore,Gems,Tiberium,BlueTiberium,Water,Tree,River + LandableTerrainTypes: Clear,Road,Rough,Ore,Gems,Tiberium,BlueTiberium,BlackTiberium,Beach,Bridge,Tunnel,Ford HiddenUnderFog: Type: CenterPosition ClassicFacingBodyOrientation: @@ -2195,10 +3590,14 @@ POD: HitShape: Interactable: WithShadow: - SmokeTrailWhenDamaged: - MinDamage: Undamaged - Sprite: smokey2 + LeavesTrails: + Image: smokey2 Palette: tseffect-ignore-lighting-alpha75 + MovingInterval: 3 + StationaryInterval: 3 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition FallsToEarth: MaximumSpinSpeed: 0 Moves: True @@ -2219,7 +3618,7 @@ POD3: VENM: Inherits: ^HelicopterTD - Inherits@AUTOTARGET: ^AutoTargetAllAssaultMove + Inherits@AUTOTARGET: ^AutoTargetAllAssaultMovePrioritizeAir Valued: Cost: 1500 Tooltip: @@ -2227,51 +3626,81 @@ VENM: UpdatesPlayerStatistics: AddToArmyValue: true Buildable: - Queue: Aircraft + Queue: AircraftSQ, AircraftMQ BuildAtProductionType: Helicopter - BuildPaletteOrder: 31 - Prerequisites: ~hpad.td, ~aircraft.marked, ~techlevel.medium + BuildPaletteOrder: 51 + Prerequisites: ~aircraft.marked, ~techlevel.medium IconPalette: chrometd - Description: VTOL gunship armed\nwith laser.\n Strong vs Infantry, Light Armor, Aircraft\n Weak vs Tanks, Buildings + Description: VTOL gunship armed with laser. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor, Aircraft + Weaknesses: • Weak vs Defenses Aircraft: AltitudeVelocity: 0c100 - TurnSpeed: 22 + TurnSpeed: 24 TakeoffSounds: orcaup1.aud LandingSounds: orcadwn1.aud Speed: 180 + Voice: Move + Voiced: + VoiceSet: VenomVoice + Guard: + Voice: Move Health: - HP: 19000 + HP: 18000 RevealsShroud: - Range: 10c0 - MinRange: 8c0 + Range: 11c0 + MinRange: 9c0 Type: GroundPosition RevealGeneratedShroud: False RevealsShroud@GAPGEN: - Range: 8c0 + Range: 9c0 Type: GroundPosition Armament@PRIMARY: Weapon: VenomLaser LocalOffset: 600,0,-270 PauseOnCondition: !ammo + RequiresCondition: !quantum-upgrade + MuzzleSequence: muzzle + MuzzlePalette: caneon Armament@SECONDARY: Weapon: VenomLaserAA LocalOffset: 600,0,-270 PauseOnCondition: !ammo + RequiresCondition: !quantum-upgrade + MuzzleSequence: muzzle + MuzzlePalette: caneon + Armament@PRIMARYUPG: + Weapon: VenomLaser.UPG + LocalOffset: 600,0,-270 + PauseOnCondition: !ammo + RequiresCondition: quantum-upgrade + MuzzleSequence: muzzle + MuzzlePalette: caneon + Armament@SECONDARYUPG: + Weapon: VenomLaserAA.UPG + LocalOffset: 600,0,-270 + PauseOnCondition: !ammo + RequiresCondition: quantum-upgrade + MuzzleSequence: muzzle + MuzzlePalette: caneon + WithMuzzleOverlay: AttackAircraft: - FacingTolerance: 40 + FacingTolerance: 80 AttackType: Hover PersistentTargeting: false OpportunityFire: false - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded + Voice: Attack AmmoPool: - Ammo: 10 - ReloadDelay: 18 + Ammo: 8 + ReloadDelay: 15 AmmoCondition: ammo WithAmmoPipsDecoration: Position: BottomLeft Margin: 4, 3 RequiresSelection: true - PipCount: 6 + PipCount: 4 SpawnActorOnDeath: Actor: VENM.Husk RequiresCondition: airborne && ammo && !empdisable && !being-warped @@ -2287,36 +3716,62 @@ VENM: AutoTarget: InitialStance: HoldFire InitialStanceAI: AttackAnything - SmokeTrailWhenDamaged: - Offset: -427,0,0 - Interval: 2 + LeavesTrails: + Offsets: -427,0,0 + MovingInterval: 2 + Image: smokey + StationaryInterval: 2 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RequiresCondition: enable-smoke WithMoveAnimation: MoveSequence: move Selectable: - DecorationBounds: 30,24 + DecorationBounds: 1280, 1024 Rearmable: - RearmActors: hpad, hpad.td + RearmActors: hpad, hpad.td, afld, afld.gdi, grav ProducibleWithLevel: Prerequisites: aircraft.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: aircraft.upgraded + GrantConditionOnDamageState@SmokeTrail: + Condition: enable-smoke + GrantConditionOnPrerequisite@QUANTUM: + Condition: quantum-upgrade + Prerequisites: quantum.upgrade + SoundOnDamageTransitionCA: + DestroyedSounds: vcomdi1a.aud, vcomdi2a.aud + EjectOnDeath: + ChuteSound: gejecta.aud + Encyclopedia: + Category: Nod/Aircraft + EncyclopediaExtras: + Subfaction: marked AURO: Inherits: ^PlaneTD Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove Buildable: - Queue: Aircraft + Queue: AircraftSQ, AircraftMQ BuildAtProductionType: Plane - BuildPaletteOrder: 140 - Prerequisites: ~afld.gdi, ~aircraft.eagle, gtek, ~techlevel.high + BuildPaletteOrder: 91 + Prerequisites: afld.gdi, ~aircraft.eagle, gtek, ~techlevel.high IconPalette: chrometd - Description: Supersonic bomber armed with a MOAB.\n Strong vs Defenses, Vehicles, Infantry\n Weak vs Aircraft\n Special Ability: Afterburner + Description: Supersonic bomber armed with a MOAB. + TooltipExtras: + Strengths: • Strong vs Defenses, Heavy Armor, Light Armor, Infantry + Weaknesses: • Cannot attack Aircraft + Attributes: • Uses afterburner on approach to target Valued: - Cost: 2200 + Cost: 2300 Tooltip: Name: Aurora UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 16000 + HP: 18000 RevealsShroud: Range: 12c0 MinRange: 10c0 @@ -2328,7 +3783,7 @@ AURO: Armament: Weapon: JDAM LocalOffset: 2,0,-43 - PauseOnCondition: !ammo + PauseOnCondition: !ammo || blinded AttackAircraft: FacingTolerance: 128 PersistentTargeting: false @@ -2349,21 +3804,25 @@ AURO: InitialStanceAI: AttackAnything AmmoPool: Ammo: 1 - ReloadDelay: 240 + ReloadDelay: 180 AmmoCondition: ammo WithAmmoPipsDecoration: Position: BottomLeft Margin: 4, 3 RequiresSelection: true - GrantConditionOnActivity@AFTERBURNER: + GrantConditionOnOrders@AFTERBURNER: Condition: afterburner ActiveSound: cjetband.aud + OrderNames: Attack, ForceAttack + RequiresActorTarget: true + ValidTargetRelationships: Enemy, Neutral + RequiresCondition: ammo SpeedMultiplier@AFTERBURNER: Modifier: 170 - RequiresCondition: afterburner && ammo + RequiresCondition: afterburner DamageMultiplier@AFTERBURNER: - Modifier: 80 - RequiresCondition: afterburner && ammo + Modifier: 90 + RequiresCondition: afterburner GrantConditionOnAttack@AFTERBURNERFINAL: Condition: afterburner-final RevokeDelay: 40 @@ -2371,24 +3830,46 @@ AURO: Modifier: 135 RequiresCondition: afterburner-final Selectable: - Bounds: 36,28,0,2 - DecorationBounds: 40,29,0,1 + Bounds: 1536, 1194, 0, 85 + DecorationBounds: 1706, 1237, 0, 42 Contrail@AB1: Offset: -400,-70,-50 - UsePlayerColor: false + StartColorUsePlayerColor: false ZOffset: -512 - Color: cc550080 + StartColor: cc550080 + StartColorAlpha: 128 TrailLength: 10 + RequiresCondition: !afterburner Contrail@AB2: Offset: -400,70,-50 - UsePlayerColor: false + StartColorUsePlayerColor: false ZOffset: -512 - Color: cc550080 + StartColor: cc550080 + StartColorAlpha: 128 TrailLength: 10 + RequiresCondition: !afterburner + Contrail@AB3: + Offset: -400,-70,-50 + StartColorUsePlayerColor: false + ZOffset: -512 + StartColor: cc550080 + StartColorAlpha: 128 + TrailLength: 15 + StartWidth: 80 + RequiresCondition: afterburner + Contrail@AB4: + Offset: -400,70,-50 + StartColorUsePlayerColor: false + ZOffset: -512 + StartColor: cc550080 + StartColorAlpha: 128 + TrailLength: 15 + StartWidth: 80 + RequiresCondition: afterburner Contrail@1: - Offset: -300,-800,-50 + Offset: -400,-800,-50 Contrail@2: - Offset: -300,800,-50 + Offset: -400,800,-50 SpawnActorOnDeath: Actor: AURO.Husk RequiresCondition: airborne && ammo && !empdisable && !being-warped @@ -2401,11 +3882,20 @@ AURO: SpawnActorOnDeath@EmptyEMP: Actor: AURO.Husk.empty.EMP RequiresCondition: airborne && !ammo && empdisable && !being-warped - SmokeTrailWhenDamaged: - Offset: -853,0,171 - Interval: 2 + LeavesTrails: + Offsets: -853,0,171 + MovingInterval: 2 + Image: smokey + StationaryInterval: 2 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RequiresCondition: enable-smoke ProducibleWithLevel: Prerequisites: aircraft.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: aircraft.upgraded Rearmable: RearmActors: afld, afld.gdi Voiced: @@ -2414,3 +3904,1172 @@ AURO: -RangeMultiplier@SEEK: -RangeMultiplier@SEEK2: -RangeMultiplier@SEEK3: + SpeedMultiplier@SEEK: + RequiresCondition: seek && !afterburner + SpeedMultiplier@SEEK2: + RequiresCondition: seek2 && !afterburner + SpeedMultiplier@SEEK3: + RequiresCondition: seek3 && !afterburner + -ReloadDelayMultiplier@BOMBARD: + -ReloadDelayMultiplier@BOMBARD2: + -ReloadDelayMultiplier@BOMBARD3: + GrantConditionOnDamageState@SmokeTrail: + Condition: enable-smoke + EjectOnDeath: + ChuteSound: gejecta.aud + Encyclopedia: + Category: GDI/Aircraft + EncyclopediaExtras: + Subfaction: eagle + +PMAK: + Inherits: ^Helicopter + Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove + Buildable: + Queue: AircraftSQ, AircraftMQ + BuildAtProductionType: Helicopter + BuildPaletteOrder: 71 + Prerequisites: alhq, ~aircraft.allies, ~techlevel.high + Description: Heavy VTOL bomber with powerful armor penetrating bombs. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Defenses, Light Armor, Buildings + Weaknesses: • Weak vs Infantry\n• Cannot attack Aircraft + Valued: + Cost: 2500 + Tooltip: + Name: Peacemaker + GenericName: Aircraft + UpdatesPlayerStatistics: + AddToArmyValue: true + Health: + HP: 38000 + RevealsShroud: + Range: 12c0 + MinRange: 10c0 + Type: GroundPosition + RevealGeneratedShroud: False + RevealsShroud@GAPGEN: + Range: 10c0 + Type: GroundPosition + Armament@PRIMARYBLD: + Weapon: PeacemakerBombsBuilding + LocalOffset: 0,0,-85 + PauseOnCondition: !ammo || blinded + Name: primarybld + Armament@PRIMARY: + Weapon: PeacemakerBombs + LocalOffset: 0,0,-85 + PauseOnCondition: !ammo || blinded + AttackAircraft: + FacingTolerance: 512 + PersistentTargeting: false + Voice: Attack + OpportunityFire: true + PauseOnCondition: empdisable || being-warped + Armaments: primary, primarybld + Aircraft: + CruiseAltitude: 2560 + TurnSpeed: 14 + Speed: 157 + RepulsionSpeed: 40 + MaximumPitch: 56 + CanHover: False + Voice: Move + TakeoffSounds: btoff1.aud, btoff2.aud + LandingSounds: bland1.aud, bland2.aud + CanSlide: False + AltitudeVelocity: 0c100 + AutoTarget: + InitialStance: HoldFire + InitialStanceAI: AttackAnything + AmmoPool: + Ammo: 5 + ReloadDelay: 60 + AmmoCondition: ammo + WithAmmoPipsDecoration: + Position: BottomLeft + Margin: 4, 3 + RequiresSelection: true + Contrail@1: + Offset: -300,-920,170 + StartColorUsePlayerColor: false + ZOffset: -512 + StartColor: FFFFFF + StartColorAlpha: 96 + Contrail@2: + Offset: -300,920,170 + StartColorUsePlayerColor: false + ZOffset: -512 + StartColor: FFFFFF + StartColorAlpha: 96 + Contrail@3: + Offset: -300,-440,0 + StartColorUsePlayerColor: false + ZOffset: -512 + StartColor: FFFFFF + StartColorAlpha: 72 + Contrail@4: + Offset: -300,440,0 + StartColorUsePlayerColor: false + ZOffset: -512 + StartColor: FFFFFF + StartColorAlpha: 72 + SpawnActorOnDeath: + Actor: PMAK.Husk + RequiresCondition: airborne && ammo && !empdisable && !being-warped + SpawnActorOnDeath@Empty: + Actor: PMAK.Husk.empty + RequiresCondition: airborne && !ammo && !empdisable && !being-warped + SpawnActorOnDeath@EMP: + Actor: PMAK.Husk.EMP + RequiresCondition: airborne && ammo && empdisable && !being-warped + SpawnActorOnDeath@EmptyEMP: + Actor: PMAK.Husk.empty.EMP + RequiresCondition: airborne && !ammo && empdisable && !being-warped + LeavesTrails: + Offsets: -427,0,0 + Image: smokey + MovingInterval: 3 + StationaryInterval: 3 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RequiresCondition: enable-smoke + Selectable: + DecorationBounds: 2048, 1536 + ProducibleWithLevel: + Prerequisites: aircraft.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: aircraft.upgraded + Rearmable: + RearmActors: hpad, hpad.td, afld, afld.gdi, grav + GrantConditionOnDamageState@SmokeTrail: + Condition: enable-smoke + GpsRadarDot: + Sequence: Plane + RangeMultiplier@BOMBING: + Modifier: 600 + RequiresCondition: bombing-run + GrantConditionOnAttack@BOMBING: + Condition: bombing-run + RevokeDelay: 7 + -RangeMultiplier@SEEK: + -RangeMultiplier@SEEK2: + -RangeMultiplier@SEEK3: + -ReloadDelayMultiplier@BOMBARD: + -ReloadDelayMultiplier@BOMBARD2: + -ReloadDelayMultiplier@BOMBARD3: + Voiced: + VoiceSet: PeaceVoice + SoundOnDamageTransitionCA: + DestroyedSounds: vcomdi1a.aud, vcomdi2a.aud + EjectOnDeath: + ChuteSound: gejecta.aud + Encyclopedia: + Category: Allies/Aircraft + +BEAG: + Inherits: ^Helicopter + Inherits@AUTOTARGET: ^AutoTargetAllAssaultMovePrioritizeAir + Buildable: + Queue: AircraftSQ, AircraftMQ + BuildAtProductionType: Helicopter + BuildPaletteOrder: 72 + Prerequisites: alhq, ~korea.coalition, ~aircraft.allies, ~techlevel.high + Description: Air superiority fighter with range/vision reducing missiles. + TooltipExtras: + Strengths: • Strong vs Aircraft, Heavy Armor, Light Armor + Weaknesses: • Weak vs Infantry, Buildings + Attributes: • Reduces range and vision of targets + Valued: + Cost: 2000 + Tooltip: + Name: Black Eagle + GenericName: Aircraft + UpdatesPlayerStatistics: + AddToArmyValue: true + Health: + HP: 18000 + RevealsShroud: + Range: 11c0 + MinRange: 9c0 + Type: GroundPosition + RevealGeneratedShroud: False + RevealsShroud@GAPGEN: + Range: 9c0 + Type: GroundPosition + Armament@PRIMARY: + Weapon: BlackEagleMissiles + LocalOffset: 150,0,-85 + PauseOnCondition: !ammo || blinded + Armament@SECONDARY: + Weapon: BlackEagleMissilesAA + LocalOffset: 150,0,-85 + PauseOnCondition: !ammo || blinded + AttackAircraft: + FacingTolerance: 80 + PersistentTargeting: false + OpportunityFire: true + PauseOnCondition: empdisable || being-warped + Voice: Attack + Aircraft: + CruiseAltitude: 2560 + TurnSpeed: 20 + IdleTurnSpeed: 16 + Speed: 225 + RepulsionSpeed: 40 + MaximumPitch: 56 + CanHover: False + TakeoffSounds: vblelo1a.aud + LandingSounds: vblelo3.aud + CanSlide: False + AltitudeVelocity: 0c200 + Voice: Move + SoundOnDamageTransitionCA: + DestroyedSounds: vblediea.aud, vbledieb.aud + RequiresCondition: airborne + AutoTarget: + InitialStance: HoldFire + InitialStanceAI: AttackAnything + AmmoPool: + Ammo: 3 + AmmoCondition: ammo + ReloadDelay: 70 + WithAmmoPipsDecoration: + Position: BottomLeft + Margin: 4, 3 + RequiresSelection: true + Contrail@1: + Offset: -50,-650,20 + StartColorUsePlayerColor: false + ZOffset: -512 + StartColor: FFFFFF80 + StartColorAlpha: 96 + Contrail@2: + Offset: -50,650,20 + StartColorUsePlayerColor: false + ZOffset: -512 + StartColor: FFFFFF80 + StartColorAlpha: 96 + SpawnActorOnDeath: + Actor: BEAG.Husk + RequiresCondition: airborne && ammo && !empdisable && !being-warped + SpawnActorOnDeath@Empty: + Actor: BEAG.Husk.empty + RequiresCondition: airborne && !ammo && !empdisable && !being-warped + SpawnActorOnDeath@EMP: + Actor: BEAG.Husk.EMP + RequiresCondition: airborne && ammo && empdisable && !being-warped + SpawnActorOnDeath@EmptyEMP: + Actor: BEAG.Husk.empty.EMP + RequiresCondition: airborne && !ammo && empdisable && !being-warped + LeavesTrails: + Offsets: -427,0,0 + Image: smokey + MovingInterval: 3 + StationaryInterval: 3 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RequiresCondition: enable-smoke + Selectable: + DecorationBounds: 1536, 1194 + ProducibleWithLevel: + Prerequisites: aircraft.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: aircraft.upgraded + Rearmable: + RearmActors: hpad, hpad.td, afld, afld.gdi, grav + GrantConditionOnDamageState@SmokeTrail: + Condition: enable-smoke + GpsRadarDot: + Sequence: Plane + EjectOnDeath: + ChuteSound: gejecta.aud + Voiced: + VoiceSet: BlackEagleVoice + Encyclopedia: + Category: Allies/Aircraft + EncyclopediaExtras: + AdditionalInfo: Requires Korea Coalition. + +PHAN: + Inherits: ^Helicopter + Inherits@AUTOTARGET: ^AutoTargetAllAssaultMovePrioritizeAir + Inherits@InfiltratorStolenTech: ^InfiltratorStolenTech + Buildable: + Queue: AircraftSQ, AircraftMQ + BuildAtProductionType: Helicopter + BuildPaletteOrder: 200 + Prerequisites: anyradar, ~aircraft.phan + Description: Air superiority fighter with incapacitating missiles. + TooltipExtras: + Strengths: • Strong vs Aircraft, Heavy Armor, Light Armor + Weaknesses: • Weak vs Infantry, Buildings + Attributes: • Disables weapons and vision of enemy vehicles and aircraft + Valued: + Cost: 1800 + Tooltip: + Name: Phantom + GenericName: Aircraft + UpdatesPlayerStatistics: + AddToArmyValue: true + Health: + HP: 18000 + RevealsShroud: + Range: 11c0 + MinRange: 9c0 + Type: GroundPosition + RevealGeneratedShroud: False + RevealsShroud@GAPGEN: + Range: 9c0 + Type: GroundPosition + Armament@PRIMARY: + Weapon: PhantomMissiles + LocalOffset: 150,-400,0, 150,400,0 + PauseOnCondition: !ammo || blinded + Armament@SECONDARY: + Weapon: PhantomMissilesAA + LocalOffset: 150,-400,0, 150,400,0 + PauseOnCondition: !ammo || blinded + AttackAircraft: + FacingTolerance: 80 + PersistentTargeting: false + OpportunityFire: true + PauseOnCondition: empdisable || being-warped + Aircraft: + CruiseAltitude: 2560 + TurnSpeed: 16 + Speed: 225 + RepulsionSpeed: 40 + MaximumPitch: 56 + CanHover: False + TakeoffSounds: vblelo1a.aud + LandingSounds: vblelo3.aud + CanSlide: False + AltitudeVelocity: 0c200 + SoundOnDamageTransitionCA: + DestroyedSounds: vblediea.aud, vbledieb.aud + RequiresCondition: airborne + AutoTarget: + InitialStance: HoldFire + InitialStanceAI: AttackAnything + AmmoPool: + Ammo: 4 + AmmoCondition: ammo + ReloadDelay: 35 + WithAmmoPipsDecoration: + Position: BottomLeft + Margin: 4, 3 + RequiresSelection: true + Contrail@1: + Offset: 50,-680,80 + StartColorUsePlayerColor: false + ZOffset: -512 + StartColor: FFFFFF80 + StartColorAlpha: 96 + Contrail@2: + Offset: 50,680,80 + StartColorUsePlayerColor: false + ZOffset: -512 + StartColor: FFFFFF80 + StartColorAlpha: 96 + Contrail@Inner1: + TrailLength: 15 + Offset: -300,-70,80 + StartColorUsePlayerColor: false + StartColor: 00FF00 + StartColorAlpha: 80 + ZOffset: -512 + Contrail@Inner2: + TrailLength: 15 + Offset: -300,70,80 + StartColorUsePlayerColor: false + StartColor: 00FF00 + StartColorAlpha: 80 + ZOffset: -512 + SpawnActorOnDeath: + Actor: PHAN.Husk + RequiresCondition: airborne && ammo && !empdisable && !being-warped + SpawnActorOnDeath@Empty: + Actor: PHAN.Husk.empty + RequiresCondition: airborne && !ammo && !empdisable && !being-warped + SpawnActorOnDeath@EMP: + Actor: PHAN.Husk.EMP + RequiresCondition: airborne && ammo && empdisable && !being-warped + SpawnActorOnDeath@EmptyEMP: + Actor: PHAN.Husk.empty.EMP + RequiresCondition: airborne && !ammo && empdisable && !being-warped + LeavesTrails: + Offsets: -427,0,0 + Image: smokey + MovingInterval: 3 + StationaryInterval: 3 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RequiresCondition: enable-smoke + Selectable: + DecorationBounds: 1536, 1194 + ProducibleWithLevel: + Prerequisites: aircraft.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: aircraft.upgraded + Rearmable: + RearmActors: hpad, hpad.td, afld, afld.gdi, grav + GrantConditionOnDamageState@SmokeTrail: + Condition: enable-smoke + GpsRadarDot: + Sequence: Plane + EjectOnDeath: + ChuteSound: gejecta.aud + Encyclopedia: + Category: Nod/Stolen Technology + EncyclopediaExtras: + AdditionalInfo: Stolen from Allied Helipad. + +KAMV: + Inherits: ^Helicopter + Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove + Inherits@InfiltratorStolenTech: ^InfiltratorStolenTech + Buildable: + Queue: AircraftSQ, AircraftMQ + BuildAtProductionType: Helicopter + BuildPaletteOrder: 201 + Prerequisites: ~aircraft.kamv + Description: Durable helicopter gunship armed with long range anti-tank rockets with concussive warheads. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor + Weaknesses: • Weak vs Infantry, Buildings\n• Cannot attack Aircraft\n• Has difficulty hitting moving targets + Valued: + Cost: 1800 + Tooltip: + Name: Kamov + UpdatesPlayerStatistics: + AddToArmyValue: true + Health: + HP: 34000 + RevealsShroud: + Range: 11c0 + MinRange: 9c0 + Type: GroundPosition + RevealGeneratedShroud: False + RevealsShroud@GAPGEN: + Range: 9c0 + Type: GroundPosition + Armament@PRIMARY: + Weapon: KamovRockets + LocalOffset: 85,-213,-185 + PauseOnCondition: !ammo + Armament@SECONDARY: + Weapon: KamovRocketsWide + LocalOffset: 85,213,-185 + PauseOnCondition: !ammo + FireDelay: 6 + AttackAircraft: + FacingTolerance: 80 + AttackType: Hover + PersistentTargeting: false + OpportunityFire: false + PauseOnCondition: empdisable || being-warped || blinded + Aircraft: + TurnSpeed: 16 + Speed: 112 + TakeoffSounds: vospstaa.aud + LandingSounds: vosplana.aud + AutoTarget: + InitialStance: HoldFire + InitialStanceAI: AttackAnything + WithIdleOverlay@ROTORAIR: + Sequence: rotor + PauseOnCondition: being-warped + RequiresCondition: airborne + Offset: 50,550,192 + WithIdleOverlay@ROTORAIR2: + Sequence: rotor + PauseOnCondition: being-warped + RequiresCondition: airborne + Offset: 50,-550,192 + WithIdleOverlay@ROTORGROUND: + Sequence: slow-rotor + PauseOnCondition: being-warped + RequiresCondition: !airborne + Offset: 50,550,192 + WithIdleOverlay@ROTORGROUND2: + Sequence: slow-rotor + PauseOnCondition: being-warped + RequiresCondition: !airborne + Offset: 50,-550,192 + AmmoPool@PRIMARY: + Name: primary + Ammo: 12 + ReloadDelay: 14 + AmmoCondition: ammo + WithAmmoPipsDecoration@PRIMARY: + Position: BottomLeft + Margin: 4, 3 + RequiresSelection: true + AmmoPools: primary + PipCount: 6 + WithMuzzleOverlay: + SpawnActorOnDeath: + Actor: KAMV.Husk + RequiresCondition: ammo && !empdisable && !being-warped + SpawnActorOnDeath@Empty: + Actor: KAMV.Husk.empty + RequiresCondition: !ammo && !empdisable && !being-warped + SpawnActorOnDeath@EMP: + Actor: KAMV.Husk.EMP + RequiresCondition: ammo && empdisable && !being-warped + SpawnActorOnDeath@EmptyEMP: + Actor: KAMV.Husk.empty.EMP + RequiresCondition: !ammo && empdisable && !being-warped + LeavesTrails: + Offsets: -427,0,0 + Image: smokey + MovingInterval: 3 + StationaryInterval: 3 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RequiresCondition: enable-smoke + ProducibleWithLevel: + Prerequisites: aircraft.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: aircraft.upgraded + Selectable: + DecorationBounds: 1621, 1365 + Rearmable: + RearmActors: hpad, hpad.td, afld, afld.gdi, grav + GrantConditionOnDamageState@SmokeTrail: + Condition: enable-smoke + EjectOnDeath: + ChuteSound: gejecta.aud + Encyclopedia: + Category: Nod/Stolen Technology + EncyclopediaExtras: + AdditionalInfo: Stolen from Soviet Airfield. + +SHDE: + Inherits: ^HelicopterTD + Inherits@AUTOTARGET: ^AutoTargetAllAssaultMove + Inherits@InfiltratorStolenTech: ^InfiltratorStolenTech + Buildable: + Queue: AircraftSQ, AircraftMQ + BuildAtProductionType: Helicopter + BuildPaletteOrder: 202 + IconPalette: chrometd + Prerequisites: anyradar, ~aircraft.shde + Description: Fast VTOL ground attack aircraft armed with EMP weaponry. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor, Defenses + Weaknesses: • Weak vs Infantry, Buildings\n• Cannot attack Aircraft + Valued: + Cost: 1800 + Tooltip: + Name: Shade + GenericName: Aircraft + UpdatesPlayerStatistics: + AddToArmyValue: true + Health: + HP: 18000 + RevealsShroud: + Range: 11c0 + MinRange: 9c0 + Type: GroundPosition + RevealGeneratedShroud: False + RevealsShroud@GAPGEN: + Range: 9c0 + Type: GroundPosition + Armament@PRIMARY: + Weapon: ShadeEmp + LocalOffset: 0,0,-85 + PauseOnCondition: !ammo || blinded + AttackAircraft: + FacingTolerance: 80 + PersistentTargeting: false + OpportunityFire: true + PauseOnCondition: empdisable || being-warped + Aircraft: + CruiseAltitude: 2560 + TurnSpeed: 20 + Speed: 225 + IdleSpeed: 135 + IdleTurnSpeed: 15 + RepulsionSpeed: 40 + MaximumPitch: 56 + CanHover: False + TakeoffSounds: dropup1.aud + LandingSounds: dropdwn1.aud + CanSlide: False + AltitudeVelocity: 0c200 + AutoTarget: + InitialStance: HoldFire + InitialStanceAI: AttackAnything + AmmoPool: + Ammo: 3 + ReloadDelay: 50 + AmmoCondition: ammo + WithAmmoPipsDecoration: + Position: BottomLeft + Margin: 4, 3 + RequiresSelection: true + Contrail@1: + Offset: -380,-850,-20 + StartColorUsePlayerColor: false + ZOffset: -512 + StartColor: FFFFFF80 + StartColorAlpha: 96 + Contrail@2: + Offset: -380,850,-20 + StartColorUsePlayerColor: false + ZOffset: -512 + StartColor: FFFFFF80 + StartColorAlpha: 96 + Contrail@Inner1: + Offset: -300,-128,80 + StartColorUsePlayerColor: false + StartColor: FF0000 + StartColorAlpha: 128 + ZOffset: -512 + Contrail@Inner2: + Offset: -300,128,80 + StartColorUsePlayerColor: false + StartColor: FF0000 + StartColorAlpha: 128 + ZOffset: -512 + SpawnActorOnDeath: + Actor: SHDE.Husk + RequiresCondition: airborne && ammo && !empdisable && !being-warped + SpawnActorOnDeath@Empty: + Actor: SHDE.Husk.empty + RequiresCondition: airborne && !ammo && !empdisable && !being-warped + SpawnActorOnDeath@EMP: + Actor: SHDE.Husk.EMP + RequiresCondition: airborne && ammo && empdisable && !being-warped + SpawnActorOnDeath@EmptyEMP: + Actor: SHDE.Husk.empty.EMP + RequiresCondition: airborne && !ammo && empdisable && !being-warped + LeavesTrails: + Offsets: -427,0,0 + Image: smokey + MovingInterval: 3 + StationaryInterval: 3 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RequiresCondition: enable-smoke + Selectable: + DecorationBounds: 1536, 1194 + ProducibleWithLevel: + Prerequisites: aircraft.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: aircraft.upgraded + Rearmable: + RearmActors: hpad, hpad.td, afld, afld.gdi, grav + GrantConditionOnDamageState@SmokeTrail: + Condition: enable-smoke + GpsRadarDot: + Sequence: Plane + SoundOnDamageTransitionCA: + DestroyedSounds: vcomdi1a.aud, vcomdi2a.aud + EjectOnDeath: + ChuteSound: gejecta.aud + Encyclopedia: + Category: Nod/Stolen Technology + EncyclopediaExtras: + AdditionalInfo: Stolen from GDI Helipad. + +VERT: + Inherits: ^HelicopterTD + Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove + Inherits@InfiltratorStolenTech: ^InfiltratorStolenTech + Buildable: + Queue: AircraftSQ, AircraftMQ + BuildAtProductionType: Helicopter + BuildPaletteOrder: 203 + IconPalette: chrometd + Prerequisites: anyradar, ~aircraft.vert + Description: Stealth bomber loaded with a single powerful bomb. + TooltipExtras: + Strengths: • Strong vs Defenses, Heavy Armor, Light Armor, Infantry + Weaknesses: • Cannot attack Aircraft + Attributes: • Bomb disrupts cloaking in a large area + Valued: + Cost: 2000 + Tooltip: + Name: Vertigo + GenericName: Aircraft + UpdatesPlayerStatistics: + AddToArmyValue: true + Health: + HP: 20000 + RevealsShroud: + Range: 11c0 + MinRange: 9c0 + Type: GroundPosition + RevealGeneratedShroud: False + RevealsShroud@GAPGEN: + Range: 9c0 + Type: GroundPosition + Armament@PRIMARY: + Weapon: VertigoBomb + LocalOffset: 2,0,-43 + PauseOnCondition: !ammo || hidden || blinded + Armament@DECLOAK: + Name: secondary + Weapon: VertigoBombTargeter + PauseOnCondition: !ammo || !hidden || blinded + AttackAircraft: + FacingTolerance: 40 + PersistentTargeting: false + OpportunityFire: true + PauseOnCondition: empdisable || being-warped + Aircraft: + CruiseAltitude: 2560 + TurnSpeed: 16 + Speed: 157 + IdleSpeed: 135 + RepulsionSpeed: 40 + CanHover: False + TakeoffSounds: dropup1.aud + LandingSounds: dropdwn1.aud + CanSlide: False + AltitudeVelocity: 0c200 + AutoTarget: + InitialStance: HoldFire + InitialStanceAI: AttackAnything + AmmoPool: + Ammo: 1 + ReloadDelay: 180 + AmmoCondition: ammo + Armaments: primary + WithAmmoPipsDecoration: + Position: BottomLeft + Margin: 4, 3 + RequiresSelection: true + Contrail@1: + Offset: -100,-850,25 + StartColorUsePlayerColor: false + ZOffset: -512 + StartColor: FFFFFF80 + StartColorAlpha: 96 + Contrail@2: + Offset: -100,850,25 + StartColorUsePlayerColor: false + ZOffset: -512 + StartColor: FFFFFF80 + StartColorAlpha: 96 + SpawnActorOnDeath: + Actor: VERT.Husk + RequiresCondition: airborne && ammo && !empdisable && !being-warped + SpawnActorOnDeath@Empty: + Actor: VERT.Husk.empty + RequiresCondition: airborne && !ammo && !empdisable && !being-warped + SpawnActorOnDeath@EMP: + Actor: VERT.Husk.EMP + RequiresCondition: airborne && ammo && empdisable && !being-warped + SpawnActorOnDeath@EmptyEMP: + Actor: VERT.Husk.empty.EMP + RequiresCondition: airborne && !ammo && empdisable && !being-warped + LeavesTrails: + Offsets: -427,0,0 + Image: smokey + MovingInterval: 3 + StationaryInterval: 3 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RequiresCondition: enable-smoke + Selectable: + DecorationBounds: 1536, 1536 + ProducibleWithLevel: + Prerequisites: aircraft.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: aircraft.upgraded + Rearmable: + RearmActors: hpad, hpad.td, afld, afld.gdi, grav + GrantConditionOnDamageState@SmokeTrail: + Condition: enable-smoke + GpsRadarDot: + Sequence: Plane + WithColoredSelectionBox@INVIS: + RequiresCondition: invisibility || hidden + ColorSource: Player + WithShadow: + RequiresCondition: !invisibility && !hidden + WithShadow@CLOAKED: + ShadowColor: 00000033 + RequiresCondition: invisibility || hidden + Cloak: + DetectionTypes: AirCloak + InitialDelay: 100 + CloakDelay: 200 + CloakSound: trans1.aud + UncloakSound: appear1md.aud + CloakStyle: Palette + CloakedPalette: cloak + IsPlayerPalette: false + UncloakOn: Attack, Dock, Damage, Heal + CloakedCondition: hidden + RequiresCondition: !cloak-force-disabled && airborne && !being-warped + PauseOnCondition: invisibility + GrantConditionOnDamageState@UNCLOAK: + Condition: cloak-force-disabled + ValidDamageStates: Critical + -RangeMultiplier@SEEK: + -RangeMultiplier@SEEK2: + -RangeMultiplier@SEEK3: + -ReloadDelayMultiplier@BOMBARD: + -ReloadDelayMultiplier@BOMBARD2: + -ReloadDelayMultiplier@BOMBARD3: + SoundOnDamageTransitionCA: + DestroyedSounds: vcomdi1a.aud, vcomdi2a.aud + EjectOnDeath: + ChuteSound: gejecta.aud + Encyclopedia: + Category: Nod/Stolen Technology + EncyclopediaExtras: + AdditionalInfo: Stolen from Nod Helipad. + +MCOR: + Inherits: ^HelicopterTD + Inherits@AUTOTARGET: ^AutoTargetAllAssaultMovePrioritizeAir + Inherits@InfiltratorStolenTech: ^InfiltratorStolenTech + Valued: + Cost: 1800 + Tooltip: + Name: Manticore + UpdatesPlayerStatistics: + AddToArmyValue: true + Buildable: + Queue: AircraftSQ, AircraftMQ + BuildAtProductionType: Helicopter + BuildPaletteOrder: 204 + Prerequisites: anyradar, ~stolentech.grav + IconPalette: chrometd + Description: Long ranged air-to-air craft with dual plasma cannons. + TooltipExtras: + Strengths: • Strong vs Aircraft + Weaknesses: • Cannot attack ground units + Aircraft: + CruiseAltitude: 2560 + AltitudeVelocity: 0c100 + TurnSpeed: 14 + TakeoffSounds: dropup1.aud + LandingSounds: dropdwn1.aud + Speed: 80 + Health: + HP: 26000 + RevealsShroud: + Range: 10c0 + MinRange: 8c0 + Type: GroundPosition + RevealGeneratedShroud: False + RevealsShroud@GAPGEN: + Range: 8c0 + Type: GroundPosition + Armament@PRIMARY: + Weapon: ManticoreBolts + LocalOffset: 550,-420,20, 550,420,20 + MuzzleSequence: muzzle + MuzzlePalette: caneon + WithMuzzleOverlay: + AttackAircraft: + FacingTolerance: 20 + AttackType: Hover + PersistentTargeting: false + OpportunityFire: false + PauseOnCondition: empdisable || being-warped || blinded + SpawnActorOnDeath: + Actor: MCOR.Husk + RequiresCondition: airborne && !empdisable && !being-warped + SpawnActorOnDeath@EMP: + Actor: MCOR.Husk.EMP + RequiresCondition: airborne && empdisable && !being-warped + LeavesTrails: + Offsets: -427,0,0 + MovingInterval: 2 + Image: smokey + StationaryInterval: 2 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RequiresCondition: enable-smoke + Selectable: + DecorationBounds: 1792, 1536 + ProducibleWithLevel: + Prerequisites: aircraft.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: aircraft.upgraded + GrantConditionOnDamageState@SmokeTrail: + Condition: enable-smoke + SoundOnDamageTransitionCA: + DestroyedSounds: vcomdi1a.aud, vcomdi2a.aud + EjectOnDeath: + ChuteSound: gejecta.aud + Encyclopedia: + Category: Nod/Stolen Technology + EncyclopediaExtras: + AdditionalInfo: Stolen from Scrin Gravity Stabilizer. + +DISC: + Inherits: ^Helicopter + Inherits@AUTOTARGET: ^AutoTargetAllAssaultMove + Valued: + Cost: 2000 + Tooltip: + Name: Floating Disc + UpdatesPlayerStatistics: + AddToArmyValue: true + Buildable: + Queue: AircraftSQ, AircraftMQ + BuildAtProductionType: Helicopter + BuildPaletteOrder: 83 + Prerequisites: afld, stek, ~aircraft.yuri, ~techlevel.high + Description: Heavily armored attack craft. + TooltipExtras: + Strengths: • Strong vs Buildings, Defenses, Light Armor + Attributes: • Special Ability: Power Drain\n• Special Ability: Resource Drain + Health: + HP: 65000 + RevealsShroud: + Range: 11c0 + MinRange: 9c0 + Type: GroundPosition + RevealGeneratedShroud: False + RevealsShroud@GAPGEN: + Range: 9c0 + Type: GroundPosition + TargetSpecificOrderVoice: + Orders: Attack, ForceAttack + TargetTypeVoices: + PowerDrainable: Steal + ResourceDrainable: Steal + DefaultVoice: Attack + Aircraft: + Speed: 60 + CruiseAltitude: 2560 + AltitudeVelocity: 0c100 + TurnSpeed: 512 + Voice: Move + AttackTurreted: + FacingTolerance: 512 + Armaments: primary, secondary, tertiary + Voice: Attack + PauseOnCondition: empdisable || being-warped || blinded + Armament@PRIMARY: + Weapon: FloatingDiscLaser + FireDelay: 5 + LocalOffset: 828,0,0 + MuzzleSequence: muzzle + MuzzlePalette: scrin + PauseOnCondition: draining + Armament@Secondary: + Weapon: FloatingDiscPowerDrainer + ForceTargetRelationships: Enemy + Name: secondary + PauseOnCondition: !draining + Armament@Tertiary: + Weapon: FloatingDiscResourceDrainer + ForceTargetRelationships: Enemy + Name: tertiary + PauseOnCondition: !draining + Turreted: + TurnSpeed: 512 + WithAttackOverlay: + Sequence: charge + Palette: scrin + WithMuzzleOverlay: + GrantConditionOnAttackCA@PowerDrain: + Condition: powerdraining + RevokeDelay: 11 + ArmamentNames: secondary + GrantConditionOnAttackCA@ResourceDrain: + Condition: resourcedraining + RevokeDelay: 11 + ArmamentNames: tertiary + CashTrickler@ResourceDrain: + Interval: 50 + Amount: 30 + RequiresCondition: resourcedraining + WithIdleOverlay@Drain: + Sequence: drain + Palette: effect + RequiresCondition: powerdraining || resourcedraining + IsDecoration: true + AmbientSoundCA@Drain: + SoundFiles: vflolo5b.aud + InitialSound: vflolo4a.aud + FinalSound: vflolo6a.aud + RequiresCondition: powerdraining || resourcedraining + InitialSoundLength: 33 + SpawnActorOnDeath: + Actor: DISC.Husk + RequiresCondition: airborne && !empdisable && !being-warped + SpawnActorOnDeath@EMP: + Actor: DISC.Husk.EMP + RequiresCondition: airborne && empdisable && !being-warped + LeavesTrails@2: + Offsets: 0,300,0 + MovingInterval: 2 + Image: smokey + StationaryInterval: 10 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RequiresCondition: enable-smoke + LeavesTrails@3: + Offsets: 300,-300,0 + MovingInterval: 2 + Image: smokey + StationaryInterval: 15 + StartDelay: 15 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RequiresCondition: enable-smoke + Selectable: + DecorationBounds: 1792, 1536 + Voiced: + VoiceSet: DiscVoice + ExternalCondition@PRODUCED: + Condition: produced + VoiceAnnouncement: + RequiresCondition: produced + Voice: Build + ValidRelationships: Neutral, Ally + SoundOnDamageTransitionCA: + DestroyedSounds: diskdie1.aud + ProducibleWithLevel: + Prerequisites: aircraft.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: aircraft.upgraded + GrantConditionOnDamageState@SmokeTrail: + Condition: enable-smoke + AmbientSoundCA: + SoundFiles: diskmolp2a.aud, diskmolp2b.aud + Interval: 15 + VolumeMultiplier: 0.08 + SpeedMultiplier@EMPDISABLE: + Modifier: 0 + RequiresCondition: empdisable + -KillsSelf@Emp: + -RangeMultiplier@SEEK: + -RangeMultiplier@SEEK2: + -RangeMultiplier@SEEK3: + TargetedAttackAbility: + ActiveCondition: draining + ArmamentNames: secondary, tertiary + CircleWidth: 0 + Type: Drain + ActiveUntilCancelled: true + Encyclopedia: + Category: Soviets/Aircraft + EncyclopediaExtras: + Subfaction: yuri + +JACK: + Inherits: ^PlaneTD + Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove + Valued: + Cost: 500 + Tooltip: + Name: Jackknife + UpdatesPlayerStatistics: + AddToArmyValue: true + Buildable: + Queue: AircraftSQ, AircraftMQ + BuildAtProductionType: Plane + BuildPaletteOrder: 44 + Prerequisites: afld.gdi, anyradar, ~aircraft.arc, ~techlevel.medium + Description: Loitering munition that dives at targets and explodes. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor, Infantry, Defenses + Weaknesses: • Weak vs Buildings\n• Cannot attack Aircraft + Aircraft: + AltitudeVelocity: 0c100 + TurnSpeed: 20 + Speed: 135 + IdleSpeed: 72 + Repulsable: false + Voice: Move + Voiced: + VoiceSet: JackknifeVoice + Health: + HP: 3500 + RevealsShroud: + Range: 10c0 + MinRange: 8c0 + Type: GroundPosition + RevealGeneratedShroud: False + RevealsShroud@GAPGEN: + Range: 9c0 + Type: GroundPosition + Armament@PRIMARY: + Weapon: JackknifeTargeter + PauseOnCondition: blinded + FireWarheadsOnDeath: + Weapon: JackknifeExplosion + EmptyWeapon: JackknifeExplosion + -RequiresCondition: + Targetable@AIRBORNE: + TargetTypes: AirSmall + Targetable@Jackknife: + TargetTypes: Jackknife + AttackAircraft: + FacingTolerance: 80 + Voice: Attack + OpportunityFire: false + PersistentTargeting: false + PauseOnCondition: empdisable || being-warped + DiveOnAttack: + Speed: 320 + DiveCondition: diving + AutoTarget: + InitialStance: HoldFire + InitialStanceAI: AttackAnything + LeavesTrails: + Offsets: -427,0,0 + MovingInterval: 2 + Image: smokey + StationaryInterval: 2 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RequiresCondition: enable-smoke + Selectable: + DecorationBounds: 1280, 1024 + GrantConditionOnDamageState@SmokeTrail: + Condition: enable-smoke + Contrail@1: + StartColor: FFFFFF60 + StartColorAlpha: 96 + -EjectOnDeath: + -SpawnActorOnDeath: + -Contrail@2: + -SoundOnDamageTransitionCA: + ActorLostNotification: + RequiresCondition: !diving + TargetedAttackAbility: + TargetCursor: attack + ArmamentNames: primary + CircleWidth: 0 + Type: JackKnifeDive + TargetFrozenActors: true + DeployCursor: move + -AttackMove: + AutoTargetPriority@ATTACKANYTHING: + RequiresCondition: stance-attackanything + Encyclopedia: + Category: GDI/Aircraft + EncyclopediaExtras: + Subfaction: arc diff --git a/mods/ca/rules/bridges.yaml b/mods/ca/rules/bridges.yaml index cfb8550e7e..4c4ebd2e9b 100644 --- a/mods/ca/rules/bridges.yaml +++ b/mods/ca/rules/bridges.yaml @@ -12,7 +12,7 @@ BR1: Actor: bridgehut SpawnOffset: 2,0 Interactable: - Bounds: 96,72 + Bounds: 4096, 3072 HitShape: Type: Rectangle TopLeft: -2048, -512 @@ -40,7 +40,7 @@ BR2: Actor: bridgehut SpawnOffset: 1,1 Interactable: - Bounds: 120,72 + Bounds: 5120, 3072 HitShape: Type: Rectangle TopLeft: -2560, -512 @@ -87,7 +87,7 @@ BRG1: DestroyedTemplate: 702 SouthOffset: 3,2 Interactable: - Bounds: 96,72 + Bounds: 4096, 3072 FreeActor: Actor: bridgehut SpawnOffset: 0,0 @@ -118,7 +118,7 @@ BRG2: Actor: bridgehut SpawnOffset: 2,1 Interactable: - Bounds: 120,72 + Bounds: 5120, 3072 HitShape: Type: Rectangle TopLeft: -2048, -512 @@ -225,7 +225,7 @@ BRH1: Actor: bridgehut SpawnOffset: 0,1 Interactable: - Bounds: 48,96 + Bounds: 2048, 4096 HitShape: Type: Rectangle TopLeft: -1024, -1536 @@ -246,7 +246,7 @@ BRH2: Actor: bridgehut SpawnOffset: 0,1 Interactable: - Bounds: 48,96 + Bounds: 2048, 4096 HitShape: Type: Rectangle TopLeft: -1024, -1536 @@ -269,7 +269,7 @@ BRH3: NorthOffset: -1,1 SouthOffset: 2,1 Interactable: - Bounds: 48,96 + Bounds: 2048, 4096 HitShape: Type: Rectangle TopLeft: -1024, -1536 @@ -291,7 +291,7 @@ BRIDGE1: Actor: bridgehut SpawnOffset: 0,1 Interactable: - Bounds: 120,72 + Bounds: 5120, 3072 HitShape: Type: Rectangle TopLeft: -2048, -512 @@ -321,7 +321,7 @@ BRIDGE2: Actor: bridgehut SpawnOffset: 2,1 Interactable: - Bounds: 120,48 + Bounds: 5120, 2048 HitShape: Type: Rectangle TopLeft: -2048, -512 @@ -351,7 +351,7 @@ BRIDGE3: Actor: bridgehut SpawnOffset: 0,1 Interactable: - Bounds: 120,72 + Bounds: 5120, 3072 HitShape: Type: Rectangle TopLeft: -2048, -512 @@ -381,7 +381,7 @@ BRIDGE4: Actor: bridgehut SpawnOffset: 2,1 Interactable: - Bounds: 120,48 + Bounds: 5120, 2048 HitShape: Type: Rectangle TopLeft: -2048, -512 @@ -411,7 +411,7 @@ SBRIDGE1: Actor: bridgehut.small SpawnOffset: 1,1 Interactable: - Bounds: 72,48 + Bounds: 3072, 2048 HitShape: Type: Rectangle TopLeft: -1024, -1408 @@ -433,7 +433,7 @@ SBRIDGE2: Actor: bridgehut.small SpawnOffset: 1,1 Interactable: - Bounds: 48,72 + Bounds: 2048, 3072 HitShape: Type: Rectangle TopLeft: -1408, -1024 @@ -497,6 +497,48 @@ SBRIDGE5: Duration: 15 Intensity: 6 +SBRIDGE6: + Inherits: ^Bridge + Bridge: + Template: 620 + DamagedTemplate: 621 + DestroyedTemplate: 622 + FreeActor@north: + Actor: bridgehut + SpawnOffset: 2,-1 + FreeActor@south: + Actor: bridgehut + SpawnOffset: 0,1 + HitShape: + Type: Rectangle + TopLeft: -1024, -1024 + BottomRight: 2048, 0 + HitShape@2: + Type: Rectangle + TopLeft: -2048, 0 + BottomRight: 1536, 1024 + +SBRIDGE7: + Inherits: ^Bridge + Bridge: + Template: 624 + DamagedTemplate: 625 + DestroyedTemplate: 626 + FreeActor@north: + Actor: bridgehut + SpawnOffset: 0,-1 + FreeActor@south: + Actor: bridgehut + SpawnOffset: 2,1 + HitShape: + Type: Rectangle + TopLeft: -2048, -1024 + BottomRight: 1024, 0 + HitShape@2: + Type: Rectangle + TopLeft: -1536, 0 + BottomRight: 2048, 1024 + BRIDGEHUT: AlwaysVisible: BodyOrientation: @@ -505,11 +547,11 @@ BRIDGEHUT: Footprint: __ __ Dimensions: 2,2 Selectable: - Bounds: 48,48 + Bounds: 2048, 2048 Priority: 2 LegacyBridgeHut: Targetable: - TargetTypes: BridgeHut, C4 + TargetTypes: BridgeHut, C4Plantable Demolishable: BRIDGEHUT.small: @@ -518,9 +560,9 @@ BRIDGEHUT.small: Footprint: _ Dimensions: 1,1 Selectable: - Bounds: 24,24 + Bounds: 1024, 1024 Priority: 2 LegacyBridgeHut: Targetable: - TargetTypes: BridgeHut, C4 + TargetTypes: BridgeHut, C4Plantable Demolishable: diff --git a/mods/ca/rules/campaign-palettes.yaml b/mods/ca/rules/campaign-palettes.yaml deleted file mode 100644 index 3c4c1530f4..0000000000 --- a/mods/ca/rules/campaign-palettes.yaml +++ /dev/null @@ -1,29 +0,0 @@ -^Palettes: - -PlayerColorPalette: - -PaletteFromPlayerPaletteWithAlpha@cloak: - -PaletteFromPlayerPaletteWithAlpha@placebuilding: - IndexedPlayerPalette: - BasePalette: player - BaseName: player - RemapIndex: 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95 - PlayerIndex: - USSR: 229, 230, 231, 232, 233, 234, 235, 8, 236, 237, 238, 239, 221, 222, 223, 223 - Ukraine: 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223 - Greece: 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175 - England: 208, 208, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 154, 155, 143 - Germany: 128, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 121, 122, 122, 123, 123 - France: 224, 224, 225, 225, 226, 184, 185, 186, 187, 188, 188, 189, 190, 190, 191, 191 - Spain: 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95 - Turkey: 200, 200, 201, 202, 203, 203, 204, 205, 206, 206, 207, 221, 222, 222, 223, 223 - Neutral: 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143 - Creeps: 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143 - GoodGuy: 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175 - BadGuy: 229, 230, 231, 232, 233, 234, 235, 8, 236, 237, 238, 239, 221, 222, 223, 223 - PaletteFromPlayerPaletteWithAlpha@Cloak: - BaseName: cloak - BasePalette: player - Alpha: 0.55 - PaletteFromPlayerPaletteWithAlpha@Placebuilding: - BaseName: placebuilding - BasePalette: player - Alpha: 0.65 diff --git a/mods/ca/rules/campaign-rules.yaml b/mods/ca/rules/campaign-rules.yaml deleted file mode 100644 index 87c39f7229..0000000000 --- a/mods/ca/rules/campaign-rules.yaml +++ /dev/null @@ -1,76 +0,0 @@ -Player: - -ConquestVictoryConditions: - MissionObjectives: - EarlyGameOver: true - Shroud: - FogCheckboxLocked: True - FogCheckboxEnabled: True - ExploredMapCheckboxLocked: True - ExploredMapCheckboxEnabled: False - PlayerResources: - DefaultCashDropdownLocked: True - DefaultCash: 0 - ModularBot@CampaignAI: - Name: Campaign Player AI - Type: campaign - -World: - CrateSpawner: - CheckboxEnabled: False - CheckboxLocked: True - -SpawnMPUnits: - -MPStartLocations: - ObjectivesPanel: - PanelName: MISSION_OBJECTIVES - MapBuildRadius: - AllyBuildRadiusCheckboxLocked: True - AllyBuildRadiusCheckboxEnabled: False - BuildRadiusCheckboxLocked: True - BuildRadiusCheckboxEnabled: True - MapOptions: - TechLevelDropdownLocked: True - ShortGameCheckboxLocked: True - ShortGameCheckboxEnabled: False - -E7: - -Crushable: - -E7.noautotarget: - Inherits: E7 - -AutoTarget: - -AutoTargetPriority@DEFAULT: - -AutoTargetPriority@ATTACKANYTHING: - AttackMove: - -AssaultMoveScanCondition: - RenderSprites: - Image: E7 - -^Vehicle: - Demolishable: - -MONEYCRATE: - Tooltip: - Name: Crate - GiveCashCrateAction: - Amount: 2000 - RenderSprites: - Image: scrate - -FCOM: - Capturable: - Types: ~disabled - -GivesBuildableArea: - -BaseProvider: - -MISS: - RevealsShroud: - Range: 3c0 - -RevealsShroud@GAPGEN: - -Ant: - Buildable: - Prerequisites: ~disabled - -Zombie: - Buildable: - Prerequisites: ~disabled diff --git a/mods/ca/rules/campaign-tooltips.yaml b/mods/ca/rules/campaign-tooltips.yaml deleted file mode 100644 index 876861ce82..0000000000 --- a/mods/ca/rules/campaign-tooltips.yaml +++ /dev/null @@ -1,91 +0,0 @@ -^Vehicle: - Tooltip: - GenericVisibility: Enemy - ShowOwnerRow: false - -^Infantry: - Tooltip: - GenericVisibility: Enemy - ShowOwnerRow: false - -^Ship: - Tooltip: - GenericVisibility: Enemy - ShowOwnerRow: false - -^NeutralPlane: - Tooltip: - GenericVisibility: Enemy - ShowOwnerRow: false - -^Helicopter: - Tooltip: - GenericVisibility: Enemy - ShowOwnerRow: false - -^Building: - Tooltip: - GenericVisibility: Enemy - ShowOwnerRow: false - -^CivBuilding: - Tooltip: - ShowOwnerRow: false - -^CivField: - Tooltip: - ShowOwnerRow: false - -^TechBuilding: - Tooltip: - ShowOwnerRow: false - -^Wall: - Tooltip: - ShowOwnerRow: false - -^Husk: - Tooltip: - GenericVisibility: Enemy, Ally, Neutral - GenericStancePrefix: false - ShowOwnerRow: false - -^PlaneHusk: - Tooltip: - GenericVisibility: Enemy, Ally, Neutral - GenericStancePrefix: false - ShowOwnerRow: false - -^HelicopterHusk: - Tooltip: - GenericVisibility: Enemy, Ally, Neutral - GenericStancePrefix: false - ShowOwnerRow: false - -^Crate: - Tooltip: - ShowOwnerRow: false - -FLARE: - Tooltip: - ShowOwnerRow: false - -SPY: - DisguiseTooltip: - ShowOwnerRow: false - -BIO: - -TooltipDescription@ally: - -TooltipDescription@other: - -FCOM: - Tooltip: - GenericVisibility: Enemy - -TooltipDescription@ally: - -TooltipDescription@other: - -MISS: - Tooltip: - Name: Technology Center - -TooltipDescription@ally: - -TooltipDescription@other: diff --git a/mods/ca/rules/civilian.yaml b/mods/ca/rules/civilian.yaml index 571f1942ca..d722ef145e 100644 --- a/mods/ca/rules/civilian.yaml +++ b/mods/ca/rules/civilian.yaml @@ -1,9 +1,10 @@ C1: - Inherits@1: ^CivInfantry - Inherits@2: ^ArmedCivilian + Inherits@1: ^ArmedCivilian Inherits@CREW: ^CanCaptureDriverlessVehicles Valued: - Cost: 75 + Cost: 50 + Buildable: + Queue: Civilian C2: Inherits@1: C1 @@ -41,11 +42,12 @@ TECN: Image: c1 Tooltip: Name: Technician + FCOM: Inherits: ^TechBuilding Inherits@shape: ^2x2Shape Selectable: - Bounds: 48,48 + Bounds: 2048, 2048 OwnerLostAction: Action: ChangeOwner Building: @@ -58,6 +60,8 @@ FCOM: Type: Wood Tooltip: Name: Forward Command + TooltipExtras: + Description: Provides buildable area. TooltipDescription@ally: Description: Provides buildable area. ValidRelationships: Ally @@ -76,17 +80,17 @@ FCOM: CapturableProgressBar: CapturableProgressBlink: GivesBuildableArea: - AreaTypes: building + AreaTypes: building, defense BaseProvider: Range: 8c0 - EngineerRepairable: + InstantlyRepairable: Power: Amount: 0 ProvidesPrerequisite@buildingname: SpawnActorOnDeath: Actor: FCOM.Husk OwnerType: InternalName - -Explodes: + -FireWarheadsOnDeath: AppearsOnMapPreview: HOSP: @@ -96,7 +100,7 @@ HOSP: Action: ChangeOwner Selectable: Priority: 0 - Bounds: 48,48 + Bounds: 2048, 2048 Building: Footprint: xx xx Dimensions: 2,2 @@ -107,14 +111,16 @@ HOSP: Types: building CapturableProgressBar: CapturableProgressBlink: - EngineerRepairable: + InstantlyRepairable: Tooltip: Name: Hospital + TooltipExtras: + Description: Heals nearby infantry and trains two Medics/Rejuvenators every two minutes. TooltipDescription@ally: - Description: Provides infantry with self-healing. + Description: Heals nearby infantry and trains two Medics/Rejuvenators every two minutes. ValidRelationships: Ally TooltipDescription@other: - Description: Capture to enable self-healing for infantry. + Description: Capture to heal nearby infantry and train two Medics/Rejuvenators every two minutes. ValidRelationships: Neutral, Enemy RevealsShroud: Range: 4c0 @@ -123,23 +129,161 @@ HOSP: WithDeathAnimation: DeathSequence: dead UseDeathTypeSuffix: false - ProvidesPrerequisite@medi: - Prerequisite: infantry.medi - RequiresPrerequisites: infantry.any - ProvidesPrerequisite@smedi: - Prerequisite: infantry.smedi - RequiresPrerequisites: infantry.scrin SpawnActorOnDeath: Actor: HOSP.Husk OwnerType: InternalName - -Explodes: + -FireWarheadsOnDeath: AppearsOnMapPreview: ProximityExternalCondition@HOSPITAL: Condition: hospitalheal Range: 9c0 WithRangeCircle@HOSPITAL: + Type: HospitalHeal Range: 9c0 Color: 00FF0080 + RallyPoint: + PeriodicProducerCA@MEDIC: + Type: Hospital + ChargeDuration: 3000 + InitialChargeDuration: 125 + Actors: medi, medi + ShowSelectionBar: true + RequiresCondition: !is-neutral && !scrinplayer + ResetTraitOnOwnerChange: true + ReadyAudio: UnitReady + ChargeColor: ffffff + PeriodicProducerCA@REJUVENATOR: + Type: Hospital + ChargeDuration: 3000 + InitialChargeDuration: 125 + Actors: smedi, smedi + ShowSelectionBar: true + RequiresCondition: !is-neutral && scrinplayer + ResetTraitOnOwnerChange: true + ReadyAudio: UnitReady + ChargeColor: ffffff + Exit@1: + SpawnOffset: -190,880,0 + ExitCell: 1,2 + ProductionTypes: Hospital + Exit@2: + SpawnOffset: 190,-400,0 + ExitCell: 1,-1 + ProductionTypes: Hospital + Production: + Produces: Hospital + GrantConditionIfOwnerIsNeutral: + Condition: is-neutral + GrantConditionOnPrerequisite@SCRIN: + Condition: scrinplayer + Prerequisites: player.scrin + +HOSP.Rebuilt: + Inherits: HOSP + RenderSprites: + Image: hosp + PeriodicProducerCA@MEDIC: + InitialChargeDuration: -1 + PeriodicProducerCA@REJUVENATOR: + InitialChargeDuration: -1 + -MapEditorData: + -Encyclopedia: + +MACS: + Inherits: ^TechBuilding + Inherits@shape: ^2x2Shape + OwnerLostAction: + Action: ChangeOwner + Selectable: + Priority: 0 + Bounds: 2048, 2048 + Building: + Footprint: xx xx + Dimensions: 2,2 + Health: + HP: 80000 + CaptureManager: + Capturable: + Types: building + CapturableProgressBar: + CapturableProgressBlink: + InstantlyRepairable: + Tooltip: + Name: Machine Shop + TooltipExtras: + Description: Repairs nearby vehicles and trains two Mechanics/Artificers every two minutes. + TooltipDescription@ally: + Description: Repairs nearby vehicles and trains two Mechanics/Artificers every two minutes. + ValidRelationships: Ally + TooltipDescription@other: + Description: Capture to repair nearby vehicles and train two Mechanics/Artificers every two minutes. + ValidRelationships: Neutral, Enemy + RevealsShroud: + Range: 4c0 + WithBuildingBib: + HasMinibib: true + WithDeathAnimation: + DeathSequence: dead + UseDeathTypeSuffix: false + SpawnActorOnDeath: + Actor: MACS.Husk + OwnerType: InternalName + -FireWarheadsOnDeath: + AppearsOnMapPreview: + ProximityExternalCondition@MACS: + Condition: macsrepair + Range: 9c0 + WithRangeCircle@MACS: + Type: macsrepair + Range: 9c0 + Color: 00FF0080 + RallyPoint: + PeriodicProducerCA@MECHANIC: + Type: Macs + ChargeDuration: 4500 + InitialChargeDuration: 125 + Actors: mech, mech + ShowSelectionBar: true + RequiresCondition: !is-neutral && !scrinplayer + ResetTraitOnOwnerChange: true + ReadyAudio: UnitReady + ChargeColor: ffffff + PeriodicProducerCA@ARTIFICER: + Type: Macs + ChargeDuration: 4500 + InitialChargeDuration: 125 + Actors: arti, arti + ShowSelectionBar: true + RequiresCondition: !is-neutral && scrinplayer + ResetTraitOnOwnerChange: true + ReadyAudio: UnitReady + ChargeColor: ffffff + Exit@1: + SpawnOffset: -190,880,0 + ExitCell: 1,2 + ProductionTypes: Macs + Exit@2: + SpawnOffset: 190,-400,0 + ExitCell: 1,-1 + ProductionTypes: Macs + Production: + Produces: Macs + GrantConditionIfOwnerIsNeutral: + Condition: is-neutral + GrantConditionOnPrerequisite@SCRIN: + Condition: scrinplayer + Prerequisites: player.scrin + +MACS.Rebuilt: + Inherits: MACS + RenderSprites: + Image: macs + PeriodicProducerCA@MECHANIC: + InitialChargeDuration: -1 + PeriodicProducerCA@ARTIFICER: + InitialChargeDuration: -1 + -MapEditorData: + -Encyclopedia: V01: Inherits: ^CivBuilding @@ -300,13 +444,10 @@ V19: Palette: player Tooltip: Name: Oil Pump - -SpawnRandomActorOnDeath@1: - -SpawnRandomActorOnDeath@2: - -SpawnRandomActorOnDeath@3: SpawnActorOnDeath: Actor: V19.Husk Targetable: - TargetTypes: Ground, C4, DetonateAttack, Structure, NoAutoTarget + TargetTypes: Ground, Structure, NoAutoTarget V19.Husk: Inherits: ^CivBuilding @@ -320,51 +461,17 @@ V19.Husk: Sequence: fire-loop -Selectable: -Targetable: - -Explodes: - -Explodes@CIVPANIC: + -Targetable@C4Plantable: + -Targetable@TNTPlantable: + -FireWarheadsOnDeath: + -FireWarheadsOnDeath@CIVPANIC: Interactable: BARL: - Inherits: ^TechBuilding - -Selectable: - Health: - HP: 1000 - Explodes: - Weapon: BarrelExplode - Tooltip: - Name: Explosive Barrel - ShowOwnerRow: False - Armor: - Type: None - Targetable: - TargetTypes: Ground, DemoTruck, Barrel, NoAutoTarget - -ShakeOnDeath: - -SoundOnDamageTransition: - MapEditorData: - Categories: Decoration - Interactable: - Bounds: 24,24 + Inherits: ^Barrel BRL3: - Inherits: ^TechBuilding - -Selectable: - Health: - HP: 1000 - Explodes: - Weapon: BarrelExplode - Tooltip: - Name: Explosive Barrel - ShowOwnerRow: False - Armor: - Type: None - Targetable: - TargetTypes: Ground, DemoTruck, Barrel, NoAutoTarget - -ShakeOnDeath: - -SoundOnDamageTransition: - MapEditorData: - Categories: Decoration - Interactable: - Bounds: 24,24 + Inherits: ^Barrel AMMOBOX1: Inherits: ^AmmoBox @@ -383,7 +490,7 @@ MISS: TargetableOffsets: 0,0,0, 840,0,0, 840,-1024,0, 420,768,0, -840,0,0, -840,-1024,0, -840,1024,0 Selectable: Priority: 0 - Bounds: 72,48 + Bounds: 3072, 2048 OwnerLostAction: Action: ChangeOwner Building: @@ -393,7 +500,7 @@ MISS: Health: HP: 60000 RevealsShroud: - Range: 10c0 + Range: 12c0 RevealGeneratedShroud: False RevealsShroud@GAPGEN: Range: 6c0 @@ -401,11 +508,13 @@ MISS: Type: Wood Tooltip: Name: Communications Center + TooltipExtras: + Description: Provides vision of the surrounding area. TooltipDescription@ally: - Description: Provides range of vision. + Description: Provides vision of the surrounding area. ValidRelationships: Ally TooltipDescription@other: - Description: Capture to give visual range. + Description: Capture to provide vision of surrounding area. ValidRelationships: Neutral, Enemy WithBuildingBib: CaptureManager: @@ -413,7 +522,7 @@ MISS: Types: building CapturableProgressBar: CapturableProgressBlink: - EngineerRepairable: + InstantlyRepairable: WithDeathAnimation: DeathSequence: dead UseDeathTypeSuffix: false @@ -421,13 +530,13 @@ MISS: SpawnActorOnDeath: Actor: MISS.Husk OwnerType: InternalName - -Explodes: + -FireWarheadsOnDeath: BIO: Inherits: ^TechBuilding Inherits@shape: ^2x2Shape Selectable: - Bounds: 48,48 + Bounds: 2048, 2048 OwnerLostAction: Action: ChangeOwner Building: @@ -440,14 +549,16 @@ BIO: Capturable: Types: building CapturableProgressBar: - EngineerRepairable: + InstantlyRepairable: Tooltip: Name: Biological Lab + TooltipExtras: + Description: Provides access to the toxin truck and chem mortar units. TooltipDescription@ally: - Description: Provides prerequisite for Bio-Lab units. + Description: Provides access to the toxin truck and chem mortar units. ValidRelationships: Ally TooltipDescription@other: - Description: Capture to produce Bio-Lab units. + Description: Capture for access to the toxin truck and chem mortar units. ValidRelationships: Neutral, Enemy WithDeathAnimation: DeathSequence: dead @@ -456,17 +567,19 @@ BIO: SpawnActorOnDeath: Actor: BIO.Husk OwnerType: InternalName - -Explodes: + -FireWarheadsOnDeath: AppearsOnMapPreview: ProvidesPrerequisite@mortar: - Prerequisite: inf.nod.stolen + Prerequisite: stolentech.hand + ProvidesPrerequisite@toxintruck: + Prerequisite: vehicles.ttrk OILB: Inherits: ^TechBuilding Inherits@shape: ^2x2Shape Selectable: Priority: 0 - Bounds: 48,48 + Bounds: 2048, 2048 OwnerLostAction: Action: ChangeOwner Building: @@ -481,25 +594,38 @@ OILB: Types: building CapturableProgressBar: CapturableProgressBlink: - EngineerRepairable: + InstantlyRepairable: CashTrickler: Interval: 375 - Amount: 100 + Amount: 125 + RequiresCondition: enabled + GrantPeriodicCondition@Tick: + ActiveDuration: 1 + CooldownDuration: 374 + Condition: tick + ShowSelectionBar: true + ShowSelectionBarWhenEmpty: false + CooldownColor: FF00FF RequiresCondition: enabled + ResetTimeOnReenable: false + DummyConditionConsumer@Tick: + Condition: tick Tooltip: Name: Oil Derrick + TooltipExtras: + Description: Provides additional funds. + Attributes: • Gives $125 every 15 seconds.\n• Gives $400 on first capture. TooltipDescription@ally: Description: Provides additional funds. ValidRelationships: Ally TooltipDescription@other: Description: Capture to receive additional funds. ValidRelationships: Neutral, Enemy - Explodes: + FireWarheadsOnDeath: Weapon: BarrelExplode SpawnActorOnDeath: Actor: OILB.Husk OwnerType: InternalName - -Explodes: UpdatesDerrickCount: AppearsOnMapPreview: GrantConditionOnCombatantOwner: @@ -509,10 +635,79 @@ OILB: WithIdleOverlay@flare: Sequence: flare Offset: 2078,-480,0 + Palette: effect RequiresCondition: !damaged WithIdleOverlay@damaged-flare: Sequence: damaged-flare Offset: 2500,250,0 + Palette: effect + RequiresCondition: damaged + GrantConditionIfOwnerIsNeutral: + Condition: is-neutral + GivesCashOnCapture@defloration: + Amount: 400 + RequiresCondition: !has-been-captured + GivesCashOnCapture@subsequent: + Amount: 125 + RequiresCondition: has-been-captured + GrantDelayedCondition: + Delay: 1 + Condition: has-been-captured + RequiresCondition: !is-neutral + +OILR: + Inherits: ^TechBuilding + Inherits@shape: ^3x2Shape + HitShape: + UseTargetableCellsOffsets: false + TargetableOffsets: 0,0,0, 840,0,0, 840,-1024,0, 420,768,0, -840,0,0, -840,-1024,0, -840,1024,0 + Selectable: + Priority: 0 + Bounds: 3072, 2048 + OwnerLostAction: + Action: ChangeOwner + Building: + Footprint: xxx xxx === + Dimensions: 3,3 + LocalCenterOffset: 0,-512,0 + Health: + HP: 80000 + RevealsShroud: + Range: 4c0 + CaptureManager: + Capturable: + Types: building + CapturableProgressBar: + CapturableProgressBlink: + InstantlyRepairable: + Tooltip: + Name: Oil Refinery + TooltipExtras: + Description: Provides 10% discount on all unit production. + TooltipDescription@ally: + Description: Provides 10% discount on all unit production. + ValidRelationships: Ally + TooltipDescription@other: + Description: Capture to receive a 10% discount on all unit production. + ValidRelationships: Neutral, Enemy + FireWarheadsOnDeath: + Weapon: BarrelExplode + ProvidesPrerequisite@buildingname: + SpawnActorOnDeath: + Actor: OILR.Husk + OwnerType: InternalName + AppearsOnMapPreview: + GrantConditionOnDamageState: + Condition: damaged + WithIdleOverlay@flare: + Sequence: flare + Offset: 2500,-390,0 + Palette: effect + RequiresCondition: !damaged + WithIdleOverlay@damaged-flare: + Sequence: damaged-flare + Offset: 2600,180,0 + Palette: effect RequiresCondition: damaged GrantConditionIfOwnerIsNeutral: Condition: is-neutral @@ -717,7 +912,6 @@ SNOWHUT: Footprint: x x Dimensions: 1,2 RenderSprites: - Scale: 0.7 HitShape: UseTargetableCellsOffsets: false @@ -726,7 +920,7 @@ LHUS: MapEditorData: RequireTilesets: TEMPERAT Selectable: - Bounds: 24,48,0,-16 + Bounds: 1024, 2048, 0, -682 Tooltip: Name: Lighthouse Building: @@ -738,8 +932,8 @@ WINDMILL: MapEditorData: RequireTilesets: TEMPERAT Selectable: - Bounds: 24,24,0,-14 - DecorationBounds: 36,36,0,-14 + Bounds: 1024, 1024, 0, -597 + DecorationBounds: 1536, 1536, 0, -597 SelectionDecorations: Tooltip: Name: Windmill diff --git a/mods/ca/rules/custom/campaign-rules.yaml b/mods/ca/rules/custom/campaign-rules.yaml new file mode 100644 index 0000000000..29aaf04176 --- /dev/null +++ b/mods/ca/rules/custom/campaign-rules.yaml @@ -0,0 +1,1134 @@ +^ExistsInWorld: + GivesExperienceCA: + ActorExperienceOnDamage: false + ScriptTags: + +^Palettes: + TintPostProcessEffect: + +Player: + -ConquestVictoryConditions: + MissionObjectives: + Shroud: + ExploredMapCheckboxEnabled: False + ExploredMapCheckboxLocked: True + ExploredMapCheckboxVisible: False + FogCheckboxEnabled: True + FogCheckboxLocked: False + FogCheckboxVisible: True + PlayerResources: + DefaultCashDropdownLocked: True + DefaultCashDropdownVisible: False + DefaultCash: 0 + SelectableCash: 0, 1000, 2000, 5000 + ModularBot@CampaignAI: + Name: Campaign AI + Type: campaign + ModularBot@DormantAI: + Name: Dormant AI + Type: dormant + GrantConditionOnBotOwner@CampaignAI: + Condition: enable-campaign-ai + Bots: campaign + SupportPowerBotModule: + RequiresCondition: enable-brutal-ai || enable-vhard-ai || enable-hard-ai || enable-normal-ai || enable-easy-ai || enable-naval-ai || enable-campaign-ai + HarvesterBotModuleCA: + RequiresCondition: enable-brutal-ai || enable-vhard-ai || enable-hard-ai || enable-normal-ai || enable-easy-ai || enable-naval-ai || enable-campaign-ai + LobbyPrerequisiteCheckbox@GLOBALBOUNTY: + Enabled: False + Locked: True + Visible: False + LobbyPrerequisiteCheckbox@FORCESHIELD: + Enabled: False + Locked: True + Visible: False + LobbyPrerequisiteCheckbox@GLOBALFACTUNDEPLOY: + Locked: True + Visible: False + LobbyPrerequisiteCheckbox@NAVY: + Locked: True + Visible: False + LobbyPrerequisiteCheckbox@BALANCEDHARVESTING: + Locked: True + Visible: False + LobbyPrerequisiteCheckbox@FASTREGROWTH: + Locked: True + Visible: False + LobbyPrerequisiteCheckbox@REVEALONFIRE: + Locked: True + Visible: False + DeveloperMode: + CheckboxLocked: True + CheckboxVisible: False + LobbyPrerequisiteDropdown@QUEUETYPE: + Default: global.singlequeue + Locked: True + Visible: False + Values: + global.singlequeue: options-queuetype.singlequeue + CampaignProgressTracker: + +World: + CrateSpawner: + CheckboxEnabled: False + CheckboxLocked: True + CheckboxVisible: False + -SpawnStartingUnits: + -MapStartingLocations: + ScriptLobbyDropdown@DIFFICULTY: + ID: difficulty + Label: dropdown-difficulty.label + Description: dropdown-difficulty.description + Values: + easy: options-difficulty.easy + normal: options-difficulty.normal + hard: options-difficulty.hard + vhard: options-difficulty.vhard + brutal: options-difficulty.brutal + Default: normal + ObjectivesPanel: + PanelName: MISSION_OBJECTIVES + MapBuildRadius: + AllyBuildRadiusCheckboxEnabled: False + AllyBuildRadiusCheckboxLocked: True + AllyBuildRadiusCheckboxVisible: False + BuildRadiusCheckboxEnabled: True + BuildRadiusCheckboxLocked: False + BuildRadiusCheckboxVisible: True + MapOptions: + TechLevelDropdownLocked: True + TechLevelDropdownVisible: False + ShortGameCheckboxEnabled: False + ShortGameCheckboxLocked: True + ShortGameCheckboxVisible: False + TimeLimitManager: + TimeLimitLocked: True + TimeLimitDropdownVisible: False + MusicPlaylist: + VictoryMusic: score + DefeatMusic: map + Faction@0: + Selectable: True + Description: faction-allies.description + Faction@4: + Selectable: True + Description: faction-soviet.description + Faction@8: + Selectable: True + Description: faction-gdi.description + Faction@12: + Selectable: True + Description: faction-nod.description + Faction@16: + Selectable: True + Description: faction-scrin.description + +^Infantry: + GrantConditionOnPrerequisite@BIO: + Prerequisites: disabled + +^Disabled: + Buildable: + Prerequisites: ~disabled + +^NameTag: + WithNameTagDecoration: + MaxLength: 5 + ValidRelationships: Ally + UsePlayerColor: True + Position: Top + Margin: 0,-15 + +# Assigned to actors in missions, assigned in lua dynamically +# (so we use DummyConditionConsumer to prevent yaml warnings) + +^ActorDifficultyConditions: + ExternalCondition@EASY: + Condition: difficulty-easy + ExternalCondition@NORMAL: + Condition: difficulty-normal + ExternalCondition@HARD: + Condition: difficulty-hard + ExternalCondition@VHARD: + Condition: difficulty-vhard + ExternalCondition@BRUTAL: + Condition: difficulty-brutal + DummyConditionConsumer@EASY: + Condition: difficulty-easy + DummyConditionConsumer@NORMAL: + Condition: difficulty-normal + DummyConditionConsumer@HARD: + Condition: difficulty-hard + DummyConditionConsumer@VHARD: + Condition: difficulty-vhard + DummyConditionConsumer@BRUTAL: + Condition: difficulty-brutal + +# Prevent neutralised units decaying + +^AffectedByDriverKill: + ChangesHealth@DRIVER_DEAD: + PercentageStep: 0 + +# Reduce XP gain for snipers to prevent excessive exploiting of driver kill + +SNIP: + GainsExperienceMultiplier@TenPercentXp: + Modifier: 10 + +# Extra power for AI to reduce the number of power plants needed + +^AiExtraPower: + GrantConditionOnPrerequisite@OwnedByAi: + Condition: owned-by-ai + Prerequisites: botplayer + PowerMultiplier@EXTRAPOWER: + Modifier: 130 + RequiresCondition: owned-by-ai + +POWR: + Inherits@EXTRAPOWER: ^AiExtraPower + +APWR: + Inherits@EXTRAPOWER: ^AiExtraPower + +TPWR: + Inherits@EXTRAPOWER: ^AiExtraPower + +NUKE: + Inherits@EXTRAPOWER: ^AiExtraPower + +NUK2: + Inherits@EXTRAPOWER: ^AiExtraPower + +REAC: + Inherits@EXTRAPOWER: ^AiExtraPower + +REA2: + Inherits@EXTRAPOWER: ^AiExtraPower + +# Defense structure external disable condition to allow disabling of specific defenses for AI + +PRIS: + ExternalCondition@DISABLED: + Condition: disabled + +HTUR: + ExternalCondition@DISABLED: + Condition: disabled + +AGUN: + ExternalCondition@DISABLED: + Condition: disabled + +GAP: + ExternalCondition@DISABLED: + Condition: disabled + +TSLA: + ExternalCondition@DISABLED: + Condition: disabled + +SAM: + ExternalCondition@DISABLED: + Condition: disabled + +ATWR: + ExternalCondition@DISABLED: + Condition: disabled + +STWR: + ExternalCondition@DISABLED: + Condition: disabled + +CRAM: + ExternalCondition@DISABLED: + Condition: disabled + +OBLI: + ExternalCondition@DISABLED: + Condition: disabled + +NSAM: + ExternalCondition@DISABLED: + Condition: disabled + +LASP: + ExternalCondition@DISABLED: + Condition: disabled + +SCOL: + ExternalCondition@DISABLED: + Condition: disabled + +SSPK: + -ExternalCondition@DISABLED: + +SHAR: + ExternalCondition@DISABLED: + Condition: disabled + +SGEN: + ExternalCondition@DISABLED: + Condition: disabled + +# Prevent Boris MiG being targeted + +SMIG: + -Targetable@AIRBORNE: + +# Supply Truck not buildable, slower and doesn't drop money crate + +TRUK: + Inherits@CAMPAIGNDISABLED: ^Disabled + Mobile: + Speed: 54 + -SpawnActorOnDeath: + +# Civilian buildings don't spawn civilians on death + +^CivBuilding: + -SpawnRandomActorOnDeath@1: + -SpawnRandomActorOnDeath@2: + -SpawnRandomActorOnDeath@3: + +# Crate adjustments + +MONEYCRATE: + Tooltip: + Name: Crate + CrateCA: + Duration: 0 + GiveCashCrateAction: + Amount: 2000 + ExcludedActorTypes: c1, c2, c3, c4, c5, c6, c7, c8, c9, c10 + RenderSprites: + Image: scrate + +HEALCRATE: + CrateCA: + Duration: 0 + +# Special/utility actors + +ai.unlimited.power: + Inherits@DUMMY: ^InvisibleDummy + Power: + Amount: 10000 + +ai.superweapons.enabled: + Inherits@DUMMY: ^InvisibleDummy + ProvidesPrerequisite: + +ai.minor.superweapons.enabled: + Inherits@DUMMY: ^InvisibleDummy + ProvidesPrerequisite: + +ai.supportpowers.enabled: + Inherits@DUMMY: ^InvisibleDummy + ProvidesPrerequisite: + +ai.reveal.map: + Inherits@DUMMY: ^InvisibleDummy + RevealsMap: + RevealGeneratedShroud: false + +hold3.strat: + Inherits@DUMMY: ^InvisibleDummy + ProvidesPrerequisite@upgradename: + +radar.dummy: + Inherits@DUMMY: ^InvisibleDummy + ProvidesRadar: + +spy.plane.dummy: + Inherits@DUMMY: ^InvisibleDummy + Inherits@SpyPlanePower: ^SpyPlanePower + AirstrikePowerCA@spyplane: + -PauseOnCondition: + +SMALLCAMERA: + Inherits: CAMERA + RevealsShroud: + Range: 5c0 + +LARGECAMERA: + Inherits: CAMERA + RevealsShroud: + Range: 17c0 + +WARPIN: + Inherits: SMALLCAMERA + -RenderSpritesEditorOnly: + RenderSprites: + Image: empty + WithSpriteBody: + BodyOrientation: + QuantizedFacings: 1 + WithRestartableIdleOverlay@WARPIN: + PlayOnce: true + Image: chronobubble + Sequence: warpin + Palette: ra2effect-ignore-lighting-alpha75 + +HIDDENSPAWNER: + Inherits@0: ^InvisibleDummy + Inherits@1: ^ProducesInfantry + Inherits@2: ^ProducesVehicles + Inherits@3: ^ProducesAircraft + Building: + Dimensions: 1,1 + Footprint: _ + TerrainTypes: Clear,Road + EditorOnlyTooltip: + Name: (hiddenspawner) + AlwaysVisible: + WithSpriteBody: + RenderSpritesEditorOnly: + Image: waypoint + BodyOrientation: + QuantizedFacings: 1 + MapEditorData: + Categories: System + Exit: + ExitCell: 0,2 + RallyPoint: + ExternalCondition@FIX1: + Condition: forceshield + ExternalCondition@FIX2: + Condition: being-warped + +# Prevent AI Hospitals/Machine Shops spawning units + +HOSP: + GrantConditionOnPrerequisite@OwnedByAi: + Condition: owned-by-ai + Prerequisites: botplayer + PeriodicProducerCA@MEDIC: + RequiresCondition: !is-neutral && !scrinplayer && !owned-by-ai + PeriodicProducerCA@REJUVENATOR: + RequiresCondition: !is-neutral && scrinplayer && !owned-by-ai + +MACS: + GrantConditionOnPrerequisite@OwnedByAi: + Condition: owned-by-ai + Prerequisites: botplayer + PeriodicProducerCA@MECHANIC: + RequiresCondition: !is-neutral && !scrinplayer && !owned-by-ai + PeriodicProducerCA@ARTIFICER: + RequiresCondition: !is-neutral && scrinplayer && !owned-by-ai + +# Prevent duplicate basic infantry when dual-tech is available + +E2: + Buildable: + Prerequisites: ~infantry.e2, ~!pyle + +N1: + Buildable: + Prerequisites: ~!tmpp, ~infantry.td, ~!infantry.ra + +N3: + Buildable: + Prerequisites: ~!tmpp, ~infantry.td, ~!infantry.ra + +N6: + Buildable: + Prerequisites: ~infantry.td, ~!infantry.ra + +# So AI can produce Shadow Operatives + +SHAD: + Buildable: + Queue: InfantrySQ, InfantryMQ + BuildPaletteOrder: 500 + Prerequisites: ~disabled + BuildAtProductionType: Soldier + Description: Elite stealth infantry. + +# Disable the ability to transfer resources from AI players on capturing (lua script handles cash reward) + +PROC: + InfiltrateForCash: + Maximum: 600 + StoresPlayerResourcesCA: + DisableTransferFromBotOwner: true + +PROC.TD: + InfiltrateForCash: + Maximum: 600 + StoresPlayerResourcesCA: + DisableTransferFromBotOwner: true + +PROC.SCRIN: + InfiltrateForCash: + Maximum: 600 + StoresPlayerResourcesCA: + DisableTransferFromBotOwner: true + +SILO: + StoresPlayerResourcesCA: + DisableTransferFromBotOwner: true + +SILO.TD: + StoresPlayerResourcesCA: + DisableTransferFromBotOwner: true + +SILO.SCRIN: + StoresPlayerResourcesCA: + DisableTransferFromBotOwner: true + +# Require ai.superweapons.enabled for superweapons to be enabled for AI players & don't show enemy timers for minor superweapons + +^AiSuperweaponsEnabled: + GrantConditionOnPrerequisite@OwnedByAi: + Condition: owned-by-ai + Prerequisites: botplayer + GrantConditionOnPrerequisite@AiSuperweaponsEnabled: + Condition: ai-superweapons-enabled + Prerequisites: ai.superweapons.enabled + +^AiMinorSuperweaponsEnabled: + GrantConditionOnPrerequisite@OwnedByAi: + Condition: owned-by-ai + Prerequisites: botplayer + GrantConditionOnPrerequisite@AiSuperweaponsEnabled: + Condition: ai-minor-superweapons-enabled + Prerequisites: ai.minor.superweapons.enabled + +WEAT: + Inherits@AiSuperweaponsEnabled: ^AiSuperweaponsEnabled + DetonateWeaponPower@LightningStorm: + RequiresCondition: ai-superweapons-enabled || !owned-by-ai + +PDOX: + Inherits@AiMinorSuperweaponsEnabled: ^AiMinorSuperweaponsEnabled + DetonateWeaponPower@ChronoAI: + RequiresCondition: ai-minor-superweapons-enabled || !owned-by-ai + +MSLO: + Inherits@AiSuperweaponsEnabled: ^AiSuperweaponsEnabled + NukePower@ABomb: + RequiresCondition: ai-superweapons-enabled || !owned-by-ai + +IRON: + Inherits@AiMinorSuperweaponsEnabled: ^AiMinorSuperweaponsEnabled + GrantExternalConditionPowerCA@IRONCURTAIN: + RequiresCondition: ai-minor-superweapons-enabled || !owned-by-ai + +EYE: + Inherits@AiSuperweaponsEnabled: ^AiSuperweaponsEnabled + DetonateWeaponPower@IonStorm: + RequiresCondition: ai-superweapons-enabled || !owned-by-ai + +PATR: + Inherits@AiMinorSuperweaponsEnabled: ^AiMinorSuperweaponsEnabled + AttackOrderPowerCA@EMPMISSILE: + RequiresCondition: ai-minor-superweapons-enabled || !owned-by-ai + +MSLO.Nod: + Inherits@AiSuperweaponsEnabled: ^AiSuperweaponsEnabled + NukePower@Chemmiss: + RequiresCondition: ai-superweapons-enabled || !owned-by-ai + +SGEN: + Inherits@AiMinorSuperweaponsEnabled: ^AiMinorSuperweaponsEnabled + GrantExternalConditionPowerCA@SGEN: + RequiresCondition: ai-minor-superweapons-enabled || !owned-by-ai + DisplayTimerRelationships: Ally + +RFGN: + Inherits@AiSuperweaponsEnabled: ^AiSuperweaponsEnabled + DetonateWeaponPower@RiftGenerator: + RequiresCondition: ai-superweapons-enabled || !owned-by-ai + +MANI: + Inherits@AiMinorSuperweaponsEnabled: ^AiMinorSuperweaponsEnabled + GrantExternalConditionPowerCA@SUPPRESSION: + RequiresCondition: ai-minor-superweapons-enabled || !owned-by-ai + +TMPL: + Inherits@AiMinorSuperweaponsEnabled: ^AiMinorSuperweaponsEnabled + NukePower@Cluster: + RequiresCondition: ai-minor-superweapons-enabled || !owned-by-ai + +# Disable GPS for AI + +^GpsPower: + GrantConditionOnPrerequisite@OwnedByAi: + Condition: owned-by-ai + Prerequisites: botplayer + DummyGpsPower@NOFOG: + RequiresCondition: !gps-launched && !fogenabled && !owned-by-ai + DummyGpsPower@FOG: + RequiresCondition: !gps-launched && fogenabled && !owned-by-ai + ProduceActorPowerCA@SatelliteLaunched: + Prerequisites: ~!botplayer + ProduceActorPowerCA@InitialSatelliteScan: + Prerequisites: anyradar, ~!gps.satellite.firstscan, ~fogenabled, ~!botplayer + ProduceActorPowerCA@SatelliteScan: + Prerequisites: anyradar, ~gps.satellite, ~gps.satellite.firstscan, ~fogenabled, ~!botplayer + ProduceActorPowerCA@SatelliteScanNoFog: + Prerequisites: anyradar, ~!fogenabled, ~!botplayer + +# Increase launch time for player GPS + +^GpsPower: + DummyGpsPower@FOG: + Delay: 17250 + DummyGpsPower@NOFOG: + Delay: 22500 + ProduceActorPowerCA@InitialSatelliteScan + ChargeInterval: 22500 + ProduceActorPowerCA@SatelliteScanNoFog: + ChargeInterval: 22500 + +# Disable Cloning Vat for AI + +CVAT: + CargoCloner@SQ: + RequiresCondition: !global-multiqueue && !owned-by-ai + CargoCloner@MQ: + RequiresCondition: global-multiqueue && !owned-by-ai + GrantConditionOnPrerequisite@OwnedByAi: + Condition: owned-by-ai + Prerequisites: botplayer + +# Manual targeting for Tesla Coil boost (otherwise they get stuck when AI attack moves) + +SHOK: + -AutoTargetPriority@TESLANORMAL: + -AutoTargetPriority@TESLAAMOVE: + AttackMove: + -AttackMoveCondition: + +# Kirov damage boost since no subfaction variants are available + +KIRO: + FirepowerMultiplier@CampaignDamage: + Modifier: 110 + +# Special units/buildings + +TRAN.evac: + Inherits: TRAN + -Buildable: + RenderSprites: + Image: tran + DamageMultiplier@INVULN: + Modifier: 0 + -KillsSelf@Emp: + Aircraft: + TurnToLand: True + InitialFacing: 0 + +PDGY: + Inherits: MAST + -Buildable: + RenderSprites: + Image: mast + GrantCondition@Elite: + Condition: rank-elite + +ETPD: + Inherits: TPOD + Inherits@ActorDifficultyConditions: ^ActorDifficultyConditions + Inherits@SHIELDS: ^ScrinShields + Inherits@A2GPROTECTION: ^AirToGroundProtection + Inherits@SHRAPNEL: ^ThrowsShrapnelBig + Inherits@COMMANDOSKULL: ^CommandoSkull + Turreted@SHIELDS: + Offset: 0,0,0 + GrantCondition@SHIELDS: + Condition: shields-upgrade + Tooltip: + Name: Exterminator Tripod + -Buildable: + TooltipExtras: + Description: Super heavy assault walker with beam weapons. + Strengths: Strong vs all ground units and structures. + Mobile: + Speed: 36 + PauseOnCondition: empdisable || notmobile + ImmovableCondition: alive + GrantCondition@ALIVE: + Condition: alive + Armament@PRIMARY: + Weapon: ExterminatorLaser + LocalOffset: 800,650,1000 + Armament@PRIMARY2: + Weapon: ExterminatorLaser + LocalOffset: 800,450,1500 + FireDelay: 2 + MuzzleSequence: muzzle + MuzzlePalette: scrin + Armament@SECONDARY: + Name: secondary + Weapon: ExterminatorLaserReversed + LocalOffset: 800,-650,1000 + Armament@SECONDARY2: + Name: secondary + Weapon: ExterminatorLaserReversed + LocalOffset: 800,-450,1500 + FireDelay: 22 + MuzzleSequence: muzzle + MuzzlePalette: scrin + AttackTurreted: + PauseOnCondition: empdisable || being-warped + Health: + HP: 900000 + Shielded: + MaxStrength: 650000 + RegenAmount: 1000 + Valued: + Cost: 10000 + RevealsShroud: + Range: 7c0 + TurretedFloating: + TurnSpeed: 8 + Selectable: + Bounds: 1800, 3200, 0, -600 + AutoTarget: + InitialStanceAI: AttackAnything + SpawnActorOnDeath: + Actor: ETPD.Husk + Targetable@CampaignBoss: + TargetTypes: CampaignBoss + Targetable@ExterminatorTripod: + TargetTypes: ExterminatorTripod + Targetable@SHIELDED: + TargetTypes: Shielded + RequiresCondition: shields-up + Targetable@MindControlResistant: + TargetTypes: MindControlResistant + Targetable@MindControlImmune: + TargetTypes: MindControlImmune + RequiresCondition: shields-up + Targetable@ChaosImmune: + TargetTypes: ChaosImmune + RequiresCondition: shields-up + Targetable@DriverKillImmune: + TargetTypes: DriverKillImmune + RevealsShroudMultiplier@Blinded: + Modifier: 80 + RangeMultiplier@Blinded: + Modifier: 80 + RequiresCondition: blinded + FirepowerMultiplier@Blinded: + Modifier: 90 + RequiresCondition: blinded + SpeedMultiplier@TEMPORAL: + Modifier: 75 + ReloadDelayMultiplier@TEMPORAL: + Modifier: 120 + RequiresCondition: being-warped + CaptureManager: + -BeingCapturedCondition: + -ExternalCondition@UNITSELL: + -Sellable: + ChangesHealth@THEAL: + Step: 2000 + PercentageStep: 0 + FireWarheadsOnDeath: + Weapon: 380mm + EmptyWeapon: 380mm + -HealthCapDamageMultiplier@CHRONO: + DummyConditionConsumer@CHRONO: + Condition: chronoshifted + +ETPD.Husk: + Inherits: TPOD.Husk + Tooltip: + Name: Husk (Exterminator Tripod) + RenderSprites: + Image: etpd.destroyed + +VENG: + Inherits: ^Vehicle + Inherits@ActorDifficultyConditions: ^ActorDifficultyConditions + Inherits@ScrinUnitPalette: ^ScrinUnitPalette + Inherits@GAINSEXPERIENCE: ^GainsExperience + Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove + Inherits@BERSERK: ^Berserk + Inherits@HOVERTRAIL: ^HoverTrail + Inherits@SCRINVEHICLEVOICE: ^ScrinVehicleVoice + Inherits@HeavyArmor: ^HeavyArmor + Inherits@A2GPROTECTION: ^AirToGroundProtection + Inherits@COMMANDOSKULL: ^CommandoSkull + TooltipExtras: + Description: Colossal Malefic Scrin war machine. + Strengths: • Unknown + Weaknesses: • Unknown + Valued: + Cost: 15000 + Tooltip: + Name: Void Engine + Selectable: + Bounds: 2800, 3000, 0, -600 + UpdatesPlayerStatistics: + AddToArmyValue: true + Health: + HP: 2250000 + HitShape: + Type: Circle + Radius: 768 + Mobile: + TurnSpeed: 4 + Speed: 10 + Locomotor: sheavytracked + PauseOnCondition: empdisable || notmobile + -Crushable: + WithShadow: + Offset: 43, 128, 0 + ZOffset: -129 + RequiresCondition: !invisibility + Hovers: + BobDistance: -25 + Ticks: 12 + RequiresCondition: !empdisable && !being-warped && !driver-dead + RevealsShroud: + Range: 10c0 + Armament: + Weapon: VoidEngineBeam + LocalOffset: 1100,0,700 + MuzzleSequence: muzzle + MuzzlePalette: scrin + WithMuzzleOverlay: + ProducibleWithLevel: + Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded + AttackFrontal: + PauseOnCondition: empdisable + TargetFrozenActors: True + ForceFireIgnoresActors: True + FacingTolerance: 8 + GrantConditionOnTerrain@ONWATER: + TerrainTypes: Water + Condition: onwater + KillsSelf@SINK: + RequiresCondition: onwater && (empdisable || driver-dead) + Targetable@ONWATER: + TargetTypes: Water, Ship + RequiresCondition: onwater + SpawnActorOnDeath: + Actor: VENG.Husk + RequiresCondition: !being-warped + SpawnActorOnDeath@Rift: + Actor: voidenginedeathrift + RequiresCondition: !being-warped + AutoTarget: + InitialStanceAI: AttackAnything + Targetable@MindControlImmune: + TargetTypes: MindControlImmune + Targetable@ChaosImmune: + TargetTypes: ChaosImmune + Targetable@DriverKillImmune: + TargetTypes: DriverKillImmune + Targetable@CampaignBoss: + TargetTypes: CampaignBoss + Targetable@VoidEngine: + TargetTypes: VoidEngine + ExternalCondition@chilled: + TotalCap: 2 + ChangesHealth: + Step: 2000 + Delay: 25 + StartIfBelow: 100 + DamageCooldown: 250 + ReloadDelayMultiplier@concussion: + Modifier: 120 + SpeedMultiplier@TEMPORAL: + Modifier: 75 + ReloadDelayMultiplier@TEMPORAL: + Modifier: 120 + RequiresCondition: being-warped + RevealsShroudMultiplier@Blinded: + Modifier: 80 + RangeMultiplier@Blinded: + Modifier: 80 + RequiresCondition: blinded + FirepowerMultiplier@Blinded: + Modifier: 90 + RequiresCondition: blinded + RangeMultiplier@GAPVEILED: + Modifier: 80 + FirepowerMultiplier@NORMAL: + Modifier: 75 + RequiresCondition: difficulty-normal + FirepowerMultiplier@EASY: + Modifier: 50 + RequiresCondition: difficulty-easy + DamageMultiplier@NORMAL: + Modifier: 125 + RequiresCondition: difficulty-normal + DamageMultiplier@EASY: + Modifier: 150 + RequiresCondition: difficulty-easy + DamageTypeDamageMultiplier@A2GPROTECTION: + Modifier: 75 + RequiresCondition: !difficulty-easy + -HealthCapDamageMultiplier@CHRONO: + DummyConditionConsumer@CHRONO: + Condition: chronoshifted + +VENG.Husk: + Inherits: ^Husk + Inherits@ScrinUnitPalette: ^ScrinUnitPalette + Tooltip: + Name: Husk (Void Engine) + RenderSprites: + Image: veng.destroyed + +VoidEngineRift: + Inherits: ^RiftBase + EditorOnlyTooltip: + Name: (Void Engine Rift) + RenderSprites: + Image: riftmd + PeriodicExplosion: + Weapon: VoidEngineRift + KillsSelf: + Delay: 264 + SpawnActorOnDeath: + Actor: voidengineriftfade + SkipMakeAnimations: false + # required for spawning actor on death + Health: + HP: 1 + WithSpriteBody: + StartSequence: make + +VoidEngineRiftFade: + Inherits: VoidEngineRift + WithSpriteBody: + Sequence: dead + WithMakeAnimation: + Sequence: die + KillsSelf: + Delay: 24 + -SpawnActorOnDeath: + -PeriodicExplosion: + +VoidEngineDeathRift: + Inherits: VoidEngineRift + KillsSelf: + Delay: 1512 + +SCRINPURIFIER: + Inherits: ^TechBuilding + Inherits@shape: ^2x2Shape + Selectable: + Bounds: 2048, 2048 + Building: + Footprint: xx xx + Dimensions: 2,2 + RevealsShroud: + Range: 10c0 + CaptureManager: + CapturableProgressBlink: + Capturable: + Types: building + CapturableProgressBar: + Tooltip: + Name: Scrin Tiberium Purifier + WithIdleOverlay@ACTIVE: + Sequence: purification + Offset: 800,50,-150 + Health: + HP: 150000 + -CaptureNotification: + +WORMHOLELG: + Inherits: ^WormholeBase + MapEditorData: + Categories: System + +WORMHOLEXL: + Inherits: ^WormholeBase + Tooltip: + Name: Gateway + MapEditorData: + Categories: System + +WORMHOLEXXL: + Inherits: ^WormholeBase + Tooltip: + Name: Gateway + MapEditorData: + Categories: System + +# Smudge makers + +^WeaponDetonaterDummy: + Inherits@DUMMY: ^InvisibleDummy + Immobile: + OccupiesSpace: false + BodyOrientation: + QuantizedFacings: 1 + WithSpriteBody: + Interactable: + Bounds: 64, 64 + KillsSelf: + Delay: 25 + RemoveInstead: true + WithSpriteBody: + RenderSpritesEditorOnly: + Image: waypoint + MapEditorData: + Categories: System + +CraterMaker1: + Inherits: ^WeaponDetonaterDummy + PeriodicExplosion: + Weapon: CraterMaker1 + EditorOnlyTooltip: + Name: Crater Maker x1 + +CraterMaker2: + Inherits: ^WeaponDetonaterDummy + PeriodicExplosion: + Weapon: CraterMaker2 + EditorOnlyTooltip: + Name: Crater Maker x2 + +ScorchMaker1: + Inherits: ^WeaponDetonaterDummy + PeriodicExplosion: + Weapon: ScorchMaker1 + EditorOnlyTooltip: + Name: Scorch Maker x1 + +ScorchMaker2: + Inherits: ^WeaponDetonaterDummy + PeriodicExplosion: + Weapon: ScorchMaker2 + EditorOnlyTooltip: + Name: Scorch Maker x2 + +# Enable Soviet/GDI aircraft from Helipad + +YAK: + Buildable: + Prerequisites: ~aircraft.soviet, ~techlevel.medium + +HALO: + Buildable: + Prerequisites: ~aircraft.soviet, ~techlevel.medium + +MIG: + Buildable: + Prerequisites: ~aircraft.soviet, ~techlevel.medium + +SUK: + Buildable: + Prerequisites: stek, ~aircraft.soviet, ~!seismic.upgrade, ~techlevel.high + +KIRO: + Buildable: + Prerequisites: stek, ~aircraft.kiro, ~techlevel.high + +ORCA: + Buildable: + Prerequisites: ~aircraft.gdi, ~techlevel.medium + +A10: + Buildable: + Prerequisites: ~aircraft.gdi, ~!sidewinders.upgrade, ~!avenger.upgrade, ~techlevel.medium + +ORCB: + Buildable: + Prerequisites: ~aircraft.gdi, gtek, ~techlevel.high + +# Enable subfaction specific units/upgrades for all campaign missions + +## Soviets + +E8: + Buildable: + Prerequisites: ~barr, anyradar, ~!deso.upgrade, ~techlevel.medium + +DESO: + Buildable: + Prerequisites: ~barr, anyradar, ~deso.upgrade, ~techlevel.medium + +TTNK: + Buildable: + Prerequisites: anyradar, ~vehicles.soviet, ~techlevel.medium + +V2RL: + Buildable: + Prerequisites: anyradar, ~vehicles.soviet, ~techlevel.medium + +ISU: + Buildable: + Prerequisites: anyradar, ~vehicles.soviet, ~techlevel.medium + +V3RL: + Buildable: + Prerequisites: stek, ~vehicles.soviet, ~techlevel.high + +deso.upgrade: + Buildable: + Prerequisites: ~player.soviet, stek, ~techlevel.high + +tarc.upgrade: + Buildable: + Prerequisites: ~player.soviet, stek, ~techlevel.high + +seismic.upgrade: + Buildable: + Prerequisites: ~player.soviet, stek, ~techlevel.high + +## GDI + +DISR: + Buildable: + Prerequisites: gtek, ~vehicles.gdi, ~techlevel.high + +sonic.upgrade: + Buildable: + Prerequisites: gtek, ~player.gdi, ~techlevel.high + +# For attack interval calculations, factoring in extra value from cargo + +SAPC.AI: + Valued: + Cost: 2100 + +SAPC.AI2: + Valued: + Cost: 2725 + +APC.AI: + Valued: + Cost: 1500 + +DELP.AI: + Valued: + Cost: 1700 + +VULC.AI: + Valued: + Cost: 1560 + +BTR.AI: + Valued: + Cost: 1475 + +BATF.AI: + Valued: + Cost: 2500 + +APC2.NODAI: + Valued: + Cost: 1400 + +APC2.GDIAI: + Valued: + Cost: 1360 + +INTL.AI2: + Valued: + Cost: 1875 diff --git a/mods/ca/rules/custom/campaign-tooltips.yaml b/mods/ca/rules/custom/campaign-tooltips.yaml new file mode 100644 index 0000000000..3607eb20ee --- /dev/null +++ b/mods/ca/rules/custom/campaign-tooltips.yaml @@ -0,0 +1,169 @@ +^Vehicle-NOUPG: + Tooltip: + GenericVisibility: Enemy + ShowOwnerRow: false + +^Infantry: + Tooltip: + GenericVisibility: Enemy + ShowOwnerRow: false + +^ArmedCivilian: + Tooltip: + GenericVisibility: None + Tooltip@COMBATANT: + GenericVisibility: Enemy + ShowOwnerRow: false + +GNRL: + Tooltip: + -RequiresCondition: + -GrantConditionOnCombatantOwner@COMBATANT: + -Tooltip@COMBATANT: + +^Ship: + Tooltip: + GenericVisibility: Enemy + ShowOwnerRow: false + +^NeutralPlane: + Tooltip: + GenericVisibility: Enemy + ShowOwnerRow: false + +^Helicopter: + Tooltip: + GenericVisibility: Enemy + ShowOwnerRow: false + +^Building: + Tooltip: + GenericVisibility: Enemy + ShowOwnerRow: false + +^CivBuilding: + Tooltip: + ShowOwnerRow: false + +^CivField: + Tooltip: + ShowOwnerRow: false + +^TechBuilding: + Tooltip: + ShowOwnerRow: false + +^Wall: + Tooltip: + ShowOwnerRow: false + +^Mine: + Tooltip: + ShowOwnerRow: false + +^Husk: + Tooltip: + GenericVisibility: Enemy, Ally, Neutral + GenericStancePrefix: false + ShowOwnerRow: false + +^PlaneHusk: + Tooltip: + GenericVisibility: Enemy, Ally, Neutral + GenericStancePrefix: false + ShowOwnerRow: false + +^HelicopterHusk: + Tooltip: + GenericVisibility: Enemy, Ally, Neutral + GenericStancePrefix: false + ShowOwnerRow: false + +^WormholeBase: + Tooltip: + GenericName: Wormhole + GenericVisibility: Enemy + ShowOwnerRow: false + +^Crate: + Tooltip: + ShowOwnerRow: false + +FLARE: + Tooltip: + ShowOwnerRow: false + +SPY: + DisguiseTooltip: + ShowOwnerRow: false + +BIO: + -TooltipExtras: + -TooltipDescription@ally: + -TooltipDescription@other: + +FCOM: + Tooltip: + GenericVisibility: Enemy + -TooltipExtras: + -TooltipDescription@ally: + -TooltipDescription@other: + +MISS: + Tooltip: + Name: Technology Center + -TooltipExtras: + -TooltipDescription@ally: + -TooltipDescription@other: + +IFV: + Tooltip@gunturr: + ShowOwnerRow: false + Tooltip@fragturr: + ShowOwnerRow: false + Tooltip@samturr: + ShowOwnerRow: false + Tooltip@engturr: + ShowOwnerRow: false + Tooltip@commturr: + ShowOwnerRow: false + Tooltip@chemturr: + ShowOwnerRow: false + Tooltip@medturr: + ShowOwnerRow: false + Tooltip@ivanturr: + ShowOwnerRow: false + Tooltip@flamturr: + ShowOwnerRow: false + Tooltip@spyturr: + ShowOwnerRow: false + Tooltip@sealturr: + ShowOwnerRow: false + Tooltip@acolturr: + ShowOwnerRow: false + Tooltip@snipturr: + ShowOwnerRow: false + Tooltip@desoturr: + ShowOwnerRow: false + Tooltip@testurr: + ShowOwnerRow: false + Tooltip@rmbcturr: + ShowOwnerRow: false + Tooltip@enliturr: + ShowOwnerRow: false + Tooltip@bhturr: + ShowOwnerRow: false + Tooltip@mortchemturr: + ShowOwnerRow: false + Tooltip@mortcryoturr: + ShowOwnerRow: false + Tooltip@mortsonicturr: + ShowOwnerRow: false + Tooltip@discturr: + ShowOwnerRow: false + Tooltip@sharturr: + ShowOwnerRow: false + Tooltip@ggiturr: + ShowOwnerRow: false + Tooltip@psyturr: + ShowOwnerRow: false diff --git a/mods/ca/rules/custom/commando-mission.yaml b/mods/ca/rules/custom/commando-mission.yaml new file mode 100644 index 0000000000..249fade673 --- /dev/null +++ b/mods/ca/rules/custom/commando-mission.yaml @@ -0,0 +1,47 @@ +# No regen & increased XP requirements + +E7: + ChangesHealth@ELITE: + StartIfBelow: 1 + ChangesHealth@CommandoRegen: + StartIfBelow: 1 + GainsExperienceMultiplier@TenPercentXp: + Modifier: 10 + +BORI: + ChangesHealth@ELITE: + StartIfBelow: 1 + ChangesHealth@CommandoRegen: + StartIfBelow: 1 + GainsExperienceMultiplier@TenPercentXp: + Modifier: 10 + +YURI: + ChangesHealth@ELITE: + StartIfBelow: 1 + ChangesHealth@CommandoRegen: + StartIfBelow: 1 + GainsExperienceMultiplier@TenPercentXp: + Modifier: 10 + +RMBO: + ChangesHealth@ELITE: + StartIfBelow: 1 + ChangesHealth@CommandoRegen: + StartIfBelow: 1 + GainsExperienceMultiplier@TenPercentXp: + Modifier: 10 + +MAST: + ChangesHealth@ELITE: + StartIfBelow: 1 + ChangesHealth@CommandoRegen: + StartIfBelow: 1 + GainsExperienceMultiplier@TenPercentXp: + Modifier: 10 + +SEAL: + ChangesHealth@ELITE: + StartIfBelow: 1 + GainsExperienceMultiplier@TenPercentXp: + Modifier: 10 diff --git a/mods/ca/rules/custom/composition-tester-powers.yaml b/mods/ca/rules/custom/composition-tester-powers.yaml new file mode 100644 index 0000000000..b8fb84542c --- /dev/null +++ b/mods/ca/rules/custom/composition-tester-powers.yaml @@ -0,0 +1,281 @@ +# Attach most powers to the player, remove announcements/prerequisites and set them to instantly charge +Player: + Inherits@FORCESHIELDPOWER: ^ForceShieldPower + Inherits@VEILOFWARPOWER: ^VeilOfWarPower + Inherits@CLUSTERMINESPOWER: ^ClusterMinesPower + Inherits@STRAFINGRUNPOWER: ^StrafingRunPower + Inherits@TIMEWARPPOWER: ^TimeWarpPower + Inherits@CRYOSTORMPOWER: ^CryostormPower + Inherits@HELIOSBOMBPOWER: ^HeliosBombPower + Inherits@CHRONOSHIFTPOWER: ^ChronoshiftPower + Inherits@PARABOMBSPOWER: ^ParabombsPower + Inherits@CARPETBOMBPOWER: ^CarpetBombPower + Inherits@ATOMBOMBPOWER: ^AtomBombPower + Inherits@MUTABOMBPOWER: ^MutaBombPower + Inherits@CHAOSBOMBSPOWER: ^ChaosBombsPower + Inherits@ATOMICAMMOPOWER: ^AtomicAmmoPower + Inherits@IRONCURTAINPOWER: ^IronCurtainPower + Inherits@INTERCEPTORSPOWER: ^InterceptorsPower + Inherits@NANITEREPAIRPOWER: ^NaniteRepairPower + Inherits@NANITESHIELDPOWER: ^NaniteShieldPower + Inherits@SHADOWTEAMPOWER: ^ShadowTeamPower + Inherits@@INFERNOBOMBPOWER: ^InfernoBombPower + Inherits@FRENZYPOWER: ^FrenzyPower + Inherits@ASSASSINSQUADPOWER: ^AssassinSquadPower + Inherits@HACKERCELLPOWER: ^HackerCellPower + Inherits@CONFESSORCABALPOWER: ^ConfessorCabalPower + Inherits@TIBSTEALTHPOWER: ^TibStealthPower + Inherits@STORMSPIKEPOWER: ^StormSpikePower + Inherits@BUZZERSWARMPOWER: ^BuzzerSwarmPower + Inherits@IONSURGEPOWER: ^IonSurgePower + Inherits@GREATERCOALESCENCEPOWER: ^GreaterCoalescencePower + Inherits@OVERLORDSWRATHPOWER: ^OverlordsWrathPower + Inherits@ANATHEMAPOWER: ^AnathemaPower + Inherits@ICHORSPIKEPOWER: ^IchorSpikePower + Inherits@COLONYSPIKEPOWER: ^ColonySpikePower + Inherits@VOIDSPIKEPOWER: ^VoidSpikePower + Inherits@SUPPRESSIONPOWER: ^SuppressionPower + GrantExternalConditionPowerCA@FSHIELD: + -Prerequisites: + -EndChargeSpeechNotification: + DisplayTimerRelationships: None + ChargeInterval: 1 + SpawnActorPowerCA@VeilOfWar: + -Prerequisites: + -EndChargeSpeechNotification: + ChargeInterval: 1 + AirstrikePowerCA@clustermines: + -Prerequisites: + -EndChargeSpeechNotification: + ChargeInterval: 1 + ClassicAirstrikePower@Strafe: + -Prerequisites: + -EndChargeSpeechNotification: + ChargeInterval: 1 + GrantExternalConditionPowerCA@TimeWarp: + -Prerequisites: + -BeginChargeSpeechNotification: + -EndChargeSpeechNotification: + ChargeInterval: 1 + SpawnActorPowerCA@Cryostorm: + -Prerequisites: + -EndChargeSpeechNotification: + ChargeInterval: 1 + AirstrikePowerCA@HeliosBomb: + -Prerequisites: + -EndChargeSpeechNotification: + ChargeInterval: 1 + ChronoshiftPowerCA@chronoshift: + -Prerequisites: + -BeginChargeSpeechNotification: + -EndChargeSpeechNotification: + DisplayTimerRelationships: None + ChargeInterval: 1 + -DetonateWeaponPower@ChronoAI: + AirstrikePowerCA@Russianparabombs: + -Prerequisites: + -EndChargeSpeechNotification: + ChargeInterval: 1 + AirstrikePowerCA@CarpetBomb: + -Prerequisites: + -EndChargeSpeechNotification: + ChargeInterval: 1 + AirstrikePowerCA@Iraqiparabombs: + -Prerequisites: + -EndChargeSpeechNotification: + ChargeInterval: 1 + AirstrikePowerCA@ChaosBombs: + -Prerequisites: + -EndChargeSpeechNotification: + ChargeInterval: 1 + AirstrikePowerCA@MutaBomb: + -Prerequisites: + -EndChargeSpeechNotification: + ChargeInterval: 1 + GrantExternalConditionPowerCA@ATOMICAMMO: + -Prerequisites: + -EndChargeSpeechNotification: + ChargeInterval: 1 + -GrantExternalConditionPowerCA@ATOMICAMMOIRAQ: + GrantExternalConditionPowerCA@HEROESOFUNION: + -Prerequisites: + -EndChargeSpeechNotification: + ChargeInterval: 1 + AirstrikePowerCA@KillZone: + -Prerequisites: + -EndChargeSpeechNotification: + ChargeInterval: 1 + GrantExternalConditionPowerCA@IRONCURTAIN: + -BeginChargeSpeechNotification: + -EndChargeSpeechNotification: + DisplayTimerRelationships: None + ChargeInterval: 1 + GrantExternalConditionPowerCA@NREPAIR: + -Prerequisites: + -EndChargeSpeechNotification: + ChargeInterval: 1 + SpawnActorPowerCA@NSHIELD: + -Prerequisites: + -BeginChargeSpeechNotification: + -EndChargeSpeechNotification: + ChargeInterval: 1 + InterceptorPower@AirDef: + -Prerequisites: + -EndChargeSpeechNotification: + ChargeInterval: 1 + ProduceActorPowerCA@AssassinSquad: + -Prerequisites: + -EndChargeSpeechNotification: + ChargeInterval: 1 + ProduceActorPowerCA@HackerCell: + -Prerequisites: + -EndChargeSpeechNotification: + ChargeInterval: 1 + ProduceActorPowerCA@ConfessorCabal: + -Prerequisites: + -EndChargeSpeechNotification: + ChargeInterval: 1 + AirReinforcementsPower@ShadowTeam: + -Prerequisites: + -EndChargeSpeechNotification: + ChargeInterval: 1 + AirstrikePowerCA@BlackhandFirebomb: + -Prerequisites: + -EndChargeSpeechNotification: + ChargeInterval: 1 + GrantExternalConditionPowerCA@Frenzy: + -Prerequisites: + -EndChargeSpeechNotification: + ChargeInterval: 1 + GrantExternalConditionPowerCA@SGEN: + -ActiveCondition: + -BeginChargeSpeechNotification: + -EndChargeSpeechNotification: + DisplayTimerRelationships: None + ChargeInterval: 1 + DetonateWeaponPower@STORMSPIKE: + -Prerequisites: + -EndChargeSpeechNotification: + ChargeInterval: 1 + DetonateWeaponPower@BUZZERSWARM: + -Prerequisites: + -EndChargeSpeechNotification: + ChargeInterval: 1 + -DetonateWeaponPower@BUZZERSWARMAI: + DetonateWeaponPower@IONSURGE: + -Prerequisites: + -EndChargeSpeechNotification: + ChargeInterval: 1 + DetonateWeaponPower@GREATERCOALESCENCE: + -Prerequisites: + -EndChargeSpeechNotification: + ChargeInterval: 1 + MeteorPower@OverlordsWrath: + -Prerequisites: + -EndChargeSpeechNotification: + DisplayTimerRelationships: None + ChargeInterval: 1 + GrantExternalConditionPowerCA@Anathema: + -Prerequisites: + -EndChargeSpeechNotification: + ChargeInterval: 1 + DetonateWeaponPower@IchorSpike: + -Prerequisites: + -EndChargeSpeechNotification: + DisplayTimerRelationships: None + ChargeInterval: 1 + DetonateWeaponPower@ColonySpike: + -Prerequisites: + -EndChargeSpeechNotification: + DisplayTimerRelationships: None + ChargeInterval: 1 + DetonateWeaponPower@VoidSpike: + -Prerequisites: + -EndChargeSpeechNotification: + DisplayTimerRelationships: None + ChargeInterval: 1 + GrantExternalConditionPowerCA@SUPPRESSION: + -Prerequisites: + -BeginChargeSpeechNotification: + -EndChargeSpeechNotification: + DisplayTimerRelationships: None + ChargeInterval: 1 + GrantExternalConditionPowerCA@SUPPRESSIONSIPHON: + -Prerequisites: + -BeginChargeSpeechNotification: + -EndChargeSpeechNotification: + DisplayTimerRelationships: None + ChargeInterval: 1 + ExternalCondition@1: + Condition: disabled + ExternalCondition@2: + Condition: empdisable + ExternalCondition@3: + Condition: being-warped + ExternalCondition@5: + Condition: tower-shield + +# Powers that depend on a structure in the world (can't be attached to the player) + +ALHQ: + MissileStrikePower@BlackSkyStrike: + -Prerequisites: + -EndChargeSpeechNotification: + ChargeInterval: 1 + +PATR: + AttackOrderPowerCA@EMPMISSILE: + -BeginChargeSpeechNotification: + -EndChargeSpeechNotification: + DisplayTimerRelationships: None + ChargeInterval: 1 + +TMPL: + NukePower@Cluster: + -Prerequisites: + -EndChargeSpeechNotification: + DisplayTimerRelationships: None + ChargeInterval: 1 + +SIGN: + RecallPower@Recall: + -EndChargeSpeechNotification: + DisplayTimerRelationships: None + ChargeInterval: 1 + +WEAT: + DetonateWeaponPower@LightningStorm: + -EndChargeSpeechNotification: + DisplayTimerRelationships: None + ChargeInterval: 1 + +MSLO: + NukePower@ABomb: + -BeginChargeSpeechNotification: + -EndChargeSpeechNotification: + DisplayTimerRelationships: None + ChargeInterval: 1 + +EYE: + DetonateWeaponPower@IonStorm: + -BeginChargeSpeechNotification: + -EndChargeSpeechNotification: + DisplayTimerRelationships: None + ChargeInterval: 1 + IonCannonPower@SurgicalStrike: + -Prerequisites: + -EndChargeSpeechNotification: + DisplayTimerRelationships: None + ChargeInterval: 1 + +MSLO.Nod: + NukePower@Chemmiss: + -EndChargeSpeechNotification: + DisplayTimerRelationships: None + ChargeInterval: 1 + +RFGN: + DetonateWeaponPower@RiftGenerator: + -EndChargeSpeechNotification: + DisplayTimerRelationships: None + ChargeInterval: 1 diff --git a/mods/ca/rules/custom/composition-tester.yaml b/mods/ca/rules/custom/composition-tester.yaml new file mode 100644 index 0000000000..3c2317e4cc --- /dev/null +++ b/mods/ca/rules/custom/composition-tester.yaml @@ -0,0 +1,1641 @@ + +World: + -SpawnStartingUnits: + MapBuildRadius: + AllyBuildRadiusCheckboxVisible: False + BuildRadiusCheckboxVisible: False + AllyBuildRadiusCheckboxEnabled: True + BuildRadiusCheckboxEnabled: False + MapOptions: + TechLevelDropdownLocked: False + TechLevelDropdownVisible: True + TechLevelDropdownLabel: Units Available + TechLevelDropdownDescription: What units/defenses players can build + TechLevel: buildanything + ShortGameCheckboxEnabled: True + ShortGameCheckboxLocked: True + ShortGameCheckboxVisible: False + CrateSpawner: + CheckboxEnabled: False + CheckboxLocked: True + CheckboxVisible: False + MapStartingLocations: + SeparateTeamSpawnsCheckboxVisible: False + TimeLimitManager: + TimeLimitDropdownVisible: False + +Player: + -ConquestVictoryConditions: + PlayerResources: + SelectableCash: 5000, 7500, 10000, 15000, 20000, 25000, 30000, 35000, 40000, 45000, 50000, 75000, 100000, 200000 + DefaultCash: 30000 + ClassicProductionQueueCA@Building: + BuildTimeSpeedReduction: 0 + SpeedUp: True + ClassicProductionQueue@Defense: + BuildTimeSpeedReduction: 0 + SpeedUp: True + ClassicProductionQueueCA@Vehicle: + BuildTimeSpeedReduction: 0 + ClassicProductionQueueCA@Infantry: + BuildTimeSpeedReduction: 0 + ClassicProductionQueue@Ship: + BuildTimeSpeedReduction: 0 + ClassicProductionQueueCA@Aircraft: + BuildTimeSpeedReduction: 0 + ClassicProductionQueue@Upgrade: + BuildTimeSpeedReduction: 0 + LobbyPrerequisiteCheckbox@GLOBALBOUNTY: + Enabled: False + Locked: True + Visible: False + LobbyPrerequisiteCheckbox@FORCESHIELD: + Enabled: False + Visible: False + DeveloperMode: + CheckboxLocked: True + CheckboxVisible: False + LobbyPrerequisiteCheckbox@GLOBALFACTUNDEPLOY: + Enabled: True + Visible: False + LobbyPrerequisiteCheckbox@NAVY: + Enabled: True + Visible: False + LobbyPrerequisiteCheckbox@BALANCEDHARVESTING: + Enabled: True + Visible: False + LobbyPrerequisiteCheckbox@FASTREGROWTH: + Enabled: False + Visible: False + LobbyPrerequisiteCheckbox@REVEALONFIRE: + Enabled: False + Locked: True + Visible: False + LobbyPrerequisiteDropdown@QUEUETYPE: + Default: global.singlequeue + Locked: True + Visible: False + Values: + global.singlequeue: options-queuetype.singlequeue + LobbyPrerequisiteCheckbox@FREEUPGRADES: + ID: freeupgrades + Label: Free Upgrades + Description: Upgrades are free + Enabled: True + DisplayOrder: 999 + Prerequisites: global.freeupgrades + ProvidesPrerequisite@PLAYERHUMAN: + Prerequisite: player.human + Factions: allies, england, france, germany, usa, soviet, russia, ukraine, iraq, yuri, gdi, talon, zocom, eagle, arc, nod, blackh, marked, legion, shadow + ProvidesPrerequisite@PLAYERRA: + Prerequisite: player.ra + Factions: allies, england, france, germany, usa, soviet, russia, ukraine, iraq, yuri + ProvidesPrerequisite@PLAYERTD: + Prerequisite: player.td + Factions: gdi, talon, zocom, eagle, arc, nod, blackh, marked, legion, shadow + ProvidesPrerequisite@PLAYERALLIESORGDI: + Prerequisite: player.alliesorgdi + Factions: allies, england, france, germany, usa, gdi, talon, zocom, eagle, arc + ProvidesPrerequisite@PLAYERALLIESORNOD: + Prerequisite: player.alliesornod + Factions: allies, england, france, germany, usa, nod, blackh, marked, legion, shadow + ProvidesPrerequisite@PLAYERALLIESORGDIORNOD: + Prerequisite: player.alliesorgdiornod + Factions: allies, england, france, germany, usa, gdi, talon, zocom, eagle, arc, nod, blackh, marked, legion, shadow + -ProvidesTechPrerequisite@infonly: + -ProvidesTechPrerequisite@low: + -ProvidesTechPrerequisite@medium: + -ProvidesTechPrerequisite@high: + -ProvidesTechPrerequisite@unrestricted: + ProvidesTechPrerequisite@factionspecific: + Name: Faction Specific + Prerequisites: techlevel.infonly, techlevel.low, techlevel.medium, techlevel.high, techlevel.unrestricted + Id: factionspecific + ProvidesTechPrerequisite@buildanything: + Name: Build Anything + Prerequisites: player.allies, player.soviet, player.gdi, player.nod, player.scrin, player.human, player.ra, player.td, player.alliesorgdi, player.alliesornod, player.alliesorgdiornod, techlevel.infonly, techlevel.low, techlevel.medium, techlevel.high, techlevel.unrestricted + Id: buildanything + +^GainsExperience: + GainsExperienceMultiplier@NoExperience: + Modifier: 0 + +^Upgrade: + Buildable: + BuildDurationModifier: 0 + +V2RL: + Buildable: + Prerequisites: ~player.soviet + +KATY: + Buildable: + Prerequisites: ~player.soviet + +GRAD: + Buildable: + Prerequisites: ~player.soviet + +NUKC: + Buildable: + Prerequisites: ~player.soviet + +1TNK: + Buildable: + Prerequisites: ~player.allies + +2TNK: + Buildable: + Prerequisites: ~player.allies + +GTNK.squad: + Buildable: + Prerequisites: ~player.allies + +BTR.YURI: + Buildable: + Prerequisites: ~player.soviet + +3TNK: + Buildable: + Prerequisites: ~player.soviet + +3TNK.ATOMIC: + Buildable: + Prerequisites: ~player.soviet + +3TNK.YURI: + Buildable: + Prerequisites: ~player.soviet + +3TNK.ATOMICYURI: + Buildable: + Prerequisites: ~player.soviet + +3TNK.RHINO: + Buildable: + Prerequisites: ~player.soviet + +3TNK.RHINO.ATOMIC: + Buildable: + Prerequisites: ~player.soviet + +3TNK.RHINO.YURI: + Buildable: + Prerequisites: ~player.soviet + +3TNK.RHINO.ATOMICYURI: + Buildable: + Prerequisites: ~player.soviet + +4TNK: + Buildable: + Prerequisites: ~player.soviet + +4TNK.ATOMIC: + Buildable: + Prerequisites: ~player.soviet + +4TNK.ERAD: + Buildable: + Prerequisites: ~player.soviet + +4TNK.ERAD.ATOMIC: + Buildable: + Prerequisites: ~player.soviet + +ARTY: + Buildable: + Prerequisites: ~player.allies + +ARTY.nod: + Buildable: + Prerequisites: ~player.nod + +HOWI: + Buildable: + Prerequisites: ~player.nod + +ISU: + Buildable: + Prerequisites: ~player.soviet + +SPEC: + Buildable: + Prerequisites: ~player.nod + +SAPC: + Buildable: + Prerequisites: ~player.nod + +CUST: + Buildable: + Prerequisites: ~player.nod + +AVTR: + Buildable: + Prerequisites: ~player.nod + +HARV: + Buildable: + Prerequisites: ~player.ra + +HARV.Chrono: + Buildable: + Prerequisites: ~player.allies + +MCV: + Buildable: + Prerequisites: ~player.ra + +JEEP: + Buildable: + Prerequisites: ~player.allies + +APC: + Buildable: + Prerequisites: ~player.allies + +DELP: + Buildable: + Prerequisites: ~player.allies + +MNLY: + Buildable: + Prerequisites: ~player.human + +MGG: + Buildable: + Prerequisites: ~player.allies + +MRJ: + Buildable: + Prerequisites: ~player.allies + +MSG: + Buildable: + Prerequisites: ~player.nod + +TTRA: + Buildable: + Prerequisites: ~player.soviet + +TTNK: + Buildable: + Prerequisites: ~player.soviet + +DTRK: + Buildable: + Prerequisites: ~player.soviet + +CTNK: + Buildable: + Prerequisites: ~player.allies + +QTNK: + Buildable: + Prerequisites: ~player.soviet + +AMCV: + Buildable: + Prerequisites: ~player.td + +HMMV: + Buildable: + Prerequisites: ~player.gdi + +HMMV.TOW: + Buildable: + Prerequisites: ~player.gdi + +GDRN: + Buildable: + Prerequisites: ~player.gdi + +GDRN.TOW: + Buildable: + Prerequisites: ~player.gdi + +BGGY: + Buildable: + Prerequisites: ~player.nod + +RBUG: + Buildable: + Prerequisites: ~player.nod + +APC2: + Buildable: + Prerequisites: ~player.gdi + +VULC: + Buildable: + Prerequisites: ~player.gdi + +LTNK: + Buildable: + Prerequisites: ~player.nod + +LTNK.Laser: + Buildable: + Prerequisites: ~player.nod + +MTNK: + Buildable: + Prerequisites: ~player.gdi + +MTNK.Laser: + Buildable: + Prerequisites: ~player.nod + +MTNK.Drone: + Buildable: + Prerequisites: ~player.gdi + +MDRN: + Buildable: + Prerequisites: ~player.gdi + +HTNK: + Buildable: + Prerequisites: ~player.gdi + +HTNK.Ion: + Buildable: + Prerequisites: ~player.gdi + +HTNK.Hover: + Buildable: + Prerequisites: ~player.gdi + +HTNK.Drone: + Buildable: + Prerequisites: ~player.gdi + +MSAM: + Buildable: + Prerequisites: ~player.gdi + +MLRS: + Buildable: + Prerequisites: ~player.nod + +STNK.Nod: + Buildable: + Prerequisites: ~player.nod + +HSTK: + Buildable: + Prerequisites: ~player.nod + +BIKE: + Buildable: + Prerequisites: ~player.nod + +FTNK: + Buildable: + Prerequisites: ~player.nod + +HFTK: + Buildable: + Prerequisites: ~player.nod + +HARV.TD: + Buildable: + Prerequisites: ~player.td + +BTR: + Buildable: + Prerequisites: ~player.soviet + +TRPC: + Buildable: + Prerequisites: ~player.soviet + +IFV: + Buildable: + Prerequisites: ~player.allies + +TITN: + Buildable: + Prerequisites: ~player.gdi + +TITN.RAIL: + Buildable: + Prerequisites: ~player.gdi + +JUGG: + Buildable: + Prerequisites: ~player.gdi + +TTRK: + Buildable: + Prerequisites: ~player.nod + +DISR: + Buildable: + Prerequisites: ~player.gdi + +HSAM: + Buildable: + Prerequisites: ~player.gdi + +RTNK: + Buildable: + Prerequisites: ~player.allies + +V3RL: + Buildable: + Prerequisites: ~player.soviet + +THWK: + Buildable: + Prerequisites: ~player.gdi + +TNKD: + Buildable: + Prerequisites: ~player.allies + +MSAR: + Buildable: + Prerequisites: ~player.gdi + +PTNK: + Buildable: + Prerequisites: ~player.allies + +PCAN: + Buildable: + Prerequisites: ~player.allies + +WTNK: + Buildable: + Prerequisites: ~player.nod + +BATF: + Buildable: + Prerequisites: ~player.allies + +MEMP: + Buildable: + Prerequisites: ~player.gdi + +CDRN: + Buildable: + Prerequisites: ~player.soviet + +CHPR: + Buildable: + Prerequisites: ~player.allies + +CRYO: + Buildable: + Prerequisites: ~player.allies + +ZEUS: + Buildable: + Prerequisites: ~player.allies + +WOLV: + Buildable: + Prerequisites: ~player.gdi + +XO: + Buildable: + Prerequisites: ~player.gdi + +APOC: + Buildable: + Prerequisites: ~player.soviet + +APOC.ATOMIC: + Buildable: + Prerequisites: ~player.soviet + +APOC.ERAD: + Buildable: + Prerequisites: ~player.soviet + +APOC.ERAD.ATOMIC: + Buildable: + Prerequisites: ~player.soviet + +OVLD: + Buildable: + Prerequisites: ~player.soviet + +OVLD.ATOMIC: + Buildable: + Prerequisites: ~player.soviet + +OVLD.ERAD: + Buildable: + Prerequisites: ~player.soviet + +OVLD.ERAD.ATOMIC: + Buildable: + Prerequisites: ~player.soviet + +TRUK: + Buildable: + Prerequisites: ~disabled + -SpawnActorOnDeath: + -Targetable: + Mobile: + Speed: 180 + TurnSpeed: 40 + +RECK: + Buildable: + Prerequisites: ~player.nod + +CYCP: + Buildable: + Prerequisites: ~player.nod + +PBUL: + Buildable: + Prerequisites: ~player.gdi + +BASI: + Buildable: + Prerequisites: ~player.nod + +MANT: + Buildable: + Prerequisites: ~player.nod + +VIPR: + Buildable: + Prerequisites: ~player.nod + +DOG: + Buildable: + Prerequisites: ~player.soviet + -BuildAtProductionType: + +TDOG: + Buildable: + Prerequisites: ~player.soviet + +E1: + Buildable: + Prerequisites: ~player.ra + +E2: + Buildable: + Prerequisites: ~player.soviet + +E3: + Buildable: + Prerequisites: ~player.ra + +U3.squad: + Buildable: + Prerequisites: ~player.allies + +E4: + Buildable: + Prerequisites: ~player.soviet + +E6: + Buildable: + Prerequisites: ~player.ra + +SPY: + Buildable: + Prerequisites: ~player.allies + +MEDI: + Buildable: + Prerequisites: ~player.alliesorgdi + +MECH: + Buildable: + Prerequisites: ~player.alliesornod + +CMEC: + Buildable: + Prerequisites: ~player.nod + +THF: + Buildable: + Prerequisites: ~player.soviet + +SHOK: + Buildable: + Prerequisites: ~player.soviet + +TTRP: + Buildable: + Prerequisites: ~player.soviet + +N1: + Buildable: + Prerequisites: ~player.td + +N2: + Buildable: + Prerequisites: ~player.gdi + +N3: + Buildable: + Prerequisites: ~player.td + +N4: + Buildable: + Prerequisites: ~player.nod + +N5: + Buildable: + Prerequisites: ~player.nod + +N6: + Buildable: + Prerequisites: ~player.td + +SNIP: + Buildable: + Prerequisites: ~player.allies + +CMSR: + Buildable: + Prerequisites: ~player.soviet + +MORT.Chem: + Buildable: + Prerequisites: ~player.nod + +MORT.Cryo: + Buildable: + Prerequisites: ~player.nod + +MORT.Sonic: + Buildable: + Prerequisites: ~player.nod + +CSCR: + Buildable: + Prerequisites: ~player.nod + +CDOG: + Buildable: + Prerequisites: ~player.nod + +SAB: + Buildable: + Prerequisites: ~player.nod + +ACOL: + Buildable: + Prerequisites: ~player.nod + +TPLR: + Buildable: + Prerequisites: ~player.nod + +JJET: + Buildable: + Prerequisites: ~player.gdi + +BJET: + Buildable: + Prerequisites: ~player.gdi + +E8: + Buildable: + Prerequisites: ~player.soviet + +DESO: + Buildable: + Prerequisites: ~player.soviet + +N1C: + Buildable: + Prerequisites: ~player.nod + +N3C: + Buildable: + Prerequisites: ~player.nod + +RMBC: + Buildable: + Prerequisites: ~player.nod + +IVAN: + Buildable: + Prerequisites: ~player.soviet + +BRUT: + Buildable: + Prerequisites: ~player.soviet + +BH: + Buildable: + Prerequisites: ~player.nod + +SEAL: + Buildable: + Prerequisites: ~player.allies + +ENLI: + Buildable: + Prerequisites: ~player.nod + +REAP: + Buildable: + Prerequisites: ~player.nod + +ZTRP: + Buildable: + Prerequisites: ~player.gdi + +ZRAI: + Buildable: + Prerequisites: ~player.gdi + +ZDEF: + Buildable: + Prerequisites: ~player.gdi + +ENFO: + Buildable: + Prerequisites: ~player.allies + +HOPL: + Buildable: + Prerequisites: ~player.allies + +TIGR: + Buildable: + Prerequisites: ~player.allies + +CRYT: + Buildable: + Prerequisites: ~player.allies + +MIG: + Buildable: + Prerequisites: ~player.soviet + +SUK: + Buildable: + Prerequisites: ~player.soviet + +SUK.UPG: + Buildable: + Prerequisites: ~player.soviet + +YAK: + Buildable: + Prerequisites: ~player.soviet + +TRAN: + Buildable: + Prerequisites: ~player.alliesorgdiornod + +HALO: + Buildable: + Prerequisites: ~player.soviet + +NHAW: + Buildable: + Prerequisites: ~player.allies + +HELI: + Buildable: + Prerequisites: ~player.allies + +HIND: + Buildable: + Prerequisites: ~player.soviet + +A10: + Buildable: + Prerequisites: ~player.gdi + +A10.SW: + Buildable: + Prerequisites: ~player.gdi + +A10.GAU: + Buildable: + Prerequisites: ~player.gdi + +APCH: + Buildable: + Prerequisites: ~player.nod + +ORCA: + Buildable: + Prerequisites: ~player.gdi + +ORCB: + Buildable: + Prerequisites: ~player.gdi + +JACK: + Buildable: + Prerequisites: ~player.gdi + +RAH: + Buildable: + Prerequisites: ~player.nod + +KIRO: + Buildable: + Prerequisites: ~player.soviet + +DISC: + Buildable: + Prerequisites: ~player.soviet + +OCAR: + Buildable: + Prerequisites: ~player.gdi + +HARR: + Buildable: + Prerequisites: ~player.allies + +PMAK: + Buildable: + Prerequisites: ~player.allies + +BEAG: + Buildable: + Prerequisites: ~player.allies + +SCRN: + Buildable: + Prerequisites: ~player.nod + +VENM: + Buildable: + Prerequisites: ~player.nod + +AURO: + Buildable: + Prerequisites: ~player.gdi + +PHAN: + Buildable: + Prerequisites: ~player.nod + +KAMV: + Buildable: + Prerequisites: ~player.nod + +SHDE: + Buildable: + Prerequisites: ~player.nod + +VERT: + Buildable: + Prerequisites: ~player.nod + +MCOR: + Buildable: + Prerequisites: ~player.nod + +S1: + Buildable: + Prerequisites: ~player.scrin + +S2: + Buildable: + Prerequisites: ~player.scrin + +S3: + Buildable: + Prerequisites: ~player.scrin + +S4: + Buildable: + Prerequisites: ~player.scrin + +MRDR: + Buildable: + Prerequisites: ~player.scrin + +S6: + Buildable: + Prerequisites: ~player.scrin + +EVIS: + Buildable: + Prerequisites: ~player.scrin + +IMPL: + Buildable: + Prerequisites: ~player.scrin + +STLK: + Buildable: + Prerequisites: ~player.scrin + +WCHR: + Buildable: + Prerequisites: ~player.scrin + +BRST: + Buildable: + Prerequisites: ~player.scrin + +E7: + Buildable: + Prerequisites: ~player.allies + BuildLimit: 0 + +BORI: + Buildable: + Prerequisites: ~player.soviet + BuildLimit: 0 + +RMBO: + Buildable: + Prerequisites: ~player.td + BuildLimit: 0 + +YURI: + Buildable: + Prerequisites: ~player.soviet + BuildLimit: 0 + +MAST: + Buildable: + Prerequisites: ~player.scrin + BuildLimit: 0 + +HARV.Scrin: + Buildable: + Prerequisites: ~player.scrin + +GUNW: + Buildable: + Prerequisites: ~player.scrin + +SHRW: + Buildable: + Prerequisites: ~player.scrin + +SEEK: + Buildable: + Prerequisites: ~player.scrin + +LACE: + Buildable: + Prerequisites: ~player.scrin + +INTL: + Buildable: + Prerequisites: ~player.scrin + +CORR: + Buildable: + Prerequisites: ~player.scrin + +LCHR: + Buildable: + Prerequisites: ~player.scrin + +STCR: + Buildable: + Prerequisites: ~player.scrin + +DEVO: + Buildable: + Prerequisites: ~player.scrin + +DARK: + Buildable: + Prerequisites: ~player.scrin + +RUIN: + Buildable: + Prerequisites: ~player.scrin + +ATMZ: + Buildable: + Prerequisites: ~player.scrin + +OBLT: + Buildable: + Prerequisites: ~player.scrin + +NULL: + Buildable: + Prerequisites: ~player.scrin + +TPOD: + Buildable: + Prerequisites: ~player.scrin + +RTPD: + Buildable: + Prerequisites: ~player.scrin + +SMCV: + Buildable: + Prerequisites: ~player.scrin + +STMR: + Buildable: + Prerequisites: ~player.scrin + +TORM: + Buildable: + Prerequisites: ~player.scrin + +ENRV: + Buildable: + Prerequisites: ~player.scrin + +DEVA: + Buildable: + Prerequisites: ~player.scrin + +PAC: + Buildable: + Prerequisites: ~player.scrin + +MSHP: + Buildable: + Prerequisites: ~player.scrin + +PBOX: + Buildable: + Prerequisites: ~player.allies + +HBOX: + Buildable: + Prerequisites: ~player.allies + +FTUR: + Buildable: + Prerequisites: ~player.soviet + +TTUR: + Buildable: + Prerequisites: ~player.soviet + +LTUR: + Buildable: + Prerequisites: ~player.nod + +GTWR: + Buildable: + Prerequisites: ~player.gdi + +GUN: + Buildable: + Prerequisites: ~player.allies + +GUN.Nod: + Buildable: + Prerequisites: ~player.nod + +PTUR: + Buildable: + Prerequisites: ~player.scrin + +PRIS: + Buildable: + Prerequisites: ~player.allies + +TSLA: + Buildable: + Prerequisites: ~player.soviet + +OBLI: + Buildable: + Prerequisites: ~player.nod + +ATWR: + Buildable: + Prerequisites: ~player.gdi + +STWR: + Buildable: + Prerequisites: ~player.gdi + +SCOL: + Buildable: + Prerequisites: ~player.scrin + +GUN: + Buildable: + Prerequisites: ~player.allies + +HTUR: + Buildable: + Prerequisites: ~player.allies + +SAM: + Buildable: + Prerequisites: ~player.soviet + +NSAM: + Buildable: + Prerequisites: ~player.nod + +AGUN: + Buildable: + Prerequisites: ~player.allies + +CRAM: + Buildable: + Prerequisites: ~player.gdi + +SHAR: + Buildable: + Prerequisites: ~player.scrin + +^Upgrade: + ProductionCostMultiplier@FREEUPGRADES: + Multiplier: 0 + Prerequisites: global.freeupgrades + +hazmat.upgrade: + Buildable: + Prerequisites: ~player.alliesorgdiornod + +flakarmor.upgrade: + Buildable: + Prerequisites: ~player.human + +bombard.strat: + Buildable: + Prerequisites: ~player.gdi, ~!seek.strat, ~!hold.strat + +bombard2.strat: + Buildable: + Prerequisites: ~player.gdi, ~bombard.strat + +bombard3.strat: + Buildable: + Prerequisites: ~player.gdi, ~bombard2.strat + +seek.strat: + Buildable: + Prerequisites: ~player.gdi, ~!bombard.strat, ~!hold.strat + +seek2.strat: + Buildable: + Prerequisites: ~player.gdi, ~seek.strat + +seek3.strat: + Buildable: + Prerequisites: ~player.gdi, ~seek2.strat + +hold.strat: + Buildable: + Prerequisites: ~player.gdi, ~!bombard.strat, ~!seek.strat + +hold2.strat: + Buildable: + Prerequisites: ~player.gdi, ~hold.strat + +hold3.strat: + Buildable: + Prerequisites: ~player.gdi, ~hold2.strat + +vulcan.upgrade: + Buildable: + Prerequisites: ~disabled + +avenger.upgrade: + Buildable: + Prerequisites: ~disabled + +sidewinders.upgrade: + Buildable: + Prerequisites: ~disabled + +ceramic.upgrade: + Buildable: + Prerequisites: ~player.gdi + +empgren.upgrade: + Buildable: + Prerequisites: ~player.gdi + +strategic.upgrade: + Buildable: + Prerequisites: ~disabled + +bjet.upgrade: + Buildable: + Prerequisites: ~disabled + +strata10.upgrade: + Buildable: + Prerequisites: ~disabled + +tow.upgrade: + Buildable: + Prerequisites: ~disabled + +pointdef.upgrade: + Buildable: + Prerequisites: ~player.gdi + +stratmiss.upgrade: + Buildable: + Prerequisites: ~disabled + +hypersonic.upgrade: + Buildable: + Prerequisites: ~player.gdi, ~!hailstorm.upgrade, ~!hammerhead.upgrade + +hailstorm.upgrade: + Buildable: + Prerequisites: ~player.gdi, ~!hypersonic.upgrade, ~!hammerhead.upgrade + +hammerhead.upgrade: + Buildable: + Prerequisites: ~player.gdi, ~!hypersonic.upgrade, ~!hailstorm.upgrade + +gyro.upgrade: + Buildable: + Prerequisites: ~player.gdi + +sonic.upgrade: + Buildable: + Prerequisites: ~player.gdi + +abur.upgrade: + Buildable: + Prerequisites: ~player.gdi + +bdrone.upgrade: + Buildable: + Prerequisites: ~disabled + +railgun.upgrade: + Buildable: + Prerequisites: ~disabled + +ionmam.upgrade: + Buildable: + Prerequisites: ~disabled + +hovermam.upgrade: + Buildable: + Prerequisites: ~disabled + +mdrone.upgrade: + Buildable: + Prerequisites: ~disabled + +upgc.drop: + Buildable: + Prerequisites: ~disabled + +#########################NOD######### +######################################## + +wrath.covenant: + Buildable: + Prerequisites: ~disabled + +unity.covenant: + Buildable: + Prerequisites: ~disabled + +zeal.covenant: + Buildable: + Prerequisites: ~disabled + +howi.upgrade: + Buildable: + Prerequisites: ~disabled + +tibcore.upgrade: + Buildable: + Prerequisites: ~player.nod + +decoy.upgrade: + Buildable: + Prerequisites: ~player.nod + +lastnk.upgrade: + Buildable: + Prerequisites: ~player.nod + +blacknapalm.upgrade: + Buildable: + Prerequisites: ~player.nod + +microwave.upgrade: + Buildable: + Prerequisites: ~player.nod + +quantum.upgrade: + Buildable: + Prerequisites: ~player.nod + +covenant.upgrade: + Buildable: + Prerequisites: ~disabled + +cust.upgrade: + Buildable: + Prerequisites: ~disabled + +rbug.upgrade: + Buildable: + Prerequisites: ~disabled + +cyborgarmor.upgrade: + Buildable: + Prerequisites: ~player.nod + +covenant.upgrade2: + Buildable: + Prerequisites: ~disabled + +cyborgdmg.upgrade: + Buildable: + Prerequisites: ~player.nod + +cyborgprod.upgrade: + Buildable: + Prerequisites: ~player.nod + +cyborgspeed.upgrade: + Buildable: + Prerequisites: ~player.nod + +#########################SOVIET######### +######################################## + +infantry.doctrine: + Buildable: + Prerequisites: ~disabled + +armor.doctrine: + Buildable: + Prerequisites: ~disabled + +arty.doctrine: + Buildable: + Prerequisites: ~disabled + +hazmatsoviet.upgrade: + Buildable: + Prerequisites: ~player.soviet + +gattling.upgrade: + Buildable: + Prerequisites: ~disabled + +lasher.upgrade: + Buildable: + Prerequisites: ~disabled + +seismic.upgrade: + Buildable: + Prerequisites: ~disabled + +doctrine.upgrade1: + Buildable: + Prerequisites: ~disabled + +imppara.upgrade: + Buildable: + Prerequisites: ~player.soviet + +impstorm.upgrade: + Buildable: + Prerequisites: ~player.soviet + +impmuta.upgrade: + Buildable: + Prerequisites: ~player.soviet + +reactive.upgrade: + Buildable: + Prerequisites: ~player.soviet + +rocketpods.upgrade: + Buildable: + Prerequisites: ~player.soviet + +ttrp.upgrade: + Buildable: + Prerequisites: ~disabled + +deso.upgrade: + Buildable: + Prerequisites: ~disabled + +tdog.upgrade: + Buildable: + Prerequisites: ~disabled + +atomicengines.upgrade: + Buildable: + Prerequisites: ~disabled + +erad.upgrade: + Buildable: + Prerequisites: ~disabled + +tarc.upgrade: + Buildable: + Prerequisites: ~player.soviet + +doctrine.upgrade2: + Buildable: + Prerequisites: ~disabled + +#######################ALLIES############################ +######################################################### + +economy.policy: + Buildable: + Prerequisites: ~disabled + +defense.policy: + Buildable: + Prerequisites: ~disabled + +development.policy: + Buildable: + Prerequisites: ~disabled + +greece.coalition: + Buildable: + Prerequisites: ~disabled + +korea.coalition: + Buildable: + Prerequisites: ~disabled + +sweden.coalition: + Buildable: + Prerequisites: ~disabled + +delp.upgrade: + Buildable: + Prerequisites: ~disabled + +apb.upgrade: + Buildable: + Prerequisites: ~player.allies + +cryw.upgrade: + Buildable: + Prerequisites: ~player.allies + +optics.upgrade: + Buildable: + Prerequisites: ~player.allies + +pcan.upgrade: + Buildable: + Prerequisites: ~disabled + +entrench.upgrade: + Buildable: + Prerequisites: ~player.allies + +airborne.upgrade: + Buildable: + Prerequisites: ~player.allies + +tflx.upgrade: + Buildable: + Prerequisites: ~player.allies + +charv.upgrade: + Buildable: + Prerequisites: ~disabled + +################################SCRIN############################## +################################################################### + +loyalist.allegiance: + Buildable: + Prerequisites: ~disabled + +rebel.allegiance: + Buildable: + Prerequisites: ~disabled + +malefic.allegiance: + Buildable: + Prerequisites: ~disabled + +allegiance.upgrade: + Buildable: + Prerequisites: ~disabled + +blink.upgrade: + Buildable: + Prerequisites: ~player.scrin + +shrw.upgrade: + Buildable: + Prerequisites: ~disabled + +advart.upgrade: + Buildable: + Prerequisites: ~player.scrin + +carapace.upgrade: + Buildable: + Prerequisites: ~disabled + +resconv.upgrade: + Buildable: + Prerequisites: ~player.scrin + +evis.upgrade: + Buildable: + Prerequisites: ~disabled + +impl.upgrade: + Buildable: + Prerequisites: ~disabled + +stlk.upgrade: + Buildable: + Prerequisites: ~disabled + +ioncon.upgrade: + Buildable: + Prerequisites: ~player.scrin + +regen.upgrade: + Buildable: + Prerequisites: ~player.scrin + +hyper.upgrade: + Buildable: + Prerequisites: ~player.scrin + +stellar.upgrade: + Buildable: + Prerequisites: ~player.scrin + +coalescence.upgrade: + Buildable: + Prerequisites: ~player.scrin + +shields.upgrade: + Buildable: + Prerequisites: ~player.scrin + +SS: + Buildable: + Prerequisites: ~player.soviet + +MSUB: + Buildable: + Prerequisites: ~player.soviet + +DD: + Buildable: + Prerequisites: ~player.allies + +CA: + Buildable: + Prerequisites: ~player.allies + +LST: + Buildable: + Prerequisites: ~player.human + +PT: + Buildable: + Prerequisites: ~player.allies + +PT2: + Buildable: + Prerequisites: ~player.gdi + +DD2: + Buildable: + Prerequisites: ~player.gdi + +SS2: + Buildable: + Prerequisites: ~player.nod + +ISUB: + Buildable: + Prerequisites: ~player.nod + +CV: + Buildable: + Prerequisites: ~player.gdi + +SB: + Buildable: + Prerequisites: ~player.nod + +SEAS: + Buildable: + Prerequisites: ~player.soviet diff --git a/mods/ca/rules/custom/coop-rules.yaml b/mods/ca/rules/custom/coop-rules.yaml new file mode 100644 index 0000000000..a9245545d7 --- /dev/null +++ b/mods/ca/rules/custom/coop-rules.yaml @@ -0,0 +1,1843 @@ +^SendCashPower: + SendCashPower@SendCash: + Description: Sends up to $1000 to the owner of the target allied unit or structure. + TaxPercentage: 0 + +World: + ProductionQueueFromSelectionCA: + AllySelection: true + AllyProxyFromSelection: + MapBuildRadius: + AllyBuildRadiusCheckboxEnabled: True + BuildRadiusCheckboxVisible: True + BuildRadiusCheckboxLocked: False + BuildRadiusCheckboxEnabled: False + + ScriptLobbyDropdown@basesharing: + ID: basesharing + Label: Base Sharing + Description: When base sharing is enabled you can produce from the production buildings of teammates\n if you don't have your own (the most recently built will be used).\n\n- No effect in baseless missions.\n- Upgrades are never shared.\n- Power is not shared.\n- When enabled, the first player will own any initial MCV or Construction Yard. + Values: + 0: Off + 1: On + Default: 1 + DisplayOrder: 999 + + ScriptLobbyDropdown@incomeshare: + ID: incomeshare + Label: Income Sharing + Description: Shares a percentage of all player refinery income with all other players.\n\nFor technical reasons this makes silos useless.\n\nChoosing options with bonus income may make the mission significantly easier. + Values: + 0: Off + 100: Equally Split + 125: Equal +25% Per Ally + 150: Equal +50% Per Ally + 175: Equal +75% Per Ally + 999: Full Amount to All + 10: 10% Shared + 15: 15% Shared + 20: 20% Shared + 25: 25% Shared + 30: 30% Shared + 35: 35% Shared + 40: 40% Shared + 45: 45% Shared + 50: 50% Shared + Default: 100 + DisplayOrder: 999 + + ScriptLobbyDropdown@enattackstr: + ID: enattackstr + Label: Enemy Attack Modifier + Description: Increases AI attack wave frequency and size (applied after any difficulty modifiers). + Values: + 0: +0% + 20: +20% + 40: +40% + 60: +60% + 80: +80% + 100: +100% + 120: +120% + 140: +140% + 160: +160% + 180: +180% + 200: +200% + 250: +250% + 300: +300% + Default: 0 + DisplayOrder: 999 + + ScriptLobbyDropdown@enemyranks: + ID: enemyranks + Label: Enemy Veterancy + Description: Give every enemy combat unit this level of base veterancy to boost their stats. + Values: + 0: 0 + 1: 1 + 2: 2 + 3: 3 + Default: 0 + DisplayOrder: 999 + + ScriptLobbyDropdown@oremines: + ID: oremines + Label: Resource Spawners + Description: Adjustements to resource spawners on the map.\n\n- No change: Resource spawners are unchanged\n- Additional: Adds a mine or blossom tree to every field that has none. Amount varies from map to map.\n- Upgrade: All ore mines become gem mines, all green blossom trees become blue blossom trees.\n- Add & Upgrade: Adds spawners and upgrades all of them\n- Delete All: Remove all spawners. Warning: All resources are finite now. This can make some missions\n extremely difficult or impossible without near-perfect execution. + Values: + oreoff: No Change + oreon: Additional + oreupgrade: Upgrade + oreonupgrade: Add & Upgrade + orefinite: Delete All (Hardcore) + Default: oreoff + DisplayOrder: 999 + + ScriptLobbyDropdown@enmp: + ID: enmp + Label: Duplicate Enemy Starting Units + Description: Multiplies starting ground combat units of the enemy.\n\nSome missions may become unbeatable if this value is raised. + Values: + 999: x Player Count + 0: 1x (Off) + 1: 2x + 2: 3x + 3: 4x + 4: 5x + 5: 6x (Shouldn't go higher) + 6: 7x + 7: 8x + 8: 9x + 9: 10x + 10: 11x + 11: 12x (Stop it!) + 19: 20x (CPU may melt) + 49: 50x (Abandon all hope!!!) + Default: 0 + DisplayOrder: 1000 + + ScriptLobbyDropdown@prmp: + ID: prmp + Label: Duplicate Enemy Produced Units + Description: Copies any ground combat units the enemy AI produces.\n\nThis raises the difficulty significantly and should be used with care. + Values: + 999: x Player Count + 0: 1x (Off) + 1: 2x + 2: 3x + 3: 4x + 4: 5x + 5: 6x (Shouldn't go higher) + 6: 7x + 7: 8x + 8: 9x + 9: 10x + 10: 11x + 11: 12x (Stop it!) + 19: 20x (CPU may melt) + 39: 50x (Abandon all hope!!!) + Default: 0 + DisplayOrder: 1000 + + ScriptLobbyDropdown@pfollow: + ID: pfollow + Label: Produced Duplicates Follow + Description: Odds that a duplicated produced unit will follow the unit they are copied from and go hunting when it dies.\n\nLeads to bigger attack waves.\n\nFollowers will also switch to hunt mode after a while to prevent clogging up production areas. + Values: + 0: 0 (Will never happen) + 1: 1 + 2: 2 + 3: 3 + 4: 4 + 5: 5 + Default: 5 + DisplayOrder: 1000 + + ScriptLobbyDropdown@phunt: + ID: phunt + Label: Produced Duplicates Hunt + Description: Odds that a duplicated produced unit will immediately attack the players. + Values: + 0: 0 (Will never happen) + 1: 1 + 2: 2 + 3: 3 + 4: 4 + 5: 5 + Default: 0 + DisplayOrder: 1000 + + ScriptLobbyDropdown@pwander: + ID: pwander + Label: Produced Duplicates Wander + Description: Odds that a duplicated produced unit will roam around the map randomly.\n\nResults in unpredictable attack directions and random enemies at unexpected locations. + Values: + 0: 0 (Will never happen) + 1: 1 + 2: 2 + 3: 3 + 4: 4 + 5: 5 + Default: 0 + DisplayOrder: 1000 + + ScriptLobbyDropdown@pidle: + ID: pidle + Label: Produced Duplicates Idle + Description: Odds that a duplicated produced unit will just stand around and will only move\n and attack when enemies get near them or they are attacked.\n\nThis results in bases full of enemies.\n\nThis value will default to 1 if all other values are 0. + Values: + 0: 0 (Will never happen) + 1: 1 + 2: 2 + 3: 3 + 4: 4 + 5: 5 + Default: 0 + DisplayOrder: 1000 + + ScriptLobbyDropdown@sfollow: + ID: sfollow + Label: Starter Duplicates Follow + Description: Odds that a duplicated starting unit will follow the unit they are copied from, and go hunting when it dies.\n\nResults in bigger garrisons and patrols. + Values: + 0: 0 (Will never happen) + 1: 1 + 2: 2 + 3: 3 + 4: 4 + 5: 5 + Default: 5 + DisplayOrder: 1000 + + ScriptLobbyDropdown@shunt: + ID: shunt + Label: Starter Duplicates Hunt + Description: Odds that a duplicated starting unit will immediately go and attack the players.\n\nCan lead to being rushed in the early game. + Values: + 0: 0 (Will never happen) + 1: 1 + 2: 2 + 3: 3 + 4: 4 + 5: 5 + Default: 0 + DisplayOrder: 1000 + + ScriptLobbyDropdown@swander: + ID: swander + Label: Starter Duplicates Wander + Description: Odds that a duplicated starting unit will roam around the map randomly.\n\nResults in unpredictable attack directions and random enemies at unexpected locations. + Values: + 0: 0 (Will never happen) + 1: 1 + 2: 2 + 3: 3 + 4: 4 + 5: 5 + Default: 0 + DisplayOrder: 1000 + + ScriptLobbyDropdown@sidle: + ID: sidle + Label: Starter Duplicates Idle + Description: Odds that a duplicated starting unit will just stand around and will only move\n and attack when enemies get near them or they are attacked.\n\nThis results in bases full of enemies.\n\nThis value will default to 1 if all other values are 0. + Values: + 0: 0 (Will never happen) + 1: 1 + 2: 2 + 3: 3 + 4: 4 + 5: 5 + Default: 0 + DisplayOrder: 1000 + + ScriptLobbyDropdown@multiplyaircraft: + ID: multiplyaircraft + Label: Also Duplicate Aircraft + Description: EXPERIMENTAL\n\nInclude aircraft in the unit duplication.\n\nThe AI may have problems resupplying them all. + Values: + domulti: On (Multiply) + dontmulti: Off (Don't multiply) + Default: dontmulti + DisplayOrder: 1000 + +Player: + LobbyPrerequisiteCheckbox@GLOBALFACTUNDEPLOY: + Enabled: True + LobbyPrerequisiteCheckbox@FASTREGROWTH: + Locked: False + Visible: True + ClassicProductionQueue@Defense: + -BlockedAudio: + -BlockedTextNotification: + ClassicProductionQueueCA@Vehicle: + -BlockedAudio: + -BlockedTextNotification: + ClassicProductionQueueCA@Infantry: + -BlockedAudio: + -BlockedTextNotification: + ClassicProductionQueue@Ship: + -BlockedAudio: + -BlockedTextNotification: + ClassicProductionQueueCA@Aircraft: + -BlockedAudio: + -BlockedTextNotification: + +# Don't allow players without a real refinery to build harvesters + +REALREFINERY: + AlwaysVisible: + Interactable: + Tooltip: + Name: Refinery + Buildable: + Description: Refinery + +PROC: + ProvidesPrerequisite@HasRealRefinery: + Prerequisite: realrefinery + +PROC.TD: + ProvidesPrerequisite@HasRealRefinery: + Prerequisite: realrefinery + +PROC.SCRIN: + ProvidesPrerequisite@HasRealRefinery: + Prerequisite: realrefinery + +HARV: + Buildable: + Prerequisites: realrefinery, ~vehicles.ra, ~!charv.upgrade + +HARV.Chrono: + Buildable: + Prerequisites: realrefinery, ~charv.upgrade, ~vehicles.allies + +HARV.TD: + Buildable: + Prerequisites: ~!sharv.upgrade, realrefinery, ~vehicles.td + +HARV.TD.UPG: + Buildable: + Prerequisites: ~sharv.upgrade, realrefinery, ~vehicles.td + +HARV.Scrin: + Buildable: + Prerequisites: realrefinery, ~vehicles.scrin + +# Make Oil Derrick use resource storage so it works with income sharing +OILB: + StoresPlayerResourcesCA: + Capacity: 5000 + CashTrickler: + UseResourceStorage: True + +HQ.UPG: + CashTrickler@Hacker0: + UseResourceStorage: True + CashTrickler@Hacker1: + UseResourceStorage: True + CashTrickler@Hacker2: + UseResourceStorage: True + CashTrickler@Hacker3: + UseResourceStorage: True + CashTrickler@Hacker4: + UseResourceStorage: True + CashTrickler@Hacker5: + UseResourceStorage: True + +^BasicBuilding: + CreateProxyActorForAllies: + ProxyNamePrefix: coop + UseLocation: True + LinkedToParent: True + RequireValidFaction: True + RequiresPlayableOwner: True + RequiresCondition: base-sharing-enabled + GrantConditionOnLobbyOption@BaseSharing: + Name: basesharing + Values: 1 + Condition: base-sharing-enabled + +^ProducesInfantry: + ProvidesPrerequisite@HasRealProductionBuilding: + Prerequisite: has.infantry.production.building + +^ProducesVehicles: + ProvidesPrerequisite@HasRealProductionBuilding: + Prerequisite: has.vehicle.production.building + +^ProducesNaval: + ProvidesPrerequisite@HasRealProductionBuilding: + Prerequisite: has.naval.production.building + +^ProducesAircraft: + ProvidesPrerequisite@HasRealProductionBuilding: + Prerequisite: has.aircraft.production.building + +^ProducesHelicopters: + ProvidesPrerequisite@HasRealProductionBuilding: + Prerequisite: has.helicopter.production.building + +^COOPProducer: + Inherits@QueueUpdater: ^QueueUpdater + DummyConditionGranter@MQ: + Condition: global-multiqueue + DummyConditionGranter@MQFull: + Condition: global-multiqueuefull + DummyConditionConsumer@MQ: + Condition: global-multiqueue + DummyConditionConsumer@MQFull: + Condition: global-multiqueuefull + +^COOPProducesUnits: + Inherits@COOPProducer: ^COOPProducer + AlwaysVisible: + Selectable: + Priority: 1 + ScriptTriggers: + ImmobileMultiCell: + OccupiesSpace: false + LocalCenterOffset: 0,-512,0 + UpdatesUnitsProduced: + RallyPoint: + +^COOPProducesBuildings: + Inherits@COOPProducer: ^COOPProducer + Production@SQBLD: + Produces: BuildingSQ, DefenseSQ + RequiresCondition: !global-multiqueuefull + +^COOPProducesVehicles: + Inherits: ^COOPProducesUnits + Inherits@NOMCV: ^UnlocksMcvIfNoneOwned + Production: + Produces: VehicleSQ, ParadropVehicle + RequiresCondition: !global-multiqueue && !has-real-building + GrantExternalConditionToProduced: + Condition: produced + GrantConditionOnPrerequisite@HasRealProductionBuilding: + Condition: has-real-building + Prerequisites: has.vehicle.production.building + +^COOPProducesNaval: + Inherits: ^COOPProducesUnits + Production: + Produces: ShipSQ, Boat, Submarine + RequiresCondition: !global-multiqueue + ImmobileMultiCell: + -LocalCenterOffset: + +^COOPProducesAircraft: + Inherits: ^COOPProducesUnits + ProvidesPrerequisite@any: + Prerequisite: aircraft.any + Production: + Produces: AircraftSQ, Plane, Helicopter + RequiresCondition: !global-multiqueue && !has-real-building + GrantExternalConditionToProduced: + Condition: produced + GrantConditionOnPrerequisite@HasRealProductionBuilding: + Condition: has-real-building + Prerequisites: has.aircraft.production.building + +^COOPProducesHelicopters: + Inherits@AIR: ^COOPProducesAircraft + Production: + Produces: AircraftSQ, Helicopter + RequiresCondition: !global-multiqueue && !has-real-building + GrantConditionOnPrerequisite@HasRealProductionBuilding: + Condition: has-real-building + Prerequisites: has.helicopter.production.building + +^COOPProducesInfantry: + Inherits: ^COOPProducesUnits + Production: + Produces: InfantrySQ, Cyborg, Soldier, ParadropInfantry + RequiresCondition: !global-multiqueue && !has-real-building + GrantExternalConditionToProduced: + Condition: produced + GrantConditionOnPrerequisite@HasRealProductionBuilding: + Condition: has-real-building + Prerequisites: has.infantry.production.building + +^COOPProducesDogs: + Inherits: ^COOPProducesInfantry + Production: + Produces: InfantrySQ, Dog + +^COOPProducesCyborgs: + Inherits: ^COOPProducesInfantry + Production: + Produces: InfantrySQ, Cyborg, ParadropInfantry, Upgrade + +^COOPProducesUpgrades: + Inherits@COOPProducer: ^COOPProducer + Production: + Produces: Upgrade + ProvidesPrerequisite@UpgradesProducer: + Prerequisite: upgrades.producer + +COOPMSLO: + Inherits: ^InvisibleDummy + ProvidesPrerequisite@buildingname: + Prerequisite: mslo + +COOPSPEN: + Inherits@NAV: ^COOPProducesNaval + ProvidesPrerequisite@buildingname: + Prerequisite: spen + ImmobileMultiCell: + Dimensions: 3,3 + Exit@1: + SpawnOffset: 0,-213,0 + Facing: 384 + ExitCell: -1,2 + Exit@2: + SpawnOffset: 0,-213,0 + Facing: 640 + ExitCell: 3,2 + Exit@3: + SpawnOffset: 0,0,0 + Facing: 128 + ExitCell: 0,0 + Exit@4: + SpawnOffset: 0,0,0 + Facing: 896 + ExitCell: 2,0 + Exit@b1: + SpawnOffset: -1024,1024,0 + Facing: 640 + ExitCell: 0,2 + Exit@b2: + SpawnOffset: 1024,1024,0 + Facing: 896 + ExitCell: 2,2 + Exit@b3: + SpawnOffset: -1024,-1024,0 + Facing: 384 + ExitCell: 0,0 + Exit@b4: + SpawnOffset: 1024,-1024,0 + Facing: 128 + ExitCell: 2,0 + +COOPSYRD: + Inherits@NAV: ^COOPProducesNaval + ProvidesPrerequisite@buildingname: + Prerequisite: syrd + ImmobileMultiCell: + Dimensions: 3,3 + Exit@1: + SpawnOffset: -1024,1024,0 + Facing: 640 + ExitCell: 0,2 + Exit@2: + SpawnOffset: 1024,1024,0 + Facing: 896 + ExitCell: 2,2 + Exit@3: + SpawnOffset: -1024,-1024,0 + Facing: 384 + ExitCell: 0,0 + Exit@4: + SpawnOffset: 1024,-1024,0 + Facing: 128 + ExitCell: 2,0 + +COOPPDOX: + Inherits: ^InvisibleDummy + ProvidesPrerequisite@buildingname: + Prerequisite: pdox + +COOPTSLA: + Inherits: ^InvisibleDummy + ProvidesPrerequisite@buildingname: + Prerequisite: tsla + +COOPDOME: + Inherits: ^InvisibleDummy + Inherits@UPG: ^COOPProducesUpgrades + ProvidesRadar: + ValidFactions: + Factions: allies, england, france, germany, usa, soviet, russia, ukraine, iraq, yuri + ProvidesPrerequisite@buildingname: + Prerequisite: dome + ProvidesPrerequisite@anyradar: + Prerequisite: anyradar + ProvidesPrerequisite@radarorrepair: + Prerequisite: radarorrepair + ProvidesPrerequisite@RadarOrAircraft: + Prerequisite: radaroraircraft + ProvidesPrerequisite@FlameTowerOrRadar: + Prerequisite: fturorradar + ProvidesPrerequisiteValidatedFaction@allrad: + Factions: allies, england, france, germany, usa + Prerequisite: radar.allies + ProvidesPrerequisiteValidatedFaction@engrad: + Factions: england + Prerequisite: radar.england + ProvidesPrerequisiteValidatedFaction@frarad: + Factions: france + Prerequisite: radar.france + ProvidesPrerequisiteValidatedFaction@sovrad: + Factions: soviet, russia, ukraine, iraq, yuri + Prerequisite: radar.soviet + ProvidesPrerequisiteValidatedFaction@rusrad: + Factions: russia + Prerequisite: radar.russia + ProvidesPrerequisiteValidatedFaction@ukrrad: + Factions: ukraine + Prerequisite: radar.ukraine + ProvidesPrerequisiteValidatedFaction@irarad: + Factions: iraq + Prerequisite: radar.iraq + ProvidesPrerequisiteValidatedFaction@yurirad: + Factions: yuri + Prerequisite: radar.yuri + ProvidesPrerequisite@radar-active: + Prerequisite: radar-active + +COOPFTUR: + Inherits: ^InvisibleDummy + ProvidesPrerequisite@buildingname: + Prerequisite: ftur + +COOPATEK: + Inherits: ^InvisibleDummy + Inherits@UPG: ^COOPProducesUpgrades + ValidFactions: + Factions: allies, england, germany, france, usa + ProvidesPrerequisite@buildingname: + Prerequisite: atek + ProvidesPrerequisite@anytechcenter: + Prerequisite: techcenter.any + ProvidesPrerequisiteValidatedFaction@germanyatek: + Factions: germany + Prerequisite: atek.germany + ProvidesPrerequisiteValidatedFaction@franceatek: + Factions: france + Prerequisite: atek.france + ProvidesPrerequisiteValidatedFaction@usaatek: + Factions: usa + Prerequisite: atek.usa + +COOPALHQ: + Inherits: ^InvisibleDummy + Inherits@UPG: ^COOPProducesUpgrades + ProvidesPrerequisite@buildingname: + Prerequisite: alhq + +COOPWEAP: + Inherits@VEH: ^COOPProducesVehicles + ProvidesPrerequisite@buildingname: + Prerequisite: weap + ValidFactions: + Factions: allies, england, france, germany, usa, soviet, russia, ukraine, iraq, yuri + ProvidesPrerequisite@any: + Prerequisite: vehicles.any + ProvidesPrerequisite@human: + Prerequisite: vehicles.human + ProvidesPrerequisiteValidatedFaction@allies: + Factions: allies, england, france, germany, usa + Prerequisite: vehicles.allies + ProvidesPrerequisite@ra: + Prerequisite: vehicles.ra + ProvidesPrerequisiteValidatedFaction@england: + Factions: england + Prerequisite: vehicles.england + ProvidesPrerequisiteValidatedFaction@france: + Factions: france + Prerequisite: vehicles.france + ProvidesPrerequisiteValidatedFaction@germany: + Factions: germany + Prerequisite: vehicles.germany + ProvidesPrerequisiteValidatedFaction@usa: + Factions: usa + Prerequisite: vehicles.usa + ProvidesPrerequisiteValidatedFaction@soviet: + Factions: soviet, russia, ukraine, iraq, yuri + Prerequisite: vehicles.soviet + ProvidesPrerequisiteValidatedFaction@russia: + Factions: russia + Prerequisite: vehicles.russia + ProvidesPrerequisiteValidatedFaction@ukraine: + Factions: ukraine + Prerequisite: vehicles.ukraine + ProvidesPrerequisiteValidatedFaction@iraq: + Factions: iraq + Prerequisite: vehicles.iraq + ProvidesPrerequisiteValidatedFaction@yuri: + Factions: yuri + Prerequisite: vehicles.yuri + ProvidesPrerequisiteValidatedFaction@1tnk: + Factions: allies, france, germany, usa + Prerequisite: vehicles.1tnk + ProvidesPrerequisiteValidatedFaction@qtnk: + Factions: soviet, russia, ukraine, iraq + Prerequisite: vehicles.qtnk + ProvidesPrerequisiteValidatedFaction@v2: + Factions: soviet, russia, iraq, yuri + Prerequisite: vehicles.v2 + ImmobileMultiCell: + Dimensions: 3,3 + Exit@1: + SpawnOffset: 213,-128,0 + ExitCell: 1,2 + TriggersProductionDoorOverlay: + +COOPFACT: + Inherits: ^InvisibleDummy + Inherits@BLD: ^COOPProducesBuildings + ProvidesPrerequisite@buildingname: + Prerequisite: fact + ValidFactions: + Factions: allies, england, france, germany, usa, soviet, russia, ukraine, iraq, yuri + ProvidesPrerequisite@ra: + Prerequisite: structures.ra + ProvidesPrerequisiteValidatedFaction@allies: + Factions: allies, england, france, germany, usa + Prerequisite: structures.allies + ProvidesPrerequisiteValidatedFaction@england: + Factions: england + Prerequisite: structures.england + ProvidesPrerequisiteValidatedFaction@france: + Factions: france + Prerequisite: structures.france + ProvidesPrerequisiteValidatedFaction@germany: + Factions: germany + Prerequisite: structures.germany + ProvidesPrerequisiteValidatedFaction@usa: + Factions: usa + Prerequisite: structures.usa + ProvidesPrerequisiteValidatedFaction@soviet: + Factions: soviet, russia, ukraine, iraq, yuri + Prerequisite: structures.soviet + ProvidesPrerequisiteValidatedFaction@russia: + Factions: russia + Prerequisite: structures.russia + ProvidesPrerequisiteValidatedFaction@ukraine: + Factions: ukraine + Prerequisite: structures.ukraine + ProvidesPrerequisiteValidatedFaction@iraq: + Factions: iraq + Prerequisite: structures.iraq + ProvidesPrerequisiteValidatedFaction@yuri: + Factions: yuri + Prerequisite: structures.yuri + ProvidesPrerequisite@wall: + Prerequisite: structures.wall + ProvidesPrerequisiteValidatedFaction@sandbag: + Factions: allies, england, france, germany, usa + Prerequisite: structures.sandbag + ProvidesPrerequisiteValidatedFaction@apwr: + Factions: allies, england, france, germany, usa, soviet, ukraine, iraq, yuri + Prerequisite: structures.apwr + ProvidesPrerequisiteValidatedFaction@pbox: + Factions: allies, france, germany, usa + Prerequisite: structures.pbox + ProvidesPrerequisiteValidatedFaction@pris: + Factions: allies, england, germany, usa + Prerequisite: structures.pris + ProvidesPrerequisiteValidatedFaction@ftur: + Factions: soviet, russia, ukraine, yuri + Prerequisite: structures.ftur + ProvidesPrerequisite@anyconyard: + Prerequisite: anyconyard + +COOPPROC: + Inherits: ^InvisibleDummy + ProvidesPrerequisite@buildingname: + Prerequisite: proc + ProvidesPrerequisite@anyrefinery: + Prerequisite: anyrefinery + +COOPHPAD: + Inherits@AIR: ^COOPProducesHelicopters + ProvidesPrerequisite@buildingname: + Prerequisite: hpad + ValidFactions: + Factions: allies, england, france, germany, usa, russia, ukraine, iraq, yuri + ProvidesPrerequisiteValidatedFaction@allies: + Factions: allies, england, france, germany, usa + Prerequisite: aircraft.allies + ProvidesPrerequisiteValidatedFaction@usa: + Factions: usa + Prerequisite: aircraft.usa + ProvidesPrerequisiteValidatedFaction@soviets: + Factions: soviet, russia, ukraine, iraq, yuri + Prerequisite: aircraft.soviet + ProvidesPrerequisiteValidatedFaction@russia: + Factions: russia + Prerequisite: aircraft.russia + ProvidesPrerequisiteValidatedFaction@ukraine: + Factions: ukraine + Prerequisite: aircraft.ukraine + ProvidesPrerequisiteValidatedFaction@iraq: + Factions: iraq + Prerequisite: aircraft.iraq + ProvidesPrerequisiteValidatedFaction@yuri: + Factions: yuri + Prerequisite: aircraft.yuri + ProvidesPrerequisiteValidatedFaction@kiro: + Factions: soviet, russia, ukraine, iraq + Prerequisite: aircraft.kiro + ProvidesPrerequisiteValidatedFaction@chinookvisible: + Factions: allies, england, france, germany, gdi, zocom, eagle, talon, arc, nod, blackh, legion, marked, shadow + Prerequisite: aircraft.chinookvisible + ProvidesPrerequisiteValidatedFaction@chinook: + Factions: allies, england, france, germany, gdi, zocom, eagle, talon, arc, nod, blackh, legion, marked, shadow + Prerequisite: aircraft.chinook + ProvidesPrerequisiteValidatedFaction@nhaw: + Factions: usa + Prerequisite: aircraft.nhaw + ProvidesPrerequisite@RadarOrAircraft: + Prerequisite: radaroraircraft + ImmobileMultiCell: + Dimensions: 2,3 + Exit@1: + SpawnOffset: 0,-256,0 + ExitCell: 0,0 + Facing: 896 + +COOPAFLD: + Inherits@AIR: ^COOPProducesAircraft + ProvidesPrerequisite@buildingname: + Prerequisite: afld + ValidFactions: + Factions: soviet, russia, ukraine, iraq, yuri + ProvidesPrerequisite@soviet: + Prerequisite: aircraft.soviet + ProvidesPrerequisiteValidatedFaction@russia: + Factions: russia + Prerequisite: aircraft.russia + ProvidesPrerequisiteValidatedFaction@ukraine: + Factions: ukraine + Prerequisite: aircraft.ukraine + ProvidesPrerequisiteValidatedFaction@iraq: + Factions: iraq + Prerequisite: aircraft.iraq + ProvidesPrerequisiteValidatedFaction@yuri: + Factions: yuri + Prerequisite: aircraft.yuri + ProvidesPrerequisiteValidatedFaction@kiro: + Factions: soviet, russia, ukraine, iraq + Prerequisite: aircraft.kiro + ProvidesPrerequisite@RadarOrAircraft: + Prerequisite: radaroraircraft + ImmobileMultiCell: + Dimensions: 3,2 + Exit@1: + ExitCell: 1,1 + Facing: 768 + +COOPPOWR: + Inherits: ^InvisibleDummy + ProvidesPrerequisite@anypower: + Prerequisite: anypower + ProvidesPrerequisite@buildingname: + Prerequisite: powr + +COOPAPWR: + Inherits: ^InvisibleDummy + ProvidesPrerequisite@anypower: + Prerequisite: anypower + ProvidesPrerequisite@buildingname: + Prerequisite: apwr + +COOPNPWR: + Inherits: ^InvisibleDummy + Inherits@UPG: ^COOPProducesUpgrades + ProvidesPrerequisite@anypower: + Prerequisite: anypower + ProvidesPrerequisite@buildingname: + Prerequisite: npwr + +COOPTPWR: + Inherits: ^InvisibleDummy + ProvidesPrerequisite@anypower: + Prerequisite: anypower + ProvidesPrerequisite@buildingname: + Prerequisite: tpwr + +COOPSTEK: + Inherits: ^InvisibleDummy + Inherits@UPG: ^COOPProducesUpgrades + ProvidesPrerequisite@buildingname: + Prerequisite: stek + ProvidesPrerequisite@anytechcenter: + Prerequisite: techcenter.any + ProvidesPrerequisite@TeslaCoilOrSovietTechCenter: + Prerequisite: tslaorstek + ProvidesPrerequisite@ChemTowerOrSovietTechCenter: + Prerequisite: tturorstek + ValidFactions: + Factions: soviet, russia, ukraine, iraq, yuri + ProvidesPrerequisiteValidatedFaction@russia: + Factions: russia + Prerequisite: stek.russia + ProvidesPrerequisiteValidatedFaction@ukraine: + Factions: ukraine + Prerequisite: stek.ukraine + ProvidesPrerequisiteValidatedFaction@iraq: + Factions: iraq + Prerequisite: stek.iraq + +COOPBARR: + Inherits@INF: ^COOPProducesInfantry + ProvidesPrerequisite@buildingname: + Prerequisite: barr + ValidFactions: + Factions: soviet, russia, ukraine, iraq, yuri + ProvidesPrerequisite@infantryany: + Prerequisite: infantry.any + ProvidesPrerequisite@human: + Prerequisite: infantry.human + ProvidesPrerequisite@infantryra: + Prerequisite: infantry.ra + ProvidesPrerequisiteValidatedFaction@russia: + Factions: russia + Prerequisite: infantry.russia + ProvidesPrerequisiteValidatedFaction@ukraine: + Factions: ukraine + Prerequisite: infantry.ukraine + ProvidesPrerequisiteValidatedFaction@iraq: + Factions: iraq + Prerequisite: infantry.iraq + ProvidesPrerequisiteValidatedFaction@yuri: + Factions: yuri + Prerequisite: infantry.yuri + ProvidesPrerequisiteValidatedFaction@e2: + Factions: soviet, russia, iraq, yuri + Prerequisite: infantry.e2 + ProvidesPrerequisite@dog: + Prerequisite: infantry.dog + ProvidesPrerequisiteValidatedFaction@boris: + Factions: soviet, russia, iraq, ukraine + Prerequisite: infantry.boris + ProvidesPrerequisiteValidatedFaction@shok: + Factions: soviet, russia, ukraine, yuri + Prerequisite: infantry.shok + ImmobileMultiCell: + Dimensions: 2,3 + Exit@1: + SpawnOffset: -170,810,0 + ExitCell: 1,2 + Exit@2: + SpawnOffset: -725,640,0 + ExitCell: 0,2 + Exit@3: + SpawnOffset: -170,810,0 + ExitCell: -1,2 + Priority: 0 + Exit@4: + SpawnOffset: -725,640,0 + ExitCell: 2,2 + Priority: 0 + +COOPKENN: + Inherits@INF: ^COOPProducesDogs + ProvidesPrerequisite@buildingname: + Prerequisite: kenn + ProvidesPrerequisite@dog: + Prerequisite: infantry.dog + Exit@1: + SpawnOffset: -280,400,0 + ExitCell: 0,1 + Exit@2: + SpawnOffset: -280,400,0 + ExitCell: -1,0 + +COOPTENT: + Inherits@INF: ^COOPProducesInfantry + ProvidesPrerequisite@buildingname: + Prerequisite: tent + ValidFactions: + Factions: allies, england, germany, france, usa + ProvidesPrerequisite@infantryany: + Prerequisite: infantry.any + ProvidesPrerequisite@human: + Prerequisite: infantry.human + ProvidesPrerequisite@infantryra: + Prerequisite: infantry.ra + ProvidesPrerequisiteValidatedFaction@england: + Factions: england + Prerequisite: infantry.england + ProvidesPrerequisiteValidatedFaction@france: + Factions: france + Prerequisite: infantry.france + ProvidesPrerequisiteValidatedFaction@germany: + Factions: germany + Prerequisite: infantry.germany + ProvidesPrerequisiteValidatedFaction@usa: + Factions: usa + Prerequisite: infantry.usa + ProvidesPrerequisite@mech: + Prerequisite: infantry.mech + ProvidesPrerequisite@medi: + Prerequisite: infantry.medi + ImmobileMultiCell: + Dimensions: 2,3 + Exit@1: + SpawnOffset: -42,810,0 + ExitCell: 1,2 + Exit@2: + SpawnOffset: -725,640,0 + ExitCell: 0,2 + Exit@3: + SpawnOffset: -42,810,0 + ExitCell: -1,2 + Priority: 0 + Exit@4: + SpawnOffset: -725,640,0 + ExitCell: 2,2 + Priority: 0 + +COOPFIX: + Inherits: ^InvisibleDummy + ProvidesPrerequisite@buildingname: + Prerequisite: fix + ProvidesPrerequisite@repair: + Prerequisite: repair + ProvidesPrerequisite@radarorrepair: + Prerequisite: radarorrepair + ProvidesPrerequisite@allowsmcv: + Prerequisite: vehicles.mcv + +COOPPYLE: + Inherits@INF: ^COOPProducesInfantry + ProvidesPrerequisite@buildingname: + Prerequisite: pyle + ValidFactions: + Factions: gdi, talon, zocom, eagle, arc + ProvidesPrerequisite@infantryany: + Prerequisite: infantry.any + ProvidesPrerequisite@human: + Prerequisite: infantry.human + ProvidesPrerequisite@infantrytd: + Prerequisite: infantry.td + ProvidesPrerequisiteValidatedFaction@talon: + Factions: talon + Prerequisite: infantry.talon + ProvidesPrerequisiteValidatedFaction@zocom: + Factions: zocom + Prerequisite: infantry.zocom + ProvidesPrerequisiteValidatedFaction@eagle: + Factions: eagle + Prerequisite: infantry.eagle + ProvidesPrerequisiteValidatedFaction@arc: + Factions: arc + Prerequisite: infantry.arc + ProvidesPrerequisite@medi: + Prerequisite: infantry.medi + ImmobileMultiCell: + Dimensions: 2,3 + Exit@1: + SpawnOffset: -170,810,0 + ExitCell: 1,2 + Exit@2: + SpawnOffset: -725,640,0 + ExitCell: 0,2 + Exit@3: + SpawnOffset: -170,810,0 + ExitCell: -1,2 + Priority: 0 + Exit@4: + SpawnOffset: -725,640,0 + ExitCell: 2,2 + Priority: 0 + +COOPHAND: + Inherits@INF: ^COOPProducesInfantry + ProvidesPrerequisite@buildingname: + Prerequisite: hand + ValidFactions: + Factions: nod, blackh, marked, legion, shadow + ProvidesPrerequisite@infantryany: + Prerequisite: infantry.any + ProvidesPrerequisite@human: + Prerequisite: infantry.human + ProvidesPrerequisite@infantrytd: + Prerequisite: infantry.td + ProvidesPrerequisite@nod: + Prerequisite: infantry.nod + ProvidesPrerequisiteValidatedFaction@blackh: + Factions: blackh + Prerequisite: infantry.blackh + ProvidesPrerequisiteValidatedFaction@marked: + Factions: marked + Prerequisite: infantry.marked + ProvidesPrerequisiteValidatedFaction@legion: + Factions: legion + Prerequisite: infantry.legion + ProvidesPrerequisiteValidatedFaction@shadow: + Factions: shadow + Prerequisite: infantry.shadow + ProvidesPrerequisite@mech: + Prerequisite: infantry.mech + ImmobileMultiCell: + Dimensions: 2,3 + Exit@1: + SpawnOffset: 512,1024,0 + ExitCell: 1,2 + Exit@2: + SpawnOffset: -1024,768,0 + ExitCell: -2,2 + Facing: 384 + Exit@3: + SpawnOffset: 512,1024,0 + ExitCell: 0,2 + Priority: 0 + Exit@4: + SpawnOffset: 512,1024,0 + ExitCell: 2,2 + Priority: 0 + +COOPWEAP.TD: + Inherits@VEH: ^COOPProducesVehicles + ProvidesPrerequisite@buildingname: + Prerequisite: weap.td + ValidFactions: + Factions: gdi, talon, zocom, eagle, arc, nod, legion + ProvidesPrerequisite@any: + Prerequisite: vehicles.any + ProvidesPrerequisite@human: + Prerequisite: vehicles.human + ProvidesPrerequisite@td: + Prerequisite: vehicles.td + ProvidesPrerequisiteValidatedFaction@gdi: + Factions: gdi, talon, zocom, eagle, arc + Prerequisite: vehicles.gdi + ProvidesPrerequisiteValidatedFaction@talon: + Factions: talon + Prerequisite: vehicles.talon + ProvidesPrerequisiteValidatedFaction@zocom: + Factions: zocom + Prerequisite: vehicles.zocom + ProvidesPrerequisiteValidatedFaction@eagle: + Factions: eagle + Prerequisite: vehicles.eagle + ProvidesPrerequisiteValidatedFaction@arc: + Factions: arc + Prerequisite: vehicles.arc + ProvidesPrerequisiteValidatedFaction@nod: + Factions: nod, legion + Prerequisite: vehicles.nod + ProvidesPrerequisiteValidatedFaction@legion: + Factions: legion + Prerequisite: vehicles.legion + ProvidesPrerequisiteValidatedFaction@hmmv: + Factions: gdi, talon, zocom, eagle + Prerequisite: vehicles.hmmv + ProvidesPrerequisiteValidatedFaction@ftnk: + Factions: legion + Prerequisite: vehicles.ftnk + ProvidesPrerequisite@apc2: + Prerequisite: vehicles.apc2 + ProvidesPrerequisiteValidatedFaction@mtnk: + Factions: gdi, talon, zocom, eagle, arc, legion + Prerequisite: vehicles.mtnk + ProvidesPrerequisiteValidatedFaction@msam: + Factions: gdi, talon, zocom, arc + Prerequisite: vehicles.msam + ProvidesPrerequisiteValidatedFaction@htnk: + Factions: gdi, zocom, eagle, arc + Prerequisite: vehicles.htnk + ProvidesPrerequisiteValidatedFaction@mlrs: + Factions: legion + Prerequisite: vehicles.mlrs + ImmobileMultiCell: + Dimensions: 3,3 + Exit@1: + SpawnOffset: -341,-341,0 + ExitCell: 0,2 + TriggersProductionDoorOverlay: + +AIRS: + + +SYRD: + Building: + Footprint: +++ +x+ +++ + +SYRD.gdi: + Building: + Footprint: +++ +x+ +++ + +COOPAIRS: + Inherits@VEH: ^COOPProducesVehicles + ProvidesPrerequisite@buildingname: + Prerequisite: airs + ValidFactions: + Factions: nod, blackh, marked, shadow + ProvidesPrerequisite@any: + Prerequisite: vehicles.any + ProvidesPrerequisite@human: + Prerequisite: vehicles.human + ProvidesPrerequisite@td: + Prerequisite: vehicles.td + ProvidesPrerequisite@nod: + Prerequisite: vehicles.nod + ProvidesPrerequisite@ltnk: + Prerequisite: vehicles.ltnk + ProvidesPrerequisiteValidatedFaction@blackh: + Factions: blackh + Prerequisite: vehicles.blackh + ProvidesPrerequisiteValidatedFaction@marked: + Factions: marked + Prerequisite: vehicles.marked + ProvidesPrerequisiteValidatedFaction@shadow: + Factions: shadow + Prerequisite: vehicles.shadow + ProvidesPrerequisiteValidatedFaction@ftnk: + Factions: nod, marked, shadow + Prerequisite: vehicles.ftnk + ProvidesPrerequisiteValidatedFaction@mlrs: + Factions: nod, blackh, marked + Prerequisite: vehicles.mlrs + ImmobileMultiCell: + Dimensions: 4,3 + Exit@1: + SpawnOffset: -1024,0,0 + ExitCell: 3,1 + -Production: + ProductionAirdropCA@SQVEH: + Produces: VehicleSQ, ParadropVehicle + ActorType: c17.cargo + ReadyAudio: ReinforcementsArrived + SpawnType: ClosestEdgeToDestination + ProportionalSpeed: true + RequiresCondition: !global-multiqueue && !has-real-building + ProductionAirdropCA@MQVEH: + Produces: VehicleMQ, ParadropVehicle + ActorType: c17.cargo + ReadyAudio: ReinforcementsArrived + SpawnType: ClosestEdgeToDestination + ProportionalSpeed: true + RequiresCondition: !global-multiqueue && !has-real-building + +COOPNUKE: + Inherits: ^InvisibleDummy + ProvidesPrerequisite@anypower: + Prerequisite: anypower + ProvidesPrerequisite@buildingname: + Prerequisite: nuke + +COOPNUK2: + Inherits: ^InvisibleDummy + ProvidesPrerequisite@anypower: + Prerequisite: anypower + ProvidesPrerequisite@buildingname: + Prerequisite: nuk2 + +COOPAFAC: + Inherits: ^InvisibleDummy + Inherits@BLD: ^COOPProducesBuildings + ProvidesPrerequisite@buildingname: + Prerequisite: afac + ValidFactions: + Factions: gdi, talon, zocom, eagle, arc, nod, blackh, marked, legion, shadow + ProvidesPrerequisite@td: + Prerequisite: structures.td + ProvidesPrerequisiteValidatedFaction@gdi: + Factions: gdi, talon, zocom, eagle, arc + Prerequisite: structures.gdi + ProvidesPrerequisiteValidatedFaction@talon: + Factions: talon + Prerequisite: structures.talon + ProvidesPrerequisiteValidatedFaction@zocom: + Factions: zocom + Prerequisite: structures.zocom + ProvidesPrerequisiteValidatedFaction@eagle: + Factions: eagle + Prerequisite: structures.eagle + ProvidesPrerequisiteValidatedFaction@arc: + Factions: arc + Prerequisite: structures.arc + ProvidesPrerequisiteValidatedFaction@nod: + Factions: nod, blackh, marked, legion, shadow + Prerequisite: structures.nod + ProvidesPrerequisiteValidatedFaction@blackh: + Factions: blackh + Prerequisite: structures.blackh + ProvidesPrerequisiteValidatedFaction@marked: + Factions: marked + Prerequisite: structures.marked + ProvidesPrerequisiteValidatedFaction@legion: + Factions: legion + Prerequisite: structures.legion + ProvidesPrerequisiteValidatedFaction@shadow: + Factions: shadow + Prerequisite: structures.shadow + ProvidesPrerequisiteValidatedFaction@weap.tdFAC: + Factions: gdi, talon, zocom, eagle, arc, legion + Prerequisite: structures.weap.td + ProvidesPrerequisiteValidatedFaction@airs: + Factions: nod, blackh, marked, shadow + Prerequisite: structures.airs + ProvidesPrerequisite@wall: + Prerequisite: structures.wall + ProvidesPrerequisiteValidatedFaction@sandbag: + Factions: gdi, talon, zocom, eagle, arc + Prerequisite: structures.sandbag + ProvidesPrerequisiteValidatedFaction@atwr: + Factions: gdi, talon, eagle, arc + Prerequisite: structures.atwr + ProvidesPrerequisite@anyconyard: + Prerequisite: anyconyard + +COOPOBLI: + Inherits: ^InvisibleDummy + ProvidesPrerequisite@buildingname: + Prerequisite: obli + ProvidesPrerequisite@ObeliskOrTemple: + Prerequisite: obliortmpl + +COOPHQ: + Inherits: ^InvisibleDummy + Inherits@UPG: ^COOPProducesUpgrades + ProvidesRadar: + ProvidesPrerequisite@buildingname: + Prerequisite: hq + ValidFactions: + Factions: gdi, talon, zocom, eagle, arc, nod, blackh, marked, legion, shadow + ProvidesPrerequisite@anyradar: + Prerequisite: anyradar + ProvidesPrerequisite@radarorrepair: + Prerequisite: radarorrepair + ProvidesPrerequisite@RadarOrAircraft: + Prerequisite: radaroraircraft + ProvidesPrerequisite@FlameTowerOrRadar: + Prerequisite: fturorradar + ProvidesPrerequisiteValidatedFaction@gdirad: + Factions: gdi, talon, zocom, eagle, arc + Prerequisite: radar.gdi + ProvidesPrerequisiteValidatedFaction@talrad: + Factions: talon + Prerequisite: radar.talon + ProvidesPrerequisiteValidatedFaction@zocrad: + Factions: zocom + Prerequisite: radar.zocom + ProvidesPrerequisiteValidatedFaction@eagrad: + Factions: eagle + Prerequisite: radar.eagle + ProvidesPrerequisiteValidatedFaction@arcrad: + Factions: arc + Prerequisite: radar.arc + ProvidesPrerequisiteValidatedFaction@nodrad: + Factions: nod, blackh, marked, legion, shadow + Prerequisite: radar.nod + ProvidesPrerequisiteValidatedFaction@bhrad: + Factions: blackh + Prerequisite: radar.blackh + ProvidesPrerequisiteValidatedFaction@legrad: + Factions: legion + Prerequisite: radar.legion + ProvidesPrerequisiteValidatedFaction@shadrad: + Factions: shadow + Prerequisite: radar.shadow + +COOPHQ.UPG: + Inherits: COOPHQ + +COOPEYE: + Inherits: ^InvisibleDummy + ProvidesRadar: + ProvidesPrerequisite@buildingname: + Prerequisite: eye + ValidFactions: + Factions: gdi, talon, zocom, eagle, arc + ProvidesPrerequisiteValidatedFaction@zoceye: + Factions: zocom + Prerequisite: eye.zocom + +COOPREP: + Inherits: ^InvisibleDummy + ProvidesPrerequisite@buildingname: + Prerequisite: rep + ProvidesPrerequisite@repair: + Prerequisite: repair + ProvidesPrerequisite@radarorrepair: + Prerequisite: radarorrepair + ProvidesPrerequisite@allowsmcv: + Prerequisite: vehicles.mcv + +COOPHPAD.TD: + Inherits@AIR: ^COOPProducesHelicopters + ProvidesPrerequisite@buildingname: + Prerequisite: hpad.td + ValidFactions: + Factions: gdi, talon, zocom, eagle, arc, nod, blackh, marked, legion, shadow + ProvidesPrerequisiteValidatedFaction@gdi: + Factions: gdi, talon, zocom, eagle, arc + Prerequisite: aircraft.gdi + ProvidesPrerequisiteValidatedFaction@talon: + Factions: talon + Prerequisite: aircraft.talon + ProvidesPrerequisiteValidatedFaction@eagle: + Factions: eagle + Prerequisite: aircraft.eagle + ProvidesPrerequisiteValidatedFaction@arc: + Factions: arc + Prerequisite: aircraft.arc + ProvidesPrerequisiteValidatedFaction@nod: + Factions: nod, blackh, marked, legion, shadow + Prerequisite: aircraft.nod + ProvidesPrerequisiteValidatedFaction@marked: + Factions: marked + Prerequisite: aircraft.marked + ProvidesPrerequisiteValidatedFaction@shadow: + Factions: shadow + Prerequisite: aircraft.shadow + ProvidesPrerequisiteValidatedFaction@apch: + Factions: nod, blackh, legion, shadow + Prerequisite: aircraft.apch + ProvidesPrerequisite@chinookvisible: + Prerequisite: aircraft.chinookvisible + ProvidesPrerequisite@chinook: + Prerequisite: aircraft.chinook + ProvidesPrerequisite@RadarOrAircraft: + Prerequisite: radaroraircraft + ImmobileMultiCell: + Dimensions: 2,3 + Exit@1: + SpawnOffset: 0,-256,0 + Facing: 896 + +COOPPROC.TD: + Inherits: ^InvisibleDummy + ProvidesPrerequisite@buildingname: + Prerequisite: proc.td + ProvidesPrerequisite@anyrefinery: + Prerequisite: anyrefinery + +COOPAFLD.GDI: + Inherits@AIR: ^COOPProducesAircraft + ProvidesPrerequisite@buildingname: + Prerequisite: afld.gdi + ValidFactions: + Factions: gdi, talon, zocom, eagle, arc + ProvidesPrerequisite@gdi: + Prerequisite: aircraft.gdi + ProvidesPrerequisiteValidatedFaction@eagle: + Factions: eagle + Prerequisite: aircraft.eagle + ProvidesPrerequisiteValidatedFaction@arc: + Factions: arc + Prerequisite: aircraft.arc + ProvidesPrerequisite@chinook: + Prerequisite: aircraft.chinook + ProvidesPrerequisite@chinookvisible: + Prerequisite: aircraft.chinookvisible + ProvidesPrerequisite@RadarOrAircraft: + Prerequisite: radaroraircraft + ImmobileMultiCell: + Dimensions: 3,2 + Exit@1: + ExitCell: 1,1 + Facing: 768 + +COOPGTEK: + Inherits: ^InvisibleDummy + Inherits@UPG: ^COOPProducesUpgrades + ValidFactions: + Factions: gdi, talon, zocom, eagle, arc + ProvidesPrerequisite@buildingname: + Prerequisite: gtek + ProvidesPrerequisite@anytechcenter: + Prerequisite: techcenter.any + ProvidesPrerequisite@tdtek: + Prerequisite: techcenter.td + ProvidesPrerequisiteValidatedFaction@talongtek: + Factions: talon + Prerequisite: gtek.talon + ProvidesPrerequisiteValidatedFaction@arcgtek: + Factions: arc + Prerequisite: gtek.arc + ProvidesPrerequisiteValidatedFaction@zocomgtek: + Factions: zocom + Prerequisite: gtek.zocom + ProvidesPrerequisiteValidatedFaction@eaglegtek: + Factions: eagle + Prerequisite: gtek.eagle + +COOPTMPL: + Inherits: ^InvisibleDummy + Inherits@UPG: ^COOPProducesUpgrades + ValidFactions: + Factions: nod, blackh, marked, legion, shadow + ProvidesPrerequisite@buildingname: + Prerequisite: tmpl + ProvidesPrerequisite@anytechcenter: + Prerequisite: techcenter.any + ProvidesPrerequisite@tdtek: + Prerequisite: techcenter.td + ProvidesPrerequisite@ObeliskOrTemple: + Prerequisite: obliortmpl + ProvidesPrerequisiteValidatedFaction@blackhtmpl: + Factions: blackh + Prerequisite: tmpl.blackh + ProvidesPrerequisiteValidatedFaction@markedtmpl: + Factions: marked + Prerequisite: tmpl.marked + ProvidesPrerequisiteValidatedFaction@legiontmpl: + Factions: legion + Prerequisite: tmpl.legion + ProvidesPrerequisiteValidatedFaction@shadowtmpl: + Factions: shadow + Prerequisite: tmpl.shadow + +COOPPRIS: + Inherits: ^InvisibleDummy + ProvidesPrerequisite@buildingname: + Prerequisite: pris + +COOPSPEN.nod: + Inherits@NAV: ^COOPProducesNaval + ProvidesPrerequisite@buildingname: + Prerequisite: spen.nod + ImmobileMultiCell: + Dimensions: 3,3 + Exit@1: + SpawnOffset: 0,-213,0 + Facing: 384 + ExitCell: -1,2 + Exit@2: + SpawnOffset: 0,-213,0 + Facing: 640 + ExitCell: 3,2 + Exit@3: + SpawnOffset: 0,0,0 + Facing: 0 + ExitCell: 1,0 + +COOPSYRD.gdi: + Inherits@NAV: ^COOPProducesNaval + ProvidesPrerequisite@buildingname: + Prerequisite: syrd.gdi + ImmobileMultiCell: + Dimensions: 3,3 + Exit@1: + SpawnOffset: -1024,1024,0 + Facing: 640 + ExitCell: 0,2 + Exit@2: + SpawnOffset: 1024,1024,0 + Facing: 896 + ExitCell: 2,2 + Exit@3: + SpawnOffset: -1024,-1024,0 + Facing: 384 + ExitCell: 0,0 + Exit@4: + SpawnOffset: 1024,-1024,0 + Facing: 128 + ExitCell: 2,0 + +COOPTTUR: + Inherits: ^InvisibleDummy + ProvidesPrerequisite@buildingname: + Prerequisite: ttur + ProvidesPrerequisite@ftur: + Prerequisite: ftur + ProvidesPrerequisite@FlameTowerOrRadar: + Prerequisite: fturorradar + ProvidesPrerequisite@ChemTowerOrSovietTechCenter: + Prerequisite: tturorstek + +COOPCVAT: + Inherits: ^InvisibleDummy + Inherits@UPG: ^COOPProducesUpgrades + ProvidesPrerequisite@buildingname: + Prerequisite: cvat + +COOPINDP: + Inherits: ^InvisibleDummy + Inherits@UPG: ^COOPProducesUpgrades + ProvidesPrerequisite@buildingname: + Prerequisite: indp + +COOPMUNP: + Inherits: ^InvisibleDummy + Inherits@UPG: ^COOPProducesUpgrades + ProvidesPrerequisite@buildingname: + Prerequisite: munp + ProvidesPrerequisite@IndpOrMunp: + Prerequisite: indpormunp + +COOPOREP: + Inherits: ^InvisibleDummy + Inherits@UPG: ^COOPProducesUpgrades + ProvidesPrerequisite@buildingname: + Prerequisite: orep + +COOPUPGC: + Inherits: ^InvisibleDummy + Inherits@UPG: ^COOPProducesUpgrades + ProvidesPrerequisite@buildingname: + Prerequisite: upgc + ValidFactions: + Factions: gdi, talon, zocom, eagle, arc + ProvidesPrerequisiteValidatedFaction@talonupgc: + Factions: talon + Prerequisite: upgc.talon + ProvidesPrerequisiteValidatedFaction@zocomupgc: + Factions: zocom + Prerequisite: upgc.zocom + ProvidesPrerequisiteValidatedFaction@eagleupgc: + Factions: eagle + Prerequisite: upgc.eagle + ProvidesPrerequisiteValidatedFaction@arcupgc: + Factions: arc + Prerequisite: upgc.arc + ProvidesPrerequisite@GDIORUPGC: + Prerequisite: gdiorupgc + +COOPTMPP: + Inherits@UPG: ^COOPProducesUpgrades + Inherits@INF: ^COOPProducesCyborgs + ProvidesPrerequisite@buildingname: + Prerequisite: tmpp + ProvidesPrerequisite@nod: + Prerequisite: infantry.nod + ProvidesPrerequisite@marked: + Factions: marked + Prerequisite: infantry.marked + ProvidesPrerequisite@mech: + Prerequisite: infantry.mech + ImmobileMultiCell: + Dimensions: 3,4 + Exit@1: + SpawnOffset: -170,1310,0 + ExitCell: 1,3 + Exit@2: + SpawnOffset: 190,-400,0 + ExitCell: 1,-1 + Priority: 0 + +COOPMSLO.Nod: + Inherits: ^InvisibleDummy + ProvidesPrerequisite@buildingname: + Prerequisite: mslo.Nod + +COOPWEAT: + Inherits: ^InvisibleDummy + ProvidesPrerequisite@buildingname: + Prerequisite: weat + +COOPSFAC: + Inherits: ^InvisibleDummy + Inherits@BLD: ^COOPProducesBuildings + ValidFactions: + Factions: scrin, reaper, traveler, harbinger, collector + ProvidesPrerequisite@buildingname: + Prerequisite: sfac + ProvidesPrerequisite@scrin: + Prerequisite: structures.scrin + ProvidesPrerequisiteValidatedFaction@reaper: + Factions: reaper + Prerequisite: structures.reaper + ProvidesPrerequisiteValidatedFaction@traveler: + Factions: traveler + Prerequisite: structures.traveler + ProvidesPrerequisiteValidatedFaction@harbinger: + Factions: harbinger + Prerequisite: structures.harbinger + ProvidesPrerequisiteValidatedFaction@collector: + Factions: collector + Prerequisite: structures.collector + ProvidesPrerequisite@anyconyard: + Prerequisite: anyconyard + +COOPREAC: + Inherits: ^InvisibleDummy + ProvidesPrerequisite@anypower: + Prerequisite: anypower + ProvidesPrerequisite@buildingname: + Prerequisite: reac + +COOPREA2: + Inherits: ^InvisibleDummy + ProvidesPrerequisite@anypower: + Prerequisite: anypower + ProvidesPrerequisite@buildingname: + Prerequisite: rea2 + +COOPPROC.SCRIN: + Inherits: ^InvisibleDummy + ProvidesPrerequisite@buildingname: + Prerequisite: proc.scrin + ProvidesPrerequisite@anyrefinery: + Prerequisite: anyrefinery + +COOPPORT: + Inherits@INF: ^COOPProducesInfantry + ProvidesPrerequisite@buildingname: + Prerequisite: port + ValidFactions: + Factions: scrin, reaper, traveler, harbinger, collector + ProvidesPrerequisite@infantryany: + Prerequisite: infantry.any + ProvidesPrerequisite@scrin: + Prerequisite: infantry.scrin + ProvidesPrerequisiteValidatedFaction@reaper: + Factions: reaper + Prerequisite: infantry.reaper + ProvidesPrerequisiteValidatedFaction@traveler: + Factions: traveler + Prerequisite: infantry.traveler + ProvidesPrerequisiteValidatedFaction@harbinger: + Factions: harbinger + Prerequisite: infantry.harbinger + ProvidesPrerequisiteValidatedFaction@collector: + Factions: collector + Prerequisite: infantry.collector + ImmobileMultiCell: + Dimensions: 2,3 + Exit@1: + SpawnOffset: 0,512,0 + ExitCell: 0,2 + Exit@2: + SpawnOffset: 256,512,0 + ExitCell: 1,2 + Exit@3: + SpawnOffset: 0,512,0 + ExitCell: -1,2 + Priority: 0 + Exit@4: + SpawnOffset: 256,512,0 + ExitCell: 2,2 + Priority: 0 + +COOPWSPH: + Inherits@VEH: ^COOPProducesVehicles + ProvidesPrerequisite@buildingname: + Prerequisite: wsph + ValidFactions: + Factions: scrin ,reaper, traveler, harbinger, collector + ProvidesPrerequisite@any: + Prerequisite: vehicles.any + ProvidesPrerequisite@scrin: + Prerequisite: vehicles.scrin + ProvidesPrerequisiteValidatedFaction@reaper: + Factions: reaper + Prerequisite: vehicles.reaper + ProvidesPrerequisiteValidatedFaction@traveler: + Factions: traveler + Prerequisite: vehicles.traveler + ProvidesPrerequisiteValidatedFaction@harbinger: + Factions: harbinger + Prerequisite: vehicles.harbinger + ProvidesPrerequisiteValidatedFaction@collector: + Factions: collector + Prerequisite: vehicles.collector + ProvidesPrerequisiteValidatedFaction@seek: + Factions: scrin, reaper, harbinger, collector + Prerequisite: vehicles.seek + ProvidesPrerequisiteValidatedFaction@corr: + Factions: scrin, reaper, traveler, harbinger + Prerequisite: vehicles.corr + ProvidesPrerequisiteValidatedFaction@devo: + Factions: scrin, reaper, traveler, collector + Prerequisite: vehicles.devo + ProvidesPrerequisiteValidatedFaction@tpod: + Factions: scrin, traveler, harbinger, collector + Prerequisite: vehicles.tpod + ImmobileMultiCell: + Dimensions: 3,3 + Exit@1: + SpawnOffset: 0,0,0 + ExitCell: 0,2 + +COOPNERV: + Inherits: ^InvisibleDummy + Inherits@UPG: ^COOPProducesUpgrades + ProvidesRadar: + ProvidesPrerequisite@buildingname: + Prerequisite: nerv + ValidFactions: + Factions: scrin, reaper, traveler, harbinger, collector + ProvidesPrerequisite@anyradar: + Prerequisite: anyradar + ProvidesPrerequisite@radarorrepair: + Prerequisite: radarorrepair + ProvidesPrerequisite@RadarOrAircraft: + Prerequisite: radaroraircraft + ProvidesPrerequisite@FlameTowerOrRadar: + Prerequisite: fturorradar + ProvidesPrerequisite@scrinrad: + Prerequisite: radar.scrin + ProvidesPrerequisiteValidatedFaction@reaprad: + Factions: reaper + Prerequisite: radar.reaper + ProvidesPrerequisiteValidatedFaction@travrad: + Factions: traveler + Prerequisite: radar.traveler + ProvidesPrerequisiteValidatedFaction@harbrad: + Factions: harbinger + Prerequisite: radar.harbinger + ProvidesPrerequisiteValidatedFaction@desprad: + Factions: collector + Prerequisite: radar.collector + ProvidesPrerequisite@radar-active: + Prerequisite: radar-active + +COOPSCRT: + Inherits: ^InvisibleDummy + Inherits@UPG: ^COOPProducesUpgrades + ValidFactions: + Factions: scrin, reaper, traveler, harbinger, collector + ProvidesPrerequisite@buildingname: + Prerequisite: scrt + ProvidesPrerequisite@anytechcenter: + Prerequisite: techcenter.any + ProvidesPrerequisiteValidatedFaction@harbscrt: + Factions: harbinger + Prerequisite: scrt.harbinger + ProvidesPrerequisiteValidatedFaction@collscrt: + Factions: collector + Prerequisite: scrt.collector + ProvidesPrerequisite@BotAllegiance: + Prerequisite: scrin.allegiances.available + RequiresPrerequisites: botplayer + +COOPGRAV: + Inherits@AIR: ^COOPProducesHelicopters + ProvidesPrerequisite@buildingname: + Prerequisite: grav + ValidFactions: + Factions: scrin, reaper, traveler, harbinger, collector + ProvidesPrerequisiteValidatedFaction@traveler: + Factions: traveler + Prerequisite: aircraft.traveler + ProvidesPrerequisite@scrin: + Prerequisite: aircraft.scrin + ProvidesPrerequisite@RadarOrAircraft: + Prerequisite: radaroraircraft + ImmobileMultiCell: + Dimensions: 3,3 + Exit@1: + ExitCell: 1,1 + Facing: 720 + SpawnOffset: -128,0,0 + +COOPSIGN: + Inherits: ^InvisibleDummy + Inherits@UPG: ^COOPProducesUpgrades + ProvidesPrerequisite@buildingname: + Prerequisite: sign + +COOPSREP: + Inherits: ^InvisibleDummy + ProvidesPrerequisite@buildingname: + Prerequisite: srep + ProvidesPrerequisite@repair: + Prerequisite: repair + ProvidesPrerequisite@radarorrepair: + Prerequisite: radarorrepair + ProvidesPrerequisite@allowsmcv: + Prerequisite: vehicles.mcv + +COOPRFGN: + Inherits: ^InvisibleDummy + ProvidesPrerequisite@buildingname: + Prerequisite: rfgn diff --git a/mods/ca/rules/custom/disable-allegiances.yaml b/mods/ca/rules/custom/disable-allegiances.yaml new file mode 100644 index 0000000000..d4ed7000d3 --- /dev/null +++ b/mods/ca/rules/custom/disable-allegiances.yaml @@ -0,0 +1,44 @@ +Player: + -ProvidesPrerequisitesOnCount@ScrinAllegiances: + +loyalist.allegiance: + Inherits@CAMPAIGNDISABLED: ^Disabled + +rebel.allegiance: + Inherits@CAMPAIGNDISABLED: ^Disabled + +malefic.allegiance: + Inherits@CAMPAIGNDISABLED: ^Disabled + +allegiance.upgrade: + Inherits@CAMPAIGNDISABLED: ^Disabled + +EVIS: + Inherits@CAMPAIGNDISABLED: ^Disabled + +IMPL: + Inherits@CAMPAIGNDISABLED: ^Disabled + +STLK: + Inherits@CAMPAIGNDISABLED: ^Disabled + +OBLT: + Inherits@CAMPAIGNDISABLED: ^Disabled + +NULL: + Inherits@CAMPAIGNDISABLED: ^Disabled + +TORM: + Inherits@CAMPAIGNDISABLED: ^Disabled + +^OverlordsWrathPower: + MeteorPower@OverlordsWrath: + Prerequisites: ~disabled + +^GatewayPower: + DetonateWeaponPower@Gateway: + Prerequisites: ~disabled + +^AnathemaPower: + GrantExternalConditionPowerCA@Anathema: + Prerequisites: ~disabled diff --git a/mods/ca/rules/custom/disable-coalitions.yaml b/mods/ca/rules/custom/disable-coalitions.yaml new file mode 100644 index 0000000000..69878e1b80 --- /dev/null +++ b/mods/ca/rules/custom/disable-coalitions.yaml @@ -0,0 +1,43 @@ +Player: + -ProvidesPrerequisitesOnTimeline: + +^TimeSkipPower: + ProduceActorPowerCA@TimeSkip: + Prerequisites: ~disabled + +economy.policy: + Inherits@CAMPAIGNDISABLED: ^Disabled + +defense.policy: + Inherits@CAMPAIGNDISABLED: ^Disabled + +development.policy: + Inherits@CAMPAIGNDISABLED: ^Disabled + +greece.coalition: + Inherits@CAMPAIGNDISABLED: ^Disabled + +sweden.coalition: + Inherits@CAMPAIGNDISABLED: ^Disabled + +korea.coalition: + Inherits@CAMPAIGNDISABLED: ^Disabled + +ALHQ: + Inherits@CAMPAIGNDISABLED: ^Disabled + +CRYO: + Buildable: + Prerequisites: atek, ~vehicles.allies, ~techlevel.high + +PMAK: + Buildable: + Prerequisites: atek, ~aircraft.allies, ~techlevel.high + +ENFO: + Buildable: + Prerequisites: ~tent, atek, ~techlevel.high + +OREP: + Buildable: + Prerequisites: ~structures.allies, atek, ~techlevel.high diff --git a/mods/ca/rules/custom/disable-covenants.yaml b/mods/ca/rules/custom/disable-covenants.yaml new file mode 100644 index 0000000000..a3c91249fd --- /dev/null +++ b/mods/ca/rules/custom/disable-covenants.yaml @@ -0,0 +1,65 @@ +Player: + -ProvidesPrerequisitesOnCount@NodCovenants: + +wrath.covenant: + Inherits@CAMPAIGNDISABLED: ^Disabled + +unity.covenant: + Inherits@CAMPAIGNDISABLED: ^Disabled + +zeal.covenant: + Inherits@CAMPAIGNDISABLED: ^Disabled + +covenant.upgrade: + Inherits@CAMPAIGNDISABLED: ^Disabled + +lastnk.upgrade: + Inherits@CAMPAIGNDISABLED: ^Disabled + +cust.upgrade: + Inherits@CAMPAIGNDISABLED: ^Disabled + +rbug.upgrade: + Inherits@CAMPAIGNDISABLED: ^Disabled + +covenant.upgrade2: + Inherits@CAMPAIGNDISABLED: ^Disabled + +cyborgarmor.upgrade: + Inherits@CAMPAIGNDISABLED: ^Disabled + +cyborgdmg.upgrade: + Inherits@CAMPAIGNDISABLED: ^Disabled + +cyborgprod.upgrade: + Inherits@CAMPAIGNDISABLED: ^Disabled + +cyborgspeed.upgrade: + Inherits@CAMPAIGNDISABLED: ^Disabled + +^AssassinSquadPower: + ProduceActorPowerCA@AssassinSquad: + Prerequisites: ~disabled + +^HackerCellPower: + ProduceActorPowerCA@HackerCell: + Prerequisites: ~disabled + +^ConfessorCabalPower: + ProduceActorPowerCA@ConfessorCabal: + Prerequisites: ~disabled + +RMBC: + Inherits@CAMPAIGNDISABLED: ^Disabled + +AVTR: + Inherits@CAMPAIGNDISABLED: ^Disabled + +REAP: + Inherits@CAMPAIGNDISABLED: ^Disabled + +ENLI: + Inherits@CAMPAIGNDISABLED: ^Disabled + +TMPP: + Inherits@CAMPAIGNDISABLED: ^Disabled diff --git a/mods/ca/rules/custom/disable-doctrines.yaml b/mods/ca/rules/custom/disable-doctrines.yaml new file mode 100644 index 0000000000..729e28d506 --- /dev/null +++ b/mods/ca/rules/custom/disable-doctrines.yaml @@ -0,0 +1,64 @@ +Player: + -PlayerExperienceLevels: + +infantry.doctrine: + Inherits@CAMPAIGNDISABLED: ^Disabled + +armor.doctrine: + Inherits@CAMPAIGNDISABLED: ^Disabled + +arty.doctrine: + Inherits@CAMPAIGNDISABLED: ^Disabled + +doctrine.upgrade1: + Inherits@CAMPAIGNDISABLED: ^Disabled + +doctrine.upgrade2: + Inherits@CAMPAIGNDISABLED: ^Disabled + +^HeroesOfTheUnionPower: + GrantExternalConditionPowerCA@HEROESOFUNION: + Prerequisites: ~disabled + +^TankDropPower: + ParatroopersPowerCA@TankDrop: + Prerequisites: ~disabled + +^KillZonePower: + AirstrikePowerCA@KillZone: + Prerequisites: ~disabled + +CVAT: + Inherits@CAMPAIGNDISABLED: ^Disabled + +MUNP: + Inherits@CAMPAIGNDISABLED: ^Disabled + +imppara.upgrade: + Inherits@CAMPAIGNDISABLED: ^Disabled + +impstorm.upgrade: + Inherits@CAMPAIGNDISABLED: ^Disabled + +impmuta.upgrade: + Inherits@CAMPAIGNDISABLED: ^Disabled + +reactive.upgrade: + Inherits@CAMPAIGNDISABLED: ^Disabled + +rocketpods.upgrade: + Inherits@CAMPAIGNDISABLED: ^Disabled + +ovld.upgrade: + Inherits@CAMPAIGNDISABLED: ^Disabled + +nukc.upgrade: + Inherits@CAMPAIGNDISABLED: ^Disabled + +apoc.upgrade: + Buildable: + Prerequisites: ~player.soviet, indp, ~techlevel.high + +INDP: + Buildable: + Prerequisites: ~structures.soviet, stek, ~techlevel.high diff --git a/mods/ca/rules/disable-player-experience.yaml b/mods/ca/rules/custom/disable-player-experience.yaml similarity index 86% rename from mods/ca/rules/disable-player-experience.yaml rename to mods/ca/rules/custom/disable-player-experience.yaml index 74b9bd07e9..6a7aee61c3 100644 --- a/mods/ca/rules/disable-player-experience.yaml +++ b/mods/ca/rules/custom/disable-player-experience.yaml @@ -1,19 +1,15 @@ ^ExistsInWorld: - GivesExperience: + GivesExperienceCA: PlayerExperienceModifier: 0 ^Building: RepairableBuilding: PlayerExperience: 0 -E6: +^EngineerBase: Captures: PlayerExperience: 0 -SPY: - Infiltrates: - PlayerExperience: 0 - MECH: Captures: PlayerExperience: 0 diff --git a/mods/ca/rules/custom/mastermind-madness.yaml b/mods/ca/rules/custom/mastermind-madness.yaml new file mode 100644 index 0000000000..890b3dbd54 --- /dev/null +++ b/mods/ca/rules/custom/mastermind-madness.yaml @@ -0,0 +1,301 @@ +World: + MissionData: + Briefing: ================\n\n- Each player starts with a single Mastermind (mind control unit that can control up to 3 units at a time).\n-------------------------\n- Random neutral units are spawned across the map (indestructible until controlled).\n-------------------------\n- Deploy (F) Mastermind for limited duration cloak.\n-------------------------\n- Objective is to kill all enemy Masterminds.\n\n================\n + StartingUnits@mastonly: + Class: none + ClassName: Mastermind + BaseActor: mast + Factions: allies, england, france, germany, usa, soviet, russia, ukraine, iraq, yuri, gdi, talon, zocom, eagle, arc, nod, blackh, marked, legion, shadow, scrin, reaper, traveler, harbinger, collector + -StartingUnits@mcvonly: + -StartingUnits@lightallies: + -StartingUnits@lightsoviet: + -StartingUnits@heavyallies: + -StartingUnits@heavysoviet: + -StartingUnits@mcvonly2: + -StartingUnits@defaultgdia: + -StartingUnits@defaultnoda: + -StartingUnits@heavynoda: + -StartingUnits@heavygdia: + -StartingUnits@mcvonlyscrin: + -StartingUnits@lightscrin: + -StartingUnits@heavyscrin: + SpawnStartingUnits: + DropdownVisible: False + MapBuildRadius: + AllyBuildRadiusCheckboxVisible: False + BuildRadiusCheckboxVisible: False + MapOptions: + TechLevelDropdownVisible: False + ShortGameCheckboxEnabled: True + ShortGameCheckboxLocked: True + ShortGameCheckboxVisible: False + CrateSpawner: + CheckboxEnabled: False + CheckboxLocked: True + CheckboxVisible: False + MapStartingLocations: + SeparateTeamSpawnsCheckboxVisible: False + TimeLimitManager: + TimeLimitLocked: True + TimeLimitDropdownVisible: False + +Player: + PlayerResources: + SelectableCash: 0 + DefaultCash: 0 + DefaultCashDropdownVisible: False + LobbyPrerequisiteCheckbox@GLOBALBOUNTY: + Enabled: False + Locked: True + Visible: False + LobbyPrerequisiteCheckbox@FORCESHIELD: + Enabled: False + Visible: False + DeveloperMode: + CheckboxLocked: True + CheckboxVisible: False + LobbyPrerequisiteCheckbox@GLOBALFACTUNDEPLOY: + Visible: False + LobbyPrerequisiteCheckbox@NAVY: + Visible: False + LobbyPrerequisiteCheckbox@BALANCEDHARVESTING: + Visible: False + LobbyPrerequisiteCheckbox@FASTREGROWTH: + Visible: False + LobbyPrerequisiteCheckbox@REVEALONFIRE: + Enabled: False + Locked: True + Visible: False + LobbyPrerequisiteDropdown@QUEUETYPE: + Default: global.singlequeue + Visible: False + Values: + global.singlequeue: options-queuetype.singlequeue + +^IndestructibleWhenNeutral: + GrantConditionIfOwnerIsNeutral@NEUTRAL: + Condition: is-neutral + DamageMultiplier@NEUTRALINDESTRUCTIBLE: + Modifier: 0 + RequiresCondition: is-neutral + SpeedMultiplier@NEUTRALIMMOBILE: + Modifier: 0 + RequiresCondition: is-neutral + GrantCondition@NEUTRALDISABLE: + Condition: being-warped + RequiresCondition: is-neutral + WithPalettedOverlay@TEMPORALl: + RequiresCondition: being-warped && !is-neutral + WithColoredOverlay@TEMPORAL2: + RequiresCondition: being-warped && !is-neutral + WithIdleOverlay@TEMPORAL: + RequiresCondition: being-warped && !is-neutral + Targetable@TEMPORAL: + RequiresCondition: !invulnerability && !is-neutral + +^Infantry: + Inherits@INDESTRUCTIBLE: ^IndestructibleWhenNeutral + Crushable: + RequiresCondition: !is-neutral + Targetable@MCINF: + TargetTypes: MindControllableInfantry + +^Vehicle-NOUPG: + Inherits@INDESTRUCTIBLE: ^IndestructibleWhenNeutral + Capturable: + RequiresCondition: !is-neutral + +^Defense: + Inherits@INDESTRUCTIBLE: ^IndestructibleWhenNeutral + Inherits@MindControllable: ^MindControllable + +^AffectedByDriverKill: + GrantConditionIfOwnerIsNeutral@DRIVER_DEAD: + Condition: is-neutral + GrantCondition@HACK: + Condition: driver-dead + RequiresCondition: driver-dead + +MAST: + Inherits@CLUSTERMISSILEPOWER: ^ClusterMissilePower + Inherits@SATHACKPOWER: ^SatHackPower + -Passenger: + -PassengerBlocked: + -DummyConditionConsumer@Passenger: + -MassEntersCargo: + -TakeCover: + AutoTarget: + InitialStance: HoldFire + InitialStanceAI: HoldFire + Health: + HP: 120000 + Mobile: + Speed: 56 + MustBeDestroyed: + RequiredForShortGame: true + SpawnActorPowerCA@sathack: + -Prerequisites: + -PauseOnCondition: + ChargeInterval: 2250 + -SpawnActorPowerCA@sathacklegion: + NukePower@Cluster: + -Prerequisites: + -PauseOnCondition: + GrantTimedConditionOnDeploy: + DeployedCondition: deployed + CooldownTicks: 1250 + DeployedTicks: 375 + StartsFullyCharged: true + DischargingColor: bb0000 + ChargingColor: cc00cc + Instant: true + Cloak: + InitialDelay: 0 + CloakDelay: 25 + CloakedCondition: hidden + IsPlayerPalette: true + DetectionTypes: SuperCloak + RequiresCondition: deployed && !cloak-force-disabled + UncloakOn: Unload, Infiltrate, Demolish, Dock, Attack, Damage + CloakSound: gstealon.aud + UncloakSound: gstealof.aud + Cloak@CRATE-CLOAK: + RequiresCondition: crate-cloak && !(cloak-force-disabled || invisibility || hidden) + WithNameTagDecorationCA: + Position: Top + Font: Regular + Margin: 0, -20 + ColorSource: Player + ContrastColorLight: 000000 + ValidRelationships: Ally, Enemy, Neutral + MindController: + ExperienceFromControl: 0 + ReloadAmmoPool@Vehicles: + Delay: 50 + -SpawnActorAbility: + -AmmoPool@MindSpark: + -ReloadAmmoPoolCA@MindSpark: + +RNDV: + Inherits@1: ^1x1Shape + Interactable: + EditorOnlyTooltip: + Name: (random vehicle) + AlwaysVisible: + Mobile: + Locomotor: wheeled + TurnSpeed: 20 + WithFacingSpriteBody: + RenderSpritesEditorOnly: + Image: mnly + MapEditorData: + Categories: System + RequiresSpecificOwners: + ValidOwnerNames: Neutral + Health: + HP: 120000 + KillsSelf: + Delay: 5 + SpawnRandomActorOnDeath@RANDOM: + Actors: btr, bggy, hmmv, jeep, gdrn, gunw, shrw, bike, arty, arty.nod, howi, apc, vulc, delp, ifv, ttnk, ttra, xo, msam, hsam, mlrs, spec, v2rl, katy, ftnk, hftk, corr, 1tnk, 2tnk, 3tnk, 3tnk.atomic, 3tnk.yuri, 3tnk.atomicyuri, mtnk, mtnk.drone, ltnk, wtnk, stnk.nod, rtnk, ptnk, pcan, ctnk, cryo, mgg, msg, mrj, mnly, msar, devo, stcr, ruin, atmz, lace, seek, intl, dark, tnkd, v3rl, isu, memp, cdrn, dtrk, qtnk, lchr, sapc + OwnerType: InternalName + ClassicFacingBodyOrientation: + QuantizeFacingsFromSequence: + +RNDB: + Inherits: RNDV + RenderSpritesEditorOnly: + Image: amcv + SpawnRandomActorOnDeath@RANDOM: + Actors: 4tnk, htnk, titn, 4tnk.atomic, 4tnk.erad, apoc, htnk.ion, titn.rail, htnk.hover, htnk.drone, batf, chpr, tpod, rtpd, disr + +OBLI: + Power: + Amount: 0 + +GUN: + Inherits@IDISABLE: ^DisableOnLowPowerOrPowerDown + Power: + Amount: 0 + +ATWR: + Power: + Amount: 0 + +FTUR: + Inherits@IDISABLE: ^DisableOnLowPowerOrPowerDown + Power: + Amount: 0 + +# Make drones mindcontrollable and not disabled without radar + +HTNK.Drone: + -Targetable@MindControlImmune: + ProvidesPrerequisite@radar-active: + Prerequisite: radar-active + +MTNK.Drone: + -Targetable@MindControlImmune: + Power: + Amount: 0 + ProvidesPrerequisite@radar-active: + Prerequisite: radar-active + +MEMP: + -Targetable@MindControlImmune: + Power: + Amount: 0 + ProvidesPrerequisite@radar-active: + Prerequisite: radar-active + +CDRN: + -Targetable@MindControlImmune: + Power: + Amount: 0 + +GDRN: + -Targetable@MindControlImmune: + Power: + Amount: 0 + +MDRN: + -Targetable@MindControlImmune: + Power: + Amount: 0 + +BRUT: + -Targetable@MindControlImmune: + +CRATE: + -GiveCashCrateAction: + -GiveBaseBuilderCrateAction@TD: + -GiveBaseBuilderCrateAction@RA: + -GiveUnitCrateAction@squadheavyallies: + -GiveUnitCrateAction@squadheavysoviet: + -GiveUnitCrateAction@squadheavynod: + -GiveUnitCrateAction@squadheavygdi: + -GiveUnitCrateAction@squadheavyscrin: + HealActorsCrateAction: + SelectionShares: 40 + LevelUpCrateAction: + SelectionShares: 50 + DuplicateUnitCrateAction: + SelectionShares: 6 + MaxAmount: 2 + MinAmount: 1 + +APOC: + Mobile: + Locomotor: heavytracked + +BATF: + Mobile: + Locomotor: heavytracked + +TITN: + Mobile: + Locomotor: heavytracked + +JUGG: + Mobile: + Locomotor: heavytracked diff --git a/mods/ca/rules/custom/scrinfestation-base.yaml b/mods/ca/rules/custom/scrinfestation-base.yaml new file mode 100644 index 0000000000..56e99d0a5f --- /dev/null +++ b/mods/ca/rules/custom/scrinfestation-base.yaml @@ -0,0 +1,130 @@ +RMBO: + Health: + HP: 25000 + MustBeDestroyed: + RequiredForShortGame: true + Mobile: + Speed: 92 + TakeCover: + SpeedModifier: 85 + ExternalCondition@slowed: + Condition: slowed + SpeedMultiplier@slowed1: + Modifier: 70 + RequiresCondition: slowed == 1 + SpeedMultiplier@slowed2: + Modifier: 40 + RequiresCondition: slowed > 1 + WithDecoration@COMMANDOSKULL: + RequiresCondition: chilled + AutoTarget: + InitialStance: HoldFire + +S1: + AutoTarget: + ScanRadius: 7 + RevealsShroud: + Range: 7c0 + +S2: + AutoTarget: + ScanRadius: 7 + RevealsShroud: + Range: 7c0 + +S3: + AutoTarget: + ScanRadius: 7 + RevealsShroud: + Range: 7c0 + Mobile: + Speed: 46 + +S4: + AutoTarget: + ScanRadius: 7 + RevealsShroud: + Range: 7c0 + Mobile: + Speed: 46 + +BRST2: + Inherits: S1 + RenderSprites: + Image: brst + ConvertsDamageToHealth: + DamagePercentConverted: 225 + Armament@PRIMARY: + Weapon: LeecherBeam + LocalOffset: 150,0,200 + -MuzzleSequence: + -Armament@BATF: + FireWarheadsOnDeath: + Weapon: BursterExplode + EmptyWeapon: BursterExplode + +GSCR: + Armor: + Type: None + Health: + HP: 50000 + AutoTarget: + ScanRadius: 7 + RevealsShroud: + Range: 7c0 + Mobile: + Speed: 60 + +CORR: + AutoTarget: + ScanRadius: 7 + RevealsShroud: + Range: 7c0 + +DARK: + AutoTarget: + ScanRadius: 7 + Armament: + FireDelay: 20 + +GUNW: + AutoTarget: + ScanRadius: 7 + Mobile: + Speed: 53 + TurnSpeed: 16 + +RUIN: + AutoTarget: + ScanRadius: 8 + RevealsShroud: + Range: 8c0 + +LCHR: + AutoTarget: + ScanRadius: 7 + RevealsShroud: + Range: 7c0 + Mobile: + Speed: 53 + TurnSpeed: 16 + ConvertsDamageToHealth: + DamagePercentConverted: 225 + +RiftMinor: + KillsSelf: + Delay: 875 + +BRIK: + -RenderSprites: + RenderSpritesEditorOnly: + DamageMultiplier@INVULN: + Modifier: 0 + +PTUR: + Health: + HP: 60000 + Turreted: + TurnSpeed: 28 + Armament: + Weapon: TurretDiscs diff --git a/mods/ca/rules/custom/scrinfestation-minigame.yaml b/mods/ca/rules/custom/scrinfestation-minigame.yaml new file mode 100644 index 0000000000..171fe2d059 --- /dev/null +++ b/mods/ca/rules/custom/scrinfestation-minigame.yaml @@ -0,0 +1,224 @@ +^Palettes: + TintPostProcessEffect: + Red: 0.80 + Green: 0.85 + Blue: 1.00 + Ambient: 0.9 + +World: + MissionData: + Briefing: ================\n\n- Each player starts with a single Commando.\n-------------------------\n- If your Commando dies you can build a new one (takes longer for each death).\n-------------------------\n- Fight your way through the Scrin forces.\n-------------------------\n- Objective is to find and destroy the Scrin portals.\n-------------------------\n- Mission failed if all spawn points are lost and all Commandos are dead.\n\n================\n + LuaScript: + Scripts: scrinfestation.lua + StartingUnits@rmboonly: + Class: none + ClassName: Commando Only + BaseActor: rmbo + Factions: allies, england, france, germany, usa, soviet, russia, ukraine, iraq, yuri, gdi, talon, zocom, eagle, arc, nod, blackh, marked, legion, shadow, scrin, reaper, traveler, harbinger, collector + -StartingUnits@mcvonly: + -StartingUnits@lightallies: + -StartingUnits@lightsoviet: + -StartingUnits@heavyallies: + -StartingUnits@heavysoviet: + -StartingUnits@mcvonly2: + -StartingUnits@defaultgdia: + -StartingUnits@defaultnoda: + -StartingUnits@heavynoda: + -StartingUnits@heavygdia: + -StartingUnits@mcvonlyscrin: + -StartingUnits@lightscrin: + -StartingUnits@heavyscrin: + SpawnStartingUnits: + DropdownVisible: False + MapBuildRadius: + AllyBuildRadiusCheckboxVisible: False + BuildRadiusCheckboxVisible: False + MapOptions: + TechLevelDropdownVisible: False + ShortGameCheckboxEnabled: True + ShortGameCheckboxLocked: True + ShortGameCheckboxVisible: False + CrateSpawner: + CheckboxEnabled: False + CheckboxLocked: True + CheckboxVisible: False + MapStartingLocations: + SeparateTeamSpawnsCheckboxVisible: False + TimeLimitManager: + TimeLimitLocked: True + TimeLimitDropdownVisible: False + +Player: + PlayerResources: + SelectableCash: 0 + DefaultCash: 0 + DefaultCashDropdownVisible: False + LobbyPrerequisiteCheckbox@GLOBALBOUNTY: + Enabled: False + Locked: True + Visible: False + LobbyPrerequisiteCheckbox@FORCESHIELD: + Enabled: False + Visible: False + DeveloperMode: + CheckboxLocked: True + CheckboxVisible: False + LobbyPrerequisiteCheckbox@GLOBALFACTUNDEPLOY: + Visible: False + LobbyPrerequisiteCheckbox@NAVY: + Visible: False + LobbyPrerequisiteCheckbox@BALANCEDHARVESTING: + Visible: False + LobbyPrerequisiteCheckbox@FASTREGROWTH: + Visible: False + LobbyPrerequisiteCheckbox@REVEALONFIRE: + Enabled: False + Locked: True + Visible: False + LobbyPrerequisiteDropdown@QUEUETYPE: + Default: global.singlequeue + Visible: False + Values: + global.singlequeue: options-queuetype.singlequeue + Shroud: + ExploredMapCheckboxEnabled: False + ExploredMapCheckboxVisible: False + ExploredMapCheckboxLocked: True + ModularBot@DormantAI: + Name: Dormant AI + Type: dormant + -ModularBot@BrutalAI: + -ModularBot@VeryHardAI: + -ModularBot@HardAI: + -ModularBot@NormalAI: + -ModularBot@EasyAI: + -ModularBot@NavalAI: + +RMBO: + Valued: + Cost: 0 + Buildable: + Prerequisites: ~rmbospawn + BuildDuration: 500 + BuildDurationModifier: 100 + TooltipExtras: + Strengths: • Strong vs Infantry + Weaknesses: • Cannot attack Aircraft + Attributes: • Maximum 1 can be trained\n• Detects cloaked units\n• Immune to mind control\n• Voiced by Frank Klepacki + -Armament@sapper: + -GrantConditionOnPrerequisite@HAZMATZOCOM: + SpawnActorOnDeath@ONEDEATH: + Actor: death.first + RequiresCondition: !one-death + SpawnActorOnDeath@TWODEATHS: + Actor: death.second + RequiresCondition: one-death && !two-deaths + SpawnActorOnDeath@THREEDEATHS: + Actor: death.third + RequiresCondition: two-deaths && !three-deaths + SpawnActorOnDeath@FOURDEATHS: + Actor: death.fourth + RequiresCondition: three-deaths && !four-deaths + SpawnActorOnDeath@FIVEDEATHS: + Actor: death.fifth + RequiresCondition: five-deaths && !five-deaths + GrantConditionOnPrerequisite@ONEDEATH: + Condition: one-death + Prerequisites: death.first + GrantConditionOnPrerequisite@TWODEATHS: + Condition: two-deaths + Prerequisites: death.second + GrantConditionOnPrerequisite@THREEDEATHS: + Condition: three-deaths + Prerequisites: death.third + GrantConditionOnPrerequisite@FOURDEATHS: + Condition: four-deaths + Prerequisites: death.fourth + GrantConditionOnPrerequisite@FIVEDEATHS: + Condition: five-deaths + Prerequisites: death.fifth + ProductionTimeMultiplier@TWODEATHS: + Multiplier: 150 + Prerequisites: death.second, !death.third + ProductionTimeMultiplier@THREEDEATHS: + Multiplier: 300 + Prerequisites: death.third, !death.fourth + ProductionTimeMultiplier@FOURDEATHS: + Multiplier: 450 + Prerequisites: death.fourth, !death.fifth + ProductionTimeMultiplier@FIVEDEATHS: + Multiplier: 600 + Prerequisites: death.fifth + WithNameTagDecorationCA: + Position: Top + Font: Regular + Margin: 0, -20 + ColorSource: Player + ContrastColorLight: 000000 + +RMBOSPAWN: + Inherits: CAMERA + Inherits@PROD: ^ProducesInfantry + Tooltip: + Name: Spawn Point + MustBeDestroyed: + RequiredForShortGame: true + Exit: + Health: + HP: 5000 + Armor: + Type: Wood + HitShape: + ProvidesPrerequisite: + Targetable: + TargetTypes: Ground, Structure + WithSpriteBody: + -RenderSpritesEditorOnly: + RenderSprites: + Image: shab + WithIdleAnimation: + Sequences: idle + Interval: 25 + FireWarheadsOnDeath: + Weapon: UnitExplodeSmall + EmptyWeapon: UnitExplodeSmall + Production@SQINF: + -PauseOnCondition: + Production@MQINF: + -PauseOnCondition: + ScriptTriggers: + +WORMHOLE: + MapEditorData: + Categories: System + MustBeDestroyed: + RequiredForShortGame: true + Health: + HP: 50000 + +^DeathToken: + AlwaysVisible: + Interactable: + ScriptTriggers: + ProvidesPrerequisite@DEATH: + +DEATH.FIRST: + Inherits: ^DeathToken + +DEATH.SECOND: + Inherits: ^DeathToken + +DEATH.THIRD: + Inherits: ^DeathToken + +DEATH.FOURTH: + Inherits: ^DeathToken + +DEATH.FIFTH: + Inherits: ^DeathToken + +MEDI: + Mobile: + PauseOnCondition: immobile + GrantCondition@IMMOBILE: + Condition: immobile diff --git a/mods/ca/rules/custom/two-tone-nod.yaml b/mods/ca/rules/custom/two-tone-nod.yaml new file mode 100644 index 0000000000..9845267647 --- /dev/null +++ b/mods/ca/rules/custom/two-tone-nod.yaml @@ -0,0 +1,202 @@ +^Palettes: + OverlayPlayerColorPalette@RAUNIT: + BasePalette: player + BaseName: player-twotonenod + RemapIndex: 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95 + FactionColors: + nod: E6E6FF + FactionColorPlayers: Nod, Nod1, Nod2, Nod3, Multi0 + OverlayPlayerColorPalette@TDUNIT: + BasePalette: temptd + BaseName: playertd-twotonenod + RemapIndex: 176, 178, 180, 182, 184, 186, 189, 191, 177, 179, 181, 183, 185, 187, 188, 190 + FactionColors: + nod: E6E6FF + FactionColorPlayers: Nod, Nod1, Nod2, Nod3, Multi0 + OverlayPlayerColorPalette@SCRINUNIT: + BasePalette: playerscrin + BaseName: playerscrin-twotonenod + RemapIndex: 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95 + FactionColors: + nod: E6E6FF + FactionColorPlayers: Nod, Nod1, Nod2, Nod3, Multi0 + +^Vehicle-NOUPG: + RenderSprites: + PlayerPalette: player-twotonenod + +^Plane: + RenderSprites: + PlayerPalette: player-twotonenod + +^Helicopter: + RenderSprites: + PlayerPalette: player-twotonenod + +^BasicHusk: + RenderSprites: + PlayerPalette: player-twotonenod + +^TDPalette: + RenderSprites: + PlayerPalette: playertd-twotonenod + +^ScrinUnitPalette: + RenderSprites: + PlayerPalette: playerscrin-twotonenod + +^Infantry: + RenderSprites: + PlayerPalette: playertd-twotonenod + WithDeathAnimation: + DeathSequencePalette: playertd-twotonenod + CrushedSequencePalette: playertd-twotonenod + +^ScrinInfantry: + RenderSprites: + PlayerPalette: playerscrin-twotonenod + WithDeathAnimation: + DeathSequencePalette: playerscrin-twotonenod + CrushedSequencePalette: playerscrin-twotonenod + +SHAD: + RenderSprites: + PlayerPalette: playertd + WithDeathAnimation: + DeathSequencePalette: playertd + +TPLR: + RenderSprites: + PlayerPalette: playertd + WithDeathAnimation: + DeathSequencePalette: playertd + +RMBC: + RenderSprites: + PlayerPalette: playertd + WithDeathAnimation: + DeathSequencePalette: playertd + +ENLI: + RenderSprites: + PlayerPalette: playertd + WithDeathAnimation: + DeathSequencePalette: playertd + +REAP: + RenderSprites: + PlayerPalette: playertd + WithDeathAnimation: + DeathSequencePalette: playertd + +^BuildingTD: + RenderSprites: + PlayerPalette: playertd + +^DefenseTD: + RenderSprites: + PlayerPalette: playertd + +SAPC: + RenderSprites: + PlayerPalette: player-twotonenod + +HARV: + RenderSprites: + PlayerPalette: player + +HARV.Husk: + RenderSprites: + PlayerPalette: player + +HARV.TD: + RenderSprites: + PlayerPalette: playertd + +HARV.TD.Husk: + RenderSprites: + PlayerPalette: playertd + +MCV: + RenderSprites: + PlayerPalette: player + +MCV.Husk: + RenderSprites: + PlayerPalette: player + +AMCV: + RenderSprites: + PlayerPalette: playertd + +AMCV.Husk: + RenderSprites: + PlayerPalette: playertd + +LST: + RenderSprites: + PlayerPalette: player-twotonenod + +SB: + RenderSprites: + PlayerPalette: player-twotonenod + +SS2: + RenderSprites: + PlayerPalette: player-twotonenod + +ISUB: + RenderSprites: + PlayerPalette: player-twotonenod + +TRAN: + RenderSprites: + PlayerPalette: player-twotonenod + +SCRN: + RenderSprites: + PlayerPalette: playertd + +SCRN.Husk: + RenderSprites: + PlayerPalette: playertd + +BEAG: + RenderSprites: + PlayerPalette: player-twotonenod + +KAMV: + RenderSprites: + PlayerPalette: player-twotonenod + +RECK: + RenderSprites: + PlayerPalette: player-twotonenod + +3TNK.RHINO: + RenderSprites: + PlayerPalette: player-twotonenod + +MSG: + RenderSprites: + PlayerPalette: player-twotonenod + +MNLY: + RenderSprites: + PlayerPalette: player-twotonenod + +JJET: + RenderSprites: + PlayerPalette: playertd-twotonenod + +GSCR: + RenderSprites: + PlayerPalette: playerscrin-twotonenod + WithDeathAnimation: + DeathSequencePalette: playerscrin-twotonenod + +GSCR.Mutating: + RenderSprites: + PlayerPalette: playerscrin-twotonenod + WithDeathAnimation: + DeathSequencePalette: playerscrin-twotonenod diff --git a/mods/ca/rules/decoration.yaml b/mods/ca/rules/decoration.yaml index 45b79e775d..288f4befa2 100644 --- a/mods/ca/rules/decoration.yaml +++ b/mods/ca/rules/decoration.yaml @@ -455,3 +455,94 @@ TANKTRAP2: Name: Tank Trap MapEditorData: RequireTilesets: TEMPERAT, SNOW, DESERT, INTERIOR, BARREN, WINTER, JUNGLE + +#### ALIEN WORLD + +^ScrinFlora: + Inherits: ^Tree + MapEditorData: + ExcludeTilesets: DESERT, INTERIOR + +SCRINFLORA1: + Inherits: ^ScrinFlora + Building: + Footprint: x + Dimensions: 1,1 + +SCRINFLORA2: + Inherits: ^ScrinFlora + Building: + Footprint: x + Dimensions: 1,1 + +SCRINFLORA3: + Inherits: ^ScrinFlora + Building: + Footprint: xx + Dimensions: 2,1 + +SCRINFLORA4: + Inherits: ^ScrinFlora + Building: + Footprint: xx + Dimensions: 2,1 + +SCRINFLORA5: + Inherits: ^ScrinFlora + Building: + Footprint: xx + Dimensions: 2,1 + +SCRINFLORA6: + Inherits: ^ScrinFlora + Building: + Footprint: xxx + Dimensions: 3,1 + +SCRINFLORA7: + Inherits: ^ScrinFlora + Building: + Footprint: xx + Dimensions: 2,1 + +SCRINFLORA8: + Inherits: ^ScrinFlora + Building: + Footprint: xx + Dimensions: 2,1 + +SCRINFLORA9: + Inherits: ^ScrinFlora + Building: + Footprint: x + Dimensions: 1,1 + +SCRINFLORA10: + Inherits: ^ScrinFlora + Building: + Footprint: x + Dimensions: 1,1 + +SCRINFLORA11: + Inherits: ^ScrinFlora + Building: + Footprint: x + Dimensions: 1,1 + +SCRINFLORA12: + Inherits: ^ScrinFlora + Building: + Footprint: x + Dimensions: 1,1 + +SCRINFLORA13: + Inherits: ^ScrinFlora + Building: + Footprint: x + Dimensions: 1,1 + +SCRINFLORA14: + Inherits: ^ScrinFlora + Building: + Footprint: x + Dimensions: 1,1 diff --git a/mods/ca/rules/defaults.yaml b/mods/ca/rules/defaults.yaml index f9756e2eb7..9fe84ffab8 100644 --- a/mods/ca/rules/defaults.yaml +++ b/mods/ca/rules/defaults.yaml @@ -1,8 +1,9 @@ ^ExistsInWorld: AppearsOnRadar: CombatDebugOverlay: - GivesExperience: + GivesExperienceCA: PlayerExperienceModifier: 1 + ActorExperienceOnDamage: true ScriptTriggers: RenderDebugState: @@ -10,7 +11,6 @@ ClassicFacingBodyOrientation: QuantizeFacingsFromSequence: RenderSprites: - PlayerPalette: overlayplayer ^1x1Shape: HitShape: @@ -23,15 +23,15 @@ HitShape: UseTargetableCellsOffsets: true Type: Rectangle - TopLeft: -1024, -512 - BottomRight: 1024, 512 + TopLeft: -512, -1024 + BottomRight: 512, 1024 ^2x1Shape: HitShape: UseTargetableCellsOffsets: true Type: Rectangle - TopLeft: -512, -1024 - BottomRight: 512, 1024 + TopLeft: -1024, -512 + BottomRight: 1024, 512 ^2x2Shape: HitShape: @@ -49,6 +49,7 @@ ^Transport: Cargo: + MassEnterableCargo: WithCargoPipsDecoration: Position: BottomLeft Margin: 4, 3 @@ -59,12 +60,31 @@ red: pip-red blue: pip-blue +# for upgrades, proxy powers, stolen tech, spawners etc +^InvisibleDummy: + AlwaysVisible: + Interactable: + ScriptTriggers: + +^PreviewDummy: + Inherits: ^SpriteActor + AlwaysVisible: + Interactable: + Mobile: + Locomotor: foot + Tooltip: + Name: Preview + Armament: + Weapon: DummyWeapon + AttackFrontal: + ^PrimaryBuilding: PrimaryBuilding: PrimaryCondition: primary SelectionNotification: PrimaryBuildingSelected + RequiresCondition: !global-multiqueue WithDecoration@primary: - RequiresCondition: primary + RequiresCondition: primary && !global-multiqueue Position: Top Margin: 0, 4 RequiresSelection: true @@ -108,90 +128,93 @@ ProvidesPrerequisite@NavalAI: Prerequisite: is-naval-ai RequiresCondition: owned-by-naval-ai - ProvidesPrerequisite@AI: - Prerequisite: botplayer - RequiresCondition: owned-by-brutal-ai || owned-by-vhard-ai || owned-by-hard-ai || owned-by-normal-ai || owned-by-easy-ai || owned-by-naval-ai + ProductionCostMultiplier@brutalbonus: + Multiplier: 90 + Prerequisites: is-brutal-ai + ProductionCostMultiplier@vhardbonus: + Multiplier: 95 + Prerequisites: is-vhard-ai + ProductionTimeMultiplier@easybonus: + Multiplier: 115 + Prerequisites: is-easy-ai + +# Refineries have an explicit BuildDuration so build time is unaffected by ProductionCostMultiplier +^Refinery: + Inherits@SendCash: ^SendCashPower ProductionTimeMultiplier@brutalbonus: Multiplier: 90 Prerequisites: is-brutal-ai ProductionTimeMultiplier@vhardbonus: Multiplier: 95 Prerequisites: is-vhard-ai + ProvidesPrerequisiteIfAlliesExist: + Prerequisite: sendcash.enabled ^BotDefenseProductionBonus: - ProductionTimeMultiplier@brutalbonus: + ProductionCostMultiplier@brutalbonus: Multiplier: 85 - ProductionTimeMultiplier@vhardbonus: + Prerequisites: is-brutal-ai + ProductionCostMultiplier@vhardbonus: Multiplier: 90 - ProductionTimeMultiplier@hardbonus: + Prerequisites: is-vhard-ai + ProductionCostMultiplier@hardbonus: Multiplier: 95 + Prerequisites: is-hard-ai + ProductionTimeMultiplier@easybonus: + Multiplier: 115 + Prerequisites: is-easy-ai ^BotGroundProductionBonus: - ProductionTimeMultiplier@brutalbonus: - Multiplier: 50 + ProductionCostMultiplier@brutalbonus: + Multiplier: 60 Prerequisites: is-brutal-ai - ProductionTimeMultiplier@vhardbonus: - Multiplier: 65 + ProductionCostMultiplier@vhardbonus: + Multiplier: 75 Prerequisites: is-vhard-ai - ProductionTimeMultiplier@hardbonus: - Multiplier: 80 - Prerequisites: is-hard-ai - ProductionTimeMultiplier@normalbonus: + ProductionCostMultiplier@hardbonus: Multiplier: 90 - Prerequisites: is-normal-ai + Prerequisites: is-hard-ai + ProductionTimeMultiplier@easybonus: + Multiplier: 120 + Prerequisites: is-easy-ai ^BotAirProductionBonus: - ProductionTimeMultiplier@brutalbonus: - Multiplier: 85 - Prerequisites: is-brutal-ai - ProductionTimeMultiplier@vhardbonus: - Multiplier: 90 - Prerequisites: is-vhard-ai - ProductionTimeMultiplier@hardbonus: + ProductionCostMultiplier@brutalbonus: Multiplier: 95 - Prerequisites: is-hard-ai + Prerequisites: is-brutal-ai + ProductionTimeMultiplier@easybonus: + Multiplier: 120 + Prerequisites: is-easy-ai # The Bot does not know how to sell up when he does not have an income. This provides an income, when floating less than 2500$ ^BotFallbackInsurance: - GrantConditionOnPlayerResources@botinsurance: + GrantConditionOnPlayerFunds@botinsurance: Condition: noinsurance Threshold: 2500 + GrantTimedCondition@botinsurance: + Condition: noinsurance + Duration: 3000 CashTrickler@brutalinsurance: - Interval: 450 - Amount: 1000 + Interval: 375 + Amount: 1700 ShowTicks: False RequiresCondition: owned-by-brutal-ai && !noinsurance CashTrickler@vhardinsurance: - Interval: 450 - Amount: 750 + Interval: 375 + Amount: 1300 ShowTicks: False RequiresCondition: owned-by-vhard-ai && !noinsurance CashTrickler@hardinsurance: - Interval: 450 - Amount: 500 + Interval: 375 + Amount: 900 ShowTicks: False RequiresCondition: owned-by-hard-ai && !noinsurance CashTrickler@normalinsurance: - Interval: 450 - Amount: 250 + Interval: 375 + Amount: 500 ShowTicks: False RequiresCondition: owned-by-normal-ai && !noinsurance -# RefineryResourceMultiplier on Proc's so AI income is still tied to harvesters, so eco sniping AI is possible. -^BotIncome: - RefineryResourceMultiplier@brutalincome: - Modifier: 135 - RequiresCondition: owned-by-brutal-ai - RefineryResourceMultiplier@vhardincome: - Modifier: 125 - RequiresCondition: owned-by-vhard-ai - RefineryResourceMultiplier@hardincome: - Modifier: 115 - RequiresCondition: owned-by-hard-ai - RefineryResourceMultiplier@normalincome: - Modifier: 105 - RequiresCondition: owned-by-normal-ai - #Hacky but helps Bots deal with abandoned vehicles due to snipers ^BotCaptureHelper: Armament@AIHELPER: @@ -201,7 +224,7 @@ RequiresCondition: botowner GrantConditionOnBotOwner@AIHELPER: Condition: botowner - Bots: brutal, vhard, hard, normal, easy, naval + Bots: brutal, vhard, hard, normal, easy, naval, campaign GrantConditionOnAttack@AIHELPER: Condition: removeunit ArmamentNames: commandeer @@ -218,18 +241,22 @@ primary: shoot commandeer: stand +^InfiltratorStolenTech: + ProductionCostMultiplier@LegionBonus: + Multiplier: 90 + Prerequisites: player.legion + ^PlayerHandicaps: HandicapFirepowerMultiplier: HandicapDamageMultiplier: - HandicapProductionTimeMultiplier: ^GainsExperience: GainsExperience: LevelUpNotification: LevelUp Conditions: - 200: rank-veteran - 400: rank-veteran - 800: rank-veteran + 300: rank-veteran + 600: rank-veteran + 900: rank-veteran GrantCondition@RANK-ELITE: RequiresCondition: rank-veteran >= 3 Condition: rank-elite @@ -240,8 +267,8 @@ RequiresCondition: rank-veteran == 2 Modifier: 90 DamageMultiplier@RANK-ELITE: - RequiresCondition: rank-elite - Modifier: 85 + RequiresCondition: rank-elite && !development-policy3 + Modifier: 75 FirepowerMultiplier@RANK-1: RequiresCondition: rank-veteran == 1 Modifier: 105 @@ -249,8 +276,8 @@ RequiresCondition: rank-veteran == 2 Modifier: 110 FirepowerMultiplier@RANK-ELITE: - RequiresCondition: rank-elite - Modifier: 125 + RequiresCondition: rank-elite && !development-policy3 + Modifier: 130 ReloadDelayMultiplier@RANK-1: RequiresCondition: rank-veteran == 1 Modifier: 95 @@ -258,38 +285,104 @@ RequiresCondition: rank-veteran == 2 Modifier: 90 ReloadDelayMultiplier@RANK-ELITE: - RequiresCondition: rank-elite + RequiresCondition: rank-elite && !development-policy3 Modifier: 80 ChangesHealth@ELITE: PercentageStep: 5 Delay: 100 StartIfBelow: 100 - DamageCooldown: 125 + DamageCooldown: 150 RequiresCondition: rank-elite WithDecoration@RANK-1: Image: rank Sequence: rank-veteran-1 Palette: effect Position: BottomRight - Margin: 5, 6 + Margin: 5, 2 ValidRelationships: Ally, Enemy - RequiresCondition: rank-veteran == 1 + RequiresCondition: rank-veteran == 1 && !player-nod && !player-scrin WithDecoration@RANK-2: Image: rank Sequence: rank-veteran-2 Palette: effect Position: BottomRight - Margin: 5, 6 + Margin: 5, 2 ValidRelationships: Ally, Enemy - RequiresCondition: rank-veteran == 2 + RequiresCondition: rank-veteran == 2 && !player-nod && !player-scrin WithDecoration@RANK-ELITE: Image: rank Sequence: rank-elite Palette: effect Position: BottomRight - Margin: 5, 6 + Margin: 5, 2 ValidRelationships: Ally, Enemy - RequiresCondition: rank-elite + RequiresCondition: rank-elite && !player-nod && !player-scrin + WithDecoration@NODRANK-1: + Image: rank + Sequence: rank-veteran-1-nod + Palette: effect + Position: BottomRight + Margin: 5, 2 + ValidRelationships: Ally, Enemy + RequiresCondition: rank-veteran == 1 && player-nod + WithDecoration@NODRANK-2: + Image: rank + Sequence: rank-veteran-2-nod + Palette: effect + Position: BottomRight + Margin: 5, 2 + ValidRelationships: Ally, Enemy + RequiresCondition: rank-veteran == 2 && player-nod + WithDecoration@NODRANK-ELITE: + Image: rank + Sequence: rank-elite-nod + Palette: effect + Position: BottomRight + Margin: 5, 2 + ValidRelationships: Ally, Enemy + RequiresCondition: rank-elite && player-nod + WithDecoration@SCRINRANK-1: + Image: rank + Sequence: rank-veteran-1-scrin + Palette: scrineffect + Position: BottomRight + Margin: 5, 2 + ValidRelationships: Ally, Enemy + RequiresCondition: rank-veteran == 1 && player-scrin + WithDecoration@SCRINRANK-2: + Image: rank + Sequence: rank-veteran-2-scrin + Palette: scrineffect + Position: BottomRight + Margin: 5, 2 + ValidRelationships: Ally, Enemy + RequiresCondition: rank-veteran == 2 && player-scrin + WithDecoration@SCRINRANK-ELITE: + Image: rank + Sequence: rank-elite-scrin + Palette: scrineffect + Position: BottomRight + Margin: 5, 2 + ValidRelationships: Ally, Enemy + RequiresCondition: rank-elite && player-scrin + GrantConditionOnPrerequisite@NODRANK: + Condition: player-nod + Prerequisites: player.nod + GrantConditionOnPrerequisite@SCRINRANK: + Condition: player-scrin + Prerequisites: player.scrin + GrantConditionOnPrerequisite@DevelopmentPolicy3: + Condition: development-policy3 + Prerequisites: development.policy, influence.level3 + DamageMultiplier@EliteDevelopmentPolicy3: + RequiresCondition: rank-elite && development-policy3 + Modifier: 60 + FirepowerMultiplier@EliteDevelopmentPolicy3: + RequiresCondition: rank-elite && development-policy3 + Modifier: 140 + ReloadDelayMultiplier@EliteDevelopmentPolicy3: + RequiresCondition: rank-elite && development-policy3 + Modifier: 75 ^Berserk: SpeedMultiplier@BERSERK: @@ -302,7 +395,8 @@ Condition: berserk Berserkable@BERSERK: RequiresCondition: berserkactive - WithColoredOverlay@BERSERK: + MaxRange: 6c0 + WithPalettedOverlay@BERSERK: RequiresCondition: berserkactive Palette: berserk TimedConditionBar@BERSERK: @@ -311,7 +405,7 @@ RejectsOrders@BERSERK: RequiresCondition: berserkactive GrantCondition@BERSERK: - RequiresCondition: berserk && !invulnerability + RequiresCondition: berserk Condition: berserkactive ^Frenzy: @@ -322,8 +416,8 @@ RequiresCondition: frenzy Modifier: 75 ExternalCondition@FRENZY: - Condition: frenzy - WithColoredOverlay@FRENZY: + Condition: frenzyinit + WithPalettedOverlay@FRENZY: RequiresCondition: frenzy Palette: frenzy TimedConditionBar@FRENZY: @@ -334,35 +428,177 @@ Image: frenzy-overlay Palette: frenzyoverlay RequiresCondition: frenzy + IsDecoration: True + GrantTimedCondition@FRENZY: + Condition: frenzy + RequiresCondition: frenzyinit + Duration: 500 + ReloadDelayMultiplier@FRENZYDEBUFF: + RequiresCondition: !frenzy && frenzyinit + Modifier: 115 + SpeedMultiplier@FRENZYDEBUFF: + RequiresCondition: !frenzy && frenzyinit + Modifier: 85 ^FrenzyInfantry: Inherits: ^Frenzy WithIdleOverlay@FRENZY: Sequence: infantry +^Inspirable: + ExternalCondition@InspirationCmsr: + Condition: cmsr-inspiration + ExternalCondition@InspirationTrpc: + Condition: trpc-inspiration + ExternalCondition@InspirationOvld: + Condition: ovld-inspiration + GrantCondition@Inspiration1: + RequiresCondition: cmsr-inspiration + Condition: inspiration + GrantCondition@Inspiration2: + RequiresCondition: trpc-inspiration + Condition: inspiration + GrantCondition@Inspiration3: + RequiresCondition: ovld-inspiration + Condition: inspiration + ReloadDelayMultiplier@Inspiration1: + RequiresCondition: inspiration == 1 + Modifier: 92 + ReloadAmmoDelayMultiplier@Inspiration1: + RequiresCondition: inspiration == 1 + Modifier: 92 + SpeedMultiplier@Inspiration1: + RequiresCondition: inspiration == 1 + Modifier: 130 + ReloadDelayMultiplier@Inspiration2: + RequiresCondition: inspiration >= 2 + Modifier: 84 + ReloadAmmoDelayMultiplier@Inspiration2: + RequiresCondition: inspiration >= 2 + Modifier: 84 + SpeedMultiplier@Inspiration2: + RequiresCondition: inspiration >= 2 + Modifier: 140 + WithIdleOverlay@Inspiration1: + Image: ussrstar + Sequence: idle-overlay1 + Palette: effect + RequiresCondition: inspiration == 1 + IsDecoration: True + WithIdleOverlay@Inspiration2: + Image: ussrstar + Sequence: idle-overlay2 + Palette: effect + RequiresCondition: inspiration >= 2 + IsDecoration: True + +^HeroOfTheUnionTargetable: + Targetable@HeroOfTheUnion: + TargetTypes: HeroOfUnionTargetable + RequiresCondition: !herooftheunion + ExternalCondition@HeroOfTheUnion: + Condition: herooftheunion + FlatHealthDamageMultiplier@HeroOfTheUnion: + HP: 28000 + RequiresCondition: herooftheunion + SpeedMultiplier@HeroOfTheUnion: + Modifier: 120 + RequiresCondition: herooftheunion + ReloadDelayMultiplier@HeroOfTheUnion: + Modifier: 66 + RequiresCondition: herooftheunion + ReloadAmmoDelayMultiplier@HeroOfTheUnion: + Modifier: 66 + RequiresCondition: herooftheunion + RangeMultiplier@HeroOfTheUnion: + Modifier: 150 + RequiresCondition: herooftheunion + WithIdleOverlay@HeroOfTheUnionLight: + Sequence: light + Image: hero-overlay + Palette: effect + RequiresCondition: herooftheunion + IsDecoration: True + WithIdleOverlay@HeroOfTheUnionCrest: + Sequence: star + Image: hero-overlay + Palette: effect + RequiresCondition: herooftheunion + IsDecoration: True + TakeCover: + RequiresCondition: !herooftheunion && !reapersnare + GrantCondition@HeroElite: + RequiresCondition: herooftheunion + Condition: rank-elite + +^HeroOfTheUnionTargetableGrenFlamer: + Inherits: ^HeroOfTheUnionTargetable + FlatHealthDamageMultiplier@HeroOfTheUnion: + HP: 5000 + ReloadDelayMultiplier@HeroOfTheUnion: + Modifier: 90 + RangeMultiplier@HeroOfTheUnion: + Modifier: 170 + +^IdolOfKane: + ExternalCondition@IdolOfKaneBuff: + Condition: iokbuff + SpeedMultiplier@IdolOfKaneBuff: + RequiresCondition: iokbuff + Modifier: 130 + ReloadDelayMultiplier@IdolOfKaneBuff: + RequiresCondition: iokbuff + Modifier: 85 + ExternalCondition@IdolOfKaneDebuff: + Condition: iokdebuff + SpeedMultiplier@IdolOfKaneDebuff: + RequiresCondition: iokdebuff + Modifier: 80 + ReloadDelayMultiplier@IdolOfKaneDebuff: + RequiresCondition: iokdebuff + Modifier: 120 + +^Chronoshiftable: + ChronoshiftableCA: + Image: chrono + InitialWarpFromSequence: warpin + ReturnWarpFromSequence: warpin + ReturnWarpToSequence: warpout + RequiresCondition: !being-warped + Palette: ra2effect-ignore-lighting-alpha75 + ReturnToAvoidDeath: true + Condition: chronoshifted + HealthCapDamageMultiplier@CHRONO: + MaxHealthEquivalent: 47000 + RequiresCondition: chronoshifted + +^NoUnloadWhenChronoshifted: + RejectsOrders@NOUNLOADCHRONO: + Reject: Unload + RequiresCondition: chronoshifted + ^Warpable: Warpable: Condition: being-warped - RevokeDelay: 120 + RevokeDelay: 25 + RevokeRate: 250 DamageTypes: ChronoDeath ScaleWithCurrentHealthPercentage: true ShowSelectionBar: true - SelectionBarColor: 40FFFF + SelectionBarColor: b6f4ff Targetable@TEMPORAL: TargetTypes: Temporal - WithColoredOverlay@TEMPORALl: - RequiresCondition: being-warped - Palette: temporal - WithColoredOverlay@TEMPORAL2: - RequiresCondition: being-warped - Palette: lowpower TimedConditionBar@TEMPORAL: + Color: b6f4ff Condition: being-warped - Color: 2f74e2 + WithPalettedOverlay@TEMPORALl: + RequiresCondition: being-warped + Palette: temporal WithIdleOverlay@TEMPORAL: Sequence: chrono-overlay RequiresCondition: being-warped - Explodes@TEMPORAL: + IsDecoration: True + FireWarheadsOnDeath@TEMPORAL: Weapon: TemporalExplode EmptyWeapon: TemporalExplode DeathTypes: ChronoDeath @@ -380,6 +616,39 @@ RequiresCondition: being-warped Modifier: 0 +^TemporalReinforcement: + GrantTimedCondition@TEMPINC: + Condition: warpin + Duration: 1000 + KillsSelf@TEMPINC: + GrantsCondition: warpout + RequiresCondition: !warpin + FireWarheadsOnDeath@TEMPINC: + Weapon: UnitExplodeWarpOut + EmptyWeapon: UnitExplodeWarpOut + RequiresCondition: warpout + TimedConditionBar@TEMPINC: + Condition: warpin + Color: FFFFFF + +^Blindable: + ExternalCondition@Blinded: + Condition: blinded + RevealsShroudMultiplier@Blinded: + RequiresCondition: blinded + Modifier: 0 + TimedConditionBar@Blinded: + Condition: blinded + Color: ffee00 + WithDecoration@Blinded: + Image: blinded + Sequence: idle + Palette: effect + Position: Top + ValidRelationships: Ally, Enemy, Neutral + Margin: 0, 8 + RequiresCondition: blinded + ^Suppressable: SpeedMultiplier@SUPPRESSION: RequiresCondition: suppression @@ -389,7 +658,7 @@ Modifier: 125 ExternalCondition@SUPPRESSION: Condition: suppression - WithColoredOverlay@SUPPRESSION: + WithPalettedOverlay@SUPPRESSION: RequiresCondition: suppression Palette: suppression TimedConditionBar@SUPPRESSION: @@ -403,43 +672,22 @@ Condition: atomized Color: ff0000 WithIdleOverlay@ATOMIZED: - Sequence: idle + Sequence: vehicle Image: atomize-overlay Palette: scrin RequiresCondition: atomized - ReloadDelayMultiplier@ATOMIZED: + IsDecoration: True + SpeedMultiplier@ATOMIZED: RequiresCondition: atomized - Modifier: 125 - ChangesHealthVersus@ATOMIZED1: - RequiresCondition: atomized == 1 - Step: -1300 - Delay: 25 - Versus: - None: 0 - Wood: 0 - Concrete: 0 - Light: 85 - Heavy: 100 - ChangesHealthVersus@ATOMIZED2: - RequiresCondition: atomized == 2 - Step: -2600 - Delay: 25 - Versus: - None: 0 - Wood: 0 - Concrete: 0 - Light: 85 - Heavy: 100 - ChangesHealthVersus@ATOMIZED3: - RequiresCondition: atomized >= 3 - Step: -3900 - Delay: 25 - Versus: - None: 0 - Wood: 0 - Concrete: 0 - Light: 85 - Heavy: 100 + Modifier: 66 + FirepowerMultiplier@ATOMIZED: + RequiresCondition: atomized + Modifier: 66 + +^AtomizableInfantry: + Inherits: ^Atomizable + WithIdleOverlay@ATOMIZED: + Sequence: infantry ^IonSurgable: TimedConditionBar@IONSURGE: @@ -447,17 +695,18 @@ Color: b070ff SpeedMultiplier@IONSURGE: RequiresCondition: ionsurge - Modifier: 160 + Modifier: 150 ExternalCondition@IONSURGE: Condition: ionsurge WithColoredOverlay@IONSURGE: RequiresCondition: ionsurge - Palette: ionsurge + Color: bd70ff23 WithIdleOverlay@IONSURGE: Sequence: vehicle Image: ionsurge-overlay Palette: ionsurgeoverlay RequiresCondition: ionsurge + IsDecoration: True Targetable@IONSURGE: TargetTypes: IonSurgable RequiresCondition: !ionsurge @@ -475,23 +724,47 @@ PowerMultiplier@POWERDRAIN: Modifier: 0 RequiresCondition: powerdrain + ExternalCondition@DiscPowerDrain: + Condition: discpowerdrain + Power@DiscPowerDrain: + Amount: -10000 + RequiresCondition: discpowerdrain WithColoredOverlay@POWERDRAIN: - RequiresCondition: powerdrain - Palette: disabled + RequiresCondition: powerdrain || discpowerdrain + Color: 000000b4 WithDecoration@POWERDRAIN: Image: poweroff Sequence: offline Palette: chrome - RequiresCondition: powerdrain + RequiresCondition: powerdrain || discpowerdrain Position: Center + ValidRelationships: Ally, Enemy, Neutral -^PowerDrainableRadar: - Inherits: ^PowerDrainable - GrantCondition@POWERDRAINJAMMED: - Condition: jammed - RequiresCondition: powerdrain +^ResourceDrainable: + Targetable@ResourceDrain: + TargetTypes: ResourceDrainable + ExternalCondition@ResourceDrain: + Condition: resourcedrain + CashTrickler@ResourceDrain: + Interval: 50 + Amount: -30 + RequiresCondition: resourcedrain + WithColoredOverlay@ResourceDrain: + RequiresCondition: resourcedrain + Color: ffff0022 + +^UpgradeOverlay: + WithDecoration@UpgradeOverlay: + Image: upgrade + Palette: chrome + Sequence: upgrade + Position: Center + RequiresCondition: upgrading + BlinkInterval: 5 + BlinkPattern: on + ValidRelationships: Ally, Neutral -^GDIUpgrade: +^GDIStrategyBuffs: GrantConditionOnPrerequisite@HOLD: Condition: hold Prerequisites: hold.strat @@ -530,13 +803,22 @@ Modifier: 95 FirepowerMultiplier@BOMBARD: RequiresCondition: bombard - Modifier: 105 + Modifier: 103 FirepowerMultiplier@BOMBARD2: RequiresCondition: bombard2 - Modifier: 105 + Modifier: 103 FirepowerMultiplier@BOMBARD3: RequiresCondition: bombard3 - Modifier: 105 + Modifier: 103 + ReloadDelayMultiplier@BOMBARD: + RequiresCondition: bombard + Modifier: 97 + ReloadDelayMultiplier@BOMBARD2: + RequiresCondition: bombard2 + Modifier: 97 + ReloadDelayMultiplier@BOMBARD3: + RequiresCondition: bombard3 + Modifier: 97 RangeMultiplier@SEEK: RequiresCondition: seek Modifier: 105 @@ -655,8 +937,8 @@ seek3 && bino: Off, On RequiresSelection: True -^GDIUpgradeAircraft: - Inherits: ^GDIUpgrade +^GDIStrategyBuffsAircraft: + Inherits: ^GDIStrategyBuffs WithDecoration@HOLD: -BlinkPatterns: BlinkPatterns: @@ -684,23 +966,29 @@ WithDecoration@SEEK: -BlinkPatterns: BlinkPatterns: - seek : Off, On + seek: Off, On WithDecoration@SEEK2: -BlinkPatterns: BlinkPatterns: - seek2 : Off, On + seek2: Off, On WithDecoration@SEEK3: -BlinkPatterns: BlinkPatterns: - seek3 : Off, On + seek3: Off, On ^HazmatUpgrade: GrantConditionOnPrerequisite@HAZMAT: Condition: hazmat-upgrade Prerequisites: hazmat.upgrade + GrantConditionOnPrerequisite@HAZMATZOCOM: + Condition: hazmat-upgrade + Prerequisites: player.zocom GrantConditionOnPrerequisite@HAZMATSOVIET: Condition: hazmatsoviet-upgrade Prerequisites: hazmatsoviet.upgrade + GrantConditionOnPrerequisite@HAZMATIRAQ: + Condition: hazmatsoviet-upgrade + Prerequisites: player.iraq GrantCondition@HAZMAT: Condition: hazmatsuits RequiresCondition: hazmat-upgrade && !hazmatsoviet-upgrade @@ -716,7 +1004,7 @@ RequiresSelection: True BlinkInterval: 64 BlinkPatterns: - bino : Off, On + bino: Off, On WithDecoration@HAZMATSOVIET: Image: pips Sequence: pip-hazmats @@ -726,27 +1014,69 @@ RequiresSelection: True BlinkInterval: 64 BlinkPatterns: - bino : Off, On + bino: Off, On GrantConditionOnTerrain@HAZMATSOVIET: - TerrainTypes: Rough, Beach, Ford, Ore, Gems, Tiberium, BlueTiberium + TerrainTypes: Rough, Beach, Ford, Ore, Gems, Tiberium, BlueTiberium, BlackTiberium Condition: onrough SpeedMultiplier@HAZMATSOVIET: RequiresCondition: hazmatsuits-soviet && onrough Modifier: 66 + Targetable@HAZMAT: + TargetTypes: Hazmat + RequiresCondition: hazmatsuits-soviet || hazmatsuits ^NodCyborgUpgrade: + GrantConditionOnPrerequisite@CYBORGARMOR: + Condition: cyborgarmor-upgrade + Prerequisites: cyborgarmor.upgrade + GrantConditionOnPrerequisite@CYBORGDAMAGE: + Condition: cyborgdmg-upgrade + Prerequisites: cyborgdmg.upgrade GrantConditionOnPrerequisite@CYBORGSPEED: Condition: cyborgspeed-upgrade Prerequisites: cyborgspeed.upgrade + DamageMultiplier@CYBORGARMOR: + RequiresCondition: cyborgarmor-upgrade + Modifier: 80 + FirepowerMultiplier@CYBORGDAMAGE: + RequiresCondition: cyborgdmg-upgrade + Modifier: 110 + ProductionTimeMultiplier@CYBORGPROD: + Multiplier: 90 + Prerequisites: cyborgprod.upgrade SpeedMultiplier@CYBORGSPEED: RequiresCondition: cyborgspeed-upgrade Modifier: 120 - GrantConditionOnPrerequisite@CYBORGARMOR: - Condition: cyborgarmor-upgrade - Prerequisites: cyborgarmor.upgrade - DamageMultiplier@CYBORGARMOR: + DamageTypeDamageMultiplier@CYBORGFLAKARMOR: RequiresCondition: cyborgarmor-upgrade - Modifier: 80 + DamageTypes: FlakVestMitigated + Modifier: 85 + DamageTypeDamageMultiplier@CYBORGFLAKARMORMINOR: + RequiresCondition: cyborgarmor-upgrade + DamageTypes: FlakVestMitigatedMinor + Modifier: 95 + +^CustodianBuff: + ExternalCondition@InspirationCmsr: + Condition: machine-learning + GainsExperienceMultiplier@MachineLearning1: + Modifier: 125 + RequiresCondition: machine-learning == 1 + GainsExperienceMultiplier@MachineLearning2: + Modifier: 150 + RequiresCondition: machine-learning >= 2 + WithIdleOverlay@MachineLearning1: + Image: custbuff + Sequence: idle-overlay1 + Palette: effect + RequiresCondition: machine-learning == 1 + IsDecoration: True + WithIdleOverlay@MachineLearning2: + Image: custbuff + Sequence: idle-overlay2 + Palette: effect + RequiresCondition: machine-learning >= 2 + IsDecoration: True ^BinoUpgrade: ExternalCondition@BINO: @@ -783,7 +1113,7 @@ Step: 500 Delay: 75 StartIfBelow: 100 - DamageCooldown: 200 + DamageCooldown: 100 RequiresCondition: hospitalheal ExternalCondition@HOSPITAL: Condition: hospitalheal @@ -809,16 +1139,60 @@ BlinkPatterns: damaged && hospitalheal: On, Off +^AuraRepairable: + ChangesHealth@MACS: + Step: 500 + Delay: 75 + StartIfBelow: 100 + DamageCooldown: 100 + RequiresCondition: macsrepair + ExternalCondition@MACS: + Condition: macsrepair + WithDecoration@MACSREPAIR: + Image: select + Palette: chrome + Sequence: repair-small + Position: Center + RequiresCondition: macsrepair && damaged + BlinkInterval: 32 + BlinkPattern: on, off + +^LeecherHealable: + ExternalCondition@LCHRHEAL: + Condition: lchr-healing + WithIdleOverlay@LCHRHEAL: + Image: lchrheal + Sequence: vehicle + Palette: scrin + RequiresCondition: lchr-healing && damaged + Offset: 0,0,400 + +^HealingCooldown: + GrantConditionOnHealingReceived@HEALINGCOOLDOWN: + Condition: heal-cooldown + RequiredHealing: 50000 + StackDuration: 1125 + MinimumHealing: 2500 + DamageTypes: DirectHeal + ShowSelectionBar: true + Targetable@HEAL: + RequiresCondition: !parachute && damaged && !being-warped && !heal-cooldown + ^IronCurtainable: - WithColoredOverlay@IRONCURTAIN: + WithPalettedOverlay@IRONCURTAIN: RequiresCondition: invulnerability + Palette: invuln DamageMultiplier@IRONCURTAIN: RequiresCondition: invulnerability Modifier: 0 - TimedConditionBar@IRONCURTAIN: + TimedConditionBarCA@IRONCURTAIN: Condition: invulnerability + ValidRelationships: Ally, Enemy, Neutral ExternalCondition@INVULNERABILITY: Condition: invulnerability + SpeedCapSpeedMultiplier@IRONCURTAIN: + RequiresCondition: invulnerability + MaxSpeed: 60 ^IronCurtainable-Kills: Inherits: ^IronCurtainable @@ -826,10 +1200,53 @@ DamageTypes: FireDeath RequiresCondition: invulnerability +^TankBusterVulnerability: + DamageTypeDamageMultiplier@TANKBUSTERVULN: + DamageTypes: TankBuster + Modifier: 133 + +^AirToGroundProtection: + DamageTypeDamageMultiplier@A2GPROTECTION: + DamageTypes: AirToGround + Modifier: 50 + +^GyroStabilizers: + WithPalettedOverlay@GYRO: + RequiresCondition: gyrostabilizers + Palette: gyro + RangeMultiplier@GYRO: + RequiresCondition: gyrostabilizers + Modifier: 133 + ReloadDelayMultiplier@GYRO: + RequiresCondition: gyrostabilizers + Modifier: 133 + TimedConditionBar@GYRO: + Condition: gyrostabilizers + ExternalCondition@GYRO: + Condition: gyrostabilizers + GrantTimedConditionOnDeploy@GYRO: + DeployedCondition: gyrostabilizers + CooldownTicks: 1500 + DeployedTicks: 500 + StartsFullyCharged: true + ChargingColor: 808000 + DischargingColor: ffff00 + ShowSelectionBarWhenFull: false + DeploySound: gyrostabilizers.aud + RequiresCondition: gyro-upgrade + Instant: true + GrantConditionOnPrerequisite@GYRO: + Condition: gyro-upgrade + Prerequisites: gyro.upgrade + WithFlashEffect@GYRO: + Color: ffffff + Interval: 5000 + RequiresCondition: gyrostabilizers + ^Irradiatable: - WithColoredOverlay@IRRADIATABLE: - Palette: irrad + WithPalettedOverlay@IRRADIATABLE: RequiresCondition: irradiated + Palette: irrad TimedConditionBar@IRRADIATABLE: Condition: irradiated Color: 88DD00 @@ -838,11 +1255,56 @@ PeriodicExplosion@IRRADIATED: Weapon: IrradiatedUnit RequiresCondition: irradiated + FirepowerMultiplier@IRRADIATED: + RequiresCondition: irradiated + Modifier: 90 + DamageMultiplier@IRRADIATED: + Modifier: 110 + RequiresCondition: irradiated + +^AtomicAmmunition: + ExternalCondition@ATOMICAMMO: + Condition: atomic-ammo + WithRestartableIdleOverlay@ATOMICAMMO: + Sequence: idle + Image: atomshell + Palette: effect + RequiresCondition: atomic-ammo && has-atomic-ammo < 12 + Offset: 0,0,600 + IsDecoration: True + PlayOnce: True + FirepowerMultiplier@ATOMICAMMO: + RequiresCondition: has-atomic-ammo + Modifier: 180 + Targetable@ATOMICAMMO: + TargetTypes: AtomicAmmoTargetable + AmmoPool@ATOMICAMMO: + Armaments: primary + Ammo: 12 + InitialAmmo: 0 + AmmoCondition: has-atomic-ammo + WithAmmoPipsDecoration@ATOMICAMMO: + Position: BottomLeft + Margin: 4, 3 + PipCount: 6 + ValidRelationships: Ally, Enemy, Neutral + RequiresSelection: false + RequiresCondition: has-atomic-ammo + AmmoPools: primary + ReloadAmmoPool@ATOMICAMMO: + Count: 12 + Delay: 1 + RequiresCondition: atomic-ammo && has-atomic-ammo < 12 + ReloadAmmoPoolCA@ATOMICAMMODECAY: + Count: -12 + Delay: 3000 + RequiresCondition: has-atomic-ammo + ShowSelectionBar: false ^ForceShieldable: - WithColoredOverlay@FS: - Palette: forces + WithPalettedOverlay@FS: RequiresCondition: forceshield && !invulnerability + Palette: forces DamageMultiplier@FS: RequiresCondition: forceshield Modifier: 0 @@ -858,7 +1320,7 @@ ^EmpDisable: WithColoredOverlay@EMPDISABLE: RequiresCondition: empdisable - Palette: disabled + Color: 000000b4 TimedConditionBar@EMPDISABLE: Condition: empdisable Color: FFFFFF @@ -866,6 +1328,7 @@ Sequence: emp-overlay Palette: tseffect RequiresCondition: empdisable + IsDecoration: True PowerMultiplier@EMPDISABLE: RequiresCondition: empdisable Modifier: 0 @@ -874,28 +1337,31 @@ ^EmpVisualEffect: WithColoredOverlay@EMPDISABLE: - Palette: disabled + Color: 000000b4 WithIdleOverlay@EMPDISABLE: Sequence: emp-overlay Palette: tseffect + IsDecoration: True ^NaniteRepair: ChangesHealth@NREPAIR: - PercentageStep: 3 - Delay: 30 + PercentageStep: 5 + Delay: 25 StartIfBelow: 100 DamageCooldown: 0 RequiresCondition: nrepair - WithColoredOverlay@NREPAIR: + WithPalettedOverlay@NREPAIR: RequiresCondition: nrepair && damaged && !(empdisable || invulnerability || invisibility) Palette: nrepair TimedConditionBar@NREPAIR: Condition: nrepair Color: 25cde999 WithIdleOverlay@NREPAIR: - Sequence: emp-overlay - Palette: tseffect + Image: nrepair-overlay + Sequence: idle + Palette: effect RequiresCondition: nrepair && damaged + IsDecoration: True WithDecoration@NREPAIR: Image: select Palette: chrome @@ -913,6 +1379,7 @@ Image: nshield-overlay Palette: effect RequiresCondition: nshield && !(empdisable || invulnerability || invisibility) + IsDecoration: True ExternalCondition@NSHIELD: Condition: nshield DamageMultiplier@NSHIELD: @@ -927,8 +1394,9 @@ HpPerStep: 1000 Interval: 7 StartRepairingNotification: Repairing + StartRepairingTextNotification: Repairing. FinishRepairingNotification: UnitRepaired - PlayerExperience: 15 + FinishRepairingTextNotification: Unit repaired. RequiresCondition: aircraft-repair && !forceshield && !invulnerability && !being-warped WithDecoration@AIRCRAFTREPAIR: Image: select @@ -942,82 +1410,103 @@ ValidRelationships: Ally, Neutral ^AffectedByDriverKill: - GrantConditionIfOwnerIsNeutral: + GrantConditionIfOwnerIsNeutral@DRIVER_DEAD: Condition: driver-dead Capturable@DRIVER_DEAD: Types: driverless_vehicle RequiresCondition: driver-dead - ValidRelationships: Neutral CancelActivity: true ChangesHealth@DRIVER_DEAD: PercentageStep: -1 - Delay: 30 + Delay: 50 StartIfBelow: 101 DamageCooldown: 0 RequiresCondition: driver-dead CaptureManager: Targetable@DRIVERKILL: TargetTypes: DriverKill - RequiresCondition: !driver-dead + RequiresCondition: !driver-dead && !invulnerability Targetable@DRIVERKILLLOWHP: TargetTypes: DriverKillLow - RequiresCondition: !driver-dead && target-lowhp - GrantConditionOnDamageState@DRIVERKILLLOWHP: - Condition: target-lowhp + RequiresCondition: !driver-dead && hp-below-50-perc && !invulnerability + GrantConditionOnDamageState@DriverKillLessThan50: + Condition: hp-below-50-perc ValidDamageStates: Heavy, Critical Targetable@AICAPTURE: TargetTypes: NoCrew RequiresCondition: driver-dead + TooltipDescription@DRIVER_DEAD: + Description: Crewless. Capturable by infantry. + RequiresCondition: driver-dead ^CanCaptureDriverlessVehicles: Captures@DRIVER_KILL: CaptureTypes: driverless_vehicle + ValidRelationships: Neutral CaptureManager: -^GreenFlash: - ExternalCondition@GHIGH: - Condition: greenhighlight - WithColoredOverlay@GHIGH: - RequiresCondition: greenhighlight - Palette: greenhighlight - -^RedFlash: - ExternalCondition@RHIGH: - Condition: redhighlight - WithColoredOverlay@RHIGH: - RequiresCondition: redhighlight - Palette: redhighlight - -^WhiteFlash: - ExternalCondition@HIGH: - Condition: highlight - WithColoredOverlay@HIGH: - RequiresCondition: highlight - Palette: highlight - ^Cloakable: - Cloak@EXTERNALCLOAK: - RequiresCondition: invisibility && !cloak-force-disabled - InitialDelay: 0 - CloakDelay: 150 - IsPlayerPalette: true - Palette: cloakgreen - CloakSound: cloak5.aud - UncloakSound: appear1.aud - UncloakOn: Attack, Unload, Infiltrate, Demolish, Dock, Damage, Heal, SelfHeal - TimedConditionBar@STEALTHGEN: + ExternalCondition@INVIS: Condition: invisibility - Color: 33ff33 - ExternalCondition@CLOAKGENERATOR: + GrantCondition@INVIS: Condition: invisibility + RequiresCondition: tibstealth || sgencloak + TimedConditionBar@TIBSTEALTH: + Condition: tibstealth + Color: 66dd00 + Cloak@TIBSTEALTH: + RequiresCondition: tibstealth && !cloak-force-disabled + InitialDelay: 0 + CloakDelay: 25 + IsPlayerPalette: false + CloakStyle: Palette + CloakedPalette: cloakgreen + CloakSound: cloak5md.aud + UncloakSound: appear1md.aud + UncloakOn: Attack, Unload, Infiltrate, Demolish + DamageMultiplier@TIBSTEALTH: + Modifier: 90 + RequiresCondition: tibstealth + ExternalCondition@TIBSTEALTH: + Condition: tibstealth + Cloak@SGENCLOAK: + RequiresCondition: sgencloak && !cloak-force-disabled + PauseOnCondition: tibstealth + InitialDelay: 0 + CloakDelay: 150 + IsPlayerPalette: false + CloakStyle: Palette + CloakedPalette: cloak + CloakSound: cloak5md.aud + UncloakSound: appear1md.aud + UncloakOn: Attack, Unload, Infiltrate, Demolish, Damage, Heal + ExternalCondition@SGENCLOAK: + Condition: sgencloak + ExternalCondition@CloakForceDisabled: + Condition: cloak-force-disabled + WithColoredSelectionBox@INVIS: + RequiresCondition: invisibility + ColorSource: Player + +^CrateCloak: + Cloak@CRATE-CLOAK: + InitialDelay: 90 + CloakDelay: 90 + CloakSound: trans1.aud + UncloakSound: appear1md.aud + CloakStyle: Palette + CloakedPalette: cloak + IsPlayerPalette: false + RequiresCondition: (crate-cloak) && !(cloak-force-disabled || invisibility) + UncloakOn: Attack, Unload, Infiltrate, Demolish, Damage, Heal + TimedConditionBar@CRATE-CLOAK: + Condition: crate-cloak + Color: 606060 ExternalCondition@CRATE-CLOAK: Condition: crate-cloak GrantConditionOnDamageState@UNCLOAK: Condition: cloak-force-disabled ValidDamageStates: Heavy, Critical - WithColoredOverlay@STEALTHGEN: - RequiresCondition: invisibility - Palette: cloakgreen ^Chillable: TimedConditionBar@chilled: @@ -1029,65 +1518,101 @@ Modifier: 75 RequiresCondition: chilled == 1 DamageMultiplier@chilled1: - Modifier: 115 + Modifier: 110 RequiresCondition: chilled == 1 WithColoredOverlay@chilled1: - Palette: cold1 + Color: 51aeda20 RequiresCondition: chilled == 1 SpeedMultiplier@chilled2: - Modifier: 58 + Modifier: 65 RequiresCondition: chilled == 2 DamageMultiplier@chilled2: - Modifier: 130 + Modifier: 120 RequiresCondition: chilled == 2 WithColoredOverlay@chilled2: - Palette: cold2 + Color: 51aeda32 RequiresCondition: chilled == 2 SpeedMultiplier@chilled3: - Modifier: 47 + Modifier: 57 RequiresCondition: chilled == 3 DamageMultiplier@chilled3: - Modifier: 145 + Modifier: 130 RequiresCondition: chilled == 3 WithColoredOverlay@chilled3: - Palette: cold3 + Color: 51aeda44 RequiresCondition: chilled == 3 SpeedMultiplier@chilled4: - Modifier: 40 + Modifier: 50 RequiresCondition: chilled == 4 DamageMultiplier@chilled4: - Modifier: 160 + Modifier: 140 RequiresCondition: chilled == 4 WithColoredOverlay@chilled4: - Palette: cold4 + Color: 51aeda56 RequiresCondition: chilled == 4 SpeedMultiplier@chilled5: - Modifier: 35 + Modifier: 44 RequiresCondition: chilled == 5 DamageMultiplier@chilled5: - Modifier: 175 + Modifier: 150 RequiresCondition: chilled == 5 WithColoredOverlay@chilled5: - Palette: cold5 + Color: 51aeda68 RequiresCondition: chilled == 5 SpeedMultiplier@chilled6: - Modifier: 30 - RequiresCondition: chilled > 5 + Modifier: 41 + RequiresCondition: chilled == 6 DamageMultiplier@chilled6: - Modifier: 200 - RequiresCondition: chilled > 5 + Modifier: 160 + RequiresCondition: chilled == 6 WithColoredOverlay@chilled6: - Palette: cold6 - RequiresCondition: chilled > 5 + Color: 51aeda7a + RequiresCondition: chilled == 6 + SpeedMultiplier@chilled7: + Modifier: 38 + RequiresCondition: chilled == 7 + DamageMultiplier@chilled7: + Modifier: 170 + RequiresCondition: chilled == 7 + WithColoredOverlay@chilled7: + Color: 51aeda8c + RequiresCondition: chilled == 7 + SpeedMultiplier@chilled8: + Modifier: 35 + RequiresCondition: chilled == 8 + DamageMultiplier@chilled8: + Modifier: 180 + RequiresCondition: chilled == 8 + WithColoredOverlay@chilled8: + Color: 51aeda9e + RequiresCondition: chilled == 8 + SpeedMultiplier@chilled9: + Modifier: 32 + RequiresCondition: chilled == 9 + DamageMultiplier@chilled9: + Modifier: 190 + RequiresCondition: chilled == 9 + WithColoredOverlay@chilled9: + Color: 51aedab0 + RequiresCondition: chilled == 9 + SpeedMultiplier@chilled10: + Modifier: 30 + RequiresCondition: chilled >= 10 + DamageMultiplier@chilled10: + Modifier: 200 + RequiresCondition: chilled >= 10 + WithColoredOverlay@chilled10: + Color: 51aedac2 + RequiresCondition: chilled >= 10 ^Slowable: ExternalCondition@slowed: Condition: slowed SpeedMultiplier@slowed1: - Modifier: 70 + Modifier: 75 RequiresCondition: slowed == 1 SpeedMultiplier@slowed2: - Modifier: 40 + Modifier: 50 RequiresCondition: slowed > 1 ^Concussion: @@ -1097,16 +1622,16 @@ ExternalCondition@concussion: Condition: concussion SpeedMultiplier@concussion: - Modifier: 55 + Modifier: 75 RequiresCondition: concussion ReloadDelayMultiplier@concussion: - Modifier: 150 + Modifier: 200 RequiresCondition: concussion WithDecoration@Concussion: Image: pips Sequence: pip-conc Palette: chrome - Position: TopCenter + Position: Top RequiresCondition: concussion BlinkInterval: 16 BlinkPatterns: @@ -1114,7 +1639,73 @@ RequiresSelection: False ValidRelationships: Ally, Neutral, Enemy -^HarvesterBalancer: +^ReaperSnareable: + WithIdleOverlay@ReaperSnare: + Sequence: infantry + Image: reap-snareoverlay + Palette: effect + RequiresCondition: reapersnare + IsDecoration: True + ExternalCondition@ReaperSnare: + Condition: reapersnare + SpeedMultiplier@ReaperSnare: + Modifier: 0 + RequiresCondition: reapersnare + +^HarvesterBase: + Inherits: ^Vehicle-NOUPG + Inherits@SELECTION: ^SelectableEconomicUnit + Inherits@A2GPROTECTION: ^AirToGroundProtection + Inherits@EconomyPolicyDiscount: ^EconomyPolicyDiscount + Inherits@EconomyPolicyDurability: ^EconomyPolicyDurability + Inherits@HeavyArmor: ^HeavyArmor + Inherits@NodCovenantTarget: ^NodCovenantTarget + TooltipExtras: + Weaknesses: • Unarmed\n• Resistant to mind control + Valued: + Cost: 1400 + Tooltip: + GenericName: Harvester + Health: + HP: 75000 + Mobile: + Speed: 72 + TurnSpeed: 24 + Locomotor: heavywheeled + RevealsShroud: + Range: 4c0 + SpawnRandomActorOnDeath: + Actors: c1,c7,c10 + Probability: 5 + RequiresCondition: !being-warped + ChangesHealth@MINIDRONE: + Step: 2250 + DamageTypeDamageMultiplier@A2GPROTECTION: + Modifier: 60 + Harvester: + Resources: Tiberium, BlueTiberium, BlackTiberium, Ore, Gems + BaleUnloadDelay: 1 + BaleLoadDelay: 4 + SearchFromProcRadius: 15 + SearchFromHarvesterRadius: 8 + HarvestFacings: 8 + EmptyCondition: no-ore + DockClientManager: + WithStoresResourcesPipsDecoration: + Position: BottomLeft + Margin: 4, 3 + RequiresSelection: true + PipCount: 6 + ResourceSequences: + Ore: pip-yellow + Gems: pip-red + Tiberium: pip-green + BlueTiberium: pip-blue + BlackTiberium: pip-green + StoresResources: + Capacity: 26 + Resources: Tiberium, BlueTiberium, BlackTiberium, Ore, Gems + TransferResourcesOnTransform: GrantConditionOnPrerequisite@HARVBALANCE: Condition: global-balancedharvesting Prerequisites: global.balancedharvesting @@ -1124,58 +1715,165 @@ HarvesterBalancer: Condition: harv-balance RequiresCondition: global-balancedharvesting + NotificationOnDamage: + Type: Harvester + Notification: HarvesterAttack + TextNotification: Harvester under attack. + MinimumDamage: 500 + GrantConditionOnTerrain@Tiberium: + Condition: ontib + TerrainTypes: Tiberium + GrantConditionOnTerrain@Ore: + Condition: onore + TerrainTypes: Ore + FireWarheadsOnDeath@Ore: + RequiresCondition: !no-ore && onore && !being-warped + Weapon: OreExplosion + FireWarheadsOnDeath@Tib: + RequiresCondition: !no-ore && ontib && !being-warped + Weapon: TibExplosion + -Crushable: + GrantConditionOnPrerequisite@GSHIELD: + Condition: pointdef-upgrade + Prerequisites: pointdef.upgrade + TimedDamageMultiplier@GSHIELD: + ActiveCondition: gshield + ChargingColor: 008888 + DrainingColor: 00ffff + Modifier: 25 + Duration: 75 + ChargeTime: 375 + ActivateSound: gshieldup.aud + DeactivateSound: gshielddown.aud + RequiresCondition: pointdef-upgrade + WithIdleOverlay@NSHIELD: + RequiresCondition: (nshield || gshield) && !(empdisable || invulnerability || invisibility) + Targetable@MindControlResistant: + TargetTypes: MindControlResistant -^CrateCloak: - Cloak@CRATE-CLOAK: - InitialDelay: 90 - CloakDelay: 90 - CloakSound: trans1.aud - UncloakSound: appear1.aud - Palette: cloak - IsPlayerPalette: false - RequiresCondition: (crate-cloak) && !(cloak-force-disabled || invisibility) - UncloakOn: Attack, Unload, Infiltrate, Demolish, Dock, Damage, Heal, SelfHeal - TimedConditionBar@CRATE-CLOAK: - Condition: crate-cloak - Color: 606060 - ExternalCondition@CRATE-CLOAK: - Condition: crate-cloak - GrantConditionOnDamageState@UNCLOAK: - Condition: cloak-force-disabled - ValidDamageStates: Heavy, Critical - -^GpsScramble: - RangeMultiplier@GPSSCRAMBLE: +^Veilable: + RangeMultiplier@VEILED: + Modifier: 80 + RequiresCondition: veiled && !gapveiled + RangeMultiplier@GAPVEILED: Modifier: 60 - RequiresCondition: gpsscramble - ExternalCondition@GPSSCRAMBLE: - Condition: gpsscramble + RequiresCondition: gapveiled + RevealsShroudMultiplier@GAPVEILED: + Modifier: 80 + RequiresCondition: gapveiled + ExternalCondition@VEILED: + Condition: veiled + ExternalCondition@GAPVEILED: + Condition: gapveiled + WithIdleOverlay@VEILED: + Sequence: vehicle + Image: veildebuff + Palette: effect-ignore-lighting-alpha35 + RequiresCondition: veiled || gapveiled + IsDecoration: True + +^VeilableInfantry: + Inherits: ^Veilable + WithIdleOverlay@VEILED: + Sequence: infantry + +^WeaponJammable: + ReloadDelayMultiplier@WEAPJAMMED: + RequiresCondition: weapjammed + Modifier: 125 + FirepowerMultiplier@WEAPJAMMED: + RequiresCondition: weapjammed + Modifier: 90 + ExternalCondition@WEAPJAMMED: + Condition: weapjammed + WithIdleOverlay@WEAPJAMMED: + Sequence: idle + Image: jamdebuff + RequiresCondition: weapjammed + IsDecoration: True + +^KillZoneTargetable: + DamageMultiplier@KillZone: + Modifier: 125 + RequiresCondition: killzone + ExternalCondition@KillZone: + Condition: killzone + +^ZoneDefenderShieldable: + ExternalCondition@ZoneDefenderShield: + Condition: zdef-shield + WithColoredOverlay@ZoneDefenderShield: + Color: 00ffff10 + RequiresCondition: zdef-shield + FlatHealthDamageMultiplier@ZoneDefenderShield1: + HP: 1250 + RequiresCondition: zdef-shield == 1 + FlatHealthDamageMultiplier@ZoneDefenderShield2: + HP: 2500 + RequiresCondition: zdef-shield == 2 + FlatHealthDamageMultiplier@ZoneDefenderShield3: + HP: 3750 + RequiresCondition: zdef-shield == 3 + FlatHealthDamageMultiplier@ZoneDefenderShield4: + HP: 5000 + RequiresCondition: zdef-shield == 4 + FlatHealthDamageMultiplier@ZoneDefenderShield5: + HP: 6250 + RequiresCondition: zdef-shield == 5 + FlatHealthDamageMultiplier@ZoneDefenderShield6: + HP: 7500 + RequiresCondition: zdef-shield >= 6 + WithIdleOverlay@ZoneDefenderShield: + Sequence: idle + Image: zdefshield-overlay + Palette: tdeffect + RequiresCondition: zdef-shield + IsDecoration: True ^C4Plantable: DelayedWeaponAttachable@C4: Type: c4 Condition: c4 ProgressBarColor: FF000080 - Targetable@c4: + RequiresCondition: !invulnerability + DelayedWeaponAttachable@C4Seal: + Type: c4seal + Condition: c4seal + ProgressBarColor: FF000080 + RequiresCondition: !invulnerability + Targetable@C4Plantable: + TargetTypes: C4Plantable + Targetable@C4Attached: TargetTypes: C4Attached - RequiresCondition: c4 + RequiresCondition: c4 || c4seal WithDecoration@c4: Image: c4 Sequence: c4 Position: CenterCenter - RequiresCondition: c4 + RequiresCondition: c4 || c4seal RequiresSelection: False ValidRelationships: Ally, Neutral, Enemy - ExternalCondition@detachable: - Condition: detach - WithColoredOverlay@detach: - Palette: moveflash - RequiresCondition: detach AmbientSound@c4: SoundFiles: icoltima.aud, icoltimb.aud, icoltimc.aud Delay: 5 Interval: 5 RequiresCondition: c4 + AmbientSound@c4seal: + SoundFiles: sealc4tick1.aud, sealc4tick2.aud + Delay: 9 + Interval: 9 + RequiresCondition: c4seal + ExternalCondition@SealC4Progress: + Condition: c4seal-preparing + GrantChargingCondition@SealC4Progress: + MaxCharge: 100 # 4x the reload delay of PrepareC4Seal which grants a condition for 25 ticks, so after 4 prepares the C4 will be planted + Condition: c4seal-prepared + ShowSelectionBarWhenEmpty: false + ShowSelectionBarWhenFull: false + ChargingColor: ff0000 + RequiresCondition: c4seal-preparing + DummyConditionConsumer@SealC4Progress: + Condition: c4seal-prepared ^TNTPlantable: DelayedWeaponAttachable@TNT: @@ -1183,7 +1881,9 @@ Condition: tnt ProgressBarColor: FF000080 AttachLimit: 10 - Targetable@tnt: + Targetable@TNTPlantable: + TargetTypes: TNTPlantable + Targetable@TNTAttached: TargetTypes: TNTAttached RequiresCondition: tnt WithDecoration@tnt: @@ -1193,11 +1893,6 @@ RequiresCondition: tnt RequiresSelection: False ValidRelationships: Ally, Neutral, Enemy - ExternalCondition@detachable: - Condition: detach - WithColoredOverlay@detach: - Palette: moveflash - RequiresCondition: detach AmbientSound@tnt: SoundFiles: icraloop.aud Delay: 6 @@ -1224,31 +1919,37 @@ RequiresCondition: tnt >= 6 Position: CenterCenter -^MindControllableBase: - MindControllable: - ControlledConditions: - mast: mindcontrolled - hack: hacked - RevokingConditions: - hack: restoring - ^MindControllable: - Inherits: ^MindControllableBase + MindControllable@MINDCONTROL: + ControlType: MindControl + ControlledCondition: mindcontrolled Targetable@MINDCONTROL: TargetTypes: MindControllable - RequiresCondition: !mindcontrolled && !hacked && !restoring + RequiresCondition: !mindcontrolled + MindControllableProgressBar@MINDCONTROL: + ControlTypes: MindControl + Color: ff00ff + RequiresCondition: !mindcontrolled WithIdleOverlay@MINDCONTROL: Sequence: mind-overlay Palette: scrin RequiresCondition: mindcontrolled Offset: 0,0,300 + IsDecoration: True + RejectsOrders@MindControlled: + Reject: Unload + RequiresCondition: mindcontrolled ^Hackable: - Inherits: ^MindControllableBase + MindControllable@HACKABLE: + ControlType: Hack + ControlledCondition: hacked + RevokingCondition: restoring Targetable@HACKABLE: TargetTypes: Hackable - RequiresCondition: !mindcontrolled && !hacked + RequiresCondition: !hacked MindControllableProgressBar@HACKABLE: + ControlTypes: Hack Color: 1ce312 RequiresCondition: !hacked WithDecoration@HACKED: @@ -1265,16 +1966,87 @@ Position: Center Palette: effect ValidRelationships: Ally, Neutral, Enemy + PowerMultiplier@HACKED: + RequiresCondition: hacked + Modifier: 0 ^HackableOverloadable: Inherits: ^Hackable WithDecoration@HACKED: + Sequence: hacked-overloading + WithDecoration@OVERLOADING: + Image: hacked Sequence: overloading + RequiresCondition: overloading + Position: Center + Palette: effect + ValidRelationships: Ally, Neutral, Enemy ChangesHealth@HACKED: - Step: -2000 + Step: -1500 StartIfBelow: 101 - Delay: 25 - RequiresCondition: hacked + Delay: 20 + RequiresCondition: (hacked && !restoring) || overloading + ExternalCondition@OVERLOADING: + Condition: overloading + PowerMultiplier@OVERLOADING: + Modifier: 0 + RequiresCondition: overloading + WithPalettedOverlay@OVERLOADING: + RequiresCondition: overloading + Palette: overload + +^TechLockable: + InfiltrateForTimedCondition@TechLock: + Condition: tech-locked + Duration: 750 + Types: TechLockInfiltrate + InfiltrationNotification: TechnologyLocked + InfiltratedNotification: OurTechnologyLocked + ShowSelectionBar: true + PlayerExperience: 15 + WithDecoration@TechLock: + Image: hacked + Sequence: techlocked + RequiresCondition: tech-locked && !hacked + Position: Center + Palette: effect + ValidRelationships: Ally, Neutral, Enemy + Targetable@TechLock: + RequiresCondition: !being-warped + TargetTypes: TechLockInfiltrate + +^SpyIFVInfiltratable: + ExternalCondition@SpyIFVCharge: + Condition: spy-ifv-charging + GrantPeriodicCondition@SpyIFVCharge: + CooldownDuration: 300 + CooldownColor: 0000ff + ActiveDuration: 2 + Condition: spy-ifv-charged + RequiresCondition: spy-ifv-charging + ShowSelectionBar: true + ShowSelectionBarWhenEmpty: false + ResetTimeOnReenable: true + Targetable@SpyIFVInfiltrate: + TargetTypes: SpyIFVInfiltratable + RequiresCondition: spy-ifv-charged + +^InfiltrateForSupportPower: + Targetable@GrantSupportPowerInfiltrate: + RequiresCondition: !being-warped && !spy-infiltrate-cooldown + TargetTypes: GrantSupportPowerInfiltrate + InfiltrateToCreateProxyActor@SpySupportPower: + Types: GrantSupportPowerInfiltrate + InfiltrationNotification: BuildingInfiltrated + InfiltratedNotification: BaseAttack + PlayerExperience: 15 + InfiltrateForTimedCondition@SpySupportPower: + Condition: spy-infiltrate-cooldown + Duration: 1500 + Types: GrantSupportPowerInfiltrate + ShowSelectionBar: true + SelectionBarColor: aaaaaa + ApplyToAllOfType: true ^GeneticallyMutatable: ExternalCondition@GMUT: @@ -1286,22 +2058,100 @@ SpawnAfterDefeat: false SkipMakeAnimations: false RequiresCondition: geneticmutation + Targetable@GMUT: + TargetTypes: GeneticallyMutatable + RequiresCondition: geneticmutation ^MiniDroneAttachable: - InfiltrateToAttach@MINIDRONE: - Actor: mdrn.attached - Types: MiniDroneAttachable Targetable@MINIDRONE: TargetTypes: MiniDroneAttachable RequiresCondition: !mdrn-attached ChangesHealth@MINIDRONE: - PercentageStep: 1 + Step: 1000 Delay: 25 StartIfBelow: 100 - DamageCooldown: 200 + DamageCooldown: 100 RequiresCondition: mdrn-attached - ExternalCondition@MINIDRONE: - Condition: mdrn-attached + AttachableTo@MINIDRONE: + Type: MiniDrone + Limit: 1 + LimitCondition: mdrn-attached + +^ObserverAttachable: + GrantTimedCondition@ObserverIcon: + Condition: observer-icon-hidden + Duration: 750 + RequiresCondition: observer-attached + WithDecoration@ObserverIconWatched: + Image: watched + Sequence: idle + Palette: scrineffect + Position: Top + ValidRelationships: Ally + Margin: 0, 8 + RequiresCondition: observer-attached && !observer-icon-hidden + WithDecoration@ObserverIconWatcher: + Image: watched + Sequence: idle + Palette: scrineffect + Position: Top + ValidRelationships: Enemy, Neutral + Margin: 0, 8 + RequiresCondition: observer-attached + +^WatcherParasiteAttachable: + Inherits@ObserverAttachable: ^ObserverAttachable + Targetable@WatcherParasite: + TargetTypes: WatcherParasiteAttachable + RequiresCondition: !observer-attached + AttachableTo@WatcherParasite: + Type: WatcherParasite + Limit: 1 + AttachedCondition: observer-attached + +^ShadowBeaconAttachable: + Inherits@ObserverAttachable: ^ObserverAttachable + Targetable@ShadowBeacon: + TargetTypes: ShadowBeaconAttachable + RequiresCondition: !observer-attached + AttachableTo@ShadowBeacon: + Type: ShadowBeacon + Limit: 1 + AttachedCondition: observer-attached + +^TargetPaintable: + ExternalCondition@PaintedTarget: + Condition: painted-target + DamageMultiplier@PaintedTarget: + Modifier: 110 + RequiresCondition: painted-target + WithDecoration@PaintedTarget: + Image: targetpainter + Sequence: idle + Palette: effect + Position: Top + ValidRelationships: Ally, Enemy, Neutral + Margin: 0, 8 + RequiresCondition: painted-target + WithFlashEffect@PaintedTarget: + Color: ff0000 + Interval: 25 + RequiresCondition: painted-target + +^UndermineFoundation: + ExternalCondition@UndermineFoundation: + Condition: undermine-foundation + DamageMultiplier@UndermineFoundation: + Modifier: 160 + RequiresCondition: undermine-foundation + WithDecoration@UndermineFoundation: + Image: underminefoundation + Sequence: idle + Palette: effect + Position: Top + ValidRelationships: Ally, Enemy, Neutral + Margin: 0, 8 + RequiresCondition: undermine-foundation ^HoverTrail: LeavesTrails: @@ -1316,18 +2166,15 @@ AutoTarget: AttackAnythingCondition: stance-attackanything AutoTargetPriority@DEFAULT: - RequiresCondition: !stance-attackanything ValidTargets: Infantry, Vehicle, Water, Underwater, Defense - InvalidTargets: NoAutoTarget, WaterStructure + InvalidTargets: NoAutoTarget, WaterStructure, AntiAirDefense AutoTargetPriority@ATTACKANYTHING: RequiresCondition: stance-attackanything - ValidTargets: Infantry, Vehicle, Water, Underwater, Structure, Defense, Mine + ValidTargets: Structure, AntiAirDefense, Mine InvalidTargets: NoAutoTarget ^AutoTargetGroundAssaultMove: Inherits: ^AutoTargetGround - AutoTargetPriority@DEFAULT: - RequiresCondition: !stance-attackanything && !assault-move AutoTargetPriority@ATTACKANYTHING: RequiresCondition: stance-attackanything || assault-move AttackMove: @@ -1336,13 +2183,14 @@ ^AutoTargetGroundAssaultMovePrioritizeVehicles: Inherits: ^AutoTargetGroundAssaultMove AutoTargetPriority@DEFAULTVEH: - RequiresCondition: !stance-attackanything && !assault-move ValidTargets: Vehicle, Ship InvalidTargets: NoAutoTarget Priority: 10 - AutoTargetPriority@ATTACKANYTHINGVEH: - RequiresCondition: stance-attackanything || assault-move - ValidTargets: Vehicle, Ship + +^AutoTargetGroundAssaultMovePrioritizeInfantry: + Inherits: ^AutoTargetGroundAssaultMove + AutoTargetPriority@DEFAULTINF: + ValidTargets: Infantry InvalidTargets: NoAutoTarget Priority: 10 @@ -1355,12 +2203,7 @@ AutoTarget: AutoTargetPriority@DEFAULT: ValidTargets: Air, AirSmall - InvalidTargets: NoAutoTarget, AirLowPriority - Priority: 10 - AutoTargetPriority@DEFAULTLOW: - ValidTargets: AirLowPriority InvalidTargets: NoAutoTarget - Priority: 0 ^AutoTargetAirICBM: Inherits: ^AutoTargetAir @@ -1371,45 +2214,35 @@ AutoTarget: AttackAnythingCondition: stance-attackanything AutoTargetPriority@DEFAULT: - RequiresCondition: !stance-attackanything ValidTargets: Infantry, Vehicle, Water, Underwater, Air, AirSmall, Defense - InvalidTargets: NoAutoTarget, WaterStructure, AirLowPriority + InvalidTargets: NoAutoTarget, WaterStructure, AntiAirDefense AutoTargetPriority@ATTACKANYTHING: RequiresCondition: stance-attackanything - ValidTargets: Infantry, Vehicle, Water, Underwater, Air, AirSmall, Structure, Defense + ValidTargets: Structure, AntiAirDefense, Mine InvalidTargets: NoAutoTarget ^AutoTargetAllAssaultMove: Inherits: ^AutoTargetAll - AutoTargetPriority@DEFAULT: - RequiresCondition: !stance-attackanything && !assault-move AutoTargetPriority@ATTACKANYTHING: RequiresCondition: stance-attackanything || assault-move AttackMove: AssaultMoveCondition: assault-move -^AutoTargetAllAssaultMoveAntiAir: +^AutoTargetAllAssaultMovePrioritizeGround: Inherits: ^AutoTargetAllAssaultMove - AutoTargetPriority@DEFAULTAA: - RequiresCondition: !stance-attackanything && !assault-move - ValidTargets: Air, AirSmall - InvalidTargets: NoAutoTarget, AirLowPriority - Priority: 10 - AutoTargetPriority@ATTACKANYTHINGAA: - RequiresCondition: stance-attackanything || assault-move + AutoTargetPriority@DEFAULT: + ValidTargets: Infantry, Vehicle, Water, Underwater, Defense + AutoTargetPriority@DeprioritizedAir: ValidTargets: Air, AirSmall - InvalidTargets: NoAutoTarget, AirLowPriority - Priority: 10 - AutoTargetPriority@DEFAULTAALOW: - RequiresCondition: !stance-attackanything && !assault-move - ValidTargets: AirLowPriority InvalidTargets: NoAutoTarget Priority: 0 - AutoTargetPriority@ATTACKANYTHINGAALOW: - RequiresCondition: stance-attackanything || assault-move - ValidTargets: AirLowPriority + +^AutoTargetAllAssaultMovePrioritizeAir: + Inherits: ^AutoTargetAllAssaultMove + AutoTargetPriority@DEFAULTAA: + ValidTargets: Air, AirSmall InvalidTargets: NoAutoTarget - Priority: 0 + Priority: 10 ^AutoTargetAllNavalAssaultMove: Inherits: ^AutoTargetAllAssaultMove @@ -1420,19 +2253,127 @@ GrantConditionOnPrerequisite@GLOBALBOUNTY: Condition: global-bounty Prerequisites: global-bounty - GivesBounty: + GivesBountyCA: RequiresCondition: global-bounty + Percentage: 15 + BountyPoolType: FromLosses + +^EconomyPolicyDiscount: + ProductionCostMultiplier@EconomyPolicy1: + Multiplier: 85 + Prerequisites: economy.policy, influence.level1, !influence.level2 + ProductionCostMultiplier@EconomyPolicy2: + Multiplier: 75 + Prerequisites: economy.policy, influence.level2 + +^EconomyPolicyTimeReduction: + ProductionTimeMultiplier@EconomyPolicy1: + Multiplier: 85 + Prerequisites: economy.policy, influence.level1, !influence.level2 + ProductionTimeMultiplier@EconomyPolicy2: + Multiplier: 75 + Prerequisites: economy.policy, influence.level2 + +^EconomyPolicyMcvSpeedBonus: + SpeedMultiplier@EconomyPolicy2: + Modifier: 120 + RequiresCondition: economy-policy2 + GrantConditionOnPrerequisite@EconomyPolicy2: + Condition: economy-policy2 + Prerequisites: economy.policy, influence.level2 + +^EconomyPolicyDurability: + DamageMultiplier@EconomyPolicy3: + Modifier: 87 + RequiresCondition: economy-policy3 + GrantConditionOnPrerequisite@EconomyPolicy3: + Condition: economy-policy3 + Prerequisites: economy.policy, influence.level3 + +^DefensePolicyDamageReduction: + GrantConditionOnPrerequisite@DefensePolicy1: + Condition: defense-policy1 + Prerequisites: defense.policy, influence.level1 + GrantConditionOnPrerequisite@DefensePolicy2: + Condition: defense-policy2 + Prerequisites: defense.policy, influence.level2 + GrantConditionOnPrerequisite@DefensePolicy3: + Condition: defense-policy3 + Prerequisites: defense.policy, influence.level3 + DamageMultiplier@DefensePolicy1: + Modifier: 87 + RequiresCondition: defense-policy1 && !defense-policy2 + DamageMultiplier@DefensePolicy2: + Modifier: 77 + RequiresCondition: defense-policy2 + ChangesHealth@DefensePolicy2: + Step: 200 + StartIfBelow: 100 + Delay: 24 + DamageCooldown: 0 + RequiresCondition: defense-policy2 && being-repaired + RevealsShroudMultiplier@DefensePolicy3: + Modifier: 125 + RequiresCondition: defense-policy3 + +^DefensePolicyDamageBonus: + GrantConditionOnPrerequisite@DefensePolicy3: + Condition: defense-policy3 + Prerequisites: defense.policy, influence.level3 + FirepowerMultiplier@DefensePolicy3: + Modifier: 115 + RequiresCondition: defense-policy3 + +^DevelopmentPolicyVeterancyBonus: + GrantConditionOnPrerequisite@DevelopmentPolicy1: + Condition: development-policy1 + Prerequisites: development.policy, influence.level1, !influence.level2 + GrantConditionOnPrerequisite@DevelopmentPolicy2: + Condition: development-policy2 + Prerequisites: development.policy, influence.level2, !influence.level3 + GrantConditionOnPrerequisite@DevelopmentPolicy3: + Condition: development-policy3 + Prerequisites: development.policy, influence.level3 + GainsExperienceMultiplier@DevelopmentPolicy1: + Modifier: 120 + RequiresCondition: development-policy1 + GainsExperienceMultiplier@DevelopmentPolicy2: + Modifier: 140 + RequiresCondition: development-policy2 + GainsExperienceMultiplier@DevelopmentPolicy3: + Modifier: 160 + RequiresCondition: development-policy3 -^ProductionEfficiencyBoost: - ProductionTimeMultiplier@IndustrialPlant: +^DevelopmentPolicyDiscount: + ProductionCostMultiplier@DevelopmentPolicy2: Multiplier: 90 - Prerequisites: indp, !indplowpower - ProductionCostMultiplier@IndustrialPlantLevel1: + Prerequisites: development.policy, influence.level2 + +^SovietT4Boost: + ProductionTimeMultiplier@IndustrialPlantBoost: Multiplier: 95 - Prerequisites: indp, !indp.upgrade, !indplowpower - ProductionCostMultiplier@IndustrialPlantLevel2: + Prerequisites: indp, !indplowpower + ProductionCostMultiplier@IndustrialPlantBoost: + Multiplier: 90 + Prerequisites: indp, !indplowpower + ProductionTimeMultiplier@MunitionsPlantBoost: + Multiplier: 85 + Prerequisites: munp, !munplowpower + GrantConditionOnPrerequisite@MunitionsPlantBoost: + Condition: munp-boost + Prerequisites: munp, !munplowpower + ReloadDelayMultiplier@MunitionsPlantBoost: + RequiresCondition: munp-boost + Modifier: 85 + +^OilRefCostReduction: + ProductionCostMultiplier@OilRef: Multiplier: 90 - Prerequisites: indp, indp.upgrade, !indplowpower + Prerequisites: oilr + +^TDPalette: + RenderSprites: + PlayerPalette: playertd ^Vehicle-NOUPG: Inherits@1: ^ExistsInWorld @@ -1443,7 +2384,7 @@ Inherits@9: ^Warpable Inherits@10: ^Frenzy Inherits@11: ^NaniteRepair - Inherits@12: ^GpsScramble + Inherits@12: ^Veilable Inherits@13: ^BotGroundProductionBonus Inherits@14: ^Chillable Inherits@15: ^Slowable @@ -1451,21 +2392,32 @@ Inherits@17: ^Concussion Inherits@18: ^Suppressable Inherits@19: ^CrateCloak - Inherits@C4: ^C4Plantable - Inherits@TNT: ^TNTPlantable - Inherits@gflash: ^GreenFlash - Inherits@rflash: ^RedFlash - Inherits@wflash: ^WhiteFlash + Inherits@20: ^WeaponJammable + Inherits@21: ^AuraRepairable + Inherits@C4Plantable: ^C4Plantable + Inherits@TNTPlantable: ^TNTPlantable Inherits@bounty: ^GlobalBounty - Inherits@production: ^ProductionEfficiencyBoost + Inherits@SovietT4Boost: ^SovietT4Boost + Inherits@oilcost: ^OilRefCostReduction Inherits@selection: ^SelectableCombatUnit + Inherits@chrono: ^Chronoshiftable Inherits@mind: ^MindControllable Inherits@handicaps: ^PlayerHandicaps Inherits@irrad: ^Irradiatable Inherits@ionsurge: ^IonSurgable Inherits@atomize: ^Atomizable Inherits@minidrone: ^MiniDroneAttachable + Inherits@WatcherParasite: ^WatcherParasiteAttachable + Inherits@ShadowBeacon: ^ShadowBeaconAttachable + Inherits@TargetPaintable: ^TargetPaintable + Inherits@lchrheal: ^LeecherHealable + Inherits@Blindable: ^Blindable + Inherits@KillZoneTargetable: ^KillZoneTargetable + Inherits@Anathema: ^Anathema + Inherits@Berserk: ^Berserk + Inherits@DevelopmentPolicyVeterancyBonus: ^DevelopmentPolicyVeterancyBonus Huntable: + EdibleByLeap: OwnerLostAction: Action: Kill UpdatesPlayerStatistics: @@ -1474,31 +2426,28 @@ Locomotor: wheeled TurnSpeed: 20 Selectable: - Bounds: 24, 24 + Bounds: 1024, 1024 Targetable: + TargetTypes: Ground, Vehicle + RequiresCondition: !parachute && !being-warped + Targetable@C4Plantable: + RequiresCondition: !parachute && !being-warped + Targetable@TNTPlantable: RequiresCondition: !parachute && !being-warped - TargetTypes: Ground, Vehicle, C4, TNT Targetable@REPAIR: - RequiresCondition: !parachute && damaged && !being-warped - TargetTypes: Repair + RequiresCondition: !parachute && !being-warped && damaged && !repair-cooldown + TargetTypes: Repairable GrantConditionOnDamageState@DAMAGED: Condition: damaged ValidDamageStates: Light, Medium, Heavy, Critical Repairable: RepairActors: fix, rep, srep - ChronoshiftableWithSpriteEffect: - Image: chrono - WarpInSequence: warpin - WarpOutSequence: warpout - RequiresCondition: !being-warped - Palette: ra2effect-ignore-lighting-alpha75 Passenger: CargoType: Vehicle AttackMove: HiddenUnderFog: ActorLostNotification: - ProximityCaptor: - Types: Vehicle + TextNotification: Unit lost. WithDamageOverlay: Guard: Guardable: @@ -1511,8 +2460,10 @@ CancelActivity: True RequiresCondition: !being-warped CaptureNotification: - Notification: UnitStolen - LoseNotification: UnitLost + Notification: EnemyUnitStolen + TextNotification: Enemy unit stolen. + LoseNotification: UnitStolen + LoseTextNotification: Unit stolen. MustBeDestroyed: Voiced: VoiceSet: VehicleVoice @@ -1520,18 +2471,18 @@ FallRate: 26 KilledOnImpassableTerrain: true ParachutingCondition: parachute - Explodes: + FireWarheadsOnDeath: Weapon: UnitExplodeSmall EmptyWeapon: UnitExplodeSmall RequiresCondition: !being-warped WithFacingSpriteBody: WithParachute: - ShadowImage: parach-shadow + ShadowImage: parach-largeshadow ShadowSequence: idle - Image: parach + Image: parachl Sequence: idle OpeningSequence: open - Offset: 0,0,200 + Offset: 0,0,327 RequiresCondition: parachute HitShape: MapEditorData: @@ -1546,12 +2497,17 @@ Duration: 100 Radius: 2c512 Carryable: - CarriedCondition: notmobile + CarriedCondition: passenger LockedCondition: notmobile LocalOffset: 0,0,200 + GrantCondition@CarriedImmobile: + Condition: notmobile + RequiresCondition: passenger + CancelActivityOnPickup: Crushable: CrushClasses: tank WarnProbability: 0 + RequiresCondition: !invulnerability && !being-warped DamagedByTintedCells@RADSTRONG: Damage: 100 DamageInterval: 16 @@ -1563,36 +2519,47 @@ DamageTypes: RadiationDeath LayerName: radioactivity.medium DetectCloaked@UNDERBRIDGE: - CloakTypes: Underbridge + DetectionTypes: Underbridge Range: 5c0 GpsRadarDot: Sequence: Vehicle TeleportNetworkTransportable: - Targetable@SHADOWBEACON: - TargetTypes: ShadowBeacon - AttachableTo: - Limits: - mdrn: 1 - LimitConditions: - mdrn: mdrn-attached + Targetable@MINDCONTROL: + RequiresCondition: !mindcontrolled && !invulnerability && !driver-dead + GrantConditionOnHealingReceived@REPAIRCOOLDOWN: + Condition: repair-cooldown + RequiredHealing: 85000 + StackDuration: 1000 + MinimumHealing: 2500 + DamageTypes: DirectRepair + ShowSelectionBar: true + ExternalCondition@UNITSELL: + Condition: unit-sellable + Sellable: + RequiresCondition: unit-sellable && !c4 && !being-captured && !being-warped + SellSounds: cashturntd.aud + Notification: UnitSold + TextNotification: Unit sold. + Cursor: sell2 + Encyclopedia: + Scale: 2 ^Vehicle: Inherits@1: ^Vehicle-NOUPG - Inherits@GDIUPG: ^GDIUpgrade + Inherits@GDIUPG: ^GDIStrategyBuffs Inherits@GDIBINO: ^BinoUpgrade ^VehicleTD-NOUPG: - Inherits@1: ^Vehicle - RenderSprites: - PlayerPalette: overlayplayertd + Inherits@1: ^Vehicle-NOUPG + Inherits@TDPAL: ^TDPalette WithDamageOverlay: Image: smoke_mtd Cloak@CRATE-CLOAK: - Palette: cloak + CloakedPalette: cloak ^VehicleTD: Inherits@1: ^VehicleTD-NOUPG - Inherits@GDIUPG: ^GDIUpgrade + Inherits@GDIUPG: ^GDIStrategyBuffs Inherits@GDIBINO: ^BinoUpgrade ^Tank: @@ -1604,17 +2571,19 @@ Inherits: ^VehicleTD Mobile: Locomotor: tracked - RenderSprites: - PlayerPalette: overlayplayertd - WithDamageOverlay: - Image: smoke_mtd + +^HeavyArmor: + Armor: + Type: Heavy + Targetable@HeavyArmor: + TargetTypes: Heavy ^SlowedByCrushing: ExternalCondition@CRUSHATTEMPTSLOW: Condition: crush-attempt-slow SpeedMultiplier@CRUSHATTEMPTSLOW: RequiresCondition: crush-attempt-slow && !crush-slow - Modifier: 60 + Modifier: 55 ExternalCondition@CRUSHSLOW: Condition: crush-slow SpeedMultiplier@CRUSHSLOW: @@ -1622,9 +2591,9 @@ Modifier: 35 ^SlightlySlowedByCrushing: - Inherits@CRUSHSLOW: ^SlowedByCrushing + Inherits@CRUSHSLOW: ^SlowedByCrushing SpeedMultiplier@CRUSHATTEMPTSLOW: - Modifier: 80 + Modifier: 70 SpeedMultiplier@CRUSHSLOW: Modifier: 50 @@ -1637,22 +2606,33 @@ Inherits@7: ^Warpable Inherits@9: ^IronCurtainable-Kills Inherits@10: ^FrenzyInfantry - Inherits@11: ^GpsScramble + Inherits@11: ^VeilableInfantry Inherits@12: ^BotGroundProductionBonus Inherits@13: ^Chillable Inherits@14: ^Concussion Inherits@15: ^Suppressable Inherits@16: ^CrateCloak - Inherits@TNT: ^TNTPlantable + Inherits@17: ^Slowable + Inherits@CLOAK: ^Cloakable + Inherits@TNTPlantable: ^TNTPlantable Inherits@bounty: ^GlobalBounty Inherits@selection: ^SelectableCombatUnit Inherits@mind: ^MindControllable Inherits@GMUT: ^GeneticallyMutatable Inherits@handicaps: ^PlayerHandicaps Inherits@BINOS: ^BinoUpgradeInfantry + Inherits@oilcost: ^OilRefCostReduction Inherits@ionsurge: ^IonSurgableInfantry + Inherits@lchrheal: ^LeecherHealable + Inherits@atomize: ^AtomizableInfantry + Inherits@Blindable: ^Blindable + Inherits@KillZoneTargetable: ^KillZoneTargetable + Inherits@ReaperSnareable: ^ReaperSnareable + Inherits@IdolOfKane: ^IdolOfKane + Inherits@Berserk: ^Berserk + Inherits@DevelopmentPolicyVeterancyBonus: ^DevelopmentPolicyVeterancyBonus RenderSprites: - PlayerPalette: overlayplayertd + PlayerPalette: playertd Huntable: OwnerLostAction: Action: Kill @@ -1664,19 +2644,20 @@ RevealsShroud: Range: 4c0 Mobile: - Speed: 43 + Speed: 46 Locomotor: foot - PauseOnCondition: being-warped + PauseOnCondition: being-warped || reapersnare + ResponsiveBetweenCells: true GrantConditionOnTerrain@ONTIB: - Condition: ontib - TerrainTypes: Tiberium, BlueTiberium + Condition: on-tib + TerrainTypes: Tiberium, BlueTiberium, BlackTiberium GrantStackingCondition@TIBEXPOSED: Condition: tibexposed - RequiresCondition: ontib + RequiresCondition: on-tib DelayPerInstance: 250 - RevokeDelay: 500 + RevokeDelay: 200 DamagedByTerrain@TIBDAMAGE: - Terrain: Tiberium, BlueTiberium + Terrain: Tiberium, BlueTiberium, BlackTiberium Damage: 125 DamageInterval: 16 DamageTypes: ToxinDeath @@ -1692,26 +2673,33 @@ DeathType: ToxinDeath RequiresLobbyCreeps: false Selectable: - Bounds: 18,18,0,-6 - DecorationBounds: 12,17,0,-6 + Bounds: 768, 768, 0, -256 + DecorationBounds: 512, 725, 0, -256 Targetable: RequiresCondition: !parachute && !being-warped - TargetTypes: Ground, Infantry, Disguise, TNT + TargetTypes: Ground, Infantry + Targetable@SpyDisguise: + TargetTypes: SpyDisguise + Targetable@TNTPlantable: + RequiresCondition: !parachute && !being-warped Targetable@HEAL: - RequiresCondition: !parachute && damaged && !being-warped - TargetTypes: Heal + RequiresCondition: !parachute && !being-warped && damaged + TargetTypes: Healable GrantConditionOnDamageState@DAMAGED: Condition: damaged ValidDamageStates: Light, Medium, Heavy, Critical QuantizeFacingsFromSequence: Sequence: stand WithInfantryBody: - RequiresCondition: !being-warped + RequiresCondition: !parachute && !being-warped && !reapersnare + WithInfantryBody@Parachute: + StandSequences: parachute + RequiresCondition: parachute || reapersnare WithInfantryBody@Warped: StandSequences: stand RequiresCondition: being-warped WithDeathAnimation: - DeathSequencePalette: overlayplayertd + DeathSequencePalette: playertd DeathTypes: DefaultDeath: 1 BulletDeath: 2 @@ -1726,25 +2714,30 @@ FrozenDeath: 11 AtomizedDeath: 12 CrushedSequence: die-crushed + CrushedPaletteIsPlayerPalette: true + CrushedSequencePalette: player AttackMove: Passenger: CargoType: Infantry - CargoCondition: disable-experience - GainsExperienceMultiplier: - Modifier: 0 - RequiresCondition: disable-experience + CargoCondition: passenger + DummyConditionConsumer@Passenger: + Condition: passenger + MassEntersCargo: + PassengerBlocked: HiddenUnderFog: ActorLostNotification: + TextNotification: Unit lost. Crushable: WarnProbability: 100 CrushSound: squishy2.aud + RequiresCondition: !invulnerability && !being-warped Guard: Guardable: Tooltip: GenericName: Soldier DeathSounds@NORMAL: Voice: Die - DeathTypes: DefaultDeath, BulletDeath, SmallExplosionDeath, ExplosionDeath + DeathTypes: DefaultDeath, BulletDeath, SmallExplosionDeath, ExplosionDeath, FrozenDeath DeathSounds@BURNED: Voice: Burned DeathTypes: FireDeath @@ -1762,8 +2755,6 @@ WaterImpactSound: splash9.aud WaterCorpseSequence: small_splash ParachutingCondition: parachute - Cloneable: - Types: Infantry Voiced: VoiceSet: GenericVoice WithParachute: @@ -1789,8 +2780,8 @@ RevealOnDeath: Duration: 100 DetectCloaked: - CloakTypes: Cloak - Range: 1c0 + DetectionTypes: Cloak + Range: 1c512 DamagedByTintedCells@RADSTRONG: Damage: 750 DamageInterval: 16 @@ -1839,10 +2830,6 @@ DamageTypes: FrozenDeath LayerName: cryoresidue RequiresCondition: !(being-warped || parachute) - Cloak@CRATE-CLOAK: - Palette: cloak - ExternalCondition@CLOAKGENERATOR: - Condition: invisibility GpsRadarDot: Sequence: Infantry GrantExternalConditionToCrusher@CRUSHATTEMPTSLOW: @@ -1854,52 +2841,109 @@ OnCrushCondition: crush-slow OnCrushDuration: 50 TeleportNetworkTransportable: + DamageMultiplier@MINDCONTROL: + Modifier: 70 + RequiresCondition: mindcontrolled + WithIdleOverlay@LCHRHEAL: + Sequence: infantry + Offset: 0,0,300 + Cloak@TIBSTEALTH: + CloakSound: cloak5sm.aud + UncloakSound: appear1sm.aud + Cloak@SGENCLOAK: + CloakSound: cloak5sm.aud + UncloakSound: appear1sm.aud + Encyclopedia: + Scale: 2 ^Soldier: Inherits: ^Infantry Inherits@DRIVER: ^CanCaptureDriverlessVehicles + Inherits@ZoneDefenderShieldable: ^ZoneDefenderShieldable UpdatesPlayerStatistics: MustBeDestroyed: - ProximityCaptor: - Types: Infantry + RevealsShroud: + Range: 5c0 TakeCover: + SpeedModifier: 60 + Duration: 75 DamageModifiers: Prone50Percent: 50 DamageTriggers: TriggerProne PauseOnCondition: being-warped + RequiresCondition: !reapersnare WithInfantryBody: IdleSequences: idle1,idle2 StandSequences: stand,stand2 + DamageTypeDamageMultiplier@FLAKARMOR: + DamageTypes: FlakVestMitigated + Modifier: 60 + RequiresCondition: flakarmor-upgrade + DamageTypeDamageMultiplier@FLAKARMORMINOR: + DamageTypes: FlakVestMitigatedMinor + Modifier: 80 + RequiresCondition: flakarmor-upgrade + GrantConditionOnPrerequisite@FLAKARMOR: + Condition: flakarmor-upgrade + Prerequisites: flakarmor.upgrade + GrantTimedConditionOnCrushWarning@QUICKDODGE: + Condition: quickdodge + Duration: 20 + SpeedMultiplier@QUICKDODGE: + RequiresCondition: quickdodge + Modifier: 200 + DamageMultiplier@QUICKDODGE: + RequiresCondition: quickdodge + Modifier: 50 ^Cyborg: Inherits: ^Soldier Inherits@CYBORGUPG: ^NodCyborgUpgrade + Inherits@CustodianBuff: ^CustodianBuff Inherits@SLOWABLE: ^Slowable - Targetable: - TargetTypes: Ground, Infantry, Disguise, ChaosImmune, Cyborg + Targetable@Cyborg: + TargetTypes: Cyborg + RequiresCondition: !parachute && !being-warped + Targetable@HealableCyborg: + RequiresCondition: !parachute && !being-warped && damaged && !healing-cooldown + TargetTypes: HealableCyborg + DummyConditionGranter@HealingCooldown: + Condition: healing-cooldown + ExternalCondition@ONTIB: + Condition: on-tib + ExternalCondition@ONBLUETIB: + Condition: on-bluetib ChangesHealth@THEAL: Step: 0 PercentageStep: 1 Delay: 15 StartIfBelow: 100 DamageCooldown: 150 - RequiresCondition: ontib + RequiresCondition: on-tib || on-bluetib DamageTypes: ToxinDeath WithDecoration@REDCROSS: - RequiresCondition: ontib || (hospitalheal && damaged) + RequiresCondition: on-tib || on-bluetib || (hospitalheal && damaged) WithDecoration@RANK-1: BlinkPatterns: - ontib || (damaged && hospitalheal): On, Off + on-tib || (damaged && hospitalheal): On, Off WithDecoration@RANK-2: BlinkPatterns: - ontib || (damaged && hospitalheal): On, Off + on-tib || (damaged && hospitalheal): On, Off WithDecoration@RANK-ELITE: BlinkPatterns: - ontib || (damaged && hospitalheal): On, Off + on-tib || (damaged && hospitalheal): On, Off -GrantConditionOnPrerequisite@BIO: -GrantConditionOnPrerequisite@HAZMAT: - -WithDecoration@HAZMAT: + -GrantConditionOnPrerequisite@HAZMATSOVIET: + -GrantConditionOnPrerequisite@HAZMATIRAQ: + -GrantConditionOnPrerequisite@HAZMATZOCOM: -GrantCondition@HAZMAT: + -GrantCondition@HAZMATSOVIET: + -WithDecoration@HAZMAT: + -WithDecoration@HAZMATSOVIET: + -GrantConditionOnTerrain@HAZMATSOVIET: + -SpeedMultiplier@HAZMATSOVIET: + -Targetable@HAZMAT: -DamagedByTerrain@TIBDAMAGE: -GrantStackingCondition@TIBEXPOSED: DamagedByTintedCells@RADSTRONG: @@ -1911,6 +2955,18 @@ -DamagedByTintedCells@RADMEDHAZMAT: -DamagedByTintedCells@RADWEAK: -DamagedByTintedCells@RADWEAKHAZMAT: + -DamageTypeDamageMultiplier@FLAKARMOR: + -DamageTypeDamageMultiplier@FLAKARMORMINOR: + -GrantConditionOnPrerequisite@FLAKARMOR: + WithDecoration@BINO: + -BlinkPatterns: + AddsToReclaimableValue@Cyborg: + Type: Cyborg + ValuePercentage: 5 + RequiresCondition: reclaimed-fabrication + GrantConditionOnPrerequisite@ReclaimedFabrication: + Condition: reclaimed-fabrication + Prerequisites: cyborgprod.upgrade ^CivInfantry: Inherits: ^Infantry @@ -1924,41 +2980,39 @@ Class: CivInfantry Valued: Cost: 10 - GrantConditionOnFaction@FACTION: - Factions: allies, england, france, germany, soviet, russia, ukraine, iraq, gdi, zocom, eagle, talon, nod, blackh, legion, marked, shadow - Condition: owned-by-faction Tooltip: Name: Civilian - GenericVisibility: None - RequiresCondition: !owned-by-faction - Tooltip@FACTION: - Name: Technician - GenericVisibility: None - RequiresCondition: owned-by-faction + ShowOwnerRow: false RevealsShroud: Range: 3c0 Passenger: CustomPipType: gray - ProximityCaptor: - Types: CivilianInfantry Voiced: VoiceSet: CivilianMaleVoice Wanders: MinMoveDelay: 150 MaxMoveDelay: 750 - AvoidTerrainTypes: Tiberium, BlueTiberium + AvoidTerrainTypes: Tiberium, BlueTiberium, BlackTiberium MapEditorData: Categories: Civilian infantry - Convertible: - SpawnActors: N1C ^ArmedCivilian: + Inherits@civInfantry: ^CivInfantry Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove + Tooltip: + RequiresCondition: !owned-by-combatant + Tooltip@COMBATANT: + Name: Technician + RequiresCondition: owned-by-combatant + GrantConditionOnCombatantOwner@COMBATANT: + Condition: owned-by-combatant + Convertible: + SpawnActors: N1C GrantConditionOnFaction@RA: - Factions: allies, england, france, germany, soviet, russia, ukraine, iraq + Factions: allies, england, france, germany, usa, soviet, russia, ukraine, iraq, yuri Condition: ra-faction GrantConditionOnFaction@TD: - Factions: gdi, zocom, eagle, talon, nod, blackh, legion, marked, shadow + Factions: gdi, zocom, eagle, talon, arc, nod, blackh, legion, marked, shadow Condition: td-faction Armament@RA: Weapon: Pistol @@ -1967,6 +3021,7 @@ Weapon: PistolTD RequiresCondition: td-faction AttackFrontal: + FacingTolerance: 0 WithInfantryBody: DefaultAttackSequence: shoot @@ -1977,26 +3032,38 @@ Inherits@4: ^SpriteActor Inherits@5: ^EmpDisable Inherits@6: ^Cloakable - Inherits@7: ^GDIUpgrade + Inherits@7: ^GDIStrategyBuffs Inherits@8: ^BinoUpgrade Inherits@10: ^Warpable Inherits@11: ^Frenzy Inherits@12: ^NaniteRepair - Inherits@13: ^GpsScramble + Inherits@13: ^Veilable Inherits@14: ^Chillable Inherits@15: ^BotGroundProductionBonus Inherits@16: ^Concussion Inherits@17: ^Suppressable Inherits@18: ^CrateCloak - Inherits@gflash: ^GreenFlash - Inherits@rflash: ^RedFlash - Inherits@wflash: ^WhiteFlash + Inherits@19: ^WeaponJammable + Inherits@20: ^AuraRepairable + Inherits@slowable: ^Slowable Inherits@bounty: ^GlobalBounty Inherits@selection: ^SelectableCombatUnit - Inherits@production: ^ProductionEfficiencyBoost + Inherits@SovietT4Boost: ^SovietT4Boost + Inherits@oilcost: ^OilRefCostReduction + Inherits@chrono: ^Chronoshiftable Inherits@mind: ^MindControllable Inherits@handicaps: ^PlayerHandicaps Inherits@atomize: ^Atomizable + Inherits@C4Plantable: ^C4Plantable + Inherits@TNTPlantable: ^TNTPlantable + Inherits@minidrone: ^MiniDroneAttachable + Inherits@WatcherParasite: ^WatcherParasiteAttachable + Inherits@TargetPaintable: ^TargetPaintable + Inherits@Blindable: ^Blindable + Inherits@KillZoneTargetable: ^KillZoneTargetable + Inherits@Anathema: ^Anathema + Inherits@Berserk: ^Berserk + Inherits@DevelopmentPolicyVeterancyBonus: ^DevelopmentPolicyVeterancyBonus Huntable: RenderSprites: PlayerPalette: playernavy @@ -2007,13 +3074,17 @@ Locomotor: naval PauseOnCondition: empdisable || being-warped Selectable: - Bounds: 24,24 + Bounds: 1024, 1024 Targetable: TargetTypes: Ground, Water, Ship RequiresCondition: !being-warped + Targetable@C4Plantable: + RequiresCondition: !being-warped + Targetable@TNTPlantable: + RequiresCondition: !being-warped Targetable@REPAIR: RequiresCondition: damaged && !being-warped - TargetTypes: Repair + TargetTypes: Repairable GrantConditionOnDamageState@DAMAGED: Condition: damaged ValidDamageStates: Light, Medium, Heavy, Critical @@ -2021,20 +3092,11 @@ AttackMove: ActorLostNotification: Notification: NavalUnitLost - ProximityCaptor: - Types: Ship - ChronoshiftableWithSpriteEffect: - Image: chrono - WarpInSequence: warpin - WarpOutSequence: warpout - Palette: ra2effect-ignore-lighting-alpha75 + TextNotification: Naval unit lost. RepairableNear: RepairActors: syrd, spen, syrd.gdi, spen.nod - #For AI - RepairableNearCA: - RepairActors: syrd, spen, syrd.gdi, spen.nod WithDamageOverlay: - Explodes: + FireWarheadsOnDeath: Weapon: UnitExplodeShip EmptyWeapon: UnitExplodeShip RequiresCondition: !being-warped @@ -2073,11 +3135,12 @@ Condition: under-bridge TerrainTypes: Bridge, Tunnel Cloak@UNDERBRIDGE: - CloakTypes: Underbridge + DetectionTypes: Underbridge UncloakOn: Unload InitialDelay: 0 CloakDelay: 0 - Palette: submerged + CloakStyle: Palette + CloakedPalette: submerged RequiresCondition: under-bridge DamageMultiplier@UNDERBRIDGE: RequiresCondition: under-bridge @@ -2086,7 +3149,7 @@ RequiresCondition: under-bridge TargetTypes: Underbridge DetectCloaked@UNDERBRIDGE: - CloakTypes: Underbridge + DetectionTypes: Underbridge Range: 5c0 GrantConditionOnBotOwner@IAMBOT: Condition: botowner @@ -2096,11 +3159,13 @@ RequiresCondition: (botowner && under-bridge) GpsRadarDot: Sequence: Ship + Encyclopedia: + Scale: 2 ^Submarine: Inherits@1: ^Ship Targetable: - TargetTypes: Ground, Water, Ship, Submarine, Repair + TargetTypes: Ground, Water, Ship, Submarine RequiresCondition: !underwater && !being-warped Targetable@UNDERWATER: TargetTypes: Underwater, Submarine @@ -2109,29 +3174,38 @@ Condition: crossing-ford TerrainTypes: Ford Cloak: - CloakTypes: Underwater + DetectionTypes: Underwater UncloakOn: Attack, Unload, Infiltrate, Demolish, Dock, Heal InitialDelay: 0 CloakDelay: 50 CloakSound: subshow1.aud UncloakSound: subshow1.aud CloakedCondition: underwater - Palette: submerged PauseOnCondition: cloak-force-disabled || invisibility || being-warped || crossing-ford GrantConditionOnDamageState@UNCLOAK: Condition: cloak-force-disabled ValidDamageStates: Critical DetectCloaked: - CloakTypes: Underwater + DetectionTypes: Underwater Range: 4c0 RenderDetectionCircle: - Explodes: + Color: 00ff0020 + BorderColor: 00000020 + FireWarheadsOnDeath: Weapon: UnitExplodeSubmarine EmptyWeapon: UnitExplodeSubmarine RequiresCondition: !under-bridge && !being-warped -MustBeDestroyed: Wanders@NOIDLENAVY: RequiresCondition: (botowner && crossing-ford) || (botowner && under-bridge) + -Targetable@MINIDRONE: + -ChangesHealth@MINIDRONE: + WithColoredSelectionBox@INVIS: + RequiresCondition: invisibility || underwater + ColorSource: Player + -AttachableTo@MINIDRONE: + Targetable@WatcherParasite: + RequiresCondition: !underwater && !observer-attached ^NeutralPlane: Inherits@1: ^ExistsInWorld @@ -2139,18 +3213,16 @@ Inherits@4: ^SpriteActor Inherits@bounty: ^GlobalBounty Inherits@selection: ^SelectableCombatUnit - Inherits@mind: ^MindControllable Inherits@handicaps: ^PlayerHandicaps - Huntable: OwnerLostAction: Action: Kill Armor: - Type: Light + Type: Aircraft UpdatesPlayerStatistics: AppearsOnRadar: UseLocation: true Selectable: - Bounds: 24,24 + Bounds: 1024, 1024 Aircraft: AirborneCondition: airborne TakeOffOnResupply: true @@ -2162,7 +3234,7 @@ TargetTypes: Air Targetable@REPAIR: RequiresCondition: !airborne && damaged - TargetTypes: Repair + TargetTypes: Repairable GrantConditionOnDamageState@DAMAGED: Condition: damaged ValidDamageStates: Light, Medium, Heavy, Critical @@ -2173,15 +3245,7 @@ Guardable: ActorLostNotification: Notification: AirUnitLost - ProximityCaptor: - Types: Plane - EjectOnDeath: - PilotActor: E1 - SuccessRate: 50 - EjectOnGround: false - EjectInAir: true - AllowUnsuitableCell: true - ChuteSound: chute1.aud + TextNotification: Airborne unit lost. Tooltip: GenericName: Plane WithShadow: @@ -2196,48 +3260,64 @@ Categories: Aircraft SpawnActorOnDeath: RequiresCondition: airborne - Explodes: + FireWarheadsOnDeath: Weapon: UnitExplode RequiresCondition: !airborne - GrantConditionOnPrerequisite@ROF: - Condition: revealonfire - Prerequisites: global.revealonfire - RevealOnFire: + RevealOnFireCA: RevealGeneratedShroud: True - RequiresCondition: revealonfire + Duration: 20 + Radius: 2c0 + GroundPosition: true RevealOnDeath: Duration: 100 Radius: 2c512 Contrail@1: - UsePlayerColor: false + StartColorUsePlayerColor: false ZOffset: -512 - Color: FFFFFF80 + StartColor: FFFFFF80 + StartColorAlpha: 96 Contrail@2: - UsePlayerColor: false + StartColorUsePlayerColor: false ZOffset: -512 - Color: FFFFFF80 + StartColor: FFFFFF80 + StartColorAlpha: 96 GpsRadarDot: Sequence: Plane + SpeedCapSpeedMultiplier@IRONCURTAIN: + MaxSpeed: 112 ^Plane: Inherits: ^NeutralPlane Inherits@2: ^GainsExperience Inherits@3: ^Cloakable Inherits@4: ^EmpDisable - Inherits@5: ^GDIUpgradeAircraft + Inherits@5: ^GDIStrategyBuffsAircraft Inherits@8: ^Warpable Inherits@9: ^BotAirProductionBonus Inherits@10: ^Chillable Inherits@11: ^Suppressable - Inherits@gflash: ^GreenFlash - Inherits@rflash: ^RedFlash - Inherits@wflash: ^WhiteFlash - Inherits@production: ^ProductionEfficiencyBoost + Inherits@12: ^Veilable + Inherits@CRATE-CLOAK: ^CrateCloak + Inherits@SovietT4Boost: ^SovietT4Boost + Inherits@oilcost: ^OilRefCostReduction Inherits@C4: ^C4Plantable Inherits@TNT: ^TNTPlantable Inherits@ionsurge: ^IonSurgable Inherits@atomize: ^Atomizable - Cloak@EXTERNALCLOAK: + Inherits@Blindable: ^Blindable + Inherits@DevelopmentPolicyVeterancyBonus: ^DevelopmentPolicyVeterancyBonus + -GrantConditionOnPrerequisite@MunitionsPlantBoost: + -ReloadDelayMultiplier@MunitionsPlantBoost: + Huntable: + EjectOnDeath: + PilotActor: E1 + SuccessRate: 50 + EjectOnGround: false + EjectInAir: true + AllowUnsuitableCell: true + ChuteSound: chute1.aud + RequiresCondition: airborne && !being-warped + Cloak@TIBSTEALTH: RequiresCondition: invisibility || crate-cloak && (!cloak-force-disabled && !airborne && !being-warped) CloakDelay: 90 UncloakOn: Attack, Unload, Infiltrate, Demolish, Damage, Heal @@ -2246,23 +3326,27 @@ Aircraft: CruisingCondition: cruising PauseOnCondition: empdisable && !airborne - KillsSelf: + KillsSelf@Emp: RequiresCondition: empdisable && cruising Targetable@GROUND: RequiresCondition: !airborne && !being-warped - TargetTypes: Ground, Vehicle, C4, TNT + TargetTypes: Ground, Vehicle + Targetable@C4Plantable: + RequiresCondition: !airborne && !being-warped + Targetable@TNTPlantable: + RequiresCondition: !airborne && !being-warped Targetable@AIRBORNE: RequiresCondition: airborne && !being-warped Targetable@REPAIR: RequiresCondition: !airborne && damaged && !being-warped - Targetable@c4: + Targetable@C4Attached: RequiresCondition: c4 && !airborne - Targetable@tnt: + Targetable@TNTAttached: RequiresCondition: tnt && !airborne ProductionCostMultiplier@EagleBonus: Multiplier: 90 - Prerequisites: structures.eagle - Explodes: + Prerequisites: player.eagle + FireWarheadsOnDeath: RequiresCondition: !airborne && !being-warped Targetable@TEMPORAL: TargetTypes: TemporalAir @@ -2271,11 +3355,29 @@ -SpeedMultiplier@chilled4: -SpeedMultiplier@chilled5: -SpeedMultiplier@chilled6: + -SpeedMultiplier@chilled7: + -SpeedMultiplier@chilled8: + -SpeedMultiplier@chilled9: + -SpeedMultiplier@chilled10: + WithShadow: + RequiresCondition: !invisibility + SoundOnDamageTransitionCA: + DestroyedSounds: vrapdiea.aud, vrapdieb.aud + RequiresCondition: airborne + ExternalCondition@UNITSELL: + Condition: unit-sellable + Sellable: + RequiresCondition: unit-sellable && !c4 && !being-warped + SellSounds: cashturntd.aud + Notification: UnitSold + TextNotification: Unit sold. + Cursor: sell2 + Encyclopedia: + Scale: 2 ^PlaneTD: Inherits@1: ^Plane - RenderSprites: - PlayerPalette: overlayplayertd + Inherits@TDPAL: ^TDPalette EjectOnDeath: PilotActor: N1 @@ -2289,36 +3391,66 @@ VTOL: true InitialFacing: 896 CanSlide: True - LandableTerrainTypes: Clear,Rough,Road,Ore,Beach,Gems,Tiberium,BlueTiberium - Crushes: crate, mine, infantry + LandableTerrainTypes: Clear,Road,Rough,Ore,Gems,Tiberium,BlueTiberium,BlackTiberium,Beach,Bridge,Tunnel,Ford + Crushes: crate, mine, infantry, husk Repairable: - RepairActors: fix, rep, srep, hpad, hpad.td + RepairActors: fix, rep, srep, hpad, hpad.td, afld, afld.gdi, grav Hovers@CRUISING: - RequiresCondition: cruising + RequiresCondition: cruising && !being-warped -Contrail@1: -Contrail@2: GpsRadarDot: Sequence: Helicopter + SoundOnDamageTransitionCA: + DestroyedSounds: vhelidi1a.aud, vhelidi2a.aud + RequiresCondition: airborne ^HelicopterTD: Inherits@1: ^Helicopter - RenderSprites: - PlayerPalette: overlayplayertd + Inherits@TDPAL: ^TDPalette EjectOnDeath: PilotActor: N1 +^Barrel: + Inherits@1: ^ExistsInWorld + Inherits@2: ^SpriteActor + Inherits@shape: ^1x1Shape + Interactable: + Bounds: 1024, 1024 + Health: + HP: 1000 + FireWarheadsOnDeath: + Weapon: BarrelExplode + Type: Footprint + Tooltip: + Name: Explosive Barrel + ShowOwnerRow: False + Armor: + Type: None + Targetable: + TargetTypes: Ground, Barrel, NoAutoTarget + MapEditorData: + Categories: Decoration + Building: + Dimensions: 1,1 + Footprint: x + TerrainTypes: Clear,Road + WithSpriteBody: + FrozenUnderFog: + FrozenUnderFogUpdatedByGpsRadar: + ^BasicBuilding: Inherits@1: ^ExistsInWorld Inherits@2: ^IronCurtainable Inherits@3: ^SpriteActor - Inherits@C4: ^C4Plantable - Inherits@TNT: ^TNTPlantable + Inherits@C4Plantable: ^C4Plantable + Inherits@TNTPlantable: ^TNTPlantable Inherits@shape: ^1x1Shape Inherits@bounty: ^GlobalBounty Inherits@selection: ^SelectableBuilding Inherits@handicaps: ^PlayerHandicaps Targetable: - TargetTypes: Ground, C4, TNT, DetonateAttack, Structure + TargetTypes: Ground, Structure, Building Building: Dimensions: 1,1 Footprint: x @@ -2327,7 +3459,6 @@ BuildSounds: placbldg.aud, build5.aud UndeploySounds: cashturn.aud ActorPreviewPlaceBuildingPreview: - OverridePalette: placebuilding RequiresBuildableArea: AreaTypes: building Adjacent: 4 @@ -2335,32 +3466,34 @@ DamagedSounds: kaboom1.aud, xplobig4.aud DestroyedSounds: kaboom22.aud, crumble.aud, xplobig4.aud WithSpriteBody: - Explodes: + FireWarheadsOnDeath: Type: Footprint Weapon: BuildingExplode EmptyWeapon: BuildingExplode CaptureNotification: - LoseNotification: StructureLost + TextNotification: Structure captured. + LoseNotification: OurBuildingCaptured + LoseTextNotification: Structure lost (captured). ShakeOnDeath: - ProximityCaptor: - Types: Building Guardable: Range: 3c0 FrozenUnderFog: FrozenUnderFogUpdatedByGpsRadar: + EdibleByLeap: Tooltip: GenericName: Structure MapEditorData: Categories: Building CommandBarBlacklist: WithColoredOverlay@FLARE: - WithColoredOverlay@FLARE: - Palette: flare + Color: ff000080 RequiresCondition: flare ExternalCondition@FLARE: Condition: flare WithDecoration@tnt: Sequence: tntbig + GivesExperienceCA: + ActorExperienceModifier: 5000 ^Building: Inherits@1: ^BasicBuilding @@ -2369,24 +3502,30 @@ Inherits@4: ^EmpDisable Inherits@6: ^WarpableBuilding Inherits@7: ^BotBuilding - Inherits@8: ^Chillable - Inherits@gflash: ^WhiteFlash - Inherits@wflash: ^GreenFlash Inherits@HACKABLE: ^Hackable - WithColoredOverlay@IRONCURTAIN: + Inherits@SpyIFVInfiltratable: ^SpyIFVInfiltratable + Inherits@WatcherParasite: ^WatcherParasiteAttachable + Inherits@TargetPaintable: ^TargetPaintable + Inherits@UndermineFoundation: ^UndermineFoundation + Inherits@DefensePolicyDamageReduction: ^DefensePolicyDamageReduction + Inherits@NodCovenantTarget: ^NodCovenantTarget + WithPalettedOverlay@IRONCURTAIN: RequiresCondition: invulnerability && !forceshield + Palette: invuln Huntable: OwnerLostAction: Action: Kill UpdatesPlayerStatistics: GivesBuildableArea: - AreaTypes: building, fake + AreaTypes: building, defense, fake RepairableBuilding: - RepairStep: 700 - PlayerExperience: 25 + RepairStep: 500 + RepairPercent: 30 RepairingNotification: Repairing RequiresCondition: !being-warped - EngineerRepairable: + RepairCondition: being-repaired + InstantlyRepairable: + RequiresCondition: !tnt && !c4 && !c4seal AcceptsDeliveredCash: WithMakeAnimation: Condition: build-incomplete @@ -2397,22 +3536,25 @@ Types: building CapturableProgressBar: CapturableProgressBlink: - SpawnActorsOnSell: + SpawnActorsOnSellCA: ActorTypes: e1,e1,e1,e1,e1,e1,e1,e1,e1,e1,c1,c1,c1,c1,c7,c7,c7,c7,c10,c10 + GuaranteedActorTypes: e1, e1 + GuaranteedActorsLimitedByValue: true SpawnActorOnDeath: Actor: e1 Probability: 5 - RequiresCondition: !being-warped + RequiresCondition: !being-warped && !hacked SpawnRandomActorOnDeath: Actors: c1,c7,c10 Probability: 10 - RequiresCondition: !being-warped + RequiresCondition: !being-warped && !hacked MustBeDestroyed: RequiredForShortGame: true Sellable: RequiresCondition: !build-incomplete && !c4 && !being-captured && !being-warped && !hacked SellSounds: cashturn.aud Notification: StructureSold + TextNotification: Structure sold. WithBuildingRepairDecoration: Image: allyrepair Sequence: repair @@ -2422,46 +3564,99 @@ RequiresCondition: !being-warped Targetable: RequiresCondition: !being-warped - -ExternalCondition@CRATE-CLOAK: - Explodes@TEMPORAL: + Targetable@C4Plantable: + RequiresCondition: !being-warped + Targetable@TNTPlantable: + RequiresCondition: !being-warped + Targetable@HACKABLE: + RequiresCondition: !build-incomplete && !being-warped + FireWarheadsOnDeath: + RequiresCondition: !being-warped + FireWarheadsOnDeath@TEMPORAL: Weapon: TemporalExplodeLarge EmptyWeapon: TemporalExplodeLarge GpsRadarDot: Sequence: Structure + DelayedWeaponAttachable@C4: + RequiresCondition: !invulnerability && !forceshield + DelayedWeaponAttachable@C4Seal: + RequiresCondition: !invulnerability && !forceshield + DelayedWeaponAttachable@TNT: + RequiresCondition: !invulnerability && !forceshield + Cloak@TIBSTEALTH: + CloakSound: cloak5.aud + UncloakSound: appear1.aud + Cloak@SGENCLOAK: + CloakSound: cloak5.aud + UncloakSound: appear1.aud + UpdatesBuildOrder: + InfiltrateToCreateProxyActor@InfiltratorVision: + Proxy: camera.infiltrator + Types: VisionInfiltrate + UseLocation: true + UseCenterPosition: true + LinkedToParent: true + InfiltrateForTimedCondition@InfiltratorVisionIcon: + Condition: observer-attached + Types: VisionInfiltrate + Duration: 3000 + Targetable@InfiltratorVision: + TargetTypes: VisionInfiltrate + RequiresCondition: !being-warped + GivesPlayerExperienceOnCapture: + CaptureTypes: building + PlayerExperience: 12 + AddExperienceFromValue: true + ValuePercentage: 1 + PlayerExperienceRelationships: Enemy, Neutral + SubsequentCaptureModifier: 50 + Encyclopedia: + Scale: 2 ^BuildingTD: Inherits@1: ^Building - RenderSprites: - PlayerPalette: overlayplayertd + Inherits@TDPAL: ^TDPalette SpawnActorOnDeath: Actor: n1 - SpawnActorsOnSell: + SpawnActorsOnSellCA: ActorTypes: n1,n1,n1,n1,n1,n1,n1,n1,n1,n1,c1,c1,c1,c1,c7,c7,c7,c7,c10,c10 + GuaranteedActorTypes: n1, n1 ActorPreviewPlaceBuildingPreview: - OverridePalette: placebuildingtd + WithDeathAnimation: + DeathSequence: dead + UseDeathTypeSuffix: false + DeathSequencePalette: playertd + +^WaterStructure: + Targetable@WATER: + TargetTypes: Water, WaterStructure ^Defense: Inherits: ^Building Inherits@botbonus: ^BotDefenseProductionBonus Inherits@Concussion: ^Concussion Inherits@selection: ^SelectableCombatBuilding - Inherits@mind: ^MindControllable - Inherits@gpsscramble: ^GpsScramble + Inherits@veilable: ^Veilable + Inherits@weapjammable: ^WeaponJammable + Inherits@atomize: ^Atomizable + Inherits@DefensePolicyDamageBonus: ^DefensePolicyDamageBonus -SpeedMultiplier@concussion: - WithColoredOverlay@IRONCURTAIN: + WithPalettedOverlay@IRONCURTAIN: RequiresCondition: invulnerability + Palette: invuln Selectable: - Bounds: 24,24 + Bounds: 1024, 1024 Targetable: - TargetTypes: Ground, C4, TNT, DetonateAttack, Structure, Defense + TargetTypes: Ground, Structure, Defense DetectCloaked: + DetectionTypes: Cloak, AirCloak Range: 6c0 RequiresCondition: !(empdisable || being-warped) MustBeDestroyed: RequiredForShortGame: false -GivesBuildableArea: -AcceptsDeliveredCash: - -WithColoredOverlay@FS: + -WithPalettedOverlay@FS: -DamageMultiplier@FS: -TimedConditionBar@FS: -ExternalCondition@FS: @@ -2470,12 +3665,17 @@ -Capturable: -CapturableProgressBar: -CapturableProgressBlink: - -SpawnActorsOnSell: + -SpawnActorsOnSellCA: + -InfiltrateToCreateProxyActor@InfiltratorVision: + RepairableBuilding: + RepairStep: 700 + -RepairPercent: Sellable: RequiresCondition: !build-incomplete && !c4 && !being-warped && !hacked RenderRangeCircle: + RangeCircleType: DefenseRange Color: C12900 - Explodes: + FireWarheadsOnDeath: Weapon: SmallBuildingExplode EmptyWeapon: SmallBuildingExplode MapEditorData: @@ -2491,20 +3691,39 @@ RequiresCondition: revealonfire ProductionCostMultiplier@FranceBonus: Multiplier: 90 - Prerequisites: structures.france - Explodes@TEMPORAL: + Prerequisites: player.france + FireWarheadsOnDeath@TEMPORAL: Weapon: TemporalExplode EmptyWeapon: TemporalExplode DetectCloaked@UNDERBRIDGE: - CloakTypes: Underbridge + DetectionTypes: Underbridge Range: 6c0 + DelayedWeaponAttachable@C4: + RequiresCondition: !invulnerability + DelayedWeaponAttachable@C4Seal: + RequiresCondition: !invulnerability + DelayedWeaponAttachable@TNT: + RequiresCondition: !invulnerability + RequiresBuildableArea: + AreaTypes: defense + GivesExperienceCA: + ActorExperienceModifier: 10000 + -UpdatesBuildOrder: + ChangesHealth@DefensePolicy2: + Step: 140 + ExternalCondition@PowerDown: + Condition: powerdown + DummyConditionConsumer@PowerDown: + Condition: powerdown ^DefenseTD: Inherits@1: ^Defense - RenderSprites: - PlayerPalette: overlayplayertd + Inherits@TDPAL: ^TDPalette ActorPreviewPlaceBuildingPreview: - OverridePalette: placebuildingtd + +^AntiAirDefense: + Targetable@AntiAirDefense: + TargetTypes: AntiAirDefense ^BuildingPlug: Interactable: @@ -2514,7 +3733,6 @@ UndeploySounds: cashturn.aud SequencePlaceBuildingPreview: Sequence: place - SequencePalette: placebuildingtd Palette: terrain KillsSelf: RemoveInstead: true @@ -2524,10 +3742,12 @@ Inherits@1: ^ExistsInWorld Inherits@2: ^SpriteActor Inherits@shape: ^1x1Shape + CustomRadarColor: + Color: EEEEEE Inherits@3: ^Cloakable Inherits@handicaps: ^PlayerHandicaps Interactable: - Bounds: 24,24 + Bounds: 1024, 1024 OwnerLostAction: Action: ChangeOwner Building: @@ -2537,9 +3757,8 @@ TerrainTypes: Clear,Road UndeploySounds: cashturn.aud FootprintPlaceBuildingPreview: - LineBuildSegmentPalette: placelinesegment RequiresBuildableArea: - AreaTypes: building + AreaTypes: defense Adjacent: 7 SoundOnDamageTransition: DamagedSounds: sandbag2.aud @@ -2552,10 +3771,8 @@ LineBuildNode: Types: wall Targetable: - TargetTypes: Ground, DetonateAttack, Wall, NoAutoTarget - -GivesExperience: - RenderSprites: - Palette: effect + TargetTypes: Ground, Wall, NoAutoTarget + -GivesExperienceCA: WithWallSpriteBody: Sellable: SellSounds: cashturn.aud @@ -2567,10 +3784,9 @@ Terrain: Wall MapEditorData: Categories: Wall - -ExternalCondition@CRATE-CLOAK: ProductionCostMultiplier@FranceBonus: Multiplier: 90 - Prerequisites: structures.france + Prerequisites: player.france GrantExternalConditionToCrusher@CRUSHATTEMPTSLOW: WarnCrushCondition: crush-attempt-slow WarnCrushDuration: 50 @@ -2582,6 +3798,11 @@ ^TechBuilding: Inherits: ^BasicBuilding + Inherits@Cloakable: ^Cloakable + Inherits@Hackable: ^Hackable + Inherits@WatcherParasite: ^WatcherParasiteAttachable + Inherits@TargetPaintable: ^TargetPaintable + Inherits@UndermineFoundation: ^UndermineFoundation Huntable: Health: HP: 40000 @@ -2592,6 +3813,14 @@ GenericVisibility: None MapEditorData: Categories: Tech building + GivesPlayerExperienceOnCapture: + CaptureTypes: building + PlayerExperience: 10 + PlayerExperienceRelationships: Enemy, Neutral + SubsequentCaptureModifier: 50 + Encyclopedia: + Category: Other/Tech Buildings + Scale: 2 ^CommandoSkull: WithDecoration@COMMANDOSKULL: @@ -2601,6 +3830,14 @@ Position: TopLeft ValidRelationships: Ally, Enemy, Neutral +^CommandoRegen: + ChangesHealth@CommandoRegen: + PercentageStep: 5 + Delay: 100 + StartIfBelow: 100 + DamageCooldown: 150 + RequiresCondition: !rank-elite + ^FakeBuilding: Inherits: ^Building GivesBuildableArea: @@ -2609,11 +3846,10 @@ AreaTypes: fake Health: HP: 10000 - Explodes: - Weapon: Demolish - DamageThreshold: 70 RevealsShroud: Range: 1c0 + SoundOnDamageTransition: + -DamagedSounds: WithDecoration@fake: RequiresSelection: true Image: pips @@ -2621,16 +3857,46 @@ Sequence: tag-fake Position: Top Margin: 0, 4 - -SpawnActorsOnSell: + -SpawnActorsOnSellCA: + -SpawnActorOnDeath: + -SpawnRandomActorOnDeath: -MustBeDestroyed: MapEditorData: Categories: Fake + TooltipExtras: + Attributes: • Can be detonated remotely + FireWarheadsOnDeath@FAKE: + Weapon: FakeBuildingExplode + DamageThreshold: 70 + Type: CenterPosition + GrantConditionOnDeploy: + DeployedCondition: detonate + SkipMakeAnimation: true + DeployCursor: c4 + RequiresCondition: !detonate-disabled + WithFlashEffect@Detonate: + Color: ff0000 + Interval: 5000 + RequiresCondition: detonate + PeriodicExplosion: + Weapon: FakeBuildingSelfDestruct + RequiresCondition: detonate + GrantTimedCondition@DETONATEDELAY: + Condition: detonate-disabled + Duration: 125 + -UpdatesCount@NodCovenant: + -InfiltrateToCreateProxyActor@InfiltratorVision: + -Targetable@InfiltratorVision: + Encyclopedia: + Category: Allies/Defenses + EncyclopediaExtras: + Subfaction: england ^InfiltratableFake: - Targetable: - TargetTypes: Ground, Structure, C4, TNT, DetonateAttack, SpyInfiltrate + Targetable@Infiltration: + TargetTypes: PowerOutageInfiltrate, VisionInfiltrate InfiltrateForDecoration: - Types: SpyInfiltrate + Types: PowerOutageInfiltrate, VisionInfiltrate, StealCreditsInfiltrate, VetInfiltrate, ResetShroudInfiltrate, GrantSupportPowerInfiltrate RequiresSelection: true Image: pips Palette: chrome @@ -2639,25 +3905,35 @@ Margin: 0, 4 ^AmmoBox: - Inherits: ^TechBuilding + Inherits: ^BasicBuilding -Selectable: + Huntable: Health: HP: 1000 - Explodes: + FireWarheadsOnDeath: Weapon: UnitExplode Tooltip: Name: Ammo Box + GenericVisibility: None Targetable: - TargetTypes: Ground, C4, TNT, DetonateAttack, Structure, NoAutoTarget + TargetTypes: Ground, Structure, NoAutoTarget Armor: Type: Light MapEditorData: Categories: Decoration Interactable: - Bounds: 24,24 + Bounds: 1024, 1024 ^CivBuilding: - Inherits: ^TechBuilding + Inherits: ^BasicBuilding + Huntable: + Health: + HP: 40000 + Armor: + Type: Wood + Tooltip: + Name: Civilian Building + GenericVisibility: None RenderSprites: Palette: player MapEditorData: @@ -2672,17 +3948,17 @@ SpawnRandomActorOnDeath@3: Actors: c5,c7,c8,c9 Probability: 15 - Explodes: + FireWarheadsOnDeath: Weapon: SmallBuildingExplode - Explodes@CIVPANIC: + FireWarheadsOnDeath@CIVPANIC: Weapon: CivPanicExplosion ^CivField: Inherits: ^CivBuilding -HitShape: -Health: - -Explodes: - -Explodes@CIVPANIC: + -FireWarheadsOnDeath: + -FireWarheadsOnDeath@CIVPANIC: -Selectable: -SelectionDecorations: Tooltip: @@ -2690,8 +3966,40 @@ -Targetable: Interactable: +^ResourceNode: + SeedsResourceCA: + RequiresCondition: !voidspike + GrantConditionOnPrerequisite@FastRegrowth: + Condition: fast-regrowth + Prerequisites: global.fastregrowth + SeedsResourceMultiplier@FastRegrowth: + Modifier: 50 + RequiresCondition: fast-regrowth + SeedsResourceMultiplier@IchorBoost: + Modifier: 80 + RequiresCondition: ichor-boost + ExternalCondition@IchorBoost: + Condition: ichor-boost + ExternalCondition@VoidSpike: + Condition: voidspike + WithIdleOverlay@IchorBoost: + Image: resconv + Sequence: green + Palette: scrin + RequiresCondition: ichor-boost + Offset: 0,0,300 + SeedsResource@BlackTiberium: + ResourceType: BlackTiberium + Interval: 66 + RequiresCondition: voidspike + WithPalettedOverlay@VoidSpike: + Palette: voidspike + RequiresCondition: voidspike + VisibleThroughFog: false + ^TibTree: Inherits@1: ^SpriteActor + Inherits@ResourceNode: ^ResourceNode Interactable: Tooltip: Name: Blossom Tree @@ -2700,7 +4008,7 @@ Palette: temptd WithSpriteBody: WithIdleAnimation: - Interval: 155 + Interval: 100, 200 Building: Footprint: x Dimensions: 1,1 @@ -2709,6 +4017,12 @@ Terrain: Tiberium HiddenUnderShroud: WithMakeAnimation: + MapEditorData: + Categories: Resource spawn + ProximityExternalCondition@ONTIB: + Condition: on-tib + Range: 4c0 + ValidRelationships: Ally, Neutral, Enemy ^Tree: Inherits@1: ^SpriteActor @@ -2812,40 +4126,45 @@ ^Husk: Inherits: ^BasicHusk + Inherits@chrono: ^Chronoshiftable Husk: - AllowedTerrain: Clear, Rough, Road, Ore, Gems, Beach, Tiberium, BlueTiberium + AllowedTerrain: Clear,Road,Rough,Ore,Gems,Tiberium,BlueTiberium,BlackTiberium,Beach,Bridge,Tunnel,Ford WithIdleOverlay@Burns: Image: fire Sequence: 1 IsDecoration: true + Palette: effect + RequiresCondition: !being-captured ChangesHealth: - Step: -200 + PercentageStep: -10 StartIfBelow: 101 - Delay: 8 + Delay: 150 + RequiresCondition: !being-captured OwnerLostAction: Action: ChangeOwner CaptureManager: + BeingCapturedCondition: being-captured Capturable: Types: husk - ValidRelationships: Enemy, Neutral - TransformOnCapture: - ForceHealthPercentage: 25 - InfiltrateForTransform: - Types: Husk - ForceHealthPercentage: 25 + CapturableProgressBar: + CapturableProgressBlink: + GivesCashOnCaptureCA: + Amount: 200 + SuffixToRemoveForValueActor: .husk + ValueActorPercentage: 30 + GrantConditionOnCapture: + Condition: salvaged + KillsSelf: + RemoveInstead: True + RequiresCondition: salvaged WithColoredOverlay@IDISABLE: - Palette: disabled + Color: 000000b4 Targetable: TargetTypes: Ground, Husk, NoAutoTarget RequiresForceFire: true - ChronoshiftableWithSpriteEffect: - Image: chrono - WarpInSequence: warpin - WarpOutSequence: warpout - Palette: ra2effect-ignore-lighting-alpha75 Tooltip: GenericName: Destroyed Vehicle - Explodes: + FireWarheadsOnDeath: Weapon: VisualExplodeHusk EmptyWeapon: VisualExplodeHusk DamageSource: Killer @@ -2853,12 +4172,19 @@ CrushClasses: wall CrushSound: destw.aud CrushedByFriendlies: True + ChronoshiftableCA: + ReturnToAvoidDeath: false + -RequiresCondition: + -Condition: + -HealthCapDamageMultiplier@CHRONO: ^HuskTD: Inherits: ^Husk + Inherits@TDPAL: ^TDPalette WithIdleOverlay@Burns: Image: fire Sequence: 5 + Palette: tdeffect ^PlaneHusk: Inherits: ^BasicHusk @@ -2871,23 +4197,28 @@ FallsToEarth: MaximumSpinSpeed: 0 Moves: True - Velocity: 86 + Velocity: 70 Explosion: UnitExplodePlane -MapEditorData: RevealOnDeath: Duration: 60 Radius: 4c0 Contrail@1: - UsePlayerColor: false + StartColorUsePlayerColor: false ZOffset: -512 - Color: FFFFFF80 + StartColor: FFFFFF80 + StartColorAlpha: 96 Contrail@2: - UsePlayerColor: false + StartColorUsePlayerColor: false ZOffset: -512 - Color: FFFFFF80 + StartColor: FFFFFF80 + StartColorAlpha: 96 -^PlaneHuskEmpty: +^PlaneHuskTD: Inherits: ^PlaneHusk + Inherits@TDPAL: ^TDPalette + +^PlaneHuskEmpty: FallsToEarth: Explosion: UnitExplodePlaneEmpty @@ -2904,13 +4235,17 @@ CanSlide: True FallsToEarth: Explosion: UnitExplodeHeli + MaximumSpinSpeed: 40 -MapEditorData: RevealOnDeath: Duration: 60 Radius: 4c0 +^HelicopterHuskTD: + Inherits: ^HelicopterHusk + Inherits@TDPAL: ^TDPalette + ^HelicopterHuskEmpty: - Inherits: ^PlaneHusk FallsToEarth: Explosion: UnitExplodeHeliEmpty @@ -2922,6 +4257,7 @@ Image: fire Sequence: 1 IsDecoration: true + Palette: effect ChangesHealth: Step: -1000 StartIfBelow: 101 @@ -2929,14 +4265,13 @@ CaptureManager: Capturable: Types: building - ValidRelationships: Enemy, Neutral, Ally CapturableProgressBar: CapturableProgressBlink: TransformOnCapture: ForceHealthPercentage: 25 Tooltip: GenericName: Destroyed Building - Explodes@NORMAL: + FireWarheadsOnDeath@NORMAL: Type: Footprint Weapon: BuildingExplode EmptyWeapon: BuildingExplode @@ -2961,7 +4296,7 @@ ClassicFacingBodyOrientation: QuantizedFacings: 1 Interactable: - Bounds: 96,48 + Bounds: 4096, 2048 ShakeOnDeath: Duration: 15 Intensity: 6 @@ -3002,15 +4337,15 @@ ^Crate: Inherits@1: ^SpriteActor Interactable: - Bounds: 24,24 + Bounds: 1024, 1024 HiddenUnderFog: Tooltip: Name: Crate GenericName: Crate ShowOwnerRow: false - Crate: - Lifetime: 180 - TerrainTypes: Clear, Rough, Road, Ore, Beach, Tiberium, BlueTiberium, Water + CrateCA: + Duration: 4500 + TerrainTypes: Clear, Rough, Road, Ore, Beach, Tiberium, BlueTiberium, BlackTiberium, Water RenderSprites: Palette: effect Image: scrate @@ -3036,7 +4371,8 @@ ^Mine: Inherits: ^SpriteActor Interactable: - Bounds: 24,24 + Bounds: 1024, 1024 + ScriptTriggers: WithSpriteBody: HiddenUnderFog: Mine: @@ -3047,13 +4383,10 @@ Health: HP: 10000 NotifyAppliedDamage: false - Armor: - Type: Light Cloak: CloakSound: UncloakSound: - Palette: - CloakTypes: Mine + DetectionTypes: Mine InitialDelay: 0 Tooltip: Name: Mine @@ -3079,7 +4412,7 @@ ^DisableOnLowPower: WithColoredOverlay@IDISABLE: RequiresCondition: disabled && !(invulnerability || empdisable || being-warped) - Palette: disabled + Color: 000000b4 GrantConditionOnPowerState@LOWPOWER: Condition: lowpower ValidPowerStates: Low, Critical @@ -3090,7 +4423,7 @@ ^DisableOnLowPowerOrForceDisabled: WithColoredOverlay@IDISABLE: RequiresCondition: disabled && !(invulnerability || empdisable || forceshield || being-warped) - Palette: disabled + Color: 000000b4 GrantConditionOnPowerState@LOWPOWER: Condition: lowpower ValidPowerStates: Low, Critical @@ -3124,9 +4457,13 @@ Palette: chrome RequiresCondition: powerdown Position: Center + ValidRelationships: Ally, Enemy, Neutral PowerMultiplier@POWERDOWN: RequiresCondition: powerdown Modifier: 0 + RevealsShroudMultiplier@POWERDOWN: + RequiresCondition: lowpower || powerdown || empdisable + Modifier: 50 WithBuildingRepairDecoration: Offsets: powerdown: -10, 0 @@ -3164,7 +4501,7 @@ ^DisabledByPowerOutage: WithColoredOverlay@IDISABLE: RequiresCondition: disabled && !forceshield && !invulnerability && !empdisable - Palette: disabled + Color: 000000b4 ExternalCondition: Condition: forcedisabled TimedConditionBar@FSDISABLE: @@ -3181,8 +4518,13 @@ Condition: disabled AffectedByPowerOutage: Condition: power-outage + Targetable@PowerOutageInfiltrate: + TargetTypes: PowerOutageInfiltrate + RequiresCondition: !being-warped InfiltrateForPowerOutage: - Types: SpyInfiltrate, SabInfiltrate + Types: PowerOutageInfiltrate + InfiltrationNotification: BuildingInfiltrated + PlayerExperience: 15 PowerMultiplier@FORCEDISABLE: RequiresCondition: forcedisabled Modifier: 0 @@ -3192,9 +4534,12 @@ ^DisabledByRadarLoss: ExternalCondition@DRONECONTROL: Condition: radarenabled + GrantConditionOnPrerequisite@DRONECONTROL: + Condition: radarenabled + Prerequisites: radar-active WithColoredOverlay@DRONEDISABLE: RequiresCondition: !radarenabled || empdisable - Palette: disabled + Color: 000000b4 WithDecoration@DRONEDISABLE: Image: nosignal Sequence: offline @@ -3236,12 +4581,86 @@ Selectable: Priority: 2 +^EngineerBase: + Inherits@SELECTION: ^SelectableSupportUnit + Inherits@Inspirable: ^Inspirable + Buildable: + Queue: InfantrySQ, InfantryMQ + BuildAtProductionType: Soldier + Description: Utility infantry used for capturing/repairing structures. + TooltipExtras: + Weaknesses: • Unarmed + Attributes: • Captures enemy buildings\n• Repairs friendly structures & bridges\n• Defuses mines and bombs + Valued: + Cost: 400 + Passenger: + CustomPipType: yellow + InstantlyRepairs: + RepairsBridges: + EnterBehaviour: Exit + CaptureManager: + CapturingCondition: capturing + GrantCondition@CapturingDecloak: + Condition: cloak-force-disabled + RequiresCondition: capturing + Captures: + CaptureTypes: building + CaptureDelay: 150 + Armament@bombdefuser: + Weapon: DefuseKit + Cursor: goldwrench + OutsideRangeCursor: goldwrench + TargetRelationships: Ally + ForceTargetRelationships: None + Armament@minedefuser: + Weapon: MineDefuser + Cursor: goldwrench + OutsideRangeCursor: goldwrench + PauseOnCondition: !ammo + Name: secondary + Armament@minedefusercharge: + Weapon: MineDefuserCharger + Cursor: goldwrench + OutsideRangeCursor: goldwrench + Name: tertiary + AmmoPool@minedefuser: + Ammo: 1 + InitialAmmo: 0 + AmmoCondition: ammo + Armaments: secondary + ReloadAmmoPoolCA@minedefuser: + Delay: 50 + Count: 1 + RequiresCondition: charging + ShowSelectionBar: true + SelectionBarColor: ffff00 + GrantConditionOnAttack@CHARGING: + Condition: charging + ArmamentNames: tertiary + RevokeDelay: 7 + AutoTarget: + ScanRadius: 3 + AutoTargetPriority@defuse: + ValidTargets: C4Attached, TNTAttached + InvalidTargets: NoAutoTarget + ValidRelationships: Ally + AutoTargetPriority@mines: + ValidTargets: Mine + ValidRelationships: Enemy, Neutral + AttackFrontal: + Armaments: primary, secondary, tertiary + PauseOnCondition: being-warped + FacingTolerance: 0 + DetectCloaked: + Range: 5c0 + DetectionTypes: Mine + MineImmune: + ^Viceroid: Inherits@1: ^ExistsInWorld Inherits@2: ^SpriteActor Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove - RenderSprites: - PlayerPalette: overlayplayertd + Inherits@TDPAL: ^TDPalette Huntable: Health: HP: 10000 @@ -3251,12 +4670,12 @@ Range: 6c0 Mobile: Voice: Move - Speed: 56 - Locomotor: chem + Speed: 60 + Locomotor: foot SelectionDecorations: WithSpriteControlGroupDecoration: Selectable: - Bounds: 24,24 + Bounds: 1024, 1024 Targetable: TargetTypes: Ground, Infantry, Creep AutoTarget: @@ -3276,6 +4695,7 @@ MuzzlePalette: tdeffect-ignore-lighting-alpha85 AttackFrontal: Voice: Attack + FacingTolerance: 0 ClassicFacingBodyOrientation: QuantizedFacings: 8 WithSpriteBody: @@ -3300,17 +4720,9 @@ Inherits@1: ^ExistsInWorld Inherits@4: ^SpriteActor Armor: - Type: Light - BallisticMissile: - LaunchAngle: 128 - Speed: 110 - AirborneCondition: airborne - Targetable@GROUND: - TargetTypes: ICBM - RequiresCondition: !airborne - Targetable@AIRBORNE: + Type: Aircraft + Targetable: TargetTypes: ICBM - RequiresCondition: airborne HiddenUnderFog: Type: GroundPosition Tooltip: @@ -3324,18 +4736,34 @@ WithShadow: ^ThrowsShrapnel: - ThrowsShrapnel@small: + FireProjectilesOnDeath@small: Weapons: SmallDebris Pieces: 3, 7 Range: 1c511, 3c0 ^ThrowsShrapnelBig: Inherits: ^ThrowsShrapnel - ThrowsShrapnel@fire: + FireProjectilesOnDeath@fire: Weapons: FireDebris Pieces: 3, 7 Range: 1c511, 3c0 +^UnlocksMcvIfNoneOwned: + ProvidesPrerequisite@allowsmcv: + Prerequisite: vehicles.mcv + RequiresCondition: !has-mcv && !has-conyard + GrantConditionOnPrerequisiteCA@has-conyard: + Condition: has-conyard + Prerequisites: anyconyard + GrantConditionOnPrerequisiteCA@has-mcv: + Condition: has-mcv + Prerequisites: anymcv + +^NodCovenantTarget: + UpdatesCount@NodCovenant: + Type: NodCovenant + UpdateOn: Killed, SoldAfterDamage, Captured, Infiltrated + ^AIUNLOAD: GrantConditionWhileAiming@AIUNLOAD: Condition: aiming @@ -3343,3 +4771,303 @@ Condition: damage UnloadOnCondition@AIUNLOAD: RequiresCondition: damage || aiming + +^QueueUpdater: + FreeActorCA@QUEUEUPDATER: + Actor: QueueUpdaterDummy + RequiresCondition: updatequeue + SpawnActorOnCapture@QUEUEUPDATER: + Actor: QueueUpdaterDummy + Delay: 1 + GrantDelayedCondition@QUEUEUPDATER: + Delay: 1 + Condition: updatequeue + GrantConditionOnPrerequisite@MQF: + Condition: global-multiqueue + Prerequisites: global.multiqueuefull + GrantConditionOnPrerequisite@MQS: + Condition: global-multiqueue + Prerequisites: global.multiqueuescaled + +^ProductionOptimizer1: + ProvidesPrerequisite@ProductionOptimizer1: + Prerequisite: optimized.production1 + FreeActor@ProductionOptimizer1: + Actor: optimized.production1 + SpawnActorOnCapture@ProductionOptimizer1: + Actor: optimized.production1 + Delay: 1 + +^ProductionOptimizer2: + ProvidesPrerequisite@ProductionOptimizer2: + Prerequisite: optimized.production2 + FreeActor@ProductionOptimizer2: + Actor: optimized.production2 + SpawnActorOnCapture@ProductionOptimizer2: + Actor: optimized.production2 + Delay: 1 + +^ProducesBuildings: + Inherits@QUEUEUPDATER: ^QueueUpdater + Inherits@PRIMARY: ^PrimaryBuilding + ProductionQueue@MQBLD: + Type: BuildingMQ + DisplayOrder: 1 + Group: Building + LowPowerModifier: 250 + ReadyAudio: ConstructionComplete + ReadyTextNotification: Construction complete. + BlockedAudio: NoBuild + BlockedTextNotification: Unable to build more. + LimitedAudio: BuildingInProgress + LimitedTextNotification: Unable to comply. Building in progress. + QueuedAudio: Building + OnHoldAudio: OnHold + CancelledAudio: Cancelled + ProductionQueue@MQDEF: + Type: DefenseMQ + DisplayOrder: 2 + Group: Defense + LowPowerModifier: 250 + ReadyAudio: ConstructionComplete + ReadyTextNotification: Construction complete. + BlockedAudio: NoBuild + BlockedTextNotification: Unable to build more. + LimitedAudio: BuildingInProgress + LimitedTextNotification: Unable to comply. Building in progress. + QueuedAudio: Building + OnHoldAudio: OnHold + CancelledAudio: Cancelled + Production@SQBLD: + Produces: BuildingSQ, DefenseSQ + PauseOnCondition: forceshield || being-warped + RequiresCondition: !global-multiqueuefull + Production@MQBLD: + Produces: BuildingMQ, DefenseMQ + PauseOnCondition: forceshield || being-warped + RequiresCondition: global-multiqueuefull + ProductionBar@SQBLD: + ProductionType: BuildingSQ + RequiresCondition: !global-multiqueuefull + ProductionBar@SQDEF: + ProductionType: DefenseSQ + Color: 8A8A8A + RequiresCondition: !global-multiqueuefull + ProductionBar@MQBLD: + ProductionType: BuildingMQ + RequiresCondition: global-multiqueuefull + ProductionBar@MQDEF: + ProductionType: DefenseMQ + Color: 8A8A8A + RequiresCondition: global-multiqueuefull + GrantConditionOnPrerequisite@MQF2: + Condition: global-multiqueuefull + Prerequisites: global.multiqueuefull + +^ProducesInfantry: + Inherits@QUEUEUPDATER: ^QueueUpdater + Inherits@PRIMARY: ^PrimaryBuilding + ProductionQueue@MQINF: + Type: InfantryMQ + DisplayOrder: 3 + Group: Infantry + LowPowerModifier: 250 + ReadyAudio: UnitReady + BlockedAudio: NoBuild + BlockedTextNotification: Unable to build more. + LimitedAudio: BuildingInProgress + LimitedTextNotification: Unable to comply. Building in progress. + QueuedAudio: Training + OnHoldAudio: OnHold + CancelledAudio: Cancelled + Production@SQINF: + Produces: InfantrySQ, Cyborg, Soldier, ParadropInfantry + PauseOnCondition: forceshield || being-warped + RequiresCondition: !global-multiqueue + Production@MQINF: + Produces: InfantryMQ, CyborgMQ, Cyborg, Soldier, ParadropInfantry + PauseOnCondition: forceshield || being-warped + RequiresCondition: global-multiqueue + ProductionBar@SQINF: + ProductionType: InfantrySQ + RequiresCondition: !global-multiqueue + ProductionBar@MQINF: + ProductionType: InfantryMQ + RequiresCondition: global-multiqueue + GrantExternalConditionToProduced: + Condition: produced + ProductionCostMultiplier@MQS1: + Multiplier: 300 + Prerequisites: infantry.any, global.multiqueuescaled, !optimized.production1, !optimized.production2 + ProductionCostMultiplier@MQS2: + Multiplier: 200 + Prerequisites: infantry.any, global.multiqueuescaled, optimized.production1, !optimized.production2 + LinkedProducerSource: + UpdatesUnitsProduced: + +^ProducesCyborgs: + Inherits: ^ProducesInfantry + ProductionQueue@MQINF: + Type: CyborgMQ + Production@SQINF: + Produces: InfantrySQ, Cyborg, ParadropInfantry, Upgrade + Production@MQINF: + Produces: CyborgMQ, Cyborg, ParadropInfantry, Upgrade + ProductionBar@SQINF: + ProductionType: InfantrySQ + ProductionBar@MQINF: + ProductionType: CyborgMQ + -ProductionCostMultiplier@MQS1: + -ProductionCostMultiplier@MQS2: + +^ProducesDogs: + Inherits: ^ProducesInfantry + ProductionQueue@MQINF: + Type: DogMQ + Production@SQINF: + Produces: InfantrySQ, Dog + Production@MQINF: + Produces: DogMQ, Dog + ProductionBar@SQINF: + ProductionType: InfantrySQ + ProductionBar@MQINF: + ProductionType: DogMQ + -ProductionCostMultiplier@MQS1: + -ProductionCostMultiplier@MQS2: + +^ProducesVehicles: + Inherits@QUEUEUPDATER: ^QueueUpdater + Inherits@PRIMARY: ^PrimaryBuilding + ProductionQueue@MQVEH: + Type: VehicleMQ + DisplayOrder: 4 + Group: Vehicle + LowPowerModifier: 250 + ReadyAudio: UnitReady + BlockedAudio: NoBuild + BlockedTextNotification: Unable to build more. + LimitedAudio: BuildingInProgress + LimitedTextNotification: Unable to comply. Building in progress. + QueuedAudio: Building + OnHoldAudio: OnHold + CancelledAudio: Cancelled + Production@SQVEH: + Produces: VehicleSQ, ParadropVehicle + PauseOnCondition: forceshield || being-warped + RequiresCondition: !global-multiqueue + Production@MQVEH: + Produces: VehicleMQ, ParadropVehicle + PauseOnCondition: forceshield || being-warped + RequiresCondition: global-multiqueue + ProductionBar@SQVEH: + ProductionType: VehicleSQ + RequiresCondition: !global-multiqueue + ProductionBar@MQVEH: + ProductionType: VehicleMQ + RequiresCondition: global-multiqueue + ProductionCostMultiplier@MQS1: + Multiplier: 170 + Prerequisites: vehicles.any, global.multiqueuescaled, !optimized.production1, !optimized.production2 + ProductionCostMultiplier@MQS2: + Multiplier: 135 + Prerequisites: vehicles.any, global.multiqueuescaled, optimized.production1, !optimized.production2 + GrantExternalConditionToProduced: + Condition: produced + LinkedProducerSource: + UpdatesUnitsProduced: + +^ProducesNaval: + Inherits@QUEUEUPDATER: ^QueueUpdater + Inherits@PRIMARY: ^PrimaryBuilding + ProductionQueue@MQNAV: + Type: ShipMQ + DisplayOrder: 5 + Group: Ship + LowPowerModifier: 250 + ReadyAudio: UnitReady + BlockedAudio: NoBuild + BlockedTextNotification: Unable to build more. + LimitedAudio: BuildingInProgress + LimitedTextNotification: Unable to comply. Building in progress. + QueuedAudio: Building + OnHoldAudio: OnHold + CancelledAudio: Cancelled + Production@SQNAV: + Produces: ShipSQ, Boat, Submarine + PauseOnCondition: forceshield || being-warped + RequiresCondition: !global-multiqueue + Production@MQNAV: + Produces: ShipMQ, Boat, Submarine + PauseOnCondition: forceshield || being-warped + RequiresCondition: global-multiqueue + ProductionBar@SQNAV: + ProductionType: ShipSQ + RequiresCondition: !global-multiqueue + ProductionBar@MQNAV: + ProductionType: ShipMQ + RequiresCondition: global-multiqueue + UpdatesUnitsProduced: + +^ProducesUpgrades: + Inherits@QUEUEUPDATER: ^QueueUpdater + Production@UPG: + Produces: Upgrade + PauseOnCondition: forceshield || being-warped + ProductionBar@UPG: + ProductionType: Upgrade + Exit@UPG: + ProductionTypes: Upgrade + ProvidesPrerequisite@UpgradesProducer: + Prerequisite: upgrades.producer + RequiresCondition: !(forceshield || being-warped) + -GrantConditionOnPrerequisite@MQF: + -GrantConditionOnPrerequisite@MQS: + +^ProducesAircraft: + Inherits@QUEUEUPDATER: ^QueueUpdater + Inherits@PRIMARY: ^PrimaryBuilding + ProductionQueue@MQAIR: + Type: AircraftMQ + DisplayOrder: 6 + Group: Aircraft + LowPowerModifier: 250 + ReadyAudio: UnitReady + BlockedAudio: NoBuild + BlockedTextNotification: Unable to build more. + LimitedAudio: BuildingInProgress + LimitedTextNotification: Unable to comply. Building in progress. + QueuedAudio: Building + OnHoldAudio: OnHold + CancelledAudio: Cancelled + ProvidesPrerequisite@any: + Prerequisite: aircraft.any + Production@SQAIR: + Produces: AircraftSQ, Plane, Helicopter + PauseOnCondition: forceshield || being-warped + RequiresCondition: !global-multiqueue + Production@MQAIR: + Produces: AircraftMQ, Plane, Helicopter + PauseOnCondition: forceshield || being-warped + RequiresCondition: global-multiqueue + ProductionBar@SQAIR: + ProductionType: AircraftSQ + RequiresCondition: !global-multiqueue + ProductionBar@MQAIR: + ProductionType: AircraftMQ + RequiresCondition: global-multiqueue + ProductionCostMultiplier@MQS1: + Multiplier: 160 + Prerequisites: aircraft.any, global.multiqueuescaled, !optimized.production1, !optimized.production2 + ProductionCostMultiplier@MQS2: + Multiplier: 130 + Prerequisites: aircraft.any, global.multiqueuescaled, optimized.production1, !optimized.production2 + GrantExternalConditionToProduced: + Condition: produced + UpdatesUnitsProduced: + +^ProducesHelicopters: + Inherits@AIR: ^ProducesAircraft + Production@SQAIR: + Produces: AircraftSQ, Helicopter + Production@MQAIR: + Produces: AircraftMQ, Helicopter diff --git a/mods/ca/rules/encyclopedia.yaml b/mods/ca/rules/encyclopedia.yaml new file mode 100644 index 0000000000..6779afcf77 --- /dev/null +++ b/mods/ca/rules/encyclopedia.yaml @@ -0,0 +1,2740 @@ +# For encyclopedia entries not tied to specific units etc. + +encyclopedia.tips.general: + Interactable: + AlwaysVisible: + Tooltip: + Name: General + Encyclopedia: + Category: Other/Tips + EncyclopediaExtras: + HideNotProducible: true + Description: encyclopedia-tips-general-description + +^EffectPreview: + Inherits: ^PreviewDummy + Encyclopedia: + Scale: 2 + EncyclopediaExtras: + HideNotProducible: true + +^VehicleEffectPreview: + Inherits: ^EffectPreview + RenderSprites: + Image: 4tnk + WithFacingSpriteBody: + WithSpriteTurret: + Sequence: turret + Turreted: + +^InfantryEffectPreview: + Inherits: ^EffectPreview + RenderSprites: + Image: e1 + PlayerPalette: playertd + WithInfantryBody: + IdleSequences: idle1,idle2 + StandSequences: stand,stand2 + QuantizeFacingsFromSequence: + Sequence: stand + +^SupportPowerPreview: + Inherits: ^InvisibleDummy + Buildable: + BuildDurationModifier: 100 + RenderSprites: + Image: icon + Encyclopedia: + EncyclopediaExtras: + HideNotProducible: true + +# Allied Support Powers + +encyclopedia.power.veilofwar: + Inherits: ^SupportPowerPreview + Buildable: + Icon: veilofwar + IconPalette: chrometd + Prerequisites: anyradar + BuildDuration: 7500 + Tooltip: + Name: Veil of War + Encyclopedia: + Category: Allies/Support Powers + EncyclopediaExtras: + Description: Creates an expanding area of shroud, reducing the vision and weapon range of enemy units and defenses. + Subfaction: england + +encyclopedia.power.clustermines: + Inherits: ^SupportPowerPreview + Buildable: + Icon: cmines + Prerequisites: anyradar + BuildDuration: 6750 + Tooltip: + Name: Cluster Mines + Encyclopedia: + Category: Allies/Support Powers + EncyclopediaExtras: + Description: Sends a cargo plane to drop a minefield at the target location. + Subfaction: france + +encyclopedia.power.strafe: + Inherits: ^SupportPowerPreview + Buildable: + Icon: strafe + Prerequisites: hpad + BuildDuration: 7500 + Tooltip: + Name: Strafing Run + Encyclopedia: + Category: Allies/Support Powers + EncyclopediaExtras: + Description: Calls in P51 ground attack planes to perform strafing runs on the target. + Subfaction: usa + +encyclopedia.power.cryostorm: + Inherits: ^SupportPowerPreview + Buildable: + Icon: cryostorm + Prerequisites: alhq + BuildDuration: 8250 + Tooltip: + Name: Cryostorm + Encyclopedia: + Category: Allies/Support Powers + EncyclopediaExtras: + Description: Creates a turbulent area of extreme cold, reducing movement speed and increasing damage taken. + AdditionalInfo: Requires Sweden Coalition. + +encyclopedia.power.heliosbomb: + Inherits: ^SupportPowerPreview + Buildable: + Icon: heliosbomb + IconPalette: caneon + Prerequisites: alhq + BuildDuration: 10500 + Tooltip: + Name: Helios Bomb + Encyclopedia: + Category: Allies/Support Powers + EncyclopediaExtras: + Description: Calls in a bomber which drops a Helios bomb, blinding units in a large area. + AdditionalInfo: Requires Greece Coalition. + +encyclopedia.power.bsky: + Inherits: ^SupportPowerPreview + Buildable: + Icon: bsky + Prerequisites: alhq + BuildDuration: 9000 + Tooltip: + Name: Black Sky Strike + Encyclopedia: + Category: Allies/Support Powers + EncyclopediaExtras: + Description: Fires long range guided missiles at multiple ground targets prioritized by value. Tracking can be lost if targets move far enough from their initial location. + AdditionalInfo: Requires Korea Coalition. + +encyclopedia.power.spysatellite: + Inherits: ^SupportPowerPreview + Buildable: + Icon: gps + Prerequisites: atek + BuildDuration: 5250 + Tooltip: + Name: Spy Satellite + Encyclopedia: + Category: Allies/Support Powers + EncyclopediaExtras: + Description: Periodically reveals the entire map for a short time (activated automatically). + +encyclopedia.power.tempinc: + Inherits: ^SupportPowerPreview + Buildable: + Icon: tempinc + Prerequisites: pdox + BuildDuration: 7500 + Tooltip: + Name: Temporal Incursion + Encyclopedia: + Category: Allies/Support Powers + EncyclopediaExtras: + Description: Summons reinforcements from the future. Units return to their origin time after a short time. + Subfaction: germany + +encyclopedia.power.timewarp: + Inherits: ^SupportPowerPreview + Buildable: + Icon: timewarp + Prerequisites: pdox + BuildDuration: 4500 + Tooltip: + Name: Time Warp + Encyclopedia: + Category: Allies/Support Powers + EncyclopediaExtras: + Description: Disrupts time and space at the target location. Affected units & structures are frozen in time, unable to act, but immune to damage. + Subfaction: germany + +encyclopedia.power.chronoshift: + Inherits: ^SupportPowerPreview + Buildable: + Icon: chrono + Prerequisites: pdox + BuildDuration: 4500 + Tooltip: + Name: Chronoshift + Encyclopedia: + Category: Allies/Support Powers + EncyclopediaExtras: + Description: Teleports up to 9 selected vehicles to a targeted location, returning them to their original location after a short time.\n\n• If killed, units are returned with 20% health\n• Units with larger health pools take additional damage\n• Passengers cannot be unloaded\n• Enemy units are teleported for reduced duration + +encyclopedia.power.lightningstorm: + Inherits: ^SupportPowerPreview + Buildable: + Icon: storm + Prerequisites: weat + BuildDuration: 13500 + Tooltip: + Name: Lightning Storm + Encyclopedia: + Category: Allies/Support Powers + EncyclopediaExtras: + Description: Initiate a Lightning Storm which deals heavy damage over a large area. + +# Soviet Support Powers + +encyclopedia.power.spyplane: + Inherits: ^SupportPowerPreview + Buildable: + Icon: spyplane + Prerequisites: anyradar + BuildDuration: 3750 + Tooltip: + Name: Spy Plane + Encyclopedia: + Category: Soviets/Support Powers + EncyclopediaExtras: + Description: Dispatches a spy plane that reveals the target location for a limited time. + +encyclopedia.power.paratroopers: + Inherits: ^SupportPowerPreview + Buildable: + Icon: paratroopers + Prerequisites: anyradar + BuildDuration: 7500 + Tooltip: + Name: Paratroopers + Encyclopedia: + Category: Soviets/Support Powers + EncyclopediaExtras: + Description: Dispatches a Halo transport to drop a squad of infantry anywhere on the map. + +encyclopedia.power.stormtroopers: + Inherits: ^SupportPowerPreview + Buildable: + Icon: stormtroopers + Prerequisites: anyradar + BuildDuration: 9000 + Tooltip: + Name: Storm-troopers + Encyclopedia: + Category: Soviets/Support Powers + EncyclopediaExtras: + Description: Dispatches a Halo transport to drop a squad of Shock Troopers anywhere on the map. + Subfaction: russia + +encyclopedia.power.parabombs: + Inherits: ^SupportPowerPreview + Buildable: + Icon: parabombs + Prerequisites: afld + BuildDuration: 7500 + Tooltip: + Name: Parabombs + Encyclopedia: + Category: Soviets/Support Powers + EncyclopediaExtras: + Description: Calls in a Badger bomber which drops parachuted bombs on your target. + Subfaction: russia + +encyclopedia.power.carpetbomb: + Inherits: ^SupportPowerPreview + Buildable: + Icon: carpetbomb + Prerequisites: afld + BuildDuration: 10500 + Tooltip: + Name: Carpet Bomb + Encyclopedia: + Category: Soviets/Support Powers + EncyclopediaExtras: + Description: Calls in a squad of Badgers which drop bombs on your target. + Subfaction: ukraine + +encyclopedia.power.atomicbombair: + Inherits: ^SupportPowerPreview + Buildable: + Icon: abombair + Prerequisites: afld + BuildDuration: 10500 + Tooltip: + Name: Atomic Bomb (Air) + Encyclopedia: + Category: Soviets/Support Powers + EncyclopediaExtras: + Description: Calls in a Badger bomber which drops an atom bomb on your target. + Subfaction: iraq + +encyclopedia.power.mutabomb: + Inherits: ^SupportPowerPreview + Buildable: + Icon: mutabomb + IconPalette: chromes + Prerequisites: anyradar + BuildDuration: 6750 + Tooltip: + Name: Muta Bomb + Encyclopedia: + Category: Soviets/Support Powers + EncyclopediaExtras: + Description: Calls in a Badger bomber which drops a genetic mutation bomb on your target, transforming infantry into Brutes under your control. + Subfaction: yuri + +encyclopedia.power.chaosbombs: + Inherits: ^SupportPowerPreview + Buildable: + Icon: chaosbombs + Prerequisites: afld + BuildDuration: 8250 + Tooltip: + Name: Chaos Bombs + Encyclopedia: + Category: Soviets/Support Powers + EncyclopediaExtras: + Description: Calls in a Badger bomber which drops parachuted chaos bombs on your target. + Subfaction: yuri + +encyclopedia.power.atomicammo: + Inherits: ^SupportPowerPreview + Buildable: + Icon: atomicammo + Prerequisites: npwr + BuildDuration: 4500 + Tooltip: + Name: Atomic Shells + Encyclopedia: + Category: Soviets/Support Powers + EncyclopediaExtras: + Description: Grants tanks a limited supply of atomic shells (also for a limited duration).\n\nAffects Soviet tanks only (Heavy/Rhino Tank, Lasher/Thrasher Tank, Siege Tank, Mammoth Tank, Overlord Tank, Apocalypse Tank, Nuke Cannon) + +encyclopedia.power.heroes: + Inherits: ^SupportPowerPreview + Buildable: + Icon: heroes + BuildDuration: 6000 + Tooltip: + Name: Heroes of the Union + Encyclopedia: + Category: Soviets/Support Powers + EncyclopediaExtras: + Description: Targeted basic infantry units become Heroes of the Union, significantly increasing their damage, speed, range and resilience.\n\nCan affect Rifle Infantry, Rocket Soldiers, Grenadiers and Flamethrowers. + AdditionalInfo: Requires Infantry Doctrine. + +encyclopedia.power.tankdrop: + Inherits: ^SupportPowerPreview + Buildable: + Icon: tankdrop + BuildDuration: 13500 + Tooltip: + Name: Tank Drop + Encyclopedia: + Category: Soviets/Support Powers + EncyclopediaExtras: + Description: Dispatches cargo planes to air drop tanks at the target location. + AdditionalInfo: Requires Armor Doctrine. + +encyclopedia.power.killzone: + Inherits: ^SupportPowerPreview + Buildable: + Icon: killzone + BuildDuration: 4500 + Tooltip: + Name: Kill Zone + Encyclopedia: + Category: Soviets/Support Powers + EncyclopediaExtras: + Description: Calls in a Spy Plane which marks a target area. Any enemy units within it take increased damage. + AdditionalInfo: Requires Artillery Doctrine. + +encyclopedia.power.ironcurtain: + Inherits: ^SupportPowerPreview + Buildable: + Icon: invuln + Prerequisites: iron + BuildDuration: 4500 + Tooltip: + Name: Iron Curtain + Encyclopedia: + Category: Soviets/Support Powers + EncyclopediaExtras: + Description: Makes selected friendly vehicles temporarily invulnerable. + +encyclopedia.power.atombomb: + Inherits: ^SupportPowerPreview + Buildable: + Icon: abomb + Prerequisites: mslo + BuildDuration: 13500 + Tooltip: + Name: Atom Bomb + Encyclopedia: + Category: Soviets/Support Powers + EncyclopediaExtras: + Description: Launches a devastating atomic bomb at the target location, dealing heavy damage over a large area. + +# GDI Support Powers + +encyclopedia.power.recondrone: + Inherits: ^SupportPowerPreview + Buildable: + Icon: uavicon + Prerequisites: anyradar + BuildDuration: 3750 + Tooltip: + Name: Recon Drone + Encyclopedia: + Category: GDI/Support Powers + EncyclopediaExtras: + Description: A drone flies across the map, revealing the area as it passes.\n\nDetects cloaked units. + +encyclopedia.power.xodrop: + Inherits: ^SupportPowerPreview + Buildable: + Icon: xodrop + Prerequisites: anyradar + BuildDuration: 9750 + Tooltip: + Name: X-O Drop + Encyclopedia: + Category: GDI/Support Powers + EncyclopediaExtras: + Description: An Orca transport drops a squad of X-O Powersuits at the target location. + Subfaction: talon + +encyclopedia.power.droppods: + Inherits: ^SupportPowerPreview + Buildable: + Icon: droppods + IconPalette: chrometd + Prerequisites: anyradar + BuildDuration: 4500 + Tooltip: + Name: Drop Pods + Encyclopedia: + Category: GDI/Support Powers + EncyclopediaExtras: + Description: Instantly deploys a small team of elite soldiers at the target location via orbital drop pods. + Subfaction: zocom + +encyclopedia.power.reinforcements: + Inherits: ^SupportPowerPreview + Buildable: + Icon: orcaca + IconPalette: chrometd + Prerequisites: anyradar + BuildDuration: 6000 + Tooltip: + Name: Reinforcements + Encyclopedia: + Category: GDI/Support Powers + EncyclopediaExtras: + Description: An Orca Carryall drops an APC containing an infantry squad at the target location. + Subfaction: eagle + +encyclopedia.power.interceptors: + Inherits: ^SupportPowerPreview + Buildable: + Icon: airsupport + Prerequisites: afld.gdi + BuildDuration: 10500 + Tooltip: + Name: Interceptors + Encyclopedia: + Category: GDI/Support Powers + EncyclopediaExtras: + Description: A squadron of Interceptors provides air cover over the target area, engaging any enemy aircraft within range. + +encyclopedia.power.naniterepair: + Inherits: ^SupportPowerPreview + Buildable: + Icon: nrepair + Prerequisites: gtek + BuildDuration: 6750 + Tooltip: + Name: Nanite Repair + Encyclopedia: + Category: GDI/Support Powers + EncyclopediaExtras: + Description: Repairs selected damaged vehicles over time. + Subfaction: arc + +encyclopedia.power.surgicalstrike: + Inherits: ^SupportPowerPreview + Buildable: + Icon: surgicalstrike + IconPalette: chrometd + Prerequisites: eye + BuildDuration: 6000 + Tooltip: + Name: Surgical Strike + Encyclopedia: + Category: GDI/Support Powers + EncyclopediaExtras: + Description: Initiate an precision Ion Cannon strike which deals instant damage to a small area. + Subfaction: zocom + +encyclopedia.power.firestorm: + Inherits: ^SupportPowerPreview + Buildable: + Icon: fstorm + IconPalette: chrometd + Prerequisites: upgc + BuildDuration: 7500 + Tooltip: + Name: Firestorm + Encyclopedia: + Category: GDI/Support Powers + EncyclopediaExtras: + Description: Fires a barrage of rockets at the target area. + AdditionalInfo: Requires Bombardment Strategy. + +encyclopedia.power.advancedradar: + Inherits: ^SupportPowerPreview + Buildable: + Icon: arscan + IconPalette: chrometd + Prerequisites: upgc + BuildDuration: 4500 + Tooltip: + Name: Advanced Radar + Encyclopedia: + Category: GDI/Support Powers + EncyclopediaExtras: + Description: Reveals the location of enemy structures & units through the fog of war. + AdditionalInfo: Requires Seek & Destroy Strategy. + +encyclopedia.power.naniteshield: + Inherits: ^SupportPowerPreview + Buildable: + Icon: nshield + Prerequisites: upgc + BuildDuration: 6000 + Tooltip: + Name: Nanite Shield + Encyclopedia: + Category: GDI/Support Powers + EncyclopediaExtras: + Description: Reduces the damage taken by all vehicles in the target area. + AdditionalInfo: Requires Hold the Line Strategy. + +encyclopedia.power.empmissile: + Inherits: ^SupportPowerPreview + Buildable: + Icon: empmissile + Prerequisites: patr + BuildDuration: 4500 + Tooltip: + Name: EMP Missile + Encyclopedia: + Category: GDI/Support Powers + EncyclopediaExtras: + Description: Launches an EMP missile that disables vehicles and structures in the target area. + +encyclopedia.power.ioncannon: + Inherits: ^SupportPowerPreview + Buildable: + Icon: ioncannon + Prerequisites: eye + BuildDuration: 13500 + Tooltip: + Name: Ion Cannon + Encyclopedia: + Category: GDI/Support Powers + EncyclopediaExtras: + Description: Fires a devastating ion cannon beam at the target location. + +# Nod Support Powers + +encyclopedia.power.hacksat: + Inherits: ^SupportPowerPreview + Buildable: + Icon: hacksat + Prerequisites: anyradar + BuildDuration: 4500 + Tooltip: + Name: Hack Satellite + Encyclopedia: + Category: Nod/Support Powers + EncyclopediaExtras: + Description: Reveals the targeted area for a short time. + +encyclopedia.power.airdrop: + Inherits: ^SupportPowerPreview + Buildable: + Icon: airdropicon + Prerequisites: airs + BuildDuration: 13500 + Tooltip: + Name: Air Drop + Encyclopedia: + Category: Nod/Support Powers + EncyclopediaExtras: + Description: Dispatches cargo planes to air drop tanks at the target location. Units dependent on subfaction. + +encyclopedia.power.substrike: + Inherits: ^SupportPowerPreview + Buildable: + Icon: substrike + Prerequisites: weap.td + BuildDuration: 12000 + Tooltip: + Name: Subterranean Strike + Encyclopedia: + Category: Nod/Support Powers + EncyclopediaExtras: + Description: Deploys a squad of infantry via Subterranean APC. + Subfaction: marked + +encyclopedia.power.infbomb: + Inherits: ^SupportPowerPreview + Buildable: + Icon: infbomb + IconPalette: chrometd + Prerequisites: anyradar + BuildDuration: 9750 + Tooltip: + Name: Inferno Bomb + Encyclopedia: + Category: Nod/Support Powers + EncyclopediaExtras: + Description: A B2 Stealth Bomber drops inferno bombs on your target. + Subfaction: blackh + +encyclopedia.power.cashhack: + Inherits: ^SupportPowerPreview + Buildable: + Icon: chack + Prerequisites: anyradar + BuildDuration: 6000 + Tooltip: + Name: Cash Hack + Encyclopedia: + Category: Nod/Support Powers + EncyclopediaExtras: + Description: Steal up to $2000 credits from a targeted enemy Refinery. + Subfaction: legion + +encyclopedia.power.shadowteam: + Inherits: ^SupportPowerPreview + Buildable: + Icon: shadteam + Prerequisites: anyradar + BuildDuration: 6750 + Tooltip: + Name: Shadow Team + Encyclopedia: + Category: Nod/Support Powers + EncyclopediaExtras: + Description: Calls for a Shadow Team; three stealth infantry that arrive via glider armed with grenades and a machine pistol.\n\nOperatives can be ordered to land via the deploy command. + Subfaction: shadow + +encyclopedia.power.frenzy: + Inherits: ^SupportPowerPreview + Buildable: + Icon: frenzy + Prerequisites: tmpl + BuildDuration: 6750 + Tooltip: + Name: Frenzy + Encyclopedia: + Category: Nod/Support Powers + EncyclopediaExtras: + Description: Increases the movement speed and rate of fire of targeted units for a limited time.\n\nWarning: Units are weakened for a short time after frenzy wears off. + Subfaction: marked + +encyclopedia.power.techhack: + Inherits: ^SupportPowerPreview + Buildable: + Icon: techhack + Prerequisites: tmpl + BuildDuration: 18000 + Tooltip: + Name: Tech Hack + Encyclopedia: + Category: Nod/Support Powers + EncyclopediaExtras: + Description: Hack the targeted enemy production structure, providing access to a unit developed using enemy technology.\n\nFor infantry, vehicle and air production respectively: \n\n• Allies: Cryo Mortar, Reckoner, Phantom\n• Soviets: Cyberdog, Cyclops, Kamov\n• GDI: Sonic Mortar, Basilisk, Shade\n• Nod: Chem Mortar, Mantis, Vertigo\n• Scrin: Cyberscrin, Viper, Manticore + Subfaction: legion + +encyclopedia.power.assassinsquad: + Inherits: ^SupportPowerPreview + Buildable: + Icon: assassinsquad + IconPalette: chrometd + BuildDuration: 6000 + Tooltip: + Name: Assassin Squad + Encyclopedia: + Category: Nod/Support Powers + EncyclopediaExtras: + Description: Deploy a squad of Assassins that can snipe infantry from long range and destroy buildings with C4.\n\nTarget infantry production structure to deploy. + AdditionalInfo: Requires Wrath Covenant. + +encyclopedia.power.hackercell: + Inherits: ^SupportPowerPreview + Buildable: + Icon: hackercell + BuildDuration: 6000 + Tooltip: + Name: Hacker Cell + Encyclopedia: + Category: Nod/Support Powers + EncyclopediaExtras: + Description: Deploy a squad of Hackers that can remotely capture buildings and take control of defenses.\n\nTarget infantry production structure to deploy. + AdditionalInfo: Requires Unity Covenant. + +encyclopedia.power.confessorcabal: + Inherits: ^SupportPowerPreview + Buildable: + Icon: confessorcabal + IconPalette: chrometd + BuildDuration: 6000 + Tooltip: + Name: Confessor Cabal + Encyclopedia: + Category: Nod/Support Powers + EncyclopediaExtras: + Description: Deploy a Confessor Cabal which is able to construct Idols of Kane that buffs allies and debuffs enemies.\n\nTarget infantry production structure to deploy. + AdditionalInfo: Requires Zeal Covenant. + +encyclopedia.power.clustermissile: + Inherits: ^SupportPowerPreview + Buildable: + Icon: clustermissile + IconPalette: chrometd + Prerequisites: tmpl + BuildDuration: 10500 + Tooltip: + Name: Cluster Missile + Encyclopedia: + Category: Nod/Support Powers + EncyclopediaExtras: + Description: Launches a Cluster Missile which deals heavy damage at the target location. + +encyclopedia.power.tibstealth: + Inherits: ^SupportPowerPreview + Buildable: + Icon: invis + IconPalette: chrometd + Prerequisites: sgen + BuildDuration: 4500 + Tooltip: + Name: Tiberium Stealth + Encyclopedia: + Category: Nod/Support Powers + EncyclopediaExtras: + Description: Makes selected vehicles and structures temporarily invisible.\n\nWarning: Harmful to non-cyborg infantry.\n\nHazmat Suits upgrade makes allies immune to damage and enemies take 50% damage. + +encyclopedia.power.chemmissile: + Inherits: ^SupportPowerPreview + Buildable: + Icon: chemmissile + IconPalette: chrometd + Prerequisites: mslo.nod + BuildDuration: 13500 + Tooltip: + Name: Chemical Missile + Encyclopedia: + Category: Nod/Support Powers + EncyclopediaExtras: + Description: Launches an deadly Chemical Missile. Deals heavy damage and creates toxic clouds which are extremely harmful to infantry.\n + +# Scrin Support Powers + + +encyclopedia.power.resourcescan: + Inherits: ^SupportPowerPreview + Buildable: + Icon: rescanpower + Prerequisites: anyradar + BuildDuration: 7500 + Tooltip: + Name: Resource Scan + Encyclopedia: + Category: Scrin/Support Powers + EncyclopediaExtras: + Description: Reveals the area surrounding all resources on the map. + +encyclopedia.power.ichorspike: + Inherits: ^SupportPowerPreview + Buildable: + Icon: ichorspike + IconPalette: chromes + BuildDuration: 6000 + Tooltip: + Name: Ichor Spike + Encyclopedia: + Category: Scrin/Support Powers + EncyclopediaExtras: + Description: Creates an Ichor Spike at the target location. Resources within its area of influence grow and spread faster.\n\nAlso empowers units with Resource Conversion upgrade. + AdditionalInfo: Requires Loyalist Allegiance. + +encyclopedia.power.colonyspike: + Inherits: ^SupportPowerPreview + Buildable: + Icon: colonyspike + IconPalette: chromes + BuildDuration: 7500 + Tooltip: + Name: Colony Spike + Encyclopedia: + Category: Scrin/Support Powers + EncyclopediaExtras: + Description: Creates a Colony Spike at the target location. Enables production of non-defensive structures.\n\nWhen fully charged allows non-defensive structures to be built nearby.\n\nMust be built within range of a Colony Platform. + AdditionalInfo: Requires Rebel Allegiance. + +encyclopedia.power.voidspike: + Inherits: ^SupportPowerPreview + Buildable: + Icon: voidspike + IconPalette: chromes + BuildDuration: 6000 + Tooltip: + Name: Voidspike + Encyclopedia: + Category: Scrin/Support Powers + EncyclopediaExtras: + Description: Creates a Voidspike at the target location. Gradually transforms nearby resources into Black Tiberium which is devoid of most of its useful properties.\n\nDamages nearby enemy units. + AdditionalInfo: Requires Malefic Allegiance. + +encyclopedia.power.ionsurge: + Inherits: ^SupportPowerPreview + Buildable: + Icon: ionsurgepower + IconPalette: chromes + Prerequisites: anyradar + BuildDuration: 6750 + Tooltip: + Name: Ion Surge + Encyclopedia: + Category: Scrin/Support Powers + EncyclopediaExtras: + Description: Increases the movement speed of all friendly units passing through the target area. + Subfaction: traveler + +encyclopedia.power.stormspikepower: + Inherits: ^SupportPowerPreview + Buildable: + Icon: stormspikepower + IconPalette: chromes + Prerequisites: anyradar + BuildDuration: 7500 + Tooltip: + Name: Storm Spike + Encyclopedia: + Category: Scrin/Support Powers + EncyclopediaExtras: + Description: Creates a temporary Storm Column defensive structure at the target location. + Subfaction: reaper + +encyclopedia.power.buzzerswarm: + Inherits: ^SupportPowerPreview + Buildable: + Icon: buzzpower + IconPalette: chromes + Prerequisites: anyradar + BuildDuration: 7500 + Tooltip: + Name: Buzzer Swarm + Encyclopedia: + Category: Scrin/Support Powers + EncyclopediaExtras: + Description: Spawns a controllable swarm which blinds and damages anything nearby; particularly harmful to infantry. + Subfaction: harbinger + +encyclopedia.power.ichorseed: + Inherits: ^SupportPowerPreview + Buildable: + Icon: ichorpower + Prerequisites: scrt + BuildDuration: 6000 + Tooltip: + Name: Ichor Seed + Encyclopedia: + Category: Scrin/Support Powers + EncyclopediaExtras: + Description: Grows Tiberium at selected location. + +encyclopedia.power.greatercoalescence: + Inherits: ^SupportPowerPreview + Buildable: + Icon: grclpower + Prerequisites: scrt + BuildDuration: 6000 + Tooltip: + Name: Greater Coalescence + Encyclopedia: + Category: Scrin/Support Powers + EncyclopediaExtras: + Description: Spawns a controllable biomass which heals nearby allies and sustains itself by feeding off enemies.\n\nFeeding from power plants will shut them down temporarily. + Subfaction: collector + +encyclopedia.power.gateway: + Inherits: ^SupportPowerPreview + Buildable: + Icon: gateway + IconPalette: chromes + Prerequisites: scrt + BuildDuration: 6000 + Tooltip: + Name: Gateway + Encyclopedia: + Category: Scrin/Support Powers + EncyclopediaExtras: + Description: Creates a Gateway at the target location. Acts as the exit for any\n targeted infantry or vehicle production structure.\n\nRequires target location to be within vision. + AdditionalInfo: Requires Rebel Allegiance. + +encyclopedia.power.anathemapower: + Inherits: ^SupportPowerPreview + Buildable: + Icon: anathema + IconPalette: chromes + Prerequisites: scrt + BuildDuration: 3000 + Tooltip: + Name: Anathema + Encyclopedia: + Category: Scrin/Support Powers + EncyclopediaExtras: + Description: Targeted vehicle greatly increases in power over time. After 30 seconds the unit explodes. + AdditionalInfo: Requires Malefic Allegiance. + +encyclopedia.power.owrath: + Inherits: ^SupportPowerPreview + Buildable: + Icon: owrath + IconPalette: chromes + Prerequisites: scrt + BuildDuration: 10500 + Tooltip: + Name: Overlord's Wrath + Encyclopedia: + Category: Scrin/Support Powers + EncyclopediaExtras: + Description: A Tiberium meteor strikes the target location dealing heavy damage and creating a patch of Tiberium. + AdditionalInfo: Requires Loyalist Allegiance. + +encyclopedia.power.fleetrecall: + Inherits: ^SupportPowerPreview + Buildable: + Icon: fleetrecall + IconPalette: chromes + Prerequisites: sign + BuildDuration: 5250 + Tooltip: + Name: Fleet Recall + Encyclopedia: + Category: Scrin/Support Powers + EncyclopediaExtras: + Description: Recalls all selected Scrin fleet vessels back to the Signal Transmitter.\n\nApplies to: Mothership, Planetary Assault Carrier, Devastator + +encyclopedia.power.suppression: + Inherits: ^SupportPowerPreview + Buildable: + Icon: spresspower + Prerequisites: mani + BuildDuration: 4500 + Tooltip: + Name: Suppression + Encyclopedia: + Category: Scrin/Support Powers + EncyclopediaExtras: + Description: Applies a suppression field to the target area, slowing unit movement and rate of fire. + +encyclopedia.power.rift: + Inherits: ^SupportPowerPreview + Buildable: + Icon: riftpower + Prerequisites: rfgn + BuildDuration: 13500 + Tooltip: + Name: Rift + Encyclopedia: + Category: Scrin/Support Powers + EncyclopediaExtras: + Description: Initiate a Rift which deals heavy damage over time to a large area. + +encyclopedia.power.forceshield: + Inherits: ^SupportPowerPreview + Buildable: + Icon: forceshield + Prerequisites: techcenter.any + BuildDuration: 7500 + Tooltip: + Name: Force Shield + Encyclopedia: + Category: Other/Shared Support Powers + EncyclopediaExtras: + Description: Makes selected friendly structures temporarily invulnerable.\n\nWarning: Causes power failure. + +encyclopedia.power.sendcash: + Inherits: ^SupportPowerPreview + Buildable: + Icon: sendcash + Prerequisites: anyrefinery + BuildDuration: 0 + Tooltip: + Name: Send Cash + Encyclopedia: + Category: Other/Shared Support Powers + EncyclopediaExtras: + Description: Available in team games and co-op. Sends $1000 credits to targeted ally. + +# IFV Variants +^IFVVariantPreview: + Inherits: ^EffectPreview + RenderSprites: + Image: ifv + WithFacingSpriteBody: + WithSpriteTurret: + Sequence: turret + Turreted: + Encyclopedia: + Scale: 2 + +encyclopedia.ifv.missile: + Inherits: ^IFVVariantPreview + WithSpriteTurret: + Sequence: turret-rocket + Tooltip: + Name: Missile IFV + EncyclopediaExtras: + VariantOf: IFV + VariantGroup: Allies + Description: IFV loaded with a Rocket Soldier. Fires anti-air/anti-armor missiles. + TooltipExtras: + Strengths: • Strong vs Aircraft, Heavy Armor + Weaknesses: • Weak vs Infantry + Attributes: • Passenger: Rocket Soldier + +encyclopedia.ifv.mg: + Inherits: ^IFVVariantPreview + WithSpriteTurret: + Sequence: turret-mg + Tooltip: + Name: Machine Gun IFV + EncyclopediaExtras: + VariantOf: IFV + VariantGroup: Allies + Description: IFV loaded with a Rifle Infantry. Fires a rapid machine gun. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor + Weaknesses: • Weak vs Heavy Armor, Defenses\n• Cannot attack Aircraft + Attributes: • Passenger: Rifle Infantry + +encyclopedia.ifv.engi: + Inherits: ^IFVVariantPreview + WithSpriteTurret: + Sequence: turret-engi + Tooltip: + Name: Engineer IFV + EncyclopediaExtras: + VariantOf: IFV + VariantGroup: Allies + Description: IFV loaded with an Engineer. Can capture enemy structures. + TooltipExtras: + Weaknesses: • Unarmed + Attributes: • Captures structures\n• Passenger: Engineer + +encyclopedia.ifv.med: + Inherits: ^IFVVariantPreview + Tooltip: + Name: Medical IFV + EncyclopediaExtras: + VariantOf: IFV + VariantGroup: Allies + Description: IFV loaded with a Medic. Heals nearby friendly infantry. + TooltipExtras: + Weaknesses: • Unarmed + Attributes: • Heals friendly infantry\n• Passenger: Medic + -WithSpriteTurret: + WithIdleOverlay@MEDIC: + Sequence: medic + Offset: 0,0,40 + IsDecoration: True + +encyclopedia.ifv.mech: + Inherits: ^IFVVariantPreview + WithSpriteTurret: + Sequence: turret-mech + Tooltip: + Name: Repair IFV + EncyclopediaExtras: + VariantOf: IFV + VariantGroup: Allies + Description: IFV loaded with a Mechanic. Repairs nearby friendly vehicles. + TooltipExtras: + Weaknesses: • Unarmed + Attributes: • Repairs friendly vehicles\n• Passenger: Mechanic + +encyclopedia.ifv.spy: + Inherits: ^IFVVariantPreview + Tooltip: + Name: Spy IFV + EncyclopediaExtras: + VariantOf: IFV + VariantGroup: Allies + Description: IFV loaded with a Spy. Paints targets to reveal them and make them take increased damage. + TooltipExtras: + Weaknesses: • Cannot deal damage + Attributes: • Targets are reaveled and take increased damage + -WithSpriteTurret: + WithIdleOverlay@SPINNER: + Sequence: spinner + Offset: 0,0,200 + +encyclopedia.ifv.snip: + Inherits: ^IFVVariantPreview + WithSpriteTurret: + Sequence: turret-snip + Tooltip: + Name: Sniper IFV + EncyclopediaExtras: + VariantOf: IFV + VariantGroup: Allies + Description: IFV loaded with a Sniper. Fires long-range sniper rounds. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor, Heavy Armor + Weaknesses: • Weak vs Defenses, Buildings\n• Cannot attack Aircraft + Attributes: • Passenger: Sniper + +encyclopedia.ifv.enfo: + Inherits: ^IFVVariantPreview + WithSpriteTurret: + Sequence: turret-enfo + Tooltip: + Name: Enforcer IFV + EncyclopediaExtras: + VariantOf: IFV + VariantGroup: Allies + Description: IFV loaded with an Enforcer. Fires double shotgun blasts. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor + Weaknesses: • Weak vs Heavy Armor, Defenses\n• Cannot attack Aircraft + Attributes: • Passenger: Enforcer + +encyclopedia.ifv.ggi: + Inherits: ^IFVVariantPreview + WithSpriteTurret: + Sequence: turret-ggi + Tooltip: + Name: GGI IFV + EncyclopediaExtras: + VariantOf: IFV + VariantGroup: Allies + Description: IFV loaded with a Guardian GI. Fires powerful anti-armor rounds. + TooltipExtras: + Strengths: • Strong vs Aircraft, Heavy Armor + Weaknesses: • Weak vs Infantry + Attributes: • Passenger: Guardian GI + +encyclopedia.ifv.seal: + Inherits: ^IFVVariantPreview + WithSpriteTurret: + Sequence: turret-cmdo + Tooltip: + Name: SEAL IFV + EncyclopediaExtras: + VariantOf: IFV + VariantGroup: Allies + Description: IFV loaded with a Navy SEAL. Fires heavy anti-infantry rounds. + TooltipExtras: + Strengths: • Strong vs Infantry + Weaknesses: • Cannot attack Aircraft, Vehicles, Buildings + Attributes: • Passenger: Navy SEAL + +encyclopedia.ifv.cryo: + Inherits: ^IFVVariantPreview + WithSpriteTurret: + Sequence: turret-cryo + Tooltip: + Name: Cryo IFV + EncyclopediaExtras: + VariantOf: IFV + VariantGroup: Allies + Description: IFV loaded with a Cryo Trooper. Fires freezing blasts. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor + Weaknesses: • Weak vs Buildings, Defenses\n• Cannot attack Aircraft + Attributes: • Slows enemy units and makes them take increased damage\n• Passenger: Cryo Trooper + +encyclopedia.ifv.tigr: + Inherits: ^IFVVariantPreview + WithSpriteTurret: + Sequence: turret-tigr + Tooltip: + Name: Tiger Guard IFV + EncyclopediaExtras: + VariantOf: IFV + VariantGroup: Allies + Description: IFV loaded with a Tiger Guard. Fires long range missiles. + TooltipExtras: + Strengths: • Strong vs Aircraft, Heavy Armor + Weaknesses: • Weak vs Infantry + Attributes: • Passenger: Tiger Guard + +encyclopedia.ifv.hopl: + Inherits: ^IFVVariantPreview + WithSpriteTurret: + Sequence: turret-hopl + Tooltip: + Name: Hoplite IFV + EncyclopediaExtras: + VariantOf: IFV + VariantGroup: Allies + Description: IFV loaded with a Hoplite. Fires a prism beam. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor, Buildings + Weaknesses: • Weak vs Heavy Armor\n• Cannot attack Aircraft + Attributes: • Passenger: Hoplite + +encyclopedia.ifv.cmdo: + Inherits: ^IFVVariantPreview + WithSpriteTurret: + Sequence: turret-cmdo + Tooltip: + Name: Commando IFV + EncyclopediaExtras: + VariantOf: IFV + VariantGroup: Allies + Description: IFV loaded with a Commando (Tanya/Boris/Commando). Fires rapid and powerful sniper bursts with high damage per shot. + TooltipExtras: + Strengths: • Strong vs Infantry + Weaknesses: • Cannot attack Aircraft, Vehicles, Buildings + Attributes: • Passenger: Tanya, Boris, Commando + +encyclopedia.ifv.grenade: + Inherits: ^IFVVariantPreview + WithSpriteTurret: + Sequence: turret-frag + Tooltip: + Name: Grenade IFV + EncyclopediaExtras: + VariantOf: IFV + VariantGroup: Other Factions + Description: IFV loaded with a Grenadier. Launches fragmentation grenades. + TooltipExtras: + Strengths: • Strong vs Buildings, Defenses, Light Armor + Weaknesses: • Weak vs Heavy Armor\n• Cannot attack Aircraft + Attributes: • Passenger: Grenadier + +encyclopedia.ifv.flame: + Inherits: ^IFVVariantPreview + WithSpriteTurret: + Sequence: turret-flame + Tooltip: + Name: Flamethrower IFV + EncyclopediaExtras: + VariantOf: IFV + VariantGroup: Other Factions + Description: IFV loaded with a Flamethrower. Projects devastating flames. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor, Buildings + Weaknesses: • Weak vs Heavy Armor\n• Cannot attack Aircraft + Attributes: • Passenger: Flamethrower + +encyclopedia.ifv.chem: + Inherits: ^IFVVariantPreview + WithSpriteTurret: + Sequence: turret-chem + Tooltip: + Name: Chemical IFV + EncyclopediaExtras: + VariantOf: IFV + VariantGroup: Other Factions + Description: IFV loaded with a Toxin Soldier. Sprays toxic chemicals. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor, Buildings + Weaknesses: • Weak vs Heavy Armor\n• Cannot attack Aircraft + Attributes: • Passenger: Chem Warrior + +encyclopedia.ifv.rad: + Inherits: ^IFVVariantPreview + WithSpriteTurret: + Sequence: turret-rad + Tooltip: + Name: Desolator IFV + EncyclopediaExtras: + VariantOf: IFV + VariantGroup: Other Factions + Description: IFV loaded with a Desolator. Fires a radiation beam. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor + Weaknesses: • Weak vs Heavy Armor, Defenses, Buildings\n• Cannot attack Aircraft + Attributes: • Passenger: Desolator, Rad Trooper + +encyclopedia.ifv.ivan: + Inherits: ^IFVVariantPreview + Tooltip: + Name: Explosive IFV + EncyclopediaExtras: + VariantOf: IFV + VariantGroup: Other Factions + Description: IFV loaded with a Crazy Ivan. Self-destructs on contact with the target, dealing massive damage. + TooltipExtras: + Strengths: • Strong vs Everything + Weaknesses: • Self-destructs + Attributes: • Passengers: Crazy Ivan, Burster, Terror Dog + -WithSpriteTurret: + WithIdleOverlay@IVAN: + Sequence: nuke + Offset: 0,0,40 + +encyclopedia.ifv.tes: + Inherits: ^IFVVariantPreview + Tooltip: + Name: Tesla IFV + EncyclopediaExtras: + VariantOf: IFV + VariantGroup: Other Factions + Description: IFV loaded with a Shock Trooper or Tesla Trooper. Fires a powerful tesla bolt. + TooltipExtras: + Strengths: • Strong vs Infantry, Heavy Armor, Light Armor + Weaknesses: • Cannot attack Aircraft + Attributes: • Passenger: Shock Trooper, Tesla Trooper + -WithSpriteTurret: + WithIdleOverlay@TESLA: + Sequence: tesla + +encyclopedia.ifv.psy: + Inherits: ^IFVVariantPreview + Tooltip: + Name: Psychic IFV + EncyclopediaExtras: + VariantOf: IFV + VariantGroup: Other Factions + Description: IFV loaded with Yuri or a Mastermind. Can mind control enemy units. Control is lost if passenger exits. + TooltipExtras: + Strengths: • Strong vs Infantry, Vehicles + Weaknesses: • Cannot deal damage\n• Cannot attack Aircraft + Attributes: • Can mind control enemy units\n• Control lost if passenger exits\n• Passenger: Yuri, Mastermind + -WithSpriteTurret: + WithIdleOverlay@PSYCHIC: + Sequence: psy + Palette: scrin + +encyclopedia.ifv.cmsr: + Inherits: ^IFVVariantPreview + WithSpriteTurret: + Sequence: turret-mg + Tooltip: + Name: Commissar IFV + EncyclopediaExtras: + VariantOf: IFV + VariantGroup: Other Factions + Description: IFV loaded with a Commissar. Inspires nearby friendly infantry, boosting their combat effectiveness. + TooltipExtras: + Strengths: Inspires nearby allies + Weaknesses: Unarmed + Attributes: • Passenger: Commissar + WithPreviewDecoration@CMSR: + Image: pips + Sequence: pip-cmsr + Position: TopLeft + +encyclopedia.ifv.laser: + Inherits: ^IFVVariantPreview + WithSpriteTurret: + Sequence: turret-laser + Tooltip: + Name: Laser IFV + EncyclopediaExtras: + VariantOf: IFV + VariantGroup: Other Factions + Description: IFV loaded with an Acolyte or Templar. Fires a powerful laser beam. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor + Weaknesses: • Weak vs Heavy Armor, Defenses, Buildings\n• Cannot attack Aircraft + Attributes: • Passenger: Acolyte, Templar + +encyclopedia.ifv.enli: + Inherits: ^IFVVariantPreview + WithSpriteTurret: + Sequence: turret-enli + Tooltip: + Name: Enlightened IFV + EncyclopediaExtras: + VariantOf: IFV + VariantGroup: Other Factions + Description: IFV loaded with an Enlightened. Fires a powerful particle beam. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor + Weaknesses: • Weak vs Infantry\n• Cannot attack Aircraft + Attributes: • Passenger: Enlightened + +encyclopedia.ifv.rmbc: + Inherits: ^IFVVariantPreview + WithSpriteTurret: + Sequence: turret-rmbc + Tooltip: + Name: Cyborg Elite IFV + EncyclopediaExtras: + VariantOf: IFV + VariantGroup: Other Factions + Description: IFV loaded with a Cyborg Elite. Fires a plasma cannon. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor, Infantry + Weaknesses: • Cannot attack Aircraft + +encyclopedia.ifv.bh: + Inherits: ^IFVVariantPreview + WithSpriteTurret: + Sequence: turret-bh + Tooltip: + Name: Black Hand IFV + EncyclopediaExtras: + VariantOf: IFV + VariantGroup: Other Factions + Description: IFV loaded with a Black Hand. Projects devastating anti-vehicle flames. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor + Weaknesses: • Weak vs Buildings, Defenses\n• Cannot attack Aircraft + Attributes: • Passenger: Black Hand + +encyclopedia.ifv.conf: + Inherits: ^IFVVariantPreview + WithSpriteTurret: + Sequence: turret-conf + Tooltip: + Name: Confessor IFV + EncyclopediaExtras: + VariantOf: IFV + VariantGroup: Other Factions + Description: IFV loaded with a Confessor. Fires hallucinogenic rounds. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor + Weaknesses: • Weak vs Heavy Armor, Defenses, Buildings\n• Cannot attack Aircraft + Attributes: • Explosion causes units to attack indiscriminately\n• Passenger: Confessor + +encyclopedia.ifv.reap: + Inherits: ^IFVVariantPreview + WithSpriteTurret: + Sequence: turret-reap + Tooltip: + Name: Reaper IFV + EncyclopediaExtras: + VariantOf: IFV + VariantGroup: Other Factions + Description: IFV loaded with a Cyborg Reaper. Fires anti-personnel missiles. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor, Buildings + Weaknesses: • Weak vs Heavy Armor + Attributes: • Passenger: Reaper + +encyclopedia.ifv.shad: + Inherits: ^IFVVariantPreview + WithSpriteTurret: + Sequence: turret-mg + Tooltip: + Name: Shadow IFV + EncyclopediaExtras: + VariantOf: IFV + VariantGroup: Other Factions + Description: IFV loaded with a Shadow Operative. Armed with a heavy machinegun and able to cloak. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor + Weaknesses: • Weak vs Heavy Armor, Defenses\n• Cannot attack Aircraft + Attributes: • Passenger: Shadow Operative + +encyclopedia.ifv.hack: + Inherits: ^IFVVariantPreview + Tooltip: + Name: Hacker IFV + EncyclopediaExtras: + VariantOf: IFV + VariantGroup: Other Factions + Description: IFV loaded with a Hacker. Can hack enemy defenses and buildings. Control is lost if passenger exits. + TooltipExtras: + Strengths: • Strong vs Defenses, Buildings + Weaknesses: • Cannot deal damage\n• Control lost if passenger exits + Attributes: • Passenger: Hacker + -WithSpriteTurret: + WithIdleOverlay@HACK: + Sequence: hack + +encyclopedia.ifv.ztrp: + Inherits: ^IFVVariantPreview + WithSpriteTurret: + Sequence: turret-ztrp + Tooltip: + Name: Zone Trooper IFV + EncyclopediaExtras: + VariantOf: IFV + VariantGroup: Other Factions + Description: IFV loaded with a Zone Trooper. Fires powerful railgun shots. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor, Defenses + Weaknesses: • Weak vs Infantry, Buildings\n• Cannot attack Aircraft + Attributes: • Passenger: Zone Trooper + +encyclopedia.ifv.zdef: + Inherits: ^IFVVariantPreview + WithSpriteTurret: + Sequence: turret-zdef + Tooltip: + Name: Zone Defender IFV + EncyclopediaExtras: + VariantOf: IFV + VariantGroup: Other Factions + Description: IFV loaded with a Zone Defender. Fires ion blasts. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor, Defenses + Weaknesses: • Weak vs Infantry, Buildings\n• Cannot attack Aircraft + Attributes: • Passenger: Zone Defender + +encyclopedia.ifv.zrai: + Inherits: ^IFVVariantPreview + WithSpriteTurret: + Sequence: turret-zrai + Tooltip: + Name: Zone Raider IFV + EncyclopediaExtras: + VariantOf: IFV + VariantGroup: Other Factions + Description: IFV loaded with a Zone Raider. Fires sonic grenades. + TooltipExtras: + Strengths: • Strong vs Light Armor, Buildings + Weaknesses: • Cannot attack Aircraft + Attributes: • Passenger: Zone Raider + +encyclopedia.ifv.disin: + Inherits: ^IFVVariantPreview + WithSpriteTurret: + Sequence: turret-disin + Tooltip: + Name: Disintegrator IFV + EncyclopediaExtras: + VariantOf: IFV + VariantGroup: Other Factions + Description: IFV loaded with a Disintegrator. Fires disintegration beams. + TooltipExtras: + Strengths: • Strong vs Aircraft, Heavy Armor + Weaknesses: • Weak vs Infantry + Attributes: • Passenger: Disintegrator (Scrin) + +encyclopedia.ifv.shard: + Inherits: ^IFVVariantPreview + WithSpriteTurret: + Sequence: turret-shard + Tooltip: + Name: Shard IFV + EncyclopediaExtras: + VariantOf: IFV + VariantGroup: Other Factions + Description: IFV loaded with a Ravager or Eviscerator. Fires Tiberium shards. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor + Weaknesses: • Weak vs Heavy Armor, Defenses, Buildings\n• Cannot attack Aircraft + Attributes: • Passenger: Ravager, Eviscerator + +encyclopedia.ifv.pdisc: + Inherits: ^IFVVariantPreview + WithSpriteTurret: + Sequence: turret-pdisc + Tooltip: + Name: Plasma Disc IFV + EncyclopediaExtras: + VariantOf: IFV + VariantGroup: Other Factions + Description: Fires plasma discs. + TooltipExtras: + Strengths: • Strong vs Buildings, Defenses, Heavy Armor, Light Armor + Weaknesses: • Weak vs Infantry\n• Cannot attack Aircraft + Attributes: • Passenger: Intruder, Marauder + +encyclopedia.ifv.impl: + Inherits: ^IFVVariantPreview + WithSpriteTurret: + Sequence: turret-impl + Tooltip: + Name: Impaler IFV + EncyclopediaExtras: + VariantOf: IFV + VariantGroup: Other Factions + Description: IFV loaded with an Impaler. Fires long range impaling projectiles. + TooltipExtras: + Strengths: • Strong vs Light Armor, Infantry + Weaknesses: • Weak vs Heavy Armor, Defenses\n• Cannot attack Aircraft + Attributes: • Passenger: Impaler + +encyclopedia.ifv.stlk: + Inherits: ^IFVVariantPreview + RenderSprites: + Image: ifv + WithSpriteTurret: + Sequence: turret-stlk + Palette: playerscrin + Tooltip: + Name: Stalker IFV + EncyclopediaExtras: + VariantOf: IFV + VariantGroup: Other Factions + Description: IFV loaded with a Stalker. Fires anti-infantry plasma darts and can cloak. + TooltipExtras: + Strengths: • Strong vs Light Armor, Infantry + Weaknesses: • Weak vs Heavy Armor, Defenses\n• Cannot attack Aircraft + Attributes: • Passenger: Stalker + +encyclopedia.ifv.mortchem: + Inherits: ^IFVVariantPreview + WithSpriteTurret: + Sequence: turret-mort + Tooltip: + Name: Chemical Mortar IFV + EncyclopediaExtras: + VariantOf: IFV + VariantGroup: Other Factions + Description: IFV loaded with a Chemical Mortar Infantry. Fires chemical mortar rounds that leave toxic residue. + TooltipExtras: + Strengths: • Strong vs Infantry, Buildings + Weaknesses: • Weak vs Heavy Armor\n• Cannot attack Aircraft\n• Has difficulty hitting moving targets + Attributes: • Passenger: Chemical Mortar + +encyclopedia.ifv.mortcryo: + Inherits: ^IFVVariantPreview + WithSpriteTurret: + Sequence: turret-mort + Tooltip: + Name: Cryo Mortar IFV + EncyclopediaExtras: + VariantOf: IFV + VariantGroup: Other Factions + Description: IFV loaded with a Cryo Mortar Infantry. Fires cryo mortar rounds that slow and freeze enemies. + TooltipExtras: + Strengths: • Strong vs Infantry, Buildings + Weaknesses: • Weak vs Heavy Armor\n• Cannot attack Aircraft\n• Has difficulty hitting moving targets + Attributes: • Passenger: Cryo Mortar + +encyclopedia.ifv.mortsonic: + Inherits: ^IFVVariantPreview + WithSpriteTurret: + Sequence: turret-mort + Tooltip: + Name: Sonic Mortar IFV + EncyclopediaExtras: + VariantOf: IFV + VariantGroup: Other Factions + Description: IFV loaded with a Sonic Mortar Infantry. Fires sonic mortar rounds that cause concussion. + TooltipExtras: + Strengths: • Strong vs Infantry, Buildings + Weaknesses: • Weak vs Heavy Armor\n• Cannot attack Aircraft\n• Has difficulty hitting moving targets + Attributes: • Passenger: Sonic Mortar + +# Reckoner Variants +^ReckonerVariantPreview: + Inherits: ^EffectPreview + RenderSprites: + Image: reck + WithFacingSpriteBody: + WithSpriteTurret: + Sequence: turret + Turreted: + Encyclopedia: + Scale: 2 + +encyclopedia.reck.missile: + Inherits: ^ReckonerVariantPreview + WithSpriteTurret: + Sequence: turret-rocket + Tooltip: + Name: Missile Reckoner + EncyclopediaExtras: + VariantOf: RECK + VariantGroup: Allies + Description: Reckoner loaded with a Rocket Soldier. Fires anti-air/anti-armor missiles. + TooltipExtras: + Strengths: • Strong vs Aircraft, Heavy Armor + Weaknesses: • Weak vs Infantry + Attributes: • Passenger: Rocket Soldier + +encyclopedia.reck.mg: + Inherits: ^ReckonerVariantPreview + WithSpriteTurret: + Sequence: turret-mg + Tooltip: + Name: Machine Gun Reckoner + EncyclopediaExtras: + VariantOf: RECK + VariantGroup: Allies + Description: Reckoner loaded with a Rifle Infantry. Fires a rapid machine gun. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor + Weaknesses: • Weak vs Heavy Armor, Defenses\n• Cannot attack Aircraft + Attributes: • Passenger: Rifle Infantry + +encyclopedia.reck.engi: + Inherits: ^ReckonerVariantPreview + WithSpriteTurret: + Sequence: turret-engi + Tooltip: + Name: Engineer Reckoner + EncyclopediaExtras: + VariantOf: RECK + VariantGroup: Allies + Description: Reckoner loaded with an Engineer. Can capture enemy structures. + TooltipExtras: + Weaknesses: • Unarmed + Attributes: • Captures structures\n• Passenger: Engineer + +encyclopedia.reck.med: + Inherits: ^ReckonerVariantPreview + Tooltip: + Name: Medical Reckoner + EncyclopediaExtras: + VariantOf: RECK + VariantGroup: Allies + Description: Reckoner loaded with a Medic. Heals nearby friendly infantry. + TooltipExtras: + Weaknesses: • Unarmed + Attributes: • Heals friendly infantry\n• Passenger: Medic + -WithSpriteTurret: + WithIdleOverlay@MEDIC: + Sequence: medic + Offset: 0,0,40 + IsDecoration: True + +encyclopedia.reck.mech: + Inherits: ^ReckonerVariantPreview + WithSpriteTurret: + Sequence: turret-mech + Tooltip: + Name: Repair Reckoner + EncyclopediaExtras: + VariantOf: RECK + VariantGroup: Allies + Description: Reckoner loaded with a Mechanic. Repairs nearby friendly vehicles. + TooltipExtras: + Weaknesses: • Unarmed + Attributes: • Repairs friendly vehicles\n• Passenger: Mechanic + +encyclopedia.reck.spy: + Inherits: ^ReckonerVariantPreview + Tooltip: + Name: Spy Reckoner + EncyclopediaExtras: + VariantOf: RECK + VariantGroup: Allies + Description: Reckoner loaded with a Spy. Can sabotage enemy structures and detect cloaked units. + TooltipExtras: + Weaknesses: • Cannot deal damage + Attributes: • Sabotages enemy structures:\n • Power Plants: Power outage\n • Barracks/Factory: Infantry/vehicles produced as veteran\n • Superweapons: Reset timer\n • Radar: Reset shroud\n • Helipad: Single-use paratroopers\n • Airfield/Gravity Stabilizer: Single-use airstrike\n• Passenger: Spy + -WithSpriteTurret: + WithIdleOverlay@SPINNER: + Sequence: spinner + Offset: 0,0,200 + +encyclopedia.reck.snip: + Inherits: ^ReckonerVariantPreview + WithSpriteTurret: + Sequence: turret-snip + Tooltip: + Name: Sniper Reckoner + EncyclopediaExtras: + VariantOf: RECK + VariantGroup: Allies + Description: Reckoner loaded with a Sniper. Fires long-range sniper rounds. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor, Heavy Armor + Weaknesses: • Weak vs Defenses, Buildings\n• Cannot attack Aircraft + Attributes: • Passenger: Sniper + +encyclopedia.reck.enfo: + Inherits: ^ReckonerVariantPreview + WithSpriteTurret: + Sequence: turret-enfo + Tooltip: + Name: Enforcer Reckoner + EncyclopediaExtras: + VariantOf: RECK + VariantGroup: Allies + Description: Reckoner loaded with an Enforcer. Fires double shotgun blasts. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor + Weaknesses: • Weak vs Heavy Armor, Defenses\n• Cannot attack Aircraft + Attributes: • Passenger: Enforcer + +encyclopedia.reck.ggi: + Inherits: ^ReckonerVariantPreview + WithSpriteTurret: + Sequence: turret-ggi + Tooltip: + Name: GGI Reckoner + EncyclopediaExtras: + VariantOf: RECK + VariantGroup: Allies + Description: Reckoner loaded with a Guardian GI. Fires powerful anti-armor rounds. + TooltipExtras: + Strengths: • Strong vs Aircraft, Heavy Armor + Weaknesses: • Weak vs Infantry + Attributes: • Passenger: Guardian GI + +encyclopedia.reck.seal: + Inherits: ^ReckonerVariantPreview + WithSpriteTurret: + Sequence: turret-cmdo + Tooltip: + Name: SEAL Reckoner + EncyclopediaExtras: + VariantOf: RECK + VariantGroup: Allies + Description: Reckoner loaded with a Navy SEAL. Fires heavy anti-infantry rounds. + TooltipExtras: + Strengths: • Strong vs Infantry + Weaknesses: • Cannot attack Aircraft, Vehicles, Buildings + Attributes: • Passenger: Navy SEAL + +encyclopedia.reck.cryo: + Inherits: ^ReckonerVariantPreview + WithSpriteTurret: + Sequence: turret-cryo + Tooltip: + Name: Cryo Reckoner + EncyclopediaExtras: + VariantOf: RECK + VariantGroup: Allies + Description: Reckoner loaded with a Cryo Trooper. Fires freezing blasts. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor + Weaknesses: • Weak vs Buildings, Defenses\n• Cannot attack Aircraft + Attributes: • Slows enemy units and makes them take increased damage\n• Passenger: Cryo Trooper + +encyclopedia.reck.tigr: + Inherits: ^ReckonerVariantPreview + WithSpriteTurret: + Sequence: turret-tigr + Tooltip: + Name: Tiger Guard Reckoner + EncyclopediaExtras: + VariantOf: RECK + VariantGroup: Allies + Description: Reckoner loaded with a Tiger Guard. Fires long range missiles. + TooltipExtras: + Strengths: • Strong vs Aircraft, Heavy Armor + Weaknesses: • Weak vs Infantry + Attributes: • Passenger: Tiger Guard + +encyclopedia.reck.hopl: + Inherits: ^ReckonerVariantPreview + WithSpriteTurret: + Sequence: turret-hopl + Tooltip: + Name: Hoplite Reckoner + EncyclopediaExtras: + VariantOf: RECK + VariantGroup: Allies + Description: Reckoner loaded with a Hoplite. Fires a prism beam. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor, Buildings + Weaknesses: • Weak vs Heavy Armor\n• Cannot attack Aircraft + Attributes: • Passenger: Hoplite + +encyclopedia.reck.cmdo: + Inherits: ^ReckonerVariantPreview + WithSpriteTurret: + Sequence: turret-cmdo + Tooltip: + Name: Commando Reckoner + EncyclopediaExtras: + VariantOf: RECK + VariantGroup: Allies + Description: Reckoner loaded with a Commando (Tanya/Boris/Commando). Fires rapid and powerful sniper bursts with high damage per shot. + TooltipExtras: + Strengths: • Strong vs Infantry + Weaknesses: • Cannot attack Aircraft, Vehicles, Buildings + Attributes: • Passenger: Tanya, Boris, Commando + +encyclopedia.reck.grenade: + Inherits: ^ReckonerVariantPreview + WithSpriteTurret: + Sequence: turret-frag + Tooltip: + Name: Grenade Reckoner + EncyclopediaExtras: + VariantOf: RECK + VariantGroup: Other Factions + Description: Reckoner loaded with a Grenadier. Launches fragmentation grenades. + TooltipExtras: + Strengths: • Strong vs Buildings, Defenses, Light Armor + Weaknesses: • Weak vs Heavy Armor\n• Cannot attack Aircraft + Attributes: • Passenger: Grenadier + +encyclopedia.reck.flame: + Inherits: ^ReckonerVariantPreview + WithSpriteTurret: + Sequence: turret-flame + Tooltip: + Name: Flamethrower Reckoner + EncyclopediaExtras: + VariantOf: RECK + VariantGroup: Other Factions + Description: Reckoner loaded with a Flamethrower. Projects devastating flames. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor, Buildings + Weaknesses: • Weak vs Heavy Armor\n• Cannot attack Aircraft + Attributes: • Passenger: Flamethrower + +encyclopedia.reck.chem: + Inherits: ^ReckonerVariantPreview + WithSpriteTurret: + Sequence: turret-chem + Tooltip: + Name: Chemical Reckoner + EncyclopediaExtras: + VariantOf: RECK + VariantGroup: Other Factions + Description: Reckoner loaded with a Toxin Soldier. Sprays toxic chemicals. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor, Buildings + Weaknesses: • Weak vs Heavy Armor\n• Cannot attack Aircraft + Attributes: • Passenger: Chem Warrior + +encyclopedia.reck.rad: + Inherits: ^ReckonerVariantPreview + WithSpriteTurret: + Sequence: turret-rad + Tooltip: + Name: Desolator Reckoner + EncyclopediaExtras: + VariantOf: RECK + VariantGroup: Other Factions + Description: Reckoner loaded with a Desolator. Fires a radiation beam. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor + Weaknesses: • Weak vs Heavy Armor, Defenses, Buildings\n• Cannot attack Aircraft + Attributes: • Passenger: Desolator, Rad Trooper + +encyclopedia.reck.ivan: + Inherits: ^ReckonerVariantPreview + Tooltip: + Name: Explosive Reckoner + EncyclopediaExtras: + VariantOf: RECK + VariantGroup: Other Factions + Description: Reckoner loaded with a Crazy Ivan. Self-destructs on contact with the target, dealing massive damage. + TooltipExtras: + Strengths: • Strong vs Everything + Weaknesses: • Self-destructs + Attributes: • Passengers: Crazy Ivan, Burster, Terror Dog + -WithSpriteTurret: + WithIdleOverlay@IVAN: + Sequence: nuke + Offset: 0,0,40 + +encyclopedia.reck.tes: + Inherits: ^ReckonerVariantPreview + Tooltip: + Name: Tesla Reckoner + EncyclopediaExtras: + VariantOf: RECK + VariantGroup: Other Factions + Description: Reckoner loaded with a Shock Trooper or Tesla Trooper. Fires a powerful tesla bolt. + TooltipExtras: + Strengths: • Strong vs Infantry, Heavy Armor, Light Armor + Weaknesses: • Cannot attack Aircraft + Attributes: • Passenger: Shock Trooper, Tesla Trooper + -WithSpriteTurret: + WithIdleOverlay@TESLA: + Sequence: tesla + +encyclopedia.reck.psy: + Inherits: ^ReckonerVariantPreview + Tooltip: + Name: Psychic Reckoner + EncyclopediaExtras: + VariantOf: RECK + VariantGroup: Other Factions + Description: Reckoner loaded with Yuri or a Mastermind. Can mind control enemy units. Control is lost if passenger exits. + TooltipExtras: + Strengths: • Strong vs Infantry, Vehicles + Weaknesses: • Cannot deal damage\n• Cannot attack Aircraft + Attributes: • Can mind control enemy units\n• Control lost if passenger exits\n• Passenger: Yuri, Mastermind + -WithSpriteTurret: + WithIdleOverlay@PSYCHIC: + Sequence: psy + Palette: scrin + +encyclopedia.reck.cmsr: + Inherits: ^ReckonerVariantPreview + WithSpriteTurret: + Sequence: turret-mg + Tooltip: + Name: Commissar Reckoner + EncyclopediaExtras: + VariantOf: RECK + VariantGroup: Other Factions + Description: Reckoner loaded with a Commissar. Inspires nearby friendly infantry, boosting their combat effectiveness. + TooltipExtras: + Strengths: Inspires nearby allies + Weaknesses: Unarmed + Attributes: • Passenger: Commissar + WithPreviewDecoration@CMSR: + Image: pips + Sequence: pip-cmsr + Position: TopLeft + +encyclopedia.reck.laser: + Inherits: ^ReckonerVariantPreview + WithSpriteTurret: + Sequence: turret-laser + Tooltip: + Name: Laser Reckoner + EncyclopediaExtras: + VariantOf: RECK + VariantGroup: Other Factions + Description: Reckoner loaded with an Acolyte or Templar. Fires a powerful laser beam. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor + Weaknesses: • Weak vs Heavy Armor, Defenses, Buildings\n• Cannot attack Aircraft + Attributes: • Passenger: Acolyte, Templar + +encyclopedia.reck.enli: + Inherits: ^ReckonerVariantPreview + WithSpriteTurret: + Sequence: turret-enli + Tooltip: + Name: Enlightened Reckoner + EncyclopediaExtras: + VariantOf: RECK + VariantGroup: Other Factions + Description: Reckoner loaded with an Enlightened. Fires a powerful particle beam. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor + Weaknesses: • Weak vs Infantry\n• Cannot attack Aircraft + Attributes: • Passenger: Enlightened + +encyclopedia.reck.rmbc: + Inherits: ^ReckonerVariantPreview + WithSpriteTurret: + Sequence: turret-rmbc + Tooltip: + Name: Cyborg Elite Reckoner + EncyclopediaExtras: + VariantOf: RECK + VariantGroup: Other Factions + Description: Reckoner loaded with a Cyborg Elite. Fires a plasma cannon. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor, Infantry + Weaknesses: • Cannot attack Aircraft + +encyclopedia.reck.bh: + Inherits: ^ReckonerVariantPreview + WithSpriteTurret: + Sequence: turret-bh + Tooltip: + Name: Black Hand Reckoner + EncyclopediaExtras: + VariantOf: RECK + VariantGroup: Other Factions + Description: Reckoner loaded with a Black Hand. Projects devastating anti-vehicle flames. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor + Weaknesses: • Weak vs Buildings, Defenses\n• Cannot attack Aircraft + Attributes: • Passenger: Black Hand + +encyclopedia.reck.conf: + Inherits: ^ReckonerVariantPreview + WithSpriteTurret: + Sequence: turret-conf + Tooltip: + Name: Confessor Reckoner + EncyclopediaExtras: + VariantOf: RECK + VariantGroup: Other Factions + Description: Reckoner loaded with a Confessor. Fires hallucinogenic rounds. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor + Weaknesses: • Weak vs Heavy Armor, Defenses, Buildings\n• Cannot attack Aircraft + Attributes: • Explosion causes units to attack indiscriminately\n• Passenger: Confessor + +encyclopedia.reck.reap: + Inherits: ^ReckonerVariantPreview + WithSpriteTurret: + Sequence: turret-reap + Tooltip: + Name: Reaper Reckoner + EncyclopediaExtras: + VariantOf: RECK + VariantGroup: Other Factions + Description: Reckoner loaded with a Cyborg Reaper. Fires anti-personnel missiles. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor, Buildings + Weaknesses: • Weak vs Heavy Armor + Attributes: • Passenger: Reaper + +encyclopedia.reck.shad: + Inherits: ^ReckonerVariantPreview + WithSpriteTurret: + Sequence: turret-mg + Tooltip: + Name: Shadow Reckoner + EncyclopediaExtras: + VariantOf: RECK + VariantGroup: Other Factions + Description: Reckoner loaded with a Shadow Operative. Armed with a heavy machinegun and able to cloak. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor + Weaknesses: • Weak vs Heavy Armor, Defenses\n• Cannot attack Aircraft + Attributes: • Passenger: Shadow Operative + +encyclopedia.reck.hack: + Inherits: ^ReckonerVariantPreview + Tooltip: + Name: Hacker Reckoner + EncyclopediaExtras: + VariantOf: RECK + VariantGroup: Other Factions + Description: Reckoner loaded with a Hacker. Can hack enemy defenses and buildings. Control is lost if passenger exits. + TooltipExtras: + Strengths: • Strong vs Defenses, Buildings + Weaknesses: • Cannot deal damage\n• Control lost if passenger exits + Attributes: • Passenger: Hacker + -WithSpriteTurret: + WithIdleOverlay@HACK: + Sequence: hack + +encyclopedia.reck.ztrp: + Inherits: ^ReckonerVariantPreview + WithSpriteTurret: + Sequence: turret-ztrp + Tooltip: + Name: Zone Trooper Reckoner + EncyclopediaExtras: + VariantOf: RECK + VariantGroup: Other Factions + Description: Reckoner loaded with a Zone Trooper. Fires powerful railgun shots. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor, Defenses + Weaknesses: • Weak vs Infantry, Buildings\n• Cannot attack Aircraft + Attributes: • Passenger: Zone Trooper + +encyclopedia.reck.zdef: + Inherits: ^ReckonerVariantPreview + WithSpriteTurret: + Sequence: turret-zdef + Tooltip: + Name: Zone Defender Reckoner + EncyclopediaExtras: + VariantOf: RECK + VariantGroup: Other Factions + Description: Reckoner loaded with a Zone Defender. Fires ion blasts. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor, Defenses + Weaknesses: • Weak vs Infantry, Buildings\n• Cannot attack Aircraft + Attributes: • Passenger: Zone Defender + +encyclopedia.reck.zrai: + Inherits: ^ReckonerVariantPreview + WithSpriteTurret: + Sequence: turret-zrai + Tooltip: + Name: Zone Raider Reckoner + EncyclopediaExtras: + VariantOf: RECK + VariantGroup: Other Factions + Description: Reckoner loaded with a Zone Raider. Fires sonic grenades. + TooltipExtras: + Strengths: • Strong vs Light Armor, Buildings + Weaknesses: • Cannot attack Aircraft + Attributes: • Passenger: Zone Raider + +encyclopedia.reck.disin: + Inherits: ^ReckonerVariantPreview + WithSpriteTurret: + Sequence: turret-disin + Tooltip: + Name: Disintegrator Reckoner + EncyclopediaExtras: + VariantOf: RECK + VariantGroup: Other Factions + Description: Reckoner loaded with a Disintegrator. Fires disintegration beams. + TooltipExtras: + Strengths: • Strong vs Aircraft, Heavy Armor + Weaknesses: • Weak vs Infantry + Attributes: • Passenger: Disintegrator (Scrin) + +encyclopedia.reck.shard: + Inherits: ^ReckonerVariantPreview + WithSpriteTurret: + Sequence: turret-shard + Tooltip: + Name: Shard Reckoner + EncyclopediaExtras: + VariantOf: RECK + VariantGroup: Other Factions + Description: Reckoner loaded with a Ravager or Eviscerator. Fires Tiberium shards. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor + Weaknesses: • Weak vs Heavy Armor, Defenses, Buildings\n• Cannot attack Aircraft + Attributes: • Passenger: Ravager, Eviscerator + +encyclopedia.reck.pdisc: + Inherits: ^ReckonerVariantPreview + WithSpriteTurret: + Sequence: turret-pdisc + Tooltip: + Name: Plasma Disc Reckoner + EncyclopediaExtras: + VariantOf: RECK + VariantGroup: Other Factions + Description: Fires plasma discs. + TooltipExtras: + Strengths: • Strong vs Buildings, Defenses, Heavy Armor, Light Armor + Weaknesses: • Weak vs Infantry\n• Cannot attack Aircraft + Attributes: • Passenger: Intruder, Marauder + +encyclopedia.reck.impl: + Inherits: ^ReckonerVariantPreview + WithSpriteTurret: + Sequence: turret-impl + Tooltip: + Name: Impaler Reckoner + EncyclopediaExtras: + VariantOf: RECK + VariantGroup: Other Factions + Description: Reckoner loaded with an Impaler. Fires long range impaling projectiles. + TooltipExtras: + Strengths: • Strong vs Light Armor, Infantry + Weaknesses: • Weak vs Heavy Armor, Defenses\n• Cannot attack Aircraft + Attributes: • Passenger: Impaler + +encyclopedia.reck.stlk: + Inherits: ^ReckonerVariantPreview + RenderSprites: + Image: ifv + WithSpriteTurret: + Sequence: turret-stlk + Palette: playerscrin + Tooltip: + Name: Stalker Reckoner + EncyclopediaExtras: + VariantOf: RECK + VariantGroup: Other Factions + Description: Reckoner loaded with a Stalker. Fires anti-infantry plasma darts and can cloak. + TooltipExtras: + Strengths: • Strong vs Light Armor, Infantry + Weaknesses: • Weak vs Heavy Armor, Defenses\n• Cannot attack Aircraft + Attributes: • Passenger: Stalker + +encyclopedia.reck.mortchem: + Inherits: ^ReckonerVariantPreview + WithSpriteTurret: + Sequence: turret-mort + Tooltip: + Name: Chemical Mortar Reckoner + EncyclopediaExtras: + VariantOf: RECK + VariantGroup: Other Factions + Description: Reckoner loaded with a Chemical Mortar Infantry. Fires chemical mortar rounds that leave toxic residue. + TooltipExtras: + Strengths: • Strong vs Infantry, Buildings + Weaknesses: • Weak vs Heavy Armor\n• Cannot attack Aircraft\n• Has difficulty hitting moving targets + Attributes: • Passenger: Chemical Mortar + +encyclopedia.reck.mortcryo: + Inherits: ^ReckonerVariantPreview + WithSpriteTurret: + Sequence: turret-mort + Tooltip: + Name: Cryo Mortar Reckoner + EncyclopediaExtras: + VariantOf: RECK + VariantGroup: Other Factions + Description: Reckoner loaded with a Cryo Mortar Infantry. Fires cryo mortar rounds that slow and freeze enemies. + TooltipExtras: + Strengths: • Strong vs Infantry, Buildings + Weaknesses: • Weak vs Heavy Armor\n• Cannot attack Aircraft\n• Has difficulty hitting moving targets + Attributes: • Passenger: Cryo Mortar + +encyclopedia.reck.mortsonic: + Inherits: ^ReckonerVariantPreview + WithSpriteTurret: + Sequence: turret-mort + Tooltip: + Name: Sonic Mortar Reckoner + EncyclopediaExtras: + VariantOf: RECK + VariantGroup: Other Factions + Description: Reckoner loaded with a Sonic Mortar Infantry. Fires sonic mortar rounds that cause concussion. + TooltipExtras: + Strengths: • Strong vs Infantry, Buildings + Weaknesses: • Weak vs Heavy Armor\n• Cannot attack Aircraft\n• Has difficulty hitting moving targets + Attributes: • Passenger: Sonic Mortar + +encyclopedia.buffs.anathema: + Inherits: ^VehicleEffectPreview + Tooltip: + Name: Anathema + Encyclopedia: + Category: Other/Buffs + EncyclopediaExtras: + Description: A Malefic Scrin support power effect which gradually increases damage output and speed over 30 seconds, but unit is destroyed once the effect ends. Bonus firepower scales inversely with the value of the affected unit. + TooltipExtras: + Strengths: • Gains firepower, rate of fire and speed gradually over 30 seconds + Weaknesses: • Destroyed once effect ends + WithIdleOverlay@Anathema: + Sequence: idle + Image: anathema + Palette: caneon + IsDecoration: True + WithPalettedOverlay@Anathema: + Palette: anathema + ShowInPreview: true + +encyclopedia.buffs.defensematrix: + Inherits: ^InfantryEffectPreview + Tooltip: + Name: Defense Matrix + Encyclopedia: + Category: Other/Buffs + EncyclopediaExtras: + Description: Granted by GDI Zone Defenders to nearby allied infantry, increasing their effective health. + TooltipExtras: + Strengths: • Increased effective health by 1250 per stack (up to 6 stacks) + WithIdleOverlay@ZoneDefenderShield: + Sequence: idle + Image: zdefshield-overlay + Palette: tdeffect + IsDecoration: True + +encyclopedia.buffs.frenzy: + Inherits: ^VehicleEffectPreview + Tooltip: + Name: Frenzy + Encyclopedia: + Category: Other/Buffs + EncyclopediaExtras: + Description: Granted by the eponymous Marked of Kane support power. Increases rate of fire and movement speed, but reduces them once the effect ends. + TooltipExtras: + Strengths: +33% rate of fire\n+25% movement speed + Weaknesses: -15% rate of fire after effect ends\n-15% movement speed after effect ends + WithPalettedOverlay@FRENZY: + Palette: frenzy + ShowInPreview: true + WithIdleOverlay@FRENZY: + Sequence: vehicle + Image: frenzy-overlay + Palette: frenzyoverlay + IsDecoration: True + +encyclopedia.buffs.gyro: + Inherits: ^VehicleEffectPreview + RenderSprites: + Image: titn + PlayerPalette: playertd + QuantizeFacingsFromSequence: + Sequence: stand + WithFacingSpriteBody: + Sequence: stand + Tooltip: + Name: Gyro Stabilizers + Encyclopedia: + Category: Other/Buffs + EncyclopediaExtras: + Description: An effect granted by activating the Gyro Stabilizers ability available via upgrade to Talon mechs which increases weapon range but reduces rate of fire. + TooltipExtras: + Strengths: +33% weapon range + Weaknesses: -25% rate of fire + WithPalettedOverlay@GYRO: + Palette: gyro + ShowInPreview: true + +encyclopedia.buffs.hotu: + Inherits: ^InfantryEffectPreview + Tooltip: + Name: Hero of the Union + Encyclopedia: + Category: Other/Buffs + EncyclopediaExtras: + Description: Granted by the Heroes of the Union support power available to the Soviets after adopting the Infantry Doctrine. Increases effective health, speed, rate of fire and range. + TooltipExtras: + Strengths: Effective health boosted to 28k\n+20% movement speed\n+50% range\n+50% rate of fire + WithIdleOverlay@HeroOfTheUnionCrest: + Sequence: star + Image: hero-overlay + Palette: effect + IsDecoration: True + WithIdleOverlay@HeroOfTheUnionLight: + Sequence: light + Image: hero-overlay + Palette: effect + IsDecoration: True + +encyclopedia.buffs.hypercharge: + Inherits: ^VehicleEffectPreview + RenderSprites: + Image: seek + Tooltip: + Name: Hypercharge + Encyclopedia: + Category: Other/Buffs + EncyclopediaExtras: + Description: An effect granted by activating the Hypercharge ability available via upgrade to Scrin Seekers and Lacerators. Allows the unit to fire continuously for a short duration while taking increased damage. After the effect ends the unit has reduced speed, damage and rate of fire for a short time. + TooltipExtras: + Strengths: • Continuous fire + Weaknesses: +20% increased damage taken + WithPalettedOverlay@HYPERCHARGE: + Palette: hypercharge + ShowInPreview: true + WithIdleOverlay@HYPERCHARGE: + Sequence: emp-overlay + Palette: ionsurgeoverlay + IsDecoration: True + +encyclopedia.buffs.inspiration: + Inherits: ^InfantryEffectPreview + Tooltip: + Name: Inspiration I + Encyclopedia: + Category: Other/Buffs + EncyclopediaExtras: + Description: Applied to basic infantry within range of a Soviet Commissar, Troop Crawler or Overlord Tank. Increases movement speed and rate of fire. + TooltipExtras: + Strengths: +30% movement speed\n+10% rate of fire + WithIdleOverlay@Inspiration1: + Image: ussrstar + Sequence: idle-overlay1 + Palette: effect + IsDecoration: True + +encyclopedia.buffs.inspiration2: + Inherits: ^InfantryEffectPreview + Tooltip: + Name: Inspiration II + Encyclopedia: + Category: Other/Buffs + EncyclopediaExtras: + Description: Applied to basic infantry within range of two or more different units that apply the Inspiration effect. Further increases movement speed and rate of fire. + TooltipExtras: + Strengths: +40% movement speed\n+20% rate of fire + WithIdleOverlay@Inspiration2: + Image: ussrstar + Sequence: idle-overlay2 + Palette: effect + IsDecoration: True + +encyclopedia.buffs.ionsurge: + Inherits: ^VehicleEffectPreview + Tooltip: + Name: Ion Surge + Encyclopedia: + Category: Other/Buffs + EncyclopediaExtras: + Description: Effect granted by a Traveler-59 support power which increases movement speed. + TooltipExtras: + Strengths: +50% movement speed + WithColoredOverlayCA@IONSURGE: + Color: bd70ff23 + ShowInPreview: true + WithIdleOverlay@IONSURGE: + Sequence: vehicle + Image: ionsurge-overlay + Palette: ionsurgeoverlay + IsDecoration: True + +encyclopedia.buffs.ironcurtain: + Inherits: ^VehicleEffectPreview + Tooltip: + Name: Iron Curtain + Encyclopedia: + Category: Other/Buffs + EncyclopediaExtras: + Description: Soviet minor superweapon effect which grants temporary invulnerability (still affected by debuffs). + TooltipExtras: + Strengths: • Immune to all damage + Weaknesses: • Speed capped to Heavy Tank speed + WithPalettedOverlay@IRONCURTAIN: + Palette: invuln + ShowInPreview: true + +encyclopedia.buffs.naniterepair: + Inherits: ^VehicleEffectPreview + Tooltip: + Name: Nanite Repair + Encyclopedia: + Category: Other/Buffs + EncyclopediaExtras: + Description: Applied by an ARC support power. Repairs vehicles over time. + TooltipExtras: + Strengths: • Repairs 5% health per second + WithPalettedOverlay@NREPAIR: + Palette: nrepair + ShowInPreview: true + WithIdleOverlay@NREPAIR: + Image: nrepair-overlay + Sequence: idle + Palette: effect + IsDecoration: True + +encyclopedia.buffs.naniteshield: + Inherits: ^VehicleEffectPreview + Tooltip: + Name: Nanite Shield + Encyclopedia: + Category: Other/Buffs + EncyclopediaExtras: + Description: Granted by the support power available with the third level of GDI's Hold the Line Strategy. Absorbs a portion of incoming damage. + TooltipExtras: + Strengths: • Absorbs 50% of incoming damage + WithIdleOverlay@NSHIELD: + Sequence: idle + Image: nshield-overlay + Palette: effect + IsDecoration: True + +encyclopedia.buffs.tibstealth: + Inherits: ^VehicleEffectPreview + RenderSprites: + Palette: cloakgreen + Tooltip: + Name: Tiberium Stealth + Encyclopedia: + Category: Other/Buffs + EncyclopediaExtras: + Description: Applied by the minor superweapon power granted by Nod's Stealth Generator. Makes units invisible to enemies until it attacks or is attacked, and reduces damage taken. + TooltipExtras: + Strengths: • Invisible to enemies\n-10% damage taken + +encyclopedia.debuffs.atomized: + Inherits: ^VehicleEffectPreview + Inherits@Atomizable: ^Atomizable + Tooltip: + Name: Atomized + Encyclopedia: + Category: Other/Debuffs + EncyclopediaExtras: + Description: An effect that can only be applied Collector-73's Atomizer unit. Deals damage over time and reduces movement speed and firepower. + TooltipExtras: + Weaknesses: • Deals periodic damage\n-33% movement speed\n-33% damage dealt + WithIdleOverlay@ATOMIZED: + -RequiresCondition: + +encyclopedia.debuffs.berserk: + Inherits: ^VehicleEffectPreview + Inherits@Berserk: ^Berserk + Tooltip: + Name: Berserk + Encyclopedia: + Category: Other/Debuffs + EncyclopediaExtras: + Description: Applied via Yuri's Chaos Gas, or the Rage Generator ability of Nod Idols of Kane. Causes affected units to uncontrollably attack nearby units. + TooltipExtras: + Weaknesses: • Attacks units indiscriminately + Attributes: +25% movement speed\n+100% rate of fire + WithPalettedOverlay@BERSERK: + ShowInPreview: true + +encyclopedia.debuffs.blinded: + Inherits: ^VehicleEffectPreview + Tooltip: + Name: Blinded + Encyclopedia: + Category: Other/Debuffs + EncyclopediaExtras: + Description: Disables unit vision and weapons. + TooltipExtras: + Weaknesses: • Vision disabled\n• Weapons disabled + WithPreviewDecoration@Blinded: + Image: blinded + Sequence: idle + Palette: effect + Position: Top + Margin: 0, 8 + +encyclopedia.debuffs.chill: + Inherits: ^VehicleEffectPreview + Tooltip: + Name: Chilled + Encyclopedia: + Category: Other/Debuffs + EncyclopediaExtras: + Description: Applied by Allied cryo weaponry. Reduces movement speed and makes affected units take more damage. + TooltipExtras: + Attributes: • Stacks up to 10 times + Weaknesses: -25/35/43/50/56/59/62/65/68/70% movement speed\n+10% damage received per stack + WithColoredOverlayCA@chilled5: + Color: 51aeda68 + ShowInPreview: true + +encyclopedia.debuffs.concussion: + Inherits: ^VehicleEffectPreview + Tooltip: + Name: Concussed + Encyclopedia: + Category: Other/Debuffs + EncyclopediaExtras: + Description: Reduces rate of fire and movement speed. + TooltipExtras: + Weaknesses: -25% movement speed\n-50% rate of fire + WithPreviewDecoration: + Image: pips + Sequence: pip-conc + Palette: chrome + Position: Top + BlinkInterval: 16 + BlinkPattern: On, On, Off + +encyclopedia.debuffs.emp: + Inherits: ^VehicleEffectPreview + Tooltip: + Name: EMP + Encyclopedia: + Category: Other/Debuffs + EncyclopediaExtras: + Description: Completely incapacitates vehicles, heavy cyborgs and defenses. Causes unshielded aircraft to crash. + TooltipExtras: + Weaknesses: • Movement disabled\n• Weapons disabled\n• Abilities disabled\n• Unshielded aircraft crash to ground + WithColoredOverlayCA@EMPDISABLE: + Color: 000000b4 + ShowInPreview: true + WithIdleOverlay@EMPDISABLE: + Sequence: emp-overlay + Palette: tseffect + IsDecoration: True + +encyclopedia.debuffs.irradiated: + Inherits: ^VehicleEffectPreview + Inherits@Irradiatable: ^Irradiatable + Tooltip: + Name: Irradiated + Encyclopedia: + Category: Other/Debuffs + EncyclopediaExtras: + Description: Applied by Iraqi Desolators and Eradicators. Causes periodic AoE damage, reduces outgoing damage and increases incoming damage. + TooltipExtras: + Weaknesses: • Deals periodic damage to nearby units\n• Irradiates the ground\n-10% damage dealt\n+10% damage received + WithPalettedOverlay@IRRADIATABLE: + ShowInPreview: true + +encyclopedia.debuffs.jammed: + Inherits: ^VehicleEffectPreview + Inherits@WeaponJammable: ^WeaponJammable + Tooltip: + Name: Jammed + Encyclopedia: + Category: Other/Debuffs + EncyclopediaExtras: + Description: Applied by Allied Radar Jammers. Reduces vehicle weapon damage and rate of fire. + TooltipExtras: + Weaknesses: -10% damage dealt\n-20% rate of fire + WithIdleOverlay@WEAPJAMMED: + -RequiresCondition: + +encyclopedia.debuffs.targetpainted: + Inherits: ^VehicleEffectPreview + Tooltip: + Name: Target Painted + Encyclopedia: + Category: Other/Debuffs + EncyclopediaExtras: + Description: Increases damage received and reveals the unit to enemies. + TooltipExtras: + Weaknesses: Revealed to enemies\n+10% damage received + WithPreviewDecoration: + Image: targetpainter + Sequence: idle + Palette: effect + Position: Top + Margin: 0, 8 + +encyclopedia.debuffs.reapersnared: + Inherits: ^InfantryEffectPreview + Inherits@ReaperSnareable: ^ReaperSnareable + Tooltip: + Name: Reaper Snared + Encyclopedia: + Category: Other/Debuffs + EncyclopediaExtras: + Description: Applied by Nod Cyborg Reapers' snare ability. Completely incapacitates infantry. + TooltipExtras: + Weaknesses: • Movement disabled\n• Weapons disabled\n• Abilities disabled + WithIdleOverlay@ReaperSnare: + -RequiresCondition: + WithInfantryBody: + IdleSequences: idle1,idle2 + StandSequences: parachute + +encyclopedia.debuffs.suppression: + Inherits: ^VehicleEffectPreview + Inherits@Suppressable: ^Suppressable + Tooltip: + Name: Suppressed + Encyclopedia: + Category: Other/Debuffs + EncyclopediaExtras: + Description: An effect applied by the Scrin Suppression power, Masterminds and Enervators. Reduces movement speed and rate of fire. + TooltipExtras: + Weaknesses: -60% movement speed\n-20% rate of fire + WithPalettedOverlay@SUPPRESSION: + ShowInPreview: true + +encyclopedia.debuffs.veiled: + Inherits: ^VehicleEffectPreview + Inherits@Veilable: ^Veilable + Tooltip: + Name: Veiled + Encyclopedia: + Category: Other/Debuffs + EncyclopediaExtras: + Description: Applied by Allied Gap Generators, Black Eagles, Tiger Guards, and England's Veil of War support power. Reduces weapon and vision range. + TooltipExtras: + Weaknesses: -20% weapon range\n-20% vision range + WithIdleOverlay@VEILED: + -RequiresCondition: + +encyclopedia.debuffs.warped: + Inherits: ^VehicleEffectPreview + Inherits@Warpable: ^Warpable + -Warpable: + -FireWarheadsOnDeath@TEMPORAL: + Tooltip: + Name: Warped + Encyclopedia: + Category: Other/Debuffs + EncyclopediaExtras: + Description: Applied by Allied Chrono Prisons and Germany's Time Warp ability. Completely incapacitates the target, but makes it immune to non-warping damage. + TooltipExtras: + Strengths: • Immune to non-warping damage + Weaknesses: • Movement disabled\n• Weapons disabled\n• Abilities disabled + WithPalettedOverlay@TEMPORALl: + ShowInPreview: true + WithIdleOverlay@TEMPORAL: + -RequiresCondition: + +encyclopedia.debuffs.watched: + Inherits: ^VehicleEffectPreview + Tooltip: + Name: Watched + Encyclopedia: + Category: Other/Debuffs + EncyclopediaExtras: + Description: Revealed to enemies. + TooltipExtras: + Weaknesses: • Revealed to enemies + WithPreviewDecoration: + Image: watched + Sequence: idle + Palette: scrineffect + Position: Top + Margin: 0, 8 diff --git a/mods/ca/rules/fakes.yaml b/mods/ca/rules/fakes.yaml index d29741a084..f6df12a326 100644 --- a/mods/ca/rules/fakes.yaml +++ b/mods/ca/rules/fakes.yaml @@ -1,66 +1,130 @@ -SYRF: +FPWR: Inherits: ^FakeBuilding Inherits@infiltrate: ^InfiltratableFake + Inherits@SHAPE: ^2x2Shape + Buildable: + BuildPaletteOrder: 900 + Queue: DefenseSQ, DefenseMQ + Prerequisites: anypower, ~structures.england, ~techlevel.low + Description: Looks like a Power Plant. Packed with explosives. + Icon: fake-icon + Tooltip: + Name: Fake Power Plant + GenericName: Power Plant + GenericVisibility: Enemy + GenericStancePrefix: False + TooltipExtras: + FakeActor: powr + Building: + Footprint: xx xx == + Dimensions: 2,3 + LocalCenterOffset: 0,-512,0 RenderSprites: - PlayerPalette: playernavy + Image: powr + Selectable: + Bounds: 2048, 2048 + HitShape: + UseTargetableCellsOffsets: false + TargetableOffsets: 0,0,0, 640,-384,0, 640,512,0, -710,-512,0, -710,512,0 + Valued: + Cost: 150 + Health: + HP: 40000 + Armor: + Type: Wood + WithBuildingBib: + WithDeathAnimation: + DeathSequence: dead + UseDeathTypeSuffix: false + +FREF: + Inherits: ^FakeBuilding + Inherits@SHAPE: ^2x2Shape Buildable: - BuildPaletteOrder: 890 - Queue: Defense - Prerequisites: syrd, ~structures.england - Description: Looks like a Naval yard. + BuildPaletteOrder: 910 + Queue: DefenseSQ, DefenseMQ + Prerequisites: proc, ~structures.england, ~techlevel.low + Description: Looks like a Refinery. Packed with explosives. Icon: fake-icon Tooltip: - Name: Fake Naval Yard - GenericName: Shipyard + Name: Fake Refinery + GenericName: Refinery GenericVisibility: Enemy GenericStancePrefix: False - Targetable: - TargetTypes: Ground, Water, Structure, SpyInfiltrate - RequiresCondition: !being-warped + TooltipExtras: + FakeActor: proc Building: - Footprint: xxx xxx xxx - Dimensions: 3,3 - TerrainTypes: Water + Footprint: _X_ xxx X++ === + Dimensions: 3,4 + LocalCenterOffset: 0,-512,0 + Selectable: + Bounds: 3072, 2512, 0, 256 + DecorationBounds: 3072, 2986, 0, -85 + HitShape: + Type: Rectangle + TopLeft: -1536, -512 + BottomRight: 1536, 598 + HitShape@TOP: + TargetableOffsets: 1680,0,0 + Type: Rectangle + TopLeft: -512, -1536 + BottomRight: 512, -512 + HitShape@BOTTOMLEFT: + TargetableOffsets: -1260,-1024,0 + Type: Rectangle + TopLeft: -1536, 598 + BottomRight: -512, 1280 + WithBuildingBib: RenderSprites: - Image: SYRD + Image: proc Valued: - Cost: 100 + Cost: 200 Health: - HP: 100000 + HP: 90000 Armor: - Type: Light - MapEditorData: - ExcludeTilesets: INTERIOR + Type: Wood RequiresBuildableArea: AreaTypes: building - Adjacent: 8 + WithResourceStoragePipsDecoration: + Position: BottomLeft + Margin: 4, 3 + RequiresSelection: true + PipCount: 17 + FullSequence: pip-yellow + Targetable@Infiltration: + TargetTypes: StealCreditsInfiltrate, VisionInfiltrate WEAF: Inherits: ^FakeBuilding Inherits@infiltrate: ^InfiltratableFake + Inherits@SHAPE: ^3x2Shape + Selectable: + Bounds: 3072, 2048 Buildable: BuildPaletteOrder: 920 - Prerequisites: weap, ~structures.england - Queue: Defense - Description: Looks like a War Factory. + Prerequisites: weap, ~structures.england, ~techlevel.low + Queue: DefenseSQ, DefenseMQ + Description: Looks like a War Factory. Packed with explosives. Icon: fake-icon Tooltip: Name: Fake War Factory GenericName: War Factory GenericVisibility: Enemy GenericStancePrefix: False + TooltipExtras: + FakeActor: weap Building: - Footprint: xxx xxx === + Footprint: xxx xxx +++ Dimensions: 3,3 LocalCenterOffset: 0,-512,0 WithBuildingBib: RenderSprites: - Image: WEAP + Image: weap WithProductionDoorOverlay: Sequence: build-top RequiresCondition: !build-incomplete Valued: - Cost: 200 + Cost: 225 Health: HP: 150000 Armor: @@ -68,23 +132,28 @@ WEAF: -ActorPreviewPlaceBuildingPreview: SequencePlaceBuildingPreview: Sequence: place - SequencePalette: placebuilding RequiresBuildableArea: AreaTypes: building + Targetable@Infiltration: + TargetTypes: VetInfiltrate, StealTechInfiltrate, VisionInfiltrate DOMF: Inherits: ^FakeBuilding Inherits@infiltrate: ^InfiltratableFake + Inherits@SHAPE: ^2x2Shape + Inherits@IDISABLE: ^DisableOnLowPowerOrPowerDownOrForceDisable Tooltip: Name: Fake Radar Dome GenericName: Radar Dome GenericVisibility: Enemy GenericStancePrefix: False + TooltipExtras: + FakeActor: dome Buildable: BuildPaletteOrder: 930 - Queue: Defense - Prerequisites: dome, ~structures.england - Description: Looks like a Radar Dome. + Queue: DefenseSQ, DefenseMQ + Prerequisites: dome, ~structures.england, ~techlevel.medium + Description: Looks like a Radar Dome. Packed with explosives. Icon: fake-icon Building: Footprint: xx xx == @@ -92,40 +161,50 @@ DOMF: LocalCenterOffset: 0,-512,0 WithBuildingBib: RenderSprites: - Image: DOME + Image: dome Valued: - Cost: 180 + Cost: 200 Health: - HP: 100000 + HP: 110000 Armor: Type: Wood RequiresBuildableArea: AreaTypes: building + Targetable@Infiltration: + TargetTypes: ResetShroudInfiltrate, TechLockInfiltrate, VisionInfiltrate FACF: Inherits: ^FakeBuilding + Inherits@infiltrate: ^InfiltratableFake Buildable: BuildPaletteOrder: 1000 - Queue: Defense + Queue: DefenseSQ, DefenseMQ Prerequisites: ~structures.england - Description: Looks like a Construction Yard. + Description: Looks like a Construction Yard. Packed with explosives. Icon: fake-icon Tooltip: Name: Fake Construction Yard GenericName: Construction Yard GenericVisibility: Enemy GenericStancePrefix: False + TooltipExtras: + FakeActor: fact Building: Footprint: xxX xxx XxX === Dimensions: 3,4 LocalCenterOffset: 0,-512,0 Selectable: - Bounds: 72,72 + Bounds: 3072, 3072 + HitShape: + TargetableOffsets: 1273,939,0, -980,-640,0, -980,640,0 + Type: Rectangle + TopLeft: -1536, -1536 + BottomRight: 1536, 1536 WithBuildingBib: WithBuildingPlacedAnimation: RequiresCondition: !build-incomplete RenderSprites: - Image: FACT + Image: fact Valued: Cost: 250 Health: @@ -134,3 +213,56 @@ FACF: Type: Wood RequiresBuildableArea: AreaTypes: building + Targetable@Infiltration: + TargetTypes: VisionInfiltrate + +SYRF: + Inherits: ^FakeBuilding + Inherits@infiltrate: ^InfiltratableFake + RenderSprites: + PlayerPalette: playernavy + Buildable: + BuildPaletteOrder: 1100 + Queue: DefenseSQ, DefenseMQ + Prerequisites: syrd, ~structures.england, ~techlevel.navy, ~techlevel.low + Description: Looks like a Naval yard. Packed with explosives. + Icon: fake-icon + Tooltip: + Name: Fake Naval Yard + GenericName: Shipyard + GenericVisibility: Enemy + GenericStancePrefix: False + TooltipExtras: + FakeActor: syrd + Targetable: + TargetTypes: Ground, Water, Structure, Building, SpyInfiltrate + RequiresCondition: !being-warped + Building: + Footprint: xxx xxx xxx + Dimensions: 3,3 + TerrainTypes: Water + HitShape: + TargetableOffsets: 768,0,0, 768,-1024,0, 768,1024,0 + Type: Rectangle + TopLeft: -1536, -1152 + BottomRight: 1536, 598 + HitShape@BOTTOM: + TargetableOffsets: -768,0,0 + Type: Rectangle + TopLeft: -512, 598 + BottomRight: 512, 1110 + RenderSprites: + Image: syrd + Valued: + Cost: 100 + Health: + HP: 100000 + Armor: + Type: Wood + MapEditorData: + ExcludeTilesets: INTERIOR + RequiresBuildableArea: + AreaTypes: building + Adjacent: 8 + Targetable@Infiltration: + TargetTypes: GrantSupportPowerInfiltrate, VisionInfiltrate diff --git a/mods/ca/rules/husks.yaml b/mods/ca/rules/husks.yaml index 0414c3ed2c..84a30c4f1a 100644 --- a/mods/ca/rules/husks.yaml +++ b/mods/ca/rules/husks.yaml @@ -4,10 +4,6 @@ Name: Husk (Scout Tank) ThrowsParticle@turret: Anim: turret - TransformOnCapture: - IntoActor: 1tnk - InfiltrateForTransform: - IntoActor: 1tnk RenderSprites: Image: 1tnk.destroyed @@ -17,23 +13,24 @@ Name: Husk (Medium Tank) ThrowsParticle@turret: Anim: turret - TransformOnCapture: - IntoActor: 2tnk - InfiltrateForTransform: - IntoActor: 2tnk RenderSprites: Image: 2tnk.destroyed +GTNK.Husk: + Inherits: ^Husk + Tooltip: + Name: Husk (Grizzly Tank) + ThrowsParticle@turret: + Anim: turret + RenderSprites: + Image: gtnk.destroyed + 3TNK.Husk: Inherits: ^Husk Tooltip: Name: Husk (Heavy Tank) ThrowsParticle@turret: Anim: turret - TransformOnCapture: - IntoActor: 3tnk - InfiltrateForTransform: - IntoActor: 3tnk RenderSprites: Image: 3tnk.destroyed @@ -43,77 +40,72 @@ Name: Husk (Lasher Tank) ThrowsParticle@turret: Anim: turret - TransformOnCapture: - IntoActor: 3tnk.yuri - InfiltrateForTransform: - IntoActor: 3tnk.yuri RenderSprites: Image: 3tnky.destroyed +3TNK.RHIN.Husk: + Inherits: ^Husk + Tooltip: + Name: Husk (Rhino Heavy Tank) + ThrowsParticle@turret: + Anim: turret + RenderSprites: + Image: rhin.destroyed + 4TNK.Husk: Inherits: ^Husk Tooltip: Name: Husk (Mammoth Tank) ThrowsParticle@turret: Anim: turret - TransformOnCapture: - IntoActor: 4tnk - InfiltrateForTransform: - IntoActor: 4tnk RenderSprites: Image: 4tnk.destroyed +4TNK.ERAD.Husk: + Inherits: ^Husk + Tooltip: + Name: Husk (Eradicator) + ThrowsParticle@turret: + Anim: turret + RenderSprites: + Image: 4tnkerad.destroyed + +HARV.Husk: + Inherits: ^Husk + Tooltip: + Name: Husk (Ore Truck) + RenderSprites: + Image: hhusk2 + +# for RA map compatibility only HARV.FullHusk: Inherits: ^Husk Tooltip: Name: Husk (Ore Truck) - TransformOnCapture: - IntoActor: harv - InfiltrateForTransform: - IntoActor: harv RenderSprites: Image: hhusk - Crushable: - CrushedByFriendlies: False +# for RA map compatibility only HARV.EmptyHusk: Inherits: ^Husk Tooltip: Name: Husk (Ore Truck) - TransformOnCapture: - IntoActor: harv - InfiltrateForTransform: - IntoActor: harv RenderSprites: Image: hhusk2 - Crushable: - CrushedByFriendlies: False -HARV.Chrono.EmptyHusk: +HARV.Chrono.Husk: Inherits: ^Husk Tooltip: Name: Husk (Chrono Miner) - TransformOnCapture: - IntoActor: harv.chrono - InfiltrateForTransform: - IntoActor: harv.chrono RenderSprites: Image: charv.destroyed - Crushable: - CrushedByFriendlies: False MCV.Husk: Inherits: ^Husk Tooltip: Name: Husk (Mobile Construction Vehicle) - TransformOnCapture: - IntoActor: mcv - InfiltrateForTransform: - IntoActor: mcv RenderSprites: Image: mcvhusk - Crushable: - CrushedByFriendlies: False MGG.Husk: Inherits: ^Husk @@ -122,10 +114,6 @@ MGG.Husk: ThrowsParticle@spinner: Anim: spinner-idle Offset: -299,0,171 - TransformOnCapture: - IntoActor: mgg - InfiltrateForTransform: - IntoActor: mgg RenderSprites: Image: mgg.destroyed @@ -133,19 +121,22 @@ MSG.Husk: Inherits: ^Husk Tooltip: Name: Husk (Mobile Stealth Generator) - TransformOnCapture: - IntoActor: msg - InfiltrateForTransform: - IntoActor: msg RenderSprites: Image: msg.destroyed +MOLE.Husk: + Inherits: ^Husk + Tooltip: + Name: Husk (Subterranean APC) + RenderSprites: + Image: mole.destroyed + TRAN.Husk: Inherits: ^HelicopterHusk Tooltip: Name: Chinook Aircraft: - TurnSpeed: 4 + TurnSpeed: 1 Speed: 149 WithIdleOverlay@PRIMARY: Offset: -597,0,341 @@ -175,8 +166,11 @@ TRAN.Husk1: RenderSprites: Image: tran1husk -Capturable: - -TransformOnCapture: - -InfiltrateForTransform: + -CapturableProgressBar: + -CapturableProgressBlink: + -GivesCashOnCaptureCA: + -GrantConditionOnCapture: + -KillsSelf: TRAN.Husk2: Inherits: ^Husk @@ -185,8 +179,73 @@ TRAN.Husk2: RenderSprites: Image: tran2husk -Capturable: - -TransformOnCapture: - -InfiltrateForTransform: + -CapturableProgressBar: + -CapturableProgressBlink: + -GivesCashOnCaptureCA: + -GrantConditionOnCapture: + -KillsSelf: + +HALO.Husk: + Inherits: ^HelicopterHusk + Tooltip: + Name: Heavy Transport + Aircraft: + TurnSpeed: 1 + Speed: 149 + WithIdleOverlay@PRIMARY: + Offset: 260,0,343 + Sequence: rotor + RevealsShroud: + Range: 8c0 + MinRange: 6c0 + Type: GroundPosition + RevealGeneratedShroud: false + RevealsShroud@GAPGEN: + Range: 6c0 + Type: GroundPosition + RenderSprites: + Image: halo + +HALO.Husk.EMP: + Inherits: HALO.Husk + Inherits: ^EmpVisualEffect + +NHAW.Husk: + Inherits: ^HelicopterHusk + Tooltip: + Name: Nighthawk + Aircraft: + TurnSpeed: 1 + Speed: 149 + WithIdleOverlay@PRIMARY: + Offset: 237,0,263 + Sequence: rotor + WithIdleOverlay@SECONDARY: + Offset: -997,0,341 + Sequence: rotor2 + RevealsShroud: + Range: 8c0 + MinRange: 6c0 + Type: GroundPosition + RevealGeneratedShroud: false + RevealsShroud@GAPGEN: + Range: 6c0 + Type: GroundPosition + RenderSprites: + Image: nhaw + +NHAW.UPG.Husk: + Inherits: NHAW.Husk + WithFacingSpriteBody: + Sequence: idle-upg + +NHAW.Husk.EMP: + Inherits: NHAW.Husk + Inherits: ^EmpVisualEffect + +NHAW.UPG.Husk.EMP: + Inherits: NHAW.UPG.Husk + Inherits: ^EmpVisualEffect BADR.Husk: Inherits: ^PlaneHusk @@ -194,15 +253,23 @@ BADR.Husk: Name: Badger Aircraft: TurnSpeed: 5 - Speed: 149 - SmokeTrailWhenDamaged@0: - Offset: -432,560,0 - Interval: 2 - MinDamage: Undamaged - SmokeTrailWhenDamaged@1: - Offset: -432,-560,0 - Interval: 2 - MinDamage: Undamaged + Speed: 180 + LeavesTrails@0: + Offsets: -432,560,0 + MovingInterval: 2 + Image: smokey + StationaryInterval: 2 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + LeavesTrails@1: + Offsets: -432,-560,0 + MovingInterval: 2 + Image: smokey + StationaryInterval: 2 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition RenderSprites: Image: badr -RevealOnDeath: @@ -217,15 +284,23 @@ B2B.Husk: Name: B2 Stealth Bomber Aircraft: TurnSpeed: 5 - Speed: 223 - SmokeTrailWhenDamaged@0: - Offset: -432,560,0 - Interval: 2 - MinDamage: Undamaged - SmokeTrailWhenDamaged@1: - Offset: -432,-560,0 - Interval: 2 - MinDamage: Undamaged + Speed: 180 + LeavesTrails@0: + Offsets: -432,560,0 + MovingInterval: 2 + Image: smokey + StationaryInterval: 2 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + LeavesTrails@1: + Offsets: -432,-560,0 + MovingInterval: 2 + Image: smokey + StationaryInterval: 2 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition RenderSprites: Image: b2b -RevealOnDeath: @@ -244,11 +319,15 @@ MIG.Husk: Offset: -598,683,0 Aircraft: TurnSpeed: 5 - Speed: 186 - SmokeTrailWhenDamaged: - Offset: -853,0,171 - Interval: 2 - MinDamage: Undamaged + Speed: 201 + LeavesTrails: + Offsets: -853,0,171 + MovingInterval: 2 + Image: smokey + StationaryInterval: 2 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition RevealsShroud: Range: 12c0 MinRange: 10c0 @@ -265,8 +344,8 @@ MIG.Husk.EMP: Inherits: ^EmpVisualEffect MIG.Husk.Empty: - Inherits: ^PlaneHuskEmpty Inherits: MIG.Husk + Inherits: ^PlaneHuskEmpty MIG.Husk.Empty.EMP: Inherits: MIG.Husk.Empty @@ -278,11 +357,15 @@ YAK.Husk: Name: Yak Attack Plane Aircraft: TurnSpeed: 5 - Speed: 149 - SmokeTrailWhenDamaged: - Offset: -853,0,0 - Interval: 2 - MinDamage: Undamaged + Speed: 180 + LeavesTrails: + Offsets: -853,0,0 + MovingInterval: 2 + Image: smokey + StationaryInterval: 2 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition Contrail@1: Offset: -98,-683,-10 Contrail@2: @@ -304,6 +387,42 @@ YAK.Husk.EMP: Inherits: YAK.Husk Inherits: ^EmpVisualEffect +P51.Husk: + Inherits: ^PlaneHusk + Tooltip: + Name: P51 Attack Plane + Aircraft: + TurnSpeed: 5 + Speed: 180 + LeavesTrails: + Offsets: -853,0,0 + MovingInterval: 2 + Image: smokey + StationaryInterval: 2 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + Contrail@1: + Offset: -78,-623,30 + Contrail@2: + Offset: -78,623,30 + RevealsShroud: + Range: 11c0 + MinRange: 9c0 + Type: GroundPosition + RevealGeneratedShroud: false + RevealsShroud@GAPGEN: + Range: 9c0 + Type: GroundPosition + RenderSprites: + Image: p51 + FallsToEarth: + Explosion: UnitExplodePlaneLight + +P51.Husk.EMP: + Inherits: P51.Husk + Inherits: ^EmpVisualEffect + HELI.Husk: Inherits: ^HelicopterHusk Tooltip: @@ -314,9 +433,14 @@ HELI.Husk: WithIdleOverlay: Offset: 0,0,85 Sequence: rotor - SmokeTrailWhenDamaged: - Offset: -427,0,0 - MinDamage: Undamaged + LeavesTrails: + Offsets: -427,0,0 + Image: smokey + MovingInterval: 3 + StationaryInterval: 3 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition RevealsShroud: Range: 12c0 MinRange: 10c0 @@ -349,16 +473,21 @@ HIND.Husk: Speed: 112 WithIdleOverlay: Sequence: rotor - SmokeTrailWhenDamaged: - Offset: -427,0,0 - MinDamage: Undamaged + LeavesTrails: + Offsets: -427,0,0 + Image: smokey + MovingInterval: 3 + StationaryInterval: 3 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition RevealsShroud: - Range: 10c0 - MinRange: 8c0 + Range: 11c0 + MinRange: 9c0 Type: GroundPosition RevealGeneratedShroud: false RevealsShroud@GAPGEN: - Range: 8c0 + Range: 9c0 Type: GroundPosition RenderSprites: Image: hind @@ -375,26 +504,30 @@ HIND.Husk.Empty.EMP: Inherits: HIND.Husk.Empty Inherits: ^EmpVisualEffect -U2.Husk: +SMIG.Husk: Inherits: ^PlaneHusk Tooltip: - Name: Husk (Spy Plane) + Name: Husk (Supersonic Bomber) Aircraft: TurnSpeed: 7 Speed: 373 Contrail@1: - Offset: -725,683,0 + Offset: -700,683,-100 Contrail@2: - Offset: -725,-683,0 - SmokeTrailWhenDamaged: - Offset: -1c43,0,0 - Interval: 2 - MinDamage: Undamaged - RenderSprites: - Image: u2 - -U2.Husk.EMP: - Inherits: U2.Husk + Offset: -700,-683,-100 + LeavesTrails: + Offsets: -1c43,0,0 + MovingInterval: 2 + Image: smokey + StationaryInterval: 2 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RenderSprites: + Image: smig + +SMIG.Husk.EMP: + Inherits: SMIG.Husk Inherits: ^EmpVisualEffect T01.Husk: @@ -580,15 +713,8 @@ AMCV.Husk: Inherits: ^HuskTD Tooltip: Name: Husk (Mobile Construction Vehicle) - TransformOnCapture: - IntoActor: amcv - InfiltrateForTransform: - IntoActor: amcv RenderSprites: - PlayerPalette: overlayplayertd Image: amcv.destroyed - Crushable: - CrushedByFriendlies: False RTNK.Husk: Inherits: ^Husk @@ -596,10 +722,6 @@ RTNK.Husk: Name: Husk (Mirage Tank) ThrowsParticle@turret: Anim: turret - TransformOnCapture: - IntoActor: rtnk - InfiltrateForTransform: - IntoActor: rtnk RenderSprites: Image: rtnk.destroyed @@ -609,10 +731,6 @@ TNKD.Husk: Name: Husk (Tank Destroyer) ThrowsParticle@turret: Anim: turret - TransformOnCapture: - IntoActor: tnkd - InfiltrateForTransform: - IntoActor: tnkd RenderSprites: Image: tnkd.destroyed @@ -620,37 +738,22 @@ APC2.Husk: Inherits: ^HuskTD Tooltip: Name: Husk (APC) - TransformOnCapture: - IntoActor: apc2 - InfiltrateForTransform: - IntoActor: apc2 RenderSprites: Image: apc2.destroyed - PlayerPalette: overlayplayertd HMMV.Husk: Inherits: ^HuskTD Tooltip: Name: Husk (Hum-Vee) - TransformOnCapture: - IntoActor: hmmv - InfiltrateForTransform: - IntoActor: hmmv RenderSprites: Image: hmmv.destroyed - PlayerPalette: overlayplayertd BGGY.Husk: Inherits: ^HuskTD Tooltip: Name: Husk (Fast Attack Buggy) - TransformOnCapture: - IntoActor: bggy - InfiltrateForTransform: - IntoActor: bggy RenderSprites: Image: bggy.destroyed - PlayerPalette: overlayplayertd MTNK.Husk: Inherits: ^HuskTD @@ -658,13 +761,8 @@ MTNK.Husk: Name: Husk (Battle Tank) ThrowsParticle@turret: Anim: turret - TransformOnCapture: - IntoActor: mtnk - InfiltrateForTransform: - IntoActor: mtnk RenderSprites: Image: mtnk.destroyed - PlayerPalette: overlayplayertd MTNK.DRONE.Husk: Inherits: ^HuskTD @@ -672,13 +770,8 @@ MTNK.DRONE.Husk: Name: Husk (Battle Drone) ThrowsParticle@turret: Anim: turret - TransformOnCapture: - IntoActor: mtnk.drone - InfiltrateForTransform: - IntoActor: mtnk.drone RenderSprites: Image: drone.destroyed - PlayerPalette: overlayplayertd HTNK.Husk: Inherits: ^HuskTD @@ -686,13 +779,8 @@ HTNK.Husk: Name: Husk (Mammoth Tank) ThrowsParticle@turret: Anim: turret - TransformOnCapture: - IntoActor: htnk - InfiltrateForTransform: - IntoActor: htnk RenderSprites: Image: htnk.destroyed - PlayerPalette: overlayplayertd HTNK.ION.Husk: Inherits: ^HuskTD @@ -700,13 +788,8 @@ HTNK.ION.Husk: Name: Husk (Ion Mammoth Tank) ThrowsParticle@turret: Anim: turret-ion - TransformOnCapture: - IntoActor: htnk.ion - InfiltrateForTransform: - IntoActor: htnk.ion RenderSprites: Image: htnk.destroyed - PlayerPalette: overlayplayertd HTNK.HOVER.Husk: Inherits: ^HuskTD @@ -714,15 +797,10 @@ HTNK.HOVER.Husk: Name: Husk (Hover Mammoth Tank) ThrowsParticle@turret: Anim: turret - TransformOnCapture: - IntoActor: htnk.hover - InfiltrateForTransform: - IntoActor: htnk.hover WithFacingSpriteBody: Sequence: idle-hover RenderSprites: Image: htnk.destroyed - PlayerPalette: overlayplayertd HTNK.DRONE.Husk: Inherits: ^HuskTD @@ -730,13 +808,8 @@ HTNK.DRONE.Husk: Name: Husk (Mammoth Drone) ThrowsParticle@turret: Anim: turret-drone - TransformOnCapture: - IntoActor: htnk.drone - InfiltrateForTransform: - IntoActor: htnk.drone RenderSprites: Image: htnk.destroyed - PlayerPalette: overlayplayertd TITN.Husk: Inherits: ^HuskTD @@ -744,13 +817,8 @@ TITN.Husk: Name: Husk (Titan) ThrowsParticle@turret: Anim: turret - TransformOnCapture: - IntoActor: titn - InfiltrateForTransform: - IntoActor: titn RenderSprites: Image: titn.destroyed - PlayerPalette: overlayplayertd TITN.RAIL.Husk: Inherits: ^HuskTD @@ -758,13 +826,8 @@ TITN.RAIL.Husk: Name: Husk (Railgun Titan) ThrowsParticle@turret: Anim: turret - TransformOnCapture: - IntoActor: titn.rail - InfiltrateForTransform: - IntoActor: titn.rail RenderSprites: Image: titn.rail.destroyed - PlayerPalette: overlayplayertd JUGG.Husk: Inherits: ^HuskTD @@ -772,36 +835,29 @@ JUGG.Husk: Name: Husk (Juggernaut) ThrowsParticle@turret: Anim: turret - TransformOnCapture: - IntoActor: jugg - InfiltrateForTransform: - IntoActor: jugg RenderSprites: Image: jugg.destroyed - PlayerPalette: overlayplayertd + +AVTR.Husk: + Inherits: ^HuskTD + Tooltip: + Name: Husk (Avatar) + RenderSprites: + Image: avtr.destroyed FTNK.Husk: Inherits: ^HuskTD Tooltip: Name: Husk (Flame Tank) - TransformOnCapture: - IntoActor: ftnk - InfiltrateForTransform: - IntoActor: ftnk RenderSprites: Image: ftnk.destroyed - PlayerPalette: overlayplayertd HFTK.Husk: - Inherits: ^Husk + Inherits: ^HuskTD Tooltip: Name: Husk (Heavy Flame Tank) ThrowsParticle@turret: Anim: turret - TransformOnCapture: - IntoActor: hftk - InfiltrateForTransform: - IntoActor: hftk RenderSprites: Image: hftk.destroyed @@ -809,13 +865,8 @@ BIKE.Husk: Inherits: ^HuskTD Tooltip: Name: Husk (Recon Bike) - TransformOnCapture: - IntoActor: bike - InfiltrateForTransform: - IntoActor: bike RenderSprites: Image: bike.destroyed - PlayerPalette: overlayplayertd MSAM.Husk: Inherits: ^HuskTD @@ -823,36 +874,31 @@ MSAM.Husk: Name: Husk (MLRS) ThrowsParticle@turret: Anim: turret - TransformOnCapture: - IntoActor: msam - InfiltrateForTransform: - IntoActor: msam RenderSprites: Image: msam.destroyed - PlayerPalette: overlayplayertd STNK.NOD.Husk: Inherits: ^HuskTD Tooltip: Name: Husk (Stealth Tank) - TransformOnCapture: - IntoActor: stnk.nod - InfiltrateForTransform: - IntoActor: stnk.nod RenderSprites: Image: stnknod.destroyed - PlayerPalette: overlayplayertd APCH.Husk: - Inherits: ^HelicopterHusk + Inherits: ^HelicopterHuskTD Tooltip: Name: Apache Aircraft: TurnSpeed: 4 Speed: 186 - SmokeTrailWhenDamaged: - Offset: -427,0,0 - MinDamage: Undamaged + LeavesTrails: + Offsets: -427,0,0 + Image: smokey + MovingInterval: 3 + StationaryInterval: 3 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition RevealsShroud: Range: 10c0 MinRange: 8c0 @@ -863,30 +909,34 @@ APCH.Husk: Type: GroundPosition RenderSprites: Image: apch - PlayerPalette: overlayplayertd APCH.Husk.EMP: Inherits: APCH.Husk Inherits: ^EmpVisualEffect APCH.Husk.Empty: - Inherits: ^HelicopterHuskEmpty Inherits: APCH.Husk + Inherits: ^HelicopterHuskEmpty APCH.Husk.Empty.EMP: Inherits: APCH.Husk.Empty Inherits: ^EmpVisualEffect ORCA.Husk: - Inherits: ^HelicopterHusk + Inherits: ^HelicopterHuskTD Tooltip: Name: Orca Aircraft: TurnSpeed: 4 Speed: 186 - SmokeTrailWhenDamaged: - Offset: -427,0,0 - MinDamage: Undamaged + LeavesTrails: + Offsets: -427,0,0 + Image: smokey + MovingInterval: 3 + StationaryInterval: 3 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition RevealsShroud: Range: 12c0 MinRange: 10c0 @@ -897,30 +947,37 @@ ORCA.Husk: Type: GroundPosition RenderSprites: Image: orca - PlayerPalette: overlayplayertd ORCA.Husk.EMP: Inherits: ORCA.Husk Inherits: ^EmpVisualEffect ORCA.Husk.Empty: - Inherits: ^HelicopterHuskEmpty Inherits: ORCA.Husk + Inherits: ^HelicopterHuskEmpty ORCA.Husk.Empty.EMP: Inherits: ORCA.Husk.Empty Inherits: ^EmpVisualEffect OCAR.Husk: - Inherits: ^PlaneHusk + Inherits: ^HelicopterHuskTD Tooltip: Name: Orca Carryall Aircraft: TurnSpeed: 4 Speed: 46 - SmokeTrailWhenDamaged: - Offset: -427,0,0 - MinDamage: Undamaged + FallsToEarth: + Velocity: 86 + MaximumSpinSpeed: 20 + LeavesTrails: + Offsets: -427,0,0 + Image: smokey + MovingInterval: 3 + StationaryInterval: 3 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition RevealsShroud: Range: 10c0 MinRange: 8c0 @@ -931,14 +988,13 @@ OCAR.Husk: Type: GroundPosition RenderSprites: Image: orcaca - PlayerPalette: overlayplayertd OCAR.Husk.EMP: Inherits: OCAR.Husk Inherits: ^EmpVisualEffect UAV.Husk: - Inherits: ^PlaneHusk + Inherits: ^PlaneHuskTD Tooltip: Name: Husk (UAV) Aircraft: @@ -948,13 +1004,16 @@ UAV.Husk: Offset: -725,683,0 Contrail@2: Offset: -725,-683,0 - SmokeTrailWhenDamaged: - Offset: -1c43,0,0 - Interval: 2 - MinDamage: Undamaged + LeavesTrails: + Offsets: -1c43,0,0 + MovingInterval: 2 + Image: smokey + StationaryInterval: 2 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition RenderSprites: Image: uav - PlayerPalette: overlayplayertd UAV.Husk.EMP: Inherits: UAV.Husk @@ -964,145 +1023,223 @@ HARV.TD.Husk: Inherits: ^HuskTD Tooltip: Name: Harvester (Destroyed) - TransformOnCapture: - IntoActor: harv.td - InfiltrateForTransform: - IntoActor: harv.td RenderSprites: Image: harv2.destroyed - PlayerPalette: overlayplayertd - Crushable: - CrushedByFriendlies: False + +HARV.TD.UPG.Husk: + Inherits: ^HuskTD + Tooltip: + Name: Stealth Harvester (Destroyed) + RenderSprites: + Image: harv2.upg.destroyed A10.Husk: - Inherits: ^PlaneHusk + Inherits: ^PlaneHuskTD Tooltip: Name: Husk (Warthog) Aircraft: TurnSpeed: 7 - Speed: 123 + Speed: 180 Contrail@1: Offset: -725,683,0 Contrail@2: Offset: -725,-683,0 - SmokeTrailWhenDamaged: - Offset: -1c43,0,0 - Interval: 2 - MinDamage: Undamaged + LeavesTrails: + Offsets: -1c43,0,0 + MovingInterval: 2 + Image: smokey + StationaryInterval: 2 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition RenderSprites: Image: a10 - PlayerPalette: overlayplayertd A10.Husk.EMP: Inherits: A10.Husk Inherits: ^EmpVisualEffect A10.Husk.Empty: - Inherits: ^PlaneHuskEmpty Inherits: A10.Husk + Inherits: ^PlaneHuskEmpty A10.Husk.Empty.EMP: Inherits: A10.Husk.Empty Inherits: ^EmpVisualEffect YF23.Husk: - Inherits: ^PlaneHusk + Inherits: ^PlaneHuskTD Tooltip: Name: Husk (Aurora) Aircraft: TurnSpeed: 7 - Speed: 190 + Speed: 240 Contrail@1: Offset: -325,483,0 Contrail@2: Offset: -325,-483,0 - SmokeTrailWhenDamaged: - Offset: -1c43,0,0 - Interval: 2 - MinDamage: Undamaged + LeavesTrails: + Offsets: -1c43,0,0 + MovingInterval: 2 + Image: smokey + StationaryInterval: 2 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition RenderSprites: Image: yf23 - PlayerPalette: overlayplayertd YF23.Husk.EMP: Inherits: YF23.Husk Inherits: ^EmpVisualEffect AURO.Husk: - Inherits: ^PlaneHusk + Inherits: ^PlaneHuskTD Tooltip: Name: Husk (Aurora) Aircraft: TurnSpeed: 7 - Speed: 123 + Speed: 180 Contrail@1: Offset: -300,-800,-50 Contrail@2: Offset: -300,800,-50 - SmokeTrailWhenDamaged: - Offset: -1c43,0,0 - Interval: 2 - MinDamage: Undamaged + LeavesTrails: + Offsets: -1c43,0,0 + MovingInterval: 2 + Image: smokey + StationaryInterval: 2 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition RenderSprites: Image: auro - PlayerPalette: overlayplayertd AURO.Husk.EMP: Inherits: AURO.Husk Inherits: ^EmpVisualEffect AURO.Husk.Empty: - Inherits: ^PlaneHuskEmpty Inherits: AURO.Husk + Inherits: ^PlaneHuskEmpty AURO.Husk.Empty.EMP: Inherits: AURO.Husk.Empty Inherits: ^EmpVisualEffect C17.Husk: - Inherits: ^PlaneHusk + Inherits: ^PlaneHuskTD Tooltip: Name: C17 Aircraft: TurnSpeed: 5 - Speed: 149 - SmokeTrailWhenDamaged@0: - Offset: -432,560,0 - Interval: 2 - MinDamage: Undamaged - SmokeTrailWhenDamaged@1: - Offset: -432,-560,0 - Interval: 2 - MinDamage: Undamaged + Speed: 236 + LeavesTrails@0: + Offsets: -432,560,0 + MovingInterval: 2 + Image: smokey + StationaryInterval: 2 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + LeavesTrails@1: + Offsets: -432,-560,0 + MovingInterval: 2 + Image: smokey + StationaryInterval: 2 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition RenderSprites: Image: c17 - PlayerPalette: overlayplayertd C17.Husk.EMP: Inherits: C17.Husk Inherits: ^EmpVisualEffect +GALX.Husk: + Inherits: ^PlaneHusk + Tooltip: + Name: Transport Aircraft + Aircraft: + TurnSpeed: 5 + Speed: 266 + LeavesTrails@0: + Offsets: -432,560,0 + MovingInterval: 2 + Image: smokey + StationaryInterval: 2 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + LeavesTrails@1: + Offsets: -432,-560,0 + MovingInterval: 2 + Image: smokey + StationaryInterval: 2 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RenderSprites: + Image: galx + PlayerPalette: playertd + +GALX.Husk.EMP: + Inherits: GALX.Husk + Inherits: ^EmpVisualEffect + +ANTO.Husk: + Inherits: ^PlaneHusk + Tooltip: + Name: Transport Aircraft + Aircraft: + TurnSpeed: 5 + Speed: 266 + LeavesTrails@0: + Offsets: -432,560,0 + MovingInterval: 2 + Image: smokey + StationaryInterval: 2 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + LeavesTrails@1: + Offsets: -432,-560,0 + MovingInterval: 2 + Image: smokey + StationaryInterval: 2 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RenderSprites: + Image: anto + +ANTO.Husk.EMP: + Inherits: ANTO.Husk + Inherits: ^EmpVisualEffect + BTR.Husk: Inherits: ^Husk Tooltip: Name: Husk (APC) - TransformOnCapture: - IntoActor: btr - InfiltrateForTransform: - IntoActor: btr RenderSprites: Image: BTR.destroyed RAH.Husk: - Inherits: ^HelicopterHusk + Inherits: ^HelicopterHuskTD Tooltip: Name: Comanche Aircraft: TurnSpeed: 4 Speed: 186 - SmokeTrailWhenDamaged: - Offset: -427,0,0 - MinDamage: Undamaged + LeavesTrails: + Offsets: -427,0,0 + Image: smokey + MovingInterval: 3 + StationaryInterval: 3 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition RevealsShroud: Range: 10c0 MinRange: 8c0 @@ -1113,15 +1250,14 @@ RAH.Husk: Type: GroundPosition RenderSprites: Image: rah66 - PlayerPalette: overlayplayertd RAH.Husk.EMP: Inherits: RAH.Husk Inherits: ^EmpVisualEffect RAH.Husk.Empty: - Inherits: ^HelicopterHuskEmpty Inherits: RAH.Husk + Inherits: ^HelicopterHuskEmpty RAH.Husk.Empty.EMP: Inherits: RAH.Husk.Empty @@ -1137,14 +1273,22 @@ KIRO.Husk: FallsToEarth: MaximumSpinSpeed: 0 Explosion: KirovExplode - SmokeTrailWhenDamaged@0: - Offset: -432,560,0 - Interval: 2 - MinDamage: Undamaged - SmokeTrailWhenDamaged@1: - Offset: -432,-560,0 - Interval: 2 - MinDamage: Undamaged + LeavesTrails@0: + Offsets: -432,560,0 + MovingInterval: 2 + Image: smokey + StationaryInterval: 2 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + LeavesTrails@1: + Offsets: -432,-560,0 + MovingInterval: 2 + Image: smokey + StationaryInterval: 2 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition RevealsShroud: Range: 10c0 MinRange: 8c0 @@ -1171,24 +1315,25 @@ KIRO.Husk.Ground: Name: Husk (Kirov) KillsSelf: Delay: 1 - Explodes: + -RequiresCondition: + FireWarheadsOnDeath: Weapon: KirovExplode -OwnerLostAction: -CaptureManager: -Capturable: - TransformOnCapture: - IntoActor: KIRO.Husk.Ground - InfiltrateForTransform: - IntoActor: KIRO.Husk.Ground + -CapturableProgressBar: + -CapturableProgressBlink: + -GivesCashOnCaptureCA: + -GrantConditionOnCapture: + WithIdleOverlay@Burns: + -RequiresCondition: + ChangesHealth: + -RequiresCondition: APC.Husk: Inherits: ^Husk Tooltip: Name: Husk (APC) - TransformOnCapture: - IntoActor: apc - InfiltrateForTransform: - IntoActor: apc RenderSprites: Image: apc.destroyed @@ -1196,10 +1341,6 @@ TTRA.Husk: Inherits: ^Husk Tooltip: Name: Husk (Tesla Track) - TransformOnCapture: - IntoActor: ttra - InfiltrateForTransform: - IntoActor: ttra RenderSprites: Image: ttra.destroyed @@ -1209,37 +1350,45 @@ TTNK.Husk: Name: Husk (Tesla Tank) ThrowsParticle@turret: Anim: turret - TransformOnCapture: - IntoActor: ttnk - InfiltrateForTransform: - IntoActor: ttnk RenderSprites: Image: ttnk.destroyed +CYCP.Husk: + Inherits: ^Husk + Tooltip: + Name: Husk (Cyclops) + RenderSprites: + Image: cycp.destroyed + +BASI.Husk: + Inherits: ^HuskTD + Tooltip: + Name: Husk (Basilisk) + RenderSprites: + Image: basi.destroyed + ISU.Husk: Inherits: ^Husk Tooltip: Name: Husk (Siege Tank) - TransformOnCapture: - IntoActor: isu - InfiltrateForTransform: - IntoActor: isu RenderSprites: Image: isu.destroyed +NUKC.Husk: + Inherits: ^Husk + Tooltip: + Name: Husk (Nuke Cannon) + RenderSprites: + Image: nukc.destroyed + DISR.Husk: Inherits: ^HuskTD Tooltip: Name: Husk (Disruptor) ThrowsParticle@turret: Anim: turret - TransformOnCapture: - IntoActor: disr - InfiltrateForTransform: - IntoActor: disr RenderSprites: Image: disr.destroyed - PlayerPalette: overlayplayertd WTNK.Husk: Inherits: ^HuskTD @@ -1247,22 +1396,13 @@ WTNK.Husk: Name: Husk (Microwave Tank) ThrowsParticle@turret: Anim: turret - TransformOnCapture: - IntoActor: wtnk - InfiltrateForTransform: - IntoActor: wtnk RenderSprites: Image: wtnk.destroyed - PlayerPalette: overlayplayertd BATF.Husk: Inherits: ^Husk Tooltip: Name: Husk (Battle Fortress) - TransformOnCapture: - IntoActor: batf - InfiltrateForTransform: - IntoActor: batf RenderSprites: Image: batf.destroyed @@ -1272,10 +1412,6 @@ CHPR.Husk: Name: Husk (Chrono Prison) ThrowsParticle@turret: Anim: turret - TransformOnCapture: - IntoActor: chpr - InfiltrateForTransform: - IntoActor: chpr RenderSprites: Image: chpr.destroyed @@ -1287,7 +1423,7 @@ MISS.Husk: LocalCenterOffset: 0,-512,0 WithBuildingBib: Tooltip: - Name: Ruin (Research Centre) + Name: Ruin (Communications Center) TransformOnCapture: IntoActor: miss InfiltrateForTransform: @@ -1317,12 +1453,26 @@ HOSP.Husk: Tooltip: Name: Ruin (Hospital) TransformOnCapture: - IntoActor: hosp + IntoActor: hosp.rebuilt InfiltrateForTransform: - IntoActor: hosp + IntoActor: hosp.rebuilt RenderSprites: Image: HOSP.destroyed +MACS.Husk: + Inherits: ^TechHusk + Building: + Footprint: xx xx + Dimensions: 2,2 + Tooltip: + Name: Ruin (Machine Shop) + TransformOnCapture: + IntoActor: macs.rebuilt + InfiltrateForTransform: + IntoActor: macs.rebuilt + RenderSprites: + Image: MACS.destroyed + FCOM.Husk: Inherits: ^TechHusk Tooltip: @@ -1352,7 +1502,26 @@ OILB.Husk: IntoActor: oilb RenderSprites: Image: OILB.destroyed - Explodes: + FireWarheadsOnDeath: + Weapon: BarrelExplode + WithIdleOverlay@Burns: + Offset: -511,0,0 + +OILR.Husk: + Inherits: ^TechHusk + Building: + Footprint: xxx xxx === + Dimensions: 3,3 + LocalCenterOffset: 0,-512,0 + Tooltip: + Name: Ruin (Oil Refinery) + TransformOnCapture: + IntoActor: oilr + InfiltrateForTransform: + IntoActor: oilr + RenderSprites: + Image: OILR.destroyed + FireWarheadsOnDeath: Weapon: BarrelExplode WithIdleOverlay@Burns: Offset: -511,0,0 @@ -1363,10 +1532,15 @@ HARR.Husk: Name: Harrier Aircraft: TurnSpeed: 4 - Speed: 149 - SmokeTrailWhenDamaged: - Offset: -427,0,0 - MinDamage: Undamaged + Speed: 201 + LeavesTrails: + Offsets: -427,0,0 + Image: smokey + MovingInterval: 3 + StationaryInterval: 3 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition Contrail@1: Offset: -400,-483,0 Contrail@2: @@ -1387,23 +1561,28 @@ HARR.Husk.EMP: Inherits: ^EmpVisualEffect HARR.Husk.Empty: - Inherits: ^PlaneHuskEmpty Inherits: HARR.Husk + Inherits: ^PlaneHuskEmpty HARR.Husk.Empty.EMP: Inherits: HARR.Husk.Empty Inherits: ^EmpVisualEffect HORN.Husk: - Inherits: ^PlaneHusk + Inherits: ^PlaneHuskTD Tooltip: Name: Hornet Aircraft: TurnSpeed: 4 - Speed: 149 - SmokeTrailWhenDamaged: - Offset: -427,0,0 - MinDamage: Undamaged + Speed: 195 + LeavesTrails: + Offsets: -427,0,0 + Image: smokey + MovingInterval: 3 + StationaryInterval: 3 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition RevealsShroud: Range: 2c0 MinRange: 1c0 @@ -1414,7 +1593,6 @@ HORN.Husk: Type: GroundPosition RenderSprites: Image: horn - PlayerPalette: overlayplayertd FallsToEarth: Explosion: UnitExplodeDrone @@ -1423,7 +1601,6 @@ HORN.Husk.EMP: Inherits: ^EmpVisualEffect HORN.Husk.Empty: - Inherits: ^PlaneHuskEmpty Inherits: HORN.Husk FallsToEarth: Explosion: UnitExplodeDroneEmpty @@ -1433,15 +1610,20 @@ HORN.Husk.Empty.EMP: Inherits: ^EmpVisualEffect SCRN.Husk: - Inherits: ^PlaneHusk + Inherits: ^PlaneHuskTD Tooltip: Name: Banshee Aircraft: TurnSpeed: 4 - Speed: 200 - SmokeTrailWhenDamaged: - Offset: -427,0,0 - MinDamage: Undamaged + Speed: 225 + LeavesTrails: + Offsets: -427,0,0 + Image: smokey + MovingInterval: 3 + StationaryInterval: 3 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition Contrail@1: Offset: -300,-183,0 Contrail@2: @@ -1456,30 +1638,36 @@ SCRN.Husk: Type: GroundPosition RenderSprites: Image: scrin - PlayerPalette: overlayplayertd SCRN.Husk.EMP: Inherits: SCRN.Husk Inherits: ^EmpVisualEffect SCRN.Husk.Empty: - Inherits: ^PlaneHuskEmpty Inherits: SCRN.Husk + Inherits: ^PlaneHuskEmpty SCRN.Husk.Empty.EMP: Inherits: SCRN.Husk.Empty Inherits: ^EmpVisualEffect ORCB.Husk: - Inherits: ^PlaneHusk + Inherits: ^HelicopterHuskTD Tooltip: Name: Orca Bomber Aircraft: TurnSpeed: 4 Speed: 155 - SmokeTrailWhenDamaged: - Offset: -427,0,0 - MinDamage: Undamaged + FallsToEarth: + Velocity: 86 + LeavesTrails: + Offsets: -427,0,0 + Image: smokey + MovingInterval: 3 + StationaryInterval: 3 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition RevealsShroud: Range: 10c0 MinRange: 8c0 @@ -1490,17 +1678,14 @@ ORCB.Husk: Type: GroundPosition RenderSprites: Image: orcab - PlayerPalette: overlayplayertd ORCB.Husk.EMP: Inherits: ORCB.Husk Inherits: ^EmpVisualEffect ORCB.Husk.Empty: - Inherits: ^PlaneHuskEmpty Inherits: ORCB.Husk - FallsToEarth: - Explosion: UnitExplodeDroneEmpty + Inherits: ^HelicopterHuskEmpty ORCB.Husk.Empty.EMP: Inherits: ORCB.Husk.Empty @@ -1516,11 +1701,15 @@ SUK.Husk: Offset: -598,683,-40 Aircraft: TurnSpeed: 5 - Speed: 149 - SmokeTrailWhenDamaged: - Offset: -853,0,0 - Interval: 2 - MinDamage: Undamaged + Speed: 225 + LeavesTrails: + Offsets: -853,0,0 + MovingInterval: 2 + Image: smokey + StationaryInterval: 2 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition RevealsShroud: Range: 12c0 MinRange: 10c0 @@ -1537,10 +1726,8 @@ SUK.Husk.EMP: Inherits: ^EmpVisualEffect SUK.Husk.Empty: - Inherits: ^PlaneHuskEmpty Inherits: SUK.Husk - FallsToEarth: - Explosion: UnitExplodeDroneEmpty + Inherits: ^PlaneHuskEmpty SUK.Husk.Empty.EMP: Inherits: SUK.Husk.Empty @@ -1552,10 +1739,6 @@ PTNK.Husk: Name: Husk (Prism Tank) ThrowsParticle@turret: Anim: turret - TransformOnCapture: - IntoActor: ptnk - InfiltrateForTransform: - IntoActor: ptnk RenderSprites: Image: ptnk.destroyed @@ -1563,10 +1746,6 @@ PCAN.Husk: Inherits: ^Husk Tooltip: Name: Husk (Prism Cannon) - TransformOnCapture: - IntoActor: pcan - InfiltrateForTransform: - IntoActor: pcan RenderSprites: Image: pcan.destroyed @@ -1576,13 +1755,8 @@ WTNK.Husk: Name: Husk (Microwave Tank) ThrowsParticle@turret: Anim: turret - TransformOnCapture: - IntoActor: wtnk - InfiltrateForTransform: - IntoActor: wtnk RenderSprites: Image: mwtnk.destroyed - PlayerPalette: overlayplayertd LTNK.Husk: Inherits: ^HuskTD @@ -1590,13 +1764,8 @@ LTNK.Husk: Name: Husk (Light Tank) ThrowsParticle@turret: Anim: turret - TransformOnCapture: - IntoActor: ltnk - InfiltrateForTransform: - IntoActor: ltnk RenderSprites: Image: ltnk.destroyed - PlayerPalette: overlayplayertd CHPR.Husk: Inherits: ^Husk @@ -1604,23 +1773,24 @@ CHPR.Husk: Name: Husk (Chrono Prison) ThrowsParticle@turret: Anim: turret - TransformOnCapture: - IntoActor: chpr - InfiltrateForTransform: - IntoActor: chpr RenderSprites: Image: chpr.destroyed VENM.Husk: - Inherits: ^HelicopterHusk + Inherits: ^HelicopterHuskTD Tooltip: Name: Venom Aircraft: TurnSpeed: 4 Speed: 186 - SmokeTrailWhenDamaged: - Offset: -427,0,0 - MinDamage: Undamaged + LeavesTrails: + Offsets: -427,0,0 + Image: smokey + MovingInterval: 3 + StationaryInterval: 3 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition RevealsShroud: Range: 12c0 MinRange: 10c0 @@ -1631,17 +1801,14 @@ VENM.Husk: Type: GroundPosition RenderSprites: Image: venm - PlayerPalette: overlayplayertd VENM.Husk.EMP: Inherits: VENM.Husk Inherits: ^EmpVisualEffect VENM.Husk.Empty: - Inherits: ^HelicopterHuskEmpty Inherits: VENM.Husk - FallsToEarth: - Explosion: UnitExplodeDroneEmpty + Inherits: ^HelicopterHuskEmpty VENM.Husk.Empty.EMP: Inherits: VENM.Husk.Empty @@ -1653,9 +1820,335 @@ APOC.Husk: Name: Husk (Apocalypse) ThrowsParticle@turret: Anim: turret - TransformOnCapture: - IntoActor: apoc - InfiltrateForTransform: - IntoActor: apoc RenderSprites: Image: apoc.destroyed + +APOC.ERAD.Husk: + Inherits: ^Husk + Tooltip: + Name: Husk (Apocalyptic Eradicator) + ThrowsParticle@turret: + Anim: turret + RenderSprites: + Image: apoc.erad.destroyed + +OVLD.Husk: + Inherits: ^Husk + Tooltip: + Name: Husk (Overlord) + ThrowsParticle@turret: + Anim: turret + RenderSprites: + Image: ovld.destroyed + +OVLD.ERAD.Husk: + Inherits: ^Husk + Tooltip: + Name: Husk (Eradicator Overlord) + ThrowsParticle@turret: + Anim: turret + RenderSprites: + Image: ovld.erad.destroyed + +PMAK.Husk: + Inherits: ^PlaneHusk + Tooltip: + Name: Peacemaker + Aircraft: + TurnSpeed: 7 + Speed: 157 + Contrail@1: + Offset: -300,-920,170 + Contrail@2: + Offset: -300,920,170 + LeavesTrails: + Offsets: -1c43,0,0 + MovingInterval: 2 + Image: smokey + StationaryInterval: 2 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RenderSprites: + Image: pmak + +PMAK.Husk.EMP: + Inherits: PMAK.Husk + Inherits: ^EmpVisualEffect + +PMAK.Husk.Empty: + Inherits: PMAK.Husk + Inherits: ^PlaneHuskEmpty + +PMAK.Husk.Empty.EMP: + Inherits: PMAK.Husk.Empty + Inherits: ^EmpVisualEffect + +BEAG.Husk: + Inherits: ^PlaneHusk + Tooltip: + Name: Black Eagle + Aircraft: + TurnSpeed: 4 + Speed: 201 + LeavesTrails: + Offsets: -427,0,0 + Image: smokey + MovingInterval: 3 + StationaryInterval: 3 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + Contrail@1: + Offset: -50,-650,20 + Contrail@2: + Offset: -50,650,20 + RevealsShroud: + Range: 11c0 + MinRange: 9c0 + Type: GroundPosition + RevealGeneratedShroud: false + RevealsShroud@GAPGEN: + Range: 9c0 + Type: GroundPosition + RenderSprites: + Image: beag + +BEAG.Husk.EMP: + Inherits: BEAG.Husk + Inherits: ^EmpVisualEffect + +BEAG.Husk.Empty: + Inherits: BEAG.Husk + Inherits: ^PlaneHuskEmpty + +BEAG.Husk.Empty.EMP: + Inherits: BEAG.Husk.Empty + Inherits: ^EmpVisualEffect + +PHAN.Husk: + Inherits: ^PlaneHusk + Tooltip: + Name: Phantom + Aircraft: + TurnSpeed: 4 + Speed: 201 + LeavesTrails: + Offsets: -427,0,0 + Image: smokey + MovingInterval: 3 + StationaryInterval: 3 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + Contrail@1: + Offset: 50,-680,80 + Contrail@2: + Offset: 50,680,80 + RevealsShroud: + Range: 11c0 + MinRange: 9c0 + Type: GroundPosition + RevealGeneratedShroud: false + RevealsShroud@GAPGEN: + Range: 9c0 + Type: GroundPosition + RenderSprites: + Image: phan + +PHAN.Husk.EMP: + Inherits: PHAN.Husk + Inherits: ^EmpVisualEffect + +PHAN.Husk.Empty: + Inherits: PHAN.Husk + Inherits: ^PlaneHuskEmpty + +PHAN.Husk.Empty.EMP: + Inherits: PHAN.Husk.Empty + Inherits: ^EmpVisualEffect + +KAMV.Husk: + Inherits: ^HelicopterHusk + Tooltip: + Name: Kamov + Aircraft: + TurnSpeed: 4 + Speed: 112 + WithIdleOverlay@ROTORAIR: + Sequence: rotor + Offset: 50,550,192 + WithIdleOverlay@ROTORAIR2: + Sequence: rotor + Offset: 50,-550,192 + LeavesTrails: + Offsets: -427,0,0 + Image: smokey + MovingInterval: 3 + StationaryInterval: 3 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RevealsShroud: + Range: 11c0 + MinRange: 9c0 + Type: GroundPosition + RevealGeneratedShroud: false + RevealsShroud@GAPGEN: + Range: 9c0 + Type: GroundPosition + RenderSprites: + Image: kamv + +KAMV.Husk.EMP: + Inherits: HIND.Husk + Inherits: ^EmpVisualEffect + +KAMV.Husk.Empty: + Inherits: ^HelicopterHuskEmpty + Inherits: HIND.Husk + +KAMV.Husk.Empty.EMP: + Inherits: HIND.Husk.Empty + Inherits: ^EmpVisualEffect + +SHDE.Husk: + Inherits: ^PlaneHuskTD + Tooltip: + Name: Shade + Aircraft: + TurnSpeed: 4 + Speed: 225 + LeavesTrails: + Offsets: -427,0,0 + Image: smokey + MovingInterval: 3 + StationaryInterval: 3 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + Contrail@1: + Offset: -380,-850,-20 + Contrail@2: + Offset: -380,850,-20 + RevealsShroud: + Range: 11c0 + MinRange: 9c0 + Type: GroundPosition + RevealGeneratedShroud: false + RevealsShroud@GAPGEN: + Range: 9c0 + Type: GroundPosition + RenderSprites: + Image: shde + +SHDE.Husk.EMP: + Inherits: SHDE.Husk + Inherits: ^EmpVisualEffect + +SHDE.Husk.Empty: + Inherits: SHDE.Husk + Inherits: ^PlaneHuskEmpty + +SHDE.Husk.Empty.EMP: + Inherits: SHDE.Husk.Empty + Inherits: ^EmpVisualEffect + +VERT.Husk: + Inherits: ^PlaneHuskTD + Tooltip: + Name: Vertigo + Aircraft: + TurnSpeed: 4 + Speed: 157 + LeavesTrails: + Offsets: -427,0,0 + Image: smokey + MovingInterval: 3 + StationaryInterval: 3 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + Contrail@1: + Offset: -100,-850,25 + Contrail@2: + Offset: -100,850,25 + RevealsShroud: + Range: 11c0 + MinRange: 9c0 + Type: GroundPosition + RevealGeneratedShroud: false + RevealsShroud@GAPGEN: + Range: 9c0 + Type: GroundPosition + RenderSprites: + Image: vert + +VERT.Husk.EMP: + Inherits: VERT.Husk + Inherits: ^EmpVisualEffect + +VERT.Husk.Empty: + Inherits: VERT.Husk + Inherits: ^PlaneHuskEmpty + +VERT.Husk.Empty.EMP: + Inherits: VERT.Husk.Empty + Inherits: ^EmpVisualEffect + +MCOR.Husk: + Inherits: ^HelicopterHuskTD + Tooltip: + Name: Manticore + GenericName: Destroyed Aircraft + Aircraft: + TurnSpeed: 8 + Speed: 35 + FallsToEarth: + MaximumSpinSpeed: 0 + RevealsShroud: + Range: 10c0 + MinRange: 8c0 + Type: GroundPosition + RevealGeneratedShroud: false + RevealsShroud@GAPGEN: + Range: 8c0 + Type: GroundPosition + RenderSprites: + Image: mcor + FallsToEarth: + Explosion: KirovExplode + +MCOR.Husk.EMP: + Inherits: MCOR.Husk + Inherits@EMP: ^EmpVisualEffect + +DISC.Husk: + Inherits: ^HelicopterHusk + Tooltip: + Name: Floating Disc + Aircraft: + TurnSpeed: 12 + Speed: 112 + LeavesTrails: + Offsets: -427,0,0 + Image: smokey + MovingInterval: 3 + StationaryInterval: 3 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RevealsShroud: + Range: 11c0 + MinRange: 9c0 + Type: GroundPosition + RevealGeneratedShroud: false + RevealsShroud@GAPGEN: + Range: 9c0 + Type: GroundPosition + RenderSprites: + Image: disccrash + +DISC.Husk.EMP: + Inherits: DISC.Husk + Inherits: ^EmpVisualEffect diff --git a/mods/ca/rules/infantry.yaml b/mods/ca/rules/infantry.yaml index d91c4990d9..9033f07e91 100644 --- a/mods/ca/rules/infantry.yaml +++ b/mods/ca/rules/infantry.yaml @@ -1,13 +1,16 @@ DOG: Inherits: ^Soldier Buildable: - Queue: Infantry + Queue: InfantrySQ, DogMQ BuildAtProductionType: Dog - BuildPaletteOrder: 50 - Prerequisites: ~kenn, ~techlevel.infonly - Description: Anti-infantry unit.\n Can detect spies, mines and cloaked units.\n Strong vs Infantry\n Weak vs Vehicles, Aircraft + BuildPaletteOrder: 51 + Prerequisites: kenn, ~infantry.dog, ~!tdog.upgrade + Description: Melee anti-infantry scout unit. + TooltipExtras: + Strengths: • Strong vs Infantry + Weaknesses: • Can only attack Infantry + Attributes: • Detects cloaked units, spies and mines\n• Detects the scent of enemy infantry beyond vision range\n• Immune to mind control RenderSprites: - Scale: 0.7 PlayerPalette: player WithDeathAnimation: DeathSequencePalette: player @@ -19,12 +22,11 @@ DOG: UpdatesPlayerStatistics: AddToArmyValue: true Selectable: - Bounds: 12,17,-1,-4 - DecorationBounds: 12,17,-1,-4 + Bounds: 512, 725, -42, -170 Health: HP: 1800 Mobile: - Speed: 82 + Speed: 94 Voice: Move PauseOnCondition: attack-cooldown || eating || being-warped Guard: @@ -32,13 +34,13 @@ DOG: Passenger: Voice: Move RevealsShroud: - Range: 5c512 + Range: 6c0 Armament: Weapon: DogJaw ReloadingCondition: attack-cooldown AttackLeap: Voice: Attack - PauseOnCondition: attacking || attack-cooldown || being-warped + PauseOnCondition: attacking || attack-cooldown || being-warped || blinded || reapersnare AttackMove: Voice: Move GrantConditionOnAttack: @@ -47,17 +49,18 @@ DOG: GrantConditionWhileAiming: Condition: run AutoTarget: - InitialStance: AttackAnything + AllowMovement: False AutoTargetPriority@DEFAULT: ValidTargets: Infantry - Targetable: - RequiresCondition: !being-warped - TargetTypes: Ground, Infantry, ChaosImmune + Targetable@ChaosImmune: + TargetTypes: ChaosImmune + Targetable@MindControlImmune: + TargetTypes: MindControlImmune WithInfantryBody: MoveSequence: walk StandSequences: stand DefaultAttackSequence: eat - RequiresCondition: !run + RequiresCondition: !run && !parachute && !being-warped && !reapersnare WithInfantryBody@RUN: MoveSequence: run RequiresCondition: run @@ -66,25 +69,87 @@ DOG: RequiresCondition: run IgnoresDisguise: DetectCloaked: - CloakTypes: Cloak, Thief, Mine - Range: 4c0 + DetectionTypes: Cloak, AirCloak + Range: 6c0 + DetectCloaked@Mine: + DetectionTypes: Mine + Range: 5c0 + RangedGpsRadarProvider: + Range: 10c0 + TargetTypes: Infantry + WithRangeCircle: + Type: DogDetection + Range: 10c0 + Color: ffffff50 Voiced: VoiceSet: DogVoice -TakeCover: -Captures@DRIVER_KILL: -CaptureManager: + -Targetable@SpyDisguise: + TargetedAttackAbility: + TargetCursor: attack + ArmamentNames: primary + CircleWidth: 0 + Type: DogAttack + DeployCursor: move + KeepsDistance: + GuardsSelection: + ValidOrders: AttackMove, AssaultMove, ForceAttack, KeepDistance + ValidTargets: Infantry, Vehicle + Encyclopedia: + Category: Soviets/Infantry + +TDOG: + Inherits: DOG + Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove + Inherits@SELECTION: ^SelectableSupportUnit + Buildable: + Prerequisites: kenn, ~infantry.dog, ~tdog.upgrade + Description: Scout with attached explosives that will detonate on contact with a target. + Tooltip: + Name: Terror Dog + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor, Heavy Armor + Weaknesses: • Cannot attack Aircraft + Attributes: • Detects cloaked units, spies and mines\n• Detects the scent of enemy infantry beyond vision range\n• Immune to mind control\n• Explodes on death or on contact with a target + Valued: + Cost: 300 + KillsSelf: + RequiresCondition: eating + Armament: + Weapon: TerrorDogJaw + FireWarheadsOnDeath: + Weapon: DogExplode + EmptyWeapon: DogExplode + RequiresCondition: !being-warped + AttackLeap: + TargetFrozenActors: False + Targetable@TerrorDog: + TargetTypes: TerrorDog + AutoTarget: + ScanRadius: 4 + ProductionCostMultiplier@UkraineBonus: + Multiplier: 80 + Prerequisites: player.ukraine + -GuardsSelection: + -KeepsDistance: E1: Inherits: ^Soldier Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove - Inherits@BERSERK: ^Berserk Inherits@BOTHELPER: ^BotCaptureHelper + Inherits@Inspirable: ^Inspirable + Inherits@HeroOfTheUnionTargetable: ^HeroOfTheUnionTargetable Buildable: - Queue: Infantry + Queue: InfantrySQ, InfantryMQ BuildAtProductionType: Soldier BuildPaletteOrder: 10 - Prerequisites: ~infantry.ra, ~techlevel.infonly - Description: General-purpose infantry.\n Strong vs Infantry\n Weak vs Vehicles, Aircraft + Prerequisites: ~infantry.ra + Description: General-purpose infantry. + TooltipExtras: + Strengths: • Strong vs Infantry + Weaknesses: • Weak vs Heavy Armor, Buildings, Defenses\n• Cannot attack Aircraft Valued: Cost: 100 Tooltip: @@ -95,39 +160,50 @@ E1: HP: 5000 Armament@PRIMARY: Weapon: M1Carbine - Armament@Garrison: - Name: mounted - Weapon: M1CarbineE + Armament@BATF: + Name: batf + Weapon: M1CarbineBATF MuzzleSequence: garrison-muzzle WithInfantryBody: DefaultAttackSequence: shoot IdleSequences: idle1,idle2,idle3,idle4 AttackFrontal: - PauseOnCondition: being-warped + PauseOnCondition: being-warped || blinded || reapersnare + FacingTolerance: 0 ProducibleWithLevel: Prerequisites: barracks.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: barracks.upgraded Convertible: SpawnActors: N1C + Encyclopedia: + Category: Allies/Infantry; Soviets/Infantry E1R1: Inherits: E1 RenderSprites: Image: E1 ProducibleWithLevel: - Prerequisites: techlevel.infonly + -Prerequisites: InitialLevels: 1 -Buildable: + -Encyclopedia: E2: Inherits: ^Soldier Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove - Inherits@BERSERK: ^Berserk + Inherits@Inspirable: ^Inspirable + Inherits@HeroOfTheUnionTargetableGrenFlamer: ^HeroOfTheUnionTargetableGrenFlamer Buildable: - Queue: Infantry + Queue: InfantrySQ, InfantryMQ BuildAtProductionType: Soldier - BuildPaletteOrder: 30 - Prerequisites: ~infantry.e2, ~techlevel.infonly - Description: Infantry armed with grenades.\n Strong vs Buildings, Infantry\n Weak vs Vehicles, Aircraft + BuildPaletteOrder: 40 + Prerequisites: ~infantry.e2 + Description: Infantry armed with grenades. + TooltipExtras: + Strengths: • Strong vs Buildings, Defenses, Light Armor + Weaknesses: • Weak vs Heavy Armor\n• Cannot attack Aircraft\n• Has difficulty hitting moving targets Valued: Cost: 160 Tooltip: @@ -137,40 +213,51 @@ E2: Health: HP: 5000 Mobile: - Speed: 56 + Speed: 60 Armament@PRIMARY: Weapon: Grenade LocalOffset: 0,0,555 FireDelay: 15 - Armament@Garrison: - Name: mounted - Weapon: GrenadeE + Armament@BATF: + Name: batf + Weapon: Grenade FireDelay: 15 TakeCover: ProneOffset: 256,64,-331 AttackFrontal: - PauseOnCondition: being-warped + PauseOnCondition: being-warped || blinded || reapersnare + FacingTolerance: 0 WithInfantryBody: + StandSequences: stand DefaultAttackSequence: throw - Explodes: - Weapon: UnitExplodeSmall - EmptyWeapon: UnitExplodeSmall - Chance: 33 + FireWarheadsOnDeath: + Weapon: UnitExplodeGrenade + EmptyWeapon: UnitExplodeGrenade + Chance: 100 DamageSource: Killer RequiresCondition: !being-warped ProducibleWithLevel: Prerequisites: barracks.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: barracks.upgraded + Encyclopedia: + Category: Soviets/Infantry E3: Inherits: ^Soldier - Inherits@AUTOTARGET: ^AutoTargetAllAssaultMoveAntiAir - Inherits@BERSERK: ^Berserk + Inherits@AUTOTARGET: ^AutoTargetAllAssaultMovePrioritizeAir + Inherits@Inspirable: ^Inspirable + Inherits@HeroOfTheUnionTargetable: ^HeroOfTheUnionTargetable Buildable: - Queue: Infantry + Queue: InfantrySQ, InfantryMQ BuildAtProductionType: Soldier BuildPaletteOrder: 20 - Prerequisites: ~infantry.ra, ~techlevel.infonly - Description: Anti-tank/anti-aircraft infantry.\n Strong vs Tanks, Aircraft\n Weak vs Infantry + Prerequisites: ~infantry.ra + Description: Anti-tank/anti-aircraft infantry. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Aircraft, Buildings, Defenses + Weaknesses: • Weak vs Infantry, Light Armor Valued: Cost: 300 Tooltip: @@ -180,49 +267,41 @@ E3: Health: HP: 3500 Mobile: - Speed: 38 + Speed: 41 Armament@PRIMARY: Weapon: RedEye LocalOffset: 0,0,500 PauseOnCondition: !ammo - RequiresCondition: !cryr-upgrade + RequiresCondition: !cryw-upgrade Armament@PRIMARYUPG: Weapon: RedEye.CRYO LocalOffset: 0,0,500 PauseOnCondition: !ammo - RequiresCondition: cryr-upgrade + RequiresCondition: cryw-upgrade Armament@SECONDARY: Name: secondary Weapon: Dragon LocalOffset: 0,0,500 PauseOnCondition: !ammo - RequiresCondition: !cryr-upgrade + RequiresCondition: !cryw-upgrade Armament@SECONDARYUPG: Name: secondary Weapon: Dragon.CRYO LocalOffset: 0,0,500 PauseOnCondition: !ammo - RequiresCondition: cryr-upgrade - Armament@GarrisonAA: - Name: mountedaa - Weapon: RedEyeE - PauseOnCondition: !ammo - RequiresCondition: !cryr-upgrade - Armament@GarrisonAAUPG: - Name: mountedaa - Weapon: RedEye.CRYO - PauseOnCondition: !ammo - RequiresCondition: cryr-upgrade - Armament@Garrison: - Name: mounted - Weapon: DragonE - PauseOnCondition: !ammo - RequiresCondition: !cryr-upgrade - Armament@GarrisonUPG: - Name: mounted - Weapon: DragonE.CRYO - PauseOnCondition: !ammo - RequiresCondition: cryr-upgrade + RequiresCondition: cryw-upgrade + # Prevents attack moving forwards when main weapon is paused for reload + Armament@Targeter: + Weapon: DragonTargeter + LocalOffset: 0,0,500 + Armament@BATF: + Name: batf + Weapon: DragonBATF + RequiresCondition: !cryw-upgrade + Armament@BATFUPG: + Name: batf + Weapon: DragonBATF.CRYO + RequiresCondition: cryw-upgrade AmmoPool: Ammo: 1 AmmoCondition: ammo @@ -232,30 +311,34 @@ E3: TakeCover: ProneOffset: 384,0,-395 AttackFrontal: - PauseOnCondition: being-warped + PauseOnCondition: being-warped || blinded || reapersnare + FacingTolerance: 0 ProducibleWithLevel: Prerequisites: barracks.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: barracks.upgraded AutoTarget: - ScanRadius: 5 + MaximumScanTimeInterval: 5 GrantConditionOnPrerequisite@CRYO: - Condition: cryr-upgrade - Prerequisites: cryr.upgrade + Condition: cryw-upgrade + Prerequisites: cryw.upgrade WithInfantryBody: DefaultAttackSequence: shoot - RequiresCondition: !cryr-upgrade + RequiresCondition: !cryw-upgrade && !parachute && !being-warped && !reapersnare WithInfantryBody@CRYO: IdleSequences: idle-cryo1, idle-cryo2 StandSequences: stand-cryo, stand-cryo2 AttackSequences: shoot-cryo DefaultAttackSequence: shoot-cryo MoveSequence: run-cryo - RequiresCondition: cryr-upgrade + RequiresCondition: cryw-upgrade && !parachute && !being-warped && !reapersnare WithDeathAnimation: - RequiresCondition: !cryr-upgrade + RequiresCondition: !cryw-upgrade WithDeathAnimation@CRYO: - RequiresCondition: cryr-upgrade + RequiresCondition: cryw-upgrade DeathSequence: die-cryo - DeathSequencePalette: overlayplayertd + DeathSequencePalette: playertd DeathTypes: DefaultDeath: 1 BulletDeath: 2 @@ -271,114 +354,392 @@ E3: CrushedSequence: die-crushed Convertible: SpawnActors: N3C + Encyclopedia: + Category: Allies/Infantry; Soviets/Infantry + +U3: + Inherits: ^Soldier + Inherits@AUTOTARGET: ^AutoTargetAllAssaultMovePrioritizeAir + Inherits@BOTHELPER: ^BotCaptureHelper + Buildable: + Queue: GuardianGI + Description: Allied specialist paradropped infantry. + Valued: + Cost: 350 + Tooltip: + Name: Guardian G.I + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Aircraft, Buildings, Defenses + Weaknesses: • Weak vs Infantry, Light Armor\n• Weak anti-infantry weapon when not deployed + Attributes: • Deploys for personal anti-tank fortification\n• Uncrushable when deployed + UpdatesPlayerStatistics: + AddToArmyValue: true + Health: + HP: 6500 + Mobile: + Speed: 41 + Voice: Move + PauseOnCondition: !undeployed || being-warped + ImmovableCondition: deployed + RequireForceMoveCondition: !undeployed + Armament@PRIMARY: + Weapon: M14 + LocalOffset: 0,0,400 + RequiresCondition: !deployed + Armament@PRIMARYDEP: + Weapon: RedEyeGI + Name: deployed + Turret: deploy + LocalOffset: 0,0,400 + PauseOnCondition: !ammo + RequiresCondition: !cryw-upgrade && deployed + Armament@PRIMARYDEPUPG: + Weapon: RedEyeGI.CRYO + Name: deployed + Turret: deploy + LocalOffset: 0,0,400 + PauseOnCondition: !ammo + RequiresCondition: cryw-upgrade && deployed + Armament@SECONDARYDEP: + Name: deployed + Weapon: DragonGI + Turret: deploy + LocalOffset: 0,0,400 + PauseOnCondition: !ammo + RequiresCondition: !cryw-upgrade && deployed + Armament@SECONDARYDEPUPG: + Weapon: DragonGI.CRYO + Name: deployed + Turret: deploy + LocalOffset: 0,0,400 + PauseOnCondition: !ammo + RequiresCondition: cryw-upgrade && deployed + Armament@BATF: + Name: batf + Weapon: DragonBATF.CYB + RequiresCondition: !cryw-upgrade + Armament@BATFUPG: + Name: batf + Weapon: DragonBATF.CRYO + RequiresCondition: cryw-upgrade + Armament@AIDummyAiming: ## Hack: Make AI deploy to attack air + PauseOnCondition: being-warped + RequiresCondition: botowner && !deployed + Weapon: AirDummyAim + AmmoPool: + Ammo: 1 + AmmoCondition: ammo + ReloadAmmoPool: + Delay: 25 + Count: 1 + TakeCover: + ProneOffset: 384,0,-395 + RequiresCondition: !deployed + DamageMultiplier: + Modifier: 50 + RequiresCondition: deployed + ProducibleWithLevel: + Prerequisites: barracks.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: barracks.upgraded + AutoTarget: + MaximumScanTimeInterval: 5 + AllowMovement: False + GrantConditionOnPrerequisite@CRYO: + Condition: cryw-upgrade + Prerequisites: cryw.upgrade + GrantConditionOnDeploy: + DeployedCondition: deployed + UndeployedCondition: undeployed + UndeployOnMove: True + Voice: Action + DeploySounds: igidepa.aud, igidepb.aud + UndeploySounds: igidepa.aud, igidepb.aud + PauseOnCondition: being-warped + SmartDeploy: True + Facing: 332 + GrantCondition: + Condition: editorhack + WithInfantryBody@Editor: # HACK: negative conditions don't count in EnabledByDefault, we can use this duplicate WIB to render it on map editor + DefaultAttackSequence: shoot + RequiresCondition: !editorhack + WithInfantryBody: + DefaultAttackSequence: shoot + RequiresCondition: undeployed && !parachute && !being-warped && !reapersnare + WithInfantryBody@Parachute: + RequiresCondition: undeployed && (parachute || reapersnare) + WithMakeAnimation: + Sequence: deploy + BodyNames: dot + Turreted: + Turret: deploy + RealignDelay: -1 + TurnSpeed: 1023 + InitialFacing: 332 + WithSpriteTurret@idle: + Turret: deploy + Sequence: deployed + RequiresCondition: deployed && !cryw-upgrade && !animate-turret && !parachute + WithSpriteTurret@animated: + Turret: deploy + Sequence: deploy-shoot + RequiresCondition: deployed && !cryw-upgrade && animate-turret && !parachute + WithSpriteTurret@idleupg: + Turret: deploy + Sequence: deployedcr + RequiresCondition: deployed && cryw-upgrade && !animate-turret && !parachute + WithSpriteTurret@animatedupg: + Turret: deploy + Sequence: deploy-shootcr + RequiresCondition: deployed && cryw-upgrade && animate-turret && !parachute + WithSpriteBody: + Sequence: empty + Name: dot + RequiresCondition: !undeployed + AttackFrontal: + PauseOnCondition: being-warped || blinded || reapersnare + RequiresCondition: undeployed + Voice: Attack + FacingTolerance: 0 + AttackTurreted@deployed: + Armaments: deployed + Turrets: deploy + Voice: Attack + RequiresCondition: deployed + OutsideRangeRequiresForceFire: True + RangeMargin: 0 + PauseOnCondition: being-warped || blinded || reapersnare + GrantConditionOnAttack: + Condition: animate-turret + RevokeDelay: 5 + ArmamentNames: deployed + RejectsOrders@deployment: + Reject: AttackMove, AssaultMove + RequiresCondition: !botowner && deployed && !berserk + Convertible: + SpawnActors: N3C + AttackMove: + Voice: Move + Passenger: + Voice: Move + Guard: + Voice: Move + Voiced: + VoiceSet: GGIVoice + Crushable: + RequiresCondition: !invulnerability && !being-warped && undeployed + AutoDeployer@AI: + RequiresCondition: botowner && !deployed && !parachute + DeployChance: 100 + DeployTrigger: Attack + DeployTicks: 5 + UndeployTicks: 50 + Encyclopedia: + Category: Allies/Infantry + EncyclopediaExtras: + Subfaction: usa + +U3R2: + Inherits: U3 + RenderSprites: + Image: u3 + ProducibleWithLevel: + -Prerequisites: + InitialLevels: 2 + Selectable: + Class: u3 + -Encyclopedia: + -EncyclopediaExtras: + +U3.squad: + AlwaysVisible: + Interactable: + ScriptTriggers: + ProvidesPrerequisite@squadname: + Tooltip: + Name: Airdrop: Guardian GIs + Buildable: + Queue: InfantrySQ, InfantryMQ + BuildAtProductionType: ParadropInfantry + BuildPaletteOrder: 300 + Prerequisites: radaroraircraft, ~infantry.usa, ~techlevel.medium + Description: Prepare five Guardian GIs for airdrop. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Aircraft, Buildings, Defenses + Weaknesses: • Weak vs Infantry, Light Armor\n• Weak anti-infantry weapon when not deployed + Attributes: • Deploys for personal anti-tank fortification\n• Uncrushable when deployed + Valued: + Cost: 1750 + RenderSprites: + Image: squad.airborne + ProduceActorPowerCA: + Actors: powerproxy.airborne + Type: ParadropInfantry + OneShot: true + AutoFire: true + AllowMultiple: true + Armor: + Type: None + ProductionTimeMultiplier: + Multiplier: 75 + Prerequisites: airborne.upgrade E3R1: Inherits: E3 RenderSprites: Image: E3 ProducibleWithLevel: - Prerequisites: techlevel.infonly + -Prerequisites: InitialLevels: 1 -Buildable: + -Encyclopedia: E4: Inherits: ^Soldier Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove - Inherits@BERSERK: ^Berserk + Inherits@Inspirable: ^Inspirable + Inherits@HeroOfTheUnionTargetableGrenFlamer: ^HeroOfTheUnionTargetableGrenFlamer Buildable: - Queue: Infantry + Queue: InfantrySQ, InfantryMQ BuildAtProductionType: Soldier BuildPaletteOrder: 70 - Prerequisites: ~barr, ftur, ~techlevel.infonly - Description: Anti-infantry/anti-structure unit.\n Strong vs Infantry, Buildings\n Weak vs Vehicles, Aircraft + Prerequisites: ~barr, fturorradar, ~techlevel.low + Description: Short-range anti-infantry/anti-structure infantry. + TooltipExtras: + Strengths: • Strong vs Infantry, Buildings + Weaknesses: • Weak vs Heavy Armor, Defenses\n• Cannot attack Aircraft Valued: Cost: 200 Tooltip: - Name: Flamethrower + Name: Soviet Flamethrower UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 7000 + HP: 9000 Mobile: - Speed: 49 + Speed: 46 Armament: Weapon: FireballGun LocalOffset: 341,0,256 - Armament@Garrison: - Name: mounted - Weapon: FlamerE + Armament@BATF: + Name: batf + Weapon: FireballGun TakeCover: ProneOffset: 160,0,-256 WithMuzzleOverlay: AttackFrontal: - PauseOnCondition: being-warped + PauseOnCondition: being-warped || blinded || reapersnare + FacingTolerance: 0 WithInfantryBody: DefaultAttackSequence: shoot - Explodes: + FireWarheadsOnDeath: Weapon: UnitExplodeFlameSmall EmptyWeapon: UnitExplodeFlameSmall - Chance: 33 + Chance: 100 DamageSource: Killer RequiresCondition: !being-warped ProducibleWithLevel: Prerequisites: barracks.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: barracks.upgraded Convertible: SpawnActors: N5 + Encyclopedia: + Category: Soviets/Infantry E6: Inherits: ^Soldier - Inherits@SELECTION: ^SelectableSupportUnit + Inherits@ENGINEER: ^EngineerBase + Mobile: + ImmovableCondition: deployed + RequireForceMoveCondition: !undeployed Buildable: - Queue: Infantry - BuildAtProductionType: Soldier - BuildPaletteOrder: 60 - Prerequisites: ~infantry.ra, ~techlevel.infonly - Description: Infiltrates and captures\nenemy structures.\n Can repair friendly structures & bridges and defuse bombs.\n Special Ability: Repair\n Special Ability: Defuse\n Unarmed - Valued: - Cost: 500 + BuildPaletteOrder: 31 + Prerequisites: ~infantry.ra Tooltip: Name: Engineer - UpdatesPlayerStatistics: - AddToArmyValue: true - WithInfantryBody: - Passenger: - CustomPipType: yellow - EngineerRepair: - RepairsBridges: - CaptureManager: - Captures: - CaptureTypes: building - PlayerExperience: 25 - CaptureDelay: 150 - Armament@defuse: - Weapon: DefuseKit - Cursor: goldwrench - OutsideRangeCursor: goldwrench - TargetRelationships: Ally - ForceTargetRelationships: None - Name: secondary - AutoTarget: - AutoTargetPriority@defuse: - ValidTargets: C4Attached, TNTAttached - InvalidTargets: NoAutoTarget - ValidRelationships: Ally - AttackFrontal: - Armaments: primary, secondary - PauseOnCondition: being-warped Voiced: VoiceSet: EngineerVoice - Targetable: - TargetTypes: Ground, Infantry, Disguise, ChaosImmune + WithInfantryBody: + StandSequences: stand + RequiresCondition: undeployed && !parachute && !being-warped && !reapersnare + WithInfantryBody@Parachute: + RequiresCondition: undeployed && (parachute || reapersnare) + WithSpriteBody@SETUP: + Name: setupbody + Sequence: idle-deployed-setup + RequiresCondition: !undeployed && !parachute && !being-warped && setting-up + WithSpriteBody@DEPLOYED: + Name: deployedbody + Sequence: idle-deployed + RequiresCondition: !undeployed && !parachute && !being-warped && !setting-up + WithMakeAnimation@SETUP: + BodyNames: setupbody + Sequence: deploy + WithMakeAnimation@DEPLOYED: + BodyNames: deployedbody + Sequence: deploy + GrantConditionOnDeploy: + DeployedCondition: deployed + UndeployedCondition: undeployed + DeploySounds: igidepa.aud, igidepb.aud + UndeploySounds: igidepa.aud, igidepb.aud + UndeployOnMove: true + PauseOnCondition: being-warped + SmartDeploy: true + RequiresCondition: !parachute && entrench-upgrade + GrantTimedCondition@SETUP: + Condition: setting-up + RequiresCondition: !undeployed + Duration: 50 + GivesBuildableArea: + AreaTypes: defense + RequiresCondition: deployed && !setting-up + BaseProvider: + RequiresCondition: deployed && !setting-up + Range: 5c0 + GrantCondition@EDITOR: + Condition: editorhack + WithInfantryBody@EDITOR: + RequiresCondition: !editorhack + GrantConditionOnPrerequisite@ENTRENCH: + Condition: entrench-upgrade + Prerequisites: entrench.upgrade + WithRangeCircle: + Type: EngineerRange + Range: 5c0 + Color: ffffff50 + RequiresCondition: entrench-upgrade + -ReloadAmmoDelayMultiplier@Inspiration1: + -ReloadAmmoDelayMultiplier@Inspiration2: + Encyclopedia: + Category: Allies/Infantry; Soviets/Infantry + EncyclopediaExtras: + RenderPreviewActor: e6.preview + +E6.Preview: + Inherits: ^PreviewDummy + Inherits@TDPalette: ^TDPalette + RenderSprites: + Image: e6 + WithInfantryBody: + QuantizeFacingsFromSequence: + Sequence: stand SPY: Inherits: ^Soldier - Inherits@COMMANDOSKULL: ^CommandoSkull + Inherits@SELECTION: ^SelectableSupportUnit Buildable: - Queue: Infantry + Queue: InfantrySQ, InfantryMQ BuildAtProductionType: Soldier - BuildPaletteOrder: 100 + BuildPaletteOrder: 82 Prerequisites: ~tent, anyradar, ~techlevel.medium - Description: Infiltrates enemy structures for intel or\nsabotage. Exact effect depends on the\nbuilding infiltrated.\n Unarmed\n Special Ability: Disguise + Description: Infiltrates enemy structures for intel or sabotage. Effects depend on the building infiltrated. + TooltipExtras: + Weaknesses: • Unarmed + Attributes: • Disguise as enemy infantry by right-clicking them\n• Detects cloaked ground units and spies\n • Infiltration effects:\n • Power Plants: Power outage\n • Barracks/Factory: Infantry/vehicles produced as veteran\n • Superweapons: Reset timer\n • Radar: Reset shroud\n • Helipad: Single-use paratroopers\n • Airfield/Gravity Stabilizer: Single-use airstrike Valued: Cost: 500 -Tooltip: @@ -389,29 +750,39 @@ SPY: AddToArmyValue: true -Guard: Mobile: - Speed: 49 + Speed: 54 Voice: Move RevealsShroud: - Range: 5c0 + Range: 7c0 + MinRange: 6c0 + RevealGeneratedShroud: false + RevealsShroud@GAPGEN: + Range: 6c0 Passenger: CustomPipType: blue Voice: Move Disguise: + TargetTypes: SpyDisguise DisguisedCondition: disguise DisguisedAsConditions: rmbo: cmdo-disguise e7: cmdo-disguise bori: cmdo-disguise + mast: cmdo-disguise + yuri: cmdo-disguise + seal: seal-disguise + cmsr: cmsr-disguise Infiltrates: - Types: SpyInfiltrate + Types: ResetSupportPowerInfiltrate, PowerOutageInfiltrate, VetInfiltrate, ResetShroudInfiltrate, GrantSupportPowerInfiltrate Notification: BuildingInfiltrated - PlayerExperience: 50 + TextNotification: Building infiltrated. -WithInfantryBody: WithDisguisingInfantryBody: DefaultAttackSequence: shoot IdleSequences: idle1,idle2 StandSequences: stand,stand2 - RequiresCondition: !being-warped + RequiresCondition: !being-warped && !reapersnare + WithDisguiseTargetPalette: WithDecoration@disguise: Image: pips Sequence: pip-disguise @@ -419,26 +790,66 @@ SPY: Position: TopRight RequiresCondition: disguise IgnoresDisguise: - WithDecoration@COMMANDOSKULL: + DetectCloaked: + Range: 5c0 + WithDecoration@CommandoSkull: + Image: pips + Sequence: pip-skull + Palette: effect + Position: TopLeft + ValidRelationships: Ally, Enemy, Neutral RequiresCondition: cmdo-disguise + WithDecoration@SealIcon: + Image: pips + Sequence: pip-seal + Palette: effect + Position: TopLeft + ValidRelationships: Ally, Enemy, Neutral + RequiresCondition: seal-disguise + WithDecoration@CommissarStar: + Image: pips + Sequence: pip-cmsr + Palette: effect + Position: TopLeft + ValidRelationships: Ally, Enemy, Neutral + RequiresCondition: cmsr-disguise + WithIdleOverlay@Inspiration: + Image: ussrstar + Sequence: idle-overlay1 + Palette: effect + RequiresCondition: cmsr-disguise AttackMove: Voice: Move Voiced: VoiceSet: SpyVoice Targetable: - TargetTypes: Ground, Infantry, Disguise, ChaosImmune + TargetTypes: Ground, Infantry + Targetable@Disguised: + TargetTypes: Disguised + RequiresCondition: disguise + WithColoredSelectionBox@Disguised: + RequiresCondition: disguise + ColorSource: Player + Encyclopedia: + Category: Allies/Infantry E7: Inherits: ^Soldier Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove Inherits@COMMANDOSKULL: ^CommandoSkull + Inherits@CommandoRegen: ^CommandoRegen + Inherits@HEALINGCOOLDOWN: ^HealingCooldown Buildable: - Queue: Infantry + Queue: InfantrySQ, InfantryMQ BuildAtProductionType: Soldier - BuildPaletteOrder: 190 - Prerequisites: ~tent, atek, ~techlevel.infonly + BuildPaletteOrder: 200 + Prerequisites: ~tent, atek, ~techlevel.high BuildLimit: 1 - Description: Elite commando infantry. Armed with\ndual pistols and C4.\n Can detect cloaked units.\n Maximum 1 can be trained.\n Strong vs Infantry, Buildings\n Weak vs Aircraft\n Special Ability: C4 Explosives + Description: Elite commando infantry armed with dual pistols and C4. + TooltipExtras: + Strengths: • Strong vs Infantry, Buildings + Weaknesses: • Cannot attack Aircraft + Attributes: • Maximum 1 can be trained\n• Detects cloaked ground units and spies\n• Immune to mind control\n• Plants C4 to destroy structures and vehicles Valued: Cost: 1350 Tooltip: @@ -448,10 +859,12 @@ E7: Health: HP: 11000 Mobile: - Speed: 56 + Speed: 60 Voice: Move Guard: Voice: Move + AttackMove: + Voice: Move RevealsShroud: Range: 6c0 Passenger: @@ -459,9 +872,9 @@ E7: Voice: Move Armament@PRIMARY: Weapon: Colt45 - Armament@mountedPRIMARY: - Weapon: Colt45E - Name: mounted + Armament@BATF: + Weapon: Colt45BATF + Name: batf MuzzleSequence: garrison-muzzle Armament@sapper: Weapon: PlaceC4 @@ -469,8 +882,11 @@ E7: OutsideRangeCursor: c4 Name: secondary AttackFrontal: - PauseOnCondition: being-warped + PauseOnCondition: being-warped || blinded || reapersnare Armaments: primary, secondary + FacingTolerance: 0 + AutoTarget: + AllowMovement: false WithInfantryBody: DefaultAttackSequence: shoot StandSequences: stand @@ -489,26 +905,46 @@ E7: AnnounceOnKill: IgnoresDisguise: DetectCloaked: - CloakTypes: Cloak, Thief - Range: 5c0 + Range: 2c0 Voiced: VoiceSet: TanyaVoice ProducibleWithLevel: Prerequisites: barracks.upgraded - Targetable: - TargetTypes: Ground, Infantry, Disguise, ChaosImmune, MindControlImmune + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: barracks.upgraded + Targetable@Hero: + TargetTypes: Hero + Targetable@MindControlImmune: + TargetTypes: MindControlImmune + Targetable@ChaosImmune: + TargetTypes: ChaosImmune + Targetable@ReaperSnareImmune: + TargetTypes: ReaperSnareImmune -Crushable: TakeCover: SpeedModifier: 70 + TargetSpecificOrderVoice: + Orders: Attack, ForceAttack + TargetTypeVoices: + Vehicle: Demolish + Structure: Demolish + ChangesHealth@ELITE: + Delay: 50 + Encyclopedia: + Category: Allies/Infantry MEDI: Inherits: ^Soldier + Inherits@Inspirable: ^Inspirable Buildable: - Queue: Infantry + Queue: InfantrySQ, InfantryMQ BuildAtProductionType: Soldier - BuildPaletteOrder: 40 - Prerequisites: ~infantry.medi, ~techlevel.infonly - Description: Heals nearby infantry.\n Unarmed + BuildPaletteOrder: 50 + Prerequisites: ~infantry.medi + Description: Heals nearby infantry. + TooltipExtras: + Weaknesses: • Unarmed Valued: Cost: 200 Tooltip: @@ -531,7 +967,10 @@ MEDI: TargetRelationships: Ally ForceTargetRelationships: None AttackFrontal: - PauseOnCondition: being-warped + PauseOnCondition: being-warped || blinded || reapersnare || berserkactive + FacingTolerance: 0 + AttackSoundsCA@HEALSOUND: + Sounds: heal2.aud WithInfantryBody: IdleSequences: idle StandSequences: stand @@ -540,28 +979,35 @@ MEDI: VoiceSet: MedicVoice AutoTarget: AutoTargetPriority@DEFAULT: - ValidTargets: Infantry + ValidTargets: Healable ValidRelationships: Ally Mobile: Voice: Move - PauseOnCondition: being-warped ProducibleWithLevel: Prerequisites: barracks.upgraded - Targetable: - TargetTypes: Ground, Infantry, Disguise, ChaosImmune + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: barracks.upgraded GuardsSelection: ValidTargets: Infantry + KeepsDistance: + Encyclopedia: + Category: Allies/Infantry; GDI/Infantry MECH: Inherits: ^Soldier + Inherits@Inspirable: ^Inspirable Buildable: - Queue: Infantry + Queue: InfantrySQ, InfantryMQ BuildAtProductionType: Soldier - BuildPaletteOrder: 90 - Prerequisites: repair, ~infantry.mech, ~techlevel.medium - Description: Repairs nearby vehicles and restores\nhusks to working condition by capturing them.\n Unarmed + BuildPaletteOrder: 80 + Prerequisites: repair, ~!tmpp, ~infantry.mech, ~techlevel.low + Description: Repairs nearby vehicles. + TooltipExtras: + Weaknesses: • Unarmed + Attributes: • Can salvage destroyed vehicles for credits Valued: - Cost: 500 + Cost: 400 Tooltip: Name: Mechanic UpdatesPlayerStatistics: @@ -570,7 +1016,6 @@ MECH: HP: 5000 Mobile: Voice: Move - PauseOnCondition: being-warped RevealsShroud: Range: 3c0 Passenger: @@ -592,102 +1037,225 @@ MECH: ForceTargetRelationships: None Name: secondary AutoTargetPriority@defuse: - ValidTargets: C4Attached + ValidTargets: C4Attached, TNTAttached InvalidTargets: NoAutoTarget ValidRelationships: Ally AttackFrontal: Voice: Action - PauseOnCondition: being-warped + PauseOnCondition: being-warped || blinded || reapersnare || berserkactive + FacingTolerance: 0 + AttackSoundsCA@REPAIRSOUND: + Sounds: fixit1.aud CaptureManager: + CapturingCondition: salvaging Captures: CaptureTypes: husk - PlayerExperience: 25 - Infiltrates: - Types: Husk - ValidRelationships: Ally - EnterCursor: goldwrench - PlayerExperience: 25 + PlayerExperience: 5 + ConsumedByCapture: False + CaptureDelay: 75 + ValidRelationships: Ally, Enemy, Neutral + PlayerExperienceRelationships: Neutral, Enemy + EnterCursor: sell2 + EnterBlockedCursor: move-blocked WithInfantryBody: IdleSequences: idle DefaultAttackSequence: repair StandSequences: stand + RequiresCondition: !salvaging && !parachute && !being-warped && !reapersnare + WithInfantryBody@SALVAGE: + StandSequences: repair + RequiresCondition: salvaging Voiced: VoiceSet: MechanicVoice AutoTarget: + ScanRadius: 3 AutoTargetPriority@DEFAULT: - ValidTargets: Vehicle, Ship + ValidTargets: Repairable ValidRelationships: Ally ProducibleWithLevel: Prerequisites: barracks.upgraded - Targetable: - TargetTypes: Ground, Infantry, Disguise, ChaosImmune + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: barracks.upgraded GuardsSelection: - ValidTargets: Vehicle, Ship + ValidTargets: Vehicle + Convertible: + SpawnActors: CMEC + ReplacedInQueue: + Actors: cmec + KeepsDistance: + Encyclopedia: + Category: Allies/Infantry; Nod/Infantry -HACK: - Inherits: ^Soldier - Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove +CMEC: + Inherits: ^Cyborg + Buildable: + Queue: InfantrySQ, InfantryMQ, CyborgMQ + BuildAtProductionType: Cyborg + BuildPaletteOrder: 81 + Prerequisites: repair, tmpp, ~tmpp, ~infantry.mech, ~techlevel.high + Description: Repairs nearby vehicles and advanced cyborgs. + TooltipExtras: + Weaknesses: • Unarmed + Attributes: • Can salvage destroyed vehicles for credits Valued: - Cost: 500 + Cost: 400 Tooltip: - Name: Hacker + Name: Cyborg Mechanic UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 5000 + HP: 17000 Mobile: - Speed: 56 + Speed: 46 Voice: Move - PauseOnCondition: !undeployed && being-warped - RequireForceMoveCondition: !undeployed RevealsShroud: Range: 5c0 Passenger: CustomPipType: blue Voice: Move - Armament@PRIMARY: - Weapon: PrepareHack - PauseOnCondition: deployed - Armament@PRIMARYDEPLOYED: - Weapon: Hack - RequiresCondition: deployed + Guard: + Voice: Move + Armament: + Weapon: CyborgRepair + Cursor: repair + OutsideRangeCursor: repair + TargetRelationships: Ally + ForceTargetRelationships: None + Armament@defuse: + Weapon: DefuseKit + Cursor: goldwrench + OutsideRangeCursor: goldwrench + TargetRelationships: Ally + ForceTargetRelationships: None + Name: secondary + AutoTargetPriority@defuse: + ValidTargets: C4Attached, TNTAttached + InvalidTargets: NoAutoTarget + ValidRelationships: Ally + AttackFrontal: + Voice: Action + PauseOnCondition: being-warped || blinded || reapersnare || berserkactive + FacingTolerance: 0 + AttackSoundsCA@REPAIRSOUND: + Sounds: cmecrepair.aud + CaptureManager: + CapturingCondition: salvaging + Captures: + CaptureTypes: husk + PlayerExperience: 5 + ConsumedByCapture: False + CaptureDelay: 75 + ValidRelationships: Ally, Enemy, Neutral + PlayerExperienceRelationships: Neutral, Enemy + EnterCursor: sell2 + EnterBlockedCursor: move-blocked + WithInfantryBody: + IdleSequences: idle1, idle2 + DefaultAttackSequence: repair + StandSequences: stand + RequiresCondition: !salvaging && !parachute && !being-warped && !reapersnare + WithInfantryBody@SALVAGE: + StandSequences: repair + RequiresCondition: salvaging + Voiced: + VoiceSet: CyborgVoice + AutoTarget: + ScanRadius: 3 + AutoTargetPriority@DEFAULT: + ValidTargets: Repairable + ValidRelationships: Ally + ProducibleWithLevel: + Prerequisites: barracks.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: barracks.upgraded + GuardsSelection: + ValidTargets: Vehicle + -TakeCover: + KeepsDistance: + Encyclopedia: + Category: Nod/Infantry + +HACK: + Inherits: ^Soldier + Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove + Inherits@SELECTION: ^SelectableSupportUnit + Buildable: + Queue: HackerCell + Description: Specialist able to take control of enemy structures & drones from range. + Valued: + Cost: 750 + Tooltip: + Name: Hacker + TooltipExtras: + Strengths: • Strong vs Buildings, Defenses, Drones + Weaknesses: • Cannot attack Infantry, Aircraft, Vehicles (other than Drones) + Attributes: • Control lost if the Hacker dies\n• Generates income when inside Internet Center\n• Hack production buildings to steal technology\n • Allies: Cryo Mortar, Reckoner, Phantom\n • Soviets: Cyberdog, Cyclops, Kamov\n • GDI: Sonic Mortar, Basilisk, Shade\n • Nod: Chem Mortar, Mantis, Vertigo\n • Scrin: Cyberscrin, Viper, Manticore + UpdatesPlayerStatistics: + AddToArmyValue: true + Health: + HP: 5000 + Mobile: + Speed: 60 + Voice: Move + RevealsShroud: + Range: 5c0 + Passenger: + CustomPipType: blue + Voice: Move + CargoType: Hacker + Armament@PRIMARY: + Weapon: Hack + LocalOffset: 0,0,50 + TargetRelationships: Enemy, Neutral + Armament@ARC: + Weapon: HackArc + LocalOffset: 0,0,50 + TargetRelationships: Enemy, Neutral AttackFrontal: Voice: Action FacingTolerance: 512 TargetFrozenActors: true + PauseOnCondition: being-warped || blinded || reapersnare || berserkactive WithInfantryBody: IdleSequences: idle StandSequences: stand - RequiresCondition: undeployed - WithSpriteBody@DEPLOYED: - Name: deployed + RequiresCondition: !is-hacking && !parachute && !being-warped && !reapersnare + WithInfantryBody@Parachute: + RequiresCondition: !is-hacking && (parachute || reapersnare) + WithSpriteBody@Hacking: + Name: hacking Sequence: hack - RequiresCondition: !undeployed - WithMakeAnimation: - BodyNames: deployed + RequiresCondition: is-hacking + StartSequence: make + GrantConditionOnAttack@Hacking: + Condition: is-hacking + RevokeDelay: 51 + RequiresCondition: !moving + GrantConditionOnMovement@Moving: + ValidMovementTypes: Horizontal, Vertical + Condition: moving Voiced: VoiceSet: HackerVoice ProducibleWithLevel: Prerequisites: barracks.upgraded - Targetable: - TargetTypes: Ground, Infantry, Disguise, ChaosImmune - GrantConditionOnDeploy@HACK: - DeployedCondition: deployed - UndeployedCondition: undeployed - UndeployOnMove: true - UndeployOnPickup: true - DeployOnAttack: - RequiresCondition: undeployed + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: barracks.upgraded MindController: + ControlType: Hack ArmamentNames: primary - Capacity: 1 - TicksToControl: 250 - TicksToRevoke: 100 - RequiresCondition: deployed + Capacity: -1 + TicksToControl: 150 + TicksToRevoke: 25 InitSounds: hacker-init.aud InitSoundControllerOnly: true ControlSounds: hacker-hacked.aud ControllingCondition: hacked-in + AutoUndeploy: true + TargetTypeTicksToControl: + Structure: 300 WithDecoration@HACKEDIN: Image: hacking Sequence: hacking @@ -696,27 +1264,53 @@ HACK: Palette: effect ValidRelationships: Ally, Neutral, Enemy WithMindControlArc@HACK: + ControlType: Hack Color: 1ce312 Transparency: 65 Angle: 60 Width: 86 + Offset: 0,0,50 AutoTarget: InitialStance: HoldFire InitialStanceAI: AttackAnything RenderRangeCircle: - Color: 00cc00 + RangeCircleType: HackRange + Color: 00cc00cc + RejectsOrders@AIHACKER: + RequiresCondition: bothacking + GrantCondition@AIHACKER: + Condition: bothacking + RequiresCondition: botowner && is-hacking + GrantConditionOnBotOwner@AIHACKER: + Condition: botowner + Bots: brutal, vhard, hard, normal, easy, naval + Encyclopedia: + Category: Nod/Infantry + HideBuildable: True + EncyclopediaExtras: + RenderPreviewActor: hack.preview + AdditionalInfo: Requires Unity Covenant. + +HACK.Preview: + Inherits: ^PreviewDummy + Inherits@TDPalette: ^TDPalette + RenderSprites: + Image: hack + WithInfantryBody: + QuantizeFacingsFromSequence: + Sequence: stand EINSTEIN: Inherits: ^CivInfantry RenderSprites: - PlayerPalette: player + Palette: player WithDeathAnimation: DeathSequencePalette: player -Wanders: Tooltip: Name: Prof. Einstein Mobile: - Speed: 49 + Speed: 54 Voiced: VoiceSet: EinsteinVoice @@ -726,7 +1320,7 @@ DELPHI: Tooltip: Name: Agent Delphi Mobile: - Speed: 49 + Speed: 54 CHAN: Inherits: ^CivInfantry @@ -748,11 +1342,10 @@ MOEBIUS: Tooltip: Name: Dr. Moebius Mobile: - Speed: 49 + Speed: 54 GNRL: - Inherits@1: ^CivInfantry - Inherits@2: ^ArmedCivilian + Inherits@1: ^ArmedCivilian RenderSprites: Image: boris -Wanders: @@ -764,7 +1357,8 @@ GNRL: Voice: Move AttackFrontal: Voice: Attack - PauseOnCondition: being-warped + PauseOnCondition: being-warped || blinded || reapersnare + FacingTolerance: 0 AttackMove: Voice: Move Passenger: @@ -782,12 +1376,16 @@ GNRL: THF: Inherits: ^Soldier + Inherits@SELECTION: ^SelectableSupportUnit Buildable: - Queue: Infantry + Queue: InfantrySQ, InfantryMQ BuildAtProductionType: Soldier - BuildPaletteOrder: 120 - Prerequisites: anyradar, ~infantry.thf, ~techlevel.medium - Description: Steals enemy credits and hijacks enemy vehicles.\n Unarmed + BuildPaletteOrder: 95 + Prerequisites: anyradar, ~barr, ~techlevel.medium + Description: Steals enemy credits and hijacks enemy vehicles. + TooltipExtras: + Weaknesses: • Unarmed + Attributes: • Cloaked when not moving\n• Gains vision range while cloaked Valued: Cost: 500 Tooltip: @@ -800,43 +1398,66 @@ THF: Range: 5c0 Passenger: CustomPipType: blue - CaptureManager: + Infiltrates: + Types: StealCreditsInfiltrate + Voice: Steal Captures: CaptureTypes: vehicle - PlayerExperience: 50 - Infiltrates: - Types: ThiefInfiltrate - Notification: BuildingInfiltrated - PlayerExperience: 50 + PlayerExperience: 15 + Voice: Hijack Voiced: VoiceSet: ThiefVoice -TakeCover: WithInfantryBody: IdleSequences: idle StandSequences: stand + RevealsShroudMultiplier@Cloaked: + Modifier: 160 + RequiresCondition: hidden Cloak@NORMAL: InitialDelay: 250 CloakDelay: 120 UncloakOn: Attack, Unload, Infiltrate, Demolish, Move - CloakTypes: Cloak + CloakSound: gstealon.aud + UncloakSound: gstealof.aud + DetectionTypes: Cloak IsPlayerPalette: false - RequiresCondition: !cloak-force-disabled + CloakStyle: Palette + CloakedPalette: cloak + CloakedCondition: hidden + RequiresCondition: !cloak-force-disabled && !being-warped + PauseOnCondition: invisibility GrantConditionOnDamageState@UNCLOAK: Condition: cloak-force-disabled ValidDamageStates: Critical Mobile: - Speed: 49 - Targetable: - TargetTypes: Ground, Infantry, Disguise, ChaosImmune + Speed: 54 + Voice: Move + GrantConditionOnMovement@MOVING: + ValidMovementTypes: Horizontal, Vertical, Turn + Condition: moving + Crushable: + RequiresCondition: !invulnerability && !being-warped && !moving + -SpeedMultiplier@HAZMATSOVIET: + -GrantConditionOnTerrain@HAZMATSOVIET: + WithColoredSelectionBox@INVIS: + RequiresCondition: invisibility || hidden + ColorSource: Player + TargetSpecificOrderVoice: + Orders: CaptureActor + TargetTypeVoices: + Vehicle: Hijack + Building: Steal + Encyclopedia: + Category: Soviets/Infantry SHOK: Inherits: ^Soldier Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove - Inherits@BERSERK: ^Berserk AutoTargetPriority@DEFAULT: - InvalidTargets: NoAutoTarget, WaterStructure, TeslaBoost + InvalidTargets: NoAutoTarget, WaterStructure, AntiAirDefense, TeslaBoost, Disguised AutoTargetPriority@ATTACKANYTHING: - InvalidTargets: NoAutoTarget, TeslaBoost + InvalidTargets: NoAutoTarget, TeslaBoost, Disguised AutoTargetPriority@TESLANORMAL: RequiresCondition: !assault-move && !attack-move ValidTargets: TeslaBoost @@ -844,14 +1465,16 @@ SHOK: RequiresCondition: assault-move || attack-move ValidTargets: TeslaBoost ValidRelationships: Enemy - AttackMove: - AttackMoveCondition: attack-move Buildable: - Queue: Infantry + Queue: InfantrySQ, InfantryMQ BuildAtProductionType: Soldier - BuildPaletteOrder: 80 - Prerequisites: structures.tsla, anyradar, ~barr, ~techlevel.high - Description: Elite infantry with portable Tesla weapon.\n Strong vs Infantry, Vehicles\n Weak vs Aircraft\n Special Ability: Can over-charge Tesla Coil + BuildPaletteOrder: 90 + Prerequisites: tslaorstek, anyradar, ~infantry.shok, ~!ttrp.upgrade, ~techlevel.medium + Description: Elite infantry with portable Tesla weapon. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor + Weaknesses: • Cannot attack Aircraft + Attributes: • Can overcharge nearby Tesla Coils Valued: Cost: 425 Tooltip: @@ -859,7 +1482,7 @@ SHOK: UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 7000 + HP: 7500 Mobile: Voice: Move RevealsShroud: @@ -867,9 +1490,9 @@ SHOK: Armament@PRIMARY: Weapon: PortaTesla LocalOffset: 427,0,341 - Armament@Garrisoned: - Name: mounted - Weapon: PortaTeslaE + Armament@BATF: + Name: batf + Weapon: PortaTesla Armament@CHARGE: Name: secondary Weapon: PortaTeslaCharge @@ -892,10 +1515,13 @@ SHOK: RequiresCondition: charge-fire TakeCover: ProneOffset: 227,0,-245 - AttackFrontal: + AttackFrontalCharged: Voice: Attack - PauseOnCondition: being-warped + FacingTolerance: 32 + ChargeLevel: 0,2 + PauseOnCondition: being-warped || blinded || reapersnare AttackMove: + AttackMoveCondition: attack-move Voice: Move Passenger: Voice: Move @@ -905,22 +1531,56 @@ SHOK: VoiceSet: ShokVoice ProducibleWithLevel: Prerequisites: barracks.upgraded - ProductionCostMultiplier@RussiaBonus: - Multiplier: 90 - Prerequisites: infantry.russia + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: barracks.upgraded + ReplacedInQueue: + Actors: ttrp + Encyclopedia: + Category: Soviets/Infantry + +TTRP: + Inherits: SHOK + Inherits@HEALINGCOOLDOWN: ^HealingCooldown + Buildable: + BuildPaletteOrder: 91 + Prerequisites: tslaorstek, anyradar, ~infantry.shok, ~ttrp.upgrade, ~techlevel.medium + Tooltip: + Name: Tesla Trooper + Valued: + Cost: 600 + Health: + HP: 18000 + Voiced: + VoiceSet: TeslaTrooperVoice + TakeCover: + ProneOffset: 0,0,0 + ProneSequencePrefix: + Crushable: + CrushClasses: heavyinfantry + -ReplacedInQueue: + Armament@PRIMARY: + Weapon: PortaTesla.UPG + LocalOffset: 300,0,300 + Armament@BATF: + Weapon: PortaTesla.UPG N1: Inherits: ^Soldier Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove - Inherits@BERSERK: ^Berserk Inherits@BOTHELPER: ^BotCaptureHelper + Inherits@Inspirable: ^Inspirable + Inherits@HeroOfTheUnionTargetable: ^HeroOfTheUnionTargetable Buildable: - Queue: Infantry + Queue: InfantrySQ, InfantryMQ BuildAtProductionType: Soldier BuildPaletteOrder: 11 - Prerequisites: ~!cyborg.production, ~infantry.td, ~techlevel.infonly + Prerequisites: ~!tmpp, ~infantry.td IconPalette: chrometd - Description: General-purpose infantry.\n Strong vs Infantry\n Weak vs Vehicles, Aircraft + Description: General-purpose infantry. + TooltipExtras: + Strengths: • Strong vs Infantry + Weaknesses: • Weak vs Heavy Armor, Buildings, Defenses\n• Cannot attack Aircraft Valued: Cost: 100 Tooltip: @@ -931,46 +1591,57 @@ N1: HP: 5000 Armament@PRIMARY: Weapon: M16Carbine - Armament@Garrison: - Name: mounted - Weapon: M16CarbineE + Armament@BATF: + Name: batf + Weapon: M16CarbineBATF MuzzleSequence: garrison-muzzle AttackFrontal: - PauseOnCondition: being-warped + PauseOnCondition: being-warped || blinded || reapersnare + FacingTolerance: 0 WithInfantryBody: DefaultAttackSequence: shoot IdleSequences: idle1,idle2,idle3,idle4 - WithDeathAnimation: - DeathSequencePalette: playertd ProducibleWithLevel: Prerequisites: barracks.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: barracks.upgraded Selectable: Class: e1 Convertible: SpawnActors: N1C + ReplacedInQueue: + Actors: n1c + Encyclopedia: + Category: GDI/Infantry; Nod/Infantry N1R1: Inherits: N1 RenderSprites: Image: N1 ProducibleWithLevel: - Prerequisites: techlevel.infonly + -Prerequisites: InitialLevels: 1 -Buildable: UpdatesPlayerStatistics: OverrideActor: n1 + -Encyclopedia: N2: Inherits: ^Soldier Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove - Inherits@BERSERK: ^Berserk + Inherits@Inspirable: ^Inspirable + Inherits@HeroOfTheUnionTargetableGrenFlamer: ^HeroOfTheUnionTargetableGrenFlamer Buildable: - Queue: Infantry + Queue: InfantrySQ, InfantryMQ BuildAtProductionType: Soldier - BuildPaletteOrder: 31 - Prerequisites: ~pyle, ~techlevel.infonly + BuildPaletteOrder: 42 + Prerequisites: ~pyle IconPalette: chrometd - Description: Infantry armed with grenades.\n Strong vs Buildings, Infantry\n Weak vs Vehicles, Aircraft + Description: Infantry armed with grenades. + TooltipExtras: + Strengths: • Strong vs Buildings, Defenses, Light Armor + Weaknesses: • Weak vs Heavy Armor\n• Cannot attack Aircraft\n• Has difficulty hitting moving targets Valued: Cost: 160 Tooltip: @@ -980,7 +1651,7 @@ N2: Health: HP: 5000 Mobile: - Speed: 56 + Speed: 60 Armament@PRIMARY: Weapon: Grenade LocalOffset: 0,0,555 @@ -991,56 +1662,64 @@ N2: LocalOffset: 0,0,555 FireDelay: 15 RequiresCondition: empgren-upgrade - Armament@Garrison: - Name: mounted - Weapon: GrenadeE + Armament@BATF: + Name: batf + Weapon: Grenade FireDelay: 15 AttackFrontal: - PauseOnCondition: being-warped + PauseOnCondition: being-warped || blinded || reapersnare + FacingTolerance: 0 WithInfantryBody: StandSequences: stand DefaultAttackSequence: throw - WithDeathAnimation: - DeathSequencePalette: playertd - Explodes: - Weapon: UnitExplodeSmall - EmptyWeapon: UnitExplodeSmall - Chance: 33 + FireWarheadsOnDeath: + Weapon: UnitExplodeGrenadeTD + EmptyWeapon: UnitExplodeGrenadeTD + Chance: 100 DamageSource: Killer - RequiresCondition: !being-warped + RequiresCondition: !being-warped && !empgren-upgrade ProducibleWithLevel: Prerequisites: barracks.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: barracks.upgraded Selectable: Class: e2 GrantConditionOnPrerequisite@EMPUPG: Condition: empgren-upgrade Prerequisites: empgren.upgrade - ExternalCondition@EMPUPG: - Condition: empgren-upgrade + RangeMultiplier@HeroOfTheUnion: + RequiresCondition: herooftheunion && !empgren-upgrade + Encyclopedia: + Category: GDI/Infantry N2R1: Inherits: N2 RenderSprites: Image: N2 ProducibleWithLevel: - Prerequisites: techlevel.infonly + -Prerequisites: InitialLevels: 1 -Buildable: UpdatesPlayerStatistics: OverrideActor: n2 + -Encyclopedia: N3: Inherits: ^Soldier - Inherits@AUTOTARGET: ^AutoTargetAllAssaultMoveAntiAir - Inherits@GAINSEXPERIENCE: ^GainsExperience - Inherits@BERSERK: ^Berserk + Inherits@AUTOTARGET: ^AutoTargetAllAssaultMovePrioritizeAir + Inherits@Inspirable: ^Inspirable + Inherits@HeroOfTheUnionTargetable: ^HeroOfTheUnionTargetable Buildable: - Queue: Infantry + Queue: InfantrySQ, InfantryMQ BuildAtProductionType: Soldier BuildPaletteOrder: 21 - Prerequisites: ~!cyborg.production, ~infantry.td, ~techlevel.infonly + Prerequisites: ~!tmpp, ~infantry.td IconPalette: chrometd - Description: Anti-tank/anti-aircraft infantry.\n Strong vs Tanks, Aircraft\n Weak vs Infantry + Description: Anti-tank/anti-aircraft infantry. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Aircraft, Buildings, Defenses + Weaknesses: • Weak vs Infantry, Light Armor Valued: Cost: 300 Tooltip: @@ -1050,7 +1729,7 @@ N3: Health: HP: 3500 Mobile: - Speed: 38 + Speed: 41 Armament@PRIMARY: Weapon: RedEye LocalOffset: 0,0,500 @@ -1073,25 +1752,17 @@ N3: LocalOffset: 0,0,500 PauseOnCondition: !ammo RequiresCondition: tibcore-upgrade - Armament@GarrisonAA: - Name: mountedaa - Weapon: RedEyeE - PauseOnCondition: !ammo - RequiresCondition: !tibcore-upgrade - Armament@GarrisonAAUPG: - Name: mountedaa - Weapon: RedEye.TibCore - PauseOnCondition: !ammo - RequiresCondition: tibcore-upgrade - Armament@Garrison: - Name: mounted - Weapon: DragonE.TD - PauseOnCondition: !ammo + # Prevents attack moving forwards when main weapon is paused for reload + Armament@Targeter: + Weapon: DragonTargeter + LocalOffset: 0,0,500 + Armament@BATF: + Name: batf + Weapon: DragonBATF.TD RequiresCondition: !tibcore-upgrade - Armament@GarrisonUPG: - Name: mounted - Weapon: DragonE.TibCore - PauseOnCondition: !ammo + Armament@BATFUPG: + Name: batf + Weapon: DragonBATF.TibCore RequiresCondition: tibcore-upgrade GrantConditionOnPrerequisite@TIBCORE: Condition: tibcore-upgrade @@ -1105,96 +1776,119 @@ N3: TakeCover: ProneOffset: 384,0,-395 AttackFrontal: - PauseOnCondition: being-warped - WithDeathAnimation: - DeathSequencePalette: playertd + PauseOnCondition: being-warped || blinded || reapersnare + FacingTolerance: 0 WithInfantryBody: DefaultAttackSequence: shoot - AutoTarget: - ScanRadius: 5 ProducibleWithLevel: Prerequisites: barracks.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: barracks.upgraded + AutoTarget: + MaximumScanTimeInterval: 5 Selectable: Class: e3 Convertible: SpawnActors: N3C + ReplacedInQueue: + Actors: n3c + Encyclopedia: + Category: GDI/Infantry; Nod/Infantry N3R1: Inherits: N3 RenderSprites: Image: N3 ProducibleWithLevel: - Prerequisites: techlevel.infonly + -Prerequisites: InitialLevels: 1 -Buildable: UpdatesPlayerStatistics: OverrideActor: n3 + -Encyclopedia: N4: Inherits: ^Soldier Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove - Inherits@GAINSEXPERIENCE: ^GainsExperience - Inherits@BERSERK: ^Berserk + Inherits@Inspirable: ^Inspirable + Inherits@HeroOfTheUnionTargetableGrenFlamer: ^HeroOfTheUnionTargetableGrenFlamer Buildable: - Queue: Infantry + Queue: InfantrySQ, InfantryMQ BuildAtProductionType: Soldier BuildPaletteOrder: 71 - Prerequisites: ~hand, ~!cyborg.production, ~techlevel.infonly + Prerequisites: ~hand, ~!tmpp IconPalette: chrometd - Description: Anti-infantry/anti-structure unit.\n Strong vs Infantry, Buildings\n Weak vs Vehicles, Aircraft + Description: Short-range anti-infantry/anti-structure infantry. + TooltipExtras: + Strengths: • Strong vs Infantry, Buildings + Weaknesses: • Weak vs Heavy Armor, Defenses\n• Cannot attack Aircraft Valued: Cost: 200 Tooltip: - Name: Flamethrower + Name: Nod Flamethrower UpdatesPlayerStatistics: AddToArmyValue: true Health: HP: 7000 Mobile: - Speed: 49 + Speed: 60 Armament@PRIMARY: Weapon: FlamerTD - LocalOffset: 341,0,254 + LocalOffset: 341,0,300 MuzzleSequence: muzzle MuzzlePalette: tdeffect Armament@FF: Weapon: FlamerTDFF - Armament@Garrison: - Name: mounted - Weapon: FlamerE + Armament@BATF: + Name: batf + Weapon: FlamerTDBATF TakeCover: + SpeedModifier: 70 ProneOffset: 160,0,-254 WithInfantryBody: DefaultAttackSequence: shoot AttackFrontal: - PauseOnCondition: being-warped - WithDeathAnimation: - DeathSequencePalette: playertd + PauseOnCondition: being-warped || blinded || reapersnare + FacingTolerance: 0 WithMuzzleOverlay: - Explodes: + FireWarheadsOnDeath: Weapon: UnitExplodeFlameSmall EmptyWeapon: UnitExplodeFlameSmall - Chance: 33 + Chance: 100 DamageSource: Killer RequiresCondition: !being-warped ProducibleWithLevel: Prerequisites: barracks.upgraded - Selectable: - Class: e4 + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: barracks.upgraded Convertible: SpawnActors: N5 + ReplacedInQueue: + Actors: n5 + -RangeMultiplier@HeroOfTheUnion: + FirepowerMultiplier@HeroOfTheUnion: + RequiresCondition: herooftheunion + Modifier: 120 + Encyclopedia: + Category: Nod/Infantry N5: Inherits: ^Cyborg Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove - Inherits@GAINSEXPERIENCE: ^GainsExperience + Inherits@HEALINGCOOLDOWN: ^HealingCooldown Buildable: - Queue: Infantry + Queue: InfantrySQ, InfantryMQ, CyborgMQ BuildAtProductionType: Cyborg BuildPaletteOrder: 72 - Prerequisites: ~cyborg.production, ~infantry.cyborg, ~techlevel.infonly + Prerequisites: tmpp, ~tmpp, ~techlevel.high IconPalette: chrometd - Description: Advanced general-purpose infantry.\n Strong vs all Ground Units + Description: Short-range anti-infantry/anti-structure cyborg infantry. + TooltipExtras: + Strengths: • Strong vs Infantry, Buildings + Weaknesses: • Cannot attack Aircraft + Attributes: • Ability: Tiberium Surge Valued: Cost: 325 Tooltip: @@ -1202,27 +1896,29 @@ N5: UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 17000 - WithDeathAnimation: - DeathSequencePalette: playertd + HP: 15000 WithInfantryBody: DefaultAttackSequence: shoot + AttackSequences: + primary: shoot + secondary: stand Armament@PRIMARY: Weapon: ChemsprayTD - LocalOffset: 341,0,254 + LocalOffset: 341,0,300 MuzzleSequence: muzzle MuzzlePalette: tdeffect Armament@FF: Weapon: ChemsprayTDFF - Armament@Garrison: - Name: mounted - Weapon: ChemsprayE + Armament@BATF: + Name: batf + Weapon: ChemsprayTDBATF Mobile: - Speed: 49 + Speed: 60 Voice: Move AttackFrontal: Voice: Attack - PauseOnCondition: being-warped + PauseOnCondition: being-warped || blinded || reapersnare + FacingTolerance: 0 AttackMove: Voice: Move Passenger: @@ -1232,9 +1928,10 @@ N5: Voiced: VoiceSet: CyborgVoice -TakeCover: - -Crushable: + Crushable: + CrushClasses: heavyinfantry WithMuzzleOverlay: - Explodes: + FireWarheadsOnDeath: Weapon: UnitExplodeChemSmall EmptyWeapon: UnitExplodeChemSmall Chance: 33 @@ -1242,29 +1939,61 @@ N5: RequiresCondition: !being-warped ProducibleWithLevel: Prerequisites: barracks.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: barracks.upgraded GrantConditionOnPrerequisite@BIO: Condition: biofirepower Prerequisites: bio FirepowerMultiplier@BIOLAB: RequiresCondition: biofirepower Modifier: 110 + Contrail@Surge: + Offset: -30,0,200 + StartColorUsePlayerColor: false + ZOffset: -128 + StartColor: 00ff0080 + StartColorAlpha: 128 + TrailLength: 10 + RequiresCondition: surge-active + SpeedMultiplier@Surge: + RequiresCondition: surge-active + Modifier: 200 + GrantTimedConditionOnDeploy@Surge: + DeployedTicks: 75 + CooldownTicks: 750 + DeployedCondition: surge-active + ShowSelectionBar: true + ShowSelectionBarWhenFull: false + StartsFullyCharged: true + PauseOnCondition: being-warped + DischargingColor: 00ff00 + ChargingColor: 008800 + Instant: true + DeploySound: tibsurge.aud + Targetable@ChemWarrior: + TargetTypes: ChemWarrior + Encyclopedia: + Category: Nod/Infantry N5R1: Inherits: N5 RenderSprites: Image: N5 ProducibleWithLevel: - Prerequisites: techlevel.infonly + -Prerequisites: InitialLevels: 1 -Buildable: UpdatesPlayerStatistics: OverrideActor: n5 + -Encyclopedia: RMBO: Inherits: ^Soldier Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove - Inherits@GAINSEXPERIENCE: ^GainsExperience Inherits@COMMANDOSKULL: ^CommandoSkull + Inherits@CommandoRegen: ^CommandoRegen + Inherits@HEALINGCOOLDOWN: ^HealingCooldown Valued: Cost: 1350 Tooltip: @@ -1273,13 +2002,17 @@ RMBO: AddToArmyValue: true Buildable: BuildPaletteOrder: 210 - Prerequisites: ~infantry.td, techcenter, ~techlevel.high - Queue: Infantry + Prerequisites: ~infantry.td, techcenter.td, ~techlevel.high + Queue: InfantrySQ, InfantryMQ IconPalette: chrometd BuildLimit: 1 - Description: Elite infantry unit. Armed with\na SMG and C4.\n Can detect cloaked units.\n Maximum 1 can be trained.\n Strong vs Infantry, Buildings\n Weak vs Aircraft\n Special Ability: C4 Explosives + Description: Elite infantry armed with an SMG and C4. + TooltipExtras: + Strengths: • Strong vs Infantry, Buildings + Weaknesses: • Cannot attack Aircraft + Attributes: • Maximum 1 can be trained\n• Detects cloaked ground units and spies\n• Immune to mind control\n• Plants C4 to destroy structures and vehicles Mobile: - Speed: 56 + Speed: 60 Voice: Move Guard: Voice: Move @@ -1288,13 +2021,15 @@ RMBO: Passenger: CustomPipType: red Voice: Move + AttackMove: + Voice: Move RevealsShroud: Range: 6c0 Armament: Weapon: smg - Armament@garrison: - Name: mounted - Weapon: smgE + Armament@BATF: + Name: batf + Weapon: smgBATF MuzzleSequence: garrison-muzzle Armament@sapper: Weapon: PlaceC4 @@ -1304,7 +2039,10 @@ RMBO: AttackFrontal: Voice: Attack Armaments: primary, secondary - PauseOnCondition: being-warped + PauseOnCondition: being-warped || blinded || reapersnare + FacingTolerance: 0 + AutoTarget: + AllowMovement: false WithInfantryBody: DefaultAttackSequence: shoot IdleSequences: idle1,idle2,idle3 @@ -1315,67 +2053,60 @@ RMBO: DetonationDelay: 45 Voice: Demolish DamageTypes: ExplosionDeath + ExternalCondition@PRODUCED: + Condition: produced VoiceAnnouncement: + RequiresCondition: produced Voice: Build AnnounceOnKill: Voiced: VoiceSet: CommandoVoice ProducibleWithLevel: Prerequisites: barracks.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: barracks.upgraded IgnoresDisguise: DetectCloaked: - CloakTypes: Cloak, Thief - Range: 5c0 - Targetable: - TargetTypes: Ground, Infantry, Disguise, ChaosImmune, MindControlImmune + Range: 2c0 + Targetable@Hero: + TargetTypes: Hero + Targetable@MindControlImmune: + TargetTypes: MindControlImmune + Targetable@ChaosImmune: + TargetTypes: ChaosImmune + Targetable@ReaperSnareImmune: + TargetTypes: ReaperSnareImmune -Crushable: TakeCover: SpeedModifier: 70 + TargetSpecificOrderVoice: + Orders: Attack, ForceAttack + TargetTypeVoices: + Vehicle: Demolish + Structure: Demolish + ChangesHealth@ELITE: + Delay: 50 + Encyclopedia: + Category: GDI/Infantry; Nod/Infantry N6: Inherits: ^Soldier - Inherits@SELECTION: ^SelectableSupportUnit + Inherits@ENGINEER: ^EngineerBase Buildable: - Queue: Infantry - BuildAtProductionType: Soldier - BuildPaletteOrder: 61 - Prerequisites: ~infantry.td, ~techlevel.infonly + BuildPaletteOrder: 31 + Prerequisites: ~infantry.td IconPalette: chrometd - Description: Infiltrates and captures\nenemy structures.\n Can repair friendly structures & bridges and defuse bombs\n Special Ability: Repair\n Special Ability: Defuse\n Unarmed - Valued: - Cost: 500 Tooltip: Name: Engineer - Passenger: - CustomPipType: yellow - EngineerRepair: - RepairsBridges: - CaptureManager: - Captures: - CaptureTypes: building - PlayerExperience: 25 - CaptureDelay: 150 - Armament@defuse: - Weapon: DefuseKit - Cursor: goldwrench - OutsideRangeCursor: goldwrench - TargetRelationships: Ally - ForceTargetRelationships: None - Name: secondary - AutoTarget: - AutoTargetPriority@defuse: - ValidTargets: C4Attached, TNTAttached - InvalidTargets: NoAutoTarget - ValidRelationships: Ally - AttackFrontal: - Armaments: primary, secondary - PauseOnCondition: being-warped Voiced: VoiceSet: EngineerVoice - WithDeathAnimation: - DeathSequencePalette: playertd - Targetable: - TargetTypes: Ground, Infantry, Disguise, ChaosImmune + WithInfantryBody: + StandSequences: stand + -ReloadAmmoDelayMultiplier@Inspiration1: + -ReloadAmmoDelayMultiplier@Inspiration2: + Encyclopedia: + Category: GDI/Infantry; Nod/Infantry VICE: Inherits: ^Viceroid @@ -1383,27 +2114,33 @@ VICE: Locomotor: foot Tooltip: ActorLostNotification: - Explodes: + FireWarheadsOnDeath: Weapon: UnitExplodeVice EmptyWeapon: UnitExplodeVice Chance: 100 AttackWander: Targetable: - TargetTypes: Ground, Infantry, Creep, ChaosImmune, MindControlImmune + TargetTypes: Ground, Infantry, Creep + Targetable@MindControlImmune: + TargetTypes: MindControlImmune + Targetable@ChaosImmune: + TargetTypes: ChaosImmune SNIP: Inherits: ^Soldier - Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMovePrioritizeVehicles - Inherits@GAINSEXPERIENCE: ^GainsExperience - Inherits@BERSERK: ^Berserk + Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove RenderSprites: Image: sniper Buildable: - Queue: Infantry + Queue: InfantrySQ, InfantryMQ BuildAtProductionType: Soldier - BuildPaletteOrder: 110 + BuildPaletteOrder: 83 Prerequisites: ~infantry.england, anyradar, ~techlevel.medium - Description: Elite marksman infantry.\n Armed with a powerful sniper rifle.\n\n Strong vs Infantry, Vehicles\n Weak vs Aircraft, Buildings, Defenses\n Special Ability: Camouflage + Description: Elite marksman infantry armed with a powerful sniper rifle. + TooltipExtras: + Strengths: • Strong vs Infantry, Vehicles (with upgrade) + Weaknesses: • Weak vs Buildings, Defenses\n• Cannot attack aircraft + Attributes: • Camouflaged when not moving\n• When elite, kills crew of vehicles with less than 50% HP Valued: Cost: 550 Tooltip: @@ -1414,37 +2151,53 @@ SNIP: HP: 4500 RevealsShroud: Range: 7c0 + MinRange: 6c0 + RevealGeneratedShroud: false + RevealsShroud@GAPGEN: + Range: 6c0 + AutoTargetPriority@DEFAULT: + ValidTargets: Infantry + AutoTargetPriority@DEFAULTVEH: + RequiresCondition: apb-upgrade && !stance-attackanything && !assault-move + ValidTargets: Vehicle, Ship + InvalidTargets: NoAutoTarget + Priority: 10 + AutoTargetPriority@ATTACKANYTHINGVEH: + RequiresCondition: apb-upgrade && (stance-attackanything || assault-move) + ValidTargets: Vehicle, Ship + InvalidTargets: NoAutoTarget + Priority: 10 Armament@PRIMARY: Weapon: sniper - PauseOnCondition: !ammo - Armament@Garrison: - Weapon: sniperE - Name: mounted - PauseOnCondition: !ammo - MuzzleSequence: garrison-muzzle - Armament@APROUND: - Name: secondary + RequiresCondition: !apb-upgrade + Armament@PRIMARYUPG: Weapon: sniper.vehicle RequiresCondition: apb-upgrade && rank-veteran < 3 - PauseOnCondition: !ammo - Armament@APROUNDELITE: - Name: secondary + Armament@PRIMARYUPGELITE: Weapon: sniper.vehicleElite RequiresCondition: apb-upgrade && rank-veteran >= 3 - PauseOnCondition: !ammo + Armament@BATF: + Weapon: sniperBATF + Name: batf + MuzzleSequence: garrison-muzzle + RequiresCondition: !apb-upgrade + Armament@BATFUPG: + Weapon: sniperBATF.UPG + Name: batf + MuzzleSequence: garrison-muzzle + RequiresCondition: apb-upgrade Mobile: - Speed: 43 + Speed: 46 Voice: Move Cloak@NORMAL: InitialDelay: 200 CloakDelay: 200 CloakedCondition: hidden - Palette: cloaktd CloakSound: gstealon.aud UncloakSound: gstealof.aud - IsPlayerPalette: true - CloakTypes: Cloak - RequiresCondition: !cloak-force-disabled + DetectionTypes: Cloak + RequiresCondition: !cloak-force-disabled && !being-warped + PauseOnCondition: invisibility UncloakOn: Move, Unload, Infiltrate, Demolish, Dock, Attack Cloak@CRATE-CLOAK: RequiresCondition: crate-cloak && !(cloak-force-disabled || invisibility || hidden) @@ -1454,20 +2207,27 @@ SNIP: GrantConditionOnPrerequisite@APB: Condition: apb-upgrade Prerequisites: apb.upgrade + GrantCondition@APB: + Condition: apb-upgrade + RequiresCondition: apb-upgrade + GrantPermanently: true WithDecoration@hidden: Image: pips Sequence: pip-hidden Palette: temptd Position: TopRight RequiresCondition: hidden - AttackFrontal: + AttackFrontalCharged: Voice: Attack - PauseOnCondition: being-warped + FacingTolerance: 32 + ChargeLevel: 0,2 + PauseOnCondition: being-warped || blinded || reapersnare WithInfantryBody: - DefaultAttackSequence: shoot + AttackSequences: + primary: shoot + secondary: shoot StandSequences: stand, stand2 Passenger: - CustomPipType: red Voice: Move Guard: Voice: Move @@ -1475,27 +2235,36 @@ SNIP: VoiceSet: SniperVoice ProducibleWithLevel: Prerequisites: barracks.upgraded - AmmoPool: - Ammo: 1 - AmmoCondition: ammo - ReloadAmmoPool: - Delay: 120 - Count: 1 + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: barracks.upgraded + WithColoredSelectionBox@INVIS: + RequiresCondition: invisibility || hidden + ColorSource: Player + Encyclopedia: + Category: Allies/Infantry + EncyclopediaExtras: + Subfaction: england BORI: Inherits: ^Soldier - Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove - Inherits@GAINSEXPERIENCE: ^GainsExperience + Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMovePrioritizeInfantry Inherits@COMMANDOSKULL: ^CommandoSkull + Inherits@CommandoRegen: ^CommandoRegen + Inherits@HEALINGCOOLDOWN: ^HealingCooldown RenderSprites: Image: boris Buildable: - Queue: Infantry + Queue: InfantrySQ, InfantryMQ BuildAtProductionType: Soldier - BuildPaletteOrder: 200 - Prerequisites: ~barr, stek, ~techlevel.high + BuildPaletteOrder: 205 + Prerequisites: ~barr, stek, ~infantry.boris, ~techlevel.high BuildLimit: 1 - Description: Elite commando infantry. Armed with C4.\n Can detect cloaked units.\n Maximum 1 can be trained.\n Strong vs Infantry, Buildings, Defenses\n Weak vs Aircraft\n Special Ability: Can call an Airstrike on Structures + Description: Elite commando infantry armed with a high-powered assault rifle. + TooltipExtras: + Strengths: • Strong vs Infantry, Buildings, Defenses + Weaknesses: • Cannot attack Aircraft + Attributes: • Maximum 1 can be trained\n• Detects cloaked ground units and spies\n• Immune to mind control\n• Calls airstrike on targeted structures Valued: Cost: 1350 Tooltip: @@ -1505,7 +2274,7 @@ BORI: Health: HP: 11000 Mobile: - Speed: 56 + Speed: 60 Voice: Move -Crushable: Guard: @@ -1517,103 +2286,89 @@ BORI: Voice: Move AttackFrontal: Voice: Attack - PauseOnCondition: being-warped + PauseOnCondition: being-warped || blinded || reapersnare + FacingTolerance: 0 + TargetFrozenActors: True + AttackMove: + Voice: Move Armament@PRIMARY: Name: secondary Weapon: akm - Armament@Garrison: - Name: mounted - Weapon: akmE + Armament@BATF: + Name: batf + Weapon: akmBATF Armament@flare: Name: primary Weapon: Flare LocalOffset: 30,0,250 AirstrikeMaster: - Actors: U2.Bomber, U2.Bomber - SquadSize: 2 + Actors: SMIG + SquadSize: 1 SquadOffset: 0, 3072, 0 ArmamentNames: primary + SpawnDistance: 60c0 + RearmTicks: 25 + RespawnTicks: 25 Demolition: DetonationDelay: 45 Voice: Demolish DamageTypes: ExplosionDeath AutoTarget: - -WithInfantryBody: + InitialStanceAI: AttackAnything WithInfantryBody: + StandSequences: stand DefaultAttackSequence: shoot IdleSequences: idle1 AttackSequences: primary: shoot-laser secondary: shoot - RequiresCondition: !being-warped + ExternalCondition@PRODUCED: + Condition: produced VoiceAnnouncement: + RequiresCondition: produced Voice: Build AnnounceOnKill: IgnoresDisguise: DetectCloaked: - CloakTypes: Cloak, Thief - Range: 5c0 + Range: 2c0 Voiced: VoiceSet: BorisVoice ProducibleWithLevel: Prerequisites: barracks.upgraded - Targetable: - TargetTypes: Ground, Infantry, Disguise, ChaosImmune, MindControlImmune + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: barracks.upgraded + Targetable@Hero: + TargetTypes: Hero + Targetable@MindControlImmune: + TargetTypes: MindControlImmune + Targetable@ChaosImmune: + TargetTypes: ChaosImmune + Targetable@ReaperSnareImmune: + TargetTypes: ReaperSnareImmune TakeCover: SpeedModifier: 70 - -MORT: - Inherits: ^Soldier - Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove - Inherits@GAINSEXPERIENCE: ^GainsExperience - Inherits@BERSERK: ^Berserk - Buildable: - Queue: Infantry - BuildAtProductionType: Soldier - BuildPaletteOrder: 250 - Prerequisites: ~stolentech.hand - Description: Infantry armed with a Chemical Mortar.\n Strong vs Buildings, Infantry\n Weak vs Vehicles, Aircraft - Valued: - Cost: 250 - Tooltip: - Name: Chemical Mortar - UpdatesPlayerStatistics: - AddToArmyValue: true - Health: - HP: 2500 - Armament@PRIMARY: - Weapon: mortar - LocalOffset: 0,0,155 - FireDelay: 15 - Armament@Garrison: - Name: mounted - Weapon: mortarE - FireDelay: 15 - AttackFrontal: - PauseOnCondition: being-warped - WithInfantryBody: - DefaultAttackSequence: throw - Explodes: - Weapon: UnitExplodeChemSmall - EmptyWeapon: UnitExplodeChemSmall - Chance: 33 - RequiresCondition: !being-warped - WithDeathAnimation: - DeathSequencePalette: playertd - ProducibleWithLevel: - Prerequisites: barracks.upgraded + AutoTargetPriority@DEFAULT: + ValidTargets: Infantry, Vehicle, Water, Underwater + ChangesHealth@ELITE: + Delay: 50 + Encyclopedia: + Category: Soviets/Infantry SAB: Inherits: ^Soldier + Inherits@SELECTION: ^SelectableSupportUnit Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove - Inherits@GAINSEXPERIENCE: ^GainsExperience - Inherits@BERSERK: ^Berserk Buildable: - Queue: Infantry + Queue: InfantrySQ, InfantryMQ BuildAtProductionType: Soldier - BuildPaletteOrder: 140 + BuildPaletteOrder: 113 Prerequisites: anyradar, ~hand, ~techlevel.medium - Description: Covert infantry. Infiltrates enemy structures and steals technology.\n Can detect spies and cloaked units.\n Special Ability: Infiltrate\n Special Ability: Stealth (Limited) + Description: Covert infantry that infiltrates enemy structures to steal or lock technology. + TooltipExtras: + Strengths: • Strong vs Infantry + Weaknesses: • Can only attack Infantry + Attributes: • Detects cloaked ground units and spies\n• Limited stealth (drains while moving)\n• Infiltrates production buildings to steal technology\n • Allies: Cryo Mortar, Reckoner, Phantom\n • Soviets: Cyberdog, Cyclops, Kamov\n • GDI: Sonic Mortar, Basilisk, Shade\n • Nod: Chem Mortar, Mantis, Vertigo\n • Scrin: Cyberscrin, Viper, Manticore\n• Infiltrates radars/tech centers to lock technology\n• Infiltrates any building for vision Valued: Cost: 500 Tooltip: @@ -1621,19 +2376,19 @@ SAB: UpdatesPlayerStatistics: AddToArmyValue: true RevealsShroud: + Range: 7c0 + MinRange: 6c0 + RevealGeneratedShroud: false + RevealsShroud@GAPGEN: Range: 6c0 Passenger: - CustomPipType: red + CustomPipType: blue Voice: Move Guard: Voice: Move - Infiltrates@tec: - Types: SabInfiltrate - PlayerExperience: 50 - Notification: NewOptions - Infiltrates@pwr: - Types: PowerInfiltrate - PlayerExperience: 50 + Infiltrates: + Types: ResetSupportPowerInfiltrate, PowerOutageInfiltrate, StealTechInfiltrate, TechLockInfiltrate, VisionInfiltrate + TextNotification: Building infiltrated. Voiced: VoiceSet: InfilVoice WithInfantryBody: @@ -1643,33 +2398,28 @@ SAB: Health: HP: 5000 Mobile: - Speed: 49 + Speed: 54 Voice: Move Armament: Weapon: SilencedPPK - Armament@Garrison: - Name: mounted - Weapon: SilencedPPKE + Armament@BATF: + Name: batf + Weapon: SilencedPPKBATF AttackFrontal: Voice: Attack - PauseOnCondition: being-warped + PauseOnCondition: being-warped || blinded || reapersnare + FacingTolerance: 0 AutoTarget: InitialStance: HoldFire - InitialStanceAI: ReturnFire - GrantTimedConditionOnDeploy: - DeployedCondition: deployed - CooldownTicks: 1250 - DeployedTicks: 375 - StartsFullyCharged: true - PauseOnCondition: !moving && deployed + InitialStanceAI: Defend Cloak: InitialDelay: 0 CloakDelay: 25 CloakedCondition: hidden - Palette: cloaktd IsPlayerPalette: true - CloakTypes: Cloak - RequiresCondition: deployed && !cloak-force-disabled + DetectionTypes: Cloak + RequiresCondition: can-cloak && !cloak-force-disabled && !being-warped + PauseOnCondition: invisibility UncloakOn: Unload, Infiltrate, Demolish, Dock, Attack, Damage CloakSound: gstealon.aud UncloakSound: gstealof.aud @@ -1683,50 +2433,258 @@ SAB: ValidDamageStates: Heavy, Critical IgnoresDisguise: DetectCloaked: - CloakTypes: Cloak, Thief - Range: 4c0 + DetectionTypes: Cloak + Range: 5c0 ProducibleWithLevel: Prerequisites: barracks.upgraded - ProductionCostMultiplier@LegionBonus: - Multiplier: 80 - Prerequisites: infantry.legion + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: barracks.upgraded + GrantChargingCondition@CLOAK: + Condition: can-cloak + InitialCharge: 600 + MaxCharge: 600 + ChargeRate: 2 + PauseOnCondition: moving + RequiresCondition: !cloak-force-disabled + ChargingColor: 999999 + DischargingColor: EEEEEE + ChargeDelay: 75 + ShowSelectionBarWhenFull: false + WithColoredSelectionBox@INVIS: + RequiresCondition: invisibility || hidden + ColorSource: Player + Encyclopedia: + Category: Nod/Infantry + +ASSA: + Inherits: ^Soldier + Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove + Buildable: + Queue: AssassinSquad + Description: Specialist armed with a sniper rifle and C4 explosives. + IconPalette: chrometd + TooltipExtras: + Strengths: • Strong vs Infantry, Buildings, Defenses + Weaknesses: • Weak vs Heavy Armor, Light Armor\n• Cannot attack aircraft + Attributes: • Plants C4 to destroy structures\n• Resistant to mind control + Valued: + Cost: 750 + Tooltip: + Name: Assassin + UpdatesPlayerStatistics: + AddToArmyValue: true + Health: + HP: 4500 + Mobile: + Speed: 54 + Voice: Move + RevealsShroud: + Range: 7c0 + MinRange: 6c0 + RevealGeneratedShroud: false + RevealsShroud@GAPGEN: + Range: 6c0 + AutoTargetPriority@DEFAULT: + ValidTargets: Infantry + Armament@PRIMARY: + Weapon: sniper.assa + Armament@BATF: + Weapon: sniperBATF.assa + Name: batf + MuzzleSequence: garrison-muzzle + Armament@C4Place: + Weapon: PlaceC4Assassin + Cursor: c4 + OutsideRangeCursor: c4 + Name: secondary + PauseOnCondition: !prepared + Armament@C4Prepare: + Weapon: PrepareC4Seal + Cursor: c4 + OutsideRangeCursor: c4 + Name: tertiary + AmmoPool@PreparedC4: + Name: prepared-c4 + Ammo: 1 + InitialAmmo: 0 + AmmoCondition: prepared + Armaments: secondary + ReloadAmmoPoolCA@PreparedC4: + AmmoPool: prepared-c4 + Delay: 100 + RequiresCondition: preparing-c4 + ShowSelectionBar: false + ReloadAmmoPoolCA@CancelC4: + AmmoPool: prepared-c4 + Delay: 1 + Count: -1 + ShowSelectionBar: false + RequiresCondition: !preparing-c4 && prepared + GrantConditionOnAttack@PreparingC4: + Condition: preparing-c4 + ArmamentNames: tertiary + RevokeDelay: 27 + Demolition: + DetonationDelay: 45 + Voice: Demolish + DamageTypes: ExplosionDeath + AttackFrontalCharged: + Voice: Attack + FacingTolerance: 32 + ChargeLevel: 0,2 + PauseOnCondition: being-warped || blinded || reapersnare + Armaments: primary, secondary, tertiary + WithInfantryBody: + AttackSequences: + primary: shoot + secondary: stand + tertiary: stand + StandSequences: stand + Passenger: + CustomPipType: blue + Voice: Move + AttackMove: + Voice: Move + Guard: + Voice: Move + Voiced: + VoiceSet: AssassinVoice + ProducibleWithLevel: + Prerequisites: barracks.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: barracks.upgraded + Targetable@MindControlResistant: + TargetTypes: MindControlResistant + Encyclopedia: + Category: Nod/Infantry + HideBuildable: True + EncyclopediaExtras: + AdditionalInfo: Requires Wrath Covenant. + +CONF: + Inherits: ^Soldier + Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor + Weaknesses: • Weak vs Heavy Armor, Buildings, Defenses\n• Cannot attack Aircraft + Attributes: • Special Ability: Idol of Kane (max 1 per Confessor)\n• Immune to mind control + Buildable: + Queue: ConfessorCabal + Description: Fanatical elite infantry that can deploy Idols of Kane to inspire allies and demoralize enemies. + IconPalette: chrometd + Valued: + Cost: 750 + Tooltip: + Name: Confessor + UpdatesPlayerStatistics: + AddToArmyValue: true + Health: + HP: 13000 + Armament@PRIMARY: + Weapon: ConfessorGun + Armament@BATF: + Name: batf + Weapon: ConfessorGun + MuzzleSequence: garrison-muzzle + AttackFrontal: + PauseOnCondition: being-warped || blinded || reapersnare + FacingTolerance: 0 + WithInfantryBody: + DefaultAttackSequence: shoot + ProducibleWithLevel: + Prerequisites: barracks.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: barracks.upgraded + Mobile: + Voice: Move + Voiced: + VoiceSet: ConfessorVoice + AttackMove: + Voice: Move + Passenger: + Voice: Move + Guard: + Voice: Move + SpawnActorAbility: + Actors: iok + Range: 1c896 + SkipMakeAnimations: false + CircleColor: ff000077 + SpawnSounds: iok-place.aud + AmmoPool: idol + TargetModifiedCursor: ability2 + ConcurrentLimit: 1 + KillExcessDamageTypes: SmallExplosionDeath + AvoidActors: true + AmmoPool@IdolOfKane: + Name: idol + Armaments: none + Ammo: 1 + ReloadAmmoPoolCA@IdolOfKane: + AmmoPool: idol + Delay: 750 + Count: 1 + ShowSelectionBar: true + SelectionBarColor: aaaaaa + WithAmmoPipsDecoration@IdolOfKane: + AmmoPools: idol + RequiresSelection: true + Position: BottomLeft + Margin: 4, 3 + Targetable@MindControlImmune: + TargetTypes: MindControlImmune + Targetable@ChaosImmune: + TargetTypes: ChaosImmune + Encyclopedia: + Category: Nod/Infantry + HideBuildable: True + EncyclopediaExtras: + AdditionalInfo: Requires Zeal Covenant. ACOL: Inherits: ^Cyborg Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove Buildable: - Queue: Infantry - BuildAtProductionType: Infantry - BuildPaletteOrder: 180 + Queue: InfantrySQ, InfantryMQ, CyborgMQ + BuildAtProductionType: Cyborg + BuildPaletteOrder: 111 IconPalette: chrometd - Prerequisites: anyradar, obli, ~infantry.marked, ~!cyborg.production, ~techlevel.high - Description: Elite infantry with a laser weapon.\n Strong vs Infantry, Light Armor\n Weak vs Aircraft\n Special Ability: Regains health on tiberium + Prerequisites: obliortmpl, anyradar, ~infantry.marked, ~!tmpp, ~techlevel.medium + Description: Cyborg infantry with a laser weapon. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor + Weaknesses: • Cannot attack Aircraft + Attributes: • Heals rapidly on Tiberium Valued: - Cost: 450 + Cost: 475 Tooltip: Name: Acolyte UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 10000 + HP: 9000 Mobile: - Speed: 49 + Speed: 60 Voice: Move RevealsShroud: Range: 5c0 Armament@PRIMARY: Weapon: PortaLaser LocalOffset: 427,0,341 - Armament@Garrison: - Name: mounted - Weapon: PortaLaserE + Armament@BATF: + Name: batf + Weapon: PortaLaser TakeCover: ProneOffset: 227,0,-245 - PauseOnCondition: being-warped SpeedModifier: 70 - AttackFrontal: + AttackFrontalCharged: Voice: Attack - PauseOnCondition: being-warped + FacingTolerance: 32 + ChargeLevel: 0,2 + PauseOnCondition: being-warped || blinded || reapersnare WithInfantryBody: DefaultAttackSequence: shoot IdleSequences: idle3 @@ -1737,26 +2695,58 @@ ACOL: Guard: Voice: Move Voiced: - VoiceSet: CyborgVoice + VoiceSet: AcolyteVoice ProducibleWithLevel: Prerequisites: barracks.upgraded - Selectable: - Class: acol + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: barracks.upgraded Convertible: - SpawnActors: ACOL.UPG + SpawnActors: TPLR + ReplacedInQueue: + Actors: tplr + Encyclopedia: + Category: Nod/Infantry + EncyclopediaExtras: + Subfaction: marked + ChangesHealth@THEAL: + PercentageStep: 3 -ACOL.UPG: +TPLR: Inherits: ACOL - RenderSprites: - Image: acol + Inherits@HEALINGCOOLDOWN: ^HealingCooldown + Tooltip: + Name: Templar Valued: - Cost: 500 + Cost: 550 Health: - HP: 20000 + HP: 21000 + RevealsShroud: + Range: 6c0 Buildable: - Prerequisites: anyradar, obli, ~infantry.marked, ~cyborg.production, ~techlevel.high + Prerequisites: obliortmpl, anyradar, tmpp, ~infantry.marked, ~techlevel.high + BuildPaletteOrder: 112 -TakeCover: -Convertible: + -ReplacedInQueue: + Crushable: + CrushClasses: heavyinfantry + WithInfantryBody: + IdleSequences: idle, idle2 + StandSequences: stand, stand2 + Voiced: + VoiceSet: TemplarVoice + Armament@PRIMARY: + Weapon: PortaLaser.Templar + LocalOffset: 427,0,341 + RequiresCondition: !quantum-upgrade + Armament@PRIMARYUPG: + Weapon: PortaLaser.Templar.UPG + LocalOffset: 427,0,341 + RequiresCondition: quantum-upgrade + GrantConditionOnPrerequisite@QUANTUM: + Condition: quantum-upgrade + Prerequisites: quantum.upgrade JJET: Inherits@1: ^ExistsInWorld @@ -1765,18 +2755,23 @@ JJET: Inherits@5: ^Warpable Inherits@6: ^EmpDisable Inherits@9: ^AuraHealable + Inherits@10: ^Chillable + Inherits@11: ^Suppressable Inherits@bounty: ^GlobalBounty Inherits@selection: ^SelectableCombatUnit - Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove + Inherits@AUTOTARGET: ^AutoTargetAllAssaultMove Inherits@GAINSEXPERIENCE: ^GainsExperience - Inherits@BERSERK: ^Berserk Inherits@mind: ^MindControllable + Inherits@ionsurge: ^IonSurgable + Inherits@atomize: ^Atomizable + Inherits@Blindable: ^Blindable + Inherits@BERSERK: ^Berserk Huntable: ClassicFacingBodyOrientation: QuantizedFacings: 8 RenderSprites: Image: jjet - PlayerPalette: overlayplayertd + PlayerPalette: playertd OwnerLostAction: Action: Kill AppearsOnRadar: @@ -1784,15 +2779,19 @@ JJET: HiddenUnderFog: Type: GroundPosition RevealsShroud: - Range: 6c0 - MinRange: 4c0 + Range: 7c0 + MinRange: 6c0 Type: GroundPosition RevealGeneratedShroud: False RevealsShroud@GAPGEN: - Range: 4c0 + Range: 6c0 Type: GroundPosition + Voiced: + VoiceSet: JJVoice AttackMove: + Voice: Move Guard: + Voice: Move Guardable: ActorLostNotification: Notification: AirUnitLost @@ -1812,12 +2811,16 @@ JJET: Duration: 100 Radius: 2c512 Buildable: - Queue: Infantry + Queue: InfantrySQ, InfantryMQ BuildAtProductionType: Soldier - BuildPaletteOrder: 150 - Prerequisites: anyradar, ~pyle, ~techlevel.infonly + BuildPaletteOrder: 100 + Prerequisites: anyradar, ~pyle, ~techlevel.medium IconPalette: chrometd - Description: Flying general-purpose infantry.\n Can detect cloaked units.\n Strong vs Infantry\n Weak vs Vehicles, Aircraft + Description: Flying general-purpose infantry. + TooltipExtras: + Strengths: • Strong vs Infantry, Aircraft + Weaknesses: • Weak vs Heavy Armor, Buildings, Defenses + Attributes: • Detects cloaked ground units Valued: Cost: 350 Tooltip: @@ -1825,13 +2828,13 @@ JJET: UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 9000 + HP: 6000 Targetable: RequiresCondition: !airborne && !being-warped TargetTypes: Ground, Infantry Targetable@HEAL: RequiresCondition: (!airborne && !being-warped) && damaged - TargetTypes: Heal + TargetTypes: Healable Targetable@AIRBORNE: RequiresCondition: airborne && !being-warped TargetTypes: AirSmall @@ -1848,31 +2851,31 @@ JJET: Voice: Poisoned DeathTypes: PoisonDeath, ToxinDeath, ToxicDeath, MutatedDeath Armor: - Type: Light + Type: Aircraft Aircraft: CruiseAltitude: 1c0 - IdealSeparation: 0c255 + IdealSeparation: 0c384 InitialFacing: 92 - Speed: 99 - LandableTerrainTypes: Clear,Rough,Road,Ore,Beach,Gems,Tiberium,BlueTiberium + Speed: 118 + LandableTerrainTypes: Clear,Road,Rough,Ore,Gems,Tiberium,BlueTiberium,BlackTiberium,Beach,Bridge,Tunnel,Ford AirborneCondition: airborne CruisingCondition: cruising CanHover: true CanSlide: true VTOL: true - AttackAircraft: - AttackType: Hover - FacingTolerance: 0 - Voice: Attack Armament@AIRBORNE: Weapon: M60mgJJ RequiresCondition: airborne Armament@GROUND: Weapon: M60mgJJ.Ground RequiresCondition: !airborne + Armament@AA: + Weapon: M60mgJJAA + RequiresCondition: airborne AttackFrontal: - PauseOnCondition: being-warped + PauseOnCondition: being-warped || blinded Voice: Attack + FacingTolerance: 40 WithInfantryBody: IdleSequences: idle1,idle2 DefaultAttackSequence: attack @@ -1890,7 +2893,7 @@ JJET: Actor: JJET.Husk RequiresCondition: airborne WithDeathAnimation: - DeathSequencePalette: overlayplayertd + DeathSequencePalette: playertd DeathTypes: DefaultDeath: 1 BulletDeath: 2 @@ -1907,6 +2910,9 @@ JJET: RequiresCondition: !airborne ProducibleWithLevel: Prerequisites: barracks.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: barracks.upgraded WithShadow: Offset: 43, 128, 0 ZOffset: 512 @@ -1914,47 +2920,63 @@ JJET: Hovers@CRUISING: RequiresCondition: cruising DetectCloaked: - CloakTypes: Cloak, Thief - Range: 3c0 - ActorLostNotification: + DetectionTypes: Cloak + Range: 2c0 Selectable: - Bounds: 18,18,0,-6 - DecorationBounds: 12,17,0,-6 - AttackMove: - Voice: Move - Guard: - Voice: Move - Voiced: - VoiceSet: JJVoice - AutoTargetPriority@DEFAULT: - RequiresCondition: !stance-attackanything && !assault-move && !airborne - AutoTargetPriority@ATTACKANYTHING: - RequiresCondition: (stance-attackanything || assault-move) && !airborne - AutoTargetPriority@DEFAULT_AIR: - RequiresCondition: !stance-attackanything && !assault-move && airborne - ValidTargets: Vehicle, Water, Underwater, Defense - InvalidTargets: NoAutoTarget, WaterStructure - Priority: 1 - AutoTargetPriority@DEFAULT_AIR_ATTACK_INFANTRY: - RequiresCondition: !stance-attackanything && !assault-move && airborne - ValidTargets: Infantry - InvalidTargets: NoAutoTarget, WaterStructure - Priority: 10 - AutoTargetPriority@ATTACKANYTHING_AIR: - RequiresCondition: (stance-attackanything || assault-move) && airborne - ValidTargets: Vehicle, Water, Underwater, Structure, Defense - InvalidTargets: NoAutoTarget - Priority: 1 - AutoTargetPriority@ATTACKANYTHING_AIR_ATTACK_INFANTRY: - RequiresCondition: (stance-attackanything || assault-move) && airborne - ValidTargets: Infantry - InvalidTargets: NoAutoTarget - Priority: 10 - KillsSelf: + Bounds: 768, 768, 0, -256 + DecorationBounds: 512, 725, 0, -256 + KillsSelf@Emp: RequiresCondition: empdisable && cruising GrantConditionOnDamageState@DAMAGED: Condition: damaged ValidDamageStates: Light, Medium, Heavy, Critical + Targetable@MindControlImmune: + TargetTypes: MindControlImmune + RequiresCondition: airborne + Encyclopedia: + Category: GDI/Infantry + Scale: 2 + +BJET: + Inherits: JJET + RenderSprites: + Image: bjet + Valued: + Cost: 550 + Buildable: + Prerequisites: anyradar, ~pyle, bjet.upgrade, ~techlevel.medium + IconPalette: chrometd + Description: Flying infantry with a grenade launcher. + BuildPaletteOrder: 101 + TooltipExtras: + Strengths: • Strong vs Buildings, Defenses, Light Armor + Weaknesses: • Weak vs Heavy Armor\n• Has difficulty hitting moving targets\n• Cannot attack Aircraft + Tooltip: + Name: Bombardier + Aircraft: + Speed: 100 + Armament@AIRBORNE: + Weapon: GrenadeJJ + LocalOffset: 0,0,180 + Armament@GROUND: + Weapon: GrenadeJJ + LocalOffset: 0,0,180 + -Armament@AA: + SpawnActorOnDeath@airborne: + Actor: JJET.UPG.Husk + RequiresCondition: airborne + WithInfantryBody@AIRBORNE: + DefaultAttackSequence: flying-attack-upg + StandSequences: hover-upg + MinIdleDelay: 0 + MaxIdleDelay: 1 + MoveSequence: flying-upg + RequiresCondition: airborne + WithInfantryBody: + IdleSequences: idle1-upg, idle2-upg + StandSequences: stand-upg + DefaultAttackSequence: attack-upg + RequiresCondition: !airborne JJET.Husk: ClassicFacingBodyOrientation: @@ -1965,7 +2987,7 @@ JJET.Husk: Tooltip: Name: Jumpjet Infantry FallsToEarth: - Velocity: 86 + Velocity: 70 Explosion: Aircraft: CruiseAltitude: 1c0 @@ -1974,7 +2996,7 @@ JJET.Husk: VTOL: true RenderSprites: Image: jjet - PlayerPalette: overlayplayertd + PlayerPalette: playertd WithSpriteBody: Sequence: die-falling Health: @@ -1984,82 +3006,64 @@ JJET.Husk: Condition: water-death WithDeathAnimation: RequiresCondition: !water-death - FallbackSequence: die-flying - DeathSequencePalette: overlayplayertd + FallbackSequence: die-fallen + DeathSequencePalette: playertd WithDeathAnimation@SPLASH: RequiresCondition: water-death FallbackSequence: die-splash Interactable: + WithShadow: + Offset: 43, 128, 0 + ZOffset: 512 + +JJET.UPG.Husk: + Inherits: JJET.Husk + WithSpriteBody: + Sequence: die-falling-upg E8: Inherits: ^Soldier Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove - Inherits@BERSERK: ^Berserk Buildable: - Queue: Infantry + Queue: InfantrySQ, InfantryMQ BuildAtProductionType: Soldier - BuildPaletteOrder: 130 - Prerequisites: ~infantry.iraq, ttur, anyradar, ~techlevel.infonly - Description: Anti-infantry unit.\n Strong vs Infantry, Light Armor\n Weak vs Tanks, Aircraft\n Special Ability: Desolate Ground\n Special Ability: Irradiates Vehicles + BuildPaletteOrder: 92 + Prerequisites: ~infantry.iraq, tturorstek, anyradar, ~!deso.upgrade, ~techlevel.medium + Description: Anti-infantry unit with radiation based weaponry. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor + Weaknesses: • Weak vs Heavy Armor, Buildings, Defenses\n• Cannot attack Aircraft Valued: - Cost: 600 + Cost: 425 Tooltip: - Name: Desolator + Name: Rad Trooper UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 24000 - Mobile: - Voice: Move - PauseOnCondition: !undeployed && being-warped + HP: 8000 RevealsShroud: Range: 5c0 Armament@PRIMARY: - Weapon: RadBeamWeapon + Weapon: RadTrooperBeam LocalOffset: 427,0,341 - Armament@Garrison: - Name: mounted - Weapon: RadBeamWeaponE + Armament@BATF: + Name: batf + Weapon: RadTrooperBeam TakeCover: ProneOffset: 384,0,-395 - SpeedModifier: 70 - AttackFrontal: - Voice: Attack - PauseOnCondition: being-warped || !undeployed - AttackMove: - Voice: Move - Passenger: - Voice: Move - Guard: - Voice: Move - Voiced: - VoiceSet: DesVoice + AttackFrontalCharged: + FacingTolerance: 32 + ChargeLevel: 0,2 + PauseOnCondition: being-warped || blinded || reapersnare ProducibleWithLevel: Prerequisites: barracks.upgraded - -Crushable: - PeriodicExplosion: - Weapon: RadEruptionWeapon - RequiresCondition: deployed - InitialDelay: 20 + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: barracks.upgraded Targetable@DESOLATOR: TargetTypes: Desolator - GrantConditionOnDeploy: - DeployedCondition: deployed - UndeployedCondition: undeployed - UndeployOnMove: True - Facing: 92 - Voice: Attack - PauseOnCondition: being-warped WithInfantryBody: DefaultAttackSequence: shoot - RequiresCondition: !being-warped && undeployed - WithSpriteBody@DEPLOYED: - Sequence: deployed - RequiresCondition: !undeployed - Name: deployed - WithMakeAnimation: - Sequence: deploy - BodyNames: deployed GrantConditionOnPrerequisite@BIO: Condition: biofirepower FirepowerMultiplier@BIOLAB: @@ -2075,28 +3079,131 @@ E8: -DamagedByTintedCells@RADMEDHAZMAT: -DamagedByTintedCells@RADWEAK: -DamagedByTintedCells@RADWEAKHAZMAT: - -GrantCondition@HAZMAT: -GrantConditionOnPrerequisite@HAZMAT: -GrantConditionOnPrerequisite@HAZMATSOVIET: - -GrantConditionOnTerrain@HAZMATSOVIET: - GrantCondition@HAZMATSOVIET: - -RequiresCondition: + -GrantConditionOnPrerequisite@HAZMATIRAQ: + -GrantConditionOnPrerequisite@HAZMATZOCOM: + -GrantCondition@HAZMAT: + -GrantCondition@HAZMATSOVIET: -WithDecoration@HAZMAT: + WithDecoration@HAZMATSOVIET: + -RequiresCondition: + -GrantConditionOnTerrain@HAZMATSOVIET: -SpeedMultiplier@HAZMATSOVIET: + Targetable@HAZMAT: + -RequiresCondition: + WithDecoration@BINO: + -BlinkPatterns: + ReplacedInQueue: + Actors: deso + Encyclopedia: + Category: Soviets/Infantry + EncyclopediaExtras: + Subfaction: iraq + +DESO: + Inherits: E8 + Inherits@HEALINGCOOLDOWN: ^HealingCooldown + Buildable: + BuildPaletteOrder: 93 + Prerequisites: ~infantry.iraq, tturorstek, anyradar, ~deso.upgrade, ~techlevel.medium + Tooltip: + Name: Desolator + TooltipExtras: + Attributes: • Irradiates vehicles causing them to take more damage, deal less damage, and damage nearby units\n• Special Ability: Desolate Ground + Valued: + Cost: 600 + Health: + HP: 18500 + Voiced: + VoiceSet: DesVoice + Mobile: + Voice: Move + AttackMove: + Voice: Move + Passenger: + Voice: Move + Guard: + Voice: Move + AttackFrontalCharged: + Voice: Attack + PauseOnCondition: being-warped || blinded || reapersnare || !undeployed + GrantConditionOnDeploy: + DeployedCondition: deployed + UndeployedCondition: undeployed + UndeployOnMove: True + Voice: Attack + PauseOnCondition: being-warped || reapersnare + SmartDeploy: True + UndeployOnStop: + Crushable: + CrushClasses: heavyinfantry + TakeCover: + ProneOffset: 0,0,0 + ProneSequencePrefix: + WithInfantryBody: + RequiresCondition: undeployed && !being-warped && !parachute + Armament@PRIMARY: + Weapon: DesolatorBeam + LocalOffset: 300,0,341 + Armament@BATF: + Weapon: DesolatorBeam + PeriodicExplosion: + Weapon: RadEruptionWeapon + RequiresCondition: deployed && deployed-initial + PeriodicExplosion@Stage2: + Weapon: RadEruptionWeaponStage2 + RequiresCondition: deployed && !deployed-initial + GrantTimedCondition@InitialDeploy: + Condition: deployed-initial + Duration: 141 + RequiresCondition: deployed + WithSpriteBody@DEPLOYED: + Sequence: deployed + RequiresCondition: !undeployed + Name: deployed + WithMakeAnimation: + Sequence: deploy + BodyNames: deployed + -ReplacedInQueue: + AutoDeployer@AI: + RequiresCondition: botowner && !deployed && !parachute + DeployChance: 20 + DeployTrigger: Attack + DeployTicks: 5 + UndeployTicks: 50 + GrantConditionOnBotOwner@IAMBOT: + Condition: botowner + Bots: brutal, vhard, hard, normal, easy, naval, campaign + EncyclopediaExtras: + RenderPreviewActor: deso.preview + +DESO.Preview: + Inherits: ^PreviewDummy + Inherits@TDPalette: ^TDPalette + RenderSprites: + Image: deso + WithInfantryBody: + QuantizeFacingsFromSequence: + Sequence: stand N1C: Inherits: ^Cyborg Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove - Inherits@GAINSEXPERIENCE: ^GainsExperience Inherits@BOTHELPER: ^BotCaptureHelper + Inherits@HEALINGCOOLDOWN: ^HealingCooldown RenderSprites: Buildable: - Queue: Infantry + Queue: InfantrySQ, InfantryMQ, CyborgMQ BuildAtProductionType: Cyborg BuildPaletteOrder: 13 - Prerequisites: ~cyborg.production, ~infantry.cyborg, ~techlevel.medium + Prerequisites: tmpp, ~tmpp, ~techlevel.high IconPalette: chrometd - Description: General-purpose cyborg infantry\n Strong vs Infantry\n Weak vs Vehicles, Artillery + Description: General-purpose cyborg infantry. + TooltipExtras: + Strengths: • Strong vs Infantry + Weaknesses: • Weak vs Heavy Armor, Buildings, Defenses\n• Cannot attack Aircraft + Attributes: • Heals on Tiberium Valued: Cost: 250 Tooltip: @@ -2105,13 +3212,14 @@ N1C: UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 21000 + HP: 20000 Mobile: - Speed: 43 + Speed: 46 Voice: Move AttackFrontal: Voice: Attack - PauseOnCondition: being-warped + PauseOnCondition: being-warped || blinded || reapersnare + FacingTolerance: 0 AttackMove: Voice: Move Passenger: @@ -2122,40 +3230,49 @@ N1C: VoiceSet: CyborgVoice Armament@PRIMARY: Weapon: Vulcan3 - Armament@Garrison: - Name: mounted + Armament@BATF: + Name: batf Weapon: Vulcan3 MuzzleSequence: garrison-muzzle ProducibleWithLevel: Prerequisites: barracks.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: barracks.upgraded + Encyclopedia: + Category: Nod/Infantry N3C: Inherits: ^Cyborg - Inherits@AUTOTARGET: ^AutoTargetAllAssaultMoveAntiAir - Inherits@GAINSEXPERIENCE: ^GainsExperience + Inherits@AUTOTARGET: ^AutoTargetAllAssaultMovePrioritizeAir RenderSprites: Buildable: - Queue: Infantry + Queue: InfantrySQ, InfantryMQ, CyborgMQ BuildAtProductionType: Cyborg BuildPaletteOrder: 23 - Prerequisites: ~cyborg.production, ~infantry.cyborg, ~techlevel.medium + Prerequisites: tmpp, ~tmpp, ~techlevel.high IconPalette: chrometd - Description: Anti-tank cyborg infantry\n Strong vs Tanks, Aircraft\n Weak vs Infantry, Artillery + Description: Anti-tank/anti-aircraft cyborg infantry. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Aircraft, Buildings, Defenses + Weaknesses: • Weak vs Infantry, Light Armor + Attributes: • Heals on Tiberium Valued: Cost: 400 Tooltip: - Name: Cyborg Reaper + Name: Cyborg Rocket Soldier UpdatesPlayerStatistics: AddToArmyValue: true -TakeCover: Health: - HP: 14000 + HP: 11000 Mobile: - Speed: 43 + Speed: 46 Voice: Move AttackFrontal: Voice: Attack - PauseOnCondition: being-warped + PauseOnCondition: being-warped || blinded || reapersnare + FacingTolerance: 0 AttackMove: Voice: Move Passenger: @@ -2163,7 +3280,7 @@ N3C: Guard: Voice: Move Voiced: - VoiceSet: ReaperVoice + VoiceSet: CyborgVoice WithInfantryBody: DefaultAttackSequence: shoot Armament@PRIMARY: @@ -2188,25 +3305,17 @@ N3C: LocalOffset: 0,0,500 PauseOnCondition: !ammo RequiresCondition: tibcore-upgrade - Armament@GarrisonAA: - Name: mountedaa - Weapon: RedEyeE.CYB - PauseOnCondition: !ammo - RequiresCondition: !tibcore-upgrade - Armament@GarrisonAAUPG: - Name: mountedaa - Weapon: RedEye.CYB.TibCore - PauseOnCondition: !ammo - RequiresCondition: tibcore-upgrade - Armament@Garrison: - Name: mounted - Weapon: DragonE.CYB - PauseOnCondition: !ammo + # Prevents attack moving forwards when main weapon is paused for reload + Armament@Targeter: + Weapon: DragonTargeter + LocalOffset: 0,0,500 + Armament@BATF: + Name: batf + Weapon: DragonBATF.CYB RequiresCondition: !tibcore-upgrade - Armament@GarrisonUPG: - Name: mounted - Weapon: DragonE.CYB.TibCore - PauseOnCondition: !ammo + Armament@BATFUPG: + Name: batf + Weapon: DragonBATF.CYB.TibCore RequiresCondition: tibcore-upgrade GrantConditionOnPrerequisite@TIBCORE: Condition: tibcore-upgrade @@ -2218,27 +3327,33 @@ N3C: Delay: 50 Count: 1 AutoTarget: - ScanRadius: 5 + MaximumScanTimeInterval: 5 ProducibleWithLevel: Prerequisites: barracks.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: barracks.upgraded + Encyclopedia: + Category: Nod/Infantry RMBC: Inherits: ^Cyborg Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove - Inherits@GAINSEXPERIENCE: ^GainsExperience Inherits@EMP: ^EmpDisable - Inherits@CLOAK: ^Cloakable - RenderSprites: - PlayerPalette: playerd2k - Image: cycom - Scale: 1 + Inherits@chrono: ^Chronoshiftable + Inherits@C4Plantable: ^C4Plantable + Inherits@HeavyArmor: ^HeavyArmor Buildable: - Queue: Infantry + Queue: InfantrySQ, InfantryMQ, CyborgMQ BuildAtProductionType: Cyborg - BuildPaletteOrder: 230 - Prerequisites: tmpp, ~infantry.cyborg, ~techlevel.high + BuildPaletteOrder: 232 IconPalette: chrometd - Description: Elite cyborg infantry unit armed with\na plasma cannon.\n Strong vs Infantry, Vehicles\n Weak vs Aircraft + Prerequisites: ~infantry.nod, tmpp, covenant.level3, ~techlevel.high + Description: Elite cyborg infantry unit armed with a plasma cannon. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor, Infantry + Weaknesses: • Cannot attack Aircraft + Attributes: • Heals on Tiberium Valued: Cost: 1500 Tooltip: @@ -2246,18 +3361,17 @@ RMBC: UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 38000 - Armor: - Type: Heavy + HP: 40000 Mobile: - Speed: 49 + Speed: 54 Voice: Move PauseOnCondition: being-warped || empdisable RevealsShroud: - Range: 5c0 + Range: 6c0 AttackFrontal: Voice: Attack - PauseOnCondition: being-warped || empdisable + PauseOnCondition: being-warped || blinded || reapersnare || empdisable + FacingTolerance: 0 AttackMove: Voice: Move Passenger: @@ -2266,54 +3380,66 @@ RMBC: Voice: Move Voiced: VoiceSet: CyborgCommandoVoice - WithInfantryBody: - DefaultAttackSequence: shoot Armament@PRIMARY: Weapon: CyCannon - LocalOffset: 0,0,300 - Armament@Garrison: - Name: mounted - Weapon: cycannon - Explodes: + LocalOffset: 300,0,300 + Armament@BATF: + Name: batf + Weapon: CyCannon + FireWarheadsOnDeath: Weapon: UnitExplodeSmall EmptyWeapon: UnitExplodeSmall Chance: 100 RequiresCondition: !being-warped - WithDeathAnimation: - DeathSequencePalette: playerd2k - Selectable: - Bounds: 24,24,0,-4 - DecorationBounds: 12,20,0,-4 -TakeCover: -Crushable: -KillsSelf@Immolate: Targetable: - TargetTypes: Ground, Vehicle, C4Immune, ChaosImmune, DriverKillImmune, Cyborg + TargetTypes: Ground, Vehicle + -Targetable@HEAL: Targetable@REPAIR: - RequiresCondition: !parachute && damaged && !being-warped - TargetTypes: Repair + RequiresCondition: !parachute && damaged && !being-warped && !repair-cooldown + TargetTypes: Repairable WithInfantryBody: DefaultAttackSequence: shoot StandSequences: stand - IdleSequences: idle1, idle2 - RequiresCondition: !being-warped || !empdisable + IdleSequences: idle, idle2 + MinIdleDelay: 75 + MaxIdleDelay: 375 + RequiresCondition: !parachute && !being-warped && !reapersnare && !empdisable WithInfantryBody@Warped: RequiresCondition: being-warped || empdisable DamageMultiplier@CYBORGARMOR: Modifier: 85 ProducibleWithLevel: Prerequisites: barracks.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: barracks.upgraded + GrantConditionOnHealingReceived@REPAIRCOOLDOWN: + Condition: repair-cooldown + RequiredHealing: 85000 + StackDuration: 1000 + MinimumHealing: 2500 + DamageTypes: DirectRepair + ShowSelectionBar: true + Encyclopedia: + Category: Nod/Infantry IVAN: Inherits: ^Soldier Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove - Inherits@BERSERK: ^Berserk + Inherits@Inspirable: ^Inspirable Buildable: - Queue: Infantry + Queue: InfantrySQ, InfantryMQ BuildAtProductionType: Soldier - BuildPaletteOrder: 32 - Prerequisites: ~infantry.ukraine, weap, ~techlevel.infonly - Description: Specialist demolition infantry armed with explosives.\n Strong vs Buildings\n Weak vs Aircraft + BuildPaletteOrder: 41 + Prerequisites: ~infantry.ukraine, weap, ~techlevel.low + Description: Specialist demolition infantry armed with explosives. + TooltipExtras: + Strengths: • Strong vs Buildings, Defenses, Light Armor + Weaknesses: • Cannot attack Aircraft\n• Has difficulty hitting moving targets + Attributes: • Bombs will bounce if they hit the ground Valued: Cost: 600 Tooltip: @@ -2321,9 +3447,9 @@ IVAN: UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 7000 + HP: 12000 Mobile: - Speed: 56 + Speed: 72 Voice: Move AttackMove: Voice: Move @@ -2337,18 +3463,19 @@ IVAN: Weapon: Ivanbomb LocalOffset: 0,0,555 FireDelay: 15 - Armament@Garrison: - Name: mounted + Armament@BATF: + Name: batf Weapon: Ivanbomb - FireDelay: 15 TakeCover: ProneOffset: 256,64,-331 AttackFrontal: Voice: Attack - PauseOnCondition: being-warped + PauseOnCondition: being-warped || blinded || reapersnare + FacingTolerance: 0 WithInfantryBody: + StandSequences: stand DefaultAttackSequence: throw - Explodes: + FireWarheadsOnDeath: Weapon: ArtilleryExplode EmptyWeapon: ArtilleryExplode Chance: 100 @@ -2356,40 +3483,59 @@ IVAN: RequiresCondition: !being-warped ProducibleWithLevel: Prerequisites: barracks.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: barracks.upgraded Voiced: VoiceSet: CrazyIvanVoice + Encyclopedia: + Category: Soviets/Infantry + EncyclopediaExtras: + Subfaction: ukraine BRUT: Inherits: ^Soldier Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove + Inherits@HEALINGCOOLDOWN: ^HealingCooldown AutoTarget: ScanRadius: 4 InitialStance: AttackAnything Buildable: - Queue: Infantry + Queue: InfantrySQ, InfantryMQ BuildAtProductionType: Soldier - BuildPaletteOrder: 85 - Prerequisites: anyradar, ~infantry.yuri, ~techlevel.infonly - Description: Genetically engineered hulk.\n Strong vs Infantry, Vehicles\n Weak vs Aircraft, Buildings + BuildPaletteOrder: 94 + Prerequisites: anyradar, ~infantry.yuri, ~techlevel.medium + Description: Melee range genetically engineered hulk. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor, Infantry + Weaknesses: • Cannot attack Aircraft + Attributes: • Immune to mind control\n• Self heals to 50% out of combat RenderSprites: Valued: - Cost: 500 + Cost: 450 Tooltip: Name: Brute UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 25000 + HP: 32000 + Armor: + Type: Light Mobile: - Speed: 56 + Speed: 60 Voice: Move + Passenger: + CargoType: Brute RevealsShroud: - Range: 4c0 + Range: 5c0 Selectable: - DecorationBounds: 14,19,-1,-8 - Targetable: - RequiresCondition: !being-warped - TargetTypes: Ground, Infantry, ChaosImmune, MindControlImmune + DecorationBounds: 640, 896, 0, -341 + Targetable@MindControlImmune: + TargetTypes: MindControlImmune + Targetable@ChaosImmune: + TargetTypes: ChaosImmune + Targetable@DogImmune: + TargetTypes: DogImmune Voiced: VoiceSet: BruteVoice WithInfantryBody: @@ -2400,7 +3546,6 @@ BRUT: AttackSounds: Sounds: ibruatta.aud, ibruattb.aud WithDeathAnimation: - DeathSequencePalette: overlayplayertd DeathSequence: die UseDeathTypeSuffix: true DeathTypes: @@ -2411,7 +3556,7 @@ BRUT: FireDeath: 5 ElectricityDeath: 6 PoisonDeath: 1 - ChronoDeath: 1 + ChronoDeath: 8 ToxinDeath: 10 RadiationDeath: 10 FrozenDeath: 1 @@ -2425,8 +3570,24 @@ BRUT: Weapon: BruteBuildingAttack FireDelay: 10 AttackFrontal: - PauseOnCondition: being-warped + PauseOnCondition: being-warped || blinded || reapersnare Voice: Attack + FacingTolerance: 0 + DamageTypeDamageMultiplier@FLAKARMOR: + Modifier: 90 + DamageTypeDamageMultiplier@FLAKARMORMINOR: + Modifier: 95 + ChangesHealth: + PercentageStep: 1 + Delay: 25 + StartIfBelow: 50 + DamageCooldown: 150 + GrantConditionOnPrerequisite@Improved: + Condition: impmuta-upgrade + Prerequisites: impmuta.upgrade + SpeedMultiplier@Improved: + RequiresCondition: impmuta-upgrade + Modifier: 120 -TakeCover: -Captures@DRIVER_KILL: -CaptureManager: @@ -2434,6 +3595,12 @@ BRUT: -Crushable: -ExternalCondition@GMUT: -SpawnActorOnDeath@GMUT: + -Targetable@GMUT: + -Targetable@SpyDisguise: + Encyclopedia: + Category: Soviets/Infantry + EncyclopediaExtras: + Subfaction: yuri BRUT.Mutating: Inherits: BRUT @@ -2452,6 +3619,7 @@ BRUT.Mutating: Actor: brut OwnerType: Victim SpawnAfterDefeat: false + -ActorLostNotification: -UpdatesPlayerStatistics: -AutoTarget: -AutoTargetPriority@DEFAULT: @@ -2464,21 +3632,30 @@ BRUT.Mutating: -AttackFrontal: -AttackSounds: -WithInfantryBody: + -WithInfantryBody@Parachute: + -WithInfantryBody@Warped: -WithDeathAnimation: + -MapEditorData: + -Encyclopedia: SHAD: Inherits: ^Soldier Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove - Inherits@GAINSEXPERIENCE: ^GainsExperience - Inherits@BERSERK: ^Berserk + Buildable: + Queue: ShadowTeam + Description: Stealth infantry armed with a machine pistol and grenades. Valued: Cost: 500 Tooltip: Name: Shadow Operative + TooltipExtras: + Strengths: • Strong vs Buildings, Defenses, Infantry, Light Armor + Weaknesses: • Weak vs Heavy Armor\n• Cannot attack Aircraft\n• Has difficulty hitting moving vehicles + Attributes: • Cloaked when not in combat\n• Shadow beacons provide vision and attach to enemy vehicles that pass over them\n• Detects cloaked ground units and spies\n• Special Ability: Shadow Beacon UpdatesPlayerStatistics: AddToArmyValue: true RevealsShroud: - Range: 6c0 + Range: 8c0 Passenger: CustomPipType: red Voice: Move @@ -2491,38 +3668,49 @@ SHAD: StandSequences: stand, stand2 IdleSequences: idle1, idle2 AttackSequences: - primary: shoot - secondary: throw + primary: throw + secondary: shoot + tertiary: throw MinIdleDelay: 80 MaxIdleDelay: 250 Health: HP: 5000 Mobile: - Speed: 56 + Speed: 72 Voice: Move Armament@PRIMARY: - Weapon: ShadowOperativeGun + Name: primary + Weapon: ShadowOperativeGrenade + LocalOffset: 0,0,555 + FireDelay: 15 + PauseOnCondition: throwing-beacon || beacon-thrown Armament@SECONDARY: Name: secondary - Weapon: ShadowOperativeGrenade + Weapon: ShadowOperativeGun + PauseOnCondition: throwing-beacon || beacon-thrown + Armament@TERTIARY: + Name: tertiary + Weapon: ShadowBeaconLauncher LocalOffset: 0,0,555 FireDelay: 15 - Armament@Garrison: - Name: mounted + PauseOnCondition: !throwing-beacon + Armament@BATF: + Name: batf Weapon: ShadowOperativeGun AttackFrontal: Voice: Attack - PauseOnCondition: being-warped + PauseOnCondition: being-warped || blinded || reapersnare + FacingTolerance: 0 + Armaments: primary, secondary, tertiary AutoTarget: InitialStance: HoldFire - InitialStanceAI: ReturnFire + InitialStanceAI: AttackAnything Cloak: InitialDelay: 1 - CloakDelay: 90 + CloakDelay: 70 CloakedCondition: hidden - Palette: cloaktd IsPlayerPalette: true - CloakTypes: Cloak + DetectionTypes: Cloak UncloakOn: Unload, Demolish, Dock, Attack, Damage CloakSound: gstealon.aud UncloakSound: gstealof.aud @@ -2532,25 +3720,38 @@ SHAD: ValidDamageStates: Critical IgnoresDisguise: DetectCloaked: - CloakTypes: Cloak, Thief - Range: 4c0 + DetectionTypes: Cloak + Range: 5c0 -WithParachute: + Targetable@STEALTHBUBBLEIMMUNE: + TargetTypes: StealthBubbleImmune + WithColoredSelectionBox@INVIS: + RequiresCondition: invisibility || hidden + ColorSource: Player + TargetedAttackAbility: + ActiveCondition: throwing-beacon + ArmamentNames: tertiary + CircleColor: 8888aa + Type: ShadowBeacon + CancelAfterAttack: true + RequiresCondition: has-beacon + GrantConditionOnAttack@ShadowBeaconCooldown: + Condition: beacon-thrown + RevokeDelay: 30 + ArmamentNames: tertiary AmmoPool: - Ammo: 1 - Armaments: none + Armaments: tertiary + Ammo: 2 + AmmoCondition: has-beacon WithAmmoPipsDecoration: Position: BottomLeft Margin: 4, 3 RequiresSelection: true - Minelayer: - Mine: SHAB - TileUnknownName: build-valid - Rearmable: - RearmActors: shad.rearm - -# ---- dummy actor because RearmableActors is required -SHAD.REARM: - AlwaysVisible: + Encyclopedia: + Category: Nod/Infantry + HideBuildable: True + EncyclopediaExtras: + Subfaction: shadow SGLI: Inherits: ^Plane @@ -2559,6 +3760,9 @@ SGLI: Cost: 500 Tooltip: Name: Shadow Glider + TooltipExtras: + Strengths: • Strong vs Buildings, Defenses, Infantry, Light Armor + Weaknesses: • Weak vs Heavy Armor\n• Cannot attack Aircraft\n• Has difficulty hitting moving vehicles UpdatesPlayerStatistics: AddToArmyValue: true Health: @@ -2573,14 +3777,15 @@ SGLI: Type: GroundPosition Voiced: VoiceSet: ShadowOperativeVoice + DeathSounds: Aircraft: CruiseAltitude: 1c512 InitialFacing: 192 TurnSpeed: 16 Speed: 115 - RepulsionSpeed: 40 MaximumPitch: 56 Voice: Move + Repulsable: false Armament: Weapon: ShadowGliderGrenade LocalOffset: 0,0,-85 @@ -2588,36 +3793,52 @@ SGLI: FacingTolerance: 128 PersistentTargeting: false OpportunityFire: false - PauseOnCondition: being-warped + PauseOnCondition: being-warped || blinded + Cloak: + InitialDelay: 1 + CloakDelay: 125 + IsPlayerPalette: true + DetectionTypes: AirCloak + UncloakOn: Attack, Damage + CloakSound: gstealon.aud + UncloakSound: gstealof.aud + AutoTarget: + InitialStance: HoldFire + InitialStanceAI: AttackAnything SpawnActorOnDeath: Actor: sgli.crashing RequiresCondition: !being-warped Selectable: - DecorationBounds: 30,28,0,2 + DecorationBounds: 1280, 1194, 0, 85 TransformOnCondition: IntoActor: sgli.deployed - RequiresCondition: deployed - GrantConditionOnDeploy: - DeployedCondition: deployed + RequiresCondition: exhausted Targetable@AIRBORNE: RequiresCondition: airborne && !being-warped TargetTypes: AirSmall GrantTimedCondition@GLIDING: Condition: gliding - Duration: 750 + Duration: 1500 TimedConditionBar@GLIDING: Condition: gliding Color: 8A8A8A - GrantCondition@AUTODEPLOY: - Condition: deployed + GrantCondition@Exhausted: + Condition: exhausted RequiresCondition: !gliding RejectsOrders: RequiresCondition: !gliding -EjectOnDeath: - -Explodes: + -FireWarheadsOnDeath: -Contrail@1: -Contrail@2: -ActorLostNotification: + -SoundOnDamageTransitionCA: + TargetedDiveAbility: + MinDistance: 3 + MaxDistance: 8 + Speed: 175 + TransformIntoActor: shad + ShowSelectionBar: false SGLI.crashing: Inherits: SGLI @@ -2630,14 +3851,20 @@ SGLI.crashing: Image: sgli Aircraft: Speed: 80 + WithDeathAnimation: + DeathSequence: dead + FallbackSequence: dead + UseDeathTypeSuffix: false + DeathSequencePalette: player ActorLostNotification: Notification: AirUnitLost + -DeathSounds: + -UpdatesPlayerStatistics: -SpawnActorOnDeath: - -GrantConditionOnDeploy: -TransformOnCondition: -GrantTimedCondition@GLIDING: -TimedConditionBar@GLIDING: - -GrantCondition@AUTODEPLOY: + -GrantCondition@Exhausted: AmbientSoundCA: SoundFiles: chute1.aud Interval: 6000 @@ -2646,34 +3873,35 @@ SGLI.crashing: RequiresCondition: !being-warped RejectsOrders: -RequiresCondition: + -MapEditorData: + -Cloak: + -Targetable@GROUND: + -Targetable@AIRBORNE: + -Targetable@C4Attached: + -Targetable@TNTAttached: SGLI.deployed: Inherits: SGLI - FallsToEarth: - Moves: true - MaximumSpinSpeed: 0 - Explosion: - Velocity: 90 + FallsDownAndTransforms: + Actor: shad + FallVelocity: 90 + ForwardVelocity: 45 + SpawnActor: sgli.discarded RenderSprites: Image: sgli - SpawnActorOnDeath: - Actor: shad - RequiresCondition: !being-warped - SpawnActorOnDeath@gliderdiscarded: - Actor: sgli.discarded - RequiresCondition: !being-warped Aircraft: Speed: 45 AmbientSoundCA: SoundFiles: chute1.aud Interval: 6000 - -GrantConditionOnDeploy: -TransformOnCondition: -GrantTimedCondition@GLIDING: -TimedConditionBar@GLIDING: - -GrantCondition@AUTODEPLOY: + -GrantCondition@Exhausted: RejectsOrders: -RequiresCondition: + -MapEditorData: + -Cloak: SGLI.discarded: Inherits@1: ^SpriteActor @@ -2688,27 +3916,28 @@ SGLI.discarded: HitShape: MapEditorData: Categories: Husk - WithColoredOverlay@IDISABLE: - Palette: disabled - ChangesHealth: - Step: -100 - StartIfBelow: 101 - Delay: 25 - Health: - HP: 1000 + WithColoredOverlay: + Color: 00000060 + KillsSelf: + RemoveInstead: true + Delay: 250 Armor: Type: None + MapEditorData: + Categories: Husk BH: Inherits: ^Soldier Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove - Inherits@BERSERK: ^Berserk Buildable: - Queue: Infantry + Queue: InfantrySQ, InfantryMQ BuildAtProductionType: Soldier - BuildPaletteOrder: 150 - Prerequisites: anyradar, ~infantry.blackh, ~techlevel.infonly - Description: Elite precision flamethrower unit.\n Strong vs Vehicles, Infantry\n Weak vs Aircraft + BuildPaletteOrder: 110 + Prerequisites: anyradar, ~infantry.blackh, ~techlevel.medium + Description: Elite precision anti-tank flamethrower unit. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor + Weaknesses: • Weak vs Buildings, Defenses\n• Cannot attack Aircraft Valued: Cost: 500 Tooltip: @@ -2716,28 +3945,28 @@ BH: UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 13000 + HP: 16000 Mobile: - Speed: 49 + Speed: 66 Voice: Move RevealsShroud: Range: 5c0 Armament: Weapon: BlackHandFlamer LocalOffset: 300,0,180 - Armament@Garrison: - Name: mounted + Armament@BATF: + Name: batf-bh Weapon: BlackHandFlamer TakeCover: ProneOffset: 160,0,-256 - SpeedModifier: 70 WithMuzzleOverlay: AttackFrontal: - PauseOnCondition: being-warped + PauseOnCondition: being-warped || blinded || reapersnare Voice: Attack + FacingTolerance: 0 WithInfantryBody: DefaultAttackSequence: shoot - Explodes: + FireWarheadsOnDeath: Weapon: UnitExplodeFlameSmall EmptyWeapon: UnitExplodeFlameSmall Chance: 33 @@ -2745,6 +3974,9 @@ BH: RequiresCondition: !being-warped ProducibleWithLevel: Prerequisites: barracks.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: barracks.upgraded AmbientSoundCA: SoundFiles: flamer-loop1.aud InitialSound: flamer-start1.aud @@ -2753,5 +3985,1352 @@ BH: InitialSoundLength: 20 GrantConditionOnAttackCA: Condition: attacking + RevokeDelay: 3 Voiced: VoiceSet: BlackHandVoice + Targetable@STEALTHBUBBLEIMMUNE: + TargetTypes: StealthBubbleImmune + Encyclopedia: + Category: Nod/Infantry + EncyclopediaExtras: + Subfaction: blackh + +YURI: + Inherits: ^Soldier + Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove + Inherits@COMMANDOSKULL: ^CommandoSkull + Inherits@CommandoRegen: ^CommandoRegen + Inherits@HEALINGCOOLDOWN: ^HealingCooldown + AutoTargetPriority@DEFAULT: + RequiresCondition: !maxcontrolled || stance-attackanything || assault-move + Buildable: + Queue: InfantrySQ, InfantryMQ + BuildAtProductionType: Soldier + BuildPaletteOrder: 206 + Prerequisites: ~barr, stek, ~infantry.yuri, ~techlevel.high + BuildLimit: 1 + Description: Elite specialist infantry able to mind-control enemy units (up to 3, increases with veterancy). + TooltipExtras: + Strengths: • Strong vs Infantry, Vehicles, Defenses, Buildings + Weaknesses: • Cannot attack Aircraft + Attributes: • Maximum 1 can be trained\n• Detects cloaked ground units and spies\n• Immune to mind control\n• Shorter range and longer reload against vehicles\n• Psychic detection radius\n• Special Ability: Mind Blast + Valued: + Cost: 1350 + Tooltip: + Name: Yuri + UpdatesPlayerStatistics: + AddToArmyValue: true + Health: + HP: 18000 + Mobile: + Speed: 60 + Voice: Move + Armament@PRIMARY: + Weapon: EnslaveInfantry + LocalOffset: 150,0,400 + PauseOnCondition: deployed + Armament@SECONDARY: + Name: secondary + Weapon: EnslaveVehicle + LocalOffset: 150,0,400 + PauseOnCondition: deployed || !vs-vehicle-ammo + Armament@AIDummyAiming: ## Hack: Make AI deploy to attack structures + PauseOnCondition: being-warped + Name: aidummy + RequiresCondition: botowner && !deployed + Weapon: YuriDummyAim + Armament@BATF: + Name: batf + Weapon: PsychicBeamBATF + MindController: + ControlType: MindControl + ArmamentNames: primary, secondary + Capacity: 3 + ControlSounds: iyurat1a.aud + ReleaseSounds: yuri-release.aud + ControllingCondition: mindcontrolling + MaxControlledCondition: maxcontrolled + ControlAtCapacityBehaviour: DetonateOldest + SlaveDeployEffect: Detonate + SlaveDetonateWeapon: DetonateSlave + SlaveKillDamageTypes: BulletDeath + ExperienceFromControl: 100 + TargetTypeTicksToControl: + MindControlResistant: 105 + WithMindControlArc@MC: + ControlType: MindControl + Color: c71585 + Transparency: 55 + Offset: 0,0,511 + Angle: 32 + Width: 116 + WithIdleOverlay@mindcontrolling: + Sequence: mc + Palette: scrin + RequiresCondition: mindcontrolling + Offset: 0,0,400 + PeriodicExplosion: + Weapon: Mindblast + LocalOffset: 0,0,128 + InitialDelay: 18 + RequiresCondition: deployed && !being-warped + PeriodicExplosionOnSlaves: + ControlType: MindControl + Weapon: MindblastSlave + InitialDelay: 18 + RequiresCondition: deployed && !being-warped + GrantTimedConditionOnDeploy: + DeployedTicks: 25 + CooldownTicks: 150 + DeployedCondition: deployed + DeployingCondition: deploying + ShowSelectionBar: true + ShowSelectionBarWhenFull: false + StartsFullyCharged: true + Voice: Demolish + PauseOnCondition: being-warped || parachute + DischargingColor: bb0000 + ChargingColor: cc00cc + Instant: true + AttackFrontal: + PauseOnCondition: !ammo || being-warped || blinded || reapersnare || parachute + Armaments: primary, secondary, aidummy + FacingTolerance: 0 + RevealsShroud: + Range: 7c0 + Passenger: + CustomPipType: red + Voice: Move + Voiced: + VoiceSet: YuriVoice + -Crushable: + TakeCover: + SpeedModifier: 70 + WithInfantryBody: + IdleSequences: idle + StandSequences: stand + DefaultAttackSequence: shoot + RequiresCondition: !deployed && !deploying && !parachute && !being-warped && !reapersnare + WithSpriteBody@DEPLOYED: + Sequence: deployed + RequiresCondition: (deployed || deploying) && !being-warped + ExternalCondition@PRODUCED: + Condition: produced + VoiceAnnouncement: + RequiresCondition: produced + Voice: Build + AnnounceOnKill: + IgnoresDisguise: + DetectCloaked: + DetectionTypes: Cloak + Range: 5c0 + ProducibleWithLevel: + Prerequisites: barracks.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: barracks.upgraded + Targetable@Hero: + TargetTypes: Hero + Targetable@MindControlImmune: + TargetTypes: MindControlImmune + Targetable@ChaosImmune: + TargetTypes: ChaosImmune + Targetable@ReaperSnareImmune: + TargetTypes: ReaperSnareImmune + GrantConditionOnAttack@AI: + Condition: aiattack + RequiresCondition: botowner + ArmamentNames: aidummy + RevokeDelay: 60 + AutoDeployer@AI: + RequiresCondition: aiattack && botowner && !deployed && !parachute + DeployChance: 100 + DeployTrigger: Attack + DeployTicks: 100 + GrantConditionOnBotOwner@IAMBOT: + Condition: botowner + Bots: brutal, vhard, hard, normal, easy, naval, campaign + AutoTargetPriority@VEHCOOLDOWN: + ValidTargets: Infantry + InvalidTargets: NoAutoTarget + Priority: 10 + RequiresCondition: !vs-vehicle-ammo + AmmoPool: + Ammo: 1 + AmmoCondition: ammo + AmmoPool@Vehicles: + Name: secondary + Armaments: secondary + Ammo: 1 + AmmoCondition: vs-vehicle-ammo + ReloadAmmoPool: + Delay: 35 # matches EnslaveInfantry ReloadDelay + Count: 1 + ReloadAmmoPool@Vehicles: + AmmoPool: secondary + Delay: 100 + Count: 1 + MindControllerCapacityModifier@RANK-1: + Amount: 1 + RequiresCondition: rank-veteran == 1 + MindControllerCapacityModifier@RANK-2: + Amount: 2 + RequiresCondition: rank-veteran == 2 + MindControllerCapacityModifier@RANK-ELITE: + Amount: 3 + RequiresCondition: rank-elite + RangeMultiplier@RANK-ELITE: + Modifier: 115 + RequiresCondition: rank-elite + RangedGpsRadarProvider: + Range: 13c0 + TargetTypes: Infantry, Vehicle, Air, Structure + WithRangeCircle: + Type: YuriDetection + Range: 13c0 + Color: cc00ff77 + BorderColor: 00000044 + KeepsDistance: + ChangesHealth@ELITE: + Delay: 50 + Encyclopedia: + Category: Soviets/Infantry + EncyclopediaExtras: + Subfaction: yuri + +SEAL: + Inherits: ^Soldier + Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove + Inherits@COMMANDOSKULL: ^CommandoSkull + Inherits@HEALINGCOOLDOWN: ^HealingCooldown + Valued: + Cost: 1000 + Tooltip: + Name: Navy SEAL + Health: + HP: 16000 + UpdatesPlayerStatistics: + AddToArmyValue: true + Passenger: + CustomPipType: red + Voice: Move + AttackMove: + Voice: Move + RevealsShroud: + Range: 6c0 + Buildable: + BuildPaletteOrder: 131 + Prerequisites: ~infantry.usa, atek, ~techlevel.high + Queue: InfantrySQ, InfantryMQ + IconPalette: chrome + BuildLimit: -1 + Description: Elite infantry armed with an SMG and C4. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor, Buildings + Weaknesses: • Cannot attack Aircraft + Attributes: • Detects spies\n• Plants C4 to destroy structures + Voiced: + VoiceSet: SealVoice + Mobile: + Speed: 60 + Locomotor: seal + Voice: Move + Guard: + Voice: Move + Armament: + Weapon: mp5 + PauseOnCondition: onwater + Armament@BATF: + Name: batf + Weapon: mp5BATF + MuzzleSequence: garrison-muzzle + Armament@C4Place: + Weapon: PlaceC4Seal + Cursor: c4 + OutsideRangeCursor: c4 + Name: secondary + PauseOnCondition: !prepared && !onwater + Armament@C4Prepare: + Weapon: PrepareC4Seal + Cursor: c4 + OutsideRangeCursor: c4 + Name: tertiary + RequiresCondition: !onwater + AmmoPool@PreparedC4: + Name: prepared-c4 + Ammo: 1 + InitialAmmo: 0 + AmmoCondition: prepared + Armaments: secondary + ReloadAmmoPoolCA@PreparedC4: + AmmoPool: prepared-c4 + Delay: 100 + RequiresCondition: preparing-c4 + ShowSelectionBar: false + ReloadAmmoPoolCA@CancelC4: + AmmoPool: prepared-c4 + Delay: 1 + Count: -1 + ShowSelectionBar: false + RequiresCondition: !preparing-c4 && prepared + GrantConditionOnAttack@PreparingC4: + Condition: preparing-c4 + ArmamentNames: tertiary + RevokeDelay: 26 + AttackFrontal: + Voice: Attack + Armaments: primary, secondary, tertiary + PauseOnCondition: being-warped || blinded || reapersnare + FacingTolerance: 0 + Demolition: + DetonationDelay: 45 + Voice: Demolish + DamageTypes: ExplosionDeath + AnnounceOnKill: + ProducibleWithLevel: + Prerequisites: barracks.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: barracks.upgraded + IgnoresDisguise: + Crushable: + CrushClasses: heavyinfantry + TakeCover: + SpeedModifier: 70 + TargetSpecificOrderVoice: + Orders: Attack, ForceAttack + TargetTypeVoices: + Structure: Demolish + GrantConditionOnTerrain: + TerrainTypes: Water + Condition: onwater + WithInfantryBody: + DefaultAttackSequence: shoot + IdleSequences: idle1,idle2,idle3 + AttackSequences: + primary: shoot + secondary: plant + tertiary: plant + RequiresCondition: !onwater && !parachute && !being-warped && !reapersnare + WithInfantryBody@Swim: + StandSequences: swimidle + DefaultAttackSequence: swim + MoveSequence: swim + RequiresCondition: !being-warped && onwater + WithDeathAnimation: + RequiresCondition: !onwater + WithDeathAnimation@Water: + RequiresCondition: onwater + UseDeathTypeSuffix: False + FallbackSequence: splash + CrushedSequence: die-crushed + DeathSequence: splash + WithDecoration@COMMANDOSKULL: + Sequence: pip-seal + Encyclopedia: + Category: Allies/Infantry + EncyclopediaExtras: + Subfaction: usa + +ENLI: + Inherits: ^Cyborg + Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove + Inherits@EMP: ^EmpDisable + Inherits@chrono: ^Chronoshiftable + Inherits@C4Plantable: ^C4Plantable + Inherits@HeavyArmor: ^HeavyArmor + RenderSprites: + Buildable: + Queue: InfantrySQ, InfantryMQ, CyborgMQ + BuildAtProductionType: Cyborg + BuildPaletteOrder: 230 + IconPalette: chrometd + Prerequisites: ~infantry.nod, tmpp, covenant.level3, ~zeal.covenant, ~techlevel.high + Description: Heavy cyborg infantry unit armed with a particle cannon. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor + Weaknesses: • Weak vs Infantry\n• Cannot attack Aircraft + Attributes: • Heals on Tiberium\n• Damage scales with the max health of the target\n• Special Ability: EMP Blast + Valued: + Cost: 1000 + Tooltip: + Name: Enlightened + -TakeCover: + -Crushable: + -KillsSelf@Immolate: + Targetable: + TargetTypes: Ground, Vehicle + -Targetable@HEAL: + Targetable@REPAIR: + RequiresCondition: damaged && !parachute && !being-warped && !repair-cooldown + TargetTypes: Repairable + UpdatesPlayerStatistics: + AddToArmyValue: true + Health: + HP: 30000 + Mobile: + Speed: 54 + Voice: Move + PauseOnCondition: being-warped || empdisable + AttackFrontal: + Voice: Attack + PauseOnCondition: being-warped || empdisable + FacingTolerance: 0 + AttackMove: + Voice: Move + Passenger: + Voice: Move + Guard: + Voice: Move + Voiced: + VoiceSet: EnlightenedVoice + Armament@PRIMARY: + Weapon: EnlightenedBeam + LocalOffset: 300,0,300 + PauseOnCondition: emp-attack || emp-fired + Armament@SECONDARY: + Name: secondary + Weapon: EnlightenedEmp + LocalOffset: 300,0,300 + PauseOnCondition: !emp-attack + Armament@BATF: + Name: batf + Weapon: EnlightenedBeam + ProducibleWithLevel: + Prerequisites: barracks.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: barracks.upgraded + WithInfantryBody: + DefaultAttackSequence: shoot + IdleSequences: idle, idle2 + StandSequences: stand, stand2 + RequiresCondition: !parachute && !being-warped && !reapersnare && !empdisable + MinIdleDelay: 75 + MaxIdleDelay: 375 + WithInfantryBody@Warped: + RequiresCondition: being-warped || empdisable + GrantConditionOnHealingReceived@REPAIRCOOLDOWN: + Condition: repair-cooldown + RequiredHealing: 85000 + StackDuration: 1000 + MinimumHealing: 2500 + DamageTypes: DirectRepair + ShowSelectionBar: true + TargetedAttackAbility: + ActiveCondition: emp-attack + ArmamentNames: secondary + CircleColor: b2b2e888 + Type: EnlightenedEmp + TargetModifiedCursor: ability2 + GrantConditionOnAttack@EMPCOOLDOWN: + Condition: emp-fired + RevokeDelay: 30 + ArmamentNames: secondary + AmmoPool: + Armaments: secondary + Ammo: 1 + ReloadAmmoPoolCA: + Delay: 500 # equal to reload time of weapon + Count: 1 + ShowSelectionBar: true + SelectionBarColor: b8afff + Encyclopedia: + Category: Nod/Infantry + EncyclopediaExtras: + AdditionalInfo: Requires Zeal Covenant. + +^MortarInfantryBase: + Inherits: ^Soldier + Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove + Buildable: + Queue: InfantrySQ, InfantryMQ + BuildAtProductionType: Soldier + TooltipExtras: + Strengths: • Strong vs Infantry, Buildings + Weaknesses: • Weak vs Heavy Armor\n• Cannot attack Aircraft\n• Has difficulty hitting moving targets + Valued: + Cost: 350 + UpdatesPlayerStatistics: + AddToArmyValue: true + Health: + HP: 3500 + Armament@PRIMARY: + Weapon: ChemicalMortar + LocalOffset: 200,0,155 + FireDelay: 15 + Armament@BATF: + Name: batf + Weapon: ChemicalMortar + FireDelay: 15 + AttackFrontal: + TargetFrozenActors: True + PauseOnCondition: being-warped || blinded || reapersnare + FacingTolerance: 0 + WithInfantryBody: + DefaultAttackSequence: throw + ProducibleWithLevel: + Prerequisites: barracks.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: barracks.upgraded + Encyclopedia: + Category: Nod/Stolen Technology + +MORT.Cryo: + Inherits: ^MortarInfantryBase + Inherits@InfiltratorStolenTech: ^InfiltratorStolenTech + RenderSprites: + Image: mortcryo + Buildable: + BuildPaletteOrder: 250 + Prerequisites: ~stolentech.tent + Description: Infantry armed with a Cryo Mortar. + TooltipExtras: + Attributes: • Slows enemy movement and increases damage taken + Tooltip: + Name: Cryo Mortar + Armament@PRIMARY: + Weapon: CryoMortar + Armament@BATF: + Weapon: CryoMortar + EncyclopediaExtras: + AdditionalInfo: Stolen from Allied Barracks. + +CDOG: + Inherits: DOG + Inherits@InfiltratorStolenTech: ^InfiltratorStolenTech + Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove + Buildable: + Queue: InfantrySQ, InfantryMQ + BuildAtProductionType: Soldier + BuildPaletteOrder: 251 + Prerequisites: ~stolentech.barr + Description: Melee anti-infantry scout unit. + Valued: + Cost: 400 + Mobile: + Speed: 100 + Tooltip: + Name: Cyberdog + Armor: + Type: Light + Health: + HP: 14000 + Voiced: + VoiceSet: CyberdogVoice + Armament: + Weapon: CyberdogJaw + GrantConditionOnAttack: + RevokeDelay: 25 + Targetable@Cyborg: + TargetTypes: Cyborg + RequiresCondition: !parachute && !being-warped + Targetable@HealableCyborg: + RequiresCondition: !parachute && !being-warped && damaged + TargetTypes: HealableCyborg + Encyclopedia: + Category: Nod/Stolen Technology + EncyclopediaExtras: + AdditionalInfo: Stolen from Soviet Barracks. + -KeepsDistance: + -GuardsSelection: + +MORT.Sonic: + Inherits: ^MortarInfantryBase + Inherits@InfiltratorStolenTech: ^InfiltratorStolenTech + RenderSprites: + Image: mortsonic + Buildable: + BuildPaletteOrder: 252 + Prerequisites: ~stolentech.pyle + Description: Infantry armed with a Sonic Mortar. + Tooltip: + Name: Sonic Mortar + TooltipExtras: + Strengths: • Strong vs Defenses, Buildings + Attributes: • Slows enemy movement and rate of fire + Armament@PRIMARY: + Weapon: SonicMortar + Armament@BATF: + Weapon: SonicMortar + EncyclopediaExtras: + AdditionalInfo: Stolen from GDI Barracks. + +MORT.Chem: + Inherits: ^MortarInfantryBase + Inherits@InfiltratorStolenTech: ^InfiltratorStolenTech + RenderSprites: + Image: mortchem + Buildable: + BuildPaletteOrder: 253 + Prerequisites: ~stolentech.hand + Description: Infantry armed with a Chemical Mortar, delivering a corrosive payload which is particularly effective against cyborgs. + Tooltip: + Name: Chemical Mortar + FireWarheadsOnDeath: + Weapon: UnitExplodeChemSmall + EmptyWeapon: UnitExplodeChemSmall + Chance: 33 + RequiresCondition: !being-warped + EncyclopediaExtras: + AdditionalInfo: Stolen from Hand of Nod. + +CSCR: + Inherits: ^Cyborg + Inherits@ScrinUnitPalette: ^ScrinUnitPalette + Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove + Inherits@InfiltratorStolenTech: ^InfiltratorStolenTech + Buildable: + Queue: InfantrySQ, InfantryMQ + BuildAtProductionType: Soldier + BuildPaletteOrder: 254 + Prerequisites: ~stolentech.port + IconPalette: chromes + Description: Fast moving anti-personnel infantry. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor + Weaknesses: • Weak vs Heavy Armor, Buildings, Defenses\n• Cannot attack Aircraft + Attributes: • Heals rapidly on Tiberium + Valued: + Cost: 500 + Tooltip: + Name: Cyberscrin + UpdatesPlayerStatistics: + AddToArmyValue: true + Health: + HP: 16000 + Mobile: + Speed: 77 + Armament@PRIMARY: + Weapon: CyberscrinLaser + LocalOffset: 200,0,350 + MuzzleSequence: muzzle + MuzzlePalette: caneon + Armament@BATF: + Name: batf + Weapon: CyberscrinLaser + WithMuzzleOverlay: + AttackFrontal: + PauseOnCondition: being-warped || blinded || reapersnare + FacingTolerance: 0 + ProducibleWithLevel: + Prerequisites: barracks.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: barracks.upgraded + WithInfantryBody: + IdleSequences: idle1, idle2, idle3, idle4 + DefaultAttackSequence: shoot + WithDeathAnimation: + DeathSequencePalette: playerscrin + CrushedSequencePalette: playerscrin + -TakeCover: + Voiced: + VoiceSet: CyberscrinVoice + Encyclopedia: + Category: Nod/Stolen Technology + EncyclopediaExtras: + AdditionalInfo: Stolen from Scrin Portal. + ChangesHealth@THEAL: + PercentageStep: 3 + +CMSR: + Inherits: ^Soldier + Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove + Inherits@Inspirable: ^Inspirable + Buildable: + Queue: InfantrySQ, InfantryMQ + BuildAtProductionType: Soldier + BuildPaletteOrder: 140 + Prerequisites: stek, ~barr, ~techlevel.high + Description: Leads regular infantry into battle, motivating them to move faster and fight harder. + TooltipExtras: + Strengths: • Strong vs Infantry + Weaknesses: • Weak vs Light Armor, Heavy Armor, Defenses, Buildings\n• Cannot attack Aircraft + Attributes: • Increases speed and rate of fire of nearby basic infantry\n• Detects cloaked units and spies + Valued: + Cost: 800 + Tooltip: + Name: Commissar + UpdatesPlayerStatistics: + AddToArmyValue: true + Health: + HP: 12000 + Mobile: + Voice: Move + AttackMove: + Voice: Move + Passenger: + Voice: Move + Guard: + Voice: Move + Voiced: + VoiceSet: CommissarVoice + RevealsShroud: + Range: 6c0 + Armament@PRIMARY: + Weapon: CommissarPistol + Armament@BATF: + Name: batf + Weapon: CommissarPistol + MuzzleSequence: garrison-muzzle + WithInfantryBody: + DefaultAttackSequence: shoot + IdleSequences: idle1,idle2 + AttackFrontal: + Voice: Attack + PauseOnCondition: being-warped || blinded || reapersnare + FacingTolerance: 0 + ProducibleWithLevel: + Prerequisites: barracks.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: barracks.upgraded + ProximityExternalCondition@Inspiration: + Range: 7c0 + Condition: cmsr-inspiration + ValidRelationships: Ally + AffectsParent: true + RequiresCondition: !passenger + WithDecoration@CMSRPIP: + Image: pips + Sequence: pip-cmsr + Palette: effect + Position: TopLeft + ValidRelationships: Ally, Enemy, Neutral + WithRadiatingCircle: + EndRadius: 7c0 + Interval: 75 + Duration: 50 + ValidRelationships: Ally + AlwaysShowMaxRange: true + IgnoresDisguise: + DetectCloaked: + DetectionTypes: Cloak, AirCloak + Range: 5c0 + Encyclopedia: + Category: Soviets/Infantry + +ZTRP: + Inherits: ^Soldier + Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove + Inherits@HEALINGCOOLDOWN: ^HealingCooldown + Buildable: + Queue: InfantrySQ, InfantryMQ + BuildAtProductionType: Soldier + BuildPaletteOrder: 150 + Prerequisites: ~pyle, gtek, ~bombard.strat, ~techlevel.high + Description: Elite infantry armed with a railgun and equipped with a jump-pack. + IconPalette: chrometd + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor, Defenses + Weaknesses: • Weak vs Infantry, Buildings\n• Cannot attack Aircraft + Attributes: • Special Ability: Jump-Pack + Valued: + Cost: 700 + Tooltip: + Name: Zone Trooper + UpdatesPlayerStatistics: + AddToArmyValue: true + Health: + HP: 16000 + Armor: + Type: None + Mobile: + Voice: Move + RevealsShroud: + Range: 6c0 + Armament@PRIMARY: + Weapon: ZoneTrooperRailgun + LocalOffset: 350,0,300 + Armament@BATF: + Name: batf + Weapon: ZoneTrooperRailgun + AttackFrontal: + Voice: Attack + PauseOnCondition: being-warped || blinded || reapersnare + FacingTolerance: 0 + AttackMove: + Voice: Move + Passenger: + Voice: Move + Guard: + Voice: Move + Voiced: + VoiceSet: ZoneTrooperVoice + ProducibleWithLevel: + Prerequisites: barracks.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: barracks.upgraded + Crushable: + CrushClasses: heavyinfantry + TakeCover: + ProneOffset: 0,0,0 + ProneSequencePrefix: + WithInfantryBody: + IdleSequences: idle, idle2 + StandSequences: stand, stand2 + DefaultAttackSequence: shoot + RequiresCondition: !jumping && !parachute && !being-warped && !reapersnare + WithInfantryBody@Jump: + StandSequences: jump + MoveSequence: jump + RequiresCondition: !being-warped && jumping + -GrantConditionOnTerrain@ONTIB: + -GrantStackingCondition@TIBEXPOSED: + -DamagedByTerrain@TIBDAMAGE: + TargetedLeapAbility: + TakeOffSounds: ztrp-jump1.aud, ztrp-jump2.aud + LandingSounds: ztrp-land1.aud, ztrp-land2.aud + LeapCondition: jumping + ShowSelectionBarWhenFull: false + ChargeDelay: 250 + SelectionBarColor: ffaa00 + CircleColor: ffaa0077 + MaxDistance: 7 + Speed: 175 + RequiresCondition: !being-warped && !reapersnare + Contrail@Jumping: + Offset: -30,0,350 + StartColorUsePlayerColor: false + ZOffset: -128 + StartColor: ff990090 + StartColorAlpha: 128 + TrailLength: 12 + RequiresCondition: jumping + WithShadow@Jump: + RequiresCondition: jumping + Targetable@Jump: + RequiresCondition: jumping && !being-warped + TargetTypes: AirSmall + Targetable@TEMPORAL: + TargetTypes: Temporal + RequiresCondition: !jumping + DamageMultiplier@Jumping: + Modifier: 50 + RequiresCondition: jumping + Encyclopedia: + Category: GDI/Infantry + EncyclopediaExtras: + AdditionalInfo: Requires Bombardment Strategy. + +ZRAI: + Inherits: ZTRP + Buildable: + Prerequisites: ~pyle, gtek, ~seek.strat, ~techlevel.high + Description: Elite infantry armed with a sonic grenade launcher and equipped with a jump-pack. + BuildPaletteOrder: 151 + Tooltip: + Name: Zone Raider + TooltipExtras: + Strengths: • Strong vs Light Armor, Buildings + Weaknesses: • Cannot attack Aircraft + Attributes: • Shots reduce enemy movement and rate of fire\n• Special Ability: Jump-Pack + Armament@PRIMARY: + Weapon: ZoneRaiderGrenade + LocalOffset: 350,0,300 + Armament@BATF: + Name: batf + Weapon: ZoneRaiderGrenade + Voiced: + VoiceSet: ZoneRaiderVoice + Health: + HP: 14000 + Mobile: + Speed: 60 + TargetedLeapAbility: + MaxDistance: 10 + Speed: 200 + EncyclopediaExtras: + AdditionalInfo: Requires Seek & Destroy Strategy. + +ZDEF: + Inherits: ZTRP + Buildable: + Prerequisites: ~pyle, gtek, ~hold.strat, ~techlevel.high + Description: Elite infantry armed with an ion rifle and an ability which shields nearby infantry. + BuildPaletteOrder: 152 + Tooltip: + Name: Zone Defender + TooltipExtras: + Attributes: • Special Ability: Defense Matrix + Armament@PRIMARY: + Weapon: ZoneDefenderGun + LocalOffset: 350,0,300 + Armament@BATF: + Name: batf + Weapon: ZoneDefenderGun + Voiced: + VoiceSet: ZoneDefenderVoice + Health: + HP: 20000 + -TargetedLeapAbility: + -Contrail@Jumping: + -WithShadow@Jump: + -Targetable@Jump: + -DamageMultiplier@Jumping: + WithInfantryBody: + RequiresCondition: !parachute && !being-warped && !reapersnare + -WithInfantryBody@Jump: + Targetable@TEMPORAL: + -RequiresCondition: + GrantTimedConditionOnDeploy@ZoneDefenderShield: + DeployedCondition: shield-active + ShowSelectionBar: true + StartsFullyCharged: true + DeployedTicks: 200 + CooldownTicks: 750 + ShowSelectionBarWhenFull: false + ChargingColor: 808080 + DischargingColor: 00eecc + DeploySound: zdef-shield.aud + UndeploySound: gshielddown.aud + Voice: Shield + Instant: true + WithRadiatingCircle@ZoneDefenderShield: + EndRadius: 2c0 + Color: 00eecc10 + MaxRadiusColor: 00eecc66 + MaxRadiusFlashColor: 00eecc66 + Interval: 25 + Duration: 50 + ValidRelationships: Ally + AlwaysShowMaxRange: true + RequiresCondition: shield-active + ProximityExternalCondition@ZoneDefenderShield: + Range: 2c0 + Condition: zdef-shield + ValidRelationships: Ally + RequiresCondition: shield-active && !passenger + AffectsParent: true + EncyclopediaExtras: + AdditionalInfo: Requires Hold the Line Strategy. + +ENFO: + Inherits: ^Soldier + Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove + Inherits@HEALINGCOOLDOWN: ^HealingCooldown + Buildable: + Queue: InfantrySQ, InfantryMQ + BuildAtProductionType: Soldier + BuildPaletteOrder: 130 + Prerequisites: ~tent, alhq, ~techlevel.high + Description: Durable short-range front-line infantry. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor + Weaknesses: • Weak vs Heavy Armor, Defenses\n• Cannot attack Aircraft + Attributes: • Deals damage in a cone\n• Damage falls off with distance + Valued: + Cost: 650 + Tooltip: + Name: Enforcer + UpdatesPlayerStatistics: + AddToArmyValue: true + Health: + HP: 25000 + Armor: + Type: Light + Mobile: + Voice: Move + RevealsShroud: + Range: 6c0 + Armament@PRIMARY: + Weapon: EnforcerShotgun + LocalOffset: 0,0,341 + Armament@BATF: + Name: batf + Weapon: EnforcerShotgun + AttackFrontalCharged: + Voice: Attack + FacingTolerance: 32 + ChargeLevel: 0,2 + PauseOnCondition: being-warped || blinded || reapersnare + AttackMove: + Voice: Move + Passenger: + Voice: Move + Guard: + Voice: Move + Voiced: + VoiceSet: EnforcerVoice + ProducibleWithLevel: + Prerequisites: barracks.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: barracks.upgraded + -Crushable: + TakeCover: + ProneOffset: 0,0,0 + ProneSequencePrefix: + SpeedModifier: 100 + WithInfantryBody: + IdleSequences: idle, idle2 + StandSequences: stand, stand2 + DefaultAttackSequence: shoot + ReplacedInQueue: + Actors: hopl + GrantConditionOnHealingReceived@HEALINGCOOLDOWN: + RequiredHealing: 20000 + Encyclopedia: + Category: Allies/Infantry + +HOPL: + Inherits: ^Soldier + Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove + Inherits@HEALINGCOOLDOWN: ^HealingCooldown + Buildable: + Queue: InfantrySQ, InfantryMQ + BuildAtProductionType: Soldier + BuildPaletteOrder: 132 + Prerequisites: ~tent, alhq, ~greece.coalition, ~techlevel.high + Description: Elite infantry armed with a prism rifle which periodically fires charged shots to blind enemies. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor + Weaknesses: • Weak vs Heavy Armor, Defenses\n• Cannot attack Aircraft + Attributes: • One in every four shots blinds the target + Valued: + Cost: 650 + Tooltip: + Name: Hoplite + UpdatesPlayerStatistics: + AddToArmyValue: true + Health: + HP: 10000 + Armor: + Type: None + Mobile: + Voice: Move + RevealsShroud: + Range: 6c0 + Armament@PRIMARY: + Weapon: HopliteGunCharged + LocalOffset: 350,40,341 + PauseOnCondition: recharge || secondary-reloading + ReloadingCondition: primary-reloading + Armament@SECONDARY: + Name: secondary + Weapon: HopliteGun + LocalOffset: 350,0,341 + PauseOnCondition: !recharge || primary-reloading || charged-fired + ReloadingCondition: secondary-reloading + # to prevent moving forward while real weapons are paused + Armament@Targeter: + Name: tertiary + Weapon: HopliteTargeter + LocalOffset: 350,0,341 + Armament@BATF: + Name: batf + Weapon: HopliteGunBATF + AttackFrontalCharged: + Voice: Attack + FacingTolerance: 32 + ChargeLevel: 0,2 + PauseOnCondition: being-warped || blinded || reapersnare + Armaments: primary, secondary, tertiary + ChargeConsumingArmaments: primary, secondary + AttackMove: + Voice: Move + Passenger: + Voice: Move + Guard: + Voice: Move + Voiced: + VoiceSet: HopliteVoice + ProducibleWithLevel: + Prerequisites: barracks.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: barracks.upgraded + TakeCover: + ProneOffset: 0,0,0 + ProneSequencePrefix: + WithInfantryBody: + IdleSequences: idle, idle2 + StandSequences: stand, stand2 + DefaultAttackSequence: shoot + GrantConditionOnAttack@Charge: + Condition: recharge + ArmamentNames: primary, secondary + RevokeDelay: 225 + MaximumInstances: 3 + IsCyclic: true + RevokeAll: true + GrantConditionOnAttack@ChargedFired: + Condition: charged-fired + ArmamentNames: primary + RevokeDelay: 1 + Encyclopedia: + Category: Allies/Infantry + EncyclopediaExtras: + AdditionalInfo: Requires Greece Coalition. + +TIGR: + Inherits: ^Soldier + Inherits@AUTOTARGET: ^AutoTargetAllAssaultMove + Inherits@HEALINGCOOLDOWN: ^HealingCooldown + Buildable: + Queue: InfantrySQ, InfantryMQ + BuildAtProductionType: Soldier + BuildPaletteOrder: 132 + Prerequisites: ~tent, alhq, ~korea.coalition, ~techlevel.high + Description: Elite infantry with a long range rocket launcher. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor, Aircraft + Weaknesses: • Weak vs Infantry, Defenses, Buildings\n• Cannot acquire targets at close range + Attributes: • Missile reduces enemy weapon range and vision + Valued: + Cost: 650 + Tooltip: + Name: Tiger Guard + UpdatesPlayerStatistics: + AddToArmyValue: true + Health: + HP: 8000 + Armor: + Type: None + Mobile: + Voice: Move + RevealsShroud: + Range: 6c0 + Armament@PRIMARY: + Weapon: TigerGuardMissileAA + LocalOffset: 427,0,341 + Armament@SECONDARY: + Name: secondary + Weapon: TigerGuardMissile + LocalOffset: 427,0,341 + Armament@BATF: + Name: batf + Weapon: TigerGuardMissileBATF + AttackFrontalCharged: + Voice: Attack + FacingTolerance: 32 + ChargeLevel: 0,2 + PauseOnCondition: being-warped || blinded || reapersnare + TargetFrozenActors: true + AttackMove: + Voice: Move + AutoTargetPriority@HeavyPrio: + ValidTargets: Heavy + InvalidTargets: NoAutoTarget + Priority: 10 + Passenger: + Voice: Move + Guard: + Voice: Move + Voiced: + VoiceSet: TigerGuardVoice + ProducibleWithLevel: + Prerequisites: barracks.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: barracks.upgraded + TakeCover: + ProneOffset: 0,0,0 + ProneSequencePrefix: + WithInfantryBody: + IdleSequences: idle, idle2 + StandSequences: stand, stand2 + DefaultAttackSequence: shoot + Encyclopedia: + Category: Allies/Infantry + EncyclopediaExtras: + AdditionalInfo: Requires Korea Coalition. + +CRYT: + Inherits: ^Soldier + Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove + Inherits@HEALINGCOOLDOWN: ^HealingCooldown + Buildable: + Queue: InfantrySQ, InfantryMQ + BuildAtProductionType: Soldier + BuildPaletteOrder: 132 + Prerequisites: ~tent, alhq, ~sweden.coalition, ~techlevel.high + Description: Elite infantry armed with a cryo sprayer. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor + Weaknesses: • Weak vs Buildings, Defenses\n• Cannot attack Aircraft + Attributes: • Slows enemy units and makes them take increased damage + Valued: + Cost: 700 + Tooltip: + Name: Cryo Trooper + UpdatesPlayerStatistics: + AddToArmyValue: true + Health: + HP: 15000 + Mobile: + Speed: 60 + Voice: Move + RevealsShroud: + Range: 6c0 + Armament@PRIMARY: + Weapon: CryoSprayer + LocalOffset: 341,0,341 + Armament@BATF: + Name: batf-cryt + Weapon: CryoSprayer + AttackFrontal: + Voice: Attack + PauseOnCondition: being-warped || blinded || reapersnare + FacingTolerance: 0 + AttackMove: + Voice: Move + Passenger: + Voice: Move + Guard: + Voice: Move + Voiced: + VoiceSet: CryoTrooperVoice + ProducibleWithLevel: + Prerequisites: barracks.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: barracks.upgraded + Crushable: + CrushClasses: heavyinfantry + TakeCover: + ProneOffset: 0,0,0 + ProneSequencePrefix: + WithInfantryBody: + IdleSequences: idle, idle2 + StandSequences: stand, stand2 + DefaultAttackSequence: shoot + WithDecoration@BINO: + -BlinkPatterns: + AmbientSoundCA: + SoundFiles: cryobeam.aud + InitialSound: cryobeamstart.aud + FinalSound: cryobeamend.aud + RequiresCondition: attacking + InitialSoundLength: 10 + GrantConditionOnAttackCA: + Condition: attacking + RevokeDelay: 6 + Encyclopedia: + Category: Allies/Infantry + EncyclopediaExtras: + AdditionalInfo: Requires Sweden Coalition. + +REAP: + Inherits: ^Cyborg + Inherits@AUTOTARGET: ^AutoTargetAllAssaultMovePrioritizeGround + Inherits@EMP: ^EmpDisable + Inherits@chrono: ^Chronoshiftable + Inherits@C4Plantable: ^C4Plantable + Inherits@HeavyArmor: ^HeavyArmor + RenderSprites: + Buildable: + Queue: InfantrySQ, InfantryMQ, CyborgMQ + BuildAtProductionType: Cyborg + BuildPaletteOrder: 231 + IconPalette: chrometd + Prerequisites: ~infantry.nod, tmpp, covenant.level3, ~unity.covenant, ~techlevel.high + Description: Heavy cyborg with dual missile launchers and an infantry incapacitating grenade launcher. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor, Buildings + Weaknesses: • Weak vs Heavy Armor + Attributes: • Heals on Tiberium\n• Special Ability: Inhibitor Grenade + Selectable: + DecorationBounds: 640, 896, -32, -256 + Valued: + Cost: 1000 + Tooltip: + Name: Cyborg Reaper + -TakeCover: + -Crushable: + -KillsSelf@Immolate: + Targetable: + TargetTypes: Ground, Vehicle + -Targetable@HEAL: + Targetable@REPAIR: + RequiresCondition: damaged && !parachute && !being-warped && !repair-cooldown + TargetTypes: Repairable + UpdatesPlayerStatistics: + AddToArmyValue: true + Health: + HP: 30000 + Mobile: + Speed: 60 + Voice: Move + PauseOnCondition: being-warped || empdisable + AttackFrontal: + Voice: Attack + PauseOnCondition: being-warped || empdisable + FacingTolerance: 0 + AttackMove: + Voice: Move + Passenger: + Voice: Move + Guard: + Voice: Move + Voiced: + VoiceSet: ReaperVoice + Armament@PRIMARY: + Weapon: CyborgReaperMissiles + LocalOffset: 150,150,500, 150,-150,500 + PauseOnCondition: snare-attack || snare-fired + MuzzleSequence: muzzle + Armament@PRIMARYAA: + Weapon: CyborgReaperMissilesAA + LocalOffset: 150,150,500, 150,-150,500 + PauseOnCondition: snare-attack || snare-fired + MuzzleSequence: muzzle + Armament@SECONDARY: + Name: secondary + Weapon: CyborgReaperSnare + LocalOffset: 0,150,700 + PauseOnCondition: !snare-attack + MuzzleSequence: muzzle + WithMuzzleOverlay: + ProducibleWithLevel: + Prerequisites: barracks.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: barracks.upgraded + WithInfantryBody: + -IdleSequences: + DefaultAttackSequence: shoot + StandSequences: stand, stand2 + RequiresCondition: !parachute && !being-warped && !reapersnare && !empdisable + WithInfantryBody@Warped: + RequiresCondition: being-warped || empdisable + WithDeathAnimation: + -DeathTypes: + UseDeathTypeSuffix: false + -CrushedSequence: + GrantConditionOnHealingReceived@REPAIRCOOLDOWN: + Condition: repair-cooldown + RequiredHealing: 85000 + StackDuration: 1000 + MinimumHealing: 2500 + DamageTypes: DirectRepair + ShowSelectionBar: true + FireWarheadsOnDeath: + Weapon: UnitExplodeSmall + EmptyWeapon: UnitExplodeSmall + RequiresCondition: !being-warped + TargetedAttackAbility: + ActiveCondition: snare-attack + ArmamentNames: secondary + CircleColor: 00cc0088 + Type: ReaperSnare + TargetModifiedCursor: ability2 + GrantConditionOnAttack@SnareCooldown: + Condition: snare-fired + RevokeDelay: 30 + ArmamentNames: secondary + AmmoPool: + Armaments: secondary + Ammo: 1 + ReloadAmmoPoolCA: + Delay: 375 # equal to reload time of weapon + Count: 1 + ShowSelectionBar: true + SelectionBarColor: 00cc00 + Encyclopedia: + Category: Nod/Infantry + EncyclopediaExtras: + AdditionalInfo: Requires Unity Covenant. diff --git a/mods/ca/rules/misc.yaml b/mods/ca/rules/misc.yaml index f0b9cc3078..2011e131bb 100644 --- a/mods/ca/rules/misc.yaml +++ b/mods/ca/rules/misc.yaml @@ -1,5 +1,6 @@ MINV: Inherits: ^Mine + Inherits@1: ^1x1Shape RenderSprites: Image: minv FactionImages: @@ -8,29 +9,35 @@ MINV: ukraine: minp iraq: minp GrantConditionOnFaction@Soviets: - Factions: russia, ukraine, iraq + Factions: soviet, russia, ukraine, iraq, yuri Condition: soviet - Explodes@Allies: + FireWarheadsOnDeath@Allies: Weapon: ATMine - RequiresCondition: !soviet - Explodes@Soviet: + RequiresCondition: !soviet && !defused + FireWarheadsOnDeath@Soviet: Weapon: APMine - RequiresCondition: soviet + RequiresCondition: soviet && !defused + ExternalCondition@DEFUSED: + Condition: defused + Interactable: + DecorationBounds: 896, 896 + WithColoredSelectionBox@PlayerColorBox: + ColorSource: Player + HitShape: + TargetableOffsets: -256,256,0, -256,-256,0, 256,-256,0, 256,256,0 + +MINVS: + Inherits: MINV # Only kept for backwards-compatibility with existing and imported maps, use MINV instead MINP: Inherits: MINV - Explodes: + FireWarheadsOnDeath: Weapon: APMine -MINVS: - Inherits: ^Mine - Explodes: - Weapon: ATMine - MINS: Inherits: ^Mine - Explodes: + FireWarheadsOnDeath: Weapon: ATMine PROXYMINESPAWN: @@ -38,7 +45,7 @@ PROXYMINESPAWN: RenderSprites: Image: empty Interactable: - Bounds: 24,24 + Bounds: 1024, 1024 WithSpriteBody: HiddenUnderFog: Health: @@ -93,20 +100,30 @@ CRATE: MaxAmount: 5 MinAmount: 1 MaxDuplicateValue: 1500 - GiveMcvCrateAction@RA: + GiveBaseBuilderCrateAction@RA: SelectionShares: 0 NoBaseSelectionShares: 100 - ValidFactions: allies, england, france, germany, soviet, russia, ukraine, iraq + ValidFactions: allies, england, france, germany, usa, soviet, russia, ukraine, iraq, yuri Units: mcv - GiveMcvCrateAction@TD: + GiveBaseBuilderCrateAction@TD: SelectionShares: 0 NoBaseSelectionShares: 100 ValidFactions: gdi, talon, zocom, eagle, arc, nod, blackh, marked, legion, shadow Units: amcv + GiveBaseBuilderCrateAction@Scrin: + SelectionShares: 0 + NoBaseSelectionShares: 100 + ValidFactions: scrin, reaper, travel, harbinger, collector + Units: smcv GiveUnitCrateAction@jeep: SelectionShares: 7 Units: jeep - ValidFactions: allies, england, france, germany + ValidFactions: allies, england, france, germany, usa + Prerequisites: techlevel.low + GiveUnitCrateAction@btr: + SelectionShares: 7 + Units: btr + ValidFactions: soviet, russia, ukraine, iraq, yuri Prerequisites: techlevel.low GiveUnitCrateAction@hmmv: SelectionShares: 7 @@ -118,63 +135,97 @@ CRATE: Units: bggy ValidFactions: nod, marked, blackh, legion, shadow Prerequisites: techlevel.low + GiveUnitCrateAction@gunw: + SelectionShares: 7 + Units: gunw + ValidFactions: scrin, reaper, travel, harbinger, collector + Prerequisites: techlevel.low GiveUnitCrateAction@arty: SelectionShares: 6 Units: arty - ValidFactions: allies, england, france, germany, nod, blackh, marked, legion, shadow - Prerequisites: techlevel.medium, radar + ValidFactions: allies, england, france, germany, usa, nod, blackh, marked, legion, shadow + Prerequisites: techlevel.medium, anyradar GiveUnitCrateAction@v2rl: SelectionShares: 6 Units: v2rl ValidFactions: soviet, russia, ukraine, iraq, yuri - Prerequisites: techlevel.medium, radar + Prerequisites: techlevel.medium, anyradar GiveUnitCrateAction@msam: SelectionShares: 6 Units: msam ValidFactions: gdi, talon, zocom, eagle, arc - Prerequisites: techlevel.medium, radar - GiveUnitCrateAction@mtnk: - SelectionShares: 5 - Units: mtnk - ValidFactions: gdi, talon, zocom, eagle, arc, nod, blackh, marked, legion, shadow - Prerequisites: techlevel.medium + Prerequisites: techlevel.medium, anyradar + GiveUnitCrateAction@corr: + SelectionShares: 6 + Units: corr + ValidFactions: scrin, reaper, travel, harbinger, collector + Prerequisites: techlevel.medium, anyradar GiveUnitCrateAction@2tnk: SelectionShares: 4 Units: 2tnk - ValidFactions: allies, england, france, germany + ValidFactions: allies, england, france, germany, usa Prerequisites: techlevel.medium GiveUnitCrateAction@3tnk: SelectionShares: 4 Units: 3tnk ValidFactions: soviet, russia, ukraine, iraq, yuri Prerequisites: techlevel.medium + GiveUnitCrateAction@mtnk: + SelectionShares: 5 + Units: mtnk + ValidFactions: gdi, talon, zocom, eagle, arc, legion + Prerequisites: techlevel.medium + GiveUnitCrateAction@ltnk: + SelectionShares: 5 + Units: ltnk + ValidFactions: nod, blackh, marked, shadow + Prerequisites: techlevel.medium + GiveUnitCrateAction@intl: + SelectionShares: 5 + Units: intl + ValidFactions: scrin, reaper, travel, harbinger, collector + Prerequisites: techlevel.medium + GiveUnitCrateAction@ptnk: + SelectionShares: 3 + Units: ptnk + ValidFactions: allies, england, france, germany, usa + Prerequisites: techlevel.high, techcenter.any GiveUnitCrateAction@4tnk: SelectionShares: 3 Units: 4tnk ValidFactions: soviet, russia, ukraine, iraq, yuri - Prerequisites: techlevel.high, techcenter + Prerequisites: techlevel.high, techcenter.any GiveUnitCrateAction@htnk: SelectionShares: 3 Units: htnk ValidFactions: gdi, talon, zocom, eagle, arc - Prerequisites: techlevel.high, techcenter + Prerequisites: techlevel.high, techcenter.any GiveUnitCrateAction@stnk: SelectionShares: 3 Units: stnk.nod ValidFactions: nod, marked, blackh, legion, shadow - Prerequisites: techlevel.high, techcenter + Prerequisites: techlevel.high, techcenter.any + GiveUnitCrateAction@devo: + SelectionShares: 3 + Units: devo + ValidFactions: scrin, reaper, travel, harbinger, collector + Prerequisites: techlevel.high, techcenter.any GiveUnitCrateAction@squadlight: SelectionShares: 7 Units: e1,e1,e1,e3,e3 - ValidFactions: allies, england, france, germany, soviet, russia, ukraine, iraq + ValidFactions: allies, england, france, germany, usa, soviet, russia, ukraine, iraq, yuri GiveUnitCrateAction@squadlightTD: SelectionShares: 7 Units: n1,n1,n1,n3,n3 ValidFactions: gdi, talon, zocom, eagle, arc, nod, blackh, marked, legion, shadow + GiveUnitCrateAction@squadlightscrin: + SelectionShares: 7 + Units: s1,s1,s1,s3,s3 + ValidFactions: scrin, reaper, travel, harbinger, collector GiveUnitCrateAction@squadheavyallies: SelectionShares: 7 Units: e1,e1,e1,e1,e3,e3,e3,e6,medi - ValidFactions: allies, england, france, germany + ValidFactions: allies, england, france, germany, usa TimeDelay: 4500 GiveUnitCrateAction@squadheavysoviet: SelectionShares: 7 @@ -191,6 +242,11 @@ CRATE: Units: n1,n1,n1,n1,n3,n3,n2,n2 ValidFactions: gdi, talon, zocom, eagle, arc TimeDelay: 4500 + GiveUnitCrateAction@squadheavyscrin: + SelectionShares: 7 + Units: s1,s1,s1,s1,s3,s3,s2,s2 + ValidFactions: scrin, reaper, travel, harbinger, collector + TimeDelay: 4500 GrantExternalConditionCrateAction@invuln: SelectionShares: 5 Sound: ironcur9.aud @@ -224,7 +280,7 @@ MONEYCRATE: GiveCashCrateAction: Amount: 500 SelectionShares: 1 - UseCashTick: true + Sequence: dollar RenderSprites: Image: wcrate @@ -236,6 +292,8 @@ HEALCRATE: Sound: heal2.aud SelectionShares: 1 Sequence: heal + RenderSprites: + Image: hcrate WCRATE: Inherits: ^Crate @@ -249,11 +307,10 @@ SCRATE: Tooltip: Name: Steel Crate -CAMERA: - Interactable: +^CameraBase: + Inherits@DUMMY: ^InvisibleDummy EditorOnlyTooltip: Name: (reveals area to owner) - AlwaysVisible: Immobile: OccupiesSpace: false RevealsShroud: @@ -264,40 +321,51 @@ CAMERA: WithSpriteBody: RenderSpritesEditorOnly: Image: camera + +CAMERA: + Inherits: ^CameraBase MapEditorData: Categories: System +camera.dummy: + Inherits: ^CameraBase + -RevealsShroud: + KillsSelf: + Delay: 25 + +camera.infiltrator: + Inherits: ^CameraBase + KillsSelf: + RemoveInstead: true + Delay: 3000 + camera.paradrop: - Inherits: CAMERA - EditorOnlyTooltip: - Name: (support power proxy camera) + Inherits: ^CameraBase RevealsShroud: Range: 6c0 camera.spyplane: - Inherits: CAMERA - EditorOnlyTooltip: - Name: (support power proxy camera) + Inherits: ^CameraBase camera.sathack: - Inherits: CAMERA + Inherits: ^CameraBase + Interactable: + Bounds: 64, 64 -RenderSpritesEditorOnly: RenderSprites: Image: satscan - EditorOnlyTooltip: - Name: (support power proxy camera) DetectCloaked: Range: 10c0 - CloakTypes: Cloak + DetectionTypes: Cloak camera.satscan: - Inherits: CAMERA + Inherits: ^CameraBase -RevealsShroud: Buildable: Queue: SpySatellite Tooltip: Name: Satellite Scan - RevealsMapCA: + RevealsMap: RevealGeneratedShroud: false RequiresCondition: uplinkavailable ValidRelationships: Ally @@ -318,50 +386,80 @@ camera.satscan: camera.satscan.oneshot: Inherits: camera.satscan - -VoiceAnnouncement@Die: - -KillsSelf: + -VoiceAnnouncement: + VoiceAnnouncement@Die: + Voice: Build KillsSelf: - RemoveInstead: true + Delay: 380 + RevealsMap: + RequiresCondition: animation-complete + GrantDelayedCondition: Delay: 375 + Condition: animation-complete + -GrantConditionOnPrerequisite@UPLINK: camera.hacker: - Inherits: CAMERA + Inherits: ^CameraBase RevealsShroud: - Range: 0c512 + Range: 1c512 KillsSelf: RemoveInstead: true Delay: 50 +camera.decoy: + Inherits: ^CameraBase + RevealsShroud: + Range: 5c0 + KillsSelf: + RemoveInstead: true + Delay: 100 + gps.satellite: - AlwaysVisible: + Inherits@DUMMY: ^InvisibleDummy ProvidesPrerequisite: + Buildable: + Queue: SpySatellite + Tooltip: + Name: GPS Satellite + +gps.satellite.firstscan: + Inherits@DUMMY: ^InvisibleDummy + ProvidesPrerequisite: + Buildable: + Queue: SpySatellite + Tooltip: + Name: GPS Satellite -camera.cloud: +ToxicCloud: Interactable: + ScriptTriggers: EditorOnlyTooltip: Name: (support power) + HiddenUnderFog: + Type: CenterPosition RenderSprites: Image: cloud1 Palette: tseffect-ignore-lighting-alpha75 + # required for death animation + Health: + HP: 1 WithSpriteBody: BodyOrientation: QuantizedFacings: 1 - AlwaysVisible: HitShape: - Mobile: + Aircraft: + CanHover: True Speed: 20 - Locomotor: cloud + CruiseAltitude: 1 + LandableTerrainTypes: Clear,Road,Rough,Ore,Gems,Tiberium,BlueTiberium,BlackTiberium,Water,Tree,River,Rock,Beach,Bridge,Tunnel,Wall,Ford Wanders: WanderMoveRadius: 5 ReduceMoveRadiusDelay: 3 RevealsShroud: - Range: 6c0 - Health: - HP: 30000 - DamagedByTerrain: - Terrain: Clear, Rough, Road, Ore, Water, Gems, River, Tiberium, BlueTiberium - Damage: 500 - DamageInterval: 5 + Range: 2c0 + Type: CenterPosition + KillsSelf: + Delay: 300 DamageTypes: ToxinDeath Hovers: WithDeathAnimation: @@ -373,15 +471,27 @@ camera.cloud: PeriodicExplosion: Weapon: Cloud -camera.cloud2: - Inherits: camera.cloud +ToxicCloud2: + Inherits: ToxicCloud RenderSprites: Image: cloud2 - DamagedByTerrain: - Damage: 300 + KillsSelf: + Delay: 500 -chaos.cloud1: - Inherits: camera.cloud +VirusCloud: + Inherits: ToxicCloud + RenderSprites: + Image: cloud1sm + PeriodicExplosion: + Weapon: VirusCloud + Aircraft: + Speed: 1 + KillsSelf: + Delay: 125 + -WithDeathAnimation: + +ChaosCloud: + Inherits: ToxicCloud RenderSprites: Image: chaoscloud1 Palette: caneon-ignore-lighting-alpha75 @@ -389,11 +499,13 @@ chaos.cloud1: DeathSequencePalette: caneon PeriodicExplosion: Weapon: ChaosCloud - Mobile: + Aircraft: Speed: 10 + KillsSelf: + Delay: 250 -chaos.cloud2: - Inherits: chaos.cloud1 +ChaosCloud2: + Inherits: ChaosCloud RenderSprites: Image: chaoscloud2 @@ -401,10 +513,12 @@ SONAR: Inherits: camera.spyplane -RevealsShroud: DetectCloaked: - CloakTypes: Underwater + DetectionTypes: Underwater Range: 10c0 FLARE: + Interactable: + ScriptTriggers: Immobile: OccupiesSpace: false RevealsShroud: @@ -412,14 +526,13 @@ FLARE: Type: CenterPosition RenderSprites: Image: smokland - Palette: effect + PlayerPalette: player WithSpriteBody: StartSequence: open BodyOrientation: QuantizedFacings: 1 HiddenUnderFog: Type: CenterPosition - Interactable: Tooltip: Name: Flare ShowOwnerRow: false @@ -433,13 +546,23 @@ FLARE.dropzone: Tooltip: Name: Dropzone Flare FreeActorWithDelivery@2: - Actor: APC2.Reinforce - DeliveryOffset: -1,1 + Actor: vulc.reinforce + DeliveryOffset: 0,0 DeliveringActor: ocar.reinforce Facing: 0 + -MapEditorData: + +FLARE.KillZone: + Inherits: FLARE + -RevealsShroud: + KillsSelf: + Delay: 1500 # matches killzone actor + RemoveInstead: true + -MapEditorData: MINE: Inherits@1: ^SpriteActor + Inherits@ResourceNode: ^ResourceNode Interactable: HiddenUnderShroud: Tooltip: @@ -456,14 +579,19 @@ MINE: AppearsOnMapPreview: Terrain: Ore SeedsResourceCA: - Interval: 75 + Interval: 66 MapEditorData: Categories: Resource spawn RequiresSpecificOwners: ValidOwnerNames: Neutral + ProximityExternalCondition@ONORE: + Condition: on-ore + Range: 4c0 + ValidRelationships: Ally, Neutral, Enemy GMINE: Inherits@1: ^SpriteActor + Inherits@ResourceNode: ^ResourceNode Interactable: HiddenUnderShroud: Tooltip: @@ -481,10 +609,15 @@ GMINE: Terrain: Gems SeedsResourceCA: ResourceType: Gems + Interval: 66 MapEditorData: Categories: Resource spawn RequiresSpecificOwners: ValidOwnerNames: Neutral + ProximityExternalCondition@ONGEMS: + Condition: on-gems + Range: 4c0 + ValidRelationships: Ally, Neutral, Enemy RAILMINE: Inherits@1: ^SpriteActor @@ -544,11 +677,11 @@ LAR2: Name: Ant Larvae powerproxy.parabombs: - AlwaysVisible: - AirstrikePower: + Inherits@DUMMY: ^InvisibleDummy + AirstrikePowerCA: Icon: parabombs - Description: Parabombs (Single Use) - LongDesc: A Badger drops a load of parachuted bombs on your target. + Name: Parabombs (Single Use) + Description: A Badger drops a load of parachuted bombs on your target. OneShot: true AllowMultiple: true UnitType: badr.bomber @@ -558,19 +691,20 @@ powerproxy.parabombs: QuantizedFacings: 8 DisplayBeacon: True BeaconPoster: pbmbicon - CameraActor: camera + CameraActor: camera.paradrop CameraRemoveDelay: 150 ArrowSequence: arrow ClockSequence: clock CircleSequence: circles OrderName: crateparabombs + SupportPowerPaletteOrder: 70 powerproxy.sonarpulse: - AlwaysVisible: + Inherits@DUMMY: ^InvisibleDummy SpawnActorPower: Icon: sonar - Description: Sonar Pulse - LongDesc: Reveals all submarines in the vicinity for a \nshort time. + Name: Sonar Pulse + Description: Reveals all submarines in the vicinity for a \nshort time. ChargeInterval: 750 EndChargeSpeechNotification: SonarPulseReady SelectTargetSpeechNotification: SelectTarget @@ -579,14 +713,17 @@ powerproxy.sonarpulse: DeploySound: sonpulse.aud EffectImage: moveflsh EffectPalette: moveflash + SupportPowerPaletteOrder: 70 + BlockedCursor: move-blocked powerproxy.paratroopers: - AlwaysVisible: + Inherits@DUMMY: ^InvisibleDummy ParatroopersPower: Icon: paratroopers - SquadSize: 2 - Description: Paratroopers (Single Use) - LongDesc: A Badger drops a squad of infantry\nanywhere on the map. + SquadSize: 1 + UnitType: halo.paradrop + Name: Paratroopers (Single Use) + Description: A Halo transport drops a squad of infantry\nanywhere on the map. OneShot: true AllowMultiple: true DropItems: E1,E1,E1,E3,E3,E1,E1,E1,E2,E2 @@ -602,18 +739,19 @@ powerproxy.paratroopers: ArrowSequence: arrow ClockSequence: clock CircleSequence: circles + SupportPowerPaletteOrder: 70 -powerproxy.paratroopers2: - AlwaysVisible: +powerproxy.paratroopers.allies: + Inherits@DUMMY: ^InvisibleDummy ParatroopersPower: Icon: paratroopers SquadSize: 1 UnitType: tran.paradrop - Description: Paratroopers (Single Use) - LongDesc: A Chinook drops a squad of infantry\nanywhere on the map. + Name: Paratroopers (Single Use) + Description: A Chinook drops a squad of infantry\nanywhere on the map. OneShot: true AllowMultiple: true - DropItems: E1,E1,SNIP,E3,E3 + DropItems: E1,E1,E1,E1,E3,E3,E3,MEDI SelectTargetSpeechNotification: SelectTarget EndChargeSpeechNotification: Reinforce LaunchSpeechNotification: ReinforcementsArrived @@ -626,150 +764,268 @@ powerproxy.paratroopers2: ArrowSequence: arrow ClockSequence: clock CircleSequence: circles + SupportPowerPaletteOrder: 70 + +powerproxy.airborne: + Inherits@DUMMY: ^InvisibleDummy + ParatroopersPowerCA: + OrderName: airborne + Icon: airborne + SquadSize: 1 + UnitType: galx + Name: Airdrop: Guardian GIs (Single Use) + Description: A Heavy Transport Plane drops a squad of Guardian GIs\nanywhere on the map. + OneShot: true + AllowMultiple: true + DropItems: U3,U3,U3,U3,U3 + SelectTargetSpeechNotification: SelectTarget + EndChargeSpeechNotification: Reinforce + LaunchSpeechNotification: ReinforcementsArrived + IncomingSpeechNotification: EnemyPlanesApproaching + AllowImpassableCells: false + QuantizedFacings: 8 + CameraActor: camera.paradrop + DisplayBeacon: true + BeaconPoster: pinficon + ArrowSequence: arrow + ClockSequence: clock + CircleSequence: circles + UseDirectionalTarget: True + DirectionArrowAnimation: paradirection + SupportPowerPaletteOrder: 70 + PrerequisiteDropItems: + airborne.upgrade: U3R2, U3R2, U3R2, U3R2, U3R2 + Buildable: + Queue: PowerProxy + Tooltip: + Name: Guardian GIs (Single Use) + +powerproxy.airborne.tank: + Inherits@DUMMY: ^InvisibleDummy + ParatroopersPowerCA: + OrderName: airbornetank + Icon: airdropicon + SquadSize: 1 + UnitType: galx + Name: Airdrop: Grizzly Tanks (Single Use) + Description: A Heavy Transport Plane drops a pair of Grizzly Tanks\nanywhere on the map. + OneShot: true + AllowMultiple: true + DropItems: GTNK,GTNK + SelectTargetSpeechNotification: SelectTarget + EndChargeSpeechNotification: Reinforce + LaunchSpeechNotification: ReinforcementsArrived + IncomingSpeechNotification: EnemyPlanesApproaching + AllowImpassableCells: false + QuantizedFacings: 8 + CameraActor: camera.paradrop + DisplayBeacon: true + BeaconPoster: lrairdropicon + ArrowSequence: arrow + ClockSequence: clock + CircleSequence: circles + UseDirectionalTarget: True + DirectionArrowAnimation: paradirection + SupportPowerPaletteOrder: 70 + PrerequisiteDropItems: + airborne.upgrade: GTNKR2, GTNKR2 + Buildable: + Queue: PowerProxy + Tooltip: + Name: Grizzly Tanks (Single Use) powerproxy.airstrike: - AlwaysVisible: + Inherits@DUMMY: ^InvisibleDummy ClassicAirstrikePower: Squad: - a10.bomber: + 1: + UnitType: a10.bomber SpawnDelay: 20 SpawnOffset: -1536,1024,0 TargetOffset: -536,0,0 - a10.bomber: + 2: + UnitType: a10.bomber SpawnDelay: 0 SpawnOffset: 0,0,0 TargetOffset: 0,0,0 Icon: airstrike - Description: Air Strike (Single Use) - LongDesc: A10 strike planes drop napalm\nbombs on your target. + Name: Air Strike (Single Use) + Description: A10 strike planes drop napalm\nbombs on your target. OneShot: true AllowMultiple: true - EndChargeSpeechNotification: Reinforce SelectTargetSpeechNotification: SelectTarget + EndChargeSpeechNotification: Reinforce + LaunchSpeechNotification: ReinforcementsArrived IncomingSpeechNotification: EnemyPlanesApproaching QuantizedFacings: 8 DisplayBeacon: True BeaconPoster: a10airstrike BeaconPosterPalette: temptd - CameraActor: camera + CameraActor: camera.paradrop + CameraRemoveDelay: 125 ArrowSequence: arrow ClockSequence: clockTD CircleSequence: circles Strikes: 2 CircleDelay: 20 OrderName: crateairstrike + SupportPowerPaletteOrder: 70 + DirectionArrowAnimation: paradirection + UseDirectionalTarget: true barracks.upgraded: - AlwaysVisible: + Inherits@DUMMY: ^InvisibleDummy ProvidesPrerequisite: vehicles.upgraded: - AlwaysVisible: + Inherits@DUMMY: ^InvisibleDummy ProvidesPrerequisite: aircraft.upgraded: - AlwaysVisible: + Inherits@DUMMY: ^InvisibleDummy ProvidesPrerequisite: -# tent - medic +playerxp.level1: + Inherits@DUMMY: ^InvisibleDummy + Tooltip: + Name: Player Rank 1 + Buildable: + Description: Player Rank 1 + +playerxp.level2: + Inherits@DUMMY: ^InvisibleDummy + Tooltip: + Name: Player Rank 2 + Buildable: + Description: Player Rank 2 + +playerxp.level3: + Inherits@DUMMY: ^InvisibleDummy + Tooltip: + Name: Player Rank 3 + Buildable: + Description: Player Rank 3 + +influence.level1: + Inherits@DUMMY: ^InvisibleDummy + Tooltip: + Name: Influence Level 1 + Buildable: + Description: Influence Level 1 + +influence.level2: + Inherits@DUMMY: ^InvisibleDummy + Tooltip: + Name: Influence Level 2 + Buildable: + Description: Influence Level 2 + +influence.level3: + Inherits@DUMMY: ^InvisibleDummy + Tooltip: + Name: Influence Level 3 + Buildable: + Description: Influence Level 3 + +timeskip: + Inherits@DUMMY: ^InvisibleDummy + Tooltip: + Name: Time Skip + Buildable: + Queue: TimeSkip + Description: Advances influence progress by 1:00. + AdvancesTimeline: + Type: AlliedInfluence + Ticks: 1500 + ProvidesUpgrade: + RenderSprites: + Image: timeskip + +# tent - cryo mortar stolentech.tent: - AlwaysVisible: + Inherits@DUMMY: ^InvisibleDummy ProvidesPrerequisite: - Prerequisite: infantry.medi -# barr - thief +# barr - cyberdog stolentech.barr: - AlwaysVisible: + Inherits@DUMMY: ^InvisibleDummy ProvidesPrerequisite: - Prerequisite: infantry.thf -# pyle - medic +# pyle - sonic mortar stolentech.pyle: - AlwaysVisible: + Inherits@DUMMY: ^InvisibleDummy ProvidesPrerequisite: - Prerequisite: infantry.medi # hand - chem mortar stolentech.hand: - AlwaysVisible: + Inherits@DUMMY: ^InvisibleDummy ProvidesPrerequisite: -# ra weap - med tank from allies, heavy tank from soviets +# ra weap - reckoner from allies, cyclops from soviets stolentech.weap: - AlwaysVisible: + Inherits@DUMMY: ^InvisibleDummy ValidFactions: - Factions: england, france, germany, russia, ukraine, iraq + Factions: allies, england, france, germany, usa, soviet, russia, ukraine, iraq, yuri ProvidesPrerequisiteValidatedFaction@STOLENALLIED: - Factions: england, france, germany - Prerequisite: vehicles.2tnk + Factions: allies, england, france, germany, usa + Prerequisite: vehicles.reck ProvidesPrerequisiteValidatedFaction@STOLENSOVIET: - Factions: russia, ukraine, iraq, yuri - Prerequisite: vehicles.3tnk + Factions: soviet, russia, ukraine, iraq, yuri + Prerequisite: vehicles.cycp -# td weap - battle tank from gdi/legion, light tank if capturer is legion +# td weap - basilisk from gdi, mantis from legion stolentech.weap.td: - AlwaysVisible: - ProvidesPrerequisite@STOLENGDI: - Prerequisite: vehicles.mtnk - ProvidesPrerequisite@STOLENNOD: - Prerequisite: vehicles.ltnk + Inherits@DUMMY: ^InvisibleDummy + ValidFactions: + Factions: gdi, talon, zocom, eagle, arc, legion + ProvidesPrerequisiteValidatedFaction@STOLENGDI: + Factions: gdi, talon, zocom, eagle, arc + Prerequisite: vehicles.basi + ProvidesPrerequisiteValidatedFaction@STOLENNOD: + Factions: legion + Prerequisite: vehicles.mant -# airs - vehicle veterancy +# airs - mantis stolentech.airs: - AlwaysVisible: - ProvidesPrerequisite@VET: - Prerequisite: vehicles.upgraded + Inherits@DUMMY: ^InvisibleDummy + ProvidesPrerequisite@STOLENNOD: + Prerequisite: vehicles.mant -# dome - ifv from allies, v2 from soviets -stolentech.dome: - AlwaysVisible: +# afld - kamov +stolentech.afld: + Inherits@DUMMY: ^InvisibleDummy + ProvidesPrerequisite@STOLENSOVIET: + Prerequisite: aircraft.kamv + +# afld.gdi - shade +stolentech.afld.gdi: + Inherits@DUMMY: ^InvisibleDummy + ProvidesPrerequisite@STOLENGDI: + Prerequisite: aircraft.shde + +# hpad - phantom from allies, kamov from soviets +stolentech.hpad: + Inherits@DUMMY: ^InvisibleDummy ValidFactions: - Factions: england, france, germany, russia, ukraine, iraq + Factions: allies, england, france, germany, usa, soviet, russia, ukraine, iraq, yuri ProvidesPrerequisiteValidatedFaction@STOLENALLIED: - Factions: england, france, germany - Prerequisite: vehicles.ifv + Factions: allies, england, france, germany, usa + Prerequisite: aircraft.phan ProvidesPrerequisiteValidatedFaction@STOLENSOVIET: - Factions: russia, ukraine, iraq, yuri - Prerequisite: vehicles.v2 - ProvidesPrerequisiteValidatedFaction@STOLENSOVIET2: - Factions: russia, ukraine, iraq, yuri - Prerequisite: v2.upgrade - -# hq - mlrs from allies, aircraft veterancy from nod -stolentech.hq: - AlwaysVisible: + Factions: soviet, russia, ukraine, iraq, yuri + Prerequisite: aircraft.kamv + +# hpad.td - shade from gdi, vertigo from nod +stolentech.hpad.td: + Inherits@DUMMY: ^InvisibleDummy ValidFactions: - Factions: talon, zocom, eagle, arc, blackh, marked, legion, shadow + Factions: gdi, talon, zocom, eagle, arc, nod, blackh, marked, legion, shadow ProvidesPrerequisiteValidatedFaction@STOLENGDI: - Factions: talon, zocom, eagle, arc - Prerequisite: vehicles.msam + Factions: gdi, talon, zocom, eagle, arc + Prerequisite: aircraft.shde ProvidesPrerequisiteValidatedFaction@STOLENNOD: - Factions: blackh, marked, legion, shadow - Prerequisite: aircraft.upgraded - -# atek - mrj -stolentech.atek: - AlwaysVisible: - ProvidesPrerequisite: - Prerequisite: vehicles.mrj - -# stek - mad tank -stolentech.stek: - AlwaysVisible: - ProvidesPrerequisite: - Prerequisite: vehicles.qtnk - -# gtek - mobile emp -stolentech.gtek: - AlwaysVisible: - ProvidesPrerequisite: - Prerequisite: vehicles.memp - -# tmpl - toxin truck -stolentech.tmpl: - AlwaysVisible: - ProvidesPrerequisite: - Prerequisite: vehicles.ttrk + Factions: nod, blackh, marked, legion, shadow + Prerequisite: aircraft.vert mpspawn: Interactable: @@ -802,12 +1058,31 @@ waypoint: Categories: System fact.colorpicker: + Inherits: FACT + -Buildable: + -MapEditorData: + RenderSprites: + Image: fact + Palette: colorpicker + -Encyclopedia: + +afac.colorpicker: Inherits: AFAC -Buildable: -MapEditorData: RenderSprites: Image: afac - Palette: colorpicker + Palette: colorpickertd + -Encyclopedia: + +sfac.colorpicker: + Inherits: SFAC + -Buildable: + -MapEditorData: + RenderSprites: + Image: sfac + Palette: colorpickerscrin + -Encyclopedia: CTFLAG: Inherits: ^TechBuilding @@ -817,77 +1092,257 @@ CTFLAG: HasMinibib: true -HitShape: -Health: - -Explodes: + -FireWarheadsOnDeath: -Selectable: -SelectionDecorations: -Targetable: MapEditorData: Categories: Decoration Interactable: + -Encyclopedia: SPLIT2: Inherits: ^TibTree SeedsResourceCA: ResourceType: Tiberium - Interval: 75 + Interval: 66 AppearsOnMapPreview: Terrain: Tiberium MapEditorData: Categories: Resource spawn SPLIT3: - Inherits: ^TibTree - SeedsResourceCA: - ResourceType: Tiberium - Interval: 75 - AppearsOnMapPreview: - Terrain: Tiberium - WithIdleAnimation: - Interval: 175 - MapEditorData: - Categories: Resource spawn + Inherits: SPLIT2 SPLITBLUE: - Inherits: ^TibTree + Inherits: SPLIT2 RenderSprites: Image: split3 SeedsResourceCA: ResourceType: BlueTiberium AppearsOnMapPreview: Terrain: BlueTiberium - WithIdleAnimation: - Interval: 210 Tooltip: Name: Blossom Tree (blue) RadarColorFromTerrain: Terrain: BlueTiberium - MapEditorData: - Categories: Resource spawn + ProximityExternalCondition@ONTIB: + Condition: on-bluetib -gps.scrambler: - Inherits@1: CAMERA +^Veil: + Inherits@DUMMY: ^InvisibleDummy + EditorOnlyTooltip: + Name: (Veil of War) + Immobile: + OccupiesSpace: false + BodyOrientation: + QuantizedFacings: 1 + WithSpriteBody: + MapEditorData: + Categories: System + HitShape: CreatesShroud: - Range: 9c512 + Range: 2c512 Type: CenterPosition - -RevealsShroud: RenderShroudCircleCA: Visible: Always - Color: 999999AA - -RenderSpritesEditorOnly: + UsePlayerColor: true + PlayerColorAlpha: 192 + ValidRelationships: Ally, Enemy, Neutral RenderSprites: Image: gpsscrambler + PeriodicExplosion: + Weapon: VeilSmall + Health: + HP: 1 + ProximityExternalCondition@Veiled: + Range: 2c512 + Condition: veiled + ValidRelationships: Enemy, Neutral + +veilofwar1: + Inherits: ^Veil + CreatesShroud: + Range: 3c0 + KillsSelf: + Delay: 60 WithMakeAnimation: - ProximityExternalCondition@GPSSCRAMBLE: - Range: 9c512 - Condition: gpsscramble + SpawnActorOnDeath: + Actor: veilofwar2 + WithRangeCircle@VeilMaxRange: + Type: VeilOfWar + Range: 6c0 + Visible: Always + Color: 999999AA + ProximityExternalCondition@Veiled: + Range: 3c512 + +veilofwar2: + Inherits: ^Veil + CreatesShroud: + Range: 4c512 + PeriodicExplosion: + Weapon: VeilMedium + KillsSelf: + Delay: 60 + SpawnActorOnDeath: + Actor: veilofwar3 + WithRangeCircle@VeilMaxRange: + Type: VeilOfWar + Range: 6c0 + Visible: Always + Color: 999999AA + ProximityExternalCondition@Veiled: + Range: 5c512 + +veilofwar3: + Inherits: ^Veil + CreatesShroud: + Range: 6c0 + PeriodicExplosion: + Weapon: VeilLarge + KillsSelf: + Delay: 300 + ProximityExternalCondition@Veiled: + Range: 6c0 + +jamming.field: + Interactable: + Bounds: 64, 64 + ScriptTriggers: + BodyOrientation: + QuantizedFacings: 1 + WithSpriteBody: + HitShape: + HiddenUnderFog: + Type: GroundPosition + Immobile: + OccupiesSpace: false + RenderSprites: + Image: jamfield + Palette: effect + KillsSelf: + Delay: 225 + WithRangeCircleCA@JAMMER: + Type: JammingField + Range: 6c0 + Visible: Always + ValidRelationships: Ally, Enemy, Neutral + UsePlayerColor: true + PlayerColorAlpha: 160 + ProximityExternalCondition@WEAPJAMMER: + Range: 6c0 + ValidRelationships: Enemy, Neutral + Condition: weapjammed + ProximityExternalCondition@JAMMER: + Range: 6c0 ValidRelationships: Enemy, Neutral + Condition: jammed + +cryostorm.init: + Interactable: + Bounds: 64, 64 + ScriptTriggers: + BodyOrientation: + QuantizedFacings: 1 + WithSpriteBody: + HitShape: + HiddenUnderFog: + Type: GroundPosition + Immobile: + OccupiesSpace: false + RenderSprites: + Image: empty + # required for spawning actor on death + Health: + HP: 1 + KillsSelf: + Delay: 125 + SpawnActorOnDeath: + Actor: cryostorm + SkipMakeAnimations: false + WithRangeCircleCA@Cryostorm: + Type: Cryostorm + Range: 4c682 + Visible: Always + ValidRelationships: Ally + UsePlayerColor: true + PlayerColorAlpha: 192 + PeriodicExplosion: + Weapon: CryostormInit + +cryostorm: + Inherits: cryostorm.init + RenderSprites: + Image: cryostorm + KillsSelf: + Delay: 375 + SpawnActorOnDeath: + Actor: cryostorm.fade + PeriodicExplosion: + Weapon: Cryostorm + ProximityExternalCondition@Cryostorm1: + Range: 1c512 + Condition: chilled + ValidRelationships: Ally, Enemy, Neutral + ProximityExternalCondition@Cryostorm2: + Range: 3c0 + Condition: chilled + ValidRelationships: Ally, Enemy, Neutral + ProximityExternalCondition@Cryostorm3: + Range: 4c512 + Condition: chilled + ValidRelationships: Ally, Enemy, Neutral + ProximityExternalCondition@Cryostorm4: + Range: 4c512 + Condition: chilled + ValidRelationships: Ally, Enemy, Neutral + ProximityExternalCondition@Cryostorm5: + Range: 4c512 + Condition: chilled + ValidRelationships: Ally, Enemy, Neutral + AmbientSound: + SoundFiles: cryostorm.aud + WithMakeAnimation: + AmbientSound@Start: + SoundFiles: cryostormstart.aud + Interval: 400 + WithRangeCircleCA@Cryostorm: + ValidRelationships: Ally, Enemy, Neutral + +cryostorm.fade: + Inherits: cryostorm + -PeriodicExplosion: + -ProximityExternalCondition@Cryostorm1: + -ProximityExternalCondition@Cryostorm2: + -ProximityExternalCondition@Cryostorm3: + -ProximityExternalCondition@Cryostorm4: + -SpawnActorOnDeath: + -AmbientSound: + -AmbientSound@Start: + KillsSelf: + Delay: 15 + WithMakeAnimation: + Sequence: die + WithSpriteBody: + Sequence: dead nshield: - Inherits@1: CAMERA - -RevealsShroud: - WithRangeCircle: + Inherits@DUMMY: ^InvisibleDummy + Immobile: + OccupiesSpace: false + BodyOrientation: + QuantizedFacings: 1 + RenderSprites: + Image: empty + WithSpriteBody: + Interactable: + Bounds: 64, 64 + WithRangeCircleCA: + Type: NaniteShield Visible: Always - Color: 64a5dcbb + UsePlayerColor: true + PlayerColorAlpha: 192 Range: 6c0 ProximityExternalCondition@NSHIELD: Range: 6c0 @@ -895,23 +1350,66 @@ nshield: ValidRelationships: Ally ProvidesPrerequisite@NSHIELD: +killzone: + Interactable: + Bounds: 64, 64 + ScriptTriggers: + BodyOrientation: + QuantizedFacings: 1 + RevealsShroud: + Range: 8c0 + Type: CenterPosition + ProximityExternalCondition@KillZone: + Range: 8c0 + Condition: killzone + ValidRelationships: Enemy, Neutral + WithSpriteBody: + HitShape: + HiddenUnderFog: + Type: GroundPosition + Immobile: + OccupiesSpace: false + RenderSprites: + Image: killzone + PlayerPalette: player + KillsSelf: + Delay: 1500 # matches killzone flare + RemoveInstead: true + WithRangeCircleCA: + Type: KillZone + Visible: Always + UsePlayerColor: true + PlayerColorAlpha: 192 + Range: 8c0 + ValidRelationships: Enemy, Neutral, Ally + shadow.beacon.camera: - Inherits@1: CAMERA + Inherits@1: ^CameraBase -Immobile: - Mobile: - Locomotor: cloud - ImmovableCondition: attached - GrantCondition: - Condition: attached + AttachedAircraft: + Speed: 0 + CanHover: true + Repulsable: false + CruiseAltitude: 1 + LandableTerrainTypes: Clear,Road,Rough,Ore,Gems,Tiberium,BlueTiberium,BlackTiberium,Water,Tree,River,Rock,Beach,Bridge,Tunnel,Wall,Ford Attachable: - AttachableType: shab + Type: ShadowBeacon + TargetTypes: ShadowBeaconAttachable RevealsShroud: - Range: 6c0 - GrantTimedCondition@active: - Condition: active - Duration: 6000 + Range: 8c0 + Type: GroundPosition + DetectCloaked: + Range: 0c512 + DetectionTypes: Cloak KillsSelf: - RequiresCondition: !active + RemoveInstead: true + Delay: 2250 + +watcher.parasite: + Inherits: shadow.beacon.camera + Attachable: + Type: WatcherParasite + TargetTypes: WatcherParasiteAttachable SHAB: Inherits: ^Mine @@ -923,18 +1421,117 @@ SHAB: AvoidFriendly: true BlockFriendly: false Cloak: - CloakTypes: Mine + DetectionTypes: Mine InitialDelay: 1 CloakSound: shad-beaconplace1.aud + CloakedAlpha: 1 RevealsShroud: - Range: 6c0 + Range: 8c0 WithIdleAnimation: Sequences: idle Interval: 25 - Explodes: + FireWarheadsOnDeath: Weapon: AttachShadowBeacon GrantTimedCondition@active: Condition: active Duration: 4500 KillsSelf: RequiresCondition: !active + +optimized.production1: + Inherits@DUMMY: ^InvisibleDummy + ProvidesPrerequisite: + PopControlled: + +optimized.production2: + Inherits@DUMMY: ^InvisibleDummy + ProvidesPrerequisite: + PopControlled: + +scrin.allegiances.available: + AlwaysVisible: + Interactable: + Tooltip: + Name: 4x Refineries + Buildable: + Description: 4x Refineries + +# For MQ, ensures production tabs are updated properly +QueueUpdaterDummy: + Inherits@DUMMY: ^InvisibleDummy + ProvidesPrerequisite: + KillsSelf: + RemoveInstead: true + +# Dummy actors for rank ups, for observer stats +playerxp.level1: + Inherits@DUMMY: ^InvisibleDummy + Tooltip: + Name: Rank 1 + Buildable: + Description: Player XP rank 1. + RenderSprites: + +playerxp.level2: + Inherits@DUMMY: ^InvisibleDummy + Tooltip: + Name: Rank 2 + Buildable: + Description: Player XP rank 2. + RenderSprites: + +playerxp.level3: + Inherits@DUMMY: ^InvisibleDummy + Tooltip: + Name: Rank 3 + Buildable: + Description: Player XP rank 3. + RenderSprites: + +influence.level1: + Inherits@DUMMY: ^InvisibleDummy + Tooltip: + Name: Influence Level 1 + Buildable: + Description: Allied influence level 1. + RenderSprites: + +influence.level2: + Inherits@DUMMY: ^InvisibleDummy + Tooltip: + Name: Influence Level 2 + Buildable: + Description: Allied influence level 2. + RenderSprites: + +influence.level3: + Inherits@DUMMY: ^InvisibleDummy + Tooltip: + Name: Influence Level 3 + Buildable: + Description: Allied influence level 3. + RenderSprites: + +covenant.level1: + Inherits@DUMMY: ^InvisibleDummy + Tooltip: + Name: Covenant level 1 (1x enemy building destroyed/captured/infiltrated or harvester destroyed) + Buildable: + Description: Covenant level 1 (1x enemy building destroyed/captured/infiltrated or harvester destroyed) + RenderSprites: + +covenant.level2: + Inherits@DUMMY: ^InvisibleDummy + Tooltip: + Name: Covenant level 2 + Buildable: + Description: Covenant level 2. + RenderSprites: + +covenant.level3: + Inherits@DUMMY: ^InvisibleDummy + Tooltip: + Name: Covenant level 3 + Buildable: + Description: Covenant level 3. + RenderSprites: diff --git a/mods/ca/rules/palettes.yaml b/mods/ca/rules/palettes.yaml index 4af83f0311..9f53c3f564 100644 --- a/mods/ca/rules/palettes.yaml +++ b/mods/ca/rules/palettes.yaml @@ -72,7 +72,7 @@ PaletteFromFile@tiberium-snow: Name: tiberiumpalette Tileset: SNOW - Filename: temperattd.pal + Filename: temptdsnow.pal ShadowIndex: 3, 4 PaletteFromFile@tiberium-temperat: Name: tiberiumpalette @@ -108,6 +108,14 @@ Name: player Filename: temperat.pal ShadowIndex: 4 + PaletteFromFile@playertd: + Name: playertd + Filename: temperattd.pal + ShadowIndex: 4 + PaletteFromFile@playerscrin: + Name: playerscrin + Filename: scrin.pal + ShadowIndex: 4 PaletteFromFile@d2k: Name: d2k Filename: PALETTE.BIN @@ -148,11 +156,6 @@ Name: ra2unit Filename: ra2unittem.pal ShadowIndex: 4 - PaletteFromFile@colorpicker: - Name: colorpicker - Filename: temperattd.pal - ShadowIndex: 4 - AllowModifiers: false PaletteFromFile@desert: Name: desert Filename: desert.pal @@ -161,19 +164,41 @@ Name: temptd Filename: temperattd.pal ShadowIndex: 4 - PlayerColorPalette@TD: - BasePalette: temptd - BaseName: playertd - RemapIndex: 176, 178, 180, 182, 184, 186, 189, 191, 177, 179, 181, 183, 185, 187, 188, 190 OverlayPlayerColorPalette@TD: BasePalette: temptd - Ramp: 0.14 - BaseName: overlayplayertd + BaseName: playertd RemapIndex: 176, 178, 180, 182, 184, 186, 189, 191, 177, 179, 181, 183, 185, 187, 188, 190 - PlayerColorPalette@D2K: + OverlayPlayerColorPalette@D2K: BasePalette: d2k BaseName: playerd2k RemapIndex: 255, 254, 253, 252, 251, 250, 249, 248, 247, 246, 245, 244, 243, 242, 241, 240 + OverlayColorPickerPalette@colorpicker: + Name: colorpicker + BasePalette: player + RemapIndex: 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95 + AllowModifiers: false + OverlayColorPickerPalette@colorpickerscrin: + Name: colorpickerscrin + BasePalette: playerscrin + RemapIndex: 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95 + AllowModifiers: false + OverlayColorPickerPalette@colorpickertd: + Name: colorpickertd + BasePalette: playertd + RemapIndex: 176, 178, 180, 182, 184, 186, 189, 191, 177, 179, 181, 183, 185, 187, 188, 190 + AllowModifiers: false + EncyclopediaColorPalette@encyclopediara: + Name: encyclopedia + BasePalette: player + RemapIndex: 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95 + EncyclopediaColorPalette@encyclopediatd: + Name: encyclopediatd + BasePalette: playertd + RemapIndex: 176, 178, 180, 182, 184, 186, 189, 191, 177, 179, 181, 183, 185, 187, 188, 190 + EncyclopediaColorPalette@encyclopediascrin: + Name: encyclopediascrin + BasePalette: playerscrin + RemapIndex: 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95 PaletteFromFile@tseffect: Name: tseffect Filename: animts.pal @@ -217,10 +242,18 @@ Name: effect-ignore-lighting-alpha85 Alpha: 0.85 BasePalette: effect + PaletteFromPaletteWithAlpha@effect-nolite-alpha50: + Name: effect-ignore-lighting-alpha50 + Alpha: 0.5 + BasePalette: effect PaletteFromPaletteWithAlpha@effect-nolite-alpha40: Name: effect-ignore-lighting-alpha40 Alpha: 0.4 BasePalette: effect + PaletteFromPaletteWithAlpha@effect-nolite-alpha35: + Name: effect-ignore-lighting-alpha35 + Alpha: 0.35 + BasePalette: effect PaletteFromPaletteWithAlpha@effect-nolite: Name: effect-ignore-lighting Alpha: 1 @@ -249,172 +282,46 @@ G: 0 B: 0 A: 140 - PaletteFromRGBA@highlight: - Name: highlight - R: 255 - G: 255 - B: 255 - A: 128 - PaletteFromRGBA@greenhighlight: - Name: greenhighlight - R: 128 - G: 255 - B: 128 - A: 128 - PaletteFromRGBA@redhighlight: - Name: redhighlight - R: 255 - G: 64 - B: 64 - A: 128 PaletteFromRGBA@scrinplasma: Name: scrinplasma R: 121 G: 101 B: 239 A: 40 - PaletteFromRGBA@cold1: - Name: cold1 + PaletteFromRGBA@cold: + Name: cold R: 81 G: 174 B: 217 A: 28 - PaletteFromRGBA@cold2: - Name: cold2 - R: 81 - G: 174 - B: 217 - A: 56 - PaletteFromRGBA@cold3: - Name: cold3 - R: 81 - G: 174 - B: 217 - A: 84 - PaletteFromRGBA@cold4: - Name: cold4 - R: 81 - G: 174 - B: 217 - A: 112 - PaletteFromRGBA@cold5: - Name: cold5 - R: 81 - G: 174 - B: 217 - A: 140 - PaletteFromRGBA@cold6: - Name: cold6 - R: 81 - G: 174 - B: 217 - A: 168 - PaletteFromRGBA@hot1: - Name: hot1 - R: 255 - G: 80 - B: 0 - A: 64 - PaletteFromRGBA@hot2: - Name: hot2 - R: 255 - G: 110 - B: 0 - A: 96 - PaletteFromRGBA@hot3: - Name: hot3 - R: 255 - G: 140 - B: 0 - A: 128 PaletteFromRGBA@moveflash: Name: moveflash R: 255 G: 255 B: 255 A: 64 - PaletteFromRGBA@invuln: - Name: invuln - R: 128 - G: 0 - B: 0 - A: 128 - PaletteFromRGBA@irrad: - Name: irrad - R: 64 - G: 128 - B: 0 - A: 128 - PaletteFromRGBA@forces: - Name: forces - R: 0 - G: 0 - B: 128 - A: 200 - PaletteFromRGBA@nrepair: - Name: nrepair - R: 0 - G: 0 - B: 128 - A: 65 - PaletteFromRGBA@disabled: - Name: disabled - R: 0 - G: 0 - B: 0 - A: 180 - PaletteFromRGBA@flare: - Name: flare - R: 255 - G: 0 - B: 0 - A: 128 - PaletteFromRGBA@berserk: - Name: berserk - R: 255 - G: 0 - B: 70 - A: 130 - PaletteFromRGBA@frenzy: - Name: frenzy - R: 136 - G: 34 - B: 0 - A: 255 PaletteFromRGBA@frenzyoverlay: Name: frenzyoverlay R: 255 G: 68 B: 0 - A: 3 - PaletteFromRGBA@ionsurge: - Name: ionsurge - R: 189 - G: 112 - B: 255 - A: 35 + A: 40 PaletteFromRGBA@ionsurgeoverlay: Name: ionsurgeoverlay R: 189 G: 112 B: 255 - A: 7 + A: 70 ShroudPalette@shroud: Name: shroud ShroudPalette@fog: Name: fog Fog: true - PlayerColorPalette@RA: - BasePalette: player - RemapIndex: 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95 OverlayPlayerColorPalette@RA: BasePalette: player - Ramp: 0.13 - BaseName: overlayplayer RemapIndex: 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95 OverlayPlayerColorPalette@navy: BasePalette: navy - Ramp: 0.13 BaseName: playernavy RemapIndex: 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95 FixedColorPalette@BlueTiberium: @@ -422,154 +329,203 @@ Name: bluetiberium Color: 89BAFF RemapIndex: 176, 178, 180, 182, 184, 186, 189, 191, 177, 179, 181, 183, 185, 187, 188, 190 - PaletteFromPlayerPaletteWithAlpha@cloak: + FixedColorPalette@BlackTiberium: + Base: tiberiumpalette + Name: blacktiberium + Color: 2c0059 + RemapIndex: 176, 178, 180, 182, 184, 186, 189, 191, 177, 179, 181, 183, 185, 187, 188, 190 + PaletteFromPlayerPaletteWithAlpha@cloakra: BaseName: cloakra - BasePalette: overlayplayer - Alpha: 0.55 - PaletteFromPlayerPaletteWithAlpha@cloakTD: + BasePalette: player + Alpha: 0.5 + PaletteFromPlayerPaletteWithAlpha@cloaktd: BaseName: cloaktd - BasePalette: overlayplayertd - Alpha: 0.55 - PaletteFromPlayerPaletteWithAlpha@cloakgreen: - BaseName: cloakgreen - BasePalette: overlayplayer - Alpha: 0.25 - PaletteFromPlayerPaletteWithAlpha@cloakgreenTD: - BaseName: cloakgreenTD - BasePalette: overlayplayertd - Alpha: 0.25 - PaletteFromPlayerPaletteWithAlpha@cloakTDV: - BaseName: cloak - BasePalette: overlayplayertd - Alpha: 0.65 + BasePalette: playertd + Alpha: 0.5 PaletteFromRGBA@cloak: Name: cloak R: 0 G: 0 B: 0 A: 140 - PaletteFromRGBA@cloakTD: - Name: cloakTD - R: 0 - G: 0 - B: 0 - A: 140 PaletteFromRGBA@cloakgreen: Name: cloakgreen R: 0 G: 228 B: 0 A: 65 - PaletteFromRGBA@cloakgreenTD: - Name: cloakgreenTD + PaletteFromRGBA@Darkened: + Name: darkened R: 0 - G: 228 + G: 0 B: 0 - A: 65 - PlayerHighlightPalette: - MenuPaletteEffect: + A: 96 + CloakPaletteEffectCA@CLOAK: + Palette: cloak + CloakPaletteEffectCA@CLOAKGREEN: + Palette: cloakgreen + MenuPostProcessEffect: MenuEffect: Desaturated RotationPaletteEffect@defaultwater: Palettes: terrain ExcludeTilesets: DESERT + ExcludePalettes: tiberiumpalette, bluetiberium RotationPaletteEffect@actorswater: - Palettes: player, overlayplayer, effect, playernavy - ExcludePalettes: playerd2k, d2k + Palettes: player, effect, playernavy + ExcludePalettes: playerd2k, d2k, tiberiumpalette, bluetiberium RotationPaletteEffect@desertwater: - Palettes: terrain, temptd, playertd, overlayplayertd + Palettes: terrain, temptd, playertd, tiberiumpalette, bluetiberium Tilesets: DESERT RotationBase: 32 - ExcludePalettes: cursor, chrome, chrometd, chromes, colorpicker, playerd2k, d2k + ExcludePalettes: cursor, chrome, chrometd, chromes, tiberiumpalette, colorpicker, colorpickertd, colorpickerscrin, playerd2k, d2k RotationPaletteEffect@desertwater-actor: - Palettes: desert, temptd, playertd, overlayplayertd, tdeffect + Palettes: desert, temptd, playertd, tdeffect, bluetiberium RotationBase: 32 - ExcludePalettes: cursor, chrome, chrometd, chromes, colorpicker, playerd2k, d2k + ExcludePalettes: cursor, chrome, chrometd, tiberiumpalette, bluetiberium, chromes, colorpicker, colorpickertd, colorpickerscrin, playerd2k, d2k LightPaletteRotator: - ExcludePalettes: playerd2k, d2k, terrain, effect, tdeffect, desert, tseffect, ra2effect, tsunit, ra2unit, ra2unit-ignore-lighting-alpha75, tsunit-ignore-lighting-alpha75, tseffect-ignore-lighting-alpha75, tseffect-ignore-lighting-alpha90, effect-ignore-lighting-alpha85, ioncloud - ChronoshiftPaletteEffect: - CloakPaletteEffect: - FlashPaletteEffect@NUKE: + ExcludePalettes: playerd2k, d2k, terrain, tiberiumpalette, bluetiberium, effect, tdeffect, scrineffect, desert, tseffect, ra2effect, tsunit, ra2unit, ra2unit-ignore-lighting-alpha75, tsunit-ignore-lighting-alpha75, tseffect-ignore-lighting-alpha75, tseffect-ignore-lighting-alpha90, effect-ignore-lighting-alpha85, ioncloud + ChronoshiftPostProcessEffect: + FlashPostProcessEffect@NUKE: Type: Nuke - ExcludePalettes: cursor, chrome, chrometd, chromes, colorpicker, fog, shroud, effect-ignore-lighting + FlashPostProcessEffect@OverlordsWrath: + Type: OverlordsWrath + Color: 00ff00 PaletteFromPaletteWithAlpha@placelinesegment: Name: placelinesegment BasePalette: terrain Alpha: 0.65 PaletteFromPlayerPaletteWithAlpha@placebuilding: BaseName: placebuilding - BasePalette: overlayplayer + BasePalette: player Alpha: 0.65 PaletteFromPlayerPaletteWithAlpha@placebuildingTD: BaseName: placebuildingtd - BasePalette: overlayplayertd + BasePalette: playertd Alpha: 0.65 - FlickeringPaletteEffect@IC: + PaletteFromRGBA@invuln: + Name: invuln + A: 0 + PulsingPaletteEffect@IC: PaletteName: invuln - BaseColor: 280000BB - AmplitudeRed: 30 - AmplitudeGreen: 0 - AmplitudeBlue: 0 - QuantizationCount: 128 - FlickeringPaletteEffect@FS: + StartColor: 070000CC + EndColor: 66000070 + PulseDuration: 35 + PulseDelay: 5 + PaletteFromRGBA@irrad: + Name: irrad + A: 0 + PulsingPaletteEffect@IRRADIATED: + PaletteName: irrad + StartColor: 55a40066 + EndColor: 7df100bb + PulseDuration: 35 + PulseDelay: 5 + PaletteFromRGBA@forces: + Name: forces + A: 0 + PulsingPaletteEffect@FS: PaletteName: forces - BaseColor: 00008066 - AmplitudeRed: 0 - AmplitudeGreen: 0 - AmplitudeBlue: 20 - QuantizationCount: 96 - FlickeringPaletteEffect@FRENZY: - PaletteName: frenzy - BaseColor: 44120066 - AmplitudeRed: 11 - AmplitudeGreen: 3 - AmplitudeBlue: 0 - QuantizationCount: 48 - FlickeringPaletteEffect@BERSERK: - PaletteName: berserk - BaseColor: 66002288 - AmplitudeRed: 66 - AmplitudeGreen: 0 - AmplitudeBlue: 22 - QuantizationCount: 32 - FlickeringPaletteEffect@NREPAIR: + StartColor: 00008066 + EndColor: 0202bd99 + PulseDuration: 20 + PaletteFromRGBA@nrepair: + Name: nrepair + A: 0 + PulsingPaletteEffect@NREPAIR: PaletteName: nrepair - BaseColor: 25cde90D - AmplitudeRed: 0 - AmplitudeGreen: 0 - AmplitudeBlue: 30 - QuantizationCount: 96 - FlickeringPaletteEffect@IRRADIATED: - PaletteName: irrad - BaseColor: 55881144 - AmplitudeRed: 0 - AmplitudeGreen: 25 - AmplitudeBlue: 0 - QuantizationCount: 160 + StartColor: 00ffff99 + EndColor: 00ffff55 + PulseDuration: 10 + PaletteFromRGBA@berserk: + Name: berserk + A: 0 + PulsingPaletteEffect@BERSERK: + PaletteName: berserk + StartColor: 17000877 + EndColor: ff0072a0 + PulseDuration: 5 + PaletteFromRGBA@frenzy: + Name: frenzy + A: 0 + PulsingPaletteEffect@FRENZY: + PaletteName: frenzy + StartColor: 53150062 + EndColor: b1320072 + PulseDuration: 10 PaletteFromRGBA@temporal: Name: temporal - R: 128 - G: 200 - B: 255 - A: 128 - FlickeringPaletteEffect@temporal: + A: 0 + PulsingPaletteEffect@temporal: PaletteName: temporal - BaseColor: 80D0FF10 - AmplitudeRed: 8 - AmplitudeGreen: 13 - AmplitudeBlue: 16 - QuantizationCount: 48 - PaletteFromRGBA@lowpower: - Name: lowpower - R: 0 - G: 0 - B: 0 - A: 96 + StartColor: 9adaffaa + EndColor: 9adaff88 + PulseDuration: 30 + PaletteFromRGBA@GYRO: + Name: gyro + A: 0 + PulsingPaletteEffect@GYRO: + PaletteName: gyro + StartColor: d7c00011 + EndColor: d7c00092 + PulseDuration: 35 + PaletteFromRGBA@SUPPRESSION: + Name: suppression + A: 0 + PulsingPaletteEffect@SUPPRESSION: + PaletteName: suppression + StartColor: ff28cf66 + EndColor: ef3fc864 + PulseDuration: 25 + PaletteFromRGBA@decoy: + Name: decoy + R: 255 + G: 255 + B: 255 + A: 40 + PaletteFromRGBA@Hypercharge: + Name: hypercharge + A: 0 + PulsingPaletteEffect@Hypercharge: + PaletteName: hypercharge + StartColor: 2600cc77 + EndColor: b700d477 + PulseDuration: 5 + PaletteFromRGBA@Anathema: + Name: anathema + A: 0 + PulsingPaletteEffect@Anathema: + PaletteName: anathema + StartColor: 07001777 + EndColor: 6600ffa0 + PulseDuration: 15 + PaletteFromRGBA@Overload: + Name: overload + A: 0 + PulsingPaletteEffect@Overload: + PaletteName: overload + StartColor: 00000088 + EndColor: 00005566 + PulseDuration: 3 + PaletteFromRGBA@Voidspike: + Name: voidspike + A: 0 + PulsingPaletteEffect@Voidspike: + PaletteName: voidspike + StartColor: 00000040 + EndColor: 10001e90 + PulseDuration: 30 WeatherPaletteEffect@LIGHTNINGSTORM: Type: LightningStorm Color: 08112E03 - Length: 350 + Length: 425 + Ratio: 0.3 + ExcludePalette: cursor, chrome, chrometd, chromes, colorpicker, colorpickertd, colorpickerscrin, fog, shroud, tseffect, ra2effect, ra2unit, tdeffect, effect, scrineffect, effect-ignore-lighting, tdeffect-ignore-lighting-alpha85, d2keffect-ignore-lighting-alpha75, d2keffect-ignore-lighting-alpha50, ra2effect-ignore-lighting-alpha90, ra2effect-ignore-lighting-alpha75, ra2effect-ignore-lighting-alpha50, tseffect-ignore-lighting-alpha75, tsunit-ignore-lighting-alpha75, ra2unit-ignore-lighting-alpha75, ra2unit-ignore-lighting-alpha90, tseffect-ignore-lighting-alpha90 + WeatherPaletteEffect@Rift: + Type: Rift + Color: 14082E03 + Length: 420 Ratio: 0.3 - ExcludePalette: cursor, chrome, chrometd, chromes, colorpicker, fog, shroud, tseffect, ra2effect, ra2unit, tdeffect, effect, effect-ignore-lighting, tdeffect-ignore-lighting-alpha85, d2keffect-ignore-lighting-alpha75, d2keffect-ignore-lighting-alpha50, ra2effect-ignore-lighting-alpha90, ra2effect-ignore-lighting-alpha75, ra2effect-ignore-lighting-alpha50, tseffect-ignore-lighting-alpha75, tsunit-ignore-lighting-alpha75, ra2unit-ignore-lighting-alpha75, ra2unit-ignore-lighting-alpha90, tseffect-ignore-lighting-alpha90 + ExcludePalette: cursor, chrome, chrometd, chromes, colorpicker, colorpickertd, colorpickerscrin, fog, shroud, tseffect, ra2effect, ra2unit, tdeffect, effect, scrineffect, effect-ignore-lighting, tdeffect-ignore-lighting-alpha85, d2keffect-ignore-lighting-alpha75, d2keffect-ignore-lighting-alpha50, ra2effect-ignore-lighting-alpha90, ra2effect-ignore-lighting-alpha75, ra2effect-ignore-lighting-alpha50, tseffect-ignore-lighting-alpha75, tsunit-ignore-lighting-alpha75, ra2unit-ignore-lighting-alpha75, ra2unit-ignore-lighting-alpha90, tseffect-ignore-lighting-alpha90 PaletteFromFile@caneon: Name: caneon Filename: caneon.pal @@ -582,6 +538,15 @@ Name: scrin Filename: scrin.pal ShadowIndex: 4 + PaletteFromFile@scrincursor: + Name: scrincursor + Filename: scrin.pal + AllowModifiers: false + CursorPalette: true + PaletteFromFile@scrineffect: + Name: scrineffect + Filename: scrin.pal + ShadowIndex: 4 PaletteFromPaletteWithAlpha@scrin-nolite-alpha85: Name: scrin-ignore-lighting-alpha85 Alpha: 0.85 @@ -590,34 +555,22 @@ Name: scrin-ignore-lighting-alpha30 Alpha: 0.3 BasePalette: scrin - PlayerColorPalette@scrin: + PaletteFromPaletteWithAlpha@scrin-nolite-alpha15: + Name: scrin-ignore-lighting-alpha15 + Alpha: 0.15 BasePalette: scrin - BaseName: playerscrin - RemapIndex: 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95 OverlayPlayerColorPalette@scrin: BasePalette: scrin - Ramp: 0.14 - BaseName: overlayplayerscrin + BaseName: playerscrin RemapIndex: 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95 PaletteFromFile@chromescrin: Name: chromes Filename: scrin.pal ShadowIndex: 3 AllowModifiers: false - PaletteFromRGBA@suppression: - Name: suppression - R: 244 - G: 84 - B: 208 - A: 100 PaletteFromGimpOrJascFile@IonCloud: Name: ioncloud Filename: ioncloud.pal - PaletteFromPaletteWithAlpha@IonCloud-nolite-alpha50: - Name: ioncloud-ignore-lighting-alpha50 - Alpha: 0.1 - BasePalette: ioncloud - Premultiply: false PaletteFromGimpOrJascFile@ScrinShield: Name: scrinshield Filename: scrinshield.pal diff --git a/mods/ca/rules/player.yaml b/mods/ca/rules/player.yaml index 5b18e3f93a..6765fca8fd 100644 --- a/mods/ca/rules/player.yaml +++ b/mods/ca/rules/player.yaml @@ -1,99 +1,162 @@ ^BasePlayer: AlwaysVisible: Shroud: + PlayerResources: + ResourceValues: + Ore: 25 + Gems: 38 + Tiberium: 25 + BlueTiberium: 38 + BlackTiberium: 8 EditorPlayer: Inherits: ^BasePlayer Player: Inherits: ^BasePlayer + Inherits@TimeSkip: ^TimeSkipPower + Inherits@HeroesOfTheUnion: ^HeroesOfTheUnionPower + Inherits@TankDrop: ^TankDropPower + Inherits@KillZone: ^KillZonePower TechTree: - ClassicProductionQueue@Building: - Type: Building + ClassicProductionQueueCA@Building: + Type: BuildingSQ + Group: Building DisplayOrder: 0 - LowPowerModifier: 300 + LowPowerModifier: 250 ReadyAudio: ConstructionComplete + ReadyTextNotification: Construction complete. BlockedAudio: NoBuild + BlockedTextNotification: Unable to build more. LimitedAudio: BuildingInProgress + LimitedTextNotification: Unable to comply. Building in progress. QueuedAudio: Building OnHoldAudio: OnHold CancelledAudio: Cancelled - SpeedUp: False + SpeedUp: True + BuildTimeSpeedReduction: 100, 75, 60, 50 + BuildSpeedReductionExcludedTypes: cspk ClassicProductionQueue@Defense: - Type: Defense + Type: DefenseSQ + Group: Defense DisplayOrder: 1 - LowPowerModifier: 300 + LowPowerModifier: 250 ReadyAudio: ConstructionComplete + ReadyTextNotification: Construction complete. BlockedAudio: NoBuild + BlockedTextNotification: Unable to build more. LimitedAudio: BuildingInProgress + LimitedTextNotification: Unable to comply. Building in progress. QueuedAudio: Building OnHoldAudio: OnHold CancelledAudio: Cancelled - SpeedUp: False - ClassicProductionQueue@Vehicle: - Type: Vehicle + SpeedUp: True + BuildTimeSpeedReduction: 100, 75, 60, 50 + ClassicProductionQueueCA@Vehicle: + Type: VehicleSQ + Group: Vehicle DisplayOrder: 3 - LowPowerModifier: 300 + LowPowerModifier: 250 ReadyAudio: UnitReady BlockedAudio: NoBuild + BlockedTextNotification: Unable to build more. LimitedAudio: BuildingInProgress + LimitedTextNotification: Unable to comply. Building in progress. QueuedAudio: Building OnHoldAudio: OnHold CancelledAudio: Cancelled SpeedUp: True - BuildTimeSpeedReduction: 100, 80, 64, 52 - ClassicProductionQueue@Infantry: - Type: Infantry + BuildTimeSpeedReduction: 100, 75, 60, 50 + ClassicProductionQueueCA@Infantry: + Type: InfantrySQ + Group: Infantry DisplayOrder: 2 - LowPowerModifier: 300 + LowPowerModifier: 250 ReadyAudio: UnitReady BlockedAudio: NoBuild + BlockedTextNotification: Unable to build more. LimitedAudio: BuildingInProgress + LimitedTextNotification: Unable to comply. Building in progress. QueuedAudio: Training OnHoldAudio: OnHold CancelledAudio: Cancelled SpeedUp: True - BuildTimeSpeedReduction: 100, 83, 70, 60, 52 + BuildTimeSpeedReduction: 100, 80, 67, 57, 50 ClassicProductionQueue@Ship: - Type: Ship + Type: ShipSQ + Group: Ship DisplayOrder: 5 - LowPowerModifier: 300 + LowPowerModifier: 250 ReadyAudio: UnitReady BlockedAudio: NoBuild + BlockedTextNotification: Unable to build more. LimitedAudio: BuildingInProgress + LimitedTextNotification: Unable to comply. Building in progress. QueuedAudio: Building OnHoldAudio: OnHold CancelledAudio: Cancelled SpeedUp: True - BuildTimeSpeedReduction: 100, 80, 64, 52 + BuildTimeSpeedReduction: 100, 75, 60, 50 ClassicProductionQueueCA@Aircraft: - Type: Aircraft + Type: AircraftSQ + Group: Aircraft DisplayOrder: 4 - LowPowerModifier: 300 + LowPowerModifier: 250 ReadyAudio: UnitReady BlockedAudio: NoBuild + BlockedTextNotification: Unable to build more. LimitedAudio: BuildingInProgress + LimitedTextNotification: Unable to comply. Building in progress. QueuedAudio: Building OnHoldAudio: OnHold CancelledAudio: Cancelled SpeedUp: True - BuildTimeSpeedReduction: 100, 83, 70, 60, 52 + BuildTimeSpeedReduction: 100, 80, 67, 57, 50 + CombinedBuildSpeedReduction: true ClassicProductionQueue@Upgrade: Type: Upgrade + Group: Upgrade DisplayOrder: 6 - LowPowerModifier: 300 + LowPowerModifier: 250 ReadyAudio: UpgradeComplete + ReadyTextNotification: Upgrade complete. BlockedAudio: NoBuild + BlockedTextNotification: Unable to build more. LimitedAudio: BuildingInProgress + LimitedTextNotification: Unable to comply. Building in progress. QueuedAudio: Building OnHoldAudio: OnHold CancelledAudio: Cancelled SpeedUp: False + Production@Upgrade: + Produces: Upgrade + RequiresCondition: upgrades-available + Production@TimeSkip: + Produces: TimeSkip + GrantConditionOnPrerequisite@UpgradesAvailable: + Prerequisites: upgrades.producer + Condition: upgrades-available + GrantConditionOnPrerequisite@PoliciesAvailable: + Prerequisites: influence.level1 + Condition: upgrades-available + GrantConditionOnPrerequisite@DoctrinesAvailable: + Prerequisites: playerxp.level1 + Condition: upgrades-available + GrantConditionOnPrerequisite@CovenantsAvailable: + Prerequisites: covenant.level1 + Condition: upgrades-available + GrantConditionOnPrerequisite@AllegiancesAvailable: + Prerequisites: scrin.allegiances.available + Condition: upgrades-available PlaceBuilding: NewOptionsNotification: NewOptions CannotPlaceNotification: BuildingCannotPlaceAudio + NewOptionsTextNotification: New construction options. + CannotPlaceTextNotification: Cannot deploy here. SupportPowerManager: + SupportPowerInstanceManager: ScriptTriggers: + ScriptTriggersCA: MissionObjectives: WinNotification: Win LoseNotification: Lose @@ -101,13 +164,19 @@ Player: ConquestVictoryConditions: PowerManager: SpeechNotification: LowPower + TextNotification: Low power. + AdviceInterval: 15000 AllyRepair: PlayerResources: InsufficientFundsNotification: InsufficientFunds + InsufficientFundsTextNotification: Insufficient funds. CashTickUpNotification: CashTickUp CashTickDownNotification: CashTickDown + SelectableCash: 2500, 5000, 6000, 8000, 10000, 20000 + DefaultCash: 6000 + DefaultCashDropdownDisplayOrder: 1 DeveloperMode: - CheckboxDisplayOrder: 16 + CheckboxDisplayOrder: 14 Shroud: FogCheckboxEnabled: True FogCheckboxLocked: False @@ -115,80 +184,263 @@ Player: ExploredMapCheckboxEnabled: True LobbyPrerequisiteCheckbox@GLOBALBOUNTY: ID: bounty - Label: Kill Bounties - Description: Players receive cash bonuses when killing enemy units + Label: checkbox-kill-bounties.label + Description: checkbox-kill-bounties.description Enabled: True - DisplayOrder: 8 + DisplayOrder: 2 Prerequisites: global-bounty LobbyPrerequisiteCheckbox@GLOBALFACTUNDEPLOY: ID: factundeploy - Label: Redeployable MCVs - Description: Allows undeploying Construction Yard + Label: checkbox-redeployable-mcvs.label + Description: checkbox-redeployable-mcvs.description Enabled: True DisplayOrder: 7 Prerequisites: global-factundeploy LobbyPrerequisiteCheckbox@FORCESHIELD: ID: forceshield - Label: Force Shield - Description: Grants all factions the Force Shield support power + Label: checkbox-force-shield.label + Description: checkbox-force-shield.description Enabled: True - DisplayOrder: 12 + DisplayOrder: 10 Prerequisites: forceshield.enabled LobbyPrerequisiteCheckbox@NAVY: ID: navy - Label: Naval Units - Description: Enables naval units + Label: checkbox-naval-units.label + Description: checkbox-naval-units.description Enabled: True DisplayOrder: 13 Prerequisites: techlevel.navy LobbyPrerequisiteCheckbox@REVEALONFIRE: ID: revealonfire - Label: Reveal on Fire - Description: Units reveal themselves when firing + Label: checkbox-reveal-on-fire.label + Description: checkbox-reveal-on-fire.description Enabled: False - DisplayOrder: 14 + DisplayOrder: 11 Prerequisites: global.revealonfire LobbyPrerequisiteCheckbox@BALANCEDHARVESTING: ID: balancedharvesting - Label: Balanced Harvesting - Description: Enables dynamic harvester speed to account for the direction of resources relative to refineries + Label: checkbox-balanced-harvesting.label + Description: checkbox-balanced-harvesting.description Enabled: True - DisplayOrder: 15 + DisplayOrder: 4 Prerequisites: global.balancedharvesting + LobbyPrerequisiteCheckbox@FASTREGROWTH: + ID: fastregrowth + Label: checkbox-fast-regrowth.label + Description: checkbox-fast-regrowth.description + Enabled: False + DisplayOrder: 8 + Prerequisites: global.fastregrowth + LobbyPrerequisiteDropdown@QUEUETYPE: + ID: queuetype + Label: dropdown-queuetype.label + Description: dropdown-queuetype.description + DisplayOrder: 3 + Default: global.singlequeue + Values: + global.singlequeue: options-queuetype.singlequeue + global.multiqueuefull: options-queuetype.multiqueuefull + global.multiqueuescaled: options-queuetype.multiqueuescaled FrozenActorLayer: BaseAttackNotifier: + TextNotification: Base under attack. + AllyTextNotification: Our ally is under attack. + NotificationManager: PlayerStatistics: PlaceBeacon: ProvidesTechPrerequisite@infonly: - Name: Infantry Only + Name: options-tech-level.infantry-only Prerequisites: techlevel.infonly Id: infantryonly ProvidesTechPrerequisite@low: - Name: Low + Name: options-tech-level.low Prerequisites: techlevel.infonly, techlevel.low Id: low ProvidesTechPrerequisite@medium: - Name: Medium + Name: options-tech-level.medium Prerequisites: techlevel.infonly, techlevel.low, techlevel.medium Id: medium ProvidesTechPrerequisite@high: - Name: High + Name: options-tech-level.high Prerequisites: techlevel.infonly, techlevel.low, techlevel.medium, techlevel.high Id: high ProvidesTechPrerequisite@unrestricted: - Name: Super Weapons + Name: options-tech-level.unrestricted Prerequisites: techlevel.infonly, techlevel.low, techlevel.medium, techlevel.high, techlevel.unrestricted Id: unrestricted + ProvidesPrerequisite@allies: + Prerequisite: player.allies + Factions: allies, england, france, germany, usa + ProvidesPrerequisite@england: + Prerequisite: player.england + Factions: england + ProvidesPrerequisite@france: + Prerequisite: player.france + Factions: france + ProvidesPrerequisite@germany: + Prerequisite: player.germany + Factions: germany + ProvidesPrerequisite@usa: + Prerequisite: player.usa + Factions: usa + ProvidesPrerequisite@soviet: + Prerequisite: player.soviet + Factions: soviet, russia, ukraine, iraq, yuri + ProvidesPrerequisite@russia: + Prerequisite: player.russia + Factions: russia + ProvidesPrerequisite@ukraine: + Prerequisite: player.ukraine + Factions: ukraine + ProvidesPrerequisite@iraq: + Prerequisite: player.iraq + Factions: iraq + ProvidesPrerequisite@yuri: + Prerequisite: player.yuri + Factions: yuri + ProvidesPrerequisite@gdi: + Prerequisite: player.gdi + Factions: gdi, talon, zocom, eagle, arc + ProvidesPrerequisite@talon: + Prerequisite: player.talon + Factions: talon + ProvidesPrerequisite@zocom: + Prerequisite: player.zocom + Factions: zocom + ProvidesPrerequisite@eagle: + Prerequisite: player.eagle + Factions: eagle + ProvidesPrerequisite@arc: + Prerequisite: player.arc + Factions: arc + ProvidesPrerequisite@nod: + Prerequisite: player.nod + Factions: nod, blackh, marked, legion, shadow + ProvidesPrerequisite@blackh: + Prerequisite: player.blackh + Factions: blackh + ProvidesPrerequisite@marked: + Prerequisite: player.marked + Factions: marked + ProvidesPrerequisite@legion: + Prerequisite: player.legion + Factions: legion + ProvidesPrerequisite@shadow: + Prerequisite: player.shadow + Factions: shadow + ProvidesPrerequisite@scrin: + Prerequisite: player.scrin + Factions: scrin, reaper, traveler, harbinger, collector + ProvidesPrerequisite@reaper: + Prerequisite: player.reaper + Factions: reaper + ProvidesPrerequisite@traveler: + Prerequisite: player.traveler + Factions: traveler + ProvidesPrerequisite@harbinger: + Prerequisite: player.harbinger + Factions: harbinger + ProvidesPrerequisite@collector: + Prerequisite: player.collector + Factions: collector + ProvidesPrerequisite@BotPlayer: + Prerequisite: botplayer + RequiresCondition: botplayer + GrantConditionOnBotOwner@BotPlayer: + Condition: botplayer + Bots: brutal, vhard, hard, normal, easy, naval, campaign, dormant + ProvidesPrerequisite@GDIORPUPGC: + Prerequisite: gdiorupgc + Factions: gdi GrantConditionOnPrerequisiteManager: + GrantConditionOnPrerequisiteManagerCA: EnemyWatcher: - VeteranProductionIconOverlay: + ProductionIconOverlayManager: + Type: Veterancy Image: iconchevrons Sequence: veteran + ProductionIconOverlayManager@Upgrades: + Type: Upgrade + Image: upgradeiconoverlays + Sequence: complete + Palette: effect ResourceStorageWarning: - PlayerExperience: + TextNotification: Silos needed. + AdviceInterval: 40000 GameSaveViewportManager: PlayerRadarTerrain: GpsRadarWatcher: TeleportNetworkManager: Type: Wormhole RandomExit: true + AutoDeployManager: + CapturedFactionsManager: + UpgradesManager: + ProductionTracker: + PlayerConnectionStatus: + PopController: + ReclaimableExperiencePool: + Percentage: 50 + ReclaimableValueProducer: + Type: Cyborg + ProducerActors: tmpp + ActorToProduce: n1c + ProductionTypes: InfantrySQ, InfantryMQ, CyborgMQ + PlayerBountyPool: + PlayerExperience: + PlayerExperienceLevels: + Factions: soviet, russia, ukraine, iraq, yuri + LevelXpRequirements: 75, 250, 425 + LevelPrerequisites: playerxp.level1, playerxp.level2, playerxp.level3 + LevelUpTextNotification: You have gained a rank! You are now rank {0}. + LevelUpNotification: Promoted + LevelUpSound: PlayerRankUp + DummyActor: QueueUpdaterDummy + CountManager: + MaxCounts: + NodCovenant: 3 + ScrinAllegiance: 4 + ProvidesPrerequisitesOnTimeline: + Type: AlliedInfluence + Factions: allies, england, france, germany, usa + Prerequisites: + 4500: influence.level1 + 12000: influence.level2 + 22500: influence.level3 + PrerequisiteGrantedNotifications: + 4500: InfluenceLevel1 + 12000: InfluenceLevel2 + DummyActor: QueueUpdaterDummy + PrerequisiteGrantedSound: PlayerRankUp + ProvidesPrerequisite@FreeChronoMiner: + Prerequisite: charv.upgrade + RequiresPrerequisites: influence.level3, economy.policy + ProvidesPrerequisitesOnCount@NodCovenants: + Type: NodCovenant + Factions: nod, blackh, marked, legion, shadow + Prerequisites: + 1: covenant.level1 + 2: covenant.level2 + 3: covenant.level3 + CountReachedNotifications: + 1: CovenantsAvailable + CountReachedTextNotifications: + 1: Covenants are now available. + DummyActor: QueueUpdaterDummy + IncrementSound: PlayerRankUp + PermanentWhenReached: true + NotificationDelay: 40 + AddToUpgradesTab: true + ProvidesPrerequisitesOnCount@ScrinAllegiances: + Type: ScrinAllegiance + Factions: scrin, reaper, traveler, harbinger, collector + Prerequisites: + 4: scrin.allegiances.available + CountReachedNotifications: + 4: AllegianceDeclarationAvailable + CountReachedTextNotifications: + 4: Allegiance declaration available. + DummyActor: QueueUpdaterDummy + IncrementSound: PlayerRankUp + PermanentAfterUpgrades: loyalist.allegiance, rebel.allegiance, malefic.allegiance + NotificationDelay: 40 diff --git a/mods/ca/rules/powers.yaml b/mods/ca/rules/powers.yaml new file mode 100644 index 0000000000..75dfb98505 --- /dev/null +++ b/mods/ca/rules/powers.yaml @@ -0,0 +1,2410 @@ +^ForceShieldPower: + GrantExternalConditionPowerCA@FSHIELD: + OrderName: fshield + Icon: forceshield + ChargeInterval: 7500 + Condition: forceshield + ValidTargets: Structure + Duration: 250 + Prerequisites: ~forceshield.enabled + ExplosionWeapon: ForceShield + ExplosionDelay: 5 + AllowMultiple: false + Name: Force Shield + Description: Makes selected friendly structures temporarily invulnerable.\n\nWarning: Causes power failure. + OnFireSound: forceon.aud + DisplayTimerRelationships: Ally + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + InsufficientPowerSpeechNotification: InsufficientPower + EndChargeSpeechNotification: ForceShieldReady + EndChargeTextNotification: Force Shield ready. + DisplayRadarPing: True + Cursor: ability + PauseOnCondition: disabled || empdisable || being-warped + SupportPowerPaletteOrder: 40 + ShowSelectionBoxes: true + SelectionBoxColor: 0066ff + TargetTintColor: 0066ff40 + ShowTargetCircle: true + TargetCircleColor: 0066ff + Range: 3c0 + +^SendCashPower: + SendCashPower@SendCash: + OrderName: sendcash + Icon: sendcash + ChargeInterval: 1 + Name: Send Cash + Description: Sends up to $1000 to the owner of the target allied unit or structure.\n\n20% is deducted from the amount received. + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + Cursor: ability + SupportPowerPaletteOrder: 0 + Prerequisites: sendcash.enabled + TaxPercentage: 20 + +^TimeSkipPower: + ProduceActorPowerCA@TimeSkip: + OrderName: timeskip + Prerequisites: ~player.allies, ~!influence.level3 + Icon: timeskip + Type: TimeSkip + ChargeInterval: 125 + StartFullyCharged: true + Name: Time Skip + Description: Allocate funding for precise temporal manipulation to progress Allied technological and organizational advancement.\n\nAdvances influence progress by 1:00. + Actors: timeskip + SupportPowerPaletteOrder: 0 + SelectProducer: false + Cost: 800 + LaunchSound: timeskip.aud + +^VeilOfWarPower: + SpawnActorPowerCA@VeilOfWar: + Actor: veilofwar1 + OrderName: veilofwar + Icon: veilofwar + IconPalette: chrometd + Prerequisites: ~radar.england + ChargeInterval: 7500 + LifeTime: -1 + Name: Veil of War + Description: Creates an expanding area of shroud, reducing the vision and weapon range of enemy units and defenses. + LaunchSound: sscrambl.aud + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + InsufficientPowerSpeechNotification: InsufficientPower + EndChargeSpeechNotification: VeilOfWarReady + EndChargeTextNotification: Veil of War ready. + PauseOnCondition: disabled || empdisable || being-warped + DisplayRadarPing: True + Cursor: ability + AllowMultiple: false + EffectImage: empty + EffectSequence: idle + EffectPalette: tseffect-ignore-lighting-alpha75 + TargetCircleRange: 6c0 + TargetCircleColor: 999999AA + SupportPowerPaletteOrder: 50 + +^ClusterMinesPower: + AirstrikePowerCA@clustermines: + ChargeInterval: 6750 + Prerequisites: ~radar.france + Name: Cluster Mines + Description: Sends a cargo plane to drop a minefield at the target location. + OrderName: clustermine + UnitType: c17.clustermines + CameraActor: camera.paradrop + CameraRemoveDelay: 150 + QuantizedFacings: 8 + SquadSize: 1 + DisplayBeacon: true + BeaconPoster: cmineicon + Icon: cmines + ArrowSequence: arrow + ClockSequence: clock + CircleSequence: circles + UseDirectionalTarget: True + DirectionArrowAnimation: paradirection + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + EndChargeSpeechNotification: ClusterMinesReady + EndChargeTextNotification: Cluster Mines ready. + PauseOnCondition: disabled || empdisable || being-warped + SupportPowerPaletteOrder: 50 + +^TemporalIncursionPower: + DetonateWeaponPower@TEMPINC: + OrderName: tempinc + Prerequisites: atek.germany + Icon: tempinc + Cursor: ability + ChargeInterval: 7500 + Name: Temporal Incursion + ActivationDelay: 25 + Description: Summons reinforcements from the future. Units return to their origin time after a short time. + Weapon: TemporalIncursion + AirburstAltitude: 0c0 + AllowMultiple: false + CameraActor: camera.dummy + CameraRemoveDelay: 375 + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + InsufficientPowerSpeechNotification: InsufficientPower + EndChargeSpeechNotification: TemporalIncursionReady + EndChargeTextNotification: Temporal Incursion ready. + PauseOnCondition: disabled || empdisable || being-warped + DisplayRadarPing: True + LaunchSound: chrono2.aud + IncomingSound: chrono2.aud + Sequence: idle + SupportPowerPaletteOrder: 40 + +^StrafingRunPower: + ClassicAirstrikePower@Strafe: + OrderName: strafe + Squad: + 1: + UnitType: p51 + SpawnDelay: 20 + SpawnOffset: -1536,1024,0 + TargetOffset: -536,0,0 + 2: + UnitType: p51 + SpawnDelay: 0 + SpawnOffset: 0,0,0 + TargetOffset: 0,0,0 + 3: + UnitType: p51 + SpawnDelay: 20 + SpawnOffset: -1536,-1024,0 + TargetOffset: 536,0,0 + Prerequisites: ~aircraft.usa + Icon: strafe + ChargeInterval: 7500 + Name: Strafing Run + Description: Calls in P51 ground attack planes to perform strafing runs on the target. + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + EndChargeSpeechNotification: StrafingRunReady + EndChargeTextNotification: Strafing Run ready. + CameraActor: camera.paradrop + CameraRemoveDelay: 150 + QuantizedFacings: 8 + DisplayBeacon: true + BeaconPoster: strafe + ArrowSequence: arrow + ClockSequence: clock + CircleSequence: circles + UseDirectionalTarget: True + DirectionArrowAnimation: paradirection + Strikes: 3 + CircleDelay: 40 + SupportPowerPaletteOrder: 45 + +^GpsPower: + DummyGpsPower@NOFOG: + PauseOnCondition: disabled || empdisable || being-warped + RequiresCondition: !gps-launched && !fogenabled + Delay: 12000 + AnimationDuration: 375 + LaunchSpeechNotification: SatelliteLaunched + Condition: gps-launched + DummyGpsPower@FOG: + PauseOnCondition: disabled || empdisable || being-warped + RequiresCondition: !gps-launched && fogenabled + Delay: 3000 + AnimationDuration: 375 + LaunchSpeechNotification: SatelliteLaunched + Condition: gps-launched + ProduceActorPowerCA@SatelliteLaunched: + Actors: gps.satellite + Type: SpySatellite + ChargeInterval: 0 + OneShot: true + OrderName: ProduceActorSat + AutoFire: True + RequiresCondition: gps-launched && fogenabled + SupportPowerPaletteOrder: 35 + ProduceActorPowerCA@InitialSatelliteScan: + PauseOnCondition: disabled || empdisable || being-warped + Prerequisites: anyradar, ~!gps.satellite.firstscan, ~fogenabled + Name: Spy Satellite + Description: Periodically reveals the entire map for a short time (activated automatically). + Icon: gps + Actors: camera.satscan, gps.satellite.firstscan + Type: SpySatellite + ChargeInterval: 8250 + OrderName: InitialSatelliteScanPower + AutoFire: True + OneShot: True + DisplayTimerRelationships: Ally + SupportPowerPaletteOrder: 35 + ProduceActorPowerCA@SatelliteScan: + PauseOnCondition: disabled || empdisable || being-warped + Prerequisites: anyradar, ~gps.satellite, ~gps.satellite.firstscan, ~fogenabled + Name: Spy Satellite + Description: Periodically reveals the entire map for a short time (activated automatically). + Icon: gps + Actors: camera.satscan + Type: SpySatellite + ChargeInterval: 5250 + OrderName: SatelliteScanPower + AutoFire: True + DisplayTimerRelationships: Ally, Neutral, Enemy + SupportPowerPaletteOrder: 35 + ProduceActorPowerCA@SatelliteScanNoFog: + PauseOnCondition: disabled || empdisable || being-warped + Prerequisites: anyradar, ~!fogenabled + Name: Spy Satellite + Description: Permanently reveals the entire map (activated automatically). + Icon: gps + Actors: camera.satscan.oneshot + Type: SpySatellite + ChargeInterval: 12000 + OneShot: True + OrderName: SatelliteScanNoFogPower + AutoFire: True + DisplayTimerRelationships: Ally, Neutral, Enemy + SupportPowerPaletteOrder: 35 + +^TimeWarpPower: + GrantExternalConditionPowerCA@TimeWarp: + OrderName: TimeWarp + Icon: timewarp + Prerequisites: pdox.germany + Cursor: ability + ChargeInterval: 4500 + Name: Time Warp + Description: Disrupts time and space at the target location. Affected units & structures are frozen in time, unable to act, but immune to damage. + ExplosionWeapon: TimeWarp + Condition: being-warped + Duration: 375 + Range: 1c512 + ValidRelationships: Ally, Enemy, Neutral + AllowMultiple: false + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + InsufficientPowerSpeechNotification: InsufficientPower + BeginChargeSpeechNotification: ChronosphereCharging + EndChargeSpeechNotification: TimeWarpReady + EndChargeTextNotification: Time Warp ready. + PauseOnCondition: disabled || empdisable || being-warped + DisplayBeacon: True + ArrowSequence: arrow + ClockSequence: clock + CircleSequence: circles + BeaconPoster: timewarpicon + DisplayRadarPing: True + LaunchSound: chrono2.aud + IncomingSound: chrono2.aud + SupportPowerPaletteOrder: 25 + ShowSelectionBoxes: true + SelectionBoxColor: b6f4ff + ShowTargetCircle: true + TargetCircleColor: b6f4ff + +^CryostormPower: + SpawnActorPowerCA@Cryostorm: + Actor: cryostorm.init + OrderName: cryostorm + Icon: cryostorm + Prerequisites: ~sweden.coalition, ~alhq + ChargeInterval: 8250 + LifeTime: -1 + Name: Cryostorm + Description: Creates a turbulent area of extreme cold, reducing movement speed and increasing damage taken. + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + InsufficientPowerSpeechNotification: InsufficientPower + EndChargeSpeechNotification: CryostormReady + EndChargeTextNotification: Cryostorm ready. + IncomingSpeechNotification: CryostormWarning + IncomingTextNotification: Cryostorm approaching. + PauseOnCondition: disabled || empdisable || being-warped + DisplayRadarPing: True + Cursor: ability + AllowMultiple: false + TargetCircleRange: 4c682 + TargetCircleColor: 5bbde9cc + SupportPowerPaletteOrder: 25 + EffectImage: empty + EffectSequence: idle + EffectPalette: effect + DisplayBeacon: true + BeaconDuration: 125 + BeaconPoster: cryostorm + ArrowSequence: arrow + ClockSequence: clock + CircleSequence: circles + +^HeliosBombPower: + AirstrikePowerCA@HeliosBomb: + OrderName: heliosbomb + Prerequisites: ~greece.coalition, ~alhq + PauseOnCondition: disabled || empdisable || being-warped + Icon: heliosbomb + IconPalette: caneon + ChargeInterval: 10500 + Name: Helios Bomb + Description: Calls in a bomber which drops a Helios bomb, blinding units in a large area. + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + EndChargeSpeechNotification: HeliosBombReady + EndChargeTextNotification: Helios bomb ready. + CameraActor: camera.paradrop + CameraRemoveDelay: 150 + UnitType: galx.helios + QuantizedFacings: 8 + DisplayBeacon: true + BeaconPoster: a10airstrike + BeaconPosterPalette: temptd + SquadSize: 1 + SquadOffset: 0,1792,0 + ArrowSequence: arrow + ClockSequence: clockTD + CircleSequence: circles + UseDirectionalTarget: True + DirectionArrowAnimation: paradirection + SupportPowerPaletteOrder: 25 + TargetCircleRange: 8c0 + TargetCircleColor: ffff00AA + +^BlackSkyStrikePower: + MissileStrikePower@BlackSkyStrike: + MissileActor: bsky + Range: 6c0 + OrderName: blackskystrike + Prerequisites: ~korea.coalition, ~alhq + PauseOnCondition: disabled || empdisable || being-warped + Icon: bsky + IconPalette: chrome + ChargeInterval: 9000 + Name: Black Sky Strike + Description: Fires long range guided missiles at multiple ground targets prioritized by value. Tracking can be lost if targets move far enough from their initial location. + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + EndChargeSpeechNotification: BlackSkyStrikeReady + EndChargeTextNotification: Black Sky Strike ready. + IncomingSpeechNotification: BlackSkyStrikeWarning + IncomingTextNotification: Black Sky missiles approaching. + DisplayBeacon: true + SupportPowerPaletteOrder: 25 + ShowSelectionBoxes: true + SelectionBoxColor: ffffff + ShowTargetCircle: true + TargetCircleColor: ffffff + TargetTintColor: ffffff44 + ValidRelationships: Enemy, Neutral + LaunchSounds: bsky-fire.aud + MissileCount: 4 + MissilesPerLaunch: 1 + MaxTargets: 4 + ValidTargets: Vehicle, Infantry, Defense + SpawnFromDirection: Launcher + SpawnDistance: 96c0 + LaunchAltitude: 10c0 + PrioritizeTargetsBy: Value + +^ChronoshiftPower: + ChronoshiftPowerCA@chronoshift: + OrderName: Chronoshift + Prerequisites: !botplayer + PauseOnCondition: disabled || empdisable || being-warped + Duration: 600 + EnemyDuration: 400 + Icon: chrono + ChargeInterval: 4500 + Name: Chronoshift + Description: Teleports up to 9 selected vehicles to a targeted location, returning them to their original location after a short time.\n\n• If killed, units are returned with 20% health\n• Units with larger health pools take additional damage\n• Passengers cannot be unloaded\n• Enemy units are teleported for reduced duration + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + InsufficientPowerSpeechNotification: InsufficientPower + BeginChargeSpeechNotification: ChronosphereCharging + EndChargeSpeechNotification: ChronosphereReady + EndChargeTextNotification: Chronosphere ready. + LaunchSound: chrono2.aud + IncomingSound: chrono2.aud + KillCargo: false + DisplayRadarPing: True + Range: 4c512 + MaxTargets: 9 + InvalidTargetTypes: Husk, ChronoshiftImmune + DisplayTimerRelationships: Ally, Neutral, Enemy + SupportPowerPaletteOrder: 20 + ShowSelectionBoxes: true + HoverSelectionBoxColor: b6f4ff + ShowTargetCircle: true + TargetCircleColor: b6f4ff + TargetTintColor: b6f4ff33 + ShowDestinationCircle: true + WarpFromImage: chronobubble + WarpFromSequence: warpin + WarpToImage: chronobubble + WarpToSequence: warpout + WarpEffectPalette: ra2effect-ignore-lighting-alpha75 + DetonateWeaponPower@ChronoAI: + OrderName: Chronoshiftai + Prerequisites: botplayer + Icon: chrono + Cursor: ability + ChargeInterval: 7000 + Name: Chronoshift + ActivationDelay: 25 + Description: Teleports up to 9 selected vehicles to a targeted location, returning them to their original location after a short time.\n\n• If killed, units are returned with 20% health\n• Units with larger health pools take additional damage\n• Passengers cannot be unloaded\n• Enemy units are teleported for reduced duration + Weapon: ChronoAI + AirburstAltitude: 0c0 + AllowMultiple: false + CameraActor: camera + CameraRemoveDelay: 375 + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + InsufficientPowerSpeechNotification: InsufficientPower + BeginChargeSpeechNotification: ChronosphereCharging + EndChargeSpeechNotification: ChronosphereReady + EndChargeTextNotification: Chronosphere ready. + DisplayTimerRelationships: Ally, Neutral, Enemy + PauseOnCondition: disabled || empdisable || being-warped + DisplayRadarPing: True + LaunchSound: chrono2.aud + IncomingSound: chrono2.aud + SupportPowerPaletteOrder: 20 + +^LightningStormPower: + DetonateWeaponPower@LightningStorm: + OrderName: storm + Icon: storm + Cursor: ability + ChargeInterval: 13500 + Name: Lightning Storm + ActivationDelay: 50 + Description: Initiate a Lightning Storm which deals heavy damage over a large area. + Weapon: WeatherStormInit + AirburstAltitude: 5c768 + AllowMultiple: false + CameraActor: camera + CameraRemoveDelay: 425 + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + EndChargeSpeechNotification: StormReady + EndChargeTextNotification: Lightning Storm ready. + InsufficientPowerSpeechNotification: InsufficientPower + IncomingSpeechNotification: StormApproach + IncomingTextNotification: Lightning Storm approaching. + IncomingSound: sweaintr.aud + LaunchSound: sweaintr.aud + DisplayTimerRelationships: Ally, Neutral, Enemy + PauseOnCondition: disabled || empdisable || being-warped + DisplayBeacon: True + DisplayRadarPing: True + ArrowSequence: arrow + ClockSequence: clock + CircleSequence: circles + BeaconPoster: stormicon + TargetCircleRange: 6c512 + TargetCircleColor: 0000FF90 + ActiveCondition: active + PaletteEffectType: LightningStorm + SupportPowerPaletteOrder: 10 + +^SpyPlanePower: + AirstrikePowerCA@spyplane: + OrderName: spyplane + Icon: spyplane + Prerequisites: ~radar.soviet + PauseOnCondition: disabled || empdisable || being-warped + ChargeInterval: 3000 + Name: Spy Plane + Description: Dispatches a spy plane that reveals the target location for a limited time. + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + EndChargeSpeechNotification: SpyPlaneReady + EndChargeTextNotification: Spy Plane ready. + LaunchSound: spyplane.aud + CameraActor: camera.spyplane + CameraRemoveDelay: 150 + UnitType: u2 + QuantizedFacings: 8 + DisplayBeacon: true + BeaconPoster: camicon + ArrowSequence: arrow + ClockSequence: clock + CircleSequence: circles + UseDirectionalTarget: true + DirectionArrowAnimation: paradirection + SupportPowerPaletteOrder: 50 + TargetCircleRange: 9c0 + TargetCircleColor: 999999AA + +^ParatroopersPower: + ParatroopersPowerCA@paratroopers: + OrderName: paratroopers + UnitType: halo.paradrop + Prerequisites: ~support.paratroopers + PauseOnCondition: disabled || empdisable || being-warped + Icon: paratroopers + ChargeInterval: 7500 + Name: Paratroopers + Description: Dispatches a Halo transport to drop a squad of infantry anywhere on the map. + SquadSize: 1 + SquadOffset: 0,1792,0 + DropItems: E1,E1,E2,E3,E3,E1,E1,E1 + ReinforcementsArrivedSpeechNotification: ReinforcementsArrived + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + EndChargeSpeechNotification: ParatroopersReady + EndChargeTextNotification: Paratroopers ready. + AllowImpassableCells: false + QuantizedFacings: 8 + CameraActor: camera.paradrop + DisplayBeacon: true + BeaconPoster: pinficon + ArrowSequence: arrow + ClockSequence: clock + CircleSequence: circles + UseDirectionalTarget: True + DirectionArrowAnimation: paradirection + SupportPowerPaletteOrder: 50 + PrerequisiteDropItems: + imppara.upgrade: E1,E1,E1,E1,E2,E4,E3,E3,E3,E1,E1,E1,E1 + PrerequisiteSquadSizes: + imppara.upgrade: 2 + +^StormTroopersPower: + ParatroopersPowerCA@Russianparatroopers: + OrderName: stormtroopers + UnitType: halo.paradrop + Prerequisites: ~radar.russia + PauseOnCondition: disabled || empdisable || being-warped + Icon: stormtroopers + ChargeInterval: 9000 + Name: Storm-troopers + Description: Dispatches a Halo transport to drop a squad of Shock Troopers anywhere on the map. + SquadSize: 1 + SquadOffset: 0,1792,0 + DropItems: SHOK,SHOK,SHOK,SHOK,SHOK + ReinforcementsArrivedSpeechNotification: ReinforcementsArrived + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + EndChargeSpeechNotification: StormtroopersReady + EndChargeTextNotification: Stormtroopers ready. + AllowImpassableCells: false + QuantizedFacings: 8 + CameraActor: camera.paradrop + DisplayBeacon: true + BeaconPoster: pinficon + ArrowSequence: arrow + ClockSequence: clock + CircleSequence: circles + UseDirectionalTarget: True + DirectionArrowAnimation: paradirection + SupportPowerPaletteOrder: 50 + PrerequisiteGroupings: + ImprovedTeslaTroopers: impstorm.upgrade, ttrp.upgrade + PrerequisiteDropItems: + ImprovedTeslaTroopers: TTRP,TTRP,TTRP,TTRP,TTRP,TTRP,TTRP + impstorm.upgrade: SHOK,SHOK,SHOK,SHOK,SHOK,SHOK,SHOK,SHOK + ttrp.upgrade: TTRP,TTRP,TTRP,TTRP + PrerequisiteSquadSizes: + ImprovedTeslaTroopers: 2 + impstorm.upgrade: 2 + +^ParabombsPower: + AirstrikePowerCA@Russianparabombs: + OrderName: parabombs + Prerequisites: ~support.parabombs + PauseOnCondition: empdisable || being-warped + Icon: parabombs + ChargeInterval: 7500 + Name: Parabombs + Description: Calls in a Badger bomber which drops parachuted bombs on your target. + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + EndChargeSpeechNotification: ParabombsReady + EndChargeTextNotification: Parabombs ready. + CameraActor: camera.paradrop + CameraRemoveDelay: 150 + UnitType: badr.bomber + QuantizedFacings: 8 + DisplayBeacon: true + BeaconPoster: pbmbicon + SquadSize: 1 + SquadOffset: 0,1792,0 + ArrowSequence: arrow + ClockSequence: clock + CircleSequence: circles + UseDirectionalTarget: True + DirectionArrowAnimation: paradirection + SupportPowerPaletteOrder: 45 + +^CarpetBombPower: + AirstrikePowerCA@CarpetBomb: + OrderName: carpetbomb + Prerequisites: ~aircraft.ukraine + PauseOnCondition: empdisable || being-warped + Icon: carpetbomb + ChargeInterval: 10500 + Name: Carpet Bomb + Description: Calls in a squad of Badgers which drop bombs on your target. + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + EndChargeSpeechNotification: CarpetBombReady + EndChargeTextNotification: Carpet bombing ready. + CameraActor: camera.paradrop + CameraRemoveDelay: 150 + UnitType: badr.cbomber + QuantizedFacings: 8 + DisplayBeacon: true + BeaconPoster: a10airstrike + BeaconPosterPalette: temptd + SquadSize: 3 + ArrowSequence: arrow + ClockSequence: clockTD + CircleSequence: circles + UseDirectionalTarget: True + DirectionArrowAnimation: paradirection + SupportPowerPaletteOrder: 45 + +^AtomBombPower: + AirstrikePowerCA@Iraqiparabombs: + OrderName: atombomb + Prerequisites: ~aircraft.iraq + PauseOnCondition: empdisable || being-warped + Icon: abombair + ChargeInterval: 10500 + Name: Atomic Bomb + Description: Calls in a Badger bomber which drops an atom bomb on your target. + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + EndChargeSpeechNotification: AtomicBombReady + EndChargeTextNotification: Atomic bomb ready. + CameraActor: camera.paradrop + CameraRemoveDelay: 150 + UnitType: badr.nbomber + QuantizedFacings: 8 + DisplayBeacon: true + BeaconPoster: nukeicon + SquadSize: 1 + SquadOffset: 0,1792,0 + ArrowSequence: arrow + ClockSequence: clock + CircleSequence: circles + UseDirectionalTarget: True + DirectionArrowAnimation: paradirection + SupportPowerPaletteOrder: 45 + +^MutaBombPower: + AirstrikePowerCA@MutaBomb: + OrderName: mutabomb + Prerequisites: ~radar.yuri + PauseOnCondition: empdisable || being-warped + Icon: mutabomb + IconPalette: chromes + ChargeInterval: 6750 + Name: Genetic Mutation Bomb + Description: Calls in a Badger bomber which drops a genetic mutation bomb on your target, transforming infantry into Brutes under your control. + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + EndChargeSpeechNotification: GeneticMutationBombReady + EndChargeTextNotification: Genetic Mutation Bomb ready. + CameraActor: camera.paradrop + CameraRemoveDelay: 150 + UnitType: badr.mbomber + QuantizedFacings: 8 + DisplayBeacon: true + BeaconPoster: gmutation + BeaconPosterPalette: chromes + SquadSize: 1 + SquadOffset: 0,1792,0 + ArrowSequence: arrow + ClockSequence: clock + CircleSequence: circles + UseDirectionalTarget: True + DirectionArrowAnimation: paradirection + SupportPowerPaletteOrder: 50 + +^ChaosBombsPower: + AirstrikePowerCA@ChaosBombs: + OrderName: chaosbombs + Prerequisites: ~aircraft.yuri + PauseOnCondition: empdisable || being-warped + Icon: chaosbombs + ChargeInterval: 8250 + Name: Chaos Bombs + Description: Calls in a Badger bomber which drops parachuted chaos bombs on your target. + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + EndChargeSpeechNotification: ChaosBombsReady + EndChargeTextNotification: Chaos bombs ready. + CameraActor: camera.paradrop + CameraRemoveDelay: 150 + UnitType: badr.chaosbomber + QuantizedFacings: 8 + DisplayBeacon: true + BeaconPoster: pbmbicon + SquadSize: 1 + SquadOffset: 0,1792,0 + ArrowSequence: arrow + ClockSequence: clock + CircleSequence: circles + UseDirectionalTarget: True + DirectionArrowAnimation: paradirection + SupportPowerPaletteOrder: 45 + +^SovietRadarPowers: + Inherits@SPYPLANEPOWER: ^SpyPlanePower + Inherits@PARATROOPERSPOWER: ^ParatroopersPower + Inherits@STORMTROOPERSPOWER: ^StormTroopersPower + Inherits@MUTABOMBPOWER: ^MutaBombPower + ProvidesPrerequisiteValidatedFaction@paratroopers: + Factions: soviet, ukraine, iraq + Prerequisite: support.paratroopers + +^SovietBombingPowers: + Inherits@PARABOMBSPOWER: ^ParabombsPower + Inherits@CARPETBOMBPOWER: ^CarpetBombPower + Inherits@ATOMBOMBPOWER: ^AtomBombPower + Inherits@CHAOSBOMBPOWER: ^ChaosBombsPower + ProvidesPrerequisiteValidatedFaction@parabombs: + Factions: soviet, russia + Prerequisite: support.parabombs + +^AtomicAmmoPower: + GrantExternalConditionPowerCA@ATOMICAMMO: + Prerequisites: ~!player.iraq + OrderName: atomicammo + Icon: atomicammo + ChargeInterval: 4500 + Name: Atomic Shells + Condition: atomic-ammo + Range: 4c0 + MaxTargets: 5 + ShowTargetCount: true + ValidTargets: Vehicle + Duration: 1 + AllowMultiple: false + Description: Grants tanks a limited supply of atomic shells (also for a limited duration).\n\nAffects Soviet tanks only (Heavy/Rhino Tank, Lasher/Thrasher Tank, Siege Tank, Mammoth Tank, Overlord Tank, Apocalypse Tank, Nuke Cannon)\n\nNuke Cannon gains a neutron shell that kills vehicle crews. + OnFireSound: atomshell.aud + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + InsufficientPowerSpeechNotification: InsufficientPower + EndChargeSpeechNotification: AtomicShellsReady + EndChargeTextNotification: Atomic Shells ready. + DisplayRadarPing: True + Cursor: ability + PauseOnCondition: empdisable || being-warped + ActiveSequence: idle + SupportPowerPaletteOrder: 30 + ShowSelectionBoxes: true + SelectionBoxColor: ffee00 + ShowTargetCircle: true + TargetCircleColor: ffee00 + TargetTintColor: ffee0033 + PrioritizeByValue: true + GrantExternalConditionPowerCA@ATOMICAMMOIRAQ: + Prerequisites: ~player.iraq + OrderName: atomicammoiraq + Icon: atomicammo + ChargeInterval: 4500 + Name: Atomic Shells + Condition: atomic-ammo + Range: 4c0 + MaxTargets: 5 + ShowTargetCount: true + ValidTargets: Vehicle + Duration: 1 + AllowMultiple: false + Description: Grants tanks a limited supply of atomic shells (also for a limited duration).\n\nAffects Soviet tanks only (Heavy/Rhino Tank, Lasher/Thrasher Tank, Siege Tank, Mammoth Tank, Overlord Tank, Apocalypse Tank, Nuke Cannon)\n\nNuke Cannon gains a neutron shell that kills vehicle crews. + OnFireSound: atomshell.aud + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + InsufficientPowerSpeechNotification: InsufficientPower + EndChargeSpeechNotification: AtomicShellsReady + EndChargeTextNotification: Atomic Shells ready. + DisplayRadarPing: True + Cursor: ability + PauseOnCondition: empdisable || being-warped + ActiveSequence: idle + SupportPowerPaletteOrder: 30 + ShowSelectionBoxes: true + SelectionBoxColor: ffee00 + ShowTargetCircle: true + TargetCircleColor: ffee00 + TargetTintColor: ffee0033 + PrioritizeByValue: true + +^HeroesOfTheUnionPower: + GrantExternalConditionPowerCA@HEROESOFUNION: + OrderName: heroesofunion + Icon: heroes + ChargeInterval: 6000 + Name: Heroes of the Union + Condition: herooftheunion + Range: 3c512 + MaxTargets: 5 + ShowTargetCount: true + ValidTargets: HeroOfUnionTargetable + Duration: 0 + AllowMultiple: false + Description: Targeted basic infantry units become Heroes of the Union, significantly increasing their damage, speed, range and resilience.\n\nCan affect Rifle Infantry, Rocket Soldiers, Grenadiers and Flamethrowers. + Prerequisites: ~infantry.doctrine, playerxp.level2 + OnFireSound: heroes.aud + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + InsufficientPowerSpeechNotification: InsufficientPower + EndChargeSpeechNotification: HeroesOfTheUnionReady + EndChargeTextNotification: Heroes of the Union ready. + DisplayRadarPing: True + Cursor: ability + ActiveSequence: idle + SupportPowerPaletteOrder: 30 + ShowSelectionBoxes: true + SelectionBoxColor: ff0000 + TargetTintColor: ff000040 + ShowTargetCircle: true + TargetCircleColor: cc0000cc + +^TankDropPower: + ParatroopersPowerCA@TankDrop: + OrderName: tankdrop + SquadSize: 3 + UnitType: anto + Icon: tankdrop + ChargeInterval: 13500 + Name: Tank Drop + Description: Dispatches cargo planes to air drop tanks at the target location. + DropItems: 3tnk, 3tnk, 3tnk + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + AllowImpassableCells: false + EndChargeSpeechNotification: TankDropReady + EndChargeTextNotification: Tank Drop ready. + LaunchSpeechNotification: ReinforcementsArrived + IncomingSpeechNotification: EnemyUnitsApproaching + IncomingTextNotification: Enemy air drop detected. + CameraActor: camera.paradrop + DisplayBeacon: true + BeaconPoster: lrairdropicon + ArrowSequence: arrow + ClockSequence: clock + CircleSequence: circles + UseDirectionalTarget: True + DirectionArrowAnimation: paradirection + Prerequisites: ~armor.doctrine, playerxp.level2 + SupportPowerPaletteOrder: 30 + PrerequisiteGroupings: + AtomicThrasher: armor.doctrine, lasher.upgrade, atomicengines.upgrade + Thrasher: armor.doctrine, lasher.upgrade + AtomicRhino: armor.doctrine, atomicengines.upgrade + Rhino: armor.doctrine + AtomicLasher: lasher.upgrade, atomicengines.upgrade + Lasher: lasher.upgrade + Atomic: atomicengines.upgrade + PrerequisiteDropItems: + AtomicThrasher: 3tnk.rhino.atomicyuri, 3tnk.rhino.atomicyuri, 3tnk.rhino.atomicyuri + Thrasher: 3tnk.rhino.yuri, 3tnk.rhino.yuri, 3tnk.rhino.yuri + AtomicRhino: 3tnk.rhino.atomic, 3tnk.rhino.atomic, 3tnk.rhino.atomic + Rhino: 3tnk.rhino, 3tnk.rhino, 3tnk.rhino + AtomicLasher: 3tnk.atomicyuri, 3tnk.atomicyuri, 3tnk.atomicyuri + Lasher: 3tnk.yuri, 3tnk.yuri, 3tnk.yuri + Atomic: 3tnk.atomic, 3tnk.atomic, 3tnk.atomic + +^KillZonePower: + AirstrikePowerCA@KillZone: + OrderName: killzone + Prerequisites: ~arty.doctrine, playerxp.level2 + Icon: killzone + ChargeInterval: 4500 + Name: Kill Zone + Description: Calls in a Spy Plane which marks a target area. Any enemy units within it take increased damage. + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + EndChargeSpeechNotification: KillZoneReady + EndChargeTextNotification: Kill Zone ready. + CameraActor: camera.dummy + CameraRemoveDelay: 1 + UnitType: u2.killzone + QuantizedFacings: 8 + DisplayBeacon: true + BeaconPoster: killzone + SquadSize: 1 + SquadOffset: 0,1792,0 + ArrowSequence: arrow + ClockSequence: clock + CircleSequence: circles + UseDirectionalTarget: True + DirectionArrowAnimation: paradirection + SupportPowerPaletteOrder: 30 + TargetCircleRange: 8c0 + TargetCircleColor: cc0000cc + +^IronCurtainPower: + GrantExternalConditionPowerCA@IRONCURTAIN: + OrderName: ironcurtain + Icon: invuln + ChargeInterval: 4500 + ExplosionWeapon: IronCurtain + Name: supportpower-ironcurtain.name + Condition: invulnerability + Range: 4c0 + MaxTargets: 5 + MinTargets: 0 + ShowTargetCount: true + ValidTargets: Vehicle, Ship, Structure + InvalidTargets: IronCurtainImmune + Duration: 550 + AllowMultiple: false + Description: supportpower-ironcurtain.desc + OnFireSound: ironcur9.aud + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + InsufficientPowerSpeechNotification: InsufficientPower + EndChargeSpeechNotification: IronCurtainReady + EndChargeTextNotification: Iron Curtain ready. + BeginChargeSpeechNotification: IronCurtainCharging + DisplayRadarPing: True + Cursor: ability + PauseOnCondition: disabled || empdisable || being-warped + DisplayTimerRelationships: Ally, Neutral, Enemy + SupportPowerPaletteOrder: 20 + ShowTargetCircle: true + ShowSelectionBoxes: true + TargetTintColor: ff000033 + +^ABombPower: + NukePower@ABomb: + PauseOnCondition: disabled || empdisable || being-warped + Cursor: nuke + Icon: abomb + ChargeInterval: 13500 + Name: Atom Bomb + Description: Launches a devastating atomic bomb at the target location, dealing heavy damage over a large area. + BeginChargeSpeechNotification: AbombPrepping + EndChargeSpeechNotification: AbombReady + EndChargeTextNotification: A-bomb ready. + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + InsufficientPowerSpeechNotification: InsufficientPower + IncomingSound: nukelaunch.aud + IncomingSpeechNotification: AbombLaunchDetected + IncomingTextNotification: Atom Bomb launch detected. + LaunchSound: nukelaunch.aud + MissileWeapon: atomic + MissileImage: atomic + MissileDelay: 5 + SpawnOffset: 1c0,427,0 + DisplayTimerRelationships: Ally, Neutral, Enemy + DisplayBeacon: True + DisplayRadarPing: True + BeaconPoster: atomicon + CameraRange: 10c0 + CameraRemoveDelay: 50 + ArrowSequence: arrow + ClockSequence: clock + CircleSequence: circles + TrailImage: smokey2 + TrailSequences: idle + TrailPalette: tseffect-ignore-lighting-alpha75 + CircleRanges: 6c512 + CircleColor: BB0000AA + CircleBorderColor: 770000AA + SupportPowerPaletteOrder: 10 + +^ReconDronePower: + AirstrikePowerCA@uav: + OrderName: gdiuav + Prerequisites: ~radar.gdi, ~!player.arc + PauseOnCondition: disabled || empdisable || being-warped + Icon: uavicon + ChargeInterval: 3750 + Name: Recon Drone + Description: A drone flies across the map, revealing the area as it passes.\n\nDetects cloaked units. + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + EndChargeSpeechNotification: ReconDroneReady + EndChargeTextNotification: Recon Drone ready. + CameraActor: camera.spyplane + CameraRemoveDelay: 0 + UnitType: uav + QuantizedFacings: 32 + DisplayBeacon: true + BeaconPoster: lruavicon + ArrowSequence: arrow + ClockSequence: clock + CircleSequence: circles + UseDirectionalTarget: True + DirectionArrowAnimation: paradirection + SupportPowerPaletteOrder: 50 + AirstrikePowerCA@uavST: + OrderName: gdiuavarc + Prerequisites: ~radar.gdi, ~player.arc + PauseOnCondition: disabled || empdisable || being-warped + Icon: uavicon + ChargeInterval: 3000 + Name: Recon Drone + Description: A drone flies across the map, revealing the area as it passes.\n\nDetects cloaked units. + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + EndChargeSpeechNotification: ReconDroneReady + EndChargeTextNotification: Recon Drone ready. + CameraActor: camera.spyplane + CameraRemoveDelay: 0 + UnitType: uav + QuantizedFacings: 32 + DisplayBeacon: true + BeaconPoster: lruavicon + ArrowSequence: arrow + ClockSequence: clock + CircleSequence: circles + UseDirectionalTarget: True + DirectionArrowAnimation: paradirection + SupportPowerPaletteOrder: 50 + +^XODropPower: + ParatroopersPowerCA@xodrop: + OrderName: xodrop + Prerequisites: ~radar.talon + PauseOnCondition: disabled || empdisable || being-warped + Icon: xodrop + ChargeInterval: 9750 + Name: X-O Drop + UnitType: ocar.xo + Description: An Orca transport drops a squad of X-O Powersuits at the target location. + SquadSize: 1 + SquadOffset: 0,1792,0 + DropItems: XO,XO,XO + ReinforcementsArrivedSpeechNotification: ReinforcementsArrived + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + EndChargeSpeechNotification: XODropAvailable + EndChargeTextNotification: X-O Drop ready. + AllowImpassableCells: false + QuantizedFacings: 8 + CameraActor: camera.paradrop + DisplayBeacon: true + BeaconPoster: xodrop + ArrowSequence: arrow + ClockSequence: clock + CircleSequence: circles + UseDirectionalTarget: True + DirectionArrowAnimation: paradirection + SupportPowerPaletteOrder: 50 + +^DropPodsPower: + DropPodsPowerCA@Zocom: + OrderName: droppods + Cursor: ability + Prerequisites: ~radar.zocom + PauseOnCondition: disabled || empdisable || being-warped + Icon: droppods + IconPalette: chrometd + Name: Drop Pods + Description: Instantly deploys a small team of elite soldiers at the target location via orbital drop pods. + EndChargeSpeechNotification: DropPodsAvailable + EndChargeTextNotification: Drop Pods ready. + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + DisplayRadarPing: True + ChargeInterval: 4500 + Weapon: DropPodArrive + UnitTypes: POD, POD, POD, POD, POD2, POD2, POD3 + ExactUnits: true + PodScatter: 3 + EntryEffect: explosion + EntryEffectSequence: shock_wave + EntryEffectPalette: tseffect-ignore-lighting-alpha75 + SupportPowerPaletteOrder: 50 + +^ReinforcementsPower: + SpawnActorPower@GDIEagleDropzone: + Actor: FLARE.dropzone + Prerequisites: ~radar.eagle + PauseOnCondition: disabled || empdisable || being-warped + LifeTime: 280 + OrderName: dropzoneeagle + Icon: orcaca + IconPalette: chrometd + ChargeInterval: 6000 + Name: Reinforcements + Description: An Orca Carryall drops an APC containing an infantry squad at the target location. + EndChargeSpeechNotification: Reinforce + EndChargeTextNotification: Reinforcements ready. + LaunchSpeechNotification: ReinforcementsArrived + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + EffectImage: empty + EffectSequence: idle + EffectPalette: effect + SupportPowerPaletteOrder: 50 + BlockedCursor: move-blocked + +^GDIRadarPowers: + Inherits@RECONDRONEPOWER: ^ReconDronePower + Inherits@XODROPPOWER: ^XODropPower + Inherits@DROPPODSPOWER: ^DropPodsPower + Inherits@REINFORCEMENTSPOWER: ^ReinforcementsPower + +^InterceptorsPower: + InterceptorPower@AirDef: + OrderName: interceptors + Prerequisites: ~aircraft.gdi, techlevel.medium + PauseOnCondition: empdisable || being-warped + Icon: airsupport + ChargeInterval: 10500 + Name: Interceptors + Description: A squadron of Interceptors provides air cover over the target area, engaging any enemy aircraft within range. + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + EndChargeSpeechNotification: InterceptorsReady + EndChargeTextNotification: Interceptors ready. + CameraActor: camera + CameraRemoveDelay: 450 + UnitType: yf23.bomber + QuantizedFacings: 8 + DisplayBeacon: true + BeaconPoster: airsupport + SquadSize: 3 + ArrowSequence: arrow + ClockSequence: clock + CircleSequence: circles + UseDirectionalTarget: True + DirectionArrowAnimation: paradirection + GuardDuration: 500 + GuardRadius: 12c0 + TargetCircleColor: 99999988 + SupportPowerPaletteOrder: 45 + LaunchSound: interceptors.aud + IncomingSound: interceptors.aud + +^NaniteRepairPower: + GrantExternalConditionPowerCA@NREPAIR: + OrderName: nrepair + Icon: nrepair + ChargeInterval: 6750 + Condition: nrepair + Range: 4c512 + MaxTargets: 10 + ShowTargetCount: true + Duration: 625 + Prerequisites: ~gtek.arc + ExplosionWeapon: RepairFlash + ExplosionDelay: 5 + AllowMultiple: false + Name: Nanite Repair + Description: Repairs selected damaged vehicles over time. + OnFireSound: srepaira.aud + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + InsufficientPowerSpeechNotification: InsufficientPower + EndChargeSpeechNotification: NaniteRepairReady + EndChargeTextNotification: Nanite Repair ready. + DisplayRadarPing: True + Cursor: repair + PauseOnCondition: disabled || empdisable || being-warped + SupportPowerPaletteOrder: 40 + ShowSelectionBoxes: true + SelectionBoxColor: 00ddbb + ShowTargetCircle: true + TargetCircleColor: 00ddbb + TargetTintColor: 00ddbb40 + +^FirestormPower: + AttackOrderPowerCA@ROCKET: + OrderName: rocketbarrage + PauseOnCondition: empdisable || disabled || being-warped + Cursor: ability + Icon: fstorm + IconPalette: chrometd + ChargeInterval: 7500 + Name: Firestorm + Description: Fires a barrage of rockets at the target area. + BeginChargeSpeechNotification: FireStormOffline + EndChargeSpeechNotification: FireStormReady + EndChargeTextNotification: Firestorm Missiles ready. + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + InsufficientPowerSpeechNotification: InsufficientPower + RequiresCondition: tower-rocket + Prerequisites: ~techlevel.high + SupportPowerPaletteOrder: 30 + TargetCircleRadius: 4c512 + TargetCircleColor: ff660088 + DisplayTimerRelationships: Ally, Neutral, Enemy + DisplayBeacon: True + BeaconAssumedLaunchDelay: 45 + BeaconRemoveAdvance: 25 + BeaconAssumedProjectileSpeed: 220 + BeaconPoster: firestorm + BeaconPosterPalette: temptd + ArrowSequence: arrow + ClockSequence: clockTD + CircleSequence: circles + CameraRange: 10c0 + CameraRemoveDelay: 50 + CameraSpawnAdvance: 25 + +^AdvancedRadarPower: + GrantPrerequisiteChargeDrainPowerCA@RADAR: + OrderName: advradarorder + DischargeModifier: 600 + Prerequisite: scan-active + ChargeInterval: 4500 + Icon: arscan + IconPalette: chrometd + Name: Advanced Radar Scan + Description: Reveals the location of enemy structures & units through the fog of war. + RequiresCondition: tower-radar + PauseOnCondition: !radar-active || disabled || being-warped + LaunchSound: gradarup.aud + BeginChargeSound: gradardn.aud + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + InsufficientPowerSpeechNotification: InsufficientPower + EndChargeTextNotification: Advanced Radar Scan ready. + Prerequisites: ~techlevel.high + EarlyDeactivationPenalty: 1500 + SupportPowerPaletteOrder: 30 + +^NaniteShieldPower: + SpawnActorPowerCA@NSHIELD: + Actor: nshield + OrderName: nshieldorder + Icon: nshield + Prerequisites: ~techlevel.high + ChargeInterval: 6000 + LifeTime: 375 + Name: Nanite Shield + Description: Reduces the damage taken by all vehicles in the target area. + LaunchSound: srepaira.aud + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + InsufficientPowerSpeechNotification: InsufficientPower + BeginChargeSpeechNotification: NaniteShieldCharging + EndChargeSpeechNotification: NaniteShieldReady + EndChargeTextNotification: Nanite Shield ready. + PauseOnCondition: disabled || empdisable || being-warped + DisplayRadarPing: True + Cursor: ability + AllowMultiple: false + EffectImage: empty + EffectSequence: idle + EffectPalette: tseffect-ignore-lighting-alpha75 + RequiresCondition: tower-shield + TargetCircleRange: 6c0 + TargetCircleColor: 64a5dcbb + SupportPowerPaletteOrder: 30 + +^EmpMissilePower: + AttackOrderPowerCA@EMPMISSILE: + OrderName: empmissile + PauseOnCondition: empdisable || disabled || being-warped + Cursor: empmissile + Icon: empmissile + ChargeInterval: 4500 + Name: E.M. Missile + Description: Fires a Tomahawk missile which disables all mechanical units and structures on impact. + BeginChargeSpeechNotification: EMMissilePrepping + EndChargeSpeechNotification: EMMissileReady + EndChargeTextNotification: E.M. Missile ready. + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + InsufficientPowerSpeechNotification: InsufficientPower + DisplayTimerRelationships: Ally, Neutral, Enemy + SupportPowerPaletteOrder: 20 + TargetCircleRadius: 4c512 + TargetCircleColor: b2b2e888 + DisplayBeacon: True + BeaconAssumedLaunchDelay: 35 + BeaconRemoveAdvance: 25 + BeaconAssumedProjectileSpeed: 300 + BeaconPoster: emp + ArrowSequence: arrow + ClockSequence: clock + CircleSequence: circles + CameraRange: 10c0 + CameraRemoveDelay: 50 + CameraSpawnAdvance: 25 + +^SurgicalStrikePower: + IonCannonPower@SurgicalStrike: + OrderName: surgicalstrike + Prerequisites: ~eye.zocom + Icon: surgicalstrike + IconPalette: chrometd + ChargeInterval: 6000 + WeaponDelay: 3 + Name: Surgical Strike + EffectPalette: tdeffect-ignore-lighting-alpha85 + Description: Initiate an precision Ion Cannon strike which deals instant damage to a small area. + EndChargeSpeechNotification: SurgicalStrikeReady + EndChargeTextNotification: Surgical Strike ready. + IncomingSound: ion2.aud + LaunchSound: ion2.aud + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + InsufficientPowerSpeechNotification: InsufficientPower + DisplayRadarPing: True + DisplayTimerRelationships: Ally + DisplayBeacon: True + CameraActor: camera.paradrop + ArrowSequence: arrow + ClockSequence: clock + CircleSequence: circles + Cursor: ioncannon + PauseOnCondition: disabled || empdisable || being-warped + SupportPowerPaletteOrder: 15 + +^IonCannonPower: + DetonateWeaponPower@IonStorm: + OrderName: ioncannon + Icon: ioncannon + Cursor: ioncannon + ChargeInterval: 13500 + Name: Ion Cannon + ActivationDelay: 50 + Description: Initiate an Ion Cannon strike which deals heavy damage over a large area. + Weapon: IonStormInit + AirburstAltitude: 4c512 + AllowMultiple: false + CameraActor: camera + CameraRemoveDelay: 375 + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + BeginChargeSpeechNotification: IonCannonCharging + EndChargeSpeechNotification: IonCannonReady + EndChargeTextNotification: Ion Cannon ready. + InsufficientPowerSpeechNotification: InsufficientPower + IncomingSpeechNotification: IonCannonApproach + IncomingTextNotification: Ion cannon activated. + IncomingSound: nukelaunch.aud + LaunchSound: nukelaunch.aud + DisplayTimerRelationships: Ally, Neutral, Enemy + PauseOnCondition: disabled || empdisable || being-warped + DisplayBeacon: True + BeaconPoster: ioncannon + BeaconPosterPalette: temptd + DisplayRadarPing: True + ArrowSequence: arrow + ClockSequence: clockTD + CircleSequence: circles + TargetCircleRange: 6c512 + TargetCircleColor: 4fff3390 + SupportPowerPaletteOrder: 10 + +^NodAirdropPowers: + ParatroopersPowerCA@NodAirDrop: + OrderName: nodairdrop + SquadSize: 3 + UnitType: c17 + Icon: airdropicon + ChargeInterval: 13500 + Name: Air Drop + Description: Dispatches cargo planes to air drop tanks at the target location. + DropItems: ltnk, ftnk, ltnk + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + AllowImpassableCells: false + EndChargeSpeechNotification: Reinforce + EndChargeTextNotification: Air Drop ready. + LaunchSpeechNotification: ReinforcementsArrived + IncomingSpeechNotification: EnemyUnitsApproaching + IncomingTextNotification: Enemy air drop detected. + PauseOnCondition: empdisable || being-warped + CameraActor: camera.paradrop + DisplayBeacon: true + BeaconPoster: lrairdropicon + ArrowSequence: arrow + ClockSequence: clock + CircleSequence: circles + UseDirectionalTarget: True + DirectionArrowAnimation: paradirection + Prerequisites: vehicles.nod, !vehicles.blackh, !vehicles.marked, !vehicles.legion, !vehicles.shadow + SupportPowerPaletteOrder: 60 + ParatroopersPowerCA@blackhairdrop: + OrderName: blackhairdrop + SquadSize: 2 + UnitType: c17 + Icon: airdropicon + ChargeInterval: 13500 + Name: Air Drop + Description: Dispatches cargo planes to air drop flame tanks at the target location. + DropItems: hftk, hftk + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + AllowImpassableCells: false + EndChargeSpeechNotification: Reinforce + EndChargeTextNotification: Air Drop ready. + LaunchSpeechNotification: ReinforcementsArrived + IncomingSpeechNotification: EnemyUnitsApproaching + IncomingTextNotification: Enemy air drop detected. + PauseOnCondition: empdisable || being-warped + CameraActor: camera.paradrop + DisplayBeacon: true + BeaconPoster: lrairdropicon + ArrowSequence: arrow + ClockSequence: clock + CircleSequence: circles + UseDirectionalTarget: True + DirectionArrowAnimation: paradirection + Prerequisites: vehicles.blackh + SupportPowerPaletteOrder: 60 + DetonateWeaponPower@SubterraneanStrike: + OrderName: substrike + Icon: substrike + Prerequisites: vehicles.marked + Cursor: ability + ChargeInterval: 12000 + Name: Subterranean Strike + ActivationDelay: 250 + Description: Deploys a squad of Acolytes/Templar via Subterranean APC. + LaunchSound: subrumble.aud + Weapon: SubterraneanStrikeSpawner + AirburstAltitude: 0c0 + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + EndChargeSpeechNotification: Reinforce + EndChargeTextNotification: Subterranean Strike ready. + LaunchSpeechNotification: ReinforcementsArrived + IncomingSpeechNotification: EnemyUnitsApproaching + IncomingTextNotification: Enemy subterranean units detected. + PauseOnCondition: empdisable || being-warped + CameraActor: camera.dummy + CameraRemoveDelay: 1 + DisplayBeacon: True + BeaconPoster: substrike + DisplayRadarPing: True + SupportPowerPaletteOrder: 60 + ArrowSequence: arrow + ClockSequence: clock + CircleSequence: circles + ParatroopersPowerCA@shadowairdrop: + OrderName: shadowairdrop + SquadSize: 2 + UnitType: c17 + Icon: airdropicon + ChargeInterval: 13500 + Name: Air Drop + Description: Dispatches cargo planes to air drop stealth tanks at the target location. + DropItems: stnk.nod, stnk.nod + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + AllowImpassableCells: false + EndChargeSpeechNotification: Reinforce + EndChargeTextNotification: Air Drop ready. + LaunchSpeechNotification: ReinforcementsArrived + IncomingSpeechNotification: EnemyUnitsApproaching + IncomingTextNotification: Enemy air drop detected. + PauseOnCondition: empdisable || being-warped + CameraActor: camera.paradrop + DisplayBeacon: true + BeaconPoster: lrairdropicon + ArrowSequence: arrow + ClockSequence: clock + CircleSequence: circles + UseDirectionalTarget: True + DirectionArrowAnimation: paradirection + Prerequisites: vehicles.shadow + SupportPowerPaletteOrder: 60 + PrerequisiteDropItems: + hstk.upgrade: hstk, hstk + +^SatHackPower: + SpawnActorPowerCA@sathack: + Actor: camera.sathack + Prerequisites: ~radar.nod, ~!player.legion + LifeTime: 120 + OrderName: sathack + Icon: hacksat + ChargeInterval: 4500 + Name: Hack Satellite Uplink + Description: Reveals the targeted area for a short time. + LaunchSound: hacksat.aud + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + EndChargeSpeechNotification: SatelliteHackReady + EndChargeTextNotification: Satellite Hack ready. + PauseOnCondition: disabled || empdisable || being-warped + EffectImage: empty + EffectSequence: idle + EffectPalette: tseffect-ignore-lighting-alpha75 + TargetCircleRange: 9c512 + TargetCircleColor: 999999AA + SupportPowerPaletteOrder: 50 + SpawnActorPowerCA@sathacklegion: + Actor: camera.sathack + Prerequisites: ~radar.nod, ~player.legion + LifeTime: 120 + OrderName: sathacklegion + Icon: hacksat + ChargeInterval: 3000 + Name: Hack Satellite Uplink + Description: Reveals the targeted area for a short time. + LaunchSound: hacksat.aud + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + EndChargeSpeechNotification: SatelliteHackReady + EndChargeTextNotification: Satellite Hack ready. + PauseOnCondition: disabled || empdisable || being-warped + EffectImage: empty + EffectSequence: idle + EffectPalette: tseffect-ignore-lighting-alpha75 + TargetCircleRange: 9c512 + TargetCircleColor: 999999AA + SupportPowerPaletteOrder: 50 + +^InfernoBombPower: + AirstrikePowerCA@BlackhandFirebomb: + OrderName: infernobomb + Prerequisites: ~radar.blackh + Icon: infbomb + IconPalette: chrometd + ChargeInterval: 9750 + Name: Inferno Bomb + Description: A B2 Stealth Bomber drops inferno bombs on your target. + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + EndChargeSpeechNotification: InfernoBombReady + EndChargeTextNotification: Inferno Bomb ready. + CameraActor: camera.paradrop + CameraRemoveDelay: 150 + UnitType: b2b + QuantizedFacings: 8 + DisplayBeacon: true + BeaconPoster: a10airstrike + BeaconPosterPalette: temptd + SquadSize: 1 + SquadOffset: 0,1792,0 + ArrowSequence: arrow + ClockSequence: clockTD + CircleSequence: circles + UseDirectionalTarget: True + DirectionArrowAnimation: paradirection + PauseOnCondition: disabled || empdisable || being-warped + SupportPowerPaletteOrder: 50 + +^CashHackPower: + CashHackPower@Legion: + OrderName: cashhack + Icon: chack + ChargeInterval: 6000 + Minimum: 750 + Maximum: 2000 + Prerequisites: ~radar.legion + AllowMultiple: false + Name: Cash Hack + Description: Steal up to $2000 credits from a targeted enemy Refinery. + OnFireSound: scashhac.aud + Notification: CreditsStolen + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + InsufficientPowerSpeechNotification: InsufficientPower + EndChargeSpeechNotification: CashHackReady + EndChargeTextNotification: Cash Hack ready. + DisplayRadarPing: True + Cursor: ability + PauseOnCondition: disabled || empdisable || being-warped + SupportPowerPaletteOrder: 50 + +^ShadowTeamPower: + AirReinforcementsPower@ShadowTeam: + OrderName: shadowteam + Prerequisites: ~radar.shadow + Icon: shadteam + ChargeInterval: 6750 + Name: Shadow Team + Description: Calls for a Shadow Team; three stealth infantry that arrive via glider armed with grenades and a machine pistol.\n\nOperatives can be ordered to land via the deploy command. + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + LaunchSpeechNotification: ReinforcementsArrived + EndChargeSpeechNotification: ShadowTeamReady + EndChargeTextNotification: Shadow Team ready. + UnitType: sgli + QuantizedFacings: 8 + DisplayBeacon: false + SquadSize: 3 + SquadOffset: -1024,1024,0 + UseDirectionalTarget: True + DirectionArrowAnimation: paradirection + PauseOnCondition: disabled || empdisable || being-warped + SupportPowerPaletteOrder: 50 + +^ClusterMissilePower: + NukePower@Cluster: + OrderName: clustermissile + Icon: clustermissile + IconPalette: chrometd + Prerequisites: ~techlevel.high + Cursor: ability + ChargeInterval: 10500 + Name: Cluster Missile + Description: Launches a Cluster Missile which deals heavy damage at the target location. + EndChargeSpeechNotification: ClusMissileReady + EndChargeTextNotification: Cluster Missile ready. + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + InsufficientPowerSpeechNotification: InsufficientPower + IncomingSpeechNotification: ClusMissileWarning + IncomingTextNotification: Cluster Missile launch detected. + MissileWeapon: deathhand + MissileImage: deathhand + MissilePalette: temptd + LaunchSound: icbm1.aud + IncomingSound: icbm1.aud + SpawnOffset: 1024,80,0 + DetonationAltitude: 3c0 + RemoveMissileOnDetonation: True + FlightDelay: 225 + FlightVelocity: 0c624 + DisplayRadarPing: True + CameraRange: 10c0 + CameraRemoveDelay: 50 + ArrowSequence: arrow + ClockSequence: clockTD + CircleSequence: circles + PauseOnCondition: disabled || empdisable || being-warped + TrailImage: smokey2 + TrailSequences: idle + TrailPalette: tseffect-ignore-lighting-alpha75 + DisplayBeacon: True + BeaconPoster: clustermissile + BeaconPosterPalette: temptd + DisplayTimerRelationships: Ally + CircleRanges: 3c0 + CircleColor: BB0000AA + CircleBorderColor: 770000AA + SupportPowerPaletteOrder: 40 + +^FrenzyPower: + GrantExternalConditionPowerCA@Frenzy: + OrderName: frenzy + Icon: frenzy + Prerequisites: ~tmpl.marked + ChargeInterval: 6750 + ExplosionWeapon: Frenzy + Name: Frenzy + Condition: frenzyinit + Range: 2c512 + ValidRelationships: Ally + Duration: 750 + ActiveSequence: false-active + AllowMultiple: false + Description: Increases the movement speed and rate of fire of targeted units for a limited time.\n\nWarning: Units are weakened for a short time after frenzy wears off. + OnFireSound: nodfrenzy.aud + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + InsufficientPowerSpeechNotification: InsufficientPower + EndChargeSpeechNotification: FrenzyReady + EndChargeTextNotification: Frenzy ready. + DisplayRadarPing: True + Cursor: ability + PauseOnCondition: disabled || empdisable || being-warped + SupportPowerPaletteOrder: 40 + ShowTargetCircle: true + TargetCircleColor: ff7700 + TargetTintColor: ff770033 + +^TechnologyHackPower: + InfiltratePower@TechnologyHack: + Prerequisites: ~tmpl.legion + OrderName: techhack + Icon: techhack + ChargeInterval: 18000 + Name: Technology Hack + Description: Hack the targeted enemy production structure, providing access to a unit developed using enemy technology.\n\nFor infantry, vehicle and air production respectively: \n\n• Allies: Cryo Mortar, Reckoner, Phantom\n• Soviets: Cyberdog, Cyclops, Kamov\n• GDI: Sonic Mortar, Basilisk, Shade\n• Nod: Chem Mortar, Mantis, Vertigo\n• Scrin: Cyberscrin, Viper, Manticore + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + InsufficientPowerSpeechNotification: InsufficientPower + EndChargeSpeechNotification: TechHackReady + EndChargeTextNotification: Technology Hack ready. + LaunchSound: techhack.aud + SupportPowerPaletteOrder: 50 + Types: StealTechInfiltrate + StartFullyCharged: true + +^AssassinSquadPower: + ProduceActorPowerCA@AssassinSquad: + OrderName: assassinsquad + Prerequisites: wrath.covenant, ~!botplayer + Icon: assassinsquad + IconPalette: chrometd + Type: ParadropInfantry + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + ChargeInterval: 6000 + Name: Assassin Squad + Description: Deploy a squad of Assassins that can snipe infantry from long range and destroy buildings with C4.\n\nTarget infantry production structure to deploy. + Actors: assa, assa, assa + LaunchSpeechNotification: ReinforcementsArrived + EndChargeSpeechNotification: AssassinSquadReady + EndChargeTextNotification: Assassin Squad ready. + SupportPowerPaletteOrder: 50 + ProduceActorPowerCA@AssassinSquadAI: + OrderName: assassinsquadai + Prerequisites: wrath.covenant, ~botplayer + Icon: assassinsquad + IconPalette: chrometd + Type: ParadropInfantry + ChargeInterval: 6000 + Name: Assassin Squad (AI) + Description: Deploy a squad of Assassins that can destroy buildings and salvage technology. + Actors: assa, assa, assa + SupportPowerPaletteOrder: 50 + +^HackerCellPower: + ProduceActorPowerCA@HackerCell: + OrderName: hackercell + Prerequisites: unity.covenant, ~!botplayer + Icon: hackercell + Type: ParadropInfantry + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + ChargeInterval: 6000 + Name: Hacker Cell + Description: Deploy a squad of Hackers that can remotely capture buildings and take control of defenses.\n\nTarget infantry production structure to deploy. + Actors: hack, hack, hack + LaunchSpeechNotification: ReinforcementsArrived + EndChargeSpeechNotification: HackerCellReady + EndChargeTextNotification: Hacker Cell ready. + SupportPowerPaletteOrder: 50 + ProduceActorPowerCA@HackerCellAI: + OrderName: hackercellai + Prerequisites: unity.covenant, ~botplayer + Icon: hackercell + Type: ParadropInfantry + ChargeInterval: 6000 + Name: Hacker Cell (AI) + Description: Deploy a squad of Hackers that can remotely capture buildings and take control of defenses. + Actors: hack, hack, hack + SupportPowerPaletteOrder: 50 + SelectProducer: false + +^ConfessorCabalPower: + ProduceActorPowerCA@ConfessorCabal: + OrderName: confessorcabal + Prerequisites: zeal.covenant, ~!botplayer + Icon: confessorcabal + IconPalette: chrometd + Type: ParadropInfantry + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + ChargeInterval: 6000 + Name: Confessor Cabal + Description: Deploy a Confessor Cabal which is able to construct Idols of Kane that buffs allies and debuffs enemies.\n\nTarget infantry production structure to deploy. + Actors: conf, conf, conf + LaunchSound: conf-create.aud + EndChargeSpeechNotification: ConfessorCabalReady + EndChargeTextNotification: Confessor Cabal ready. + SupportPowerPaletteOrder: 50 + ProduceActorPowerCA@ConfessorCabalAI: + OrderName: confessorcabalai + Prerequisites: zeal.covenant, ~botplayer + Icon: confessorcabal + IconPalette: chrometd + Type: ParadropInfantry + ChargeInterval: 6000 + Name: Confessor Cabal (AI) + Description: Deploy a Confessor Cabal which is able to construct Idols of Kane that buffs allies and debuffs enemies. + Actors: conf, conf, conf + SupportPowerPaletteOrder: 50 + SelectProducer: false + +^TibStealthPower: + GrantExternalConditionPowerCA@SGEN: + OrderName: stealthgen + Icon: invis + IconPalette: chrometd + ChargeInterval: 4500 + ExplosionWeapon: StealthBubble + Name: Tiberium Stealth + Condition: tibstealth + ValidRelationships: Ally, Neutral, Enemy + Range: 3c512 + Duration: 600 + MaxAltitude: 1 + AllowMultiple: false + Description: Makes selected vehicles and structures temporarily invisible.\n\nWarning: Harmful to non-cyborg infantry.\n\nHazmat Suits upgrade makes allies immune to damage and enemies take 50% damage. + OnFireSound: cloak6.aud + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + InsufficientPowerSpeechNotification: InsufficientPower + BeginChargeSpeechNotification: ChemStealthCharging + EndChargeSpeechNotification: ChemStealthReady + EndChargeTextNotification: Stealth Generator ready. + DisplayRadarPing: True + Cursor: chemmissile + PauseOnCondition: disabled || empdisable || being-warped + DisplayTimerRelationships: Ally, Neutral, Enemy + ActiveCondition: active + SupportPowerPaletteOrder: 20 + ShowTargetCircle: true + TargetCircleColor: 00ff11 + TargetTintColor: 00ff1133 + +^ChemicalMissilePower: + NukePower@Chemmiss: + OrderName: chemmissile + Icon: chemmissile + IconPalette: chrometd + Cursor: chemmissile + ChargeInterval: 13500 + Name: Chemical Missile + Description: Launches an deadly Chemical Missile. Deals heavy damage and creates toxic clouds which are extremely harmful to infantry.\n + EndChargeSpeechNotification: ChemMissileReady + EndChargeTextNotification: Chemical Missile ready. + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + InsufficientPowerSpeechNotification: InsufficientPower + IncomingSpeechNotification: ChemMissileWarning + IncomingTextNotification: Chemical Missile launch detected. + MissileWeapon: Chemicbm + MissileImage: Chemicbm + MissileDelay: 5 + IncomingSound: nukelaunch.aud + LaunchSound: nukelaunch.aud + MissilePalette: temptd + DisplayTimerRelationships: Ally, Neutral, Enemy + DisplayBeacon: True + DisplayRadarPing: True + BeaconPoster: cmissile + SpawnOffset: 1000, 0, 0 + CameraRange: 10c0 + CameraRemoveDelay: 50 + ArrowSequence: arrow + ClockSequence: clock + CircleSequence: circles + PauseOnCondition: disabled || empdisable || being-warped + TrailImage: smokey2 + TrailSequences: idle + TrailPalette: tseffect-ignore-lighting-alpha75 + DetonationAltitude: 0 + CircleRanges: 6c512 + CircleColor: 00BB00AA + CircleBorderColor: 007700AA + SupportPowerPaletteOrder: 10 + +^IchorSpikePower: + DetonateWeaponPower@IchorSpike: + OrderName: ichorspike + Icon: ichorspike + IconPalette: chromes + Prerequisites: loyalist.allegiance + Cursor: ability + ChargeInterval: 6000 + Name: Ichor Spike + ActivationDelay: 1 + Description: Creates an Ichor Spike at the target location. Resources within its area of influence grow and spread faster.\n\nAlso empowers units with Resource Conversion upgrade. + LaunchSound: scrinbuild.aud + Weapon: IchorSpikeSpawner + AirburstAltitude: 0c0 + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + EndChargeSpeechNotification: IchorSpikeReady + EndChargeTextNotification: Ichor Spike ready. + CameraActor: camera.dummy + CameraRemoveDelay: 1 + DisplayRadarPing: True + SupportPowerPaletteOrder: 50 + TargetCircleRange: 8c0 + TargetCircleColor: 00ff00aa + +^ColonySpikePower: + DetonateWeaponPower@ColonySpike: + OrderName: colonyspike + Icon: colonyspike + IconPalette: chromes + Prerequisites: rebel.allegiance + Cursor: ability + ChargeInterval: 7500 + Name: Colony Spike + ActivationDelay: 1 + Description: Creates a Colony Spike at the target location. Enables production of non-defensive structures.\n\nWhen fully charged allows non-defensive structures to be built nearby.\n\nMust be built within range of a Colony Platform. + LaunchSound: cspk.aud + IncomingSound: cspk.aud + Weapon: ColonySpikeSpawner + AirburstAltitude: 0c0 + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + EndChargeSpeechNotification: ColonySpikeReady + EndChargeTextNotification: Colony Spike ready. + CameraActor: camera.dummy + CameraRemoveDelay: 1 + DisplayRadarPing: True + SupportPowerPaletteOrder: 50 + TargetMustBeInBuildRadius: true + TargetCircleRange: 6c0 + TargetCircleColor: ffffffa0 + +^VoidSpikePower: + DetonateWeaponPower@VoidSpike: + OrderName: voidspike + Icon: voidspike + IconPalette: chromes + Prerequisites: malefic.allegiance + Cursor: ability + ChargeInterval: 6000 + Name: Voidspike + ActivationDelay: 1 + Description: Creates a Voidspike at the target location. Gradually transforms nearby resources into Black Tiberium which is devoid of most of its useful properties.\n\nDamages nearby enemy units. + LaunchSound: scrinbuild.aud + Weapon: VoidSpikeSpawner + AirburstAltitude: 0c0 + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + EndChargeSpeechNotification: VoidSpikeReady + EndChargeTextNotification: Voidspike ready. + CameraActor: camera.dummy + CameraRemoveDelay: 1 + DisplayRadarPing: True + SupportPowerPaletteOrder: 50 + TargetCircleRange: 7c511 + TargetCircleColor: 471f8c90 + IncomingSound: malefic.aud + +^ResourceScanPower: + RevealActorsPower@RESOURCESCAN: + CameraActor: camera.resourcescan + TargetActors: mine, gmine, split2, split3, splitblue, proc, proc.td, proc.scrin + LifeTime: 250 + OrderName: resourcescan + Icon: rescanpower + ChargeInterval: 7500 + Name: Resource Scan + Description: Reveals the area surrounding all resources on the map. + LaunchSound: tibscan.aud + PauseOnCondition: disabled || empdisable || being-warped + EffectImage: empty + EffectSequence: idle + EffectPalette: tseffect-ignore-lighting-alpha75 + SupportPowerPaletteOrder: 50 + EndChargeSpeechNotification: ResourceScanReady + EndChargeTextNotification: Resource Scan ready. + +^StormSpikePower: + DetonateWeaponPower@STORMSPIKE: + OrderName: stormspike + Icon: stormspikepower + IconPalette: chromes + Prerequisites: radar.reaper + Cursor: ability + ChargeInterval: 7500 + Name: Storm Spike + ActivationDelay: 1 + Description: Creates a temporary Storm Column defensive structure at the target location. + LaunchSound: scrinbuild.aud + Weapon: StormSpikeSpawner + AirburstAltitude: 0c0 + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + EndChargeSpeechNotification: StormSpikeReady + EndChargeTextNotification: Storm Spike ready. + PauseOnCondition: disabled || empdisable || being-warped + CameraActor: camera.dummy + CameraRemoveDelay: 1 + DisplayRadarPing: True + SupportPowerPaletteOrder: 50 + TargetCircleRange: 7c511 + TargetCircleColor: b070ff90 + +^BuzzerSwarmPower: + DetonateWeaponPower@BUZZERSWARM: + OrderName: buzzerswarm + Icon: buzzpower + IconPalette: chromes + Prerequisites: radar.harbinger, !botplayer + Cursor: ability + ChargeInterval: 7500 + Name: Buzzer Swarm + ActivationDelay: 1 + Description: Spawns a controllable swarm which blinds and damages anything nearby; particularly harmful to infantry. + LaunchSound: buzzers-create.aud + Weapon: BuzzerSpawner + AirburstAltitude: 0c0 + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + EndChargeSpeechNotification: BuzzerSwarmReady + EndChargeTextNotification: Buzzer Swarm ready. + PauseOnCondition: disabled || empdisable || being-warped + CameraActor: camera.dummy + CameraRemoveDelay: 1 + DisplayRadarPing: True + SupportPowerPaletteOrder: 50 + DetonateWeaponPower@BUZZERSWARMAI: + OrderName: buzzerswarmai + Icon: buzzpower + IconPalette: chromes + Prerequisites: radar.harbinger, botplayer + Cursor: ability + ChargeInterval: 7500 + Name: Buzzer Swarm (AI) + ActivationDelay: 1 + Description: Spawns a controllable swarm which damages anything nearby; particularly harmful to infantry. + LaunchSound: buzzers-create.aud + Weapon: BuzzerSpawnerAI + AirburstAltitude: 0c0 + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + EndChargeSpeechNotification: BuzzerSwarmReady + EndChargeTextNotification: Buzzer Swarm ready. + PauseOnCondition: disabled || empdisable || being-warped + CameraActor: camera.dummy + CameraRemoveDelay: 1 + DisplayRadarPing: True + SupportPowerPaletteOrder: 50 + +^IonSurgePower: + DetonateWeaponPower@IONSURGE: + OrderName: ionsurge + Icon: ionsurgepower + IconPalette: chromes + Prerequisites: radar.traveler + Cursor: ability + ChargeInterval: 6750 + Name: Ion Surge + ActivationDelay: 1 + Description: Increases the movement speed of all friendly units passing through the target area. + LaunchSound: ionsurge.aud + Weapon: IonSurgeSpawner + AirburstAltitude: 0c0 + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + EndChargeSpeechNotification: IonSurgeReady + EndChargeTextNotification: Ion Surge ready. + PauseOnCondition: disabled || empdisable || being-warped + DisplayRadarPing: True + CameraActor: camera.dummy + CameraRemoveDelay: 1 + TargetCircleRange: 5c0 + TargetCircleColor: b070ff90 + SupportPowerPaletteOrder: 50 + +^IchorSeedPower: + SpawnActorPower@ICHORSEED: + OrderName: ichorseed + Icon: ichorpower + Actor: ichorseeder + Prerequisites: ~!player.reaper + ChargeInterval: 6000 + Name: Ichor Seed + LifeTime: -1 + AllowMultiple: false + Description: Grows Tiberium at selected location. + LaunchSound: ichorseed.aud + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + InsufficientPowerSpeechNotification: InsufficientPower + EndChargeSpeechNotification: IchorSeedReady + EndChargeTextNotification: Ichor Seed ready. + PauseOnCondition: disabled || empdisable || being-warped + EffectImage: empty + EffectSequence: idle + EffectPalette: tseffect-ignore-lighting-alpha75 + SupportPowerPaletteOrder: 40 + BlockedCursor: move-blocked + SpawnActorPower@ICHORSEEDREAPER: + OrderName: ichorseedreaper + Icon: ichorpower + Actor: ichorseeder + Prerequisites: ~player.reaper + ChargeInterval: 4800 + Name: Ichor Seed + LifeTime: -1 + AllowMultiple: false + Description: Grows Tiberium at selected location. + LaunchSound: ichorseed.aud + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + InsufficientPowerSpeechNotification: InsufficientPower + EndChargeSpeechNotification: IchorSeedReady + EndChargeTextNotification: Ichor Seed ready. + PauseOnCondition: disabled || empdisable || being-warped + EffectImage: empty + EffectSequence: idle + EffectPalette: tseffect-ignore-lighting-alpha75 + SupportPowerPaletteOrder: 40 + BlockedCursor: move-blocked + +^GreaterCoalescencePower: + DetonateWeaponPower@GREATERCOALESCENCE: + OrderName: greatercoalescence + Icon: grclpower + IconPalette: chromes + Prerequisites: scrt.collector + Cursor: ability + ChargeInterval: 6000 + Name: Greater Coalescence + ActivationDelay: 1 + Description: Spawns a controllable biomass which heals nearby allies and sustains itself by feeding off enemies.\n\nFeeding from power plants will shut them down temporarily. + LaunchSound: grcl-spawn.aud + Weapon: GreaterCoalescenceSpawner + AirburstAltitude: 0c0 + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + EndChargeSpeechNotification: GreaterCoalescenceReady + EndChargeTextNotification: Greater Coalescence ready. + PauseOnCondition: disabled || empdisable || being-warped + CameraActor: camera.dummy + CameraRemoveDelay: 1 + DisplayRadarPing: True + SupportPowerPaletteOrder: 40 + TargetCircleRange: 4c512 + TargetCircleColor: ff000099 + +^OverlordsWrathPower: + MeteorPower@OverlordsWrath: + OrderName: overlordswrath + Icon: owrath + IconPalette: chromes + Prerequisites: ~loyalist.allegiance, ~techlevel.high + Cursor: ability + ChargeInterval: 10500 + Name: Overlord's Wrath + Description: A Tiberium meteor strikes the target location dealing heavy damage and creating a patch of Tiberium. + EndChargeSpeechNotification: OverlordsWrathReady + EndChargeTextNotification: Overlord's Wrath ready. + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + InsufficientPowerSpeechNotification: InsufficientPower + IncomingSpeechNotification: OverlordsWrathWarning + IncomingTextNotification: Tiberium meteor approaching. + ImpactWeapon: OverlordsWrath + MeteorImage: tibmeteor + MeteorPalette: scrin + LaunchSound: owrath-launch.aud + IncomingSound: owrath-launch.aud + FlightDelay: 225 + FlightVelocity: 0c624 + DisplayRadarPing: True + CameraRange: 10c0 + CameraRemoveDelay: 50 + ArrowSequence: arrow + ClockSequence: clock + CircleSequence: circles + PauseOnCondition: disabled || empdisable || being-warped + DisplayBeacon: True + BeaconPoster: owrath + DisplayTimerRelationships: Ally + CircleRanges: 3c0 + CircleColor: 00FF00AA + CircleBorderColor: 003300AA + SupportPowerPaletteOrder: 30 + +^GatewayPower: + DetonateWeaponPower@Gateway: + OrderName: gateway + Icon: gateway + IconPalette: chromes + Prerequisites: ~rebel.allegiance, ~techlevel.high + Cursor: ability + ChargeInterval: 6000 + Name: Gateway + ActivationDelay: 1 + Description: Creates a Gateway at the target location. Acts as the exit for any\n targeted infantry or vehicle production structure.\n\nRequires target location to be within vision. + LaunchSound: wormhole-open.aud + IncomingSound: wormhole-open.aud + Weapon: GatewaySpawner + AirburstAltitude: 0c0 + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + EndChargeSpeechNotification: GatewayReady + EndChargeTextNotification: Gateway ready. + PauseOnCondition: disabled || empdisable || being-warped + CameraActor: camera.dummy + CameraRemoveDelay: 1 + DisplayRadarPing: True + SupportPowerPaletteOrder: 30 + TargetMustBeVisible: true + +^AnathemaPower: + GrantExternalConditionPowerCA@Anathema: + OrderName: anathema + Icon: anathema + IconPalette: chromes + ChargeInterval: 3000 + Name: Anathema + Condition: anathema + Range: 2c0 + MaxTargets: 1 + ValidTargets: AnathemaTargetable + Duration: 0 + AllowMultiple: false + Description: Targeted vehicle greatly increases in power over time. After 30 seconds the unit explodes. + Prerequisites: ~malefic.allegiance, ~techlevel.high + OnFireSound: anathema.aud + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + InsufficientPowerSpeechNotification: InsufficientPower + EndChargeSpeechNotification: AnathemaReady + EndChargeTextNotification: Anathema ready. + DisplayRadarPing: True + Cursor: ability + ActiveSequence: idle + SupportPowerPaletteOrder: 30 + ShowSelectionBoxes: true + SelectionBoxColor: 7e00f1 + TargetTintColor: 7e00f140 + +^SuppressionPower: + GrantExternalConditionPowerCA@SUPPRESSION: + PauseOnCondition: disabled || empdisable || being-warped + OrderName: suppression + Icon: spresspower + ChargeInterval: 4500 + Name: Suppression Field + Description: Applies a suppression field to the target area, slowing unit movement and rate of fire. + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + InsufficientPowerSpeechNotification: InsufficientPower + BeginChargeSpeechNotification: SuppressionCharging + EndChargeSpeechNotification: SuppressionReady + EndChargeTextNotification: Suppression Field ready. + DisplayRadarPing: True + Range: 3c0 + ShowTargetCircle: true + TargetTintColor: ff55ff33 + TargetCircleColor: ff55ffcc + OnFireSound: suppression.aud + DisplayTimerRelationships: Ally, Neutral, Enemy + Prerequisites: ~!player.collector + SupportPowerPaletteOrder: 20 + Condition: suppression + MaxAltitude: 4096 + MinTargets: 1 + ValidTargets: Ground, Air, AirSmall, Ship + ValidRelationships: Ally, Enemy, Neutral + Duration: 600 + AllowMultiple: false + Cursor: ability + ExplosionWeapon: SuppressionField + GrantExternalConditionPowerCA@SUPPRESSIONSIPHON: + PauseOnCondition: disabled || empdisable || being-warped + OrderName: suppressionsiphon + Icon: spresspower + ChargeInterval: 3750 + Name: Suppression Field + Description: Applies a suppression field to the target area, slowing unit movement and rate of fire. + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + InsufficientPowerSpeechNotification: InsufficientPower + BeginChargeSpeechNotification: SuppressionCharging + EndChargeSpeechNotification: SuppressionReady + EndChargeTextNotification: Suppression Field ready. + DisplayRadarPing: True + Range: 3c0 + ShowTargetCircle: true + TargetTintColor: ff55ff33 + TargetCircleColor: ff55ffcc + OnFireSound: suppression.aud + DisplayTimerRelationships: Ally, Neutral, Enemy + Prerequisites: ~player.collector + SupportPowerPaletteOrder: 20 + Condition: suppression + MaxAltitude: 4096 + MinTargets: 1 + ValidTargets: Ground, Air, AirSmall, Ship + ValidRelationships: Ally, Enemy, Neutral + Duration: 660 + AllowMultiple: false + Cursor: ability + ExplosionWeapon: SuppressionField + +^RiftPower: + DetonateWeaponPower@RiftGenerator: + OrderName: rift + Icon: riftpower + Cursor: ability + ChargeInterval: 13500 + Name: Rift + ActivationDelay: 75 + Description: Initiate a Rift which deals heavy damage over time to a large area. + Weapon: RiftInit + AllowMultiple: false + CameraActor: camera.dummy + CameraRemoveDelay: 375 + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + EndChargeSpeechNotification: RiftReady + EndChargeTextNotification: Rift Generator ready. + InsufficientPowerSpeechNotification: InsufficientPower + IncomingSpeechNotification: RiftWarning + IncomingTextNotification: Rift Generator activated. + IncomingSound: nukelaunch.aud + LaunchSound: nukelaunch.aud + DisplayTimerRelationships: Ally, Neutral, Enemy + PauseOnCondition: disabled || empdisable || being-warped + DisplayBeacon: True + DisplayRadarPing: True + ArrowSequence: arrow + ClockSequence: clock + CircleSequence: circles + BeaconPoster: riftpower + TargetCircleRange: 6c512 + TargetCircleColor: 0000FF90 + ActiveCondition: active + PaletteEffectType: Rift + SupportPowerPaletteOrder: 10 + +^FleetRecallPower: + RecallPower@Recall: + OrderName: Recall + PauseOnCondition: disabled || empdisable || being-warped + Icon: fleetrecall + IconPalette: chromes + ChargeInterval: 5250 + Name: Fleet Recall + KeepFormation: true + Description: Recalls all selected Scrin fleet vessels back to the Signal Transmitter.\n\nApplies to: Mothership, Planetary Assault Carrier, Devastator + SelectTargetSpeechNotification: SelectTarget + SelectTargetTextNotification: Select target. + InsufficientPowerSpeechNotification: InsufficientPower + EndChargeSpeechNotification: FleetRecallReady + EndChargeTextNotification: Fleet Recall ready. + LaunchSound: fleetrecall.aud + IncomingSound: fleetrecall.aud + KillCargo: false + DisplayRadarPing: True + Range: 10c0 + ValidTargetTypes: FleetRecallable + InvalidTargetTypes: Husk + SupportPowerPaletteOrder: 30 + ShowSelectionBoxes: true + SelectionBoxColor: 9500ff + ShowTargetCircle: true + TargetCircleColor: 9500ff + TargetTintColor: 9500ff33 + WarpFromImage: fleetrecall + WarpFromSequence: idle + WarpToImage: fleetrecall + WarpToSequence: idle + WarpEffectPalette: scrineffect + +# Providers + +assassinsquad.provider: + Inherits@DUMMY: ^InvisibleDummy + Inherits@AssassinSquad: ^AssassinSquadPower + UpdatesSupportPowerTimer: + OrderName: assassinsquad + InitialOnly: true + Ticks: 3750 + +hackercell.provider: + Inherits@DUMMY: ^InvisibleDummy + Inherits@HackerCell: ^HackerCellPower + UpdatesSupportPowerTimer: + OrderName: hackercell + InitialOnly: true + Ticks: 3750 + +confessorcabal.provider: + Inherits@DUMMY: ^InvisibleDummy + Inherits@ConfessorCabal: ^ConfessorCabalPower + UpdatesSupportPowerTimer: + OrderName: confessorcabal + InitialOnly: true + Ticks: 3750 + +ichorspike.provider: + Inherits@DUMMY: ^InvisibleDummy + Inherits@IchorSpike: ^IchorSpikePower + UpdatesSupportPowerTimer: + OrderName: ichorspike + InitialOnly: true + Ticks: 75 + +colonyspike.provider: + Inherits@DUMMY: ^InvisibleDummy + Inherits@ColonySpike: ^ColonySpikePower + UpdatesSupportPowerTimer: + OrderName: colonyspike + InitialOnly: true + Ticks: 750 + +voidspike.provider: + Inherits@DUMMY: ^InvisibleDummy + Inherits@VoidSpike: ^VoidSpikePower + UpdatesSupportPowerTimer: + OrderName: voidspike + InitialOnly: true + Ticks: 750 diff --git a/mods/ca/rules/scrin.yaml b/mods/ca/rules/scrin.yaml index 287607ade5..333bc531da 100644 --- a/mods/ca/rules/scrin.yaml +++ b/mods/ca/rules/scrin.yaml @@ -2,13 +2,17 @@ ^ScrinBuilding: Inherits@1: ^Building RenderSprites: - PlayerPalette: overlayplayerscrin + PlayerPalette: playerscrin SpawnActorOnDeath: Actor: s1 - SpawnActorsOnSell: + SpawnActorsOnSellCA: ActorTypes: s1 + GuaranteedActorTypes: s1, s1 + -SpawnRandomActorOnDeath: Building: BuildSounds: scrinbuild.aud + Encyclopedia: + Category: Scrin/Buildings INFANTRY.SCRIN: AlwaysVisible: @@ -26,46 +30,51 @@ VEHICLES.SCRIN: Buildable: Description: Vehicle Production +^OnResourceConditions: + ExternalCondition@RESCONVTIB: + Condition: on-tib + ExternalCondition@RESCONVORE: + Condition: on-ore + ExternalCondition@RESCONVBLUETIB: + Condition: on-bluetib + ExternalCondition@RESCONVGEMS: + Condition: on-gems + GrantCondition@RESCONV: + Condition: on-resource + RequiresCondition: on-tib || on-ore || on-bluetib || on-gems + GrantConditionOnTerrain@RESCONVTIB: + Condition: on-tib + TerrainTypes: Tiberium + GrantConditionOnTerrain@RESCONVORE: + Condition: on-ore + TerrainTypes: Ore + GrantConditionOnTerrain@RESCONVBLUETIB: + Condition: on-bluetib + TerrainTypes: BlueTiberium + GrantConditionOnTerrain@RESCONVGEMS: + Condition: on-gems + TerrainTypes: Gems + ^ResourceConversion: + Inherits: ^OnResourceConditions AmmoPool@RESCONV: - Ammo: 65 + Ammo: 5 InitialAmmo: 0 AmmoCondition: ammo Armaments: primary-charged ReloadAmmoPool@RESCONV: - Count: 13 + Count: 1 Delay: 25 RequiresCondition: charging-on-resource - ReloadAmmoPoolCA@RESCONVDRAIN: - Count: -13 - Delay: 500 - RequiresCondition: !charging-on-resource && !charged-fire - ShowSelectionBar: false - ResetOnFire: true WithAmmoPipsDecoration@RESCONV: PipCount: 5 RequiresCondition: ammo RequiresSelection: true Position: BottomLeft Margin: 4, 3 - GrantConditionOnTerrain@RESCONV: - Condition: on-resource - TerrainTypes: Tiberium, BlueTiberium, Ore, Gems - GrantCondition@RESCONV: + GrantCondition@RESCONVCHARGE: Condition: charging-on-resource - RequiresCondition: resconv-upgrade && on-resource && (ammo < 65 || charged-fire) - GrantConditionOnTerrain@RESCONVTIB: - Condition: on-tib - TerrainTypes: Tiberium - GrantConditionOnTerrain@RESCONVORE: - Condition: on-ore - TerrainTypes: Ore - GrantConditionOnTerrain@RESCONVBLUETIB: - Condition: on-bluetib - TerrainTypes: BlueTiberium - GrantConditionOnTerrain@RESCONVGEMS: - Condition: on-gems - TerrainTypes: Gems + RequiresCondition: resconv-upgrade && on-resource && (ammo < 5 || charged-fire) GrantConditionOnAttack@PRIMARY: ArmamentNames: primary Condition: uncharged-fire @@ -119,24 +128,306 @@ VEHICLES.SCRIN: DamageCooldown: 250 RequiresCondition: regen-upgrade +^ScrinShields: + Shielded: + MaxStrength: 8000 + RegenDelay: 350 + RegenAmount: 250 + RegenInterval: 5 + ShieldsUpCondition: shields-up + RequiresCondition: shields-upgrade && !empdisable + SelectionBarColor: ead6ff + Targetable@SHIELDS: + TargetTypes: Shielded + RequiresCondition: shields-up + Targetable@ShieldedBlindImmune: + TargetTypes: BlindImmune + RequiresCondition: shields-up + GrantConditionOnPrerequisite@SHIELDS: + Condition: shields-upgrade + Prerequisites: shields.upgrade + WithFacingSpriteBody@SHIELDS: + Name: shield + Sequence: shield + Palette: scrinshield-ignore-lighting-alpha50 + RequiresCondition: shields-upgrade && shields-up + SpeedMultiplier@SHIELDWARP: + Modifier: 25 + RequiresCondition: shield-warped + ExternalCondition@SHIELDWARP: + Condition: shield-warped + WithColoredOverlay@SHIELDWARP: + RequiresCondition: shield-warped + Color: 51aeda38 + WithIdleOverlay@TEMPORAL: + RequiresCondition: being-warped || shield-warped + +^MothershipRearmable: + Targetable@MothershipRearmable: + TargetTypes: MothershipRearmable + RequiresCondition: ammo < 15 + ReloadAmmoPool@MothershipRearmable: + Count: 3 + Delay: 75 + RequiresCondition: mshp-rearm + ExternalCondition@MothershipRearmable: + Condition: mshp-rearm + +^FleetRecallable: + Targetable@FleetRecallable: + TargetTypes: FleetRecallable + +^IonConduits: + GrantConditionOnPrerequisite@IONCON: + Condition: ioncon-upgrade + Prerequisites: ioncon.upgrade + Targetable@StormBoost: + TargetTypes: StormBoost + AmbientSoundCA@IONSTORM: + SoundFiles: ionstorm.aud + Delay: 0 + Interval: 850 + VolumeMultiplier: 0.4 + RequiresCondition: storm-level + AmbientSoundCA@AMBIENCE: + SoundFiles: thunder1.aud, thunder2.aud, thunder3.aud, thunder4.aud, thunder5.aud, thunder.ambient.aud + Delay: 20, 200 + Interval: 250, 1250 + VolumeMultiplier: 0.3 + RequiresCondition: storm-level + LaysMinefield@IONSTORM: + Mines: strm, strm, strm.live + MineSelectionMode: Shuffled + Locations: 0,1, 1,0, -1,0 + RecreationInterval: 150 + RequiresCondition: storm-level + GrantConditionOnAttackCA@IONSTORM: + Condition: storm-active + RevokeDelay: 75 + RequiresCondition: ioncon-upgrade + GrantConditionOnDamage@IONSTORM: + Condition: storm-active + Duration: 75 + RequiresCondition: ioncon-upgrade && !empdisable + ValidRelationships: Ally, Enemy, Neutral + GrantStackingCondition@IONSTORM: + Condition: storm-level + DelayPerInstance: 120 + MaximumInstances: 3 + RevokeDelay: 200 + RequiresCondition: storm-active + RangeMultiplier@IONSTORM1: + Modifier: 105 + RequiresCondition: storm-level == 1 + FirepowerMultiplier@IONSTORM1: + Modifier: 110 + RequiresCondition: storm-level == 1 + DamageMultiplier@IONSTORM1: + Modifier: 95 + RequiresCondition: storm-level == 1 + RangeMultiplier@IONSTORM2: + Modifier: 110 + RequiresCondition: storm-level == 2 + FirepowerMultiplier@IONSTORM2: + Modifier: 115 + RequiresCondition: storm-level == 2 + DamageMultiplier@IONSTORM2: + Modifier: 90 + RequiresCondition: storm-level == 2 + RangeMultiplier@IONSTORM3: + Modifier: 115 + RequiresCondition: storm-level == 3 + FirepowerMultiplier@IONSTORM3: + Modifier: 120 + RequiresCondition: storm-level == 3 + DamageMultiplier@IONSTORM3: + Modifier: 85 + RequiresCondition: storm-level == 3 + WithDecoration@IONSTORM1: + Image: pips + Sequence: pip-ion1 + Palette: scrin + Position: BottomLeft + Margin: -6, 3 + RequiresCondition: storm-level == 1 + WithDecoration@IONSTORM2: + Image: pips + Sequence: pip-ion2 + Palette: scrin + Position: BottomLeft + Margin: -6, 3 + RequiresCondition: storm-level == 2 + WithDecoration@IONSTORM3: + Image: pips + Sequence: pip-ion3 + Palette: scrin + Position: BottomLeft + Margin: -6, 3 + RequiresCondition: storm-level == 3 + +^Hypercharge: + GrantConditionOnPrerequisite@HYPERCHARGE: + Condition: hyper-upgrade + Prerequisites: hyper.upgrade + GrantTimedConditionOnDeploy@HYPERCHARGE: + DeployedTicks: 100 + CooldownTicks: 500 + DeployedCondition: hypercharged + ChargingCondition: hyperchargedebuff + ShowSelectionBar: true + ShowSelectionBarWhenFull: false + StartsFullyCharged: true + PauseOnCondition: being-warped || empdisable + DischargingColor: b396f3 + ChargingColor: 8450f8 + DeploySound: hypercharge.aud + RequiresCondition: hyper-upgrade + DischargeOnAttack: true + MaxTicksBeforeDischarge: 375 + Instant: true + WithPalettedOverlay@HYPERCHARGE: + RequiresCondition: hypercharged && !(empdisable || invulnerability || invisibility) + Palette: hypercharge + WithIdleOverlay@HYPERCHARGE: + Sequence: emp-overlay + Palette: ionsurgeoverlay + RequiresCondition: hypercharged + IsDecoration: True + WithPalettedOverlay@HYPERCHARGEDEBUFF: + Palette: darkened + RequiresCondition: hyperchargedebuff + DamageMultiplier@HYPERCHARGEDEBUFF: + Modifier: 120 + RequiresCondition: hypercharged + SpeedMultiplier@HYPERCHARGEDEBUFF: + Modifier: 75 + RequiresCondition: hyperchargedebuff + FirepowerMultiplier@HYPERCHARGEDEBUFF: + Modifier: 80 + RequiresCondition: hyperchargedebuff + ReloadDelayMultiplier@HYPERCHARGEDEBUFF: + Modifier: 150 + RequiresCondition: hyperchargedebuff + FirepowerMultiplier@HyperAnathema: + Modifier: 35 + RequiresCondition: hypercharged && anathema > 1 + +^Anathema: + GrantStackingCondition@Anathema: + Condition: anathema + DelayPerInstance: 125 + MaximumInstances: 4 + RevokeDelay: -1 + RequiresCondition: anathema + ExternalCondition@Anathema: + Condition: anathema + WithIdleOverlay@Anathema: + Sequence: idle + Image: anathema + Palette: caneon + RequiresCondition: anathema + IsDecoration: True + ReloadDelayMultiplier@Anathema1: + Modifier: 80 + RequiresCondition: anathema == 1 + ReloadDelayMultiplier@Anathema2: + Modifier: 67 + RequiresCondition: anathema == 2 + ReloadDelayMultiplier@Anathema3: + Modifier: 57 + RequiresCondition: anathema == 3 + ReloadDelayMultiplier@Anathema4: + Modifier: 50 + RequiresCondition: anathema >= 4 + ValueScalingFirepowerMultiplier@Anathema1: + MinValue: 600 + MaxValue: 2000 + MinValueModifier: 250 + MaxValueModifier: 125 + RequiresCondition: anathema == 1 + ValueScalingFirepowerMultiplier@Anathema2: + MinValue: 600 + MaxValue: 2000 + MinValueModifier: 300 + MaxValueModifier: 150 + RequiresCondition: anathema == 2 + ValueScalingFirepowerMultiplier@Anathema3: + MinValue: 600 + MaxValue: 2000 + MinValueModifier: 350 + MaxValueModifier: 175 + RequiresCondition: anathema == 3 + ValueScalingFirepowerMultiplier@Anathema4: + MinValue: 600 + MaxValue: 2000 + MinValueModifier: 400 + MaxValueModifier: 200 + RequiresCondition: anathema >= 4 + SpeedMultiplier@Anathema2: + Modifier: 110 + RequiresCondition: anathema >= 2 && anathema < 4 + SpeedMultiplier@Anathema4: + Modifier: 120 + RequiresCondition: anathema >= 4 + GrantTimedCondition@Anathema: + Condition: anathema-alive + Duration: 750 + RequiresCondition: anathema + TimedConditionBar@Anathema: + Color: 9133ff + Condition: anathema-alive + Targetable@Anathema: + TargetTypes: AnathemaTargetable + KillsSelf@Anathema: + RequiresCondition: anathema && !anathema-alive + FireWarheadsOnDeath@Anathema: + Weapon: KirovExplode + EmptyWeapon: KirovExplode + RequiresCondition: anathema && !anathema-alive + WithPalettedOverlay@Anathema: + RequiresCondition: anathema + Palette: anathema + +^ScrinVehicleVoice: + Voiced: + VoiceSet: ScrinVehicleVoice + +^ScrinUnitPalette: + RenderSprites: + PlayerPalette: playerscrin + # # ---- Infantry # ^ScrinInfantry: Inherits: ^Soldier - RenderSprites: - PlayerPalette: overlayplayerscrin + Inherits@ScrinUnitPalette: ^ScrinUnitPalette Voiced: VoiceSet: ScrinInfantryVoice - Targetable: - TargetTypes: Ground, Infantry, TNT + WithInfantryBody: + IdleSequences: idle1, idle2, idle3, idle4 WithDeathAnimation: - DeathSequencePalette: overlayplayerscrin - CrushedSequencePalette: scrin + DeathSequencePalette: playerscrin + CrushedSequencePalette: playerscrin -GrantConditionOnTerrain@ONTIB: -GrantStackingCondition@TIBEXPOSED: -DamagedByTerrain@TIBDAMAGE: + -GrantConditionOnPrerequisite@BIO: + -GrantConditionOnPrerequisite@HAZMAT: + -GrantConditionOnPrerequisite@HAZMATSOVIET: + -GrantConditionOnPrerequisite@HAZMATIRAQ: + -GrantConditionOnPrerequisite@HAZMATZOCOM: + -GrantCondition@HAZMAT: + -GrantCondition@HAZMATSOVIET: + -WithDecoration@HAZMAT: + -WithDecoration@HAZMATSOVIET: + -GrantConditionOnTerrain@HAZMATSOVIET: + -SpeedMultiplier@HAZMATSOVIET: + Targetable@HAZMAT: + -RequiresCondition: + WithDecoration@BINO: + -BlinkPatterns: TakeCover: ProneSequencePrefix: ProneOffset: 0,0,0 @@ -147,6 +438,7 @@ VEHICLES.SCRIN: RequiresCondition: advart-upgrade Modifier: 115 -DamagedByTintedCells@RADSTRONGHAZMAT: + -DamagedByTintedCells@RADSTRONGHAZMATSOVIET: -DamagedByTintedCells@RADMEDHAZMAT: -DamagedByTintedCells@RADWEAKHAZMAT: DamagedByTintedCells@RADSTRONG: @@ -158,24 +450,36 @@ VEHICLES.SCRIN: DamagedByTintedCells@RADWEAK: Damage: 50 RequiresCondition: !being-warped - TransformOnCondition@FEEDER: - RequiresCondition: feedermutation - IntoActor: feed - ExternalCondition@FEEDER: - Condition: feedermutation + DamageTypeDamageMultiplier@FLAKARMOR: + RequiresCondition: carapace-upgrade + DamageTypeDamageMultiplier@FLAKARMORMINOR: + RequiresCondition: carapace-upgrade + -GrantConditionOnPrerequisite@FLAKARMOR: + GrantConditionOnPrerequisite@CARAPACE: + Condition: carapace-upgrade + Prerequisites: carapace.upgrade + SpawnActorOnDeath@GMUT: + Actor: gscr.mutating + Encyclopedia: + Category: Scrin/Infantry S1: Inherits@SCRININFANTRY: ^ScrinInfantry Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove Inherits@BERSERK: ^Berserk Inherits@BOTHELPER: ^BotCaptureHelper + Inherits@HeroOfTheUnionTargetable: ^HeroOfTheUnionTargetable + Inherits@Inspirable: ^Inspirable Buildable: - Queue: Infantry + Queue: InfantrySQ, InfantryMQ BuildAtProductionType: Soldier BuildPaletteOrder: 12 - Prerequisites: ~infantry.scrin, ~techlevel.infonly - Description: General-purpose infantry.\n Strong vs Infantry\n Weak vs Vehicles, Aircraft + Prerequisites: ~infantry.scrin + Description: General-purpose infantry. IconPalette: chrome + TooltipExtras: + Strengths: • Strong vs Infantry + Weaknesses: • Weak vs Heavy Armor, Buildings, Defenses\n• Cannot attack Aircraft Valued: Cost: 100 Tooltip: @@ -189,28 +493,35 @@ S1: MuzzleSequence: muzzle MuzzlePalette: scrin LocalOffset: 150,0,400 - Armament@Garrison: - Name: mounted - Weapon: WarriorGun + Armament@BATF: + Name: batf + Weapon: WarriorGunBATF MuzzleSequence: garrison-muzzle MuzzlePalette: scrin WithMuzzleOverlay: AttackFrontal: - PauseOnCondition: being-warped + PauseOnCondition: being-warped || blinded || reapersnare + FacingTolerance: 0 ProducibleWithLevel: Prerequisites: barracks.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: barracks.upgraded S2: Inherits@SCRININFANTRY: ^ScrinInfantry Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove Inherits@BERSERK: ^Berserk Buildable: - Queue: Infantry + Queue: InfantrySQ, InfantryMQ BuildAtProductionType: Soldier - BuildPaletteOrder: 160 - Prerequisites: anyradar, ~infantry.scrin, ~techlevel.infonly - Description: Fast anti-personnel infantry.\n Strong vs Infantry, Light Vehicles\n Weak vs Tanks, Aircraft + BuildPaletteOrder: 120 + Prerequisites: anyradar, ~infantry.scrin, ~!evis.upgrade, ~!impl.upgrade, ~!stlk.upgrade, ~techlevel.medium IconPalette: chromes + Description: Fast moving anti-personnel infantry. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor + Weaknesses: • Weak vs Heavy Armor, Buildings, Defenses\n• Cannot attack Aircraft Valued: Cost: 275 Tooltip: @@ -218,34 +529,44 @@ S2: UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 7000 + HP: 6000 Mobile: - Speed: 80 + Speed: 92 Armament@PRIMARY: Weapon: RavagerShards LocalOffset: 0,-100,250, 0,100,250 - Armament@Garrison: - Name: mounted + Armament@BATF: + Name: batf Weapon: RavagerShards AttackFrontal: - PauseOnCondition: being-warped + PauseOnCondition: being-warped || blinded || reapersnare + FacingTolerance: 0 ProducibleWithLevel: Prerequisites: barracks.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: barracks.upgraded WithInfantryBody: DefaultAttackSequence: shoot - -TakeCover: + ReplacedInQueue: + Actors: evis, impl, stlk S3: Inherits@SCRININFANTRY: ^ScrinInfantry - Inherits@AUTOTARGET: ^AutoTargetAllAssaultMoveAntiAir + Inherits@AUTOTARGET: ^AutoTargetAllAssaultMovePrioritizeAir Inherits@BERSERK: ^Berserk + Inherits@HeroOfTheUnionTargetable: ^HeroOfTheUnionTargetable + Inherits@Inspirable: ^Inspirable Buildable: - Queue: Infantry + Queue: InfantrySQ, InfantryMQ BuildAtProductionType: Soldier BuildPaletteOrder: 22 - Prerequisites: ~infantry.scrin, ~techlevel.infonly - Description: Anti-tank/anti-aircraft infantry.\n Strong vs Tanks, Aircraft\n Weak vs Infantry + Prerequisites: ~infantry.scrin + Description: Anti-tank/anti-aircraft infantry. IconPalette: chrome + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Aircraft, Buildings, Defenses + Weaknesses: • Weak vs Infantry, Light Armor Valued: Cost: 300 Tooltip: @@ -255,7 +576,7 @@ S3: Health: HP: 3500 Mobile: - Speed: 38 + Speed: 41 Armament@PRIMARY: Weapon: DisintegratorBeamAA LocalOffset: 150,0,400 @@ -265,16 +586,22 @@ S3: Weapon: DisintegratorBeam LocalOffset: 150,0,400 PauseOnCondition: !ammo - Armament@Garrison: - Name: mounted - Weapon: DisintegratorBeam - PauseOnCondition: !ammo + Armament@Targeter: + Weapon: DisintegratorBeamTargeter + LocalOffset: 150,0,400 + Armament@BATF: + Name: batf + Weapon: DisintegratorBeamBATF AttackFrontal: - PauseOnCondition: being-warped + PauseOnCondition: being-warped || blinded || reapersnare + FacingTolerance: 0 ProducibleWithLevel: Prerequisites: barracks.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: barracks.upgraded AutoTarget: - ScanRadius: 5 + MaximumScanTimeInterval: 5 AmmoPool: Ammo: 1 AmmoCondition: ammo @@ -289,192 +616,508 @@ S4: Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove Inherits@BERSERK: ^Berserk Buildable: - Queue: Infantry + Queue: InfantrySQ, InfantryMQ BuildAtProductionType: Soldier - BuildPaletteOrder: 170 - Prerequisites: anyradar, ~infantry.scrin, ~techlevel.infonly - Description: Heavy assault infantry with high burst damage.\n Can teleport short distances.\n Strong vs Buildings, Defenses, Vehicles\n Weak vs Infantry, Aircraft + BuildPaletteOrder: 124 + Prerequisites: anyradar, ~infantry.intruder, ~techlevel.medium IconPalette: chrome + Description: Heavy assault infantry with high burst damage. + TooltipExtras: + Strengths: • Strong vs Buildings, Defenses, Heavy Armor, Light Armor + Weaknesses: • Weak vs Infantry\n• Cannot attack Aircraft + Attributes: • Special Ability: Teleport (with upgrade) Mobile: - Speed: 49 + Speed: 54 Valued: - Cost: 450 + Cost: 500 Tooltip: Name: Intruder UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 14000 + HP: 9000 RevealsShroud: Range: 5c0 Armament@PRIMARY: Weapon: IntruderDiscs LocalOffset: 150,0,400 - Armament@Garrison: - Name: mounted - Weapon: IntruderDiscs + Armament@BATF: + Name: batf + Weapon: IntruderDiscsBATF AttackFrontal: - PauseOnCondition: being-warped + PauseOnCondition: being-warped || blinded || reapersnare + FacingTolerance: 0 ProducibleWithLevel: Prerequisites: barracks.upgraded - -Crushable: - PortableChrono: + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: barracks.upgraded + PortableChronoCA: ChargeDelay: 500 + MaxDistance: 16 ChronoshiftSound: scrinport.aud + RequiresCondition: blink-upgrade + TeleportCondition: blink + ConditionDuration: 3 + ShowSelectionBarWhenFull: false + CircleColor: c8b8ed66 + GrantConditionOnPrerequisite@BLINKPACKS: + Condition: blink-upgrade + Prerequisites: blink.upgrade + WithColoredOverlay@BLINKFLASH: + Color: ffffff80 + RequiresCondition: blink WithInfantryBody: DefaultAttackSequence: shoot - -TakeCover: -S6: +MRDR: Inherits@SCRININFANTRY: ^ScrinInfantry - Inherits@SELECTION: ^SelectableSupportUnit + Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove + Inherits@BERSERK: ^Berserk Buildable: - Queue: Infantry + Queue: InfantrySQ, InfantryMQ BuildAtProductionType: Soldier - BuildPaletteOrder: 62 - Prerequisites: ~infantry.scrin, ~techlevel.infonly - Description: Infiltrates and captures\nenemy structures.\n Can repair friendly structures & bridges.\n Special Ability: Repair\n Unarmed - IconPalette: chrome + BuildPaletteOrder: 125 + Prerequisites: anyradar, ~infantry.harbinger, ~techlevel.medium + IconPalette: chromes + Description: Heavy assault infantry with high burst damage. + TooltipExtras: + Strengths: • Strong vs Buildings, Defenses, Heavy Armor, Light Armor + Weaknesses: • Weak vs Infantry\n• Cannot attack Aircraft + Attributes: • Damage against vehicles scales with the max health of the target\n• Special Ability: Teleport (with upgrade) + Mobile: + Speed: 46 Valued: - Cost: 500 + Cost: 600 Tooltip: - Name: Assimilator + Name: Marauder UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 2500 - Passenger: - CustomPipType: yellow - EngineerRepair: - RepairsBridges: - CaptureManager: - Captures: - CaptureTypes: building - PlayerExperience: 25 - CaptureDelay: 150 - Armament@defuse: - Weapon: DefuseKit - Cursor: goldwrench - OutsideRangeCursor: goldwrench - TargetRelationships: Ally - ForceTargetRelationships: None - Name: secondary - AutoTarget: - AutoTargetPriority@defuse: - ValidTargets: C4Attached, TNTAttached - InvalidTargets: NoAutoTarget - ValidRelationships: Ally + HP: 14000 + RevealsShroud: + Range: 5c0 + Armament@PRIMARY: + Weapon: MarauderDiscs + LocalOffset: 150,0,400 + Armament@BATF: + Name: batf + Weapon: IntruderDiscsBATF AttackFrontal: - Armaments: primary, secondary - PauseOnCondition: being-warped + PauseOnCondition: being-warped || blinded || reapersnare + FacingTolerance: 0 + ProducibleWithLevel: + Prerequisites: barracks.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: barracks.upgraded + PortableChronoCA: + ChargeDelay: 500 + MaxDistance: 16 + ChronoshiftSound: scrinport.aud + RequiresCondition: blink-upgrade + TeleportCondition: blink + ConditionDuration: 3 + ShowSelectionBarWhenFull: false + CircleColor: c8b8ed66 + GrantConditionOnPrerequisite@BLINKPACKS: + Condition: blink-upgrade + Prerequisites: blink.upgrade + WithColoredOverlay@BLINKFLASH: + Color: ffffff80 + RequiresCondition: blink + WithInfantryBody: + DefaultAttackSequence: shoot + EncyclopediaExtras: + Subfaction: harbinger + +S6: + Inherits@SCRININFANTRY: ^ScrinInfantry + Inherits@ENGINEER: ^EngineerBase + Buildable: + BuildPaletteOrder: 32 + Prerequisites: ~infantry.scrin + IconPalette: chrome + Tooltip: + Name: Assimilator Voiced: VoiceSet: AssimilatorVoice - Targetable: - TargetTypes: Ground, Infantry, ChaosImmune -FEED: +WCHR: + Inherits@SCRININFANTRY: ^ScrinInfantry + Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove + Inherits@SELECTION: ^SelectableSupportUnit + Buildable: + Queue: InfantrySQ, InfantryMQ + BuildAtProductionType: Soldier + BuildPaletteOrder: 126 + Prerequisites: anyradar, ~infantry.scrin, ~techlevel.medium + Description: Infiltration unit used to gain vision of enemies. + Valued: + Cost: 500 + Tooltip: + Name: Watcher + TooltipExtras: + Weaknesses: • Cannot deal damage + Attributes: • Can attach parasites to enemy vehicles & structures\n• Cloaked when not moving\n• Detects cloaked ground units and spies\n• Special Ability: Teleport (with upgrade) + Health: + HP: 5000 + UpdatesPlayerStatistics: + AddToArmyValue: true + Mobile: + Speed: 80 + RevealsShroud: + Range: 6c0 + IgnoresDisguise: + DetectCloaked: + Range: 5c0 + WithInfantryBody: + DefaultAttackSequence: shoot + AttackFrontal: + FacingTolerance: 0 + PauseOnCondition: being-warped || blinded || reapersnare + Armament@PRIMARY: + Weapon: WatcherDart + LocalOffset: 150,0,400 + AutoTarget: + InitialStance: HoldFire + InitialStanceAI: ReturnFire + Cloak@NORMAL: + InitialDelay: 250 + CloakDelay: 120 + UncloakOn: Attack, Unload, Infiltrate, Demolish, Move + CloakedCondition: hidden + CloakSound: gstealon.aud + UncloakSound: gstealof.aud + DetectionTypes: Cloak + CloakStyle: Palette + CloakedPalette: cloak + IsPlayerPalette: false + RequiresCondition: !cloak-force-disabled && !being-warped + PauseOnCondition: invisibility + GrantConditionOnDamageState@UNCLOAK: + Condition: cloak-force-disabled + ValidDamageStates: Critical + WithColoredSelectionBox@INVIS: + RequiresCondition: invisibility || hidden + ColorSource: Player + PortableChronoCA: + ChargeDelay: 500 + MaxDistance: 16 + ChronoshiftSound: scrinport.aud + RequiresCondition: blink-upgrade + TeleportCondition: blink + ConditionDuration: 3 + ShowSelectionBarWhenFull: false + CircleColor: c8b8ed66 + GrantConditionOnPrerequisite@BLINKPACKS: + Condition: blink-upgrade + Prerequisites: blink.upgrade + WithColoredOverlay@BLINKFLASH: + Color: ffffff80 + RequiresCondition: blink + +BRST: Inherits@SCRININFANTRY: ^ScrinInfantry Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove Inherits@BERSERK: ^Berserk + Inherits@SELECTION: ^SelectableSupportUnit + Buildable: + Queue: InfantrySQ, InfantryMQ + BuildAtProductionType: Soldier + BuildPaletteOrder: 160 + Prerequisites: scrt, ~infantry.scrin, ~techlevel.high + IconPalette: chromes + Description: Explodes on death or on contact with target. Valued: - Cost: 200 + Cost: 550 Tooltip: - Name: Feeder + Name: Burster + TooltipExtras: + Strengths: • Strong vs Infantry, Buildings, Light Armor + Weaknesses: • Cannot attack Aircraft Health: - HP: 7500 + HP: 5000 UpdatesPlayerStatistics: AddToArmyValue: true Mobile: - Speed: 49 - Harvester: - Capacity: 10 - Resources: Tiberium, BlueTiberium, Ore, Gems - HarvestFacings: 8 - BaleLoadDelay: 18 - DeliveryBuildings: none - FullyLoadedSpeed: 100 - SearchFromProcRadius: 5 - SearchFromHarvesterRadius: 5 - WithHarvestAnimation: - WithMoveAnimation: - WithFacingSpriteBody: - QuantizeFacingsFromSequence: - -Sequence: - -WithInfantryBody: - -WithInfantryBody@Warped: - GrantConditionOnFullHarvester@FULL: - Condition: full - WithIdleOverlay@FULL: - Sequence: idle - Image: feederfull-overlay - Palette: scrin-ignore-lighting-alpha30 - RequiresCondition: full - WithAttackAnimation: - Sequence: harvest - Armament: secondary - Explodes: - Weapon: FeederExplode - EmptyWeapon: FeederExplode - DamageSource: Killer - RequiresCondition: full + Speed: 92 + RevealsShroud: + Range: 7c0 + FireWarheadsOnDeath: + Weapon: BursterExplode + EmptyWeapon: BursterExplode + RequiresCondition: !being-warped AttackFrontal: FacingTolerance: 64 + PauseOnCondition: being-warped || blinded || reapersnare Armament@PRIMARY: - Weapon: FeederTargeting - RequiresCondition: full - Armament@SECONDARY: - Name: secondary - Weapon: FeederBeam - LocalOffset: 150,0,200 - RequiresCondition: !full + Weapon: BursterTargeting GrantConditionOnAttack: Condition: triggered - RequiresCondition: full - GrantConditionOnDeploy: - DeployedCondition: triggered - RequiresCondition: full KillsSelf: - RequiresCondition: full && (triggered || berserk) - SpeedMultiplier@FULL: - RequiresCondition: full - Modifier: 150 + RequiresCondition: (triggered || berserk) -TakeCover: - WithHarvesterCapacityBar: - SelectionBarColor: cc0000 - DisplayWhenFull: false - ConvertsDamageToHealth: - DamagePercentConverted: 20 - AutoTargetPriority@DEFAULT: - RequiresCondition: !stance-attackanything && !assault-move && !full - Targetable@FEEDER: - TargetTypes: Feeder - RequiresCondition: full + Targetable@Burster: + TargetTypes: Burster + AutoTarget: + ScanRadius: 4 + TargetedAttackAbility: + TargetCursor: attack + ArmamentNames: primary + CircleWidth: 0 + Type: BursterAttack + DeployCursor: move -SMEDI: +EVIS: Inherits@SCRININFANTRY: ^ScrinInfantry + Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove + Inherits@BERSERK: ^Berserk + Inherits@RESCONV: ^ResourceConversion Buildable: - Queue: Infantry + Queue: InfantrySQ, InfantryMQ BuildAtProductionType: Soldier - BuildPaletteOrder: 240 - Prerequisites: ~infantry.scrin, ~infantry.smedi, ~techlevel.infonly - Description: Heals nearby life forms.\n Unarmed + BuildPaletteOrder: 121 + Prerequisites: anyradar, ~infantry.scrin, ~evis.upgrade, ~techlevel.medium IconPalette: chromes + Description: Durable, fast moving, short-range, anti-personnel infantry. + Selectable: + DecorationBounds: 640, 896, -32, -256 Valued: - Cost: 200 + Cost: 600 Tooltip: - Name: Rejuvenator + Name: Eviscerator + TooltipExtras: + Strengths: • Strong vs Light Armor, Infantry + Weaknesses: • Weak vs Heavy Armor, Defenses\n• Cannot attack Aircraft + Attributes: • Charges a more powerful attack while on resources (with upgrade) + Health: + HP: 16000 UpdatesPlayerStatistics: AddToArmyValue: true - Health: - HP: 5000 - Armament: - Weapon: Heal - Cursor: heal - OutsideRangeCursor: heal - TargetRelationships: Ally + Mobile: + Speed: 92 + RevealsShroud: + Range: 6c0 + AttackFrontal: + FacingTolerance: 64 + PauseOnCondition: being-warped || blinded || reapersnare + Armaments: primary, primary-charged + Armament@PRIMARY: + Weapon: EvisceratorShards + LocalOffset: 0,-100,250, 0,100,250 + PauseOnCondition: (ammo || charged-fire) && !uncharged-fire + Armament@PRIMARYCHARGED: + Name: primary-charged + Weapon: EvisceratorShardsCharged + PauseOnCondition: !ammo || uncharged-fire + LocalOffset: 0,-100,250, 0,100,250 + Armament@BATF: + Name: batf + Weapon: EvisceratorShards + AmmoPool@RESCONV: + Ammo: 20 + ReloadAmmoPool@RESCONV: + Count: 5 + WithAmmoPipsDecoration@RESCONV: + PipCount: 4 + GrantCondition@RESCONVCHARGE: + RequiresCondition: resconv-upgrade && on-resource && (ammo < 20 || charged-fire) + GrantConditionOnAttack@PRIMARY: + RevokeDelay: 28 + GrantConditionOnAttack@PRIMARYCHARGED: + RevokeDelay: 28 + WithIdleOverlay@RESCONVTIB: + Offset: 0,0,150 + Sequence: greensm + WithIdleOverlay@RESCONVORE: + Offset: 0,0,150 + Sequence: yellowsm + WithIdleOverlay@RESCONVBLUETIB: + Offset: 0,0,150 + Sequence: bluesm + WithIdleOverlay@RESCONVGEMS: + Offset: 0,0,150 + Sequence: redsm + WithInfantryBody: + DefaultAttackSequence: shoot + EncyclopediaExtras: + AdditionalInfo: Requires Loyalist Allegiance. + +IMPL: + Inherits@SCRININFANTRY: ^ScrinInfantry + Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove + Inherits@BERSERK: ^Berserk + Buildable: + Queue: InfantrySQ, InfantryMQ + BuildAtProductionType: Soldier + BuildPaletteOrder: 122 + Prerequisites: anyradar, ~infantry.scrin, ~impl.upgrade, ~techlevel.medium + IconPalette: chromes + Description: Assault infantry with high burst damage. Impales targets, slowing their movement. + Selectable: + DecorationBounds: 640, 896, -32, -256 + Valued: + Cost: 600 + Tooltip: + Name: Impaler + TooltipExtras: + Strengths: • Strong vs Light Armor, Infantry + Weaknesses: • Weak vs Heavy Armor, Defenses\n• Cannot attack Aircraft + Attributes: • Slows targets + Health: + HP: 8000 + UpdatesPlayerStatistics: + AddToArmyValue: true + Mobile: + Speed: 60 + RevealsShroud: + Range: 6c0 + AttackFrontalCharged: + FacingTolerance: 32 + ChargeLevel: 0,2 + PauseOnCondition: being-warped || blinded || reapersnare + Armament@PRIMARY: + Weapon: ImpalerSpike + LocalOffset: 150,0,400 + Armament@Tracer: + Weapon: ImpalerTracer + LocalOffset: 150,0,400 + Armament@BATF: + Name: batf + Weapon: ImpalerSpikePassenger + WithInfantryBody: + DefaultAttackSequence: shoot + EncyclopediaExtras: + AdditionalInfo: Requires Rebel Allegiance. + +STLK: + Inherits@SCRININFANTRY: ^ScrinInfantry + Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove + Inherits@BERSERK: ^Berserk + Buildable: + Queue: InfantrySQ, InfantryMQ + BuildAtProductionType: Soldier + BuildPaletteOrder: 123 + Prerequisites: anyradar, ~infantry.scrin, ~stlk.upgrade, ~techlevel.medium + IconPalette: chromes + Description: Fast moving anti-personnel infantry that can turn invisible temporarily and ambush targets. + Selectable: + DecorationBounds: 640, 896, -32, -256 + Valued: + Cost: 600 + Tooltip: + Name: Stalker + TooltipExtras: + Strengths: • Strong vs Light Armor, Infantry + Weaknesses: • Weak vs Heavy Armor, Defenses\n• Cannot attack Aircraft + Attributes: • Special Ability: Cloak\n• Moves faster while cloaked\n• Briefly takes greatly reduced damage after decloaking + Health: + HP: 10000 + UpdatesPlayerStatistics: + AddToArmyValue: true + Mobile: + Speed: 92 + RevealsShroud: + Range: 6c0 + AttackFrontal: + FacingTolerance: 64 + PauseOnCondition: being-warped || blinded || reapersnare + Armament@PRIMARY: + Weapon: StalkerShards + LocalOffset: 0,-100,250, 0,100,250 + Armament@BATF: + Name: batf + Weapon: StalkerShards + WithInfantryBody: + DefaultAttackSequence: shoot + TimedConditionBarCA@Cloaked: + Condition: cloak-active + Color: ffffff + RequiresCondition: hidden + GrantTimedConditionOnDeploy@Cloak: + DeployedCondition: cloak-triggered + ChargingCondition: cloak-charging + ShowSelectionBar: true + StartsFullyCharged: true + DeployedTicks: 1 + CooldownTicks: 875 + ShowSelectionBarWhenFull: false + ShowSelectionBarWhenEmpty: false + ChargingColor: 808080 + DischargingColor: ffffff + Instant: true + Cloak@NORMAL: + InitialDelay: 0 + CloakDelay: 750 + CloakSound: stlk-cloak.aud + UncloakSound: stlk-uncloak.aud + CloakedCondition: hidden + CloakStyle: Palette + CloakedPalette: cloak + IsPlayerPalette: false + UncloakOn: Attack, Unload, Infiltrate, Demolish, Dock, Damage, Heal + RequiresCondition: !cloak-force-disabled && !being-warped && !parachute && cloak-active + PauseOnCondition: invisibility + Cloak@CRATE-CLOAK: + RequiresCondition: crate-cloak && !(cloak-force-disabled || invisibility || hidden) + GrantTimedCondition@CloakActive: + Condition: cloak-active + Duration: 750 + ForceFullDuration: true + RequiresCondition: cloak-triggered + GrantTimedCondition@Uncloaked: + Condition: phaseshield + RequiresCondition: cloak-charging && !hidden + Duration: 50 + ForceFullDuration: true + SpeedMultiplier@CloakSpeed: + Modifier: 150 + RequiresCondition: phaseshield || hidden + DamageMultiplier@PhaseShield: + Modifier: 10 + RequiresCondition: phaseshield || hidden + WithColoredOverlay@PhaseShield: + Color: 15091f88 + RequiresCondition: phaseshield + -GrantConditionOnDamageState@UNCLOAK: + WithColoredSelectionBox@INVIS: + RequiresCondition: invisibility || hidden + ColorSource: Player + TakeCover: + PauseOnCondition: being-warped || phaseshield + EncyclopediaExtras: + AdditionalInfo: Requires Malefic Allegiance. + +SMEDI: + Inherits@SCRININFANTRY: ^ScrinInfantry + Inherits@Inspirable: ^Inspirable + Buildable: + Queue: Hospital + BuildPaletteOrder: 240 + IconPalette: chromes + Description: Heals nearby life-forms. + TooltipExtras: + Weaknesses: • Unarmed + Valued: + Cost: 200 + Tooltip: + Name: Rejuvenator + UpdatesPlayerStatistics: + AddToArmyValue: true + Health: + HP: 5000 + Armament: + Weapon: Heal + Cursor: heal + OutsideRangeCursor: heal + TargetRelationships: Ally ForceTargetRelationships: None AttackFrontal: - PauseOnCondition: being-warped + PauseOnCondition: being-warped || blinded || reapersnare || berserkactive + FacingTolerance: 0 + AttackSoundsCA@HEALSOUND: + Sounds: heal2.aud WithInfantryBody: DefaultAttackSequence: heal Passenger: @@ -488,38 +1131,181 @@ SMEDI: ValidRelationships: Ally Voiced: VoiceSet: AssimilatorVoice - Targetable: - TargetTypes: Ground, Infantry, ChaosImmune GuardsSelection: ValidTargets: Infantry + KeepsDistance: + Encyclopedia: + HideBuildable: True + EncyclopediaExtras: + AdditionalInfo: Acquired from captured Hospitals. + +ARTI: + Inherits@SCRININFANTRY: ^ScrinInfantry + Inherits@Inspirable: ^Inspirable + Buildable: + Queue: Hospital + BuildPaletteOrder: 240 + IconPalette: chromes + Description: Repairs nearby vehicles. + TooltipExtras: + Weaknesses: • Unarmed + Attributes: • Can salvage destroyed vehicles for credits + Valued: + Cost: 400 + Tooltip: + Name: Artificer + UpdatesPlayerStatistics: + AddToArmyValue: true + Health: + HP: 5000 + Armament: + Weapon: ScrinRepair + Cursor: repair + OutsideRangeCursor: repair + TargetRelationships: Ally + ForceTargetRelationships: None + Armament@defuse: + Weapon: DefuseKit + Cursor: goldwrench + OutsideRangeCursor: goldwrench + TargetRelationships: Ally + ForceTargetRelationships: None + Name: secondary + AutoTargetPriority@defuse: + ValidTargets: C4Attached, TNTAttached + InvalidTargets: NoAutoTarget + ValidRelationships: Ally + AttackFrontal: + PauseOnCondition: being-warped || blinded || reapersnare || berserkactive + FacingTolerance: 0 + AttackSoundsCA@REPAIRSOUND: + Sounds: floatk1.aud + WithInfantryBody: + IdleSequences: idle1, idle2, idle3, idle4 + DefaultAttackSequence: repair + StandSequences: stand, stand2 + RequiresCondition: !parachute && !being-warped && !salvaging + WithInfantryBody@SALVAGE: + StandSequences: repair + RequiresCondition: salvaging + CaptureManager: + CapturingCondition: salvaging + Captures: + CaptureTypes: husk + PlayerExperience: 5 + ConsumedByCapture: False + CaptureDelay: 75 + ValidRelationships: Ally, Enemy, Neutral + PlayerExperienceRelationships: Neutral, Enemy + EnterCursor: sell2 + EnterBlockedCursor: move-blocked + Passenger: + CustomPipType: blue + Voice: Move + Guard: + Voice: Move + AutoTarget: + ScanRadius: 3 + AutoTargetPriority@DEFAULT: + ValidTargets: Repairable + ValidRelationships: Ally + ProducibleWithLevel: + Prerequisites: barracks.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: barracks.upgraded + Voiced: + VoiceSet: AssimilatorVoice + GuardsSelection: + ValidTargets: Vehicle + KeepsDistance: + Encyclopedia: + HideBuildable: True + EncyclopediaExtras: + AdditionalInfo: Acquired from captured Machine Shops. + +GSCR: + Inherits: BRUT + RenderSprites: + Image: gscr + PlayerPalette: playerscrin + Voiced: + VoiceSet: GiantScrinVoice + WithDeathAnimation: + DeathSequencePalette: playerscrin + -Buildable: + Tooltip: + Name: Brutalizer + -GrantConditionOnTerrain@ONTIB: + -GrantStackingCondition@TIBEXPOSED: + -DamagedByTerrain@TIBDAMAGE: + WithInfantryBody: + MoveSequence: run + StandSequences: stand + DefaultAttackSequence: bash + IdleSequences: idle1, idle2, idle3, idle4 + AttackSounds: + Sounds: gscr-attack1.aud, gscr-attack2.aud + Selectable: + DecorationBounds: 640, 896, -32, -256 + Encyclopedia: + HideBuildable: True + EncyclopediaExtras: + AdditionalInfo: Result of Genetic Mutation Bomb on Scrin infantry. + +GSCR.Mutating: + Inherits: BRUT.Mutating + SpawnActorOnDeath@GMUT: + Actor: gscr + RenderSprites: + Image: gscr + PlayerPalette: playerscrin + WithDeathAnimation: + DeathSequencePalette: playerscrin + Tooltip: + Name: Brutalizer MAST: Inherits@SCRININFANTRY: ^ScrinInfantry Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove - Inherits@BERSERK: ^Berserk Inherits@COMMANDOSKULL: ^CommandoSkull + Inherits@CommandoRegen: ^CommandoRegen + Inherits@HEALINGCOOLDOWN: ^HealingCooldown AutoTargetPriority@DEFAULT: - RequiresCondition: mindcontrolling < 3 && !stance-attackanything && !assault-move + RequiresCondition: !maxcontrolled || stance-attackanything || assault-move Buildable: - Queue: Infantry + Queue: InfantrySQ, InfantryMQ BuildAtProductionType: Soldier BuildPaletteOrder: 220 - Prerequisites: scrt, ~infantry.scrin, ~techlevel.infonly + Prerequisites: scrt, ~infantry.scrin, ~techlevel.high BuildLimit: 1 - Description: Elite specialist infantry.\n Can mind-control enemy units and defenses.\n Can detect cloaked units.\n Maximum 1 can be trained.\n Strong vs Infantry, Vehicles, Defenses\n Weak vs Aircraft IconPalette: chrome + Description: Elite specialist infantry able to mind-control enemy units (up to 3, increases with veterancy). + TooltipExtras: + Strengths: • Strong vs Infantry, Vehicles, Defenses, Buildings + Weaknesses: • Cannot attack Aircraft + Attributes: • Maximum 1 can be trained\n• Detects cloaked ground units and spies\n• Immune to mind control\n• Can capture enemy buildings\n• Shorter range and longer reload against vehicles\n• Special Ability: Mind Spark Voiced: VoiceSet: MastermindVoice Valued: Cost: 1350 Tooltip: Name: Mastermind + RequiresCondition: !rank-elite + Tooltip@PRODIGY: + Name: Prodigy + RequiresCondition: rank-elite UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 11000 + HP: 18000 Mobile: - Speed: 56 + Speed: 60 + RevealsShroud: + Range: 7c0 + IgnoresDisguise: + DetectCloaked: + Range: 2c0 Armament@PRIMARY: Weapon: EnslaveInfantry LocalOffset: 150,0,400 @@ -527,22 +1313,90 @@ MAST: Name: secondary Weapon: EnslaveVehicle LocalOffset: 150,0,400 + PauseOnCondition: !vs-vehicle-ammo + Armament@BATF: + Name: batf + Weapon: PsychicBeamBATF MindController: + ControlType: MindControl ArmamentNames: primary, secondary Capacity: 3 ControlSounds: mastermind-fire.aud + ReleaseSounds: mastermind-release.aud ControllingCondition: mindcontrolling + MaxControlledCondition: maxcontrolled + ControlAtCapacityBehaviour: DetonateOldest + SlaveDeployEffect: Detonate + SlaveDetonateWeapon: DetonateSlave + SlaveKillDamageTypes: BulletDeath + ExperienceFromControl: 100 + TargetTypeTicksToControl: + MindControlResistant: 105 WithMindControlArc@MC: + ControlType: MindControl Color: c71585 Transparency: 55 Offset: 0,0,511 Angle: 32 Width: 116 AttackFrontal: - PauseOnCondition: being-warped + PauseOnCondition: being-warped || blinded || reapersnare || parachute || !ammo + FacingTolerance: 0 + Selectable: + DecorationBounds: 640, 896, -32, -256 + WithInfantryBody: + DefaultAttackSequence: shoot + RequiresCondition: !rank-elite && !being-warped + WithInfantryBody@Warped: + RequiresCondition: !rank-elite && being-warped + WithDeathAnimation: + RequiresCondition: !rank-elite && !being-warped + WithInfantryBody@Prodigy: + StandSequences: pdgy-stand + MoveSequence: pdgy-run + IdleSequences: pdgy-idle1, pdgy-idle2, pdgy-idle3, pdgy-idle4 + DefaultAttackSequence: pdgy-shoot + RequiresCondition: rank-elite && !transforming && !being-warped + WithInfantryBody@ProdigyWarped: + StandSequences: pdgy-stand + RequiresCondition: rank-elite && !transforming && being-warped + WithDeathAnimation@PDGY: + DeathSequencePalette: playerscrin + CrushedSequencePalette: scrin + DeathSequence: pdgy-die + DeathTypes: + DefaultDeath: 1 + BulletDeath: 2 + SmallExplosionDeath: 3 + ExplosionDeath: 4 + FireDeath: 5 + ElectricityDeath: 6 + PoisonDeath: 7 + ChronoDeath: 8 + ToxinDeath: 9 + RadiationDeath: 10 + FrozenDeath: 11 + AtomizedDeath: 12 + CrushedSequence: die-crushed + RequiresCondition: rank-elite && !transforming && !being-warped + WithSpriteBody@PRODIGYMAKE: + RequiresCondition: transforming + Sequence: stand + GrantTimedCondition@PRODIGYMAKE: + Condition: transforming + Duration: 25 + RequiresCondition: rank-elite + WithEnabledAnimation@PRODIGYMAKE: + RequiresCondition: transforming + Sequence: pdgy-make ProducibleWithLevel: Prerequisites: barracks.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: barracks.upgraded -Crushable: + TakeCover: + SpeedModifier: 70 ExternalCondition@PRODUCED: Condition: produced VoiceAnnouncement: @@ -551,16 +1405,78 @@ MAST: CaptureManager: Captures: CaptureTypes: building - PlayerExperience: 25 CaptureDelay: 150 ConsumedByCapture: false + EnterCursor: mc-capture Targetable: - TargetTypes: Ground, Infantry, MindControlImmune + TargetTypes: Ground, Infantry + Targetable@Hero: + TargetTypes: Hero + Targetable@MindControlImmune: + TargetTypes: MindControlImmune + Targetable@ChaosImmune: + TargetTypes: ChaosImmune + Targetable@ReaperSnareImmune: + TargetTypes: ReaperSnareImmune WithIdleOverlay@mindcontrolling: Sequence: mc Palette: scrin RequiresCondition: mindcontrolling Offset: 0,0,400 + Passenger: + CustomPipType: red + AutoTargetPriority@VEHCOOLDOWN: + ValidTargets: Infantry + InvalidTargets: NoAutoTarget + Priority: 10 + RequiresCondition: !vs-vehicle-ammo + AmmoPool: + Ammo: 1 + AmmoCondition: ammo + AmmoPool@Vehicles: + Name: secondary + Armaments: secondary + Ammo: 1 + AmmoCondition: vs-vehicle-ammo + ReloadAmmoPool: + Delay: 35 # matches EnslaveInfantry ReloadDelay + Count: 1 + ReloadAmmoPool@Vehicles: + AmmoPool: secondary + Delay: 100 + Count: 1 + MindControllerCapacityModifier@RANK-1: + Amount: 1 + RequiresCondition: rank-veteran == 1 + MindControllerCapacityModifier@RANK-2: + Amount: 2 + RequiresCondition: rank-veteran == 2 + MindControllerCapacityModifier@RANK-ELITE: + Amount: 3 + RequiresCondition: rank-elite + RangeMultiplier@RANK-ELITE: + Modifier: 115 + RequiresCondition: rank-elite + ChangesHealth@ELITE: + Delay: 50 + SpawnActorAbility: + Actors: mspk + SpawnSounds: mastermind-shatter.aud + TargetModifiedCursor: ability2 + Behavior: SpawnAtSelfAndSlavesAndMoveToTarget + RequiresCondition: !being-warped && mspk-ammo + AmmoPool: mspk + AmmoPool@MindSpark: + Name: mspk + Ammo: 1 + Armaments: none + AmmoCondition: mspk-ammo + ReloadAmmoPoolCA@MindSpark: + AmmoPool: mspk + Delay: 375 + Count: 1 + ShowSelectionBar: true + SelectionBarColor: ff00ff # # ---- Vehicles @@ -568,56 +1484,69 @@ MAST: HARV.Scrin: Inherits: HARV.TD + Inherits@SCRINVEHICLEVOICE: ^ScrinVehicleVoice Selectable: - DecorationBounds: 42,42 + DecorationBounds: 1792, 1792 RenderSprites: Image: harv.scrin - PlayerPalette: overlayplayer + PlayerPalette: player WithShadow: Offset: 43, 255, 0 ZOffset: -256 + RequiresCondition: !invisibility WithHarvestOverlay: Palette: scrin LocalOffset: 400, 0, 0 Buildable: BuildPaletteOrder: 13 - Prerequisites: ~proc.scrin, ~vehicles.scrin, ~techlevel.infonly + Prerequisites: anyrefinery, ~vehicles.scrin, ~techlevel.low IconPalette: chrome SpawnActorOnDeath: Actor: HARV.Scrin.Husk - WithDockingAnimation: - DockSequence: idle - DockLoopSequence: idle + -WithDockingAnimationCA: -WithHarvestAnimation: WithDamageOverlay: Palette: chrometd + -SpawnRandomActorOnDeath: + -GrantConditionOnPrerequisite@Stealth: + -TransformOnCondition: + -RejectsOrders@Transforming: + -TransferResourcesOnTransform: + -ReplacedInQueue: + Encyclopedia: + Category: Scrin/Vehicles GUNW: Inherits: ^Tank Inherits@GAINSEXPERIENCE: ^GainsExperience - Inherits@AUTOTARGET: ^AutoTargetAllAssaultMoveAntiAir + Inherits@AUTOTARGET: ^AutoTargetAllAssaultMovePrioritizeAir Inherits@BERSERK: ^Berserk Inherits@SLOWCRUSH: ^SlowedByCrushing + Inherits@A2GPROTECTION: ^AirToGroundProtection + Inherits@SCRINVEHICLEVOICE: ^ScrinVehicleVoice Buildable: - Queue: Vehicle - BuildPaletteOrder: 24 - Prerequisites: ~vehicles.scrin, ~techlevel.low - Description: Light assault walker.\n Strong vs Infantry, Aircraft\n Weak vs Tanks + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 60 + Prerequisites: ~vehicles.scrin, ~!shrw.upgrade, ~techlevel.low + Description: Durable light assault walker. IconPalette: chrome + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor, Aircraft + Weaknesses: • Weak vs Heavy Armor, Buildings, Defenses Valued: Cost: 600 Tooltip: Name: Gun Walker Selectable: - DecorationBounds: 28,28 + DecorationBounds: 1194, 1194 UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 30000 + HP: 28000 Armor: Type: Light Mobile: - Speed: 90 + Speed: 100 TurnSpeed: 38 RevealsShroud: MinRange: 4c0 @@ -627,21 +1556,31 @@ GUNW: Range: 4c0 Armament@PRIMARY: Weapon: GunWalkerZap - LocalOffset: 750,92,25, 750,-92,25 + LocalOffset: 690,92,0, 690,-92,0 MuzzleSequence: muzzle MuzzlePalette: scrin + Armament@PRIMARYVISUAL: + Weapon: GunWalkerZapVisual + LocalOffset: 690,92,0, 690,-92,0 Armament@SECONDARY: Name: secondary Weapon: GunWalkerZapAA - LocalOffset: 750,92,25, 750,-92,25 + LocalOffset: 690,92,0, 690,-92,0 MuzzleSequence: muzzle MuzzlePalette: scrin + Armament@SECONDARYVISUAL: + Name: secondary + Weapon: GunWalkerZapAAVisual + LocalOffset: 690,92,0, 690,-92,0 WithMuzzleOverlay: AttackFrontal: FacingTolerance: 40 - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded ProducibleWithLevel: Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded WithMoveAnimation: ValidMovementTypes: Horizontal, Vertical, Turn GrantConditionOnFaction@TRAVELERSPEED: @@ -650,109 +1589,171 @@ GUNW: SpeedMultiplier@TRAVELERSPEED: RequiresCondition: travelerspeed Modifier: 115 + ReplacedInQueue: + Actors: shrw + Upgradeable@SHRW: + Type: shrw.upgrade + Actor: shrw + UpgradeAtActors: fix, rep, srep + BuildDuration: 100 + Encyclopedia: + Category: Scrin/Vehicles + +SHRW: + Inherits: GUNW + Inherits@ScrinUnitPalette: ^ScrinUnitPalette + Tooltip: + Name: Shard Walker + Buildable: + Prerequisites: ~vehicles.scrin, ~shrw.upgrade, ~techlevel.medium + IconPalette: chromes + Armor: + Type: Light + Health: + HP: 36000 + Mobile: + Speed: 92 + TurnSpeed: 36 + Armament@PRIMARY: + Weapon: ShardWalkerShards + LocalOffset: 690,92,0, 690,-92,0 + -Armament@PRIMARYVISUAL: + Armament@SECONDARY: + Weapon: ShardWalkerShardsAA + LocalOffset: 690,92,0, 690,-92,0 + Selectable: + Class: gunw + -GrantConditionOnFaction@TRAVELERSPEED: + -SpeedMultiplier@TRAVELERSPEED: + -ReplacedInQueue: + -Upgradeable@SHRW: + EncyclopediaExtras: + Subfaction: reaper SEEK: Inherits: ^Vehicle + Inherits@ScrinUnitPalette: ^ScrinUnitPalette Inherits@GAINSEXPERIENCE: ^GainsExperience Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove Inherits@BERSERK: ^Berserk Inherits@HOVERTRAIL: ^HoverTrail - RenderSprites: - PlayerPalette: overlayplayerscrin + Inherits@SCRINVEHICLEVOICE: ^ScrinVehicleVoice + Inherits@Hypercharge: ^Hypercharge Valued: - Cost: 750 + Cost: 700 Tooltip: Name: Seeker Selectable: - DecorationBounds: 28,28 + DecorationBounds: 1194, 1194 UpdatesPlayerStatistics: AddToArmyValue: true Buildable: - BuildPaletteOrder: 31 + BuildPaletteOrder: 160 Prerequisites: ~vehicles.seek, ~techlevel.low - Queue: Vehicle - Description: Light hover tank.\n Can detect cloaked units and mines.\n Strong vs Vehicles, Buildings\n Weak vs Aircraft, Infantry + Queue: VehicleSQ, VehicleMQ + Description: Light hover tank. IconPalette: chrome + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Buildings + Weaknesses: • Weak vs Infantry\n• Cannot attack Aircraft + Attributes: • Detects cloaked units, spies and submarines\n• Can traverse water Mobile: - Speed: 95 + Speed: 126 Locomotor: lighthover + TurnSpeed: 24 Health: - HP: 22000 + HP: 23000 Armor: Type: Light RevealsShroud: - MinRange: 4c0 - Range: 7c0 + MinRange: 6c0 + Range: 8c0 RevealGeneratedShroud: False RevealsShroud@GAPGEN: - Range: 4c0 + Range: 6c0 Turreted: TurnSpeed: 40 Offset: -280,0,0 Hovers: BobDistance: -25 RequiresCondition: !empdisable && !being-warped && !driver-dead - GrantConditionOnTerrain: - TerrainTypes: Water - Condition: onwater - KillsSelf@SINK: - RequiresCondition: onwater && (empdisable || driver-dead) WithShadow: Offset: 43, 128, 0 ZOffset: -129 + RequiresCondition: !invisibility Armament@PRIMARY: Weapon: PlasmaDiscs LocalOffset: 320,-25,320, 320,25,320 + RequiresCondition: !hypercharged + Armament@PRIMARYCHARGED: + Weapon: PlasmaDiscs.Hypercharged + LocalOffset: 320,-25,320, 320,25,320 + RequiresCondition: hypercharged AttackTurreted: - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded WithSpriteTurret: IgnoresDisguise: DetectCloaked: - Range: 5c0 - CloakTypes: Cloak, Thief, Mine + Range: 6c0 + DetectionTypes: Cloak, AirCloak, Underwater RequiresCondition: !(empdisable || being-warped) ProducibleWithLevel: Prerequisites: vehicles.upgraded - SpawnActorOnDeath: - Actor: SEEK.Husk - RequiresCondition: !being-warped + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded + GrantConditionOnTerrain@ONWATER: + TerrainTypes: Water + Condition: onwater + KillsSelf@SINK: + RequiresCondition: onwater && (empdisable || driver-dead) + Targetable@ONWATER: + TargetTypes: Water, Ship + RequiresCondition: onwater + Encyclopedia: + Category: Scrin/Vehicles LACE: Inherits: ^Vehicle + Inherits@ScrinUnitPalette: ^ScrinUnitPalette Inherits@GAINSEXPERIENCE: ^GainsExperience Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove Inherits@BERSERK: ^Berserk Inherits@HOVERTRAIL: ^HoverTrail - RenderSprites: - PlayerPalette: overlayplayerscrin + Inherits@SCRINVEHICLEVOICE: ^ScrinVehicleVoice + Inherits@Hypercharge: ^Hypercharge Valued: Cost: 600 Tooltip: Name: Lacerator Selectable: - DecorationBounds: 28,28 + DecorationBounds: 1194, 1194 UpdatesPlayerStatistics: AddToArmyValue: true Buildable: - BuildPaletteOrder: 32 + BuildPaletteOrder: 161 Prerequisites: ~vehicles.traveler, ~techlevel.low - Queue: Vehicle - Description: Fast hover tank.\n Can detect cloaked units and mines.\n Strong vs Vehicles, Buildings\n Weak vs Aircraft, Infantry + Queue: VehicleSQ, VehicleMQ + Description: Fast hover tank. IconPalette: chrome + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Buildings + Weaknesses: • Weak vs Infantry\n• Cannot attack Aircraft + Attributes: • Detects cloaked units, spies and submarines\n• Can traverse water Mobile: TurnSpeed: 40 - Speed: 126 + Speed: 144 Locomotor: lighthover Health: HP: 13000 Armor: Type: Light RevealsShroud: - MinRange: 4c0 - Range: 7c0 + MinRange: 6c0 + Range: 8c0 RevealGeneratedShroud: False RevealsShroud@GAPGEN: - Range: 4c0 + Range: 6c0 Turreted: TurnSpeed: 40 Offset: -50,0,0 @@ -762,58 +1763,83 @@ LACE: GrantConditionOnTerrain: TerrainTypes: Water Condition: onwater - KillsSelf@SINK: - RequiresCondition: onwater && (empdisable || driver-dead) WithShadow: Offset: 43, 128, 0 ZOffset: -129 + RequiresCondition: !invisibility Armament@PRIMARY: Weapon: LaceratorShards LocalOffset: 0,70,320, 0,-70,320 + RequiresCondition: !hypercharged + Armament@PRIMARYCHARGED: + Weapon: LaceratorShards.Hypercharged + LocalOffset: 0,70,320, 0,-70,320 + RequiresCondition: hypercharged AttackTurreted: - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded WithSpriteTurret: IgnoresDisguise: DetectCloaked: Range: 6c0 - CloakTypes: Cloak, Thief, Mine + DetectionTypes: Cloak, AirCloak, Underwater RequiresCondition: !(empdisable || being-warped) ProducibleWithLevel: Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded + GrantConditionOnTerrain@ONWATER: + TerrainTypes: Water + Condition: onwater + KillsSelf@SINK: + RequiresCondition: onwater && (empdisable || driver-dead) + Targetable@ONWATER: + TargetTypes: Water, Ship + RequiresCondition: onwater + Encyclopedia: + Category: Scrin/Vehicles + EncyclopediaExtras: + Subfaction: traveler INTL: Inherits: ^Vehicle + Inherits@ScrinUnitPalette: ^ScrinUnitPalette Inherits@GAINSEXPERIENCE: ^GainsExperience Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove Inherits@BERSERK: ^Berserk Inherits@TRANSPORT: ^Transport + Inherits@NOUNLOADCHRONO: ^NoUnloadWhenChronoshifted Inherits@HOVERTRAIL: ^HoverTrail - RenderSprites: - PlayerPalette: overlayplayerscrin + Inherits@HeavyArmor: ^HeavyArmor + Inherits@TANKBUSTERVULN: ^TankBusterVulnerability + Inherits@SCRINVEHICLEVOICE: ^ScrinVehicleVoice + Inherits@COMMANDOSKULL: ^CommandoSkull + Inherits@SHIELDS: ^ScrinShields Valued: - Cost: 750 + Cost: 800 Tooltip: Name: Interloper UpdatesPlayerStatistics: AddToArmyValue: true Buildable: - BuildPaletteOrder: 43 + BuildPaletteOrder: 110 Prerequisites: ~vehicles.scrin, ~techlevel.low - Queue: Vehicle - Description: Heavily armoured front-line assault troop carrier.\n Strong vs Vehicles\n Weak vs Infantry, Aircraft + Queue: VehicleSQ, VehicleMQ + Description: Heavily armored front-line assault vehicle and troop carrier. IconPalette: chrome + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor + Weaknesses: • Weak vs Infantry, Defenses\n• Cannot attack Aircraft + Attributes: • Can traverse water Mobile: - Speed: 56 - PauseOnCondition: notmobile || being-captured || empdisable || being-warped || driver-dead + Speed: 60 TurnSpeed: 512 Locomotor: lighthover Health: HP: 44000 - Armor: - Type: Heavy RevealsShroud: MinRange: 4c0 - Range: 5c0 + Range: 6c0 RevealGeneratedShroud: False RevealsShroud@GAPGEN: Range: 4c0 @@ -825,72 +1851,139 @@ INTL: WithMuzzleOverlay: ProducibleWithLevel: Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded Selectable: - DecorationBounds: 28,28 + DecorationBounds: 1194, 1194 Cargo: - Types: Infantry + Types: Infantry, Hacker MaxWeight: 5 LoadingCondition: notmobile LoadedCondition: cargo + PassengerConditions: + e6: loaded-engi + n6: loaded-engi + s6: loaded-engi + e7: loaded-cmdo + rmbo: loaded-cmdo + bori: loaded-cmdo + yuri: loaded-cmdo + mast: loaded-cmdo + WithCargoSounds: + EnterSounds: genter1a.aud + ExitSounds: gexit1a.aud + CargoBlocked: + RequiresCondition: mindcontrolled WithCargoPipsDecoration: + WithDecoration@COMMANDOSKULL: + RequiresCondition: loaded-cmdo Hovers: BobDistance: -25 RequiresCondition: !empdisable && !being-warped && !driver-dead WithShadow: Offset: 43, 128, 0 ZOffset: -129 + RequiresCondition: !invisibility Capturable: RequiresCondition: !being-warped && !cargo Capturable@DRIVER_DEAD: RequiresCondition: driver-dead && !cargo - Targetable@DRIVERKILL: - RequiresCondition: !driver-dead && !cargo + Targetable@MindControlResistant: + TargetTypes: MindControlResistant + RequiresCondition: cargo + Targetable@MindControlImmune: + TargetTypes: MindControlImmune + RequiresCondition: loaded-cmdo TurretedFloating: TurnSpeed: 16 Offset: 0,0,0 RealignDelay: 75 AttackTurreted: - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded Armaments: primary + Turrets: primary, shield WithSpriteTurret: + GrantConditionOnTerrain@ONWATER: + TerrainTypes: Water + Condition: onwater + KillsSelf@SINK: + RequiresCondition: onwater && (empdisable || driver-dead) + Targetable@ONWATER: + TargetTypes: Water, Ship + RequiresCondition: onwater + DetectCloaked: + Range: 4c0 + DetectionTypes: Mine + RequiresCondition: loaded-engi + -WithFacingSpriteBody@SHIELDS: + WithSpriteTurret@SHIELDS: + Turret: shield + RequiresCondition: shields-upgrade && shields-up + Sequence: shield + Palette: scrinshield-ignore-lighting-alpha50 + TurretedFloating@SHIELDS: + Turret: shield + TurnSpeed: 16 + RealignDelay: 75 + RequiresCondition: shields-upgrade + Shielded: + MaxStrength: 6000 + Encyclopedia: + Category: Scrin/Vehicles INTL.AI: Inherits: INTL - Inherits: ^AIUNLOAD RenderSprites: Image: INTL Buildable: - Prerequisites: ~botplayer, ~vehicles.scrin, ~techlevel.low + Prerequisites: ~botplayer, ~vehicles.scrin, ~!scrt, ~techlevel.low + WithCargoSounds: + -EnterSounds: + -Encyclopedia: + Selectable: + Class: intl + +INTL.AI2: + Inherits: INTL.AI + Inherits@AIUNLOAD: ^AIUNLOAD + RenderSprites: + Image: INTL + Buildable: + Prerequisites: ~botplayer, ~vehicles.scrin, ~scrt, ~techlevel.low Cargo: InitialUnits: S1,S1,S2,S3,S3 CORR: Inherits: ^Tank + Inherits@ScrinUnitPalette: ^ScrinUnitPalette Inherits@GAINSEXPERIENCE: ^GainsExperience Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove Inherits@BERSERK: ^Berserk Inherits@SLOWCRUSH: ^SlowedByCrushing - RenderSprites: - PlayerPalette: overlayplayerscrin + Inherits@SCRINVEHICLEVOICE: ^ScrinVehicleVoice Valued: - Cost: 1000 + Cost: 1100 Tooltip: Name: Corrupter Selectable: - DecorationBounds: 36,36,0,-3 + DecorationBounds: 1536, 1536, 0, -128 UpdatesPlayerStatistics: AddToArmyValue: true Buildable: - BuildPaletteOrder: 140 + BuildPaletteOrder: 210 Prerequisites: anyradar, ~vehicles.corr, ~techlevel.medium - Queue: Vehicle - Description: Medium-ranged anti-infantry/structure unit.\n Strong vs Infantry, Buildings\n Weak vs Tanks, Defenses, Aircraft + Queue: VehicleSQ, VehicleMQ + Description: Medium-ranged anti-infantry/structure unit. IconPalette: chrome + TooltipExtras: + Strengths: • Strong vs Infantry, Buildings, Light Armor + Weaknesses: • Weak vs Heavy Armor, Defenses\n• Cannot attack Aircraft\n• Has difficulty hitting moving targets Mobile: - Speed: 66 + Speed: 72 TurnSpeed: 16 Health: - HP: 42000 + HP: 36000 Armor: Type: Light RevealsShroud: @@ -903,12 +1996,16 @@ CORR: Weapon: CorrupterSpew LocalOffset: 750,0,100 AttackFrontal: - PauseOnCondition: empdisable || being-warped - Explodes: - Weapon: CorruptorExplode - EmptyWeapon: CorruptorExplode + PauseOnCondition: empdisable || being-warped || blinded + FacingTolerance: 0 + FireWarheadsOnDeath: + Weapon: CorrupterExplode + EmptyWeapon: CorrupterExplode ProducibleWithLevel: Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded WithMoveAnimation: ValidMovementTypes: Horizontal, Vertical, Turn GrantConditionOnFaction@TRAVELERSPEED: @@ -917,34 +2014,40 @@ CORR: SpeedMultiplier@TRAVELERSPEED: RequiresCondition: travelerspeed Modifier: 115 + Encyclopedia: + Category: Scrin/Vehicles LCHR: Inherits: ^Tank + Inherits@ScrinUnitPalette: ^ScrinUnitPalette Inherits@GAINSEXPERIENCE: ^GainsExperience Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove Inherits@BERSERK: ^Berserk Inherits@SLOWCRUSH: ^SlowedByCrushing - RenderSprites: - PlayerPalette: overlayplayerscrin + Inherits@SCRINVEHICLEVOICE: ^ScrinVehicleVoice Valued: - Cost: 900 + Cost: 1000 Tooltip: Name: Leecher Selectable: - DecorationBounds: 36,36,0,-3 + DecorationBounds: 1536, 1536, 0, -128 UpdatesPlayerStatistics: AddToArmyValue: true Buildable: - BuildPaletteOrder: 141 + BuildPaletteOrder: 211 Prerequisites: anyradar, ~vehicles.collector, ~techlevel.medium - Queue: Vehicle - Description: Medium-ranged anti-infantry/structure unit.\n Regenerates health while dealing damage\n Disables power plants and radars\n Strong vs Infantry, Buildings\n Weak vs Tanks, Defenses, Aircraft + Queue: VehicleSQ, VehicleMQ + Description: Medium-ranged anti-infantry/structure unit. IconPalette: chromes + TooltipExtras: + Strengths: • Strong vs Infantry, Buildings, Light Armor + Weaknesses: • Weak vs Heavy Armor, Defenses\n• Cannot attack Aircraft + Attributes: • Regenerates health while dealing damage (without upgrade)\n• Disables power plants\n• Regenerates and heals allies when in coalescence form (with upgrade)\n• Special Ability: Coalescence (with upgrade) Mobile: - Speed: 80 - TurnSpeed: 24 + Speed: 82 + TurnSpeed: 20 Health: - HP: 24000 + HP: 28000 Armor: Type: Light RevealsShroud: @@ -955,105 +2058,221 @@ LCHR: Range: 4c0 Armament@PRIMARY: Weapon: LeecherBeam - LocalOffset: 700,0,300, 700,-500,100, 700,500,100 + LocalOffset: 720,0,200, 720,-500,0, 720,500,0 + MuzzleSequence: muzzle + MuzzlePalette: scrin + WithMuzzleOverlay: AttackFrontal: - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded + FacingTolerance: 0 ProducibleWithLevel: Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded WithMoveAnimation: ValidMovementTypes: Horizontal, Vertical, Turn ConvertsDamageToHealth: - DamagePercentConverted: 20 - Explodes: + DamagePercentConverted: 30 + RequiresCondition: !coalescence-upgrade + InvalidTargetTypes: Husk + FireWarheadsOnDeath: + Weapon: LeecherExplode + EmptyWeapon: LeecherExplode + RequiresCondition: !coalescence-upgrade && !being-warped + FireWarheadsOnDeath@COALESCENCE: + Weapon: LeecherCoalesce + EmptyWeapon: LeecherCoalesce + RequiresCondition: coalescence-upgrade && !being-warped + GrantConditionOnPrerequisite@COALESCENCE: + Condition: coalescence-upgrade + Prerequisites: coalescence.upgrade + SpawnActorOnDeathCA: + Actor: lchr.orb + RequiresCondition: coalescence-upgrade && !being-warped + InheritsSelection: true + InheritsControlGroup: true + InheritsStance: true + InheritsExperience: true + KillsSelf: + RequiresCondition: triggered + ActorLostNotification: + RequiresCondition: !coalescence-upgrade + GrantConditionOnDeploy: + DeployedCondition: triggered + RequiresCondition: coalescence-upgrade && !being-warped + GivesBountyCA: + RequiresCondition: global-bounty && !coalescence-upgrade + Encyclopedia: + Category: Scrin/Vehicles + EncyclopediaExtras: + Subfaction: collector + +LCHR.Orb: + Inherits@1: ^1x1Shape + Inherits@2: ^SelectableSupportUnit + Inherits@GAINSEXPERIENCE: ^GainsExperience + Inherits@bounty: ^GlobalBounty + Inherits@Warpable: ^Warpable + ScriptTriggers: + Selectable: + DecorationBounds: 1536, 1536, 0, -128 + Tooltip: + Name: Leecher Orb + TooltipExtras: + Description: Heals nearby allies. Will revive into a Leecher if not destroyed. + RenderSprites: + Image: lchr.orb + Palette: caneon + WithSpriteBody: + RequiresCondition: !being-warped + WithSpriteBody@Warped: + Name: warped + Sequence: warped + RequiresCondition: being-warped + ClassicFacingBodyOrientation: + QuantizedFacings: 1 + Targetable: + TargetTypes: Ground, Vehicle + HiddenUnderFog: + Type: CenterPosition + RevealsShroud: + Range: 4c0 + Type: CenterPosition + Health: + HP: 35000 + Armor: + Type: Light + Valued: + Cost: 1000 + Immobile: + OccupiesSpace: true + PeriodicExplosion@init: + Weapon: LeecherOrbHealInit + PeriodicExplosion@hot: + Weapon: LeecherOrbHeal + KillsSelf: + Delay: 0 + RequiresCondition: resurrect + FireWarheadsOnDeath: Weapon: LeecherExplode EmptyWeapon: LeecherExplode + RequiresCondition: !resurrect + FireWarheadsOnDeath@COALESCENCE: + Weapon: LeecherCoalesce + EmptyWeapon: LeecherCoalesce + RequiresCondition: resurrect + ActorLostNotification: + RequiresCondition: !resurrect + AmmoPool: + Ammo: 1 + InitialAmmo: 0 + AmmoCondition: resurrect + ReloadAmmoPoolCA: + Delay: 500 + Count: 1 + ShowSelectionBar: true + SelectionBarColor: ff0000 + PauseOnCondition: being-warped + SpawnActorOnDeathCA: + Actor: lchr + RequiresCondition: resurrect + InheritsSelection: true + InheritsControlGroup: true + InheritsStance: true + InheritsExperience: true + ProximityExternalCondition@LCHRHEAL: + Condition: lchr-healing + Range: 3c512 + AutoTarget: + AttackOmni: + WithColoredSelectionBox@PLAYERBOX: + ColorSource: Player + ValidRelationships: Ally, Enemy + WithRangeCircleCA: + Type: LeecherOrb + Range: 3c512 + UsePlayerColor: true + PlayerColorAlpha: 160 + Visible: Always STCR: Inherits: ^Tank + Inherits@ScrinUnitPalette: ^ScrinUnitPalette Inherits@GAINSEXPERIENCE: ^GainsExperience Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove Inherits@BERSERK: ^Berserk - RenderSprites: - PlayerPalette: overlayplayerscrin + Inherits@IONCONDUITS: ^IonConduits + Inherits@SCRINVEHICLEVOICE: ^ScrinVehicleVoice + Inherits@HULLREGEN: ^HullRegen + Inherits@SHIELDS: ^ScrinShields + Inherits@HeavyArmor: ^HeavyArmor Valued: Cost: 1350 Tooltip: Name: Stormcrawler Selectable: - DecorationBounds: 36,36,0,-3 + DecorationBounds: 1536, 1536, 0, -128 UpdatesPlayerStatistics: AddToArmyValue: true Buildable: - BuildPaletteOrder: 150 + BuildPaletteOrder: 213 Prerequisites: anyradar, ~vehicles.reaper, ~techlevel.medium - Queue: Vehicle - Description: Slow moving, durable, short-range assault unit.\n Splits incoming damage with other nearby Stormcrawlers.\n Strong vs Defenses, Vehicles\n Weak vs Infantry, Aircraft + Queue: VehicleSQ, VehicleMQ + Description: Slow moving, very durable, short-range assault unit. IconPalette: chromes + TooltipExtras: + Strengths: • Strong vs Defenses, Buildings + Weaknesses: • Weak vs Infantry\n• Cannot attack Aircraft Mobile: - Speed: 43 + Speed: 46 TurnSpeed: 16 Health: - HP: 74000 - Armor: - Type: Heavy + HP: 84000 RevealsShroud: MinRange: 4c0 - Range: 5c0 + Range: 6c0 RevealGeneratedShroud: False RevealsShroud@GAPGEN: Range: 4c0 Armament@PRIMARY: Weapon: StormcrawlerZap - LocalOffset: 0,0,350, -250,0,350, 250,0,350 - TargetRelationships: Enemy, Neutral - AttackFrontal: + LocalOffset: 0,200,350, -250,-200,350, 250,200,350, 0,-200,350, -250,200,350, 250,-200,350 + AttackFollowFrontal: FacingTolerance: 512 - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded + RangeMargin: 0 ProducibleWithLevel: Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded WithShadow: Offset: 80, 80, 0 ZOffset: -81 - Targetable@STORMCRAWLERCHARGE: - TargetTypes: Stormcrawler - ExternalCondition@STORMCRAWLERCHARGE: - Condition: stormcrawlercharge - WithDecoration@STORMCRAWLERCHARGE1: - Image: pips - Sequence: pip-stcr1 - Palette: scrin - Position: TopRight - RequiresCondition: stormcrawlercharge >= 2 && stormcrawlercharge < 3 && !empdisable && !being-warped - WithDecoration@STORMCRAWLERCHARGE2: - Image: pips - Sequence: pip-stcr2 - Palette: scrin - Position: TopRight - RequiresCondition: stormcrawlercharge >= 3 && !empdisable && !being-warped - PeriodicExplosion: - Weapon: StormcrawlerChargeSource - ProximityExternalCondition@STORMCRAWLERCHARGE: - Range: 4c512 - Condition: stormcrawlercharge - DamageMultiplier@STORMCRAWLERCHARGE1: - Modifier: 75 - RequiresCondition: stormcrawlercharge >= 2 && stormcrawlercharge < 3 && !empdisable && !being-warped - DamageMultiplier@STORMCRAWLERCHARGE2: - Modifier: 60 - RequiresCondition: stormcrawlercharge >= 3 && !empdisable && !being-warped - ReflectsDamage@STORMCRAWLERCHARGE1: - ValidRelationships: Ally - ValidActors: stcr - Range: 4c512 - DamagePercentage: 33 - RequiresCondition: stormcrawlercharge >= 2 && stormcrawlercharge < 3 && !empdisable && !being-warped - ReflectsDamage@STORMCRAWLERCHARGE2: - ValidRelationships: Ally - ValidActors: stcr - Range: 4c512 - DamagePercentage: 33 - MaxUnits: 2 - RequiresCondition: stormcrawlercharge >= 3 && !empdisable && !being-warped + RequiresCondition: !invisibility + SpawnActorOnDeath: + Actor: STCR.Husk + RequiresCondition: !being-warped + LaysMinefield@IONSTORM: + Mines: strm2 + Locations: 0,0 + KillOnRemove: false + RemoveOnDisable: false + RecreationInterval: 100 + RequiresCondition: storm-active + RangeMultiplier@IONSTORM1: + Modifier: 110 + RangeMultiplier@IONSTORM2: + Modifier: 120 + RangeMultiplier@IONSTORM3: + Modifier: 130 + Shielded: + MaxStrength: 10000 + Encyclopedia: + Category: Scrin/Vehicles + EncyclopediaExtras: + Subfaction: reaper DEVO: Inherits: ^Vehicle @@ -1062,27 +2281,32 @@ DEVO: Inherits@BERSERK: ^Berserk Inherits@RESCONV: ^ResourceConversion Inherits@HOVERTRAIL: ^HoverTrail + Inherits@SCRINVEHICLEVOICE: ^ScrinVehicleVoice Buildable: - Queue: Vehicle - BuildPaletteOrder: 220 - Prerequisites: anyradar, ~vehicles.devo, ~techlevel.medium - Description: Medium hover tank.\n Can move in any direction while firing.\n Strong vs Vehicles, Defenses\n Weak vs Aircraft + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 212 + Prerequisites: anyradar, ~vehicles.scrin, ~techlevel.medium + Description: Maneuverable medium-range hover tank. IconPalette: chrome + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor, Defenses + Weaknesses: • Weak vs Buildings, Infantry\n• Cannot attack Aircraft + Attributes: • Can traverse water Valued: Cost: 1350 Tooltip: Name: Devourer Tank Selectable: - DecorationBounds: 28,28 + DecorationBounds: 1194, 1194 UpdatesPlayerStatistics: AddToArmyValue: true Health: HP: 27500 Armor: - Type: Heavy + Type: Light Mobile: TurnSpeed: 512 - Speed: 66 + Speed: 70 Locomotor: lighthover Hovers: BobDistance: -25 @@ -1097,55 +2321,85 @@ DEVO: Weapon: DevourerLaser PauseOnCondition: (ammo || charged-fire) && !uncharged-fire LocalOffset: 850,0,208 + MuzzleSequence: muzzle + MuzzlePalette: scrin Armament@PRIMARYCHARGED: Name: primary-charged Weapon: DevourerLaserCharged PauseOnCondition: !ammo || uncharged-fire LocalOffset: 850,0,208 + MuzzleSequence: muzzle + MuzzlePalette: scrin + WithMuzzleOverlay: ProducibleWithLevel: Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded TurretedFloating: TurnSpeed: 16 Offset: 0,0,0 - RealignDelay: 75 + RealignDelay: 100 AttackTurreted: - PauseOnCondition: empdisable || being-warped + TargetFrozenActors: True + PauseOnCondition: empdisable || being-warped || blinded Armaments: primary, primary-charged WithSpriteTurret: ProductionCostMultiplier@REAPBONUS: Multiplier: 90 - Prerequisites: vehicles.reaper + Prerequisites: player.reaper + GrantConditionOnTerrain@ONWATER: + TerrainTypes: Water + Condition: onwater + KillsSelf@SINK: + RequiresCondition: onwater && (empdisable || driver-dead) + Targetable@ONWATER: + TargetTypes: Water, Ship + RequiresCondition: onwater + GrantConditionOnAttack@PRIMARYCHARGED: + RequiresCondition: !anathema + GrantConditionOnAttack@PRIMARYCHARGEDANATHEMA: + ArmamentNames: primary-charged + Condition: charged-fire + RevokeDelay: 40 + RequiresCondition: anathema + Encyclopedia: + Category: Scrin/Vehicles DARK: Inherits: ^Vehicle + Inherits@ScrinUnitPalette: ^ScrinUnitPalette Inherits@GAINSEXPERIENCE: ^GainsExperience Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove Inherits@BERSERK: ^Berserk Inherits@HOVERTRAIL: ^HoverTrail - RenderSprites: - PlayerPalette: overlayplayerscrin + Inherits@SCRINVEHICLEVOICE: ^ScrinVehicleVoice + Inherits@SLOWCRUSH: ^SlowedByCrushing + Inherits@HeavyArmor: ^HeavyArmor Buildable: - Queue: Vehicle - BuildPaletteOrder: 221 - Prerequisites: anyradar, ~vehicles.harbinger, ~techlevel.medium - Description: Heavy hover tank with armed with rift cannon.\n Strong vs Vehicles, Defenses\n Weak vs Aircraft, Infantry + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 292 + Prerequisites: scrt, ~vehicles.scrin, ~malefic.allegiance, ~techlevel.high + Description: Heavy hover tank armed with a rift cannon. IconPalette: chromes + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor, Defenses + Weaknesses: • Weak vs Buildings, Infantry\n• Cannot attack Aircraft + Attributes: • Can traverse water\n• Damage scales with the max health of the target Valued: Cost: 1350 Tooltip: Name: Darkener Tank Selectable: - DecorationBounds: 28,28 + DecorationBounds: 1194, 1194 UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 40000 - Armor: - Type: Heavy + HP: 38000 Mobile: TurnSpeed: 16 - Speed: 56 - Locomotor: lighthover + Speed: 60 + Locomotor: hover RevealsShroud: MinRange: 4c0 Range: 6c0 @@ -1160,11 +2414,15 @@ DARK: WithMuzzleOverlay: ProducibleWithLevel: Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded Turreted: TurnSpeed: 16 Offset: 0,0,0 AttackTurreted: - PauseOnCondition: empdisable || being-warped + TargetFrozenActors: True + PauseOnCondition: empdisable || being-warped || blinded Armaments: primary WithSpriteTurret: Hovers: @@ -1173,32 +2431,49 @@ DARK: WithShadow: Offset: 43, 128, 0 ZOffset: -129 + RequiresCondition: !invisibility + GrantConditionOnTerrain@ONWATER: + TerrainTypes: Water + Condition: onwater + KillsSelf@SINK: + RequiresCondition: onwater && (empdisable || driver-dead) + Targetable@ONWATER: + TargetTypes: Water, Ship + RequiresCondition: onwater + Encyclopedia: + Category: Scrin/Vehicles + EncyclopediaExtras: + AdditionalInfo: Requires Malefic Allegiance. RUIN: Inherits: ^Vehicle + Inherits@ScrinUnitPalette: ^ScrinUnitPalette Inherits@GAINSEXPERIENCE: ^GainsExperience Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove Inherits@BERSERK: ^Berserk Inherits@RESCONV: ^ResourceConversion Inherits@HOVERTRAIL: ^HoverTrail - RenderSprites: - PlayerPalette: overlayplayerscrin + Inherits@SCRINVEHICLEVOICE: ^ScrinVehicleVoice Valued: Cost: 1250 Tooltip: Name: Ruiner Selectable: - DecorationBounds: 28,28 + DecorationBounds: 1194, 1194 UpdatesPlayerStatistics: AddToArmyValue: true Buildable: - BuildPaletteOrder: 280 - Prerequisites: scrt, ~vehicles.harbinger, ~techlevel.high - Queue: Vehicle - Description: Long-range artillery.\n Strong vs Buildings, Defenses, Infantry\n Weak vs Tanks, Aircraft + BuildPaletteOrder: 290 + Prerequisites: scrt, ~vehicles.scrin, ~loyalist.allegiance, ~techlevel.high + Queue: VehicleSQ, VehicleMQ + Description: Long-range hover artillery. IconPalette: chrome + TooltipExtras: + Strengths: • Strong vs Buildings, Defenses, Infantry, Light Armor + Weaknesses: • Weak vs Heavy Armor\n• Cannot attack Aircraft\n• Has difficulty hitting moving targets + Attributes: • Can traverse water Mobile: - Speed: 80 + Speed: 72 TurnSpeed: 512 Locomotor: lighthover Health: @@ -1225,16 +2500,22 @@ RUIN: MuzzlePalette: scrin PauseOnCondition: !ammo || uncharged-fire WithMuzzleOverlay: - Explodes: - Weapon: BarrelExplode + FireWarheadsOnDeath: + Weapon: ArtilleryExplode + LoadedChance: 75 + RequiresCondition: !being-warped ProducibleWithLevel: Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded Hovers: BobDistance: -25 RequiresCondition: !empdisable && !being-warped && !driver-dead WithShadow: Offset: 43, 128, 0 ZOffset: -129 + RequiresCondition: !invisibility TurretedFloating: TurnSpeed: 16 Offset: 0,0,0 @@ -1242,51 +2523,65 @@ RUIN: AttackTurreted: ForceFireIgnoresActors: True TargetFrozenActors: True - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded Armaments: primary, primary-charged WithSpriteTurret: AmmoPool@RESCONV: Ammo: 12 ReloadAmmoPool@RESCONV: Count: 3 - ReloadAmmoPoolCA@RESCONVDRAIN: - Count: -3 WithAmmoPipsDecoration@RESCONV: PipCount: 4 - GrantCondition@RESCONV: + GrantCondition@RESCONVCHARGE: RequiresCondition: resconv-upgrade && on-resource && (ammo < 12 || charged-fire) GrantConditionOnAttack@PRIMARY: RevokeDelay: 175 GrantConditionOnAttack@PRIMARYCHARGED: RevokeDelay: 175 + GrantConditionOnTerrain@ONWATER: + TerrainTypes: Water + Condition: onwater + KillsSelf@SINK: + RequiresCondition: onwater && (empdisable || driver-dead) + Targetable@ONWATER: + TargetTypes: Water, Ship + RequiresCondition: onwater + Encyclopedia: + Category: Scrin/Vehicles + EncyclopediaExtras: + AdditionalInfo: Requires Loyalist Allegiance. ATMZ: Inherits: ^Vehicle + Inherits@ScrinUnitPalette: ^ScrinUnitPalette Inherits@GAINSEXPERIENCE: ^GainsExperience - Inherits@AUTOTARGET: ^AutoTargetAllAssaultMoveAntiAir + Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove Inherits@BERSERK: ^Berserk Inherits@HOVERTRAIL: ^HoverTrail - RenderSprites: - PlayerPalette: overlayplayerscrin + Inherits@SCRINVEHICLEVOICE: ^ScrinVehicleVoice Valued: - Cost: 1250 + Cost: 1350 Tooltip: Name: Atomizer Selectable: - DecorationBounds: 28,28 + DecorationBounds: 1194, 1194 UpdatesPlayerStatistics: AddToArmyValue: true Buildable: - Queue: Vehicle + Queue: VehicleSQ, VehicleMQ BuildPaletteOrder: 285 - Prerequisites: scrt, ~vehicles.collector, ~techlevel.medium - Description: Lightly armored long-range support unit.\n Targets take damage over time\n Targets have reduced rate of fire\n Strong vs Vehicles, Aircraft\n Weak vs Infantry, Buildings + Prerequisites: scrt, ~vehicles.collector, ~techlevel.high + Description: Lightly armored long-range anti-tank unit that atomizes vehicles and defenses. IconPalette: chrome + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor, Defenses + Weaknesses: • Weak vs Infantry, Buildings\n• Cannot attack Aircraft + Attributes: • Atomizes up to 4 targets\n• Affected targets take damage over time\n• Affected targets have reduced speed and firepower\n• Can traverse water Mobile: - Speed: 66 + Speed: 72 Locomotor: lighthover Health: - HP: 15000 + HP: 18000 Armor: Type: Light RevealsShroud: @@ -1303,47 +2598,65 @@ ATMZ: WithShadow: Offset: 43, 128, 0 ZOffset: -129 + RequiresCondition: !invisibility Armament: Weapon: AtomizerBolts - LocalOffset: 350,0,450 - Armament@SECONDARY: - Name: secondary - Weapon: AtomizerBoltsAA - LocalOffset: 350,0,450 + LocalOffset: 350,0,350 AttackTurreted: - PauseOnCondition: empdisable || being-warped + TargetFrozenActors: True + PauseOnCondition: empdisable || being-warped || blinded WithSpriteTurret: ProducibleWithLevel: Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded + GrantConditionOnTerrain@ONWATER: + TerrainTypes: Water + Condition: onwater + KillsSelf@SINK: + RequiresCondition: onwater && (empdisable || driver-dead) + Targetable@ONWATER: + TargetTypes: Water, Ship + RequiresCondition: onwater + Encyclopedia: + Category: Scrin/Vehicles + EncyclopediaExtras: + Subfaction: collector TPOD: Inherits: ^Tank Inherits@GAINSEXPERIENCE: ^GainsExperience Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove Inherits@BERSERK: ^Berserk + Inherits@HeavyArmor: ^HeavyArmor + Inherits@TANKBUSTERVULN: ^TankBusterVulnerability + Inherits@ONRESOURCE: ^OnResourceConditions Buildable: - Queue: Vehicle - BuildPaletteOrder: 310 - Prerequisites: techcenter, ~vehicles.tpod, ~techlevel.high - Description: Heavy assault walker with beam weapons.\n Strong vs Vehicles.\n Weak vs Aircraft + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 281 + Prerequisites: scrt, ~vehicles.tpod, ~techlevel.high + Description: Heavy assault walker with beam weapons. IconPalette: chrome + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor + Weaknesses: • Cannot attack Aircraft + Attributes: • Can crush concrete walls\n• Self repairs on Tiberium or other resources when not in combat Voiced: VoiceSet: TripodVoice Valued: Cost: 1800 Selectable: - Bounds: 30,52,0,-10 + Bounds: 1280, 2218, 0, -426 Tooltip: Name: Annihilator Tripod UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 74000 - Armor: - Type: Heavy + HP: 86000 Mobile: Locomotor: heavytracked - Speed: 43 + Speed: 50 TurnSpeed: 512 Passenger: Weight: 3 @@ -1365,21 +2678,20 @@ TPOD: MuzzleSequence: muzzle MuzzlePalette: scrin FireDelay: 20 - Armament@SOUND: - Name: sound - Weapon: TripodLaserSound - FireDelay: 20 WithMuzzleOverlay: Carryable: LocalOffset: 0,0,700 + -Crushable: ProducibleWithLevel: Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded TurretedFloating: TurnSpeed: 12 Offset: 0,0,0 AttackTurreted: - PauseOnCondition: empdisable || being-warped - Armaments: primary, secondary, sound + PauseOnCondition: empdisable || being-warped || blinded WithSpriteTurret: WithMoveAnimation: DeathSounds: @@ -1393,26 +2705,45 @@ TPOD: SpeedMultiplier@TRAVELERSPEED: RequiresCondition: travelerspeed Modifier: 115 + WithIdleOverlay@MINDCONTROL: + Offset: 0,0,1024 + ChangesHealth@THEAL: + Step: 0 + PercentageStep: 1 + Delay: 15 + StartIfBelow: 100 + DamageCooldown: 150 + RequiresCondition: on-resource + WithDecoration@TibRepair: + Image: select + Palette: chrome + Sequence: repair-small + Position: Center + RequiresCondition: on-resource && damaged + BlinkInterval: 15 + BlinkPattern: on, off + Encyclopedia: + Category: Scrin/Vehicles -RPTP: +RTPD: Inherits: TPOD + Inherits@ScrinUnitPalette: ^ScrinUnitPalette Inherits@RESCONV: ^ResourceConversion Buildable: - BuildPaletteOrder: 311 + BuildPaletteOrder: 282 Prerequisites: scrt, ~vehicles.reaper, ~techlevel.high - Description: Heavy assault walker with beam weapons.\nWeapons empowered by Tiberium.\n Strong vs Vehicles.\n Weak vs Aircraft - RenderSprites: - PlayerPalette: overlayplayerscrin + TooltipExtras: + Attributes: • Can crush concrete walls\n• Weapons empowered by Tiberium or other resources\n• Self repairs on Tiberium or other resources when not in combat Valued: Cost: 2200 Tooltip: Name: Reaper Tripod Health: - HP: 88000 + HP: 102000 SpawnActorOnDeath: - Actor: RPTP.Husk + Actor: RTPD.Husk AttackTurreted: - Armaments: primary, secondary, primary-charged, secondary-charged, sound, sound-charged + Armaments: primary, secondary, primary-charged, secondary-charged Armament@PRIMARY: Weapon: ReaperLaser LocalOffset: 700,550,1000 @@ -1422,10 +2753,6 @@ RPTP: LocalOffset: 700,-550,1000 FireDelay: 15 PauseOnCondition: (ammo || charged-fire) && !uncharged-fire - Armament@SOUND: - Weapon: ReaperLaserSound - FireDelay: 15 - PauseOnCondition: (ammo || charged-fire) && !uncharged-fire Armament@PRIMARYCHARGED: Name: primary-charged Weapon: ReaperLaserCharged @@ -1433,6 +2760,8 @@ RPTP: PauseOnCondition: !ammo || uncharged-fire MuzzleSequence: muzzle MuzzlePalette: scrin + AmmoUsage: 2 + RequiresCondition: !resconv-upgrade Armament@SECONDARYCHARGED: Name: secondary-charged Weapon: ReaperLaserChargedReversed @@ -1441,26 +2770,37 @@ RPTP: PauseOnCondition: !ammo || uncharged-fire MuzzleSequence: muzzle MuzzlePalette: scrin - Armament@SOUNDCHARGED: - Name: sound-charged - Weapon: ReaperLaserChargedSound + AmmoUsage: 2 + RequiresCondition: !resconv-upgrade + Armament@PRIMARYCHARGEDUPG: + Name: primary-charged + Weapon: ReaperLaserCharged + LocalOffset: 700,550,1000 + PauseOnCondition: !ammo || uncharged-fire + MuzzleSequence: muzzle + MuzzlePalette: scrin + RequiresCondition: resconv-upgrade + Armament@SECONDARYCHARGEDUPG: + Name: secondary-charged + Weapon: ReaperLaserChargedReversed + LocalOffset: 700,-550,1000 FireDelay: 15 PauseOnCondition: !ammo || uncharged-fire - -GrantConditionOnPrerequisite@RESCONV: + MuzzleSequence: muzzle + MuzzlePalette: scrin + RequiresCondition: resconv-upgrade AmmoPool@RESCONV: - Ammo: 70 + Ammo: 20 Armaments: primary-charged, secondary-charged ReloadAmmoPool@RESCONV: - Count: 14 - ReloadAmmoPoolCA@RESCONVDRAIN: - Count: -14 + Count: 4 WithAmmoPipsDecoration@RESCONV: PipCount: 5 - GrantCondition@RESCONV: - RequiresCondition: on-resource && (ammo < 70 || charged-fire) + GrantCondition@RESCONVCHARGE: + RequiresCondition: on-resource && (ammo < 20 || charged-fire) GrantConditionOnAttack@PRIMARY: RevokeDelay: 50 - GrantConditionOnAttack@PRIMARYCHARGED + GrantConditionOnAttack@PRIMARYCHARGED: RevokeDelay: 50 WithIdleOverlay@RESCONVTIB: Offset: 0,0,200 @@ -1470,85 +2810,300 @@ RPTP: Offset: 0,0,200 WithIdleOverlay@RESCONVGEMS: Offset: 0,0,200 + EncyclopediaExtras: + Subfaction: reaper -SMCV: - Inherits: ^Vehicle-NOUPG - Inherits@SELECTION: ^SelectableSupportUnit +OBLT: + Inherits: ^Vehicle + Inherits@ScrinUnitPalette: ^ScrinUnitPalette + Inherits@GAINSEXPERIENCE: ^GainsExperience + Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove + Inherits@BERSERK: ^Berserk Inherits@HOVERTRAIL: ^HoverTrail + Inherits@SCRINVEHICLEVOICE: ^ScrinVehicleVoice + Inherits@HeavyArmor: ^HeavyArmor Buildable: - Queue: Vehicle - BuildPaletteOrder: 502 - Prerequisites: repair, ~vehicles.scrin, ~techlevel.infonly - IconPalette: chrome - Description: Deploys into another Colony Platform.\n Unarmed - BuildDurationModifier: 50 - RenderSprites: - PlayerPalette: overlayplayerscrin + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 283 + Prerequisites: scrt, ~vehicles.harbinger, ~techlevel.high + Description: Heavy artillery that creates a charged particle stream through which it projects a powerful energy pulse, damaging everything it passes through. + IconPalette: chromes + TooltipExtras: + Strengths: • Strong vs Buildings, Defenses, Light Armor, Infantry + Weaknesses: • Weak vs Heavy Armor\n• Cannot attack Aircraft + Attributes: • Can traverse water Valued: - Cost: 3000 + Cost: 2300 Tooltip: - Name: Colony Ship + Name: Obliterator Selectable: - Priority: 4 - Bounds: 42,42 + DecorationBounds: 1877, 1621, 0, -170 + UpdatesPlayerStatistics: + AddToArmyValue: true Health: - HP: 75000 - Armor: - Type: Heavy + HP: 30000 Mobile: - Speed: 51 - Locomotor: lighthover TurnSpeed: 512 - RevealsShroud: - Range: 4c0 - Transforms: - IntoActor: sfac - Offset: -1, 0 - Facing: 384 - TransformSounds: placbldg.aud, build5.aud - NoTransformNotification: BuildingCannotPlaceAudio - PauseOnCondition: empdisable || being-warped - MustBeDestroyed: - RequiredForShortGame: true - BaseBuilding: - SpawnActorOnDeath: - Actor: SMCV.Husk - RequiresCondition: !being-warped - TransferTimedExternalConditionOnTransform: - Condition: invulnerability - -Crushable: - Targetable: - TargetTypes: Ground, Vehicle, C4, ChaosImmune, MindControlImmune + Speed: 48 + Locomotor: lighthover + TurretedFloating: + TurnSpeed: 10 + Offset: 0,0,0 + RealignDelay: 100 + WithSpriteTurret: + WithShadow: + Offset: 43, 128, 0 + ZOffset: -129 + RequiresCondition: !invisibility Hovers: BobDistance: -25 RequiresCondition: !empdisable && !being-warped && !driver-dead - -# -# ---- Aircraft -# - -STMR: - Inherits: ^Helicopter - Inherits@AUTOTARGET: ^AutoTargetAllAssaultMove - Inherits@GAINSEXPERIENCE: ^GainsExperience - Inherits@HULLREGEN: ^HullRegen - Buildable: - Queue: Aircraft - BuildAtProductionType: Plane - BuildPaletteOrder: 90 - Prerequisites: ~aircraft.scrin, ~techlevel.medium - Description: Durable patrol craft.\n Can detect submarines.\n Strong vs Infantry, Light Armor, Aircraft\n Weak vs Tanks, Buildings - IconPalette: chrome - Valued: - Cost: 1650 - Voiced: - VoiceSet: VehicleVoice - Tooltip: - Name: Stormrider - UpdatesPlayerStatistics: - AddToArmyValue: true + RevealsShroud: + MinRange: 4c0 + Range: 5c0 + RevealGeneratedShroud: False + RevealsShroud@GAPGEN: + Range: 4c0 + Armament@PRIMARY: + Weapon: ObliteratorBolt + LocalOffset: 750,0,400 + MuzzleSequence: muzzle + MuzzlePalette: scrin + PauseOnCondition: !ammo + ReloadingCondition: reloading + Armament@SECONDARY: + Name: secondary + Weapon: ObliteratorCharge + LocalOffset: 750,0,400 + MuzzleSequence: muzzle + MuzzlePalette: scrin + PauseOnCondition: reloading + AmbientSoundCA@CHARGING: + SoundFiles: oblt-charge2.aud + InitialSound: oblt-charge1.aud + RequiresCondition: charging + AudibleThroughFog: true + GrantConditionOnAttack@CHARGING: + Condition: charging + ArmamentNames: secondary + RevokeDelay: 6 + AmmoPool: + Ammo: 1 + InitialAmmo: 0 + AmmoCondition: ammo + Armaments: primary + ReloadAmmoPoolCA@CHARGE: + Delay: 100 + Count: 1 + RequiresCondition: charging && !reloading + ShowSelectionBar: true + SelectionBarColor: ff00ff + DrainAmountOnDisabled: 2 + ReloadAmmoPoolCA@DRAIN: + Count: -1 + Delay: 1 + RequiresCondition: !charging + ShowSelectionBar: false + WithMuzzleOverlay: + ProducibleWithLevel: + Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded + AttackTurreted: + PauseOnCondition: empdisable || being-warped || blinded + TargetFrozenActors: True + ForceFireIgnoresActors: True + Armaments: primary, secondary + GrantConditionOnTerrain@ONWATER: + TerrainTypes: Water + Condition: onwater + KillsSelf@SINK: + RequiresCondition: onwater && (empdisable || driver-dead) + Targetable@ONWATER: + TargetTypes: Water, Ship + RequiresCondition: onwater + SpawnActorOnDeath: + Actor: OBLT.Husk + RequiresCondition: !being-warped + Targetable@Obliterator: + TargetTypes: Obliterator + Encyclopedia: + Category: Scrin/Vehicles + EncyclopediaExtras: + Subfaction: harbinger + +NULL: + Inherits: ^Vehicle + Inherits@ScrinUnitPalette: ^ScrinUnitPalette + Inherits@GAINSEXPERIENCE: ^GainsExperience + Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove + Inherits@BERSERK: ^Berserk + Inherits@HOVERTRAIL: ^HoverTrail + Inherits@SCRINVEHICLEVOICE: ^ScrinVehicleVoice + Inherits@HeavyArmor: ^HeavyArmor + Buildable: + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 291 + Prerequisites: scrt, ~vehicles.scrin, ~rebel.allegiance, ~techlevel.high + Description: Heavy hover tank that disables enemy weapons and vision. + IconPalette: chromes + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor + Weaknesses: • Weak vs Heavy Armor, Buildings, Defenses\n• Cannot attack Aircraft + Attributes: • Disables enemy weapons and vision\n• Can traverse water + Valued: + Cost: 1600 + Tooltip: + Name: Nullifier + Selectable: + DecorationBounds: 1877, 1621, 0, -170 + UpdatesPlayerStatistics: + AddToArmyValue: true Health: - HP: 26500 + HP: 25000 + Mobile: + TurnSpeed: 512 + Speed: 60 + Locomotor: lighthover + Hovers: + BobDistance: -25 + RequiresCondition: !empdisable && !being-warped && !driver-dead + RevealsShroud: + MinRange: 4c0 + Range: 6c0 + RevealGeneratedShroud: False + RevealsShroud@GAPGEN: + Range: 4c0 + Armament@PRIMARY: + Weapon: NullifierBolt + LocalOffset: 750,0,300 + MuzzleSequence: muzzle + WithMuzzleOverlay: + ProducibleWithLevel: + Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded + TurretedFloating: + TurnSpeed: 16 + Offset: 0,0,0 + RealignDelay: 100 + AttackTurreted: + PauseOnCondition: empdisable || being-warped || blinded + WithSpriteTurret: + GrantConditionOnTerrain@ONWATER: + TerrainTypes: Water + Condition: onwater + KillsSelf@SINK: + RequiresCondition: onwater && (empdisable || driver-dead) + Targetable@ONWATER: + TargetTypes: Water, Ship + RequiresCondition: onwater + SpawnActorOnDeath: + Actor: NULL.Husk + RequiresCondition: !being-warped + Encyclopedia: + Category: Scrin/Vehicles + EncyclopediaExtras: + AdditionalInfo: Requires Rebel Allegiance. + +SMCV: + Inherits: ^Vehicle-NOUPG + Inherits@ScrinUnitPalette: ^ScrinUnitPalette + Inherits@SELECTION: ^SelectableSupportUnit + Inherits@HOVERTRAIL: ^HoverTrail + Inherits@A2GPROTECTION: ^AirToGroundProtection + Inherits@SCRINVEHICLEVOICE: ^ScrinVehicleVoice + Inherits@EconomyPolicyDiscount: ^EconomyPolicyDiscount + Inherits@EconomyPolicyMcvSpeedBonus: ^EconomyPolicyMcvSpeedBonus + Inherits@HeavyArmor: ^HeavyArmor + Inherits@NodCovenantTarget: ^NodCovenantTarget + Buildable: + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 602 + Prerequisites: vehicles.mcv, ~vehicles.scrin + IconPalette: chrome + Description: Deploys into another Colony Platform. + BuildDurationModifier: 50 + TooltipExtras: + Weaknesses: • Unarmed + Attributes: • Special Ability: Deploy into Colony Platform\n• Can traverse water + Valued: + Cost: 3000 + Tooltip: + Name: Colony Ship + Selectable: + Priority: 4 + Bounds: 1792, 1792 + Health: + HP: 75000 + Mobile: + Speed: 54 + Locomotor: lighthover + TurnSpeed: 512 + RevealsShroud: + Range: 4c0 + Transforms: + IntoActor: sfac + Offset: -1, 0 + Facing: 384 + TransformSounds: placbldg.aud, build5.aud + NoTransformNotification: BuildingCannotPlaceAudio + NoTransformTextNotification: Cannot deploy here. + PauseOnCondition: empdisable || being-warped + MustBeDestroyed: + RequiredForShortGame: true + BaseBuilding: + ProvidesPrerequisite@anymcv: + Prerequisite: anymcv + SpawnActorOnDeath: + Actor: SMCV.Husk + RequiresCondition: !being-warped + TransferTimedExternalConditionOnTransform: + Condition: invulnerability + TransferTimedExternalConditionOnTransform@INVIS: + Condition: invisibility + -Crushable: + Targetable@MindControlImmune: + TargetTypes: MindControlImmune + Hovers: + BobDistance: -25 + RequiresCondition: !empdisable && !being-warped && !driver-dead + DamageTypeDamageMultiplier@A2GPROTECTION: + Modifier: 60 + Encyclopedia: + Category: Scrin/Vehicles + +# +# ---- Aircraft +# + +STMR: + Inherits: ^Helicopter + Inherits@AUTOTARGET: ^AutoTargetAllAssaultMove + Inherits@HULLREGEN: ^HullRegen + Inherits@SHIELDS: ^ScrinShields + Inherits@MothershipRearmable: ^MothershipRearmable + Inherits@SCRINVEHICLEVOICE: ^ScrinVehicleVoice + Buildable: + Queue: AircraftSQ, AircraftMQ + BuildPaletteOrder: 60 + Prerequisites: ~aircraft.scrin, ~techlevel.medium + Description: Durable patrol craft. + IconPalette: chrome + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor, Buildings, Aircraft + Weaknesses: • Weak vs Defenses + Valued: + Cost: 1650 + Tooltip: + Name: Stormrider + GenericName: Aircraft + UpdatesPlayerStatistics: + AddToArmyValue: true + Health: + HP: 26000 RevealsShroud: Range: 11c0 MinRange: 9c0 @@ -1559,22 +3114,26 @@ STMR: Type: GroundPosition Armament@PRIMARY: Weapon: StormriderZap - LocalOffset: 350,300,-85, 350,-300,-85 + LocalOffset: 350,300,0, 350,-300,0 PauseOnCondition: !ammo + MuzzleSequence: muzzle + MuzzlePalette: scrin Armament@SECONDARY: Name: secondary Weapon: StormriderZapAA - LocalOffset: 350,300,-85, 350,-300,-85 + LocalOffset: 350,300,0, 350,-300,0 PauseOnCondition: !ammo + MuzzleSequence: muzzle + MuzzlePalette: scrin + WithMuzzleOverlay: AttackAircraft: - FacingTolerance: 320 - PersistentTargeting: false + FacingTolerance: 512 OpportunityFire: true - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded Aircraft: CruiseAltitude: 2560 TurnSpeed: 22 - Speed: 157 + Speed: 146 IdleSpeed: 135 IdleTurnSpeed: 15 RepulsionSpeed: 40 @@ -1582,19 +3141,29 @@ STMR: CanHover: False TakeoffSounds: dropup1.aud LandingSounds: dropdwn1.aud - IdealSeparation: 1c682 CanSlide: False - AltitudeVelocity: 0c200 + AltitudeVelocity: 0c120 + RangeMultiplier@Volley: + Modifier: 130 + RequiresCondition: volley + GrantConditionOnAttack@Volley: + ArmamentNames: primary, secondary + Condition: volley + RevokeDelay: 5 AutoTarget: InitialStance: HoldFire InitialStanceAI: AttackAnything Contrail@1: Offset: -250,-250,100 - UsePlayerColor: true + StartColorUsePlayerColor: true + StartColorAlpha: 64 + EndColorUsePlayerColor: true ZOffset: -512 Contrail@2: Offset: -250,250,100 - UsePlayerColor: true + StartColorUsePlayerColor: true + StartColorAlpha: 64 + EndColorUsePlayerColor: true ZOffset: -512 SpawnActorOnDeath: Actor: STMR.Husk @@ -1602,59 +3171,222 @@ STMR: SpawnActorOnDeath@EMP: Actor: STMR.Husk.EMP RequiresCondition: empdisable && !being-warped - SmokeTrailWhenDamaged: - Offset: -427,0,0 + LeavesTrails: + Offsets: -427,0,0 + Image: smokey + MovingInterval: 3 + StationaryInterval: 3 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RequiresCondition: enable-smoke Selectable: - DecorationBounds: 36,28 + DecorationBounds: 1536, 1280 ProducibleWithLevel: Prerequisites: aircraft.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: aircraft.upgraded -EjectOnDeath: AmmoPool: Ammo: 15 AmmoCondition: ammo + ReloadDelay: 45 + ReloadCount: 5 WithAmmoPipsDecoration: Position: BottomLeft Margin: 4, 3 RequiresSelection: true PipCount: 3 - ReloadAmmoPoolCA: - Delay: 750 - Count: 15 - DelayOnFire: 750 - DelayAfterReset: 60 - ShowSelectionBar: true - SelectionBarColor: ff00ff - DetectCloaked: - CloakTypes: Underwater - Range: 8c0 - FirepowerMultiplier@DEPLETED: - RequiresCondition: !ammo - Modifier: 30 Rearmable: - RearmActors: srep, hpad, hpad.td + RearmActors: hpad, hpad.td, afld, afld.gdi, grav + GrantConditionOnDamageState@SmokeTrail: + Condition: enable-smoke + GrantConditionOnResupply: + Condition: resupplying + Targetable@RESUPPLYING: + TargetTypes: Resupplying + RequiresCondition: resupplying + KillsSelf@Emp: + RequiresCondition: empdisable && cruising && !shields-upgrade + SpeedMultiplier@EMPDISABLE: + Modifier: 0 + RequiresCondition: empdisable + GpsRadarDot: + Sequence: Plane + -SoundOnDamageTransitionCA: + Encyclopedia: + Category: Scrin/Aircraft + +TORM: + Inherits: ^Helicopter + Inherits@AUTOTARGET: ^AutoTargetAllAssaultMove + Inherits@HULLREGEN: ^HullRegen + Inherits@SHIELDS: ^ScrinShields + Inherits@MothershipRearmable: ^MothershipRearmable + Inherits@SCRINVEHICLEVOICE: ^ScrinVehicleVoice + Buildable: + Queue: AircraftSQ, AircraftMQ + BuildPaletteOrder: 61 + Prerequisites: ~aircraft.scrin, ~techlevel.medium + Description: Small anti-vehicle harrasser aircraft. + IconPalette: chromes + TooltipExtras: + Strengths: • Strong vs Vehicles, Defenses, Aircraft + Weaknesses: • Weak vs Infantry + Valued: + Cost: 900 + Tooltip: + Name: Tormentor + GenericName: Aircraft + UpdatesPlayerStatistics: + AddToArmyValue: true + Health: + HP: 10000 + RevealsShroud: + Range: 11c0 + MinRange: 9c0 + Type: GroundPosition + RevealGeneratedShroud: False + RevealsShroud@GAPGEN: + Range: 9c0 + Type: GroundPosition + Armament@PRIMARY: + Weapon: TormentorZap + LocalOffset: 450,300,100, 450,-300,100 + PauseOnCondition: !ammo + MuzzleSequence: muzzle + MuzzlePalette: scrin + Armament@SECONDARY: + Weapon: TormentorZapAA + LocalOffset: 450,300,100, 450,-300,100 + PauseOnCondition: !ammo + MuzzleSequence: muzzle + MuzzlePalette: scrin + WithMuzzleOverlay: + AttackAircraft: + FacingTolerance: 80 + PersistentTargeting: false + OpportunityFire: true + PauseOnCondition: empdisable || being-warped || blinded + Aircraft: + CruiseAltitude: 2560 + TurnSpeed: 32 + Speed: 201 + IdleSpeed: 146 + IdleTurnSpeed: 15 + RepulsionSpeed: 40 + MaximumPitch: 56 + CanHover: False + TakeoffSounds: dropup1.aud + LandingSounds: dropdwn1.aud + CanSlide: False + AltitudeVelocity: 0c120 + IdealSeparation: 1c256 + AutoTarget: + InitialStance: HoldFire + InitialStanceAI: AttackAnything + Contrail@1: + Offset: -750,-200,300 + StartColorUsePlayerColor: true + StartColorAlpha: 64 + EndColorUsePlayerColor: true + ZOffset: -512 + TrailLength: 18 + StartWidth: 48 + Contrail@2: + Offset: -750,200,300 + StartColorUsePlayerColor: true + StartColorAlpha: 64 + EndColorUsePlayerColor: true + ZOffset: -512 + TrailLength: 18 + StartWidth: 48 + SpawnActorOnDeath: + Actor: TORM.Husk + RequiresCondition: !empdisable && !being-warped + SpawnActorOnDeath@EMP: + Actor: TORM.Husk.EMP + RequiresCondition: empdisable && !being-warped + LeavesTrails: + Offsets: -427,0,0 + Image: smokey + MovingInterval: 3 + StationaryInterval: 3 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RequiresCondition: enable-smoke + Selectable: + DecorationBounds: 1536, 1536 + ProducibleWithLevel: + Prerequisites: aircraft.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: aircraft.upgraded + -EjectOnDeath: + AmmoPool: + Ammo: 12 + AmmoCondition: ammo + ReloadDelay: 10 + ReloadCount: 1 + WithAmmoPipsDecoration: + Position: BottomLeft + Margin: 4, 3 + RequiresSelection: true + PipCount: 4 + Rearmable: + RearmActors: hpad, hpad.td, afld, afld.gdi, grav + GrantConditionOnDamageState@SmokeTrail: + Condition: enable-smoke + GrantConditionOnResupply: + Condition: resupplying + Targetable@RESUPPLYING: + TargetTypes: Resupplying + RequiresCondition: resupplying + KillsSelf@Emp: + RequiresCondition: empdisable && cruising && !shields-upgrade + SpeedMultiplier@EMPDISABLE: + Modifier: 0 + RequiresCondition: empdisable + Shielded: + MaxStrength: 4000 + GpsRadarDot: + Sequence: Plane + Targetable@MothershipRearmable: + RequiresCondition: ammo < 12 + ReloadAmmoPool@MothershipRearmable: + Count: 4 + -SoundOnDamageTransitionCA: + Encyclopedia: + Category: Scrin/Aircraft ENRV: Inherits: ^Helicopter Inherits@AUTOTARGET: ^AutoTargetAllAssaultMove - Inherits@GAINSEXPERIENCE: ^GainsExperience Inherits@HULLREGEN: ^HullRegen + Inherits@SHIELDS: ^ScrinShields + Inherits@MothershipRearmable: ^MothershipRearmable + Inherits@SCRINVEHICLEVOICE: ^ScrinVehicleVoice Buildable: - Queue: Aircraft - BuildAtProductionType: Plane - BuildPaletteOrder: 170 + Queue: AircraftSQ, AircraftMQ + BuildPaletteOrder: 110 Prerequisites: scrt, ~aircraft.traveler, ~techlevel.high - Description: Fast attack craft that creates a focused suppression field.\n Strong vs Vehicles, Defenses, Aircraft\n Weak vs Infantry + Description: Fast attack craft that creates a focused suppression field. IconPalette: chromes + TooltipExtras: + Strengths: • Strong vs Vehicles, Defenses, Aircraft + Weaknesses: • Weak vs Infantry + Attributes: • Slows targets Valued: - Cost: 1900 - Voiced: - VoiceSet: VehicleVoice + Cost: 2000 Tooltip: Name: Enervator + GenericName: Aircraft UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 20000 + HP: 22500 RevealsShroud: Range: 12c0 MinRange: 10c0 @@ -1675,138 +3407,217 @@ ENRV: FacingTolerance: 40 PersistentTargeting: false OpportunityFire: false - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded Aircraft: - TurnSpeed: 18 + TurnSpeed: 24 Speed: 225 InitialFacing: 768 TakeoffSounds: dropup1.aud LandingSounds: dropdwn1.aud CruiseAltitude: 2560 - RepulsionSpeed: 40 - MaximumPitch: 56 IdealSeparation: 1c256 - CanSlide: False + MaximumPitch: 56 + CanSlide: True + AltitudeVelocity: 0c100 AutoTarget: InitialStance: HoldFire InitialStanceAI: AttackAnything Contrail@1: Offset: -750,-200,300 - UsePlayerColor: true + StartColorUsePlayerColor: true + StartColorAlpha: 64 + EndColorUsePlayerColor: true ZOffset: -512 + TrailLength: 18 + StartWidth: 48 Contrail@2: Offset: -750,200,300 - UsePlayerColor: true + StartColorUsePlayerColor: true + StartColorAlpha: 64 + EndColorUsePlayerColor: true ZOffset: -512 + TrailLength: 18 + StartWidth: 48 SpawnActorOnDeath: Actor: ENRV.Husk RequiresCondition: !empdisable && !being-warped SpawnActorOnDeath@EMP: Actor: ENRV.Husk.EMP RequiresCondition: empdisable && !being-warped - SmokeTrailWhenDamaged: - Offset: -427,0,0 + LeavesTrails: + Offsets: -427,0,0 + Image: smokey + MovingInterval: 3 + StationaryInterval: 3 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RequiresCondition: enable-smoke Selectable: - DecorationBounds: 36,36 + DecorationBounds: 1536, 1536 ProducibleWithLevel: Prerequisites: aircraft.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: aircraft.upgraded -EjectOnDeath: AmmoPool: - Ammo: 4 + Ammo: 5 AmmoCondition: ammo - ReloadDelay: 751 - ReloadCount: 4 + ReloadDelay: 35 + ReloadCount: 1 WithAmmoPipsDecoration: Position: BottomLeft Margin: 4, 3 RequiresSelection: true - PipCount: 4 - ReloadAmmoPoolCA: - Delay: 750 - Count: 4 - DelayOnFire: 750 - DelayAfterReset: 60 - ShowSelectionBar: true - SelectionBarColor: ff00ff + PipCount: 5 Rearmable: - RearmActors: srep, hpad, hpad.td + RearmActors: hpad, hpad.td, afld, afld.gdi, grav + GrantConditionOnDamageState@SmokeTrail: + Condition: enable-smoke + GrantConditionOnResupply: + Condition: resupplying + Targetable@RESUPPLYING: + TargetTypes: Resupplying + RequiresCondition: resupplying + KillsSelf@Emp: + RequiresCondition: empdisable && cruising && !shields-upgrade + SpeedMultiplier@EMPDISABLE: + Modifier: 0 + RequiresCondition: empdisable + Shielded: + MaxStrength: 5625 + GpsRadarDot: + Sequence: Plane + Targetable@MothershipRearmable: + RequiresCondition: ammo < 5 + ReloadAmmoPool@MothershipRearmable: + Count: 1 + -SoundOnDamageTransitionCA: + Encyclopedia: + Category: Scrin/Aircraft + EncyclopediaExtras: + Subfaction: traveler DEVA: Inherits: ^Helicopter Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove - Inherits@GAINSEXPERIENCE: ^GainsExperience Inherits@HULLREGEN: ^HullRegen + Inherits@SHIELDS: ^ScrinShields + Inherits@FleetRecallable: ^FleetRecallable Buildable: - Queue: Aircraft - BuildAtProductionType: Plane - BuildPaletteOrder: 170 + Queue: AircraftSQ, AircraftMQ + BuildPaletteOrder: 111 Prerequisites: scrt, ~aircraft.scrin, ~techlevel.high - Description: Long-range siege warship.\n Strong vs Buildings, Defenses, Infantry\n Weak vs Aircraft, Tanks + Description: Long-range siege warship. IconPalette: chrome + TooltipExtras: + Strengths: • Strong vs Buildings, Defenses, Infantry + Weaknesses: • Weak vs Heavy Armor\n• Cannot attack Aircraft\n• Has difficulty hitting moving targets Voiced: VoiceSet: DevastatorVoice Valued: - Cost: 2500 + Cost: 2400 Tooltip: Name: Devastator Warship + GenericName: Aircraft UpdatesPlayerStatistics: AddToArmyValue: true Health: HP: 32000 Armor: - Type: Heavy + Type: Aircraft + HitShape: + TargetableOffsets: 0,0,0, -512,0,0, -1024,0,0 + Type: Circle + Radius: 1c256 RevealsShroud: - Range: 8c0 - MinRange: 7c0 + Range: 10c0 + MinRange: 8c0 Type: GroundPosition RevealGeneratedShroud: False RevealsShroud@GAPGEN: - Range: 7c0 + Range: 8c0 Type: GroundPosition Armament@PRIMARY: Weapon: DevastatorDiscs LocalOffset: 500,0,0 - AttackAircraft: + RequiresCondition: !stellar-upgrade + Armament@PRIMARYUPG: + Name: primary-upg + Weapon: DevastatorTorpedo + LocalOffset: 500,0,0 + RequiresCondition: stellar-upgrade + AmbientSound@CHARGE: + RequiresCondition: charging + SoundFiles: plasmatorpcharge.aud + WithIdleOverlay@CHARGE1: + Image: deva + Sequence: charge1 + Palette: scrin + Offset: 500,0,0 + RequiresCondition: charging == 1 + WithIdleOverlay@CHARGE2: + Image: deva + Sequence: charge2 + Palette: scrin + Offset: 500,0,0 + RequiresCondition: charging == 2 + WithIdleOverlay@CHARGE3: + Image: deva + Sequence: charge3 + Palette: scrin + Offset: 500,0,0 + RequiresCondition: charging > 2 + GrantConditionOnPrerequisite@STELLAR: + Condition: stellar-upgrade + Prerequisites: stellar.upgrade + AttackFrontal: + Armaments: primary FacingTolerance: 40 ForceFireIgnoresActors: True TargetFrozenActors: True - AttackType: Hover - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded + RequiresCondition: !stellar-upgrade + AttackFrontalCharged: + Armaments: primary-upg + FacingTolerance: 40 + ForceFireIgnoresActors: True + TargetFrozenActors: True + ChargeLevel: 75 + DischargeRate: 2 + ChargingCondition: charging + ConditionChargeLevels: 1, 34, 67 + ShotsPerCharge: 3 + ShowSelectionBar: true + SelectionBarColor: cc33ff + PauseOnCondition: empdisable || being-warped || blinded + RequiresCondition: stellar-upgrade Aircraft: - CruiseAltitude: 2560 + CruiseAltitude: 2c768 InitialFacing: 768 TurnSpeed: 16 - Speed: 56 + Speed: 60 AltitudeVelocity: 0c50 CanForceLand: False Selectable: - Bounds: 36,28,0,2 - DecorationBounds: 40,40,0,1 - Explodes: + Bounds: 1536, 1194, 0, 85 + DecorationBounds: 1706, 1706, 0, 42 + FireWarheadsOnDeath: Weapon: KirovExplode RequiresCondition: !airborne SpawnActorOnDeath: Actor: DEVA.Husk - RequiresCondition: !empdisable && !being-warped - SpawnActorOnDeath@EMP: - Actor: DEVA.Husk.EMP - RequiresCondition: empdisable && !being-warped - -Hovers@CRUISING: - -EjectOnDeath: - ProductionCostMultiplier@HARBONUS: - Multiplier: 90 - Prerequisites: vehicles.harbinger - GrantConditionOnPrerequisite@SHIELDS: - Condition: shields-upgrade - Prerequisites: shields.upgrade - WithSpriteTurret@SHIELDS: - RequiresCondition: shields-upgrade && shields-up - Sequence: shield - Palette: scrinshield-ignore-lighting-alpha50 - Turreted@SHIELDS: - PauseOnCondition: shields-upgrade - RequiresCondition: shields-upgrade - KillsSelf: + RequiresCondition: !empdisable && !being-warped + SpawnActorOnDeath@EMP: + Actor: DEVA.Husk.EMP + RequiresCondition: empdisable && !being-warped + -Hovers@CRUISING: + -EjectOnDeath: + ProductionCostMultiplier@HARBONUS: + Multiplier: 90 + Prerequisites: player.harbinger + KillsSelf@Emp: RequiresCondition: empdisable && cruising && !shields-upgrade SpeedMultiplier@EMPDISABLE: Modifier: 0 @@ -1815,65 +3626,75 @@ DEVA: RepairActors: fix, rep, srep ProducibleWithLevel: Prerequisites: aircraft.upgraded - Shielded: - MaxStrength: 7500 - RegenDelay: 350 - RegenAmount: 250 - RegenInterval: 5 - ShieldsUpCondition: shields-up - RequiresCondition: shields-upgrade && !empdisable - SelectionBarColor: ead6ff - ExternalCondition@Shield: - Condition: shields-up - Targetable@TEMPORAL: - RequiresCondition: !shields-up + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: aircraft.upgraded + Turreted@SHIELDS: + Offset: -64,0,0 + GpsRadarDot: + Sequence: Plane + -SoundOnDamageTransitionCA: + Targetable@AirHighValue: + TargetTypes: AirHighValue + Encyclopedia: + Category: Scrin/Aircraft + Scale: 1.5 PAC: Inherits: ^Helicopter Inherits@AUTOTARGET: ^AutoTargetAllAssaultMove - Inherits@GAINSEXPERIENCE: ^GainsExperience Inherits@HULLREGEN: ^HullRegen + Inherits@SHIELDS: ^ScrinShields + Inherits@FleetRecallable: ^FleetRecallable Buildable: - Queue: Aircraft - BuildAtProductionType: Plane - BuildPaletteOrder: 180 + Queue: AircraftSQ, AircraftMQ + BuildPaletteOrder: 112 Prerequisites: sign, scrt, ~aircraft.scrin, ~techlevel.high - Description: Warship that launches a squadron\nof assault craft.\n Strong vs Vehicles, Infantry\n Weak vs Buildings, Defenses + Description: Warship that launches a squadron of Invader assault craft. IconPalette: chrome + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor, Infantry + Weaknesses: • Weak vs Buildings, Defenses + Attributes: • Invaders only targetable by static anti-air defenses Voiced: VoiceSet: PlanetaryAssaultCarrierVoice Valued: - Cost: 3000 + Cost: 2800 Tooltip: Name: Planetary Assault Carrier + GenericName: Aircraft UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 52000 + HP: 56000 Armor: - Type: Heavy + Type: Aircraft + HitShape: + TargetableOffsets: 0,0,0, 1024,0,0, -1024,0,0 + Type: Circle + Radius: 1c256 RevealsShroud: - Range: 10c0 - MinRange: 8c0 + Range: 11c0 + MinRange: 9c0 Type: GroundPosition RevealGeneratedShroud: False RevealsShroud@GAPGEN: - Range: 8c0 + Range: 9c0 Type: GroundPosition Armament@PRIMARY: Weapon: InvaderLauncher LocalOffset: 0,0,0 Aircraft: - CruiseAltitude: 2560 + CruiseAltitude: 2c768 InitialFacing: 768 TurnSpeed: 16 - Speed: 49 + Speed: 60 AltitudeVelocity: 0c50 CanForceLand: False Selectable: - Bounds: 36,28,0,2 - DecorationBounds: 40,40,0,1 - Explodes: + Bounds: 1536, 1194, 0, 85 + DecorationBounds: 1706, 1706, 0, 42 + FireWarheadsOnDeath: Weapon: KirovExplode RequiresCondition: !airborne SpawnActorOnDeath: @@ -1894,9 +3715,11 @@ PAC: RequiresCondition: inva-loaded == 0 Sequence: fully-deployed Name: fully-deployed - AttackFrontal: - FacingTolerance: 384 - PauseOnCondition: empdisable || being-warped + AttackTurreted: + PauseOnCondition: empdisable || being-warped || blinded + Turreted: + TurnSpeed: 512 + RealignDelay: 0 CarrierMaster@carr1: Actors: inva, inva, inva, inva, inva, inva RearmTicks: 0 @@ -1906,7 +3729,7 @@ PAC: SpawnAllAtOnce: false LoadedCondition: inva-loaded RequiresCondition: !empdisable && !being-warped - MaxSlaveDistance: 16c0 + MaxSlaveDistance: 12c0 WithSpawnerMasterPipsDecoration: Position: BottomLeft Margin: 4, 3 @@ -1932,44 +3755,46 @@ PAC: DeathSounds: Voice: Die -EjectOnDeath: - GrantConditionOnPrerequisite@SHIELDS: - Condition: shields-upgrade - Prerequisites: shields.upgrade - WithSpriteTurret@SHIELDS: - RequiresCondition: shields-upgrade && shields-up - Sequence: shield - Palette: scrinshield-ignore-lighting-alpha50 - Turreted@SHIELDS: - PauseOnCondition: shields-upgrade - RequiresCondition: shields-upgrade - KillsSelf: + KillsSelf@Emp: RequiresCondition: empdisable && cruising && !shields-upgrade SpeedMultiplier@EMPDISABLE: Modifier: 0 RequiresCondition: empdisable Repairable: RepairActors: fix, rep, srep - AutoTargetPriority@DEFAULT: - InvalidTargets: NoAutoTarget, WaterStructure, AirLowPriority - AutoTargetPriority@ATTACKANYTHING: - InvalidTargets: NoAutoTarget, AirLowPriority ProducibleWithLevel: Prerequisites: aircraft.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: aircraft.upgraded Shielded: - MaxStrength: 10000 - RegenDelay: 350 - RegenAmount: 250 - RegenInterval: 5 - ShieldsUpCondition: shields-up - RequiresCondition: shields-upgrade && !empdisable - SelectionBarColor: ead6ff - ExternalCondition@Shield: - Condition: shields-up - Targetable@TEMPORAL: - RequiresCondition: !shields-up + MaxStrength: 14000 + Turreted@SHIELDS: + Offset: -128,0,0 + GpsRadarDot: + Sequence: Plane + -SoundOnDamageTransitionCA: + Targetable@AirHighValue: + TargetTypes: AirHighValue + Encyclopedia: + Category: Scrin/Aircraft + Scale: 1.5 + EncyclopediaExtras: + RenderPreviewActor: pac.preview + +PAC.Preview: + Inherits: ^PreviewDummy + RenderSprites: + Image: pac + WithFacingSpriteBody: INVA: - Inherits: ^Plane + Inherits: ^NeutralPlane + Inherits@3: ^Cloakable + Inherits@4: ^EmpDisable + Inherits@5: ^GDIStrategyBuffsAircraft + Inherits@ionsurge: ^IonSurgable + Inherits@FleetRecallable: ^FleetRecallable Valued: Cost: 50 Tooltip: @@ -1993,7 +3818,7 @@ INVA: FacingTolerance: 80 PersistentTargeting: false OpportunityFire: false - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable AttackType: Strafe StrafeRunLength: 3c0 Aircraft: @@ -2012,20 +3837,26 @@ INVA: LandingSounds: invader-dock.aud RejectsOrders: -SpawnActorOnDeath: - Explodes: + FireWarheadsOnDeath: Weapon: VisualExplodeInvader -RequiresCondition: - -EjectOnDeath: -Selectable: -ActorLostNotification: - SmokeTrailWhenDamaged: - Offset: -253,0,171 - Interval: 2 + LeavesTrails: + Offsets: -253,0,171 + MovingInterval: 2 + Image: smokey + StationaryInterval: 2 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + RequiresCondition: enable-smoke CarrierSlave: - LandingDistance: 8c0 Contrail@1: Offset: -432,0,0 - UsePlayerColor: true + StartColorUsePlayerColor: true + EndColorUsePlayerColor: true + StartColorAlpha: 64 TrailLength: 10 -Contrail@2: Interactable: @@ -2037,92 +3868,125 @@ INVA: Modifier: 75 Targetable@AIRBORNE: RequiresCondition: airborne - TargetTypes: AirSmall, AirLowPriority + TargetTypes: ICBM + GrantConditionOnDamageState@SmokeTrail: + Condition: enable-smoke + GivesExperienceToMaster: MSHP: Inherits: ^Helicopter + Inherits@ScrinUnitPalette: ^ScrinUnitPalette + Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove Inherits@GAINSEXPERIENCE: ^GainsExperience Inherits@HULLREGEN: ^HullRegen + Inherits@SHIELDS: ^ScrinShields + Inherits@FleetRecallable: ^FleetRecallable Buildable: - Queue: Aircraft - BuildAtProductionType: Plane - BuildPaletteOrder: 190 + Queue: AircraftSQ, AircraftMQ + BuildPaletteOrder: 113 Prerequisites: sign, scrt, ~aircraft.scrin, ~techlevel.high - Description: Huge craft with powerful beam weapon.\n Can create wormholes.\n Maximum 1 can be built.\n Strong vs Buildings, Defenses\n Weak vs Aircraft + Description: Huge craft with powerful anti-structure beam weapon and secondary plasma weapons. IconPalette: chromes BuildLimit: 1 - RenderSprites: - PlayerPalette: overlayplayerscrin + TooltipExtras: + Strengths: • Strong vs Buildings, Defenses, Heavy Armor, Light Armor, Infantry + Weaknesses: • Cannot attack Aircraft\n• Long charge time before firing anti-structure weapon\n• Cannot move while firing + Attributes: • Maximum 1 can be built\n• Can create wormholes\n• Can recharge nearby Stormriders/Enervators Voiced: VoiceSet: MothershipVoice Valued: Cost: 3000 Tooltip: Name: Mothership + GenericName: Aircraft UpdatesPlayerStatistics: AddToArmyValue: true Health: HP: 130000 Armor: - Type: Heavy + Type: Aircraft + HitShape: + TargetableOffsets: 0,0,0, 2560,0,0, -2560,0,0, 0,2560,0, 0,-2560,0 + Type: Circle + Radius: 2c768 RevealsShroud: - Range: 10c0 - MinRange: 8c0 + Range: 13c0 + MinRange: 11c0 Type: GroundPosition RevealGeneratedShroud: False RevealsShroud@GAPGEN: - Range: 8c0 + Range: 11c0 Type: GroundPosition Armament@PRIMARY: Weapon: MothershipBeam + Turret: none LocalOffset: 0,0,-940 PauseOnCondition: !ammo + ReloadingCondition: cooldown Armament@SECONDARY: Name: secondary + Turret: none Weapon: MothershipChargeBeam LocalOffset: 0,0,-940 PauseOnCondition: attacking || ammo || cooldown + Armament@TERTIARY: + Name: tertiary + Turret: body + Weapon: MothershipDiscs + LocalOffset: 400,0,-200, 400,0,50, 400,0,300 + MuzzleSequence: muzzle + MuzzlePalette: scrin + WithMuzzleOverlay: + WithShadow: + ZOffset: -3072 Aircraft: CruiseAltitude: 3c512 InitialFacing: 768 - TurnSpeed: 16 - Speed: 38 + TurnSpeed: 512 + Speed: 60 AltitudeVelocity: 0c50 CanForceLand: False Voice: Move + TurretedFloating@BODY: + Turret: body + TurnSpeed: 16 + Offset: 0,0,0 + RealignDelay: 50 + WithSpriteTurret@BODY: + Turret: body + Sequence: idle Selectable: - Bounds: 42,42,0,2 - DecorationBounds: 48,52,0,1 - Explodes: + Bounds: 1792, 1792, 0, 85 + DecorationBounds: 2048, 2218, 0, 42 + FireWarheadsOnDeath: Weapon: KirovExplode RequiresCondition: !airborne SpawnActorOnDeath: Actor: MSHP.Husk - RequiresCondition: !being-warped + RequiresCondition: !empdisable && !being-warped + SpawnActorOnDeath@EMP: + Actor: MSHP.Husk.EMP + RequiresCondition: empdisable && !being-warped -Hovers@CRUISING: WithFacingSpriteBody: - AttackFrontal: - Armaments: primary, secondary - FacingTolerance: 512 + Sequence: empty + AttackTurreted: + Armaments: primary, secondary, tertiary Voice: Attack - PauseOnCondition: being-warped + PauseOnCondition: empdisable || being-warped || blinded ForceFireIgnoresActors: true + Turrets: body -EjectOnDeath: ProducibleWithLevel: Prerequisites: aircraft.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: aircraft.upgraded WithIdleOverlay@RING: Image: mshp Sequence: ring Offset: 0,0,72 - DetonateWeaponOnDeploy: - Weapon: WormholeOpener - ForceGround: true - ChargeTicks: 200 PauseOnCondition: being-warped - OverlaySequence: wormholebeam - OverlayPalette: overlayplayerscrin - IsPlayerPalette: true - ShowSelectionBarWhenEmpty: false ExternalCondition@PRODUCED: Condition: produced VoiceAnnouncement: @@ -2131,7 +3995,7 @@ MSHP: DeathSounds: Voice: Die AnnounceOnCreation: - Notification: MothershipDeployed + SpeechNotification: MothershipDeployed Delay: 30 AmbientSoundCA: SoundFiles: mshp-beamloop.aud @@ -2140,10 +4004,7 @@ MSHP: GrantConditionOnAttack@ATTACKING: Condition: attacking ArmamentNames: primary - GrantConditionOnAttack@COOLDOWN: - Condition: cooldown - ArmamentNames: primary - RevokeDelay: 100 + RevokeDelay: 125 AmbientSoundCA@CHARGING: SoundFiles: mshp-charge.aud RequiresCondition: charging @@ -2151,29 +4012,72 @@ MSHP: Condition: charging ArmamentNames: secondary RevokeDelay: 5 - RejectsOrders: + SpeedMultiplier@ATTACKING: + Modifier: 0 RequiresCondition: attacking AmmoPool: - Ammo: 80 + Ammo: 1 InitialAmmo: 0 AmmoCondition: ammo Armaments: primary ReloadAmmoPoolCA@CHARGE: - Delay: 150 - Count: 80 + Delay: 100 + Count: 1 RequiresCondition: charging && !attacking Sound: mshp-fire1.aud ShowSelectionBar: true SelectionBarColor: ff00ff ReloadAmmoPoolCA@DRAIN: - Count: -80 + Count: -1 Delay: 1 RequiresCondition: !charging && !attacking ShowSelectionBar: false - -Targetable@TEMPORAL: - -SpeedMultiplier@TEMPORAL: - -RejectsOrders@TEMPORAL: - MothershipAttackBehaviour: + KillsSelf@Emp: + RequiresCondition: empdisable && cruising && !shields-upgrade + SpeedMultiplier@EMPDISABLE: + Modifier: 0 + RequiresCondition: empdisable + Shielded: + MaxStrength: 26000 + SpawnActorAbility: + Actors: wormhole + SkipMakeAnimations: false + Range: 18c0 + CircleColor: 9988ff + SpawnSounds: wormhole-open.aud + SelectTargetSpeechNotification: SelectTarget + AmmoPool: wormholespawner + TargetModifiedCursor: ability2 + ConcurrentLimit: 2 + AvoidActors: true + AmmoPool@WORMHOLESPAWNER: + Name: wormholespawner + Armaments: none + Ammo: 2 + ReloadAmmoPoolCA@WORMHOLESPAWNER: + AmmoPool: wormholespawner + Delay: 1125 + Count: 2 + ShowSelectionBar: true + SelectionBarColor: 9988ff + ReloadWhenAmmoReaches: 0 + WithAmmoPipsDecoration@WORMHOLESPAWNER: + AmmoPools: wormholespawner + RequiresSelection: true + Position: BottomLeft + Margin: 4, 3 + PeriodicExplosion: + Weapon: MothershipCharge + LocalOffset: 0,0,256 + Targetable@FleetRecallable: + RequiresCondition: !attacking + -SoundOnDamageTransitionCA: + ProductionCostMultiplier@HarbingerBonus: + Multiplier: 90 + Prerequisites: player.harbinger + Encyclopedia: + Category: Scrin/Aircraft + Scale: 1 # # ---- Husks @@ -2181,110 +4085,81 @@ MSHP: SMCV.Husk: Inherits: ^Husk + Inherits@ScrinUnitPalette: ^ScrinUnitPalette Tooltip: Name: Husk (Colony Ship) - TransformOnCapture: - IntoActor: smcv - InfiltrateForTransform: - IntoActor: smcv RenderSprites: - PlayerPalette: overlayplayerscrin Image: smcv.destroyed - Crushable: - CrushedByFriendlies: False HARV.Scrin.Husk: Inherits: ^Husk Tooltip: Name: Husk (Harvester) - TransformOnCapture: - IntoActor: harv.scrin - InfiltrateForTransform: - IntoActor: harv.scrin RenderSprites: Image: harv.scrin.destroyed WithShadow: Offset: 43, 255, 0 ZOffset: -256 - Crushable: - CrushedByFriendlies: False GUNW.Husk: Inherits: ^Husk + Inherits@ScrinUnitPalette: ^ScrinUnitPalette Tooltip: Name: Husk (Gun Walker) - TransformOnCapture: - IntoActor: gunw - InfiltrateForTransform: - IntoActor: gunw RenderSprites: Image: gunw.destroyed - PlayerPalette: overlayplayerscrin SEEK.Husk: Inherits: ^Husk + Inherits@ScrinUnitPalette: ^ScrinUnitPalette Tooltip: Name: Husk (Seeker) ThrowsParticle@turret: Anim: turret - TransformOnCapture: - IntoActor: seek - InfiltrateForTransform: - IntoActor: seek RenderSprites: Image: seek.destroyed - PlayerPalette: overlayplayerscrin WithShadow: Offset: 43, 128, 0 ZOffset: -129 INTL.Husk: Inherits: ^Husk + Inherits@ScrinUnitPalette: ^ScrinUnitPalette Tooltip: Name: Husk (Interloper) - TransformOnCapture: - IntoActor: intl - InfiltrateForTransform: - IntoActor: intl RenderSprites: Image: intl.destroyed - PlayerPalette: overlayplayerscrin CORR.Husk: Inherits: ^Husk + Inherits@ScrinUnitPalette: ^ScrinUnitPalette Tooltip: Name: Husk (Corrupter) - TransformOnCapture: - IntoActor: corr - InfiltrateForTransform: - IntoActor: corr RenderSprites: Image: corr.destroyed - PlayerPalette: overlayplayerscrin DEVO.Husk: Inherits: ^Husk Tooltip: Name: Husk (Devourer) - TransformOnCapture: - IntoActor: devo - InfiltrateForTransform: - IntoActor: devo RenderSprites: Image: devo.destroyed - PlayerPalette: overlayplayerscrin + +STCR.Husk: + Inherits: ^Husk + Inherits@ScrinUnitPalette: ^ScrinUnitPalette + Tooltip: + Name: Husk (Stormcrawler) + RenderSprites: + Image: stcr.destroyed RUIN.Husk: Inherits: ^Husk + Inherits@ScrinUnitPalette: ^ScrinUnitPalette Tooltip: Name: Husk (Ruiner) - TransformOnCapture: - IntoActor: ruin - InfiltrateForTransform: - IntoActor: ruin RenderSprites: Image: ruin.destroyed - PlayerPalette: overlayplayerscrin TPOD.Husk: Inherits: ^Husk @@ -2292,44 +4167,61 @@ TPOD.Husk: Name: Husk (Annihilator Tripod) ThrowsParticle@turret: Anim: turret - TransformOnCapture: - IntoActor: tpod - InfiltrateForTransform: - IntoActor: tpod RenderSprites: Image: tpod.destroyed - PlayerPalette: overlayplayerscrin -RPTP.Husk: +RTPD.Husk: Inherits: ^Husk + Inherits@ScrinUnitPalette: ^ScrinUnitPalette Tooltip: Name: Husk (Reaper Tripod) ThrowsParticle@turret: Anim: turret - TransformOnCapture: - IntoActor: rptp - InfiltrateForTransform: - IntoActor: rptp RenderSprites: - Image: rptp.destroyed - PlayerPalette: overlayplayerscrin + Image: rtpd.destroyed + +OBLT.Husk: + Inherits: ^Husk + Inherits@ScrinUnitPalette: ^ScrinUnitPalette + Tooltip: + Name: Husk (Obliterator) + RenderSprites: + Image: oblt.destroyed + +NULL.Husk: + Inherits: ^Husk + Inherits@ScrinUnitPalette: ^ScrinUnitPalette + Tooltip: + Name: Husk (Nullifier) + RenderSprites: + Image: null.destroyed STMR.Husk: Inherits: ^PlaneHusk + Inherits@ScrinUnitPalette: ^ScrinUnitPalette Tooltip: Name: Stormrider Aircraft: TurnSpeed: 16 - Speed: 170 - SmokeTrailWhenDamaged: - Offset: -427,0,0 - MinDamage: Undamaged + Speed: 146 + LeavesTrails: + Offsets: -427,0,0 + Image: smokey + MovingInterval: 3 + StationaryInterval: 3 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition Contrail@1: Offset: -250,-250,100 - UsePlayerColor: true + StartColorUsePlayerColor: true + EndColorUsePlayerColor: true + StartColorAlpha: 64 Contrail@2: Offset: -250,250,100 - UsePlayerColor: true + StartColorUsePlayerColor: true + EndColorUsePlayerColor: true + StartColorAlpha: 64 RevealsShroud: Range: 11c0 MinRange: 9c0 @@ -2340,28 +4232,78 @@ STMR.Husk: Type: GroundPosition RenderSprites: Image: stmr - PlayerPalette: overlayplayerscrin STMR.Husk.EMP: Inherits: STMR.Husk Inherits@EMP: ^EmpVisualEffect -ENRV.Husk: +TORM.Husk: Inherits: ^PlaneHusk + Inherits@ScrinUnitPalette: ^ScrinUnitPalette + Tooltip: + Name: Tormentor + Aircraft: + TurnSpeed: 28 + Speed: 201 + LeavesTrails: + Offsets: -427,0,0 + Image: smokey + MovingInterval: 3 + StationaryInterval: 3 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition + Contrail@1: + Offset: -750,-200,300 + StartColorUsePlayerColor: true + EndColorUsePlayerColor: true + Contrail@2: + Offset: -750,200,300 + StartColorUsePlayerColor: true + EndColorUsePlayerColor: true + RevealsShroud: + Range: 11c0 + MinRange: 9c0 + Type: GroundPosition + RevealGeneratedShroud: false + RevealsShroud@GAPGEN: + Range: 9c0 + Type: GroundPosition + RenderSprites: + Image: torm + +TORM.Husk.EMP: + Inherits: TORM.Husk + Inherits@EMP: ^EmpVisualEffect + +ENRV.Husk: + Inherits: ^HelicopterHusk + Inherits@ScrinUnitPalette: ^ScrinUnitPalette Tooltip: Name: Enervator + GenericName: Destroyed Aircraft Aircraft: TurnSpeed: 14 Speed: 170 - SmokeTrailWhenDamaged: - Offset: -427,0,0 - MinDamage: Undamaged + FallsToEarth: + MaximumSpinSpeed: 20 + Velocity: 86 + LeavesTrails: + Offsets: -427,0,0 + Image: smokey + MovingInterval: 3 + StationaryInterval: 3 + SpawnAtLastPosition: False + TrailWhileStationary: True + Type: CenterPosition Contrail@1: Offset: -750,-200,300 - UsePlayerColor: true + StartColorUsePlayerColor: true + EndColorUsePlayerColor: true Contrail@2: Offset: -750,200,300 - UsePlayerColor: true + StartColorUsePlayerColor: true + EndColorUsePlayerColor: true RevealsShroud: Range: 12c0 MinRange: 10c0 @@ -2372,7 +4314,6 @@ ENRV.Husk: Type: GroundPosition RenderSprites: Image: enrv - PlayerPalette: overlayplayerscrin ENRV.Husk.EMP: Inherits: ENRV.Husk @@ -2382,13 +4323,12 @@ DEVA.Husk: Inherits: ^HelicopterHusk Tooltip: Name: Devastator Warship + GenericName: Destroyed Aircraft Aircraft: TurnSpeed: 8 Speed: 35 FallsToEarth: MaximumSpinSpeed: 0 - Moves: True - Velocity: 30 RevealsShroud: Range: 10c0 MinRange: 8c0 @@ -2417,25 +4357,31 @@ DEVA.Husk.Ground: Name: Husk (Devastator Warship) KillsSelf: Delay: 1 - Explodes: + -RequiresCondition: + FireWarheadsOnDeath: Weapon: KirovExplode -OwnerLostAction: -CaptureManager: -Capturable: - -TransformOnCapture: - -InfiltrateForTransform: + -CapturableProgressBar: + -CapturableProgressBlink: + -GivesCashOnCaptureCA: + -GrantConditionOnCapture: + WithIdleOverlay@Burns: + -RequiresCondition: + ChangesHealth: + -RequiresCondition: PAC.Husk: Inherits: ^HelicopterHusk Tooltip: Name: Planetary Assault Carrier + GenericName: Destroyed Aircraft Aircraft: TurnSpeed: 8 Speed: 30 FallsToEarth: MaximumSpinSpeed: 0 - Moves: True - Velocity: 35 RevealsShroud: Range: 10c0 MinRange: 8c0 @@ -2450,6 +4396,8 @@ PAC.Husk: Explosion: KirovExplode SpawnActorOnDeath: Actor: PAC.Husk.Ground + WithFacingSpriteBody: + Sequence: fully-deployed PAC.Husk.EMP: Inherits: PAC.Husk @@ -2464,24 +4412,34 @@ PAC.Husk.Ground: Name: Husk (Planetary Assault Carrier) KillsSelf: Delay: 1 - Explodes: + -RequiresCondition: + FireWarheadsOnDeath: Weapon: KirovExplode -OwnerLostAction: -CaptureManager: -Capturable: - -TransformOnCapture: - -InfiltrateForTransform: + -CapturableProgressBar: + -CapturableProgressBlink: + -GivesCashOnCaptureCA: + -GrantConditionOnCapture: + WithIdleOverlay@Burns: + -RequiresCondition: + ChangesHealth: + -RequiresCondition: MSHP.Husk: Inherits: ^HelicopterHusk + Inherits@ScrinUnitPalette: ^ScrinUnitPalette Tooltip: Name: Mothership + GenericName: Destroyed Aircraft Aircraft: TurnSpeed: 8 Speed: 30 FallsToEarth: MaximumSpinSpeed: 0 Velocity: 35 + Explosion: MothershipExplode RevealsShroud: Range: 10c0 MinRange: 8c0 @@ -2492,28 +4450,32 @@ MSHP.Husk: Type: GroundPosition RenderSprites: Image: mshp - PlayerPalette: overlayplayerscrin - FallsToEarth: - Explosion: KirovExplode SpawnActorOnDeath: Actor: MSHP.Husk.Ground WithIdleOverlay@RING: Image: mshp Sequence: ring Offset: 0,0,0 + WithShadow: + ZOffset: -3072 + +MSHP.Husk.EMP: + Inherits: MSHP.Husk + Inherits@EMP: ^EmpVisualEffect MSHP.Husk.Ground: Inherits: ^Husk + Inherits@ScrinUnitPalette: ^ScrinUnitPalette Inherits@SHRAPNEL: ^ThrowsShrapnelBig RenderSprites: Image: mshp - PlayerPalette: overlayplayerscrin Tooltip: Name: Husk (Mothership) KillsSelf: Delay: 1 - Explodes: - Weapon: KirovExplode + -RequiresCondition: + FireWarheadsOnDeath: + Weapon: MothershipExplode WithIdleOverlay@RING: Image: mshp Sequence: ring @@ -2521,8 +4483,14 @@ MSHP.Husk.Ground: -OwnerLostAction: -CaptureManager: -Capturable: - -TransformOnCapture: - -InfiltrateForTransform: + -CapturableProgressBar: + -CapturableProgressBlink: + -GivesCashOnCaptureCA: + -GrantConditionOnCapture: + WithIdleOverlay@Burns: + -RequiresCondition: + ChangesHealth: + -RequiresCondition: # # ---- Buildings @@ -2535,10 +4503,10 @@ SWAL: Building: BuildSounds: scrinbuild.aud Buildable: - Queue: Defense + Queue: DefenseSQ, DefenseMQ BuildPaletteOrder: 30 - Prerequisites: anypower, ~structures.scrin, ~techlevel.medium - Description: Stops units and blocks enemy fire. Regenerates over time. + Prerequisites: anypower, ~structures.scrin + Description: • Stops units\n• Blocks enemy fire\n• Regenerates over time IconPalette: chromes Valued: Cost: 200 @@ -2556,6 +4524,9 @@ SWAL: Delay: 10 StartIfBelow: 100 DamageCooldown: 25 + RequiresCondition: !is-neutral + GrantConditionIfOwnerIsNeutral: + Condition: is-neutral Armor: Type: Brick Crushable: @@ -2567,17 +4538,20 @@ SWAL: Types: scrinwall WithWallSpriteBody: Type: scrinwall + Encyclopedia: + Category: Scrin/Defenses SFAC: Inherits: ^ScrinBuilding Inherits@SHAPE: ^3x2Shape Inherits@BOTI: ^BotFallbackInsurance + Inherits@BLD: ^ProducesBuildings Building: Footprint: xxx xxx === Dimensions: 3,3 LocalCenterOffset: 0,-512,0 Buildable: - Queue: Building + Queue: BuildingSQ, BuildingMQ BuildPaletteOrder: 1000 Prerequisites: ~disabled IconPalette: chrometd @@ -2593,11 +4567,8 @@ SFAC: RevealsShroud@GAPGEN: Range: 4c0 WithBuildingBib: - Production: - Produces: Building, Defense - PauseOnCondition: forceshield || invulnerability || being-warped Valued: - Cost: 2500 + Cost: 3000 Tooltip: Name: Colony Platform BaseBuilding: @@ -2626,8 +4597,9 @@ SFAC: GrantConditionOnPrerequisite@GLOBALFACTUNDEPLOY: Condition: factundeploy Prerequisites: global-factundeploy + TracksCapturedFaction: ValidFactions: - Factions: reaper, traveler, harbinger, collector + Factions: scrin, reaper, traveler, harbinger, collector ProvidesPrerequisite@scrin: Prerequisite: structures.scrin ProvidesPrerequisiteValidatedFaction@reaper: @@ -2642,14 +4614,19 @@ SFAC: ProvidesPrerequisiteValidatedFaction@collector: Factions: collector Prerequisite: structures.collector - ProductionBar@Building: - ProductionType: Building - ProductionBar@Defense: - ProductionType: Defense - Color: 8A8A8A + ProvidesPrerequisite@anyconyard: + Prerequisite: anyconyard BaseProvider: - PauseOnCondition: being-captured Range: 16c0 + PauseOnCondition: being-captured + RequiresCondition: !defense-policy + BaseProvider@DefensePolicy: + Range: 20c0 + PauseOnCondition: being-captured + RequiresCondition: defense-policy + GrantConditionOnPrerequisite@DefensePolicy: + Condition: defense-policy + Prerequisites: defense.policy WithBuildingPlacedAnimation: RequiresCondition: !build-incomplete && !chrono-vortex Power: @@ -2661,8 +4638,12 @@ SFAC: Damage: 950 TransferTimedExternalConditionOnTransform: Condition: invulnerability - SpawnActorsOnSell: + TransferTimedExternalConditionOnTransform@INVIS: + Condition: invisibility + SpawnActorsOnSellCA: ActorTypes: s1,s1,s1,s1,s6 + GuaranteedActorTypes: s1, s1 + -UpdatesBuildOrder: REAC: Inherits: ^ScrinBuilding @@ -2675,16 +4656,16 @@ REAC: WithSpriteBody: PauseOnCondition: disabled Buildable: - Queue: Building + Queue: BuildingSQ, BuildingMQ BuildPaletteOrder: 10 - Prerequisites: ~structures.scrin, ~techlevel.low + Prerequisites: ~structures.scrin IconPalette: chromes Description: Provides power for other structures. Valued: Cost: 300 Tooltip: Name: Reactor - ProvidesPrerequisite: + ProvidesPrerequisite@anypower: Prerequisite: anypower Building: Footprint: xX xx == @@ -2699,14 +4680,12 @@ REAC: WithBuildingBib: Power: Amount: 100 - ProvidesPrerequisite: - Prerequisite: anypower - Targetable: - TargetTypes: Ground, C4, DetonateAttack, Structure, SpyInfiltrate, PowerInfiltrate ScalePowerWithHealth: + Sellable: + RequiresCondition: !build-incomplete && !c4 && !being-captured && !being-warped && !hacked && !discpowerdrain ProvidesPrerequisite@buildingname: - InfiltrateForPowerOutage: - Types: SpyInfiltrate, PowerInfiltrate + UpdatesBuildOrder: + Limit: 2 REA2: Inherits: ^ScrinBuilding @@ -2719,16 +4698,16 @@ REA2: WithSpriteBody: PauseOnCondition: disabled Buildable: - Queue: Building + Queue: BuildingSQ, BuildingMQ BuildPaletteOrder: 110 - Prerequisites: anyradar, ~structures.scrin, ~techlevel.low + Prerequisites: anyradar, ~structures.scrin, ~techlevel.medium IconPalette: chrome - Description: Provides double the power of\na standard Reactor. + Description: Provides double the power of a standard Reactor. Valued: Cost: 500 Tooltip: Name: Advanced Reactor - ProvidesPrerequisite: + ProvidesPrerequisite@anypower: Prerequisite: anypower Building: Footprint: xxx Xxx === @@ -2743,16 +4722,19 @@ REA2: WithBuildingBib: Power: Amount: 200 - Targetable: - TargetTypes: Ground, C4, DetonateAttack, Structure, SpyInfiltrate, PowerInfiltrate ProvidesPrerequisite@buildingname: ScalePowerWithHealth: - InfiltrateForPowerOutage: - Types: SpyInfiltrate, PowerInfiltrate + Sellable: + RequiresCondition: !build-incomplete && !c4 && !being-captured && !being-warped && !hacked && !discpowerdrain + UpdatesBuildOrder: + Limit: 1 PROC.SCRIN: Inherits: ^ScrinBuilding - Inherits@BOTINCOME: ^BotIncome + Inherits@Refinery: ^Refinery + Inherits@ResourceDrainable: ^ResourceDrainable + Inherits@EconomyPolicyDiscount: ^EconomyPolicyDiscount + Inherits@EconomyPolicyTimeReduction: ^EconomyPolicyTimeReduction HitShape: Type: Rectangle TopLeft: -1536, -512 @@ -2769,15 +4751,17 @@ PROC.SCRIN: Name: Refinery Buildable: BuildPaletteOrder: 60 - Prerequisites: anypower, ~structures.scrin, ~techlevel.low - Queue: Building + Prerequisites: anypower, ~structures.scrin + Queue: BuildingSQ, BuildingMQ IconPalette: chromes - Description: Processes raw Tiberium, Ore and Gems\ninto credits. + Description: Processes raw Tiberium, Ore and Gems into credits. BuildDuration: 1400 Building: Footprint: _x_ xxx +++ === Dimensions: 3,4 LocalCenterOffset: 0,-512,0 + Sellable: + RequiresCondition: !build-incomplete && !c4 && !being-captured && !being-warped && !hacked && !resourcedrain Health: HP: 90000 Armor: @@ -2789,16 +4773,21 @@ PROC.SCRIN: RevealsShroud@GAPGEN: Range: 4c0 WithBuildingBib: - Targetable: - TargetTypes: Ground, Structure, C4, DetonateAttack, ThiefInfiltrate + Targetable@INFILTRATION: + RequiresCondition: !being-warped + TargetTypes: StealCreditsInfiltrate Refinery: + TickRate: 15 + DockHost: + Type: Unload DockAngle: 448 - DockOffset: 0,2 + DockOffset: -1c0, 1c0, 0 IsDragRequired: True DragOffset: -554,512,0 DragLength: 12 - TickRate: 15 - StoresResources: + MaxQueueLength: 12 + RequiresCondition: !being-warped + StoresPlayerResourcesCA: Capacity: 2000 WithResourceStoragePipsDecoration: Position: BottomLeft @@ -2806,12 +4795,13 @@ PROC.SCRIN: RequiresSelection: true PipCount: 17 Selectable: - Bounds: 72,56,0,12 - DecorationBounds: 73,72 + Bounds: 3072, 2512, 0, 256 + DecorationBounds: 3114, 3072 InfiltrateForCash: - Types: ThiefInfiltrate + Types: StealCreditsInfiltrate Percentage: 50 InfiltrationNotification: CreditsStolen + PlayerExperience: 15 FreeActor: Actor: HARV.Scrin SpawnOffset: 1,2 @@ -2822,23 +4812,22 @@ PROC.SCRIN: ProvidesPrerequisite@anyrefinery: Prerequisite: anyrefinery CashHackable: + UpdatesCount@ScrinAllegiance: + Type: ScrinAllegiance PORT: Inherits: ^ScrinBuilding - Inherits@PRIMARY: ^PrimaryBuilding Inherits@SHAPE: ^2x2Shape + Inherits@INF: ^ProducesInfantry Selectable: - Bounds: 48,48 + Bounds: 2048, 2048 HitShape: UseTargetableCellsOffsets: false - TargetableOffsets: 0,0,0, 840,-256,0, 840,512,0, 210,-512,0, -71,512,0 - Type: Rectangle - TopLeft: -1024, -1024 - BottomRight: 1024, 640 + TargetableOffsets: 0,0,0, 630,-512,0, 355,512,0, -281,-512,0, -630,512,0 Buildable: - Queue: Building + Queue: BuildingSQ, BuildingMQ BuildPaletteOrder: 20 - Prerequisites: anypower, ~structures.scrin, ~techlevel.low + Prerequisites: anypower, ~structures.scrin IconPalette: chromes Description: Produces infantry. Valued: @@ -2865,70 +4854,74 @@ PORT: RequiresCondition: !being-captured SpawnOffset: 0,512,0 ExitCell: 0,2 - ProductionTypes: Soldier, Infantry Exit@2: RequiresCondition: !being-captured SpawnOffset: 256,512,0 ExitCell: 1,2 - ProductionTypes: Soldier, Infantry Exit@3: RequiresCondition: !being-captured SpawnOffset: 0,512,0 ExitCell: -1,2 - ProductionTypes: Soldier, Infantry Priority: 0 Exit@4: RequiresCondition: !being-captured SpawnOffset: 256,512,0 ExitCell: 2,2 - ProductionTypes: Soldier, Infantry Priority: 0 - Production: - Produces: Infantry, Soldier - PauseOnCondition: forceshield || invulnerability || being-warped - ProductionBar: - ProductionType: Infantry + ValidFactions: + Factions: scrin, reaper, traveler, harbinger, collector + ProvidesPrerequisite@infantryany: + Prerequisite: infantry.any ProvidesPrerequisite@scrin: Prerequisite: infantry.scrin - ProvidesPrerequisite@reaper: + ProvidesPrerequisiteValidatedFaction@reaper: Factions: reaper Prerequisite: infantry.reaper - ProvidesPrerequisite@traveler: + ProvidesPrerequisiteValidatedFaction@traveler: Factions: traveler Prerequisite: infantry.traveler - ProvidesPrerequisite@harbinger: + ProvidesPrerequisiteValidatedFaction@harbinger: Factions: harbinger Prerequisite: infantry.harbinger - ProvidesPrerequisite@collector: + ProvidesPrerequisiteValidatedFaction@collector: Factions: collector Prerequisite: infantry.collector + ProvidesPrerequisiteValidatedFaction@intruder: + Factions: scrin, reaper, traveler, collector + Prerequisite: infantry.intruder Power: Amount: -20 ProvidesPrerequisite@buildingname: - Targetable: - TargetTypes: Ground, C4, DetonateAttack, Structure, SabInfiltrate, SpyInfiltrate - InfiltrateForSupportPower@STOLENTECH: - Types: SabInfiltrate + Targetable@INFILTRATION: + RequiresCondition: !being-warped + TargetTypes: VetInfiltrate, StealTechInfiltrate + InfiltrateToCreateProxyActor@STOLENTECH: + Types: StealTechInfiltrate Proxy: stolentech.port - InfiltrateForSupportPower@spy: + InfiltrationNotification: TechnologyAcquired + InfiltratedNotification: OurTechnologyStolen + PlayerExperience: 15 + SpawnActorOnMindControlled@STOLENTECH: + Actor: stolentech.port + OwnerType: Master + InfiltrateToCreateProxyActor@spy: Proxy: barracks.upgraded - Types: SpyInfiltrate + Types: VetInfiltrate + InfiltrationNotification: BuildingInfiltrated + InfiltratedNotification: BaseAttack + PlayerExperience: 15 WithIdleOverlay: RequiresCondition: !build-incomplete WSPH: Inherits: ^ScrinBuilding - Inherits@PRIMARY: ^PrimaryBuilding Inherits@SHAPE: ^3x2Shape + Inherits@NOMCV: ^UnlocksMcvIfNoneOwned + Inherits@VEH: ^ProducesVehicles Selectable: - Bounds: 72,48 - HitShape: - TargetableOffsets: 0,0,0, 0,1024,0, 0,-1024,0 - Type: Rectangle - TopLeft: -1536, -1024 - BottomRight: 1536, 512 + Bounds: 3072, 2048 Buildable: - Queue: Building + Queue: BuildingSQ, BuildingMQ BuildPaletteOrder: 80 Prerequisites: proc.scrin, ~structures.scrin, ~techlevel.low IconPalette: chromes @@ -2951,8 +4944,9 @@ WSPH: RevealGeneratedShroud: False RevealsShroud@GAPGEN: Range: 4c0 + TracksCapturedFaction: ValidFactions: - Factions: reaper, traveler, harbinger, collector + Factions: scrin ,reaper, traveler, harbinger, collector ProvidesPrerequisite@any: Prerequisite: vehicles.any ProvidesPrerequisite@scrin: @@ -2970,16 +4964,13 @@ WSPH: Factions: collector Prerequisite: vehicles.collector ProvidesPrerequisiteValidatedFaction@seek: - Factions: reaper, harbinger, collector + Factions: scrin, reaper, harbinger, collector Prerequisite: vehicles.seek ProvidesPrerequisiteValidatedFaction@corr: - Factions: reaper, traveler, harbinger + Factions: scrin, reaper, traveler, harbinger Prerequisite: vehicles.corr - ProvidesPrerequisiteValidatedFaction@devo: - Factions: reaper, traveler, collector - Prerequisite: vehicles.devo ProvidesPrerequisiteValidatedFaction@tpod: - Factions: traveler, harbinger, collector + Factions: scrin, traveler, harbinger, collector Prerequisite: vehicles.tpod WithBuildingBib: RallyPoint: @@ -2987,38 +4978,51 @@ WSPH: RequiresCondition: !being-captured SpawnOffset: 0,0,0 ExitCell: 0,2 - Production: - Produces: Vehicle - PauseOnCondition: forceshield || invulnerability || being-warped - Targetable: - TargetTypes: Ground, C4, DetonateAttack, Structure, SabInfiltrate, SpyInfiltrate - ProductionBar: - ProductionType: Vehicle + Targetable@INFILTRATION: + RequiresCondition: !being-warped + TargetTypes: VetInfiltrate, StealTechInfiltrate Power: Amount: -30 ProvidesPrerequisite@buildingname: - InfiltrateForSupportPower@spy: + InfiltrateToCreateProxyActor@spy: Proxy: vehicles.upgraded - Types: SpyInfiltrate - InfiltrateForSupportPower@STOLENTECH: - Types: SabInfiltrate + Types: VetInfiltrate + InfiltrationNotification: BuildingInfiltrated + InfiltratedNotification: BaseAttack + PlayerExperience: 15 + InfiltrateToCreateProxyActor@STOLENTECH: + Types: StealTechInfiltrate Proxy: stolentech.wsph + InfiltrationNotification: TechnologyAcquired + InfiltratedNotification: OurTechnologyStolen + PlayerExperience: 15 + SpawnActorOnMindControlled@STOLENTECH: + Actor: stolentech.wsph + OwnerType: Master WithIdleOverlay: RequiresCondition: !build-incomplete + GrantExternalConditionToProduced@DRONEEXIT: + Condition: radarenabled + Duration: 100 NERV: Inherits: ^ScrinBuilding Inherits@IDISABLE: ^DisableOnLowPowerOrPowerDownOrForceDisable - Inherits@POWERDRAIN: ^PowerDrainableRadar - HitShape: - UseTargetableCellsOffsets: false - TargetableOffsets: 0,0,0, 630,-384,0, 630,384,0, -700,-512,0, -700,512,0 + Inherits@UPG: ^ProducesUpgrades + Inherits@SHAPE: ^2x2Shape + Inherits@RESOURCESCANPOWER: ^ResourceScanPower + Inherits@STORMSPIKEPOWER: ^StormSpikePower + Inherits@BUZZERSWARMPOWER: ^BuzzerSwarmPower + Inherits@TECHLOCKABLE: ^TechLockable + Inherits@ProductionOptimizer1: ^ProductionOptimizer1 Buildable: - Queue: Building + Queue: BuildingSQ, BuildingMQ BuildPaletteOrder: 90 Prerequisites: proc.scrin, ~structures.scrin, ~techlevel.medium - Description: Provides an overview of the battlefield.\n Requires power to operate. + Description: Provides an overview of the battlefield. IconPalette: chromes + TooltipExtras: + Attributes: • Requires power to operate\n• Detects nearby enemy vehicles, aircraft and structures in fog of war Valued: Cost: 1800 Tooltip: @@ -3026,173 +5030,114 @@ NERV: Building: Footprint: xx xx == Dimensions: 2,3 - LocalCenterOffset: 0,-768,0 - Targetable: - TargetTypes: Ground, C4, DetonateAttack, Structure, SpyInfiltrate, SabInfiltrate + LocalCenterOffset: 0,-512,0 + Targetable@INFILTRATION: + RequiresCondition: !being-warped + TargetTypes: ResetShroudInfiltrate Health: - HP: 100000 + HP: 110000 Armor: Type: Wood RevealsShroud: - MinRange: 6c0 - Range: 10c0 + MinRange: 5c0 + Range: 6c0 RequiresCondition: !disabled RevealGeneratedShroud: False RevealsShroud@Offline: Range: 5c0 RequiresCondition: disabled RevealsShroud@GAPGEN: - Range: 6c0 + Range: 5c0 RequiresCondition: !disabled ProvidesRadar: - RequiresCondition: !jammed && !disabled && !being-warped + RequiresCondition: !jammed && !disabled && !being-warped && !build-incomplete + RangedGpsRadarProvider: + Range: 12c0 + TargetTypes: Vehicle, Air, Structure + RequiresCondition: !jammed && !disabled && !being-warped && !build-incomplete + WithRangeCircle: + Type: RadarDetection + Range: 12c0 + RequiresCondition: !jammed && !disabled && !being-warped && !build-incomplete WithBuildingBib: InfiltrateForExploration: - Types: SpyInfiltrate, SabInfiltrate + Types: ResetShroudInfiltrate + PlayerExperience: 15 Power: Amount: -40 - -PowerMultiplier@POWERDRAIN: ValidFactions: - Factions: reaper, traveler, harbinger, collector + Factions: scrin, reaper, traveler, harbinger, collector + ProvidesPrerequisite@buildingname: + RequiresCondition: !tech-locked ProvidesPrerequisite@anyradar: Prerequisite: anyradar + RequiresCondition: !tech-locked + ProvidesPrerequisite@radarorrepair: + Prerequisite: radarorrepair + RequiresCondition: !tech-locked + ProvidesPrerequisite@RadarOrAircraft: + Prerequisite: radaroraircraft + RequiresCondition: !tech-locked + ProvidesPrerequisite@FlameTowerOrRadar: + Prerequisite: fturorradar + RequiresCondition: !tech-locked ProvidesPrerequisite@scrinrad: Prerequisite: radar.scrin + RequiresCondition: !tech-locked ProvidesPrerequisiteValidatedFaction@reaprad: Factions: reaper Prerequisite: radar.reaper + RequiresCondition: !tech-locked ProvidesPrerequisiteValidatedFaction@travrad: Factions: traveler Prerequisite: radar.traveler + RequiresCondition: !tech-locked ProvidesPrerequisiteValidatedFaction@harbrad: Factions: harbinger - Prerequisite: radar.harbinger - ProvidesPrerequisiteValidatedFaction@desprad: - Factions: collector - Prerequisite: radar.collector - ProvidesPrerequisite@buildingname: - ExternalCondition@JAMMED: - Condition: jammed - InfiltrateForSupportPower@STOLENTECH: - Types: SabInfiltrate - Proxy: stolentech.nerv - RevealActorsPower@RESOURCESCAN: - CameraActor: camera.resourcescan - TargetActors: mine, gmine, split2, split3, splitblue, proc, proc.td, proc.scrin - LifeTime: 250 - OrderName: resourcescan - Icon: rescanpower - ChargeInterval: 7500 - Description: Resource Scan - LongDesc: Reveals map resources. - LaunchSound: tibscan.aud - PauseOnCondition: disabled || empdisable || being-warped - EffectImage: empty - EffectSequence: idle - EffectPalette: tseffect-ignore-lighting-alpha75 - DetonateWeaponPower@BUZZERSWARM: - OrderName: buzzerswarm - Icon: buzzpower - IconPalette: chromes - Prerequisites: radar.harbinger, !botplayer - Cursor: ability - ChargeInterval: 7500 - Description: Buzzer Swarm - ActivationDelay: 1 - LongDesc: Spawns controllable buzzer swarm which damages anything nearby. - LaunchSound: buzzers-create.aud - Weapon: BuzzerSpawner - AirburstAltitude: 0c0 - SelectTargetSpeechNotification: SelectTarget - PauseOnCondition: disabled || empdisable || being-warped - CameraActor: camera.dummy - CameraRemoveDelay: 1 - DisplayRadarPing: True - DetonateWeaponPower@BUZZERSWARMAI: - OrderName: buzzerswarmai - Icon: buzzpower - IconPalette: chromes - Prerequisites: radar.harbinger, botplayer - Cursor: ability - ChargeInterval: 7500 - Description: Buzzer Swarm (AI) - ActivationDelay: 1 - LongDesc: Spawns controllable buzzer swarm which damages anything nearby. - LaunchSound: buzzers-create.aud - Weapon: BuzzerSpawnerAI - AirburstAltitude: 0c0 - SelectTargetSpeechNotification: SelectTarget - PauseOnCondition: disabled || empdisable || being-warped - CameraActor: camera.dummy - CameraRemoveDelay: 1 - DisplayRadarPing: True - DetonateWeaponPower@STORMSPIKE: - OrderName: stormspike - Icon: stormspikepower - IconPalette: chromes - Prerequisites: radar.reaper - Cursor: ability - ChargeInterval: 7500 - Description: Storm Spike - ActivationDelay: 1 - LongDesc: Creates a temporary storm column. - LaunchSound: scrinbuild.aud - Weapon: StormSpikeSpawner - AirburstAltitude: 0c0 - SelectTargetSpeechNotification: SelectTarget - PauseOnCondition: disabled || empdisable || being-warped - CameraActor: camera.dummy - CameraRemoveDelay: 1 - DisplayRadarPing: True - DetonateWeaponPower@IONSURGE: - OrderName: ionsurge - Icon: ionsurgepower - IconPalette: chromes - Prerequisites: radar.traveler - Cursor: ability - ChargeInterval: 6750 - Description: Ion Surge - ActivationDelay: 1 - LongDesc: Increased movement speed of all friendly units in the target area. - LaunchSound: ionsurge.aud - Weapon: IonSurgeSpawner - AirburstAltitude: 0c0 - SelectTargetSpeechNotification: SelectTarget - PauseOnCondition: disabled || empdisable || being-warped - DisplayRadarPing: True - CameraActor: camera.dummy - CameraRemoveDelay: 1 - TargetCircleRange: 6c0 - TargetCircleColor: b070ff90 - Production: - Produces: Upgrade - PauseOnCondition: forceshield || invulnerability || being-warped - ProductionBar: - ProductionType: Upgrade - Exit: + Prerequisite: radar.harbinger + RequiresCondition: !tech-locked + ProvidesPrerequisiteValidatedFaction@desprad: + Factions: collector + Prerequisite: radar.collector + RequiresCondition: !tech-locked + ExternalCondition@JAMMED: + Condition: jammed + ProvidesPrerequisite@radar-active: + Prerequisite: radar-active + RequiresCondition: !jammed && !disabled && !being-warped SCRT: Inherits: ^ScrinBuilding Inherits@IDISABLE: ^DisableOnLowPowerOrForceDisabled Inherits@SHAPE: ^2x2Shape + Inherits@UPG: ^ProducesUpgrades + Inherits@ICHORSEEDPOWER: ^IchorSeedPower + Inherits@FORCESHIELDPOWER: ^ForceShieldPower + Inherits@IONSURGEPOWER: ^IonSurgePower + Inherits@GREATERCOALESCENCEPOWER: ^GreaterCoalescencePower + Inherits@TECHLOCKABLE: ^TechLockable + Inherits@ProductionOptimizer2: ^ProductionOptimizer2 + Inherits@OverlordsWrath: ^OverlordsWrathPower + Inherits@GatewayPower: ^GatewayPower + Inherits@AnathemaPower: ^AnathemaPower Buildable: - Queue: Building + Queue: BuildingSQ, BuildingMQ BuildPaletteOrder: 150 Prerequisites: vehicles.any, anyradar, ~structures.scrin, ~techlevel.high Description: Provides Scrin advanced technologies. IconPalette: chromes Valued: - Cost: 1500 + Cost: 1800 Tooltip: Name: Scrin Tech Center Building: Footprint: xx xx == Dimensions: 2,3 LocalCenterOffset: 0,-512,0 + Selectable: + Bounds: 2048, 2560 Health: - HP: 100000 - Targetable: - TargetTypes: Ground, C4, DetonateAttack, Structure, SabInfiltrate + HP: 110000 Armor: Type: Wood RevealsShroud: @@ -3206,99 +5151,40 @@ SCRT: RevealsShroud@GAPGEN: Range: 5c0 RequiresCondition: !disabled - InfiltrateForSupportPower@STOLENTECH: - Types: SabInfiltrate - Proxy: stolentech.scrt WithBuildingBib: Power: - Amount: -200 + Amount: -150 ValidFactions: - Factions: reaper, traveler, harbinger, collector - ProvidesPrerequisite: - Prerequisite: techcenter - ProvidesPrerequisiteValidatedFaction@travelerscrt: - Factions: traveler - Prerequisite: scrt.traveler - ProvidesPrerequisiteValidatedFaction@collectorscrt: + Factions: scrin, reaper, traveler, harbinger, collector + ProvidesPrerequisite@buildingname: + RequiresCondition: !tech-locked + ProvidesPrerequisite@anytechcenter: + Prerequisite: techcenter.any + RequiresCondition: !tech-locked + ProvidesPrerequisiteValidatedFaction@harbscrt: + Factions: harbinger + Prerequisite: scrt.harbinger + RequiresCondition: !tech-locked + ProvidesPrerequisiteValidatedFaction@collscrt: Factions: collector Prerequisite: scrt.collector - ProvidesPrerequisite@buildingname: - GrantExternalConditionPowerCA@FSHIELD: - OrderName: fshield - Icon: forceshield - ChargeInterval: 7500 - Condition: forceshield - Dimensions: 7, 7 - Footprint: ___x___ __xxx__ _xxxxx_ xxxxxxx _xxxxx_ __xxx__ ___x___ - Duration: 250 - Prerequisites: forceshield.enabled, techlevel.high - Weapon: ForceShield - ActivationDelay: 5 - AirburstAltitude: 0c0 - AllowMultiple: false - Description: Force Shield - LongDesc: Makes selected friendly structures temporarily invulnerable.\n Warning: Causes power failure. - OnFireSound: forceon.aud - DisplayTimerRelationships: Ally - SelectTargetSpeechNotification: SelectTarget - InsufficientPowerSpeechNotification: InsufficientPower - EndChargeSpeechNotification: ForceShieldReady - DisplayRadarPing: True - Cursor: ability - PauseOnCondition: disabled || empdisable || being-warped - SpawnActorPower@ICHORSEED: - OrderName: ichorseed - Icon: ichorpower - Actor: ichor.seeder - ChargeInterval: 6000 - Description: Ichor Seed - LifeTime: -1 - AllowMultiple: false - LongDesc: Seeds tiberium at selected location. - LaunchSound: ichorseed.aud - SelectTargetSpeechNotification: SelectTarget - InsufficientPowerSpeechNotification: InsufficientPower - PauseOnCondition: disabled || empdisable || being-warped - EffectImage: empty - EffectSequence: idle - EffectPalette: tseffect-ignore-lighting-alpha75 - GrantExternalConditionPower@FEEDERMUTATION: - OrderName: feedermutation - Icon: feedermutation - Prerequisites: ~scrt.collector, ~techlevel.high - ChargeInterval: 6750 - Description: Feeder Mutation - Condition: feedermutation - Dimensions: 3, 3 - Footprint: _x_ xxx _x_ - ValidRelationships: Ally - Duration: 25 - AllowMultiple: false - LongDesc: Transforms Scrin infantry into Feeders which consume resources\nuntil becoming volatile enough to explode. - OnFireSound: feedermutation.aud - SelectTargetSpeechNotification: SelectTarget - InsufficientPowerSpeechNotification: InsufficientPower - DisplayRadarPing: True - Cursor: ability - PauseOnCondition: disabled || empdisable || being-warped - DisplayTimerRelationships: Ally - Production: - Produces: Upgrade - PauseOnCondition: forceshield || invulnerability || being-warped - ProductionBar: - ProductionType: Upgrade - Exit: + RequiresCondition: !tech-locked + ProvidesPrerequisite@BotAllegiance: + Prerequisite: scrin.allegiances.available + RequiresPrerequisites: botplayer GRAV: Inherits: ^ScrinBuilding - Inherits@PRIMARY: ^PrimaryBuilding Inherits@SHAPE: ^3x2Shape + Inherits@AIR: ^ProducesHelicopters + Inherits@AIRCRAFTREPAIR: ^RepairsAircraftWithRepairBay + Inherits@InfiltrateForSupportPower: ^InfiltrateForSupportPower HitShape: TargetableOffsets: -355,-1024,0 Buildable: - Queue: Building + Queue: BuildingSQ, BuildingMQ BuildPaletteOrder: 130 - Prerequisites: anyradar, ~structures.scrin, ~techlevel.medium + Prerequisites: radarorrepair, ~structures.scrin, ~techlevel.medium Description: Produces Scrin aircraft. IconPalette: chromes Valued: @@ -3306,11 +5192,11 @@ GRAV: Tooltip: Name: Gravity Stabilizer Selectable: - Bounds: 72,48 + Bounds: 3072, 2560, 0, -128 Building: Footprint: xxx xxx === Dimensions: 3,3 - LocalCenterOffset: 0,-768,0 + LocalCenterOffset: 0,-512,0 Health: HP: 100000 Armor: @@ -3325,53 +5211,94 @@ GRAV: RequiresCondition: !being-captured ExitCell: 1,1 Facing: 720 + SpawnOffset: -128,0,0 + Reservable: RallyPoint: - Production: - Produces: Aircraft, Plane - PauseOnCondition: forceshield || invulnerability || being-warped ValidFactions: - Factions: reaper, traveler, harbinger, collector + Factions: scrin, reaper, traveler, harbinger, collector ProvidesPrerequisiteValidatedFaction@traveler: Factions: traveler Prerequisite: aircraft.traveler - ProvidesPrerequisite@all: - Prerequisite: aircraft.all ProvidesPrerequisite@scrin: Prerequisite: aircraft.scrin - ProductionBar: - ProductionType: Aircraft + ProvidesPrerequisite@RadarOrAircraft: + Prerequisite: radaroraircraft SupportPowerChargeBar: Power: Amount: -20 ProvidesPrerequisite@buildingname: - Targetable: - TargetTypes: Ground, C4, DetonateAttack, Structure, SpyInfiltrate WithBuildingBib: - WithIdleOverlay@orb: - RequiresCondition: !build-incomplete + WithRestartableIdleOverlay@orb: + RequiresCondition: !build-incomplete && !resupplying + RestartSequence: idle-overlay-activate + StartSequence: idle-overlay + WithRestartableIdleOverlay@orboff: + RequiresCondition: !build-incomplete && resupplying + Sequence: idle-overlay-deactivate + PlayOnce: true WithIdleOverlay@pylon: Sequence: idle-pylon RequiresCondition: !build-incomplete && !damaged GrantConditionOnDamageState@DAMAGED: Condition: damaged - ValidDamageStates: Light, Medium, Heavy, Critical + ValidDamageStates: Heavy, Critical + GrantConditionOnResupplying@RESUPPLY: + Condition: resupplying + Armament@UNDAMAGED: + Weapon: GravityStabilizerZap + LocalOffset: -800,-500,1152, -250,450,1152, 150,-500,1152 + TargetRelationships: Ally + ForceTargetRelationships: None + MuzzleSequence: muzzle + MuzzlePalette: playerscrin + RequiresCondition: !damaged + Armament@DAMAGED: + Weapon: GravityStabilizerZap + LocalOffset: -250,650,1024, 150,-600,1152 + TargetRelationships: Ally + ForceTargetRelationships: None + MuzzleSequence: muzzle + MuzzlePalette: playerscrin + RequiresCondition: damaged + WithMuzzleOverlayCA: + IsPlayerPalette: true + AttackOmni: + PauseOnCondition: !resupplying + AutoTarget: + AutoTargetPriority@DEFAULT: + ValidRelationships: Ally + InfiltrateToCreateProxyActor@SpySupportPower: + Proxy: powerproxy.airstrike + InfiltrateToCreateProxyActor@STOLENTECH: + Types: StealTechInfiltrate + Proxy: stolentech.grav + InfiltrationNotification: TechnologyAcquired + InfiltratedNotification: OurTechnologyStolen + PlayerExperience: 15 + SpawnActorOnMindControlled@STOLENTECH: + Actor: stolentech.grav + OwnerType: Master + Targetable@INFILTRATION: + RequiresCondition: !being-warped + TargetTypes: StealTechInfiltrate SIGN: Inherits: ^ScrinBuilding Inherits@POWER_OUTAGE: ^DisableOnLowPowerOrForceDisabled Inherits@SHAPE: ^3x2Shape - HitShape: - TargetableOffsets: -355,-1024,0 + Inherits@UPG: ^ProducesUpgrades + Inherits@TECHLOCKABLE: ^TechLockable + Inherits@FLEETRECALL: ^FleetRecallPower Selectable: - Bounds: 72,48 + Bounds: 3072, 2048 Building: Footprint: xxx xxx === Dimensions: 3,3 LocalCenterOffset: 0,-512,0 Health: - HP: 80000 + HP: 130000 Armor: - Type: Concrete + Type: Wood RevealsShroud: MinRange: 4c0 Range: 5c0 @@ -3380,64 +5307,65 @@ SIGN: Range: 4c0 WithBuildingBib: Buildable: - Queue: Building + Queue: BuildingSQ, BuildingMQ BuildPaletteOrder: 200 Prerequisites: ~structures.scrin, scrt, ~techlevel.high - Description: Provides Scrin tier 4 technologies.\n Maximum 1 can be built.\n Cannot be captured or hacked. + Description: Provides access to the most powerful Scrin units and technology. BuildLimit: 1 IconPalette: chromes + TooltipExtras: + Attributes: • Maximum 1 can be built\n• Cannot be captured or hacked -Capturable: -CaptureNotification: -CapturableProgressBar: -CapturableProgressBlink: -CaptureManager: Valued: - Cost: 2500 + Cost: 1500 Tooltip: Name: Signal Transmitter - RevealsShroud: - Range: 4c0 - MinRange: 3c0 Power: Amount: -150 ProvidesPrerequisite@Name: - RequiresCondition: !being-warped + RequiresCondition: !tech-locked Sellable: RequiresCondition: !build-incomplete && !c4 && !being-warped - Production: - Produces: Upgrade - PauseOnCondition: forceshield || invulnerability || being-warped - ProductionBar: - ProductionType: Upgrade - Exit: - -MindControllable: + SpawnActorOnDeath: + RequiresCondition: !being-warped + WithDecoration@TechLock: + RequiresCondition: tech-locked + -MindControllable@HACKABLE: -Targetable@HACKABLE: -MindControllableProgressBar@HACKABLE: -WithDecoration@HACKED: -WithDecoration@RESTORING: + -PowerMultiplier@HACKED: SREP: Inherits: ^ScrinBuilding + Inherits@ProductionOptimizer1: ^ProductionOptimizer1 HitShape: TargetableOffsets: 840,0,0, 598,-640,0, 598,640,0, -1060,0,0, -768,-640,0, -768,640,0 Type: Polygon Points: -1536,-300, -640,-811, 640,-811, 1536,-300, 1536,555, 640,1110, -640,1110, -1536,555 Buildable: - Queue: Building + Queue: BuildingSQ, BuildingMQ BuildPaletteOrder: 100 - Prerequisites: vehicles.scrin, ~structures.scrin, ~techlevel.medium - Description: Repairs vehicles for credits. + Prerequisites: vehicles.scrin, ~structures.scrin, ~techlevel.low + Description: Repairs vehicles and aircraft. IconPalette: chromes + TooltipExtras: + Attributes: • Nearby helipads/airfields will repair landed aircraft\n• Can retrofit existing units with upgrades Valued: - Cost: 1200 + Cost: 1000 Tooltip: - Name: Repair Bay + Name: Regeneration Bay Building: Footprint: _+_ +++ _+_ Dimensions: 3,3 Selectable: - Bounds: 68,34,0,3 - DecorationBounds: 72,48 + Bounds: 2901, 1450, 0, 128 + DecorationBounds: 3072, 2048 Health: HP: 80000 Armor: @@ -3457,21 +5385,34 @@ SREP: HpPerStep: 1000 Interval: 7 StartRepairingNotification: Repairing + StartRepairingTextNotification: Repairing. FinishRepairingNotification: UnitRepaired - PlayerExperience: 15 + FinishRepairingTextNotification: Unit repaired. RequiresCondition: !forceshield && !invulnerability && !being-warped WithResupplyAnimation: RequiresCondition: !build-incomplete + ProximityExternalCondition@UNITSELL: + Condition: unit-sellable + Range: 1c0 + GrantConditionOnResupplying@Resupplying: + Condition: resupplying + Sellable: + RequiresCondition: !resupplying && !build-incomplete && !c4 && !being-captured && !being-warped && !hacked Power: Amount: -30 ProvidesPrerequisite@buildingname: ProvidesPrerequisite@repair: Prerequisite: repair + ProvidesPrerequisite@radarorrepair: + Prerequisite: radarorrepair + ProvidesPrerequisite@allowsmcv: + Prerequisite: vehicles.mcv ProximityExternalCondition@AIRCRAFTREPAIR: Condition: aircraft-repair Range: 10c0 WithRangeCircle@AIRCRAFTREPAIR: - Color: 888899AA + Type: AircraftRepair + Color: FFD000AA Range: 10c0 SILO.SCRIN: @@ -3482,10 +5423,10 @@ SILO.SCRIN: Name: Silo Buildable: BuildPaletteOrder: 35 - Prerequisites: proc.scrin, ~structures.scrin, ~techlevel.infonly - Queue: Defense + Prerequisites: proc.scrin, ~structures.scrin + Queue: DefenseSQ, DefenseMQ IconPalette: chromes - Description: Stores processed Tiberium, Ore and Gems + Description: Stores processed Tiberium, Ore and Gems. -GivesBuildableArea: Health: HP: 30000 @@ -3495,12 +5436,10 @@ SILO.SCRIN: Range: 4c0 WithBuildingBib: HasMinibib: true - Targetable: - TargetTypes: Ground, Structure, C4, DetonateAttack -WithSpriteBody: WithResourceLevelSpriteBody: Sequence: stages - StoresResources: + StoresPlayerResourcesCA: Capacity: 3000 WithResourceStoragePipsDecoration: Position: BottomLeft @@ -3508,27 +5447,30 @@ SILO.SCRIN: RequiresSelection: true PipCount: 5 -MustBeDestroyed: - SpawnActorsOnSell: - ActorTypes: c1,c7 + -SpawnActorsOnSellCA: Power: Amount: -10 Selectable: - Bounds: 24,24 - Explodes: + Bounds: 1024, 1024 + FireWarheadsOnDeath: Weapon: SmallBuildingExplode EmptyWeapon: SmallBuildingExplode + -UpdatesBuildOrder: MANI: Inherits: ^ScrinBuilding Inherits@IDISABLE: ^DisableOnLowPowerOrPowerDownOrForceDisable Inherits@SHAPE: ^2x2Shape + Inherits@SUPPRESSIONPOWER: ^SuppressionPower Buildable: - Queue: Defense + Queue: DefenseSQ, DefenseMQ BuildPaletteOrder: 130 - Prerequisites: scrt, ~structures.scrin, ~techlevel.unrestricted + Prerequisites: scrt, ~structures.scrin, ~techlevel.high BuildLimit: 1 IconPalette: chrome - Description: Slows enemy unit movement and rate of fire.\n Requires power to operate.\n Maximum 1 can be built.\n Special Ability: Suppression Field + Description: Slows enemy unit movement and rate of fire. + TooltipExtras: + Attributes: • Maximum 1 can be built\n• Requires power to operate\n• Special Ability: Suppression Field Valued: Cost: 1500 Tooltip: @@ -3536,7 +5478,6 @@ MANI: Building: Footprint: xx xx Dimensions: 2,2 - LocalCenterOffset: 0,-512,0 Health: HP: 100000 Armor: @@ -3558,50 +5499,35 @@ MANI: Amount: -200 MustBeDestroyed: RequiredForShortGame: false - HitShape: - UseTargetableCellsOffsets: true - Type: Rectangle - TopLeft: -1536, -1024 - BottomRight: 1024, 1024 + ProvidesPrerequisite@buildingname: InfiltrateForSupportPowerReset: - Types: SpyInfiltrate, SabInfiltrate - Targetable: - TargetTypes: Ground, Structure, C4, DetonateAttack, SpyInfiltrate, SabInfiltrate - DetonateWeaponPower@SUPPRESSION: - PauseOnCondition: disabled || empdisable || being-warped - OrderName: suppression - Icon: spresspower - ChargeInterval: 4500 - Description: Suppression Field - LongDesc: Applies a suppression field to the target area, slowing units. - Duration: 600 - SelectTargetSpeechNotification: SelectTarget - InsufficientPowerSpeechNotification: InsufficientPower - DisplayRadarPing: True - ActivationDelay: 0 - SupportPowerPaletteOrder: 10 - TargetCircleRange: 3c512 - TargetCircleColor: ff55ffcc - LaunchSound: suppression.aud - DisplayTimerRelationships: Ally, Neutral, Enemy - Weapon: SuppressionField - CameraActor: camera.dummy - CameraRemoveDelay: 1 + Types: ResetSupportPowerInfiltrate + InfiltrationNotification: BuildingInfiltrated + InfiltratedNotification: BaseAttack + PlayerExperience: 15 + Targetable@INFILTRATION: + RequiresCondition: !being-warped + TargetTypes: ResetSupportPowerInfiltrate + ValidFactions: + Factions: scrin, reaper, traveler, harbinger, collector ProductionCostMultiplier@COLLECTOR: - Multiplier: 90 - Prerequisites: structures.collector + Multiplier: 80 + Prerequisites: player.collector -RIFT: +RFGN: Inherits: ^ScrinBuilding Inherits@IDISABLE: ^DisableOnLowPowerOrPowerDownOrForceDisable Inherits@SHAPE: ^2x2Shape + Inherits@RIFTPOWER: ^RiftPower Buildable: - Queue: Defense - BuildPaletteOrder: 130 + Queue: DefenseSQ, DefenseMQ + BuildPaletteOrder: 140 Prerequisites: scrt, ~structures.scrin, ~techlevel.unrestricted BuildLimit: 1 - Description: Provides Rift support power.\n Requires power to operate.\n Maximum 1 can be built.\n Special Ability: Rift + Description: Provides the Rift superweapon power. IconPalette: chrome + TooltipExtras: + Attributes: • Maximum 1 can be built\n• Requires power to operate\n• Special Ability: Rift Valued: Cost: 2500 Tooltip: @@ -3610,6 +5536,10 @@ RIFT: Footprint: xx xx Dimensions: 2,2 LocalCenterOffset: 0,-512,0 + HitShape: + Type: Rectangle + TopLeft: -1024, -768 + BottomRight: 1024, 1536 Health: HP: 100000 Armor: @@ -3625,37 +5555,6 @@ RIFT: RevealsShroud@GAPGEN: Range: 5c0 RequiresCondition: !disabled - DetonateWeaponPower@RiftGenerator: - OrderName: rift - Icon: riftpower - Cursor: ability - ChargeInterval: 13500 - Description: Rift - ActivationDelay: 50 - LongDesc: Initiate a Lightning Storm.\nApplies heavy damage over a large area. - Weapon: RiftInit - AllowMultiple: false - CameraActor: camera - CameraRemoveDelay: 375 - SelectTargetSpeechNotification: SelectTarget - EndChargeSpeechNotification: RiftReady - InsufficientPowerSpeechNotification: InsufficientPower - IncomingSpeechNotification: RiftApproach - IncomingSound: nukelaunch.aud - LaunchSound: nukelaunch.aud - DisplayTimerRelationships: Ally, Neutral, Enemy - PauseOnCondition: disabled || empdisable || being-warped - DisplayBeacon: True - DisplayRadarPing: True - ArrowSequence: arrow - ClockSequence: clock - CircleSequence: circles - BeaconPoster: riftpower - TargetCircleRange: 6c512 - TargetCircleColor: 0000FF90 - Duration: 425 - ActiveCondition: active - PaletteEffectType: LightningStorm WithIdleOverlay@ACTIVE: Sequence: active-overlay Palette: scrin @@ -3669,9 +5568,13 @@ RIFT: MustBeDestroyed: RequiredForShortGame: false InfiltrateForSupportPowerReset: - Types: SpyInfiltrate, SabInfiltrate - Targetable: - TargetTypes: Ground, Structure, C4, DetonateAttack, SpyInfiltrate, SabInfiltrate + Types: ResetSupportPowerInfiltrate + InfiltrationNotification: BuildingInfiltrated + InfiltratedNotification: BaseAttack + PlayerExperience: 15 + Targetable@INFILTRATION: + RequiresCondition: !being-warped + TargetTypes: ResetSupportPowerInfiltrate WithBuildingBib: HasMinibib: true @@ -3679,22 +5582,28 @@ PTUR: Inherits: ^Defense Inherits@AUTOTARGET: ^AutoTargetGround RenderSprites: - PlayerPalette: overlayplayerscrin + PlayerPalette: playerscrin Buildable: - Queue: Defense + Queue: DefenseSQ, DefenseMQ BuildPaletteOrder: 60 Prerequisites: port, ~structures.scrin, ~techlevel.low - Description: Anti-infantry base defense.\n Can detect cloaked units.\n Strong vs Infantry, Light Armor\n Weak vs Tanks, Aircraft + Description: Anti-infantry base defense. IconPalette: chrome + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor + Weaknesses: • Cannot attack Aircraft + Attributes: • Detects cloaked units Valued: - Cost: 600 + Cost: 725 + CustomSellValue: + Value: 250 Tooltip: Name: Plasma Cannon Selectable: - DecorationBounds: 24,28,0,-6 + DecorationBounds: 1024, 1194, 0, -256 Building: Health: - HP: 40000 + HP: 46000 Armor: Type: Concrete RevealsShroud: @@ -3707,101 +5616,121 @@ PTUR: HasMinibib: true Turreted: TurnSpeed: 48 - InitialFacing: 192 + InitialFacing: 176 RealignDelay: -1 PauseOnCondition: empdisable || being-warped - -WithSpriteBody: - WithEmbeddedTurretSpriteBody: - PauseOnCondition: empdisable || being-warped + RequiresCondition: !build-incomplete + WithSpriteTurret: + RequiresCondition: !build-incomplete Armament: Weapon: PlasmaTurretGun LocalOffset: 450,70,500, 450,-70,500 MuzzleSequence: muzzle MuzzlePalette: scrin AttackTurreted: - RequiresCondition: !build-incomplete - PauseOnCondition: empdisable || being-warped + PauseOnCondition: build-incomplete || empdisable || being-warped WithMuzzleOverlay: Power: - Amount: -20 + Amount: -15 ClassicFacingBodyOrientation: SpawnActorOnDeath: Actor: s1 -SpawnRandomActorOnDeath: + DetectCloaked: + Range: 5c0 + Encyclopedia: + Category: Scrin/Defenses SHAR: Inherits: ^Defense Inherits@IDISABLE: ^DisableOnLowPowerOrPowerDown Inherits@AUTOTARGET: ^AutoTargetAirICBM + Inherits@A2GPROTECTION: ^AirToGroundProtection + Inherits@AntiAirDefense: ^AntiAirDefense RenderSprites: - PlayerPalette: overlayplayerscrin + PlayerPalette: playerscrin Buildable: - Queue: Defense + Queue: DefenseSQ, DefenseMQ BuildPaletteOrder: 90 Prerequisites: anyradar, ~structures.scrin, ~techlevel.medium - Description: Anti-aircraft base defense.\n Requires power to operate.\n Strong vs Aircraft\n Weak vs Ground Units + Description: Anti-aircraft base defense. IconPalette: chrome + TooltipExtras: + Strengths: • Strong vs Aircraft + Weaknesses: • Cannot attack ground units + Attributes: • Requires power to operate\n• Detects cloaked aircraft Valued: Cost: 800 Tooltip: Name: Shard Launcher Selectable: - DecorationBounds: 24,44,0,-11 + DecorationBounds: 1024, 1877, 0, -469 Health: HP: 50000 Armor: Type: Concrete RevealsShroud: - MinRange: 5c0 - Range: 6c0 + MinRange: 6c0 + Range: 8c0 RevealGeneratedShroud: False RevealsShroud@GAPGEN: - Range: 5c0 + Range: 6c0 WithBuildingBib: HasMinibib: true Turreted: TurnSpeed: 60 InitialFacing: 192 RealignDelay: -1 - -WithSpriteBody: - WithEmbeddedTurretSpriteBody: + RequiresCondition: !build-incomplete PauseOnCondition: disabled || empdisable || being-warped + WithSpriteTurret: + RequiresCondition: !build-incomplete Armament@PRIMARY: Weapon: ShardLauncher - LocalOffset: 0,0,1050 + LocalOffset: 300,0,1050 + MuzzleSequence: muzzle + MuzzlePalette: scrin AttackTurreted: - RequiresCondition: !build-incomplete - PauseOnCondition: disabled || empdisable || being-warped + PauseOnCondition: build-incomplete || disabled || empdisable || being-warped + WithMuzzleOverlay: RenderRangeCircle: - RangeCircleType: aa + RangeCircleType: DefenseRangeAA Power: - Amount: -50 + Amount: -40 ClassicFacingBodyOrientation: DetectCloaked: + Range: 7c0 + DetectionTypes: AirCloak RequiresCondition: !(disabled || empdisable || being-warped) SpawnActorOnDeath: Actor: s1 -SpawnRandomActorOnDeath: + Encyclopedia: + Category: Scrin/Defenses SCOL: Inherits: ^Defense Inherits@IDISABLE: ^DisableOnLowPowerOrPowerDown Inherits@AUTOTARGET: ^AutoTargetGround - Inherits@Flash: ^WhiteFlash + Inherits@IONCONDUITS: ^IonConduits RenderSprites: - PlayerPalette: overlayplayerscrin + PlayerPalette: playerscrin Buildable: - Queue: Defense + Queue: DefenseSQ, DefenseMQ BuildPaletteOrder: 80 - Prerequisites: anyradar, ~structures.scrin, ~techlevel.high - Description: Advanced base defense.\n Requires power to operate.\n Can detect cloaked units.\n Strong vs Infantry, Vehicles\n Weak vs Aircraft + Prerequisites: anyradar, ~structures.scrin, ~techlevel.medium + Description: Advanced base defense. IconPalette: chrome + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor + Weaknesses: • Cannot attack Aircraft + Attributes: • Requires power to operate\n• Detects cloaked units Valued: Cost: 1400 Tooltip: Name: Storm Column Selectable: - DecorationBounds: 24,48,0,-14 + DecorationBounds: 1280, 2048, 0, -597 Health: HP: 45000 Armor: @@ -3810,6 +5739,9 @@ SCOL: MinRange: 6c0 Range: 8c0 RevealGeneratedShroud: false + HitShape: + UseTargetableCellsOffsets: true + TargetableOffsets: 0,0,768 RevealsShroud@GAPGEN: Range: 6c0 WithBuildingBib: @@ -3817,96 +5749,38 @@ SCOL: Armament: Weapon: StormColumnZap LocalOffset: 0,0,900, 0,0,1100, 0,0,700, 0,0,1300, 0,0,500 - ExternalCondition@CHARGED: - Condition: charged AttackOmni: - RequiresCondition: !build-incomplete - PauseOnCondition: disabled || empdisable || being-warped + PauseOnCondition: build-incomplete || disabled || empdisable || being-warped Power: - Amount: -100 + Amount: -85 DetectCloaked: RequiresCondition: !(disabled || empdisable || being-warped) SpawnActorOnDeath: Actor: s1 -SpawnRandomActorOnDeath: - GrantConditionOnPrerequisite@IONCON: - Condition: ioncon-upgrade - Prerequisites: ioncon.upgrade - Targetable@StormBoost: - TargetTypes: StormBoost - RequiresCondition: !(powerdown || charged) - AmbientSoundCA@IONSTORM: - SoundFiles: ionstorm.aud - Delay: 0 - Interval: 850 - VolumeMultiplier: 0.4 - RequiresCondition: storm-active - LaysMinefield@IONSTORM: - Mines: strm - Locations: 0,1, 1,0, -1,0 - RecreationInterval: 150 - KillOnRemove: true - RequiresCondition: storm-active GrantConditionOnAttackCA@IONSTORM: - RequiresActorTarget: true - Condition: storm-active - RevokeDelay: 75 - RevokeAll: true - MaximumInstances: 70 - RequiresCondition: ioncon-upgrade - RangeMultiplier@IONSTORM1: - Modifier: 105 - RequiresCondition: storm-active >= 14 - FirepowerMultiplier@IONSTORM1: - Modifier: 105 - RequiresCondition: storm-active >= 14 - DamageMultiplier@IONSTORM1: - Modifier: 95 - RequiresCondition: storm-active >= 14 - RangeMultiplier@IONSTORM2: - Modifier: 105 - RequiresCondition: storm-active >= 28 - FirepowerMultiplier@IONSTORM2: - Modifier: 105 - RequiresCondition: storm-active >= 28 - DamageMultiplier@IONSTORM2: - Modifier: 95 - RequiresCondition: storm-active >= 28 - RangeMultiplier@IONSTORM3: - Modifier: 105 - RequiresCondition: storm-active >= 42 - FirepowerMultiplier@IONSTORM3: - Modifier: 105 - RequiresCondition: storm-active >= 42 - DamageMultiplier@IONSTORM3: - Modifier: 95 - RequiresCondition: storm-active >= 42 - RangeMultiplier@IONSTORM4: - Modifier: 105 - RequiresCondition: storm-active >= 56 - FirepowerMultiplier@IONSTORM4: - Modifier: 105 - RequiresCondition: storm-active >= 56 - DamageMultiplier@IONSTORM4: - Modifier: 95 - RequiresCondition: storm-active >= 56 + RequiresCondition: ioncon-upgrade && !(disabled || empdisable || being-warped) + GrantConditionOnDamage@IONSTORM: + RequiresCondition: ioncon-upgrade && !(disabled || empdisable || being-warped) + Encyclopedia: + Category: Scrin/Defenses STRM: Inherits@1: ^ExistsInWorld Inherits@2: ^SpriteActor - Inherits@AUTOTARGET: ^AutoTargetAll RenderSprites: - Palette: ioncloud-ignore-lighting-alpha50 + Palette: ioncloud HiddenUnderFog: Type: CenterPosition Tooltip: Name: Ion Storm + # required for death animation Health: HP: 1 HitShape: KillsSelf: RemoveInstead: False - Delay: 350, 450 + Delay: 175, 225 Wanders: WanderMoveRadius: 1 ReduceMoveRadiusDelay: 3 @@ -3919,7 +5793,7 @@ STRM: UseDeathTypeSuffix: False CrushedSequence: die FallbackSequence: die - DeathSequencePalette: ioncloud-ignore-lighting-alpha50 + DeathSequencePalette: ioncloud WithSpriteBody@Cloud2: RequiresCondition: strm2 StartSequence: make2 @@ -3932,7 +5806,7 @@ STRM: UseDeathTypeSuffix: False CrushedSequence: die2 FallbackSequence: die2 - DeathSequencePalette: ioncloud-ignore-lighting-alpha50 + DeathSequencePalette: ioncloud WithSpriteBody@Cloud3: RequiresCondition: strm3 StartSequence: make3 @@ -3945,7 +5819,7 @@ STRM: CrushedSequence: die3 FallbackSequence: die3 RequiresCondition: strm3 - DeathSequencePalette: ioncloud-ignore-lighting-alpha50 + DeathSequencePalette: ioncloud WithSpriteBody@Cloud4: RequiresCondition: strm4 StartSequence: make4 @@ -3958,7 +5832,7 @@ STRM: CrushedSequence: die4 FallbackSequence: die4 RequiresCondition: strm4 - DeathSequencePalette: ioncloud-ignore-lighting-alpha50 + DeathSequencePalette: ioncloud Mobile: Locomotor: cloud Speed: 3 @@ -3967,54 +5841,51 @@ STRM: Interactable: GrantRandomCondition@CloudShape: Conditions: strm1, strm2, strm3, strm4 - GrantRandomCondition@LiveCloud: - Conditions: live, dead, dead, dead, dead, dead, dead, dead - AutoTargetPriority@STORM: - ValidTargets: StormBoost - Priority: 1 - AutoTargetPriority@ATTACKANYTHING: - Priority: 10 + +STRM.Live: + Inherits: STRM + Inherits@AUTOTARGET: ^AutoTargetAll + RenderSprites: + Image: strm + JamsMissiles@IONSTORM: + Chance: 10 + Range: 5c0 AutoTarget: InitialStance: AttackAnything - AmbientSoundCA@AMBIENCE: - SoundFiles: thunder1.aud, thunder2.aud, thunder3.aud, thunder4.aud, thunder5.aud, thunder.ambient.aud - Delay: 20, 200 - Interval: 250, 1250 - VolumeMultiplier: 0.3 - RequiresCondition: live && !dead Armament: - Weapon: StormColumnCloudZap - LocalOffset: 0,0,0 - Armament@charge: - FireDelay: 15 - Name: secondary - Weapon: StormColumnCloudCharge + Weapon: IonCloudZap LocalOffset: 0,0,0 - TargetRelationships: Ally - ForceTargetRelationships: None - GrantConditionOnAttack@CHARGESFX: - ArmamentNames: secondary - Condition: charge-fire - RevokeDelay: 200 - AmbientSoundCA@CHARGESFX: - SoundFiles: stormcolumn-fire1.aud, stormcolumn-fire2.aud - Delay: 0 - Interval: 250 - VolumeMultiplier: 0.4 - RequiresCondition: charge-fire AttackTurreted: RequiresCondition: live Turreted: - Offset: 0,0, 3072 + Offset: 0, 0, 3072 + GrantDelayedCondition: + Condition: live + Delay: 25, 75 + PeriodicExplosion: + InitialDelay: 20 + Weapon: IonCloudChargeSource + LocalOffset: 0, 0, 3072 + +STRM2: + Inherits: STRM.Live + RenderSprites: + Image: strm2 + Armament: + Weapon: IonCloudMinorZap + Turreted: + Offset: 0,0, 1024 + PeriodicExplosion: + LocalOffset: 0, 0, 1024 JamsMissiles@IONSTORM: - RequiresCondition: live - Chance: 10 - Range: 5c0 + Range: 2c512 -SCOL.Temp: +SSPK: Inherits: SCOL - RenderSprites: - Image: scol + Tooltip: + Name: Storm Spike + Encyclopedia: + Category: Scrin/Support Powers -Sellable: -Buildable: Health: @@ -4030,24 +5901,246 @@ SCOL.Temp: -SpawnActorOnDeath: -WithBuildingRepairDecoration: -RepairableBuilding: - -EngineerRepairable: + -InstantlyRepairable: -GrantConditionOnPowerState@LOWPOWER: -WithColoredOverlay@IDISABLE: -GrantCondition@IDISABLE: -PowerMultiplier@TEMPORAL: -PowerMultiplier@POWERDOWN: -WithDecoration@POWERDOWN: + -RevealsShroudMultiplier@POWERDOWN: -ToggleConditionOnOrder: + -ExternalCondition@PowerDown: + -DummyConditionConsumer@PowerDown: -Armament: Armament: Weapon: StormColumnZap LocalOffset: 0,0,900, 0,0,1100, 0,0,700, 0,0,1300, 0,0,500 AttackOmni: - PauseOnCondition: empdisable || being-warped + PauseOnCondition: build-incomplete || empdisable || being-warped DetectCloaked: RequiresCondition: !(empdisable || being-warped) - Targetable@StormBoost: - RequiresCondition: !charged + GrantConditionOnAttackCA@IONSTORM: + RequiresCondition: ioncon-upgrade && !(empdisable || being-warped) + GrantConditionOnDamage@IONSTORM: + RequiresCondition: ioncon-upgrade && !(empdisable || being-warped) + -MapEditorData: + -ChangesHealth@DefensePolicy2: + -UpdatesCount@NodCovenant: + -Encyclopedia: + GrantTimedCondition@Active: + Condition: active + Duration: 750 + TimedConditionBarCA@Active: + Condition: active + Color: FFFFFF + ValidRelationships: Ally, Enemy, Neutral + DummyConditionConsumer@Active: + Condition: active + +^SpikeBase: + Inherits: ^Defense + OwnerLostAction: + Action: Kill + RenderSprites: + PlayerPalette: playerscrin + Armor: + Type: Concrete + Building: + TerrainTypes: Clear,Road,Ore,Gems,Tiberium,BlueTiberium,BlackTiberium + AllowPlacementOnResources: true + -BuildSounds: + SoundOnDamageTransition: + -DamagedSounds: + DestroyedSounds: kaboom15.aud + -ShakeOnDeath: + -RepairableBuilding: + -WithBuildingRepairDecoration: + -Sellable: + -ChangesHealth@DefensePolicy2: + -RenderRangeCircle: + -DetectCloaked: + -SpawnActorOnDeath: + -SpawnRandomActorOnDeath: + +VSPK: + Inherits: ^SpikeBase + Selectable: + Bounds: 1280, 1792, 0, -512 + DecorationBounds: 1280, 2560, 0, -768 + Health: + HP: 40000 + Tooltip: + Name: Voidspike + TooltipExtras: + Attributes: • Corrupts resources\n• Damages nearby enemies over time\n• Direct damage is reflected back to the attacker + Description: Gradually transforms nearby resources into Black Tiberium, which is devoid of most of its useful properties. + RevealsShroud: + MinRange: 6c0 + Range: 8c0 + RevealGeneratedShroud: False + RevealsShroud@GAPGEN: + Range: 6c0 + ProximityExternalCondition@VoidSpike: + Condition: voidspike + Range: 8c0 + ValidRelationships: Enemy, Neutral + RequiresCondition: !build-incomplete && !being-warped + WithRangeCircleCA@VoidSpike: + Type: VoidSpike + Range: 8c0 + ValidRelationships: Ally, Enemy, Neutral + UsePlayerColor: true + PlayerColorAlpha: 160 + ConvertsResources: + Range: 8c0 + ConvertFrom: Tiberium, BlueTiberium, Ore, Gems + ConvertTo: BlackTiberium + Interval: 10 + Amount: 1 + RequiresCondition: !build-incomplete && !being-warped + PeriodicExplosion: + Weapon: VoidSpike + RequiresCondition: !build-incomplete && !being-warped + AmbientSoundCA: + SoundFiles: grcl-loop1.aud, grcl-loop2.aud + Delay: 0 + Interval: 20 + VolumeMultiplier: 0.3 + AudibleThroughFog: true + RequiresCondition: !build-incomplete && !being-warped + WithIdleOverlay: + Sequence: overlay + Palette: scrin + IsDecoration: true + RequiresCondition: !build-incomplete && !being-warped + ReflectsDamage: + DamagePercentage: 50 + ValidRelationships: Ally, Enemy, Neutral + ReflectToAttacker: true + RequiresCondition: !build-incomplete && !being-warped + +ISPK: + Inherits: ^SpikeBase + Selectable: + Bounds: 1280, 2304, 0, -576 + DecorationBounds: 1280, 2816, 0, -832 + Health: + HP: 40000 + Tooltip: + Name: Ichor Spike + TooltipExtras: + Attributes: • Enriches Tiberium trees\n• Empowers units with Resource Conversion upgrade + Description: Enriches nearby Tiberium trees causing them to seed Tiberium more quickly. + RevealsShroud: + MinRange: 6c0 + Range: 8c0 + RevealGeneratedShroud: False + RevealsShroud@GAPGEN: + Range: 6c0 + WithIdleAnimation: + Sequences: idle2, idle3, idle4, idle5 + Interval: 5, 50 + RequiresCondition: !build-incomplete && !being-warped + ProximityExternalCondition@IchorBoost: + Range: 8c0 + Condition: ichor-boost + ValidRelationships: Neutral + RequiresCondition: !build-incomplete && !being-warped + ProximityExternalCondition@ONTIB: + Condition: on-tib + Range: 8c0 + ValidRelationships: Ally, Neutral, Enemy + WithRangeCircleCA@IchorBoost: + Type: IchorSpike + Range: 8c0 + ValidRelationships: Ally, Enemy, Neutral + Color: 00ff00aa + TerrainLightSource: + Range: 3c0 + Intensity: 0.1 + GreenTint: 0.3 + ChangesHealth: + Step: 0 + PercentageStep: 1 + Delay: 25 + StartIfBelow: 100 + DamageCooldown: 150 + WithBuildingBib: + HasMinibib: true + +CSPK: + Inherits: ^SpikeBase + Inherits@ProducesBuildings: ^ProducesBuildings + Selectable: + Bounds: 1280, 2304, 0, -576 + DecorationBounds: 1280, 2816, 0, -832 + Health: + HP: 40000 + Tooltip: + Name: Colony Spike + TooltipExtras: + Attributes: • Produces non-defense buildings\n• Allows non-defense buildings to be built nearby once fully charged + Description: Enables production of non-defense buildings. + RevealsShroud: + MinRange: 6c0 + Range: 8c0 + RevealGeneratedShroud: False + RevealsShroud@GAPGEN: + Range: 6c0 + WithBuildingBib: + HasMinibib: true + Building: + TerrainTypes: Clear,Road + AllowPlacementOnResources: false + GivesBuildableArea: + AreaTypes: building + BaseProvider: + Range: 6c0 + RequiresCondition: charged + WithRangeCircle: + Type: ColonySpike + Range: 6c0 + Color: ffffff50 + RequiresCondition: charged + ReloadAmmoPoolCA@Charged: + Delay: 4500 + SelectionBarColor: FFFFFF + SelectionBarValidRelationships: Ally, Enemy, Neutral + AmmoPool@Charged: + Ammo: 1 + InitialAmmo: 0 + AmmoCondition: charged + -PrimaryBuilding: + -WithDecoration@primary: + -ProductionQueue@MQDEF: + -ProductionBar@MQDEF: + -GrantConditionOnPrerequisite@MQF: + -GrantConditionOnPrerequisite@MQS: + Production@SQBLD: + Produces: BuildingSQ + PauseOnCondition: build-incomplete || being-warped + Production@MQBLD: + Produces: BuildingMQ + PauseOnCondition: build-incomplete || being-warped + ProductionBar@SQBLD: + ProductionType: BuildingSQ + ProductionBar@MQBLD: + ProductionType: BuildingMQ + ProvidesPrerequisite@scrin: + Prerequisite: structures.scrin + ProvidesPrerequisiteValidatedFaction@reaper: + Factions: reaper + Prerequisite: structures.reaper + ProvidesPrerequisiteValidatedFaction@traveler: + Factions: traveler + Prerequisite: structures.traveler + ProvidesPrerequisiteValidatedFaction@harbinger: + Factions: harbinger + Prerequisite: structures.harbinger + ProvidesPrerequisiteValidatedFaction@collector: + Factions: collector + Prerequisite: structures.collector # # ---- misc @@ -4062,11 +6155,14 @@ BUZZ: Type: CenterPosition Tooltip: Name: Buzzer Swarm - Health: - HP: 1 + TooltipExtras: + Description: Swarm of biometallic shards. + Strengths: • Strong vs Infantry, Light Armor + Weaknesses: • Weak vs Heavy Armor, Buildings, Defenses\n• Cannot attack Aircraft + Attributes: • Untargetable\n• Blinds enemies RevealsShroud: MinRange: 1c0 - Range: 3c0 + Range: 6c0 RevealGeneratedShroud: False Type: CenterPosition RevealsShroud@GAPGEN: @@ -4077,13 +6173,15 @@ BUZZ: WithSpriteBody: HitShape: KillsSelf: - RemoveInstead: true Delay: 450 + # required for death animation + Health: + HP: 1 Aircraft: CanHover: True Speed: 33 CruiseAltitude: 1 - LandableTerrainTypes: Clear,Road,Rough,Ore,Gems,Tiberium,BlueTiberium,Water,Tree,River + LandableTerrainTypes: Clear,Road,Rough,Ore,Gems,Tiberium,BlueTiberium,BlackTiberium,Water,Tree,River,Rock,Beach,Bridge,Tunnel,Wall,Ford AmbientSound: SoundFiles: buzzers-idle1.aud, buzzers-idle2.aud, buzzers-idle3.aud Interval: 10 @@ -4091,7 +6189,32 @@ BUZZ: VoiceSet: BuzzersVoice Armament@PRIMARY: Weapon: BuzzerTargeting + RequiresCondition: alive AttackFrontal: + FacingTolerance: 0 + WithColoredSelectionBox@PLAYERBOX: + ColorSource: Player + ValidRelationships: Ally, Enemy + WithMakeAnimation: + WithDeathAnimation: + UseDeathTypeSuffix: false + CrushedSequence: die + FallbackSequence: die + DeathSequencePalette: scrin + DeathPaletteIsPlayerPalette: false + GrantTimedCondition: + Duration: 450 + Condition: alive + TimedConditionBar@ALIVE: + Condition: alive + Color: 777777 + ProximityExternalCondition@Blind: + MaximumVerticalOffset: 512 + Range: 1c256 + Condition: blinded + ValidRelationships: Enemy, Neutral + Targetable: + TargetTypes: BuzzerSwarm BUZZ.AI: Inherits: BUZZ @@ -4100,97 +6223,297 @@ BUZZ.AI: AttackWander: WanderMoveRadius: 1 ReduceMoveRadiusDelay: 3 - -Aircraft: - Mobile: - Speed: 33 - Locomotor: cloud -camera.rift: - Interactable: - EditorOnlyTooltip: - Name: (support power) +MSPK: + Inherits@1: ^ExistsInWorld + Inherits@2: ^SpriteActor + Inherits@selection: ^SelectableSupportUnit + Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove + Tooltip: + Name: Mind Spark RenderSprites: - Image: riftanim - Palette: effect-ignore-lighting-alpha85 + Palette: caneon WithSpriteBody: - StartSequence: spawn ClassicFacingBodyOrientation: QuantizedFacings: 1 - AlwaysVisible: + HiddenUnderFog: + Type: CenterPosition + Selectable: + Bounds: 896, 896 + DecorationBounds: 896, 896 HitShape: RevealsShroud: - Range: 6c0 + Range: 5c0 Type: CenterPosition + Armament@PRIMARY: + Weapon: MindSparkZap + AttackTurreted: + Turreted: + Aircraft: + CanHover: True + Speed: 46 + CruiseAltitude: 1 + LandableTerrainTypes: Clear,Road,Rough,Ore,Gems,Tiberium,BlueTiberium,BlackTiberium,Water,Tree,River,Rock,Beach,Bridge,Tunnel,Wall,Ford + KillsSelf: + Delay: 325 + WithDeathAnimation: + UseDeathTypeSuffix: false + CrushedSequence: die + FallbackSequence: die + DeathSequencePalette: caneon + DeathPaletteIsPlayerPalette: false Health: HP: 1 + Voiced: + VoiceSet: MindSparkVoice + WithColoredSelectionBox@PLAYERBOX: + ColorSource: Player + ValidRelationships: Ally, Enemy + Targetable: + TargetTypes: MindSpark PeriodicExplosion: - Weapon: Rift + Weapon: MindSparkEruption + LocalOffset: 0,0,128 + +GRCL: + Inherits@1: ^ExistsInWorld + Inherits@2: ^SpriteActor + Inherits@selection: ^SelectableCombatUnit + HiddenUnderFog: + Type: CenterPosition + Tooltip: + Name: Greater Coalescence + TooltipExtras: + Description: Pulsing biomass that heals allies and feeds on enemies. + Attributes: • Heals nearby allies\n• Slows and drains health from enemies\n• Disables power plants + RenderSprites: + Palette: caneon + WithMakeAnimation: + RevealsShroud: + MinRange: 1c0 + Range: 6c0 + RevealGeneratedShroud: False + Type: CenterPosition + RevealsShroud@GAPGEN: + Range: 1c0 + Type: CenterPosition + Targetable: + TargetTypes: Ground, Vehicle + Health: + HP: 64000 + Armor: + Type: Light + PeriodicExplosion: + Weapon: GreaterCoalescence + WithSpriteBody: + HitShape: + Aircraft: + CanHover: True + Speed: 33 + CruiseAltitude: 1 + LandableTerrainTypes: Clear,Road,Rough,Ore,Gems,Tiberium,BlueTiberium,BlackTiberium,Water,Tree,River,Rock,Beach,Bridge,Tunnel,Wall,Ford + Voiced: + VoiceSet: GiantScrinVoice + WithColoredSelectionBox@PLAYERBOX: + ColorSource: Player + ValidRelationships: Ally, Enemy + FireWarheadsOnDeath: + Weapon: LeecherExplode + EmptyWeapon: LeecherExplode + ConvertsDamageToHealth: + DamagePercentConverted: 200 + ChangesHealth: + Step: -2000 + StartIfBelow: 101 + Delay: 25 + RequiresCondition: !leeching + WithRangeCircleCA: + Type: GreaterCoalescence + Range: 4c512 + UsePlayerColor: true + PlayerColorAlpha: 192 + Visible: Always + ProximityExternalCondition@HEAL: + Condition: lchr-healing + Range: 4c512 + GrantConditionOnHealingReceived: + Condition: leeching + MinimumHealing: 100 + StackDuration: 25 + AmbientSoundCA: + SoundFiles: grcl-loop1.aud, grcl-loop2.aud + Delay: 0 + Interval: 20 + VolumeMultiplier: 0.8 + RequiresCondition: leeching + MapEditorData: + Categories: Critter + WithShadow: + Offset: 80, 160, 0 + ZOffset: -161 + ShadowColor: 11000070 + +TBCL: + Inherits: GRCL + Tooltip: + Name: Tiberium Coalescence + TooltipExtras: + Description: Pulsing biomass that damages nearby units. + -Attributes: + PeriodicExplosion: + Weapon: TiberiumCoalescence + FireWarheadsOnDeath: + Weapon: CorrupterExplode + EmptyWeapon: CorrupterExplode + -GrantConditionOnHealingReceived: + -WithColoredSelectionBox@PLAYERBOX: + -ProximityExternalCondition@HEAL: + -ConvertsDamageToHealth: + -ChangesHealth: + -WithRangeCircleCA: + Health: + HP: 200000 + AttackFrontal: + FacingTolerance: 0 + Targetable@TBCL: + TargetTypes: TiberiumCoalescence + -AmbientSoundCA: + WithShadow: + ShadowColor: 00110070 + GpsRadarDot: + Sequence: LargeInfantry + ChangesHealth: + PercentageStep: 1 + Delay: 50 + StartIfBelow: 101 + DamageCooldown: 0 + +^RiftBase: + Interactable: + Bounds: 64, 64 + ScriptTriggers: + RenderSprites: + WithSpriteBody: + ClassicFacingBodyOrientation: + QuantizedFacings: 1 + HiddenUnderFog: + Type: GroundPosition + HitShape: Immobile: OccupiesSpace: false + +Rift: + Inherits: ^RiftBase + EditorOnlyTooltip: + Name: (Rift) + RenderSprites: + Image: riftlg + Palette: effect-ignore-lighting-alpha85 + PeriodicExplosion: + Weapon: Rift + KillsSelf: + Delay: 360 + # required for spawning actor on death + Health: + HP: 1 + WithSpriteBody: + StartSequence: make AmbientSound: SoundFiles: rift1.aud, rift2.aud, rift3.aud Interval: 50 - WithDeathAnimation: - UseDeathTypeSuffix: false - CrushedSequence: fade - FallbackSequence: fade + SpawnActorOnDeath: + Actor: riftfade + SkipMakeAnimations: false + RevealsShroud: + Range: 10c0 + Type: CenterPosition + +RiftFade: + Inherits: Rift + WithSpriteBody: + Sequence: dead + WithMakeAnimation: + Sequence: die KillsSelf: - Delay: 360 + Delay: 24 + -SpawnActorOnDeath: + -PeriodicExplosion: + -AmbientSound: -camera.minirift: - Inherits: camera.rift +RiftMinor: + Inherits: ^RiftBase + EditorOnlyTooltip: + Name: (Minor Rift) RenderSprites: - Image: miniriftanim + Image: riftsm PeriodicExplosion: Weapon: MiniRift KillsSelf: - Delay: 120 + Delay: 144 + # required for spawning actor on death + Health: + HP: 1 WithSpriteBody: - -StartSequence: - -AmbientSound: - -WithDeathAnimation: - -RevealsShroud: - Targetable@RIFT: - TargetTypes: Rift + StartSequence: make + SpawnActorOnDeath: + Actor: riftminorfade + SkipMakeAnimations: false + +RiftMinorFade: + Inherits: RiftMinor + WithSpriteBody: + Sequence: dead + WithMakeAnimation: + Sequence: die + KillsSelf: + Delay: 24 + -SpawnActorOnDeath: + -PeriodicExplosion: camera.resourcescan: - Inherits: CAMERA - EditorOnlyTooltip: - Name: (support power proxy camera) + Inherits: ^CameraBase RevealsShroud: Range: 5c0 -camera.dummy: - Inherits: CAMERA - -RevealsShroud: - -ichor.seeder: - Inherits: CAMERA +IchorSeeder: + Interactable: + ScriptTriggers: + Immobile: + OccupiesSpace: false + BodyOrientation: + QuantizedFacings: 1 + WithSpriteBody: HitShape: - Health: - HP: 1 - SeedsResourceCA: + HiddenUnderFog: + Type: GroundPosition + RevealsShroud: + Range: 4c0 + Type: CenterPosition + SeedsResource: ResourceType: Tiberium Interval: 2 - -RevealsShroud: RenderSprites: Image: ichorseed Palette: scrin - -RenderSpritesEditorOnly: WithDeathAnimation: UseDeathTypeSuffix: False CrushedSequence: fade FallbackSequence: fade - DeathSequencePalette: overlayplayerscrin + DeathSequencePalette: playerscrin KillsSelf: Delay: 225 -ion.surge: - WithSpriteBody: - ClassicFacingBodyOrientation: +IonSurge: + Interactable: + Bounds: 64, 64 + ScriptTriggers: + BodyOrientation: QuantizedFacings: 1 + WithSpriteBody: + WithMakeAnimation: HitShape: - AlwaysVisible: + HiddenUnderFog: + Type: GroundPosition Immobile: OccupiesSpace: false RenderSprites: @@ -4200,78 +6523,141 @@ ion.surge: Weapon: IonSurge KillsSelf: Delay: 200 + # required for spawning actor on death + Health: + HP: 1 AmbientSound: SoundFiles: ionsurgeloop.aud Interval: 50 + WithRangeCircleCA@IonSurge: + Type: IonSurge + Range: 5c0 + Visible: Always + ValidRelationships: Ally + UsePlayerColor: true + PlayerColorAlpha: 192 + SpawnActorOnDeath: + Actor: ionsurgefade + SkipMakeAnimations: false -WORMHOLE: +IonSurgeFade: + Inherits: IonSurge + WithSpriteBody: + Sequence: dead + WithMakeAnimation: + Sequence: fade + KillsSelf: + Delay: 24 + -SpawnActorOnDeath: + -PeriodicExplosion: + -AmbientSound: + -WithRangeCircleCA@IonSurge: + +^WormholeBase: Inherits@1: ^ExistsInWorld Inherits@2: ^SpriteActor - Inherits@3: ^SelectableBuilding Inherits@shape: ^1x1Shape Tooltip: Name: Wormhole RenderSprites: - PlayerPalette: overlayplayerscrin + PlayerPalette: playerscrin WithSpriteBody: ClassicFacingBodyOrientation: QuantizedFacings: 1 - Selectable: - Bounds: 32,32 HiddenUnderFog: Type: CenterPosition - HitShape: - RevealsShroud: - Range: 6c0 - Type: CenterPosition Immobile: OccupiesSpace: true + Interactable: + WithDeathAnimation: + UseDeathTypeSuffix: false + CrushedSequence: die + FallbackSequence: die + WithMakeAnimation: + OwnerLostAction: + Action: Kill + # required for death animation + Health: + HP: 1 + +WORMHOLE: + Inherits: ^WormholeBase + Inherits@3: ^SelectableBuilding + -Interactable: + Selectable: + Bounds: 1365, 1365 + HitShape: Targetable: - TargetTypes: Ground, Structure, Wormhole + TargetTypes: Ground, Structure, Defense, Wormhole Health: - HP: 100000 + HP: 25000 Armor: Type: Concrete + RevealsShroud: + Range: 4c0 + Type: CenterPosition TeleportNetwork: Type: Wormhole Delay: 0 RallyPoint: Path: 1,1 Exit: - PopControlled: - Limit: 2 - WithDeathAnimation: - UseDeathTypeSuffix: false - CrushedSequence: die - FallbackSequence: die - WithMakeAnimation: + MapEditorData: + Categories: System + +REBELGATEWAY: + Inherits: ^WormholeBase + Inherits@SelectableBuilding: ^SelectableBuilding + -Interactable: + Tooltip: + Name: Gateway + TooltipExtras: + Attributes: • Can be powered down to disable, or sold to remove\n• Structures must be manually linked for gateway to function + Description: Acts as a remote exit for linked ground unit production structures + RenderSprites: + Image: wormholelg + Selectable: + Bounds: 2048, 2048 + RevealsShroud: + Range: 4c0 + Type: CenterPosition + HitShape: + Targetable: + TargetTypes: Ground, Structure, Wormhole + Armor: + Type: Concrete + Health: + HP: 50000 + RallyPoint: + LinkedProducerTarget: + Mode: Exit + Types: InfantrySQ, InfantryMQ, VehicleSQ, VehicleMQ + RequiresCondition: !powerdown + Sellable: + SellSounds: cashturn.aud + WithSpriteBody: + RequiresCondition: !powerdown + WithSpriteBody@Disabled: + Name: disabled + RequiresCondition: powerdown + Sequence: faded + ToggleConditionOnOrder: + Condition: powerdown + OrderName: PowerDown # infiltrator stolen tech -# portal - infantry veterancy +# portal - cyberscrin stolentech.port: - AlwaysVisible: + Inherits@DUMMY: ^InvisibleDummy ProvidesPrerequisite: - Prerequisite: barracks.upgraded -# warp sphere - vehicle veterancy +# warp sphere - viper stolentech.wsph: - AlwaysVisible: + Inherits@DUMMY: ^InvisibleDummy ProvidesPrerequisite: - Prerequisite: vehicles.upgraded -# nerve center - aircraft veterancy -stolentech.nerv: - AlwaysVisible: +# gravity stabilizer - manticore +stolentech.grav: + Inherits@DUMMY: ^InvisibleDummy ProvidesPrerequisite: - Prerequisite: aircraft.upgraded - -# tech center - veterancy for all -stolentech.scrt: - AlwaysVisible: - ProvidesPrerequisite@1: - Prerequisite: barracks.upgraded - ProvidesPrerequisite@2: - Prerequisite: vehicles.upgraded - ProvidesPrerequisite@3: - Prerequisite: aircraft.upgraded diff --git a/mods/ca/rules/ships.yaml b/mods/ca/rules/ships.yaml index 4999459a48..f0e59ae640 100644 --- a/mods/ca/rules/ships.yaml +++ b/mods/ca/rules/ships.yaml @@ -3,11 +3,15 @@ SS: Inherits@AUTOTARGET: ^AutoTargetNavalAssaultMove Inherits@BERSERK: ^Berserk Buildable: - Queue: Ship + Queue: ShipSQ, ShipMQ BuildAtProductionType: Submarine BuildPaletteOrder: 30 Prerequisites: ~spen, ~techlevel.low - Description: Submerged anti-ship unit\narmed with torpedoes.\n Can detect other submarines.\n Strong vs Naval Units\n Weak vs Ground Units, Aircraft\n Special Ability: Submerge + Description: Submerged anti-ship unit armed with torpedoes. + TooltipExtras: + Strengths: • Strong vs Naval Units + Weaknesses: • Cannot attack Ground Units, Aircraft + Attributes: • Detects other submarines Valued: Cost: 950 Tooltip: @@ -15,12 +19,12 @@ SS: UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 33000 + HP: 25000 Armor: Type: Light Mobile: TurnSpeed: 16 - Speed: 52 + Speed: 56 RevealsShroud: MinRange: 5c0 Range: 8c0 @@ -33,8 +37,9 @@ SS: FireDelay: 2 PauseOnCondition: under-bridge AttackFrontal: - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded RequiresCondition: !crossing-ford + FacingTolerance: 0 AutoTarget: InitialStance: HoldFire AutoTargetPriority@DEFAULT: @@ -42,7 +47,7 @@ SS: AutoTargetPriority@ATTACKANYTHING: ValidTargets: Water, Underwater Selectable: - DecorationBounds: 38,38 + DecorationBounds: 1621, 1621 GrantConditionOnAttack@STOPSHOOTINGROCKS: Condition: im-dumb RequiredShotsPerInstance: 2 @@ -60,17 +65,23 @@ SS: RangeMultiplier@STOPSHOOTINGROCKS3: Modifier: 25 RequiresCondition: im-dumb == 3 + Encyclopedia: + Category: Soviets/Naval MSUB: Inherits: ^Submarine Inherits@AUTOTARGET: ^AutoTargetNavalAssaultMove Inherits@BERSERK: ^Berserk Buildable: - Queue: Ship + Queue: ShipSQ, ShipMQ BuildAtProductionType: Submarine BuildPaletteOrder: 60 Prerequisites: ~spen, stek, ~techlevel.high - Description: Submerged anti-ground siege unit.\n Can detect other submarines.\n Strong vs Buildings, Ground Units\n Weak vs Naval Units\n Special Ability: Submerge + Description: Submerged anti-ground siege unit. + TooltipExtras: + Strengths: • Strong vs Buildings, Ground Units + Weaknesses: • Weak vs Naval Units\n• Cannot attack Aircraft + Attributes: • Detects other submarines Valued: Cost: 1650 Tooltip: @@ -78,12 +89,12 @@ MSUB: UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 35000 + HP: 30000 Armor: Type: Light Mobile: TurnSpeed: 16 - Speed: 45 + Speed: 49 RevealsShroud: MinRange: 5c0 Range: 8c0 @@ -98,22 +109,31 @@ MSUB: AttackFrontal: TargetFrozenActors: True ForceFireIgnoresActors: True - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded + FacingTolerance: 70 AutoTarget: InitialStance: HoldFire Selectable: - DecorationBounds: 44,44 + DecorationBounds: 1877, 1877 + Cloak: + CloakDelay: 100 + Encyclopedia: + Category: Soviets/Naval DD: Inherits: ^Ship Inherits@AUTOTARGET: ^AutoTargetAllNavalAssaultMove Inherits@BERSERK: ^Berserk Buildable: - Queue: Ship + Queue: ShipSQ, ShipMQ BuildAtProductionType: Boat BuildPaletteOrder: 40 Prerequisites: ~syrd, anyradar, ~techlevel.medium - Description: Fast multi-role ship.\n Can detect submarines.\n Strong vs Naval Units, Vehicles, Aircraft\n Weak vs Infantry + Description: Fast multi-role ship. + TooltipExtras: + Strengths: • Strong vs Naval Units, Vehicles, Aircraft + Weaknesses: • Weak vs Infantry + Attributes: • Detects submarines Valued: Cost: 1000 Tooltip: @@ -126,10 +146,10 @@ DD: Type: Heavy Mobile: TurnSpeed: 28 - Speed: 52 + Speed: 56 RevealsShroud: MinRange: 5c0 - Range: 6c0 + Range: 8c0 RevealGeneratedShroud: False RevealsShroud@GAPGEN: Range: 5c0 @@ -149,7 +169,7 @@ DD: Armament@SECONDARY: Name: secondary Turret: secondary - Weapon: DepthCharge.destroyer + Weapon: DoubleDepthCharge LocalOffset: 0,-100,0, 0,100,0 LocalYaw: 80, -80 PauseOnCondition: under-bridge @@ -162,25 +182,32 @@ DD: AttackTurreted: Turrets: primary, secondary, tertiary Armaments: primary, secondary, tertiary - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded WithSpriteTurret: DetectCloaked: - CloakTypes: Underwater + DetectionTypes: Underwater Range: 4c0 RenderDetectionCircle: + Color: 00ff0020 + BorderColor: 00000020 Selectable: - DecorationBounds: 38,38 + DecorationBounds: 1621, 1621 + Encyclopedia: + Category: Allies/Naval CA: Inherits: ^Ship Inherits@AUTOTARGET: ^AutoTargetNavalAssaultMove Inherits@BERSERK: ^Berserk Buildable: - Queue: Ship + Queue: ShipSQ, ShipMQ BuildAtProductionType: Boat BuildPaletteOrder: 50 Prerequisites: ~syrd, atek, ~techlevel.high - Description: Very slow long-range bombardment ship.\n Strong vs Buildings, Ground Units\n Weak vs Naval Units, Aircraft + Description: Very slow long-range bombardment ship. + TooltipExtras: + Strengths: • Strong vs Buildings, Ground Units + Weaknesses: • Weak vs Naval Units\n• Cannot attack Aircraft Valued: Cost: 2000 Tooltip: @@ -193,7 +220,7 @@ CA: Type: Heavy Mobile: TurnSpeed: 16 - Speed: 28 + Speed: 29 RevealsShroud: MinRange: 5c0 Range: 7c0 @@ -230,23 +257,29 @@ CA: Turrets: primary, secondary TargetFrozenActors: True ForceFireIgnoresActors: True - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded WithMuzzleOverlay: WithSpriteTurret@PRIMARY: Turret: primary WithSpriteTurret@SECONDARY: Turret: secondary Selectable: - DecorationBounds: 44,44 + DecorationBounds: 1877, 1877 + Encyclopedia: + Category: Allies/Naval LST: Inherits: ^Ship Inherits@TRANSPORT: ^Transport + Inherits@SELECTION: ^SelectableSupportUnit Buildable: - Queue: Ship + Queue: ShipSQ, ShipMQ BuildPaletteOrder: 10 Prerequisites: ~techlevel.low - Description: General-purpose naval transport.\n Can carry infantry and tanks.\n Unarmed + Description: General-purpose naval transport. + TooltipExtras: + Weaknesses: • Unarmed + Attributes: • Can carry vehicles and infantry Valued: Cost: 700 Tooltip: @@ -259,7 +292,7 @@ LST: Type: Heavy Mobile: Locomotor: lcraft - Speed: 100 + Speed: 113 PauseOnCondition: notmobile || empdisable || being-warped Hovers: BobDistance: -35 @@ -273,24 +306,57 @@ LST: WithLandingCraftAnimation: OpenTerrainTypes: Clear, Rough, Road, Ore, Gems, Beach Cargo: - Types: Infantry, Vehicle + Types: Infantry, Hacker, Brute, Vehicle MaxWeight: 5 PassengerFacing: 0 LoadingCondition: notmobile - -ChronoshiftableWithSpriteEffect: + LoadedCondition: cargo + PassengerConditions: + mcv: contains-mcv + amcv: contains-mcv + smcv: contains-mcv + WithCargoSounds: + EnterSounds: genter1a.aud + ExitSounds: gexit1a.aud + ProvidesPrerequisite@MCV: + RequiresCondition: contains-mcv + Prerequisite: anymcv Selectable: - DecorationBounds: 36,36 + DecorationBounds: 1536, 1536 + -Targetable@MINIDRONE: + -ChangesHealth@MINIDRONE: + -AttachableTo@MINIDRONE: + Targetable@MINDCONTROL: + RequiresCondition: !cargo && !mindcontrolled + Encyclopedia: + Category: Allies/Naval; Soviets/Naval; GDI/Naval; Nod/Naval + +LST.Reinforce: + Inherits: LST + -Selectable: + -Buildable: + -WithCargoPipsDecoration: + RenderSprites: + Image: lst + Interactable: + RejectsOrders: + Cargo: + MaxWeight: 50 PT: Inherits: ^Ship Inherits@AUTOTARGET: ^AutoTargetNavalAssaultMove Inherits@BERSERK: ^Berserk Buildable: - Queue: Ship + Queue: ShipSQ, ShipMQ BuildAtProductionType: Boat BuildPaletteOrder: 20 Prerequisites: ~syrd, ~techlevel.low - Description: Light scout & support ship.\n Can detect submarines.\n Strong vs Naval Units\n Weak vs Ground Units, Aircraft + Description: Light scout & support ship. + TooltipExtras: + Strengths: • Strong vs Naval Units + Weaknesses: • Weak vs Ground Units\n• Cannot attack Aircraft + Attributes: • Detects submarines Valued: Cost: 500 Tooltip: @@ -303,7 +369,7 @@ PT: Type: Heavy Mobile: TurnSpeed: 28 - Speed: 82 + Speed: 92 RevealsShroud: MinRange: 5c0 Range: 7c0 @@ -324,27 +390,35 @@ PT: MuzzleSequence: muzzle PauseOnCondition: under-bridge AttackTurreted: - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded WithMuzzleOverlay: WithSpriteTurret: DetectCloaked: - CloakTypes: Underwater + DetectionTypes: Underwater Range: 4c0 RenderDetectionCircle: + Color: 00ff0020 + BorderColor: 00000020 Selectable: - DecorationBounds: 36,36 + DecorationBounds: 1536, 1536 + Encyclopedia: + Category: Allies/Naval PT2: Inherits: ^Ship Inherits@AUTOTARGET: ^AutoTargetAllNavalAssaultMove Inherits@BERSERK: ^Berserk Buildable: - Queue: Ship + Queue: ShipSQ, ShipMQ BuildAtProductionType: Boat BuildPaletteOrder: 20 Prerequisites: ~syrd.gdi, ~techlevel.low IconPalette: chrometd - Description: Light scout & support ship armed with guided missiles.\n Can detect submarines.\n Strong vs Submarines, Aircraft\n Weak vs Ground units + Description: Light scout & support ship armed with guided missiles. + TooltipExtras: + Strengths: • Strong vs Submarines, Aircraft + Weaknesses: • Weak vs Ground Units + Attributes: • Detects submarines Valued: Cost: 750 Tooltip: @@ -357,7 +431,7 @@ PT2: Type: Heavy Mobile: TurnSpeed: 28 - Speed: 68 + Speed: 72 RevealsShroud: MinRange: 5c0 Range: 7c0 @@ -386,7 +460,7 @@ PT2: PauseOnCondition: under-bridge AttackTurreted: Armaments: primary, secondary, tertiary - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded WithMuzzleOverlay: WithSpriteTurret: WithIdleOverlay@SPINNER: @@ -395,23 +469,31 @@ PT2: PauseOnCondition: empdisable || being-warped RequiresCondition: !under-bridge DetectCloaked: - CloakTypes: Underwater + DetectionTypes: Underwater Range: 4c0 RenderDetectionCircle: + Color: 00ff0020 + BorderColor: 00000020 Selectable: - DecorationBounds: 36,36 + DecorationBounds: 1536, 1536 + Encyclopedia: + Category: GDI/Naval DD2: Inherits: ^Ship Inherits@AUTOTARGET: ^AutoTargetNavalAssaultMove Inherits@BERSERK: ^Berserk Buildable: - Queue: Ship + Queue: ShipSQ, ShipMQ BuildAtProductionType: Boat BuildPaletteOrder: 40 IconPalette: chrometd Prerequisites: ~syrd.gdi, anyradar, ~techlevel.medium - Description: Advanced warship armed with\na powerful railgun.\n Can detect submarines.\n Strong vs Naval Units, Vehicles\n Weak vs Aircraft + Description: Advanced warship armed with a powerful railgun. + TooltipExtras: + Strengths: • Strong vs Naval Units, Vehicles + Weaknesses: • Cannot attack Aircraft + Attributes: • Detects submarines Valued: Cost: 1000 Tooltip: @@ -424,17 +506,17 @@ DD2: Type: Heavy Mobile: TurnSpeed: 28 - Speed: 56 + Speed: 60 RevealsShroud: MinRange: 5c0 - Range: 6c0 + Range: 8c0 RevealGeneratedShroud: False RevealsShroud@GAPGEN: Range: 5c0 WithIdleOverlay@SPINNER: Sequence: spinner Offset: -90,0,406 - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded RequiresCondition: !under-bridge Turreted@PRIMARY: Turret: primary @@ -444,6 +526,10 @@ DD2: Turret: secondary Offset: 551,0,158 TurnSpeed: 1024 + Turreted@TERTIARY: + Turret: tertiary + TurnSpeed: 15 + Offset: -469,0,128 Armament@PRIMARY: Turret: primary Weapon: Railgun @@ -458,41 +544,56 @@ DD2: Weapon: PointLaser LocalOffset: 0,10,90 PauseOnCondition: under-bridge - RequiresCondition: pointlaser-upgrade + RequiresCondition: pointdef-upgrade ForceTargetRelationships: enemy + Armament@TERTIARY: + Name: tertiary + Turret: tertiary + Weapon: DoubleDepthCharge + LocalOffset: 0,-100,0, 0,100,0 + LocalYaw: 80, -80 + PauseOnCondition: under-bridge AttackTurreted: - Turrets: primary, secondary - Armaments: primary, secondary + Turrets: primary, secondary, tertiary + Armaments: primary, secondary, tertiary PauseOnCondition: empdisable || being-warped AutoTarget: DetectCloaked: - CloakTypes: Underwater + DetectionTypes: Underwater Range: 4c0 RenderDetectionCircle: + Color: 00ff0020 + BorderColor: 00000020 WithSpriteTurret@PRIMARY: Turret: primary WithMuzzleOverlay: Selectable: - DecorationBounds: 38,38 + DecorationBounds: 1621, 1621 PointDefense: Armament: secondary PointDefenseTypes: Missile - RequiresCondition: pointlaser-upgrade + RequiresCondition: pointdef-upgrade ValidRelationships: Enemy - GrantConditionOnPrerequisite@POINTL: - Condition: pointlaser-upgrade - Prerequisites: pointlaser.upgrade + GrantConditionOnPrerequisite@POINTDEF: + Condition: pointdef-upgrade + Prerequisites: pointdef.upgrade + Encyclopedia: + Category: GDI/Naval SS2: Inherits: ^Submarine Inherits@AUTOTARGET: ^AutoTargetNavalAssaultMove Inherits@BERSERK: ^Berserk Buildable: - Queue: Ship + Queue: ShipSQ, ShipMQ BuildAtProductionType: Submarine BuildPaletteOrder: 30 Prerequisites: ~spen.nod, ~techlevel.low - Description: Submerged anti-naval unit\narmed with torpedoes.\n Can detect other submarines.\n Strong vs Naval Units\n Weak vs Ground Units\n Special Ability: Submerge + Description: Submerged anti-ship unit armed with torpedoes. + TooltipExtras: + Strengths: • Strong vs Naval Units + Weaknesses: • Cannot attack Ground Units, Aircraft + Attributes: • Detects other submarines Valued: Cost: 950 Tooltip: @@ -500,12 +601,12 @@ SS2: UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 26500 + HP: 24000 Armor: Type: Light Mobile: TurnSpeed: 20 - Speed: 56 + Speed: 60 RevealsShroud: MinRange: 5c0 Range: 8c0 @@ -518,8 +619,9 @@ SS2: FireDelay: 2 PauseOnCondition: under-bridge AttackFrontal: - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded RequiresCondition: !crossing-ford + FacingTolerance: 0 AutoTarget: InitialStance: HoldFire AutoTargetPriority@DEFAULT: @@ -527,7 +629,7 @@ SS2: AutoTargetPriority@ATTACKANYTHING: ValidTargets: Water, Underwater Selectable: - DecorationBounds: 38,38 + DecorationBounds: 1621, 1621 GrantConditionOnAttack@STOPSHOOTINGROCKS: Condition: im-dumb RequiredShotsPerInstance: 2 @@ -545,17 +647,23 @@ SS2: RangeMultiplier@STOPSHOOTINGROCKS3: Modifier: 25 RequiresCondition: im-dumb == 3 + Encyclopedia: + Category: Nod/Naval ISUB: Inherits: ^Submarine Inherits@AUTOTARGET: ^AutoTargetNavalAssaultMove Inherits@BERSERK: ^Berserk Buildable: - Queue: Ship + Queue: ShipSQ, ShipMQ BuildAtProductionType: Submarine BuildPaletteOrder: 30 Prerequisites: ~spen.nod, tmpl, ~techlevel.high - Description: Submerged unit armed with extreme long-range missiles.\n Missiles can be shot down by static anti-air defenses.\n \n Can detect other submarines.\n Strong vs Buildings, Ground Units\n Weak vs Naval Units, Aircraft\n Special Ability: Submerge + Description: Submerged unit armed with extreme long-range missiles. + TooltipExtras: + Strengths: • Strong vs Buildings, Ground Units + Weaknesses: • Weak vs Naval Units\n• Cannot attack Aircraft + Attributes: • Missiles can be shot down by static anti-air defenses\n• Detects other submarines Valued: Cost: 2000 Tooltip: @@ -563,12 +671,12 @@ ISUB: UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 60000 + HP: 35000 Armor: Type: Light Mobile: TurnSpeed: 16 - Speed: 30 + Speed: 31 PauseOnCondition: empdisable || being-warped || launching RevealsShroud: MinRange: 5c0 @@ -580,24 +688,36 @@ ISUB: Weapon: ICBMLauncher MissileSpawnerMaster: Actors: ICBM - RespawnTicks: 300 + RespawnTicks: 274 LaunchingCondition: launching RequiresCondition: !empdisable && !being-warped + SpawnOffset: 800,0,400 WithSpawnerMasterPipsDecoration: Position: BottomLeft Margin: 4, 3 RequiresSelection: true - Exit: - SpawnOffset: 0,-128,0 - AttackFrontal: + AttackFrontalCharged: TargetFrozenActors: True - PauseOnCondition: under-bridge || empdisable || being-warped + ForceFireIgnoresActors: True + PauseOnCondition: under-bridge || empdisable || being-warped || blinded + FacingTolerance: 16 + ChargeLevel: 75 + DischargeRate: 5 + ShowSelectionBar: true + SelectionBarColor: ffaa00 + ChargingCondition: cloak-force-disabled AutoTarget: InitialStance: HoldFire Selectable: - DecorationBounds: 44,44 + DecorationBounds: 1877, 1877 Cloak: PauseOnCondition: launching || cloak-force-disabled || invisibility || being-warped || crossing-ford + CloakDelay: 100 + RenderRangeCircle@Attack: + RangeCircleType: ISUBRange + Color: ffdd0060 + Encyclopedia: + Category: Nod/Naval ICBM: Inherits: ^ShootableMissile @@ -608,13 +728,13 @@ ICBM: Cost: 50 Tooltip: Name: ICBM - Tooltip@NoRow: - Name: ICBM Health: HP: 7500 BallisticMissile: - LaunchAngle: 155 + LaunchAngle: 160 Speed: 140 + MinAirborneAltitude: 256 + AirborneCondition: airborne LeavesTrailsCA: Image: smokey2 Palette: tseffect-ignore-lighting-alpha75 @@ -624,23 +744,30 @@ ICBM: MissileSpawnerSlave: SpawnedExplodes: Weapon: HonestJohnSub - EmptyWeapon: VisualExplodeHusk + Type: Footprint RequiresCondition: !airborne - Explodes: - Weapon: VisualExplodeAirborne + FireWarheadsOnDeath: + Weapon: V3ExplodeAirborne + RequiresCondition: airborne + FireProjectilesOnDeath@Debris: + Weapons: SmallDebris + Pieces: 3, 5 + Range: 1c511, 3c0 RequiresCondition: airborne -CARR: +CV: Inherits: ^Ship Inherits@AUTOTARGET: ^AutoTargetNavalAssaultMove Inherits@BERSERK: ^Berserk - RenderSprites: - Image: cv Buildable: - Queue: Ship + Queue: ShipSQ, ShipMQ BuildPaletteOrder: 60 Prerequisites: ~syrd.gdi, gtek, ~techlevel.high - Description: Carrier that launches a squadron\nof drone aircraft.\n Strong vs Vehicles, Buildings\n Weak vs Aircraft + Description: Carrier that launches a squadron of Hornet drone aircraft. + TooltipExtras: + Strengths: • Strong vs Ground Units, Buildings + Weaknesses: • Cannot attack Aircraft + Attributes: • Hornets only targetable by static anti-air defenses Valued: Cost: 2000 Tooltip: @@ -659,62 +786,64 @@ CARR: Range: 5c0 Mobile: TurnSpeed: 16 - Speed: 30 + Speed: 31 Voice: Move + ImmovableCondition: drone-landing WithIdleOverlay@SPINNER: Sequence: spinner Offset: 30,70,600 PauseOnCondition: empdisable || being-warped RequiresCondition: !under-bridge - AttackOmni: + AttackFrontal: Voice: Attack - PauseOnCondition: empdisable || being-warped + TargetFrozenActors: True + FacingTolerance: 512 + PauseOnCondition: empdisable || being-warped || blinded CarrierMaster: Actors: horn, horn, horn - RearmTicks: 150 + RearmTicks: 75 RespawnTicks: 500 InstantRepair: true SlaveDisposalOnKill: KillSlaves - SpawnAllAtOnce: false + SpawnAllAtOnce: true RequiresCondition: !empdisable && !being-warped + BeingEnteredCondition: drone-landing + RearmAsGroup: true + MaxSlaveDistance: 20c0 WithSpawnerMasterPipsDecoration: Position: BottomLeft Margin: 4, 3 RequiresSelection: true - Exit@0: - SpawnOffset: 0,0,0 - Facing: 0 - Exit@1: - SpawnOffset: 0,0,0 - Facing: 20 - Exit@2: - SpawnOffset: 0,0,0 - Facing: -20 + Exit: Armament: Weapon: HornetLauncher PauseOnCondition: under-bridge Selectable: - DecorationBounds: 44,44 + DecorationBounds: 1877, 1877 Voiced: VoiceSet: DroneCarrVoice - WithRangeCircle@Attack: - Type: jammer - Range: 18c0 - Color: 0000FF80 + RenderRangeCircle@Attack: + RangeCircleType: CarrierRange + Color: 0000FF60 ProductionCostMultiplier@arcBonus: Multiplier: 90 - Prerequisites: structures.arc + Prerequisites: player.arc + Encyclopedia: + Category: GDI/Naval SB: Inherits: ^Ship Inherits@AUTOTARGET: ^AutoTargetAllNavalAssaultMove Inherits@BERSERK: ^Berserk Buildable: - Queue: Ship + Queue: ShipSQ, ShipMQ BuildPaletteOrder: 20 IconPalette: chrometd Prerequisites: ~spen.nod, ~techlevel.low - Description: Fast scout boat, armed with\nrockets.\n Can attack Aircraft.\n Strong vs Vehicles, Tanks\n Weak vs Infantry + Description: Fast scout boat, armed with rockets. + TooltipExtras: + Strengths: • Strong vs Naval Units, Ground Vehicles, Aircraft + Weaknesses: • Weak vs Infantry Valued: Cost: 500 Tooltip: @@ -727,13 +856,13 @@ SB: Type: Light Mobile: TurnSpeed: 40 - Speed: 100 + Speed: 113 RevealsShroud: - MinRange: 4c0 - Range: 5c0 + MinRange: 5c0 + Range: 7c0 RevealGeneratedShroud: False RevealsShroud@GAPGEN: - Range: 4c0 + Range: 5c0 Armament@PRIMARY: Weapon: SBRockets LocalOffset: -128, -170, 170, -128, 170, 170 @@ -746,24 +875,33 @@ SB: LocalYaw: 100, -100 PauseOnCondition: under-bridge AttackFrontal: - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded + FacingTolerance: 0 WithMuzzleOverlay: DetectCloaked: - CloakTypes: Underwater + DetectionTypes: Underwater Range: 2c0 RenderDetectionCircle: + Color: 00ff0020 + BorderColor: 00000020 Selectable: - DecorationBounds: 36,36 + DecorationBounds: 1536, 1536 + Encyclopedia: + Category: Nod/Naval SEAS: Inherits: ^Ship Inherits@AUTOTARGET: ^AutoTargetAllNavalAssaultMove Inherits@BERSERK: ^Berserk Buildable: - Queue: Ship + Queue: ShipSQ, ShipMQ BuildPaletteOrder: 20 Prerequisites: ~spen, ~techlevel.low - Description: Light scout & support ship.\n Can detect submarines.\n Strong vs Aircraft, Infantry\n Weak vs Naval Units, Tanks + Description: Light scout & support ship. + TooltipExtras: + Strengths: • Strong vs Aircraft, Infantry + Weaknesses: • Weak vs Naval Units, Vehicles + Attributes: • Detects submarines Valued: Cost: 600 Tooltip: @@ -776,7 +914,7 @@ SEAS: Type: Heavy Mobile: TurnSpeed: 36 - Speed: 82 + Speed: 92 RevealsShroud: MinRange: 5c0 Range: 7c0 @@ -795,11 +933,16 @@ SEAS: MuzzleSequence: muzzle PauseOnCondition: under-bridge AttackFrontal: - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded + FacingTolerance: 0 WithMuzzleOverlay: DetectCloaked: - CloakTypes: Underwater + DetectionTypes: Underwater Range: 4c0 RenderDetectionCircle: + Color: 00ff0020 + BorderColor: 00000020 Selectable: - DecorationBounds: 36,36 \ No newline at end of file + DecorationBounds: 1536, 1536 + Encyclopedia: + Category: Soviets/Naval diff --git a/mods/ca/rules/structures.yaml b/mods/ca/rules/structures.yaml index 1770f4d0a9..46ebdd61bd 100644 --- a/mods/ca/rules/structures.yaml +++ b/mods/ca/rules/structures.yaml @@ -2,18 +2,21 @@ MSLO: Inherits: ^Building Inherits@IDISABLE: ^DisableOnLowPowerOrPowerDownOrForceDisable Inherits@SHAPE: ^2x1Shape + Inherits@ABOMBPOWER: ^ABombPower Selectable: - Bounds: 48,24 + Bounds: 2048, 1024 Valued: Cost: 2500 Tooltip: Name: Missile Silo Buildable: - Queue: Defense + Queue: DefenseSQ, DefenseMQ BuildPaletteOrder: 140 - Prerequisites: stek, ~techlevel.unrestricted, ~structures.soviet + Prerequisites: stek, ~structures.soviet, ~techlevel.unrestricted BuildLimit: 1 - Description: Provides an atomic bomb.\n Requires power to operate.\n Maximum 1 can be built.\n Special Ability: Atom Bomb + Description: Provides the A-Bomb superweapon power. + TooltipExtras: + Attributes: • Maximum 1 can be built\n• Requires power to operate\n• Special Ability: A-Bomb Building: Footprint: xx Dimensions: 2,1 @@ -32,68 +35,46 @@ MSLO: RevealsShroud@GAPGEN: Range: 5c0 RequiresCondition: !disabled - NukePower: - PauseOnCondition: disabled || empdisable || being-warped - Cursor: nuke - Icon: abomb - ChargeInterval: 13500 - Description: Atom Bomb - LongDesc: Launches a devastating atomic bomb\nat a target location. - BeginChargeSpeechNotification: AbombPrepping - EndChargeSpeechNotification: AbombReady - SelectTargetSpeechNotification: SelectTarget - InsufficientPowerSpeechNotification: InsufficientPower - IncomingSound: nukelaunch.aud - IncomingSpeechNotification: AbombLaunchDetected - LaunchSound: nukelaunch.aud - MissileWeapon: atomic - MissileDelay: 5 - SpawnOffset: 1c0,427,0 - DisplayTimerRelationships: Ally, Neutral, Enemy - DisplayBeacon: True - DisplayRadarPing: True - BeaconPoster: atomicon - CameraRange: 10c0 - ArrowSequence: arrow - ClockSequence: clock - CircleSequence: circles - TrailImage: smokey2 - TrailSequences: idle - TrailPalette: tseffect-ignore-lighting-alpha75 - CircleRanges: 6c512 - CircleColor: BB0000AA - CircleBorderColor: 770000AA SupportPowerChargeBar: Power: - Amount: -150 + Amount: -200 MustBeDestroyed: RequiredForShortGame: false WithSupportPowerActivationAnimation: RequiresCondition: !build-incomplete ProvidesPrerequisite@buildingname: InfiltrateForSupportPowerReset: - Types: SpyInfiltrate, SabInfiltrate - Targetable: - TargetTypes: Ground, Structure, C4, DetonateAttack, SpyInfiltrate, SabInfiltrate + Types: ResetSupportPowerInfiltrate + InfiltrationNotification: BuildingInfiltrated + InfiltratedNotification: BaseAttack + PlayerExperience: 15 + Targetable@INFILTRATION: + RequiresCondition: !being-warped + TargetTypes: ResetSupportPowerInfiltrate ProductionCostMultiplier@IRAQBONUS: - Multiplier: 90 - Prerequisites: structures.iraq + Multiplier: 60 + Prerequisites: player.iraq + Encyclopedia: + Category: Soviets/Buildings GAP: - Inherits: ^Building + Inherits: ^Defense Inherits@IDISABLE: ^DisableOnLowPowerOrPowerDownOrForceDisable + Inherits@AUTOTARGET: ^AutoTargetAll Valued: - Cost: 800 + Cost: 1000 Tooltip: Name: Gap Generator Buildable: - Queue: Defense + Queue: DefenseSQ, DefenseMQ BuildPaletteOrder: 110 Prerequisites: atek, ~structures.allies, ~techlevel.high - Description: Obscures the enemy's view with shroud.\n Requires power to operate. + Description: Regenerates the shroud nearby, obscuring enemy vision. Can channel the effect to reduce enemy weapon range and vision. + TooltipExtras: + Attributes: • Requires power to operate Selectable: - Bounds: 24,24 - DecorationBounds: 24,48,0,-12 + Bounds: 1024, 1024 + DecorationBounds: 1024, 2048, 0, -512 WithSpriteBody: PauseOnCondition: disabled || empdisable || being-warped Health: @@ -101,51 +82,67 @@ GAP: Armor: Type: Concrete RevealsShroud: - MinRange: 4c0 - Range: 5c0 + MinRange: 6c0 + Range: 8c0 RevealGeneratedShroud: False RevealsShroud@GAPGEN: - Range: 4c0 + Range: 6c0 + Armament: + Weapon: GapBeam + LocalOffset: 0,0,1150 + MuzzleSequence: muzzle + WithMuzzleOverlay: + AttackTurreted: + PauseOnCondition: build-incomplete || disabled || empdisable || being-warped + Turreted: + TurnSpeed: 512 WithBuildingBib: HasMinibib: true CreatesShroud: Range: 8c0 RequiresCondition: !disabled && !empdisable && !being-warped RenderShroudCircle: + -RenderRangeCircle: Power: Amount: -60 MustBeDestroyed: RequiredForShortGame: false - -AcceptsDeliveredCash: - Explodes: + FireWarheadsOnDeath: Weapon: SmallBuildingExplode EmptyWeapon: SmallBuildingExplode HitShape: Type: Rectangle TopLeft: -512, -512 BottomRight: 512, 512 + Encyclopedia: + Category: Allies/Buildings SPEN: Inherits: ^Building - Inherits@PRIMARY: ^PrimaryBuilding + Inherits@WATERSTRUCTURE: ^WaterStructure + Inherits@NAV: ^ProducesNaval Selectable: - Bounds: 72,48 + Bounds: 3072, 2048 RenderSprites: PlayerPalette: playernavy - InfiltrateForSupportPower: + InfiltrateToCreateProxyActor: Proxy: powerproxy.sonarpulse - Types: SpyInfiltrate + Types: GrantSupportPowerInfiltrate + InfiltrationNotification: BuildingInfiltrated + InfiltratedNotification: BaseAttack + PlayerExperience: 15 Valued: Cost: 800 Tooltip: Name: Sub Pen Buildable: - Queue: Building - BuildPaletteOrder: 50 + Queue: BuildingSQ, BuildingMQ + BuildPaletteOrder: 220 Prerequisites: anypower, ~structures.soviet, ~techlevel.navy, ~techlevel.low Description: Produces and repairs\nsubmarines and transports. - Targetable: - TargetTypes: Ground, Water, Structure, WaterStructure, C4, DetonateAttack, SpyInfiltrate + Targetable@INFILTRATION: + RequiresCondition: !being-warped + TargetTypes: GrantSupportPowerInfiltrate Building: Footprint: XXX xxx XXX Dimensions: 3,3 @@ -168,66 +165,54 @@ SPEN: SpawnOffset: 0,-213,0 Facing: 384 ExitCell: -1,2 - ProductionTypes: Submarine Exit@2: RequiresCondition: !being-captured SpawnOffset: 0,-213,0 Facing: 640 ExitCell: 3,2 - ProductionTypes: Submarine Exit@3: RequiresCondition: !being-captured SpawnOffset: 0,0,0 Facing: 128 ExitCell: 0,0 - ProductionTypes: Submarine Exit@4: RequiresCondition: !being-captured SpawnOffset: 0,0,0 Facing: 896 ExitCell: 2,0 - ProductionTypes: Submarine Exit@b1: RequiresCondition: !being-captured SpawnOffset: -1024,1024,0 Facing: 640 ExitCell: 0,2 - ProductionTypes: Ship Exit@b2: RequiresCondition: !being-captured SpawnOffset: 1024,1024,0 Facing: 896 ExitCell: 2,2 - ProductionTypes: Ship Exit@b3: RequiresCondition: !being-captured SpawnOffset: -1024,-1024,0 Facing: 384 ExitCell: 0,0 - ProductionTypes: Ship Exit@b4: RequiresCondition: !being-captured SpawnOffset: 1024,-1024,0 Facing: 128 ExitCell: 2,0 - ProductionTypes: Ship - Production: - Produces: Ship, Submarine - PauseOnCondition: forceshield || invulnerability || being-warped - -SpawnActorsOnSell: + -SpawnActorsOnSellCA: RepairsUnits: HpPerStep: 1000 StartRepairingNotification: Repairing + StartRepairingTextNotification: Repairing. FinishRepairingNotification: UnitRepaired - PlayerExperience: 15 + FinishRepairingTextNotification: Unit repaired. RequiresCondition: !forceshield && !invulnerability && !being-warped RallyPoint: - ProductionBar: - ProductionType: Ship Power: Amount: -30 DetectCloaked: - CloakTypes: Underwater + DetectionTypes: Underwater Range: 10c0 RequiresCondition: !(empdisable || being-warped) RenderDetectionCircle: @@ -245,28 +230,35 @@ SPEN: BottomRight: 555, 1110 -SpawnActorOnDeath: -SpawnRandomActorOnDeath: + Encyclopedia: + Category: Soviets/Buildings SYRD: Inherits: ^Building - Inherits@PRIMARY: ^PrimaryBuilding + Inherits@WATERSTRUCTURE: ^WaterStructure + Inherits@NAV: ^ProducesNaval Selectable: - Bounds: 72,48 + Bounds: 3072, 2048 RenderSprites: PlayerPalette: playernavy - InfiltrateForSupportPower: + InfiltrateToCreateProxyActor: Proxy: powerproxy.sonarpulse - Types: SpyInfiltrate + Types: GrantSupportPowerInfiltrate + InfiltrationNotification: BuildingInfiltrated + InfiltratedNotification: BaseAttack + PlayerExperience: 15 Buildable: - Queue: Building - BuildPaletteOrder: 40 + Queue: BuildingSQ, BuildingMQ + BuildPaletteOrder: 210 Prerequisites: anypower, ~structures.allies, ~techlevel.navy, ~techlevel.low Description: Produces and repairs\nships and transports. Valued: Cost: 1000 Tooltip: Name: Naval Yard - Targetable: - TargetTypes: Ground, Water, Structure, WaterStructure, C4, DetonateAttack, SpyInfiltrate + Targetable@INFILTRATION: + RequiresCondition: !being-warped + TargetTypes: GrantSupportPowerInfiltrate Building: Footprint: XXX xxx XXX Dimensions: 3,3 @@ -289,42 +281,34 @@ SYRD: SpawnOffset: -1024,1024,0 Facing: 640 ExitCell: 0,2 - ProductionTypes: Ship, Boat Exit@2: RequiresCondition: !being-captured SpawnOffset: 1024,1024,0 Facing: 896 ExitCell: 2,2 - ProductionTypes: Ship, Boat Exit@3: RequiresCondition: !being-captured SpawnOffset: -1024,-1024,0 Facing: 384 ExitCell: 0,0 - ProductionTypes: Ship, Boat Exit@4: RequiresCondition: !being-captured SpawnOffset: 1024,-1024,0 Facing: 128 ExitCell: 2,0 - ProductionTypes: Ship, Boat - Production: - Produces: Ship, Boat - PauseOnCondition: forceshield || invulnerability || being-warped - -SpawnActorsOnSell: + -SpawnActorsOnSellCA: RepairsUnits: HpPerStep: 1000 StartRepairingNotification: Repairing + StartRepairingTextNotification: Repairing. FinishRepairingNotification: UnitRepaired - PlayerExperience: 15 + FinishRepairingTextNotification: Unit repaired. RequiresCondition: !forceshield && !invulnerability && !being-warped RallyPoint: - ProductionBar: - ProductionType: Ship Power: Amount: -30 DetectCloaked: - CloakTypes: Underwater + DetectionTypes: Underwater Range: 10c0 RequiresCondition: !(empdisable || being-warped) RenderDetectionCircle: @@ -343,17 +327,22 @@ SYRD: BottomRight: 512, 1110 -SpawnActorOnDeath: -SpawnRandomActorOnDeath: + Encyclopedia: + Category: Allies/Buildings IRON: Inherits: ^Building Inherits@IDISABLE: ^DisableOnLowPowerOrPowerDownOrForceDisable Inherits@SHAPE: ^2x1Shape + Inherits@IRONCURTAINPOWER: ^IronCurtainPower Buildable: - Queue: Defense + Queue: DefenseSQ, DefenseMQ BuildPaletteOrder: 130 - Prerequisites: stek, ~structures.soviet, ~techlevel.unrestricted + Prerequisites: stek, ~structures.soviet, ~techlevel.high BuildLimit: 1 - Description: Makes a group of units invulnerable\nfor a short time.\n Requires power to operate.\n Maximum 1 can be built.\n Special Ability: Iron Curtain + Description: Makes a group of units invulnerable for a short time. + TooltipExtras: + Attributes: • Maximum 1 can be built\n• Requires power to operate\n• Special Ability: Iron Curtain Valued: Cost: 1500 Tooltip: @@ -362,8 +351,8 @@ IRON: Footprint: xx Dimensions: 2,1 Selectable: - Bounds: 48,28,0,2 - DecorationBounds: 50,50,0,-12 + Bounds: 2048, 2048, 0, -512 + DecorationBounds: 2133, 2133, 0, -512 Health: HP: 100000 Armor: @@ -381,52 +370,39 @@ IRON: RequiresCondition: !disabled WithBuildingBib: HasMinibib: true - GrantExternalConditionPowerCA@IRONCURTAIN: - OrderName: ironcurtain - Icon: invuln - ChargeInterval: 4500 - Weapon: IronCurtain - Description: Iron Curtain - Condition: invulnerability - Dimensions: 3, 3 - Footprint: _x_ xxx _x_ - ValidRelationships: Ally, Neutral, Enemy - Duration: 600 - ActivationDelay: 0 - AirburstAltitude: 0c0 - AllowMultiple: false - LongDesc: Makes selected vehicles and structures temporarily invulnerable\n Warning: Harmful to Infantry. - OnFireSound: ironcur9.aud - SelectTargetSpeechNotification: SelectTarget - InsufficientPowerSpeechNotification: InsufficientPower - EndChargeSpeechNotification: IronCurtainReady - BeginChargeSpeechNotification: IronCurtainCharging - DisplayRadarPing: True - Cursor: ability - PauseOnCondition: disabled || empdisable || being-warped - DisplayTimerRelationships: Ally, Neutral, Enemy SupportPowerChargeBar: Power: Amount: -200 MustBeDestroyed: RequiredForShortGame: false + ProvidesPrerequisite@buildingname: InfiltrateForSupportPowerReset: - Types: SpyInfiltrate, SabInfiltrate - Targetable: - TargetTypes: Ground, Structure, C4, DetonateAttack, SpyInfiltrate, SabInfiltrate + Types: ResetSupportPowerInfiltrate + InfiltrationNotification: BuildingInfiltrated + InfiltratedNotification: BaseAttack + PlayerExperience: 15 + Targetable@INFILTRATION: + RequiresCondition: !being-warped + TargetTypes: ResetSupportPowerInfiltrate + Encyclopedia: + Category: Soviets/Buildings PDOX: Inherits: ^Building Inherits@IDISABLE: ^DisableOnLowPowerOrPowerDownOrForceDisable Inherits@SHAPE: ^2x2Shape + Inherits@CHRONOSHIFTPOWER: ^ChronoshiftPower + Inherits@TIMEWARPPOWER: ^TimeWarpPower Selectable: - Bounds: 48,48 + Bounds: 2048, 2048 Buildable: - Queue: Defense - BuildPaletteOrder: 120 - Prerequisites: atek, ~structures.allies, ~techlevel.unrestricted + Queue: DefenseSQ, DefenseMQ + BuildPaletteOrder: 130 + Prerequisites: atek, ~structures.allies, ~techlevel.high BuildLimit: 1 - Description: Teleports a group of units across the\nmap for a short time.\n Requires power to operate.\n Maximum 1 can be built.\n Special Ability: Chronoshift + Description: Can be used to teleports units anywhere on the map. + TooltipExtras: + Attributes: • Maximum 1 can be built\n• Requires power to operate\n• Special Ability: Chronoshift Valued: Cost: 1500 Tooltip: @@ -452,7 +428,7 @@ PDOX: WithBuildingBib: HasMinibib: true ValidFactions: - Factions: england, france, germany + Factions: allies, england, france, germany, usa ProvidesPrerequisiteValidatedFaction@germany: Factions: germany Prerequisite: pdox.germany @@ -461,78 +437,6 @@ PDOX: WarpInSequence: warpin WarpOutSequence: warpout Palette: ra2effect-ignore-lighting-alpha75 - ChronoshiftPower@chronoshift: - OrderName: Chronoshift - Prerequisites: !botplayer - PauseOnCondition: disabled || empdisable || being-warped - Duration: 600 - Icon: chrono - ChargeInterval: 4500 - Description: Chronoshift - LongDesc: Teleports a group of units across the map. - SelectTargetSpeechNotification: SelectTarget - InsufficientPowerSpeechNotification: InsufficientPower - BeginChargeSpeechNotification: ChronosphereCharging - EndChargeSpeechNotification: ChronosphereReady - LaunchSound: chrono2.aud - KillCargo: true - DisplayRadarPing: True - Dimensions: 5, 5 - Footprint: __x__ _xxx_ xxxxx _xxx_ __x__ - DisplayTimerRelationships: Ally, Neutral, Enemy - DetonateWeaponPower@ChronoAI: - OrderName: Chronoshiftai - Prerequisites: botplayer - Icon: chrono - Cursor: ability - ChargeInterval: 7000 - Description: Chronoshift - ActivationDelay: 25 - LongDesc: Teleports a group of units across the map. - Weapon: ChronoAI - AirburstAltitude: 0c0 - AllowMultiple: false - CameraActor: camera - CameraRemoveDelay: 375 - SelectTargetSpeechNotification: SelectTarget - InsufficientPowerSpeechNotification: InsufficientPower - BeginChargeSpeechNotification: ChronosphereCharging - EndChargeSpeechNotification: ChronosphereReady - DisplayTimerRelationships: Ally, Neutral, Enemy - PauseOnCondition: disabled || empdisable || being-warped - DisplayRadarPing: True - LaunchSound: chrono2.aud - IncomingSound: chrono2.aud - GrantExternalConditionPowerCA@TimeWarp: - OrderName: TimeWarp - Icon: timewarp - Prerequisites: pdox.germany - Cursor: ability - ChargeInterval: 4500 - Description: Time Warp - LongDesc: Disrupts time and space at target area,\ncausing units & structures to be frozen in time. - Weapon: TimeWarp - Condition: being-warped - Duration: 375 - Dimensions: 3, 3 - ActivationDelay: 0 - Footprint: _x_ xxx _x_ - ValidRelationships: Ally, Enemy, Neutral - AllowMultiple: false - SelectTargetSpeechNotification: SelectTarget - InsufficientPowerSpeechNotification: InsufficientPower - BeginChargeSpeechNotification: ChronosphereCharging - EndChargeSpeechNotification: ChronosphereReady - DisplayTimerRelationships: Ally - PauseOnCondition: disabled || empdisable || being-warped - DisplayBeacon: True - ArrowSequence: arrow - ClockSequence: clock - CircleSequence: circles - BeaconPoster: timewarpicon - DisplayRadarPing: True - LaunchSound: chrono2.aud - IncomingSound: chrono2.aud SupportPowerChargeBar: Power: Amount: -200 @@ -540,28 +444,39 @@ PDOX: RequiredForShortGame: false ProvidesPrerequisite@buildingname: InfiltrateForSupportPowerReset: - Types: SpyInfiltrate, SabInfiltrate - Targetable: - TargetTypes: Ground, Structure, C4, DetonateAttack, SpyInfiltrate, SabInfiltrate + Types: ResetSupportPowerInfiltrate + InfiltrationNotification: BuildingInfiltrated + InfiltratedNotification: BaseAttack + Targetable@INFILTRATION: + RequiresCondition: !being-warped + TargetTypes: ResetSupportPowerInfiltrate + ProductionCostMultiplier@GermanyBonus: + Multiplier: 80 + Prerequisites: player.germany + Encyclopedia: + Category: Allies/Buildings TSLA: Inherits: ^Defense Inherits@IDISABLE: ^DisableOnLowPowerOrPowerDown Inherits@AUTOTARGET: ^AutoTargetGround - Inherits@Flash: ^WhiteFlash Buildable: - Queue: Defense + Queue: DefenseSQ, DefenseMQ BuildPaletteOrder: 80 - Prerequisites: vehicles.any, ~structures.soviet, ~techlevel.high - Description: Advanced base defense.\n Can be buffed or made work during low power by Shock Troopers.\n Requires power to operate.\n Can detect cloaked units.\n Strong vs Infantry, Vehicles\n Weak vs Aircraft + Prerequisites: vehicles.any, ~structures.soviet, ~techlevel.medium + Description: Advanced base defense. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor, Infantry + Weaknesses: • Cannot attack Aircraft + Attributes: • Requires power to operate\n• Detects cloaked units\n• Can be buffed or made work during low power by Shock Troopers Valued: Cost: 1200 Tooltip: Name: Tesla Coil Selectable: - DecorationBounds: 24,40,0,-8 + DecorationBounds: 1024, 1706, 0, -341 Health: - HP: 36000 + HP: 37500 Armor: Type: Concrete RevealsShroud: @@ -593,19 +508,20 @@ TSLA: LocalOffset: 0,0,896 RequiresCondition: !lowpower && charged >= 3 AttackTesla: - RequiresCondition: !build-incomplete - PauseOnCondition: disabled || empdisable || being-warped + PauseOnCondition: build-incomplete || disabled || empdisable || being-warped ChargeAudio: tslachg2.aud MaxCharges: 3 ReloadDelay: 120 Power: - Amount: -100 + Amount: -75 ProvidesPrerequisite@buildingname: + ProvidesPrerequisite@TeslaCoilOrSovietTechCenter: + Prerequisite: tslaorstek DetectCloaked: RequiresCondition: !(disabled || empdisable || being-warped) ProductionCostMultiplier@RussiaBonus: Multiplier: 90 - Prerequisites: structures.russia + Prerequisites: player.russia GrantConditionOnPowerState@LOWPOWER: RequiresCondition: !charged ExternalCondition@CHARGED: @@ -619,35 +535,40 @@ TSLA: RequiresCondition: charged BlinkInterval: 64 RequiresSelection: true - ProvidesPrerequisite@TSLA: - Factions: soviet, russia, ukraine, iraq, yuri - Prerequisite: structures.tsla + Encyclopedia: + Category: Soviets/Defenses AGUN: Inherits: ^Defense Inherits@IDISABLE: ^DisableOnLowPowerOrPowerDown Inherits@AUTOTARGET: ^AutoTargetAirICBM + Inherits@A2GPROTECTION: ^AirToGroundProtection + Inherits@AntiAirDefense: ^AntiAirDefense Buildable: - Queue: Defense + Queue: DefenseSQ, DefenseMQ BuildPaletteOrder: 90 - Prerequisites: anyradar, ~structures.allies, ~techlevel.medium - Description: Anti-aircraft base defense.\n Requires power to operate.\n Strong vs Aircraft\n Weak vs Ground Units + Prerequisites: vehicles.any, ~structures.allies, ~techlevel.medium + Description: Anti-aircraft base defense. + TooltipExtras: + Strengths: • Strong vs Aircraft + Weaknesses: • Cannot attack ground units + Attributes: • Requires power to operate\n• Detects cloaked aircraft Valued: Cost: 800 Tooltip: Name: AA Gun Selectable: - DecorationBounds: 24,32,0,-4 + DecorationBounds: 1024, 1365, 0, -170 Health: HP: 50000 Armor: Type: Concrete RevealsShroud: - MinRange: 5c0 - Range: 6c0 + MinRange: 6c0 + Range: 8c0 RevealGeneratedShroud: False RevealsShroud@GAPGEN: - Range: 5c0 + Range: 6c0 WithBuildingBib: HasMinibib: true Turreted: @@ -655,6 +576,7 @@ AGUN: InitialFacing: 832 RealignDelay: -1 RequiresCondition: !build-incomplete + PauseOnCondition: disabled || empdisable || being-warped WithSpriteTurret: RequiresCondition: !build-incomplete Recoils: false @@ -665,32 +587,42 @@ AGUN: LocalOffset: 520,100,450, 520,-150,450 MuzzleSequence: muzzle AttackTurreted: - RequiresCondition: !build-incomplete - PauseOnCondition: disabled || empdisable || being-warped + PauseOnCondition: build-incomplete || disabled || empdisable || being-warped WithMuzzleOverlay: RenderRangeCircle: - RangeCircleType: aa + RangeCircleType: DefenseRangeAA Power: - Amount: -50 + Amount: -40 ClassicFacingBodyOrientation: DetectCloaked: + Range: 7c0 + DetectionTypes: AirCloak RequiresCondition: !(disabled || empdisable || being-warped) + Encyclopedia: + Category: Allies/Defenses DOME: Inherits: ^Building Inherits@IDISABLE: ^DisableOnLowPowerOrPowerDownOrForceDisable Inherits@SHAPE: ^2x2Shape - Inherits@POWERDRAIN: ^PowerDrainableRadar + Inherits@UPG: ^ProducesUpgrades + Inherits@SOVIETRADARPOWERS: ^SovietRadarPowers + Inherits@VEILOFWARPOWER: ^VeilOfWarPower + Inherits@CLUSTERMINESPOWER: ^ClusterMinesPower + Inherits@TECHLOCKABLE: ^TechLockable + Inherits@ProductionOptimizer1: ^ProductionOptimizer1 Selectable: - Bounds: 48,48 + Bounds: 2048, 2048 HitShape: UseTargetableCellsOffsets: false TargetableOffsets: 0,0,0, 630,-384,0, 630,384,0, -700,-512,0, -700,512,0 Buildable: - Queue: Building + Queue: BuildingSQ, BuildingMQ BuildPaletteOrder: 90 Prerequisites: anyrefinery, ~structures.ra, ~techlevel.medium - Description: Provides an overview of the battlefield.\n Requires power to operate. + Description: Provides an overview of the battlefield. + TooltipExtras: + Attributes: • Requires power to operate\n• Detects nearby enemy vehicles, aircraft and structures in fog of war Valued: Cost: 1800 Tooltip: @@ -699,114 +631,96 @@ DOME: Footprint: xx xx == Dimensions: 2,3 LocalCenterOffset: 0,-512,0 - Targetable: - TargetTypes: Ground, Structure, C4, DetonateAttack, SpyInfiltrate, SabInfiltrate + Targetable@INFILTRATION: + RequiresCondition: !being-warped + TargetTypes: ResetShroudInfiltrate Health: - HP: 100000 + HP: 110000 Armor: Type: Wood RevealsShroud: - MinRange: 6c0 - Range: 10c0 + MinRange: 5c0 + Range: 6c0 RequiresCondition: !disabled RevealGeneratedShroud: False RevealsShroud@Offline: Range: 5c0 RequiresCondition: disabled RevealsShroud@GAPGEN: - Range: 6c0 + Range: 5c0 RequiresCondition: !disabled WithBuildingBib: ProvidesRadar: - RequiresCondition: !jammed && !disabled && !being-warped + RequiresCondition: !jammed && !disabled && !being-warped && !build-incomplete + RangedGpsRadarProvider: + Range: 12c0 + TargetTypes: Vehicle, Air, Structure + RequiresCondition: !jammed && !disabled && !being-warped && !build-incomplete + WithRangeCircle: + Type: RadarDetection + Range: 12c0 + RequiresCondition: !jammed && !disabled && !being-warped && !build-incomplete + SupportPowerChargeBar: InfiltrateForExploration: - Types: SpyInfiltrate, SabInfiltrate + Types: ResetShroudInfiltrate + PlayerExperience: 15 Power: Amount: -40 - -PowerMultiplier@POWERDRAIN: ValidFactions: - Factions: england, france, germany, russia, ukraine, iraq + Factions: allies, england, france, germany, usa, soviet, russia, ukraine, iraq, yuri + ProvidesPrerequisite@buildingname: + RequiresCondition: !tech-locked ProvidesPrerequisite@anyradar: Prerequisite: anyradar + RequiresCondition: !tech-locked + ProvidesPrerequisite@radarorrepair: + Prerequisite: radarorrepair + RequiresCondition: !tech-locked + ProvidesPrerequisite@RadarOrAircraft: + Prerequisite: radaroraircraft + RequiresCondition: !tech-locked + ProvidesPrerequisite@FlameTowerOrRadar: + Prerequisite: fturorradar + RequiresCondition: !tech-locked + ProvidesPrerequisiteValidatedFaction@allrad: + Factions: allies, england, france, germany, usa + Prerequisite: radar.allies + RequiresCondition: !tech-locked ProvidesPrerequisiteValidatedFaction@engrad: Factions: england Prerequisite: radar.england + RequiresCondition: !tech-locked ProvidesPrerequisiteValidatedFaction@frarad: Factions: france Prerequisite: radar.france - ProvidesPrerequisiteValidatedFaction@iraqrad: + RequiresCondition: !tech-locked + ProvidesPrerequisiteValidatedFaction@sovrad: + Factions: soviet, russia, ukraine, iraq, yuri + Prerequisite: radar.soviet + RequiresCondition: !tech-locked + ProvidesPrerequisiteValidatedFaction@rusrad: + Factions: russia + Prerequisite: radar.russia + RequiresCondition: !tech-locked + ProvidesPrerequisiteValidatedFaction@ukrrad: + Factions: ukraine + Prerequisite: radar.ukraine + RequiresCondition: !tech-locked + ProvidesPrerequisiteValidatedFaction@irarad: Factions: iraq Prerequisite: radar.iraq + RequiresCondition: !tech-locked ProvidesPrerequisiteValidatedFaction@yurirad: Factions: yuri Prerequisite: radar.yuri - ProvidesPrerequisiteValidatedFaction@v2: - Factions: ukraine, iraq, yuri - Prerequisite: upgrades.v2 + RequiresCondition: !tech-locked ProvidesPrerequisite@radar-active: Prerequisite: radar-active RequiresCondition: !jammed && !disabled && !being-warped - ProvidesPrerequisite@buildingname: - InfiltrateForSupportPowerCA@STOLENTECH: - Types: SabInfiltrate - Proxy: stolentech.dome ExternalCondition@JAMMED: Condition: jammed - AirstrikePower@clustermines: - ChargeInterval: 6000 - Prerequisites: ~radar.france, ~techlevel.unrestricted - Description: Cluster Mines - LongDesc: Send a cargo plane\nto deploy a minefield. - OrderName: clustermine - UnitType: c17.clustermines - CameraActor: camera - CameraRemoveDelay: 150 - QuantizedFacings: 8 - SquadSize: 1 - DisplayBeacon: true - BeaconPoster: cmineicon - Icon: cmines - ArrowSequence: arrow - ClockSequence: clock - CircleSequence: circles - UseDirectionalTarget: True - DirectionArrowAnimation: paradirection - SelectTargetSpeechNotification: SelectTarget - PauseOnCondition: disabled || being-warped - RequiresCondition: !build-incomplete - SpawnActorPowerCA@GpsScramble: - Actor: gps.scrambler - OrderName: gpsscramble - Icon: gpsscram - IconPalette: chrometd - Prerequisites: ~radar.england, ~techlevel.unrestricted - ChargeInterval: 4500 - LifeTime: 375 - Description: GPS Scrambler - LongDesc: Shrouds the target area. Reduces range of enemy units\nand defenses in area while active. - LaunchSound: sscrambl.aud - SelectTargetSpeechNotification: SelectTarget - InsufficientPowerSpeechNotification: InsufficientPower - PauseOnCondition: disabled || empdisable || being-warped - DisplayRadarPing: True - DisplayTimerRelationships: Ally - Cursor: ability - AllowMultiple: false - EffectImage: empty - EffectSequence: idle - EffectPalette: tseffect-ignore-lighting-alpha75 - TargetCircleRange: 9c512 - TargetCircleColor: 999999AA - Production: - Produces: Upgrade - PauseOnCondition: forceshield || invulnerability || being-warped - ProductionBar: - ProductionType: Upgrade - Exit: - ProximityExternalCondition@DRONECONTROL: - Condition: radarenabled - Range: 300c0 - RequiresCondition: !jammed && !disabled && !being-warped + Encyclopedia: + Category: Allies/Buildings; Soviets/Buildings PBOX: Inherits: ^Defense @@ -815,16 +729,20 @@ PBOX: Name: Pillbox Building: Buildable: - Queue: Defense + Queue: DefenseSQ, DefenseMQ BuildPaletteOrder: 40 Prerequisites: infantry.any, ~structures.pbox, ~techlevel.low - Description: Anti-infantry base defense.\n Can detect cloaked units.\n Strong vs Infantry, Light Armor\n Weak vs Tanks, Aircraft + Description: Anti-infantry base defense. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor + Weaknesses: • Weak vs Heavy Armor\n• Cannot attack Aircraft + Attributes: • Detects cloaked units Valued: Cost: 600 CustomSellValue: - Value: 400 + Value: 200 Health: - HP: 34000 + HP: 40000 Armor: Type: Concrete RevealsShroud: @@ -845,13 +763,16 @@ PBOX: LocalOffset: 341,0,86 MuzzleSequence: muzzle AttackTurreted: - RequiresCondition: !build-incomplete - PauseOnCondition: empdisable || being-warped + PauseOnCondition: build-incomplete || empdisable || being-warped RenderRangeCircle: FallbackRange: 6c0 Power: - Amount: -20 + Amount: -15 WithMuzzleOverlay: + DetectCloaked: + Range: 5c0 + Encyclopedia: + Category: Allies/Defenses HBOX: Inherits: ^Defense @@ -860,16 +781,20 @@ HBOX: Name: Camo Pillbox Building: Buildable: - Queue: Defense + Queue: DefenseSQ, DefenseMQ BuildPaletteOrder: 50 Prerequisites: infantry.any, ~structures.england, ~techlevel.low - Description: Anti-infantry base defense.\n Can detect cloaked units.\n Strong vs Infantry, Light Armor\n Weak vs Tanks, Aircraft + Description: Anti-infantry base defense. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor + Weaknesses: • Weak vs Heavy Armor\n• Cannot attack Aircraft + Attributes: • Detects cloaked units\n• Camouflaged when idle Valued: - Cost: 700 + Cost: 600 CustomSellValue: - Value: 500 + Value: 220 Health: - HP: 34000 + HP: 40000 Armor: Type: Concrete RevealsShroud: @@ -882,7 +807,6 @@ HBOX: InitialDelay: 125 CloakDelay: 60 IsPlayerPalette: true - Palette: cloakra PauseOnCondition: cloak-force-disabled || being-warped GrantConditionOnDamageState@UNCLOAK: Condition: cloak-force-disabled @@ -899,28 +823,39 @@ HBOX: LocalOffset: 341,0,86 MuzzleSequence: muzzle AttackTurreted: - RequiresCondition: !build-incomplete - PauseOnCondition: empdisable || being-warped + PauseOnCondition: build-incomplete || empdisable || being-warped Power: - Amount: -20 + Amount: -15 -MustBeDestroyed: WithMuzzleOverlay: + DetectCloaked: + Range: 5c0 + Encyclopedia: + Category: Allies/Defenses + EncyclopediaExtras: + Subfaction: england GUN: Inherits: ^Defense Inherits@AUTOTARGET: ^AutoTargetGround Buildable: - Queue: Defense + Queue: DefenseSQ, DefenseMQ BuildPaletteOrder: 70 - Prerequisites: infantry.any, ~structures.allies, ~techlevel.medium - Description: Basic anti-tank base defense.\n Can detect cloaked units.\n Strong vs Tanks, Vehicles\n Weak vs Infantry + Prerequisites: infantry.any, ~structures.allies, ~techlevel.low + Description: Basic anti-tank base defense. + TooltipExtras: + Strengths: • Strong vs Heavy Armor + Weaknesses: • Weak vs Infantry\n• Cannot attack Aircraft + Attributes: • Detects cloaked units Valued: Cost: 800 + CustomSellValue: + Value: 300 Tooltip: Name: Turret Building: Health: - HP: 34000 + HP: 46500 Armor: Type: Concrete RevealsShroud: @@ -947,28 +882,37 @@ GUN: LocalOffset: 512,0,112 MuzzleSequence: muzzle AttackTurreted: - RequiresCondition: !build-incomplete - PauseOnCondition: empdisable || being-warped + PauseOnCondition: build-incomplete || empdisable || being-warped WithMuzzleOverlay: Power: - Amount: -40 + Amount: -25 ClassicFacingBodyOrientation: + DetectCloaked: + Range: 5c0 + Encyclopedia: + Category: Allies/Defenses FTUR: Inherits: ^Defense Inherits@AUTOTARGET: ^AutoTargetGround Buildable: - Queue: Defense + Queue: DefenseSQ, DefenseMQ BuildPaletteOrder: 60 Prerequisites: infantry.any, ~structures.ftur, ~techlevel.low - Description: Anti-infantry base defense.\n Can detect cloaked units.\n Strong vs Infantry, Light Armor\n Weak vs Tanks, Aircraft + Description: Anti-infantry base defense. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor + Weaknesses: • Weak vs Heavy Armor\n• Cannot attack Aircraft\n• Has difficulty hitting moving targets + Attributes: • Detects cloaked units Valued: Cost: 600 + CustomSellValue: + Value: 200 Tooltip: Name: Flame Tower Building: Health: - HP: 34000 + HP: 40000 Armor: Type: Concrete RevealsShroud: @@ -986,36 +930,47 @@ FTUR: Weapon: FireballLauncher LocalOffset: 512,0,0 AttackTurreted: - PauseOnCondition: empdisable || being-warped - RequiresCondition: !build-incomplete + PauseOnCondition: build-incomplete || empdisable || being-warped -QuantizeFacingsFromSequence: ClassicFacingBodyOrientation: QuantizedFacings: 8 Power: - Amount: -20 + Amount: -15 ProvidesPrerequisite@buildingname: - Explodes: + ProvidesPrerequisite@FlameTowerOrRadar: + Prerequisite: fturorradar + FireWarheadsOnDeath: Weapon: BuildingExplode EmptyWeapon: BuildingExplode + DetectCloaked: + Range: 5c0 + Encyclopedia: + Category: Soviets/Defenses SAM: Inherits: ^Defense Inherits@IDISABLE: ^DisableOnLowPowerOrPowerDown Inherits@AUTOTARGET: ^AutoTargetAirICBM Inherits@SHAPE: ^2x1Shape + Inherits@A2GPROTECTION: ^AirToGroundProtection + Inherits@AntiAirDefense: ^AntiAirDefense Selectable: - Bounds: 48,24 + Bounds: 2048, 1024 HitShape: Type: Rectangle TopLeft: -768,-512 BottomRight: 768,512 Buildable: - Queue: Defense + Queue: DefenseSQ, DefenseMQ BuildPaletteOrder: 100 Prerequisites: anyradar, ~structures.soviet, ~techlevel.medium - Description: Anti-aircraft base defense.\n Requires power to operate.\n Can detect cloaked units.\n Strong vs Aircraft\n Weak vs Ground Units + Description: Anti-aircraft base defense. + TooltipExtras: + Strengths: • Strong vs Aircraft + Weaknesses: • Cannot attack ground units + Attributes: • Requires power to operate\n• Detects cloaked aircraft Valued: - Cost: 700 + Cost: 750 Tooltip: Name: SAM Site Building: @@ -1027,7 +982,7 @@ SAM: Type: Concrete RevealsShroud: MinRange: 5c0 - Range: 8c0 + Range: 7c0 RevealGeneratedShroud: False RevealsShroud@GAPGEN: Range: 5c0 @@ -1037,38 +992,51 @@ SAM: TurnSpeed: 120 InitialFacing: 0 RealignDelay: -1 - -WithSpriteBody: - WithEmbeddedTurretSpriteBody: + RequiresCondition: !build-incomplete PauseOnCondition: disabled || empdisable || being-warped + WithSpriteTurret: + RequiresCondition: !build-incomplete Armament: Weapon: Nike LocalOffset: 0,0,320 MuzzleSequence: muzzle AttackTurreted: - RequiresCondition: !build-incomplete - PauseOnCondition: disabled || empdisable || being-warped + PauseOnCondition: build-incomplete || disabled || empdisable || being-warped WithMuzzleOverlay: RenderRangeCircle: - RangeCircleType: aa + RangeCircleType: DefenseRangeAA Power: Amount: -40 ClassicFacingBodyOrientation: DetectCloaked: + Range: 7c0 + DetectionTypes: AirCloak RequiresCondition: !(disabled || empdisable || being-warped) + Encyclopedia: + Category: Soviets/Defenses ATEK: Inherits: ^Building Inherits@IDISABLE: ^DisableOnLowPowerOrForceDisabled Inherits@SHAPE: ^2x2Shape + Inherits@UPG: ^ProducesUpgrades + Inherits@GPSPOWER: ^GpsPower + Inherits@FORCESHIELDPOWER: ^ForceShieldPower + Inherits@TEMPINCPOWER: ^TemporalIncursionPower + Inherits@TECHLOCKABLE: ^TechLockable + Inherits@ProductionOptimizer2: ^ProductionOptimizer2 + Inherits@DevelopmentPolicyDiscount: ^DevelopmentPolicyDiscount Selectable: - Bounds: 48,48 + Bounds: 2048, 2048 Buildable: - Queue: Building + Queue: BuildingSQ, BuildingMQ BuildPaletteOrder: 140 Prerequisites: vehicles.any, anyradar, ~structures.allies, ~techlevel.high - Description: Provides Allied advanced technologies.\n Special Ability: GPS Satellite + Description: Provides Allied advanced technologies. + TooltipExtras: + Attributes: • Requires power to operate\n• Special Ability: GPS Satellite Valued: - Cost: 1500 + Cost: 1800 Tooltip: Name: Allied Tech Center Building: @@ -1076,7 +1044,7 @@ ATEK: Dimensions: 2,3 LocalCenterOffset: 0,-512,0 Health: - HP: 100000 + HP: 110000 Armor: Type: Wood RevealsShroud: @@ -1086,107 +1054,149 @@ ATEK: RevealsShroud@GAPGEN: Range: 4c0 WithBuildingBib: - DummyGpsPower: - PauseOnCondition: disabled || being-warped - Icon: gps - OneShot: true - ChargeInterval: 4500 - Description: Satellite Launch - LongDesc: Launches GPS Satellite. - RevealDelay: 375 - LaunchSpeechNotification: SatelliteLaunched - DisplayTimerRelationships: Ally - Condition: sat-launch - ProduceActorPowerCA@SatelliteLaunched: - Actors: gps.satellite - Type: SpySatellite - ChargeInterval: 0 - OneShot: true - OrderName: ProduceActorSat - AutoFire: True - RequiresCondition: sat-launch SupportPowerChargeBar: Power: - Amount: -200 - ProvidesPrerequisite@buildingname: - ProvidesPrerequisite: - Prerequisite: techcenter - InfiltrateForSupportPower@STOLENTECH: - Types: SabInfiltrate - Proxy: stolentech.atek - Targetable: - TargetTypes: Ground, C4, DetonateAttack, Structure, SabInfiltrate - ProduceActorPowerCA@SatelliteScan: - PauseOnCondition: disabled || being-warped - Prerequisites: anyradar, ~gps.satellite, ~fogenabled - Description: Spy Satellite - LongDesc: Periodically reveals the entire map for a short time.\nActivated automatically. - Icon: gps - Actors: camera.satscan - Type: SpySatellite - ChargeInterval: 5250 - OrderName: SatelliteScanPower - AutoFire: True - DisplayTimerRelationships: Ally, Neutral, Enemy - ProduceActorPowerCA@SatelliteScanNoFog: - PauseOnCondition: disabled || being-warped - Prerequisites: anyradar, ~gps.satellite, ~!fogenabled - Description: Spy Satellite - LongDesc: Permanently reveals the entire map.\nActivated automatically. - Icon: gps - Actors: camera.satscan.oneshot - Type: SpySatellite - ChargeInterval: 7500 - OneShot: True - OrderName: SatelliteScanNoFogPower - AutoFire: True - DisplayTimerRelationships: Ally, Neutral, Enemy - GrantExternalConditionPowerCA@FSHIELD: - OrderName: fshield - Icon: forceshield - ChargeInterval: 7500 - Condition: forceshield - Dimensions: 7, 7 - Footprint: ___x___ __xxx__ _xxxxx_ xxxxxxx _xxxxx_ __xxx__ ___x___ - Duration: 250 - Prerequisites: forceshield.enabled, techlevel.high - Weapon: ForceShield - ActivationDelay: 5 - AirburstAltitude: 0c0 - AllowMultiple: false - Sequence: false-active - Description: Force Shield - LongDesc: Makes selected friendly structures temporarily invulnerable.\n Warning: Causes power failure. - OnFireSound: forceon.aud - DisplayTimerRelationships: Ally - SelectTargetSpeechNotification: SelectTarget - InsufficientPowerSpeechNotification: InsufficientPower - EndChargeSpeechNotification: ForceShieldReady - DisplayRadarPing: True - Cursor: ability - PauseOnCondition: disabled || empdisable || being-warped - GrantConditionOnFogEnabled@FOGENABLED: + Amount: -150 + GrantConditionOnLobbyOption@FOGENABLED: + Name: fog Condition: fogenabled + IsBoolean: true ExternalCondition@DUMMY: - Condition: sat-launch + Condition: gps-launched + GrantConditionOnPrerequisite@PREVGPS: + Condition: gps-launched + Prerequisites: gps.satellite + GrantConditionOnPrerequisite@PREVGPSSCAN: + Condition: gps-firstscan + Prerequisites: gps.satellite.firstscan + SpawnActorOnDeath@GPS: + Actor: gps.satellite.firstscan + SpawnAfterDefeat: false + RequiresCondition: gps-launched && !gps-firstscan && fogenabled + SpawnActorOnSell@GPS: + Actor: gps.satellite.firstscan + RequiresCondition: gps-launched && !gps-firstscan && fogenabled ProvidesPrerequisite@FOGENABLED: Prerequisite: fogenabled RequiresCondition: fogenabled - Production: + ValidFactions: + Factions: allies, england, germany, france, usa + ProvidesPrerequisite@buildingname: + RequiresCondition: !tech-locked + ProvidesPrerequisite@anytechcenter: + Prerequisite: techcenter.any + RequiresCondition: !tech-locked + ProvidesPrerequisiteValidatedFaction@germanyatek: + Factions: germany + Prerequisite: atek.germany + RequiresCondition: !tech-locked + ProvidesPrerequisiteValidatedFaction@franceatek: + Factions: france + Prerequisite: atek.france + RequiresCondition: !tech-locked + ProvidesPrerequisiteValidatedFaction@usaatek: + Factions: usa + Prerequisite: atek.usa + RequiresCondition: !tech-locked + Production@UPG: Produces: Upgrade, SpySatellite - PauseOnCondition: forceshield || invulnerability || being-warped - ProductionBar: - ProductionType: Upgrade - Exit: + Exit@UPG: + ProductionTypes: Upgrade, SpySatellite + GrantExternalConditionPowerCA@FSHIELD: + ActiveSequence: false-active + Encyclopedia: + Category: Allies/Buildings + +ALHQ: + Inherits: ^Building + Inherits@POWER_OUTAGE: ^DisableOnLowPowerOrForceDisabled + Inherits@SHAPE: ^3x2Shape + Inherits@UPG: ^ProducesUpgrades + Inherits@TECHLOCKABLE: ^TechLockable + Inherits@ForceShieldPower: ^ForceShieldPower + Inherits@CryostormPower: ^CryostormPower + Inherits@HeliosBombPower: ^HeliosBombPower + Inherits@BlackSkyStrikePower: ^BlackSkyStrikePower + Inherits@ProductionOptimizer2: ^ProductionOptimizer2 + Selectable: + Bounds: 2048, 3072, 0, -512 + DecorationBounds: 2133, 3157, 0, -512 + Building: + Footprint: xx xx == + Dimensions: 2,3 + LocalCenterOffset: 0,-512,0 + Health: + HP: 120000 + Armor: + Type: Wood + RevealsShroud: + MinRange: 4c0 + Range: 5c0 + RevealGeneratedShroud: False + RevealsShroud@GAPGEN: + Range: 4c0 + WithBuildingBib: + SupportPowerChargeBar: + Buildable: + Queue: BuildingSQ, BuildingMQ + BuildPaletteOrder: 200 + Prerequisites: vehicles.any, influence.level2, ~structures.allies, ~techlevel.high + Description: Provides access to coalitions and other advanced technologies. + BuildLimit: 1 + TooltipExtras: + Attributes: • Maximum 1 can be built\n• Cannot be captured or hacked + -Capturable: + -CaptureNotification: + -CapturableProgressBar: + -CapturableProgressBlink: + -CaptureManager: + Valued: + Cost: 1200 + Tooltip: + Name: Allied HQ + Power: + Amount: -150 + WithDeathAnimation: + DeathSequence: dead + UseDeathTypeSuffix: false + Sellable: + RequiresCondition: !build-incomplete && !c4 && !being-warped + SpawnActorOnDeath: + RequiresCondition: !being-warped + SpawnRandomActorOnDeath: + RequiresCondition: !being-warped + ProvidesPrerequisite@buildingname: + RequiresCondition: !tech-locked + WithDecoration@TechLock: + RequiresCondition: tech-locked + Production@UPG: + Produces: Upgrade, Coalition + Exit@UPG: + ProductionTypes: Upgrade, Coalition + -MindControllable@HACKABLE: + -Targetable@HACKABLE: + -MindControllableProgressBar@HACKABLE: + -WithDecoration@HACKED: + -WithDecoration@RESTORING: + -PowerMultiplier@HACKED: + FreeActor@ProductionOptimizer2: + RequiresCondition: optimized-production1 + GrantConditionOnPrerequisite@ProductionOptimizer1: + Condition: optimized-production1 + Prerequisites: optimized.production1 + Encyclopedia: + Category: Allies/Buildings + Scale: 1.8 WEAP: Inherits: ^Building - Inherits@PRIMARY: ^PrimaryBuilding Inherits@SHAPE: ^3x2Shape + Inherits@NOMCV: ^UnlocksMcvIfNoneOwned + Inherits@VEH: ^ProducesVehicles Selectable: - Bounds: 72,48 + Bounds: 3072, 2048 Buildable: - Queue: Building + Queue: BuildingSQ, BuildingMQ BuildPaletteOrder: 80 Prerequisites: anyrefinery, ~structures.ra, ~techlevel.low Description: Produces vehicles. @@ -1209,7 +1219,7 @@ WEAP: RevealsShroud@GAPGEN: Range: 4c0 WithBuildingBib: - WithProductionDoorOverlay: + WithProductionDoorOverlayCA: RequiresCondition: !build-incomplete Sequence: build-top RallyPoint: @@ -1217,17 +1227,15 @@ WEAP: RequiresCondition: !being-captured SpawnOffset: 213,-128,0 ExitCell: 1,2 - Production: - Produces: Vehicle - PauseOnCondition: forceshield || invulnerability || being-warped + TracksCapturedFaction: ValidFactions: - Factions: england, france, germany, russia, ukraine, iraq + Factions: allies, england, france, germany, usa, soviet, russia, ukraine, iraq, yuri ProvidesPrerequisite@any: Prerequisite: vehicles.any ProvidesPrerequisite@human: Prerequisite: vehicles.human ProvidesPrerequisiteValidatedFaction@allies: - Factions: england, france, germany + Factions: allies, england, france, germany, usa Prerequisite: vehicles.allies ProvidesPrerequisite@ra: Prerequisite: vehicles.ra @@ -1240,8 +1248,11 @@ WEAP: ProvidesPrerequisiteValidatedFaction@germany: Factions: germany Prerequisite: vehicles.germany + ProvidesPrerequisiteValidatedFaction@usa: + Factions: usa + Prerequisite: vehicles.usa ProvidesPrerequisiteValidatedFaction@soviet: - Factions: russia, ukraine, iraq, yuri + Factions: soviet, russia, ukraine, iraq, yuri Prerequisite: vehicles.soviet ProvidesPrerequisiteValidatedFaction@russia: Factions: russia @@ -1255,66 +1266,68 @@ WEAP: ProvidesPrerequisiteValidatedFaction@yuri: Factions: yuri Prerequisite: vehicles.yuri - ProvidesPrerequisiteValidatedFaction@mrj: - Factions: england, france, germany - Prerequisite: vehicles.mrj - ProvidesPrerequisiteValidatedFaction@ifv: - Factions: england, france, germany - Prerequisite: vehicles.ifv - ProvidesPrerequisiteValidatedFaction@v2: - Factions: russia, ukraine, iraq, yuri - Prerequisite: vehicles.v2 - ProvidesPrerequisiteValidatedFaction@v2upgrade: - Factions: russia - Prerequisite: v2.upgrade - ProvidesPrerequisiteValidatedFaction@2tnk: - Factions: france, germany - Prerequisite: vehicles.2tnk - ProvidesPrerequisiteValidatedFaction@3tnk: - Factions: russia, ukraine, iraq, yuri - Prerequisite: vehicles.3tnk + ProvidesPrerequisiteValidatedFaction@1tnk: + Factions: allies, france, germany, usa + Prerequisite: vehicles.1tnk ProvidesPrerequisiteValidatedFaction@qtnk: - Factions: russia, ukraine, iraq + Factions: soviet, russia, ukraine, iraq Prerequisite: vehicles.qtnk - ProductionBar: - ProductionType: Vehicle + ProvidesPrerequisiteValidatedFaction@v2: + Factions: soviet, russia, iraq, yuri + Prerequisite: vehicles.v2 Power: Amount: -30 ProvidesPrerequisite@buildingname: - Targetable: - TargetTypes: Ground, C4, DetonateAttack, Structure, SabInfiltrate, SpyInfiltrate - InfiltrateForSupportPower: + Targetable@INFILTRATION: + RequiresCondition: !being-warped + TargetTypes: VetInfiltrate, StealTechInfiltrate + InfiltrateToCreateProxyActor: Proxy: vehicles.upgraded - Types: SpyInfiltrate - InfiltrateForSupportPowerCA@STOLENTECH: - Types: SabInfiltrate + Types: VetInfiltrate + InfiltrationNotification: BuildingInfiltrated + InfiltratedNotification: BaseAttack + PlayerExperience: 15 + InfiltrateToCreateProxyActor@STOLENTECH: + Types: StealTechInfiltrate Proxy: stolentech.weap + InfiltrationNotification: TechnologyAcquired + InfiltratedNotification: OurTechnologyStolen + UseTargetFaction: true + PlayerExperience: 15 + SpawnActorOnMindControlled@STOLENTECH: + Actor: stolentech.weap + OwnerType: Master -ActorPreviewPlaceBuildingPreview: SequencePlaceBuildingPreview: Sequence: place - SequencePalette: placebuilding + GrantExternalConditionToProduced@DRONEEXIT: + Condition: radarenabled + Duration: 100 + Encyclopedia: + Category: Allies/Buildings; Soviets/Buildings FACT: Inherits: ^Building - Inherits@PRIMARY: ^PrimaryBuilding Inherits@BOTI: ^BotFallbackInsurance + Inherits@BLD: ^ProducesBuildings Selectable: - Bounds: 72,72 + Bounds: 3072, 3072 Building: Footprint: xxX xxx XxX === Dimensions: 3,4 LocalCenterOffset: 0,-512,0 Buildable: - Queue: Building + Queue: BuildingSQ, BuildingMQ BuildPaletteOrder: 1000 Prerequisites: ~disabled Description: Produces structures. + TracksCapturedFaction: ValidFactions: - Factions: england, france, germany, russia, ukraine, iraq + Factions: allies, england, france, germany, usa, soviet, russia, ukraine, iraq, yuri ProvidesPrerequisite@ra: Prerequisite: structures.ra ProvidesPrerequisiteValidatedFaction@allies: - Factions: england, france, germany + Factions: allies, england, france, germany, usa Prerequisite: structures.allies ProvidesPrerequisiteValidatedFaction@england: Factions: england @@ -1325,8 +1338,11 @@ FACT: ProvidesPrerequisiteValidatedFaction@germany: Factions: germany Prerequisite: structures.germany + ProvidesPrerequisiteValidatedFaction@usa: + Factions: usa + Prerequisite: structures.usa ProvidesPrerequisiteValidatedFaction@soviet: - Factions: russia, ukraine, iraq + Factions: soviet, russia, ukraine, iraq, yuri Prerequisite: structures.soviet ProvidesPrerequisiteValidatedFaction@russia: Factions: russia @@ -1343,20 +1359,22 @@ FACT: ProvidesPrerequisite@wall: Prerequisite: structures.wall ProvidesPrerequisiteValidatedFaction@sandbag: - Factions: england, france, germany + Factions: allies, england, france, germany, usa Prerequisite: structures.sandbag ProvidesPrerequisiteValidatedFaction@apwr: - Factions: england, france, germany, ukraine, iraq + Factions: allies, england, france, germany, usa, soviet, ukraine, iraq, yuri Prerequisite: structures.apwr ProvidesPrerequisiteValidatedFaction@pbox: - Factions: france, germany + Factions: allies, france, germany, usa Prerequisite: structures.pbox ProvidesPrerequisiteValidatedFaction@pris: - Factions: england, germany + Factions: allies, england, germany, usa Prerequisite: structures.pris ProvidesPrerequisiteValidatedFaction@ftur: - Factions: russia, ukraine + Factions: soviet, russia, ukraine, yuri Prerequisite: structures.ftur + ProvidesPrerequisite@anyconyard: + Prerequisite: anyconyard Health: HP: 150000 Armor: @@ -1367,11 +1385,8 @@ FACT: RevealGeneratedShroud: False RevealsShroud@GAPGEN: Range: 4c0 - Production: - Produces: Building, Defense - PauseOnCondition: forceshield || invulnerability || being-warped Valued: - Cost: 2500 + Cost: 3000 Tooltip: Name: Construction Yard BaseBuilding: @@ -1400,14 +1415,17 @@ FACT: GrantConditionOnPrerequisite@GLOBALFACTUNDEPLOY: Condition: factundeploy Prerequisites: global-factundeploy - ProductionBar@Building: - ProductionType: Building - ProductionBar@Defense: - ProductionType: Defense - Color: 8A8A8A BaseProvider: - PauseOnCondition: being-captured Range: 16c0 + PauseOnCondition: being-captured + RequiresCondition: !defense-policy + BaseProvider@DefensePolicy: + Range: 20c0 + PauseOnCondition: being-captured + RequiresCondition: defense-policy + GrantConditionOnPrerequisite@DefensePolicy: + Condition: defense-policy + Prerequisites: defense.policy WithBuildingBib: WithBuildingPlacedAnimation: RequiresCondition: !build-incomplete && !chrono-vortex @@ -1428,17 +1446,25 @@ FACT: Damage: 950 TransferTimedExternalConditionOnTransform: Condition: invulnerability - SpawnActorsOnSell: + TransferTimedExternalConditionOnTransform@INVIS: + Condition: invisibility + SpawnActorsOnSellCA: ActorTypes: e1,e1,e1,e1,e6 + -UpdatesBuildOrder: + Encyclopedia: + Category: Allies/Buildings; Soviets/Buildings PROC: Inherits: ^Building - Inherits@BOTINCOME: ^BotIncome + Inherits@Refinery: ^Refinery + Inherits@ResourceDrainable: ^ResourceDrainable + Inherits@EconomyPolicyDiscount: ^EconomyPolicyDiscount + Inherits@EconomyPolicyTimeReduction: ^EconomyPolicyTimeReduction Buildable: - Queue: Building + Queue: BuildingSQ, BuildingMQ BuildPaletteOrder: 60 - Prerequisites: anypower, ~structures.ra, ~techlevel.infonly - Description: Processes raw Tiberium, Ore and Gems\ninto credits. + Prerequisites: anypower, ~structures.ra + Description: Processes raw Tiberium, Ore and Gems into credits. BuildDuration: 1400 Valued: Cost: 1800 @@ -1448,11 +1474,14 @@ PROC: Footprint: _X_ xxx X++ === Dimensions: 3,4 LocalCenterOffset: 0,-512,0 + Sellable: + RequiresCondition: !build-incomplete && !c4 && !being-captured && !being-warped && !hacked && !resourcedrain Selectable: - Bounds: 72,50,0,4 - DecorationBounds: 72,70,0,-2 - Targetable: - TargetTypes: Ground, Structure, C4, DetonateAttack, ThiefInfiltrate + Bounds: 3072, 2512, 0, 256 + DecorationBounds: 3072, 2986, 0, -85 + Targetable@INFILTRATION: + RequiresCondition: !being-warped + TargetTypes: StealCreditsInfiltrate Health: HP: 90000 Armor: @@ -1464,9 +1493,13 @@ PROC: RevealsShroud@GAPGEN: Range: 4c0 Refinery: + DockHost: + Type: Unload DockAngle: 256 - DockOffset: 1,2 - StoresResources: + DockOffset: 0, 1c0, 0 + MaxQueueLength: 12 + RequiresCondition: !being-warped + StoresPlayerResourcesCA: Capacity: 2000 WithResourceStoragePipsDecoration: Position: BottomLeft @@ -1502,8 +1535,9 @@ PROC: RequiresCondition: spawn-charv && !spawn-harv && !build-incomplete InfiltrateForCash: Percentage: 50 - Types: ThiefInfiltrate + Types: StealCreditsInfiltrate InfiltrationNotification: CreditsStolen + PlayerExperience: 15 WithBuildingBib: WithIdleOverlay@TOP: RequiresCondition: !build-incomplete @@ -1533,22 +1567,23 @@ PROC: -ActorPreviewPlaceBuildingPreview: SequencePlaceBuildingPreview: Sequence: idle - SequencePalette: placebuilding CashHackable: + UpdatesCount@ScrinAllegiance: + Type: ScrinAllegiance + Encyclopedia: + Category: Allies/Buildings; Soviets/Buildings SILO: Inherits: ^Building Selectable: - Bounds: 24,24 + Bounds: 1024, 1024 Buildable: - Queue: Defense + Queue: DefenseSQ, DefenseMQ BuildPaletteOrder: 35 - Prerequisites: anyrefinery, ~structures.ra, ~techlevel.infonly - Description: Stores excess refined\nTiberium, Ore and Gems. + Prerequisites: anyrefinery, ~structures.ra + Description: Stores processed Tiberium, Ore and Gems. Valued: Cost: 150 - Targetable: - TargetTypes: Ground, Structure, C4, DetonateAttack Tooltip: Name: Silo -GivesBuildableArea: @@ -1563,7 +1598,7 @@ SILO: -WithSpriteBody: WithResourceLevelSpriteBody: Sequence: stages - StoresResources: + StoresPlayerResourcesCA: Capacity: 3000 WithResourceStoragePipsDecoration: Position: BottomLeft @@ -1572,28 +1607,32 @@ SILO: PipCount: 5 FullSequence: pip-yellow -MustBeDestroyed: - -SpawnActorsOnSell: + -SpawnActorsOnSellCA: Power: Amount: -10 - Explodes: + FireWarheadsOnDeath: Weapon: SmallBuildingExplode EmptyWeapon: SmallBuildingExplode + -UpdatesBuildOrder: + Encyclopedia: + Category: Allies/Buildings; Soviets/Buildings HPAD: Inherits: ^Building - Inherits@PRIMARY: ^PrimaryBuilding Inherits@SHAPE: ^2x2Shape Inherits@AIRCRAFTREPAIR: ^RepairsAircraftWithRepairBay - Selectable: - Bounds: 48,48 + Inherits@AIR: ^ProducesHelicopters + Inherits@SOVIETBOMBINGPOWERS: ^SovietBombingPowers + Inherits@STRAFINGRUNPOWER: ^StrafingRunPower + Inherits@InfiltrateForSupportPower: ^InfiltrateForSupportPower HitShape: UseTargetableCellsOffsets: false TargetableOffsets: 0,0,0, 768,-512,0, 768,512,0, -281,-512,0, -630,512,0 Buildable: - Queue: Building + Queue: BuildingSQ, BuildingMQ BuildPaletteOrder: 120 - Prerequisites: anyradar, ~structures.ra, ~techlevel.infonly - Description: Produces and reloads helicopters. + Prerequisites: radarorrepair, ~structures.allies, ~techlevel.medium + Description: Produces and reloads helicopters and VTOL aircraft. Valued: Cost: 500 Tooltip: @@ -1621,58 +1660,86 @@ HPAD: ExitCell: 0,0 Facing: 896 RallyPoint: - Production: - Produces: Aircraft, Helicopter - PauseOnCondition: forceshield || invulnerability || being-warped Reservable: - ProductionBar: - ProductionType: Aircraft Power: - Amount: -10 + Amount: -20 ValidFactions: - Factions: england, france, germany, russia, ukraine, iraq + Factions: allies, england, france, germany, usa, soviet, russia, ukraine, iraq, yuri ProvidesPrerequisiteValidatedFaction@allies: - Factions: england, france, germany + Factions: allies, england, france, germany, usa Prerequisite: aircraft.allies + ProvidesPrerequisiteValidatedFaction@usa: + Factions: usa + Prerequisite: aircraft.usa ProvidesPrerequisiteValidatedFaction@soviets: - Factions: russia, ukraine, iraq, yuri + Factions: soviet, russia, ukraine, iraq, yuri Prerequisite: aircraft.soviet + ProvidesPrerequisiteValidatedFaction@russia: + Factions: russia + Prerequisite: aircraft.russia + ProvidesPrerequisiteValidatedFaction@ukraine: + Factions: ukraine + Prerequisite: aircraft.ukraine ProvidesPrerequisiteValidatedFaction@iraq: Factions: iraq Prerequisite: aircraft.iraq - ProvidesPrerequisite@all: - Prerequisite: aircraft.all - ProvidesPrerequisite@chinook: + ProvidesPrerequisiteValidatedFaction@yuri: + Factions: yuri + Prerequisite: aircraft.yuri + ProvidesPrerequisiteValidatedFaction@kiro: + Factions: soviet, russia, ukraine, iraq + Prerequisite: aircraft.kiro + ProvidesPrerequisiteValidatedFaction@chinookvisible: + Factions: allies, england, france, germany + Prerequisite: aircraft.chinookvisible + ProvidesPrerequisiteValidatedFaction@chinook: + Factions: allies, england, france, germany Prerequisite: aircraft.chinook - ProvidesPrerequisiteValidatedFaction@hind: - Factions: russia, ukraine, yuri - Prerequisite: aircraft.hind + ProvidesPrerequisiteValidatedFaction@nhaw: + Factions: usa + Prerequisite: aircraft.nhaw ProvidesPrerequisite@buildingname: - Targetable: - TargetTypes: Ground, C4, DetonateAttack, Structure, SpyInfiltrate - InfiltrateForSupportPower: - Types: SpyInfiltrate - Proxy: powerproxy.paratroopers2 + ProvidesPrerequisite@RadarOrAircraft: + Prerequisite: radaroraircraft + Targetable@INFILTRATION: + RequiresCondition: !being-warped + TargetTypes: StealTechInfiltrate + InfiltrateToCreateProxyActor@SpySupportPower: + Proxy: powerproxy.paratroopers.allies + InfiltrateToCreateProxyActor@STOLENTECH: + Types: StealTechInfiltrate + Proxy: stolentech.hpad + InfiltrationNotification: TechnologyAcquired + InfiltratedNotification: OurTechnologyStolen + UseTargetFaction: true + PlayerExperience: 15 + SpawnActorOnMindControlled@STOLENTECH: + Actor: stolentech.hpad + OwnerType: Master + Encyclopedia: + Category: Allies/Buildings AFLD: Inherits: ^Building - Inherits@PRIMARY: ^PrimaryBuilding Inherits@SHAPE: ^3x2Shape Inherits@AIRCRAFTREPAIR: ^RepairsAircraftWithRepairBay + Inherits@AIR: ^ProducesAircraft + Inherits@SOVIETBOMBINGPOWERS: ^SovietBombingPowers + Inherits@InfiltrateForSupportPower: ^InfiltrateForSupportPower HitShape: UseTargetableCellsOffsets: false TargetableOffsets: 0,0,0, 420,0,0, 420,-1024,0, 420,1024,0, -777,0,0, -777,-1024,0, -777,1024,0 Buildable: - Queue: Building + Queue: BuildingSQ, BuildingMQ BuildPaletteOrder: 130 - Prerequisites: anyradar, ~structures.soviet, ~techlevel.low - Description: Produces and reloads aircraft.\n Special Ability: Spy Plane\n Special Ability: Paratroopers + Prerequisites: radarorrepair, ~structures.soviet, ~techlevel.medium + Description: Produces and reloads aircraft. Valued: Cost: 500 Tooltip: Name: Airfield Selectable: - Bounds: 72,48 + Bounds: 3072, 2176, 0, -256 Building: Footprint: xxx xxx Dimensions: 3,2 @@ -1691,195 +1758,50 @@ AFLD: ExitCell: 1,1 Facing: 768 RallyPoint: - Production: - Produces: Aircraft, Plane - PauseOnCondition: forceshield || invulnerability || being-warped Reservable: + ValidFactions: + Factions: soviet, russia, ukraine, iraq, yuri ProvidesPrerequisite@soviet: - Factions: russia, ukraine, iraq, yuri Prerequisite: aircraft.soviet - ProvidesPrerequisite@russia: + ProvidesPrerequisiteValidatedFaction@russia: Factions: russia Prerequisite: aircraft.russia - ProvidesPrerequisite@ukraine: + ProvidesPrerequisiteValidatedFaction@ukraine: Factions: ukraine Prerequisite: aircraft.ukraine - ProvidesPrerequisite@iraq: + ProvidesPrerequisiteValidatedFaction@iraq: Factions: iraq Prerequisite: aircraft.iraq - ProvidesPrerequisite@yuri: + ProvidesPrerequisiteValidatedFaction@yuri: Factions: yuri Prerequisite: aircraft.yuri - ProvidesPrerequisite@paratroopers: - Factions: ukraine, iraq - Prerequisite: support.paratroopers - ProvidesPrerequisite@parabombs: - Factions: russia, yuri - Prerequisite: support.parabombs - AirstrikePower@spyplane: - OrderName: spyplane - Icon: spyplane - ChargeInterval: 3000 - Description: Spy Plane - LongDesc: Reveals an area of the map. - SelectTargetSpeechNotification: SelectTarget - EndChargeSpeechNotification: SpyPlaneReady - LaunchSound: spyplane.aud - CameraActor: camera.spyplane - CameraRemoveDelay: 150 - UnitType: u2 - QuantizedFacings: 8 - DisplayBeacon: true - BeaconPoster: camicon - ArrowSequence: arrow - ClockSequence: clock - CircleSequence: circles - ParatroopersPower@paratroopers: - OrderName: paratroopers - Prerequisites: ~support.paratroopers, ~techlevel.low - Icon: paratroopers - ChargeInterval: 7500 - Description: Paratroopers - LongDesc: A Badger drops a squad of infantry\nanywhere on the map. - SquadSize: 1 - SquadOffset: 0,1792,0 - DropItems: E1,E1,E2,E3,E3,E1,E1,E1 - ReinforcementsArrivedSpeechNotification: ReinforcementsArrived - SelectTargetSpeechNotification: SelectTarget - EndChargeSpeechNotification: Reinforce - AllowImpassableCells: false - QuantizedFacings: 8 - CameraActor: camera.paradrop - DisplayBeacon: true - BeaconPoster: pinficon - ArrowSequence: arrow - ClockSequence: clock - CircleSequence: circles - UseDirectionalTarget: True - DirectionArrowAnimation: paradirection - ParatroopersPower@Russianparatroopers: - OrderName: stormtroopers - Prerequisites: ~aircraft.russia, ~techlevel.high - Icon: stormtroopers - ChargeInterval: 9000 - Description: Storm-troopers - LongDesc: A Badger drops a squad of shock troops\nanywhere on the map. - SquadSize: 1 - SquadOffset: 0,1792,0 - DropItems: SHOK,SHOK,SHOK,SHOK,SHOK - ReinforcementsArrivedSpeechNotification: ReinforcementsArrived - SelectTargetSpeechNotification: SelectTarget - EndChargeSpeechNotification: Reinforce - AllowImpassableCells: false - QuantizedFacings: 8 - CameraActor: camera.paradrop - DisplayBeacon: true - BeaconPoster: pinficon - ArrowSequence: arrow - ClockSequence: clock - CircleSequence: circles - UseDirectionalTarget: True - DirectionArrowAnimation: paradirection - AirstrikePower@Russianparabombs: - OrderName: parabombs - Prerequisites: ~support.parabombs, ~techlevel.unrestricted - Icon: parabombs - ChargeInterval: 7500 - Description: Parabombs - LongDesc: A Badger bomber drops parachuted\nbombs on your target. - SelectTargetSpeechNotification: SelectTarget - CameraActor: camera - CameraRemoveDelay: 150 - UnitType: badr.bomber - QuantizedFacings: 8 - DisplayBeacon: true - BeaconPoster: pbmbicon - SquadSize: 1 - SquadOffset: 0,1792,0 - ArrowSequence: arrow - ClockSequence: clock - CircleSequence: circles - UseDirectionalTarget: True - DirectionArrowAnimation: paradirection - AirstrikePower@CarpetBomb: - OrderName: carpetbomb - Prerequisites: ~aircraft.ukraine, ~techlevel.unrestricted - Icon: carpetbomb - ChargeInterval: 10500 - Description: Carpet Bomb - LongDesc: A squad of Badgers drop\nbombs on your target. - SelectTargetSpeechNotification: SelectTarget - CameraActor: camera - CameraRemoveDelay: 150 - UnitType: badr.cbomber - QuantizedFacings: 8 - DisplayBeacon: true - BeaconPoster: a10airstrike - BeaconPosterPalette: temptd - SquadSize: 3 - ArrowSequence: arrow - ClockSequence: clockTD - CircleSequence: circles - UseDirectionalTarget: True - DirectionArrowAnimation: paradirection - AirstrikePower@Iraqiparabombs: - OrderName: atombomb - Prerequisites: ~aircraft.iraq, ~techlevel.unrestricted - Icon: abombair - ChargeInterval: 10500 - Description: Atomic Bomb - LongDesc: A Badger bomber drops an \natom bomb on your target. - SelectTargetSpeechNotification: SelectTarget - CameraActor: camera - CameraRemoveDelay: 150 - UnitType: badr.nbomber - QuantizedFacings: 8 - DisplayBeacon: true - BeaconPoster: nukeicon - SquadSize: 1 - SquadOffset: 0,1792,0 - ArrowSequence: arrow - ClockSequence: clock - CircleSequence: circles - UseDirectionalTarget: True - DirectionArrowAnimation: paradirection - AirstrikePower@MutaBomb: - OrderName: mutabomb - Prerequisites: ~aircraft.yuri, ~techlevel.unrestricted - Icon: mutabomb - IconPalette: scrin - ChargeInterval: 10500 - Description: Genetic Mutation Bomb - LongDesc: A Badger bomber drops a\ngenetic mutation on your target.\nTransforms infantry into Brutes. - SelectTargetSpeechNotification: SelectTarget - CameraActor: camera - CameraRemoveDelay: 150 - UnitType: badr.mbomber - QuantizedFacings: 8 - DisplayBeacon: true - BeaconPoster: gmutation - BeaconPosterPalette: chromes - SquadSize: 1 - SquadOffset: 0,1792,0 - ArrowSequence: arrow - ClockSequence: clock - CircleSequence: circles - UseDirectionalTarget: True - DirectionArrowAnimation: paradirection - ProductionBar: - ProductionType: Aircraft + ProvidesPrerequisiteValidatedFaction@kiro: + Factions: soviet, russia, ukraine, iraq + Prerequisite: aircraft.kiro + ProvidesPrerequisite@buildingname: + ProvidesPrerequisite@RadarOrAircraft: + Prerequisite: radaroraircraft SupportPowerChargeBar: Power: Amount: -20 - ProvidesPrerequisite@buildingname: - Prerequisite: afld - Targetable: - TargetTypes: Ground, C4, DetonateAttack, Structure, SpyInfiltrate - InfiltrateForSupportPower: + Targetable@INFILTRATION: + RequiresCondition: !being-warped + TargetTypes: StealTechInfiltrate + InfiltrateToCreateProxyActor@SpySupportPower: Proxy: powerproxy.airstrike - Types: SpyInfiltrate + InfiltrateToCreateProxyActor@STOLENTECH: + Types: StealTechInfiltrate + Proxy: stolentech.afld + InfiltrationNotification: TechnologyAcquired + InfiltratedNotification: OurTechnologyStolen + PlayerExperience: 15 + SpawnActorOnMindControlled@STOLENTECH: + Actor: stolentech.afld + OwnerType: Master WithResupplyAnimation: RequiresCondition: !build-incomplete + Encyclopedia: + Category: Soviets/Buildings POWR: Inherits: ^Building @@ -1888,20 +1810,20 @@ POWR: Inherits@POWERDRAIN: ^PowerDrainable Inherits@OVERLOAD: ^HackableOverloadable Selectable: - Bounds: 48,48 + Bounds: 2048, 2048 HitShape: UseTargetableCellsOffsets: false TargetableOffsets: 0,0,0, 640,-384,0, 640,512,0, -710,-512,0, -710,512,0 Buildable: - Queue: Building + Queue: BuildingSQ, BuildingMQ BuildPaletteOrder: 10 - Prerequisites: ~techlevel.infonly, ~structures.ra + Prerequisites: ~structures.ra Description: Provides power for other structures. Valued: Cost: 300 Tooltip: Name: Power Plant - ProvidesPrerequisite: + ProvidesPrerequisite@anypower: Prerequisite: anypower Building: Footprint: xx xx == @@ -1916,14 +1838,16 @@ POWR: WithBuildingBib: Power: Amount: 100 - Targetable: - TargetTypes: Ground, Structure, C4, DetonateAttack, SpyInfiltrate, PowerInfiltrate ScalePowerWithHealth: + Sellable: + RequiresCondition: !build-incomplete && !c4 && !being-captured && !being-warped && !hacked && !discpowerdrain WithDeathAnimation: DeathSequence: dead UseDeathTypeSuffix: false - InfiltrateForPowerOutage: - Types: SpyInfiltrate, PowerInfiltrate + UpdatesBuildOrder: + Limit: 2 + Encyclopedia: + Category: Allies/Buildings; Soviets/Buildings APWR: Inherits: ^Building @@ -1934,23 +1858,23 @@ APWR: HitShape: TargetableOffsets: -355,-1024,0 Buildable: - Queue: Building + Queue: BuildingSQ, BuildingMQ BuildPaletteOrder: 110 - Prerequisites: anyradar, ~techlevel.medium, ~structures.apwr - Description: Provides double the power of\na standard Power Plant. + Prerequisites: anyradar, ~structures.apwr, ~techlevel.medium + Description: Provides double the power of a standard Power Plant. Valued: Cost: 500 Tooltip: Name: Advanced Power Plant - ProvidesPrerequisite: + ProvidesPrerequisite@anypower: Prerequisite: anypower Building: Footprint: xxx Xxx === Dimensions: 3,3 LocalCenterOffset: 0,-512,0 Selectable: - Bounds: 72,48 - DecorationBounds: 72,68,0,-10 + Bounds: 3072, 2048 + DecorationBounds: 3072, 2901, 0, -426 Health: HP: 70000 Armor: @@ -1960,20 +1884,107 @@ APWR: WithBuildingBib: Power: Amount: 200 - Targetable: - TargetTypes: Ground, Structure, C4, DetonateAttack, SpyInfiltrate, PowerInfiltrate ScalePowerWithHealth: + Sellable: + RequiresCondition: !build-incomplete && !c4 && !being-captured && !being-warped && !hacked && !discpowerdrain + WithDeathAnimation: + DeathSequence: dead + UseDeathTypeSuffix: false + UpdatesBuildOrder: + Limit: 1 + Encyclopedia: + Category: Allies/Buildings; Soviets/Buildings + +NPWR: + Inherits: ^Building + Inherits@POWER_OUTAGE: ^DisabledByPowerOutage + Inherits@SHAPE: ^3x2Shape + Inherits@POWERDRAIN: ^PowerDrainable + Inherits@OVERLOAD: ^HackableOverloadable + Inherits@UPG: ^ProducesUpgrades + Inherits@ATOMICAMMO: ^AtomicAmmoPower + HitShape: + TargetableOffsets: -355,-1024,0 + Type: Rectangle + TopLeft: -1792, -1280 + BottomRight: 1792, 1024 + Buildable: + Queue: BuildingSQ, BuildingMQ + BuildPaletteOrder: 165 + Prerequisites: stek, ~structures.soviet, ~techlevel.high + Description: Provides ten times the power of a standard Power Plant. + TooltipExtras: + Weaknesses: • Explodes when destroyed + Valued: + Cost: 1000 + Tooltip: + Name: Atomic Reactor + ProvidesPrerequisite@anypower: + Prerequisite: anypower + Building: + Footprint: xxxx Xxxx ==== + Dimensions: 4,3 + LocalCenterOffset: 0,-512,0 + Selectable: + Bounds: 4096,3072 + DecorationBounds: 4096,3926,0,-427 + Health: + HP: 110000 + Armor: + Type: Wood + RevealsShroud: + Range: 5c0 + WithBuildingBib: + Power: + Amount: 1000 + ScalePowerWithHealth: + Sellable: + RequiresCondition: !build-incomplete && !c4 && !being-captured && !being-warped && !hacked && !discpowerdrain WithDeathAnimation: DeathSequence: dead UseDeathTypeSuffix: false - InfiltrateForPowerOutage: - Types: SpyInfiltrate, PowerInfiltrate + WithIdleOverlay@SMOKE1: + Offset: 3400,-1400,0 + Image: smokestack + Sequence: idle1 + Palette: effect-ignore-lighting-alpha50 + RequiresCondition: !(empdisable || being-warped || build-incomplete) + WithIdleOverlay@SMOKE2: + Offset: 2600,1300,0 + Image: smokestack + Sequence: idle2 + Palette: effect-ignore-lighting-alpha50 + RequiresCondition: !(empdisable || being-warped || build-incomplete) + WithIdleOverlay@SMOKE3: + Offset: 4800,600,0 + Image: smokestack + Sequence: idle3 + Palette: effect-ignore-lighting-alpha50 + RequiresCondition: !(empdisable || being-warped || build-incomplete) + FireWarheadsOnDeath: + Type: CenterPosition + Weapon: CrateNuke + EmptyWeapon: CrateNuke + ProvidesPrerequisite@buildingname: + ValidFactions: + Factions: soviet, russia, ukraine, iraq, yuri + ProvidesPrerequisiteValidatedFaction@iraq: + Factions: iraq + Prerequisite: npwr.iraq + SupportPowerChargeBar: + Encyclopedia: + Category: Soviets/Buildings + Scale: 1.3 TPWR: + Inherits@AUTOTARGET: ^AutoTargetGround Inherits: APWR Buildable: Prerequisites: anyradar, ~techlevel.medium, ~structures.russia - Description: Provides double the power of\na standard Power Plant.\n Special Ability: Overload (Toggle)\n Warning: Unstable when damaged and overloaded. + Description: Provides triple the power of a standard Power Plant. + TooltipExtras: + Strengths: • Power output unaffected by damage + Weaknesses: • Unstable when damaged Valued: Cost: 600 Tooltip: @@ -1981,78 +1992,54 @@ TPWR: WithIdleOverlay@POWER: Offset: -20,-70,0 Sequence: power - RequiresCondition: overcharge && !(empdisable || being-warped || build-incomplete) - GrantTimedCondition@LOCKOUT: - Duration: 1500 - Condition: lockout - RequiresCondition: overcharge - GrantTimedCondition@COOLDOWN: - Duration: 250 - Condition: cooldown - RequiresCondition: !overcharge - TimedConditionBar@LOCKOUT: - Condition: lockout - Color: FF0000 - TimedConditionBar@COOLDOWN: - Condition: cooldown - Color: FFFF0080 - GrantConditionOnDeploy@OVERCHARGE: - DeploySounds: btesat1a.aud - UndeploySounds: btesat1a.aud - DeployedCondition: overcharge - PauseOnCondition: lockout || cooldown - SkipMakeAnimation: true - RequiresCondition: !(empdisable || being-warped || build-incomplete) && !(owned-by-brutal-ai || owned-by-hard-ai || owned-by-normal-ai || owned-by-easy-ai || owned-by-naval-ai) + RequiresCondition: !(empdisable || being-warped || build-incomplete) GrantConditionOnDamageState@VOLATILE: Condition: volatile - ValidDamageStates: Heavy, Critical - GrantConditionOnDamageState@CRITICAL: - Condition: critical ValidDamageStates: Critical - PowerMultiplier: - Modifier: 200 - RequiresCondition: overcharge + AttackOmni: PeriodicExplosion: Weapon: TPWRZap - RequiresCondition: overcharge && volatile + RequiresCondition: volatile SoundOnDamageTransition: DamagedSounds: bpowdiea.aud DestroyedSounds: bpowdieb.aud - GrantPeriodicCondition@BOTHELPER: - Condition: overcharge - CooldownDuration: 300 - ActiveDuration: 900 - StartsGranted: false - ShowSelectionBar: false - ActiveColor: 0080FF60 - CooldownColor: FFFF0080 - RequiresCondition: !critical && (owned-by-brutal-ai || owned-by-hard-ai || owned-by-normal-ai || owned-by-easy-ai || owned-by-naval-ai) + Power: + Amount: 300 + -ScalePowerWithHealth: + UpdatesBuildOrder: + Limit: 1 + Encyclopedia: + Category: Soviets/Buildings + EncyclopediaExtras: + Subfaction: russia STEK: Inherits: ^Building Inherits@IDISABLE: ^DisableOnLowPowerOrForceDisabled Inherits@SHAPE: ^3x2Shape + Inherits@UPG: ^ProducesUpgrades + Inherits@FORCESHIELDPOWER: ^ForceShieldPower + Inherits@TECHLOCKABLE: ^TechLockable + Inherits@ProductionOptimizer2: ^ProductionOptimizer2 Selectable: - Bounds: 72,48 + Bounds: 3072, 2048 HitShape: TargetableOffsets: 420,-768,0, 420,768,0, -770,-768,0, -770,768,0 Buildable: - Queue: Building + Queue: BuildingSQ, BuildingMQ BuildPaletteOrder: 150 Prerequisites: vehicles.any, anyradar, ~structures.soviet, ~techlevel.high Description: Provides Soviet advanced technologies. Valued: - Cost: 1500 + Cost: 1800 Tooltip: Name: Soviet Tech Center - ProvidesPrerequisite: - Prerequisite: techcenter Building: Footprint: XxX XxX === Dimensions: 3,3 LocalCenterOffset: 0,-512,0 Health: - HP: 80000 + HP: 110000 Armor: Type: Wood RevealsShroud: @@ -2063,66 +2050,48 @@ STEK: Range: 4c0 WithBuildingBib: Power: - Amount: -100 + Amount: -150 ProvidesPrerequisite@buildingname: - ProvidesPrerequisite: - Prerequisite: techcenter + RequiresCondition: !tech-locked + ProvidesPrerequisite@anytechcenter: + Prerequisite: techcenter.any + RequiresCondition: !tech-locked + ProvidesPrerequisite@TeslaCoilOrSovietTechCenter: + Prerequisite: tslaorstek + RequiresCondition: !tech-locked + ProvidesPrerequisite@ChemTowerOrSovietTechCenter: + Prerequisite: tturorstek + RequiresCondition: !tech-locked ValidFactions: - Factions: russia, ukraine, iraq, yuri + Factions: soviet, russia, ukraine, iraq, yuri ProvidesPrerequisiteValidatedFaction@russia: Factions: russia Prerequisite: stek.russia + RequiresCondition: !tech-locked ProvidesPrerequisiteValidatedFaction@ukraine: Factions: ukraine Prerequisite: stek.ukraine - GrantExternalConditionPowerCA@FSHIELD: - OrderName: fshield - Icon: forceshield - ChargeInterval: 7500 - Condition: forceshield - Dimensions: 7, 7 - Footprint: ___x___ __xxx__ _xxxxx_ xxxxxxx _xxxxx_ __xxx__ ___x___ - Duration: 250 - Prerequisites: forceshield.enabled, techlevel.high - Weapon: ForceShield - ActivationDelay: 5 - AirburstAltitude: 0c0 - AllowMultiple: false - Description: Force Shield - LongDesc: Makes selected friendly structures temporarily invulnerable.\n Warning: Causes power failure. - OnFireSound: forceon.aud - DisplayTimerRelationships: Ally - SelectTargetSpeechNotification: SelectTarget - InsufficientPowerSpeechNotification: InsufficientPower - EndChargeSpeechNotification: ForceShieldReady - DisplayRadarPing: True - Cursor: ability - PauseOnCondition: disabled || empdisable || being-warped - InfiltrateForSupportPower@STOLENTECH: - Types: SabInfiltrate - Proxy: stolentech.stek - Targetable: - TargetTypes: Ground, C4, DetonateAttack, Structure, SabInfiltrate - Production: - Produces: Upgrade - PauseOnCondition: forceshield || invulnerability || being-warped - ProductionBar: - ProductionType: Upgrade - Exit: + RequiresCondition: !tech-locked + ProvidesPrerequisiteValidatedFaction@iraq: + Factions: iraq + Prerequisite: stek.iraq + RequiresCondition: !tech-locked + Encyclopedia: + Category: Soviets/Buildings BARR: Inherits: ^Building - Inherits@PRIMARY: ^PrimaryBuilding Inherits@SHAPE: ^2x2Shape + Inherits@INF: ^ProducesInfantry Selectable: - Bounds: 48,48 + Bounds: 2048, 2048 HitShape: UseTargetableCellsOffsets: false TargetableOffsets: 0,0,0, 490,-470,0, 355,512,0, -355,-512,0, -630,512,0 Buildable: - Queue: Building + Queue: BuildingSQ, BuildingMQ BuildPaletteOrder: 30 - Prerequisites: anypower, ~structures.soviet, ~techlevel.infonly + Prerequisites: anypower, ~structures.soviet Description: Trains infantry. Valued: Cost: 500 @@ -2148,78 +2117,87 @@ BARR: RequiresCondition: !being-captured SpawnOffset: -170,810,0 ExitCell: 1,2 - ProductionTypes: Soldier, Infantry Exit@2: RequiresCondition: !being-captured SpawnOffset: -725,640,0 ExitCell: 0,2 - ProductionTypes: Soldier, Infantry Exit@3: RequiresCondition: !being-captured SpawnOffset: -170,810,0 ExitCell: -1,2 - ProductionTypes: Soldier, Infantry Priority: 0 Exit@4: RequiresCondition: !being-captured SpawnOffset: -725,640,0 ExitCell: 2,2 - ProductionTypes: Soldier, Infantry Priority: 0 - Production: - Produces: Infantry, Soldier - PauseOnCondition: forceshield || invulnerability || being-warped - GrantExternalConditionToProduced: - Condition: produced - ProductionBar: - ProductionType: Infantry + ValidFactions: + Factions: soviet, russia, ukraine, iraq, yuri ProvidesPrerequisite@infantryany: Prerequisite: infantry.any ProvidesPrerequisite@human: Prerequisite: infantry.human ProvidesPrerequisite@infantryra: Prerequisite: infantry.ra - ProvidesPrerequisite@russia: + ProvidesPrerequisiteValidatedFaction@russia: Factions: russia Prerequisite: infantry.russia - ProvidesPrerequisite@ukraine: + ProvidesPrerequisiteValidatedFaction@ukraine: Factions: ukraine Prerequisite: infantry.ukraine - ProvidesPrerequisite@iraq: + ProvidesPrerequisiteValidatedFaction@iraq: Factions: iraq Prerequisite: infantry.iraq - ProvidesPrerequisite@yuri: + ProvidesPrerequisiteValidatedFaction@yuri: Factions: yuri Prerequisite: infantry.yuri - ProvidesPrerequisite@e2: - Factions: russia, iraq + ProvidesPrerequisiteValidatedFaction@e2: + Factions: soviet, russia, iraq, yuri Prerequisite: infantry.e2 - ProvidesPrerequisite@thf: - Prerequisite: infantry.thf + ProvidesPrerequisite@dog: + Prerequisite: infantry.dog + ProvidesPrerequisiteValidatedFaction@boris: + Factions: soviet, russia, iraq, ukraine + Prerequisite: infantry.boris + ProvidesPrerequisiteValidatedFaction@shok: + Factions: soviet, russia, ukraine, yuri + Prerequisite: infantry.shok Power: Amount: -20 ProvidesPrerequisite@buildingname: - InfiltrateForSupportPower@spy: + InfiltrateToCreateProxyActor@spy: Proxy: barracks.upgraded - Types: SpyInfiltrate - InfiltrateForSupportPower@STOLENTECH: - Types: SabInfiltrate + Types: VetInfiltrate + InfiltrationNotification: BuildingInfiltrated + InfiltratedNotification: BaseAttack + PlayerExperience: 15 + InfiltrateToCreateProxyActor@STOLENTECH: + Types: StealTechInfiltrate Proxy: stolentech.barr - Targetable: - TargetTypes: Ground, C4, DetonateAttack, Structure, SabInfiltrate, SpyInfiltrate + InfiltrationNotification: TechnologyAcquired + InfiltratedNotification: OurTechnologyStolen + PlayerExperience: 15 + SpawnActorOnMindControlled@STOLENTECH: + Actor: stolentech.barr + OwnerType: Master + Targetable@INFILTRATION: + RequiresCondition: !being-warped + TargetTypes: VetInfiltrate, StealTechInfiltrate + Encyclopedia: + Category: Soviets/Buildings KENN: Inherits: ^Building - Inherits@PRIMARY: ^PrimaryBuilding + Inherits@DOG: ^ProducesDogs Selectable: - Bounds: 24,24 + Bounds: 1024, 1024 Buildable: - Queue: Building - BuildPaletteOrder: 175 - Prerequisites: anypower, ~structures.soviet, ~techlevel.infonly + Queue: BuildingSQ, BuildingMQ + BuildPaletteOrder: 205 + Prerequisites: anypower, ~structures.soviet Description: Trains Attack Dogs. Valued: - Cost: 200 + Cost: 150 Tooltip: Name: Kennel -GivesBuildableArea: @@ -2236,35 +2214,32 @@ KENN: RequiresCondition: !being-captured SpawnOffset: -280,400,0 ExitCell: 0,1 - ProductionTypes: Dog, Infantry Exit@2: RequiresCondition: !being-captured SpawnOffset: -280,400,0 ExitCell: -1,0 - ProductionTypes: Dog, Infantry - Production: - Produces: Infantry, Dog - PauseOnCondition: forceshield || invulnerability || being-warped - ProductionBar: - ProductionType: Infantry - -SpawnActorsOnSell: + ProvidesPrerequisite@dog: + Prerequisite: infantry.dog + -SpawnActorsOnSellCA: Power: Amount: -10 ProvidesPrerequisite@buildingname: + Encyclopedia: + Category: Soviets/Buildings TENT: Inherits: ^Building - Inherits@PRIMARY: ^PrimaryBuilding Inherits@SHAPE: ^2x2Shape + Inherits@INF: ^ProducesInfantry Selectable: - Bounds: 48,48 + Bounds: 2048, 2048 HitShape: UseTargetableCellsOffsets: false TargetableOffsets: 0,0,0, 630,-512,0, 355,512,0, -281,-512,0, -630,512,0 Buildable: - Queue: Building + Queue: BuildingSQ, BuildingMQ BuildPaletteOrder: 20 - Prerequisites: anypower, ~structures.allies, ~techlevel.infonly + Prerequisites: anypower, ~structures.allies Description: Trains infantry. Valued: Cost: 500 @@ -2290,48 +2265,40 @@ TENT: RequiresCondition: !being-captured SpawnOffset: -42,810,0 ExitCell: 1,2 - ProductionTypes: Soldier, Infantry Exit@2: RequiresCondition: !being-captured SpawnOffset: -725,640,0 ExitCell: 0,2 - ProductionTypes: Soldier, Infantry Exit@3: RequiresCondition: !being-captured SpawnOffset: -42,810,0 ExitCell: -1,2 - ProductionTypes: Soldier, Infantry Priority: 0 Exit@4: RequiresCondition: !being-captured SpawnOffset: -725,640,0 ExitCell: 2,2 - ProductionTypes: Soldier, Infantry Priority: 0 - Production: - Produces: Infantry, Soldier - PauseOnCondition: forceshield || invulnerability || being-warped - GrantExternalConditionToProduced: - Condition: produced - ProductionBar: - ProductionType: Infantry + ValidFactions: + Factions: allies, england, germany, france, usa ProvidesPrerequisite@infantryany: Prerequisite: infantry.any ProvidesPrerequisite@human: Prerequisite: infantry.human ProvidesPrerequisite@infantryra: Prerequisite: infantry.ra - ProvidesPrerequisite@england: + ProvidesPrerequisiteValidatedFaction@england: Factions: england Prerequisite: infantry.england - ProvidesPrerequisite@france: + ProvidesPrerequisiteValidatedFaction@france: Factions: france Prerequisite: infantry.france - ProvidesPrerequisite@germany: + ProvidesPrerequisiteValidatedFaction@germany: Factions: germany Prerequisite: infantry.germany - ProvidesPrerequisite@hazmat: - Prerequisite: infantry.hazmat + ProvidesPrerequisiteValidatedFaction@usa: + Factions: usa + Prerequisite: infantry.usa ProvidesPrerequisite@mech: Prerequisite: infantry.mech ProvidesPrerequisite@medi: @@ -2339,32 +2306,47 @@ TENT: Power: Amount: -20 ProvidesPrerequisite@buildingname: - InfiltrateForSupportPower@spy: + InfiltrateToCreateProxyActor@spy: Proxy: barracks.upgraded - Types: SpyInfiltrate - InfiltrateForSupportPower@STOLENTECH: - Types: SabInfiltrate + Types: VetInfiltrate + InfiltrationNotification: BuildingInfiltrated + InfiltratedNotification: BaseAttack + PlayerExperience: 15 + InfiltrateToCreateProxyActor@STOLENTECH: + Types: StealTechInfiltrate Proxy: stolentech.tent - Targetable: - TargetTypes: Ground, C4, DetonateAttack, Structure, SpyInfiltrate, SabInfiltrate + InfiltrationNotification: TechnologyAcquired + InfiltratedNotification: OurTechnologyStolen + PlayerExperience: 15 + SpawnActorOnMindControlled@STOLENTECH: + Actor: stolentech.tent + OwnerType: Master + Targetable@INFILTRATION: + RequiresCondition: !being-warped + TargetTypes: VetInfiltrate, StealTechInfiltrate + Encyclopedia: + Category: Allies/Buildings FIX: Inherits: ^Building + Inherits@ProductionOptimizer1: ^ProductionOptimizer1 Buildable: - Queue: Building + Queue: BuildingSQ, BuildingMQ BuildPaletteOrder: 100 - Prerequisites: vehicles.any, ~structures.ra, ~techlevel.medium - Description: Repairs vehicles for credits. + Prerequisites: vehicles.any, ~structures.ra, ~techlevel.low + Description: Repairs vehicles and aircraft. + TooltipExtras: + Attributes: • Nearby helipads/airfields will repair landed aircraft\n• Can retrofit existing units with upgrades Valued: - Cost: 1200 + Cost: 1000 Tooltip: Name: Service Depot Building: Footprint: _+_ +++ _+_ Dimensions: 3,3 Selectable: - Bounds: 68,34,0,3 - DecorationBounds: 72,48 + Bounds: 2901, 1450, 0, 128 + DecorationBounds: 3072, 2048 Health: HP: 80000 Armor: @@ -2382,9 +2364,17 @@ FIX: HpPerStep: 1000 Interval: 7 StartRepairingNotification: Repairing + StartRepairingTextNotification: Repairing. FinishRepairingNotification: UnitRepaired - PlayerExperience: 15 + FinishRepairingTextNotification: Unit repaired. RequiresCondition: !forceshield && !invulnerability && !being-warped + ProximityExternalCondition@UNITSELL: + Condition: unit-sellable + Range: 1c0 + GrantConditionOnResupplying@Resupplying: + Condition: resupplying + Sellable: + RequiresCondition: !resupplying && !build-incomplete && !c4 && !being-captured && !being-warped && !hacked WithBuildingBib: HasMinibib: true WithResupplyAnimation: @@ -2394,6 +2384,10 @@ FIX: ProvidesPrerequisite@buildingname: ProvidesPrerequisite@repair: Prerequisite: repair + ProvidesPrerequisite@radarorrepair: + Prerequisite: radarorrepair + ProvidesPrerequisite@allowsmcv: + Prerequisite: vehicles.mcv HitShape: TargetableOffsets: 840,0,0, 598,-640,0, 598,640,0, -1060,0,0, -768,-640,0, -768,640,0 Type: Polygon @@ -2402,16 +2396,21 @@ FIX: Condition: aircraft-repair Range: 10c0 WithRangeCircle@AIRCRAFTREPAIR: - Color: 888899AA + Type: AircraftRepair + Color: FFD000AA Range: 10c0 + Encyclopedia: + Category: Allies/Buildings; Soviets/Buildings SBAG: Inherits: ^Wall + RenderSprites: + Palette: player Buildable: - Queue: Defense + Queue: DefenseSQ, DefenseMQ BuildPaletteOrder: 10 - Prerequisites: ~structures.sandbag, ~techlevel.low - Description: Stops infantry and light vehicles.\n Can be crushed by tanks. + Prerequisites: ~structures.sandbag + Description: • Stops infantry and light vehicles\n• Can be crushed by tanks Valued: Cost: 30 CustomSellValue: @@ -2421,21 +2420,25 @@ SBAG: Health: HP: 15000 Armor: - Type: Wood + Type: Brick LineBuild: NodeTypes: sandbag LineBuildNode: Types: sandbag WithWallSpriteBody: Type: sandbag + Encyclopedia: + Category: Allies/Defenses; GDI/Defenses FENC: Inherits: ^Wall + RenderSprites: + Palette: player Buildable: - Queue: Defense + Queue: DefenseSQ, DefenseMQ BuildPaletteOrder: 20 - Prerequisites: ~structures.soviet, ~techlevel.low - Description: Stops infantry and light vehicles.\n Can be crushed by tanks. + Prerequisites: ~structures.soviet + Description: • Stops infantry and light vehicles\n• Can be crushed by tanks Valued: Cost: 30 CustomSellValue: @@ -2445,21 +2448,49 @@ FENC: Health: HP: 15000 Armor: - Type: Wood + Type: Brick LineBuild: NodeTypes: fence LineBuildNode: Types: fence WithWallSpriteBody: Type: fence + Encyclopedia: + Category: Soviets/Defenses + +CHAIN: + Inherits: ^Wall + Buildable: + Queue: DefenseSQ, DefenseMQ + BuildPaletteOrder: 20 + Prerequisites: ~structures.nod + Description: • Stops infantry and light vehicles\n• Can be crushed by tanks + Valued: + Cost: 30 + CustomSellValue: + Value: 0 + Tooltip: + Name: Chain-link Fence + Health: + HP: 15000 + Armor: + Type: Brick + LineBuild: + NodeTypes: chain + LineBuildNode: + Types: chain + WithWallSpriteBody: + Type: chain + Encyclopedia: + Category: Nod/Defenses BRIK: Inherits: ^Wall Buildable: - Queue: Defense + Queue: DefenseSQ, DefenseMQ BuildPaletteOrder: 30 - Prerequisites: anypower, ~structures.wall, ~techlevel.medium - Description: Stops units and blocks enemy fire. + Prerequisites: anypower, ~structures.wall + Description: • Stops units\n• Blocks enemy fire Valued: Cost: 200 CustomSellValue: @@ -2475,37 +2506,15 @@ BRIK: Type: Brick Crushable: CrushClasses: heavywall - BlocksProjectiles: LineBuild: NodeTypes: concrete LineBuildNode: Types: concrete WithWallSpriteBody: Type: concrete - -CHAIN: - Inherits: ^Wall - Buildable: - Queue: Defense - BuildPaletteOrder: 20 - Prerequisites: ~structures.nod, ~techlevel.low - Description: Stops infantry and light vehicles.\n Can be crushed by tanks. - Valued: - Cost: 30 - CustomSellValue: - Value: 0 - Tooltip: - Name: Chain-link Fence - Health: - HP: 30000 - Armor: - Type: Wood - LineBuild: - NodeTypes: chain - LineBuildNode: - Types: chain - WithWallSpriteBody: - Type: chain + BlocksProjectiles: + Encyclopedia: + Category: Allies/Defenses; Soviets/Defenses; GDI/Defenses; Nod/Defenses CYCL: Inherits: ^Wall @@ -2594,7 +2603,23 @@ VEHICLES.NOD: Buildable: Description: Vehicle Production -TECHCENTER: +AIRCRAFT.CHINOOK: + AlwaysVisible: + Interactable: + Tooltip: + Name: Helipad + Buildable: + Description: Helipad + +TECHCENTER.ANY: + AlwaysVisible: + Interactable: + Tooltip: + Name: Tech Center + Buildable: + Description: Tech Center + +TECHCENTER.TD: AlwaysVisible: Interactable: Tooltip: @@ -2634,37 +2659,84 @@ REPAIR: Buildable: Description: Service Depot/Repair Facility -INFANTRY.MEDI: +RADARORREPAIR: AlwaysVisible: Interactable: Tooltip: - Name: Barracks + Name: Radar or Service Depot/Repair Facility Buildable: - Description: Medical Barracks + Description: Radar or Service Depot/Repair Facility -INFANTRY.MECH: +RADARORAIRCRAFT: + AlwaysVisible: + Interactable: + Tooltip: + Name: Radar or Aircraft Production + Buildable: + Description: Radar or Aircraft Production + +TSLAORSTEK: + AlwaysVisible: + Interactable: + Tooltip: + Name: Tesla Coil or Soviet Tech Center + Buildable: + Description: Tesla Coil or Soviet Tech Center + +OBLIORTMPL: + AlwaysVisible: + Interactable: + Tooltip: + Name: Obelisk or Temple of Nod + Buildable: + Description: Obelisk or Temple of Nod + +TTURORSTEK: + AlwaysVisible: + Interactable: + Tooltip: + Name: Chem Tower or Soviet Tech Center + Buildable: + Description: Chem Tower or Soviet Tech Center + +FTURORRADAR: + AlwaysVisible: + Interactable: + Tooltip: + Name: Flame Tower or Radar + Buildable: + Description: Flame Tower or Radar + +VEHICLES.MCV: + AlwaysVisible: + Interactable: + Tooltip: + Name: Service Depot/Repair Facility OR no MCV/Conyard + Buildable: + Description: Service Depot/Repair Facility OR no MCV/Conyard + +INFANTRY.MEDI: AlwaysVisible: Interactable: Tooltip: Name: Barracks Buildable: - Description: Mechanical Barracks + Description: Barracks -STRUCTURES.TSLA: +INFANTRY.MECH: AlwaysVisible: Interactable: Tooltip: - GenericName: - Name: Tesla Coil + Name: Barracks Buildable: - Description: Tesla Coil + Description: Barracks PYLE: Inherits: ^BuildingTD - Inherits@PRIMARY: ^PrimaryBuilding Inherits@SHAPE: ^2x2Shape + Inherits@INF: ^ProducesInfantry Selectable: - Bounds: 48,48 + Bounds: 2048, 2048 HitShape: UseTargetableCellsOffsets: false TargetableOffsets: 0,0,0, 840,-256,0, 840,512,0, 210,-512,0, -71,512,0 @@ -2672,9 +2744,9 @@ PYLE: TopLeft: -1024, -1024 BottomRight: 1024, 640 Buildable: - Queue: Building + Queue: BuildingSQ, BuildingMQ BuildPaletteOrder: 20 - Prerequisites: anypower, ~structures.gdi, ~techlevel.low + Prerequisites: anypower, ~structures.gdi IconPalette: chrometd Description: Trains infantry. Valued: @@ -2701,47 +2773,38 @@ PYLE: RequiresCondition: !being-captured SpawnOffset: -170,810,0 ExitCell: 1,2 - ProductionTypes: Soldier, Infantry Exit@2: RequiresCondition: !being-captured SpawnOffset: -725,640,0 ExitCell: 0,2 - ProductionTypes: Soldier, Infantry Exit@3: RequiresCondition: !being-captured SpawnOffset: -170,810,0 ExitCell: -1,2 - ProductionTypes: Soldier, Infantry Priority: 0 Exit@4: RequiresCondition: !being-captured SpawnOffset: -725,640,0 ExitCell: 2,2 - ProductionTypes: Soldier, Infantry Priority: 0 - Production: - Produces: Infantry, Soldier - PauseOnCondition: forceshield || invulnerability || being-warped - ProductionBar: - ProductionType: Infantry + ValidFactions: + Factions: gdi, talon, zocom, eagle, arc ProvidesPrerequisite@infantryany: Prerequisite: infantry.any ProvidesPrerequisite@human: Prerequisite: infantry.human ProvidesPrerequisite@infantrytd: Prerequisite: infantry.td - ProvidesPrerequisite@hazmat: - Prerequisite: infantry.hazmat - ProvidesPrerequisite@talon: + ProvidesPrerequisiteValidatedFaction@talon: Factions: talon Prerequisite: infantry.talon - ProvidesPrerequisite@zocom: + ProvidesPrerequisiteValidatedFaction@zocom: Factions: zocom Prerequisite: infantry.zocom - ProvidesPrerequisite@eagle: + ProvidesPrerequisiteValidatedFaction@eagle: Factions: eagle Prerequisite: infantry.eagle - ProvidesPrerequisite@arc: + ProvidesPrerequisiteValidatedFaction@arc: Factions: arc Prerequisite: infantry.arc ProvidesPrerequisite@medi: @@ -2749,26 +2812,38 @@ PYLE: Power: Amount: -20 ProvidesPrerequisite@buildingname: - Targetable: - TargetTypes: Ground, C4, DetonateAttack, Structure, SabInfiltrate, SpyInfiltrate - InfiltrateForSupportPower@STOLENTECH: - Types: SabInfiltrate + Targetable@INFILTRATION: + RequiresCondition: !being-warped + TargetTypes: VetInfiltrate, StealTechInfiltrate + InfiltrateToCreateProxyActor@STOLENTECH: + Types: StealTechInfiltrate Proxy: stolentech.pyle - InfiltrateForSupportPower@spy: + InfiltrationNotification: TechnologyAcquired + InfiltratedNotification: OurTechnologyStolen + PlayerExperience: 15 + SpawnActorOnMindControlled@STOLENTECH: + Actor: stolentech.pyle + OwnerType: Master + InfiltrateToCreateProxyActor@spy: Proxy: barracks.upgraded - Types: SpyInfiltrate + Types: VetInfiltrate + InfiltrationNotification: BuildingInfiltrated + InfiltratedNotification: BaseAttack + PlayerExperience: 15 + Encyclopedia: + Category: GDI/Buildings HAND: Inherits: ^BuildingTD - Inherits@PRIMARY: ^PrimaryBuilding Inherits@SHAPE: ^2x2Shape + Inherits@INF: ^ProducesInfantry HitShape: UseTargetableCellsOffsets: false TargetableOffsets: 0,0,0, 630,-512,0, 355,512,0, -281,-512,0, -630,512,0 Buildable: - Queue: Building + Queue: BuildingSQ, BuildingMQ BuildPaletteOrder: 20 - Prerequisites: anypower, ~structures.nod, ~techlevel.low + Prerequisites: anypower, ~structures.nod IconPalette: chrometd Description: Trains infantry. Valued: @@ -2810,62 +2885,67 @@ HAND: SpawnOffset: 512,1024,0 ExitCell: 2,2 Priority: 0 - Production: - Produces: Infantry, Soldier, Cyborg - PauseOnCondition: forceshield || invulnerability || being-warped - ProductionBar: - ProductionType: Infantry - Targetable: - TargetTypes: Ground, C4, DetonateAttack, Structure, SabInfiltrate, SpyInfiltrate + Production@SQINF: + Produces: InfantrySQ, Soldier, Cyborg, ParadropInfantry + Targetable@INFILTRATION: + RequiresCondition: !being-warped + TargetTypes: VetInfiltrate, StealTechInfiltrate + ValidFactions: + Factions: nod, blackh, marked, legion, shadow ProvidesPrerequisite@infantryany: Prerequisite: infantry.any ProvidesPrerequisite@human: Prerequisite: infantry.human ProvidesPrerequisite@infantrytd: Prerequisite: infantry.td - ProvidesPrerequisite@hazmat: - Prerequisite: infantry.hazmat - ProvidesPrerequisite@blackh: + ProvidesPrerequisite@nod: + Prerequisite: infantry.nod + ProvidesPrerequisiteValidatedFaction@blackh: Factions: blackh Prerequisite: infantry.blackh - ProvidesPrerequisite@marked: + ProvidesPrerequisiteValidatedFaction@marked: Factions: marked Prerequisite: infantry.marked - ProvidesPrerequisite@legion: + ProvidesPrerequisiteValidatedFaction@legion: Factions: legion Prerequisite: infantry.legion - ProvidesPrerequisite@shadow: + ProvidesPrerequisiteValidatedFaction@shadow: Factions: shadow Prerequisite: infantry.shadow ProvidesPrerequisite@mech: Prerequisite: infantry.mech - ProvidesPrerequisite@cyborg: - Prerequisite: infantry.cyborg - InfiltrateForSupportPower@STOLENTECH: - Types: SabInfiltrate + InfiltrateToCreateProxyActor@STOLENTECH: + Types: StealTechInfiltrate Proxy: stolentech.hand + InfiltrationNotification: TechnologyAcquired + InfiltratedNotification: OurTechnologyStolen + PlayerExperience: 15 + SpawnActorOnMindControlled@STOLENTECH: + Actor: stolentech.hand + OwnerType: Master Power: Amount: -20 ProvidesPrerequisite@buildingname: - InfiltrateForSupportPower@spy: + InfiltrateToCreateProxyActor@spy: Proxy: barracks.upgraded - Types: SpyInfiltrate + Types: VetInfiltrate + InfiltrationNotification: BuildingInfiltrated + InfiltratedNotification: BaseAttack + PlayerExperience: 15 + Encyclopedia: + Category: Nod/Buildings WEAP.TD: Inherits: ^BuildingTD - Inherits@PRIMARY: ^PrimaryBuilding Inherits@SHAPE: ^3x2Shape + Inherits@NOMCV: ^UnlocksMcvIfNoneOwned + Inherits@VEH: ^ProducesVehicles RenderSprites: Image: awep Selectable: - Bounds: 72,72 - HitShape: - TargetableOffsets: 0,0,0, 0,1024,0, 0,-1024,0 - Type: Rectangle - TopLeft: -1536, -1024 - BottomRight: 1536, 512 + Bounds: 3072, 3072 Buildable: - Queue: Building + Queue: BuildingSQ, BuildingMQ BuildPaletteOrder: 80 Prerequisites: anyrefinery, ~structures.weap.td, ~structures.td, ~techlevel.low IconPalette: chrometd @@ -2888,8 +2968,9 @@ WEAP.TD: RevealGeneratedShroud: False RevealsShroud@GAPGEN: Range: 4c0 + TracksCapturedFaction: ValidFactions: - Factions: talon, zocom, eagle, arc, legion + Factions: gdi, talon, zocom, eagle, arc, nod, legion ProvidesPrerequisite@any: Prerequisite: vehicles.any ProvidesPrerequisite@human: @@ -2897,7 +2978,7 @@ WEAP.TD: ProvidesPrerequisite@td: Prerequisite: vehicles.td ProvidesPrerequisiteValidatedFaction@gdi: - Factions: talon, zocom, eagle, arc + Factions: gdi, talon, zocom, eagle, arc Prerequisite: vehicles.gdi ProvidesPrerequisiteValidatedFaction@talon: Factions: talon @@ -2912,39 +2993,33 @@ WEAP.TD: Factions: arc Prerequisite: vehicles.arc ProvidesPrerequisiteValidatedFaction@nod: - Factions: legion + Factions: nod, legion Prerequisite: vehicles.nod ProvidesPrerequisiteValidatedFaction@legion: Factions: legion Prerequisite: vehicles.legion ProvidesPrerequisiteValidatedFaction@hmmv: - Factions: talon, zocom, eagle + Factions: gdi, talon, zocom, eagle Prerequisite: vehicles.hmmv - ProvidesPrerequisiteValidatedFaction@nodarty: - Factions: legion - Prerequisite: vehicles.arty ProvidesPrerequisiteValidatedFaction@ftnk: Factions: legion Prerequisite: vehicles.ftnk ProvidesPrerequisite@apc2: Prerequisite: vehicles.apc2 ProvidesPrerequisiteValidatedFaction@mtnk: - Factions: talon, zocom, eagle, arc, legion + Factions: gdi, talon, zocom, eagle, arc, legion Prerequisite: vehicles.mtnk - ProvidesPrerequisiteValidatedFaction@memp: - Factions: talon, zocom, eagle, arc - Prerequisite: vehicles.memp ProvidesPrerequisiteValidatedFaction@msam: - Factions: talon, zocom, arc + Factions: gdi, talon, zocom, arc Prerequisite: vehicles.msam ProvidesPrerequisiteValidatedFaction@htnk: - Factions: zocom, eagle, arc + Factions: gdi, zocom, eagle, arc Prerequisite: vehicles.htnk ProvidesPrerequisiteValidatedFaction@mlrs: Factions: legion Prerequisite: vehicles.mlrs WithBuildingBib: - WithProductionDoorOverlay: + WithProductionDoorOverlayCA: RequiresCondition: !build-incomplete Sequence: build-top RallyPoint: @@ -2952,30 +3027,42 @@ WEAP.TD: RequiresCondition: !being-captured SpawnOffset: -341,-341,0 ExitCell: 0,2 - Production: - Produces: Vehicle - PauseOnCondition: forceshield || invulnerability || being-warped - Targetable: - TargetTypes: Ground, C4, DetonateAttack, Structure, SabInfiltrate, SpyInfiltrate - ProductionBar: - ProductionType: Vehicle + Targetable@INFILTRATION: + RequiresCondition: !being-warped + TargetTypes: VetInfiltrate, StealTechInfiltrate Power: Amount: -30 ProvidesPrerequisite@buildingname: - InfiltrateForSupportPower@spy: + InfiltrateToCreateProxyActor@spy: Proxy: vehicles.upgraded - Types: SpyInfiltrate - InfiltrateForSupportPower@STOLENTECH: - Types: SabInfiltrate + Types: VetInfiltrate + InfiltrationNotification: BuildingInfiltrated + InfiltratedNotification: BaseAttack + PlayerExperience: 15 + InfiltrateToCreateProxyActor@STOLENTECH: + Types: StealTechInfiltrate Proxy: stolentech.weap.td + InfiltrationNotification: TechnologyAcquired + InfiltratedNotification: OurTechnologyStolen + UseTargetFaction: true + PlayerExperience: 15 + SpawnActorOnMindControlled@STOLENTECH: + Actor: stolentech.weap.td + OwnerType: Master -ActorPreviewPlaceBuildingPreview: SequencePlaceBuildingPreview: Sequence: place - SequencePalette: placebuildingtd + GrantExternalConditionToProduced@DRONEEXIT: + Condition: radarenabled + Duration: 100 + Encyclopedia: + Category: GDI/Buildings; Nod/Buildings AIRS: Inherits: ^BuildingTD - Inherits@PRIMARY: ^PrimaryBuilding + Inherits@NOMCV: ^UnlocksMcvIfNoneOwned + Inherits@VEH: ^ProducesVehicles + Inherits@NODAIRDROPPOWERS: ^NodAirdropPowers RenderSprites: Image: astrip HitShape: @@ -2984,11 +3071,11 @@ AIRS: TopLeft: -2048, -1024 BottomRight: 2048, 1024 Buildable: - Queue: Building + Queue: BuildingSQ, BuildingMQ BuildPaletteOrder: 80 Prerequisites: anyrefinery, ~structures.airs, ~techlevel.low IconPalette: chrometd - Description: Provides a dropzone\nfor vehicle reinforcements + Description: Provides a dropzone for vehicle reinforcements Valued: Cost: 2000 Tooltip: @@ -2998,7 +3085,7 @@ AIRS: Dimensions: 4,3 LocalCenterOffset: 0,-512,0 Health: - HP: 220000 + HP: 200000 Armor: Type: Wood RevealsShroud: @@ -3015,15 +3102,27 @@ AIRS: Exit@1: SpawnOffset: -1024,0,0 ExitCell: 3,1 - ProductionAirdropCA: - Produces: Vehicle + -Production@SQVEH: + -Production@MQVEH: + ProductionAirdropCA@SQVEH: + Produces: VehicleSQ, ParadropVehicle + PauseOnCondition: forceshield || invulnerability || being-warped + ActorType: c17.cargo + ReadyAudio: ReinforcementsArrived + SpawnType: ClosestEdgeToDestination + ProportionalSpeed: true + RequiresCondition: !global-multiqueue + ProductionAirdropCA@MQVEH: + Produces: VehicleMQ, ParadropVehicle PauseOnCondition: forceshield || invulnerability || being-warped ActorType: c17.cargo ReadyAudio: ReinforcementsArrived SpawnType: ClosestEdgeToDestination ProportionalSpeed: true + RequiresCondition: global-multiqueue + TracksCapturedFaction: ValidFactions: - Factions: blackh, marked, shadow + Factions: nod, blackh, marked, shadow ProvidesPrerequisite@any: Prerequisite: vehicles.any ProvidesPrerequisite@human: @@ -3043,109 +3142,58 @@ AIRS: ProvidesPrerequisiteValidatedFaction@shadow: Factions: shadow Prerequisite: vehicles.shadow - ProvidesPrerequisiteValidatedFaction@nodarty: - Factions: blackh, marked, shadow - Prerequisite: vehicles.arty ProvidesPrerequisiteValidatedFaction@ftnk: - Factions: marked, legion, shadow + Factions: nod, marked, shadow Prerequisite: vehicles.ftnk ProvidesPrerequisiteValidatedFaction@mlrs: - Factions: blackh, marked + Factions: nod, blackh, marked Prerequisite: vehicles.mlrs - ProvidesPrerequisite@apc2: - Prerequisite: vehicles.apc2 - RequiresPrerequisites: inf.gdi.stolen - ProvidesPrerequisiteValidatedFaction@howiupgrade: - Factions: blackh - Prerequisite: howi.upgrade - ParatroopersPower@markedairdrop: - OrderName: markedairdrop - SquadSize: 3 - UnitType: c17 - Icon: airdropicon - ChargeInterval: 13500 - Description: Air Drop - LongDesc: Cargo Planes air drop tanks anywhere on the map. - DropItems: ltnk, ftnk, ltnk - SelectTargetSpeechNotification: SelectTarget - AllowImpassableCells: false - EndChargeSpeechNotification: Reinforce - LaunchSpeechNotification: ReinforcementsArrived - IncomingSpeechNotification: EnemyUnitsApproaching - CameraActor: camera.paradrop - DisplayBeacon: true - BeaconPoster: lrairdropicon - ArrowSequence: arrow - ClockSequence: clock - CircleSequence: circles - UseDirectionalTarget: True - DirectionArrowAnimation: paradirection - Prerequisites: vehicles.marked - ParatroopersPower@blackhairdrop: - OrderName: blackhairdrop - SquadSize: 2 - UnitType: c17 - Icon: airdropicon - ChargeInterval: 13500 - Description: Air Drop - LongDesc: Cargo Planes air drop flame tanks anywhere on the map. - DropItems: hftk, hftk - SelectTargetSpeechNotification: SelectTarget - AllowImpassableCells: false - EndChargeSpeechNotification: Reinforce - LaunchSpeechNotification: ReinforcementsArrived - IncomingSpeechNotification: EnemyUnitsApproaching - CameraActor: camera.paradrop - DisplayBeacon: true - BeaconPoster: lrairdropicon - ArrowSequence: arrow - ClockSequence: clock - CircleSequence: circles - UseDirectionalTarget: True - DirectionArrowAnimation: paradirection - Prerequisites: vehicles.blackh - ParatroopersPower@shadowairdrop: - OrderName: shadowairdrop - SquadSize: 2 - UnitType: c17 - Icon: airdropicon - ChargeInterval: 13500 - Description: Air Drop - LongDesc: Cargo Planes air drop stealth tanks anywhere on the map. - DropItems: stnk.nod, stnk.nod - SelectTargetSpeechNotification: SelectTarget - AllowImpassableCells: false - EndChargeSpeechNotification: Reinforce - LaunchSpeechNotification: ReinforcementsArrived - IncomingSpeechNotification: EnemyUnitsApproaching - CameraActor: camera.paradrop - DisplayBeacon: true - BeaconPoster: lrairdropicon - ArrowSequence: arrow - ClockSequence: clock - CircleSequence: circles - UseDirectionalTarget: True - DirectionArrowAnimation: paradirection - Prerequisites: vehicles.shadow WithDeliveryAnimation: - Targetable: - TargetTypes: Ground, C4, DetonateAttack, Structure, SabInfiltrate, SpyInfiltrate - ProductionBar: - ProductionType: Vehicle + Targetable@INFILTRATION: + RequiresCondition: !being-warped + TargetTypes: VetInfiltrate, StealTechInfiltrate Power: Amount: -30 - InfiltrateForSupportPower@STOLENTECH: - Types: SabInfiltrate + InfiltrateToCreateProxyActor@STOLENTECH: + Types: StealTechInfiltrate Proxy: stolentech.airs + InfiltrationNotification: TechnologyAcquired + InfiltratedNotification: OurTechnologyStolen + UseTargetFaction: true + PlayerExperience: 15 + SpawnActorOnMindControlled@STOLENTECH: + Actor: stolentech.airs + OwnerType: Master ProvidesPrerequisite@buildingname: - InfiltrateForSupportPower@spy: + InfiltrateToCreateProxyActor@spy: Proxy: vehicles.upgraded - Types: SpyInfiltrate - ProductionCostMultiplier@First: + Types: VetInfiltrate + InfiltrationNotification: BuildingInfiltrated + InfiltratedNotification: BaseAttack + PlayerExperience: 15 + ProductionCostMultiplier@FirstSQ: Multiplier: 90 - Prerequisites: !vehicles.any - -NUKE: + Prerequisites: !vehicles.any, global.singlequeue + ProductionCostMultiplier@MQF: + Multiplier: 90 + Prerequisites: global.multiqueuefull + ProductionCostMultiplier@MQS1: + Multiplier: 160 + Prerequisites: global.multiqueuescaled, vehicles.any, !optimized.production1, !optimized.production2 + ProductionCostMultiplier@MQS2: + Multiplier: 125 + Prerequisites: global.multiqueuescaled, vehicles.any, optimized.production1, !optimized.production2 + ProductionCostMultiplier@MQS3: + Multiplier: 90 + Prerequisites: global.multiqueuescaled, vehicles.any, optimized.production1, optimized.production2 + ProductionCostMultiplier@MQS4: + Multiplier: 90 + Prerequisites: global.multiqueuescaled, !vehicles.any + Encyclopedia: + Category: Nod/Buildings + Scale: 1.6 + +NUKE: Inherits: ^BuildingTD Inherits@POWER_OUTAGE: ^DisabledByPowerOutage Inherits@SHAPE: ^2x2Shape @@ -3163,17 +3211,15 @@ NUKE: WithSpriteBody: PauseOnCondition: disabled Buildable: - Queue: Building + Queue: BuildingSQ, BuildingMQ BuildPaletteOrder: 10 - Prerequisites: ~structures.td, ~techlevel.low + Prerequisites: ~structures.td IconPalette: chrometd Description: Provides power for other structures. Valued: Cost: 300 Tooltip: Name: Nuclear Power Plant - ProvidesPrerequisite: - Prerequisite: anypower Building: Footprint: xX xx == Dimensions: 2,3 @@ -3185,20 +3231,18 @@ NUKE: RevealsShroud: Range: 4c0 WithBuildingBib: - WithDeathAnimation: - DeathSequence: dead - UseDeathTypeSuffix: false - DeathSequencePalette: overlayplayertd Power: Amount: 100 - ProvidesPrerequisite: - Prerequisite: anypower - Targetable: - TargetTypes: Ground, C4, DetonateAttack, Structure, SpyInfiltrate, PowerInfiltrate ScalePowerWithHealth: + Sellable: + RequiresCondition: !build-incomplete && !c4 && !being-captured && !being-warped && !hacked && !discpowerdrain ProvidesPrerequisite@buildingname: - InfiltrateForPowerOutage: - Types: SpyInfiltrate, PowerInfiltrate + ProvidesPrerequisite@anypower: + Prerequisite: anypower + UpdatesBuildOrder: + Limit: 2 + Encyclopedia: + Category: GDI/Buildings; Nod/Buildings NUK2: Inherits: ^BuildingTD @@ -3218,16 +3262,16 @@ NUK2: WithSpriteBody: PauseOnCondition: disabled Buildable: - Queue: Building + Queue: BuildingSQ, BuildingMQ BuildPaletteOrder: 110 - Prerequisites: anyradar, ~structures.td, ~techlevel.low + Prerequisites: anyradar, ~structures.td, ~techlevel.medium IconPalette: chrometd - Description: Provides double the power of\na standard Nuclear Power Plant. + Description: Provides double the power of a standard Nuclear Power Plant. Valued: Cost: 500 Tooltip: Name: Advanced Nuclear Power Plant - ProvidesPrerequisite: + ProvidesPrerequisite@anypower: Prerequisite: anypower Building: Footprint: xX xx == @@ -3240,24 +3284,22 @@ NUK2: RevealsShroud: Range: 5c0 WithBuildingBib: - WithDeathAnimation: - DeathSequence: dead - UseDeathTypeSuffix: false - DeathSequencePalette: overlayplayertd Power: Amount: 200 - Targetable: - TargetTypes: Ground, C4, DetonateAttack, Structure, SpyInfiltrate, PowerInfiltrate ProvidesPrerequisite@buildingname: ScalePowerWithHealth: - InfiltrateForPowerOutage: - Types: SpyInfiltrate, PowerInfiltrate + Sellable: + RequiresCondition: !build-incomplete && !c4 && !being-captured && !being-warped && !hacked && !discpowerdrain + UpdatesBuildOrder: + Limit: 1 + Encyclopedia: + Category: GDI/Buildings; Nod/Buildings AFAC: Inherits: ^BuildingTD - Inherits@PRIMARY: ^PrimaryBuilding Inherits@SHAPE: ^3x2Shape Inherits@BOTI: ^BotFallbackInsurance + Inherits@BLD: ^ProducesBuildings RenderSprites: FactionImages: nod: nodfact @@ -3270,7 +3312,7 @@ AFAC: Dimensions: 3,3 LocalCenterOffset: 0,-512,0 Buildable: - Queue: Building + Queue: BuildingSQ, BuildingMQ BuildPaletteOrder: 1000 Prerequisites: ~disabled IconPalette: chrometd @@ -3286,11 +3328,8 @@ AFAC: RevealsShroud@GAPGEN: Range: 4c0 WithBuildingBib: - Production: - Produces: Building, Defense - PauseOnCondition: forceshield || invulnerability || being-warped Valued: - Cost: 2500 + Cost: 3000 Tooltip: Name: Construction Yard BaseBuilding: @@ -3319,12 +3358,13 @@ AFAC: GrantConditionOnPrerequisite@GLOBALFACTUNDEPLOY: Condition: factundeploy Prerequisites: global-factundeploy + TracksCapturedFaction: ValidFactions: - Factions: talon, zocom, eagle, arc, blackh, marked, legion, shadow + Factions: gdi, talon, zocom, eagle, arc, nod, blackh, marked, legion, shadow ProvidesPrerequisite@td: Prerequisite: structures.td ProvidesPrerequisiteValidatedFaction@gdi: - Factions: talon, zocom, eagle, arc + Factions: gdi, talon, zocom, eagle, arc Prerequisite: structures.gdi ProvidesPrerequisiteValidatedFaction@talon: Factions: talon @@ -3339,7 +3379,7 @@ AFAC: Factions: arc Prerequisite: structures.arc ProvidesPrerequisiteValidatedFaction@nod: - Factions: blackh, marked, legion, shadow + Factions: nod, blackh, marked, legion, shadow Prerequisite: structures.nod ProvidesPrerequisiteValidatedFaction@blackh: Factions: blackh @@ -3354,31 +3394,32 @@ AFAC: Factions: shadow Prerequisite: structures.shadow ProvidesPrerequisiteValidatedFaction@weap.tdFAC: - Factions: talon, zocom, eagle, arc, legion + Factions: gdi, talon, zocom, eagle, arc, legion Prerequisite: structures.weap.td ProvidesPrerequisiteValidatedFaction@airs: - Factions: blackh, marked, shadow + Factions: nod, blackh, marked, shadow Prerequisite: structures.airs ProvidesPrerequisite@wall: Prerequisite: structures.wall ProvidesPrerequisiteValidatedFaction@sandbag: - Factions: talon, zocom, eagle, arc + Factions: gdi, talon, zocom, eagle, arc Prerequisite: structures.sandbag ProvidesPrerequisiteValidatedFaction@atwr: - Factions: talon, eagle, arc + Factions: gdi, talon, eagle, arc Prerequisite: structures.atwr - ProductionBar@Building: - ProductionType: Building - ProductionBar@Defense: - ProductionType: Defense - Color: 8A8A8A - WithDeathAnimation: - DeathSequence: dead - UseDeathTypeSuffix: false - DeathSequencePalette: overlayplayertd + ProvidesPrerequisite@anyconyard: + Prerequisite: anyconyard BaseProvider: - PauseOnCondition: being-captured Range: 16c0 + PauseOnCondition: being-captured + RequiresCondition: !defense-policy + BaseProvider@DefensePolicy: + Range: 20c0 + PauseOnCondition: being-captured + RequiresCondition: defense-policy + GrantConditionOnPrerequisite@DefensePolicy: + Condition: defense-policy + Prerequisites: defense.policy WithBuildingPlacedAnimation: RequiresCondition: !build-incomplete && !chrono-vortex Power: @@ -3390,27 +3431,38 @@ AFAC: Damage: 950 TransferTimedExternalConditionOnTransform: Condition: invulnerability - SpawnActorsOnSell: + TransferTimedExternalConditionOnTransform@INVIS: + Condition: invisibility + SpawnActorsOnSellCA: ActorTypes: n1,n1,n1,n1,n6 + -UpdatesBuildOrder: + Encyclopedia: + Category: GDI/Buildings; Nod/Buildings NSAM: Inherits: ^DefenseTD Inherits@IDISABLE: ^DisableOnLowPowerOrPowerDown Inherits@AUTOTARGET: ^AutoTargetAirICBM Inherits@SHAPE: ^2x1Shape + Inherits@A2GPROTECTION: ^AirToGroundProtection + Inherits@AntiAirDefense: ^AntiAirDefense Selectable: - Bounds: 48,24 + Bounds: 2048, 1024 HitShape: Type: Rectangle TopLeft: -768,-512 BottomRight: 768,512 Buildable: - Queue: Defense + Queue: DefenseSQ, DefenseMQ BuildPaletteOrder: 100 Prerequisites: anyradar, ~structures.nod, ~techlevel.medium - Description: Anti-aircraft base defense.\n Requires power to operate.\n Can detect cloaked units.\n Strong vs Aircraft\n Cannot target Ground Units. + Description: Anti-aircraft base defense. + TooltipExtras: + Strengths: • Strong vs Aircraft + Weaknesses: • Cannot attack ground units + Attributes: • Requires power to operate\n• Detects cloaked aircraft Valued: - Cost: 700 + Cost: 750 Tooltip: Name: SAM Site Building: @@ -3422,7 +3474,7 @@ NSAM: Type: Concrete RevealsShroud: MinRange: 5c0 - Range: 8c0 + Range: 7c0 RevealGeneratedShroud: False RevealsShroud@GAPGEN: Range: 5c0 @@ -3430,13 +3482,14 @@ NSAM: TurnSpeed: 120 InitialFacing: 0 RealignDelay: -1 + RequiresCondition: !build-incomplete + PauseOnCondition: disabled || empdisable || being-warped -WithSpriteBody: WithEmbeddedTurretSpriteBody: QuantizedFacings: 32 PauseOnCondition: disabled || empdisable || being-warped AttackPopupTurreted: - RequiresCondition: !build-incomplete - PauseOnCondition: disabled || empdisable || being-warped + PauseOnCondition: build-incomplete || disabled || empdisable || being-warped Armament: Weapon: Nike MuzzleSequence: muzzle @@ -3447,26 +3500,37 @@ NSAM: -ActorPreviewPlaceBuildingPreview: SequencePlaceBuildingPreview: Sequence: place - SequencePalette: placebuildingtd DetectCloaked: + Range: 7c0 + DetectionTypes: AirCloak RequiresCondition: !(disabled || empdisable || being-warped) + RenderRangeCircle: + RangeCircleType: DefenseRangeAA + Encyclopedia: + Category: Nod/Defenses GTWR: Inherits: ^DefenseTD Inherits@AUTOTARGET: ^AutoTargetGround Buildable: - Queue: Defense + Queue: DefenseSQ, DefenseMQ BuildPaletteOrder: 50 Prerequisites: infantry.any, ~structures.gdi, ~techlevel.low IconPalette: chrometd - Description: Anti-infantry base defense.\n Can detect cloaked units.\n Strong vs Infantry, Light Armor\n Weak vs Tanks + Description: Anti-infantry base defense. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor + Weaknesses: • Weak vs Heavy Armor\n• Cannot attack Aircraft + Attributes: • Detects cloaked units Valued: Cost: 600 + CustomSellValue: + Value: 200 Tooltip: Name: Guard Tower Building: Health: - HP: 34000 + HP: 40000 Armor: Type: Concrete RevealsShroud: @@ -3482,37 +3546,44 @@ GTWR: LocalOffset: 341,0,128 MuzzleSequence: muzzle AttackTurreted: - RequiresCondition: !build-incomplete - PauseOnCondition: empdisable || being-warped + PauseOnCondition: build-incomplete || empdisable || being-warped ClassicFacingBodyOrientation: QuantizedFacings: 8 WithMuzzleOverlay: Turreted: TurnSpeed: 512 Power: - Amount: -20 + Amount: -15 + DetectCloaked: + Range: 5c0 + Encyclopedia: + Category: GDI/Defenses ATWR: Inherits: ^DefenseTD Inherits@IDISABLE: ^DisableOnLowPowerOrPowerDown Inherits@AUTOTARGET: ^AutoTargetGround Buildable: - Queue: Defense + Queue: DefenseSQ, DefenseMQ BuildPaletteOrder: 80 - Prerequisites: anyradar, ~structures.atwr, ~techlevel.high + Prerequisites: vehicles.any, ~structures.atwr, ~techlevel.medium IconPalette: chrometd - Description: Advanced base defense.\n Requires power to operate.\n Can detect cloaked units.\n Strong vs Vehicles, Infantry\n Weak vs Aircraft + Description: Advanced base defense. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor, Infantry + Weaknesses: • Cannot attack Aircraft + Attributes: • Requires power to operate\n• Detects cloaked units Valued: - Cost: 1000 + Cost: 1250 Tooltip: Name: Advanced Guard Tower Health: - HP: 48000 + HP: 52000 Armor: Type: Concrete Selectable: - Bounds: 24,24 - DecorationBounds: 22,48,0,-12 + Bounds: 1024, 1024 + DecorationBounds: 938, 2048, 0, -512 RevealsShroud: MinRange: 6c0 Range: 8c0 @@ -3529,31 +3600,36 @@ ATWR: LocalOffset: 256,128,0, 256,-128,0 LocalYaw: -100,100 AttackTurreted: - RequiresCondition: !build-incomplete - PauseOnCondition: disabled || empdisable || being-warped + PauseOnCondition: build-incomplete || disabled || empdisable || being-warped ClassicFacingBodyOrientation: QuantizedFacings: 8 Power: - Amount: -50 + Amount: -75 DetectCloaked: RequiresCondition: !(disabled || empdisable || being-warped) + Encyclopedia: + Category: GDI/Defenses STWR: Inherits: ^Defense Inherits@IDISABLE: ^DisableOnLowPowerOrPowerDown Inherits@AUTOTARGET: ^AutoTargetGround Buildable: - Queue: Defense + Queue: DefenseSQ, DefenseMQ BuildPaletteOrder: 80 - Prerequisites: anyradar, ~structures.zocom, ~techlevel.high - Description: Advanced base defense that emits devastating sonic shockwaves.\n Requires power to operate.\n Can detect cloaked units.\n Strong vs Vehicles, Infantry\n Weak vs Aircraft + Prerequisites: vehicles.any, ~structures.zocom, ~techlevel.medium + Description: Advanced base defense that emits devastating sonic shockwaves. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor, Infantry + Weaknesses: • Cannot attack Aircraft + Attributes: • Requires power to operate\n• Detects cloaked units Valued: - Cost: 1350 + Cost: 1450 Tooltip: Name: Sonic Tower Building: Health: - HP: 42000 + HP: 47500 Armor: Type: Concrete RevealsShroud: @@ -3568,9 +3644,10 @@ STWR: TurnSpeed: 20 InitialFacing: 192 RealignDelay: -1 - -WithSpriteBody: - WithEmbeddedTurretSpriteBody: + RequiresCondition: !build-incomplete PauseOnCondition: disabled || empdisable || being-warped + WithSpriteTurret: + RequiresCondition: !build-incomplete Armament: Weapon: SonicPulse RequiresCondition: !sonic-upgrade @@ -3578,36 +3655,43 @@ STWR: Weapon: SonicPulse.UPG RequiresCondition: sonic-upgrade AttackTurreted: - RequiresCondition: !build-incomplete - PauseOnCondition: disabled || empdisable || being-warped + PauseOnCondition: build-incomplete || disabled || empdisable || being-warped WithMuzzleOverlay: Power: - Amount: -80 + Amount: -85 ClassicFacingBodyOrientation: DetectCloaked: RequiresCondition: !(disabled || empdisable || being-warped) Selectable: - DecorationBounds: 24,40,0,-8 + DecorationBounds: 1024, 1706, 0, -341 GrantConditionOnPrerequisite@SONIC: Condition: sonic-upgrade Prerequisites: sonic.upgrade + Encyclopedia: + Category: GDI/Defenses + EncyclopediaExtras: + Subfaction: zocom OBLI: Inherits: ^DefenseTD Inherits@IDISABLE: ^DisableOnLowPowerOrPowerDown Inherits@AUTOTARGET: ^AutoTargetGround Buildable: - Queue: Defense + Queue: DefenseSQ, DefenseMQ BuildPaletteOrder: 80 - Prerequisites: anyradar, ~structures.nod, ~techlevel.high + Prerequisites: anyradar, ~structures.nod, ~techlevel.medium IconPalette: chrometd - Description: Advanced experimental base defense.\n Requires power to operate.\n Can detect cloaked units.\n Strong vs Vehicles, Infantry\n Weak vs Aircraft + Description: Advanced experimental base defense. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor, Infantry + Weaknesses: • Cannot attack Aircraft + Attributes: • Requires power to operate\n• Detects cloaked units Valued: Cost: 1500 Tooltip: Name: Obelisk of Light Selectable: - DecorationBounds: 22,42,0,-8 + DecorationBounds: 938, 1792, 0, -341 Health: HP: 64000 Armor: @@ -3620,39 +3704,60 @@ OBLI: Range: 6c0 WithBuildingBib: HasMinibib: true + GrantConditionOnPrerequisite@QUANTUM: + Condition: quantum-upgrade + Prerequisites: quantum.upgrade -WithSpriteBody: WithChargeSpriteBody: Sequence: active - GrantConditionOnFaction@marked: - Condition: marked - Factions: marked - Armament: + Armament@PRIMARY: Weapon: Laser LocalOffset: 0,-85,1280 - RequiresCondition: !marked - Armament@Marked: + RequiresCondition: !quantum-upgrade + MuzzleSequence: muzzle + MuzzlePalette: caneon + Armament@QUANTUM: Weapon: Laser.Adv LocalOffset: 0,-85,1280 - RequiresCondition: marked + RequiresCondition: quantum-upgrade + MuzzleSequence: muzzle2 + MuzzlePalette: caneon + WithMuzzleOverlay: AttackCharges: - RequiresCondition: !build-incomplete - PauseOnCondition: disabled || empdisable || being-warped + PauseOnCondition: build-incomplete || disabled || empdisable || being-warped ChargeLevel: 50 ChargingCondition: charging - AmbientSound: - RequiresCondition: charging + AmbientSound@1: + RequiresCondition: charging && !quantum-upgrade SoundFiles: obelpowr.aud - Interval: 30, 40 + Interval: 20 + AmbientSound@2: + RequiresCondition: charging && quantum-upgrade + SoundFiles: obelpowr2.aud + Interval: 20 Power: Amount: -90 ProvidesPrerequisite@buildingname: + ProvidesPrerequisite@ObeliskOrTemple: + Prerequisite: obliortmpl DetectCloaked: RequiresCondition: !(disabled || empdisable || being-warped) + Encyclopedia: + Category: Nod/Defenses HQ: Inherits: ^BuildingTD Inherits@IDISABLE: ^DisableOnLowPowerOrPowerDownOrForceDisable - Inherits@POWERDRAIN: ^PowerDrainableRadar + Inherits@UPG: ^ProducesUpgrades + Inherits@GDIRADARPOWERS: ^GDIRadarPowers + Inherits@SATHACKPOWER: ^SatHackPower + Inherits@SHADOWTEAMPOWER: ^ShadowTeamPower + Inherits@@INFERNOBOMBPOWER: ^InfernoBombPower + Inherits@CASHHACKPOWER: ^CashHackPower + Inherits@TECHLOCKABLE: ^TechLockable + Inherits@ProductionOptimizer1: ^ProductionOptimizer1 + Selectable: + Bounds: 2048, 2304 HitShape: TargetableOffsets: 0,0,0, 0,512,0, 420,-598,256 Type: Rectangle @@ -3665,223 +3770,295 @@ HQ: marked: nodhq legion: nodhq shadow: nodhq + arc: hqr Buildable: - Queue: Building + Queue: BuildingSQ, BuildingMQ BuildPaletteOrder: 90 - Prerequisites: anyrefinery, ~structures.td, ~techlevel.medium + Prerequisites: anyrefinery, ~structures.td, ~techlevel.medium, ~!unity.covenant IconPalette: chrometd - Description: Provides an overview of the battlefield.\n Requires power to operate. + Description: Provides an overview of the battlefield. + TooltipExtras: + Attributes: • Requires power to operate\n• Detects nearby enemy vehicles, aircraft and structures in fog of war + RequiresCondition: !arc-built + TooltipExtras@ARC: + Attributes: • Requires power to operate\n• Detects nearby enemy vehicles, aircraft and structures in fog of war\n• Has limited emergency backup power + RequiresCondition: arc-built + IsStandard: false Valued: Cost: 1800 Tooltip: Name: Comm. Center + RequiresCondition: !arc-built + Tooltip@ARC: + Name: Drone Comm. Center + RequiresCondition: arc-built Building: - Footprint: X_ xx == + Footprint: XX xx == Dimensions: 2,3 LocalCenterOffset: 0,-512,0 WithSpriteBody: - PauseOnCondition: disabled || being-warped - Targetable: - TargetTypes: Ground, C4, DetonateAttack, Structure, SpyInfiltrate, SabInfiltrate + PauseOnCondition: (disabled && !backup-power) || being-warped + Targetable@INFILTRATION: + RequiresCondition: !being-warped + TargetTypes: ResetShroudInfiltrate Health: - HP: 100000 + HP: 110000 Armor: Type: Wood RevealsShroud: - MinRange: 6c0 - Range: 10c0 + MinRange: 5c0 + Range: 6c0 RequiresCondition: !disabled RevealGeneratedShroud: False RevealsShroud@Offline: Range: 5c0 RequiresCondition: disabled RevealsShroud@GAPGEN: - Range: 6c0 + Range: 5c0 RequiresCondition: !disabled ProvidesRadar: - RequiresCondition: !jammed && !disabled && !being-warped + RequiresCondition: !jammed && (!disabled || backup-power) && !being-warped && !build-incomplete + RangedGpsRadarProvider: + Range: 12c0 + TargetTypes: Vehicle, Air, Structure + RequiresCondition: !jammed && (!disabled || backup-power) && !being-warped && !build-incomplete + WithRangeCircle: + Type: RadarDetection + Range: 12c0 + RequiresCondition: !jammed && (!disabled || backup-power) && !being-warped && !build-incomplete WithBuildingBib: + SupportPowerChargeBar: InfiltrateForExploration: - Types: SpyInfiltrate, SabInfiltrate - SpawnActorPowerCA@sathack: - Actor: camera.sathack - Prerequisites: ~radar.nod - LifeTime: 120 - OrderName: sathack - Icon: hacksat - ChargeInterval: 4500 - Description: Hack Satellite Uplink - LongDesc: Reveals map terrain and provides tactical\ninformation. - LaunchSound: hacksat.aud - SelectTargetSpeechNotification: SelectTarget - PauseOnCondition: disabled || being-warped - EffectImage: empty - EffectSequence: idle - EffectPalette: tseffect-ignore-lighting-alpha75 - TargetCircleRange: 9c512 - TargetCircleColor: 999999AA - ProduceActorPower@hackercell: - OrderName: hackercell - Prerequisites: infantry.any, ~radar.legion, ~techlevel.medium - Icon: hackercell - Type: Infantry - ChargeInterval: 7500 - Description: Hacker Cell - LongDesc: Deploy a squad of hackers. - Actors: hack, hack, hack - LaunchSpeechNotification: ReinforcementsArrived - EndChargeSpeechNotification: Reinforce - PauseOnCondition: disabled || being-warped - DropPodsPowerCA@Zocom: - OrderName: droppods - Cursor: ability - Prerequisites: ~radar.zocom, techlevel.high - PauseOnCondition: disabled || being-warped - Icon: droppods - IconPalette: chrometd - Description: Drop Pods - LongDesc: Drop Pod reinforcements.\nSmall team of elite soldiers orbital drops\nto target location. - EndChargeSpeechNotification: DropPodsAvailable - SelectTargetSpeechNotification: SelectTarget - DisplayRadarPing: True - ChargeInterval: 4500 - Weapon: DropPodArrive - UnitTypes: POD, POD, POD, POD, POD2, POD2, POD3 - ExactUnits: true - PodScatter: 3 - EntryEffect: explosion - EntryEffectSequence: shock_wave - EntryEffectPalette: tseffect-ignore-lighting-alpha75 - CashHackPower@Legion: - OrderName: cashhack - Icon: chack - ChargeInterval: 6000 - Minimum: 500 - Maximum: 2000 - Prerequisites: ~radar.legion, techlevel.high - AllowMultiple: false - Description: Cash Hack - LongDesc: Steal up to $2000 credits from the enemy.\n\nTarget their Refinery to do so. - OnFireSound: scashhac.aud - Notification: CreditsStolen - DisplayTimerRelationships: Ally - SelectTargetSpeechNotification: SelectTarget - InsufficientPowerSpeechNotification: InsufficientPower - DisplayRadarPing: True - Cursor: ability - PauseOnCondition: disabled || empdisable || being-warped - AirstrikePower@BlackhandFirebomb: - OrderName: infernobomb - Prerequisites: ~radar.blackh, techlevel.unrestricted - Icon: infbomb - IconPalette: chrometd - ChargeInterval: 9000 - Description: Inferno Bomb - LongDesc: A B2 bomber drops\ninferno bombs on your target. - SelectTargetSpeechNotification: SelectTarget - CameraActor: camera - CameraRemoveDelay: 150 - UnitType: b2b - QuantizedFacings: 8 - DisplayBeacon: true - BeaconPoster: a10airstrike - BeaconPosterPalette: temptd - SquadSize: 1 - SquadOffset: 0,1792,0 - ArrowSequence: arrow - ClockSequence: clockTD - CircleSequence: circles - UseDirectionalTarget: True - DirectionArrowAnimation: paradirection - PauseOnCondition: disabled || being-warped - AirReinforcementsPower@ShadowTeam: - OrderName: shadowteam - Prerequisites: ~radar.shadow, techlevel.unrestricted - Icon: shadteam - ChargeInterval: 6750 - Description: Shadow Team - LongDesc: Calls for a Shadow Team; three stealth infantry that arrive via glider. - SelectTargetSpeechNotification: SelectTarget - UnitType: sgli - QuantizedFacings: 8 - DisplayBeacon: false - SquadSize: 3 - SquadOffset: -1024,1024,0 - UseDirectionalTarget: True - DirectionArrowAnimation: paradirection - PauseOnCondition: disabled || being-warped - LaunchSpeechNotification: ReinforcementsArrived - EndChargeSpeechNotification: Reinforce + Types: ResetShroudInfiltrate + PlayerExperience: 15 Power: Amount: -40 - -PowerMultiplier@POWERDRAIN: ValidFactions: - Factions: talon, zocom, eagle, blackh, marked, legion, shadow - ProvidesPrerequisiteValidatedFaction@anyradar: + Factions: gdi, talon, zocom, eagle, arc, nod, blackh, marked, legion, shadow + ProvidesPrerequisite@buildingname: + RequiresCondition: !tech-locked + ProvidesPrerequisite@anyradar: Prerequisite: anyradar + RequiresCondition: !tech-locked + ProvidesPrerequisite@radarorrepair: + Prerequisite: radarorrepair + RequiresCondition: !tech-locked + ProvidesPrerequisite@RadarOrAircraft: + Prerequisite: radaroraircraft + RequiresCondition: !tech-locked + ProvidesPrerequisite@FlameTowerOrRadar: + Prerequisite: fturorradar + RequiresCondition: !tech-locked ProvidesPrerequisiteValidatedFaction@gdirad: - Factions: talon, zocom, eagle, arc + Factions: gdi, talon, zocom, eagle, arc Prerequisite: radar.gdi + RequiresCondition: !tech-locked ProvidesPrerequisiteValidatedFaction@talrad: Factions: talon Prerequisite: radar.talon + RequiresCondition: !tech-locked ProvidesPrerequisiteValidatedFaction@zocrad: Factions: zocom Prerequisite: radar.zocom + RequiresCondition: !tech-locked + ProvidesPrerequisiteValidatedFaction@eagrad: + Factions: eagle + Prerequisite: radar.eagle + RequiresCondition: !tech-locked ProvidesPrerequisiteValidatedFaction@arcrad: Factions: arc Prerequisite: radar.arc + RequiresCondition: !tech-locked ProvidesPrerequisiteValidatedFaction@nodrad: - Factions: blackh, marked, legion + Factions: nod, blackh, marked, legion, shadow Prerequisite: radar.nod + RequiresCondition: !tech-locked ProvidesPrerequisiteValidatedFaction@bhrad: Factions: blackh Prerequisite: radar.blackh + RequiresCondition: !tech-locked ProvidesPrerequisiteValidatedFaction@legrad: Factions: legion Prerequisite: radar.legion + RequiresCondition: !tech-locked ProvidesPrerequisiteValidatedFaction@shadrad: Factions: shadow Prerequisite: radar.shadow - ProvidesPrerequisiteValidatedFaction@howi: - Factions: marked, legion, shadow - Prerequisite: upgrades.howi - ProvidesPrerequisite@buildingname: + RequiresCondition: !tech-locked ProvidesPrerequisite@radar-active: Prerequisite: radar-active - RequiresCondition: !jammed && !disabled && !being-warped + RequiresCondition: !jammed && (!disabled || backup-power) && !being-warped ExternalCondition@JAMMED: Condition: jammed - InfiltrateForSupportPowerCA@STOLENTECH: - Types: SabInfiltrate - Proxy: stolentech.hq - Production: - Produces: Upgrade - PauseOnCondition: forceshield || invulnerability || being-warped - ProductionBar: - ProductionType: Upgrade - Exit: - ProximityExternalCondition@DRONECONTROL: - Condition: radarenabled - Range: 300c0 - RequiresCondition: !jammed && !disabled && !being-warped + ProductionCostMultiplier@ARCDISCOUNT: + Multiplier: 50 + Prerequisites: anyradar, player.arc + GrantConditionOnFaction@ARC: + Factions: arc + Condition: arc-built + GrantConditionOnPrerequisite@UPG: + Prerequisites: unity.covenant + Condition: unity-upgrade + TransformOnCondition@UPG: + IntoActor: hq.upg + SkipMakeAnims: false + RequiresCondition: unity-upgrade && !build-incomplete + GrantChargingCondition@ArcBackupPower: + Condition: backup-power + RequiresCondition: arc-built + PauseOnCondition: disabled + InitialCharge: 0 + MaxCharge: 3000 + ChargeRate: 1 + DischargeRate: 3 + ChargingColor: aaaa00 + DischargingColor: ffff00 + ShowSelectionBarWhenFull: false + ShowSelectionBarWhenEmpty: false + ReplacedInQueue: + Actors: hq.upg + Encyclopedia: + Category: GDI/Buildings; Nod/Buildings + +HQ.UPG: + Inherits: HQ + RenderSprites: + PlayerPalette: playertd + Image: nodhq.upg + FactionImages: + nod: nodhq.upg + blackh: nodhq.upg + marked: nodhq.upg + legion: nodhq.upg + shadow: nodhq.upg + arc: nodhq.upg + Buildable: + Queue: BuildingSQ, BuildingMQ + BuildPaletteOrder: 90 + Prerequisites: anyrefinery, ~structures.td, ~techlevel.medium, ~unity.covenant + IconPalette: chrometd + Description: Provides an overview of the battlefield. + Tooltip: + Name: Internet Center + TooltipExtras: + Attributes: • Requires power to operate\n• Detects nearby enemy vehicles, aircraft and structures in fog of war (increases per garrisoned Hacker)\n• $25 delivered every 60 seconds (normal speed)\n• Income increased by $75 per garrisoned Hacker\n• Cannot be hacked + -Targetable@HACKABLE: + -TransformOnCondition@UPG: + -GrantConditionOnPrerequisite@UPG: + Cargo: + Types: Hacker + MaxWeight: 5 + LoadedCondition: cargo + WithCargoPipsDecoration: + Position: BottomLeft + Margin: 4, 3 + RequiresSelection: true + CashTrickler@Hacker0: + Interval: 375 + Amount: 25 + RequiresCondition: cargo == 0 + CashTrickler@Hacker1: + Interval: 375 + Amount: 100 + RequiresCondition: cargo == 1 + CashTrickler@Hacker2: + Interval: 375 + Amount: 175 + RequiresCondition: cargo == 2 + CashTrickler@Hacker3: + Interval: 375 + Amount: 250 + RequiresCondition: cargo == 3 + CashTrickler@Hacker4: + Interval: 375 + Amount: 325 + RequiresCondition: cargo == 4 + CashTrickler@Hacker5: + Interval: 375 + Amount: 400 + RequiresCondition: cargo == 5 + RevealsShroud: + Range: 7c0 + -MinRange: + -RequiresCondition: + RevealGeneratedShroud: True + -RevealsShroud@Offline: + -RevealsShroud@GAPGEN: + GrantCondition@RadarActive: + Condition: radar-active + RequiresCondition: !jammed && (!disabled || backup-power) && !being-warped && !build-incomplete + RangedGpsRadarProvider: + Range: 12c0 + TargetTypes: Vehicle, Air, Structure + RequiresCondition: radar-active && cargo == 0 + RangedGpsRadarProvider@1: + Range: 13c0 + TargetTypes: Vehicle, Air, Structure + RequiresCondition: radar-active && cargo == 1 + RangedGpsRadarProvider@2: + Range: 14c0 + TargetTypes: Vehicle, Air, Structure + RequiresCondition: radar-active && cargo == 2 + RangedGpsRadarProvider@3: + Range: 15c0 + TargetTypes: Vehicle, Air, Structure + RequiresCondition: radar-active && cargo == 3 + RangedGpsRadarProvider@4: + Range: 16c0 + TargetTypes: Vehicle, Air, Structure + RequiresCondition: radar-active && cargo == 3 + RangedGpsRadarProvider@5: + Range: 17c0 + TargetTypes: Vehicle, Air, Structure + RequiresCondition: radar-active && cargo == 3 + WithRangeCircle: + Type: RadarDetection + Range: 12c0 + RequiresCondition: radar-active && cargo == 0 + WithRangeCircle@1: + Type: RadarDetection + Range: 13c0 + RequiresCondition: radar-active && cargo == 1 + WithRangeCircle@2: + Type: RadarDetection + Range: 14c0 + RequiresCondition: radar-active && cargo == 2 + WithRangeCircle@3: + Type: RadarDetection + Range: 15c0 + RequiresCondition: radar-active && cargo == 3 + WithRangeCircle@4: + Type: RadarDetection + Range: 16c0 + RequiresCondition: radar-active && cargo == 4 + WithRangeCircle@5: + Type: RadarDetection + Range: 17c0 + RequiresCondition: radar-active && cargo == 5 + Encyclopedia: + Category: Nod/Buildings EYE: Inherits: ^BuildingTD Inherits@IDISABLE: ^DisableOnLowPowerOrPowerDownOrForceDisable - Inherits@POWERDRAIN: ^PowerDrainableRadar + Inherits@IONCANNONPOWER: ^IonCannonPower + Inherits@SURGICALSTRIKEPOWER: ^SurgicalStrikePower + Selectable: + Bounds: 2048, 2304 HitShape: TargetableOffsets: 0,0,0, 0,512,128, 420,-598,213 Type: Rectangle - TopLeft: -1024, -384 + TopLeft: -1024, -1024 BottomRight: 1024, 1024 Buildable: - Queue: Defense - BuildPaletteOrder: 130 + Queue: DefenseSQ, DefenseMQ + BuildPaletteOrder: 140 Prerequisites: gtek, ~structures.gdi, ~techlevel.unrestricted IconPalette: chrometd BuildLimit: 1 - Description: Provides radar and Orbital Ion Cannon support power.\n Requires power to operate.\n Maximum 1 can be built.\n Special Ability: Ion Cannon + Description: Provides radar and orbital Ion Cannon superweapon power. + TooltipExtras: + Attributes: • Maximum 1 can be built\n• Requires power to operate\n• Special Ability: Ion Cannon\n• Detects nearby enemy vehicles, aircraft and structures in fog of war Valued: Cost: 2500 Tooltip: @@ -3890,8 +4067,9 @@ EYE: Footprint: xx xx == Dimensions: 2,3 LocalCenterOffset: 0,-512,0 - Targetable: - TargetTypes: Ground, C4, DetonateAttack, Structure, SpyInfiltrate, SabInfiltrate + Targetable@INFILTRATION: + RequiresCondition: !being-warped + TargetTypes: ResetShroudInfiltrate, ResetSupportPowerInfiltrate WithSpriteBody: PauseOnCondition: disabled || being-warped Health: @@ -3899,121 +4077,81 @@ EYE: Armor: Type: Wood RevealsShroud: - MinRange: 6c0 - Range: 10c0 + MinRange: 5c0 + Range: 6c0 RequiresCondition: !disabled RevealGeneratedShroud: False RevealsShroud@Offline: Range: 5c0 RequiresCondition: disabled RevealsShroud@GAPGEN: - Range: 6c0 + Range: 5c0 RequiresCondition: !disabled WithBuildingBib: ProvidesRadar: - RequiresCondition: !jammed && !disabled && !being-warped + RequiresCondition: !jammed && !disabled && !being-warped && !build-incomplete + RangedGpsRadarProvider: + Range: 12c0 + TargetTypes: Vehicle, Air, Structure + RequiresCondition: !jammed && !disabled && !being-warped && !build-incomplete + WithRangeCircle: + Type: RadarDetection + Range: 12c0 + RequiresCondition: !jammed && !disabled && !being-warped && !build-incomplete InfiltrateForExploration: - Types: SpyInfiltrate, SabInfiltrate - DetonateWeaponPower@IonStorm: - OrderName: ioncannon - Icon: ioncannon - Cursor: ioncannon - ChargeInterval: 13500 - Description: Ion Cannon - ActivationDelay: 50 - LongDesc: Initiate an Ion Cannon strike.\nApplies heavy damage over a large area. - Weapon: IonStormInit - AirburstAltitude: 4c512 - AllowMultiple: false - CameraActor: camera - CameraRemoveDelay: 375 - SelectTargetSpeechNotification: SelectTarget - BeginChargeSpeechNotification: IonCannonCharging - EndChargeSpeechNotification: IonCannonReady - InsufficientPowerSpeechNotification: InsufficientPower - IncomingSpeechNotification: IonCannonApproach - IncomingSound: nukelaunch.aud - LaunchSound: nukelaunch.aud - DisplayTimerRelationships: Ally, Neutral, Enemy - PauseOnCondition: disabled || empdisable || being-warped - DisplayBeacon: False - DisplayRadarPing: True - ArrowSequence: arrow - ClockSequence: clock - CircleSequence: circles - BeaconPoster: atomicon - TargetCircleRange: 6c512 - TargetCircleColor: 4fff3390 - IonCannonPower@surgicals: - OrderName: surgicalstrike - Prerequisites: ~eye.zocom, techlevel.unrestricted - Icon: surgicalstrike - IconPalette: chrometd - ChargeInterval: 6000 - WeaponDelay: 3 - Description: Surgical Strike - EffectPalette: tdeffect-ignore-lighting-alpha85 - LongDesc: Initiate an precision Ion Cannon strike.\nApplies instant damage to a small area. - BeginChargeSpeechNotification: IonCannonCharging - EndChargeSpeechNotification: IonCannonReady - LaunchSound: ion2.aud - SelectTargetSpeechNotification: SelectTarget - InsufficientPowerSpeechNotification: InsufficientPower - DisplayRadarPing: True - DisplayTimerRelationships: Ally - DisplayBeacon: True - CameraActor: camera - ArrowSequence: arrow - ClockSequence: clock - CircleSequence: circles - Cursor: ioncannon - PauseOnCondition: disabled || empdisable || being-warped + Types: ResetShroudInfiltrate InfiltrateForSupportPowerReset: - Types: SpyInfiltrate, SabInfiltrate + Types: ResetSupportPowerInfiltrate + InfiltrationNotification: BuildingInfiltrated + InfiltratedNotification: BaseAttack + PlayerExperience: 15 SupportPowerChargeBar: Power: Amount: -200 - -PowerMultiplier@POWERDRAIN: ValidFactions: - Factions: talon, zocom, eagle, arc + Factions: gdi, talon, zocom, eagle, arc ProvidesPrerequisiteValidatedFaction@zoceye: Factions: zocom Prerequisite: eye.zocom ProvidesPrerequisite@buildingname: ExternalCondition@JAMMED: Condition: jammed + ProvidesPrerequisite@radar-active: + Prerequisite: radar-active + RequiresCondition: !jammed && !disabled && !being-warped MustBeDestroyed: RequiredForShortGame: false ProductionCostMultiplier@ZocomBonus: - Multiplier: 90 - Prerequisites: structures.zocom - ProximityExternalCondition@DRONECONTROL: - Condition: radarenabled - Range: 300c0 - RequiresCondition: !jammed && !disabled && !being-warped + Multiplier: 60 + Prerequisites: player.zocom + Encyclopedia: + Category: GDI/Buildings REP: Inherits: ^BuildingTD + Inherits@ProductionOptimizer1: ^ProductionOptimizer1 HitShape: TargetableOffsets: 840,0,0, 598,-640,0, 598,640,0, -1060,0,0, -768,-640,0, -768,640,0 Type: Polygon Points: -1536,-300, -640,-811, 640,-811, 1536,-300, 1536,555, 640,1110, -640,1110, -1536,555 Buildable: - Queue: Building + Queue: BuildingSQ, BuildingMQ BuildPaletteOrder: 100 - Prerequisites: vehicles.any, ~structures.td, ~techlevel.medium + Prerequisites: vehicles.any, ~structures.td, ~techlevel.low IconPalette: chrometd - Description: Repairs vehicles for credits. + Description: Repairs vehicles and aircraft. + TooltipExtras: + Attributes: • Nearby helipads/airfields will repair landed aircraft\n• Can retrofit existing units with upgrades Valued: - Cost: 1200 + Cost: 1000 Tooltip: Name: Repair Facility Building: Footprint: _+_ +++ _+_ Dimensions: 3,3 Selectable: - Bounds: 68,34,0,3 - DecorationBounds: 72,48 + Bounds: 2901, 1450, 0, 128 + DecorationBounds: 3072, 2048 Health: HP: 80000 Armor: @@ -4033,39 +4171,56 @@ REP: HpPerStep: 1000 Interval: 7 StartRepairingNotification: Repairing + StartRepairingTextNotification: Repairing. FinishRepairingNotification: UnitRepaired - PlayerExperience: 15 + FinishRepairingTextNotification: Unit repaired. RequiresCondition: !forceshield && !invulnerability && !being-warped WithResupplyAnimation: RequiresCondition: !build-incomplete Power: Amount: -30 + ProximityExternalCondition@UNITSELL: + Condition: unit-sellable + Range: 1c0 + GrantConditionOnResupplying@Resupplying: + Condition: resupplying + Sellable: + RequiresCondition: !resupplying && !build-incomplete && !c4 && !being-captured && !being-warped && !hacked ProvidesPrerequisite@buildingname: ProvidesPrerequisite@repair: Prerequisite: repair + ProvidesPrerequisite@radarorrepair: + Prerequisite: radarorrepair + ProvidesPrerequisite@allowsmcv: + Prerequisite: vehicles.mcv ProximityExternalCondition@AIRCRAFTREPAIR: Condition: aircraft-repair Range: 10c0 WithRangeCircle@AIRCRAFTREPAIR: - Color: 888899AA + Type: AircraftRepair + Color: FFD000AA Range: 10c0 + Encyclopedia: + Category: GDI/Buildings; Nod/Buildings HPAD.TD: Inherits: ^BuildingTD - Inherits@PRIMARY: ^PrimaryBuilding Inherits@SHAPE: ^2x2Shape Inherits@AIRCRAFTREPAIR: ^RepairsAircraftWithRepairBay + Inherits@INTERCEPTORS: ^InterceptorsPower + Inherits@AIR: ^ProducesHelicopters + Inherits@InfiltrateForSupportPower: ^InfiltrateForSupportPower RenderSprites: Image: hpad2 HitShape: UseTargetableCellsOffsets: false TargetableOffsets: 0,0,0, 768,-512,0, 768,512,0, -281,-512,0, -630,512,0 Buildable: - Queue: Building + Queue: BuildingSQ, BuildingMQ BuildPaletteOrder: 120 - Prerequisites: anyradar, ~structures.td, ~techlevel.infonly + Prerequisites: radarorrepair, ~structures.nod, ~techlevel.medium IconPalette: chrometd - Description: Produces and reloads helicopters. + Description: Produces and reloads helicopters and VTOL aircraft. Valued: Cost: 500 Tooltip: @@ -4088,21 +4243,14 @@ HPAD.TD: SpawnOffset: 0,-256,0 Facing: 896 RallyPoint: - Production: - Produces: Aircraft, Helicopter - PauseOnCondition: forceshield || invulnerability || being-warped Reservable: - ProductionBar: - ProductionType: Aircraft WithBuildingBib: Power: - Amount: -10 + Amount: -20 ValidFactions: - Factions: talon, zocom, eagle, arc, blackh, marked, legion, shadow - ProvidesPrerequisite@all: - Prerequisite: aircraft.all + Factions: gdi, talon, zocom, eagle, arc, nod, blackh, marked, legion, shadow ProvidesPrerequisiteValidatedFaction@gdi: - Factions: talon, zocom, eagle, arc + Factions: gdi, talon, zocom, eagle, arc Prerequisite: aircraft.gdi ProvidesPrerequisiteValidatedFaction@talon: Factions: talon @@ -4110,8 +4258,11 @@ HPAD.TD: ProvidesPrerequisiteValidatedFaction@eagle: Factions: eagle Prerequisite: aircraft.eagle + ProvidesPrerequisiteValidatedFaction@arc: + Factions: arc + Prerequisite: aircraft.arc ProvidesPrerequisiteValidatedFaction@nod: - Factions: blackh, marked, legion, shadow + Factions: nod, blackh, marked, legion, shadow Prerequisite: aircraft.nod ProvidesPrerequisiteValidatedFaction@marked: Factions: marked @@ -4120,62 +4271,41 @@ HPAD.TD: Factions: shadow Prerequisite: aircraft.shadow ProvidesPrerequisiteValidatedFaction@apch: - Factions: blackh, legion, shadow + Factions: nod, blackh, legion, shadow Prerequisite: aircraft.apch + ProvidesPrerequisite@chinookvisible: + Prerequisite: aircraft.chinookvisible ProvidesPrerequisite@chinook: Prerequisite: aircraft.chinook ProvidesPrerequisite@buildingname: - Targetable: - TargetTypes: Ground, C4, DetonateAttack, Structure, SpyInfiltrate + ProvidesPrerequisite@RadarOrAircraft: + Prerequisite: radaroraircraft + Targetable@INFILTRATION: + RequiresCondition: !being-warped + TargetTypes: StealTechInfiltrate WithResupplyAnimation: RequiresCondition: !build-incomplete - InfiltrateForSupportPower: - Types: SpyInfiltrate - Proxy: powerproxy.paratroopers2 - SpawnActorPower@GDIEagleDropzone: - Actor: FLARE.dropzone - Prerequisites: ~aircraft.eagle, anyradar, ~techlevel.low - LifeTime: 280 - OrderName: dropzoneeagle - Icon: orcaca - IconPalette: chrometd - ChargeInterval: 6000 - Description: Reinforcements - LongDesc: An Orca Carryall drops reinforcements\nat the target location. - EndChargeSpeechNotification: Reinforce - LaunchSpeechNotification: ReinforcementsArrived - SelectTargetSpeechNotification: SelectTarget - EffectImage: empty - EffectSequence: idle - EffectPalette: tseffect-ignore-lighting-alpha75 - ParatroopersPower@xodrop: - OrderName: xodrop - Prerequisites: ~aircraft.talon, ~techlevel.medium - Icon: xodrop - ChargeInterval: 8250 - Description: X-O Drop - UnitType: ocar.xo - LongDesc: An Orca transport drops a squad of X-O Powersuits\nanywhere on the map. - SquadSize: 1 - SquadOffset: 0,1792,0 - DropItems: XO,XO,XO - ReinforcementsArrivedSpeechNotification: ReinforcementsArrived - SelectTargetSpeechNotification: SelectTarget - EndChargeSpeechNotification: Reinforce - AllowImpassableCells: false - QuantizedFacings: 8 - CameraActor: camera.paradrop - DisplayBeacon: true - BeaconPoster: xodrop - ArrowSequence: arrow - ClockSequence: clock - CircleSequence: circles - UseDirectionalTarget: True - DirectionArrowAnimation: paradirection + InfiltrateToCreateProxyActor@SpySupportPower: + Proxy: powerproxy.paratroopers.allies + InfiltrateToCreateProxyActor@STOLENTECH: + Types: StealTechInfiltrate + Proxy: stolentech.hpad.td + InfiltrationNotification: TechnologyAcquired + InfiltratedNotification: OurTechnologyStolen + UseTargetFaction: true + PlayerExperience: 15 + SpawnActorOnMindControlled@STOLENTECH: + Actor: stolentech.hpad.td + OwnerType: Master + Encyclopedia: + Category: Nod/Buildings PROC.TD: Inherits: ^BuildingTD - Inherits@BOTINCOME: ^BotIncome + Inherits@Refinery: ^Refinery + Inherits@ResourceDrainable: ^ResourceDrainable + Inherits@EconomyPolicyDiscount: ^EconomyPolicyDiscount + Inherits@EconomyPolicyTimeReduction: ^EconomyPolicyTimeReduction HitShape: Type: Rectangle TopLeft: -1536, -512 @@ -4200,15 +4330,17 @@ PROC.TD: Name: Refinery Buildable: BuildPaletteOrder: 60 - Prerequisites: anypower, ~structures.td, ~techlevel.low - Queue: Building + Prerequisites: anypower, ~structures.td + Queue: BuildingSQ, BuildingMQ IconPalette: chrometd - Description: Processes raw Tiberium, Ore and Gems\ninto credits. + Description: Processes raw Tiberium, Ore and Gems into credits. BuildDuration: 1400 Building: Footprint: _x_ xxx +++ === Dimensions: 3,4 LocalCenterOffset: 0,-512,0 + Sellable: + RequiresCondition: !build-incomplete && !c4 && !being-captured && !being-warped && !hacked && !resourcedrain Health: HP: 90000 Armor: @@ -4220,16 +4352,21 @@ PROC.TD: RevealsShroud@GAPGEN: Range: 4c0 WithBuildingBib: - Targetable: - TargetTypes: Ground, Structure, C4, DetonateAttack, ThiefInfiltrate + Targetable@INFILTRATION: + RequiresCondition: !being-warped + TargetTypes: StealCreditsInfiltrate Refinery: + TickRate: 15 + DockHost: + Type: Unload DockAngle: 448 - DockOffset: 0,2 + DockOffset: -1c0, 1c0, 0 IsDragRequired: True DragOffset: -554,512,0 DragLength: 12 - TickRate: 15 - StoresResources: + MaxQueueLength: 12 + RequiresCondition: !being-warped + StoresPlayerResourcesCA: Capacity: 2000 WithResourceStoragePipsDecoration: Position: BottomLeft @@ -4237,20 +4374,37 @@ PROC.TD: RequiresSelection: true PipCount: 17 Selectable: - Bounds: 72,56,0,12 - DecorationBounds: 73,72 + Bounds: 3072, 2512, 0, 256 + DecorationBounds: 3114, 3072 InfiltrateForCash: - Types: ThiefInfiltrate + Types: StealCreditsInfiltrate Percentage: 50 InfiltrationNotification: CreditsStolen - WithDeathAnimation: - DeathSequence: dead - UseDeathTypeSuffix: false - DeathSequencePalette: overlayplayertd + PlayerExperience: 15 + GrantConditionOnPrerequisite@SHARVUPG: + Prerequisites: sharv.upgrade + Condition: sharv-upgraded + GrantConditionOnPrerequisite@NOSHARVUPG: + Prerequisites: !sharv.upgrade + Condition: sharv-notupgraded + GrantCondition@SPAWNHARV: + Condition: spawn-harv + GrantPermanently: true + RequiresCondition: sharv-notupgraded + GrantCondition@SPAWNSHARV: + Condition: spawn-sharv + GrantPermanently: true + RequiresCondition: sharv-upgraded FreeActor: Actor: HARV.TD SpawnOffset: 1,2 Facing: 256 + RequiresCondition: spawn-harv && !spawn-sharv && !build-incomplete + FreeActor@SHARV: + Actor: HARV.TD.UPG + SpawnOffset: 1,2 + Facing: 256 + RequiresCondition: spawn-sharv && !spawn-harv && !build-incomplete WithResourceLevelOverlay: RequiresCondition: !build-incomplete Power: @@ -4259,6 +4413,10 @@ PROC.TD: ProvidesPrerequisite@anyrefinery: Prerequisite: anyrefinery CashHackable: + UpdatesCount@ScrinAllegiance: + Type: ScrinAllegiance + Encyclopedia: + Category: GDI/Buildings; Nod/Buildings SILO.TD: Inherits: ^BuildingTD @@ -4271,10 +4429,10 @@ SILO.TD: Name: Silo Buildable: BuildPaletteOrder: 35 - Prerequisites: anyrefinery, ~structures.td, ~techlevel.infonly - Queue: Defense + Prerequisites: anyrefinery, ~structures.td + Queue: DefenseSQ, DefenseMQ IconPalette: chrometd - Description: Stores processed Tiberium, Ore and Gems + Description: Stores processed Tiberium, Ore and Gems. Building: Footprint: xx Dimensions: 2,1 @@ -4287,12 +4445,10 @@ SILO.TD: Range: 4c0 WithBuildingBib: HasMinibib: true - Targetable: - TargetTypes: Ground, Structure, C4, DetonateAttack -WithSpriteBody: WithResourceLevelSpriteBody: Sequence: stages - StoresResources: + StoresPlayerResourcesCA: Capacity: 6000 WithResourceStoragePipsDecoration: Position: BottomLeft @@ -4300,31 +4456,40 @@ SILO.TD: RequiresSelection: true PipCount: 5 -MustBeDestroyed: - SpawnActorsOnSell: + SpawnActorsOnSellCA: ActorTypes: c1,c7 + -GuaranteedActorTypes: Power: Amount: -10 Selectable: - DecorationBounds: 49,30 - Explodes: + DecorationBounds: 2090, 1280 + FireWarheadsOnDeath: Weapon: SmallBuildingExplode EmptyWeapon: SmallBuildingExplode + -UpdatesBuildOrder: + Encyclopedia: + Category: GDI/Buildings; Nod/Buildings AFLD.GDI: Inherits: ^Building - Inherits@PRIMARY: ^PrimaryBuilding Inherits@SHAPE: ^3x2Shape Inherits@AIRCRAFTREPAIR: ^RepairsAircraftWithRepairBay + Inherits@INTERCEPTORS: ^InterceptorsPower + Inherits@AIR: ^ProducesAircraft + Inherits@InfiltrateForSupportPower: ^InfiltrateForSupportPower RenderSprites: Image: afldgdi HitShape: UseTargetableCellsOffsets: false TargetableOffsets: 0,0,0, 420,0,0, 420,-1024,0, 420,1024,0, -777,0,0, -777,-1024,0, -777,1024,0 + Selectable: + Bounds: 3072, 2176, 0, -256 Buildable: - Queue: Building + Queue: BuildingSQ, BuildingMQ BuildPaletteOrder: 130 - Prerequisites: anyradar, ~structures.gdi, ~techlevel.high - Description: Produces and reloads aircraft.\n Special Ability: Recon Drone + IconPalette: chrometd + Prerequisites: radarorrepair, ~structures.gdi, ~techlevel.medium + Description: Produces and reloads aircraft. Valued: Cost: 500 Tooltip: @@ -4347,13 +4512,10 @@ AFLD.GDI: ExitCell: 1,1 Facing: 768 RallyPoint: - Production: - Produces: Aircraft, Plane - PauseOnCondition: forceshield || invulnerability || being-warped Reservable: ValidFactions: - Factions: talon, zocom, eagle, arc - ProvidesPrerequisiteValidatedFaction@gdi: + Factions: gdi, talon, zocom, eagle, arc + ProvidesPrerequisite@gdi: Prerequisite: aircraft.gdi ProvidesPrerequisiteValidatedFaction@eagle: Factions: eagle @@ -4361,95 +4523,57 @@ AFLD.GDI: ProvidesPrerequisiteValidatedFaction@arc: Factions: arc Prerequisite: aircraft.arc - AirstrikePower@uav: - OrderName: gdiuav - Prerequisites: ~!aircraft.arc - Icon: uavicon - ChargeInterval: 3750 - Description: Recon Drone - LongDesc: Reveals a strip of the map\nand cloaked enemy units. - SelectTargetSpeechNotification: SelectTarget - EndChargeSpeechNotification: SpyPlaneReady - CameraActor: camera.spyplane - CameraRemoveDelay: 0 - UnitType: uav - QuantizedFacings: 32 - DisplayBeacon: true - BeaconPoster: lruavicon - ArrowSequence: arrow - ClockSequence: clock - CircleSequence: circles - UseDirectionalTarget: True - DirectionArrowAnimation: paradirection - AirstrikePower@uavST: - OrderName: gdiuavarc - Prerequisites: ~aircraft.arc - Icon: uavicon - ChargeInterval: 3000 - Description: Recon Drone - LongDesc: Reveals a strip of the map\nand cloaked enemy units. - SelectTargetSpeechNotification: SelectTarget - EndChargeSpeechNotification: SpyPlaneReady - CameraActor: camera.spyplane - CameraRemoveDelay: 0 - UnitType: uav - QuantizedFacings: 32 - DisplayBeacon: true - BeaconPoster: lruavicon - ArrowSequence: arrow - ClockSequence: clock - CircleSequence: circles - UseDirectionalTarget: True - DirectionArrowAnimation: paradirection - InterceptorPower@AirDef: - OrderName: interceptors - Prerequisites: ~aircraft.gdi, techlevel.unrestricted - Icon: airsupport - ChargeInterval: 10500 - Description: Interceptors - LongDesc: A squadron of Interceptors provides\nair cover over the selected target area. - SelectTargetSpeechNotification: SelectTarget - EndChargeSpeechNotification: SpyPlaneReady - CameraActor: camera - CameraRemoveDelay: 450 - UnitType: yf23.bomber - QuantizedFacings: 8 - DisplayBeacon: true - BeaconPoster: airsupport - SquadSize: 3 - ArrowSequence: arrow - ClockSequence: clock - CircleSequence: circles - UseDirectionalTarget: True - DirectionArrowAnimation: paradirection - GuardDuration: 500 - Cordon: 5c0 - ProductionBar: - ProductionType: Aircraft + ProvidesPrerequisite@chinook: + Prerequisite: aircraft.chinook + ProvidesPrerequisite@chinookvisible: + Prerequisite: aircraft.chinookvisible + ProvidesPrerequisite@RadarOrAircraft: + Prerequisite: radaroraircraft + ProvidesPrerequisite@buildingname: SupportPowerChargeBar: Power: Amount: -20 - ProvidesPrerequisite@buildingname: - Targetable: - TargetTypes: Ground, C4, DetonateAttack, Structure, SpyInfiltrate + Targetable@INFILTRATION: + RequiresCondition: !being-warped + TargetTypes: StealTechInfiltrate WithResupplyAnimation: RequiresCondition: !build-incomplete - InfiltrateForSupportPower: - Types: SpyInfiltrate + InfiltrateToCreateProxyActor@SpySupportPower: Proxy: powerproxy.airstrike + InfiltrateToCreateProxyActor@STOLENTECH: + Types: StealTechInfiltrate + Proxy: stolentech.afld.gdi + InfiltrationNotification: TechnologyAcquired + InfiltratedNotification: OurTechnologyStolen + PlayerExperience: 15 + SpawnActorOnMindControlled@STOLENTECH: + Actor: stolentech.afld.gdi + OwnerType: Master + SpawnActorOnDeath: + Actor: n1 + SpawnActorsOnSellCA: + ActorTypes: n1,n1,n1,n1,n1,n1,n1,n1,n1,n1,c1,c1,c1,c1,c7,c7,c7,c7,c10,c10 + GuaranteedActorTypes: n1, n1 + Encyclopedia: + Category: GDI/Buildings GTEK: Inherits: ^Building Inherits@IDISABLE: ^DisableOnLowPowerOrForceDisabled Inherits@SHAPE: ^3x2Shape + Inherits@UPG: ^ProducesUpgrades + Inherits@FORCESHIELDPOWER: ^ForceShieldPower + Inherits@NANITEREPAIRPOWER: ^NaniteRepairPower + Inherits@TECHLOCKABLE: ^TechLockable + Inherits@ProductionOptimizer2: ^ProductionOptimizer2 Buildable: - Queue: Building + Queue: BuildingSQ, BuildingMQ BuildPaletteOrder: 150 IconPalette: chrometd Prerequisites: vehicles.any, anyradar, ~structures.gdi, ~techlevel.high Description: Provides GDI advanced technologies. Valued: - Cost: 1500 + Cost: 1800 Tooltip: Name: GDI Tech Center Building: @@ -4457,9 +4581,7 @@ GTEK: Dimensions: 3,3 LocalCenterOffset: 0,-512,0 Health: - HP: 100000 - Targetable: - TargetTypes: Ground, C4, DetonateAttack, Structure, SabInfiltrate + HP: 110000 Armor: Type: Wood RevealsShroud: @@ -4473,101 +4595,76 @@ GTEK: RevealsShroud@GAPGEN: Range: 5c0 RequiresCondition: !disabled - InfiltrateForSupportPower@STOLENTECH: - Types: SabInfiltrate - Proxy: stolentech.gtek WithBuildingBib: Power: - Amount: -200 + Amount: -150 ValidFactions: - Factions: talon, zocom, eagle, arc - ProvidesPrerequisite: - Prerequisite: techcenter + Factions: gdi, talon, zocom, eagle, arc + ProvidesPrerequisite@buildingname: + RequiresCondition: !tech-locked + ProvidesPrerequisite@anytechcenter: + Prerequisite: techcenter.any + RequiresCondition: !tech-locked + ProvidesPrerequisite@tdtek: + Prerequisite: techcenter.td + RequiresCondition: !tech-locked + ProvidesPrerequisiteValidatedFaction@talongtek: + Factions: talon + Prerequisite: gtek.talon + RequiresCondition: !tech-locked ProvidesPrerequisiteValidatedFaction@arcgtek: Factions: arc Prerequisite: gtek.arc + RequiresCondition: !tech-locked ProvidesPrerequisiteValidatedFaction@zocomgtek: Factions: zocom Prerequisite: gtek.zocom - ProvidesPrerequisite@buildingname: - GrantExternalConditionPowerCA@FSHIELD: - OrderName: fshield - Icon: forceshield - ChargeInterval: 7500 - Condition: forceshield - Dimensions: 7, 7 - Footprint: ___x___ __xxx__ _xxxxx_ xxxxxxx _xxxxx_ __xxx__ ___x___ - Duration: 250 - Prerequisites: forceshield.enabled, ~techlevel.high - Weapon: ForceShield - ActivationDelay: 5 - AirburstAltitude: 0c0 - AllowMultiple: false - Description: Force Shield - LongDesc: Makes selected friendly structures temporarily invulnerable.\n Warning: Causes power failure. - OnFireSound: forceon.aud - DisplayTimerRelationships: Ally - SelectTargetSpeechNotification: SelectTarget - InsufficientPowerSpeechNotification: InsufficientPower - EndChargeSpeechNotification: ForceShieldReady - DisplayRadarPing: True - Cursor: ability - PauseOnCondition: disabled || empdisable || being-warped - GrantExternalConditionPowerCA@NREPAIR: - OrderName: nrepair - Icon: nrepair - ChargeInterval: 6750 - Condition: nrepair - Dimensions: 5, 5 - Footprint: _xxx_ xxxxx xxxxx xxxxx _xxx_ - Duration: 750 - Prerequisites: ~gtek.arc, ~techlevel.unrestricted - Weapon: RepairFlash - ActivationDelay: 5 - AirburstAltitude: 0c0 - AllowMultiple: false - Description: Nanite Repair - LongDesc: Repairs selected damaged vehicles. - OnFireSound: srepaira.aud - DisplayTimerRelationships: Ally - SelectTargetSpeechNotification: SelectTarget - InsufficientPowerSpeechNotification: InsufficientPower - DisplayRadarPing: True - Cursor: repair - PauseOnCondition: disabled || empdisable || being-warped + RequiresCondition: !tech-locked + ProvidesPrerequisiteValidatedFaction@eaglegtek: + Factions: eagle + Prerequisite: gtek.eagle + RequiresCondition: !tech-locked SupportPowerChargeBar: - Production: - Produces: Upgrade - PauseOnCondition: forceshield || invulnerability || being-warped - ProductionBar: - ProductionType: Upgrade - Exit: + ProductionCostMultiplier@TALONBONUS: + Multiplier: 90 + Prerequisites: player.talon + Encyclopedia: + Category: GDI/Buildings TMPL: Inherits: ^BuildingTD Inherits@IDISABLE: ^DisableOnLowPowerOrForceDisabled Inherits@SHAPE: ^3x2Shape + Inherits@UPG: ^ProducesUpgrades + Inherits@FRENZYPOWER: ^FrenzyPower + Inherits@TECHHACKPOWER: ^TechnologyHackPower + Inherits@CLUSTERMISSILEPOWER: ^ClusterMissilePower + Inherits@FORCESHIELDPOWER: ^ForceShieldPower + Inherits@TECHLOCKABLE: ^TechLockable + Inherits@ProductionOptimizer2: ^ProductionOptimizer2 HitShape: UseTargetableCellsOffsets: false TargetableOffsets: 0,0,0, 0,-896,0, 0,896,0, 840,0,0, -706,0,0, -706,-768,0, -706,640,0 Valued: - Cost: 1500 + Cost: 1800 Tooltip: Name: Temple of Nod Buildable: - Queue: Building + Queue: BuildingSQ, BuildingMQ BuildPaletteOrder: 140 Prerequisites: vehicles.any, anyradar, ~structures.nod, ~techlevel.high IconPalette: chrometd - Description: Provides Nod advanced technologies.\n Requires power to operate.\n Special Ability: Cluster Missile + Description: Provides Nod advanced technologies. + TooltipExtras: + Attributes: • Requires power to operate\n• Special Ability: Cluster Missile Building: Footprint: xxx xxx === Dimensions: 3,3 LocalCenterOffset: 0,-512,0 Selectable: - Bounds: 72,72 + Bounds: 3072, 3072 Health: - HP: 100000 + HP: 110000 Armor: Type: Wood RevealsShroud: @@ -4581,92 +4678,7 @@ TMPL: RevealsShroud@GAPGEN: Range: 5c0 RequiresCondition: !disabled - NukePower@Cluster: - OrderName: clustermissile - Icon: clustermissile - IconPalette: chrometd - Prerequisites: ~techlevel.high, ~techlevel.unrestricted - Cursor: ability - ChargeInterval: 10500 - Description: Cluster Missile - LongDesc: Launches an Cluster Missile,\nCauses damage over a large area. - EndChargeSpeechNotification: ClusMissileReady - SelectTargetSpeechNotification: SelectTarget - InsufficientPowerSpeechNotification: InsufficientPower - IncomingSpeechNotification: MissileLaunchDetected - MissileWeapon: deathhand - MissilePalette: temptd - LaunchSound: icbm1.aud - IncomingSound: icbm1.aud - SpawnOffset: 1024,80,0 - DetonationAltitude: 3c0 - RemoveMissileOnDetonation: True - FlightDelay: 225 - FlightVelocity: 0c624 - DisplayRadarPing: True - CameraRange: 10c0 - ArrowSequence: arrow - ClockSequence: clockTD - CircleSequence: circles - PauseOnCondition: disabled || empdisable || being-warped - TrailImage: smokey2 - TrailSequences: idle - TrailPalette: tseffect-ignore-lighting-alpha75 - DisplayBeacon: True - BeaconPoster: clustermissile - BeaconPosterPalette: temptd - CircleRanges: 3c0 - CircleColor: BB0000AA - CircleBorderColor: 770000AA WithBuildingBib: - GrantExternalConditionPowerCA@FSHIELD: - OrderName: fshield - Icon: forceshield - ChargeInterval: 7500 - Condition: forceshield - Dimensions: 7, 7 - Footprint: ___x___ __xxx__ _xxxxx_ xxxxxxx _xxxxx_ __xxx__ ___x___ - Duration: 250 - Prerequisites: ~forceshield.enabled, ~techlevel.high - Weapon: ForceShield - ActivationDelay: 5 - AirburstAltitude: 0c0 - AllowMultiple: false - Sequence: false-active - Description: Force Shield - LongDesc: Makes selected friendly structures temporarily invulnerable.\n Warning: Causes power failure. - OnFireSound: forceon.aud - DisplayTimerRelationships: Ally - SelectTargetSpeechNotification: SelectTarget - InsufficientPowerSpeechNotification: InsufficientPower - EndChargeSpeechNotification: ForceShieldReady - DisplayRadarPing: True - Cursor: ability - PauseOnCondition: disabled || empdisable || being-warped - GrantExternalConditionPowerCA@Frenzy: - OrderName: frenzy - Icon: frenzy - Prerequisites: ~tmpl.marked, ~techlevel.high - ChargeInterval: 6750 - Weapon: Frenzy - Description: Frenzy - Condition: frenzy - Dimensions: 5, 5 - Footprint: _xxx_ xxxxx xxxxx xxxxx _xxx_ - ValidRelationships: Ally - Duration: 500 - ActivationDelay: 0 - AirburstAltitude: 0c0 - Sequence: false-active - AllowMultiple: false - LongDesc: Temporarily increases ground unit movement and attack speed. - OnFireSound: nodfrenzy.aud - SelectTargetSpeechNotification: SelectTarget - InsufficientPowerSpeechNotification: InsufficientPower - DisplayRadarPing: True - Cursor: ability - PauseOnCondition: disabled || empdisable || being-warped - DisplayTimerRelationships: Ally SupportPowerChargeBar: Power: Amount: -150 @@ -4674,53 +4686,62 @@ TMPL: RequiredForShortGame: false WithSupportPowerActivationAnimation: RequiresCondition: !build-incomplete - Targetable: - TargetTypes: Ground, C4, DetonateAttack, Structure, SabInfiltrate - InfiltrateForSupportPower@STOLENTECH: - Types: SabInfiltrate - Proxy: stolentech.tmpl ValidFactions: - Factions: blackh, marked, legion, shadow + Factions: nod, blackh, marked, legion, shadow ProvidesPrerequisite@buildingname: - ProvidesPrerequisite: - Prerequisite: techcenter + RequiresCondition: !tech-locked + ProvidesPrerequisite@anytechcenter: + Prerequisite: techcenter.any + RequiresCondition: !tech-locked + ProvidesPrerequisite@tdtek: + Prerequisite: techcenter.td + RequiresCondition: !tech-locked + ProvidesPrerequisite@ObeliskOrTemple: + Prerequisite: obliortmpl + RequiresCondition: !tech-locked ProvidesPrerequisiteValidatedFaction@blackhtmpl: Factions: blackh Prerequisite: tmpl.blackh + RequiresCondition: !tech-locked ProvidesPrerequisiteValidatedFaction@markedtmpl: Factions: marked Prerequisite: tmpl.marked + RequiresCondition: !tech-locked ProvidesPrerequisiteValidatedFaction@legiontmpl: Factions: legion Prerequisite: tmpl.legion + RequiresCondition: !tech-locked ProvidesPrerequisiteValidatedFaction@shadowtmpl: Factions: shadow Prerequisite: tmpl.shadow - Production: - Produces: Upgrade - PauseOnCondition: forceshield || invulnerability || being-warped - ProductionBar: - ProductionType: Upgrade - Exit: + RequiresCondition: !tech-locked + GrantExternalConditionPowerCA@FSHIELD: + ActiveSequence: false-active + Encyclopedia: + Category: Nod/Buildings PRIS: Inherits: ^Defense Inherits@IDISABLE: ^DisableOnLowPowerOrPowerDown Inherits@AUTOTARGET: ^AutoTargetGround Buildable: - Queue: Defense - BuildPaletteOrder: 90 - Prerequisites: anyradar, ~structures.pris, ~techlevel.high - Description: Advanced experimental base defense.\n Requires power to operate.\n Can detect cloaked units.\n Strong vs Vehicles, Infantry\n Weak vs Aircraft + Queue: DefenseSQ, DefenseMQ + BuildPaletteOrder: 80 + Prerequisites: anyradar, ~structures.pris, ~techlevel.medium + Description: Advanced experimental base defense. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor, Infantry + Weaknesses: • Cannot attack Aircraft + Attributes: • Requires power to operate\n• Detects cloaked units\n• Beam can chain with nearby Prism Towers Valued: - Cost: 1300 + Cost: 1350 Tooltip: Name: Prism Tower Building: Selectable: - DecorationBounds: 24,46,0,-10 + DecorationBounds: 1024, 1962, 0, -560 Health: - HP: 35000 + HP: 40000 Armor: Type: Concrete RevealsShroud: @@ -4735,8 +4756,7 @@ PRIS: PauseOnCondition: disabled || empdisable || being-warped WithPrismChargeAnimation: AttackPrismSupported: - RequiresCondition: !build-incomplete - PauseOnCondition: disabled + PauseOnCondition: build-incomplete || disabled || empdisable || being-warped ChargeAudio: bpripow.aud MaxCharges: 1 ReloadDelay: 40 @@ -4763,32 +4783,44 @@ PRIS: Weapon: PrisLaserSupport LocalOffset: 0,0,1024 Power: - Amount: -75 + Amount: -80 ProvidesPrerequisite@buildingname: WithRangeCircle@SUPPORT: + Type: PrismSupport + Range: 5c0 + Color: ffffff66 + WithPrismLinkVisualization: Range: 5c0 + Color: 00ffffff + Encyclopedia: + Category: Allies/Defenses SPEN.nod: Inherits: ^Building - Inherits@PRIMARY: ^PrimaryBuilding + Inherits@WATERSTRUCTURE: ^WaterStructure + Inherits@NAV: ^ProducesNaval RenderSprites: Image: SPENNOD PlayerPalette: playernavy - InfiltrateForSupportPower: - Types: SpyInfiltrate + InfiltrateToCreateProxyActor: + Types: GrantSupportPowerInfiltrate Proxy: powerproxy.sonarpulse + InfiltrationNotification: BuildingInfiltrated + InfiltratedNotification: BaseAttack + PlayerExperience: 15 Valued: Cost: 800 Tooltip: Name: Sub Pen Buildable: - Queue: Building - BuildPaletteOrder: 50 + Queue: BuildingSQ, BuildingMQ + BuildPaletteOrder: 240 IconPalette: chrometd Prerequisites: anypower, ~structures.nod, ~techlevel.navy, ~techlevel.low Description: Produces and repairs\nsubmarines and transports. - Targetable: - TargetTypes: Ground, Water, WaterStructure, Structure, C4, DetonateAttack, SpyInfiltrate + Targetable@INFILTRATION: + RequiresCondition: !being-warped + TargetTypes: GrantSupportPowerInfiltrate Building: Footprint: XXX xxx XXX Dimensions: 3,3 @@ -4811,38 +4843,31 @@ SPEN.nod: SpawnOffset: 0,-213,0 Facing: 384 ExitCell: -1,2 - ProductionTypes: Submarine, Ship Exit@2: RequiresCondition: !being-captured SpawnOffset: 0,-213,0 Facing: 640 ExitCell: 3,2 - ProductionTypes: Submarine, Ship Exit@3: RequiresCondition: !being-captured SpawnOffset: 0,0,0 Facing: 0 ExitCell: 1,0 - ProductionTypes: Submarine, Ship - Production: - Produces: Ship, Submarine - PauseOnCondition: forceshield || invulnerability || being-warped RepairsUnits: HpPerStep: 1000 StartRepairingNotification: Repairing + StartRepairingTextNotification: Repairing. FinishRepairingNotification: UnitRepaired - PlayerExperience: 15 + FinishRepairingTextNotification: Unit repaired. RequiresCondition: !forceshield && !invulnerability && !being-warped RallyPoint: - ProductionBar: - ProductionType: Ship Power: Amount: -30 ProvidesPrerequisite@buildingname: MapEditorData: ExcludeTilesets: INTERIOR DetectCloaked: - CloakTypes: Underwater + DetectionTypes: Underwater Range: 10c0 RequiresCondition: !(empdisable || being-warped) RenderDetectionCircle: @@ -4857,28 +4882,36 @@ SPEN.nod: BottomRight: 555, 1110 -SpawnActorOnDeath: -SpawnRandomActorOnDeath: - -SpawnActorsOnSell: + -SpawnActorsOnSellCA: + Encyclopedia: + Category: Nod/Buildings SYRD.gdi: Inherits: ^Building - Inherits@PRIMARY: ^PrimaryBuilding + Inherits@WATERSTRUCTURE: ^WaterStructure + Inherits@NAV: ^ProducesNaval RenderSprites: Image: GSYRD PlayerPalette: playernavy - InfiltrateForSupportPower: - Types: SpyInfiltrate + InfiltrateToCreateProxyActor: + Types: GrantSupportPowerInfiltrate Proxy: powerproxy.sonarpulse + InfiltrationNotification: BuildingInfiltrated + InfiltratedNotification: BaseAttack + PlayerExperience: 15 Buildable: - Queue: Building - BuildPaletteOrder: 40 + Queue: BuildingSQ, BuildingMQ + BuildPaletteOrder: 230 Prerequisites: anypower, ~structures.gdi, ~techlevel.navy, ~techlevel.low Description: Produces and repairs ships\nand transports. + IconPalette: chrometd Valued: Cost: 1000 Tooltip: Name: Naval Yard - Targetable: - TargetTypes: Ground, Water, WaterStructure, Structure, C4, DetonateAttack, SpyInfiltrate + Targetable@INFILTRATION: + RequiresCondition: !being-warped + TargetTypes: GrantSupportPowerInfiltrate Building: Footprint: XXX xxx XXX Dimensions: 3,3 @@ -4901,44 +4934,36 @@ SYRD.gdi: SpawnOffset: -1024,1024,0 Facing: 640 ExitCell: 0,2 - ProductionTypes: Ship, Boat Exit@2: RequiresCondition: !being-captured SpawnOffset: 1024,1024,0 Facing: 896 ExitCell: 2,2 - ProductionTypes: Ship, Boat Exit@3: RequiresCondition: !being-captured SpawnOffset: -1024,-1024,0 Facing: 384 ExitCell: 0,0 - ProductionTypes: Ship, Boat Exit@4: RequiresCondition: !being-captured SpawnOffset: 1024,-1024,0 Facing: 128 ExitCell: 2,0 - ProductionTypes: Ship, Boat - Production: - Produces: Ship, Boat - PauseOnCondition: forceshield || invulnerability || being-warped RepairsUnits: HpPerStep: 1000 StartRepairingNotification: Repairing + StartRepairingTextNotification: Repairing. FinishRepairingNotification: UnitRepaired - PlayerExperience: 15 + FinishRepairingTextNotification: Unit repaired. RequiresCondition: !forceshield && !invulnerability && !being-warped RallyPoint: - ProductionBar: - ProductionType: Ship Power: Amount: -30 ProvidesPrerequisite@buildingname: MapEditorData: ExcludeTilesets: INTERIOR DetectCloaked: - CloakTypes: Underwater + DetectionTypes: Underwater Range: 10c0 RequiresCondition: !(empdisable || being-warped) RenderDetectionCircle: @@ -4954,7 +4979,9 @@ SYRD.gdi: BottomRight: 512, 1110 -SpawnActorOnDeath: -SpawnRandomActorOnDeath: - -SpawnActorsOnSell: + -SpawnActorsOnSellCA: + Encyclopedia: + Category: GDI/Buildings HTUR: Inherits: ^Defense @@ -4962,12 +4989,16 @@ HTUR: Inherits@IDISABLE: ^DisableOnLowPowerOrPowerDown Inherits@SHAPE: ^2x2Shape Buildable: - Queue: Defense - BuildPaletteOrder: 100 - Prerequisites: anyradar, ~structures.france, ~techlevel.high - Description: Artillery base defense.\n Requires power to operate.\n Can detect cloaked units.\n Strong vs Ground Units\n Weak vs Aircraft + Queue: DefenseSQ, DefenseMQ + BuildPaletteOrder: 80 + Prerequisites: anyradar, ~structures.france, ~techlevel.medium + Description: Artillery base defense. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor, Infantry + Weaknesses: • Cannot attack Aircraft\n• Cannot hit targets at point-blank range + Attributes: • Requires power to operate\n• Detects cloaked units Valued: - Cost: 1650 + Cost: 1750 Tooltip: Name: Grand Cannon Building: @@ -4987,90 +5018,123 @@ HTUR: TurnSpeed: 8 InitialFacing: 0 RealignDelay: -1 - -WithSpriteBody: - WithEmbeddedTurretSpriteBody: - PauseOnCondition: disabled || empdisable || being-warped - AttackTurreted: RequiresCondition: !build-incomplete PauseOnCondition: disabled || empdisable || being-warped - Armament: + WithSpriteTurret: + RequiresCondition: !build-incomplete + AttackTurreted: + PauseOnCondition: build-incomplete || disabled || empdisable || being-warped + Armament@1: Weapon: 203mm MuzzleSequence: muzzle - LocalOffset: 1000,200,60, 1000,0,60, 1000,-200,60 - WithMuzzleOverlay: - Power: + LocalOffset: 1000,0,60 + Armament@2: + Weapon: 203mm.Inacc + MuzzleSequence: muzzle + LocalOffset: 1000,200,60 + FireDelay: 10 + Armament@3: + Weapon: 203mm.Inacc + MuzzleSequence: muzzle + LocalOffset: 1000,-200,60 + FireDelay: 20 + WithMuzzleOverlay: + Power: Amount: -100 ClassicFacingBodyOrientation: - Explodes: + FireWarheadsOnDeath: Weapon: BuildingExplode EmptyWeapon: BuildingExplode WithBuildingBib: HasMinibib: true Selectable: - Bounds: 48,48 + Bounds: 2048, 2048 DetectCloaked: RequiresCondition: !(disabled || empdisable || being-warped) -ProductionCostMultiplier@FranceBonus: + Encyclopedia: + Category: Allies/Defenses + EncyclopediaExtras: + Subfaction: france GUN.Nod: Inherits: GUN RenderSprites: Image: gun2 - PlayerPalette: overlayplayertd + PlayerPalette: playertd ActorPreviewPlaceBuildingPreview: - OverridePalette: placebuildingtd Buildable: - Prerequisites: infantry.any, ~structures.nod, ~techlevel.medium + Prerequisites: infantry.any, ~structures.nod, ~techlevel.low IconPalette: chrometd Armament: Weapon: TurretGunTD + Encyclopedia: + Category: Nod/Defenses LTUR: Inherits: GUN.Nod RenderSprites: Image: ltur + Health: + HP: 40000 Valued: Cost: 600 + CustomSellValue: + Value: 300 Tooltip: Name: Laser Turret Buildable: BuildPaletteOrder: 60 Prerequisites: infantry.any, ~structures.nod, ~techlevel.low - Description: Anti-infantry base defense.\n Can detect cloaked units.\n Strong vs Infantry, Light armor\n Weak vs Tanks, Aircraft + Description: Anti-infantry base defense. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor + Weaknesses: • Weak vs Heavy Armor\n• Cannot attack Aircraft + Attributes: • Detects cloaked units Turreted: InitialFacing: 128 -WithTurretAttackAnimation: - GrantConditionOnFaction@marked: - Condition: marked - Factions: marked + GrantConditionOnPrerequisite@QUANTUM: + Condition: quantum-upgrade + Prerequisites: quantum.upgrade -Armament: Armament: Weapon: LaserTur LocalOffset: 512,0,172 - RequiresCondition: !marked + RequiresCondition: !quantum-upgrade Armament@Marked: Weapon: LaserTur.Adv LocalOffset: 512,0,172 - RequiresCondition: marked + RequiresCondition: quantum-upgrade Power: - Amount: -20 + Amount: -15 + DetectCloaked: + Range: 5c0 + Encyclopedia: + Category: Nod/Defenses TTUR: Inherits: ^DefenseTD Inherits@AUTOTARGET: ^AutoTargetGround Buildable: - Queue: Defense + Queue: DefenseSQ, DefenseMQ BuildPaletteOrder: 60 Prerequisites: infantry.any, ~structures.iraq, ~techlevel.low IconPalette: chrometd - Description: Anti-infantry base defense.\n Can detect cloaked units.\n Strong vs Infantry, Light armor\n Weak vs Tanks, Aircraft + Description: Anti-infantry base defense. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor + Weaknesses: • Cannot attack Aircraft\n• Has difficulty hitting moving targets + Attributes: • Detects cloaked units Valued: Cost: 650 + CustomSellValue: + Value: 220 Tooltip: Name: Chemical Tower Building: Health: - HP: 34000 + HP: 44000 Armor: Type: Concrete RevealsShroud: @@ -5088,30 +5152,42 @@ TTUR: Weapon: ChemballLauncher LocalOffset: 512,0,0 AttackTurreted: - PauseOnCondition: empdisable || being-warped - RequiresCondition: !build-incomplete + PauseOnCondition: build-incomplete || empdisable || being-warped -QuantizeFacingsFromSequence: ClassicFacingBodyOrientation: QuantizedFacings: 8 Power: - Amount: -20 + Amount: -15 ProvidesPrerequisite@buildingname: ProvidesPrerequisite@ftur: Prerequisite: ftur - Explodes: + ProvidesPrerequisite@FlameTowerOrRadar: + Prerequisite: fturorradar + ProvidesPrerequisite@ChemTowerOrSovietTechCenter: + Prerequisite: tturorstek + FireWarheadsOnDeath: Weapon: BuildingExplode EmptyWeapon: BuildingExplode + DetectCloaked: + Range: 5c0 + Encyclopedia: + Category: Soviets/Defenses + EncyclopediaExtras: + Subfaction: iraq SGEN: Inherits: ^Building Inherits@IDISABLE: ^DisableOnLowPowerOrPowerDownOrForceDisable + Inherits@TIBSTEALTHPOWER: ^TibStealthPower Buildable: - Queue: Defense + Queue: DefenseSQ, DefenseMQ BuildPaletteOrder: 130 - Prerequisites: tmpl, ~structures.nod, ~techlevel.unrestricted + Prerequisites: tmpl, ~structures.nod, ~!player.shadow, ~techlevel.high BuildLimit: 1 IconPalette: chrometd - Description: Makes a group of units/structures invisible for a short time.\n Requires power to operate.\n Maximum 1 can be built.\n Special Ability: Tiberium Stealth + Description: Makes a group of units/structures invisible for a short time. + TooltipExtras: + Attributes: • Maximum 1 can be built\n• Cloaks nearby units and structures when not active\n• Requires power to operate\n• Special Ability: Tiberium Stealth Valued: Cost: 1500 Tooltip: @@ -5136,32 +5212,8 @@ SGEN: Range: 5c0 RequiresCondition: !disabled WithBuildingBib: - GrantExternalConditionPowerCA@STEALTHGEN: - Prerequisites: techlevel.unrestricted - OrderName: stealthgen - Icon: invis - IconPalette: chrometd - ChargeInterval: 4500 - Weapon: StealthBubble - Description: Tiberium Stealth - Condition: invisibility - ValidRelationships: Ally, Neutral, Enemy - Dimensions: 11, 11 - Footprint: _____x_____ ___xxxxx___ __xxxxxxx__ _xxxxxxxxx_ _xxxxxxxxx_ xxxxxxxxxxx _xxxxxxxxx_ _xxxxxxxxx_ __xxxxxxx__ ___xxxxx___ _____x_____ - Duration: 900 - ActivationDelay: 0 - AirburstAltitude: 0c0 - AllowMultiple: false - LongDesc: Makes vehicles and structures temporarily invisible.\n Warning: Harmful to Infantry. - OnFireSound: cloak6.aud - SelectTargetSpeechNotification: SelectTarget - InsufficientPowerSpeechNotification: InsufficientPower - BeginChargeSpeechNotification: ChemStealthCharging - EndChargeSpeechNotification: ChemStealthReady - DisplayRadarPing: True - Cursor: chemmissile - PauseOnCondition: disabled || empdisable || being-warped - DisplayTimerRelationships: Ally, Neutral, Enemy + ExternalCondition@ACTIVE: + Condition: active SupportPowerChargeBar: Power: Amount: -200 @@ -5171,62 +5223,124 @@ SGEN: UseTargetableCellsOffsets: true Type: Rectangle TopLeft: -1536, -1024 - BottomRight: 1024, 1024 + BottomRight: 1536, 1024 + ProvidesPrerequisite@buildingname: InfiltrateForSupportPowerReset: - Types: SpyInfiltrate, SabInfiltrate - Targetable: - TargetTypes: Ground, Structure, C4, DetonateAttack, SpyInfiltrate, SabInfiltrate + Types: ResetSupportPowerInfiltrate + InfiltrationNotification: BuildingInfiltrated + InfiltratedNotification: BaseAttack + PlayerExperience: 15 + Targetable@INFILTRATION: + RequiresCondition: !being-warped + TargetTypes: ResetSupportPowerInfiltrate + WithRangeCircle@SGEN: + Type: StealthGenerator + Range: 7c512 + Color: 00aa00 + ProximityExternalCondition@SGEN: + Range: 7c512 + Condition: sgencloak + MaximumVerticalOffset: 512 + AffectsParent: true + RequiresCondition: !disabled && !empdisable && !being-warped && !active && !cloak-force-disabled + GrantConditionOnDamageState@UNCLOAK: + Condition: cloak-force-disabled + ValidDamageStates: Critical + Encyclopedia: + Category: Nod/Buildings + +SGEN.Shadow: + Inherits: SGEN + Buildable: + Prerequisites: tmpl, ~structures.nod, ~player.shadow, ~techlevel.high + TooltipExtras: + Attributes: • Maximum 1 can be built\n• Cloaks nearby units and structures\n• Requires power to operate\n• Special Ability: Tiberium Stealth + WithRangeCircle@SGEN: + Range: 11c512 + ProximityExternalCondition@SGEN: + Range: 11c512 + RequiresCondition: !disabled && !empdisable && !being-warped + RenderSprites: + Image: sgen + GrantExternalConditionPowerCA@SGEN: + -ActiveCondition: + -ExternalCondition@ACTIVE: + -GrantConditionOnDamageState@UNCLOAK: + -Encyclopedia: CRAM: Inherits: AGUN Buildable: - Prerequisites: anyradar, ~structures.gdi, ~techlevel.medium + Prerequisites: vehicles.any, ~structures.gdi, ~techlevel.medium IconPalette: chrometd - Description: Anti-aircraft base defense.\n Requires power to operate.\n Can detect cloaked units.\n Strong vs Aircraft\n Weak vs Ground Units -Armament: -WithTurretAttackAnimation: - Armament@GAT0: - Weapon: Gatt.0 - LocalOffset: 520,0,450 - MuzzleSequence: muzzle - RequiresCondition: gattling == 0 - Armament@GAT1: - Weapon: Gatt.1 - LocalOffset: 520,0,450 - MuzzleSequence: muzzle - RequiresCondition: gattling == 1 - Armament@GAT2: - Weapon: Gatt.2 - LocalOffset: 520,0,450 - MuzzleSequence: muzzle - RequiresCondition: gattling == 2 - Armament@GAT3: - Weapon: Gatt.3 + Armament@GAT: + Weapon: Gatt LocalOffset: 520,0,450 MuzzleSequence: muzzle - RequiresCondition: gattling == 3 + WithEjectedCasings: + CasingWeapon: BrassDebris + CasingSpawnLocalOffset: 0,-225,200 + CasingTargetOffset: 0, -600, 0 + FirepowerMultiplier@GAT1: + Modifier: 115 + RequiresCondition: firing && gatling == 1 + FirepowerMultiplier@GAT2: + Modifier: 130 + RequiresCondition: firing && gatling == 2 + FirepowerMultiplier@GAT3: + Modifier: 145 + RequiresCondition: firing && gatling >= 3 + AmbientSoundCA@ATTACKSOUNDINITIAL: + SoundFiles: vvullo1a.aud + RequiresCondition: firing && gatling < 1 + AmbientSoundCA@ATTACKSOUND1: + SoundFiles: vvullo2a.aud, vvullo2b.aud, vvullo2c.aud + FinalSound: vvullo3a.aud + RequiresCondition: firing && gatling == 1 + AmbientSoundCA@ATTACKSOUND2: + InitialSound: vvullo4a.aud + SoundFiles: vvullo5a.aud, vvullo5b.aud + FinalSound: vvullo6a.aud + RequiresCondition: firing && gatling == 2 + AmbientSoundCA@ATTACKSOUND3: + InitialSound: vvullo7a.aud + SoundFiles: vvullo8a.aud, vvullo8b.aud + FinalSound: vvullo9a.aud + RequiresCondition: firing && gatling >= 3 + GrantConditionOnAttackCA@FIRING: + ArmamentNames: primary + Condition: firing + RevokeDelay: 6 GrantConditionOnAttack: - Condition: gattling - RequiredShotsPerInstance: 1,7,12 + Condition: gatling + RequiredShotsPerInstance: 1,2,4 MaximumInstances: 3 RevokeDelay: 55 RevokeOnNewTarget: False RevokeAll: True + Encyclopedia: + Category: GDI/Defenses LASP: Inherits: ^Building - Inherits@IDISABLE: ^DisableOnLowPowerOrPowerDown + Inherits@IDISABLE: ^DisableOnLowPowerOrPowerDownOrForceDisable Buildable: - Queue: Defense + Queue: DefenseSQ, DefenseMQ BuildPaletteOrder: 30 Prerequisites: ~structures.nod, nuk2, ~techlevel.medium IconPalette: chrometd - Description: Stops infantry and blocks enemy fire.\n Cannot be crushed by tanks. + Description: • Stops infantry\n• Blocks enemy fire\n• Cannot be crushed by tanks + Building: + RequiresBaseProvider: False Valued: Cost: 200 CustomSellValue: Value: 0 + -GivesBuildableArea: RequiresBuildableArea: + AreaTypes: building, defense Adjacent: 7 Tooltip: Name: Laser Fence @@ -5242,10 +5356,9 @@ LASP: Armor: Type: Concrete Sellable: - RequiresCondition: !build-incomplete && !c4 && !being-warped && !hacked + RequiresCondition: !disabled && !empdisable && !c4 && !being-warped && !hacked -Capturable: -CaptureNotification: - -ProximityCaptor: -CaptureManager: -CapturableProgressBar: -CapturableProgressBlink: @@ -5262,11 +5375,16 @@ LASP: LineBuildNode: Types: laserfencenode LineBuildSegmentExternalCondition: - RequiresCondition: !build-incomplete && !disabled && !empdisable && !being-warped && !hacked + RequiresCondition: !disabled && !empdisable && !being-warped && !hacked Condition: active-posts - Explodes@TEMPORAL: + FireWarheadsOnDeath@TEMPORAL: Weapon: TemporalExplode EmptyWeapon: TemporalExplode + -SpawnActorsOnSellCA: + -SpawnActorOnDeath: + -SpawnRandomActorOnDeath: + Encyclopedia: + Category: Nod/Defenses LASF: Inherits: ^Wall @@ -5287,6 +5405,7 @@ LASF: EnergyWall: ActiveCondition: active-posts == 2 Weapon: LaserFence + TerrainTypes: Clear, Rough, Road GrantConditionOnLineBuildDirection@X: Direction: X Condition: laserfence-direction-x @@ -5319,19 +5438,22 @@ LASF: DamageMultiplier: # Prevent all normal damage, but still allows direct kills from the post Modifier: 0 Interactable: - Bounds: 48, 24 + Bounds: 2048, 1024 PATR: - Inherits: ^DefenseTD + Inherits: ^BuildingTD Inherits@IDISABLE: ^DisableOnLowPowerOrPowerDownOrForceDisable Inherits@SHAPE: ^2x2Shape + Inherits@EMPMISSILEPOWER: ^EmpMissilePower Buildable: - Queue: Defense + Queue: DefenseSQ, DefenseMQ BuildPaletteOrder: 130 - Prerequisites: gtek, ~structures.gdi, ~techlevel.unrestricted + Prerequisites: gtek, ~structures.gdi, ~techlevel.high BuildLimit: 1 IconPalette: chrometd - Description: Launches E.M. Pulse Missiles that disable vehicles & structures.\n Requires power to operate.\n Maximum 1 can be built.\n Special Ability: E.M. Pulse Missile + Description: Launches E.M. Pulse Missiles that disable vehicles & structures. + TooltipExtras: + Attributes: • Maximum 1 can be built\n• Requires power to operate\n• Special Ability: E.M. Pulse Missile Valued: Cost: 1500 Tooltip: @@ -5342,7 +5464,7 @@ PATR: Health: HP: 100000 Armor: - Type: Concrete + Type: Wood RevealsShroud: MinRange: 5c0 Range: 6c0 @@ -5355,9 +5477,11 @@ PATR: Range: 5c0 RequiresCondition: !disabled Turreted: - TurnSpeed: 8 + TurnSpeed: 15 InitialFacing: 192 RealignDelay: -1 + RequiresCondition: !build-incomplete + PauseOnCondition: disabled || empdisable || being-warped -WithSpriteBody: WithEmbeddedTurretSpriteBody: PauseOnCondition: disabled || empdisable || being-warped @@ -5365,25 +5489,17 @@ PATR: Sequences: empty Interval: 0 RequiresCondition: !loaded-rocket - AttackTurreted: - PauseOnCondition: disabled || empdisable || being-warped - RequiresCondition: !build-incomplete && loaded-rocket > 0 + AttackTurretedCharged: + PauseOnCondition: build-incomplete || disabled || empdisable || being-warped + RequiresCondition: loaded-rocket > 0 + ChargeLevel: 35 + DischargeRate: 35 + ShowSelectionBar: true + SelectionBarColor: FFFFFF + ChargeWhileTurning: true Armament: Weapon: EMPMissileLauncher LocalOffset: 511,396,511 - AttackOrderPower@EMPMISSILE: - OrderName: empmissile - PauseOnCondition: empdisable || disabled || being-warped - Cursor: empmissile - Icon: empmissile - ChargeInterval: 4500 - Description: E.M. Missile - LongDesc: Fires a Tomahawk missile which disables\nall mechanical units in the area. - BeginChargeSpeechNotification: EMMissilePrepping - EndChargeSpeechNotification: EMMissileReady - SelectTargetSpeechNotification: SelectTarget - InsufficientPowerSpeechNotification: InsufficientPower - DisplayTimerRelationships: Ally, Neutral, Enemy AmmoPool: Ammo: 1 ReloadCount: 1 @@ -5393,52 +5509,177 @@ PATR: Count: 1 SupportPowerChargeBar: Power: - Amount: -150 + Amount: -200 ClassicFacingBodyOrientation: - Explodes: - Weapon: BuildingExplode - EmptyWeapon: BuildingExplode WithBuildingBib: HasMinibib: true Selectable: - Bounds: 48,48 + Bounds: 2048, 2048 RejectsOrders: + Except: Stop, Sell, PowerDown + RequiresCondition: !loaded-rocket + RejectsOrders@LOADED: Except: Sell, PowerDown + RequiresCondition: loaded-rocket + ProvidesPrerequisite@buildingname: InfiltrateForSupportPowerReset: - Types: SpyInfiltrate, SabInfiltrate - Targetable: - TargetTypes: Ground, Structure, C4, DetonateAttack, SpyInfiltrate, SabInfiltrate + Types: ResetSupportPowerInfiltrate + InfiltrationNotification: BuildingInfiltrated + InfiltratedNotification: BaseAttack + PlayerExperience: 15 + Targetable@INFILTRATION: + RequiresCondition: !being-warped + TargetTypes: ResetSupportPowerInfiltrate + RenderRangeCircle: + RangeCircleType: DefenseRange + Color: C12900 + -WithDeathAnimation: + Encyclopedia: + Category: GDI/Buildings + +CVAT: + Inherits: ^Building + Inherits@IDISABLE: ^DisableOnLowPowerOrPowerDownOrForceDisable + Inherits@SHAPE: ^2x2Shape + Inherits@TECHLOCKABLE: ^TechLockable + HitShape: + UseTargetableCellsOffsets: false + TargetableOffsets: 0,0,0, 630,-512,0, 355,512,0, -281,-512,0, -630,512,0 + Tooltip: + Name: Cloning Vat + Building: + Footprint: xx xx ++ + Dimensions: 2,3 + LocalCenterOffset: 0,-1024,0 + Buildable: + Queue: BuildingSQ, BuildingMQ + BuildPaletteOrder: 200 + Prerequisites: ~structures.soviet, stek, playerxp.level3, ~infantry.doctrine, ~techlevel.high + Description: Clones infantry periodically at no cost. + BuildLimit: 1 + TooltipExtras: + Attributes: • Maximum 1 can be built\n• Cannot be captured or hacked\n• Clones any infantry unit put inside + Valued: + Cost: 2000 + Health: + HP: 120000 + Armor: + Type: Wood + RevealsShroud: + MinRange: 4c0 + Range: 5c0 + RevealGeneratedShroud: False + RevealsShroud@GAPGEN: + Range: 4c0 + WithBuildingBib: + -Capturable: + -CaptureNotification: + -CapturableProgressBar: + -CapturableProgressBlink: + -CaptureManager: + Production: + Produces: Clone + PauseOnCondition: tech-locked || being-warped + Exit@1: + SpawnOffset: -700,1000,0 + ExitCell: -2,2 + Facing: 90 + Exit@2: + SpawnOffset: 190,-400,0 + ExitCell: 2,-1 + RallyPoint: + Power: + Amount: -150 + WithDeathAnimation: + DeathSequence: dead + UseDeathTypeSuffix: false + ProvidesPrerequisite@buildingname: + RequiresCondition: !tech-locked Sellable: - RequiresCondition: !build-incomplete && !(c4 || tnt) && !being-captured && !being-warped && !hacked - CaptureManager: - BeingCapturedCondition: being-captured - Capturable: - RequiresCondition: !build-incomplete && !being-warped - Types: building - CapturableProgressBar: - CapturableProgressBlink: - -Targetable@MINDCONTROL: + RequiresCondition: !build-incomplete && !c4 && !being-warped + SpawnActorOnDeath: + RequiresCondition: !being-warped + SpawnRandomActorOnDeath: + RequiresCondition: !being-warped + WithDecoration@TechLock: + RequiresCondition: tech-locked + -MindControllable@HACKABLE: + -Targetable@HACKABLE: + -MindControllableProgressBar@HACKABLE: + -WithDecoration@HACKED: + -WithDecoration@RESTORING: + -PowerMultiplier@HACKED: + Encyclopedia: + Category: Soviets/Buildings + GrantExternalConditionToProduced: + Condition: produced + CargoCloner@SQ: + Types: Clone + OverrideUnitBuildDurationModifier: true + BuildDurationModifier: 120 + ReadyAudio: UnitReady + BlockedAudio: NoBuild + BlockedTextNotification: Unable to build more. + ShowSelectionBar: true + PauseOnCondition: tech-locked || being-warped || disabled + RequiresCondition: !global-multiqueue + EmptyFallbackActor: e1 + CargoCloner@MQ: + Types: Clone + OverrideUnitBuildDurationModifier: true + BuildDurationModifier: 80 + ReadyAudio: UnitReady + BlockedAudio: NoBuild + BlockedTextNotification: Unable to build more. + ShowSelectionBar: true + PauseOnCondition: tech-locked || being-warped || disabled + RequiresCondition: global-multiqueue + EmptyFallbackActor: e1 + Cargo: + MaxWeight: 1 + Types: Infantry, Brute, Hacker + WithCargoPipsDecoration: + Position: BottomLeft + Margin: 4, 3 + RequiresSelection: true + CustomPipSequences: + gray: pip-gray + yellow: pip-yellow + red: pip-red + blue: pip-blue + WithCargoSounds: + EnterSounds: genter1a.aud + ExitSounds: gexit1a.aud + GrantConditionOnPrerequisite@MQF: + Condition: global-multiqueue + Prerequisites: global.multiqueuefull + GrantConditionOnPrerequisite@MQS: + Condition: global-multiqueue + Prerequisites: global.multiqueuescaled INDP: Inherits: ^Building Inherits@POWER_OUTAGE: ^DisableOnLowPowerOrForceDisabled Inherits@SHAPE: ^3x2Shape + Inherits@TECHLOCKABLE: ^TechLockable Selectable: - Bounds: 72,56,0,12 - DecorationBounds: 73,72 + Bounds: 3072, 2816, 0, -256 + HitShape: + Type: Rectangle + TopLeft: -1536, -1024 + BottomRight: 1536, 1280 WithSpriteBody: PauseOnCondition: disabled || being-warped - HitShape: - UseTargetableCellsOffsets: false - TargetableOffsets: 0,0,0, 640,-384,0, 640,512,0, -710,-512,0, -710,512,0 Buildable: - Queue: Building + Queue: BuildingSQ, BuildingMQ BuildPaletteOrder: 200 - Prerequisites: ~structures.soviet, stek, ~techlevel.high - Description: Vehicles & aircraft are produced 15% faster and cost 5% less.\n Maximum 1 can be built.\n Cannot be captured or hacked. + Prerequisites: ~structures.soviet, stek, playerxp.level3, ~armor.doctrine, ~techlevel.high + Description: Vehicles & aircraft are produced 15% faster and cost 10% less. BuildLimit: 1 + TooltipExtras: + Attributes: • Maximum 1 can be built\n• Cannot be captured or hacked Valued: - Cost: 2500 + Cost: 2000 -Capturable: -CaptureNotification: -CapturableProgressBar: @@ -5447,13 +5688,13 @@ INDP: Tooltip: Name: Industrial Plant Building: - Footprint: ___ xxx xxx === - Dimensions: 3,4 + Footprint: xxx xxx === + Dimensions: 3,3 LocalCenterOffset: 0,-512,0 Health: - HP: 80000 + HP: 120000 Armor: - Type: Concrete + Type: Wood RevealsShroud: MinRange: 4c0 Range: 5c0 @@ -5467,44 +5708,121 @@ INDP: DeathSequence: dead UseDeathTypeSuffix: false ProvidesPrerequisite@buildingname: + RequiresCondition: !tech-locked ProvidesPrerequisite@disabled: Prerequisite: indplowpower RequiresCondition: disabled || empdisable || being-warped Sellable: RequiresCondition: !build-incomplete && !c4 && !being-warped - GrantConditionOnPrerequisite@Bot: - Condition: owned-by-ai - Prerequisites: botplayer - GrantRandomCondition@ai-v2: - Conditions: ai-v2-upgrade, noupgrade - ProvidesPrerequisite@ai-v2: - Prerequisite: v2.upgrade - RequiresCondition: ai-v2-upgrade && owned-by-ai + SpawnActorOnDeath: + RequiresCondition: !being-warped + SpawnRandomActorOnDeath: + RequiresCondition: !being-warped + WithDecoration@TechLock: + RequiresCondition: tech-locked + -MindControllable@HACKABLE: + -Targetable@HACKABLE: + -MindControllableProgressBar@HACKABLE: + -WithDecoration@HACKED: + -WithDecoration@RESTORING: + -PowerMultiplier@HACKED: + Encyclopedia: + Category: Soviets/Buildings + +MUNP: + Inherits: ^Building + Inherits@POWER_OUTAGE: ^DisableOnLowPowerOrForceDisabled + Inherits@SHAPE: ^3x2Shape + Inherits@TECHLOCKABLE: ^TechLockable + Selectable: + Bounds: 3072, 2816, 0, -256 + HitShape: + Type: Rectangle + TopLeft: -1536, -1024 + BottomRight: 1536, 1280 + WithSpriteBody: + PauseOnCondition: disabled || being-warped + Buildable: + Queue: BuildingSQ, BuildingMQ + BuildPaletteOrder: 200 + Prerequisites: ~structures.soviet, stek, playerxp.level3, ~arty.doctrine, ~techlevel.high + Description: Vehicles & aircraft are produced 15% faster. Vehicles have 15% reduced reload time. + BuildLimit: 1 + TooltipExtras: + Attributes: • Maximum 1 can be built\n• Cannot be captured or hacked + Valued: + Cost: 2000 + -Capturable: + -CaptureNotification: + -CapturableProgressBar: + -CapturableProgressBlink: + -CaptureManager: + Tooltip: + Name: Munitions Plant + Building: + Footprint: xxx xxx === + Dimensions: 3,3 + LocalCenterOffset: 0,-512,0 + Health: + HP: 120000 + Armor: + Type: Wood + RevealsShroud: + MinRange: 4c0 + Range: 5c0 + RevealGeneratedShroud: False + RevealsShroud@GAPGEN: + Range: 4c0 + WithBuildingBib: + Power: + Amount: -150 + WithDeathAnimation: + DeathSequence: dead + UseDeathTypeSuffix: false + ProvidesPrerequisite@buildingname: + RequiresCondition: !tech-locked + ProvidesPrerequisite@IndpOrMunp: + Prerequisite: indpormunp + RequiresCondition: !tech-locked + ProvidesPrerequisite@disabled: + Prerequisite: munplowpower + RequiresCondition: disabled || empdisable || being-warped + Sellable: + RequiresCondition: !build-incomplete && !c4 && !being-warped + SpawnActorOnDeath: + RequiresCondition: !being-warped + SpawnRandomActorOnDeath: + RequiresCondition: !being-warped GrantCondition@DUMMY: Condition: noupgrade RequiresCondition: noupgrade - -MindControllable: + WithDecoration@TechLock: + RequiresCondition: tech-locked + -MindControllable@HACKABLE: -Targetable@HACKABLE: -MindControllableProgressBar@HACKABLE: -WithDecoration@HACKED: -WithDecoration@RESTORING: + -PowerMultiplier@HACKED: + Encyclopedia: + Category: Soviets/Buildings OREP: Inherits: ^Building Inherits@POWER_OUTAGE: ^DisableOnLowPowerOrForceDisabled Inherits@SHAPE: ^3x2Shape - HitShape: - TargetableOffsets: -355,-1024,0 + Inherits@UPG: ^ProducesUpgrades + Inherits@TECHLOCKABLE: ^TechLockable Selectable: - Bounds: 72,48 + Bounds: 3072, 2048 Building: Footprint: xxx xxx === Dimensions: 3,3 LocalCenterOffset: 0,-512,0 Health: - HP: 80000 + HP: 100000 Armor: - Type: Concrete + Type: Wood RevealsShroud: MinRange: 4c0 Range: 5c0 @@ -5513,40 +5831,45 @@ OREP: Range: 4c0 WithBuildingBib: Buildable: - Queue: Building + Queue: BuildingSQ, BuildingMQ BuildPaletteOrder: 200 - Prerequisites: ~structures.allies, atek, ~techlevel.high - Description: Refines income from ore, gems & tiberium by 5%.\nProvides access to advanced chrono harvester technology.\n Maximum 1 can be built.\n Cannot be captured or hacked. + Prerequisites: ~structures.allies, alhq, ~techlevel.high + Description: Refines ore, gems & Tiberium, increasing income by 10%. BuildLimit: 1 + TooltipExtras: + Attributes: • Maximum 1 can be built\n• Cannot be captured or hacked -Capturable: -CaptureNotification: -CapturableProgressBar: -CapturableProgressBlink: -CaptureManager: - ProvidesPrerequisite@buildingname: Valued: - Cost: 2500 + Cost: 1600 Tooltip: Name: Ore Purifier - ResourcePurifierCA@NORMAL: - Modifier: 5 - RequiresCondition: !disabled && !being-warped && !orep-upgrade - ResourcePurifierCA@UPGRADE: + ResourcePurifierCA@Normal: Modifier: 10 - RequiresCondition: !disabled && !being-warped && orep-upgrade + RequiresCondition: !disabled && !being-warped && !tech-locked && !economy-policy3 + ResourcePurifierCA@EconomyPolicy3: + Modifier: 15 + RequiresCondition: !disabled && !being-warped && !tech-locked && economy-policy3 + GrantConditionOnPrerequisite@EconomyPolicy3: + Condition: economy-policy3 + Prerequisites: economy.policy, influence.level3 Power: - Amount: -150 + Amount: -100 WithDeathAnimation: DeathSequence: dead UseDeathTypeSuffix: false Sellable: RequiresCondition: !build-incomplete && !c4 && !being-warped - GrantConditionOnPrerequisite@Bot: + SpawnActorOnDeath: + RequiresCondition: !being-warped + SpawnRandomActorOnDeath: + RequiresCondition: !being-warped + GrantConditionOnPrerequisite@OwnedByAi: Condition: owned-by-ai Prerequisites: botplayer - GrantConditionOnPrerequisite@UPGRADE: - Condition: orep-upgrade - Prerequisites: orep.upgrade GrantRandomCondition@ai-pcan: Conditions: ai-pcan-upgrade, noupgrade ProvidesPrerequisite@ai-pcan: @@ -5555,31 +5878,44 @@ OREP: GrantCondition@DUMMY: Condition: noupgrade RequiresCondition: noupgrade - ProvidesPrerequisiteValidatedFaction@germanyorep: - Factions: germany - Prerequisite: orep.germany - -MindControllable: + ValidFactions: + Factions: allies, england, germany, france, usa + ProvidesPrerequisite@buildingname: + RequiresCondition: !tech-locked + WithDecoration@TechLock: + RequiresCondition: tech-locked + -MindControllable@HACKABLE: -Targetable@HACKABLE: -MindControllableProgressBar@HACKABLE: -WithDecoration@HACKED: -WithDecoration@RESTORING: + -PowerMultiplier@HACKED: + Encyclopedia: + Category: Allies/Buildings UPGC: Inherits: ^BuildingTD Inherits@POWER_OUTAGE: ^DisableOnLowPowerOrForceDisabled Inherits@SHAPE: ^3x2Shape - HitShape: - TargetableOffsets: -355,-1024,0 + Inherits@UPG: ^ProducesUpgrades + Inherits@FIRESTORMPOWER: ^FirestormPower + Inherits@ADVANCEDRADARPOWER: ^AdvancedRadarPower + Inherits@NANITESHIELDPOWER: ^NaniteShieldPower + Inherits@TECHLOCKABLE: ^TechLockable Selectable: - Bounds: 72,48 + Bounds: 3072, 2560, 0, 256 Building: Footprint: xxx xxx === Dimensions: 3,3 LocalCenterOffset: 0,-1024,0 + HitShape: + Type: Rectangle + TopLeft: -1536, -1024 + BottomRight: 1536, 1536 Health: - HP: 80000 + HP: 140000 Armor: - Type: Concrete + Type: Wood RevealsShroud: MinRange: 4c0 Range: 5c0 @@ -5590,23 +5926,25 @@ UPGC: WithSpriteBody: PauseOnCondition: disabled || being-warped Buildable: - Queue: Building + Queue: BuildingSQ, BuildingMQ BuildPaletteOrder: 200 Prerequisites: ~structures.gdi, gtek, ~techlevel.high - Description: Allows the construction of advanced weaponry and upgrades.\n Maximum 1 can be built.\n Cannot be captured or hacked. + Description: Allows the construction of advanced weaponry and upgrades. BuildLimit: 1 IconPalette: chrometd + TooltipExtras: + Attributes: • Maximum 1 can be built\n• Cannot be captured or hacked -Capturable: -CaptureNotification: -CapturableProgressBar: -CapturableProgressBlink: -CaptureManager: Valued: - Cost: 2500 + Cost: 1800 Tooltip: Name: Upgrade Center ValidFactions: - Factions: talon, zocom, eagle, arc + Factions: gdi, talon, zocom, eagle, arc ProvidesPrerequisiteValidatedFaction@talonupgc: Factions: talon Prerequisite: upgc.talon @@ -5619,18 +5957,17 @@ UPGC: ProvidesPrerequisiteValidatedFaction@arcupgc: Factions: arc Prerequisite: upgc.arc + ProvidesPrerequisite@GDIORUPGC: + Prerequisite: gdiorupgc ProvidesPrerequisite@Name: Power: - Amount: -150 - WithDeathAnimation: - DeathSequence: dead - UseDeathTypeSuffix: false - DeathSequencePalette: overlayplayertd + Amount: -100 Sellable: RequiresCondition: !build-incomplete && !c4 && !being-warped - Production: - Produces: Upgrade - PauseOnCondition: forceshield || invulnerability || being-warped + SpawnActorOnDeath: + RequiresCondition: !being-warped + SpawnRandomActorOnDeath: + RequiresCondition: !being-warped ProductionAirdropCA: Produces: Money PauseOnCondition: forceshield || invulnerability || being-warped @@ -5648,9 +5985,8 @@ UPGC: ChargeDuration: 1500 Actors: truk.drop ShowSelectionBar: true - RequiresCondition: tower.drop && !(empdisable || disabled || being-warped) - ProductionBar: - ProductionType: Upgrade + RequiresCondition: tower-drop + PauseOnCondition: empdisable || disabled || being-warped Exit: SpawnOffset: 511,511,0 ExitCell: 1,1 @@ -5659,32 +5995,28 @@ UPGC: InitialFacing: 384 RealignDelay: -1 Offset: -768,468,0 - AttackTurreted: - RequiresCondition: !build-incomplete && tower.rocket && loaded-rocket > 0 + RequiresCondition: !build-incomplete PauseOnCondition: disabled || empdisable || being-warped + AttackTurretedCharged: + PauseOnCondition: build-incomplete || disabled || empdisable || being-warped + RequiresCondition: tower-rocket && loaded-rocket > 0 + ChargeLevel: 45 + DischargeRate: 45 + ShotsPerCharge: 3 + ShowSelectionBar: true + SelectionBarColor: FF4400 + ChargeWhileTurning: true Armament@ROCKET: - RequiresCondition: tower.rocket + RequiresCondition: tower-rocket Weapon: FirestormBarrage LocalOffset: 768,64,368, 768,-64,368, 768,64,255, 768,-64,255 SupportPowerChargeBar: - AttackOrderPower@ROCKET: - OrderName: rocketbarrage - PauseOnCondition: empdisable || disabled || being-warped - Cursor: ability - Icon: fstorm - IconPalette: chrometd - ChargeInterval: 7500 - Description: Firestorm - LongDesc: Barrage target area with rockets. - BeginChargeSpeechNotification: FireStormOffline - EndChargeSpeechNotification: FireStormReady - SelectTargetSpeechNotification: SelectTarget - InsufficientPowerSpeechNotification: InsufficientPower - DisplayTimerRelationships: Ally - RequiresCondition: tower.rocket - Prerequisites: ~techlevel.unrestricted RejectsOrders: + Except: Stop, Sell, PowerDown + RequiresCondition: !loaded-rocket + RejectsOrders@LOADED: Except: Sell, PowerDown + RequiresCondition: loaded-rocket AmmoPool: Ammo: 3 ReloadCount: 3 @@ -5693,49 +6025,31 @@ UPGC: Delay: 100 Count: 3 WithSpriteTurret@ROCKET: - RequiresCondition: !build-incomplete && tower.rocket + RequiresCondition: !build-incomplete && tower-rocket Recoils: false Sequence: turret-rocket WithIdleOverlay@RADAR: - RequiresCondition: !build-incomplete && tower.radar + RequiresCondition: !build-incomplete && tower-radar Sequence: turret-radar PauseOnCondition: !scan-active || disabled || being-warped WithIdleOverlay@SHIELD: - RequiresCondition: !build-incomplete && tower.shield && !nshield-active + RequiresCondition: !build-incomplete && tower-shield && !nshield-active Sequence: turret-shield PauseOnCondition: disabled || being-warped WithIdleOverlay@SHIELD-ACTIVE: - RequiresCondition: !build-incomplete && tower.shield && nshield-active + RequiresCondition: !build-incomplete && tower-shield && nshield-active Sequence: turret-shield-active PauseOnCondition: disabled || being-warped WithIdleOverlay@SHIELD-ACTIVE-EFFECT: - RequiresCondition: !build-incomplete && tower.shield && nshield-active + RequiresCondition: !build-incomplete && tower-shield && nshield-active Sequence: emp-overlay Palette: tseffect PauseOnCondition: disabled || being-warped Offset: -1284,384,0 WithIdleOverlay@DZONE: - RequiresCondition: !build-incomplete && tower.drop + RequiresCondition: !build-incomplete && tower-drop Sequence: turret-drop PauseOnCondition: disabled || being-warped - GrantPrerequisiteChargeDrainPowerCA@RADAR: - OrderName: advradarorder - DischargeModifier: 600 - Prerequisite: scan-active - ChargeInterval: 4500 - Icon: arscan - IconPalette: chrometd - Description: Advanced Radar Scan - LongDesc: Provides information on enemy structures & units positions. - RequiresCondition: !build-incomplete && tower.radar - PauseOnCondition: !radar-active || disabled || being-warped - LaunchSound: gradarup.aud - BeginChargeSound: gradardn.aud - DisplayTimerRelationships: Ally - SelectTargetSpeechNotification: SelectTarget - InsufficientPowerSpeechNotification: InsufficientPower - Prerequisites: ~techlevel.unrestricted - EarlyDeactivationPenalty: 1500 DrainPrerequisitePowerOnDamage@RADAR: OrderName: advradarorder GrantConditionOnPrerequisite@SCAN: @@ -5748,34 +6062,11 @@ UPGC: Prerequisites: radar-active Condition: radar-active GpsRadarProvider: - RequiresCondition: tower.radar && scan-active && !(disabled || being-warped) + RequiresCondition: tower-radar && scan-active && !(disabled || being-warped) ExternalCondition@NSACTIVE: Condition: nshield-active ExternalCondition@NSAUDIO: Condition: nshield-audio - SpawnActorPowerCA@NSHIELD: - Actor: nshield - OrderName: nshieldorder - Icon: nshield - Prerequisites: ~techlevel.unrestricted - ChargeInterval: 6000 - LifeTime: 375 - Description: Nanite Shield - LongDesc: Reduces incoming damage for all vehicles in target area. - LaunchSound: srepaira.aud - SelectTargetSpeechNotification: SelectTarget - InsufficientPowerSpeechNotification: InsufficientPower - PauseOnCondition: disabled || empdisable || being-warped - DisplayRadarPing: True - DisplayTimerRelationships: Ally - Cursor: ability - AllowMultiple: false - EffectImage: empty - EffectSequence: idle - EffectPalette: tseffect-ignore-lighting-alpha75 - RequiresCondition: tower.shield - TargetCircleRange: 6c0 - TargetCircleColor: 64a5dcbb ProximityExternalCondition@NSHIELD-AUDIO: Condition: nshield-audio RequiresCondition: nshield-active @@ -5786,140 +6077,74 @@ UPGC: Delay: 3 Interval: 0 RequiresCondition: nshield-audio || nshield-active - Pluggable: - Conditions: - tower.rocket: tower.rocket - tower.radar: tower.radar - tower.shield: tower.shield - tower.drop: tower.drop - Requirements: - tower.rocket: !build-incomplete && !tower.radar && !tower.rocket && !tower.shield && !tower.drop - tower.radar: !build-incomplete && !tower.radar && !tower.rocket && !tower.shield && !tower.drop - tower.shield: !build-incomplete && !tower.radar && !tower.rocket && !tower.shield && !tower.drop - tower.drop: !build-incomplete && !tower.radar && !tower.rocket && !tower.shield && !tower.drop - ProvidesPrerequisite@pluggable: - RequiresCondition: !build-incomplete && (tower.rocket || tower.radar || tower.shield || tower.drop) - Prerequisite: upgc.plugged - ProvidesPrerequisite@AMPSEEK: - RequiresCondition: !build-incomplete && tower.radar - Prerequisite: seek3.strat - RequiresPrerequisites: seek.strat - ProvidesPrerequisite@AMPBOMB: - RequiresCondition: !build-incomplete && tower.rocket - Prerequisite: bombard3.strat - RequiresPrerequisites: bombard.strat - ProvidesPrerequisite@AMPHOLD: - RequiresCondition: !build-incomplete && tower.shield - Prerequisite: hold3.strat - RequiresPrerequisites: hold.strat + GrantConditionOnPrerequisite@Bombard3: + Prerequisites: bombard3.strat + Condition: tower-rocket + GrantConditionOnPrerequisite@Seek3: + Prerequisites: seek3.strat + Condition: tower-radar + GrantConditionOnPrerequisite@Hold3: + Prerequisites: hold3.strat + Condition: tower-shield + GrantConditionOnPrerequisite@Dropzone: + Prerequisites: upgc.drop + Condition: tower-drop GrantConditionOnPrerequisite: Prerequisites: nshield Condition: nshield-active ProductionCostMultiplier@TALONBONUS: - Multiplier: 90 - Prerequisites: structures.talon - -MindControllable: + Multiplier: 80 + Prerequisites: player.talon + WithDecoration@TechLock: + RequiresCondition: tech-locked + -MindControllable@HACKABLE: -Targetable@HACKABLE: -MindControllableProgressBar@HACKABLE: -WithDecoration@HACKED: -WithDecoration@RESTORING: - -UPGC.SOCK: - AlwaysVisible: - Interactable: - Tooltip: - Name: Component Platform - -UPGC.BOMB: - Inherits: ^BuildingPlug - Valued: - Cost: 1500 - Tooltip: - Name: Upgrade: Firestorm Missile System - Buildable: - Queue: Upgrade - BuildPaletteOrder: 3 - Prerequisites: upgc, !upgc.plugged, bombard2.strat, ~bombard.strat, ~!seek.strat, ~!hold.strat, ~techlevel.high - Description: Provides an napalm rocket barrage.\n\n + Increases the Strategy: Bombardment unit bonus by a further 5%. - IconPalette: chrometd - Plug: - Type: tower.rocket - Power: - Amount: -100 - -UPGC.SEEK: - Inherits: ^BuildingPlug - Valued: - Cost: 1500 - Tooltip: - Name: Upgrade: Advanced Radar System - Buildable: - Queue: Upgrade - BuildPaletteOrder: 6 - Prerequisites: upgc, !upgc.plugged, seek2.strat, ~seek.strat, ~!bombard.strat, ~!hold.strat, ~techlevel.high - Description: Provides detailed information on enemy locations.\n\n + Increases the Strategy: Seek & Destroy unit bonus by a further 5%. - IconPalette: chrometd - Plug: - Type: tower.radar - Power: - Amount: -100 - -UPGC.HOLD: - Inherits: ^BuildingPlug - Valued: - Cost: 1500 - Tooltip: - Name: Upgrade: Nanoshield Generator - Buildable: - Queue: Upgrade - BuildPaletteOrder: 9 - Prerequisites: upgc, !upgc.plugged, hold2.strat, ~hold.strat, ~!bombard.strat, ~!seek.strat, ~techlevel.high - Description: Provides the ability to rapidly repair friendly structures.\n\n + Increases the Strategy: Hold the Line unit bonus by a further 5%. - IconPalette: chrometd - Plug: - Type: tower.shield - Power: - Amount: -100 - -UPGC.DROP: - Inherits: ^BuildingPlug - Valued: - Cost: 1500 - Tooltip: - Name: Upgrade: Supply Drop Zone - Buildable: - Queue: Upgrade - BuildPaletteOrder: 90 - Prerequisites: ~upgc, ~!upgc.plugged, ~techlevel.high - Description: Provides a dropzone\nfor emergency supplies. - IconPalette: chrometd - Plug: - Type: tower.drop - Power: - Amount: -50 + -PowerMultiplier@HACKED: + UpdatesSupportPowerTimer@Firestorm: + OrderName: rocketbarrage + InitialOnly: true + RequiresCondition: tower-rocket + Ticks: 3000 + UpdatesSupportPowerTimer@AdvancedRadar: + OrderName: advradarorder + InitialOnly: true + RequiresCondition: tower-radar + Ticks: 75 + UpdatesSupportPowerTimer@NaniteShield: + OrderName: nshieldorder + InitialOnly: true + RequiresCondition: tower-shield + Ticks: 1500 + Encyclopedia: + Category: GDI/Buildings TMPP: Inherits: ^BuildingTD Inherits@POWER_OUTAGE: ^DisableOnLowPowerOrForceDisabled - Inherits@SHAPE: ^3x2Shape - Inherits@PRIMARY: ^PrimaryBuilding + Inherits@INF: ^ProducesCyborgs + Inherits@UPG: ^ProducesUpgrades + Inherits@TECHLOCKABLE: ^TechLockable RenderSprites: - PlayerPalette: overlayplayertd + PlayerPalette: playertd Selectable: - Bounds: 72,60,0,6 + Bounds: 3072, 2560, 0, 256 HitShape: - TargetableOffsets: 0,0,0, 0,1024,0, 0,-1024,0 + UseTargetableCellsOffsets: false + TargetableOffsets: 512,0,0, -256,0,0, -256,1024,0, -256,-1024,0, -1536,0,0, -1536,1024,0, -1536,-1024,0 Type: Rectangle - TopLeft: -1536, -1024 - BottomRight: 1536, 512 + TopLeft: -1536, -512 + BottomRight: 1536, 1536 Building: - Footprint: XxX xxx X+X - Dimensions: 3,3 + Footprint: ___ xxx xxx +++ + Dimensions: 3,4 LocalCenterOffset: 0,-512,0 Health: - HP: 80000 + HP: 120000 Armor: - Type: Concrete + Type: Wood RevealsShroud: MinRange: 4c0 Range: 5c0 @@ -5928,92 +6153,107 @@ TMPP: Range: 4c0 WithBuildingBib: Buildable: - Queue: Building + Queue: BuildingSQ, BuildingMQ BuildPaletteOrder: 200 IconPalette: chrometd Prerequisites: ~structures.nod, tmpl, ~techlevel.high - Description: Provides access to cybernetic upgrades.\n Maximum 1 can be built.\n Cannot be captured or hacked.\n Special Ability: Cyborg Converter (Requires Upgrade) + Description: Provides access to cybernetic upgrades. BuildLimit: 1 + TooltipExtras: + Attributes: • Maximum 1 can be built\n• Cannot be captured or hacked\n• Can convert regular infantry to cyborgs -Capturable: -CaptureNotification: -CapturableProgressBar: -CapturableProgressBlink: -CaptureManager: Valued: - Cost: 2500 + Cost: 2000 Tooltip: Name: Temple Prime Power: Amount: -150 - WithDeathAnimation: - DeathSequence: dead - DeathSequencePalette: overlayplayertd - UseDeathTypeSuffix: false - ProvidesPrerequisite@Name: - RequiresCondition: !being-warped - ProvidesPrerequisite@CYBORGPRODUCTION: - Prerequisite: cyborg.production - RequiresCondition: cyborg-production + ProvidesPrerequisite@buildingname: + RequiresCondition: !tech-locked + ProvidesPrerequisite@nod: + Prerequisite: infantry.nod + RequiresCondition: !tech-locked ProvidesPrerequisite@marked: Factions: marked Prerequisite: infantry.marked - ProvidesPrerequisite@cyborg: - Prerequisite: infantry.cyborg - GrantConditionOnPrerequisite@CYBORGPRODUCTION: - Condition: cyborg-production - Prerequisites: cyborg.upgrade, hand + RequiresCondition: !tech-locked + ProvidesPrerequisite@mech: + Prerequisite: infantry.mech + RequiresCondition: !tech-locked Sellable: RequiresCondition: !build-incomplete && !c4 && !being-warped - Production: - Produces: Upgrade, Infantry, Cyborg - PauseOnCondition: forceshield || invulnerability || being-warped - ProductionBar: - ProductionType: Upgrade + SpawnActorOnDeath: + RequiresCondition: !being-warped + SpawnRandomActorOnDeath: + RequiresCondition: !being-warped Exit@1: SpawnOffset: -170,1310,0 ExitCell: 1,3 - ProductionTypes: Cyborg, Infantry + Exit@2: + SpawnOffset: 190,-400,0 + ExitCell: 1,-1 + Priority: 0 RallyPoint: - GrantConditionOnPrerequisite@Cyborgs: - Prerequisites: cyborg.upgrade - Condition: cyborgs UnitConverter: Type: Cyborg ReadyAudio: UnitUpgraded NoCashAudio: InsufficientFunds BlockedAudio: OnHold - RequiresCondition: cyborgs CostDifferenceRequired: true - EjectOnInsufficientFunds: true - -MindControllable: + OverrideUnitBuildDurationModifier: true + EjectOnDeploy: true + ConvertingCondition: converting + WithUnitConverterCountDecoration: + Font: Bold + Position: Top + Color: FF0000 + Margin: 0,-15 + RequiresCondition: converting + PrimaryBuilding: + RequiresCondition: !converting && !global-multiqueue + WithDecoration@TechLock: + RequiresCondition: tech-locked + -MindControllable@HACKABLE: -Targetable@HACKABLE: -MindControllableProgressBar@HACKABLE: -WithDecoration@HACKED: -WithDecoration@RESTORING: + -PowerMultiplier@HACKED: + ProductionCostMultiplier@MARKEDBONUS: + Multiplier: 90 + Prerequisites: player.marked + Encyclopedia: + Category: Nod/Buildings MSLO.Nod: Inherits: ^Building Inherits@IDISABLE: ^DisableOnLowPowerOrPowerDownOrForceDisable Inherits@SHAPE: ^2x1Shape + Inherits@CHEMMISSILEPOWER: ^ChemicalMissilePower RenderSprites: Image: nmslo Selectable: - Bounds: 48,24,0,12 + Bounds: 2048, 1280 Valued: Cost: 2500 Tooltip: Name: Missile Silo Buildable: - Queue: Defense + Queue: DefenseSQ, DefenseMQ BuildPaletteOrder: 140 IconPalette: chrometd Prerequisites: tmpl, ~techlevel.unrestricted, ~structures.nod BuildLimit: 1 - Description: Provides a chemical missile.\n Requires power to operate.\n Maximum 1 can be built.\n Special Ability: Chemical Missile + Description: Provides the Chemical Missile superweapon power. + TooltipExtras: + Attributes: • Maximum 1 can be built\n• Requires power to operate\n• Special Ability: Chemical Missile Building: Footprint: xx Dimensions: 2,1 - LocalCenterOffset: 0,-512,0 Health: HP: 100000 Armor: @@ -6029,66 +6269,40 @@ MSLO.Nod: RevealsShroud@GAPGEN: Range: 5c0 RequiresCondition: !disabled - NukePower@Chemmiss: - OrderName: chemmissile - Icon: chemmissile - IconPalette: chrometd - Prerequisites: techlevel.unrestricted - Cursor: chemmissile - ChargeInterval: 13500 - Description: Chemical Missile - LongDesc: Launches an deadly Chemical Missile,\nCauses a large blast and a large toxic cloud.\nExtremely toxic to infantry. - EndChargeSpeechNotification: CMissileReady - SelectTargetSpeechNotification: SelectTarget - InsufficientPowerSpeechNotification: InsufficientPower - IncomingSpeechNotification: MissileLaunchDetected - MissileWeapon: Chemicbm - MissileDelay: 5 - IncomingSound: nukelaunch.aud - LaunchSound: nukelaunch.aud - MissilePalette: temptd - DisplayTimerRelationships: Ally, Neutral, Enemy - DisplayBeacon: True - DisplayRadarPing: True - BeaconPoster: cmissile - SpawnOffset: 1000, 0, 0 - CameraRange: 10c0 - ArrowSequence: arrow - ClockSequence: clock - CircleSequence: circles - PauseOnCondition: disabled || empdisable || being-warped - TrailImage: smokey2 - TrailSequences: idle - TrailPalette: tseffect-ignore-lighting-alpha75 - DetonationAltitude: 0 - CircleRanges: 6c512 - CircleColor: 00BB00AA - CircleBorderColor: 007700AA SupportPowerChargeBar: Power: - Amount: -150 + Amount: -200 MustBeDestroyed: RequiredForShortGame: false WithSupportPowerActivationAnimation: RequiresCondition: !build-incomplete ProvidesPrerequisite@buildingname: InfiltrateForSupportPowerReset: - Types: SpyInfiltrate, SabInfiltrate - Targetable: - TargetTypes: Ground, Structure, C4, DetonateAttack, SpyInfiltrate, SabInfiltrate + Types: ResetSupportPowerInfiltrate + InfiltrationNotification: BuildingInfiltrated + InfiltratedNotification: BaseAttack + PlayerExperience: 15 + Targetable@INFILTRATION: + RequiresCondition: !being-warped + TargetTypes: ResetSupportPowerInfiltrate + Encyclopedia: + Category: Nod/Buildings WEAT: Inherits: ^Building Inherits@IDISABLE: ^DisableOnLowPowerOrPowerDownOrForceDisable Inherits@SHAPE: ^2x2Shape + Inherits@STORMPOWER: ^LightningStormPower Selectable: - Bounds: 48,48 + Bounds: 2048, 2048 Buildable: - Queue: Defense - BuildPaletteOrder: 130 + Queue: DefenseSQ, DefenseMQ + BuildPaletteOrder: 140 Prerequisites: atek, ~structures.allies, ~techlevel.unrestricted BuildLimit: 1 - Description: Provides Lightning Storm support power.\n Requires power to operate.\n Maximum 1 can be built.\n Special Ability: Lightning Storm + Description: Provides the Lightning Storm superweapon power. + TooltipExtras: + Attributes: • Maximum 1 can be built\n• Requires power to operate\n• Special Ability: Lightning Storm Valued: Cost: 2500 Tooltip: @@ -6111,44 +6325,10 @@ WEAT: RevealsShroud@GAPGEN: Range: 5c0 RequiresCondition: !disabled - DetonateWeaponPower@LightningStorm: - OrderName: storm - Icon: storm - Cursor: ability - ChargeInterval: 13500 - Description: Lightning Storm - ActivationDelay: 50 - LongDesc: Initiate a Lightning Storm.\nApplies heavy damage over a large area. - Weapon: WeatherStormInit - AirburstAltitude: 4c512 - AllowMultiple: false - CameraActor: camera - CameraRemoveDelay: 375 - SelectTargetSpeechNotification: SelectTarget - EndChargeSpeechNotification: StormReady - InsufficientPowerSpeechNotification: InsufficientPower - IncomingSpeechNotification: StormApproach - IncomingSound: sweaintr.aud - LaunchSound: sweaintr.aud - DisplayTimerRelationships: Ally, Neutral, Enemy - PauseOnCondition: disabled || empdisable || being-warped - DisplayBeacon: True - DisplayRadarPing: True - ArrowSequence: arrow - ClockSequence: clock - CircleSequence: circles - BeaconPoster: stormicon - TargetCircleRange: 6c512 - TargetCircleColor: 0000FF90 - Duration: 350 - ActiveCondition: active - PaletteEffectType: LightningStorm WithIdleOverlay@ACTIVE: Sequence: active-overlay Palette: d2keffect RequiresCondition: active - ExternalCondition@ACTIVE: - Condition: active SupportPowerChargeBar: Power: Amount: -200 @@ -6156,8 +6336,127 @@ WEAT: MustBeDestroyed: RequiredForShortGame: false InfiltrateForSupportPowerReset: - Types: SpyInfiltrate, SabInfiltrate - Targetable: - TargetTypes: Ground, Structure, C4, DetonateAttack, SpyInfiltrate, SabInfiltrate + Types: ResetSupportPowerInfiltrate + InfiltrationNotification: BuildingInfiltrated + InfiltratedNotification: BaseAttack + PlayerExperience: 15 + Targetable@INFILTRATION: + RequiresCondition: !being-warped + TargetTypes: ResetSupportPowerInfiltrate WithBuildingBib: - HasMinibib: true \ No newline at end of file + HasMinibib: true + Encyclopedia: + Category: Allies/Buildings + +IOK: + Inherits: ^BasicBuilding + -FrozenUnderFog: + -FrozenUnderFogUpdatedByGpsRadar: + -ShakeOnDeath: + FireWarheadsOnDeath: + Weapon: SmallBuildingExplode + EmptyWeapon: SmallBuildingExplode + HiddenUnderFog: + Selectable: + Bounds: 1024, 1024 + DecorationBounds: 896, 1706, 0, -448 + Health: + HP: 15000 + Tooltip: + Name: Idol of Kane + TooltipExtras: + Strengths: • Increases damage and movement speed of friendly infantry\n• Reduces damage and movement speed of enemy infantry\n• Provides vision + Weaknesses: • Cannot attack + Attributes: • Special Ability: Rage Generator (enemy units within range go berserk) + Armor: + Type: Concrete + Targetable: + TargetTypes: Ground, Structure, Defense + RevealsShroud: + MinRange: 6c0 + Range: 8c0 + RevealGeneratedShroud: False + RevealsShroud@GAPGEN: + Range: 6c0 + Building: + Dimensions: 1,1 + Footprint: x + TerrainTypes: Clear,Road + WithIdleOverlay: + Sequence: holo + Palette: player + IsPlayerPalette: True + RequiresCondition: !build-incomplete + WithIdleOverlay@Outline: + Sequence: outline + Palette: player + IsPlayerPalette: True + WithMakeAnimation: + Condition: build-incomplete + AmbientSoundCA: + Interval: 100000 + SoundFiles: iok-create1.aud, iok-create2.aud, iok-create3.aud, iok-create4.aud, iok-create5.aud + SoundOnDamageTransition: + -DamagedSounds: + DestroyedSounds: kaboom15.aud + ProximityExternalCondition@IdolOfKaneBuff: + Condition: iokbuff + Range: 5c0 + ValidRelationships: Ally + RequiresCondition: !rage-active && initialized + ProximityExternalCondition@IdolOfKaneDebuff: + Condition: iokdebuff + Range: 5c0 + ValidRelationships: Neutral, Enemy + RequiresCondition: !rage-active && initialized + ProximityExternalCondition@Rage: + Condition: berserk + Range: 5c0 + ValidRelationships: Neutral, Enemy + RequiresCondition: rage-active + WithRadiatingCircle: + EndRadius: 5c0 + Interval: 40 + Duration: 30 + ValidRelationships: Ally, Enemy, Neutral + AlwaysShowMaxRange: true + Visible: Always + MaxRadiusColor: 66666660 + MaxRadiusFlashColor: 66666660 + Color: 66666630 + Width: 2 + RequiresCondition: !rage-active && initialized + WithRadiatingCircle@Rage: + EndRadius: 5c0 + Interval: 5 + Duration: 50 + ValidRelationships: Ally, Enemy, Neutral + AlwaysShowMaxRange: true + Visible: Always + MaxRadiusColor: FF000070 + MaxRadiusFlashColor: FF000090 + Color: FF000040 + Width: 2 + RequiresCondition: rage-active + GrantTimedConditionOnDeploy@Rage: + DeployedCondition: rage-active + ShowSelectionBar: true + DeployedTicks: 125 + CooldownTicks: 375 + ShowSelectionBarWhenFull: false + ChargingColor: 770000 + DischargingColor: ff0000 + DeploySound: rage-gen.aud + Instant: true + StartsFullyCharged: true + RequiresCondition: initialized + WithColoredOverlay@Rage: + RequiresCondition: rage-active + Color: FF000033 + ReloadAmmoPoolCA@InitialRage: + Delay: 125 + SelectionBarColor: 770000 + AmmoPool@InitialRage: + Ammo: 1 + InitialAmmo: 0 + AmmoCondition: initialized diff --git a/mods/ca/rules/upgrades.yaml b/mods/ca/rules/upgrades.yaml index cd80bf5d2b..e138a1f197 100644 --- a/mods/ca/rules/upgrades.yaml +++ b/mods/ca/rules/upgrades.yaml @@ -1,12 +1,13 @@ ^Upgrade: - AlwaysVisible: - Interactable: - ScriptTriggers: + Inherits@DUMMY: ^InvisibleDummy Buildable: Queue: Upgrade BuildLimit: 1 BuildDurationModifier: 100 ProvidesPrerequisite@upgradename: + ProvidesUpgrade@upgradename: + WithProductionIconOverlay: + Types: Upgrade #########################SHARED######### ######################################## @@ -16,615 +17,2237 @@ hazmat.upgrade: Tooltip: Name: Upgrade: Hazmat Suits Buildable: - BuildPaletteOrder: 10 - Prerequisites: ~anyradar, ~infantry.hazmat, ~techlevel.high, ~!hazmatsoviet.upgrade + BuildPaletteOrder: 19 + Prerequisites: anyradar, infantry.any, ~!player.soviet, ~!player.zocom, ~!player.scrin, ~techlevel.medium IconPalette: chrometd - BuildDuration: 1125 - Description: Infantry are equiped with hazmat suits which\nprovides protection against Tiberium and radiation.\n\n Upgrades: Infantry\n + Tiberium immunity\n + 50% resistance to radiation + Description: Infantry are equipped with hazmat suits which provides protection against Tiberium and radiation.\n\nUpgrades: Infantry + TooltipExtras: + Strengths: + Tiberium immunity\n+ 50% resistance to irradiated terrain Valued: Cost: 750 RenderSprites: Image: hazmat.upgrade + ProductionCostMultiplier@NODDISCOUNT: + Multiplier: 70 + Prerequisites: player.nod + WithProductionIconOverlay: + Prerequisites: hazmat.upgrade + Encyclopedia: + Category: Allies/Upgrades; GDI/Upgrades; Nod/Upgrades + +flakarmor.upgrade: + Inherits: ^Upgrade + Tooltip: + Name: Upgrade: Advanced Flak Armor + Buildable: + BuildPaletteOrder: 30 + Prerequisites: techcenter.any, infantry.any, ~!player.nod, ~!player.scrin, ~techlevel.high + Description: Infantry are equipped with advanced flak armor which provides protection against explosives.\n\nUpgrades: Infantry + TooltipExtras: + Strengths: + 40% reduced damage from explosives\n+ 20% reduced damage from incendiary explosives + Valued: + Cost: 1500 + RenderSprites: + Image: flakarmor.upgrade + WithProductionIconOverlay: + Prerequisites: flakarmor.upgrade + Encyclopedia: + Category: Allies/Upgrades; Soviets/Upgrades; GDI/Upgrades; Nod/Upgrades #########################GDI######### ######################################## -bombard.strat: +ANYSTRATEGY: + AlwaysVisible: + Interactable: + Tooltip: + Name: Active Strategy + Buildable: + Description: Active Strategy + ProvidesPrerequisite: + +^GDIUpgrade: Inherits: ^Upgrade + Encyclopedia: + Category: GDI/Upgrades + +bombard.strat: + Inherits: ^GDIUpgrade Tooltip: - Name: Strategy: Bombardment I + Name: Strategy: Bombardment Buildable: - BuildPaletteOrder: 1 - Prerequisites: ~radar.gdi, ~!seek.strat, ~!hold.strat, ~techlevel.high + BuildPaletteOrder: 7 + Prerequisites: ~player.gdi, anyradar, ~!seek.strat, ~!hold.strat, ~techlevel.medium IconPalette: chrometd - BuildDuration: 2250 - Description: Increases unit firepower by 5%.\n\n Only one Strategy may be chosen. + Description: Firepower focused strategy, required for:\n• Zone Trooper\n• Tomahawk Launcher Research\n• Hailstorm Missiles Upgrade\n• Avenger Upgrade\n• Firestorm Missiles Power\n\n + TooltipExtras: + Strengths: + Increases firepower and rate of fire of vehicles and aircraft by 3% + Attributes: \n(!) Only ONE Strategy may be chosen. Valued: - Cost: 1500 + Cost: 750 RenderSprites: Image: bombard.strat + AnnounceOnCreation: + SpeechNotification: Bombardment + Delay: 60 + UpdatesCount: + Type: StrategyLevel + WithProductionIconOverlay: + Prerequisites: bombard.strat bombard2.strat: Inherits: bombard.strat + -AnnounceOnCreation: Tooltip: Name: Strategy: Bombardment II Buildable: - BuildPaletteOrder: 2 - Prerequisites: gtek, ~bombard.strat, ~techlevel.high - Description: Increases the Strategy: Bombardment unit bonus by a further 5%. + BuildPaletteOrder: 7 + Prerequisites: ~player.gdi, gtek, ~bombard.strat, ~techlevel.high + Description: Increase Bombardment strategy bonuses. + TooltipExtras: + Strengths: + Increases firepower and rate of fire of vehicles and aircraft by a further 3% + -Attributes: RenderSprites: Image: bombard2.strat + UpdatesCount: + Type: StrategyLevel + WithProductionIconOverlay: + Prerequisites: bombard2.strat + +bombard3.strat: + Inherits: ^GDIUpgrade + Valued: + Cost: 1000 + Tooltip: + Name: Upgrade: Firestorm Missile System + Buildable: + BuildPaletteOrder: 8 + Prerequisites: ~player.gdi, upgc, !upgc.drop, bombard2.strat, ~bombard.strat, ~!seek.strat, ~!hold.strat, ~techlevel.high + Description: Provides an napalm rocket barrage. + IconPalette: chrometd + TooltipExtras: + Strengths: + Increases firepower and rate of fire of vehicles and aircraft by a further 3%\n+ Unlocks Firestorm Missile Barrage power + Attributes: (!) Mutually exclusive with Supply Drop Zone + RenderSprites: + PlayerPalette: playertd + WithProductionIconOverlay: + Prerequisites: bombard3.strat + UpdatesCount: + Type: StrategyLevel seek.strat: - Inherits: ^Upgrade + Inherits: ^GDIUpgrade Tooltip: Name: Strategy: Seek & Destroy Buildable: - BuildPaletteOrder: 4 - Prerequisites: ~radar.gdi, ~!bombard.strat, ~!hold.strat, ~techlevel.high + BuildPaletteOrder: 9 + Prerequisites: ~player.gdi, anyradar, ~!bombard.strat, ~!hold.strat, ~techlevel.medium IconPalette: chrometd - BuildDuration: 2250 - Description: Increases unit speed and weapon range by 5%.\n\n Only one Strategy may be chosen. + Description: Speed and weapon range focused strategy, required for:\n• Zone Raider\n• TOW Missile Upgrade\n• Hypersonic Missiles Upgrade\n• Sidewinders Upgrade\n• Advanced Radar Power\n\n + TooltipExtras: + Strengths: + Increases speed and weapon range of vehicles and aircraft by 5% + Attributes: \n(!) Only ONE Strategy may be chosen. Valued: - Cost: 1500 + Cost: 750 RenderSprites: Image: seek.strat + AnnounceOnCreation: + SpeechNotification: SeekAndDestroy + Delay: 60 + UpdatesCount: + Type: StrategyLevel + WithProductionIconOverlay: + Prerequisites: seek.strat seek2.strat: Inherits: seek.strat + -AnnounceOnCreation: Tooltip: Name: Strategy: Seek & Destroy II Buildable: - BuildPaletteOrder: 5 - Prerequisites: gtek, ~seek.strat, ~techlevel.high - Description: Increases the Strategy: Seek & Destroy unit bonus by a further 5%. + BuildPaletteOrder: 9 + Prerequisites: ~player.gdi, gtek, ~seek.strat, ~techlevel.high + Description: Increase Seek & Destroy strategy bonuses. + TooltipExtras: + Strengths: + Increases speed and weapon range of vehicles and aircraft by a further 5% + -Attributes: RenderSprites: Image: seek2.strat + UpdatesCount: + Type: StrategyLevel + WithProductionIconOverlay: + Prerequisites: seek2.strat + +seek3.strat: + Inherits: ^GDIUpgrade + Valued: + Cost: 1000 + Tooltip: + Name: Upgrade: Advanced Radar System + Buildable: + BuildPaletteOrder: 10 + Prerequisites: ~player.gdi, upgc, !upgc.drop, seek2.strat, ~seek.strat, ~!bombard.strat, ~!hold.strat, ~techlevel.high + Description: Provides detailed information on enemy locations. + IconPalette: chrometd + TooltipExtras: + Strengths: + Increases speed and weapon range of vehicles and aircraft by a further 5%\n+ Unlocks Advanced Radar Scan power + Attributes: (!) Mutually exclusive with Supply Drop Zone + RenderSprites: + PlayerPalette: playertd + WithProductionIconOverlay: + Prerequisites: seek3.strat + UpdatesCount: + Type: StrategyLevel hold.strat: - Inherits: ^Upgrade + Inherits: ^GDIUpgrade Tooltip: Name: Strategy: Hold the Line Buildable: - BuildPaletteOrder: 7 - Prerequisites: ~radar.gdi, ~!bombard.strat, ~!seek.strat, ~techlevel.high + BuildPaletteOrder: 11 + Prerequisites: ~player.gdi, anyradar, ~!bombard.strat, ~!seek.strat, ~techlevel.medium IconPalette: chrometd - BuildDuration: 2250 - Description: Increases unit armor by 5%.\n\n Only one Strategy may be chosen. + Description: Defensive strategy, required for:\n• Zone Defender\n• Point Defense Systems Upgrade\n• Hammerhead Missiles Upgrade\n• Ceramic Armor Upgrade\n• Nanite Shield Power\n\n + TooltipExtras: + Strengths: + Increases armor of vehicles and aircraft by 5% + Attributes: \n(!) Only ONE Strategy may be chosen. Valued: - Cost: 1500 + Cost: 750 RenderSprites: Image: hold.strat + AnnounceOnCreation: + SpeechNotification: HoldTheLine + Delay: 60 + UpdatesCount: + Type: StrategyLevel + WithProductionIconOverlay: + Prerequisites: hold.strat hold2.strat: Inherits: hold.strat + -AnnounceOnCreation: Tooltip: Name: Strategy: Hold the Line II Buildable: - BuildPaletteOrder: 8 - Prerequisites: gtek, ~hold.strat, ~techlevel.high - Description: Increases the Strategy: Hold the Line unit bonus by a further 5%. + BuildPaletteOrder: 11 + Prerequisites: ~player.gdi, gtek, ~hold.strat, ~techlevel.high + Description: Increase Hold the Line strategy bonuses. + TooltipExtras: + Strengths: + Increases armor of vehicles and aircraft by a further 5% + -Attributes: RenderSprites: Image: hold2.strat + UpdatesCount: + Type: StrategyLevel + WithProductionIconOverlay: + Prerequisites: hold2.strat + +hold3.strat: + Inherits: ^GDIUpgrade + Valued: + Cost: 1000 + Tooltip: + Name: Upgrade: Nanoshield Generator + Buildable: + BuildPaletteOrder: 12 + Prerequisites: ~player.gdi, upgc, !upgc.drop, hold2.strat, ~hold.strat, ~!bombard.strat, ~!seek.strat, ~techlevel.high + Description: Provides the ability to shield units in an area + IconPalette: chrometd + TooltipExtras: + Strengths: + Increases armor of vehicles and aircraft by a further 5%\n+ Unlocks Nanite Shield power + Attributes: (!) Mutually exclusive with Supply Drop Zone + RenderSprites: + PlayerPalette: playertd + WithProductionIconOverlay: + Prerequisites: hold3.strat + UpdatesCount: + Type: StrategyLevel vulcan.upgrade: - Inherits: ^Upgrade + Inherits: ^GDIUpgrade Tooltip: - Name: Upgrade: Vulcan + Name: Research: Vulcan Buildable: BuildPaletteOrder: 20 - Prerequisites: ~radar.gdi, ~techlevel.high - IconPalette: chrometd - BuildDuration: 1500 - Description: Adds anti-aircraft capability to the APC and improves damage against ground targets.\n\n Upgrades: APC + Prerequisites: ~player.gdi, anyradar, ~techlevel.medium + Description: Replaces: APC + TooltipExtras: + Strengths: + Adds anti-air capability\n+ Increased damage against ground targets\n+ Adds turret + Weaknesses: – Increased cost\n– Reduced speed Valued: - Cost: 1000 + Cost: 750 RenderSprites: Image: vulcan.upgrade + WithProductionIconOverlay: + Prerequisites: vulcan.upgrade -drone.upgrade: - Inherits: ^Upgrade +bjet.upgrade: + Inherits: ^GDIUpgrade Tooltip: - Name: Upgrade: Battle Drone + Name: Research: Bombardier Buildable: - BuildPaletteOrder: 30 - Prerequisites: ~radar.arc, ~techlevel.high - BuildDuration: 1500 - Description: Allows construction of a modified crewless Battle Tank.\n\n Replaces: Battle Tank\n + Immunity to crew kill, chaos gas and mind control\n + Reduced cost\n – Reduced damage \n – Disabled on low power + BuildPaletteOrder: 20 + Prerequisites: ~player.gdi, anyradar, ~techlevel.medium + Description: Allows training of Bombardiers. + TooltipExtras: + Strengths: + Strong vs Buildings, Defenses, Light Armor + Weaknesses: – Weak vs Heavy Armor\n– Has difficulty hitting moving targets\n– Cannot attack Aircraft Valued: Cost: 1000 RenderSprites: - Image: drone.upgrade + Image: bjet.upgrade + WithProductionIconOverlay: + Prerequisites: bjet.upgrade empgren.upgrade: - Inherits: ^Upgrade + Inherits: ^GDIUpgrade Tooltip: Name: Upgrade: EMP Grenades Buildable: - BuildPaletteOrder: 40 - Prerequisites: ~gtek, ~techlevel.high - BuildDuration: 1500 + BuildPaletteOrder: 30 + Prerequisites: ~player.gdi, gtek, ~techlevel.high IconPalette: chrometd - Description: Upgrades Grenadier to use EMP Grenades that briefly disable vehicles and defenses.\n\n Upgrades: Grenadier + Description: Upgrades Grenadier to use EMP Grenades.\n\nUpgrades: Grenadier + TooltipExtras: + Strengths: + Grenades briefly disable vehicles and defenses\n+ Grenadiers no longer explode when killed Valued: Cost: 1000 RenderSprites: Image: empgren.upgrade + WithProductionIconOverlay: + Prerequisites: empgren.upgrade -pointlaser.upgrade: - Inherits: ^Upgrade +strata10.upgrade: + Inherits: ^GDIUpgrade Tooltip: - Name: Upgrade: Point Defense Lasers + Name: Strategy Dependent Upgrade Buildable: - BuildPaletteOrder: 50 - Prerequisites: ~gtek.zocom, ~techlevel.high - BuildDuration: 1500 + BuildPaletteOrder: 30 + Prerequisites: ~player.gdi, gtek, anystrategy, ~!bombard.strat, ~!seek.strat, ~!hold.strat, ~techlevel.high IconPalette: chrometd - Description: Equips Battle Tanks and Frigates with point defense lasers\nwhich can destroy approaching missiles.\n\n Upgrades: Battle Tank\n Upgrades: Frigate + Description: Upgrade depends on chosen strategy.\n\n• Bombardment: Avenger upgrade\n• Seek & Destroy: Sidewinders upgrade\n• Hold the Line: Ceramic Armor upgrade Valued: - Cost: 1000 + Cost: 750 RenderSprites: - Image: pointlaser.upgrade + Image: strategic.upgrade + WithProductionIconOverlay: + Prerequisites: strata10.upgrade + -Encyclopedia: -sonic.upgrade: - Inherits: ^Upgrade +avenger.upgrade: + Inherits: ^GDIUpgrade Tooltip: - Name: Upgrade: Sonic Amplifiers + Name: Upgrade: Avenger Buildable: - BuildPaletteOrder: 60 - Prerequisites: ~gtek.zocom, ~techlevel.high - BuildDuration: 1500 - IconPalette: chrometd - Description: Increases the firepower of Disruptors and Sonic Towers.\n\n Upgrades: Sonic Tower\n Upgrades: Disruptor + BuildPaletteOrder: 30 + Prerequisites: ~player.gdi, gtek, ~bombard.strat, ~techlevel.high + IconPalette: chrome + Description: Replaces Warthog's incendiary bombs with GAU-8 Avenger rotary cannon and Hydra rockets.\n\nUpgrades: Warthog + TooltipExtras: + Strengths: + Increased damage\n+ Increased range + Weaknesses: – Requires two passes Valued: Cost: 1000 RenderSprites: - Image: sonic.upgrade + Image: avenger.upgrade + WithProductionIconOverlay: + Prerequisites: avenger.upgrade + EncyclopediaExtras: + AdditionalInfo: Requires Bombardment Strategy. -hypersonic.upgrade: - Inherits: ^Upgrade +sidewinders.upgrade: + Inherits: ^GDIUpgrade Tooltip: - Name: Upgrade: Hypersonic Missiles + Name: Upgrade: Sidewinders Buildable: - BuildPaletteOrder: 70 - Prerequisites: ~gtek, ~seek.strat,~techlevel.high, ~!hailstorm.upgrade, ~!hammerhead.upgrade - BuildDuration: 1500 + BuildPaletteOrder: 30 + Prerequisites: ~player.gdi, gtek, ~seek.strat, ~techlevel.high IconPalette: chrometd - Description: Equip the MLRS/HMLRS with Hypersonic Missiles.\n\n Upgrades: MLRS/HMLRS\n + Increased speed, precision and rate of fire + Description: Equips Warthogs with air-to-air missiles.\n\nUpgrades: Warthog + TooltipExtras: + Strengths: + Added air-to-air missiles Valued: - Cost: 1000 + Cost: 750 RenderSprites: - Image: hypersonic.upgrade + Image: sidewinders.upgrade + WithProductionIconOverlay: + Prerequisites: sidewinders.upgrade + EncyclopediaExtras: + AdditionalInfo: Requires Seek & Destroy Strategy. -hailstorm.upgrade: - Inherits: ^Upgrade +ceramic.upgrade: + Inherits: ^GDIUpgrade Tooltip: - Name: Upgrade: Hailstorm Missiles + Name: Upgrade: Ceramic Armor Buildable: - Prerequisites: ~gtek, ~bombard.strat, ~techlevel.high, ~!hypersonic.upgrade, ~!hammerhead.upgrade - BuildPaletteOrder: 71 - BuildDuration: 1500 + BuildPaletteOrder: 30 + Prerequisites: ~player.gdi, gtek, ~hold.strat, ~techlevel.high IconPalette: chrometd - Description: Equip the MLRS/HMLRS with Hailstorm Missiles.\n\n Upgrades: MLRS/HMLRS\n + Barrage of powerful but unguided missiles + Description: Upgrades Warthogs with ceramic armor.\n\nUpgrades: Warthog + TooltipExtras: + Strengths: + Increased durability Valued: - Cost: 1000 + Cost: 750 RenderSprites: - Image: hailstorm.upgrade + Image: ceramic.upgrade + WithProductionIconOverlay: + Prerequisites: ceramic.upgrade + EncyclopediaExtras: + AdditionalInfo: Requires Hold the Line Strategy. -hammerhead.upgrade: - Inherits: ^Upgrade +strategic.upgrade: + Inherits: ^GDIUpgrade Tooltip: - Name: Upgrade: Hammerhead Missiles + Name: Strategy Dependent Upgrade Buildable: - BuildPaletteOrder: 72 - Prerequisites: ~gtek, ~hold.strat, ~techlevel.high, ~!hypersonic.upgrade, ~!hailstorm.upgrade - BuildDuration: 1500 + BuildPaletteOrder: 30 + Prerequisites: ~player.gdi, gtek, anystrategy, ~!bombard.strat, ~!seek.strat, ~!hold.strat, ~techlevel.high IconPalette: chrometd - Description: Equip the MLRS/HMLRS with Hammerhead Missiles.\n\n Upgrades: MLRS/HMLRS\n + Increased area of effect and damage\n + Briefly slows movement and rate of fire of impacted targets + Description: Upgrade depends on chosen strategy.\n\n• Bombardment: Tomahawk Launcher research\n• Seek & Destroy: TOW Missile upgrade\n• Hold the Line: Point Defense Systems upgrade Valued: Cost: 1000 RenderSprites: - Image: hammerhead.upgrade + Image: strategic.upgrade + WithProductionIconOverlay: + Prerequisites: strategic.upgrade + -Encyclopedia: -ionmam.upgrade: - Inherits: ^Upgrade +thwk.upgrade: + Inherits: ^GDIUpgrade Tooltip: - Name: Research: Ion Mammoth + Name: Research: Tomahawk Launcher Buildable: - BuildPaletteOrder: 80 - Prerequisites: ~upgc.zocom, ~techlevel.high + BuildPaletteOrder: 30 IconPalette: chrometd - BuildDuration: 1500 - Description: Allows construction of the Ion Mammoth Tank.\n\n Replaces: Mammoth Tank\n + Increased range\n + Increased area of effect + Prerequisites: ~player.gdi, gtek, ~bombard.strat, ~techlevel.high + Description: Allows construction of Tomahawk Missile Launchers. + TooltipExtras: + Strengths: + Strong vs Buildings\n+ Extremely long range + Weaknesses: – Projectiles can be shot down\n– Slow rate of fire Valued: Cost: 1000 RenderSprites: - Image: ionmam.upgrade + Image: thwk.upgrade + WithProductionIconOverlay: + Prerequisites: thwk.upgrade + EncyclopediaExtras: + AdditionalInfo: Requires Bombardment Strategy. -hovermam.upgrade: - Inherits: ^Upgrade +tow.upgrade: + Inherits: ^GDIUpgrade Tooltip: - Name: Research: Hover Mammoth + Name: Research: TOW Missile Buildable: - BuildPaletteOrder: 81 - Prerequisites: ~upgc.eagle, ~techlevel.high - IconPalette: chrometd - BuildDuration: 1500 - Description: Allows construction of the Hover Mammoth Tank.\n\n Replaces: Mammoth Tank\n + Faster movement speed\n + Can cross water + BuildPaletteOrder: 30 + Prerequisites: ~player.gdi, gtek, ~seek.strat, ~techlevel.high + Description: Hum-Vees and Guardian Drones will be produced with TOW missile launchers.\n\nReplaces: Hum-Vee\nReplaces: Guardian Drone + TooltipExtras: + Strengths: + Added TOW missile launcher (strong vs Heavy Armor) + Weaknesses: – Increased cost\n– Reduced speed Valued: Cost: 1000 RenderSprites: - Image: hovermam.upgrade + Image: tow.upgrade + WithProductionIconOverlay: + Prerequisites: tow.upgrade + EncyclopediaExtras: + AdditionalInfo: Requires Seek & Destroy Strategy. -railgun.upgrade: - Inherits: ^Upgrade +pointdef.upgrade: + Inherits: ^GDIUpgrade Tooltip: - Name: Research: Railgun Titan + Name: Upgrade: Point Defense Systems Buildable: - BuildPaletteOrder: 82 - Prerequisites: ~upgc.talon, ~techlevel.high + BuildPaletteOrder: 30 + Prerequisites: ~player.gdi, gtek, ~hold.strat, ~techlevel.high IconPalette: chrometd - BuildDuration: 1500 - Description: Allows construction of the Railgun Titan.\n\n Replaces: Titan\n + Increased range\n + Damages targets in a line + Description: Equips several units with point defense shields and/or point defense lasers which protect against enemy fire.\n\nUpgrades: Battle Tank (Shield and Laser)\nUpgrades: Battle Drone (Shield and Laser)\nUpgrades: Hum-Vee (Shield)\nUpgrades: Guardian Drone (Shield)\nUpgrades: Harvester (Shield)\nUpgrades: Frigate (Laser) + TooltipExtras: + Strengths: + Added Point Defense Shield\n+ Added Point Defense Laser Valued: - Cost: 1000 + Cost: 1500 RenderSprites: - Image: railgun.upgrade - -#########################NOD######### -######################################## + Image: pointdef.upgrade + WithProductionIconOverlay: + Prerequisites: pointdef.upgrade + EncyclopediaExtras: + AdditionalInfo: Requires Hold the Line Strategy. -howi.upgrade: - Inherits: ^Upgrade +stratmiss.upgrade: + Inherits: ^GDIUpgrade Tooltip: - Name: Research: Howitzer + Name: Strategy Dependent Upgrade Buildable: - BuildPaletteOrder: 20 - Prerequisites: ~upgrades.howi, ~techlevel.high - BuildDuration: 1500 - Description: Allows construction of Howitzers.\n\n Replaces: Artillery\n + Increased speed\n + Has turret\n – Reduced rate of fire + BuildPaletteOrder: 30 + Prerequisites: ~player.gdi, gtek, anystrategy, ~!bombard.strat, ~!seek.strat, ~!hold.strat, ~techlevel.high + IconPalette: chrometd + Description: Equip the MLRS/HMLRS with improved missiles depending on chosen strategy.\n\n• Bombardment: Hailstorm Missiles\n• Seek & Destroy: Hypersonic Missiles\n• Hold the Line: Hammerhead Missiles Valued: Cost: 1000 RenderSprites: - Image: howi.upgrade + Image: strategic.upgrade + WithProductionIconOverlay: + Prerequisites: stratmiss.upgrade + -Encyclopedia: -microwave.upgrade: - Inherits: ^Upgrade +hailstorm.upgrade: + Inherits: ^GDIUpgrade Tooltip: - Name: Research: Intensified Microwaves + Name: Upgrade: Hailstorm Missiles Buildable: + Prerequisites: ~player.gdi, gtek, ~bombard.strat, ~techlevel.high, ~!hypersonic.upgrade, ~!hammerhead.upgrade BuildPaletteOrder: 30 - Prerequisites: ~tmpl.legion, ~techlevel.high IconPalette: chrometd - BuildDuration: 1500 - Description: Upgrades Microwave Tank weapon such that it kills vehicle crews and disables defenses for longer.\n\n Upgrades: Microwave Tank + Description: Equip the MLRS/HMLRS with Hailstorm Missiles.\n\nUpgrades: MLRS/HMLRS + TooltipExtras: + Strengths: + Increased damage and area of effect\n+ Fires six missiles per salvo + Weaknesses: – Reduced accuracy Valued: Cost: 1000 RenderSprites: - Image: microwave.upgrade + Image: hailstorm.upgrade + WithProductionIconOverlay: + Prerequisites: hailstorm.upgrade + EncyclopediaExtras: + AdditionalInfo: Requires Bombardment Strategy. -tibcore.upgrade: - Inherits: ^Upgrade +hypersonic.upgrade: + Inherits: ^GDIUpgrade Tooltip: - Name: Research: Tib Core Missiles + Name: Upgrade: Hypersonic Missiles Buildable: BuildPaletteOrder: 30 - Prerequisites: ~tmpl, ~techlevel.high - BuildDuration: 1500 - Description: Upgrade to Tib Core missiles.\n\n Upgrades: Recon Bike\n Upgrades: Stealth Tank\n + Increased range\n + Increased damage + Prerequisites: ~player.gdi, gtek, ~seek.strat,~techlevel.high, ~!hailstorm.upgrade, ~!hammerhead.upgrade + IconPalette: chrometd + Description: Equip the MLRS/HMLRS with Hypersonic Missiles.\n\nUpgrades: MLRS/HMLRS + TooltipExtras: + Strengths: + Increased projectile speed, precision and damage + Weaknesses: – Unguided Valued: Cost: 1000 RenderSprites: - Image: tibcore.upgrade + Image: hypersonic.upgrade + WithProductionIconOverlay: + Prerequisites: hypersonic.upgrade + EncyclopediaExtras: + AdditionalInfo: Requires Seek & Destroy Strategy. -cyborg.upgrade: - Inherits: ^Upgrade +hammerhead.upgrade: + Inherits: ^GDIUpgrade Tooltip: - Name: Research: Cybernetics + Name: Upgrade: Hammerhead Missiles Buildable: - BuildPaletteOrder: 40 - Prerequisites: ~tmpp, ~techlevel.high - BuildDuration: 1500 + BuildPaletteOrder: 30 + Prerequisites: ~player.gdi, gtek, ~hold.strat, ~techlevel.high, ~!hypersonic.upgrade, ~!hailstorm.upgrade IconPalette: chrometd - Description: Basic infantry are superseded by more\npowerful cyborg equivalents.\n\n Replaces: Mini-Gunner\n Replaces: Rocket Soldier\n Replaces: Flamethrower\n Upgrades: Acolyte + Description: Equip the MLRS/HMLRS with Hammerhead Missiles.\n\nUpgrades: MLRS/HMLRS + TooltipExtras: + Strengths: + Increased damage and area of effect\n+ Briefly slows movement and rate of fire of impacted targets + Weaknesses: – Reduced projectile speed Valued: Cost: 1000 RenderSprites: - Image: cyborg.upgrade + Image: hammerhead.upgrade + WithProductionIconOverlay: + Prerequisites: hammerhead.upgrade + EncyclopediaExtras: + AdditionalInfo: Requires Hold the Line Strategy. -cyborgspeed.upgrade: - Inherits: ^Upgrade +sonic.upgrade: + Inherits: ^GDIUpgrade Tooltip: - Name: Upgrade: Improved Cyborg Speed + Name: Upgrade: Sonic Amplifiers Buildable: - BuildPaletteOrder: 41 - Prerequisites: cyborg.upgrade, ~tmpp, ~techlevel.high - BuildDuration: 1500 + BuildPaletteOrder: 30 + Prerequisites: ~player.zocom, gtek, ~techlevel.high IconPalette: chrometd - Description: Improves cyborg movement speed.\n\n Upgrades: Cyborg\n Upgrades: Cyborg Reaper\n Upgrades: Chemical Warrior\n Upgrades: Acolyte\n Upgrades: Cyborg Elite\n + 20% faster movement + Description: Improve the weapons of Disruptors and Sonic Towers.\n\nUpgrades: Sonic Tower\nUpgrades: Disruptor + TooltipExtras: + Strengths: + Increased damage\n+ Increased range\n+ Slows enemy movement and rate of fire Valued: Cost: 1000 RenderSprites: - Image: cyborgspeed.upgrade + Image: sonic.upgrade + WithProductionIconOverlay: + Prerequisites: sonic.upgrade + EncyclopediaExtras: + Subfaction: zocom -cyborgarmor.upgrade: - Inherits: ^Upgrade +abur.upgrade: + Inherits: ^GDIUpgrade Tooltip: - Name: Upgrade: Improved Cyborg Armour + Name: Upgrade: Afterburners Buildable: - BuildPaletteOrder: 42 - Prerequisites: cyborg.upgrade, ~tmpp, ~techlevel.high - BuildDuration: 1500 + BuildPaletteOrder: 30 + Prerequisites: ~player.eagle, gtek, ~techlevel.high IconPalette: chrometd - Description: Improves cyborg armor.\n\n Upgrades: Cyborg\n Upgrades: Cyborg Reaper\n Upgrades: Chemical Warrior\n Upgrades: Acolyte\n Upgrades: Cyborg Elite\n + 20% less damage taken + Description: Equips Orcas, Orca Bombers and Hover Mammoths with afterburners.\n\nUpgrades: Orca\nUpgrades: Orca Bomber\nUpgrades: Hover Mammoth + TooltipExtras: + Strengths: + Added Afterburner for temporary speed boost Valued: - Cost: 1000 + Cost: 750 RenderSprites: - Image: cyborgarmor.upgrade - -#########################SOVIET######### -######################################## + Image: abur.upgrade + WithProductionIconOverlay: + Prerequisites: abur.upgrade + EncyclopediaExtras: + Subfaction: eagle -v2.upgrade: - Inherits: ^Upgrade +bdrone.upgrade: + Inherits: ^GDIUpgrade Tooltip: - Name: Research: V2 Launcher + Name: Research: Battle Drone Buildable: - BuildPaletteOrder: 20 - Prerequisites: ~upgrades.v2, ~techlevel.medium - BuildDuration: 1500 - Description: Allows construction of the V2 Launcher.\n\n Replaces: Katyusha\n + Improved accuracy\n + Increased range\n + Increased burst damage\n – Reduced area of effect\n – Slower projectiles\n – Increased cost + BuildPaletteOrder: 30 + Prerequisites: ~player.arc, gtek, ~techlevel.high + Description: Allows construction of remotely piloted Battle Tanks.\n\nReplaces: Battle Tank + TooltipExtras: + Strengths: + Reduced cost\n+ Increased rate of fire\n+ Self-repair\n• XP of losses reclaimed by replacements\n+ Immunity to crew kill, chaos gas and mind control + Weaknesses: – Reduced HP\n– Reduced damage\n– Disabled if radar is down\n– Can be hacked Valued: - Cost: 1000 + Cost: 750 RenderSprites: - Image: v2.upgrade + Image: bdrone.upgrade + AnnounceOnCreation: + SoundNotification: UPG-bdrone + Delay: 60 + WithProductionIconOverlay: + Prerequisites: bdrone.upgrade + EncyclopediaExtras: + Subfaction: arc -hazmatsoviet.upgrade: - Inherits: ^Upgrade +railgun.upgrade: + Inherits: ^GDIUpgrade Tooltip: - Name: Upgrade: Heavy Hazmat Suits + Name: Research: Railgun Titan Buildable: - BuildPaletteOrder: 10 - Prerequisites: ~dome, ~barr, ~techlevel.high - BuildDuration: 1500 - Description: Infantry are equipped with heavy hazmat suits which\nprovides protection against Tiberium and radiation.\n\n Upgrades: Infantry\n + Tiberium immunity\n + High radiation resistance\n – 33% slower movement across resources and rough terrain + BuildPaletteOrder: 40 + Prerequisites: ~player.talon, upgc, ~techlevel.high + IconPalette: chrometd + Description: Allows construction of the Railgun Titan.\n\nReplaces: Titan + TooltipExtras: + Strengths: + Increased range\n+ Damages targets in a line Valued: - Cost: 1000 + Cost: 750 + AnnounceOnCreation: + SoundNotification: UPG-railgun + Delay: 60 RenderSprites: - Image: hazmats.upgrade + Image: railgun.upgrade + WithProductionIconOverlay: + Prerequisites: railgun.upgrade + EncyclopediaExtras: + Subfaction: talon -iraqtank.upgrade: - Inherits: ^Upgrade +ionmam.upgrade: + Inherits: ^GDIUpgrade Tooltip: - Name: Upgrade: Atomic Engines + Name: Research: Ion Mammoth Buildable: - BuildPaletteOrder: 30 - Prerequisites: ~radar.iraq, ~techlevel.high - BuildDuration: 1500 - Description: Upgrades Mammoth and Heavy tanks\nwith volatile atomic engines.\n\n Replaces: Heavy Tank\n Replaces: Mammoth Tank\n + 25% faster movement\n – Explodes on death + BuildPaletteOrder: 40 + Prerequisites: ~player.zocom, upgc, ~techlevel.high + IconPalette: chrometd + Description: Allows construction of the Ion Mammoth Tank.\n\nReplaces: Mammoth Tank + TooltipExtras: + Strengths: + Increased range\n+ Increased area of effect Valued: - Cost: 1000 + Cost: 750 RenderSprites: - Image: iraqtank.upgrade + Image: ionmam.upgrade + AnnounceOnCreation: + SoundNotification: UPG-ionmam + Delay: 60 + WithProductionIconOverlay: + Prerequisites: ionmam.upgrade + EncyclopediaExtras: + Subfaction: zocom -lasher.upgrade: - Inherits: ^Upgrade +hovermam.upgrade: + Inherits: ^GDIUpgrade Tooltip: - Name: Upgrade: Lasher Tank + Name: Research: Hover Mammoth Buildable: - BuildPaletteOrder: 30 - Prerequisites: ~radar.yuri, ~techlevel.high - BuildDuration: 1500 - Description: Upgrades Heavy tanks with infantry crushing attachment.\n\n Replaces: Heavy Tank\n + 20% faster movement\n + Damages infantry it moves through\n + Not slowed by infantry\n – Reduced hit points\n – Reduced firepower + BuildPaletteOrder: 40 + Prerequisites: ~player.eagle, upgc, ~techlevel.high + IconPalette: chrometd + Description: Allows construction of the Hover Mammoth Tank.\n\nReplaces: Mammoth Tank + TooltipExtras: + Strengths: + Faster movement speed\n+ Can traverse water Valued: - Cost: 1000 + Cost: 750 RenderSprites: - Image: lasher.upgrade + Image: hovermam.upgrade + AnnounceOnCreation: + SoundNotification: UPG-hovermam + Delay: 60 + WithProductionIconOverlay: + Prerequisites: hovermam.upgrade + EncyclopediaExtras: + Subfaction: eagle -seismic.upgrade: - Inherits: ^Upgrade +mdrone.upgrade: + Inherits: ^GDIUpgrade Tooltip: - Name: Upgrade: Seismic Missiles + Name: Research: Mammoth Drone Buildable: BuildPaletteOrder: 40 - Prerequisites: ~stek.ukraine, ~techlevel.high - BuildDuration: 1500 - Description: Arms the Sukhoi with Seismic Missiles.\n\n Upgrades: Sukhoi\n + High area damage vs structures and vehicles\n + Slows movement and rate of fire of impacted targets\n – Slow moving projectiles + Prerequisites: ~player.arc, upgc, ~techlevel.high + Description: Allows construction of remotely piloted Mammoth Tanks.\n\nReplaces: Mammoth Tank + TooltipExtras: + Strengths: + Reduced cost\n+ Increased rate of fire\n+ Improved self-repair\n• XP of losses reclaimed by replacements\n+ Immunity to crew kill, chaos gas and mind control + Weaknesses: – Reduced HP\n– Reduced damage\n– Disabled if radar is down\n– Can be hacked Valued: - Cost: 1000 + Cost: 750 RenderSprites: - Image: seismic.upgrade + Image: mdrone.upgrade + AnnounceOnCreation: + SoundNotification: UPG-mdrone + Delay: 60 + WithProductionIconOverlay: + Prerequisites: mdrone.upgrade + EncyclopediaExtras: + Subfaction: arc -tarc.upgrade: - Inherits: ^Upgrade +gyro.upgrade: + Inherits: ^GDIUpgrade Tooltip: - Name: Research: Tesla Arcing + Name: Upgrade: Gyro Stabilizers Buildable: - BuildPaletteOrder: 50 - Prerequisites: ~stek.russia, ~techlevel.medium - BuildDuration: 1500 - Description: Upgrades Tesla Tank and Tesla Track weapons.\n\n Upgrades: Tesla Tank\n Upgrades: Tesla Track\n + Shots jump to up to 2 additional targets + BuildPaletteOrder: 40 + Prerequisites: ~player.talon, upgc, ~techlevel.high + IconPalette: chrometd + Description: Allows mech units to activate gyro stabilizers, increasing range but reducing rate of fire.\n\nUpgrades: Wolverine\nUpgrades: Titan\nUpgrades: Railgun Titan\nUpgrades: Juggernaut + TooltipExtras: + Strengths: + Added Gyro Stabilizers ability (increased range, reduced rate of fire)\n+ Increases Juggernaut range by 50%. Valued: Cost: 1000 RenderSprites: - Image: tarc.upgrade + Image: gyro.upgrade + WithProductionIconOverlay: + Prerequisites: gyro.upgrade + EncyclopediaExtras: + Subfaction: talon -indp.upgrade: - Inherits: ^Upgrade +upgc.drop: + Inherits: ^GDIUpgrade + Valued: + Cost: 1000 Tooltip: - Name: Upgrade: Rapid Industry + Name: Upgrade: Supply Drop Zone Buildable: - BuildPaletteOrder: 60 - Prerequisites: ~indp, ~techlevel.high - BuildDuration: 3000 - Description: Increases Industrial Plant performance.\n\n Upgrades: Industrial Plant\n + Additional 5% production speed\n + Additional 5% cost reduction - Valued: - Cost: 2000 + BuildPaletteOrder: 90 + Prerequisites: ~gdiorupgc, upgc, !bombard3.strat, !seek3.strat, !hold3.strat, ~techlevel.high + Description: Provides a dropzone for emergency supplies. + IconPalette: chrometd + TooltipExtras: + Strengths: + $1250 delivered every 60 seconds (normal speed) + Attributes: (!) Mutually exclusive with Firestorm Missile System, Advanced Radar System and Nanoshield Generator RenderSprites: - Image: indp.upgrade + PlayerPalette: playertd + UpdatesCount: + Type: StrategyLevel + WithProductionIconOverlay: + Prerequisites: dropzone +#########################NOD######### +######################################## -#######################ALLIES############################ -######################################################### +ANYCOVENANT: + AlwaysVisible: + Interactable: + Tooltip: + Name: Active Covenant + Buildable: + Description: Active Covenant + ProvidesPrerequisite: -apb.upgrade: +^NodUpgrade: Inherits: ^Upgrade + Encyclopedia: + Category: Nod/Upgrades + +wrath.covenant: + Inherits: ^NodUpgrade Tooltip: - Name: Research: Raufoss Ammo + Name: Covenant of Wrath Buildable: - BuildPaletteOrder: 20 - Prerequisites: ~radar.england, ~techlevel.high - BuildDuration: 1500 - Description: Upgrades Snipers granting them Raufoss armor piercing rounds, which stun\nand damage armoured targets.\n\n Upgrades: Sniper + BuildPaletteOrder: 13 + Prerequisites: ~player.nod, covenant.level1, !unity.covenant, !zeal.covenant, ~techlevel.medium + Description: Adopt the Covenant of Wrath.\n\n• Level 1: Assassin Squad & Compressed Plasma (+3 Banshee ammo)\n• Level 2: Cyborg Armor & Laser Tanks Upgrades\n• Level 3: Avatar, Cyborg Elite & Cyborg Firepower Upgrade + IconPalette: chrometd + TooltipExtras: + Attributes: (!) Only ONE Covenant may be chosen. Valued: - Cost: 1000 + Cost: 300 RenderSprites: - Image: apb.upgrade + Image: wrath.covenant + WithProductionIconOverlay: + Prerequisites: wrath.covenant + FreeActorCA@AssassinSquad: + Actor: assassinsquad.provider -cryr.upgrade: - Inherits: ^Upgrade +unity.covenant: + Inherits: ^NodUpgrade Tooltip: - Name: Research: Cryo Rockets + Name: Covenant of Unity Buildable: - BuildPaletteOrder: 30 - Prerequisites: ~atek, ~techlevel.high - BuildDuration: 1500 - Description: Upgrades Rocket Soldier granting them Cryo warheads which cause\ntargets to move more slowly and take increased damage.\n\n Upgrades: Rocket Soldier + BuildPaletteOrder: 14 + Prerequisites: ~player.nod, covenant.level1, !wrath.covenant, !zeal.covenant, ~techlevel.medium + Description: Adopt the Covenant of Unity.\n\n• Level 1: Hacker Squad, Internet Center & Siphoned Funds ($ from Hackers in Internet Center)\n• Level 2: Cyborg Armor & Custodian Upgrades\n• Level 3: Cyborg Reaper, Cyborg Elite & Reclaimed Fabrication Upgrade + IconPalette: chrometd + TooltipExtras: + Attributes: (!) Only ONE Covenant may be chosen. Valued: - Cost: 1000 + Cost: 300 RenderSprites: - Image: cryr.upgrade + Image: unity.covenant + WithProductionIconOverlay: + Prerequisites: unity.covenant + FreeActorCA@HackerCell: + Actor: hackercell.provider -pcan.upgrade: - Inherits: ^Upgrade +zeal.covenant: + Inherits: ^NodUpgrade Tooltip: - Name: Research: Prism Cannon + Name: Covenant of Zeal Buildable: - BuildPaletteOrder: 40 - Prerequisites: ~atek, ~techlevel.high - BuildDuration: 1500 - Description: Allows construction of Prism Cannons.\n\n Replaces: Prism Tank\n + Increased range\n + Increased burst damage\n – Reduced speed\n – Reduced rate of fire\n – Reduced splash damage\n – No turret + BuildPaletteOrder: 15 + Prerequisites: ~player.nod, covenant.level1, !unity.covenant, !wrath.covenant, ~techlevel.medium + Description: Adopt the Covenant of Zeal.\n\n• Level 1: Confessor Cabal & Fast Harrassers (+15% Bike/Buggy/Howitzer speed)\n• Level 2: Cyborg Armor & Raider Buggy Upgrades\n• Level 3: Enlightened, Cyborg Elite & Cyborg Speed Upgrade + IconPalette: chrometd + TooltipExtras: + Attributes: (!) Only ONE Covenant may be chosen. Valued: - Cost: 1000 + Cost: 300 RenderSprites: - Image: pcan.upgrade + Image: zeal.covenant + WithProductionIconOverlay: + Prerequisites: zeal.covenant + FreeActorCA@ConfessorCabal: + Actor: confessorcabal.provider -charv.upgrade: - Inherits: ^Upgrade +howi.upgrade: + Inherits: ^NodUpgrade Tooltip: - Name: Research: Chrono Miner + Name: Research: Howitzer Buildable: - BuildPaletteOrder: 50 - Prerequisites: ~orep, ~techlevel.high - BuildDuration: 3000 - Description: Allows construction of Chrono Miners which\nteleport back to refineries.\n\n Replaces: Ore Truck + BuildPaletteOrder: 20 + Prerequisites: ~player.nod, anyradar, ~techlevel.medium + Description: Allows construction of Howitzers.\n\nReplaces: Artillery + TooltipExtras: + Strengths: + Increased projectile speed\n+ Increased movement speed\n+ Increased accuracy\n+ Increased burst damage\n+ Increased vision\n+ Has turret + Weaknesses: – Reduced splash radius\n– Reduced range\n– Reduced rate of fire Valued: - Cost: 2000 + Cost: 500 RenderSprites: - Image: charv.upgrade + Image: howi.upgrade + ProductionCostMultiplier@blackh: + Multiplier: 0 + Prerequisites: player.blackh + ProductionTimeMultiplier@blackh: + Multiplier: 0 + Prerequisites: player.blackh + WithProductionIconOverlay: + Prerequisites: howi.upgrade -tflx.upgrade: - Inherits: ^Upgrade +decoy.upgrade: + Inherits: ^NodUpgrade Tooltip: - Name: Research: Temporal Flux + Name: Upgrade: Decoy Projectors Buildable: - BuildPaletteOrder: 55 - Prerequisites: ~orep.germany, ~techlevel.high - BuildDuration: 1500 - Description: Upgrades Chrono Prisons granting them the ability to teleport through time.\n\n Upgrades: Chrono Prison + BuildPaletteOrder: 20 + Prerequisites: ~player.nod, anyradar, ~techlevel.medium + Description: Grant Buggies the ability to project a pair of decoy Flame Tanks. Decoys provide small area of vision for a short time after being killed.\n\nUpgrades: Buggy\nUpgrades: Raider Buggy + TooltipExtras: + Strengths: + Decoy projection ability Valued: - Cost: 1000 + Cost: 750 RenderSprites: - Image: tflx.upgrade + Image: decoy.upgrade + WithProductionIconOverlay: + Prerequisites: decoy.upgrade -orep.upgrade: - Inherits: ^Upgrade +sharv.upgrade: + Inherits: ^NodUpgrade Tooltip: - Name: Upgrade: Advanced Ore Processing + Name: Upgrade: Stealth Harvester Buildable: - BuildPaletteOrder: 60 - Prerequisites: ~orep, ~techlevel.high - BuildDuration: 3000 - Description: Increases Ore Purifier efficiency (additional 5%).\n\n Upgrades: Ore Purifier + BuildPaletteOrder: 30 + Prerequisites: ~player.nod, tmpl, ~techlevel.high + Description: Allows construction of Stealth Harvesters which are cloaked while moving.\n\nUpgrades: Harvester + TooltipExtras: + Strengths: + Hidden while moving + Weaknesses: – Reduced health Valued: - Cost: 2000 + Cost: 1500 RenderSprites: - Image: orep.upgrade + Image: sharv.upgrade + WithProductionIconOverlay: + Prerequisites: sharv.upgrade -################################SCRIN############################## +tibcore.upgrade: + Inherits: ^NodUpgrade + Tooltip: + Name: Upgrade: Tiberium Core Missiles + Buildable: + BuildPaletteOrder: 30 + Prerequisites: ~player.nod, tmpl, ~techlevel.high + Description: Upgrade to Tiberium Core missiles.\n\nUpgrades: Recon Bike\nUpgrades: Stealth Tank\nUpgrades: Cyborg Rocket Soldier\nUpgrades: Rocket Soldier + IconPalette: chrometd + TooltipExtras: + Strengths: + Increased range\n+ Increased damage\n+ Increased projectile speed + Valued: + Cost: 1000 + RenderSprites: + Image: tibcore.upgrade + AnnounceOnCreation: + SoundNotification: UPG-tibcore + Delay: 60 + WithProductionIconOverlay: + Prerequisites: tibcore.upgrade + +blacknapalm.upgrade: + Inherits: ^NodUpgrade + Tooltip: + Name: Upgrade: Black Napalm + Buildable: + BuildPaletteOrder: 30 + Prerequisites: ~player.blackh, tmpl, ~techlevel.high + Description: Superheated flame weapons that can melt armored targets.\n\nUpgrades: Heavy Flame Tank\nUpgrades: SSM Launcher\nUpgrades: Avatar + TooltipExtras: + Strengths: + Increased damage against vehicles and defenses + Weaknesses: – Reduced rate of fire + Valued: + Cost: 1000 + RenderSprites: + Image: blacknapalm.upgrade + WithProductionIconOverlay: + Prerequisites: blacknapalm.upgrade + EncyclopediaExtras: + Subfaction: blackh + +microwave.upgrade: + Inherits: ^NodUpgrade + Tooltip: + Name: Upgrade: Intensified Microwaves + Buildable: + BuildPaletteOrder: 30 + Prerequisites: ~player.legion, tmpl, ~techlevel.high + IconPalette: chrometd + Description: Upgrades: Microwave Tank + TooltipExtras: + Strengths: + Kills crew of vehicles with less than 75% HP\n + Increased EMP duration for direct target\n+ EMP affects adjacent vehicles/defenses + Valued: + Cost: 1000 + RenderSprites: + Image: microwave.upgrade + AnnounceOnCreation: + SoundNotification: UPG-microwave + Delay: 60 + WithProductionIconOverlay: + Prerequisites: microwave.upgrade + EncyclopediaExtras: + Subfaction: legion + +quantum.upgrade: + Inherits: ^NodUpgrade + Tooltip: + Name: Upgrade: Quantum Capacitors + Buildable: + BuildPaletteOrder: 30 + Prerequisites: ~player.marked, tmpl, ~techlevel.high + Description: Enhances heavy laser weapons.\n\nUpgrades: Obelisk of Light\nUpgrades: Avatar\nUpgrades: Laser Turret\nUpgrades: Venom\nUpgrades: Templar + TooltipExtras: + Strengths: + Increased range\n+ Increased damage + Valued: + Cost: 1000 + RenderSprites: + Image: quantum.upgrade + WithProductionIconOverlay: + Prerequisites: quantum.upgrade + EncyclopediaExtras: + Subfaction: marked + +hstk.upgrade: + Inherits: ^NodUpgrade + Tooltip: + Name: Research: Heavy Stealth Tank + Buildable: + BuildPaletteOrder: 30 + Prerequisites: ~player.shadow, tmpl, ~techlevel.high + Description: Upgrades: Stealth Tank + TooltipExtras: + Strengths: + Increased damage\n+ Increased durability + Weaknesses: – Reduced mobility\n– Increased cost\n– Increased cloaking delay + Valued: + Cost: 1000 + RenderSprites: + Image: hstk.upgrade + WithProductionIconOverlay: + Prerequisites: hstk.upgrade + EncyclopediaExtras: + Subfaction: shadow + +covenant.upgrade: + Inherits: ^NodUpgrade + Tooltip: + Name: Covenant Dependent Upgrade + Buildable: + BuildPaletteOrder: 30 + Prerequisites: ~player.nod, anycovenant, covenant.level2, ~!wrath.covenant, ~!unity.covenant, ~!zeal.covenant, ~techlevel.high + IconPalette: chrometd + Description: Upgrade depends on chosen covenant.\n\n• Wrath: Laser Tanks\n• Unity: Custodian\n• Zeal: Raider Buggy + Valued: + Cost: 750 + RenderSprites: + Image: covenant.upgrade + WithProductionIconOverlay: + Prerequisites: covenant.upgrade + -Encyclopedia: + +lastnk.upgrade: + Inherits: ^NodUpgrade + Tooltip: + Name: Upgrade: Laser Tanks + Buildable: + BuildPaletteOrder: 30 + Prerequisites: ~player.nod, covenant.level2, ~wrath.covenant, ~techlevel.high + Description: Upgrades: Light Tank\nUpgrades: Battle Tank + TooltipExtras: + Strengths: + Increased damage vs infantry & light armor\n+ Increased range + Weaknesses: – Reduced damage vs heavy armor + Valued: + Cost: 750 + RenderSprites: + Image: lastnk.upgrade + WithProductionIconOverlay: + Prerequisites: lastnk.upgrade + +cust.upgrade: + Inherits: ^NodUpgrade + Tooltip: + Name: Research: Custodian + Buildable: + BuildPaletteOrder: 30 + Prerequisites: ~player.nod, covenant.level2, ~unity.covenant, ~techlevel.high + Description: Replaces: Stealth APC + TooltipExtras: + Strengths: + Heavy armor\n+ Heals cyborgs & repairs vehicles + Weaknesses: – No stealth capability\n– No offensive capability\n– Reduced speed\n– Increased cost + Valued: + Cost: 750 + RenderSprites: + Image: cust.upgrade + WithProductionIconOverlay: + Prerequisites: cust.upgrade + +rbug.upgrade: + Inherits: ^NodUpgrade + Tooltip: + Name: Research: Raider Buggy + Buildable: + BuildPaletteOrder: 30 + Prerequisites: ~player.nod, covenant.level2, ~zeal.covenant, ~techlevel.high + Description: Replaces: Buggy + TooltipExtras: + Strengths: + Heavy armor\n+ Increased damage\n+ Increased range + Weaknesses: – Increased cost\n– Reduced speed + Valued: + Cost: 750 + RenderSprites: + Image: rbug.upgrade + WithProductionIconOverlay: + Prerequisites: rbug.upgrade + +cyborgarmor.upgrade: + Inherits: ^NodUpgrade + Tooltip: + Name: Upgrade: Improved Cyborg Armor + Buildable: + BuildPaletteOrder: 40 + Prerequisites: ~player.nod, covenant.level2, ~techlevel.high + IconPalette: chrometd + Description: Improves cyborg armor.\n\nUpgrades: Cyborg\nUpgrades: Cyborg Rocket Soldier\nUpgrades: Chemical Warrior\nUpgrades: Acolyte/Templar\nUpgrades: Cyborg Mechanic\nUpgrades: Enlightened\nUpgrades: Cyborg Reaper\nUpgrades: Cyborg Elite + TooltipExtras: + Strengths: + 20% reduced damage taken\n+ Additional 10% reduced damage from explosives + Valued: + Cost: 1000 + RenderSprites: + Image: cyborgarmor.upgrade + WithProductionIconOverlay: + Prerequisites: cyborgarmor.upgrade + +covenant.upgrade2: + Inherits: ^NodUpgrade + Tooltip: + Name: Covenant Dependent Upgrade + Buildable: + BuildPaletteOrder: 40 + Prerequisites: ~player.nod, anycovenant, tmpp, covenant.level3, ~!wrath.covenant, ~!unity.covenant, ~!zeal.covenant, ~techlevel.high + IconPalette: chrometd + Description: Upgrade depends on chosen covenant.\n\n• Wrath: Cyborg Firepower\n• Unity: Augmented Fabrication\n• Zeal: Cyborg Speed + Valued: + Cost: 1000 + RenderSprites: + Image: covenant.upgrade + WithProductionIconOverlay: + Prerequisites: covenant.upgrade2 + -Encyclopedia: + +cyborgdmg.upgrade: + Inherits: ^NodUpgrade + Tooltip: + Name: Upgrade: Improved Cyborg Firepower + Buildable: + BuildPaletteOrder: 40 + Prerequisites: ~player.nod, covenant.level3, ~wrath.covenant, ~techlevel.high + IconPalette: chrometd + Description: Increases cyborg firepower.\n\nUpgrades: Cyborg\nUpgrades: Cyborg Rocket Soldier\nUpgrades: Chemical Warrior\nUpgrades: Acolyte/Templar\nUpgrades: Cyborg Mechanic\nUpgrades: Cyborg Elite + TooltipExtras: + Strengths: + 10% increased firepower + Valued: + Cost: 1000 + RenderSprites: + Image: cyborgdmg.upgrade + WithProductionIconOverlay: + Prerequisites: cyborgdmg.upgrade + EncyclopediaExtras: + AdditionalInfo: Requires Wrath Covenant. + +cyborgprod.upgrade: + Inherits: ^NodUpgrade + Tooltip: + Name: Upgrade: Reclaimed Fabrication + Buildable: + BuildPaletteOrder: 40 + Prerequisites: ~player.nod, covenant.level3, ~unity.covenant, ~techlevel.high + IconPalette: chrometd + Description: Leverage CABAL AI to reclaim components from lost cyborgs to replacements. + TooltipExtras: + Strengths: + 15% of lost cyborgs value is reclaimed to create new Cyborgs from Temple Prime + Valued: + Cost: 1000 + RenderSprites: + Image: cyborgprod.upgrade + WithProductionIconOverlay: + Prerequisites: cyborgprod.upgrade + EncyclopediaExtras: + AdditionalInfo: Requires Unity Covenant. + +cyborgspeed.upgrade: + Inherits: ^NodUpgrade + Tooltip: + Name: Upgrade: Improved Cyborg Speed + Buildable: + BuildPaletteOrder: 40 + Prerequisites: ~player.nod, covenant.level3, ~zeal.covenant, ~techlevel.high + IconPalette: chrometd + Description: Increases cyborg movement speed.\n\nUpgrades: Cyborg\nUpgrades: Cyborg Rocket Soldier\nUpgrades: Chemical Warrior\nUpgrades: Acolyte/Templar\nUpgrades: Cyborg Mechanic\nUpgrades: Enlightened\nUpgrades: Cyborg Elite + TooltipExtras: + Strengths: + 20% faster movement + Valued: + Cost: 1000 + RenderSprites: + Image: cyborgspeed.upgrade + WithProductionIconOverlay: + Prerequisites: cyborgspeed.upgrade + EncyclopediaExtras: + AdditionalInfo: Requires Zeal Covenant. + +#########################SOVIET######### +######################################## + +ANYDOCTRINE: + AlwaysVisible: + Interactable: + Tooltip: + Name: Active Doctrine + Buildable: + Description: Active Doctrine + ProvidesPrerequisite: + +^SovietUpgrade: + Inherits: ^Upgrade + Encyclopedia: + Category: Soviets/Upgrades + +infantry.doctrine: + Inherits: ^SovietUpgrade + Tooltip: + Name: Doctrine: Infantry + Buildable: + BuildPaletteOrder: 4 + Prerequisites: ~player.soviet, !infantry.doctrine, !armor.doctrine, !arty.doctrine, playerxp.level1, ~techlevel.medium + Description: Specialize in infantry:\n• Troop Crawler\n• Overlord Tank (replaces Mammoth Tank)\n• Improved Paratroopers Upgrade\n• Heroes of the Union\n• Cloning Vat\n\n + TooltipExtras: + Attributes: (!) Only ONE Doctrine may be chosen. + Valued: + Cost: 300 + RenderSprites: + Image: infantry.doctrine + WithProductionIconOverlay: + Prerequisites: infantry.doctrine + +armor.doctrine: + Inherits: ^SovietUpgrade + Tooltip: + Name: Doctrine: Armor + Buildable: + BuildPaletteOrder: 5 + Prerequisites: ~player.soviet, !infantry.doctrine, !armor.doctrine, !arty.doctrine, playerxp.level1, ~techlevel.medium + Description: Specialize in tanks:\n• Rhino Tank (replaces Heavy Tank)\n• Apocalypse Tank (replaces Mammoth Tank)\n• Reactive Armor Upgrade\n• Tank Drop\n• Industrial Plant\n\n + TooltipExtras: + Attributes: (!) Only ONE Doctrine may be chosen. + Valued: + Cost: 300 + RenderSprites: + Image: armor.doctrine + WithProductionIconOverlay: + Prerequisites: armor.doctrine + +arty.doctrine: + Inherits: ^SovietUpgrade + Tooltip: + Name: Doctrine: Artillery + Buildable: + BuildPaletteOrder: 6 + Prerequisites: ~player.soviet, !infantry.doctrine, !armor.doctrine, !arty.doctrine, playerxp.level1, ~techlevel.medium + Description: Specialize in artillery:\n• Grad (replaces Katyusha)\n• Nuke Cannon\n• Rocket Pods Upgrade\n• Kill Zone\n• Munitions Plant\n\n + TooltipExtras: + Attributes: (!) Only ONE Doctrine may be chosen. + Valued: + Cost: 300 + RenderSprites: + Image: arty.doctrine + WithProductionIconOverlay: + Prerequisites: arty.doctrine + +hazmatsoviet.upgrade: + Inherits: ^SovietUpgrade + Tooltip: + Name: Upgrade: Heavy Hazmat Suits + Buildable: + BuildPaletteOrder: 19 + Prerequisites: ~player.soviet, ~!player.iraq, anyradar, infantry.any, ~techlevel.medium + Description: Infantry are equipped with heavy hazmat suits which provides protection against Tiberium and radiation.\n\nUpgrades: Infantry + TooltipExtras: + Strengths: + Tiberium immunity\n+ High resistance to irradiated terrain + Weaknesses: – 33% slower movement across resources and rough terrain + Valued: + Cost: 850 + RenderSprites: + Image: hazmats.upgrade + WithProductionIconOverlay: + Prerequisites: hazmatsoviet.upgrade + +tdog.upgrade: + Inherits: ^SovietUpgrade + Tooltip: + Name: Research: Terror Dog + Buildable: + BuildPaletteOrder: 20 + Prerequisites: ~player.soviet, anyradar, ~techlevel.medium + Description: Attack Dogs are strapped with explosives.\n\nReplaces: Attack Dog + TooltipExtras: + Strengths: + Able to damage vehicles and buildings + Weaknesses: – Explodes on attack or on death\n– Increased cost + Valued: + Cost: 750 + RenderSprites: + Image: tdog.upgrade + WithProductionIconOverlay: + Prerequisites: tdog.upgrade + +lasher.upgrade: + Inherits: ^SovietUpgrade + Tooltip: + Name: Research: Lasher Tank + Buildable: + BuildPaletteOrder: 20 + Prerequisites: ~player.yuri, anyradar, ~techlevel.medium + Description: Upgrades Heavy/Rhino tanks with infantry crushing attachment at the cost of some armor and firepower.\n\nReplaces: Heavy Tank\nReplaces: Rhino Tank + TooltipExtras: + Strengths: + 25% faster movement\n+ Improved crushing performance + Weaknesses: – Reduced hit points\n– Reduced firepower + Valued: + Cost: 750 + RenderSprites: + Image: lasher.upgrade + WithProductionIconOverlay: + Prerequisites: lasher.upgrade + EncyclopediaExtras: + Subfaction: yuri + +gattling.upgrade: + Inherits: ^SovietUpgrade + Tooltip: + Name: Research: Gattling BTR + Buildable: + BuildPaletteOrder: 20 + Prerequisites: ~player.yuri, anyradar, ~techlevel.medium + Description: Upgrades BTRs with dual gattling cannons.\n\nReplaces: BTR + TooltipExtras: + Strengths: + Increased firepower + Weaknesses: – Increased production cost + Valued: + Cost: 750 + RenderSprites: + Image: gattling.upgrade + WithProductionIconOverlay: + Prerequisites: gattling.upgrade + EncyclopediaExtras: + Subfaction: yuri + +ttrp.upgrade: + Inherits: ^SovietUpgrade + Tooltip: + Name: Research: Tesla Trooper + Buildable: + BuildPaletteOrder: 30 + Prerequisites: ~player.soviet, ~!player.iraq, stek, ~techlevel.high + Description: Shock Troopers are phased out in favor of Tesla Troopers.\n\nReplaces: Shock Trooper + TooltipExtras: + Strengths: + Increased health\n+ Increased rate of fire\n+ Increased damage + Weaknesses: – Increased cost + Valued: + Cost: 500 + RenderSprites: + Image: ttrp.upgrade + WithProductionIconOverlay: + Prerequisites: ttrp.upgrade + ProductionCostMultiplier@russia: + Multiplier: 0 + Prerequisites: player.russia + ProductionTimeMultiplier@russia: + Multiplier: 0 + Prerequisites: player.russia + +deso.upgrade: + Inherits: ^SovietUpgrade + Tooltip: + Name: Research: Desolator + Buildable: + BuildPaletteOrder: 30 + Prerequisites: ~player.soviet, ~player.iraq, stek, ~techlevel.high + Description: Rad Troopers are phased out in favor of Desolators.\n\nReplaces: Rad Trooper + TooltipExtras: + Strengths: + Increased health\n+ Increased damage\n+ Irradiates vehicles\n+ Desolate Ground ability + Weaknesses: – Increased cost + Valued: + Cost: 500 + RenderSprites: + Image: deso.upgrade + WithProductionIconOverlay: + Prerequisites: deso.upgrade + EncyclopediaExtras: + Subfaction: iraq + +tarc.upgrade: + Inherits: ^SovietUpgrade + Tooltip: + Name: Upgrade: Tesla Arcing + Buildable: + BuildPaletteOrder: 30 + Prerequisites: ~player.russia, stek, ~techlevel.medium + Description: Upgrades the Tesla Tank and Tesla Track weapon.\n\nUpgrades: Tesla Tank\nUpgrades: Tesla Track + TooltipExtras: + Strengths: + Shots jump to up to 2 additional targets + Valued: + Cost: 1000 + RenderSprites: + Image: tarc.upgrade + WithProductionIconOverlay: + Prerequisites: tarc.upgrade + EncyclopediaExtras: + Subfaction: russia + +seismic.upgrade: + Inherits: ^SovietUpgrade + Tooltip: + Name: Upgrade: Seismic Missiles + Buildable: + BuildPaletteOrder: 30 + Prerequisites: ~player.ukraine, stek, ~techlevel.high + Description: Arms the Sukhoi with Seismic Missiles.\n\nUpgrades: Sukhoi + TooltipExtras: + Strengths: + High area damage vs structures and vehicles\n+ Slows movement and rate of fire of impacted targets + Weaknesses: – Slow moving projectiles + Valued: + Cost: 1000 + RenderSprites: + Image: seismic.upgrade + AnnounceOnCreation: + SoundNotification: UPG-seismic + Delay: 60 + WithProductionIconOverlay: + Prerequisites: seismic.upgrade + EncyclopediaExtras: + Subfaction: ukraine + +doctrine.upgrade1: + Inherits: ^SovietUpgrade + Tooltip: + Name: Doctrine Dependent Upgrade + Buildable: + BuildPaletteOrder: 30 + Prerequisites: ~player.soviet, anydoctrine, playerxp.level2, ~!infantry.doctrine, ~!armor.doctrine, ~!arty.doctrine, ~techlevel.medium + Description: Upgrade depends on chosen doctrine.\n\n• Infantry: Improved Paratroopers\n• Tanks: Reactive Armor\n• Artillery: Rocket Pods + Valued: + Cost: 750 + RenderSprites: + Image: doctrine.upgrade1 + WithProductionIconOverlay: + Prerequisites: doctrine.upgrade1 + +imppara.upgrade: + Inherits: ^SovietUpgrade + Tooltip: + Name: Upgrade: Improved Paratroopers + Buildable: + BuildPaletteOrder: 30 + Prerequisites: playerxp.level2, ~player.soviet, ~!player.russia, ~!player.yuri, ~infantry.doctrine, ~techlevel.medium + Description: Upgrades the Paratroopers support power.\n\nUpgrades: Paratroopers + TooltipExtras: + Strengths: + Additional units dropped + Valued: + Cost: 750 + RenderSprites: + Image: imppara.upgrade + WithProductionIconOverlay: + Prerequisites: imppara.upgrade + EncyclopediaExtras: + AdditionalInfo: Requires Infantry Doctrine. + +impstorm.upgrade: + Inherits: ^SovietUpgrade + Tooltip: + Name: Upgrade: Improved Stormtroopers + Buildable: + BuildPaletteOrder: 30 + Prerequisites: playerxp.level2, ~player.russia, ~infantry.doctrine, ~techlevel.medium + Description: Upgrades the Stormtroopers support power.\n\nUpgrades: Stormtroopers + TooltipExtras: + Strengths: + Additional units dropped + Valued: + Cost: 750 + RenderSprites: + Image: impstorm.upgrade + WithProductionIconOverlay: + Prerequisites: impstorm.upgrade + EncyclopediaExtras: + AdditionalInfo: Requires Infantry Doctrine. + +impmuta.upgrade: + Inherits: ^SovietUpgrade + Tooltip: + Name: Upgrade: Improved Genetic Mutation + Buildable: + BuildPaletteOrder: 30 + Prerequisites: playerxp.level2, ~player.yuri, ~infantry.doctrine, ~techlevel.medium + Description: Enhances Genetic Mutation Bomb and Brutes.\n\nUpgrades: Genetic Mutation Bomb\nUpgrades: Brute + TooltipExtras: + Strengths: + Increased area of effect (Mutation Bomb)\n+ Increased maximum number of targets (Mutation Bomb)\n+ Increased movement speed (Brute) + Valued: + Cost: 750 + RenderSprites: + Image: impmuta.upgrade + WithProductionIconOverlay: + Prerequisites: impmuta.upgrade + EncyclopediaExtras: + AdditionalInfo: Requires Infantry Doctrine. + +reactive.upgrade: + Inherits: ^SovietUpgrade + Tooltip: + Name: Upgrade: Reactive Armor + Buildable: + BuildPaletteOrder: 30 + Prerequisites: ~player.soviet, ~armor.doctrine, playerxp.level2, ~techlevel.high + Description: Upgrades Rhino Tanks and BTRs with reactive armor for additional protection.\n\nUpgrades: Rhino Tank\nUpgrades: Thrasher Tank\nUpgrades: BTR\nUpgrades: Gattling BTR + TooltipExtras: + Strengths: + Increased armor + Valued: + Cost: 750 + RenderSprites: + Image: reactive.upgrade + WithProductionIconOverlay: + Prerequisites: reactive.upgrade + EncyclopediaExtras: + AdditionalInfo: Requires Armor Doctrine. + +rocketpods.upgrade: + Inherits: ^SovietUpgrade + Tooltip: + Name: Upgrade: Rocket Pods + Buildable: + BuildPaletteOrder: 30 + Prerequisites: ~player.soviet, ~arty.doctrine, playerxp.level2, ~techlevel.high + Description: Upgrades Grad and Hind rocket pods.\n\nUpgrades: Grad\nUpgrades: Hind + TooltipExtras: + Strengths: + Increased salvo size (Grad)\n+ Increased ammo & rate of fire (Hind) + Valued: + Cost: 750 + RenderSprites: + Image: rocketpods.upgrade + WithProductionIconOverlay: + Prerequisites: rocketpods.upgrade + EncyclopediaExtras: + AdditionalInfo: Requires Artillery Doctrine. + +atomicengines.upgrade: + Inherits: ^SovietUpgrade + Tooltip: + Name: Research: Atomic Engines + Buildable: + BuildPaletteOrder: 35 + Prerequisites: ~player.soviet, npwr, ~techlevel.high + Description: Upgrades tanks with volatile atomic engines.\n\nReplaces: Heavy/Lasher Tank\nReplaces: Rhino/Thrasher Tank\nReplaces: Eradicator\nReplaces: Mammoth Tank\nReplaces: Overlord Tank\nReplaces: Apocalypse Tank + TooltipExtras: + Strengths: + 25% faster movement + Weaknesses: – Explodes on death + Valued: + Cost: 750 + RenderSprites: + Image: atomicengines.upgrade + WithProductionIconOverlay: + Prerequisites: atomicengines.upgrade + +erad.upgrade: + Inherits: ^SovietUpgrade + Tooltip: + Name: Research: Eradicator + Buildable: + BuildPaletteOrder: 35 + Prerequisites: ~player.iraq, npwr, ~techlevel.high + Description: Upgrades Mammoth tanks with volatile radiation cannon.\n\nReplaces: Mammoth Tank + TooltipExtras: + Strengths: + High area damage vs infantry and vehicles\n+ Irradiates impacted vehicles\n+ Increased range + Weaknesses: – Loses AA missiles\n– Reduced single-target anti-tank damage\n– Reduced damage vs buildings + Valued: + Cost: 1000 + RenderSprites: + Image: erad.upgrade + WithProductionIconOverlay: + Prerequisites: erad.upgrade + EncyclopediaExtras: + Subfaction: iraq + +doctrine.upgrade2: + Inherits: ^SovietUpgrade + Tooltip: + Name: Doctrine Dependent Upgrade + Buildable: + BuildPaletteOrder: 40 + Prerequisites: ~player.soviet, anydoctrine, ~!infantry.doctrine, ~!armor.doctrine, ~!arty.doctrine, ~techlevel.high + Description: Upgrade depends on chosen doctrine.\n\n• Infantry: Overlord Tank\n• Tanks: Apocalypse Tank\n• Artillery: Nuke Cannon + Valued: + Cost: 1000 + RenderSprites: + Image: doctrine.upgrade2 + WithProductionIconOverlay: + Prerequisites: doctrine.upgrade2 + +ovld.upgrade: + Inherits: ^SovietUpgrade + Tooltip: + Name: Research: Overlord Tank + Buildable: + BuildPaletteOrder: 40 + Prerequisites: playerxp.level3, ~player.soviet, ~infantry.doctrine, ~techlevel.high + Description: Allows production of Overlord Tanks.\n\nReplaces: Mammoth Tank + TooltipExtras: + Strengths: + Increased health\n+ Increased firepower\n+ Increased range\n+ Empowers nearby infantry + Weaknesses: – Reduced speed\n– Increased cost + Valued: + Cost: 1000 + RenderSprites: + Image: ovld.upgrade + WithProductionIconOverlay: + Prerequisites: ovld.upgrade + +apoc.upgrade: + Inherits: ^SovietUpgrade + Tooltip: + Name: Research: Apocalypse Tank + Buildable: + BuildPaletteOrder: 40 + Prerequisites: playerxp.level3, ~player.soviet, ~armor.doctrine, ~techlevel.high + Description: Allows production of Apocalypse Tanks.\n\nReplaces: Mammoth Tank + TooltipExtras: + Strengths: + Increased firepower\n+ Increased health\n+ Increased range\n+ Increased splash damage + Weaknesses: – Reduced speed\n– Increased cost + Valued: + Cost: 1000 + RenderSprites: + Image: apoc.upgrade + WithProductionIconOverlay: + Prerequisites: apoc.upgrade + +nukc.upgrade: + Inherits: ^SovietUpgrade + Tooltip: + Name: Research: Nuke Cannon + Buildable: + BuildPaletteOrder: 40 + Prerequisites: playerxp.level3, ~player.soviet, ~arty.doctrine, ~techlevel.high + Description: Allows production of Nuclear long range artillery. + TooltipExtras: + Strengths: + Strong vs Buildings, Defenses, Infantry, Light Armor\n+ Extremely long range + Weaknesses: – Must deploy to fire\n– Slow rate of fire\n– Slow projectiles + Valued: + Cost: 1000 + RenderSprites: + Image: nukc.upgrade + WithProductionIconOverlay: + Prerequisites: nukc.upgrade + +#######################ALLIES############################ +######################################################### + +ANYCOALITION: + AlwaysVisible: + Interactable: + Tooltip: + Name: Active Coalition + Buildable: + Description: Active Coalition + ProvidesPrerequisite: + +^AlliedUpgrade: + Inherits: ^Upgrade + Encyclopedia: + Category: Allies/Upgrades + +economy.policy: + Inherits: ^AlliedUpgrade + Tooltip: + Name: Policy: Economy + Buildable: + BuildPaletteOrder: 1 + Prerequisites: ~player.allies, influence.level1, !economy.policy, !defense.policy, !development.policy, ~techlevel.medium + Description: Pursue economic policy.\n\n• Level 1: -15% cost of Refineries, Harvesters & MCVs\n• Level 2: -25% cost of Refineries, Harvesters & MCVs, +20% MCV movement speed\n• Level 3: Free Chrono Miner upgrade, +15% Harvester durability, +50% Ore Purifier income + TooltipExtras: + Attributes: (!) Only ONE Policy may be chosen. + Valued: + Cost: 300 + RenderSprites: + Image: economy.policy + WithProductionIconOverlay: + Prerequisites: economy.policy + ProvidesPrerequisite@FreeChronoMiner: + Prerequisite: charv.upgrade + RequiresCondition: charv-upgrade + GrantConditionOnPrerequisite@FreeChronoMiner: + Condition: charv-upgrade + Prerequisites: influence.level3 + +defense.policy: + Inherits: ^AlliedUpgrade + Tooltip: + Name: Policy: Defense + Buildable: + BuildPaletteOrder: 1 + Prerequisites: ~player.allies, influence.level1, !economy.policy, !defense.policy, !development.policy, ~techlevel.medium + Description: Pursue defense policy.\n\n• Level 1: +15% building HP, +25% Construction Yard build radius\n• Level 2: +30% building HP, +40% building repair rate & +20% defense repair rate\n• Level 3: +25% building/defense vision radius, +15% defense weapon damage + TooltipExtras: + Attributes: (!) Only ONE Policy may be chosen. + Valued: + Cost: 300 + RenderSprites: + Image: defense.policy + WithProductionIconOverlay: + Prerequisites: defense.policy + +development.policy: + Inherits: ^AlliedUpgrade + Tooltip: + Name: Policy: Development + Buildable: + BuildPaletteOrder: 1 + Prerequisites: ~player.allies, influence.level1, !economy.policy, !defense.policy, !development.policy, ~techlevel.medium + Description: Pursue development policy.\n\n• Level 1: +20% unit experience gain\n• Level 2: +40% unit experience gain, 10% discount on Tech Center & all upgrades\n• Level 3: +60% unit experience gain, rank 3 units gain additional health & damage + TooltipExtras: + Attributes: (!) Only ONE Policy may be chosen. + Valued: + Cost: 300 + RenderSprites: + Image: development.policy + WithProductionIconOverlay: + Prerequisites: development.policy + +greece.coalition: + Inherits: ^AlliedUpgrade + Tooltip: + Name: Coalition: Greece + Buildable: + BuildPaletteOrder: 1 + Prerequisites: ~player.allies, alhq, !greece.coalition, !korea.coalition, !sweden.coalition, ~techlevel.medium + Description: Form a coalition with Greece, required for:\n• Hoplite\n• Zeus Artillery\n• Helios Bomb + TooltipExtras: + Attributes: (!) Only ONE Coalition may be chosen. + Valued: + Cost: 300 + RenderSprites: + Image: greece.coalition + AnnounceOnCreation: + SpeechNotification: CoalitionActive + Delay: 40 + WithProductionIconOverlay: + Prerequisites: greece.coalition + +korea.coalition: + Inherits: ^AlliedUpgrade + Tooltip: + Name: Coalition: South Korea + Buildable: + BuildPaletteOrder: 2 + Prerequisites: ~player.allies, alhq, !greece.coalition, !korea.coalition, !sweden.coalition, ~techlevel.medium + Description: Form a coalition with South Korea, required for:\n• Tiger Guard\n• Black Eagle\n• Black Sky Strike + TooltipExtras: + Attributes: (!) Only ONE Coalition may be chosen. + Valued: + Cost: 300 + RenderSprites: + Image: korea.coalition + AnnounceOnCreation: + SpeechNotification: CoalitionActive + Delay: 40 + WithProductionIconOverlay: + Prerequisites: korea.coalition + +sweden.coalition: + Inherits: ^AlliedUpgrade + Tooltip: + Name: Coalition: Sweden + Buildable: + BuildPaletteOrder: 3 + Prerequisites: ~player.allies, alhq, !greece.coalition, !korea.coalition, !sweden.coalition, ~techlevel.medium + Description: Form a coalition with Sweden, required for:\n• Cryo Trooper\n• Cryo Launcher\n• Cryostorm + TooltipExtras: + Attributes: (!) Only ONE Coalition may be chosen. + Valued: + Cost: 300 + RenderSprites: + Image: sweden.coalition + AnnounceOnCreation: + SpeechNotification: CoalitionActive + Delay: 40 + WithProductionIconOverlay: + Prerequisites: sweden.coalition + +delp.upgrade: + Inherits: ^AlliedUpgrade + Inherits@DevelopmentPolicyDiscount: ^DevelopmentPolicyDiscount + Tooltip: + Name: Research: Delphis APC + Buildable: + BuildPaletteOrder: 20 + Prerequisites: ~player.allies, anyradar, ~techlevel.medium + Description: Allows construction of the Delphis APC.\n\nReplaces: APC + TooltipExtras: + Strengths: + Turreted sonic weapon that weakens structures + Weaknesses: – Increased cost\n– Decreased unit speed + Valued: + Cost: 750 + RenderSprites: + Image: delp.upgrade + WithProductionIconOverlay: + Prerequisites: delp.upgrade + +optics.upgrade: + Inherits: ^AlliedUpgrade + Inherits@DevelopmentPolicyDiscount: ^DevelopmentPolicyDiscount + Tooltip: + Name: Upgrade: Advanced Optics + Buildable: + BuildPaletteOrder: 20 + Prerequisites: ~player.allies, anyradar, ~techlevel.medium + Description: Equips rangers with advanced optics which temporarily extends their vision and detection range.\n\nUpgrades: Ranger + TooltipExtras: + Strengths: + Rangers can temporarily increase their vision & detection range + Valued: + Cost: 1000 + RenderSprites: + Image: optics.upgrade + WithProductionIconOverlay: + Prerequisites: optics.upgrade + +entrench.upgrade: + Inherits: ^AlliedUpgrade + Inherits@DevelopmentPolicyDiscount: ^DevelopmentPolicyDiscount + Tooltip: + Name: Upgrade: Entrenchment + Buildable: + BuildPaletteOrder: 20 + Prerequisites: ~player.france, anyradar, ~techlevel.medium + Description: Enables Engineers to facilitate the building of defenses.\n\nUpgrades: Engineer + TooltipExtras: + Strengths: + Allows Engineers to deploy, enabling defensive structures to be built + Valued: + Cost: 1000 + RenderSprites: + Image: entrench.upgrade + WithProductionIconOverlay: + Prerequisites: entrench.upgrade + +cryw.upgrade: + Inherits: ^AlliedUpgrade + Inherits@DevelopmentPolicyDiscount: ^DevelopmentPolicyDiscount + Tooltip: + Name: Upgrade: Cryo Warheads + Buildable: + BuildPaletteOrder: 30 + Prerequisites: ~player.allies, atek, ~techlevel.high + Description: Arms certain rocket equipped units with Cryo warheads which cause targets to move more slowly and take increased damage.\n\nUpgrades: Rocket Soldier\nUpgrades: Longbow\nUpgrades: Guardian GI (USA only)\nUpgrades: Nighthawk (USA only) + TooltipExtras: + Strengths: + Equip with Cryo Warheads which slow movement and increase damage taken + Valued: + Cost: 1000 + RenderSprites: + Image: cryw.upgrade + WithProductionIconOverlay: + Prerequisites: cryw.upgrade + +pcan.upgrade: + Inherits: ^AlliedUpgrade + Inherits@DevelopmentPolicyDiscount: ^DevelopmentPolicyDiscount + Tooltip: + Name: Research: Prism Cannon + Buildable: + BuildPaletteOrder: 30 + Prerequisites: ~player.allies, atek, ~techlevel.high + Description: Allows construction of Prism Cannons.\n\nReplaces: Prism Tank + TooltipExtras: + Strengths: + Increased range\n+ Increased burst damage + Weaknesses: – Reduced rate of fire\n– Reduced mobility + Valued: + Cost: 750 + RenderSprites: + Image: pcan.upgrade + WithProductionIconOverlay: + Prerequisites: pcan.upgrade + +apb.upgrade: + Inherits: ^AlliedUpgrade + Inherits@DevelopmentPolicyDiscount: ^DevelopmentPolicyDiscount + Tooltip: + Name: Upgrade: Raufoss Ammo + Buildable: + BuildPaletteOrder: 30 + Prerequisites: ~player.england, atek, ~techlevel.high + Description: Upgrades Snipers granting them Raufoss armor piercing rounds, which stun and damage vehicles.\n\nUpgrades: Sniper + TooltipExtras: + Strengths: + Can damage vehicles with AP rounds which slow movement and rate of fire + Weaknesses: – Reduced range + Valued: + Cost: 1000 + RenderSprites: + Image: apb.upgrade + WithProductionIconOverlay: + Prerequisites: apb.upgrade + +airborne.upgrade: + Inherits: ^AlliedUpgrade + Inherits@DevelopmentPolicyDiscount: ^DevelopmentPolicyDiscount + Tooltip: + Name: Upgrade: Advanced Airborne Training + Buildable: + BuildPaletteOrder: 30 + Prerequisites: ~player.usa, atek, ~techlevel.high + Description: Improved training and logistics for airborne troops, resulting in greater effectiveness and faster preparation.\n\nUpgrades: Airdrop: Guardian GIs\nUpgrades: Airdrop: Grizzly Tanks + TooltipExtras: + Strengths: + Airborne units have veterancy\n+ Airborne units take 25% less time to prepare + Valued: + Cost: 1000 + RenderSprites: + Image: airborne.upgrade + WithProductionIconOverlay: + Prerequisites: airborne.upgrade + +tflx.upgrade: + Inherits: ^AlliedUpgrade + Inherits@DevelopmentPolicyDiscount: ^DevelopmentPolicyDiscount + Tooltip: + Name: Upgrade: Temporal Flux + Buildable: + BuildPaletteOrder: 40 + Prerequisites: ~player.germany, pdox, ~techlevel.high + Description: Upgrades Chrono Prisons granting them the ability to teleport through time. Improves Chrono Tank chronoshifting.\n\nUpgrades: Chrono Prison\nUpgrades: Chrono Tank + TooltipExtras: + Strengths: + Chrono Prison gains teleport ability\n+ Chrono Prison weapon range increased\n+ Chrono Tank can teleport twice before recharging + Valued: + Cost: 750 + RenderSprites: + Image: tflx.upgrade + WithProductionIconOverlay: + Prerequisites: tflx.upgrade + +charv.upgrade: + Inherits: ^AlliedUpgrade + Inherits@DevelopmentPolicyDiscount: ^DevelopmentPolicyDiscount + Tooltip: + Name: Upgrade: Chrono Miner + Buildable: + BuildPaletteOrder: 40 + Prerequisites: ~player.allies, alhq, ~techlevel.high, !charv.upgrade + Description: Allows construction of Chrono Miners which\nteleport back to refineries.\n\nUpgrades: Ore Truck + TooltipExtras: + Strengths: + Teleport back to refinery + Valued: + Cost: 1250 + RenderSprites: + Image: charv.upgrade + WithProductionIconOverlay: + Prerequisites: charv.upgrade + +################################SCRIN############################## ################################################################### -advart.upgrade: +ANYALLEGIANCE: + AlwaysVisible: + Interactable: + Tooltip: + Name: Declared Allegiance + Buildable: + Description: Declared Allegiance + ProvidesPrerequisite: + +^ScrinUpgrade: Inherits: ^Upgrade + Encyclopedia: + Category: Scrin/Upgrades + +loyalist.allegiance: + Inherits: ^ScrinUpgrade + Tooltip: + Name: Allegiance: Loyalist + Buildable: + BuildPaletteOrder: 16 + Prerequisites: ~player.scrin, scrin.allegiances.available, !rebel.allegiance, !malefic.allegiance, ~techlevel.medium + Description: Declare your allegiance and side with the Scrin Overlord.\n\nRequired for:\n• Eviscerator\n• Ruiner\n• Overlord's Wrath\n• Ichor Spike\n\n + IconPalette: chromes + TooltipExtras: + Attributes: (!) Only ONE allegiance may be chosen. + Valued: + Cost: 300 + RenderSprites: + Image: loyalist.allegiance + WithProductionIconOverlay: + Prerequisites: loyalist.allegiance + FreeActorCA@IchorSpike: + Actor: ichorspike.provider + +rebel.allegiance: + Inherits: ^ScrinUpgrade + Tooltip: + Name: Allegiance: Rebel + Buildable: + BuildPaletteOrder: 17 + Prerequisites: ~player.scrin, scrin.allegiances.available, !loyalist.allegiance, !malefic.allegiance, ~techlevel.medium + Description: Declare your allegiance and side with the Scrin Rebels.\n\nRequired for:\n• Impaler\n• Nullifier\n• Gateway\n• Colony Spike\n\n + IconPalette: chromes + TooltipExtras: + Attributes: (!) Only ONE allegiance may be chosen. + Valued: + Cost: 300 + RenderSprites: + Image: rebel.allegiance + WithProductionIconOverlay: + Prerequisites: rebel.allegiance + FreeActorCA@ColonySpike: + Actor: colonyspike.provider + +malefic.allegiance: + Inherits: ^ScrinUpgrade + Tooltip: + Name: Allegiance: Malefic + Buildable: + BuildPaletteOrder: 18 + Prerequisites: ~player.scrin, scrin.allegiances.available, !loyalist.allegiance, !rebel.allegiance, ~techlevel.medium + Description: Declare your allegiance and side with the Malefic Scrin.\n\nRequired for:\n• Stalker\n• Darkener\n• Anathema\n• Voidspike\n\n + IconPalette: chromes + TooltipExtras: + Attributes: (!) Only ONE allegiance may be chosen. + Valued: + Cost: 300 + RenderSprites: + Image: malefic.allegiance + WithProductionIconOverlay: + Prerequisites: malefic.allegiance + FreeActorCA@VoidSpike: + Actor: voidspike.provider + +hyper.upgrade: + Inherits: ^ScrinUpgrade + Tooltip: + Name: Upgrade: Hypercharge + Buildable: + BuildPaletteOrder: 20 + Prerequisites: ~player.scrin, anyradar, ~techlevel.medium + Description: Seekers and Lacerators gain Hypercharge ability, allow them to fire an uninterrupted barrage for a limited time. Increased damage taken while active. After use, weapon damage and speed is reduced for a short time.\n\nUpgrades: Seeker\nUpgrades: Lacerator + IconPalette: chromes + TooltipExtras: + Strengths: + Hypercharge ability + Valued: + Cost: 1250 + RenderSprites: + Image: hyper.upgrade + WithProductionIconOverlay: + Prerequisites: hyper.upgrade + +allegiance.upgrade: + Inherits: ^ScrinUpgrade + Tooltip: + Name: Allegiance Dependent Upgrade + Buildable: + BuildPaletteOrder: 20 + Prerequisites: ~player.scrin, anyradar, anyallegiance, ~!loyalist.allegiance, ~!rebel.allegiance, ~!malefic.allegiance, ~techlevel.medium + IconPalette: chromes + Description: Upgrade depends on chosen allegiance.\n\n• Loyalist: Eviscerator research\n• Rebel: Impaler research\n• Malefic: Stalker research + Valued: + Cost: 750 + RenderSprites: + Image: allegiance.upgrade + WithProductionIconOverlay: + Prerequisites: allegiance.upgrade + -Encyclopedia: + +evis.upgrade: + Inherits: ^ScrinUpgrade + Tooltip: + Name: Research: Eviscerator + Buildable: + BuildPaletteOrder: 20 + Prerequisites: ~player.scrin, anyradar, ~loyalist.allegiance, ~techlevel.medium + Description: Replaces: Ravager + IconPalette: chromes + TooltipExtras: + Strengths: + Increased damage\n+ Increased health\n+ Increased rate of fire\n+ Benefits from Resource Conversion upgrade + Weaknesses: – Increased cost\n– Reduced range + Valued: + Cost: 750 + RenderSprites: + Image: evis.upgrade + WithProductionIconOverlay: + Prerequisites: evis.upgrade + +impl.upgrade: + Inherits: ^ScrinUpgrade + Tooltip: + Name: Research: Impaler + Buildable: + BuildPaletteOrder: 20 + Prerequisites: ~player.scrin, anyradar, ~rebel.allegiance, ~techlevel.medium + Description: Replaces: Ravager + IconPalette: chromes + TooltipExtras: + Strengths: + Increased range\n+ Increased damage\n+ Increased health\n+ Slows targets + Weaknesses: – Increased cost\n– Reduced speed\n– Reduced rate of fire + Valued: + Cost: 750 + RenderSprites: + Image: impl.upgrade + WithProductionIconOverlay: + Prerequisites: impl.upgrade + +stlk.upgrade: + Inherits: ^ScrinUpgrade + Tooltip: + Name: Research: Stalker + Buildable: + BuildPaletteOrder: 20 + Prerequisites: ~player.scrin, anyradar, ~malefic.allegiance, ~techlevel.medium + Description: Replaces: Ravager + IconPalette: chromes + TooltipExtras: + Strengths: + Increased damage\n+ Increased health\n+ Cloaking ability with speed boost + Weaknesses: – Increased cost\n– Reduced splash damage + Valued: + Cost: 750 + RenderSprites: + Image: stlk.upgrade + WithProductionIconOverlay: + Prerequisites: stlk.upgrade + +shrw.upgrade: + Inherits: ^ScrinUpgrade + Tooltip: + Name: Research: Shard Walker + Buildable: + BuildPaletteOrder: 20 + Prerequisites: ~player.reaper, anyradar, ~techlevel.medium + Description: Allows production of Shard Walkers, a heavier and more powerful variant of the Gun Walker.\n\nReplaces: Gun Walker + IconPalette: chromes + TooltipExtras: + Strengths: + Increased durability\n+ Increased damage + Weaknesses: – Slower movement\n– Slower projectiles + Valued: + Cost: 750 + RenderSprites: + Image: shrw.upgrade + WithProductionIconOverlay: + Prerequisites: shrw.upgrade + +advart.upgrade: + Inherits: ^ScrinUpgrade Tooltip: Name: Upgrade: Advanced Articulators Buildable: BuildPaletteOrder: 20 - Prerequisites: ~scrt.traveler, ~techlevel.high - BuildDuration: 1500 - Description: Scrin infantry moves 15% faster.\n\n Upgrades: Scrin Infantry - IconPalette: scrin + Prerequisites: ~player.traveler, anyradar, ~techlevel.medium + Description: Enable Scrin infantry to move faster.\n\nUpgrades: Scrin Infantry + IconPalette: chromes + TooltipExtras: + Strengths: + 15% faster movement Valued: - Cost: 1000 + Cost: 1250 RenderSprites: Image: advart.upgrade + WithProductionIconOverlay: + Prerequisites: advart.upgrade + +carapace.upgrade: + Inherits: ^ScrinUpgrade + Tooltip: + Name: Upgrade: Hardened Carapace + Buildable: + BuildPaletteOrder: 30 + Prerequisites: ~player.scrin, scrt, infantry.any, ~techlevel.high + Description: Infantry gain a hardened carapace which provides protection against explosives.\n\nUpgrades: Infantry + IconPalette: chromes + TooltipExtras: + Strengths: + 40% reduced damage from explosives\n+ 20% reduced damage from incendiary explosives + Valued: + Cost: 1500 + RenderSprites: + Image: carapace.upgrade + WithProductionIconOverlay: + Prerequisites: carapace.upgrade + +blink.upgrade: + Inherits: ^ScrinUpgrade + Tooltip: + Name: Upgrade: Blink Packs + Buildable: + BuildPaletteOrder: 30 + Prerequisites: ~player.scrin, scrt, ~techlevel.high + Description: Equips Intruders and Watchers with blink packs allowing them to teleport.\n\nUpgrades: Intruder\nUpgrades: Marauder\nUpgrades: Watcher + IconPalette: chromes + TooltipExtras: + Strengths: + Teleport ability + Valued: + Cost: 750 + RenderSprites: + Image: blink.upgrade + WithProductionIconOverlay: + Prerequisites: blink.upgrade resconv.upgrade: - Inherits: ^Upgrade + Inherits: ^ScrinUpgrade Tooltip: Name: Upgrade: Resource Conversion Buildable: - BuildPaletteOrder: 20 - Prerequisites: ~scrt, ~techlevel.high - BuildDuration: 1500 - Description: Weapons of Devourer and Ruiner are empowered by Tiberium\nand other resources.\n\n Upgrades: Devourer\n Upgrades: Ruiner\n + Increased damage when charged - IconPalette: scrin + BuildPaletteOrder: 30 + Prerequisites: ~player.scrin, scrt, ~techlevel.high + Description: Weapons of certain units are empowered by Tiberium and other resources. Reaper Tripod gains additional charges.\n\nUpgrades: Devourer\nUpgrades: Ruiner\nUpgrades: Reaper Tripod\nUpgrades: Eviscerator + IconPalette: chromes + TooltipExtras: + Strengths: + Increased damage when charged\n+ Doubled charge capacity (Reaper Tripod only) Valued: Cost: 1000 RenderSprites: Image: resconv.upgrade + WithProductionIconOverlay: + Prerequisites: resconv.upgrade ioncon.upgrade: - Inherits: ^Upgrade + Inherits: ^ScrinUpgrade Tooltip: Name: Upgrade: Ion Conduits Buildable: - BuildPaletteOrder: 25 - Prerequisites: ~scrt, ~techlevel.high - BuildDuration: 2250 - Description: Allows Storm Colums to store ion energy and release it into the atmosphere,\ncreating a localised Ion Storm.\n\n Upgrades: Storm Column\n + Increases damage and range over time when active.\n + Reduces incoming damage over time when active.\n + Ion storm can damage enemy units and structures. - IconPalette: scrin + BuildPaletteOrder: 30 + Prerequisites: ~player.scrin, scrt, ~techlevel.high + Description: Allows Storm Columns and Stormcrawlers to store ion energy and release it into the atmosphere, creating a localized Ion Storm.\n\nUpgrades: Storm Column\nUpgrades: Stormcrawler + IconPalette: chromes + TooltipExtras: + Strengths: + Increases damage and range over time when active\n+ Reduces incoming damage over time when active\n+ Ion storm can damage enemy units and structures Valued: - Cost: 1500 + Cost: 1250 RenderSprites: Image: ioncon.upgrade + WithProductionIconOverlay: + Prerequisites: ioncon.upgrade regen.upgrade: - Inherits: ^Upgrade + Inherits: ^ScrinUpgrade Tooltip: Name: Upgrade: Regenerative Hull Buildable: BuildPaletteOrder: 30 - Prerequisites: ~scrt, ~techlevel.high - BuildDuration: 2250 - Description: Scrin aircraft will regenerate health over time when not in combat.\n\n Upgrades: Stormrider\n Upgrades: Enervator\n Upgrades: Devastator\n Upgrades: Planetary Assault Carrier - IconPalette: scrin + Prerequisites: ~player.scrin, scrt, ~techlevel.high + Description: Scrin aircraft and Stormcrawlers will regenerate health over time when not in combat.\n\nUpgrades: Stormrider\nUpgrades: Tormentor\nUpgrades: Enervator\nUpgrades: Devastator Warship\nUpgrades: Planetary Assault Carrier\nUpgrades: Mothership\nUpgrades: Stormcrawler + IconPalette: chromes + TooltipExtras: + Strengths: + Out-of-combat health regeneration Valued: Cost: 1500 RenderSprites: Image: regen.upgrade + WithProductionIconOverlay: + Prerequisites: regen.upgrade + +stellar.upgrade: + Inherits: ^ScrinUpgrade + Tooltip: + Name: Upgrade: Stellar Fusion Cannon + Buildable: + BuildPaletteOrder: 30 + Prerequisites: ~player.harbinger, scrt, ~techlevel.high + Description: Devastator Warships upgraded with stellar fusion cannon.\n\nUpgrades: Devastator Warship + IconPalette: chromes + TooltipExtras: + Strengths: + Increased damage\n+ Increased area of effect\n+ Improved accuracy\n+ Faster projectile + Weaknesses: – Must charge before firing + Valued: + Cost: 1000 + RenderSprites: + Image: stellar.upgrade + WithProductionIconOverlay: + Prerequisites: stellar.upgrade + +coalescence.upgrade: + Inherits: ^ScrinUpgrade + Tooltip: + Name: Upgrade: Coalescence + Buildable: + BuildPaletteOrder: 30 + Prerequisites: ~player.collector, scrt, ~techlevel.high + Description: On death or when deployed, Leechers will transform into a ball of bio-matter which heals nearby allies and eventually coalesces into a new Leecher.\n\nUpgrades: Leecher + IconPalette: chromes + TooltipExtras: + Strengths: + Leecher able to resurrect\n+ Heals allies while in coalescence form + Weaknesses: – No longer regenerates while dealing damage + Valued: + Cost: 1000 + RenderSprites: + Image: coalescence.upgrade + WithProductionIconOverlay: + Prerequisites: coalescence.upgrade shields.upgrade: - Inherits: ^Upgrade + Inherits: ^ScrinUpgrade Tooltip: - Name: Upgrade: Fleet Shields + Name: Upgrade: Shield Generation Buildable: BuildPaletteOrder: 40 - Prerequisites: ~sign, ~techlevel.high - BuildDuration: 2250 - Description: Larger Scrin vessels take reduced damage and become resistant to EMP.\n\n Upgrades: Devastator\n Upgrades: Planetary Assault Carrier - IconPalette: scrin + Prerequisites: ~player.scrin, sign, ~techlevel.high + Description: Equip Scrin airborne units and certain ground units with shields.\n\nUpgrades: Interloper\nUpgrades: Stormcrawler\nUpgrades: Stormrider\nUpgrades: Tormentor\nUpgrades: Enervator\nUpgrades: Devastator Warship\nUpgrades: Planetary Assault Carrier\nUpgrades: Mothership + IconPalette: chromes + TooltipExtras: + Strengths: + Grants an additonal health pool\n+ Resistance to EMP for aircraft Valued: Cost: 1500 RenderSprites: Image: shields.upgrade + WithProductionIconOverlay: + Prerequisites: shields.upgrade diff --git a/mods/ca/rules/vehicles.yaml b/mods/ca/rules/vehicles.yaml index 5b71d71bd5..cbb11f6d6b 100644 --- a/mods/ca/rules/vehicles.yaml +++ b/mods/ca/rules/vehicles.yaml @@ -2,12 +2,14 @@ V2RL: Inherits: ^Vehicle Inherits@GAINSEXPERIENCE: ^GainsExperience Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove - Inherits@BERSERK: ^Berserk Buildable: - Queue: Vehicle - BuildPaletteOrder: 170 - Prerequisites: anyradar, ~vehicles.v2, ~v2.upgrade, ~techlevel.medium - Description: Long-range rocket artillery.\n Strong vs Buildings, Defenses, Infantry\n Weak vs Vehicles, Aircraft + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 180 + Prerequisites: anyradar, ~vehicles.v2, ~techlevel.medium + Description: Long-range rocket artillery with low rate of fire. + TooltipExtras: + Strengths: • Strong vs Buildings, Defenses, Infantry, Light Armor + Weaknesses: • Cannot attack Aircraft\n• Has difficulty hitting moving targets Valued: Cost: 900 Tooltip: @@ -19,7 +21,7 @@ V2RL: Armor: Type: Light Mobile: - Speed: 56 + Speed: 60 RevealsShroud: MinRange: 4c0 Range: 5c0 @@ -29,12 +31,11 @@ V2RL: Armament: Weapon: SCUD ReloadingCondition: reloading - AutoTarget: - ScanRadius: 10 AttackFrontal: TargetFrozenActors: True ForceFireIgnoresActors: True - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded + FacingTolerance: 0 WithFacingSpriteBody: RequiresCondition: !reloading Name: loaded @@ -42,64 +43,359 @@ V2RL: RequiresCondition: reloading Sequence: empty-idle Name: reloading - Explodes: - Weapon: BarrelExplode + FireWarheadsOnDeath: + Weapon: UnitExplodeFlame ProducibleWithLevel: Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded Selectable: - DecorationBounds: 28,28 + DecorationBounds: 1194, 1194 + Encyclopedia: + Category: Soviets/Vehicles KATY: Inherits: ^Vehicle Inherits@GAINSEXPERIENCE: ^GainsExperience Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove - Inherits@BERSERK: ^Berserk + Inherits@UpgradeOverlay: ^UpgradeOverlay Buildable: - Queue: Vehicle - BuildPaletteOrder: 171 + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 130 IconPalette: chrometd - Prerequisites: anyradar, ~vehicles.soviet, ~!v2.upgrade, ~techlevel.medium - Description: Long-range rocket artillery.\n Strong vs Buildings, Defenses, Infantry\n Weak vs Vehicles, Aircraft + Prerequisites: ~vehicles.soviet, ~!arty.doctrine, ~techlevel.low + Description: Long-range rocket barrage artillery. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor, Buildings, Defenses + Weaknesses: • Cannot attack Aircraft\n• Has difficulty hitting moving targets Valued: - Cost: 800 + Cost: 750 Tooltip: Name: Katyusha UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 15000 + HP: 13000 Armor: Type: Light Mobile: - Speed: 56 - TurnSpeed: 16 + Speed: 54 + TurnSpeed: 12 + Voice: Move + Passenger: + Voice: Move + AttackMove: + Voice: Attack + Voiced: + VoiceSet: GradVoice RevealsShroud: Range: 5c0 - Armament: + Armament@PRIMARY: Weapon: KatyushaRockets - LocalOffset: 268,0,440 + LocalOffset: 268,-100,440 + Armament@SECONDARY: + Weapon: KatyushaRocketsWide + LocalOffset: 268,100,440 + FireDelay: 6 AttackFrontal: TargetFrozenActors: True ForceFireIgnoresActors: True - PauseOnCondition: empdisable || being-warped - Explodes: - Weapon: BarrelExplode + PauseOnCondition: empdisable || being-warped || blinded + FacingTolerance: 0 + Voice: Attack + FireWarheadsOnDeath: + Weapon: UnitExplodeFlame ProducibleWithLevel: Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded + Selectable: + DecorationBounds: 1194, 1194 + ReplacedInQueue: + Actors: grad + Upgradeable@Grad: + Type: arty.doctrine + UpgradingCondition: upgrading + Actor: grad + UpgradeAtActors: fix, rep, srep + BuildDuration: 100 + RequiresCondition: !mindcontrolled + Encyclopedia: + Category: Soviets/Vehicles + +GRAD: + Inherits: KATY + Buildable: + BuildPaletteOrder: 131 + Prerequisites: ~vehicles.soviet, ~arty.doctrine, ~techlevel.medium + IconPalette: chrome + Tooltip: + Name: Grad + Health: + HP: 14000 + -Upgradeable@Grad: + -WithDecoration@UpgradeOverlay: + -AttackFrontal: + AttackTurreted: + TargetFrozenActors: True + Voice: Attack + ForceFireIgnoresActors: True + PauseOnCondition: empdisable || being-warped || blinded + Turreted: + TurnSpeed: 10 + RealignDelay: 3 + Offset: -200, 0, 0 + WithSpriteTurret: + Sequence: turret + RequiresCondition: !rocketpods-upgrade + WithSpriteTurret@UPG: + Sequence: turret-upg + RequiresCondition: rocketpods-upgrade + Armament@PRIMARY: + Weapon: GradRockets + RequiresCondition: !rocketpods-upgrade + Armament@SECONDARY: + Weapon: GradRocketsWide + RequiresCondition: !rocketpods-upgrade + Armament@PRIMARYUPG: + Weapon: GradRockets.UPG + LocalOffset: 268,-100,440 + RequiresCondition: rocketpods-upgrade + Armament@SECONDARYUPG: + Weapon: GradRocketsWide.UPG + LocalOffset: 268,100,440 + FireDelay: 6 + RequiresCondition: rocketpods-upgrade + GrantConditionOnPrerequisite@RocketPods: + Prerequisites: rocketpods.upgrade + Condition: rocketpods-upgrade + EncyclopediaExtras: + AdditionalInfo: Requires Artillery Doctrine. + +NUKC: + Inherits: ^Tank + Inherits@GAINSEXPERIENCE: ^GainsExperience + Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove + Inherits@ATOMICAMMO: ^AtomicAmmunition + Inherits@HeavyArmor: ^HeavyArmor + Buildable: + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 243 + Prerequisites: stek, ~vehicles.soviet, ~arty.doctrine, ~nukc.upgrade, ~techlevel.high + Description: Nuclear long-range artillery. + TooltipExtras: + Strengths: • Strong vs Buildings, Defenses, Infantry, Light Armor + Weaknesses: • Cannot attack Aircraft\n• Has difficulty hitting moving targets + Attributes: • Can crush concrete walls + Valued: + Cost: 2400 + Tooltip: + Name: Nuke Cannon + UpdatesPlayerStatistics: + AddToArmyValue: true Selectable: - DecorationBounds: 28,28 + DecorationBounds: 1877, 1621, 0, -170 + Health: + HP: 60000 + Mobile: + TurnSpeed: 6 + Speed: 46 + Locomotor: heavytracked + Voice: Move + ImmovableCondition: deployed + RequireForceMoveCondition: !undeployed + PauseOnCondition: being-captured || empdisable || being-warped || driver-dead || notmobile || deploying || undeploying || deployed + RevealsShroud: + MinRange: 4c0 + Range: 5c0 + RevealGeneratedShroud: False + RevealsShroud@GAPGEN: + Range: 4c0 + Armament: + Weapon: 280mmAtomic + LocalOffset: 824,0,758 + MuzzleSequence: muzzle + PauseOnCondition: has-atomic-ammo || atomic-reloading || !deployed || deploying + RequiresCondition: deployed || undeployed + ReloadingCondition: reloading + Armament@ATOMICAMMO: + Weapon: 280mmNeutron + LocalOffset: 824,0,758 + MuzzleSequence: muzzle + PauseOnCondition: !has-atomic-ammo || reloading || !deployed || deploying + RequiresCondition: deployed || undeployed + ReloadingCondition: atomic-reloading + Armament@Deployer: + Name: deployer + Turret: deployer + Weapon: NukeCannonDeployer + LocalOffset: 824,0,758 + RequiresCondition: undeployed && !undeploying + AttackTurreted: + Armaments: primary, deployer + Turrets: primary, deployer + Voice: Attack + RangeMargin: 0 + PauseOnCondition: empdisable || being-warped || blinded || deploying + TargetFrozenActors: True + ForceFireIgnoresActors: True + PersistentTargeting: false + RequiresCondition: !undeploying + GrantConditionOnDeployTurreted: + DeployedCondition: deployed + UndeployedCondition: undeployed + UndeployOnMove: True + Voice: Deploy + DeploySounds: vnukde1a.aud + UndeploySounds: vnukde2a.aud + PauseOnCondition: being-warped + SmartDeploy: True + ValidFacings: 0, 256, 512, 768 + GrantTimedCondition@Deploying: + Condition: deploying + Duration: 25 + RequiresCondition: deployed + GrantTimedCondition@Undeploying: + Condition: undeploying + Duration: 25 + RequiresCondition: undeployed + WithEnabledAnimation@Deploying: + RequiresCondition: deployed + Sequence: make + Body: deployed + WithEnabledAnimation@Undeploying: + RequiresCondition: undeployed + Sequence: undeploy + Body: body + WithFacingSpriteBody: + RequiresCondition: undeployed || deploying + WithFacingSpriteBody@DeployedChassis: + Name: deployed + Sequence: deployed + RequiresCondition: !undeployed && !deploying + WithFacingSpriteBody@Overlay: + Name: overlay + Sequence: overlay + WaitsForTurretAlignmentOnUndeploy: + AligningCondition: undeploying + WithSpriteTurret: + Sequence: turret + Turreted: + TurnSpeed: 6 + InitialFacing: 0 + RealignDelay: 3 + PauseOnCondition: !deployed + Turreted@Deployer: + Turret: deployer + WithMuzzleOverlay: + WithRestartableIdleOverlay@ATOMICAMMO: + RequiresCondition: atomic-ammo && !has-atomic-ammo + WithAmmoPipsDecoration@ATOMICAMMO: + PipCount: 1 + AmmoPool@ATOMICAMMO: + Ammo: 1 + ReloadAmmoPool@ATOMICAMMO: + Count: 1 + RequiresCondition: atomic-ammo && !has-atomic-ammo + ReloadAmmoPoolCA@ATOMICAMMODECAY: + Count: -1 + FireWarheadsOnDeath: + Weapon: UnitExplodeIraqTank + LoadedChance: 100 + ProducibleWithLevel: + Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded + Passenger: + Voice: Move + Voiced: + VoiceSet: NukcVoice + SpawnActorOnDeath: + Actor: NUKC.Husk + RequiresCondition: !being-warped + GrantConditionOnBotOwner@BotOwner: + Condition: botowner + Bots: brutal, vhard, hard, normal, easy, naval + DeployOnAttack: + RequiresCondition: undeployed && !moving && !deploying && !undeploying + ArmamentNames: deployer + AutoTarget: + RequiresCondition: (botowner || deployed || attack-move || assault-move) && !undeploying && !deploying + AttackMove: + AttackMoveCondition: attack-move + WithRangeCircle: + Type: NukeCannon + Range: 18c0 + Color: ffdd0050 + RequiresCondition: (!deployed || deploying) && !veiled && !gapveiled + WithRangeCircle@Veiled: + Type: NukeCannon + Range: 14c410 + Color: ffdd0050 + RequiresCondition: (!deployed || deploying) && veiled && !gapveiled + WithRangeCircle@GapVeiled: + Type: NukeCannon + Range: 10c819 + Color: ffdd0050 + RequiresCondition: (!deployed || deploying) && gapveiled + WithRangeCircle@Deployed: + Type: NukeCannon + Range: 18c0 + Color: ff880090 + RequiresCondition: deployed && !deploying && !veiled && !gapveiled + WithRangeCircle@DeployedVeiled: + Type: NukeCannon + Range: 14c410 + Color: ff880090 + RequiresCondition: deployed && !deploying && veiled && !gapveiled + WithRangeCircle@DeployedGapVeiled: + Type: NukeCannon + Range: 10c819 + Color: ff880090 + RequiresCondition: deployed && !deploying && gapveiled + GrantConditionOnMovement@Moving: + Condition: moving + ValidMovementTypes: Horizontal, Vertical + RejectsOrders: + Reject: AttackMove + RequiresCondition: !undeployed + WithReloadBar: + ValidRelationships: Ally, Enemy, Neutral + Color: ff9000 + Encyclopedia: + Category: Soviets/Vehicles + EncyclopediaExtras: + RenderPreviewActor: nukc.preview + AdditionalInfo: Requires Artillery Doctrine. + +NUKC.Preview: + Inherits: ^PreviewDummy + RenderSprites: + Image: nukc + WithFacingSpriteBody: + WithSpriteTurret: + Sequence: turret + Turreted: 1TNK: Inherits: ^Tank Inherits@GAINSEXPERIENCE: ^GainsExperience Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove - Inherits@BERSERK: ^Berserk Inherits@SLOWCRUSH: ^SlowedByCrushing + Inherits@HeavyArmor: ^HeavyArmor + Inherits@TANKBUSTERVULN: ^TankBusterVulnerability Buildable: - Queue: Vehicle - BuildPaletteOrder: 50 - Prerequisites: ~vehicles.allies, ~techlevel.low - Description: Fast tank, good for scouting.\n Strong vs Vehicles\n Weak vs Infantry, Defenses, Aircraft\n Special Ability: Amphibious + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 120 + Prerequisites: ~vehicles.1tnk, ~techlevel.low + Description: Fast tank, good for scouting and skirmishes. + TooltipExtras: + Strengths: • Strong vs Light Armor + Weaknesses: • Weak vs Infantry, Defenses\n• Cannot attack Aircraft + Attributes: • Amphibious Valued: Cost: 650 Tooltip: @@ -109,18 +405,14 @@ KATY: AddToArmyValue: true Health: HP: 27000 - Armor: - Type: Heavy Mobile: Locomotor: Amphibious - Speed: 95 - GrantConditionOnTerrain: + Speed: 113 + GrantConditionOnTerrain@ONWATER: TerrainTypes: Water Condition: onwater - Targetable: - RequiresCondition: !onwater && !parachute && !being-warped Targetable@WATER: - TargetTypes: Ground, Vehicle, Water, Ship + TargetTypes: Water, Ship RequiresCondition: onwater && (!parachute && !being-warped) WithFacingSpriteBody: RequiresCondition: !onwater @@ -129,11 +421,11 @@ KATY: Name: body-water RequiresCondition: onwater RevealsShroud: - MinRange: 4c0 - Range: 5c0 + MinRange: 5c0 + Range: 7c0 RevealGeneratedShroud: False RevealsShroud@GAPGEN: - Range: 4c0 + Range: 5c0 Turreted: TurnSpeed: 28 Armament: @@ -143,7 +435,7 @@ KATY: LocalOffset: 768,0,90 MuzzleSequence: muzzle AttackTurreted: - PauseOnCondition: empdisable || being-warped || parachute + PauseOnCondition: empdisable || being-warped || blinded || parachute WithMuzzleOverlay: WithSpriteTurret: SpawnActorOnDeath: @@ -151,18 +443,27 @@ KATY: RequiresCondition: !onwater && !being-warped ProducibleWithLevel: Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded + Encyclopedia: + Category: Allies/Vehicles 2TNK: Inherits: ^Tank Inherits@GAINSEXPERIENCE: ^GainsExperience Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove - Inherits@BERSERK: ^Berserk Inherits@SLOWCRUSH: ^SlightlySlowedByCrushing + Inherits@HeavyArmor: ^HeavyArmor + Inherits@TANKBUSTERVULN: ^TankBusterVulnerability Buildable: - Queue: Vehicle + Queue: VehicleSQ, VehicleMQ BuildPaletteOrder: 70 - Prerequisites: ~vehicles.2tnk, ~techlevel.low - Description: Allied main battle tank.\n Strong vs Vehicles\n Weak vs Infantry, Defenses, Aircraft + Prerequisites: ~vehicles.allies, ~techlevel.low + Description: Allied main battle tank. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor + Weaknesses: • Weak vs Infantry, Defenses\n• Cannot attack Aircraft Valued: Cost: 800 Tooltip: @@ -172,10 +473,8 @@ KATY: AddToArmyValue: true Health: HP: 47000 - Armor: - Type: Heavy Mobile: - Speed: 66 + Speed: 72 RevealsShroud: MinRange: 4c0 Range: 6c0 @@ -196,7 +495,7 @@ KATY: LocalOffset: 720,0,80 MuzzleSequence: muzzle AttackTurreted: - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded WithMuzzleOverlay: WithSpriteTurret: SpawnActorOnDeath: @@ -204,11 +503,97 @@ KATY: RequiresCondition: !being-warped ProducibleWithLevel: Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded Selectable: - DecorationBounds: 28,28 + DecorationBounds: 1194, 1194 + Encyclopedia: + Category: Allies/Vehicles + +GTNK: + Inherits: 2TNK + Buildable: + Queue: GrizzlyTank + -Prerequisites: + Description: Allied paradropped battle tank. + Valued: + Cost: 875 + Tooltip: + Name: Grizzly Tank + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor + Weaknesses: • Weak vs Infantry, Defenses\n• Cannot attack Aircraft + Mobile: + Speed: 100 + Voice: Move + Passenger: + Voice: Move + Health: + HP: 41250 + Armament: + Weapon: 105mm + LocalOffset: 720,0,80 + Turreted: + TurnSpeed: 20 + Offset: 80,0,0 + AttackTurreted: + Voice: Attack + PauseOnCondition: empdisable || being-warped || blinded || parachute + AttackMove: + Voice: Attack + SpawnActorOnDeath: + Actor: GTNK.Husk + Voiced: + VoiceSet: GrizzlyVoice + EncyclopediaExtras: + Subfaction: usa + +GTNKR2: + Inherits: GTNK + RenderSprites: + Image: gtnk + ProducibleWithLevel: + -Prerequisites: + InitialLevels: 2 + -Encyclopedia: + -EncyclopediaExtras: + +GTNK.squad: + AlwaysVisible: + Interactable: + ScriptTriggers: + ProvidesPrerequisite@squadname: + Tooltip: + Name: Airdrop: Grizzly Tanks + Buildable: + Queue: VehicleSQ, VehicleMQ + BuildAtProductionType: ParadropVehicle + BuildPaletteOrder: 400 + Prerequisites: radaroraircraft, ~vehicles.usa, ~techlevel.medium + Description: Prepare a pair of Grizzly Tanks for airdrop. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor + Weaknesses: • Weak vs Infantry, Defenses\n• Cannot attack Aircraft + Valued: + Cost: 1750 + RenderSprites: + Image: squad.airborne.tank + ProduceActorPowerCA: + Actors: powerproxy.airborne.tank + Type: ParadropVehicle + OneShot: true + AutoFire: true + AllowMultiple: true + Armor: + Type: Heavy + ProductionTimeMultiplier: + Multiplier: 75 + Prerequisites: airborne.upgrade 2TNK.Chrono: Inherits: 2TNK + Inherits@TEMPINC: ^TemporalReinforcement RenderSprites: Image: 2tnk FactionImages: @@ -230,6 +615,8 @@ KATY: traveler: devo harbinger: devo -Buildable: + FireWarheadsOnDeath: + RequiresCondition: !warpout GrantConditionOnFaction@France: Factions: france Condition: france @@ -239,17 +626,20 @@ KATY: GrantConditionOnFaction@Germany: Factions: germany Condition: germany + GrantConditionOnFaction@USA: + Factions: usa + Condition: usa GrantConditionOnFaction@GDI: - Factions: talon, zocom, eagle, arc + Factions: gdi, talon, zocom, eagle, arc Condition: gdi GrantConditionOnFaction@NOD: - Factions: blackh, marked, legion, shadow + Factions: nod, blackh, marked, legion, shadow Condition: nod GrantConditionOnFaction@SOVIET: - Factions: russia, ukraine, iraq, yuri + Factions: soviet, russia, ukraine, iraq, yuri Condition: soviet GrantConditionOnFaction@SCRIN: - Factions: reaper, traveler, harbinger + Factions: scrin, reaper, traveler, harbinger, collector Condition: scrin SpeedMultiplier@SCRIN: Modifier: 140 @@ -261,7 +651,7 @@ KATY: BobDistance: -25 RequiresCondition: !empdisable && !being-warped && !driver-dead && scrin Armament: - RequiresCondition: france + RequiresCondition: france || usa Armament@Germany: Weapon: 183mm Recoil: 85 @@ -296,8 +686,8 @@ KATY: Turret: secondary RequiresCondition: scrin Tooltip: - RequiresCondition: france - Tooltip@TD: + RequiresCondition: france || usa + Tooltip@Germany: Name: Tank Destroyer GenericName: Tank RequiresCondition: germany @@ -333,21 +723,17 @@ KATY: Turrets: primary, secondary, tertiary TargetFrozenActors: True Armaments: primary - MirageTooltip@Tree: - Name: Mirage Tank - GenericName: Civilian building - GenericVisibility: Enemy, Neutral - RequiresCondition: tree && england Mirage: RequiresCondition: england && !empdisable && !being-warped && !driver-dead RevealOn: Attack, Move MirageCondition: tree DefaultTargetTypes: v08, v09, v10, v11, v12, v13, v14, v15, v16, v17, v18 - InitialDelay: 100 + InitialDelay: 99 RevealDelay: 100 WithMirageSpriteBody: RequiresCondition: tree && england Name: tree + IsPlayerPalette: false WithFacingSpriteBody: RequiresCondition: !tree WithSpriteTurret: @@ -356,29 +742,25 @@ KATY: RequiresCondition: gdi || nod Turret: tertiary IsPlayerPalette: true - Palette: overlayplayertd + Palette: playertd WithSpriteTurret@SCRIN: Turret: secondary RequiresCondition: scrin WithMuzzleOverlay: RequiresCondition: !scrin Cloak@NORMAL: - InitialDelay: 100 + InitialDelay: 99 CloakDelay: 100 CloakSound: vmirat2a.aud CloakedCondition: hidden - UncloakSound: appear1.aud - UncloakOn: Attack, Unload, Infiltrate, Demolish, Dock, Move, Damage, Heal, SelfHeal - Palette: player - IsPlayerPalette: false - RequiresCondition: england && !cloak-force-disabled && !invisibility && !driver-dead && !empdisable && !being-warped + UncloakSound: appear1md.aud + UncloakOn: Attack, Unload, Infiltrate, Demolish, Dock, Move, Damage, Heal + RequiresCondition: england && !cloak-force-disabled && !being-warped && !empdisable && !driver-dead + PauseOnCondition: invisibility Cloak@CRATE-CLOAK: RequiresCondition: crate-cloak && !(cloak-force-disabled || invisibility || hidden || driver-dead) - GrantConditionOnDamageState@UNCLOAK: - Condition: cloak-force-disabled - ValidDamageStates: Critical, Heavy SpawnActorOnDeath: - RequiresCondition: !(being-warped || warpout) && warpin && france + RequiresCondition: !(being-warped || warpout) && warpin && (france || usa) SpawnActorOnDeath@England: Actor: RTNK.Husk RequiresCondition: warpin && england && !(being-warped || warpout) @@ -391,74 +773,57 @@ KATY: SpawnActorOnDeath@SOVIET: Actor: 3TNK.Husk RequiresCondition: warpin && soviet && !(being-warped || warpout) - GrantTimedCondition@warpin: - Condition: warpin - Duration: 850 - KillsSelf@warpout: - GrantsCondition: warpout - RequiresCondition: !warpin - Explodes@warpout: - Weapon: UnitExplodeWarpOut - EmptyWeapon: UnitExplodeWarpOut - RequiresCondition: warpout - AutoTargetPriority@DEFAULT: - ValidTargets: Infantry, Water, Underwater, Defense - AutoTargetPriority@ATTACKANYTHING: - ValidTargets: Infantry, Water, Underwater, Structure, Defense, Mine - AutoTargetPriority@TANKDEFAULT: - RequiresCondition: !stance-attackanything && !assault-move && germany - ValidTargets: Vehicle - InvalidTargets: NoAutoTarget, WaterStructure - Priority: 10 - AutoTargetPriority@TANKATTACKANYTHING: - RequiresCondition: (stance-attackanything || assault-move) && germany + AutoTargetPriority@TankDestroyer: + RequiresCondition: germany ValidTargets: Vehicle InvalidTargets: NoAutoTarget Priority: 10 + -MapEditorData: + -Encyclopedia: + +2TNK.TEMP: + Inherits: 2TNK + Inherits@TEMPINC: ^TemporalReinforcement + RenderSprites: + Image: 2tnk + FireWarheadsOnDeath: + RequiresCondition: !warpout + -ActorLostNotification: + -SpawnActorOnDeath: + -Buildable: + -ChronoshiftableCA: + -HealthCapDamageMultiplier@CHRONO: + -MapEditorData: + -Encyclopedia: 3TNK: Inherits: ^Tank Inherits@GAINSEXPERIENCE: ^GainsExperience Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove - Inherits@BERSERK: ^Berserk - Inherits@SHRAPNEL: ^ThrowsShrapnel Inherits@SLOWCRUSH: ^SlightlySlowedByCrushing + Inherits@HeavyArmor: ^HeavyArmor + Inherits@TANKBUSTERVULN: ^TankBusterVulnerability + Inherits@ATOMICAMMO: ^AtomicAmmunition + Inherits@UpgradeOverlay: ^UpgradeOverlay Buildable: - Queue: Vehicle - BuildPaletteOrder: 90 - Prerequisites: ~!iraqtank.upgrade, ~!lasher.upgrade, ~vehicles.3tnk, ~techlevel.low - Description: Soviet main battle tank with dual cannons.\n Strong vs Vehicles\n Weak vs Infantry, Defenses, Aircraft + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 80 + Prerequisites: ~!atomicengines.upgrade, ~!lasher.upgrade, ~!armor.doctrine, ~vehicles.soviet, ~techlevel.low + Description: Soviet main battle tank with dual cannons. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor + Weaknesses: • Weak vs Infantry, Defenses\n• Cannot attack Aircraft Valued: Cost: 1150 Tooltip: Name: Heavy Tank GenericName: Tank - RequiresCondition: !iraqtank-upgrade && !lasher-upgrade - Tooltip@IRAQ: - Name: Atomic Heavy Tank - GenericName: Tank - RequiresCondition: iraqtank-upgrade - Tooltip@LASHER: - Name: Lasher Tank - GenericName: Tank - RequiresCondition: lasher-upgrade UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 63000 - DamageMultiplier@LASHER: - Modifier: 110 - RequiresCondition: lasher-upgrade - Armor: - Type: Heavy + HP: 62000 Mobile: - Speed: 56 - SpeedMultiplier@IRAQTANK: - Modifier: 125 - RequiresCondition: iraqtank-upgrade - SpeedMultiplier@LASHER: - Modifier: 120 - RequiresCondition: lasher-upgrade && !iraqtank-upgrade + Speed: 60 RevealsShroud: MinRange: 4c0 Range: 6c0 @@ -474,210 +839,262 @@ KATY: RecoilRecovery: 38 LocalOffset: 768,85,90, 768,-85,90 MuzzleSequence: muzzle - RequiresCondition: !lasher-upgrade - Armament@LASHER: - Weapon: 125mmLasher + PauseOnCondition: has-atomic-ammo || atomic-reloading + ReloadingCondition: reloading + Armament@ATOMICAMMO: + Weapon: 125mmAtomic Recoil: 128 RecoilRecovery: 38 LocalOffset: 768,85,90, 768,-85,90 MuzzleSequence: muzzle - RequiresCondition: lasher-upgrade + PauseOnCondition: !has-atomic-ammo || reloading + ReloadingCondition: atomic-reloading AttackTurreted: - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded || parachute WithMuzzleOverlay: WithSpriteTurret: - RequiresCondition: !lasher-upgrade - WithSpriteTurret@LASHER: - Sequence: turret2 - RequiresCondition: lasher-upgrade WithFacingSpriteBody: - RequiresCondition: !iraqtank-upgrade && !lasher-upgrade - WithFacingSpriteBody@IRAQ: - Name: iraqbody - Sequence: idle2 - RequiresCondition: iraqtank-upgrade - WithFacingSpriteBody@LASHER: - Name: lasherbody - Sequence: idle3 - RequiresCondition: lasher-upgrade && !iraqtank-upgrade SpawnActorOnDeath: Actor: 3TNK.Husk - RequiresCondition: !being-warped && !iraqtank-upgrade && !lasher-upgrade - SpawnActorOnDeath@LASHER: - Actor: 3TNK.YURI.Husk - RequiresCondition: !being-warped && !iraqtank-upgrade && lasher-upgrade - Explodes@IRAQTANK: - Weapon: UnitExplodeIraqTank - EmptyWeapon: UnitExplodeIraqTank - RequiresCondition: !being-warped && iraqtank-upgrade - ThrowsShrapnel@small: - RequiresCondition: iraqtank-upgrade + RequiresCondition: !being-warped ProducibleWithLevel: Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded Selectable: - DecorationBounds: 28,28 - GrantConditionOnPrerequisite@IRAQ: - Condition: iraqtank-upgrade - Prerequisites: iraqtank.upgrade - GrantConditionOnPrerequisite@LASHER: - Condition: lasher-upgrade - Prerequisites: lasher.upgrade - SpeedMultiplier@CRUSHATTEMPTSLOW: - RequiresCondition: crush-attempt-slow && !crush-slow && !lasher-upgrade - SpeedMultiplier@CRUSHSLOW: - RequiresCondition: crush-slow && !lasher-upgrade - PeriodicExplosion@LASHER: - LocalOffset: 896, 0, 0 - Weapon: Lasher - RequiresCondition: lasher-upgrade && lasher-move - GrantConditionOnMovement@LASHER: - ValidMovementTypes: Horizontal, Vertical, Turn - Condition: lasher-move - RequiresCondition: lasher-upgrade + DecorationBounds: 1194, 1194 + ReplacedInQueue: + Actors: 3tnk.atomic, 3tnk.yuri, 3tnk.rhino + Upgradeable@ATOMIC: + Type: atomicengines.upgrade + UpgradingCondition: upgrading + Actor: 3tnk.atomic + UpgradeAtActors: fix, rep, srep + BuildDuration: 100 + RequiresCondition: !mindcontrolled + Upgradeable@LASHER: + Type: lasher.upgrade + UpgradingCondition: upgrading + Actor: 3tnk.yuri + UpgradeAtActors: fix, rep, srep + BuildDuration: 100 + RequiresCondition: !mindcontrolled + Upgradeable@RHINO: + Type: armor.doctrine + UpgradingCondition: upgrading + Actor: 3tnk.rhino + UpgradeAtActors: fix, rep, srep + BuildDuration: 100 + RequiresCondition: !mindcontrolled + Encyclopedia: + Category: Soviets/Vehicles -3TNK.IRAQ: +3TNK.ATOMIC: Inherits: 3TNK + Inherits@SHRAPNEL: ^ThrowsShrapnel RenderSprites: Image: 3tnki Buildable: - Queue: Vehicle - BuildPaletteOrder: 91 - Prerequisites: ~iraqtank.upgrade, ~vehicles.3tnk, ~techlevel.low - Description: Soviet main battle tank with dual cannons.\n Strong vs Vehicles\n Weak vs Infantry, Defenses, Aircraft + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 81 + Prerequisites: ~atomicengines.upgrade, ~!lasher.upgrade, ~!armor.doctrine, ~vehicles.soviet, ~techlevel.low + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor + Weaknesses: • Weak vs Infantry, Defenses\n• Cannot attack Aircraft + Attributes: • Explodes and leaves radiation on death Valued: Cost: 1150 Tooltip: Name: Atomic Heavy Tank GenericName: Tank - -RequiresCondition: Turreted: Offset: 0,0,20 - Armament: - -RequiresCondition: - Explodes@IRAQTANK: - RequiresCondition: !being-warped Selectable: Class: 3tnk - SpeedMultiplier@IRAQTANK: - -RequiresCondition: - WithFacingSpriteBody: - -RequiresCondition: - WithSpriteTurret: - -RequiresCondition: - Explodes@IRAQTANK: - RequiresCondition: !being-warped - ThrowsShrapnel@small: - -RequiresCondition: - -Tooltip@IRAQ: - -Tooltip@LASHER: + SpeedMultiplier: + Modifier: 125 -SpawnActorOnDeath: - -SpawnActorOnDeath@LASHER: - -Armament@LASHER: - -SpeedMultiplier@LASHER: - -DamageMultiplier@LASHER: - -WithFacingSpriteBody@IRAQ: - -WithFacingSpriteBody@LASHER: - -WithSpriteTurret@LASHER: - -PeriodicExplosion@LASHER: - -GrantConditionOnMovement@LASHER: - -GrantConditionOnPrerequisite@IRAQ: - -GrantConditionOnPrerequisite@LASHER: - SpeedMultiplier@CRUSHATTEMPTSLOW: - RequiresCondition: crush-attempt-slow && !crush-slow - SpeedMultiplier@CRUSHSLOW: - RequiresCondition: crush-slow + FireWarheadsOnDeath@ATOMICENGINES: + Weapon: UnitExplodeIraqTank + EmptyWeapon: UnitExplodeIraqTank + RequiresCondition: !being-warped + ReplacedInQueue: + Actors: 3tnk.atomicyuri, 3tnk.rhino.atomic + Upgradeable@LASHER: + Actor: 3tnk.atomicyuri + Upgradeable@RHINO: + Actor: 3tnk.rhino.atomic + -Upgradeable@ATOMIC: + EncyclopediaExtras: + VariantOf: 3TNK 3TNK.YURI: Inherits: 3TNK RenderSprites: Image: 3tnky Buildable: - Queue: Vehicle - BuildPaletteOrder: 91 - Prerequisites: ~lasher.upgrade, ~vehicles.3tnk, ~techlevel.low - Description: Heavy tank with infantry crushing improvements.\n Strong vs Vehicles\n Weak vs Defenses, Aircraft + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 84 + Prerequisites: ~lasher.upgrade, ~!atomicengines.upgrade, ~!armor.doctrine, ~vehicles.soviet, ~techlevel.low + Description: Heavy tank with infantry crushing improvements. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor + Weaknesses: • Weak vs Defenses\n• Cannot attack Aircraft + Attributes: • Can crush concrete walls Tooltip: Name: Lasher Tank - -RequiresCondition: + GenericName: Tank Health: HP: 57000 Selectable: Class: 3tnk - Armament@LASHER: - -RequiresCondition: - SpeedMultiplier@LASHER: - -RequiresCondition: + Armament: + Weapon: 125mmLasher + LocalOffset: 768,0,90 + Armament@ATOMICAMMO: + Weapon: 125mmLasherAtomic + LocalOffset: 768,0,90 + SpeedMultiplier: + Modifier: 125 GrantConditionOnMovement@LASHER: - -RequiresCondition: - WithFacingSpriteBody: - -RequiresCondition: - WithSpriteTurret: - -RequiresCondition: + ValidMovementTypes: Horizontal, Vertical, Turn + Condition: lasher-move PeriodicExplosion@LASHER: RequiresCondition: lasher-move - SpawnActorOnDeath@LASHER: - RequiresCondition: !being-warped + LocalOffset: 896, 0, 0 + Weapon: Lasher AttackTurreted: Voice: Attack Mobile: Voice: Move + Locomotor: heavytracked Passenger: Voice: Move - -Tooltip@IRAQ: - -Tooltip@LASHER: - -Armament: - -SpawnActorOnDeath: - -SpeedMultiplier@CRUSHATTEMPTSLOW: - -SpeedMultiplier@CRUSHSLOW: - -ExternalCondition@CRUSHATTEMPTSLOW: + Voiced: + VoiceSet: LasherTankVoice + SpawnActorOnDeath: + Actor: 3TNK.YURI.Husk + WithRestartableIdleOverlay@ATOMICAMMO: + RequiresCondition: atomic-ammo && has-atomic-ammo < 6 + AmmoPool@ATOMICAMMO: + Ammo: 6 + ReloadAmmoPool@ATOMICAMMO: + Count: 6 + RequiresCondition: atomic-ammo && has-atomic-ammo < 6 + -ExternalCondition@CRUSHATTEMPTSLOW: -ExternalCondition@CRUSHSLOW: - -SpeedMultiplier@IRAQTANK: - -WithFacingSpriteBody@IRAQ: - -WithFacingSpriteBody@LASHER: - -WithSpriteTurret@LASHER: - -DamageMultiplier@LASHER: - -Explodes@IRAQTANK: - -GrantConditionOnPrerequisite@IRAQ: - -GrantConditionOnPrerequisite@LASHER: - -ThrowsShrapnel@small: + -SpeedMultiplier@CRUSHATTEMPTSLOW: + -SpeedMultiplier@CRUSHSLOW: + ReplacedInQueue: + Actors: 3tnk.atomicyuri, 3tnk.rhino.yuri + Upgradeable@ATOMIC: + Actor: 3tnk.atomicyuri + Upgradeable@RHINO: + Actor: 3tnk.rhino.yuri + -Upgradeable@LASHER: + EncyclopediaExtras: + Subfaction: yuri + +3TNK.ATOMICYURI: + Inherits: 3TNK.ATOMIC + RenderSprites: + Image: 3tnkay + Buildable: + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 85 + Prerequisites: ~lasher.upgrade, ~atomicengines.upgrade, ~!armor.doctrine, ~vehicles.soviet, ~techlevel.low + Description: Heavy tank with infantry crushing improvements. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor + Weaknesses: • Weak vs Defenses\n• Cannot attack Aircraft + Attributes: • Can crush concrete walls\n• Explodes and leaves radiation on death + Tooltip: + Name: Atomic Lasher Tank + GenericName: Tank + Health: + HP: 57000 + Selectable: + Class: 3tnk + Armament: + Weapon: 125mmLasher + LocalOffset: 768,0,90 + Armament@ATOMICAMMO: + Weapon: 125mmLasherAtomic + LocalOffset: 768,0,90 + SpeedMultiplier: + Modifier: 135 + GrantConditionOnMovement@LASHER: + ValidMovementTypes: Horizontal, Vertical, Turn + Condition: lasher-move + PeriodicExplosion@LASHER: + RequiresCondition: lasher-move + LocalOffset: 896, 0, 0 + Weapon: Lasher + AttackTurreted: + Voice: Attack + Mobile: + Voice: Move + Locomotor: heavytracked + Passenger: + Voice: Move Voiced: VoiceSet: LasherTankVoice + WithFacingSpriteBody: + Sequence: idle2 + WithRestartableIdleOverlay@ATOMICAMMO: + RequiresCondition: atomic-ammo && has-atomic-ammo < 6 + AmmoPool@ATOMICAMMO: + Ammo: 6 + ReloadAmmoPool@ATOMICAMMO: + Count: 6 + RequiresCondition: atomic-ammo && has-atomic-ammo < 6 + -ExternalCondition@CRUSHATTEMPTSLOW: + -ExternalCondition@CRUSHSLOW: + -SpeedMultiplier@CRUSHATTEMPTSLOW: + -SpeedMultiplier@CRUSHSLOW: + ReplacedInQueue: + Actors: 3tnk.rhino.atomicyuri + Upgradeable@RHINO: + Actor: 3tnk.rhino.atomicyuri + -Upgradeable@LASHER: + EncyclopediaExtras: + Subfaction: yuri + VariantOf: 3TNK.YURI -4TNK: +3TNK.RHINO: Inherits: ^Tank Inherits@GAINSEXPERIENCE: ^GainsExperience - Inherits@AUTOTARGET: ^AutoTargetAllAssaultMove - Inherits@BERSERK: ^Berserk - Inherits@SHRAPNEL: ^ThrowsShrapnel + Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove + Inherits@SLOWCRUSH: ^SlightlySlowedByCrushing + Inherits@HeavyArmor: ^HeavyArmor + Inherits@TANKBUSTERVULN: ^TankBusterVulnerability + Inherits@ATOMICAMMO: ^AtomicAmmunition + Inherits@UpgradeOverlay: ^UpgradeOverlay Buildable: - Queue: Vehicle - BuildPaletteOrder: 290 - Prerequisites: stek, ~vehicles.soviet, ~!iraqtank.upgrade, ~techlevel.high - Description: Big and slow tank with anti-air capability.\n Can crush concrete walls.\n Strong vs Vehicles, Infantry\n Weak vs Nothing + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 82 + Prerequisites: ~vehicles.soviet, ~!atomicengines.upgrade, ~!lasher.upgrade, ~armor.doctrine, ~techlevel.low + Description: Soviet main battle tank with a single powerful cannon. + RenderSprites: + Image: rhin + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor + Weaknesses: • Weak vs Infantry, Defenses\n• Cannot attack Aircraft Valued: - Cost: 1700 + Cost: 1150 Tooltip: - Name: Mammoth Tank - GenericName: Tank - RequiresCondition: !iraqtank-upgrade - Tooltip@UPG: - Name: Atomic Mammoth Tank + Name: Rhino Heavy Tank GenericName: Tank - RequiresCondition: iraqtank-upgrade UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 82000 - Armor: - Type: Heavy + HP: 68000 Mobile: - Speed: 42 - Locomotor: heavytracked - SpeedMultiplier@IRAQTANK: - Modifier: 125 - RequiresCondition: iraqtank-upgrade + Speed: 60 + Voice: Move Passenger: - Weight: 2 + Voice: Move RevealsShroud: MinRange: 4c0 Range: 6c0 @@ -685,90 +1102,220 @@ KATY: RevealsShroud@GAPGEN: Range: 4c0 Turreted: - TurnSpeed: 8 - Armament@PRIMARY: - Weapon: 130mm - LocalOffset: 900,180,340, 900,-180,340 - Recoil: 171 - RecoilRecovery: 30 + TurnSpeed: 20 + Offset: 0,0,0 + Armament: + Weapon: 125mmRhino + Recoil: 128 + RecoilRecovery: 38 + LocalOffset: 768,0,90 MuzzleSequence: muzzle - Armament@SECONDARY: - Name: secondary - Weapon: MammothTusk - LocalOffset: -85,384,340, -85,-384,340 - LocalYaw: -100,100 - Recoil: 43 + PauseOnCondition: has-atomic-ammo || atomic-reloading + ReloadingCondition: reloading + Armament@ATOMICAMMO: + Weapon: 125mmRhinoAtomic + Recoil: 128 + RecoilRecovery: 38 + LocalOffset: 768,0,90 MuzzleSequence: muzzle + PauseOnCondition: !has-atomic-ammo || reloading + ReloadingCondition: atomic-reloading AttackTurreted: - PauseOnCondition: empdisable || being-warped + Voice: Attack + PauseOnCondition: empdisable || being-warped || blinded || parachute + AttackMove: + Voice: Attack + Voiced: + VoiceSet: RhinoTankVoice WithMuzzleOverlay: - WithFacingSpriteBody: - RequiresCondition: !iraqtank-upgrade - WithFacingSpriteBody@IRAQ: - Name: iraqbody - Sequence: idle2 - RequiresCondition: iraqtank-upgrade WithSpriteTurret: - RequiresCondition: !iraqtank-upgrade - WithSpriteTurret@UPG: - Sequence: turret2 - RequiresCondition: iraqtank-upgrade + RequiresCondition: !reactive-upgrade + WithSpriteTurret@ReactiveArmor: + Sequence: turret-upg + RequiresCondition: reactive-upgrade + WithFacingSpriteBody: SpawnActorOnDeath: - Actor: 4TNK.Husk - RequiresCondition: !being-warped && !iraqtank-upgrade - Explodes@IRAQTANK: - Weapon: UnitExplodeIraqTank - EmptyWeapon: UnitExplodeIraqTank - RequiresCondition: !being-warped && iraqtank-upgrade - ThrowsShrapnel@small: - RequiresCondition: iraqtank-upgrade - ChangesHealth: - PercentageStep: 1 - Delay: 25 - StartIfBelow: 50 - DamageCooldown: 150 + Actor: 3TNK.RHIN.Husk + RequiresCondition: !being-warped ProducibleWithLevel: Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded Selectable: - DecorationBounds: 44,38,0,-4 - Carryable: - LocalOffset: 0,0,500 - -Crushable: - GrantConditionOnPrerequisite@IRAQ: - Condition: iraqtank-upgrade - Prerequisites: iraqtank.upgrade + DecorationBounds: 1194, 1194 + Class: 3tnk + GrantConditionOnPrerequisite@ReactiveArmor: + Prerequisites: reactive.upgrade + Condition: reactive-upgrade + DamageMultiplier@ReactiveArmor: + Modifier: 80 + RequiresCondition: reactive-upgrade + ReplacedInQueue: + Actors: 3tnk.rhino.atomic, 3tnk.rhino.yuri + Upgradeable@ATOMIC: + Type: atomicengines.upgrade + UpgradingCondition: upgrading + Actor: 3tnk.rhino.atomic + UpgradeAtActors: fix, rep, srep + BuildDuration: 100 + RequiresCondition: !mindcontrolled + Upgradeable@LASHER: + Type: lasher.upgrade + UpgradingCondition: upgrading + Actor: 3tnk.rhino.yuri + UpgradeAtActors: fix, rep, srep + BuildDuration: 100 + RequiresCondition: !mindcontrolled + Encyclopedia: + Category: Soviets/Vehicles + EncyclopediaExtras: + Name: Rhino Tank + AdditionalInfo: Requires Armor Doctrine. -4TNK.IRAQ: - Inherits: ^Tank - Inherits@GAINSEXPERIENCE: ^GainsExperience - Inherits@AUTOTARGET: ^AutoTargetAllAssaultMove - Inherits@BERSERK: ^Berserk +3TNK.RHINO.ATOMIC: + Inherits: 3TNK.RHINO Inherits@SHRAPNEL: ^ThrowsShrapnel RenderSprites: - Image: 4tnki + Image: rhini + Buildable: + BuildPaletteOrder: 83 + Prerequisites: ~atomicengines.upgrade, ~!lasher.upgrade, ~armor.doctrine, ~techlevel.low + TooltipExtras: + Attributes: • Explodes and leaves radiation on death + Tooltip: + Name: Atomic Rhino Heavy Tank + Turreted: + Offset: 0,0,20 + Selectable: + Class: 3tnk + SpeedMultiplier: + Modifier: 125 + -SpawnActorOnDeath: + FireWarheadsOnDeath@ATOMICENGINES: + Weapon: UnitExplodeIraqTank + EmptyWeapon: UnitExplodeIraqTank + RequiresCondition: !being-warped + ReplacedInQueue: + Actors: 3tnk.rhino.atomicyuri + Upgradeable@LASHER: + Actor: 3tnk.rhino.atomicyuri + -Upgradeable@ATOMIC: + EncyclopediaExtras: + Name: Atomic Rhino Tank + VariantOf: 3TNK.RHINO + +3TNK.RHINO.YURI: + Inherits: 3TNK.RHINO + RenderSprites: + Image: rhiny + Buildable: + BuildPaletteOrder: 86 + Prerequisites: ~!atomicengines.upgrade, ~lasher.upgrade, ~armor.doctrine, ~techlevel.low + Description: Soviet main battle tank with infantry crushing improvements. + Tooltip: + Name: Thrasher Tank + TooltipExtras: + Attributes: • Can crush concrete walls + Health: + HP: 63000 + Mobile: + Locomotor: heavytracked + FirepowerMultiplier@Lasher: + Modifier: 95 + GrantConditionOnMovement@LASHER: + ValidMovementTypes: Horizontal, Vertical, Turn + Condition: lasher-move + PeriodicExplosion@LASHER: + RequiresCondition: lasher-move + LocalOffset: 896, 0, 0 + Weapon: Lasher + SpeedMultiplier: + Modifier: 125 + ReplacedInQueue: + Actors: 3tnk.rhino.atomicyuri + Upgradeable@ATOMIC: + Actor: 3tnk.rhino.atomicyuri + -ExternalCondition@CRUSHATTEMPTSLOW: + -ExternalCondition@CRUSHSLOW: + -SpeedMultiplier@CRUSHATTEMPTSLOW: + -SpeedMultiplier@CRUSHSLOW: + -Upgradeable@LASHER: + EncyclopediaExtras: + Name: Thrasher Tank + Subfaction: yuri + +3TNK.RHINO.ATOMICYURI: + Inherits: 3TNK.RHINO.ATOMIC + RenderSprites: + Image: rhinay + Buildable: + BuildPaletteOrder: 87 + Prerequisites: ~atomicengines.upgrade, ~lasher.upgrade, ~armor.doctrine, ~techlevel.low + Description: Soviet main battle tank with infantry crushing improvements. + Tooltip: + Name: Atomic Thrasher Tank + TooltipExtras: + Attributes: • Can crush concrete walls + Health: + HP: 65000 + Mobile: + Locomotor: heavytracked + FirepowerMultiplier@Lasher: + Modifier: 95 + GrantConditionOnMovement@LASHER: + ValidMovementTypes: Horizontal, Vertical, Turn + Condition: lasher-move + PeriodicExplosion@LASHER: + RequiresCondition: lasher-move + LocalOffset: 896, 0, 0 + Weapon: Lasher + SpeedMultiplier: + Modifier: 135 + -ExternalCondition@CRUSHATTEMPTSLOW: + -ExternalCondition@CRUSHSLOW: + -SpeedMultiplier@CRUSHATTEMPTSLOW: + -SpeedMultiplier@CRUSHSLOW: + -ReplacedInQueue: + -Upgradeable@LASHER: + -WithDecoration@UpgradeOverlay: + EncyclopediaExtras: + Name: Atomic Thrasher Tank + Subfaction: yuri + VariantOf: 3TNK.RHINO.YURI + +4TNK: + Inherits: ^Tank + Inherits@GAINSEXPERIENCE: ^GainsExperience + Inherits@AUTOTARGET: ^AutoTargetAllAssaultMovePrioritizeGround + Inherits@HeavyArmor: ^HeavyArmor + Inherits@TANKBUSTERVULN: ^TankBusterVulnerability + Inherits@ATOMICAMMO: ^AtomicAmmunition + Inherits@UpgradeOverlay: ^UpgradeOverlay Buildable: - Queue: Vehicle - BuildPaletteOrder: 291 - Prerequisites: stek, ~vehicles.soviet, ~iraqtank.upgrade, ~techlevel.high - Description: Big and slow tank with anti-air capability.\n Can crush concrete walls.\n Strong vs Vehicles, Infantry, Aircraft\n Weak vs Nothing + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 231 + Prerequisites: stek, ~vehicles.soviet, ~!erad.upgrade, ~!atomicengines.upgrade, ~!ovld.upgrade, ~!apoc.upgrade, ~techlevel.high + Description: Big and slow tank with anti-air capability. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor, Infantry + Attributes: • Can crush concrete walls\n• Self repairs to 50% out of combat Valued: Cost: 1700 Tooltip: - Name: Atomic Mammoth Tank + Name: Mammoth Tank GenericName: Tank UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 82000 - Armor: - Type: Heavy + HP: 95000 Mobile: - Speed: 42 + Speed: 44 Locomotor: heavytracked - SpeedMultiplier@IRAQTANK: - Modifier: 125 + Voice: Move Passenger: Weight: 2 + Voice: Move RevealsShroud: MinRange: 4c0 Range: 6c0 @@ -776,13 +1323,23 @@ KATY: RevealsShroud@GAPGEN: Range: 4c0 Turreted: - TurnSpeed: 8 + TurnSpeed: 12 Armament@PRIMARY: Weapon: 130mm + Recoil: 171 + RecoilRecovery: 30 LocalOffset: 900,180,340, 900,-180,340 + MuzzleSequence: muzzle + PauseOnCondition: has-atomic-ammo || atomic-reloading + ReloadingCondition: reloading + Armament@ATOMICAMMO: + Weapon: 130mmAtomic Recoil: 171 RecoilRecovery: 30 + LocalOffset: 900,180,340, 900,-180,340 MuzzleSequence: muzzle + PauseOnCondition: !has-atomic-ammo || reloading + ReloadingCondition: atomic-reloading Armament@SECONDARY: Name: secondary Weapon: MammothTusk @@ -791,12 +1348,17 @@ KATY: Recoil: 43 MuzzleSequence: muzzle AttackTurreted: - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded + Voice: Attack + AttackMove: + Voice: Attack + Voiced: + VoiceSet: MammothRUVoice WithMuzzleOverlay: + WithFacingSpriteBody: WithSpriteTurret: - Explodes@IRAQTANK: - Weapon: UnitExplodeIraqTank - EmptyWeapon: UnitExplodeIraqTank + SpawnActorOnDeath: + Actor: 4TNK.Husk RequiresCondition: !being-warped ChangesHealth: PercentageStep: 1 @@ -805,25 +1367,200 @@ KATY: DamageCooldown: 150 ProducibleWithLevel: Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded Selectable: - DecorationBounds: 44,38,0,-4 - Class: 4tnk + DecorationBounds: 1877, 1621, 0, -170 Carryable: LocalOffset: 0,0,500 -Crushable: + WithIdleOverlay@MINDCONTROL: + Offset: 0,0,512 + WithRestartableIdleOverlay@ATOMICAMMO: + RequiresCondition: atomic-ammo && has-atomic-ammo < 10 + WithAmmoPipsDecoration@ATOMICAMMO: + PipCount: 5 + AmmoPool@ATOMICAMMO: + Ammo: 10 + ReloadAmmoPool@ATOMICAMMO: + Count: 10 + RequiresCondition: atomic-ammo && has-atomic-ammo < 10 + ReplacedInQueue: + Actors: 4tnk.atomic, 4tnk.erad, ovld, apoc + Upgradeable@ATOMIC: + Type: atomicengines.upgrade + UpgradingCondition: upgrading + Actor: 4tnk.atomic + UpgradeAtActors: fix, rep, srep + BuildDuration: 100 + RequiresCondition: !mindcontrolled + Upgradeable@ERAD: + Type: erad.upgrade + UpgradingCondition: upgrading + Actor: 4tnk.erad + UpgradeAtActors: fix, rep, srep + BuildDuration: 100 + RequiresCondition: !mindcontrolled + Upgradeable@OVLD: + Type: ovld.upgrade + UpgradingCondition: upgrading + Actor: ovld + UpgradeAtActors: fix, rep, srep + BuildDuration: 100 + RequiresCondition: !mindcontrolled + Upgradeable@APOC: + Type: apoc.upgrade + UpgradingCondition: upgrading + Actor: apoc + UpgradeAtActors: fix, rep, srep + BuildDuration: 100 + RequiresCondition: !mindcontrolled + Encyclopedia: + Category: Soviets/Vehicles + +4TNK.ATOMIC: + Inherits: 4TNK + Inherits@SHRAPNEL: ^ThrowsShrapnel + RenderSprites: + Image: 4tnki + Buildable: + BuildPaletteOrder: 232 + Prerequisites: stek, ~vehicles.soviet, ~atomicengines.upgrade, ~!erad.upgrade, ~!ovld.upgrade, ~!apoc.upgrade, ~techlevel.high + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor, Infantry + Attributes: • Can crush concrete walls\n• Self repairs to 50% out of combat\n• Explodes and leaves radiation on death + Tooltip: + Name: Atomic Mammoth Tank + -SpawnActorOnDeath: + FireWarheadsOnDeath@ATOMICUPGRADE: + Weapon: UnitExplodeIraqTank + EmptyWeapon: UnitExplodeIraqTank + RequiresCondition: !being-warped + Selectable: + Class: 4tnk + SpeedMultiplier: + Modifier: 125 + ReplacedInQueue: + Actors: 4tnk.erad.atomic, ovld.atomic, apoc.atomic + Upgradeable@ERAD: + Actor: 4tnk.erad.atomic + Upgradeable@OVLD: + Actor: ovld.atomic + Upgradeable@APOC: + Actor: apoc.atomic + -Upgradeable@ATOMIC: + EncyclopediaExtras: + VariantOf: 4TNK + +4TNK.ERAD: + Inherits: 4TNK + RenderSprites: + Image: 4tnkerad + Tooltip: + Name: Eradicator + TooltipExtras: + Weaknesses: • Cannot attack Aircraft + Attributes: • Can crush concrete walls\n• Self repairs to 50% out of combat\n• Irradiates vehicles causing them to take more damage, deal less damage, and damage nearby units + Buildable: + Prerequisites: stek, ~vehicles.soviet, ~!atomicengines.upgrade, ~erad.upgrade, ~!ovld.upgrade, ~!apoc.upgrade, ~techlevel.high + Description: Big and slow tank armed with a radiation cannon. + BuildPaletteOrder: 233 + Armament@PRIMARY: + Weapon: RadBeamWeaponHeavy + MuzzlePalette: caneon + LocalOffset: 400,0,340 + -PauseOnCondition: + -ReloadingCondition: + -Armament@ATOMICAMMO: + -Armament@SECONDARY: + SpawnActorOnDeath: + Actor: 4TNK.ERAD.Husk + RequiresCondition: !being-warped + -ExternalCondition@ATOMICAMMO: + -WithRestartableIdleOverlay@ATOMICAMMO: + -FirepowerMultiplier@ATOMICAMMO: + -Targetable@ATOMICAMMO: + -AmmoPool@ATOMICAMMO: + -WithAmmoPipsDecoration@ATOMICAMMO: + -ReloadAmmoPool@ATOMICAMMO: + -ReloadAmmoPoolCA@ATOMICAMMODECAY: + -DamagedByTintedCells@RADSTRONG: + -DamagedByTintedCells@RADMED: + ReplacedInQueue: + Actors: 4tnk.erad.atomic, apoc.erad, ovld.erad + Upgradeable@ATOMIC: + Actor: 4tnk.erad.atomic + Upgradeable@APOC: + Actor: apoc.erad + Upgradeable@OVLD: + Actor: ovld.erad + -Upgradeable@ERAD: + -AutoTargetPriority@DeprioritizedAir: + Voiced: + VoiceSet: EradVoice + EncyclopediaExtras: + Subfaction: iraq + +4TNK.ERAD.ATOMIC: + Inherits: 4TNK.ATOMIC + RenderSprites: + Image: 4tnkeradi + Tooltip: + Name: Atomic Eradicator + TooltipExtras: + Weaknesses: • Cannot attack Aircraft + Attributes: • Can crush concrete walls\n• Self repairs to 50% out of combat\n• Explodes and leaves radiation on death\n• Irradiates vehicles causing them to take more damage, deal less damage, and damage nearby units + Buildable: + Prerequisites: stek, ~vehicles.soviet, ~atomicengines.upgrade, ~erad.upgrade, ~!ovld.upgrade, ~!apoc.upgrade, ~techlevel.high + Description: Big and slow tank armed with a radiation cannon. + BuildPaletteOrder: 234 + Selectable: + Class: 4tnk.erad + Armament@PRIMARY: + Weapon: RadBeamWeaponHeavy + MuzzlePalette: caneon + LocalOffset: 400,0,340 + -PauseOnCondition: + -ReloadingCondition: + -ExternalCondition@ATOMICAMMO: + -WithRestartableIdleOverlay@ATOMICAMMO: + -FirepowerMultiplier@ATOMICAMMO: + -Targetable@ATOMICAMMO: + -AmmoPool@ATOMICAMMO: + -WithAmmoPipsDecoration@ATOMICAMMO: + -ReloadAmmoPool@ATOMICAMMO: + -ReloadAmmoPoolCA@ATOMICAMMODECAY: + -Armament@ATOMICAMMO: + -Armament@SECONDARY: + Voiced: + VoiceSet: EradVoice + ReplacedInQueue: + Actors: apoc.erad.atomic, ovld.erad.atomic + Upgradeable@APOC: + Actor: apoc.erad.atomic + Upgradeable@OVLD: + Actor: ovld.erad.atomic + -Upgradeable@ERAD: + EncyclopediaExtras: + VariantOf: 4TNK.ERAD + Subfaction: iraq ARTY: Inherits: ^Vehicle Inherits@GAINSEXPERIENCE: ^GainsExperience Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove - Inherits@BERSERK: ^Berserk + Inherits@SlowedByCrushing: ^SlowedByCrushing Buildable: - Queue: Vehicle - BuildPaletteOrder: 100 - Prerequisites: ~vehicles.allies, ~techlevel.medium - Description: Long-range artillery.\n Strong vs Buildings, Defenses, Infantry\n Weak vs Vehicles, Aircraft + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 122 + Prerequisites: ~vehicles.allies, ~techlevel.low + Description: Long-range artillery. + TooltipExtras: + Strengths: • Strong vs Buildings, Defenses, Infantry, Light Armor + Weaknesses: • Cannot attack Aircraft\n• Has difficulty hitting moving targets Valued: - Cost: 550 + Cost: 650 Tooltip: Name: Artillery UpdatesPlayerStatistics: @@ -833,8 +1570,8 @@ ARTY: Armor: Type: Light Mobile: - TurnSpeed: 10 - Speed: 43 + TurnSpeed: 12 + Speed: 46 Locomotor: lighttracked RevealsShroud: MinRange: 4c0 @@ -849,29 +1586,45 @@ ARTY: AttackFrontal: TargetFrozenActors: True ForceFireIgnoresActors: True - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded + FacingTolerance: 0 WithMuzzleOverlay: - Explodes: + FireWarheadsOnDeath: Weapon: ArtilleryExplode LoadedChance: 75 ProducibleWithLevel: Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded + Encyclopedia: + Category: Allies/Vehicles ARTY.nod: Inherits: ARTY - RenderSprites: - Image: artynod - PlayerPalette: overlayplayertd + Inherits@TDPAL: ^TDPalette WithDamageOverlay: Image: smoke_mtd + RenderSprites: + Image: artynod Buildable: - BuildPaletteOrder: 101 + BuildPaletteOrder: 151 IconPalette: chrometd - Prerequisites: ~vehicles.nod, ~!howi.upgrade, ~techlevel.medium + Prerequisites: ~vehicles.nod, ~!howi.upgrade, ~techlevel.low Armament: Weapon: 155mmTD Selectable: Class: arty + ReplacedInQueue: + Actors: howi + Upgradeable@HOWI: + Type: howi.upgrade + Actor: howi + UpgradeAtActors: fix, rep, srep + BuildDuration: 100 + RequiresCondition: !mindcontrolled + Encyclopedia: + Category: Nod/Vehicles HOWI: Inherits: ARTY.nod @@ -880,21 +1633,37 @@ HOWI: Tooltip: Name: Howitzer Buildable: - BuildPaletteOrder: 102 + BuildPaletteOrder: 152 Prerequisites: ~vehicles.nod, ~howi.upgrade, ~techlevel.medium -AttackFrontal: AttackTurreted: - PauseOnCondition: empdisable || being-warped + TargetFrozenActors: True + ForceFireIgnoresActors: True + PauseOnCondition: empdisable || being-warped || blinded Turreted: - TurnSpeed: 10 + TurnSpeed: 18 Armament: Weapon: 155mmTDM Mobile: - Speed: 56 + Speed: 72 + TurnSpeed: 18 + RevealsShroud: + Range: 6c0 WithSpriteTurret: + -ReplacedInQueue: + -Upgradeable@HOWI: + Selectable: + -Class: + GrantConditionOnPrerequisite@ZealBonus: + Condition: zeal-covenant + Prerequisites: zeal.covenant + SpeedMultiplier@ZealBonus: + Modifier: 115 + RequiresCondition: zeal-covenant ARTY.Chrono: Inherits: ARTY + Inherits@TEMPINC: ^TemporalReinforcement RenderSprites: Image: arty FactionImages: @@ -906,27 +1675,17 @@ ARTY.Chrono: traveler: gunw harbinger: gunw GrantConditionOnFaction@SOVIET: - Factions: russia, ukraine, iraq, yuri + Factions: soviet, russia, ukraine, iraq, yuri Condition: soviet GrantConditionOnFaction@SCRIN: - Factions: reaper, traveler, harbinger + Factions: scrin, reaper, traveler, harbinger, collector Condition: scrin GrantConditionOnFaction@TD: - Factions: eagle, zocom, talon, blackh, marked, legion, shadow + Factions: gdi, talon, zocom, eagle, arc, nod, blackh, marked, legion, shadow Condition: td -Buildable: - GrantTimedCondition@warpin: - Condition: warpin - Duration: 850 - KillsSelf@warpout: - GrantsCondition: warpout - RequiresCondition: !warpin - Explodes: + FireWarheadsOnDeath: RequiresCondition: !warpout - Explodes@warpout: - Weapon: UnitExplodeWarpOut - EmptyWeapon: UnitExplodeWarpOut - RequiresCondition: warpout Armament: RequiresCondition: !scrin && !soviet && !td Armament@TD: @@ -965,30 +1724,49 @@ ARTY.Chrono: WithMoveAnimation: ValidMovementTypes: Horizontal, Vertical, Turn RequiresCondition: scrin + -MapEditorData: + -Encyclopedia: + +ARTY.TEMP: + Inherits: ARTY + Inherits@TEMPINC: ^TemporalReinforcement + RenderSprites: + Image: arty + FireWarheadsOnDeath: + RequiresCondition: !warpout + -ActorLostNotification: + -Buildable: + -ChronoshiftableCA: + -HealthCapDamageMultiplier@CHRONO: + -MapEditorData: + -Encyclopedia: ISU: Inherits: ^Tank Inherits@GAINSEXPERIENCE: ^GainsExperience Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove - Inherits@BERSERK: ^Berserk + Inherits@HeavyArmor: ^HeavyArmor + Inherits@ATOMICAMMO: ^AtomicAmmunition Buildable: - Queue: Vehicle - BuildPaletteOrder: 180 + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 183 Prerequisites: anyradar, ~vehicles.ukraine, ~techlevel.medium - Description: Powerful medium-range artillery.\n Strong vs Defenses, Buildings, Infantry\n Weak vs Aircraft\n Special Ability: Concussion Shells + Description: Powerful medium-range artillery. + TooltipExtras: + Strengths: • Strong vs Buildings, Defenses, Infantry, Light Armor + Weaknesses: • Cannot attack Aircraft\n• Has difficulty hitting moving targets + Attributes: • Concussion shells slow enemy movement and rate of fire\n• Can crush concrete walls Valued: - Cost: 1250 + Cost: 1500 Tooltip: Name: Siege Tank UpdatesPlayerStatistics: AddToArmyValue: true Health: HP: 60000 - Armor: - Type: Heavy Mobile: TurnSpeed: 8 - Speed: 43 + Speed: 46 Locomotor: heavytracked Voice: Move RevealsShroud: @@ -1001,17 +1779,40 @@ ISU: Weapon: 380mm LocalOffset: 824,0,208 MuzzleSequence: muzzle + PauseOnCondition: has-atomic-ammo || atomic-reloading + ReloadingCondition: reloading + Armament@ATOMICAMMO: + Weapon: 380mmAtomic + LocalOffset: 824,0,208 + MuzzleSequence: muzzle + PauseOnCondition: !has-atomic-ammo || reloading + ReloadingCondition: atomic-reloading AttackFrontal: TargetFrozenActors: True ForceFireIgnoresActors: True - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded Voice: Attack + FacingTolerance: 0 WithMuzzleOverlay: - Explodes: + WithRestartableIdleOverlay@ATOMICAMMO: + RequiresCondition: atomic-ammo && has-atomic-ammo < 3 + WithAmmoPipsDecoration@ATOMICAMMO: + PipCount: 3 + AmmoPool@ATOMICAMMO: + Ammo: 3 + ReloadAmmoPool@ATOMICAMMO: + Count: 3 + RequiresCondition: atomic-ammo && has-atomic-ammo < 3 + ReloadAmmoPoolCA@ATOMICAMMODECAY: + Count: -3 + FireWarheadsOnDeath: Weapon: ArtilleryExplode LoadedChance: 75 ProducibleWithLevel: Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded Passenger: Voice: Move Voiced: @@ -1019,42 +1820,79 @@ ISU: SpawnActorOnDeath: Actor: ISU.Husk RequiresCondition: !being-warped + Encyclopedia: + Category: Soviets/Vehicles + EncyclopediaExtras: + Subfaction: ukraine SPEC: - Inherits: ARTY.nod - RenderSprites: - Image: spec + Inherits: ^VehicleTD + Inherits@GAINSEXPERIENCE: ^GainsExperience + Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove + Inherits@SlowedByCrushing: ^SlowedByCrushing Buildable: - BuildPaletteOrder: 241 - Prerequisites: tmpl, ~vehicles.shadow, ~techlevel.medium - Description: Long-range stealth artillery.\n Strong vs Buildings, Defenses, Infantry\n Weak vs Vehicles, Aircraft + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 271 + IconPalette: chrometd + Prerequisites: tmpl, ~vehicles.shadow, ~techlevel.high + Description: Long-range stealth artillery. + TooltipExtras: + Strengths: • Strong vs Buildings, Defenses, Infantry, Light Armor + Weaknesses: • Weak vs Heavy Armor\n• Cannot attack Aircraft\n• Has difficulty hitting moving targets Valued: - Cost: 1200 + Cost: 1350 Tooltip: Name: Spectre - Selectable: - Class: spec + UpdatesPlayerStatistics: + AddToArmyValue: true Health: HP: 11000 + Armor: + Type: Light Mobile: - TurnSpeed: 20 - Speed: 80 + Speed: 82 + Locomotor: lighttracked + Voice: Move + AttackMove: + Voice: Move + Guard: + Voice: Move + RevealsShroud: + MinRange: 4c0 + Range: 5c0 + RevealGeneratedShroud: False + RevealsShroud@GAPGEN: + Range: 4c0 Armament: Weapon: 155mmSpec LocalOffset: 624,0,408 - FireDelay: 25 - Armament@TARGETTER: - Weapon: 155mmSpecTargeting + AttackFrontal: + TargetFrozenActors: True + ForceFireIgnoresActors: True + PauseOnCondition: empdisable || being-warped || blinded + FacingTolerance: 32 + Voice: Attack + WithMuzzleOverlay: + FireWarheadsOnDeath: + Weapon: ArtilleryExplode + LoadedChance: 75 + ProducibleWithLevel: + Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded Cloak@NORMAL: - InitialDelay: 90 + InitialDelay: 89 CloakDelay: 90 CloakSound: trans1.aud CloakedCondition: hidden - UncloakSound: appear1.aud - Palette: cloak + UncloakSound: appear1md.aud + CloakStyle: Palette + CloakedPalette: cloak IsPlayerPalette: false - UncloakOn: Attack, Unload, Infiltrate, Demolish, Dock, Damage, Heal, SelfHeal - RequiresCondition: !cloak-force-disabled && !invisibility && !being-warped && !driver-dead + UncloakOn: Attack, Unload, Infiltrate, Demolish, Dock, Damage, Heal + RequiresCondition: !cloak-force-disabled && !being-warped && !empdisable && !driver-dead + PauseOnCondition: invisibility Cloak@CRATE-CLOAK: RequiresCondition: crate-cloak && !(cloak-force-disabled || invisibility || hidden || driver-dead) GrantConditionOnDamageState@UNCLOAK: @@ -1062,115 +1900,203 @@ SPEC: ValidDamageStates: Critical AutoTarget: InitialStance: HoldFire - InitialStanceAI: ReturnFire + InitialStanceAI: AttackAnything + WithColoredSelectionBox@INVIS: + RequiresCondition: invisibility || hidden + ColorSource: Player + Voiced: + VoiceSet: SpectreVoice + GrantConditionToAttached@Cloak: + Condition: inherited-cloak + RequiresCondition: hidden || invisibility + Encyclopedia: + Category: Nod/Vehicles + EncyclopediaExtras: + Subfaction: shadow -HARV: - Inherits: ^Vehicle-NOUPG - Inherits@HARVBALANCE: ^HarvesterBalancer - Inherits@SELECTION: ^SelectableEconomicUnit +SAPC: + Inherits: ^Vehicle + Inherits@GAINSEXPERIENCE: ^GainsExperience + Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove + Inherits@TRANSPORT: ^Transport + Inherits@NOUNLOADCHRONO: ^NoUnloadWhenChronoshifted + Inherits@COMMANDOSKULL: ^CommandoSkull Buildable: - Queue: Vehicle - BuildPaletteOrder: 10 - Prerequisites: anyrefinery, ~vehicles.ra, ~!charv.upgrade, ~techlevel.infonly - Description: Collects Ore, Gems and Tiberium for processing.\n Unarmed + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 272 + Prerequisites: tmpl, ~vehicles.nod, ~!cust.upgrade, ~techlevel.high + Description: Stealth infantry transport. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor + Weaknesses: • Weak vs Heavy Armor, Buildings, Defenses\n• Cannot attack Aircraft Valued: - Cost: 1400 + Cost: 1100 Tooltip: - Name: Ore Truck - GenericName: Harvester - Selectable: - Priority: 7 - DecorationBounds: 42,42 - Harvester: - Capacity: 40 - Resources: Tiberium, BlueTiberium, Ore, Gems - BaleUnloadDelay: 1 - BaleLoadDelay: 3 - SearchFromProcRadius: 15 - SearchFromHarvesterRadius: 8 - HarvestFacings: 8 - EmptyCondition: no-ore - WithHarvesterPipsDecoration: - Position: BottomLeft - Margin: 4, 3 - RequiresSelection: true - PipCount: 5 - ResourceSequences: - Ore: pip-yellow - Gems: pip-red - Tiberium: pip-green - BlueTiberium: pip-blue + Name: Stealth APC + UpdatesPlayerStatistics: + AddToArmyValue: true Health: - HP: 75000 + HP: 20000 Armor: - Type: Heavy + Type: Light Mobile: - Speed: 51 - Locomotor: heavywheeled + Speed: 82 RevealsShroud: + MinRange: 4c0 + Range: 6c0 + RevealGeneratedShroud: False + RevealsShroud@GAPGEN: Range: 4c0 - WithHarvestAnimation: - WithDockingAnimation: + Armament: + Weapon: StealthAPCLaser + LocalOffset: 85,0,171 + AttackFrontal: + PauseOnCondition: empdisable || being-warped || blinded + FacingTolerance: 0 + Cargo: + Types: Infantry, Hacker + MaxWeight: 5 + LoadingCondition: notmobile + LoadedCondition: cargo + PassengerConditions: + e7: loaded-cmdo + rmbo: loaded-cmdo + bori: loaded-cmdo + yuri: loaded-cmdo + mast: loaded-cmdo + WithCargoSounds: + EnterSounds: genter1a.aud + ExitSounds: gexit1a.aud + CargoBlocked: + RequiresCondition: mindcontrolled + WithDecoration@COMMANDOSKULL: + RequiresCondition: loaded-cmdo + ProducibleWithLevel: + Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded + Capturable: + RequiresCondition: !being-warped && !cargo + Capturable@DRIVER_DEAD: + RequiresCondition: driver-dead && !cargo + Targetable@MindControlResistant: + TargetTypes: MindControlResistant + RequiresCondition: cargo + Targetable@MindControlImmune: + TargetTypes: MindControlImmune + RequiresCondition: loaded-cmdo + Cloak@NORMAL: + InitialDelay: 89 + CloakDelay: 90 + CloakSound: trans1.aud + CloakedCondition: hidden + UncloakSound: appear1md.aud + CloakStyle: Palette + CloakedPalette: cloak + IsPlayerPalette: false + UncloakOn: Attack, Unload, Infiltrate, Demolish, Dock, Damage, Heal + RequiresCondition: !cloak-force-disabled && !being-warped && !empdisable && !driver-dead + PauseOnCondition: invisibility + AudibleThroughFog: true + Cloak@CRATE-CLOAK: + RequiresCondition: crate-cloak && !(cloak-force-disabled || invisibility || hidden || driver-dead) + GrantConditionOnDamageState@UNCLOAK: + Condition: cloak-force-disabled + ValidDamageStates: Critical + AutoTarget: + InitialStance: HoldFire + InitialStanceAI: AttackAnything + GrantTimedConditionOnCargoAction: + Condition: cloak-force-disabled + Actions: Load + Duration: 30 + WithColoredSelectionBox@INVIS: + RequiresCondition: invisibility || hidden + ColorSource: Player + GrantConditionToAttached@Cloak: + Condition: inherited-cloak + RequiresCondition: hidden || invisibility + ReplacedInQueue: + Actors: cust + Encyclopedia: + Category: Nod/Vehicles + +SAPC.AI: + Inherits: SAPC + Inherits@AIUNLOAD: ^AIUNLOAD + RenderSprites: + Image: sapc + Buildable: + Prerequisites: ~botplayer, ~!tmpp, tmpl, ~vehicles.nod, ~techlevel.high + Cargo: + InitialUnits: N1,N1,N4,N3,N3 + WithCargoSounds: + -EnterSounds: + -Encyclopedia: + +SAPC.AI2: + Inherits: SAPC + Inherits@AIUNLOAD: ^AIUNLOAD + RenderSprites: + Image: sapc + Buildable: + Prerequisites: ~botplayer, ~tmpp, tmpl, ~vehicles.nod, ~techlevel.high + Cargo: + InitialUnits: N1C,N1C,N5,N3C,N3C + -Encyclopedia: + +HARV: + Inherits@HarvesterBase: ^HarvesterBase + Buildable: + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 10 + Prerequisites: anyrefinery, ~vehicles.ra, ~!charv.upgrade, ~techlevel.low + Description: Collects Ore, Gems and Tiberium for processing. + Tooltip: + Name: Ore Truck + Selectable: + Priority: 7 + DecorationBounds: 1792, 1792 + WithHarvestAnimationCA: + WithDockingAnimationCA: + RefineryTypes: proc SpawnActorOnDeath: - Actor: HARV.EmptyHusk + Actor: HARV.Husk RequiresCondition: !being-warped && !charv-upgrade - ChangesHealth: - PercentageStep: 1 - Delay: 25 - StartIfBelow: 50 - DamageCooldown: 500 - GrantConditionOnTerrain@Tiberium: - Condition: ontib - TerrainTypes: Tiberium - GrantConditionOnTerrain@Ore: - Condition: onore - TerrainTypes: Ore - Explodes@Ore: - RequiresCondition: !no-ore && onore && !being-warped - Weapon: OreExplosion - Explodes@Tib: - RequiresCondition: !no-ore && ontib && !being-warped - Weapon: TibExplosion - -Crushable: - Targetable: - TargetTypes: Ground, Vehicle, C4, ChaosImmune GrantConditionOnPrerequisite@OREPUPGRADE: Prerequisites: charv.upgrade Condition: charv-upgrade - KillsSelf@OREPUPGRADE: - Delay: 1 - RemoveInstead: true - RequiresCondition: charv-upgrade - GrantCondition@WARPOUT: - Condition: being-warped - RequiresCondition: charv-upgrade PeriodicExplosion@WARPOUT: Weapon: HarvSwap RequiresCondition: charv-upgrade - SpawnRandomActorOnDeath: - Actors: c1,c7,c10 - Probability: 5 - RequiresCondition: !being-warped + TransformOnCondition: + RequiresCondition: charv-upgrade + IntoActor: harv.chrono + RejectsOrders@Transforming: + RequiresCondition: charv-upgrade + ReplacedInQueue: + Actors: harv.chrono + Encyclopedia: + Category: Allies/Vehicles; Soviets/Vehicles HARV.Chrono: Inherits: HARV Buildable: BuildPaletteOrder: 11 Prerequisites: anyrefinery, ~charv.upgrade, ~vehicles.allies, ~techlevel.high - Description: Collects Ore, Gems and Tiberium for processing.\n Unarmed\n Special Ability: Teleport + TooltipExtras: + Attributes: • Teleports back to refinery RenderSprites: Image: charv Tooltip: Name: Chrono Miner - Health: - HP: 80000 Mobile: - Speed: 47 Voice: Move Harvester: - Capacity: 25 HarvestVoice: Harvest - DeliverVoice: Deliver + DockClientManager: + Voice: Deliver ChronoResourceDelivery: Image: chrono Palette: ra2effect-ignore-lighting-alpha75 @@ -1178,38 +2104,50 @@ HARV.Chrono: WarpOutSequence: warpout WarpInSound: vchrtele.aud WarpOutSound: ichrmova.aud + AudibleThroughFog: false Voiced: VoiceSet: ChronoMinerVoice SpawnActorOnDeath: - Actor: HARV.Chrono.EmptyHusk + Actor: HARV.Chrono.Husk RequiresCondition: !being-warped -GrantConditionOnPrerequisite@OREPUPGRADE: - -KillsSelf@OREPUPGRADE: - -GrantCondition@WARPOUT: -PeriodicExplosion@WARPOUT: + -TransformOnCondition: + -TransferResourcesOnTransform: + -RejectsOrders@Transforming: + StoresResources: + Capacity: 18 + Encyclopedia: + Category: Allies/Vehicles MCV: Inherits: ^Vehicle-NOUPG Inherits@SELECTION: ^SelectableSupportUnit + Inherits@A2GPROTECTION: ^AirToGroundProtection + Inherits@EconomyPolicyDiscount: ^EconomyPolicyDiscount + Inherits@EconomyPolicyMcvSpeedBonus: ^EconomyPolicyMcvSpeedBonus + Inherits@HeavyArmor: ^HeavyArmor + Inherits@NodCovenantTarget: ^NodCovenantTarget Buildable: - Queue: Vehicle - BuildPaletteOrder: 500 - Prerequisites: repair, ~vehicles.ra, ~techlevel.medium - Description: Deploys into another Construction Yard.\n Unarmed + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 600 + Prerequisites: vehicles.mcv, ~vehicles.ra, ~techlevel.low + Description: Deploys into another Construction Yard. BuildDurationModifier: 50 + TooltipExtras: + Weaknesses: • Unarmed + Attributes: • Special Ability: Deploy into Construction Yard Valued: Cost: 3000 Tooltip: Name: Mobile Construction Vehicle Selectable: Priority: 4 - DecorationBounds: 42,42 + DecorationBounds: 1792, 1792 Health: HP: 75000 - Armor: - Type: Heavy Mobile: - Speed: 51 + Speed: 54 Locomotor: heavywheeled RevealsShroud: Range: 4c0 @@ -1219,29 +2157,41 @@ MCV: Facing: 384 TransformSounds: placbldg.aud, build5.aud NoTransformNotification: BuildingCannotPlaceAudio + NoTransformTextNotification: Cannot deploy here. PauseOnCondition: empdisable || being-warped MustBeDestroyed: RequiredForShortGame: true BaseBuilding: + ProvidesPrerequisite@anymcv: + Prerequisite: anymcv SpawnActorOnDeath: Actor: MCV.Husk RequiresCondition: !being-warped TransferTimedExternalConditionOnTransform: Condition: invulnerability + TransferTimedExternalConditionOnTransform@INVIS: + Condition: invisibility -Crushable: - Targetable: - TargetTypes: Ground, Vehicle, C4, ChaosImmune, MindControlImmune + Targetable@MindControlImmune: + TargetTypes: MindControlImmune + DamageTypeDamageMultiplier@A2GPROTECTION: + Modifier: 60 + Encyclopedia: + Category: Allies/Vehicles; Soviets/Vehicles JEEP: Inherits: ^Vehicle Inherits@GAINSEXPERIENCE: ^GainsExperience Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove - Inherits@BERSERK: ^Berserk Buildable: - Queue: Vehicle + Queue: VehicleSQ, VehicleMQ BuildPaletteOrder: 20 Prerequisites: ~vehicles.allies, ~techlevel.low - Description: Fast scout & anti-infantry vehicle.\n Can detect spies and cloaked units.\n Strong vs Infantry\n Weak vs Vehicles, Buildings, Defenses, Aircraft + Description: Fast scout & anti-infantry vehicle. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor + Weaknesses: • Weak vs Heavy Armor, Buildings, Defenses\n• Cannot attack Aircraft + Attributes: • Detects cloaked units and spies Valued: Cost: 400 Tooltip: @@ -1254,13 +2204,15 @@ JEEP: Type: Light Mobile: TurnSpeed: 40 - Speed: 126 + Speed: 144 RevealsShroud: - MinRange: 4c0 + MinRange: 6c0 Range: 8c0 RevealGeneratedShroud: False + RequiresCondition: !optics-active RevealsShroud@GAPGEN: - Range: 4c0 + Range: 6c0 + RequiresCondition: !optics-active Turreted: TurnSpeed: 40 Offset: 0,0,128 @@ -1268,30 +2220,100 @@ JEEP: Weapon: M60mg MuzzleSequence: muzzle LocalOffset: 128,0,43 + WithEjectedCasings: + CasingWeapon: BrassDebris + CasingSpawnLocalOffset: 0,-125,200 + CasingTargetOffset: 0, -500, 0 AttackTurreted: - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded WithMuzzleOverlay: WithSpriteTurret: ProducibleWithLevel: Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded IgnoresDisguise: DetectCloaked: Range: 6c0 - CloakTypes: Cloak, Thief - RequiresCondition: !(empdisable || being-warped) + DetectionTypes: Cloak, AirCloak + RequiresCondition: !(empdisable || being-warped) && !optics-active + DetectCloaked@Optics: + Range: 13c0 + DetectionTypes: Cloak, AirCloak + RequiresCondition: !(empdisable || being-warped) && optics-active + RevealsShroud@Optics: + Range: 13c0 + RequiresCondition: optics-active + GrantTimedConditionOnDeploy@Optics: + DeployedCondition: optics-active + RequiresCondition: optics-upgrade + ShowSelectionBar: true + StartsFullyCharged: true + DeployedTicks: 375 + CooldownTicks: 1125 + ShowSelectionBarWhenFull: false + ChargingColor: 808080 + DischargingColor: ffffff + DeploySound: optics-enable.aud + UndeploySound: optics-disable.aud + Instant: true + GrantConditionOnPrerequisite@Optics: + Condition: optics-upgrade + Prerequisites: optics.upgrade + WithDecoration@Optics: + Image: opticsactive + Sequence: idle + Palette: effect + Position: Top + ValidRelationships: Ally + Margin: 0, 8 + RequiresCondition: optics-active + WithRadiatingCircle: + EndRadius: 13c0 + Color: 00bbff40 + MaxRadiusColor: 00bbff66 + MaxRadiusFlashColor: 00bbff66 + Interval: 75 + Duration: 50 + ValidRelationships: Ally + AlwaysShowMaxRange: true + RequiresCondition: optics-active + Encyclopedia: + Category: Allies/Vehicles + +JEEP.TEMP: + Inherits: JEEP + Inherits@TEMPINC: ^TemporalReinforcement + RenderSprites: + Image: jeep + FireWarheadsOnDeath: + RequiresCondition: !warpout + -ActorLostNotification: + -Buildable: + -ChronoshiftableCA: + -HealthCapDamageMultiplier@CHRONO: + -MapEditorData: + -Encyclopedia: APC: Inherits: ^Tank Inherits@GAINSEXPERIENCE: ^GainsExperience Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove - Inherits@BERSERK: ^Berserk Inherits@TRANSPORT: ^Transport + Inherits@NOUNLOADCHRONO: ^NoUnloadWhenChronoshifted + Inherits@HeavyArmor: ^HeavyArmor Inherits@SLOWCRUSH: ^SlowedByCrushing + Inherits@UpgradeOverlay: ^UpgradeOverlay + Inherits@COMMANDOSKULL: ^CommandoSkull Buildable: - Queue: Vehicle - BuildPaletteOrder: 40 - Prerequisites: infantry.any, ~vehicles.allies, ~techlevel.low - Description: Tough infantry transport.\n Strong vs Infantry\n Weak vs Tanks, Buildings, Defenses, Aircraft + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 121 + Prerequisites: ~vehicles.allies, ~!delp.upgrade, ~techlevel.low + Description: Tough infantry transport. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor + Weaknesses: • Weak vs Heavy Armor, Buildings, Defenses\n• Cannot attack Aircraft Valued: Cost: 600 Tooltip: @@ -1300,11 +2322,8 @@ APC: AddToArmyValue: true Health: HP: 30000 - Armor: - Type: Heavy Mobile: - Speed: 108 - PauseOnCondition: notmobile || being-captured || empdisable || being-warped || driver-dead + Speed: 126 RevealsShroud: MinRange: 4c0 Range: 5c0 @@ -1317,39 +2336,131 @@ APC: MuzzleSequence: muzzle WithMuzzleOverlay: AttackFrontal: - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded + FacingTolerance: 0 Cargo: - Types: Infantry + Types: Infantry, Hacker MaxWeight: 5 LoadingCondition: notmobile LoadedCondition: cargo + PassengerConditions: + e7: loaded-cmdo + rmbo: loaded-cmdo + bori: loaded-cmdo + yuri: loaded-cmdo + mast: loaded-cmdo + WithCargoSounds: + EnterSounds: genter1a.aud + ExitSounds: gexit1a.aud + CargoBlocked: + RequiresCondition: mindcontrolled + WithDecoration@COMMANDOSKULL: + RequiresCondition: loaded-cmdo ProducibleWithLevel: Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded Capturable: RequiresCondition: !being-warped && !cargo Capturable@DRIVER_DEAD: RequiresCondition: driver-dead && !cargo - Targetable@DRIVERKILL: - RequiresCondition: !driver-dead && !cargo + Targetable@MindControlResistant: + TargetTypes: MindControlResistant + RequiresCondition: cargo + Targetable@MindControlImmune: + TargetTypes: MindControlImmune + RequiresCondition: loaded-cmdo + ReplacedInQueue: + Actors: delp + Upgradeable@DELPHIS: + Type: delp.upgrade + UpgradingCondition: upgrading + Actor: delp + UpgradeAtActors: fix, rep, srep + RequiresCondition: !mindcontrolled + Encyclopedia: + Category: Allies/Vehicles + EncyclopediaExtras: + Name: APC + +DELP: + Inherits: APC + Buildable: + Prerequisites: ~vehicles.allies, ~delp.upgrade, ~techlevel.medium + Description: Tough infantry transport armed with an anti structure sonic weapon. + Valued: + Cost: 800 + Mobile: + Speed: 100 + RevealsShroud: + Range: 6c0 + Tooltip: + Name: Armored Personnel Carrier (Delphis) + TooltipExtras: + Description: Tough infantry transport with a sonic weapon. + Strengths: • Strong vs Buildings, Defenses, Infantry + Weaknesses: • Weak vs Heavy Armor + Attributes: • Causes structures to take increased damage + -AttackFrontal: + AttackTurreted: + PauseOnCondition: empdisable || being-warped || blinded + Turreted: + TurnSpeed: 14 + WithSpriteTurret: + WithFacingSpriteBody: + Sequence: idle-upg + Armament: + Weapon: SonicPulseDelphis + LocalOffset: -50,0,250 + -MuzzleSequence: + -ReplacedInQueue: + -Upgradeable@DELPHIS: + -WithDecoration@UpgradeOverlay: + EncyclopediaExtras: + Name: Delphis APC APC.AI: Inherits: APC - Inherits: ^AIUNLOAD + Inherits@AIUNLOAD: ^AIUNLOAD RenderSprites: Image: APC Buildable: - Prerequisites: ~botplayer, infantry.any, ~vehicles.allies, ~techlevel.low + Prerequisites: ~botplayer, ~vehicles.allies, ~!delp.upgrade, ~techlevel.low Cargo: InitialUnits: E1,E1,E1,E3,E3 + WithCargoSounds: + -EnterSounds: + -ReplacedInQueue: + -Upgradeable@DELPHIS: + -WithDecoration@UpgradeOverlay: + -Encyclopedia: + +DELP.AI: + Inherits: DELP + Inherits@AIUNLOAD: ^AIUNLOAD + RenderSprites: + Image: delp + Buildable: + Prerequisites: ~botplayer, ~vehicles.allies, ~delp.upgrade, ~techlevel.medium + Cargo: + InitialUnits: E1,E1,E1,E3,E3 + WithCargoSounds: + -EnterSounds: + -Encyclopedia: MNLY: Inherits: ^Tank Inherits@SELECTION: ^SelectableSupportUnit + Inherits@HeavyArmor: ^HeavyArmor Buildable: - Queue: Vehicle - BuildPaletteOrder: 440 - Prerequisites: repair, ~techlevel.medium, ~vehicles.human - Description: Lays mines to destroy unwary enemy units.\n Can detect mines.\n Unarmed + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 340 + Prerequisites: repair, ~techlevel.low, ~vehicles.human + Description: Lays mines to destroy unwary enemy units. + TooltipExtras: + Weaknesses: • Unarmed + Attributes: • Detects and disarms mines Valued: Cost: 800 Tooltip: @@ -1360,10 +2471,8 @@ MNLY: Priority: 5 Health: HP: 30000 - Armor: - Type: Heavy Mobile: - Speed: 108 + Speed: 126 RevealsShroud: MinRange: 4c0 Range: 5c0 @@ -1377,32 +2486,54 @@ MNLY: AmmoPool: Ammo: 5 RearmSound: minelay1.aud + Armaments: none WithAmmoPipsDecoration: Position: BottomLeft Margin: 4, 3 RequiresSelection: true DetectCloaked: Range: 5c0 - CloakTypes: Mine + DetectionTypes: Mine RequiresCondition: !(empdisable || being-warped) RenderDetectionCircle: - Explodes: + FireWarheadsOnDeath: Weapon: ATMine - RenderSprites: - Image: MNLY Rearmable: RearmActors: fix, rep - Targetable: - TargetTypes: Ground, Vehicle, C4, ChaosImmune + Armament@PRIMARY: + Weapon: MineDefuser + Cursor: goldwrench + OutsideRangeCursor: goldwrench + Name: primary + TargetRelationships: Enemy, Neutral + AutoTarget: + AutoTargetPriority@MINEDEFUSER: + ValidTargets: Mine + InvalidTargets: NoAutoTarget + AttackFrontalCharged: + FacingTolerance: 0 + ChargeLevel: 50 + DischargeRate: 50 + PauseOnCondition: empdisable || being-warped || blinded + ShowSelectionBar: true + SelectionBarColor: ffff00 + -WithDecoration@BOMBARD: + -WithDecoration@BOMBARD2: + -WithDecoration@BOMBARD3: + Encyclopedia: + Category: Allies/Vehicles; Soviets/Vehicles; GDI/Vehicles; Nod/Vehicles TRUK: Inherits: ^Vehicle Inherits@SELECTION: ^SelectableSupportUnit Buildable: - Queue: Vehicle - BuildPaletteOrder: 450 - Prerequisites: ~techlevel.low, ~vehicles.human - Description: Transports cash to other players.\n Unarmed + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 350 + Prerequisites: ~disabled + Description: Transports cash to other players. + BuildDurationModifier: 30 + TooltipExtras: + Weaknesses: • Unarmed Valued: Cost: 500 Tooltip: @@ -1414,29 +2545,30 @@ TRUK: Armor: Type: Light Mobile: - Speed: 108 + Speed: 126 RevealsShroud: Range: 4c0 DeliversCash: Payload: 500 - PlayerExperience: 50 SpawnActorOnDeath: Actor: moneycrate RequiresCondition: !being-warped - Targetable: - TargetTypes: Ground, Vehicle, C4, ChaosImmune - -ProductionCostMultiplier@IndustrialPlantLevel1: - -ProductionCostMultiplier@IndustrialPlantLevel2: + -ProductionCostMultiplier@IndustrialPlantBoost: + -ProductionCostMultiplier@OilRef: + -WithDecoration@BOMBARD: + -WithDecoration@BOMBARD2: + -WithDecoration@BOMBARD3: TRUK.DROP: Inherits: TRUK - -Buildable: + Buildable: + Queue: Dropzone RenderSprites: Image: truk -DeliversCash: CashTrickler: Interval: 50 - Amount: 750 + Amount: 1250 KillsSelf: Delay: 50 RemoveInstead: true @@ -1444,16 +2576,18 @@ TRUK.DROP: SelectionDecorations: RejectsOrders: Interactable: + -Encyclopedia: MGG: Inherits: ^Vehicle Inherits@AUTOTARGET: ^AutoTargetGround Buildable: - Queue: Vehicle - BuildPaletteOrder: 380 + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 301 Prerequisites: atek, ~vehicles.allies, ~techlevel.high - BuildDurationModifier: 50 - Description: Regenerates the shroud nearby, obscuring the area.\n Unarmed + Description: Regenerates the shroud nearby, obscuring enemy vision. Can channel the effect to reduce enemy weapon range and vision. + TooltipExtras: + Attributes: • Special Ability: Toggle Gap Generator Valued: Cost: 1000 Tooltip: @@ -1461,18 +2595,19 @@ MGG: UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 22000 + HP: 25000 Armor: - Type: Heavy + Type: Light Mobile: - Speed: 66 + Speed: 72 Carryable: - CarriedCondition: pickedup WithIdleOverlay@SPINNER: Offset: -299,0,171 Sequence: spinner - PauseOnCondition: empdisable || being-warped - RequiresCondition: !pickedup + PauseOnCondition: empdisable || being-warped || mgg-disabled + RequiresCondition: !passenger + MindControllable@MINDCONTROL: + OriginalOwnerLostAction: Kill RevealsShroud: MinRange: 4c0 Range: 6c0 @@ -1480,21 +2615,33 @@ MGG: RevealsShroud@GAPGEN: Range: 4c0 CreatesShroud: - Range: 7c0 - RequiresCondition: !empdisable && !being-warped - RenderShroudCircle: + Range: 6c0 + RequiresCondition: !empdisable && !being-warped && !mgg-disabled + RenderShroudCircleCA: + Color: 999999AA + RequiresCondition: !empdisable && !being-warped && !mgg-disabled SpawnActorOnDeath: Actor: MGG.Husk RequiresCondition: !being-warped - Targetable: - TargetTypes: Ground, Vehicle, C4, ChaosImmune - AttackOmni: - GuardsSelection: - RequiresCondition: !stance-attackanything + GrantConditionOnDeploy: + DeployedCondition: mgg-disabled + Armament@PRIMARY: + Weapon: MobileGapBeam + LocalOffset: 0, 0, 200 + MuzzleSequence: muzzle + WithMuzzleOverlay: + AttackTurreted: + PauseOnCondition: empdisable || being-warped + Turreted: + Offset: -299,0,171 + Encyclopedia: + Category: Allies/Vehicles MRJ: Inherits: ^Vehicle Inherits@AUTOTARGET: ^AutoTargetGround + AutoTargetPriority@DEFAULT: + ValidTargets: Vehicle, Ship, Defense Valued: Cost: 1000 Tooltip: @@ -1502,53 +2649,66 @@ MRJ: UpdatesPlayerStatistics: AddToArmyValue: true Buildable: - Queue: Vehicle - BuildPaletteOrder: 360 - Prerequisites: techcenter, ~vehicles.mrj, ~techlevel.high - BuildDurationModifier: 50 - Description: Jams nearby enemy radar systems.\n Unarmed\n Special Ability: Jams Missile-Lock Systems + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 300 + Prerequisites: atek, ~vehicles.allies, ~techlevel.high + Description: Support vehicle that can disrupt enemy targeting systems. + TooltipExtras: + Weaknesses: • Unarmed + Attributes: • Jamming fields reduce rate of fire and accuracy of enemy vehicles/defenses Health: - HP: 22000 + HP: 25000 Armor: - Type: Heavy + Type: Light Mobile: - Speed: 66 + Speed: 72 RevealsShroud: - Range: 7c0 + MinRange: 4c0 + Range: 6c0 + RevealGeneratedShroud: False + RevealsShroud@GAPGEN: + Range: 4c0 WithIdleOverlay@SPINNER: Sequence: spinner Offset: -256,0,256 PauseOnCondition: empdisable || being-warped - ProximityExternalCondition@JAMMER: - Range: 18c0 - ValidRelationships: Enemy, Neutral - Condition: jammed - WithRangeCircle@JAMMER: - Type: jammer - Range: 18c0 - Color: 0000FF80 - JamsMissiles: - Range: 5c0 - DeflectionRelationships: Neutral, Enemy - RequiresCondition: !empdisable - RenderJammerCircle: - Targetable: - TargetTypes: Ground, Vehicle, C4, ChaosImmune - AttackOmni: - GuardsSelection: - RequiresCondition: !stance-attackanything + Armament: + Weapon: RadarJammer + LocalOffset: 0,0,0 + AttackFrontalCharged: + ForceFireIgnoresActors: True + PauseOnCondition: empdisable || being-warped || blinded + FacingTolerance: 32 + ChargeLevel: 75 + DischargeRate: 5 + ShotsPerCharge: 1 + ShowSelectionBar: true + SelectionBarColor: ffffff + ChargingCondition: charging + AmbientSoundCA: + RequiresCondition: charging + SoundFiles: jammer.aud + WithIdleOverlay@JAMSIGNAL: + Sequence: jamsignal + RequiresCondition: charging + Offset: -256,0,256 + IsDecoration: True + Encyclopedia: + Category: Allies/Vehicles MSG: Inherits: ^Vehicle + Inherits@SELECTION: ^SelectableSupportUnit Buildable: - Queue: Vehicle - BuildPaletteOrder: 385 - Prerequisites: anyradar, ~vehicles.shadow, ~techlevel.high - Description: Cloaks nearby units and buildings.\n Unarmed + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 330 + Prerequisites: anyradar, ~vehicles.shadow, ~techlevel.medium + Description: Support unit that projects a cloaking field. + TooltipExtras: + Weaknesses: • Unarmed + Attributes: • Special Ability: Deploys to cloak nearby units and structures Valued: Cost: 1250 - Tooltip: - Name: Tooltip: Name: Mobile Stealth Generator RequiresCondition: !deployed @@ -1556,15 +2716,16 @@ MSG: Name: Mobile Stealth Generator (deployed) RequiresCondition: deployed Selectable: - DecorationBounds: 38,36,0,-1 + DecorationBounds: 1621, 1536, 0, -42 UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 25000 + HP: 18000 Armor: Type: Light Mobile: - Speed: 56 + Speed: 60 + ImmovableCondition: deployed RequireForceMoveCondition: !undeployed RevealsShroud: MinRange: 4c0 @@ -1575,8 +2736,6 @@ MSG: SpawnActorOnDeath: Actor: MSG.Husk RequiresCondition: !being-warped - Targetable: - TargetTypes: Ground, Vehicle, C4, ChaosImmune GrantCondition@PREVIEWWORKAROUND: Condition: real-actor WithMakeAnimation: @@ -1594,55 +2753,64 @@ MSG: DeployedCondition: deployed UndeployedCondition: undeployed Facing: 368 - AllowedTerrainTypes: Clear, Road, Rough + AllowedTerrainTypes: Clear, Road, Rough, Ore, Gems, Tiberium, BlueTiberium DeploySounds: placbldg.aud UndeploySounds: clicky1.aud UndeployOnMove: true UndeployOnPickup: true - ProximityExternalCondition@MSG: - Condition: invisibility WithRangeCircle@MSG: + Type: StealthGenerator RequiresCondition: deployed - Range: 4c512 + Range: 5c512 Color: 00aa00 ProximityExternalCondition@MSG: - Range: 4c512 - Condition: invisibility - RequiresCondition: deployed + Range: 5c512 + Condition: sgencloak + RequiresCondition: deployed && !cloak-force-disabled MaximumVerticalOffset: 512 AffectsParent: true + GrantConditionOnDamageState@UNCLOAK: + Condition: cloak-force-disabled + ValidDamageStates: Critical + Encyclopedia: + Category: Nod/Vehicles + EncyclopediaExtras: + Subfaction: shadow TTRA: Inherits: ^Tank Inherits@GAINSEXPERIENCE: ^GainsExperience Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove - Inherits@BERSERK: ^Berserk Inherits@SLOWCRUSH: ^SlowedByCrushing Buildable: - Queue: Vehicle - BuildPaletteOrder: 235 - Prerequisites: structures.tsla, stek, ~vehicles.soviet, ~techlevel.medium - Description: Half-track with mounted Tesla coil.\n Strong vs Infantry, Vehicles\n Weak vs Aircraft\n Special Ability: Jams Radar + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 230 + Prerequisites: stek, ~vehicles.soviet, ~techlevel.high + Description: Half-track with mounted Tesla Coil. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor, Infantry + Weaknesses: • Cannot attack Aircraft Valued: - Cost: 1250 + Cost: 1350 Tooltip: Name: Tesla Track GenericName: Tank UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 20000 + HP: 18000 Armor: Type: Light Mobile: - Speed: 66 + Speed: 60 Voice: Move + TurnSpeed: 16 RevealsShroud: - MinRange: 5c0 + MinRange: 4c0 Range: 6c0 RevealGeneratedShroud: False RevealsShroud@GAPGEN: - Range: 5c0 + Range: 4c0 Armament@PRIMARY: Weapon: TTrackZap LocalOffset: 0,0,213 @@ -1652,19 +2820,19 @@ TTRA: LocalOffset: 0,0,213 RequiresCondition: tarc-upgrade AttackTurreted: - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded Voice: Attack + TargetFrozenActors: True Turreted: WithIdleOverlay@SPINNER: Sequence: spinner - ProximityExternalCondition@JAMMER: - Range: 8c0 - ValidRelationships: Enemy, Neutral - Condition: jammed ProducibleWithLevel: Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded Selectable: - DecorationBounds: 30,30 + DecorationBounds: 1280, 1280 Passenger: Voice: Move Voiced: @@ -1675,30 +2843,33 @@ TTRA: GrantConditionOnPrerequisite@TARC: Condition: tarc-upgrade Prerequisites: tarc.upgrade + Encyclopedia: + Category: Soviets/Vehicles TTNK: Inherits: ^Tank Inherits@GAINSEXPERIENCE: ^GainsExperience Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove - Inherits@BERSERK: ^Berserk + Inherits@HeavyArmor: ^HeavyArmor Buildable: - Queue: Vehicle - BuildPaletteOrder: 200 - Prerequisites: structures.tsla, anyradar, ~vehicles.russia, ~techlevel.medium - Description: Tank with twin mounted Tesla coils.\n Strong vs Vehicles, Infantry\n Weak vs Aircraft + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 182 + Prerequisites: tslaorstek, anyradar, ~vehicles.russia, ~techlevel.medium + Description: Tank with twin mounted Tesla Coils. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor + Weaknesses: • Cannot attack Aircraft Valued: - Cost: 1250 + Cost: 1200 Tooltip: Name: Tesla Tank GenericName: Tank UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 40000 - Armor: - Type: Heavy + HP: 38000 Mobile: - Speed: 56 + Speed: 60 Voice: Move RevealsShroud: MinRange: 4c0 @@ -1708,30 +2879,16 @@ TTNK: Range: 4c0 Armament@PRIMARY: Weapon: TTankZap - LocalOffset: 511,200,113 - RequiresCondition: !tarc-upgrade - MuzzleSequence: muzzle - Armament@SECONDARY: - Name: secondary - Weapon: TTankZapSecondary - LocalOffset: 511,-200,113 + LocalOffset: 511,200,113, 511,-200,113 RequiresCondition: !tarc-upgrade MuzzleSequence: muzzle - FireDelay: 3 Armament@PRIMARYUPG: Weapon: TTankZap.UPG - LocalOffset: 511,200,113 - RequiresCondition: tarc-upgrade - MuzzleSequence: muzzle - Armament@SECONDARYUPG: - Name: secondary - Weapon: TTankZapSecondary.UPG - LocalOffset: 511,-200,113 + LocalOffset: 511,200,113, 511,-200,113 RequiresCondition: tarc-upgrade MuzzleSequence: muzzle - FireDelay: 3 AttackTurreted: - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded Voice: Attack WithMuzzleOverlay: WithSpriteTurret: @@ -1739,8 +2896,11 @@ TTNK: TurnSpeed: 28 ProducibleWithLevel: Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded Selectable: - DecorationBounds: 30,30 + DecorationBounds: 1280, 1280 Passenger: Voice: Move Voiced: @@ -1751,15 +2911,22 @@ TTNK: GrantConditionOnPrerequisite@TARC: Condition: tarc-upgrade Prerequisites: tarc.upgrade + Encyclopedia: + Category: Soviets/Vehicles + EncyclopediaExtras: + Subfaction: russia DTRK: Inherits: ^Vehicle - Inherits@BERSERK: ^Berserk + Inherits@SELECTION: ^SelectableSupportUnit Buildable: - Queue: Vehicle - BuildPaletteOrder: 420 + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 312 Prerequisites: stek, ~vehicles.soviet, ~techlevel.high - Description: Truck with actively armed nuclear\nexplosives. Has very weak armor. + Description: Truck carrying nuclear explosives. + TooltipExtras: + Weaknesses: • Very weak armor + Attributes: • Special Ability: Detonate Valued: Cost: 2000 Tooltip: @@ -1771,11 +2938,11 @@ DTRK: Armor: Type: Light Mobile: - Speed: 66 + Speed: 72 Voice: Move RevealsShroud: Range: 4c0 - Explodes: + FireWarheadsOnDeath: Weapon: MiniNuke EmptyWeapon: MiniNuke DamageSource: Killer @@ -1790,41 +2957,50 @@ DTRK: DeployedCondition: triggered -DamageMultiplier@IRONCURTAIN: KillsSelf: - RequiresCondition: invulnerability || triggered || berserk - ChronoshiftableWithSpriteEffect: + RequiresCondition: invulnerability || tibstealth || triggered || berserk + ChronoshiftableCA: ExplodeInstead: true Passenger: Voice: Move Voiced: VoiceSet: TTruckVoice - ProductionCostMultiplier@IRAQBONUS: - Multiplier: 90 - Prerequisites: vehicles.iraq + ExternalCondition@PRODUCED: + Condition: produced + VoiceAnnouncement: + RequiresCondition: produced + Voice: Build + ValidRelationships: Neutral, Ally + Encyclopedia: + Category: Soviets/Vehicles CTNK: Inherits: ^Vehicle Inherits@GAINSEXPERIENCE: ^GainsExperience - Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove - Inherits@BERSERK: ^Berserk + Inherits@AUTOTARGET: ^AutoTargetAllAssaultMovePrioritizeGround Inherits@SLOWCRUSH: ^SlowedByCrushing Buildable: - Queue: Vehicle - BuildPaletteOrder: 260 + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 220 Prerequisites: atek, ~vehicles.allies, ~techlevel.high - Description: Advanced tank armed with anti-ground missiles.\n Strong vs Vehicles, Buildings\n Weak vs Infantry, Aircraft\n Special Ability: Teleport + Description: Teleporting tank armed with twin missile launchers. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor, Defenses, Buildings + Weaknesses: • Weak vs Infantry + Attributes: • Special Ability: Teleport\n• Teleporting longer distances requires charge up Valued: - Cost: 1350 + Cost: 1500 Tooltip: Name: Chrono Tank GenericName: Tank UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 45000 + HP: 32000 Armor: Type: Light Mobile: - Speed: 90 + Speed: 92 + TurnSpeed: 30 Locomotor: heavywheeled RevealsShroud: MinRange: 4c0 @@ -1837,26 +3013,74 @@ CTNK: LocalOffset: -160,-276,232, -160,276,232 LocalYaw: 60, -60 AttackFrontal: - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded + FacingTolerance: 0 PortableChronoCA: + Charges: 1 ChargeDelay: 375 - MaxDistance: 18 - RequiresCondition: !empdisable && !being-warped + Cooldown: 75 + HasDistanceLimit: true + MaxDistance: 48 + MaxInstantDistance: 12 + PreChargeTicksPerCell: 7 + MaxPreChargeTicks: 250 + ResetRechargeOnUse: false + RequiresCondition: !empdisable && !being-warped && !chronoshifted + ShowSelectionBarWhenFull: false + ShowCooldownSelectionBar: true + RequireEmptyDestination: true + PreChargeCondition: chronoprep + MaxInstantCircleColor: EEEEEE44 + MaxInstantCircleBorderColor: 00000044 + WithColoredOverlay@PreCharge: + RequiresCondition: chronoprep + Color: 00eeff22 + WithIdleOverlay@PreCharge: + Sequence: idle + Image: chronoprep-overlay + Palette: effect + RequiresCondition: chronoprep + IsDecoration: True ProducibleWithLevel: Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded Selectable: - DecorationBounds: 30,30 + DecorationBounds: 1280, 1280 ProductionCostMultiplier@GermanyBonus: Multiplier: 90 - Prerequisites: vehicles.germany + Prerequisites: player.germany + PortableChronoModifier@TEMPORALFLUX: + ExtraCharges: 1 + RequiresCondition: tflx-upgrade + GrantConditionOnPrerequisite@TEMPORALFLUX: + Condition: tflx-upgrade + Prerequisites: tflx.upgrade + WithChronoshiftChargePipsDecoration: + Position: BottomLeft + Margin: 4, 3 + RequiresCondition: tflx-upgrade + AmbientSoundCA@Prep: + SoundFiles: chronoprep.aud + RequiresCondition: chronoprep + Interval: 1000 + Encyclopedia: + Category: Allies/Vehicles QTNK: Inherits: ^Tank + Inherits@SELECTION: ^SelectableSupportUnit + Inherits@HeavyArmor: ^HeavyArmor Buildable: - Queue: Vehicle - BuildPaletteOrder: 390 - Prerequisites: techcenter, ~vehicles.qtnk, ~techlevel.high - Description: Deals seismic damage to nearby vehicles and structures.\n Strong vs Vehicles, Buildings\n Weak vs Infantry, Aircraft + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 310 + Prerequisites: stek, ~vehicles.qtnk, ~techlevel.high + Description: Deals seismic damage to nearby vehicles and structures. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor, Defenses, Buildings + Weaknesses: • Weak vs Infantry\n• Cannot attack Aircraft + Attributes: • Special Ability: Seismic Shockwave Valued: Cost: 1700 Tooltip: @@ -1865,13 +3089,11 @@ QTNK: UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 90000 - Armor: - Type: Heavy + HP: 120000 Mobile: PauseOnCondition: deployed || being-captured || empdisable || being-warped || driver-dead || notmobile - Speed: 43 - ChronoshiftableWithSpriteEffect: + Speed: 46 + ChronoshiftableCA: RequiresCondition: !deployed && !being-captured && !being-warped RevealsShroud: MinRange: 4c0 @@ -1879,43 +3101,67 @@ QTNK: RevealGeneratedShroud: False RevealsShroud@GAPGEN: Range: 4c0 - MadTank: + MadTankCA: DeployedCondition: deployed + DriverActor: e1 + ChargeDelay: 40 + ThumpInterval: 60 + ThumpSequence: piston + ThumpDamageWeapon: MADTankDetonate + PauseOnCondition: empdisable || being-warped + FireWarheadsOnDeath: + Weapon: ArtilleryExplode Selectable: - DecorationBounds: 44,38,0,-4 + DecorationBounds: 1877, 1621, 0, -170 WithRangeCircle: + Type: MADTank Color: FFFF0080 Range: 7c0 -Crushable: - Targetable: - TargetTypes: Ground, MADTank, Vehicle, C4, ChaosImmune - ProductionCostMultiplier@UkraineBonus: - Multiplier: 90 - Prerequisites: vehicles.ukraine + Targetable@MADTank: + RequiresCondition: !being-warped + TargetTypes: MADTank + FirepowerMultiplier@MADIC: + Modifier: 40 + RequiresCondition: invulnerability + Targetable@MindControlImmune: + TargetTypes: MindControlImmune + RequiresCondition: deployed || driver-dead + Targetable@DriverKillImmune: + TargetTypes: DriverKillImmune + RequiresCondition: deployed + Encyclopedia: + Category: Soviets/Vehicles AMCV: Inherits: ^VehicleTD-NOUPG Inherits@SELECTION: ^SelectableSupportUnit + Inherits@A2GPROTECTION: ^AirToGroundProtection + Inherits@EconomyPolicyDiscount: ^EconomyPolicyDiscount + Inherits@EconomyPolicyMcvSpeedBonus: ^EconomyPolicyMcvSpeedBonus + Inherits@HeavyArmor: ^HeavyArmor + Inherits@NodCovenantTarget: ^NodCovenantTarget Buildable: - Queue: Vehicle - BuildPaletteOrder: 501 - Prerequisites: repair, ~vehicles.td, ~techlevel.infonly + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 601 + Prerequisites: vehicles.mcv, ~vehicles.td, ~techlevel.low IconPalette: chrometd - Description: Deploys into another Construction Yard.\n Unarmed + Description: Deploys into another Construction Yard. BuildDurationModifier: 50 + TooltipExtras: + Weaknesses: • Unarmed + Attributes: • Special Ability: Deploy into Construction Yard Valued: Cost: 3000 Tooltip: Name: Mobile Construction Vehicle Selectable: Priority: 4 - Bounds: 42,42 + Bounds: 1792, 1792 Health: HP: 75000 - Armor: - Type: Heavy Mobile: - Speed: 51 + Speed: 54 Locomotor: heavywheeled RevealsShroud: Range: 4c0 @@ -1925,31 +3171,44 @@ AMCV: Facing: 384 TransformSounds: placbldg.aud, build5.aud NoTransformNotification: BuildingCannotPlaceAudio + NoTransformTextNotification: Cannot deploy here. PauseOnCondition: empdisable || being-warped MustBeDestroyed: RequiredForShortGame: true BaseBuilding: + ProvidesPrerequisite@anymcv: + Prerequisite: anymcv SpawnActorOnDeath: Actor: AMCV.Husk RequiresCondition: !being-warped TransferTimedExternalConditionOnTransform: Condition: invulnerability + TransferTimedExternalConditionOnTransform@INVIS: + Condition: invisibility -Crushable: - Targetable: - TargetTypes: Ground, Vehicle, C4, ChaosImmune, MindControlImmune + Targetable@MindControlImmune: + TargetTypes: MindControlImmune + DamageTypeDamageMultiplier@A2GPROTECTION: + Modifier: 60 + Encyclopedia: + Category: GDI/Vehicles; Nod/Vehicles HMMV: Inherits: ^VehicleTD Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove Inherits@GAINSEXPERIENCE: ^GainsExperience - Inherits@BERSERK: ^Berserk + Inherits@UpgradeOverlay: ^UpgradeOverlay RenderSprites: Buildable: - Queue: Vehicle - BuildPaletteOrder: 22 + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 40 IconPalette: chrometd - Prerequisites: ~vehicles.hmmv, ~techlevel.low - Description: Fast scout & anti-infantry vehicle.\n Can detect spies and cloaked units.\n Strong vs Infantry\n Weak vs Vehicles, Buildings, Defenses, Aircraft + Prerequisites: ~vehicles.hmmv, ~!tow.upgrade, ~techlevel.low + Description: Fast scout & anti-infantry vehicle. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor + Weaknesses: • Weak vs Heavy Armor, Buildings, Defenses\n• Cannot attack Aircraft + Attributes: • Detects cloaked units and spies Valued: Cost: 400 Tooltip: @@ -1962,13 +3221,13 @@ HMMV: Type: Light Mobile: TurnSpeed: 40 - Speed: 126 + Speed: 144 RevealsShroud: - MinRange: 4c0 + MinRange: 6c0 Range: 8c0 RevealGeneratedShroud: False RevealsShroud@GAPGEN: - Range: 4c0 + Range: 6c0 Turreted: TurnSpeed: 40 Offset: -85,0,128 @@ -1976,33 +3235,107 @@ HMMV: Weapon: M60mgTD LocalOffset: 171,0,85 MuzzleSequence: muzzle + WithEjectedCasings: + CasingWeapon: BrassDebris + CasingSpawnLocalOffset: 0,-125,200 + CasingTargetOffset: 0, -500, 0 AttackTurreted: - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded WithMuzzleOverlay: WithSpriteTurret: IgnoresDisguise: DetectCloaked: Range: 6c0 - CloakTypes: Cloak, Thief + DetectionTypes: Cloak, AirCloak RequiresCondition: !(empdisable || being-warped) ProducibleWithLevel: Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded + GrantConditionOnPrerequisite@GSHIELD: + Condition: pointdef-upgrade + Prerequisites: pointdef.upgrade + TimedDamageMultiplier@GSHIELD: + ActiveCondition: gshield + ChargingColor: 008888 + DrainingColor: 00ffff + Modifier: 50 + Duration: 50 + ChargeTime: 750 + ActivateSound: gshieldup.aud + DeactivateSound: gshielddown.aud + RequiresCondition: pointdef-upgrade + WithIdleOverlay@NSHIELD: + Image: nshield-overlay-sm + RequiresCondition: (nshield || gshield) && !(empdisable || invulnerability || invisibility) + ReplacedInQueue: + Actors: hmmv.tow + Upgradeable@TOW: + Type: tow.upgrade + UpgradingCondition: upgrading + Actor: hmmv.tow + UpgradeAtActors: fix, rep, srep + BuildDuration: 200 + RequiresCondition: !mindcontrolled + Encyclopedia: + Category: GDI/Vehicles + +HMMV.TOW: + Inherits: HMMV + RenderSprites: + Image: hmmv + Buildable: + Description: Fast scout & anti-infantry vehicle with anti-tank missile launcher. + Prerequisites: ~vehicles.hmmv, ~tow.upgrade, ~techlevel.high + Valued: + Cost: 575 + Mobile: + Speed: 130 + Tooltip: + Name: TOW Hum-Vee + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor, Heavy Armor + Weaknesses: • Weak vs Defenses\n• Cannot attack Aircraft + Armament@SECONDARY: + Name: secondary + Weapon: TOW + LocalOffset: 250,100,150 + PauseOnCondition: !ammo + WithSpriteTurret: + Sequence: turrettow + AmmoPool: + Armaments: secondary + Ammo: 1 + AmmoCondition: ammo + ReloadAmmoPoolCA: + Delay: 200 # matches reload time of weapon + Count: 1 + ShowSelectionBar: true + SelectionBarColor: aaaaaa + -ReplacedInQueue: + -Upgradeable@TOW: + -WithDecoration@UpgradeOverlay: GDRN: Inherits: ^Vehicle Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove - Inherits@GAINSEXPERIENCE: ^GainsExperience - Inherits@BERSERK: ^Berserk Inherits@HACKABLE: ^Hackable + Inherits@UpgradeOverlay: ^UpgradeOverlay + Inherits@GAINSEXPERIENCE: ^GainsExperience RenderSprites: Buildable: - Queue: Vehicle - BuildPaletteOrder: 22 + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 41 IconPalette: chrome - Prerequisites: ~vehicles.arc, ~techlevel.low - Description: Fast scout & anti-tank vehicle.\n Can detect spies and cloaked units.\n Strong vs Vehicles\n Weak vs Infantry, Buildings, Defenses, Aircraft + Prerequisites: ~vehicles.arc, ~!tow.upgrade, ~techlevel.low + Description: Fast scout & anti-tank drone. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor, Buildings + Weaknesses: • Weak vs Infantry, Defenses\n• Cannot attack Aircraft + Attributes: • Detects cloaked units and spies\n• Immune to mind control\n• XP of losses reclaimed by replacements Valued: - Cost: 400 + Cost: 450 Tooltip: Name: Guardian Drone UpdatesPlayerStatistics: @@ -2013,14 +3346,14 @@ GDRN: Type: Light Mobile: TurnSpeed: 40 - Speed: 108 + Speed: 126 Voice: Move RevealsShroud: - MinRange: 4c0 - Range: 7c0 + MinRange: 6c0 + Range: 8c0 RevealGeneratedShroud: False RevealsShroud@GAPGEN: - Range: 4c0 + Range: 6c0 Turreted: TurnSpeed: 40 Offset: 0,0,0 @@ -2029,34 +3362,108 @@ GDRN: LocalOffset: 500,0,200 MuzzleSequence: muzzle AttackTurreted: - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded Voice: Attack WithMuzzleOverlay: WithSpriteTurret: Voiced: VoiceSet: RobotTankVoice - Targetable: - TargetTypes: Ground, Vehicle, C4, ChaosImmune, DriverKillImmune, MindControlImmune + Targetable@MindControlImmune: + TargetTypes: MindControlImmune + Targetable@ChaosImmune: + TargetTypes: ChaosImmune + Targetable@DriverKillImmune: + TargetTypes: DriverKillImmune IgnoresDisguise: DetectCloaked: Range: 6c0 - CloakTypes: Cloak, Thief + DetectionTypes: Cloak, AirCloak RequiresCondition: !(empdisable || being-warped) - ProducibleWithLevel: - Prerequisites: vehicles.upgraded + GrantConditionOnPrerequisite@GSHIELD: + Condition: pointdef-upgrade + Prerequisites: pointdef.upgrade + TimedDamageMultiplier@GSHIELD: + ActiveCondition: gshield + ChargingColor: 008888 + DrainingColor: 00FFFF61 + Modifier: 50 + Duration: 25 + ChargeTime: 750 + ActivateSound: gshieldup.aud + DeactivateSound: gshielddown.aud + RequiresCondition: pointdef-upgrade + WithIdleOverlay@NSHIELD: + Image: nshield-overlay-sm + RequiresCondition: (nshield || gshield) && !(empdisable || invulnerability || invisibility) + ReplacedInQueue: + Actors: gdrn.tow + Upgradeable@TOW: + Type: tow.upgrade + UpgradingCondition: upgrading + Actor: gdrn.tow + UpgradeAtActors: fix, rep, srep + BuildDuration: 200 + RequiresCondition: !mindcontrolled + ReclaimsExperience: + Sellable: + RequiresCondition: unit-sellable && !c4 && !being-warped + Encyclopedia: + Category: GDI/Vehicles + EncyclopediaExtras: + Subfaction: arc + +GDRN.TOW: + Inherits: GDRN + RenderSprites: + Image: gdrn + Buildable: + Prerequisites: ~vehicles.arc, ~tow.upgrade, ~techlevel.high + Valued: + Cost: 575 + Tooltip: + Name: TOW Guardian Drone + Mobile: + Speed: 118 + Armament@SECONDARY: + Name: secondary + Weapon: TOW + LocalOffset: 200,-150,250 + PauseOnCondition: !ammo + WithSpriteTurret: + Sequence: turrettow + AmmoPool: + Armaments: secondary + Ammo: 1 + AmmoCondition: ammo + ReloadAmmoPoolCA: + Delay: 200 # matches reload time of weapon + Count: 1 + ShowSelectionBar: true + SelectionBarColor: aaaaaa + Selectable: + Class: gdrn + ReclaimsExperience: + Type: gdrn + -ReplacedInQueue: + -Upgradeable@TOW: + -WithDecoration@UpgradeOverlay: BGGY: Inherits: ^VehicleTD Inherits@GAINSEXPERIENCE: ^GainsExperience Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove - Inherits@BERSERK: ^Berserk + Inherits@UpgradeOverlay: ^UpgradeOverlay RenderSprites: Buildable: - Queue: Vehicle - BuildPaletteOrder: 23 + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 50 IconPalette: chrometd - Prerequisites: ~vehicles.nod, ~techlevel.low - Description: Fast scout & anti-infantry vehicle.\n Can detect spies and cloaked units.\n Strong vs Infantry\n Weak vs Vehicles, Buildings, Defenses, Aircraft + Prerequisites: ~vehicles.nod, ~!rbug.upgrade, ~techlevel.low + Description: Fast scout & anti-infantry vehicle. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor + Weaknesses: • Weak vs Heavy Armor, Buildings, Defenses\n• Cannot attack Aircraft + Attributes: • Detects cloaked units and spies Valued: Cost: 350 Tooltip: @@ -2068,14 +3475,14 @@ BGGY: Armor: Type: Light Mobile: - Speed: 126 + Speed: 144 TurnSpeed: 40 RevealsShroud: - MinRange: 4c0 + MinRange: 6c0 Range: 8c0 RevealGeneratedShroud: False RevealsShroud@GAPGEN: - Range: 4c0 + Range: 6c0 Turreted: TurnSpeed: 40 Offset: -43,0,128 @@ -2083,24 +3490,230 @@ BGGY: Weapon: M60mgTD LocalOffset: 171,0,43 MuzzleSequence: muzzle + WithEjectedCasings: + CasingWeapon: BrassDebris + CasingSpawnLocalOffset: 0,-125,200 + CasingTargetOffset: 0, -500, 0 AttackTurreted: - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded WithMuzzleOverlay: WithSpriteTurret: IgnoresDisguise: DetectCloaked: Range: 6c0 - CloakTypes: Cloak, Thief + DetectionTypes: Cloak, AirCloak RequiresCondition: !(empdisable || being-warped) ProducibleWithLevel: Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded + GrantConditionOnPrerequisite@ZealBonus: + Condition: zeal-covenant + Prerequisites: zeal.covenant + SpeedMultiplier@ZealBonus: + Modifier: 115 + RequiresCondition: zeal-covenant + GrantConditionOnPrerequisite@BlackHandPlayer: + Condition: player-blackh + Prerequisites: player.blackh + GrantConditionOnPrerequisite@Decoy: + Condition: decoy-upgrade + Prerequisites: decoy.upgrade + AmmoPool@Decoy: + Name: decoyspawner + Armaments: decoyspawner + AmmoCondition: ammo + WithAmmoPipsDecoration@Decoy: + Position: BottomLeft + Margin: 4, 3 + RequiresSelection: true + RequiresCondition: decoy-upgrade + ReloadAmmoPoolCA@Decoy: + AmmoPool: decoyspawner + Delay: 1500 + ShowSelectionBar: true + SelectionBarColor: aaaaaa + SpawnActorAbility@Decoy: + Type: Decoy + Actors: ftnk.decoy, ftnk.decoy + SpawnSounds: decoyspawn.aud + TargetModifiedCursor: ability2 + Behavior: SpawnAtSelfAndMoveToTarget + RequiresCondition: !player-blackh && decoy-upgrade && ammo && !(empdisable || being-warped) + AmmoPool: decoyspawner + FaceTarget: true + SpawnActorAbility@BlackHandDecoy: + Type: BlackHandDecoy + Actors: hftk.decoy, hftk.decoy + SpawnSounds: decoyspawn.aud + TargetModifiedCursor: ability2 + Behavior: SpawnAtSelfAndMoveToTarget + RequiresCondition: player-blackh && decoy-upgrade && ammo && !(empdisable || being-warped) + AmmoPool: decoyspawner + FaceTarget: true + ReplacedInQueue: + Actors: rbug + Upgradeable@Raider: + Type: rbug.upgrade + UpgradingCondition: upgrading + Actor: rbug + UpgradeAtActors: fix, rep, srep + RequiresCondition: !mindcontrolled + Encyclopedia: + Category: Nod/Vehicles + +RBUG: + Inherits: BGGY + Inherits@HeavyArmor: ^HeavyArmor + Buildable: + Prerequisites: ~vehicles.nod, ~rbug.upgrade, ~techlevel.low + Tooltip: + Name: Raider Buggy + Valued: + Cost: 400 + Armament: + Weapon: RaiderBuggyLaser + MuzzleSequence: muzzle + MuzzlePalette: caneon + LocalOffset: 250,0,300 + Mobile: + Speed: 126 + TurnSpeed: 36 + Turreted: + TurnSpeed: 36 + Offset: -100,0,0 + -ReplacedInQueue: + -Upgradeable@Raider: + -WithDecoration@UpgradeOverlay: + -WithEjectedCasings: + EncyclopediaExtras: + AdditionalInfo: Requires Zeal Covenant. + +^DecoyUnit: + Inherits@selection: ^SelectableSupportUnit + GrantTimedCondition@Decoy: + Condition: active + Duration: 750 + WithFlashEffect@Flash: + Color: ffffff + Interval: 748 + KillsSelf: + RequiresCondition: !active + WithTextDecoration@Decoy: + Text: Decoy + ValidRelationships: Ally + Font: TinyBold + Position: Top + Margin: 0, 7 + TimedConditionBar@Decoy: + Condition: active + Color: ffffff + WithPalettedOverlay@Decoy: + Palette: decoy + ValidRelationships: Ally + Targetable@MindControlImmune: + TargetTypes: MindControlImmune + Targetable@DriverKillImmune: + TargetTypes: DriverKillImmune + Targetable@IronCurtainImmune: + TargetTypes: IronCurtainImmune + Targetable@ChronoshiftImmune: + TargetTypes: ChronoshiftImmune + SpawnActorOnDeath: + Actor: camera.decoy + +FTNK.Decoy: + Inherits: FTNK + Inherits@Decoy: ^DecoyUnit + RenderSprites: + Image: ftnk + Health: + HP: 50 + Mobile: + Locomotor: wheeled + Armament@PRIMARY: + Weapon: BigFlamerTD.Decoy + -Armament@FF: + FireWarheadsOnDeath: + Weapon: DecoyDespawn + EmptyWeapon: DecoyDespawn + -RequiresCondition: + -ActorLostNotification: + -Buildable: + -ProducibleWithLevel: + -WithProductionIconOverlay: + -RevealsShroud: + -RevealsShroud@GAPGEN: + -Repairable: + -Passenger: + -Berserkable@BERSERK: + -RejectsOrders@BERSERK: + -GivesExperienceCA: + -GrantConditionOnPrerequisite@GLOBALBOUNTY: + -GivesBountyCA: + -Targetable@REPAIR: + -GrantConditionOnHealingReceived@REPAIRCOOLDOWN: + -UpdatesPlayerStatistics: + -RevealOnDeath: + -Sellable: + -ExternalCondition@UNITSELL: + -MapEditorData: + -Encyclopedia: + +HFTK.Decoy: + Inherits: HFTK + Inherits@Decoy: ^DecoyUnit + RenderSprites: + Image: hftk + Armor: + Type: Light + Health: + HP: 50 + Mobile: + Locomotor: wheeled + Armament@PRIMARY: + Weapon: HeavyFlameTankFlamer.Decoy + Armament@PRIMARYUPG: + Weapon: HeavyFlameTankFlamer.UPG.Decoy + -Armament@FF: + -Armament@FFUPG: + FireWarheadsOnDeath: + Weapon: DecoyDespawn + EmptyWeapon: DecoyDespawn + -RequiresCondition: + -ActorLostNotification: + -Buildable: + -ProducibleWithLevel: + -WithProductionIconOverlay: + -RevealsShroud: + -RevealsShroud@GAPGEN: + -Repairable: + -Passenger: + -Berserkable@BERSERK: + -RejectsOrders@BERSERK: + -GivesExperienceCA: + -GrantConditionOnPrerequisite@GLOBALBOUNTY: + -GivesBountyCA: + -Targetable@REPAIR: + -GrantConditionOnHealingReceived@REPAIRCOOLDOWN: + -UpdatesPlayerStatistics: + -RevealOnDeath: + -Sellable: + -ExternalCondition@UNITSELL: + -MapEditorData: + -Encyclopedia: APC2: Inherits: ^TankTD + Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove Inherits@GAINSEXPERIENCE: ^GainsExperience - Inherits@BERSERK: ^Berserk Inherits@TRANSPORT: ^Transport + Inherits@NOUNLOADCHRONO: ^NoUnloadWhenChronoshifted Inherits@SLOWCRUSH: ^SlowedByCrushing + Inherits@UpgradeOverlay: ^UpgradeOverlay + Inherits@COMMANDOSKULL: ^CommandoSkull + Inherits@HeavyArmor: ^HeavyArmor RenderSprites: FactionImages: nod: apc2.nod @@ -2109,218 +3722,130 @@ APC2: marked: apc2.nod shadow: apc2.nod Buildable: - Queue: Vehicle - BuildPaletteOrder: 41 - Prerequisites: ~vehicles.td, ~!vulcan.upgrade, ~vehicles.apc2, infantry.any, ~techlevel.low + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 140 + Prerequisites: ~vehicles.td, ~!vulcan.upgrade, ~vehicles.apc2, ~techlevel.low IconPalette: chrometd - Description: Tough infantry transport.\n Strong vs Infantry\n Weak vs Tanks, Buildings, Defenses, Aircraft + Description: Tough infantry transport. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor + Weaknesses: • Weak vs Heavy Armor, Buildings, Defenses\n• Cannot attack Aircraft Valued: Cost: 600 Tooltip: Name: Armored Personnel Carrier - RequiresCondition: !vulcan-upgrade - Tooltip@UPG: - Name: Vulcan - RequiresCondition: vulcan-upgrade UpdatesPlayerStatistics: AddToArmyValue: true Health: HP: 30000 - Armor: - Type: Heavy Mobile: - Speed: 108 - PauseOnCondition: being-captured || empdisable || being-warped || notmobile || driver-dead - SpeedMultiplier@UPG: - Modifier: 90 - RequiresCondition: vulcan-upgrade + Speed: 126 RevealsShroud: MinRange: 4c0 Range: 5c0 RevealGeneratedShroud: False - RequiresCondition: !vulcan-upgrade - RevealsShroud@UPG: - MinRange: 4c0 - Range: 6c0 - RevealGeneratedShroud: False - RequiresCondition: vulcan-upgrade RevealsShroud@GAPGEN: Range: 4c0 Armament: Weapon: M60mgTD LocalOffset: 85,0,171 MuzzleSequence: muzzle - RequiresCondition: !vulcan-upgrade - Turret: null - Armament@GAT0: - Name: primary-upg - Weapon: MGatt.0 - LocalOffset: 220,0,350 - MuzzleSequence: muzzle - RequiresCondition: gattling == 0 && vulcan-upgrade - PauseOnCondition: engage-ground - ReloadingCondition: engage-air - Armament@GAT1: - Name: primary-upg - Weapon: MGatt.1 - LocalOffset: 220,0,350 - MuzzleSequence: muzzle - RequiresCondition: gattling == 1 && vulcan-upgrade - PauseOnCondition: engage-ground - ReloadingCondition: engage-air - Armament@GAT2: - Name: primary-upg - Weapon: MGatt.2 - LocalOffset: 220,0,350 - MuzzleSequence: muzzle - RequiresCondition: gattling == 2 && vulcan-upgrade - PauseOnCondition: engage-ground - ReloadingCondition: engage-air - Armament@GAT3: - Name: primary-upg - Weapon: MGatt.3 - LocalOffset: 220,0,350 - MuzzleSequence: muzzle - RequiresCondition: gattling == 3 && vulcan-upgrade - PauseOnCondition: engage-ground - ReloadingCondition: engage-air - Armament@GAT0G: - Name: secondary-upg - Weapon: MGatt.0G - LocalOffset: 321,0,85 - MuzzleSequence: muzzle - RequiresCondition: gattling-ground == 0 && vulcan-upgrade - PauseOnCondition: engage-air - ReloadingCondition: engage-ground - Armament@GAT1G: - Name: secondary-upg - Weapon: MGatt.1G - LocalOffset: 321,0,85 - MuzzleSequence: muzzle - RequiresCondition: gattling-ground == 1 && vulcan-upgrade - PauseOnCondition: engage-air - ReloadingCondition: engage-ground - Armament@GAT2G: - Name: secondary-upg - Weapon: MGatt.2G - LocalOffset: 321,0,85 - MuzzleSequence: muzzle - RequiresCondition: gattling-ground == 2 && vulcan-upgrade - ReloadingCondition: engage-ground - PauseOnCondition: engage-air - GrantConditionOnAttack: - ArmamentNames: primary-upg - Condition: gattling - RequiredShotsPerInstance: 1,6,12 - MaximumInstances: 3 - RevokeDelay: 40 - RevokeOnNewTarget: False - RevokeAll: True - GrantConditionOnAttack@GROUND: - ArmamentNames: secondary-upg - Condition: gattling-ground - RequiredShotsPerInstance: 1,6 - MaximumInstances: 2 - RevokeDelay: 40 - RevokeOnNewTarget: False - RevokeAll: True AttackFrontal: - Armaments: primary - PauseOnCondition: empdisable || being-warped - RequiresCondition: !vulcan-upgrade - AttackTurreted: - PauseOnCondition: empdisable || being-warped - Armaments: primary-upg, secondary-upg - RequiresCondition: vulcan-upgrade - Turreted: - TurnSpeed: 28 - Offset: 0,0,150 - RequiresCondition: vulcan-upgrade - WithSpriteTurret: - Sequence: turret2 - RequiresCondition: !gattling-ground && vulcan-upgrade - WithSpriteTurret@GROUND: - Sequence: turret2-ground - RequiresCondition: gattling-ground && vulcan-upgrade + PauseOnCondition: empdisable || being-warped || blinded + FacingTolerance: 0 WithMuzzleOverlay: Cargo: - Types: Infantry + Types: Infantry, Hacker MaxWeight: 5 LoadingCondition: notmobile LoadedCondition: cargo + PassengerConditions: + e7: loaded-cmdo + rmbo: loaded-cmdo + bori: loaded-cmdo + yuri: loaded-cmdo + mast: loaded-cmdo + WithCargoSounds: + EnterSounds: genter1a.aud + ExitSounds: gexit1a.aud + CargoBlocked: + RequiresCondition: mindcontrolled + WithDecoration@COMMANDOSKULL: + RequiresCondition: loaded-cmdo ProducibleWithLevel: Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded Capturable: RequiresCondition: !being-warped && !cargo Capturable@DRIVER_DEAD: RequiresCondition: driver-dead && !cargo - Targetable@DRIVERKILL: - RequiresCondition: !driver-dead && !cargo - GrantConditionOnPrerequisite@VULCAN: - Condition: vulcan-upgrade - Prerequisites: vulcan.upgrade - Berserkable@UPGRADING: - RequiresCondition: upgrading - GrantTimedCondition@UPGRADING: - RequiresCondition: vulcan-upgrade - Condition: upgrading - Duration: 1 - AutoTarget: - AttackAnythingCondition: stance-attackanything - AutoTargetPriority@DEFAULTAA: - ValidTargets: Infantry, Vehicle, Water, Underwater, Air, Defense - InvalidTargets: NoAutoTarget - RequiresCondition: (!stance-attackanything && !assault-move) && vulcan-upgrade - AutoTargetPriority@ATTACKANYTHINGAA: - ValidTargets: Infantry, Vehicle, Water, Underwater, Air, Structure, Defense - InvalidTargets: NoAutoTarget - RequiresCondition: (stance-attackanything || assault-move) && vulcan-upgrade - AutoTargetPriority@DEFAULTAAPRIO: - RequiresCondition: (!stance-attackanything && !assault-move) && vulcan-upgrade - ValidTargets: Air - InvalidTargets: NoAutoTarget - Priority: 10 - AutoTargetPriority@ATTACKANYTHINGAAPRIO: - RequiresCondition: (!stance-attackanything && !assault-move) && vulcan-upgrade - ValidTargets: Air - InvalidTargets: NoAutoTarget - Priority: 10 - AutoTargetPriority@DEFAULTG: - RequiresCondition: !stance-attackanything && !assault-move && !vulcan-upgrade - ValidTargets: Infantry, Vehicle, Water, Underwater, Defense - InvalidTargets: NoAutoTarget - AutoTargetPriority@ATTACKANYTHINGG: - RequiresCondition: (stance-attackanything || assault-move) && !vulcan-upgrade - ValidTargets: Infantry, Vehicle, Water, Underwater, Structure, Defense, Mine - InvalidTargets: NoAutoTarget - AttackMove: - AssaultMoveCondition: assault-move + Targetable@MindControlResistant: + TargetTypes: MindControlResistant + RequiresCondition: cargo + Targetable@MindControlImmune: + TargetTypes: MindControlImmune + RequiresCondition: loaded-cmdo Selectable: Class: apc + ReplacedInQueue: + Actors: vulc + Upgradeable@VULCAN: + Type: vulcan.upgrade + UpgradingCondition: upgrading + Actor: vulc + UpgradeAtActors: fix, rep, srep + RequiresCondition: !mindcontrolled + Encyclopedia: + Category: GDI/Vehicles + EncyclopediaExtras: + Name: APC + +APC2.Nod.Preview: + Inherits: APC2 + RenderSprites: + Image: apc2.nod + Buildable: + Queue: Encyclopedia + Encyclopedia: + Category: Nod/Vehicles + EncyclopediaExtras: + Subfaction: legion APC2.NODAI: Inherits: APC2 - Inherits: ^AIUNLOAD + Inherits@AIUNLOAD: ^AIUNLOAD Buildable: - Prerequisites: ~botplayer, ~vehicles.nod, ~!vulcan.upgrade, ~vehicles.apc2, infantry.any, ~techlevel.low + Prerequisites: ~botplayer, ~vehicles.nod, ~!vulcan.upgrade, ~vehicles.apc2, ~techlevel.low RenderSprites: Image: APC2 Cargo: - InitialUnits: N4,N4,N4,N4,N4 + InitialUnits: N1,N1,N1,N3,N4 + -ReplacedInQueue: + -Upgradeable@VULCAN: + -WithDecoration@UpgradeOverlay: + -Encyclopedia: APC2.GDIAI: Inherits: APC2 - Inherits: ^AIUNLOAD + Inherits@AIUNLOAD: ^AIUNLOAD Buildable: - Prerequisites: ~botplayer, ~vehicles.gdi, ~!vulcan.upgrade, ~vehicles.apc2, infantry.any, ~techlevel.low + Prerequisites: ~botplayer, ~vehicles.gdi, ~!vulcan.upgrade, ~vehicles.apc2, ~techlevel.low RenderSprites: Image: APC2 Cargo: - InitialUnits: N2,N2,N2,N2,N2 + InitialUnits: N1,N1,N1,N2,N3 + -ReplacedInQueue: + -Upgradeable@VULCAN: + -WithDecoration@UpgradeOverlay: + -Encyclopedia: APC2.Reinforce: Inherits: APC2 - Inherits: ^AIUNLOAD + Inherits@AIUNLOAD: ^AIUNLOAD + Selectable: + Class: apc2 RenderSprites: Image: APC2 -Buildable: @@ -2331,20 +3856,27 @@ APC2.Reinforce: UnloadOnCondition@UNLOAD: RequiresCondition: damage BotOnly: False + -Encyclopedia: VULC: Inherits: ^TankTD - Inherits@AUTOTARGET: ^AutoTargetAllAssaultMoveAntiAir + Inherits@AUTOTARGET: ^AutoTargetAllAssaultMovePrioritizeAir Inherits@GAINSEXPERIENCE: ^GainsExperience - Inherits@BERSERK: ^Berserk Inherits@TRANSPORT: ^Transport + Inherits@NOUNLOADCHRONO: ^NoUnloadWhenChronoshifted + Inherits@HeavyArmor: ^HeavyArmor Inherits@SLOWCRUSH: ^SlowedByCrushing + Inherits@A2GPROTECTION: ^AirToGroundProtection + Inherits@COMMANDOSKULL: ^CommandoSkull Buildable: - Queue: Vehicle - BuildPaletteOrder: 42 - Prerequisites: ~vehicles.gdi, ~vulcan.upgrade, infantry.any, ~techlevel.high + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 141 + Prerequisites: ~vehicles.gdi, ~vulcan.upgrade, ~techlevel.medium IconPalette: chrometd - Description: Tough infantry transport, armed with a powerful chain gun.\n Strong vs Aircraft, Light Armor, Infantry\n Weak vs Tanks, Buildings, Defenses + Description: Tough infantry transport, armed with a powerful chaingun. + TooltipExtras: + Strengths: • Strong vs Aircraft, Infantry, Light Armor + Weaknesses: • Weak vs Heavy Armor, Buildings, Defenses Valued: Cost: 800 Tooltip: @@ -2353,155 +3885,221 @@ VULC: AddToArmyValue: true Health: HP: 30000 - Armor: - Type: Heavy Mobile: - Speed: 90 - PauseOnCondition: being-captured || empdisable || being-warped || notmobile + Speed: 100 RevealsShroud: MinRange: 4c0 Range: 6c0 RevealGeneratedShroud: False RevealsShroud@GAPGEN: Range: 4c0 - Armament@GAT0: - Weapon: MGatt.0 + Armament@GAT: + Weapon: MGatt LocalOffset: 220,0,350 MuzzleSequence: muzzle - RequiresCondition: gattling == 0 - PauseOnCondition: engage-ground - ReloadingCondition: engage-air - Armament@GAT1: - Weapon: MGatt.1 - LocalOffset: 220,0,350 - MuzzleSequence: muzzle - RequiresCondition: gattling == 1 - PauseOnCondition: engage-ground - ReloadingCondition: engage-air + PauseOnCondition: reload-ground + ReloadingCondition: reload-air + RequiresCondition: gattling < 12 Armament@GAT2: - Weapon: MGatt.2 - LocalOffset: 220,0,350 - MuzzleSequence: muzzle - RequiresCondition: gattling == 2 - PauseOnCondition: engage-ground - ReloadingCondition: engage-air - Armament@GAT3: - Weapon: MGatt.3 + Weapon: MGatt LocalOffset: 220,0,350 - MuzzleSequence: muzzle - RequiresCondition: gattling == 3 - PauseOnCondition: engage-ground - ReloadingCondition: engage-air - Armament@GAT0G: - Name: secondary - Weapon: MGatt.0G - LocalOffset: 321,0,85 - MuzzleSequence: muzzle - RequiresCondition: gattling-ground == 0 - PauseOnCondition: engage-air - ReloadingCondition: engage-ground - Armament@GAT1G: + MuzzleSequence: muzzle-huge + PauseOnCondition: reload-ground + ReloadingCondition: reload-air + RequiresCondition: gattling >= 12 + Armament@GATG: Name: secondary - Weapon: MGatt.1G + Weapon: MGattG LocalOffset: 321,0,85 MuzzleSequence: muzzle - RequiresCondition: gattling-ground == 1 - PauseOnCondition: engage-air - ReloadingCondition: engage-ground - Armament@GAT2G: + PauseOnCondition: reload-air + ReloadingCondition: reload-ground + RequiresCondition: gattling-ground < 14 + Armament@GATG2: Name: secondary - Weapon: MGatt.2G + Weapon: MGattG LocalOffset: 321,0,85 - MuzzleSequence: muzzle - RequiresCondition: gattling-ground == 2 - ReloadingCondition: engage-ground - PauseOnCondition: engage-air + MuzzleSequence: muzzle-huge + PauseOnCondition: reload-air + ReloadingCondition: reload-ground + RequiresCondition: gattling-ground >= 14 + WithEjectedCasings: + CasingWeapon: BrassDebris + CasingSpawnLocalOffset: 0,-225,200 + CasingTargetOffset: 0, -600, 0 + FirepowerMultiplier@GAT1: + Modifier: 115 + RequiresCondition: (attacking-air && gattling >= 1 && gattling < 3) || (attacking-ground && gattling-ground >= 1 && gattling-ground < 5) + FirepowerMultiplier@GAT2: + Modifier: 130 + RequiresCondition: (attacking-air && gattling >= 3 && gattling < 7) || (attacking-ground && (gattling-ground >= 5 && (gattling-ground < 10 || !rank-elite))) + FirepowerMultiplier@GAT3: + Modifier: 145 + RequiresCondition: (attacking-air && gattling >= 7 || (attacking-ground && (gattling-ground >= 10 && rank-elite))) + AmbientSoundCA@ATTACKSOUNDINITIAL: + SoundFiles: vvullo1a.aud + RequiresCondition: (attacking-air && gattling < 2) || (attacking-ground && gattling-ground < 2) + AmbientSoundCA@ATTACKSOUND1: + SoundFiles: vvullo2a.aud, vvullo2b.aud, vvullo2c.aud + FinalSound: vvullo3a.aud + RequiresCondition: (attacking-air && gattling >= 2 && gattling < 6) || (attacking-ground && gattling-ground >= 2 && gattling-ground < 6) + AmbientSoundCA@ATTACKSOUND2: + InitialSound: vvullo4a.aud + SoundFiles: vvullo5a.aud, vvullo5b.aud + FinalSound: vvullo6a.aud + RequiresCondition: (attacking-air && gattling >= 6 && gattling < 12) || (attacking-ground && (gattling-ground >= 6 && (gattling-ground < 14 || !rank-elite))) + AmbientSoundCA@ATTACKSOUND3: + InitialSound: vvullo7a.aud + SoundFiles: vvullo8a.aud, vvullo8b.aud + FinalSound: vvullo9a.aud + RequiresCondition: (attacking-air && gattling >= 12 || (attacking-ground && (gattling-ground >= 14 && rank-elite))) + GrantConditionOnAttackCA@ATTACKING-AIR: + ArmamentNames: primary + Condition: attacking-air + RevokeDelay: 6 + GrantConditionOnAttackCA@ATTACKING-GROUND: + ArmamentNames: secondary + Condition: attacking-ground + RevokeDelay: 6 GrantConditionOnAttack: Condition: gattling - RequiredShotsPerInstance: 1,6,12 - MaximumInstances: 3 + MaximumInstances: 12 RevokeDelay: 40 RevokeOnNewTarget: False RevokeAll: True + RequiresCondition: !attacking-ground GrantConditionOnAttack@GROUND: ArmamentNames: secondary Condition: gattling-ground - RequiredShotsPerInstance: 1,6 - MaximumInstances: 2 + MaximumInstances: 14 RevokeDelay: 40 RevokeOnNewTarget: False RevokeAll: True + RequiresCondition: !attacking-air AttackTurreted: - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded Armaments: primary, secondary Turreted: TurnSpeed: 28 Offset: 0,0,150 WithMuzzleOverlay: WithSpriteTurret: - RequiresCondition: !gattling-ground + RequiresCondition: !attacking-ground WithSpriteTurret@GROUND: Sequence: turret-ground - RequiresCondition: gattling-ground + RequiresCondition: attacking-ground Cargo: - Types: Infantry + Types: Infantry, Hacker MaxWeight: 5 LoadingCondition: notmobile LoadedCondition: cargo + PassengerConditions: + e7: loaded-cmdo + rmbo: loaded-cmdo + bori: loaded-cmdo + yuri: loaded-cmdo + mast: loaded-cmdo + WithCargoSounds: + EnterSounds: genter1a.aud + ExitSounds: gexit1a.aud + CargoBlocked: + RequiresCondition: mindcontrolled + WithDecoration@COMMANDOSKULL: + RequiresCondition: loaded-cmdo ProducibleWithLevel: Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded Capturable: RequiresCondition: !being-warped && !cargo Capturable@DRIVER_DEAD: RequiresCondition: driver-dead && !cargo - Targetable@DRIVERKILL: - RequiresCondition: !driver-dead && !cargo - Selectable: - Class: apc + Targetable@MindControlResistant: + TargetTypes: MindControlResistant + RequiresCondition: cargo + Targetable@MindControlImmune: + TargetTypes: MindControlImmune + RequiresCondition: loaded-cmdo + Encyclopedia: + Category: GDI/Vehicles + EncyclopediaExtras: + Name: Vulcan VULC.AI: Inherits: VULC - Inherits: ^AIUNLOAD + Inherits@AIUNLOAD: ^AIUNLOAD RenderSprites: Image: VULC Buildable: - Prerequisites: ~botplayer, ~vehicles.gdi, ~vulcan.upgrade, infantry.any, ~techlevel.high + Prerequisites: ~botplayer, ~vehicles.gdi, ~vulcan.upgrade, ~techlevel.medium + Cargo: + InitialUnits: N1,N1,N1,N2,N3 + WithCargoSounds: + -EnterSounds: + -Encyclopedia: + +VULC.Reinforce: + Inherits: VULC + Inherits@AIUNLOAD: ^AIUNLOAD + Selectable: + Class: vulc + RenderSprites: + Image: vulc + -Buildable: Cargo: - InitialUnits: N2,N2,N2,N2,N2 + InitialUnits: N1,N1,N2,N3,N3 + GrantConditionOnDamageState@UNLOAD: + Condition: damage + UnloadOnCondition@UNLOAD: + RequiresCondition: damage + BotOnly: False + -Encyclopedia: LTNK: Inherits: ^TankTD Inherits@GAINSEXPERIENCE: ^GainsExperience Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove - Inherits@BERSERK: ^Berserk - Inherits@SLOWCRUSH: ^SlowedByCrushing + Inherits@SLOWCRUSH: ^SlightlySlowedByCrushing + Inherits@TANKBUSTERVULN: ^TankBusterVulnerability + Inherits@HeavyArmor: ^HeavyArmor RenderSprites: Buildable: - Queue: Vehicle - BuildPaletteOrder: 60 + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 100 IconPalette: chrometd - Prerequisites: ~vehicles.ltnk, ~techlevel.low - Description: Fast, light tank.\n Strong vs Light Armor\n Weak vs Infantry, Defenses, Aircraft\n Special Ability: Amphibious + Prerequisites: ~vehicles.ltnk, ~!lastnk.upgrade, ~techlevel.low + Description: Standard front-line tank. + TooltipExtras: + Strengths: • Strong vs Light Armor + Weaknesses: • Weak vs Infantry, Defenses\n• Cannot attack Aircraft + Attributes: • Amphibious + RequiresCondition: !lastnk-upgrade + TooltipExtras@LaserTank: + Strengths: • Strong vs Light Armor, Infantry + Weaknesses: • Weak vs Defenses\n• Cannot attack Aircraft + Attributes: • Amphibious + RequiresCondition: lastnk-upgrade Valued: Cost: 700 Tooltip: Name: Light Tank + RequiresCondition: !lastnk-upgrade + Tooltip@LaserTank: + Name: Laser Light Tank + RequiresCondition: lastnk-upgrade UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 41250 - Armor: - Type: Heavy + HP: 37000 Mobile: Locomotor: Amphibious - Speed: 90 - GrantConditionOnTerrain: + Speed: 76 + GrantConditionOnTerrain@ONWATER: TerrainTypes: Water Condition: onwater - Targetable: - RequiresCondition: !onwater && !parachute && !being-warped Targetable@WATER: - TargetTypes: Ground, Vehicle, Water, Ship + TargetTypes: Water, Ship RequiresCondition: onwater && (!parachute && !being-warped) WithFacingSpriteBody: RequiresCondition: !onwater || parachute @@ -2511,7 +4109,7 @@ LTNK: RequiresCondition: onwater && !parachute RevealsShroud: MinRange: 4c0 - Range: 5c0 + Range: 6c0 RevealGeneratedShroud: False RevealsShroud@GAPGEN: Range: 4c0 @@ -2523,22 +4121,72 @@ LTNK: RecoilRecovery: 17 LocalOffset: 720,0,90 MuzzleSequence: muzzle + RequiresCondition: !lastnk-upgrade + Armament@UPG: + Weapon: LightTankLaser + Recoil: 85 + RecoilRecovery: 17 + LocalOffset: 620,0,90 + MuzzleSequence: muzzlelas + MuzzlePalette: caneon + RequiresCondition: lastnk-upgrade AttackTurreted: - PauseOnCondition: empdisable || being-warped || parachute + PauseOnCondition: empdisable || being-warped || blinded || parachute WithMuzzleOverlay: WithSpriteTurret: + RequiresCondition: !lastnk-upgrade + WithSpriteTurret@LaserTank: + Sequence: turretlas + RequiresCondition: lastnk-upgrade SpawnActorOnDeath: Actor: LTNK.Husk RequiresCondition: !onwater && !being-warped ProducibleWithLevel: Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded + GrantConditionOnPrerequisite@LaserTank: + Condition: lastnk-upgrade + Prerequisites: lastnk.upgrade + ReplacedInQueue: + Actors: ltnk.laser + Encyclopedia: + Category: Nod/Vehicles + +LTNK.Laser: + Inherits: LTNK + RenderSprites: + Image: ltnk + Buildable: + Prerequisites: ~vehicles.ltnk, ~lastnk.upgrade, ~techlevel.low + -Tooltip: + Tooltip@LaserTank: + -RequiresCondition: + -TooltipExtras: + TooltipExtras@LaserTank: + -RequiresCondition: + -GrantConditionOnPrerequisite@LaserTank: + -Armament: + Armament@UPG: + -RequiresCondition: + -WithSpriteTurret: + WithSpriteTurret@LaserTank: + -RequiresCondition: + Selectable: + Class: ltnk + -ReplacedInQueue: + EncyclopediaExtras: + VariantOf: LTNK MTNK: Inherits: ^TankTD Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove Inherits@GAINSEXPERIENCE: ^GainsExperience - Inherits@BERSERK: ^Berserk Inherits@SLOWCRUSH: ^SlightlySlowedByCrushing + Inherits@HeavyArmor: ^HeavyArmor + Inherits@TANKBUSTERVULN: ^TankBusterVulnerability + Inherits@UpgradeOverlay: ^UpgradeOverlay RenderSprites: FactionImages: nod: mtnk.nod @@ -2547,29 +4195,35 @@ MTNK: marked: mtnk.nod shadow: mtnk.nod Buildable: - Queue: Vehicle - BuildPaletteOrder: 80 - Prerequisites: ~!drone.upgrade, ~vehicles.td, ~vehicles.mtnk, ~techlevel.low + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 90 + Prerequisites: ~!bdrone.upgrade, ~!lastnk.upgrade, ~vehicles.mtnk, ~techlevel.low IconPalette: chrometd - Description: Main battle tank.\n Strong vs Vehicles\n Weak vs Infantry, Defenses, Aircraft + Description: Main battle tank. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor + Weaknesses: • Weak vs Infantry, Defenses\n• Cannot attack Aircraft + RequiresCondition: !lastnk-upgrade + TooltipExtras@LaserTank: + Strengths: • Strong vs Light Armor, Infantry + Weaknesses: • Weak vs Defenses\n• Cannot attack Aircraft + RequiresCondition: lastnk-upgrade Valued: Cost: 900 Tooltip: Name: Battle Tank GenericName: Tank - RequiresCondition: !drone-upgrade - Tooltip@UPG: - Name: Battle Drone (Crewed) + RequiresCondition: !lastnk-upgrade + Tooltip@LaserTank: + Name: Laser Battle Tank GenericName: Tank - RequiresCondition: drone-upgrade + RequiresCondition: lastnk-upgrade UpdatesPlayerStatistics: AddToArmyValue: true Health: HP: 52000 - Armor: - Type: Heavy Mobile: - Speed: 66 + Speed: 72 RevealsShroud: MinRange: 4c0 Range: 6c0 @@ -2589,148 +4243,262 @@ MTNK: RecoilRecovery: 26 LocalOffset: 768,0,90 MuzzleSequence: muzzle + RequiresCondition: !lastnk-upgrade + Armament@UPG: + Weapon: BattleTankLaser + Recoil: 128 + RecoilRecovery: 26 + LocalOffset: 720,0,90 + MuzzleSequence: muzzlelas + MuzzlePalette: caneon + RequiresCondition: lastnk-upgrade Armament@SECONDARY: Name: secondary Turret: secondary Weapon: PointLaser LocalOffset: 0,10,90 - PauseOnCondition: empdisable || being-warped - RequiresCondition: pointlaser-upgrade && !drone-upgrade + PauseOnCondition: empdisable || being-warped || pointlaser-charging + RequiresCondition: pointdef-upgrade ForceTargetRelationships: Enemy AttackTurreted: Turrets: primary, secondary - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded WithMuzzleOverlay: WithSpriteTurret@default: - RequiresCondition: !pointlaser-upgrade && !drone-upgrade - WithSpriteTurret@UPG: - Sequence: turret2 - RequiresCondition: !pointlaser-upgrade && drone-upgrade + RequiresCondition: !pointdef-upgrade && !lastnk-upgrade WithSpriteTurret@pointlaser: Sequence: turretpd - RequiresCondition: pointlaser-upgrade + RequiresCondition: pointdef-upgrade + WithSpriteTurret@LaserTank: + Sequence: turretlas + RequiresCondition: lastnk-upgrade SpawnActorOnDeath: Actor: MTNK.Husk - RequiresCondition: !being-warped && !drone-upgrade - SpawnActorOnDeath@UPG: - Actor: MTNK.Drone.Husk - RequiresCondition: !being-warped && drone-upgrade + RequiresCondition: !being-warped ProducibleWithLevel: Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded Selectable: - DecorationBounds: 28,28 + DecorationBounds: 1194, 1194 PointDefense: Armament: secondary PointDefenseTypes: Missile - RequiresCondition: pointlaser-upgrade + RequiresCondition: pointdef-upgrade && !gshield && !gshield-charging ValidRelationships: Enemy - GrantConditionOnPrerequisite@POINTL: - Condition: pointlaser-upgrade - Prerequisites: pointlaser.upgrade - GrantConditionOnPrerequisite@DRONE: - Condition: drone-upgrade - Prerequisites: drone.upgrade - Transforms: - IntoActor: mtnk.drone - TransformSounds: ggarenta.aud, ggarentb.aud, ggarentc.aud - RequiresCondition: drone-upgrade - EjectOnTransform: - PilotActor: N1 - RequiresCondition: drone-upgrade + GrantTimedConditionOnPointDefenseHit@POINTDEF: + Condition: pointlaser-charging + RequiresCondition: pointdef-upgrade + ScaleChargeTimeWithDamageAmount: 21 + GrantConditionOnPrerequisite@POINTDEF: + Condition: pointdef-upgrade + Prerequisites: pointdef.upgrade + GrantConditionOnPrerequisite@LaserTank: + Condition: lastnk-upgrade + Prerequisites: lastnk.upgrade + TimedDamageMultiplier@GSHIELD: + ActiveCondition: gshield + ChargingCondition: gshield-charging + ShowSelectionBar: false + Modifier: 25 + Duration: 2 + ScaleChargeTimeWithDamage: true + ScaleChargeTimeWithDamageAmount: 21 + PauseOnCondition: pointlaser-charging + RequiresCondition: pointdef-upgrade + GrantTimedCondition@NSHIELDVISUAL: + Condition: gshieldvisual + RequiresCondition: gshield + Duration: 8 + ForceFullDuration: true + WithIdleOverlay@NSHIELD: + RequiresCondition: (nshield || gshieldvisual) && !(empdisable || invulnerability || invisibility) + ReplacedInQueue: + Actors: mtnk.drone, mtnk.laser + Upgradeable@BDRONE: + Type: bdrone.upgrade + UpgradingCondition: upgrading + Actor: mtnk.drone + UpgradeAtActors: fix, rep, srep + BuildDuration: 100 + RequiresCondition: !mindcontrolled + Encyclopedia: + Category: GDI/Vehicles MTNK.Drone: - Inherits: ^TankTD - Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove - Inherits@GAINSEXPERIENCE: ^GainsExperience + Inherits: MTNK Inherits@IDISABLE: ^DisabledByRadarLoss - Inherits@SLOWCRUSH: ^SlightlySlowedByCrushing Inherits@HACKABLE: ^Hackable RenderSprites: Image: drone + -FactionImages: Buildable: - Queue: Vehicle - BuildPaletteOrder: 81 - Prerequisites: ~drone.upgrade, ~vehicles.arc, ~techlevel.low + Queue: VehicleSQ, VehicleMQ + Prerequisites: ~bdrone.upgrade, ~vehicles.mtnk, ~techlevel.high IconPalette: chrometd - Description: Remotely piloted battle tank.\n Requires active radar communication.\n Strong vs Vehicles\n Weak vs Infantry, Defenses, Aircraft + Description: Remotely piloted battle tank. + BuildPaletteOrder: 91 + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor + Weaknesses: • Weak vs Infantry, Defenses\n• Cannot attack Aircraft + Attributes: • Self repairs to 50% out of combat\n• Immune to mind control\n• Requires active radar communication\n• XP of losses reclaimed by replacements + -RequiresCondition: + -Tooltip@LaserTank: + -TooltipExtras@LaserTank: Valued: - Cost: 775 + Cost: 600 + Health: + HP: 40000 Tooltip: Name: Battle Drone - GenericName: Tank - UpdatesPlayerStatistics: - AddToArmyValue: true - Health: - HP: 52000 - Armor: - Type: Heavy + -RequiresCondition: Mobile: - Speed: 66 - PauseOnCondition: !radarenabled || empdisable || being-warped || notmobile - RevealsShroud: - MinRange: 4c0 - Range: 6c0 - RevealGeneratedShroud: False - RevealsShroud@GAPGEN: - Range: 4c0 + PauseOnCondition: !radarenabled || being-captured || empdisable || being-warped || driver-dead || notmobile + Voice: Move + Passenger: + Voice: Move Turreted: - TurnSpeed: 20 Offset: 0,0,20 Armament: - Weapon: 120mm - Recoil: 128 - RecoilRecovery: 26 - LocalOffset: 768,0,90 - MuzzleSequence: muzzle + Weapon: 120mm.Drone AttackTurreted: - Turrets: primary - PauseOnCondition: !radarenabled || empdisable || being-warped - WithMuzzleOverlay: - WithSpriteTurret: + PauseOnCondition: !radarenabled || empdisable || being-warped || blinded + Voice: Attack + AttackMove: + Voice: Attack SpawnActorOnDeath: Actor: MTNK.Drone.Husk - RequiresCondition: !being-warped - ProducibleWithLevel: - Prerequisites: vehicles.upgraded - Selectable: - DecorationBounds: 28,28 Voiced: VoiceSet: DroneVoice - Targetable: - TargetTypes: Ground, Vehicle, C4, ChaosImmune, DriverKillImmune, MindControlImmune - -CaptureManager: + RequiresCondition: radarenabled && !empdisable + Voiced@OFFLINE: + VoiceSet: OfflineDroneVoice + RequiresCondition: !radarenabled || empdisable + Targetable@MindControlImmune: + TargetTypes: MindControlImmune + Targetable@ChaosImmune: + TargetTypes: ChaosImmune + ChangesHealth: + PercentageStep: 1 + Delay: 25 + StartIfBelow: 50 + DamageCooldown: 150 + RequiresCondition: !mdrn-attached + -Armament@UPG: + -WithSpriteTurret@LaserTank: + WithSpriteTurret@default: + RequiresCondition: !pointdef-upgrade -Capturable: - -CaptureNotification: - -Capturable@DRIVER_DEAD: - -GrantConditionIfOwnerIsNeutral: - -ChangesHealth@DRIVER_DEAD: - -Targetable@DRIVERKILL: - -Targetable@DRIVERKILLLOWHP: - -GrantConditionOnDamageState@DRIVERKILLLOWHP: - -Targetable@AICAPTURE: + -SpeedMultiplier@BERSERK: + -ReloadDelayMultiplier@BERSERK: + -ExternalCondition@BERSERK: + -Berserkable@BERSERK: + -WithPalettedOverlay@BERSERK: + -TimedConditionBar@BERSERK: + -RejectsOrders@BERSERK: + -GrantCondition@BERSERK: + -ReplacedInQueue: + -Upgradeable@BDRONE: + -WithDecoration@UpgradeOverlay: + -ProducibleWithLevel: + -WithProductionIconOverlay: + Selectable: + Class: mtnk + Sellable: + RequiresCondition: unit-sellable && !c4 && !being-warped + ReclaimsExperience: + Encyclopedia: + Category: GDI/Vehicles + EncyclopediaExtras: + Subfaction: arc + +MTNK.Nod.Preview: + Inherits: MTNK + RenderSprites: + Image: mtnk.nod + Buildable: + Queue: Encyclopedia + BuildPaletteOrder: 101 + Encyclopedia: + Category: Nod/Vehicles + EncyclopediaExtras: + Subfaction: legion + +MTNK.Laser: + Inherits: MTNK + RenderSprites: + Image: mtnk + Buildable: + Prerequisites: ~vehicles.mtnk, ~lastnk.upgrade, ~techlevel.low + -Tooltip: + Tooltip@LaserTank: + -RequiresCondition: + -TooltipExtras: + TooltipExtras@LaserTank: + -RequiresCondition: + -GrantConditionOnPrerequisite@POINTDEF: + -GrantConditionOnPrerequisite@LaserTank: + -PointDefense: + -GrantTimedConditionOnPointDefenseHit@POINTDEF: + -TimedDamageMultiplier@GSHIELD: + -GrantTimedCondition@NSHIELDVISUAL: + WithIdleOverlay@NSHIELD: + RequiresCondition: nshield && !(empdisable || invulnerability || invisibility) + -Armament: + -Armament@SECONDARY: + Armament@UPG: + -RequiresCondition: + -WithSpriteTurret@default: + -WithSpriteTurret@pointlaser: + -WithDecoration@UpgradeOverlay: + WithSpriteTurret@LaserTank: + -RequiresCondition: + Selectable: + Class: mtnk + -ReplacedInQueue: + -Upgradeable@BDRONE: + Encyclopedia: + Category: Nod/Vehicles + EncyclopediaExtras: + Subfaction: legion + VariantOf: MTNK.Nod.Preview MDRN: Inherits: ^Vehicle Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove - Inherits@IDISABLE: ^DisableOnLowPower Inherits@HACKABLE: ^Hackable + Inherits@GAINSEXPERIENCE: ^GainsExperience Tooltip: Name: Mini Drone Buildable: - Queue: Vehicle - BuildPaletteOrder: 105 - Prerequisites: anyradar, ~vehicles.arc, ~techlevel.low - Description: Hovering drone with machine gun.\n Attaches to certain vehicles to provide support and repairs.\n Strong vs Infantry\n Weak vs Vehicles, Buildings, Aircraft + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 192 + Prerequisites: anyradar, ~vehicles.arc, ~techlevel.medium + Description: Hovering drone with machine gun. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor + Weaknesses: • Weak vs Heavy Armor, Buildings, Defenses\n• Cannot attack Aircraft + Attributes: • Attaches to vehicles to provide support and repairs\n• Immune to mind control\n• XP of losses reclaimed by replacements Valued: - Cost: 300 + Cost: 225 UpdatesPlayerStatistics: AddToArmyValue: true Selectable: - DecorationBounds: 16, 16, 0, -8 + DecorationBounds: 682, 682, 0, -341 Health: - HP: 10000 + HP: 13000 Armor: Type: Light + HitShape: + Type: Circle + Radius: 128 + DamageTypeDamageMultiplier@FLAKARMOR: + DamageTypes: FlakVestMitigated + Modifier: 60 + DamageTypeDamageMultiplier@FLAKARMORMINOR: + DamageTypes: FlakVestMitigatedMinor + Modifier: 80 RevealsShroud: MinRange: 4c0 Range: 5c0 @@ -2738,18 +4506,19 @@ MDRN: RevealsShroud@GAPGEN: Range: 4c0 Mobile: - Speed: 80 - TurnSpeed: 255 - Locomotor: foot + Speed: 126 + TurnSpeed: 512 + Locomotor: seal Voice: Move - PauseOnCondition: disabled || empdisable || being-warped || notmobile + PauseOnCondition: being-captured || empdisable || being-warped || driver-dead + ResponsiveBetweenCells: true Voiced: - VoiceSet: RobotTankVoice + VoiceSet: MiniDroneVoice Armament@PRIMARY: Weapon: M60mgMD LocalOffset: 72,0,72 MuzzleSequence: muzzle - PauseOnCondition: disabled || empdisable || being-warped + PauseOnCondition: empdisable || being-warped WithMuzzleOverlay: Hovers: BobDistance: -35 @@ -2757,97 +4526,142 @@ MDRN: WithShadow: Offset: 43, 128, -250 ZOffset: -129 + RequiresCondition: !invisibility TurretedFloating: TurnSpeed: 18 - Turreted@SECONDARY: - Turret: secondary - Offset: 0,0,72 - TurnSpeed: 512 AttackTurreted: - PauseOnCondition: empdisable || being-warped - Turrets: primary, secondary + PauseOnCondition: empdisable || being-warped || blinded + Turrets: primary Voice: Attack WithSpriteTurret: - Targetable: - TargetTypes: Ground, Vehicle, C4, ChaosImmune, DriverKillImmune, MindControlImmune - Power: - Amount: -1 - RequiresCondition: !being-warped - WithDecoration@DISABLED: - Image: poweroff - Sequence: offline - Palette: chrome - RequiresCondition: disabled - Position: Center - ProximityExternalCondition@POWERSOUND: - Condition: disablesound - RequiresCondition: disabled || empdisable - AffectsParent: True - Range: 1c0 - EnableSound: vrobon - DisableSound: vroboff - -WithDamageOverlay: - -CaptureManager: + Targetable@MindControlImmune: + TargetTypes: MindControlImmune + Targetable@ChaosImmune: + TargetTypes: ChaosImmune + Targetable@DriverKillImmune: + TargetTypes: DriverKillImmune -Capturable: - -CaptureNotification: - -Capturable@DRIVER_DEAD: - -GrantConditionIfOwnerIsNeutral: - -ChangesHealth@DRIVER_DEAD: - -Targetable@DRIVERKILL: - -Targetable@DRIVERKILLLOWHP: - -GrantConditionOnDamageState@DRIVERKILLLOWHP: - -Targetable@AICAPTURE: - -InfiltrateToAttach@MINIDRONE: + -WithDamageOverlay: -Targetable@MINIDRONE: -ChangesHealth@MINIDRONE: - -ExternalCondition@MINIDRONE: - AttachableTo: - -Limits: - -LimitConditions: + -AttachableTo@MINIDRONE: Attachable: - AttachableType: mdrn - Infiltrates: - Types: MiniDroneAttachable + Type: MiniDrone + TargetTypes: MiniDroneAttachable ValidRelationships: Ally + MinAttachDistance: 1c512 + OnAttachTransformInto: mdrn.attached + AttachSound: mdrn-attach.aud + -Carryable: + -GrantCondition@CarriedImmobile: + WithIdleOverlay@NSHIELD: + Image: nshield-overlay-sm + FireWarheadsOnDeath: + Weapon: VisualExplodeSmall + EmptyWeapon: VisualExplodeSmall + ReclaimsExperience: + Sellable: + RequiresCondition: unit-sellable && !c4 && !being-warped + Encyclopedia: + Category: GDI/Vehicles + EncyclopediaExtras: + Subfaction: arc MDRN.Attached: Inherits: MDRN -Buildable: - -Infiltrates: -Selectable: -Tooltip: Interactable: + Bounds: 64,64 RenderSprites: Image: mdrn - Mobile: - Locomotor: cloud - ImmovableCondition: attached - GrantCondition: - Condition: attached + -Mobile: + AttachedAircraft: + TurnSpeed: 18 + Speed: 0 + CanHover: true + Repulsable: false + CruiseAltitude: 1 + LandableTerrainTypes: Clear,Road,Rough,Ore,Gems,Tiberium,BlueTiberium,BlackTiberium,Water,Tree,River,Rock,Beach,Bridge,Tunnel,Wall,Ford + RevealsShroud: + Type: GroundPosition + RevealsShroud@GAPGEN: + Type: GroundPosition + HiddenUnderFog: + Type: GroundPosition WithSpriteTurret: Sequence: turret-attached - TurnOnIdle: + TurnOnIdleCA: MinDelay: 25 MaxDelay: 75 + TurnWhileAircraftPaused: true Armament@PRIMARY: - Weapon: M60mgTD + Weapon: M60mgMD.Attached LocalOffset: -500,0,72 - -WithDecoration@DISABLED: + DamageMultiplier@ATTACHED: + Modifier: 10 Attachable: - AttachedCondition: attached + OnDetachBehavior: Transform + OnDetachTransformInto: mdrn + ChangesHealth: + PercentageStep: 2 + Delay: 25 + StartIfBelow: 100 + DamageCooldown: 50 + CaptureManager: + -BeingCapturedCondition: + ReclaimsExperience: + Type: mdrn + Cloak@NORMAL: + InitialDelay: 0 + CloakDelay: 0 + CloakStyle: Palette + CloakedPalette: cloak + IsPlayerPalette: false + UncloakOn: Attack, Unload, Infiltrate, Demolish, Dock, Damage, Heal + RequiresCondition: inherited-cloak + Cloak@CRATE-CLOAK: + RequiresCondition: crate-cloak && !(cloak-force-disabled || invisibility || inherited-cloak) + ExternalCondition@CLOAK: + Condition: inherited-cloak + -Targetable@HACKABLE: + -MindControllable@HACKABLE: + -MindControllableProgressBar@HACKABLE: + -WithDecoration@HACKED: + -WithDecoration@RESTORING: + -PowerMultiplier@HACKED: + -ChronoshiftableCA: + -HealthCapDamageMultiplier@CHRONO: + -Encyclopedia: + -GrantConditionOnPrerequisite@NODRANK: + -GrantConditionOnPrerequisite@SCRINRANK: + -WithDecoration@RANK-1: + -WithDecoration@RANK-2: + -WithDecoration@RANK-ELITE: + -WithDecoration@NODRANK-1: + -WithDecoration@NODRANK-2: + -WithDecoration@NODRANK-ELITE: + -WithDecoration@SCRINRANK-1: + -WithDecoration@SCRINRANK-2: + -WithDecoration@SCRINRANK-ELITE: HTNK: Inherits: ^TankTD Inherits@GAINSEXPERIENCE: ^GainsExperience - Inherits@AUTOTARGET: ^AutoTargetAllAssaultMove - Inherits@BERSERK: ^Berserk - RenderSprites: + Inherits@AUTOTARGET: ^AutoTargetAllAssaultMovePrioritizeGround + Inherits@HeavyArmor: ^HeavyArmor + Inherits@TANKBUSTERVULN: ^TankBusterVulnerability + Inherits@UpgradeOverlay: ^UpgradeOverlay Buildable: - Queue: Vehicle - BuildPaletteOrder: 300 + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 253 IconPalette: chrometd - Prerequisites: gtek, ~vehicles.htnk, ~!ionmam.upgrade, ~!hovermam.upgrade, ~techlevel.high - Description: Big and slow tank with anti-air capability.\n Can crush concrete walls.\n Strong vs Vehicles, Infantry\n Weak vs Nothing + Prerequisites: ~!mdrone.upgrade, gtek, ~vehicles.htnk, ~!ionmam.upgrade, ~!hovermam.upgrade, ~techlevel.high + Description: Big and slow tank with anti-air capability. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor, Infantry + Attributes: • Can crush concrete walls\n• Self repairs to 50% out of combat Valued: Cost: 1700 Tooltip: @@ -2856,14 +4670,14 @@ HTNK: UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 82000 - Armor: - Type: Heavy + HP: 95000 Mobile: - Speed: 42 + Speed: 44 Locomotor: heavytracked + Voice: Move Passenger: Weight: 2 + Voice: Move RevealsShroud: MinRange: 4c0 Range: 6c0 @@ -2871,7 +4685,7 @@ HTNK: RevealsShroud@GAPGEN: Range: 4c0 Turreted: - TurnSpeed: 8 + TurnSpeed: 12 Armament@PRIMARY: Weapon: 130mmTD LocalOffset: 900,180,340, 900,-180,340 @@ -2886,7 +4700,12 @@ HTNK: Recoil: 43 MuzzleSequence: muzzle AttackTurreted: - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded + Voice: Attack + AttackMove: + Voice: Attack + Voiced: + VoiceSet: MammothVoice WithMuzzleOverlay: WithSpriteTurret: SpawnActorOnDeath: @@ -2899,80 +4718,62 @@ HTNK: DamageCooldown: 150 ProducibleWithLevel: Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded Selectable: - DecorationBounds: 44,38,0,-4 + DecorationBounds: 1877, 1621, 0, -170 Carryable: LocalOffset: 0,0,500 -Crushable: + WithIdleOverlay@MINDCONTROL: + Offset: 0,0,512 + ReplacedInQueue: + Actors: htnk.drone, htnk.ion, htnk.hover + Upgradeable@ION: + Type: ionmam.upgrade + UpgradingCondition: upgrading + Actor: htnk.ion + UpgradeAtActors: fix, rep, srep + BuildDuration: 100 + RequiresCondition: !mindcontrolled + Upgradeable@HOVER: + Type: hovermam.upgrade + UpgradingCondition: upgrading + Actor: htnk.hover + UpgradeAtActors: fix, rep, srep + BuildDuration: 100 + RequiresCondition: !mindcontrolled + Upgradeable@DRONE: + Type: mdrone.upgrade + UpgradingCondition: upgrading + Actor: htnk.drone + UpgradeAtActors: fix, rep, srep + BuildDuration: 100 + RequiresCondition: !mindcontrolled + Encyclopedia: + Category: GDI/Vehicles HTNK.Ion: - Inherits: ^TankTD - Inherits@GAINSEXPERIENCE: ^GainsExperience - Inherits@AUTOTARGET: ^AutoTargetAllAssaultMove - Inherits@BERSERK: ^Berserk - RenderSprites: + Inherits: HTNK Buildable: - Queue: Vehicle - BuildPaletteOrder: 301 - IconPalette: chrometd + BuildPaletteOrder: 254 Prerequisites: gtek, ~vehicles.htnk, ~ionmam.upgrade, ~techlevel.high - Description: Big and slow tank with anti-air capability.\n Can crush concrete walls.\n Strong vs Vehicles, Infantry\n Weak vs Nothing - Valued: - Cost: 1700 Tooltip: Name: Ion Mammoth Tank GenericName: Tank - UpdatesPlayerStatistics: - AddToArmyValue: true - Health: - HP: 82000 - Armor: - Type: Heavy - Mobile: - Speed: 42 - Locomotor: heavytracked - Passenger: - Weight: 2 - RevealsShroud: - MinRange: 4c0 - Range: 6c0 - RevealGeneratedShroud: False - RevealsShroud@GAPGEN: - Range: 4c0 - Turreted: - TurnSpeed: 8 Armament@PRIMARY: Weapon: IonZap LocalOffset: 870,0,360 - Recoil: 171 - RecoilRecovery: 30 - MuzzleSequence: muzzle - Armament@SECONDARY: - Name: secondary - Weapon: MammothTusk - LocalOffset: -85,384,340, -85,-384,340 - LocalYaw: -100,100 - Recoil: 43 - MuzzleSequence: muzzle - AttackTurreted: - PauseOnCondition: empdisable || being-warped - WithMuzzleOverlay: - WithSpriteTurret: SpawnActorOnDeath: Actor: HTNK.Ion.Husk - RequiresCondition: !being-warped - ChangesHealth: - PercentageStep: 1 - Delay: 25 - StartIfBelow: 50 - DamageCooldown: 150 - ProducibleWithLevel: - Prerequisites: vehicles.upgraded - Selectable: - DecorationBounds: 44,38,0,-4 - Carryable: - LocalOffset: 0,0,500 - -Crushable: + -ReplacedInQueue: + -Upgradeable@ION: + -Upgradeable@HOVER: + -Upgradeable@DRONE: + -WithDecoration@UpgradeOverlay: + EncyclopediaExtras: + Subfaction: zocom HTNK.Hover: Inherits: HTNK @@ -2981,120 +4782,149 @@ HTNK.Hover: Name: Hover Mammoth Tank GenericName: Tank Buildable: - BuildPaletteOrder: 302 + BuildPaletteOrder: 255 Prerequisites: gtek, ~vehicles.htnk, ~hovermam.upgrade, ~techlevel.high - Description: Powerful heavy tank with anti-air capability.\n Can crush concrete walls.\n Strong vs Vehicles, Infantry\n Weak vs Nothing + Description: Big and fairly mobile tank with anti-air capability. + TooltipExtras: + Attributes: • Can traverse water\n• Self repairs to 50% out of combat\n• Afterburner ability (with upgrade) Mobile: - Speed: 66 + Speed: 60 Locomotor: hover Turreted: - TurnSpeed: 16 + TurnSpeed: 20 Hovers: BobDistance: -35 RequiresCondition: !empdisable && !being-warped && !driver-dead - GrantConditionOnTerrain: + GrantConditionOnTerrain@ONWATER: TerrainTypes: Water Condition: onwater KillsSelf@SINK: RequiresCondition: onwater && (empdisable || driver-dead) + Targetable@ONWATER: + TargetTypes: Water, Ship + RequiresCondition: onwater WithShadow: Offset: 43, 128, 0 ZOffset: -129 + RequiresCondition: !invisibility SpawnActorOnDeath: Actor: HTNK.Hover.Husk RequiresCondition: !being-warped && !onwater + -ReplacedInQueue: + -Upgradeable@ION: + -Upgradeable@HOVER: + -Upgradeable@DRONE: + -WithDecoration@UpgradeOverlay: + GrantTimedConditionOnDeploy@Afterburner: + DeployedCondition: abur-active + RequiresCondition: abur-upgrade + ShowSelectionBar: true + StartsFullyCharged: true + DeployedTicks: 200 + CooldownTicks: 1500 + ShowSelectionBarWhenFull: false + ChargingColor: 808080 + DischargingColor: ff6600 + DeploySound: htnkabur.aud + Instant: true + GrantConditionOnPrerequisite@Afterburner: + Condition: abur-upgrade + Prerequisites: abur.upgrade + SpeedMultiplier@Afterburner: + RequiresCondition: abur-active + Modifier: 150 + Contrail@AB1: + Offset: -600,-100,200 + StartColorUsePlayerColor: false + StartColor: cc550080 + StartColorAlpha: 128 + TrailLength: 12 + RequiresCondition: abur-upgrade && abur-active + Contrail@AB2: + Offset: -600,100,200 + StartColorUsePlayerColor: false + StartColor: cc550080 + StartColorAlpha: 128 + TrailLength: 12 + RequiresCondition: abur-upgrade && abur-active + EncyclopediaExtras: + Subfaction: eagle HTNK.Drone: - Inherits: ^TankTD - Inherits@GAINSEXPERIENCE: ^GainsExperience - Inherits@AUTOTARGET: ^AutoTargetAllAssaultMove + Inherits: HTNK Inherits@IDISABLE: ^DisabledByRadarLoss Inherits@HACKABLE: ^Hackable - Inherits@BERSERK: ^Berserk - RenderSprites: Buildable: - Queue: Vehicle - BuildPaletteOrder: 300 + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 256 IconPalette: chrometd - Prerequisites: ~disabled, gtek, ~vehicles.htnk, ~!ionmam.upgrade, ~!hovermam.upgrade, ~techlevel.high - Description: Remotely piloted heavy tank with anti-air capability.\n Requires active radar communication.\n Can crush concrete walls.\n Strong vs Vehicles, Infantry\n Weak vs Nothing + Prerequisites: ~mdrone.upgrade, gtek, ~vehicles.htnk, ~techlevel.high + Description: Remotely piloted heavy tank with anti-air capability. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor, Infantry + Weaknesses: • Requires active radar communication + Attributes: • Can crush concrete walls\n• Self repairs out of combat\n• Immune to mind control\n• XP of losses reclaimed by replacements Valued: - Cost: 1275 + Cost: 1300 + Health: + HP: 88000 Tooltip: Name: Mammoth Drone - GenericName: Tank - UpdatesPlayerStatistics: - AddToArmyValue: true - Health: - HP: 82000 - Armor: - Type: Heavy Mobile: - Speed: 42 - Locomotor: heavytracked - PauseOnCondition: !radarenabled || empdisable || being-warped || notmobile + PauseOnCondition: !radarenabled || being-captured || empdisable || being-warped || driver-dead || notmobile + Voice: Move Passenger: - Weight: 2 - RevealsShroud: - MinRange: 4c0 - Range: 6c0 - RevealGeneratedShroud: False - RevealsShroud@GAPGEN: - Range: 4c0 - Turreted: - TurnSpeed: 8 + Voice: Move Armament@PRIMARY: - Weapon: 130mmTD - LocalOffset: 900,180,340, 900,-180,340 - Recoil: 171 - RecoilRecovery: 30 - MuzzleSequence: muzzle + Weapon: 130mmTD.Drone Armament@SECONDARY: - Name: secondary - Weapon: MammothTusk - LocalOffset: -85,384,340, -85,-384,340 - LocalYaw: -100,100 - Recoil: 43 - MuzzleSequence: muzzle + Weapon: MammothTusk.Drone AttackTurreted: - PauseOnCondition: !radarenabled || empdisable || being-warped - WithMuzzleOverlay: - WithSpriteTurret: + PauseOnCondition: !radarenabled || empdisable || being-warped || blinded + Voice: Attack + AttackMove: + Voice: Attack SpawnActorOnDeath: - Actor: HTNK.Husk - RequiresCondition: !being-warped - ChangesHealth: - PercentageStep: 1 - Delay: 25 - StartIfBelow: 50 - DamageCooldown: 150 - ProducibleWithLevel: - Prerequisites: vehicles.upgraded - Selectable: - DecorationBounds: 44,38,0,-4 - Carryable: - LocalOffset: 0,0,500 - -Crushable: + Actor: HTNK.DRONE.Husk Voiced: - VoiceSet: DroneVoice - Targetable: - TargetTypes: Ground, Vehicle, C4, ChaosImmune, DriverKillImmune, MindControlImmune - -CaptureManager: + VoiceSet: MamDroneVoice + RequiresCondition: radarenabled && !empdisable + Voiced@OFFLINE: + VoiceSet: OfflineDroneVoice + RequiresCondition: !radarenabled || empdisable + Targetable@MindControlImmune: + TargetTypes: MindControlImmune + Targetable@ChaosImmune: + TargetTypes: ChaosImmune + Targetable@DriverKillImmune: + TargetTypes: DriverKillImmune + ChangesHealth: + StartIfBelow: 100 + RequiresCondition: !mdrn-attached -Capturable: - -CaptureNotification: - -Capturable@DRIVER_DEAD: - -GrantConditionIfOwnerIsNeutral: - -ChangesHealth@DRIVER_DEAD: - -Targetable@DRIVERKILL: - -Targetable@DRIVERKILLLOWHP: - -GrantConditionOnDamageState@DRIVERKILLLOWHP: - -Targetable@AICAPTURE: + -SpeedMultiplier@BERSERK: + -ReloadDelayMultiplier@BERSERK: + -ExternalCondition@BERSERK: + -Berserkable@BERSERK: + -WithPalettedOverlay@BERSERK: + -TimedConditionBar@BERSERK: + -RejectsOrders@BERSERK: + -GrantCondition@BERSERK: + -ReplacedInQueue: + -Upgradeable@ION: + -Upgradeable@HOVER: + -Upgradeable@DRONE: + -WithDecoration@UpgradeOverlay: + ReclaimsExperience: + Sellable: + RequiresCondition: unit-sellable && !c4 && !being-warped + EncyclopediaExtras: + Subfaction: arc MSAM: Inherits: ^TankTD Inherits@GAINSEXPERIENCE: ^GainsExperience - Inherits@AUTOTARGET: ^AutoTargetAllAssaultMove - Inherits@BERSERK: ^Berserk + Inherits@AUTOTARGET: ^AutoTargetAllAssaultMovePrioritizeGround Inherits@SLOWCRUSH: ^SlowedByCrushing RenderSprites: FactionImages: @@ -3112,34 +4942,46 @@ MSAM: Buildable: BuildPaletteOrder: 190 Prerequisites: anyradar, ~vehicles.msam, ~techlevel.medium - Queue: Vehicle + Queue: VehicleSQ, VehicleMQ IconPalette: chrometd - Description: Multiple Launch Rocket System.\nLong-range guided artillery.\n Can attack Aircraft.\n Has weak armor.\n Strong vs Buildings, Defenses, Infantry, Light Armor + Description: Multiple Launch Rocket System. Long-range guided artillery with anti-air capability. + TooltipExtras: + Strengths: • Strong vs Buildings, Defenses, Infantry, Light Armor + Weaknesses: • Weak vs Heavy Armor Mobile: - Speed: 66 + Speed: 72 + Voice: Move + Passenger: + Voice: Move Health: - HP: 16000 + HP: 22000 Armor: Type: Light RevealsShroud: MinRange: 4c0 - Range: 5c0 + Range: 6c0 RevealGeneratedShroud: False RevealsShroud@GAPGEN: Range: 4c0 Turreted: - TurnSpeed: 20 + TurnSpeed: 16 Offset: -256,0,128 AttackTurreted: TargetFrozenActors: True - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded + Voice: Attack + AttackMove: + Voice: Attack WithSpriteTurret: - Explodes: + FireWarheadsOnDeath: Weapon: ArtilleryExplode ProducibleWithLevel: Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded Selectable: - DecorationBounds: 28,28 + DecorationBounds: 1194, 1194 GrantConditionOnPrerequisite@HSONIC: Condition: hypersonic-upgrade Prerequisites: hypersonic.upgrade @@ -3154,51 +4996,70 @@ MSAM: LocalOffset: 213,128,0, 213,-128,0 LocalYaw: 100, -100 RequiresCondition: !hypersonic-upgrade && !hammerhead-upgrade && !hailstorm-upgrade + PauseOnCondition: reloading-secondary + ReloadingCondition: reloading-primary Armament@SECONDARY: Name: secondary Weapon: 227mmAA LocalOffset: 213,-128,0, 213,128,0 LocalYaw: 100, -100 RequiresCondition: !hypersonic-upgrade && !hammerhead-upgrade && !hailstorm-upgrade + PauseOnCondition: reloading-primary + ReloadingCondition: reloading-secondary Armament@PRIMARYUPG1: Weapon: 227mm.Hypersonic LocalOffset: 213,128,0, 213,-128,0 - LocalYaw: 100, -100 + LocalYaw: 75, -75 RequiresCondition: hypersonic-upgrade + PauseOnCondition: reloading-secondary + ReloadingCondition: reloading-primary Armament@SECONDARYUPG1: Name: secondary Weapon: 227mmAA.Hypersonic LocalOffset: 213,-128,0, 213,128,0 - LocalYaw: 100, -100 + LocalYaw: 75, -75 RequiresCondition: hypersonic-upgrade + PauseOnCondition: reloading-primary + ReloadingCondition: reloading-secondary Armament@PRIMARYUPG2: Weapon: 227mm.Hammerhead LocalOffset: 213,128,0, 213,-128,0 LocalYaw: 100, -100 RequiresCondition: hammerhead-upgrade + PauseOnCondition: reloading-secondary + ReloadingCondition: reloading-primary Armament@SECONDARYUPG2: Name: secondary Weapon: 227mmAA.Hammerhead LocalOffset: 213,-128,0, 213,128,0 LocalYaw: 100, -100 RequiresCondition: hammerhead-upgrade + PauseOnCondition: reloading-primary + ReloadingCondition: reloading-secondary Armament@PRIMARYUPG3: Weapon: 227mm.Hailstorm LocalOffset: 213,128,0, 213,-128,0 LocalYaw: 100, -100 RequiresCondition: hailstorm-upgrade + PauseOnCondition: reloading-secondary + ReloadingCondition: reloading-primary Armament@SECONDARYUPG3: Name: secondary Weapon: 227mmAA.Hailstorm LocalOffset: 213,-128,0, 213,128,0 LocalYaw: 100, -100 RequiresCondition: hailstorm-upgrade + PauseOnCondition: reloading-primary + ReloadingCondition: reloading-secondary + Voiced: + VoiceSet: MsamVoice + Encyclopedia: + Category: GDI/Vehicles MLRS: Inherits: ^TankTD Inherits@GAINSEXPERIENCE: ^GainsExperience Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove - Inherits@BERSERK: ^Berserk Inherits@SLOWCRUSH: ^SlowedByCrushing RenderSprites: Valued: @@ -3208,14 +5069,18 @@ MLRS: UpdatesPlayerStatistics: AddToArmyValue: true Buildable: - BuildPaletteOrder: 240 + BuildPaletteOrder: 270 Prerequisites: tmpl, ~vehicles.mlrs, ~techlevel.high - Queue: Vehicle + Queue: VehicleSQ, VehicleMQ IconPalette: chrometd - Description: Long-range incendiary rocket artillery.\n Has weak armor.\n Strong vs Buildings, Defenses, Infantry\n Weak vs Tanks, Aircraft + Description: Long-range incendiary missile artillery. + TooltipExtras: + Strengths: • Strong vs Buildings, Defenses, Infantry, Light Armor + Weaknesses: • Weak vs Heavy Armor\n• Cannot attack Aircraft\n• Has difficulty hitting moving targets\n• Cannot fire while moving Mobile: - Speed: 66 + Speed: 72 PauseOnCondition: aiming || being-captured || empdisable || being-warped || driver-dead || notmobile + BlockedCursor: move Health: HP: 15000 Armor: @@ -3230,17 +5095,33 @@ MLRS: TurnSpeed: 8 Offset: -128,0,128 RealignDelay: 0 - Armament: - Weapon: honestjohn + AttackMove: + AttackMoveCondition: attack-move + Armament@PRIMARY: + Weapon: HonestJohn + LocalOffset: 0,171,0, 0,-171,0 + PauseOnCondition: moving + ReloadingCondition: reloading + RequiresCondition: !blacknapalm-upgrade + Armament@PRIMARYUPG: + Weapon: HonestJohn.UPG LocalOffset: 0,171,0, 0,-171,0 + PauseOnCondition: moving + ReloadingCondition: reloading + RequiresCondition: blacknapalm-upgrade + Armament@TARGETTER: + Name: targetter + Weapon: HonestJohnTargeting + PauseOnCondition: reloading + RequiresCondition: attack-move || assault-move AmmoPool: Ammo: 2 AmmoCondition: ammo AttackTurreted: + Armaments: primary, targetter TargetFrozenActors: True ForceFireIgnoresActors: True - PauseOnCondition: empdisable || being-warped - OpportunityFire: False + PauseOnCondition: empdisable || being-warped || blinded WithSpriteTurret: RequiresCondition: ammo > 1 WithSpriteTurret@OneMissile: @@ -3249,30 +5130,56 @@ MLRS: WithSpriteTurret@NoMissiles: RequiresCondition: !ammo Sequence: turret0 - GrantConditionOnAttack: + GrantConditionOnAttack@AIMING: + ArmamentNames: primary, targetter Condition: aiming - RevokeDelay: 50 + RevokeDelay: 15 RevokeAll: false - Explodes: - Weapon: BarrelExplode + GrantConditionOnMovement@MOVING: + ValidMovementTypes: Horizontal, Vertical, Turn + Condition: moving + FireWarheadsOnDeath: + Weapon: UnitExplodeFlame ReloadAmmoPool@1: Delay: 120 Count: 2 ProducibleWithLevel: Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded Selectable: - DecorationBounds: 28,28 + DecorationBounds: 1194, 1194 ProductionCostMultiplier@BlackhBonus: Multiplier: 90 - Prerequisites: vehicles.blackh + Prerequisites: player.blackh + GrantConditionOnPrerequisite@UPG: + Condition: blacknapalm-upgrade + Prerequisites: blacknapalm.upgrade + Encyclopedia: + Category: Nod/Vehicles + EncyclopediaExtras: + RenderPreviewActor: mlrs.preview + +MLRS.Preview: + Inherits: ^PreviewDummy + Inherits@TDPalette: ^TDPalette + RenderSprites: + Image: mlrs + WithFacingSpriteBody: + WithSpriteTurret: + Sequence: turret + Turreted: + Offset: -128,0,128 STNK.Nod: Inherits: ^VehicleTD Inherits@GAINSEXPERIENCE: ^GainsExperience - Inherits@AUTOTARGET: ^AutoTargetAllAssaultMoveAntiAir - Inherits@BERSERK: ^Berserk + Inherits@AUTOTARGET: ^AutoTargetAllAssaultMovePrioritizeAir + Inherits@A2GPROTECTION: ^AirToGroundProtection + Inherits@UpgradeOverlay: ^UpgradeOverlay RenderSprites: - Image: STNKTnod + Image: stnktnod Valued: Cost: 1100 Tooltip: @@ -3281,33 +5188,40 @@ STNK.Nod: UpdatesPlayerStatistics: AddToArmyValue: true Buildable: - BuildPaletteOrder: 160 - Prerequisites: anyradar, ~vehicles.nod, ~techlevel.high - Queue: Vehicle + BuildPaletteOrder: 202 + Prerequisites: anyradar, ~vehicles.nod, ~!hstk.upgrade, ~techlevel.medium + Queue: VehicleSQ, VehicleMQ IconPalette: chrometd - Description: Medium-range missile tank that can cloak.\n Can attack Aircraft.\n Has weak armor.\n Can be spotted by infantry and defense structures.\n Strong vs Vehicles, Tanks\n Weak vs Infantry + Description: Medium-range missile tank that can cloak. + TooltipExtras: + Strengths: • Strong vs Buildings, Defenses, Heavy Armor, Light Armor, Aircraft + Weaknesses: • Weak vs Infantry + Attributes: • Can be spotted by nearby infantry and defense structures Mobile: - Speed: 108 + Speed: 126 + Voice: Move Health: HP: 20000 Armor: Type: Light RevealsShroud: - MinRange: 4c0 - Range: 6c0 + MinRange: 5c0 + Range: 7c0 RevealGeneratedShroud: False RevealsShroud@GAPGEN: - Range: 4c0 + Range: 5c0 Cloak@NORMAL: - InitialDelay: 90 - CloakDelay: 90 + InitialDelay: 75 + CloakDelay: 76 CloakSound: trans1.aud CloakedCondition: hidden - UncloakSound: appear1.aud - Palette: cloak + UncloakSound: appear1md.aud + CloakStyle: Palette + CloakedPalette: cloak IsPlayerPalette: false - UncloakOn: Attack, Unload, Infiltrate, Demolish, Dock, Damage, Heal, SelfHeal - RequiresCondition: !cloak-force-disabled && !invisibility && !being-warped && !driver-dead + UncloakOn: Attack, Unload, Infiltrate, Demolish, Dock, Damage, Heal + RequiresCondition: !cloak-force-disabled && !being-warped && !empdisable && !driver-dead && !parachute + PauseOnCondition: invisibility Cloak@CRATE-CLOAK: RequiresCondition: crate-cloak && !(cloak-force-disabled || invisibility || hidden || driver-dead) GrantConditionOnDamageState@UNCLOAK: @@ -3335,25 +5249,165 @@ STNK.Nod: TurnSpeed: 40 Offset: 0,0,10 AttackTurreted: - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded || parachute + Voice: Attack WithSpriteTurret: + RequiresCondition: !tibcore-upgrade + WithSpriteTurret@UPG: + RequiresCondition: tibcore-upgrade + Sequence: turret-upg AutoTarget: InitialStance: HoldFire - InitialStanceAI: ReturnFire + InitialStanceAI: AttackAnything ProducibleWithLevel: Prerequisites: vehicles.upgraded - ProductionCostMultiplier@ShadowBonus: - Multiplier: 90 - Prerequisites: vehicles.shadow + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded + GrantConditionOnPrerequisite@UPG: + Condition: tibcore-upgrade + Prerequisites: tibcore.upgrade + WithColoredSelectionBox@INVIS: + RequiresCondition: invisibility || hidden + ColorSource: Player + DamageTypeDamageMultiplier@A2GPROTECTION: + Modifier: 60 + ReplacedInQueue: + Actors: hstk + Upgradeable@HSTK: + Type: hstk.upgrade + UpgradingCondition: upgrading + Actor: hstk + UpgradeAtActors: fix, rep, srep + RequiresCondition: !mindcontrolled + Voiced: + VoiceSet: STNKVoice + Passenger: + Voice: Move + AttackMove: + Voice: Attack + GrantConditionToAttached@Cloak: + Condition: inherited-cloak + RequiresCondition: hidden || invisibility + Encyclopedia: + Category: Nod/Vehicles + +HSTK: + Inherits: ^TankTD + Inherits@GAINSEXPERIENCE: ^GainsExperience + Inherits@AUTOTARGET: ^AutoTargetAllAssaultMovePrioritizeAir + Inherits@HeavyArmor: ^HeavyArmor + Inherits@A2GPROTECTION: ^AirToGroundProtection + RenderSprites: + Image: hstk + Valued: + Cost: 1350 + Tooltip: + Name: Heavy Stealth Tank + GenericName: Tank + UpdatesPlayerStatistics: + AddToArmyValue: true + Buildable: + BuildPaletteOrder: 202 + Prerequisites: anyradar, ~vehicles.nod, ~hstk.upgrade, ~techlevel.medium + Queue: VehicleSQ, VehicleMQ + IconPalette: chrometd + Description: Medium-range missile heavy tank that can cloak. + TooltipExtras: + Strengths: • Strong vs Buildings, Defenses, Heavy Armor, Light Armor, Aircraft + Weaknesses: • Weak vs Infantry + Attributes: • Can be spotted by nearby infantry and defense structures + Mobile: + Speed: 100 + Voice: Move + Health: + HP: 25000 + RevealsShroud: + MinRange: 5c0 + Range: 7c0 + RevealGeneratedShroud: False + RevealsShroud@GAPGEN: + Range: 5c0 + Cloak@NORMAL: + InitialDelay: 89 + CloakDelay: 90 + CloakSound: trans1.aud + CloakedCondition: hidden + UncloakSound: appear1md.aud + CloakStyle: Palette + CloakedPalette: cloak + IsPlayerPalette: false + UncloakOn: Attack, Unload, Infiltrate, Demolish, Dock, Damage, Heal + RequiresCondition: !cloak-force-disabled && !being-warped && !empdisable && !driver-dead && !parachute + PauseOnCondition: invisibility + Cloak@CRATE-CLOAK: + RequiresCondition: crate-cloak && !(cloak-force-disabled || invisibility || hidden || driver-dead) + GrantConditionOnDamageState@UNCLOAK: + Condition: cloak-force-disabled + ValidDamageStates: Critical + Armament@PRIMARY: + Weapon: HstkMissile + LocalOffset: 213,160,128, 213,-160,128 + RequiresCondition: !tibcore-upgrade + Armament@SECONDARY: + Name: secondary + Weapon: HstkMissileAA + LocalOffset: 213,160,128, 213,-160,128 + RequiresCondition: !tibcore-upgrade + Armament@PRIMARYUPG: + Weapon: HstkMissile.TibCore + LocalOffset: 213,160,128, 213,-160,128 + RequiresCondition: tibcore-upgrade + Armament@SECONDARYUPG: + Name: secondary + Weapon: HstkMissileAA.TibCore + LocalOffset: 213,160,128, 213,-160,128 + RequiresCondition: tibcore-upgrade + Turreted: + TurnSpeed: 32 + Offset: 0,0,0 + AttackTurreted: + PauseOnCondition: empdisable || being-warped || blinded || parachute + Voice: Attack + WithSpriteTurret: + RequiresCondition: !tibcore-upgrade + WithSpriteTurret@UPG: + RequiresCondition: tibcore-upgrade + Sequence: turret-upg + AutoTarget: + InitialStance: HoldFire + InitialStanceAI: AttackAnything + ProducibleWithLevel: + Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded GrantConditionOnPrerequisite@UPG: Condition: tibcore-upgrade Prerequisites: tibcore.upgrade + WithColoredSelectionBox@INVIS: + RequiresCondition: invisibility || hidden + ColorSource: Player + DamageTypeDamageMultiplier@A2GPROTECTION: + Modifier: 60 + Voiced: + VoiceSet: HSTKVoice + Passenger: + Voice: Move + AttackMove: + Voice: Attack + GrantConditionToAttached@Cloak: + Condition: inherited-cloak + RequiresCondition: hidden || invisibility + Encyclopedia: + Category: Nod/Vehicles + EncyclopediaExtras: + Subfaction: shadow BIKE: Inherits: ^VehicleTD Inherits@GAINSEXPERIENCE: ^GainsExperience Inherits@AUTOTARGET: ^AutoTargetAllAssaultMove - Inherits@BERSERK: ^Berserk RenderSprites: Valued: Cost: 500 @@ -3362,21 +5416,24 @@ BIKE: UpdatesPlayerStatistics: AddToArmyValue: true Buildable: - BuildPaletteOrder: 30 + BuildPaletteOrder: 150 Prerequisites: ~vehicles.nod, ~techlevel.low - Queue: Vehicle + Queue: VehicleSQ, VehicleMQ IconPalette: chrometd - Description: Fast scout vehicle, armed with\nrockets.\n Can attack Aircraft.\n Strong vs Tanks, Buildings\n Weak vs Infantry + Description: Fast scout vehicle armed with rockets. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Buildings + Weaknesses: • Weak vs Infantry, Light Armor Mobile: TurnSpeed: 40 - Speed: 144 + Speed: 170 Health: HP: 11000 Armor: Type: Light RevealsShroud: MinRange: 4c0 - Range: 5c0 + Range: 6c0 RevealGeneratedShroud: False RevealsShroud@GAPGEN: Range: 4c0 @@ -3403,18 +5460,35 @@ BIKE: LocalYaw: 100, -100 RequiresCondition: tibcore-upgrade AttackFrontal: - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded + FacingTolerance: 0 ProducibleWithLevel: Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded GrantConditionOnPrerequisite@UPG: Condition: tibcore-upgrade Prerequisites: tibcore.upgrade + GrantConditionOnPrerequisite@ZealBonus: + Condition: zeal-covenant + Prerequisites: zeal.covenant + SpeedMultiplier@ZealBonus: + Modifier: 115 + RequiresCondition: zeal-covenant + WithFacingSpriteBody: + RequiresCondition: !tibcore-upgrade + WithFacingSpriteBody@UPG: + Name: tibcore + RequiresCondition: tibcore-upgrade + Sequence: idle-upgrade + Encyclopedia: + Category: Nod/Vehicles FTNK: Inherits: ^TankTD Inherits@GAINSEXPERIENCE: ^GainsExperience Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove - Inherits@BERSERK: ^Berserk Inherits@SLOWCRUSH: ^SlowedByCrushing RenderSprites: Valued: @@ -3425,13 +5499,16 @@ FTNK: UpdatesPlayerStatistics: AddToArmyValue: true Buildable: - BuildPaletteOrder: 130 - Prerequisites: anyradar, ~vehicles.ftnk, ~techlevel.low - Queue: Vehicle + BuildPaletteOrder: 200 + Prerequisites: anyradar, ~vehicles.ftnk, ~techlevel.medium + Queue: VehicleSQ, VehicleMQ IconPalette: chrometd - Description: Tank armed with dual short-range flamethrowers.\n Strong vs Infantry, Buildings, Light Armor\n Weak vs Tanks, Defenses, Aircraft + Description: Tank armed with dual short-range flamethrowers. + TooltipExtras: + Strengths: • Strong vs Infantry, Buildings, Light Armor + Weaknesses: • Weak vs Heavy Armor\n• Cannot attack Aircraft Mobile: - Speed: 66 + Speed: 76 Health: HP: 40000 Armor: @@ -3452,26 +5529,35 @@ FTNK: LocalOffset: 682,128,42, 682,-128,42 WithMuzzleOverlay: AttackFrontal: - PauseOnCondition: empdisable || being-warped - Explodes: - Weapon: BarrelExplode - EmptyWeapon: BarrelExplode + PauseOnCondition: empdisable || being-warped || blinded || parachute + FacingTolerance: 0 + FireWarheadsOnDeath: + Weapon: UnitExplodeFlame + EmptyWeapon: UnitExplodeFlame ProducibleWithLevel: Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded + Encyclopedia: + Category: Nod/Vehicles HFTK: Inherits: ^TankTD Inherits@GAINSEXPERIENCE: ^GainsExperience Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove - Inherits@BERSERK: ^Berserk + Inherits@HeavyArmor: ^HeavyArmor Inherits@SLOWCRUSH: ^SlightlySlowedByCrushing RenderSprites: Buildable: - Queue: Vehicle - BuildPaletteOrder: 131 + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 201 IconPalette: chrometd - Prerequisites: anyradar, ~vehicles.blackh, ~techlevel.low - Description: Heavy tank armed with dual short-range flamethrowers.\n Strong vs Infantry, Buildings, Light Armor\n Weak vs Tanks, Defenses, Aircraft + Prerequisites: anyradar, ~vehicles.blackh, ~techlevel.medium + Description: Heavy tank armed with dual short-range flamethrowers. + TooltipExtras: + Strengths: • Strong vs Infantry, Buildings, Light Armor + Weaknesses: • Weak vs Heavy Armor\n• Cannot attack Aircraft Valued: Cost: 1100 Tooltip: @@ -3480,12 +5566,9 @@ HFTK: UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 46000 - Armor: - Type: Heavy + HP: 44000 Mobile: - Locomotor: heavytracked - Speed: 56 + Speed: 60 Voice: Move RevealsShroud: MinRange: 4c0 @@ -3493,6 +5576,8 @@ HFTK: RevealGeneratedShroud: False RevealsShroud@GAPGEN: Range: 4c0 + AutoTarget: + ScanRadius: 4 Turreted: TurnSpeed: 20 Armament@PRIMARY: @@ -3500,22 +5585,43 @@ HFTK: MuzzleSequence: muzzle MuzzlePalette: tdeffect LocalOffset: 750,200,150, 750,-200,150 + RequiresCondition: !blacknapalm-upgrade + Armament@PRIMARYUPG: + Weapon: HeavyFlameTankFlamer.UPG + MuzzleSequence: muzzle2 + MuzzlePalette: scrin-ignore-lighting-alpha85 + LocalOffset: 750,200,150, 750,-200,150 + RequiresCondition: blacknapalm-upgrade Armament@FF: + Name: secondary Weapon: HeavyFlameTankFlamerFF LocalOffset: 750,200,150, 750,-200,150 + RequiresCondition: !blacknapalm-upgrade + Armament@FFUPG: + Name: secondary + Weapon: HeavyFlameTankFlamerFF.UPG + LocalOffset: 750,200,150, 750,-200,150 + RequiresCondition: blacknapalm-upgrade AttackTurreted: Voice: Attack RangeMargin: 0 - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded || parachute WithSpriteTurret: + RequiresCondition: !blacknapalm-upgrade + WithSpriteTurret@BlackNapalm: + Sequence: turret-upg + RequiresCondition: blacknapalm-upgrade WithMuzzleOverlay: Voiced: VoiceSet: FlameTankVoice - Explodes: - Weapon: BarrelExplode - EmptyWeapon: BarrelExplode + FireWarheadsOnDeath: + Weapon: UnitExplodeFlame + EmptyWeapon: UnitExplodeFlame ProducibleWithLevel: Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded AmbientSoundCA: SoundFiles: bigflamer-loop1.aud InitialSound: bigflamer-start1.aud @@ -3524,97 +5630,121 @@ HFTK: InitialSoundLength: 24 GrantConditionOnAttackCA: Condition: attacking + RevokeDelay: 10 + GrantConditionOnPrerequisite@UPG: + Condition: blacknapalm-upgrade + Prerequisites: blacknapalm.upgrade + GrantConditionOnAttack@BurstCount: + Condition: burstcount + RevokeAll: true + RevokeDelay: 60 + MaximumInstances: 25 + FirepowerMultiplier@Frontload: + Modifier: 125 + RequiresCondition: burstcount < 10 + FirepowerMultiplier@Backload: + Modifier: 82 + RequiresCondition: burstcount >= 10 + Encyclopedia: + Category: Nod/Vehicles + EncyclopediaExtras: + Subfaction: blackh HARV.TD: - Inherits: ^VehicleTD-NOUPG - Inherits@HARVBALANCE: ^HarvesterBalancer - Inherits@SELECTION: ^SelectableEconomicUnit + Inherits@HarvesterBase: ^HarvesterBase + Inherits@TDPAL: ^TDPalette + WithDamageOverlay: + Image: smoke_mtd + Cloak@CRATE-CLOAK: + CloakedPalette: cloak RenderSprites: Image: harv2 - Valued: - Cost: 1400 Tooltip: Name: Harvester - GenericName: Harvester Buildable: BuildPaletteOrder: 12 - Prerequisites: anyrefinery, ~vehicles.td, ~techlevel.infonly - Queue: Vehicle + Prerequisites: ~!sharv.upgrade, anyrefinery, ~vehicles.td, ~techlevel.low + Queue: VehicleSQ, VehicleMQ IconPalette: chrometd - Description: Collects Tiberium, Ore and Gems for processing.\n Unarmed + Description: Collects Ore, Gems and Tiberium for processing. Selectable: Priority: 7 - DecorationBounds: 36,36 - Harvester: - Capacity: 40 - Resources: Tiberium, BlueTiberium, Ore, Gems - BaleUnloadDelay: 1 - BaleLoadDelay: 3 - SearchFromProcRadius: 15 - SearchFromHarvesterRadius: 8 - HarvestFacings: 8 - EmptyCondition: no-ore - WithHarvesterPipsDecoration: - Position: BottomLeft - Margin: 4, 3 - RequiresSelection: true - PipCount: 6 - ResourceSequences: - Ore: pip-yellow - Gems: pip-red - Tiberium: pip-green - BlueTiberium: pip-blue - Mobile: - Speed: 51 - Locomotor: heavywheeled - Health: - HP: 75000 - Armor: - Type: Heavy - RevealsShroud: - Range: 4c0 + DecorationBounds: 1536, 1536 SpawnActorOnDeath: Actor: HARV.TD.Husk RequiresCondition: !being-warped WithHarvestAnimation: - WithDockingAnimation: - ChangesHealth: - PercentageStep: 1 - Delay: 25 - StartIfBelow: 50 - DamageCooldown: 500 - GrantConditionOnTerrain@Tiberium: - Condition: ontib - TerrainTypes: Tiberium - GrantConditionOnTerrain@Ore: - Condition: onore - TerrainTypes: Ore - Explodes@Ore: - RequiresCondition: !no-ore && onore && !being-warped - Weapon: OreExplosion - Explodes@Tib: - RequiresCondition: !no-ore && ontib && !being-warped - Weapon: TibExplosion - -Crushable: - Targetable: - TargetTypes: Ground, Vehicle, C4, ChaosImmune - SpawnRandomActorOnDeath: - Actors: c1,c7,c10 - Probability: 5 - RequiresCondition: !being-warped + WithDockingAnimationCA: + RefineryTypes: proc.td + GrantConditionOnPrerequisite@Stealth: + Condition: sharv-upgrade + Prerequisites: sharv.upgrade + TransformOnCondition: + RequiresCondition: sharv-upgrade + IntoActor: harv.td.upg + RejectsOrders@Transforming: + RequiresCondition: sharv-upgrade + ReplacedInQueue: + Actors: harv.td.upg + Encyclopedia: + Category: GDI/Vehicles; Nod/Vehicles + +HARV.TD.UPG: + Inherits: HARV.TD + Buildable: + Prerequisites: ~sharv.upgrade, anyrefinery, ~vehicles.td, ~techlevel.low + RenderSprites: + Image: harv2.upg + Health: + HP: 65000 + Tooltip: + Name: Stealth Harvester + Cloak@NORMAL: + InitialDelay: 74 + CloakDelay: 75 + CloakSound: trans1.aud + CloakedCondition: hidden + UncloakSound: appear1md.aud + CloakStyle: Palette + CloakedPalette: cloak + IsPlayerPalette: false + UncloakOn: Attack, Unload, Infiltrate, Demolish, Dock, Damage, Heal + RequiresCondition: !cloak-force-disabled && !being-warped && !empdisable && !driver-dead && !parachute + PauseOnCondition: invisibility + Cloak@CRATE-CLOAK: + RequiresCondition: crate-cloak && !(cloak-force-disabled || invisibility || hidden || driver-dead) + GrantConditionToAttached@Cloak: + Condition: inherited-cloak + RequiresCondition: hidden || invisibility + SpawnActorOnDeath: + Actor: HARV.TD.UPG.Husk + -GrantConditionOnPrerequisite@Stealth: + -TransformOnCondition: + -RejectsOrders@Transforming: + -TransferResourcesOnTransform: + -ReplacedInQueue: + Encyclopedia: + Category: Nod/Vehicles BTR: Inherits: ^Tank Inherits@GAINSEXPERIENCE: ^GainsExperience - Inherits@AUTOTARGET: ^AutoTargetAllAssaultMoveAntiAir - Inherits@BERSERK: ^Berserk + Inherits@AUTOTARGET: ^AutoTargetAllAssaultMovePrioritizeAir Inherits@TRANSPORT: ^Transport + Inherits@NOUNLOADCHRONO: ^NoUnloadWhenChronoshifted Inherits@SLOWCRUSH: ^SlowedByCrushing + Inherits@HeavyArmor: ^HeavyArmor + Inherits@A2GPROTECTION: ^AirToGroundProtection + Inherits@UpgradeOverlay: ^UpgradeOverlay + Inherits@COMMANDOSKULL: ^CommandoSkull Buildable: - Queue: Vehicle - BuildPaletteOrder: 21 - Prerequisites: infantry.any, ~vehicles.soviet, ~techlevel.low - Description: Tough infantry transport.\n Can attack Aircraft.\n Strong vs Infantry, Aircraft\n Weak vs Tanks + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 30 + Prerequisites: ~vehicles.soviet, ~!gattling.upgrade, ~techlevel.low + Description: Tough infantry transport. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor, Aircraft + Weaknesses: • Weak vs Heavy Armor, Buildings, Defenses Valued: Cost: 675 Tooltip: @@ -3623,98 +5753,681 @@ BTR: AddToArmyValue: true Health: HP: 25000 - Armor: - Type: Heavy Mobile: - Speed: 90 - PauseOnCondition: notmobile || being-captured || empdisable || being-warped || driver-dead + Speed: 100 + Voice: Move + Passenger: + Voice: Move RevealsShroud: MinRange: 4c0 Range: 6c0 RevealGeneratedShroud: False RevealsShroud@GAPGEN: Range: 4c0 + DetectCloaked: + Range: 6c0 + DetectionTypes: Cloak, AirCloak + RequiresCondition: (loaded-cmdo || loaded-cmsr) && !(empdisable || being-warped) Turreted: TurnSpeed: 40 - Offset: 5,0,70 - Armament@1: + Armament@GROUND: + Name: secondary Weapon: FLAK-23-AG - LocalOffset: 392,0,276 + LocalOffset: 592,0,376 MuzzleSequence: muzzle - Armament@2AA: - Name: secondary + Armament@AIR: Weapon: FLAK-23-AA - LocalOffset: 392,0,276 + LocalOffset: 592,0,376 MuzzleSequence: muzzle + WithEjectedCasings: + CasingWeapon: BrassDebris + CasingSpawnLocalOffset: 0,-225,200 + CasingTargetOffset: 0, -600, 0 AttackTurreted: - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded + Voice: Attack + AttackMove: + Voice: Attack WithMuzzleOverlay: - WithSpriteTurret@TUR: + WithSpriteTurret@GROUND: Sequence: turret + RequiresCondition: !reactive-upgrade + WithSpriteTurret@GROUNDReactiveArmor: + Sequence: turret-upg + RequiresCondition: reactive-upgrade Cargo: - Types: Infantry + Types: Infantry, Hacker MaxWeight: 5 LoadingCondition: notmobile LoadedCondition: cargo - ProducibleWithLevel: + PassengerConditions: + e7: loaded-cmdo + rmbo: loaded-cmdo + bori: loaded-cmdo + yuri: loaded-cmdo + mast: loaded-cmdo + cmsr: loaded-cmsr + WithCargoSounds: + EnterSounds: genter1a.aud + ExitSounds: gexit1a.aud + CargoBlocked: + RequiresCondition: mindcontrolled + WithDecoration@COMMANDOSKULL: + RequiresCondition: loaded-cmdo + Targetable@MindControlResistant: + TargetTypes: MindControlResistant + RequiresCondition: cargo + Targetable@MindControlImmune: + TargetTypes: MindControlImmune + RequiresCondition: loaded-cmdo + ProducibleWithLevel: + Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy Prerequisites: vehicles.upgraded Capturable: RequiresCondition: !being-warped && !cargo Capturable@DRIVER_DEAD: RequiresCondition: driver-dead && !cargo - Targetable@DRIVERKILL: - RequiresCondition: !driver-dead && !cargo + GrantConditionOnPrerequisite@ReactiveArmor: + Prerequisites: reactive.upgrade + Condition: reactive-upgrade + DamageMultiplier@ReactiveArmor: + Modifier: 90 + RequiresCondition: reactive-upgrade + ReplacedInQueue: + Actors: btr.yuri + Upgradeable@GATTLING: + Type: gattling.upgrade + UpgradingCondition: upgrading + Actor: btr.yuri + UpgradeAtActors: fix, rep, srep + BuildDuration: 100 + RequiresCondition: !mindcontrolled + Voiced: + VoiceSet: BtrVoice + Encyclopedia: + Category: Soviets/Vehicles + EncyclopediaExtras: + Name: BTR BTR.AI: Inherits: BTR - Inherits: ^AIUNLOAD + Inherits@AIUNLOAD: ^AIUNLOAD RenderSprites: Image: BTR Buildable: - Prerequisites: ~botplayer, infantry.any, ~vehicles.soviet, ~techlevel.low + Prerequisites: ~botplayer, ~vehicles.soviet, ~techlevel.low Cargo: - InitialUnits: E4,E4,E4,E4,E4 + InitialUnits: E1,E1,E1,E3,E4 + WithCargoSounds: + -EnterSounds: + -Encyclopedia: -IFV: +BTR.YURI: + Inherits: BTR + RenderSprites: + Image: btry + Valued: + Cost: 750 + Buildable: + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 31 + Prerequisites: ~gattling.upgrade, ~vehicles.soviet, ~techlevel.low + Description: Tough infantry transport with armament improvements. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor, Aircraft + Weaknesses: • Weak vs Heavy Armor, Buildings, Defenses + Tooltip: + Name: Armored Personnel Carrier (Gattling BTR) + Armament@AIR: + Weapon: MGatt + LocalOffset: 320,50,350, 320,-50,350 + MuzzleSequence: muzzle + PauseOnCondition: reload-ground + ReloadingCondition: reload-air + RequiresCondition: gattling < 12 + Armament@AIR2: + Weapon: MGatt + LocalOffset: 320,50,350, 320,-50,350 + MuzzleSequence: muzzle-huge + PauseOnCondition: reload-ground + ReloadingCondition: reload-air + RequiresCondition: gattling >= 12 + Armament@GROUND: + Name: secondary + Weapon: MGattG + LocalOffset: 421,50,165, 421,-50,165 + MuzzleSequence: muzzle + PauseOnCondition: reload-air + ReloadingCondition: reload-ground + RequiresCondition: gattling-ground < 14 + Armament@GROUND2: + Name: secondary + Weapon: MGattG + LocalOffset: 421,50,165, 421,-50,165 + MuzzleSequence: muzzle-huge + PauseOnCondition: reload-air + ReloadingCondition: reload-ground + RequiresCondition: gattling-ground >= 14 + WithEjectedCasings: + CasingWeapon: BrassDebris + CasingSpawnLocalOffset: 0,225,200, 0,-225,200 + CasingTargetOffset: 0, 600, 0, 0, -600, 0 + FirepowerMultiplier@GAT1: + Modifier: 115 + RequiresCondition: (attacking-air && gattling >= 1 && gattling < 3) || (attacking-ground && gattling-ground >= 1 && gattling-ground < 5) + FirepowerMultiplier@GAT2: + Modifier: 130 + RequiresCondition: (attacking-air && gattling >= 3 && gattling < 7) || (attacking-ground && (gattling-ground >= 5 && (gattling-ground < 10 || !rank-elite))) + FirepowerMultiplier@GAT3: + Modifier: 145 + RequiresCondition: (attacking-air && gattling >= 7 || (attacking-ground && (gattling-ground >= 10 && rank-elite))) + AmbientSoundCA@ATTACKSOUNDINITIAL: + SoundFiles: vgatlo1a.aud + RequiresCondition: (attacking-air && gattling < 2) || (attacking-ground && gattling-ground < 2) + AmbientSoundCA@ATTACKSOUND1: + SoundFiles: vgatlo2a.aud, vgatlo2b.aud, vgatlo2c.aud + FinalSound: vgatlo3a.aud + RequiresCondition: (attacking-air && gattling >= 2 && gattling < 6) || (attacking-ground && gattling-ground >= 2 && gattling-ground < 6) + AmbientSoundCA@ATTACKSOUND2: + InitialSound: vgatlo4a.aud + SoundFiles: vgatlo5a.aud, vgatlo5b.aud + FinalSound: vgatlo6a.aud + RequiresCondition: (attacking-air && gattling >= 6 && gattling < 12) || (attacking-ground && (gattling-ground >= 6 && (gattling-ground < 14 || !rank-elite))) + AmbientSoundCA@ATTACKSOUND3: + InitialSound: vgatlo7a.aud + SoundFiles: vgatlo8a.aud, vgatlo8b.aud + FinalSound: vgatlo9a.aud + RequiresCondition: (attacking-air && gattling >= 12 || (attacking-ground && (gattling-ground >= 14 && rank-elite))) + GrantConditionOnAttackCA@ATTACKING-AIR: + ArmamentNames: primary + Condition: attacking-air + RevokeDelay: 6 + GrantConditionOnAttackCA@ATTACKING-GROUND: + ArmamentNames: secondary + Condition: attacking-ground + RevokeDelay: 6 + GrantConditionOnAttack: + Condition: gattling + MaximumInstances: 12 + RevokeDelay: 40 + RevokeOnNewTarget: False + RevokeAll: True + RequiresCondition: !attacking-ground + GrantConditionOnAttack@GROUND: + ArmamentNames: secondary + Condition: gattling-ground + MaximumInstances: 14 + RevokeDelay: 40 + RevokeOnNewTarget: False + RevokeAll: True + RequiresCondition: !attacking-air + WithSpriteTurret@AIR: + RequiresCondition: !attacking-ground && !reactive-upgrade + WithSpriteTurret@GROUND: + Sequence: turret-ground + RequiresCondition: attacking-ground && !reactive-upgrade + WithSpriteTurret@AIRReactiveArmor: + Sequence: turret-air-upg + RequiresCondition: !attacking-ground && reactive-upgrade + WithSpriteTurret@GROUNDReactiveArmor: + Sequence: turret-ground-upg + RequiresCondition: attacking-ground && reactive-upgrade + Turreted: + TurnSpeed: 28 + Offset: -50,0,0 + AttackTurreted: + PauseOnCondition: empdisable || being-warped || blinded + Armaments: primary, secondary + Voice: Attack + Mobile: + Voice: Move + Passenger: + Voice: Move + Voiced: + VoiceSet: GattlingTankVoice + Selectable: + Class: btr + -Upgradeable@GATTLING: + -WithDecoration@UpgradeOverlay: + EncyclopediaExtras: + Name: Gattling BTR + Subfaction: yuri + +BTR.YURI.AI: + Inherits: BTR.YURI + Inherits@AIUNLOAD: ^AIUNLOAD + RenderSprites: + Image: btry + Buildable: + Prerequisites: ~botplayer, ~vehicles.soviet, ~gattling.upgrade, ~techlevel.low + Cargo: + InitialUnits: E1,E1,E1,E3,E4 + WithCargoSounds: + -EnterSounds: + -Encyclopedia: + -EncyclopediaExtras: + +TRPC: Inherits: ^Tank Inherits@GAINSEXPERIENCE: ^GainsExperience - Inherits@BERSERK: ^Berserk Inherits@TRANSPORT: ^Transport + Inherits@NOUNLOADCHRONO: ^NoUnloadWhenChronoshifted Inherits@SLOWCRUSH: ^SlowedByCrushing Inherits@COMMANDOSKULL: ^CommandoSkull + Inherits@AIUNLOAD: ^AIUNLOAD + Inherits@HeavyArmor: ^HeavyArmor Buildable: - Queue: Vehicle - BuildPaletteOrder: 120 - Prerequisites: infantry.any, anyradar, ~vehicles.ifv, ~techlevel.low - Description: Adaptable infantry transport.\n Can attack Aircraft.\n Strong vs Aircraft, Vehicles\n Weak vs Infantry\n Special Ability: Transform + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 132 + Prerequisites: ~vehicles.soviet, ~infantry.doctrine, ~techlevel.medium + Description: Tough infantry transport pre-loaded with infantry. + TooltipExtras: + Weaknesses: • Unarmed + Attributes: • Empowers nearby basic infantry\n• Heals all nearby infantry\n• Detects cloaked units and mines Valued: - Cost: 750 + Cost: 1500 + Tooltip: + Name: Troop Crawler + UpdatesPlayerStatistics: + AddToArmyValue: false + AddToAssetsValue: false + Health: + HP: 36000 + Mobile: + Speed: 64 + Voice: Move + Passenger: + Voice: Move + CargoCondition: passenger + RevealsShroud: + MinRange: 4c0 + Range: 5c0 + RevealGeneratedShroud: False + RevealsShroud@GAPGEN: + Range: 4c0 + Cargo: + Types: Infantry, Hacker + UnloadVoice: Unload + MaxWeight: 8 + LoadingCondition: notmobile + LoadedCondition: cargo + PassengerConditions: + e7: loaded-cmdo + rmbo: loaded-cmdo + bori: loaded-cmdo + yuri: loaded-cmdo + mast: loaded-cmdo + InitialUnits: E1,E1,E1,E1,E1,E1,E3,E3 + WithCargoSounds: + EnterSounds: genter1a.aud + ExitSounds: gexit1a.aud + RequiresCondition: !no-cargo-sounds + GrantTimedCondition@NoPassengerSound: + Duration: 10 + Condition: no-cargo-sounds + CargoBlocked: + RequiresCondition: mindcontrolled + WithDecoration@COMMANDOSKULL: + RequiresCondition: loaded-cmdo + ProducibleWithLevel: + Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded + Capturable: + RequiresCondition: !being-warped && !cargo + Capturable@DRIVER_DEAD: + RequiresCondition: driver-dead && !cargo + Targetable@MindControlResistant: + TargetTypes: MindControlResistant + RequiresCondition: cargo + Targetable@MindControlImmune: + TargetTypes: MindControlImmune + RequiresCondition: loaded-cmdo + KeepsDistance: + AttackFrontal: + AttackMove: + AutoTarget: + ScanRadius: 3 + InitialStance: HoldFire + InitialStanceAI: HoldFire + AutoTargetPriority@DEFAULT: + ValidTargets: Infantry + ValidRelationships: Ally + Armament: + Weapon: TroopCrawlerDummyWeapon + TargetRelationships: Ally + ForceTargetRelationships: None + Cursor: guard + OutsideRangeCursor: guard + ProximityExternalCondition@InspirationTrpc: + Range: 4c0 + Condition: trpc-inspiration + ValidRelationships: Ally + RequiresCondition: !passenger && !inspiration-delay + GrantTimedCondition@InspirationDelay: + Duration: 10 + Condition: inspiration-delay + WithRadiatingCircle: + EndRadius: 4c0 + Interval: 75 + Duration: 50 + ValidRelationships: Ally + AlwaysShowMaxRange: true + ProximityExternalCondition@HealAura: + Condition: hospitalheal + Range: 4c0 + RequiresCondition: !passenger + GivesExperienceCA: + ActorExperienceModifier: 2000 + PlayerExperienceModifier: 0 + DetectCloaked: + Range: 6c0 + DetectionTypes: Cloak, AirCloak + RequiresCondition: !(empdisable || being-warped) + DetectCloaked@Mines: + Range: 4c0 + DetectionTypes: Mine + RequiresCondition: !(empdisable || being-warped) + GivesBountyCA: + Percentage: 2 + Voiced: + VoiceSet: TrpcVoice + ExternalCondition@InspirationCmsr: + Condition: cmsr-inspiration + ExternalCondition@InspirationOvld: + Condition: ovld-inspiration + ExternalCondition@InspirationTrpc: + Condition: trpc-inspiration + SpeedMultiplier@InspirationCmsr: + Modifier: 112 + RequiresCondition: cmsr-inspiration || ovld-inspiration || trpc-inspiration + Sellable: + RefundPercent: 10 + Encyclopedia: + Category: Soviets/Vehicles + EncyclopediaExtras: + AdditionalInfo: Requires Infantry Doctrine. + +IFV: + Inherits: ^Tank + Inherits@GAINSEXPERIENCE: ^GainsExperience + Inherits@TRANSPORT: ^Transport + Inherits@NOUNLOADCHRONO: ^NoUnloadWhenChronoshifted + Inherits@SLOWCRUSH: ^SlowedByCrushing + Inherits@COMMANDOSKULL: ^CommandoSkull + Inherits@A2GPROTECTION: ^AirToGroundProtection + Buildable: + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 170 + Prerequisites: radarorrepair, ~vehicles.allies, ~techlevel.medium + Description: Adaptable infantry transport. Tooltip: Name: Infantry Fighting Vehicle + RequiresCondition: !full || nochange + Tooltip@gunturr: + Name: MG IFV + RequiresCondition: gunturr + Tooltip@fragturr: + Name: Grenade IFV + RequiresCondition: fragturr + Tooltip@samturr: + Name: Missile IFV + RequiresCondition: samturr + Tooltip@engturr: + Name: Engineer IFV + RequiresCondition: engturr + Tooltip@mechturr: + Name: Repair IFV + RequiresCondition: mechturr + Tooltip@commturr: + Name: Commando IFV + RequiresCondition: commturr + Tooltip@chemturr: + Name: Chemical IFV + RequiresCondition: chemturr + Tooltip@medturr: + Name: Medical IFV + RequiresCondition: medturr + Tooltip@ivanturr: + Name: Explosive IFV + RequiresCondition: ivanturr + Tooltip@flamturr: + Name: Flamethrower IFV + RequiresCondition: flamturr + Tooltip@spyturr: + Name: Spy IFV + RequiresCondition: spyturr + Tooltip@sealturr: + Name: SEAL IFV + RequiresCondition: sealturr + Tooltip@acolturr: + Name: Laser IFV + RequiresCondition: acolturr + Tooltip@snipturr: + Name: Sniper IFV + RequiresCondition: snipturr + Tooltip@desoturr: + Name: Desolator IFV + RequiresCondition: desoturr + Tooltip@testurr: + Name: Tesla IFV + RequiresCondition: testurr + Tooltip@rmbcturr: + Name: Cyborg Elite IFV + RequiresCondition: rmbcturr + Tooltip@enliturr: + Name: Enlightened IFV + RequiresCondition: enliturr + Tooltip@bhturr: + Name: Black Hand IFV + RequiresCondition: bhturr + Tooltip@mortchemturr: + Name: Chemical Mortar IFV + RequiresCondition: mortchemturr + Tooltip@mortcryoturr: + Name: Cryo Mortar IFV + RequiresCondition: mortcryoturr + Tooltip@mortsonicturr: + Name: Sonic Mortar IFV + RequiresCondition: mortsonicturr + Tooltip@discturr: + Name: Plasma Disc IFV + RequiresCondition: discturr + Tooltip@sharturr: + Name: Shard IFV + RequiresCondition: sharturr + Tooltip@ggiturr: + Name: GGI IFV + RequiresCondition: ggiturr + Tooltip@psyturr: + Name: Psychic IFV + RequiresCondition: psyturr + Tooltip@cryoturr: + Name: Cryo IFV + RequiresCondition: cryoturr + Tooltip@enfoturr: + Name: Enforcer IFV + RequiresCondition: enfoturr + Tooltip@ztrpturr: + Name: Zone Trooper IFV + RequiresCondition: ztrpturr + Tooltip@zdefturr: + Name: Zone Defender IFV + RequiresCondition: zdefturr + Tooltip@zraiturr: + Name: Zone Raider IFV + RequiresCondition: zraiturr + Tooltip@tigrturr: + Name: Tiger Guard IFV + RequiresCondition: tigrturr + Tooltip@disinturr: + Name: Disintegrator IFV + RequiresCondition: disinturr + Tooltip@implturr: + Name: Impaler IFV + RequiresCondition: implturr + Tooltip@stlkturr: + Name: Stalker IFV + RequiresCondition: stlkturr + Tooltip@hoplturr: + Name: Hoplite IFV + RequiresCondition: hoplturr + Tooltip@cmsrturr: + Name: Commissar IFV + RequiresCondition: cmsrturr + Tooltip@shadturr: + Name: Shadow IFV + RequiresCondition: shadturr + Tooltip@hackturr: + Name: Hacker IFV + RequiresCondition: hackturr + Tooltip@confturr: + Name: Confessor IFV + RequiresCondition: confturr + Tooltip@reapturr: + Name: Reaper IFV + RequiresCondition: reapturr + TooltipExtras: + Strengths: • Strong vs Aircraft, Heavy Armor + Weaknesses: • Weak vs Infantry + Attributes: • Weapon/function changes depending on infantry passenger + RequiresCondition: !full || samturr || ggiturr || disinturr || tigrturr || nochange + TooltipExtras@gunturr: + Strengths: • Strong vs Infantry, Light Armor + Weaknesses: • Weak vs Heavy Armor, Defenses\n• Cannot attack Aircraft + IsStandard: false + RequiresCondition: gunturr || enfoturr || shadturr + TooltipExtras@fragturr: + Strengths: • Strong vs Buildings, Defenses, Light Armor + Weaknesses: • Weak vs Heavy Armor\n• Cannot attack Aircraft + IsStandard: false + RequiresCondition: fragturr + TooltipExtras@mechturr: + Weaknesses: • Unarmed + Attributes: • Repairs friendly vehicles + IsStandard: false + RequiresCondition: mechturr + TooltipExtras@engturr: + Weaknesses: • Unarmed + Attributes: • Captures structures + IsStandard: false + RequiresCondition: engturr + TooltipExtras@commturr: + Strengths: • Strong vs Infantry + Weaknesses: • Cannot attack Aircraft, Vehicles, Buildings + IsStandard: false + RequiresCondition: commturr || sealturr + TooltipExtras@medturr: + Weaknesses: • Unarmed + Attributes: • Heals friendly infantry + IsStandard: false + RequiresCondition: medturr + TooltipExtras@ivanturr: + Strengths: • Strong vs Everything + Weaknesses: • Self-destructs + IsStandard: false + RequiresCondition: ivanturr + TooltipExtras@flamturr: + Strengths: • Strong vs Infantry, Light Armor, Buildings + Weaknesses: • Weak vs Heavy Armor\n• Cannot attack Aircraft + IsStandard: false + RequiresCondition: flamturr || chemturr || hoplturr + TooltipExtras@spyturr: + Weaknesses: • Cannot deal damage + Attributes: • Targets are reaveled and take increased damage + IsStandard: false + RequiresCondition: spyturr + TooltipExtras@rmbcturr: + Strengths: • Strong vs Heavy Armor, Light Armor, Infantry + Weaknesses: • Cannot attack Aircraft + IsStandard: false + RequiresCondition: rmbcturr + TooltipExtras@snipturr: + Strengths: • Strong vs Infantry, Light Armor, Heavy Armor + Weaknesses: • Weak vs Defenses, Buildings\n• Cannot attack Aircraft + IsStandard: false + RequiresCondition: snipturr + TooltipExtras@desoturr: + Strengths: • Strong vs Infantry, Light Armor + Weaknesses: • Weak vs Heavy Armor, Defenses, Buildings\n• Cannot attack Aircraft + IsStandard: false + RequiresCondition: desoturr || acolturr || sharturr || implturr || stlkturr + TooltipExtras@testurr: + Strengths: • Strong vs Infantry, Heavy Armor, Light Armor + Weaknesses: • Cannot attack Aircraft + IsStandard: false + RequiresCondition: testurr + TooltipExtras@bhturr: + Strengths: • Strong vs Heavy Armor, Light Armor + Weaknesses: • Weak vs Buildings, Defenses\n• Cannot attack Aircraft + IsStandard: false + RequiresCondition: bhturr || enliturr + TooltipExtras@ztrpturr: + Strengths: • Strong vs Heavy Armor, Light Armor, Defenses + Weaknesses: • Weak vs Infantry, Buildings\n• Cannot attack Aircraft + IsStandard: false + RequiresCondition: ztrpturr || zdefturr + TooltipExtras@zraiturr: + Strengths: • Strong vs Light Armor, Buildings + Weaknesses: • Cannot attack Aircraft + IsStandard: false + RequiresCondition: zraiturr + TooltipExtras@psyturr: + Strengths: • Strong vs Infantry, Vehicles + Weaknesses: • Cannot deal damage\n• Cannot attack Aircraft + Attributes: • Can mind control enemy units\n• Control lost if passenger exits + IsStandard: false + RequiresCondition: psyturr + TooltipExtras@hackturr: + Strengths: • Strong vs Defenses, Buildings + Weaknesses: • Cannot deal damage\n• Control lost if passenger exits + IsStandard: false + RequiresCondition: hackturr + TooltipExtras@cryoturr: + Strengths: • Strong vs Infantry, Light Armor + Weaknesses: • Weak vs Buildings, Defenses\n• Cannot attack Aircraft + Attributes: • Slows enemy units and makes them take increased damage + IsStandard: false + RequiresCondition: cryoturr + TooltipExtras@reapturr: + Strengths: • Strong vs Infantry, Light Armor, Buildings + Weaknesses: • Weak vs Heavy Armor + IsStandard: false + RequiresCondition: reapturr + TooltipExtras@confturr: + Strengths: • Strong vs Infantry, Light Armor + Weaknesses: • Weak vs Heavy Armor, Defenses, Buildings\n• Cannot attack Aircraft + Attributes: • Explosion causes units to attack indiscriminately + IsStandard: false + RequiresCondition: confturr + Valued: + Cost: 750 UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 28000 + HP: 32000 Armor: - Type: Heavy + Type: Light Mobile: - Speed: 90 - PauseOnCondition: notmobile || being-captured || empdisable || being-warped || driver-dead + Speed: 100 RevealsShroud: - MinRange: 5c0 + MinRange: 4c0 Range: 6c0 RevealGeneratedShroud: False RequiresCondition: !spyturr RevealsShroud@GAPGEN: - Range: 5c0 + Range: 4c0 RevealsShroud@SPY: - Range: 10c0 - MinRange: 5c0 + Range: 7c0 + MinRange: 4c0 RevealGeneratedShroud: False RequiresCondition: spyturr DetectCloaked@SPY: Range: 6c0 - CloakTypes: Cloak, Thief + DetectionTypes: Cloak, AirCloak RequiresCondition: spyturr && !(empdisable || being-warped) Turreted: TurnSpeed: 40 @@ -3732,7 +6445,7 @@ IFV: Weapon: M60mgIFV MuzzleSequence: muzzle LocalOffset: 250,0,150 - RequiresCondition: gunturr || tecnturr + RequiresCondition: gunturr || shadturr || cmsrturr Armament@E2: Weapon: 25mmFRAG MuzzleSequence: muzzle @@ -3741,21 +6454,30 @@ IFV: Armament@E3: Weapon: IFVRocketsE LocalOffset: 192,100,176, 192,-100,176 - RequiresCondition: samturr && !cryr-upgrade + RequiresCondition: (samturr || ggiturr) && !cryw-upgrade && !tibcore-upgrade Armament@E3AA: Name: secondary Weapon: IFVRocketsAAE LocalOffset: 192,100,176, 192,-100,176 - RequiresCondition: samturr && !cryr-upgrade + RequiresCondition: (samturr || ggiturr) && !cryw-upgrade && !tibcore-upgrade Armament@E3CRYO: Weapon: IFVRocketsE.CRYO LocalOffset: 192,100,176, 192,-100,176 - RequiresCondition: samturr && cryr-upgrade + RequiresCondition: (samturr || ggiturr) && cryw-upgrade Armament@E3CRYOAA: Name: secondary Weapon: IFVRocketsAAE.CRYO LocalOffset: 192,100,176, 192,-100,176 - RequiresCondition: samturr && cryr-upgrade + RequiresCondition: (samturr || ggiturr) && cryw-upgrade + Armament@E3TIB: + Weapon: IFVRocketsE.TibCore + LocalOffset: 192,100,176, 192,-100,176 + RequiresCondition: (samturr || ggiturr) && tibcore-upgrade && !cryw-upgrade + Armament@E3TIBAA: + Name: secondary + Weapon: IFVRocketsAAE.TibCore + LocalOffset: 192,100,176, 192,-100,176 + RequiresCondition: (samturr || ggiturr) && tibcore-upgrade && !cryw-upgrade Armament@E4: Weapon: FireballLauncher Recoil: 85 @@ -3775,24 +6497,43 @@ IFV: MuzzleSequence: muzzle LocalOffset: 560,0,200 RequiresCondition: commturr - Armament@SNIP: + Armament@SEAL: + Weapon: SealIFVGun + MuzzleSequence: muzzle + LocalOffset: 560,0,200 + RequiresCondition: sealturr + Armament@Sniper: Weapon: SniperIFVGun MuzzleSequence: muzzle LocalOffset: 560,0,200 - RequiresCondition: snipturr + RequiresCondition: snipturr && !apb-upgrade + Armament@SniperUpg: + Weapon: SniperIFVGun.UPG + MuzzleSequence: muzzle + LocalOffset: 560,0,200 + RequiresCondition: snipturr && apb-upgrade Armament@Shok: Weapon: TTankZap LocalOffset: 0,0,213 RequiresCondition: testurr Armament@Deso: - Weapon: RadBeamWeapon + Weapon: DesolatorBeam LocalOffset: 400,0,213 RequiresCondition: desoturr + Armament@ENLI: + Weapon: EnlightenedBeam + MuzzleSequence: muzzle + LocalOffset: 192,100,200, 192,-100,200 + RequiresCondition: enliturr Armament@RMBC: Weapon: CyCannon MuzzleSequence: muzzle - LocalOffset: 560,0,200 + LocalOffset: 192,100,200, 192,-100,200 RequiresCondition: rmbcturr + Armament@BH: + Weapon: BlackHandFlamer + LocalOffset: 150,0,150 + RequiresCondition: bhturr Armament@Heal: Weapon: Heal Cursor: heal @@ -3807,7 +6548,7 @@ IFV: OutsideRangeCursor: repair TargetRelationships: Ally ForceTargetRelationships: None - RequiresCondition: engturr + RequiresCondition: mechturr MuzzleSequence: emp-overlay MuzzlePalette: tseffect-ignore-lighting-alpha75 Armament@defuse: @@ -3815,112 +6556,310 @@ IFV: Cursor: goldwrench OutsideRangeCursor: goldwrench TargetRelationships: Ally - RequiresCondition: engturr + RequiresCondition: engturr || mechturr ForceTargetRelationships: None Name: secondary - AutoTargetPriority@defuse: - ValidTargets: C4Attached - InvalidTargets: NoAutoTarget - ValidRelationships: Ally Armament@Acol: - Weapon: LaserTur + Weapon: IFVLaser LocalOffset: 385,0,300 RequiresCondition: acolturr + Armament@Disc: + Weapon: IntruderDiscs + LocalOffset: 250,0,300 + RequiresCondition: discturr + Armament@Shard: + Weapon: ShardWalkerShards + LocalOffset: 300,0,300 + RequiresCondition: sharturr + Armament@ChemMortar: + Weapon: ChemicalMortar + LocalOffset: 300,0,400 + RequiresCondition: mortchemturr + Armament@CryoMortar: + Weapon: CryoMortar + LocalOffset: 300,0,400 + RequiresCondition: mortcryoturr + Armament@SonicMortar: + Weapon: SonicMortar + LocalOffset: 300,0,400 + RequiresCondition: mortsonicturr Armament@IVAN: Weapon: IvanIFVTargeting RequiresCondition: ivanturr - WithIdleOverlay@SPINNER: - Sequence: spinner - PauseOnCondition: empdisable || being-warped + Armament@CryoTrooper: + Weapon: CryoSprayer + LocalOffset: 150,0,150 + RequiresCondition: cryoturr + Armament@Enforcer: + Weapon: EnforcerIFVShotgun + LocalOffset: 385,0,300 + RequiresCondition: enfoturr + MuzzleSequence: muzzle + Armament@Disintegrator: + Weapon: DisintegratorIFVBeam + LocalOffset: 350,0,250 + RequiresCondition: disinturr + Armament@DisintegratorAA: + Weapon: DisintegratorIFVBeamAA + LocalOffset: 350,0,250 + RequiresCondition: disinturr + Armament@Hoplite: + Weapon: HopliteIFVGun + LocalOffset: 100,0,300 + RequiresCondition: hoplturr + Armament@ZoneTrooper: + Weapon: ZoneTrooperRailgun + LocalOffset: 350,0,250 + RequiresCondition: ztrpturr + Armament@ZoneDefender: + Weapon: ZoneDefenderGun + LocalOffset: 350,0,250 + RequiresCondition: zdefturr + Armament@ZoneRaider: + Weapon: ZoneRaiderGrenade + LocalOffset: 350,0,250 + RequiresCondition: zraiturr + Armament@TigerGuard: + Weapon: TigerGuardMissile + LocalOffset: 192,100,256, 192,-100,256 + RequiresCondition: tigrturr + Armament@TigerGuardMissileAA: + Weapon: TigerGuardMissileAA + LocalOffset: 192,100,256, 192,-100,256 + RequiresCondition: tigrturr + Armament@Impaler: + Weapon: ImpalerSpikePassenger + LocalOffset: 450,0,250 + RequiresCondition: implturr + Armament@Stalker: + Weapon: StalkerShards + LocalOffset: 350,0,300 + RequiresCondition: stlkturr + Armament@Confessor: + Weapon: HallucinationGrenade + LocalOffset: 300,0,400 + RequiresCondition: confturr + Armament@Reaper: + Weapon: CyborgReaperMissiles + LocalOffset: 192,100,256, 192,-100,256 + RequiresCondition: reapturr + Armament@Spy: + Weapon: TargetPainter + LocalOffset: 0,0,250 RequiresCondition: spyturr - Offset: 0,0,200 + AttackSoundsCA@REPAIRSOUND: + Sounds: repair11.aud + RequiresCondition: mechturr + Armaments: primary WithIdleOverlay@TESLA: Sequence: tesla PauseOnCondition: empdisable || being-warped RequiresCondition: testurr + WithIdleOverlay@PSY: + Sequence: psy + RequiresCondition: psyturr + Palette: scrin + WithIdleOverlay@HACK: + Sequence: hack + RequiresCondition: hackturr AttackTurreted: - PauseOnCondition: empdisable || being-warped - RequiresCondition: !spyturr + PauseOnCondition: empdisable || being-warped || blinded WithMuzzleOverlay: - WithSpriteTurret@samturr: + WithSpriteTurret@defaultturr: RequiresCondition: !full || nochange Sequence: turret - WithSpriteTurret@samturr2: + WithSpriteTurret@samturr: RequiresCondition: samturr - Sequence: turret2 + Sequence: turret-rocket + WithSpriteTurret@ggiturr: + RequiresCondition: ggiturr + Sequence: turret-ggi WithSpriteTurret@gun: - RequiresCondition: gunturr || tecnturr - Sequence: turret3 + RequiresCondition: gunturr || shadturr || cmsrturr + Sequence: turret-mg WithSpriteTurret@frg: - Sequence: turret4 + Sequence: turret-frag RequiresCondition: fragturr WithSpriteTurret@fla: - Sequence: turret5 + Sequence: turret-flame RequiresCondition: flamturr WithSpriteTurret@che: - Sequence: turret6 + Sequence: turret-chem RequiresCondition: chemturr WithSpriteTurret@las: - Sequence: turret7 - RequiresCondition: acolturr || rmbcturr + Sequence: turret-laser + RequiresCondition: acolturr WithSpriteTurret@des: - Sequence: turret8 + Sequence: turret-rad RequiresCondition: desoturr WithSpriteTurret@com: - Sequence: turret9 - RequiresCondition: commturr || snipturr - WithSpriteTurret@rep: - Sequence: turret10 + Sequence: turret-cmdo + RequiresCondition: commturr || sealturr + WithSpriteTurret@mech: + Sequence: turret-mech + RequiresCondition: mechturr + WithSpriteTurret@snip: + Sequence: turret-snip + RequiresCondition: snipturr + WithSpriteTurret@enli: + Sequence: turret-enli + RequiresCondition: enliturr + WithSpriteTurret@rmbc: + Sequence: turret-rmbc + RequiresCondition: rmbcturr + WithSpriteTurret@bh: + Sequence: turret-bh + RequiresCondition: bhturr + WithSpriteTurret@disc: + Sequence: turret-pdisc + RequiresCondition: discturr + WithSpriteTurret@shar: + Sequence: turret-shard + RequiresCondition: sharturr + WithSpriteTurret@mort: + Sequence: turret-mort + RequiresCondition: mortchemturr || mortcryoturr || mortsonicturr + WithSpriteTurret@cryo: + Sequence: turret-cryo + RequiresCondition: cryoturr + WithSpriteTurret@enfo: + Sequence: turret-enfo + RequiresCondition: enfoturr + WithSpriteTurret@engi: + Sequence: turret-engi RequiresCondition: engturr + WithSpriteTurret@ztrp: + Sequence: turret-ztrp + RequiresCondition: ztrpturr + WithSpriteTurret@zdef: + Sequence: turret-zdef + RequiresCondition: zdefturr + WithSpriteTurret@zrai: + Sequence: turret-zrai + RequiresCondition: zraiturr + WithSpriteTurret@tigr: + Sequence: turret-tigr + RequiresCondition: tigrturr + WithSpriteTurret@hopl: + Sequence: turret-hopl + RequiresCondition: hoplturr + WithSpriteTurret@impl: + Sequence: turret-impl + RequiresCondition: implturr + WithSpriteTurret@stlk: + Sequence: turret-stlk + RequiresCondition: stlkturr + Palette: playerscrin + WithSpriteTurret@disin: + Sequence: turret-disin + RequiresCondition: disinturr + WithSpriteTurret@conf: + Sequence: turret-conf + RequiresCondition: confturr + WithSpriteTurret@reap: + Sequence: turret-reap + RequiresCondition: reapturr + WithSpriteTurret@ARCHER: + Sequence: turret-arch + RequiresCondition: spyturr Cargo: - Types: Infantry + Types: Infantry, Hacker MaxWeight: 1 LoadingCondition: notmobile LoadedCondition: full PassengerConditions: e1: gunturr - e2: fragturr - e3: samturr - e4: flamturr n1: gunturr n1c: gunturr + s1: gunturr + e2: fragturr n2: fragturr + e3: samturr n3: samturr n3c: samturr + e4: flamturr n4: flamturr + u3: ggiturr + u3r2: ggiturr n5: chemturr e8: desoturr + deso: desoturr e6: engturr n6: engturr - mech: engturr - mort: chemturr + s6: engturr + mech: mechturr + cmec: mechturr + arti: mechturr + mort.chem: mortchemturr + mort.cryo: mortcryoturr + mort.sonic: mortsonicturr shok: testurr + ttrp: testurr + ztrp: ztrpturr + zrai: zraiturr + zdef: zdefturr rmbo: commturr bori: commturr e7: commturr - sab: spyturr + cryt: cryoturr + enfo: enfoturr + hopl: hoplturr + tigr: tigrturr + seal: sealturr snip: snipturr - spy: spyturr - thf: spyturr - medi: medturr + assa: snipturr + hack: hackturr + conf: confturr acol: acolturr - acol.upg: acolturr + tplr: acolturr + cscr: acolturr + reap: reapturr + enli: enliturr rmbc: rmbcturr - tecn: tecnturr - s1: gunturr - s2: chemturr - s3: samturr - s4: acolturr - s6: engturr + s2: sharturr + evis: sharturr + impl: implturr + stlk: stlkturr + s3: disinturr + s4: discturr + mrdr: discturr + medi: medturr smedi: medturr - mast: commturr - feed: ivanturr - dog: nochange + mast: psyturr + yuri: psyturr + bh: bhturr + shad: shadturr + sab: shadturr + cmsr: cmsrturr + brst: ivanturr + tdog: ivanturr ivan: ivanturr - bh: flamturr - shad: spyturr + spy: spyturr + thf: spyturr + dog: spyturr + cdog: spyturr + wchr: spyturr + tecn: nochange + c1: nochange + c2: nochange + c3: nochange + c4: nochange + c5: nochange + c6: nochange + c7: nochange + c8: nochange + c9: nochange + c10: nochange + WithCargoSounds: + EnterSounds: vifvtran.aud + ExitSounds: vifvtran.aud + CargoBlocked: + RequiresCondition: mindcontrolled ProducibleWithLevel: Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded WithIdleOverlay@MEDIC: Sequence: medic PauseOnCondition: empdisable || being-warped @@ -3931,7 +6870,7 @@ IFV: PauseOnCondition: empdisable || being-warped RequiresCondition: ivanturr Offset: 0,0,40 - Explodes@IVAN: + FireWarheadsOnDeath@IVAN: Weapon: MicroNuke EmptyWeapon: MicroNuke DamageSource: Killer @@ -3942,98 +6881,322 @@ IFV: DamageMultiplier@IRONCURTAIN: RequiresCondition: invulnerability && !ivanturr KillsSelf: - RequiresCondition: ivanturr && (invulnerability || triggered || berserk) + RequiresCondition: ivanturr && (invulnerability || tibstealth || triggered || berserk) + Passenger: + CargoCondition: passenger ProximityExternalCondition@MEDIC: - RequiresCondition: medturr + RequiresCondition: medturr && !passenger EnableSound: heal2.aud Condition: hospitalheal Range: 3c512 WithRangeCircle@MEDIC: + Type: IFVHeal Color: 00FF0080 Range: 3c512 RequiresCondition: medturr + ProximityExternalCondition@Inspiration: + Range: 5c0 + Condition: cmsr-inspiration + ValidRelationships: Ally + AffectsParent: true + RequiresCondition: cmsrturr && !passenger + WithRadiatingCircle: + EndRadius: 5c0 + Interval: 75 + Duration: 50 + ValidRelationships: Ally + AlwaysShowMaxRange: true + RequiresCondition: cmsrturr Capturable: RequiresCondition: !being-warped && !full Capturable@DRIVER_DEAD: RequiresCondition: driver-dead && !full - Targetable@DRIVERKILL: - RequiresCondition: !driver-dead && !full + Targetable@ChaosImmune: + TargetTypes: ChaosImmune + RequiresCondition: confturr || psyturr || commturr || hackturr + Targetable@MindControlResistant: + TargetTypes: MindControlResistant + RequiresCondition: full + Targetable@MindControlImmune: + TargetTypes: MindControlImmune + RequiresCondition: commturr || psyturr + GrantCondition@IsAA: + Condition: is-aa + RequiresCondition: !full || samturr || ggiturr || disinturr || tigrturr || reapturr || nochange AutoTarget: AttackAnythingCondition: stance-attackanything - ScanRadius: 6 AutoTargetPriority@DEFAULTAA: ValidTargets: Infantry, Vehicle, Water, Underwater, Air, AirSmall, Defense - InvalidTargets: NoAutoTarget - RequiresCondition: (!stance-attackanything && !assault-move) && (!full || samturr) + InvalidTargets: NoAutoTarget, WaterStructure, AntiAirDefense + RequiresCondition: (!stance-attackanything && !assault-move) && is-aa AutoTargetPriority@ATTACKANYTHINGAA: ValidTargets: Infantry, Vehicle, Water, Underwater, Air, AirSmall, Structure, Defense InvalidTargets: NoAutoTarget - RequiresCondition: (stance-attackanything || assault-move) && (!full || samturr) + RequiresCondition: (stance-attackanything || assault-move) && is-aa AutoTargetPriority@DEFAULTAAPRIO: - RequiresCondition: (!stance-attackanything && !assault-move) && (!full || samturr) + RequiresCondition: (!stance-attackanything && !assault-move) && is-aa ValidTargets: Air, AirSmall InvalidTargets: NoAutoTarget Priority: 10 AutoTargetPriority@ATTACKANYTHINGAAPRIO: - RequiresCondition: (!stance-attackanything && !assault-move) && (!full || samturr) + RequiresCondition: (!stance-attackanything && !assault-move) && is-aa ValidTargets: Air, AirSmall InvalidTargets: NoAutoTarget Priority: 10 AutoTargetPriority@DEFAULTG: - RequiresCondition: !stance-attackanything && !assault-move && full && !samturr + RequiresCondition: !maxcontrolled && !stance-attackanything && !assault-move && !is-aa ValidTargets: Infantry, Vehicle, Water, Underwater, Defense - InvalidTargets: NoAutoTarget + InvalidTargets: NoAutoTarget, WaterStructure, AntiAirDefense AutoTargetPriority@ATTACKANYTHINGG: - RequiresCondition: (stance-attackanything || assault-move) && full && !samturr + RequiresCondition: (stance-attackanything || assault-move) && !is-aa ValidTargets: Infantry, Vehicle, Water, Underwater, Structure, Defense, Mine InvalidTargets: NoAutoTarget + AutoTargetPriority@HeavyPrio: + ValidTargets: Heavy + InvalidTargets: NoAutoTarget + Priority: 15 + RequiresCondition: tigrturr AttackMove: AssaultMoveCondition: assault-move - AutoTargetPriority@DEFAULTREPAIR: - ValidTargets: Vehicle, Ship - RequiresCondition: engturr + AutoTargetPriority@REPAIR: + ValidTargets: Repairable + RequiresCondition: mechturr + ValidRelationships: Ally + AutoTargetPriority@HEAL: + ValidTargets: Healable + RequiresCondition: medturr + ValidRelationships: Ally + AutoTargetPriority@defuse: + ValidTargets: C4Attached, TNTAttached + InvalidTargets: NoAutoTarget ValidRelationships: Ally + GrantConditionOnPrerequisite@APB: + Condition: apb-upgrade + Prerequisites: apb.upgrade GrantConditionOnPrerequisite@CRYO: - Condition: cryr-upgrade - Prerequisites: cryr.upgrade - GrantCondition@CRYO: - Condition: cryr-upgrade - RequiresCondition: cryr-upgrade - ExternalCondition@CRYO: - Condition: cryr-upgrade + Condition: cryw-upgrade + Prerequisites: cryw.upgrade + GrantConditionOnPrerequisite@TibCore: + Condition: tibcore-upgrade + Prerequisites: tibcore.upgrade GuardsSelection@REPAIR: ValidTargets: Vehicle - RequiresCondition: engturr && !stance-attackanything + RequiresCondition: mechturr && !stance-attackanything GuardsSelection@MEDIC: ValidTargets: Infantry RequiresCondition: medturr && !stance-attackanything GuardsSelection@SPY: RequiresCondition: spyturr && !stance-attackanything WithDecoration@COMMANDOSKULL: - RequiresCondition: commturr + RequiresCondition: commturr || psyturr + WithDecoration@SEALSKULL: + RequiresCondition: sealturr + Image: pips + Sequence: pip-seal + Palette: effect + Position: TopLeft + ValidRelationships: Ally, Enemy, Neutral + WithDecoration@CMSR: + RequiresCondition: cmsrturr + Image: pips + Sequence: pip-cmsr + Position: TopLeft + ValidRelationships: Ally, Enemy, Neutral + KeepsDistance: + RequiresCondition: engturr || mechturr || medturr || spyturr + DamageTypeDamageMultiplier@A2GPROTECTION: + RequiresCondition: is-aa + AmbientSoundCA@BlackHand: + SoundFiles: flamer-loop1.aud + InitialSound: flamer-start1.aud + FinalSound: flamer-end1.aud + RequiresCondition: bhturr && attacking + InitialSoundLength: 20 + AmbientSoundCA@Cryo: + SoundFiles: cryobeam.aud + InitialSound: cryobeamstart.aud + FinalSound: cryobeamend.aud + RequiresCondition: cryoturr && attacking + InitialSoundLength: 10 + GrantConditionOnAttackCA@BlackHand: + Condition: attacking + RevokeDelay: 3 + RequiresCondition: bhturr + GrantConditionOnAttackCA@Cryo: + Condition: attacking + RevokeDelay: 6 + RequiresCondition: cryoturr + ChronoshiftableCA: + RequiresCondition: !ivanturr && !being-warped + ChronoshiftableCA@Ivan: + Image: chrono + ExplodeInstead: true + RequiresCondition: ivanturr && !being-warped + DamageMultiplier@GGI: + RequiresCondition: ggiturr + Modifier: 80 + FirepowerMultiplier@GGI: + RequiresCondition: ggiturr + Modifier: 105 + RangeMultiplier@GGI: + RequiresCondition: ggiturr + Modifier: 115 + DamageMultiplier@Enforcer: + RequiresCondition: enfoturr + Modifier: 50 + SpeedMultiplier@EnfoTigr: + RequiresCondition: tigrturr || enfoturr + Modifier: 60 + Captures@Engineer: + CaptureTypes: building + CaptureDelay: 300 + ConsumedByCapture: false + RequiresCondition: !capture-interrupt && engturr + CaptureManager: + CapturingCondition: capturing + GrantConditionOnDamage@InterruptCapture: + Condition: capture-interrupt + Duration: 1 + GrantCondition@CaptureDecloak: + Condition: cloak-force-disabled + RequiresCondition: capturing + Cloak@NORMAL: + InitialDelay: 75 + CloakDelay: 76 + CloakSound: trans1.aud + CloakedCondition: hidden + UncloakSound: appear1md.aud + CloakStyle: Palette + CloakedPalette: cloak + IsPlayerPalette: false + UncloakOn: Attack, Unload, Infiltrate, Demolish, Dock, Damage, Heal + RequiresCondition: (shadturr || stlkturr) && !cloak-force-disabled && !capturing && !being-warped && !empdisable && !driver-dead && !parachute + PauseOnCondition: invisibility + Cloak@CRATE-CLOAK: + RequiresCondition: crate-cloak && !(cloak-force-disabled || invisibility || hidden || driver-dead) + GrantConditionOnDamageState@UNCLOAK: + Condition: cloak-force-disabled + ValidDamageStates: Critical + Armament@Psi: + Weapon: EnslaveInfantry + LocalOffset: 200,0,300 + RequiresCondition: psyturr + Armament@PsiVehicle: + Weapon: EnslaveVehicle + LocalOffset: 200,0,300 + RequiresCondition: psyturr + MindController@MC: + ControlType: MindControl + Capacity: 3 + ControlSounds: iyurat1a.aud + ReleaseSounds: yuri-release.aud + MaxControlledCondition: maxcontrolled + ControlAtCapacityBehaviour: DetonateOldest + SlaveDeployEffect: Detonate + SlaveDetonateWeapon: DetonateSlave + SlaveKillDamageTypes: BulletDeath + ExperienceFromControl: 100 + TargetTypeTicksToControl: + MindControlResistant: 105 + RequiresCondition: psyturr + WithMindControlArc@MC: + ControlType: MindControl + Color: c71585 + Transparency: 55 + Offset: 0,0,300 + Angle: 32 + Width: 116 + Armament@Hack: + Weapon: Hack + TargetRelationships: Enemy, Neutral + RequiresCondition: hackturr + LocalOffset: 200,0,300 + MindController@HACK: + ControlType: Hack + ArmamentNames: primary + Capacity: -1 + TicksToControl: 150 + TicksToRevoke: 25 + InitSounds: hacker-init.aud + InitSoundControllerOnly: true + ControlSounds: hacker-hacked.aud + AutoUndeploy: true + TargetTypeTicksToControl: + Structure: 300 + RequiresCondition: hackturr + WithMindControlArc@HACK: + ControlType: Hack + Color: 1ce312 + Transparency: 65 + Angle: 60 + Width: 86 + Offset: 0,0,300 + MindControllerCapacityModifier@RANK-1: + Amount: 1 + RequiresCondition: rank-veteran == 1 + MindControllerCapacityModifier@RANK-2: + Amount: 2 + RequiresCondition: rank-veteran == 2 + MindControllerCapacityModifier@RANK-ELITE: + Amount: 3 + RequiresCondition: rank-elite + RejectsOrders@AnathemaNoUnload: + Reject: Unload + RequiresCondition: anathema + WithColoredSelectionBox@INVIS: + RequiresCondition: invisibility || hidden + ColorSource: Player + WithEjectedCasings@MGCasings: + RequiresCondition: gunturr + CasingWeapon: BrassDebris3 + CasingSpawnLocalOffset: 0,-125,200 + CasingTargetOffset: 0, -500, 0 + WithEjectedCasings@CommandoCasings: + RequiresCondition: sealturr || commturr + CasingWeapon: BrassDebris + CasingSpawnLocalOffset: 0,-225,200 + CasingTargetOffset: 0, -600, 0 + Encyclopedia: + Category: Allies/Vehicles + EncyclopediaExtras: + Name: IFV IFV.AI: Inherits: ^Tank Inherits@GAINSEXPERIENCE: ^GainsExperience - Inherits@BERSERK: ^Berserk Inherits@SLOWCRUSH: ^SlowedByCrushing Buildable: - Queue: Vehicle - BuildPaletteOrder: 120 - Prerequisites: anyradar, ~vehicles.allies, ~botplayer, ~techlevel.low - Description: Adaptable infantry transport.\n Can attack Aircraft.\n Strong vs Aircraft, Vehicles\n Weak vs Infantry\n Special Ability: Transform - Valued: - Cost: 650 + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 170 + Prerequisites: anyradar, ~vehicles.allies, ~botplayer, ~techlevel.medium + Description: Adaptable infantry transport. Tooltip: Name: Infantry Fighting Vehicle + RequiresCondition: !gunturr && !samturr + Tooltip@gunturr: + Name: MG IFV + RequiresCondition: gunturr + Tooltip@samturr: + Name: Missile IFV + RequiresCondition: samturr + TooltipExtras: + Strengths: • Strong vs Aircraft, Heavy Armor + Weaknesses: • Weak vs Infantry + Attributes: • Weapon/function changes depending on infantry passenger + RequiresCondition: defturr || samturr + TooltipExtras@gunturr: + Strengths: • Strong vs Infantry, Light Armor, Buildings + Weaknesses: • Weak vs Heavy Armor, Defenses\n• Cannot attack Aircraft + IsStandard: false + RequiresCondition: gunturr + Valued: + Cost: 750 UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 28000 - Armor: - Type: Heavy + HP: 27000 Mobile: - Speed: 90 + Speed: 100 RevealsShroud: MinRange: 4c0 Range: 6c0 @@ -4060,33 +7223,38 @@ IFV.AI: Armament@E3: Weapon: IFVRocketsE LocalOffset: 192,100,176, 192,-100,176 - RequiresCondition: samturr && !cryr-upgrade + RequiresCondition: samturr && !cryw-upgrade Armament@E3AA: Name: secondary Weapon: IFVRocketsAAE LocalOffset: 192,100,176, 192,-100,176 - RequiresCondition: samturr && !cryr-upgrade + RequiresCondition: samturr && !cryw-upgrade Armament@E3CRYO: Weapon: IFVRocketsE.CRYO LocalOffset: 192,100,176, 192,-100,176 - RequiresCondition: samturr && cryr-upgrade + RequiresCondition: samturr && cryw-upgrade Armament@E3CRYOAA: Name: secondary Weapon: IFVRocketsAAE.CRYO LocalOffset: 192,100,176, 192,-100,176 - RequiresCondition: samturr && cryr-upgrade + RequiresCondition: samturr && cryw-upgrade + WithEjectedCasings: + RequiresCondition: gunturr + CasingWeapon: BrassDebris + CasingSpawnLocalOffset: 0,-125,200 + CasingTargetOffset: 0, -500, 0 AttackTurreted: - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded WithMuzzleOverlay: WithSpriteTurret@default: Sequence: turret RequiresCondition: defturr WithSpriteTurret@gun: RequiresCondition: gunturr - Sequence: turret3 + Sequence: turret-mg WithSpriteTurret@samturr: RequiresCondition: samturr - Sequence: turret2 + Sequence: turret-rocket RenderSprites: Image: ifv GrantRandomCondition: @@ -4099,7 +7267,7 @@ IFV.AI: ScanRadius: 6 AutoTargetPriority@DEFAULTAA: ValidTargets: Infantry, Vehicle, Water, Underwater, Air, Defense - InvalidTargets: NoAutoTarget + InvalidTargets: NoAutoTarget, WaterStructure, AntiAirDefense RequiresCondition: (!stance-attackanything && !assault-move) && (defturr || samturr) AutoTargetPriority@ATTACKANYTHINGAA: ValidTargets: Infantry, Vehicle, Water, Underwater, Air, Structure, Defense @@ -4118,7 +7286,7 @@ IFV.AI: AutoTargetPriority@DEFAULTG: RequiresCondition: !stance-attackanything && !assault-move && !defturr && !samturr ValidTargets: Infantry, Vehicle, Water, Underwater, Defense - InvalidTargets: NoAutoTarget + InvalidTargets: NoAutoTarget, WaterStructure, AntiAirDefense AutoTargetPriority@ATTACKANYTHINGG: RequiresCondition: (stance-attackanything || assault-move) && !defturr && !samturr ValidTargets: Infantry, Vehicle, Water, Underwater, Structure, Defense, Mine @@ -4126,96 +7294,155 @@ IFV.AI: AttackMove: AssaultMoveCondition: assault-move GrantConditionOnPrerequisite@CRYO: - Condition: cryr-upgrade - Prerequisites: cryr.upgrade + Condition: cryw-upgrade + Prerequisites: cryw.upgrade GrantCondition@CRYO: - Condition: cryr-upgrade - RequiresCondition: cryr-upgrade + Condition: cryw-upgrade + RequiresCondition: cryw-upgrade ExternalCondition@CRYO: - Condition: cryr-upgrade + Condition: cryw-upgrade -XO: - Inherits: ^VehicleTD - Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove - Inherits@GAINSEXPERIENCE: ^GainsExperience - Inherits@BERSERK: ^Berserk +RECK: + Inherits: IFV + Inherits@HeavyArmor: ^HeavyArmor + Inherits@InfiltratorStolenTech: ^InfiltratorStolenTech RenderSprites: + Image: reck Valued: - Cost: 650 - Tooltip: - Name: X-O Powersuit - UpdatesPlayerStatistics: - AddToArmyValue: true + Cost: 1000 Health: - HP: 22000 - Armor: - Type: Light + HP: 52000 Mobile: - TurnSpeed: 40 - Speed: 49 - Voice: Move - Passenger: - CustomPipType: red - Weight: 2 - Voice: Move - RevealsShroud: - MinRange: 4c0 - Range: 6c0 - RevealGeneratedShroud: False - RevealsShroud@GAPGEN: - Range: 4c0 - Voiced: - VoiceSet: GhostVoice - WithMoveAnimation: - WithAttackAnimation: - Sequence: shoot - Armament@PRIMARY: - Weapon: M60mgXO - LocalOffset: 400,-220,180 - MuzzleSequence: muzzle - Armament@SECONDARY: - Name: secondary - Weapon: XOLaser - LocalOffset: 400,220,180 - AttackFrontal: - PauseOnCondition: being-warped - Voice: Attack - WithMuzzleOverlay: - Parachutable: - FallRate: 130 - WithIdleAnimation@DESCENDING: - RequiresCondition: parachute - Interval: 3 - Sequences: descend - -WithParachute: + Speed: 60 + TurnSpeed: 24 + Buildable: + BuildPaletteOrder: 500 + Prerequisites: radarorrepair, ~vehicles.reck + Tooltip: + Name: Reckoner + Tooltip@gunturr: + Name: MG Reckoner + Tooltip@fragturr: + Name: Grenade Reckoner + Tooltip@samturr: + Name: Missile Reckoner + Tooltip@mechturr: + Name: Repair Reckoner + Tooltip@engturr: + Name: Engineer Reckoner + Tooltip@commturr: + Name: Commando Reckoner + Tooltip@chemturr: + Name: Chemical Reckoner + Tooltip@medturr: + Name: Medical Reckoner + Tooltip@ivanturr: + Name: Explosive Reckoner + Tooltip@flamturr: + Name: Flamethrower Reckoner + Tooltip@spyturr: + Name: Spy Reckoner + Tooltip@sealturr: + Name: SEAL Reckoner + Tooltip@acolturr: + Name: Laser Reckoner + Tooltip@snipturr: + Name: Sniper Reckoner + Tooltip@desoturr: + Name: Desolator Reckoner + Tooltip@testurr: + Name: Tesla Reckoner + Tooltip@rmbcturr: + Name: Cyborg Elite Reckoner + Tooltip@enliturr: + Name: Enlightened Reckoner + Tooltip@bhturr: + Name: Black Hand Reckoner + Tooltip@mortchemturr: + Name: Chemical Mortar Reckoner + Tooltip@mortcryoturr: + Name: Cryo Mortar Reckoner + Tooltip@mortsonicturr: + Name: Sonic Mortar Reckoner + Tooltip@discturr: + Name: Plasma Disc Reckoner + Tooltip@sharturr: + Name: Shard Reckoner + Tooltip@ggiturr: + Name: GGI Reckoner + Tooltip@psyturr: + Name: Psychic Reckoner + Tooltip@enfoturr: + Name: Enforcer Reckoner + Tooltip@ztrpturr: + Name: Zone Trooper Reckoner + Tooltip@zdefturr: + Name: Zone Defender Reckoner + Tooltip@zraiturr: + Name: Zone Raider Reckoner + Tooltip@tigrturr: + Name: Tiger Guard Reckoner + Tooltip@disinturr: + Name: Disintegrator Reckoner + Tooltip@implturr: + Name: Impaler Reckoner + Tooltip@stlkturr: + Name: Stalker Reckoner + Tooltip@hoplturr: + Name: Hoplite Reckoner + Tooltip@cmsrturr: + Name: Commissar Reckoner + Tooltip@shadturr: + Name: Shadow Reckoner + Tooltip@hackturr: + Name: Hacker Reckoner + Tooltip@confturr: + Name: Confessor Reckoner + Tooltip@reapturr: + Name: Reaper Reckoner + ReloadDelayMultiplier@CyborgElite: + RequiresCondition: rmbcturr + Modifier: 80 + SpeedMultiplier@TigerGuard: + Modifier: 90 + Encyclopedia: + Category: Nod/Stolen Technology + EncyclopediaExtras: + AdditionalInfo: Stolen from Allied War Factory. + -Name: TITN: Inherits: ^TankTD Inherits@GAINSEXPERIENCE: ^GainsExperience - Inherits@AUTOTARGET: ^AutoTargetAllAssaultMove - Inherits@BERSERK: ^Berserk + Inherits@AUTOTARGET: ^AutoTargetAllAssaultMovePrioritizeGround Inherits@SHRAPNEL: ^ThrowsShrapnel + Inherits@HeavyArmor: ^HeavyArmor + Inherits@TANKBUSTERVULN: ^TankBusterVulnerability + Inherits@GYRO: ^GyroStabilizers + Inherits@UpgradeOverlay: ^UpgradeOverlay Buildable: - Queue: Vehicle - BuildPaletteOrder: 303 + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 257 IconPalette: chrometd Prerequisites: gtek, ~vehicles.talon, ~!railgun.upgrade, ~techlevel.high - Description: Tough combat battle-mech.\n Can attack Aircraft.\n Strong vs Vehicles, Infantry + Description: Tough, slow combat battle-mech. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor, Infantry + Attributes: • Can crush smaller vehicles and concrete walls\n• Self repairs to 50% out of combat Valued: Cost: 2000 Selectable: - Bounds: 30,40,0,0 + Bounds: 1280, 1706 + DecorationBounds: 1280, 1706, 0, -100 Tooltip: Name: Titan UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 95000 - Armor: - Type: Heavy + HP: 110000 Mobile: Locomotor: sheavytracked - Speed: 40 + Speed: 43 Voice: Move Passenger: CustomPipType: red @@ -4247,16 +7474,27 @@ TITN: LocalYaw: -100,100 Recoil: 43 MuzzleSequence: muzzle + PauseOnCondition: gyrostabilizers + Armament@SECONDARYGYRO: + Name: secondary + Weapon: TitanTusk.Gyro + LocalOffset: -85,-384,340 + LocalYaw: -100,100 + Recoil: 43 + MuzzleSequence: muzzle + PauseOnCondition: !gyrostabilizers Turreted: TurnSpeed: 10 Offset: 0,0,0 AttackTurreted: - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded Armaments: primary, secondary Voice: Attack + AttackMove: + Voice: Attack WithMuzzleOverlay: Voiced: - VoiceSet: GhostVoice + VoiceSet: TitnVoice ChangesHealth@DEFAULT: PercentageStep: 1 Delay: 25 @@ -4264,21 +7502,44 @@ TITN: DamageCooldown: 150 Carryable: LocalOffset: 0,0,700 + -Crushable: ProducibleWithLevel: Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded SpawnActorOnDeath: Actor: TITN.Husk RequiresCondition: !being-warped + WithIdleOverlay@MINDCONTROL: + Offset: 0,0,512 + ReplacedInQueue: + Actors: titn.rail + Upgradeable@RAILGUN: + Type: railgun.upgrade + UpgradingCondition: upgrading + Actor: titn.rail + UpgradeAtActors: fix, rep, srep + BuildDuration: 100 + RequiresCondition: !mindcontrolled + RangeMultiplier@SEEK: + RequiresCondition: seek && !gyrostabilizers + RangeMultiplier@SEEK2: + RequiresCondition: seek2 && !gyrostabilizers + RangeMultiplier@SEEK3: + RequiresCondition: seek3 && !gyrostabilizers + Encyclopedia: + Category: GDI/Vehicles + EncyclopediaExtras: + Subfaction: talon TITN.RAIL: Inherits: TITN Tooltip: Name: Railgun Titan Buildable: - BuildPaletteOrder: 304 - Prerequisites: ~gtek, ~vehicles.talon, ~railgun.upgrade, ~techlevel.high - WithSpriteTurret@UPG: - Sequence: turret + BuildPaletteOrder: 258 + Prerequisites: gtek, ~vehicles.talon, ~railgun.upgrade, ~techlevel.high Armament@PRIMARY: Weapon: TitanRailgun LocalOffset: 830,290,170 @@ -4290,32 +7551,42 @@ TITN.RAIL: LocalOffset: 830,290,170 SpawnActorOnDeath: Actor: TITN.RAIL.Husk + -ReplacedInQueue: + -Upgradeable@RAILGUN: + -WithDecoration@UpgradeOverlay: JUGG: Inherits: ^TankTD Inherits@GAINSEXPERIENCE: ^GainsExperience Inherits@AUTOTARGET: ^AutoTargetAllAssaultMove - Inherits@BERSERK: ^Berserk Inherits@SHRAPNEL: ^ThrowsShrapnel + Inherits@GYRO: ^GyroStabilizers + Inherits@HeavyArmor: ^HeavyArmor Tooltip: Name: Juggernaut Buildable: - BuildPaletteOrder: 350 - Queue: Vehicle + BuildPaletteOrder: 261 + Queue: VehicleSQ, VehicleMQ IconPalette: chrometd - Description: Tough artillery battle-mech.\n Strong vs Buildings, Defenses, Infantry\n Weak vs Aircraft - Prerequisites: upgc, ~vehicles.talon, ~techlevel.high + Description: Tough artillery battle-mech. + Prerequisites: gtek, ~vehicles.talon, ~techlevel.high + TooltipExtras: + Strengths: • Strong vs Buildings, Defenses, Infantry, Light Armor + Weaknesses: • Cannot attack Aircraft\n• Has difficulty hitting moving targets\n• Cannot fire while moving + Attributes: • Can crush smaller vehicles and concrete walls Mobile: Locomotor: sheavytracked - Speed: 40 + Speed: 43 Voice: Move PauseOnCondition: aiming || being-captured || empdisable || being-warped || driver-dead || notmobile + BlockedCursor: move UpdatesPlayerStatistics: AddToArmyValue: true Selectable: - Bounds: 30,40,0,0 + Bounds: 1280, 1706 + DecorationBounds: 1280, 1706, 0, -100 Valued: - Cost: 1500 + Cost: 2000 QuantizeFacingsFromSequence: Sequence: stand WithFacingSpriteBody: @@ -4323,14 +7594,37 @@ JUGG: WithMoveAnimation: MoveSequence: run WithSpriteTurret: + AttackMove: + AttackMoveCondition: attack-move + Voice: Attack Armament@PRIMARY: Weapon: JuggernautGun - LocalOffset: 830,0,500, 830,100,500, 830,-100,500 + LocalOffset: 700,0,650, 700,100,650, 700,-100,650 + Recoil: 171 + RecoilRecovery: 30 + MuzzleSequence: muzzle + PauseOnCondition: moving || reloading-secondary || gyrostabilizers + ReloadingCondition: reloading-primary + Armament@SECONDARY: + Name: secondary + Weapon: RocketShells + LocalOffset: 700,0,650, 700,100,650, 700,-100,650 Recoil: 171 RecoilRecovery: 30 MuzzleSequence: muzzle + PauseOnCondition: moving || reloading-primary || !gyrostabilizers + ReloadingCondition: reloading-secondary + Armament@TARGETTER: + Name: targetter + LocalOffset: 700,0,650, 700,100,650, 700,-100,650 + Weapon: JuggernautGunTargeting + PauseOnCondition: reloading-primary || reloading-secondary + RequiresCondition: attack-move || assault-move AttackTurreted: + Armaments: primary, secondary, targetter + PauseOnCondition: empdisable || being-warped || blinded TargetFrozenActors: True + Voice: Attack ForceFireIgnoresActors: True WithMuzzleOverlay: RevealsShroud: @@ -4343,129 +7637,147 @@ JUGG: Offset: -20,0,20 TurnSpeed: 12 Health: - HP: 50000 - Armor: - Type: Heavy + HP: 62000 Passenger: Weight: 3 Voice: Move Voiced: - VoiceSet: DisrVoice - GrantConditionOnAttack: + VoiceSet: JuggVoice + GrantConditionOnAttack@AIMING: + ArmamentNames: primary, secondary, targetter Condition: aiming - RevokeDelay: 50 + RevokeDelay: 15 RevokeAll: false + GrantConditionOnAttack@SECONDARYFIRING: + ArmamentNames: secondary + Condition: secondary-firing + RevokeDelay: 15 + MaximumInstances: 3 + GrantCondition@SECONDARYFIRING: + Condition: gyrostabilizers + RequiresCondition: secondary-firing + GrantConditionOnMovement@MOVING: + ValidMovementTypes: Horizontal, Vertical, Turn + Condition: moving + RangeMultiplier@GyroPassive: + Modifier: 150 + RequiresCondition: gyro-upgrade + RangeMultiplier@GYRO: + Modifier: 135 + ReloadDelayMultiplier@GYRO: + Modifier: 135 Carryable: LocalOffset: 0,0,700 + -Crushable: ProducibleWithLevel: Prerequisites: vehicles.upgraded - Explodes: + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded + FireWarheadsOnDeath: Weapon: ArtilleryExplode LoadedChance: 75 SpawnActorOnDeath: Actor: JUGG.Husk + WithIdleOverlay@MINDCONTROL: + Offset: 0,0,512 + Encyclopedia: + Category: GDI/Vehicles + EncyclopediaExtras: + Subfaction: talon TTRK: Inherits: DTRK RenderSprites: - PlayerPalette: overlayplayertd + PlayerPalette: playertd Buildable: - BuildPaletteOrder: 400 - Prerequisites: techcenter, ~vehicles.ttrk, ~techlevel.high - Description: Truck actively armed with\n a Tiberium bomb. Has very weak armor. + BuildPaletteOrder: 510 + Prerequisites: techcenter.any, ~vehicles.ttrk, ~techlevel.high + Description: Truck carrying a Tiberium bomb. + TooltipExtras: + Weaknesses: • Very weak armor + Attributes: • Special Ability: Detonate Tooltip: Name: Toxin Truck - Explodes: + FireWarheadsOnDeath: Weapon: UnitExplodeToxinTruck EmptyWeapon: UnitExplodeToxinTruck + Encyclopedia: + Category: Other/Tech Units DISR: Inherits: ^TankTD Inherits@GAINSEXPERIENCE: ^GainsExperience Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove - Inherits@BERSERK: ^Berserk + Inherits@HeavyArmor: ^HeavyArmor Valued: - Cost: 1400 + Cost: 1600 Tooltip: Name: Disruptor UpdatesPlayerStatistics: AddToArmyValue: true Buildable: - Queue: Vehicle - BuildPaletteOrder: 320 + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 259 IconPalette: chrometd Prerequisites: gtek, ~vehicles.zocom, ~techlevel.high - Description: Armored high-tech vehicle with long-range sonic armament.\n Strong vs Buildings, Defenses, Light Armor, Infantry\n Weak vs Aircraft + Description: Armored high-tech vehicle with medium-range sonic armament. + TooltipExtras: + Strengths: • Strong vs Buildings, Defenses, Light Armor, Infantry + Weaknesses: • Weak vs Heavy Armor\n• Cannot attack Aircraft + Attributes: • Slows enemy movement and rate of fire (with upgrade) Health: - HP: 70000 - Armor: - Type: Heavy + HP: 66000 Mobile: TurnSpeed: 16 - Speed: 43 + Speed: 46 Voice: Move Passenger: Weight: 2 Voice: Move RevealsShroud: MinRange: 4c0 - Range: 7c0 + Range: 6c0 RevealGeneratedShroud: False RevealsShroud@GAPGEN: Range: 4c0 - Armament@PRIMARY: - Weapon: SonicZap - LocalOffset: 0,0,200 - RequiresCondition: !sonic-upgrade && !seek - Armament@SECONDARY: - Weapon: SonicZapVisual - Name: secondary - LocalOffset: 0,0,200 - RequiresCondition: !sonic-upgrade && !seek - Armament@PRIMARYSEEK: - Weapon: SonicZap.Seek - LocalOffset: 0,0,200 - RequiresCondition: !sonic-upgrade && seek - Armament@SECONDARYSEEK: - Weapon: SonicZapVisual.Seek - Name: secondary - LocalOffset: 0,0,200 - RequiresCondition: !sonic-upgrade && seek - Armament@PRIMARYUPG: - Weapon: SonicZap.UPG - LocalOffset: 0,0,200 - RequiresCondition: sonic-upgrade && !seek - Armament@SECONDARYUPG: - Weapon: SonicZapVisual.UPG - Name: secondary - LocalOffset: 0,0,200 - RequiresCondition: sonic-upgrade && !seek - Armament@PRIMARYSEEKUPG: - Weapon: SonicZap.Seek.UPG - LocalOffset: 0,0,200 - RequiresCondition: seek && sonic-upgrade - Armament@SECONDARYSEEKUPG: - Weapon: SonicZapVisual.Seek.UPG - Name: secondary - LocalOffset: 0,0,200 - RequiresCondition: seek && sonic-upgrade + Armament@primary: + Weapon: DisruptorPulse + LocalOffset: -100,0,200 + RequiresCondition: !sonic-upgrade && !seek3 + Armament@primaryAmp: + Weapon: DisruptorPulse.Amp + LocalOffset: -100,0,200 + RequiresCondition: sonic-upgrade && !seek3 + Armament@primarySeek3: + Weapon: DisruptorPulse.Seek3 + LocalOffset: -100,0,200 + RequiresCondition: !sonic-upgrade && seek3 + Armament@primaryAmpSeek3: + Weapon: DisruptorPulse.Amp.Seek3 + LocalOffset: -100,0,200 + RequiresCondition: sonic-upgrade && seek3 Turreted: - TurnSpeed: 20 + TurnSpeed: 16 Offset: -300,0,0 AttackTurreted: - PauseOnCondition: empdisable || being-warped - OpportunityFire: False + PauseOnCondition: empdisable || being-warped || blinded + Voice: Attack + AttackMove: Voice: Attack WithSpriteTurret: Selectable: - DecorationBounds: 44,38,0,-4 + DecorationBounds: 1877, 1621, 0, -170 Carryable: LocalOffset: 0,0,500 ProducibleWithLevel: Prerequisites: vehicles.upgraded - Targetable: + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded + Targetable@Disruptor: RequiresCondition: !being-warped - TargetTypes: Ground, Vehicle, C4, Disruptor + TargetTypes: Disruptor Voiced: VoiceSet: DisrVoice -Crushable: @@ -4476,12 +7788,17 @@ DISR: Condition: sonic-upgrade Prerequisites: sonic.upgrade -RangeMultiplier@SEEK: + -RangeMultiplier@SEEK2: + -RangeMultiplier@SEEK3: + Encyclopedia: + Category: GDI/Vehicles + EncyclopediaExtras: + Subfaction: zocom HSAM: Inherits: ^VehicleTD Inherits@GAINSEXPERIENCE: ^GainsExperience - Inherits@AUTOTARGET: ^AutoTargetAllAssaultMove - Inherits@BERSERK: ^Berserk + Inherits@AUTOTARGET: ^AutoTargetAllAssaultMovePrioritizeGround Inherits@SLOWCRUSH: ^SlowedByCrushing Inherits@HOVERTRAIL: ^HoverTrail RenderSprites: @@ -4495,48 +7812,55 @@ HSAM: Buildable: BuildPaletteOrder: 191 Prerequisites: anyradar, ~vehicles.eagle, ~techlevel.medium - Queue: Vehicle + Queue: VehicleSQ, VehicleMQ IconPalette: chrometd - Description: Prototype Hover Multiple Launch Rocket System.\nLong-range guided artillery.\n Can attack Aircraft.\n Has weak armor.\n Strong vs Buildings, Defenses, Infantry, Light Armor + Description: Prototype Hover Multiple Launch Rocket System. Long-range guided artillery with anti-air capability. + TooltipExtras: + Strengths: • Strong vs Buildings, Defenses, Infantry, Light Armor + Weaknesses: • Weak vs Heavy Armor + Attributes: • Can traverse water Mobile: - Speed: 90 + Speed: 86 Locomotor: hover + Voice: Move + Passenger: + Voice: Move Health: - HP: 14000 + HP: 19000 Armor: Type: Light RevealsShroud: MinRange: 4c0 - Range: 5c0 + Range: 6c0 RevealGeneratedShroud: False RevealsShroud@GAPGEN: Range: 4c0 Turreted: - TurnSpeed: 20 + TurnSpeed: 16 Offset: -200,0,0 Hovers: BobDistance: -35 RequiresCondition: !empdisable && !being-warped && !driver-dead - GrantConditionOnTerrain: - TerrainTypes: Water - Condition: onwater - KillsSelf@SINK: - RequiresCondition: onwater && (empdisable || driver-dead) WithShadow: Offset: 43, 128, 0 ZOffset: -129 - AutoTarget: - ScanRadius: 10 + RequiresCondition: !invisibility AttackTurreted: TargetFrozenActors: True ForceFireIgnoresActors: false - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded + Voice: Attack + AttackMove: + Voice: Attack WithSpriteTurret: - Explodes: + FireWarheadsOnDeath: Weapon: ArtilleryExplode LoadedChance: 75 ProducibleWithLevel: Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded GrantConditionOnPrerequisite@HSONIC: Condition: hypersonic-upgrade Prerequisites: hypersonic.upgrade @@ -4551,85 +7875,114 @@ HSAM: LocalOffset: 213,128,0, 213,-128,0 LocalYaw: 100, -100 RequiresCondition: !hypersonic-upgrade && !hammerhead-upgrade && !hailstorm-upgrade + PauseOnCondition: reloading-secondary + ReloadingCondition: reloading-primary Armament@SECONDARY: Name: secondary Weapon: 227mmAAH LocalOffset: 213,-128,0, 213,128,0 LocalYaw: 100, -100 RequiresCondition: !hypersonic-upgrade && !hammerhead-upgrade && !hailstorm-upgrade + PauseOnCondition: reloading-primary + ReloadingCondition: reloading-secondary Armament@PRIMARYUPG1: - Weapon: 227mm.Hypersonic + Weapon: 227mmH.Hypersonic LocalOffset: 213,128,0, 213,-128,0 - LocalYaw: 100, -100 + LocalYaw: 75, -75 RequiresCondition: hypersonic-upgrade + PauseOnCondition: reloading-secondary + ReloadingCondition: reloading-primary Armament@SECONDARYUPG1: Name: secondary Weapon: 227mmAA.Hypersonic LocalOffset: 213,-128,0, 213,128,0 - LocalYaw: 100, -100 + LocalYaw: 75, -75 RequiresCondition: hypersonic-upgrade + PauseOnCondition: reloading-primary + ReloadingCondition: reloading-secondary Armament@PRIMARYUPG2: - Weapon: 227mm.Hammerhead + Weapon: 227mmH.Hammerhead LocalOffset: 213,128,0, 213,-128,0 LocalYaw: 100, -100 RequiresCondition: hammerhead-upgrade + PauseOnCondition: reloading-secondary + ReloadingCondition: reloading-primary Armament@SECONDARYUPG2: Name: secondary Weapon: 227mmAA.Hammerhead LocalOffset: 213,-128,0, 213,128,0 LocalYaw: 100, -100 RequiresCondition: hammerhead-upgrade + PauseOnCondition: reloading-primary + ReloadingCondition: reloading-secondary Armament@PRIMARYUPG3: - Weapon: 227mm.Hailstorm + Weapon: 227mmH.Hailstorm LocalOffset: 213,128,0, 213,-128,0 LocalYaw: 100, -100 RequiresCondition: hailstorm-upgrade + PauseOnCondition: reloading-secondary + ReloadingCondition: reloading-primary Armament@SECONDARYUPG3: Name: secondary Weapon: 227mmAA.Hailstorm LocalOffset: 213,-128,0, 213,128,0 LocalYaw: 100, -100 RequiresCondition: hailstorm-upgrade + PauseOnCondition: reloading-primary + ReloadingCondition: reloading-secondary + GrantConditionOnTerrain@ONWATER: + TerrainTypes: Water + Condition: onwater + KillsSelf@SINK: + RequiresCondition: onwater && (empdisable || driver-dead) + Targetable@ONWATER: + TargetTypes: Water, Ship + RequiresCondition: onwater + Voiced: + VoiceSet: MsamVoice + Encyclopedia: + Category: GDI/Vehicles + EncyclopediaExtras: + Subfaction: eagle RTNK: Inherits: ^Tank Inherits@GAINSEXPERIENCE: ^GainsExperience Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove - Inherits@BERSERK: ^Berserk Inherits@SLOWCRUSH: ^SlightlySlowedByCrushing + Inherits@HeavyArmor: ^HeavyArmor + Inherits@TANKBUSTERVULN: ^TankBusterVulnerability Buildable: - Queue: Vehicle - BuildPaletteOrder: 71 + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 120 Prerequisites: ~vehicles.england, ~techlevel.low - Description: Advanced battle tank that can disguise when stationary.\n Strong vs Vehicles\n Weak vs Defenses, Aircraft\n Special Ability: Disguise + Description: Advanced battle tank that can disguise when stationary. + TooltipExtras: + Strengths: • Strong vs Light Armor, Heavy Armor + Weaknesses: • Weak vs Defenses, Infantry\n• Cannot attack Aircraft + Attributes: • Disguised when not moving\n• Deals additional damage firing from disguised state Valued: - Cost: 825 + Cost: 750 Tooltip: Name: Mirage Tank - RequiresCondition: !tree - MirageTooltip@Tree: - Name: Mirage Tank - GenericName: Civilian building - GenericVisibility: Enemy, Neutral - RequiresCondition: tree Mirage: - RequiresCondition: !empdisable && !being-warped && !driver-dead - RevealOn: Attack, Move, Heal, SelfHeal + RequiresCondition: !cloak-force-disabled && !invisibility && !driver-dead && !empdisable && !being-warped + RevealOn: Attack, Dock, Move, Damage, Heal MirageCondition: tree DefaultTargetTypes: v08, v09, v10, v11, v12, v13, v14, v15, v16, v17, v18 - InitialDelay: 100 + InitialDelay: 99 RevealDelay: 100 + EffectiveOwner: Self WithMirageSpriteBody: RequiresCondition: tree + IsPlayerPalette: false Name: tree UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 47000 - Armor: - Type: Heavy + HP: 32000 Mobile: - Speed: 66 + Speed: 100 Voice: Move Passenger: Voice: Move @@ -4649,7 +8002,9 @@ RTNK: MuzzleSequence: muzzle AttackTurreted: Voice: Attack - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded + AttackMove: + Voice: Attack WithMuzzleOverlay: WithFacingSpriteBody: RequiresCondition: !tree @@ -4659,45 +8014,65 @@ RTNK: Actor: RTNK.Husk RequiresCondition: !being-warped Cloak@NORMAL: - InitialDelay: 100 + InitialDelay: 99 CloakDelay: 100 CloakSound: vmirat2a.aud CloakedCondition: hidden - UncloakSound: appear1.aud - UncloakOn: Attack, Unload, Infiltrate, Demolish, Dock, Move, Damage, Heal, SelfHeal - Palette: player + UncloakSound: appear1md.aud + UncloakOn: Attack, Dock, Move, Damage, Heal + CloakStyle: Palette + CloakedPalette: player IsPlayerPalette: false - RequiresCondition: !cloak-force-disabled && !invisibility && !driver-dead && !empdisable && !being-warped + RequiresCondition: !cloak-force-disabled && !being-warped && !empdisable && !driver-dead + PauseOnCondition: invisibility Cloak@CRATE-CLOAK: RequiresCondition: crate-cloak && !(cloak-force-disabled || invisibility || hidden || driver-dead) GrantConditionOnDamageState@UNCLOAK: - Condition: cloak-force-disabled - ValidDamageStates: Critical, Heavy + ValidDamageStates: Critical Selectable: - DecorationBounds: 28,28 + DecorationBounds: 1194, 1194 ProducibleWithLevel: Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded Voiced: VoiceSet: MirageVoice WithDecoration@disguise: - Image: pips - Sequence: pip-disguise - Palette: effect - Position: TopRight RequiresCondition: hidden + Image: gpsdot + Sequence: MirageTank + Palette: player + IsPlayerPalette: true + Position: Center + WithColoredSelectionBox@INVIS: + RequiresCondition: invisibility || hidden + ColorSource: Player + FirepowerMultiplier@Ambush: + Modifier: 150 + RequiresCondition: hidden + GrantConditionToAttached@Cloak: + Condition: inherited-cloak + RequiresCondition: hidden || invisibility + Encyclopedia: + Category: Allies/Vehicles + EncyclopediaExtras: + Subfaction: england V3RL: Inherits: ^Vehicle Inherits@GAINSEXPERIENCE: ^GainsExperience Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove - Inherits@BERSERK: ^Berserk Buildable: - Queue: Vehicle - BuildPaletteOrder: 250 - Prerequisites: stek, ~vehicles.soviet, ~techlevel.high - Description: Extreme long-range rocket artillery.\n Rockets can be shot down by static anti-air defenses.\n Strong vs Buildings, Defenses, Infantry\n Weak vs Tanks, Aircraft + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 243 + Prerequisites: stek, ~vehicles.ukraine, ~techlevel.high + Description: Extreme long-range rocket artillery. + TooltipExtras: + Strengths: • Strong vs Buildings, Defenses, Infantry, Light Armor + Weaknesses: • Cannot attack Aircraft\n• Has difficulty hitting moving targets\n• Rockets can be shot down by static anti-air defenses Valued: - Cost: 1500 + Cost: 1250 Tooltip: Name: V3 Launcher UpdatesPlayerStatistics: @@ -4707,7 +8082,7 @@ V3RL: Armor: Type: Light Mobile: - Speed: 43 + Speed: 46 TurnSpeed: 16 Voice: Move PauseOnCondition: launching || being-captured || empdisable || being-warped || driver-dead || notmobile @@ -4724,7 +8099,10 @@ V3RL: AttackFrontal: TargetFrozenActors: True ForceFireIgnoresActors: True - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded + Voice: Attack + FacingTolerance: 0 + AttackMove: Voice: Attack WithFacingSpriteBody: RequiresCondition: loaded @@ -4735,26 +8113,36 @@ V3RL: Name: reloading MissileSpawnerMaster: Actors: V3 - RespawnTicks: 250 + RespawnTicks: 235 LoadedCondition: loaded LaunchingCondition: launching + SpawnOffset: 200,0,350 WithSpawnerMasterPipsDecoration: Position: BottomLeft Margin: 4, 3 RequiresSelection: true - Explodes: - Weapon: BarrelExplode + FireWarheadsOnDeath: + Weapon: UnitExplodeFlame ProducibleWithLevel: Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded Selectable: - DecorationBounds: 28,28 + DecorationBounds: 1194, 1194 Voiced: VoiceSet: V3Voice - Exit: - SpawnOffset: 0,-128,0 - ProductionCostMultiplier@UkraineBonus: - Multiplier: 90 - Prerequisites: vehicles.ukraine + Encyclopedia: + Category: Soviets/Vehicles + EncyclopediaExtras: + RenderPreviewActor: v3rl.preview + Subfaction: ukraine + +V3RL.Preview: + Inherits: ^PreviewDummy + RenderSprites: + Image: v3rl + WithFacingSpriteBody: V3: Inherits: ^ShootableMissile @@ -4762,38 +8150,46 @@ V3: Cost: 50 Tooltip: Name: V3 Rocket - Tooltip@NoRow: - Name: V3 Rocket Health: HP: 5000 BallisticMissile: - LaunchAngle: 128 + LaunchAngle: 100 Speed: 165 + MinAirborneAltitude: 256 + AirborneCondition: airborne LeavesTrailsCA: - Image: smokey2 - Palette: tseffect-ignore-lighting-alpha75 - MovingInterval: 3 + Image: smokey3 + Sequences: idle, idle2, idle3, idle4 + MovingInterval: 2 Type: CenterPosition Offsets: -200, 0, 0 MissileSpawnerSlave: SpawnedExplodes: Weapon: V3Weapon - EmptyWeapon: VisualExplodeHusk + Type: Footprint RequiresCondition: !airborne - Explodes: + FireWarheadsOnDeath: Weapon: V3ExplodeAirborne RequiresCondition: airborne + FireProjectilesOnDeath@Debris: + Weapons: SmallDebris + Pieces: 3, 5 + Range: 1c511, 3c0 + RequiresCondition: airborne TNKD: Inherits: ^Tank Inherits@GAINSEXPERIENCE: ^GainsExperience - Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove - Inherits@BERSERK: ^Berserk + Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMovePrioritizeVehicles + Inherits@HeavyArmor: ^HeavyArmor Buildable: - Queue: Vehicle - BuildPaletteOrder: 110 - Prerequisites: ~vehicles.germany, anyradar, ~techlevel.low - Description: German tank destroyer.\n Strong vs Tanks\n Weak vs Infantry, Buildings, Defenses, Light Armor, Aircraft + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 171 + Prerequisites: ~vehicles.germany, anyradar, ~techlevel.medium + Description: German tank destroyer. + TooltipExtras: + Strengths: • Strong vs Heavy Armor + Weaknesses: • Weak vs Infantry, Buildings, Defenses, Light Armor\n• Cannot attack Aircraft Valued: Cost: 1150 Tooltip: @@ -4802,11 +8198,9 @@ TNKD: UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 46000 - Armor: - Type: Heavy + HP: 38000 Mobile: - Speed: 56 + Speed: 60 TurnSpeed: 16 Voice: Move Passenger: @@ -4827,7 +8221,9 @@ TNKD: LocalOffset: 868,0,0 MuzzleSequence: muzzle AttackTurreted: - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded + Voice: Attack + AttackMove: Voice: Attack WithMuzzleOverlay: WithSpriteTurret: @@ -4838,27 +8234,37 @@ TNKD: VoiceSet: TnkdVoice ProducibleWithLevel: Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded Selectable: - DecorationBounds: 28,28 - AutoTargetPriority@DEFAULT: - ValidTargets: Infantry, Water, Underwater, Defense - AutoTargetPriority@ATTACKANYTHING: - ValidTargets: Infantry, Water, Underwater, Structure, Defense, Mine - AutoTargetPriority@TANKDEFAULT: - RequiresCondition: !stance-attackanything && !assault-move - ValidTargets: Vehicle - InvalidTargets: NoAutoTarget, WaterStructure - Priority: 10 - AutoTargetPriority@TANKATTACKANYTHING: - RequiresCondition: (stance-attackanything || assault-move) - ValidTargets: Vehicle - InvalidTargets: NoAutoTarget - Priority: 10 + DecorationBounds: 1194, 1194 + Encyclopedia: + Category: Allies/Vehicles + EncyclopediaExtras: + Subfaction: germany + +TNKD.TEMP: + Inherits: TNKD + Inherits@TEMPINC: ^TemporalReinforcement + RenderSprites: + Image: tnkd + FireWarheadsOnDeath: + RequiresCondition: !warpout + -ActorLostNotification: + -SpawnActorOnDeath: + -Buildable: + -ChronoshiftableCA: + -HealthCapDamageMultiplier@CHRONO: + -MapEditorData: + -Encyclopedia: + -EncyclopediaExtras: MSAR: Inherits: ^VehicleTD + Inherits@SELECTION: ^SelectableSupportUnit Valued: - Cost: 1200 + Cost: 1250 Tooltip: Name: Mobile Sensor Array RequiresCondition: !deployed @@ -4868,18 +8274,21 @@ MSAR: UpdatesPlayerStatistics: AddToArmyValue: true Buildable: - Queue: Vehicle - BuildPaletteOrder: 370 + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 321 IconPalette: chrometd - Prerequisites: anyradar, ~vehicles.gdi, ~techlevel.high - BuildDurationModifier: 50 - Description: When deployed, provides radar and increases nearby ground unit view range.\n Detects cloaked units.\n Unarmed + Prerequisites: anyradar, ~vehicles.gdi, ~techlevel.medium + Description: When deployed, detects enemy vehicles, aircraft and structures within a large radius. + TooltipExtras: + Weaknesses: • Unarmed + Attributes: • Detects cloaked units (when deployed)\n• Increases nearby ground unit vision range (when deployed)\n• Special Ability: Activate Sensor Array Health: - HP: 22000 + HP: 24000 Armor: - Type: Heavy + Type: Light Mobile: - Speed: 66 + Speed: 72 + ImmovableCondition: deployed RequireForceMoveCondition: !undeployed RevealsShroud: MinRange: 4c0 @@ -4889,10 +8298,6 @@ MSAR: Range: 4c0 RenderSprites: Image: msar - Repairable: - RequireForceMoveCondition: !undeployed - Passenger: - RequireForceMoveCondition: !undeployed GrantCondition@PREVIEWWORKAROUND: Condition: real-actor WithMakeAnimation: @@ -4910,56 +8315,60 @@ MSAR: DeployedCondition: deployed UndeployedCondition: undeployed Facing: 660 - AllowedTerrainTypes: Clear, Road, Rough + AllowedTerrainTypes: Clear, Road, Rough, Ore, Gems, Tiberium, BlueTiberium DeploySounds: placbldg.aud UndeploySounds: clicky1.aud UndeployOnMove: true UndeployOnPickup: true DetectCloaked@Deployed: - Range: 12c0 - CloakTypes: Cloak, Thief - RequiresCondition: deployed && !(empdisable || being-warped) - WithRangeCircle@Deployed: - Range: 12c0 - Color: 999999AA + Range: 10c0 + DetectionTypes: Cloak, AirCloak RequiresCondition: deployed && !(empdisable || being-warped) ProvidesRadar: RequiresCondition: deployed && !(empdisable || being-warped) Selectable: - DecorationBounds: 30,30 + DecorationBounds: 1280, 1280 + Passenger: + CargoCondition: passenger ProximityExternalCondition@Bino: Condition: bino Range: 12c0 EnableSound: dsaping1.aud AffectsParent: False - RequiresCondition: deployed && !(empdisable || being-warped) - Targetable: - TargetTypes: Ground, Vehicle, C4, ChaosImmune + RequiresCondition: deployed && !(empdisable || being-warped) && !passenger RangedGpsRadarProvider: - Range: 18c0 + Range: 24c0 + TargetTypes: Vehicle, Air, Structure RequiresCondition: deployed && !(empdisable || being-warped) WithDetectionCircle: - Range: 18c0 + Range: 24c0 RequiresCondition: deployed && !(empdisable || being-warped) TrailCount: 3 ExternalCondition@JAMMED: Condition: jammed - ProximityExternalCondition@DRONECONTROL: - Condition: radarenabled - Range: 300c0 + ProvidesPrerequisite@radar-active: + Prerequisite: radar-active RequiresCondition: deployed && !(jammed || empdisable || being-warped) + -WithDecoration@BOMBARD: + -WithDecoration@BOMBARD2: + -WithDecoration@BOMBARD3: + Encyclopedia: + Category: GDI/Vehicles PTNK: Inherits: ^Tank Inherits@GAINSEXPERIENCE: ^GainsExperience Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove - Inherits@BERSERK: ^Berserk Inherits@SLOWCRUSH: ^SlowedByCrushing + Inherits@UpgradeOverlay: ^UpgradeOverlay Buildable: - Queue: Vehicle - BuildPaletteOrder: 230 - Prerequisites: anyradar, ~vehicles.allies, ~!pcan.upgrade, ~techlevel.high - Description: Long-range artillery with Prism Tower derived weapon.\n Strong vs Buildings, Defenses, Infantry, Light Armor\n Weak vs Tanks, Aircraft + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 172 + Prerequisites: anyradar, ~vehicles.allies, ~!pcan.upgrade, ~techlevel.medium + Description: Long-range artillery with Prism Tower derived weapon. + TooltipExtras: + Strengths: • Strong vs Infantry, Buildings, Defenses, Light Armor + Weaknesses: • Weak vs Heavy Armor\n• Cannot attack Aircraft Valued: Cost: 1350 Tooltip: @@ -4968,11 +8377,11 @@ PTNK: UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 22000 + HP: 20000 Armor: Type: Light Mobile: - Speed: 66 + Speed: 72 Voice: Move Passenger: Voice: Move @@ -4987,11 +8396,15 @@ PTNK: Offset: 100,0,0 Armament: Weapon: PrisTLaser - LocalOffset: 100,0,180 + LocalOffset: 150,0,250 + MuzzleSequence: muzzle + MuzzlePalette: caneon + WithMuzzleOverlay: AttackTurreted: TargetFrozenActors: True - OpportunityFire: False - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded + Voice: Attack + AttackMove: Voice: Attack WithSpriteTurret: SpawnActorOnDeath: @@ -5001,51 +8414,71 @@ PTNK: VoiceSet: PrismVoice ProducibleWithLevel: Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded Selectable: - DecorationBounds: 28,28 + DecorationBounds: 1194, 1194 + ReplacedInQueue: + Actors: pcan + Upgradeable@PCAN: + Type: pcan.upgrade + UpgradingCondition: upgrading + Actor: pcan + UpgradeAtActors: fix, rep, srep + BuildDuration: 100 + RequiresCondition: !mindcontrolled + Encyclopedia: + Category: Allies/Vehicles PCAN: Inherits: PTNK Buildable: - BuildPaletteOrder: 231 + BuildPaletteOrder: 173 Prerequisites: anyradar, ~vehicles.allies, ~pcan.upgrade, ~techlevel.high - Description: A prototype long range artillery that fires highly focused beams of light.\n Strong vs Buildings, Defenses, Infantry, Light Armor\n Weak vs Tanks, Aircraft + Description: A prototype long-range artillery that fires highly focused beams of light. Tooltip: Name: Prism Cannon + Mobile: + Speed: 60 + TurnSpeed: 12 Armament: Weapon: PrisCLaser - FireDelay: 10 - LocalOffset: 420,0,180 - Mobile: - Speed: 56 - PauseOnCondition: aiming || being-captured || empdisable || being-warped || driver-dead || notmobile - -Turreted: + LocalOffset: 450,0,180 + SpawnActorOnDeath: + Actor: PCAN.Husk + Turreted: + TurnSpeed: 12 + Offset: 0,0,0 -AttackTurreted: - -WithSpriteTurret: - AttackFrontal: + AttackTurretedCharged: TargetFrozenActors: True - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded Voice: Attack - SpawnActorOnDeath: - Actor: PCAN.Husk - GrantConditionOnAttack: - Condition: aiming - RevokeDelay: 20 - RevokeAll: false + ChargeLevel: 15 + ChargingSounds: pcancharge.aud + Voiced: + VoiceSet: PrismCannonVoice + -ReplacedInQueue: + -Upgradeable@PCAN: + -WithDecoration@UpgradeOverlay: WTNK: Inherits: ^TankTD Inherits@GAINSEXPERIENCE: ^GainsExperience Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove - Inherits@BERSERK: ^Berserk RenderSprites: Image: mwtnk Buildable: - Queue: Vehicle - BuildPaletteOrder: 210 + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 203 IconPalette: chrometd - Prerequisites: anyradar, ~vehicles.legion, ~techlevel.high - Description: Prototype MGT-1A microwave gun tank.\n Briefly disables vehicles/defenses\n Strong vs Vehicles, Defenses\n Weak vs Aircraft, Buildings + Prerequisites: anyradar, ~vehicles.legion, ~techlevel.medium + Description: Prototype MGT-1A microwave gun tank. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor, Defenses, Infantry + Weaknesses: • Weak vs Buildings\n• Cannot attack Aircraft + Attributes: • Briefly disables vehicles/defenses\n• Kills crew of vehicles with less than 50% HP (with upgrade)\n• Crewless vehicles capturable by infantry Valued: Cost: 1500 Tooltip: @@ -5056,7 +8489,7 @@ WTNK: Armor: Type: Light Mobile: - Speed: 80 + Speed: 68 Voice: Move Passenger: Voice: Move @@ -5071,24 +8504,22 @@ WTNK: Offset: 0,0,0 Armament@PRIMARY: Weapon: MicrowaveZap - FireDelay: 7 LocalOffset: 500,0,140 MuzzleSequence: muzzle MuzzlePalette: tseffect-ignore-lighting-alpha75 RequiresCondition: !microwave-upgrade Armament@PRIMARYUPG: Weapon: MicrowaveZap.UPG - FireDelay: 7 LocalOffset: 500,0,140 MuzzleSequence: muzzle MuzzlePalette: tseffect-ignore-lighting-alpha75 RequiresCondition: microwave-upgrade - Armament@PRIMARYSOUND: - Weapon: MicrowaveZapSound - AttackTurreted: - TargetFrozenActors: True - OpportunityFire: False - PauseOnCondition: empdisable || being-warped + AttackTurretedCharged: + PauseOnCondition: empdisable || being-warped || blinded + Voice: Attack + ChargeLevel: 9 + ChargingSounds: coreup1.aud + AttackMove: Voice: Attack WithMuzzleOverlay: WithSpriteTurret: @@ -5099,45 +8530,54 @@ WTNK: VoiceSet: MWTnkVoice ProducibleWithLevel: Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded Selectable: - DecorationBounds: 28,28 + DecorationBounds: 1194, 1194 UpdatesPlayerStatistics: AddToArmyValue: true GrantConditionOnPrerequisite@UPG: Condition: microwave-upgrade Prerequisites: microwave.upgrade + Encyclopedia: + Category: Nod/Vehicles + EncyclopediaExtras: + Subfaction: legion #adjust offsets BATF: Inherits: ^Tank Inherits@GAINSEXPERIENCE: ^GainsExperience Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove - Inherits@BERSERK: ^Berserk Inherits@TRANSPORT: ^Transport + Inherits@NOUNLOADCHRONO: ^NoUnloadWhenChronoshifted Inherits@SHRAPNEL: ^ThrowsShrapnel Inherits@COMMANDOSKULL: ^CommandoSkull + Inherits@HeavyArmor: ^HeavyArmor + Inherits@TANKBUSTERVULN: ^TankBusterVulnerability Buildable: - Queue: Vehicle - BuildPaletteOrder: 340 - Prerequisites: infantry.any, atek, ~vehicles.france, ~techlevel.high - Description: Tough infantry transport\nwith weapon ports for infantry.\n Special Ability: Can crush enemy vehicles. + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 223 + Prerequisites: atek, ~vehicles.france, ~techlevel.high + Description: Tough infantry transport with weapon ports for infantry to fire from. + TooltipExtras: + Attributes: • Can crush smaller vehicles and concrete walls Valued: Cost: 2000 Tooltip: Name: Battle Fortress Health: - HP: 110000 - Armor: - Type: Heavy + HP: 140000 Mobile: Locomotor: sheavytracked - Speed: 40 - PauseOnCondition: notmobile || being-captured || empdisable || being-warped || driver-dead + Speed: 43 Voice: Move TurnSpeed: 8 Passenger: Weight: 2 Voice: Move + CargoCondition: passenger RevealsShroud: MinRange: 4c0 Range: 6c0 @@ -5146,12 +8586,14 @@ BATF: Range: 4c0 DetectCloaked@SPY: Range: 6c0 - CloakTypes: Cloak, Thief + DetectionTypes: Cloak, AirCloak RequiresCondition: loaded-spy && !(empdisable || being-warped) AttackFrontal: FacingTolerance: 24 - PauseOnCondition: empdisable || being-warped - RequiresCondition: !(loaded || loaded-cmdo || loaded-air) + PauseOnCondition: empdisable || being-warped || blinded + RequiresCondition: !(loaded || loaded-cmdo || loaded-seal || loaded-air) + Voice: Attack + AttackMove: Voice: Attack Armament@DEFAULT: Name: primary @@ -5160,7 +8602,7 @@ BATF: MuzzleSequence: muzzle WithMuzzleOverlay: Cargo: - Types: Infantry + Types: Infantry, Hacker MaxWeight: 5 LoadingCondition: notmobile LoadedCondition: cargo @@ -5172,124 +8614,244 @@ BATF: e6: loaded-repair e7: loaded-cmdo e8: loaded + u3: loaded-air + u3r2: loaded-air n1: loaded n2: loaded n3: loaded-air n4: loaded n5: loaded n6: loaded-repair + bh: loaded + ivan: loaded + shad: loaded + medi: loaded-medic mech: loaded-repair + seal: loaded-seal rmbo: loaded-cmdo bori: loaded-cmdo + yuri: loaded-cmdo acol: loaded - acol.upg: loaded - mort: loaded + tplr: loaded + cscr: loaded + enfo: loaded + hopl: loaded + tigr: loaded + cryt: loaded + ztrp: loaded + zrai: loaded + zdef: loaded + mort.cryo: loaded + mort.sonic: loaded + mort.chem: loaded + cmsr: loaded spy: loaded-spy snip: loaded + assa: loaded shok: loaded sab: loaded-spy thf: loaded-spy n1c: loaded n3c: loaded-air tecn: loaded + enli: loaded rmbc: loaded s1: loaded s2: loaded s3: loaded s4: loaded s6: loaded-repair + mrdr: loaded + evis: loaded + impl: loaded + stlk: loaded mast: loaded-cmdo + WithCargoSounds: + EnterSounds: genter1a.aud + ExitSounds: gexit1a.aud + CargoBlocked: + RequiresCondition: mindcontrolled ProducibleWithLevel: Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded Selectable: - DecorationBounds: 44,38,0,-4 + DecorationBounds: 1877, 1621, 0, -170 Carryable: LocalOffset: 0,0,500 -Crushable: - AutoTargetPriority@DEFAULT: - RequiresCondition: !stance-attackanything && !assault-move && !loaded-air - AutoTargetPriority@ATTACKANYTHING: - RequiresCondition: (stance-attackanything || assault-move) && !loaded-air - AutoTargetPriority@DEFAULT_AIR: - RequiresCondition: !stance-attackanything && !assault-move && loaded-air - ValidTargets: Infantry, Vehicle, Water, Underwater, Air, Defense - InvalidTargets: NoAutoTarget, WaterStructure - AutoTargetPriority@ATTACKANYTHING_AIR: - RequiresCondition: (stance-attackanything || assault-move) && loaded-air - ValidTargets: Infantry, Vehicle, Water, Underwater, Air, Structure, Defense - InvalidTargets: NoAutoTarget Voiced: VoiceSet: BattleFortressVoice UpdatesPlayerStatistics: AddToArmyValue: true AttackOpenTopped: Voice: Attack - Armaments: mounted + Armaments: batf, batf-bh, batf-cryt PortOffsets: 825,0,256, 348,-482,256, -348,-482,256, -448,482,256, 448,482,256 - PauseOnCondition: being-warped || empdisable - RequiresCondition: loaded || loaded-cmdo || loaded-air + PauseOnCondition: being-warped || empdisable || blinded + RequiresCondition: loaded || loaded-cmdo || loaded-seal || loaded-air Capturable: RequiresCondition: !being-warped && !cargo Capturable@DRIVER_DEAD: RequiresCondition: driver-dead && !cargo - Targetable@DRIVERKILL: - RequiresCondition: !driver-dead && !cargo + Targetable@MindControlResistant: + TargetTypes: MindControlResistant + RequiresCondition: cargo + Targetable@MindControlImmune: + TargetTypes: MindControlImmune + RequiresCondition: loaded-cmdo SpawnActorOnDeath: Actor: BATF.Husk RequiresCondition: !being-warped ChangesHealth@REPAIR: PercentageStep: 1 Delay: 25 - StartIfBelow: 50 - DamageCooldown: 150 + StartIfBelow: 100 + DamageCooldown: 50 RequiresCondition: loaded-repair WithDecoration@COMMANDOSKULL: RequiresCondition: loaded-cmdo + WithDecoration@SEALSKULL: + RequiresCondition: loaded-seal && !loaded-cmdo + Image: pips + Sequence: pip-seal + Palette: effect + Position: TopLeft + ValidRelationships: Ally, Enemy, Neutral + WithIdleOverlay@MEDIC: + Sequence: medic + PauseOnCondition: empdisable || being-warped + RequiresCondition: loaded-medic + Offset: 0,0,250 + ProximityExternalCondition@MEDIC: + RequiresCondition: loaded-medic && !passenger + Condition: hospitalheal + Range: 4c512 + WithRangeCircle@MEDIC: + Type: IFVHeal + Color: 00FF0080 + Range: 4c512 + RequiresCondition: loaded-medic + AmbientSoundCA@BlackHand: + SoundFiles: flamer-loop1.aud + InitialSound: flamer-start1.aud + FinalSound: flamer-end1.aud + RequiresCondition: attacking-bh + InitialSoundLength: 20 + GrantConditionOnAttackCA@BlackHand: + ArmamentNames: batf-bh + Condition: attacking-bh + RevokeDelay: 3 + AmbientSoundCA@CryoTrooper: + SoundFiles: cryobeam.aud + InitialSound: cryobeamstart.aud + FinalSound: cryobeamend.aud + RequiresCondition: attacking-cryt + InitialSoundLength: 10 + GrantConditionOnAttackCA@CryoTrooper: + ArmamentNames: batf-cryt + Condition: attacking-cryt + RevokeDelay: 6 + GrantConditionOnHealingReceived@REPAIRCOOLDOWN: + RequiredHealing: 120000 + StackDuration: 1050 + RejectsOrders@AnathemaNoUnload: + Reject: Unload + RequiresCondition: anathema + Encyclopedia: + Category: Allies/Vehicles + EncyclopediaExtras: + Subfaction: france BATF.AI: Inherits: BATF RenderSprites: Image: batf Buildable: - Prerequisites: infantry.any, atek, ~vehicles.france, ~botplayer, ~techlevel.high + Prerequisites: atek, ~vehicles.france, ~botplayer, ~techlevel.high Cargo: - InitialUnits: e1,e1,e3,e3,e3 + InitialUnits: E1,E1,E3,E3,E3 + WithCargoSounds: + -EnterSounds: + -Encyclopedia: + -EncyclopediaExtras: MEMP: Inherits: ^TankTD Inherits@IDISABLE: ^DisabledByRadarLoss Inherits@HACKABLE: ^Hackable + Inherits@SLOWCRUSH: ^SlowedByCrushing + Inherits@AUTOTARGET: ^AutoTargetGround + Inherits@HeavyArmor: ^HeavyArmor Buildable: - Queue: Vehicle + Queue: VehicleSQ, VehicleMQ BuildPaletteOrder: 410 IconPalette: chrometd - Prerequisites: techcenter, ~vehicles.memp, ~techlevel.high - Description: Remotely piloted vehicle, Self destructs to disable nearby vehicles & structures.\n Requires active radar communication.\n Strong vs Vehicles, Buildings\n Weak vs Infantry, Aircraft + Prerequisites: gtek, ~vehicles.gdi, ~techlevel.high + Description: Remotely piloted vehicle, deploys to disable nearby vehicles & structures. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor, Defenses, Buildings + Weaknesses: • Weak vs Infantry\n• Cannot attack Aircraft + Attributes: • Special Ability: EMP Shockwave\n• Immune to mind control\n• Requires active radar communication Valued: - Cost: 1350 + Cost: 1150 Tooltip: Name: Mobile E.M.P GenericName: Tank UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 55000 - Armor: - Type: Heavy + HP: 52000 + Selectable: + Voice: SelectEMP Mobile: - PauseOnCondition: deployed || !radarenabled || empdisable || being-warped || notmobile - Speed: 108 - ChargingSelfDestruct: - DeployedCondition: deployed - ChargingDamageWeapon: EMPExplode - ChargingSequence: charging - ChargeDelay: 24 - DetonationDelay: 48 - DetonationWeapon: MEMP - ChargeSound: mobempcharge1.aud - DetonationSound: mobemp1.aud - ChronoshiftableWithSpriteEffect: - RequiresCondition: !being-warped && !deployed + PauseOnCondition: !radarenabled || being-captured || empdisable || being-warped || driver-dead || notmobile + Speed: 126 + Voice: Move + TurnSpeed: 28 + Passenger: + Voice: Move + GrantTimedConditionOnDeploy: + DeploySound: mobempcharge1.aud + DeployedCondition: triggered + CooldownTicks: 450 + DeployedTicks: 25 + RequiresCondition: radarenabled && !(empdisable || being-warped) + ChargingColor: 0277bd + DischargingColor: 03a9f4 + Voice: Unload + Instant: true + PeriodicExplosion: + Weapon: MEMP + RequiresCondition: triggered && ammo + AmmoPoolName: explosion + InitialDelay: 23 + AttackFrontal: + FacingTolerance: 512 + PauseOnCondition: !ammo || empdisable || being-warped + Voice: Attack + Armament@PRIMARY: + Weapon: MempTargeting + DeployOnAttack: + RequiresCondition: !triggered + AmmoPool: + Name: explosion + Armaments: explosion + ReloadDelay: 0 + InitialAmmo: 0 + AmmoCondition: ammo + WithAmmoPipsDecoration: + Position: BottomLeft + Margin: 4, 3 + RequiresSelection: true + FullSequence: pip-red + ReloadAmmoPool: + AmmoPool: explosion + Delay: 450 + Count: 1 + ChronoshiftableCA: + RequiresCondition: !being-warped && !triggered RevealsShroud: MinRange: 4c0 Range: 6c0 @@ -5297,56 +8859,68 @@ MEMP: RevealsShroud@GAPGEN: Range: 4c0 WithIdleOverlay@charging: - RequiresCondition: deployed + RequiresCondition: triggered Palette: tseffect Offset: 160, 120, 100 Sequence: idle-overlay WithIdleOverlay@chargingpower: - RequiresCondition: deployed + RequiresCondition: triggered Palette: tseffect-ignore-lighting-alpha75 Offset: 0, 0, 0 Sequence: emp-overlay - Targetable: - TargetTypes: Ground, Vehicle, C4, ChaosImmune, DriverKillImmune, MindControlImmune + -Capturable: + Targetable@MindControlImmune: + TargetTypes: MindControlImmune + Targetable@ChaosImmune: + TargetTypes: ChaosImmune + Targetable@DriverKillImmune: + TargetTypes: DriverKillImmune + Targetable@EmpImmune: + TargetTypes: EmpImmune WithRangeCircle: + Type: MEMP Color: 0000FF80 Range: 5c0 Voiced: VoiceSet: DroneVoice - -CaptureManager: - -Capturable: - -CaptureNotification: - -Capturable@DRIVER_DEAD: - -GrantConditionIfOwnerIsNeutral: - -ChangesHealth@DRIVER_DEAD: - -Targetable@DRIVERKILL: - -Targetable@DRIVERKILLLOWHP: - -GrantConditionOnDamageState@DRIVERKILLLOWHP: - -Targetable@AICAPTURE: + RequiresCondition: radarenabled && !empdisable + Voiced@OFFLINE: + VoiceSet: OfflineDroneVoice + RequiresCondition: !radarenabled || empdisable WithColoredOverlay@DRONEDISABLE: - RequiresCondition: (!radarenabled || empdisable) && !deployed + RequiresCondition: (!radarenabled || empdisable) && !triggered WithDecoration@DRONEDISABLE: - RequiresCondition: (!radarenabled || empdisable) && !deployed - + RequiresCondition: (!radarenabled || empdisable) && !triggered + Sellable: + RequiresCondition: unit-sellable && !c4 && !being-warped + AutoTargetPriority@DEFAULT: + ValidTargets: Vehicle, Defense + Encyclopedia: + Category: GDI/Vehicles CDRN: Inherits: ^VehicleTD Inherits@AUTOTARGET: ^AutoTargetGround Inherits@HACKABLE: ^Hackable + Inherits@SELECTION: ^SelectableSupportUnit RenderSprites: Image: cdrone AutoTargetPriority@DEFAULT: ValidTargets: Infantry, Vehicle, Water - InvalidTargets: NoAutoTarget, WaterStructure, Underwater, Defense, ChaosImmune + InvalidTargets: NoAutoTarget, ChaosImmune AutoTargetPriority@ATTACKANYTHING: - ValidTargets: Infantry, Vehicle, Water, Underwater + ValidTargets: Infantry, Vehicle, Water InvalidTargets: NoAutoTarget, ChaosImmune Buildable: - Queue: Vehicle - BuildPaletteOrder: 430 + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 311 IconPalette: chrometd - Prerequisites: tmpl, ~vehicles.nod, ~techlevel.high - Description: Drone armed with Chaos Gas which causes units\nto become frenzied and attack indiscriminately.\n Has weak armor. + Prerequisites: stek, ~vehicles.yuri, ~techlevel.high + Description: Drone armed with Chaos Gas which causes units to become frenzied and attack indiscriminately. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor, Infantry + Weaknesses: • Cannot attack Aircraft, Buildings, Defenses + Attributes: • Special Ability: Expel Chaos Gas Valued: Cost: 850 Tooltip: @@ -5358,19 +8932,16 @@ CDRN: Armor: Type: Light Mobile: - Speed: 108 + Speed: 135 Voice: Move - PauseOnCondition: empdisable || being-warped || notmobile RevealsShroud: MinRange: 4c0 Range: 5c0 RevealGeneratedShroud: False RevealsShroud@GAPGEN: Range: 4c0 - Explodes: - Weapon: ChaosDroneExplode - EmptyWeapon: ChaosDroneExplodeSmall - LoadedChance: 50 + FireWarheadsOnDeath: + Weapon: ChaosDroneExplodeSmall AttackFrontal: FacingTolerance: 512 PauseOnCondition: empdisable || being-warped @@ -5398,41 +8969,51 @@ CDRN: DeployedCondition: triggered CooldownTicks: 100 DeployedTicks: 10 - RequiresCondition: empdisable || being-warped + RequiresCondition: !(empdisable || being-warped) + Instant: true PeriodicExplosion: Weapon: ChaosGas RequiresCondition: triggered && ammo AmmoPoolName: explosion - Targetable: - TargetTypes: Ground, Vehicle, C4, ChaosImmune, DriverKillImmune, MindControlImmune + -Capturable: + Targetable@MindControlImmune: + TargetTypes: MindControlImmune + Targetable@ChaosImmune: + TargetTypes: ChaosImmune + Targetable@DriverKillImmune: + TargetTypes: DriverKillImmune Voiced: VoiceSet: ChaosDroneVoice - -CaptureManager: - -Capturable: - -CaptureNotification: - -Capturable@DRIVER_DEAD: - -GrantConditionIfOwnerIsNeutral: - -ChangesHealth@DRIVER_DEAD: - -Targetable@DRIVERKILL: - -Targetable@DRIVERKILLLOWHP: - -GrantConditionOnDamageState@DRIVERKILLLOWHP: - -Targetable@AICAPTURE: + Sellable: + RequiresCondition: unit-sellable && !c4 && !being-warped + WithRangeCircle: + Type: ChaosDrone + Range: 3c0 + Color: c33d73 + Encyclopedia: + Category: Soviets/Vehicles + EncyclopediaExtras: + Subfaction: yuri CHPR: Inherits: ^Tank - Inherits@AUTOTARGET: ^AutoTargetAllAssaultMoveAntiAir + Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove Inherits@GAINSEXPERIENCE: ^GainsExperience - Inherits@BERSERK: ^Berserk + Inherits@HeavyArmor: ^HeavyArmor RenderSprites: Image: chpr Buildable: - Queue: Vehicle - BuildPaletteOrder: 330 + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 222 IconPalette: chrometd Prerequisites: atek, ~vehicles.germany, ~techlevel.high - Description: Advanced heavy tank that can erase targets from existence.\n Strong vs Vehicles, Infantry\n Weak vs Buildings + Description: Advanced heavy tank that can erase targets from existence. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Defenses + Weaknesses: • Weak vs Buildings\n• Cannot attack Aircraft + Attributes: • Target is disabled while being erased\n• Can crush concrete walls\n• Special Ability: Teleport (with upgrade) Valued: - Cost: 1700 + Cost: 1550 Tooltip: Name: Chrono Prison GenericName: Tank @@ -5440,10 +9021,8 @@ CHPR: AddToArmyValue: true Health: HP: 75000 - Armor: - Type: Heavy Mobile: - Speed: 42 + Speed: 44 Locomotor: heavytracked Voice: Move Passenger: @@ -5456,14 +9035,11 @@ CHPR: RevealsShroud@GAPGEN: Range: 4c0 Turreted: - TurnSpeed: 12 + TurnSpeed: 16 Offset: -156,0,0 Armament@PRIMARY: Weapon: NeutronCannon LocalOffset: 600,0,480 - Armament@SECONDARY: - Weapon: NeutronCannonAA - LocalOffset: 600,0,480 Armament@VISUAL: Weapon: NeutronCannonBeam LocalOffset: 600,0,480 @@ -5474,7 +9050,7 @@ CHPR: Weapon: NeutronCannonSound LocalOffset: 600,0,480 AttackTurreted: - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded Voice: Attack WithMuzzleOverlay: WithSpriteTurret@inactiveturret: @@ -5483,20 +9059,20 @@ CHPR: WithSpriteTurret@activeturret: RequiresCondition: aiming Sequence: turretactive - SpawnActorOnDeath: - Actor: CHPR.Husk - RequiresCondition: !being-warped ProducibleWithLevel: Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded Selectable: - DecorationBounds: 44,38,0,-4 + DecorationBounds: 1877, 1621, 0, -170 Carryable: LocalOffset: 0,0,500 -Crushable: GrantConditionWhileAiming: Condition: aiming Voiced: - VoiceSet: ChronoVoice + VoiceSet: ChronoPrisonVoice AutoTarget: AttackAnythingCondition: stance-attackanything AttackMove: @@ -5505,7 +9081,7 @@ CHPR: AutoTargetPriority@DEFAULT: RequiresCondition: !stance-attackanything && !assault-move ValidTargets: Temporal - InvalidTargets: NoAutoTarget + InvalidTargets: NoAutoTarget, Building, WaterStructure, AntiAirDefense AutoTargetPriority@ATTACKANYTHING: RequiresCondition: stance-attackanything || assault-move ValidTargets: Temporal @@ -5516,15 +9092,35 @@ CHPR: PortableChronoCA: ChargeDelay: 375 MaxDistance: 18 - RequiresCondition: !(empdisable && being-warped) && tflx-upgrade + RequiresCondition: !(empdisable && being-warped) && !chronoshifted && tflx-upgrade + ShowSelectionBarWhenFull: false GrantConditionOnPrerequisite@TEMPORALFLUX: Condition: tflx-upgrade Prerequisites: tflx.upgrade + RejectsOrders@AICHPR: + RequiresCondition: botwarping + GrantConditionOnAttack@AICHPR: + Condition: botwarping + ArmamentNames: primary + RevokeDelay: 75 + RequiresCondition: botowner + GrantConditionOnBotOwner@AICHPR: + Condition: botowner + Bots: brutal, vhard, hard, normal, easy, naval + WithIdleOverlay@MINDCONTROL: + Offset: -200,0,768 + RangeMultiplier@TEMPORALFLUX: + RequiresCondition: tflx-upgrade + Modifier: 130 + Encyclopedia: + Category: Allies/Vehicles + EncyclopediaExtras: + Subfaction: germany + CRYO: Inherits: ^TankTD Inherits@GAINSEXPERIENCE: ^GainsExperience Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove - Inherits@BERSERK: ^Berserk RenderSprites: Valued: Cost: 1350 @@ -5533,14 +9129,21 @@ CRYO: UpdatesPlayerStatistics: AddToArmyValue: true Buildable: - BuildPaletteOrder: 270 - Prerequisites: atek, ~vehicles.allies, ~techlevel.high - Queue: Vehicle + BuildPaletteOrder: 221 + Prerequisites: ~vehicles.allies, alhq, ~sweden.coalition, ~techlevel.high + Queue: VehicleSQ, VehicleMQ IconPalette: chrometd - Description: Long-range support artillery that slows enemies\nand makes them take more damage.\n Strong vs Infantry, Vehicles, Buildings\n Weak vs Aircraft + Description: Long-range support artillery that slows enemies and makes them take more damage. + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor + Weaknesses: • Cannot attack Aircraft + Attributes: • Slows enemy movement and increases damage taken Mobile: - Speed: 66 + Speed: 72 TurnSpeed: 16 + Voice: Move + Passenger: + Voice: Move Health: HP: 26000 Armor: @@ -5553,128 +9156,1670 @@ CRYO: Range: 4c0 Armament: Weapon: CryoMissile - LocalOffset: 150,100,0, 150,-100,0 + LocalOffset: 150,100,150, 150,-100,150 AttackFrontal: TargetFrozenActors: True ForceFireIgnoresActors: True - PauseOnCondition: empdisable || being-warped - Explodes: + PauseOnCondition: empdisable || being-warped || blinded + FacingTolerance: 0 + Voice: Attack + Voiced: + VoiceSet: CryoVoice + AttackMove: + Voice: Attack + FireWarheadsOnDeath: Weapon: CryoExplosion Selectable: - DecorationBounds: 28,28 + DecorationBounds: 1194, 1194 ProducibleWithLevel: Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded + Encyclopedia: + Category: Allies/Vehicles + EncyclopediaExtras: + AdditionalInfo: Requires Sweden Coalition. -APOC: - Inherits: ^Tank +PBUL: + Inherits: ^VehicleTD + Inherits@AUTOTARGET: ^AutoTargetAllAssaultMovePrioritizeAir Inherits@GAINSEXPERIENCE: ^GainsExperience - Inherits@AUTOTARGET: ^AutoTargetAllAssaultMove - Inherits@BERSERK: ^Berserk - Inherits@SHRAPNEL: ^ThrowsShrapnel + RenderSprites: Buildable: - Queue: Vehicle - BuildPaletteOrder: 300 - Prerequisites: indp, ~vehicles.soviet, ~!iraqtank.upgrade, ~techlevel.high - Description: Enormous slow tank with uranium shells and anti-air capability.\n Can crush small vehicles.\n Strong vs Vehicles, Aircraft\n Weak vs Nothing + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 252 + IconPalette: chrometd + Prerequisites: gtek, ~vehicles.eagle, ~techlevel.high + Description: Fast scout vehicle with rockets that disrupts weapons and vision. Can designates targets, revealing them and increasing the damage they take. + TooltipExtras: + Strengths: • Strong vs Light Armor, Aircraft + Weaknesses: • Weak vs Infantry, Buildings, Defenses + Attributes: • Detects cloaked units and spies\n• Special Ability: Target Painter Valued: - Cost: 2600 + Cost: 850 Tooltip: - Name: Apocalypse Tank - GenericName: Tank + Name: Pitbull UpdatesPlayerStatistics: AddToArmyValue: true Health: - HP: 110000 + HP: 17000 Armor: - Type: Heavy + Type: Light Mobile: - Speed: 40 - TurnSpeed: 8 - Locomotor: sheavytracked + TurnSpeed: 40 + Speed: 130 Voice: Move Passenger: - Weight: 2 Voice: Move RevealsShroud: - MinRange: 4c0 - Range: 6c0 + MinRange: 5c0 + Range: 7c0 RevealGeneratedShroud: False RevealsShroud@GAPGEN: - Range: 4c0 + Range: 5c0 Turreted: - TurnSpeed: 8 + TurnSpeed: 40 + Offset: -200,0,120 Armament@PRIMARY: - Weapon: 152mm - LocalOffset: 1400,100,340, 1400,-100,340 - Recoil: 171 - RecoilRecovery: 30 - MuzzleSequence: muzzle + Weapon: PitbullRockets + LocalOffset: 0,-100,250, 0,100,250 + PauseOnCondition: reloading-secondary + ReloadingCondition: reloading-primary Armament@SECONDARY: Name: secondary - Weapon: ApocalypseTusk - LocalOffset: -85,384,340, -85,-384,340 - LocalYaw: -100,100 - Recoil: 43 - MuzzleSequence: muzzle + Weapon: PitbullRocketsAA + LocalOffset: 0,-100,250, 0,100,250 + PauseOnCondition: reloading-primary + ReloadingCondition: reloading-secondary + Armament@TERTIARY: + Name: tertiary + Weapon: TargetPainter + LocalOffset: 0,0,250 + RequiresCondition: target-painting AttackTurreted: - PauseOnCondition: empdisable || being-warped + PauseOnCondition: empdisable || being-warped || blinded + Voice: Attack + Armaments: primary, secondary, tertiary + TargetFrozenActors: true + AttackMove: Voice: Attack - WithFacingSpriteBody: - RequiresCondition: !iraqtank-upgrade - WithFacingSpriteBody@IRAQ: - Name: iraqbody - Sequence: idle2 - RequiresCondition: iraqtank-upgrade - WithMuzzleOverlay: WithSpriteTurret: - SpawnActorOnDeath: - Actor: APOC.Husk - RequiresCondition: !being-warped && iraqtank-upgrade - ChangesHealth: - PercentageStep: 1 - Delay: 25 - StartIfBelow: 50 - DamageCooldown: 150 + Voiced: + VoiceSet: PitbVoice + IgnoresDisguise: + DetectCloaked: + Range: 6c0 + DetectionTypes: Cloak, AirCloak + RequiresCondition: !(empdisable || being-warped) ProducibleWithLevel: Prerequisites: vehicles.upgraded - Selectable: - DecorationBounds: 44,38,0,-4 - Carryable: - LocalOffset: 0,0,500 - -Crushable: - Voiced: - VoiceSet: ApocalypseVoice - AttackMove: - Voice: Attack - GrantConditionOnPrerequisite@IRAQ: - Condition: iraqtank-upgrade - Prerequisites: iraqtank.upgrade - SpeedMultiplier@IRAQTANK: - Modifier: 125 - RequiresCondition: iraqtank-upgrade - Explodes@IRAQTANK: - Weapon: UnitExplodeIraqTank - EmptyWeapon: UnitExplodeIraqTank - RequiresCondition: !being-warped && iraqtank-upgrade - -ProductionCostMultiplier@IndustrialPlantLevel1: + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded + TargetedAttackAbility: + ActiveCondition: target-painting + ArmamentNames: tertiary + CircleColor: ffffff88 + Type: PitbullTargetPainter + TargetModifiedCursor: ability2 + ActiveUntilCancelled: true + UseDisabledArmaments: true + TargetFrozenActors: true + Encyclopedia: + Category: GDI/Vehicles + EncyclopediaExtras: + Subfaction: eagle -APOC.IRAQ: - Inherits: APOC - RenderSprites: - Image: apoci +CYCP: + Inherits: ^Tank + Inherits@GAINSEXPERIENCE: ^GainsExperience + Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove + Inherits@SLOWCRUSH: ^SlowedByCrushing + Inherits@InfiltratorStolenTech: ^InfiltratorStolenTech + Buildable: + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 501 + Prerequisites: anyradar, ~vehicles.cycp + Description: Light tank with a Tesla Coil derived weapon. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor, Infantry + Weaknesses: • Cannot attack Aircraft + Valued: + Cost: 1250 Tooltip: - Name: Atomic Apocalypse Tank + Name: Cyclops GenericName: Tank + UpdatesPlayerStatistics: + AddToArmyValue: true + Health: + HP: 20000 + Armor: + Type: Light + Mobile: + Speed: 82 + RevealsShroud: + MinRange: 4c0 + Range: 6c0 + RevealGeneratedShroud: False + RevealsShroud@GAPGEN: + Range: 4c0 + Armament@PRIMARY: + Weapon: CyclopsZap + LocalOffset: 150,0,213 + AttackFrontal: + PauseOnCondition: empdisable || being-warped || blinded + FacingTolerance: 20 + ProducibleWithLevel: + Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded + Selectable: + DecorationBounds: 1280, 1280 + SpawnActorOnDeath: + Actor: CYCP.Husk + RequiresCondition: !being-warped + Encyclopedia: + Category: Nod/Stolen Technology + EncyclopediaExtras: + AdditionalInfo: Stolen from Soviet War Factory. + +BASI: + Inherits: ^TankTD + Inherits@GAINSEXPERIENCE: ^GainsExperience + Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove + Inherits@SLOWCRUSH: ^SlowedByCrushing + Inherits@InfiltratorStolenTech: ^InfiltratorStolenTech Buildable: - Queue: Vehicle - BuildPaletteOrder: 301 - Prerequisites: indp, ~vehicles.soviet, ~iraqtank.upgrade, ~techlevel.high - WithFacingSpriteBody: - -RequiresCondition: - -WithFacingSpriteBody@IRAQ: - -SpawnActorOnDeath: - -GrantConditionOnPrerequisite@IRAQ: - SpeedMultiplier@IRAQTANK: - -RequiresCondition: - Explodes@IRAQTANK: - RequiresCondition: !being-warped \ No newline at end of file + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 502 + Prerequisites: anyradar, ~vehicles.basi + Description: Stealth tank with an EMP wave weapon. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor, Defenses + Weaknesses: • Weak vs Buildings, Infantry\n• Cannot attack Aircraft\n• Can be spotted by nearby infantry and defense structures + Valued: + Cost: 1350 + Tooltip: + Name: Basilisk + GenericName: Tank + UpdatesPlayerStatistics: + AddToArmyValue: true + Health: + HP: 22000 + Armor: + Type: Light + Mobile: + Speed: 100 + RevealsShroud: + MinRange: 4c0 + Range: 6c0 + RevealGeneratedShroud: False + RevealsShroud@GAPGEN: + Range: 4c0 + Armament@PRIMARY: + Weapon: BasiliskPulse + LocalOffset: 0,0,213 + AttackFrontal: + PauseOnCondition: empdisable || being-warped || blinded + FacingTolerance: 20 + ProducibleWithLevel: + Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded + Selectable: + DecorationBounds: 1280, 1280 + SpawnActorOnDeath: + Actor: BASI.Husk + RequiresCondition: !being-warped + Targetable@EmpImmune: + TargetTypes: EmpImmune + AutoTarget: + InitialStance: HoldFire + InitialStanceAI: AttackAnything + Cloak@NORMAL: + InitialDelay: 75 + CloakDelay: 76 + CloakSound: trans1.aud + CloakedCondition: hidden + UncloakSound: appear1md.aud + CloakStyle: Palette + CloakedPalette: cloak + IsPlayerPalette: false + UncloakOn: Attack, Unload, Infiltrate, Demolish, Dock, Damage, Heal + RequiresCondition: !cloak-force-disabled && !being-warped && !empdisable && !driver-dead && !parachute + PauseOnCondition: invisibility + Cloak@CRATE-CLOAK: + RequiresCondition: crate-cloak && !(cloak-force-disabled || invisibility || hidden || driver-dead) + GrantConditionOnDamageState@UNCLOAK: + Condition: cloak-force-disabled + ValidDamageStates: Critical + WithColoredSelectionBox@INVIS: + RequiresCondition: invisibility || hidden + ColorSource: Player + GrantConditionToAttached@Cloak: + Condition: inherited-cloak + RequiresCondition: hidden || invisibility + Encyclopedia: + Category: Nod/Stolen Technology + EncyclopediaExtras: + AdditionalInfo: Stolen from GDI Weapons Factory. + +MANT: + Inherits: ^VehicleTD + Inherits@GAINSEXPERIENCE: ^GainsExperience + Inherits@AUTOTARGET: ^AutoTargetAllAssaultMove + Inherits@InfiltratorStolenTech: ^InfiltratorStolenTech + Inherits@A2GPROTECTION: ^AirToGroundProtection + Inherits@HeavyArmor: ^HeavyArmor + Buildable: + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 503 + Prerequisites: anyradar, ~vehicles.mant + Description: Tracked vehicle armed with anti-aircraft laser cannons. + IconPalette: chrometd + TooltipExtras: + Strengths: • Strong vs Aircraft + Weaknesses: • Cannot attack ground targets + Attributes: • Detects cloaked aircraft + Valued: + Cost: 1000 + Selectable: + DecorationBounds: 1194, 1194 + UpdatesPlayerStatistics: + AddToArmyValue: true + Health: + HP: 28000 + Mobile: + Speed: 126 + TurnSpeed: 30 + Tooltip: + Name: Mantis + WithMoveAnimation: + ValidMovementTypes: Horizontal, Vertical, Turn + RevealsShroud: + MinRange: 4c0 + Range: 6c0 + RevealGeneratedShroud: False + RevealsShroud@GAPGEN: + Range: 4c0 + Armament@PRIMARY: + Weapon: MantisLaser + LocalOffset: 0,-50,400, 0,50,400 + MuzzleSequence: muzzle + MuzzlePalette: caneon + AttackFrontal: + PauseOnCondition: empdisable || being-warped || blinded + FacingTolerance: 24 + WithMuzzleOverlay: + ProducibleWithLevel: + Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded + DetectCloaked: + Range: 8c0 + DetectionTypes: AirCloak + RequiresCondition: empdisable || being-warped + KeepsDistance: + GuardsSelection: + ValidTargets: Infantry, Vehicle + Encyclopedia: + Category: Nod/Stolen Technology + EncyclopediaExtras: + AdditionalInfo: Stolen from Nod Airstrip. + +VIPR: + Inherits: ^VehicleTD + Inherits@GAINSEXPERIENCE: ^GainsExperience + Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove + Inherits@HOVERTRAIL: ^HoverTrail + Inherits@InfiltratorStolenTech: ^InfiltratorStolenTech + Buildable: + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 504 + Prerequisites: anyradar, ~stolentech.wsph + Description: Medium hover tank. + IconPalette: chrometd + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor, Defenses + Weaknesses: • Weak vs Buildings, Infantry\n• Cannot attack Aircraft + Valued: + Cost: 1350 + Tooltip: + Name: Viper + Selectable: + DecorationBounds: 1194, 1194 + UpdatesPlayerStatistics: + AddToArmyValue: true + Health: + HP: 24000 + Armor: + Type: Light + Mobile: + TurnSpeed: 512 + Speed: 82 + Locomotor: lighthover + Hovers: + BobDistance: -25 + RequiresCondition: !empdisable && !being-warped && !driver-dead + RevealsShroud: + MinRange: 4c0 + Range: 6c0 + RevealGeneratedShroud: False + RevealsShroud@GAPGEN: + Range: 4c0 + Armament@PRIMARY: + Weapon: ViperLaser + LocalOffset: 750,0,208 + MuzzleSequence: muzzle + MuzzlePalette: caneon + WithMuzzleOverlay: + ProducibleWithLevel: + Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded + TurretedFloating: + TurnSpeed: 16 + Offset: 0,0,0 + RealignDelay: 100 + AttackTurreted: + PauseOnCondition: empdisable || being-warped || blinded + WithSpriteTurret: + GrantConditionOnTerrain@ONWATER: + TerrainTypes: Water + Condition: onwater + KillsSelf@SINK: + RequiresCondition: onwater && (empdisable || driver-dead) + Targetable@ONWATER: + TargetTypes: Water, Ship + RequiresCondition: onwater + Encyclopedia: + Category: Nod/Stolen Technology + EncyclopediaExtras: + AdditionalInfo: Stolen from Scrin Warp Sphere. + +WOLV: + Inherits: ^VehicleTD + Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove + Inherits@GAINSEXPERIENCE: ^GainsExperience + Inherits@GYRO: ^GyroStabilizers + Buildable: + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 250 + Prerequisites: gtek, ~vehicles.talon, ~techlevel.medium + Description: Compact & durable battle-mech with dual chainguns. + IconPalette: chrometd + TooltipExtras: + Strengths: • Strong vs Infantry, Buildings, Light Armor + Weaknesses: • Weak vs Heavy Armor, Defenses\n• Cannot attack Aircraft + Valued: + Cost: 900 + Selectable: + Bounds: 1024, 1024 + DecorationBounds: 1024, 1024, 0, -100 + Tooltip: + Name: Wolverine + UpdatesPlayerStatistics: + AddToArmyValue: true + Health: + HP: 44000 + Armor: + Type: Light + Mobile: + TurnSpeed: 64 + Speed: 60 + Voice: Move + Passenger: + Voice: Move + RevealsShroud: + MinRange: 4c0 + Range: 6c0 + RevealGeneratedShroud: False + RevealsShroud@GAPGEN: + Range: 4c0 + Voiced: + VoiceSet: WolverineVoice + WithMoveAnimation: + WithAttackAnimation: + Sequence: shoot + RequiresCondition: !moving + GrantConditionOnMovement@MOVING: + ValidMovementTypes: Horizontal, Vertical, Turn + Condition: moving + Armament@PRIMARY: + Weapon: WolverineGun + LocalOffset: 300,-220,180, 300,220,180 + MuzzleSequence: muzzle + Armament@SECONDARY: + Name: secondary + Weapon: WolverineGunLine + LocalOffset: 300,-220,180, 300,220,180 + Armament@TERTIARY: + Name: secondary + Weapon: WolverineGunTracer + LocalOffset: 300,-220,180, 300,220,180 + AttackFrontal: + PauseOnCondition: empdisable || being-warped || blinded + Voice: Attack + FacingTolerance: 32 + ProducibleWithLevel: + Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded + WithMuzzleOverlay: + RangeMultiplier@GYRO: + Modifier: 140 + ReloadDelayMultiplier@GYRO: + Modifier: 140 + Encyclopedia: + Category: GDI/Vehicles + EncyclopediaExtras: + Subfaction: talon + +XO: + Inherits: ^VehicleTD + Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove + Inherits@GAINSEXPERIENCE: ^GainsExperience + Buildable: + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 251 + Prerequisites: gtek, ~vehicles.zocom, ~techlevel.medium + Description: Light battle-mech armed with a laser and a coil-gun. Able to jump short distances using its jump-pack. + TooltipExtras: + Strengths: • Strong vs Light Armor, Heavy Armor, Buildings + Weaknesses: • Weak vs Defenses\n• Cannot attack Aircraft + Attributes: • Special Ability: Jump-Pack + Valued: + Cost: 1000 + Selectable: + Bounds: 1024, 1024 + DecorationBounds: 1024, 1024, 0, -100 + Tooltip: + Name: X-O Powersuit + UpdatesPlayerStatistics: + AddToArmyValue: true + Health: + HP: 22500 + Armor: + Type: Light + Mobile: + TurnSpeed: 64 + Speed: 60 + Voice: Move + Passenger: + Voice: Move + RevealsShroud: + MinRange: 4c0 + Range: 6c0 + RevealGeneratedShroud: False + RevealsShroud@GAPGEN: + Range: 4c0 + Voiced: + VoiceSet: XOVoice + WithMoveAnimation: + WithAttackAnimation: + Sequence: shoot + RequiresCondition: !moving + GrantConditionOnMovement@MOVING: + ValidMovementTypes: Horizontal, Vertical, Turn + Condition: moving + Armament@PRIMARY: + Weapon: XOCoilGun + LocalOffset: 400,-220,180 + MuzzleSequence: muzzle + Armament@SECONDARY: + Name: secondary + Weapon: XOLaser + LocalOffset: 400,220,180 + MuzzleSequence: muzzle2 + MuzzlePalette: scrin + AttackFollowFrontal: + PauseOnCondition: empdisable || being-warped || blinded || parachute + Voice: Attack + FacingTolerance: 32 + RangeMargin: 0 + ProducibleWithLevel: + Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded + WithMuzzleOverlay: + Parachutable: + FallRate: 130 + WithIdleAnimation@DESCENDING: + RequiresCondition: parachute + Interval: 3 + Sequences: descend + WithParachute: + ShadowImage: parach-shadow + ShadowSequence: idle + Image: empty + Sequence: idle + OpeningSequence: idle + Offset: 0,0,427 + RequiresCondition: parachute + GpsRadarDot: + Sequence: Infantry + WithFacingSpriteBody: + RequiresCondition: !jumping + WithFacingSpriteBody@Jump: + Name: jump + Sequence: descend + RequiresCondition: !being-warped && jumping + TargetedLeapAbility: + TakeOffSounds: xo-jump1.aud + LandingSounds: xo-land1.aud + LeapCondition: jumping + ShowSelectionBarWhenFull: false + ChargeDelay: 625 + SelectionBarColor: ffaa00 + CircleColor: ffaa0077 + MaxDistance: 7 + Speed: 140 + Contrail@Jumping: + Offset: -30,0,350 + StartColorUsePlayerColor: false + ZOffset: -128 + StartColor: ff990090 + StartColorAlpha: 128 + TrailLength: 12 + RequiresCondition: jumping + WithShadow@Jump: + RequiresCondition: jumping + Targetable@Jump: + RequiresCondition: jumping && !being-warped + TargetTypes: AirSmall + Targetable@TEMPORAL: + TargetTypes: Temporal + RequiresCondition: !jumping + DamageMultiplier@Jumping: + Modifier: 50 + RequiresCondition: jumping + Encyclopedia: + Category: GDI/Vehicles + EncyclopediaExtras: + Subfaction: zocom + +APOC: + Inherits: ^Tank + Inherits@GAINSEXPERIENCE: ^GainsExperience + Inherits@AUTOTARGET: ^AutoTargetAllAssaultMovePrioritizeGround + Inherits@SHRAPNEL: ^ThrowsShrapnel + Inherits@ATOMICAMMO: ^AtomicAmmunition + Inherits@HeavyArmor: ^HeavyArmor + Inherits@TANKBUSTERVULN: ^TankBusterVulnerability + Inherits@UpgradeOverlay: ^UpgradeOverlay + Buildable: + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 239 + Prerequisites: stek, ~vehicles.soviet, ~!atomicengines.upgrade, ~!erad.upgrade, ~apoc.upgrade, ~techlevel.high + Description: Enormous slow tank with uranium shells and anti-air capability. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor + Attributes: • Can crush smaller vehicles and concrete walls\n• Self repairs to 50% out of combat + Valued: + Cost: 2600 + Tooltip: + Name: Apocalypse Tank + GenericName: Tank + UpdatesPlayerStatistics: + AddToArmyValue: true + Health: + HP: 130000 + Mobile: + Speed: 43 + TurnSpeed: 8 + Locomotor: sheavytracked + Voice: Move + Passenger: + Weight: 2 + Voice: Move + RevealsShroud: + MinRange: 4c0 + Range: 6c0 + RevealGeneratedShroud: False + RevealsShroud@GAPGEN: + Range: 4c0 + Turreted: + TurnSpeed: 8 + Armament@PRIMARY: + Weapon: 152mm + Recoil: 171 + RecoilRecovery: 30 + LocalOffset: 1400,100,340, 1400,-100,340 + MuzzleSequence: muzzle + PauseOnCondition: has-atomic-ammo || atomic-reloading + ReloadingCondition: reloading + Armament@ATOMICAMMO: + Weapon: 152mmAtomic + Recoil: 171 + RecoilRecovery: 30 + LocalOffset: 1400,100,340, 1400,-100,340 + MuzzleSequence: muzzle + PauseOnCondition: !has-atomic-ammo || reloading + ReloadingCondition: atomic-reloading + Armament@SECONDARY: + Name: secondary + Weapon: ApocalypseTusk + LocalOffset: -85,384,340, -85,-384,340 + LocalYaw: -100,100 + Recoil: 43 + MuzzleSequence: muzzle + AttackTurreted: + PauseOnCondition: empdisable || being-warped || blinded + Voice: Attack + WithFacingSpriteBody: + WithMuzzleOverlay: + WithSpriteTurret: + SpawnActorOnDeath: + Actor: APOC.Husk + RequiresCondition: !being-warped + ChangesHealth: + PercentageStep: 1 + Delay: 25 + StartIfBelow: 50 + DamageCooldown: 150 + ProducibleWithLevel: + Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded + Selectable: + DecorationBounds: 1877, 1621, 0, -170 + Carryable: + LocalOffset: 0,0,500 + WithIdleOverlay@MINDCONTROL: + Offset: 0,0,512 + -Crushable: + Voiced: + VoiceSet: ApocalypseVoice + AttackMove: + Voice: Attack + WithRestartableIdleOverlay@ATOMICAMMO: + RequiresCondition: atomic-ammo && has-atomic-ammo < 6 + WithAmmoPipsDecoration@ATOMICAMMO: + PipCount: 3 + AmmoPool@ATOMICAMMO: + Ammo: 6 + ReloadAmmoPool@ATOMICAMMO: + Count: 6 + RequiresCondition: atomic-ammo && has-atomic-ammo < 6 + ReplacedInQueue: + Actors: apoc.atomic, apoc.erad + Upgradeable@ATOMIC: + Type: atomicengines.upgrade + UpgradingCondition: upgrading + Actor: apoc.atomic + UpgradeAtActors: fix, rep, srep + BuildDuration: 100 + RequiresCondition: !mindcontrolled + Upgradeable@ERAD: + Type: erad.upgrade + UpgradingCondition: upgrading + Actor: apoc.erad + UpgradeAtActors: fix, rep, srep + BuildDuration: 100 + RequiresCondition: !mindcontrolled + Encyclopedia: + Category: Soviets/Vehicles + EncyclopediaExtras: + AdditionalInfo: Requires Armor Doctrine. + +APOC.ATOMIC: + Inherits: APOC + RenderSprites: + Image: apoci + Tooltip: + Name: Atomic Apocalypse Tank + GenericName: Tank + Buildable: + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 240 + Prerequisites: stek, ~vehicles.soviet, ~atomicengines.upgrade, ~!erad.upgrade, ~apoc.upgrade, ~techlevel.high + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor + Attributes: • Can crush smaller vehicles and concrete walls\n• Self repairs to 50% out of combat\n• Explodes and leaves radiation on death + WithFacingSpriteBody: + SpeedMultiplier: + Modifier: 125 + FireWarheadsOnDeath@ATOMICUPGRADE: + Weapon: UnitExplodeIraqTank + EmptyWeapon: UnitExplodeIraqTank + RequiresCondition: !being-warped + -SpawnActorOnDeath: + ReplacedInQueue: + Actors: apoc.erad.atomic + Upgradeable@ERAD: + Actor: apoc.erad.atomic + -Upgradeable@ATOMIC: + EncyclopediaExtras: + VariantOf: APOC + +APOC.ERAD: + Inherits: APOC + Tooltip: + Name: Apocalyptic Eradicator + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor, Heavy Armor + Weaknesses: • Cannot attack Aircraft + Attributes: • Can crush smaller vehicles and concrete walls\n• Self repairs to 50% out of combat\n• Irradiates vehicles causing them to take more damage, deal less damage, and damage nearby units + Buildable: + Prerequisites: stek, ~vehicles.soviet, ~!atomicengines.upgrade, ~erad.upgrade, ~apoc.upgrade, ~techlevel.high + BuildPaletteOrder: 241 + Description: Enormous slow tank with twin heavy radiation cannons. + Armament@PRIMARY: + Weapon: ApocRadBeamWeapon + MuzzlePalette: caneon + LocalOffset: 500,100,240, 500,-100,240 + -PauseOnCondition: + -ReloadingCondition: + -Armament@SECONDARY: + -Armament@ATOMICAMMO: + -ExternalCondition@ATOMICAMMO: + -WithRestartableIdleOverlay@ATOMICAMMO: + -FirepowerMultiplier@ATOMICAMMO: + -Targetable@ATOMICAMMO: + -AmmoPool@ATOMICAMMO: + -WithAmmoPipsDecoration@ATOMICAMMO: + -ReloadAmmoPool@ATOMICAMMO: + -ReloadAmmoPoolCA@ATOMICAMMODECAY: + -DamagedByTintedCells@RADSTRONG: + -DamagedByTintedCells@RADMED: + SpawnActorOnDeath: + Actor: APOC.ERAD.Husk + RequiresCondition: !being-warped + ReplacedInQueue: + Actors: apoc.erad.atomic + Upgradeable@ATOMIC: + Actor: apoc.erad.atomic + -Upgradeable@ERAD: + Voiced: + VoiceSet: EradVoice + EncyclopediaExtras: + Subfaction: iraq + +APOC.ERAD.ATOMIC: + Inherits: APOC.ATOMIC + RenderSprites: + Image: apoc.eradi + Tooltip: + Name: Atomic Apocalyptic Eradicator + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor, Heavy Armor + Weaknesses: • Cannot attack Aircraft + Attributes: • Can crush smaller vehicles and concrete walls\n• Self repairs to 50% out of combat\n• Explodes and leaves radiation on death\n• Irradiates vehicles causing them to take more damage, deal less damage, and damage nearby units + Buildable: + Prerequisites: stek, ~vehicles.soviet, ~atomicengines.upgrade, ~erad.upgrade, ~apoc.upgrade, ~techlevel.high + BuildPaletteOrder: 242 + Description: Enormous slow tank with twin heavy radiation cannons. + Armament@PRIMARY: + Weapon: ApocRadBeamWeapon + MuzzlePalette: caneon + LocalOffset: 500,100,240, 500,-100,240 + -PauseOnCondition: + -ReloadingCondition: + -Armament@SECONDARY: + -Armament@ATOMICAMMO: + -ExternalCondition@ATOMICAMMO: + -WithRestartableIdleOverlay@ATOMICAMMO: + -FirepowerMultiplier@ATOMICAMMO: + -Targetable@ATOMICAMMO: + -AmmoPool@ATOMICAMMO: + -WithAmmoPipsDecoration@ATOMICAMMO: + -ReloadAmmoPool@ATOMICAMMO: + -ReloadAmmoPoolCA@ATOMICAMMODECAY: + -DamagedByTintedCells@RADSTRONG: + -DamagedByTintedCells@RADMED: + -WithDecoration@UpgradeOverlay: + -ReplacedInQueue: + -Upgradeable@ERAD: + Voiced: + VoiceSet: EradVoice + EncyclopediaExtras: + Subfaction: iraq + VariantOf: APOC.ERAD + +OVLD: + Inherits: ^Tank + Inherits@GAINSEXPERIENCE: ^GainsExperience + Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove + Inherits@SHRAPNEL: ^ThrowsShrapnel + Inherits@ATOMICAMMO: ^AtomicAmmunition + Inherits@HeavyArmor: ^HeavyArmor + Inherits@TANKBUSTERVULN: ^TankBusterVulnerability + Inherits@UpgradeOverlay: ^UpgradeOverlay + Buildable: + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 235 + Prerequisites: stek, ~vehicles.soviet, ~ovld.upgrade, ~!erad.upgrade, ~!atomicengines.upgrade, ~techlevel.high + Description: Enormous slow tank fitted with a commissar tower which supports infantry in combat. + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor + Weaknesses: • Cannot attack Aircraft + Attributes: • Can crush smaller vehicles and concrete walls\n• Self repairs to 50% out of combat\n• Empowers nearby basic infantry + Valued: + Cost: 2350 + Tooltip: + Name: Overlord Tank + GenericName: Tank + UpdatesPlayerStatistics: + AddToArmyValue: true + Health: + HP: 130000 + Mobile: + Speed: 43 + TurnSpeed: 12 + Locomotor: sheavytracked + Voice: Move + Passenger: + Weight: 2 + Voice: Move + RevealsShroud: + MinRange: 4c0 + Range: 6c0 + RevealGeneratedShroud: False + RevealsShroud@GAPGEN: + Range: 4c0 + Turreted: + TurnSpeed: 10 + Armament@PRIMARY: + Weapon: 135mm + Recoil: 171 + RecoilRecovery: 30 + LocalOffset: 1400,300,340, 1400,-300,340 + MuzzleSequence: muzzle + PauseOnCondition: has-atomic-ammo || atomic-reloading + ReloadingCondition: reloading + Armament@ATOMICAMMO: + Weapon: 135mmAtomic + Recoil: 171 + RecoilRecovery: 30 + LocalOffset: 1400,100,340, 1400,-100,340 + MuzzleSequence: muzzle + PauseOnCondition: !has-atomic-ammo || reloading + ReloadingCondition: atomic-reloading + AttackTurreted: + PauseOnCondition: empdisable || being-warped || blinded + Voice: Attack + WithFacingSpriteBody: + WithMuzzleOverlay: + WithSpriteTurret: + SpawnActorOnDeath: + Actor: OVLD.Husk + RequiresCondition: !being-warped + ChangesHealth: + PercentageStep: 1 + Delay: 25 + StartIfBelow: 50 + DamageCooldown: 150 + ProducibleWithLevel: + Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded + Selectable: + DecorationBounds: 1877, 1621, 0, -170 + Carryable: + LocalOffset: 0,0,500 + WithIdleOverlay@MINDCONTROL: + Offset: 0,0,512 + -Crushable: + Voiced: + VoiceSet: OverlordVoice + AttackMove: + Voice: Attack + WithRestartableIdleOverlay@ATOMICAMMO: + RequiresCondition: atomic-ammo && has-atomic-ammo < 6 + WithAmmoPipsDecoration@ATOMICAMMO: + PipCount: 3 + AmmoPool@ATOMICAMMO: + Ammo: 6 + ReloadAmmoPool@ATOMICAMMO: + Count: 6 + RequiresCondition: atomic-ammo && has-atomic-ammo < 6 + ProximityExternalCondition@InspirationOvld: + Range: 6c0 + Condition: ovld-inspiration + ValidRelationships: Ally + AffectsParent: true + WithRadiatingCircle: + EndRadius: 6c0 + Interval: 75 + Duration: 50 + ValidRelationships: Ally + AlwaysShowMaxRange: true + ReplacedInQueue: + Actors: ovld.atomic, ovld.erad + Upgradeable@ATOMIC: + Type: atomicengines.upgrade + UpgradingCondition: upgrading + Actor: ovld.atomic + UpgradeAtActors: fix, rep, srep + BuildDuration: 100 + RequiresCondition: !mindcontrolled + Upgradeable@ERAD: + Type: erad.upgrade + UpgradingCondition: upgrading + Actor: ovld.erad + UpgradeAtActors: fix, rep, srep + BuildDuration: 100 + RequiresCondition: !mindcontrolled + Encyclopedia: + Category: Soviets/Vehicles + EncyclopediaExtras: + AdditionalInfo: Requires Infantry Doctrine. + +OVLD.ATOMIC: + Inherits: OVLD + Tooltip: + Name: Atomic Overlord Tank + Buildable: + Prerequisites: stek, ~vehicles.soviet, ~ovld.upgrade, ~!erad.upgrade, ~atomicengines.upgrade, ~techlevel.high + BuildPaletteOrder: 236 + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor + Weaknesses: • Cannot attack Aircraft + Attributes: • Can crush smaller vehicles and concrete walls\n• Self repairs to 50% out of combat\n• Empowers nearby basic infantry\n• Explodes and leaves radiation on death + RenderSprites: + Image: ovldi + ReplacedInQueue: + Actors: ovld.erad.atomic + Upgradeable@ERAD: + Actor: ovld.erad.atomic + -Upgradeable@ATOMIC: + FireWarheadsOnDeath@ATOMICENGINES: + Weapon: UnitExplodeIraqTank + EmptyWeapon: UnitExplodeIraqTank + RequiresCondition: !being-warped + SpeedMultiplier: + Modifier: 125 + -SpawnActorOnDeath: + EncyclopediaExtras: + VariantOf: OVLD + +OVLD.ERAD: + Inherits: OVLD + Tooltip: + Name: Overlord Eradicator + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor, Heavy Armor + Attributes: • Can crush smaller vehicles and concrete walls\n• Self repairs to 50% out of combat\n• Empowers nearby basic infantry\n• Irradiates vehicles causing them to take more damage, deal less damage, and damage nearby units + Buildable: + Prerequisites: stek, ~vehicles.soviet, ~ovld.upgrade, ~erad.upgrade, ~!atomicengines.upgrade, ~techlevel.high + BuildPaletteOrder: 237 + Description: Enormous slow tank equipped with radiation cannons and a commissar tower which supports infantry in combat. + Armament@PRIMARY: + Weapon: OverlordRadBeamWeapon + MuzzlePalette: caneon + -PauseOnCondition: + -ReloadingCondition: + LocalOffset: 260,300,240, 260,-300,240 + -Armament@ATOMICAMMO: + -ExternalCondition@ATOMICAMMO: + -WithRestartableIdleOverlay@ATOMICAMMO: + -FirepowerMultiplier@ATOMICAMMO: + -Targetable@ATOMICAMMO: + -AmmoPool@ATOMICAMMO: + -WithAmmoPipsDecoration@ATOMICAMMO: + -ReloadAmmoPool@ATOMICAMMO: + -ReloadAmmoPoolCA@ATOMICAMMODECAY: + -DamagedByTintedCells@RADSTRONG: + -DamagedByTintedCells@RADMED: + ReplacedInQueue: + Actors: ovld.erad.atomic + Upgradeable@ATOMIC: + Actor: ovld.erad.atomic + -Upgradeable@ERAD: + Voiced: + VoiceSet: EradVoice + EncyclopediaExtras: + Subfaction: iraq + +OVLD.ERAD.ATOMIC: + Inherits: OVLD.ATOMIC + Tooltip: + Name: Atomic Overlord Eradicator + TooltipExtras: + Strengths: • Strong vs Infantry, Light Armor, Heavy Armor + Attributes: • Can crush smaller vehicles and concrete walls\n• Self repairs to 50% out of combat\n• Empowers nearby basic infantry\n• Explodes and leaves radiation on death\n• Irradiates vehicles causing them to take more damage, deal less damage, and damage nearby units + Buildable: + Prerequisites: stek, ~vehicles.soviet, ~ovld.upgrade, ~erad.upgrade, ~atomicengines.upgrade, ~techlevel.high + BuildPaletteOrder: 238 + Description: Enormous slow tank equipped with radiation cannons and a commissar tower which supports infantry in combat. + Armament@PRIMARY: + Weapon: OverlordRadBeamWeapon + MuzzlePalette: caneon + -PauseOnCondition: + -ReloadingCondition: + LocalOffset: 260,300,240, 260,-300,240 + -Armament@ATOMICAMMO: + -ExternalCondition@ATOMICAMMO: + -WithRestartableIdleOverlay@ATOMICAMMO: + -FirepowerMultiplier@ATOMICAMMO: + -Targetable@ATOMICAMMO: + -AmmoPool@ATOMICAMMO: + -WithAmmoPipsDecoration@ATOMICAMMO: + -ReloadAmmoPool@ATOMICAMMO: + -ReloadAmmoPoolCA@ATOMICAMMODECAY: + -DamagedByTintedCells@RADSTRONG: + -DamagedByTintedCells@RADMED: + RenderSprites: + Image: ovld.eradi + -WithDecoration@UpgradeOverlay: + -ReplacedInQueue: + -Upgradeable@ERAD: + Voiced: + VoiceSet: EradVoice + EncyclopediaExtras: + Subfaction: iraq + VariantOf: OVLD.ERAD + +THWK: + Inherits: ^TankTD + Inherits@GAINSEXPERIENCE: ^GainsExperience + Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove + Inherits@SLOWCRUSH: ^SlowedByCrushing + Inherits@HeavyArmor: ^HeavyArmor + RenderSprites: + Valued: + Cost: 1850 + Tooltip: + Name: Tomahawk Launcher + UpdatesPlayerStatistics: + AddToArmyValue: true + Buildable: + BuildPaletteOrder: 260 + Prerequisites: gtek, ~thwk.upgrade, ~techlevel.high + Queue: VehicleSQ, VehicleMQ + IconPalette: chrometd + Description: Extreme long-range missile artillery. + TooltipExtras: + Strengths: • Strong vs Buildings, Defenses, Light Armor + Weaknesses: • Cannot attack Aircraft\n• Has difficulty hitting moving targets\n• Cannot fire while moving\n• Rockets can be shot down by static anti-air defenses + Mobile: + Speed: 44 + Voice: Move + PauseOnCondition: launching || aiming || being-captured || empdisable || being-warped || driver-dead || notmobile + Passenger: + Voice: Move + Health: + HP: 22000 + RevealsShroud: + MinRange: 4c0 + Range: 5c0 + RevealGeneratedShroud: False + RevealsShroud@GAPGEN: + Range: 4c0 + Turreted: + TurnSpeed: 4 + RealignDelay: 0 + Armament@TARGETTER: + Name: targetter + Weapon: THTargetter + Armament@PRIMARY: + Weapon: THLauncher + PauseOnCondition: moving + AttackTurreted: + TargetFrozenActors: True + Voice: Attack + PauseOnCondition: empdisable || being-warped || blinded + Armaments: primary, targetter + AttackMove: + Voice: Attack + WithSpriteTurret@OneMissile: + RequiresCondition: loaded + WithSpriteTurret@NoMissile: + RequiresCondition: !loaded + Sequence: turret-empty + MissileSpawnerMaster: + Actors: TH + RespawnTicks: 235 + LoadedCondition: loaded + LaunchingCondition: launching + SpawnOffset: 100,426,512 + PauseOnCondition: moving + WithSpawnerMasterPipsDecoration: + Position: BottomLeft + Margin: 4, 3 + RequiresSelection: true + GrantConditionOnAttack@AIMING: + ArmamentNames: primary, targetter + Condition: aiming + RevokeDelay: 15 + RevokeAll: false + GrantConditionOnMovement@MOVING: + ValidMovementTypes: Horizontal, Vertical, Turn + Condition: moving + FireWarheadsOnDeath: + Weapon: UnitExplodeFlame + Voiced: + VoiceSet: ThwkVoice + ProducibleWithLevel: + Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded + Selectable: + DecorationBounds: 1194, 1194 + Encyclopedia: + Category: GDI/Vehicles + EncyclopediaExtras: + AdditionalInfo: Requires Bombardment Strategy. + +TH: + Inherits: ^ShootableMissile + RenderSprites: + Palette: temptd + Valued: + Cost: 50 + Tooltip: + Name: Tomahawk Missile + Health: + HP: 5000 + CruiseMissile: + LaunchAngle: 120 + Speed: 165 + MaxAltitude: 2c511 + MinAirborneAltitude: 256 + AirborneCondition: airborne + TrackTarget: true + MaxTargetMovement: 2c0 + LeavesTrailsCA: + Image: icbmsmoke + Sequences: idle, idle2, idle3, idle4 + MovingInterval: 2 + Type: CenterPosition + Offsets: -200, 0, -50 + MissileSpawnerSlave: + SpawnedExplodes: + Weapon: THWeapon + EmptyWeapon: VisualExplodeHusk + RequiresCondition: !airborne + FireWarheadsOnDeath: + Weapon: THExplodeAirborne + RequiresCondition: airborne + FireProjectilesOnDeath@Debris: + Weapons: SmallDebris + Pieces: 3, 5 + Range: 1c511, 3c0 + RequiresCondition: airborne + +BSKY: + Inherits: ^ShootableMissile + RenderSprites: + Image: bsky + Valued: + Cost: 50 + Tooltip: + Name: Black Sky Missile + Health: + HP: 5000 + GuidedMissile: + Speed: 430 + MaxTargetMovementTicks: 160 + MinAltitude: 128 + LeavesTrailsCA: + Image: icbmsmoke + Sequences: idle, idle2, idle3, idle4 + MovingInterval: 1 + Type: CenterPosition + Offsets: -200, 0, -50 + RevealsShroud: + Range: 3c512 + Type: GroundPosition + FireWarheadsOnDeath: + Weapon: BSKY + WithEnterExitWorldOverlay: + Image: smigboom + EnterSequence: enter + Palette: effect + +ZEUS: + Inherits: ^Vehicle + Inherits@GAINSEXPERIENCE: ^GainsExperience + Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove + Valued: + Cost: 2000 + Tooltip: + Name: Zeus Artillery + UpdatesPlayerStatistics: + AddToArmyValue: true + Buildable: + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 224 + Prerequisites: ~vehicles.allies, alhq, ~greece.coalition, ~techlevel.high + Description: Extreme long range artillery that can generate localized storm clouds. + TooltipExtras: + Strengths: • Strong vs Buildings, Defenses + Weaknesses: • Cannot attack Aircraft\n• Has difficulty hitting moving targets\n• Cannot fire while moving + Selectable: + DecorationBounds: 1280, 1280 + Health: + HP: 20000 + Armor: + Type: Light + Mobile: + Speed: 46 + Voice: Move + Passenger: + Voice: Move + RevealsShroud: + Range: 5c0 + Armament: + Weapon: ZeusCloud + AttackFrontalCharged: + TargetFrozenActors: True + ForceFireIgnoresActors: True + PauseOnCondition: empdisable || being-warped || blinded + FacingTolerance: 16 + ChargeLevel: 75 + DischargeRate: 5 + ShotsPerCharge: 1 + ShowSelectionBar: true + SelectionBarColor: d5cfff + ChargingCondition: charging + Voice: Attack + LosesChargeWhileTurning: true + ProducibleWithLevel: + Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded + AttackMove: + Voice: Attack + AmbientSoundCA: + RequiresCondition: charging + SoundFiles: zeuscharge.aud + WithIdleOverlay@Active: + Sequence: active-overlay + RequiresCondition: charging + Offset: -256,0,256 + IsDecoration: True + WithFacingSpriteBody: + RequiresCondition: !charging + WithFacingSpriteBody@Active: + Name: body-charging + Sequence: shoot + RequiresCondition: charging + Voiced: + VoiceSet: ZeusVoice + Encyclopedia: + Category: Allies/Vehicles + EncyclopediaExtras: + AdditionalInfo: Requires Greece Coalition. + +MOLE: + Inherits: ^Vehicle-NOUPG + -Voiced: + -AttackMove: + -Guard: + -Repairable: + -Capturable: + -CaptureNotification: + -Parachutable: + -WithParachute: + -WithFacingSpriteBody: + -ChronoshiftableCA: + -HealthCapDamageMultiplier@CHRONO: + -Carryable: + -GrantCondition@CarriedImmobile: + Tooltip: + Name: Subterranean APC + Valued: + Cost: 2000 + Armor: + Type: Light + Health: + HP: 52000 + RevealsShroud: + Range: 6c0 + WithSpriteBody@Unburrowing: + Name: unburrowing + StartSequence: unburrow + RequiresCondition: unburrowing + WithSpriteBody@Arrived: + RequiresCondition: !burrowing && !being-warped && !unburrowing + WithSpriteBody@Warped: + Name: warped + Sequence: paused + RequiresCondition: !burrowing && being-warped && !unburrowing + WithSpriteBody@Burrowing: + StartSequence: burrow + Sequence: empty + RequiresCondition: burrowing + Name: burrowing + FireWarheadsOnDeath: + RequiresCondition: !burrowing && !being-warped + KillsSelf: + RemoveInstead: true + Delay: 35 + RequiresCondition: burrowing + GrantTimedCondition@Unburrow: + Condition: unburrowing + Duration: 30 + GrantCondition@Unload: + Condition: unload + GrantDelayedCondition@Burrow: + Delay: 200 + Condition: burrowing + PauseOnCondition: being-warped + ActorLostNotification: + RequiresCondition: !burrowing + -Mobile: + Immobile: + RejectsOrders: + Targetable@MindControlImmune: + TargetTypes: MindControlImmune + Targetable@ChaosImmune: + TargetTypes: ChaosImmune + Cargo: + MaxWeight: 6 + InitialUnits: acol, acol, acol, n3, n3, n4 + BeforeUnloadDelay: 75 + WithCargoSounds: + ExitSounds: gexit1a.aud + UnloadOnCondition@Unload: + RequiresCondition: unload + BotOnly: False + Targetable: + RequiresCondition: !being-warped && !burrowing && !unburrowing + Targetable@C4Plantable: + RequiresCondition: !being-warped && !burrowing && !unburrowing + Targetable@TNTPlantable: + RequiresCondition: !being-warped && !burrowing && !unburrowing + Targetable@REPAIR: + RequiresCondition: !being-warped && damaged && !repair-cooldown && !burrowing && !unburrowing + PeriodicExplosion@Unburrow: + Weapon: SubterraneanAPCUnburrow + RequiresCondition: !being-warped + ResetReloadWhenEnabled: false + PeriodicExplosion@Burrow: + InitialDelay: 200 + Weapon: SubterraneanAPCBurrow + RequiresCondition: !being-warped + ResetReloadWhenEnabled: false + SpawnActorOnDeath: + Actor: MOLE.Husk + RequiresCondition: !being-warped + +MOLE.UPG: + Inherits: MOLE + RenderSprites: + Image: mole + Cargo: + InitialUnits: tplr, tplr, tplr, n3c, n3c, n5 + +AVTR: + Inherits: ^TankTD + Inherits@GAINSEXPERIENCE: ^GainsExperience + Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove + Inherits@SHRAPNEL: ^ThrowsShrapnel + Inherits@HeavyArmor: ^HeavyArmor + Inherits@TANKBUSTERVULN: ^TankBusterVulnerability + Buildable: + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 273 + Prerequisites: ~vehicles.nod, tmpp, covenant.level3, ~wrath.covenant, ~techlevel.high + Description: Heavy mech armed with a powerful laser and a flamethrower. + IconPalette: chrometd + TooltipExtras: + Strengths: • Strong vs Heavy Armor, Light Armor, Infantry + Weaknesses: • Cannot attack Aircraft + Attributes: • Can crush smaller vehicles and concrete walls\n• Self repairs to 50% out of combat + Valued: + Cost: 2000 + Tooltip: + Name: Avatar + Selectable: + Bounds: 1280, 1900, 0, -250 + UpdatesPlayerStatistics: + AddToArmyValue: true + Health: + HP: 78000 + Mobile: + TurnSpeed: 18 + Speed: 56 + Locomotor: sheavytracked + Voice: Move + RevealsShroud: + MinRange: 4c0 + Range: 6c0 + RevealGeneratedShroud: False + RevealsShroud@GAPGEN: + Range: 4c0 + Armament@PRIMARY: + Weapon: AvatarLaser + LocalOffset: 850,400,350 + MuzzleSequence: muzzle + MuzzlePalette: caneon + RequiresCondition: !quantum-upgrade + Armament@PRIMARYUPG: + Name: primary-upg + Weapon: AvatarLaser.Adv + LocalOffset: 850,400,350 + MuzzleSequence: muzzle + MuzzlePalette: caneon + RequiresCondition: quantum-upgrade + Armament@SECONDARY: + Name: secondary + Weapon: AvatarFlamer + LocalOffset: 550,200,700 + MuzzleSequence: muzzle-flame + MuzzlePalette: tdeffect + RequiresCondition: !blacknapalm-upgrade + Armament@SECONDARYUPG: + Name: secondary + Weapon: AvatarFlamer.UPG + MuzzleSequence: muzzle-black + MuzzlePalette: scrin-ignore-lighting-alpha85 + LocalOffset: 550,200,700 + RequiresCondition: blacknapalm-upgrade + Armament@FF: + Name: secondary + Weapon: AvatarFlamerFF + LocalOffset: 550,200,700 + RequiresCondition: !blacknapalm-upgrade + Armament@FFUPG: + Name: secondary + Weapon: AvatarFlamerFF.UPG + LocalOffset: 550,200,700 + RequiresCondition: blacknapalm-upgrade + AmbientSoundCA@3: + SoundFiles: bigflamer-loop1.aud + InitialSound: bigflamer-start1.aud + FinalSound: bigflamer-end1.aud + RequiresCondition: flaming + InitialSoundLength: 24 + GrantConditionOnAttack@Flaming: + ArmamentNames: secondary + Condition: flaming + RevokeDelay: 10 + AttackFollowFrontal: + Armaments: primary, primary-upg, secondary + TargetFrozenActors: True + PauseOnCondition: empdisable || being-warped || blinded + FacingTolerance: 64 + Voice: Attack + MustFaceTarget: true + WithMuzzleOverlay: + ProducibleWithLevel: + Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded + Voiced: + VoiceSet: AvatarVoice + SpawnActorOnDeath: + Actor: AVTR.Husk + RequiresCondition: !being-warped + WithFacingSpriteBody: + Sequence: bodyidle + WithFacingSpriteBody@LegsIdle: + Sequence: legsidle + Name: legs + RequiresCondition: !moving && !movecooldown + WithFacingSpriteBody@LegsWalk: + Sequence: legsmove + Name: legsmove + RequiresCondition: moving || movecooldown + WithMoveAnimation@BodyMove: + ValidMovementTypes: Horizontal, Vertical + RequiresCondition: !unfolding + MoveSequence: bodymove + Body: body + WithAttackAnimation@primary: + Sequence: bodyshoot + Armament: primary + WithAttackAnimation@primary-upg: + Sequence: bodyshoot + Armament: primary-upg + WithEnabledAnimation: + Sequence: bodymake + GrantConditionOnMovement@Moving: + Condition: moving + ValidMovementTypes: Horizontal, Vertical, Turn + GrantTimedCondition@StoppedMoving: + Condition: movecooldown + Duration: 3 + RequiresCondition: !moving + GrantTimedCondition@Make: + Condition: unfolding + Duration: 40 + ChangesHealth: + PercentageStep: 1 + Delay: 25 + StartIfBelow: 50 + DamageCooldown: 150 + GrantConditionOnPrerequisite@UPG: + Condition: blacknapalm-upgrade + Prerequisites: blacknapalm.upgrade + GrantConditionOnPrerequisite@QUANTUM: + Condition: quantum-upgrade + Prerequisites: quantum.upgrade + Encyclopedia: + Category: Nod/Vehicles + EncyclopediaExtras: + AdditionalInfo: Requires Wrath Covenant. + +CUST: + Inherits: ^Tank + Inherits@GAINSEXPERIENCE: ^GainsExperience + Inherits@TRANSPORT: ^Transport + Inherits@NOUNLOADCHRONO: ^NoUnloadWhenChronoshifted + Inherits@SLOWCRUSH: ^SlowedByCrushing + Inherits@COMMANDOSKULL: ^CommandoSkull + Inherits@AIUNLOAD: ^AIUNLOAD + Inherits@HeavyArmor: ^HeavyArmor + Buildable: + Queue: VehicleSQ, VehicleMQ + BuildPaletteOrder: 272 + Prerequisites: tmpl, ~vehicles.nod, ~cust.upgrade, ~techlevel.high + Description: Heavy transport that repairs cyborgs and vehicles and empowers cyborg machine learning. + TooltipExtras: + Weaknesses: • Unarmed + Attributes: • Repairs cyborgs and vehicles\n• Nearby cyborgs gain experience faster + Selectable: + DecorationBounds: 1536, 1536, 0, -128 + Valued: + Cost: 1500 + Tooltip: + Name: Custodian + UpdatesPlayerStatistics: + AddToArmyValue: false + AddToAssetsValue: false + Health: + HP: 70000 + Mobile: + Speed: 50 + TurnSpeed: 16 + Voice: Move + Voiced: + VoiceSet: CyborgVoice + Passenger: + Voice: Move + CargoCondition: passenger + RevealsShroud: + MinRange: 6c0 + Range: 8c0 + RevealGeneratedShroud: False + RevealsShroud@GAPGEN: + Range: 6c0 + Cargo: + Types: Infantry, Hacker + MaxWeight: 5 + LoadingCondition: notmobile + LoadedCondition: cargo + PassengerConditions: + e7: loaded-cmdo + rmbo: loaded-cmdo + bori: loaded-cmdo + yuri: loaded-cmdo + mast: loaded-cmdo + WithCargoSounds: + EnterSounds: genter1a.aud + ExitSounds: gexit1a.aud + CargoBlocked: + RequiresCondition: mindcontrolled + WithDecoration@COMMANDOSKULL: + RequiresCondition: loaded-cmdo + ProducibleWithLevel: + Prerequisites: vehicles.upgraded + WithProductionIconOverlay: + Types: Veterancy + Prerequisites: vehicles.upgraded + Capturable: + RequiresCondition: !being-warped && !cargo + Capturable@DRIVER_DEAD: + RequiresCondition: driver-dead && !cargo + Targetable@MindControlResistant: + TargetTypes: MindControlResistant + RequiresCondition: cargo + Targetable@MindControlImmune: + TargetTypes: MindControlImmune + RequiresCondition: loaded-cmdo + KeepsDistance: + GuardsSelection: + ValidTargets: Cyborg, Vehicle + AttackTurreted: + PauseOnCondition: empdisable || being-warped || blinded + AttackMove: + AutoTarget: + AutoTargetPriority@DEFAULT: + ValidTargets: HealableCyborg, Repairable + ValidRelationships: Ally + Armament: + Weapon: CustodianHeal + TargetRelationships: Ally + ForceTargetRelationships: None + Cursor: ability + OutsideRangeCursor: ability + Turreted: + Offset: -150,0,500 + WithIdleOverlay@SPINNER: + Sequence: spinner + Offset: -150,0,0 + ProximityExternalCondition@MachineLearning: + Range: 6c0 + Condition: machine-learning + ValidRelationships: Ally + RequiresCondition: !empdisable && !being-warped + WithRadiatingCircle@MachineLearning: + EndRadius: 6c0 + Interval: 75 + Duration: 50 + ValidRelationships: Ally + AlwaysShowMaxRange: true + Color: 0040FF60 + MaxRadiusColor: 0040FF80 + MaxRadiusFlashColor: 0040FF80 + Sellable: + RefundPercent: 10 + Encyclopedia: + Category: Nod/Vehicles + EncyclopediaExtras: + AdditionalInfo: Requires Unity Covenant. diff --git a/mods/ca/rules/world.yaml b/mods/ca/rules/world.yaml index c291d4035f..3d09a70157 100644 --- a/mods/ca/rules/world.yaml +++ b/mods/ca/rules/world.yaml @@ -4,6 +4,7 @@ ActorMap: ScreenMap: Selection: + ControlGroups: MusicPlaylist: VictoryMusic: slavesys DefeatMusic: fsmenu @@ -45,21 +46,6 @@ Tunnel: 100 Wall: 100 Tree: 100 - Locomotor@CHEM: - Name: chem - Crushes: mine, crate - SharesCell: true - TerrainSpeeds: - Clear: 100 - Rough: 90 - Road: 110 - Bridge: 100 - Ford: 70 - Ore: 80 - Gems: 80 - Tiberium: 70 - BlueTiberium: 70 - Beach: 80 Locomotor@WHEELED: Name: wheeled Crushes: mine, crate, beacon @@ -118,7 +104,7 @@ Beach: 88 Locomotor@HEAVYTRACKED: Name: heavytracked - Crushes: wall, infantry, mine, crate, heavywall, beacon + Crushes: wall, infantry, heavyinfantry, mine, crate, heavywall, beacon TerrainSpeeds: Clear: 100 Rough: 88 @@ -132,7 +118,7 @@ Beach: 88 Locomotor@SHEAVYTRACKED: Name: sheavytracked - Crushes: wall, infantry, tank, mine, crate, heavywall, beacon + Crushes: wall, infantry, heavyinfantry, tank, mine, crate, heavywall, beacon TerrainSpeeds: Clear: 100 Rough: 88 @@ -207,7 +193,7 @@ Tiberium: 88 BlueTiberium: 88 Beach: 88 - Water: 20 + Water: 35 Locomotor@CLOUD: Name: cloud Crushes: crate @@ -221,9 +207,7 @@ Ore: 100 Gems: 100 Tiberium: 100 - PathingCost: -300 BlueTiberium: 100 - PathingCost: -300 Beach: 100 Tunnel: 100 Water: 100 @@ -234,229 +218,227 @@ Locomotor@IMMOBILE: Name: immobile TerrainSpeeds: + Locomotor@SEAL: + Name: seal + Crushes: mine, crate + SharesCell: true + TerrainSpeeds: + Clear: 100 + Rough: 90 + Road: 110 + Bridge: 100 + Ford: 90 + Ore: 80 + Gems: 80 + Tiberium: 70 + BlueTiberium: 70 + Beach: 80 + Water: 50 TerrainRenderer: ShroudRenderer: FogVariants: shroud Index: 255, 16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 192, 208, 224, 240, 20, 40, 56, 65, 97, 130, 148, 194, 24, 33, 66, 132, 28, 41, 67, 134, 1, 2, 4, 8, 3, 6, 12, 9, 7, 14, 13, 11, 5, 10, 15, 255 UseExtendedIndex: true + TerrainLighting: + Faction@random: + Name: faction-random.name + InternalName: Random + RandomFactionMembers: RandomAllies, RandomSoviet, RandomGDI, RandomNOD, RandomScrin + Description: faction-random.description Faction@0: - Name: Allies + Name: faction-allies.name InternalName: allies Side: Allies Selectable: False Faction@1: - Name: England + Name: faction-england.name InternalName: england Side: Allies - Description: England: Subterfuge\n Units:\n - Sniper\n - Mirage Tank (replaces Medium Tank)\n - Camo Pillbox (replaces Pillbox)\n\n Powers:\n - GPS Scrambler\n\n Upgrades:\n - Raufoss Ammo\n\n Bonuses:\n - Fake Buildings + Description: faction-england.description Faction@2: - Name: France + Name: faction-france.name InternalName: france Side: Allies - Description: France: Fortification\n Units:\n - Battle Fortress\n - Grand Cannon (replaces Prism Tower)\n\n Powers:\n - Cluster Mines\n\n Bonuses:\n - Walls & Defences (10% Discount) + Description: faction-france.description Faction@3: - Name: Germany + Name: faction-germany.name InternalName: germany Side: Allies - Description: Germany: Innovation & Time Technology\n Units:\n - Chrono Prison\n - Tank Destroyer\n\n Powers:\n - Time Freeze\n\n Upgrades:\n - Temporal Flux\n\n Bonuses:\n - Chrono Tank (10% Discount) + Description: faction-germany.description + Faction@USA: + Name: faction-usa.name + InternalName: usa + Side: Allies + Description: faction-usa.description Faction@4: - Name: Soviet + Name: faction-soviet.name InternalName: soviet Side: Soviet Selectable: False Faction@5: - Name: Russia + Name: faction-russia.name InternalName: russia Side: Soviet - Description: Russia: Tesla Techology\n Units:\n - Tesla Tank\n - Tesla Reactor (replaces Advanced Power Plant)\n\n Powers:\n - Storm Troopers\n - Parabombs\n\n Upgrades:\n - Tesla Arcing\n\n Bonuses:\n - Tesla Coil (10% Discount)\n - Shock Trooper (10% Discount)\n - Kirov Tesla Bombs\n - V2 as Standard + Description: faction-russia.description Faction@6: - Name: Ukraine + Name: faction-ukraine.name InternalName: ukraine Side: Soviet - Description: Ukraine: Demolition\n Units:\n - Siege Tank\n - Crazy Ivan (replaces Grenadier)\n\n Powers:\n - Carpet Bomb\n - Paratroopers\n\n Upgrades:\n - Seismic Missiles\n\n Bonuses:\n - V3 Launcher (10% Discount)\n - MAD Tank (10% Discount)\n - Kirov Cluster Bombs + Description: faction-ukraine.description Faction@7: - Name: Iraq + Name: faction-iraq.name InternalName: iraq Side: Soviet - Description: Iraq: Nuclear Warfare\n Units:\n - Desolator\n - Toxin Tower (replaces Flame Tower)\n\n Powers:\n - A-Bomb\n - Paratroopers\n\n Upgrades:\n - Atomic Tanks\n\n Bonuses:\n - Demolition Truck (10% Discount)\n - Missile Silo (10% Discount)\n - Kirov Atom Bombs + Description: faction-iraq.description Faction@YURI: - Name: Yuri + Name: faction-yuri.name InternalName: yuri Side: Soviet - Description: Yuri: Mind Control & Genetics\n Units:\n - Brute\n - Chaos Drone (replaces MAD Tank)\n - Yuri (replaces Boris)\n\n Powers:\n - Genetic Mutation Bomb\n - Parabombs\n\n Upgrades:\n - Lasher Tank\n\n Bonuses:\n - Kirov Chaos Bombs - Selectable: false + Description: faction-yuri.description Faction@8: - Name: GDI + Name: faction-gdi.name InternalName: gdi Side: GDI Selectable: False Faction@9: - Name: Talon + Name: faction-talon.name InternalName: talon Side: GDI - Description: Steel Talon: Mech Warfare\n Units:\n - Juggernaut\n - Titan (replaces Mammoth Tank)\n\n Powers:\n - X-O Drop\n\n Upgrades:\n - Railgun Titan (replaces Titan)\n\n Bonuses:\n - Upgrade Center (10% Discount) + Description: faction-talon.description Faction@10: - Name: ZOCOM + Name: faction-zocom.name InternalName: zocom Side: GDI - Description: ZOCOM: Experimental Weapons\n Units:\n - Disruptor\n - Sonic Tower (replaces Advanced Guard Tower)\n\n Powers:\n - Drop Pods\n - Surgical Strike\n\n Upgrades:\n - Ion Mammoth (replaces Mammoth Tank)\n - Sonic Amplifiers\n - Point Defense Lasers\n\n Bonuses:\n - Adv. Communication Center (10% Discount) + Description: faction-zocom.description Faction@11: - Name: Eagle + Name: faction-eagle.name InternalName: eagle Side: GDI - Description: Eagle Corps: Rapid Reaction Force\n Units:\n - Aurora\n - Hover MLRS (replaces MLRS)\n\n Powers:\n - Reinforcements\n\n Upgrades:\n - Hover Mammoth (replaces Mammoth Tank)\n\n Bonuses:\n - Aircraft (10% Discount) + Description: faction-eagle.description Faction@ARC: - Name: ARC + Name: faction-arc.name InternalName: arc Side: GDI - Description: Advanced Robotics Command: Robotics\n Units:\n - Mini Drone\n - Guardian Drone (replaces Hum-Vee)\n\n Powers:\n - Nanite Repair\n\n Upgrades:\n - Drone Tanks (replaces Mammoth & Battle Tanks)\n\n Bonuses:\n - Recon Drone (-20% Cooldown)\n - Drone Carrier (10% Discount) - Selectable: false + Description: faction-arc.description Faction@12: - Name: Nod + Name: faction-nod.name InternalName: nod Side: Nod Selectable: False Faction@13: - Name: Black Hand + Name: faction-blackh.name InternalName: blackh Side: Nod - Description: Black Hand: Flame Weaponry\n Units:\n - Black Hand Trooper\n - Heavy Flame Tank (replaces Flame Tank)\n\n Powers:\n - Inferno Bomb\n - Heavy Flame Tank Drop\n\n Bonuses:\n - SSM (10% Discount)\n - Howitzer as Standard + Description: faction-blackh.description Faction@14: - Name: Marked + Name: faction-marked.name InternalName: marked Side: Nod - Description: Marked of Kane: Alien Weaponry\n Units:\n - Acolyte\n - Venom (replaces Apache)\n\n Powers:\n - Frenzy\n - Tank Drop\n\n Bonuses:\n - Laser Overcharge (10% Increased Damage)\n - Banshee (10% Discount) + Description: faction-marked.description Faction@15: - Name: Legion + Name: faction-legion.name InternalName: legion Side: Nod - Description: Legion: Stolen Technology\n Units:\n - Microwave Tank\n - APC\n - Battle Tank (replaces Light Tank)\n\n Powers:\n - Cash Hack\n - Hacker Cell\n\n Bonuses:\n - Infiltrator (20% Discount) + Description: faction-legion.description Faction@shadow: - Name: Shadow + Name: faction-shadow.name InternalName: shadow Side: Nod - Description: Shadow Sect: Stealth Technology\n Units:\n - Mobile Stealth Generator\n - Spectre (replaces SSM)\n\n Powers:\n - Shadow Team\n - Stealth Tank Drop\n\n Bonuses:\n - Stealth Tank (10% Discount) + Description: faction-shadow.description Faction@16: - Name: Scrin + Name: faction-scrin.name InternalName: scrin Side: Scrin Selectable: False Faction@17: - Name: Reaper-17 + Name: faction-reaper.name InternalName: reaper Side: Scrin - Description: Reaper-17: Frontal Assault\n Units:\n - Stormcrawler\n - Reaper Tripod (replaces Annihilator Tripod)\n\n Powers:\n - Storm Spike\n\n Bonuses:\n - Devourer (10% Discount) + Description: faction-reaper.description Faction@18: - Name: Traveler-59 + Name: faction-traveler.name InternalName: traveler Side: Scrin - Description: Traveler-59: Fast Attack\n Units:\n - Enervator\n - Lacerator (replaces Seeker)\n\n Powers:\n - Ion Surge\n\n Upgrades:\n - Advanced Articulators\n\n Bonuses:\n - Fast Walkers (+10% Speed) + Description: faction-traveler.description Faction@19: - Name: Harbinger-31 + Name: faction-harbinger.name InternalName: harbinger Side: Scrin - Description: Harbinger-31: Area Damage\n Units:\n - Ruiner\n - Darkener (replaces Devourer)\n\n Powers:\n - Buzzer Swarm\n\n Bonuses:\n - Devastator Warship (10% Discount) + Description: faction-harbinger.description Faction@20: - Name: Collector-73 + Name: faction-collector.name InternalName: collector Side: Scrin - Description: Collector-73: Leeching & Degeneration\n Units:\n - Atomizer\n - Leecher (replaces Corrupter)\n\n Powers:\n - Feeder Mutation\n\n Bonuses:\n - Field Manipulator (10% Discount) - Faction@random: - Name: Any - InternalName: Random - RandomFactionMembers: RandomAllies, RandomSoviet, RandomGDI, RandomNOD, RandomScrin - Side: Random - Description: Random Faction\nA random faction will be chosen when the game starts. + Description: faction-collector.description Faction@randomallies: - Name: Allies + Name: faction-randomallies.name InternalName: RandomAllies - RandomFactionMembers: england, france, germany + RandomFactionMembers: england, france, germany, usa Side: Random - Description: Random Allied Faction\nA random Allied faction will be chosen when the game starts. + Description: faction-randomallies.description Faction@randomsoviet: - Name: Soviet + Name: faction-randomsoviet.name InternalName: RandomSoviet - RandomFactionMembers: russia, ukraine, iraq + RandomFactionMembers: russia, ukraine, iraq, yuri Side: Random - Description: Random Soviet Faction\nA random Soviet faction will be chosen when the game starts. + Description: faction-randomsoviet.description Faction@randomgdi: - Name: GDI + Name: faction-randomgdi.name InternalName: RandomGDI - RandomFactionMembers: talon, zocom, eagle + RandomFactionMembers: talon, zocom, eagle, arc Side: Random - Description: Random GDI Faction\nA random GDI faction will be chosen when the game starts. + Description: faction-randomgdi.description Faction@randomnod: - Name: Nod + Name: faction-randomnod.name InternalName: RandomNOD - RandomFactionMembers: blackh, marked, legion + RandomFactionMembers: blackh, marked, legion, shadow Side: Random - Description: Random Nod Faction\nA random Nod faction will be chosen when the game starts. + Description: faction-randomnod.description Faction@randomscrin: - Name: Scrin + Name: faction-randomscrin.name InternalName: RandomScrin RandomFactionMembers: reaper, traveler, harbinger, collector Side: Random - Description: Random Scrin Faction\nA random Scrin faction will be chosen when the game starts. - ResourceType@ore: - Type: Ore - Name: Valuable Minerals - ResourceType: 1 - TerrainType: Ore - Palette: player - Sequences: gold01,gold02,gold03,gold04 - MaxDensity: 12 - ValuePerUnit: 25 - AllowedTerrainTypes: Clear,Road - AllowUnderActors: true - ResourceType@gem: - Type: Gems - Name: Valuable Minerals - ResourceType: 2 - TerrainType: Gems - Palette: player - Sequences: gem01,gem02,gem03,gem04 - MaxDensity: 3 - ValuePerUnit: 50 - AllowedTerrainTypes: Clear,Road - AllowUnderActors: true - ResourceType@green-tib: - Type: Tiberium - ResourceType: 3 - Palette: tiberiumpalette - TerrainType: Tiberium - Sequences: ti1,ti2,ti3,ti4,ti5,ti6,ti7,ti8,ti9,ti10,ti11,ti12 - MaxDensity: 12 - ValuePerUnit: 25 - Name: Tiberium - AllowedTerrainTypes: Clear,Road - AllowUnderActors: true - ResourceType@blue-tib: - Type: BlueTiberium - ResourceType: 4 - Palette: bluetiberium - TerrainType: BlueTiberium - Sequences: bti1,bti2,bti3,bti4,bti5,bti6,bti7,bti8,bti9,bti10,bti11,bti12 - MaxDensity: 12 - ValuePerUnit: 50 - Name: Azure Tiberium - AllowedTerrainTypes: Clear,Road - AllowUnderActors: true + Description: faction-randomscrin.description ResourceRenderer: - RenderTypes: Ore, Gems, Tiberium, BlueTiberium + ResourceTypes: + Ore: + Sequences: gold01, gold02, gold03, gold04 + Palette: player + Name: Valuable Minerals + Gems: + Sequences: gem01, gem02, gem03, gem04 + Palette: player + Name: Valuable Minerals + Tiberium: + Sequences: ti1,ti2,ti3,ti4,ti5,ti6,ti7,ti8,ti9,ti10,ti11,ti12 + Palette: tiberiumpalette + Name: Tiberium + BlueTiberium: + Sequences: bti1,bti2,bti3,bti4,bti5,bti6,bti7,bti8,bti9,bti10,bti11,bti12 + Palette: bluetiberium + Name: Azure Tiberium + BlackTiberium: + Sequences: bti1,bti2,bti3,bti4,bti5,bti6,bti7,bti8,bti9,bti10,bti11,bti12 + Palette: blacktiberium + Name: Black Tiberium World: Inherits: ^BaseWorld ChatCommands: DevCommands: DebugVisualizationCommands: + HierarchicalPathFinderOverlay: + SquadPathOverlay: + PathFinderOverlay: PlayerCommands: HelpCommand: ScreenShaker: BuildingInfluence: - ProductionQueueFromSelection: - ProductionPaletteWidget: PRODUCTION_PALETTE + ProductionQueueFromSelectionCA: + ProductionTabsWidget: PRODUCTION_TABS LegacyBridgeLayer: - Bridges: bridge1, bridge2, br1, br2, br3, sbridge1, sbridge2, sbridge3, sbridge4, sbridge5, brg1, brg2, brg3, brv1, brv2, brv3, brh1, brh2, brh3 + Bridges: bridge1, bridge2, br1, br2, br3, sbridge1, sbridge2, sbridge3, sbridge4, sbridge5, sbridge6, sbridge7, brg1, brg2, brg3, brv1, brv2, brv3, brh1, brh2, brh3 CustomTerrainDebugOverlay: CrateSpawner: DeliveryAircraft: c17 @@ -466,9 +448,8 @@ World: SpawnInterval: 3000 WaterChance: 20 InitialSpawnDelay: 1500 - CheckboxDisplayOrder: 1 + CheckboxDisplayOrder: 5 CheckboxEnabled: false - DomainIndex: SmudgeLayer@SCORCH: Type: Scorch Sequence: scorches @@ -483,6 +464,14 @@ World: SmokeImage: scorch_flames SmokeSequences: smoke MaxSmokeOffsetDistance: 213 + SmudgeLayer@SCORCHBLACK: + Type: Scorch-Black + Sequence: scorches + SmokeChance: 35 + SmokeImage: scorch_flames + SmokeSequences: medium_flame_black, small_flame_black, smoke + MaxSmokeOffsetDistance: 213 + SmokePalette: scrineffect SmudgeLayer@CRATER: Type: Crater Sequence: craters @@ -491,6 +480,33 @@ World: SmokeSequences: idle MaxSmokeOffsetDistance: 213 ResourceLayer: + RecalculateResourceDensity: true + ResourceTypes: + Ore: + ResourceIndex: 1 + TerrainType: Ore + AllowedTerrainTypes: Clear, Road + MaxDensity: 12 + Gems: + ResourceIndex: 2 + TerrainType: Gems + AllowedTerrainTypes: Clear, Road + MaxDensity: 8 + Tiberium: + ResourceIndex: 3 + TerrainType: Tiberium + AllowedTerrainTypes: Clear, Road + MaxDensity: 12 + BlueTiberium: + ResourceIndex: 4 + TerrainType: BlueTiberium + AllowedTerrainTypes: Clear, Road + MaxDensity: 8 + BlackTiberium: + ResourceIndex: 5 + TerrainType: Tiberium + AllowedTerrainTypes: Clear, Road + MaxDensity: 12 ResourceClaimLayer: TintedCellsLayer@RADSTRONG: Color: 00FF00 @@ -517,114 +533,115 @@ World: ZOffset: 0 Name: cryoresidue WarheadDebugOverlay: + WarheadDebugOverlayCA: SpawnMapActors: MapBuildRadius: - AllyBuildRadiusCheckboxDisplayOrder: 4 - BuildRadiusCheckboxDisplayOrder: 5 + AllyBuildRadiusCheckboxDisplayOrder: 9 + BuildRadiusCheckboxDisplayOrder: 6 MapOptions: - ShortGameCheckboxDisplayOrder: 2 - TechLevelDropdownDisplayOrder: 2 - GameSpeedDropdownDisplayOrder: 3 - CreateMPPlayers: - MPStartUnits@mcvonly: + ShortGameCheckboxDisplayOrder: 1 + TechLevelDropdownDisplayOrder: 4 + GameSpeedDropdownDisplayOrder: 2 + CreateMapPlayers: + StartingUnits@mcvonly: Class: none - ClassName: MCV Only - Factions: allies, england, france, germany, soviet, russia, ukraine, iraq + ClassName: options-starting-units.mcv-only + Factions: allies, england, france, germany, usa, soviet, russia, ukraine, iraq, yuri BaseActor: mcv - MPStartUnits@lightallies: + StartingUnits@lightallies: Class: light - ClassName: Light Support - Factions: allies, england, france, germany + ClassName: options-starting-units.light-support + Factions: allies, england, france, germany, usa BaseActor: mcv SupportActors: e1,e1,e1,e3,e3 InnerSupportRadius: 3 OuterSupportRadius: 5 - MPStartUnits@lightsoviet: + StartingUnits@lightsoviet: Class: light - ClassName: Light Support - Factions: soviet, russia, ukraine, iraq + ClassName: options-starting-units.light-support + Factions: soviet, russia, ukraine, iraq, yuri BaseActor: mcv SupportActors: e1,e1,e1,e3,e3 InnerSupportRadius: 3 OuterSupportRadius: 5 - MPStartUnits@heavyallies: + StartingUnits@heavyallies: Class: heavy - ClassName: Heavy Support - Factions: allies, england, france, germany + ClassName: options-starting-units.heavy-support + Factions: allies, england, france, germany, usa BaseActor: mcv SupportActors: e1,e1,e1,e3,e3,e3,2tnk,2tnk InnerSupportRadius: 3 OuterSupportRadius: 5 - MPStartUnits@heavysoviet: + StartingUnits@heavysoviet: Class: heavy - ClassName: Heavy Support - Factions: soviet, russia, ukraine, iraq + ClassName: options-starting-units.heavy-support + Factions: soviet, russia, ukraine, iraq, yuri BaseActor: mcv SupportActors: e1,e1,e1,e3,e3,3tnk,3tnk InnerSupportRadius: 3 OuterSupportRadius: 5 - MPStartUnits@mcvonly2: + StartingUnits@mcvonly2: Class: none - ClassName: MCV Only + ClassName: options-starting-units.mcv-only Factions: gdi, talon, zocom, eagle, arc, nod, blackh, marked, legion, shadow BaseActor: amcv - MPStartUnits@defaultgdia: + StartingUnits@defaultgdia: Class: light - ClassName: Light Support + ClassName: options-starting-units.light-support Factions: gdi, talon, zocom, eagle, arc BaseActor: amcv SupportActors: n1,n1,n1,n3,n3 InnerSupportRadius: 3 OuterSupportRadius: 5 - MPStartUnits@defaultnoda: + StartingUnits@defaultnoda: Class: light - ClassName: Light Support + ClassName: options-starting-units.light-support Factions: nod, blackh, marked, legion, shadow BaseActor: amcv SupportActors: n1,n1,n1,n3,n3 InnerSupportRadius: 3 OuterSupportRadius: 5 - MPStartUnits@heavynoda: + StartingUnits@heavynoda: Class: heavy - ClassName: Heavy Support + ClassName: options-starting-units.heavy-support Factions: nod, blackh, marked, legion, shadow BaseActor: amcv SupportActors: n1,n1,n1,n3,n3,mtnk,mtnk InnerSupportRadius: 3 OuterSupportRadius: 5 - MPStartUnits@heavygdia: + StartingUnits@heavygdia: Class: heavy - ClassName: Heavy Support + ClassName: options-starting-units.heavy-support Factions: gdi, talon, zocom, eagle, arc BaseActor: amcv SupportActors: n1,n1,n1,n3,n3,mtnk,mtnk InnerSupportRadius: 3 OuterSupportRadius: 5 - MPStartUnits@mcvonlyscrin: + StartingUnits@mcvonlyscrin: Class: none - ClassName: MCV Only + ClassName: options-starting-units.mcv-only Factions: scrin, reaper, traveler, harbinger, collector BaseActor: smcv - MPStartUnits@lightscrin: + StartingUnits@lightscrin: Class: light - ClassName: Light Support + ClassName: options-starting-units.light-support Factions: scrin, reaper, traveler, harbinger, collector BaseActor: smcv SupportActors: s1,s1,s1,s3,s3 InnerSupportRadius: 3 OuterSupportRadius: 5 - MPStartUnits@heavyscrin: + StartingUnits@heavyscrin: Class: heavy - ClassName: Heavy Support + ClassName: options-starting-units.heavy-support Factions: scrin, reaper, traveler, harbinger, collector BaseActor: smcv SupportActors: s1,s1,s1,s3,s3,seek,gunw InnerSupportRadius: 3 OuterSupportRadius: 5 - MPStartLocations: - SeparateTeamSpawnsCheckboxDisplayOrder: 6 - SpawnMPUnits: - DropdownDisplayOrder: 1 + MapStartingLocations: + SeparateTeamSpawnsCheckboxDisplayOrder: 12 + SpawnStartingUnits: + DropdownDisplayOrder: 5 PathFinder: ValidateOrder: DebugPauseState: @@ -635,6 +652,7 @@ World: LoadWidgetAtGameStart: ScriptTriggers: TimeLimitManager: + TimeLimitDisplayOrder: 6 TimeLimitWarnings: 40: FourtyMinutesRemaining 30: ThirtyMinutesRemaining @@ -645,12 +663,80 @@ World: 3: WarningThreeMinutesRemaining 2: WarningTwoMinutesRemaining 1: WarningOneMinuteRemaining + ColorPickerManager: + PreviewActor: fact.colorpicker + FactionPreviewActors: + england: fact.colorpicker + france: fact.colorpicker + germany: fact.colorpicker + usa: fact.colorpicker + russia: fact.colorpicker + ukraine: fact.colorpicker + iraq: fact.colorpicker + yuri: fact.colorpicker + marked: afac.colorpicker + legion: afac.colorpicker + blackh: afac.colorpicker + shadow: afac.colorpicker + talon: afac.colorpicker + eagle: afac.colorpicker + zocom: afac.colorpicker + arc: afac.colorpicker + reaper: sfac.colorpicker + harbinger: sfac.colorpicker + traveler: sfac.colorpicker + collector: sfac.colorpicker + Random: fact.colorpicker + RandomAllies: fact.colorpicker + RandomSoviet: fact.colorpicker + RandomNod: afac.colorpicker + RandomGdi: afac.colorpicker + RandomScrin: sfac.colorpicker + HsvSaturationRange: 0.22, 0.97 + HsvValueRange: 0.41, 0.95 + PresetColors: F20C0C, F26A07, F2DB07, 18F221, 0790F2, 242DF2, 7818F2, F218EA, D68181, BFA995, F2CF74, 9DF2BF, 1DF2E5, 99ACF2, C39DF2, F299D9, 731C1C, 734B2F, 6F7322, 0B7310, 048282, 293F78, 574173, 712A73 + SimilarityThreshold: 2 + OrderEffects: + TerrainFlashImage: moveflsh + TerrainFlashSequence: idle + TerrainFlashPalette: moveflash + ActorFlashType: Tint + RevealedPlayersManager: EditorWorld: Inherits: ^BaseWorld EditorActorLayer: EditorCursorLayer: EditorResourceLayer: - EditorSelectionLayer: + RecalculateResourceDensity: true + ResourceTypes: + Ore: + ResourceIndex: 1 + TerrainType: Ore + AllowedTerrainTypes: Clear, Road + MaxDensity: 12 + Gems: + ResourceIndex: 2 + TerrainType: Gems + AllowedTerrainTypes: Clear, Road + MaxDensity: 8 + Tiberium: + ResourceIndex: 3 + TerrainType: Tiberium + AllowedTerrainTypes: Clear, Road + MaxDensity: 12 + BlueTiberium: + ResourceIndex: 4 + TerrainType: BlueTiberium + AllowedTerrainTypes: Clear, Road + MaxDensity: 8 + BlackTiberium: + ResourceIndex: 5 + TerrainType: Tiberium + AllowedTerrainTypes: Clear, Road + MaxDensity: 12 + MarkerLayerOverlay: LoadWidgetAtGameStart: - EditorActionManager: \ No newline at end of file + EditorActionManager: + BuildableTerrainOverlay: + AllowedTerrainTypes: Clear, Road diff --git a/mods/ca/scripts/campaign.lua b/mods/ca/scripts/campaign.lua new file mode 100644 index 0000000000..5cbc457a76 --- /dev/null +++ b/mods/ca/scripts/campaign.lua @@ -0,0 +1,2788 @@ +--[[ + Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + This file is part of OpenRA Combined Arms, which is free software. + It is made available to you under the terms of the GNU General Public License + as published by the Free Software Foundation, either version 3 of the License, + or (at your option) any later version. For more information, see COPYING. +]] + +Difficulty = Map.LobbyOptionOrDefault("difficulty", "normal") +GameSpeed = UtilsCA.GameSpeed() + +StructureBuildTimeMultipliers = { + easy = 3, + normal = 2, + hard = 1.1, + vhard = 0.9, + brutal = 0.8 +} + +McvRebuildDelay = { + easy = DateTime.Minutes(25), -- not used by default + normal = DateTime.Minutes(15), -- not used by default + hard = DateTime.Minutes(8), + vhard = DateTime.Minutes(5), + brutal = DateTime.Minutes(3), +} + +UnitBuildTimeMultipliers = { + easy = 1.25, -- 2000 value/min per queue (~33/s) + normal = 0.81, -- 3086 value/min per queue (~51/s) + hard = 0.6, -- 4166 value/min per queue (~69/s) + vhard = 0.4, -- 6250 value/min per queue (~104/s) + brutal = 0.3 -- 8333 value/min per queue (~138/s) + -- 1.0 -- 2500 value/min per queue (~41.6/s) + -- 0.52 -- 4807 value/min per queue (~80/s) + -- 0.34 -- 7352 value/min per queue (~122/s) + -- 0.26 -- 9615 value/min per queue (~160/s) + -- 0.2 --- 12500 value/min per queue (~208/s) +} + +AttackValueMultipliers = { + easy = 0.5, -- standard min 20/s, max 40/s + normal = 1, -- standard min 40/s, max 80/s + hard = 1.5, -- standard min 60/s, max 120/s + vhard = 2, -- standard min 80/s, max 160/s + brutal = 2.5 -- standard min 100/s, max 200/s +} + +NormalRampDuration = DateTime.Minutes(17) + +RampDurationMultipliers = { + easy = 1.06, -- 18 min + normal = 1, -- 17 min + hard = 0.94, -- 16 min + vhard = 0.88, -- 15 min + brutal = 0.82 -- 14 min +} + +AttackDelayMultipliers = { + easy = 1.5, + normal = 1, + hard = 0.83, + vhard = 0.66, + brutal = 0.5 +} + +AirAttackDelayMultipliers = { + easy = 1.11, + normal = 1, + hard = 0.88, + vhard = 0.77, + brutal = 0.66 +} + +CompositionValueMultipliers = { + easy = 0.5, + normal = 0.67, + hard = 0.83, + vhard = 1, + brutal = 1.2 +} + +HarvesterDeathDelayTime = { + easy = DateTime.Seconds(60), + normal = DateTime.Seconds(40), + hard = DateTime.Seconds(20), + vhard = DateTime.Seconds(20), + brutal = DateTime.Seconds(20) +} + +AiAdvancedUpgradeDelay = { + easy = DateTime.Minutes(15), + normal = DateTime.Minutes(15), + hard = DateTime.Minutes(15), + vhard = DateTime.Minutes(14), + brutal = DateTime.Minutes(13) +} + +CashAdjustments = { + easy = 4000, + normal = 0, + hard = -1000, + vhard = -1000, + brutal = -1000 +} + +MaxSpecialistAir = { + easy = 1, + normal = 3, + hard = 6, + vhard = 12, + brutal = 18 +} + +CapturedCreditsAmount = 1250 + +EnforceAiBuildRadius = false + +ConyardTypes = { "fact", "afac", "sfac" } + +HarvesterTypes = { "harv", "harv.td", "harv.td.upg", "harv.scrin", "harv.chrono", "harv.td.upg" } + +McvTypes = { "mcv", "amcv", "smcv" } + +BarracksTypes = { "tent", "barr", "pyle", "hand", "port" } + +FactoryTypes = { "weap", "weap.td", "wsph", "airs" } + +RefineryTypes = { "proc", "proc.td", "proc.scrin" } + +AirProductionTypes = { "hpad", "afld", "afld.gdi", "hpad.td", "grav" } + +NavalProductionTypes = { "syrd", "spen", "syrd.gdi", "spen.nod" } + +CashRewardOnCaptureTypes = { "proc", "proc.td", "proc.scrin", "silo", "silo.td", "silo.scrin" } + +WallTypes = { "sbag", "fenc", "brik", "cycl", "barb" } + +KeyStructures = { "fact", "afac", "sfac", "proc", "proc.td", "proc.scrin", "weap", "weap.td", "airs", "wsph", "dome", "hq", "nerv", "atek", "stek", "gtek", "tmpl", "scrt", "mcv", "amcv", "smcv" } + +DefaultQueueProducers = { + Infantry = BarracksTypes, + Vehicles = FactoryTypes, + Aircraft = AirProductionTypes, + Ships = NavalProductionTypes +} + +-- used to define actors and/or types of actors that the AI should not rebuild +RebuildExcludes = { + -- USSR = { + -- Actors = { Actor }, + -- Types = { "proc" } + -- } +} + +-- used to define functions to be called when a building is rebuilt +RebuildFunctions = { + -- USSR = function(building) + -- -- do something + -- end +} + +-- should be populated with the human players in the mission +MissionPlayers = { } + +-- should be populated with squads definitions needed by the mission +Squads = { } + +-- +-- begin automatically populated vars (do not assign values to these) +-- + +-- stores the player base locations (recalculated at intervals) +PlayerBaseLocations = { } + +-- queued structures for AI +BuildingQueues = { } + +-- stores active squad leaders +SquadLeaders = { } + +-- stores actors which have called for help so they don't do so repeatedly +AlertedUnits = { } + +-- per production structure, stores which squad to assign produced units to next +SquadAssignmentQueue = { } + +-- stores which AI production structures have triggers assigned to prevent them being added multiple times +OnProductionTriggers = { } + +-- when player kills an AI harvester it delays the production of the next attack wave +HarvesterDeathStacks = { } + +-- minimum time until next special composition for each AI player +SpecialCompositionMinTimes = { } + +-- caches unit costs for adjusting composition difficulty +UnitCosts = { } + +-- player characteristics used to enable AI behaviours +PlayerCharacteristics = { } + +-- stores original AI conyards for rebuilding purposes +AiConyards = { } + +-- stores queue of conyards that need rebuilding +AiConyardRebuildQueue = { } + +-- stores actors that have a trigger assigned for rebuilding AI conyards +McvProductionTriggers = { } + +-- stores buildings that should be sold on capture attempts +BuildingsToSellOnCaptureAttempt = { } + +-- stores buildings that should trigger defense to be built on capture attempts +BuildingsToDefendOnCaptureAttempt = { } + +-- +-- end automatically populated vars +-- + +-- extra functions called at the end of WorldLoaded/Tick in each mission script which can be overridden +AfterWorldLoaded = function() end +AfterTick = function() end + +InitObjectives = function(player) + Trigger.OnObjectiveAdded(player, function(p, id) + if p.IsLocalPlayer then + Trigger.AfterDelay(1, function() + local colour = HSLColor.Yellow + if p.GetObjectiveType(id) ~= "Primary" then + colour = HSLColor.Gray + end + Media.DisplayMessage(p.GetObjectiveDescription(id), "New " .. string.lower(p.GetObjectiveType(id)) .. " objective", colour) + end) + end + end) + + Trigger.OnObjectiveCompleted(player, function(p, id) + if p.IsLocalPlayer then + Media.PlaySoundNotification(player, "AlertBleep") + Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective completed", HSLColor.LimeGreen) + end + end) + + Trigger.OnObjectiveFailed(player, function(p, id) + if p.IsLocalPlayer then + Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective failed", HSLColor.Red) + end + end) + + Trigger.OnPlayerLost(player, function() + if player.IsLocalPlayer then + Trigger.AfterDelay(DateTime.Seconds(1), function() + Media.PlaySpeechNotification(player, "MissionFailed") + end) + end + end) + + Trigger.OnPlayerWon(player, function() + if player.IsLocalPlayer then + Trigger.AfterDelay(DateTime.Seconds(1), function() + Media.PlaySpeechNotification(player, "MissionAccomplished") + end) + end + end) +end + +Notification = function(text) + Media.DisplayMessage(text, "Notification", HSLColor.FromHex("1E90FF")) +end + +Tip = function(text) + Media.DisplayMessage(text, "Tip", HSLColor.FromHex("29F3CF")) +end + +IsNormalOrAbove = function() + return Difficulty == "normal" or IsHardOrAbove() +end + +IsNormalOrBelow = function() + return Difficulty == "easy" or Difficulty == "normal" +end + +IsHardOrAbove = function() + return Difficulty == "hard" or IsVeryHardOrAbove() +end + +IsHardOrBelow = function() + return IsNormalOrBelow() or Difficulty == "hard" +end + +IsVeryHardOrAbove = function() + return Difficulty == "vhard" or Difficulty == "brutal" +end + +IsVeryHardOrBelow = function() + return IsHardOrBelow() or Difficulty == "vhard" +end + +AttackAircraftTargets = { } +InitAttackAircraft = function(aircraft, targetPlayers, targetList, targetType) + if not aircraft.IsDead then + local typeKey = string.gsub(aircraft.Type, "%.", "_") + local fallbackTargetList = nil + local fallbackTargetType = nil + if targetList == nil and AircraftTargets[typeKey] ~= nil then + fallbackTargetList = AircraftTargets[typeKey].TargetList + end + if targetType == nil and AircraftTargets[typeKey] ~= nil then + fallbackTargetType = AircraftTargets[typeKey].TargetType + end + Trigger.OnIdle(aircraft, function(self) + if DateTime.GameTime > 1 and DateTime.GameTime % DateTime.Seconds(2) == 0 then + local actorId = tostring(aircraft) + local target = AttackAircraftTargets[actorId] + + if not target or not target.IsInWorld or target.IsDead then + target = nil + + if targetPlayers == nil then + targetPlayers = MissionPlayers + elseif type(targetPlayers) ~= "table" then + targetPlayers = { targetPlayers } + end + + if #targetPlayers == 0 then + return + end + + local targetPlayer = Utils.Random(targetPlayers) + + if targetList ~= nil and #targetList > 0 and targetType ~= nil then + target = ChooseRandomTargetOfTypes(self, targetPlayer, targetList, targetType) + end + if target == nil and fallbackTargetList ~= nil and #fallbackTargetList > 0 and fallbackTargetType ~= nil then + target = ChooseRandomTargetOfTypes(self, targetPlayer, fallbackTargetList, fallbackTargetType) + end + if target == nil then + target = ChooseRandomTarget(self, targetPlayer) + end + end + + if target then + AttackAircraftTargets[actorId] = target + self.Attack(target) + else + AttackAircraftTargets[actorId] = nil + self.ReturnToBase() + end + end + end) + end +end + +ChooseRandomTarget = function(unit, targetPlayer) + local target = nil + local enemies = Utils.Where(targetPlayer.GetActors(), function(self) + return self.HasProperty("Health") and unit.CanTarget(self) and not Utils.Any(WallTypes, function(type) return self.Type == type end) + end) + if #enemies > 0 then + target = Utils.Random(enemies) + end + return target +end + +ChooseRandomTargetOfTypes = function(unit, targetPlayer, targetList, targetType) + local target = nil + local enemies = {} + + if targetList ~= nil and #targetList > 0 then + if targetType == "ArmorType" then + enemies = targetPlayer.GetActorsByArmorTypes(targetList) + elseif targetType == "TargetType" then + enemies = targetPlayer.GetActorsByTargetTypes(targetList) + else + enemies = targetPlayer.GetActorsByTypes(targetList) + end + + local enemies = Utils.Where(enemies, function(e) + return e.HasProperty("Health") and (e.HasProperty("Move") or e.HasProperty("StartBuildingRepairs")) and unit.CanTarget(e) + end) + + if #enemies > 0 then + target = Utils.Random(enemies) + end + end + + return target +end + +ChooseRandomBuildingTarget = function(unit, targetPlayer) + local target = nil + local enemies = Utils.Where(targetPlayer.GetActors(), function(e) + return e.HasProperty("Health") and e.HasProperty("StartBuildingRepairs") and unit.CanTarget(e) and not Utils.Any(WallTypes, function(t) return e.Type == t end) + end) + if #enemies > 0 then + target = Utils.Random(enemies) + end + return target +end + +OnAnyDamaged = function(actors, func) + Utils.Do(actors, function(actor) + Trigger.OnDamaged(actor, func) + end) +end + +-- make the unit hunt when it becomes idle +IdleHunt = function(actor) + if actor.HasProperty("Hunt") and not actor.IsDead then + Trigger.OnIdle(actor, function(a) + if not a.IsDead and a.IsInWorld and not IsMissionPlayer(a.Owner) then + a.Hunt() + end + end) + end +end + +AssaultPlayerBaseOrHunt = function(actor, targetPlayers, waypoints, fromIdle) + + if actor.IsDead or not actor.HasProperty("AttackMove") or IsMissionPlayer(actor.Owner) then + return + end + + if targetPlayers == nil and #MissionPlayers > 0 then + targetPlayers = MissionPlayers + end + + if type(targetPlayers) ~= "table" then + targetPlayers = { targetPlayers } + end + + if #targetPlayers == 0 then + return + end + + local targetPlayer = Utils.Random(targetPlayers) + + Trigger.AfterDelay(1, function() + if not actor.IsDead then + if waypoints ~= nil then + Utils.Do(waypoints, function(w) + actor.AttackMove(w, 1) + end) + end + if IsMissionPlayer(targetPlayer) and PlayerBaseLocations[targetPlayer.InternalName] ~= nil then + local possibleCellsInner = Utils.ExpandFootprint({ PlayerBaseLocations[targetPlayer.InternalName] }, true) + local possibleCells = Utils.ExpandFootprint(possibleCellsInner, false) + local cell = Utils.Random(possibleCells) + actor.AttackMove(cell, 1) + elseif actor.HasProperty("Hunt") then + actor.Hunt() + end + -- only add the OnIdle trigger if it wasn't triggered from OnIdle (don't need multiple triggers) + if not fromIdle then + Trigger.AfterDelay(1, function() + if not actor.IsDead then + Trigger.OnIdle(actor, function(a) + AssaultPlayerBaseOrHunt(a, targetPlayer, nil, true) + end) + end + end) + end + end + end) +end + +IsMissionPlayer = function(player) + if #MissionPlayers == 0 or player == nil then + return false + end + + for _, p in pairs(MissionPlayers) do + if p == player then + return true + end + end + + return false +end + +MissionPlayersHaveBuildings = function() + for _, p in pairs(MissionPlayers) do + if PlayerHasBuildings(p) then + return true + end + end + return false +end + +PlayerHasBuildings = function(player) + return PlayerBuildingsCount(player) > 0 +end + +PlayerBuildingsCount = function(player) + local buildings = Utils.Where(player.GetActors(), function(a) + return a.HasProperty("StartBuildingRepairs") and not a.HasProperty("Attack") and a.Type ~= "silo" and a.Type ~= "silo.td" and a.Type ~= "silo.scrin" + end) + local mcvs = player.GetActorsByTypes(McvTypes) + return #buildings + #mcvs +end + +MissionPlayersHaveNoRequiredUnits = function() + return Utils.All(MissionPlayers, function(p) return p.HasNoRequiredUnits() end) +end + +MissionPlayersHaveNavalPresence = function() + local count = 0 + for _, p in pairs(MissionPlayers) do + local navalUnits = p.GetActorsByTypes({ "isub", "msub", "ca", "cv", "dd", "pt", "ss", "seas", "ss2", "sb", "dd2", "pt2", "lst" }) + count = count + #navalUnits + end + return count > 4 +end + +MissionPlayersHaveConyard = function() + for _, p in pairs(MissionPlayers) do + local conyards = p.GetActorsByTypes(ConyardTypes) + if #conyards > 0 then + return true + end + end + return false +end + +PlaySpeechNotificationToMissionPlayers = function(notification) + Utils.Do(MissionPlayers, function(p) + Media.PlaySpeechNotification(p, notification) + end) +end + +UpdatePlayerBaseLocations = function() + if #MissionPlayers == 0 then + return false + end + + for _, p in pairs(MissionPlayers) do + local keyBaseBuildings = p.GetActorsByTypes(KeyStructures) + if #keyBaseBuildings > 0 then + local keyBaseBuilding = Utils.Random(keyBaseBuildings) + PlayerBaseLocations[p.InternalName] = keyBaseBuilding.Location + else + PlayerBaseLocations[p.InternalName] = nil + end + end +end + +RemoveActorsBasedOnDifficultyTags = function() + local normalAndAboveActors = Map.ActorsWithTag("NormalAndAbove") + local hardAndAboveActors = Map.ActorsWithTag("HardAndAbove") + local veryHardAndAboveActors = Map.ActorsWithTag("VeryHardAndAbove") + local brutalOnlyActors = Map.ActorsWithTag("BrutalOnly") + + local actorsToRemoveAbove = { + easy = Utils.Concat(normalAndAboveActors, Utils.Concat(hardAndAboveActors, Utils.Concat(veryHardAndAboveActors, brutalOnlyActors))), + normal = Utils.Concat(hardAndAboveActors, Utils.Concat(veryHardAndAboveActors, brutalOnlyActors)), + hard = Utils.Concat(veryHardAndAboveActors, brutalOnlyActors), + vhard = brutalOnlyActors, + brutal = {} + } + + Utils.Do(actorsToRemoveAbove[Difficulty], function(a) + if not a.IsDead then + a.Destroy() + end + end) + + local easyOnlyActors = Map.ActorsWithTag("EasyOnly") + local normalAndBelowActors = Map.ActorsWithTag("NormalAndBelow") + local hardAndBelowActors = Map.ActorsWithTag("HardAndBelow") + local veryHardAndBelowActors = Map.ActorsWithTag("VeryHardAndBelow") + + local actorsToRemoveBelow = { + brutal = Utils.Concat(veryHardAndBelowActors, Utils.Concat(hardAndBelowActors, Utils.Concat(normalAndBelowActors, easyOnlyActors))), + vhard = Utils.Concat(hardAndBelowActors, Utils.Concat(normalAndBelowActors, easyOnlyActors)), + hard = Utils.Concat(normalAndBelowActors, easyOnlyActors), + normal = easyOnlyActors, + easy = {} + } + + Utils.Do(actorsToRemoveBelow[Difficulty], function(a) + if not a.IsDead then + a.Destroy() + end + end) +end + +AutoRepairBuildings = function(player) + local buildings = Utils.Where(Map.ActorsInWorld, function(self) return self.Owner == player and self.HasProperty("StartBuildingRepairs") end) + Utils.Do(buildings, function(a) + AutoRepairBuilding(a, player) + end) +end + +AutoRepairAndRebuildBuildings = function(player, maxAttempts) + local buildings = Utils.Where(Map.ActorsInWorld, function(self) return self.Owner == player and self.HasProperty("StartBuildingRepairs") end) + Utils.Do(buildings, function(a) + local excludeFromRebuilding = false + + -- never rebuild silos or conyards + if a.Type == "fact" or a.Type == "afac" or a.Type == "sfac" or a.Type == "silo" or a.Type == "silo.td" or a.Type == "silo.scrin" then + excludeFromRebuilding = true + else + if RebuildExcludes ~= nil and RebuildExcludes[player.InternalName] ~= nil then + if RebuildExcludes[player.InternalName].Actors ~= nil then + for _, aa in pairs(RebuildExcludes[player.InternalName].Actors) do + if aa == a then + excludeFromRebuilding = true + break + end + end + end + if RebuildExcludes[player.InternalName].Types ~= nil then + for _, t in pairs(RebuildExcludes[player.InternalName].Types) do + if a.Type == t then + excludeFromRebuilding = true + break + end + end + end + end + end + AutoRepairBuilding(a, player) + if not excludeFromRebuilding then + AutoRebuildBuilding(a, player, maxAttempts) + end + end) +end + +AutoRepairBuilding = function(building, player) + if building.IsDead then + return + end + Trigger.OnDamaged(building, function(self, attacker, damage) + if self.Owner == player and self.Health < (self.MaxHealth * 75 / 100) then + self.StartBuildingRepairs() + end + end) + if building.Owner == player and building.Health < (building.MaxHealth * 75 / 100) then + building.StartBuildingRepairs() + end +end + +AutoRebuildBuilding = function(building, player, maxAttempts) + if BuildingQueues[player.InternalName] == nil then + BuildingQueues[player.InternalName] = { } + end + if maxAttempts == nil then + maxAttempts = 15 + end + if building.IsDead then + return + end + local actorId = tostring(building) + Trigger.OnKilled(building, function(self, killer) + AddToRebuildQueue(building, actorId, player, building.Location, building.CenterPosition, maxAttempts) + end) + Trigger.OnSold(building, function(self) + AddToRebuildQueue(building, actorId, player, building.Location, building.CenterPosition, maxAttempts) + end) +end + +AddToRebuildQueue = function(building, actorId, player, loc, pos, maxAttempts) + local queueItem = { + Actor = building, + ActorId = actorId, + Player = player, + Location = loc, + CenterPosition = pos, + AttemptsRemaining = maxAttempts, + MaxAttempts = maxAttempts + } + + BuildingQueues[player.InternalName][#BuildingQueues[player.InternalName] + 1] = queueItem + + -- if the queue was empty, start rebuild immediately + if #BuildingQueues[player.InternalName] == 1 then + RebuildNextBuilding(player) + end +end + +RebuildNextBuilding = function(player) + if BuildingQueues[player.InternalName] == nil or #BuildingQueues[player.InternalName] == 0 then + return + end + + local queueItem = BuildingQueues[player.InternalName][1] + RebuildBuilding(queueItem) +end + +RebuildBuilding = function(queueItem) + local buildTime = math.ceil(Actor.BuildTime(queueItem.Actor.Type) * StructureBuildTimeMultipliers[Difficulty]) + + Trigger.AfterDelay(buildTime, function() + table.remove(BuildingQueues[queueItem.Player.InternalName], 1) + + -- rebuild if no units are nearby (potentially blocking), no enemy buildings are nearby, and friendly buildings are in the area (but nothing friendly in the same cell) + if CanRebuild(queueItem) then + local b = Actor.Create(queueItem.Actor.Type, true, { Owner = queueItem.Player, Location = queueItem.Location }) + AutoRepairBuilding(b, queueItem.Player) + AutoRebuildBuilding(b, queueItem.Player, queueItem.MaxAttempts) + RestoreSquadProduction(queueItem.Actor, b) + + if BuildingsToSellOnCaptureAttempt[queueItem.ActorId] then + SellOnCaptureAttempt(b) + end + + if BuildingsToDefendOnCaptureAttempt[queueItem.ActorId] then + BuildDefenseOnCaptureAttempt(b, BuildingsToDefendOnCaptureAttempt[queueItem.ActorId], true) + end + + if RebuildFunctions ~= nil and RebuildFunctions[queueItem.Player.InternalName] ~= nil then + RebuildFunctions[queueItem.Player.InternalName](b) + end + + -- otherwise add to back of queue (if attempts remaining) + elseif queueItem.AttemptsRemaining > 1 then + queueItem.AttemptsRemaining = queueItem.AttemptsRemaining - 1 + BuildingQueues[queueItem.Player.InternalName][#BuildingQueues[queueItem.Player.InternalName] + 1] = queueItem + end + + RebuildNextBuilding(queueItem.Player) + end) +end + +CanRebuild = function(queueItem) + if not HasConyard(queueItem.Player) then + return false + end + + local pos = queueItem.CenterPosition + + -- require being in conyard build radius + if EnforceAiBuildRadius then + local nearbyConyards = Map.ActorsInCircle(pos, WDist.New(20480), function(a) + return a.Owner == queueItem.Player + end) + + if #nearbyConyards == 0 then + return false + end + end + + -- require no nearby units (stops building on top of them) + if not UtilsCA.CanPlaceBuilding(queueItem.Actor.Type, queueItem.Location) then + return false + end + + -- require an owned building nearby, and no enemy buildings nearby + if not HasOwnedBuildingsNearby(queueItem.Player, pos, true) then + return false + end + + return true +end + +HasOwnedBuildingsNearby = function(player, pos, noEnemyBuildings) + local topLeft = WPos.New(pos.X - 8192, pos.Y - 8192, 0) + local bottomRight = WPos.New(pos.X + 8192, pos.Y + 8192, 0) + + local nearbyBuildings = Map.ActorsInBox(topLeft, bottomRight, function(a) + return not a.IsDead and a.Owner == player and a.HasProperty("StartBuildingRepairs") and not a.HasProperty("Attack") and a.Type ~= "silo" and a.Type ~= "silo.td" and a.Type ~= "silo.scrin" + end) + + -- require an owned building nearby + if #nearbyBuildings == 0 then + return false + end + + -- require no enemy buildings nearby + if noEnemyBuildings then + local nearbyEnemyBuildings = Map.ActorsInBox(topLeft, bottomRight, function(a) + return not a.IsDead and not a.Owner.IsAlliedWith(player) and a.HasProperty("StartBuildingRepairs") + end) + + if #nearbyEnemyBuildings > 0 then + return false + end + end + + return true +end + +AutoRebuildConyards = function(player, allDifficulties) + if not allDifficulties and IsNormalOrBelow() then + return + end + local conyards = player.GetActorsByTypes(ConyardTypes) + Utils.Do(conyards, function(a) + local conyardEntry = ConyardEntry(player, a) + table.insert(AiConyards, conyardEntry) + McvRequestTrigger(a, conyardEntry) + end) +end + +ConyardEntry = function(player, a) + local conyard = { + Player = player, + Actor = a, + AssignedMcv = nil, + PossibleProducers = {}, + } + + if a.Type == "fact" then + conyard.McvType = "mcv" + conyard.DeployLocation = a.Location + CVec.New(1, 1) + elseif a.Type == "afac" then + conyard.McvType = "amcv" + conyard.DeployLocation = a.Location + CVec.New(1, 1) + elseif a.Type == "sfac" then + conyard.McvType = "smcv" + conyard.DeployLocation = a.Location + CVec.New(1, 0) + end + + return conyard +end + +McvRequestTrigger = function(a, conyardEntry) + local isMcv = IsMcv(a) + + if not isMcv then + Trigger.OnCapture(a, function(self, captor, oldOwner, newOwner) + for idx, c in pairs(AiConyards) do + if c.Actor == self then + table.remove(AiConyards, idx) + end + end + end) + end + + Trigger.OnKilled(a, function(self, killer) + local mcvType + local owner + + -- if it was an mcv that was killed, unassign it from the conyard + if isMcv then + mcvType = self.Type + owner = self.Owner + for idx, c in pairs(AiConyards) do + if c.AssignedMcv == self then + c.AssignedMcv = nil + break + end + end + else + mcvType = conyardEntry.McvType + owner = conyardEntry.Player + for idx, c in pairs(AiConyards) do + if c.Actor == self then + local possibleProducers = Utils.Where(c.Player.GetActorsByTypes(FactoryTypes), function(p) + return UtilsCA.PathExistsForLocomotor("heavywheeled", p.Location, c.DeployLocation) + end) + c.PossibleProducers = possibleProducers + break + end + end + end + + if isMcv or conyardEntry.Player == self.Owner then + QueueMcv(owner, conyardEntry) + end + end) +end + +QueueMcv = function(player, conyardEntry) + if AiConyardRebuildQueue[player.InternalName] == nil then + AiConyardRebuildQueue[player.InternalName] = { } + end + + Trigger.AfterDelay(McvRebuildDelay[Difficulty], function() + + -- get a conyard without an assigned mcv that has friendly buildings nearby, where a producer can path to it + local possibleConyards = GetRebuildableConyardEntries(player) + + if #possibleConyards == 0 then + return + end + + local conyardEntry = Utils.Random(possibleConyards) + + if #conyardEntry.PossibleProducers == 0 then + return + end + + table.insert(AiConyardRebuildQueue[player.InternalName], conyardEntry) + local producer = Utils.Random(Utils.Where(conyardEntry.PossibleProducers, function(p) + return not p.IsDead + end)) + + if not McvProductionTriggers[tostring(producer)] then + McvProductionTriggers[tostring(producer)] = player.InternalName + Trigger.OnProduction(producer, function(p, produced) + if IsMcv(produced) and produced.Owner == player then + if #AiConyardRebuildQueue[player.InternalName] > 0 then + local targetConyardEntry = AiConyardRebuildQueue[player.InternalName][1] + table.remove(AiConyardRebuildQueue[player.InternalName], 1) + targetConyardEntry.AssignedMcv = produced + produced.Move(targetConyardEntry.DeployLocation) + produced.Deploy() + + Trigger.OnIdle(produced, function(self) + -- if deploy failed, wait 10 seconds, move to a random location within 5 cells then return and try again + produced.Wait(DateTime.Seconds(10)) + local randomCell = CPos.New(targetConyardEntry.DeployLocation.X + Utils.RandomInteger(-5, 5), targetConyardEntry.DeployLocation.Y + Utils.RandomInteger(-5, 5)) + produced.Move(randomCell) + produced.Move(targetConyardEntry.DeployLocation) + produced.Deploy() + end) + + -- if deployed + Trigger.OnRemovedFromWorld(produced, function(self) + if not self.IsDead then + Trigger.AfterDelay(DateTime.Seconds(1), function() + local nearbyConyards = Map.ActorsInCircle(Map.CenterOfCell(targetConyardEntry.DeployLocation), WDist.FromCells(2), function(a) + return a.Owner == player and IsConyard(a) + end) + if #nearbyConyards > 0 then + local deployedConyard = Utils.Random(nearbyConyards) + targetConyardEntry.Actor = deployedConyard + targetConyardEntry.AssignedMcv = nil + McvRequestTrigger(deployedConyard, targetConyardEntry) + AutoRepairBuilding(deployedConyard, player) + end + end) + end + end) + + -- if mcv is killed, re-request + McvRequestTrigger(produced) + else + produced.Destroy() + end + end + end) + end + + producer.Produce(conyardEntry.McvType) + end) +end + +GetRebuildableConyardEntries = function(player) + return Utils.Where(AiConyards, function(c) + return c.Actor.IsDead + and c.AssignedMcv == nil + and c.Player == player + and HasOwnedBuildingsNearby(player, Map.CenterOfCell(c.DeployLocation), true) + and Utils.Any(c.PossibleProducers, function(p) return not p.IsDead end) + end) +end + +RestoreSquadProduction = function(oldBuilding, newBuilding) + if Squads == nil then + return + end + + for squadName,squad in pairs(Squads) do + if squad.ProducerActors ~= nil then + for queue,actors in pairs(squad.ProducerActors) do + if actors ~= nil then + for idx, a in pairs(actors) do + if a == oldBuilding then + actors[idx] = newBuilding + end + end + end + end + end + end +end + +-- make specified units have a chance to swap targets when attacked instead of chasing one target endlessly +TargetSwapChance = function(unit, chance, isMissionPlayerFunc) + if isMissionPlayerFunc == nil then + isMissionPlayerFunc = function(p) return IsMissionPlayer(p) end + end + Trigger.OnDamaged(unit, function(self, attacker, damage) + if isMissionPlayerFunc(self.Owner) or not isMissionPlayerFunc(attacker.Owner) then + return + end + local rand = Utils.RandomInteger(1,100) + if rand > 100 - chance then + if not unit.IsDead and not attacker.IsDead and unit.HasProperty("Attack") then + unit.Stop() + if unit.CanTarget(attacker) then + unit.Attack(attacker) + end + end + end + end) +end + +CallForHelpOnDamagedOrKilled = function(actor, range, filter, validAttackingPlayerFunc) + if validAttackingPlayerFunc == nil then + validAttackingPlayerFunc = function(p) return IsMissionPlayer(p) end + end + Trigger.OnDamaged(actor, function(self, attacker, damage) + if validAttackingPlayerFunc(attacker.Owner) then + CallForHelp(self, range, filter) + end + end) + Trigger.OnKilled(actor, function(self, killer) + if validAttackingPlayerFunc(killer.Owner) then + CallForHelp(self, range, filter) + end + end) +end + +CallForHelp = function(self, range, filter) + if IsMissionPlayer(self.Owner) then + return + end + + local selfId = tostring(self) + if not AlertedUnits[selfId] then + if not self.IsDead then + AlertedUnits[selfId] = true + if not filter or filter(self) then + self.Stop() + IdleHunt(self) + end + end + + local nearbyUnits = Map.ActorsInCircle(self.CenterPosition, range, function(a) + return a.Owner.IsAlliedWith(self.Owner) and not IsMissionPlayer(a.Owner) and (not filter or filter(a)) + end) + + Utils.Do(nearbyUnits, function(nearbyUnit) + local nearbyUnitId = tostring(nearbyUnit) + if not nearbyUnit.IsDead and not AlertedUnits[nearbyUnitId] then + AlertedUnits[nearbyUnitId] = true + nearbyUnit.Stop() + IdleHunt(nearbyUnit) + end + end) + end +end + +--- attack squad functionality, requires Squads object to be defined properly in the mission script file +InitAttackSquad = function(squad, player, targetPlayers) + squad.Player = player + + -- set the squad's name based on the key if it hasn't been set manually + if squad.Name == nil then + for key, value in pairs(Squads) do + if value == squad then + squad.Name = key + break + end + end + end + + -- by default the init time is whenever the squad is initialized, + -- this can be overridden so that the AI will use later game compositions and attack values + if squad.InitTime == nil then + squad.InitTime = DateTime.GameTime + end + + if squad.InitTimeAdjustment ~= nil then + squad.InitTime = squad.InitTime + squad.InitTimeAdjustment + end + + if targetPlayers ~= nil then + -- a single player will be a "userdata" type + if type(targetPlayers) ~= "table" then + squad.TargetPlayers = { targetPlayers } + else + squad.TargetPlayers = targetPlayers + end + elseif #MissionPlayers > 0 then + squad.TargetPlayers = MissionPlayers + else + return + end + + if squad.QueueProductionStatuses == nil then + squad.QueueProductionStatuses = { } + end + + if squad.IdleUnits == nil then + squad.IdleUnits = { } + end + + if squad.Delay ~= nil then + local delay + if type(squad.Delay) == "table" and squad.Delay[Difficulty] ~= nil then + delay = squad.Delay[Difficulty] + else + delay = squad.Delay + end + Trigger.AfterDelay(delay, function() + InitAttackWave(squad) + end) + else + InitAttackWave(squad) + end +end + +InitAirAttackSquad = function(squad, player, targetPlayers, targetList, targetType) + squad.IsAirSquad = true + squad.AirTargetList = targetList + squad.AirTargetType = targetType + InitAttackSquad(squad, player, targetPlayers) +end + +InitNavalAttackSquad = function(squad, player, targetPlayers) + squad.IsNaval = true + InitAttackSquad(squad, player, targetPlayers) +end + +InitAttackWave = function(squad) + + if IsSquadInProduction(squad) then + return + end + + squad.WaveTotalCost = 0 + squad.WaveStartTime = DateTime.GameTime + + if squad.TargetPlayers == nil or #squad.TargetPlayers == 0 then + return + end + + -- randomly select target for the current wave + squad.TargetPlayer = Utils.Random(squad.TargetPlayers) + + -- make sure ActiveCondition function returns true (if it exists) + local isActive = squad.ActiveCondition == nil or squad.ActiveCondition(squad) + + if isActive then + local allCompositions + + if type(squad.Compositions) == "function" then + allCompositions = squad.Compositions(squad) + elseif squad.Compositions[Difficulty] ~= nil then + allCompositions = squad.Compositions[Difficulty] + else + allCompositions = squad.Compositions + end + + -- filter possible compositions based on game time and other requirements + local validCompositions = Utils.Where(allCompositions, function(composition) + return (composition.MinTime == nil or DateTime.GameTime >= composition.MinTime + squad.InitTime) -- after min time + and (composition.MaxTime == nil or DateTime.GameTime < composition.MaxTime + squad.InitTime) -- before max time + and (composition.RequiredTargetCharacteristics == nil or Utils.All(composition.RequiredTargetCharacteristics, function(characteristic) + return PlayerOrMissionPlayersHaveCharacteristic(squad.TargetPlayer, characteristic) + end)) -- target player has all required characteristics + and (composition.Prerequisites == nil or squad.Player.HasPrerequisites(composition.Prerequisites)) -- player has prerequisites + and (composition.EnabledFunc == nil or composition.EnabledFunc()) -- custom function for whether the composition is enabled + end) + + -- determine whether to choose a special composition (33% chance if enough time has elapsed since last used) + local useSpecialComposition = false + + if SpecialCompositionMinTimes[squad.Player.InternalName] == nil or DateTime.GameTime >= SpecialCompositionMinTimes[squad.Player.InternalName] then + useSpecialComposition = Utils.RandomInteger(1, 100) > 66 + end + + local validStandardCompositions = Utils.Where(validCompositions, function(composition) + return not composition.IsSpecial + end) + + if useSpecialComposition then + local validSpecialCompositions = Utils.Where(validCompositions, function(composition) + return composition.IsSpecial + end) + + if #validSpecialCompositions > 0 then + validCompositions = validSpecialCompositions + else + validCompositions = validStandardCompositions + end + else + validCompositions = validStandardCompositions + end + + if #validCompositions > 0 then + -- randomly select a unit composition for next wave + local chosenComposition = Utils.Random(validCompositions) + + -- if this is a special composition, another special composition can't be chosen for 8 minutes, and this composition can't be chosen again for 15 minutes + if chosenComposition.IsSpecial then + SpecialCompositionMinTimes[squad.Player.InternalName] = DateTime.GameTime + DateTime.Minutes(8) + chosenComposition.MinTime = DateTime.GameTime + DateTime.Minutes(15) + end + + squad.QueuedUnits = chosenComposition + local queuesForComposition = GetQueuesForComposition(chosenComposition) + + -- go through each queue for the current difficulty and start producing the first unit + Utils.Do(queuesForComposition, function(queue) + ProduceNextAttackSquadUnit(squad, queue, 1) + end) + else + Trigger.AfterDelay(DateTime.Seconds(15), function() + InitAttackWave(squad) + end) + end + else + Trigger.AfterDelay(DateTime.Seconds(15), function() + InitAttackWave(squad) + end) + end +end + +GetQueuesForComposition = function(composition) + local queues = { } + + for k,v in pairs(composition) do + if IsQueue(k) then + table.insert(queues, k) + end + end + + return queues +end + +IsCompositionSetting = function(key) + local settings = { + MinTime = true, + MaxTime = true, + IsSpecial = true, + RequiredTargetCharacteristics = true, + Prerequisites = true, + TargetList = true, + TargetType = true + } + return settings[key] or false +end + +IsQueue = function(key) + local queues = { + Infantry = true, + Vehicles = true, + Aircraft = true, + Ships = true + } + return queues[key] or false +end + +PlayerHasCharacteristic = function(player, characteristic) + return PlayerCharacteristics[player.InternalName] ~= nil and PlayerCharacteristics[player.InternalName][characteristic] ~= nil and PlayerCharacteristics[player.InternalName][characteristic] +end + +MissionPlayersHaveCharacteristic = function(characteristic) + return PlayerCharacteristics["MissionPlayers"] ~= nil and PlayerCharacteristics["MissionPlayers"][characteristic] ~= nil and PlayerCharacteristics["MissionPlayers"][characteristic] +end + +PlayerOrMissionPlayersHaveCharacteristic = function(player, characteristic) + return PlayerHasCharacteristic(player, characteristic) or MissionPlayersHaveCharacteristic(characteristic) +end + +ProduceNextAttackSquadUnit = function(squad, queue, unitIndex) + local units = squad.QueuedUnits[queue] + + if units == nil then + units = { } + end + + -- if there are no more units to build for this queue, check if any other queues are producing -- if none are, send the attack and produce next attack squad after interval + if unitIndex > #units then + squad.QueueProductionStatuses[queue] = false + + -- only send if units have actually been produced for this queue, and no other queues are producing + if #units > 0 and not IsSquadInProduction(squad) then + local dispatchDelay + + if squad.DispatchDelay ~= nil then + dispatchDelay = squad.DispatchDelay + else + dispatchDelay = DateTime.Seconds(2) + end + + -- delay (mostly used for Nod to allow the last unit to arrive at the Airstrip) + -- if the interval is short enough this may result in units from the subsequent squad being sent with the one that is delayed + Trigger.AfterDelay(dispatchDelay, function() + SendAttackSquad(squad) + end) + + local ticksUntilNext + + if squad.Interval ~= nil then + if type(squad.Interval) == "table" and squad.Interval[Difficulty] ~= nil then + ticksUntilNext = squad.Interval[Difficulty] + else + ticksUntilNext = squad.Interval + end + else + ticksUntilNext = CalculateIntervalForSquad(squad) + end + + -- every harvester killed delays the next wave + if HarvesterDeathStacks[squad.Player.InternalName] ~= nil and HarvesterDeathStacks[squad.Player.InternalName] > 0 then + HarvesterDeathStacks[squad.Player.InternalName] = HarvesterDeathStacks[squad.Player.InternalName] - 1 + ticksUntilNext = ticksUntilNext + HarvesterDeathDelayTime[Difficulty] + end + + Trigger.AfterDelay(ticksUntilNext, function() + InitAttackSquad(squad, squad.Player, squad.TargetPlayers) + end) + end + -- if more units to build, set them to produce after delay equal to their build time (with difficulty multiplier applied) + else + squad.QueueProductionStatuses[queue] = true + local nextUnit = units[unitIndex] + + if type(nextUnit) == "table" then + nextUnit = Utils.Random(nextUnit) + end + + local buildTime = math.ceil(Actor.BuildTime(nextUnit) * UnitBuildTimeMultipliers[Difficulty]) + + -- after the build time has elapsed + Trigger.AfterDelay(buildTime, function() + local producer = nil + + -- find appropriate producer actor (either the first/random specific actor, or if not found, randomly selected of from specified types) + if squad.ProducerActors ~= nil and squad.ProducerActors[queue] ~= nil then + local producerActors = squad.ProducerActors[queue] + if squad.RandomProducerActor then + producerActors = Utils.Shuffle(producerActors) + end + + for _, producerActor in pairs(producerActors) do + if not producerActor.IsDead and producerActor.Owner == squad.Player then + producer = producerActor + break + end + end + end + + if producer == nil then + local producers = {} + if squad.ProducerTypes ~= nil and squad.ProducerTypes[queue] ~= nil then + producers = squad.Player.GetActorsByTypes(squad.ProducerTypes[queue]) + else + producers = squad.Player.GetActorsByTypes(DefaultQueueProducers[queue]) + end + if #producers > 0 then + producer = Utils.Random(producers) + end + end + + -- create the unit + if producer ~= nil then + local producerId = tostring(producer) + + local engineersNearby = Map.ActorsInCircle(producer.CenterPosition, WDist.New(2730), function(a) + return not a.IsDead and (a.Type == "e6" or a.Type == "n6" or a.Type == "s6" or a.Type == "mast") and a.Owner ~= producer.Owner + end) + + -- prevents capturing player getting a free unit + -- the capture blocks the production until the capture completes + if #engineersNearby == 0 then + + -- set that the next unit produced from this producer should be assigned to the specified squad + AddToSquadAssignmentQueue(producerId, squad) + + -- add production trigger once for the producer (once for every owner, as the producer may be captured) + if OnProductionTriggers[producerId] == nil or OnProductionTriggers[producerId] ~= producer.Owner.InternalName then + OnProductionTriggers[producerId] = tostring(producer.Owner.InternalName) + + -- add produced unit to list of idle units for the squad + Trigger.OnProduction(producer, function(p, produced) + HandleProducedSquadUnit(produced, producerId, squad) + end) + end + + producer.Produce(nextUnit) + + if UnitCosts[nextUnit] == nil then + UnitCosts[nextUnit] = ActorCA.CostOrDefault(nextUnit) + end + + squad.WaveTotalCost = squad.WaveTotalCost + UnitCosts[nextUnit] + end + end + + -- start producing the next unit + ProduceNextAttackSquadUnit(squad, queue, unitIndex + 1) + end) + end +end + +HandleProducedSquadUnit = function(produced, producerId, squad) + + -- if the produced unit is not owned by the squad player, ignore it + if produced.Owner ~= squad.Player then + return + end + + -- we don't want to add harvesters or mcvs to squads, which are produced when replacements are needed + if IsHarvester(produced) or IsMcv(produced) then + return + end + + InitSquadAssignmentQueueForProducer(producerId, squad.Player) + + -- assign unit to IdleUnits of the next squad in the assignment queue of the producer + if SquadAssignmentQueue[squad.Player.InternalName][producerId][1] ~= nil then + local assignedSquad = SquadAssignmentQueue[squad.Player.InternalName][producerId][1] + assignedSquad.IdleUnits[#assignedSquad.IdleUnits + 1] = produced + table.remove(SquadAssignmentQueue[squad.Player.InternalName][producerId], 1) + + if produced.HasProperty("HasPassengers") and not produced.IsDead then + Trigger.OnPassengerExited(produced, function(transport, passenger) + AssaultPlayerBaseOrHunt(passenger, assignedSquad.TargetPlayer) + end) + end + + if assignedSquad.OnProducedAction ~= nil then + assignedSquad.OnProducedAction(produced) + end + + elseif produced.HasProperty("Hunt") then + produced.Hunt() + end + + TargetSwapChance(produced, 10) +end + +-- used to make sure multiple squads being produced from the same structure don't get mixed up +-- also split by player to prevent these getting jumbled if producer owner changes +AddToSquadAssignmentQueue = function(producerId, squad) + InitSquadAssignmentQueueForProducer(producerId, squad.Player) + SquadAssignmentQueue[squad.Player.InternalName][producerId][#SquadAssignmentQueue[squad.Player.InternalName][producerId] + 1] = squad +end + +InitSquadAssignmentQueueForProducer = function(producerId, player) + if SquadAssignmentQueue[player.InternalName] == nil then + SquadAssignmentQueue[player.InternalName] = { } + end + if SquadAssignmentQueue[player.InternalName][producerId] == nil then + SquadAssignmentQueue[player.InternalName][producerId] = { } + end +end + +-- on finishing production of a squad of units for an attack, calculate how long to wait to produce the next squad based on desired value per second +CalculateIntervalForSquad = function(squad) + local ticksSpentProducing = DateTime.GameTime - squad.WaveStartTime + local attackValues + + if squad.AttackValuePerSecond ~= nil then + local allAttackValues + + if type(squad.AttackValuePerSecond) == "function" then + allAttackValues = squad.AttackValuePerSecond(squad) + else + allAttackValues = squad.AttackValuePerSecond + end + + if allAttackValues[Difficulty] ~= nil then + attackValues = allAttackValues[Difficulty] + else + attackValues = allAttackValues + end + end + + return CalculateInterval(squad.WaveTotalCost, attackValues, squad.InitTime, ticksSpentProducing) +end + +function CalculateInterval(cost, attackValues, initTime, ticksSpentProducing) + if ticksSpentProducing == nil then + ticksSpentProducing = 0 + end + if attackValues ~= nil then + local ticksSinceInit = DateTime.GameTime - initTime + local desiredValue = CalculateValuePerSecond(ticksSinceInit, attackValues) + local ticks = ((25 * cost) - (desiredValue * ticksSpentProducing)) / desiredValue + return math.max(math.floor(ticks), 0) + else + return ticksSpentProducing + end +end + +-- calculate the value per second based on the current tick and the min/max value of the squad +function CalculateValuePerSecond(currentTick, attackValues) + local minValue = attackValues.Min + local maxValue = attackValues.Max + local rampDuration + if attackValues.RampDuration ~= nil then + rampDuration = attackValues.RampDuration + else + rampDuration = NormalRampDuration * RampDurationMultipliers[Difficulty] + end + local growthFactor = 2.06 + local progress = currentTick / rampDuration + local scaledProgress = progress ^ growthFactor + local value = minValue + (maxValue - minValue) * scaledProgress + return math.min(math.floor(value), maxValue) +end + +IsSquadInProduction = function(squad) + for _, isProducing in pairs(squad.QueueProductionStatuses) do + if isProducing then + return true + end + end + + return false +end + +SendAttackSquad = function(squad) + Utils.Do(squad.IdleUnits, function(a) + if not a.IsDead then + a.Stop() + end + end) + + if squad.IsAirSquad ~= nil and squad.IsAirSquad then + Utils.Do(squad.IdleUnits, function(a) + if not a.IsDead then + InitAttackAircraft(a, squad.TargetPlayers, squad.AirTargetList, squad.AirTargetType) + end + end) + else + local squadLeader = nil + local attackPath = nil + + if squad.AttackPaths ~= nil then + local attackPaths = {} + + if type(squad.AttackPaths) == "function" then + attackPaths = squad.AttackPaths(squad) + else + attackPaths = squad.AttackPaths + end + + if #attackPaths > 0 then + attackPath = Utils.Random(attackPaths) + end + end + + Utils.Do(squad.IdleUnits, function(a) + local actorId = tostring(a) + + if not a.IsDead and a.IsInWorld then + if squad.FollowLeader ~= nil and squad.FollowLeader == true and squadLeader == nil then + squadLeader = a + end + + -- if squad leader, queue attack move to each attack path waypoint + if squadLeader == nil or a == squadLeader then + if attackPath ~= nil then + Utils.Do(attackPath, function(w) + a.AttackMove(w, 3) + end) + end + + if squad.IsNaval ~= nil and squad.IsNaval then + IdleHunt(a) + else + AssaultPlayerBaseOrHunt(a, squad.TargetPlayer) + end + + -- on damaged or killed + Trigger.OnDamaged(a, function(self, attacker, damage) + ClearSquadLeader(squadLeader) + end) + + Trigger.OnKilled(a, function(self, attacker, damage) + ClearSquadLeader(squadLeader) + end) + + -- if not squad leader, follow the leader + else + SquadLeaders[actorId] = squadLeader + FollowSquadLeader(a, squad) + + -- if damaged (stop guarding, attack move to enemy base) + Trigger.OnDamaged(a, function(self, attacker, damage) + ClearSquadLeader(SquadLeaders[actorId]) + end) + end + end + end) + end + squad.IdleUnits = { } +end + +ClearSquadLeader = function(squadLeader) + for k,v in pairs(SquadLeaders) do + if v == squadLeader then + SquadLeaders[k] = nil + end + end +end + +FollowSquadLeader = function(actor, squad) + if not actor.IsDead and actor.IsInWorld and squad.Player == actor.Owner then + local actorId = tostring(actor) + + if SquadLeaders[actorId] ~= nil and not SquadLeaders[actorId].IsDead then + local possibleCells = Utils.ExpandFootprint({ SquadLeaders[actorId].Location }, true) + local cell = Utils.Random(possibleCells) + actor.Stop() + actor.AttackMove(cell, 1) + + Trigger.AfterDelay(Utils.RandomInteger(35,65), function() + FollowSquadLeader(actor, squad) + end) + else + actor.Stop() + Trigger.ClearAll(actor) + AssaultPlayerBaseOrHunt(actor, squad.TargetPlayer) + + -- reapply unload trigger + if actor.HasProperty("HasPassengers") then + Trigger.AfterDelay(1, function() + if not actor.IsDead then + Trigger.OnPassengerExited(actor, function(transport, passenger) + AssaultPlayerBaseOrHunt(passenger, squad.TargetPlayer) + end) + end + end) + end + end + end +end + +FollowActor = function(actor, actorToFollow) + if not actor.IsDead and actor.IsInWorld then + if not actorToFollow.IsDead and actorToFollow.IsInWorld then + local possibleCells = Utils.ExpandFootprint(Utils.ExpandFootprint({ actorToFollow.Location }, true), false) + local cell = Utils.Random(possibleCells) + actor.Stop() + actor.AttackMove(cell, 1) + + Trigger.AfterDelay(Utils.RandomInteger(35,65), function() + FollowActor(actor, actorToFollow) + end) + else + actor.Stop() + Trigger.ClearAll(actor) + end + end +end + +SetupRefAndSilosCaptureCredits = function(player) + local silosAndRefineries = player.GetActorsByTypes(CashRewardOnCaptureTypes) + Utils.Do(silosAndRefineries, function(a) + Trigger.OnCapture(a, function(self, captor, oldOwner, newOwner) + newOwner.Cash = newOwner.Cash + CapturedCreditsAmount + Media.FloatingText("+$" .. CapturedCreditsAmount, self.CenterPosition, 30, newOwner.Color) + end) + end) +end + +SetupChurchMoneyCrates = function(churchOwner) + if churchOwner == nil then + if Neutral ~= nil then + churchOwner = Neutral + else + return + end + end + local churches = churchOwner.GetActorsByTypes({ "v01", "v25" }) + Utils.Do(churches, function(a) + Trigger.OnKilled(a, function(self, killer) + Actor.Create("moneycrate", true, { Owner = churchOwner, Location = a.Location }) + end) + end) +end + +HasConyard = function(player) + return CountConyards(player) >= 1 +end + +CountConyards = function(player) + local Conyards = player.GetActorsByTypes(ConyardTypes) + return #Conyards +end + +AutoReplaceHarvesters = function(player) + Trigger.AfterDelay(DateTime.Seconds(1), function() + local harvesters = player.GetActorsByTypes(HarvesterTypes) + Utils.Do(harvesters, function(a) + AutoReplaceHarvester(player, a) + end) + end) + + Trigger.OnAnyProduction(function(producer, produced, productionType) + if produced.Owner == player then + Utils.Do(HarvesterTypes, function(t) + if not produced.IsDead and produced.Type == t then + local refineries = player.GetActorsByTypes(RefineryTypes) + if #refineries > 0 then + local refinery = Utils.Random(refineries) + produced.Move(refinery.Location, 2) + produced.FindResources() + AutoReplaceHarvester(player, produced) + end + end + end) + end + end) +end + +AutoReplaceHarvester = function(player, harvester) + Trigger.OnKilled(harvester, function(self, killer) + local harvType = self.Type + local buildTime = math.ceil(Actor.BuildTime(harvType) * UnitBuildTimeMultipliers[Difficulty]) + local randomExtraTime = Utils.RandomInteger(DateTime.Seconds(5), DateTime.Seconds(15)) + + Trigger.AfterDelay(buildTime + randomExtraTime, function() + local producers = player.GetActorsByTypes(FactoryTypes) + + if #producers > 0 then + local producer = Utils.Random(producers) + producer.Produce(harvType) + end + end) + + AddHarvesterDeathStack(player) + end) +end + +SellOnCaptureAttempt = function(buildings, sellAsGroup) + if type(buildings) ~= "table" then + buildings = { buildings } + end + Utils.Do(buildings, function(b) + BuildingsToSellOnCaptureAttempt[tostring(b)] = true + local footprint = b.FootprintCells + local captureCells = Utils.ExpandFootprint(footprint, true) + + local id = Trigger.OnEnteredFootprint(captureCells, function(a, id) + if IsMissionPlayer(a.Owner) and IsCapturer(a) then + Trigger.RemoveFootprintTrigger(id) + if sellAsGroup then + Utils.Do(buildings, function(b2) + if not b2.IsDead and not IsMissionPlayer(b2.Owner) then + b2.Sell() + end + end) + else + if not b.IsDead and not IsMissionPlayer(b.Owner) then + b.Sell() + end + end + end + end) + + Trigger.OnKilledOrCaptured(b, function() + Trigger.RemoveFootprintTrigger(id) + end) + end) +end + +BuildDefenseOnCaptureAttempt = function(buildings, defenseType, fallbackSell) + if type(buildings) ~= "table" then + buildings = { buildings } + end + + Utils.Do(buildings, function(b) + BuildingsToDefendOnCaptureAttempt[tostring(b)] = defenseType + local footprint = b.FootprintCells + local triggerCells = Utils.ExpandFootprint(footprint, true) + local originalOwner = b.Owner + + local id = Trigger.OnEnteredFootprint(triggerCells, function(a, id) + if IsMissionPlayer(a.Owner) and IsCapturer(a) then + Trigger.RemoveFootprintTrigger(id) + + if not b.IsDead and b.Owner == originalOwner then + triggerCells = Utils.Shuffle(triggerCells) + local defense + for _, cell in pairs(triggerCells) do + if UtilsCA.CanPlaceBuilding(defenseType, cell) then + defense = Actor.Create(defenseType, true, { Owner = b.Owner, Location = cell }) + break + end + end + + if defense then + Trigger.OnKilled(defense, function(self, killer) + Trigger.AfterDelay(DateTime.Seconds(10), function() + if not b.IsDead and b.Owner == originalOwner then + BuildDefenseOnCaptureAttempt(b, defenseType, fallbackSell) + end + end) + end) + elseif fallbackSell then + b.Sell() + end + end + end + end) + + Trigger.OnKilledOrCaptured(b, function() + Trigger.RemoveFootprintTrigger(id) + end) + end) +end + +AddHarvesterDeathStack = function(player) + if HarvesterDeathStacks[player.InternalName] == nil then + HarvesterDeathStacks[player.InternalName] = 0 + end + HarvesterDeathStacks[player.InternalName] = HarvesterDeathStacks[player.InternalName] + 1 +end + +DoHelicopterDrop = function(player, entryPath, transportType, units, unitFunc, transportExitFunc) + return Reinforcements.ReinforceWithTransport(player, transportType, units, entryPath, nil, function(transport, cargo) + if not transport.IsDead then + transport.UnloadPassengers() + if unitFunc ~= nil then + Trigger.AfterDelay(DateTime.Seconds(5), function() + Utils.Do(cargo, function(a) + unitFunc(a) + end) + end) + end + if transportExitFunc ~= nil then + transportExitFunc(transport) + end + end + end) +end + +DoNavalTransportDrop = function(player, entryPath, exitPath, transportType, units, unitFunc) + local reinforcements = Reinforcements.ReinforceWithTransport(player, transportType, units, entryPath, exitPath) + local cargo = reinforcements[2] + if unitFunc ~= nil then + Utils.Do(cargo, function(a) + Trigger.OnAddedToWorld(a, function(self) + unitFunc(self) + end) + end) + end + return reinforcements +end + +PlayerHasNavalProduction = function(player) + local navalProductionBuildings = player.GetActorsByTypes(NavalProductionTypes) + return #navalProductionBuildings > 0 +end + +SetupReveals = function(revealPoints, cameraType) + if cameraType == nil then + cameraType = "smallcamera" + end + Utils.Do(revealPoints, function(p) + Trigger.OnEnteredProximityTrigger(p.CenterPosition, WDist.New(11 * 1024), function(a, id) + if IsMissionPlayer(a.Owner) and a.Type ~= cameraType then + Trigger.RemoveProximityTrigger(id) + local camera = Actor.Create(cameraType, true, { Owner = a.Owner, Location = p.Location }) + Trigger.AfterDelay(DateTime.Seconds(4), function() + camera.Destroy() + end) + end + end) + end) +end + +AdjustPlayerStartingCashForDifficulty = function(player) + if player == nil then + for _, p in pairs(MissionPlayers) do + AdjustPlayerStartingCashForDifficulty(p) + end + else + player.Cash = player.Cash + CashAdjustments[Difficulty] + end +end + +AdjustTimeForGameSpeed = function(ticks) + if (GameSpeed == "default") then + return ticks + end + + if (GameSpeed == "fastest") then + return ticks * 2 + end + + if (GameSpeed == "faster") then + return ticks * 1.33 + end + + if (GameSpeed == "fast") then + return ticks * 1.14 + end + + if (GameSpeed == "slower") then + return ticks * 0.8 + end + + if (GameSpeed == "slowest") then + return ticks * 0.5 + end + + return ticks +end + +PanToPos = function(targetPos, speed) + local cameraPos = Camera.Position + local newX = cameraPos.X + local newY = cameraPos.Y + + if newX < targetPos.X then + if newX + speed > targetPos.X then + newX = targetPos.X + else + newX = newX + speed + end + elseif newX > targetPos.X then + if newX - speed < targetPos.X then + newX = targetPos.X + else + newX = newX - speed + end + end + + if newY < targetPos.Y then + if newY + speed > targetPos.Y then + newY = targetPos.Y + else + newY = newY + speed + end + elseif newY > targetPos.Y then + if newY - speed < targetPos.Y then + newY = targetPos.Y + else + newY = newY - speed + end + end + + Camera.Position = WPos.New(newX, newY, 0) +end + +-- Filters + +IsHarvester = function(actor) + for _, t in pairs(HarvesterTypes) do + if actor.Type == t then + return true + end + end +end + +IsMcv = function(actor) + for _, t in pairs(McvTypes) do + if actor.Type == t then + return true + end + end +end + +IsConyard = function(actor) + for _, t in pairs(ConyardTypes) do + if actor.Type == t then + return true + end + end +end + +IsDefense = function(actor) + return actor.HasProperty("StartBuildingRepairs") and not actor.HasProperty("Attack") +end + +IsCapturer = function(actor) + return (actor.Type == "e6" or actor.Type == "n6" or actor.Type == "s6" or actor.Type == "mast" or (actor.Type == "ifv" and actor.HasPassengers and Utils.Any(actor.Passengers, function(p) return p.Type == "e6" or p.Type == "n6" or p.Type == "s6" end))) +end + +IsGroundHunterUnit = function(actor) + return not actor.IsDead and actor.HasProperty("Move") and not actor.HasProperty("Land") and actor.HasProperty("Hunt") +end + +IsGreeceGroundHunterUnit = function(actor) + return IsGroundHunterUnit(actor) and actor.Type ~= "arty" and actor.Type ~= "cryo" and actor.Type ~= "mgg" and actor.Type ~= "mrj" +end + +IsUSSRGroundHunterUnit = function(actor) + return IsGroundHunterUnit(actor) and actor.Type ~= "v2rl" and actor.Type ~= "v3rl" and actor.Type ~= "katy" and actor.Type ~= "grad" and actor.Type ~= "nukc" +end + +IsGDIGroundHunterUnit = function(actor) + return (IsGroundHunterUnit(actor) or actor.Type == "jjet") and actor.Type ~= "msam" and actor.Type ~= "memp" and actor.Type ~= "thwk" +end + +IsNodGroundHunterUnit = function(actor) + return IsGroundHunterUnit(actor) and actor.Type ~= "mlrs" and actor.Type ~= "arty.nod" +end + +IsScrinGroundHunterUnit = function(actor) + return IsGroundHunterUnit(actor) and actor.Type ~= "mast" and actor.Type ~= "pdgy" +end + +-- Upgrades + +InitAiUpgrades = function(player, advancedDelay) + if advancedDelay == nil then + advancedDelay = AiAdvancedUpgradeDelay[Difficulty] + end + + if player.Faction == "soviet" then + Actor.Create("hazmatsoviet.upgrade", true, { Owner = player }) + elseif player.Faction ~= "scrin" then + Actor.Create("hazmat.upgrade", true, { Owner = player }) + end + + if IsHardOrAbove() then + Trigger.AfterDelay(advancedDelay, function() + if player.Faction == "scrin" then + Actor.Create("carapace.upgrade", true, { Owner = player }) + else + Actor.Create("flakarmor.upgrade", true, { Owner = player }) + end + end) + end + + if (player.Faction == "allies") then + + if IsHardOrAbove() then + Actor.Create("cryw.upgrade", true, { Owner = Greece }) + end + + elseif (player.Faction == "soviet") then + + if IsHardOrAbove() then + Trigger.AfterDelay(advancedDelay, function() + Actor.Create("tarc.upgrade", true, { Owner = player }) + + local doctrineUpgrades = { "rocketpods.upgrade", "reactive.upgrade", "imppara.upgrade" } + local selectedDoctrineUpgrade = Utils.Random(doctrineUpgrades) + Actor.Create(selectedDoctrineUpgrade, true, { Owner = player }) + end) + end + + elseif (player.Faction == "nod") then + + if IsHardOrAbove() then + Trigger.AfterDelay(advancedDelay, function() + Actor.Create("blacknapalm.upgrade", true, { Owner = player }) + Actor.Create("tibcore.upgrade", true, { Owner = player }) + Actor.Create("quantum.upgrade", true, { Owner = player }) + Actor.Create("cyborgspeed.upgrade", true, { Owner = player }) + Actor.Create("cyborgarmor.upgrade", true, { Owner = player }) + end) + end + + elseif (player.Faction == "gdi") then + + if IsHardOrAbove() then + Actor.Create("sonic.upgrade", true, { Owner = player, }) + Actor.Create("empgren.upgrade", true, { Owner = player, }) + + Trigger.AfterDelay(advancedDelay, function() + local strategyUpgrades = { + { "bombard.strat", "bombard2.strat", "hailstorm.upgrade" }, + { "seek.strat", "seek2.strat", "hypersonic.upgrade" }, + { "hold.strat", "hold2.strat", "hammerhead.upgrade" }, + } + + local selectedStrategyUpgrades = Utils.Random(strategyUpgrades) + Utils.Do(selectedStrategyUpgrades, function(u) + Actor.Create(u, true, { Owner = player }) + end) + end) + end + + elseif (player.Faction == "scrin") then + + if IsHardOrAbove() then + Actor.Create("ioncon.upgrade", true, { Owner = player }) + + Trigger.AfterDelay(advancedDelay, function() + Actor.Create("resconv.upgrade", true, { Owner = player }) + Actor.Create("shields.upgrade", true, { Owner = player }) + end) + end + + end +end + +-- Units & compositions + +AdjustDelayForDifficulty = function(delay, difficulty) + if difficulty == nil then + difficulty = Difficulty + end + return delay * AttackDelayMultipliers[Difficulty] +end + +AdjustAirDelayForDifficulty = function(delay, difficulty) + if difficulty == nil then + difficulty = Difficulty + end + return delay * AirAttackDelayMultipliers[Difficulty] +end + +AdjustAttackValuesForDifficulty = function(attackValues, difficulty) + if difficulty == nil then + difficulty = Difficulty + end + + if attackValues.Min ~= nil then + attackValues.Min = attackValues.Min * AttackValueMultipliers[difficulty] + end + if attackValues.Max ~= nil then + attackValues.Max = attackValues.Max * AttackValueMultipliers[difficulty] + end + if attackValues.RampDuration ~= nil then + attackValues.RampDuration = attackValues.RampDuration * RampDurationMultipliers[difficulty] + end + + return attackValues +end + +AdjustCompositionsForDifficulty = function(compositions, difficulty) + local updatedCompositions = { } + + Utils.Do(compositions, function(comp) + local updatedComposition = AdjustCompositionForDifficulty(comp, difficulty) + table.insert(updatedCompositions, updatedComposition) + end) + + return updatedCompositions +end + +AdjustCompositionForDifficulty = function(composition, difficulty) + if difficulty == nil then + difficulty = Difficulty + end + + if difficulty == "vhard" then + return composition + end + + -- total unadjusted cost for all units in each queue + local queueTotalUnitCost = { } + + -- total adjusted cost for each queue + local queueAllocatedTotalUnitCost = { } + + -- units added to the adjusted composition + local updatedComposition = { } + + for k,v in pairs(composition) do + + if IsQueue(k) then + local queueName = k + local queueUnits = v + queueTotalUnitCost[queueName] = 0 + queueAllocatedTotalUnitCost[queueName] = 0 + + -- for each unit in the queue + for i,unit in pairs(queueUnits) do + local chosenUnit + + -- if the unit is a table of possible units, use the one with the highest cost for calculation purposes + if type(unit) == "table" then + chosenUnit = GetHighestCostUnit(unit) + else + chosenUnit = unit + if UnitCosts[chosenUnit] == nil then + UnitCosts[chosenUnit] = ActorCA.CostOrDefault(chosenUnit) + end + end + + -- add the cost to the total cost for the queue + queueTotalUnitCost[queueName] = queueTotalUnitCost[queueName] + UnitCosts[chosenUnit] + end + + local adjustedDesiredTotalUnitCostForQueue = queueTotalUnitCost[queueName] * CompositionValueMultipliers[difficulty] + + -- allocate units until the adjusted cost is reached + while queueAllocatedTotalUnitCost[queueName] < adjustedDesiredTotalUnitCostForQueue do + for i,unit in pairs(queueUnits) do + if queueAllocatedTotalUnitCost[queueName] >= adjustedDesiredTotalUnitCostForQueue then + break + end + + local chosenUnit + + if type(unit) == "table" then + chosenUnit = GetHighestCostUnit(unit) + else + chosenUnit = unit + end + + if updatedComposition[queueName] == nil then + updatedComposition[queueName] = { } + end + + table.insert(updatedComposition[queueName], unit) + + if UnitCosts[chosenUnit] == nil then + UnitCosts[chosenUnit] = ActorCA.CostOrDefault(chosenUnit) + end + + queueAllocatedTotalUnitCost[queueName] = queueAllocatedTotalUnitCost[queueName] + UnitCosts[chosenUnit] + end + end + else + if k == "MinTime" or k == "MaxTime" then + + if difficulty == "easy" then + updatedComposition[k] = v * 1.4 + elseif difficulty == "normal" then + updatedComposition[k] = v * 1.2 + elseif difficulty == "brutal" then + updatedComposition[k] = v * 0.9 + end + + else + updatedComposition[k] = v + end + end + end + + return updatedComposition +end + +GetHighestCostUnit = function(units) + local chosenUnit + for _, u in pairs(units) do + if type(u) == "userdata" then + u = u.Type + end + if UnitCosts[u] == nil then + UnitCosts[u] = ActorCA.CostOrDefault(u) + end + if chosenUnit == nil or UnitCosts[u] > UnitCosts[chosenUnit] then + chosenUnit = u + end + end + return chosenUnit +end + +GetTotalCostOfUnits = function(units) + local totalCost = 0 + for _, u in pairs(units) do + if type(u) == "userdata" then + u = u.Type + end + if UnitCosts[u] == nil then + UnitCosts[u] = ActorCA.CostOrDefault(u) + end + totalCost = totalCost + UnitCosts[u] + end + return totalCost +end + +GetMissionPlayersArmyValue = function() + local value = 0 + Utils.Do(MissionPlayers, function(p) + local units = Utils.Where(p.GetActors(), function(a) return a.HasProperty("Attack") end) + value = value + GetTotalCostOfUnits(units) + end) + return value +end + +GetMissionPlayersActorsByType = function(type) + local actors = {} + Utils.Do(MissionPlayers, function(p) + local pActors = p.GetActorsByType(type) + Utils.Do(pActors, function(a) + actors[#actors + 1] = a + end) + end) + return actors +end + +GetMissionPlayersActorsByTypes = function(types) + local actors = {} + Utils.Do(MissionPlayers, function(p) + local pActors = p.GetActorsByTypes(types) + Utils.Do(pActors, function(a) + actors[#actors + 1] = a + end) + end) + return actors +end + +CalculatePlayerCharacteristics = function() + PlayerCharacteristics["MissionPlayers"] = { + MassInfantry = false, + MassHeavy = false, + MassAir = false, + InfantryValue = 0, + HeavyValue = 0, + AirValue = 0, + } + + Utils.Do(MissionPlayers, function(p) + PlayerCharacteristics[p.InternalName] = { + MassInfantry = false, + MassHeavy = false, + MassAir = false, + InfantryValue = 0, + HeavyValue = 0, + AirValue = 0, + } + + local infantryValue = 0 + local heavyValue = 0 + local airValue = 0 + + local infantryUnits = p.GetActorsByArmorTypes({ "None" }) + + Utils.Do(infantryUnits, function(u) + if UnitCosts[u.Type] == nil then + UnitCosts[u.Type] = ActorCA.CostOrDefault(u.Type) + end + infantryValue = infantryValue + UnitCosts[u.Type] + end) + + local heavyUnits = p.GetActorsByArmorTypes({ "Heavy" }) + + Utils.Do(heavyUnits, function(u) + if UnitCosts[u.Type] == nil then + UnitCosts[u.Type] = ActorCA.CostOrDefault(u.Type) + end + heavyValue = heavyValue + UnitCosts[u.Type] + end) + + local aircraft = p.GetActorsByArmorTypes({ "Aircraft" }) + + Utils.Do(aircraft, function(u) + if UnitCosts[u.Type] == nil then + UnitCosts[u.Type] = ActorCA.CostOrDefault(u.Type) + end + airValue = airValue + UnitCosts[u.Type] + end) + + if infantryValue > 12000 and infantryValue > heavyValue * 3 then + PlayerCharacteristics[p.InternalName].MassInfantry = true + elseif heavyValue > 12000 and heavyValue > infantryValue * 3 then + PlayerCharacteristics[p.InternalName].MassHeavy = true + end + + if infantryValue > 18000 then + PlayerCharacteristics[p.InternalName].MassInfantry = true + end + + if heavyValue > 18000 then + PlayerCharacteristics[p.InternalName].MassHeavy = true + end + + if airValue > 16000 then + PlayerCharacteristics[p.InternalName].MassAir = true + end + + PlayerCharacteristics[p.InternalName].InfantryValue = infantryValue + PlayerCharacteristics[p.InternalName].HeavyValue = heavyValue + PlayerCharacteristics[p.InternalName].AirValue = airValue + end) + + Utils.Do(MissionPlayers, function(p) + PlayerCharacteristics["MissionPlayers"].InfantryValue = PlayerCharacteristics["MissionPlayers"].InfantryValue + PlayerCharacteristics[p.InternalName].InfantryValue + PlayerCharacteristics["MissionPlayers"].HeavyValue = PlayerCharacteristics["MissionPlayers"].HeavyValue + PlayerCharacteristics[p.InternalName].HeavyValue + PlayerCharacteristics["MissionPlayers"].AirValue = PlayerCharacteristics["MissionPlayers"].AirValue + PlayerCharacteristics[p.InternalName].AirValue + end) + + if PlayerCharacteristics["MissionPlayers"].InfantryValue > 20000 then + PlayerCharacteristics["MissionPlayers"].MassInfantry = true + end + + if PlayerCharacteristics["MissionPlayers"].HeavyValue > 20000 then + PlayerCharacteristics["MissionPlayers"].MassHeavy = true + end + + if PlayerCharacteristics["MissionPlayers"].AirValue > 18000 then + PlayerCharacteristics["MissionPlayers"].MassAir = true + end +end + +AircraftTargets = { + heli = { TargetList = { "Heavy", "Concrete", "Aircraft" }, TargetType = "ArmorType" }, + harr = { TargetList = { "None", "Light", "Wood", "Aircraft" }, TargetType = "ArmorType" }, + pmak = { TargetList = { "Heavy", "Light", "Concrete" }, TargetType = "ArmorType" }, + nhaw = { TargetList = { "None", "Light" }, TargetType = "ArmorType" }, + beag = { TargetList = { "Heavy", "Light", "Aircraft" }, TargetType = "ArmorType" }, + hind = { TargetList = { "Vehicle", "Infantry" }, TargetType = "TargetType" }, + yak = { TargetList = { "None", "Light", "Wood" }, TargetType = "ArmorType" }, + mig = { TargetList = { "Heavy", "Concrete", "Aircraft" }, TargetType = "ArmorType" }, + suk = { TargetList = { "Heavy", "Light", "Concrete" }, TargetType = "ArmorType" }, + suk_upg = { TargetList = { "Heavy", "Light", "Concrete" }, TargetType = "ArmorType" }, + kiro = { TargetList = { "Wood", "Concrete" }, TargetType = "ArmorType" }, + disc = { TargetList = { "Heavy", "Light", "None" }, TargetType = "ArmorType" }, + orca = { TargetList = { "Heavy", "Concrete", "Aircraft" }, TargetType = "ArmorType" }, + a10 = { TargetList = { "None", "Wood" }, TargetType = "ArmorType" }, + a10_gau = { TargetList = { "None", "Light", "Wood" }, TargetType = "ArmorType" }, + a10_sw = { TargetList = { "None", "Wood", "Aircraft" }, TargetType = "ArmorType" }, + orcb = { TargetList = { "Heavy", "Light", "Concrete" }, TargetType = "ArmorType" }, + auro = { TargetList = { "Concrete", "Heavy" }, TargetType = "ArmorType" }, + jack = { TargetList = { "Heavy", "Light" }, TargetType = "ArmorType" }, + apch = { TargetList = { "None", "Light", "Aircraft" }, TargetType = "ArmorType" }, + venm = { TargetList = { "None", "Light", "Aircraft" }, TargetType = "ArmorType" }, + rah = { TargetList = { "None", "Light", "Wood" }, TargetType = "ArmorType" }, + scrn = { TargetList = { "Heavy", "Concrete", "Aircraft" }, TargetType = "ArmorType" }, + phan = { TargetList = { "Heavy", "Light", "Aircraft" }, TargetType = "ArmorType" }, + kamv = { TargetList = { "Heavy", "Light", "Concrete" }, TargetType = "ArmorType" }, + shde = { TargetList = { "Heavy", "Light", "Concrete" }, TargetType = "ArmorType" }, + vert = { TargetList = { "Heavy", "Concrete", "Wood" }, TargetType = "ArmorType" }, + mcor = { TargetList = { "Aircraft" }, TargetType = "ArmorType" }, + stmr = { TargetList = { "None", "Light", "Aircraft" }, TargetType = "ArmorType" }, + torm = { TargetList = { "Heavy", "Concrete", "Aircraft" }, TargetType = "ArmorType" }, + enrv = { TargetList = { "Heavy", "Concrete", "Aircraft" }, TargetType = "ArmorType" }, + deva = { TargetList = { "None", "Concrete", "Wood" }, TargetType = "ArmorType" }, + pac = { TargetList = { "Heavy", "Light" }, TargetType = "ArmorType" }, +} + +AlliedT3SupportVehicle = { "mgg", "mrj", "cryo" } +AlliedAdvancedInfantry = { "snip", "enfo", "cryt" } +PrismCannonOrZeus = { "pcan", "zeus" } + +SovietMammothVariant = { "4tnk", "4tnk", "4tnk.atomic", "4tnk.erad" } +SovietBasicArty = { "v2rl", "katy" } +SovietAdvancedArty = { "v3rl", "v3rl", "isu" } +TeslaVariant = { "ttnk", "ttra" } +MigOrSukhoi = { "mig", "mig", "suk", "suk.upg" } +HindOrYak = { "hind", "yak" } +MigOrHindOrYak = { "mig", "hind", "yak" } +SukhoiVariant = { "suk", "suk.upg" } + +HumveeOrGuardianDrone = { "hmmv", "gdrn" } +TOWHumveeOrGuardianDrone = { "hmmv.tow", "gdrn.tow" } +GDIMammothVariant = { "titn.rail", "htnk.ion", "htnk.hover", "htnk.drone" } +ZoneTrooperVariant = { "ztrp", "zrai", "zdef" } +WolverineOrXO = { "wolv", "xo" } + +BasicCyborg = { "n1c", "n3c", "n5", "acol" } +AdvancedCyborg = { "rmbc", "enli", "tplr" } +FlameTankHeavyFlameTankOrHowitzer = { "ftnk", "hftk", "howi" } +ApacheOrVenom = { "apch", "venm" } + +GunWalkerSeekerOrLacerator = { "gunw", "seek", "lace", "shrw" } +CorrupterOrDevourer = { "corr", "devo" } +AtomizerObliteratorOrRuiner = { "atmz", "oblt", "ruin" } +TripodVariant = { "tpod", "tpod", "rtpd" } +PacOrDevastator = { "pac", "deva" } + +UnitCompositions = { + Allied = { + -- 0 to 10 minutes + { Infantry = {}, Vehicles = { "jeep", "jeep", "jeep", "jeep", "jeep" }, MaxTime = DateTime.Minutes(10) }, + { Infantry = {}, Vehicles = { "1tnk", "1tnk", "1tnk", "1tnk" }, MaxTime = DateTime.Minutes(10) }, + { Infantry = { "e3", "e1", "e1", "e1", "e3", "e1", "e1", "e1" }, Vehicles = { "2tnk", "apc.ai", "2tnk", "arty" }, MaxTime = DateTime.Minutes(10) }, + { Infantry = { "e3", "e1", "e1", "e1", "e3", "e1", "e1", "e1", "e1", "e1" }, Vehicles = { "2tnk", "ifv.ai", "2tnk", "ifv.ai" }, MaxTime = DateTime.Minutes(10) }, + + -- 10 minutes onwards + { Infantry = { "e3", "e1", "e1", "e1", "e3", "e1", "e1", "e1", AlliedAdvancedInfantry, "e1", "e3", "e1", "e1" }, Vehicles = { "2tnk", "ifv.ai", "delp.ai", "apc.ai", "arty" }, MinTime = DateTime.Minutes(10) }, + { Infantry = { "e3", "e1", "e1", "e1", "e3", "e1", "e1", "e1", AlliedAdvancedInfantry, "e1", "e3", "e1", "e1" }, Vehicles = { "2tnk", "2tnk", "2tnk", "ifv.ai", "ptnk", "ptnk" }, MinTime = DateTime.Minutes(10) }, + { Infantry = { "e3", "e1", "e1", "e1", "e3", "e1", "e1", "e1", AlliedAdvancedInfantry, "e1", "e3", "e1", "e1" }, Vehicles = { "2tnk", "ifv.ai", "ptnk", "2tnk", "2tnk", AlliedT3SupportVehicle }, MinTime = DateTime.Minutes(10) }, + { Infantry = { "e3", "e1", "e1", "e1", "e3", "e1", "e1", "e1", "e3", "e1", "e1", "e1", "e3", "e1", "e1" }, Vehicles = { "batf.ai", "ifv.ai", "batf.ai", "ifv.ai" }, MinTime = DateTime.Minutes(10) }, + { Infantry = {}, Vehicles = { "apc.ai", "jeep", "ifv.ai", "delp.ai", "ifv.ai", "apc.ai" }, MinTime = DateTime.Minutes(10) }, + + -- 16 minutes onwards + { Infantry = { "e3", "e1", "e1", "e1", "e3", "e1", "e1", "e1", AlliedAdvancedInfantry, "e1", "e3", "e1", "e1", "e3", "e1", "e1" }, Vehicles = { "2tnk", "2tnk", "ifv.ai", AlliedT3SupportVehicle, "2tnk", PrismCannonOrZeus }, MinTime = DateTime.Minutes(16) }, + { Infantry = { "e3", "enfo", "enfo", "enfo", "enfo", "e1", "e1", "e1", "e3", "e1", "e1", "e1", "e3", "e1", "e1", "e1", "e3", "e1", "e1", "e1", "e3", "enfo", "enfo" }, Vehicles = { "2tnk", "ptnk", "2tnk", "2tnk", "2tnk", "ptnk" }, MinTime = DateTime.Minutes(18), IsSpecial = true }, + + ------ Anti-tank + { Infantry = { "e3", "e1", "e3", "e3", "e1", "e3", "e1", "e3", "e1", "e3", "e3", "e1", "e3", "e3", "e3", "e3" }, Vehicles = { "tnkd", "tnkd", "tnkd", "tnkd", "tnkd", "tnkd" }, MinTime = DateTime.Minutes(16), RequiredTargetCharacteristics = { "MassHeavy" } }, + + ------ Anti-infantry + { Infantry = { "e3", "enfo", "e1", "e1", "e1", "enfo", "e1", "e1", "enfo", "e3", "e1", "e1", "enfo", "e1", "e1", "e1", "e1", "e1", "e1", "enfo", "enfo" }, Vehicles = { "ptnk", "ptnk", "ptnk", "cryo", "ptnk", "ptnk" }, MinTime = DateTime.Minutes(16), RequiredTargetCharacteristics = { "MassInfantry" } }, + + -- Specials + { Infantry = {}, Vehicles = { "ctnk", "ctnk", "ctnk", "ctnk", "ctnk", "ctnk" }, MinTime = DateTime.Minutes(18), IsSpecial = true }, + { Infantry = { "seal", "seal", "seal", "seal", "seal", "seal", "e7" }, Vehicles = { }, MinTime = DateTime.Minutes(18), IsSpecial = true }, + { Infantry = { "snip", "snip", "snip", "snip", "snip", "snip", "snip", "snip" }, Vehicles = { "rtnk", "rtnk", "rtnk", "rtnk", "rtnk", "rtnk", "rtnk" }, MinTime = DateTime.Minutes(18), IsSpecial = true }, + { Infantry = { "e3", "cryt", "cryt", "cryt", "e3", "e1", "e1", "e1", "e1", "e1", "e1", "cryt", "cryt", "cryt", }, Vehicles = { "cryo", "2tnk", "2tnk", "cryo", "ifv", "cryo", "2tnk" }, MinTime = DateTime.Minutes(18), IsSpecial = true } + }, + Soviet = { + -- 0 to 10 minutes + { Infantry = { "e3", "e1", "e1", "e1", "e1", "e1", "e2", "e3", "e4" }, Vehicles = { "3tnk", "btr.ai", "3tnk" }, MaxTime = DateTime.Minutes(10), }, + + -- 10 to 16 minutes + { Infantry = { "e3", "e1", "e1", "e3", "shok", "e1", "shok", "e1", "e2", "e3", "e4", "e1" }, Vehicles = { "3tnk", SovietMammothVariant, "btr.ai", TeslaVariant, SovietBasicArty }, MinTime = DateTime.Minutes(10), MaxTime = DateTime.Minutes(16), }, + { Infantry = { "e3", "e1", "shok", "e3", "shok", "e1", "shok", "e1", "shok", "e3", "e4", "e1" }, Vehicles = { TeslaVariant, SovietMammothVariant, "btr.ai", TeslaVariant, SovietBasicArty }, MinTime = DateTime.Minutes(10), MaxTime = DateTime.Minutes(16), }, + + -- 16 minutes onwards + { Infantry = { "e3", "e1", "e1", "e3", "shok", "e1", "e1", "cmsr", "e1", "e2", "e3", "e4", "e1", "e1", "e1", "e1", "shok" }, Vehicles = { "3tnk", SovietMammothVariant, "btr.ai", TeslaVariant, SovietBasicArty, SovietAdvancedArty }, MinTime = DateTime.Minutes(16), }, + { Infantry = { "e3", "e1", "e1", "e3", "ttrp", "e1", "ttrp", "e1", "cmsr", "e2", "e3", "e4", "e1", "e1", "e1", "e1" }, Vehicles = { "3tnk", SovietMammothVariant, "btr.ai", TeslaVariant, SovietBasicArty, SovietAdvancedArty }, MinTime = DateTime.Minutes(16), }, + { Infantry = { "e3", "e1", "e1", "e3", "e8", "e1", "e8", "e1", "deso", "deso", "e2", "e3", "e4", "e1", "e1", "e1", "e1" }, Vehicles = { SovietMammothVariant, "3tnk.atomic", "btr.ai", "3tnk.atomic", "apoc", "v3rl" }, MinTime = DateTime.Minutes(16), }, + + ------ Anti-tank + { Infantry = { "e3", "e1", "e3", "e3", "e1", "e3", "e1", "e3", "e1", "e3", "e3", "e1", "e3", "e3", "e3", "e3" }, Vehicles = { "ttra", "ttra", "ttra", "ttra", "ttra", "ttra" }, MinTime = DateTime.Minutes(16), RequiredTargetCharacteristics = { "MassHeavy" } }, + + ------ Anti-infantry + { Infantry = { "e3", "e1", "e1", "e1", "e1", "shok", "shok", "ttrp", "e1", "e1", "e1", "e1", "e1", "e1", "e1", "e1", "e1" }, Vehicles = { "btr", "btr", "ttnk", "v2rl", "ttnk", "btr", "v2rl", "v2rl" }, MinTime = DateTime.Minutes(16), RequiredTargetCharacteristics = { "MassInfantry" } }, + + -- Specials + { Infantry = { "ttrp", "ttrp", "ttrp", "ttrp", "ttrp", "ttrp", "ttrp", "ttrp" }, Vehicles = { "ttnk", "ttra", "ttnk", "ttra", "ttnk", "ttnk", "ttra" }, MinTime = DateTime.Minutes(18), IsSpecial = true }, + { Infantry = { "deso", "deso", "deso", "deso", "deso", "deso", "deso", "deso" }, Vehicles = { "4tnk.erad", "4tnk.erad", "4tnk.erad", "4tnk.erad", "4tnk.erad" }, MinTime = DateTime.Minutes(18), IsSpecial = true } + }, + GDI = { + -- 0 to 10 minutes + { Infantry = {}, Vehicles = { HumveeOrGuardianDrone, HumveeOrGuardianDrone, HumveeOrGuardianDrone, HumveeOrGuardianDrone, HumveeOrGuardianDrone }, MaxTime = DateTime.Minutes(10) }, + { Infantry = { "n3", "n1", "n1", "n1", "n3", "n1", "n2", "n2" }, Vehicles = { "mtnk", "mtnk", "msam", "vulc", "vulc.ai" }, MaxTime = DateTime.Minutes(10) }, + { Infantry = { "n3", "n1", "n1", "n1", "n3", "n1", "n2", "n2", "n1", "n1", "n1", "n3" }, Vehicles = { "mtnk", "mtnk", HumveeOrGuardianDrone, HumveeOrGuardianDrone }, MaxTime = DateTime.Minutes(10) }, + + -- 10 minutes onwards + { Infantry = { "n3", "n1", "n1", "n1", "n3", "n1", "n1", "n1", "n3", "n1", "n1", "n1" }, Vehicles = { "mtnk", "mtnk", "vulc", "vulc.ai", "jugg" }, MinTime = DateTime.Minutes(10) }, + { Infantry = { "n3", "n1", "n1", "n1", "n3", "n1", "n1", "n1", "jjet", "n1", "n3", "n1", "n1", "n1" }, Vehicles = { "mtnk", "vulc", "vulc.ai", "msam", "vulc.ai" }, MinTime = DateTime.Minutes(10) }, + { Infantry = { "n3", "n1", "n1", "n1", "n3", "n1", "n1", "n1", "jjet", "n1", "n3", "n1", "n1", "n1" }, Vehicles = { "titn", "mtnk", "msam", "vulc", GDIMammothVariant }, MinTime = DateTime.Minutes(10) }, + { Infantry = { "jjet", "bjet", "jjet", "jjet", "bjet", "jjet" }, Vehicles = { TOWHumveeOrGuardianDrone, TOWHumveeOrGuardianDrone, TOWHumveeOrGuardianDrone, TOWHumveeOrGuardianDrone, TOWHumveeOrGuardianDrone }, MinTime = DateTime.Minutes(10) }, + { Infantry = {}, Vehicles = { "hsam", "hsam", "hsam", "hsam", "hsam", "hsam", "hsam" }, MinTime = DateTime.Minutes(10) }, + + -- 10 to 16 minutes + { Infantry = { "n1", "n1", "n3", "n1", "n1", "n1", "n1", "n1", "n3", "n1", "n1" }, Vehicles = { "htnk", WolverineOrXO, WolverineOrXO, "hsam", "vulc", GDIMammothVariant, WolverineOrXO }, MinTime = DateTime.Minutes(10), MaxTime = DateTime.Minutes(16) }, + + -- 16 minutes onwards + { Infantry = { "n3", "n1", "n1", "n1", "n3", "n1", "n1", ZoneTrooperVariant, "n1", "n1", ZoneTrooperVariant, ZoneTrooperVariant }, Vehicles = { "mtnk", GDIMammothVariant, "vulc", "mtnk", "msam", GDIMammothVariant }, MinTime = DateTime.Minutes(16) }, + { Infantry = { "n3", "n1", "n1", "n1", "n3", "n1", "n1", "n1", "n1", "n1", "n3", "n1", "n1", "n1", "n1", "n3" }, Vehicles = { "vulc.ai", "disr", "vulc", "disr", "disr" }, MinTime = DateTime.Minutes(16) }, + { Infantry = { "n3", "rmbo", "n3", "n1", "n1", "n1", "n1", "n1", "n3", "n1", "n1", "n3", "n1", "n1" }, Vehicles = { GDIMammothVariant, "msam", "vulc", "msam", GDIMammothVariant }, MinTime = DateTime.Minutes(16) }, + { Infantry = { "n3", "n1", "n1", ZoneTrooperVariant, ZoneTrooperVariant, ZoneTrooperVariant, ZoneTrooperVariant, "n1", "n1" }, Vehicles = { GDIMammothVariant, "mtnk", WolverineOrXO, WolverineOrXO, GDIMammothVariant, GDIMammothVariant }, MinTime = DateTime.Minutes(16) }, + + ------ Anti-tank + { Infantry = { "n3", "n3", "n3", "ztrp", "n3", "n3", "ztrp", "ztrp", "ztrp", "ztrp" }, Vehicles = { GDIMammothVariant, "xo", GDIMammothVariant, "xo", GDIMammothVariant, "xo" }, MinTime = DateTime.Minutes(16), RequiredTargetCharacteristics = { "MassHeavy" } }, + + ------ Anti-infantry + { Infantry = { "n3", "n1", "n1", "n1", "n3", "n1", "n1", "n1", "n3", "n1", "n1", "n1", "n1", "n1", "n1", "n1", "n1" }, Vehicles = { "wolv", "wolv", "vulc", "vulc.ai", "wolv", "disr", "jugg", "wolv" }, MinTime = DateTime.Minutes(16), RequiredTargetCharacteristics = { "MassInfantry" } }, + + -- Specials + { Infantry = { "n2", "n2", "n2", "n2", "n2", "n2", "n2", "n2", "n2", "n2", "n2", "n2", "n2", "n2", "n2", "n2" }, Vehicles = { "htnk.ion", "htnk.ion", "htnk.ion" }, MinTime = DateTime.Minutes(18), IsSpecial = true }, + { Infantry = {}, Vehicles = { "memp", "memp", "memp", "memp", "memp" }, MinTime = DateTime.Minutes(18), IsSpecial = true }, + { Infantry = {}, Vehicles = { "mtnk", "vulc", "thwk", "mtnk", "vulc", "thwk", "thwk", "thwk" }, MinTime = DateTime.Minutes(18), IsSpecial = true }, + { Infantry = { "ztrp", "ztrp", "ztrp", "ztrp", "ztrp", "ztrp", "ztrp", "ztrp" }, Vehicles = { "titn.rail", "titn.rail", "titn.rail", "titn.rail", "titn.rail" }, MinTime = DateTime.Minutes(18), IsSpecial = true }, + }, + Nod = { + -- 0 to 10 minutes + { Infantry = {}, Vehicles = { "bike", "bike", "bike", "bike" }, MaxTime = DateTime.Minutes(10) }, + { Infantry = { "n3", "n1", "n1", "n1", "n4", "n1", "n1", "n1" }, Vehicles = { "bggy", "bggy", "bike", "bike" }, MaxTime = DateTime.Minutes(10) }, + { Infantry = { "n3", "n1", "n1", "n4", "n1", "n1", "n1" }, Vehicles = { "ltnk", "bggy", "bike" }, MaxTime = DateTime.Minutes(10) }, + + -- 10 minutes onwards + { Infantry = { "n3", "n1", "n1", "n1", "n1", "n4", "n3", "bh", "n1", "n1", "n1", "n1", "n1", "n3", "n1", "n1" }, Vehicles = { "ltnk", "ltnk", FlameTankHeavyFlameTankOrHowitzer, "arty.nod" }, MinTime = DateTime.Minutes(10) }, + { Infantry = { "n3", "n1", "n1", "n1", "n4", "n1", "n3", "n1", "n1", "n1", "n1", "n1", "n1", "n3", "n1", "n1" }, Vehicles = { "ltnk", "arty.nod", FlameTankHeavyFlameTankOrHowitzer, "mlrs" }, MinTime = DateTime.Minutes(10) }, + { Infantry = { BasicCyborg, BasicCyborg, BasicCyborg, BasicCyborg, "tplr", AdvancedCyborg, "n1c", "n1c", BasicCyborg, AdvancedCyborg }, Vehicles = { "ltnk", FlameTankHeavyFlameTankOrHowitzer, "ltnk" }, MinTime = DateTime.Minutes(10) }, + + -- 10 to 16 minutes + { Infantry = {}, Vehicles = { "stnk.nod", "sapc.ai", "stnk.nod", "stnk.nod", "sapc.ai" }, MinTime = DateTime.Minutes(10), MaxTime = DateTime.Minutes(16) }, + + -- 16 minutes onwards + { Infantry = {}, Vehicles = { "stnk.nod", "stnk.nod", "sapc.ai", "stnk.nod", "stnk.nod", "sapc.ai", "stnk.nod", "stnk.nod" }, MinTime = DateTime.Minutes(16) }, + { Infantry = { BasicCyborg, BasicCyborg, BasicCyborg, BasicCyborg, BasicCyborg, AdvancedCyborg, "n1c", "n1c", BasicCyborg, BasicCyborg, "rmbc", AdvancedCyborg, AdvancedCyborg }, Vehicles = { "ltnk", "ltnk", FlameTankHeavyFlameTankOrHowitzer, "mlrs" }, MinTime = DateTime.Minutes(16) }, + + ------ Anti-tank + { Infantry = { "n3c", "n3c", "n1", "enli", "n4", "n1", "n3c", "enli", "n3c", "n3c", "enli", "n1" }, Vehicles = { "ltnk", "ltnk", "wtnk", "wtnk", "stnk.nod", "ltnk" }, MinTime = DateTime.Minutes(16), RequiredTargetCharacteristics = { "MassHeavy" } }, + + ------ Anti-infantry + { Infantry = { "n4", "n4", "n1", "n1", "n1", "n1", "n1", "n1", "n4", "n4", "n4", "n4", "n1", "n1", "n1", "n1", "n4", "n4" }, Vehicles = { "ltnk.laser", "ltnk.laser", "mlrs", FlameTankHeavyFlameTankOrHowitzer, FlameTankHeavyFlameTankOrHowitzer, "mlrs" }, MinTime = DateTime.Minutes(16), RequiredTargetCharacteristics = { "MassInfantry" } }, + + -- Specials + { Infantry = { "bh", "bh", "bh", "bh", "bh", "bh", "bh", "bh", "bh" }, Vehicles = { "hftk", "hftk", "hftk", "hftk", "hftk", "hftk" }, MinTime = DateTime.Minutes(18), IsSpecial = true }, + { Infantry = { "n3", "n1", "n1", "n1", "n4", "n1", "n3", "n1", "n1", "n1", "n1", "n1", "n1", "n3", "n1", "n1" }, Vehicles = { "wtnk", "wtnk", "wtnk", "wtnk", "wtnk" }, MinTime = DateTime.Minutes(18), IsSpecial = true }, + { Infantry = { }, Vehicles = { "bike", "bike", "bike", "bike", "bike", "bike", "bike", "bike", "bike", "bike", "bike", "bike", "bike", "bike" }, MinTime = DateTime.Minutes(18), IsSpecial = true }, + { Infantry = { "rmbc", "rmbc", "rmbc", "rmbc", "rmbc", "enli", "rmbc", "rmbc", "enli" }, MinTime = DateTime.Minutes(18), IsSpecial = true }, + { Infantry = { "reap", "reap", "reap", "reap", "reap", "reap", "reap", "reap", "reap" }, Vehicles = { "ltnk", "bike", "bike", "ltnk" }, MinTime = DateTime.Minutes(18), IsSpecial = true }, + }, + Scrin = { + -- 0 to 10 minutes + { Infantry = { "s3", "s1", "s1", "s1", "s3", "s3", "s4" }, Vehicles = { "intl.ai2", GunWalkerSeekerOrLacerator, "intl.ai2", GunWalkerSeekerOrLacerator }, MaxTime = DateTime.Minutes(10), }, + + -- 10 to 13 minutes + { Infantry = { "s3", "s1", "s1", "s1", "s1", "s1", "s2", "s2", "s3", "s3" }, Vehicles = { "intl.ai2", GunWalkerSeekerOrLacerator, "intl.ai2", CorrupterOrDevourer, GunWalkerSeekerOrLacerator, "tpod", GunWalkerSeekerOrLacerator, CorrupterOrDevourer }, MinTime = DateTime.Minutes(10), MaxTime = DateTime.Minutes(13), }, + + -- 13 to 19 minutes + { Infantry = { "s3", "s1", "s1", "s1", "s1", "s1", "s2", "s2", "s3", "s3", "s3", "s4", "s4" }, Vehicles = { "intl.ai2", GunWalkerSeekerOrLacerator, "intl.ai2", CorrupterOrDevourer, GunWalkerSeekerOrLacerator, TripodVariant, CorrupterOrDevourer }, Aircraft = { PacOrDevastator }, MinTime = DateTime.Minutes(13), MaxTime = DateTime.Minutes(19), }, + + ------ Anti-infantry + { Infantry = { "s3", "s1", "s1", "s1", "s1", "s1", "s2", "s2", "s3", "s3", "s1", "s1", "s1", "s2" }, Vehicles = { "shrw", "corr", "corr", "shrw", "corr", "shrw", "corr", "corr" }, MinTime = DateTime.Minutes(16), RequiredTargetCharacteristics = { "MassInfantry" } }, + + ------ Anti-tank + { Infantry = { "s3", "s4", "s1", "s4", "s4", "s1", "s4", "s4", "s3", "s1", "s4", "s1", "s4", "s4", "s4" }, Vehicles = { "gunw", "devo", "devo", "gunw", "devo", "atmz", "devo", "tpod", "atmz", "devo" }, MinTime = DateTime.Minutes(16), RequiredTargetCharacteristics = { "MassHeavy" } }, + + -- 19 minutes onwards + { Infantry = { "s3", "s1", "s1", "s1", "s1", "s1", "s2", "s2", "s3", "s3", "s3", "s4", "s4" }, Vehicles = { "intl.ai2", GunWalkerSeekerOrLacerator, "intl.ai2", CorrupterOrDevourer, GunWalkerSeekerOrLacerator, TripodVariant, AtomizerObliteratorOrRuiner }, Aircraft = { PacOrDevastator, "pac" }, MinTime = DateTime.Minutes(19), }, + + -- Specials + { Infantry = { "brst", "brst", "brst", "brst", "brst", "brst", "brst" }, MinTime = DateTime.Minutes(18), IsSpecial = true }, + { Infantry = { "s3", "s3", "s2", "s2", "s2", "s2", "s2", "s2", "s2", "s2" }, Vehicles = { "tpod", "tpod", "tpod", "tpod", "tpod", "tpod" }, MinTime = DateTime.Minutes(18), IsSpecial = true }, + { Infantry = { "s3", "s1", "s1", "s1", "s1", "s3", "s1", "s1", "s1", "s1", "s3", "s1", "s1", "s1", "s1", "s3", "s1", "s1", "s1", "s1", "s3", "s1", "s1", "s1" }, Vehicles = { "stcr", "gunw", "stcr", "gunw", "stcr", "gunw", "stcr" }, MinTime = DateTime.Minutes(18), IsSpecial = true } + } +} + +ScrinWaterCompositions = { + easy = { + { Vehicles = { "intl", "seek" }, }, + { Vehicles = { "seek", "seek" }, }, + { Vehicles = { "lace", "lace" }, } + }, + normal = { + { Vehicles = { "seek", "intl.ai2" }, }, + { Vehicles = { "seek", "seek", "seek" }, }, + { Vehicles = { "lace", "lace", "lace" }, }, + }, + hard = { + { Vehicles = { "intl", "intl.ai2", "seek" }, }, + { Vehicles = { "seek", "seek", "seek" }, }, + { Vehicles = { "lace", "lace", "seek", "seek" }, }, + { Vehicles = { "devo", "intl.ai2", "ruin" }, MinTime = DateTime.Minutes(7) }, + { Vehicles = { "intl", "intl.ai2", { "seek", "lace" }, { "devo", "devo", "ruin" }, { "devo", "atmz", "ruin" } }, MinTime = DateTime.Minutes(12) } + }, + vhard = { + { Vehicles = { "intl", "intl.ai2", "seek" }, }, + { Vehicles = { "seek", "seek", "seek" }, }, + { Vehicles = { "lace", "lace", "lace" }, }, + { Vehicles = { "devo", "intl.ai2", "ruin" }, MinTime = DateTime.Minutes(7) }, + { Vehicles = { "intl", "intl.ai2", { "seek", "lace" }, { "devo", "devo", "ruin" }, { "devo", "atmz", "ruin" } }, MinTime = DateTime.Minutes(12) } + }, + brutal = { + { Vehicles = { "intl", "intl.ai2", "seek", "atmz" }, MaxTime = DateTime.Minutes(7) }, + { Vehicles = { "seek", "seek", "seek", "seek" }, MaxTime = DateTime.Minutes(7) }, + { Vehicles = { "lace", "lace", "lace", "lace" }, MaxTime = DateTime.Minutes(8) }, + { Vehicles = { "lace", "lace", "lace", "lace", "lace", "lace", "lace", "lace" }, MinTime = DateTime.Minutes(8) }, + { Vehicles = { "devo", "intl.ai2", "ruin", "ruin" }, MinTime = DateTime.Minutes(7), MaxTime = DateTime.Minutes(13) }, + { Vehicles = { "intl", "intl.ai2", { "seek", "lace" }, { "seek", "lace" }, { "devo", "devo", "ruin" }, { "devo", "atmz", "ruin" }, "ruin", "ruin" }, MinTime = DateTime.Minutes(13) } + } +} + +AirCompositions = { + Allied = { + easy = { + { Aircraft = { "heli" } } + }, + normal = { + { Aircraft = { "heli", "heli" } }, + { Aircraft = { "harr" } } + }, + hard = { + { Aircraft = { "heli", "heli", "heli" } }, + { Aircraft = { "harr", "harr" } }, + { Aircraft = { "pmak" } } + }, + vhard = { + { Aircraft = { "heli", "heli", "heli" } }, + { Aircraft = { "harr", "harr", "harr" } }, + { Aircraft = { "pmak", "pmak" } } + }, + brutal = { + { Aircraft = { "heli", "heli", "heli", "heli", "heli" } }, + { Aircraft = { "harr", "harr", "harr", "harr" } }, + { Aircraft = { "pmak", "pmak", "pmak" } } + } + }, + Soviet = { + easy = { + { Aircraft = { MigOrHindOrYak } }, + }, + normal = { + { Aircraft = { MigOrHindOrYak, MigOrHindOrYak } }, + { Aircraft = { "mig", "mig" } }, + }, + hard = { + { Aircraft = { MigOrHindOrYak, MigOrHindOrYak, MigOrHindOrYak } }, + { Aircraft = { "mig", "mig", "mig" } }, + { Aircraft = { "suk", "suk" } }, + { Aircraft = { "kiro" } }, + }, + vhard = { + { Aircraft = { MigOrHindOrYak, MigOrHindOrYak, MigOrHindOrYak } }, + { Aircraft = { "mig", "mig", "mig", "mig" } }, + { Aircraft = { SukhoiVariant, SukhoiVariant } }, + { Aircraft = { "kiro", "kiro" } }, + }, + brutal = { + { Aircraft = { MigOrHindOrYak, MigOrHindOrYak, MigOrHindOrYak, MigOrHindOrYak } }, + { Aircraft = { "mig", "mig", "mig", "mig", "mig" } }, + { Aircraft = { SukhoiVariant, SukhoiVariant, SukhoiVariant, SukhoiVariant } }, + { Aircraft = { "kiro", "kiro", "kiro", "kiro" } }, + } + }, + GDI = { + easy = { + { Aircraft = { "orca" } }, + { Aircraft = { "orcb" } }, + }, + normal = { + { Aircraft = { "orca", "orca" } }, + { Aircraft = { "a10" } }, + { Aircraft = { "a10.gau" } }, + { Aircraft = { "orcb" } }, + { Aircraft = { "auro" } }, + }, + hard = { + { Aircraft = { "orca", "orca", "orca" } }, + { Aircraft = { "a10", "a10" } }, + { Aircraft = { "a10.gau", "a10.gau" } }, + { Aircraft = { "orcb", "orcb" } }, + { Aircraft = { "auro", "auro" } }, + }, + vhard = { + { Aircraft = { "orca", "orca", "orca", "orca" } }, + { Aircraft = { "a10", "a10", "a10" } }, + { Aircraft = { "a10.gau", "a10.gau" } }, + { Aircraft = { "orcb", "orcb" } }, + { Aircraft = { "auro", "auro" } }, + }, + brutal = { + { Aircraft = { "orca", "orca", "orca", "orca", "orca" } }, + { Aircraft = { "a10", "a10", "a10", "a10" } }, + { Aircraft = { "a10.gau", "a10.gau", "a10.gau" } }, + { Aircraft = { "orcb", "orcb", "orcb" } }, + { Aircraft = { "auro", "auro", "auro" } } + } + }, + Nod = { + easy = { + { Aircraft = { "apch" } } + }, + normal = { + { Aircraft = { "apch", "apch" } }, + { Aircraft = { "scrn" } }, + { Aircraft = { "rah" } } + }, + hard = { + { Aircraft = { "apch", "apch", "apch" } }, + { Aircraft = { "scrn", "scrn" } }, + { Aircraft = { "rah", "rah" } } + }, + vhard = { + { Aircraft = { "apch", "apch", ApacheOrVenom } }, + { Aircraft = { "scrn", "scrn", "scrn" } }, + { Aircraft = { "rah", "rah", "rah" } }, + }, + brutal = { + { Aircraft = { "apch", "apch", ApacheOrVenom, ApacheOrVenom } }, + { Aircraft = { "scrn", "scrn", "scrn", "scrn" } }, + { Aircraft = { "rah", "rah", "rah", "rah" } }, + { Aircraft = { "vert", "vert", "vert" } } + } + }, + Scrin = { + easy = { + { Aircraft = { "stmr" } }, + { Aircraft = { "torm" } }, + }, + normal = { + { Aircraft = { "stmr", "stmr" } }, + { Aircraft = { "torm", "torm" } }, + { Aircraft = { "enrv" } }, + }, + hard = { + { Aircraft = { "stmr", "stmr", "stmr" } }, + { Aircraft = { "torm", "torm", "torm" } }, + { Aircraft = { "enrv", "enrv" } }, + }, + vhard = { + { Aircraft = { "stmr", "stmr", "stmr" } }, + { Aircraft = { "torm", "torm", "torm", "torm" } }, + { Aircraft = { "enrv", "enrv", "enrv" } }, + }, + brutal = { + { Aircraft = { "stmr", "stmr", "stmr", "stmr" } }, + { Aircraft = { "torm", "torm", "torm", "torm", "torm" } }, + { Aircraft = { "enrv", "enrv", "enrv" } }, + } + } +} + +SpecialistAirSquad = function(unitTypes, characteristic, characteristicValue, delay, onProducedAction) + local squad = { + ActiveCondition = function(squad) + return PlayerOrMissionPlayersHaveCharacteristic(squad.TargetPlayer, characteristic) + end, + AttackValuePerSecond = AdjustAttackValuesForDifficulty({ Min = 24, Max = 24 }), + Compositions = function(squad) + local units = { unitTypes } + local desiredCount = PlayerCharacteristics[squad.TargetPlayer.InternalName][characteristicValue] / 2000 + for i = 1, math.min(desiredCount, MaxSpecialistAir[Difficulty]) do + table.insert(units, unitTypes) + end + return { { Aircraft = units } } + end + } + if delay ~= nil then + squad.Delay = delay + end + if onProducedAction ~= nil then + squad.OnProducedAction = onProducedAction + end + return squad +end + +AirToAirSquad = function(unitTypes, delay) + return SpecialistAirSquad(unitTypes, "MassAir", "AirValue", delay, onProducedAction) +end + +AntiHeavyAirSquad = function(unitTypes, delay) + return SpecialistAirSquad(unitTypes, "MassHeavy", "HeavyValue", delay, onProducedAction) +end + +AntiInfAirSquad = function(unitTypes, delay) + return SpecialistAirSquad(unitTypes, "MassInfantry", "InfantryValue", delay, onProducedAction) +end diff --git a/mods/ca/scripts/coop.lua b/mods/ca/scripts/coop.lua new file mode 100644 index 0000000000..c61494c7c3 --- /dev/null +++ b/mods/ca/scripts/coop.lua @@ -0,0 +1,1043 @@ +IsCoop = true + +---@type player[] +CoopPlayers = {} + +---@type player +local MainPlayer + +---@type string[] +SplitOwnerBlacklist = { + "badr", + "badr.bomber", + "badr.cbomber", + "badr.nbomber", + "badr.mbomber", + "badr.chaosbomber", + "b2b", + "p51", + "tran.paradrop", + "halo.paradrop", + "halo.paradrop.invuln", + "nhaw.paradrop", + "u2", + "u2.killzone", + "smig", + "a10.bomber", + "c17", + "c17.cargo", + "c17.clustermines", + "c17.xo", + "uav", + "ocar.reinforce", + "ocar.xo", + "horn", + "yf23.bomber", + "pod", + "pod2", + "pod3", + "anto", + "galx", + "galx.helios", + "yf23.interceptor", + "lst.reinforce" +} + +---@type integer +local SharedBank = 0 + +--- The last player (attempted to be) given a unit in AssignToCoopPlayers. +---@type integer +local LastAssignedCoopID + +--------- +-- Attack strength modifier has to be in global scope to affect squad definitions. +local CoopAttackStrengthMultiplier = 1 +local attackStrengthOptionValue = tonumber(Map.LobbyOption("enattackstr")) + +if attackStrengthOptionValue > 0 then + CoopAttackStrengthMultiplier = 1 + (attackStrengthOptionValue / 100) +end + +AttackValueMultipliers[Difficulty] = AttackValueMultipliers[Difficulty] * CoopAttackStrengthMultiplier +CompositionValueMultipliers[Difficulty] = CompositionValueMultipliers[Difficulty] * CoopAttackStrengthMultiplier +UnitBuildTimeMultipliers[Difficulty] = math.max(UnitBuildTimeMultipliers[Difficulty] / CoopAttackStrengthMultiplier, 0.1) +-------- + +CACoopQueueSyncer = function() + Trigger.AfterDelay(1, function() + Utils.Do(CoopPlayers,function(p) + Actor.Create("QueueUpdaterDummy", true, { Owner = p }) + end) + end) +end + +---@param action fun(player: player) +ForEachPlayer = function(action) + Utils.Do(CoopPlayers, action) +end + +---@return integer +GetCoopPlayerCount = function() + return #Utils.Where(CoopPlayers, function(cp) + return cp ~= nil + end) +end + +---@return player[] +GetEvenPlayers = function() + local players = { } + + --[[ + I've argued with myself if the current player count should be used + instead of the initial head count. Without more tweaks, I think the + first has fewer problems in the event of a disconnect. ~ JF + ]] + for i = 2, GetCoopPlayerCount(), 2 do + if CoopPlayers[i] then + players[#players + 1] = CoopPlayers[i] + end + end + + return players +end + +---@return player[] +GetOddPlayers = function() + local players = { } + + for i = 1, GetCoopPlayerCount(), 2 do + if CoopPlayers[i] then + players[#players + 1] = CoopPlayers[i] + end + end + + return players +end + +---@return player +RandomCoopPlayer = function() + if #CoopPlayers == 0 then + return Neutral + end + return Utils.Random(CoopPlayers) +end + +---@param unit actor +---@return boolean +IsOwnedByCoopPlayer = function(unit) + return Utils.Any(CoopPlayers, function(player) + return unit.Owner == player + end) +end + +---@param player player +---@param players player[] +---@return boolean +IsPlayerInList = function(player, players) + return Utils.Any(players, function(p) + return player == p + end) +end + +GetCoopGroundAttackers = function() + local attackers = { } + + ForEachPlayer(function(player) + Utils.Concat(attackers, player.GetGroundAttackers()) + end) + + return attackers +end + +---@param player player +local function MaintainBotMoney(player) + local RefineryType = "anyrefinery" + local BaseBuilderType = "anyconyard" + local CanBuildBase = player.HasPrerequisites({ BaseBuilderType }) + local HasNoRefineries = not player.HasPrerequisites({ RefineryType }) + local cost = Actor.Cost("proc") + local bank = player.Cash + player.Resources + + if bank < cost and CanBuildBase and HasNoRefineries then + player.Cash = cost + end +end + +---@param bot player +---@param interval? integer +local function UpdateCoopBot(bot, interval) + MaintainBotMoney(bot) + + if not interval then + return + end + + Trigger.AfterDelay(interval, function() + UpdateCoopBot(bot, interval) + end) +end + +local function StartCoopBots() + local interval = DateTime.Seconds(5) + local stagger = 3 + + local bots = Utils.Where(CoopPlayers, function(player) + return player.IsBot + end) + + Utils.Do(bots, function(bot) + UpdateCoopBot(bot, interval + stagger) + stagger = stagger + stagger + end) +end + +---@param unit actor +ScatterIfAble = function(unit) + if unit.HasProperty("Scatter") then + unit.Scatter() + end +end + +MoveDownIfAble = function(unit) + if unit.HasProperty("Move") then + unit.Move(unit.Location + CVec.New(0, 1)) + end +end + +---@param unit actor +---@return boolean +local function CanSplitAmongPlayers(unit) + local matched = Utils.Any(SplitOwnerBlacklist, function(cab) + return unit.Type == cab + end) + + return not matched +end + +--- Split the ownership of a group among the different co-op players. +---@param units actor[] +---@param specificPlayers? player[] +AssignToCoopPlayers = function(units, specificPlayers, ignoreBlackList) + if not ignoreBlackList then + units = Utils.Where(units, CanSplitAmongPlayers) + end + + local ownerID + + if specificPlayers then + players = specificPlayers + ownerID = 0 + else + players = CoopPlayers + ownerID = LastAssignedCoopID or 0 + end + + if #players == 0 then + return + end + + -- Rotate through the player list and assign a + -- unit to each until no more units remain. + Utils.Do(units, function(unit) + if unit.Type ~= "player" then + ownerID = ownerID + 1 + + if ownerID > #players then + ownerID = 1 + end + + local newOwner = players[ownerID] + + if not specificPlayers then + LastAssignedCoopID = ownerID + end + + unit.Owner = newOwner + + if unit.HasProperty("HasPassengers") then + Trigger.AfterDelay(1, function() + if not unit.IsDead then + AssignToCoopPlayers(Utils.Where(unit.Passengers, function(a) return not a.IsDead end), specificPlayers, ignoreBlackList) + end + end) + end + end + end) +end + +---@param units actor[] +AssignToEvenPlayers = function(units) + AssignToCoopPlayers(units, GetEvenPlayers()) +end + +---@param units actor[] +AssignToOddPlayers = function(units) + AssignToCoopPlayers(units, GetOddPlayers()) +end + +GoodSpread = function() + Trigger.AfterDelay(5, GoodSpread) + + if StopSpread ~= true then + local actors = Utils.Where(SinglePlayerPlayer.GetActors(), function(a) return a.HasProperty("Move") and not IsHarvester(a) and not IsMcv(a) end) + + if #actors > 0 then + AssignToCoopPlayers(actors) + end + end +end + +local function SyncObjectives() + local texts = { + primary = "Primary", + secondary = "Secondary", + newPrimary = "New primary objective", + newSecondary = "New secondary objective" + } + + Trigger.OnObjectiveAdded(MainPlayer, function(_, obid) + local description = MainPlayer.GetObjectiveDescription(obid) + local type = MainPlayer.GetObjectiveType(obid) + local required = type == texts.primary + + ForEachPlayer(function(player) + player.AddObjective(description, type, required) + local OBJcolour = HSLColor.Yellow + if required then + Media.DisplayMessageToPlayer(player, description, texts.newPrimary, OBJcolour) + else + OBJcolour = HSLColor.Gray + Media.DisplayMessageToPlayer(player, description, texts.newSecondary, OBJcolour) + end + end) + end) + + ForEachPlayer(function(player) + Trigger.OnPlayerWon(player, function() + Trigger.AfterDelay(DateTime.Seconds(1), function() + Media.PlaySpeechNotification(player, "Win") + end) + end) + + Trigger.OnPlayerLost(player, function(p) + PlayerDefeatedOrDisconnected(p) + end) + + TriggerCA.OnPlayerDisconnected(player, function(p) + PlayerDefeatedOrDisconnected(p) + end) + end) + + Trigger.OnObjectiveCompleted(MainPlayer, function(_, obid) + ForEachPlayer(function(player) + player.MarkCompletedObjective(obid) + if player.IsLocalPlayer then + Media.PlaySoundNotification(player, "AlertBleep") + Media.DisplayMessage(MainPlayer.GetObjectiveDescription(obid), "Objective completed", HSLColor.LimeGreen) + end + end) + end) + + Trigger.OnObjectiveFailed(MainPlayer, function(_, obid) + ForEachPlayer(function(player) + player.MarkFailedObjective(obid) + if player.IsLocalPlayer then + Media.PlaySoundNotification(player, "AlertBleep") + Media.DisplayMessage(MainPlayer.GetObjectiveDescription(obid), "Objective failed", HSLColor.Red) + end + end) + end) +end + +PlayerDefeatedOrDisconnected = function(player) + + if not IsPlayerInList(player, CoopPlayers) then + return + end + + for i, v in ipairs(CoopPlayers) do + if v == player then + table.remove(CoopPlayers, i) + break + end + end + + Trigger.AfterDelay(DateTime.Seconds(1), function() + Media.PlaySpeechNotification(player, "Lose") + end) + + local surrenderMessages = { + "PID's not surrenderin'! PID's passed on! This Commander is no more! They have ceased to be! PID's expired and gone to meet their maker! PID's a stiff! Bereft of life, PID rests in peace! If you hadn't nailed them to the playerlist, PID'd be pushing up the daisies! Their metabolic processes are now history! PID's off the twig! PID's kicked the bucket, PID's shuffled off their mortal coil, run down the curtain and joined the bleedin' choir invisible!! THIS IS AN EX-COMMANDER!!", + "We noticed that PID went AWOL. All troops under their command will be reassigned.", + "We are sad to announce that PID is lost in the Combat Zone. We can't afford a search party. All units, regroup.", + "PID has abandoned the operation. Their assets are now under joint command.", + "Commander PID has failed to report in. All units will be redistributed.", + "PID is MIA. Remaining forces are now reassigned to active commanders.", + "Reports confirm that PID is no longer in the fight. Reallocating resources.", + "High Command suspects PID was compromised. Their troops are now yours.", + "PID pulled out. Their units remain. Use them wisely.", + "We've lost contact with PID. Taking control of their remaining forces.", + "PID has been deemed unfit for command. Reassigning assets.", + "No further transmissions from PID. Their troops now fall under unified command.", + "High Command regrets to inform that PID has been silenced. Units are being reassigned.", + "Another Commander down: PID. Their legacy continues through their troops.", + "PID's command channel went dark. Redirecting all forces to surviving operatives.", + "Surrender confirmed from PID. Their units will continue the fight without them.", + "PID's resignation has been accepted... by force. Reassigning units.", + "Satellite link to PID severed. Their war assets are now at your disposal.", + "Combat stress got the better of PID. Picking up the slack.", + "Casualty of war: PID. All operable units reassigned to remaining players.", + "Command vacancy filled. PID's units will continue under new leadership.", + "PID has paid the ultimate price. Their forces are yours to command.", + "War spares no one. PID has fallen. Their troops remain.", + "PID has been promoted to civilian. By force. Units reassigned.", + "PID tripped on a landmine and career-ending shame. Units reassigned.", + "PID forgot to pay their command subscription. Reallocating troops.", + "PID's command authority revoked. Initiating redistribution of forces.", + "Command integrity of PID compromised. Units transferring to secure channels.", + "PID's signal is gone. Let their sacrifice not be in vain.", + "Command silence from PID. Reallocation of units underway.", + "PID fell to the chaos of war. Their forces continue the mission.", + "Confirmed KIA: PID. Taking operational control of remaining assets.", + "PID's command integrity shattered. Their war effort continues through us.", + "Another ghost in the fog: PID. Let their units be our resolve.", + "Transmission lost. PID is no more. We fight on.", + "PID has ragequit real life. You get their toys.", + "PID left the oven on. They've gone home. You're in charge now.", + "PID suffered from sudden strategic incompetence. Assets reallocated.", + "PID experienced spontaneous desk flipping. Their troops are free real estate.", + "Last known words of PID: 'Watch this!' Reassigning units.", + "PID achieved a higher state of 'not our problem'. You take it from here.", + "Command code: FAIL-STATE. PID's forces now under community management.", + "We've promoted PID to field observer. Very, very far from the field.", + "PID has been debriefed from active duty. Units reassigned.", + "Command slot vacated: PID. Assets redistributed.", + "PID no longer reports to HQ. Taking direct control of their forces.", + "Operational handover complete for PID. Troops reassigned.", + "Command continuity protocol activated. PID's assets now reassigned.", + "PID has disengaged. Their units now fall under surviving command.", + "Control signal lost from PID. Integrating their forces.", + "PID has relinquished control. Remaining assets transferred." + } + + --Media.DisplayMessage("Number of Bullshit Messages: " .. #surrenderMessages) + Trigger.AfterDelay(DateTime.Seconds(5), function() + if not MessageCooldown then + MessageCooldown = true + local messageIndex = Utils.RandomInteger(1, #surrenderMessages) + local selectedMessage = surrenderMessages[messageIndex] + local playerName = player.Name + if selectedMessage ~= nil then + local formattedMessage = string.gsub(selectedMessage, "PID", playerName) + Media.DisplayMessage(formattedMessage, "High Command", player.Color) + end + end + end) + + Trigger.AfterDelay(DateTime.Seconds(8), function() + AssignToCoopPlayers(player.GetActors(), CoopPlayers) + local estateCash = player.Cash + player.Resources + local estateCashShare = estateCash / #CoopPlayers + Utils.Do(CoopPlayers, function(player) + player.Cash = player.Cash + estateCashShare + end) + MessageCooldown = false + end) + + Trigger.AfterDelay(DateTime.Seconds(10), function() + -- failsafe if reassignment wasn't possible + local deathList = player.GetActors() + Utils.Do(deathList, function(a) + if a.Type ~= "player" and not a.IsDead and a.HasProperty("Health") then + a.Kill() + end + end) + end) +end + +---@param unit actor +---@param produced boolean +---@param original? actor +local function OrderCopiedUnit(unit, produced, original, isAircraft) + ScatterIfAble(unit) + Trigger.AfterDelay(60, function() + if unit.IsDead == true or unit.IsInWorld == false then + return + end + local behavior + if not produced then + behavior = Utils.Random(SBehaviours) + elseif produced then + behavior = Utils.Random(PBehaviours) + else + return + end + local IsAggro = false + if isAircraft == true then + InitAttackAircraft(unit) + return + end + Trigger.OnDamaged(unit,function(self, attacker, damage) + if IsAggro == false then + IsAggro = true + unit.Stop() + IdleHunt(unit) + end + end) + Trigger.OnKilled(unit,function() + Trigger.ClearAll(unit) + return + end) + --Media.DisplayMessage("Random Behaviour: " .. behavior) + if behavior == "normal" then + if original and unit.HasProperty("Guard") then + Trigger.OnIdle(unit, function() + if original.IsDead then + unit.Hunt() + return + end + unit.Guard(original) + end) + end + --Send the Unit to hunt if Guarding takes too long to prevent clogging the Map + if produced then + Trigger.AfterDelay(DateTime.Seconds(60), function() + if unit.IsDead == false and unit.IsInWorld == true then + unit.Stop() + unit.Hunt() + return + end + end) + end + end + + if behavior == "hunt" then + IdleHunt(unit) + return + end + + if behavior == "wander" then + StartWandering(unit) + end + + if behavior == "idle" then + StartIdling(unit) + end + end) +end + +StartIdling = function(unit) + local idletime = Utils.RandomInteger(20, 120) + Trigger.AfterDelay(DateTime.Seconds(idletime), function() + if unit.IsDead == false and unit.IsInWorld == true then + ScatterIfAble(unit) + StartIdling(unit) + end + end) +end + +StartWandering = function(unit) + local wandertarget = Map.RandomCell() + local wandertime = Utils.RandomInteger(5, 30) + Trigger.AfterDelay(DateTime.Seconds(wandertime), function() + if unit.IsDead == false and unit.IsInWorld == true then + unit.AttackMove(wandertarget, 5) + StartWandering(unit) + end + end) +end + +local function GetTeamPrimaryProducerOfType(buildingType) + for _, player in ipairs(CoopPlayers) do + local realProducers = player.GetActorsByType(buildingType) + if #realProducers > 0 then + local primaryProducers = Utils.Where(realProducers, function(rp) + return rp.HasProperty("IsPrimaryBuilding") and rp.IsPrimaryBuilding + end) + if #primaryProducers > 0 then + return primaryProducers[#primaryProducers] + end + return realProducers[#realProducers] + end + end + + return nil +end + +---@param enemyPlayer player +local function MultiplyEnemyStartingUnits(enemyPlayer) + local multiplier + local playerCount = GetCoopPlayerCount() + + if Map.LobbyOption("enmp") == "999" then + multiplier = playerCount - 1 + else + multiplier = tonumber(Map.LobbyOptionOrDefault("enmp", "0")) + end + + if multiplier == 0 then + return + end + + local enemyUnits = enemyPlayer.GetGroundAttackers() + + local ValidAircrafts = {} + + if AirCraftMulti == "domulti" then + local FoundAircrafts = {} + ValidAircrafts = {"b2b","mig","suk","suk.upg","yak","p51","heli","u2","u2.killzone","smig","a10","a10.sw","a10.gau","a10.bomber","apch","orca","orcb","uav","rah","kiro","harr","scrn","venm","auro","pmak","beag","phan","kamv","shde","vert","mcor","disc","jack","stmr","torm","enrv","deva","pac","inva","mshp"} + FoundAircrafts = enemyPlayer.GetActorsByTypes(ValidAircrafts) + Utils.Do(FoundAircrafts,function(UID) + table.insert(enemyUnits,UID) + end) + end + + Utils.Do(enemyUnits, function(original) + local types = { } + + for _ = 1, multiplier do + types[#types + 1] = original.Type + end + + Reinforcements.Reinforce(enemyPlayer, types, { original.Location }, 0, function(copy) + local isAircraft = Utils.Any(ValidAircrafts,function(CID) + if copy.Type == CID then + return true + else + return false + end + end) + OrderCopiedUnit(copy, false, original, isAircraft) + end) + end) +end + +---@param enemyPlayer player +local function MultiplyEnemyProduction(enemyPlayer) + local multiplier + local playerCount = GetCoopPlayerCount() + + if Map.LobbyOption("prmp") == "999" then + multiplier = playerCount - 1 + else + multiplier = 0 + tonumber(Map.LobbyOptionOrDefault("prmp", "0")) + end + + if multiplier == 0 then + return + end + + Trigger.OnAnyProduction(function(_, unit) + if unit.Owner ~= enemyPlayer then + return + end + local AttackerFilter = unit.Owner.GetGroundAttackers() + local ValidAircrafts = {} + if AirCraftMulti == "domulti" then + local FoundAircrafts = {} + + ValidAircrafts = {"b2b","mig","suk","suk.upg","yak","p51","heli","u2","u2.killzone","smig","a10","a10.sw","a10.gau","a10.bomber","apch","orca","orcb","uav","rah","kiro","harr","scrn","venm","auro","pmak","beag","phan","kamv","shde","vert","mcor","disc","jack","stmr","torm","enrv","deva","pac","inva","mshp"} + FoundAircrafts = enemyPlayer.GetActorsByTypes(ValidAircrafts) + + Utils.Do(FoundAircrafts,function(UID) + table.insert(AttackerFilter,UID) + end) + end + + Utils.Do(AttackerFilter, function(UID) + if unit == UID then + ScatterIfAble(unit) + local types = { } + + for _ = 1, multiplier do + types[#types + 1] = unit.Type + end + + Reinforcements.Reinforce(unit.Owner, types, { unit.Location }, 0, function(copy) + local original = unit + + local isAircraft = Utils.Any(ValidAircrafts,function(CID) + if copy.Type == CID then + return true + else + return false + end + end) + + if isAircraft == true then + OrderCopiedUnit(copy, true, original, isAircraft) + else + OrderCopiedUnit(copy, true, original) + end + end) + return + end + end) + end) +end + +local function SetExtraMines() + if Map.LobbyOption("oremines") == "oreoff" then + --Media.DisplayMessage("Extra Mines are turned off.") + return + end + if Map.LobbyOption("oremines") == "oreon" or Map.LobbyOption("oremines") == "oreonupgrade" then + local OreMineList = { ExtraMine1, ExtraMine2, ExtraMine3, ExtraMine4, ExtraMine5, ExtraMine6, ExtraMine7, ExtraMine8, ExtraMine9, ExtraMine10 } + local GemMineList = { ExtraGemMine1, ExtraGemMine2, ExtraGemMine3, ExtraGemMine4, ExtraGemMine5, ExtraGemMine6, ExtraGemMine7, ExtraGemMine8, ExtraGemMine9, ExtraGemMine10, ExtraDiamondMine1, ExtraDiamondMine2, ExtraDiamondMine3, ExtraDiamondMine4, ExtraDiamondMine5, ExtraDiamondMine6, ExtraDiamondMine7, ExtraDiamondMine8, ExtraDiamondMine9, ExtraDiamondMine10 } + local GreenBlossomList = { ExtraBlossom1, ExtraBlossom2, ExtraBlossom3, ExtraBlossom4, ExtraBlossom5, ExtraBlossom6, ExtraBlossom7, ExtraBlossom8, ExtraBlossom9, ExtraBlossom10 } + local BlueBlossomList = { ExtraBlueBlossom1, ExtraBlueBlossom2, ExtraBlueBlossom3, ExtraBlueBlossom4, ExtraBlueBlossom5, ExtraBlueBlossom6, ExtraBlueBlossom7, ExtraBlueBlossom8, ExtraBlueBlossom9, ExtraBlueBlossom10 } + + Utils.Do(OreMineList, function(actor) + if actor then + Actor.Create("mine", true, { Location = actor.Location, Owner = Neutral }) + --Media.DisplayMessage("Extra Ore Mine created.") + end + end) + Utils.Do(GemMineList, function(actor) + if actor then + Actor.Create("gmine", true, { Location = actor.Location, Owner = Neutral }) + --Media.DisplayMessage("Extra Gem Mine created.") + end + end) + Utils.Do(GreenBlossomList, function(actor) + if actor then + Actor.Create("split2", true, { Location = actor.Location, Owner = Neutral }) + end + end) + Utils.Do(BlueBlossomList, function(actor) + if actor then + Actor.Create("splitblue", true, { Location = actor.Location, Owner = Neutral }) + end + end) + end + if Map.LobbyOption("oremines") == "oreupgrade" or Map.LobbyOption("oremines") == "oreonupgrade" then + Trigger.AfterDelay(2, function() + local AllT1Spawners = {} + AllT1Spawners = Neutral.GetActorsByTypes({"split2", "split3", "mine"}) + Utils.Do(AllT1Spawners,function(SID) + local Spawnertype = SID.Type + local Spawnerlocation = SID.Location + if Spawnertype == "mine" then + Spawnertype = "gmine" + elseif Spawnertype == "split2" or Spawnertype == "split3" then + Spawnertype = "splitblue" + end + SID.Destroy() + Actor.Create(Spawnertype, true, { Location = Spawnerlocation, Owner = Neutral }) + end) + end) + end + if Map.LobbyOption("oremines") == "orefinite" then + Trigger.AfterDelay(2, function() + local AllSpawners = {} + AllSpawners = Neutral.GetActorsByTypes({"split2", "split3", "splitblue", "mine"}) + Utils.Do(AllSpawners,function(SID) + SID.Destroy() + end) + Media.DisplayMessage("All resource spawners are deleted now. Good luck!") + end) + end +end + +IncomeSharing = function() + Utils.Do(CoopPlayers, function(PID) + -- Handle 999% Shared: Send everything to everyone + if IncomePercentage == 999 then + if PID.Resources > 0 then + Utils.Do(CoopPlayers,function(PID2) + PID2.Cash = PID2.Cash + PID.Resources + end) + PID.Resources = 0 + end + -- Handle 100/125/150%/175% Shared: Send everything to SharedBank (with 0/25/50%/75% extra per ally) + elseif IncomePercentage >= 100 then + local additionalPlayers = #CoopPlayers - 1 + local bonusPerPlayer = (IncomePercentage - 100) / 100 + local totalMultiplier = 1 + (bonusPerPlayer * additionalPlayers) + local totalAmount = PID.Resources * totalMultiplier + SharedBank = SharedBank + totalAmount + PID.Resources = 0 + else + -- Store resources in the buffer for non-100% sharing + if PID.Resources > 0 then + ResourceBuffer[PID] = ResourceBuffer[PID] + PID.Resources + PID.Resources = 0 -- Ensure resources are fully moved to buffer + end + + -- Convert Buffered Resources into Cash & SharedBank when threshold is met + local shareThreshold = 1 + (IncomePercentage / 100) -- Example: If IncomePercentage = 30, this would be 1.3 + + while ResourceBuffer[PID] >= shareThreshold do + -- Pay the player 1$ in cash + PID.Cash = PID.Cash + 1 + + -- Transfer the shared portion to SharedBank + local shareAmount = shareThreshold - 1 + SharedBank = SharedBank + shareAmount + + -- Reduce buffer accordingly + ResourceBuffer[PID] = ResourceBuffer[PID] - shareThreshold + end + end + end) + + -- Distribute Shared Account Money when there's enough in SharedBank + if SharedBank >= #CoopPlayers then + local fullDollars = math.floor(SharedBank / #CoopPlayers) -- Calculate the full dollars to distribute + local remainder = SharedBank - (fullDollars * #CoopPlayers) -- Calculate the remaining SharedBank value + + -- Distribute the full dollars to each player + Utils.Do(CoopPlayers, function(PID) + PID.Cash = PID.Cash + fullDollars + end) + + -- Remaining SharedBank goes back to the SharedBank after distribution + SharedBank = remainder + --Media.DisplayMessage((fullDollars * #CoopPlayers) .. "$ distributed " .. remainder .. "$ left in Shared Account.") + end + + -- Loop with a delay to keep running + Trigger.AfterDelay(1, IncomeSharing) +end + +EnemyVeterancy = function(mainEnemies) + --Small delay for the Multiplicators + Trigger.AfterDelay(5, function() + local EnLevel = tonumber(Map.LobbyOption("enemyranks")) + if EnLevel ~= 0 then + --Level up all Starting Units + Utils.Do(mainEnemies, function(EID) + Utils.Do(EID.GetActors(), function(UID) + if UID.HasProperty("CanGainLevel") == true then + UID.GiveLevels(EnLevel, true) + end + end) + end) + --Level up all Produced Units + Trigger.OnAnyProduction(function(producer, UID) + Utils.Do(mainEnemies, function(EID) + if UID.Owner == EID and UID.HasProperty("CanGainLevel") == true then + if UID.Level == 0 then + UID.GiveLevels(EnLevel, true) + end + end + end) + end) + --Level up eventual Reinforcements with periodic Checks + LateEnemyVeterancy(mainEnemies,EnLevel) + end + end) +end + +LateEnemyVeterancy = function(mainEnemies, EnLevel) + Utils.Do(mainEnemies, function(EID) + Utils.Do(EID.GetActors(), function(UID) + if UID.HasProperty("CanGainLevel") == true then + if UID.Level == 0 then + UID.GiveLevels(EnLevel, true) + end + end + end) + end) + Trigger.AfterDelay(60, function() + LateEnemyVeterancy(mainEnemies,EnLevel) + end) +end + +StartCashSpread = function(MinStartCash) + if MinStartCash == nil then + MinStartCash = 2500 --This should be enough for a power plant and a refinery for each player + end + local StartCash = MainPlayer.Cash / #CoopPlayers + if StartCash < MinStartCash then + StartCash = MinStartCash + end + Utils.Do(CoopPlayers, function(p) + p.Cash = StartCash + end) +end + +CoopInit = function() + SBehaviours = {} + PBehaviours = {} + + AirCraftMulti = Map.LobbyOption("multiplyaircraft") + + local Pfollow = tonumber(Map.LobbyOption("pfollow")) + local Phunt = tonumber(Map.LobbyOption("phunt")) + local Pwander = tonumber(Map.LobbyOption("pwander")) + local Pidle = tonumber(Map.LobbyOption("pidle")) + + local Sfollow = tonumber(Map.LobbyOption("sfollow")) + local Shunt = tonumber(Map.LobbyOption("shunt")) + local Swander = tonumber(Map.LobbyOption("swander")) + local Sidle = tonumber(Map.LobbyOption("sidle")) + + for i = 1, Pfollow do + table.insert(PBehaviours,"normal") + end + + for i = 1, Phunt do + table.insert(PBehaviours,"hunt") + end + + for i = 1, Pwander do + table.insert(PBehaviours,"wander") + end + + for i = 1, Pidle do + table.insert(PBehaviours,"idle") + end + + for i = 1, Sfollow do + table.insert(SBehaviours,"normal") + end + + for i = 1, Shunt do + table.insert(SBehaviours,"hunt") + end + + for i = 1, Swander do + table.insert(SBehaviours,"wander") + end + + for i = 1, Sidle do + table.insert(SBehaviours,"idle") + end + + if #SBehaviours == 0 then + SBehaviours = {"idle"} + end + + if #PBehaviours == 0 then + PBehaviours = {"idle"} + end + + MainPlayer = SinglePlayerPlayer + CoopPlayers = MissionPlayers + + local mainEnemies = MissionEnemies + local baseSharingValue = Map.LobbyOption("basesharing") + + if baseSharingValue == "1" then + McvPerPlayer = false + else + McvPerPlayer = true + end + + -- delay by 1 tick to allow difficulty based removals to take effect + Trigger.AfterDelay(1, function() + GoodSpread() + end) + + SyncObjectives() + + Trigger.AfterDelay(DateTime.Seconds(2), function() + Utils.Do(mainEnemies, function(player) + MultiplyEnemyProduction(player) + MultiplyEnemyStartingUnits(player) + end) + + IncomeshareLobbyoption = Map.LobbyOption("incomeshare") + + if MoneyShareOverride ~= nil then + if IncomeshareLobbyoption == "999" and MoneyShareOverride == 100 then + MoneyShareOverride = "999" + end + IncomeshareLobbyoption = MoneyShareOverride + end + + IncomePercentage = tonumber(IncomeshareLobbyoption) + + if IncomePercentage ~= 0 and #CoopPlayers >= 2 then + ResourceBuffer = {} + + Utils.Do(CoopPlayers, function(PID) + ResourceBuffer[PID] = 0 + end) + + SharedBank = 0 + + IncomeSharing() + end + + SetExtraMines() + originalLocation = CPos.New(3, 3) + StartCoopBots() + EnemyVeterancy(mainEnemies) + end) +end + +------------------- + +IsBaseTransferActor = function(actor) + return actor.HasProperty("StartBuildingRepairs") or IsHarvester(actor) or Utils.Any(WallTypes, function(t) return actor.Type == t end) +end + +TransferBaseToPlayer = function(fromPlayer, toPlayer) + Trigger.AfterDelay(1, function() + local baseActors = Utils.Where(fromPlayer.GetActors(), function(a) + return IsBaseTransferActor(a) + end) + Utils.Do(baseActors, function(a) + a.Owner = toPlayer + end) + CACoopQueueSyncer() + end) +end + +TransferMcvsToPlayers = function() + local mcvs = SinglePlayerPlayer.GetActorsByTypes(McvTypes) + local toPlayers = GetMcvPlayers() + Utils.Do(mcvs, function(mcv) + mcv.Owner = toPlayers[1] + if McvPerPlayer then + Utils.Do(toPlayers, function(p) + if p ~= toPlayers[1] then + local copy = Actor.Create(mcv.Type, true, { Owner = p, Location = mcv.Location }) + ScatterIfAble(copy) + end + end) + end + end) +end + +GetFirstActivePlayer = function() + for _, p in ipairs(MissionPlayers) do + if p.PlayerIsActive then + return p + end + end + return Neutral +end + +GetMcvPlayers = function() + if McvPerPlayer then + return CoopPlayers + else + local firstActive = GetFirstActivePlayer() + if firstActive then + return { firstActive } + else + return { Neutral } + end + end +end + +-- overrides the base campaign version +SetupRefAndSilosCaptureCredits = function(player) + local silosAndRefineries = player.GetActorsByTypes(CashRewardOnCaptureTypes) + Utils.Do(silosAndRefineries, function(a) + Trigger.OnCapture(a, function(self, captor, oldOwner, newOwner) + if IsMissionPlayer(newOwner) then + Utils.Do(MissionPlayers, function(p) + p.Cash = p.Cash + (CapturedCreditsAmount / #MissionPlayers) + end) + else + newOwner.Cash = newOwner.Cash + CapturedCreditsAmount + end + Media.FloatingText("+$" .. CapturedCreditsAmount, self.CenterPosition, 30, newOwner.Color) + end) + end) +end diff --git a/mods/ca/sequences/aircraft.yaml b/mods/ca/sequences/aircraft.yaml index a887833d09..051f7b7ba3 100644 --- a/mods/ca/sequences/aircraft.yaml +++ b/mods/ca/sequences/aircraft.yaml @@ -1,362 +1,649 @@ mig: Inherits: ^VehicleOverlays - idle: mig - Facings: 16 - icon: migicon + idle: + Filename: mig.shp + Facings: 32 + UseClassicFacings: True + icon: + Filename: migicon.shp yak: Inherits: ^VehicleOverlays - idle: yak - Facings: 16 - muzzle: minigun + idle: + Filename: yak.shp + Facings: 32 + UseClassicFacings: True + muzzle: + Filename: minigun16.shp Length: 6 - Facings: 8 - icon: yakicon + Facings: 16 + icon: + Filename: yakicon.shp -heli: +p51: Inherits: ^VehicleOverlays - idle: heli + idle: + Filename: p51.shp Facings: 32 UseClassicFacings: True - rotor: lbrotor - Length: 4 - slow-rotor: lbrotor - Start: 4 - Length: 8 - icon: heliicon + muzzle: + Filename: minigun16.shp + Length: 6 + Facings: 16 + icon: + Filename: yakicon.shp -hind: +heli: Inherits: ^VehicleOverlays - idle: hind + idle: + Filename: heli.shp Facings: 32 UseClassicFacings: True - rotor: lrotorlg + rotor: + Filename: lbrotor.shp Length: 4 - slow-rotor: lrotorlg + slow-rotor: + Filename: lbrotor.shp Start: 4 Length: 8 - muzzle: minigun - Length: 6 - Facings: 8 - icon: hindicon + icon: + Filename: heliicon.shp -hindoriginal: +hind: Inherits: ^VehicleOverlays - idle: hindoriginal + Defaults: + Offset: 0, -3 + idle: + Filename: hind.shp Facings: 32 UseClassicFacings: True - rotor: lrotorlg + rotor: + Filename: lrotorlg.shp Length: 4 - slow-rotor: lrotorlg + slow-rotor: + Filename: lrotorlg.shp Start: 4 Length: 8 - muzzle: minigun + muzzle: + Filename: minigun16.shp Length: 6 - Facings: 8 - icon: hindicon + Facings: 16 + icon: + Filename: hindicon.shp + Offset: 0,0 tran: Inherits: ^VehicleOverlays - idle: tran + idle: + Filename: tran.shp Facings: 32 UseClassicFacings: True - rotor: lrotor + rotor: + Filename: lrotor.shp Length: 4 - rotor2: rrotor + rotor2: + Filename: rrotor.shp Length: 4 - slow-rotor: lrotor + slow-rotor: + Filename: lrotor.shp Start: 4 Length: 8 - slow-rotor2: rrotor + slow-rotor2: + Filename: rrotor.shp Start: 4 Length: 8 - open: tran + open: + Filename: tran.shp Start: 32 Length: 4 close: + Filename: tran.shp Frames: 35, 34, 33, 32 Length: 4 - unload: tran + unload: + Filename: tran.shp Start: 35 - icon: tranicon + icon: + Filename: tranicon.shp tran2: Inherits: ^VehicleOverlays - idle: tran2 + idle: + Filename: tran2.shp Facings: 32 UseClassicFacings: True - rotor: lrotor + rotor: + Filename: lrotor.shp Length: 4 - rotor2: rrotor + rotor2: + Filename: rrotor.shp Length: 4 - slow-rotor: lrotor + slow-rotor: + Filename: lrotor.shp Start: 4 Length: 8 - slow-rotor2: rrotor + slow-rotor2: + Filename: rrotor.shp Start: 4 Length: 8 - open: tran2 + open: + Filename: tran2.shp Start: 32 Length: 4 close: + Filename: tran2.shp Frames: 35, 34, 33, 32 Length: 4 - unload: tran2 + unload: + Filename: tran2.shp Start: 35 - icon: tranicnh + icon: + Filename: tranicnh.shp tran3: Inherits: ^VehicleOverlays - idle: tran3 + idle: + Filename: tran3.shp Facings: 32 UseClassicFacings: True - rotor: lrotor + rotor: + Filename: lrotor.shp Length: 4 - rotor2: rrotor + rotor2: + Filename: rrotor.shp Length: 4 - slow-rotor: lrotor + slow-rotor: + Filename: lrotor.shp Start: 4 Length: 8 - slow-rotor2: rrotor + slow-rotor2: + Filename: rrotor.shp Start: 4 Length: 8 - open: tran3 + open: + Filename: tran3.shp Start: 32 Length: 4 close: + Filename: tran3.shp Frames: 35, 34, 33, 32 Length: 4 - unload: tran3 + unload: + Filename: tran3.shp Start: 35 - icon: tranicon + icon: + Filename: tranicon.shp -ctran: +tran1husk: + Inherits: ^VehicleOverlays + idle: + Filename: tran1husk.shp + +tran2husk: Inherits: ^VehicleOverlays - idle: tran3 + idle: + Filename: tran2husk.shp + +halo: + Inherits: ^VehicleOverlays + idle: + Filename: halo.shp Facings: 32 UseClassicFacings: True - rotor: lrotor + rotor: + Filename: lrotorhuge.shp Length: 4 - rotor2: rrotor + slow-rotor: + Filename: lrotorhuge.shp + Start: 4 + Length: 8 + icon: + Filename: haloicon.shp + +nhaw: + Inherits: ^VehicleOverlays + idle: + Filename: nhaw.shp + Facings: 32 + UseClassicFacings: True + empty: + Filename: nhaw0.shp + Facings: 32 + UseClassicFacings: True + oneshot: + Filename: nhaw1.shp + Facings: 32 + UseClassicFacings: True + idle-upg: + Filename: nhaw2.shp + Facings: 32 + UseClassicFacings: True + rotor: + Filename: lrotor.shp Length: 4 - slow-rotor: lrotor + rotor2: + Filename: rrotor.shp + Length: 4 + slow-rotor: + Filename: lrotor.shp Start: 4 Length: 8 - slow-rotor2: rrotor + slow-rotor2: + Filename: rrotor.shp Start: 4 Length: 8 - open: tran3 - Start: 32 - Length: 4 - close: tran3 - Frames: 35, 34, 33, 32 - Length: 4 - unload: tran3 - Start: 35 - icon: ctranicnh - -tran1husk: - Inherits: ^VehicleOverlays - idle: tran1husk - -tran2husk: - Inherits: ^VehicleOverlays - idle: tran2husk + muzzle: + Filename: minigun16.shp + Length: 6 + Facings: 16 + icon: + Filename: nhawicon.shp u2: Inherits: ^VehicleOverlays - idle: u2 + idle: + Filename: u2.shp Facings: 16 +smig: + Inherits: ^VehicleOverlays + idle: + Filename: smig.shp + Facings: 32 + badr: Inherits: ^VehicleOverlays - idle: badr + idle: + Filename: badr.shp Facings: 16 b2b: Inherits: ^VehicleOverlays - idle: b2b + idle: + Filename: b2b.shp Facings: 32 a10: Inherits: ^VehicleOverlays - idle: a10 + idle: + Filename: a10.shp Facings: 32 UseClassicFacings: True - icon: a10icnh + muzzle: + Filename: minigun16.shp + Frames: 2,2,6,6,12,12,18,18,24,24,30,30,38,38,42,42,48,48,54,54,62,62,66,66,72,72,78,78,84,84,90,90 + Length: 2 + Facings: 16 + icon: + Filename: a10icnh.shp c17: Inherits: ^VehicleOverlays - idle: c17 + idle: + Filename: c17.shp + Facings: 32 + UseClassicFacings: True + +galx: + Inherits: ^VehicleOverlays + idle: + Filename: galx.shp + Facings: 32 + UseClassicFacings: True + +anto: + Inherits: ^VehicleOverlays + idle: + Filename: anto.shp Facings: 32 UseClassicFacings: True orca: Inherits: ^VehicleOverlays - idle: orca + idle: + Filename: orca.shp Facings: 32 UseClassicFacings: True - move: orca + move: + Filename: orca.shp Start: 32 Facings: 32 - icon: orcaicnh + move-afterburner: + Filename: orcajet.shp + Facings: 32 + Length: 3 + icon: + Filename: orcaicnh.shp orcab: Inherits: ^VehicleOverlays - idle: orcab + idle: + Filename: orcab.shp Facings: 32 UseClassicFacings: True - move: orcab + move: + Filename: orcab.shp Start: 32 Facings: 32 - icon: orcabicnh + icon: + Filename: orcabicnh.shp apch: Inherits: ^VehicleOverlays - idle: apch + idle: + Filename: apch.shp Facings: 32 UseClassicFacings: True - rotor: lrotor + rotor: + Filename: lrotor.shp Length: 4 - slow-rotor: lrotor + slow-rotor: + Filename: lrotor.shp Start: 4 Length: 8 - muzzle: minigun + muzzle: + Filename: minigun16.shp Length: 6 - Facings: 8 - icon: apchicnh + Facings: 16 + icon: + Filename: apchicnh.shp uav: Inherits: ^VehicleOverlays - idle: uav + idle: + Filename: uav.shp Facings: 32 UseClassicFacings: True rah66: Inherits: ^VehicleOverlays - idle: rah66 + idle: + Filename: rah66.shp Facings: 32 UseClassicFacings: True - rotor: lbrotor + rotor: + Filename: lbrotor.shp Length: 4 - slow-rotor: lbrotor + slow-rotor: + Filename: lbrotor.shp Start: 4 Length: 8 - icon: rah66icnh + icon: + Filename: rah66icnh.shp kirov: Inherits: ^VehicleOverlays - idle: kirov + idle: + Filename: kirov.shp Facings: 32 UseClassicFacings: True - rotor: krotor + rotor: + Filename: krotor.shp Length: 4 - slow-rotor: krotor + slow-rotor: + Filename: krotor.shp Start: 4 Length: 8 - icon: kirovicon + icon: + Filename: kirovicon.shp suk: Inherits: ^VehicleOverlays - idle: suk + idle: + Filename: suk.shp Facings: 32 - muzzle: minigun + UseClassicFacings: True + muzzle: + Filename: minigun.shp Length: 6 Facings: 8 - icon: sukicon + icon: + Filename: sukicon.shp orcaca: Inherits: ^VehicleOverlays - idle: orcaca + idle: + Filename: orcaca.shp Facings: 32 UseClassicFacings: True - move: orcaca + move: + Filename: orcaca.shp Start: 32 Facings: 32 - xo: xo + xo: + Filename: xo.shp Start: 80 Facings: 8 ZOffset: -1024 - icon: orcacaicnh + icon: + Filename: orcacaicnh.shp orcacapod: Inherits: ^VehicleOverlays - idle: orcacapod + idle: + Filename: orcacapod.shp Facings: 32 UseClassicFacings: True ZOffset: 256 - move: orcacapod + move: + Filename: orcacapod.shp Start: 32 Facings: 32 - icon: orcacaicnh + icon: + Filename: orcacaicnh.shp harr: Inherits: ^VehicleOverlays - idle: harr + idle: + Filename: harr.shp Facings: 32 UseClassicFacings: True - icon: harricon + icon: + Filename: harricon.shp horn: Inherits: ^VehicleOverlays - idle: horn + idle: + Filename: horn.shp Facings: 32 UseClassicFacings: True - icon: harricon + icon: + Filename: harricon.shp scrin: Inherits: ^VehicleOverlays - idle: scrin + idle: + Filename: scrin.shp Facings: 32 UseClassicFacings: True - icon: scrinicnh + icon: + Filename: scrinicnh.shp yf23: Inherits: ^VehicleOverlays - idle: yf23 + idle: + Filename: yf23.shp Facings: 32 UseClassicFacings: True - icon: a10icnh + icon: + Filename: a10icnh.shp pod: Inherits: ^VehicleOverlays - idle: pod + idle: + Filename: pod.shp Start: 1 Length: 1 pod2: Inherits: ^VehicleOverlays - idle: pod + idle: + Filename: pod.shp Length: 1 mh60: Inherits: ^VehicleOverlays - idle: mh60 + idle: + Filename: mh60.shp Facings: 32 UseClassicFacings: True - rotor: lrotorlg + rotor: + Filename: lrotorlg.shp Length: 4 - slow-rotor: lrotorlg + slow-rotor: + Filename: lrotorlg.shp Start: 4 Length: 8 - muzzle: minigun + muzzle: + Filename: minigun16.shp Length: 6 - Facings: 8 - icon: mh60icon + Facings: 16 + icon: + Filename: mh60icon.shp venm: Inherits: ^VehicleOverlays - idle: venm + idle: + Filename: venm.shp Facings: 32 UseClassicFacings: True - move: venm + move: + Filename: venm.shp Start: 32 Facings: 32 - icon: venmicnh + muzzle: + Filename: lasermuzzle.shp + Length: * + icon: + Filename: venmicnh.shp auro: Inherits: ^VehicleOverlays - idle: auro + idle: + Filename: auro.shp + Facings: 32 + UseClassicFacings: True + icon: + Filename: auroicnh.shp + +pmak: + Inherits: ^VehicleOverlays + idle: + Filename: pmak.shp + Facings: 32 + UseClassicFacings: True + icon: + Filename: pmakicon.shp + +beag: + Inherits: ^VehicleOverlays + idle: + Filename: beag.shp + Facings: 32 + UseClassicFacings: True + icon: + Filename: beagicon.shp + +phan: + Inherits: ^VehicleOverlays + idle: + Filename: phan.shp + Facings: 32 + UseClassicFacings: True + icon: + Filename: phanicon.shp + +kamv: + Inherits: ^VehicleOverlays + idle: + Filename: kamv.shp + Facings: 32 + UseClassicFacings: True + rotor: + Filename: lrotorlg.shp + Length: 4 + slow-rotor: + Filename: lrotorlg.shp + Start: 4 + Length: 8 + muzzle: + Filename: minigun16.shp + Length: 6 + Facings: 16 + icon: + Filename: kamvicon.shp + +shde: + Inherits: ^VehicleOverlays + idle: + Filename: shde.shp + Facings: 32 + UseClassicFacings: True + icon: + Filename: shdeicnh.shp + +vert: + Inherits: ^VehicleOverlays + idle: + Filename: vert.shp + Facings: 32 + UseClassicFacings: True + icon: + Filename: verticnh.shp + +mcor: + Inherits: ^VehicleOverlays + idle: + Filename: mcor.shp + Facings: 32 + UseClassicFacings: True + muzzle: + Frames: 0,1,2,1,2,1,2,3 + Filename: lasermuzzle.shp + Length: * + icon: + Filename: mcoricnh.shp + +disc: + Inherits: ^VehicleOverlays + idle: + Filename: disc.shp + Length: * + muzzle: + Filename: scrinmuzz6.shp + Length: * + Tick: 40 + ZOffset: 2049 + BlendMode: Additive + drain: + Filename: diskray.shp + Length: * + ZOffset: -128 + Offset: 0, 10 + Tick: 60 + Alpha: 0.65 + charge: + Filename: disccharge.shp + Length: * + Tick: 70 + ZOffset: 1023 + BlendMode: Additive + AlphaFade: True + icon: + Filename: discicon.shp + +disccrash: + Inherits: ^VehicleOverlays + idle: + Filename: disccrash.shp + Facings: 32 + UseClassicFacings: True + +jack: + Inherits: ^VehicleOverlays + idle: + Filename: jack.shp Facings: 32 UseClassicFacings: True - icon: auroicnh \ No newline at end of file + icon: + Filename: jackicon.shp diff --git a/mods/ca/sequences/decorations.yaml b/mods/ca/sequences/decorations.yaml index 948d1184bf..52462a636b 100644 --- a/mods/ca/sequences/decorations.yaml +++ b/mods/ca/sequences/decorations.yaml @@ -1,17 +1,21 @@ tc04: Defaults: - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - DESERT: TEMPERAT + Filename: tc04.tem + TilesetFilenames: + SNOW: tc04.sno + JUNGLE: tc04.jun + WINTER: tc04.win + BARREN: tc04.bar idle: tc04.husk: - Defaults: tc04 - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - DESERT: TEMPERAT + Defaults: + Filename: tc04.tem + TilesetFilenames: + SNOW: tc04.sno + JUNGLE: tc04.jun + WINTER: tc04.win + BARREN: tc04.bar idle: Start: 1 dead: @@ -21,18 +25,22 @@ tc04.husk: tc05: Defaults: - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - DESERT: TEMPERAT + Filename: tc05.tem + TilesetFilenames: + SNOW: tc05.sno + JUNGLE: tc05.jun + WINTER: tc05.win + BARREN: tc05.bar idle: tc05.husk: - Defaults: tc05 - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - DESERT: TEMPERAT + Defaults: + Filename: tc05.tem + TilesetFilenames: + SNOW: tc05.sno + JUNGLE: tc05.jun + WINTER: tc05.win + BARREN: tc05.bar idle: Start: 1 dead: @@ -42,18 +50,22 @@ tc05.husk: tc03: Defaults: - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - DESERT: TEMPERAT + Filename: tc03.tem + TilesetFilenames: + SNOW: tc03.sno + JUNGLE: tc03.jun + WINTER: tc03.win + BARREN: tc03.bar idle: tc03.husk: - Defaults: tc03 - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - DESERT: TEMPERAT + Defaults: + Filename: tc03.tem + TilesetFilenames: + SNOW: tc03.sno + JUNGLE: tc03.jun + WINTER: tc03.win + BARREN: tc03.bar idle: Start: 1 dead: @@ -63,18 +75,22 @@ tc03.husk: tc02: Defaults: - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - DESERT: TEMPERAT + Filename: tc02.tem + TilesetFilenames: + SNOW: tc02.sno + JUNGLE: tc02.jun + WINTER: tc02.win + BARREN: tc02.bar idle: tc02.husk: - Defaults: tc02 - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - DESERT: TEMPERAT + Defaults: + Filename: tc02.tem + TilesetFilenames: + SNOW: tc02.sno + JUNGLE: tc02.jun + WINTER: tc02.win + BARREN: tc02.bar idle: Start: 1 dead: @@ -84,16 +100,24 @@ tc02.husk: tc01: Defaults: - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT + Filename: tc01.tem + TilesetFilenames: + SNOW: tc01.sno + DESERT: tc01.des + JUNGLE: tc01.jun + WINTER: tc01.win + BARREN: tc01.bar idle: tc01.husk: - Defaults: tc01 - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT + Defaults: + Filename: tc01.tem + TilesetFilenames: + SNOW: tc01.sno + DESERT: tc01.des + JUNGLE: tc01.jun + WINTER: tc01.win + BARREN: tc01.bar idle: Start: 1 dead: @@ -103,26 +127,12 @@ tc01.husk: t18: Defaults: - UseTilesetExtension: true - TilesetOverrides: - TEMPERAT: DESERT - INTERIOR: DESERT - SNOW: DESERT - WINTER: DESERT - BARREN: DESERT - JUNGLE: DESERT + Filename: t18.des idle: t18.husk: - Defaults: t18 - UseTilesetExtension: true - TilesetOverrides: - TEMPERAT: DESERT - INTERIOR: DESERT - SNOW: DESERT - WINTER: DESERT - BARREN: DESERT - JUNGLE: DESERT + Defaults: + Filename: t18.des idle: Start: 1 dead: @@ -132,18 +142,22 @@ t18.husk: t17: Defaults: - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - DESERT: TEMPERAT + Filename: t17.tem + TilesetFilenames: + SNOW: t17.sno + JUNGLE: t17.jun + WINTER: t17.win + BARREN: t17.bar idle: t17.husk: - Defaults: t17 - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - DESERT: TEMPERAT + Defaults: + Filename: t17.tem + TilesetFilenames: + SNOW: t17.sno + JUNGLE: t17.jun + WINTER: t17.win + BARREN: t17.bar idle: Start: 1 dead: @@ -153,18 +167,22 @@ t17.husk: t16: Defaults: - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - DESERT: TEMPERAT + Filename: t16.tem + TilesetFilenames: + SNOW: t16.sno + JUNGLE: t16.jun + WINTER: t16.win + BARREN: t16.bar idle: t16.husk: - Defaults: t16 - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - DESERT: TEMPERAT + Defaults: + Filename: t16.tem + TilesetFilenames: + SNOW: t16.sno + JUNGLE: t16.jun + WINTER: t16.win + BARREN: t16.bar idle: Start: 1 dead: @@ -173,19 +191,23 @@ t16.husk: Tick: 80 t15: - Defaults: t15 - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - DESERT: TEMPERAT + Defaults: + Filename: t15.tem + TilesetFilenames: + SNOW: t15.sno + JUNGLE: t15.jun + WINTER: t15.win + BARREN: t15.bar idle: t15.husk: - Defaults: t15 - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - DESERT: TEMPERAT + Defaults: + Filename: t15.tem + TilesetFilenames: + SNOW: t15.sno + JUNGLE: t15.jun + WINTER: t15.win + BARREN: t15.bar idle: Start: 1 dead: @@ -195,18 +217,22 @@ t15.husk: t14: Defaults: - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - DESERT: TEMPERAT + Filename: t14.tem + TilesetFilenames: + SNOW: t14.sno + JUNGLE: t14.jun + WINTER: t14.win + BARREN: t14.bar idle: t14.husk: - Defaults: t14 - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - DESERT: TEMPERAT + Defaults: + Filename: t14.tem + TilesetFilenames: + SNOW: t14.sno + JUNGLE: t14.jun + WINTER: t14.win + BARREN: t14.bar idle: Start: 1 dead: @@ -216,18 +242,22 @@ t14.husk: t13: Defaults: - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - DESERT: TEMPERAT + Filename: t13.tem + TilesetFilenames: + SNOW: t13.sno + JUNGLE: t13.jun + WINTER: t13.win + BARREN: t13.bar idle: t13.husk: - Defaults: t13 - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - DESERT: TEMPERAT + Defaults: + Filename: t13.tem + TilesetFilenames: + SNOW: t13.sno + JUNGLE: t13.jun + WINTER: t13.win + BARREN: t13.bar idle: Start: 1 dead: @@ -237,18 +267,22 @@ t13.husk: t12: Defaults: - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - DESERT: TEMPERAT + Filename: t12.tem + TilesetFilenames: + SNOW: t12.sno + JUNGLE: t12.jun + WINTER: t12.win + BARREN: t12.bar idle: t12.husk: - Defaults: t12 - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - DESERT: TEMPERAT + Defaults: + Filename: t12.tem + TilesetFilenames: + SNOW: t12.sno + JUNGLE: t12.jun + WINTER: t12.win + BARREN: t12.bar idle: Start: 1 dead: @@ -258,18 +292,22 @@ t12.husk: t11: Defaults: - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - DESERT: TEMPERAT + Filename: t11.tem + TilesetFilenames: + SNOW: t11.sno + JUNGLE: t11.jun + WINTER: t11.win + BARREN: t11.bar idle: t11.husk: - Defaults: t11 - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - DESERT: TEMPERAT + Defaults: + Filename: t11.tem + TilesetFilenames: + SNOW: t11.sno + JUNGLE: t11.jun + WINTER: t11.win + BARREN: t11.bar idle: Start: 1 dead: @@ -279,18 +317,22 @@ t11.husk: t10: Defaults: - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - DESERT: TEMPERAT + Filename: t10.tem + TilesetFilenames: + SNOW: t10.sno + JUNGLE: t10.jun + WINTER: t10.win + BARREN: t10.bar idle: t10.husk: - Defaults: t10 - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - DESERT: TEMPERAT + Defaults: + Filename: t10.tem + TilesetFilenames: + SNOW: t10.sno + JUNGLE: t10.jun + WINTER: t10.win + BARREN: t10.bar idle: Start: 1 dead: @@ -300,26 +342,12 @@ t10.husk: t09: Defaults: - UseTilesetExtension: true - TilesetOverrides: - TEMPERAT: DESERT - INTERIOR: DESERT - SNOW: DESERT - WINTER: DESERT - BARREN: DESERT - JUNGLE: DESERT + Filename: t09.des idle: t09.husk: - Defaults: t09 - UseTilesetExtension: true - TilesetOverrides: - TEMPERAT: DESERT - INTERIOR: DESERT - SNOW: DESERT - WINTER: DESERT - BARREN: DESERT - JUNGLE: DESERT + Defaults: + Filename: t09.des idle: Start: 1 dead: @@ -329,16 +357,24 @@ t09.husk: t08: Defaults: - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT + Filename: t08.tem + TilesetFilenames: + SNOW: t08.sno + DESERT: t08.des + JUNGLE: t08.jun + WINTER: t08.win + BARREN: t08.bar idle: t08.husk: - Defaults: t08 - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT + Defaults: + Filename: t08.tem + TilesetFilenames: + SNOW: t08.sno + DESERT: t08.des + JUNGLE: t08.jun + WINTER: t08.win + BARREN: t08.bar idle: Start: 1 dead: @@ -348,18 +384,22 @@ t08.husk: t07: Defaults: - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - DESERT: TEMPERAT + Filename: t07.tem + TilesetFilenames: + SNOW: t07.sno + JUNGLE: t07.jun + WINTER: t07.win + BARREN: t07.bar idle: t07.husk: - Defaults: t07 - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - DESERT: TEMPERAT + Defaults: + Filename: t07.tem + TilesetFilenames: + SNOW: t07.sno + JUNGLE: t07.jun + WINTER: t07.win + BARREN: t07.bar idle: Start: 1 dead: @@ -369,18 +409,22 @@ t07.husk: t06: Defaults: - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - DESERT: TEMPERAT + Filename: t06.tem + TilesetFilenames: + SNOW: t06.sno + JUNGLE: t06.jun + WINTER: t06.win + BARREN: t06.bar idle: t06.husk: - Defaults: t06 - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - DESERT: TEMPERAT + Defaults: + Filename: t06.tem + TilesetFilenames: + SNOW: t06.sno + JUNGLE: t06.jun + WINTER: t06.win + BARREN: t06.bar idle: Start: 1 dead: @@ -390,18 +434,22 @@ t06.husk: t05: Defaults: - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - DESERT: TEMPERAT + Filename: t05.tem + TilesetFilenames: + SNOW: t05.sno + JUNGLE: t05.jun + WINTER: t05.win + BARREN: t05.bar idle: t05.husk: - Defaults: t05 - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - DESERT: TEMPERAT + Defaults: + Filename: t05.tem + TilesetFilenames: + SNOW: t05.sno + JUNGLE: t05.jun + WINTER: t05.win + BARREN: t05.bar idle: Start: 1 dead: @@ -411,26 +459,12 @@ t05.husk: t04: Defaults: - UseTilesetExtension: true - TilesetOverrides: - TEMPERAT: DESERT - INTERIOR: DESERT - SNOW: DESERT - WINTER: DESERT - BARREN: DESERT - JUNGLE: DESERT + Filename: t04.des idle: t04.husk: - Defaults: t04 - UseTilesetExtension: true - TilesetOverrides: - TEMPERAT: DESERT - INTERIOR: DESERT - SNOW: DESERT - WINTER: DESERT - BARREN: DESERT - JUNGLE: DESERT + Defaults: + Filename: t04.des idle: Start: 1 dead: @@ -440,18 +474,22 @@ t04.husk: t03: Defaults: - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - DESERT: TEMPERAT + Filename: t03.tem + TilesetFilenames: + SNOW: t03.sno + JUNGLE: t03.jun + WINTER: t03.win + BARREN: t03.bar idle: t03.husk: - Defaults: t03 - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - DESERT: TEMPERAT + Defaults: + Filename: t03.tem + TilesetFilenames: + SNOW: t03.sno + JUNGLE: t03.jun + WINTER: t03.win + BARREN: t03.bar idle: Start: 1 dead: @@ -461,18 +499,22 @@ t03.husk: t02: Defaults: - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - DESERT: TEMPERAT + Filename: t02.tem + TilesetFilenames: + SNOW: t02.sno + JUNGLE: t02.jun + WINTER: t02.win + BARREN: t02.bar idle: t02.husk: - Defaults: t02 - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - DESERT: TEMPERAT + Defaults: + Filename: t02.tem + TilesetFilenames: + SNOW: t02.sno + JUNGLE: t02.jun + WINTER: t02.win + BARREN: t02.bar idle: Start: 1 dead: @@ -482,18 +524,22 @@ t02.husk: t01: Defaults: - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - DESERT: TEMPERAT + Filename: t01.tem + TilesetFilenames: + SNOW: t01.sno + JUNGLE: t01.jun + WINTER: t01.win + BARREN: t01.bar idle: t01.husk: - Defaults: t01 - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - DESERT: TEMPERAT + Defaults: + Filename: t01.tem + TilesetFilenames: + SNOW: t01.sno + JUNGLE: t01.jun + WINTER: t01.win + BARREN: t01.bar idle: Start: 1 dead: @@ -503,164 +549,237 @@ t01.husk: ice01: Defaults: - UseTilesetExtension: true - TilesetOverrides: - DESERT: TEMPERAT - INTERIOR: TEMPERAT + Filename: ice01.tem + TilesetFilenames: + SNOW: ice01.sno + JUNGLE: ice01.jun + WINTER: ice01.win + BARREN: ice01.bar idle: Length: * ice02: Defaults: - UseTilesetExtension: true - TilesetOverrides: - DESERT: TEMPERAT - INTERIOR: TEMPERAT + Filename: ice02.tem + TilesetFilenames: + SNOW: ice02.sno + JUNGLE: ice02.jun + WINTER: ice02.win + BARREN: ice02.bar idle: Length: * ice03: Defaults: - UseTilesetExtension: true - TilesetOverrides: - DESERT: TEMPERAT - INTERIOR: TEMPERAT + Filename: ice03.tem + TilesetFilenames: + SNOW: ice03.sno + JUNGLE: ice03.jun + WINTER: ice03.win + BARREN: ice03.bar idle: Length: * ice04: Defaults: - UseTilesetExtension: true - TilesetOverrides: - DESERT: TEMPERAT - INTERIOR: TEMPERAT + Filename: ice04.tem + TilesetFilenames: + SNOW: ice04.sno + JUNGLE: ice04.jun + WINTER: ice04.win + BARREN: ice04.bar idle: Length: * ice05: Defaults: - UseTilesetExtension: true - TilesetOverrides: - DESERT: TEMPERAT - INTERIOR: TEMPERAT + Filename: ice05.tem + TilesetFilenames: + SNOW: ice05.sno + JUNGLE: ice05.jun + WINTER: ice05.win + BARREN: ice05.bar idle: Length: * v01: Defaults: - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - DESERT: TEMPERAT + Filename: v01.tem + TilesetFilenames: + SNOW: v01.sno + JUNGLE: v01.jun + WINTER: v01.win + BARREN: v01.bar idle: damaged-idle: Start: 1 v02: Defaults: - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - DESERT: TEMPERAT + Filename: v02.tem + TilesetFilenames: + SNOW: v02.sno + JUNGLE: v02.jun + WINTER: v02.win + BARREN: v02.bar idle: damaged-idle: Start: 1 v03: Defaults: - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - DESERT: TEMPERAT + Filename: v03.tem + TilesetFilenames: + SNOW: v03.sno + JUNGLE: v03.jun + WINTER: v03.win + BARREN: v03.bar idle: damaged-idle: Start: 1 v04: Defaults: - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - DESERT: TEMPERAT + Filename: v04.tem + TilesetFilenames: + SNOW: v04.sno + JUNGLE: v04.jun + WINTER: v04.win + BARREN: v04.bar idle: damaged-idle: Start: 1 v05: Defaults: - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - DESERT: TEMPERAT + Filename: v05.tem + TilesetFilenames: + SNOW: v05.sno + JUNGLE: v05.jun + WINTER: v05.win + BARREN: v05.bar idle: damaged-idle: Start: 1 v06: Defaults: - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - DESERT: TEMPERAT + Filename: v06.tem + TilesetFilenames: + SNOW: v06.sno + JUNGLE: v06.jun + WINTER: v06.win + BARREN: v06.bar idle: damaged-idle: Start: 1 v07: Defaults: - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - DESERT: TEMPERAT + Filename: v07.tem + TilesetFilenames: + SNOW: v07.sno + JUNGLE: v07.jun + WINTER: v07.win + BARREN: v07.bar idle: damaged-idle: Start: 1 v08: Defaults: - UseTilesetExtension: true + TilesetFilenames: + SNOW: v08.sno + INTERIOR: v08.int + TEMPERAT: v08.tem + DESERT: v08.des + JUNGLE: v08.jun + WINTER: v08.win + BARREN: v08.bar idle: damaged-idle: Start: 1 v09: Defaults: - UseTilesetExtension: true + TilesetFilenames: + SNOW: v09.sno + INTERIOR: v09.int + TEMPERAT: v09.tem + DESERT: v09.des + JUNGLE: v09.jun + WINTER: v09.win + BARREN: v09.bar idle: damaged-idle: Start: 1 v10: Defaults: - UseTilesetExtension: true + TilesetFilenames: + SNOW: v10.sno + INTERIOR: v10.int + TEMPERAT: v10.tem + DESERT: v10.des + JUNGLE: v10.jun + WINTER: v10.win + BARREN: v10.bar idle: damaged-idle: Start: 1 v11: Defaults: - UseTilesetExtension: true + TilesetFilenames: + SNOW: v11.sno + INTERIOR: v11.int + TEMPERAT: v11.tem + DESERT: v11.des + JUNGLE: v11.jun + WINTER: v11.win + BARREN: v11.bar idle: damaged-idle: Start: 1 v12: Defaults: - UseTilesetExtension: true + TilesetFilenames: + SNOW: v12.sno + INTERIOR: v12.int + TEMPERAT: v12.tem + DESERT: v12.des + JUNGLE: v12.jun + WINTER: v12.win + BARREN: v12.bar idle: damaged-idle: Start: 1 v13: Defaults: - UseTilesetExtension: true + TilesetFilenames: + SNOW: v13.sno + INTERIOR: v13.int + TEMPERAT: v13.tem + DESERT: v13.des + JUNGLE: v13.jun + WINTER: v13.win + BARREN: v13.bar idle: damaged-idle: Start: 1 v14: Defaults: - UseTilesetExtension: true + TilesetFilenames: + SNOW: v14.sno + INTERIOR: v14.int + TEMPERAT: v14.tem + DESERT: v14.des + JUNGLE: v14.jun + WINTER: v14.win + BARREN: v14.bar idle: ZOffset: -512 damaged-idle: @@ -669,7 +788,14 @@ v14: v15: Defaults: - UseTilesetExtension: true + TilesetFilenames: + SNOW: v15.sno + INTERIOR: v15.int + TEMPERAT: v15.tem + DESERT: v15.des + JUNGLE: v15.jun + WINTER: v15.win + BARREN: v15.bar idle: ZOffset: -512 damaged-idle: @@ -678,7 +804,14 @@ v15: v16: Defaults: - UseTilesetExtension: true + TilesetFilenames: + SNOW: v16.sno + INTERIOR: v16.int + TEMPERAT: v16.tem + DESERT: v16.des + JUNGLE: v16.jun + WINTER: v16.win + BARREN: v16.bar idle: ZOffset: -512 damaged-idle: @@ -687,7 +820,14 @@ v16: v17: Defaults: - UseTilesetExtension: true + TilesetFilenames: + SNOW: v17.sno + INTERIOR: v17.int + TEMPERAT: v17.tem + DESERT: v17.des + JUNGLE: v17.jun + WINTER: v17.win + BARREN: v17.bar idle: ZOffset: -512 damaged-idle: @@ -696,7 +836,14 @@ v17: v18: Defaults: - UseTilesetExtension: true + TilesetFilenames: + SNOW: v18.sno + INTERIOR: v18.int + TEMPERAT: v18.tem + DESERT: v18.des + JUNGLE: v18.jun + WINTER: v18.win + BARREN: v18.bar idle: ZOffset: -512 damaged-idle: @@ -704,368 +851,375 @@ v18: ZOffset: -512 v19: - idle: v19 + idle: + Filename: v19.shp Length: 14 v19.husk: - idle: v19 + idle: + Filename: v19.shp Start: 28 - fire-start: flmspt + fire-start: + Filename: flmspt.shp Length: * Offset: 7,-15 ZOffset: 1 - fire-loop: flmspt + fire-loop: + Filename: flmspt.shp Start: 50 Length: * Offset: 7,-15 ZOffset: 1 v20: - Defaults: - AddExtension: false - idle: v20.des + idle: + Filename: v20.des Length: 3 Tick: 120 - damaged-idle: v20.des + damaged-idle: + Filename: v20.des Start: 3 Length: 3 Tick: 120 v21: - Defaults: - AddExtension: false - idle: v21.des + idle: + Filename: v21.des Length: 3 Tick: 120 - damaged-idle: v21.des + damaged-idle: + Filename: v21.des Start: 3 Length: 3 Tick: 120 v22: - Defaults: - AddExtension: false - idle: v22.des + idle: + Filename: v22.des Length: 3 Tick: 120 - damaged-idle: v22.des + damaged-idle: + Filename: v22.des Start: 3 Length: 3 Tick: 120 v23: - Defaults: - AddExtension: false - idle: v23.des + idle: + Filename: v23.des Length: 3 Tick: 120 - damaged-idle: v23.des + damaged-idle: + Filename: v23.des Start: 3 Length: 3 Tick: 120 v24: - Defaults: - AddExtension: false - idle: v24.des - damaged-idle: v24.des + idle: + Filename: v24.des + damaged-idle: + Filename: v24.des Start: 1 v25: - Defaults: - AddExtension: false - idle: v25.des - damaged-idle: v25.des + idle: + Filename: v25.des + damaged-idle: + Filename: v25.des Start: 1 v26: - Defaults: - AddExtension: false - idle: v26.des - damaged-idle: v26.des + idle: + Filename: v26.des + damaged-idle: + Filename: v26.des Start: 1 v27: - Defaults: - AddExtension: false - idle: v27.des - damaged-idle: v27.des + idle: + Filename: v27.des + damaged-idle: + Filename: v27.des Start: 1 v28: - Defaults: - AddExtension: false - idle: v28.des - damaged-idle: v28.des + idle: + Filename: v28.des + damaged-idle: + Filename: v28.des Start: 1 v29: - Defaults: - AddExtension: false - idle: v29.des - damaged-idle: v29.des + idle: + Filename: v29.des + damaged-idle: + Filename: v29.des Start: 1 v30: - Defaults: - AddExtension: false - idle: v30.des - damaged-idle: v30.des + idle: + Filename: v30.des + damaged-idle: + Filename: v30.des Start: 2 v31: - Defaults: - AddExtension: false - idle: v31.des - damaged-idle: v31.des + idle: + Filename: v31.des + damaged-idle: + Filename: v31.des Start: 1 v32: - Defaults: - AddExtension: false - idle: v32.des - damaged-idle: v32.des + idle: + Filename: v32.des + damaged-idle: + Filename: v32.des Start: 1 v33: - Defaults: - AddExtension: false - idle: v33.des - damaged-idle: v33.des + idle: + Filename: v33.des + damaged-idle: + Filename: v33.des Start: 1 v34: - Defaults: - AddExtension: false - idle: v34.des - damaged-idle: v34.des + idle: + Filename: v34.des + damaged-idle: + Filename: v34.des Start: 1 v35: - Defaults: - AddExtension: false - idle: v35.des - damaged-idle: v35.des + idle: + Filename: v35.des + damaged-idle: + Filename: v35.des Start: 1 v36: - Defaults: - AddExtension: false - idle: v36.des - damaged-idle: v36.des + idle: + Filename: v36.des + damaged-idle: + Filename: v36.des Start: 1 v37: - Defaults: - AddExtension: false - idle: v37.des - damaged-idle: v37.des + idle: + Filename: v37.des + damaged-idle: + Filename: v37.des Start: 1 rice: - Defaults: - AddExtension: false - idle: rice.tem + idle: + Filename: rice.tem ZOffset: -512 - damaged-idle: rice.tem + damaged-idle: + Filename: rice.tem Start: 1 ZOffset: -512 utilpol1: - idle: utilpol1 - damaged-idle: utilpol1 + idle: + Filename: utilpol1.shp + damaged-idle: + Filename: utilpol1.shp Start: 1 - dead: utilpol1 + dead: + Filename: utilpol1.shp Start: 1 utilpol2: - idle: utilpol2 - damaged-idle: utilpol2 + idle: + Filename: utilpol2.shp + damaged-idle: + Filename: utilpol2.shp Start: 1 - dead: utilpol2 + dead: + Filename: utilpol2.shp Start: 1 ammobox1: - idle: ammobox1 + idle: + Filename: ammobox1.shp ammobox2: - idle: ammobox2 + idle: + Filename: ammobox2.shp ammobox3: - idle: ammobox3 + idle: + Filename: ammobox3.shp tanktrap1: - idle: tanktrap1 + idle: + Filename: tanktrap1.shp tanktrap2: - idle: tanktrap2 + idle: + Filename: tanktrap2.shp rushouse: - idle: rushouse - damaged-idle: rushouse + idle: + Filename: rushouse.shp + damaged-idle: + Filename: rushouse.shp Start: 1 rushouse2: - idle: rushouse2 - damaged-idle: rushouse + idle: + Filename: rushouse2.shp + damaged-idle: + Filename: rushouse2.shp Start: 1 rushouse3: - idle: rushouse3 - damaged-idle: rushouse + idle: + Filename: rushouse3.shp + damaged-idle: + Filename: rushouse3.shp Start: 1 rushouse4: - idle: rushouse4 - damaged-idle: rushouse + idle: + Filename: rushouse4.shp + damaged-idle: + Filename: rushouse4.shp Start: 1 asianhut: - idle: asianhut - damaged-idle: asianhut + idle: + Filename: asianhut.shp + damaged-idle: + Filename: asianhut.shp Start: 1 barb: - idle: barb + idle: + Filename: barb.shp Length: 16 - damaged-idle: barb + damaged-idle: + Filename: barb.shp Start: 16 Length: 16 wood: - idle: wood + idle: + Filename: wood.shp Length: 16 - damaged-idle: wood + damaged-idle: + Filename: wood.shp Start: 16 Length: 16 barl: - idle: barl + idle: + Filename: barl.shp brl3: - idle: brl3 + idle: + Filename: brl3.shp boxes01: - idle: boxes01.int - AddExtension: false + idle: + Filename: boxes01.int boxes02: - idle: boxes02.int - AddExtension: false + idle: + Filename: boxes02.int boxes03: - idle: boxes03.int - AddExtension: false + idle: + Filename: boxes03.int boxes04: - idle: boxes04.int - AddExtension: false + idle: + Filename: boxes04.int boxes05: - idle: boxes05.int - AddExtension: false + idle: + Filename: boxes05.int boxes06: - idle: boxes06.int - AddExtension: false + idle: + Filename: boxes06.int boxes07: - idle: boxes07.int - AddExtension: false + idle: + Filename: boxes07.int boxes08: - idle: boxes08.int - AddExtension: false + idle: + Filename: boxes08.int boxes09: - idle: boxes09.int - AddExtension: false + idle: + Filename: boxes09.int rock1: idle: - UseTilesetExtension: true - TilesetOverrides: - SNOW: TEMPERAT - WINTER: TEMPERAT - JUNGLE: TEMPERAT - BARREN: TEMPERAT - INTERIOR: TEMPERAT + Filename: rock1.tem + TilesetFilenames: + DESERT: rock1.des rock2: idle: - UseTilesetExtension: true - TilesetOverrides: - SNOW: TEMPERAT - WINTER: TEMPERAT - JUNGLE: TEMPERAT - BARREN: TEMPERAT - INTERIOR: TEMPERAT + Filename: rock2.tem + TilesetFilenames: + DESERT: rock2.des rock3: idle: - UseTilesetExtension: true - TilesetOverrides: - SNOW: TEMPERAT - WINTER: TEMPERAT - JUNGLE: TEMPERAT - BARREN: TEMPERAT - INTERIOR: TEMPERAT + Filename: rock3.tem + TilesetFilenames: + DESERT: rock3.des rock4: idle: - UseTilesetExtension: true - TilesetOverrides: - SNOW: TEMPERAT - WINTER: TEMPERAT - JUNGLE: TEMPERAT - BARREN: TEMPERAT - INTERIOR: TEMPERAT + Filename: rock4.tem + TilesetFilenames: + DESERT: rock4.des rock5: idle: - UseTilesetExtension: true - TilesetOverrides: - SNOW: TEMPERAT - WINTER: TEMPERAT - JUNGLE: TEMPERAT - BARREN: TEMPERAT - INTERIOR: TEMPERAT + Filename: rock5.tem + TilesetFilenames: + DESERT: rock5.des rock6: idle: - UseTilesetExtension: true - TilesetOverrides: - SNOW: TEMPERAT - WINTER: TEMPERAT - JUNGLE: TEMPERAT - BARREN: TEMPERAT - INTERIOR: TEMPERAT + Filename: rock6.tem + TilesetFilenames: + DESERT: rock6.des rock7: idle: - UseTilesetExtension: true - TilesetOverrides: - SNOW: TEMPERAT - WINTER: TEMPERAT - JUNGLE: TEMPERAT - BARREN: TEMPERAT - INTERIOR: TEMPERAT + Filename: rock7.tem + TilesetFilenames: + DESERT: rock7.des snowhut: - idle: snowhut + idle: + Filename: snowhut.shp Length: 3 Tick: 360 - damaged-idle: snowhut + damaged-idle: + Filename: snowhut.shp Start: 3 Tick: 120 lhus: Defaults: Offset: 0,-16 - idle: lhus + idle: + Filename: lhus.shp Length: 16 Tick: 180 - damaged-idle: lhus + damaged-idle: + Filename: lhus.shp Start: 16 Tick: 180 Length: 8 @@ -1073,188 +1227,277 @@ lhus: windmill: Defaults: Offset: 0,-16 - idle: windmill + idle: + Filename: windmill.shp Length: 8 Tick: 80 - damaged-idle: windmill + damaged-idle: + Filename: windmill.shp Start: 8 Length: 8 Tick: 80 v01.husk: - Defaults: - UseTilesetExtension: true - TilesetOverrides: - DESERT: TEMPERAT - INTERIOR: TEMPERAT - idle: v01 - UseTilesetExtension: true + idle: + Filename: v01.tem + TilesetFilenames: + SNOW: v01.sno + JUNGLE: v01.jun + WINTER: v01.win + BARREN: v01.bar v02.husk: - Defaults: - UseTilesetExtension: true - TilesetOverrides: - DESERT: TEMPERAT - INTERIOR: TEMPERAT - idle: v02 - UseTilesetExtension: true + idle: + Filename: v02.tem + TilesetFilenames: + SNOW: v02.sno + JUNGLE: v02.jun + WINTER: v02.win + BARREN: v02.bar v03.husk: - Defaults: - UseTilesetExtension: true - TilesetOverrides: - DESERT: TEMPERAT - INTERIOR: TEMPERAT - idle: v03 - UseTilesetExtension: true + idle: + Filename: v03.tem + TilesetFilenames: + SNOW: v03.sno + JUNGLE: v03.jun + WINTER: v03.win + BARREN: v03.bar v04.husk: - Defaults: - UseTilesetExtension: true - TilesetOverrides: - DESERT: TEMPERAT - INTERIOR: TEMPERAT - idle: v04 - UseTilesetExtension: true + idle: + Filename: v04.tem + TilesetFilenames: + SNOW: v04.sno + JUNGLE: v04.jun + WINTER: v04.win + BARREN: v04.bar v05.husk: - Defaults: - UseTilesetExtension: true - TilesetOverrides: - DESERT: TEMPERAT - INTERIOR: TEMPERAT - idle: v05 - UseTilesetExtension: true + idle: + Filename: v05.tem + TilesetFilenames: + SNOW: v05.sno + JUNGLE: v05.jun + WINTER: v05.win + BARREN: v05.bar v06.husk: - Defaults: - UseTilesetExtension: true - TilesetOverrides: - DESERT: TEMPERAT - INTERIOR: TEMPERAT - idle: v06 - UseTilesetExtension: true + idle: + Filename: v06.tem + TilesetFilenames: + SNOW: v06.sno + JUNGLE: v06.jun + WINTER: v06.win + BARREN: v06.bar v07.husk: - Defaults: - UseTilesetExtension: true - TilesetOverrides: - DESERT: TEMPERAT - INTERIOR: TEMPERAT - idle: v07 - UseTilesetExtension: true + idle: + Filename: v07.tem + TilesetFilenames: + SNOW: v07.sno + JUNGLE: v07.jun + WINTER: v07.win + BARREN: v07.bar v08.husk: - Defaults: - UseTilesetExtension: true - TilesetOverrides: - DESERT: TEMPERAT - INTERIOR: TEMPERAT - idle: v08 - UseTilesetExtension: true + idle: + Filename: v08.tem + TilesetFilenames: + SNOW: v08.sno + JUNGLE: v08.jun + WINTER: v08.win + BARREN: v08.bar v09.husk: - Defaults: - UseTilesetExtension: true - TilesetOverrides: - DESERT: TEMPERAT - INTERIOR: TEMPERAT - idle: v09 - UseTilesetExtension: true + idle: + Filename: v09.tem + TilesetFilenames: + SNOW: v09.sno + JUNGLE: v09.jun + WINTER: v09.win + BARREN: v09.bar v10.husk: - Defaults: - UseTilesetExtension: true - TilesetOverrides: - DESERT: TEMPERAT - INTERIOR: TEMPERAT - idle: v10 - UseTilesetExtension: true + idle: + Filename: v10.tem + TilesetFilenames: + SNOW: v10.sno + JUNGLE: v10.jun + WINTER: v10.win + BARREN: v10.bar v11.husk: - Defaults: - UseTilesetExtension: true - TilesetOverrides: - DESERT: TEMPERAT - INTERIOR: TEMPERAT - idle: v11 - UseTilesetExtension: true + idle: + Filename: v11.tem + TilesetFilenames: + SNOW: v11.sno + JUNGLE: v11.jun + WINTER: v11.win + BARREN: v11.bar v12.husk: - Defaults: - UseTilesetExtension: true - TilesetOverrides: - DESERT: TEMPERAT - INTERIOR: TEMPERAT - idle: v12 + idle: + Filename: v12.tem + TilesetFilenames: + SNOW: v12.sno + JUNGLE: v12.jun + WINTER: v12.win + BARREN: v12.bar ZOffset: -512 - UseTilesetExtension: true v13.husk: - Defaults: - UseTilesetExtension: true - TilesetOverrides: - DESERT: TEMPERAT - INTERIOR: TEMPERAT - idle: v13 + idle: + Filename: v13.tem + TilesetFilenames: + SNOW: v13.sno + JUNGLE: v13.jun + WINTER: v13.win + BARREN: v13.bar ZOffset: -512 - UseTilesetExtension: true v14.husk: - Defaults: - UseTilesetExtension: true - TilesetOverrides: - DESERT: TEMPERAT - INTERIOR: TEMPERAT - idle: v14 + idle: + Filename: v14.tem + TilesetFilenames: + SNOW: v14.sno + JUNGLE: v14.jun + WINTER: v14.win + BARREN: v14.bar ZOffset: -512 - UseTilesetExtension: true v15.husk: - Defaults: - UseTilesetExtension: true - TilesetOverrides: - DESERT: TEMPERAT - INTERIOR: TEMPERAT - idle: v15 + idle: + Filename: v15.tem + TilesetFilenames: + SNOW: v15.sno + JUNGLE: v15.jun + WINTER: v15.win + BARREN: v15.bar ZOffset: -512 - UseTilesetExtension: true v16.husk: - Defaults: - UseTilesetExtension: true - TilesetOverrides: - DESERT: TEMPERAT - INTERIOR: TEMPERAT - idle: v16 + idle: + Filename: v16.tem + TilesetFilenames: + SNOW: v16.sno + JUNGLE: v16.jun + WINTER: v16.win + BARREN: v16.bar ZOffset: -512 - UseTilesetExtension: true v17.husk: - Defaults: - UseTilesetExtension: true - TilesetOverrides: - DESERT: TEMPERAT - INTERIOR: TEMPERAT - idle: v17 + idle: + Filename: v17.tem + TilesetFilenames: + SNOW: v17.sno + JUNGLE: v17.jun + WINTER: v17.win + BARREN: v17.bar ZOffset: -512 - UseTilesetExtension: true v18.husk: - Defaults: - UseTilesetExtension: true - TilesetOverrides: - DESERT: TEMPERAT - INTERIOR: TEMPERAT - idle: v18 + idle: + Filename: v18.tem + TilesetFilenames: + SNOW: v18.sno + JUNGLE: v18.jun + WINTER: v18.win + BARREN: v18.bar ZOffset: -512 - UseTilesetExtension: true arco: - idle: arco - damaged-idle: arco + idle: + Filename: arco.shp + damaged-idle: + Filename: arco.shp Start: 1 arco.husk: - idle: arco - Start: 1 \ No newline at end of file + idle: + Filename: arco.shp + Start: 1 + +scrinflora1: + Defaults: + Filename: scrinflora1.shp + idle: + Offset: 2, -10 + +scrinflora2: + Defaults: + Filename: scrinflora2.shp + idle: + Offset: -5, -12 + +scrinflora3: + Defaults: + Filename: scrinflora3.shp + idle: + Offset: 2, -12 + +scrinflora4: + Defaults: + Filename: scrinflora4.shp + idle: + Offset: 3, -11 + +scrinflora5: + Defaults: + Filename: scrinflora5.shp + idle: + Offset: 4, -11 + +scrinflora6: + Defaults: + Filename: scrinflora6.shp + idle: + Offset: 2, -15 + +scrinflora7: + Defaults: + Filename: scrinflora7.shp + idle: + Offset: -5, -15 + +scrinflora8: + Defaults: + Filename: scrinflora8.shp + idle: + Offset: 2, -12 + +scrinflora9: + Defaults: + Filename: scrinflora9.shp + idle: + Offset: 0, 0 + +scrinflora10: + Defaults: + Filename: scrinflora10.shp + idle: + Offset: 0, 0 + +scrinflora11: + Defaults: + Filename: scrinflora11.shp + idle: + Offset: 0, 0 + +scrinflora12: + Defaults: + Filename: scrinflora12.shp + idle: + Offset: 0, -4 + +scrinflora13: + Defaults: + Filename: scrinflora13.shp + idle: + Offset: 0, -4 + +scrinflora14: + Defaults: + Filename: scrinflora14.shp + idle: + Offset: 2, -4 diff --git a/mods/ca/sequences/infantry.yaml b/mods/ca/sequences/infantry.yaml index 8660701ab0..c761a62ff1 100644 --- a/mods/ca/sequences/infantry.yaml +++ b/mods/ca/sequences/infantry.yaml @@ -1,38 +1,38 @@ ^CommonDeaths: - die6: electroTD - Length: * - UseTilesetExtension: true - TilesetOverrides: - DESERT: TEMPERAT - INTERIOR: TEMPERAT - SNOW: TEMPERAT - JUNGLE: TEMPERAT - WINTER: TEMPERAT - DUNE: TEMPERAT - die8: chronozapTD + die6: + Filename: electroTD.tem + TilesetFilenames: + BARREN: electroTD.bar + Length: * + die8: + Filename: chronozapTD.shp Length: * BlendMode: Alpha - die9: poisonTD + die9: + Filename: poisonTD.shp Length: * - die10: poisonTD + die10: + Filename: poisonTD.shp Length: * - die11: frozen + die11: + Filename: frozen.shp Length: * Tick: 80 - die12: atomized + die12: + Filename: atomized.shp Length: * Tick: 80 BlendMode: Additive - die-crushed: corpse1 + die-crushed: + Filename: corpse1.tem + TilesetFilenames: + SNOW: corpse1.sno + BARREN: corpse1.bar Length: 6 Tick: 1600 ZOffset: -511 - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - JUNGLE: TEMPERAT - WINTER: TEMPERAT - mind-overlay: mindanim + mind-overlay: + Filename: mindanim.shp Length: * Tick: 200 BlendMode: Alpha @@ -40,1165 +40,1698 @@ e1: Inherits: ^CommonDeaths - stand: n1 + stand: + Filename: n1.shp Facings: 8 - stand2: n1 + stand2: + Filename: n1.shp Start: 8 Facings: 8 - run: n1 + run: + Filename: n1.shp Start: 16 Length: 6 Facings: 8 Tick: 100 - shoot: n1 + shoot: + Filename: n1.shp Start: 64 Length: 8 Facings: 8 - prone-stand: n1 + prone-stand: + Filename: n1.shp Start: 144 Stride: 4 Facings: 8 - prone-stand2: n1 + prone-stand2: + Filename: n1.shp Start: 144 Stride: 4 Facings: 8 - prone-run: n1 + prone-run: + Filename: n1.shp Start: 144 Length: 4 Facings: 8 Tick: 100 - liedown: n1 + liedown: + Filename: n1.shp Start: 128 Length: 2 Facings: 8 - standup: n1 + standup: + Filename: n1.shp Start: 176 Length: 2 Facings: 8 - prone-shoot: n1 + prone-shoot: + Filename: n1.shp Start: 192 Length: 8 Facings: 8 - idle1: n1 + parachute: + Filename: n1.shp + Start: 471 + idle1: + Filename: n1.shp Start: 257 Length: 15 Tick: 120 - idle2: n1 + idle2: + Filename: n1.shp Start: 272 Length: 16 Tick: 120 - idle3: n1 + idle3: + Filename: n1.shp Start: 289 Length: 22 Tick: 120 - cheer: n1 + cheer: + Filename: n1.shp Start: 460 Length: 3 Facings: 8 Tick: 120 - idle4: n1 + idle4: + Filename: n1.shp Start: 517 Length: 9 Tick: 120 - die1: n1 + die1: + Filename: n1.shp Start: 381 Length: 9 Tick: 80 - die2: n1 + die2: + Filename: n1.shp Start: 390 Length: 8 Tick: 80 - die3: n1 + die3: + Filename: n1.shp Start: 398 Length: 8 Tick: 80 - die4: n1 + die4: + Filename: n1.shp Start: 406 Length: 12 Tick: 80 - die5: n1 + die5: + Filename: n1.shp Start: 418 Length: 18 Tick: 80 - die7: n1 + die7: + Filename: n1.shp Start: 366 Length: 11 Tick: 80 - garrison-muzzle: minigun16 + garrison-muzzle: + Filename: minigun16.shp Length: 6 Facings: 16 - chrono-overlay: chronofade_small + chrono-overlay: + Filename: chronofade_small.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 Tick: 80 - icon: e1icon + icon: + Filename: e1icon.shp e2: Inherits: ^CommonDeaths - stand: n2 + stand: + Filename: n2.shp Facings: 8 - stand2: n2 + stand2: + Filename: n2.shp Start: 8 Facings: 8 - run: n2 + run: + Filename: n2.shp Start: 16 Length: 6 Facings: 8 Tick: 100 - throw: n2 + throw: + Filename: n2.shp Start: 64 Length: 20 Facings: 8 - liedown: n2 + liedown: + Filename: n2.shp Start: 224 Length: 2 Facings: 8 - standup: n2 + standup: + Filename: n2.shp Start: 272 Length: 2 Facings: 8 - prone-stand: n2 + prone-stand: + Filename: n2.shp Start: 240 Stride: 4 Facings: 8 - prone-stand2: n2 + prone-stand2: + Filename: n2.shp Start: 240 Stride: 4 Facings: 8 - prone-run: n2 + prone-run: + Filename: n2.shp Start: 240 Length: 4 Facings: 8 Tick: 100 - prone-throw: n2 + prone-throw: + Filename: n2.shp Start: 288 Length: 12 Facings: 8 - idle1: n2 + parachute: + Filename: n2.shp + Start: 599 + idle1: + Filename: n2.shp Start: 384 Length: 16 Tick: 120 - idle2: n2 + idle2: + Filename: n2.shp Start: 400 Length: 13 Tick: 120 - cheer: n2 + cheer: + Filename: n2.shp Start: 588 Length: 3 Facings: 8 Tick: 120 - die1: n2 + die1: + Filename: n2.shp Start: 509 Length: 9 Tick: 80 - die2: n2 + die2: + Filename: n2.shp Start: 518 Length: 8 Tick: 80 - die3: n2 + die3: + Filename: n2.shp Start: 526 Length: 8 Tick: 80 - die4: n2 + die4: + Filename: n2.shp Start: 534 Length: 12 Tick: 80 - die5: n2 + die5: + Filename: n2.shp Start: 546 Length: 18 Tick: 80 - die7: n2 + die7: + Filename: n2.shp Start: 494 Length: 11 Tick: 80 - chrono-overlay: chronofade_small + chrono-overlay: + Filename: chronofade_small.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 Tick: 80 - icon: e2icon + icon: + Filename: e2icon.shp e3: Inherits: ^CommonDeaths - stand: n3 + stand: + Filename: n3.shp Facings: 8 - stand2: n3 + stand2: + Filename: n3.shp Start: 8 Facings: 8 - run: n3 + run: + Filename: n3.shp Start: 16 Length: 6 Facings: 8 Tick: 100 - shoot: n3 + shoot: + Filename: n3.shp Start: 64 Length: 8 Facings: 8 - liedown: n3 + liedown: + Filename: n3.shp Start: 128 Length: 2 Facings: 8 - standup: n3 + standup: + Filename: n3.shp Start: 176 Length: 2 Facings: 8 - prone-stand: n3 + prone-stand: + Filename: n3.shp Start: 144 Stride: 4 Facings: 8 - prone-stand2: n3 + prone-stand2: + Filename: n3.shp Start: 144 Stride: 4 Facings: 8 - prone-run: n3 + prone-run: + Filename: n3.shp Start: 144 Length: 4 Facings: 8 Tick: 100 - prone-shoot: n3 + prone-shoot: + Filename: n3.shp Start: 192 Length: 10 Facings: 8 - idle1: n3 + parachute: + Filename: n3.shp + Start: 487 + idle1: + Filename: n3.shp Start: 274 Length: 12 Tick: 120 - idle2: n3 + idle2: + Filename: n3.shp Start: 289 Length: 14 Tick: 120 - cheer: n3 + cheer: + Filename: n3.shp Start: 476 Length: 3 Facings: 8 Tick: 120 - die1: n3 + die1: + Filename: n3.shp Start: 397 Length: 9 Tick: 80 - die2: n3 + die2: + Filename: n3.shp Start: 406 Length: 8 Tick: 80 - die3: n3 + die3: + Filename: n3.shp Start: 414 Length: 8 Tick: 80 - die4: n3 + die4: + Filename: n3.shp Start: 422 Length: 12 Tick: 80 - die5: n3 + die5: + Filename: n3.shp Start: 434 Length: 18 Tick: 80 - die7: n3 + die7: + Filename: n3.shp Start: 382 Length: 11 Tick: 80 - chrono-overlay: chronofade_small + chrono-overlay: + Filename: chronofade_small.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 Tick: 80 - stand-cryo: e3cr + stand-cryo: + Filename: e3cr.shp Facings: 8 - stand-cryo2: e3cr + stand-cryo2: + Filename: e3cr.shp Start: 8 Facings: 8 - run-cryo: e3cr + run-cryo: + Filename: e3cr.shp Start: 16 Length: 6 Facings: 8 Tick: 100 - shoot-cryo: e3cr + shoot-cryo: + Filename: e3cr.shp Start: 64 Length: 8 Facings: 8 - liedown-cryo: e3cr + liedown-cryo: + Filename: e3cr.shp Start: 128 Length: 2 Facings: 8 - standup-cryo: e3cr + standup-cryo: + Filename: e3cr.shp Start: 176 Length: 2 Facings: 8 - prone-stand-cryo: e3cr + prone-stand-cryo: + Filename: e3cr.shp Start: 144 Stride: 4 Facings: 8 - prone-stand-cryo2: e3cr + prone-stand-cryo2: + Filename: e3cr.shp Start: 144 Stride: 4 Facings: 8 - prone-run-cryo: e3cr + prone-run-cryo: + Filename: e3cr.shp Start: 144 Length: 4 Facings: 8 Tick: 100 - prone-shoot-cryo: e3cr + prone-shoot-cryo: + Filename: e3cr.shp Start: 192 Length: 10 Facings: 8 - idle-cryo1: e3cr + idle-cryo1: + Filename: e3cr.shp Start: 274 Length: 12 Tick: 120 - idle-cryo2: e3cr + idle-cryo2: + Filename: e3cr.shp Start: 289 Length: 14 Tick: 120 - cheer-cryo: e3cr + cheer-cryo: + Filename: e3cr.shp Start: 476 Length: 3 Facings: 8 Tick: 120 - die-cryo1: e3cr + die-cryo1: + Filename: e3cr.shp Start: 397 Length: 9 Tick: 80 - die-cryo2: e3cr + die-cryo2: + Filename: e3cr.shp Start: 406 Length: 8 Tick: 80 - die-cryo3: e3cr + die-cryo3: + Filename: e3cr.shp Start: 414 Length: 8 Tick: 80 - die-cryo4: e3cr + die-cryo4: + Filename: e3cr.shp Start: 422 Length: 12 Tick: 80 - die-cryo5: e3cr + die-cryo5: + Filename: e3cr.shp Start: 434 Length: 18 Tick: 80 - die-cryo7: e3cr + die-cryo7: + Filename: e3cr.shp Start: 382 Length: 11 Tick: 80 - die-cryo6: electroTD + die-cryo6: + Filename: electroTD.tem + TilesetFilenames: + BARREN: electroTD.bar Length: * - UseTilesetExtension: true - TilesetOverrides: - DESERT: TEMPERAT - INTERIOR: TEMPERAT - SNOW: TEMPERAT - JUNGLE: TEMPERAT - WINTER: TEMPERAT - DUNE: TEMPERAT - die-cryo8: chronozapTD + die-cryo8: + Filename: chronozapTD.shp Length: * BlendMode: Alpha - die-cryo9: poisonTD + die-cryo9: + Filename: poisonTD.shp + Length: * + die-cryo10: + Filename: poisonTD.shp + Length: * + die-cryo11: + Filename: frozen.shp Length: * - die-cryo10: poisonTD + Tick: 80 + icon: + Filename: e3icon.shp + +u3: + Inherits: ^CommonDeaths + stand: + Filename: u3.shp + Facings: 8 + stand2: + Filename: u3.shp + Start: 8 + Facings: 8 + run: + Filename: u3.shp + Start: 16 + Length: 6 + Facings: 8 + Tick: 100 + shoot: + Filename: u3.shp + Start: 64 + Length: 8 + Facings: 8 + liedown: + Filename: u3.shp + Start: 128 + Length: 2 + Facings: 8 + standup: + Filename: u3.shp + Start: 176 + Length: 2 + Facings: 8 + prone-stand: + Filename: u3.shp + Start: 144 + Stride: 4 + Facings: 8 + prone-stand2: + Filename: u3.shp + Start: 144 + Stride: 4 + Facings: 8 + prone-run: + Filename: u3.shp + Start: 144 + Length: 4 + Facings: 8 + Tick: 100 + prone-shoot: + Filename: u3.shp + Start: 192 + Length: 8 + Facings: 8 + parachute: + Filename: u3.shp + Start: 494 + idle1: + Filename: u3.shp + Start: 256 + Length: 16 + Tick: 120 + idle2: + Filename: u3.shp + Start: 272 + Length: 16 + Tick: 120 + cheer: + Filename: u3.shp + Start: 436 + Length: 3 + Facings: 8 + Tick: 120 + die1: + Filename: u3.shp + Start: 381 + Length: 9 + Tick: 80 + die2: + Filename: u3.shp + Start: 390 + Length: 8 + Tick: 80 + die3: + Filename: u3.shp + Start: 398 + Length: 8 + Tick: 80 + die4: + Filename: u3.shp + Start: 406 + Length: 12 + Tick: 80 + die5: + Filename: u3.shp + Start: 418 + Length: 18 + Tick: 80 + die7: + Filename: u3.shp + Start: 367 + Length: 10 + Tick: 80 + deployed: + Filename: u3bunker.shp + Frames: 0, 9, 16, 24, 32, 40, 48, 56 + Facings: 8 + deploy-shoot: + Filename: u3bunker.shp + Length: 8 + Facings: 8 + deployedcr: + Filename: u3bunkercr.shp + Frames: 0, 9, 16, 24, 32, 40, 48, 56 + Facings: 8 + deploy-shootcr: + Filename: u3bunkercr.shp + Length: 8 + Facings: 8 + deploy: + Filename: u3make.shp Length: * - die-cryo11: frozen + empty: + Filename: empty.shp + chrono-overlay: + Filename: chronofade_small.shp Length: * + BlendMode: Additive + Offset: 0, 0 + ZOffset: 512 Tick: 80 - icon: e3icon + icon: + Filename: u3icon.shp e4: Inherits: ^CommonDeaths - stand: n4 + stand: + Filename: n4.shp Facings: 8 - stand2: n4 + stand2: + Filename: n4.shp Start: 8 Facings: 8 - run: n4 + run: + Filename: n4.shp Start: 16 Length: 6 Facings: 8 Tick: 100 - shoot: n4 + shoot: + Filename: n4.shp Start: 64 Length: 16 Facings: 8 - liedown: n4 + liedown: + Filename: n4.shp Start: 192 Length: 2 Facings: 8 - standup: n4 + standup: + Filename: n4.shp Start: 240 Length: 2 Facings: 8 - prone-stand: n4 + prone-stand: + Filename: n4.shp Start: 208 Stride: 4 Facings: 8 - prone-stand2: n4 + prone-stand2: + Filename: n4.shp Start: 208 Stride: 4 Facings: 8 - prone-run: n4 + prone-run: + Filename: n4.shp Start: 208 Length: 4 Facings: 8 Tick: 100 - prone-shoot: n4 + prone-shoot: + Filename: n4.shp Start: 256 Length: 16 Facings: 8 - idle1: n4 + parachute: + Filename: n4.shp + Start: 599 + idle1: + Filename: n4.shp Start: 384 Length: 16 Tick: 120 - idle2: n4 + idle2: + Filename: n4.shp Start: 400 Length: 16 Tick: 120 - cheer: n4 + cheer: + Filename: n4.shp Start: 588 Length: 3 Facings: 8 Tick: 120 - die1: n4 + die1: + Filename: n4.shp Start: 509 Length: 9 Tick: 80 - die2: n4 + die2: + Filename: n4.shp Start: 518 Length: 8 Tick: 80 - die3: n4 + die3: + Filename: n4.shp Start: 526 Length: 8 Tick: 80 - die4: n4 + die4: + Filename: n4.shp Start: 534 Length: 12 Tick: 80 - die5: n4 + die5: + Filename: n4.shp Start: 546 Length: 18 Tick: 80 - die7: n4 + die7: + Filename: n4.shp Start: 494 Length: 10 Tick: 80 muzzle: Combine: - flame-n: + 0: + Filename: flame-n.shp Length: * Offset: 1,6 - flame-nw: + 1: + Filename: flame-nw.shp Length: * Offset: 8,7 - flame-w: + 2: + Filename: flame-w.shp Length: * Offset: 8,2 - flame-sw: + 3: + Filename: flame-sw.shp Length: * Offset: 7,-2 - flame-s: + 4: + Filename: flame-s.shp Length: * Offset: 1,-2 - flame-se: + 5: + Filename: flame-se.shp Length: * Offset: -5,-2 - flame-e: + 6: + Filename: flame-e.shp Length: * Offset: -7,2 - flame-ne: + 7: + Filename: flame-ne.shp Length: * Offset: -7,8 Facings: 8 Length: 13 - chrono-overlay: chronofade_small + InterpolatedFacings: 16 + chrono-overlay: + Filename: chronofade_small.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 Tick: 80 - icon: e4icon + icon: + Filename: e4icon.shp e6: Inherits: ^CommonDeaths - stand: n6 + stand: + Filename: n6.shp Facings: 8 - stand2: n6 + stand2: + Filename: n6.shp Start: 8 Facings: 8 - run: n6 + run: + Filename: n6.shp Start: 16 Length: 6 Facings: 8 Tick: 100 - idle1: n6 + parachute: + Filename: n6.shp + Start: 210 + idle1: + Filename: n6.shp Start: 121 Length: 8 Tick: 120 - idle2: n6 + idle2: + Filename: n6.shp Start: 130 Length: 14 Tick: 120 - die1: n6 + die1: + Filename: n6.shp Start: 146 Length: 8 - die2: n6 + die2: + Filename: n6.shp Start: 154 Length: 8 - die3: n6 + die3: + Filename: n6.shp Start: 162 Length: 8 - die4: n6 + die4: + Filename: n6.shp Start: 170 Length: 12 - die5: n6 + die5: + Filename: n6.shp Start: 182 Length: 18 - die7: n6 + die7: + Filename: n6.shp Start: 130 Length: 4 Tick: 80 - prone-stand: n6 + prone-stand: + Filename: n6.shp Start: 82 Stride: 4 Facings: 8 - prone-stand2: n6 + prone-stand2: + Filename: n6.shp Start: 82 Stride: 4 Facings: 8 - prone-run: n6 + prone-run: + Filename: n6.shp Start: 82 Length: 4 Facings: 8 Tick: 100 - chrono-overlay: chronofade_small + deploy: + Filename: n6deploy.shp + Length: 14 + Tick: 80 + idle-deployed-setup: + Filename: n6deploy.shp + Length: 2 + Start: 12 + Tick: 80 + idle-deployed: + Filename: n6deploy.shp + Length: 2 + Start: 14 + Tick: 80 + chrono-overlay: + Filename: chronofade_small.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 Tick: 80 - icon: e6icon + icon: + Filename: e6icon.shp e7: Inherits: ^CommonDeaths - stand: e7 + stand: + Filename: e7.shp Facings: 8 - run: e7 + run: + Filename: e7.shp Start: 8 Length: 6 Facings: 8 Tick: 80 - shoot: e7 + shoot: + Filename: e7.shp Start: 56 Length: 7 Facings: 8 - idle1: e7 + parachute: + Filename: e7.shp + Start: 3 + idle1: + Filename: e7.shp Start: 233 Length: 14 Tick: 120 - idle2: e7 + idle2: + Filename: e7.shp Start: 248 Length: 14 Tick: 120 - die1: e7 + die1: + Filename: e7.shp Start: 262 Length: 8 - die2: e7 + die2: + Filename: e7.shp Start: 270 Length: 8 - die3: e7 + die3: + Filename: e7.shp Start: 278 Length: 8 - die4: e7 + die4: + Filename: e7.shp Start: 286 Length: 12 - die5: e7 + die5: + Filename: e7.shp Start: 298 Length: 18 - die7: e7 + die7: + Filename: e7.shp Start: 262 Length: 8 - prone-stand: e7 + prone-stand: + Filename: e7.shp Start: 128 Stride: 4 Facings: 8 - prone-run: e7 + prone-run: + Filename: e7.shp Start: 128 Length: 4 Facings: 8 Tick: 80 - prone-shoot: e7 + prone-shoot: + Filename: e7.shp Start: 176 Length: 7 Facings: 8 - garrison-muzzle: minigun16 + garrison-muzzle: + Filename: minigun16.shp Length: 3 Stride: 6 Facings: 16 - chrono-overlay: chronofade_small + chrono-overlay: + Filename: chronofade_small.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 Tick: 80 - icon: e7icon + icon: + Filename: e7icon.shp medi: Inherits: ^CommonDeaths - stand: medi + stand: + Filename: medi.shp Facings: 8 - run: medi + run: + Filename: medi.shp Start: 8 Length: 6 Facings: 8 Tick: 100 - heal: medi + heal: + Filename: medi.shp Start: 56 Length: 58 Tick: 120 - standup: medi + standup: + Filename: medi.shp Start: 114 Length: 2 Facings: 8 - idle: medi + parachute: + Filename: medi.shp + Start: 3 + idle: + Filename: medi.shp Start: 178 Length: 14 Tick: 120 - die1: medi + die1: + Filename: medi.shp Start: 193 Length: 7 - die2: medi + die2: + Filename: medi.shp Start: 201 Length: 8 - die3: medi + die3: + Filename: medi.shp Start: 209 Length: 8 - die4: medi + die4: + Filename: medi.shp Start: 217 Length: 12 - die5: medi + die5: + Filename: medi.shp Start: 229 Length: 18 - die7: medi + die7: + Filename: medi.shp Start: 193 Length: 7 - prone-stand: medi + prone-stand: + Filename: medi.shp Start: 130 Stride: 4 Facings: 8 - prone-run: medi + prone-run: + Filename: medi.shp Start: 130 Length: 4 Facings: 8 Tick: 100 - chrono-overlay: chronofade_small + chrono-overlay: + Filename: chronofade_small.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 Tick: 80 - icon: mediicon + icon: + Filename: mediicon.shp mech: Inherits: ^CommonDeaths - stand: mech + stand: + Filename: mech.shp Facings: 8 - run: mech + run: + Filename: mech.shp Start: 8 Length: 6 Facings: 8 Tick: 100 - repair: mech + repair: + Filename: mech.shp Start: 56 Length: 58 Tick: 120 - standup: mech + standup: + Filename: mech.shp Start: 114 Length: 2 Facings: 8 - idle: mech + parachute: + Filename: mech.shp + Start: 3 + idle: + Filename: mech.shp Start: 178 Length: 14 Tick: 120 - die1: mech + die1: + Filename: mech.shp Start: 193 Length: 7 - die2: mech + die2: + Filename: mech.shp Start: 201 Length: 8 - die3: mech + die3: + Filename: mech.shp Start: 209 Length: 8 - die4: mech + die4: + Filename: mech.shp Start: 217 Length: 12 - die5: mech + die5: + Filename: mech.shp Start: 229 Length: 18 - die7: mech + die7: + Filename: mech.shp Start: 193 Length: 7 - prone-stand: mech + prone-stand: + Filename: mech.shp Start: 130 Stride: 4 Facings: 8 - prone-run: mech + prone-run: + Filename: mech.shp Start: 130 Length: 4 Facings: 8 Tick: 100 - chrono-overlay: chronofade_small + chrono-overlay: + Filename: chronofade_small.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 Tick: 80 - icon: mechicon + icon: + Filename: mechicon.shp hack: Inherits: ^CommonDeaths - stand: hack + stand: + Filename: hack.shp Facings: 8 - run: hack + run: + Filename: hack.shp Start: 8 Length: 6 Facings: 8 Tick: 100 - heal: hack + heal: + Filename: hack.shp Start: 56 Length: 58 Tick: 120 - standup: hack + standup: + Filename: hack.shp Start: 114 Length: 2 Facings: 8 - idle: hack + parachute: + Filename: hack.shp + Start: 3 + idle: + Filename: hack.shp Start: 178 Length: 14 Tick: 120 - die1: hack + die1: + Filename: hack.shp Start: 193 Length: 7 - die2: hack + die2: + Filename: hack.shp Start: 201 Length: 8 - die3: hack + die3: + Filename: hack.shp Start: 209 Length: 8 - die4: hack + die4: + Filename: hack.shp Start: 217 Length: 12 - die5: hack + die5: + Filename: hack.shp Start: 229 Length: 18 - die7: hack + die7: + Filename: hack.shp Start: 193 Length: 7 - prone-stand: hack + prone-stand: + Filename: hack.shp Start: 130 Stride: 4 Facings: 8 - prone-run: hack + prone-run: + Filename: hack.shp Start: 130 Length: 4 Facings: 8 Tick: 100 - make: hack + make: + Filename: hack.shp Start: 247 Length: 4 Tick: 100 - hack: hack + hack: + Filename: hack.shp Start: 250 Length: 9 Tick: 160 - chrono-overlay: chronofade_small + chrono-overlay: + Filename: chronofade_small.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 Tick: 80 - icon: mediicon + icon: + Filename: hackercellicon.shp dog: - stand: dog + Defaults: + Filename: dog.shp + stand: Facings: 8 - walk: dog + walk: Start: 8 Length: 6 Facings: 8 Tick: 80 - run: dog + run: Start: 56 Length: 6 Facings: 8 Tick: 80 - eat: dog + eat: Start: 104 Length: 14 Facings: 8 Tick: 120 - idle1: dog + idle1: Start: 216 Length: 7 Tick: 120 - idle2: dog + idle2: Start: 224 Length: 11 Tick: 120 - die1: dog + parachute: + Start: 3 + die1: Start: 236 Length: 6 - die2: dog + die2: Start: 242 Length: 9 - die3: dog + die3: Start: 236 Length: 6 - die4: dog + die4: Start: 242 Length: 9 - die5: dog + die5: Start: 251 Length: 14 - die6: electdog + die6: + Filename: electdog.shp Length: * - die7: dog + die7: Start: 236 Length: 6 - die8: chronozapTD + die8: + Filename: chronozapTD.shp Length: * BlendMode: Alpha - die9: dog + die9: Start: 236 Length: 6 - die10: dog + die10: Start: 236 Length: 6 - die11: dog + die11: Start: 236 Length: 6 - die12: dog + die12: Start: 236 Length: 6 - die-crushed: corpse1 + die-crushed: + Filename: corpse1.tem + TilesetFilenames: + SNOW: corpse1.sno + BARREN: corpse1.bar Length: 6 Tick: 1600 ZOffset: -511 - UseTilesetExtension: true - TilesetOverrides: - DESERT: TEMPERAT - INTERIOR: TEMPERAT - JUNGLE: TEMPERAT - WINTER: TEMPERAT - DUNE: TEMPERAT - jump: dogbullt + jump: + Filename: dogbullt.shp Length: 4 Facings: 8 - chrono-overlay: chronofade_small + chrono-overlay: + Filename: chronofade_small.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 Tick: 80 - mind-overlay: mindanim + mind-overlay: + Filename: mindanim.shp Length: * Tick: 200 BlendMode: Alpha Offset: 0, 0 - icon: dogicon + icon: + Filename: dogicon.shp + +tdog: + Inherits: dog + icon: + Filename: tdogicon.shp + +cdog: + Inherits: dog + Defaults: + Filename: cdog.shp + eat: + Tick: 60 + jump: + Filename: cdogbullt.shp + icon: + Filename: cdogicon.shp spy: Inherits: ^CommonDeaths - stand: spy + stand: + Filename: spy.shp Facings: 8 - stand2: spy + stand2: + Filename: spy.shp Start: 8 Facings: 8 - run: spy + run: + Filename: spy.shp Start: 16 Length: 6 Facings: 8 Tick: 100 - shoot: spy + shoot: + Filename: spy.shp Start: 64 Length: 8 Facings: 8 - idle1: spy + parachute: + Filename: spy.shp + Start: 3 + idle1: + Filename: spy.shp Start: 256 Length: 14 Tick: 120 - idle2: spy + idle2: + Filename: spy.shp Start: 271 Length: 16 Tick: 120 - die1: spy + die1: + Filename: spy.shp Start: 288 Length: 8 - die2: spy + die2: + Filename: spy.shp Start: 296 Length: 8 - die3: spy + die3: + Filename: spy.shp Start: 304 Length: 8 - die4: spy + die4: + Filename: spy.shp Start: 312 Length: 12 - die5: spy + die5: + Filename: spy.shp Start: 324 Length: 18 - die7: spy + die7: + Filename: spy.shp Start: 288 Length: 8 - prone-stand: spy + prone-stand: + Filename: spy.shp Start: 144 Stride: 4 Facings: 8 - prone-stand2: spy + prone-stand2: + Filename: spy.shp Start: 144 Stride: 4 Facings: 8 - prone-run: spy + prone-run: + Filename: spy.shp Start: 144 Length: 4 Facings: 8 Tick: 100 - prone-shoot: spy + prone-shoot: + Filename: spy.shp Start: 192 Length: 8 Facings: 8 - chrono-overlay: chronofade_small + chrono-overlay: + Filename: chronofade_small.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 Tick: 80 - mind-overlay: mindanim + mind-overlay: + Filename: mindanim.shp Length: * Tick: 200 BlendMode: Alpha Offset: 0, 0 - icon: spyicon + icon: + Filename: spyicon.shp thf: Inherits: ^CommonDeaths - stand: thf + stand: + Filename: thf.shp Facings: 8 - run: thf + run: + Filename: thf.shp Start: 8 Length: 6 Facings: 8 Tick: 100 - idle: thf + idle: + Filename: thf.shp Start: 120 Length: 19 Tick: 120 - die1: thf + parachute: + Filename: thf.shp + Start: 3 + die1: + Filename: thf.shp Start: 139 Length: 8 - die2: thf + die2: + Filename: thf.shp Start: 147 Length: 8 - die3: thf + die3: + Filename: thf.shp Start: 155 Length: 8 - die4: thf + die4: + Filename: thf.shp Start: 163 Length: 12 - die5: thf + die5: + Filename: thf.shp Start: 175 Length: 18 - die7: thf + die7: + Filename: thf.shp Start: 139 Length: 8 - prone-stand: thf + prone-stand: + Filename: thf.shp Start: 72 Stride: 4 Facings: 8 - prone-run: thf + prone-run: + Filename: thf.shp Start: 72 Length: 4 Facings: 8 Tick: 80 - chrono-overlay: chronofade_small + chrono-overlay: + Filename: chronofade_small.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 Tick: 80 - mind-overlay: mindanim + mind-overlay: + Filename: mindanim.shp Length: * Tick: 200 BlendMode: Alpha Offset: 0, 0 - icon: thficon + icon: + Filename: thficon.shp gnrl: Inherits: ^CommonDeaths - stand: gnrl + stand: + Filename: gnrl.shp Facings: 8 - run: gnrl + run: + Filename: gnrl.shp Start: 8 Length: 6 Facings: 8 Tick: 80 - shoot: gnrl + shoot: + Filename: gnrl.shp Start: 56 Length: 4 Facings: 8 - prone-stand: gnrl + prone-stand: + Filename: gnrl.shp Start: 104 Stride: 4 Facings: 8 - prone-run: gnrl + prone-run: + Filename: gnrl.shp Start: 104 Length: 4 Facings: 8 - standup-0: gnrl + standup-0: + Filename: gnrl.shp Start: 136 Length: 2 Facings: 8 - prone-shoot: gnrl + prone-shoot: + Filename: gnrl.shp Start: 152 Length: 4 Facings: 8 - idle1: gnrl + idle1: + Filename: gnrl.shp Start: 184 Length: 26 Tick: 120 - die1: gnrl + parachute: + Filename: gnrl.shp + Start: 3 + die1: + Filename: gnrl.shp Start: 210 Length: 8 - die2: gnrl + die2: + Filename: gnrl.shp Start: 218 Length: 8 - die3: gnrl + die3: + Filename: gnrl.shp Start: 226 Length: 8 - die4: gnrl + die4: + Filename: gnrl.shp Start: 234 Length: 12 - die5: gnrl + die5: + Filename: gnrl.shp Start: 246 Length: 18 - die7: gnrl + die7: + Filename: gnrl.shp Start: 210 Length: 8 - chrono-overlay: chronofade_small + chrono-overlay: + Filename: chronofade_small.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 Tick: 80 - mind-overlay: mindanim + mind-overlay: + Filename: mindanim.shp Length: * Tick: 200 BlendMode: Alpha Offset: 0, 0 - icon: borisicon + icon: + Filename: borisicon.shp shok: Inherits: ^CommonDeaths - stand: shok + stand: + Filename: shok.shp Facings: 8 - stand2: shok + stand2: + Filename: shok.shp Start: 8 Facings: 8 - run: shok + run: + Filename: shok.shp Start: 16 Length: 6 Facings: 8 Tick: 120 - shoot: shok + shoot: + Filename: shok.shp Start: 64 Length: 16 Facings: 8 - stand3: shok + stand3: + Filename: shok.shp Start: 192 Length: 16 - prone-stand: shok + prone-stand: + Filename: shok.shp Start: 208 Stride: 4 Facings: 8 - prone-stand2: shok + prone-stand2: + Filename: shok.shp Start: 208 Stride: 4 Facings: 8 - prone-run: shok + prone-run: + Filename: shok.shp Start: 208 Length: 4 Facings: 8 Tick: 120 - standup: shok + standup: + Filename: shok.shp Start: 240 Length: 2 Facings: 8 - prone-shoot: shok + prone-shoot: + Filename: shok.shp Start: 256 Length: 16 Facings: 8 - idle1: shok + parachute: + Filename: shok.shp + Start: 505 + idle1: + Filename: shok.shp Start: 384 Length: 14 Tick: 120 - idle2: shok + idle2: + Filename: shok.shp Start: 399 Length: 16 Tick: 120 - die1: shok + die1: + Filename: shok.shp Start: 416 Length: 8 - die2: shok + die2: + Filename: shok.shp Start: 424 Length: 8 - die3: shok + die3: + Filename: shok.shp Start: 432 Length: 8 - die4: shok + die4: + Filename: shok.shp Start: 440 Length: 12 - die5: shok + die5: + Filename: shok.shp Start: 452 Length: 18 - die7: shok + die7: + Filename: shok.shp Start: 416 Length: 8 - die-crushed: corpse1 + die-crushed: + Filename: corpse1.tem + TilesetFilenames: + SNOW: corpse1.sno + BARREN: corpse1.bar Length: 6 Tick: 1600 ZOffset: -511 - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - JUNGLE: TEMPERAT - WINTER: TEMPERAT - chrono-overlay: chronofade_small + chrono-overlay: + Filename: chronofade_small.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 Tick: 80 - mind-overlay: mindanim + mind-overlay: + Filename: mindanim.shp Length: * Tick: 200 BlendMode: Alpha Offset: 0, 0 - icon: shokicon + icon: + Filename: shokicon.shp +ttrp: + Inherits: ^CommonDeaths + stand: + Filename: ttrp.shp + Facings: 8 + stand2: + Filename: ttrp.shp + Start: 8 + Facings: 8 + run: + Filename: ttrp.shp + Start: 16 + Length: 6 + Facings: 8 + Tick: 120 + shoot: + Filename: ttrp.shp + Start: 64 + Length: 4 + Facings: 8 + Tick: 60 + parachute: + Filename: ttrp.shp + Start: 137 + idle1: + Filename: ttrp.shp + Start: 96 + Length: 8 + Tick: 160 + idle2: + Filename: ttrp.shp + Start: 104 + Length: 8 + Tick: 160 + die1: + Filename: ttrp.shp + Start: 111 + Length: 14 + Tick: 80 + die2: + Filename: ttrp.shp + Start: 125 + Length: 12 + die3: + Filename: ttrp.shp + Start: 125 + Length: 12 + die4: + Filename: ttrp.shp + Start: 125 + Length: 12 + die5: + Filename: ttrp.shp + Start: 125 + Length: 12 + die7: + Filename: ttrp.shp + Start: 125 + Length: 12 + chrono-overlay: + Filename: chronofade_small.shp + Length: * + BlendMode: Additive + Offset: 0, 0 + ZOffset: 512 + Tick: 80 + mind-overlay: + Filename: mindanim.shp + Length: * + Tick: 200 + BlendMode: Alpha + Offset: 0, 0 + icon: + Filename: ttrpicon.shp c1: Inherits: ^CommonDeaths + Defaults: + Filename: c1.shp stand: Facings: 8 panic-stand: @@ -1221,6 +1754,8 @@ c1: Length: 3 Facings: 8 Tick: 120 + parachute: + Start: 3 die1: Start: 329 Length: 8 @@ -1245,134 +1780,184 @@ c1: Start: 182 Length: 4 Tick: 80 - chrono-overlay: chronofade_small + chrono-overlay: + Filename: chronofade_small.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 Tick: 80 - mind-overlay: mindanim + mind-overlay: + Filename: mindanim.shp Length: * Tick: 200 BlendMode: Alpha Offset: 0, 0 + icon: + Filename: placeholdericon.shp c2: Inherits: c1 + Defaults: + Filename: c2.shp c3: Inherits: c1 + Defaults: + Filename: c3.shp c4: Inherits: c1 + Defaults: + Filename: c4.shp c5: Inherits: c1 + Defaults: + Filename: c5.shp c6: Inherits: c1 + Defaults: + Filename: c6.shp c7: Inherits: c1 + Defaults: + Filename: c7.shp c8: Inherits: c1 + Defaults: + Filename: c8.shp c9: Inherits: c1 + Defaults: + Filename: c9.shp c10: Inherits: c1 + Defaults: + Filename: c10.shp einstein: Inherits: ^CommonDeaths - stand: einstein + stand: + Filename: einstein.shp Facings: 8 - panic-run: einstein + panic-run: + Filename: einstein.shp Start: 8 Length: 6 Facings: 8 - panic-stand: einstein + panic-stand: + Filename: einstein.shp Facings: 8 - run: einstein + run: + Filename: einstein.shp Start: 56 Length: 6 Facings: 8 Tick: 80 - die1: einstein + parachute: + Filename: einstein.shp + Start: 3 + die1: + Filename: einstein.shp Start: 120 Length: 8 - die2: einstein + die2: + Filename: einstein.shp Start: 128 Length: 8 - die3: einstein + die3: + Filename: einstein.shp Start: 136 Length: 12 - die4: einstein + die4: + Filename: einstein.shp Start: 136 Length: 17 - die5: einstein + die5: + Filename: einstein.shp Start: 148 Length: 8 - die7: einstein + die7: + Filename: einstein.shp Start: 120 Length: 8 - chrono-overlay: chronofade_small + chrono-overlay: + Filename: chronofade_small.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 Tick: 80 - mind-overlay: mindanim + mind-overlay: + Filename: mindanim.shp Length: * Tick: 200 BlendMode: Alpha Offset: 0, 0 - icon: e1icon + icon: + Filename: e1icon.shp delphi: Inherits: ^CommonDeaths - stand: delphi + stand: + Filename: delphi.shp Facings: 8 - panic-run: delphi + panic-run: + Filename: delphi.shp Start: 8 Length: 6 Facings: 8 - panic-stand: delphi + panic-stand: + Filename: delphi.shp Facings: 8 - run: delphi + run: + Filename: delphi.shp Start: 56 Length: 6 Facings: 8 Tick: 80 - die1: delphi + parachute: + Filename: delphi.shp + Start: 3 + die1: + Filename: delphi.shp Start: 329 Length: 8 - die2: delphi + die2: + Filename: delphi.shp Start: 337 Length: 8 - die3: delphi + die3: + Filename: delphi.shp Start: 345 Length: 12 - die4: delphi + die4: + Filename: delphi.shp Start: 45 Length: 17 - die5: delphi + die5: + Filename: delphi.shp Start: 357 Length: 8 - die7: delphi + die7: + Filename: delphi.shp Start: 329 Length: 8 - chrono-overlay: chronofade_small + chrono-overlay: + Filename: chronofade_small.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 Tick: 80 - mind-overlay: mindanim + mind-overlay: + Filename: mindanim.shp Length: * Tick: 200 BlendMode: Alpha @@ -1380,47 +1965,61 @@ delphi: chan: Inherits: ^CommonDeaths - stand: chan + stand: + Filename: chan.shp Facings: 8 - panic-run: chan + panic-run: + Filename: chan.shp Start: 8 Length: 6 Facings: 8 - panic-stand: chan + panic-stand: + Filename: chan.shp Start: 8 Stride: 6 Facings: 8 - run: chan + run: + Filename: chan.shp Start: 56 Length: 6 Facings: 8 Tick: 80 - die1: chan + parachute: + Filename: chan.shp + Start: 3 + die1: + Filename: chan.shp Start: 120 Length: 8 - die2: chan + die2: + Filename: chan.shp Start: 128 Length: 8 - die3: chan + die3: + Filename: chan.shp Start: 136 Length: 12 - die4: chan + die4: + Filename: chan.shp Start: 136 Length: 17 - die5: chan + die5: + Filename: chan.shp Start: 148 Length: 8 - die7: chan + die7: + Filename: chan.shp Start: 120 Length: 8 - chrono-overlay: chronofade_small + chrono-overlay: + Filename: chronofade_small.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 Tick: 80 - mind-overlay: mindanim + mind-overlay: + Filename: mindanim.shp Length: * Tick: 200 BlendMode: Alpha @@ -1428,927 +2027,1310 @@ chan: moebius: Inherits: ^CommonDeaths - Defaults: moebius + Defaults: Tick: 80 - stand: moebius + stand: + Filename: moebius.shp Facings: 8 - panic-stand: moebius + panic-stand: + Filename: moebius.shp Facings: 8 - panic-run: moebius + panic-run: + Filename: moebius.shp Start: 8 Length: 6 Facings: 8 - run: moebius + run: + Filename: moebius.shp Start: 56 Length: 6 Facings: 8 - idle1: moebius + idle1: + Filename: moebius.shp Start: 104 Length: 15 - die1: moebius + parachute: + Filename: moebius.shp + Start: 3 + die1: + Filename: moebius.shp Start: 212 Length: 8 - die2: moebius + die2: + Filename: moebius.shp Start: 220 Length: 8 - die3: moebius + die3: + Filename: moebius.shp Start: 220 Length: 8 - die4: moebius + die4: + Filename: moebius.shp Start: 228 Length: 12 - die5: moebius + die5: + Filename: moebius.shp Start: 240 Length: 17 - die7: moebius + die7: + Filename: moebius.shp Start: 214 Length: 3 - chrono-overlay: chronofade_small + chrono-overlay: + Filename: chronofade_small.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 Tick: 80 - mind-overlay: mindanim + mind-overlay: + Filename: mindanim.shp Length: * Tick: 200 BlendMode: Alpha Offset: 0, 0 - die-crushed: corpse1 + die-crushed: + Filename: corpse1.tem + TilesetFilenames: + SNOW: corpse1.sno + BARREN: corpse1.bar Length: 6 Tick: 1600 ZOffset: -511 - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - JUNGLE: TEMPERAT - WINTER: TEMPERAT rmbo: Inherits: ^CommonDeaths - stand: rmbo + stand: + Filename: rmbo.shp Facings: 8 - stand2: rmbo + stand2: + Filename: rmbo.shp Start: 8 Facings: 8 - run: rmbo + run: + Filename: rmbo.shp Start: 16 Length: 6 Facings: 8 Tick: 100 - shoot: rmbo + shoot: + Filename: rmbo.shp Start: 64 Length: 4 Facings: 8 - liedown: rmbo + liedown: + Filename: rmbo.shp Start: 96 Length: 2 Facings: 8 - standup: rmbo + standup: + Filename: rmbo.shp Start: 144 Length: 2 Facings: 8 - prone-stand: rmbo + prone-stand: + Filename: rmbo.shp Start: 112 Stride: 4 Facings: 8 - prone-stand2: rmbo + prone-stand2: + Filename: rmbo.shp Start: 112 Stride: 4 Facings: 8 - prone-run: rmbo + prone-run: + Filename: rmbo.shp Start: 112 Length: 4 Facings: 8 Tick: 100 - prone-shoot: rmbo + prone-shoot: + Filename: rmbo.shp Start: 160 Length: 4 Facings: 8 - idle1: rmbo + parachute: + Filename: rmbo.shp + Start: 431 + idle1: + Filename: rmbo.shp Start: 192 Length: 16 Tick: 120 - idle2: rmbo + idle2: + Filename: rmbo.shp Start: 208 Length: 16 Tick: 120 - idle3: rmbo + idle3: + Filename: rmbo.shp Start: 224 Length: 15 Tick: 120 - cheer: rmbo + cheer: + Filename: rmbo.shp Start: 396 Length: 3 Facings: 8 Tick: 120 - die1: rmbo + die1: + Filename: rmbo.shp Start: 318 Length: 8 Tick: 80 - die2: rmbo + die2: + Filename: rmbo.shp Start: 326 Length: 8 Tick: 80 - die3: rmbo + die3: + Filename: rmbo.shp Start: 334 Length: 8 Tick: 80 - die4: rmbo + die4: + Filename: rmbo.shp Start: 342 Length: 12 Tick: 80 - die5: rmbo + die5: + Filename: rmbo.shp Start: 354 Length: 18 Tick: 80 - die7: rmbo + die7: + Filename: rmbo.shp Start: 318 Length: 8 Tick: 80 - garrison-muzzle: minigun16 + garrison-muzzle: + Filename: minigun16.shp Length: 3 Stride: 6 Facings: 16 - chrono-overlay: chronofade_small + chrono-overlay: + Filename: chronofade_small.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 Tick: 80 - mind-overlay: mindanim + mind-overlay: + Filename: mindanim.shp Length: * Tick: 200 BlendMode: Alpha Offset: 0, 0 - icon: rmboicnh + icon: + Filename: rmboicnh.shp -n1: +seal: Inherits: ^CommonDeaths - stand: n1 + stand: + Filename: seal.shp Facings: 8 - stand2: n1 + stand2: + Filename: seal.shp Start: 8 Facings: 8 - run: n1 + run: + Filename: seal.shp Start: 16 Length: 6 Facings: 8 Tick: 100 - shoot: n1 + shoot: + Filename: seal.shp Start: 64 - Length: 8 + Length: 4 + Facings: 8 + liedown: + Filename: seal.shp + Start: 96 + Length: 2 Facings: 8 - prone-stand: n1 + standup: + Filename: seal.shp Start: 144 + Length: 2 + Facings: 8 + prone-stand: + Filename: seal.shp + Start: 112 Stride: 4 Facings: 8 - prone-stand2: n1 - Start: 144 + prone-stand2: + Filename: seal.shp + Start: 112 Stride: 4 Facings: 8 - prone-run: n1 - Start: 144 + prone-run: + Filename: seal.shp + Start: 112 Length: 4 Facings: 8 Tick: 100 - liedown: n1 - Start: 128 - Length: 2 - Facings: 8 - standup: n1 - Start: 176 - Length: 2 + prone-shoot: + Filename: seal.shp + Start: 160 + Length: 4 Facings: 8 - prone-shoot: n1 + parachute: + Filename: seal.shp + Start: 431 + idle1: + Filename: seal.shp Start: 192 - Length: 8 - Facings: 8 - idle1: n1 - Start: 257 - Length: 15 + Length: 16 Tick: 120 - idle2: n1 - Start: 272 + idle2: + Filename: seal.shp + Start: 208 Length: 16 Tick: 120 - idle3: n1 - Start: 289 - Length: 22 + idle3: + Filename: seal.shp + Start: 224 + Length: 15 Tick: 120 - cheer: n1 - Start: 460 + cheer: + Filename: seal.shp + Start: 396 Length: 3 Facings: 8 Tick: 120 - idle4: n1 - Start: 517 - Length: 9 + swimidle: + Filename: sealswimidle.shp + Length: 3 + Facings: 8 + Tick: 180 + swim: + Filename: sealswim.shp + Length: 4 + Facings: 8 Tick: 120 - die1: n1 - Start: 381 - Length: 9 + die1: + Filename: seal.shp + Start: 318 + Length: 8 Tick: 80 - die2: n1 - Start: 390 + die2: + Filename: seal.shp + Start: 326 Length: 8 Tick: 80 - die3: n1 - Start: 398 + die3: + Filename: seal.shp + Start: 334 Length: 8 Tick: 80 - die4: n1 - Start: 406 + die4: + Filename: seal.shp + Start: 342 Length: 12 Tick: 80 - die5: n1 - Start: 418 + die5: + Filename: seal.shp + Start: 354 Length: 18 Tick: 80 - die7: n1 - Start: 366 - Length: 11 + die7: + Filename: seal.shp + Start: 318 + Length: 8 Tick: 80 - garrison-muzzle: minigun16 - Length: 6 + garrison-muzzle: + Filename: minigun16.shp + Length: 3 + Stride: 6 Facings: 16 - chrono-overlay: chronofade_small + chrono-overlay: + Filename: chronofade_small.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 Tick: 80 - mind-overlay: mindanim + mind-overlay: + Filename: mindanim.shp Length: * Tick: 200 BlendMode: Alpha Offset: 0, 0 - icon: n1icnh + splash: + Filename: h2o_exp3.shp + Length: * + ZOffset: 2047 + IgnoreWorldTint: true + plant: + Filename: seal.shp + Facings: 8 + Start: 8 + Tick: 120 + icon: + Filename: sealicon.shp -n2: +n1: Inherits: ^CommonDeaths - stand: n2 + stand: + Filename: n1.shp Facings: 8 - stand2: n2 + stand2: + Filename: n1.shp Start: 8 Facings: 8 - run: n2 + run: + Filename: n1.shp Start: 16 Length: 6 Facings: 8 Tick: 100 - throw: n2 + shoot: + Filename: n1.shp Start: 64 - Length: 20 + Length: 8 Facings: 8 - liedown: n2 - Start: 224 - Length: 2 + prone-stand: + Filename: n1.shp + Start: 144 + Stride: 4 Facings: 8 - standup: n2 + prone-stand2: + Filename: n1.shp + Start: 144 + Stride: 4 + Facings: 8 + prone-run: + Filename: n1.shp + Start: 144 + Length: 4 + Facings: 8 + Tick: 100 + liedown: + Filename: n1.shp + Start: 128 + Length: 2 + Facings: 8 + standup: + Filename: n1.shp + Start: 176 + Length: 2 + Facings: 8 + prone-shoot: + Filename: n1.shp + Start: 192 + Length: 8 + Facings: 8 + parachute: + Filename: n1.shp + Start: 471 + idle1: + Filename: n1.shp + Start: 257 + Length: 15 + Tick: 120 + idle2: + Filename: n1.shp + Start: 272 + Length: 16 + Tick: 120 + idle3: + Filename: n1.shp + Start: 289 + Length: 22 + Tick: 120 + cheer: + Filename: n1.shp + Start: 460 + Length: 3 + Facings: 8 + Tick: 120 + idle4: + Filename: n1.shp + Start: 517 + Length: 9 + Tick: 120 + die1: + Filename: n1.shp + Start: 381 + Length: 9 + Tick: 80 + die2: + Filename: n1.shp + Start: 390 + Length: 8 + Tick: 80 + die3: + Filename: n1.shp + Start: 398 + Length: 8 + Tick: 80 + die4: + Filename: n1.shp + Start: 406 + Length: 12 + Tick: 80 + die5: + Filename: n1.shp + Start: 418 + Length: 18 + Tick: 80 + die7: + Filename: n1.shp + Start: 366 + Length: 11 + Tick: 80 + garrison-muzzle: + Filename: minigun16.shp + Length: 6 + Facings: 16 + chrono-overlay: + Filename: chronofade_small.shp + Length: * + BlendMode: Additive + Offset: 0, 0 + ZOffset: 512 + Tick: 80 + mind-overlay: + Filename: mindanim.shp + Length: * + Tick: 200 + BlendMode: Alpha + Offset: 0, 0 + icon: + Filename: n1icnh.shp + +n2: + Inherits: ^CommonDeaths + stand: + Filename: n2.shp + Facings: 8 + stand2: + Filename: n2.shp + Start: 8 + Facings: 8 + run: + Filename: n2.shp + Start: 16 + Length: 6 + Facings: 8 + Tick: 100 + throw: + Filename: n2.shp + Start: 64 + Length: 20 + Facings: 8 + liedown: + Filename: n2.shp + Start: 224 + Length: 2 + Facings: 8 + standup: + Filename: n2.shp Start: 272 Length: 2 Facings: 8 - prone-stand: n2 + prone-stand: + Filename: n2.shp Start: 240 Stride: 4 Facings: 8 - prone-stand2: n2 + prone-stand2: + Filename: n2.shp Start: 240 Stride: 4 Facings: 8 - prone-run: n2 + prone-run: + Filename: n2.shp Start: 240 Length: 4 Facings: 8 Tick: 100 - prone-throw: n2 + prone-throw: + Filename: n2.shp Start: 288 Length: 12 Facings: 8 - idle1: n2 + parachute: + Filename: n2.shp + Start: 599 + idle1: + Filename: n2.shp Start: 384 Length: 16 Tick: 120 - idle2: n2 + idle2: + Filename: n2.shp Start: 400 Length: 13 Tick: 120 - cheer: n2 + cheer: + Filename: n2.shp Start: 588 Length: 3 Facings: 8 Tick: 120 - die1: n2 + die1: + Filename: n2.shp Start: 509 Length: 9 Tick: 80 - die2: n2 + die2: + Filename: n2.shp Start: 518 Length: 8 Tick: 80 - die3: n2 + die3: + Filename: n2.shp Start: 526 Length: 8 Tick: 80 - die4: n2 + die4: + Filename: n2.shp Start: 534 Length: 12 Tick: 80 - die5: n2 + die5: + Filename: n2.shp Start: 546 Length: 18 Tick: 80 - die7: n2 + die7: + Filename: n2.shp Start: 494 Length: 11 Tick: 80 - chrono-overlay: chronofade_small + chrono-overlay: + Filename: chronofade_small.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 Tick: 80 - mind-overlay: mindanim + mind-overlay: + Filename: mindanim.shp Length: * Tick: 200 BlendMode: Alpha Offset: 0, 0 - icon: n2icnh + icon: + Filename: n2icnh.shp n3: Inherits: ^CommonDeaths - stand: n3 + stand: + Filename: n3.shp Facings: 8 - stand2: n3 + stand2: + Filename: n3.shp Start: 8 Facings: 8 - run: n3 + run: + Filename: n3.shp Start: 16 Length: 6 Facings: 8 Tick: 100 - shoot: n3 + shoot: + Filename: n3.shp Start: 64 Length: 8 Facings: 8 - liedown: n3 + liedown: + Filename: n3.shp Start: 128 Length: 2 Facings: 8 - standup: n3 + standup: + Filename: n3.shp Start: 176 Length: 2 Facings: 8 - prone-stand: n3 + prone-stand: + Filename: n3.shp Start: 144 Stride: 4 Facings: 8 - prone-stand2: n3 + prone-stand2: + Filename: n3.shp Start: 144 Stride: 4 Facings: 8 - prone-run: n3 + prone-run: + Filename: n3.shp Start: 144 Length: 4 Facings: 8 Tick: 100 - prone-shoot: n3 + prone-shoot: + Filename: n3.shp Start: 192 Length: 10 Facings: 8 - idle1: n3 + parachute: + Filename: n3.shp + Start: 487 + idle1: + Filename: n3.shp Start: 274 Length: 12 Tick: 120 - idle2: n3 + idle2: + Filename: n3.shp Start: 289 Length: 14 Tick: 120 - cheer: n3 + cheer: + Filename: n3.shp Start: 476 Length: 3 Facings: 8 Tick: 120 - die1: n3 + die1: + Filename: n3.shp Start: 397 Length: 9 Tick: 80 - die2: n3 + die2: + Filename: n3.shp Start: 406 Length: 8 Tick: 80 - die3: n3 + die3: + Filename: n3.shp Start: 414 Length: 8 Tick: 80 - die4: n3 + die4: + Filename: n3.shp Start: 422 Length: 12 Tick: 80 - die5: n3 + die5: + Filename: n3.shp Start: 434 Length: 18 Tick: 80 - die7: n3 + die7: + Filename: n3.shp Start: 382 Length: 11 Tick: 80 - chrono-overlay: chronofade_small + chrono-overlay: + Filename: chronofade_small.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 Tick: 80 - mind-overlay: mindanim + mind-overlay: + Filename: mindanim.shp Length: * Tick: 200 BlendMode: Alpha Offset: 0, 0 - icon: n3icnh + icon: + Filename: n3icnh.shp n4: Inherits: ^CommonDeaths - stand: n4 + stand: + Filename: n4.shp Facings: 8 - stand2: n4 + stand2: + Filename: n4.shp Start: 8 Facings: 8 - run: n4 + run: + Filename: n4.shp Start: 16 Length: 6 Facings: 8 Tick: 100 - shoot: n4 + shoot: + Filename: n4.shp Start: 64 Length: 16 Facings: 8 - liedown: n4 + liedown: + Filename: n4.shp Start: 192 Length: 2 Facings: 8 - standup: n4 + standup: + Filename: n4.shp Start: 240 Length: 2 Facings: 8 - prone-stand: n4 + prone-stand: + Filename: n4.shp Start: 208 Stride: 4 Facings: 8 - prone-stand2: n4 + prone-stand2: + Filename: n4.shp Start: 208 Stride: 4 Facings: 8 - prone-run: n4 + prone-run: + Filename: n4.shp Start: 208 Length: 4 Facings: 8 Tick: 100 - prone-shoot: n4 + prone-shoot: + Filename: n4.shp Start: 256 Length: 16 Facings: 8 - idle1: n4 + parachute: + Filename: n4.shp + Start: 599 + idle1: + Filename: n4.shp Start: 384 Length: 16 Tick: 120 - idle2: n4 + idle2: + Filename: n4.shp Start: 400 Length: 16 Tick: 120 - cheer: n4 + cheer: + Filename: n4.shp Start: 588 Length: 3 Facings: 8 Tick: 120 - die1: n4 + die1: + Filename: n4.shp Start: 509 Length: 9 Tick: 80 - die2: n4 + die2: + Filename: n4.shp Start: 518 Length: 8 Tick: 80 - die3: n4 + die3: + Filename: n4.shp Start: 526 Length: 8 Tick: 80 - die4: n4 + die4: + Filename: n4.shp Start: 534 Length: 12 Tick: 80 - die5: n4 + die5: + Filename: n4.shp Start: 546 Length: 18 Tick: 80 - die7: n4 + die7: + Filename: n4.shp Start: 494 Length: 10 Tick: 80 muzzle: Combine: - flame-n: + 0: + Filename: flame-n.shp Length: * Offset: 1,6 - flame-nw: + 1: + Filename: flame-nw.shp Length: * Offset: 8,7 - flame-w: + 2: + Filename: flame-w.shp Length: * Offset: 8,2 - flame-sw: + 3: + Filename: flame-sw.shp Length: * Offset: 7,-2 - flame-s: + 4: + Filename: flame-s.shp Length: * Offset: 1,-2 - flame-se: + 5: + Filename: flame-se.shp Length: * Offset: -5,-2 - flame-e: + 6: + Filename: flame-e.shp Length: * Offset: -7,2 - flame-ne: + 7: + Filename: flame-ne.shp Length: * Offset: -7,8 Facings: 8 Length: 13 - chrono-overlay: chronofade_small + chrono-overlay: + Filename: chronofade_small.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 Tick: 80 - mind-overlay: mindanim + mind-overlay: + Filename: mindanim.shp Length: * Tick: 200 BlendMode: Alpha Offset: 0, 0 - icon: n4icnh + icon: + Filename: n4icnh.shp n5: Inherits: ^CommonDeaths - stand: n5 + stand: + Filename: n5.shp Facings: 8 - stand2: n5 + stand2: + Filename: n5.shp Start: 8 Facings: 8 - run: n5 + run: + Filename: n5.shp Start: 16 Length: 6 Facings: 8 Tick: 100 - shoot: n5 + shoot: + Filename: n5.shp Start: 64 Length: 16 Facings: 8 - liedown: n5 + liedown: + Filename: n5.shp Start: 192 Length: 2 Facings: 8 - standup: n5 + standup: + Filename: n5.shp Start: 240 Length: 2 Facings: 8 - prone-stand: n5 + prone-stand: + Filename: n5.shp Start: 208 Stride: 4 Facings: 8 - prone-stand2: n5 + prone-stand2: + Filename: n5.shp Start: 208 Stride: 4 Facings: 8 - prone-run: n5 + prone-run: + Filename: n5.shp Start: 208 Length: 4 Facings: 8 Tick: 100 - prone-shoot: n5 + prone-shoot: + Filename: n5.shp Start: 256 Length: 16 Facings: 8 - idle1: n5 + parachute: + Filename: n5.shp + Start: 599 + idle1: + Filename: n5.shp Start: 384 Length: 16 Tick: 120 - idle2: n5 + idle2: + Filename: n5.shp Start: 400 Length: 16 Tick: 120 - cheer: n5 + cheer: + Filename: n5.shp Start: 588 Length: 3 Facings: 8 Tick: 120 - die1: n5 + die1: + Filename: n5.shp Start: 509 Length: 9 Tick: 80 - die2: n5 + die2: + Filename: n5.shp Start: 518 Length: 8 Tick: 80 - die3: n5 + die3: + Filename: n5.shp Start: 526 Length: 8 Tick: 80 - die4: n5 + die4: + Filename: n5.shp Start: 534 Length: 12 Tick: 80 - die5: n5 + die5: + Filename: n5.shp Start: 546 Length: 18 Tick: 80 - die7: n5 + die7: + Filename: n5.shp Start: 494 Length: 10 Tick: 80 muzzle: Combine: - chem-n: + 0: + Filename: chem-n.shp Length: * Offset: 1,2 - chem-nw: + 1: + Filename: chem-nw.shp Length: * Offset: 8,2 - chem-w: + 2: + Filename: chem-w.shp Length: * Offset: 8,-3 - chem-sw: + 3: + Filename: chem-sw.shp Length: * Offset: 7,-6 - chem-s: + 4: + Filename: chem-s.shp Length: * Offset: 1,-6 - chem-se: + 5: + Filename: chem-se.shp Length: * Offset: -5,-6 - chem-e: + 6: + Filename: chem-e.shp Length: * Offset: -7,-3 - chem-ne: + 7: + Filename: chem-ne.shp Length: * Offset: -3,2 Facings: 8 Length: 13 - chrono-overlay: chronofade_small + chrono-overlay: + Filename: chronofade_small.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 Tick: 80 - mind-overlay: mindanim + mind-overlay: + Filename: mindanim.shp Length: * Tick: 200 BlendMode: Alpha Offset: 0, 0 - icon: n5icnh + icon: + Filename: n5icnh.shp n6: Inherits: ^CommonDeaths - stand: n6 + stand: + Filename: n6.shp Facings: 8 - stand2: n6 + stand2: + Filename: n6.shp Start: 8 Facings: 8 - run: n6 + run: + Filename: n6.shp Start: 16 Length: 6 Facings: 8 Tick: 100 - idle1: n6 + parachute: + Filename: n6.shp + Start: 210 + idle1: + Filename: n6.shp Start: 121 Length: 8 Tick: 120 - idle2: n6 + idle2: + Filename: n6.shp Start: 130 Length: 14 Tick: 120 - die1: n6 + die1: + Filename: n6.shp Start: 146 Length: 8 - die2: n6 + die2: + Filename: n6.shp Start: 154 Length: 8 - die3: n6 + die3: + Filename: n6.shp Start: 162 Length: 8 - die4: n6 + die4: + Filename: n6.shp Start: 170 Length: 12 - die5: n6 + die5: + Filename: n6.shp Start: 182 Length: 18 - die7: n6 + die7: + Filename: n6.shp Start: 130 Length: 4 Tick: 80 - prone-stand: n6 + prone-stand: + Filename: n6.shp Start: 82 Stride: 4 Facings: 8 - prone-stand2: n6 + prone-stand2: + Filename: n6.shp Start: 82 Stride: 4 Facings: 8 - prone-run: n6 + prone-run: + Filename: n6.shp Start: 82 Length: 4 Facings: 8 Tick: 100 - chrono-overlay: chronofade_small + chrono-overlay: + Filename: chronofade_small.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 Tick: 80 - mind-overlay: mindanim + mind-overlay: + Filename: mindanim.shp Length: * Tick: 200 BlendMode: Alpha Offset: 0, 0 - icon: n6icnh + icon: + Filename: n6icnh.shp sab: Inherits: ^CommonDeaths - stand: sab + stand: + Filename: sab.shp Facings: 8 - run: sab + run: + Filename: sab.shp Start: 8 Length: 6 Facings: 8 Tick: 100 - shoot: sab + shoot: + Filename: sab.shp Start: 56 Length: 4 Facings: 8 - prone-stand: sab + prone-stand: + Filename: sab.shp Start: 104 Stride: 4 Facings: 8 - prone-run: sab + prone-run: + Filename: sab.shp Start: 104 Length: 4 Facings: 8 Tick: 100 - standup: sab + standup: + Filename: sab.shp Start: 136 Length: 2 Facings: 8 - prone-shoot: sab + prone-shoot: + Filename: sab.shp Start: 152 Length: 4 Facings: 8 - idle1: sab + parachute: + Filename: sab.shp + Start: 3 + idle1: + Filename: sab.shp Start: 184 Length: 26 Tick: 120 - die1: sab + die1: + Filename: sab.shp Start: 210 Length: 8 - die2: sab + die2: + Filename: sab.shp Start: 218 Length: 8 - die3: sab + die3: + Filename: sab.shp Start: 226 Length: 8 - die4: sab + die4: + Filename: sab.shp Start: 234 Length: 12 - die5: sab + die5: + Filename: sab.shp Start: 246 Length: 18 - die7: sab + die7: + Filename: sab.shp Start: 210 Length: 8 - chrono-overlay: chronofade_small + chrono-overlay: + Filename: chronofade_small.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 Tick: 80 - mind-overlay: mindanim + mind-overlay: + Filename: mindanim.shp Length: * Tick: 200 BlendMode: Alpha Offset: 0, 0 - icon: sabicon + icon: + Filename: sabicon.shp -mort: +mortchem: Inherits: ^CommonDeaths - stand: mort + Defaults: + Filename: mortchem.shp + stand: Facings: 8 - stand2: mort + stand2: Facings: 8 - run: mort + run: Start: 16 Length: 6 Facings: 8 Tick: 100 - throw: mort + throw: Start: 64 Length: 20 Facings: 8 - liedown: mort + liedown: Start: 224 Length: 2 Facings: 8 - standup: mort + standup: Start: 272 Length: 2 Facings: 8 - prone-stand: mort + prone-stand: Start: 240 Stride: 4 Facings: 8 - prone-stand2: mort + prone-stand2: Start: 240 Stride: 4 Facings: 8 - prone-run: mort + prone-run: Start: 240 Length: 4 Facings: 8 Tick: 100 - prone-throw: mort + prone-throw: Start: 288 Length: 12 Facings: 8 - idle1: mort + parachute: + Start: 528 + idle1: Start: 384 Length: 16 Tick: 120 - idle2: mort + idle2: Start: 400 Length: 16 Tick: 120 - cheer: mort + cheer: Start: 494 Length: 3 Facings: 8 Tick: 120 - die1: mort + die1: Start: 416 Length: 9 Tick: 80 - die2: mort + die2: Start: 424 Length: 8 Tick: 80 - die3: mort + die3: Start: 432 Length: 8 Tick: 80 - die4: mort + die4: Start: 440 Length: 12 Tick: 80 - die5: mort + die5: Start: 452 Length: 18 Tick: 80 - die7: mort + die7: Start: 416 Length: 9 Tick: 80 - die9: poisonTD + die9: + Filename: poisonTD.shp Length: * - die10: poisonTD + die10: + Filename: poisonTD.shp Length: * - chrono-overlay: chronofade_small + chrono-overlay: + Filename: chronofade_small.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 Tick: 80 - mind-overlay: mindanim + mind-overlay: + Filename: mindanim.shp Length: * Tick: 200 BlendMode: Alpha Offset: 0, 0 - icon: morticon + icon: + Filename: mortchemicon.shp + +mortcryo: + Inherits: mortchem + Defaults: + Filename: mortcryo.shp + icon: + Filename: mortcryoicon.shp + +mortsonic: + Inherits: mortchem + Defaults: + Filename: mortsonic.shp + icon: + Filename: mortsonicicon.shp sniper: Inherits: ^CommonDeaths Defaults: - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - JUNGLE: TEMPERAT - WINTER: TEMPERAT - BARREN: DESERT - DUNE: DESERT + Filename: sniper.tem + TilesetFilenames: + SNOW: sniper.sno + DESERT: sniper.des + BARREN: sniper.des stand: Facings: 8 stand2: @@ -2366,6 +3348,16 @@ sniper: Start: 64 Length: 8 Facings: 8 + aim: + Start: 65 + Length: 1 + Facings: 8 + Stride: 8 + prone-aim: + Start: 193 + Length: 1 + Facings: 8 + Stride: 8 prone-stand: Start: 144 Stride: 4 @@ -2387,6 +3379,8 @@ sniper: Start: 192 Length: 8 Facings: 8 + parachute: + Start: 400 idle1: Start: 256 Length: 16 @@ -2410,702 +3404,950 @@ sniper: die5: Start: 324 Length: 18 - die6: electroTD - Length: * - UseTilesetExtension: true - TilesetOverrides: - DESERT: TEMPERAT - INTERIOR: TEMPERAT - JUNGLE: TEMPERAT - WINTER: TEMPERAT - DUNE: TEMPERAT + die6: + Filename: electroTD.tem + TilesetFilenames: + BARREN: electroTD.des + Length: * die7: Start: 288 Length: 8 - die9: poisonTD - UseTilesetExtension: false + die9: + Filename: poisonTD.shp + TilesetFilenames: Length: * - die10: poisonTD - UseTilesetExtension: false + die10: + Filename: poisonTD.shp + TilesetFilenames: Length: * - die8: chronozapTD + die8: + Filename: chronozapTD.shp + TilesetFilenames: Length: * BlendMode: Alpha - UseTilesetExtension: false - die11: frozen - UseTilesetExtension: false - die12: atomized - UseTilesetExtension: false - die-crushed: corpse1 + die11: + Filename: frozen.shp + TilesetFilenames: + die12: + Filename: atomized.shp + TilesetFilenames: + die-crushed: + Filename: corpse1.tem + TilesetFilenames: + SNOW: corpse1.sno + BARREN: corpse1.des Length: * Tick: 1600 ZOffset: -511 - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - JUNGLE: TEMPERAT - WINTER: TEMPERAT - garrison-muzzle: minigun16 - Length: 6 - UseTilesetExtension: false + garrison-muzzle: + Filename: minigun16.shp + TilesetFilenames: + Length: 6 Facings: 16 - chrono-overlay: chronofade_small + chrono-overlay: + Filename: chronofade_small.shp + TilesetFilenames: Length: * - UseTilesetExtension: false BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 Tick: 80 - mind-overlay: mindanim + mind-overlay: + Filename: mindanim.shp + TilesetFilenames: Length: * Tick: 200 BlendMode: Alpha - UseTilesetCode: false Offset: 0, 0 - UseTilesetExtension: false - icon: snipericon - UseTilesetExtension: false + icon: + Filename: snipericon.shp + TilesetFilenames: vice: - idle: vice + idle: + Filename: vice.shp Length: * muzzle: Combine: - chem-n: + 0: + Filename: chem-n.shp Length: * Offset: 1,2 - chem-nw: + 1: + Filename: chem-nw.shp Length: * Offset: 8,2 - chem-w: + 2: + Filename: chem-w.shp Length: * Offset: 8,-3 - chem-sw: + 3: + Filename: chem-sw.shp Length: * Offset: 7,-6 - chem-s: + 4: + Filename: chem-s.shp Length: * Offset: 1,-6 - chem-se: + 5: + Filename: chem-se.shp Length: * Offset: -5,-6 - chem-e: + 6: + Filename: chem-e.shp Length: * Offset: -7,-3 - chem-ne: + 7: + Filename: chem-ne.shp Length: * Offset: -3,2 Facings: 8 Length: 13 - chrono-overlay: chronofade_small + chrono-overlay: + Filename: chronofade_small.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 Tick: 80 - mind-overlay: mindanim + mind-overlay: + Filename: mindanim.shp Length: * Tick: 200 BlendMode: Alpha - UseTilesetCode: false Offset: 0, 0 boris: Inherits: ^CommonDeaths - stand: boris + stand: + Filename: boris.shp Facings: 8 - run: boris + run: + Filename: boris.shp Start: 8 Length: 6 Facings: 8 Tick: 80 - shoot: boris + shoot: + Filename: boris.shp Start: 56 Length: 4 Facings: 8 - shoot-laser: borislaser + shoot-laser: + Filename: borislaser.shp Length: 1 Facings: 8 - prone-stand: boris + prone-stand: + Filename: boris.shp Start: 104 Stride: 4 Facings: 8 - prone-run: boris + prone-run: + Filename: boris.shp Start: 104 Length: 4 Facings: 8 - standup-0: boris + standup-0: + Filename: boris.shp Start: 136 Length: 2 Facings: 8 - prone-shoot: boris + prone-shoot: + Filename: boris.shp Start: 152 Length: 4 Facings: 8 - prone-shoot-laser: borislaser + prone-shoot-laser: + Filename: borislaser.shp Length: 1 Facings: 8 - idle1: boris + parachute: + Filename: boris.shp + Start: 3 + idle1: + Filename: boris.shp Start: 184 Length: 26 Tick: 120 - die1: boris + die1: + Filename: boris.shp Start: 210 Length: 8 - die2: boris + die2: + Filename: boris.shp Start: 218 Length: 8 - die3: boris + die3: + Filename: boris.shp Start: 226 Length: 8 - die4: boris + die4: + Filename: boris.shp Start: 234 Length: 12 - die5: boris + die5: + Filename: boris.shp Start: 246 Length: 18 - die7: boris + die7: + Filename: boris.shp Start: 210 Length: 8 - chrono-overlay: chronofade_small + chrono-overlay: + Filename: chronofade_small.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 Tick: 80 - mind-overlay: mindanim + mind-overlay: + Filename: mindanim.shp Length: * Tick: 200 BlendMode: Alpha - UseTilesetCode: false Offset: 0, 0 - icon: borisicon + icon: + Filename: borisicon.shp acol: Inherits: ^CommonDeaths - stand: acol + stand: + Filename: acol.shp Facings: 8 - stand2: acol + stand2: + Filename: acol.shp Start: 8 Facings: 8 - run: acol + run: + Filename: acol.shp Start: 16 Length: 6 Facings: 8 Tick: 100 - shoot: acol + shoot: + Filename: acol.shp Start: 64 Length: 4 Facings: 8 - liedown: acol + liedown: + Filename: acol.shp Start: 96 Length: 2 Facings: 8 - standup: acol + standup: + Filename: acol.shp Start: 144 Length: 2 Facings: 8 - prone-stand: acol + prone-stand: + Filename: acol.shp Start: 112 Stride: 4 Facings: 8 - prone-stand2: acol + prone-stand2: + Filename: acol.shp Start: 112 Stride: 4 Facings: 8 - prone-run: acol + prone-run: + Filename: acol.shp Start: 112 Length: 4 Facings: 8 Tick: 100 - prone-shoot: acol + prone-shoot: + Filename: acol.shp Start: 160 Length: 4 Facings: 8 - idle1: acol + parachute: + Filename: acol.shp + Start: 431 + idle1: + Filename: acol.shp Start: 192 Length: 16 Tick: 120 - idle2: acol + idle2: + Filename: acol.shp Start: 208 Length: 16 Tick: 120 - idle3: acol + idle3: + Filename: acol.shp Start: 224 Length: 15 Tick: 120 - cheer: acol + cheer: + Filename: acol.shp Start: 396 Length: 3 Facings: 8 Tick: 120 - die1: acol + die1: + Filename: acol.shp Start: 318 Length: 8 Tick: 80 - die2: acol + die2: + Filename: acol.shp Start: 326 Length: 8 Tick: 80 - die3: acol + die3: + Filename: acol.shp Start: 334 Length: 8 Tick: 80 - die4: acol + die4: + Filename: acol.shp Start: 342 Length: 12 Tick: 80 - die5: acol + die5: + Filename: acol.shp Start: 354 Length: 18 Tick: 80 - die7: acol + die7: + Filename: acol.shp Start: 318 Length: 8 Tick: 80 - chrono-overlay: chronofade_small + chrono-overlay: + Filename: chronofade_small.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 Tick: 80 - mind-overlay: mindanim + mind-overlay: + Filename: mindanim.shp Length: * Tick: 200 BlendMode: Alpha - UseTilesetCode: false Offset: 0, 0 - emp-overlay: emp_fx02 + emp-overlay: + Filename: emp_fx02.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 - icon: acolicnh + icon: + Filename: acolicnh.shp jjet: Inherits: ^CommonDeaths Defaults: Tick: 80 ZOffset: 512 - idle: jjet + idle: + Filename: jjet.shp + Start: 3 + Length: 1 + Tick: 400 + idle-upg: + Filename: bjet.shp + Start: 3 + Length: 1 + Tick: 400 + stand: + Filename: jjet.shp Facings: 8 - Length: 6 - Start: 310 - stand: jjet + stand-upg: + Filename: bjet.shp Facings: 8 - run: jjet - Start: 8 - Length: 6 + run: + Filename: jjet.shp Facings: 8 - idle1: jjet - Start: 56 - Length: 15 - idle2: jjet - Start: 71 - Length: 15 - prone-run: jjet - Start: 86 - Length: 6 + Length: 2 + Start: 48 + Tick: 40 + idle1: + Filename: jjet.shp + Start: 3 + Length: 1 + Tick: 400 + idle2: + Filename: jjet.shp + Start: 5 + Length: 1 + Tick: 400 + idle1-upg: + Filename: bjet.shp + Start: 5 + Length: 1 + Tick: 400 + idle2-upg: + Filename: bjet.shp + Start: 5 + Length: 1 + Tick: 400 + flying: + Filename: jjet.shp Facings: 8 - prone-stand: jjet + Length: 2 + Start: 48 + Tick: 40 + flying-upg: + Filename: bjet.shp Facings: 8 - flying: jjet + Length: 2 + Start: 48 + Tick: 40 + hover: + Filename: jjet.shp Facings: 8 - Length: 6 - Start: 262 - hover: jjet + Length: 4 + Start: 16 + hover-upg: + Filename: bjet.shp Facings: 8 + Length: 4 + Start: 16 + die-falling: + Filename: jjet.shp + Start: 80 + Length: 7 + Tick: 100 + die-falling-upg: + Filename: bjet.shp + Start: 80 + Length: 7 + Tick: 80 + die-fallen: + Filename: jjet.shp + Start: 87 Length: 6 - Start: 310 - die-twirling: jjet # TODO: animation for falling from sky starts at 436 - Start: 414 - Length: 6 - die-falling: jjet - Start: 406 - Length: 9 - die-flying: jjet # TODO: animation for falling from sky starts at 436 - Start: 414 - Length: 6 - attack: jjet - Start: 182 - Length: 6 + Tick: 160 + attack: + Filename: jjet.shp + Start: 93 + Length: 2 Facings: 8 - flying-attack: jjet - Start: 358 + attack-upg: + Filename: bjet.shp + Start: 93 + Length: 2 Facings: 8 - Length: 6 - prone-attack: jjet - Start: 212 - Length: 6 + flying-attack: + Filename: jjet.shp + Start: 64 Facings: 8 - standup: jjet - Start: 230 Length: 2 + Tick: 60 + flying-attack-upg: + Filename: bjet.shp + Start: 64 Facings: 8 - die1: jjet - Start: 414 - Length: 6 + Length: 2 + Tick: 60 + die1: + Filename: jjet.shp + Frames: 109,110,111,112,113,88,89,90,91,92 + Length: * Tick: 80 - die2: jjet - Start: 414 - Length: 6 + die2: + Filename: jjet.shp + Frames: 109,110,111,112,113,88,89,90,91,92 + Length: * Tick: 80 - die3: jjet - Start: 414 - Length: 6 + die3: + Filename: jjet.shp + Frames: 109,110,111,112,113,88,89,90,91,92 + Length: * Tick: 80 - die4: jjet - Start: 414 - Length: 6 + die4: + Filename: jjet.shp + Frames: 109,110,111,112,113,88,89,90,91,92 + Length: * Tick: 80 - die5: jjet - Start: 414 - Length: 6 + die5: + Filename: jjet.shp + Frames: 109,110,111,112,113,88,89,90,91,92 + Length: * Tick: 80 - die7: jjet - Start: 318 - Length: 8 + die7: + Filename: jjet.shp + Frames: 109,110,111,112,113,88,89,90,91,92 + Length: * Tick: 80 - die-splash: h2o_exp1 + die-splash: + Filename: h2o_exp1.shp Length: * - chrono-overlay: chronofade_small + chrono-overlay: + Filename: chronofade_small.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 513 Tick: 80 - mind-overlay: mindanim + mind-overlay: + Filename: mindanim.shp Length: * Tick: 200 BlendMode: Alpha - UseTilesetCode: false Offset: 0, 0 - emp-overlay: emp_fx02 + emp-overlay: + Filename: emp_fx02.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 513 - icon: jjeticnh + icon: + Filename: jjeticnh.shp + +bjet: + Inherits: jjet + icon: + Filename: bjeticnh.shp e8: Inherits: ^CommonDeaths - stand: e8 + stand: + Filename: e8.shp Facings: 8 - stand2: e8 + stand2: + Filename: e8.shp Start: 8 Facings: 8 - deploy: e8d - Length: 4 - Tick: 180 - deployed: e8d - Start: 4 - Length: 3 - Tick: 420 - run: e8 + run: + Filename: e8.shp Start: 16 Length: 6 Facings: 8 Tick: 100 - shoot: e8 + shoot: + Filename: e8.shp Start: 64 Length: 16 Facings: 8 - liedown: e8 + liedown: + Filename: e8.shp Start: 192 Length: 2 Facings: 8 - standup: e8 + standup: + Filename: e8.shp Start: 240 Length: 2 Facings: 8 - prone-stand: e8 + prone-stand: + Filename: e8.shp Start: 208 Stride: 4 Facings: 8 - prone-stand2: e8 + prone-stand2: + Filename: e8.shp Start: 208 Stride: 4 Facings: 8 - prone-run: e8 + prone-run: + Filename: e8.shp Start: 208 Length: 4 Facings: 8 Tick: 100 - prone-shoot: e8 + prone-shoot: + Filename: e8.shp Start: 256 Length: 16 Facings: 8 - idle1: e8 + parachute: + Filename: e8.shp + Start: 528 + idle1: + Filename: e8.shp Start: 384 Length: 14 Tick: 120 - idle2: e8 + idle2: + Filename: e8.shp Start: 398 Length: 18 Tick: 120 - die1: e8 + die1: + Filename: e8.shp Start: 415 Length: 9 Tick: 80 - die2: e8 + die2: + Filename: e8.shp Start: 424 Length: 8 Tick: 80 - die3: e8 + die3: + Filename: e8.shp Start: 432 Length: 8 Tick: 80 - die4: e8 + die4: + Filename: e8.shp Start: 440 Length: 12 Tick: 80 - die5: e8 + die5: + Filename: e8.shp Start: 452 Length: 18 Tick: 80 - die7: e8 + die7: + Filename: e8.shp Start: 415 Length: 9 Tick: 80 - chrono-overlay: chronofade_small + chrono-overlay: + Filename: chronofade_small.shp + Length: * + BlendMode: Additive + Offset: 0, 0 + ZOffset: 512 + Tick: 80 + mind-overlay: + Filename: mindanim.shp + Length: * + Tick: 200 + BlendMode: Alpha + Offset: 0, 0 + icon: + Filename: e8icon.shp + +deso: + Inherits: ^CommonDeaths + stand: + Filename: deso.shp + Facings: 8 + stand2: + Filename: deso.shp + Start: 8 + Facings: 8 + deploy: + Filename: deso.shp + Start: 137 + Length: 9 + Tick: 80 + deployed: + Filename: deso.shp + Start: 146 + Length: 8 + Tick: 80 + run: + Filename: deso.shp + Start: 16 + Length: 6 + Facings: 8 + Tick: 120 + shoot: + Filename: deso.shp + Start: 64 + Length: 4 + Facings: 8 + Tick: 60 + parachute: + Filename: deso.shp + Start: 3 + idle1: + Filename: deso.shp + Start: 96 + Length: 8 + Tick: 160 + idle2: + Filename: deso.shp + Start: 104 + Length: 8 + Tick: 160 + die1: + Filename: deso.shp + Start: 111 + Length: 14 + Tick: 80 + die2: + Filename: deso.shp + Start: 125 + Length: 12 + die3: + Filename: deso.shp + Start: 125 + Length: 12 + die4: + Filename: deso.shp + Start: 125 + Length: 12 + die5: + Filename: deso.shp + Start: 125 + Length: 12 + die7: + Filename: deso.shp + Start: 125 + Length: 12 + chrono-overlay: + Filename: chronofade_small.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 Tick: 80 - mind-overlay: mindanim + mind-overlay: + Filename: mindanim.shp Length: * Tick: 200 BlendMode: Alpha - UseTilesetCode: false Offset: 0, 0 - icon: desoicon + icon: + Filename: desoicon.shp n1c: Inherits: ^CommonDeaths - stand: n1c + stand: + Filename: n1c.shp Facings: 8 - stand2: n1c + stand2: + Filename: n1c.shp Start: 8 Facings: 8 - run: n1c + run: + Filename: n1c.shp Start: 16 Length: 6 Facings: 8 Tick: 100 - shoot: n1c + shoot: + Filename: n1c.shp Start: 64 Length: 8 Facings: 8 - prone-stand: n1c + prone-stand: + Filename: n1c.shp Start: 144 Stride: 4 Facings: 8 - prone-stand2: n1c + prone-stand2: + Filename: n1c.shp Start: 144 Stride: 4 Facings: 8 - prone-run: n1c + prone-run: + Filename: n1c.shp Start: 144 Length: 4 Facings: 8 Tick: 100 - liedown: n1c + liedown: + Filename: n1c.shp Start: 128 Length: 2 Facings: 8 - standup: n1c + standup: + Filename: n1c.shp Start: 176 Length: 2 Facings: 8 - prone-shoot: n1c + prone-shoot: + Filename: n1c.shp Start: 192 Length: 8 Facings: 8 - idle1: n1c + parachute: + Filename: n1c.shp + Start: 400 + idle1: + Filename: n1c.shp Start: 256 Length: 14 Tick: 120 - idle2: n1c + idle2: + Filename: n1c.shp Start: 272 Length: 16 Tick: 120 - cheer: n1c + cheer: + Filename: n1c.shp Start: 366 Length: 3 Facings: 8 Tick: 120 - die1: n1c + die1: + Filename: n1c.shp Start: 288 Length: 8 Tick: 80 - die2: n1c + die2: + Filename: n1c.shp Start: 296 Length: 8 Tick: 80 - die3: n1c + die3: + Filename: n1c.shp Start: 304 Length: 8 Tick: 80 - die4: n1c + die4: + Filename: n1c.shp Start: 312 Length: 12 Tick: 80 - die5: n1c + die5: + Filename: n1c.shp Start: 324 Length: 18 Tick: 80 - die7: n1 + die7: + Filename: n1.shp Start: 366 Length: 11 Tick: 80 - garrison-muzzle: minigun16 + garrison-muzzle: + Filename: minigun16.shp Length: 6 Facings: 16 - chrono-overlay: chronofade_small + chrono-overlay: + Filename: chronofade_small.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 Tick: 80 - mind-overlay: mindanim + mind-overlay: + Filename: mindanim.shp Length: * Tick: 200 BlendMode: Alpha - UseTilesetCode: false Offset: 0, 0 - emp-overlay: emp_fx02 + emp-overlay: + Filename: emp_fx02.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 - icon: n1cicnh + icon: + Filename: n1cicnh.shp n3c: Inherits: ^CommonDeaths - stand: n3c + stand: + Filename: n3c.shp Facings: 8 - stand2: n3c + stand2: + Filename: n3c.shp Start: 8 Facings: 8 - deploy: e8d - Length: 4 - Tick: 180 - undeploy: e8d - Start: 6 - Length: 4 - Tick: 180 - deployed: e8d - Length: 7 - Tick: 160 - deployed-shoot: e8d - Start: 4 - Length: 3 - Tick: 80 - run: n3c + run: + Filename: n3c.shp Start: 16 Length: 6 Facings: 8 Tick: 100 - shoot: n3c + shoot: + Filename: n3c.shp Start: 64 Length: 16 Facings: 8 - liedown: n3c + liedown: + Filename: n3c.shp Start: 192 Length: 2 Facings: 8 - standup: n3c + standup: + Filename: n3c.shp Start: 240 Length: 2 Facings: 8 - prone-stand: n3c + prone-stand: + Filename: n3c.shp Start: 208 Stride: 4 Facings: 8 - prone-stand2: n3c + prone-stand2: + Filename: n3c.shp Start: 208 Stride: 4 Facings: 8 - prone-run: n3c + prone-run: + Filename: n3c.shp Start: 208 Length: 4 Facings: 8 Tick: 100 - prone-shoot: n3c + prone-shoot: + Filename: n3c.shp Start: 256 Length: 16 Facings: 8 - idle1: n3c + parachute: + Filename: n3c.shp + Start: 528 + idle1: + Filename: n3c.shp Start: 384 Length: 14 Tick: 120 - idle2: n3c + idle2: + Filename: n3c.shp Start: 398 Length: 18 Tick: 120 - die1: n3c + die1: + Filename: n3c.shp Start: 415 Length: 9 Tick: 80 - die2: n3c + die2: + Filename: n3c.shp Start: 424 Length: 8 Tick: 80 - die3: n3c + die3: + Filename: n3c.shp Start: 432 Length: 8 Tick: 80 - die4: n3c + die4: + Filename: n3c.shp Start: 440 Length: 12 Tick: 80 - die5: n3c + die5: + Filename: n3c.shp Start: 452 Length: 18 Tick: 80 - die7: n3c + die7: + Filename: n3c.shp Start: 415 Length: 9 Tick: 80 - chrono-overlay: chronofade_small + chrono-overlay: + Filename: chronofade_small.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 Tick: 80 - mind-overlay: mindanim + mind-overlay: + Filename: mindanim.shp Length: * Tick: 200 BlendMode: Alpha - UseTilesetCode: false Offset: 0, 0 - emp-overlay: emp_fx02 + emp-overlay: + Filename: emp_fx02.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 - icon: n3cicnh + icon: + Filename: n3cicnh.shp cycom: - Defaults: DATA.R8 - AddExtension: false + Defaults: + Filename: DATA.R8 stand: Start: 930 Facings: -8 Transpose: true + parachute: + Start: 933 idle1: Frames: 1111, 1118, 1125, 1132, 1139, 1146, 1153, 1160 Length: 8 @@ -3167,36 +4409,30 @@ cycom: Frames: 1109, 1116, 1123, 1130, 1137, 1144, 1151, 1158 Length: 8 Tick: 80 - die6: electroTD - AddExtension: True + die6: + Filename: electroTD.tem + TilesetFilenames: + BARREN: electroTD.bar Length: * - UseTilesetExtension: true - TilesetOverrides: - DESERT: TEMPERAT - INTERIOR: TEMPERAT - SNOW: TEMPERAT - JUNGLE: TEMPERAT - WINTER: TEMPERAT - DUNE: TEMPERAT die7: Frames: 1109, 1116, 1123, 1130, 1137, 1144, 1151, 1158 Length: 8 Tick: 80 - die8: chronozapTD - AddExtension: True + die8: + Filename: chronozapTD.shp Length: * BlendMode: Alpha - die9: poisonTD - AddExtension: True + die9: + Filename: poisonTD.shp Length: * - die10: poisonTD - AddExtension: True + die10: + Filename: poisonTD.shp Length: * - die11: frozen - AddExtension: True + die11: + Filename: frozen.shp Length: * - die12: atomized - AddExtension: True + die12: + Filename: atomized.shp Length: * Tick: 80 BlendMode: Additive @@ -3205,411 +4441,1761 @@ cycom: Length: 8 Tick: 800 ZOffset: -511 - chrono-overlay: chronofade_small - AddExtension: True + chrono-overlay: + Filename: chronofade_small.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 Tick: 80 - mind-overlay: mindanim + mind-overlay: + Filename: mindanim.shp Length: * Tick: 200 BlendMode: Alpha Offset: 0, 0 - AddExtension: True - UseTilesetCode: false - emp-overlay: emp_fx02 - AddExtension: True + emp-overlay: + Filename: emp_fx02.shp Length: * BlendMode: Additive Offset: 0, -5 - UseTilesetCode: false ZOffset: 512 - icon: rmbocicnh.shp + icon: + Filename: rmbcicnh.shp ivan: Inherits: ^CommonDeaths - stand: ivan + stand: + Filename: ivan.shp Facings: 8 - stand2: ivan + stand2: + Filename: ivan.shp Start: 8 Facings: 8 - run: ivan + run: + Filename: ivan.shp Start: 16 Length: 6 Facings: 8 Tick: 100 - throw: ivan + throw: + Filename: ivan.shp Start: 64 Length: 20 Facings: 8 - liedown: ivan + liedown: + Filename: ivan.shp Start: 224 Length: 2 Facings: 8 - standup: ivan + standup: + Filename: ivan.shp Start: 272 Length: 2 Facings: 8 - prone-stand: ivan + prone-stand: + Filename: ivan.shp Start: 240 Stride: 4 Facings: 8 - prone-stand2: ivan + prone-stand2: + Filename: ivan.shp Start: 240 Stride: 4 Facings: 8 - prone-run: ivan + prone-run: + Filename: ivan.shp Start: 240 Length: 4 Facings: 8 Tick: 100 - prone-throw: ivan + prone-throw: + Filename: ivan.shp Start: 288 Length: 12 Facings: 8 - idle1: ivan + parachute: + Filename: ivan.shp + Start: 622 + idle1: + Filename: ivan.shp Start: 384 Length: 16 Tick: 120 - idle2: ivan + idle2: + Filename: ivan.shp Start: 400 Length: 13 Tick: 120 - cheer: ivan + cheer: + Filename: ivan.shp Start: 588 Length: 3 Facings: 8 Tick: 120 - die1: ivan + die1: + Filename: ivan.shp Start: 509 Length: 9 Tick: 80 - die2: ivan + die2: + Filename: ivan.shp Start: 518 Length: 8 Tick: 80 - die3: ivan + die3: + Filename: ivan.shp Start: 526 Length: 8 Tick: 80 - die4: ivan + die4: + Filename: ivan.shp Start: 534 Length: 12 Tick: 80 - die5: ivan + die5: + Filename: ivan.shp Start: 546 Length: 18 Tick: 80 - die7: ivan + die7: + Filename: ivan.shp Start: 494 Length: 11 Tick: 80 - chrono-overlay: chronofade_small + chrono-overlay: + Filename: chronofade_small.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 Tick: 80 - icon: ivanicon + icon: + Filename: ivanicon.shp brut: - Defaults: brut + Defaults: Offset: 0, -5 - stand: brut + stand: + Filename: brut.shp Facings: 8 - run: brut + run: + Filename: brut.shp Start: 8 Length: 4 Facings: 8 Tick: 160 - bash: brut + bash: + Filename: brut.shp Start: 40 Length: 6 Facings: 8 Tick: 100 - idle1: brut + parachute: + Filename: brut.shp + Start: 3 + idle1: + Filename: brut.shp Start: 88 Length: 9 Tick: 100 - idle2: brut + idle2: + Filename: brut.shp Start: 97 Length: 9 Tick: 100 - make: brut + make: + Filename: brut.shp Start: 156 Length: 14 Tick: 80 - die1: brut + die1: + Filename: brut.shp Start: 106 Length: 8 Tick: 100 - die2: brut + die2: + Filename: brut.shp Start: 114 Length: 9 Tick: 100 - die5: brut + die5: + Filename: brut.shp Start: 144 Length: 12 Tick: 80 - die6: brut + die6: + Filename: brut.shp Start: 131 Length: 13 Tick: 40 - die10: brut + die8: + Filename: chronozapTD.shp + Length: * + BlendMode: Alpha + die10: + Filename: brut.shp Start: 123 Length: 8 Tick: 100 - chrono-overlay: chronofade_small + chrono-overlay: + Filename: chronofade_small.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 Tick: 80 - icon: bruticon + icon: + Filename: bruticon.shp Offset: 0, 0 -xo: - Inherits: ^VehicleOverlays - Defaults: xo - Offset: 0, 0 - idle: xo - Facings: 8 - move: xo - Start: 8 - Length: 4 - Facings: 8 - Tick: 200 - shoot: xo - Start: 40 - Length: 2 - Facings: 8 - Tick: 40 - descend: xo - Start: 56 - Facings: 8 - Length: 3 - muzzle: minigun - Length: 6 - Facings: 8 - chrono-overlay: chronofade_small - Length: * - BlendMode: Additive - UseTilesetCode: false - ZOffset: 512 - Tick: 80 - bh: Inherits: ^CommonDeaths - stand: bh + stand: + Filename: bh.shp Facings: 8 - stand2: bh + stand2: + Filename: bh.shp Start: 8 Facings: 8 - run: bh + run: + Filename: bh.shp Start: 16 Length: 6 Facings: 8 Tick: 100 - shoot: bh + shoot: + Filename: bh.shp Start: 64 Length: 16 Facings: 8 - liedown: bh + liedown: + Filename: bh.shp Start: 192 Length: 2 Facings: 8 - standup: bh + standup: + Filename: bh.shp Start: 240 Length: 2 Facings: 8 - prone-stand: bh + prone-stand: + Filename: bh.shp Start: 208 Stride: 4 Facings: 8 - prone-stand2: bh + prone-stand2: + Filename: bh.shp Start: 208 Stride: 4 Facings: 8 - prone-run: bh + prone-run: + Filename: bh.shp Start: 208 Length: 4 Facings: 8 Tick: 100 - prone-shoot: bh + prone-shoot: + Filename: bh.shp Start: 256 Length: 16 Facings: 8 - idle1: bh + parachute: + Filename: bh.shp + Start: 622 + idle1: + Filename: bh.shp Start: 384 Length: 16 Tick: 120 - idle2: bh + idle2: + Filename: bh.shp Start: 400 Length: 16 Tick: 120 - cheer: bh + cheer: + Filename: bh.shp Start: 588 Length: 3 Facings: 8 Tick: 120 - die1: bh + die1: + Filename: bh.shp Start: 509 Length: 9 Tick: 80 - die2: bh + die2: + Filename: bh.shp Start: 518 Length: 8 Tick: 80 - die3: bh + die3: + Filename: bh.shp Start: 526 Length: 8 Tick: 80 - die4: bh + die4: + Filename: bh.shp Start: 534 Length: 12 Tick: 80 - die5: bh + die5: + Filename: bh.shp Start: 546 Length: 18 Tick: 80 - die7: bh - Start: 494 - Length: 10 + die7: + Filename: bh.shp + Start: 509 + Length: 9 Tick: 80 muzzle: Combine: - flame-n: + 0: + Filename: flame-n.shp Length: * Offset: 1,6 - flame-nw: + 1: + Filename: flame-nw.shp Length: * Offset: 8,7 - flame-w: + 2: + Filename: flame-w.shp Length: * Offset: 8,2 - flame-sw: + 3: + Filename: flame-sw.shp Length: * Offset: 7,-2 - flame-s: + 4: + Filename: flame-s.shp Length: * Offset: 1,-2 - flame-se: + 5: + Filename: flame-se.shp Length: * Offset: -5,-2 - flame-e: + 6: + Filename: flame-e.shp Length: * Offset: -7,2 - flame-ne: + 7: + Filename: flame-ne.shp Length: * Offset: -7,8 Facings: 8 Length: 13 - chrono-overlay: chronofade_small + chrono-overlay: + Filename: chronofade_small.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 Tick: 80 - icon: bhicon + icon: + Filename: bhicon.shp shad: Inherits: ^CommonDeaths - stand: shad + stand: + Filename: shad.shp Facings: 8 - stand2: shad + stand2: + Filename: shad.shp Start: 8 Facings: 8 - run: shad + run: + Filename: shad.shp Start: 16 Length: 6 Facings: 8 Tick: 100 - shoot: shad + shoot: + Filename: shad.shp Start: 64 Length: 8 Facings: 8 - throw: shad + throw: + Filename: shad.shp Start: 342 Length: 20 Facings: 8 - idle1: shad + parachute: + Filename: shad.shp + Start: 3 + idle1: + Filename: shad.shp Start: 256 Length: 14 Tick: 120 - idle2: shad + idle2: + Filename: shad.shp Start: 271 Length: 16 Tick: 120 - die1: shad + die1: + Filename: shad.shp Start: 288 Length: 8 - die2: shad + die2: + Filename: shad.shp Start: 296 Length: 8 - die3: shad + die3: + Filename: shad.shp Start: 304 Length: 8 - die4: shad + die4: + Filename: shad.shp Start: 312 Length: 12 - die5: shad + die5: + Filename: shad.shp Start: 324 Length: 18 - die7: shad + die7: + Filename: shad.shp Start: 288 Length: 8 - prone-stand: shad + prone-stand: + Filename: shad.shp Start: 144 Stride: 4 Facings: 8 - prone-stand2: shad + prone-stand2: + Filename: shad.shp Start: 144 Stride: 4 Facings: 8 - prone-run: shad + prone-run: + Filename: shad.shp Start: 144 Length: 4 Facings: 8 Tick: 100 - prone-shoot: shad + prone-shoot: + Filename: shad.shp Start: 192 Length: 8 Facings: 8 - prone-throw: shad + prone-throw: + Filename: shad.shp Start: 501 Length: 12 Facings: 8 - chrono-overlay: chronofade_small + chrono-overlay: + Filename: chronofade_small.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 Tick: 80 - mind-overlay: mindanim + mind-overlay: + Filename: mindanim.shp Length: * Tick: 200 BlendMode: Alpha Offset: 0, 0 - icon: spyicon + icon: + Filename: shadteamicon.shp sgli: Inherits: ^VehicleOverlays - idle: sgli + idle: + Filename: sgli.shp UseClassicFacings: true Facings: 32 - icon: yakicon + dead: + Filename: corpse1.tem + TilesetFilenames: + SNOW: corpse1.sno + BARREN: corpse1.bar + Length: 6 + Tick: 1600 + ZOffset: -511 sgli.destroyed: Inherits: ^VehicleOverlays - idle: sgli + idle: + Filename: sgli.shp Facings: 32 Start: 32 UseClassicFacings: true ZOffset: -1024 + +yuri: + Inherits: ^CommonDeaths + stand: + Filename: yuri.shp + Facings: 8 + run: + Filename: yuri.shp + Start: 8 + Length: 6 + Facings: 8 + Tick: 100 + parachute: + Filename: yuri.shp + Start: 3 + idle: + Filename: yuri.shp + Start: 120 + Length: 19 + Tick: 120 + shoot: + Filename: yuria.shp + Length: 2 + Tick: 140 + Facings: 8 + deployed: + Filename: yurib.shp + Length: 9 + Tick: 160 + mc: + Filename: mindcontroller.shp + Length: * + Tick: 120 + BlendMode: Alpha + Offset: 0, 0 + die1: + Filename: yuri.shp + Start: 139 + Length: 8 + die2: + Filename: yuri.shp + Start: 147 + Length: 8 + die3: + Filename: yuri.shp + Start: 155 + Length: 8 + die4: + Filename: yuri.shp + Start: 163 + Length: 12 + die5: + Filename: yuri.shp + Start: 175 + Length: 18 + die7: + Filename: yuri.shp + Start: 139 + Length: 8 + prone-stand: + Filename: yuri.shp + Start: 72 + Stride: 4 + Facings: 8 + prone-run: + Filename: yuri.shp + Start: 72 + Length: 4 + Facings: 8 + Tick: 80 + prone-shoot: + Filename: yuric.shp + Length: 2 + Tick: 140 + Facings: 8 + chrono-overlay: + Filename: chronofade_small.shp + Length: * + BlendMode: Additive + Offset: 0, 0 + ZOffset: 512 + Tick: 80 + mind-overlay: + Filename: mindanim.shp + Length: * + Tick: 200 + BlendMode: Alpha + Offset: 0, 0 + icon: + Filename: yuriicon.shp + +cmec: + Inherits: ^CommonDeaths + stand: + Filename: cmec.shp + Facings: 8 + stand2: + Filename: cmec.shp + Start: 8 + Facings: 8 + run: + Filename: cmec.shp + Start: 16 + Length: 6 + Facings: 8 + Tick: 100 + repair: + Filename: cmec.shp + Start: 64 + Length: 20 + Facings: 8 + liedown: + Filename: cmec.shp + Start: 224 + Length: 2 + Facings: 8 + standup: + Filename: cmec.shp + Start: 272 + Length: 2 + Facings: 8 + prone-stand: + Filename: cmec.shp + Start: 240 + Stride: 4 + Facings: 8 + prone-stand2: + Filename: cmec.shp + Start: 240 + Stride: 4 + Facings: 8 + prone-run: + Filename: cmec.shp + Start: 240 + Length: 4 + Facings: 8 + Tick: 100 + prone-throw: + Filename: cmec.shp + Start: 288 + Length: 12 + Facings: 8 + parachute: + Filename: cmec.shp + Start: 599 + idle1: + Filename: cmec.shp + Start: 625 + Length: 7 + Tick: 120 + idle2: + Filename: cmec.shp + Start: 400 + Length: 13 + Tick: 120 + cheer: + Filename: cmec.shp + Start: 588 + Length: 3 + Facings: 8 + Tick: 120 + die1: + Filename: cmec.shp + Start: 509 + Length: 9 + Tick: 80 + die2: + Filename: cmec.shp + Start: 518 + Length: 8 + Tick: 80 + die3: + Filename: cmec.shp + Start: 526 + Length: 8 + Tick: 80 + die4: + Filename: cmec.shp + Start: 534 + Length: 12 + Tick: 80 + die5: + Filename: cmec.shp + Start: 546 + Length: 18 + Tick: 80 + die7: + Filename: cmec.shp + Start: 494 + Length: 11 + Tick: 80 + chrono-overlay: + Filename: chronofade_small.shp + Length: * + BlendMode: Additive + Offset: 0, 0 + ZOffset: 512 + Tick: 80 + mind-overlay: + Filename: mindanim.shp + Length: * + Tick: 200 + BlendMode: Alpha + Offset: 0, 0 + icon: + Filename: cmecicon.shp + +rmbc: + Inherits: ^CommonDeaths + stand: + Filename: rmbc.shp + Facings: 8 + stand2: + Filename: rmbc.shp + Facings: 8 + Start: 8 + run: + Filename: rmbc.shp + Start: 16 + Length: 6 + Facings: 8 + Tick: 120 + shoot: + Filename: rmbc.shp + Start: 64 + Length: 4 + Facings: 8 + Tick: 60 + idle: + Filename: rmbc.shp + Start: 96 + Length: 8 + Tick: 160 + idle2: + Filename: rmbc.shp + Start: 104 + Length: 8 + Tick: 160 + die1: + Filename: rmbc.shp + Start: 111 + Length: 14 + Tick: 80 + die2: + Filename: rmbc.shp + Start: 125 + Length: 12 + die3: + Filename: rmbc.shp + Start: 125 + Length: 12 + die4: + Filename: rmbc.shp + Start: 125 + Length: 12 + die5: + Filename: rmbc.shp + Start: 125 + Length: 12 + die7: + Filename: rmbc.shp + Start: 125 + Length: 12 + parachute: + Filename: rmbc.shp + Start: 3 + chrono-overlay: + Filename: chronofade_small.shp + Length: * + BlendMode: Additive + Offset: 0, 0 + ZOffset: 512 + Tick: 80 + emp-overlay: + Filename: emp_fx02.shp + Length: * + BlendMode: Additive + Offset: 0, -5 + ZOffset: 512 + icon: + Filename: rmbcicnh.shp + +enli: + Inherits: ^CommonDeaths + stand: + Filename: enli.shp + Facings: 8 + stand2: + Filename: enli.shp + Facings: 8 + Start: 8 + run: + Filename: enli.shp + Start: 16 + Length: 6 + Facings: 8 + Tick: 120 + shoot: + Filename: enli.shp + Start: 64 + Length: 4 + Facings: 8 + Tick: 60 + idle: + Filename: enli.shp + Start: 96 + Length: 8 + Tick: 160 + idle2: + Filename: enli.shp + Start: 104 + Length: 8 + Tick: 160 + die1: + Filename: enli.shp + Start: 111 + Length: 14 + Tick: 80 + die2: + Filename: enli.shp + Start: 125 + Length: 12 + die3: + Filename: enli.shp + Start: 125 + Length: 12 + die4: + Filename: enli.shp + Start: 125 + Length: 12 + die5: + Filename: enli.shp + Start: 125 + Length: 12 + die7: + Filename: enli.shp + Start: 125 + Length: 12 + parachute: + Filename: enli.shp + Start: 3 + chrono-overlay: + Filename: chronofade_small.shp + Length: * + BlendMode: Additive + Offset: 0, 0 + ZOffset: 512 + Tick: 80 + emp-overlay: + Filename: emp_fx02.shp + Length: * + BlendMode: Additive + Offset: 0, -5 + ZOffset: 512 + icon: + Filename: enliicnh.shp + +tplr: + Inherits: ^CommonDeaths + stand: + Filename: tplr.shp + Facings: 8 + stand2: + Filename: tplr.shp + Facings: 8 + Start: 8 + run: + Filename: tplr.shp + Start: 16 + Length: 6 + Facings: 8 + Tick: 120 + shoot: + Filename: tplr.shp + Start: 64 + Length: 4 + Facings: 8 + Tick: 60 + idle: + Filename: tplr.shp + Start: 96 + Length: 8 + Tick: 160 + idle2: + Filename: tplr.shp + Start: 104 + Length: 8 + Tick: 160 + die1: + Filename: tplr.shp + Start: 111 + Length: 14 + Tick: 80 + die2: + Filename: tplr.shp + Start: 125 + Length: 12 + die3: + Filename: tplr.shp + Start: 125 + Length: 12 + die4: + Filename: tplr.shp + Start: 125 + Length: 12 + die5: + Filename: tplr.shp + Start: 125 + Length: 12 + die7: + Filename: tplr.shp + Start: 125 + Length: 12 + parachute: + Filename: tplr.shp + Start: 3 + chrono-overlay: + Filename: chronofade_small.shp + Length: * + BlendMode: Additive + Offset: 0, 0 + ZOffset: 512 + Tick: 80 + emp-overlay: + Filename: emp_fx02.shp + Length: * + BlendMode: Additive + Offset: 0, -5 + ZOffset: 512 + icon: + Filename: tplricnh.shp + +cmsr: + Inherits: ^CommonDeaths + Defaults: + Filename: cmsr.shp + stand: + Facings: 8 + stand2: + Start: 8 + Facings: 8 + run: + Start: 16 + Length: 6 + Facings: 8 + Tick: 100 + shoot: + Start: 64 + Length: 8 + Facings: 8 + parachute: + Start: 3 + idle1: + Start: 256 + Length: 14 + Tick: 120 + idle2: + Start: 271 + Length: 16 + Tick: 120 + die1: + Start: 288 + Length: 8 + die2: + Start: 296 + Length: 8 + die3: + Start: 304 + Length: 8 + die4: + Start: 312 + Length: 12 + die5: + Start: 324 + Length: 18 + die7: + Start: 288 + Length: 8 + prone-stand: + Start: 144 + Stride: 4 + Facings: 8 + prone-stand2: + Start: 144 + Stride: 4 + Facings: 8 + prone-run: + Start: 144 + Length: 4 + Facings: 8 + Tick: 100 + prone-shoot: + Start: 192 + Length: 8 + Facings: 8 + garrison-muzzle: + Filename: minigun16.shp + Length: 6 + Facings: 16 + chrono-overlay: + Filename: chronofade_small.shp + Length: * + BlendMode: Additive + Offset: 0, 0 + ZOffset: 512 + Tick: 80 + mind-overlay: + Filename: mindanim.shp + Length: * + Tick: 200 + BlendMode: Alpha + Offset: 0, 0 + icon: + Filename: cmsricon.shp + +ztrp: + Inherits: ^CommonDeaths + stand: + Filename: ztrp.shp + Facings: 8 + stand2: + Filename: ztrp.shp + Start: 8 + Facings: 8 + run: + Filename: ztrp.shp + Start: 16 + Length: 6 + Facings: 8 + Tick: 120 + jump: + Filename: ztrp.shp + Start: 137 + Length: 1 + Facings: 8 + shoot: + Filename: ztrp.shp + Start: 64 + Length: 4 + Facings: 8 + Tick: 60 + idle: + Filename: ztrp.shp + Start: 96 + Length: 8 + Tick: 160 + idle2: + Filename: ztrp.shp + Start: 104 + Length: 8 + Tick: 160 + die1: + Filename: ztrp.shp + Start: 111 + Length: 14 + Tick: 80 + die2: + Filename: ztrp.shp + Start: 125 + Length: 12 + die3: + Filename: ztrp.shp + Start: 125 + Length: 12 + die4: + Filename: ztrp.shp + Start: 125 + Length: 12 + die5: + Filename: ztrp.shp + Start: 125 + Length: 12 + die7: + Filename: ztrp.shp + Start: 125 + Length: 12 + parachute: + Filename: ztrp.shp + Start: 3 + chrono-overlay: + Filename: chronofade_small.shp + Length: * + BlendMode: Additive + Offset: 0, 0 + ZOffset: 512 + Tick: 80 + emp-overlay: + Filename: emp_fx02.shp + Length: * + BlendMode: Additive + Offset: 0, -5 + ZOffset: 512 + icon: + Filename: ztrpicnh.shp + +zrai: + Inherits: ^CommonDeaths + stand: + Filename: zrai.shp + Facings: 8 + stand2: + Filename: zrai.shp + Facings: 8 + Start: 8 + run: + Filename: zrai.shp + Start: 16 + Length: 6 + Facings: 8 + Tick: 120 + jump: + Filename: zrai.shp + Start: 137 + Length: 1 + Facings: 8 + shoot: + Filename: zrai.shp + Start: 64 + Length: 4 + Facings: 8 + Tick: 60 + idle: + Filename: zrai.shp + Start: 96 + Length: 8 + Tick: 160 + idle2: + Filename: zrai.shp + Start: 104 + Length: 8 + Tick: 160 + die1: + Filename: zrai.shp + Start: 111 + Length: 14 + Tick: 80 + die2: + Filename: zrai.shp + Start: 125 + Length: 12 + die3: + Filename: zrai.shp + Start: 125 + Length: 12 + die4: + Filename: zrai.shp + Start: 125 + Length: 12 + die5: + Filename: zrai.shp + Start: 125 + Length: 12 + die7: + Filename: zrai.shp + Start: 125 + Length: 12 + parachute: + Filename: zrai.shp + Start: 3 + chrono-overlay: + Filename: chronofade_small.shp + Length: * + BlendMode: Additive + Offset: 0, 0 + ZOffset: 512 + Tick: 80 + emp-overlay: + Filename: emp_fx02.shp + Length: * + BlendMode: Additive + Offset: 0, -5 + ZOffset: 512 + icon: + Filename: zraiicnh.shp + +zdef: + Inherits: ^CommonDeaths + stand: + Filename: zdef.shp + Facings: 8 + stand2: + Filename: zdef.shp + Facings: 8 + Start: 8 + run: + Filename: zdef.shp + Start: 16 + Length: 6 + Facings: 8 + Tick: 120 + jump: + Filename: zdef.shp + Start: 137 + Length: 1 + Facings: 8 + shoot: + Filename: zdef.shp + Start: 64 + Length: 4 + Facings: 8 + Tick: 60 + idle: + Filename: zdef.shp + Start: 96 + Length: 8 + Tick: 160 + idle2: + Filename: zdef.shp + Start: 104 + Length: 8 + Tick: 160 + die1: + Filename: zdef.shp + Start: 111 + Length: 14 + Tick: 80 + die2: + Filename: zdef.shp + Start: 125 + Length: 12 + die3: + Filename: zdef.shp + Start: 125 + Length: 12 + die4: + Filename: zdef.shp + Start: 125 + Length: 12 + die5: + Filename: zdef.shp + Start: 125 + Length: 12 + die7: + Filename: zdef.shp + Start: 125 + Length: 12 + parachute: + Filename: zdef.shp + Start: 3 + chrono-overlay: + Filename: chronofade_small.shp + Length: * + BlendMode: Additive + Offset: 0, 0 + ZOffset: 512 + Tick: 80 + emp-overlay: + Filename: emp_fx02.shp + Length: * + BlendMode: Additive + Offset: 0, -5 + ZOffset: 512 + icon: + Filename: zdeficnh.shp + +tigr: + Inherits: ^CommonDeaths + Defaults: + Filename: tigr.shp + stand: + Facings: 8 + stand2: + Facings: 8 + run: + Start: 16 + Length: 6 + Facings: 8 + Tick: 120 + shoot: + Start: 64 + Length: 4 + Facings: 8 + Tick: 60 + idle: + Start: 96 + Length: 8 + Tick: 160 + idle2: + Start: 104 + Length: 8 + Tick: 160 + die1: + Start: 111 + Length: 14 + Tick: 80 + die2: + Start: 125 + Length: 12 + die3: + Start: 125 + Length: 12 + die4: + Start: 125 + Length: 12 + die5: + Start: 125 + Length: 12 + die7: + Start: 125 + Length: 12 + parachute: + Start: 3 + chrono-overlay: + Filename: chronofade_small.shp + Length: * + BlendMode: Additive + Offset: 0, 0 + ZOffset: 512 + Tick: 80 + emp-overlay: + Filename: emp_fx02.shp + Length: * + BlendMode: Additive + Offset: 0, -5 + ZOffset: 512 + icon: + Filename: tigricon.shp + +cryt: + Inherits: ^CommonDeaths + stand: + Filename: cryt.shp + Facings: 8 + stand2: + Filename: cryt.shp + Start: 8 + Facings: 8 + run: + Filename: cryt.shp + Start: 16 + Length: 6 + Facings: 8 + Tick: 120 + shoot: + Filename: cryt.shp + Start: 64 + Length: 4 + Facings: 8 + Tick: 60 + idle: + Filename: cryt.shp + Start: 96 + Length: 8 + Tick: 160 + idle2: + Filename: cryt.shp + Start: 104 + Length: 8 + Tick: 160 + die1: + Filename: cryt.shp + Start: 111 + Length: 14 + Tick: 80 + die2: + Filename: cryt.shp + Start: 125 + Length: 12 + die3: + Filename: cryt.shp + Start: 125 + Length: 12 + die4: + Filename: cryt.shp + Start: 125 + Length: 12 + die5: + Filename: cryt.shp + Start: 125 + Length: 12 + die7: + Filename: cryt.shp + Start: 125 + Length: 12 + parachute: + Filename: cryt.shp + Start: 3 + chrono-overlay: + Filename: chronofade_small.shp + Length: * + BlendMode: Additive + Offset: 0, 0 + ZOffset: 512 + Tick: 80 + emp-overlay: + Filename: emp_fx02.shp + Length: * + BlendMode: Additive + Offset: 0, -5 + ZOffset: 512 + icon: + Filename: cryticon.shp + +enfo: + Inherits: ^CommonDeaths + stand: + Filename: enfo.shp + Facings: 8 + stand2: + Filename: enfo.shp + Facings: 8 + run: + Filename: enfo.shp + Start: 16 + Length: 6 + Facings: 8 + Tick: 120 + shoot: + Filename: enfo.shp + Start: 64 + Length: 4 + Facings: 8 + Tick: 60 + idle: + Filename: enfo.shp + Start: 96 + Length: 8 + Tick: 160 + idle2: + Filename: enfo.shp + Start: 104 + Length: 8 + Tick: 160 + die1: + Filename: enfo.shp + Start: 111 + Length: 14 + Tick: 80 + die2: + Filename: enfo.shp + Start: 125 + Length: 12 + die3: + Filename: enfo.shp + Start: 125 + Length: 12 + die4: + Filename: enfo.shp + Start: 125 + Length: 12 + die5: + Filename: enfo.shp + Start: 125 + Length: 12 + die7: + Filename: enfo.shp + Start: 125 + Length: 12 + parachute: + Filename: enfo.shp + Start: 3 + chrono-overlay: + Filename: chronofade_small.shp + Length: * + BlendMode: Additive + Offset: 0, 0 + ZOffset: 512 + Tick: 80 + emp-overlay: + Filename: emp_fx02.shp + Length: * + BlendMode: Additive + Offset: 0, -5 + ZOffset: 512 + icon: + Filename: enfoicon.shp + +hopl: + Inherits: ^CommonDeaths + stand: + Filename: hopl.shp + Facings: 8 + stand2: + Filename: hopl.shp + Start: 8 + Facings: 8 + run: + Filename: hopl.shp + Start: 16 + Length: 6 + Facings: 8 + Tick: 120 + shoot: + Filename: hopl.shp + Start: 64 + Length: 4 + Facings: 8 + Tick: 60 + idle: + Filename: hopl.shp + Start: 96 + Length: 8 + Tick: 160 + idle2: + Filename: hopl.shp + Start: 104 + Length: 8 + Tick: 160 + die1: + Filename: hopl.shp + Start: 111 + Length: 14 + Tick: 80 + die2: + Filename: hopl.shp + Start: 125 + Length: 12 + die3: + Filename: hopl.shp + Start: 125 + Length: 12 + die4: + Filename: hopl.shp + Start: 125 + Length: 12 + die5: + Filename: hopl.shp + Start: 125 + Length: 12 + die7: + Filename: hopl.shp + Start: 125 + Length: 12 + parachute: + Filename: hopl.shp + Start: 3 + chrono-overlay: + Filename: chronofade_small.shp + Length: * + BlendMode: Additive + Offset: 0, 0 + ZOffset: 512 + Tick: 80 + emp-overlay: + Filename: emp_fx02.shp + Length: * + BlendMode: Additive + Offset: 0, -5 + ZOffset: 512 + icon: + Filename: hoplicon.shp + +assa: + Inherits: ^CommonDeaths + stand: + Filename: assa.shp + Facings: 8 + run: + Filename: assa.shp + Start: 8 + Length: 6 + Facings: 8 + Tick: 80 + shoot: + Filename: assa.shp + Frames: 57,56,57,57,57,58,60,59,60,60,60,61,63,62,63,63,63,64,66,65,66,66,66,67,69,68,69,69,69,70,72,71,72,72,72,73,75,74,75,75,75,76,78,77,78,78,78,79 + Length: 6 + Facings: 8 + parachute: + Filename: assa.shp + Start: 3 + idle1: + Filename: assa.shp + Frames: 168,169,170,171,172,173,173,173,174,174,175,176,177,178,179,180 + Length: * + Tick: 120 + idle2: + Filename: assa.shp + Start: 181 + Length: 9 + Tick: 120 + die1: + Filename: assa.shp + Start: 190 + Length: 8 + die2: + Filename: assa.shp + Start: 198 + Length: 8 + die3: + Filename: assa.shp + Start: 206 + Length: 8 + die4: + Filename: assa.shp + Start: 214 + Length: 12 + die5: + Filename: assa.shp + Start: 226 + Length: 18 + die7: + Filename: assa.shp + Start: 190 + Length: 8 + prone-stand: + Filename: assa.shp + Start: 96 + Stride: 4 + Facings: 8 + prone-run: + Filename: assa.shp + Start: 96 + Length: 4 + Facings: 8 + Tick: 80 + prone-shoot: + Filename: assa.shp + Start: 144 + Length: 3 + Facings: 8 + garrison-muzzle: + Filename: minigun16.shp + Length: 3 + Stride: 6 + Facings: 16 + chrono-overlay: + Filename: chronofade_small.shp + Length: * + BlendMode: Additive + Offset: 0, 0 + ZOffset: 512 + Tick: 80 + icon: + Filename: assaicnh.shp + +conf: + Inherits: ^CommonDeaths + stand: + Filename: conf.shp + Facings: 8 + stand2: + Filename: conf.shp + Start: 8 + Facings: 8 + run: + Filename: conf.shp + Start: 16 + Length: 6 + Facings: 8 + Tick: 100 + shoot: + Frames: 66, 67, 68, 69, 70, 71, 72, 73, 82, 83, 84, 85, 86, 87, 88, 89, 98, 99, 100, 101, 102, 103, 104, 105, 114, 115, 116, 117, 118, 119, 120, 121, 130, 131, 132, 133, 134, 135, 136, 137, 146, 147, 148, 149, 150, 151, 152, 153, 162, 163, 164, 165, 166, 167, 168, 169, 178, 179, 180, 181, 182, 183, 184, 185 + Filename: conf.shp + Length: 8 + Facings: 8 + liedown: + Filename: conf.shp + Start: 192 + Length: 2 + Facings: 8 + standup: + Filename: conf.shp + Start: 240 + Length: 2 + Facings: 8 + prone-stand: + Filename: conf.shp + Start: 208 + Stride: 4 + Facings: 8 + prone-stand2: + Filename: conf.shp + Start: 208 + Stride: 4 + Facings: 8 + prone-run: + Filename: conf.shp + Start: 208 + Length: 4 + Facings: 8 + Tick: 100 + prone-shoot: + Filename: conf.shp + Start: 256 + Length: 16 + Facings: 8 + parachute: + Filename: conf.shp + Start: 530 + idle1: + Filename: conf.shp + Start: 384 + Length: 16 + Tick: 120 + idle2: + Filename: conf.shp + Start: 400 + Length: 16 + Tick: 120 + cheer: + Filename: conf.shp + Start: 496 + Length: 3 + Facings: 8 + Tick: 120 + die1: + Filename: conf.shp + Start: 417 + Length: 9 + Tick: 80 + die2: + Filename: conf.shp + Start: 426 + Length: 8 + Tick: 80 + die3: + Filename: conf.shp + Start: 434 + Length: 8 + Tick: 80 + die4: + Filename: conf.shp + Start: 442 + Length: 12 + Tick: 80 + die5: + Filename: conf.shp + Start: 454 + Length: 18 + Tick: 80 + die7: + Filename: conf.shp + Start: 417 + Length: 9 + Tick: 80 + garrison-muzzle: + Filename: minigun16.shp + Length: 6 + Facings: 16 + chrono-overlay: + Filename: chronofade_small.shp + Length: * + BlendMode: Additive + Offset: 0, 0 + ZOffset: 512 + Tick: 80 + icon: + Filename: confcabalicnh.shp + +reap: + Inherits: ^VehicleOverlays + stand: + Filename: reap.shp + Facings: 8 + stand2: + Filename: reap.shp + Facings: 8 + run: + Filename: reap.shp + Start: 8 + Length: 4 + Facings: 8 + Tick: 120 + shoot: + Filename: reap.shp + Facings: 8 + muzzle: + Filename: gunfire2.shp + Length: 2 + parachute: + Filename: reap.shp + Start: 3 + chrono-overlay: + Filename: chronofade_small.shp + Length: * + BlendMode: Additive + Offset: 0, 0 + ZOffset: 512 + Tick: 80 + die: + Filename: reap.shp + Start: 40 + Length: 9 + Tick: 80 + icon: + Filename: reapicnh.shp diff --git a/mods/ca/sequences/misc.yaml b/mods/ca/sequences/misc.yaml index a9c959979e..06634b9ba1 100644 --- a/mods/ca/sequences/misc.yaml +++ b/mods/ca/sequences/misc.yaml @@ -1,352 +1,761 @@ clock: - idle: clock + idle: + Filename: clock.shp Length: * powerdown: - disabled: speed + disabled: + Filename: speed.shp Start: 3 ZOffset: 2047 120mm: - idle: 120mm - ZOffset: 1023 + idle: + Filename: 120mm.shp + ZOffset: 2046 IgnoreWorldTint: true 120mmheat: - idle: 120mmheat - ZOffset: 1023 + idle: + Filename: 120mmheat.shp + ZOffset: 2046 IgnoreWorldTint: true 120mmheatn: - idle: 120mmheatn - ZOffset: 1023 + idle: + Filename: 120mmheatn.shp + ZOffset: 2046 Facings: 32 IgnoreWorldTint: true 183mm: - idle: 183mm - ZOffset: 1023 + idle: + Filename: 183mm.shp + ZOffset: 2046 Facings: 32 + InterpolatedFacings: 64 + IgnoreWorldTint: true + +280mma: + idle: + Filename: 280mma.shp + Length: * + ZOffset: 2046 + IgnoreWorldTint: true + +280mmn: + idle: + Filename: 280mmn.shp + Length: * + ZOffset: 2046 IgnoreWorldTint: true 380mm: - idle: 380mm - ZOffset: 1023 + idle: + Filename: 380mm.shp + ZOffset: 2046 + IgnoreWorldTint: true + +380mma: + idle: + Filename: 380mma.shp + ZOffset: 2046 IgnoreWorldTint: true 50cal: - idle: 50cal - ZOffset: 1023 + idle: + Filename: 50cal.shp + ZOffset: 2046 IgnoreWorldTint: true flakball: - idle: flakball + idle: + Filename: flakball.shp Length: * - ZOffset: 1023 + ZOffset: 2046 + +radball: + idle: + Filename: radball.shp + Length: * + ZOffset: 2046 + +cryoball: + idle: + Filename: cryoball.shp + Length: * + ZOffset: 2046 explosion: Defaults: Length: * ZOffset: 2047 IgnoreWorldTint: true - piff: piff - piffs: piffpiff - water_piff: wpiff - water_piffs: wpifpif - small_explosion: veh-hit3 - med_explosion: veh-hit2 - flak_explosion_ground: flak - small_explosion_air: flak - ZOffset: 514 - med_explosion_air: veh-hit1 - ZOffset: 514 - napalm: napalm2 - building_napalm: napalm2 + piff: + Filename: piff.shp + piff2: + Filename: piff.shp + FlipX: true + piffs: + Filename: piffpiff.shp + piffs2: + Filename: piffpiff.shp + FlipX: true + water_piff: + Filename: wpiff.shp + water_piffs: + Filename: wpifpif.shp + small_explosion: + Filename: veh-hit3.shp + small_air_explosion: + Filename: veh-hit2.shp + Scale: 0.5 + med_explosion: + Filename: veh-hit2.shp + flak_explosion_ground: + Filename: flak.shp + small_explosion_air: + Filename: flak.shp + med_explosion_air: + Filename: veh-hit1.shp + napalm: + Filename: napalm2.shp + building_napalm: + Filename: napalm2.shp FlipX: true - nuke: atomsfx - nuke2: atomsfx-big - nuke3: atomsfx-small - large_splash: h2o_exp1 - med_splash: h2o_exp2 - small_splash: h2o_exp3 - self_destruct: art-exp1 - artillery_explosion: art-exp1 - large_artillery_explosion: art-exp2 - building: fball1 + nuke: + Filename: atomsfx.shp + nuke2: + Filename: atomsfx-big.shp + nuke3: + Filename: atomsfx-small.shp + large_splash: + Filename: h2o_exp1.shp + med_splash: + Filename: h2o_exp2.shp + small_splash: + Filename: h2o_exp3.shp + self_destruct: + Filename: art-exp1.shp + artillery_explosion: + Filename: art-exp1.shp + large_artillery_explosion: + Filename: art-exp2.shp + building: + Filename: fball1.shp Offset: 0,-9 - building2: fball1 + building2: + Filename: fball1.shp Offset: 0,-9 FlipX: true - large_explosion: frag1 + large_explosion: + Filename: frag1.shp Offset: -2,0 - small_napalm: napalm1 - offseted_napalm: napalm1 # Used for E4 Explosion + small_napalm: + Filename: napalm1.shp + small_napalm_air: + Filename: fireexplodeairsm.shp + offseted_napalm: # Used for E4 Explosion + Filename: napalm1.shp Offset: 0, -6 - large_napalm: napalm3 - corpse: corpse1 + large_napalm: + Filename: napalm3.shp + large_blacknapalm: + Filename: blacknapalm3.shp + corpse: + Filename: corpse1.tem + TilesetFilenames: + SNOW: corpse1.sno + BARREN: corpse1.bar ZOffset: -512 Tick: 1600 - UseTilesetExtension: true - TilesetOverrides: - DESERT: TEMPERAT - INTERIOR: TEMPERAT - pulse_explosion: pulsefx1 + pulse_explosion: + Filename: pulsefx1.shp BlendMode: Additive Tick: 40 - pulse_explosion_small: pulsefx1_small + pulse_explosion_small: + Filename: pulsefx1_small.shp BlendMode: Additive Tick: 40 - pulse_explosion2: pulsefx2 + pulse_explosion2: + Filename: pulsefx2.shp BlendMode: Additive Tick: 40 - pulse_explosion3: mempfx + pulse_explosion3: + Filename: mempfx.shp BlendMode: Alpha Tick: 40 - ion_ring: ring1 + ion_ring: + Filename: ring1.shp BlendMode: Alpha Tick: 40 ZOffset: 2045 - ion_ring2: ring2 + ion_ring2: + Filename: ring2.shp BlendMode: Alpha Tick: 50 ZOffset: 2045 - shock_wave: ring1 + shock_wave: + Filename: ring1.shp BlendMode: Alpha Tick: 100 ZOffset: 2045 - small_chem: chemball - med_chem: chemball2 - large_chem: chemball3 - lchr_explode: lchrexplode - frag_1: frag1cnc - frag_3: frag3cnc - scud_explosion: fball1cnc + shock_wave_sm: + Filename: ring1sm.shp + BlendMode: Alpha + Tick: 60 + ZOffset: 2045 + small_chem: + Filename: chemball.shp + med_chem: + Filename: chemball2.shp + large_chem: + Filename: chemball3.shp + lchr_explode: + Filename: lchrexplode.shp + Alpha: 0.95 + lchr_coalesce: + Filename: lchrexplode.shp + Frames: 6,5,4,3,2,1,0 + ZOffset: 2048 + Alpha: 0.65 + frag_1: + Filename: frag1cnc.shp + frag_3: + Filename: frag3cnc.shp + scud_explosion: + Filename: fball1cnc.shp Offset: -2,0 - gasring: gasring + gasring: + Filename: gasring.shp BlendMode: Additive Tick: 70 ZOffset: 512 - gasring2: cdgas + gasring2: + Filename: cdgas.shp BlendMode: Alpha Tick: 70 ZOffset: 512 - chaosexplosion: chaosexplode + chaosexplosion: + Filename: chaosexplode.shp BlendMode: Alpha - gmutation: gmutation + gmutation: + Filename: gmutation.shp BlendMode: Alpha Tick: 40 - ironcurtain_effect: ironcureffect + ironcurtain_effect: + Filename: ironcureffect.shp BlendMode: Additive Tick: 85 ZOffset: 512 Offset: 2, 15 - forceshield_effect: forceshield + forceshield_effect: + Filename: forceshield.shp BlendMode: Alpha Tick: 85 ZOffset: 512 Offset: 2, 15 - chronowarp_effect: chronoblast + chronowarp_effect: + Filename: chronoblast.shp BlendMode: Alpha Tick: 85 ZOffset: 2046 - chronowarpbig_effect: chronoblastbig + chronowarpbig_effect: + Filename: chronoblastbig.shp BlendMode: Alpha Tick: 85 ZOffset: 2046 - chrono_zap: chronozap - chaos_bomb: chaoswave + chrono_zap: + Filename: chronozap.shp + chaos_bomb: + Filename: chaoswave.shp BlendMode: Alpha Tick: 70 ZOffset: 2046 - tsla_bomb: tslabomb - stealthbub: plxplo + tsla_bomb: + Filename: tslabomb.shp + stealthbub: + Filename: plxplo.shp BlendMode: Additive Tick: 70 ZOffset: 2046 - chem_miss: twlt070 + chem_miss: + Filename: twlt070.shp Tick: 70 ZOffset: 2046 Offset: 0, 0, 36 - ionexp: ionexp + ionexp: + Filename: ionexp.shp Tick: 110 ZOffset: 2046 Offset: 0, -1, 0 - b2bexp: b2bexp + b2bexp: + Filename: b2bexp.shp BlendMode: Additive Tick: 90 ZOffset: 2046 Offset: 0, -35, 0 - b2bexp2: b2bexp + b2bexp2: + Filename: b2bexp.shp BlendMode: Additive Tick: 90 ZOffset: 2046 FlipX: true Offset: 0, -35, 0 - ionbeam: ionbeam + ionbeam: + Filename: ionbeam.shp Offset: -1, -210, 60 ZRamp: 1 Tick: 40 BlendMode: Additive - ionbeam2: ionbeam + ionbeam2: + Filename: ionbeam.shp Offset: -1, -450, 60 ZRamp: 1 Tick: 40 BlendMode: Additive - ionbeam3: ionbeam + ionbeam3: + Filename: ionbeam.shp Offset: -1, -690, 60 ZRamp: 1 Tick: 40 BlendMode: Additive - ionbeam4: ionbeam + ionbeam4: + Filename: ionbeam.shp Offset: -1, -930, 60 ZRamp: 1 Tick: 40 BlendMode: Additive - ionbeam5: ionbeam + ionbeam5: + Filename: ionbeam.shp Offset: -1, -1170, 60 ZRamp: 1 Tick: 60 BlendMode: Additive - ionbeam6: ionbeam + ionbeam6: + Filename: ionbeam.shp Offset: -1, -1410, 60 ZRamp: 1 Tick: 40 BlendMode: Additive - weathercloud1: wccloud1 + weathercloud1: + Filename: wccloud1.shp ZOffset: 2046 Offset: 0, 50, 60 ZRamp: 1 - weathercloud2: wccloud2 + weathercloud2: + Filename: wccloud2.shp ZOffset: 2046 Offset: 0, 50, 60 ZRamp: 1 - weathercloud1f: wccloud1 + weathercloud1f: + Filename: wccloud1.shp FlipX: true ZOffset: 2046 Offset: 0, 50, 60 ZRamp: 1 - weathercloud2f: wccloud2 + weathercloud2f: + Filename: wccloud2.shp FlipX: true ZOffset: 2046 Offset: 0, 50, 60 ZRamp: 1 - weatherbolt1: wclbolt1 - weatherbolt2: wclbolt2 - weatherbolt3: wclbolt3 - weatherbolt1f: wclbolt1 + weathercloudshadow: + Filename: veilcloud.shp + BlendMode: Subtractive + ZOffset: -512 + Alpha: 0.15 + veilcloud: + Filename: veilcloud.shp + ZOffset: 2046 + ZRamp: 1 + veilcloudf: + Filename: veilcloud.shp FlipX: true - weatherbolt2f: wclbolt2 + ZOffset: 2046 + ZRamp: 1 + veilcloudsm: + Filename: veilcloudsm.shp + ZOffset: 2046 + ZRamp: 1 + veilcloudsmf: + Filename: veilcloudsm.shp FlipX: true - weatherbolt3f: wclbolt3 + ZOffset: 2046 + ZRamp: 1 + weatherbolt1: + Filename: wclbolt1.shp + weatherbolt2: + Filename: wclbolt2.shp + weatherbolt3: + Filename: wclbolt3.shp + weatherbolt1f: + Filename: wclbolt1.shp + FlipX: true + weatherbolt2f: + Filename: wclbolt2.shp + FlipX: true + weatherbolt3f: + Filename: wclbolt3.shp FlipX: true - droppod_explosion: droppody2 + droppod_explosion: + Filename: droppody2.shp Length: 8 Tick: 750 ZOffset: 0 - droppod_explosion2: droppody + droppod_explosion2: + Filename: droppody.shp Length: 8 Tick: 750 ZOffset: 0 - devastator: DATA.R8 - AddExtension: False + devastator: + Filename: DATA.R8 Start: 3947 Length: 17 BlendMode: Additive Tick: 80 ZOffset: 511 - self_destructd2k: DATA.R8 - AddExtension: False + self_destructd2k: + Filename: DATA.R8 Start: 3686 Length: 15 BlendMode: Additive Tick: 80 ZOffset: 511 - cryoblast: cryoblast + cryoblast: + Filename: cryoblast.shp BlendMode: Additive - cryohit: cryohit + cryohit: + Filename: cryohit.shp BlendMode: Additive - sonicblast1: sonicblast + sonicimpact: + Filename: sonicimpact.shp + BlendMode: Additive + Alpha: 0.75 + sonicimpactsm: + Filename: sonicimpactsm.shp + BlendMode: Additive + Alpha: 0.6 + Tick: 30 + sonicblast1: + Filename: sonicblast.shp Start: 0 Length: 9 Tick: 60 BlendMode: Additive ZOffset: 2046 - sonicblast2: sonicblast + sonicblast2: + Filename: sonicblast.shp Start: 9 Length: 9 Tick: 60 BlendMode: Additive ZOffset: 2046 - sonicpulse1: sonicpulse + sonicpulse1: + Filename: sonicpulse.shp Start: 0 Length: 10 Tick: 40 ZOffset: 2047 - sonicpulse2: sonicpulse + sonicpulse2: + Filename: sonicpulse.shp Start: 10 Length: 10 Tick: 40 ZOffset: 2048 - sonicblastupg1: sonicblastupg + sonicblastupg1: + Filename: sonicblastupg.shp Start: 0 Length: 9 Tick: 60 BlendMode: Additive ZOffset: 2046 - sonicblastupg2: sonicblastupg + sonicblastupg2: + Filename: sonicblastupg.shp Start: 9 Length: 9 Tick: 60 BlendMode: Additive ZOffset: 2046 - sonicpulseupg1: sonicpulseupg + sonicpulseupg1: + Filename: sonicpulseupg.shp Start: 0 Length: 10 Tick: 40 ZOffset: 2047 - sonicpulseupg2: sonicpulseupg + sonicpulseupg2: + Filename: sonicpulseupg.shp Start: 10 Length: 10 Tick: 40 ZOffset: 2048 - fuelbomb: moab + basiwave: + Filename: basiwave.shp + Frames: 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9 + Length: 5 + Facings: 4 + ZOffset: 2046 + InterpolatedFacings: 32 + BlendMode: Additive + Alpha: 0.3 + sonicwave1: + Filename: sonicwave.shp + Frames: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 + Start: 0 + Length: 10 + Tick: 60 + Facings: 4 + BlendMode: Additive + ZOffset: 2046 + InterpolatedFacings: 32 + Alpha: 0.18 + sonicwave2: + Filename: sonicwave.shp + Frames: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 + Start: 0 + Length: 10 + Tick: 60 + Facings: 4 + BlendMode: Additive + ZOffset: 2046 + FlipX: true + FlipY: true + InterpolatedFacings: 32 + Alpha: 0.18 + sonicwaveupg1: + Filename: sonicwaveupg.shp + Frames: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 + Start: 0 + Length: 10 + Tick: 60 + Facings: 4 + BlendMode: Additive + ZOffset: 2046 + InterpolatedFacings: 32 + Alpha: 0.22 + sonicwaveupg2: + Filename: sonicwaveupg.shp + Frames: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 + Start: 0 + Length: 10 + Tick: 60 + Facings: 4 + BlendMode: Additive + ZOffset: 2046 + FlipX: true + FlipY: true + InterpolatedFacings: 32 + Alpha: 0.22 + sonicwavedelp1: + Filename: sonicwaveupg.shp + Frames: 0, 1, 2, 3, 8, 10, 11, 12, 13, 18, 0, 1, 2, 3, 8, 10, 11, 12, 13, 18 + Start: 0 + Length: 5 + Tick: 50 + Facings: 4 + BlendMode: Additive + ZOffset: 2046 + InterpolatedFacings: 32 + Alpha: 0.32 + Scale: 0.75 + sonicwavedelp2: + Filename: sonicwaveupg.shp + Frames: 0, 1, 2, 3, 8, 10, 11, 12, 13, 18, 0, 1, 2, 3, 8, 10, 11, 12, 13, 18 + Start: 0 + Length: 5 + Tick: 50 + Facings: 4 + BlendMode: Additive + ZOffset: 2046 + FlipX: true + FlipY: true + InterpolatedFacings: 32 + Alpha: 0.32 + Scale: 0.75 + cryobeam1: + Filename: cryobeam.shp + Frames: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 + Start: 0 + Length: 10 + Tick: 60 + Facings: 4 + ZOffset: 2046 + InterpolatedFacings: 32 + BlendMode: Additive + Alpha: 0.22 + cryobeam2: + Filename: cryobeam.shp + Frames: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 + Start: 0 + Length: 10 + Tick: 60 + Facings: 4 + ZOffset: 2046 + FlipX: true + FlipY: true + InterpolatedFacings: 32 + BlendMode: Additive + Alpha: 0.22 + fuelbomb1: + Filename: moab.shp Tick: 40 - small_explosion_alt1: veh-hit-alt - Length: 14 - small_explosion_alt2: veh-hit-alt - Length: 14 - Start: 14 - small_explosion_alt3: veh-hit-alt - Length: 14 - Start: 28 - mutablast: mutablast + fuelbomb2: + Filename: moab.shp + Tick: 40 + FlipX: true + small_explosion_alt1: + Filename: veh-hit3.shp + FlipX: true + small_explosion_alt2: + Filename: veh-hit3-alt.shp + small_explosion_alt3: + Filename: veh-hit3-alt.shp + FlipX: true + mutablast: + Filename: mutablast.shp + BlendMode: Additive + mindblast: + Filename: mindblast.shp + BlendMode: Alpha + Offset: 0, -10, 60 + ZRamp: 1 + mindblastsm: + Filename: mindblastsm.shp + BlendMode: Alpha + Offset: 0, -10, 60 + ZRamp: 1 + radhit: + Filename: radhit.shp + BlendMode: Additive + radhitsm: + Filename: radhitsm.shp + BlendMode: Additive + radburst: + Filename: radburst.shp + BlendMode: Additive + enliexplode1: + Filename: enliexplode.shp + BlendMode: Additive + Alpha: 0.75 + enliexplode2: + Filename: enliexplode.shp + BlendMode: Additive + Alpha: 0.75 + FlipX: true + enliemphit1: + Filename: enliemphit.shp + BlendMode: Additive + Alpha: 0.75 + Offset: 0, -6 + enliemphit2: + Filename: enliemphit.shp + BlendMode: Additive + Alpha: 0.75 + Offset: 0, -6 + FlipX: true + radspike: + Filename: radspike.shp + Tick: 80 + Offset: -3, 1 + radspike2: + Filename: radspike.shp + FlipX: true + Tick: 80 + Offset: -3, 1 + heliosexplode: + Filename: heliosexplode.shp + BlendMode: Additive + Alpha: 0.9 + heliosexplode2: + Filename: heliosexplode2.shp + BlendMode: Additive + Alpha: 0.5 + reap-snarehit: + Filename: reap-snarehit.shp BlendMode: Additive + Alpha: 0.75 + empty: + Filename: empty.shp + +veildebuff: + Defaults: + Length: * + ZOffset: 2048 + vehicle: + Filename: veildebuff.shp + infantry: + Filename: veildebuffsm.shp + Offset: 0, -5 + +jamdebuff: + idle: + Filename: jamsignal.shp + Frames: 5, 30, 11, 24, 0, 13, 28, 3, 12 + Length: * + ZOffset: 2048 + Alpha: 0.15 + +atomicammobuff: + idle: + Filename: atomicammobuff.shp + Length: * + ZOffset: 2048 + BlendMode: Additive + +anathema: + idle: + Filename: anathema.shp + Length: * + ZOffset: 2048 + BlendMode: Additive + Alpha: 0.3 + Offset: 0, -6 laserfired2k: Defaults: IgnoreWorldTint: true - idle: DATA.R8 - AddExtension: False + idle: + Filename: DATA.R8 Start: 3639 Length: 4 Tick: 80 BlendMode: Additive ZOffset: 511 +rmbctorp: + Defaults: + IgnoreWorldTint: true + idle: + Filename: rmbctorp.shp + Length: * + ZOffset: 2046 + +enliempproj: + Defaults: + IgnoreWorldTint: true + idle: + Filename: enliempproj.shp + Length: * + ZOffset: 2046 + particles: - inviso: inviso + inviso: + Filename: inviso.shp burn-l: Defaults: IgnoreWorldTint: true - idle: burn-l + idle: + Filename: burn-l.shp Length: * ZOffset: 512 - loop: burn-l + loop: + Filename: burn-l.shp Start: 16 Length: 44 ZOffset: 512 - end: burn-l + end: + Filename: burn-l.shp Start: 60 Length: 6 ZOffset: 512 @@ -354,14 +763,17 @@ burn-l: burn-m: Defaults: IgnoreWorldTint: true - idle: burn-m + idle: + Filename: burn-m.shp Length: * ZOffset: 512 - loop: burn-m + loop: + Filename: burn-m.shp Start: 16 Length: 44 ZOffset: 512 - end: burn-m + end: + Filename: burn-m.shp Start: 60 Length: 6 ZOffset: 512 @@ -369,332 +781,516 @@ burn-m: burn-s: Defaults: IgnoreWorldTint: true - idle: burn-s + idle: + Filename: burn-s.shp Length: * ZOffset: 512 - loop: burn-s + loop: + Filename: burn-s.shp Start: 12 Length: 46 ZOffset: 512 - end: burn-s + end: + Filename: burn-s.shp Start: 59 Length: 5 ZOffset: 512 pips: - groups: pips - Start: 8 - Length: 10 + groups: + Filename: pips.shp + Frames: 9, 10, 11, 12, 13, 14, 15, 16, 17, 8 + Length: * Offset: 9, 5 - medic: pips + medic: + Filename: pips.shp Start: 20 #ready: pips # Start: 3 #hold: pips # Start: 4 - tag-fake: pips + tag-fake: + Filename: pips.shp Start: 18 Offset: 0, 2 - tag-primary: pips + tag-primary: + Filename: pips.shp Start: 2 Offset: 0, 2 - tag-auto: tag-auto + tag-auto: + Filename: tag-auto.shp Offset: 0, 2 - pip-skull: pip-skull + pip-skull: + Filename: pip-skull.shp + Offset: -2, 0 + pip-seal: + Filename: pip-seal.shp Offset: -2, 0 - pip-empty: pips2 - pip-green: pips2 + pip-cmsr: + Filename: pip-cmsr.shp + Offset: -2, 0 + pip-empty: + Filename: pips2.shp + pip-green: + Filename: pips2.shp Start: 1 - pip-yellow: pips2 + pip-yellow: + Filename: pips2.shp Start: 2 - pip-gray: pips2 + pip-gray: + Filename: pips2.shp Start: 3 - pip-red: pips2 + pip-red: + Filename: pips2.shp Start: 4 - pip-blue: pips2 + pip-blue: + Filename: pips2.shp Start: 5 - pip-disguise: pip-disguise + pip-disguise: + Filename: pip-disguise.shp Length: * Tick: 300 Offset: 0, -6 - pip-hazmat: pip-hazmat + pip-hazmat: + Filename: pip-hazmat.shp Length: * - pip-hazmats: pip-hazmats + pip-hazmats: + Filename: pip-hazmats.shp Length: * - pip-hidden: pip-hidden + pip-hidden: + Filename: pip-hidden.shp Length: * Tick: 300 Offset: 0, -6 - pip-bino: pip-bino + pip-bino: + Filename: pip-bino.shp Length: * Offset: 0, -6 - pip-armor: pip-armor + pip-armor: + Filename: pip-armor.shp Length: 4 Offset: 0, -6 Tick: 300 - pip-armor2: pip-armor + pip-armor2: + Filename: pip-armor.shp Start: 4 Length: 4 Offset: 0, -6 Tick: 300 - pip-armor3: pip-armor + pip-armor3: + Filename: pip-armor.shp Start: 8 Length: 4 Offset: 0, -6 Tick: 300 - pip-seek: pip-seek + pip-seek: + Filename: pip-seek.shp Length: 4 Offset: 0, -8 Tick: 300 - pip-seek2: pip-seek + pip-seek2: + Filename: pip-seek.shp Start: 4 Length: 4 Offset: 0, -6 Tick: 300 - pip-seek3: pip-seek + pip-seek3: + Filename: pip-seek.shp Start: 8 Length: 4 Offset: 0, -6 Tick: 300 - pip-bombard: pip-bombard + pip-bombard: + Filename: pip-bombard.shp Length: 4 Offset: 0, -6 Tick: 300 - pip-bombard2: pip-bombard + pip-bombard2: + Filename: pip-bombard.shp Start: 4 Length: 4 Offset: 0, -4 Tick: 300 - pip-bombard3: pip-bombard + pip-bombard3: + Filename: pip-bombard.shp Start: 8 Length: 4 Offset: 0, -4 Tick: 300 - pip-repair: repair-overlay + pip-repair: + Filename: repair-overlay.shp Length: * Offset: 0, -6 Tick: 300 - pip-conc: pip-conc + pip-conc: + Filename: pip-conc.shp Offset: 0, 0 - pip-stcr1: pip-stcr + pip-ion1: + Filename: pip-ion.shp Length: 1 - pip-stcr2: pip-stcr + pip-ion2: + Filename: pip-ion.shp Length: 1 Start: 1 - pickup-indicator: DATA.R8 - AddExtension: false + pip-ion3: + Filename: pip-ion.shp + Length: 1 + Start: 2 + pickup-indicator: + Filename: DATA.R8 Start: 112 Offset: -9, -9 v2: - idle: v2 + idle: + Filename: v2.shp Facings: 32 ZOffset: 1023 v3: - idle: v3 + idle: + Filename: v3.shp Facings: 32 ZOffset: 1023 + UseClassicFacings: True + +th: + idle: + Filename: thwkm.shp + Facings: 32 + ZOffset: 2046 + UseClassicFacings: True thawk: - idle: thawk + idle: + Filename: thawk.shp Facings: 32 - ZOffset: 1023 + ZOffset: 2046 empmissile: - idle: empmissile + idle: + Filename: empmissile.shp Facings: 32 - ZOffset: 1023 + ZOffset: 2046 + UseClassicFacings: True + +bsky: + idle: + Filename: bsky.shp + Facings: 32 + ZOffset: 2046 + UseClassicFacings: True rallypoint: - flag: flagfly + flag: + Filename: flagfly.shp Length: * Offset: 11,-5 ZOffset: 2535 - circles: fpls + circles: + Filename: fpls.shp Length: * ZOffset: 2047 beacon: Defaults: ZOffset: 2535 - arrow: mouse + arrow: + Filename: mouse.shp Start: 5 Offset: 1,-12 - circles: fpls + circles: + Filename: fpls.shp Length: * ZOffset: 2047 - atomicon: lores|atomicon + atomicon: + Filename: lores|atomicon.shp + Length: * + Offset: 0,-42 + pbmbicon: + Filename: lores|pbmbicon.shp + Length: * + Offset: 0,-42 + camicon: + Filename: lores|camicon.shp + Length: * + Offset: 0,-42 + pinficon: + Filename: lores|pinficon.shp + Length: * + Offset: 0,-42 + clock: + Filename: beaconclock.shp + Length: * + Offset: 0,-42 + clockTD: + Filename: beaconclockTD.shp + Length: * + Offset: 0,-42 + xodrop: + Filename: lores-xodropicon.shp Length: * Offset: 0,-42 - pbmbicon: lores|pbmbicon + airstrike: + Filename: lores-pbmbicon.shp Length: * Offset: 0,-42 - camicon: lores|camicon + gmutation: + Filename: lores-gmutationicon.shp Length: * Offset: 0,-42 - pinficon: lores|pinficon + a10airstrike: + Filename: bombicnh.shp Length: * Offset: 0,-42 - clock: beaconclock + airsupport: + Filename: lores-airsupicon.shp Length: * Offset: 0,-42 - clockTD: beaconclockTD + cmissile: + Filename: lores-cmissicon.shp Length: * Offset: 0,-42 - xodrop: lores-xodropicon + emp: + Filename: lores-emp.shp Length: * Offset: 0,-42 - airstrike: lores-pbmbicon + lruavicon: + Filename: lores-uavicon.shp Length: * Offset: 0,-42 - gmutation: lores-gmutationicon + lrairdropicon: + Filename: lores-airdropicon.shp Length: * Offset: 0,-42 - a10airstrike: bombicnh + stormicon: + Filename: lores-stormicon.shp Length: * Offset: 0,-42 - airsupport: lores-airsupicon + timewarpicon: + Filename: lores-timewarp.shp Length: * Offset: 0,-42 - cmissile: lores-cmissicon + cmineicon: + Filename: lores-cmineicon.shp Length: * Offset: 0,-42 - emp: lores-emp + nukeicon: + Filename: lores-nukeicon.shp Length: * Offset: 0,-42 - lruavicon: lores-uavicon + riftpower: + Filename: lores-riftpowericon.shp Length: * Offset: 0,-42 - lrairdropicon: lores-airdropicon + clustermissile: + Filename: lores-clustericnh.shp Length: * Offset: 0,-42 - stormicon: lores-stormicon + strafe: + Filename: lores-strafeicon.shp Length: * Offset: 0,-42 - timewarpicon: lores-timewarp + substrike: + Filename: lores-substrikeicon.shp Length: * Offset: 0,-42 - cmineicon: lores-cmineicon + owrath: + Filename: lores-owrathicon.shp Length: * Offset: 0,-42 - nukeicon: lores-nukeicon + killzone: + Filename: lores-killzoneicon.shp Length: * Offset: 0,-42 - riftpower: lores-riftpowericon + cryostorm: + Filename: lores-cryostormicon.shp Length: * Offset: 0,-42 - clustermissile: lores-clustericnh + ioncannon: + Filename: lores-ioncannonicon.shp + Length: * + Offset: 0,-42 + firestorm: + Filename: lores-fstormicnh.shp Length: * Offset: 0,-42 smoke_m: - idle: smoke_m + idle: + Filename: smoke_m.shp Length: * Offset: 2, -5 ZOffset: 512 - loop: smoke_m + loop: + Filename: smoke_m.shp Start: 49 Length: 42 Offset: 2, -5 ZOffset: 512 - end: smoke_m - Start: 26 - Length: -26 + end: + Filename: smoke_m.shp Offset: 2, -5 ZOffset: 512 + Frames: 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 smoke_mtd: - idle: smoke_mtd + idle: + Filename: smoke_mtd.shp Length: * Offset: 2, -5 ZOffset: 512 - loop: smoke_mtd + loop: + Filename: smoke_mtd.shp Start: 49 Length: 42 Offset: 2, -5 ZOffset: 512 - end: smoke_mtd - Start: 26 - Length: -26 + end: + Filename: smoke_mtd.shp Offset: 2, -5 ZOffset: 512 + Frames: 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 dragon: - idle: dragon + idle: + Filename: dragon.shp Facings: 32 - ZOffset: 1023 + ZOffset: 2046 smokey: - idle: smokey + idle: + Filename: smokey.shp Length: * ZOffset: 1023 +smokeydark: + idle: + Filename: smokey.shp + Length: * + ZOffset: 1023 + Alpha: 0.5 + smokey2: - idle: smokey2 - tick: 200 + idle: + Filename: smokey2.shp Length: * ZOffset: 1023 +smokey3: + Defaults: + Filename: smokey3.shp + Length: * + Frames: 0, 1, 2, 4, 5, 6, 7, 8, 9, 6, 5, 6, 7, 8, 9, 10, 11, 12 + ZOffset: 1023 + idle: + idle2: + FlipX: true + idle3: + FlipY: true + idle4: + FlipX: true + FlipY: true + +icbmsmoke: + Defaults: + Filename: icbmsmoke.shp + Length: * + Frames: 0, 1, 2, 4, 5, 6, 7, 8, 4, 6, 5, 6, 7, 8, 9, 10 + ZOffset: 1023 + idle: + idle2: + FlipX: true + idle3: + FlipY: true + idle4: + FlipX: true + FlipY: true + firetrail: - idle: fire4 + idle: + Filename: fire4.shp Length: * ZOffset: 1023 bomb: - idle: bomb + idle: + Filename: bomb.shp Length: * - ZOffset: 1023 + ZOffset: 2046 moab_bomb: - idle: moabb + idle: + Filename: moabb.shp Facings: 32 ZOffset: -1 missile: - idle: missile + idle: + Filename: missile.shp Facings: 32 - ZOffset: 1023 + ZOffset: 2046 + +missilesm: + idle: + Filename: missilesm.shp + Facings: 32 + ZOffset: 2046 ssmmsl: - idle: ssmmsl + idle: + Filename: ssmmsl.shp Facings: 32 - ZOffset: 1023 + ZOffset: 2046 seismsl: - idle: seismsl + idle: + Filename: seismsl.shp Facings: 32 - ZOffset: 1023 + ZOffset: 2046 red-missile: - idle: rmissile + idle: + Filename: rmissile.shp Facings: 32 - ZOffset: 1023 + ZOffset: 2046 + UseClassicFacings: True + +cmiss: + idle: + Filename: cmiss.shp + Facings: 32 + ZOffset: 2046 icbm: - idle: icbm + idle: + Filename: icbm.shp Facings: 32 - ZOffset: 1023 + ZOffset: 2046 torpedo: - idle: missile + idle: + Filename: missile.shp Facings: 32 ZOffset: -1023 scrintorp: Defaults: IgnoreWorldTint: true - idle: scrintorp + idle: + Filename: scrintorp.shp Length: * - ZOffset: 1023 + ZOffset: 2046 litning: Defaults: IgnoreWorldTint: true - bright: litning + bright: + Filename: litning.shp Length: 4 ZOffset: 1023 - dim: litning + dim: + Filename: litning.shp Start: 4 Length: 4 ZOffset: 1023 @@ -702,72 +1298,106 @@ litning: fb1: Defaults: IgnoreWorldTint: true - idle: fb1 + idle: + Filename: fb1.shp Length: * ZOffset: 1023 moveflsh: idle: + Filename: moveflsh.tem + TilesetFilenames: + SNOW: moveflsh.sno + INTERIOR: moveflsh.int + JUNGLE: moveflsh.jun + WINTER: moveflsh.win + BARREN: moveflsh.bar Length: * Tick: 80 ZOffset: 2047 - UseTilesetExtension: true - TilesetOverrides: - DESERT: TEMPERAT select: - repair: select + repair: + Filename: select.shp Start: 2 - repair-small: select + repair-small: + Filename: select.shp Start: 3 poweroff: - offline: poweroff + offline: + Filename: poweroff.shp Length: * Tick: 160 ZOffset: 2047 - + +poweron: + online: + Filename: poweron.shp + Length: * + Tick: 160 + ZOffset: 2047 + +upgrade: + upgrade: + Filename: upgradecursor.shp + Start: 0 + Length: 3 + Tick: 80 + nosignal: - offline: nosig + offline: + Filename: nosig.shp Length: * Tick: 160 ZOffset: 2047 allyrepair: - repair: allyrepair + repair: + Filename: allyrepair.shp Length: * Tick: 160 ZOffset: 2047 tabs: - left-normal: tabs - left-pressed: tabs + left-normal: + Filename: tabs.shp + left-pressed: + Filename: tabs.shp Start: 1 sputnik: - idle: sputnik + idle: + Filename: sputnik.shp Length: * Offset: -4,0 ZOffset: 1023 dd-crnr: - idle: dd-crnr + idle: + Filename: dd-crnr.shp Length: * - top-left: dd-crnr - top-right: dd-crnr + top-left: + Filename: dd-crnr.shp + top-right: + Filename: dd-crnr.shp Start: 1 - bottom-left: dd-crnr + bottom-left: + Filename: dd-crnr.shp Start: 2 - bottom-right: dd-crnr + bottom-right: + Filename: dd-crnr.shp Start: 3 fb2: Defaults: IgnoreWorldTint: true - idle: fb2 + idle: + Filename: fb2.shp Length: 4 ZOffset: 1023 - idle2: fb2 + idle2: + Filename: fb2.shp Length: 4 Start: 4 ZOffset: 1023 @@ -775,80 +1405,114 @@ fb2: fb3: Defaults: IgnoreWorldTint: true - idle: fb3 + idle: + Filename: fb3.shp Facings: 32 ZOffset: 1023 fb4: Defaults: IgnoreWorldTint: true - idle: fb4 + idle: + Filename: fb4.shp Length: * ZOffset: 1023 scrate: - Defaults: scrate + Defaults: ZOffset: -511 - idle: scrate - land: scrate + idle: + Filename: scrate.shp + land: + Filename: scrate.shp Start: 1 - water: scrate + water: + Filename: scrate.shp + Start: 2 + Length: 4 + Tick: 500 + +hcrate: + Defaults: + ZOffset: -511 + idle: + Filename: hcrate.shp + land: + Filename: hcrate.shp + Start: 1 + water: + Filename: hcrate.shp Start: 2 Length: 4 Tick: 500 wcrate: - Defaults: wcrate + Defaults: ZOffset: -511 - idle: wcrate - land: wcrate - water: wwcrate + idle: + Filename: wcrate.shp + land: + Filename: wcrate.shp + water: + Filename: wwcrate.shp Length: * Tick: 500 xcratea: - idle: xcratea + idle: + Filename: xcratea.shp ZOffset: -511 - land: xcratea + land: + Filename: xcratea.shp Start: 1 ZOffset: -511 - water: xcratea + water: + Filename: xcratea.shp Start: 2 Length: 4 Tick: 500 ZOffset: -511 xcrateb: - idle: xcrateb + idle: + Filename: xcrateb.shp ZOffset: -511 - land: xcrateb + land: + Filename: xcrateb.shp Start: 1 ZOffset: -511 - water: xcrateb + water: + Filename: xcrateb.shp Start: 2 Length: 4 Tick: 500 ZOffset: -511 xcratec: - idle: xcratec + idle: + Filename: xcratec.shp ZOffset: -511 - land: xcratec + land: + Filename: xcratec.shp Start: 1 ZOffset: -511 - water: xcratec + water: + Filename: xcratec.shp Start: 2 Length: 4 Tick: 500 ZOffset: -511 xcrated: - idle: xcrated + idle: + Filename: xcrated.shp ZOffset: -511 - land: xcrated + land: + Filename: xcrated.shp Start: 1 ZOffset: -511 - water: xcrated + water: + Filename: xcrated.shp Start: 2 Length: 4 Tick: 500 @@ -858,88 +1522,137 @@ crate-effects: Defaults: ZOffset: 2047 Length: * - speed: speed - dollar: dollar - reveal-map: earth - hide-map: empulse - fpower: fpower - gps: gpsbox - invuln: invulbox - heal: invun - nuke: missile2 - parabombs: parabox - sonar: sonarbox - stealth: stealth2 - timequake: tquake - armor: armor - chrono: chronbox - rapid: rapid + speed: + Filename: speed.shp + dollar: + Filename: dollar.shp + Tick: 80 + Offset: 0, -6 + reveal-map: + Filename: earth.shp + hide-map: + Filename: empulse.shp + fpower: + Filename: fpower.shp + gps: + Filename: gpsbox.shp + invuln: + Filename: invulbox.shp + heal: + Filename: invun.shp + nuke: + Filename: missile2.shp + parabombs: + Filename: parabox.shp + sonar: + Filename: sonarbox.shp + stealth: + Filename: stealth2.shp + timequake: + Filename: tquake.shp + armor: + Filename: armor.shp + chrono: + Filename: chronbox.shp + rapid: + Filename: rapid.shp Tick: 90 - airstrike: deviator - levelup: levelup + airstrike: + Filename: deviator.shp + levelup: + Filename: levelup.shp Tick: 200 parach: - open: parach + open: + Filename: parach.shp Length: 5 - idle: parach + idle: + Filename: parach.shp Start: 5 Length: 11 parachl: - open: parachl + Defaults: + ZOffset: 1024 + open: + Filename: parachl.shp Length: 5 - idle: parachl + idle: + Filename: parachl.shp Start: 5 Length: 11 parach-shadow: - idle: parach-shadow + idle: + Filename: parach-shadow.shp + Length: * + +parach-largeshadow: + idle: + Filename: parach-largeshadow.shp Length: * bomblet: - idle: bomblet + idle: + Filename: bomblet.shp Length: * ZOffset: 1023 empbomblet: - idle: empbomblet + idle: + Filename: empbomblet.shp + Length: * + ZOffset: 1023 + +medbomb: + idle: + Filename: medbomb.shp + Length: * + ZOffset: 1023 + +bigbomb: + idle: + Filename: bigbomb.shp Length: * ZOffset: 1023 parabomb: - open: parabomb + open: + Filename: parabomb.shp Length: 8 ZOffset: 1023 - idle: parabomb + idle: + Filename: parabomb.shp Start: 8 Length: 5 ZOffset: 1023 tbomb: - open: tbomb + open: + Filename: tbomb.shp Length: 8 ZOffset: 1023 - idle: tbomb + idle: + Filename: tbomb.shp Start: 8 Length: 5 ZOffset: 1023 -b2bomb: - idle: b2bomb - Length: * - ZOffset: 1023 - smokland: - open: playersmoke + open: + Filename: playersmoke.shp Length: 60 Tick: 120 ZOffset: 1023 - idle: playersmoke + Alpha: 0.75 + idle: + Filename: playersmoke.shp Start: 60 Length: 32 Tick: 120 ZOffset: 1023 + Alpha: 0.75 fire: Defaults: @@ -948,64 +1661,126 @@ fire: Tick: 105 ZOffset: 511 IgnoreWorldTint: true - 1: fire1 - 2: fire2 - 3: fire7 - 4: fire4 - 5: fire5 - 6: fire6 - 7: fire6 + 1: + Filename: fire1.shp + 2: + Filename: fire2.shp + 3: + Filename: fire7.shp + 4: + Filename: fire4.shp + 5: + Filename: fire5.shp + 6: + Filename: fire6.shp + 7: + Filename: fire6.shp FlipX: true - 8: fire7 + 8: + Filename: fire7.shp + FlipX: true + +fireblack: + Defaults: + Length: * + Offset: 0,-3 + Tick: 105 + ZOffset: 511 + IgnoreWorldTint: true + 1: + Filename: fire2black.shp + 2: + Filename: fire3black.shp + 3: + Filename: fire2black.shp + FlipX: true + 4: + Filename: fire3black.shp FlipX: true rank: - rank-veteran-1: rank - rank-veteran-2: rank + rank-veteran-1: + Filename: rank.shp + rank-veteran-2: + Filename: rank.shp Start: 1 - rank-elite: rank + rank-elite: + Filename: rank.shp Start: 2 + rank-veteran-1-nod: + Filename: rank.shp + Start: 3 + rank-veteran-2-nod: + Filename: rank.shp + Start: 4 + rank-elite-nod: + Filename: rank.shp + Start: 5 + rank-veteran-1-scrin: + Filename: rank.shp + Start: 6 + rank-veteran-2-scrin: + Filename: rank.shp + Start: 7 + rank-elite-scrin: + Filename: rank.shp + Start: 8 iconchevrons: - veteran: iconchevrons + veteran: + Filename: iconchevrons.shp Offset: 2, 2 +upgradeiconoverlays: + complete: + Filename: upgrade-complete.shp + Offset: 13, 8 + atomic: - up: atomicup + up: + Filename: atomicup.shp Length: * ZOffset: 1023 - down: atomicdn + down: + Filename: atomicdn.shp Length: * ZOffset: 1023 empicbm: - up: atomicupcnc + up: + Filename: atomicupcnc.shp Length: * ZOffset: 511 - down: atomicdncnc + down: + Filename: atomicdncnc.shp Length: * ZOffset: 511 chemicbm: - up: atomicupcnc + up: + Filename: atomicupcnc.shp Length: * ZOffset: 511 - down: atomicdncnc + down: + Filename: atomicdncnc.shp Length: * ZOffset: 511 deathhand: - up: atomicupcnc + up: + Filename: atomicupcnc.shp Length: * ZOffset: 511 - down: atomicdncnc + down: + Filename: atomicdncnc.shp Length: * ZOffset: 511 ionsfx: Defaults: IgnoreWorldTint: true - idle: ionsfx + idle: + Filename: ionsfx.shp Length: * Offset: 0, -78 ZOffset: 2048 @@ -1013,157 +1788,321 @@ ionsfx: BlendMode: Additive bubbles: - idle: bubbles + idle: + Filename: bubbles.shp Length: * Tick: 220 mpspawn: - idle: mpspawn + idle: + Filename: mpspawn.shp Length: * waypoint: - idle: waypoint + idle: + Filename: waypoint.shp Length: * camera: - idle: camera + idle: + Filename: camera.shp Length: * - icon: empty + icon: + Filename: empty.shp satscan: - idle: satscan + idle: + Filename: satscan.shp Length: * BlendMode: Alpha Tick: 80 ZOffset: 1023 +jamfield: + idle: + Filename: jamfield.shp + Length: * + BlendMode: Alpha + ZOffset: 1023 + Alpha: 0.07 + Scale: 1.2 + +cryostorm: + Defaults: + Filename: cryostorm.shp + Length: * + BlendMode: Additive + ZOffset: 1023 + idle: + Alpha: 0.6 + make: + Alpha: 0.04, 0.08, 0.12, 0.16, 0.2, 0.24, 0.28, 0.32, 0.36, 0.4, 0.44, 0.48, 0.52, 0.56, 0.6 + die: + Alpha: 0.6, 0.56, 0.52, 0.48, 0.44, 0.4, 0.36, 0.32, 0.28, 0.24, 0.2, 0.16, 0.12, 0.08, 0.04 + dead: + Alpha: 0 + gpsdot: - Infantry: gpsdot - Vehicle: gpsdot + Infantry: + Filename: gpsdot.shp + Vehicle: + Filename: gpsdot.shp Start: 1 - Ship: gpsdot + Ship: + Filename: gpsdot.shp Start: 2 - Helicopter: gpsdot + Helicopter: + Filename: gpsdot.shp Start: 3 - Plane: gpsdot + Plane: + Filename: gpsdot.shp Start: 4 - Harvester: gpsdot + Harvester: + Filename: gpsdot.shp Start: 5 - Structure: gpsdot + Structure: + Filename: gpsdot.shp Start: 6 - Oil: gpsdot + Oil: + Filename: gpsdot.shp Start: 7 - Hospital: gpsdot + Hospital: + Filename: gpsdot.shp Start: 8 - Biohazard: gpsdot + Biohazard: + Filename: gpsdot.shp Start: 9 - Communications: gpsdot + Communications: + Filename: gpsdot.shp Start: 10 - Forward: gpsdot + Forward: + Filename: gpsdot.shp Start: 11 + LargeInfantry: + Filename: gpsdot.shp + Start: 12 + MirageTank: + Filename: gpsdot.shp + Start: 13 icon: - abomb: atomicon - invuln: infxicon - chrono: warpicon - spyplane: smigicon - paratroopers: pinficon - gps: gpssicon - parabombs: pbmbicon - sonar: sonricon - ioncannon: ionicon - airstrike: airstkicon - a10airstrike: bombicnh - empmissile: empicon - chemmissile: cmissicnh - hacksat: hacksaticon - hackercell: hackercellicon - uavicon: uavicon - airdropicon: airdropicon - forceshield: forceshieldicon - orcaca: orcacarein - stealthemitter: semiticnh - invis: invisicon - infbomb: b2bicnh - carpetbomb: cbombicon - airsupport: airsupicon - storm: stormicon - timewarp: timewarpicon - surgicalstrike: surgicalsicnh - clustermissile: clustericnh - droppods: droppodicnh - cmines: cmineicon - chack: chackicon - nrepair: nrepairicon - xodrop: xodropicon - frenzy: frenzyicon - shadteam: shadteamicon - gpsscram: gpssicnh - abombair: abombicon - mutabomb: gmutationicon - stormtroopers: stroopicon - rescanpower: rescanpowericon - ichorpower: ichorpowericon - feedermutation: feedermutationicon - spresspower: spresspowericon - riftpower: riftpowericon - buzzpower: buzzicon - stormspikepower: stormspikeicon - ionsurgepower: ionsurgeicon - arscan: arscanicnh - nshield: nshieldicon - fstorm: fstormicnh + abomb: + Filename: atomicon.shp + invuln: + Filename: infxicon.shp + chrono: + Filename: warpicon.shp + spyplane: + Filename: smigicon.shp + paratroopers: + Filename: pinficon.shp + gps: + Filename: gpssicon.shp + parabombs: + Filename: pbmbicon.shp + sonar: + Filename: sonricon.shp + ioncannon: + Filename: ionicon.shp + airstrike: + Filename: airstkicon.shp + a10airstrike: + Filename: bombicnh.shp + empmissile: + Filename: empicon.shp + chemmissile: + Filename: cmissicnh.shp + hacksat: + Filename: hacksaticon.shp + techhack: + Filename: techhackicon.shp + assassinsquad: + Filename: assaicnh.shp + hackercell: + Filename: hackercellicon.shp + confessorcabal: + Filename: confcabalicnh.shp + uavicon: + Filename: uavicon.shp + airdropicon: + Filename: airdropicon.shp + forceshield: + Filename: forceshieldicon.shp + orcaca: + Filename: orcacarein.shp + stealthemitter: + Filename: semiticnh.shp + invis: + Filename: invisicnh.shp + infbomb: + Filename: b2bicnh.shp + carpetbomb: + Filename: cbombicon.shp + airsupport: + Filename: airsupicon.shp + storm: + Filename: stormicon.shp + timewarp: + Filename: timewarpicon.shp + surgicalstrike: + Filename: surgicalsicnh.shp + clustermissile: + Filename: clustericnh.shp + droppods: + Filename: droppodicnh.shp + cmines: + Filename: cmineicon.shp + chack: + Filename: chackicon.shp + nrepair: + Filename: nrepairicon.shp + xodrop: + Filename: xodropicon.shp + frenzy: + Filename: frenzyicon.shp + shadteam: + Filename: shadteamicon.shp + veilofwar: + Filename: veilofwaricnh.shp + abombair: + Filename: abombicon.shp + mutabomb: + Filename: gmutationicon.shp + chaosbombs: + Filename: chaosbombicon.shp + stormtroopers: + Filename: stroopicon.shp + atomicammo: + Filename: atomicammoicon.shp + heroes: + Filename: heroesicon.shp + tankdrop: + Filename: tankdropicon.shp + killzone: + Filename: killzoneicon.shp + tempinc: + Filename: tempincicon.shp + rescanpower: + Filename: rescanpowericon.shp + ichorpower: + Filename: ichorpowericon.shp + grclpower: + Filename: grclpowericon.shp + spresspower: + Filename: spresspowericon.shp + riftpower: + Filename: riftpowericon.shp + buzzpower: + Filename: buzzicon.shp + stormspikepower: + Filename: stormspikeicon.shp + ionsurgepower: + Filename: ionsurgeicon.shp + arscan: + Filename: arscanicnh.shp + nshield: + Filename: nshieldicon.shp + fstorm: + Filename: fstormicnh.shp + airborne: + Filename: airbicon.shp + strafe: + Filename: strafeicon.shp + fleetrecall: + Filename: fleetrecallicon.shp + substrike: + Filename: substrikeicon.shp + cryostorm: + Filename: cryostormicon.shp + heliosbomb: + Filename: heliosicon.shp + bsky: + Filename: bskyicon.shp + owrath: + Filename: owrathicon.shp + gateway: + Filename: gatewayicon.shp + anathema: + Filename: anathemaicon.shp + timeskip: + Filename: timeskipicon.shp + ichorspike: + Filename: ispkicon.shp + colonyspike: + Filename: cspkicon.shp + voidspike: + Filename: vspkicon.shp + sendcash: + Filename: sendcashicon.shp + placeholder: + Filename: placeholdericon.shp quee: - idle: quee + idle: + Filename: quee.shp Length: 10 - damaged-idle: quee + damaged-idle: + Filename: quee.shp Start: 10 Length: 10 lar1: - idle: lar1 + idle: + Filename: lar1.shp lar2: - idle: lar2 + idle: + Filename: lar2.shp minp: - idle: minp + idle: + Filename: minp.shp ZOffset: -512 - icon: jmin + icon: + Filename: jmin.shp minv: - idle: minv + idle: + Filename: minv.shp ZOffset: -512 - icon: jmin + icon: + Filename: jmin.shp minvs: - idle: minvs + idle: + Filename: minvs.shp ZOffset: -512 - icon: jmin + icon: + Filename: jmin.shp mins: - idle: mins + idle: + Filename: mins.shp ZOffset: -512 Length: * Tick: 400 - icon: jmin + icon: + Filename: jmin.shp minsf: - idle: minsf + idle: + Filename: minsf.shp ZOffset: -512 - icon: jmin + icon: + Filename: jmin.shp shab: - idle: shab + idle: + Filename: shab.shp Length: * Tick: 80 ZOffset: -512 - icon: jmin + icon: + Filename: jmin.shp overlay: - Defaults: trans.icn - AddExtension: False + Defaults: + Filename: trans.icn build-valid: build-invalid: Start: 2 @@ -1174,8 +2113,8 @@ overlay: Start: 2 editor-overlay: - Defaults: trans.icn - AddExtension: False + Defaults: + Filename: trans.icn copy: paste: Start: 2 @@ -1183,154 +2122,166 @@ editor-overlay: resources: Defaults: Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - JUNGLE: TEMPERAT - DESERT: TEMPERAT - gold01: gold01 - gold02: gold02 - gold03: gold03 - gold04: gold04 - gem01: gem01 - gem02: gem02 - gem03: gem03 - gem04: gem04 - ti1: ti1 - TilesetOverrides: - JUNGLE: TEMPERAT - SNOW: TEMPERAT - BARREN: TEMPERAT - ti2: ti2 - TilesetOverrides: - JUNGLE: TEMPERAT - SNOW: TEMPERAT - BARREN: TEMPERAT - ti3: ti3 - TilesetOverrides: - JUNGLE: TEMPERAT - SNOW: TEMPERAT - BARREN: TEMPERAT - ti4: ti4 - TilesetOverrides: - JUNGLE: TEMPERAT - SNOW: TEMPERAT - BARREN: TEMPERAT - ti5: ti5 - TilesetOverrides: - JUNGLE: TEMPERAT - SNOW: TEMPERAT - BARREN: TEMPERAT - ti6: ti6 - TilesetOverrides: - JUNGLE: TEMPERAT - SNOW: TEMPERAT - BARREN: TEMPERAT - ti7: ti7 - TilesetOverrides: - JUNGLE: TEMPERAT - SNOW: TEMPERAT - BARREN: TEMPERAT - ti8: ti8 - TilesetOverrides: - JUNGLE: TEMPERAT - SNOW: TEMPERAT - BARREN: TEMPERAT - ti9: ti9 - TilesetOverrides: - JUNGLE: TEMPERAT - SNOW: TEMPERAT - BARREN: TEMPERAT - ti10: ti10 - TilesetOverrides: - JUNGLE: TEMPERAT - SNOW: TEMPERAT - BARREN: TEMPERAT - ti11: ti11 - TilesetOverrides: - JUNGLE: TEMPERAT - SNOW: TEMPERAT - BARREN: TEMPERAT - ti12: ti12 - TilesetOverrides: - JUNGLE: TEMPERAT - SNOW: TEMPERAT - BARREN: TEMPERAT - bti1: rtib1 - TilesetOverrides: - WINTER: TEMPERAT - JUNGLE: TEMPERAT - SNOW: TEMPERAT - BARREN: TEMPERAT - bti2: rtib2 - TilesetOverrides: - WINTER: TEMPERAT - JUNGLE: TEMPERAT - SNOW: TEMPERAT - BARREN: TEMPERAT - bti3: rtib3 - TilesetOverrides: - WINTER: TEMPERAT - JUNGLE: TEMPERAT - SNOW: TEMPERAT - BARREN: TEMPERAT - bti4: rtib4 - TilesetOverrides: - WINTER: TEMPERAT - JUNGLE: TEMPERAT - SNOW: TEMPERAT - BARREN: TEMPERAT - bti5: rtib5 - TilesetOverrides: - WINTER: TEMPERAT - JUNGLE: TEMPERAT - SNOW: TEMPERAT - BARREN: TEMPERAT - bti6: rtib6 - TilesetOverrides: - WINTER: TEMPERAT - JUNGLE: TEMPERAT - SNOW: TEMPERAT - BARREN: TEMPERAT - bti7: rtib7 - TilesetOverrides: - WINTER: TEMPERAT - JUNGLE: TEMPERAT - SNOW: TEMPERAT - BARREN: TEMPERAT - bti8: rtib8 - TilesetOverrides: - WINTER: TEMPERAT - JUNGLE: TEMPERAT - SNOW: TEMPERAT - BARREN: TEMPERAT - bti9: rtib9 - TilesetOverrides: - WINTER: TEMPERAT - JUNGLE: TEMPERAT - SNOW: TEMPERAT - BARREN: TEMPERAT - bti10: rtib10 - TilesetOverrides: - WINTER: TEMPERAT - JUNGLE: TEMPERAT - SNOW: TEMPERAT - BARREN: TEMPERAT - bti11: rtib11 - TilesetOverrides: - WINTER: TEMPERAT - JUNGLE: TEMPERAT - SNOW: TEMPERAT - BARREN: TEMPERAT - bti12: rtib12 - TilesetOverrides: - WINTER: TEMPERAT - JUNGLE: TEMPERAT - SNOW: TEMPERAT - BARREN: TEMPERAT + gold01: + Filename: gold01.tem + TilesetFilenames: + SNOW: gold01.sno + WINTER: gold01.win + BARREN: gold01.bar + gold02: + Filename: gold02.tem + TilesetFilenames: + SNOW: gold02.sno + WINTER: gold02.win + BARREN: gold02.bar + gold03: + Filename: gold03.tem + TilesetFilenames: + SNOW: gold03.sno + WINTER: gold03.win + BARREN: gold03.bar + gold04: + Filename: gold04.tem + TilesetFilenames: + SNOW: gold04.sno + WINTER: gold04.win + BARREN: gold04.bar + gem01: + Filename: gem01.tem + TilesetFilenames: + SNOW: gem01.sno + WINTER: gem01.win + BARREN: gem01.bar + gem02: + Filename: gem02.tem + TilesetFilenames: + SNOW: gem02.sno + WINTER: gem02.win + BARREN: gem02.bar + gem03: + Filename: gem03.tem + TilesetFilenames: + SNOW: gem03.sno + WINTER: gem03.win + BARREN: gem03.bar + gem04: + Filename: gem04.tem + TilesetFilenames: + SNOW: gem04.sno + WINTER: gem04.win + BARREN: gem04.bar + ti1: + Filename: ti1.tem + TilesetFilenames: + SNOW: ti1.sno + WINTER: ti1.win + ti2: + Filename: ti2.tem + TilesetFilenames: + SNOW: ti2.sno + WINTER: ti2.win + ti3: + Filename: ti3.tem + TilesetFilenames: + SNOW: ti3.sno + WINTER: ti3.win + ti4: + Filename: ti4.tem + TilesetFilenames: + SNOW: ti4.sno + WINTER: ti4.win + ti5: + Filename: ti5.tem + TilesetFilenames: + SNOW: ti5.sno + WINTER: ti5.win + ti6: + Filename: ti6.tem + TilesetFilenames: + SNOW: ti6.sno + WINTER: ti6.win + ti7: + Filename: ti7.tem + TilesetFilenames: + SNOW: ti7.sno + WINTER: ti7.win + ti8: + Filename: ti8.tem + TilesetFilenames: + SNOW: ti8.sno + WINTER: ti8.win + ti9: + Filename: ti9.tem + TilesetFilenames: + SNOW: ti9.sno + WINTER: ti9.win + ti10: + Filename: ti10.tem + TilesetFilenames: + SNOW: ti10.sno + WINTER: ti10.win + ti11: + Filename: ti11.tem + TilesetFilenames: + SNOW: ti11.sno + WINTER: ti11.win + ti12: + Filename: ti12.tem + TilesetFilenames: + SNOW: ti12.sno + WINTER: ti12.win + bti1: + Filename: rtib1.tem + TilesetFilenames: + SNOW: rtib1.sno + bti2: + Filename: rtib2.tem + TilesetFilenames: + SNOW: rtib2.sno + bti3: + Filename: rtib3.tem + TilesetFilenames: + SNOW: rtib3.sno + bti4: + Filename: rtib4.tem + TilesetFilenames: + SNOW: rtib4.sno + bti5: + Filename: rtib5.tem + TilesetFilenames: + SNOW: rtib5.sno + bti6: + Filename: rtib6.tem + TilesetFilenames: + SNOW: rtib6.sno + bti7: + Filename: rtib7.tem + TilesetFilenames: + SNOW: rtib7.sno + bti8: + Filename: rtib8.tem + TilesetFilenames: + SNOW: rtib8.sno + bti9: + Filename: rtib9.tem + TilesetFilenames: + SNOW: rtib9.sno + bti10: + Filename: rtib10.tem + TilesetFilenames: + SNOW: rtib10.sno + bti11: + Filename: rtib11.tem + TilesetFilenames: + SNOW: rtib11.sno + bti12: + Filename: rtib12.tem + TilesetFilenames: + SNOW: rtib12.sno shroud: - shroud: shadow + shroud: + Filename: shadow.shp Length: * # Note: The order of smudges and craters determines @@ -1338,173 +2289,340 @@ shroud: scorches: Defaults: Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - sc1: sc1 - sc2: sc2 - sc3: sc3 - sc4: sc4 - sc5: sc5 - sc6: sc6 + sc1: + Filename: sc1.tem + TilesetFilenames: + SNOW: sc1.sno + DESERT: sc1.des + JUNGLE: sc1.jun + WINTER: sc1.win + BARREN: sc1.bar + sc2: + Filename: sc2.tem + TilesetFilenames: + SNOW: sc2.sno + DESERT: sc2.des + JUNGLE: sc2.jun + WINTER: sc2.win + BARREN: sc2.bar + sc3: + Filename: sc3.tem + TilesetFilenames: + SNOW: sc3.sno + DESERT: sc3.des + JUNGLE: sc3.jun + WINTER: sc3.win + BARREN: sc3.bar + sc4: + Filename: sc4.tem + TilesetFilenames: + SNOW: sc4.sno + DESERT: sc4.des + JUNGLE: sc4.jun + WINTER: sc4.win + BARREN: sc4.bar + sc5: + Filename: sc5.tem + TilesetFilenames: + SNOW: sc5.sno + DESERT: sc5.des + JUNGLE: sc5.jun + WINTER: sc5.win + BARREN: sc5.bar + sc6: + Filename: sc6.tem + TilesetFilenames: + SNOW: sc6.sno + DESERT: sc6.des + JUNGLE: sc6.jun + WINTER: sc6.win + BARREN: sc6.bar craters: Defaults: Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - cr1: cr1 - cr2: cr2 - cr3: cr3 - cr4: cr4 - cr5: cr5 - cr6: cr6 + cr1: + Filename: cr1.tem + TilesetFilenames: + SNOW: cr1.sno + DESERT: cr1.des + JUNGLE: cr1.jun + WINTER: cr1.win + BARREN: cr1.bar + cr2: + Filename: cr2.tem + TilesetFilenames: + SNOW: cr2.sno + DESERT: cr2.des + JUNGLE: cr2.jun + WINTER: cr2.win + BARREN: cr2.bar + cr3: + Filename: cr3.tem + TilesetFilenames: + SNOW: cr3.sno + DESERT: cr3.des + JUNGLE: cr3.jun + WINTER: cr3.win + BARREN: cr3.bar + cr4: + Filename: cr4.tem + TilesetFilenames: + SNOW: cr4.sno + DESERT: cr4.des + JUNGLE: cr4.jun + WINTER: cr4.win + BARREN: cr4.bar + cr5: + Filename: cr5.tem + TilesetFilenames: + SNOW: cr5.sno + DESERT: cr5.des + JUNGLE: cr5.jun + WINTER: cr5.win + BARREN: cr5.bar + cr6: + Filename: cr6.tem + TilesetFilenames: + SNOW: cr6.sno + DESERT: cr6.des + JUNGLE: cr6.jun + WINTER: cr6.win + BARREN: cr6.bar scorch_flames: large_flame: Length: * Combine: - fire1: + 0: + Filename: fire1.shp Length: * Offset: 0,-3 - fire1: + 1: + Filename: fire1.shp Length: * Offset: 0,-3 - fire1: + 2: + Filename: fire1.shp Length: * Offset: 0,-3 - fire1: + 3: + Filename: fire1.shp Length: * Offset: 0,-3 - fire2: + 4: + Filename: fire2.shp Length: * Offset: 0,-3 - fire2: + 5: + Filename: fire2.shp Length: * Offset: 0,-3 - fire2: + 6: + Filename: fire2.shp Length: * Offset: 0,-3 - smoke_m: + 7: + Filename: smoke_m.shp Length: * Offset: 2, -5 medium_flame: Length: * Combine: - fire2: + 0: + Filename: fire2.shp Length: * Offset: 0,-3 - fire2: + 1: + Filename: fire2.shp Length: * Offset: 0,-3 - fire2: + 2: + Filename: fire2.shp Length: * Offset: 0,-3 - fire2: + 3: + Filename: fire2.shp Length: * Offset: 0,-3 - fire2: + 4: + Filename: fire2.shp Length: * Offset: 0,-3 - smoke_m: + 5: + Filename: smoke_m.shp Length: * Offset: 2, -5 small_flame: Combine: - fire3: + 0: + Filename: fire3.shp Length: * Offset: 0,-3 - fire3: + 1: + Filename: fire3.shp Length: * Offset: 0,-3 - fire3: + 2: + Filename: fire3.shp Length: * Offset: 0,-3 - fire3: + 3: + Filename: fire3.shp Length: * Offset: 0,-3 - fire3: + 4: + Filename: fire3.shp Length: * Offset: 0,-3 - smoke_m: + 5: + Filename: smoke_m.shp Length: * Offset: 2, -5 Length: * Offset: 0,-3 tiny_flame: Combine: - fire4: + 0: + Filename: fire4.shp Length: * Offset: 0,-3 - fire4: + 1: + Filename: fire4.shp Length: * Offset: 0,-3 - fire4: + 2: + Filename: fire4.shp Length: * Offset: 0,-3 - fire4: + 3: + Filename: fire4.shp Length: * Offset: 0,-3 - smoke_m: + 4: + Filename: smoke_m.shp Length: * Offset: 2, -5 Length: * Offset: 0,-3 smoke: Combine: - smoke_m: + 0: + Filename: smoke_m.shp + Length: * + Offset: 2, -5 + medium_flame_black: + Length: * + Combine: + 0: + Filename: fire2black.shp + Length: * + Offset: 0,-3 + 1: + Filename: fire2black.shp + Length: * + Offset: 0,-3 + 2: + Filename: fire2black.shp + Length: * + Offset: 0,-3 + 3: + Filename: fire2black.shp + Length: * + Offset: 0,-3 + 4: + Filename: fire2black.shp + Length: * + Offset: 0,-3 + 5: + Filename: smoke_m.shp + Length: * + Offset: 2, -5 + small_flame_black: + Combine: + 0: + Filename: fire3black.shp + Length: * + Offset: 0,-3 + 1: + Filename: fire3black.shp + Length: * + Offset: 0,-3 + 2: + Filename: fire3black.shp + Length: * + Offset: 0,-3 + 3: + Filename: fire3black.shp + Length: * + Offset: 0,-3 + 4: + Filename: fire3black.shp + Length: * + Offset: 0,-3 + 5: + Filename: smoke_m.shp Length: * Offset: 2, -5 + Length: * + Offset: 0,-3 mine: idle: - UseTilesetExtension: true + TilesetFilenames: + SNOW: mine.sno + INTERIOR: mine.int + TEMPERAT: mine.tem + DESERT: mine.des + JUNGLE: mine.jun + WINTER: mine.win + BARREN: mine.bar ZOffset: -1024 gmine: idle: + Filename: gmine.tem + TilesetFilenames: + SNOW: gmine.sno + DESERT: gmine.des ZOffset: -1024 - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - BARREN: TEMPERAT - JUNGLE: TEMPERAT - WINTER: TEMPERAT railmine: idle: + Filename: railmine.tem + TilesetFilenames: + SNOW: railmine.sno + DESERT: railmine.des ZOffset: -512 - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - BARREN: TEMPERAT - JUNGLE: TEMPERAT - WINTER: TEMPERAT ctflag: - idle: ctflag + idle: + Filename: ctflag.shp Length: 9 Tick: 50 Offset: 0,-12 - bib: mbGAP + bib: + Filename: mbGAP.tem + TilesetFilenames: + SNOW: mbGAP.sno + INTERIOR: mbGAP.int + DESERT: mbGAP.des + WINTER: mbGAP.win Length: * - UseTilesetExtension: true - TilesetOverrides: - BARREN: TEMPERAT - JUNGLE: TEMPERAT laserfire: Defaults: IgnoreWorldTint: true - idle: veh-hit3 + idle: + Filename: veh-hit3.shp Length: * ZOffset: 511 plaserfire: Defaults: IgnoreWorldTint: true - idle: frag1 + idle: + Filename: frag1.shp Offset: -2,0 Length: * ZOffset: 511 @@ -1512,71 +2630,73 @@ plaserfire: fire1: Defaults: IgnoreWorldTint: true - idle: fire1 + idle: + Filename: fire1.shp Length: * Offset: 2, -5 ZOffset: 510 - loop: fire1 + loop: + Filename: fire1.shp Start: 0 Length: 14 Offset: 2, -5 ZOffset: 510 - end: fire1 - Start: 14 - Length: -14 + end: + Filename: fire1.shp Offset: 2, -5 ZOffset: 510 + Frames: 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 split2: Defaults: + Filename: split2.tem + TilesetFilenames: + SNOW: split2.sno + WINTER: split2.win + BARREN: split2.win Offset: 11, -15 - UseTilesetExtension: true - TilesetOverrides: - DESERT: TEMPERAT - JUNGLE: TEMPERAT - WINTER: SNOW - BARREN: SNOW - INTERIOR: TEMPERAT make: Length: 30 active: - Start: 30 + Start: 31 Length: 24 idle: Start: 54 split3: Defaults: + Filename: split3.tem + TilesetFilenames: + SNOW: split3.sno + INTERIOR: split3.des + WINTER: split3.sno + BARREN: split3.des Offset: 7, -13 - UseTilesetExtension: true - TilesetOverrides: - DESERT: TEMPERAT - JUNGLE: TEMPERAT - WINTER: SNOW - BARREN: DESERT - INTERIOR: DESERT make: Length: 30 active: - Start: 30 + Start: 31 Length: 24 idle: Start: 54 cb1: - idle: cb1 + idle: + Filename: cb1.shp Length: * ZOffset: 1023 cb2: - idle: cb2 + idle: + Filename: cb2.shp Length: * ZOffset: 1023 sparks_overlay: Defaults: IgnoreWorldTint: true - idle: emp_fx01 + idle: + Filename: emp_fx01.shp Length: * BlendMode: Additive Offset: 0, 0 @@ -1585,159 +2705,212 @@ sparks_overlay: ctnkjump: Defaults: IgnoreWorldTint: true - idle: ctnkjump + idle: + Filename: ctnkjump.shp Length: * BlendMode: Additive Tick: 90 ZOffset: 510 twake: - idle: twake + idle: + Filename: twake.shp Length: * Tick: 300 ZOffset: -511 +smokestack: + Defaults: + BlendMode: Alpha + Length: * + Tick: 150 + ZOffset: 1023 + idle1: + Filename: smokestack1.shp + idle2: + Filename: smokestack2.shp + idle3: + Filename: smokestack3.shp + cloud1: - idle: cloud1 + idle: + Filename: cloud1.shp BlendMode: Alpha Length: * ZOffset: 1023 - start: cloud1d + start: + Filename: cloud1d.shp BlendMode: Alpha Length: 12 ZOffset: 1023 - loop: cloud1 + loop: + Filename: cloud1.shp BlendMode: Alpha Length: 28 ZOffset: 1023 - die: cloud1d + die: + Filename: cloud1d.shp BlendMode: Alpha Length: * ZOffset: 1023 cloud1d: - idle: cloud1d + idle: + Filename: cloud1d.shp Length: * BlendMode: Alpha ZOffset: 1023 +cloud1sm: + idle: + Filename: cloud1sm.shp + BlendMode: Alpha + Length: * + ZOffset: 1023 + Alpha: 0.7 + cloud2: - idle: cloud2 + idle: + Filename: cloud2.shp BlendMode: Alpha Length: * ZOffset: 1023 - start: cloud2d + start: + Filename: cloud2d.shp BlendMode: Alpha Length: 12 ZOffset: 1023 - loop: cloud2 + loop: + Filename: cloud2.shp BlendMode: Alpha Length: 28 ZOffset: 1023 - die: cloud2d + die: + Filename: cloud2d.shp BlendMode: Alpha Length: * ZOffset: 1023 cloud2d: - idle: cloud2d + idle: + Filename: cloud2d.shp Length: * ZOffset: 1023 chaoscloud1: - idle: chaoscloud1 + idle: + Filename: chaoscloud1.shp BlendMode: Additive Length: * ZOffset: 1023 - start: chaoscloud1d + start: + Filename: chaoscloud1d.shp BlendMode: Additive Length: 12 ZOffset: 1023 - loop: chaoscloud1 + loop: + Filename: chaoscloud1.shp BlendMode: Additive Length: 28 ZOffset: 1023 - die: chaoscloud1d + die: + Filename: chaoscloud1d.shp BlendMode: Additive Length: * ZOffset: 1023 chaoscloud1d: - idle: chaoscloud1d + idle: + Filename: chaoscloud1d.shp Length: * BlendMode: Additive ZOffset: 1023 chaoscloud2: - idle: chaoscloud2 + idle: + Filename: chaoscloud2.shp BlendMode: Additive Length: * ZOffset: 1023 - start: chaoscloud2d + start: + Filename: chaoscloud2d.shp BlendMode: Additive Length: 12 ZOffset: 1023 - loop: chaoscloud2 + loop: + Filename: chaoscloud2.shp BlendMode: Additive Length: 28 ZOffset: 1023 - die: chaoscloud2d + die: + Filename: chaoscloud2d.shp BlendMode: Additive Length: * ZOffset: 1023 chaoscloud2d: - idle: chaoscloud2d + idle: + Filename: chaoscloud2d.shp Length: * ZOffset: 1023 BlendMode: Additive mindanim: - idle: mindanim + idle: + Filename: mindanim.shp Length: * Tick: 200 BlendMode: Alpha Offset: 0, 0 paratarget: - cursor: mouse + cursor: + Filename: mouse.shp Start: 82 Length: 8 Tick: 80 paradirection: - arrow-t: mouse + arrow-t: + Filename: mouse.shp Start: 1 Y: -7 Offset: 0, -19, 0 - arrow-tr: mouse + arrow-tr: + Filename: mouse.shp Start: 2 X: 6 Y: -5 Offset: 15, -15, 0 - arrow-r: mouse + arrow-r: + Filename: mouse.shp Start: 3 X: 7 Offset: 19, 0, 0 - arrow-br: mouse + arrow-br: + Filename: mouse.shp Start: 4 X: 6 Y: 5 Offset: 15, 15, 0 - arrow-b: mouse + arrow-b: + Filename: mouse.shp Start: 5 Y: 7 Offset: 0, 19, 0 - arrow-bl: mouse + arrow-bl: + Filename: mouse.shp Start: 6 X: -6 Y: 5 Offset: -15, 15, 0 - arrow-l: mouse + arrow-l: + Filename: mouse.shp Start: 7 X: -8 Offset: -19, 0, 0 - arrow-tl: mouse + arrow-tl: + Filename: mouse.shp Start: 8 X: -6 y: 5 @@ -1746,194 +2919,602 @@ paradirection: flameall: Defaults: IgnoreWorldTint: true - idle: flameall + idle: + Filename: flameall.shp Length: 19 Facings: -8 Tick: 80 ZOffset: 1023 Offset: 0, 0, 6 + InterpolatedFacings: 32 flameallfast: + Inherits: flameall + idle: + Tick: 60 + +flameallblack: Defaults: IgnoreWorldTint: true - idle: flameall + idle: + Filename: flameallblack.shp Length: 19 Facings: -8 Tick: 60 ZOffset: 1023 Offset: 0, 0, 6 + InterpolatedFacings: 32 thinblueflame: Defaults: IgnoreWorldTint: true - idle: thinblueflame + idle: + Filename: thinblueflame.shp Length: 17 Facings: 16 Tick: 50 ZOffset: 1023 Offset: 0, 0, 6 BlendMode: Additive + InterpolatedFacings: 32 chemall: - idle: chemall + idle: + Filename: chemall.shp Length: 19 Facings: -8 Tick: 140 ZOffset: 1023 Offset: 0, 0, 6 + InterpolatedFacings: 32 + +chemallfast: + Inherits: chemall + idle: + Tick: 60 chronoappear: Defaults: IgnoreWorldTint: true - idle: chronofade + idle: + Filename: chronofade.shp Length: * chrono: Defaults: IgnoreWorldTint: true - warpin: warpin + warpin: + Filename: warpin.shp Length: * ZOffset: -2047 - warpout: warpout + warpout: + Filename: warpout.shp Length: * ZOffset: -2047 chronobubble: Defaults: IgnoreWorldTint: true - warpin: chronotg + warpin: + Filename: chronotg.shp Length: * - warpout: chronoar + warpout: + Filename: chronoar.shp Length: * mwarc: Defaults: IgnoreWorldTint: true - idle: emp_fx02 + idle: + Filename: emp_fx02.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 - idle2: emp_fx02 + idle2: + Filename: emp_fx02.shp Start: 8 Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 - idle3: emp_fx02 + idle3: + Filename: emp_fx02.shp Start: 16 Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 empgren: - idle: empgren + idle: + Filename: empgren.shp Length: * ZOffset: 1023 shadgren: - idle: shadgren + idle: + Filename: shadgren.shp Length: * ZOffset: 1023 frenzy-overlay: - vehicle: emp_fx01 + Defaults: Length: * BlendMode: Additive - Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 - infantry: emp_fx02 + vehicle: + Filename: emp_fx01.shp + Offset: 0, 0 + infantry: + Filename: emp_fx02.shp + Offset: 0, -5 + +reap-snareoverlay: + infantry: + Filename: reap-snareoverlay.shp Length: * BlendMode: Additive Offset: 0, -5 - UseTilesetCode: false ZOffset: 512 + Alpha: 0.5 nshield-overlay: - idle: nshield + idle: + Filename: nshield.shp + Frames: 0,1,2,3,4,5,4,3,2,1,0 + Length: * + BlendMode: Additive + Offset: 0, 0 + ZOffset: 512 + Tick: 60 + +nshield-overlay-sm: + idle: + Filename: nshieldsm.shp Frames: 0,1,2,3,4,5,4,3,2,1,0 Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 Tick: 60 +nrepair-overlay: + idle: + Filename: nrepair.shp + Length: * + BlendMode: Additive + Offset: 0, 0 + ZOffset: 512 + Tick: 60 + +chronoprep-overlay: + idle: + Filename: chronoprep.shp + Length: * + BlendMode: Additive + Offset: 0, -2 + ZOffset: 512 + Alpha: 0.5 + +killzone: + idle: + Filename: killzone.shp + ZOffset: 1023 + Length: * + Alpha: 0.1,0.095,0.09,0.085,0.08,0.075,0.07,0.065,0.06,0.055,0.05,0.045,0.04,0.035,0.03,0.025,0.02,0.015,0.01,0.005,0,0.005,0.01,0.015,0.02,0.025,0.03,0.035,0.04,0.045,0.05,0.055,0.06,0.065,0.07,0.075,0.08,0.085,0.09,0.095 + Frames: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + Tick: 80 + +hero-overlay: + light: + Filename: herolight.shp + ZOffset: 1023 + BlendMode: Additive + Offset: 0, -12 + Alpha: 0.35 + star: + Filename: herostar.shp + ZOffset: 2047 + Offset: 0, -22 + +zdefshield-overlay: + idle: + Filename: zdefshield.shp + Length: * + BlendMode: Alpha + Alpha: 0.3 + Offset: 0, -5 + ZOffset: 512 + Tick: 80 + c4: - c4: mouse + Defaults: + Filename: c4.shp + c4: + Filename: mouse.shp Start: 116 Length: 3 - c4-minimap: mouse + c4-minimap: + Filename: mouse.shp Start: 121 Length: 3 tnt: - idle: tnt + idle: + Filename: tnt.shp Length: * ZOffset: 1023 - tnt: tntoverlay + tnt: + Filename: tntoverlay.shp Length: * - tntbig: tntoverlaybig + tntbig: + Filename: tntoverlaybig.shp Length: * +groundtnt: + Defaults: + Length: 1 + Tick: 2000 + idle1: + Filename: tnt.shp + Start: 0 + idle2: + Filename: tnt.shp + Start: 1 + idle3: + Filename: tnt.shp + Start: 2 + idle4: + Filename: tnt.shp + Start: 3 + idle5: + Filename: tnt.shp + Start: 4 + idle6: + Filename: tnt.shp + Start: 5 + idle7: + Filename: tnt.shp + Start: 6 + idle8: + Filename: tnt.shp + Start: 7 + cryomiss: - idle: cryomiss + idle: + Filename: cryomiss.shp Facings: 32 ZOffset: 1023 tibcoremsl: - idle: tibcoremsl + idle: + Filename: tibcoremsl.shp Facings: 32 ZOffset: 1023 gpsscrambler: - make: stealth2 + make: + Filename: stealth2.shp ZOffset: 2047 Length: * - idle: empty + idle: + Filename: empty.shp Facings: 1 hacked: - hacked: hacked + hacked: + Filename: hacked.shp ZOffset: 2047 Length: 2 Tick: 500 - overloading: hacked + hacked-overloading: + Filename: hacked.shp ZOffset: 2047 Length: 4 Tick: 500 - restoring: hacked + overloading: + Filename: hacked.shp + ZOffset: 2047 + Start: 2 + Length: 2 + Tick: 500 + restoring: + Filename: hacked.shp ZOffset: 2047 Start: 4 Length: 2 Tick: 250 + techlocked: + Filename: hacked.shp + ZOffset: 2047 + Start: 6 + Length: 2 + Tick: 500 hacking: - hacking: hacking + hacking: + Filename: hacking.shp ZOffset: 2047 Length: * Tick: 80 Offset: 1, -9 empty: - idle: empty + idle: + Filename: empty.shp dbrissm: Defaults: ZOffset: 1023 Length: * - 1: dbris1sm - 2: dbris2sm - 3: dbris3sm - 4: dbris4sm - 5: dbris5sm - 6: dbris6sm - 7: dbris7sm - 8: dbris8sm - 9: dbris9sm - 10: dbrs10sm + 1: + Filename: dbris1sm.shp + 2: + Filename: dbris2sm.shp + 3: + Filename: dbris3sm.shp + 4: + Filename: dbris4sm.shp + 5: + Filename: dbris5sm.shp + 6: + Filename: dbris6sm.shp + 7: + Filename: dbris7sm.shp + 8: + Filename: dbris8sm.shp + 9: + Filename: dbris9sm.shp + 10: + Filename: dbrs10sm.shp + +dirt: + Defaults: + ZOffset: 1023 + Length: * + 1: + Filename: dirt.shp + 2: + Filename: dirt.shp + 3: + Filename: dirt.shp + 4: + Filename: dirt.shp + 5: + Filename: dirt.shp + +brass: + Defaults: + ZOffset: 1023 + Length: * + 1: + Filename: brass.shp + 2: + Filename: brass.shp + 3: + Filename: brass.shp + 4: + Filename: brass.shp + 5: + Filename: brass.shp + +squad.airborne: + icon: + Filename: u3icon.shp + +squad.airborne.tank: + icon: + Filename: gtnkdropicon.shp + +atomshell: + idle: + Filename: atomshell.shp + ZOffset: 2047 + Frames: 13,14,15,16,13,14,15,16,13,14,15,16,13,14,15,16 + Length: * + Tick: 140 + +microwavehit: + idle: + Filename: microwavehit.shp + Length: * + ZOffset: 2047 + BlendMode: Additive + +opticsactive: + idle: + Filename: opticsactive.shp + Tick: 500 + Length: * + +blinded: + idle: + Filename: blinded.shp + Tick: 500 + Length: * + +watched: + idle: + Filename: watched.shp + Tick: 500 + Length: * + +targetpainter: + idle: + Filename: targetpainter.shp + Tick: 500 + Length: * + +underminefoundation: + idle: + Filename: quake.shp + Tick: 60 + Length: * + +redplasmatorp: + Defaults: + IgnoreWorldTint: true + Alpha: 0.95 + idle: + Filename: redplasmatorp.shp + Length: 5 + Tick: 40 + ZOffset: 2048 + +veilblast: + Defaults: + IgnoreWorldTint: true + Length: * + Tick: 40 + ZOffset: 2047 + Filename: veilblast.shp + Alpha: 0.8 + idle: + idlesm: + Scale: 0.75 + +ussrstar: + Defaults: + Filename: ussrstar.shp + Length: * + ZOffset: -32 + Alpha: 0.65 ,0.6, 0.55, 0.5, 0.45, 0.4, 0.45, 0.5, 0.55, 0.6 + IgnoreWorldTint: true + Tick: 120 + idle-overlay1: + Frames: 0,0,0,0,0,0,0,0,0,0 + idle-overlay2: + Frames: 1,1,1,1,1,1,1,1,1,1 + +custbuff: + Defaults: + Filename: custbuff.shp + Length: * + ZOffset: -32 + Alpha: 0.65 ,0.6, 0.55, 0.5, 0.45, 0.4, 0.45, 0.5, 0.55, 0.6 + IgnoreWorldTint: true + Tick: 120 + BlendMode: Additive + idle-overlay1: + Frames: 0,0,0,0,0,0,0,0,0,0 + idle-overlay2: + Frames: 1,1,1,1,1,1,1,1,1,1 + +heliosbomb: + Defaults: + Filename: heliosbomb.shp + Length: * + ZOffset: 2047 + idle: + open: + +substrikehole: + Defaults: + Filename: substrikehole.shp + Tick: 80 + Length: * + ZOffset: -1024 + Alpha: 0.92 + Frames: 0,1,2,3,4,5,6,7,8,7,6,5,4,3,2,1,0 + burrow: + Offset: -5, 10 + unburrow: + Offset: 1, 5 + +smigboom: + Defaults: + Filename: greyboom.shp + Length: * + ZOffset: 2047 + Alpha: 0.7 + enter: + exit: + +coiltrail: + idle1: + Filename: coiltrail.shp + Frames: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 + Start: 0 + Length: 7 + Tick: 40 + Facings: 4 + ZOffset: 2046 + InterpolatedFacings: 32 + BlendMode: Additive + Alpha: 0.4 + idle2: + Filename: coiltrail.shp + Frames: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 + Start: 0 + Length: 7 + Tick: 40 + Facings: 4 + ZOffset: 2046 + FlipX: true + FlipY: true + InterpolatedFacings: 32 + BlendMode: Additive + Alpha: 0.4 + +laserhit: + Defaults: + IgnoreWorldTint: true + Filename: laserhit.shp + Length: * + ZOffset: 2047 + BlendMode: Additive + Tick: 60 + Frames: 0, 0, 0, 0 + Alpha: 1, 0.8, 0.6, 0.3 + idle1: + idle2: + FlipX: true + +playerxp.level1: + icon: + Filename: playerxprank1icon.shp + +playerxp.level2: + icon: + Filename: playerxprank2icon.shp + +playerxp.level3: + icon: + Filename: playerxprank3icon.shp + +influence.level1: + icon: + Filename: influencelevel1icon.shp + +influence.level2: + icon: + Filename: influencelevel2icon.shp + +influence.level3: + icon: + Filename: influencelevel3icon.shp + +covenant.level1: + icon: + Filename: covenantlevel1icon.shp + +covenant.level2: + icon: + Filename: covenantlevel2icon.shp + +covenant.level3: + icon: + Filename: covenantlevel3icon.shp + +custhealhit: + Defaults: + Filename: custhealhit.shp + Length: * + BlendMode: Additive + Offset: 0, -4 + ZOffset: 512 + IgnoreWorldTint: true + idle: + idle2: + FlipX: true diff --git a/mods/ca/sequences/scrin.yaml b/mods/ca/sequences/scrin.yaml index 0d790c41a0..14f3afe3eb 100644 --- a/mods/ca/sequences/scrin.yaml +++ b/mods/ca/sequences/scrin.yaml @@ -1,36 +1,45 @@ ^ScrinCommonDeaths: - die5: scrininfdeaths + die5: + Filename: scrininfdeaths.shp Length: 19 Tick: 80 - die6: scrininfdeaths + die6: + Filename: scrininfdeaths.shp Length: 14 Start: 19 - die8: chronozap + die8: + Filename: chronozap.shp Length: * BlendMode: Alpha - die9: scrininfdeaths + die9: + Filename: scrininfdeaths.shp Start: 33 Length: 15 Tick: 80 - die10: scrininfdeaths + die10: + Filename: scrininfdeaths.shp Start: 33 Length: 15 Tick: 80 - die11: scrininfdeaths + die11: + Filename: scrininfdeaths.shp Start: 48 Length: 13 Tick: 80 - die12: scrininfdeaths + die12: + Filename: scrininfdeaths.shp Length: 12 Start: 67 Tick: 80 BlendMode: Additive - die-crushed: scrininfdeaths + die-crushed: + Filename: scrininfdeaths.shp Start: 61 Length: 6 Tick: 1600 ZOffset: -511 - mind-overlay: mindanim + mind-overlay: + Filename: mindanim.shp Length: * Tick: 200 BlendMode: Alpha @@ -38,544 +47,1623 @@ s1: Inherits: ^ScrinCommonDeaths - stand: s1 + stand: + Filename: s1.shp Facings: 8 - stand2: s1 + stand2: + Filename: s1.shp Facings: 8 - run: s1 + run: + Filename: s1.shp Start: 8 Length: 4 Facings: 8 Tick: 120 - shoot: s1 + shoot: + Filename: s1.shp Start: 40 Length: 4 Facings: 8 - idle1: s1 - Length: 1 + idle1: + Filename: s1.shp + Length: 2 Tick: 120 - idle2: s1 + idle2: + Filename: s1.shp Start: 2 Length: 1 Tick: 120 - idle3: s1 - Start: 3 - Length: 1 - Tick: 120 - idle4: s1 + idle3: + Filename: s1.shp Start: 4 - Length: 1 + Length: 2 + Tick: 120 + idle4: + Filename: s1.shp + Start: 6 + Length: 2 Tick: 120 - die1: s1 + parachute: + Filename: s1.shp + Start: 3 + die1: + Filename: s1.shp Start: 72 Length: 8 Tick: 80 - die2: s1 + die2: + Filename: s1.shp Start: 80 Length: 8 Tick: 80 - die3: s1 + die3: + Filename: s1.shp Start: 88 Length: 8 Tick: 80 - die4: s1 + die4: + Filename: s1.shp Start: 88 Length: 8 Tick: 80 - die7: s1 + die7: + Filename: s1.shp Start: 72 Length: 8 Tick: 80 - muzzle: scrinmuzz1 + muzzle: + Filename: scrinmuzz1.shp Length: 6 Facings: 16 - garrison-muzzle: scrinmuzz1 + BlendMode: Additive + IgnoreWorldTint: true + garrison-muzzle: + Filename: scrinmuzz1.shp Length: 6 Facings: 16 - chrono-overlay: chronofade_small + BlendMode: Additive + IgnoreWorldTint: true + chrono-overlay: + Filename: chronofade_small.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 Tick: 80 - icon: s1icon + icon: + Filename: s1icon.shp s2: Inherits: ^ScrinCommonDeaths - stand: s2 + stand: + Filename: s2.shp Facings: 8 - stand2: s2 + stand2: + Filename: s2.shp Facings: 8 - run: s2 + run: + Filename: s2.shp Start: 8 Length: 4 Facings: 8 Tick: 120 - shoot: s2 + shoot: + Filename: s2.shp Start: 40 Length: 4 Facings: 8 Tick: 80 - idle1: s2 - Start: 1 - Length: 1 + idle1: + Filename: s2.shp + Length: 2 Tick: 120 - idle2: s2 - Start: 3 - Length: 1 + idle2: + Filename: s2.shp + Start: 2 + Length: 2 Tick: 120 - idle3: s2 - Start: 5 - Length: 1 + idle3: + Filename: s2.shp + Start: 4 + Length: 2 Tick: 120 - idle4: s2 - Start: 7 - Length: 1 + idle4: + Filename: s2.shp + Start: 6 + Length: 2 Tick: 120 - die1: s2 + parachute: + Filename: s2.shp + Start: 3 + die1: + Filename: s2.shp Start: 72 Length: 8 Tick: 80 - die2: s2 + die2: + Filename: s2.shp Start: 80 Length: 8 Tick: 80 - die3: s2 + die3: + Filename: s2.shp Start: 88 Length: 8 Tick: 80 - die4: s2 + die4: + Filename: s2.shp Start: 88 Length: 8 Tick: 80 - die7: s2 + die7: + Filename: s2.shp Start: 72 Length: 8 Tick: 80 - chrono-overlay: chronofade_small + chrono-overlay: + Filename: chronofade_small.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 Tick: 80 - icon: s2icon + icon: + Filename: s2icon.shp s3: Inherits: ^ScrinCommonDeaths - stand: s3 + stand: + Filename: s3.shp Facings: 8 - stand2: s3 + stand2: + Filename: s3.shp Facings: 8 - run: s3 + run: + Filename: s3.shp Start: 8 Length: 4 Facings: 8 Tick: 120 - shoot: s3 + shoot: + Filename: s3.shp Start: 40 Length: 4 Facings: 8 - idle1: s3 - Length: 1 + idle1: + Filename: s3.shp + Length: 2 Tick: 120 - idle2: s3 + idle2: + Filename: s3.shp Start: 2 - Length: 1 - Tick: 120 - idle3: s3 - Start: 3 - Length: 1 + Length: 2 Tick: 120 - idle4: s3 + idle3: + Filename: s3.shp Start: 4 - Length: 1 + Length: 2 + Tick: 120 + idle4: + Filename: s3.shp + Start: 6 + Length: 2 Tick: 120 - die1: s3 + parachute: + Filename: s3.shp + Start: 3 + die1: + Filename: s3.shp Start: 72 Length: 8 Tick: 80 - die2: s3 + die2: + Filename: s3.shp Start: 80 Length: 8 Tick: 80 - die3: s3 + die3: + Filename: s3.shp Start: 88 Length: 8 Tick: 80 - die4: s3 + die4: + Filename: s3.shp Start: 88 Length: 8 Tick: 80 - die7: s3 + die7: + Filename: s3.shp Start: 72 Length: 8 Tick: 80 - chrono-overlay: chronofade_small + chrono-overlay: + Filename: chronofade_small.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 Tick: 80 - icon: s3icon + icon: + Filename: s3icon.shp s4: Inherits: ^ScrinCommonDeaths - stand: s4 + stand: + Filename: s4.shp Facings: 8 - stand2: s4 + stand2: + Filename: s4.shp Facings: 8 - run: s4 + run: + Filename: s4.shp Start: 8 Length: 4 Facings: 8 Tick: 120 - shoot: s4 + shoot: + Filename: s4.shp Start: 40 Length: 4 Facings: 8 - idle1: s4 - Length: 1 + idle1: + Filename: s4.shp + Length: 2 Tick: 120 - idle2: s4 + idle2: + Filename: s4.shp Start: 2 - Length: 1 - Tick: 120 - idle3: s4 - Start: 3 - Length: 1 + Length: 2 Tick: 120 - idle4: s4 + idle3: + Filename: s4.shp Start: 4 - Length: 1 + Length: 2 + Tick: 120 + idle4: + Filename: s4.shp + Start: 6 + Length: 2 Tick: 120 - die1: s4 + parachute: + Filename: s4.shp + Start: 3 + die1: + Filename: s4.shp Start: 72 Length: 8 Tick: 80 - die2: s4 + die2: + Filename: s4.shp Start: 80 Length: 8 Tick: 80 - die3: s4 + die3: + Filename: s4.shp Start: 88 Length: 8 Tick: 80 - die4: s4 + die4: + Filename: s4.shp Start: 88 Length: 8 Tick: 80 - die7: s4 + die7: + Filename: s4.shp Start: 72 Length: 8 Tick: 80 - chrono-overlay: chronofade_small + chrono-overlay: + Filename: chronofade_small.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 Tick: 80 - icon: s4icon + icon: + Filename: s4icon.shp s6: Inherits: ^ScrinCommonDeaths - stand: s6 + stand: + Filename: s6.shp Facings: 8 - stand2: s6 + stand2: + Filename: s6.shp Facings: 8 - run: s6 + run: + Filename: s6.shp Start: 8 Length: 4 Facings: 8 Tick: 120 - idle1: s6 - Length: 1 + idle1: + Filename: s6.shp + Length: 2 Tick: 120 - idle2: s6 + idle2: + Filename: s6.shp Start: 2 - Length: 1 - Tick: 120 - idle3: s6 - Start: 3 - Length: 1 + Length: 2 Tick: 120 - idle4: s6 + idle3: + Filename: s6.shp Start: 4 - Length: 1 + Length: 2 + Tick: 120 + idle4: + Filename: s6.shp + Start: 6 + Length: 2 Tick: 120 - die1: s6 + parachute: + Filename: s6.shp + Start: 3 + die1: + Filename: s6.shp Start: 72 Length: 8 Tick: 80 - die2: s6 + die2: + Filename: s6.shp Start: 80 Length: 8 Tick: 80 - die3: s6 + die3: + Filename: s6.shp Start: 88 Length: 8 Tick: 80 - die4: s6 + die4: + Filename: s6.shp Start: 88 Length: 8 Tick: 80 - die7: s6 + die7: + Filename: s6.shp Start: 72 Length: 8 Tick: 80 - chrono-overlay: chronofade_small + chrono-overlay: + Filename: chronofade_small.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 Tick: 80 - icon: s6icon + icon: + Filename: s6icon.shp -feed: +mrdr: Inherits: ^ScrinCommonDeaths - idle: feed + stand: + Filename: mrdr.shp + Facings: 8 + stand2: + Filename: mrdr.shp Facings: 8 - move: feed + run: + Filename: mrdr.shp Start: 8 Length: 4 Facings: 8 Tick: 120 - harvest: feed - Start: 40 - Length: 4 + shoot: + Filename: mrdr.shp + Frames: 43,44,48,49,53,54,58,59,63,64,68,69,73,74,78,79 + Length: 2 Facings: 8 + Tick: 80 + idle1: + Filename: mrdr.shp + Length: 2 Tick: 120 - idle1: feed - Start: 1 - Length: 1 - Tick: 120 - idle2: feed - Start: 3 - Length: 1 + idle2: + Filename: mrdr.shp + Start: 2 + Length: 2 Tick: 120 - idle3: feed - Start: 5 - Length: 1 + idle3: + Filename: mrdr.shp + Start: 4 + Length: 2 Tick: 120 - idle4: feed - Start: 7 - Length: 1 + idle4: + Filename: mrdr.shp + Start: 6 + Length: 2 Tick: 120 - die1: feed - Start: 72 + parachute: + Filename: mrdr.shp + Start: 3 + die1: + Filename: mrdr.shp + Start: 80 Length: 8 Tick: 80 - die2: feed + die2: + Filename: mrdr.shp + Start: 88 + Length: 9 + Tick: 80 + die3: + Filename: mrdr.shp + Start: 88 + Length: 9 + Tick: 80 + die4: + Filename: mrdr.shp + Start: 88 + Length: 9 + Tick: 80 + die5: + Filename: gscr.shp + Start: 97 + Length: 11 + Tick: 80 + die6: + Filename: gscr.shp + Length: 13 + Start: 116 + die7: + Filename: mrdr.shp Start: 80 Length: 8 Tick: 80 - die3: feed - Start: 88 + die8: + Filename: chronozap.shp + Length: * + BlendMode: Alpha + die9: + Filename: gscr.shp + Start: 108 Length: 8 Tick: 80 - die4: feed - Start: 88 + die10: + Filename: gscr.shp + Start: 108 Length: 8 Tick: 80 - die7: feed - Start: 72 + die11: + Filename: mrdr.shp + Start: 80 Length: 8 Tick: 80 - chrono-overlay: chronofade_small + die12: + Filename: mrdr.shp + Start: 80 + Length: 8 + Tick: 80 + chrono-overlay: + Filename: chronofade_small.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 Tick: 80 - icon: s2icon + icon: + Filename: mrdricon.shp -smedi: +evis: Inherits: ^ScrinCommonDeaths - stand: smedi + stand: + Filename: evis.shp Facings: 8 - stand2: smedi + stand2: + Filename: evis.shp Facings: 8 - heal: smedi - Start: 40 - Length: 4 - Facings: 8 - run: smedi + run: + Filename: evis.shp Start: 8 Length: 4 Facings: 8 Tick: 120 - idle1: smedi - Length: 1 + shoot: + Filename: evis.shp + Frames: 43,44,48,49,53,54,58,59,63,64,68,69,73,74,78,79 + Length: 2 + Facings: 8 + Tick: 80 + idle1: + Filename: evis.shp + Length: 2 Tick: 120 - idle2: smedi + idle2: + Filename: evis.shp Start: 2 - Length: 1 - Tick: 120 - idle3: smedi - Start: 3 - Length: 1 + Length: 2 Tick: 120 - idle4: smedi + idle3: + Filename: evis.shp Start: 4 - Length: 1 + Length: 2 Tick: 120 - die1: smedi - Start: 72 + idle4: + Filename: evis.shp + Start: 6 + Length: 2 + Tick: 120 + parachute: + Filename: evis.shp + Start: 3 + die1: + Filename: evis.shp + Start: 80 Length: 8 Tick: 80 - die2: smedi + die2: + Filename: evis.shp + Start: 88 + Length: 9 + Tick: 80 + die3: + Filename: evis.shp + Start: 88 + Length: 9 + Tick: 80 + die4: + Filename: evis.shp + Start: 88 + Length: 9 + Tick: 80 + die5: + Filename: gscr.shp + Start: 97 + Length: 11 + Tick: 80 + die6: + Filename: gscr.shp + Length: 13 + Start: 116 + die7: + Filename: evis.shp Start: 80 Length: 8 Tick: 80 - die3: smedi - Start: 88 + die8: + Filename: chronozap.shp + Length: * + BlendMode: Alpha + die9: + Filename: gscr.shp + Start: 108 Length: 8 Tick: 80 - die4: smedi - Start: 88 + die10: + Filename: gscr.shp + Start: 108 Length: 8 Tick: 80 - die7: smedi - Start: 72 + die11: + Filename: evis.shp + Start: 80 + Length: 8 + Tick: 80 + die12: + Filename: evis.shp + Start: 80 Length: 8 Tick: 80 - chrono-overlay: chronofade_small + chrono-overlay: + Filename: chronofade_small.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 Tick: 80 - icon: smediicon + icon: + Filename: evisicon.shp -mast: +impl: Inherits: ^ScrinCommonDeaths - stand: mast + stand: + Filename: impl.shp Facings: 8 - stand2: mast + stand2: + Filename: impl.shp Facings: 8 - run: mast + run: + Filename: impl.shp Start: 8 Length: 4 Facings: 8 Tick: 120 - shoot: mast - Start: 40 - Length: 4 + shoot: + Filename: impl.shp + Frames: 43,44,48,49,53,54,58,59,63,64,68,69,73,74,78,79 + Length: 2 Facings: 8 - idle1: mast - Length: 1 + Tick: 80 + idle1: + Filename: impl.shp + Length: 2 Tick: 120 - idle2: mast + idle2: + Filename: impl.shp Start: 2 - Length: 1 - Tick: 120 - idle3: mast - Start: 3 - Length: 1 + Length: 2 Tick: 120 - idle4: mast + idle3: + Filename: impl.shp Start: 4 - Length: 1 + Length: 2 Tick: 120 - die1: mast - Start: 72 + idle4: + Filename: impl.shp + Start: 6 + Length: 2 + Tick: 120 + parachute: + Filename: impl.shp + Start: 3 + die1: + Filename: impl.shp + Start: 80 Length: 8 Tick: 80 - die2: mast + die2: + Filename: impl.shp + Start: 88 + Length: 9 + Tick: 80 + die3: + Filename: impl.shp + Start: 88 + Length: 9 + Tick: 80 + die4: + Filename: impl.shp + Start: 88 + Length: 9 + Tick: 80 + die5: + Filename: gscr.shp + Start: 97 + Length: 11 + Tick: 80 + die6: + Filename: gscr.shp + Length: 13 + Start: 116 + die7: + Filename: impl.shp Start: 80 Length: 8 Tick: 80 - die3: mast - Start: 88 + die8: + Filename: chronozap.shp + Length: * + BlendMode: Alpha + die9: + Filename: gscr.shp + Start: 108 Length: 8 Tick: 80 - die4: mast - Start: 88 + die10: + Filename: gscr.shp + Start: 108 Length: 8 Tick: 80 - die7: mast - Start: 72 + die11: + Filename: impl.shp + Start: 80 Length: 8 Tick: 80 - chrono-overlay: chronofade_small + die12: + Filename: impl.shp + Start: 80 + Length: 8 + Tick: 80 + chrono-overlay: + Filename: chronofade_small.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 Tick: 80 - mc: mindcontroller - Length: * + icon: + Filename: implicon.shp + +stlk: + Inherits: ^ScrinCommonDeaths + stand: + Filename: stlk.shp + Facings: 8 + stand2: + Filename: stlk.shp + Facings: 8 + run: + Filename: stlk.shp + Start: 8 + Length: 4 + Facings: 8 + Tick: 120 + shoot: + Filename: stlk.shp + Frames: 43,44,48,49,53,54,58,59,63,64,68,69,73,74,78,79 + Length: 2 + Facings: 8 + Tick: 80 + idle1: + Filename: stlk.shp + Length: 2 + Tick: 120 + idle2: + Filename: stlk.shp + Start: 2 + Length: 2 + Tick: 120 + idle3: + Filename: stlk.shp + Start: 4 + Length: 2 + Tick: 120 + idle4: + Filename: stlk.shp + Start: 6 + Length: 2 Tick: 120 + parachute: + Filename: stlk.shp + Start: 3 + die1: + Filename: stlk.shp + Start: 80 + Length: 8 + Tick: 80 + die2: + Filename: stlk.shp + Start: 88 + Length: 9 + Tick: 80 + die3: + Filename: stlk.shp + Start: 88 + Length: 9 + Tick: 80 + die4: + Filename: stlk.shp + Start: 88 + Length: 9 + Tick: 80 + die5: + Filename: gscr.shp + Start: 97 + Length: 11 + Tick: 80 + die6: + Filename: gscr.shp + Length: 13 + Start: 116 + die7: + Filename: stlk.shp + Start: 80 + Length: 8 + Tick: 80 + die8: + Filename: chronozap.shp + Length: * BlendMode: Alpha - Offset: 0, 0 - icon: masticon - -harv.scrin: - Inherits: ^VehicleOverlays - idle: harvscrin - Facings: 32 - UseClassicFacings: True - harvest: scrinharvest + die9: + Filename: gscr.shp + Start: 108 + Length: 8 + Tick: 80 + die10: + Filename: gscr.shp + Start: 108 + Length: 8 + Tick: 80 + die11: + Filename: stlk.shp + Start: 80 + Length: 8 + Tick: 80 + die12: + Filename: stlk.shp + Start: 80 + Length: 8 + Tick: 80 + chrono-overlay: + Filename: chronofade_small.shp Length: * - ZOffset: -128 BlendMode: Additive - icon: harvscrinicon - -harv.scrin.destroyed: - Inherits: ^VehicleOverlays - idle: harvscrin - Facings: 32 - UseClassicFacings: True - ZOffset: -512 - -gunw: - Inherits: ^VehicleOverlays - idle: gunw - Facings: 32 - UseClassicFacings: True - move: gunw - Start: 32 - Facings: 32 - Length: 2 + Offset: 0, 0 + ZOffset: 512 Tick: 80 - UseClassicFacings: True - muzzle: scrinmuzz1 - Length: 6 + icon: + Filename: stlkicon.shp + +wchr: + Inherits: ^ScrinCommonDeaths + stand: + Filename: wchr.shp + Facings: 8 + stand2: + Filename: wchr.shp + Facings: 8 + run: + Filename: wchr.shp + Start: 8 + Length: 4 + Facings: 8 + Tick: 120 + shoot: + Filename: wchr.shp + Start: 40 + Length: 4 + Facings: 8 + idle1: + Filename: wchr.shp + Length: 2 + Tick: 120 + idle2: + Filename: wchr.shp + Start: 2 + Length: 2 + Tick: 120 + idle3: + Filename: wchr.shp + Start: 4 + Length: 2 + Tick: 120 + idle4: + Filename: wchr.shp + Start: 6 + Length: 2 + Tick: 120 + parachute: + Filename: wchr.shp + Start: 3 + die1: + Filename: wchr.shp + Start: 72 + Length: 8 + Tick: 80 + die2: + Filename: wchr.shp + Start: 80 + Length: 8 + Tick: 80 + die3: + Filename: wchr.shp + Start: 88 + Length: 8 + Tick: 80 + die4: + Filename: wchr.shp + Start: 88 + Length: 8 + Tick: 80 + die7: + Filename: wchr.shp + Start: 72 + Length: 8 + Tick: 80 + chrono-overlay: + Filename: chronofade_small.shp + Length: * + BlendMode: Additive + Offset: 0, 0 + ZOffset: 512 + Tick: 80 + icon: + Filename: wchricon.shp + +brst: + Inherits: ^ScrinCommonDeaths + stand: + Filename: brst.shp + Facings: 8 + stand2: + Filename: brst.shp + Facings: 8 + run: + Filename: brst.shp + Start: 8 + Length: 4 + Facings: 8 + Tick: 120 + shoot: + Filename: brst.shp + Start: 40 + Length: 4 + Facings: 8 + Tick: 120 + idle1: + Filename: brst.shp + Length: 2 + Tick: 120 + idle2: + Filename: brst.shp + Start: 2 + Length: 2 + Tick: 120 + idle3: + Filename: brst.shp + Start: 4 + Length: 2 + Tick: 120 + idle4: + Filename: brst.shp + Start: 6 + Length: 2 + Tick: 120 + parachute: + Filename: brst.shp + Start: 3 + die1: + Filename: brst.shp + Start: 72 + Length: 8 + Tick: 80 + die2: + Filename: brst.shp + Start: 80 + Length: 8 + Tick: 80 + die3: + Filename: brst.shp + Start: 88 + Length: 8 + Tick: 80 + die4: + Filename: brst.shp + Start: 88 + Length: 8 + Tick: 80 + die7: + Filename: brst.shp + Start: 72 + Length: 8 + Tick: 80 + chrono-overlay: + Filename: chronofade_small.shp + Length: * + BlendMode: Additive + Offset: 0, 0 + ZOffset: 512 + Tick: 80 + idle-overlay: + Filename: empty.shp + spawn-overlay: + Filename: leechhitlg.shp + Frames: 7,8,9,10,11,12,13,14,15,16,17,18 + BlendMode: Additive + Tick: 60 + Length: * + icon: + Filename: brsticon.shp + +smedi: + Inherits: ^ScrinCommonDeaths + stand: + Filename: smedi.shp + Facings: 8 + stand2: + Filename: smedi.shp + Facings: 8 + heal: + Filename: smedi.shp + Start: 40 + Length: 4 + Facings: 8 + run: + Filename: smedi.shp + Start: 8 + Length: 4 + Facings: 8 + Tick: 120 + idle1: + Filename: smedi.shp + Length: 2 + Tick: 120 + idle2: + Filename: smedi.shp + Start: 2 + Length: 2 + Tick: 120 + idle3: + Filename: smedi.shp + Start: 4 + Length: 2 + Tick: 120 + idle4: + Filename: smedi.shp + Start: 6 + Length: 2 + Tick: 120 + parachute: + Filename: smedi.shp + Start: 3 + die1: + Filename: smedi.shp + Start: 72 + Length: 8 + Tick: 80 + die2: + Filename: smedi.shp + Start: 80 + Length: 8 + Tick: 80 + die3: + Filename: smedi.shp + Start: 88 + Length: 8 + Tick: 80 + die4: + Filename: smedi.shp + Start: 88 + Length: 8 + Tick: 80 + die7: + Filename: smedi.shp + Start: 72 + Length: 8 + Tick: 80 + chrono-overlay: + Filename: chronofade_small.shp + Length: * + BlendMode: Additive + Offset: 0, 0 + ZOffset: 512 + Tick: 80 + icon: + Filename: smediicon.shp + +arti: + Inherits: ^ScrinCommonDeaths + stand: + Filename: arti.shp + Facings: 8 + stand2: + Filename: arti.shp + Facings: 8 + repair: + Filename: arti.shp + Start: 40 + Length: 4 + Facings: 8 + run: + Filename: arti.shp + Start: 8 + Length: 4 + Facings: 8 + Tick: 120 + idle1: + Filename: arti.shp + Length: 2 + Tick: 120 + idle2: + Filename: arti.shp + Start: 2 + Length: 2 + Tick: 120 + idle3: + Filename: arti.shp + Start: 4 + Length: 2 + Tick: 120 + idle4: + Filename: arti.shp + Start: 6 + Length: 2 + Tick: 120 + parachute: + Filename: arti.shp + Start: 3 + die1: + Filename: arti.shp + Start: 72 + Length: 8 + Tick: 80 + die2: + Filename: arti.shp + Start: 80 + Length: 8 + Tick: 80 + die3: + Filename: arti.shp + Start: 88 + Length: 8 + Tick: 80 + die4: + Filename: arti.shp + Start: 88 + Length: 8 + Tick: 80 + die7: + Filename: arti.shp + Start: 72 + Length: 8 + Tick: 80 + chrono-overlay: + Filename: chronofade_small.shp + Length: * + BlendMode: Additive + Offset: 0, 0 + ZOffset: 512 + Tick: 80 + icon: + Filename: artiicon.shp + +cscr: + Inherits: ^ScrinCommonDeaths + stand: + Filename: cscr.shp + Facings: 8 + stand2: + Filename: cscr.shp + Facings: 8 + run: + Filename: cscr.shp + Start: 8 + Length: 4 + Facings: 8 + Tick: 120 + shoot: + Filename: cscr.shp + Start: 40 + Length: 4 + Facings: 8 + Tick: 80 + idle1: + Filename: cscr.shp + Length: 2 + Tick: 120 + idle2: + Filename: cscr.shp + Start: 2 + Length: 2 + Tick: 120 + idle3: + Filename: cscr.shp + Start: 4 + Length: 2 + Tick: 120 + idle4: + Filename: cscr.shp + Start: 6 + Length: 2 + Tick: 120 + parachute: + Filename: cscr.shp + Start: 3 + die1: + Filename: cscr.shp + Start: 72 + Length: 8 + Tick: 80 + die2: + Filename: cscr.shp + Start: 80 + Length: 8 + Tick: 80 + die3: + Filename: cscr.shp + Start: 88 + Length: 8 + Tick: 80 + die4: + Filename: cscr.shp + Start: 88 + Length: 8 + Tick: 80 + die7: + Filename: cscr.shp + Start: 72 + Length: 8 + Tick: 80 + chrono-overlay: + Filename: chronofade_small.shp + Length: * + BlendMode: Additive + Offset: 0, 0 + ZOffset: 512 + Tick: 80 + muzzle: + Filename: lasermuzzle.shp + Frames: 0,1,2,1,2,1,2,1,2,1,2,1,2 + Length: * + IgnoreWorldTint: true + icon: + Filename: cscricon.shp + +gscr: + Inherits: ^ScrinCommonDeaths + stand: + Filename: gscr.shp + Facings: 8 + run: + Filename: gscr.shp + Start: 8 + Length: 4 + Facings: 8 + Tick: 120 + bash: + Filename: gscr.shp + Start: 40 + Length: 5 + Facings: 8 + Tick: 80 + make: + Filename: gscr.shp + Start: 129 + Length: 11 + Tick: 80 + idle1: + Filename: gscr.shp + Length: 2 + Tick: 120 + idle2: + Filename: gscr.shp + Start: 2 + Length: 2 + Tick: 120 + idle3: + Filename: gscr.shp + Start: 4 + Length: 2 + Tick: 120 + idle4: + Filename: gscr.shp + Start: 6 + Length: 2 + Tick: 120 + parachute: + Filename: gscr.shp + Start: 3 + die1: + Filename: gscr.shp + Start: 80 + Length: 8 + Tick: 80 + die2: + Filename: gscr.shp + Start: 88 + Length: 9 + Tick: 80 + die3: + Filename: gscr.shp + Start: 88 + Length: 9 + Tick: 80 + die4: + Filename: gscr.shp + Start: 88 + Length: 9 + Tick: 80 + die5: + Filename: gscr.shp + Start: 97 + Length: 11 + Tick: 80 + die6: + Filename: gscr.shp + Length: 13 + Start: 116 + die8: + Filename: chronozap.shp + Length: * + BlendMode: Alpha + die9: + Filename: gscr.shp + Start: 108 + Length: 8 + Tick: 80 + die10: + Filename: gscr.shp + Start: 108 + Length: 8 + Tick: 80 + die11: + Filename: gscr.shp + Start: 108 + Length: 8 + Tick: 80 + die12: + Filename: gscr.shp + Start: 108 + Length: 8 + Tick: 80 + chrono-overlay: + Filename: chronofade_small.shp + Length: * + BlendMode: Additive + Offset: 0, 0 + ZOffset: 512 + Tick: 80 + icon: + Filename: s2icon.shp + +mast: + Inherits: ^ScrinCommonDeaths + stand: + Filename: mast.shp + Facings: 8 + stand2: + Filename: mast.shp + Facings: 8 + run: + Filename: mast.shp + Start: 8 + Length: 4 + Facings: 8 + Tick: 120 + shoot: + Filename: mast.shp + Start: 40 + Length: 4 + Facings: 8 + idle1: + Filename: mast.shp + Length: 2 + Tick: 120 + idle2: + Filename: mast.shp + Start: 2 + Length: 2 + Tick: 120 + idle3: + Filename: mast.shp + Start: 4 + Length: 2 + Tick: 120 + idle4: + Filename: mast.shp + Start: 6 + Length: 2 + Tick: 120 + parachute: + Filename: mast.shp + Start: 3 + die1: + Filename: mast.shp + Start: 72 + Length: 8 + Tick: 80 + die2: + Filename: mast.shp + Start: 80 + Length: 8 + Tick: 80 + die3: + Filename: mast.shp + Start: 88 + Length: 8 + Tick: 80 + die4: + Filename: mast.shp + Start: 88 + Length: 8 + Tick: 80 + die7: + Filename: mast.shp + Start: 72 + Length: 8 + Tick: 80 + chrono-overlay: + Filename: chronofade_small.shp + Length: * + BlendMode: Additive + Offset: 0, 0 + ZOffset: 512 + Tick: 80 + mc: + Filename: mindcontroller.shp + Length: * + Tick: 120 + BlendMode: Alpha + Offset: 0, 0 + icon: + Filename: masticon.shp + pdgy-stand: + Filename: pdgy.shp + Facings: 8 + pdgy-run: + Filename: pdgy.shp + Start: 8 + Length: 4 + Facings: 8 + Tick: 120 + pdgy-shoot: + Filename: pdgy.shp + Start: 40 + Length: 5 + Facings: 8 + Tick: 80 + pdgy-make: + Filename: pdgy.shp + Start: 129 + Length: 11 + Tick: 80 + pdgy-idle1: + Filename: pdgy.shp + Length: 2 + Tick: 120 + pdgy-idle2: + Filename: pdgy.shp + Start: 2 + Length: 2 + Tick: 120 + pdgy-idle3: + Filename: pdgy.shp + Start: 4 + Length: 2 + Tick: 120 + pdgy-idle4: + Filename: pdgy.shp + Start: 6 + Length: 2 + Tick: 120 + pdgy-parachute: + Filename: pdgy.shp + Start: 3 + pdgy-die1: + Filename: pdgy.shp + Start: 80 + Length: 8 + Tick: 80 + pdgy-die2: + Filename: pdgy.shp + Start: 88 + Length: 9 + Tick: 80 + pdgy-die3: + Filename: pdgy.shp + Start: 88 + Length: 9 + Tick: 80 + pdgy-die4: + Filename: pdgy.shp + Start: 88 + Length: 9 + Tick: 80 + pdgy-die5: + Filename: pdgy.shp + Start: 97 + Length: 11 + Tick: 80 + pdgy-die6: + Filename: pdgy.shp + Length: 13 + Start: 116 + pdgy-die7: + Filename: pdgy.shp + Start: 80 + Length: 8 + Tick: 80 + pdgy-die8: + Filename: chronozap.shp + Length: * + BlendMode: Alpha + pdgy-die9: + Filename: pdgy.shp + Start: 108 + Length: 8 + Tick: 80 + pdgy-die10: + Filename: pdgy.shp + Start: 108 + Length: 8 + Tick: 80 + pdgy-die11: + Filename: pdgy.shp + Start: 80 + Length: 8 + Tick: 80 + pdgy-die12: + Filename: pdgy.shp + Start: 88 + Length: 9 + Tick: 80 + empty: + Filename: empty.shp + +harv.scrin: + Inherits: ^VehicleOverlays + idle: + Filename: harvscrin.shp + Facings: 32 + UseClassicFacings: True + harvest: + Filename: scrinharvest.shp + Length: * + ZOffset: -128 + BlendMode: Additive + icon: + Filename: harvscrinicon.shp + +harv.scrin.destroyed: + Inherits: ^VehicleOverlays + idle: + Filename: harvscrin.shp + Facings: 32 + UseClassicFacings: True + ZOffset: -512 + +gunw: + Inherits: ^VehicleOverlays + idle: + Filename: gunw.shp + Facings: 32 + UseClassicFacings: True + move: + Filename: gunw.shp + Start: 32 + Facings: 32 + Length: 2 + Tick: 80 + UseClassicFacings: True + muzzle: + Filename: scrinmuzz1.shp + Length: 6 Facings: 16 - icon: gunwicon + BlendMode: Additive + IgnoreWorldTint: true + icon: + Filename: gunwicon.shp gunw.destroyed: Inherits: ^VehicleOverlays - idle: gunw + idle: + Filename: gunw.shp + Facings: 32 + UseClassicFacings: True + ZOffset: -512 + +shrw: + Inherits: ^VehicleOverlays + idle: + Filename: shrw.shp + Facings: 32 + UseClassicFacings: True + move: + Filename: shrw.shp + Start: 32 + Facings: 32 + Length: 2 + Tick: 80 + UseClassicFacings: True + muzzle: + Filename: scrinmuzz5.shp + BlendMode: Additive + IgnoreWorldTint: true + Length: 6 + Facings: 16 + icon: + Filename: shrwicon.shp + +shrw.destroyed: + Inherits: ^VehicleOverlays + idle: + Filename: shrw.shp Facings: 32 UseClassicFacings: True ZOffset: -512 seek: Inherits: ^VehicleOverlays - idle: seek + idle: + Filename: seek.shp Facings: 32 UseClassicFacings: True - turret: seek + turret: + Filename: seek.shp Start: 32 Facings: 32 UseClassicFacings: True - icon: seekicon + icon: + Filename: seekicon.shp seek.destroyed: Inherits: ^VehicleOverlays - idle: seek + idle: + Filename: seek.shp Facings: 32 UseClassicFacings: True ZOffset: -512 - turret: seek + turret: + Filename: seek.shp Start: 32 Facings: 32 UseClassicFacings: True @@ -583,1091 +1671,2241 @@ seek.destroyed: lace: Inherits: ^VehicleOverlays - idle: lace + idle: + Filename: lace.shp Facings: 32 UseClassicFacings: True - turret: lace + turret: + Filename: lace.shp Start: 32 Facings: 32 UseClassicFacings: True - icon: laceicon + icon: + Filename: laceicon.shp intl: Inherits: ^VehicleOverlays - idle: intl + idle: + Filename: intl.shp Facings: 1 Start: 32 - turret: intl + turret: + Filename: intl.shp + Facings: 32 + UseClassicFacings: True + shield: + Filename: intlshield.shp Facings: 32 UseClassicFacings: True - muzzle: scrinmuzz4 + ZOffset: 1022 + BlendMode: Additive + muzzle: + Filename: scrinmuzz4.shp Length: * Tick: 40 ZOffset: 2049 BlendMode: Additive - icon: intlicon + IgnoreWorldTint: true + icon: + Filename: intlicon.shp intl.destroyed: Inherits: ^VehicleOverlays - idle: intl + idle: + Filename: intl.shp Facings: 32 UseClassicFacings: True ZOffset: -512 corr: Inherits: ^VehicleOverlays - idle: corr + idle: + Filename: corr.shp Facings: 32 UseClassicFacings: True - move: corr + move: + Filename: corr.shp Start: 32 Facings: 32 Length: 2 Tick: 150 UseClassicFacings: True - icon: corricon + icon: + Filename: corricon.shp corr.destroyed: Inherits: ^VehicleOverlays - idle: corr + idle: + Filename: corr.shp Facings: 32 UseClassicFacings: True ZOffset: -512 lchr: Inherits: ^VehicleOverlays - idle: lchr + idle: + Filename: lchr.shp Facings: 32 UseClassicFacings: True - move: lchr + move: + Filename: lchr.shp Start: 32 Facings: 32 Length: 2 Tick: 120 UseClassicFacings: True - icon: lchricon + muzzle: + Filename: leechhit.shp + Frames: 14,15,16,17,18 + BlendMode: Additive + IgnoreWorldTint: true + Length: * + Tick: 80 + icon: + Filename: lchricon.shp lchr.destroyed: Inherits: ^VehicleOverlays - idle: lchr + idle: + Filename: lchr.shp Facings: 32 UseClassicFacings: True ZOffset: -512 +lchr.orb: + Inherits: ^VehicleOverlays + Defaults: + Filename: lchrorb.shp + Alpha: 0.75 + ZOffset: 512 + idle: + Length: * + warped: + stcr: Inherits: ^VehicleOverlays - idle: stcr + idle: + Filename: stcr.shp Facings: 32 UseClassicFacings: True - muzzle: scrinmuzz2 + muzzle: + Filename: scrinmuzz2.shp + BlendMode: Additive + IgnoreWorldTint: true Length: 2 - icon: stcricon + shield: + Filename: intlshield.shp + Facings: 32 + UseClassicFacings: True + ZOffset: 1022 + BlendMode: Additive + Offset: 0, -4 + icon: + Filename: stcricon.shp + +stcr.destroyed: + Inherits: ^VehicleOverlays + idle: + Filename: stcr.shp + Facings: 32 + UseClassicFacings: True + ZOffset: -512 devo: Inherits: ^VehicleOverlays - idle: devo + idle: + Filename: devo.shp Facings: 1 Start: 32 - turret: devo + turret: + Filename: devo.shp Facings: 32 UseClassicFacings: True - muzzle: scrinmuzz2 - Length: 5 - icon: devoicon + muzzle: + Filename: scrinmuzz2.shp + BlendMode: Additive + IgnoreWorldTint: true + Length: * + Frames: 0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,4 + icon: + Filename: devoicon.shp devo.destroyed: Inherits: ^VehicleOverlays - idle: devo + idle: + Filename: devo.shp Facings: 32 UseClassicFacings: True ZOffset: -512 dark: Inherits: ^VehicleOverlays - idle: dark + idle: + Filename: dark.shp + Facings: 32 + UseClassicFacings: True + turret: + Filename: dark.shp + Facings: 32 + Start: 32 + UseClassicFacings: True + muzzle: + Filename: scrinmuzz3.shp + Length: 5 + BlendMode: Subtractive + IgnoreWorldTint: true + icon: + Filename: darkicon.shp + +ruin: + Inherits: ^VehicleOverlays + idle: + Filename: ruin.shp + Facings: 1 + Start: 32 + turret: + Filename: ruin.shp + Facings: 32 + UseClassicFacings: True + muzzle: + Filename: scrinmuzz3.shp + Length: 5 + BlendMode: Additive + IgnoreWorldTint: true + icon: + Filename: ruinicon.shp + +ruin.destroyed: + Inherits: ^VehicleOverlays + idle: + Filename: ruin.shp + Facings: 32 + UseClassicFacings: True + ZOffset: -512 + +atmz: + Inherits: ^VehicleOverlays + idle: + Filename: atmz.shp + Facings: 32 + UseClassicFacings: True + turret: + Filename: atmz.shp + Facings: 32 + Start: 32 + UseClassicFacings: True + icon: + Filename: atmzicon.shp + +tpod: + Inherits: ^VehicleOverlays + idle: + Filename: tpod.shp + Facings: 1 + Start: 32 + turret: + Filename: tpod.shp + Facings: 32 + UseClassicFacings: True + move: + Filename: tpod.shp + Start: 33 + Facings: 8 + Length: 14 + Tick: 60 + muzzle: + Filename: scrinmuzz2.shp + Length: * + Frames: 0,1,2,0,1,2,3,4 + BlendMode: Additive + IgnoreWorldTint: true + icon: + Filename: tpodicon.shp + +tpod.destroyed: + Inherits: ^VehicleOverlays + idle: + Filename: tpod.shp + Facings: 1 + Start: 32 + ZOffset: -512 + turret: + Filename: tpod.shp Facings: 32 UseClassicFacings: True - turret: dark + ZOffset: -512 + +rtpd: + Inherits: ^VehicleOverlays + idle: + Filename: tpod.shp + Facings: 1 + Start: 32 + turret: + Filename: rtpd.shp Facings: 32 + UseClassicFacings: True + Offset: 0,-25 + move: + Filename: tpod.shp + Start: 33 + Facings: 8 + Length: 14 + Tick: 60 + muzzle: + Filename: scrinmuzz3.shp + Length: * + Frames: 0,1,2,0,1,2,3,4 + BlendMode: Additive + IgnoreWorldTint: true + icon: + Filename: rtpdicon.shp + +rtpd.destroyed: + Inherits: ^VehicleOverlays + idle: + Filename: tpod.shp + Facings: 1 Start: 32 + ZOffset: -512 + turret: + Filename: rtpd.shp + Facings: 32 UseClassicFacings: True - muzzle: scrinmuzz3 - Length: 5 - BlendMode: Subtractive - icon: darkicon + ZOffset: -512 -ruin: +etpd: Inherits: ^VehicleOverlays - idle: ruin + idle: + Filename: etpd.shp Facings: 1 Start: 32 - turret: ruin + turret: + Filename: etpd.shp Facings: 32 UseClassicFacings: True - muzzle: scrinmuzz3 - Length: 5 - icon: ruinicon + move: + Filename: etpd.shp + Start: 33 + Facings: 8 + Length: 14 + Tick: 90 + muzzle: + Filename: leechhit.shp + Length: * + Frames: 4,3,2,1,0,4,3,2,1,0 + BlendMode: Additive + icon: + Filename: tpodicon.shp + shield: + Filename: etpdshield.shp + Facings: 1 + ZOffset: 1022 + BlendMode: Additive + Offset: 0,-12 -ruin.destroyed: +etpd.destroyed: Inherits: ^VehicleOverlays - idle: ruin + idle: + Filename: etpd.shp + Facings: 1 + Start: 32 + ZOffset: -512 + turret: + Filename: etpd.shp Facings: 32 UseClassicFacings: True ZOffset: -512 -atmz: +veng: Inherits: ^VehicleOverlays - idle: atmz + idle: + Filename: veng.shp + Frames: 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62 Facings: 32 UseClassicFacings: True - turret: atmz + muzzle: + Filename: rift.shp + Length: * + Frames: 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23 + Alpha: 0.96, 0.88, 0.80, 0.72, 0.64, 0.56, 0.48, 0.40, 0.32, 0.24, 0.16, 0.08 + ZOffset: 2048 + BlendMode: Subtractive + IgnoreWorldTint: true + Scale: 0.4 + Tick: 60 + icon: + Filename: oblticon.shp + +veng.destroyed: + Inherits: ^VehicleOverlays + idle: + Filename: veng.shp + Frames: 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62 Facings: 32 - Start: 32 + ZOffset: -512 UseClassicFacings: True - icon: atmzicon -tpod: +oblt: Inherits: ^VehicleOverlays - idle: tpod + idle: + Filename: empty.shp Facings: 1 - Start: 32 - turret: tpod + turret: + Filename: oblt.shp Facings: 32 UseClassicFacings: True - move: tpod - Start: 33 - Facings: 8 - Length: 14 - Tick: 60 - muzzle: scrinmuzz2 - Length: 5 - icon: tpodicon + muzzle: + Filename: scrinmuzz2.shp + icon: + Filename: oblticon.shp -tpod.destroyed: +oblt.destroyed: Inherits: ^VehicleOverlays - idle: tpod - Facings: 1 - Start: 32 - ZOffset: -512 - turret: tpod + idle: + Filename: oblt.shp Facings: 32 UseClassicFacings: True ZOffset: -512 -rptp: +null: Inherits: ^VehicleOverlays - idle: tpod - Facings: 1 - Start: 32 - turret: rptp + idle: + Filename: empty.shp + turret: + Filename: null.shp Facings: 32 UseClassicFacings: True - Offset: 0,-25 - move: tpod - Start: 33 - Facings: 8 - Length: 14 - Tick: 60 - muzzle: scrinmuzz3 - Length: 5 - icon: rptpicon + muzzle: + Filename: gunfire2.shp + Length: 2 + icon: + Filename: nullicon.shp -rptp.destroyed: +null.destroyed: Inherits: ^VehicleOverlays - idle: tpod - Facings: 1 - Start: 32 - ZOffset: -512 - turret: rptp + idle: + Filename: null.shp Facings: 32 UseClassicFacings: True ZOffset: -512 smcv: Inherits: ^VehicleOverlays - idle: smcv + idle: + Filename: smcv.shp Facings: 1 Offset: 0, -4 - icon: smcvicon + icon: + Filename: smcvicon.shp smcv.destroyed: Inherits: ^VehicleOverlays - idle: smcv + idle: + Filename: smcv.shp Facings: 1 ZOffset: -512 stmr: Inherits: ^VehicleOverlays - idle: stmr + idle: + Filename: stmr.shp + Facings: 32 + UseClassicFacings: True + shield: + Filename: stmrshield.shp + Facings: 32 + UseClassicFacings: True + ZOffset: 1022 + BlendMode: Additive + muzzle: + Filename: scrinmuzz7.shp + Length: * + BlendMode: Additive + IgnoreWorldTint: true + icon: + Filename: stmricon.shp + +torm: + Inherits: ^VehicleOverlays + idle: + Filename: torm.shp Facings: 32 UseClassicFacings: True - icon: stmricon + shield: + Filename: intlshield.shp + Facings: 32 + UseClassicFacings: True + ZOffset: 1022 + BlendMode: Additive + Scale: 0.8 + Offset: 0, -3 + muzzle: + Filename: scrinmuzz7.shp + Length: * + BlendMode: Additive + IgnoreWorldTint: true + icon: + Filename: tormicon.shp enrv: Inherits: ^VehicleOverlays - idle: enrv + idle: + Filename: enrv.shp + Facings: 32 + UseClassicFacings: True + shield: + Filename: enrvshield.shp Facings: 32 UseClassicFacings: True - icon: enrvicon + ZOffset: 1022 + BlendMode: Additive + icon: + Filename: enrvicon.shp deva: Inherits: ^VehicleOverlays - idle: deva + idle: + Filename: deva.shp Facings: 32 UseClassicFacings: True - shield: scrinshield + shield: + Filename: scrinshield.shp Facings: 32 UseClassicFacings: True ZOffset: 1022 BlendMode: Additive - icon: devaicon + charge1: + Filename: plasmatorp1.shp + IgnoreWorldTint: true + BlendMode: Additive + Length: 5 + Tick: 40 + ZOffset: 2048 + charge2: + Filename: plasmatorp2.shp + IgnoreWorldTint: true + BlendMode: Additive + Length: 5 + Tick: 40 + ZOffset: 2048 + charge3: + Filename: plasmatorp3.shp + IgnoreWorldTint: true + BlendMode: Additive + Length: 5 + Tick: 40 + ZOffset: 2048 + icon: + Filename: devaicon.shp pac: Inherits: ^VehicleOverlays - idle: pac + idle: + Filename: pac.shp Facings: 32 UseClassicFacings: True - half-deployed: pac + half-deployed: + Filename: pac.shp Start: 32 Facings: 32 UseClassicFacings: True - fully-deployed: pac + fully-deployed: + Filename: pac.shp Start: 64 Facings: 32 UseClassicFacings: True - shield: scrinshield + shield: + Filename: scrinshield.shp Facings: 32 UseClassicFacings: True ZOffset: 1022 BlendMode: Additive - icon: pacicon + icon: + Filename: pacicon.shp inva: Inherits: ^VehicleOverlays - idle: inva + idle: + Filename: inva.shp Facings: 32 UseClassicFacings: True - icon: wipicon + icon: + Filename: wipicon.shp mshp: Inherits: ^VehicleOverlays - idle: mshp + emp-overlay: + Filename: emp_fx01.shp + ZOffset: 3073 + chrono-overlay: + Filename: chronofade.shp + ZOffset: 3073 + mind-overlay: + Filename: mindanim.shp + ZOffset: 3073 + idle: + Filename: mshp.shp Facings: 32 UseClassicFacings: True - ZOffset: 2049 - ring: mshpring + ZOffset: 3071 + ring: + Filename: mshpring.shp Length: * Tick: 200 - ZOffset: 2050 - wormholebeam: wormholebeam + ZOffset: 3072 + wormholebeam: + Filename: wormholebeam.shp Length: * Tick: 40 Offset: 0, 40, 0 BlendMode: Additive - icon: mshpicon + shield: + Filename: mshpshield.shp + Facings: 1 + ZOffset: 3073 + BlendMode: Additive + muzzle: + Filename: scrinmuzz2.shp + Frames: 5,5,5,5,5,0,1,2,3,4,0,1,2,3,4,0,1,2,3,4 + Facings: 4 + Length: 5 + ZOffset: 3071 + BlendMode: Additive + IgnoreWorldTint: true + empty: + Filename: empty.shp + icon: + Filename: mshpicon.shp # # ---- buildings # swal: - idle: swal + idle: + Filename: swal.shp Length: 16 - scratched-idle: swal + scratched-idle: + Filename: swal.shp Start: 16 Length: 16 - damaged-idle: swal + damaged-idle: + Filename: swal.shp Start: 32 Length: 16 - icon: swalicon + icon: + Filename: swalicon.shp sfac: Inherits: ^StructureOverlays - idle: sfac + idle: + Filename: sfac.shp Length: 1 Tick: 160 Offset: 0, -13 - build: sfac + build: + Filename: sfac.shp Length: 1 Tick: 160 Offset: 0, -13 - pdox: sfac + pdox: + Filename: sfac.shp Length: 1 Tick: 160 Offset: 0, -13 - damaged-idle: sfac + damaged-idle: + Filename: sfac.shp Length: 1 Start: 1 Tick: 160 Offset: 0, -13 - damaged-build: sfac + damaged-build: + Filename: sfac.shp Length: 1 Start: 1 Tick: 160 Offset: 0, -13 - damaged-pdox: sfac + damaged-pdox: + Filename: sfac.shp Length: 1 Start: 1 Tick: 160 Offset: 0, -13 - make: sfacmake + make: + Filename: sfacmake.shp Length: * - Tick: 80 + Tick: 40 Offset: 0, -13 - bib: bib2 - Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - icon: afacicon + bib: + Filename: bib2.tem + TilesetFilenames: + SNOW: bib2.sno + DESERT: bib2.des + JUNGLE: bib2.jun + WINTER: bib2.win + BARREN: bib2.bar + Length: * + icon: + Filename: afacicon.shp reac: Inherits: ^StructureOverlays - idle: reac - damaged-idle: reac + idle: + Filename: reac.shp + damaged-idle: + Filename: reac.shp Start: 1 - make: reacmake + make: + Filename: reacmake.shp Length: * Tick: 80 - bib: bib3 + bib: + Filename: bib3.tem + TilesetFilenames: + SNOW: bib3.sno + DESERT: bib3.des + JUNGLE: bib3.jun + WINTER: bib3.win + BARREN: bib3.bar Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - icon: reacicon + icon: + Filename: reacicon.shp proc.scrin: Inherits: ^StructureOverlays - idle: procscrin + idle: + Filename: procscrin.shp Offset: -2,0 - damaged-idle: procscrin + damaged-idle: + Filename: procscrin.shp Start: 1 Offset: -2,0 - make: procscrinmake + make: + Filename: procscrinmake.shp Length: * Tick: 80 Offset: -2,0 - bib: bib2 - Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - icon: procscrinicon + bib: + Filename: bib2.tem + TilesetFilenames: + SNOW: bib2.sno + DESERT: bib2.des + JUNGLE: bib2.jun + WINTER: bib2.win + BARREN: bib2.bar + Length: * + icon: + Filename: procscrinicon.shp port: Inherits: ^StructureOverlays - idle: port + idle: + Filename: port.shp Length: 1 - idle-overlay: port + idle-overlay: + Filename: port.shp Start: 2 Length: 13 BlendMode: Additive ZOffset: -512 - damaged-idle: port + damaged-idle: + Filename: port.shp Start: 1 Length: 1 - make: portmake + make: + Filename: portmake.shp Length: * Tick: 80 - bib: bib3 + bib: + Filename: bib3.tem + TilesetFilenames: + SNOW: bib3.sno + DESERT: bib3.des + JUNGLE: bib3.jun + WINTER: bib3.win + BARREN: bib3.bar Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - icon: porticon + icon: + Filename: porticon.shp wsph: Inherits: ^StructureOverlays - idle: wsph + idle: + Filename: wsph.shp ZOffset: -512 - idle-overlay: wsph + idle-overlay: + Filename: wsph.shp Start: 2 Length: 13 BlendMode: Additive ZOffset: -256 - damaged-idle: wsph + damaged-idle: + Filename: wsph.shp Start: 1 ZOffset: -512 - make: wsphmake + make: + Filename: wsphmake.shp Length: * Tick: 80 - bib: bib2 + bib: + Filename: bib2.tem + TilesetFilenames: + SNOW: bib2.sno + DESERT: bib2.des + JUNGLE: bib2.jun + WINTER: bib2.win + BARREN: bib2.bar Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - emp-overlay: emp_fx01 + emp-overlay: + Filename: emp_fx01.shp ZOffset: 2048 - chrono-overlay: chronofade + chrono-overlay: + Filename: chronofade.shp ZOffset: 2048 - icon: wsphicon + icon: + Filename: wsphicon.shp grav: Inherits: ^StructureOverlays - idle: grav + idle: + Filename: grav.shp ZOffset: -512 - idle-overlay: grav + idle-overlay: + Filename: grav.shp Start: 3 Length: 13 BlendMode: Additive Offset: 0,-1 ZOffset: -256 - idle-pylon: grav + idle-overlay-activate: + Filename: wormhole.shp + Length: 15 + Frames: 21, 21, 21, 21, 21, 21, 21, 21, 20, 19, 18, 17, 16, 15, 14 + BlendMode: Additive + Offset: -3,-6 + ZOffset: -256 + idle-overlay-deactivate: + Filename: wormhole.shp + Start: 14 + Length: 7 + BlendMode: Additive + Offset: -3,-6 + ZOffset: -256 + Tick: 60 + idle-pylon: + Filename: grav.shp Start: 2 Length: 1 ZOffset: 2048 - damaged-idle: grav + damaged-idle: + Filename: grav.shp Start: 1 ZOffset: -512 - make: gravmake + muzzle: + Filename: playerzapmuzzle.shp + ZOffset: 3072 + Length: * + BlendMode: Additive + IgnoreWorldTint: true + make: + Filename: gravmake.shp Length: * Tick: 80 - bib: bib2 + bib: + Filename: bib2.tem + TilesetFilenames: + SNOW: bib2.sno + DESERT: bib2.des + JUNGLE: bib2.jun + WINTER: bib2.win + BARREN: bib2.bar Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - icon: gravicon + icon: + Filename: gravicon.shp nerv: Inherits: ^StructureOverlays - idle: nerv - active: nerv - damaged-idle: nerv + idle: + Filename: nerv.shp + Offset: 0, -4 + active: + Filename: nerv.shp + Offset: 0, -4 + damaged-idle: + Filename: nerv.shp Start: 1 - make: nervmake + Offset: 0, -4 + make: + Filename: nervmake.shp Length: * Tick: 80 - bib: bib3 - Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - icon: nervicon + Offset: 0, -4 + bib: + Filename: bib3.tem + TilesetFilenames: + SNOW: bib3.sno + DESERT: bib3.des + JUNGLE: bib3.jun + WINTER: bib3.win + BARREN: bib3.bar + Length: * + icon: + Filename: nervicon.shp srep: Inherits: ^StructureOverlays - idle: srep + idle: + Filename: srep.shp Offset: 0,4 ZOffset: -1c511 - damaged-idle: srep + damaged-idle: + Filename: srep.shp Start: 10 Offset: 0,4 ZOffset: -1c511 - active: srep + active: + Filename: srep.shp Length: 10 Offset: 0,4 Tick: 80 ZOffset: -1c511 - damaged-active: srep + damaged-active: + Filename: srep.shp Length: 10 Start: 10 Offset: 0,4 Tick: 80 ZOffset: -1c511 - make: srepmake + make: + Filename: srepmake.shp Length: * Offset: 0,4 Tick: 80 - bib: mbFIX + bib: + Filename: mbFIX.tem + TilesetFilenames: + SNOW: mbFIX.sno + INTERIOR: mbFIX.int + DESERT: mbFIX.des + JUNGLE: mbFIX.jun + WINTER: mbFIX.win Length: * ZOffset: -1c511 Offset: 0,-4 - UseTilesetExtension: true - TilesetOverrides: - BARREN: TEMPERAT - icon: srepicon + icon: + Filename: srepicon.shp rea2: Inherits: ^StructureOverlays - idle: rea2 + idle: + Filename: rea2.shp Offset: 2,0 - damaged-idle: rea2 + damaged-idle: + Filename: rea2.shp Start: 1 Offset: 2,0 - make: rea2make + make: + Filename: rea2make.shp Length: * Offset: 2,0 Tick: 80 - bib: bib2 + bib: + Filename: bib2.tem + TilesetFilenames: + SNOW: bib2.sno + DESERT: bib2.des + JUNGLE: bib2.jun + WINTER: bib2.win + BARREN: bib2.bar Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - icon: rea2icon + icon: + Filename: rea2icon.shp scrt: Inherits: ^StructureOverlays - idle: scrt + idle: + Filename: scrt.shp Offset: 3,0 - active: scrt - damaged-idle: scrt + active: + Filename: scrt.shp + damaged-idle: + Filename: scrt.shp Offset: 3,0 Start: 1 - make: scrtmake + make: + Filename: scrtmake.shp Length: * Offset: 3,0 Tick: 80 - bib: bib3 + bib: + Filename: bib3.tem + TilesetFilenames: + SNOW: bib3.sno + DESERT: bib3.des + JUNGLE: bib3.jun + WINTER: bib3.win + BARREN: bib3.bar Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - icon: scrticon + icon: + Filename: scrticon.shp silo.scrin: Inherits: ^StructureOverlays - idle: siloscrin + idle: + Filename: siloscrin.shp + Offset: 0,-1 + damaged-idle: + Filename: siloscrin.shp + Offset: 0,-1 + Start: 5 + stages: + Filename: siloscrin.shp + Length: 5 + Offset: 0,-1 + damaged-stages: + Filename: siloscrin.shp + Start: 5 + Length: 5 + Offset: 0,-1 + make: + Filename: siloscrinmake.shp + Length: * + Offset: 0,-1 + bib: + Filename: mbSILO.tem + TilesetFilenames: + SNOW: mbSILO.sno + DESERT: mbSILO.des + JUNGLE: mbSILO.jun + WINTER: mbSILO.win + Length: * + icon: + Filename: siloscrinicon.shp + +silo.scrinblue: + Inherits: ^StructureOverlays + idle: + Filename: siloscrinblue.shp Offset: 0,-1 - damaged-idle: siloscrin + damaged-idle: + Filename: siloscrinblue.shp Offset: 0,-1 Start: 5 - stages: siloscrin + stages: + Filename: siloscrinblue.shp Length: 5 Offset: 0,-1 - damaged-stages: siloscrin + damaged-stages: + Filename: siloscrinblue.shp Start: 5 Length: 5 Offset: 0,-1 - make: siloscrinmake + make: + Filename: siloscrinmake.shp Length: * Offset: 0,-1 - bib: mbSILO + bib: + Filename: mbSILO.tem + TilesetFilenames: + SNOW: mbSILO.sno + DESERT: mbSILO.des + JUNGLE: mbSILO.jun + WINTER: mbSILO.win Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - BARREN: TEMPERAT - icon: siloscrinicon + icon: + Filename: siloscrinicon.shp sign: Inherits: ^StructureOverlays - idle: sign - damaged-idle: sign + idle: + Filename: sign.shp + damaged-idle: + Filename: sign.shp Start: 1 - bib: bib2 + bib: + Filename: bib2.tem + TilesetFilenames: + SNOW: bib2.sno + DESERT: bib2.des + JUNGLE: bib2.jun + WINTER: bib2.win + BARREN: bib2.bar Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - make: signmake + make: + Filename: signmake.shp Length: * Tick: 80 - icon: signicon + icon: + Filename: signicon.shp mani: Inherits: ^StructureOverlays - idle: mani - active: mani - damaged-idle: mani + idle: + Filename: mani.shp + Offset: 0, -11 + active: + Filename: mani.shp + Offset: 0, -11 + damaged-idle: + Filename: mani.shp Start: 1 - bib: bib3 - Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - make: manimake + Offset: 0, -11 + make: + Filename: manimake.shp Length: * Tick: 80 - icon: maniicon + Offset: 0, -11 + bib: + Filename: bib3.tem + TilesetFilenames: + SNOW: bib3.sno + DESERT: bib3.des + JUNGLE: bib3.jun + WINTER: bib3.win + BARREN: bib3.bar + Length: * + icon: + Filename: maniicon.shp -rift: +rfgn: Inherits: ^StructureOverlays - idle: rift - damaged-idle: rift + idle: + Filename: rfgn.shp + damaged-idle: + Filename: rfgn.shp Start: 1 - active: rift - damaged-active: rift + active: + Filename: rfgn.shp + damaged-active: + Filename: rfgn.shp Start: 1 - make: riftmake + make: + Filename: rfgnmake.shp Length: * Tick: 80 - active-overlay: rift + active-overlay: + Filename: rfgn.shp Start: 2 Length: 13 BlendMode: Subtractive ZOffset: 511 Offset: 0,-30 - bib: mbIRON + bib: + Filename: mbIRON.tem + TilesetFilenames: + SNOW: mbIRON.sno + INTERIOR: mbIRON.int + DESERT: mbIRON.des + WINTER: mbIRON.win Length: * Offset: 0,2 - UseTilesetExtension: true - TilesetOverrides: - JUNGLE: TEMPERAT - BARREN: TEMPERAT - icon: rifticon + icon: + Filename: rfgnicon.shp ptur: Inherits: ^StructureOverlays - idle: ptur + idle: + Filename: empty.shp + damaged-idle: + Filename: empty.shp + turret: + Filename: ptur.shp Facings: 32 UseClassicFacings: True Offset: 1,-6 - make: pturmake + make: + Filename: pturmake.shp Length: * Offset: 1,-6 - damaged-idle: ptur + damaged-turret: + Filename: ptur.shp Start: 32 Facings: 32 UseClassicFacings: True Offset: 1,-6 - muzzle: scrinmuzz1 + muzzle: + Filename: scrinmuzz1.shp Length: 6 Facings: 16 - bib: mbGUN + BlendMode: Additive + IgnoreWorldTint: true + bib: + Filename: mbGUN.tem + TilesetFilenames: + SNOW: mbGUN.sno + INTERIOR: mbGUN.int + DESERT: mbGUN.des + JUNGLE: mbGUN.jun + WINTER: mbGUN.win Length: * Offset: -1,-1 - UseTilesetExtension: true - TilesetOverrides: - BARREN: TEMPERAT - icon: pturicon + icon: + Filename: pturicon.shp shar: Inherits: ^StructureOverlays - idle: shar + idle: + Filename: empty.shp + damaged-idle: + Filename: empty.shp + turret: + Filename: shar.shp Facings: 32 UseClassicFacings: True Offset: 1,-11 - make: sharmake + make: + Filename: sharmake.shp Length: * Offset: 1,-11 - damaged-idle: shar + damaged-turret: + Filename: shar.shp Start: 32 Facings: 32 UseClassicFacings: True Offset: 1,-11 - bib: mbTSLA - Length: * - UseTilesetExtension: true - TilesetOverrides: - BARREN: TEMPERAT - icon: sharicon + muzzle: + Filename: scrinmuzz5.shp + BlendMode: Additive + IgnoreWorldTint: true + Length: 6 + Facings: 16 + bib: + Filename: mbTSLA.tem + TilesetFilenames: + SNOW: mbTSLA.sno + INTERIOR: mbTSLA.int + DESERT: mbTSLA.des + JUNGLE: mbTSLA.jun + WINTER: mbTSLA.win + Length: * + icon: + Filename: sharicon.shp scol: Inherits: ^StructureOverlays - idle: scol + idle: + Filename: scol.shp Length: 1 Offset: 0,-12 - damaged-idle: scol + damaged-idle: + Filename: scol.shp Start: 1 Length: 1 Offset: 0,-12 - make: scolmake + make: + Filename: scolmake.shp + Length: * + Offset: 0,-12 + bib: + Filename: mbTSLA.tem + TilesetFilenames: + SNOW: mbTSLA.sno + INTERIOR: mbTSLA.int + DESERT: mbTSLA.des + JUNGLE: mbTSLA.jun + WINTER: mbTSLA.win + Length: * + icon: + Filename: scolicon.shp + +sspk: + Inherits: ^StructureOverlays + idle: + Filename: sspk.shp + Length: 1 + Offset: 0,-12 + damaged-idle: + Filename: sspk.shp + Start: 11 + Length: 1 + Offset: 0,-12 + make: + Filename: sspk.shp + Frames: 1,2,3,4,5,6,7,8,9,10 Length: * Offset: 0,-12 - bib: mbTSLA + bib: + Filename: mbTSLA.tem + TilesetFilenames: + SNOW: mbTSLA.sno + INTERIOR: mbTSLA.int + DESERT: mbTSLA.des + JUNGLE: mbTSLA.jun + WINTER: mbTSLA.win + Length: * + icon: + Filename: scolicon.shp + +vspk: + Inherits: ^StructureOverlays + Defaults: + Filename: vspk.shp + ZOffset: 512 + idle: + Length: * + Frames: 0,1,2,3,4,0,0,0,0,0,0,0,0,0,0,0 + Offset: 0,-15 + Tick: 80 + damaged-idle: + Frames: 0,1,2,3,4,0,0,0,0,0,0,0,0,0,0,0 + Length: * + Offset: 0,-15 + Tick: 80 + make: + Length: 14 + Start: 5 + Offset: 0,-15 + overlay: + Filename: voidpulse.shp + Length: * + BlendMode: Subtractive + ZOffset: -1 + Alpha: 0.45 + Offset: 1, 1 + Scale: 2 + IgnoreWorldTint: true + Tick: 40 + bib: + ZOffset: 0 + Filename: mbTSLA.tem + TilesetFilenames: + SNOW: mbTSLA.sno + INTERIOR: mbTSLA.int + DESERT: mbTSLA.des + JUNGLE: mbTSLA.jun + WINTER: mbTSLA.win + Length: * + icon: + Filename: vspkicon.shp + +ispk: + Inherits: ^StructureOverlays + Defaults: + Filename: ispk.shp + ZOffset: 512 + idle: + Offset: 0,-18 + damaged-idle: + Offset: 0,-18 + idle2: + Frames: 1,5 + Length: * + Tick: 120 + Offset: 0,-18 + idle3: + Frames: 7,3 + Length: * + Tick: 120 + Offset: 0,-18 + idle4: + Frames: 4,2 + Length: * + Tick: 120 + Offset: 0,-18 + idle5: + Frames: 3,5,7 + Length: * + Tick: 120 + Offset: 0,-18 + idle5: + Frames: 6,1 + Length: * + Tick: 120 + Offset: 0,-18 + make: + Frames: 17,16,15,14,13,12,11,10,9,8 Length: * - UseTilesetExtension: true - TilesetOverrides: - BARREN: TEMPERAT - icon: scolicon + Tick: 60 + Offset: 0,-18 + bib: + Filename: mbTSLA.tem + TilesetFilenames: + SNOW: mbTSLA.sno + INTERIOR: mbTSLA.int + DESERT: mbTSLA.des + JUNGLE: mbTSLA.jun + WINTER: mbTSLA.win + Length: * + ZOffset: 0 + Offset: -1,1 + icon: + Filename: ispkicon.shp + +cspk: + Inherits: ^StructureOverlays + Defaults: + Filename: cspk.shp + ZOffset: 512 + idle: + Offset: 0,-18 + damaged-idle: + Offset: 0,-18 + make: + Start: 1 + Length: 11 + Tick: 60 + Offset: 0,-18 + bib: + Filename: mbTSLA.tem + TilesetFilenames: + SNOW: mbTSLA.sno + INTERIOR: mbTSLA.int + DESERT: mbTSLA.des + JUNGLE: mbTSLA.jun + WINTER: mbTSLA.win + Length: * + ZOffset: 0 + Offset: -1,1 + icon: + Filename: cspkicon.shp # # ---- animations # plasdiscsm: - idle: plasdiscsm + idle: + Filename: plasdiscsm.shp BlendMode: Additive + IgnoreWorldTint: true Length: * - ZOffset: 1023 + ZOffset: 2047 Tick: 50 plasdiscmd: - idle: plasdiscmd + idle: + Filename: plasdiscmd.shp BlendMode: Additive + IgnoreWorldTint: true Length: * - ZOffset: 1023 + ZOffset: 2047 Tick: 50 plasdisclg: - idle: plasdisclg + idle: + Filename: plasdisclg.shp BlendMode: Additive + IgnoreWorldTint: true Length: * - ZOffset: 1023 + ZOffset: 2047 Tick: 50 -tibglob: - idle: tibglob +mrdrdisc: + idle: + Filename: mrdrdisc.shp BlendMode: Additive + IgnoreWorldTint: true + Length: 2 + Facings: 8 + ZOffset: 2047 + Tick: 50 + InterpolatedFacings: 32 + Alpha: 0.8 + +tibglob: + idle: + Filename: tibglob.shp + IgnoreWorldTint: true Length: * - ZOffset: 1023 + ZOffset: 2047 Tick: 40 tibgloblg: - idle: tibgloblg - BlendMode: Additive + idle: + Filename: tibgloblg.shp + IgnoreWorldTint: true Length: * - ZOffset: 1023 + ZOffset: 2047 Tick: 40 atmzbolt: - idle: atmzbolt + idle: + Filename: atmzbolt.shp BlendMode: Additive + IgnoreWorldTint: true Length: * - ZOffset: 1023 + ZOffset: 2047 Tick: 40 atmzbolttrail: - idle: atmzbolttrail + idle: + Filename: atmzbolttrail.shp BlendMode: Additive + IgnoreWorldTint: true Length: * ZOffset: 2047 atmzbolthit: - idle: atmzbolthit + idle: + Filename: atmzbolthit.shp BlendMode: Additive + IgnoreWorldTint: true Length: * ZOffset: 2047 -enrvbolt - idle: enrvbolt +enrvbolt: + idle: + Filename: enrvbolt.shp BlendMode: Additive + IgnoreWorldTint: true Length: * - ZOffset: 1023 + ZOffset: 2047 Tick: 50 enrvbolthit: - idle: enrvbolthit + idle: + Filename: enrvbolthit.shp BlendMode: Additive + IgnoreWorldTint: true Length: * ZOffset: 2047 tibexplode: - idle: tibexplode + idle: + Filename: tibexplode.shp Length: * ZOffset: 2047 tibexplodesm: - idle: tibexplodesm + idle: + Filename: tibexplodesm.shp + Length: * + ZOffset: 2047 + +tibexplodeair: + idle: + Filename: tibexplodeair.shp Length: * ZOffset: 2047 +evischargedhit: + idle: + Filename: tibexplodeair.shp + Length: * + ZOffset: 2047 + Scale: 0.5 + tibspew1: idle: + Filename: tibspew1.shp Length: * - ZOffset: 1023 + ZOffset: 2047 tibspew2: idle: + Filename: tibspew2.shp Facings: 32 - ZOffset: 1023 + ZOffset: 2047 scrinzap: - idle: scrinzap - ZOffset: 1023 + idle: + Filename: scrinzap.shp + BlendMode: Additive + IgnoreWorldTint: true + ZOffset: 2047 Facings: 32 scrinzapdown: - idle: scrinzapdown - ZOffset: 1023 + idle: + Filename: scrinzapdown.shp + BlendMode: Additive + IgnoreWorldTint: true + ZOffset: 2047 Facings: 32 scrinzapup: - idle: scrinzapup - ZOffset: 1023 + idle: + Filename: scrinzapup.shp + ZOffset: 2047 + BlendMode: Additive + IgnoreWorldTint: true Facings: 32 scrinzaphit: - idle: scrinmuzz2 - ZOffset: 1023 + idle: + Filename: scrinmuzz2.shp + ZOffset: 2047 + IgnoreWorldTint: true + BlendMode: Additive Length: 5 scrinzaphitsm: - idle: scrinzaphitsm - ZOffset: 1023 + idle: + Filename: scrinzaphitsm.shp + ZOffset: 2047 + IgnoreWorldTint: true + BlendMode: Additive Length: 3 shardhit: - idle: shardhit + Defaults: + ZOffset: 2047 + IgnoreWorldTint: true + BlendMode: Additive + idle: + Filename: shardhit.shp Length: 3 - ZOffset: 1023 - idle2: shardhit + idle2: + Filename: shardhit.shp Start: 3 Length: 3 - ZOffset: 1023 - idle3: shardhit + idle3: + Filename: shardhit.shp Start: 6 Length: 3 - ZOffset: 1023 - idle4: shardhit + idle4: + Filename: shardhit.shp Start: 9 Length: 3 - ZOffset: 1023 shard: - idle: shard + idle: + Filename: shard.shp Facings: 32 - ZOffset: 1023 + ZOffset: 2047 + IgnoreWorldTint: true + BlendMode: Additive + +wchrdart: + idle: + Filename: wchrdart.shp + Facings: 32 + ZOffset: 2047 + IgnoreWorldTint: true bshardhit: - idle: bshardhit + Defaults: + ZOffset: 2047 + IgnoreWorldTint: true + BlendMode: Additive + idle: + Filename: bshardhit.shp Length: 3 - ZOffset: 1023 - idle2: bshardhit + idle2: + Filename: bshardhit.shp Start: 3 Length: 3 - ZOffset: 1023 - idle3: bshardhit + idle3: + Filename: bshardhit.shp Start: 6 Length: 3 - ZOffset: 1023 - idle4: bshardhit + idle4: + Filename: bshardhit.shp Start: 9 Length: 3 - ZOffset: 1023 bshard: - idle: bshard + Defaults: + ZOffset: 2047 + IgnoreWorldTint: true + BlendMode: Additive + idle: + Filename: bshard.shp Facings: 32 ZOffset: 1023 leechhit: - idle: leechhit + idle: + Filename: leechhit.shp + BlendMode: Additive + Length: * + ZOffset: 2047 + IgnoreWorldTint: true + +leechhitlg: + idle: + Filename: leechhitlg.shp BlendMode: Additive Length: * ZOffset: 2047 + IgnoreWorldTint: true mindcontrol: - idle: mindcontrol + idle: + Filename: mindcontrol.shp Tick: 40 ZOffset: 2048 Length: * - Offset: 0,-4 - -riftanim: - idle: riftloop + Offset: 0,-8 + IgnoreWorldTint: true + reverse: + Filename: mindcontrol.shp + Frames: 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 Tick: 40 - Length: * ZOffset: 2048 - BlendMode: Subtractive - spawn: riftstart + Length: * + Offset: 0,-8 + IgnoreWorldTint: true + +riftlg: + Defaults: + Filename: rift.shp Tick: 40 Length: * ZOffset: 2048 BlendMode: Subtractive - die: riftend + IgnoreWorldTint: true + Scale: 2 + idle: + make: + Alpha: 0.04, 0.08, 0.12, 0.16, 0.20, 0.24, 0.28, 0.32, 0.36, 0.40, 0.44, 0.48, 0.52, 0.56, 0.60, 0.64, 0.68, 0.72, 0.76, 0.80, 0.84, 0.88, 0.92, 0.96 + die: + Alpha: 0.96, 0.92, 0.88, 0.84, 0.80, 0.76, 0.72, 0.68, 0.64, 0.60, 0.56, 0.52, 0.48, 0.44, 0.40, 0.36, 0.32, 0.28, 0.24, 0.20, 0.16, 0.12, 0.08, 0.04 + dead: + Alpha: 0 + +riftmd: + Defaults: + Filename: rift.shp Tick: 40 Length: * ZOffset: 2048 BlendMode: Subtractive - fade: riftend + IgnoreWorldTint: true + idle: + make: + Frames: 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23 + Alpha: 0.08, 0.16, 0.24, 0.32, 0.40, 0.48, 0.56, 0.64, 0.72, 0.80, 0.88, 0.96 + die: + Alpha: 0.96, 0.92, 0.88, 0.84, 0.80, 0.76, 0.72, 0.68, 0.64, 0.60, 0.56, 0.52, 0.48, 0.44, 0.40, 0.36, 0.32, 0.28, 0.24, 0.20, 0.16, 0.12, 0.08, 0.04 + dead: + Alpha: 0 + +riftsm: + Defaults: + Filename: rift.shp Tick: 40 Length: * ZOffset: 2048 BlendMode: Subtractive - -miniriftanim: - idle: miniriftloop + IgnoreWorldTint: true + Scale: 0.64 + idle: + make: + Frames: 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23 + Alpha: 0.08, 0.16, 0.24, 0.32, 0.40, 0.48, 0.56, 0.64, 0.72, 0.80, 0.88, 0.96 + die: + Alpha: 0.96, 0.92, 0.88, 0.84, 0.80, 0.76, 0.72, 0.68, 0.64, 0.60, 0.56, 0.52, 0.48, 0.44, 0.40, 0.36, 0.32, 0.28, 0.24, 0.20, 0.16, 0.12, 0.08, 0.04 + dead: + Alpha: 0 + +mspk: + idle: + Filename: mindspark.shp Tick: 40 - Length: * + Length: 15 ZOffset: 2048 - BlendMode: Subtractive + BlendMode: Additive + IgnoreWorldTint: true + die: + Filename: mindspark.shp + Start: 15 + Length: 7 + ZOffset: 2048 + BlendMode: Additive + IgnoreWorldTint: true buzz: - idle: buzz - Tick: 60 + Defaults: Length: * ZOffset: 2048 BlendMode: Additive + IgnoreWorldTint: true + idle: + Filename: buzz.shp + Tick: 60 + make: + Filename: buzzmake.shp + die: + Filename: buzzmake.shp + Frames: 5, 4, 3, 2, 1, 0 + +grcl: + Defaults: + Alpha: 0.75 + Length: * + ZOffset: 512 + idle: + Filename: grcl.shp + make: + Filename: grclmake.shp + +tbcl: + Defaults: + Alpha: 0.75 + Length: * + ZOffset: 512 + idle: + Filename: tbcl.shp + make: + Filename: grclmake.shp ionsurge: - idle: ionsurgeloop + Defaults: + Filename: ionsurgeloop.shp Tick: 40 Length: * ZOffset: 2048 BlendMode: Additive + IgnoreWorldTint: true + idle: + make: + Alpha: 0.08, 0.16, 0.24, 0.32, 0.40, 0.48, 0.56, 0.64, 0.72, 0.80, 0.88, 0.96, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00 + fade: + Alpha: 1.00, 0.96, 0.92, 0.88, 0.84, 0.80, 0.76, 0.72, 0.68, 0.64, 0.60, 0.56, 0.52, 0.48, 0.44, 0.40, 0.36, 0.32, 0.28, 0.24, 0.20, 0.16, 0.12, 0.08 + dead: + Alpha: 0 ionsurge-overlay: - vehicle: emp_fx01 + vehicle: + Filename: emp_fx01.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 - infantry: emp_fx02 + IgnoreWorldTint: true + infantry: + Filename: emp_fx02.shp Length: * BlendMode: Additive Offset: 0, -5 - UseTilesetCode: false ZOffset: 512 + IgnoreWorldTint: true atomize-overlay: - idle: atomizeoverlay + vehicle: + Filename: atomizeoverlay.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 - -feederfull-overlay: - idle: leechhit - Frames: 0,1,2,3,4,5,6,7,7,7 + IgnoreWorldTint: true + infantry: + Filename: atomizeoverlaysm.shp + Length: * BlendMode: Additive + Offset: 0, -5 + ZOffset: 512 + IgnoreWorldTint: true + +siphon-overlay-sm: + idle: + Filename: leechhit.shp + Frames: 4,5,6,7,8,9,10,11,12,13,14,15,14,13,12,11,10,9,8,7,6,5,4 + BlendMode: Alpha Length: * ZOffset: 2047 Offset: 0, -5 - Tick: 80 + IgnoreWorldTint: true + +siphon-overlay-lg: + idle: + Filename: leechhitlg.shp + Frames: 4,5,6,7,8,9,10,11,12,13,14,15,14,13,12,11,10,9,8,7,6,5,4 + BlendMode: Alpha + Length: * + ZOffset: 2047 + IgnoreWorldTint: true scrinwipicon: - icon: wipicon + icon: + Filename: wipicon.shp ichorseed: - idle: ichorseed + idle: + Filename: ichorseed.shp Tick: 80 Length: 16 Start: 15 BlendMode: Additive - die: ichorseed + die: + Filename: ichorseed.shp Tick: 80 Length: 15 BlendMode: Additive - fade: ichorseed + fade: + Filename: ichorseed.shp Tick: 80 Length: 15 BlendMode: Additive resconv: - green: resconv - Length: 17 + Defaults: ZOffset: 1023 BlendMode: Additive Tick: 80 - yellow: resconv + green: + Filename: resconv.shp + Length: 17 + yellow: + Filename: resconv.shp Length: 17 Start: 17 - ZOffset: 1023 - BlendMode: Additive - Tick: 80 - blue: resconv + blue: + Filename: resconv.shp Length: 17 Start: 34 - ZOffset: 1023 - BlendMode: Additive - Tick: 80 - red: resconv + red: + Filename: resconv.shp + Length: 17 + Start: 51 + greensm: + Filename: resconvsm.shp + Length: 10 + yellowsm: + Filename: resconvsm.shp + Length: 10 + Start: 10 + bluesm: + Filename: resconvsm.shp + Length: 10 + Start: 20 + redsm: + Filename: resconvsm.shp + Length: 10 + Start: 30 + +lchrheal: + vehicle: + Filename: resconv.shp Length: 17 Start: 51 ZOffset: 1023 - BlendMode: Additive Tick: 80 + Alpha: 0.8 + infantry: + Filename: resconvsm.shp + Length: 10 + Start: 30 + ZOffset: 1023 + Tick: 80 + Alpha: 0.8 strm: - idle: ioncloud1 - Length: * - Tick: 90 + Defaults: + Alpha: 0.85 Offset: 1, -72, 48 ZRamp: 1 ZOffset: 1023 BlendMode: Screen - make: ioncloud1d - Frames: 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 - Length: * Tick: 90 - Offset: 1, -72, 48 - ZRamp: 1 - ZOffset: 1023 - BlendMode: Screen - die: ioncloud1d Length: * - Tick: 90 - Offset: 1, -72, 48 - ZRamp: 1 - ZOffset: 1023 - BlendMode: Screen - make2: ioncloud2d + IgnoreWorldTint: true + idle: + Filename: ioncloud1.shp + make: + Filename: ioncloud1d.shp Frames: 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 - Length: * - Tick: 90 - Offset: 1, -72, 48 - ZRamp: 1 - ZOffset: 1023 - BlendMode: Screen - idle2: ioncloud2 - Length: * - Tick: 90 - Offset: 1, -72, 48 - ZRamp: 1 - ZOffset: 1023 - BlendMode: Screen - die2: ioncloud2d - Length: * - Tick: 90 - Offset: 1, -72, 48 - ZRamp: 1 - ZOffset: 1023 - BlendMode: Screen - idle3: ioncloud1 - Length: * - Tick: 90 - Offset: 1, -72, 48 - ZRamp: 1 - ZOffset: 1023 - BlendMode: Screen + die: + Filename: ioncloud1d.shp + make2: + Filename: ioncloud2d.shp + Frames: 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 + idle2: + Filename: ioncloud2.shp + die2: + Filename: ioncloud2d.shp + idle3: + Filename: ioncloud1.shp FlipX: True - make3: ioncloud1d + make3: + Filename: ioncloud1d.shp Frames: 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 - Length: * - Tick: 90 - Offset: 1, -72, 48 - ZRamp: 1 - ZOffset: 1023 - BlendMode: Screen FlipX: True - die3: ioncloud1d - Length: * - Tick: 90 - Offset: 1, -72, 48 - ZRamp: 1 - ZOffset: 1023 - BlendMode: Screen + die3: + Filename: ioncloud1d.shp FlipX: True - make4: ioncloud2d + make4: + Filename: ioncloud2d.shp Frames: 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 - Length: * - Tick: 90 - Offset: 1, -72, 48 - ZRamp: 1 - ZOffset: 1023 - BlendMode: Screen FlipX: True - idle4: ioncloud2 - Length: * - Tick: 90 - Offset: 1, -72, 48 - ZRamp: 1 - ZOffset: 1023 - BlendMode: Screen + idle4: + Filename: ioncloud2.shp FlipX: True - die4: ioncloud2d - Length: * - Tick: 90 - Offset: 1, -72, 48 - ZRamp: 1 - ZOffset: 1023 - BlendMode: Screen + die4: + Filename: ioncloud2d.shp FlipX: True +strm2: + Inherits: strm + Defaults: + Alpha: 0.7 + Offset: 1, -24, 48 + IgnoreWorldTint: true + wormhole: - idle: wormhole - Length: 13 + Defaults: + Filename: wormhole.shp ZOffset: 1023 BlendMode: Additive - die: wormhole + IgnoreWorldTint: true + idle: + Length: 13 + die: Length: 8 Start: 13 - ZOffset: 1023 - BlendMode: Additive - make: wormhole + make: Frames: 20, 19, 18, 17, 16, 15, 14, 13 Length: 8 + faded: + Length: 13 + Alpha: 0.6 + Scale: 0.9 + +wormholelg: + Inherits: wormhole + Defaults: + Filename: wormholelg.shp + +wormholexl: + Defaults: + Filename: wormholexl.shp ZOffset: 1023 BlendMode: Additive + IgnoreWorldTint: true + Length: * + idle: + die: + Alpha: 0.92, 0.84, 0.76, 0.68, 0.60, 0.52, 0.44, 0.36, 0.28, 0.20, 0.12, 0.04, 0.02 + make: + Alpha: 0.02, 0.04, 0.12, 0.20, 0.28, 0.36, 0.44, 0.52, 0.60, 0.68, 0.76, 0.84, 0.92 + +wormholexxl: + Inherits: wormholexl + Defaults: + Filename: wormholexxl.shp + +plasmatorp1: + Defaults: + IgnoreWorldTint: true + Alpha: 0.95 + idle: + Filename: plasmatorp1.shp + Length: 5 + Tick: 40 + ZOffset: 2048 + +plasmatorp2: + Defaults: + IgnoreWorldTint: true + Alpha: 0.95 + idle: + Filename: plasmatorp2.shp + Length: 5 + Tick: 40 + ZOffset: 2048 + +plasmatorp3: + Defaults: + IgnoreWorldTint: true + Alpha: 0.95 + idle: + Filename: plasmatorp3.shp + Length: 5 + Tick: 40 + +mshpshockwave: + Defaults: + IgnoreWorldTint: true + Length: * + Tick: 40 + ZOffset: 2047 + idle1: + Filename: mshpshockwave.shp + Alpha: 0.9 + idle2: + Filename: mshpshockwave.shp + FlipX: true + Alpha: 0.8 + idle3: + Filename: mshpshockwave.shp + FlipY: true + Alpha: 0.7 + idle4: + Filename: mshpshockwave.shp + FlipX: true + FlipY: true + Alpha: 0.6 + inner1: + Filename: enrvbolthit.shp + ZOffset: 2048 + Alpha: 0.9 + BlendMode: Additive + inner2: + Filename: enrvbolthit.shp + FlipX: true + ZOffset: 2048 + Alpha: 0.8 + BlendMode: Additive + inner3: + Filename: enrvbolthit.shp + FlipY: true + ZOffset: 2048 + Alpha: 0.7 + BlendMode: Additive + inner4: + Filename: enrvbolthit.shp + FlipX: true + FlipY: true + ZOffset: 2048 + Alpha: 0.6 + BlendMode: Additive + empty: + Filename: empty.shp + +fleetrecall: + Defaults: + Filename: fleetrecall.shp + Length: * + ZOffset: 2047 + BlendMode: Additive + AlphaFade: True + idle: -wormholeblast: - idle: wormholeblast +obltbolt: + Defaults: + IgnoreWorldTint: true + idle: + Filename: obltbolt.shp Length: * Tick: 40 - Offset: 0, 40, 0 - ZOffset: -512 + ZOffset: 3072 + BlendMode: Additive + idle2: + Filename: obltbolt.shp + Length: * + Tick: 40 + ZOffset: 3072 BlendMode: Additive + FlipX: true + FlipY: true + trail: + Filename: obltbolttrail.shp + Frames: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 + Start: 0 + Length: 10 + Tick: 50 + Facings: 4 + ZOffset: 2046 + InterpolatedFacings: 32 + Alpha: 0.75 + trail2: + Filename: obltbolttrail.shp + Frames: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 + Start: 0 + Length: 10 + Tick: 50 + Facings: 4 + ZOffset: 2046 + FlipX: true + FlipY: true + InterpolatedFacings: 32 + Alpha: 0.75 + trail3: + Filename: obltbolttrail.shp + Frames: 1, 0, 3, 2, 5, 4, 6, 7, 8, 9, 11, 10, 13, 12, 15, 14, 16, 17, 18, 19, 1, 0, 3, 2, 5, 4, 6, 7, 8, 9, 11, 10, 13, 12, 15, 14, 16, 17, 18, 19 + Start: 0 + Length: 10 + Tick: 50 + Facings: 4 + ZOffset: 2046 + InterpolatedFacings: 32 + Alpha: 0.75 + +obltboltcharge: + Defaults: + Filename: obltboltcharge.shp + Length: 7 + Tick: 80 + ZOffset: 2046 + IgnoreWorldTint: true + Alpha: 0.3 + idle: + idle2: + FlipX: true + idle3: + FlipY: true + idle4: + FlipX: true + FlipY: true + idle5: + Frames: 6, 5, 4, 3, 2, 1, 0 + idle6: + Frames: 6, 5, 4, 3, 2, 1, 0 + FlipX: true + idle7: + Frames: 6, 5, 4, 3, 2, 1, 0 + FlipY: true + idle8: + Frames: 6, 5, 4, 3, 2, 1, 0 + FlipX: true + FlipY: true + +nullbolt: + idle: + Filename: nullbolt.shp + Length: * + BlendMode: Additive + ZOffset: 2047 + IgnoreWorldTint: true + +nulltrail: + idle1: + Filename: nulltrail.shp + Frames: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 + Start: 0 + Length: 7 + Tick: 60 + Facings: 4 + ZOffset: 2046 + InterpolatedFacings: 32 + BlendMode: Additive + Alpha: 0.4 + idle2: + Filename: nulltrail.shp + Frames: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 + Start: 0 + Length: 7 + Tick: 60 + Facings: 4 + ZOffset: 2046 + FlipX: true + FlipY: true + InterpolatedFacings: 32 + BlendMode: Additive + Alpha: 0.4 + +nullhit: + idle: + Filename: nullhit.shp + BlendMode: Additive + IgnoreWorldTint: true + Length: * + ZOffset: 2047 + Alpha: 0.5 + +tibmeteor: + up: + Filename: empty.shp + down: + Filename: tibmeteor.shp + Length: * + ZOffset: 2047 + hit: + Filename: tibmeteorhit.shp + Length: * + ZOffset: 2047 + BlendMode: Alpha + Alpha: 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.95, 0.9, 0.85, 0.8, 0.75, 0.7, 0.65, 0.6, 0.55, 0.5, 0.45, 0.4, 0.35, 0.3 ,0.25 ,0.2 ,0.15 ,0.1, 0.1 + Offset: 0, -10 + +scrinpurifier: + Inherits: ^StructureOverlays + idle: + Filename: scrinpurifier.shp + purification: + Filename: scrinpurification.shp + Length: * + BlendMode: Additive + ZOffset: 2047 diff --git a/mods/ca/sequences/ships.yaml b/mods/ca/sequences/ships.yaml index 28aabbc859..8cde0100dc 100644 --- a/mods/ca/sequences/ships.yaml +++ b/mods/ca/sequences/ships.yaml @@ -1,132 +1,179 @@ ss: Inherits: ^VehicleOverlays - idle: ss + idle: + Filename: ss.shp Facings: 16 - icon: ssicon + icon: + Filename: ssicon.shp ca: Inherits: ^VehicleOverlays - idle: ca + idle: + Filename: ca.shp Facings: 16 - turret: turr + turret: + Filename: turr.shp Facings: 32 - muzzle: smokeygun + muzzle: + Filename: smokeygun.shp Length: 12 Tick: 45 - icon: caicon + icon: + Filename: caicon.shp dd: Inherits: ^VehicleOverlays - idle: dd + idle: + Filename: dd.shp Facings: 16 - turret: ssam + turret: + Filename: ssam.shp Facings: 32 - turret2: mgun + turret2: + Filename: mgun.shp Facings: 32 - muzzle: samfire + muzzle: + Filename: samfire.shp Length: 18 Facings: 8 Offset: -2,-2 - muzzle2: gunfire2 + muzzle2: + Filename: gunfire2.shp Length: 5 - icon: ddicon + icon: + Filename: ddicon.shp pt: Inherits: ^VehicleOverlays - idle: pt + idle: + Filename: pt.shp Facings: 16 - turret: mgun + turret: + Filename: mgun.shp Facings: 32 - muzzle: gunfire2 + muzzle: + Filename: gunfire2.shp Length: 5 - icon: pticon + icon: + Filename: pticon.shp lst: Inherits: ^VehicleOverlays - idle: lst - open: lst + idle: + Filename: lst.shp + open: + Filename: lst.shp Start: 1 Length: 4 Tick: 150 - close: lst + close: + Filename: lst.shp Frames: 4, 3, 2, 1 Length: 4 Tick: 150 - unload: lst + unload: + Filename: lst.shp Start: 4 ZOffset: -511 - icon: lsticon + icon: + Filename: lsticon.shp msub: Inherits: ^VehicleOverlays - idle: msub + idle: + Filename: msub.shp Facings: 16 - icon: msubicon + icon: + Filename: msubicon.shp ss2: Inherits: ^VehicleOverlays - idle: nsub + idle: + Filename: nsub.shp Facings: 16 - icon: ss2icon + icon: + Filename: ss2icon.shp isub: Inherits: ^VehicleOverlays - idle: isub + idle: + Filename: isub.shp Facings: 16 - icon: isubicon + icon: + Filename: isubicon.shp dd2: Inherits: ^VehicleOverlays - idle: dd2 + idle: + Filename: dd2.shp Facings: 16 - turret: rturr + turret: + Filename: rturr.shp Facings: 32 - turret2: mgun + turret2: + Filename: mgun.shp Facings: 32 - muzzle: smokeygun + muzzle: + Filename: smokeygun.shp Length: 12 Tick: 45 - spinner: mrj + spinner: + Filename: mrj.shp Start: 32 Length: 32 - icon: dd2icnh + icon: + Filename: dd2icnh.shp pt2: Inherits: ^VehicleOverlays - idle: pt2 + idle: + Filename: pt2.shp Facings: 16 - turret: ssam2 + turret: + Filename: ssam2.shp Facings: 32 - muzzle: samfire + muzzle: + Filename: samfire.shp Length: * - spinner: mrj + spinner: + Filename: mrj.shp Start: 32 Length: 32 - icon: boaticnh + icon: + Filename: boaticnh.shp cv: Inherits: ^VehicleOverlays - idle: cv + idle: + Filename: cv.shp Facings: 16 ZOffset: 511 - spinner: mrj + spinner: + Filename: mrj.shp Start: 32 Length: 32 ZOffset: 511 - icon: cvicon + icon: + Filename: cvicon.shp sb: Inherits: ^VehicleOverlays - idle: sb + idle: + Filename: sb.shp Facings: 16 - muzzle: samfire + muzzle: + Filename: samfire.shp Length: * - icon: sbicnh + icon: + Filename: sbicnh.shp seas: Inherits: ^VehicleOverlays - idle: seas + idle: + Filename: seas.shp Facings: 16 - muzzle: gunfire2 + muzzle: + Filename: gunfire2.shp Length: 5 - icon: seasicon \ No newline at end of file + icon: + Filename: seasicon.shp diff --git a/mods/ca/sequences/structures.yaml b/mods/ca/sequences/structures.yaml index 506ff38693..926d8ae5dc 100644 --- a/mods/ca/sequences/structures.yaml +++ b/mods/ca/sequences/structures.yaml @@ -1,17 +1,18 @@ ^StructureOverlays: - emp-overlay: emp_fx01 + emp-overlay: + Filename: emp_fx01.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 - chrono-overlay: chronofade + chrono-overlay: + Filename: chronofade.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 - mind-overlay: mindanim + mind-overlay: + Filename: mindanim.shp Length: * Tick: 200 BlendMode: Alpha @@ -19,78 +20,144 @@ fcom: Inherits: ^StructureOverlays - idle: fcom - damaged-idle: fcom + idle: + Filename: fcom.shp + damaged-idle: + Filename: fcom.shp Start: 1 - make: fcommake + make: + Filename: fcommake.shp Length: * - dead: fcom + dead: + Filename: fcom.shp Start: 1 Tick: 800 - bib: bib3 - Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - icon: missicon2 + bib: + Filename: bib3.tem + TilesetFilenames: + SNOW: bib3.sno + DESERT: bib3.des + JUNGLE: bib3.jun + WINTER: bib3.win + BARREN: bib3.bar + Length: * + icon: + Filename: missicon2.shp fcom.destroyed: - idle: fcom + idle: + Filename: fcom.shp Start: 1 - bib: bib3 + bib: + Filename: bib3.tem + TilesetFilenames: + SNOW: bib3.sno + DESERT: bib3.des + JUNGLE: bib3.jun + WINTER: bib3.win + BARREN: bib3.bar Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT hosp: Inherits: ^StructureOverlays - idle: hosp + idle: + Filename: hosp.shp Length: 4 - damaged-idle: hosp + damaged-idle: + Filename: hosp.shp Start: 4 Length: 4 - dead: hosp + dead: + Filename: hosp.shp Start: 8 Tick: 800 - bib: bib3 + bib: + Filename: bib3.tem + TilesetFilenames: + SNOW: bib3.sno + DESERT: bib3.des + JUNGLE: bib3.jun + WINTER: bib3.win + BARREN: bib3.bar Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - make: hospmake + make: + Filename: hospmake.shp Length: * - icon: hospicon + icon: + Filename: hospicon.shp hosp.destroyed: - idle: hosp + idle: + Filename: hosp.shp Start: 8 bio: Inherits: ^StructureOverlays - idle: bio - damaged-idle: bio + idle: + Filename: bio.shp + damaged-idle: + Filename: bio.shp Start: 1 - dead: bio + dead: + Filename: bio.shp Start: 2 Tick: 800 - bib: bib3 + bib: + Filename: bib3.tem + TilesetFilenames: + SNOW: bib3.sno + DESERT: bib3.des + JUNGLE: bib3.jun + WINTER: bib3.win + BARREN: bib3.bar Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - make: biomake + make: + Filename: biomake.shp Length: * - icon: bioicnh + icon: + Filename: bioicnh.shp bio.destroyed: - idle: bio + idle: + Filename: bio.shp + Start: 2 + +macs: + Inherits: ^StructureOverlays + idle: + Filename: macs.shp + damaged-idle: + Filename: macs.shp + Start: 1 + dead: + Filename: macs.shp + Start: 2 + Tick: 800 + bib: + Filename: bib3.tem + TilesetFilenames: + SNOW: bib3.sno + DESERT: bib3.des + JUNGLE: bib3.jun + WINTER: bib3.win + BARREN: bib3.bar + Length: * + make: + Filename: biomake.shp + Length: * + icon: + Filename: bioicnh.shp + +macs.destroyed: + idle: + Filename: macs.shp Start: 2 oilb: Inherits: ^StructureOverlays Defaults: + Filename: oilb.shp Offset: 0,-6 idle: Length: 14 @@ -99,741 +166,1150 @@ oilb: Start: 14 Length: 14 Tick: 100 - flare: burn-s + flare: + Filename: burn-s.shp Start: 12 Length: 46 ZOffset: 511 - damaged-flare: flmspt + damaged-flare: + Filename: flmspt.shp Start: 50 Length: * ZOffset: 511 dead: Start: 28 Tick: 800 - make: oilb - bib: bib3 + make: + Filename: oilb.shp + bib: + Filename: bib3.tem + TilesetFilenames: + SNOW: bib3.sno + DESERT: bib3.des + JUNGLE: bib3.jun + WINTER: bib3.win + BARREN: bib3.bar Length: * Offset: 0,0 - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT oilb.destroyed: Defaults: Offset: 0,-6 - idle: oilb + idle: + Filename: oilb.shp Start: 28 Length: 1 - idle-flare: flmspt + idle-flare: + Filename: flmspt.shp + Start: 50 + Length: * + ZOffset: 511 + bib: + Filename: bib3.tem + TilesetFilenames: + SNOW: bib3.sno + DESERT: bib3.des + JUNGLE: bib3.jun + WINTER: bib3.win + BARREN: bib3.bar + Length: * + Offset: 0,0 + +oilr: + Inherits: ^StructureOverlays + Defaults: + Filename: oilr.shp + Offset: 0,-6 + idle: + damaged-idle: + Start: 1 + Length: 1 + flare: + Filename: burn-s.shp + Start: 12 + Length: 46 + ZOffset: 511 + damaged-flare: + Filename: flmspt.shp Start: 50 Length: * ZOffset: 511 - bib: bib3 + dead: + Start: 2 + Tick: 800 + make: + Filename: oilr.shp + bib: + Filename: bib2.tem + TilesetFilenames: + SNOW: bib2.sno + DESERT: bib2.des + JUNGLE: bib2.jun + WINTER: bib2.win + BARREN: bib2.bar + Length: * + Offset: 0,0 + +oilr.destroyed: + Defaults: + Offset: 0,-6 + idle: + Filename: oilr.shp + Start: 2 + Length: 1 + idle-flare: + Filename: flmspt.shp + Start: 50 + Length: * + ZOffset: 511 + bib: + Filename: bib2.tem + TilesetFilenames: + SNOW: bib2.sno + DESERT: bib2.des + JUNGLE: bib2.jun + WINTER: bib2.win + BARREN: bib2.bar Length: * Offset: 0,0 - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT orep: Inherits: ^StructureOverlays - idle: orep - damaged-idle: orep + idle: + Filename: orep.shp + damaged-idle: + Filename: orep.shp Start: 1 - make: orepmake + make: + Filename: orepmake.shp Length: * - dead: orep + dead: + Filename: orep.shp Start: 1 Tick: 800 - bib: bib2 - Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - icon: orepicon + bib: + Filename: bib2.tem + TilesetFilenames: + SNOW: bib2.sno + DESERT: bib2.des + JUNGLE: bib2.jun + WINTER: bib2.win + BARREN: bib2.bar + Length: * + icon: + Filename: orepicon.shp orep.destroyed: - idle: orep + idle: + Filename: orep.shp Start: 1 Length: * Offset: 0,-10 - bib: bib2 + bib: + Filename: bib2.tem + TilesetFilenames: + SNOW: bib2.sno + DESERT: bib2.des + JUNGLE: bib2.jun + WINTER: bib2.win + BARREN: bib2.bar Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT fact: Inherits: ^StructureOverlays - idle: fact - make: factmake + idle: + Filename: fact.shp + make: + Filename: factmake.shp Length: * - build: fact + Tick: 40 + build: + Filename: fact.shp Start: 1 Length: 25 - pdox: factpdox + pdox: + Filename: factpdox.shp Length: 80 - damaged-idle: fact + damaged-idle: + Filename: fact.shp Start: 26 - damaged-build: fact + damaged-build: + Filename: fact.shp Start: 27 Length: 25 - damaged-pdox: factpdox + damaged-pdox: + Filename: factpdox.shp Start: 80 Length: 80 - dead: factdead + dead: + Filename: factdead.shp Tick: 800 - bib: bib2 - Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - icon: facticon - fake-icon: facficon + bib: + Filename: bib2.tem + TilesetFilenames: + SNOW: bib2.sno + DESERT: bib2.des + JUNGLE: bib2.jun + WINTER: bib2.win + BARREN: bib2.bar + Length: * + icon: + Filename: facticon.shp + fake-icon: + Filename: facficon.shp proc: Inherits: ^StructureOverlays - idle: proc + idle: + Filename: proc.shp ZOffset: -1c511 - damaged-idle: proc + damaged-idle: + Filename: proc.shp Start: 1 ZOffset: -1c511 - idle-top: proctop + idle-top: + Filename: proctop.shp ZOffset: 0 - damaged-idle-top: proctop + damaged-idle-top: + Filename: proctop.shp Start: 1 ZOffset: 0 - make: procmake + make: + Filename: procmake.shp Length: * - dead: procdead + dead: + Filename: procdead.shp Tick: 800 - bib: bib2 - Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - icon: procicon + bib: + Filename: bib2.tem + TilesetFilenames: + SNOW: bib2.sno + DESERT: bib2.des + JUNGLE: bib2.jun + WINTER: bib2.win + BARREN: bib2.bar + Length: * + icon: + Filename: procicon.shp + fake-icon: + Filename: freficon.shp silo: Inherits: ^StructureOverlays - idle: silo + idle: + Filename: silo.shp Offset: 0,-1 - damaged-idle: silo + damaged-idle: + Filename: silo.shp Start: 9 Offset: 0,-1 - stages: silo + stages: + Filename: silo.shp Length: 9 Offset: 0,-1 - damaged-stages: silo + damaged-stages: + Filename: silo.shp Start: 9 Length: 9 Offset: 0,-1 - make: silomake + make: + Filename: silomake.shp Length: * Offset: 0,-1 - bib: mbSILO - Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - BARREN: DESERT - icon: siloicon + bib: + Filename: mbSILO.tem + TilesetFilenames: + SNOW: mbSILO.sno + DESERT: mbSILO.des + JUNGLE: mbSILO.jun + WINTER: mbSILO.win + BARREN: mbSILO.des + Length: * + icon: + Filename: siloicon.shp powr: Inherits: ^StructureOverlays - idle: powr - damaged-idle: powr + idle: + Filename: powr.shp + damaged-idle: + Filename: powr.shp Start: 1 - make: powrmake + make: + Filename: powrmake.shp Length: * - dead: powrdead + dead: + Filename: powrdead.shp Tick: 800 - bib: bib3 - Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - icon: powricon - fake-icon: fpwricon + bib: + Filename: bib3.tem + TilesetFilenames: + SNOW: bib3.sno + DESERT: bib3.des + JUNGLE: bib3.jun + WINTER: bib3.win + BARREN: bib3.bar + Length: * + icon: + Filename: powricon.shp + fake-icon: + Filename: fpwricon.shp apwr: Inherits: ^StructureOverlays - idle: apwr + idle: + Filename: apwr.shp Offset: 0,-10 - damaged-idle: apwr + damaged-idle: + Filename: apwr.shp Start: 1 Offset: 0,-10 - make: apwrmake + make: + Filename: apwrmake.shp Length: * Offset: 0,-10 - dead: apwrdead + dead: + Filename: apwrdead.shp Tick: 800 Offset: 0,-10 - bib: bib2 + bib: + Filename: bib2.tem + TilesetFilenames: + SNOW: bib2.sno + DESERT: bib2.des + JUNGLE: bib2.jun + WINTER: bib2.win + BARREN: bib2.bar + Length: * + icon: + Filename: apwricon.shp + fake-icon: + Filename: fapwicon.shp + +npwr: + Inherits: ^StructureOverlays + idle: + Filename: npwr.shp + Length: 4 + Tick: 1000 + Offset: 0,-10 + damaged-idle: + Filename: npwrd.shp + Length: 4 + Tick: 1000 + Offset: 0,-10 + make: + Filename: npwrmake.shp Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - icon: apwricon - fake-icon: fapwicon + Offset: 0,-10 + dead: + Filename: npwrd.shp + Tick: 800 + Offset: 0,-10 + bib: + Filename: bib1.tem + TilesetFilenames: + SNOW: bib1.sno + DESERT: bib1.des + JUNGLE: bib1.jun + WINTER: bib1.win + BARREN: bib1.bar + Length: * + icon: + Filename: npwricon.shp tpwr: Inherits: ^StructureOverlays - idle: tpwr + idle: + Filename: tpwr.shp Offset: 0,-10 - damaged-idle: tpwr + damaged-idle: + Filename: tpwr.shp Start: 1 Offset: 0,-10 - make: tpwrmake + make: + Filename: tpwrmake.shp Length: * Offset: 0,-10 - dead: tpwr + dead: + Filename: tpwr.shp Start: 1 Tick: 800 Offset: 0,-10 - power: litning + power: + Filename: litning.shp Length: * - bib: bib2 + bib: + Filename: bib2.tem + TilesetFilenames: + SNOW: bib2.sno + DESERT: bib2.des + JUNGLE: bib2.jun + WINTER: bib2.win + BARREN: bib2.bar Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - icon: tpwricon + icon: + Filename: tpwricon.shp barr: Inherits: ^StructureOverlays - idle: barr + idle: + Filename: barr.shp Length: 10 Offset: 0,-6 - damaged-idle: barr + damaged-idle: + Filename: barr.shp Start: 10 Length: 10 Offset: 0,-6 - make: barrmake + make: + Filename: barrmake.shp Length: * Offset: 0,-6 - bib: bib3 - Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - icon: barricon + bib: + Filename: bib3.tem + TilesetFilenames: + SNOW: bib3.sno + DESERT: bib3.des + JUNGLE: bib3.jun + WINTER: bib3.win + BARREN: bib3.bar + Length: * + icon: + Filename: barricon.shp tent: Inherits: ^StructureOverlays Defaults: - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - JUNGLE: TEMPERAT - WINTER: TEMPERAT - BARREN: TEMPERAT - DUNE: DESERT + Filename: tent.tem + TilesetFilenames: + SNOW: tent.sno + DESERT: tent.des idle: Length: 10 damaged-idle: Start: 10 Length: 10 - make: tentmake - Length: * - bib: bib3 - Length: * - TilesetOverrides: - JUNGLE: JUNGLE - emp-overlay: emp_fx01 - UseTilesetExtension: false - chrono-overlay: chronofade - UseTilesetExtension: false - mind-overlay: mindanim + make: + Filename: tentmake.tem + TilesetFilenames: + SNOW: tentmake.sno + DESERT: tentmake.des + Length: * + bib: + Filename: bib3.tem + TilesetFilenames: + SNOW: bib3.sno + DESERT: bib3.des + JUNGLE: bib3.jun + Length: * + emp-overlay: + Filename: emp_fx01.shp + TilesetFilenames: + chrono-overlay: + Filename: chronofade.shp + TilesetFilenames: + mind-overlay: + Filename: mindanim.shp + TilesetFilenames: Length: * Tick: 200 BlendMode: Alpha Offset: 0, 0 - UseTilesetExtension: false - icon: tenticon - UseTilesetExtension: false + icon: + Filename: tenticon.shp + TilesetFilenames: kenn: Inherits: ^StructureOverlays - idle: kenn - damaged-idle: kenn + idle: + Filename: kenn.shp + damaged-idle: + Filename: kenn.shp Start: 1 - make: kennmake + make: + Filename: kennmake.shp Length: * - bib: mbSILO + bib: + Filename: mbSILO.tem + TilesetFilenames: + SNOW: mbSILO.sno + INTERIOR: mbSILO.int + DESERT: mbSILO.des + JUNGLE: mbSILO.jun + WINTER: mbSILO.win Length: * - UseTilesetExtension: true - TilesetOverrides: - BARREN: TEMPERAT - icon: kennicon + icon: + Filename: kennicon.shp dome: Inherits: ^StructureOverlays - idle: dome - damaged-idle: dome + idle: + Filename: dome.shp + damaged-idle: + Filename: dome.shp Start: 1 - make: domemake - Length: * - bib: bib3 - Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - icon: domeicon - fake-icon: domficon + make: + Filename: domemake.shp + Length: * + bib: + Filename: bib3.tem + TilesetFilenames: + SNOW: bib3.sno + DESERT: bib3.des + JUNGLE: bib3.jun + WINTER: bib3.win + BARREN: bib3.bar + Length: * + icon: + Filename: domeicon.shp + fake-icon: + Filename: domficon.shp atek: Inherits: ^StructureOverlays - idle: atek - damaged-idle: atek + idle: + Filename: atek.shp + damaged-idle: + Filename: atek.shp Start: 1 - make: atekmake + make: + Filename: atekmake.shp Length: * - active: sputdoor + active: + Filename: sputdoor.shp Length: * Offset: -4,0 - damaged-active: sputdoor + damaged-active: + Filename: sputdoor.shp Length: * Offset: -4,0 - false-active: atek - damaged-false-active: atek + false-active: + Filename: atek.shp + damaged-false-active: + Filename: atek.shp Start: 1 - bib: bib3 - Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - icon: atekicon - fake-icon: ateficon + bib: + Filename: bib3.tem + TilesetFilenames: + SNOW: bib3.sno + DESERT: bib3.des + JUNGLE: bib3.jun + WINTER: bib3.win + BARREN: bib3.bar + Length: * + icon: + Filename: atekicon.shp + fake-icon: + Filename: ateficon.shp stek: Inherits: ^StructureOverlays - idle: stek - active: stek - damaged-active: stek + idle: + Filename: stek.shp + active: + Filename: stek.shp + damaged-active: + Filename: stek.shp Start: 1 - damaged-idle: stek + damaged-idle: + Filename: stek.shp Start: 1 - make: stekmake + make: + Filename: stekmake.shp Length: * - bib: bib2 + bib: + Filename: bib2.tem + TilesetFilenames: + SNOW: bib2.sno + DESERT: bib2.des + JUNGLE: bib2.jun + WINTER: bib2.win + BARREN: bib2.bar Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - icon: stekicon + icon: + Filename: stekicon.shp weap: Inherits: ^StructureOverlays - idle: weap - damaged-idle: weap + idle: + Filename: weap.shp + damaged-idle: + Filename: weap.shp Start: 1 - place: weapmake + place: + Filename: weapmake.shp Start: 14 - make: weapmake + make: + Filename: weapmake.shp Length: * - build-top: weap3 + build-top: + Filename: weap3.shp Length: 10 ZOffset: 511 - damaged-build-top: weap2 + damaged-build-top: + Filename: weap2.shp Start: 4 Length: 4 ZOffset: 511 - bib: bib2 - Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - emp-overlay: emp_fx01 + bib: + Filename: bib2.tem + TilesetFilenames: + SNOW: bib2.sno + DESERT: bib2.des + JUNGLE: bib2.jun + WINTER: bib2.win + BARREN: bib2.bar + Length: * + emp-overlay: + Filename: emp_fx01.shp ZOffset: 2048 - chrono-overlay: chronofade + chrono-overlay: + Filename: chronofade.shp ZOffset: 2048 - icon: weapicon - fake-icon: weaficon + icon: + Filename: weapicon.shp + fake-icon: + Filename: weaficon.shp hpad: Inherits: ^StructureOverlays - idle: hpad + idle: + Filename: hpad.shp ZOffset: -1023 - damaged-idle: hpad + damaged-idle: + Filename: hpad.shp Start: 7 ZOffset: -1023 - active: hpad + active: + Filename: hpad.shp Start: 1 Length: 6 Tick: 100 ZOffset: -1023 - damaged-active: hpad + damaged-active: + Filename: hpad.shp Start: 8 Length: 6 Tick: 100 ZOffset: -1023 - make: hpadmake + make: + Filename: hpadmake.shp Length: * - bib: bib3 + bib: + Filename: bib3.tem + TilesetFilenames: + SNOW: bib3.sno + DESERT: bib3.des + JUNGLE: bib3.jun + WINTER: bib3.win + BARREN: bib3.bar Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - icon: hpadicon + icon: + Filename: hpadicon.shp afld: Inherits: ^StructureOverlays - idle: afldidle + idle: + Filename: afldidle.shp Length: 8 Tick: 160 ZOffset: -1023 Offset: 0,-4 - damaged-idle: afldidle + damaged-idle: + Filename: afldidle.shp Start: 8 Length: 8 Tick: 160 ZOffset: -1023 Offset: 0,-4 - active: afld + active: + Filename: afld.shp Length: 8 Tick: 160 ZOffset: -1023 Offset: 0,-4 - damaged-active: afld + damaged-active: + Filename: afld.shp Start: 8 Length: 8 Tick: 160 ZOffset: -1023 Offset: 0,-4 - make: afldmake + make: + Filename: afldmake.shp Length: * Offset: 0,-4 - bib: bib2 + bib: + Filename: bib2.tem + TilesetFilenames: + SNOW: bib2.sno + DESERT: bib2.des + JUNGLE: bib2.jun + WINTER: bib2.win + BARREN: bib2.bar Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT ZOffset: -1024 - icon: afldicon + icon: + Filename: afldicon.shp spen: Inherits: ^StructureOverlays - idle: spen - damaged-idle: spen + idle: + Filename: spen.shp + damaged-idle: + Filename: spen.shp Start: 1 - make: spenmake + make: + Filename: spenmake.shp Length: * - icon: spenicon + icon: + Filename: spenicon.shp syrd: Inherits: ^StructureOverlays - idle: syrd - damaged-idle: syrd + idle: + Filename: syrd.shp + damaged-idle: + Filename: syrd.shp Start: 1 - make: syrdmake + make: + Filename: syrdmake.shp Length: * - icon: syrdicon - fake-icon: syrficon + icon: + Filename: syrdicon.shp + fake-icon: + Filename: syrficon.shp fix: Inherits: ^StructureOverlays - idle: fix + idle: + Filename: fix.shp Offset: 0,1 ZOffset: -1c511 - damaged-idle: fix + damaged-idle: + Filename: fix.shp Start: 7 Offset: 0,1 ZOffset: -1c511 - active: fix + active: + Filename: fix.shp Start: 1 Length: 6 Offset: 0,1 Tick: 100 ZOffset: -1c511 - damaged-active: fix + damaged-active: + Filename: fix.shp Start: 8 Length: 6 Offset: 0,1 Tick: 100 ZOffset: -1c511 - make: fixmake + make: + Filename: fixmake.shp Length: * Offset: 0,1 - bib: mbFIX + bib: + Filename: mbFIX.tem + TilesetFilenames: + SNOW: mbFIX.sno + INTERIOR: mbFIX.int + DESERT: mbFIX.des + JUNGLE: mbFIX.jun + WINTER: mbFIX.win Length: * ZOffset: -1c511 Offset: 0,-4 - UseTilesetExtension: true - TilesetOverrides: - BARREN: TEMPERAT - icon: fixicon - fake-icon: fixficon + icon: + Filename: fixicon.shp + fake-icon: + Filename: fixficon.shp gun: Inherits: ^StructureOverlays - idle: gunmake # Empty first frame. We need WithSpriteBody for the make anim, and WSB needs at least a placeholder default sequence to work - make: gunmake + idle: # Empty first frame. We need WithSpriteBody for the make anim, and WSB needs at least a placeholder default sequence to work + Filename: gunmake.shp + make: + Filename: gunmake.shp Length: * turret: + Filename: gun.shp Facings: 32 UseClassicFacings: True - recoil: gun + recoil: + Filename: gun.shp Start: 32 Facings: 32 UseClassicFacings: True - make: gunmake + make: + Filename: gunmake.shp Length: * - damaged-turret: gun + damaged-turret: + Filename: gun.shp Start: 64 Facings: 32 UseClassicFacings: True - damaged-recoil: gun + damaged-recoil: + Filename: gun.shp Start: 96 Facings: 32 UseClassicFacings: True - muzzle: gunfire2 + muzzle: + Filename: gunfire2.shp Length: 5 - bib: mbGUN + bib: + Filename: mbGUN.tem + TilesetFilenames: + SNOW: mbGUN.sno + INTERIOR: mbGUN.int + DESERT: mbGUN.des + JUNGLE: mbGUN.jun + WINTER: mbGUN.win Length: * Offset: -1,-1 - UseTilesetExtension: true - TilesetOverrides: - BARREN: TEMPERAT - icon: gunicon + icon: + Filename: gunicon.shp agun: Inherits: ^StructureOverlays - idle: gunmake # Empty first frame (agunmake has no empty frames). We need WithSpriteBody for the make anim, and WSB needs at least a placeholder default sequence to work - make: agunmake + idle: # Empty first frame (agunmake has no empty frames). We need WithSpriteBody for the make anim, and WSB needs at least a placeholder default sequence to work + Filename: gunmake.shp + make: + Filename: agunmake.shp Length: * Offset: 0,-13 turret: + Filename: agun.shp Facings: 32 UseClassicFacings: True Offset: 0,-13 - recoil: agun + recoil: + Filename: agun.shp Start: 32 Facings: 32 UseClassicFacings: True Offset: 0,-13 - make: agunmake + make: + Filename: agunmake.shp Length: * Offset: 0,-13 - damaged-turret: agun + damaged-turret: + Filename: agun.shp Start: 64 Facings: 32 UseClassicFacings: True Offset: 0,-13 - damaged-recoil: agun + damaged-recoil: + Filename: agun.shp Start: 96 Facings: 32 UseClassicFacings: True Offset: 0,-13 - muzzle: gunfire2 + muzzle: + Filename: gunfire2.shp Start: 1 Length: 4 - bib: mbAGUN + bib: + Filename: mbAGUN.tem + TilesetFilenames: + SNOW: mbAGUN.sno + INTERIOR: mbAGUN.int + DESERT: mbAGUN.des + WINTER: mbAGUN.win Length: * - UseTilesetExtension: true - TilesetOverrides: - JUNGLE: TEMPERAT - BARREN: TEMPERAT - icon: agunicon + icon: + Filename: agunicon.shp sam: Inherits: ^StructureOverlays - idle: sam2 + idle: + Filename: empty.shp + damaged-idle: + Filename: empty.shp + turret: + Filename: sam2.shp Facings: 32 UseClassicFacings: True Offset: -2,-2 - damaged-idle: sam2 + damaged-turret: + Filename: sam2.shp Start: 34 Facings: 32 UseClassicFacings: True Offset: -2,-2 - make: sammake + make: + Filename: sammake.shp Length: * Offset: -2,-2 - muzzle: samfire + muzzle: + Filename: samfire.shp Length: 18 Facings: 8 - bib: mbSAM + bib: + Filename: mbSAM.tem + TilesetFilenames: + SNOW: mbSAM.sno + INTERIOR: mbSAM.int + DESERT: mbSAM.des + JUNGLE: mbSAM.jun + WINTER: mbSAM.win Length: * Offset: 0,1 - UseTilesetExtension: true - TilesetOverrides: - BARREN: TEMPERAT - icon: samicon + icon: + Filename: samicon.shp ftur: Inherits: ^StructureOverlays - idle: ftur + idle: + Filename: ftur.shp Offset: 0,-2 - damaged-idle: ftur + damaged-idle: + Filename: ftur.shp Start: 1 Offset: 0,-2 - make: fturmake + make: + Filename: fturmake.shp Length: * Offset: 0,-2 - bib: mbFTUR - Length: * - UseTilesetExtension: true - TilesetOverrides: - BARREN: TEMPERAT - icon: fturicon + bib: + Filename: mbFTUR.tem + TilesetFilenames: + SNOW: mbFTUR.sno + INTERIOR: mbFTUR.int + DESERT: mbFTUR.des + JUNGLE: mbFTUR.jun + WINTER: mbFTUR.win + Length: * + icon: + Filename: fturicon.shp tsla: Inherits: ^StructureOverlays - idle: tsla + idle: + Filename: tsla.shp Offset: 0,-13 - damaged-idle: tsla + damaged-idle: + Filename: tsla.shp Start: 10 Offset: 0,-13 - make: tslamake + make: + Filename: tslamake.shp Length: * Offset: 0,-13 - active: tsla + active: + Filename: tsla.shp Start: 0 Length: 10 Tick: 100 Offset: 0,-13 - damaged-active: tsla + damaged-active: + Filename: tsla.shp Start: 11 Length: 9 Tick: 100 Offset: 0,-13 - bib: mbTSLA - Length: * - UseTilesetExtension: true - TilesetOverrides: - BARREN: TEMPERAT - icon: tslaicon + bib: + Filename: mbTSLA.tem + TilesetFilenames: + SNOW: mbTSLA.sno + INTERIOR: mbTSLA.int + DESERT: mbTSLA.des + JUNGLE: mbTSLA.jun + WINTER: mbTSLA.win + Length: * + icon: + Filename: tslaicon.shp pbox: Inherits: ^StructureOverlays - idle: pbox - damaged-idle: pbox + idle: + Filename: pbox.shp + damaged-idle: + Filename: pbox.shp Start: 1 - make: pboxmake + make: + Filename: pboxmake.shp Length: * - muzzle: minigun + muzzle: + Filename: minigun.shp Length: 6 Facings: 8 - bib: mbPBOX + bib: + Filename: mbPBOX.tem + TilesetFilenames: + SNOW: mbPBOX.sno + INTERIOR: mbPBOX.int + DESERT: mbPBOX.des + WINTER: mbPBOX.win Length: * Offset: 0,-2 - UseTilesetExtension: true - TilesetOverrides: - JUNGLE: TEMPERAT - BARREN: TEMPERAT - icon: pboxicon + icon: + Filename: pboxicon.shp hbox: Inherits: ^StructureOverlays Defaults: - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT + Filename: hbox.tem + TilesetFilenames: + SNOW: hbox.sno + DESERT: hbox.des + JUNGLE: hbox.jun + WINTER: hbox.win + BARREN: hbox.bar idle: damaged-idle: Start: 2 - make: hboxmake - Length: * - muzzle: minigun + make: + Filename: hboxmake.tem + TilesetFilenames: + SNOW: hboxmake.sno + DESERT: hboxmake.des + JUNGLE: hboxmake.jun + WINTER: hboxmake.win + BARREN: hboxmake.bar + Length: * + muzzle: + Filename: minigun.shp + TilesetFilenames: Length: 6 Facings: 8 - UseTilesetExtension: false - emp-overlay: emp_fx01 - UseTilesetExtension: false - chrono-overlay: chronofade - UseTilesetExtension: false - mind-overlay: mindanim + emp-overlay: + Filename: emp_fx01.shp + TilesetFilenames: + chrono-overlay: + Filename: chronofade.shp + TilesetFilenames: + mind-overlay: + Filename: mindanim.shp + TilesetFilenames: Length: * Tick: 200 BlendMode: Alpha Offset: 0, 0 - UseTilesetExtension: false - icon: hboxicon - UseTilesetExtension: false + icon: + Filename: hboxicon.shp + TilesetFilenames: gap: Inherits: ^StructureOverlays - idle: gap + idle: + Filename: gap.shp Length: 32 Offset: 0,-14 - damaged-idle: gap + damaged-idle: + Filename: gap.shp Start: 32 Length: 32 Offset: 0,-14 - make: gapmake + make: + Filename: gapmake.shp Length: * Offset: 0,-14 - bib: mbGAP + bib: + Filename: mbGAP.tem + TilesetFilenames: + SNOW: mbGAP.sno + INTERIOR: mbGAP.int + DESERT: mbGAP.des + WINTER: mbGAP.win + Length: * + muzzle: + Filename: gapmuzzle.shp + Frames: 7,8,9,10,11,12,13,14,15,16,17,18 + BlendMode: Subtractive + Tick: 60 Length: * - UseTilesetExtension: true - TilesetOverrides: - JUNGLE: TEMPERAT - BARREN: TEMPERAT - icon: gapicon + ZOffset: 2048 + icon: + Filename: gapicon.shp iron: Inherits: ^StructureOverlays - idle: iron + idle: + Filename: iron.shp Offset: 0,-12 - active: iron + active: + Filename: iron.shp Length: 11 Offset: 0,-12 Tick: 140 - damaged-idle: iron + damaged-idle: + Filename: iron.shp Start: 11 Offset: 0,-12 - damaged-active: iron + damaged-active: + Filename: iron.shp Start: 11 Length: 11 Offset: 0,-12 - make: ironmake + make: + Filename: ironmake.shp Length: * Offset: 0,-12 - bib: mbIRON + bib: + Filename: mbIRON.tem + TilesetFilenames: + SNOW: mbIRON.sno + INTERIOR: mbIRON.int + DESERT: mbIRON.des + WINTER: mbIRON.win Length: * Offset: 0,2 - UseTilesetExtension: true - TilesetOverrides: - JUNGLE: TEMPERAT - BARREN: TEMPERAT - icon: ironicon + icon: + Filename: ironicon.shp pdox: Inherits: ^StructureOverlays - idle: pdox - damaged-idle: pdox + idle: + Filename: pdox.shp + damaged-idle: + Filename: pdox.shp Start: 29 - active: pdox + active: + Filename: pdox.shp Length: 29 Tick: 140 - damaged-active: pdox + damaged-active: + Filename: pdox.shp Start: 29 Length: 29 - make: pdoxmake + make: + Filename: pdoxmake.shp Length: * - bib: mbPDOX + bib: + Filename: mbPDOX.tem + TilesetFilenames: + SNOW: mbPDOX.sno + INTERIOR: mbPDOX.int + DESERT: mbPDOX.des + WINTER: mbPDOX.win Length: * Offset: 0,-4 - UseTilesetExtension: true - TilesetOverrides: - JUNGLE: TEMPERAT - BARREN: TEMPERAT - icon: pdoxicon - fake-icon: pdoficon + icon: + Filename: pdoxicon.shp + fake-icon: + Filename: pdoficon.shp mslo: Inherits: ^StructureOverlays Defaults: - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - WINTER: TEMPERAT - DUNE: DESERT + Filename: mslo.tem + TilesetFilenames: + SNOW: mslo.sno + DESERT: mslo.des + JUNGLE: mslo.jun + BARREN: mslo.bar idle: damaged-idle: Start: 8 - make: mslomake + make: + Filename: mslomake.tem + TilesetFilenames: + SNOW: mslomake.sno + DESERT: mslomake.des + JUNGLE: mslomake.jun + BARREN: mslomake.bar Length: * active: Start: 1 @@ -842,174 +1318,233 @@ mslo: damaged-active: Start: 9 Length: 7 - emp-overlay: emp_fx01 - UseTilesetExtension: false - chrono-overlay: chronofade - UseTilesetExtension: false - mind-overlay: mindanim + emp-overlay: + Filename: emp_fx01.shp + TilesetFilenames: + chrono-overlay: + Filename: chronofade.shp + TilesetFilenames: + mind-overlay: + Filename: mindanim.shp + TilesetFilenames: Length: * Tick: 200 BlendMode: Alpha Offset: 0, 0 - UseTilesetExtension: false - icon: msloicon2 - UseTilesetExtension: false - fake-icon: mslficon - UseTilesetExtension: false + icon: + Filename: msloicon2.shp + TilesetFilenames: + fake-icon: + Filename: mslficon.shp + TilesetFilenames: miss: Inherits: ^StructureOverlays - idle: miss - damaged-idle: miss + idle: + Filename: miss.shp + damaged-idle: + Filename: miss.shp Start: 1 - dead: miss + dead: + Filename: miss.shp Start: 2 Tick: 800 - make: missmake + make: + Filename: missmake.shp Length: * - bib: bib2 + bib: + Filename: bib2.tem + TilesetFilenames: + SNOW: bib2.sno + DESERT: bib2.des + JUNGLE: bib2.jun + WINTER: bib2.win + BARREN: bib2.bar Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - icon: missicon + icon: + Filename: missicon.shp + +alhq: + Inherits: ^StructureOverlays + idle: + Filename: alhq.shp + Offset: 0, -14 + active: + Filename: alhq.shp + damaged-idle: + Filename: alhq.shp + Start: 20 + Offset: 0, -14 + dead: + Filename: alhq.shp + Start: 20 + Tick: 800 + Offset: 0, -14 + make: + Filename: alhq.shp + Offset: 0, -14 + Start: 1 + Length: 19 + bib: + Filename: bib3.tem + TilesetFilenames: + SNOW: bib3.sno + DESERT: bib3.des + JUNGLE: bib3.jun + WINTER: bib3.win + BARREN: bib3.bar + Length: * + icon: + Filename: alhqicon.shp upgc: Inherits: ^StructureOverlays - idle: upgc + idle: + Filename: upgc.shp Length: 10 Tick: 120 - active: upgc + active: + Filename: upgc.shp Length: 10 Tick: 120 - damaged-idle: upgc + damaged-idle: + Filename: upgc.shp Start: 10 Length: 10 Tick: 120 - damaged-active: upgc + damaged-active: + Filename: upgc.shp Start: 10 Length: 10 Tick: 120 - dead: upgc + dead: + Filename: upgc.shp Start: 10 Length: 1 Tick: 800 - make: upgcmake + make: + Filename: upgcmake.shp Length: * - flare: smokland + flare: + Filename: smokland.shp Length: 92 Tick: 120 ZOffset: 1023 - turret-rocket: upgc-fstorm + turret-rocket: + Filename: upgc-fstorm.shp Facings: 32 - UseTilesetCode: false - turret-radar: upgc-aradar + turret-radar: + Filename: upgc-aradar.shp Start: 0 Length: * - UseTilesetCode: false - turret-shield: upgc-nshieldoff + turret-shield: + Filename: upgc-nshieldoff.shp Length: * - UseTilesetCode: false - turret-shield-active: upgc-nshield + turret-shield-active: + Filename: upgc-nshield.shp Length: * - UseTilesetCode: false - turret-drop: upgc-dzone + turret-drop: + Filename: upgc-dzone.shp Length: * - UseTilesetCode: false Tick: 300 - bib: bib2 - Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - icon: upgcicnh - -upgc.bomb: - place: upgc-fstorm - Offset: 0, -12, 12 - UseTilesetCode: true - Start: 12 - icon: upgc-fstormicnh - -upgc.seek: - place: upgc-aradar - Offset: 0, -12, 12 - UseTilesetCode: true - Start: 28 - icon: upgc-aradaricnh - -upgc.hold: - place: upgc-nshieldoff - Offset: 0, -12, 12 - UseTilesetCode: true - icon: upgc-nshieldicnh - -upgc.drop: - place: upgc-dzone - Offset: 0, -12, 12 - UseTilesetCode: true - icon: upgc-dzoneicnh + bib: + Filename: bib2.tem + TilesetFilenames: + SNOW: bib2.sno + DESERT: bib2.des + JUNGLE: bib2.jun + WINTER: bib2.win + BARREN: bib2.bar + Length: * + icon: + Filename: upgcicnh.shp gtek: Inherits: ^StructureOverlays - idle: gtek - active: gtek - damaged-idle: gtek + idle: + Filename: gtek.shp + active: + Filename: gtek.shp + damaged-idle: + Filename: gtek.shp Start: 1 - damaged-active: gtek + damaged-active: + Filename: gtek.shp Start: 1 - dead: gtek + dead: + Filename: gtek.shp Start: 2 Tick: 800 - make: gtekmake + make: + Filename: gtekmake.shp Length: * - bib: bib2 + bib: + Filename: bib2.tem + TilesetFilenames: + SNOW: bib2.sno + DESERT: bib2.des + JUNGLE: bib2.jun + WINTER: bib2.win + BARREN: bib2.bar Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - icon: gtekicnh + icon: + Filename: gtekicnh.shp miss.destroyed: - idle: miss + idle: + Filename: miss.shp Start: 2 - bib: bib2 + bib: + Filename: bib2.tem + TilesetFilenames: + SNOW: bib2.sno + DESERT: bib2.des + JUNGLE: bib2.jun + WINTER: bib2.win + BARREN: bib2.bar Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT brik: - idle: brik + idle: + Filename: brik.shp Length: 16 - scratched-idle: brik + scratched-idle: + Filename: brik.shp Start: 16 Length: 16 - damaged-idle: brik + damaged-idle: + Filename: brik.shp Start: 32 Length: 16 - icon: brikicon + icon: + Filename: brikicon.shp vgate: - make: vgate + make: + Filename: vgate.shp Length: 7 - idle: vgate + idle: + Filename: vgate.shp Frames: 6, 5, 4, 3, 2, 1, 0 Length: 7 ZOffset: -1c511 - damaged-idle: vgate + damaged-idle: + Filename: vgate.shp Frames: 13, 12, 11, 10, 9, 8, 7 Length: 7 ZOffset: -1c511 agate: - make: agate + make: + Filename: agate.shp Length: 7 - idle: agate + idle: + Filename: agate.shp Frames: 6, 5, 4, 3, 2, 1, 0 Length: 7 ZOffset: -1c511 - damaged-idle: agate + damaged-idle: + Filename: agate.shp Frames: 13, 12, 11, 10, 9, 8, 7 Length: 7 ZOffset: -1c511 @@ -1018,1144 +1553,1748 @@ sgate: Inherits: agate sbag: - idle: sbag + idle: + Filename: sbag.shp Length: 16 - icon: sbagicon + damaged-idle: + Filename: sbag.shp + Start: 32 + Length: 16 + icon: + Filename: sbagicon.shp fenc: - idle: fenc + idle: + Filename: fenc.shp Length: 16 - icon: fencicon + damaged-idle: + Filename: fenc.shp + Start: 16 + Length: 16 + icon: + Filename: fencicon.shp + +chain: + idle: + Filename: chain.shp + Length: 16 + damaged-idle: + Filename: chain.shp + Start: 16 + Length: 16 + icon: + Filename: chainicon.shp cycl: - idle: cycl + idle: + Filename: cycl.shp Length: 16 - damaged-idle: cycl + damaged-idle: + Filename: cycl.shp Start: 16 Length: 16 pyle: Inherits: ^StructureOverlays - idle: pyle + idle: + Filename: pyle.shp Length: 10 Tick: 100 - damaged-idle: pyle + damaged-idle: + Filename: pyle.shp Start: 10 Length: 10 Tick: 100 - dead: pyle + dead: + Filename: pyle.shp Start: 20 - Tick: 100 - make: pylemake + Tick: 800 + make: + Filename: pylemake.shp Length: * Tick: 80 - bib: bib3 - Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - icon: pyleicnh + bib: + Filename: bib3.tem + TilesetFilenames: + SNOW: bib3.sno + DESERT: bib3.des + JUNGLE: bib3.jun + WINTER: bib3.win + BARREN: bib3.bar + Length: * + icon: + Filename: pyleicnh.shp hand: Inherits: ^StructureOverlays - idle: hand - active: hand - damaged-idle: hand + idle: + Filename: hand.shp + active: + Filename: hand.shp + damaged-idle: + Filename: hand.shp Start: 1 - damaged-active: hand + damaged-active: + Filename: hand.shp Start: 1 - dead: hand + dead: + Filename: hand.shp Start: 2 - make: handmake + Tick: 800 + make: + Filename: handmake.shp Length: * Tick: 80 - bib: bib3 - Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - icon: handicnh + bib: + Filename: bib3.tem + TilesetFilenames: + SNOW: bib3.sno + DESERT: bib3.des + JUNGLE: bib3.jun + WINTER: bib3.win + BARREN: bib3.bar + Length: * + icon: + Filename: handicnh.shp afac: Inherits: ^StructureOverlays - idle: afac + idle: + Filename: afac.shp Length: 4 Tick: 160 - build: afac + build: + Filename: afac.shp Start: 4 Length: 20 Tick: 100 - pdox: afac + pdox: + Filename: afac.shp Length: 4 Tick: 160 - damaged-idle: afac + damaged-idle: + Filename: afac.shp Start: 24 Length: 4 Tick: 160 - damaged-build: afac + damaged-build: + Filename: afac.shp Start: 28 Length: 20 Tick: 100 - damaged-pdox: afac + damaged-pdox: + Filename: afac.shp Start: 24 Length: 4 Tick: 160 - dead: afac + dead: + Filename: afac.shp Start: 48 - make: afacmake - Length: * - Tick: 80 - makenod: nodfactmake - Length: * - Tick: 80 - bib: bib2 - Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - icon: afacicon + Tick: 800 + make: + Filename: afacmake.shp + Length: * + Tick: 40 + makenod: + Filename: nodfactmake.shp + Length: * + Tick: 40 + bib: + Filename: bib2.tem + TilesetFilenames: + SNOW: bib2.sno + DESERT: bib2.des + JUNGLE: bib2.jun + WINTER: bib2.win + BARREN: bib2.bar + Length: * + icon: + Filename: afacicon.shp nuke: Inherits: ^StructureOverlays - idle: nuke + idle: + Filename: nuke.shp Length: 4 Tick: 1000 - damaged-idle: nuke + damaged-idle: + Filename: nuke.shp Start: 4 Length: 4 Tick: 1000 - dead: nuke + dead: + Filename: nuke.shp Start: 8 Tick: 1000 - make: nukemake + make: + Filename: nukemake.shp Length: * Tick: 80 - bib: bib3 - Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - icon: nukeicnh + bib: + Filename: bib3.tem + TilesetFilenames: + SNOW: bib3.sno + DESERT: bib3.des + JUNGLE: bib3.jun + WINTER: bib3.win + BARREN: bib3.bar + Length: * + icon: + Filename: nukeicnh.shp nuk2: Inherits: ^StructureOverlays - idle: nuk2 + idle: + Filename: nuk2.shp Length: 4 Tick: 1000 - damaged-idle: nuk2 + damaged-idle: + Filename: nuk2.shp Start: 4 Length: 4 Tick: 1000 - dead: nuk2 + dead: + Filename: nuk2.shp Start: 8 - make: nuk2make + Tick: 800 + make: + Filename: nuk2make.shp Length: * Tick: 80 - bib: bib3 - Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - icon: nuk2icnh + bib: + Filename: bib3.tem + TilesetFilenames: + SNOW: bib3.sno + DESERT: bib3.des + JUNGLE: bib3.jun + WINTER: bib3.win + BARREN: bib3.bar + Length: * + icon: + Filename: nuk2icnh.shp awep: Inherits: ^StructureOverlays - idle: awep - damaged-idle: awep + idle: + Filename: awep.shp + damaged-idle: + Filename: awep.shp Start: 1 - dead: awep + dead: + Filename: awep.shp Start: 2 - make: awepmake + Tick: 800 + make: + Filename: awepmake.shp Length: * Tick: 80 - place: awepmake + place: + Filename: awepmake.shp Start: 19 - build-top: awep2 + build-top: + Filename: awep2.shp Length: 10 ZOffset: 511 - damaged-build-top: awep2 + damaged-build-top: + Filename: awep2.shp Start: 10 Length: 10 ZOffset: 511 - idle-top: awep2 - damaged-idle-top: awep2 + idle-top: + Filename: awep2.shp + damaged-idle-top: + Filename: awep2.shp Start: 4 - bib: bib2 - Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - emp-overlay: emp_fx01 + bib: + Filename: bib2.tem + TilesetFilenames: + SNOW: bib2.sno + DESERT: bib2.des + JUNGLE: bib2.jun + WINTER: bib2.win + BARREN: bib2.bar + Length: * + emp-overlay: + Filename: emp_fx01.shp ZOffset: 2048 - chrono-overlay: chronofade + chrono-overlay: + Filename: chronofade.shp ZOffset: 2048 - icon: awepicnh + icon: + Filename: awepicnh.shp astrip: Inherits: ^StructureOverlays - idle: astrip + idle: + Filename: astrip.shp Tick: 120 ZOffset: -1023 - active: astrip + active: + Filename: astrip.shp Length: 16 Tick: 120 ZOffset: -1023 - damaged-idle: astrip + damaged-idle: + Filename: astrip.shp Start: 16 Tick: 120 ZOffset: -1023 - damaged-active: astrip + damaged-active: + Filename: astrip.shp Start: 16 Length: 16 Tick: 120 ZOffset: -1023 - idle-dish: astrip_d + idle-dish: + Filename: astrip_d.shp Length: 16 Tick: 160 - damaged-idle-dish: astrip_d + damaged-idle-dish: + Filename: astrip_d.shp Start: 16 Length: 16 Tick: 160 - dead: astrip + dead: + Filename: astrip.shp Start: 32 ZOffset: -1023 - make: astripmake + Tick: 800 + make: + Filename: astripmake.shp Length: * Tick: 80 - bib: bib1 - Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - icon: astripicnh + bib: + Filename: bib1.tem + TilesetFilenames: + SNOW: bib1.sno + DESERT: bib1.des + JUNGLE: bib1.jun + WINTER: bib1.win + BARREN: bib1.bar + Length: * + icon: + Filename: astripicnh.shp tmpl: Inherits: ^StructureOverlays - idle: tmpl + idle: + Filename: tmpl.shp ZOffset: 1023 - damaged-idle: tmpl + damaged-idle: + Filename: tmpl.shp Start: 33 ZOffset: 1023 - active: tmpl + active: + Filename: tmpl.shp Length: 33 Tick: 25 ZOffset: 1023 - damaged-active: tmpl + damaged-active: + Filename: tmpl.shp Start: 33 Length: 33 Tick: 25 ZOffset: 1023 - false-active: tmpl + false-active: + Filename: tmpl.shp ZOffset: 1023 - damaged-false-active: tmpl + damaged-false-active: + Filename: tmpl.shp Start: 33 ZOffset: 1023 - dead: tmpl + dead: + Filename: tmpl.shp Start: 66 Tick: 800 - make: tmplmake + make: + Filename: tmplmake.shp Length: * Tick: 60 - bib: bib2 - Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - icon: tmplicnh + bib: + Filename: bib2.tem + TilesetFilenames: + SNOW: bib2.sno + DESERT: bib2.des + JUNGLE: bib2.jun + WINTER: bib2.win + BARREN: bib2.bar + Length: * + icon: + Filename: tmplicnh.shp nsam: Inherits: ^StructureOverlays - closed-idle: nsam + closed-idle: + Filename: nsam.shp Start: 0 - opening: nsam + opening: + Filename: nsam.shp Start: 1 Length: 16 Tick: 30 - idle: nsam + idle: + Filename: nsam.shp Start: 17 Facings: 32 UseClassicFacings: True - closing: nsam + closing: + Filename: nsam.shp Start: 50 Length: 14 Tick: 30 - damaged-closed-idle: nsam + damaged-closed-idle: + Filename: nsam.shp Start: 64 - damaged-opening: nsam + damaged-opening: + Filename: nsam.shp Start: 65 Length: 16 Tick: 30 - damaged-idle: nsam + damaged-idle: + Filename: nsam.shp Start: 81 Facings: 32 UseClassicFacings: True - damaged-closing: nsam + damaged-closing: + Filename: nsam.shp Start: 114 Length: 14 Tick: 30 - dead: nsam + dead: + Filename: nsam.shp Start: 128 Tick: 800 - place: nsam + place: + Filename: nsam.shp Start: 0 - make: nsammake + make: + Filename: nsammake.shp Length: 20 Tick: 30 - muzzle: samfire + muzzle: + Filename: samfire.shp Length: 18 Facings: 8 - icon: samicon + icon: + Filename: samicon.shp -chain: - idle: chain +hq: + Inherits: ^StructureOverlays + idle: + Filename: hq.shp Length: 16 - scratched-idle: chain + Tick: 100 + damaged-idle: + Filename: hq.shp Start: 16 Length: 16 - damaged-idle: chain + Tick: 100 + dead: + Filename: hq.shp Start: 32 - Length: 16 - icon: chainicon + Tick: 800 + make: + Filename: hqmake.shp + Length: * + Tick: 80 + bib: + Filename: bib3.tem + TilesetFilenames: + SNOW: bib3.sno + DESERT: bib3.des + JUNGLE: bib3.jun + WINTER: bib3.win + BARREN: bib3.bar + Length: * + icon: + Filename: hqicnh.shp -hq: +hqr: Inherits: ^StructureOverlays - idle: hq + idle: + Filename: hqr.shp Length: 16 Tick: 100 - damaged-idle: hq + damaged-idle: + Filename: hqr.shp Start: 16 Length: 16 Tick: 100 - dead: hq + dead: + Filename: hqr.shp Start: 32 - make: hqmake + Tick: 800 + make: + Filename: hqrmake.shp Length: * Tick: 80 - bib: bib3 - Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - icon: hqicnh + bib: + Filename: bib3.tem + TilesetFilenames: + SNOW: bib3.sno + DESERT: bib3.des + JUNGLE: bib3.jun + WINTER: bib3.win + BARREN: bib3.bar + Length: * + icon: + Filename: hqicnh.shp eye: Inherits: ^StructureOverlays - idle: eye + idle: + Filename: eye.shp Length: 16 Tick: 100 - active: eye + active: + Filename: eye.shp Length: 16 Tick: 100 - damaged-idle: eye + damaged-idle: + Filename: eye.shp Start: 16 Length: 16 Tick: 100 - dead: eye + dead: + Filename: eye.shp Start: 32 - make: eyemake + Tick: 800 + make: + Filename: eyemake.shp Length: * Tick: 80 - bib: bib3 - Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - icon: eyeicnh + bib: + Filename: bib3.tem + TilesetFilenames: + SNOW: bib3.sno + DESERT: bib3.des + JUNGLE: bib3.jun + WINTER: bib3.win + BARREN: bib3.bar + Length: * + icon: + Filename: eyeicnh.shp obli: Inherits: ^StructureOverlays Defaults: Offset: 0,-12 - idle: obli - damaged-idle: obli + idle: + Filename: obli.shp + damaged-idle: + Filename: obli.shp Start: 4 - active: obli + active: + Filename: obli.shp Length: 4 Tick: 680 - damaged-active: obli + damaged-active: + Filename: obli.shp Start: 4 Length: 4 Tick: 680 - dead: obli + dead: + Filename: obli.shp Start: 8 - make: oblimake + Tick: 800 + make: + Filename: oblimake.shp Length: 13 Tick: 80 - icon: obliicnh + muzzle: + Filename: lasermuzzle.shp + Length: 4 + ZOffset: 2049 + Offset: -2,0 + muzzle2: + Filename: lasermuzzle.shp + Frames: 0,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,3 + Length: * + ZOffset: 2049 + Offset: -2,0 + icon: + Filename: obliicnh.shp Offset: 0,0 - bib: mbFTUR + bib: + Filename: mbFTUR.tem + TilesetFilenames: + SNOW: mbFTUR.sno + DESERT: mbFTUR.des + JUNGLE: mbFTUR.jun + WINTER: mbFTUR.win Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - BARREN: TEMPERAT Offset: -1,-3 gtwr: Inherits: ^StructureOverlays - idle: gtwr - make: gtwrmake + idle: + Filename: gtwr.shp + make: + Filename: gtwrmake.shp Length: * - muzzle: minigun + muzzle: + Filename: minigun.shp Length: 6 Facings: 8 - icon: gtwricnh - damaged-idle: gtwr + icon: + Filename: gtwricnh.shp + damaged-idle: + Filename: gtwr.shp Start: 1 - dead: gtwrmake + dead: + Filename: gtwrmake.shp Start: 2 - bib: mbFTUR + Tick: 800 + bib: + Filename: mbFTUR.tem + TilesetFilenames: + SNOW: mbFTUR.sno + DESERT: mbFTUR.des + JUNGLE: mbFTUR.jun + WINTER: mbFTUR.win Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - BARREN: TEMPERAT atwr: Inherits: ^StructureOverlays Defaults: Offset: 0,-13 - idle: atwr - damaged-idle: atwr + idle: + Filename: atwr.shp + damaged-idle: + Filename: atwr.shp Start: 1 - dead: atwr + dead: + Filename: atwr.shp Start: 2 - make: atwrmake + Tick: 800 + make: + Filename: atwrmake.shp Length: * Tick: 80 - muzzle: gunfire2 + muzzle: + Filename: gunfire2.shp Length: * - icon: atwricnh + icon: + Filename: atwricnh.shp Offset: 0,0 - bib: mbFTUR + bib: + Filename: mbFTUR.tem + TilesetFilenames: + SNOW: mbFTUR.sno + DESERT: mbFTUR.des + JUNGLE: mbFTUR.jun + WINTER: mbFTUR.win Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - BARREN: TEMPERAT Offset: -3,0 rep: Inherits: ^StructureOverlays - idle: rep + idle: + Filename: rep.shp Offset: 0,1 ZOffset: -1c511 - damaged-idle: rep + damaged-idle: + Filename: rep.shp Start: 7 Offset: 0,1 ZOffset: -1c511 - active: rep + active: + Filename: rep.shp Start: 1 Length: 6 Offset: 0,1 Tick: 100 ZOffset: -1c511 - damaged-active: rep + damaged-active: + Filename: rep.shp Start: 8 Length: 6 Offset: 0,1 Tick: 100 ZOffset: -1c511 - make: repmake + make: + Filename: repmake.shp Length: * Offset: 0,1 - bib: mbFIX + dead: + Filename: rep.shp + Start: 14 + Offset: 0,1 + ZOffset: -1c511 + Tick: 800 + bib: + Filename: mbFIX.tem + TilesetFilenames: + SNOW: mbFIX.sno + INTERIOR: mbFIX.int + DESERT: mbFIX.des + JUNGLE: mbFIX.jun + WINTER: mbFIX.win Length: * ZOffset: -1c511 Offset: 0,-4 - UseTilesetExtension: true - TilesetOverrides: - BARREN: TEMPERAT - icon: repicnh + icon: + Filename: repicnh.shp silo2: Inherits: ^StructureOverlays - idle: silo2 + idle: + Filename: silo2.shp Offset: 0,-1 - damaged-idle: silo2 + damaged-idle: + Filename: silo2.shp Start: 5 Offset: 0,-1 - dead: silo2 + dead: + Filename: silo2.shp Start: 10 Offset: 0,-1 Tick: 800 - stages: silo2 + stages: + Filename: silo2.shp Length: 5 Offset: 0,-1 - damaged-stages: silo2 + damaged-stages: + Filename: silo2.shp Start: 5 Length: 5 Offset: 0,-1 - make: silo2make + make: + Filename: silo2make.shp Length: * Tick: 80 Offset: 0,-1 - bib: mbSILO - Length: * - UseTilesetExtension: true - TilesetOverrides: - BARREN: TEMPERAT - icon: silo2icnh + bib: + Filename: mbSILO.tem + TilesetFilenames: + SNOW: mbSILO.sno + INTERIOR: mbSILO.int + DESERT: mbSILO.des + JUNGLE: mbSILO.jun + WINTER: mbSILO.win + Length: * + icon: + Filename: silo2icnh.shp gun2: Inherits: ^StructureOverlays - idle: gun2make # Empty first frame. We need WithSpriteBody for the make anim, and WSB needs at least a placeholder default sequence to work - turret: gun2 + idle: # Empty first frame. We need WithSpriteBody for the make anim, and WSB needs at least a placeholder default sequence to work + Filename: gun2make.shp + turret: + Filename: gun2.shp Facings: 32 UseClassicFacings: True - recoil: gun2 + recoil: + Filename: gun2.shp Start: 32 Facings: 32 UseClassicFacings: True - damaged-turret: gun2 + damaged-turret: + Filename: gun2.shp Start: 64 Facings: 32 UseClassicFacings: True - damaged-recoil: gun2 + damaged-recoil: + Filename: gun2.shp Start: 96 Facings: 32 UseClassicFacings: True - make: gun2make + make: + Filename: gun2make.shp Length: * Tick: 80 - muzzle: gunfire2 + muzzle: + Filename: gunfire2.shp Length: * - bib: mbGUN - UseTilesetExtension: true - TilesetOverrides: - WINTER: TEMPERAT - SNOW: TEMPERAT - BARREN: TEMPERAT + bib: + Filename: mbGUN.tem + TilesetFilenames: + INTERIOR: mbGUN.int + DESERT: mbGUN.des + JUNGLE: mbGUN.jun Length: * Offset: -1,-1 - icon: gun2icnh + icon: + Filename: gun2icnh.shp ltur: Inherits: ^StructureOverlays - idle: gunmake # Empty first frame (agunmake has no empty frames). We need WithSpriteBody for the make anim, and WSB needs at least a placeholder default sequence to work - make: lturmake + idle: # Empty first frame (agunmake has no empty frames). We need WithSpriteBody for the make anim, and WSB needs at least a placeholder default sequence to work + Filename: gunmake.shp + make: + Filename: lturmake.shp Length: * Tick: 80 turret: + Filename: ltur.shp Facings: 32 UseClassicFacings: True - damaged-turret: ltur + damaged-turret: + Filename: ltur.shp Start: 32 Facings: 32 UseClassicFacings: True - muzzle: gunfire2 + muzzle: + Filename: gunfire2.shp Length: * - bib: mbGUN - UseTilesetExtension: true - TilesetOverrides: - WINTER: TEMPERAT - SNOW: TEMPERAT - BARREN: TEMPERAT + bib: + Filename: mbGUN.tem + TilesetFilenames: + INTERIOR: mbGUN.int + DESERT: mbGUN.des + JUNGLE: mbGUN.jun Length: * Offset: -1,-1 - icon: lturicnh + icon: + Filename: lturicnh.shp hpad2: Inherits: ^StructureOverlays - idle: hpad2 + idle: + Filename: hpad2.shp ZOffset: -1023 - damaged-idle: hpad2 + damaged-idle: + Filename: hpad2.shp Start: 7 ZOffset: -1023 - active: hpad2 + active: + Filename: hpad2.shp Start: 1 Length: 6 Tick: 100 ZOffset: -1023 - damaged-active: hpad2 + damaged-active: + Filename: hpad2.shp Start: 8 Length: 6 Tick: 100 ZOffset: -1023 - dead: hpad2 + dead: + Filename: hpad2.shp Start: 14 ZOffset: -1023 Tick: 800 - make: hpad2make + make: + Filename: hpad2make.shp Length: * Tick: 80 - bib: bib3 - Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - icon: hpad2icnh + bib: + Filename: bib3.tem + TilesetFilenames: + SNOW: bib3.sno + DESERT: bib3.des + JUNGLE: bib3.jun + WINTER: bib3.win + BARREN: bib3.bar + Length: * + icon: + Filename: hpad2icnh.shp proc2: Inherits: ^StructureOverlays - idle: proc2 + idle: + Filename: proc2.shp Length: 6 Tick: 120 Offset: 2,4 - damaged-idle: proc2 + damaged-idle: + Filename: proc2.shp Start: 30 Length: 6 Tick: 120 Offset: 2,4 - dead: proc2 + dead: + Filename: proc2.shp Start: 60 Tick: 800 Offset: 2,4 - make: proc2make + make: + Filename: proc2make.shp Length: * Tick: 80 Offset: 2,4 - resources: proc2twr + resources: + Filename: proc2twr.shp Length: 6 Offset: -30,-17 - damaged-resources: proc2twr + damaged-resources: + Filename: proc2twr.shp Start: 6 Length: 6 Offset: -30,-17 - bib: bib2 - Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - icon: proc2icnh + bib: + Filename: bib2.tem + TilesetFilenames: + SNOW: bib2.sno + DESERT: bib2.des + JUNGLE: bib2.jun + WINTER: bib2.win + BARREN: bib2.bar + Length: * + icon: + Filename: proc2icnh.shp afldgdi: Inherits: ^StructureOverlays - idle: afldgdiidle + idle: + Filename: afldgdiidle.shp Length: 16 Tick: 160 ZOffset: -1023 Offset: 0,-4 - damaged-idle: afldgdiidle + damaged-idle: + Filename: afldgdiidle.shp Start: 16 Length: 8 Tick: 160 ZOffset: -1023 Offset: 0,-4 - active: afldgdi + active: + Filename: afldgdi.shp Length: 16 Tick: 160 ZOffset: -1023 Offset: 0,-4 - damaged-active: afldgdi + damaged-active: + Filename: afldgdi.shp Start: 16 Length: 8 Tick: 160 ZOffset: -1023 Offset: 0,-4 - make: afldgdimake + make: + Filename: afldgdimake.shp Length: * Offset: 0,-4 - bib: bib2 + bib: + Filename: bib2.tem + TilesetFilenames: + SNOW: bib2.sno + DESERT: bib2.des + JUNGLE: bib2.jun + WINTER: bib2.win + BARREN: bib2.bar Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT ZOffset: -1024 - icon: afldicon + icon: + Filename: afldgdiicnh.shp nodhq: Inherits: ^StructureOverlays - idle: nodhq + idle: + Filename: nodhq.shp Length: 16 Tick: 100 - damaged-idle: nodhq + damaged-idle: + Filename: nodhq.shp Start: 16 Length: 16 Tick: 100 - dead: nodhq + dead: + Filename: nodhq.shp Start: 32 - make: hqmake + Tick: 800 + make: + Filename: nodhqmake.shp Length: * Tick: 80 - bib: bib3 + bib: + Filename: bib3.tem + TilesetFilenames: + SNOW: bib3.sno + DESERT: bib3.des + JUNGLE: bib3.jun + WINTER: bib3.win + BARREN: bib3.bar Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - icon: hqicnh + icon: + Filename: hqicnh.shp + +nodhq.upg: + Inherits: ^StructureOverlays + idle: + Filename: nodhqupg.shp + Length: 16 + Tick: 100 + damaged-idle: + Filename: nodhqupg.shp + Start: 16 + Length: 16 + Tick: 100 + dead: + Filename: nodhqupg.shp + Start: 32 + Tick: 800 + make: + Filename: nodhqupgmake.shp + Length: * + Tick: 80 + bib: + Filename: bib3.tem + TilesetFilenames: + SNOW: bib3.sno + DESERT: bib3.des + JUNGLE: bib3.jun + WINTER: bib3.win + BARREN: bib3.bar + Length: * + icon: + Filename: nodhqupgicnh.shp nodnuke: Inherits: ^StructureOverlays - idle: nodnuke + idle: + Filename: nodnuke.shp Length: 4 Tick: 1000 - damaged-idle: nodnuke + damaged-idle: + Filename: nodnuke.shp Start: 4 Length: 4 Tick: 1000 - dead: nodnuke + dead: + Filename: nodnuke.shp Start: 8 - Tick: 1000 - make: nodnukemake + Tick: 800 + make: + Filename: nodnukemake.shp Length: * Tick: 80 - bib: bib3 - Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - icon: nukeicnh + bib: + Filename: bib3.tem + TilesetFilenames: + SNOW: bib3.sno + DESERT: bib3.des + JUNGLE: bib3.jun + WINTER: bib3.win + BARREN: bib3.bar + Length: * + icon: + Filename: nukeicnh.shp nodnuk2: Inherits: ^StructureOverlays - idle: nodnuk2 + idle: + Filename: nodnuk2.shp Length: 4 Tick: 1000 - damaged-idle: nodnuk2 + damaged-idle: + Filename: nodnuk2.shp Start: 4 Length: 4 Tick: 1000 - dead: nodnuk2 + dead: + Filename: nodnuk2.shp Start: 8 - make: nodnuk2make + Tick: 800 + make: + Filename: nodnuk2make.shp Length: * Tick: 80 - bib: bib3 - Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - icon: nuk2icnh + bib: + Filename: bib3.tem + TilesetFilenames: + SNOW: bib3.sno + DESERT: bib3.des + JUNGLE: bib3.jun + WINTER: bib3.win + BARREN: bib3.bar + Length: * + icon: + Filename: nuk2icnh.shp nodfact: Inherits: ^StructureOverlays - idle: nodfact + idle: + Filename: nodfact.shp Length: 4 Tick: 160 - build: nodfact + build: + Filename: nodfact.shp Start: 4 Length: 20 Tick: 100 - pdox: nodfact + pdox: + Filename: nodfact.shp Length: 4 Tick: 160 - damaged-idle: nodfact + damaged-idle: + Filename: nodfact.shp Start: 24 Length: 4 Tick: 160 - damaged-build: nodfact + damaged-build: + Filename: nodfact.shp Start: 28 Length: 20 Tick: 100 - damaged-pdox: nodfact + damaged-pdox: + Filename: nodfact.shp Start: 24 Length: 4 Tick: 160 - dead: nodfact + dead: + Filename: nodfact.shp Start: 48 - make: nodfactmake - Length: * - Tick: 80 - bib: bib2 - Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - icon: afacicon + Tick: 800 + make: + Filename: nodfactmake.shp + Length: * + Tick: 40 + bib: + Filename: bib2.tem + TilesetFilenames: + SNOW: bib2.sno + DESERT: bib2.des + JUNGLE: bib2.jun + WINTER: bib2.win + BARREN: bib2.bar + Length: * + icon: + Filename: afacicon.shp nodproc: Inherits: ^StructureOverlays - idle: nodproc + idle: + Filename: nodproc.shp Length: 6 Tick: 120 Offset: 2,4 - damaged-idle: nodproc + damaged-idle: + Filename: nodproc.shp Start: 30 Length: 6 Tick: 120 Offset: 2,4 - dead: nodproc + dead: + Filename: nodproc.shp Start: 60 Tick: 800 Offset: 2,4 - make: nodprocmake + make: + Filename: nodprocmake.shp Length: * Tick: 80 Offset: 2,4 - resources: proc2twr + resources: + Filename: proc2twr.shp Length: 6 Offset: -30,-17 - damaged-resources: proc2twr + damaged-resources: + Filename: proc2twr.shp Start: 6 Length: 6 Offset: -30,-17 - bib: bib2 - Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - icon: proc2icnh + bib: + Filename: bib2.tem + TilesetFilenames: + SNOW: bib2.sno + DESERT: bib2.des + JUNGLE: bib2.jun + WINTER: bib2.win + BARREN: bib2.bar + Length: * + icon: + Filename: proc2icnh.shp nodsilo: Inherits: ^StructureOverlays - idle: nodsilo + idle: + Filename: nodsilo.shp Offset: 0,-1 - damaged-idle: nodsilo + damaged-idle: + Filename: nodsilo.shp Start: 5 Offset: 0,-1 - dead: nodsilo + dead: + Filename: nodsilo.shp Start: 10 Offset: 0,-1 Tick: 800 - stages: nodsilo + stages: + Filename: nodsilo.shp Length: 5 Offset: 0,-1 - damaged-stages: nodsilo + damaged-stages: + Filename: nodsilo.shp Start: 5 Length: 5 Offset: 0,-1 - make: nodsilo2make + make: + Filename: nodsilo2make.shp Length: * Tick: 80 Offset: 0,-1 - bib: mbSILO - Length: * - UseTilesetExtension: true - TilesetOverrides: - BARREN: TEMPERAT - icon: silo2icnh + bib: + Filename: mbSILO.tem + TilesetFilenames: + SNOW: mbSILO.sno + INTERIOR: mbSILO.int + DESERT: mbSILO.des + JUNGLE: mbSILO.jun + WINTER: mbSILO.win + Length: * + icon: + Filename: silo2icnh.shp pris: Inherits: ^StructureOverlays - idle: pris + idle: + Filename: pris.shp Length: 32 Tick: 150 Offset: 0,-13 - damaged-idle: pris + damaged-idle: + Filename: pris.shp Start: 32 Length: 32 Tick: 150 Offset: 0,-13 - active: prisfire + active: + Filename: prisfire.shp Length: 5 Tick: 150 Offset: 0,-13 - damaged-active: prisfire + damaged-active: + Filename: prisfire.shp Start: 5 Length: 5 Tick: 150 Offset: 0,-13 - make: prismake + make: + Filename: prismake.shp Length: 9 Tick: 60 Offset: 0,-13 - bib: mbFTUR - Length: * - UseTilesetExtension: true - TilesetOverrides: - BARREN: TEMPERAT - icon: prisicon + bib: + Filename: mbFTUR.tem + TilesetFilenames: + SNOW: mbFTUR.sno + INTERIOR: mbFTUR.int + DESERT: mbFTUR.des + JUNGLE: mbFTUR.jun + WINTER: mbFTUR.win + Length: * + icon: + Filename: prisicon.shp spennod: Inherits: ^StructureOverlays - idle: spennod - damaged-idle: spennod + idle: + Filename: spennod.shp + damaged-idle: + Filename: spennod.shp Start: 1 - make: spennodmake + make: + Filename: spennodmake.shp Length: * - icon: spennodicnh + icon: + Filename: spennodicnh.shp htur: Inherits: ^StructureOverlays - idle: htur + idle: + Filename: empty.shp + damaged-idle: + Filename: empty.shp + turret: + Filename: htur.shp Facings: 32 UseClassicFacings: True Offset: 0,0 - damaged-idle: htur + damaged-turret: + Filename: htur.shp Start: 32 Facings: 32 UseClassicFacings: True Offset: 0,0 - make: hturmake + make: + Filename: hturmake.shp Length: * Offset: 0,0 Tick: 75 - muzzle: smokeygun + muzzle: + Filename: smokeygun.shp Length: 12 Tick: 30 Offset: 0,0 - bib: mbSAM + bib: + Filename: mbSAM.tem + TilesetFilenames: + SNOW: mbSAM.sno + INTERIOR: mbSAM.int + DESERT: mbSAM.des + JUNGLE: mbSAM.jun + WINTER: mbSAM.win Length: * Offset: 0,-5 - UseTilesetExtension: true - TilesetOverrides: - BARREN: TEMPERAT - icon: hturicon + icon: + Filename: hturicon.shp ttur: Inherits: ^StructureOverlays - idle: ttur + idle: + Filename: ttur.shp Offset: 0,-2 - damaged-idle: ttur + damaged-idle: + Filename: ttur.shp Start: 1 Offset: 0,-2 - make: tturmake + make: + Filename: tturmake.shp Length: * Offset: 0,-2 - bib: mbFTUR - Length: * - UseTilesetExtension: true - TilesetOverrides: - BARREN: TEMPERAT - icon: tturicon + bib: + Filename: mbFTUR.tem + TilesetFilenames: + SNOW: mbFTUR.sno + INTERIOR: mbFTUR.int + DESERT: mbFTUR.des + JUNGLE: mbFTUR.jun + WINTER: mbFTUR.win + Length: * + icon: + Filename: tturicon.shp sgen: Inherits: ^StructureOverlays - idle: sgen + idle: + Filename: sgen.shp Offset: 0,-10 - active: sgen + active: + Filename: sgen.shp Length: 4 Offset: 0,-10 - damaged-idle: sgen + damaged-idle: + Filename: sgen.shp Start: 4 Offset: 0,-10 - damaged-active: sgen + damaged-active: + Filename: sgen.shp Start: 4 Length: 4 Offset: 0,-10 - make: sgenmake + make: + Filename: sgenmake.shp Length: * Offset: 0,-10 - dead: sgen + dead: + Filename: sgen.shp Start: 4 Tick: 800 Offset: 0,-10 - bib: bib2 - Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - icon: sgenicnh + bib: + Filename: bib2.tem + TilesetFilenames: + SNOW: bib2.sno + DESERT: bib2.des + JUNGLE: bib2.jun + WINTER: bib2.win + BARREN: bib2.bar + Length: * + icon: + Filename: sgenicnh.shp cram: Inherits: ^StructureOverlays - idle: gunmake # Empty first frame (agunmake has no empty frames). We need WithSpriteBody for the make anim, and WSB needs at least a placeholder default sequence to work - make: agunmake + idle: # Empty first frame (agunmake has no empty frames). We need WithSpriteBody for the make anim, and WSB needs at least a placeholder default sequence to work + Filename: gunmake.shp + make: + Filename: crammake.shp Length: * Offset: 0,-13 turret: + Filename: cram.shp Facings: 32 UseClassicFacings: True Offset: 0,-13 - make: crammake + make: + Filename: crammake.shp Length: * Offset: 0,-13 - damaged-turret: cram + damaged-turret: + Filename: cram.shp Start: 32 Facings: 32 UseClassicFacings: True Offset: 0,-13 - muzzle: gunfire2 + muzzle: + Filename: gunfire2.shp Start: 1 Length: 4 - bib: mbAGUN + bib: + Filename: mbAGUN.tem + TilesetFilenames: + SNOW: mbAGUN.sno + INTERIOR: mbAGUN.int + DESERT: mbAGUN.des + WINTER: mbAGUN.win Length: * - UseTilesetExtension: true - TilesetOverrides: - JUNGLE: TEMPERAT - BARREN: TEMPERAT - icon: cramicnh + icon: + Filename: cramicnh.shp gsyrd: Inherits: ^StructureOverlays - idle: gsyrd - damaged-idle: gsyrd + idle: + Filename: gsyrd.shp + damaged-idle: + Filename: gsyrd.shp Start: 1 - make: gsyrdmake + make: + Filename: gsyrdmake.shp Length: * - icon: syrdicon - fake-icon: syrficon + icon: + Filename: gsyrdicnh.shp + fake-icon: + Filename: syrficon.shp indp: Inherits: ^StructureOverlays - idle: indp + idle: + Filename: indp.shp Length: 4 Tick: 200 - damaged-idle: indp + Offset: 0, -8 + damaged-idle: + Filename: indp.shp Start: 4 Length: 4 Tick: 200 - make: indpmake + Offset: 0, -8 + make: + Filename: indpmake.shp Length: * - dead: indp + Offset: 0, -8 + dead: + Filename: indp.shp Start: 4 Tick: 800 - bib: bib2 + Offset: 0, -8 + bib: + Filename: bib2.tem + TilesetFilenames: + SNOW: bib2.sno + DESERT: bib2.des + JUNGLE: bib2.jun + WINTER: bib2.win + BARREN: bib2.bar + Length: * + icon: + Filename: indpicon.shp + +cvat: + Inherits: ^StructureOverlays + idle: + Filename: cvat.shp + Length: 6 + Tick: 200 + damaged-idle: + Filename: cvat.shp + Start: 6 + Length: 6 + Tick: 200 + make: + Filename: cvatmk.shp + Length: * + dead: + Filename: cvat.shp + Start: 6 + Tick: 800 + bib: + Filename: bib3.tem + TilesetFilenames: + SNOW: bib3.sno + DESERT: bib3.des + JUNGLE: bib3.jun + WINTER: bib3.win + BARREN: bib3.bar Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - icon: indpicon + icon: + Filename: cvaticon.shp + +munp: + Inherits: ^StructureOverlays + idle: + Filename: munp.shp + Length: 6 + Tick: 200 + Offset: 0, -8 + damaged-idle: + Filename: munp.shp + Start: 6 + Length: 6 + Tick: 200 + Offset: 0, -8 + make: + Filename: munpmk.shp + Offset: 0, -8 + Length: * + dead: + Filename: munp.shp + Start: 6 + Tick: 800 + Offset: 0, -8 + bib: + Filename: bib2.tem + TilesetFilenames: + SNOW: bib2.sno + DESERT: bib2.des + JUNGLE: bib2.jun + WINTER: bib2.win + BARREN: bib2.bar + Length: * + icon: + Filename: munpicon.shp lasp: Inherits: ^StructureOverlays Defaults: Offset: 0, 0, 0 - UseTilesetCode: true - idle: lasp + idle: + Filename: lasp.shp Start: 0 Length: 5 Tick: 250 - idle-offline: lasp + idle-offline: + Filename: lasp.shp Start: 0 Length: 1 - damaged-idle: lasp + damaged-idle: + Filename: lasp.shp Start: 5 Length: 5 Tick: 250 - damaged-idle-offline: lasp + damaged-idle-offline: + Filename: lasp.shp Start: 5 Length: 1 - dead: lasp + dead: + Filename: lasp.shp Start: 10 Tick: 400 - make: laspmake + make: + Filename: laspmake.shp Length: * - icon: lasficnh + icon: + Filename: lasficnh.shp Offset: 0, 0 - UseTilesetCode: false lasf: Inherits: ^StructureOverlays - Defaults: - UseTilesetCode: true - idle: lasf + idle: + Filename: lasf.shp Length: 1 - disabled-x: lasf + disabled-x: + Filename: lasf.shp Start: 4 Length: 1 ZRamp: 1 - disabled-y: lasf + disabled-y: + Filename: lasf.shp Start: 9 Length: 1 ZRamp: 1 - enabled-x: lasf + enabled-x: + Filename: lasf.shp Frames: 3,3,1,1,3,3,1,3,3,1,0,0,2,2,0,0 Length: 9 - enabled-y: lasf + enabled-y: + Filename: lasf.shp Frames: 7,5,7,5,6,8,6,8,7,5,7,5,6,8,6,8 Length: 9 patr: Inherits: ^StructureOverlays - idle: patr + idle: + Filename: patr.shp Facings: 32 UseClassicFacings: True Offset: 0,0 - empty: patr-empty + empty: + Filename: patr-empty.shp Facings: 32 UseClassicFacings: True Offset: 0,0 - damaged-idle: patr + damaged-idle: + Filename: patr.shp Start: 32 Facings: 32 UseClassicFacings: True Offset: 0,0 - damaged-empty: patr-empty + damaged-empty: + Filename: patr-empty.shp Start: 32 Facings: 32 UseClassicFacings: True Offset: 0,0 - make: patrmake + make: + Filename: patrmake.shp Length: * Offset: 0,0 Tick: 75 - bib: mbSAM + bib: + Filename: mbSAM.tem + TilesetFilenames: + SNOW: mbSAM.sno + INTERIOR: mbSAM.int + DESERT: mbSAM.des + JUNGLE: mbSAM.jun + WINTER: mbSAM.win Length: * Offset: 0,5 - UseTilesetExtension: true - TilesetOverrides: - BARREN: TEMPERAT - icon: patricnh + icon: + Filename: patricnh.shp weat: Inherits: ^StructureOverlays - idle: weat - damaged-idle: weat + idle: + Filename: weat.shp + damaged-idle: + Filename: weat.shp Start: 1 - active: weat + active: + Filename: weat.shp Start: 2 Length: 1 Tick: 10000 - damaged-active: weat + damaged-active: + Filename: weat.shp Start: 3 Length: 1 Tick: 10000 - make: weatmake + make: + Filename: weatmake.shp Length: * - active-overlay: DATA.R8 - AddExtension: False + active-overlay: + Filename: DATA.R8 Start: 3947 Length: 17 Tick: 100 BlendMode: Additive ZOffset: 511 - bib: mbIRON + bib: + Filename: mbIRON.tem + TilesetFilenames: + SNOW: mbIRON.sno + INTERIOR: mbIRON.int + DESERT: mbIRON.des + WINTER: mbIRON.win Length: * Offset: 0,2 - UseTilesetExtension: true - TilesetOverrides: - JUNGLE: TEMPERAT - BARREN: TEMPERAT - icon: weaticon + icon: + Filename: weaticon.shp nmslo: Inherits: ^StructureOverlays - idle: nmslo - damaged-idle: nmslod - make: nmslomk + idle: + Filename: nmslo.shp + Offset: 0, -11 + damaged-idle: + Filename: nmslod.shp + Offset: 0, -11 + make: + Filename: nmslomk.shp Length: * - active: nmslo + Offset: 0, -11 + active: + Filename: nmslo.shp Length: 17 Tick: 80 - damaged-active: nmslod + Offset: 0, -11 + damaged-active: + Filename: nmslod.shp Length: 17 Tick: 80 - icon: nmsloicnh + Offset: 0, -11 + icon: + Filename: nmsloicnh.shp stwr: Inherits: ^StructureOverlays Defaults: Offset: 0,-13 - idle: stwr + idle: + Filename: empty.shp + damaged-idle: + Filename: empty.shp + turret: + Filename: stwr.shp Facings: 32 UseClassicFacings: True - make: stwrmake + make: + Filename: stwrmake.shp Length: * - damaged-idle: stwr + damaged-turret: + Filename: stwr.shp Start: 32 Facings: 32 UseClassicFacings: True - dead: stwr + dead: + Filename: stwr.shp Start: 64 - bib: mbFTUR + bib: + Filename: mbFTUR.tem + TilesetFilenames: + SNOW: mbFTUR.sno + DESERT: mbFTUR.des + JUNGLE: mbFTUR.jun + WINTER: mbFTUR.win Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - BARREN: TEMPERAT Offset: 0, 2 - icon: stwricon + icon: + Filename: stwricon.shp Offset: 0,0 tmpp: Inherits: ^StructureOverlays - idle: tmpp + idle: + Filename: tmpp.shp Length: 16 Tick: 200 - damaged-idle: tmpp + damaged-idle: + Filename: tmpp.shp Start: 16 Length: 16 Tick: 200 - dead: tmpp + dead: + Filename: tmpp.shp Start: 24 Tick: 800 - bib: bib2 + bib: + Filename: bib2.tem + TilesetFilenames: + SNOW: bib2.sno + DESERT: bib2.des + JUNGLE: bib2.jun + WINTER: bib2.win + BARREN: bib2.bar + Length: * + make: + Filename: tmppmake.shp + Length: * + icon: + Filename: tmppicnh.shp + +iok: + idle: + Filename: iok.shp + Offset: 0, 2 + holo: + Filename: iokholo.shp Length: * - UseTilesetExtension: true - TilesetOverrides: - INTERIOR: TEMPERAT - make: tmppmake + BlendMode: Additive + Alpha: 1 + Offset: 0, -11 + Tick: 80 + outline: + Filename: iokoutline.shp + BlendMode: Additive Length: * - icon: tmppicnh + Alpha: 0.3 + Offset: 0, -11 + make: + Filename: iok.shp + Length: 5 + Start: 1 + Tick: 80 + Offset: 0, 2 diff --git a/mods/ca/sequences/upgrades.yaml b/mods/ca/sequences/upgrades.yaml index c8e374db49..2262f25cd9 100644 --- a/mods/ca/sequences/upgrades.yaml +++ b/mods/ca/sequences/upgrades.yaml @@ -1,125 +1,435 @@ bombard.strat: - icon: strat-bombicnh + icon: + Filename: strat-bombicnh.shp bombard2.strat: - icon: strat-bomb2icnh + icon: + Filename: strat-bomb2icnh.shp + +bombard3.strat: + icon: + Filename: upgc-fstormicnh.shp seek.strat: - icon: strat-seekicnh + icon: + Filename: strat-seekicnh.shp seek2.strat: - icon: strat-seek2icnh + icon: + Filename: strat-seek2icnh.shp + +seek3.strat: + icon: + Filename: upgc-aradaricnh.shp hold.strat: - icon: strat-holdicnh + icon: + Filename: strat-holdicnh.shp hold2.strat: - icon: strat-hold2icnh + icon: + Filename: strat-hold2icnh.shp + +hold3.strat: + icon: + Filename: upgc-nshieldicnh.shp + +upgc.drop: + icon: + Filename: upgc-dzoneicnh.shp hypersonic.upgrade: - icon: upg-hypericnh + icon: + Filename: upg-hypericnh.shp hailstorm.upgrade: - icon: upg-hailicnh + icon: + Filename: upg-hailicnh.shp hammerhead.upgrade: - icon: upg-hammicnh + icon: + Filename: upg-hammicnh.shp sonic.upgrade: - icon: upg-sonicicnh + icon: + Filename: upg-sonicicnh.shp -drone.upgrade: - icon: upg-droneicon +bdrone.upgrade: + icon: + Filename: upg-bdroneicon.shp -pointlaser.upgrade: - icon: upg-pdlasericnh +mdrone.upgrade: + icon: + Filename: upg-mdroneicon.shp ionmam.upgrade: - icon: upg-ionmamicnh + icon: + Filename: upg-ionmamicnh.shp hovermam.upgrade: - icon: upg-hovermamicnh + icon: + Filename: upg-hovermamicnh.shp railgun.upgrade: - icon: upg-railgunicnh + icon: + Filename: upg-railgunicnh.shp vulcan.upgrade: - icon: upg-vulcicnh + icon: + Filename: upg-vulcicon.shp + +delp.upgrade: + icon: + Filename: upg-delpicon.shp empgren.upgrade: - icon: upg-empgrenicnh + icon: + Filename: upg-empgrenicnh.shp + +bjet.upgrade: + icon: + Filename: upg-bjeticon.shp + +thwk.upgrade: + icon: + Filename: upg-thwkicnh.shp + +tow.upgrade: + icon: + Filename: upg-towicon.shp + +abur.upgrade: + icon: + Filename: upg-aburicnh.shp + +gyro.upgrade: + icon: + Filename: upg-gyroicnh.shp + +pointdef.upgrade: + icon: + Filename: upg-pointdeficnh.shp hazmat.upgrade: - icon: upg-hazmicnh + icon: + Filename: upg-hazmicnh.shp + +flakarmor.upgrade: + icon: + Filename: upg-flakarmoricon.shp howi.upgrade: - icon: upg-howiicon + icon: + Filename: upg-howiicon.shp + +blacknapalm.upgrade: + icon: + Filename: upg-blacknapalmicon.shp microwave.upgrade: - icon: upg-microicnh + icon: + Filename: upg-microicnh.shp + +quantum.upgrade: + icon: + Filename: upg-quantumicon.shp tibcore.upgrade: - icon: upg-tibcoreicon + icon: + Filename: upg-tibcoreicnh.shp -cyborg.upgrade: - icon: upg-cyborgicnh +decoy.upgrade: + icon: + Filename: upg-decoyicon.shp -cyborgspeed.upgrade: - icon: upg-cyborgspeedicnh +avenger.upgrade: + icon: + Filename: upg-avengericon.shp + +sidewinders.upgrade: + icon: + Filename: upg-sidewindersicnh.shp + +ceramic.upgrade: + icon: + Filename: upg-ceramicicnh.shp cyborgarmor.upgrade: - icon: upg-cyborgarmoricnh + icon: + Filename: upg-cyborgarmoricnh.shp -tarc.upgrade: - icon: upg-tarcicon +covenant.upgrade: + icon: + Filename: upg-covenanticnh.shp -seismic.upgrade: - icon: upg-seisicon +cyborgdmg.upgrade: + icon: + Filename: upg-cyborgdmgicnh.shp -indp.upgrade: - icon: upg-indpicon +cyborgprod.upgrade: + icon: + Filename: upg-cyborgprodicnh.shp -v2.upgrade: - icon: upg-v2rlicon +cyborgspeed.upgrade: + icon: + Filename: upg-cyborgspeedicnh.shp + +tarc.upgrade: + icon: + Filename: upg-tarcicon.shp + +seismic.upgrade: + icon: + Filename: upg-seisicon.shp hazmats.upgrade: - icon: upg-hazmatsoviet + icon: + Filename: upg-hazmatsoviet.shp -iraqtank.upgrade: - icon: upg-iraqicon +atomicengines.upgrade: + icon: + Filename: upg-atomicengicon.shp lasher.upgrade: - icon: upg-lashericon + icon: + Filename: upg-lashericon.shp + +gattling.upgrade: + icon: + Filename: upg-gattlingicon.shp + +ttrp.upgrade: + icon: + Filename: upg-ttrpicon.shp + +deso.upgrade: + icon: + Filename: upg-desoicon.shp + +tdog.upgrade: + icon: + Filename: upg-tdogicon.shp -orep.upgrade: - icon: upg-orepicon +erad.upgrade: + icon: + Filename: upg-eradicon.shp charv.upgrade: - icon: upg-charvicon + icon: + Filename: upg-charvicon.shp + +sharv.upgrade: + icon: + Filename: upg-sharvicon.shp pcan.upgrade: - icon: upg-pcanicon + icon: + Filename: upg-pcanicon.shp regen.upgrade: - icon: upg-hullregenicon + icon: + Filename: upg-hullregenicon.shp shields.upgrade: - icon: upg-fleetshieldsicon + icon: + Filename: upg-fleetshieldsicon.shp + +blink.upgrade: + icon: + Filename: upg-blinkicon.shp + +shrw.upgrade: + icon: + Filename: upg-shrwicon.shp advart.upgrade: - icon: upg-advarticon + icon: + Filename: upg-advarticon.shp + +stellar.upgrade: + icon: + Filename: upg-stellaricon.shp + +coalescence.upgrade: + icon: + Filename: upg-coalescenceicon.shp + +carapace.upgrade: + icon: + Filename: upg-carapaceicon.shp resconv.upgrade: - icon: upg-resconvicon + icon: + Filename: upg-resconvicon.shp + +greece.coalition: + icon: + Filename: upg-greicon.shp + +korea.coalition: + icon: + Filename: upg-koricon.shp + +sweden.coalition: + icon: + Filename: upg-sweicon.shp -cryr.upgrade: - icon: upg-cryricon +cryw.upgrade: + icon: + Filename: upg-crywicon.shp + +optics.upgrade: + icon: + Filename: upg-advopticsicon.shp + +entrench.upgrade: + icon: + Filename: upg-entrenchicon.shp + +airborne.upgrade: + icon: + Filename: upg-airborneicon.shp apb.upgrade: - icon: upg-apbicon + icon: + Filename: upg-apbicon.shp ioncon.upgrade: - icon: upg-ionconicon + icon: + Filename: upg-ionconicon.shp tflx.upgrade: - icon: upg-tflxicon \ No newline at end of file + icon: + Filename: upg-tflxicon.shp + +strategic.upgrade: + icon: + Filename: upg-strategicicnh.shp + +hyper.upgrade: + icon: + Filename: upg-hypericon.shp + +lastnk.upgrade: + icon: + Filename: upg-lastnkicon.shp + +evis.upgrade: + icon: + Filename: upg-evisicon.shp + +impl.upgrade: + icon: + Filename: upg-implicon.shp + +stlk.upgrade: + icon: + Filename: upg-stlkicon.shp + +loyalist.allegiance: + icon: + Filename: upg-loyalisticon.shp + +rebel.allegiance: + icon: + Filename: upg-rebelicon.shp + +malefic.allegiance: + icon: + Filename: upg-maleficicon.shp + +allegiance.upgrade: + icon: + Filename: upg-allegianceicon.shp + +infantry.doctrine: + icon: + Filename: upg-infdoctrineicon.shp + +armor.doctrine: + icon: + Filename: upg-armordoctrineicon.shp + +arty.doctrine: + icon: + Filename: upg-artydoctrineicon.shp + +ovld.upgrade: + icon: + Filename: upg-ovldicon.shp + +apoc.upgrade: + icon: + Filename: upg-apocicon.shp + +nukc.upgrade: + icon: + Filename: upg-nukcicon.shp + +doctrine.upgrade1: + icon: + Filename: upg-doctrine1icon.shp + +doctrine.upgrade2: + icon: + Filename: upg-doctrine2icon.shp + +imppara.upgrade: + icon: + Filename: upg-impparaicon.shp + +impstorm.upgrade: + icon: + Filename: upg-impstormicon.shp + +impmuta.upgrade: + icon: + Filename: upg-impmutaicon.shp + +reactive.upgrade: + icon: + Filename: upg-eraicon.shp + +rocketpods.upgrade: + icon: + Filename: upg-rocketpodsicon.shp + +hstk.upgrade: + icon: + Filename: upg-hstkicon.shp + +wrath.covenant: + icon: + Filename: upg-wrathicnh.shp + +unity.covenant: + icon: + Filename: upg-unityicnh.shp + +zeal.covenant: + icon: + Filename: upg-zealicnh.shp + +economy.policy: + icon: + Filename: upg-economypolicyicon.shp + +defense.policy: + icon: + Filename: upg-defensepolicyicon.shp + +development.policy: + icon: + Filename: upg-devpolicyicon.shp + +timeskip: + icon: + Filename: timeskipicon.shp + +cust.upgrade: + icon: + Filename: upg-custicon.shp + +rbug.upgrade: + icon: + Filename: upg-rbugicon.shp diff --git a/mods/ca/sequences/vehicles.yaml b/mods/ca/sequences/vehicles.yaml index b8cda9b7b5..b7bdb8d9ee 100644 --- a/mods/ca/sequences/vehicles.yaml +++ b/mods/ca/sequences/vehicles.yaml @@ -1,58 +1,71 @@ ^VehicleOverlays: - emp-overlay: emp_fx01 + emp-overlay: + Filename: emp_fx01.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 - chrono-overlay: chronofade + chrono-overlay: + Filename: chronofade.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 - mind-overlay: mindanim + mind-overlay: + Filename: mindanim.shp Length: * Tick: 200 BlendMode: Alpha Offset: 0, 0 + ZOffset: 1024 + mcv: Inherits: ^VehicleOverlays - idle: mcv + idle: + Filename: mcv.shp Facings: 32 UseClassicFacings: True - icon: mcvicon + icon: + Filename: mcvicon.shp mcvhusk: Inherits: ^VehicleOverlays - idle: mcvhusk + idle: + Filename: mcvhusk.shp Facings: 32 UseClassicFacings: True ZOffset: -1023 truk: Inherits: ^VehicleOverlays - idle: truk + idle: + Filename: truk.shp Facings: 32 UseClassicFacings: True - icon: trukicon + icon: + Filename: trukicon.shp harv: Inherits: ^VehicleOverlays - idle: harv + idle: + Filename: harv.shp Facings: 32 UseClassicFacings: True - harvest: harv + harvest: + Filename: harv.shp Start: 32 Length: 8 Facings: 8 - dock: harv + dock: + Filename: harv.shp Start: 96 Length: 8 - dock-loop: harv + dock-loop: + Filename: harv.shp Start: 104 Length: 7 - icon: harvicon + icon: + Filename: harvicon.shp harvempty: Inherits: harv @@ -62,65 +75,80 @@ harvhalf: hhusk: Inherits: ^VehicleOverlays - idle: hhusk + idle: + Filename: hhusk.shp Facings: 32 UseClassicFacings: True ZOffset: -1023 hhusk2: Inherits: ^VehicleOverlays - idle: hhusk2 + idle: + Filename: hhusk2.shp Facings: 32 UseClassicFacings: True ZOffset: -1023 charv: Inherits: ^VehicleOverlays - idle: charv + idle: + Filename: charv.shp Facings: 32 UseClassicFacings: True - harvest: charv + harvest: + Filename: charv.shp Start: 32 Length: 8 Facings: 8 - dock: charv + dock: + Filename: charv.shp Start: 96 Length: 8 - dock-loop: charv + dock-loop: + Filename: charv.shp Start: 104 Length: 7 - icon: charvicon + icon: + Filename: charvicon.shp charv.destroyed: Inherits: ^VehicleOverlays - idle: charv + idle: + Filename: charv.shp Facings: 32 UseClassicFacings: True ZOffset: -512 1tnk: Inherits: ^VehicleOverlays - idle: 1tnk + idle: + Filename: 1tnk.shp Facings: 32 UseClassicFacings: True - idle-water: 1tnkwater + idle-water: + Filename: 1tnkwater.shp Facings: 32 UseClassicFacings: True - turret: 1tnk + turret: + Filename: 1tnk.shp Start: 32 Facings: 32 UseClassicFacings: True - muzzle: gunfire2 + muzzle: + Filename: gunfire2.shp Length: 2 - icon: 1tnkicon + icon: + Filename: 1tnkicon.shp 1tnk.destroyed: Inherits: ^VehicleOverlays - idle: 1tnk + idle: + Filename: 1tnk.shp Facings: 32 UseClassicFacings: True ZOffset: -512 - turret: 1tnk + turret: + Filename: 1tnk.shp Start: 32 Facings: 32 UseClassicFacings: True @@ -128,50 +156,95 @@ charv.destroyed: 2tnk: Inherits: ^VehicleOverlays - idle: 2tnk + idle: + Filename: 2tnk.shp + Facings: 32 + UseClassicFacings: True + turret: + Filename: 2tnk.shp + Start: 32 + Facings: 32 + UseClassicFacings: True + muzzle: + Filename: gunfire2.shp + Length: 5 + icon: + Filename: 2tnkicon.shp + +gtnk: + Inherits: ^VehicleOverlays + idle: + Filename: gtnk.shp Facings: 32 UseClassicFacings: True - turret: 2tnk + turret: + Filename: 2tnk.shp Start: 32 Facings: 32 UseClassicFacings: True - muzzle: gunfire2 + muzzle: + Filename: gunfire2.shp Length: 5 - icon: 2tnkicon + icon: + Filename: gtnkicon.shp mtnk.gdi.chrono: Inherits: ^VehicleOverlays - idle: 2tnk + idle: + Filename: 2tnk.shp Facings: 32 UseClassicFacings: True - turret: mtnk + turret: + Filename: mtnk.shp Start: 32 Facings: 32 UseClassicFacings: True - muzzle: gunfire2 + muzzle: + Filename: gunfire2.shp Length: 5 - icon: mtnkicnh + icon: + Filename: mtnkicnh.shp mtnk.nod.chrono: Inherits: ^VehicleOverlays - idle: 2tnk + idle: + Filename: 2tnk.shp Facings: 32 UseClassicFacings: True - turret: mtnknod + turret: + Filename: mtnknod.shp Start: 32 Facings: 32 UseClassicFacings: True - muzzle: gunfire2 + muzzle: + Filename: gunfire2.shp Length: 5 - icon: mtnkicnh + icon: + Filename: mtnkicnh.shp 2tnk.destroyed: Inherits: ^VehicleOverlays - idle: 2tnk + idle: + Filename: 2tnk.shp + Facings: 32 + UseClassicFacings: True + ZOffset: -512 + turret: + Filename: 2tnk.shp + Start: 32 + Facings: 32 + UseClassicFacings: True + ZOffset: -512 + +gtnk.destroyed: + Inherits: ^VehicleOverlays + idle: + Filename: gtnk.shp Facings: 32 UseClassicFacings: True ZOffset: -512 - turret: 2tnk + turret: + Filename: 2tnk.shp Start: 32 Facings: 32 UseClassicFacings: True @@ -179,63 +252,102 @@ mtnk.nod.chrono: 3tnk: Inherits: ^VehicleOverlays - idle: 3tnk + idle: + Filename: 3tnk.shp Facings: 32 UseClassicFacings: True - idle2: 3tnki + idle2: + Filename: 3tnki.shp Facings: 32 UseClassicFacings: True - idle3: 3tnky + idle3: + Filename: 3tnky.shp Facings: 32 UseClassicFacings: True - turret: 3tnk + turret: + Filename: 3tnk.shp Start: 32 Facings: 32 UseClassicFacings: True - turret2: 3tnky + turret2: + Filename: 3tnky.shp Start: 32 Facings: 32 UseClassicFacings: True - muzzle: gunfire2 + muzzle: + Filename: gunfire2.shp Length: 5 - icon: 3tnkicon + icon: + Filename: 3tnkicon.shp 3tnki: Inherits: ^VehicleOverlays - idle: 3tnki + idle: + Filename: 3tnki.shp Facings: 32 UseClassicFacings: True - turret: 3tnk + turret: + Filename: 3tnk.shp Start: 32 Facings: 32 UseClassicFacings: True - muzzle: gunfire2 + muzzle: + Filename: gunfire2.shp Length: 5 - icon: 3tnkiicon + icon: + Filename: 3tnkiicon.shp 3tnky: Inherits: ^VehicleOverlays - idle: 3tnky + idle: + Filename: 3tnky.shp + Facings: 32 + UseClassicFacings: True + idle2: + Filename: 3tnki.shp + Facings: 32 + UseClassicFacings: True + turret: + Filename: 3tnky.shp + Start: 32 + Facings: 32 + UseClassicFacings: True + muzzle: + Filename: gunfire2.shp + Length: 5 + icon: + Filename: 3tnkyicon.shp + +3tnkay: + Inherits: ^VehicleOverlays + idle: + Filename: 3tnky.shp Facings: 32 UseClassicFacings: True - idle2: 3tnky + idle2: + Filename: 3tnkay.shp Facings: 32 UseClassicFacings: True - turret: 3tnky + turret: + Filename: 3tnky.shp Start: 32 Facings: 32 UseClassicFacings: True - muzzle: gunfire2 + muzzle: + Filename: gunfire2.shp Length: 5 - icon: 3tnkyicon + icon: + Filename: 3tnkayicon.shp 3tnk.destroyed: Inherits: ^VehicleOverlays - idle: 3tnk + idle: + Filename: 3tnk.shp Facings: 32 UseClassicFacings: True ZOffset: -512 - turret: 3tnk + turret: + Filename: 3tnk.shp Start: 32 Facings: 32 UseClassicFacings: True @@ -243,261 +355,404 @@ mtnk.nod.chrono: 3tnky.destroyed: Inherits: 3tnky - idle: 3tnky + idle: + Filename: 3tnky.shp ZOffset: -512 - turret: 3tnky + turret: + Filename: 3tnky.shp Start: 32 ZOffset: -512 4tnk: Inherits: ^VehicleOverlays - idle: 4tnk + idle: + Filename: 4tnk.shp Facings: 32 UseClassicFacings: True - idle2: 4tnki + idle2: + Filename: 4tnki.shp Facings: 32 UseClassicFacings: True - turret: 4tnk + turret: + Filename: 4tnk.shp Start: 32 Facings: 32 UseClassicFacings: True - turret2: 4tnki + turret2: + Filename: 4tnki.shp Start: 32 Facings: 32 UseClassicFacings: True - muzzle: gunfire2 + muzzle: + Filename: gunfire2.shp Length: 5 - icon: 4tnkicon + icon: + Filename: 4tnkicon.shp 4tnki: Inherits: ^VehicleOverlays - idle: 4tnki + idle: + Filename: 4tnki.shp Facings: 32 UseClassicFacings: True - turret: 4tnki + turret: + Filename: 4tnki.shp Start: 32 Facings: 32 UseClassicFacings: True - muzzle: gunfire2 + muzzle: + Filename: gunfire2.shp Length: 5 - icon: 4tnkiicon + icon: + Filename: 4tnkiicon.shp + +4tnkerad: + Inherits: ^VehicleOverlays + idle: + Filename: 4tnk.shp + Facings: 32 + UseClassicFacings: True + turret: + Filename: 4tnkerad.shp + Facings: 32 + UseClassicFacings: True + muzzle: + Filename: radhitsm.shp + IgnoreWorldTint: true + BlendMode: Additive + Length: * + icon: + Filename: 4tnkeradicon.shp + +4tnkeradi: + Inherits: ^VehicleOverlays + idle: + Filename: 4tnki.shp + Facings: 32 + UseClassicFacings: True + turret: + Filename: 4tnkerad.shp + Facings: 32 + UseClassicFacings: True + muzzle: + Filename: radhitsm.shp + IgnoreWorldTint: true + BlendMode: Additive + Length: * + icon: + Filename: 4tnkeradiicon.shp 4tnk.destroyed: Inherits: ^VehicleOverlays - idle: 4tnk + idle: + Filename: 4tnk.shp Facings: 32 UseClassicFacings: True ZOffset: -512 - turret: 4tnk + turret: + Filename: 4tnk.shp Start: 32 Facings: 32 UseClassicFacings: True ZOffset: -512 +4tnkerad.destroyed: + Inherits: ^VehicleOverlays + idle: + Filename: 4tnk.shp + Facings: 32 + UseClassicFacings: True + ZOffset: -512 + turret: + Filename: 4tnkerad.shp + Facings: 32 + UseClassicFacings: True + ZOffset: -512 + v2rl: Inherits: ^VehicleOverlays - idle: v2rl + idle: + Filename: v2rl.shp Facings: 32 UseClassicFacings: True - empty-idle: v2rl + empty-idle: + Filename: v2rl.shp Start: 32 Facings: 32 UseClassicFacings: True - aim: v2rl + aim: + Filename: v2rl.shp Facings: 32 UseClassicFacings: True - empty-aim: v2rl + empty-aim: + Filename: v2rl.shp Start: 32 Facings: 32 UseClassicFacings: True - icon: v2rlicon + icon: + Filename: v2rlicon.shp arty: Inherits: ^VehicleOverlays - idle: arty + idle: + Filename: arty.shp Facings: 32 UseClassicFacings: True - muzzle: smokeygun + muzzle: + Filename: smokeygun.shp Length: 12 Tick: 30 - move: arty + move: + Filename: arty.shp Facings: 32 Length: 1 UseClassicFacings: True - icon: artyicon + icon: + Filename: artyicon.shp artynod: Inherits: ^VehicleOverlays - idle: artynod + idle: + Filename: artynod.shp Facings: 32 UseClassicFacings: True - muzzle: smokeygun + muzzle: + Filename: smokeygun.shp Length: 12 Tick: 30 - icon: artyicnh + icon: + Filename: artyicnh.shp howi: Inherits: ^VehicleOverlays - idle: howi + idle: + Filename: howi.shp Facings: 32 UseClassicFacings: True - turret: howi + turret: + Filename: howi.shp Start: 32 Facings: 32 UseClassicFacings: True - muzzle: smokeygun + muzzle: + Filename: smokeygun.shp Length: 12 Tick: 30 - icon: howiicnh + icon: + Filename: howiicnh.shp jeep: Inherits: ^VehicleOverlays - idle: jeep + idle: + Filename: jeep.shp Facings: 32 UseClassicFacings: True - turret: jeep + turret: + Filename: jeep.shp Start: 32 Facings: 32 UseClassicFacings: True - muzzle: minigun16 + muzzle: + Filename: minigun16.shp Length: 6 Facings: 16 - icon: jeepicon + icon: + Filename: jeepicon.shp apc: Inherits: ^VehicleOverlays - idle: apc + idle: + Filename: apc.shp Facings: 32 UseClassicFacings: True - muzzle: minigun16 - Length: 6 - Facings: 16 - turret: jeep - Start: 32 + idle-upg: + Filename: delp.shp Facings: 32 UseClassicFacings: True - open: apc + muzzle: + Filename: minigun16.shp + Length: 6 + Facings: 16 + open: + Filename: apc.shp Start: 32 Length: 3 - unload: apc + unload: + Filename: apc.shp Start: 32 - icon: apcicon + icon: + Filename: apcicon.shp + +delp: + Inherits: apc + idle: + Filename: delp.shp + Facings: 32 + UseClassicFacings: True + turret: + Filename: delptur.shp + Facings: 32 + UseClassicFacings: True + icon: + Filename: delpicon.shp apc.destroyed: Inherits: ^VehicleOverlays - idle: apc + idle: + Filename: apc.shp Facings: 32 UseClassicFacings: True - muzzle: minigun16 + muzzle: + Filename: minigun16.shp Length: 6 Facings: 16 - turret: jeep + turret: + Filename: jeep.shp Start: 32 Facings: 32 UseClassicFacings: True mnly: Inherits: ^VehicleOverlays - idle: mnly + idle: + Filename: mnly.shp Facings: 32 UseClassicFacings: True - icon: mnlyicon + icon: + Filename: mnlyicon.shp mrj: Inherits: ^VehicleOverlays - idle: mrj + idle: + Filename: mrj.shp Facings: 32 UseClassicFacings: True - spinner: mrj + spinner: + Filename: mrj.shp Start: 32 Length: 32 - icon: mrjicon + jamsignal: + Filename: jamsignal.shp + Length: * + BlendMode: Alpha + Alpha: 0.3 + icon: + Filename: mrjicon.shp mgg: Inherits: ^VehicleOverlays - idle: mgg + idle: + Filename: mgg.shp Facings: 32 UseClassicFacings: True - spinner: mgg + spinner: + Filename: mgg.shp Start: 32 Length: 8 - spinner-idle: mgg + spinner-idle: + Filename: mgg.shp Start: 32 Length: 1 - icon: mggicon + muzzle: + Filename: gapmuzzle.shp + Frames: 7,8,9,10,11,12,13,14,15,16,17,18 + BlendMode: Subtractive + Tick: 60 + Length: * + ZOffset: 2048 + icon: + Filename: mggicon.shp mgg.destroyed: Inherits: ^VehicleOverlays - idle: mgg + idle: + Filename: mgg.shp Facings: 32 UseClassicFacings: True ZOffset: -512 - spinner: mgg + spinner: + Filename: mgg.shp Start: 32 Length: 8 ZOffset: -512 - spinner-idle: mgg + spinner-idle: + Filename: mgg.shp Start: 32 msg: Inherits: ^VehicleOverlays - idle: msg + idle: + Filename: msg.shp Facings: 32 UseClassicFacings: True - make: msg + make: + Filename: msg.shp Start: 32 Length: 10 Tick: 80 - idle-deployed: msg + idle-deployed: + Filename: msg.shp Frames: 42,43,44,45,46,47,48,48,47,46,45,44,43,42 Length: 14 Tick: 120 - icon: msgicon + icon: + Filename: msgicon.shp msg.destroyed: Inherits: ^VehicleOverlays - idle: msg + idle: + Filename: msg.shp Facings: 32 UseClassicFacings: True ZOffset: -512 ttra: Inherits: ^VehicleOverlays - idle: ttnk + idle: + Filename: ttnk.shp Facings: 32 UseClassicFacings: True - spinner: ttnk + spinner: + Filename: ttnk.shp Start: 32 Length: 32 - icon: ttraicon + icon: + Filename: ttraicon.shp ttra.destroyed: Inherits: ^VehicleOverlays - idle: ttnk + idle: + Filename: ttnk.shp Facings: 32 UseClassicFacings: True ZOffset: -512 ttnk: Inherits: ^VehicleOverlays - idle: ttnk2 + idle: + Filename: ttnk2.shp Facings: 32 UseClassicFacings: True - turret: ttnk2 + turret: + Filename: ttnk2.shp Start: 32 Facings: 32 UseClassicFacings: True - muzzle: litningmuzzle + muzzle: + Filename: litningmuzzle.shp Length: 8 - icon: ttnk2icon + icon: + Filename: ttnk2icon.shp ttnk.destroyed: Inherits: ^VehicleOverlays - idle: ttnk2 + idle: + Filename: ttnk2.shp Facings: 32 UseClassicFacings: True ZOffset: -512 - turret: ttnk2 + turret: + Filename: ttnk2.shp Start: 32 Facings: 32 UseClassicFacings: True @@ -505,156 +760,207 @@ ttnk.destroyed: dtrk: Inherits: ^VehicleOverlays - idle: dtrk + idle: + Filename: dtrk.shp Facings: 32 UseClassicFacings: True - icon: dtrkicon + icon: + Filename: dtrkicon.shp ctnk: Inherits: ^VehicleOverlays - idle: ctnk + idle: + Filename: ctnk.shp Facings: 32 UseClassicFacings: True - muzzle: gunfire2 + muzzle: + Filename: gunfire2.shp Length: 5 - icon: ctnkicon + icon: + Filename: ctnkicon.shp qtnk: Inherits: ^VehicleOverlays - idle: qtnk + idle: + Filename: qtnk.shp Facings: 32 UseClassicFacings: True - piston: qtnk + piston: + Filename: qtnk.shp Start: 32 Facings: 8 Length: 8 - icon: qtnkicon + icon: + Filename: qtnkicon.shp apc2: Inherits: ^VehicleOverlays - idle: apc2 + idle: + Filename: apc2.shp Facings: 32 UseClassicFacings: True - muzzle: minigun16 + muzzle: + Filename: minigun16.shp Length: 6 Facings: 16 - turret: hmmv + turret: + Filename: hmmv.shp Start: 32 Facings: 32 UseClassicFacings: True - turret2: vulc + turret2: + Filename: vulc.shp Facings: 32 UseClassicFacings: True - turret2-ground: vulc + turret2-ground: + Filename: vulc.shp Start: 32 Facings: 32 UseClassicFacings: True - open: apc2 + open: + Filename: apc2.shp Start: 32 Length: 3 - unload: apc2 + unload: + Filename: apc2.shp Start: 35 Length: 3 - icon: apc2icnh + icon: + Filename: apc2icnh.shp apc2.nod: Inherits: ^VehicleOverlays - idle: apc2 + idle: + Filename: apc2.shp Facings: 32 UseClassicFacings: True - muzzle: minigun16 + muzzle: + Filename: minigun16.shp Length: 6 Facings: 16 - turret: hmmv + turret: + Filename: hmmv.shp Start: 32 Facings: 32 UseClassicFacings: True - turret2: vulc + turret2: + Filename: vulc.shp Facings: 32 UseClassicFacings: True - turret2-ground: vulc + turret2-ground: + Filename: vulc.shp Start: 32 Facings: 32 UseClassicFacings: True - open: apc2 + open: + Filename: apc2.shp Start: 32 Length: 3 - unload: apc2 + unload: + Filename: apc2.shp Start: 35 Length: 3 - icon: apc2nodicnh + icon: + Filename: apc2nodicnh.shp apc2.destroyed: Inherits: ^VehicleOverlays - idle: apc2 + idle: + Filename: apc2.shp Facings: 32 UseClassicFacings: True - turret: jeep + turret: + Filename: jeep.shp Start: 32 Facings: 32 UseClassicFacings: True vulc: Inherits: ^VehicleOverlays - idle: apc2 + idle: + Filename: apc2.shp Facings: 32 UseClassicFacings: True - muzzle: minigun16 + muzzle: + Filename: minigun16big.shp + Length: 6 + Facings: 16 + muzzle-huge: + Filename: minigun16huge.shp Length: 6 Facings: 16 - turret: vulc + turret: + Filename: vulc.shp Facings: 32 UseClassicFacings: True - turret-ground: vulc + turret-ground: + Filename: vulc.shp Start: 32 Facings: 32 UseClassicFacings: True - open: apc2 + open: + Filename: apc2.shp Start: 32 Length: 3 - unload: apc2 + unload: + Filename: apc2.shp Start: 35 Length: 3 - icon: vulcicnh + icon: + Filename: vulcicnh.shp amcv: Inherits: ^VehicleOverlays - idle: amcv + idle: + Filename: amcv.shp Facings: 32 UseClassicFacings: True - icon: amcvicnh + icon: + Filename: amcvicnh.shp amcv.destroyed: Inherits: ^VehicleOverlays - idle: amcv + idle: + Filename: amcv.shp Facings: 32 UseClassicFacings: True ZOffset: -1023 hmmv: Inherits: ^VehicleOverlays - idle: hmmv + idle: + Filename: hmmv.shp Facings: 32 UseClassicFacings: True - turret: hmmv + turret: + Filename: hmmv.shp Start: 32 Facings: 32 UseClassicFacings: True - muzzle: minigun16 + turrettow: + Filename: hmmvtow.shp + Facings: 32 + UseClassicFacings: True + muzzle: + Filename: minigun16.shp Length: 6 Facings: 16 - unload: hmmv + unload: + Filename: hmmv.shp Facings: 32 UseClassicFacings: True - icon: jeepicnh + icon: + Filename: jeepicnh.shp hmmv.destroyed: Inherits: ^VehicleOverlays - idle: hmmv + idle: + Filename: hmmv.shp Facings: 32 UseClassicFacings: True ZOffset: -512 - turret: hmmv + turret: + Filename: hmmv.shp Start: 32 Facings: 32 UseClassicFacings: True @@ -662,99 +968,155 @@ hmmv.destroyed: gdrn: Inherits: ^VehicleOverlays - idle: gdrn + idle: + Filename: gdrn.shp Facings: 32 UseClassicFacings: True - turret: gdrn + turret: + Filename: gdrn.shp Start: 32 Facings: 32 UseClassicFacings: True - muzzle: minigun16 + turrettow: + Filename: gdrn.shp + Start: 64 + Facings: 32 + UseClassicFacings: True + muzzle: + Filename: minigun16.shp Length: 6 Facings: 16 - icon: gdrnicon + icon: + Filename: gdrnicon.shp bggy: Inherits: ^VehicleOverlays - idle: bggy + idle: + Filename: bggy.shp Facings: 32 UseClassicFacings: True - turret: bggy + turret: + Filename: bggy.shp Start: 32 Facings: 32 UseClassicFacings: True - muzzle: minigun16 + muzzle: + Filename: minigun16.shp Length: 6 Facings: 16 - unload: bggy + unload: + Filename: bggy.shp Facings: 32 UseClassicFacings: True - icon: bggyicnh + icon: + Filename: bggyicnh.shp bggy.destroyed: Inherits: ^VehicleOverlays - idle: bggy + idle: + Filename: bggy.shp Facings: 32 UseClassicFacings: True ZOffset: -512 - turret: bggy + turret: + Filename: bggy.shp Start: 32 Facings: 32 UseClassicFacings: True ZOffset: -512 +rbug: + Inherits: ^VehicleOverlays + idle: + Filename: rbug.shp + Facings: 32 + UseClassicFacings: True + turret: + Filename: rbug.shp + Start: 32 + Facings: 32 + UseClassicFacings: True + muzzle: + Filename: lasermuzzle.shp + Length: * + icon: + Filename: rbugicnh.shp + mtnk: Inherits: ^VehicleOverlays - idle: mtnk + idle: + Filename: mtnk.shp Facings: 32 UseClassicFacings: True - turret: mtnk + turret: + Filename: mtnk.shp Start: 32 Facings: 32 UseClassicFacings: True - turretpd: mtnk + turretpd: + Filename: mtnk.shp Start: 64 Facings: 32 UseClassicFacings: True - turret2: dronet + turretlas: + Filename: mtnknod.shp + Start: 64 Facings: 32 UseClassicFacings: True - muzzle: gunfire2 + muzzle: + Filename: gunfire2.shp Length: 5 - icon: mtnkicnh + muzzlelas: + Filename: lasermuzzle.shp + Length: * + icon: + Filename: mtnkicnh.shp mtnk.nod: Inherits: ^VehicleOverlays - idle: mtnknod + idle: + Filename: mtnknod.shp Facings: 32 UseClassicFacings: True - turret: mtnknod + turret: + Filename: mtnknod.shp Start: 32 Facings: 32 UseClassicFacings: True - turretpd: mtnk + turretpd: + Filename: mtnk.shp Start: 64 Facings: 32 UseClassicFacings: True - turret2: dronet + turretlas: + Filename: mtnknod.shp + Start: 64 Facings: 32 UseClassicFacings: True - muzzle: gunfire2 + muzzle: + Filename: gunfire2.shp Length: 5 - icon: mtnknodicnh + muzzlelas: + Filename: lasermuzzle.shp + Length: * + icon: + Filename: mtnknodicnh.shp mtnk.destroyed: Inherits: ^VehicleOverlays - idle: mtnk + idle: + Filename: mtnk.shp Facings: 32 UseClassicFacings: True ZOffset: -512 - turret: mtnk + turret: + Filename: mtnk.shp Start: 32 Facings: 32 UseClassicFacings: True ZOffset: -512 - turretpd: mtnk + turretpd: + Filename: mtnk.shp Start: 64 Facings: 32 UseClassicFacings: True @@ -762,167 +1124,218 @@ mtnk.destroyed: drone: Inherits: ^VehicleOverlays - idle: mtnk + idle: + Filename: mtnk.shp Facings: 32 UseClassicFacings: True - turret: dronet + turret: + Filename: dronet.shp Facings: 32 UseClassicFacings: True - muzzle: gunfire2 + turretpd: + Filename: dronet.shp + Facings: 32 + Start: 32 + UseClassicFacings: True + muzzle: + Filename: gunfire2.shp Length: 5 - spinner: drad + spinner: + Filename: drad.shp Length: * - icon: droneicnh + icon: + Filename: droneicnh.shp drone.destroyed: Inherits: ^VehicleOverlays - idle: mtnk + idle: + Filename: mtnk.shp Facings: 32 UseClassicFacings: True ZOffset: -512 - turret: dronet + turret: + Filename: dronet.shp Facings: 32 UseClassicFacings: True ZOffset: -512 mdrn: Inherits: ^VehicleOverlays - idle: mdrn + idle: + Filename: mdrn.shp Facings: 1 Start: 64 - turret: mdrn + turret: + Filename: mdrn.shp Facings: 32 UseClassicFacings: True - turret-attached: mdrn + turret-attached: + Filename: mdrn.shp Facings: 32 Start: 32 UseClassicFacings: True - muzzle: minigun16 + muzzle: + Filename: minigun16.shp Length: 6 Facings: 16 - icon: mdrnicon + icon: + Filename: mdrnicon.shp htnk: Inherits: ^VehicleOverlays - idle: htnk + idle: + Filename: htnk.shp Facings: 32 UseClassicFacings: True - turret: htnk + turret: + Filename: htnk.shp Start: 32 Facings: 32 UseClassicFacings: True - muzzle: gunfire2 + muzzle: + Filename: gunfire2.shp Length: 5 - idle-hover: htnkhover + idle-hover: + Filename: htnkhover.shp Facings: 32 UseClassicFacings: True - icon: htnkicnh + icon: + Filename: htnkicnh.shp htnk.ion: Inherits: ^VehicleOverlays - idle: htnk + idle: + Filename: htnk.shp Facings: 32 UseClassicFacings: True - turret: htnktion + turret: + Filename: htnktion.shp Facings: 32 UseClassicFacings: True - muzzle: gunfire2 + muzzle: + Filename: gunfire2.shp Length: 5 - icon: htnkionicnh + icon: + Filename: htnkionicnh.shp htnk.hover: Inherits: ^VehicleOverlays - idle: htnkhover + idle: + Filename: htnkhover.shp Facings: 32 UseClassicFacings: True - turret: htnk + turret: + Filename: htnk.shp Start: 32 Facings: 32 UseClassicFacings: True - muzzle: gunfire2 + muzzle: + Filename: gunfire2.shp Length: 5 - icon: htnkhovericnh + icon: + Filename: htnkhovericnh.shp htnk.drone: Inherits: ^VehicleOverlays - idle: htnk + idle: + Filename: htnk.shp Facings: 32 UseClassicFacings: True - turret: mdrone + turret: + Filename: mdrone.shp Facings: 32 UseClassicFacings: True - muzzle: gunfire2 + muzzle: + Filename: gunfire2.shp Length: 5 - icon: mdroneicnh + icon: + Filename: mdroneicnh.shp htnk.destroyed: Inherits: ^VehicleOverlays - idle: htnk + idle: + Filename: htnk.shp Facings: 32 UseClassicFacings: True ZOffset: -512 - idle-hover: htnkhover + idle-hover: + Filename: htnkhover.shp Facings: 32 UseClassicFacings: True - turret: htnk + turret: + Filename: htnk.shp Start: 32 Facings: 32 UseClassicFacings: True ZOffset: -512 - turret-ion: htnktion + turret-ion: + Filename: htnktion.shp Facings: 32 UseClassicFacings: True ZOffset: -512 - turret-drone: mdrone + turret-drone: + Filename: mdrone.shp Facings: 32 UseClassicFacings: True ZOffset: -512 msam: Inherits: ^VehicleOverlays - idle: msam + idle: + Filename: msam.shp Facings: 32 UseClassicFacings: True - turret: msam + turret: + Filename: msam.shp Start: 64 Facings: 32 UseClassicFacings: True - empty-aim: msam + empty-aim: + Filename: msam.shp Start: 64 Facings: 32 UseClassicFacings: True - aim: msam + aim: + Filename: msam.shp Start: 64 Facings: 32 UseClassicFacings: True - icon: msamicnh + icon: + Filename: msamicnh.shp msam.nod: Inherits: ^VehicleOverlays - idle: msam + idle: + Filename: msam.shp Facings: 32 UseClassicFacings: True - turret: msam + turret: + Filename: msam.shp Start: 64 Facings: 32 UseClassicFacings: True - empty-aim: msam + empty-aim: + Filename: msam.shp Start: 64 Facings: 32 UseClassicFacings: True - aim: msam + aim: + Filename: msam.shp Start: 64 Facings: 32 UseClassicFacings: True - icon: msamnodicnh + icon: + Filename: msamnodicnh.shp msam.destroyed: Inherits: ^VehicleOverlays - idle: msam + idle: + Filename: msam.shp Facings: 32 UseClassicFacings: True ZOffset: -512 - turret: msam + turret: + Filename: msam.shp Start: 32 Facings: 32 UseClassicFacings: True @@ -930,30 +1343,37 @@ msam.destroyed: mlrs: Inherits: ^VehicleOverlays - idle: mlrs + idle: + Filename: mlrs.shp Facings: 32 UseClassicFacings: True - turret: mlrs + turret: + Filename: mlrs.shp Start: 32 Facings: 32 UseClassicFacings: True - turret1: mlrs + turret1: + Filename: mlrs.shp Start: 64 Facings: 32 UseClassicFacings: True - turret0: mlrs + turret0: + Filename: mlrs.shp Start: 96 Facings: 32 UseClassicFacings: True - icon: mlrsicnh + icon: + Filename: mlrsicnh.shp mlrs.destroyed: Inherits: ^VehicleOverlays - idle: mlrs + idle: + Filename: mlrs.shp Facings: 32 UseClassicFacings: True ZOffset: -512 - turret: mlrs + turret: + Filename: mlrs.shp Start: 96 Facings: 32 UseClassicFacings: True @@ -961,150 +1381,225 @@ mlrs.destroyed: stnk: Inherits: ^VehicleOverlays - idle: stnk + idle: + Filename: stnk.shp Facings: 32 UseClassicFacings: True - turret: stnk + turret: + Filename: stnk.shp Start: 38 Facings: 32 - icon: stnkicon + icon: + Filename: stnkicon.shp stnk.destroyed: Inherits: ^VehicleOverlays - idle: stnk + idle: + Filename: stnk.shp Facings: 32 UseClassicFacings: True ZOffset: -512 - turret: stnk + turret: + Filename: stnk.shp Start: 38 Facings: 32 -stnknod: +stnktnod: Inherits: ^VehicleOverlays - idle: stnknod + idle: + Filename: stnktnod.shp Facings: 32 UseClassicFacings: True - icon: stnkicnh + turret: + Filename: stnktnod.shp + Start: 32 + Facings: 32 + turret-upg: + Filename: stnktupg.shp + Facings: 32 + icon: + Filename: stnkicnh.shp stnknod.destroyed: Inherits: ^VehicleOverlays - idle: stnknod + idle: + Filename: stnknod.shp Facings: 32 UseClassicFacings: True ZOffset: -512 -stnktnod: +hstk: + Inherits: ^VehicleOverlays + idle: + Filename: hstk.shp + Facings: 32 + UseClassicFacings: True + turret: + Filename: hstk.shp + Start: 32 + Facings: 32 + turret-upg: + Filename: hstktupg.shp + Facings: 32 + icon: + Filename: hstkicnh.shp + +hstk.destroyed: Inherits: ^VehicleOverlays - idle: stnktnod + idle: + Filename: hstk.shp Facings: 32 UseClassicFacings: True - turret: stnktnod + ZOffset: -512 + turret: + Filename: hstk.shp Start: 32 Facings: 32 - icon: stnkicnh + UseClassicFacings: True + ZOffset: -512 bike: Inherits: ^VehicleOverlays - idle: bike + idle: + Filename: bike.shp Facings: 32 UseClassicFacings: True - icon: bikeicnh + idle-upgrade: + Filename: bikeupg.shp + Facings: 32 + UseClassicFacings: True + icon: + Filename: bikeicnh.shp bike.destroyed: Inherits: ^VehicleOverlays - idle: bike + idle: + Filename: bike.shp Facings: 32 UseClassicFacings: True ZOffset: -512 ftnk: Inherits: ^VehicleOverlays - idle: ftnk + idle: + Filename: ftnk.shp Facings: 32 UseClassicFacings: True muzzle: Combine: - flame-n: + 0: + Filename: flame-n.shp Length: * Offset: 3,6 - flame-nw: + 1: + Filename: flame-nw.shp Length: * Offset: 8,7 - flame-w: + 2: + Filename: flame-w.shp Length: * Offset: 8,2 - flame-sw: + 3: + Filename: flame-sw.shp Length: * Offset: 7,-2 - flame-s: + 4: + Filename: flame-s.shp Length: * Offset: 3,-2 - flame-se: + 5: + Filename: flame-se.shp Length: * Offset: -5,-2 - flame-e: + 6: + Filename: flame-e.shp Length: * Offset: -7,2 - flame-ne: + 7: + Filename: flame-ne.shp Length: * Offset: -7,8 Facings: 8 Length: 13 - icon: ftnkicnh + icon: + Filename: ftnkicnh.shp ftnk.destroyed: Inherits: ^VehicleOverlays - idle: ftnk + idle: + Filename: ftnk.shp Facings: 32 UseClassicFacings: True ZOffset: -512 hftk: Inherits: ^VehicleOverlays - idle: hftk + idle: + Filename: hftk.shp Facings: 32 UseClassicFacings: True - turret: hftk + turret: + Filename: hftk.shp Start: 32 Facings: 32 UseClassicFacings: True + turret-upg: + Filename: hftk.shp + Start: 64 + Facings: 32 + UseClassicFacings: True muzzle: Combine: - flame-n: + 0: + Filename: flame-n.shp Length: * Offset: 3,6 - flame-nw: + 1: + Filename: flame-nw.shp Length: * Offset: 8,7 - flame-w: + 2: + Filename: flame-w.shp Length: * Offset: 8,2 - flame-sw: + 3: + Filename: flame-sw.shp Length: * Offset: 7,-2 - flame-s: + 4: + Filename: flame-s.shp Length: * Offset: 3,-2 - flame-se: + 5: + Filename: flame-se.shp Length: * Offset: -5,-2 - flame-e: + 6: + Filename: flame-e.shp Length: * Offset: -7,2 - flame-ne: + 7: + Filename: flame-ne.shp Length: * Offset: -7,8 Facings: 8 Length: 13 - icon: hftkicnh + muzzle2: + Filename: flameblack.shp + Length: 13 + Facings: 8 + icon: + Filename: hftkicnh.shp hftk.destroyed: Inherits: ^VehicleOverlays - idle: hftk + idle: + Filename: hftk.shp Facings: 32 UseClassicFacings: True ZOffset: -512 - turret: hftk + turret: + Filename: hftk.shp Start: 32 Facings: 32 UseClassicFacings: True @@ -1112,27 +1607,42 @@ hftk.destroyed: ltnk: Inherits: ^VehicleOverlays - idle: ltnk + idle: + Filename: ltnk.shp Facings: 32 UseClassicFacings: True - idle-water: ltnkwater + idle-water: + Filename: ltnkwater.shp Facings: 32 UseClassicFacings: True - turret: ltnk + turret: + Filename: ltnk.shp Start: 32 Facings: 32 UseClassicFacings: True - muzzle: gunfire2 + turretlas: + Filename: ltnk.shp + Start: 64 + Facings: 32 + UseClassicFacings: True + muzzle: + Filename: gunfire2.shp Length: 2 - icon: ltnkicnh + muzzlelas: + Filename: lasermuzzle.shp + Length: * + icon: + Filename: ltnkicnh.shp ltnk.destroyed: Inherits: ^VehicleOverlays - idle: ltnk + idle: + Filename: ltnk.shp Facings: 32 UseClassicFacings: True ZOffset: -512 - turret: ltnk + turret: + Filename: ltnk.shp Start: 32 Facings: 32 UseClassicFacings: True @@ -1140,287 +1650,640 @@ ltnk.destroyed: harv2: Inherits: ^VehicleOverlays - idle: harv2 + idle: + Filename: harv2.shp Facings: 32 UseClassicFacings: True - harvest: harv2 + harvest: + Filename: harv2.shp Start: 32 Length: 4 Facings: 8 Tick: 60 - dock: harv2dump + dock: + Filename: harv2dump.shp Length: 7 - dock-loop: harv2dump + dock-loop: + Filename: harv2dump.shp Start: 7 - icon: harv2icnh + icon: + Filename: harv2icnh.shp harv2.destroyed: Inherits: ^VehicleOverlays - idle: harv2 + idle: + Filename: harv2.shp Facings: 32 UseClassicFacings: True ZOffset: -512 -btr: +harv2.upg: Inherits: ^VehicleOverlays - idle: btr + idle: + Filename: harv2upg.shp Facings: 32 UseClassicFacings: True - turret: ftrk + harvest: + Filename: harv2upg.shp Start: 32 + Length: 4 + Facings: 8 + Tick: 60 + dock: + Filename: harv2dumpupg.shp + Length: 7 + dock-loop: + Filename: harv2dumpupg.shp + Start: 7 + icon: + Filename: harv2upgicnh.shp + +harv2.upg.destroyed: + Inherits: ^VehicleOverlays + idle: + Filename: harv2upg.shp Facings: 32 UseClassicFacings: True - muzzle: gunfire2 + ZOffset: -512 + +btr: + Inherits: ^VehicleOverlays + idle: + Filename: btr.shp + Facings: 32 + UseClassicFacings: True + turret: + Filename: btrt.shp + Facings: 32 + UseClassicFacings: True + turret-upg: + Filename: btrtr.shp + Facings: 32 + UseClassicFacings: True + muzzle: + Filename: gunfire2.shp + ZOffset: 2048 + IgnoreWorldTint: true Length: 2 - icon: btricon + icon: + Filename: btricon.shp + +btry: + Inherits: ^VehicleOverlays + idle: + Filename: btr.shp + Facings: 32 + UseClassicFacings: True + turret: + Filename: gata.shp + Facings: 32 + UseClassicFacings: True + turret-ground: + Filename: gatl.shp + Facings: 32 + UseClassicFacings: True + turret-ground-upg: + Filename: gatlr.shp + Facings: 32 + UseClassicFacings: True + turret-air-upg: + Filename: gatar.shp + Facings: 32 + UseClassicFacings: True + muzzle: + Filename: minigun16big.shp + ZOffset: 2048 + IgnoreWorldTint: true + Length: 6 + Facings: 16 + muzzle-huge: + Filename: minigun16huge.shp + ZOffset: 2048 + IgnoreWorldTint: true + Length: 6 + Facings: 16 + icon: + Filename: btryicon.shp btr.destroyed: Inherits: ^VehicleOverlays - idle: btr + idle: + Filename: btr.shp Facings: 32 UseClassicFacings: True ZOffset: -512 - turret: samtur + turret: + Filename: samtur.shp Facings: 32 UseClassicFacings: True ifv: Inherits: ^VehicleOverlays - idle: ifv + idle: + Filename: ifv.shp Facings: 32 UseClassicFacings: True - muzzle: minigun16 + muzzle: + Filename: minigun16.shp Length: 6 Facings: 16 - muzzle2: gunfire2 + muzzle2: + Filename: gunfire2.shp Length: 2 - spinner: mrj + spinner: + Filename: mrj.shp Start: 32 Length: 32 - medic: mouse + medic: + Filename: mouse.shp Start: 194 Length: 1 - nuke: nsymbol - tesla: bttnk + nuke: + Filename: nsymbol.shp + tesla: + Filename: bttnk.shp Start: 32 Length: 32 - turret: ifvtur + psy: + Filename: ifvtur.shp + Start: 576 + Length: 1 + hack: + Filename: ifvtur.shp + Start: 577 + Length: 1 + turret: + Filename: ifvtur.shp Facings: 32 UseClassicFacings: True - turret2: ifvtur + turret-rocket: + Filename: ifvtur.shp Start: 320 Facings: 32 UseClassicFacings: True - turret3: ifvtur + turret-mg: + Filename: ifvtur.shp Start: 64 Facings: 32 UseClassicFacings: True - turret4: ifvtur + turret-frag: + Filename: ifvtur.shp Start: 96 Facings: 32 UseClassicFacings: True - turret5: ifvtur + turret-flame: + Filename: ifvtur.shp Start: 128 Facings: 32 UseClassicFacings: True - turret6: ifvtur + turret-chem: + Filename: ifvtur.shp Start: 160 Facings: 32 UseClassicFacings: True - turret7: ifvtur + turret-laser: + Filename: ifvtur.shp Start: 192 Facings: 32 UseClassicFacings: True - turret8: ifvtur + turret-rad: + Filename: ifvtur.shp Start: 224 Facings: 32 UseClassicFacings: True - turret9: ifvtur + turret-cmdo: + Filename: ifvtur.shp Start: 256 Facings: 32 UseClassicFacings: True - turret10: ifvtur + turret-mech: + Filename: ifvtur.shp Start: 288 Facings: 32 UseClassicFacings: True - open: ifv - Start: 32 - Length: 3 - unload: ifv - Start: 32 - icon: ifvicon - -ifv.destroyed: - Inherits: ^VehicleOverlays - idle: ifv + turret-snip: + Filename: ifvtur.shp + Start: 352 Facings: 32 UseClassicFacings: True - ZOffset: -512 - turret: 1tnk - Start: 32 + turret-enli: + Filename: ifvtur.shp + Start: 384 Facings: 32 UseClassicFacings: True - -titn: - Inherits: ^VehicleOverlays - stand: titanlegs - Facings: 16 - run: titanlegs - Start: 16 - Facings: 16 - Length: 14 - Tick: 90 - turret: titanturr + turret-rmbc: + Filename: ifvtur.shp + Start: 416 Facings: 32 UseClassicFacings: True - muzzle: smokeygun - Length: 12 - Tick: 30 - icon: titanicnh - -titn.destroyed: - Inherits: ^VehicleOverlays - idle: titanlegs - Facings: 16 - ZOffset: -512 - turret: titanturr + turret-bh: + Filename: ifvtur.shp + Start: 448 Facings: 32 UseClassicFacings: True - -titn.rail: - Inherits: titn - turret: titantrail + turret16: + Filename: ifvtur.shp + Start: 480 Facings: 32 UseClassicFacings: True - icon: titanrailicnh - -titn.rail.destroyed: - Inherits: ^VehicleOverlays - idle: titanlegs - Facings: 16 - ZOffset: -512 - turret: titantrail + Offset: 0, 1 + turret-mort: + Filename: ifvtur.shp + Start: 512 Facings: 32 UseClassicFacings: True - -jugg: - Inherits: ^VehicleOverlays - stand: titanlegs - Facings: 16 - run: titanlegs - Start: 16 - Facings: 16 - Length: 14 - Tick: 90 - turret: juggt + turret-ggi: + Filename: ifvtur.shp + Start: 544 Facings: 32 UseClassicFacings: True - muzzle: smokeygun - Length: 12 - Tick: 30 - icon: juggicnh - -jugg.destroyed: - Inherits: ^VehicleOverlays - idle: titanlegs - Facings: 16 - ZOffset: -512 - turret: juggt + turret-cryo: + Filename: ifvtur.shp + Start: 578 Facings: 32 UseClassicFacings: True - -ttrk: - Inherits: ^VehicleOverlays - idle: ttrk + turret-enfo: + Filename: ifvtur.shp + Start: 610 Facings: 32 UseClassicFacings: True - icon: ttrkicon - -disr: - Inherits: ^VehicleOverlays - idle: disr + turret-engi: + Filename: ifvtur.shp + Start: 642 Facings: 32 UseClassicFacings: True - turret: sonict + turret-ztrp: + Filename: ifvtur.shp + Start: 674 Facings: 32 UseClassicFacings: True - icon: disricon - -disr.destroyed: - Inherits: ^VehicleOverlays - idle: disr + turret-zdef: + Filename: ifvtur.shp + Start: 706 Facings: 32 UseClassicFacings: True - ZOffset: -512 - turret: sonict + turret-zrai: + Filename: ifvtur.shp + Start: 738 Facings: 32 UseClassicFacings: True - ZOffset: -512 - -hmlrs: - Inherits: ^VehicleOverlays - idle: hvrhull + turret-tigr: + Filename: ifvtur.shp + Start: 770 Facings: 32 UseClassicFacings: True - turret: hvrtur + turret-disin: + Filename: ifvtur.shp + Start: 802 Facings: 32 UseClassicFacings: True - icon: hmlrsicnh - -tnkd: - Inherits: ^VehicleOverlays - idle: tnkd + turret-shard: + Filename: ifvtur.shp + Start: 834 Facings: 32 UseClassicFacings: True - turret: tnkd - Start: 32 + turret-pdisc: + Filename: ifvtur.shp + Start: 866 Facings: 32 UseClassicFacings: True - muzzle: gunfire2 - Length: 2 - icon: tnkdicon + turret-impl: + Filename: ifvtur.shp + Start: 898 + Facings: 32 + UseClassicFacings: True + turret-stlk: + Filename: ifvtur.shp + Start: 930 + Facings: 32 + UseClassicFacings: True + turret-conf: + Filename: ifvtur.shp + Start: 962 + Facings: 32 + UseClassicFacings: True + turret-reap: + Filename: ifvtur.shp + Start: 994 + Facings: 32 + UseClassicFacings: True + turret-hopl: + Filename: ptnkt.shp + Facings: 32 + UseClassicFacings: True + Offset: 0, -1 + turret15: + Filename: seek.shp + Start: 32 + Facings: 32 + UseClassicFacings: True + Offset: 0, 1 + turret-arch: + Filename: arch.shp + Facings: 32 + UseClassicFacings: True + open: + Filename: ifv.shp + Start: 32 + Length: 3 + unload: + Filename: ifv.shp + Start: 32 + icon: + Filename: ifvicon.shp + +ifv.destroyed: + Inherits: ^VehicleOverlays + idle: + Filename: ifv.shp + Facings: 32 + UseClassicFacings: True + ZOffset: -512 + turret: + Filename: 1tnk.shp + Start: 32 + Facings: 32 + UseClassicFacings: True + +xo: + Inherits: ^VehicleOverlays + Defaults: + Offset: 0, 0 + idle: + Filename: xo.shp + Facings: 8 + move: + Filename: xo.shp + Start: 8 + Length: 4 + Facings: 8 + Tick: 200 + shoot: + Filename: xo.shp + Start: 40 + Length: 2 + Facings: 8 + Tick: 40 + descend: + Filename: xo.shp + Start: 56 + Facings: 8 + Length: 3 + muzzle: + Filename: minigun.shp + Length: 6 + Facings: 8 + muzzle2: + Filename: scrinmuzz4.shp + Length: * + Tick: 40 + ZOffset: 2049 + BlendMode: Additive + IgnoreWorldTint: true + chrono-overlay: + Filename: chronofade_small.shp + Length: * + BlendMode: Additive + ZOffset: 512 + Tick: 80 + icon: + Filename: xoicon.shp + +wolv: + Inherits: ^VehicleOverlays + Defaults: + Offset: 0, 0 + idle: + Filename: wolv.shp + Facings: 8 + move: + Filename: wolv.shp + Start: 8 + Length: 4 + Facings: 8 + Tick: 200 + shoot: + Filename: wolv.shp + Start: 40 + Length: 2 + Facings: 8 + Tick: 40 + muzzle: + Filename: minigun.shp + Length: 6 + Facings: 8 + chrono-overlay: + Filename: chronofade_small.shp + Length: * + BlendMode: Additive + ZOffset: 512 + Tick: 80 + icon: + Filename: wolvicnh.shp + +titn: + Inherits: ^VehicleOverlays + stand: + Filename: titanlegs.shp + Facings: 16 + run: + Filename: titanlegs.shp + Start: 16 + Facings: 16 + Length: 14 + Tick: 90 + turret: + Filename: titanturr.shp + Facings: 32 + UseClassicFacings: True + muzzle: + Filename: smokeygun.shp + Length: 12 + Tick: 30 + icon: + Filename: titanicnh.shp + +titn.destroyed: + Inherits: ^VehicleOverlays + idle: + Filename: titanlegs.shp + Facings: 16 + ZOffset: -512 + turret: + Filename: titanturr.shp + Facings: 32 + UseClassicFacings: True + +titn.rail: + Inherits: titn + turret: + Filename: titantrail.shp + Facings: 32 + UseClassicFacings: True + icon: + Filename: titanrailicnh.shp + +titn.rail.destroyed: + Inherits: ^VehicleOverlays + idle: + Filename: titanlegs.shp + Facings: 16 + ZOffset: -512 + turret: + Filename: titantrail.shp + Facings: 32 + UseClassicFacings: True + +jugg: + Inherits: ^VehicleOverlays + stand: + Filename: titanlegs.shp + Facings: 16 + run: + Filename: titanlegs.shp + Start: 16 + Facings: 16 + Length: 14 + Tick: 90 + turret: + Filename: juggt.shp + Facings: 32 + UseClassicFacings: True + muzzle: + Filename: smokeygun.shp + Length: 12 + Tick: 30 + icon: + Filename: juggicnh.shp + +jugg.destroyed: + Inherits: ^VehicleOverlays + idle: + Filename: titanlegs.shp + Facings: 16 + ZOffset: -512 + turret: + Filename: juggt.shp + Facings: 32 + UseClassicFacings: True + +ttrk: + Inherits: ^VehicleOverlays + idle: + Filename: ttrk.shp + Facings: 32 + UseClassicFacings: True + icon: + Filename: ttrkicon.shp + +disr: + Inherits: ^VehicleOverlays + idle: + Filename: disr.shp + Facings: 32 + UseClassicFacings: True + turret: + Filename: sonict.shp + Facings: 32 + UseClassicFacings: True + icon: + Filename: disricon.shp + +disr.destroyed: + Inherits: ^VehicleOverlays + idle: + Filename: disr.shp + Facings: 32 + UseClassicFacings: True + ZOffset: -512 + turret: + Filename: sonict.shp + Facings: 32 + UseClassicFacings: True + ZOffset: -512 + +hmlrs: + Inherits: ^VehicleOverlays + idle: + Filename: hvrhull.shp + Facings: 32 + UseClassicFacings: True + turret: + Filename: hvrtur.shp + Facings: 32 + UseClassicFacings: True + icon: + Filename: hmlrsicnh.shp + +tnkd: + Inherits: ^VehicleOverlays + idle: + Filename: tnkd.shp + Facings: 32 + UseClassicFacings: True + turret: + Filename: tnkd.shp + Start: 32 + Facings: 32 + UseClassicFacings: True + muzzle: + Filename: gunfire2.shp + Length: 2 + icon: + Filename: tnkdicon.shp tnkd.destroyed: Inherits: ^VehicleOverlays - idle: tnkd + idle: + Filename: tnkd.shp Facings: 32 UseClassicFacings: True - turret: tnkd + turret: + Filename: tnkd.shp Start: 32 Facings: 32 UseClassicFacings: True v3rl: Inherits: ^VehicleOverlays - idle: v3rl + idle: + Filename: v3rl.shp Facings: 32 UseClassicFacings: True - empty-idle: v3rl + empty-idle: + Filename: v3rl.shp Start: 32 Facings: 32 UseClassicFacings: True - icon: v3rlicon + icon: + Filename: v3rlicon.shp rtnk: Inherits: ^VehicleOverlays - idle: rtnk + idle: + Filename: rtnk.shp Facings: 32 UseClassicFacings: True - turret: rtnk + turret: + Filename: rtnk.shp Start: 32 Facings: 32 UseClassicFacings: True - muzzle: gunfire2 + muzzle: + Filename: gunfire2.shp Length: 5 - icon: rtnkicon + icon: + Filename: rtnkicon.shp rtnk.destroyed: Inherits: ^VehicleOverlays - idle: rtnk + idle: + Filename: rtnk.shp Facings: 32 UseClassicFacings: True ZOffset: -512 - turret: rtnk + turret: + Filename: rtnk.shp Start: 32 Facings: 32 UseClassicFacings: True @@ -1428,150 +2291,225 @@ rtnk.destroyed: msar: Inherits: ^VehicleOverlays - idle: msar + idle: + Filename: msar.shp Facings: 32 UseClassicFacings: True - spinner: msarspinner + spinner: + Filename: msarspinner.shp Length: 32 - make: msarmake + make: + Filename: msarmake.shp Length: * Tick: 50 - idle-static: msardeployed + idle-static: + Filename: msardeployed.shp Length: 14 Tick: 80 - icon: msaricnh + icon: + Filename: msaricnh.shp ptnk: Inherits: ^VehicleOverlays - idle: ptnk + idle: + Filename: ptnk.shp Facings: 32 UseClassicFacings: True - turret: ptnkt + turret: + Filename: ptnkt.shp Facings: 32 UseClassicFacings: True - icon: ptnkicon + muzzle: + Filename: prismmuzzle.shp + Length: 4 + icon: + Filename: ptnkicon.shp ptnk.destroyed: Inherits: ^VehicleOverlays - idle: ptnk + idle: + Filename: ptnk.shp Facings: 32 UseClassicFacings: True ZOffset: -512 - turret: ptnkt + turret: + Filename: ptnkt.shp Facings: 32 UseClassicFacings: True ZOffset: -512 mwtnk: Inherits: ^VehicleOverlays - idle: mwtnk + idle: + Filename: mwtnk.shp Facings: 32 UseClassicFacings: True - turret: mwtnkt + turret: + Filename: mwtnkt.shp Facings: 32 UseClassicFacings: True - muzzle: emp_fx02 + muzzle: + Filename: emp_fx02.shp Length: * BlendMode: Additive Offset: 0, 0 - UseTilesetCode: false ZOffset: 512 - icon: mwtnkicnh + icon: + Filename: mwtnkicnh.shp mwtnk.destroyed: Inherits: ^VehicleOverlays - idle: mwtnk + idle: + Filename: mwtnk.shp Facings: 32 UseClassicFacings: True ZOffset: -512 - turret: mwtnkt + turret: + Filename: mwtnkt.shp Facings: 32 UseClassicFacings: True ZOffset: -512 batf: Inherits: ^VehicleOverlays - idle: batf + idle: + Filename: batf.shp Facings: 32 UseClassicFacings: True - muzzle: minigun16 + muzzle: + Filename: minigun16.shp Length: 6 Facings: 16 - icon: batficon + medic: + Filename: mouse.shp + Start: 194 + Length: 1 + icon: + Filename: batficon.shp batf.destroyed: Inherits: ^VehicleOverlays - idle: batf + idle: + Filename: batf.shp Facings: 32 UseClassicFacings: True spec: Inherits: ^VehicleOverlays - idle: spec + idle: + Filename: spec.shp Facings: 32 UseClassicFacings: True - muzzle: smokeygun + muzzle: + Filename: smokeygun.shp Length: 12 Tick: 30 - icon: specicnh + icon: + Filename: specicnh.shp + +sapc: + Inherits: ^VehicleOverlays + idle: + Filename: sapc.shp + Facings: 32 + UseClassicFacings: True + icon: + Filename: sapcicon.shp memp: Inherits: ^VehicleOverlays - idle: memp + idle: + Filename: memp.shp Facings: 32 UseClassicFacings: True - charging: memp + charging: + Filename: memp.shp Facings: 32 - idle-overlay: pulsball + idle-overlay: + Filename: pulsball.shp Length: 23 BlendMode: Additive Tick: 40 ZOffset: 511 - icon: mempicnh + icon: + Filename: mempicnh.shp cdrone: Inherits: ^VehicleOverlays - idle: cdrone + idle: + Filename: cdrone.shp Facings: 32 UseClassicFacings: True - icon: cdroneicnh + icon: + Filename: cdroneicnh.shp katy: Inherits: ^VehicleOverlays - idle: katy + idle: + Filename: katy.shp Facings: 32 UseClassicFacings: True - muzzle: smokeygun + muzzle: + Filename: smokeygun.shp Length: 12 Tick: 30 - move: katy + move: + Filename: katy.shp Facings: 32 Length: 1 UseClassicFacings: True - icon: katyicnh + icon: + Filename: katyicnh.shp + +grad: + Inherits: ^VehicleOverlays + idle: + Filename: grad.shp + Facings: 32 + UseClassicFacings: True + muzzle: + Filename: smokeygun.shp + Length: 12 + Tick: 30 + turret: + Filename: gradtur.shp + Facings: 32 + UseClassicFacings: True + turret-upg: + Filename: gradturupg.shp + Facings: 32 + UseClassicFacings: True + icon: + Filename: gradicon.shp chpr: Inherits: ^VehicleOverlays - idle: chpr + idle: + Filename: chpr.shp Facings: 32 UseClassicFacings: True - turretactive: chpr + turretactive: + Filename: chpr.shp Start: 32 Facings: 32 UseClassicFacings: True - turret: chpr + turret: + Filename: chpr.shp Start: 64 Facings: 32 UseClassicFacings: True - icon: chpricnh + icon: + Filename: chpricnh.shp chpr.destroyed: Inherits: ^VehicleOverlays - idle: chpr + idle: + Filename: chpr.shp Facings: 32 UseClassicFacings: True ZOffset: -512 - turret: chpr + turret: + Filename: chpr.shp Start: 64 Facings: 32 UseClassicFacings: True @@ -1579,79 +2517,715 @@ chpr.destroyed: pcan: Inherits: ^VehicleOverlays - idle: pcan + idle: + Filename: pcan.shp Facings: 32 UseClassicFacings: True - icon: pcanicon + turret: + Filename: pcan.shp + Start: 32 + Facings: 32 + UseClassicFacings: True + muzzle: + Filename: prismmuzzle.shp + Length: 4 + icon: + Filename: pcanicon.shp pcan.destroyed: Inherits: ^VehicleOverlays - idle: pcan + idle: + Filename: pcan.shp Facings: 32 UseClassicFacings: True ZOffset: -512 cryo: Inherits: ^VehicleOverlays - idle: cryol + idle: + Filename: cryol.shp Facings: 32 UseClassicFacings: True - muzzle: smokeygun + muzzle: + Filename: smokeygun.shp Length: 12 Tick: 30 - icon: cryolicnh + icon: + Filename: cryolicnh.shp isu: Inherits: ^VehicleOverlays - idle: isu + idle: + Filename: isu.shp Facings: 32 UseClassicFacings: True - muzzle: smokeygun + muzzle: + Filename: smokeygun.shp Length: 12 Tick: 30 - icon: isuicon + icon: + Filename: isuicon.shp isu.destroyed: Inherits: ^VehicleOverlays - idle: isu + idle: + Filename: isu.shp + Facings: 32 + UseClassicFacings: True + ZOffset: -512 + +nukc: + Inherits: ^VehicleOverlays + idle: + Filename: nukc.shp + Facings: 32 + UseClassicFacings: True + make: + Filename: nukcd.shp + Facings: 4 + Length: 4 + Tick: 300 + undeploy: + Filename: nukcd.shp + Frames: 3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12 + Facings: 4 + Length: 4 + Tick: 300 + deployed: + Filename: nukcd.shp + Facings: 4 + Frames: 3, 7, 11, 15 + overlay: + Filename: nukco.shp + Facings: 32 + ZOffset: 128 + UseClassicFacings: True + turret: + Filename: nukct.shp + Facings: 32 + UseClassicFacings: True + muzzle: + Filename: smokeygun.shp + Length: 12 + Tick: 30 + icon: + Filename: nukcicon.shp + +nukc.destroyed: + Inherits: ^VehicleOverlays + idle: + Filename: nukc.shp Facings: 32 UseClassicFacings: True ZOffset: -512 apoc: Inherits: ^VehicleOverlays - idle: apoc + idle: + Filename: apoc.shp Facings: 32 UseClassicFacings: True - idle2: apoci + idle2: + Filename: apoci.shp Facings: 32 UseClassicFacings: True - turret: apoctur + turret: + Filename: apoctur.shp Facings: 32 UseClassicFacings: True - muzzle: gunfire2 + muzzle: + Filename: gunfire2.shp Length: 5 - icon: apocicon + icon: + Filename: apocicon.shp apoc.destroyed: Inherits: ^VehicleOverlays - idle: apoc + idle: + Filename: apoc.shp Facings: 32 UseClassicFacings: True ZOffset: -512 - turret: apoctur + turret: + Filename: apoctur.shp Facings: 32 UseClassicFacings: True ZOffset: -512 apoci: Inherits: ^VehicleOverlays - idle: apoci + idle: + Filename: apoci.shp + Facings: 32 + UseClassicFacings: True + turret: + Filename: apoctur.shp + Facings: 32 + UseClassicFacings: True + muzzle: + Filename: gunfire2.shp + Length: 5 + icon: + Filename: apociicon.shp + +apoc.erad: + Inherits: ^VehicleOverlays + idle: + Filename: apoc.shp + Facings: 32 + UseClassicFacings: True + idle2: + Filename: apoci.shp + Facings: 32 + UseClassicFacings: True + turret: + Filename: apocturi.shp + Facings: 32 + UseClassicFacings: True + muzzle: + Filename: radhitsm.shp + IgnoreWorldTint: true + BlendMode: Additive + Length: * + icon: + Filename: apoceradicon.shp + +apoc.erad.destroyed: + Inherits: ^VehicleOverlays + idle: + Filename: apoc.shp + Facings: 32 + UseClassicFacings: True + ZOffset: -512 + turret: + Filename: apocturi.shp + Facings: 32 + UseClassicFacings: True + ZOffset: -512 + +apoc.eradi: + Inherits: ^VehicleOverlays + idle: + Filename: apoci.shp + Facings: 32 + UseClassicFacings: True + turret: + Filename: apocturi.shp + Facings: 32 + UseClassicFacings: True + muzzle: + Filename: radhitsm.shp + IgnoreWorldTint: true + BlendMode: Additive + Length: * + icon: + Filename: apoceradiicon.shp + +ovld: + Inherits: ^VehicleOverlays + idle: + Filename: ovld.shp Facings: 32 UseClassicFacings: True - turret: apoctur + idle2: + Filename: apoci.shp Facings: 32 UseClassicFacings: True - muzzle: gunfire2 + turret: + Filename: ovldtur.shp + Facings: 32 + UseClassicFacings: True + muzzle: + Filename: gunfire2.shp + Length: 5 + icon: + Filename: ovldicon.shp + +ovld.destroyed: + Inherits: ^VehicleOverlays + idle: + Filename: ovld.shp + Facings: 32 + UseClassicFacings: True + ZOffset: -512 + turret: + Filename: ovldtur.shp + Facings: 32 + UseClassicFacings: True + ZOffset: -512 + +ovldi: + Inherits: ^VehicleOverlays + idle: + Filename: ovldi.shp + Facings: 32 + UseClassicFacings: True + turret: + Filename: ovldtur.shp + Facings: 32 + UseClassicFacings: True + muzzle: + Filename: gunfire2.shp + Length: 5 + icon: + Filename: ovldiicon.shp + +ovld.erad: + Inherits: ^VehicleOverlays + idle: + Filename: ovld.shp + Facings: 32 + UseClassicFacings: True + idle2: + Filename: ovldi.shp + Facings: 32 + UseClassicFacings: True + turret: + Filename: ovldturi.shp + Facings: 32 + UseClassicFacings: True + muzzle: + Filename: radhitsm.shp + IgnoreWorldTint: true + BlendMode: Additive + Length: * + icon: + Filename: ovlderadicon.shp + +ovld.erad.destroyed: + Inherits: ^VehicleOverlays + idle: + Filename: ovld.shp + Facings: 32 + UseClassicFacings: True + ZOffset: -512 + turret: + Filename: ovldturi.shp + Facings: 32 + UseClassicFacings: True + ZOffset: -512 + +ovld.eradi: + Inherits: ^VehicleOverlays + idle: + Filename: ovldi.shp + Facings: 32 + UseClassicFacings: True + turret: + Filename: ovldturi.shp + Facings: 32 + UseClassicFacings: True + muzzle: + Filename: radhitsm.shp + IgnoreWorldTint: true + BlendMode: Additive + Length: * + icon: + Filename: ovlderadiicon.shp + +trpc: + Inherits: ^VehicleOverlays + idle: + Filename: trpc.shp + Facings: 32 + UseClassicFacings: True + icon: + Filename: trpcicon.shp + +reck: + Inherits: ifv + idle: + Filename: reck.shp + open: + Filename: reck.shp + Start: 3 + Length: 1 + unload: + Filename: reck.shp + Start: 3 + Length: 1 + icon: + Filename: reckicon.shp + +reck.destroyed: + Inherits: ifv.destroyed + idle: + Filename: reck.shp + +cycp: + Inherits: ^VehicleOverlays + idle: + Filename: cycp.shp + Facings: 32 + UseClassicFacings: True + icon: + Filename: cycpicon.shp + +cycp.destroyed: + Inherits: ^VehicleOverlays + idle: + Filename: cycp.shp + Facings: 32 + UseClassicFacings: True + ZOffset: -512 + +basi: + Inherits: ^VehicleOverlays + idle: + Filename: basi.shp + Facings: 32 + UseClassicFacings: True + icon: + Filename: basiicon.shp + +basi.destroyed: + Inherits: ^VehicleOverlays + idle: + Filename: basi.shp + Facings: 32 + UseClassicFacings: True + ZOffset: -512 + +pbul: + Inherits: ^VehicleOverlays + idle: + Filename: pbul.shp + Facings: 32 + UseClassicFacings: True + turret: + Filename: pbul.shp + Start: 32 + Facings: 32 + UseClassicFacings: True + icon: + Filename: pbulicnh.shp + +mant: + Inherits: ^VehicleOverlays + idle: + Filename: mant.shp + Facings: 32 + Stride: 2 + UseClassicFacings: True + move: + Filename: mant.shp + Facings: 32 + Length: 2 + Tick: 80 + UseClassicFacings: True + muzzle: + Filename: lasermuzzle.shp + Length: * + icon: + Filename: manticnh.shp + +mant.destroyed: + Inherits: ^VehicleOverlays + idle: + Filename: mant.shp + Facings: 32 + UseClassicFacings: True + ZOffset: -512 + +vipr: + Inherits: ^VehicleOverlays + idle: + Filename: vipr.shp + Facings: 1 + Start: 32 + turret: + Filename: vipr.shp + Facings: 32 + UseClassicFacings: True + muzzle: + Filename: lasermuzzle.shp + Frames: 0,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1 + Length: * + icon: + Filename: vipricnh.shp + +rhin: + Inherits: ^VehicleOverlays + idle: + Filename: rhin.shp + Facings: 32 + UseClassicFacings: True + turret: + Filename: rhin.shp + Start: 32 + Facings: 32 + UseClassicFacings: True + turret-upg: + Filename: rhinu.shp + Facings: 32 + UseClassicFacings: True + muzzle: + Filename: gunfire2.shp + Length: 5 + icon: + Filename: rhinicon.shp + +rhini: + Inherits: ^VehicleOverlays + idle: + Filename: rhini.shp + Facings: 32 + UseClassicFacings: True + turret: + Filename: rhin.shp + Start: 32 + Facings: 32 + UseClassicFacings: True + turret-upg: + Filename: rhinu.shp + Facings: 32 + UseClassicFacings: True + muzzle: + Filename: gunfire2.shp Length: 5 - icon: apociicon \ No newline at end of file + icon: + Filename: rhiniicon.shp + +rhiny: + Inherits: rhin + idle: + Filename: rhiny.shp + turret: + Filename: rhiny.shp + turret-upg: + Filename: rhinu.shp + Start: 32 + icon: + Filename: rhinyicon.shp + +rhinay: + Inherits: rhini + idle: + Filename: rhinay.shp + turret: + Filename: rhiny.shp + turret-upg: + Filename: rhinu.shp + Start: 32 + icon: + Filename: rhinayicon.shp + +rhin.destroyed: + Inherits: ^VehicleOverlays + idle: + Filename: rhin.shp + Facings: 32 + UseClassicFacings: True + turret: + Filename: rhin.shp + Start: 32 + Facings: 32 + UseClassicFacings: True + turret-upg: + Filename: rhinu.shp + Facings: 32 + UseClassicFacings: True + +thwk: + Inherits: ^VehicleOverlays + idle: + Filename: thwk.shp + Facings: 32 + UseClassicFacings: True + turret: + Filename: thwk.shp + Start: 32 + Facings: 32 + UseClassicFacings: True + turret-empty: + Filename: thwk.shp + Start: 64 + Facings: 32 + UseClassicFacings: True + icon: + Filename: thwkicnh.shp + +thwk.destroyed: + Inherits: ^VehicleOverlays + idle: + Filename: thwk.shp + Facings: 32 + UseClassicFacings: True + ZOffset: -512 + turret: + Filename: thwk.shp + Start: 64 + Facings: 32 + UseClassicFacings: True + ZOffset: -512 + +zeus: + Inherits: ^VehicleOverlays + idle: + Filename: zeus.shp + Facings: 32 + UseClassicFacings: True + shoot: + Filename: zeus.shp + Facings: 32 + Start: 32 + UseClassicFacings: True + active-overlay: + Filename: emp_fx01.shp + Length: * + BlendMode: Additive + Offset: 0, 0 + ZOffset: 512 + icon: + Filename: zeusicon.shp + +mole: + Inherits: ^VehicleOverlays + Defaults: + Filename: mole.shp + Tick: 50 + idle: + Frames: 20,19,18 + Length: 3 + Tick: 40 + paused: + Frames: 18 + unburrow: + Length: 19 + burrow: + Start: 20 + Length: 22 + empty: + Filename: empty.shp + +mole.destroyed: + Inherits: ^VehicleOverlays + idle: + Frames: 18 + Filename: mole.shp + ZOffset: -512 + +avtr: + Inherits: ^VehicleOverlays + Defaults: + Offset: 0, -5 + idle: + Filename: avtrbody.shp + Facings: 32 + UseClassicFacings: True + ZOffset: 512 + bodyidle: + Filename: avtrbody.shp + Facings: 32 + UseClassicFacings: True + ZOffset: 512 + bodymove: + Filename: avtrbody.shp + Start: 32 + Facings: 32 + UseClassicFacings: True + ZOffset: 512 + bodyshoot: + Filename: avtrbody.shp + Start: 64 + Facings: 32 + UseClassicFacings: True + ZOffset: 512 + Tick: 750 + bodymake: + Filename: avtrbody.shp + Start: 96 + Facings: 16 + Length: 10 + Tick: 140 + ZOffset: 512 + legsidle: + Filename: avtrlegs.shp + Facings: 32 + legsmove: + Filename: avtrlegs.shp + Start: 32 + Facings: 32 + Length: 10 + Tick: 140 + muzzle: + Filename: lasermuzzle.shp + Frames: 0,1,2,1,2,1,2,1,2 + Length: * + Offset: 0, 0 + muzzle-flame: + Combine: + 0: + Filename: flame-n.shp + Length: * + Offset: 3,6 + 1: + Filename: flame-nw.shp + Length: * + Offset: 8,7 + 2: + Filename: flame-w.shp + Length: * + Offset: 8,2 + 3: + Filename: flame-sw.shp + Length: * + Offset: 7,-2 + 4: + Filename: flame-s.shp + Length: * + Offset: 3,-2 + 5: + Filename: flame-se.shp + Length: * + Offset: -5,-2 + 6: + Filename: flame-e.shp + Length: * + Offset: -7,2 + 7: + Filename: flame-ne.shp + Length: * + Offset: -7,8 + Facings: 8 + Length: 13 + Offset: 0, 0 + muzzle-black: + Filename: flameblack.shp + Length: 13 + Facings: 8 + Offset: 0, 0 + icon: + Filename: avtricnh.shp + Offset: 0, 0 + +avtr.destroyed: + Inherits: ^VehicleOverlays + idle: + Filename: avtrlegs.shp + Facings: 32 + ZOffset: -512 + Offset: 0, -5 + +cust: + Inherits: ^VehicleOverlays + idle: + Filename: cust.shp + Facings: 32 + UseClassicFacings: True + spinner: + Filename: cust.shp + ZOffset: 512 + Start: 32 + Length: 8 + Tick: 80 + icon: + Filename: custicon.shp + +cust.destroyed: + Inherits: ^VehicleOverlays + idle: + Filename: cust.shp + Facings: 32 + UseClassicFacings: True + ZOffset: -512 diff --git a/mods/ca/tilesets/barren.yaml b/mods/ca/tilesets/barren.yaml index 5628c14e00..e0b4600823 100644 --- a/mods/ca/tilesets/barren.yaml +++ b/mods/ca/tilesets/barren.yaml @@ -13,25 +13,25 @@ Terrain: TerrainType@BlueTiberium: Type: BlueTiberium TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: 54FCFC RestrictPlayerColor: true TerrainType@Clear: Type: Clear TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: 876446 RestrictPlayerColor: true TerrainType@Gems: Type: Gems TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: 8470FF RestrictPlayerColor: true TerrainType@Ore: Type: Ore TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: 948060 RestrictPlayerColor: true TerrainType@River: @@ -41,7 +41,7 @@ Terrain: TerrainType@Road: Type: Road TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: 544031 TerrainType@Rock: Type: Rock @@ -50,12 +50,12 @@ Terrain: TerrainType@Rough: Type: Rough TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: 44443C TerrainType@Tiberium: Type: Tiberium TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: A1E21C RestrictPlayerColor: true TerrainType@Tree: @@ -65,7 +65,7 @@ Terrain: TerrainType@Wall: Type: Wall TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: D0C0A0 TerrainType@Water: Type: Water @@ -75,7 +75,7 @@ Terrain: TerrainType@Bridge: Type: Bridge TargetTypes: Ground, Bridge - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: 606060 TerrainType@Ford: Type: Ford diff --git a/mods/ca/tilesets/desert.yaml b/mods/ca/tilesets/desert.yaml index 84596c7630..120a676a59 100644 --- a/mods/ca/tilesets/desert.yaml +++ b/mods/ca/tilesets/desert.yaml @@ -13,7 +13,7 @@ Terrain: TerrainType@Bridge: Type: Bridge TargetTypes: Ground, Bridge - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: 606060 TerrainType@Brush: Type: Brush @@ -22,19 +22,19 @@ Terrain: TerrainType@Clear: Type: Clear TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: 865F45 RestrictPlayerColor: true TerrainType@Gems: Type: Gems TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: 8470FF RestrictPlayerColor: true TerrainType@Ore: Type: Ore TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: 948060 RestrictPlayerColor: true TerrainType@River: @@ -44,7 +44,7 @@ Terrain: TerrainType@Road: Type: Road TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: A87B53 TerrainType@Rock: Type: Rock @@ -53,7 +53,7 @@ Terrain: TerrainType@Rough: Type: Rough TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: 44443C TerrainType@Tree: Type: Tree @@ -62,7 +62,7 @@ Terrain: TerrainType@Wall: Type: Wall TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: D0C0A0 TerrainType@Water: Type: Water @@ -72,13 +72,13 @@ Terrain: TerrainType@BlueTiberium: Type: BlueTiberium TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: 54FCFC RestrictPlayerColor: true TerrainType@Tiberium: Type: Tiberium TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: A1E21C RestrictPlayerColor: true TerrainType@Ford: @@ -3783,4 +3783,4 @@ Templates: Categories: Water Cliffs Tiles: 0: Rock - 1: Rock \ No newline at end of file + 1: Rock diff --git a/mods/ca/tilesets/interior.yaml b/mods/ca/tilesets/interior.yaml index c27397eb4d..5e8bc7d1af 100644 --- a/mods/ca/tilesets/interior.yaml +++ b/mods/ca/tilesets/interior.yaml @@ -8,8 +8,8 @@ Terrain: TerrainType@Clear: Type: Clear TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch - Color: 000000 + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black + Color: 292929 TerrainType@ClearNoSmudges: Type: ClearNoSmudges TargetTypes: Ground @@ -17,13 +17,13 @@ Terrain: TerrainType@Gems: Type: Gems TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: 8470FF RestrictPlayerColor: true TerrainType@Ore: Type: Ore TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: 948060 RestrictPlayerColor: true TerrainType@Tree: @@ -33,18 +33,18 @@ Terrain: TerrainType@Wall: Type: Wall TargetTypes: Ground - Color: D0C0A0 + Color: C3C3C3 RestrictPlayerColor: true TerrainType@BlueTiberium: Type: BlueTiberium TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: 54FCFC RestrictPlayerColor: true TerrainType@Tiberium: Type: Tiberium TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: A1E21C RestrictPlayerColor: true diff --git a/mods/ca/tilesets/jungle.yaml b/mods/ca/tilesets/jungle.yaml index c93bb16a7e..8f43af20bf 100644 --- a/mods/ca/tilesets/jungle.yaml +++ b/mods/ca/tilesets/jungle.yaml @@ -13,25 +13,25 @@ Terrain: TerrainType@BlueTiberium: Type: BlueTiberium TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: 54FCFC RestrictPlayerColor: true TerrainType@Clear: Type: Clear TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: 89992a RestrictPlayerColor: true TerrainType@Gems: Type: Gems TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: 8470FF RestrictPlayerColor: true TerrainType@Ore: Type: Ore TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: 948060 RestrictPlayerColor: true TerrainType@River: @@ -41,7 +41,7 @@ Terrain: TerrainType@Road: Type: Road TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: 544031 TerrainType@Rock: Type: Rock @@ -50,12 +50,12 @@ Terrain: TerrainType@Rough: Type: Rough TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: 44443C TerrainType@Tiberium: Type: Tiberium TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: A1E21C RestrictPlayerColor: true TerrainType@Tree: @@ -65,7 +65,7 @@ Terrain: TerrainType@Wall: Type: Wall TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: D0C0A0 TerrainType@Water: Type: Water @@ -75,7 +75,7 @@ Terrain: TerrainType@Bridge: Type: Bridge TargetTypes: Ground, Bridge - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: 606060 TerrainType@Tunnel: Type: Tunnel @@ -3954,7 +3954,7 @@ Templates: Categories: Bridge Tiles: 0: Beach - 4: Bridge + 4: Bridge Template@714: Id: 714 Images: bridgev1.tem @@ -4340,4 +4340,4 @@ Templates: 4: Water 5: Water 6: Water - 7: Water \ No newline at end of file + 7: Water diff --git a/mods/ca/tilesets/snow.yaml b/mods/ca/tilesets/snow.yaml index 36dd28126b..4cfbd579ac 100644 --- a/mods/ca/tilesets/snow.yaml +++ b/mods/ca/tilesets/snow.yaml @@ -13,24 +13,24 @@ Terrain: TerrainType@Bridge: Type: Bridge TargetTypes: Ground, Bridge - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: 606060 TerrainType@Clear: Type: Clear TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: C4C4C4 RestrictPlayerColor: true TerrainType@Gems: Type: Gems TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: 8470FF RestrictPlayerColor: true TerrainType@Ore: Type: Ore TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: 948060 RestrictPlayerColor: true TerrainType@River: @@ -40,7 +40,7 @@ Terrain: TerrainType@Road: Type: Road TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: 587474 TerrainType@Rock: Type: Rock @@ -49,7 +49,7 @@ Terrain: TerrainType@Rough: Type: Rough TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: 44443C TerrainType@Tree: Type: Tree @@ -58,7 +58,7 @@ Terrain: TerrainType@Wall: Type: Wall TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: D0C0A0 TerrainType@Water: Type: Water @@ -68,13 +68,13 @@ Terrain: TerrainType@BlueTiberium: Type: BlueTiberium TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: 54FCFC RestrictPlayerColor: true TerrainType@Tiberium: Type: Tiberium TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: A1E21C RestrictPlayerColor: true TerrainType@Ford: @@ -3822,4 +3822,4 @@ Templates: 4: Water 5: Water 6: Water - 7: Water \ No newline at end of file + 7: Water diff --git a/mods/ca/tilesets/temperat.yaml b/mods/ca/tilesets/temperat.yaml index 7a8f3f39f2..7471d1fab8 100644 --- a/mods/ca/tilesets/temperat.yaml +++ b/mods/ca/tilesets/temperat.yaml @@ -13,24 +13,24 @@ Terrain: TerrainType@Bridge: Type: Bridge TargetTypes: Ground, Bridge - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: 606060 TerrainType@Clear: Type: Clear TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: 284428 RestrictPlayerColor: true TerrainType@Gems: Type: Gems TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: 8470FF RestrictPlayerColor: true TerrainType@Ore: Type: Ore TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: 948060 RestrictPlayerColor: true TerrainType@River: @@ -40,7 +40,7 @@ Terrain: TerrainType@Road: Type: Road TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: 5E430D TerrainType@Rock: Type: Rock @@ -49,7 +49,7 @@ Terrain: TerrainType@Rough: Type: Rough TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: 44443C TerrainType@Tree: Type: Tree @@ -58,7 +58,7 @@ Terrain: TerrainType@Wall: Type: Wall TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: D0C0A0 TerrainType@Water: Type: Water @@ -68,13 +68,13 @@ Terrain: TerrainType@BlueTiberium: Type: BlueTiberium TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: 54FCFC RestrictPlayerColor: true TerrainType@Tiberium: Type: Tiberium TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: A1E21C RestrictPlayerColor: true TerrainType@Tunnel: @@ -133,6 +133,68 @@ Templates: 13: Clear 14: Clear 15: Clear + Template@254: + Id: 254 + Images: gflr0001.int + Size: 1,1 + PickAny: True + Categories: Floor + Tiles: + 0: Clear + 1: Clear + 2: Clear + 3: Clear + 4: Clear + 5: Clear + 6: Clear + 7: Clear + 8: Clear + 9: Clear + 10: Clear + 11: Clear + 12: Clear + Template@253: + Id: 253 + Images: clearcity.tem + Size: 1,1 + PickAny: True + Categories: Floor + Tiles: + 0: Clear + 1: Clear + 2: Clear + 3: Clear + 4: Clear + 5: Clear + 6: Clear + 7: Clear + 8: Clear + 9: Clear + 10: Clear + 11: Clear + 12: Clear + 13: Clear + 14: Clear + 15: Clear + Template@65534: + Id: 65534 + Images: flor0001.int + Size: 1,1 + PickAny: True + Categories: Floor + Tiles: + 0: Clear + 1: Clear + 2: Clear + 3: Clear + 4: Clear + 5: Clear + 6: Clear + 7: Clear + 8: Clear + 9: Clear + 10: Clear + 11: Clear Template@1: Id: 1 Images: w1.tem @@ -2740,8 +2802,6 @@ Templates: 8: Rock 9: Rock 12: Rough - 13: Clear - 14: Clear Template@382: Id: 382 Images: bridge1x.tem @@ -3763,7 +3823,6 @@ Templates: Tiles: 0: Rock 1: Rock - Template@256: Id: 256 Images: hw01.tem @@ -3784,7 +3843,6 @@ Templates: 1: Road 2: Road 3: Road - Template@258: Id: 258 Images: hw03.tem @@ -3795,7 +3853,6 @@ Templates: 1: Road 2: Road 3: Road - Template@259: Id: 259 Images: hw04.tem @@ -3806,7 +3863,6 @@ Templates: 1: Road 2: Road 3: Road - Template@260: Id: 260 Images: hw05.tem @@ -3817,7 +3873,6 @@ Templates: 1: Road 2: Road 3: Road - Template@261: Id: 261 Images: hw06.tem @@ -3828,7 +3883,6 @@ Templates: 1: Road 2: Road 3: Road - Template@262: Id: 262 Images: hw07.tem @@ -3839,7 +3893,6 @@ Templates: 1: Road 2: Road 3: Road - Template@263: Id: 263 Images: hw08.tem @@ -3850,7 +3903,6 @@ Templates: 1: Road 2: Road 3: Road - Template@264: Id: 264 Images: hw09.tem @@ -3861,7 +3913,6 @@ Templates: 1: Road 2: Road 3: Road - Template@265: Id: 265 Images: hw10.tem @@ -3872,7 +3923,6 @@ Templates: 1: Road 2: Road 3: Road - Template@266: Id: 266 Images: hw11.tem @@ -3883,7 +3933,6 @@ Templates: 1: Road 2: Road 3: Road - Template@267: Id: 267 Images: hw12.tem @@ -3894,7 +3943,6 @@ Templates: 1: Road 2: Road 3: Road - Template@268: Id: 268 Images: hw13.tem @@ -3905,7 +3953,6 @@ Templates: 1: Road 2: Road 3: Road - Template@269: Id: 269 Images: hw14.tem @@ -3916,7 +3963,6 @@ Templates: 1: Road 2: Road 3: Road - Template@270: Id: 270 Images: hw15.tem @@ -3927,7 +3973,6 @@ Templates: 1: Road 2: Road 3: Road - Template@271: Id: 271 Images: hw16.tem @@ -3938,7 +3983,6 @@ Templates: 1: Road 2: Road 3: Road - Template@272: Id: 272 Images: hw17.tem @@ -3949,7 +3993,6 @@ Templates: 1: Road 2: Road 3: Road - Template@273: Id: 273 Images: hw18.tem @@ -3960,7 +4003,6 @@ Templates: 1: Road 2: Road 3: Road - Template@274: Id: 274 Images: hw19.tem @@ -3971,7 +4013,6 @@ Templates: 1: Road 2: Road 3: Road - Template@275: Id: 275 Images: hw20.tem @@ -3982,7 +4023,6 @@ Templates: 1: Road 2: Road 3: Road - Template@276: Id: 276 Images: hw21.tem @@ -3993,7 +4033,6 @@ Templates: 1: Road 2: Road 3: Road - Template@277: Id: 277 Images: hw22.tem @@ -4004,7 +4043,6 @@ Templates: 1: Road 2: Road 3: Road - Template@278: Id: 278 Images: hw23.tem @@ -4015,7 +4053,6 @@ Templates: 1: Road 2: Road 3: Road - Template@279: Id: 279 Images: hw24.tem @@ -4026,7 +4063,6 @@ Templates: 1: Road 2: Road 3: Clear - Template@280: Id: 280 Images: hw25.tem @@ -4037,7 +4073,6 @@ Templates: 1: Road 2: Clear 3: Road - Template@281: Id: 281 Images: hw26.tem @@ -4048,7 +4083,6 @@ Templates: 1: Road 2: Clear 3: Road - Template@800: Id: 800 Images: b4.tem @@ -4056,7 +4090,6 @@ Templates: Categories: Debris Tiles: 0: Rock - Template@801: Id: 801 Images: b5.tem @@ -4064,7 +4097,6 @@ Templates: Categories: Debris Tiles: 0: Rock - Template@802: Id: 802 Images: b6.tem @@ -4072,7 +4104,6 @@ Templates: Categories: Debris Tiles: 0: Rough - Template@803: Id: 803 Images: b7.tem @@ -4080,7 +4111,6 @@ Templates: Categories: Debris Tiles: 0: Rock - Template@804: Id: 804 Images: b8.tem @@ -4088,7 +4118,6 @@ Templates: Categories: Debris Tiles: 0: Rough - Template@805: Id: 805 Images: b9.tem @@ -4096,7 +4125,6 @@ Templates: Categories: Debris Tiles: 0: Rock - Template@806: Id: 806 Images: b10.tem @@ -4119,7 +4147,6 @@ Templates: 15: Rock 16: Rock 17: Rock - Template@807: Id: 807 Images: b11.tem @@ -4138,7 +4165,6 @@ Templates: 9: Clear 10: Clear 11: Clear - Template@808: Id: 808 Images: b12.tem @@ -4151,7 +4177,6 @@ Templates: 3: Rock 4: Rock 5: Rough - Template@809: Id: 809 Images: b13.tem @@ -4160,7 +4185,6 @@ Templates: Tiles: 0: Rock 1: Rock - Template@810: Id: 810 Images: b14.tem @@ -4170,7 +4194,6 @@ Templates: 0: Rock 1: Rock 2: Rock - Template@811: Id: 811 Images: b15.tem @@ -4179,7 +4202,6 @@ Templates: Tiles: 0: Rock 1: Rock - Template@812: Id: 812 Images: b16.tem @@ -4188,7 +4210,6 @@ Templates: Tiles: 0: Rock 1: Rock - Template@813: Id: 813 Images: b17.tem @@ -4200,7 +4221,6 @@ Templates: 3: Rock 4: Rock 5: Rock - Template@814: Id: 814 Images: p15.tem @@ -4225,7 +4245,6 @@ Templates: 1: Rough 2: Rough 3: Rough - Template@816: Id: 816 Images: p17.tem @@ -4240,7 +4259,6 @@ Templates: 6: Rock 7: Rock 8: Rock - Template@817: Id: 817 Images: p18.tem @@ -4262,7 +4280,6 @@ Templates: 12: Rock 13: Rock 14: Clear - Template@818: Id: 818 Images: p19.tem @@ -4278,7 +4295,6 @@ Templates: 12: Rock 13: Rock 14: Rock - Template@819: Id: 819 Images: p20.tem @@ -4299,7 +4315,6 @@ Templates: 18: Rock 19: Rock 20: Rock - Template@820: Id: 820 Images: p21.tem @@ -4314,7 +4329,6 @@ Templates: 5: Rock 6: Rock 7: Clear - Template@821: Id: 821 Images: p22.tem @@ -4328,7 +4342,6 @@ Templates: 5: Rock 6: Rock 7: Rock - Template@822: Id: 822 Images: p23.tem @@ -4532,7 +4545,7 @@ Templates: Categories: Bridge Tiles: 0: Beach - 4: Bridge + 4: Bridge Template@714: Id: 714 Images: bridgev1.tem @@ -4919,3 +4932,381 @@ Templates: 5: Water 6: Water 7: Water + Template@738: + Id: 738 + Images: cave01.tem + Size: 1,1 + Categories: Cliffs + Tiles: + 0: Rock + Template@739: + Id: 739 + Images: cave02.tem + Size: 2,3 + Categories: Cliffs + Tiles: + 1: Rock + 2: Rock + 3: Rock + 4: Rock + 5: Rock + Template@740: + Id: 740 + Images: cave03.tem + Size: 2,2 + Categories: Cliffs + Tiles: + 0: Rock + 1: Rock + 2: Rock + 3: Rock + Template@741: + Id: 741 + Images: cave04.tem + Size: 2,2 + Categories: Cliffs + Tiles: + 0: Rock + 1: Rock + 2: Rock + 3: Rock + Template@742: + Id: 742 + Images: cave05.tem + Size: 2,2 + Categories: Cliffs + Tiles: + 0: Rock + 1: Rock + 2: Rock + 3: Rock + Template@743: + Id: 743 + Images: cave06.tem + Size: 2,3 + Categories: Cliffs + Tiles: + 0: Rough + 2: Rock + 3: Rock + 5: Rock + Template@744: + Id: 744 + Images: cave07.tem + Size: 3,2 + Categories: Cliffs + Tiles: + 0: Rock + 1: Rock + 2: Clear + 3: Rock + 4: Rock + 5: Rock + Template@745: + Id: 745 + Images: cave08.tem + Size: 2,2 + Categories: Cliffs + Tiles: + 0: Rock + 1: Rock + 2: Rock + 3: Rock + Template@746: + Id: 746 + Images: cave09.tem + Size: 2,2 + Categories: Cliffs + Tiles: + 0: Rock + 1: Rock + 2: Rock + 3: Rock + Template@747: + Id: 747 + Images: cave10.tem + Size: 2,2 + Categories: Cliffs + Tiles: + 0: Rock + 1: Rock + 2: Rock + 3: Rock + Template@748: + Id: 748 + Images: cave11.tem + Size: 3,2 + Categories: Cliffs + Tiles: + 0: Rock + 1: Rock + 2: Rock + 3: Rock + 4: Rock + 5: Rock + Template@749: + Id: 749 + Images: cave12.tem + Size: 2,3 + Categories: Cliffs + Tiles: + 0: Rock + 1: Rock + 2: Rock + 3: Rock + 4: Rock + Template@750: + Id: 750 + Images: cave13.tem + Size: 2,2 + Categories: Cliffs + Tiles: + 0: Rock + 1: Rock + 2: Rock + 3: Rock + Template@751: + Id: 751 + Images: cave14.tem + Size: 2,2 + Categories: Cliffs + Tiles: + 0: Rock + 1: Rock + 2: Rock + 3: Rock + Template@752: + Id: 752 + Images: cave15.tem + Size: 2,2 + Categories: Cliffs + Tiles: + 0: Rock + 1: Rock + 2: Rock + 3: Rock + Template@753: + Id: 753 + Images: cave16.tem + Size: 2,3 + Categories: Cliffs + Tiles: + 0: Rock + 1: Rock + 2: Rock + 3: Rock + 4: Clear + 5: Rock + Template@754: + Id: 754 + Images: cave17.tem + Size: 3,2 + Categories: Cliffs + Tiles: + 0: Rock + 1: Rock + 2: Rock + 3: Clear + 4: Rock + 5: Rock + Template@755: + Id: 755 + Images: cave18.tem + Size: 2,2 + Categories: Cliffs + Tiles: + 0: Rock + 1: Rock + 2: Rock + 3: Rock + Template@756: + Id: 756 + Images: cave19.tem + Size: 2,2 + Categories: Cliffs + Tiles: + 0: Rock + 1: Rock + 2: Rock + 3: Rock + Template@757: + Id: 757 + Images: cave20.tem + Size: 2,2 + Categories: Cliffs + Tiles: + 0: Rock + 1: Rock + 2: Rock + 3: Rock + Template@758: + Id: 758 + Images: cave21.tem + Size: 3,2 + Categories: Cliffs + Tiles: + 0: Clear + 1: Rock + 2: Rock + 3: Rock + 4: Rock + 5: Rock + Template@759: + Id: 759 + Images: cave22.tem + Size: 2,2 + Categories: Cliffs + Tiles: + 0: Rock + 1: Rock + 2: Rock + 3: Rock + Template@760: + Id: 760 + Images: cave23.tem + Size: 2,2 + Categories: Cliffs + Tiles: + 0: Rock + 1: Rock + 2: Rock + 3: Rock + Template@761: + Id: 761 + Images: cave24.tem + Size: 2,2 + Categories: Cliffs + Tiles: + 0: Rock + 1: Rock + 2: Rough + Template@762: + Id: 762 + Images: cave25.tem + Size: 2,2 + Categories: Cliffs + Tiles: + 0: Rock + 1: Rock + 2: Rock + 3: Rock + Template@763: + Id: 763 + Images: cave26.tem + Size: 2,2 + Categories: Cliffs + Tiles: + 0: Rock + 1: Rock + 2: Rock + 3: Rock + Template@764: + Id: 764 + Images: cave27.tem + Size: 2,2 + Categories: Cliffs + Tiles: + 0: Rock + 1: Rock + 2: Rock + 3: Rock + Template@765: + Id: 765 + Images: cave28.tem + Size: 2,2 + Categories: Cliffs + Tiles: + 0: Rock + 1: Rock + 2: Rock + 3: Rock + Template@766: + Id: 766 + Images: cave29.tem + Size: 2,2 + Categories: Cliffs + Tiles: + 0: Rock + 1: Rock + 2: Rock + 3: Rock + Template@767: + Id: 767 + Images: cave30.tem + Size: 2,2 + Categories: Cliffs + Tiles: + 0: Rock + 1: Rock + 2: Rock + 3: Rock + Template@768: + Id: 768 + Images: cave31.tem + Size: 2,2 + Categories: Cliffs + Tiles: + 0: Rock + 1: Rock + 2: Rock + 3: Rock + Template@769: + Id: 769 + Images: cave32.tem + Size: 2,2 + Categories: Cliffs + Tiles: + 0: Rock + 1: Rock + 2: Rock + 3: Rock + Template@770: + Id: 770 + Images: cave33.tem + Size: 2,2 + Categories: Cliffs + Tiles: + 0: Rock + 1: Rock + 2: Rock + 3: Rock + Template@771: + Id: 771 + Images: cave34.tem + Size: 2,2 + Categories: Cliffs + Tiles: + 0: Rock + 1: Rock + 2: Rock + 3: Rock + Template@772: + Id: 772 + Images: cave35.tem + Size: 2,2 + Categories: Cliffs + Tiles: + 0: Rock + 1: Rock + 2: Rock + 3: Rock + Template@773: + Id: 773 + Images: cave36.tem + Size: 2,2 + Categories: Cliffs + Tiles: + 0: Rock + 1: Rock + 2: Rock + 3: Rock + Template@774: + Id: 774 + Images: cave37.tem + Size: 2,2 + Categories: Cliffs + Tiles: + 0: Rock + 1: Rock + 2: Rock + 3: Rock diff --git a/mods/ca/tilesets/winter.yaml b/mods/ca/tilesets/winter.yaml index bc1e708224..ff5465a681 100644 --- a/mods/ca/tilesets/winter.yaml +++ b/mods/ca/tilesets/winter.yaml @@ -13,25 +13,25 @@ Terrain: TerrainType@BlueTiberium: Type: BlueTiberium TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: 54FCFC RestrictPlayerColor: true TerrainType@Clear: Type: Clear TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: 285C30 RestrictPlayerColor: true TerrainType@Gems: Type: Gems TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: 8470FF RestrictPlayerColor: true TerrainType@Ore: Type: Ore TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: 948060 RestrictPlayerColor: true TerrainType@River: @@ -41,7 +41,7 @@ Terrain: TerrainType@Road: Type: Road TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: 544031 TerrainType@Rock: Type: Rock @@ -50,12 +50,12 @@ Terrain: TerrainType@Rough: Type: Rough TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: 44443C TerrainType@Tiberium: Type: Tiberium TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: A1E21C RestrictPlayerColor: true TerrainType@Tree: @@ -65,7 +65,7 @@ Terrain: TerrainType@Wall: Type: Wall TargetTypes: Ground - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: D0C0A0 TerrainType@Water: Type: Water @@ -75,7 +75,7 @@ Terrain: TerrainType@Bridge: Type: Bridge TargetTypes: Ground, Bridge - AcceptsSmudgeType: Crater, Scorch + AcceptsSmudgeType: Crater, Scorch, Scorch-NoFlame, Scorch-Black Color: 606060 TerrainType@Ford: Type: Ford @@ -3701,7 +3701,7 @@ Templates: 11: Clear Template@401: Id: 401 - Images: cliffsl1.tem + Images: cliffsl1.win Size: 1,2 Categories: Cliffs Tiles: @@ -3709,7 +3709,7 @@ Templates: 1: Rock Template@402: Id: 402 - Images: cliffsl2.tem + Images: cliffsl2.win Size: 1,2 Categories: Cliffs Tiles: @@ -3717,7 +3717,7 @@ Templates: 1: Rock Template@403: Id: 403 - Images: cliffsl3.tem + Images: cliffsl3.win Size: 2,1 Categories: Cliffs Tiles: @@ -3725,7 +3725,7 @@ Templates: 1: Rock Template@404: Id: 404 - Images: cliffsl4.tem + Images: cliffsl4.win Size: 2,1 Categories: Cliffs Tiles: @@ -4340,4 +4340,80 @@ Templates: 4: Water 5: Water 6: Water - 7: Water \ No newline at end of file + 7: Water + Template@738: + Id: 738 + Images: p15.win + Size: 4,2 + Categories: Debris + Tiles: + 0: Clear + 1: Clear + 2: Clear + 3: Clear + 4: Clear + 5: Clear + Template@739: + Id: 739 + Images: p16.win + Size: 2,2 + Categories: Debris + Tiles: + 0: Clear + 1: Clear + 2: Clear + 3: Clear + Template@740: + Id: 740 + Images: p17.win + Size: 4,2 + Categories: Debris + Tiles: + 2: Clear + 3: Clear + 4: Clear + 5: Clear + 6: Clear + 7: Clear + Template@741: + Id: 742 + Images: p18.win + Size: 4,3 + Categories: Debris + Tiles: + 0: Clear + 1: Clear + 4: Clear + 5: Clear + 6: Clear + 7: Clear + 10: Clear + 11: Clear + Template@743: + Id: 743 + Images: p19.win + Size: 6,2 + Categories: Debris + Tiles: + 2: Clear + 3: Clear + 4: Clear + 5: Clear + 6: Clear + 7: Clear + 8: Clear + 9: Clear + Template@744: + Id: 744 + Images: p20.win + Size: 4,3 + Categories: Debris + Tiles: + 0: Clear + 1: Clear + 2: Clear + 3: Clear + 6: Clear + 7: Clear + 10: Clear + 11: Clear diff --git a/mods/ca/uibits/branch-indicators.png b/mods/ca/uibits/branch-indicators.png new file mode 100644 index 0000000000..eb75b3309d Binary files /dev/null and b/mods/ca/uibits/branch-indicators.png differ diff --git a/mods/ca/uibits/ca-loading-artwork-2x.png b/mods/ca/uibits/ca-loading-artwork-2x.png index 23d9b07b4b..167cf3d699 100644 Binary files a/mods/ca/uibits/ca-loading-artwork-2x.png and b/mods/ca/uibits/ca-loading-artwork-2x.png differ diff --git a/mods/ca/uibits/ca-loading-artwork-3x.png b/mods/ca/uibits/ca-loading-artwork-3x.png index 09c538f2fc..2c893ab405 100644 Binary files a/mods/ca/uibits/ca-loading-artwork-3x.png and b/mods/ca/uibits/ca-loading-artwork-3x.png differ diff --git a/mods/ca/uibits/ca-loading-artwork.png b/mods/ca/uibits/ca-loading-artwork.png index 627cec4311..ad099c4fcc 100644 Binary files a/mods/ca/uibits/ca-loading-artwork.png and b/mods/ca/uibits/ca-loading-artwork.png differ diff --git a/mods/ca/uibits/ca-menu-logo-2x.png b/mods/ca/uibits/ca-menu-logo-2x.png index 131b3519bb..2885cfddd5 100644 Binary files a/mods/ca/uibits/ca-menu-logo-2x.png and b/mods/ca/uibits/ca-menu-logo-2x.png differ diff --git a/mods/ca/uibits/ca-menu-logo-3x.png b/mods/ca/uibits/ca-menu-logo-3x.png index 96a6ef94a4..3e3c7ac427 100644 Binary files a/mods/ca/uibits/ca-menu-logo-3x.png and b/mods/ca/uibits/ca-menu-logo-3x.png differ diff --git a/mods/ca/uibits/ca-menu-logo.png b/mods/ca/uibits/ca-menu-logo.png index 666309a6cf..95c98eb0e2 100644 Binary files a/mods/ca/uibits/ca-menu-logo.png and b/mods/ca/uibits/ca-menu-logo.png differ diff --git a/mods/ca/uibits/dialog.png b/mods/ca/uibits/dialog.png index 6fbfe0d95a..5e7c8c0118 100644 Binary files a/mods/ca/uibits/dialog.png and b/mods/ca/uibits/dialog.png differ diff --git a/mods/ca/uibits/encyclopedia/default.png b/mods/ca/uibits/encyclopedia/default.png new file mode 100644 index 0000000000..c771d13bb8 Binary files /dev/null and b/mods/ca/uibits/encyclopedia/default.png differ diff --git a/mods/ca/uibits/external-resources.png b/mods/ca/uibits/external-resources.png new file mode 100644 index 0000000000..c306ef13b4 Binary files /dev/null and b/mods/ca/uibits/external-resources.png differ diff --git a/mods/ca/uibits/flags.png b/mods/ca/uibits/flags.png new file mode 100644 index 0000000000..9e57b1ac5e Binary files /dev/null and b/mods/ca/uibits/flags.png differ diff --git a/mods/ca/uibits/glyphs-2x.png b/mods/ca/uibits/glyphs-2x.png index 9cf8bfc6ac..f9cd8019f2 100644 Binary files a/mods/ca/uibits/glyphs-2x.png and b/mods/ca/uibits/glyphs-2x.png differ diff --git a/mods/ca/uibits/glyphs-3x.png b/mods/ca/uibits/glyphs-3x.png index d9d1ff3182..41a4128081 100644 Binary files a/mods/ca/uibits/glyphs-3x.png and b/mods/ca/uibits/glyphs-3x.png differ diff --git a/mods/ca/uibits/glyphs.png b/mods/ca/uibits/glyphs.png index e3196ba168..6e09754832 100644 Binary files a/mods/ca/uibits/glyphs.png and b/mods/ca/uibits/glyphs.png differ diff --git a/mods/ca/uibits/loadscreen-2x.png b/mods/ca/uibits/loadscreen-2x.png deleted file mode 100644 index 259eb467d3..0000000000 Binary files a/mods/ca/uibits/loadscreen-2x.png and /dev/null differ diff --git a/mods/ca/uibits/loadscreen-3x.png b/mods/ca/uibits/loadscreen-3x.png deleted file mode 100644 index a8dfa625a2..0000000000 Binary files a/mods/ca/uibits/loadscreen-3x.png and /dev/null differ diff --git a/mods/ca/uibits/loadscreen.png b/mods/ca/uibits/loadscreen.png deleted file mode 100644 index 18c683c93c..0000000000 Binary files a/mods/ca/uibits/loadscreen.png and /dev/null differ diff --git a/mods/ca/uibits/player-ui-allies.png b/mods/ca/uibits/player-ui-allies.png new file mode 100644 index 0000000000..6efe7212e2 Binary files /dev/null and b/mods/ca/uibits/player-ui-allies.png differ diff --git a/mods/ca/uibits/player-ui-gdi.png b/mods/ca/uibits/player-ui-gdi.png new file mode 100644 index 0000000000..fc3a20b0c9 Binary files /dev/null and b/mods/ca/uibits/player-ui-gdi.png differ diff --git a/mods/ca/uibits/player-ui-nod.png b/mods/ca/uibits/player-ui-nod.png new file mode 100644 index 0000000000..46a26d48e4 Binary files /dev/null and b/mods/ca/uibits/player-ui-nod.png differ diff --git a/mods/ca/uibits/player-ui-scrin.png b/mods/ca/uibits/player-ui-scrin.png new file mode 100644 index 0000000000..7d6f02b6e4 Binary files /dev/null and b/mods/ca/uibits/player-ui-scrin.png differ diff --git a/mods/ca/uibits/player-ui-shared.png b/mods/ca/uibits/player-ui-shared.png new file mode 100644 index 0000000000..615c4f8e96 Binary files /dev/null and b/mods/ca/uibits/player-ui-shared.png differ diff --git a/mods/ca/uibits/player-ui-soviet.png b/mods/ca/uibits/player-ui-soviet.png new file mode 100644 index 0000000000..daf11096ec Binary files /dev/null and b/mods/ca/uibits/player-ui-soviet.png differ diff --git a/mods/ca/uibits/sidebar2.png b/mods/ca/uibits/sidebar2.png deleted file mode 100644 index 6d1f1c503d..0000000000 Binary files a/mods/ca/uibits/sidebar2.png and /dev/null differ diff --git a/mods/ca/uibits/sidebar3.png b/mods/ca/uibits/sidebar3.png deleted file mode 100644 index 2b24fe27df..0000000000 Binary files a/mods/ca/uibits/sidebar3.png and /dev/null differ diff --git a/mods/ca/weapons/ballistics.yaml b/mods/ca/weapons/ballistics.yaml index f7665e8dec..b89330782c 100644 --- a/mods/ca/weapons/ballistics.yaml +++ b/mods/ca/weapons/ballistics.yaml @@ -3,7 +3,7 @@ Range: 4c768 Report: cannon1.aud Projectile: Bullet - Speed: 682 + Speed: 750 Image: 120MM Shadow: true Warhead@1Dam: SpreadDamage @@ -20,7 +20,7 @@ SmudgeType: Crater InvalidTargets: Vehicle, Structure, Wall, Husk, Trees Warhead@3Eff: CreateEffect - Explosions: small_explosion + Explosions: small_explosion, small_explosion_alt1, small_explosion_alt2, small_explosion_alt3 ImpactSounds: kaboom12.aud ValidTargets: Ground, Ship, Trees Warhead@4EffWater: CreateEffect @@ -39,25 +39,24 @@ Warhead@1Dam: SpreadDamage Damage: 3100 Versus: - None: 32 - Wood: 52 + None: 25 + Wood: 60 Light: 116 - Heavy: 70 - Concrete: 40 - Brick: 32 + Heavy: 75 + Concrete: 30 25mmFRAG: Inherits: ^Cannon + Range: 5c768 Report: tnkfire3.aud Warhead@1Dam: SpreadDamage Spread: 426 Versus: None: 82 - Wood: 180 + Wood: 140 Light: 100 Heavy: 28 - Concrete: 100 - Brick: 32 + Concrete: 140 Warhead@3EffGround: CreateEffect Explosions: large_explosion ImpactSounds: kaboom12.aud @@ -69,14 +68,48 @@ Report: tnkfire3.aud Warhead@1Dam: SpreadDamage Damage: 3500 + Versus: + Wood: 52 + Heavy: 70 + Concrete: 35 + +76mm: + Inherits: ^Cannon + Range: 5c0 + Report: smallcan3.aud + Projectile: Bullet + LaunchAngle: 62 + Speed: 426 + Warhead@1Dam: SpreadDamage + Spread: 341 + Damage: 6000 + Versus: + None: 92 + Wood: 90 + Concrete: 75 + Light: 100 + Heavy: 15 + DamageTypes: Prone50Percent, TriggerProne, SmallExplosionDeath, FlakVestMitigated + Warhead@3Eff: CreateEffect + Explosions: large_explosion + ImpactSounds: kaboom12.aud + ValidTargets: Ground, Ship, Trees 90mm: Inherits: ^Cannon Warhead@1Dam: SpreadDamage Versus: - Concrete: 50 + Concrete: 48 Heavy: 115 +105mm: + Inherits: 90mm + Report: vgriatta.aud, vgriattb.aud, vgriattc.aud + Warhead@1Dam: SpreadDamage + Damage: 4300 + Versus: + Light: 95 + 120mm: Inherits: 90mm ReloadDelay: 55 @@ -86,19 +119,22 @@ Versus: Light: 95 +120mm.Drone: + Inherits: 120mm + ReloadDelay: 30 + Warhead@1Dam: SpreadDamage + Damage: 1900 + 120mmHEAT: - Inherits: 90mm + Inherits: 25mm + ReloadDelay: 50 Report: vmiratta.aud Projectile: Bullet Image: 120MMHEATN Warhead@1Dam: SpreadDamage - Damage: 4100 + Damage: 6000 Versus: - None: 55 - Wood: 80 - Concrete: 45 - Light: 95 - Brick: 32 + None: 30 DamageTypes: Prone50Percent, TriggerProne, FireDeath Warhead@3Eff: CreateEffect ImpactSounds: firetrt1.aud @@ -109,49 +145,152 @@ Burst: 2 Warhead@1Dam: SpreadDamage Versus: - Concrete: 40 + Concrete: 48 Heavy: 115 +125mmRhino: + Inherits: 125mm + Report: vrhiatta.aud, vrhiattb.aud, vrhiattc.aud, vrhiattd.aud + Burst: 1 + ReloadDelay: 75 + Warhead@1Dam: SpreadDamage + Damage: 8350 + 125mmLasher: Inherits: 125mm + Report: vlasatta.aud Burst: 1 Warhead@1Dam: SpreadDamage Damage: 7000 +125mmAtomic: + Inherits: 125mm + Projectile: Bullet + Image: radball + Warhead@1Dam: SpreadDamage + Spread: 341 + Warhead@3Eff: CreateEffect + Explosions: radhitsm + ExplosionPalette: caneon + Inaccuracy: 256 + Warhead@18Radio: CreateTintedCells + Spread: 1c256 + Level: 200 + Falloff: 100, 32 + LayerName: radioactivity.weak + +125mmLasherAtomic: + Inherits: 125mmLasher + Projectile: Bullet + Image: radball + Warhead@1Dam: SpreadDamage + Spread: 341 + Warhead@3Eff: CreateEffect + Explosions: radhitsm + ExplosionPalette: caneon + Inaccuracy: 256 + Warhead@18Radio: CreateTintedCells + Spread: 1c256 + Level: 400 + Falloff: 100, 32 + LayerName: radioactivity.weak + +125mmRhinoAtomic: + Inherits: 125mmRhino + Projectile: Bullet + Image: radball + Warhead@1Dam: SpreadDamage + Spread: 341 + Warhead@3Eff: CreateEffect + Explosions: radhitsm + ExplosionPalette: caneon + Inaccuracy: 256 + Warhead@18Radio: CreateTintedCells + Spread: 1c256 + Level: 400 + Falloff: 100, 32 + LayerName: radioactivity.weak + 130mm: Inherits: ^Cannon - ReloadDelay: 90 + ReloadDelay: 80 Burst: 2 - InvalidTargets: Air, AirSmall, Infantry + InvalidTargets: Infantry Warhead@1Dam: SpreadDamage Damage: 6000 Versus: + Concrete: 60 Light: 85 Heavy: 115 - InvalidTargets: Air, AirSmall + +130mmAtomic: + Inherits: 130mm + Projectile: Bullet + Image: radball + Warhead@1Dam: SpreadDamage + Spread: 341 + Warhead@3Eff: CreateEffect + Explosions: radhitsm + ExplosionPalette: caneon + Inaccuracy: 256 + Warhead@18Radio: CreateTintedCells + Spread: 1c256 + Level: 200 + Falloff: 100, 32 + LayerName: radioactivity.weak 130mmTD: Inherits: 130mm Report: tnkfire6.aud +130mmTD.Drone: + Inherits: 130mmTD + ReloadDelay: 28 + Warhead@1Dam: SpreadDamage + Damage: 2000 + +135mm: + Inherits: 130mm + Range: 5c768 + Report: voveweaa.aud, voveweab.aud, voveweac.aud + -InvalidTargets: + Warhead@1Dam: SpreadDamage + Spread: 256 + Damage: 8300 + Versus: + None: 60 + Warhead@3EffGround: CreateEffect + Explosions: large_explosion + ImpactSounds: kaboom12.aud + +135mmAtomic: + Inherits: 130mmAtomic + Range: 5c768 + Report: voveweaa.aud, voveweab.aud, voveweac.aud + -InvalidTargets: + Warhead@1Dam: SpreadDamage + Damage: 8300 + Versus: + None: 60 + 152mm: Inherits: ^Cannon ReloadDelay: 135 Report: vapoat1a.aud - Range: 5c0 + Range: 5c768 Burst: 2 BurstDelays: 8 - InvalidTargets: Air, AirSmall Warhead@1Dam: SpreadDamage - Damage: 4750 + Damage: 4500 Falloff: 368, 184, 80, 18, 0 Versus: None: 40 Tree: 200 - Light: 85 + Light: 92 Heavy: 115 - Wood: 45 - InvalidTargets: Air, AirSmall + Wood: 75 + Concrete: 60 + DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath, FlakVestMitigated Warhead@3Eff_impact: CreateEffect Explosions: nuke3 ImpactSounds: kaboom1.aud, kaboom22.aud @@ -161,28 +300,38 @@ SmudgeType: Scorch InvalidTargets: Vehicle, Structure, Wall, Trees Warhead@18Radio: CreateTintedCells - Level: 250 + Level: 125 Falloff: 100, 55, 32, 5 LayerName: radioactivity.weak +152mmAtomic: + Inherits: 152mm + Projectile: Bullet + Image: radball + Warhead@1Dam: SpreadDamage + Versus: + None: 60 + DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath + Warhead@18Radio: CreateTintedCells + Level: 250 + 183mm: Inherits: ^Cannon ReloadDelay: 100 Report: tnkfire6.aud - Range: 5c0 + Range: 7c0 Projectile: Bullet Speed: 768 Image: 183MM Warhead@1Dam: SpreadDamage Damage: 12000 Versus: - Heavy: 170 + Heavy: 160 None: 10 Wood: 15 - Light: 35 - Concrete: 20 - Brick: 32 - InvalidTargets: Air, AirSmall + Light: 60 + Concrete: 48 + DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath, TankBuster TurretGun: Inherits: ^Cannon @@ -193,7 +342,8 @@ TurretGun: Damage: 6000 Versus: None: 20 - Wood: 50 + Wood: 58 + Concrete: 40 Light: 75 Warhead@3EffGround: CreateEffect Explosions: large_explosion @@ -206,15 +356,15 @@ TurretGunTD: TitanGun: Inherits: TurretGunTD - ReloadDelay: 90 + ReloadDelay: 80 Report: vtadatta.aud, vtadattb.aud, vtadattc.aud Range: 5c0 Warhead@1Dam: SpreadDamage - Damage: 14000 + Damage: 14500 Versus: - None: 50 - Wood: 62 - Concrete: 30 + None: 30 + Wood: 70 + Concrete: 60 Light: 70 Heavy: 105 @@ -236,17 +386,18 @@ TitanGun: Light: 60 Heavy: 25 Concrete: 60 - Brick: 60 - DamageTypes: Prone50Percent, TriggerProne, SmallExplosionDeath + Brick: 100 + DamageTypes: Prone50Percent, TriggerProne, SmallExplosionDeath, FlakVestMitigated Warhead@3Eff: CreateEffect Explosions: artillery_explosion ImpactSounds: kaboom25.aud Warhead@4EffWater: CreateEffect Explosions: med_splash + ImpactSounds: splashm1.aud, splashm2.aud, splashm3.aud 155mm: Inherits: ^Artillery - ReloadDelay: 75 + ReloadDelay: 85 MinRange: 2c0 Report: tank5.aud Range: 8c768 @@ -255,15 +406,14 @@ TitanGun: Speed: 195 Inaccuracy: 1c138 Warhead@1Dam: SpreadDamage - Damage: 8100 + Damage: 9750 Falloff: 100, 55, 20, 5 Versus: - None: 90 + None: 70 Wood: 100 - Concrete: 100 - Brick: 100 - Light: 100 - Heavy: 42 + Concrete: 70 + Light: 80 + Heavy: 35 155mmTD: Inherits: 155mm @@ -273,33 +423,49 @@ TitanGun: 155mmTDM: Inherits: 155mmTD - ReloadDelay: 85 Range: 7c768 + Report: howi-fire1.aud, howi-fire2.aud + ReloadDelay: 100 + Projectile: Bullet + Speed: 682 + LaunchAngle: 50 + Inaccuracy: 448 + Warhead@1Dam: SpreadDamage + Damage: 11500 + Spread: 341 + Versus: + Wood: 65 + Warhead@3Eff: CreateEffect + Explosions: large_explosion + ImpactSounds: kaboom12.aud 155mmSpec: - Inherits: 155mmTD + Inherits: ^Artillery Report: spec-fire1.aud, spec-fire2.aud ReloadDelay: 200 MinRange: 3c0 Range: 13c0 Burst: 3 BurstDelays: 7 + TargetActorCenter: true Projectile: Bullet Image: firetrail TrailImage: smokey TrailDelay: 1 Speed: 180 + Inaccuracy: 1c138 LaunchAngle: 90 Warhead@1Dam: SpreadDamage - Damage: 12000 + Damage: 8500 + Falloff: 100, 55, 20, 5 Versus: - None: 70 - Wood: 55 - Light: 45 - Heavy: 25 - Concrete: 50 + None: 100 + Wood: 95 + Light: 60 + Heavy: 35 + Concrete: 70 Brick: 20 - DamageTypes: Prone50Percent, TriggerProne, FireDeath + DamageTypes: Prone50Percent, TriggerProne, FireDeath, FlakVestMitigatedMinor Warhead@2Smu: LeaveSmudge SmudgeType: Scorch Warhead@3Eff: CreateEffect @@ -320,7 +486,6 @@ TitanGun: -Projectile: Projectile: InstantHit -Warhead@1Dam: - Warhead@1Dum: Dummy -Warhead@2Smu: -Warhead@3Eff: -Warhead@Flames: @@ -337,15 +502,14 @@ TitanGun: Image: 380mm Inaccuracy: 1c138 Warhead@1Dam: SpreadDamage - Damage: 25000 + Damage: 30000 Falloff: 100, 55, 20, 5 Versus: - None: 65 + None: 55 Wood: 100 Concrete: 100 - Brick: 100 - Light: 85 - Heavy: 38 + Light: 70 + Heavy: 26 Warhead@2Dam: SpreadDamage Damage: 70000 Spread: 341 @@ -354,14 +518,14 @@ TitanGun: Warhead@3Eff: CreateEffect Explosions: large_artillery_explosion ImpactSounds: artyhit.aud, artyhit2.aud, artyhit3.aud - Warhead@Concussion1: GrantExternalCondition - Range: 1c512 - Duration: 140 + Warhead@Concussion1: GrantExternalConditionCA + Range: 0c768 + Duration: 150 Condition: concussion ValidTargets: Ground, Infantry, Vehicle, Ship - Warhead@Concussion2: GrantExternalCondition - Range: 3c0 - Duration: 70 + Warhead@Concussion2: GrantExternalConditionCA + Range: 1c768 + Duration: 50 Condition: concussion ValidTargets: Ground, Infantry, Vehicle, Ship Warhead@5Shake: ShakeScreen @@ -369,6 +533,95 @@ TitanGun: Intensity: 1 Multiplier: 0.5,0.5 +380mmAtomic: + Inherits: 380mm + Projectile: Bullet + Image: 380mma + Warhead@3Eff_impact: CreateEffect + Explosions: nuke3 + ImpactActors: false + Warhead@6Smu_areanuke1: LeaveSmudge + Size: 1 + SmudgeType: Scorch + InvalidTargets: Vehicle, Structure, Wall, Trees + Warhead@18Radio: CreateTintedCells + Level: 300 + Falloff: 100, 55, 32, 5 + LayerName: radioactivity.weak + +280mmAtomic: + Inherits: ^Artillery + ReloadDelay: 200 + Report: vnukweaa.aud + MinRange: 4c0 + Range: 18c0 + TargetActorCenter: true + Projectile: Bullet + Speed: 180 + Image: 280mma + LaunchAngle: 92 + Inaccuracy: 768 + Warhead@1Dam: SpreadDamage + Spread: 512 + Damage: 6000 + Falloff: 1000, 448, 192, 50, 18, 7, 0 + Versus: + None: 60 + Wood: 100 + Concrete: 100 + Light: 70 + Heavy: 60 + Warhead@2Dam: SpreadDamage + Damage: 70000 + Spread: 341 + ValidTargets: Infantry + DamageTypes: Prone50Percent, TriggerProne, SmallExplosionDeath + Warhead@3Eff: CreateEffect + Explosions: nuke3 + ImpactActors: false + ImpactSounds: gexpnuka.aud + Warhead@5Shake: ShakeScreen + Duration: 5 + Intensity: 1 + Multiplier: 0.5,0.5 + Warhead@6Smu_areanuke1: LeaveSmudge + Size: 1 + SmudgeType: Scorch + InvalidTargets: Vehicle, Structure, Wall, Trees + Warhead@18Radio: CreateTintedCells + Level: 300 + Falloff: 100, 55, 32, 5 + LayerName: radioactivity.weak + +280mmNeutron: + Inherits: 280mmAtomic + Projectile: Bullet + Image: 280mmn + Warhead@1Dam: SpreadDamage + Damage: 3000 + Warhead@3: ChangeOwnerToNeutral + ValidTargets: DriverKill + InvalidTargets: DriverKillImmune + ValidRelationships: Enemy, Ally + CargoEffect: Kill + Range: 3c511 + Warhead@Flash: FlashTarget + Spread: 3c511 + Color: ffffff + ValidTargets: DriverKill + InvalidTargets: DriverKillImmune + ValidRelationships: Enemy, Ally + Warhead@3Eff: CreateEffect + Explosions: fuelbomb1, fuelbomb2 + ImpactSounds: gexpneua.aud, gexpneub.aud, gexpneuc.aud, gexpneud.aud + +NukeCannonDeployer: + ReloadDelay: 10 + MinRange: 4c0 + Range: 16c0 + TargetActorCenter: true + Projectile: InstantHit + 8Inch: Inherits: ^Artillery MinRange: 3c0 @@ -378,10 +631,11 @@ TitanGun: TargetActorCenter: true Projectile: Bullet Speed: 345 - LaunchAngle: 40 - Inaccuracy: 2c511 + LaunchAngle: 42 + Inaccuracy: 0c156 + InaccuracyType: PerCellIncrement Warhead@1Dam: SpreadDamage - Spread: 256 + Spread: 341 Damage: 2000 Falloff: 1000, 368, 135, 50, 18, 7, 0 Versus: @@ -400,9 +654,9 @@ TitanGun: JuggernautGun: Inherits: ^Artillery - MinRange: 2c0 - ReloadDelay: 120 - Range: 10c0 + MinRange: 3c0 + ReloadDelay: 110 + Range: 9c0 Burst: 3 StartBurstReport: jugger1.aud TargetActorCenter: true @@ -410,32 +664,46 @@ JuggernautGun: Inaccuracy: 1c138 Warhead@1Dam: SpreadDamage Spread: 348 - Damage: 1300 + Damage: 1125 Falloff: 800, 368, 135, 50, 18, 7, 0 Versus: - None: 90 + None: 100 + Wood: 75 Heavy: 35 + Light: 65 Concrete: 45 - Brick: 55 Warhead@4EffWater: CreateEffect Explosions: large_splash +JuggernautGunTargeting: + Inherits: JuggernautGun + ReloadDelay: 25 + -Report: + -Burst: + -StartBurstReport: + -Projectile: + -Warhead@1Dam: + -Warhead@2Smu: + -Warhead@3Eff: + -Warhead@4EffWater: + Projectile: InstantHit + 2Inch: Inherits: ^Cannon ReloadDelay: 40 Range: 5c512 Report: cannon2.aud - InvalidTargets: Underwater + InvalidTargets: Submarine Projectile: Bullet - Speed: 426 + Speed: 682 Warhead@1Dam: SpreadDamage + InvalidTargets: Submarine Versus: None: 15 Wood: 30 Light: 75 Heavy: 90 Concrete: 20 - Brick: 20 Grenade: Inherits: ^Artillery @@ -447,45 +715,51 @@ Grenade: Image: BOMB Warhead@1Dam: SpreadDamage Spread: 256 - Damage: 3000 - Versus: - None: 80 - Wood: 100 - Light: 90 - Concrete: 100 - Brick: 100 - Warhead@2Dam: SpreadDamage - Spread: 28 - Damage: 3000 + Damage: 6000 Versus: - None: 200 + None: 60 Wood: 100 Light: 90 - Heavy: 25 - Concrete: 100 - DamageTypes: Prone50Percent, TriggerProne, SmallExplosionDeath + Concrete: 75 + Brick: 45 Warhead@3Eff: CreateEffect Explosions: med_explosion Warhead@4EffWater: CreateEffect Explosions: small_splash -GrenadeE: +GrenadeJJ: Inherits: Grenade - Range: 6c768 + Range: 7c0 + Report: jjgren1.aud, jjgren2.aud + Projectile: Bullet + ContrailLength: 30 + ContrailStartColorAlpha: 100 + Speed: 200 + Inaccuracy: 128 + Warhead@1Dam: SpreadDamage + Damage: 7000 + Versus: + None: 100 + Wood: 75 + Concrete: 75 + Heavy: 15 + Light: 90 + DamageTypes: Prone50Percent, TriggerProne, SmallExplosionDeath, FlakVestMitigated, AirToGround EMPGrenade: Inherits: Grenade Projectile: Bullet Image: empgren Warhead@1Dam: SpreadDamage + Versus: + Concrete: 85 DamageTypes: Prone50Percent, TriggerProne, ElectricityDeath - Warhead@2Dam: SpreadDamage - DamageTypes: Prone50Percent, TriggerProne, ElectricityDeath - Warhead@5emp: GrantExternalCondition + Warhead@5emp: GrantExternalConditionCA Range: 0c768 Duration: 40 Condition: empdisable - ValidTargets: Ground, Structure, Vehicle + ValidTargets: Vehicle, Ship, Structure + InvalidTargets: EmpImmune Warhead@3Eff: CreateEffect -ImpactSounds: Warhead@6Eff: CreateEffect @@ -497,41 +771,69 @@ EMPGrenade: ShadowOperativeGrenade: Inherits: Grenade ReloadDelay: 50 - ValidTargets: Structure, Vehicle, Ship + InvalidTargets: Infantry Projectile: Bullet Image: shadgren - Warhead@2Dam: SpreadDamage + Warhead@1Dam: SpreadDamage + Damage: 7000 Versus: + Concrete: 100 Light: 100 - Heavy: 100 + Heavy: 75 + ValidRelationships: Enemy, Neutral ShadowGliderGrenade: Range: 1c0 + ReloadDelay: 100 Inherits: ShadowOperativeGrenade - -ValidTargets: + -InvalidTargets: Projectile: LaunchAngle: 0 -Mortar: - Inherits: ^Artillery +^Mortar: ReloadDelay: 90 Range: 7c0 - MinRange: 1c0 + MinRange: 2c0 Report: nade.aud Projectile: Bullet - Speed: 166 - LaunchAngle: 92 + Speed: 150 + LaunchAngle: 140 Inaccuracy: 768 - Image: BOMB + Image: flakball + ContrailLength: 9 + ContrailStartColor: ccccccaa + ContrailStartColorAlpha: 68 + ContrailStartWidth: 42 + Blockable: false Warhead@1Dam: SpreadDamage - Damage: 5500 + Spread: 426 + Damage: 5250 + Falloff: 100, 50, 25, 0 Versus: - None: 60 - Wood: 100 + None: 100 + Wood: 90 Light: 45 Heavy: 45 - Concrete: 50 - Brick: 75 + Concrete: 40 + DamageTypes: Prone50Percent, TriggerProne, SmallExplosionDeath, FlakVestMitigated + Warhead@4EffWater: CreateEffect + Explosions: small_splash + ImpactSounds: splashm1.aud, splashm2.aud, splashm3.aud + ValidTargets: Water, Underwater + InvalidTargets: Ship, Structure, Bridge + +ChemicalMortar: + Inherits: ^Mortar + Projectile: Bullet + Image: radball + ContrailStartColor: 00ff0044 + Warhead@1Dam: SpreadDamage + DamageTypes: Prone50Percent, TriggerProne, RadiationDeath + Warhead@2Dam: SpreadDamage + Damage: 8000 + Spread: 426 + Falloff: 100, 50, 25, 0 + ValidTargets: Cyborg DamageTypes: Prone50Percent, TriggerProne, RadiationDeath Warhead@2Smu: LeaveSmudge SmudgeType: Scorch-NoFlame @@ -539,9 +841,6 @@ Mortar: Explosions: small_chem ExplosionPalette: temptd ImpactSounds: firetrt1.aud - Warhead@4EffWater: CreateEffect - Explosions: small_splash - ImpactSounds: splashm1.aud, splashm2.aud, splashm3.aud Warhead@18Radio: CreateTintedCells Spread: 1c0 Level: 50 @@ -549,17 +848,88 @@ Mortar: MaxLevel: 300 LayerName: radioactivity.weak -MortarE: - Inherits: Mortar - Range: 8c768 +CryoMortar: + Inherits: ^Mortar + Projectile: Bullet + Image: cryoball + ContrailStartColor: 8fc6ffaa + Warhead@1Dam: SpreadDamage + Damage: 2500 + Versus: + None: 90 + Brick: 5 + DamageTypes: Prone50Percent, TriggerProne, FrozenDeath + Warhead@3Eff: CreateEffect + Explosions: cryohit + ExplosionPalette: ra2effect-ignore-lighting-alpha75 + ImpactSounds: cryoblast.aud + Warhead@chill1: GrantExternalConditionCA + Condition: chilled + Duration: 125 + Range: 0c682 + ValidRelationships: Enemy, Neutral + Warhead@chill2: GrantExternalConditionCA + Condition: chilled + Duration: 75 + Range: 1c340 + ValidRelationships: Enemy, Neutral + Warhead@chillally: GrantExternalConditionCA + Condition: chilled + Duration: 50 + Range: 0c682 + ValidRelationships: Ally + Warhead@cryoresidue: CreateTintedCells + LayerName: cryoresidue + Spread: 1c0 + Level: 50 + Falloff: 100, 75, 52, 15, 2 + MaxLevel: 600 + +SonicMortar: + Inherits: ^Mortar + Warhead@1Dam: SpreadDamage + Versus: + None: 75 + Wood: 100 + Light: 60 + Heavy: 30 + Concrete: 100 + Warhead@concussion: GrantExternalConditionCA + Condition: concussion + Duration: 100 + Range: 1c768 + Warhead@3Eff: CreateEffect + Explosions: sonicimpact + ExplosionPalette: effect + ImpactSounds: sonicmortarhit1.aud, sonicmortarhit2.aud + Warhead@4Eff: CreateEffect + Explosions: med_explosion + +HallucinationGrenade: + Inherits: ^Mortar + ReloadDelay: 130 + Projectile: Bullet + ContrailStartColor: dc289c + ContrailStartColorAlpha: 128 + Warhead@1Dam: SpreadDamage + Damage: 2500 + Warhead@chaos: GrantExternalConditionCA + Range: 0c768 + Duration: 75 + Condition: berserk + InvalidTargets: ChaosImmune + Warhead@3Eff: CreateEffect + Explosions: chaosexplosion + ExplosionPalette: caneon + ImpactSounds: firebl3.aud DepthCharge: Inherits: ^Artillery -Report: Range: 5c0 - ValidTargets: Underwater + ValidTargets: Submarine Projectile: Bullet - Speed: 125 + Speed: 180 Image: BOMB Inaccuracy: 128 Warhead@1Dam: SpreadDamage @@ -581,44 +951,38 @@ DepthCharge: ImpactSounds: kaboom15.aud ValidTargets: Submarine -DepthCharge.destroyer: +DoubleDepthCharge: Inherits: DepthCharge Burst: 2 BurstDelays: 5 Projectile: Bullet - Inaccuracy: 256 + Inaccuracy: 192 203mm: ReloadDelay: 120 - InvalidTargets: Air, AirSmall - Range: 9c0 - MinRange: 2c0 - Burst: 3 - BurstDelays: 10 + Range: 10c0 + MinRange: 2c512 Report: hvygun10.aud Projectile: Bullet Speed: 286 Blockable: false LaunchAngle: 50 - Inaccuracy: 1c382 + Inaccuracy: 128 Image: 120MM Warhead@1Dam: SpreadDamage - InvalidTargets: Air, AirSmall - Spread: 626 + Spread: 512 Falloff: 100, 50, 15, 5, 0 Damage: 15000 Versus: - None: 40 - Wood: 20 + None: 35 + Wood: 30 Light: 60 - Heavy: 50 + Heavy: 70 Concrete: 0 - Brick: 60 DamageTypes: Prone50Percent, TriggerProne, SmallExplosionDeath Warhead@2Dam: SpreadDamage - InvalidTargets: Air, AirSmall ValidRelationships: Enemy, Neutral - Spread: 626 + Spread: 512 Falloff: 100, 50, 15, 5, 0 Damage: 15000 Versus: @@ -642,21 +1006,25 @@ DepthCharge.destroyer: ValidTargets: Water, Underwater InvalidTargets: Ship, Structure, Bridge +203mm.Inacc: + Inherits: 203mm + Projectile: Bullet + Inaccuracy: 1c382 + GuardianDroneGun: Inherits: 25mm + ReloadDelay: 80 + Burst: 3 + BurstDelays: 2 Report: gdrn-fire1.aud, gdrn-fire2.aud + Projectile: Bullet + Speed: 1c0 Warhead@1Dam: SpreadDamage - Damage: 2000 + Damage: 2600 Versus: - Light: 85 + Wood: 65 + Concrete: 35 + Light: 70 Heavy: 100 - -BATFGun: - Inherits: 25mm - Warhead@1Dam: SpreadDamage - Damage: 1900 - Versus: - Wood: 40 - Concrete: 15 - Light: 100 - Heavy: 50 + Warhead@3Eff: CreateEffect + ImpactSounds: kaboom12s.aud diff --git a/mods/ca/weapons/custom/campaign.yaml b/mods/ca/weapons/custom/campaign.yaml new file mode 100644 index 0000000000..07b815991b --- /dev/null +++ b/mods/ca/weapons/custom/campaign.yaml @@ -0,0 +1,266 @@ +UnitExplodePlane: + Warhead@1Dam: SpreadDamage + Damage: 400 + +UnitExplodePlaneLight: + Warhead@1Dam: SpreadDamage + Damage: 300 + +UnitExplodePlaneEmpty: + Warhead@1Dam: SpreadDamage + Damage: 200 + +UnitExplodeHeli: + Warhead@1Dam: SpreadDamage + Damage: 375 + +UnitExplodeHeliEmpty: + Warhead@1Dam: SpreadDamage + Damage: 200 + +CraterMaker1: + ReloadDelay: 1000 + Warhead@Smu: LeaveSmudge + SmudgeType: Crater + +CraterMaker2: + Inherits: CraterMaker1 + Warhead@Smu2: LeaveSmudge + SmudgeType: Crater + +ScorchMaker1: + ReloadDelay: 1000 + Warhead@Smu: LeaveSmudge + SmudgeType: Scorch + +ScorchMaker2: + Inherits: ScorchMaker1 + Warhead@Smu2: LeaveSmudge + SmudgeType: Scorch + +# Commando weapons + +Colt45: + ReloadDelay: 5 + Burst: 2 + BurstDelays: 2 + +AKM: + ReloadDelay: 8 + +SMG: + ReloadDelay: 10 + +EnslaveInfantry: + ReloadDelay: 35 + +# Super unit weapons + +ExterminatorLaser: + Inherits: TripodLaser + ReloadDelay: 55 + Report: etpd-fire1.aud, etpd-fire2.aud + Projectile: PlasmaBeam + InnerLightness: 170 + OuterLightness: 130 + Colors: 880000EE, AA0000EE + CenterBeam: true + CenterBeamWidth: 40 + CenterBeamColor: ffeeeeff + Radius: 3 + Distortion: 64 + DistortionAnimation: 64 + SegmentLength: 196 + RecalculateDistortionInterval: 2 + MaxFacingDeviation: 256 + Warhead@1Dam: SpreadDamage + Damage: 2250 + Spread: 512 + Versus: + Wood: 45 + Concrete: 50 + Warhead@3Eff: CreateEffect + Explosions: large_explosion, small_explosion_alt1, small_explosion_alt2, small_explosion_alt3 + +ExterminatorLaserReversed: + Inherits: ExterminatorLaser + Projectile: PlasmaBeam + StartOffset: -150,-300,0 + FollowingOffset: 50,100,0 + +VoidEngineBeam: + ReloadDelay: 375 + Range: 15c0 + Report: veng-fire1.aud + Projectile: LaserZapCA + Duration: 30 + Color: 000000FF + Width: 250 + SecondaryBeamColor: 00000099 + SecondaryBeamWidth: 350 + Warhead@1Dam: SpreadDamage + Spread: 128 + Falloff: 100, 37, 23, 10, 0 + Damage: 200000 + Versus: + Wood: 20 + Concrete: 15 + DamageTypes: BulletDeath + Warhead@Spawn: SpawnActor + Actors: voidenginerift + Range: 1 + ForceGround: false + ValidTargets: Ground, Water + ImpactActors: false + Warhead@Arc: FireShrapnel + Weapon: VoidEngineArc + Amount: 3 + AimChance: 100 + ThrowWithoutTarget: true + ValidTargets: Ground, Water + ImpactActors: false + +VoidEngineArc: + Inherits: RiftCannon + -Report: + Range: 3c0 + MinRange: 1c512 + ValidTargets: Ground, Water + Warhead@1Dam: SpreadDamage + Spread: 341 + +VoidEngineRift: + ReloadDelay: 10 + Range: 1c0 + Projectile: InstantHit + Warhead@1Dam: SpreadDamage + Spread: 1c512 + Damage: 840 + Falloff: 100, 70, 0 + DamageTypes: BulletDeath + ValidRelationships: Enemy, Neutral + Warhead@2Dam: SpreadDamage + Spread: 768 + Damage: 168 + Falloff: 100, 70, 0 + DamageTypes: BulletDeath + ValidRelationships: Ally + Warhead@3Slow: GrantExternalConditionCA + Range: 1c512 + Duration: 10 + Condition: slowed + ValidTargets: Vehicle, Ship, Cyborg + Warhead@4Slow: GrantExternalConditionCA + Range: 3c0 + Duration: 10 + Condition: slowed + ValidTargets: Vehicle, Ship + ValidRelationships: Enemy, Neutral + +# Super unit modifiers + +C4: + Warhead@1Dam: HealthPercentageDamage + InvalidTargets: CampaignBoss + Warhead@ExterminatorTripod: SpreadDamage + Damage: 300000 + ValidTargets: ExterminatorTripod + Warhead@VoidEngine: SpreadDamage + Damage: 80000 + ValidTargets: VoidEngine + +^VsCampaignBossEmp: + Warhead@bossEmp: GrantExternalConditionCA + Range: 0c896 + Duration: 20 + Condition: empdisable + ValidTargets: CampaignBoss + InvalidTargets: Shielded + +MEMP: + Warhead@emp: GrantExternalConditionCA + InvalidTargets: EmpImmune, CampaignBoss + Inherits@VsCampaignBossEmp: ^VsCampaignBossEmp + Warhead@bossEmp: GrantExternalConditionCA + Range: 5c0 + Duration: 40 + +MicrowaveZap: + Warhead@emp: GrantExternalConditionCA + InvalidTargets: EmpImmune, CampaignBoss + +MicrowaveZap.UPG: + Warhead@emp: GrantExternalConditionCA + InvalidTargets: EmpImmune, CampaignBoss + Warhead@emp2: GrantExternalConditionCA + InvalidTargets: EmpImmune, CampaignBoss + Inherits@VsCampaignBossEmp: ^VsCampaignBossEmp + Warhead@bossEmp: GrantExternalConditionCA + Duration: 40 + +EnlightenedBeam: + Warhead@1Dam: HealthPercentageSpreadDamage + InvalidTargets: CampaignBoss + Warhead@boss: SpreadDamage + Damage: 15000 + ValidTargets: CampaignBoss + +EnlightenedEmp: + Warhead@1Emp: GrantExternalConditionCA + InvalidTargets: Cyborg, EmpImmune, CampaignBoss + Inherits@VsCampaignBossEmp: ^VsCampaignBossEmp + Warhead@bossEmp: GrantExternalConditionCA + Duration: 20 + +EMPGrenade: + Warhead@5emp: GrantExternalConditionCA + InvalidTargets: EmpImmune, CampaignBoss + Inherits@VsCampaignBossEmp: ^VsCampaignBossEmp + Warhead@bossEmp: GrantExternalConditionCA + Duration: 5 + +OrcaBomb: + Warhead@emp: GrantExternalConditionCA + InvalidTargets: EmpImmune, CampaignBoss + Inherits@VsCampaignBossEmp: ^VsCampaignBossEmp + Warhead@bossEmp: GrantExternalConditionCA + Duration: 20 + +BasiliskPulse: + Warhead@emp: GrantExternalConditionCA + InvalidTargets: EmpImmune, CampaignBoss + Inherits@VsCampaignBossEmp: ^VsCampaignBossEmp + Warhead@bossEmp: GrantExternalConditionCA + Duration: 40 + +EMPMissileLauncher: + Warhead@emp1: GrantExternalConditionCA + InvalidTargets: EmpImmune, CampaignBoss + Warhead@emp2: GrantExternalConditionCA + InvalidTargets: EmpImmune, CampaignBoss + Warhead@emp3: GrantExternalConditionCA + InvalidTargets: EmpImmune, CampaignBoss + Inherits@VsCampaignBossEmp: ^VsCampaignBossEmp + Warhead@bossEmp: GrantExternalConditionCA + Range: 4c512 + Duration: 75 + +ShadeEmp: + Warhead@1Emp: GrantExternalConditionCA + InvalidTargets: Cyborg, EmpImmune, CampaignBoss + Warhead@2Emp: GrantExternalConditionCA + InvalidTargets: EmpImmune, CampaignBoss + Inherits@VsCampaignBossEmp: ^VsCampaignBossEmp + Warhead@bossEmp: GrantExternalConditionCA + Duration: 20 + +RiftCannon: + Warhead@2Dam: HealthPercentageSpreadDamage + InvalidTargets: CampaignBoss + +NeutronCannon: + Warhead@Damage: WarpPercentDamage + InvalidTargets: CampaignBoss + Warhead@CampaignBoss: WarpDamage + Damage: 1000 + ValidTargets: CampaignBoss diff --git a/mods/ca/weapons/custom/mastermind-madness.yaml b/mods/ca/weapons/custom/mastermind-madness.yaml new file mode 100644 index 0000000000..f6ac100ffe --- /dev/null +++ b/mods/ca/weapons/custom/mastermind-madness.yaml @@ -0,0 +1,27 @@ +^TeslaWeapon: + Warhead@1Dam: SpreadDamage + Versus: + None: 500 + +TTankZapSecondary: + Warhead@1Dam: SpreadDamage + Versus: + None: 800 + +TTankZapSecondary.UPG: + Warhead@1Dam: SpreadDamage + Versus: + None: 800 + +EnslaveInfantry: + ValidTargets: MindControllableInfantry + Warhead@1Dam: TargetDamage + ValidTargets: MindControllableInfantry + +EnslaveVehicle: + ReloadDelay: 50 + ValidTargets: MindControllable + InvalidTargets: MindControllableInfantry, MindControlImmune + Warhead@1Dam: TargetDamage + ValidTargets: MindControllable + InvalidTargets: MindControllableInfantry diff --git a/mods/ca/weapons/custom/scrinfestation.yaml b/mods/ca/weapons/custom/scrinfestation.yaml new file mode 100644 index 0000000000..9de80564fa --- /dev/null +++ b/mods/ca/weapons/custom/scrinfestation.yaml @@ -0,0 +1,118 @@ +SMG: + ReloadDelay: 25 + ValidTargets: Ground + -InvalidTargets: + Warhead@1Dam: SpreadDamage + ValidTargets: Ground + ValidRelationships: Enemy, Neutral + Versus: + Wood: 5 + Light: 4 + Heavy: 3 + Brick: 5 + Concrete: 5 + +RavagerShards: + Range: 6c0 + Projectile: MissileCA + Speed: 170 + LockOnProbability: 0 + LockOnInaccuracy: 128 + Inaccuracy: 128 + MinimumLaunchAngle: 80 + MaximumLaunchAngle: 112 + Blockable: true + Warhead@1Dam: SpreadDamage + Spread: 128 + +WarriorGun: + Range: 4c0 + +DisintegratorBeam: + Range: 4c0 + +IntruderDiscs: + Range: 7c0 + Projectile: MissileCA + Speed: 190 + LockOnProbability: 0 + RangeLimit: 7c512 + Blockable: false + Warhead@1Dam: SpreadDamage + Versus: + None: 75 + +LeecherBeam: + Range: 3c512 + Projectile: PlasmaBeam + Blockable: true + +BursterTargeting: + Range: 3c512 + +BursterBeam: + Range: 3c512 + +RuinerCannon: + Projectile: Bullet + Speed: 150 + Blockable: true + Warhead@1Dam: SpreadDamage + Damage: 12000 + DamageTypes: TriggerProne, RadiationDeath + +RiftCannon: + Warhead@1Dam: SpreadDamage + Versus: + None: 0 + Warhead@2Dam: HealthPercentageSpreadDamage + Versus: + None: 0 + +MiniRift: + Warhead@1Dam: SpreadDamage + Spread: 512 + Delay: 75 + Versus: + None: 35 + Warhead@3Slow: GrantExternalConditionCA + ValidTargets: Vehicle, Cyborg, Infantry + Warhead@4Slow: GrantExternalConditionCA + ValidTargets: Vehicle, Cyborg, Infantry + +GunWalkerZap: + Range: 3c512 + +CorrupterSpew: + Projectile: Bullet + Blockable: true + Warhead@1Dam: SpreadDamage + Versus: + None: 450 + +TurretDiscs: + Inherits: DevastatorDiscs + Range: 7c0 + -MinRange: + ReloadDelay: 120 + Report: devastator-fire1.aud, devastator-fire2.aud, devastator-fire3.aud + BurstDelays: 6 + Projectile: Bullet + Inaccuracy: 64 + Blockable: true + Speed: 115 + Warhead@1Dam: SpreadDamage + Versus: + None: 170 + +BruteAttack: + ReloadDelay: 70 + Warhead@1Dam: SpreadDamage + Spread: 128 + Damage: 10000 + Versus: + None: 100 + Light: 60 + Heavy: 75 + Concrete: 35 + Wood: 25 diff --git a/mods/ca/weapons/explosions.yaml b/mods/ca/weapons/explosions.yaml index 7c797c697c..952f6069e6 100644 --- a/mods/ca/weapons/explosions.yaml +++ b/mods/ca/weapons/explosions.yaml @@ -18,6 +18,7 @@ Explosions: self_destruct ImpactSounds: kaboom22.aud ValidTargets: Ground, Air, Ship, Trees + ImpactActors: false Warhead@3EffWater: CreateEffect Explosions: large_splash ImpactSounds: splash9.aud @@ -68,6 +69,9 @@ UnitExplodePlane: Inherits: UnitExplode Warhead@1Dam: SpreadDamage Damage: 4000 + Versus: + None: 30 + Light: 30 Warhead@2Eff: CreateEffect Explosions: large_napalm @@ -75,6 +79,8 @@ UnitExplodePlaneLight: Inherits: UnitExplodePlane Warhead@1Dam: SpreadDamage Damage: 3000 + Warhead@2Eff: CreateEffect + Explosions: napalm UnitExplodePlaneEmpty: Inherits: UnitExplode @@ -85,21 +91,29 @@ UnitExplodeHeli: Inherits: UnitExplode Warhead@1Dam: SpreadDamage Damage: 3750 + Versus: + None: 30 + Light: 30 Warhead@2Eff: CreateEffect - Explosions: napalm + Explosions: large_napalm UnitExplodeHeliEmpty: Inherits: UnitExplodeHeli Warhead@1Dam: SpreadDamage Damage: 2000 + Warhead@2Eff: CreateEffect + Explosions: napalm UnitExplodeDrone: Inherits: UnitExplodeHeli Warhead@1Dam: SpreadDamage Damage: 2000 + Versus: + None: 30 + Light: 30 UnitExplodeDroneEmpty: - Inherits: UnitExplodeHeli + Inherits: UnitExplodeHeliEmpty Warhead@1Dam: SpreadDamage Damage: 1000 @@ -114,11 +128,49 @@ UnitExplodeFlameSmall: Warhead@Smu: LeaveSmudge SmudgeType: Scorch +UnitExplodeFlame: + Inherits: ^Explosion + Warhead@1Dam: SpreadDamage + Falloff: 1000, 368, 135, 50, 18, 7, 0 + Delay: 5 + ValidTargets: Ground, Trees + InvalidTargets: Structure + Versus: + None: 120 + Light: 50 + Brick: 50 + DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath, Incendiary + Warhead@2Dam: SpreadDamage + Damage: 15000 + Range: 0, 1c256, 2c512 + Falloff: 100, 100, 0 + Delay: 5 + ValidTargets: Structure + Versus: + Wood: 100 + Concrete: 50 + DamageTypes: ExplosionDeath, Incendiary + Warhead@2Eff: CreateEffect + Explosions: napalm + ImpactSounds: firebl3.aud + Delay: 5 + -Warhead@3EffWater: + Warhead@Smu: LeaveSmudge + SmudgeType: Scorch + Size: 2 + Delay: 5 + Warhead@Flames: FireCluster + Weapon: BurnFx + RandomClusterCount: 1 + Dimensions: 2,2 + Footprint: xx xx + UnitExplodeChemSmall: Inherits: ^Explosion Warhead@1Dam: SpreadDamage Damage: 4000 DamageTypes: Prone50Percent, TriggerProne, PoisonDeath + InvalidTargets: ChemWarrior Warhead@2Eff: CreateEffect Explosions: small_chem ExplosionPalette: temptd @@ -140,6 +192,12 @@ VisualExplodeHusk: -Warhead@1Dam: Warhead@2Eff: CreateEffect Explosions: large_explosion + Warhead@Shrap: FireShrapnel + Weapon: SmallDebris + Amount: 5 + AimChance: 0 + ValidTargets: Ground, Water, Infantry, Vehicle + ThrowWithoutTarget: true VisualExplodeAirborne: Inherits: VisualExplodeHusk @@ -184,34 +242,47 @@ UnitExplodeSmall: Explosions: large_explosion ImpactSounds: kaboom15.aud +UnitExplodeGrenade: + Inherits: UnitExplodeSmall + Warhead@2Eff: CreateEffect + Explosions: med_explosion + ImpactSounds: kaboom25.aud + +UnitExplodeGrenadeTD: + Inherits: UnitExplodeGrenade + Warhead@2Eff: CreateEffect + Explosions: self_destruct + ImpactSounds: xplosml2.aud + +VisualExplodeSmall: + Inherits: UnitExplodeSmall + -Warhead@1Dam: + ArtilleryExplode: Inherits: ^Explosion Warhead@1Dam: SpreadDamage Damage: 15000 -V2Explode: - Inherits: SCUD - -Report: - V3ExplodeAirborne: Inherits: ^Explosion Warhead@1Dam: SpreadDamage - Range: 0, 4c0, 5c0 + Range: 0, 1c768, 2c768 Falloff: 100, 100, 0 - Damage: 6750 - ValidTargets: Ground, Water, Trees, ICBM + Damage: 5000 Versus: None: 10 Wood: 55 Light: 30 Heavy: 20 Concrete: 100 - Brick: 55 DamageTypes: Prone50Percent, TriggerProne, SmallExplosionDeath Warhead@2Eff: CreateEffect Explosions: artillery_explosion ImpactSounds: kaboom15.aud +THExplodeAirborne: + Inherits: V3ExplodeAirborne + BuildingExplode: Warhead@2Eff: CreateEffect Explosions: building, building_napalm, large_explosion, self_destruct, large_napalm @@ -234,6 +305,29 @@ SmallBuildingExplode: Dimensions: 2,2 Footprint: xx xx +FakeBuildingExplode: + Warhead@1Dam: SpreadDamage + DamageTypes: DefaultDeath + Spread: 1c0 + Falloff: 100, 50, 35, 22, 14, 0 + Damage: 75000 + Versus: + None: 30 + Wood: 20 + Concrete: 20 + Light: 90 + +FakeBuildingSelfDestruct: + Report: icolseta.aud + ReloadDelay: 200 + Warhead@1Dam: HealthPercentageDamage + Delay: 20 + Spread: 1c0 + Damage: 100 + ValidTargets: Structure + ValidRelationships: Ally + AffectsParent: true + CivPanicExplosion: Warhead@1Dam: SpreadDamage # Used to panic civilians which are emitted from a killed CivBuilding Falloff: 100, 100 @@ -251,7 +345,7 @@ BarrelExplode: None: 120 Wood: 100 Light: 50 - Brick: 10 + Brick: 50 DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath, Incendiary Warhead@2Eff: CreateEffect Explosions: napalm @@ -280,7 +374,7 @@ KirovExplode: Wood: 100 Heavy: 35 Concrete: 35 - Brick: 10 + Brick: 50 DamageTypes: Prone50Percent, TriggerProne, FireDeath, Incendiary Warhead@2Eff: CreateEffect Explosions: large_napalm @@ -299,14 +393,41 @@ KirovExplode: Dimensions: 2,2 Footprint: xx xx +MothershipExplode: + Inherits: KirovExplode + Warhead@3Eff: CreateEffect + Explosions: large_artillery_explosion + ImpactSounds: artyhit2.aud, artyhit3.aud + Warhead@Cluster1: FireCluster + Weapon: MothershipExplodeCluster + Dimensions: 5,5 + Footprint: __X__ _XX__ X__X_ __X_X _____ + Delay: 2 + Warhead@Cluster2: FireCluster + Weapon: MothershipExplodeCluster + Dimensions: 5,5 + Footprint: _____ X__XX _X__X XX_X_ __X__ + Delay: 4 + Warhead@5Shake: ShakeScreen + Duration: 5 + Intensity: 1 + Multiplier: 0.5,0.5 + +MothershipExplodeCluster: + Projectile: InstantHit + Warhead@1Dam: SpreadDamage + Damage: 3000 + Warhead@2Eff: CreateEffect + Explosions: napalm + ATMine: Warhead@1Dam: SpreadDamage - Spread: 256 - Damage: 40000 + Spread: 448 + Damage: 37000 AffectsParent: true ValidTargets: Ground, Water, Underwater InvalidTargets: Mine - DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath + DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath, TankBuster Warhead@2Eff: CreateEffect Explosions: large_explosion ImpactSounds: mineblo1.aud @@ -370,8 +491,6 @@ CrateNuke: Damage: 5000 Falloff: 1000, 368, 135, 50, 18, 7, 0 ValidTargets: Ground, Trees, Water, Air - Versus: - Brick: 25 AffectsParent: true DamageTypes: Prone50Percent, TriggerProne, FireDeath, Incendiary Warhead@2Res_impact: DestroyResource @@ -387,7 +506,6 @@ CrateNuke: ValidTargets: Ground, Trees, Water, Air Versus: Tree: 200 - Brick: 25 AffectsParent: true DamageTypes: Prone50Percent, TriggerProne, FireDeath, Incendiary Warhead@5Res_areanuke1: DestroyResource @@ -413,7 +531,7 @@ CrateNuke: Falloff: 100, 75, 52, 37, 24, 15, 2 MaxLevel: 750 LayerName: radioactivity.strong - Warhead@FlashEffect: FlashPaletteEffect + Warhead@FlashEffect: FlashEffect Duration: 20 FlashType: Nuke @@ -423,10 +541,16 @@ UnitExplodeIraqTank: Explosions: nuke3 Warhead@1Dam_impact: SpreadDamage Damage: 1000 + Versus: + None: 45 + Light: 85 Falloff: 368, 135, 50, 18, 0 -Warhead@2Res_impact: Warhead@4Dam_areanuke1: SpreadDamage Damage: 500 + Versus: + None: 45 + Light: 85 Falloff: 600, 400, 250, 150, 0 -Warhead@5Res_areanuke1: Warhead@6Smu_areanuke1: LeaveSmudge @@ -449,6 +573,7 @@ MiniNuke: Tree: 200 Wood: 35 Concrete: 35 + Aircraft: 50 AffectsParent: true DamageTypes: Prone50Percent, TriggerProne, FireDeath, Incendiary Warhead@2Res_impact: DestroyResource @@ -466,7 +591,7 @@ MiniNuke: Versus: Tree: 200 Wood: 75 - Brick: 25 + Aircraft: 50 AffectsParent: true DamageTypes: Prone50Percent, TriggerProne, FireDeath, Incendiary Warhead@5Res_areanuke1: DestroyResource @@ -484,7 +609,7 @@ MiniNuke: ValidTargets: Ground, Water, Underwater, Air Versus: Wood: 75 - Brick: 25 + Aircraft: 50 AffectsParent: true DamageTypes: Prone50Percent, TriggerProne, FireDeath, Incendiary Warhead@8Dam_areanuke2: SpreadDamage @@ -503,8 +628,6 @@ MiniNuke: Falloff: 1000, 368, 135, 50, 18, 7, 0 Delay: 15 ValidTargets: Ground, Water, Underwater - Versus: - Brick: 25 AffectsParent: true DamageTypes: Prone50Percent, TriggerProne, FireDeath, Incendiary Warhead@12Res_areanuke3: DestroyResource @@ -526,7 +649,7 @@ MiniNuke: Falloff: 100, 75, 52, 37, 24, 15, 2 MaxLevel: 750 LayerName: radioactivity.strong - Warhead@FlashEffect: FlashPaletteEffect + Warhead@FlashEffect: FlashEffect Duration: 20 FlashType: Nuke @@ -557,7 +680,6 @@ MicroNuke: ValidTargets: Ground, Trees, Water, Underwater, Air Versus: Wood: 75 - Brick: 25 AffectsParent: true DamageTypes: Prone50Percent, TriggerProne, FireDeath, Incendiary Warhead@5Res_areanuke1: DestroyResource @@ -575,7 +697,6 @@ MicroNuke: ValidTargets: Ground, Water, Underwater, Air Versus: Wood: 75 - Brick: 25 AffectsParent: true DamageTypes: Prone50Percent, TriggerProne, FireDeath, Incendiary Warhead@9Res_areanuke2: DestroyResource @@ -587,8 +708,6 @@ MicroNuke: Falloff: 1000, 368, 50, 7, 0 Delay: 15 ValidTargets: Ground, Water, Underwater - Versus: - Brick: 25 AffectsParent: true DamageTypes: Prone50Percent, TriggerProne, FireDeath, Incendiary Warhead@11Dam_areanuke3: SpreadDamage @@ -626,14 +745,14 @@ UnitExplodeVice: Falloff: 1000, 368, 135, 50, 18, 7, 0 Delay: 5 ValidTargets: Ground, Trees - InvalidTargets: Air, Creep + InvalidTargets: Creep Versus: None: 120 Wood: 200 Light: 50 Heavy: 25 Concrete: 25 - Brick: 10 + Brick: 5 DamageTypes: Prone50Percent, TriggerProne, RadiationDeath Warhead@2Smu: LeaveSmudge SmudgeType: Scorch-NoFlame @@ -658,9 +777,9 @@ UnitExplodeToxinTruck: Damage: 5000 Falloff: 1000, 368, 135, 50, 18, 7, 0 ValidTargets: Ground, Water - InvalidTargets: Air, Creep + InvalidTargets: Creep Versus: - Brick: 25 + Brick: 5 AffectsParent: true DamageTypes: Prone50Percent, TriggerProne, ToxinDeath Warhead@3Eff_impact: CreateEffect @@ -673,9 +792,9 @@ UnitExplodeToxinTruck: Falloff: 1000, 368, 135, 50, 18, 7, 0 Delay: 5 ValidTargets: Ground, Water - InvalidTargets: Air, Creep + InvalidTargets: Creep Versus: - Brick: 25 + Brick: 5 AffectsParent: true DamageTypes: Prone50Percent, TriggerProne, ToxinDeath Warhead@7Dam_areanuke2: SpreadDamage @@ -684,9 +803,9 @@ UnitExplodeToxinTruck: Falloff: 1000, 368, 135, 50, 18, 7, 0 Delay: 10 ValidTargets: Ground, Water - InvalidTargets: Air, Creep + InvalidTargets: Creep Versus: - Brick: 25 + Brick: 5 AffectsParent: true DamageTypes: Prone50Percent, TriggerProne, ToxinDeath Warhead@11Smu_areanuke3: LeaveSmudge @@ -701,21 +820,21 @@ UnitExplodeToxinTruck: MaxLevel: 750 LayerName: radioactivity.strong Warhead@15Spawn: SpawnActor - Actors: camera.cloud2, camera.cloud + Actors: toxiccloud2, toxiccloud Range: 5 ForceGround: false Image: Cloud1d Palette: tseffect-ignore-lighting-alpha75 ValidTargets: Ground, Water Warhead@16Spawn: SpawnActor - Actors: camera.cloud2 + Actors: toxiccloud2 Range: 5 ForceGround: false Image: Cloud2d Palette: tseffect-ignore-lighting-alpha75 ValidTargets: Ground, Water Warhead@17Spawn: SpawnActor - Actors: camera.cloud + Actors: toxiccloud Range: 5 ForceGround: false Image: Cloud2d @@ -729,6 +848,7 @@ UnitExplodeToxinTruck: ThrowWithoutTarget: true MEMP: + Report: mobemp1.aud ValidTargets: Ground, Water Warhead@1Dam_impact: SpreadDamage Range: 0, 1c1, 2c1, 3c1, 3c512, 4c1, 4c512 @@ -741,15 +861,29 @@ MEMP: Light: 20 Heavy: 20 Concrete: 25 - Brick: 25 + Brick: 5 Warhead@2Eff: CreateEffect ExplosionPalette: tsunit-ignore-lighting-alpha75 Explosions: pulse_explosion3 - Warhead@emp: GrantExternalCondition + Warhead@emp: GrantExternalConditionCA + Range: 5c0 + Duration: 300 + Condition: empdisable + ValidTargets: Vehicle, Ship, Building + InvalidTargets: EmpImmune + Warhead@empdef: GrantExternalConditionCA Range: 5c0 Duration: 600 Condition: empdisable - ValidTargets: Ground, Vehicle, Air + ValidTargets: Defense + InvalidTargets: EmpImmune + Warhead@empAir: GrantExternalConditionCA + Range: 2c0 + Duration: 300 + Condition: empdisable + ValidTargets: Air + InvalidTargets: EmpImmune + HitShapeCheck: false Warhead@2Smu_impact: LeaveSmudge SmudgeType: Scorch Warhead@3Smu_area: LeaveSmudge @@ -763,12 +897,6 @@ MEMP: Size: 2,1 Delay: 6 -EMPExplode: - Inherits: ^Explosion - -Warhead@1Dam: - -Warhead@2Eff: - -Warhead@Smu: - ChaosGas: ReloadDelay: 200 ValidTargets: Ground, Water, Underwater @@ -776,11 +904,16 @@ ChaosGas: Explosions: gasring2 ExplosionPalette: caneon-ignore-lighting-alpha75 ImpactSounds: vchaatta.aud - Warhead@chaos: GrantExternalCondition + Warhead@chaos: GrantExternalConditionCA Range: 3c0 Duration: 200 Condition: berserk ValidTargets: Ground, Vehicle + InvalidTargets: ChaosImmune + Warhead@chaosClouds: SpawnActor + Actors: chaoscloud, chaoscloud2 + Range: 3 + ValidTargets: Ground, Water ChaosDroneExplode: Inherits: ChaosGas @@ -793,16 +926,15 @@ ChaosDroneExplodeSmall: ExplosionPalette: caneon ImpactSounds: firebl3.aud ImpactActors: false - Warhead@chaos: GrantExternalCondition + Warhead@chaos: GrantExternalConditionCA Range: 1c512 - Duration: 150 CryoExplosion: Warhead@2Eff: CreateEffect Explosions: cryoblast ExplosionPalette: ra2effect-ignore-lighting-alpha75 ImpactSounds: cryoblast.aud - Warhead@chill: GrantExternalCondition + Warhead@chill: GrantExternalConditionCA Condition: chilled Duration: 150 Range: 1c768 @@ -820,7 +952,6 @@ TemporalExplode: ImpactSounds: chronowarp.aud ValidTargets: Ground, Water, Air - TemporalExplodeLarge: Warhead@1Eff: CreateEffect Explosions: chronowarpbig_effect @@ -859,4 +990,78 @@ TPWRArc1: TPWRArc2: Inherits: TPWRArc1 - -Warhead@Burst: \ No newline at end of file + -Warhead@Burst: + +BSKY: + Warhead@1Dam: SpreadDamage + Damage: 70000 + Spread: 128 + Versus: + Wood: 20 + Concrete: 35 + DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath, TankBuster + Warhead@3Eff: CreateEffect + Explosions: artillery_explosion + ImpactSounds: bsky-hit1.aud, bsky-hit2.aud + +Mindblast: + ReloadDelay: 200 + ValidTargets: Ground, Water, Underwater + Report: iyurat2a.aud + Warhead@Eff: CreateEffect + Explosions: mindblast + ExplosionPalette: ra2effect-ignore-lighting-alpha75 + ValidTargets: Ground, Trees, Water, Underwater, Air, AirSmall + Warhead@1Dam: SpreadDamage + Spread: 1c0 + Damage: 20000 + Falloff: 1000, 500, 300, 150, 60, 17, 5, 5 + ValidTargets: Infantry, Vehicle, Structure, Ship + ValidRelationships: Enemy, Neutral + Versus: + None: 10 + Wood: 100 + Concrete: 75 + Brick: 75 + Heavy: 65 + Light: 50 + DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath + +MindblastSlave: + Inherits: Mindblast + Warhead@Eff: CreateEffect + Explosions: mindblastsm + Warhead@1Dam: SpreadDamage + Spread: 0c512 + Damage: 40000 + Falloff: 100, 50, 25, 7, 0 + Versus: + None: 25 + Warhead@2Dam: SpreadDamage + Damage: 50000 + Range: 0, 1c0, 1c512, 2c512 + Falloff: 100, 100, 80, 10 + ValidTargets: Hero + ValidRelationships: Enemy, Neutral + +JackknifeExplosion: + Range: 8c0 + ValidTargets: Ground, Water, Air, AirSmall + Projectile: InstantHit + Warhead@1Dam: SpreadDamage + Damage: 36000 + Spread: 341 + Versus: + None: 50 + Wood: 15 + Light: 75 + Heavy: 100 + Concrete: 80 + Brick: 15 + DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath, TankBuster + ValidTargets: Ground, Water, Air, AirSmall + InvalidTargets: Jackknife + Warhead@2Eff: CreateEffect + Explosions: artillery_explosion + ImpactSounds: kaboom15.aud + ValidTargets: Ground, Water, Air, AirSmall diff --git a/mods/ca/weapons/missiles.yaml b/mods/ca/weapons/missiles.yaml index 441b3f902d..b6170944aa 100644 --- a/mods/ca/weapons/missiles.yaml +++ b/mods/ca/weapons/missiles.yaml @@ -12,21 +12,18 @@ TrailImage: smokey Shadow: True HorizontalRateOfTurn: 20 - RangeLimit: 6c0 + RangeLimit: 7c0 PointDefenseType: Missile - LockOnProbability: 80 - LockOnInaccuracy: 128 Warhead@1Dam: SpreadDamage Spread: 128 Damage: 5000 - ValidTargets: Ground, Water, Air Versus: None: 10 Wood: 74 Light: 34 Heavy: 100 Concrete: 75 - Brick: 50 + Brick: 75 DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath Warhead@2Smu: LeaveSmudge SmudgeType: Crater @@ -41,11 +38,19 @@ ValidTargets: Water, Underwater InvalidTargets: Ship, Structure, Bridge +^AirToGroundMissile: + Inherits: ^AntiGroundMissile + Projectile: MissileCA + Warhead@1Dam: SpreadDamage + DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath, TankBuster, AirToGround + ^AntiAirMissile: Inherits: ^AntiGroundMissile ValidTargets: Air, AirSmall Projectile: MissileCA - LockOnProbability: 95 + Inaccuracy: 0 + AllowSnapping: true + HorizontalRateOfTurn: 100 Warhead@1Dam: SpreadDamage Range: 0, 0c64, 0c256, 3c0 Falloff: 100, 100, 30, 15 @@ -57,39 +62,36 @@ Light: 100 Concrete: 100 Brick: 100 - Warhead@2Dam: SpreadDamage - Spread: 0c64 - Falloff: 100, 30 + Warhead@smallDamage: SpreadDamage + Spread: 128 + Falloff: 100, 50, 14, 0 ValidTargets: AirSmall + ValidRelationships: Enemy, Neutral Versus: None: 100 Wood: 100 Light: 100 Concrete: 100 Brick: 100 + DamageTypes: Prone50Percent, TriggerProne, SmallExplosionDeath Warhead@3Eff: CreateEffect Explosions: med_explosion_air ImpactActors: false ^AirToAirMissile: Inherits: ^AntiAirMissile - MinRange: 1c256 + -MinRange: Projectile: MissileCA -Arm: Speed: 384 - HorizontalRateOfTurn: 40 - LockOnInaccuracy: 0 - RangeLimit: 12c0 - AllowSnapping: true - Warhead@2Dam: SpreadDamage - Range: 0, 0c64, 0c256, 1c256 - Falloff: 100, 70, 30, 10 - ValidTargets: AirSmall + RangeLimit: 13c0 + Warhead@smallDamage: SpreadDamage + Spread: 341 Maverick: - Inherits: ^AntiGroundMissile - Range: 6c0 - MinRange: 2c0 + Inherits: ^AirToGroundMissile + Range: 7c0 + MinRange: 0c768 Report: missile7.aud Burst: 2 BurstDelays: 7 @@ -98,14 +100,13 @@ Maverick: CruiseAltitude: 2c0 RangeLimit: 14c410 Warhead@1Dam: SpreadDamage - Damage: 10750 + Damage: 11000 Versus: - None: 25 - Wood: 35 - Concrete: 100 - Light: 60 - Heavy: 85 - Brick: 80 + None: 20 + Wood: 30 + Concrete: 95 + Light: 65 + Heavy: 100 MaverickAA: Inherits: ^AirToAirMissile @@ -116,12 +117,18 @@ MaverickAA: BurstDelays: 10 Warhead@1Dam: SpreadDamage Damage: 6000 - Warhead@2Dam: SpreadDamage + Warhead@smallDamage: SpreadDamage Damage: 6000 +Sidewinder: + Inherits: MaverickAA + Report: sidewinder.aud + Projectile: MissileCA + ContrailLength: 10 + ContrailStartWidth: 42 + MaverickSU: Inherits: Maverick - Range: 10c0 Report: vbleatta.aud, vbleattb.aud Burst: 4 BurstDelays: 0, 10, 0 @@ -132,22 +139,33 @@ MaverickSU: Inaccuracy: 64 Blockable: false Shadow: true - Speed: 341 + Speed: 550 LaunchAngle: 0 Image: DRAGON TrailImage: smokey ContrailLength: 8 - ContrailWidth: 48 - ContrailColor: ff990088 + ContrailStartWidth: 48 + ContrailStartColor: ff990088 + ContrailStartColorAlpha: 128 Warhead@1Dam: SpreadDamage - Damage: 17000 - Spread: 341 + Damage: 16000 + Spread: 448 + Falloff: 100, 55, 35, 8, 0 Versus: - None: 15 + None: 0 Wood: 18 - Light: 65 - Concrete: 70 - Heavy: 80 + Concrete: 65 + Heavy: 85 + Warhead@2Dam: SpreadDamage + Damage: 1600 + Spread: 128 + Versus: + None: 100 + Wood: 0 + Light: 0 + Concrete: 0 + Heavy: 0 + Brick: 0 Warhead@3Eff: CreateEffect Explosions: large_explosion ImpactSounds: gexp14a.aud, gexp14b.aud, gexp14c.aud, gexp14d.aud @@ -156,8 +174,8 @@ MaverickSU: SeismicMissile: ReloadDelay: 70 - Range: 10c0 - MinRange: 3c0 + Range: 7c0 + MinRange: 0c768 Report: rocket1.aud Burst: 2 BurstDelays: 2 @@ -171,24 +189,25 @@ SeismicMissile: Inaccuracy: 128 TrailImage: smokey TrailDelay: 2 - ContrailWidth: 64 + ContrailStartWidth: 64 ContrailLength: 8 - ContrailColor: ff6600aa - Speed: 200 + ContrailStartColor: ff6600aa + ContrailStartColorAlpha: 170 + Speed: 250 LaunchAngle: 0 Warhead@1Dam: SpreadDamage Spread: 1c0 - Damage: 1300 - Falloff: 1000, 368, 135, 50, 0 + Damage: 1850 + Falloff: 1000, 368, 135, 75, 0 ValidTargets: Ground, Water Versus: - None: 20 - Wood: 80 - Light: 100 - Heavy: 85 - Concrete: 100 + None: 10 + Wood: 60 + Light: 75 + Heavy: 100 + Concrete: 75 Brick: 100 - DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath + DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath, TankBuster, AirToGround Warhead@2Smu: LeaveSmudge SmudgeType: Crater InvalidTargets: Vehicle, Structure, Wall, Husk, Trees @@ -201,14 +220,14 @@ SeismicMissile: Explosions: med_splash ValidTargets: Water, Underwater InvalidTargets: Ship, Structure, Bridge - Warhead@Concussion1: GrantExternalCondition + Warhead@Concussion1: GrantExternalConditionCA Range: 1c512 - Duration: 210 + Duration: 275 Condition: concussion ValidTargets: Ground, Infantry, Vehicle, Ship - Warhead@Concussion2: GrantExternalCondition + Warhead@Concussion2: GrantExternalConditionCA Range: 3c0 - Duration: 140 + Duration: 175 Condition: concussion ValidTargets: Ground, Infantry, Vehicle, Ship Warhead@5Shake: ShakeScreen @@ -216,24 +235,14 @@ SeismicMissile: Intensity: 1 Multiplier: 0.5,0.5 -SeismicMissileDummy: - Inherits: SeismicMissile - -Report: - -Projectile: - Projectile: InstantHit - Warhead@1Dam: SpreadDamage - Damage: 1 - -Warhead@2Smu: - -Warhead@3Eff: - -Warhead@4EffWater: - -Warhead@Concussion1: - -Warhead@Concussion2: - -Warhead@5Shake: - Dragon: Inherits: ^AntiGroundMissile - Projectile: MissileCA - LockOnProbability: 95 + +DragonTargeter: + ReloadDelay: 50 + Range: 5c0 + MinRange: 0c512 + Projectile: InstantHit Dragon.TD: Inherits: Dragon @@ -241,7 +250,7 @@ Dragon.TD: Dragon.CYB: Inherits: Dragon - Report: rocket.aud + Report: itanweaa.aud, itanweab.aud, itanweac.aud Warhead@1Dam: SpreadDamage Damage: 7000 @@ -255,21 +264,26 @@ Dragon.CRYO: Explosions: cryohit ExplosionPalette: ra2effect-ignore-lighting-alpha75 ImpactSounds: cryohit.aud - Warhead@chill: GrantExternalCondition + Warhead@chill: GrantExternalConditionCA Condition: chilled - Duration: 60 + Duration: 75 Range: 0c341 ValidRelationships: Enemy, Neutral + InvalidTargets: Structure Dragon.TibCore: Inherits: Dragon Report: tibcore1.aud, tibcore2.aud, tibcore3.aud Projectile: MissileCA Image: tibcoremsl - RangeLimit: 8c0 + Speed: 266 + RangeLimit: 9c0 ContrailLength: 15 - ContrailColor: 33aa00aa - ContrailWidth: 0c40 + ContrailStartColor: 33aa00aa + ContrailStartColorAlpha: 170 + ContrailStartWidth: 0c40 + Warhead@1Dam: SpreadDamage + Damage: 5125 Warhead@3Eff: CreateEffect ImpactSounds: tibcorehit1.aud, tibcorehit2.aud, tibcorehit3.aud Warhead@tib: CreateEffect @@ -280,99 +294,159 @@ Dragon.TibCore: Dragon.CYB.TibCore: Inherits: Dragon.TibCore - Report: rocket.aud + Report: itanweaa.aud, itanweab.aud, itanweac.aud Warhead@1Dam: SpreadDamage - Damage: 7000 + Damage: 7175 -DragonE: +DragonGI: Inherits: Dragon Range: 6c0 + Report: iggiat2a.aud, iggiat2b.aud + ReloadDelay: 40 + Projectile: MissileCA + RangeLimit: 8c0 + Warhead@1Dam: SpreadDamage + Damage: 4500 + +DragonGI.CRYO: + Inherits: Dragon.CRYO + Range: 6c0 + Report: iggiat2a.aud, iggiat2b.aud + ReloadDelay: 40 + Projectile: MissileCA + RangeLimit: 8c0 + Warhead@1Dam: SpreadDamage + Damage: 4500 + +DragonBATF: + Inherits: Dragon + Range: 5c768 Projectile: MissileCA RangeLimit: 7c0 Warhead@1Dam: SpreadDamage - Damage: 2800 + Damage: 3750 -DragonE.TD: - Inherits: DragonE +DragonBATF.TD: + Inherits: DragonBATF Report: bazook1.aud -DragonE.CYB: - Inherits: DragonE - Report: rocket.aud +DragonBATF.CYB: + Inherits: DragonBATF + Report: itanweaa.aud, itanweab.aud, itanweac.aud Warhead@1Dam: SpreadDamage - Damage: 4200 + Damage: 4400 -DragonE.CRYO: +DragonBATF.CRYO: Inherits: Dragon.CRYO - Range: 6c0 + Range: 5c768 Projectile: MissileCA RangeLimit: 7c0 Warhead@1Dam: SpreadDamage - Damage: 2800 + Damage: 3750 -DragonE.TibCore: +DragonBATF.TibCore: Inherits: Dragon.TibCore - Range: 6c0 + Range: 5c768 Projectile: MissileCA RangeLimit: 9c0 Warhead@1Dam: SpreadDamage - Damage: 2800 + Damage: 3850 -DragonE.CYB.TibCore: - Inherits: DragonE.TibCore - Report: rocket.aud +DragonBATF.CYB.TibCore: + Inherits: DragonBATF.TibCore + Report: itanweaa.aud, itanweab.aud, itanweac.aud Warhead@1Dam: SpreadDamage - Damage: 4200 + Damage: 5400 HellfireAG: - Inherits: ^AntiGroundMissile - ReloadDelay: 100 - MinRange: 1c256 + Inherits: ^AirToGroundMissile + Range: 6c0 + ReloadDelay: 70 + MinRange: 0c768 Burst: 4 - BurstDelays: 14 + BurstDelays: 10 Projectile: MissileCA Speed: 256 HorizontalRateOfTurn: 40 - RangeLimit: 8c512 + RangeLimit: 10c0 Warhead@1Dam: SpreadDamage - Damage: 4500 + Damage: 5500 Versus: - None: 25 - Wood: 40 - Light: 70 - Concrete: 120 - Brick: 100 + None: 20 + Wood: 30 + Light: 65 + Concrete: 95 HellfireAG.Orca: Inherits: HellfireAG Report: orcamis1.aud - BurstDelays: 11 + BurstDelays: 8 -HellfireAG.Harrier: +HellfireAG.Cryo: Inherits: HellfireAG - Range: 12c0 - MinRange: 2c0 + Projectile: MissileCA + Image: cryomiss + Warhead@3Eff: CreateEffect + Explosions: cryohit + ExplosionPalette: ra2effect-ignore-lighting-alpha75 + ImpactSounds: cryohit.aud + Warhead@chill: GrantExternalConditionCA + Condition: chilled + Duration: 75 + Range: 0c341 + ValidRelationships: Enemy, Neutral + +HindRockets: + Inherits: HellfireAG + Range: 5c512 + ReloadDelay: 70 + Report: hind-rocket1.aud, hind-rocket2.aud + ValidTargets: Ground + BurstDelays: 12 + Burst: 6 + Warhead@1Dam: SpreadDamage + Damage: 3750 + Versus: + None: 100 + Light: 38 + Wood: 26 + Concrete: 26 + Heavy: 48 + +HindRockets.UPG: + Inherits: HindRockets + BurstDelays: 8 + +HellfireAG.Harrier: + Inherits: ^AirToGroundMissile + Range: 7c0 + MinRange: 0c768 + ReloadDelay: 70 Report: migmis.aud, migmis2.aud Burst: 2 BurstDelays: 10 TargetActorCenter: true Projectile: MissileCA + Speed: 488 RangeLimit: 12c512 ContrailLength: 10 + ContrailStartColor: dddddd + ContrailStartWidth: 52 Inaccuracy: 512 - LockOnInaccuracy: 512 + HorizontalRateOfTurn: 40 + VerticalRateOfTurn: 30 Warhead@1Dam: SpreadDamage Spread: 448 - Damage: 1600 + Damage: 2000 Falloff: 1000, 368, 135, 50, 18, 7, 0 ValidTargets: Ground, Water, Trees Versus: None: 100 - Wood: 65 - Light: 60 - Heavy: 40 - Concrete: 40 - DamageTypes: Prone50Percent, TriggerProne, SmallExplosionDeath + Wood: 50 + Light: 55 + Heavy: 28 + Concrete: 25 + DamageTypes: Prone50Percent, TriggerProne, SmallExplosionDeath, FlakVestMitigatedMinor, AirToGround Warhead@3Eff: CreateEffect Explosions: large_explosion ImpactSounds: kaboom15.aud @@ -381,74 +455,109 @@ HellfireAG.Harrier: HellfireAG.Horn: Inherits: HellfireAG.Harrier - Range: 5c0 - MinRange: 1c0 - Burst: 2 - Projectile: MissileCA - RangeLimit: 7c512 - ContrailLength: 0 + ReloadDelay: 50 + Range: 5c0 + MinRange: 0c768 + Burst: 2 + Projectile: MissileCA + RangeLimit: 7c512 + ContrailLength: 0 Warhead@1Dam: SpreadDamage Spread: 341 - Damage: 850 + Damage: 500 + Versus: + Wood: 85 + Concrete: 45 HellfireAA: Inherits: ^AirToAirMissile ReloadDelay: 60 Burst: 4 - BurstDelays: 14 + BurstDelays: 10 Warhead@1Dam: SpreadDamage Damage: 3000 - Warhead@2Dam: SpreadDamage + Warhead@smallDamage: SpreadDamage Damage: 3000 HellfireAA.Orca: Inherits: HellfireAA Report: orcamis1.aud - ReloadDelay: 70 - BurstDelays: 11 + BurstDelays: 8 + +HellfireAA.Cryo: + Inherits: HellfireAA + Projectile: MissileCA + Image: cryomiss + Warhead@3Eff: CreateEffect + Explosions: cryohit + ExplosionPalette: ra2effect-ignore-lighting-alpha75 + ImpactSounds: cryohit.aud + Warhead@chill: GrantExternalConditionCA + Condition: chilled + Duration: 75 + Range: 0c341 + ValidRelationships: Enemy, Neutral + +HellfireAA.Harrier: + Inherits: HellfireAA + Report: migmis.aud, migmis2.aud + Burst: 2 + BurstDelays: 10 + Range: 7c512 + Projectile: MissileCA + Speed: 488 + RangeLimit: 12c512 + ContrailLength: 10 + ContrailStartColor: dddddd + ContrailStartWidth: 52 + VerticalRateOfTurn: 30 + Warhead@1Dam: SpreadDamage + Damage: 8000 + Warhead@smallDamage: SpreadDamage + Damage: 8000 WidowAA: Inherits: ^AirToAirMissile ReloadDelay: 60 Report: vbleatta.aud, vbleattb.aud - Range: 8c0 + Range: 10c0 Burst: 2 BurstDelays: 10 Projectile: MissileCA Speed: 404 ContrailLength: 6 + ContrailStartColor: dddddd Warhead@1Dam: SpreadDamage Damage: 6000 - Warhead@2Dam: SpreadDamage + Warhead@smallDamage: SpreadDamage Damage: 6000 MammothTusk: Inherits: ^AntiGroundMissile - ReloadDelay: 60 + ReloadDelay: 70 Range: 6c512 Burst: 2 ValidTargets: Air, AirSmall, Infantry Projectile: MissileCA - Speed: 341 + Speed: 230 HorizontalRateOfTurn: 60 RangeLimit: 9c614 - LockOnInaccuracy: 512 Warhead@1Dam: SpreadDamage + ValidTargets: Ground, Water, Air Spread: 256 Versus: None: 100 - Light: 35 - Heavy: 35 - DamageTypes: Prone50Percent, TriggerProne, SmallExplosionDeath - Warhead@2Dam: SpreadDamage + Light: 100 + Heavy: 50 + Aircraft: 50 + DamageTypes: Prone50Percent, TriggerProne, SmallExplosionDeath, FlakVestMitigated + Warhead@smallDamage: SpreadDamage Damage: 2000 - Spread: 0c511 + Spread: 128 + Falloff: 100, 50, 14, 0 ValidTargets: AirSmall - Versus: - None: 100 - Light: 35 - Heavy: 35 - DamageTypes: Prone50Percent, TriggerProne, SmallExplosionDeath + ValidRelationships: Enemy, Neutral + DamageTypes: Prone50Percent, TriggerProne, SmallExplosionDeath, FlakVestMitigated Warhead@3Eff: CreateEffect ImpactSounds: kaboom15.aud ValidTargets: Ground, Trees @@ -457,10 +566,16 @@ MammothTusk: ImpactSounds: kaboom25.aud ValidTargets: Air, AirSmall +MammothTusk.Drone: + Inherits: MammothTusk + Warhead@1Dam: SpreadDamage + Damage: 3750 + ApocalypseTusk: Inherits: MammothTusk Report: vapoat2a.aud, vapoat2b.aud, vapoat2c.aud ValidTargets: Air, AirSmall + ReloadDelay: 60 Burst: 4 Range: 8c0 Projectile: MissileCA @@ -468,7 +583,7 @@ ApocalypseTusk: Speed: 401 Warhead@1Dam: SpreadDamage Damage: 4000 - Warhead@2Dam: SpreadDamage + Warhead@smallDamage: SpreadDamage Damage: 4000 TitanTusk: @@ -480,8 +595,13 @@ TitanTusk: RangeLimit: 10c614 Warhead@1Dam: SpreadDamage Damage: 10000 - Warhead@2Dam: SpreadDamage - Damage: 10000 + Warhead@smallDamage: SpreadDamage + Damage: 4000 + +TitanTusk.Gyro: + Inherits: TitanTusk + ReloadDelay: 38 + Range: 4c901 APCTusk: Inherits: MammothTusk @@ -491,46 +611,45 @@ Nike: Inherits: ^AntiAirMissile ReloadDelay: 20 Range: 7c512 + -MinRange: Report: samshot1.aud ValidTargets: Air, AirSmall, ICBM Projectile: MissileCA - Arm: 3 - Inaccuracy: 0 + Arm: 2 Image: MISSILE - HorizontalRateOfTurn: 100 - RangeLimit: 9c0 + RangeLimit: 10c512 Speed: 341 + MaximumLaunchAngle: 256 Warhead@1Dam: SpreadDamage Damage: 6750 Range: 0, 0c64, 0c256, 4c256 - ValidTargets: Air, ICBM - Warhead@2Dam: SpreadDamage + ValidTargets: Air + Warhead@smallDamage: SpreadDamage Damage: 6750 - Range: 0, 0c64, 0c256, 4c256 + Range: 0, 0c64, 0c256, 2c256 Falloff: 100, 70, 30, 10 - ValidTargets: AirSmall + ValidTargets: AirSmall, ICBM + DamageTypes: Prone50Percent, TriggerProne, SmallExplosionDeath Warhead@3Eff: CreateEffect ValidTargets: Air, AirSmall, ICBM, Ground, Water, Trees RedEye: - Inherits: Nike + Inherits: ^AntiAirMissile + Range: 6c512 ReloadDelay: 50 Report: missile1.aud ValidTargets: Air, AirSmall Projectile: MissileCA + Arm: 3 Image: Dragon - HorizontalRateOfTurn: 80 + RangeLimit: 9c0 Speed: 298 Warhead@1Dam: SpreadDamage Damage: 4000 - Range: 0, 0c64, 0c256, 3c0 - ValidTargets: Air - Warhead@2Dam: SpreadDamage - Damage: 4000 - -Range: - Spread: 0c48 - Falloff: 100, 25 - ValidTargets: AirSmall + Warhead@smallDamage: SpreadDamage + Damage: 7000 + Warhead@3Eff: CreateEffect + ValidTargets: Air, AirSmall, ICBM, Ground, Water, Trees RedEye.TibCore: Inherits: RedEye @@ -538,8 +657,9 @@ RedEye.TibCore: Projectile: MissileCA Image: tibcoremsl ContrailLength: 15 - ContrailColor: 33aa00aa - ContrailWidth: 0c40 + ContrailStartColor: 33aa00aa + ContrailStartColorAlpha: 170 + ContrailStartWidth: 0c40 Warhead@3Eff: CreateEffect ImpactSounds: tibcorehit1.aud, tibcorehit2.aud, tibcorehit3.aud Warhead@tib: CreateEffect @@ -550,19 +670,21 @@ RedEye.TibCore: RedEye.CYB: Inherits: RedEye - Report: rocket.aud + Range: 7c0 + Report: itanweaa.aud, itanweab.aud, itanweac.aud Warhead@1Dam: SpreadDamage Damage: 4600 - Warhead@2Dam: SpreadDamage - Damage: 4600 + Warhead@smallDamage: SpreadDamage + Damage: 6900 RedEye.CYB.TibCore: Inherits: RedEye.TibCore - Report: rocket.aud + Range: 7c0 + Report: itanweaa.aud, itanweab.aud, itanweac.aud Warhead@1Dam: SpreadDamage Damage: 4600 - Warhead@2Dam: SpreadDamage - Damage: 4600 + Warhead@smallDamage: SpreadDamage + Damage: 6900 RedEye.CRYO: Inherits: RedEye @@ -572,28 +694,24 @@ RedEye.CRYO: Explosions: cryohit ExplosionPalette: ra2effect-ignore-lighting-alpha75 ImpactSounds: cryoblast.aud - Warhead@chill: GrantExternalCondition + Warhead@chill: GrantExternalConditionCA Condition: chilled - Duration: 60 + Duration: 75 Range: 0c341 ValidTargets: Air, AirSmall ValidRelationships: Enemy, Neutral -RedEyeE: +RedEyeGI: Inherits: RedEye - Range: 9c0 - -RedEyeE.TibCore: - Inherits: RedEye.TibCore - Range: 9c0 - -RedEyeE.CYB: - Inherits: RedEyeE - Report: rocket.aud + Report: iggiat2a.aud, iggiat2b.aud + ReloadDelay: 40 + Range: 8c0 -RedEyeE.CYB.TibCore: - Inherits: RedEyeE.TibCore - Report: rocket.aud +RedEyeGI.CRYO: + Inherits: RedEye.CRYO + Report: iggiat2a.aud, iggiat2b.aud + ReloadDelay: 40 + Range: 8c0 Stinger: Inherits: ^AntiGroundMissile @@ -601,7 +719,7 @@ Stinger: Range: 9c0 Burst: 2 BurstDelays: 6 - InvalidTargets: Underwater + InvalidTargets: Submarine Projectile: MissileCA Arm: 3 Inaccuracy: 0 @@ -609,17 +727,17 @@ Stinger: RangeLimit: 10c0 Speed: 170 CloseEnough: 149 - LockOnInaccuracy: 512 Warhead@1Dam: SpreadDamage Spread: 368 Damage: 7000 + InvalidTargets: Submarine Versus: None: 36 Wood: 80 Light: 75 Heavy: 65 Concrete: 60 - Brick: 60 + Brick: 75 Warhead@3Eff: CreateEffect ImpactSounds: kaboom15.aud @@ -631,7 +749,6 @@ StingerAA: Speed: 255 CloseEnough: 298 LockOnProbability: 95 - LockOnInaccuracy: 256 Warhead@1Dam: SpreadDamage Damage: 3375 Range: 0, 0c64, 0c256, 3c0 @@ -644,37 +761,39 @@ StingerAA: Light: 100 Concrete: 100 Brick: 100 - Warhead@2Dam: SpreadDamage + Warhead@smallDamage: SpreadDamage Damage: 3375 - Range: 0, 0c32, 0c64 - Falloff: 100, 15, 5 + Spread: 128 + Falloff: 100, 50, 14, 0 ValidTargets: AirSmall + ValidRelationships: Enemy, Neutral + DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath Warhead@3Eff: CreateEffect Explosions: med_explosion_air ImpactActors: false StingerGTWR: Inherits: Stinger - ReloadDelay: 50 + ReloadDelay: 60 Range: 7c0 Report: rocket2.aud BurstDelays: 10 Projectile: MissileCA + Arm: 0 HorizontalRateOfTurn: 40 RangeLimit: 11c819 - Speed: 320 + Speed: 400 LockOnProbability: 66 Warhead@1Dam: SpreadDamage - Damage: 6600 - Spread: 0c384 - ValidTargets: Ground, Water + Damage: 8900 + Spread: 341 Versus: - None: 55 + None: 40 Wood: 55 Light: 70 - Heavy: 60 - Concrete: 70 - Brick: 40 + Heavy: 75 + Concrete: 60 + DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath Warhead@3Eff: CreateEffect Explosions: frag_3 ExplosionPalette: temptd @@ -682,8 +801,9 @@ StingerGTWR: APTusk: Inherits: ^AntiGroundMissile - ReloadDelay: 70 - Range: 6c0 + ValidTargets: Ground, Water, Air, AirSmall + ReloadDelay: 75 + Range: 7c0 Burst: 2 BurstDelays: 0 -Report: @@ -691,16 +811,119 @@ APTusk: Projectile: MissileCA Speed: 298 HorizontalRateOfTurn: 40 - RangeLimit: 7c204 - LockOnInaccuracy: 256 + RangeLimit: 8c0 + Warhead@1Dam: SpreadDamage + ValidTargets: Ground, Water, Air, AirSmall + Damage: 8000 + Spread: 256 + Versus: + None: 15 + Wood: 65 + Concrete: 70 + Light: 85 + Heavy: 100 + Aircraft: 25 + Warhead@3Eff: CreateEffect + Explosions: building, building2 + Warhead@4EffWater: CreateEffect + Explosions: large_splash + ImpactSounds: splashl1.aud, splashl2.aud + Warhead@5EffAir: CreateEffect + Explosions: med_explosion_air + ImpactSounds: kaboom25.aud + ValidTargets: Air, AirSmall + +TOW: + Inherits: ^AntiGroundMissile + Range: 5c0 + ValidTargets: Vehicle, Structure + Report: tow1.aud, tow2.aud + ReloadDelay: 200 + Projectile: MissileCA + Speed: 180 + Inaccuracy: 0 + HorizontalRateOfTurn: 20 + RangeLimit: 16c0 + PointDefenseType: Missile + ContrailLength: 17 + ContrailStartColor: ccccccaa + ContrailStartColorAlpha: 170 + ContrailStartWidth: 0c48 + MinimumLaunchAngle: 0 + MaximumLaunchAngle: 48 + Warhead@1Dam: SpreadDamage + Damage: 12500 + Versus: + Wood: 40 + Concrete: 30 + Light: 40 + DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath, TankBuster + Warhead@3Eff: CreateEffect + ImpactSounds: tow-hit1.aud + +PitbullRockets: + Inherits: ^AntiGroundMissile + Range: 6c0 + Report: pitbull-fire1.aud, pitbull-fire2.aud + ReloadDelay: 80 + Burst: 2 + BurstDelays: 4 + Projectile: MissileCA + Speed: 270 + ContrailLength: 17 + ContrailStartColor: ffaa00aa + ContrailStartColorAlpha: 170 + ContrailStartWidth: 0c48 Warhead@1Dam: SpreadDamage + Spread: 256 Damage: 7000 Versus: - None: 35 - Wood: 60 - Light: 60 - Heavy: 65 - Concrete: 80 + Wood: 40 + Concrete: 30 + Light: 100 + Heavy: 50 + Warhead@Blind: GrantExternalConditionCA + Range: 0c256 + Duration: 45 + Condition: blinded + ValidTargets: Vehicle + InvalidTargets: BlindImmune + Warhead@3Eff: CreateEffect + Explosions: idle + ExplosionPalette: caneon + Image: nullhit + ImpactSounds: pitbull-hit1.aud + +PitbullRocketsAA: + Inherits: RedEye + Range: 7c512 + Report: pitbull-fire1.aud, pitbull-fire2.aud + ReloadDelay: 80 + Burst: 2 + BurstDelays: 4 + Projectile: MissileCA + Speed: 270 + ContrailLength: 17 + ContrailStartColor: ffaa00aa + ContrailStartColorAlpha: 170 + ContrailStartWidth: 0c48 + Warhead@1Dam: SpreadDamage + Range: 0, 0c64, 0c256, 1c768 + Damage: 7200 + Warhead@smallDamage: SpreadDamage + Damage: 7200 + Warhead@Blind: GrantExternalConditionCA + Range: 0c256 + Duration: 50 + Condition: blinded + ValidTargets: Air, AirSmall + InvalidTargets: BlindImmune + ValidRelationships: Enemy, Neutral + Warhead@3Eff: CreateEffect + Explosions: idle + ExplosionPalette: caneon + Image: nullhit + ImpactSounds: pitbull-hit1.aud TorpTube: ReloadDelay: 100 @@ -720,8 +943,6 @@ TorpTube: Palette: shadow MaximumLaunchAngle: 0 CruiseAltitude: 0 - LockOnProbability: 90 - LockOnInaccuracy: 128 Warhead@1Dam: SpreadDamage Spread: 426 Damage: 12000 @@ -731,7 +952,6 @@ TorpTube: Light: 65 Heavy: 100 Concrete: 100 - Brick: 500 DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath Warhead@3Eff: CreateEffect Explosions: artillery_explosion @@ -745,7 +965,7 @@ TorpTube: ^SubMissileDefault: Inherits: ^AntiGroundMissile - ReloadDelay: 180 + ReloadDelay: 90 Range: 8c0 Burst: 2 Projectile: MissileCA @@ -753,14 +973,13 @@ TorpTube: Inaccuracy: 1c0 HorizontalRateOfTurn: 60 Image: MISSILE - LockOnInaccuracy: 1024 Warhead@1Dam: SpreadDamage Spread: 511 - Damage: 2500 + Damage: 1250 Falloff: 1000, 368, 135, 50, 18, 7, 0 Versus: None: 60 - Wood: 55 + Wood: 80 Concrete: 50 Warhead@3Eff: CreateEffect Explosions: building, building2 @@ -769,33 +988,29 @@ TorpTube: SubMissile: Inherits: ^SubMissileDefault - Range: 17c0 + Range: 14c0 Projectile: MissileCA Inaccuracy: 0c614 + Speed: 294 RangeLimit: 20c0 Image: dragon + CruiseAltitude: 0c128 #Used by ICBM, Missile but just Explosion HonestJohnSub: ValidTargets: Ground, Trees, Water, Air Warhead@1Dam: SpreadDamage - Spread: 512 - Damage: 10000 + Spread: 1c0 + Falloff: 1000, 368, 135, 50, 18, 7, 0 + Damage: 5000 Versus: - None: 70 + None: 45 Wood: 100 - Concrete: 90 - Light: 75 + Concrete: 85 + Light: 55 Heavy: 35 - Brick: 70 - DamageTypes: Prone50Percent, TriggerProne, FireDeath - Warhead@1Dam_impact: SpreadDamage - Spread: 1c0 - Damage: 3250 - Falloff: 1000, 368, 135, 50, 18, 7, 0 + Brick: 100 ValidTargets: Ground, Trees, Water, Air - Versus: - Brick: 25 AffectsParent: true DamageTypes: Prone50Percent, TriggerProne, FireDeath, Incendiary Warhead@2Res_impact: DestroyResource @@ -834,12 +1049,12 @@ HonestJohnSub: SCUD: Inherits: ^AntiGroundMissile ReloadDelay: 240 - Range: 10c0 - MinRange: 4c0 + Range: 12c0 + MinRange: 3c0 Report: missile1.aud -Projectile: Projectile: Bullet - Speed: 200 + Speed: 190 Blockable: false TrailImage: smokey TrailDelay: 5 @@ -849,17 +1064,15 @@ SCUD: LaunchAngle: 62 Warhead@1Dam: SpreadDamage Spread: 341 - Damage: 3400 - Falloff: 1000, 368, 135, 50, 18, 7, 0 - ValidTargets: Ground, Water, Trees + Damage: 3600 + Falloff: 1000, 448, 192, 50, 18, 7, 0 Versus: None: 90 - Wood: 65 - Light: 70 - Heavy: 40 + Wood: 80 + Light: 65 + Heavy: 45 Concrete: 50 - Brick: 45 - DamageTypes: Prone50Percent, TriggerProne, SmallExplosionDeath + DamageTypes: Prone50Percent, TriggerProne, SmallExplosionDeath, FlakVestMitigated Warhead@3Eff: CreateEffect Explosions: building, building2 Warhead@4EffWater: CreateEffect @@ -869,21 +1082,43 @@ SCUD: V3Weapon: Inherits: ^AntiGroundMissile -Report: - ValidTargets: Ground, Trees, Water, ICBM + ValidTargets: Ground, Trees, Water Warhead@1Dam: SpreadDamage Spread: 341 - Damage: 3400 - Falloff: 1000, 368, 135, 50, 18, 7, 0 - ValidTargets: Ground, Water, Trees, ICBM + Damage: 3600 + Falloff: 1000, 448, 192, 50, 18, 7, 0 Versus: None: 90 - Wood: 65 - Light: 70 - Heavy: 40 - Concrete: 50 - Brick: 45 - DamageTypes: Prone50Percent, TriggerProne, SmallExplosionDeath + Wood: 100 + Light: 65 + Heavy: 45 + Concrete: 60 + DamageTypes: Prone50Percent, TriggerProne, SmallExplosionDeath, FlakVestMitigated + Warhead@3Eff: CreateEffect + Explosions: building, building2 + ValidTargets: Ground, Air, Ship, Trees, ICBM + Warhead@4EffWater: CreateEffect + Explosions: large_splash + ImpactSounds: splashl1.aud, splashl2.aud + +THWeapon: + Inherits: ^AntiGroundMissile + -Report: + ValidTargets: Ground, Trees, Water + Warhead@1Dam: SpreadDamage + Spread: 448 + Damage: 3600 + Falloff: 1000, 448, 192, 50, 18, 7, 0 + ValidTargets: Ground, Water, Trees + Versus: + None: 90 + Wood: 100 + Light: 80 + Heavy: 100 + Concrete: 70 + DamageTypes: Prone50Percent, TriggerProne, SmallExplosionDeath, FlakVestMitigated Warhead@3Eff: CreateEffect + ImpactSounds: xplobig4.aud Explosions: building, building2 ValidTargets: Ground, Air, Ship, Trees, ICBM Warhead@4EffWater: CreateEffect @@ -892,43 +1127,71 @@ V3Weapon: KatyushaRockets: Inherits: ^AntiGroundMissile - ReloadDelay: 260 - Range: 9c0 + ReloadDelay: 180 + Range: 8c768 MinRange: 3c0 Report: katyrocket1.aud, katyrocket2.aud, katyrocket3.aud - Burst: 6 - BurstDelays: 6 + Burst: 3 + BurstDelays: 12 -Projectile: Projectile: Bullet - Inaccuracy: 2c512 + Inaccuracy: 1c512 + InaccuracyType: Absolute Image: dragon - Speed: 225 + Speed: 200 LaunchAngle: 70 TrailImage: smokey Shadow: true Blockable: false ValidTargets: Ground, Trees, Water Warhead@1Dam: SpreadDamage - Damage: 5250 - Spread: 384 + Damage: 4000 + Spread: 448 Versus: None: 100 - Wood: 80 - Concrete: 65 + Wood: 85 + Concrete: 45 Light: 80 Heavy: 45 + DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath, FlakVestMitigated Warhead@3Eff: CreateEffect Explosions: frag_3 ExplosionPalette: temptd ImpactSounds: kaboom15.aud ValidTargets: Ground, Ship, Trees +KatyushaRocketsWide: + Inherits: KatyushaRockets + Projectile: Bullet + Inaccuracy: 2c512 + +GradRockets: + Inherits: KatyushaRockets + Range: 13c0 + Report: grad-fire1.aud, grad-fire2.aud + Warhead@1Dam: SpreadDamage + Damage: 400 + Falloff: 1000, 368, 135, 50, 18, 7, 0 + +GradRocketsWide: + Inherits: GradRockets + Projectile: Bullet + Inaccuracy: 2c512 + +GradRockets.UPG: + Inherits: GradRockets + Burst: 5 + +GradRocketsWide.UPG: + Inherits: GradRocketsWide + Burst: 5 + HonestJohn: ReloadDelay: 130 Burst: 2 BurstDelays: 50 Range: 12c0 - MinRange: 4c0 + MinRange: 3c0 Report: rocket2.aud Projectile: Bullet Blockable: false @@ -940,70 +1203,112 @@ HonestJohn: Speed: 210 LaunchAngle: 37 Warhead@1Dam: SpreadDamage - Spread: 512 - Damage: 500 + Spread: 448 + Damage: 600 Falloff: 500, 368, 135, 50, 18, 7, 0 Versus: - None: 120 + None: 100 Wood: 100 - Concrete: 85 - Light: 80 - Heavy: 40 - Brick: 15 - DamageTypes: Prone50Percent, TriggerProne, FireDeath + Concrete: 80 + Light: 70 + Heavy: 35 + Brick: 5 + DamageTypes: Prone50Percent, TriggerProne, FireDeath, FlakVestMitigatedMinor Warhead@2Dam: SpreadDamage - Spread: 512 - Damage: 500 + Spread: 448 + Damage: 600 Falloff: 500, 368, 135, 50, 18, 7, 0 Delay: 3 Versus: - None: 120 + None: 100 Wood: 100 - Concrete: 85 - Light: 80 - Heavy: 40 - Brick: 15 - DamageTypes: Prone50Percent, TriggerProne, FireDeath + Concrete: 80 + Light: 70 + Heavy: 35 + Brick: 5 + DamageTypes: Prone50Percent, TriggerProne, FireDeath, FlakVestMitigatedMinor Warhead@3Dam: SpreadDamage - Spread: 512 - Damage: 500 + Spread: 448 + Damage: 600 Falloff: 500, 368, 135, 50, 18, 7, 0 Delay: 6 Versus: - None: 120 + None: 100 Wood: 100 - Concrete: 85 - Light: 80 - Heavy: 40 - Brick: 15 - DamageTypes: Prone50Percent, TriggerProne, FireDeath + Concrete: 80 + Light: 70 + Heavy: 35 + Brick: 5 + DamageTypes: Prone50Percent, TriggerProne, FireDeath, FlakVestMitigatedMinor Warhead@4Dam: SpreadDamage - Spread: 512 - Damage: 500 + Spread: 448 + Damage: 600 Falloff: 500, 368, 135, 50, 18, 7, 0 Delay: 9 Versus: - None: 120 + None: 100 Wood: 100 - Concrete: 85 - Light: 80 - Heavy: 40 - Brick: 15 - DamageTypes: Prone50Percent, TriggerProne, FireDeath + Concrete: 80 + Light: 70 + Heavy: 35 + Brick: 5 + DamageTypes: Prone50Percent, TriggerProne, FireDeath, FlakVestMitigatedMinor Warhead@2Smu: LeaveSmudge SmudgeType: Scorch Warhead@3Eff: CreateEffect Explosions: large_napalm ImpactSounds: firebl3.aud + ImpactActors: false Warhead@Flames: FireCluster Weapon: BurnFx RandomClusterCount: 5 Dimensions: 3,3 Footprint: xxx xxx xxx +HonestJohn.UPG: + Inherits: HonestJohn + ReloadDelay: 145 + Warhead@1Dam: SpreadDamage + Damage: 1200 + Versus: + Light: 100 + Heavy: 70 + DamageTypes: Prone50Percent, TriggerProne, FireDeath + Warhead@2Dam: SpreadDamage + Damage: 1200 + Versus: + Light: 100 + Heavy: 70 + DamageTypes: Prone50Percent, TriggerProne, FireDeath + -Warhead@3Dam: + -Warhead@4Dam: + Warhead@2Smu: LeaveSmudge + SmudgeType: Scorch-Black + Warhead@3Eff: CreateEffect + Explosions: large_blacknapalm + ExplosionPalette: scrin-ignore-lighting-alpha85 + Warhead@Flames: FireCluster + Weapon: BurnFxBlack + +HonestJohnTargeting: + Inherits: HonestJohn + ReloadDelay: 25 + -Report: + -Burst: + -BurstDelays: + -Projectile: + -Warhead@1Dam: + -Warhead@2Dam: + -Warhead@3Dam: + -Warhead@4Dam: + -Warhead@2Smu: + -Warhead@3Eff: + -Warhead@Flames: + Projectile: InstantHit + BikeRockets: Inherits: Dragon - Range: 4c512 + Range: 5c0 Report: bazook1.aud Burst: 2 BurstDelays: 5 @@ -1016,31 +1321,44 @@ BikeRockets: BikeRocketsAA: Inherits: RedEye + Range: 7c512 Report: bazook1.aud Burst: 2 BurstDelays: 5 Warhead@1Dam: SpreadDamage - Damage: 3000 - Warhead@2Dam: SpreadDamage - Damage: 3000 - Range: 0, 0c64, 0c256, 1c256 - Falloff: 100, 70, 30, 10 - ValidTargets: AirSmall + Damage: 3600 + Warhead@smallDamage: SpreadDamage + Spread: 192 + Damage: 3600 BikeRockets.TibCore: Inherits: BikeRockets Range: 5c512 Projectile: MissileCA + Speed: 266 Image: tibcoremsl ContrailLength: 15 - ContrailColor: 33aa00aa - ContrailWidth: 0c40 + ContrailStartColor: 33aa00aa + ContrailStartColorAlpha: 170 + ContrailStartWidth: 0c40 RangeLimit: 8c0 Report: tibcore1.aud, tibcore2.aud, tibcore3.aud Warhead@1Dam: SpreadDamage - Damage: 4400 + Damage: 4300 Versus: - Concrete: 70 + Heavy: 34 + Warhead@antiHeavySplash: SpreadDamage + Damage: 4300 + Spread: 341 + ValidTargets: Vehicle, Ship, Husk + Versus: + Heavy: 66 + None: 0 + Wood: 0 + Light: 0 + Concrete: 0 + Brick: 0 + DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath Warhead@3Eff: CreateEffect ImpactSounds: tibcorehit1.aud, tibcorehit2.aud, tibcorehit3.aud Warhead@tib: CreateEffect @@ -1053,14 +1371,16 @@ BikeRocketsAA.TibCore: Inherits: BikeRocketsAA Report: tibcore1.aud, tibcore2.aud, tibcore3.aud Projectile: MissileCA + Speed: 357 Image: tibcoremsl ContrailLength: 15 - ContrailColor: 33aa00aa - ContrailWidth: 0c40 + ContrailStartColor: 33aa00aa + ContrailStartColorAlpha: 170 + ContrailStartWidth: 0c40 Warhead@1Dam: SpreadDamage - Damage: 3300 - Warhead@2Dam: SpreadDamage - Damage: 3300 + Damage: 3870 + Warhead@smallDamage: SpreadDamage + Damage: 3870 Warhead@3Eff: CreateEffect ImpactSounds: tibcorehit1.aud, tibcorehit2.aud, tibcorehit3.aud Warhead@tib: CreateEffect @@ -1075,32 +1395,30 @@ SBRockets: IFVRockets: Inherits: Dragon - Range: 4c512 + Range: 4c768 Burst: 2 BurstDelays: 5 Warhead@1Dam: SpreadDamage Damage: 2750 Versus: - Wood: 55 - Concrete: 60 - Light: 80 + Wood: 40 + Concrete: 50 + Light: 80 IFVRocketsAA: Inherits: RedEye + Range: 7c512 Burst: 2 BurstDelays: 5 Warhead@1Dam: SpreadDamage - Damage: 2800 - Warhead@2Dam: SpreadDamage - Damage: 2800 - Range: 0, 0c64, 0c256, 1c256 - Falloff: 100, 70, 30, 10 - ValidTargets: AirSmall + Damage: 4200 + Warhead@smallDamage: SpreadDamage + Damage: 4200 IFVRocketsE: Inherits: IFVRockets Report: vifvatta.aud - Range: 5c512 + Range: 6c0 Projectile: MissileCA ContrailLength: 10 Warhead@1Dam: SpreadDamage @@ -1112,14 +1430,15 @@ IFVRocketsE.CRYO: Image: cryomiss Warhead@1Dam: SpreadDamage DamageTypes: Prone50Percent, TriggerProne, FrozenDeath - Damage: 2850 + Warhead@antiHeavySplash: SpreadDamage + DamageTypes: FrozenDeath Warhead@3Eff: CreateEffect Explosions: cryohit ExplosionPalette: ra2effect-ignore-lighting-alpha75 ImpactSounds: cryohit.aud - Warhead@chill: GrantExternalCondition + Warhead@chill: GrantExternalConditionCA Condition: chilled - Duration: 60 + Duration: 75 Range: 0c341 ValidRelationships: Enemy, Neutral @@ -1129,37 +1448,38 @@ IFVRocketsAAE: Projectile: MissileCA ContrailLength: 10 Warhead@1Dam: SpreadDamage - Damage: 3900 - Warhead@2Dam: SpreadDamage - Damage: 3900 - Range: 0, 0c64, 0c256, 1c256 - Falloff: 100, 70, 30, 10 - ValidTargets: AirSmall + Damage: 5000 + Warhead@smallDamage: SpreadDamage + Damage: 5000 IFVRocketsAAE.CRYO: Inherits: IFVRocketsAAE Projectile: MissileCA Image: cryomiss - Warhead@1Dam: SpreadDamage - Damage: 2950 Warhead@3Eff: CreateEffect Explosions: cryohit ExplosionPalette: ra2effect-ignore-lighting-alpha75 ImpactSounds: cryoblast.aud - Warhead@chill: GrantExternalCondition + Warhead@chill: GrantExternalConditionCA Condition: chilled - Duration: 60 + Duration: 75 Range: 0c341 ValidTargets: Air, AirSmall ValidRelationships: Enemy, Neutral +IFVRocketsE.TibCore: + Inherits: StnkMissile.TibCore + +IFVRocketsAAE.TibCore: + Inherits: StnkMissileAA.TibCore + #Artillery Missiles, lock-on but act dumb 227mm: Inherits: ^AntiGroundMissile ReloadDelay: 130 Burst: 2 BurstDelays: 4 - Range: 8c0 + Range: 9c0 MinRange: 3c0 Report: rocket1.aud Projectile: MissileCA @@ -1167,21 +1487,21 @@ IFVRocketsAAE.CRYO: Inaccuracy: 512 CruiseAltitude: 5c0 LockOnProbability: 66 - LockOnInaccuracy: 768 Jammable: false RangeLimit: 13c0 + MinimumLaunchAngle: 64 Warhead@1Dam: SpreadDamage Spread: 341 - Damage: 750 - Falloff: 1000, 368, 135, 50, 18, 7, 0 + Damage: 800 + Falloff: 1000, 448, 192, 50, 18, 7, 0 ValidTargets: Ground, Water, Trees Versus: None: 100 - Wood: 65 + Wood: 80 Light: 72 - Heavy: 35 - Concrete: 72 - DamageTypes: Prone50Percent, TriggerProne, SmallExplosionDeath + Heavy: 25 + Concrete: 80 + DamageTypes: Prone50Percent, TriggerProne, SmallExplosionDeath, FlakVestMitigated Warhead@3Eff: CreateEffect Explosions: large_explosion ImpactSounds: kaboom15.aud @@ -1191,63 +1511,81 @@ IFVRocketsAAE.CRYO: 227mmH: Inherits: 227mm Report: hovrmis1.aud + Range: 8c512 227mm.upg: Inherits: 227mm - Range: 8c768 Projectile: MissileCA ContrailLength: 15 + ContrailStartColorAlpha: 230 Warhead@1Dam: SpreadDamage - DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath + DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath, FlakVestMitigated 227mm.Hypersonic: Inherits: 227mm.upg Report: vaegattb.aud, vaegatta.aud - ReloadDelay: 120 + BurstDelays: 6 Projectile: MissileCA - Speed: 366 - Inaccuracy: 341 - LockOnInaccuracy: 512 - ContrailColor: 00FFFFE6 + -Projectile: + Projectile: Bullet + Image: DRAGON + TrailImage: smokey + Shadow: True + ContrailLength: 15 + ContrailStartColor: 00FFFFE6 + Speed: 1200 + Inaccuracy: 0c128 + LaunchAngle: 40 + Blockable: false Warhead@1Dam: SpreadDamage - Damage: 830 + Damage: 880 227mm.Hammerhead: Inherits: 227mm.upg BurstDelays: 12 Report: hammerheadmissile1.aud, hammerheadmissile2.aud Projectile: MissileCA - ContrailColor: FFCC00E6 + ContrailStartColor: FFCC00E6 + LockOnProbability: 100 + Speed: 250 Warhead@1Dam: SpreadDamage Damage: 860 Spread: 426 Warhead@4Eff: CreateEffect ImpactSounds: xplobig4.aud Explosions: artillery_explosion - Warhead@Concussion: GrantExternalCondition + Warhead@Concussion: GrantExternalConditionCA Range: 0c768 - Duration: 70 + Duration: 75 Condition: concussion 227mm.Hailstorm: Inherits: 227mm.upg - Range: 9c0 Report: hailstormmissile1.aud, hailstormmissile2.aud Burst: 6 BurstDelays: 6 - -Projectile: - Projectile: Bullet - Image: DRAGON - TrailImage: smokey - Shadow: True - ContrailLength: 15 - ContrailColor: FF4400E6 - Speed: 266 - Inaccuracy: 1c0 - LaunchAngle: 62 + Projectile: + ContrailStartColor: FF4400E6 + Inaccuracy: 1c256 + MinimumLaunchAngle: 200 + MaximumLaunchAngle: 250 + LockOnProbability: 100 + CruiseAltitude: 0 Warhead@1Dam: SpreadDamage Spread: 426 - Damage: 370 + Damage: 360 + +227mmH.Hypersonic: + Inherits: 227mm.Hypersonic + Range: 8c512 + +227mmH.Hammerhead: + Inherits: 227mm.Hammerhead + Range: 8c512 + +227mmH.Hailstorm: + Inherits: 227mm.Hailstorm + Range: 8c512 227mmAA: Inherits: ^AntiAirMissile @@ -1257,22 +1595,18 @@ IFVRocketsAAE.CRYO: Range: 6c512 Report: rocket1.aud Projectile: MissileCA - Speed: 280 + Speed: 230 Image: Dragon - Inaccuracy: 0 HorizontalRateOfTurn: 60 CruiseAltitude: 2c0 RangeLimit: 7c512 Warhead@1Dam: SpreadDamage - Damage: 1400 + Damage: 2200 Falloff: 100, 37, 14, 5, 0 - Spread: 0c128 + Spread: 0c256 -Range: - Warhead@2Dam: SpreadDamage - Damage: 1400 - Range: 0, 0c64, 0c256, 1c256 - Falloff: 100, 70, 30, 10 - ValidTargets: AirSmall + Warhead@smallDamage: SpreadDamage + Damage: 2200 Warhead@3Eff: CreateEffect ImpactSounds: xplos.aud @@ -1282,33 +1616,35 @@ IFVRocketsAAE.CRYO: 227mmAA.upg: Inherits: 227mmAA - Range: 7c512 + Range: 6c512 Projectile: MissileCA - Speed: 366 + Speed: 250 ContrailLength: 15 - RangeLimit: 8c512 + ContrailStartColorAlpha: 230 + RangeLimit: 7c512 Warhead@1Dam: SpreadDamage - Damage: 1700 - Warhead@2Dam: SpreadDamage - Damage: 1700 + Damage: 2600 + Warhead@smallDamage: SpreadDamage + Damage: 2600 227mmAA.Hypersonic: Inherits: 227mmAA.upg Report: vaegattb.aud, vaegatta.aud Projectile: MissileCA - ContrailColor: 00FFFFE6 + ContrailStartColor: 00FFFFE6 + Speed: 320 227mmAA.Hammerhead: Inherits: 227mmAA.upg Report: hammerheadmissile1.aud, hammerheadmissile2.aud Projectile: MissileCA - ContrailColor: FFCC00E6 + ContrailStartColor: FFCC00E6 227mmAA.Hailstorm: Inherits: 227mmAA.upg Report: hailstormmissile1.aud, hailstormmissile2.aud Projectile: MissileCA - ContrailColor: FF4400E6 + ContrailStartColor: FF4400E6 StnkMissile: Inherits: ^AntiGroundMissile @@ -1325,8 +1661,21 @@ StnkMissile: Damage: 5500 Versus: None: 25 - Wood: 75 + Wood: 70 Light: 100 + Heavy: 70 # 30% of anti-heavy damage moved to tankbuster warhead + Warhead@tankbuster: SpreadDamage + Spread: 128 + Damage: 5500 + ValidTargets: Vehicle, Ship, Husk + Versus: + Heavy: 30 + None: 0 + Wood: 0 + Light: 0 + Concrete: 0 + Brick: 0 + DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath, TankBuster Warhead@3Eff: CreateEffect ImpactSounds: xplos.aud Warhead@4EffWater: CreateEffect @@ -1335,23 +1684,20 @@ StnkMissile: StnkMissileAA: Inherits: ^AntiAirMissile ReloadDelay: 70 - Range: 7c0 + Range: 7c512 Report: rocket1.aud Burst: 2 BurstDelays: 4 Projectile: MissileCA Arm: 0 - Inaccuracy: 213 - HorizontalRateOfTurn: 40 - Speed: 283 + Inaccuracy: 128 + Speed: 298 RangeLimit: 9c0 Warhead@1Dam: SpreadDamage - Damage: 4000 - Warhead@2Dam: SpreadDamage - Damage: 4000 - Range: 0, 0c64, 0c256, 1c256 - Falloff: 100, 70, 30, 10 - ValidTargets: AirSmall + Damage: 4800 + Warhead@smallDamage: SpreadDamage + Spread: 192 + Damage: 4800 Warhead@3Eff: CreateEffect ImpactSounds: xplos.aud @@ -1362,14 +1708,23 @@ StnkMissile.TibCore: BurstDelays: 4, 7, 4 Range: 6c0 Projectile: MissileCA + Speed: 266 Image: tibcoremsl ContrailLength: 15 - ContrailColor: 33aa00aa - ContrailWidth: 0c40 - RangeLimit: 8c0 + ContrailStartColor: 33aa00aa + ContrailStartColorAlpha: 170 + ContrailStartWidth: 0c40 + RangeLimit: 9c0 Report: tibcore1.aud, tibcore2.aud, tibcore3.aud Warhead@1Dam: SpreadDamage - Damage: 3700 + Damage: 3850 + Versus: + Heavy: 0 + Warhead@tankbuster: SpreadDamage + Spread: 341 + Damage: 3850 + Versus: + Heavy: 100 Warhead@3Eff: CreateEffect ImpactSounds: tibcorehit1.aud, tibcorehit2.aud, tibcorehit3.aud Warhead@tib: CreateEffect @@ -1384,16 +1739,17 @@ StnkMissileAA.TibCore: Burst: 4 BurstDelays: 4, 7, 4 Projectile: MissileCA + Speed: 357 Image: tibcoremsl ContrailLength: 15 - ContrailColor: 33aa00aa - ContrailWidth: 0c40 - Speed: 316 + ContrailStartColor: 33aa00aa + ContrailStartColorAlpha: 170 + ContrailStartWidth: 0c40 Report: tibcore1.aud, tibcore2.aud, tibcore3.aud Warhead@1Dam: SpreadDamage - Damage: 2700 - Warhead@2Dam: SpreadDamage - Damage: 2700 + Damage: 3360 + Warhead@smallDamage: SpreadDamage + Damage: 3360 Warhead@3Eff: CreateEffect ImpactSounds: tibcorehit1.aud, tibcorehit2.aud, tibcorehit3.aud Warhead@tib: CreateEffect @@ -1402,6 +1758,81 @@ StnkMissileAA.TibCore: Image: shardhit ValidTargets: Air, AirSmall +HstkMissile: + Inherits: StnkMissile + ReloadDelay: 75 + Burst: 4 + BurstDelays: 4, 7, 4 + Projectile: MissileCA + HomingActivationDelay: 2 + CruiseAltitude: 256 + MinimumLaunchSpeed: 12 + MaximumLaunchSpeed: 36 + MinimumLaunchAngle: 128 + MaximumLaunchAngle: 128 + Acceleration: 768 + DirectFireMaxRange: 2c0 + Warhead@1Dam: SpreadDamage + Damage: 3850 + Warhead@tankbuster: SpreadDamage + Damage: 3850 + +HstkMissileAA: + Inherits: StnkMissileAA + ReloadDelay: 75 + Burst: 4 + BurstDelays: 4, 7, 4 + Projectile: MissileCA + MinimumLaunchSpeed: 12 + MaximumLaunchSpeed: 36 + Acceleration: 768 + Warhead@1Dam: SpreadDamage + Damage: 3360 + Warhead@smallDamage: SpreadDamage + Damage: 3360 + +HstkMissile.TibCore: + Inherits: StnkMissile.TibCore + Projectile: MissileCA + HomingActivationDelay: 2 + CruiseAltitude: 256 + MinimumLaunchSpeed: 12 + MaximumLaunchSpeed: 36 + MinimumLaunchAngle: 128 + MaximumLaunchAngle: 128 + Acceleration: 768 + Speed: 266 + DirectFireMaxRange: 2c0 + Warhead@1Dam: SpreadDamage + Damage: 4450 + Warhead@tankbuster: SpreadDamage + Damage: 4450 + Warhead@3Eff: CreateEffect + Explosions: large_explosion + ImpactSounds: expnew16.aud, expnew17.aud + Warhead@Flash: FlashTarget + Spread: 0c511 + Color: 00ff00 + ValidTargets: Ground, Vehicle + +HstkMissileAA.TibCore: + Inherits: StnkMissileAA.TibCore + Projectile: MissileCA + MinimumLaunchSpeed: 12 + MaximumLaunchSpeed: 36 + Acceleration: 768 + Speed: 357 + Warhead@1Dam: SpreadDamage + Damage: 3850 + Warhead@smallDamage: SpreadDamage + Damage: 3850 + Warhead@3Eff: CreateEffect + ImpactSounds: expnew17.aud + Warhead@Flash: FlashTarget + Spread: 0c511 + Color: 00ff00 + ValidTargets: Air, AirSmall + BoatMissile: Inherits: Stinger Report: rocket2.aud @@ -1412,10 +1843,9 @@ BoatMissile: Versus: None: 100 Wood: 68 - Light: 55 + Light: 40 Heavy: 40 Concrete: 50 - Brick: 50 DamageTypes: Prone50Percent, TriggerProne, SmallExplosionDeath Warhead@3Eff: CreateEffect Explosions: frag_3 @@ -1434,13 +1864,12 @@ BoatMissileAA: Rah66AG: ReloadDelay: 35 - Range: 5c0 + Range: 6c0 MinRange: 0c768 Report: rocket2.aud Burst: 4 BurstDelays: 4 ValidTargets: Ground, Water - InvalidTargets: Air TargetActorCenter: true Projectile: Bullet Blockable: false @@ -1452,23 +1881,24 @@ Rah66AG: Speed: 250 LaunchAngle: 10 ContrailLength: 15 - ContrailColor: 33aa00aa - ContrailWidth: 0c40 + ContrailStartColor: 33aa00aa + ContrailStartColorAlpha: 170 + ContrailStartWidth: 0c40 Warhead@1Dam: SpreadDamage Spread: 512 Damage: 800 Falloff: 1000, 368, 135, 50, 18, 7, 0 Versus: None: 85 - Wood: 60 + Wood: 55 Concrete: 30 Light: 55 - Heavy: 15 - Brick: 15 - DamageTypes: Prone50Percent, TriggerProne, SmallExplosionDeath + Heavy: 30 + Brick: 5 + DamageTypes: Prone50Percent, TriggerProne, SmallExplosionDeath, FlakVestMitigatedMinor, AirToGround Warhead@3Eff: CreateEffect Explosions: idle - ExplosionPalette: scrin + ExplosionPalette: caneon Image: tibexplodesm ImpactSounds: firebl3.aud ValidTargets: Ground, Air, Ship @@ -1483,8 +1913,9 @@ Rah66AG.BlackHand: Projectile: Bullet Image: dragon -ContrailLength: - -ContrailColor: - -ContrailWidth: + -ContrailStartColor: + -ContrailStartColorAlpha: + -ContrailStartWidth: Warhead@1Dam: SpreadDamage DamageTypes: Prone50Percent, TriggerProne, FireDeath Warhead@2Smu: LeaveSmudge @@ -1494,6 +1925,39 @@ Rah66AG.BlackHand: -ExplosionPalette: -Image: +Rah66AA: + Inherits: HellfireAA + ReloadDelay: 35 + Burst: 4 + BurstDelays: 4 + Report: rocket2.aud + Projectile: MissileCA + Speed: 250 + Image: tibcoremsl + ContrailLength: 15 + ContrailStartColor: 33aa00aa + ContrailStartColorAlpha: 170 + ContrailStartWidth: 0c40 + Warhead@3Eff: CreateEffect + Explosions: idle + ExplosionPalette: caneon + Image: tibexplodeair + ImpactSounds: firebl3.aud + ValidTargets: Air, AirSmall + Inaccuracy: 682 + +Rah66AA.BlackHand: + Inherits: Rah66AA + Projectile: MissileCA + Image: dragon + -ContrailLength: + -ContrailStartColor: + -ContrailStartColorAlpha: + -ContrailStartWidth: + Warhead@3Eff: CreateEffect + -Image: + Explosions: small_napalm_air + ScrinTorp: ValidTargets: Ground, Water, Trees ReloadDelay: 50 @@ -1501,7 +1965,7 @@ ScrinTorp: Burst: 3 BurstDelays: 4 Report: scrin5b.aud - Range: 6c512 + Range: 7c0 TargetActorCenter: true Projectile: Bullet Blockable: false @@ -1511,63 +1975,57 @@ ScrinTorp: Speed: 682 LaunchAngle: 10 Warhead@1Dam: SpreadDamage - Spread: 768 - Damage: 900 - Falloff: 1000, 368, 135, 50, 18, 7, 0 - ValidTargets: Ground, Water + Spread: 512 + Damage: 800 + Falloff: 1000, 448, 192, 64, 26, 10, 0 Versus: - None: 10 + None: 15 Wood: 35 - Concrete: 65 - Light: 25 - Heavy: 65 - Brick: 35 - DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath + Concrete: 90 + Light: 60 + Heavy: 100 + Brick: 95 + DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath, TankBuster, AirToGround Warhead@2Smu: LeaveSmudge SmudgeType: Scorch Warhead@3Eff: CreateEffect Explosions: large_explosion ImpactSounds: expnew16.aud, expnew17.aud - Warhead@green: GrantExternalCondition - Range: 0c511 - Duration: 2 - Condition: greenhighlight + Warhead@Flash: FlashTarget + Spread: 0c511 + Color: 00ff00 ValidTargets: Ground, Vehicle ScrinTorpAA: Inherits: ^AirToAirMissile - ReloadDelay: 60 + ReloadDelay: 40 Range: 7c0 Report: scrin5b.aud Burst: 3 BurstDelays: 4 - Projectile: Missile + Projectile: MissileCA Image: scrintorp Palette: tseffect-ignore-lighting-alpha90 -TrailImage: Jammable: false Warhead@1Dam: SpreadDamage - Damage: 3550 - Warhead@2Dam: SpreadDamage - Damage: 3550 - Range: 0, 0c64, 0c256, 1c256 - Falloff: 100, 70, 30, 10 - ValidTargets: AirSmall + Damage: 4000 + Warhead@smallDamage: SpreadDamage + Damage: 4000 Warhead@3Eff: CreateEffect ImpactSounds: expnew17.aud - Warhead@green: GrantExternalCondition - Range: 0c511 - Duration: 2 - Condition: greenhighlight + Warhead@Flash: FlashTarget + Spread: 0c511 + Color: 00ff00 ValidTargets: Air, AirSmall -U2Bomb: - ReloadDelay: 300 +SMIGBomb: + ReloadDelay: 150 Range: 8c0 Report: vmigatta.aud Projectile: Bullet Image: MISSILE - Speed: 213 + Speed: 256 Shadow: true Inaccuracy: 128 Blockable: false @@ -1612,15 +2070,16 @@ CryoMissile: Inaccuracy: 1c341 Image: dragon TrailImage: smokey - TrailPalette: cold1 + TrailPalette: cold TrailInterval: 1 TrailDelay: 1 Speed: 300 LaunchAngle: 65 ContrailLength: 17 - ContrailColor: 8fc6ffaa - ContrailWidth: 0c48 - ValidTargets: Ground, Trees, Water, Underwater, Air + ContrailStartColor: 8fc6ffaa + ContrailStartColorAlpha: 170 + ContrailStartWidth: 0c48 + ValidTargets: Ground, Water Warhead@1Dam: SpreadDamage Spread: 341 Damage: 2500 @@ -1631,23 +2090,28 @@ CryoMissile: Light: 100 Heavy: 70 Concrete: 75 - Brick: 1 + Brick: 5 DamageTypes: FrozenDeath Warhead@2Eff: CreateEffect Explosions: cryoblast ExplosionPalette: ra2effect-ignore-lighting-alpha75 ImpactSounds: cryoblast.aud - Warhead@chill1: GrantExternalCondition + Warhead@chill1: GrantExternalConditionCA Condition: chilled - Duration: 250 - Range: 1c0 + Duration: 200 + Range: 0c682 ValidRelationships: Enemy, Neutral - Warhead@chill2: GrantExternalCondition + Warhead@chill2: GrantExternalConditionCA + Condition: chilled + Duration: 200 + Range: 1c341 + ValidRelationships: Enemy, Neutral + Warhead@chill3: GrantExternalConditionCA Condition: chilled Duration: 200 Range: 2c0 ValidRelationships: Enemy, Neutral - Warhead@chillally: GrantExternalCondition + Warhead@chillally: GrantExternalConditionCA Condition: chilled Duration: 50 Range: 0c682 @@ -1659,12 +2123,427 @@ CryoMissile: Falloff: 100, 75, 52, 15, 2 MaxLevel: 600 -BATFRockets: - Inherits: Dragon +CryoMissileNHAW: + Inherits: CryoMissile + ReloadDelay: 50 + Report: vrocweaa.aud, vrocweab.aud + -Burst: + -BurstDelays: + Range: 7c0 + Projectile: Bullet + Image: cmiss + Speed: 230 + LaunchAngle: 3 + Warhead@1Dam: SpreadDamage + Damage: 1000 + +Rocket.P51.R: + ReloadDelay: 200 + Range: 9c0 + MinRange: 0c768 + Report: vintatta.aud + Burst: 4 + BurstDelays: 4 + FirstBurstTargetOffset: -1024,-613,0 + FollowingBurstTargetOffset: 682,0,0 + TargetActorCenter: true + Projectile: Bullet + Blockable: false + Shadow: true + Inaccuracy: 0c256 + Image: dragon + TrailImage: smokey + TrailDelay: 3 + Speed: 250 + LaunchAngle: 15, 30 + ContrailLength: 8 + ContrailStartWidth: 48 + Warhead@1Dam: SpreadDamage + Spread: 512 + Damage: 500 + Falloff: 1000, 448, 192, 50, 18, 7, 0 + Versus: + None: 85 + Wood: 25 + Concrete: 60 + Light: 70 + Heavy: 100 + Brick: 75 + DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath + Warhead@2Smu: LeaveSmudge + SmudgeType: Crater + InvalidTargets: Vehicle, Structure, Wall, Husk, Trees + Warhead@3Eff: CreateEffect + Explosions: med_explosion + ImpactSounds: kaboom25.aud + ValidTargets: Ground, Air, Ship, Trees + Warhead@4EffWater: CreateEffect + Explosions: med_splash + ImpactSounds: splash9.aud + ValidTargets: Water, Underwater + InvalidTargets: Ship, Structure, Bridge + +Rocket.P51.L: + Inherits: Rocket.P51.R + FirstBurstTargetOffset: -1024,613,0 + +Hydra.R: + ReloadDelay: 80 + Range: 6c0 + MinRange: 0c256 + Report: iggiat2a.aud, iggiat2b.aud + Burst: 6 + BurstDelays: 6 + FirstBurstTargetOffset: -512,-613,0 + FollowingBurstTargetOffset: 1024,0,0 + TargetActorCenter: true + Projectile: Bullet + Speed: 350 + LaunchAngle: 0 + Blockable: false + Shadow: true + Inaccuracy: 0c256 + Image: dragon + TrailImage: smokey + TrailDelay: 3 + ContrailStartColor: ebb968aa + ContrailLength: 10 + ContrailStartWidth: 0c42 + Warhead@1Dam: SpreadDamage + Spread: 512 + Damage: 315 + Falloff: 1000, 448, 192, 50, 18, 7, 0 + Versus: + None: 100 + Wood: 8 + Concrete: 60 + Light: 100 + Heavy: 100 + Brick: 75 + DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath, FlakVestMitigated, AirToGround + Warhead@2Smu: LeaveSmudge + SmudgeType: Crater + InvalidTargets: Vehicle, Structure, Wall, Husk, Trees + Warhead@3Eff: CreateEffect + Explosions: med_explosion + ImpactSounds: hydrahit1.aud, hydrahit2.aud + ValidTargets: Ground, Air, Ship, Trees + Warhead@4EffWater: CreateEffect + Explosions: med_splash + ImpactSounds: splash9.aud + ValidTargets: Water, Underwater + InvalidTargets: Ship, Structure, Bridge + +Hydra.L: + Inherits: Hydra.R + FirstBurstTargetOffset: -758,613,0 + +BlackEagleMissiles: + Inherits: Maverick + Report: beag-fire1.aud, beag-fire2.aud + -Burst: + -BurstDelays: + Projectile: MissileCA + Image: MISSILE + Warhead@1Dam: SpreadDamage + Damage: 24000 + Spread: 256 + Versus: + Concrete: 75 + Warhead@VeiledCondition: GrantExternalConditionCA + Range: 2c0 + Duration: 175 + Condition: gapveiled + ValidTargets: Infantry, Vehicle, Ship + ValidRelationships: Enemy, Neutral + Warhead@3Eff: CreateEffect + Explosions: idle + Image: veilblast + ExplosionPalette: effect + ImpactSounds: veilblast.aud + ValidTargets: Ground, Air, Ship, Trees + +BlackEagleMissilesAA: + Inherits: MaverickAA + Range: 11c0 + Report: beag-fire1.aud, beag-fire2.aud + -Burst: + -BurstDelays: + Projectile: MissileCA + Image: MISSILE + Speed: 450 + Warhead@1Dam: SpreadDamage + Damage: 16000 + Warhead@VeiledCondition: GrantExternalConditionCA + Range: 2c0 + Duration: 175 + Condition: gapveiled + ValidTargets: Air, AirSmall + ValidRelationships: Enemy, Neutral + Warhead@3Eff: CreateEffect + Explosions: idle + Image: veilblast + ExplosionPalette: effect + ImpactSounds: veilblast.aud + ValidTargets: Ground, Air, Ship, Trees + +PhantomMissiles: + Inherits: Maverick + Report: beag-fire1.aud, beag-fire2.aud + Projectile: MissileCA + Image: MISSILE + Speed: 550 + TrailInterval: 1 + Warhead@1Dam: SpreadDamage + Damage: 12000 + Versus: + Concrete: 75 + Warhead@3Eff: CreateEffect + Explosions: idle + ExplosionPalette: caneon + Image: nullhit + ImpactSounds: null-hit1.aud + Warhead@Blind: GrantExternalConditionCA + Range: 0c256 + Duration: 150 + Condition: blinded + InvalidTargets: BlindImmune + +PhantomMissilesAA: + Inherits: MaverickAA + Range: 9c0 + Report: beag-fire1.aud, beag-fire2.aud + Projectile: MissileCA + Image: MISSILE + Speed: 550 + TrailInterval: 1 + Warhead@1Dam: SpreadDamage + Damage: 8000 + Warhead@3Eff: CreateEffect + Explosions: idle + ExplosionPalette: caneon + Image: nullhit + ImpactSounds: null-hit1.aud + Warhead@Blind: GrantExternalConditionCA + Range: 0c341 + Duration: 150 + Condition: blinded + ValidTargets: Air, AirSmall + InvalidTargets: BlindImmune + ValidRelationships: Enemy, Neutral + +RocketShells: + Inherits: JuggernautGun + -StartBurstReport: + -Projectile: + Report: rocketshell1.aud, rocketshell2.aud, rocketshell3.aud + Projectile: MissileCA + Speed: 255 + Blockable: false + Image: 120MM + TrailImage: smokey + Shadow: true + HorizontalRateOfTurn: 30 + VerticalRateOfTurn: 30 + PointDefenseType: Missile + HomingActivationDelay: 7 + MinimumLaunchSpeed: 200 + MaximumLaunchSpeed: 200 + Acceleration: 30 + MinimumLaunchAngle: 100 + MaximumLaunchAngle: 100 + ContrailLength: 15 + ContrailStartColor: aaaa00aa + ContrailStartColorAlpha: 170 + ContrailStartWidth: 0c40 + Gravity: 0 + CruiseAltitude: 2c0 + Inaccuracy: 128 + AllowSnapping: true + +CyborgReaperMissiles: + Inherits: ^AntiGroundMissile + ReloadDelay: 65 Burst: 2 - Range: 4c768 + BurstDelays: 10 + Range: 6c0 + Report: reap-fire1.aud, reap-fire2.aud + Projectile: MissileCA + Speed: 220 + ContrailLength: 15 + ContrailStartColor: aa0000aa + ContrailStartColorAlpha: 200 + ContrailStartWidth: 0c40 Warhead@1Dam: SpreadDamage - Damage: 2200 + Spread: 448 + Damage: 5500 + Versus: + None: 100 + Wood: 75 + Light: 75 + Heavy: 25 + Concrete: 50 + DamageTypes: Prone50Percent, TriggerProne, SmallExplosionDeath, FlakVestMitigated + Warhead@3Eff: CreateEffect + Explosions: large_explosion + ImpactSounds: reap-explosion1.aud + +CyborgReaperMissilesAA: + Inherits: ^AntiAirMissile + ReloadDelay: 65 + Burst: 2 + BurstDelays: 10 + Range: 6c0 + Report: reap-fire1.aud, reap-fire2.aud + Projectile: MissileCA + Speed: 250 + ContrailLength: 15 + ContrailStartColor: aa0000aa + ContrailStartColorAlpha: 200 + Warhead@1Dam: SpreadDamage + -Falloff: + -Range: + Damage: 5500 + Spread: 448 + Warhead@smallDamage: SpreadDamage + Damage: 5500 + +CyborgReaperSnare: + ReloadDelay: 375 + Range: 9c0 + Report: reap-snarefire.aud + Projectile: Bullet + Blockable: false + ContrailLength: 30 + ContrailStartColorAlpha: 100 + ContrailStartColor: 00FF00 + Speed: 330 + Inaccuracy: 128 + Image: flakball + Shadow: true + LaunchAngle: 120 + Warhead@1Dam: SpreadDamage + Damage: 1 + Warhead@Snare: GrantExternalConditionCA + Condition: reapersnare + Duration: 100 + Range: 1c0 + InvalidTargets: ReaperSnareImmune + Warhead@3Eff: CreateEffect + Explosions: reap-snarehit + ImpactSounds: reap-snarehit.aud + ValidTargets: Ground, Ship, Trees + +KamovRockets: + Inherits: ^AirToGroundMissile + ReloadDelay: 100 + Range: 9c0 + MinRange: 3c0 + Report: hind-rocket1.aud, hind-rocket2.aud + Burst: 3 + BurstDelays: 12 + -Projectile: + Projectile: Bullet + Inaccuracy: 1c512 + InaccuracyType: Absolute + Image: dragon + Speed: 225 + LaunchAngle: 0 + TrailImage: smokey + Shadow: true + Blockable: false + ValidTargets: Ground, Trees, Water + Warhead@1Dam: SpreadDamage + Damage: 6500 + Spread: 448 + Versus: + None: 10 + Wood: 20 + Concrete: 40 + Light: 65 + Heavy: 100 + DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath, AirToGround, TankBuster, FlakVestMitigated + Warhead@3Eff: CreateEffect + Explosions: frag_3 + ExplosionPalette: temptd + ImpactSounds: kaboom15.aud + ValidTargets: Ground, Ship, Trees + Warhead@Concussion: GrantExternalConditionCA + Range: 1c0 + Duration: 150 + Condition: concussion + ValidTargets: Ground, Infantry, Vehicle, Ship + +KamovRocketsWide: + Inherits: KamovRockets + Projectile: Bullet + Inaccuracy: 2c512 + +^TigerGuardMissileProjectile: + Projectile: MissileCA + Speed: 180 + Image: missilesm + RangeLimit: 15c0 + TrailImage: smokeydark + Arm: 0 + Inaccuracy: 0 + HorizontalRateOfTurn: 40 + LockOnProbability: 100 + HomingActivationDelay: 2 + CruiseAltitude: 1c0 + MinimumLaunchSpeed: 12 + MaximumLaunchSpeed: 36 + MinimumLaunchAngle: 160 + MaximumLaunchAngle: 160 + Acceleration: 768 + ContrailLength: 10 + ContrailStartWidth: 48 + ContrailStartColor: aaaaaa88 + ContrailStartColorAlpha: 128 + +TigerGuardMissile: + Inherits: ^AntiGroundMissile + Inherits@Projectile: ^TigerGuardMissileProjectile + ReloadDelay: 125 + Range: 12c0 + MinRange: 3c0 + Report: tigr-fire1.aud, tigr-fire2.aud + Warhead@1Dam: SpreadDamage + Damage: 8000 Versus: - Concrete: 55 - Light: 25 + None: 10 + Wood: 40 + Light: 75 + Heavy: 100 + Concrete: 50 + Brick: 75 + Warhead@VeiledCondition: GrantExternalConditionCA + Range: 0c341 + Duration: 100 + Condition: gapveiled + ValidTargets: Infantry, Vehicle, Ship + +TigerGuardMissileAA: + Inherits: ^AntiAirMissile + Inherits@Projectile: ^TigerGuardMissileProjectile + ReloadDelay: 125 + Range: 9c0 + Report: tigr-fire1.aud, tigr-fire2.aud + Projectile: MissileCA + RangeLimit: 12c0 + CruiseAltitude: 1c256 + Warhead@1Dam: SpreadDamage + Damage: 8000 + Warhead@smallDamage: SpreadDamage + Damage: 12000 + Warhead@3Eff: CreateEffect + ValidTargets: Air, AirSmall, ICBM, Ground, Water, Trees + Warhead@VeiledCondition: GrantExternalConditionCA + Range: 0c341 + Duration: 100 + Condition: gapveiled + ValidTargets: Air, AirSmall + +TigerGuardMissileBATF: + Inherits: TigerGuardMissile + Range: 12c0 diff --git a/mods/ca/weapons/other.yaml b/mods/ca/weapons/other.yaml index 269e650aaf..7841356f91 100644 --- a/mods/ca/weapons/other.yaml +++ b/mods/ca/weapons/other.yaml @@ -1,6 +1,5 @@ ^FireWeapon: ValidTargets: Ground, Water, Trees - ReloadDelay: 65 Range: 5c0 Warhead@1Dam: SpreadDamage Spread: 213 @@ -14,7 +13,7 @@ Light: 60 Heavy: 25 Concrete: 25 - Brick: 20 + Brick: 5 DamageTypes: Prone50Percent, TriggerProne, FireDeath, Incendiary Warhead@2Smu: LeaveSmudge SmudgeType: Scorch @@ -33,6 +32,7 @@ FireballLauncher: Inherits: ^FireWeapon Report: firebl3.aud Range: 6c0 + ReloadDelay: 62 Projectile: BulletCA Speed: 250 TrailImage: fb2 @@ -46,6 +46,7 @@ FireballLauncher: Light: 0 Heavy: 10 Concrete: 15 + Wood: 24 Warhead@2Dam: SpreadDamage Spread: 512 Range: 0, 0c512, 2c512 @@ -63,7 +64,7 @@ FireballLauncher: ChemballLauncher: Inherits: FireballLauncher - ReloadDelay: 60 + ReloadDelay: 70 Projectile: BulletCA TrailImage: cb2 TrailPalette: temptd @@ -71,6 +72,7 @@ ChemballLauncher: Image: cb1 Palette: temptd Warhead@1Dam: SpreadDamage + Spread: 288 Versus: Heavy: 15 DamageTypes: Prone50Percent, TriggerProne, RadiationDeath @@ -80,13 +82,14 @@ ChemballLauncher: Warhead@3Eff: CreateEffect Explosions: med_chem ExplosionPalette: temptd + AirThreshold: 256 Warhead@2Smu: LeaveSmudge SmudgeType: Scorch-NoFlame -Warhead@Flames: FireballGun: Inherits: FireballLauncher - Range: 3c769 + Range: 4c275 ReloadDelay: 40 Projectile: BulletCA Speed: 140 @@ -96,9 +99,11 @@ FireballGun: Spread: 288 Falloff: 100, 50, 25, 12, 6, 3, 0 Versus: + None: 100 Concrete: 10 Light: 25 Heavy: 10 + Wood: 50 Warhead@3Eff: CreateEffect Explosions: small_napalm -Warhead@2Dam: @@ -106,7 +111,6 @@ FireballGun: Napalmtd: ValidTargets: Ground, Water, Trees - InvalidTargets: Air ReloadDelay: 50 Report: chute1.aud Burst: 7 @@ -121,16 +125,16 @@ Napalmtd: Warhead@1Dam: SpreadDamage Spread: 512 Damage: 1500 - Falloff: 1000, 368, 135, 50, 18, 7, 0 + Falloff: 1000, 500, 135, 50, 18, 7, 0 ValidTargets: Ground, Water Versus: None: 100 - Wood: 58 - Light: 80 + Wood: 0 + Light: 100 Heavy: 55 - Concrete: 35 - Brick: 25 - DamageTypes: Prone50Percent, TriggerProne, FireDeath + Concrete: 55 + Brick: 5 + DamageTypes: Prone50Percent, TriggerProne, FireDeath, FlakVestMitigatedMinor, AirToGround Warhead@2Smu: LeaveSmudge SmudgeType: Scorch Warhead@3Eff: CreateEffect @@ -142,74 +146,60 @@ Napalmtd: Dimensions: 3,3 Footprint: xxx xxx xxx -Flamer: +NapalmtdBuilding: + Inherits: Napalmtd + -Report: + -Projectile: + Projectile: InstantHit + TargetActorCenter: false + Warhead@1Dam: SpreadDamage + Delay: 35 + Versus: + None: 0 + Wood: 36 + Light: 0 + Heavy: 0 + Concrete: 0 + Brick: 0 + DebugOverlayColor: ffaa00 + -Warhead@2Smu: + -Warhead@3Eff: + -Warhead@Flames: + +NapalmtdBomber: + Inherits: Napalmtd + Warhead@1Dam: SpreadDamage + Versus: + Wood: 60 + +Chemspray: ReloadDelay: 50 Range: 3c769 StartBurstReport: flamer2.aud + Burst: 5 + BurstDelays: 5 Projectile: Bullet Speed: 90 Inaccuracy: 484 - Image: flameall - Palette: tseffect-ignore-lighting-alpha90 + Image: chemall + Palette: ra2effect-ignore-lighting-alpha50 LaunchAngle: 5 - Burst: 5 - BurstDelays: 5 Warhead@1Dam: SpreadDamage Spread: 288 Falloff: 100, 50, 25, 12, 6, 3, 0 - Damage: 1300 + Damage: 1450 Versus: None: 300 Wood: 135 Tree: 120 - Light: 59 - Heavy: 30 - Concrete: 30 - Brick: 2 - DamageTypes: Prone50Percent, TriggerProne, FireDeath - Warhead@2Smu: LeaveSmudge - SmudgeType: Scorch - InvalidTargets: Vehicle, Building, Wall - Warhead@Flames: FireCluster - Weapon: BurnFx - RandomClusterCount: 1 - Dimensions: 1,1 - Footprint: x - -# --- old version -BigFlamer: - Inherits: Flamer - Range: 4c256 - StartBurstReport: flamer3.aud - Warhead@1Dam: SpreadDamage - Damage: 2200 - Versus: - Wood: 120 - -FlamerE: - Inherits: Flamer - Range: 5c0 - -# --- old version -Chemspray: - Inherits: Flamer - Projectile: Bullet - Image: chemall - Palette: ra2effect-ignore-lighting-alpha50 - Warhead@1Dam: SpreadDamage - Damage: 1450 - Versus: + Brick: 5 Concrete: 45 Light: 85 Heavy: 50 DamageTypes: Prone50Percent, TriggerProne, RadiationDeath - -Warhead@Flames: Warhead@2Smu: LeaveSmudge SmudgeType: Scorch-NoFlame - -ChemsprayE: - Inherits: Chemspray - Range: 5c0 + InvalidTargets: Vehicle, Building, Wall FlamerTD: ReloadDelay: 65 @@ -219,13 +209,12 @@ FlamerTD: TargetActorCenter: true Projectile: LinearPulse Speed: 256 - ImpactInterval: 1 MinimumImpactDistance: 0c768 MaximumImpactDistance: 1c768 - ForceGround: true + ForceGround: DamageOnly Warhead@1Dam: SpreadDamage Spread: 426 - Falloff: 100, 50, 20, 0 + Falloff: 100, 35, 10, 0 Damage: 1850 Versus: None: 300 @@ -234,15 +223,13 @@ FlamerTD: Light: 70 Heavy: 30 Concrete: 30 - Brick: 2 + Brick: 5 DamageTypes: Prone50Percent, TriggerProne, FireDeath ValidRelationships: Enemy, Neutral - DebugOverlayColor: ffaa00 Delay: 5 Warhead@2Smu: LeaveSmudge SmudgeType: Scorch InvalidTargets: Vehicle, Building, Wall - Warhead@Dummy: Dummy FlamerTDFF: Inherits: FlamerTD @@ -251,38 +238,53 @@ FlamerTDFF: Warhead@1Dam: SpreadDamage Falloff: 100, 50, 0 ValidRelationships: Ally - -DebugOverlayColor: + DebugOverlayColor: ffaa00 + -Warhead@2Smu: BigFlamerTD: Inherits: FlamerTD Burst: 2 BurstDelays: 5 Projectile: LinearPulse - Speed: 96 - ImpactInterval: 3 - Image: flameallfast + Speed: 288 Inaccuracy: 484 - Palette: tseffect-ignore-lighting-alpha90 MinimumImpactDistance: 288 MaximumImpactDistance: 2304 - -ForceGround: + ProjectileAnimation@1: + Speed: 96 + Image: flameallfast + Palette: tseffect-ignore-lighting-alpha90 Warhead@1Dam: SpreadDamage Damage: 925 + Versus: + Light: 100 + Concrete: 50 + +BigFlamerTD.Decoy: + Inherits: BigFlamerTD + Warhead@1Dam: SpreadDamage + Damage: 0 + -Warhead@2Smu: + +FlamerTDBATF: + Inherits: BigFlamerTD + Burst: 1 BigFlamerTDFF: Inherits: BigFlamerTD Projectile: LinearPulse - -Image: - -Palette: + -ProjectileAnimation@1: MinimumImpactDistance: 1440 Warhead@1Dam: SpreadDamage Falloff: 100, 50, 0 ValidRelationships: Ally - -DebugOverlayColor: + DebugOverlayColor: ffaa00 + -Warhead@2Smu: ChemsprayTD: Inherits: FlamerTD Warhead@1Dam: SpreadDamage + Falloff: 100, 45, 20, 0 Damage: 2000 Versus: Concrete: 40 @@ -299,33 +301,99 @@ ChemsprayTDFF: Concrete: 40 Heavy: 40 DamageTypes: Prone50Percent, TriggerProne, RadiationDeath + InvalidTargets: ChemWarrior + +ChemsprayTDBATF: + Inherits: BigFlamerTD + Burst: 1 + Projectile: LinearPulse + ProjectileAnimation@1: + Image: chemallfast + Palette: ra2effect-ignore-lighting-alpha90 + Warhead@1Dam: SpreadDamage + Damage: 1100 + DamageTypes: Prone50Percent, TriggerProne, RadiationDeath Warhead@2Smu: LeaveSmudge SmudgeType: Scorch-NoFlame HeavyFlameTankFlamer: Inherits: BigFlamerTD -Report: - ReloadDelay: 75 - Burst: 30 + ReloadDelay: 80 + Burst: 25 BurstDelays: 2 Warhead@1Dam: SpreadDamage - Damage: 130 + Falloff: 100, 45, 20, 0 + Damage: 175 Versus: None: 230 Warhead@2Smu: LeaveSmudge AirThreshold: 256 Chance: 10 +HeavyFlameTankFlamer.Decoy: + Inherits: HeavyFlameTankFlamer + Warhead@1Dam: SpreadDamage + Damage: 0 + -Warhead@2Smu: + +HeavyFlameTankFlamer.UPG: + Inherits: HeavyFlameTankFlamer + ReloadDelay: 95 + Projectile: LinearPulse + ProjectileAnimation@1: + Image: flameallblack + Palette: scrin-ignore-lighting-alpha85 + Warhead@1Dam: SpreadDamage + Damage: 180 + Versus: + Heavy: 70 + Concrete: 60 + Warhead@2Smu: LeaveSmudge + SmudgeType: Scorch-Black + +HeavyFlameTankFlamer.UPG.Decoy: + Inherits: HeavyFlameTankFlamer.UPG + Warhead@1Dam: SpreadDamage + Damage: 0 + -Warhead@2Smu: + HeavyFlameTankFlamerFF: Inherits: HeavyFlameTankFlamer Projectile: LinearPulse - -Image: - -Palette: + -ProjectileAnimation@1: MinimumImpactDistance: 1440 Warhead@1Dam: SpreadDamage Falloff: 100, 50, 0 ValidRelationships: Ally - -DebugOverlayColor: + DebugOverlayColor: ffaa00 + -Warhead@2Smu: + +HeavyFlameTankFlamerFF.UPG: + Inherits: HeavyFlameTankFlamerFF + ReloadDelay: 95 + +AvatarFlamer: + Inherits: HeavyFlameTankFlamer + Burst: 13 + BurstDelays: 4 + Warhead@1Dam: SpreadDamage + Damage: 260 + +AvatarFlamer.UPG: + Inherits: HeavyFlameTankFlamer.UPG + Burst: 13 + BurstDelays: 4 + Warhead@1Dam: SpreadDamage + Damage: 270 + +AvatarFlamerFF: + Inherits: HeavyFlameTankFlamerFF + Burst: 13 + BurstDelays: 4 + +AvatarFlamerFF.UPG: + ReloadDelay: 95 BlackHandFlamer: Inherits: HeavyFlameTankFlamer @@ -334,25 +402,26 @@ BlackHandFlamer: Burst: 28 Range: 3c512 Projectile: LinearPulse - Speed: 220 - ImpactInterval: 2 + Speed: 440 Inaccuracy: 160 - Image: thinblueflame - Palette: effect-ignore-lighting-alpha85 MinimumImpactDistance: 440 MaximumImpactDistance: 3c512 - RepeatAnimation: false + ProjectileAnimation@1: + Speed: 220 + Image: thinblueflame + Palette: effect-ignore-lighting-alpha85 + RepeatAnimation: false Warhead@1Dam: SpreadDamage Range: 0, 256, 512 Falloff: 100, 100, 0 - Damage: 200 + Damage: 260 Versus: - None: 100 + None: 55 Wood: 15 - Light: 75 + Light: 70 Heavy: 100 - Concrete: 45 - Brick: 2 + Concrete: 35 + Brick: 5 -Delay: Warhead@2Smu: LeaveSmudge Chance: 5 @@ -371,18 +440,18 @@ Napalm: Versus: Wood: 100 Concrete: 50 - Brick: 50 ^TeslaWeapon: ReloadDelay: 3 Range: 7c0 Report: tesla1.aud - Projectile: TeslaZap + Projectile: TeslaZapCA Warhead@1Dam: SpreadDamage Spread: 42 Damage: 10000 Versus: None: 1000 + Brick: 5 DamageTypes: Prone50Percent, TriggerProne, ElectricityDeath Warhead@2Smu: LeaveSmudge SmudgeType: Scorch @@ -392,6 +461,7 @@ TeslaZap: Warhead@1Dam: SpreadDamage Versus: Wood: 60 + Concrete: 80 TeslaZapBoost1: Inherits: TeslaZap @@ -413,20 +483,26 @@ TeslaZapBoost3: PortaTesla: Inherits: ^TeslaWeapon - ReloadDelay: 70 + ReloadDelay: 100 Range: 6c0 Report: shktrop1.aud Warhead@1Dam: SpreadDamage - Damage: 4500 + Damage: 5300 Versus: - None: 280 - Wood: 73 + None: 240 + Wood: 60 Heavy: 75 Concrete: 70 + Light: 110 -PortaTeslaE: +PortaTesla.UPG: Inherits: PortaTesla - Range: 7c0 + Report: itesatta.aud + ReloadDelay: 70 + Warhead@1Dam: SpreadDamage + Versus: + Heavy: 75 + Light: 125 PortaTeslaCharge: Inherits: ^TeslaWeapon @@ -436,91 +512,91 @@ PortaTeslaCharge: -Report: -Warhead@1Dam: -Warhead@2Smu: - Warhead@charge: GrantExternalCondition + Warhead@charge: GrantExternalConditionCA Range: 42 Duration: 70 Condition: charged ValidRelationships: Ally ValidTargets: TeslaBoost - Warhead@highlight: GrantExternalCondition - Range: 0c511 - Duration: 2 - Condition: highlight + Warhead@Flash: FlashTarget + Spread: 0c511 + Color: ffffff ValidTargets: Ground, Vehicle TTrackZap: Inherits: ^TeslaWeapon - ReloadDelay: 130 + ReloadDelay: 125 Range: 8c0 Warhead@1Dam: SpreadDamage - Damage: 10000 + Damage: 18500 Versus: - Wood: 60 - Concrete: 60 - Light: 95 + Wood: 50 + Concrete: 50 + Light: 75 TTrackZap.UPG: Inherits: TTrackZap Warhead@Arc: FireShrapnel - Weapon: TTankArc1 + Weapon: TTrackArc1 Amount: 1 - AimChance: 90 + AimChance: 100 ThrowWithoutTarget: false + AimTargetStances: Enemy, Neutral + ValidTargets: Vehicle, Ship, Structure -TTankZap: - Inherits: TTrackZap - Report: vtesatta.aud, vtesattb.aud - Range: 5c512 - ReloadDelay: 100 +TTrackArc1: + Inherits: TTrackZap.UPG + -Report: + Range: 2c512 + ValidTargets: Vehicle, Ship Warhead@1Dam: SpreadDamage - Damage: 4500 + ValidTargets: Vehicle, Ship Versus: - None: 0 + Light: 15 + Heavy: 15 + Warhead@Arc: FireShrapnel + Weapon: TTrackArc2 + AimChance: 100 -TTankZapSecondary: - Inherits: TTankZap +TTrackArc2: + Inherits: TTrackArc1 + Warhead@1Dam: SpreadDamage + -Warhead@Arc: + +TTankZap: + Inherits: ^TeslaWeapon + Report: vtesatta.aud, vtesattb.aud + ReloadDelay: 50 + Burst: 2 + BurstDelays: 3 + Range: 5c512 Warhead@1Dam: SpreadDamage + Damage: 3500 Versus: - None: 1000 + None: 380 + Wood: 55 + Concrete: 55 + Heavy: 60 TTankZap.UPG: Inherits: TTankZap Warhead@Arc: FireShrapnel - Weapon: TTankArc1 + Weapon: TTankArc Amount: 1 - AimChance: 90 + AimChance: 100 ThrowWithoutTarget: false + AimTargetStances: Enemy, Neutral -TTankZapSecondary.UPG: - Inherits: TTankZap.UPG - Warhead@1Dam: SpreadDamage - Versus: - None: 1000 - -Warhead@Arc: - -TTankArc1: - Inherits: TTrackZap.UPG - Range: 2c0 - ValidTargets: Infantry, Vehicle, Ship - Warhead@1Dam: SpreadDamage - ValidTargets: Infantry, Vehicle, Ship - ValidRelationships: Enemy, Neutral - Versus: - None: 130 - Light: 30 - Heavy: 40 +TTankArc: + Inherits: TTankZap -Report: - Warhead@Arc: FireShrapnel - Weapon: TTankArc2 - ValidTargets: Infantry - AimChance: 65 - -TTankArc2: - Inherits: TTankArc1 - ValidTargets: Infantry + Range: 2c512 + ValidTargets: Infantry, Vehicle, Defense Warhead@1Dam: SpreadDamage - ValidTargets: Infantry - -Warhead@Arc: + ValidTargets: Infantry, Vehicle, Defense + Damage: 1000 + Versus: + None: 315 DogJaw: ValidTargets: Infantry @@ -532,26 +608,59 @@ DogJaw: Warhead@1Dam: TargetDamage Damage: 100000 ValidTargets: Infantry - InvalidTargets: Ant + InvalidTargets: Ant, DogImmune DamageTypes: DefaultDeath +TerrorDogJaw: + Inherits: DogJaw + ValidTargets: Infantry, Vehicle, Structure + +CyberdogJaw: + Inherits: DogJaw + ReloadDelay: 10 + Range: 4c512 + Report: cdog-attack1.aud + Warhead@1Dam: TargetDamage + -InvalidTargets: + +DogExplode: + Projectile: InstantHit + Warhead@1Dam: SpreadDamage + Spread: 448 + Damage: 35000 + Versus: + Wood: 75 + Concrete: 75 + Heavy: 70 + DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath, TankBuster + InvalidTargets: TerrorDog + Warhead@FF: HealthPercentageDamage + Spread: 2c0 + Damage: 25 + DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath + ValidTargets: TerrorDog + Warhead@3Eff: CreateEffect + Explosions: artillery_explosion + ImpactSounds: xplosml2.aud + BruteAttack: - ReloadDelay: 60 - Range: 1c0 + ReloadDelay: 95 + Range: 1c512 Report: brutehit.aud Projectile: InstantHit InvalidTargets: Structure + TargetActorCenter: true Warhead@1Dam: SpreadDamage - Spread: 128 + Spread: 42 Damage: 10000 DamageTypes: DefaultDeath InvalidTargets: Structure Versus: - None: 100 - Light: 60 - Heavy: 70 - Concrete: 25 - Wood: 20 + None: 40 + Light: 75 + Heavy: 100 + Concrete: 50 + Wood: 35 BruteBuildingAttack: Inherits: BruteAttack @@ -576,37 +685,92 @@ Commandeer: Heal: ReloadDelay: 80 Range: 4c0 - Report: heal2.aud - ValidTargets: Heal - Projectile: Bullet - Speed: 1c682 + ValidTargets: Healable + Projectile: InstantHit + Blockable: true + TargetActorCenter: true Warhead@1Dam: SpreadDamage Spread: 213 - Damage: -5000 + Damage: -3500 + Falloff: 100, 52, 20, 7, 0 + ValidRelationships: Ally + ValidTargets: Healable + DebugOverlayColor: 00FF00 + DamageTypes: DirectHeal + Warhead@2Dam: TargetDamage + Damage: -500 ValidRelationships: Ally - ValidTargets: Heal + ValidTargets: Healable + DamageTypes: DirectHeal + Delay: 20 + Warhead@3Dam: TargetDamage + Damage: -500 + ValidRelationships: Ally + ValidTargets: Healable + DamageTypes: DirectHeal + Delay: 40 + Warhead@4Dam: TargetDamage + Damage: -500 + ValidRelationships: Ally + ValidTargets: Healable + DamageTypes: DirectHeal + Delay: 60 + +CustodianHeal: + ReloadDelay: 70 + Range: 3c512 + Report: custheal.aud + ValidTargets: HealableCyborg, Repairable + TargetActorCenter: true + Projectile: LaserZap + Width: 70 + Duration: 10 + Color: 4000FF80 + ZOffset: 512 + SecondaryBeam: true + SecondaryBeamWidth: 100 + SecondaryBeamZOffset: 511 + SecondaryBeamColor: 4000FF40 + Warhead@1Dam: SpreadDamage + Spread: 256 + Damage: -6000 + Falloff: 100, 52, 20, 7, 0 DebugOverlayColor: 00FF00 + ValidTargets: HealableCyborg, Repairable + DamageTypes: DirectHeal, DirectRepair + ValidRelationships: Ally, Neutral + Warhead@3Eff: CreateEffect + Image: custhealhit + Explosions: idle, idle2 + Warhead@Flash: FlashTarget + Spread: 0c511 + Color: 0000ff + ValidTargets: HealableCyborg, Repairable + ValidRelationships: Ally, Neutral Repair: Inherits: Heal Range: 2c512 - Report: fixit1.aud - ValidTargets: Repair + ValidTargets: Repairable Warhead@1Dam: SpreadDamage Damage: -3000 - ValidTargets: Repair - Warhead@highlight: GrantExternalCondition - Range: 0c511 - Duration: 2 - Condition: highlight - ValidTargets: Ground, Vehicle + ValidTargets: Repairable + DamageTypes: DirectRepair + -Warhead@2Dam: + -Warhead@3Dam: + -Warhead@4Dam: + Warhead@Flash: FlashTarget + Spread: 0c511 + Color: ffffff + ValidTargets: Repairable + +CyborgRepair: + Inherits: Repair + ReloadDelay: 75 RepairIFV: Inherits: Repair - ReloadDelay: 125 - Burst: 10 - BurstDelays: 30 - Report: repair11.aud + ReloadDelay: 30 Warhead@3Eff: CreateEffect Image: sparks_overlay Explosions: idle @@ -616,22 +780,22 @@ RepairFlash: Inherits: Heal Range: 1c0 Report: fixit1.aud - ValidTargets: Repair + ValidTargets: Repairable Warhead@1Dam: SpreadDamage Damage: -1 - ValidTargets: Repair - Warhead@highlight: GrantExternalCondition - Range: 2c511 - Duration: 2 - Condition: highlight - ValidTargets: Vehicle + ValidTargets: Repairable + -DamageTypes: + -Warhead@2Dam: + -Warhead@3Dam: + -Warhead@4Dam: + Warhead@Flash: FlashTarget + Spread: 1c0 + Color: ffffff + ValidTargets: Repairable ShieldFlash: Inherits: RepairFlash - Warhead@highlight: GrantExternalCondition - Range: 2c511 - Duration: 2 - Condition: highlight + Warhead@Flash: FlashTarget ValidTargets: Structure Demolish: @@ -649,11 +813,11 @@ Demolish: Footprint: xxx xxx xxx PlaceC4: - ReloadDelay: 10 + ReloadDelay: 25 Range: 1c849 Projectile: InstantHit Report: icolseta.aud - ValidTargets: C4, Vehicle, Structure + ValidTargets: C4Plantable InvalidTargets: C4Attached, TNTAttached, C4Immune Warhead@AttachDelayedWeapon: AttachDelayedWeapon Weapon: C4 @@ -661,19 +825,44 @@ PlaceC4: TriggerTime: 60 DeathTypes: ExplosionDeath Range: 1 - Warhead@TargetValidator: SpreadDamage - Warhead@highlight: GrantExternalCondition - Range: 0c256 - Duration: 2 - Condition: highlight - ValidTargets: Ground, Structure, Vehicle + Warhead@Flash: FlashTarget + Spread: 0c256 + Color: ffffff + ValidTargets: Structure, Vehicle + +PlaceC4Seal: + Inherits: PlaceC4 + InvalidTargets: Vehicle, C4Attached, TNTAttached, C4Immune + Warhead@AttachDelayedWeapon: AttachDelayedWeapon + TriggerTime: 20 + Type: c4seal + ScaleTriggerTimeWithValue: true + Warhead@Flash: FlashTarget + ValidTargets: Structure + +PlaceC4Assassin: + Inherits: PlaceC4Seal + Warhead@AttachDelayedWeapon: AttachDelayedWeapon + Weapon: AssassinC4 + +PrepareC4Seal: + Inherits: PlaceC4Seal + -Report: + -Warhead@AttachDelayedWeapon: + Warhead@Flash: FlashTarget + Color: ff0000 + Warhead@ProgressBar: GrantExternalConditionCA + Range: 0c256 + Condition: c4seal-preparing + Duration: 26 + ValidTargets: Structure C4: Projectile: InstantHit Warhead@1Dam: HealthPercentageDamage ValidTargets: Air, Ground, Water Spread: 64 - Damage: 100 + Damage: 200 DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath Versus: Light: 150 @@ -691,21 +880,30 @@ C4: Dimensions: 3,3 Footprint: xxx xxx xxx +AssassinC4: + Inherits: C4 + Ivanbomb: Inherits: ^Artillery - ValidTargets: Ground, TNT, Infantry, Vehicle, Structure + ValidTargets: Ground, TNTPlantable InvalidTargets: C4Attached, C4Immune ReloadDelay: 75 Range: 3c725 Report: grenade1.aud Projectile: Bullet + LaunchAngle: 80 Speed: 166 Inaccuracy: 0 Image: TNT BounceCount: 2 - BounceRangeModifier: 40 + BounceRangeModifier: 60 BounceSound: dud2.aud ValidBounceBlockerRelationships: Ally, Neutral, Enemy + ContrailLength: 10 + ContrailStartColor: FF9900 + ContrailStartColorAlpha: 192 + ContrailEndColor: FF0000 + ContrailStartWidth: 0c40 Warhead@AttachDelayedWeapon: AttachDelayedWeapon Weapon: TNT Type: tnt @@ -713,12 +911,11 @@ Ivanbomb: DeathTypes: ExplosionDeath Range: 1 AttachSounds: icraatta.aud - MissSounds: dud1.aud + MissWeapon: DelayedTNT Warhead@TargetValidator: SpreadDamage - Warhead@highlight: GrantExternalCondition - Range: 0c256 - Duration: 2 - Condition: highlight + Warhead@Flash: FlashTarget + Spread: 0c256 + Color: ffffff ValidTargets: Ground, Structure, Vehicle -Warhead@1Dam: -Warhead@2Smu: @@ -732,12 +929,16 @@ TNT: Warhead@1Dam: SpreadDamage Spread: 341 Damage: 2800 - Falloff: 1000, 368, 135, 50, 18, 7, 0 - ValidTargets: Ground, Water + Falloff: 1000, 448, 192, 50, 18, 7, 0 Versus: Light: 70 Heavy: 20 DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath + Warhead@AirDam: SpreadDamage + Spread: 128 + Damage: 28000 + ValidTargets: Air, AirSmall + DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath Warhead@2Eff: CreateEffect Explosions: building, building2 ImpactSounds: expnew06.aud @@ -751,95 +952,113 @@ TNT: Dimensions: 3,3 Footprint: xxx xxx xxx +DelayedTNT: + Inherits: TNT + Warhead@1Dam: SpreadDamage + Delay: 50 + ValidTargets: Ground, Water + Warhead@2Eff: CreateEffect + Delay: 50 + Warhead@Smu: LeaveSmudge + Delay: 50 + Warhead@Flames: FireCluster + Delay: 50 + Warhead@tnt: CreateEffect + Image: groundtnt + Explosions: idle1, idle2, idle3, idle4, idle5, idle6, idle7, idle8 + ValidTargets: Ground, Water + DefuseKit: ReloadDelay: 50 Range: 2c511 Report: gdefuse.aud ValidTargets: C4Attached, TNTAttached - Projectile: LaserZap + Projectile: LaserZapCA Width: 48 Duration: 4 Color: FFFFFF80 - Warhead@flash: GrantExternalCondition - Range: 128 - Duration: 3 - Condition: detach + Warhead@Flash: FlashTarget + Spread: 128 + Color: ffffff ValidTargets: C4Attached, TNTAttached - ValidRelationships: Ally Warhead@DetachDelayedWeapon: DetachDelayedWeapon - Types: c4, tnt + Types: c4, tnt, c4seal Range: 128 ValidRelationships: Ally ValidTargets: C4Attached, TNTAttached - Warhead@TargetValidator: SpreadDamage - ValidTargets: C4Attached IFVDefuseKit: Inherits: DefuseKit Range: 4c511 DemoTruckTargeting: - ValidTargets: DetonateAttack - Range: 2c0 + Range: 1c849 Projectile: InstantHit Warhead@1Dam: TargetDamage - ValidTargets: DetonateAttack IvanIFVTargeting: Inherits: DemoTruckTargeting - ValidTargets: Ground, DetonateAttack Hack: - Range: 12c0 - ReloadDelay: 50 + Range: 11c0 + ReloadDelay: 5 ValidTargets: Hackable TargetActorCenter: true + Projectile: InstantHit + Warhead@CAMERA: SpawnActor + Actors: camera.hacker + Range: 1 + ImpactActors: false + Warhead@BeingCaptured: GrantExternalConditionCA + Range: 0c511 + Duration: 6 + Condition: being-captured + ValidTargets: Structure + ValidRelationships: Neutral, Enemy + +HackArc: + Inherits: Hack + ReloadDelay: 50 Report: hacker-pulse.aud + -Projectile: Projectile: ArcLaserZap Color: 1ce31270 Angle: 60 Width: 86 Duration: 20 HitAnim: empty - Warhead@1Dam: TargetDamage - ValidRelationships: Enemy, Neutral - Warhead@CAMERA: SpawnActor - Actors: camera.hacker - Range: 1 - ValidRelationships: Neutral, Enemy - Warhead@green: GrantExternalCondition - Range: 0c511 - Duration: 2 - Condition: greenhighlight + Warhead@Flash: FlashTarget + Spread: 0c511 + Color: 00ff00 ValidTargets: Structure, Vehicle ValidRelationships: Neutral, Enemy - -PrepareHack: - Inherits: Hack - -Report: - -Projectile: - Projectile: InstantHit - -Warhead@green: - -MADTankThump: - InvalidTargets: MADTank, Infantry - Warhead@1Dam: HealthPercentageDamage - Spread: 7c0 - Damage: 1 - InvalidTargets: MADTank, Infantry - Warhead@Concussion: GrantExternalCondition - Range: 7c0 - Duration: 100 - Condition: concussion - ValidTargets: Ground, Infantry, Vehicle, Ship + -Warhead@CAMERA: + -Warhead@BeingCaptured: MADTankDetonate: - InvalidTargets: MADTank, Infantry + InvalidTargets: Infantry Warhead@1Dam: HealthPercentageDamage Spread: 7c0 Damage: 19 + Versus: + Heavy: 85 + Light: 75 InvalidTargets: MADTank, Infantry - Warhead@2Smu: LeaveSmudge + Warhead@2Dam: HealthPercentageDamage + Spread: 5c0 + AffectsParent: true + Damage: 10 + ValidTargets: MADTank + Delay: 5 + Warhead@2Smu1: LeaveSmudge + SmudgeType: Crater + Size: 4 + Chance: 10 + Warhead@2Smu2: LeaveSmudge + SmudgeType: Crater + Size: 6,5 + Chance: 20 + Warhead@2Smu3: LeaveSmudge SmudgeType: Crater Size: 7,6 Warhead@3Eff: CreateEffect @@ -858,25 +1077,25 @@ MADTankDetonate: Heavy: 0 Concrete: 100 Brick: 100 - Warhead@Concussion: GrantExternalCondition + Warhead@Concussion: GrantExternalConditionCA Range: 7c0 - Duration: 600 + Duration: 150 Condition: concussion ValidTargets: Ground, Infantry, Vehicle, Ship Laser: - ReloadDelay: 100 + ReloadDelay: 95 ValidTargets: Ground, Water Range: 8c512 Report: oblfire.aud - Projectile: LaserZap + Projectile: LaserZapCA Width: 56 HitAnim: laserfire Color: FF000080 - ZOffset: 2047 + ZOffset: 512 SecondaryBeam: true SecondaryBeamWidth: 90 - SecondaryBeamZOffset: 2047 + SecondaryBeamZOffset: 511 SecondaryBeamColor: FF000040 Warhead@1Dam: SpreadDamage Spread: 42 @@ -888,27 +1107,41 @@ Laser: Wood: 60 Heavy: 101 Concrete: 90 + Brick: 50 Warhead@2Smu: LeaveSmudge SmudgeType: Scorch-NoFlame InvalidTargets: Vehicle, Structure, Wall, Husk, Trees, Creep Laser.Adv: Inherits: Laser - Report: obelmod1.aud - Projectile: LaserZap - Color: FF00FF80 - SecondaryBeamColor: FF00FF40 + Report: obelmod2.aud + Range: 9c0 + -Projectile: + Projectile: PlasmaBeam + Duration: 21 + Colors: FF00BB80, FF0000A0, FF002270 + InnerLightness: 200 + OuterLightness: 115 + Radius: 2 + Distortion: 0 + DistortionAnimation: 96 + StartOffset: 0,480,0 + FollowingOffset: 0,-48,0 + RecalculateColors: true + TrackTarget: true + ImpactTicks: 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 Warhead@1Dam: SpreadDamage - InvalidTargets: Air Spread: 128 - Damage: 40000 + Damage: 4000 + Warhead@3Eff: CreateEffect + Explosions: small_explosion, small_explosion_alt1, small_explosion_alt2, small_explosion_alt3 LaserTur: Inherits: Laser - ReloadDelay: 38 + ReloadDelay: 34 Range: 6c0 Report: lastur1.aud - Projectile: LaserZap + Projectile: LaserZapCA Width: 45 Duration: 5 SecondaryBeamWidth: 65 @@ -917,112 +1150,370 @@ LaserTur: Warhead@1Dam: SpreadDamage Damage: 5500 Versus: - Wood: 73 - Heavy: 30 - Concrete: 48 + None: 320 + Wood: 70 + Light: 85 + Heavy: 25 + Concrete: 44 LaserTur.Adv: Inherits: LaserTur + Range: 7c0 ReloadDelay: 30 - Projectile: LaserZap - SecondaryBeamColor: FF00FF30 + Projectile: LaserZapCA + Duration: 10 + SecondaryBeamWidth: 75 + SecondaryBeamColor: FF00FF60 + Warhead@1Dam: SpreadDamage + Spread: 128 + +LightTankLaser: + Inherits: LaserTur + Range: 5c768 + ReloadDelay: 50 + Report: tnklaser.aud + Warhead@1Dam: SpreadDamage + Damage: 5800 + Versus: + None: 40 + Wood: 40 + Light: 100 + Heavy: 25 + Concrete: 25 + Brick: 20 + DamageTypes: Prone50Percent, FireDeath + Warhead@PercDam: HealthPercentageDamage + Spread: 42 + Damage: 50 + Versus: + Light: 1 + DamageTypes: Prone50Percent, TriggerProne, FireDeath + ValidTargets: Infantry + +BattleTankLaser: + Inherits: LightTankLaser + ReloadDelay: 40 + +RaiderBuggyLaser: + Inherits: M60mgTD + Range: 5c0 + ReloadDelay: 25 + -Burst: + -StartBurstReport: + Report: rbug-fire1.aud + -Projectile: + Projectile: LaserZapCA + Width: 45 + Duration: 5 + HitAnim: laserfire + Color: FF000080 + ZOffset: 512 + SecondaryBeam: true + SecondaryBeamWidth: 65 + SecondaryBeamColor: FF000030 + Blockable: true + Warhead@1Dam: SpreadDamage + Spread: 42 + Damage: 2750 + DamageTypes: Prone50Percent, TriggerProne, FireDeath + -Warhead@2Eff: + Warhead@2Smu: LeaveSmudge + SmudgeType: Scorch-NoFlame + InvalidTargets: Vehicle, Structure, Wall, Husk, Trees, Creep + +StealthAPCLaser: + Inherits: LaserTur + ReloadDelay: 30 + Report: sapc-fire1.aud, sapc-fire2.aud + Warhead@1Dam: SpreadDamage + Damage: 3400 + Versus: + None: 100 + Wood: 20 + Light: 45 + Heavy: 20 + Concrete: 20 XOLaser: Inherits: Laser Report: xo-laser.aud - ReloadDelay: 120 - Projectile: LaserZap + ReloadDelay: 110 + Range: 7c0 + Projectile: LaserZapCA + Blockable: true Width: 56 HitAnim: laserfire Color: 9eff1480 - ZOffset: 2047 SecondaryBeam: true SecondaryBeamWidth: 90 - SecondaryBeamZOffset: 2047 SecondaryBeamColor: 79cd0040 Warhead@1Dam: SpreadDamage Spread: 42 - Damage: 10000 + Damage: 11000 + DamageTypes: Prone50Percent, TriggerProne, FireDeath Versus: - Wood: 45 - Concrete: 80 + None: 65 + Wood: 40 + Concrete: 75 + Light: 80 + Heavy: 100 + +XOCoilGun: + Range: 7c0 + ReloadDelay: 70 + Report: xo-coil1.aud + Burst: 2 + BurstDelays: 6 + Projectile: MissileCA + Image: flakball + Speed: 682 + TrailImage: coiltrail + TrailSequences: idle1, idle2 + TrailInterval: 1 + ContrailStartWidth: 32 + ContrailStartColor: 809acf + ContrailStartColorAlpha: 96 + ContrailLength: 6 + TrailSpacing: 682 + AllowSnapping: true + Warhead@1Dam: SpreadDamage + Spread: 0c128 + Damage: 2500 + Versus: + None: 100 + Wood: 10 + Light: 70 + Heavy: 35 + Concrete: 10 + Brick: 10 + DamageTypes: Prone50Percent, TriggerProne, BulletDeath + Warhead@3Eff: CreateEffect + Explosions: piff + ValidTargets: Ground, Water, Trees + Inaccuracy: 64 PortaLaser: Inherits: Laser - ReloadDelay: 35 + ReloadDelay: 42 Burst: 2 BurstDelays: 3 Range: 6c0 -Report: - StartBurstReport: lasgun.aud - Projectile: LaserZap + StartBurstReport: lasgun.aud, lasgun2.aud + Projectile: LaserZapCA Width: 30 Duration: 3 SecondaryBeamWidth: 50 SecondaryBeamColor: FF000030 Blockable: true Warhead@1Dam: SpreadDamage - Damage: 1700 + Damage: 1900 + Versus: + None: 155 + Wood: 55 + Heavy: 40 + Concrete: 40 + +PortaLaser.Templar: + Inherits: PortaLaser + Warhead@1Dam: SpreadDamage Versus: None: 175 - Wood: 65 - Heavy: 55 - Concrete: 45 + Heavy: 45 + +PortaLaser.Templar.UPG: + Inherits: PortaLaser.Templar + Range: 6c512 + StartBurstReport: lasgunupg.aud, lasgunupg2.aud + Projectile: LaserZapCA + SecondaryBeamWidth: 75 + SecondaryBeamColor: FF006660 + Warhead@1Dam: SpreadDamage + Damage: 2000 -PortaLaserE: +IFVLaser: Inherits: PortaLaser Range: 7c0 + -Burst: + -StartBurstReport: + Report: venmfireupg1.aud, venmfireupg1.aud + Projectile: LaserZapCA + SecondaryBeamWidth: 75 + Warhead@1Dam: SpreadDamage + Damage: 4250 + +EnlightenedBeam: + ReloadDelay: 65 + ValidTargets: Ground, Water + Range: 6c512 + Report: enli-fire1.aud, enli-fire2.aud, enli-fire3.aud + Projectile: PlasmaBeam + Duration: 10 + CenterBeam: true + CenterBeamColor: FFFFFFAA + CenterBeamWidth: 48 + Colors: 0EF3C101, 0E9FF301, 0EEBF301 + InnerLightness: 200 + OuterLightness: 120 + Radius: 2 + SegmentLength: 120 + Distortion: 10 + DistortionAnimation: 20 + Blockable: true + RecalculateColors: true + TrackTarget: false + MaxFacingDeviation: 64 + Warhead@1Dam: HealthPercentageSpreadDamage + Spread: 341 + Falloff: 100, 45, 25, 15, 0 + Damage: 100 + Versus: + Wood: 5 + None: 10 + Concrete: 10 + Brick: 10 + Light: 17 + Heavy: 17 + DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath + ValidRelationships: Enemy, Neutral + Warhead@friendlyFire: SpreadDamage + Spread: 256 + Damage: 2500 + DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath + Versus: + None: 5 + Wood: 70 + Concrete: 45 + Light: 70 + ValidRelationships: Ally + Warhead@2Eff: CreateEffect + Explosions: enliexplode1, enliexplode2 + ImpactSounds: expnew17.aud, expnew16.aud + ValidTargets: Ground, Air + Warhead@2Smu: LeaveSmudge + SmudgeType: Scorch-NoFlame + InvalidTargets: Vehicle, Structure, Wall, Husk, Trees, Creep + Warhead@Flash: FlashTarget + Spread: 1c0 + Color: 00ffff + ValidTargets: Vehicle, Ship + +EnlightenedEmp: + ReloadDelay: 500 + Range: 6c512 + Report: enli-empfire.aud + Projectile: MissileCA + Blockable: false + HorizontalRateOfTurn: 8 + Shadow: true + Image: enliempproj + Palette: effect + MaximumLaunchSpeed: 190 + MinimumLaunchSpeed: 190 + Speed: 190 + RangeLimit: 6c512 + Jammable: false + TrailImage: smokey + TrailPalette: scrinplasma + Warhead@1Emp: GrantExternalConditionCA + Range: 0c896 + Duration: 150 + Condition: empdisable + ValidTargets: Vehicle, Ship, Building + InvalidTargets: Cyborg, EmpImmune + Warhead@2Emp: GrantExternalConditionCA + Range: 0c896 + Duration: 100 + Condition: empdisable + ValidTargets: Cyborg, Defense + InvalidTargets: EmpImmune + Warhead@3Eff_impact: CreateEffect + Explosions: enliemphit1, enliemphit2 + ImpactSounds: enli-emphit.aud + Inaccuracy: 341 VenomLaser: - ReloadDelay: 25 + ReloadDelay: 30 ValidTargets: Ground, Water - Range: 5c0 + Range: 5c512 Report: venmfire1.aud, venmfire2.aud - Projectile: LaserZap + Projectile: LaserZapCA Width: 35 HitAnim: laserfire Color: FF000080 - ZOffset: 2047 + ZOffset: 512 SecondaryBeam: true SecondaryBeamWidth: 65 - SecondaryBeamZOffset: 2047 + SecondaryBeamZOffset: 511 SecondaryBeamColor: FF000040 Warhead@1Dam: SpreadDamage Spread: 42 Damage: 5500 - DamageTypes: Prone50Percent, TriggerProne, FireDeath + DamageTypes: Prone50Percent, TriggerProne, FireDeath, AirToGround Versus: - None: 200 - Wood: 20 - Concrete: 10 - Light: 90 - Heavy: 10 + None: 250 + Wood: 50 + Concrete: 40 + Light: 95 + Heavy: 55 + Brick: 50 Warhead@2Smu: LeaveSmudge SmudgeType: Scorch-NoFlame InvalidTargets: Vehicle, Structure, Wall, Husk, Trees, Creep +VenomLaser.UPG: + Inherits: VenomLaser + Report: venmfireupg1.aud, venmfireupg1.aud + Range: 6c512 + Projectile: LaserZapCA + Duration: 10 + SecondaryBeamWidth: 75 + SecondaryBeamColor: FF00FF60 + Warhead@1Dam: SpreadDamage + Spread: 42 + Damage: 6325 + Versus: + Heavy: 60 + VenomLaserAA: Inherits: VenomLaser ValidTargets: Air, AirSmall + Projectile: LaserZapCA + -HitAnim: Warhead@1Dam: SpreadDamage ValidTargets: Air, AirSmall - Damage: 2600 + Damage: 4000 Versus: Wood: 100 Concrete: 100 Light: 100 Heavy: 100 + DamageTypes: Prone50Percent, TriggerProne, FireDeath -Warhead@2Smu: - -PointLaser: + Warhead@3Eff: CreateEffect + ValidTargets: Air, AirSmall + Explosions: med_explosion + +VenomLaserAA.UPG: + Inherits: VenomLaserAA + Report: venmfireupg1.aud, venmfireupg1.aud + Range: 6c512 + Projectile: LaserZapCA + Duration: 10 + SecondaryBeamWidth: 75 + SecondaryBeamColor: FF00FF60 + Warhead@1Dam: SpreadDamage + Damage: 4600 + +PointLaser: Inherits: Laser - ReloadDelay: 100 + ReloadDelay: 125 ValidTargets: Ground, Water, Missile InvalidTargets: Infantry, Vehicle, Structure, Wall, Ship, Submarine Range: 1c768 Report: vpalwe2d.aud - AirThreshold: 1c0 - Projectile: LaserZap + AirThreshold: 4c0 + Projectile: LaserZapCA Width: 30 Duration: 3 -HitAnim: @@ -1038,24 +1529,26 @@ PrisLaser: ReloadDelay: 3 Range: 7c512 Report: prisfire.aud - Projectile: LaserZap + Projectile: LaserZapCA Width: 35 HitAnim: plaserfire Color: 00FFFFC8 - ZOffset: 2047 + ZOffset: 512 SecondaryBeam: true SecondaryBeamWidth: 65 - SecondaryBeamZOffset: 2047 + SecondaryBeamZOffset: 511 SecondaryBeamColor: 75D1FF Warhead@1Dam: SpreadDamage Spread: 341 Damage: 13000 DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath Versus: - None: 50 - Wood: 70 - Light: 75 - Heavy: 75 + None: 40 + Wood: 40 + Concrete: 90 + Light: 80 + Heavy: 80 + Brick: 50 Warhead@2Smu: LeaveSmudge SmudgeType: Scorch-NoFlame InvalidTargets: Vehicle, Structure, Wall, Husk, Trees, Creep @@ -1073,90 +1566,181 @@ PrisLaserSupport: ReloadDelay: 3 Range: 5c0 Report: bpriat1a.aud - Projectile: LaserZap + Projectile: LaserZapCA Width: 35 Color: 00FFFFC8 - ZOffset: 2047 + ZOffset: 512 SecondaryBeam: true SecondaryBeamWidth: 65 - SecondaryBeamZOffset: 2047 + SecondaryBeamZOffset: 511 SecondaryBeamColor: 75D1FF - Warhead@1Dum: Dummy AirThreshold: 1000 +PrisBurst: + Inherits: PrisLaser + -Report: + Range: 3c0 + Projectile: LaserZapCA + -HitAnim: + Warhead@1Dam: SpreadDamage + Spread: 256 + Damage: 6500 + Versus: + None: 50 + Wood: 40 + Concrete: 25 + Light: 100 + Heavy: 55 + DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath, FlakVestMitigated + -Warhead@Burst: + Warhead@3Eff: CreateEffect + Explosions: small_explosion + -ImpactSounds: + PrisTLaser: Inherits: PrisLaser Report: ptnkfire.aud ReloadDelay: 50 - Range: 9c0 - Projectile: LaserZap + Range: 8c0 + Projectile: LaserZapCA Blockable: true Warhead@1Dam: SpreadDamage Damage: 4400 Spread: 341 Versus: None: 150 - Wood: 85 + Wood: 100 Concrete: 100 Light: 100 - Heavy: 55 + Heavy: 45 + DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath, FlakVestMitigatedMinor Warhead@Burst: FireCluster Weapon: PrisTBurst -PrisBurst: +PrisTBurst: Inherits: PrisTLaser -Report: Range: 3c0 - Projectile: LaserZap + Projectile: LaserZapCA -HitAnim: Warhead@1Dam: SpreadDamage - Spread: 256 - Damage: 6500 + Damage: 2100 + Spread: 160 Versus: - None: 85 + Heavy: 20 + Wood: 35 + Concrete: 100 + DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath, FlakVestMitigated -Warhead@Burst: Warhead@3Eff: CreateEffect Explosions: small_explosion -ImpactSounds: -PrisTBurst: - Inherits: PrisBurst - Warhead@1Dam: SpreadDamage - Damage: 2100 - Spread: 160 - Versus: - None: 150 - Wood: 35 - PrisCLaser: Inherits: PrisTLaser Report: pcanfire.aud - ReloadDelay: 140 + ReloadDelay: 125 Range: 11c0 - Projectile: LaserZap + Projectile: LaserZapCA Width: 70 Duration: 15 - Color: 00FFEEDD - SecondaryBeamWidth: 180 - SecondaryBeamColor: 84FFEF99 + Color: 00FFDDDD + SecondaryBeamWidth: 140 + SecondaryBeamColor: 4be8d499 Warhead@1Dam: SpreadDamage - Damage: 15750 + Damage: 18000 Spread: 512 Versus: - None: 70 + None: 60 Wood: 100 - Concrete: 85 - Light: 95 - Heavy: 40 + Concrete: 75 + Light: 85 + Heavy: 30 -Warhead@Burst: +HopliteGun: + ReloadDelay: 75 + Range: 7c0 + Report: hopl-fire1.aud + Projectile: LaserZapCA + Width: 40 + HitAnim: laserfire + Color: 00FFFFC8 + ZOffset: 512 + SecondaryBeam: true + SecondaryBeamWidth: 75 + SecondaryBeamZOffset: 511 + SecondaryBeamColor: 75D1FF60 + Warhead@1Dam: SpreadDamage + Spread: 180 + Damage: 6000 + Versus: + None: 150 + Wood: 100 + Light: 100 + Heavy: 40 + Concrete: 50 + Brick: 30 + DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath + Warhead@2Smu: LeaveSmudge + SmudgeType: Scorch-NoFlame + InvalidTargets: Vehicle, Structure, Wall, Husk, Trees, Creep + +HopliteGunCharged: + Inherits: HopliteGun + Report: hopl-cfire1.aud + Projectile: LaserZapCA + Color: fffdcdC8 + SecondaryBeamColor: fff30060 + Warhead@Blind: GrantExternalConditionCA + Range: 0c896 + Duration: 75 + Condition: blinded + ValidTargets: Infantry + InvalidTargets: BlindImmune + Warhead@BlindVehicle: GrantExternalConditionCA + Range: 0c512 + Duration: 75 + Condition: blinded + ValidTargets: Vehicle, Ship + InvalidTargets: BlindImmune + Warhead@3Eff: CreateEffect + Explosions: idle + ExplosionPalette: caneon + Image: nullhit + +HopliteTargeter: + Inherits: HopliteGun + -Report: + -Projectile: + Projectile: InstantHit + -Warhead@1Dam: + -Warhead@2Smu: + +HopliteIFVGun: + Inherits: HopliteGun + ReloadDelay: 60 + Report: ptnkfire.aud + Projectile: LaserZapCA + HitAnim: plaserfire + Warhead@1Dam: SpreadDamage + Damage: 7000 + Spread: 288 + Versus: + Wood: 80 + Heavy: 30 + +HopliteGunBATF: + Inherits: HopliteGunCharged + Range: 6c0 + Warhead@1Dam: SpreadDamage + Spread: 288 + KirovBomb: - ReloadDelay: 35 + ReloadDelay: 25 ValidTargets: Ground, Water - InvalidTargets: Air Report: bwhis.aud - Range: 0c341 - TargetActorCenter: true + Range: 0c480 Projectile: GravityBomb Image: TBOMB OpenSequence: open @@ -1164,18 +1748,16 @@ KirovBomb: Acceleration: 0, 0, 0 Shadow: True Warhead@1Dam: SpreadDamage - Spread: 1c512 + Spread: 1c0 Falloff: 100, 40, 20, 5 - Damage: 12000 - InvalidTargets: Air + Damage: 13000 Versus: None: 40 Wood: 100 Light: 85 Heavy: 75 - Concrete: 55 - Brick: 50 - DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath + Concrete: 60 + DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath, AirToGround Warhead@2Smu: LeaveSmudge SmudgeType: Crater InvalidTargets: Vehicle, Structure, Wall, Husk, Trees @@ -1192,23 +1774,43 @@ KirovBomb: KirovTeslaBomb: Inherits: KirovBomb Warhead@1Dam: SpreadDamage - DamageTypes: Prone50Percent, TriggerProne, ElectricityDeath + DamageTypes: Prone50Percent, TriggerProne, ElectricityDeath, AirToGround Warhead@3Eff: CreateEffect Explosions: tsla_bomb ExplosionPalette: ra2effect ImpactSounds: kirbo1.aud, kirbo2.aud Warhead@5Tesla: FireShrapnel Weapon: KirovTeslaArc - Amount: 3 - AimChance: 85 + Amount: 2 + AimChance: 100 AllowDirectHit: true ThrowWithoutTarget: false + AimTargetStances: Enemy, Neutral + ImpactActors: false KirovClusterBomb: Inherits: KirovBomb Warhead@1Dam: SpreadDamage + Spread: 1c512 Versus: - Concrete: 60 + Concrete: 65 + Warhead@3Eff: CreateEffect + Explosions: large_artillery_explosion + ImpactSounds: artyhit.aud, artyhit2.aud, artyhit3.aud + Warhead@Concussion1: GrantExternalConditionCA + Range: 0c768 + Duration: 125 + Condition: concussion + ValidTargets: Ground, Infantry, Vehicle, Ship + Warhead@Concussion2: GrantExternalConditionCA + Range: 1c768 + Duration: 35 + Condition: concussion + ValidTargets: Ground, Infantry, Vehicle, Ship + Warhead@5Shake: ShakeScreen + Duration: 5 + Intensity: 1 + Multiplier: 0.5,0.5 Warhead@6Cluster: FireCluster Weapon: KirovCluster RandomClusterCount: 3 @@ -1221,7 +1823,7 @@ KirovNukeBomb: Versus: Light: 100 Heavy: 90 - DamageTypes: Prone50Percent, TriggerProne, RadiationDeath + DamageTypes: Prone50Percent, TriggerProne, RadiationDeath, AirToGround Warhead@3Eff: CreateEffect Explosions: nuke3 ImpactSounds: kaboom1.aud @@ -1235,9 +1837,10 @@ KirovNukeBomb: KirovChaosBomb: Inherits: KirovBomb Warhead@Cloud1: SpawnActor - Actors: chaos.cloud1, chaos.cloud2 + Actors: chaoscloud, chaoscloud2 Range: 5 ValidTargets: Ground, Water + ImpactActors: false Warhead@3Eff: CreateEffect Explosions: chaosexplosion ExplosionPalette: caneon @@ -1247,12 +1850,14 @@ KirovChaosBomb: KirovTeslaArc: Inherits: TTankZap - Range: 4c0 + Range: 2c512 Report: shktrop1.aud + ValidTargets: Infantry, Vehicle, Ship Warhead@1Dam: SpreadDamage Damage: 3000 ValidTargets: Infantry, Vehicle, Ship ValidRelationships: Enemy, Neutral + DamageTypes: Prone50Percent, TriggerProne, ElectricityDeath, AirToGround KirovCluster: ReloadDelay: 35 @@ -1272,7 +1877,7 @@ KirovCluster: Light: 65 Heavy: 40 Concrete: 60 - Brick: 50 + DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath, AirToGround Warhead@Smu: LeaveSmudge SmudgeType: Crater InvalidTargets: Structure, Wall, Trees @@ -1288,124 +1893,158 @@ KirovCluster: SonicZap: ReloadDelay: 120 - Range: 6c0 + Range: 5c0 TargetActorCenter: false - InvalidTargets: Air Report: sonic4.aud - Projectile: AreaBeam + Projectile: AreaBeamCA Speed: 0c428 Duration: 65 DamageInterval: 3 Width: 420 Shape: Flat - ZOffset: 4096 - BeyondTargetRange: 0c256 + ZOffset: 2048 + BeyondTargetRange: 0c341 Blockable: true TrackTarget: true Color: 00c3ff25 Warhead@1Dam: SpreadDamage Range: 0, 32 Falloff: 100, 100 - Damage: 1000 - AffectsParent: false + Damage: 720 ValidRelationships: Neutral, Enemy ValidTargets: Ground, Water Versus: - Heavy: 65 + Heavy: 60 Concrete: 130 Wood: 180 - DamageTypes: Prone50Percent, TriggerProne, DefaultDeath + DamageTypes: Prone50Percent, TriggerProne, SmallExplosionDeath Warhead@2Dam: SpreadDamage Range: 0, 32 Falloff: 100, 100 - Damage: 250 - InvalidTargets: Disruptor, Air - AffectsParent: false + Damage: 180 + InvalidTargets: Disruptor ValidRelationships: Ally Versus: - Heavy: 65 + Heavy: 60 Brick: 400 Wood: 180 - DamageTypes: Prone50Percent, TriggerProne, DefaultDeath - -SonicZap.Seek: - Inherits: SonicZap - Range: 6c511 + DamageTypes: Prone50Percent, TriggerProne, SmallExplosionDeath SonicZap.UPG: Inherits: SonicZap - Range: 7c0 - Projectile: AreaBeam + Range: 5c512 + Projectile: AreaBeamCA Color: 00ffcc25 Warhead@1Dam: SpreadDamage - Damage: 1300 - -SonicZap.Seek.UPG: - Inherits: SonicZap.UPG - Range: 7c768 + Damage: 820 + Warhead@4Conc: GrantExternalConditionCA + Range: 0c512 + Duration: 75 + Condition: concussion + ValidTargets: Infantry, Vehicle, Ship + ValidRelationships: Enemy, Neutral SonicZapVisual: ReloadDelay: 120 - Range: 6c0 + Range: 5c0 TargetActorCenter: false - InvalidTargets: Air - Projectile: AreaBeam + Projectile: AreaBeamCA Speed: 0c428 Duration: 65 DamageInterval: 3 Width: 180 Shape: Flat - ZOffset: 4096 - BeyondTargetRange: 0c256 + ZOffset: 2048 + BeyondTargetRange: 0c341 Blockable: true TrackTarget: true Color: 00fffb35 - Warhead@1Dam: SpreadDamage - Range: 0, 32 - Falloff: 100, 100 - Damage: 10 - AffectsParent: false - ValidRelationships: Neutral, Enemy - ValidTargets: Ground, Water - Versus: - Heavy: 80 - Concrete: 100 - Wood: 200 - DamageTypes: Prone50Percent, TriggerProne, DefaultDeath - Warhead@2Dam: SpreadDamage - Range: 0, 32 - Falloff: 50, 50 - Damage: 10 - InvalidTargets: Disruptor, Air - AffectsParent: false - ValidRelationships: Ally - Versus: - Heavy: 80 - Concrete: 150 - Brick: 150 - Wood: 200 - DamageTypes: Prone50Percent, TriggerProne, DefaultDeath - -SonicZapVisual.Seek: - Inherits: SonicZapVisual - Range: 6c511 SonicZapVisual.UPG: Inherits: SonicZapVisual - Range: 7c0 - Projectile: AreaBeam - Color: 00ffc435 + Range: 5c512 + Projectile: AreaBeamCA + Color: 00ffa845 + +GapBeam: + ReloadDelay: 15 + Range: 10c0 + Report: gaploop1.aud, gaploop2.aud, gaploop3.aud + ValidTargets: Ground, Water, Air, AirSmall + Projectile: ElectricBolt + Colors: 111111CC,223333CC,11222299,222233CC,44444466,436a6666 + Duration: 16 + Angle: 45 + ZOffset: 512 + Width: 42 + Distortion: 32 + DistortionAnimation: 64 + TrackTarget: true + Warhead@Debuff: GrantExternalConditionCA + Range: 1c256 + Duration: 15 + Condition: gapveiled + ValidRelationships: Enemy, Neutral + ValidTargets: Ground, Water, Air, AirSmall + Warhead@2Eff: CreateEffect + Image: gap + Explosions: muzzle + ValidTargets: Ground, Water, Trees, Air, AirSmall + Inaccuracy: 128 + Warhead@3Eff: CreateEffect + Explosions: veilcloudsm, veilcloudsmf + ExplosionPalette: effect-ignore-lighting-alpha40 + Inaccuracy: 1c256 + ValidTargets: Ground, Water, Trees, Air, AirSmall + +MobileGapBeam: + Inherits: GapBeam + -ValidTargets: + Range: 10c0 + Warhead@Debuff: GrantExternalConditionCA + Range: 0c768 + Warhead@3Eff: CreateEffect + Inaccuracy: 1c0 + +RadarJammer: + ReloadDelay: 150 + Report: jammed.aud + Range: 10c0 + Projectile: InstantHit + Warhead@2Spawn: SpawnActor + Actors: jamming.field + Range: 1 + ForceGround: false + ValidTargets: Ground, Water + ImpactActors: false + +VeilSmall: + ReloadDelay: 10 + Range: 1c0 + Projectile: InstantHit + Warhead@Cloud: CreateEffect + Explosions: veilcloud, veilcloudf + ExplosionPalette: effect-ignore-lighting-alpha50 + Inaccuracy: 2c0 + ValidTargets: Ground, Water + ImpactActors: false -SonicZapVisual.Seek.UPG: - Inherits: SonicZapVisual.UPG - Range: 7c768 +VeilMedium: + Inherits: VeilSmall + Warhead@Cloud: CreateEffect + Inaccuracy: 3c768 + +VeilLarge: + Inherits: VeilSmall + Warhead@Cloud: CreateEffect + Inaccuracy: 6c0 Railgun: ReloadDelay: 70 Range: 8c0 Report: railuse5.aud - InvalidTargets: Air - Projectile: Railgun + InvalidTargets: Submarine + Projectile: RailgunCA Duration: 10 Blockable: true DamageActorsInLine: false @@ -1419,23 +2058,24 @@ Railgun: Warhead@1Dam: SpreadDamage Spread: 0c64 Falloff: 100, 37, 14, 5, 0 - Damage: 9000 + Damage: 9500 ValidRelationships: Ally, Neutral, Enemy - InvalidTargets: Air + InvalidTargets: Submarine Versus: None: 100 Wood: 65 Light: 100 Heavy: 85 Concrete: 15 - DamageTypes: Prone100Percent, TriggerProne, ExplosionDeath + Brick: 75 + DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath TitanRailgun: Inherits: Railgun Report: titanrailgun1.aud, titanrailgun2.aud - ReloadDelay: 90 + ReloadDelay: 80 Range: 5c768 - Projectile: Railgun + Projectile: RailgunCA DamageActorsInLine: true BeamColor: EEFFFFBB BeamWidth: 48 @@ -1446,26 +2086,29 @@ TitanRailgun: HelixAlphaDeltaPerTick: -8 BeamAlphaDeltaPerTick: -8 HelixPitch: 682 + ZOffset: 4096 + PassthroughToMaxRange: true + PassthroughMinDistance: 2c0 Warhead@1Dam: SpreadDamage Damage: 5000 Versus: None: 30 - Wood: 62 + Wood: 70 Light: 70 Heavy: 100 - Concrete: 30 - Brick: 50 + Concrete: 60 ValidRelationships: Enemy, Neutral Warhead@2Dam: SpreadDamage - Damage: 1250 + Damage: 1000 Versus: None: 30 - Wood: 62 + Wood: 70 Light: 70 Heavy: 100 - Concrete: 30 - Brick: 50 + Concrete: 60 + Brick: 75 ValidRelationships: Ally + DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath TitanRailgunImpact: Inherits: TitanRailgun @@ -1474,14 +2117,13 @@ TitanRailgunImpact: -Warhead@2Dam: Projectile: InstantHit Warhead@1Dam: SpreadDamage - Damage: 9500 + Damage: 11000 ValidRelationships: Enemy, Neutral, Ally IonZap: - ReloadDelay: 90 - Range: 5c768 + ReloadDelay: 85 + Range: 5c256 Report: ion1.aud - InvalidTargets: Air Projectile: Railgun Duration: 7 Blockable: true @@ -1503,19 +2145,17 @@ IonZap: Inaccuracy: 64 ZOffset: 2045 Warhead@1Dam: SpreadDamage - Spread: 512 Damage: 12500 - ValidRelationships: Ally, Neutral, Enemy - InvalidTargets: Air + Spread: 448 AffectsParent: false Versus: None: 30 - Wood: 70 + Wood: 75 Light: 85 Heavy: 115 - Concrete: 35 - Brick: 45 - DamageTypes: Prone100Percent, TriggerProne, ExplosionDeath + Concrete: 60 + Brick: 75 + DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath Warhead@3Eff: CreateEffect Explosions: shock_wave ExplosionPalette: tseffect @@ -1524,7 +2164,6 @@ IonZap: BurnFX: ValidTargets: Ground, Water, Trees - InvalidTargets: Air ReloadDelay: 20 Range: 0c128 Projectile: Bullet @@ -1535,6 +2174,13 @@ BurnFX: Inaccuracy: 171 Explosions: 3, 6, 7, 8 +BurnFXBlack: + Inherits: BurnFX + Warhead@3Eff: CreateEffect + Image: fireblack + Explosions: 1, 2, 3, 4 + ExplosionPalette: scrineffect + LaserFence: TargetActorCenter: true Projectile: InstantHit @@ -1545,11 +2191,10 @@ LaserFence: OrcaBomb: ValidTargets: Ground, Water - InvalidTargets: Air ReloadDelay: 50 Report: chute1.aud - Burst: 2 - BurstDelays: 5 + Burst: 3 + BurstDelays: 7 Range: 2c0 TargetActorCenter: true Projectile: GravityBomb @@ -1558,35 +2203,66 @@ OrcaBomb: Acceleration: 0, 0, 0 Shadow: true Warhead@1Dam: SpreadDamage - Spread: 726 - Damage: 700 + Spread: 512 + Damage: 1600 Falloff: 1000, 368, 135, 50, 18, 7, 0 ValidTargets: Ground, Water Versus: - None: 100 - Wood: 20 - Light: 20 - Heavy: 20 - Concrete: 20 - Brick: 20 - DamageTypes: Prone50Percent, TriggerProne, ElectricityDeath + None: 25 + Wood: 0 + Light: 75 + Heavy: 100 + Concrete: 35 + Brick: 5 + DamageTypes: Prone50Percent, TriggerProne, ElectricityDeath, AirToGround Warhead@2Smu: LeaveSmudge SmudgeType: Scorch Warhead@3Eff: CreateEffect Explosions: pulse_explosion_small ExplosionPalette: tseffect-ignore-lighting-alpha75 - ImpactSounds: expnew16.aud - Warhead@emp: GrantExternalCondition - Range: 1c512 - Duration: 300 + ImpactSounds: orcabomb1.aud, orcabomb2.aud + Warhead@4Eff: CreateEffect + Explosions: artillery_explosion + ValidTargets: Ground, Ship, Trees + Warhead@emp: GrantExternalConditionCA + Range: 1c512 + Duration: 375 Condition: empdisable - ValidTargets: Ground, Structure, Vehicle + ValidTargets: Vehicle, Ship, Building + InvalidTargets: EmpImmune + Warhead@empdef: GrantExternalConditionCA + Range: 1c512 + Duration: 625 + Condition: empdisable + ValidTargets: Defense + InvalidTargets: EmpImmune + +OrcaBombBuilding: + Inherits: OrcaBomb + -Report: + -Projectile: + Projectile: InstantHit + TargetActorCenter: false + Warhead@1Dam: SpreadDamage + Delay: 35 + Versus: + None: 0 + Wood: 40 + Light: 0 + Heavy: 0 + Concrete: 0 + Brick: 0 + DebugOverlayColor: ffaa00 + -Warhead@2Smu: + -Warhead@3Eff: + -Warhead@4Eff: + -Warhead@emp: + -Warhead@empdef: MicrowaveZap: ValidTargets: Ground, Water - InvalidTargets: Air TargetActorCenter: true - ReloadDelay: 210 + ReloadDelay: 170 Range: 7c0 Report: corefir1.aud Projectile: Railgun @@ -1601,10 +2277,11 @@ MicrowaveZap: QuantizationCount: 64 HitAnim: sparks_overlay HitAnimPalette: tseffect-ignore-lighting-alpha75 - ZOffset: 2046 + ZOffset: 6144 Warhead@1Dam: SpreadDamage - InvalidTargets: Air, Cyborg - Spread: 512 + InvalidTargets: Infantry + Falloff: 100, 37, 14, 0 + Spread: 448 Damage: 30000 DamageTypes: Prone50Percent, TriggerProne, FireDeath Versus: @@ -1612,42 +2289,56 @@ MicrowaveZap: Wood: 5 Concrete: 40 Light: 100 - Heavy: 60 + Heavy: 85 + Brick: 5 Warhead@2Dam: SpreadDamage - ValidTargets: Cyborg - InvalidTargets: Air - Spread: 341 + ValidTargets: Infantry + Spread: 42 Damage: 30000 DamageTypes: Prone50Percent, TriggerProne, FireDeath - Warhead@emp: GrantExternalCondition + Warhead@emp: GrantExternalConditionCA Range: 0c511 - Duration: 50 + Duration: 100 Condition: empdisable - ValidTargets: Defense, Vehicle + ValidTargets: Vehicle, Ship, Structure + InvalidTargets: EmpImmune + Warhead@3Eff: CreateEffect + Image: microwavehit + Explosions: idle + ValidTargets: Ground, Trees + ExplosionPalette: scrineffect MicrowaveZap.UPG: Inherits: MicrowaveZap - Warhead@3: ChangeOwnerToNeutral - ValidTargets: DriverKill - InvalidTargets: Infantry, Ship, Structure, Wall, Husk, Air, DriverKillImmune - ValidRelationships: Ally, Enemy, Neutral + Warhead@DriverKill: ChangeOwnerToNeutral + ValidTargets: DriverKillLow + InvalidTargets: DriverKillImmune + ValidRelationships: Enemy, Ally + CargoEffect: Kill Range: 0c511 - Warhead@emp: GrantExternalCondition - Duration: 200 - ValidTargets: Defense - Warhead@highlight: GrantExternalCondition + Warhead@emp: GrantExternalConditionCA + Range: 1c0 + Warhead@emp2: GrantExternalConditionCA Range: 0c511 - Duration: 2 - Condition: highlight - ValidTargets: Vehicle + Duration: 125 + Condition: empdisable + ValidTargets: Vehicle, Ship, Structure + InvalidTargets: EmpImmune + Warhead@Flash: FlashTarget + Spread: 0c511 + Color: ffffff + ValidTargets: DriverKillLow + InvalidTargets: DriverKillImmune + ValidRelationships: Enemy, Ally -MicrowaveZapSound: - Inherits: MicrowaveZap - Report: coreup1.aud +HornetLauncher: + ReloadDelay: 15 + Range: 20c0 + ValidTargets: Ground, Water Projectile: InstantHit - -Warhead@2Dam: - Warhead@1Dam: SpreadDamage - Damage: 1 + Warhead@1Dam: TargetDamage + ValidTargets: Ground, Water + Damage: 50000 Versus: None: 0 Wood: 0 @@ -1656,28 +2347,46 @@ MicrowaveZapSound: Heavy: 0 Brick: 0 -HornetLauncher: - ReloadDelay: 175 - Burst: 5 - BurstDelays: 15 - Range: 25c0 +V3Launcher: + ReloadDelay: 250 + Range: 21c511 + MinRange: 6c0 + Report: vv3latta.aud, vv3lattb.aud ValidTargets: Ground, Water Projectile: InstantHit Warhead@1Dam: TargetDamage ValidTargets: Ground, Water + Damage: 50000 + Versus: + None: 0 + Wood: 0 + Concrete: 0 + Light: 0 + Heavy: 0 + Brick: 0 -V3Launcher: +THTargetter: ReloadDelay: 250 Range: 21c511 MinRange: 6c0 - Report: vv3latta.aud, vv3lattb.aud - ValidTargets: Ground, Water + Projectile: InstantHit + +THLauncher: + Inherits: THTargetter + Report: tomahawk.aud Projectile: InstantHit Warhead@1Dam: TargetDamage - ValidTargets: Ground, Water + Damage: 50000 + Versus: + None: 0 + Wood: 0 + Concrete: 0 + Light: 0 + Heavy: 0 + Brick: 0 ICBMLauncher: - ReloadDelay: 300 + ReloadDelay: 275 Range: 25c0 MinRange: 10c0 Report: nukemisl.aud @@ -1685,6 +2394,14 @@ ICBMLauncher: Projectile: InstantHit Warhead@1Dam: TargetDamage ValidTargets: Ground, Water + Damage: 50000 + Versus: + None: 0 + Wood: 0 + Concrete: 0 + Light: 0 + Heavy: 0 + Brick: 0 Flare: ReloadDelay: 1 @@ -1692,7 +2409,7 @@ Flare: MinRange: 3c0 ValidTargets: Structure TargetActorCenter: true - Projectile: LaserZap + Projectile: LaserZapCA Width: 45 Duration: 8 SecondaryBeamWidth: 65 @@ -1700,7 +2417,7 @@ Flare: ZOffset: 4096 Warhead@1Dam: TargetDamage ValidTargets: Structure - Warhead@2Con: GrantExternalCondition + Warhead@2Con: GrantExternalConditionCA ValidTargets: Structure Range: 0c32 Duration: 8 @@ -1723,14 +2440,14 @@ Cloud: Falloff: 1000, 368, 135, 50, 18, 7, 0 Delay: 5 ValidTargets: Ground, Trees - InvalidTargets: Air, Creep + InvalidTargets: Creep Versus: None: 120 Wood: 0 Light: 50 Heavy: 25 Concrete: 100 - Brick: 10 + Brick: 5 DamageTypes: Prone50Percent, TriggerProne, RadiationDeath ChaosCloud: @@ -1738,12 +2455,27 @@ ChaosCloud: Range: 1c0 ValidTargets: Ground, Water Projectile: InstantHit - Warhead@1Cond: GrantExternalCondition + Warhead@1Cond: GrantExternalConditionCA ValidTargets: Ground, Vehicle + InvalidTargets: ChaosImmune Range: 1c512 Duration: 50 Condition: berserk +VirusCloud: + Inherits: Cloud + -Warhead@18Radio: + Warhead@1Dam: SpreadDamage + Damage: 1000 + Spread: 256 + Falloff: 100, 37, 14, 5, 0 + DamageTypes: PoisonDeath + Versus: + Light: 35 + Wood: 10 + Concrete: 10 + Brick: 0 + IrradiatedUnit: Inherits: Cloud Warhead@18Radio: CreateTintedCells @@ -1770,56 +2502,144 @@ Lasher: Warhead@1Dam: SpreadDamage Range: 0, 341, 682 Falloff: 100, 100, 0 - Damage: 1000 + Damage: 4000 ValidTargets: Infantry - DamageTypes: BulletDeath - ValidRelationships: Enemy, Neutral, Ally + DamageTypes: BulletDeath, FlakVestMitigatedMinor + ValidRelationships: Enemy, Neutral ChaosDroneTargeting: Range: 2c0 Projectile: InstantHit ValidTargets: Infantry, Vehicle, Ship InvalidTargets: ChaosImmune - Warhead@1Dam: TargetDamage -RadBeamWeapon: - ValidTargets: Ground, Water - InvalidTargets: Air +MempTargeting: + Range: 2c0 + Projectile: InstantHit + ValidTargets: Structure, Vehicle, Ship + +RadTrooperBeam: Range: 6c0 - ReloadDelay: 100 - Report: idesat1a.aud + ReloadDelay: 110 + Report: radbeam1.aud Projectile: RadBeam Amplitude: 176 WaveLength: 384 Thickness: 32 + ZOffset: 512 + Warhead@1Dam: SpreadDamage + Spread: 136 + Damage: 7600 + Versus: + None: 240 + Light: 100 + Heavy: 40 + Wood: 50 + Concrete: 50 + Brick: 12 + DamageTypes: Prone50Percent, TriggerProne, RadiationDeath + Warhead@3Eff: CreateEffect + Explosions: radhitsm + ExplosionPalette: caneon + +DesolatorBeam: + Inherits: RadTrooperBeam + Report: idesat1a.aud + Projectile: RadBeam + Thickness: 48 Warhead@1Dam: SpreadDamage + Spread: 180 + Versus: + Light: 120 + Wood: 60 + Concrete: 70 + Warhead@2Dam: HealthPercentageDamage Spread: 42 + Damage: 300 + Versus: + Light: 10 + Wood: 60 + Concrete: 70 + ValidTargets: Infantry + DamageTypes: RadiationDeath + Warhead@2irrad: GrantExternalConditionCA + Range: 0c256 + Duration: 250 + Condition: irradiated + ValidTargets: Vehicle, Ship + +RadBeamWeaponHeavy: + Range: 5c768 + ReloadDelay: 80 + Report: eradcan1.aud + Projectile: RadBeam + Amplitude: 176 + WaveLength: 384 + Thickness: 64 + ZOffset: 512 + Warhead@1Dam: HealthPercentageDamage + Spread: 256 + Damage: 300 + Versus: + Light: 10 + ValidTargets: Infantry + DamageTypes: RadiationDeath + Warhead@2Dam: SpreadDamage + Spread: 256 Damage: 16000 Versus: None: 175 - Light: 50 - Heavy: 20 - Wood: 12 - Concrete: 12 - Brick: 0 + Wood: 45 + Concrete: 45 + Light: 75 + Heavy: 60 + Brick: 12 DamageTypes: Prone50Percent, TriggerProne, RadiationDeath - Warhead@2Dam: SpreadDamage - Spread: 128 - Damage: 4000 + InvalidTargets: Infantry + Warhead@3Dam: SpreadDamage + Spread: 256 + Damage: 3750 + Falloff: 100, 45, 25, 15, 0 ValidTargets: Infantry DamageTypes: RadiationDeath - Warhead@2irrad: GrantExternalCondition + Warhead@1Radiation: CreateTintedCells + Spread: 1c0 + Falloff: 65, 30, 5, 0 + Level: 250 + MaxLevel: 750 + LayerName: radioactivity.medium + Warhead@2irrad: GrantExternalConditionCA Range: 0c256 Duration: 250 Condition: irradiated ValidTargets: Vehicle, Ship + Warhead@3Eff: CreateEffect + Explosions: radhit + ExplosionPalette: caneon + Warhead@4Eff: CreateEffect + Explosions: radburst -RadBeamWeaponE: - Inherits: RadBeamWeapon - Range: 7c0 +OverlordRadBeamWeapon: + Inherits: RadBeamWeaponHeavy + Burst: 2 + BurstDelays: 20 + Warhead@2Dam: SpreadDamage + Spread: 256 + Damage: 13500 + +ApocRadBeamWeapon: + Inherits: RadBeamWeaponHeavy + Burst: 2 + BurstDelays: 10 + ReloadDelay: 135 + Warhead@2Dam: SpreadDamage + Spread: 256 + Damage: 23500 + Warhead@3Dam: SpreadDamage + Damage: 5475 RadEruptionWeapon: - ReloadDelay: 60 + ReloadDelay: 35 Report: idesat2a.aud Warhead@1Radiation: CreateTintedCells Spread: 1c0 @@ -1827,6 +2647,46 @@ RadEruptionWeapon: Level: 250 MaxLevel: 750 LayerName: radioactivity.strong + Warhead@2irrad: GrantExternalConditionCA + Range: 2c0 + Duration: 250 + Condition: irradiated + ValidTargets: Vehicle, Ship + Warhead@3Eff: CreateEffect + Explosions: radspike, radspike2 + ExplosionPalette: tdeffect + +RadEruptionWeaponStage2: + Inherits: RadEruptionWeapon + Warhead@1Radiation: CreateTintedCells + Falloff: 100, 80, 60, 40, 20, 0 + +PsychicBeamBATF: + Inherits: DesolatorBeam + ReloadDelay: 75 + Report: mastermind-fire.aud + -Projectile: + Projectile: PlasmaBeam + Duration: 7 + Colors: ff00ff08 + InnerLightness: 200 + OuterLightness: 100 + Radius: 2 + Distortion: 150 + DistortionAnimation: 150 + SegmentLength: 350 + Inaccuracy: 128 + Warhead@1Dam: SpreadDamage + Versus: + Heavy: 35 + DamageTypes: Prone50Percent, TriggerProne, FireDeath + Warhead@2Dam: HealthPercentageDamage + DamageTypes: Prone50Percent, TriggerProne, FireDeath + -Warhead@2irrad: + Warhead@3Eff: CreateEffect + Explosions: idle + ExplosionPalette: scrin + Image: enrvbolthit ^EnergyBlast: ReloadDelay: 50 @@ -1850,13 +2710,13 @@ RadEruptionWeapon: CyCannon: Inherits: ^EnergyBlast - Projectile: Missile + Projectile: MissileCA MaximumLaunchSpeed: 192 Blockable: false HorizontalRateOfTurn: 8 Shadow: true - Image: laserfired2k - Palette: d2k + Image: rmbctorp + Palette: tdeffect MinimumLaunchSpeed: 75 Speed: 384 RangeLimit: 8c0 @@ -1868,10 +2728,17 @@ CyCannon: None: 75 Wood: 35 Light: 100 - Heavy: 75 + Heavy: 80 Concrete: 25 - Brick: 70 + Brick: 75 DamageTypes: Prone350Percent, TriggerProne, ExplosionDeath + Warhead@3Eff: CreateEffect + Explosions: large_explosion + ImpactSounds: expnew16.aud, expnew17.aud + Warhead@Flash: FlashTarget + Spread: 0c511 + Color: 00ff00 + ValidTargets: Ground, Vehicle NeutronCannon: ValidTargets: Temporal @@ -1880,37 +2747,32 @@ NeutronCannon: BurstDelays: 5 Range: 5c0 Projectile: InstantHit + TargetActorCenter: true Warhead@Damage: WarpPercentDamage Damage: 2 Spread: 1 Versus: Wood: 15 Concrete: 50 - Heavy: 75 + Heavy: 90 Light: 75 - Brick: 10 + Brick: 5 ValidTargets: Temporal DamageTypes: ChronoDeath -NeutronCannonAA: - Inherits: NeutronCannon - ValidTargets: TemporalAir - Warhead@Damage: WarpPercentDamage - ValidTargets: TemporalAir - NeutronCannonBeam: - ValidTargets: Temporal, TemporalAir + ValidTargets: Temporal ReloadDelay: 5 Range: 5c0 TargetActorCenter: true - Projectile: LaserZap + Projectile: LaserZapCA Width: 60 Duration: 15 Color: 80C8FF88 - ZOffset: 2046 + ZOffset: 512 SecondaryBeam: true SecondaryBeamWidth: 120 - SecondaryBeamZOffset: 2046 + SecondaryBeamZOffset: 511 SecondaryBeamColor: 80C8FF33 Warhead@Damage: SpreadDamage Damage: 1 @@ -1922,19 +2784,19 @@ NeutronCannonBeam: Heavy: 0 Concrete: 0 Brick: 0 - ValidTargets: Temporal, TemporalAir + ValidTargets: Temporal DamageTypes: ChronoDeath NeutronCannonPulse: Inherits: NeutronCannonBeam ReloadDelay: 20 -Projectile: - Projectile: AreaBeam + Projectile: AreaBeamCA Speed: 0c768 Duration: 8 Width: 60 Shape: Flat - ZOffset: 2047 + ZOffset: 512 TrackTarget: true Color: d8f9f7cc @@ -1945,73 +2807,206 @@ NeutronCannonSound: Projectile: InstantHit SonicPulse: - ReloadDelay: 70 + ReloadDelay: 68 Range: 7c512 Report: sonicpulse1.aud, sonicpulse2.aud + TargetActorCenter: true Projectile: LinearPulse Speed: 768 - ImpactInterval: 1 MinimumImpactDistance: 768 + ImpactType: Rectangle + RectangleLength: 768 + RectangleWidth: 1c512 + SingleHitPerActor: true + DamageFalloff@1: + Spread: 0c256 + Falloff: 100, 70, 20, 0 + ImpactAnimation@1: + Image: explosion + Sequences: sonicblast1, sonicblast2 + Palette: effect-ignore-lighting-alpha40 + ImpactAnimation@2: + Image: explosion + Sequences: sonicpulse1, sonicpulse2 + Palette: effect-ignore-lighting-alpha40 Warhead@1Dam: SpreadDamage - Spread: 0c256 - Falloff: 100, 50, 20, 0 - Damage: 6600 + Damage: 12500 ValidTargets: Ground, Water ValidRelationships: Enemy, Neutral Versus: - None: 60 - Wood: 45 - Light: 90 + None: 28 + Wood: 92 + Concrete: 80 + Light: 92 Heavy: 100 - Concrete: 35 - Brick: 20 - DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath - Warhead@3Eff: CreateEffect - Explosions: sonicpulse1, sonicpulse2 - ExplosionPalette: effect-ignore-lighting-alpha40 - ValidTargets: Ground, Air, Ship, Trees - Warhead@2Eff: CreateEffect - Explosions: sonicblast1, sonicblast2 - ExplosionPalette: effect-ignore-lighting-alpha40 - ValidTargets: Ground, Air, Ship, Trees + DamageTypes: Prone50Percent, TriggerProne, DefaultDeath SonicPulse.UPG: Inherits: SonicPulse Range: 8c256 - Warhead@1Dam: SpreadDamage - Damage: 7200 - Warhead@3Eff: CreateEffect - Explosions: sonicpulseupg1, sonicpulseupg2 - Warhead@2Eff: CreateEffect - Explosions: sonicblastupg1, sonicblastupg2 + Projectile: LinearPulse + ImpactAnimation@1: + Sequences: sonicblastupg1, sonicblastupg2 + ImpactAnimation@2: + Sequences: sonicpulseupg1, sonicpulseupg2 + Warhead@1Dam: SpreadDamage + Damage: 13500 + Warhead@ConcussionVehicles: GrantExternalConditionCA + Range: 0c128 + Duration: 150 + Condition: concussion + ValidTargets: Vehicle, Ship + ValidRelationships: Enemy, Neutral + Warhead@ConcussionInfantry: GrantExternalConditionCA + Range: 0c128 + Duration: 25 + Condition: concussion + ValidTargets: Infantry + ValidRelationships: Enemy, Neutral -JDAM: - ValidTargets: Ground, Water, Trees - InvalidTargets: Air - ReloadDelay: 50 - Report: bwhis.aud - Range: 3c0 +DisruptorPulse: + ReloadDelay: 80 + Range: 5c256 + StartBurstReport: sonic4.aud + Burst: 9 + BurstDelays: 5 TargetActorCenter: true - Projectile: GravityBomb - Image: MOAB_BOMB - Velocity: 75, 0, -74 - Acceleration: 0, 0, 0 - Shadow: true + Projectile: LinearPulse + Speed: 384 + MinimumImpactDistance: 768 + MinimumFriendlyFireRange: 1c768 + ImpactType: Rectangle + RectangleLength: 768 + RectangleWidth: 2c256 + SingleHitPerActor: true + ForceGround: DamageOnly + DamageFalloff@1: + Spread: 0c384 + Falloff: 100, 75, 25, 0 + ImpactAnimation@1: + Image: explosion + Sequences: sonicwave1, sonicwave2 + Palette: effect Warhead@1Dam: SpreadDamage - Spread: 1c0 - Damage: 3800 - Falloff: 1000, 368, 135, 50, 0 - ValidTargets: Ground, Water + Damage: 3000 Versus: - None: 0 - Wood: 90 - Light: 100 - Heavy: 95 - Concrete: 100 - Brick: 65 - DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath - Warhead@2Dam: SpreadDamage - Spread: 512 + None: 75 + Wood: 100 + Concrete: 55 + Light: 30 + Heavy: 15 + ValidRelationships: Enemy, Neutral + DamageTypes: Prone50Percent, TriggerProne, SmallExplosionDeath, FlakVestMitigatedMinor + Warhead@friendlyFire: SpreadDamage + Damage: 600 + Versus: + None: 75 + Wood: 100 + Concrete: 55 + Light: 30 + Heavy: 15 + ValidRelationships: Ally + DamageTypes: Prone50Percent, TriggerProne, SmallExplosionDeath, FlakVestMitigatedMinor + InvalidTargets: Disruptor + +DisruptorPulse.Amp: + Inherits: DisruptorPulse + Range: 6c0 + Warhead@1Dam: SpreadDamage + Damage: 3300 + Warhead@2Eff: CreateFacingEffect + Explosions: sonicwaveupg1, sonicwaveupg2 + ExplosionPalette: effect + Warhead@4Conc: GrantExternalConditionCA + Range: 0c768 + Duration: 75 + Condition: concussion + ValidTargets: Ground, Infantry, Vehicle, Ship + ValidRelationships: Enemy, Neutral + +DisruptorPulse.Seek3: + Inherits: DisruptorPulse + Range: 5c640 + +DisruptorPulse.Amp.Seek3: + Inherits: DisruptorPulse.Amp + Range: 6c384 + +SonicPulseDelphis: + ReloadDelay: 80 + Range: 5c256 + StartBurstReport: delpatk1.aud, delpatk2.aud + Burst: 3 + BurstDelays: 2 + TargetActorCenter: true + Projectile: LinearPulse + Speed: 384 + MinimumImpactDistance: 768 + MinimumFriendlyFireRange: 1c768 + ImpactType: Rectangle + RectangleLength: 768 + RectangleWidth: 2c256 + SingleHitPerActor: true + ForceGround: DamageOnly + DamageFalloff@1: + Spread: 0c384 + Falloff: 100, 75, 25, 0 + ImpactAnimation@1: + Image: explosion + Sequences: sonicwavedelp1, sonicwavedelp2 + Palette: effect + Warhead@1Dam: SpreadDamage + Damage: 1600 + Versus: + None: 70 + Wood: 100 + Concrete: 70 + Light: 70 + Heavy: 35 + ValidRelationships: Enemy, Neutral + DamageTypes: Prone50Percent, TriggerProne, SmallExplosionDeath, FlakVestMitigatedMinor + Warhead@friendlyFire: SpreadDamage + Damage: 500 + Versus: + None: 70 + Wood: 100 + Concrete: 70 + Light: 70 + Heavy: 35 + ValidRelationships: Ally + DamageTypes: Prone50Percent, TriggerProne, SmallExplosionDeath, FlakVestMitigatedMinor + Warhead@4Conc: GrantExternalConditionCA + Range: 0c768 + Duration: 75 + Condition: undermine-foundation + ValidTargets: Structure + +JDAM: + ValidTargets: Ground, Water, Trees + ReloadDelay: 50 + Report: bwhis.aud + Range: 3c0 + MinRange: 2c0 + TargetActorCenter: true + Projectile: GravityBomb + Image: MOAB_BOMB + Velocity: 110, 0, -100 + Acceleration: 0, 0, 0 + Shadow: true + Warhead@1Dam: SpreadDamage + Spread: 1c0 + Damage: 5200 + Falloff: 1000, 448, 192, 50, 0 + ValidTargets: Ground, Water + Versus: + None: 0 + Wood: 80 + Light: 80 + Heavy: 100 + Concrete: 80 + DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath, TankBuster, AirToGround + Warhead@2Dam: SpreadDamage + Spread: 448 Damage: 10000 Falloff: 1000, 200, 45, 20, 0 ValidTargets: Ground, Water @@ -2022,18 +3017,19 @@ JDAM: Heavy: 0 Concrete: 0 Brick: 0 - DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath + DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath, FlakVestMitigated, AirToGround Warhead@2Smu: LeaveSmudge SmudgeType: Scorch Warhead@3Eff: CreateEffect - Explosions: fuelbomb + Explosions: fuelbomb1, fuelbomb2 ImpactSounds: xplobig4.aud Warhead@Flames: FireCluster + InvalidTargets: Water Weapon: BurnFx RandomClusterCount: 3 Dimensions: 3,3 Footprint: xxx xxx xxx - Warhead@Concussion2: GrantExternalCondition + Warhead@Concussion: GrantExternalConditionCA Range: 3c0 Duration: 70 Condition: concussion @@ -2043,26 +3039,20 @@ JDAM: Intensity: 1 Multiplier: 0.5,0.5 Warhead@Shrap: FireShrapnel - Weapon: SmallDebris - Amount: 5 + Weapon: TinyDebris + Amount: 10 AimChance: 0 - ValidTargets: Ground, Water, Infantry, Vehicle + ValidTargets: Ground, Infantry, Vehicle ThrowWithoutTarget: true HarvSwap: - ReloadDelay: 1 + ReloadDelay: 500 Projectile: InstantExplode Warhead@2Eff: CreateEffect Explosions: chronowarp_effect ExplosionPalette: ra2effect-ignore-lighting-alpha75 ValidTargets: Ground, Air, Water ImpactSounds: chrono2.aud - Warhead@teleport: SpawnActor - Actors: harv.chrono - Range: 1 - Image: chronoappear - Sequence: idle - ValidTargets: Air, Ground, Water Warhead@3Flash: ChronoFlashEffect U2Camera: @@ -2073,6 +3063,49 @@ U2Camera: TargetActorCenter: true Projectile: InstantHit +KillZoneSpawner: + Range: 1c0 + ReloadDelay: 100 + Report: chute1.aud + Projectile: InstantHit + Warhead@Spawn: SpawnActor + Delay: 40 + Actors: killzone + Range: 1 + ImpactActors: false + +KillZoneFlare: + Range: 1c0 + ReloadDelay: 100 + FirstBurstTargetOffset: -3072, 0, 0 + Projectile: Bullet + LaunchAngle: 0 + Speed: 100 + Image: BOMB + ContrailLength: 12 + ContrailStartColorUsePlayerColor: true + ContrailEndColorUsePlayerColor: true + ContrailStartColorAlpha: 128 + ContrailStartWidth: 64 + Shadow: true + Warhead@Spawn: SpawnActor + Actors: flare.killzone + Range: 1 + Delay: 5 + ImpactActors: false + +KillZoneFlare2: + Inherits: KillZoneFlare + FirstBurstTargetOffset: 1550,2720,0 + Warhead@Spawn: SpawnActor + -Delay: + +KillZoneFlare3: + Inherits: KillZoneFlare + FirstBurstTargetOffset: 1550,-2720,0 + Warhead@Spawn: SpawnActor + -Delay: + DummyWeapon: Warhead@Dummy: Dummy @@ -2089,20 +3122,36 @@ Lasher: DamageTypes: BulletDeath ValidRelationships: Enemy, Neutral +ShadowBeaconLauncher: + ReloadDelay: 25 + Range: 4c0 + Report: grenade1.aud + Projectile: Bullet + Blockable: false + LaunchAngle: 62 + Speed: 180 + Image: BOMB + ContrailLength: 30 + ContrailStartColor: 8888aa + ContrailStartColorAlpha: 100 + Warhead@Beacon: SpawnActor + Actors: shab + Range: 1 + ImpactActors: false + AttachShadowBeacon: Warhead@AttachCamera: AttachActor Range: 341 Actor: shadow.beacon.camera AttachSounds: shad-beacontrigger1.aud MissSounds: dud1.aud - ValidTargets: ShadowBeacon + ValidTargets: ShadowBeaconAttachable Warhead@TargetValidator: SpreadDamage - ValidTargets: ShadowBeacon - Warhead@highlight: GrantExternalCondition - Range: 341 - Duration: 2 - Condition: redhighlight - ValidTargets: ShadowBeacon + ValidTargets: ShadowBeaconAttachable + Warhead@Flash: FlashTarget + Spread: 341 + Color: ff0000 + ValidTargets: ShadowBeaconAttachable ^Debris: ValidTargets: Ground, Water, Trees, Air @@ -2127,7 +3176,7 @@ AttachShadowBeacon: Concrete: 28 DamageTypes: Prone100Percent, TriggerProne, ExplosionDeath Warhead@2Eff: CreateEffect - Explosions: small_explosion_alt1, small_explosion_alt2, small_explosion_alt3 + Explosions: small_explosion, small_explosion_alt1, small_explosion_alt2, small_explosion_alt3 ValidTargets: Ground, Air ImpactSounds: kaboom25.aud, kaboom12.aud, xplos.aud Warhead@3EffWater: CreateEffect @@ -2139,6 +3188,49 @@ AttachShadowBeacon: SmudgeType: Crater InvalidTargets: Structure, Wall, Trees +TinyDebris: + Inherits: ^Debris + ValidTargets: Ground, Trees + Projectile: Bullet + Image: dirt + Palette: terrain + Sequences: 1, 2, 3, 4, 5 + BounceCount: 2 + BounceRangeModifier: 10 + InvalidBounceTerrain: Water + Warhead@1Dam: SpreadDamage + Damage: 1 + -Warhead@2Eff: + -Warhead@3EffWater: + -Warhead@4Smu: + +BrassDebris: + ReloadDelay: 10 + Range: 0c1 + ValidTargets: Infantry, Vehicle, Building, Wall, Ground, Water, Air + Projectile: ProjectileHusk + Velocity: 50, 0, 100 + VelocityRandomFactor: 0, 15, 30 + Acceleration: 0, 0, -30 + HorizontalRevert: true + Image: brass + Sequences: 1, 2, 3, 4, 5 + UseRangeModifierAsVelocityX: false + +BrassDebris3: + Inherits: BrassDebris + Burst: 3 + BurstDelays: 2 + +BrassDebrisAir: + Inherits: BrassDebris + ReloadDelay: 10 + Burst: 3 + BurstDelays: 2 + Projectile: ProjectileHusk + Velocity: 50, 0, 10 + VelocityRandomFactor: 0, 15, 30 + SmallDebris: Inherits: ^Debris @@ -2219,3 +3311,650 @@ ChemDebrisSmall: -Warhead@5Radio: Warhead@1Dam: SpreadDamage Spread: 10 + +AirDummyAim: + Range: 7c0 + ReloadDelay: 20 + ValidTargets: Air + Projectile: InstantHit + +YuriDummyAim: + Range: 3c0 + ReloadDelay: 20 + ValidTargets: Structure + Projectile: InstantHit + +DropDummy: + ValidTargets: Ground + InvalidTargets: Infantry, Ship, Tank, Structure, Water Structure, Air + ReloadDelay: 50 + Range: 4c0 + Projectile: Bullet + Speed: 200 + +MineDefuser: + Range: 1c512 + ReloadDelay: 6 + ValidTargets: Mine + Projectile: InstantHit + Warhead@1Dam: SpreadDamage + Damage: 12000 + ValidTargets: Mine + Delay: 5 + Warhead@1Def: GrantExternalConditionCA + Condition: defused + Range: 0c511 + Duration: 25 + ValidTargets: Mine + Warhead@3Eff: CreateEffect + Explosions: med_explosion + ImpactSounds: mineblo1.aud + +MineDefuserCharger: + Inherits: MineDefuser + -Warhead@1Dam: + -Warhead@1Def: + -Warhead@3Eff: + +DecoyFlameTankSpawner: + ReloadDelay: 1 + Projectile: InstantExplode + Warhead@Spawn: SpawnActor + Actors: ftnk.decoy, ftnk.decoy + Range: 3 + ForceGround: false + MatchSourceFacing: true + ValidTargets: Ground, Water + ImpactActors: false + +DecoyHeavyFlameTankSpawner: + Inherits: DecoyFlameTankSpawner + Warhead@Spawn: SpawnActor + Actors: hftk.decoy, hftk.decoy + +DecoyDespawn: + Report: decoydespawn.aud + Projectile: InstantHit + +MantisLaser: + Inherits: Laser + Burst: 2 + BurstDelays: 3 + ReloadDelay: 10 + ValidTargets: Air, AirSmall + Range: 7c512 + Report: mantis-fire1.aud, mantis-fire2.aud + Projectile: LaserZapCA + Width: 42 + SecondaryBeamWidth: 75 + -HitAnim: + Warhead@1Dam: SpreadDamage + ValidTargets: Air, AirSmall + Damage: 2500 + Warhead@3Eff: CreateEffect + Explosions: small_air_explosion + Inaccuracy: 256 + ValidTargets: Air, AirSmall + +ViperLaser: + Inherits: DevourerLaser + Report: viper-fire1.aud + Projectile: PlasmaBeam + Colors: ff0000E6, cc0000E6 + Warhead@1Dam: SpreadDamage + Damage: 1550 + +AvatarLaser: + ReloadDelay: 100 + ValidTargets: Ground, Water + Range: 6c512 + Report: oblfire.aud + Projectile: LaserZapCA + Width: 45 + Duration: 18 + HitAnim: laserfire + Color: ff7143cc + ZOffset: 512 + SecondaryBeam: true + SecondaryBeamWidth: 90 + SecondaryBeamZOffset: 511 + SecondaryBeamColor: FF000099 + Warhead@1Dam: SpreadDamage + Spread: 42 + Damage: 26000 + DamageTypes: Prone50Percent, TriggerProne, FireDeath + Versus: + None: 250 + Wood: 60 + Concrete: 55 + Brick: 50 + Warhead@2Smu: LeaveSmudge + SmudgeType: Scorch-NoFlame + InvalidTargets: Vehicle, Structure, Wall, Husk, Trees, Creep + Warhead@3Eff: CreateEffect + Image: laserhit + Explosions: idle1, idle2 + ExplosionPalette: caneon + ValidTargets: Ground, Ship, Trees + +AvatarLaser.Adv: + Inherits: Laser + Report: obelmod2.aud + Range: 6c768 + -Projectile: + Projectile: PlasmaBeam + Duration: 9 + SecondaryCenterBeam: true + Colors: FF00BB80, FF0000A0, FF002270 + InnerLightness: 200 + OuterLightness: 115 + Radius: 2 + Distortion: 0 + DistortionAnimation: 96 + StartOffset: 0,80,0 + FollowingOffset: 0,-20,0 + RecalculateColors: true + TrackTarget: true + ImpactTicks: 0, 2, 4, 6, 8 + Warhead@1Dam: SpreadDamage + Spread: 128 + Damage: 5500 + Warhead@3Eff: CreateEffect + Explosions: small_explosion, small_explosion_alt1, small_explosion_alt2, small_explosion_alt3 + +ShadeEmp: + ReloadDelay: 100 + Range: 7c0 + Report: enli-empfire.aud + Projectile: Bullet + Inaccuracy: 64 + Blockable: false + Shadow: true + Speed: 384 + LaunchAngle: 0 + Image: enliempproj + Palette: effect + TrailImage: smokey + TrailPalette: scrinplasma + ContrailLength: 17 + ContrailStartColor: 6c6cd4aa + ContrailStartColorAlpha: 170 + ContrailStartWidth: 0c48 + Warhead@1Dam: SpreadDamage + Spread: 341 + Damage: 17000 + ValidTargets: Ground, Water + Versus: + None: 75 + Wood: 50 + Light: 80 + Heavy: 100 + Concrete: 75 + Brick: 5 + DamageTypes: Prone50Percent, TriggerProne, ElectricityDeath, AirToGround + Warhead@1Emp: GrantExternalConditionCA + Range: 1c0 + Duration: 225 + Condition: empdisable + ValidTargets: Vehicle, Ship, Structure + InvalidTargets: Cyborg, EmpImmune + Warhead@2Emp: GrantExternalConditionCA + Range: 1c0 + Duration: 100 + Condition: empdisable + ValidTargets: Cyborg + InvalidTargets: EmpImmune + Warhead@3Eff_impact: CreateEffect + Explosions: enliemphit1, enliemphit2 + ImpactSounds: enli-emphit.aud + Inaccuracy: 341 + +ManticoreBolts: + Inherits: ^AirToAirMissile + Range: 14c0 + MinRange: 3c0 + Report: mcor-fire1.aud, mcor-fire2.aud + ReloadDelay: 150 + Burst: 4 + BurstDelays: 3 + ValidTargets: Air, AirSmall + TargetActorCenter: true + Projectile: MissileCA + Image: redplasmatorp + Palette: caneon + TrailImage: smokey + TrailPalette: scrinplasma + Speed: 360 + Blockable: false + Jammable: false + RangeLimit: 16c0 + ShadowColor: 00000033 + HorizontalRateOfTurn: 28 + VerticalRateOfTurn: 28 + CruiseAltitude: 0 + Warhead@1Dam: SpreadDamage + Range: 0, 0c64, 0c256, 1c768 + Damage: 4000 + Warhead@smallDamage: SpreadDamage + Damage: 4000 + +VertigoBomb: + Inherits: JDAM + Report: vert-bomb1.aud + Warhead@3Eff: CreateEffect + ImpactSounds: vert-bombhit1.aud, vert-bombhit2.aud + Warhead@1Dam: SpreadDamage + Versus: + Wood: 80 + Concrete: 100 + -Warhead@Concussion: + Warhead@StealthBreaker: GrantExternalConditionCA + Range: 6c0 + Duration: 1125 + Condition: cloak-force-disabled + ValidRelationships: Enemy, Neutral + +VertigoBombTargeter: + Range: 7c0 + MinRange: 5c0 + ReloadDelay: 50 + Projectile: InstantHit + +PeacemakerBombs: + Range: 1c832 + Report: bwhis.aud + Burst: 5 + BurstDelays: 6 + TargetActorCenter: true + Projectile: GravityBomb + Image: medbomb + Velocity: 20, 0, -60 + Acceleration: 0, 0, 0 + Shadow: true + Warhead@1Dam: SpreadDamage + Spread: 1c0 + Damage: 24000 + Versus: + None: 10 + Wood: 0 + Light: 70 + Heavy: 100 + Concrete: 60 + DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath, TankBuster, AirToGround, FlakVestMitigated + Warhead@2Dam: SpreadDamage + Spread: 512 + Damage: 24000 + Versus: + None: 40 + Wood: 0 + Light: 0 + Heavy: 0 + Concrete: 0 + Brick: 0 + DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath, FlakVestMitigated + Warhead@2Smu: LeaveSmudge + SmudgeType: Crater + InvalidTargets: Vehicle, Structure, Wall, Husk, Trees + Warhead@3Eff: CreateEffect + Explosions: building, building2 + ImpactSounds: kaboom15.aud, kaboom12.aud + ValidTargets: Ground, Ship, Trees + Warhead@4EffWater: CreateEffect + Explosions: small_splash + ImpactSounds: h2obomb2.aud + ValidTargets: Water, Underwater + InvalidTargets: Ship, Structure + Warhead@Shrap: FireShrapnel + Weapon: TinyDebris + Amount: 10 + AimChance: 0 + ValidTargets: Ground, Infantry, Vehicle + ThrowWithoutTarget: true + +PeacemakerBombsBuilding: + Inherits: PeacemakerBombs + -Report: + -Projectile: + Projectile: InstantHit + TargetActorCenter: false + Warhead@1Dam: SpreadDamage + Delay: 35 + Versus: + None: 0 + Wood: 45 + Light: 0 + Heavy: 0 + Concrete: 0 + Brick: 0 + DebugOverlayColor: ffaa00 + -Warhead@2Dam: + -Warhead@2Smu: + -Warhead@3Eff: + -Warhead@4EffWater: + -Warhead@Shrap: + +FloatingDiscLaser: + Inherits: Laser + ValidTargets: Ground, Water, Air, AirSmall + ReloadDelay: 60 + Range: 6c0 + Report: vfloatta.aud + Projectile: LaserZapCA + Color: eb39d380 + SecondaryBeamColor: eb39d340 + Warhead@1Dam: SpreadDamage + ValidTargets: Ground, Water, Air, AirSmall + Damage: 13000 + Versus: + None: 100 + Light: 75 + Wood: 100 + Heavy: 75 + Concrete: 75 + Brick: 25 + Aircraft: 35 + DamageTypes: Prone50Percent, TriggerProne, FireDeath, AirToGround + +^FloatingDiscDrainer: + ReloadDelay: 10 + Range: 0c512 + Projectile: InstantHit + TargetActorCenter: true + +FloatingDiscPowerDrainer: + Inherits: ^FloatingDiscDrainer + ValidTargets: PowerDrainable + Warhead@PowerDrain: GrantExternalConditionCA + Range: 0c128 + Duration: 11 + Condition: discpowerdrain + ValidRelationships: Enemy + ValidTargets: PowerDrainable + +FloatingDiscResourceDrainer: + Inherits: ^FloatingDiscDrainer + ValidTargets: ResourceDrainable + Warhead@ResourceDrain: GrantExternalConditionCA + Range: 0c128 + Duration: 11 + Condition: resourcedrain + ValidRelationships: Enemy, Neutral + ValidTargets: ResourceDrainable + +ZoneTrooperRailgun: + ReloadDelay: 65 + Range: 6c0 + Report: ztrp-fire1.aud, ztrp-fire2.aud, ztrp-fire3.aud + Projectile: RailgunCA + Duration: 10 + Blockable: true + DamageActorsInLine: false + BeamColor: 00FFFFC8 + BeamWidth: 40 + HelixThickness: 16 + HelixRadius: 32 + HitAnim: explosion + HitAnimSequence: small_explosion + ZOffset: 2046 + Warhead@1Dam: SpreadDamage + Spread: 0c64 + Damage: 10000 + Versus: + None: 30 + Wood: 50 + Light: 85 + Heavy: 100 + Concrete: 75 + Brick: 75 + DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath + +ZoneRaiderGrenade: + ReloadDelay: 60 + Range: 6c0 + Report: zrai-fire1.aud, zrai-fire2.aud + Projectile: Bullet + Speed: 700 + Image: BOMB + Shadow: true + Inaccuracy: 554 + LaunchAngle: 75 + Blockable: false + ContrailLength: 30 + ContrailStartColor: 5bd8c3 + ContrailStartColorAlpha: 128 + Warhead@1Dam: SpreadDamage + Spread: 384 + Damage: 8500 + Versus: + None: 35 + Wood: 90 + Light: 100 + Heavy: 45 + Concrete: 50 + Brick: 80 + DamageTypes: Prone50Percent, TriggerProne, SmallExplosionDeath, FlakVestMitigated + Warhead@2Smu: LeaveSmudge + SmudgeType: Crater + InvalidTargets: Vehicle, Structure, Wall, Husk, Trees + Warhead@3Eff: CreateEffect + Explosions: med_explosion + ImpactSounds: kaboom25.aud + ValidTargets: Ground, Ship, Trees + Warhead@4EffWater: CreateEffect + Explosions: small_splash + ImpactSounds: splashm1.aud, splashm2.aud, splashm3.aud + ValidTargets: Water, Underwater + InvalidTargets: Ship, Structure, Bridge + Warhead@Concussion: GrantExternalConditionCA + Range: 0c512 + Duration: 50 + Condition: concussion + ValidTargets: Infantry, Vehicle, Ship + Warhead@5Eff: CreateEffect + Explosions: sonicimpactsm + ExplosionPalette: effect + +ZoneDefenderGun: + ReloadDelay: 70 + Range: 6c0 + Report: ionrifle1.aud, ionrifle2.aud + Projectile: LaserZap + Width: 38 + Duration: 8 + Color: FFFFFFEE + ZOffset: 512 + SecondaryBeam: true + SecondaryBeamWidth: 80 + SecondaryBeamZOffset: 511 + SecondaryBeamColor: FFFFFF66 + Warhead@1Dam: SpreadDamage + Spread: 288 + Damage: 8250 + Versus: + None: 18 + Wood: 50 + Light: 85 + Heavy: 100 + Concrete: 75 + Brick: 75 + DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath + Warhead@3Eff: CreateEffect + Explosions: shock_wave_sm + ExplosionPalette: tseffect + Warhead@4Smu_impact: LeaveSmudge + SmudgeType: Scorch + +CryoSprayer: + Range: 5c768 + ReloadDelay: 5 + Burst: 1 + TargetActorCenter: true + Projectile: LinearPulse + Speed: 341 + MinimumImpactDistance: 0 + MaximumImpactDistance: 5456 + Warhead@1Dam: SpreadDamage + Spread: 0c128 + Falloff: 100, 75, 25, 0 + Damage: 400 + Versus: + None: 100 + Wood: 2 + Light: 15 + Heavy: 10 + Concrete: 2 + Brick: 0 + ValidRelationships: Enemy, Neutral + DamageTypes: Prone50Percent, TriggerProne, FrozenDeath + Warhead@2Eff: CreateFacingEffect + Explosions: cryobeam1, cryobeam2 + ExplosionPalette: effect + ValidTargets: Ground, Air, Ship, Trees + Inaccuracy: 110 + Warhead@chill1: GrantExternalConditionCA + Condition: chilled + Duration: 75 + Range: 0c341 + ValidRelationships: Enemy, Neutral + +ZeusCloud: + ReloadDelay: 150 + Range: 21c511 + Report: sweastra.aud, sweastrd.aud + Projectile: AthenaProjectile + Altitude: 5c768 + Warhead@1: FireFragment + UseZOffsetAsAbsoluteHeight: true + Weapon: ZeusBolt + ValidTargets: Air, Ground, Water + Delay: 28 + ImpactActors: false + Warhead@TargetValidation: SpreadDamage + Warhead@Cloud: CreateEffect + Explosions: weathercloud1, weathercloud2, weathercloud1f, weathercloud2f + ExplosionPalette: ra2unit + ValidTargets: Ground, Air, Water + Inaccuracy: 341 + Warhead@Shadow: FireFragment + UseZOffsetAsAbsoluteHeight: true + Weapon: ZeusShadow + ValidTargets: Ground, Air, Water + ImpactActors: false + +ZeusShadow: + Projectile: InstantHit + Range: 512 + Warhead@Shadow: CreateEffect + Explosions: weathercloudshadow + ValidTargets: Ground, Air, Water + Inaccuracy: 341 + +ZeusBolt: + Projectile: InstantHit + Range: 512 + Warhead@1Dam: SpreadDamage + Spread: 384 + Falloff: 1000, 448, 192, 50, 18, 7, 0 + Damage: 3500 + DamageTypes: Prone50Percent, TriggerProne, ElectricityDeath, FlakVestMitigatedMinor + Versus: + None: 85 + Wood: 100 + Concrete: 65 + Brick: 50 + Heavy: 70 + Light: 80 + Warhead@4: CreateEffect + Explosions: weatherbolt1, weatherbolt2, weatherbolt3, weatherbolt1f, weatherbolt2f, weatherbolt3f + ImpactSounds: sweastrb.aud, sweastrc.aud + ValidTargets: Ground, Air, Water + ExplosionPalette: ra2effect-ignore-lighting-alpha90 + Inaccuracy: 256 + Warhead@5: CreateEffect + Explosions: large_explosion + ValidTargets: Ground, Water + Warhead@6Smu: LeaveSmudge + SmudgeType: Scorch + +BasiliskPulse: + ReloadDelay: 60 + Burst: 3 + BurstDelays: 5 + Range: 8c0 + StartBurstReport: basiwave.aud + TargetActorCenter: true + Projectile: LinearPulse + Speed: 512 + MinimumImpactDistance: 512 + ProjectileAnimation@1: + Image: sparks_overlay + Sequences: idle + Palette: tseffect-ignore-lighting-alpha75 + Warhead@1Dam: SpreadDamage + Spread: 0c256 + Falloff: 100, 75, 25, 0 + Damage: 500 + Versus: + None: 20 + Wood: 20 + Light: 100 + Heavy: 100 + Concrete: 100 + Brick: 0 + DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath + InvalidTargets: EmpImmune + Warhead@2Eff: CreateFacingEffect + Explosions: basiwave + ExplosionPalette: scrin + Inaccuracy: 80 + ValidTargets: Ground, Air, Ship, Trees + Warhead@emp: GrantExternalConditionCA + Range: 0c511 + Duration: 100 + Condition: empdisable + ValidTargets: Vehicle, Ship, Structure + InvalidTargets: EmpImmune + +CyclopsZap: + Inherits: TTrackZap + Range: 8c0 + +JackknifeTargeter: + Range: 8c0 + ValidTargets: Ground, Water + MinRange: 0c768 + ReloadDelay: 25 + Projectile: InstantHit + +TroopCrawlerDummyWeapon: + Range: 1c0 + ValidTargets: Infantry + ReloadDelay: 25 + Projectile: InstantHit + +TargetPainter: + Range: 13c0 + ReloadDelay: 25 + ValidTargets: Vehicle, Ship, Structure + InvalidTargets: Cyborg + Report: targetpainterbeep.aud + TargetActorCenter: true + Projectile: ArcLaserZap + Color: 55555560 + Angle: 70 + Width: 70 + Duration: 20 + HitAnim: empty + Warhead@UnitReveal: RevealShroud + Duration: 28 + Radius: 5c0 + InvalidTargets: Structure + Warhead@BuildingReveal: RevealShroud + Duration: 28 + Radius: 3c0 + ValidTargets: Structure + Warhead@Cond: GrantExternalConditionCA + Range: 0c42 + Duration: 28 + Condition: painted-target + ValidTargets: Vehicle, Ship, Structure diff --git a/mods/ca/weapons/scrin.yaml b/mods/ca/weapons/scrin.yaml index 49f5498bdc..505c35b2ca 100644 --- a/mods/ca/weapons/scrin.yaml +++ b/mods/ca/weapons/scrin.yaml @@ -2,12 +2,16 @@ WarriorGun: Inherits: M1Carbine Report: warrior-fire1.aud +WarriorGunBATF: + Inherits: M1CarbineBATF + Report: warrior-fire1.aud + DisintegratorBeam: Inherits: Laser ReloadDelay: 30 Range: 5c0 Report: disintegrator-fire1.aud, disintegrator-fire2.aud, disintegrator-fire3.aud - Projectile: LaserZap + Projectile: LaserZapCA Color: 00FFCCAA Width: 30 Duration: 3 @@ -17,17 +21,28 @@ DisintegratorBeam: Warhead@1Dam: SpreadDamage Damage: 3000 Versus: - None: 15 + None: 10 Wood: 74 Heavy: 100 Light: 34 Concrete: 75 +DisintegratorBeamTargeter: + ReloadDelay: 30 + Range: 5c0 + Projectile: InstantHit + +DisintegratorBeamBATF: + Inherits: DisintegratorBeam + Range: 5c768 + Warhead@1Dam: SpreadDamage + Damage: 2250 + DisintegratorBeamAA: Inherits: DisintegratorBeam - Range: 7c0 + Range: 6c0 ValidTargets: Air, AirSmall - Projectile: LaserZap + Projectile: LaserZapCA Blockable: false Warhead@1Dam: SpreadDamage ValidTargets: Air @@ -35,28 +50,33 @@ DisintegratorBeamAA: Range: 0, 0c64, 0c256, 3c0 Falloff: 100, 100, 30, 15 Damage: 2500 - Versus: - None: 100 - Wood: 100 - Concrete: 100 - Light: 100 - Warhead@2Dam: SpreadDamage + Warhead@smallDamage: SpreadDamage ValidTargets: AirSmall - Range: 0, 0c64 - Falloff: 100, 30 - Damage: 2500 - Versus: - None: 100 - Wood: 100 - Concrete: 100 - Light: 100 + ValidRelationships: Enemy, Neutral + Spread: 128 + Falloff: 100, 50, 14, 0 + Damage: 4375 + +DisintegratorIFVBeam: + Inherits: DisintegratorBeam + ReloadDelay: 25 + Warhead@1Dam: SpreadDamage + Damage: 3400 + +DisintegratorIFVBeamAA: + Inherits: DisintegratorBeamAA + ReloadDelay: 25 + Warhead@1Dam: SpreadDamage + Damage: 4500 + Warhead@smallDamage: SpreadDamage + Damage: 6800 EnslaveInfantry: Range: 7c0 - ReloadDelay: 25 + ReloadDelay: 40 Projectile: InstantHit ValidTargets: MindControllable - InvalidTargets: Vehicle, Defense, MindControlImmune + InvalidTargets: Vehicle, Ship, MindControlImmune Warhead@1Dam: TargetDamage Warhead@2Eff: CreateEffect Explosions: idle @@ -64,46 +84,69 @@ EnslaveInfantry: Image: mindcontrol ValidTargets: Ground ValidRelationships: Neutral, Enemy + Warhead@Flash: FlashTarget + Spread: 341 + Color: ff00ff + ValidTargets: Infantry + ValidRelationships: Neutral, Enemy EnslaveVehicle: - Range: 4c0 - ReloadDelay: 100 - Projectile: InstantHit - ValidTargets: MindControllable + Inherits: EnslaveInfantry + Range: 4c512 InvalidTargets: Infantry, MindControlImmune - Warhead@1Dam: TargetDamage - Warhead@2Eff: CreateEffect - Explosions: idle - ExplosionPalette: scrin - Image: mindcontrol - ValidTargets: Ground - ValidRelationships: Neutral, Enemy + Warhead@Flash: FlashTarget + ValidTargets: Vehicle + +DetonateSlave: + Range: 1c0 + ReloadDelay: 1 + Projectile: InstantHit + Warhead@1Dam: HealthPercentageDamage + Spread: 42 + Damage: 300 + ValidTargets: Infantry, Vehicle, Ship, Air, AirSmall + DamageTypes: BulletDeath + Warhead@3Eff: CreateEffect + Explosions: med_explosion + ImpactSounds: kaboom12.aud GunWalkerZap: - Range: 4c512 + Range: 5c0 Report: gunwalker-fire1.aud, gunwalker-fire2.aud ReloadDelay: 30 Burst: 5 BurstDelays: 8 - Projectile: Bullet - Image: scrinzap - Speed: 800 - Palette: scrin - Inaccuracy: 0c64 + Projectile: InstantHit + Blockable: true Warhead@1Dam: SpreadDamage + Spread: 128 Damage: 2450 Versus: None: 100 Wood: 10 Concrete: 10 - Light: 32 - Heavy: 15 + Light: 35 + Heavy: 10 + Brick: 20 DamageTypes: Prone50Percent, TriggerProne, DefaultDeath + +GunwalkerZapVisual: + Inherits: GunWalkerZap + -Report: + -Projectile: + Projectile: Bullet + Image: scrinzap + Speed: 800 + Palette: scrin + -Warhead@1Dam: Warhead@2Eff: CreateEffect Explosions: idle ExplosionPalette: scrin Image: scrinzaphit ValidTargets: Ground, Ship, Air, AirSmall, Trees + Inaccuracy: 128 + ImpactSounds: irocatta.aud, irocattb.aud, irocattc.aud + ImpactSoundChance: 100 Warhead@3EffWater: CreateEffect Explosions: water_piffs ValidTargets: Water, Underwater @@ -112,33 +155,39 @@ GunWalkerZap: GunWalkerZapAA: Inherits: GunWalkerZap Range: 8c512 + -Projectile: Projectile: Bullet - Image: scrinzapup - Speed: 1c448 + Speed: 3c0 Blockable: false - Inaccuracy: 0 ValidTargets: Air, AirSmall Warhead@1Dam: SpreadDamage - Damage: 1500 + Damage: 1800 ValidTargets: Air ValidRelationships: Enemy, Neutral Range: 0, 0c64, 0c256, 3c0 Falloff: 100, 100, 30, 15 - Versus: - Wood: 100 - Concrete: 100 - Light: 100 - Heavy: 100 - Warhead@2Dam: SpreadDamage - Damage: 1500 + Warhead@smallDamage: SpreadDamage + Damage: 1800 ValidTargets: AirSmall - Range: 0, 0c64, 0c256, 4c256 - Falloff: 100, 70, 30, 10 - Versus: - Wood: 100 - Concrete: 100 - Light: 100 - Heavy: 100 + ValidRelationships: Enemy, Neutral + Spread: 128 + Falloff: 100, 50, 14, 0 + +GunWalkerZapAAVisual: + Inherits: GunWalkerZapAA + Projectile: Bullet + Image: scrinzapup + Speed: 1c682 + -Warhead@1Dam: + -Warhead@smallDamage: + Warhead@2Eff: CreateEffect + Explosions: idle + ExplosionPalette: scrin + Image: scrinzaphit + ValidTargets: Ground, Ship, Air, AirSmall, Trees + Inaccuracy: 128 + ImpactSounds: irocataa.aud, irocatab.aud, irocatac.aud, irocatad.aud + ImpactSoundChance: 100 PlasmaDiscs: Range: 5c0 @@ -147,7 +196,8 @@ PlasmaDiscs: ReloadDelay: 75 Burst: 5 BurstDelays: 4 - Projectile: Missile + ValidTargets: Ground, Water, Underwater + Projectile: MissileCA Image: plasdiscsm TrailImage: smokey TrailPalette: scrinplasma @@ -158,53 +208,109 @@ PlasmaDiscs: HorizontalRateOfTurn: 30 RangeLimit: 6c512 LockOnProbability: 50 - LockOnInaccuracy: 0 MinimumLaunchAngle: 80 MaximumLaunchAngle: 112 VerticalRateOfTurn: 60 Warhead@1Dam: SpreadDamage Spread: 341 Damage: 2200 + ValidTargets: Ground, Water, Underwater Versus: None: 30 Wood: 55 Light: 65 Heavy: 100 Concrete: 35 - Brick: 50 - DamageTypes: Prone50Percent, TriggerProne, SmallExplosionDeath + Brick: 75 + DamageTypes: Prone50Percent, TriggerProne, SmallExplosionDeath, FlakVestMitigated Warhead@2Smu: LeaveSmudge SmudgeType: Scorch Warhead@3Eff: CreateEffect Explosions: small_explosion ImpactSounds: seeker-hit1.aud, seeker-hit2.aud +PlasmaDiscs.Hypercharged: + Inherits: PlasmaDiscs + Report: seeker-hyperfire1.aud, seeker-hyperfire2.aud + Burst: 1 + ReloadDelay: 4 + Range: 7c0 + Projectile: MissileCA + RangeLimit: 7c0 + Warhead@1Dam: SpreadDamage + Damage: 1600 + DamageTypes: Prone50Percent, TriggerProne, SmallExplosionDeath, FlakVestMitigated, TankBuster + Versus: + None: 15 + IntruderDiscs: Inherits: PlasmaDiscs -MinRange: Range: 6c0 - ReloadDelay: 100 + ReloadDelay: 70 Burst: 3 - Projectile: Missile + Projectile: MissileCA Inaccuracy: 0c128 LockOnProbability: 33 Warhead@1Dam: SpreadDamage - Damage: 3250 + Damage: 2850 + Spread: 256 Versus: + None: 15 Wood: 100 Light: 65 - Heavy: 85 + Heavy: 90 Concrete: 100 - Brick: 85 + +MarauderDiscs: + Inherits: IntruderDiscs + Burst: 2 + BurstDelays: 5 + Report: mrdr-fire1.aud, mrdr-fire2.aud + Projectile: MissileCA + Image: mrdrdisc + Speed: 550 + LockOnProbability: 100 + RangeLimit: 7c0 + Palette: scrin + MinimumLaunchAngle: 40 + MaximumLaunchAngle: 80 + VerticalRateOfTurn: 90 + Warhead@1Dam: SpreadDamage + Damage: 4100 + Spread: 384 + Versus: + None: 10 + Light: 0 + Heavy: 0 + Warhead@2Dam: HealthPercentageSpreadDamage + Damage: 100 + Spread: 384 + MaxReferenceHp: 60000 + MinReferenceHp: 30000 + Versus: + None: 0 + Wood: 0 + Concrete: 0 + Light: 9 + Heavy: 8 + Warhead@3Eff: CreateEffect + Explosions: large_explosion + +IntruderDiscsBATF: + Inherits: IntruderDiscs + Range: 5c768 + Warhead@1Dam: SpreadDamage + Damage: 2150 DevastatorDiscs: Inherits: PlasmaDiscs Range: 16c0 MinRange: 3c0 - ReloadDelay: 180 + ReloadDelay: 170 Report: devastator-fire1.aud, devastator-fire2.aud, devastator-fire3.aud Burst: 7 - BurstDelays: 4 + BurstDelays: 3 TargetActorCenter: true -Projectile: Projectile: Bullet @@ -213,33 +319,56 @@ DevastatorDiscs: Blockable: false Image: plasdisclg Inaccuracy: 1c768 - Speed: 200 + Speed: 260 LaunchAngle: 50 Warhead@1Dam: SpreadDamage - Damage: 4250 + Spread: 416 + Damage: 4675 Versus: None: 100 - Wood: 80 - Light: 60 - Heavy: 25 - Concrete: 95 - Brick: 90 + Wood: 90 + Light: 65 + Heavy: 20 + Concrete: 100 + Brick: 100 + DamageTypes: Prone50Percent, TriggerProne, SmallExplosionDeath, FlakVestMitigatedMinor, AirToGround Warhead@3Eff: CreateEffect Explosions: large_explosion +DevastatorTorpedo: + Inherits: DevastatorDiscs + Burst: 3 + Report: plasmatorp.aud + BurstDelays: 8 + ReloadDelay: 100 + Projectile: Bullet + Image: plasmatorp3 + Palette: scrin + LaunchAngle: 25 + Inaccuracy: 1c0 + Shadow: true + ShadowColor: 00000033 + Speed: 400 + Warhead@1Dam: SpreadDamage + Damage: 14000 + Spread: 512 + Warhead@4Eff: CreateEffect + Explosions: large_artillery_explosion + ImpactSounds: xplobig4.aud + ^ScrinLaser: ValidTargets: Ground, Water Range: 7c0 ReloadDelay: 85 - Projectile: LaserZap + Projectile: LaserZapCA Duration: 3 Width: 45 - ZOffset: 2048 + ZOffset: 512 SecondaryBeam: true Color: 66ff66FF SecondaryBeamColor: 00AA00CC SecondaryBeamWidth: 65 - SecondaryBeamZOffset: 2047 + SecondaryBeamZOffset: 511 Blockable: true Warhead@1Dam: SpreadDamage Spread: 42 @@ -251,11 +380,12 @@ DevastatorDiscs: Wood: 30 Heavy: 100 Concrete: 90 + Brick: 50 Warhead@2Smu: LeaveSmudge SmudgeType: Scorch-NoFlame InvalidTargets: Vehicle, Structure, Wall, Husk, Trees, Creep Warhead@3Eff: CreateEffect - Explosions: small_explosion_alt1, small_explosion_alt2, small_explosion_alt3 + Explosions: small_explosion, small_explosion_alt1, small_explosion_alt2, small_explosion_alt3 InterloperLaser: Inherits: ^ScrinLaser @@ -265,151 +395,185 @@ InterloperLaser: BurstDelays: 5 Report: interloper-fire1.aud, interloper-fire2.aud Warhead@1Dam: SpreadDamage - Damage: 2100 + Damage: 1900 Versus: - None: 35 - Light: 100 - Wood: 70 - Heavy: 85 - Concrete: 45 + None: 30 + Light: 116 + Wood: 80 + Heavy: 100 + Concrete: 40 ^ScrinPlasmaBeam: Inherits: ^ScrinLaser -Projectile: Projectile: PlasmaBeam - Duration: 2 + Duration: 21 Colors: 7d44ffE6, eb66ffE6, 5763ffE6 InnerLightness: 200 OuterLightness: 115 Radius: 2 - Distortion: 0 - DistortionAnimation: 96 SegmentLength: 0 Blockable: true + RecalculateColors: true + TrackTarget: true + MaxFacingDeviation: 64 DevourerLaser: Inherits: ^ScrinPlasmaBeam - StartBurstReport: devourer-fire1.aud, devourer-fire2.aud - FirstBurstTargetOffset: 0,-360,0 - FollowingBurstTargetOffset: -0,60,0 - Burst: 13 - BurstDelays: 1 + Report: devourer-fire1.aud, devourer-fire2.aud + Range: 7c0 + ReloadDelay: 95 Projectile: PlasmaBeam - LaunchEffectImage: devo - LaunchEffectSequence: muzzle - LaunchEffectPalette: scrin + StartOffset: 0,360,0 + FollowingOffset: 0,-36,0 + ImpactTicks: 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 Warhead@1Dam: SpreadDamage Spread: 341 - Damage: 930 + Damage: 1300 + Versus: + None: 20 + Light: 70 + Wood: 45 + Warhead@antiShip: SpreadDamage + ValidTargets: Water + Damage: 750 DevourerLaserCharged: Inherits: DevourerLaser - StartBurstReport: devourer-cfire1.aud, devourer-cfire2.aud - FirstBurstTargetOffset: 0,-180,0 - FollowingBurstTargetOffset: -0,30,0 + Report: devourer-cfire1.aud, devourer-cfire2.aud Projectile: PlasmaBeam - Duration: 3 Colors: 461fc605, 98177805 InnerLightness: 240 Radius: 4 Distortion: 128 - DistortionAnimation: 16 + DistortionAnimation: 128 SegmentLength: 196 CenterBeamColor: ffffffff CenterBeam: true CenterBeamWidth: 45 + StartOffset: 0,240,0 + FollowingOffset: 0,-24,0 + RecalculateDistortionInterval: 2 Warhead@1Dam: SpreadDamage - Damage: 1150 + Damage: 1750 + Versus: + None: 30 + Light: 85 RiftCannon: Inherits: ^ScrinLaser Report: darkener-fire1.aud, darkener-fire2.aud ReloadDelay: 120 Range: 7c0 - Projectile: LaserZap + Projectile: LaserZapCA Duration: 20 Color: 000000FF Width: 70 SecondaryBeamColor: 00000099 SecondaryBeamWidth: 90 Warhead@1Dam: SpreadDamage - Spread: 512 + Spread: 426 Falloff: 100, 37, 23, 10, 0 Damage: 2500 Versus: None: 15 - Light: 75 + Wood: 45 + Light: 100 + Brick: 75 DamageTypes: BulletDeath - Warhead@2Dam: HealthPercentageDamage - Spread: 512 - Damage: 10 - InvalidTargets: Air, AirSmall + Warhead@2Dam: HealthPercentageSpreadDamage + Spread: 426 + Falloff: 100, 37, 23, 10, 0 + Damage: 100 Versus: - Wood: 10 - None: 60 - Concrete: 60 - Brick: 60 - Light: 120 - Heavy: 110 + Wood: 4 + None: 6 + Concrete: 6 + Brick: 6 + Light: 12 + Heavy: 12 DamageTypes: BulletDeath + Warhead@antiShip: SpreadDamage + ValidTargets: Water + Damage: 4400 Warhead@prone: SpreadDamage Spread: 512 Falloff: 100, 100, 0 Damage: 1 DamageTypes: Prone50Percent, TriggerProne, BulletDeath Warhead@Spawn: SpawnActor - Actors: camera.minirift + Actors: riftminor Range: 1 ForceGround: false - ValidTargets: Ground, Water, Rift + ValidTargets: Ground, Water + ImpactActors: false MiniRift: ReloadDelay: 10 Range: 1c0 - ValidTargets: Ground, Water Projectile: InstantHit Warhead@1Dam: SpreadDamage - Spread: 682 - Damage: 1000 + Spread: 692 + Damage: 840 Falloff: 100, 70, 0 - ValidTargets: Ground, Trees - InvalidTargets: Air, AirSmall, Creep Versus: None: 3 - Wood: 30 - Light: 75 + Wood: 45 + Light: 90 Heavy: 100 - Concrete: 80 - Brick: 25 + Concrete: 95 + Brick: 20 DamageTypes: BulletDeath ValidRelationships: Enemy, Neutral Warhead@2Dam: SpreadDamage - Spread: 682 - Damage: 250 + Spread: 692 + Damage: 168 Falloff: 100, 70, 0 - ValidTargets: Ground, Trees - InvalidTargets: Air, AirSmall, Creep Versus: None: 3 - Wood: 30 - Light: 75 + Wood: 45 + Light: 90 Heavy: 100 - Concrete: 80 - Brick: 25 + Concrete: 95 + Brick: 20 DamageTypes: BulletDeath ValidRelationships: Ally - Warhead@3Slow: GrantExternalCondition + Warhead@3Slow: GrantExternalConditionCA Range: 1c0 Duration: 10 Condition: slowed - ValidTargets: Vehicle, Cyborg - Warhead@4Slow: GrantExternalCondition + ValidTargets: Vehicle, Ship, Cyborg + Warhead@4Slow: GrantExternalConditionCA Range: 2c0 Duration: 10 Condition: slowed - ValidTargets: Vehicle + ValidTargets: Vehicle, Ship ValidRelationships: Enemy, Neutral +CyberscrinLaser: + Inherits: DevourerLaser + Report: cscr-fire1.aud + ReloadDelay: 50 + Range: 5c512 + Projectile: PlasmaBeam + Colors: ff0000E6, ff6600E6 + Radius: 1 + CenterBeamColor: ff0000ff + CenterBeam: true + CenterBeamWidth: 45 + Duration: 17 + StartOffset: 0,288,0 + FollowingOffset: 0,-36,0 + ImpactTicks: 0, 2, 4, 6, 8, 10, 12, 14, 16 + Warhead@1Dam: SpreadDamage + Spread: 256 + Damage: 1000 + Versus: + None: 100 + Heavy: 20 + Light: 70 + Concrete: 30 + CorrupterSpew: StartBurstReport: corrupter-fire1.aud ReloadDelay: 100 @@ -422,29 +586,30 @@ CorrupterSpew: Image: tibspew2 LaunchAngle: 62 Inaccuracy: 682 + Blockable: false Palette: scrin-ignore-lighting-alpha85 TrailPalette: scrin-ignore-lighting-alpha85 Warhead@1Dam: SpreadDamage - DamageTypes: Prone50Percent, TriggerProne, PoisonDeath + DamageTypes: Prone50Percent, TriggerProne, PoisonDeath, FlakVestMitigatedMinor Spread: 288 + Falloff: 100, 45, 20, 7, 0 Damage: 1000 Versus: None: 300 - Wood: 120 - Tree: 120 - Light: 80 + Wood: 125 + Light: 90 Heavy: 30 Concrete: 30 - Brick: 2 + Brick: 5 Warhead@2Smu: LeaveSmudge SmudgeType: Scorch-NoFlame InvalidTargets: Vehicle, Building, Wall Warhead@3Eff: CreateEffect Explosions: idle - ExplosionPalette: scrin + ExplosionPalette: caneon Image: tibexplodesm -CorruptorExplode: +CorrupterExplode: Inherits: UnitExplodeIraqTank Warhead@3Eff_impact: CreateEffect Explosions: med_chem @@ -462,9 +627,16 @@ LeecherExplode: Inherits: UnitExplodeSmall Warhead@3Eff_impact: CreateEffect Explosions: lchr_explode - ExplosionPalette: effect + ExplosionPalette: scrineffect ImpactSounds: vtoxcona.aud, vtoxconb.aud, vtoxconc.aud +LeecherCoalesce: + ValidTargets: Ground, Water + Warhead@3Eff: CreateEffect + Explosions: lchr_coalesce + ExplosionPalette: scrineffect + ImpactSounds: coalesce.aud + RuinerCannon: Inherits: 155mm Report: ruiner-fire1.aud @@ -473,23 +645,27 @@ RuinerCannon: BurstDelays: 15 Range: 10c0 Projectile: Bullet - Speed: 195 + Speed: 185 Image: tibglob Palette: scrin Inaccuracy: 682 Warhead@1Dam: SpreadDamage + Spread: 341 Damage: 5000 Versus: None: 120 - Wood: 90 + Wood: 100 Concrete: 80 - Light: 80 + Light: 90 Heavy: 45 - DamageTypes: Prone50Percent, TriggerProne, RadiationDeath + Brick: 20 + DamageTypes: Prone50Percent, TriggerProne, RadiationDeath, FlakVestMitigatedMinor + Warhead@2Smu: LeaveSmudge + SmudgeType: Scorch-NoFlame Warhead@3Eff: CreateEffect ImpactSounds: ruiner-hit1.aud Explosions: idle - ExplosionPalette: scrin + ExplosionPalette: caneon Image: tibexplode RuinerCannonCharged: @@ -511,99 +687,78 @@ RuinerCannonCharged: TripodLaser: Inherits: ^ScrinPlasmaBeam - Range: 6c0 - StartBurstReport: tripod-fire1.aud, tripod-fire2.aud, tripod-fire3.aud - FirstBurstTargetOffset: -150,300,0 - FollowingBurstTargetOffset: 50,-100,0 - ReloadDelay: 60 - Burst: 7 - BurstDelays: 1 + Range: 5c768 + Report: tripod-fire1.aud, tripod-fire2.aud, tripod-fire3.aud + ReloadDelay: 65 Projectile: PlasmaBeam + Duration: 7 Colors: 7d44ffE6, eb66ffE6, 5763ffE6 + Blockable: false + StartOffset: -150,300,0 + FollowingOffset: 50,-100,0 + ImpactTicks: 0, 1, 2, 3, 4, 5, 6 + MaxFacingDeviation: 128 Warhead@1Dam: SpreadDamage Spread: 341 - Damage: 900 + Damage: 925 Versus: - None: 95 + None: 85 Light: 70 - Wood: 58 + Wood: 65 Heavy: 105 - Concrete: 45 + Concrete: 60 ReaperLaser: Inherits: TripodLaser - ReloadDelay: 50 - StartBurstReport: rtripod-fire1.aud, rtripod-fire2.aud, rtripod-fire3.aud + ReloadDelay: 55 + Report: rtpd-fire1.aud, rtpd-fire2.aud, rtpd-fire3.aud Projectile: PlasmaBeam - Radius: 2 InnerLightness: 170 OuterLightness: 130 - Colors: 006600EE, 008800EE + Colors: 338800EE, 008800EE CenterBeam: true CenterBeamWidth: 45 CenterBeamColor: eeffeeff ReaperLaserCharged: Inherits: ReaperLaser - StartBurstReport: rtripod-cfire1.aud, rtripod-cfire2.aud - FirstBurstTargetOffset: -60,120,0 - FollowingBurstTargetOffset: 20,-40,0 + Report: rtpd-cfire1.aud, rtpd-cfire2.aud Projectile: PlasmaBeam - Colors: 00660005, 00880005 - Duration: 3 + Colors: 33880005, 00880005 InnerLightness: 170 OuterLightness: 140 Radius: 4 Distortion: 128 - DistortionAnimation: 16 + DistortionAnimation: 128 SegmentLength: 196 + RecalculateDistortionInterval: 2 Warhead@1Dam: SpreadDamage Damage: 1080 TripodLaserReversed: Inherits: TripodLaser - -StartBurstReport: - FirstBurstTargetOffset: -150,-300,0 - FollowingBurstTargetOffset: 50,100,0 + Projectile: PlasmaBeam + StartOffset: -150,-300,0 + FollowingOffset: 50,100,0 ReaperLaserReversed: Inherits: ReaperLaser - -StartBurstReport: - FirstBurstTargetOffset: -150,-300,0 - FollowingBurstTargetOffset: 50,100,0 + Projectile: PlasmaBeam + StartOffset: -150,-300,0 + FollowingOffset: 50,100,0 ReaperLaserChargedReversed: Inherits: ReaperLaserCharged - -StartBurstReport: - FirstBurstTargetOffset: -60,-120,0 - FollowingBurstTargetOffset: 20,40,0 - -TripodLaserSound: - ReloadDelay: 66 - Range: 6c0 - ValidTargets: Ground, Water - Projectile: InstantHit - Report: tripod-fire1.aud, tripod-fire2.aud, tripod-fire3.aud - Warhead@1Dam: SpreadDamage - Damage: 1 - -ReaperLaserSound: - Inherits: TripodLaserSound - ReloadDelay: 56 - Report: rtripod-fire1.aud, rtripod-fire2.aud, rtripod-fire3.aud - Range: 5c0 - -ReaperLaserChargedSound: - Inherits: ReaperLaserSound - Report: rtripod-cfire1.aud, rtripod-cfire2.aud + Projectile: PlasmaBeam + StartOffset: -150,-300,0 + FollowingOffset: 50,100,0 StormriderZap: - Range: 6c0 + Range: 5c768 Report: stormrider-fire1.aud, stormrider-fire2.aud, stormrider-fire3.aud ReloadDelay: 70 Burst: 5 BurstDelays: 4 - ValidTargets: Ground, Water, Underwater Projectile: Bullet Image: scrinzapdown Inaccuracy: 42 @@ -611,29 +766,27 @@ StormriderZap: Palette: scrin Blockable: false Warhead@1Dam: SpreadDamage - ValidTargets: Ground, Water, Underwater - Spread: 128 + Spread: 256 Damage: 4800 Versus: - None: 100 - Wood: 35 + None: 105 + Wood: 50 Concrete: 30 - Light: 65 - Heavy: 20 - DamageTypes: Prone50Percent, TriggerProne, FireDeath - Warhead@2Dam: SpreadDamage - ValidTargets: Water - Spread: 128 - Damage: 1000 - DamageTypes: Prone50Percent, TriggerProne, FireDeath + Light: 55 + Heavy: 40 + Brick: 20 + DamageTypes: Prone50Percent, TriggerProne, FireDeath, AirToGround Warhead@2Smu: LeaveSmudge - SmudgeType: Scorch + SmudgeType: Scorch-NoFlame InvalidTargets: Structure, Wall Warhead@3Eff: CreateEffect Explosions: idle ExplosionPalette: scrin Image: scrinzaphit ValidTargets: Ground, Ship, Air, AirSmall, Trees + Inaccuracy: 128 + ImpactSounds: irocatta.aud, irocattb.aud, irocattc.aud + ImpactSoundChance: 100 Warhead@4EffWater: CreateEffect Explosions: water_piffs ValidTargets: Water, Underwater @@ -648,32 +801,67 @@ StormRiderZapAA: ValidTargets: Air, AirSmall Warhead@1Dam: SpreadDamage Damage: 1800 - Range: 0, 0c64, 0c256, 1c0 + Range: 0, 0c64, 0c256, 1c768 Falloff: 100, 100, 30, 15 ValidTargets: Air ValidRelationships: Enemy, Neutral - Versus: - Wood: 100 - Concrete: 100 - Light: 100 - Heavy: 100 - Warhead@2Dam: SpreadDamage + DamageTypes: Prone50Percent, TriggerProne, FireDeath + Warhead@smallDamage: SpreadDamage Damage: 1800 - Range: 0, 0c64 - Falloff: 100, 30 + Spread: 341 + Falloff: 100, 50, 14, 0 ValidTargets: AirSmall + ValidRelationships: Enemy, Neutral + -Warhead@2Smu: + Warhead@3Eff: CreateEffect + ImpactSounds: irocataa.aud, irocatab.aud, irocatac.aud, irocatad.aud + +TormentorZap: + ReloadDelay: 70 + Burst: 6 + BurstDelays: 0, 4, 0, 4, 0 + ValidTargets: Ground, Water + Range: 7c0 + Report: torm-fire1.aud, torm-fire2.aud + Projectile: LaserZapCA + Width: 56 + HitAnim: laserfire + Color: 954fffAA + ZOffset: 512 + SecondaryBeam: true + SecondaryBeamWidth: 90 + SecondaryBeamZOffset: 511 + SecondaryBeamColor: 7d00fe30 + Duration: 3 + Warhead@1Dam: SpreadDamage + Spread: 42 + Damage: 2300 + DamageTypes: Prone50Percent, TriggerProne, FireDeath, TankBuster, AirToGround Versus: - Wood: 100 - Concrete: 100 - Light: 100 + None: 20 + Light: 65 + Wood: 30 Heavy: 100 + Concrete: 95 + Brick: 50 + Warhead@2Smu: LeaveSmudge + SmudgeType: Scorch-NoFlame + InvalidTargets: Vehicle, Structure, Wall, Husk, Trees, Creep + +TormentorZapAA: + Inherits: TormentorZap + Range: 6c0 + ValidTargets: Air, AirSmall + Warhead@1Dam: SpreadDamage + Damage: 1100 + ValidTargets: Air, AirSmall -Warhead@2Smu: EnervatorBolts: Inherits: ^AntiGroundMissile Report: enervator-fire1.aud - ReloadDelay: 45 - Range: 5c0 + ReloadDelay: 50 + Range: 6c0 TargetActorCenter: true Projectile: MissileCA Speed: 341 @@ -681,27 +869,26 @@ EnervatorBolts: Palette: scrin Inaccuracy: 128 ContrailLength: 20 - ContrailColor: FF00FF77 - ContrailWidth: 32 - Jammable: true + ContrailStartColor: FF00FF77 + ContrailStartColorAlpha: 119 + ContrailStartWidth: 32 + Jammable: false LockOnProbability: 100 - LockOnInaccuracy: 64 RangeLimit: 8c0 TrailImage: smokey TrailPalette: scrinplasma -PointDefenseType: Warhead@1Dam: SpreadDamage Spread: 128 - Damage: 9250 - ValidTargets: Ground, Water + Damage: 13000 Versus: None: 30 - Wood: 55 - Light: 70 + Wood: 30 + Light: 80 Heavy: 100 - Concrete: 120 - DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath - Warhead@2Sup: GrantExternalCondition + Concrete: 100 + DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath, TankBuster, AirToGround + Warhead@2Sup: GrantExternalConditionCA Range: 0c768 Duration: 75 Condition: suppression @@ -714,31 +901,43 @@ EnervatorBolts: EnervatorBoltsAA: Inherits: EnervatorBolts + Range: 5c0 ValidTargets: Air, AirSmall Projectile: MissileCA CloseEnough: 341 + RangeLimit: 13c0 + AllowSnapping: true Warhead@1Dam: SpreadDamage - ValidTargets: Air, AirSmall + ValidTargets: Air + Range: 0, 0c64, 0c256, 3c0 + Falloff: 100, 100, 30, 15 ValidRelationships: Enemy, Neutral Damage: 6000 - Versus: - None: 100 - Wood: 100 - Light: 100 - Concrete: 100 - Brick: 100 - Warhead@2Sup: GrantExternalCondition + DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath + Warhead@smallDamage: SpreadDamage + Damage: 6000 + Spread: 341 + Falloff: 100, 50, 14, 0 + ValidTargets: AirSmall + ValidRelationships: Enemy, Neutral + Warhead@2Sup: GrantExternalConditionCA ValidTargets: Air, AirSmall InvaderLauncher: - ReloadDelay: 10 - Burst: 4 - BurstDelays: 5 - Range: 10c0 + ReloadDelay: 5 + Range: 8c0 ValidTargets: Air, AirSmall, Ground, Water Projectile: InstantHit Warhead@1Dam: TargetDamage ValidTargets: Air, AirSmall, Ground, Water + Damage: 5000 + Versus: + None: 0 + Wood: 0 + Concrete: 0 + Light: 0 + Heavy: 0 + Brick: 0 InvaderZap: Range: 5c0 @@ -752,15 +951,22 @@ InvaderZap: Palette: scrin Blockable: false Warhead@1Dam: SpreadDamage - Spread: 341 - Damage: 750 + Spread: 448 + Damage: 1000 + InvalidTargets: Infantry Versus: None: 60 - Wood: 10 + Wood: 30 Concrete: 15 - Light: 70 + Light: 80 Heavy: 100 - DamageTypes: Prone50Percent, TriggerProne, FireDeath + Brick: 20 + DamageTypes: FireDeath, AirToGround + Warhead@2Dam: SpreadDamage + Spread: 128 + ValidTargets: Infantry + Damage: 600 + DamageTypes: Prone50Percent, TriggerProne, FireDeath, AirToGround Warhead@2Eff: CreateEffect Explosions: idle ExplosionPalette: scrin @@ -776,48 +982,47 @@ InvaderZapAA: Inherits: InvaderZap Projectile: Bullet Image: scrinzap + Speed: 1c768 ValidTargets: Air, AirSmall Warhead@1Dam: SpreadDamage - Damage: 160 + Damage: 235 Range: 0, 0c64, 0c256, 1c0 Falloff: 100, 100, 30, 15 ValidTargets: Air ValidRelationships: Enemy, Neutral - Versus: - Light: 100 - Concrete: 100 - Wood: 100 - None: 100 - Warhead@2Dam: SpreadDamage - Damage: 160 - Range: 0, 0c64 - Falloff: 100, 30 + DamageTypes: Prone50Percent, TriggerProne, FireDeath + -Warhead@2Dam: + Warhead@smallDamage: SpreadDamage + Damage: 235 + Spread: 341 + Falloff: 100, 50, 14, 0 ValidTargets: AirSmall - Versus: - Light: 100 - Concrete: 100 - Wood: 100 - None: 100 + ValidRelationships: Enemy, Neutral PlasmaTurretGun: Range: 6c0 StartBurstReport: plasma-fire1.aud - ReloadDelay: 15 + ReloadDelay: 14 Burst: 2 BurstDelays: 4 Projectile: InstantHit - Inaccuracy: 0c64 Blockable: true Warhead@1Dam: SpreadDamage Spread: 341 - Falloff: 100, 45, 20, 7, 0 + Falloff: 100, 47, 8, 0 Damage: 2100 Versus: - None: 100 - Wood: 25 - Concrete: 32 - Light: 50 - Heavy: 10 + None: 85 + Wood: 50 + Concrete: 30 + Light: 55 + Heavy: 35 + Brick: 20 + DamageTypes: Prone50Percent, TriggerProne, DefaultDeath + Warhead@2Dam: HealthPercentageDamage + Spread: 42 + Damage: 10 + ValidTargets: Infantry DamageTypes: Prone50Percent, TriggerProne, DefaultDeath Warhead@2Eff: CreateEffect Explosions: idle @@ -836,18 +1041,19 @@ StormColumnZap: Range: 7c511 StartBurstReport: stormcolumn-fire1.aud, stormcolumn-fire2.aud Projectile: ElectricBolt - Colors: 6042f5E6,B961FDE6,B5A3E8E6,6D4AD2E6,B289DCE6,FFFFFFE6 + Colors: 6042f5E6, B961FDE6, B5A3E8E6, 6D4AD2E6, B289DCE6, FFFFFFE6 Duration: 6 Width: 18 Angle: 45 Distortion: 96 - ZOffset: 1023 + DistortionAnimation: 96 + ZOffset: 512 Warhead@1Dam: SpreadDamage Damage: 1600 Versus: None: 55 Wood: 60 - Concrete: 100 + Concrete: 90 Light: 80 Heavy: 95 DamageTypes: Prone50Percent, TriggerProne, ElectricityDeath @@ -858,194 +1064,466 @@ StormColumnZap: Explosions: 1, 3 Image: fire -StormColumnCloudZap: +IonCloudZap: Inherits: StormColumnZap - ReloadDelay: 150 + ReloadDelay: 250 Burst: 1 ValidTargets: Ground, Water - InvalidTargets: StormBoost + Projectile: ElectricBolt + Colors: B961FDB6, CC00DDB6, 6D4AD2B6, ECBAF9B6, CC61FDB6, FFFFFFB6 + Distortion: 160 + DistortionAnimation: 160 + Duration: 10 Warhead@1Dam: SpreadDamage - Damage: 9900 + Damage: 4000 + Spread: 512 + ValidRelationships: Enemy, Neutral + +IonCloudMinorZap: + Inherits: IonCloudZap + Range: 5c512 + Warhead@1Dam: SpreadDamage + Damage: 2500 + +IonCloudChargeSource: + ReloadDelay: 250 + Range: 0c512 + Projectile: InstantHit + Warhead@Charge: FireShrapnel + Weapon: IonCloudChargeZap + Amount: 1 + AimChance: 100 + ThrowWithoutTarget: false + AimTargetStances: Ally + ValidTargets: Ground, Water, Air -StormColumnCloudCharge: +IonCloudChargeZap: Inherits: StormColumnZap - ValidTargets: StormBoost Burst: 1 ReloadDelay: 250 Range: 3c768 + ValidTargets: StormBoost -StartBurstReport: + Report: stormcrawler-fire1.aud, stormcrawler-fire2.aud + Projectile: ElectricBolt + Colors: 6042f596, B961FD96, B5A3E896, 6D4AD296, FFFFFF96 + Distortion: 160 + DistortionAnimation: 160 -Warhead@1Dam: + -Warhead@2Smu: -Warhead@3Eff: - Warhead@highlight: GrantExternalCondition - Range: 0c511 - Duration: 2 - Condition: highlight - ValidTargets: StormBoost - Warhead@Charged: GrantExternalCondition - Range: 0c511 - Duration: 100 - Condition: charged - ValidTargets: StormBoost + Warhead@Flash: FlashTarget + Spread: 0c511 + Color: ffffff + ValidTargets: Ground, Water, Air StormcrawlerZap: Inherits: StormColumnZap - ReloadDelay: 35 - Burst: 5 + ReloadDelay: 50 + Burst: 6 BurstDelays: 3 Range: 4c512 - StartBurstReport: stormcrawler-fire1.aud, stormcrawler-fire2.aud Warhead@1Dam: SpreadDamage Spread: 42 - Damage: 1500 + Damage: 2800 Versus: - None: 30 - Light: 50 - Heavy: 55 + None: 15 + Wood: 70 + Light: 32 + Heavy: 28 + Concrete: 100 -StormcrawlerCharge: - ReloadDelay: 150 - Range: 4c512 - Report: stormcrawler-charge.aud - ValidTargets: Stormcrawler +GravityStabilizerZap: + Inherits: StormColumnZap + -StartBurstReport: + Range: 1c512 + ReloadDelay: 25 + Burst: 6 + BurstDelays: 6 + -Warhead@1Dam: + -Warhead@2Smu: + -Warhead@3Eff: + ValidTargets: Resupplying + FirstBurstTargetOffset: 0,0,192 Projectile: ElectricBolt - Colors: 8A2BFF88,B961FD88,B5A3E888 - Duration: 5 - Angle: 90 - Warhead@1Dam: SpreadDamage - ValidTargets: Stormcrawler - Damage: 1 - Versus: - Heavy: 0 - ValidRelationships: Ally + Colors: FFFFFF88, FFFFFF44 + PlayerColorZaps: 2 + PlayerColorZapAlpha: 100, 180 + Duration: 6 + Width: 32 + Warhead@Flash: FlashTarget + Spread: 0c511 + Color: ffffff + ValidTargets: Resupplying -StormcrawlerChargeSource: - ReloadDelay: 150 - Range: 0c512 - ValidTargets: Stormcrawler - Projectile: InstantHit - Warhead@1Dam: SpreadDamage - ValidTargets: Stormcrawler - Damage: 1 - Versus: - Heavy: 0 - ValidRelationships: Ally - Warhead@Charge: FireShrapnel - Weapon: StormcrawlerCharge - Amount: 1 +MothershipCharge: + ReloadDelay: 10 + Warhead@Zaps: FireShrapnel + ValidTargets: Ground, Water, Air + Weapon: MothershipChargeZap + Amount: 3 AimChance: 100 + AllowDirectHit: true ThrowWithoutTarget: false + AimTargetStances: Ally + ImpactSounds: mshp-stmrcharge.aud + +MothershipChargeZap: + Inherits: GravityStabilizerZap + ValidTargets: MothershipRearmable + Range: 7c0 + Projectile: ElectricBolt + TrackTarget: true + Colors: FFFFFF66, FFFFFF33 + Duration: 3 + Distortion: 160 + DistortionAnimation: 160 + Warhead@Flash: FlashTarget + ValidTargets: MothershipRearmable + Warhead@rearm: GrantExternalConditionCA + Range: 0c511 + Duration: 80 + Condition: mshp-rearm + ValidTargets: MothershipRearmable ShardLauncher: StartBurstReport: shard-fire1.aud ReloadDelay: 25 Burst: 5 BurstDelays: 4 - Range: 7c512 + Range: 8c0 ValidTargets: Air, AirSmall, ICBM - Projectile: Missile - Speed: 366 + Projectile: MissileCA + Speed: 448 + CloseEnough: 448 Palette: scrin - ContrailWidth: 0c48 + ContrailStartWidth: 0c48 ContrailLength: 12 - ContrailColor: 00FF00AA + ContrailStartColor: 00FF00 + ContrailStartColorAlpha: 170 Jammable: true Blockable: false Inaccuracy: 0 Image: shard HorizontalRateOfTurn: 140 - RangeLimit: 9c0 + RangeLimit: 10c512 + AllowSnapping: true Warhead@1Dam: SpreadDamage - ValidTargets: Air, ICBM + ValidTargets: Air ValidRelationships: Enemy, Neutral Range: 0, 0c64, 0c256, 3c768 Falloff: 100, 100, 30, 15 Damage: 2650 - Versus: - None: 100 - Wood: 100 - Concrete: 100 - Light: 100 - Heavy: 100 DamageTypes: Prone50Percent, TriggerProne, BulletDeath - Warhead@2Dam: SpreadDamage - ValidTargets: AirSmall - Range: 0, 0c64 - Falloff: 100, 30 + Warhead@smallDamage: SpreadDamage + ValidTargets: AirSmall, ICBM + ValidRelationships: Enemy, Neutral + Range: 0, 0c64, 0c256, 1c768 + Falloff: 100, 70, 30, 10 Damage: 2650 - Versus: - None: 100 - Wood: 100 - Concrete: 100 - Light: 100 - Heavy: 100 DamageTypes: Prone50Percent, TriggerProne, BulletDeath Warhead@3Eff: CreateEffect Explosions: idle, idle2, idle3, idle4 ExplosionPalette: scrin Image: shardhit ValidTargets: Air, AirSmall, ICBM, Ground, Water, Trees + Inaccuracy: 171 + ImpactSounds: gshardhit1.aud, gshardhit2.aud + ImpactSoundChance: 100 RavagerShards: Inherits: ShardLauncher StartBurstReport: ravager-fire1.aud ValidTargets: Ground, Water, Trees - ReloadDelay: 40 + ReloadDelay: 45 BurstDelays: 5 - Range: 5c512 - Projectile: Missile - Speed: 213 + Range: 5c0 + Projectile: MissileCA + Speed: 265 + CloseEnough: 265 ContrailLength: 9 - ContrailColor: 00FF0044 + ContrailStartColor: 00FF00 + ContrailStartColorAlpha: 68 Inaccuracy: 128 - RangeLimit: 7c512 + RangeLimit: 7c0 Jammable: false + AllowSnapping: false + -Warhead@smallDamage: Warhead@1Dam: SpreadDamage ValidTargets: Ground, Water -ValidRelationships: -Range: -Falloff: - Spread: 256 - Damage: 2200 + Spread: 224 + Damage: 2000 Versus: - Wood: 30 - Light: 40 + Wood: 15 + Light: 65 Heavy: 10 - Concrete: 35 - Brick: 15 + Concrete: 15 + Brick: 5 + Warhead@3Eff: CreateEffect + ImpactSounds: gshardhitsm1.aud, gshardhitsm2.aud -LaceratorShards: +EvisceratorShards: Inherits: RavagerShards - Range: 5c0 - StartBurstReport: lacerator-fire1.aud, lacerator-fire2.aud - ReloadDelay: 90 - Projectile: Missile - Image: bshard - ContrailLength: 9 - ContrailWidth: 0c32 - ContrailColor: 4455FFAA + Range: 4c0 + ReloadDelay: 30 + BurstDelays: 4 + Projectile: MissileCA + Speed: 350 + Warhead@1Dam: SpreadDamage + Damage: 2200 + +EvisceratorShardsCharged: + Inherits: EvisceratorShards + ReloadDelay: 26 + StartBurstReport: shard-fire1.aud + Projectile: MissileCA + ContrailStartColorAlpha: 128 + Warhead@3Eff: CreateEffect + ImpactSounds: firebl3.aud + Explosions: idle + ExplosionPalette: caneon + Image: evischargedhit + Warhead@Arc: FireShrapnel + Weapon: EvisceratorArcShard + Amount: 1 + AimChance: 100 + ThrowWithoutTarget: true + AimTargetStances: Enemy, Neutral + +EvisceratorArcShard: + Inherits: EvisceratorShards + -Burst: + Range: 2c0 + Projectile: MissileCA + MinimumLaunchAngle: 80 + MaximumLaunchAngle: 80 + Inaccuracy: 32 + HorizontalRateOfTurn: 30 + VerticalRateOfTurn: 40 + Warhead@1Dam: SpreadDamage + Spread: 128 + Damage: 1400 + ValidRelationships: Enemy, Neutral + +StalkerShards: + Inherits: RavagerShards + StartBurstReport: stlk-fire1.aud, stlk-fire2.aud + Burst: 2 + BurstDelays: 4 + ReloadDelay: 40 + Projectile: MissileCA + Speed: 350 + Image: scrinzap + ContrailStartColor: 954fff + Warhead@1Dam: SpreadDamage + Spread: 192 + Damage: 7500 + Versus: + Wood: 15 + Concrete: 10 + Light: 40 + Heavy: 8 + ValidRelationships: Enemy, Neutral + Warhead@3Eff: CreateEffect + Explosions: idle + ExplosionPalette: scrin + Image: scrinzaphit + ValidTargets: Ground, Ship, Trees + Inaccuracy: 128 + -ImpactSounds: + Warhead@3EffWater: CreateEffect + Explosions: water_piffs + ValidTargets: Water, Underwater + InvalidTargets: Ship, Structure, Bridge + +ShardWalkerShards: + Inherits: RavagerShards + ReloadDelay: 35 + StartBurstReport: shard-fire1.aud + Projectile: MissileCA + Speed: 448 + ContrailStartColor: 00FF0066 + ContrailStartColorAlpha: 102 + MinimumLaunchAngle: 80 + MaximumLaunchAngle: 112 + Inaccuracy: 0 + AllowSnapping: true + Warhead@1Dam: SpreadDamage + Spread: 128 + Damage: 2650 + Versus: + None: 120 + Wood: 10 + Light: 32 + Heavy: 10 + Concrete: 10 + +ShardWalkerShardsAA: + Inherits: ShardLauncher + ReloadDelay: 35 + BurstDelays: 5 + Range: 8c512 + Projectile: MissileCA + ContrailStartColor: 00FF0066 + ContrailStartColorAlpha: 102 + Warhead@1Dam: SpreadDamage + Damage: 1800 + Range: 0, 0c64, 0c256, 3c0 + Falloff: 100, 100, 30, 15 + Warhead@smallDamage: SpreadDamage + Damage: 1800 + -Range: + Spread: 128 + Falloff: 100, 50, 14, 0 + +LaceratorShards: + Inherits: RavagerShards + Range: 5c0 + StartBurstReport: lacerator-fire1.aud, lacerator-fire2.aud + ReloadDelay: 100 + ValidTargets: Ground, Water, Underwater + Projectile: MissileCA + Speed: 448 + Image: bshard + ContrailLength: 9 + ContrailStartWidth: 0c32 + ContrailStartColor: 4455FF + ContrailStartColorAlpha: 170 Jammable: true Warhead@1Dam: SpreadDamage - Damage: 3200 + Damage: 2900 Spread: 128 + ValidTargets: Ground, Water, Underwater Versus: None: 15 Wood: 55 Light: 60 Heavy: 100 Concrete: 35 - Brick: 25 + Brick: 50 Warhead@3Eff: CreateEffect Image: bshardhit +LaceratorShards.Hypercharged: + Inherits: LaceratorShards + Burst: 1 + ReloadDelay: 5 + -StartBurstReport: + Range: 7c0 + Report: lacerator-hyperfire1.aud, lacerator-hyperfire2.aud + Projectile: MissileCA + ContrailStartWidth: 0c48 + ContrailStartColor: 7e00ff + Warhead@1Dam: SpreadDamage + Damage: 2000 + DamageTypes: Prone50Percent, TriggerProne, BulletDeath, TankBuster + Versus: + None: 10 + +ImpalerSpike: + Range: 7c0 + ReloadDelay: 125 + Burst: 2 + BurstDelays: 25 + Report: impl-fire1.aud + Projectile: InstantHit + Blockable: false + Warhead@1Dam: SpreadDamage + Damage: 12500 + Spread: 128 + DamageTypes: Prone50Percent, TriggerProne, BulletDeath + Versus: + Heavy: 15 + Light: 80 + Wood: 30 + Concrete: 25 + Brick: 15 + Warhead@3Eff: CreateEffect + Explosions: piff + ValidTargets: Ground, Water, Trees + Inaccuracy: 64 + ImpactSounds: gshardhit1.aud, gshardhit2.aud + ImpactSoundChance: 100 + Warhead@Slow: GrantExternalConditionCA + Range: 0c256 + Duration: 25 + Condition: slowed + ValidTargets: Vehicle, Infantry + +ImpalerTracer: + Inherits: ImpalerSpike + -Report: + Projectile: Bullet + Speed: 1400 + Blockable: false + Image: DRAGON + Shadow: True + ContrailLength: 11 + ContrailStartWidth: 0c48 + ContrailStartColor: ffffff + ContrailStartColorAlpha: 64 + -Warhead@1Dam: + -Warhead@3Eff: + -Warhead@Slow: + +ImpalerSpikePassenger: + Inherits: ImpalerSpike + -Projectile: + Projectile: MissileCA + Speed: 800 + Blockable: false + Image: DRAGON + Shadow: True + HorizontalRateOfTurn: 20 + RangeLimit: 8c0 + ContrailLength: 11 + ContrailStartWidth: 0c48 + ContrailStartColor: ffffff + ContrailStartColorAlpha: 64 + AllowSnapping: true + +WatcherDart: + Range: 6c0 + ReloadDelay: 100 + Report: wchr-fire1.aud + ValidTargets: WatcherParasiteAttachable + Projectile: MissileCA + Speed: 750 + Blockable: false + Image: wchrdart + Shadow: True + HorizontalRateOfTurn: 20 + RangeLimit: 8c0 + ContrailLength: 11 + ContrailStartWidth: 0c48 + ContrailStartColor: 000000 + ContrailStartColorAlpha: 128 + AllowSnapping: true + Warhead@Attach: AttachActor + Range: 341 + Actor: watcher.parasite + AttachSounds: wchr-hit1.aud + MissSounds: dud1.aud + ValidTargets: WatcherParasiteAttachable + ValidRelationships: Enemy, Neutral + Warhead@Flash: FlashTarget + Spread: 341 + Color: ffffff + ValidTargets: WatcherParasiteAttachable + RiftInit: ValidTargets: Ground, Water Projectile: InstantExplode ReloadDelay: 1 Warhead@Spawn: SpawnActor - Actors: camera.rift + Actors: rift Range: 1 ForceGround: false ValidTargets: Ground, Water + ImpactActors: false Rift: ReloadDelay: 5 @@ -1055,58 +1533,49 @@ Rift: Warhead@1Dam: SpreadDamage Spread: 1c0 Damage: 2300 - Falloff: 100, 95, 50, 45, 40, 30, 15, 10, 5 + Falloff: 100, 95, 50, 40, 35, 30, 15, 10, 5 ValidTargets: Ground, Trees, Underwater, Air, AirSmall Versus: None: 30 - Wood: 100 + Wood: 115 Light: 70 Heavy: 90 Concrete: 120 - Brick: 25 + Brick: 75 DamageTypes: Prone50Percent, TriggerProne, BulletDeath SuppressionField: Projectile: InstantExplode ReloadDelay: 1 ValidTargets: Ground, Air, AirSmall, Ship - Warhead@1Dam: SpreadDamage - Spread: 1c0 - Damage: 1 - Warhead@2sup: GrantExternalCondition - Range: 3c512 + # extra suppression range vs aircraft + Warhead@Suppression: GrantExternalConditionCA + Range: 4c512 Duration: 600 Condition: suppression - ValidTargets: Ground, Air, AirSmall, Ship + ValidTargets: Air, AirSmall BuzzerSpawner: ReloadDelay: 1 Projectile: InstantExplode - Warhead@1Dam: SpreadDamage + Warhead@1Dam: HealthPercentageDamage Spread: 341 - Damage: 6000 + Damage: 75 Versus: None: 100 - Wood: 10 - Light: 100 - Heavy: 30 - Concrete: 40 + Wood: 1 + Light: 30 + Heavy: 1 + Concrete: 1 Brick: 0 DamageTypes: Prone50Percent, TriggerProne, BulletDeath ValidRelationships: Enemy, Neutral - Warhead@2Dam: SpreadDamage - ValidTargets: Cyborg - Spread: 341 - Damage: 12000 - Versus: - Heavy: 0 - DamageTypes: Prone50Percent, TriggerProne, BulletDeath - ValidRelationships: Enemy, Neutral Warhead@Spawn: SpawnActor Actors: buzz Range: 1 ForceGround: false ValidTargets: Ground, Water + ImpactActors: false BuzzerSpawnerAI: Inherits: BuzzerSpawner @@ -1120,10 +1589,8 @@ BuzzerVortex: Projectile: InstantHit Warhead@1Dam: SpreadDamage Spread: 682 - Falloff: 100, 70, 20, 0 - Damage: 300 - ValidTargets: Ground, Trees - InvalidTargets: Air, AirSmall, Creep + Falloff: 100, 70, 40, 0 + Damage: 150 Versus: None: 100 Wood: 10 @@ -1133,11 +1600,16 @@ BuzzerVortex: Brick: 0 DamageTypes: BulletDeath ValidRelationships: Enemy, Neutral - Warhead@2Dam: SpreadDamage - Spread: 682 - Falloff: 100, 70, 20, 0 - Damage: 600 - ValidTargets: Cyborg + Warhead@2Dam: HealthPercentageDamage + Spread: 1c0 + Damage: 4 + Versus: + None: 100 + Wood: 3 + Light: 30 + Heavy: 3 + Concrete: 3 + Brick: 0 DamageTypes: BulletDeath ValidRelationships: Enemy, Neutral @@ -1149,76 +1621,97 @@ BuzzerTargeting: Warhead@1Dam: SpreadDamage Damage: 1 ValidTargets: Ground, Trees - InvalidTargets: Air, AirSmall DamageTypes: Prone50Percent, TriggerProne, BulletDeath StormSpikeSpawner: ReloadDelay: 1 Projectile: InstantExplode Warhead@spawn: SpawnBuilding - Buildings: scol.temp + Buildings: sspk Range: 3 - ValidTargets: Air, AirSmall, Ground, Water + ValidTargets: Ground, Water, Trees + +IchorSpikeSpawner: + ReloadDelay: 1 + Projectile: InstantExplode + Warhead@spawn: SpawnBuilding + Buildings: ispk + Range: 3 + ValidTargets: Ground, Water, Trees + +ColonySpikeSpawner: + ReloadDelay: 1 + Projectile: InstantExplode + Warhead@spawn: SpawnBuilding + Buildings: cspk + Range: 3 + ValidTargets: Ground, Water, Trees + +VoidSpikeSpawner: + ReloadDelay: 1 + Projectile: InstantExplode + Warhead@spawn: SpawnBuilding + Buildings: vspk + Range: 3 + ValidTargets: Ground, Water, Trees IonSurgeSpawner: ReloadDelay: 1 Projectile: InstantExplode Warhead@Spawn: SpawnActor - Actors: ion.surge + Actors: ionsurge Range: 1 ForceGround: false ValidTargets: Ground, Water + ImpactActors: false IonSurge: ReloadDelay: 20 Range: 1c0 Projectile: InstantHit - Warhead@surge: GrantExternalCondition - Range: 6c0 - Duration: 375 + Warhead@surge: GrantExternalConditionCA + Range: 5c0 + Duration: 300 Condition: ionsurge ValidTargets: IonSurgable ValidRelationships: Ally -WormholeOpener: - Report: darkener-fire1.aud, darkener-fire2.aud - ReloadDelay: 150 - Range: 0c256 - Projectile: InstantHit - Warhead@1Dam: SpreadDamage - Damage: 100000 - ValidTargets: Wormhole +GatewaySpawner: + ReloadDelay: 1 + Projectile: InstantExplode Warhead@Spawn: SpawnActor - Actors: wormhole - Delay: 14 - Range: 2 - ForceGround: true + Actors: rebelgateway + Range: 3 + ForceGround: false + ValidTargets: Ground, Water + ImpactActors: false AvoidActors: true - Warhead@3Eff: CreateEffect - ImpactSounds: wormhole-open.aud MothershipChargeBeam: ReloadDelay: 3 - Range: 0c341 + Range: 0c512 + TargetActorCenter: true + InvalidTargets: Vehicle, Infantry, Ship Projectile: PlasmaBeam ForceVertical: true - Duration: 3 + Duration: 2 Colors: ffffff44 InnerLightness: 200 - OuterLightness: 100 + OuterLightness: 75 Radius: 2 Distortion: 0 DistortionAnimation: 0 SegmentLength: 0 - ZOffset: 2047 - Warhead@1Dum: Dummy + ZOffset: 2048 MothershipBeam: - ReloadDelay: 3 - Range: 0c341 + ReloadDelay: 150 + Range: 0c512 + TargetActorCenter: true + InvalidTargets: Vehicle, Infantry, Ship Projectile: PlasmaBeam ForceVertical: true - Duration: 4 + Duration: 125 Colors: 461fc609, 98177809 InnerLightness: 240 Radius: 7 @@ -1231,28 +1724,60 @@ MothershipBeam: SecondaryCenterBeam: true SecondaryCenterBeamColor: ffffff44 ZOffset: 2048 + RecalculateColors: true + RecalculateDistortionInterval: 3 + ImpactInterval: 5 Warhead@1Dam: SpreadDamage Spread: 512 - Falloff: 100, 50, 25, 15, 0 - Damage: 3000 + Falloff: 100, 75, 56, 42, 31, 23, 17, 13, 10, 7 + Damage: 9000 DamageTypes: Prone50Percent, TriggerProne, FireDeath - Warhead@3Eff: CreateEffect - Explosions: large_explosion - Inaccuracy: 171 + Warhead@5Eff: CreateEffect + Image: mshpshockwave + ExplosionPalette: scrineffect + Explosions: idle1, idle2, idle3, idle4 + Inaccuracy: 512 Warhead@4Eff: CreateEffect - Explosions: large_explosion - Inaccuracy: 1024 + Image: mshpshockwave + Explosions: inner1, inner2, inner3, inner4 + ExplosionPalette: scrineffect Warhead@5Shake: ShakeScreen Duration: 5 Intensity: 1 Multiplier: 0.1,0.1 +MothershipDiscs: + Inherits: DevastatorDiscs + Report: mshp-zap1.aud, mshp-zap2.aud + Range: 7c0 + MinRange: 1c0 + ReloadDelay: 65 + Burst: 6 + BurstDelays: 4 + ValidTargets: Infantry, Vehicle, Ship + Projectile: Bullet + Image: plasmatorp1 + Palette: scrin + LaunchAngle: 0 + Inaccuracy: 0c512 + Shadow: true + ShadowColor: 00000033 + Speed: 280 + Warhead@1Dam: SpreadDamage + Damage: 3750 + Versus: + None: 100 + Wood: 45 + Concrete: 45 + Light: 80 + Heavy: 100 + LeecherBeam: ValidTargets: Ground, Water StartBurstReport: leecher-fire1.aud - Range: 6c0 - ReloadDelay: 40 - Burst: 6 + Range: 5c512 + ReloadDelay: 60 + Burst: 9 BurstDelays: 5 Projectile: PlasmaBeam Duration: 7 @@ -1263,26 +1788,20 @@ LeecherBeam: Distortion: 150 DistortionAnimation: 150 SegmentLength: 350 - ZOffset: 1027 Inaccuracy: 128 Warhead@1Dam: SpreadDamage - Spread: 256 - Damage: 1700 - DamageTypes: Prone50Percent, TriggerProne, AtomizedDeath + Spread: 288 + Falloff: 100, 45, 20, 7, 0 + Damage: 3250 + DamageTypes: Prone50Percent, TriggerProne, AtomizedDeath, FlakVestMitigatedMinor Versus: None: 100 - Light: 45 - Wood: 100 + Light: 50 + Wood: 60 Heavy: 15 - Concrete: 25 - Warhead@ARC: FireShrapnel - Weapon: LeecherArc - AimChance: 100 - Amount: 1 - Delay: 2 - AimTargetStances: Enemy, Neutral - InvalidTargets: Vehicle, Structure - Warhead@DRAIN: GrantExternalCondition + Concrete: 15 + Brick: 5 + Warhead@DRAIN: GrantExternalConditionCA Range: 1c512 Duration: 100 Condition: powerdrain @@ -1290,143 +1809,465 @@ LeecherBeam: Warhead@3Eff: CreateEffect Explosions: idle ExplosionPalette: scrin - Image: leechhit + Image: leechhitlg Inaccuracy: 256 -LeecherArc: +LeecherOrbHeal: + ReloadDelay: 25 + Range: 1c0 + ValidTargets: Ground, Water + Projectile: InstantHit + Warhead@1Dam: SpreadDamage + Spread: 1c768 + Damage: -1650 + Falloff: 100, 100, 0 + ValidTargets: Healable, Repairable + Versus: + None: 50 + Light: 75 + Heavy: 100 + ValidRelationships: Ally + +LeecherOrbHealInit: + ReloadDelay: 1500 + Warhead@1Dam: SpreadDamage + Damage: -5000 + +GreaterCoalescenceSpawner: + ReloadDelay: 1 + Projectile: InstantExplode + Warhead@Spawn: SpawnActor + Actors: grcl + Range: 1 + ForceGround: false + ValidTargets: Ground, Water + ImpactActors: false + +GreaterCoalescence: + ReloadDelay: 5 + Warhead@heal: SpreadDamage + Range: 0, 4c512 + Falloff: 100, 100 + Damage: -600 + ValidTargets: Healable, Repairable + Versus: + None: 40 + Light: 65 + Heavy: 100 + ValidRelationships: Ally + Warhead@zaps: FireShrapnel + Weapon: GreaterCoalescenceZap + Amount: 3 + AimChance: 100 + AllowDirectHit: true + ThrowWithoutTarget: false + AimTargetStances: Enemy, Neutral + +GreaterCoalescenceZap: Inherits: LeecherBeam - Range: 2c0 - -Burst: - ValidTargets: Infantry, Vehicle, Structure + Range: 4c512 + ValidTargets: Infantry, Vehicle, Structure, Ship + Burst: 7 Projectile: PlasmaBeam - Colors: ff000002 + Duration: 6 + Inaccuracy: 0 + Colors: ee000006 Warhead@1Dam: SpreadDamage - Spread: 128 - Damage: 850 - -Warhead@ARC: + Spread: 160 + Damage: 150 + Versus: + None: 100 + Light: 100 + Wood: 50 + Heavy: 100 + Concrete: 50 + DamageTypes: TriggerProne, AtomizedDeath + Warhead@3Eff: CreateEffect + Image: leechhit + Inaccuracy: 128 + Warhead@SLOW: GrantExternalConditionCA + Range: 0c768 + Duration: 30 + Condition: slowed + ValidTargets: Vehicle, Cyborg -FeederBeam: - Inherits: LeecherBeam - -StartBurstReport: - Report: feeder-fire1.aud - Range: 5c0 - ReloadDelay: 25 - -Burst: +TiberiumCoalescence: + Inherits: GreaterCoalescence + ReloadDelay: 8 + -Warhead@heal: + Warhead@zaps: FireShrapnel + Weapon: TiberiumCoalescenceZap + ImpactSounds: grcl-loop1.aud, grcl-loop2.aud + +TiberiumCoalescenceZap: + Inherits: GreaterCoalescenceZap + Range: 4c512 + ValidTargets: Infantry, Vehicle, Structure, Ship, Air, AirSmall Projectile: PlasmaBeam - Colors: 99000008 + Colors: 00660006 + Duration: 9 Warhead@1Dam: SpreadDamage - Damage: 1875 - Spread: 128 + Damage: 800 Versus: - Light: 40 - Wood: 40 + Aircraft: 50 + DamageTypes: TriggerProne, RadiationDeath + ValidTargets: Ground, Water, Air, AirSmall + Warhead@3Eff: CreateEffect + Image: ruin + Explosions: muzzle + ExplosionPalette: scrin + ValidTargets: Ground, Water, Air, AirSmall -Warhead@DRAIN: - -Warhead@ARC: + -Warhead@SLOW: + +VoidSpike: + ReloadDelay: 15 + Projectile: InstantHit + Warhead@1Dam: SpreadDamage + Spread: 8c0 + Damage: 200 + Falloff: 100, 50 + DamageTypes: Prone50Percent, TriggerProne, BulletDeath + ValidRelationships: Enemy, Neutral AtomizerBolts: Report: atomizer-fire1.aud ReloadDelay: 150 - Range: 7c0 - TargetActorCenter: true + Range: 9c0 MinRange: 1c512 - Projectile: Missile - Speed: 160 + Projectile: MissileCA + Speed: 250 Image: atmzbolt Palette: scrin - Inaccuracy: 128 Jammable: true - LockOnProbability: 100 - LockOnInaccuracy: 64 RangeLimit: 12c0 CruiseAltitude: 1c512 TrailImage: atmzbolttrail TrailPalette: scrin - TrailInterval: 1 + TrailSpacing: 200 + Blockable: false + ContrailLength:8 + ContrailStartWidth: 0c48 + ContrailStartColor: ff0000 + ContrailStartColorAlpha: 170 Warhead@1Dam: SpreadDamage - Spread: 128 - Damage: 4200 + Spread: 341 + Damage: 4000 ValidTargets: Ground, Water Versus: - None: 70 - Wood: 70 - Light: 85 + None: 15 + Wood: 30 + Light: 65 Heavy: 100 - Concrete: 100 - DamageTypes: Prone50Percent, TriggerProne, AtomizedDeath - Warhead@2Sup: GrantExternalCondition - Range: 0c768 - Duration: 225 - Condition: atomized - ValidTargets: Vehicle, Ship + Concrete: 90 + DamageTypes: Prone50Percent, AtomizedDeath + Warhead@Arc: FireShrapnel + Weapon: AtomizerArc + TargetClosest: true + Amount: 4 + AimChance: 100 + ThrowWithoutTarget: false + AimTargetStances: Enemy, Neutral + AllowDirectHit: true + Warhead@ArcInfantry: FireShrapnel + Weapon: AtomizerArcInfantry + TargetClosest: true + Amount: 0 + AimChance: 100 + ThrowWithoutTarget: false + AimTargetStances: Enemy, Neutral + AllowDirectHit: true Warhead@3Eff: CreateEffect Explosions: idle ExplosionPalette: scrin Image: atmzbolthit ImpactSounds: atomizer-hit1.aud - Warhead@red: GrantExternalCondition - Range: 0c768 - Duration: 2 - Condition: redhighlight - ValidTargets: Vehicle, Ship -AtomizerBoltsAA: +AtomizerArc: Inherits: AtomizerBolts - ValidTargets: Air, AirSmall - Projectile: Missile - Speed: 225 - Warhead@1Dam: SpreadDamage - ValidTargets: Air, AirSmall + Range: 1c768 + ValidTargets: Vehicle, Ship, Defense + TargetActorCenter: true + -MinRange: + -Report: + -Projectile: + -Warhead@1Dam: + -Warhead@Arc: + -Warhead@ArcInfantry: + Projectile: PlasmaBeam + Duration: 7 + Colors: ee000008 + InnerLightness: 200 + OuterLightness: 100 + Radius: 2 + Distortion: 150 + DistortionAnimation: 150 + SegmentLength: 350 + TrackTarget: true + Warhead@Flash: FlashTarget + Spread: 0c42 + Color: ff0000 + ValidTargets: Vehicle, Ship, Defense, Infantry + Warhead@atomize: GrantExternalConditionCA + Range: 0c42 + Duration: 150 + Condition: atomized + ValidTargets: Vehicle, Ship, Defense, Infantry + Warhead@2Dam: TargetDamage + DamageTypes: Prone50Percent, AtomizedDeath + Damage: 2000 + Delay: 35 Versus: - None: 100 - Wood: 100 - Light: 100 - Concrete: 100 - Brick: 100 - Warhead@2Sup: GrantExternalCondition - ValidTargets: Air, AirSmall - Range: 1c512 - ValidRelationships: Enemy, Neutral + None: 15 + Light: 65 + Concrete: 90 + Warhead@3Dam: TargetDamage + DamageTypes: Prone50Percent, AtomizedDeath + Damage: 2000 + Delay: 70 + Versus: + None: 15 + Light: 65 + Concrete: 90 + Warhead@4Dam: TargetDamage + DamageTypes: Prone50Percent, AtomizedDeath + Damage: 2000 + Delay: 105 + Versus: + None: 15 + Light: 65 + Concrete: 90 + Warhead@5Dam: TargetDamage + DamageTypes: Prone50Percent, AtomizedDeath + Damage: 2000 + Delay: 140 + Versus: + None: 15 + Light: 65 + Concrete: 90 Warhead@3Eff: CreateEffect - ValidTargets: Air, AirSmall - Warhead@red: GrantExternalCondition - ValidTargets: Air, AirSmall + Image: leechhitlg + -ImpactSounds: -FeederTargeting: +AtomizerArcInfantry: + Inherits: AtomizerArc + Range: 0c768 + ValidTargets: Infantry + -Projectile: + -Warhead@3Eff: + Projectile: InstantHit + +BursterTargeting: ValidTargets: Vehicle, Infantry, Structure Range: 1c512 Projectile: InstantHit Warhead@1Dam: TargetDamage -FeederExplode: +BursterExplode: ValidTargets: Ground, Water Warhead@1Dam: SpreadDamage - Spread: 768 - Damage: 8000 - Falloff: 1000, 368, 135, 50, 18, 7, 0 - ValidTargets: Ground, Water - InvalidTargets: Air, Creep, Feeder + Damage: 12000 + Spread: 1c0 + Falloff: 1000, 368, 135, 50, 25, 12, 0 + InvalidTargets: Structure, Burster Versus: - None: 90 - Heavy: 90 - Brick: 10 - AffectsParent: true - DamageTypes: Prone50Percent, TriggerProne, RadiationDeath + None: 35 + DamageTypes: Prone50Percent, TriggerProne, SmallExplosionDeath + Warhead@FF: HealthPercentageDamage + Spread: 2c0 + Damage: 25 + DamageTypes: Prone50Percent, TriggerProne, SmallExplosionDeath + ValidTargets: Burster + Warhead@SDam: SpreadDamage + Damage: 4500 + Spread: 1c0 + Falloff: 1000, 1000, 0 + ValidTargets: Structure Warhead@2Smu: LeaveSmudge SmudgeType: Scorch-NoFlame InvalidTargets: Structure, Wall, Trees Size: 3 Delay: 5 Warhead@3Eff: CreateEffect - Explosions: large_chem - ExplosionPalette: tdeffect-ignore-lighting-alpha85 + Explosions: lchr_explode + ExplosionPalette: effect ImpactSounds: vdemdiea.aud - Warhead@18Radio: CreateTintedCells - Level: 300 - Falloff: 100, 55, 32, 5 - LayerName: radioactivity.weak - Warhead@Shrap: FireShrapnel - Weapon: ChemDebris - Amount: 7 - AimChance: 0 - ValidTargets: Ground, Water, Infantry, Vehicle - ThrowWithoutTarget: true + Delay: 1 + Warhead@4Eff: CreateEffect + Explosions: artillery_explosion + +MindSparkEruption: + ReloadDelay: 1000 + Projectile: InstantExplode + Warhead@2Eff: CreateEffect + Explosions: reverse + ExplosionPalette: scrin + Image: mindcontrol + ValidTargets: Ground + ImpactSounds: mastermind-shatter.aud + ImpactActors: false + AirThreshold: 512 + Warhead@Suppress: GrantExternalConditionCA + Range: 2c0 + Duration: 200 + Condition: suppression + ValidRelationships: Enemy, Neutral + AirThreshold: 512 + +MindSparkZap: + ReloadDelay: 60 + Range: 2c512 + Report: mindspark-zap1.aud, mindspark-zap2.aud + Projectile: PlasmaBeam + Duration: 7 + Colors: c45dff88 + InnerLightness: 200 + OuterLightness: 100 + Radius: 1 + Distortion: 250 + DistortionAnimation: 150 + SegmentLength: 350 + ZOffset: 512 + Warhead@1Dam: SpreadDamage + Spread: 42 + Damage: 25000 + Versus: + Light: 15 + Heavy: 5 + Concrete: 10 + Wood: 5 + DamageTypes: ElectricityDeath + Warhead@3Eff: CreateEffect + Explosions: small_explosion + +ObliteratorCharge: + Range: 15c0 + MinRange: 1c0 + ReloadDelay: 5 + Projectile: LinearPulse + Speed: 2c0 + ImpactInterval: 448 + Warhead@2Eff: CreateEffect + Explosions: idle, idle2, idle3, idle4, idle5, idle6, idle7, idle8 + ExplosionPalette: scrin + Image: obltboltcharge + ValidTargets: Ground, Air, Ship, Trees + Inaccuracy: 341 + +ObliteratorBolt: + Range: 15c0 + MinRange: 1c0 + ReloadDelay: 75 + Report: oblt-fire1.aud + Projectile: LinearPulse + Speed: 768 + ImpactInterval: 390 + ProjectileAnimation@1: + Image: obltbolt + Sequences: idle, idle2 + Palette: scrin + HitAnim: enrvbolthit + HitAnimSequence: idle + HitAnimPalette: scrin + Warhead@1Dam: SpreadDamage + Spread: 390 + Falloff: 100, 50, 0 + Damage: 7500 + Versus: + Wood: 40 + Concrete: 40 + Heavy: 65 + Light: 65 + DamageTypes: Prone50Percent, TriggerProne, FireDeath + ValidRelationships: Enemy, Neutral + Warhead@friendlyFire: SpreadDamage + Spread: 390 + Falloff: 100, 50, 0 + Damage: 1000 + Versus: + Wood: 40 + Concrete: 40 + Heavy: 65 + Light: 65 + DamageTypes: Prone50Percent, TriggerProne, FireDeath + ValidRelationships: Ally + InvalidTargets: Obliterator + Warhead@2Eff: CreateFacingEffect + Explosions: trail, trail2, trail3 + ExplosionPalette: scrin + Image: obltbolt + ValidTargets: Ground, Air, Ship, Trees + Inaccuracy: 110 + Warhead@2Smu: LeaveSmudge + SmudgeType: Scorch + Warhead@Flash: FlashTarget + Spread: 1c0 + Color: 9c3ee0 + ValidTargets: Infantry, Structure, Vehicle + +NullifierBolt: + Range: 8c0 + ReloadDelay: 80 + Report: null-fire1.aud + Projectile: MissileCA + Image: nullbolt + Palette: caneon + Speed: 600 + TrailImage: nulltrail + TrailSequences: idle1, idle2 + TrailPalette: caneon + TrailInterval: 1 + TrailSpacing: 600 + ContrailStartWidth: 32 + ContrailStartColor: ffff00 + ContrailStartColorAlpha: 96 + ContrailLength: 6 + RangeLimit: 9c0 + Jammable: false + AllowSnapping: true + Warhead@1Dam: SpreadDamage + Spread: 0c128 + Damage: 25000 + Versus: + None: 100 + Wood: 25 + Light: 50 + Heavy: 10 + Concrete: 25 + Brick: 10 + DamageTypes: Prone50Percent, TriggerProne, ElectricityDeath + Warhead@Blind: GrantExternalConditionCA + Range: 0c341 + Duration: 125 + Condition: blinded + ValidTargets: Infantry, Vehicle, Ship, Defense + InvalidTargets: BlindImmune + Warhead@3Eff: CreateEffect + Explosions: idle + ExplosionPalette: caneon + Image: nullhit + ImpactSounds: null-hit1.aud + Warhead@Flash: FlashTarget + Spread: 0c128 + Color: ffff00 + ValidTargets: Infantry, Vehicle, Ship, Defense + +ScrinRepair: + Inherits: Heal + Range: 2c512 + ValidTargets: Repairable + Projectile: LaserZapCA + Width: 48 + Duration: 4 + Color: FFFFFF80 + Warhead@1Dam: SpreadDamage + Damage: -3000 + ValidTargets: Repairable + DamageTypes: DirectRepair + -Warhead@2Dam: + -Warhead@3Dam: + -Warhead@4Dam: + Warhead@Flash: FlashTarget + Spread: 0c511 + Color: ff0000 + ValidTargets: Repairable diff --git a/mods/ca/weapons/smallcaliber.yaml b/mods/ca/weapons/smallcaliber.yaml index 2fe1bf621f..984c13fbbb 100644 --- a/mods/ca/weapons/smallcaliber.yaml +++ b/mods/ca/weapons/smallcaliber.yaml @@ -4,9 +4,8 @@ Report: aacanon3.aud ValidTargets: Air, AirSmall Projectile: Bullet - Speed: 1c682 + Speed: 3c0 Blockable: false - Inaccuracy: 0c3 Warhead@1Dam: SpreadDamage Range: 0, 0c64, 0c256, 3c0 Falloff: 100, 100, 30, 15 @@ -14,11 +13,12 @@ ValidTargets: Air ValidRelationships: Enemy, Neutral DamageTypes: Prone50Percent, TriggerProne, DefaultDeath - Warhead@2Dam: SpreadDamage - Range: 0, 0c64, 0c256, 4c256 - Falloff: 100, 70, 30, 10 + Warhead@smallDamage: SpreadDamage + Spread: 128 + Falloff: 100, 50, 14, 0 Damage: 2000 ValidTargets: AirSmall + ValidRelationships: Enemy, Neutral DamageTypes: Prone50Percent, TriggerProne, DefaultDeath Warhead@2Eff: CreateEffect Explosions: small_explosion_air @@ -32,13 +32,12 @@ ZSU-23: ValidTargets: Air, AirSmall, ICBM ReloadDelay: 8 Warhead@1Dam: SpreadDamage - ValidTargets: Air, ICBM Damage: 2500 Range: 0, 0c64, 0c256, 3c768 - Warhead@2Dam: SpreadDamage - ValidTargets: AirSmall + Warhead@smallDamage: SpreadDamage Damage: 2500 - Range: 0, 0c64, 0c256, 3c256 + ValidTargets: AirSmall, ICBM + Range: 0, 0c64, 0c256, 1c768 Falloff: 100, 70, 30, 10 Warhead@2Eff: CreateEffect ValidTargets: Air, AirSmall, ICBM, Ground, Water, Trees @@ -48,9 +47,9 @@ FLAK-23-AA: Range: 7c512 Report: flak1.aud, flak2.aud Warhead@1Dam: SpreadDamage - Damage: 1250 - Warhead@2Dam: SpreadDamage - Damage: 1250 + Damage: 1500 + Warhead@smallDamage: SpreadDamage + Damage: 1500 FLAK-23-AG: Inherits: ^AACannon @@ -59,28 +58,32 @@ FLAK-23-AG: ValidTargets: Ground, Water Projectile: Bullet LaunchAngle: 62 - Speed: 520 + Speed: 682 Image: FLAKBALL Blockable: True - Inaccuracy: 0c682 + Inaccuracy: 341 Warhead@1Dam: SpreadDamage ValidRelationships: Enemy, Neutral, Ally -Range: + Damage: 1750 Spread: 0c128 Falloff: 100, 37, 14, 5, 0 Versus: None: 100 Wood: 10 - Light: 60 + Light: 75 Heavy: 10 Concrete: 10 Brick: 20 ValidTargets: Ground, Water + -Warhead@smallDamage: Warhead@2Eff: CreateEffect Explosions: flak_explosion_ground ValidTargets: Ground, Ship, Trees + Inaccuracy: 341 Warhead@3EffWater: CreateEffect Explosions: small_splash + ImpactSounds: splashm1.aud, splashm2.aud, splashm3.aud ValidTargets: Water, Underwater InvalidTargets: Ship, Structure, Bridge @@ -90,7 +93,7 @@ FLAK-SEAS-AA: Range: 8c0 Warhead@1Dam: SpreadDamage Damage: 2200 - Warhead@2Dam: SpreadDamage + Warhead@smallDamage: SpreadDamage Damage: 2200 FLAK-SEAS-AG: @@ -99,83 +102,49 @@ FLAK-SEAS-AG: Report: vflaat1a.aud, vflaat1b.aud Projectile: Bullet LaunchAngle: 82 + Speed: 768 Warhead@1Dam: SpreadDamage Damage: 2200 Versus: None: 150 Wood: 60 - Light: 35 - Heavy: 25 + Light: 40 + Heavy: 30 Concrete: 20 -Gatt.0: +Gatt: Inherits: ^AACannon - ReloadDelay: 15 - Report: vgatlo1a.aud + ReloadDelay: 5 + -Report: ValidTargets: Air, AirSmall, ICBM Warhead@1Dam: SpreadDamage - Damage: 1250 - Range: 0, 0c64, 0c256, 3c256 - ValidTargets: Air, ICBM - Warhead@2Dam: SpreadDamage - Damage: 1250 - Range: 0, 0c64, 0c256, 3c256 + Damage: 1300 + Range: 0, 0c64, 0c256, 3c768 + Warhead@smallDamage: SpreadDamage + Damage: 1300 + ValidTargets: AirSmall, ICBM + Range: 0, 0c64, 0c256, 1c768 Falloff: 100, 70, 30, 10 - ValidTargets: AirSmall Warhead@2Eff: CreateEffect + Explosions: piff, piff2 ValidTargets: Air, AirSmall, ICBM - ImpactSoundChance: 20 - -Gatt.1: - Inherits: Gatt.0 - ReloadDelay: 5 - Report: vgatlo2a.aud, vgatlo2b.aud, vgatlo2c.aud - Warhead@1Dam: SpreadDamage - Damage: 1250 + ImpactSounds: sirodefa.aud, sirodefb.aud, sirodefc.aud, sirodefd + ImpactSoundChance: 60 -Gatt.2: - Inherits: Gatt.1 - Report: vgatlo5a.aud, vgatlo5b.aud - Warhead@1Dam: SpreadDamage - Damage: 1700 - -Gatt.3: - Inherits: Gatt.2 - Report: vgatlo8a.aud, vgatlo8b.aud - Warhead@1Dam: SpreadDamage - Damage: 1900 - -MGatt.0: +MGatt: Inherits: ^AACannon - ReloadDelay: 15 - Report: vgatlo1a.aud + ReloadDelay: 5 + -Report: Range: 7c512 Warhead@1Dam: SpreadDamage - Damage: 400 - Warhead@2Dam: SpreadDamage - Damage: 400 + Damage: 665 + Warhead@smallDamage: SpreadDamage + Damage: 665 Warhead@2Eff: CreateEffect + Explosions: piff, piff2 ValidTargets: Air, AirSmall - ImpactSoundChance: 20 - -MGatt.1: - Inherits: MGatt.0 - ReloadDelay: 5 - Report: vgatlo2a.aud, vgatlo2b.aud, vgatlo2c.aud - Warhead@1Dam: SpreadDamage - Damage: 540 - -MGatt.2: - Inherits: MGatt.1 - Report: vgatlo5a.aud, vgatlo5b.aud - Warhead@1Dam: SpreadDamage - Damage: 680 - -MGatt.3: - Inherits: MGatt.2 - Report: vgatlo8a.aud, vgatlo8b.aud - Warhead@1Dam: SpreadDamage - Damage: 820 + ImpactSounds: sirodefa.aud, sirodefb.aud, sirodefc.aud, sirodefd + ImpactSoundChance: 60 ^HeavyMG: ReloadDelay: 30 @@ -192,7 +161,7 @@ MGatt.3: Light: 72 Heavy: 28 Concrete: 28 - Brick: 28 + Brick: 20 DamageTypes: Prone50Percent, TriggerProne, BulletDeath Warhead@2Eff: CreateEffect Explosions: piffs @@ -212,10 +181,9 @@ MGatt.3: Light: 40 Heavy: 10 Concrete: 10 - Brick: 10 DamageTypes: Prone50Percent, TriggerProne, DefaultDeath Warhead@2Eff: CreateEffect - Explosions: piff + Explosions: piff, piff2 Inaccuracy: 171 Warhead@3EffWater: CreateEffect Explosions: water_piff @@ -223,121 +191,32 @@ MGatt.3: Vulcan: Inherits: ^HeavyMG + -Projectile: + Projectile: PlasmaBeam + ImpactTicks: 0, 2, 4, 6, 8, 10 + Radius: 1 + Duration: 13 + TrackTarget: true + Blockable: true + Invisible: true Warhead@1Dam: SpreadDamage Spread: 128 Damage: 1000 Versus: - None: 200 - Wood: 50 - Light: 150 - Heavy: 10 - Concrete: 35 - Brick: 20 - Warhead@4Dam_2: SpreadDamage - Spread: 128 - Damage: 1000 - Delay: 2 - Versus: - None: 200 - Wood: 50 - Light: 150 - Heavy: 10 + None: 220 + Wood: 56 + Light: 58 + Heavy: 15 Concrete: 35 Brick: 20 DamageTypes: Prone50Percent, TriggerProne, BulletDeath - Warhead@4Eff_2: CreateEffect - Explosions: piffs - ValidTargets: Ground, Ship, Trees - Delay: 2 - Warhead@4Eff_2Water: CreateEffect - Explosions: water_piffs - ValidTargets: Water, Underwater - InvalidTargets: Ship, Structure, Bridge + Warhead@2Eff: CreateEffect + Explosions: piff, piff2 + Inaccuracy: 171 + Warhead@2Eff2: CreateEffect Delay: 2 - Warhead@5Dam_3: SpreadDamage - Spread: 128 - Damage: 1000 - Delay: 4 - Versus: - None: 200 - Wood: 50 - Light: 0 - Heavy: 10 - Concrete: 35 - Brick: 20 - DamageTypes: Prone50Percent, TriggerProne, BulletDeath - Warhead@6Eff_3: CreateEffect - Explosions: piffs - ValidTargets: Ground, Ship, Trees - Delay: 4 - Warhead@6Eff_3Water: CreateEffect - Explosions: water_piffs - ValidTargets: Water, Underwater - InvalidTargets: Ship, Structure, Bridge - Delay: 4 - Warhead@7Dam_4: SpreadDamage - Spread: 128 - Damage: 1000 - Delay: 6 - Versus: - None: 200 - Wood: 50 - Light: 0 - Heavy: 10 - Concrete: 35 - Brick: 20 - DamageTypes: Prone50Percent, TriggerProne, BulletDeath - Warhead@8Eff_4: CreateEffect - Explosions: piffs - ValidTargets: Ground, Ship, Trees - Delay: 6 - Warhead@8Eff_4Water: CreateEffect - Explosions: water_piffs - ValidTargets: Water, Underwater - InvalidTargets: Ship, Structure, Bridge - Delay: 6 - Warhead@9Dam_5: SpreadDamage - Spread: 128 - Damage: 1000 - Delay: 8 - Versus: - None: 200 - Wood: 50 - Light: 0 - Heavy: 10 - Concrete: 35 - Brick: 20 - DamageTypes: Prone50Percent, TriggerProne, BulletDeath - Warhead@10Eff_5: CreateEffect - Explosions: piffs - ValidTargets: Ground, Ship, Trees - Delay: 8 - Warhead@10Eff_5Water: CreateEffect - Explosions: water_piffs - ValidTargets: Water, Underwater - InvalidTargets: Ship, Structure, Bridge - Delay: 8 - Warhead@11Dam_6: SpreadDamage - Spread: 128 - Damage: 1000 - Delay: 10 - Versus: - None: 200 - Wood: 50 - Light: 0 - Heavy: 10 - Concrete: 35 - Brick: 20 - DamageTypes: Prone50Percent, TriggerProne, BulletDeath - Warhead@12Eff_6: CreateEffect - Explosions: piffs - ValidTargets: Ground, Ship, Trees - Delay: 10 - Warhead@12Eff_6Water: CreateEffect - Explosions: water_piffs - ValidTargets: Water, Underwater - InvalidTargets: Ship, Structure, Bridge - Delay: 10 + Explosions: piff, piff2 + Inaccuracy: 171 GTChainGun: Inherits: Vulcan @@ -345,21 +224,68 @@ GTChainGun: ChainGun: Inherits: ^HeavyMG - -Report: - StartBurstReport: gun13.aud - ReloadDelay: 10 - Burst: 2 - BurstDelays: 0 - Range: 5c0 + Report: gun13.aud + ReloadDelay: 16 + Range: 5c512 MinRange: 0c768 Projectile: Bullet Blockable: false Warhead@1Dam: SpreadDamage + Damage: 4400 Versus: - None: 144 - Wood: 50 - Light: 54 - Heavy: 20 + None: 100 + Wood: 26 + Light: 38 + Heavy: 48 + Concrete: 26 + DamageTypes: Prone50Percent, TriggerProne, BulletDeath, AirToGround + +GAU8: + Inherits: ^HeavyMG + Range: 6c0 + ReloadDelay: 80 + BurstDelays: 1 + Burst: 15 + -Report: + StartBurstReport: brrrrt1.aud, brrrrt2.aud + FirstBurstTargetOffset: -512,0,0 + FollowingBurstTargetOffset: 448,0,0 + MinRange: 0c256 + Projectile: Bullet + Blockable: false + Warhead@1Dam: SpreadDamage + Spread: 341 + Damage: 1900 + Versus: + None: 200 + Wood: 0 + Light: 100 + Heavy: 85 + Concrete: 30 + DamageTypes: Prone50Percent, TriggerProne, BulletDeath, AirToGround + Warhead@2Smu: LeaveSmudge + SmudgeType: Scorch + InvalidTargets: Vehicle, Building, Wall + +GAU8.Building: + Inherits: GAU8 + -StartBurstReport: + -Projectile: + -FirstBurstTargetOffset: + -FollowingBurstTargetOffset: + -Warhead@2Smu: + -Warhead@2Eff: + -Warhead@3EffWater: + TargetActorCenter: true + Projectile: InstantHit + Blockable: false + Warhead@1Dam: SpreadDamage + Spread: 341 + Damage: 1280 + Versus: + Wood: 100 + ValidTargets: Building + InvalidTargets: Defense Vulcan2: Inherits: ^LightMG @@ -381,36 +307,91 @@ Vulcan3: Damage: 1700 Versus: Wood: 30 + Concrete: 18 + Heavy: 13 Warhead@2Eff: CreateEffect Explosions: piffs Inaccuracy: 0 ChainGun.Yak.R: Inherits: ^HeavyMG - Burst: 10 + ReloadDelay: 60 + Burst: 4 + BurstDelays: 5 Range: 6c0 - ReloadDelay: 50 + MinRange: 0c768 + Projectile: InstantHit + Blockable: false + Warhead@1Dam: SpreadDamage + Damage: 4000 + Versus: + None: 100 + Wood: 35 + Light: 55 + Heavy: 25 + Concrete: 25 + DamageTypes: Prone50Percent, TriggerProne, BulletDeath, AirToGround + +ChainGun.Yak.L: + Inherits: ChainGun.Yak.R + -Report: + +ChainGun.Yak.AA: + Inherits: ChainGun.Yak.R + ValidTargets: Air, AirSmall + -MinRange: + Warhead@1Dam: SpreadDamage + Range: 0, 0c64, 0c256, 1c768 + Falloff: 100, 100, 30, 15 + ValidTargets: Air + ValidRelationships: Enemy, Neutral + Damage: 1500 + Versus: + None: 100 + Wood: 100 + Light: 100 + Heavy: 100 + Concrete: 100 + Brick: 100 + DamageTypes: Prone50Percent, TriggerProne, BulletDeath + Warhead@smallDamage: SpreadDamage + Spread: 341 + Falloff: 100, 50, 14, 0 + Damage: 1500 + ValidTargets: AirSmall + ValidRelationships: Enemy, Neutral + DamageTypes: Prone50Percent, TriggerProne, DefaultDeath + Warhead@2Eff: CreateEffect + Explosions: small_explosion_air + ValidTargets: Air + Inaccuracy: 0c341 + +ChainGun.P51.R: + Inherits: ^HeavyMG + Burst: 9 + Range: 7c0 + ReloadDelay: 80 BurstDelays: 2 -Report: StartBurstReport: gun13ext.aud - FirstBurstTargetOffset: -512,213,0 - FollowingBurstTargetOffset: 478,0,0 - MinRange: 1c0 + FirstBurstTargetOffset: -1792,213,0 + FollowingBurstTargetOffset: 448,0,0 + MinRange: 0c768 Projectile: Bullet Blockable: false Warhead@1Dam: SpreadDamage - Damage: 2800 + Spread: 341 + Damage: 3000 Versus: None: 200 - Wood: 35 + Wood: 10 Light: 80 Heavy: 25 Concrete: 25 - Brick: 25 -ChainGun.Yak.L: - Inherits: ChainGun.Yak.R - FirstBurstTargetOffset: -512,-213,0 +ChainGun.P51.L: + Inherits: ChainGun.P51.R + FirstBurstTargetOffset: -1792,-213,0 Pistol: Inherits: ^LightMG @@ -434,6 +415,13 @@ PistolTD: Inherits: Pistol Report: gun18.aud +CommissarPistol: + Inherits: Pistol + Report: icivattb.aud, icivatta.aud + Range: 6c0 + Warhead@1Dam: SpreadDamage + Damage: 900 + M1Carbine: Inherits: ^LightMG ReloadDelay: 20 @@ -441,10 +429,12 @@ M1Carbine: Report: gun11.aud Warhead@1Dam: SpreadDamage Versus: + Concrete: 18 Wood: 30 + Heavy: 13 Warhead@2Eff2: CreateEffect Delay: 2 - Explosions: piff + Explosions: piff, piff2 ValidTargets: Ground, Air, AirSmall, Trees Inaccuracy: 171 Warhead@3EffWater2: CreateEffect @@ -455,7 +445,7 @@ M1Carbine: Inaccuracy: 171 Warhead@2Eff3: CreateEffect Delay: 4 - Explosions: piff + Explosions: piff, piff2 ValidTargets: Ground, Air, AirSmall, Trees Inaccuracy: 171 Warhead@3EffWater3: CreateEffect @@ -465,137 +455,177 @@ M1Carbine: Explosions: water_piff Inaccuracy: 171 +M14: + Inherits: M1Carbine + Report: islyat1a.aud, islyat1b.aud + M16Carbine: Inherits: M1Carbine Report: mgun2.aud -M1CarbineE: +M1CarbineBATF: Inherits: M1Carbine + Range: 5c768 Burst: 3 BurstDelays: 2 -Report: StartBurstReport: baocatta.aud, baocattb.aud, baocattc.aud ReloadDelay: 10 - Range: 6c0 Warhead@1Dam: SpreadDamage - Damage: 600 - Versus: - None: 100 - Wood: 15 - Concrete: 15 - Light: 25 - Heavy: 5 + Damage: 750 -M16CarbineE: - Inherits: M1CarbineE +M16CarbineBATF: + Inherits: M1CarbineBATF BATFGun: - Inherits: M1CarbineE - Range: 5c0 - Warhead@1Dam: SpreadDamage - Damage: 1800 - Versus: - Wood: 10 - Concrete: 5 + Inherits: M1CarbineBATF M60mg: Inherits: ^LightMG + -Report: Range: 4c0 - Report: pillbox1.aud + StartBurstReport: pillbox1.aud Burst: 5 + BurstDelays: 3 + ReloadDelay: 38 Warhead@1Dam: SpreadDamage Versus: - Light: 60 + Light: 75 Warhead@2Eff: CreateEffect - Explosions: piffs - Inaccuracy: 0 + Explosions: piff, piff2 + Inaccuracy: 64 M60mgTD: Inherits: M60mg - Report: m60.aud - -M60mgXO: - Inherits: M60mgTD - Range: 5c0 - Burst: 2 - Warhead@1Dam: SpreadDamage - Damage: 2500 - -Report: - StartBurstReport: XOgun1.aud, XOgun2.aud + StartBurstReport: m60x5.aud M60mgJJ: Inherits: M60mg + Range: 4c768 Projectile: Bullet Blockable: false + -StartBurstReport: Report: vblhatta.aud, vblhattb.aud Burst: 3 + BurstDelays: 5 Warhead@1Dam: SpreadDamage + Damage: 3250 Versus: - Light: 30 + None: 100 + Light: 40 + Heavy: 4 + Concrete: 4 + Wood: 4 + Brick: 4 + DamageTypes: Prone50Percent, TriggerProne, DefaultDeath, AirToGround M60mgJJ.ground: Inherits: M60mgJJ Projectile: Bullet Blockable: true +M60mgJJAA: + Inherits: M60mgJJ + Range: 5c512 + ValidTargets: Air, AirSmall + Warhead@1Dam: SpreadDamage + ValidTargets: Air, AirSmall + Damage: 600 + +M60mgNHAW: + Inherits: M60mg + Range: 4c768 + Projectile: Bullet + Blockable: false + -StartBurstReport: + Report: vblhatta.aud, vblhattb.aud + Burst: 3 + BurstDelays: 5 + Warhead@1Dam: SpreadDamage + Versus: + None: 165 + Light: 50 + DamageTypes: Prone50Percent, TriggerProne, DefaultDeath, AirToGround + M60mgIFV: Inherits: M60mg Range: 5c768 - Report: ifvmg1.aud, ifvmg2.aud, ifvmg3.aud - BurstDelays: 2 - Burst: 6 + StartBurstReport: ifvmg1.aud, ifvmg2.aud + Burst: 1 + ReloadDelay: 44 Warhead@1Dam: SpreadDamage - Damage: 1200 + Damage: 7600 Versus: - Light: 40 - None: 180 + Wood: 30 + Light: 75 + None: 100 + DamageTypes: Prone50Percent, BulletDeath + Warhead@PercDam: HealthPercentageDamage + Spread: 42 + Damage: 60 + Versus: + Light: 1 + DamageTypes: Prone50Percent, TriggerProne, BulletDeath + ValidTargets: Infantry + Warhead@2Eff: CreateEffect + Explosions: piff, piff2 + Warhead@3EffWater: CreateEffect + Explosions: water_piff M60mgMD: Inherits: M60mgTD - ReloadDelay: 45 - Warhead@1Dam: SpreadDamage - Damage: 800 + ReloadDelay: 40 -MGatt.0G: - Inherits: ^HeavyMG - Range: 4c768 - ReloadDelay: 15 - Report: vgatlo1a.aud - Warhead@1Dam: SpreadDamage - Spread: 256 - Damage: 225 - Versus: - None: 250 - Light: 100 +M60mgMD.Attached: + Range: 5c256 + Inherits: M60mgMD -MGatt.1G: - Inherits: MGatt.0G +MGattG: + Inherits: ^HeavyMG + Range: 5c0 ReloadDelay: 5 - Report: vgatlo2a.aud, vgatlo2b.aud, vgatlo2c.aud - Warhead@1Dam: SpreadDamage - Damage: 325 - -MGatt.2G: - Inherits: MGatt.1G - Report: vgatlo5a.aud, vgatlo5b.aud + -Report: Warhead@1Dam: SpreadDamage - Damage: 425 + Spread: 128 + Damage: 300 + Versus: + None: 160 + Wood: 35 + Concrete: 35 + Light: 155 + Heavy: 35 + Warhead@PercDam: HealthPercentageDamage + Spread: 42 + Damage: 6 + Versus: + Light: 1 + DamageTypes: Prone50Percent, TriggerProne, BulletDeath + ValidTargets: Infantry + Warhead@2Eff: CreateEffect + Explosions: piff, piff2 + Inaccuracy: 171 + Warhead@2Eff2: CreateEffect + Delay: 2 + Explosions: piff, piff2 + Inaccuracy: 171 ^SnipeWeapon: ReloadDelay: 80 Range: 5c512 Report: gun5.aud - ValidTargets: Ground, Infantry - InvalidTargets: Vehicle, Ship, Water, Structure, Wall, Husk - Projectile: Bullet - Speed: 1c682 + InvalidTargets: Vehicle, Ship, Water, Structure + Projectile: InstantHit + Blockable: true Warhead@1Dam: SpreadDamage Spread: 42 Damage: 15000 - ValidTargets: Barrel, Infantry + Versus: + Light: 15 + Brick: 15 + ValidTargets: Barrel, Infantry, Mine, Wall, Husk DamageTypes: Prone50Percent, TriggerProne, DefaultDeath Warhead@2Eff: CreateEffect - Explosions: piff + Explosions: piff, piff2 ImpactActors: false ValidTargets: Ground, Water, Air, AirSmall @@ -606,67 +636,102 @@ SilencedPPK: Warhead@1Dam: SpreadDamage Spread: 128 Warhead@2Eff: CreateEffect - Explosions: piff + Explosions: piff, piff2 ValidTargets: Ground, Ship, Air, AirSmall, Trees Warhead@3EffWater: CreateEffect Explosions: water_piff ValidTargets: Water, Underwater InvalidTargets: Ship, Structure, Bridge -SilencedPPKE: +SilencedPPKBATF: Inherits: SilencedPPK Range: 5c0 Colt45: Inherits: ^SnipeWeapon - ReloadDelay: 5 - Burst: 2 - BurstDelays: 2 + ReloadDelay: 7 + Burst: 4 + BurstDelays: 2,6,2 Range: 7c0 Warhead@1Dam: SpreadDamage Damage: 4700 + Versus: + Light: 25 Warhead@2Eff: CreateEffect - Explosions: piff + Explosions: piff, piff2 ValidTargets: Ground, Ship, Air, AirSmall, Trees Warhead@3EffWater: CreateEffect Explosions: water_piff ValidTargets: Water, Underwater InvalidTargets: Ship, Structure, Bridge -Colt45E: +Colt45BATF: Inherits: Colt45 - Range: 6c0 + Range: 5c768 SMG: Inherits: ^SnipeWeapon Report: silppk.aud - ReloadDelay: 10 + ReloadDelay: 12 Range: 7c0 Warhead@1Dam: SpreadDamage Damage: 25000 - ValidTargets: Infantry DamageTypes: Prone50Percent, TriggerProne, BulletDeath Warhead@2Eff: CreateEffect - Explosions: piff + Explosions: piff, piff2 ValidTargets: Ground, Ship, Air, AirSmall, Trees Warhead@3EffWater: CreateEffect Explosions: water_piff ValidTargets: Water, Underwater InvalidTargets: Ship, Structure, Bridge -SMGE: +SMGBATF: Inherits: SMG + Range: 5c768 + +MP5: + StartBurstReport: iseaatta.aud, iseaattb.aud + ReloadDelay: 6 + Burst: 3 + BurstDelays: 2 Range: 6c0 + InvalidTargets: Structure + Projectile: InstantHit + Blockable: true + Warhead@1Dam: SpreadDamage + Spread: 128 + Damage: 1570 + Versus: + None: 100 + Wood: 15 + Light: 35 + Heavy: 15 + Concrete: 10 + Brick: 10 + DamageTypes: Prone50Percent, TriggerProne, BulletDeath + Warhead@2Eff: CreateEffect + Explosions: piff, piff2 + Inaccuracy: 171 + ValidTargets: Ground, Ship, Air, AirSmall, Trees + Warhead@3EffWater: CreateEffect + Explosions: water_piff + Inaccuracy: 171 + ValidTargets: Water, Underwater + InvalidTargets: Ship, Structure, Bridge + +MP5BATF: + Inherits: MP5 + Range: 5c768 AKM: StartBurstReport: mg11.aud - ReloadDelay: 8 + ReloadDelay: 10 Burst: 3 BurstDelays: 2 Range: 7c0 - InvalidTargets: Structure, Wall, Husk, Air, AirSmall - Projectile: Bullet - Speed: 1c682 + InvalidTargets: Structure + Projectile: InstantHit + Blockable: true Warhead@1Dam: SpreadDamage Spread: 128 Damage: 4700 @@ -679,7 +744,7 @@ AKM: Brick: 10 DamageTypes: Prone50Percent, TriggerProne, BulletDeath Warhead@2Eff: CreateEffect - Explosions: piff + Explosions: piff, piff2 Inaccuracy: 171 ValidTargets: Ground, Ship, Air, AirSmall, Trees Warhead@3EffWater: CreateEffect @@ -688,18 +753,16 @@ AKM: ValidTargets: Water, Underwater InvalidTargets: Ship, Structure, Bridge -AKME: +AKMBATF: Inherits: AKM - Range: 6c0 + Range: 5c768 SNIPER: ReloadDelay: 120 - Range: 7c0 + Range: 8c0 Report: snipe.aud - ValidTargets: Ground, Water - InvalidTargets: Vehicle, Ship - Projectile: Bullet - Speed: 2c682 + Projectile: InstantHit + Blockable: true Warhead@1Dam: SpreadDamage Spread: 42 Damage: 25000 @@ -707,100 +770,139 @@ SNIPER: Wood: 1 Concrete: 1 Brick: 1 - ValidTargets: Barrel, Infantry + Heavy: 2 + Light: 2 DamageTypes: Prone50Percent, TriggerProne, BulletDeath + InvalidTargets: Infantry + Warhead@2Dam: HealthPercentageDamage + Spread: 42 + Damage: 300 + ValidTargets: Infantry + DamageTypes: BulletDeath + Versus: + Light: 25 Warhead@2Eff: CreateEffect - Explosions: piff + Explosions: piff, piff2 ValidTargets: Ground, Ship, Air, AirSmall, Trees Warhead@3EffWater: CreateEffect Explosions: water_piff ValidTargets: Water, Underwater InvalidTargets: Ship, Structure, Bridge -SNIPERE: - Inherits: SNIPER - Range: 6c0 - SNIPER.vehicle: - ReloadDelay: 120 + Inherits: SNIPER Range: 7c0 Report: ijarwe1a.aud - ValidTargets: Vehicle, Ship - InvalidTargets: Infantry, Structure, Wall, Husk, Air, AirSmall - Projectile: Bullet - Speed: 2c682 - Blockable: true - Image: 50CAL - Shadow: True Warhead@1Dam: SpreadDamage - Spread: 42 - Damage: 7000 - ValidTargets: Vehicle, Ship - DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath + Versus: + Light: 28 + Heavy: 28 + DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath, TankBuster Warhead@2Smu: LeaveSmudge SmudgeType: Crater InvalidTargets: Vehicle, Structure, Wall, Husk, Trees + Warhead@2Eff: CreateEffect + Explosions: piff, piff2 + -ValidTargets: Warhead@3Eff: CreateEffect Explosions: small_explosion ImpactSounds: kaboom12.aud - ValidTargets: Ground, Ship, Trees + ValidTargets: Vehicle, Ship, Trees + -Warhead@3EffWater: Warhead@4EffWater: CreateEffect Explosions: small_splash ImpactSounds: splash9.aud ValidTargets: Water, Underwater InvalidTargets: Ship, Structure, Bridge - Warhead@Concussion: GrantExternalCondition + Warhead@Concussion: GrantExternalConditionCA Range: 0c256 - Duration: 70 + Duration: 75 Condition: concussion ValidTargets: Vehicle, Ship SNIPER.vehicleElite: Inherits: SNIPER.vehicle Report: ijarwe2a.aud - Warhead@1Dam: SpreadDamage - InvalidTargets: DriverKillLow - Warhead@3Eff: CreateEffect - InvalidTargets: DriverKillLow - Warhead@Concussion: GrantExternalCondition + Warhead@Concussion: GrantExternalConditionCA InvalidTargets: DriverKillLow Warhead@DriverKill: ChangeOwnerToNeutral ValidTargets: DriverKillLow - InvalidTargets: Infantry, Ship, Structure, Wall, Husk, Air, AirSmall, DriverKillImmune - ValidRelationships: Ally, Enemy, Neutral - Range: 0c511 - Warhead@highlight: GrantExternalCondition + InvalidTargets: DriverKillImmune + ValidRelationships: Enemy + CargoEffect: Block Range: 0c511 - Duration: 2 - Condition: highlight + Warhead@Flash: FlashTarget + Spread: 0c511 + Color: ffffff ValidTargets: DriverKillLow + InvalidTargets: DriverKillImmune -SniperIFVGun: +SNIPERBATF: + Inherits: SNIPER + Range: 7c0 + +SNIPERBATF.UPG: Inherits: SNIPER.vehicle - ValidTargets: Ground, Water - -InvalidTargets: + Range: 6c0 + +SNIPER.ASSA: + Inherits: SNIPER + InvalidTargets: Structure + ReloadDelay: 100 + Range: 8c0 + Report: iviratta.aud Warhead@1Dam: SpreadDamage - -ValidTargets: + DamageTypes: Prone50Percent, TriggerProne, PoisonDeath + Warhead@2Dam: HealthPercentageDamage + DamageTypes: PoisonDeath + Warhead@Cloud: SpawnActor + Actors: viruscloud + Range: 5 + ImpactActors: false + +SNIPERBATF.ASSA: + Inherits: SNIPER.ASSA + Range: 7c0 + +SniperIFVGun.UPG: + Inherits: SNIPER.vehicle + ReloadDelay: 105 + Warhead@1Dam: SpreadDamage + Versus: + Light: 40 + Heavy: 50 + +SniperIFVGun: + Inherits: SniperIFVGun.UPG + -Warhead@Concussion: CommandoIFVGun: Inherits: SMG - ReloadDelay: 15 + ReloadDelay: 12 Burst: 3 BurstDelays: 2 + Projectile: InstantHit + Blockable: true Warhead@1Dam: SpreadDamage - Damage: 5100 + Damage: 4700 + +SealIFVGun: + Inherits: MP5 + ReloadDelay: 4 + -InvalidTargets: + Projectile: InstantHit + Blockable: true ShadowOperativeGun: Inherits: ^HeavyMG Range: 6c0 - ReloadDelay: 30 + ReloadDelay: 25 Burst: 2 BurstDelays: 3 Report: shad-fire1.aud, shad-fire2.aud, shad-fire3.aud Projectile: InstantHit - InvalidTargets: Structure, Vehicle, Ship + ValidTargets: Infantry Warhead@1Dam: SpreadDamage - InvalidTargets: Structure, Vehicle, Ship Spread: 42 Damage: 2800 Versus: @@ -810,13 +912,203 @@ ShadowOperativeGun: Light: 60 Heavy: 20 Warhead@2Eff: CreateEffect - Explosions: piff + Explosions: piff, piff2 HeliGunAG: - Inherits: ChainGun + Inherits: ^HeavyMG Report: mgbtr1.aud, mgbtr2.aud, mgbtr3.aud - -StartBurstReport: - -Burst: - -BurstDelays: + ReloadDelay: 14 + Range: 5c512 + MinRange: 0c768 + Projectile: Bullet + Blockable: false Warhead@1Dam: SpreadDamage Damage: 5000 + Versus: + None: 144 + Wood: 35 + Light: 54 + Heavy: 25 + DamageTypes: Prone50Percent, TriggerProne, BulletDeath, AirToGround + +HeliGunAA: + Inherits: ^AACannon + ReloadDelay: 14 + Burst: 1 + Report: mgbtr1.aud, mgbtr2.aud, mgbtr3.aud + Range: 5c0 + Warhead@1Dam: SpreadDamage + Damage: 2000 + Range: 0, 0c64, 0c256, 1c768 + Warhead@smallDamage: SpreadDamage + Damage: 2000 + Spread: 341 + Warhead@2Eff: CreateEffect + -ImpactSounds: flakhit1.aud, flakhit2.aud, flakhit3.aud + -ImpactSoundChance: 100 + +WolverineGun: + Inherits: M60mg + Range: 4c768 + MinRange: 0c128 + ReloadDelay: 25 + BurstDelays: 3 + StartBurstReport: wolv-fire1.aud, wolv-fire2.aud + Warhead@1Dam: SpreadDamage + Spread: 256 + Damage: 750 + Versus: + Wood: 50 + Light: 70 + Heavy: 12 + -Warhead@2Eff: + +WolverineGunLine: + Inherits: WolverineGun + -StartBurstReport: + -Projectile: + Projectile: RailgunCA + Blockable: true + Invisible: true + PassthroughToMaxRange: true + PassthroughParallelToMuzzleOffset: true + DamageActorsInLine: true + BeamWidth: 256 + Warhead@1Dam: SpreadDamage + Spread: 42 + Damage: 750 + ValidRelationships: Enemy, Neutral + Warhead@2Eff: CreateEffect + Explosions: piff, empty + ValidTargets: Infantry, Structure, Vehicle, Ship, Trees + ValidRelationships: Enemy, Neutral + -Warhead@3EffWater: + +WolverineGunTracer: + Inherits: WolverineGun + -StartBurstReport: + -Projectile: + -Warhead@1Dam: + -Warhead@3EffWater: + Projectile: BulletCA + Blockable: true + Speed: 1350 + ContrailStartWidth: 40 + ContrailLength: 9 + ContrailStartColor: d6b4a044 + ContrailStartColorAlpha: 68 + Inaccuracy: 128 + PassthroughToMaxRange: true + PassthroughParallelToMuzzleOffset: true + Warhead@2Eff: CreateEffect + Inaccuracy: 0 + Explosions: piff + ValidTargets: Ground, Ship, Air, AirSmall, Trees + +EnforcerShotgun: + Range: 4c0 + Report: enfo-fire1.aud, enfo-fire2.aud + ReloadDelay: 55 + Projectile: LinearPulse + Blockable: true + Speed: 2c0 + ImpactInterval: 512 + ImpactType: Trapezoid + TrapezoidStartWidth: 0c768 + TrapezoidEndWidth: 2c0 + TrapezoidSegmentLength: 1c0 + SingleHitPerActor: true + ForceGround: DamageOnly + MinimumFriendlyFireRange: 2c0 + ProjectileAnimation@1: + Image: empty + Speed: 1350 + ContrailStartWidth: 40 + ContrailLength: 9 + ContrailStartColor: d6b4a044 + ContrailStartColorAlpha: 60 + TargetOffset: -128, -512, 0 + Inaccuracy: 128 + Delay: 0,3 + HitAnim: explosion + HitAnimSequence: piff + HitAnimPalette: effect-ignore-lighting-alpha50 + ProjectileAnimation@2: + Image: empty + Speed: 1350 + ContrailStartWidth: 40 + ContrailLength: 9 + ContrailStartColor: d6b4a044 + ContrailStartColorAlpha: 60 + TargetOffset: -64, -256, 0 + Inaccuracy: 128 + Delay: 0,3 + HitAnim: explosion + HitAnimSequence: piff2 + HitAnimPalette: effect-ignore-lighting-alpha50 + ProjectileAnimation@3: + Image: empty + Speed: 1350 + ContrailStartWidth: 40 + ContrailLength: 9 + ContrailStartColor: d6b4a044 + ContrailStartColorAlpha: 60 + Inaccuracy: 128 + Delay: 0,3 + HitAnim: explosion + HitAnimSequence: piff + HitAnimPalette: effect-ignore-lighting-alpha50 + ProjectileAnimation@4: + Image: empty + Speed: 1350 + ContrailStartWidth: 40 + ContrailLength: 9 + ContrailStartColor: d6b4a044 + ContrailStartColorAlpha: 60 + TargetOffset: -64, 256, 0 + Inaccuracy: 128 + Delay: 0,3 + HitAnim: explosion + HitAnimSequence: piff2 + HitAnimPalette: effect-ignore-lighting-alpha50 + ProjectileAnimation@5: + Image: empty + Speed: 1350 + ContrailStartWidth: 40 + ContrailLength: 9 + ContrailStartColor: d6b4a044 + ContrailStartColorAlpha: 60 + TargetOffset: -128, 512, 0 + Inaccuracy: 128 + Delay: 0,3 + HitAnim: explosion + HitAnimSequence: piff + HitAnimPalette: effect-ignore-lighting-alpha50 + DamageFalloff@1: + Spread: 4c0 + Falloff: 100, 33 + FalloffBasis: DistanceFromSource + Warhead@1Dam: SpreadDamage + Damage: 7000 + Versus: + None: 100 + Wood: 40 + Light: 80 + Heavy: 15 + Concrete: 15 + Brick: 30 + DamageTypes: Prone50Percent, TriggerProne, BulletDeath + +EnforcerIFVShotgun: + Inherits: EnforcerShotgun + Burst: 2 + BurstDelays: 5 + +ConfessorGun: + Inherits: M1Carbine + Report: conf-fire1.aud, conf-fire2.aud + Range: 6c0 + Warhead@1Dam: SpreadDamage + Damage: 3000 + Versus: + Light: 50 diff --git a/mods/ca/weapons/superweapons.yaml b/mods/ca/weapons/superweapons.yaml index 6699c194b6..d77a2449b4 100644 --- a/mods/ca/weapons/superweapons.yaml +++ b/mods/ca/weapons/superweapons.yaml @@ -12,19 +12,11 @@ ParaBomb: Spread: 1c0 Damage: 40000 Versus: - None: 30 + None: 40 Wood: 55 Light: 65 Heavy: 80 Concrete: 90 - Brick: 50 - DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath - Warhead@1Dam_cyborg: SpreadDamage - Spread: 1c0 - Damage: 8000 - ValidTargets: Cyborg - Versus: - Heavy: 0 DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath Warhead@2Smu: LeaveSmudge SmudgeType: Crater @@ -39,6 +31,18 @@ ParaBomb: ValidTargets: Water, Underwater InvalidTargets: Ship, Structure +ChaosBomb: + Inherits: ParaBomb + Warhead@3Eff: CreateEffect + Explosions: chaosexplosion + ExplosionPalette: caneon + ImpactSounds: firebl3.aud + Warhead@Cloud1: SpawnActor + Actors: chaoscloud, chaoscloud2 + Range: 5 + ValidTargets: Ground, Water + ImpactActors: false + CarpetBomb: Inherits: ParaBomb Report: bwhis.aud @@ -53,14 +57,12 @@ CarpetBomb: Wood: 32 Concrete: 60 Heavy: 70 - Warhead@1Dam_cyborg: SpreadDamage - Damage: 7500 AtomBomb: Inherits: CarpetBomb Range: 1c0 Projectile: GravityBomb - Image: B2BOMB + Image: bigbomb Velocity: 15, 0, -35 Acceleration: 0, 0, 0 ReloadDelay: 80 @@ -68,25 +70,17 @@ AtomBomb: Warhead@1Dam: SpreadDamage Spread: 1c0 Damage: 22000 - Falloff: 1000, 368, 135, 50, 18, 7, 0 + Falloff: 1000, 500, 250, 125, 75, 37, 18, 9, 4, 0 ValidTargets: Ground, Trees, Water, Air Versus: Tree: 200 None: 10 - Light: 55 - Heavy: 85 + Light: 75 + Heavy: 100 Concrete: 100 - Wood: 40 - Brick: 50 + Wood: 38 AffectsParent: true DamageTypes: Prone50Percent, TriggerProne, FireDeath, Incendiary - Warhead@1Dam_cyborg: SpreadDamage - Spread: 1c0 - Damage: 60000 - ValidTargets: Cyborg - Versus: - Heavy: 0 - DamageTypes: Prone50Percent, TriggerProne, FireDeath, Incendiary Warhead@2Res_impact: DestroyResource Warhead@3Eff_impact: CreateEffect Explosions: nuke @@ -115,7 +109,7 @@ AtomBomb: Falloff: 100, 75, 52, 37, 24, 15, 2 MaxLevel: 750 LayerName: radioactivity.strong - Warhead@22FlashEffect: FlashPaletteEffect + Warhead@22FlashEffect: FlashEffect Duration: 20 FlashType: Nuke @@ -123,14 +117,14 @@ InfernoBomb: Inherits: CarpetBomb Range: 3c0 Projectile: GravityBomb - Image: B2BOMB + Image: bigbomb Warhead@1Dam: SpreadDamage Versus: None: 70 - Wood: 60 + Wood: 50 Light: 85 Heavy: 40 - Concrete: 80 + Concrete: 60 Brick: 5 DamageTypes: Prone50Percent, TriggerProne, FireDeath, Incendiary Warhead@2Smu: LeaveSmudge @@ -172,35 +166,48 @@ InfernoBomb: ValidTargets: Ground, Water, Infantry, Vehicle ThrowWithoutTarget: true +InfernoBombTargeter: + Range: 13c0 + ReloadDelay: 50 + Projectile: InstantHit + GeneticMutationBomb: ReloadDelay: 25 Range: 1c0 Report: bwhis.aud Projectile: GravityBomb - Image: B2BOMB + Image: bigbomb Velocity: 15, 0, -35 Acceleration: 0, 0, 0 Shadow: true - Warhead@COND: GrantExternalCondition - Range: 3c0 - Duration: 15 + Warhead@COND: GrantExternalConditionCA + Range: 4c0 + Duration: 16 Condition: geneticmutation ValidTargets: Infantry InvalidTargets: MindControlImmune Warhead@MUT: FireShrapnel Weapon: GeneticMutation AimChance: 100 - Amount: 10 - Delay: 10 + Amount: 6 + Delay: 8 + ImpactActors: false Warhead@3Eff: CreateEffect Explosions: mutablast ExplosionPalette: mutablast ImpactSounds: gmutation.aud +GeneticMutationBomb.UPG: + Inherits: GeneticMutationBomb + Warhead@COND: GrantExternalConditionCA + Range: 5c0 + Warhead@MUT: FireShrapnel + Weapon: GeneticMutation.UPG + Amount: 9 + GeneticMutation: - Range: 2c512 - ValidTargets: Infantry - InvalidTargets: MindControlImmune + Range: 4c0 + ValidTargets: GeneticallyMutatable Projectile: PlasmaBeam Duration: 7 Colors: ff509a08 @@ -210,13 +217,42 @@ GeneticMutation: Distortion: 150 DistortionAnimation: 150 SegmentLength: 350 - ZOffset: 1027 + ZOffset: 512 Warhead@1Dam: SpreadDamage Spread: 42 Damage: 50000 DamageTypes: MutatedDeath - ValidTargets: Infantry - InvalidTargets: MindControlImmune + ValidTargets: GeneticallyMutatable + +GeneticMutation.UPG: + Inherits: GeneticMutation + Range: 5c0 + +HeliosBomb: + Inherits: ParaBomb + Range: 1c0 + ReloadDelay: 80 + Projectile: GravityBomb + Image: heliosbomb + Shadow: true + Velocity: 15, 0, -35 + Warhead@3Eff: CreateEffect + Explosions: heliosexplode + ImpactSounds: heliosexplode.aud + Delay: 1 + ExplosionPalette: effect-ignore-lighting + Warhead@4Eff: CreateEffect + Explosions: heliosexplode2 + Delay: 3 + ExplosionPalette: effect-ignore-lighting + Warhead@Blind: GrantExternalConditionCA + Range: 8c0 + Duration: 200 + Condition: blinded + InvalidTargets: BlindImmune + Warhead@Flash: FlashEffect + Duration: 10 + FlashType: Nuke Atomic: ValidTargets: Ground, Trees, Water, Underwater, Air, AirSmall @@ -226,8 +262,7 @@ Atomic: Falloff: 1000, 368, 135, 50, 18, 7, 0 ValidTargets: Ground, Trees, Water, Underwater, Air, AirSmall Versus: - Wood: 25 - Brick: 25 + Wood: 28 Heavy: 80 DamageTypes: Prone50Percent, TriggerProne, FireDeath, Incendiary Warhead@2Res_impact: DestroyResource @@ -248,8 +283,7 @@ Atomic: Delay: 5 ValidTargets: Ground, Trees, Water, Underwater, Air, AirSmall Versus: - Wood: 25 - Brick: 25 + Wood: 28 Heavy: 80 DamageTypes: Prone50Percent, TriggerProne, FireDeath, Incendiary Warhead@6Res_areanuke1: DestroyResource @@ -272,7 +306,6 @@ Atomic: ValidTargets: Ground, Water, Underwater, Air, AirSmall Versus: Wood: 50 - Brick: 25 Heavy: 80 DamageTypes: Prone50Percent, TriggerProne, FireDeath, Incendiary Warhead@11Res_areanuke2: DestroyResource @@ -291,7 +324,6 @@ Atomic: ValidTargets: Ground, Trees, Water, Underwater, Air, AirSmall Versus: Tree: 200 - Brick: 25 DamageTypes: Prone50Percent, TriggerProne, FireDeath, Incendiary Warhead@15Res_areanuke3: DestroyResource Size: 4 @@ -309,7 +341,6 @@ Atomic: ValidTargets: Ground, Trees, Water, Underwater, Air, AirSmall Versus: Tree: 200 - Brick: 25 DamageTypes: Prone50Percent, TriggerProne, FireDeath, Incendiary Warhead@19Res_areanuke4: DestroyResource Size: 5 @@ -323,7 +354,7 @@ Atomic: Duration: 20 Intensity: 5 Multiplier: 1,1 - Warhead@22FlashEffect: FlashPaletteEffect + Warhead@22FlashEffect: FlashEffect Duration: 20 FlashType: Nuke Warhead@Flames: FireCluster @@ -343,28 +374,28 @@ IonCannon: Warhead@1Dam: SpreadDamage Range: 0, 0c512, 1c512, 2c512 Damage: 10500 - Falloff: 1000, 350, 100, 50 + Falloff: 1000, 400, 100, 50 ValidTargets: Ground Versus: None: 25 Light: 65 Wood: 15 Heavy: 70 - DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath + DamageTypes: TriggerProne, ExplosionDeath Warhead@2Dam: SpreadDamage Range: 0, 0c512, 1c512, 2c512 Damage: 3000 - Falloff: 1000, 350, 100, 50 + Falloff: 1000, 400, 100, 50 ValidTargets: Cyborg Versus: Heavy: 0 - DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath + DamageTypes: TriggerProne, ExplosionDeath Warhead@3Dam: SpreadDamage Range: 0, 0c682, 1c341, 2c682 Damage: 34000 Falloff: 100, 100, 35, 10 ValidTargets: Air, AirSmall - DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath + DamageTypes: TriggerProne, ExplosionDeath Warhead@4Eff: CreateEffect Explosions: ion_ring2 ExplosionPalette: tseffect @@ -400,11 +431,12 @@ Empicbm: ExplosionPalette: tseffect-ignore-lighting-alpha75 Explosions: pulse_explosion ImpactSounds: empexpl.aud - Warhead@emp: GrantExternalCondition + Warhead@emp: GrantExternalConditionCA Range: 5c0 Duration: 500 Condition: empdisable - ValidTargets: Ground, Vehicle, Air + ValidTargets: Vehicle, Ship, Structure, Air + InvalidTargets: EmpImmune Warhead@2Smu_impact: LeaveSmudge SmudgeType: Scorch-NoFlame Warhead@3Smu_area: LeaveSmudge @@ -423,7 +455,7 @@ EMPMissileLauncher: Range: 300c0 MinRange: 3c0 Report: icbm1.aud - Projectile: Bullet + Projectile: BulletCA Blockable: false Shadow: true Inaccuracy: 0 @@ -433,7 +465,8 @@ EMPMissileLauncher: TrailImage: smokey2 TrailPalette: tseffect-ignore-lighting-alpha75 TrailDelay: 3 - ContrailColor: cc550080 + ContrailStartColor: cc550080 + ContrailStartColorAlpha: 128 ContrailLength: 25 ContrailDelay: 3 Speed: 300 @@ -449,7 +482,7 @@ EMPMissileLauncher: Light: 60 Heavy: 40 Concrete: 60 - Brick: 50 + Brick: 5 Warhead@1Dam_impact: SpreadDamage Range: 0, 1c1, 2c1, 3c1, 3c512, 4c1, 4c512 Damage: 4500 @@ -461,21 +494,29 @@ EMPMissileLauncher: Light: 20 Heavy: 20 Concrete: 20 - Brick: 20 + Brick: 5 Warhead@2Eff: CreateEffect ExplosionPalette: tseffect-ignore-lighting-alpha75 Explosions: pulse_explosion ImpactSounds: empexpl.aud - Warhead@emp1: GrantExternalCondition - Range: 2c256 + Warhead@emp1: GrantExternalConditionCA + Range: 1c512 Duration: 600 Condition: empdisable - ValidTargets: Ground, Vehicle, Air - Warhead@emp2: GrantExternalCondition - Range: 4c512 + ValidTargets: Vehicle, Ship, Structure, Air + InvalidTargets: EmpImmune + Warhead@emp2: GrantExternalConditionCA + Range: 3c0 Duration: 300 Condition: empdisable - ValidTargets: Ground, Vehicle, Air + ValidTargets: Vehicle, Ship, Structure, Air + InvalidTargets: EmpImmune + Warhead@emp3: GrantExternalConditionCA + Range: 4c512 + Duration: 150 + Condition: empdisable + ValidTargets: Vehicle, Ship, Structure, Air + InvalidTargets: EmpImmune Warhead@2Smu_impact: LeaveSmudge SmudgeType: Crater Warhead@3Smu_area: LeaveSmudge @@ -509,25 +550,19 @@ FirestormBarrage: Speed: 220 LaunchAngle: 65 ContrailLength: 30 - ContrailColor: cc550080 + ContrailStartColor: cc550080 + ContrailStartColorAlpha: 128 Warhead@1Dam: SpreadDamage Spread: 1c0 Damage: 30000 Versus: - None: 70 + None: 80 Wood: 40 Light: 100 - Heavy: 80 + Heavy: 90 Concrete: 80 Brick: 5 DamageTypes: Prone50Percent, TriggerProne, FireDeath, Incendiary - Warhead@1Dam_cyborg: SpreadDamage - Spread: 1c0 - Damage: 10000 - ValidTargets: Cyborg - Versus: - Heavy: 0 - DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath Warhead@2Eff: CreateEffect Explosions: b2bexp, b2bexp2 ExplosionPalette: tseffect @@ -565,7 +600,7 @@ IronCurtain: ValidTargets: Ground, Infantry, Water Warhead@1Dam_impact: SpreadDamage Range: 0, 1c1, 2c1, 2c512 - Damage: 500 + Damage: 250 Delay: 5 Falloff: 1000, 1000, 250, 100 ValidTargets: Ground, Infantry, Water @@ -579,7 +614,7 @@ IronCurtain: Brick: 0 Warhead@2Dam_impact: SpreadDamage Range: 0, 1c1, 2c1, 2c512 - Damage: 500 + Damage: 250 Delay: 10 Falloff: 1000, 1000, 250, 100 ValidTargets: Ground, Infantry, Water @@ -593,7 +628,7 @@ IronCurtain: Brick: 0 Warhead@3Dam_impact: SpreadDamage Range: 0, 1c1, 2c1, 2c512 - Damage: 500 + Damage: 250 Delay: 15 Falloff: 1000, 1000, 250, 100 ValidTargets: Ground, Infantry, Water @@ -630,7 +665,7 @@ ForceShield: Warhead@4Eff: CreateEffect ExplosionPalette: effect-ignore-lighting-alpha85 Explosions: forceshield_effect - Warhead@fspower: GrantExternalCondition + Warhead@fspower: GrantExternalConditionCA Range: 15c0 Duration: 500 Condition: forcedisabled @@ -640,29 +675,15 @@ ForceShield: StealthBubble: Projectile: InstantExplode ReloadDelay: 1 - ValidTargets: Ground, Infantry, Water - Warhead@1Dam_impact: SpreadDamage + ValidTargets: Ground, Water + Warhead@1Dam: SpreadDamage Range: 0, 1c1, 2c1, 2c512 - Damage: 300 + Damage: 450 Delay: 5 Falloff: 1000, 1000, 250, 100 - ValidTargets: Ground, Infantry, Water - InvalidTargets: Air, Creep, Cyborg - DamageTypes: Prone50Percent, TriggerProne, ToxinDeath - Versus: - None: 100 - Wood: 0 - Light: 0 - Heavy: 0 - Concrete: 0 - Brick: 0 - Warhead@2Dam_impact: SpreadDamage - Range: 0, 1c1, 2c1, 4c0 - Damage: 250 - Delay: 10 - Falloff: 1000, 1000, 250, 100 - ValidTargets: Ground, Infantry, Water - InvalidTargets: Air, Creep, Cyborg + ValidTargets: Infantry + InvalidTargets: Cyborg + ValidRelationships: Enemy, Neutral DamageTypes: Prone50Percent, TriggerProne, RadiationDeath Versus: None: 100 @@ -671,14 +692,14 @@ StealthBubble: Heavy: 0 Concrete: 0 Brick: 0 - Warhead@3Dam_impact: SpreadDamage - Range: 0, 1c1, 2c1, 5c512 - Damage: 250 - Delay: 15 + Warhead@2Dam: SpreadDamage + Range: 0, 1c1, 2c1, 2c512 + Damage: 450 + Delay: 5 Falloff: 1000, 1000, 250, 100 - ValidTargets: Ground, Infantry, Water - InvalidTargets: Air, Creep, Cyborg - DamageTypes: Prone50Percent, TriggerProne, RadiationDeath + ValidTargets: Infantry + InvalidTargets: Cyborg, Hazmat + DamageTypes: Prone50Percent, TriggerProne, ToxinDeath Versus: None: 100 Wood: 0 @@ -686,7 +707,7 @@ StealthBubble: Heavy: 0 Concrete: 0 Brick: 0 - Warhead@4Eff: CreateEffect + Warhead@2Eff: CreateEffect ExplosionPalette: tseffect Explosions: stealthbub @@ -700,11 +721,12 @@ Chemicbm: InvalidTargets: Creep Versus: None: 36 - Wood: 20 + Wood: 60 Concrete: 100 Light: 65 Heavy: 100 Brick: 10 + Aircraft: 160 DamageTypes: Prone50Percent, TriggerProne, ToxinDeath Warhead@3Eff_impact: CreateEffect Explosions: chem_miss @@ -719,11 +741,12 @@ Chemicbm: InvalidTargets: Creep Versus: None: 36 - Wood: 45 + Wood: 50 Concrete: 120 Light: 65 Heavy: 100 Brick: 10 + Aircraft: 160 AffectsParent: true DamageTypes: Prone50Percent, TriggerProne, ToxinDeath Warhead@3Dam_chem2: SpreadDamage @@ -735,11 +758,12 @@ Chemicbm: InvalidTargets: Creep Versus: None: 36 - Wood: 140 + Wood: 145 Concrete: 210 Light: 85 Heavy: 140 Brick: 10 + Aircraft: 160 AffectsParent: true DamageTypes: Prone50Percent, TriggerProne, ToxinDeath Warhead@4Dam_chem2: SpreadDamage @@ -751,11 +775,12 @@ Chemicbm: InvalidTargets: Creep Versus: None: 36 - Wood: 170 + Wood: 175 Concrete: 210 Light: 85 Heavy: 140 Brick: 10 + Aircraft: 160 AffectsParent: true DamageTypes: Prone50Percent, TriggerProne, ToxinDeath Warhead@11Smu_areanuke3: LeaveSmudge @@ -770,40 +795,45 @@ Chemicbm: MaxLevel: 750 LayerName: radioactivity.strong Warhead@13Spawn: SpawnActor - Actors: camera.cloud + Actors: toxiccloud Range: 5 ForceGround: false Image: Cloud1d Palette: tseffect-ignore-lighting-alpha75 ValidTargets: Ground, Water + ImpactActors: false Warhead@14Spawn: SpawnActor - Actors: camera.cloud2, camera.cloud + Actors: toxiccloud2, toxiccloud Range: 5 ForceGround: false Image: Cloud1d Palette: tseffect-ignore-lighting-alpha75 ValidTargets: Ground, Water + ImpactActors: false Warhead@15Spawn: SpawnActor - Actors: camera.cloud2, camera.cloud + Actors: toxiccloud2, toxiccloud Range: 5 ForceGround: false Image: Cloud1d Palette: tseffect-ignore-lighting-alpha75 ValidTargets: Ground, Water + ImpactActors: false Warhead@16Spawn: SpawnActor - Actors: camera.cloud2 + Actors: toxiccloud2 Range: 5 ForceGround: false Image: Cloud2d Palette: tseffect-ignore-lighting-alpha75 ValidTargets: Ground, Water + ImpactActors: false Warhead@17Spawn: SpawnActor - Actors: camera.cloud2 + Actors: toxiccloud2 Range: 5 ForceGround: false Image: Cloud2d Palette: tseffect-ignore-lighting-alpha75 ValidTargets: Ground, Water + ImpactActors: false Warhead@Shrap: FireShrapnel Weapon: ChemDebris Amount: 10 @@ -814,25 +844,15 @@ Chemicbm: IonStormInit: Projectile: InstantExplode ReloadDelay: 1 - Warhead@2: SpawnSmokeParticle + Warhead@2: SpawnMultiWeaponImpact ValidTargets: Ground, Air, Water - Delay: 0 - Sequences: inviso - Palette: effect - Weapon: IonCloudRandomInit - Duration: 220 - -IonCloudRandomInit: - Projectile: InstantHit - ReloadDelay: 25 - Warhead@barrage3: FireShrapnel Weapon: IonCloud - Amount: 1 - AimChance: 50 - ValidTargets: Air, Ground, Water + ImpactActors: false + ImpactOffsets: 0,0, 0,0, -4,0, 4,0, 0,-4, 0,4, -2,-2, 2,2, -2,2, 2,-2 + RandomImpactSequence: true IonCloud: - ReloadDelay: 220 + ReloadDelay: 25 Range: 5c0 Projectile: AthenaProjectile Altitude: 5c768 @@ -841,6 +861,7 @@ IonCloud: Weapon: IonBolt ValidTargets: Air, Ground, Water Delay: 28 + ImpactActors: false Warhead@TargetValidation: SpreadDamage IonBolt: @@ -851,14 +872,16 @@ IonBolt: Range: 0, 1c1, 2c1, 3c1, 4c1 Delay: 1 Damage: 2650 - Falloff: 1000, 1000, 250, 100, 75 + Falloff: 1000, 1000, 200, 100, 75 ValidTargets: Ground, Water, Underwater, Air, AirSmall DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath Versus: - None: 30 + None: 50 Concrete: 300 - Heavy: 80 - Light: 55 + Heavy: 120 + Light: 75 + Wood: 105 + Aircraft: 280 Warhead@4Effect: CreateEffect Explosions: ionbeam ExplosionPalette: tdeffect-ignore-lighting-alpha85 @@ -888,7 +911,7 @@ IonBolt: ImpactActors: false Warhead@10Eff: CreateEffect Image: ionsfx - Explosions: idle + Explosions: idle ExplosionPalette: tdeffect-ignore-lighting-alpha85 Warhead@11Eff: CreateEffect Explosions: ion_ring2 @@ -945,8 +968,8 @@ DeathHandCluster: Versus: None: 90 Concrete: 50 - Brick: 20 - Wood: 30 + Brick: 75 + Wood: 25 Light: 60 Heavy: 60 DamageTypes: Prone50Percent, TriggerProne, FireDeath, Incendiary @@ -973,70 +996,27 @@ DeathHandCluster: WeatherStormInit: Projectile: InstantExplode ReloadDelay: 1 - Warhead@1: SpawnSmokeParticle + Warhead@1: SpawnMultiWeaponImpact ValidTargets: Ground, Air, Water - Sequences: inviso - Palette: ra2effect - Weapon: WeatherCloudDirectInit - Duration: 210 Delay: 50 - Warhead@2: SpawnSmokeParticle - ValidTargets: Ground, Air, Water - Delay: 50 - Sequences: inviso - Palette: ra2effect - Weapon: WeatherCloudRandomInit - Duration: 210 + Weapon: WeatherCloud + ImpactActors: false + ImpactOffsets: 0,0, -1,-1, 1,-1, -1,1, 1,1, -2,-2, 0,-2, 2,-2, -2,0, 2,0, -2,2, 0,2, 2,2, -3,-3, -1,-3, 1,-3, 3,-3, -3,-1, 3,-1, -3,1, 3,1, -3,3, -1,3, 1,3, 3,3, -5,-1, -5,1, -4,-2, -4,0, -4,2, -1,-5, 1,-5, -2,-4, 0,-4, 2,-4, 4,-2, 4,0, 4,2, 5,-1, 5,1, -2,4, 0,4, 2,4, -1,5, 1,5 + RandomImpactSequence: true + RandomOffset: 512 + Interval: 5 + Warhead@DirectDamage: SpreadDamage + Damage: 48000 + Range: 0, 2c0 + Falloff: 100, 0 + Delay: 78 Warhead@4: CreateEffect Delay: 50 ImpactSounds: sweaintr.aud ValidTargets: Ground, Air, Water -WeatherCloudDirectInit: - Projectile: InstantHit - ReloadDelay: 140 - ValidTargets: Air - Warhead@Dam1: SpreadDamage - Range: 0, 1c1, 2c1, 3c1 - Falloff: 1000, 660, 330, 0 - Damage: 500 - AffectsParent: true - ValidTargets: Air, AirSmall - Delay: 28 - DamageTypes: TriggerProne, ElectritcyDeath - Versus: - Wood: 85 - Heavy: 75 - Concrete: 45 - Brick: 55 - Warhead@barrage3: FireFragment - Weapon: WeatherCloud - ValidTargets: Air, Ground, Water - -WeatherCloudRandomInit: - Projectile: InstantHit - ReloadDelay: 8 - Warhead@Dam1: SpreadDamage - Spread: 3c0 - Falloff: 100, 66, 33, 0 - Damage: 180 - AffectsParent: true - ValidTargets: Air, AirSmall - Delay: 28 - DamageTypes: TriggerProne, ElectricityDeath - Versus: - Wood: 85 - Heavy: 75 - Concrete: 15 - Brick: 15 - Warhead@barrage3: FireShrapnel - Weapon: WeatherCloud - Amount: 2 - AimChance: 50 - ValidTargets: Air, Ground, Water - WeatherCloud: - ReloadDelay: 120 + ReloadDelay: 8 Range: 6c512 Projectile: AthenaProjectile Altitude: 5c768 @@ -1045,11 +1025,25 @@ WeatherCloud: Weapon: WeatherBolt ValidTargets: Air, Ground, Water Delay: 28 + ImpactActors: false Warhead@TargetValidation: SpreadDamage Warhead@4: CreateEffect Explosions: weathercloud1, weathercloud2, weathercloud1f, weathercloud2f ExplosionPalette: ra2unit ValidTargets: Ground, Air, Water + Warhead@Shadow: FireFragment + UseZOffsetAsAbsoluteHeight: true + Weapon: WeatherCloudShadow + ValidTargets: Ground, Air, Water + ImpactActors: false + +WeatherCloudShadow: + Projectile: InstantHit + Range: 512 + Warhead@Shadow: CreateEffect + Explosions: weathercloudshadow + ValidTargets: Ground, Air, Water + Inaccuracy: 341 WeatherBolt: Projectile: InstantHit @@ -1063,12 +1057,13 @@ WeatherBolt: ValidTargets: Ground, Air, AirSmall, Underwater, Water DamageTypes: TriggerProne, ElectricityDeath Versus: - None: 20 - Wood: 70 + None: 35 + Wood: 65 Concrete: 150 - Brick: 55 - Heavy: 65 - Light: 35 + Brick: 5 + Heavy: 85 + Light: 55 + Aircraft: 175 Warhead@4: CreateEffect Explosions: weatherbolt1, weatherbolt2, weatherbolt3, weatherbolt1f, weatherbolt2f, weatherbolt3f ImpactSounds: sweastra.aud, sweastrb.aud, sweastrc.aud, sweastrd.aud @@ -1111,7 +1106,7 @@ GpsScramble: Image: crate-effects Explosions: stealth -ChronoAI: +TemporalIncursion: ReloadDelay: 1 Projectile: InstantExplode Warhead@2Eff: CreateEffect @@ -1120,13 +1115,19 @@ ChronoAI: ValidTargets: Ground, Air, Water ImpactSounds: chrono2.aud Warhead@teleport: SpawnActor - Actors: 2tnk.chrono, 2tnk.chrono, 2tnk.chrono, arty.chrono, arty.chrono + Actors: 2tnk.temp, 2tnk.temp, tnkd.temp, arty.temp, jeep.temp Range: 5 Image: chronoappear Sequence: idle - ValidTargets: Air, Ground, Water + ValidTargets: Ground, Water + ImpactActors: false Warhead@3Flash: ChronoFlashEffect +ChronoAI: + Inherits: TemporalIncursion + Warhead@teleport: SpawnActor + Actors: 2tnk.chrono, 2tnk.chrono, 2tnk.chrono, arty.chrono, arty.chrono + TimeWarp: ValidTargets: Temporal ReloadDelay: 1 @@ -1141,13 +1142,12 @@ TimeWarp: ClusterMineSpawner: ValidTargets: Ground, Water - InvalidTargets: Air ReloadDelay: 50 Report: bwhis.aud Range: 2c0 TargetActorCenter: true Projectile: Bullet - Image: b2bomb + Image: bigbomb Speed: 78 LaunchAngle: 10 Shadow: true @@ -1160,17 +1160,17 @@ ClusterMineSpawner: ImpactSounds: scluster.aud Delay: 15 ValidTargets: Air, Structure, Bridge - Warhead@Cluster: FireCluster + Warhead@Cluster: FireClusterCA Weapon: MineSpawner - RandomClusterCount: 5 + RandomClusterCount: 6 Dimensions: 3,3 - Footprint: xXx x_x xXx + Footprint: xxx x_x xxx ValidTargets: Ground, Air - Warhead@ClusterWater: FireCluster + Warhead@ClusterWater: FireClusterCA Weapon: MineSpawnerWater RandomClusterCount: 5 Dimensions: 3,3 - Footprint: xXx x_x xXx + Footprint: xxx x_x xxx ValidTargets: Water, Air MineSpawner: @@ -1202,7 +1202,7 @@ MineSpawner: ImpactSounds: mineblo1.aud ValidTargets: Structure Warhead@1Spa: SpawnActor - Actors: PROXYMINESPAWN + Actors: proxyminespawn Range: 1 ForceGround: false ValidTargets: Ground, Air @@ -1237,8 +1237,148 @@ MineSpawnerWater: ImpactSounds: mineblo1.aud ValidTargets: Structure Warhead@1Spa: SpawnActor - Actors: PROXYMINESPAWNWATER + Actors: proxyminespawnwater Range: 1 ForceGround: false ValidTargets: Water, Air - InvalidTargets: Structure \ No newline at end of file + InvalidTargets: Structure + +Cryostorm: + ReloadDelay: 5 + Range: 1c0 + Projectile: InstantHit + Warhead@1Dam: SpreadDamage + Spread: 4c512 + Damage: 50 + Falloff: 100, 0 + Versus: + Wood: 0 + Light: 10 + Heavy: 0 + Concrete: 0 + Brick: 0 + DamageTypes: FrozenDeath + Warhead@1Eff: CreateEffect + Explosions: cryoblast, cryohit, cryohit, cryohit + ExplosionPalette: ra2effect-ignore-lighting-alpha75 + Inaccuracy: 3c512 + Delay: 7 + Warhead@2Eff: CreateEffect + Explosions: cryoblast, cryohit, cryohit, cryohit + ExplosionPalette: ra2effect-ignore-lighting-alpha75 + Inaccuracy: 3c512 + Delay: 8 + +CryostormInit: + ReloadDelay: 25 + Range: 1c0 + Projectile: InstantHit + Warhead@1Eff: CreateEffect + Explosions: cryohit + ExplosionPalette: ra2effect-ignore-lighting-alpha50 + Inaccuracy: 3c512 + Warhead@2Eff: CreateEffect + Explosions: cryohit + ExplosionPalette: ra2effect-ignore-lighting-alpha50 + Inaccuracy: 3c512 + Delay: 5 + +OverlordsWrath: + Projectile: InstantHit + Warhead@1Dam: SpreadDamage + Spread: 4c0 + Damage: 75000 + Falloff: 100, 0 + Versus: + None: 20 + Light: 65 + Heavy: 90 + Concrete: 85 + DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath + Warhead@3Eff_impact: CreateEffect + Image: tibmeteor + Explosions: hit + ExplosionPalette: caneon + ImpactSounds: owrath-impact.aud + Warhead@2Smu: LeaveSmudge + SmudgeType: Crater + Size: 2 + InvalidTargets: Vehicle, Structure, Wall, Husk, Trees + Warhead@3Res: CreateResource + AddsResourceType: Tiberium + Size: 1 + Warhead@4Res: CreateResource + AddsResourceType: Tiberium + Size: 2 + Delay: 5 + Warhead@Shrap: FireShrapnel + Weapon: ChemDebris + Amount: 5 + AimChance: 0 + ValidTargets: Ground, Water, Infantry, Vehicle + ThrowWithoutTarget: true + Warhead@18Radio: CreateTintedCells + Spread: 1c0 + Level: 350 + Falloff: 100, 75, 52, 37, 24, 15, 2 + MaxLevel: 750 + LayerName: radioactivity.weak + Warhead@22FlashEffect: FlashEffect + Duration: 10 + FlashType: OverlordsWrath + +SubterraneanStrikeSpawner: + ReloadDelay: 500 + Projectile: InstantExplode + Warhead@Spawn: SpawnActor + Actors: mole + Range: 3 + ValidTargets: Ground, Water + ImpactActors: false + AvoidActors: true + Prerequisites: !tmpp + Warhead@SpawnUpg: SpawnActor + Actors: mole.upg + Range: 3 + ValidTargets: Ground, Water + ImpactActors: false + AvoidActors: true + Prerequisites: tmpp + Warhead@Shake: ShakeScreen + Duration: 10 + Intensity: 2 + Multiplier: 0.5,0.5 + +SubterraneanAPCUnburrow: + ReloadDelay: 500 + Projectile: InstantExplode + Warhead@3Eff: CreateEffect + Explosions: unburrow + Image: substrikehole + ImpactSounds: subdril1.aud + Warhead@Dirt1: FireShrapnel + Weapon: TinyDebris + Amount: 50 + AimChance: 0 + ValidTargets: Ground, Infantry, Vehicle + ThrowWithoutTarget: true + Warhead@Dirt2: FireShrapnel + Weapon: BurrowDebris + Delay: 10 + Amount: 25 + AimChance: 0 + ValidTargets: Ground, Infantry, Vehicle + ThrowWithoutTarget: true + +SubterraneanAPCBurrow: + Inherits: SubterraneanAPCUnburrow + Warhead@3Eff: CreateEffect + Explosions: burrow + Warhead@Dirt1: FireShrapnel + Weapon: BurrowDebris + +BurrowDebris: + Inherits: TinyDebris + Range: 1c512 + Projectile: Bullet + BounceCount: 1 diff --git a/packaging/functions.sh b/packaging/functions.sh new file mode 100644 index 0000000000..e371f22706 --- /dev/null +++ b/packaging/functions.sh @@ -0,0 +1,53 @@ +#!/bin/sh +# Helper functions for packaging and installing projects using the OpenRA Mod SDK + +#### +# This file must stay /bin/sh and POSIX compliant for macOS and BSD portability. +# Copy-paste the entire script into https://shellcheck.net to check. +#### + +# Compile and publish any mod assemblies to the target directory +# Arguments: +# SRC_PATH: Path to the root SDK directory +# DEST_PATH: Path to the root of the install destination (will be created if necessary) +# TARGETPLATFORM: Platform type (win-x86, win-x64, osx-x64, linux-x64, unix-generic) +# RUNTIME: Runtime type (net6, mono) +# ENGINE_PATH: Path to the engine root directory +install_mod_assemblies() { + SRC_PATH="${1}" + DEST_PATH="${2}" + TARGETPLATFORM="${3}" + RUNTIME="${4}" + ENGINE_PATH="${5}" + + ORIG_PWD=$(pwd) + cd "${SRC_PATH}" || exit 1 + + if [ "${RUNTIME}" = "mono" ]; then + echo "Building assemblies" + + rm -rf "${ENGINE_PATH:?}/bin" + + find . -maxdepth 1 -name '*.sln' -exec msbuild -verbosity:m -nologo -t:Build -restore -p:Configuration=Release -p:TargetPlatform="${TARGETPLATFORM}" -p:Mono=true \; + + cd "${ORIG_PWD}" || exit 1 + for LIB in "${ENGINE_PATH}/bin/"*.dll "${ENGINE_PATH}/bin/"*.dll.config; do + install -m644 "${LIB}" "${DEST_PATH}" + done + + if [ "${TARGETPLATFORM}" = "linux-x64" ] || [ "${TARGETPLATFORM}" = "linux-arm64" ]; then + for LIB in "${ENGINE_PATH}/bin/"*.so; do + install -m755 "${LIB}" "${DEST_PATH}" + done + fi + + if [ "${TARGETPLATFORM}" = "osx-x64" ] || [ "${TARGETPLATFORM}" = "osx-arm64" ]; then + for LIB in "${ENGINE_PATH}/bin/"*.dylib; do + install -m755 "${LIB}" "${DEST_PATH}" + done + fi + else + find . -maxdepth 1 -name '*.sln' -exec dotnet publish -c Release -p:TargetPlatform="${TARGETPLATFORM}" -r "${TARGETPLATFORM}" -p:PublishDir="${DEST_PATH}" --self-contained true \; + cd "${ORIG_PWD}" || exit 1 + fi +} diff --git a/packaging/linux/buildpackage.sh b/packaging/linux/buildpackage.sh index bc9d55999d..c8bd0d1886 100755 --- a/packaging/linux/buildpackage.sh +++ b/packaging/linux/buildpackage.sh @@ -4,7 +4,6 @@ set -e command -v make >/dev/null 2>&1 || { echo >&2 "The OpenRA mod SDK Linux packaging requires make."; exit 1; } command -v python3 >/dev/null 2>&1 || { echo >&2 "The OpenRA mod SDK Linux packaging requires python 3."; exit 1; } -command -v tar >/dev/null 2>&1 || { echo >&2 "The OpenRA mod SDK Linux packaging requires tar."; exit 1; } command -v curl >/dev/null 2>&1 || command -v wget > /dev/null 2>&1 || { echo >&2 "The OpenRA mod SDK Linux packaging requires curl or wget."; exit 1; } require_variables() { @@ -37,7 +36,6 @@ if [ -f "${TEMPLATE_ROOT}/user.config" ]; then fi require_variables "MOD_ID" "ENGINE_DIRECTORY" "PACKAGING_DISPLAY_NAME" "PACKAGING_INSTALLER_NAME" "PACKAGING_COPY_CNC_DLL" "PACKAGING_COPY_D2K_DLL" \ - "PACKAGING_APPIMAGE_DEPENDENCIES_TAG" "PACKAGING_APPIMAGE_DEPENDENCIES_SOURCE" "PACKAGING_APPIMAGE_DEPENDENCIES_TEMP_ARCHIVE_NAME" \ "PACKAGING_FAQ_URL" "PACKAGING_OVERWRITE_MOD_VERSION" TAG="$1" @@ -59,6 +57,7 @@ if [ ! -f "${TEMPLATE_ROOT}/${ENGINE_DIRECTORY}/Makefile" ]; then fi . "${TEMPLATE_ROOT}/${ENGINE_DIRECTORY}/packaging/functions.sh" +. "${TEMPLATE_ROOT}/packaging/functions.sh" if [ ! -d "${OUTPUTDIR}" ]; then echo "Output directory '${OUTPUTDIR}' does not exist."; @@ -66,7 +65,7 @@ if [ ! -d "${OUTPUTDIR}" ]; then fi echo "Building core files" -install_assemblies_mono "${TEMPLATE_ROOT}/${ENGINE_DIRECTORY}" "${APPDIR}/usr/lib/openra" "linux-x64" "True" "${PACKAGING_COPY_CNC_DLL}" "${PACKAGING_COPY_D2K_DLL}" +install_assemblies "${TEMPLATE_ROOT}/${ENGINE_DIRECTORY}" "${APPDIR}/usr/lib/openra" "linux-x64" "net6" "True" "${PACKAGING_COPY_CNC_DLL}" "${PACKAGING_COPY_D2K_DLL}" install_data "${TEMPLATE_ROOT}/${ENGINE_DIRECTORY}" "${APPDIR}/usr/lib/openra" for f in ${PACKAGING_COPY_ENGINE_FILES}; do @@ -75,17 +74,10 @@ for f in ${PACKAGING_COPY_ENGINE_FILES}; do done echo "Building mod files" -pushd "${TEMPLATE_ROOT}" > /dev/null -make all -popd > /dev/null +install_mod_assemblies "${TEMPLATE_ROOT}" "${APPDIR}/usr/lib/openra" "linux-x64" "net6" "${TEMPLATE_ROOT}/${ENGINE_DIRECTORY}" cp -Lr "${TEMPLATE_ROOT}/mods/"* "${APPDIR}/usr/lib/openra/mods" -for f in ${PACKAGING_COPY_MOD_BINARIES}; do - mkdir -p "${APPDIR}/usr/lib/openra/$(dirname "${f}")" - cp "${TEMPLATE_ROOT}/${ENGINE_DIRECTORY}/bin/${f}" "${APPDIR}/usr/lib/openra/${f}" -done - set_engine_version "${ENGINE_VERSION}" "${APPDIR}/usr/lib/openra" if [ "${PACKAGING_OVERWRITE_MOD_VERSION}" == "True" ]; then set_mod_version "${TAG}" "${APPDIR}/usr/lib/openra/mods/${MOD_ID}/mod.yaml" @@ -95,27 +87,15 @@ else fi # Add native libraries -echo "Downloading dependencies" +echo "Downloading appimagetool" if command -v curl >/dev/null 2>&1; then - curl -s -L -o "${PACKAGING_APPIMAGE_DEPENDENCIES_TEMP_ARCHIVE_NAME}" -O "${PACKAGING_APPIMAGE_DEPENDENCIES_SOURCE}" || exit 3 - 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 "${PACKAGING_APPIMAGE_DEPENDENCIES_SOURCE}" -O "${PACKAGING_APPIMAGE_DEPENDENCIES_TEMP_ARCHIVE_NAME}" || exit 3 - 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" -tar xf "${PACKAGING_APPIMAGE_DEPENDENCIES_TEMP_ARCHIVE_NAME}" -C "${APPDIR}" -chmod 0755 "${APPDIR}/usr/bin/mono" -chmod 0644 "${APPDIR}/etc/mono/config" -chmod 0644 "${APPDIR}/etc/mono/4.5/machine.config" -chmod 0644 "${APPDIR}/usr/lib/mono/4.5/Facades/"*.dll -chmod 0644 "${APPDIR}/usr/lib/mono/4.5/"*.dll "${APPDIR}/usr/lib/mono/4.5/"*.exe -chmod 0755 "${APPDIR}/usr/lib/"*.so - -rm -rf "${PACKAGING_APPIMAGE_DEPENDENCIES_SOURCE}" - # Add launcher and icons sed "s/{MODID}/${MOD_ID}/g" "${TEMPLATE_ROOT}/${ENGINE_DIRECTORY}/packaging/linux/AppRun.in" | sed "s/{MODNAME}/${PACKAGING_DISPLAY_NAME}/g" > "${APPDIR}/AppRun" chmod 0755 "${APPDIR}/AppRun" @@ -162,7 +142,6 @@ sed "s/{MODID}/${MOD_ID}/g" "${TEMPLATE_ROOT}/${ENGINE_DIRECTORY}/packaging/linu chmod 0755 "${APPDIR}/usr/bin/openra-${MOD_ID}-utility" install -m 0755 "${TEMPLATE_ROOT}/${ENGINE_DIRECTORY}/packaging/linux/gtk-dialog.py" "${APPDIR}/usr/bin/gtk-dialog.py" -install -m 0755 "${TEMPLATE_ROOT}/${ENGINE_DIRECTORY}/packaging/linux/restore-environment.sh" "${APPDIR}/usr/bin/restore-environment.sh" chmod a+x appimagetool-x86_64.AppImage ARCH=x86_64 ./appimagetool-x86_64.AppImage "${APPDIR}" "${OUTPUTDIR}/${PACKAGING_INSTALLER_NAME}-${TAG}-x86_64.AppImage" diff --git a/packaging/macos/buildpackage.sh b/packaging/macos/buildpackage.sh index 59aa360b6a..c095bc6a64 100755 --- a/packaging/macos/buildpackage.sh +++ b/packaging/macos/buildpackage.sh @@ -13,7 +13,7 @@ # MACOS_DEVELOPER_USERNAME: Email address for the developer account # MACOS_DEVELOPER_PASSWORD: App-specific password for the developer account # -set -e +set -o errexit -o pipefail || exit $? if [[ "$OSTYPE" != "darwin"* ]]; then echo >&2 "macOS packaging requires a macOS host" @@ -22,6 +22,7 @@ fi command -v make >/dev/null 2>&1 || { echo >&2 "The OpenRA mod SDK macOS packaging requires make."; exit 1; } command -v python3 >/dev/null 2>&1 || { echo >&2 "The OpenRA mod SDK macOS packaging requires python 3."; exit 1; } +command -v clang >/dev/null 2>&1 || { echo >&2 "macOS packaging requires clang."; exit 1; } require_variables() { missing="" @@ -35,8 +36,8 @@ require_variables() { fi } -if [ $# -eq "0" ]; then - echo "Usage: $(basename "$0") version [outputdir]" +if [ $# -ne "2" ]; then + echo "Usage: $(basename "$0") tag outputdir" exit 1 fi @@ -53,7 +54,6 @@ if [ -f "${TEMPLATE_ROOT}/user.config" ]; then fi require_variables "MOD_ID" "ENGINE_DIRECTORY" "PACKAGING_DISPLAY_NAME" "PACKAGING_INSTALLER_NAME" "PACKAGING_COPY_CNC_DLL" "PACKAGING_COPY_D2K_DLL" \ - "PACKAGING_OSX_MONO_TAG" "PACKAGING_OSX_MONO_SOURCE" "PACKAGING_OSX_MONO_TEMP_ARCHIVE_NAME" \ "PACKAGING_OSX_DMG_MOD_ICON_POSITION" "PACKAGING_OSX_DMG_APPLICATION_ICON_POSITION" "PACKAGING_OSX_DMG_HIDDEN_ICON_POSITION" \ "PACKAGING_FAQ_URL" "PACKAGING_OVERWRITE_MOD_VERSION" @@ -64,6 +64,7 @@ if [ ! -f "${TEMPLATE_ROOT}/${ENGINE_DIRECTORY}/Makefile" ]; then fi . "${TEMPLATE_ROOT}/${ENGINE_DIRECTORY}/packaging/functions.sh" +. "${TEMPLATE_ROOT}/packaging/functions.sh" # Import code signing certificate if [ -n "${MACOS_DEVELOPER_CERTIFICATE_BASE64}" ] && [ -n "${MACOS_DEVELOPER_CERTIFICATE_PASSWORD}" ] && [ -n "${MACOS_DEVELOPER_IDENTITY}" ]; then @@ -99,215 +100,163 @@ modify_plist() { sed "s|$1|$2|g" "$3" > "$3.tmp" && mv "$3.tmp" "$3" } -build_platform() { - PLATFORM="${1}" - DMG_NAME="${2}" - LAUNCHER_DIR="${BUILTDIR}/${PACKAGING_OSX_APP_NAME}" - LAUNCHER_CONTENTS_DIR="${LAUNCHER_DIR}/Contents" - LAUNCHER_MACOS_DIR="${LAUNCHER_CONTENTS_DIR}/MacOS" - LAUNCHER_RESOURCES_DIR="${LAUNCHER_CONTENTS_DIR}/Resources" - - echo "Building launcher (${PLATFORM})" - - mkdir -p "${LAUNCHER_RESOURCES_DIR}" - mkdir -p "${LAUNCHER_CONTENTS_DIR}/MacOS" - echo "APPL????" > "${LAUNCHER_CONTENTS_DIR}/PkgInfo" - cp "${TEMPLATE_ROOT}/${ENGINE_DIRECTORY}/packaging/macos/Info.plist.in" "${LAUNCHER_CONTENTS_DIR}/Info.plist" - - modify_plist "{DEV_VERSION}" "${TAG}" "${LAUNCHER_CONTENTS_DIR}/Info.plist" - modify_plist "{FAQ_URL}" "${PACKAGING_FAQ_URL}" "${LAUNCHER_CONTENTS_DIR}/Info.plist" - modify_plist "{MOD_ID}" "${MOD_ID}" "${LAUNCHER_CONTENTS_DIR}/Info.plist" - modify_plist "{MOD_NAME}" "${PACKAGING_DISPLAY_NAME}" "${LAUNCHER_CONTENTS_DIR}/Info.plist" - modify_plist "{JOIN_SERVER_URL_SCHEME}" "openra-${MOD_ID}-${TAG}" "${LAUNCHER_CONTENTS_DIR}/Info.plist" - - if [ -n "${DISCORD_APPID}" ]; then - modify_plist "{DISCORD_URL_SCHEME}" "discord-${DISCORD_APPID}" "${LAUNCHER_CONTENTS_DIR}/Info.plist" - else - modify_plist "{DISCORD_URL_SCHEME}" "" "${LAUNCHER_CONTENTS_DIR}/Info.plist" - fi - - if [ "${PLATFORM}" = "compat" ]; then - modify_plist "{MINIMUM_SYSTEM_VERSION}" "10.9" "${LAUNCHER_CONTENTS_DIR}/Info.plist" - clang -m64 "${TEMPLATE_ROOT}/${ENGINE_DIRECTORY}/packaging/macos/launcher-mono.m" -o "${LAUNCHER_MACOS_DIR}/OpenRA" -framework AppKit -mmacosx-version-min=10.9 - else - modify_plist "{MINIMUM_SYSTEM_VERSION}" "10.13" "${LAUNCHER_CONTENTS_DIR}/Info.plist" - clang -m64 "${TEMPLATE_ROOT}/${ENGINE_DIRECTORY}/packaging/macos/launcher.m" -o "${LAUNCHER_MACOS_DIR}/OpenRA" -framework AppKit -mmacosx-version-min=10.13 - - curl -s -L -o "${PACKAGING_OSX_MONO_TEMP_ARCHIVE_NAME}" -O "${PACKAGING_OSX_MONO_SOURCE}" || exit 3 - unzip -qq -d "${BUILTDIR}" "${PACKAGING_OSX_MONO_TEMP_ARCHIVE_NAME}" - rm "${PACKAGING_OSX_MONO_TEMP_ARCHIVE_NAME}" - - mv "${BUILTDIR}/mono" "${LAUNCHER_MACOS_DIR}" - mv "${BUILTDIR}/etc" "${LAUNCHER_RESOURCES_DIR}" - mv "${BUILTDIR}/lib" "${LAUNCHER_RESOURCES_DIR}" - fi - - echo "Building core files" - install_assemblies_mono "${TEMPLATE_ROOT}/${ENGINE_DIRECTORY}" "${LAUNCHER_RESOURCES_DIR}" "osx-x64" "True" "${PACKAGING_COPY_CNC_DLL}" "${PACKAGING_COPY_D2K_DLL}" - install_data "${TEMPLATE_ROOT}/${ENGINE_DIRECTORY}" "${LAUNCHER_RESOURCES_DIR}" - - for f in ${PACKAGING_COPY_ENGINE_FILES}; do - mkdir -p "${LAUNCHER_RESOURCES_DIR}/$(dirname "${f}")" - cp -r "${TEMPLATE_ROOT}/${ENGINE_DIRECTORY}/${f}" "${LAUNCHER_RESOURCES_DIR}/${f}" - done - - echo "Building mod files" - pushd "${TEMPLATE_ROOT}" > /dev/null - make all - popd > /dev/null - - cp -LR "${TEMPLATE_ROOT}mods/"* "${LAUNCHER_RESOURCES_DIR}/mods" - - for f in ${PACKAGING_COPY_MOD_BINARIES}; do - mkdir -p "${LAUNCHER_RESOURCES_DIR}/$(dirname "${f}")" - cp "${TEMPLATE_ROOT}/${ENGINE_DIRECTORY}/bin/${f}" "${LAUNCHER_RESOURCES_DIR}/${f}" - done - - set_engine_version "${ENGINE_VERSION}" "${LAUNCHER_RESOURCES_DIR}" - if [ "${PACKAGING_OVERWRITE_MOD_VERSION}" == "True" ]; then - set_mod_version "${TAG}" "${LAUNCHER_RESOURCES_DIR}/mods/${MOD_ID}/mod.yaml" - else - MOD_VERSION=$(grep 'Version:' "${LAUNCHER_RESOURCES_DIR}/mods/${MOD_ID}/mod.yaml" | awk '{print $2}') - echo "Mod version ${MOD_VERSION} will remain unchanged."; - fi +LAUNCHER_DIR="${BUILTDIR}/${PACKAGING_OSX_APP_NAME}" +LAUNCHER_CONTENTS_DIR="${LAUNCHER_DIR}/Contents" +LAUNCHER_ASSEMBLY_DIR="${LAUNCHER_CONTENTS_DIR}/MacOS" +LAUNCHER_RESOURCES_DIR="${LAUNCHER_CONTENTS_DIR}/Resources" + +echo "Building launcher" + +mkdir -p "${LAUNCHER_RESOURCES_DIR}" +mkdir -p "${LAUNCHER_ASSEMBLY_DIR}/x86_64" +mkdir -p "${LAUNCHER_ASSEMBLY_DIR}/arm64" +mkdir -p "${LAUNCHER_ASSEMBLY_DIR}/mono" +echo "APPL????" > "${LAUNCHER_CONTENTS_DIR}/PkgInfo" +cp "${TEMPLATE_ROOT}/${ENGINE_DIRECTORY}/packaging/macos/Info.plist.in" "${LAUNCHER_CONTENTS_DIR}/Info.plist" + +modify_plist "{DEV_VERSION}" "${TAG}" "${LAUNCHER_CONTENTS_DIR}/Info.plist" +modify_plist "{FAQ_URL}" "${PACKAGING_FAQ_URL}" "${LAUNCHER_CONTENTS_DIR}/Info.plist" +modify_plist "{MOD_ID}" "${MOD_ID}" "${LAUNCHER_CONTENTS_DIR}/Info.plist" +modify_plist "{MINIMUM_SYSTEM_VERSION}" "10.11" "${LAUNCHER_CONTENTS_DIR}/Info.plist" +modify_plist "{MOD_NAME}" "${PACKAGING_DISPLAY_NAME}" "${LAUNCHER_CONTENTS_DIR}/Info.plist" +modify_plist "{JOIN_SERVER_URL_SCHEME}" "openra-${MOD_ID}-${TAG}" "${LAUNCHER_CONTENTS_DIR}/Info.plist" +if [ -n "${DISCORD_APPID}" ]; then + modify_plist "{DISCORD_URL_SCHEME}" "discord-${DISCORD_APPID}" "${LAUNCHER_CONTENTS_DIR}/Info.plist" +else + modify_plist "{DISCORD_URL_SCHEME}" "" "${LAUNCHER_CONTENTS_DIR}/Info.plist" +fi - # Assemble multi-resolution icon - mkdir "${BUILTDIR}/mod.iconset" - cp "${ARTWORK_DIR}/icon_16x16.png" "${BUILTDIR}/mod.iconset/icon_16x16.png" - cp "${ARTWORK_DIR}/icon_32x32.png" "${BUILTDIR}/mod.iconset/icon_16x16@2.png" - cp "${ARTWORK_DIR}/icon_32x32.png" "${BUILTDIR}/mod.iconset/icon_32x32.png" - cp "${ARTWORK_DIR}/icon_64x64.png" "${BUILTDIR}/mod.iconset/icon_32x32@2x.png" - cp "${ARTWORK_DIR}/icon_128x128.png" "${BUILTDIR}/mod.iconset/icon_128x128.png" - cp "${ARTWORK_DIR}/icon_256x256.png" "${BUILTDIR}/mod.iconset/icon_128x128@2x.png" - cp "${ARTWORK_DIR}/icon_256x256.png" "${BUILTDIR}/mod.iconset/icon_256x256.png" - cp "${ARTWORK_DIR}/icon_512x512.png" "${BUILTDIR}/mod.iconset/icon_256x256@2x.png" - iconutil --convert icns "${BUILTDIR}/mod.iconset" -o "${LAUNCHER_RESOURCES_DIR}/${MOD_ID}.icns" - rm -rf "${BUILTDIR}/mod.iconset" - - # Sign binaries with developer certificate - if [ -n "${MACOS_DEVELOPER_IDENTITY}" ]; then - codesign -s "${MACOS_DEVELOPER_IDENTITY}" --timestamp --options runtime -f --entitlements "${TEMPLATE_ROOT}/${ENGINE_DIRECTORY}/packaging/macos/entitlements.plist" "${LAUNCHER_RESOURCES_DIR}/"*.dylib - codesign -s "${MACOS_DEVELOPER_IDENTITY}" --timestamp --options runtime -f --entitlements "${TEMPLATE_ROOT}/${ENGINE_DIRECTORY}/packaging/macos/entitlements.plist" --deep "${LAUNCHER_DIR}" - fi +# Compile universal (x86_64 + arm64) arch-specific apphosts +clang "${TEMPLATE_ROOT}/${ENGINE_DIRECTORY}/packaging/macos/apphost.c" -o "${LAUNCHER_ASSEMBLY_DIR}/apphost-x86_64" -framework AppKit -target x86_64-apple-macos10.15 +clang "${TEMPLATE_ROOT}/${ENGINE_DIRECTORY}/packaging/macos/apphost.c" -o "${LAUNCHER_ASSEMBLY_DIR}/apphost-arm64" -framework AppKit -target arm64-apple-macos10.15 +clang "${TEMPLATE_ROOT}/${ENGINE_DIRECTORY}/packaging/macos/apphost-mono.c" -o "${LAUNCHER_ASSEMBLY_DIR}/apphost-mono" -framework AppKit -target x86_64-apple-macos10.11 +clang "${TEMPLATE_ROOT}/${ENGINE_DIRECTORY}/packaging/macos/checkmono.c" -o "${LAUNCHER_ASSEMBLY_DIR}/checkmono" -framework AppKit -target x86_64-apple-macos10.11 + +# Compile universal (x86_64 + arm64) Launcher +clang "${TEMPLATE_ROOT}/${ENGINE_DIRECTORY}/packaging/macos/launcher.m" -o "${LAUNCHER_ASSEMBLY_DIR}/Launcher-x86_64" -framework AppKit -target x86_64-apple-macos10.11 +clang "${TEMPLATE_ROOT}/${ENGINE_DIRECTORY}/packaging/macos/launcher.m" -o "${LAUNCHER_ASSEMBLY_DIR}/Launcher-arm64" -framework AppKit -target arm64-apple-macos10.15 +lipo -create -output "${LAUNCHER_ASSEMBLY_DIR}/Launcher" "${LAUNCHER_ASSEMBLY_DIR}/Launcher-x86_64" "${LAUNCHER_ASSEMBLY_DIR}/Launcher-arm64" +rm "${LAUNCHER_ASSEMBLY_DIR}/Launcher-x86_64" "${LAUNCHER_ASSEMBLY_DIR}/Launcher-arm64" + +install_assemblies "${TEMPLATE_ROOT}/${ENGINE_DIRECTORY}" "${LAUNCHER_ASSEMBLY_DIR}/x86_64" "osx-x64" "net6" "True" "${PACKAGING_COPY_CNC_DLL}" "${PACKAGING_COPY_D2K_DLL}" +install_assemblies "${TEMPLATE_ROOT}/${ENGINE_DIRECTORY}" "${LAUNCHER_ASSEMBLY_DIR}/arm64" "osx-arm64" "net6" "True" "${PACKAGING_COPY_CNC_DLL}" "${PACKAGING_COPY_D2K_DLL}" +install_assemblies "${TEMPLATE_ROOT}/${ENGINE_DIRECTORY}" "${LAUNCHER_ASSEMBLY_DIR}/mono" "osx-x64" "mono" "True" "${PACKAGING_COPY_CNC_DLL}" "${PACKAGING_COPY_D2K_DLL}" +install_data "${TEMPLATE_ROOT}/${ENGINE_DIRECTORY}" "${LAUNCHER_RESOURCES_DIR}" + +for f in ${PACKAGING_COPY_ENGINE_FILES}; do + mkdir -p "${LAUNCHER_RESOURCES_DIR}/$(dirname "${f}")" + cp -r "${TEMPLATE_ROOT}/${ENGINE_DIRECTORY}/${f}" "${LAUNCHER_RESOURCES_DIR}/${f}" +done + +echo "Building mod files" +install_mod_assemblies "${TEMPLATE_ROOT}" "${LAUNCHER_ASSEMBLY_DIR}/x86_64" "osx-x64" "net6" "${TEMPLATE_ROOT}/${ENGINE_DIRECTORY}" +install_mod_assemblies "${TEMPLATE_ROOT}" "${LAUNCHER_ASSEMBLY_DIR}/arm64" "osx-arm64" "net6" "${TEMPLATE_ROOT}/${ENGINE_DIRECTORY}" +install_mod_assemblies "${TEMPLATE_ROOT}" "${LAUNCHER_ASSEMBLY_DIR}/mono" "osx-x64" "mono" "${TEMPLATE_ROOT}/${ENGINE_DIRECTORY}" + +cp -LR "${TEMPLATE_ROOT}mods/"* "${LAUNCHER_RESOURCES_DIR}/mods" + +set_engine_version "${ENGINE_VERSION}" "${LAUNCHER_RESOURCES_DIR}" +if [ "${PACKAGING_OVERWRITE_MOD_VERSION}" == "True" ]; then + set_mod_version "${TAG}" "${LAUNCHER_RESOURCES_DIR}/mods/${MOD_ID}/mod.yaml" +else + MOD_VERSION=$(grep 'Version:' "${LAUNCHER_RESOURCES_DIR}/mods/${MOD_ID}/mod.yaml" | awk '{print $2}') + echo "Mod version ${MOD_VERSION} will remain unchanged."; +fi - echo "Packaging disk image" - hdiutil create "${PACKAGING_DIR}/${DMG_NAME}" -format UDRW -volname "${PACKAGING_DISPLAY_NAME}" -fs HFS+ -srcfolder "${BUILTDIR}" - DMG_DEVICE=$(hdiutil attach -readwrite -noverify -noautoopen "${PACKAGING_DIR}/${DMG_NAME}" | egrep '^/dev/' | sed 1q | awk '{print $1}') - sleep 2 +# Assemble multi-resolution icon +mkdir "${BUILTDIR}/mod.iconset" +cp "${ARTWORK_DIR}/icon_16x16.png" "${BUILTDIR}/mod.iconset/icon_16x16.png" +cp "${ARTWORK_DIR}/icon_32x32.png" "${BUILTDIR}/mod.iconset/icon_16x16@2.png" +cp "${ARTWORK_DIR}/icon_32x32.png" "${BUILTDIR}/mod.iconset/icon_32x32.png" +cp "${ARTWORK_DIR}/icon_64x64.png" "${BUILTDIR}/mod.iconset/icon_32x32@2x.png" +cp "${ARTWORK_DIR}/icon_128x128.png" "${BUILTDIR}/mod.iconset/icon_128x128.png" +cp "${ARTWORK_DIR}/icon_256x256.png" "${BUILTDIR}/mod.iconset/icon_128x128@2x.png" +cp "${ARTWORK_DIR}/icon_256x256.png" "${BUILTDIR}/mod.iconset/icon_256x256.png" +cp "${ARTWORK_DIR}/icon_512x512.png" "${BUILTDIR}/mod.iconset/icon_256x256@2x.png" +iconutil --convert icns "${BUILTDIR}/mod.iconset" -o "${LAUNCHER_RESOURCES_DIR}/${MOD_ID}.icns" +rm -rf "${BUILTDIR}/mod.iconset" + +# Sign binaries with developer certificate +if [ -n "${MACOS_DEVELOPER_IDENTITY}" ]; then + codesign -s "${MACOS_DEVELOPER_IDENTITY}" --timestamp --options runtime -f --entitlements "${TEMPLATE_ROOT}/${ENGINE_DIRECTORY}/packaging/macos/entitlements.plist" --deep "${LAUNCHER_DIR}" +fi - # Background image is created from source svg in artsrc repository - mkdir "/Volumes/${PACKAGING_DISPLAY_NAME}/.background/" - tiffutil -cathidpicheck "${ARTWORK_DIR}/macos-background.png" "${ARTWORK_DIR}/macos-background-2x.png" -out "/Volumes/${PACKAGING_DISPLAY_NAME}/.background/background.tiff" - - cp "${LAUNCHER_DIR}/Contents/Resources/${MOD_ID}.icns" "/Volumes/${PACKAGING_DISPLAY_NAME}/.VolumeIcon.icns" - - echo ' - tell application "Finder" - tell disk "'${PACKAGING_DISPLAY_NAME}'" - open - set current view of container window to icon view - set toolbar visible of container window to false - set statusbar visible of container window to false - set the bounds of container window to {400, 100, 1000, 550} - set theViewOptions to the icon view options of container window - set arrangement of theViewOptions to not arranged - set icon size of theViewOptions to 72 - set background picture of theViewOptions to file ".background:background.tiff" - make new alias file at container window to POSIX file "/Applications" with properties {name:"Applications"} - set position of item "'${PACKAGING_OSX_APP_NAME}'" of container window to {'${PACKAGING_OSX_DMG_MOD_ICON_POSITION}'} - set position of item "Applications" of container window to {'${PACKAGING_OSX_DMG_APPLICATION_ICON_POSITION}'} - set position of item ".background" of container window to {'${PACKAGING_OSX_DMG_HIDDEN_ICON_POSITION}'} - set position of item ".fseventsd" of container window to {'${PACKAGING_OSX_DMG_HIDDEN_ICON_POSITION}'} - set position of item ".VolumeIcon.icns" of container window to {'${PACKAGING_OSX_DMG_HIDDEN_ICON_POSITION}'} - update without registering applications - delay 5 - close - end tell - end tell - ' | osascript - - # HACK: Copy the volume icon again - something in the previous step seems to delete it...? - cp "${LAUNCHER_DIR}/Contents/Resources/${MOD_ID}.icns" "/Volumes/${PACKAGING_DISPLAY_NAME}/.VolumeIcon.icns" - SetFile -c icnC "/Volumes/${PACKAGING_DISPLAY_NAME}/.VolumeIcon.icns" - SetFile -a C "/Volumes/${PACKAGING_DISPLAY_NAME}" - - chmod -Rf go-w "/Volumes/${PACKAGING_DISPLAY_NAME}" - sync - sync +echo "Packaging disk image" +hdiutil create "build.dmg" -format UDRW -volname "${PACKAGING_DISPLAY_NAME}" -fs HFS+ -srcfolder "${BUILTDIR}" +DMG_DEVICE=$(hdiutil attach -readwrite -noverify -noautoopen "${PACKAGING_DIR}/build.dmg" | egrep '^/dev/' | sed 1q | awk '{print $1}') +sleep 2 + +# Background image is created from source svg in artsrc repository +mkdir "/Volumes/${PACKAGING_DISPLAY_NAME}/.background/" +tiffutil -cathidpicheck "${ARTWORK_DIR}/macos-background.png" "${ARTWORK_DIR}/macos-background-2x.png" -out "/Volumes/${PACKAGING_DISPLAY_NAME}/.background/background.tiff" + +cp "${LAUNCHER_DIR}/Contents/Resources/${MOD_ID}.icns" "/Volumes/${PACKAGING_DISPLAY_NAME}/.VolumeIcon.icns" + +echo ' + tell application "Finder" + tell disk "'${PACKAGING_DISPLAY_NAME}'" + open + set current view of container window to icon view + set toolbar visible of container window to false + set statusbar visible of container window to false + set the bounds of container window to {400, 100, 1000, 550} + set theViewOptions to the icon view options of container window + set arrangement of theViewOptions to not arranged + set icon size of theViewOptions to 72 + set background picture of theViewOptions to file ".background:background.tiff" + make new alias file at container window to POSIX file "/Applications" with properties {name:"Applications"} + set position of item "'${PACKAGING_OSX_APP_NAME}'" of container window to {'${PACKAGING_OSX_DMG_MOD_ICON_POSITION}'} + set position of item "Applications" of container window to {'${PACKAGING_OSX_DMG_APPLICATION_ICON_POSITION}'} + set position of item ".background" of container window to {'${PACKAGING_OSX_DMG_HIDDEN_ICON_POSITION}'} + set position of item ".fseventsd" of container window to {'${PACKAGING_OSX_DMG_HIDDEN_ICON_POSITION}'} + set position of item ".VolumeIcon.icns" of container window to {'${PACKAGING_OSX_DMG_HIDDEN_ICON_POSITION}'} + update without registering applications + delay 5 + close + end tell + end tell +' | osascript + +# HACK: Copy the volume icon again - something in the previous step seems to delete it...? +cp "${LAUNCHER_DIR}/Contents/Resources/${MOD_ID}.icns" "/Volumes/${PACKAGING_DISPLAY_NAME}/.VolumeIcon.icns" +SetFile -c icnC "/Volumes/${PACKAGING_DISPLAY_NAME}/.VolumeIcon.icns" +SetFile -a C "/Volumes/${PACKAGING_DISPLAY_NAME}" + +chmod -Rf go-w "/Volumes/${PACKAGING_DISPLAY_NAME}" +sync +sync + +hdiutil detach "${DMG_DEVICE}" +rm -rf "${BUILTDIR}" - hdiutil detach "${DMG_DEVICE}" - rm -rf "${BUILTDIR}" -} +if [ -n "${MACOS_DEVELOPER_CERTIFICATE_BASE64}" ] && [ -n "${MACOS_DEVELOPER_CERTIFICATE_PASSWORD}" ] && [ -n "${MACOS_DEVELOPER_IDENTITY}" ]; then + security delete-keychain build.keychain +fi -notarize_package() { - DMG_PATH="${1}" - NOTARIZE_DMG_PATH="${DMG_PATH%.*}"-notarization.dmg - echo "Submitting ${DMG_PATH} for notarization" +if [ -n "${MACOS_DEVELOPER_USERNAME}" ] && [ -n "${MACOS_DEVELOPER_PASSWORD}" ] && [ -n "${MACOS_DEVELOPER_IDENTITY}" ]; then + echo "Submitting build for notarization" # Reset xcode search path to fix xcrun not finding altool sudo xcode-select -r # Create a temporary read-only dmg for submission (notarization service rejects read/write images) - hdiutil convert "${DMG_PATH}" -format UDZO -imagekey zlib-level=9 -ov -o "${NOTARIZE_DMG_PATH}" - - NOTARIZATION_UUID=$(xcrun altool --notarize-app --primary-bundle-id "net.openra.modsdk" -u "${MACOS_DEVELOPER_USERNAME}" -p "${MACOS_DEVELOPER_PASSWORD}" --file "${NOTARIZE_DMG_PATH}" 2>&1 | awk -F' = ' '/RequestUUID/ { print $2; exit }') - if [ -z "${NOTARIZATION_UUID}" ]; then - echo "Submission failed" - exit 1 - fi - - echo "${DMG_PATH} submission UUID is ${NOTARIZATION_UUID}" - rm "${NOTARIZE_DMG_PATH}" - - while :; do - sleep 30 - NOTARIZATION_RESULT=$(xcrun altool --notarization-info "${NOTARIZATION_UUID}" -u "${MACOS_DEVELOPER_USERNAME}" -p "${MACOS_DEVELOPER_PASSWORD}" 2>&1 | awk -F': ' '/Status/ { print $2; exit }') - echo "${DMG_PATH}: ${NOTARIZATION_RESULT}" + hdiutil convert "build.dmg" -format ULFO -ov -o "build-notarization.dmg" - if [ "${NOTARIZATION_RESULT}" == "invalid" ]; then - NOTARIZATION_LOG_URL=$(xcrun altool --notarization-info "${NOTARIZATION_UUID}" -u "${MACOS_DEVELOPER_USERNAME}" -p "${MACOS_DEVELOPER_PASSWORD}" 2>&1 | awk -F': ' '/LogFileURL/ { print $2; exit }') - echo "${NOTARIZATION_UUID} failed notarization with error:" - curl -s "${NOTARIZATION_LOG_URL}" -w "\n" - exit 1 - fi + xcrun notarytool submit "build-notarization.dmg" --wait --apple-id "${MACOS_DEVELOPER_USERNAME}" --password "${MACOS_DEVELOPER_PASSWORD}" --team-id "${MACOS_DEVELOPER_IDENTITY}" - if [ "${NOTARIZATION_RESULT}" == "success" ]; then - echo "${DMG_PATH}: Stapling tickets" - DMG_DEVICE=$(hdiutil attach -readwrite -noverify -noautoopen "${DMG_PATH}" | egrep '^/dev/' | sed 1q | awk '{print $1}') - sleep 2 + rm "build-notarization.dmg" - xcrun stapler staple "/Volumes/${PACKAGING_DISPLAY_NAME}/${PACKAGING_OSX_APP_NAME}" - - sync - sync - - hdiutil detach "${DMG_DEVICE}" - break - fi - done -} - -finalize_package() { - DMG_PATH="${1}" - OUTPUT_PATH="${2}" - - hdiutil convert "${DMG_PATH}" -format UDZO -imagekey zlib-level=9 -ov -o "${OUTPUT_PATH}" - rm "${DMG_PATH}" -} + echo "Stapling tickets" + DMG_DEVICE=$(hdiutil attach -readwrite -noverify -noautoopen "build.dmg" | egrep '^/dev/' | sed 1q | awk '{print $1}') + sleep 2 -build_platform "standard" "build.dmg" -build_platform "compat" "build-compat.dmg" + xcrun stapler staple "/Volumes/${PACKAGING_DISPLAY_NAME}/${PACKAGING_OSX_APP_NAME}" -if [ -n "${MACOS_DEVELOPER_CERTIFICATE_BASE64}" ] && [ -n "${MACOS_DEVELOPER_CERTIFICATE_PASSWORD}" ] && [ -n "${MACOS_DEVELOPER_IDENTITY}" ]; then - security delete-keychain build.keychain -fi + sync + sync -if [ -n "${MACOS_DEVELOPER_USERNAME}" ] && [ -n "${MACOS_DEVELOPER_PASSWORD}" ]; then - # Parallelize processing - (notarize_package "build.dmg") & - (notarize_package "build-compat.dmg") & - wait + hdiutil detach "${DMG_DEVICE}" fi -finalize_package "build.dmg" "${OUTPUTDIR}/${PACKAGING_INSTALLER_NAME}-${TAG}.dmg" -finalize_package "build-compat.dmg" "${OUTPUTDIR}/${PACKAGING_INSTALLER_NAME}-${TAG}-compat.dmg" +hdiutil convert "build.dmg" -format ULFO -ov -o "${OUTPUTDIR}/${PACKAGING_INSTALLER_NAME}-${TAG}.dmg" +rm "build.dmg" \ No newline at end of file diff --git a/packaging/windows/buildpackage.nsi b/packaging/windows/buildpackage.nsi index fa5f6c7854..123b041e46 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" @@ -93,14 +93,16 @@ Section "Game" GAME SetOutPath "$INSTDIR" File "${SRCDIR}\*.exe" - File "${SRCDIR}\*.exe.config" + File "${SRCDIR}\*.dll.config" File "${SRCDIR}\*.dll" File "${SRCDIR}\*.ico" + File "${SRCDIR}\*.deps.json" + File "${SRCDIR}\*.runtimeconfig.json" + File "${SRCDIR}\global mix database.dat" + File "${SRCDIR}\IP2LOCATION-LITE-DB1.IPV6.BIN.ZIP" File "${SRCDIR}\VERSION" File "${SRCDIR}\AUTHORS" File "${SRCDIR}\COPYING" - File "${SRCDIR}\global mix database.dat" - File "${SRCDIR}\IP2LOCATION-LITE-DB1.IPV6.BIN.ZIP" File /r "${SRCDIR}\mods" !insertmacro MUI_STARTMENU_WRITE_BEGIN Application @@ -109,9 +111,6 @@ Section "Game" GAME "$OUTDIR\${PACKAGING_WINDOWS_LAUNCHER_NAME}.exe" "" "" "" "" !insertmacro MUI_STARTMENU_WRITE_END - SetOutPath "$INSTDIR\lua" - File "${SRCDIR}\lua\*.lua" - SetOutPath "$INSTDIR\glsl" File "${SRCDIR}\glsl\*.frag" File "${SRCDIR}\glsl\*.vert" @@ -123,6 +122,7 @@ Section "Game" GAME SetShellVarContext all CreateDirectory "$APPDATA\OpenRA\ModMetadata" + SetOutPath "$INSTDIR" nsExec::ExecToLog '"$INSTDIR\OpenRA.Utility.exe" ${MOD_ID} --register-mod "$INSTDIR\${PACKAGING_WINDOWS_LAUNCHER_NAME}.exe" system' nsExec::ExecToLog '"$INSTDIR\OpenRA.Utility.exe" ${MOD_ID} --clear-invalid-mod-registrations system' SetShellVarContext current @@ -135,21 +135,6 @@ Section "Desktop Shortcut" DESKTOPSHORTCUT "$INSTDIR\${PACKAGING_WINDOWS_LAUNCHER_NAME}.exe" "" "" "" "" SectionEnd -;*************************** -;Dependency Sections -;*************************** -Section "-DotNet" DotNet - ClearErrors - ; https://docs.microsoft.com/en-us/dotnet/framework/migration-guide/how-to-determine-which-versions-are-installed - ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" "Release" - IfErrors error 0 - IntCmp $0 461808 done error done - error: - MessageBox MB_OK ".NET Framework v4.7.2 or later is required to run OpenRA." - Abort - done: -SectionEnd - ;*************************** ;Uninstaller Sections ;*************************** @@ -176,9 +161,11 @@ Function ${UN}Clean RMDir /r $INSTDIR\glsl RMDir /r $INSTDIR\lua Delete $INSTDIR\*.exe - Delete $INSTDIR\*.exe.config Delete $INSTDIR\*.dll Delete $INSTDIR\*.ico + Delete $INSTDIR\*.dll.config + Delete $INSTDIR\*.deps.json + Delete $INSTDIR\*.runtimeconfig.json Delete $INSTDIR\VERSION Delete $INSTDIR\AUTHORS Delete $INSTDIR\COPYING diff --git a/packaging/windows/buildpackage.sh b/packaging/windows/buildpackage.sh index 548bd65c00..70a689ceca 100755 --- a/packaging/windows/buildpackage.sh +++ b/packaging/windows/buildpackage.sh @@ -56,12 +56,19 @@ if [ ! -f "${TEMPLATE_ROOT}/${ENGINE_DIRECTORY}/Makefile" ]; then fi . "${TEMPLATE_ROOT}/${ENGINE_DIRECTORY}/packaging/functions.sh" +. "${TEMPLATE_ROOT}/packaging/functions.sh" if [ ! -d "${OUTPUTDIR}" ]; then echo "Output directory '${OUTPUTDIR}' does not exist."; exit 1 fi +if command -v curl >/dev/null 2>&1; then + curl -s -L -O https://github.com/electron/rcedit/releases/download/v1.1.1/rcedit-x64.exe || exit 3 +else + wget -cq https://github.com/electron/rcedit/releases/download/v1.1.1/rcedit-x64.exe || exit 3 +fi + function build_platform() { PLATFORM="${1}" @@ -78,7 +85,7 @@ function build_platform() fi echo "Building core files (${PLATFORM})" - install_assemblies_mono "${TEMPLATE_ROOT}/${ENGINE_DIRECTORY}" "${BUILTDIR}" "win-${PLATFORM}" "False" "${PACKAGING_COPY_CNC_DLL}" "${PACKAGING_COPY_D2K_DLL}" + install_assemblies "${TEMPLATE_ROOT}/${ENGINE_DIRECTORY}" "${BUILTDIR}" "win-${PLATFORM}" "net6" "False" "${PACKAGING_COPY_CNC_DLL}" "${PACKAGING_COPY_D2K_DLL}" install_data "${TEMPLATE_ROOT}/${ENGINE_DIRECTORY}" "${BUILTDIR}" for f in ${PACKAGING_COPY_ENGINE_FILES}; do @@ -87,17 +94,10 @@ function build_platform() done echo "Building mod files (${PLATFORM})" - pushd "${TEMPLATE_ROOT}" > /dev/null - make all - popd > /dev/null + install_mod_assemblies "${TEMPLATE_ROOT}" "${BUILTDIR}" "win-${PLATFORM}" "net6" "${TEMPLATE_ROOT}/${ENGINE_DIRECTORY}" cp -Lr "${TEMPLATE_ROOT}/mods/"* "${BUILTDIR}/mods" - for f in ${PACKAGING_COPY_MOD_BINARIES}; do - mkdir -p "${BUILTDIR}/$(dirname "${f}")" - cp "${TEMPLATE_ROOT}/${ENGINE_DIRECTORY}/bin/${f}" "${BUILTDIR}/${f}" - done - set_engine_version "${ENGINE_VERSION}" "${BUILTDIR}" if [ "${PACKAGING_OVERWRITE_MOD_VERSION}" == "True" ]; then set_mod_version "${TAG}" "${BUILTDIR}/mods/${MOD_ID}/mod.yaml" @@ -110,7 +110,9 @@ function build_platform() convert "${ARTWORK_DIR}/icon_16x16.png" "${ARTWORK_DIR}/icon_24x24.png" "${ARTWORK_DIR}/icon_32x32.png" "${ARTWORK_DIR}/icon_48x48.png" "${ARTWORK_DIR}/icon_256x256.png" "${BUILTDIR}/${MOD_ID}.ico" echo "Compiling Windows launcher (${PLATFORM})" - install_windows_launcher "${TEMPLATE_ROOT}/${ENGINE_DIRECTORY}" "${BUILTDIR}" "win-${PLATFORM}" "${MOD_ID}" "${PACKAGING_WINDOWS_LAUNCHER_NAME}" "${PACKAGING_DISPLAY_NAME}" "${BUILTDIR}/${MOD_ID}.ico" "${PACKAGING_FAQ_URL}" + install_windows_launcher "${TEMPLATE_ROOT}/${ENGINE_DIRECTORY}" "${BUILTDIR}" "win-${PLATFORM}" "${MOD_ID}" "${PACKAGING_WINDOWS_LAUNCHER_NAME}" "${PACKAGING_DISPLAY_NAME}" "${PACKAGING_FAQ_URL}" + + wine64 rcedit-x64.exe "${BUILTDIR}/${PACKAGING_WINDOWS_LAUNCHER_NAME}.exe" --set-icon "${BUILTDIR}/${MOD_ID}.ico" echo "Building Windows setup.exe (${PLATFORM})" pushd "${PACKAGING_DIR}" > /dev/null diff --git a/utility.cmd b/utility.cmd index 94fa76d8c4..0199e2e8eb 100644 --- a/utility.cmd +++ b/utility.cmd @@ -24,7 +24,7 @@ echo Enter a utility command or --exit to exit. echo Press enter to view a list of valid utility commands. echo. -set /P command=Please enter a command: OpenRA.Utility.exe %MOD_ID% +set /P command=Please enter a command: OpenRA.Utility.exe %MOD_ID% if /I "%command%" EQU "--exit" (cd %TEMPLATE_DIR% & exit /b) echo. echo ---------------------------------------- diff --git a/utility.sh b/utility.sh index 1f7b38df84..34af2ae3d2 100755 --- a/utility.sh +++ b/utility.sh @@ -5,7 +5,10 @@ set -e command -v make >/dev/null 2>&1 || { echo >&2 "The OpenRA mod SDK requires make."; exit 1; } -command -v mono >/dev/null 2>&1 || { echo >&2 "The OpenRA mod SDK requires mono."; exit 1; } + +if ! command -v mono >/dev/null 2>&1; then + command -v dotnet >/dev/null 2>&1 || { echo >&2 "The OpenRA mod SDK requires dotnet or mono."; exit 1; } +fi if command -v python3 >/dev/null 2>&1; then PYTHON="python3" @@ -43,11 +46,17 @@ require_variables "MOD_ID" "ENGINE_VERSION" "ENGINE_DIRECTORY" LAUNCH_MOD="${Mod:-"${MOD_ID}"}" cd "${TEMPLATE_ROOT}" -if [ ! -f "${ENGINE_DIRECTORY}/bin/OpenRA.Utility.exe" ] || [ "$(cat "${ENGINE_DIRECTORY}/VERSION")" != "${ENGINE_VERSION}" ]; then +if [ ! -f "${ENGINE_DIRECTORY}/bin/OpenRA.Utility.dll" ] || [ "$(cat "${ENGINE_DIRECTORY}/VERSION")" != "${ENGINE_VERSION}" ]; then echo "Required engine files not found." echo "Run \`make\` in the mod directory to fetch and build the required files, then try again."; exit 1 fi +if command -v mono >/dev/null 2>&1 && [ "$(grep -c .NETCoreApp,Version= ${ENGINE_DIRECTORY}/bin/OpenRA.Utility.dll)" = "0" ]; then + RUNTIME_LAUNCHER="mono --debug" +else + RUNTIME_LAUNCHER="dotnet" +fi + cd "${ENGINE_DIRECTORY}" -MOD_SEARCH_PATHS="${MOD_SEARCH_PATHS}" ENGINE_DIR=".." mono --debug bin/OpenRA.Utility.exe "${LAUNCH_MOD}" "$@" +MOD_SEARCH_PATHS="${MOD_SEARCH_PATHS}" ENGINE_DIR=".." ${RUNTIME_LAUNCHER} bin/OpenRA.Utility.dll "${LAUNCH_MOD}" "$@"